ZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9MSUNFTlNFCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy8wMTJ2LmMgYi9mZm1wZWcvbGliYXZjb2RlYy8wMTJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiNmEzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjLzAxMnYuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIDAxMnYgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBDYXJsIEV1Z2VuIEhveW9zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCB6ZXJvMTJ2X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+cGl4X2ZtdCAgICAgICAgICAgICA9IEFWX1BJWF9GTVRfWVVWNDIyUDE2OworICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTA7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnYScsICcxJywgJzInLCAndicpKQorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJ0cmFuc3BhcmVuY3kiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHplcm8xMnZfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBpbnQgbGluZSA9IDAsIHJldDsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBhdmN0eC0+d2lkdGg7CisgICAgQVZGcmFtZSAqcGljID0gZGF0YTsKKyAgICB1aW50MTZfdCAqeSwgKnUsICp2OworICAgIGNvbnN0IHVpbnQ4X3QgKmxpbmVfZW5kLCAqc3JjID0gYXZwa3QtPmRhdGE7CisgICAgaW50IHN0cmlkZSA9IGF2Y3R4LT53aWR0aCAqIDggLyAzOworCisgICAgaWYgKHdpZHRoID09IDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJXaWR0aCAxIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCAgIGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJzAnLCAnMScsICcyJywgJ3YnKQorICAgICAgICAmJiBhdnBrdC0+c2l6ZSAlIGF2Y3R4LT5oZWlnaHQgPT0gMAorICAgICAgICAmJiBhdnBrdC0+c2l6ZSAvIGF2Y3R4LT5oZWlnaHQgKiAzID49IHdpZHRoICogOCkKKyAgICAgICAgc3RyaWRlID0gYXZwa3QtPnNpemUgLyBhdmN0eC0+aGVpZ2h0OworCisgICAgaWYgKGF2cGt0LT5zaXplIDwgYXZjdHgtPmhlaWdodCAqIHN0cmlkZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCB0b28gc21hbGw6ICVkIGluc3RlYWQgb2YgJWRcbiIsCisgICAgICAgICAgICAgICBhdnBrdC0+c2l6ZSwgYXZjdHgtPmhlaWdodCAqIHN0cmlkZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGljLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwaWMtPmtleV9mcmFtZSA9IDE7CisKKyAgICB5ID0gKHVpbnQxNl90ICopcGljLT5kYXRhWzBdOworICAgIHUgPSAodWludDE2X3QgKilwaWMtPmRhdGFbMV07CisgICAgdiA9ICh1aW50MTZfdCAqKXBpYy0+ZGF0YVsyXTsKKyAgICBsaW5lX2VuZCA9IGF2cGt0LT5kYXRhICsgc3RyaWRlOworCisgICAgd2hpbGUgKGxpbmUrKyA8IGF2Y3R4LT5oZWlnaHQpIHsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHQgPSBBVl9STDMyKHNyYyk7CisgICAgICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgICAgICp1KysgPSB0IDw8ICA2ICYgMHhGRkMwOworICAgICAgICAgICAgKnkrKyA9IHQgPj4gIDQgJiAweEZGQzA7CisgICAgICAgICAgICAqdisrID0gdCA+PiAxNCAmIDB4RkZDMDsKKworICAgICAgICAgICAgaWYgKHNyYyA+PSBsaW5lX2VuZCAtIDEpIHsKKyAgICAgICAgICAgICAgICAqeSA9IDB4ODA7CisgICAgICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICAgICAgbGluZV9lbmQgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIHkgPSAodWludDE2X3QgKikocGljLT5kYXRhWzBdICsgbGluZSAqIHBpYy0+bGluZXNpemVbMF0pOworICAgICAgICAgICAgICAgIHUgPSAodWludDE2X3QgKikocGljLT5kYXRhWzFdICsgbGluZSAqIHBpYy0+bGluZXNpemVbMV0pOworICAgICAgICAgICAgICAgIHYgPSAodWludDE2X3QgKikocGljLT5kYXRhWzJdICsgbGluZSAqIHBpYy0+bGluZXNpemVbMl0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ID0gQVZfUkwzMihzcmMpOworICAgICAgICAgICAgc3JjICs9IDQ7CisgICAgICAgICAgICAqeSsrID0gdCA8PCAgNiAmIDB4RkZDMDsKKyAgICAgICAgICAgICp1KysgPSB0ID4+ICA0ICYgMHhGRkMwOworICAgICAgICAgICAgKnkrKyA9IHQgPj4gMTQgJiAweEZGQzA7CisgICAgICAgICAgICBpZiAoc3JjID49IGxpbmVfZW5kIC0gMikgeworICAgICAgICAgICAgICAgIGlmICghKHdpZHRoICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgKnkgPSAweDgwOworICAgICAgICAgICAgICAgICAgICBzcmMgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZV9lbmQgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIHkgPSAodWludDE2X3QgKikocGljLT5kYXRhWzBdICsgbGluZSAqIHBpYy0+bGluZXNpemVbMF0pOworICAgICAgICAgICAgICAgIHUgPSAodWludDE2X3QgKikocGljLT5kYXRhWzFdICsgbGluZSAqIHBpYy0+bGluZXNpemVbMV0pOworICAgICAgICAgICAgICAgIHYgPSAodWludDE2X3QgKikocGljLT5kYXRhWzJdICsgbGluZSAqIHBpYy0+bGluZXNpemVbMl0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ID0gQVZfUkwzMihzcmMpOworICAgICAgICAgICAgc3JjICs9IDQ7CisgICAgICAgICAgICAqdisrID0gdCA8PCAgNiAmIDB4RkZDMDsKKyAgICAgICAgICAgICp5KysgPSB0ID4+ICA0ICYgMHhGRkMwOworICAgICAgICAgICAgKnUrKyA9IHQgPj4gMTQgJiAweEZGQzA7CisKKyAgICAgICAgICAgIGlmIChzcmMgPj0gbGluZV9lbmQgLSAxKSB7CisgICAgICAgICAgICAgICAgKnkgPSAweDgwOworICAgICAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgICAgIGxpbmVfZW5kICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICB5ID0gKHVpbnQxNl90ICopKHBpYy0+ZGF0YVswXSArIGxpbmUgKiBwaWMtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgICAgICB1ID0gKHVpbnQxNl90ICopKHBpYy0+ZGF0YVsxXSArIGxpbmUgKiBwaWMtPmxpbmVzaXplWzFdKTsKKyAgICAgICAgICAgICAgICB2ID0gKHVpbnQxNl90ICopKHBpYy0+ZGF0YVsyXSArIGxpbmUgKiBwaWMtPmxpbmVzaXplWzJdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdCA9IEFWX1JMMzIoc3JjKTsKKyAgICAgICAgICAgIHNyYyArPSA0OworICAgICAgICAgICAgKnkrKyA9IHQgPDwgIDYgJiAweEZGQzA7CisgICAgICAgICAgICAqdisrID0gdCA+PiAgNCAmIDB4RkZDMDsKKyAgICAgICAgICAgICp5KysgPSB0ID4+IDE0ICYgMHhGRkMwOworCisgICAgICAgICAgICBpZiAoc3JjID49IGxpbmVfZW5kIC0gMikgeworICAgICAgICAgICAgICAgIGlmICh3aWR0aCAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgKnkgPSAweDgwOworICAgICAgICAgICAgICAgICAgICBzcmMgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZV9lbmQgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIHkgPSAodWludDE2X3QgKikocGljLT5kYXRhWzBdICsgbGluZSAqIHBpYy0+bGluZXNpemVbMF0pOworICAgICAgICAgICAgICAgIHUgPSAodWludDE2X3QgKikocGljLT5kYXRhWzFdICsgbGluZSAqIHBpYy0+bGluZXNpemVbMV0pOworICAgICAgICAgICAgICAgIHYgPSAodWludDE2X3QgKikocGljLT5kYXRhWzJdICsgbGluZSAqIHBpYy0+bGluZXNpemVbMl0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfemVybzEydl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICIwMTJ2IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIDQ6MjoyIDEwLWJpdCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF8wMTJWLAorICAgIC5pbml0ICAgICAgICAgICA9IHplcm8xMnZfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gemVybzEydl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy80eG0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjLzR4bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMjU2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy80eG0uYwpAQCAtMCwwICsxLDEwMzAgQEAKKy8qCisgKiA0WE0gY29kZWMKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIDRYTSBjb2RlYy4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJic3dhcGRzcC5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKworI2RlZmluZSBCTE9DS19UWVBFX1ZMQ19CSVRTIDUKKyNkZWZpbmUgQUNEQ19WTENfQklUUyA5CisKKyNkZWZpbmUgQ0ZSQU1FX0JVRkZFUl9DT1VOVCAxMDAKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmxvY2tfdHlwZV90YWJbMl1bNF1bOF1bMl0gPSB7CisgICAgeworICAgICAgICB7ICAgIC8vIHsgOCwgNCwgMiB9IHggeyA4LCA0LCAyfQorICAgICAgICAgICAgeyAwLCAxIH0sIHsgMiwgMiB9LCB7IDYsIDMgfSwgeyAxNCwgNCB9LCB7IDMwLCA1IH0sIHsgMzEsIDUgfSwgeyAwLCAwIH0KKyAgICAgICAgfSwgeyAvLyB7IDgsIDQgfSB4IDEKKyAgICAgICAgICAgIHsgMCwgMSB9LCB7IDAsIDAgfSwgeyAyLCAyIH0sIHsgNiwgMyB9LCB7IDE0LCA0IH0sIHsgMTUsIDQgfSwgeyAwLCAwIH0KKyAgICAgICAgfSwgeyAvLyAxIHggeyA4LCA0IH0KKyAgICAgICAgICAgIHsgMCwgMSB9LCB7IDIsIDIgfSwgeyAwLCAwIH0sIHsgNiwgMyB9LCB7IDE0LCA0IH0sIHsgMTUsIDQgfSwgeyAwLCAwIH0KKyAgICAgICAgfSwgeyAvLyAxIHggMiwgMiB4IDEKKyAgICAgICAgICAgIHsgMCwgMSB9LCB7IDAsIDAgfSwgeyAwLCAwIH0sIHsgMiwgMiB9LCB7IDYsIDMgfSwgeyAxNCwgNCB9LCB7IDE1LCA0IH0KKyAgICAgICAgfQorICAgIH0sIHsKKyAgICAgICAgeyAgIC8vIHsgOCwgNCwgMiB9IHggeyA4LCA0LCAyfQorICAgICAgICAgICAgeyAxLCAyIH0sIHsgNCwgMyB9LCB7IDUsIDMgfSwgeyAwLCAyIH0sIHsgNiwgMyB9LCB7IDcsIDMgfSwgeyAwLCAwIH0KKyAgICAgICAgfSwgey8vIHsgOCwgNCB9IHggMQorICAgICAgICAgICAgeyAxLCAyIH0sIHsgMCwgMCB9LCB7IDIsIDIgfSwgeyAwLCAyIH0sIHsgNiwgMyB9LCB7IDcsIDMgfSwgeyAwLCAwIH0KKyAgICAgICAgfSwgey8vIDEgeCB7IDgsIDQgfQorICAgICAgICAgICAgeyAxLCAyIH0sIHsgMiwgMiB9LCB7IDAsIDAgfSwgeyAwLCAyIH0sIHsgNiwgMyB9LCB7IDcsIDMgfSwgeyAwLCAwIH0KKyAgICAgICAgfSwgey8vIDEgeCAyLCAyIHggMQorICAgICAgICAgICAgeyAxLCAyIH0sIHsgMCwgMCB9LCB7IDAsIDAgfSwgeyAwLCAyIH0sIHsgMiwgMiB9LCB7IDYsIDMgfSwgeyA3LCAzIH0KKyAgICAgIH0KKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzaXplMmluZGV4WzRdWzRdID0geworICAgIHsgLTEsIDMsIDEsIDEgfSwKKyAgICB7ICAzLCAwLCAwLCAwIH0sCisgICAgeyAgMiwgMCwgMCwgMCB9LAorICAgIHsgIDIsIDAsIDAsIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbXZbMjU2XVsyXSA9IHsKKyAgICB7ICAgMCwgICAwIH0sIHsgICAwLCAgLTEgfSwgeyAgLTEsICAgMCB9LCB7ICAgMSwgICAwIH0sIHsgICAwLCAgIDEgfSwgeyAgLTEsICAtMSB9LCB7ICAgMSwgIC0xIH0sIHsgIC0xLCAgIDEgfSwKKyAgICB7ICAgMSwgICAxIH0sIHsgICAwLCAgLTIgfSwgeyAgLTIsICAgMCB9LCB7ICAgMiwgICAwIH0sIHsgICAwLCAgIDIgfSwgeyAgLTEsICAtMiB9LCB7ICAgMSwgIC0yIH0sIHsgIC0yLCAgLTEgfSwKKyAgICB7ICAgMiwgIC0xIH0sIHsgIC0yLCAgIDEgfSwgeyAgIDIsICAgMSB9LCB7ICAtMSwgICAyIH0sIHsgICAxLCAgIDIgfSwgeyAgLTIsICAtMiB9LCB7ICAgMiwgIC0yIH0sIHsgIC0yLCAgIDIgfSwKKyAgICB7ICAgMiwgICAyIH0sIHsgICAwLCAgLTMgfSwgeyAgLTMsICAgMCB9LCB7ICAgMywgICAwIH0sIHsgICAwLCAgIDMgfSwgeyAgLTEsICAtMyB9LCB7ICAgMSwgIC0zIH0sIHsgIC0zLCAgLTEgfSwKKyAgICB7ICAgMywgIC0xIH0sIHsgIC0zLCAgIDEgfSwgeyAgIDMsICAgMSB9LCB7ICAtMSwgICAzIH0sIHsgICAxLCAgIDMgfSwgeyAgLTIsICAtMyB9LCB7ICAgMiwgIC0zIH0sIHsgIC0zLCAgLTIgfSwKKyAgICB7ICAgMywgIC0yIH0sIHsgIC0zLCAgIDIgfSwgeyAgIDMsICAgMiB9LCB7ICAtMiwgICAzIH0sIHsgICAyLCAgIDMgfSwgeyAgIDAsICAtNCB9LCB7ICAtNCwgICAwIH0sIHsgICA0LCAgIDAgfSwKKyAgICB7ICAgMCwgICA0IH0sIHsgIC0xLCAgLTQgfSwgeyAgIDEsICAtNCB9LCB7ICAtNCwgIC0xIH0sIHsgICA0LCAgLTEgfSwgeyAgIDQsICAgMSB9LCB7ICAtMSwgICA0IH0sIHsgICAxLCAgIDQgfSwKKyAgICB7ICAtMywgIC0zIH0sIHsgIC0zLCAgIDMgfSwgeyAgIDMsICAgMyB9LCB7ICAtMiwgIC00IH0sIHsgIC00LCAgLTIgfSwgeyAgIDQsICAtMiB9LCB7ICAtNCwgICAyIH0sIHsgIC0yLCAgIDQgfSwKKyAgICB7ICAgMiwgICA0IH0sIHsgIC0zLCAgLTQgfSwgeyAgIDMsICAtNCB9LCB7ICAgNCwgIC0zIH0sIHsgIC01LCAgIDAgfSwgeyAgLTQsICAgMyB9LCB7ICAtMywgICA0IH0sIHsgICAzLCAgIDQgfSwKKyAgICB7ICAtMSwgIC01IH0sIHsgIC01LCAgLTEgfSwgeyAgLTUsICAgMSB9LCB7ICAtMSwgICA1IH0sIHsgIC0yLCAgLTUgfSwgeyAgIDIsICAtNSB9LCB7ICAgNSwgIC0yIH0sIHsgICA1LCAgIDIgfSwKKyAgICB7ICAtNCwgIC00IH0sIHsgIC00LCAgIDQgfSwgeyAgLTMsICAtNSB9LCB7ICAtNSwgIC0zIH0sIHsgIC01LCAgIDMgfSwgeyAgIDMsICAgNSB9LCB7ICAtNiwgICAwIH0sIHsgICAwLCAgIDYgfSwKKyAgICB7ICAtNiwgIC0xIH0sIHsgIC02LCAgIDEgfSwgeyAgIDEsICAgNiB9LCB7ICAgMiwgIC02IH0sIHsgIC02LCAgIDIgfSwgeyAgIDIsICAgNiB9LCB7ICAtNSwgIC00IH0sIHsgICA1LCAgIDQgfSwKKyAgICB7ICAgNCwgICA1IH0sIHsgIC02LCAgLTMgfSwgeyAgIDYsICAgMyB9LCB7ICAtNywgICAwIH0sIHsgIC0xLCAgLTcgfSwgeyAgIDUsICAtNSB9LCB7ICAtNywgICAxIH0sIHsgIC0xLCAgIDcgfSwKKyAgICB7ICAgNCwgIC02IH0sIHsgICA2LCAgIDQgfSwgeyAgLTIsICAtNyB9LCB7ICAtNywgICAyIH0sIHsgIC0zLCAgLTcgfSwgeyAgIDcsICAtMyB9LCB7ICAgMywgICA3IH0sIHsgICA2LCAgLTUgfSwKKyAgICB7ICAgMCwgIC04IH0sIHsgIC0xLCAgLTggfSwgeyAgLTcsICAtNCB9LCB7ICAtOCwgICAxIH0sIHsgICA0LCAgIDcgfSwgeyAgIDIsICAtOCB9LCB7ICAtMiwgICA4IH0sIHsgICA2LCAgIDYgfSwKKyAgICB7ICAtOCwgICAzIH0sIHsgICA1LCAgLTcgfSwgeyAgLTUsICAgNyB9LCB7ICAgOCwgIC00IH0sIHsgICAwLCAgLTkgfSwgeyAgLTksICAtMSB9LCB7ICAgMSwgICA5IH0sIHsgICA3LCAgLTYgfSwKKyAgICB7ICAtNywgICA2IH0sIHsgIC01LCAgLTggfSwgeyAgLTUsICAgOCB9LCB7ICAtOSwgICAzIH0sIHsgICA5LCAgLTQgfSwgeyAgIDcsICAtNyB9LCB7ICAgOCwgIC02IH0sIHsgICA2LCAgIDggfSwKKyAgICB7ICAxMCwgICAxIH0sIHsgLTEwLCAgIDIgfSwgeyAgIDksICAtNSB9LCB7ICAxMCwgIC0zIH0sIHsgIC04LCAgLTcgfSwgeyAtMTAsICAtNCB9LCB7ICAgNiwgIC05IH0sIHsgLTExLCAgIDAgfSwKKyAgICB7ICAxMSwgICAxIH0sIHsgLTExLCAgLTIgfSwgeyAgLTIsICAxMSB9LCB7ICAgNywgIC05IH0sIHsgIC03LCAgIDkgfSwgeyAgMTAsICAgNiB9LCB7ICAtNCwgIDExIH0sIHsgICA4LCAgLTkgfSwKKyAgICB7ICAgOCwgICA5IH0sIHsgICA1LCAgMTEgfSwgeyAgIDcsIC0xMCB9LCB7ICAxMiwgIC0zIH0sIHsgIDExLCAgIDYgfSwgeyAgLTksICAtOSB9LCB7ICAgOCwgIDEwIH0sIHsgICA1LCAgMTIgfSwKKyAgICB7IC0xMSwgICA3IH0sIHsgIDEzLCAgIDIgfSwgeyAgIDYsIC0xMiB9LCB7ICAxMCwgICA5IH0sIHsgLTExLCAgIDggfSwgeyAgLTcsICAxMiB9LCB7ICAgMCwgIDE0IH0sIHsgIDE0LCAgLTIgfSwKKyAgICB7ICAtOSwgIDExIH0sIHsgIC02LCAgMTMgfSwgeyAtMTQsICAtNCB9LCB7ICAtNSwgLTE0IH0sIHsgICA1LCAgMTQgfSwgeyAtMTUsICAtMSB9LCB7IC0xNCwgIC02IH0sIHsgICAzLCAtMTUgfSwKKyAgICB7ICAxMSwgLTExIH0sIHsgIC03LCAgMTQgfSwgeyAgLTUsICAxNSB9LCB7ICAgOCwgLTE0IH0sIHsgIDE1LCAgIDYgfSwgeyAgIDMsICAxNiB9LCB7ICAgNywgLTE1IH0sIHsgLTE2LCAgIDUgfSwKKyAgICB7ICAgMCwgIDE3IH0sIHsgLTE2LCAgLTYgfSwgeyAtMTAsICAxNCB9LCB7IC0xNiwgICA3IH0sIHsgIDEyLCAgMTMgfSwgeyAtMTYsICAgOCB9LCB7IC0xNywgICA2IH0sIHsgLTE4LCAgIDMgfSwKKyAgICB7ICAtNywgIDE3IH0sIHsgIDE1LCAgMTEgfSwgeyAgMTYsICAxMCB9LCB7ICAgMiwgLTE5IH0sIHsgICAzLCAtMTkgfSwgeyAtMTEsIC0xNiB9LCB7IC0xOCwgICA4IH0sIHsgLTE5LCAgLTYgfSwKKyAgICB7ICAgMiwgLTIwIH0sIHsgLTE3LCAtMTEgfSwgeyAtMTAsIC0xOCB9LCB7ICAgOCwgIDE5IH0sIHsgLTIxLCAgLTEgfSwgeyAtMjAsICAgNyB9LCB7ICAtNCwgIDIxIH0sIHsgIDIxLCAgIDUgfSwKKyAgICB7ICAxNSwgIDE2IH0sIHsgICAyLCAtMjIgfSwgeyAtMTAsIC0yMCB9LCB7IC0yMiwgICA1IH0sIHsgIDIwLCAtMTEgfSwgeyAgLTcsIC0yMiB9LCB7IC0xMiwgIDIwIH0sIHsgIDIzLCAgLTUgfSwKKyAgICB7ICAxMywgLTIwIH0sIHsgIDI0LCAgLTIgfSwgeyAtMTUsICAxOSB9LCB7IC0xMSwgIDIyIH0sIHsgIDE2LCAgMTkgfSwgeyAgMjMsIC0xMCB9LCB7IC0xOCwgLTE4IH0sIHsgIC05LCAtMjQgfSwKKyAgICB7ICAyNCwgLTEwIH0sIHsgIC0zLCAgMjYgfSwgeyAtMjMsICAxMyB9LCB7IC0xOCwgLTIwIH0sIHsgIDE3LCAgMjEgfSwgeyAgLTQsICAyNyB9LCB7ICAyNywgICA2IH0sIHsgICAxLCAtMjggfSwKKyAgICB7IC0xMSwgIDI2IH0sIHsgLTE3LCAtMjMgfSwgeyAgIDcsICAyOCB9LCB7ICAxMSwgLTI3IH0sIHsgIDI5LCAgIDUgfSwgeyAtMjMsIC0xOSB9LCB7IC0yOCwgLTExIH0sIHsgLTIxLCAgMjIgfSwKKyAgICB7IC0zMCwgICA3IH0sIHsgLTE3LCAgMjYgfSwgeyAtMjcsICAxNiB9LCB7ICAxMywgIDI5IH0sIHsgIDE5LCAtMjYgfSwgeyAgMTAsIC0zMSB9LCB7IC0xNCwgLTMwIH0sIHsgIDIwLCAtMjcgfSwKKyAgICB7IC0yOSwgIDE4IH0sIHsgLTE2LCAtMzEgfSwgeyAtMjgsIC0yMiB9LCB7ICAyMSwgLTMwIH0sIHsgLTI1LCAgMjggfSwgeyAgMjYsIC0yOSB9LCB7ICAyNSwgLTMyIH0sIHsgLTMyLCAtMzIgfQorfTsKKworLyogVGhpcyBpcyBzaW1wbHkgdGhlIHNjYWxlZCBkb3duIGVsZW1lbnR3aXNlIHByb2R1Y3Qgb2YgdGhlIHN0YW5kYXJkIEpQRUcKKyAqIHF1YW50aXplciB0YWJsZSBhbmQgdGhlIEFBTiBwcmVtdWwgdGFibGUuICovCitzdGF0aWMgY29uc3QgdWludDhfdCBkZXF1YW50X3RhYmxlWzY0XSA9IHsKKyAgICAxNiwgMTUsIDEzLCAxOSwgMjQsIDMxLCAyOCwgMTcsCisgICAgMTcsIDIzLCAyNSwgMzEsIDM2LCA2MywgNDUsIDIxLAorICAgIDE4LCAyNCwgMjcsIDM3LCA1MiwgNTksIDQ5LCAyMCwKKyAgICAxNiwgMjgsIDM0LCA0MCwgNjAsIDgwLCA1MSwgMjAsCisgICAgMTgsIDMxLCA0OCwgNjYsIDY4LCA4NiwgNTYsIDIxLAorICAgIDE5LCAzOCwgNTYsIDU5LCA2NCwgNjQsIDQ4LCAyMCwKKyAgICAyNywgNDgsIDU1LCA1NSwgNTYsIDUxLCAzNSwgMTUsCisgICAgMjAsIDM1LCAzNCwgMzIsIDMxLCAyMiwgMTUsICA4LAorfTsKKworc3RhdGljIFZMQyBibG9ja190eXBlX3ZsY1syXVs0XTsKKworCit0eXBlZGVmIHN0cnVjdCBDRnJhbWVCdWZmZXIgeworICAgIHVuc2lnbmVkIGludCBhbGxvY2F0ZWRfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICBpbnQgaWQ7CisgICAgdWludDhfdCAqZGF0YTsKK30gQ0ZyYW1lQnVmZmVyOworCit0eXBlZGVmIHN0cnVjdCBGb3VyWENvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBCbG9ja0RTUENvbnRleHQgYmRzcDsKKyAgICBCc3dhcERTUENvbnRleHQgYmJkc3A7CisgICAgdWludDE2X3QgKmZyYW1lX2J1ZmZlcjsKKyAgICB1aW50MTZfdCAqbGFzdF9mcmFtZV9idWZmZXI7CisgICAgR2V0Qml0Q29udGV4dCBwcmVfZ2I7ICAgICAgICAgIC8vLzwgYWMvZGMgcHJlZml4CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBHZXRCeXRlQ29udGV4dCBnOworICAgIEdldEJ5dGVDb250ZXh0IGcyOworICAgIGludCBtdlsyNTZdOworICAgIFZMQyBwcmVfdmxjOworICAgIGludCBsYXN0X2RjOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYmxvY2spWzZdWzY0XTsKKyAgICB2b2lkICpiaXRzdHJlYW1fYnVmZmVyOworICAgIHVuc2lnbmVkIGludCBiaXRzdHJlYW1fYnVmZmVyX3NpemU7CisgICAgaW50IHZlcnNpb247CisgICAgQ0ZyYW1lQnVmZmVyIGNmcm1bQ0ZSQU1FX0JVRkZFUl9DT1VOVF07Cit9IEZvdXJYQ29udGV4dDsKKworCisjZGVmaW5lIEZJWF8xXzA4MjM5MjIwMCAgNzA5MzYKKyNkZWZpbmUgRklYXzFfNDE0MjEzNTYyICA5MjY4MgorI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgMTIxMDk1CisjZGVmaW5lIEZJWF8yXzYxMzEyNTkzMCAxNzEyNTQKKworI2RlZmluZSBNVUxUSVBMWSh2YXIsIGNvbnN0KSAoKCh2YXIpICogKGNvbnN0KSkgPj4gMTYpCisKK3N0YXRpYyB2b2lkIGlkY3QoaW50MTZfdCBibG9ja1s2NF0pCit7CisgICAgaW50IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgaW50IHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICAgIGludCB6NSwgejEwLCB6MTEsIHoxMiwgejEzOworICAgIGludCBpOworICAgIGludCB0ZW1wWzY0XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgdG1wMTAgPSBibG9ja1s4ICogMCArIGldICsgYmxvY2tbOCAqIDQgKyBpXTsKKyAgICAgICAgdG1wMTEgPSBibG9ja1s4ICogMCArIGldIC0gYmxvY2tbOCAqIDQgKyBpXTsKKworICAgICAgICB0bXAxMyA9IGJsb2NrWzggKiAyICsgaV0gKyBibG9ja1s4ICogNiArIGldOworICAgICAgICB0bXAxMiA9IE1VTFRJUExZKGJsb2NrWzggKiAyICsgaV0gLSBibG9ja1s4ICogNiArIGldLCBGSVhfMV80MTQyMTM1NjIpIC0gdG1wMTM7CisKKyAgICAgICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7CisgICAgICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOworICAgICAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKKyAgICAgICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7CisKKyAgICAgICAgejEzID0gYmxvY2tbOCAqIDUgKyBpXSArIGJsb2NrWzggKiAzICsgaV07CisgICAgICAgIHoxMCA9IGJsb2NrWzggKiA1ICsgaV0gLSBibG9ja1s4ICogMyArIGldOworICAgICAgICB6MTEgPSBibG9ja1s4ICogMSArIGldICsgYmxvY2tbOCAqIDcgKyBpXTsKKyAgICAgICAgejEyID0gYmxvY2tbOCAqIDEgKyBpXSAtIGJsb2NrWzggKiA3ICsgaV07CisKKyAgICAgICAgdG1wNyAgPSAgICAgICAgICB6MTEgKyB6MTM7CisgICAgICAgIHRtcDExID0gTVVMVElQTFkoejExIC0gejEzLCBGSVhfMV80MTQyMTM1NjIpOworCisgICAgICAgIHo1ICAgID0gTVVMVElQTFkoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOworICAgICAgICB0bXAxMCA9IE1VTFRJUExZKHoxMiwgIEZJWF8xXzA4MjM5MjIwMCkgLSB6NTsKKyAgICAgICAgdG1wMTIgPSBNVUxUSVBMWSh6MTAsIC1GSVhfMl82MTMxMjU5MzApICsgejU7CisKKyAgICAgICAgdG1wNiA9IHRtcDEyIC0gdG1wNzsKKyAgICAgICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKKyAgICAgICAgdG1wNCA9IHRtcDEwICsgdG1wNTsKKworICAgICAgICB0ZW1wWzggKiAwICsgaV0gPSB0bXAwICsgdG1wNzsKKyAgICAgICAgdGVtcFs4ICogNyArIGldID0gdG1wMCAtIHRtcDc7CisgICAgICAgIHRlbXBbOCAqIDEgKyBpXSA9IHRtcDEgKyB0bXA2OworICAgICAgICB0ZW1wWzggKiA2ICsgaV0gPSB0bXAxIC0gdG1wNjsKKyAgICAgICAgdGVtcFs4ICogMiArIGldID0gdG1wMiArIHRtcDU7CisgICAgICAgIHRlbXBbOCAqIDUgKyBpXSA9IHRtcDIgLSB0bXA1OworICAgICAgICB0ZW1wWzggKiA0ICsgaV0gPSB0bXAzICsgdG1wNDsKKyAgICAgICAgdGVtcFs4ICogMyArIGldID0gdG1wMyAtIHRtcDQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDggKiA4OyBpICs9IDgpIHsKKyAgICAgICAgdG1wMTAgPSB0ZW1wWzAgKyBpXSArIHRlbXBbNCArIGldOworICAgICAgICB0bXAxMSA9IHRlbXBbMCArIGldIC0gdGVtcFs0ICsgaV07CisKKyAgICAgICAgdG1wMTMgPSB0ZW1wWzIgKyBpXSArIHRlbXBbNiArIGldOworICAgICAgICB0bXAxMiA9IE1VTFRJUExZKHRlbXBbMiArIGldIC0gdGVtcFs2ICsgaV0sIEZJWF8xXzQxNDIxMzU2MikgLSB0bXAxMzsKKworICAgICAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsKKyAgICAgICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7CisgICAgICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOworICAgICAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsKKworICAgICAgICB6MTMgPSB0ZW1wWzUgKyBpXSArIHRlbXBbMyArIGldOworICAgICAgICB6MTAgPSB0ZW1wWzUgKyBpXSAtIHRlbXBbMyArIGldOworICAgICAgICB6MTEgPSB0ZW1wWzEgKyBpXSArIHRlbXBbNyArIGldOworICAgICAgICB6MTIgPSB0ZW1wWzEgKyBpXSAtIHRlbXBbNyArIGldOworCisgICAgICAgIHRtcDcgID0gejExICsgejEzOworICAgICAgICB0bXAxMSA9IE1VTFRJUExZKHoxMSAtIHoxMywgRklYXzFfNDE0MjEzNTYyKTsKKworICAgICAgICB6NSAgICA9IE1VTFRJUExZKHoxMCArIHoxMiwgRklYXzFfODQ3NzU5MDY1KTsKKyAgICAgICAgdG1wMTAgPSBNVUxUSVBMWSh6MTIsICBGSVhfMV8wODIzOTIyMDApIC0gejU7CisgICAgICAgIHRtcDEyID0gTVVMVElQTFkoejEwLCAtRklYXzJfNjEzMTI1OTMwKSArIHo1OworCisgICAgICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CisgICAgICAgIHRtcDUgPSB0bXAxMSAtIHRtcDY7CisgICAgICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CisKKyAgICAgICAgYmxvY2tbMCArIGldID0gKHRtcDAgKyB0bXA3KSA+PiA2OworICAgICAgICBibG9ja1s3ICsgaV0gPSAodG1wMCAtIHRtcDcpID4+IDY7CisgICAgICAgIGJsb2NrWzEgKyBpXSA9ICh0bXAxICsgdG1wNikgPj4gNjsKKyAgICAgICAgYmxvY2tbNiArIGldID0gKHRtcDEgLSB0bXA2KSA+PiA2OworICAgICAgICBibG9ja1syICsgaV0gPSAodG1wMiArIHRtcDUpID4+IDY7CisgICAgICAgIGJsb2NrWzUgKyBpXSA9ICh0bXAyIC0gdG1wNSkgPj4gNjsKKyAgICAgICAgYmxvY2tbNCArIGldID0gKHRtcDMgKyB0bXA0KSA+PiA2OworICAgICAgICBibG9ja1szICsgaV0gPSAodG1wMyAtIHRtcDQpID4+IDY7CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGluaXRfdmxjcyhGb3VyWENvbnRleHQgKmYpCit7CisgICAgc3RhdGljIFZMQ19UWVBFIHRhYmxlWzJdWzRdWzMyXVsyXTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgYmxvY2tfdHlwZV92bGNbaV1bal0udGFibGUgICAgICAgICAgID0gdGFibGVbaV1bal07CisgICAgICAgICAgICBibG9ja190eXBlX3ZsY1tpXVtqXS50YWJsZV9hbGxvY2F0ZWQgPSAzMjsKKyAgICAgICAgICAgIGluaXRfdmxjKCZibG9ja190eXBlX3ZsY1tpXVtqXSwgQkxPQ0tfVFlQRV9WTENfQklUUywgNywKKyAgICAgICAgICAgICAgICAgICAgICZibG9ja190eXBlX3RhYltpXVtqXVswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICZibG9ja190eXBlX3RhYltpXVtqXVswXVswXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaW5pdF9tdihGb3VyWENvbnRleHQgKmYsIGludCBsaW5lc2l6ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBpZiAoZi0+dmVyc2lvbiA+IDEpCisgICAgICAgICAgICBmLT5tdltpXSA9IG12W2ldWzBdICsgbXZbaV1bMV0gKiBsaW5lc2l6ZSAvIDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGYtPm12W2ldID0gKGkgJiAxNSkgLSA4ICsgKChpID4+IDQpIC0gOCkgKiBsaW5lc2l6ZSAvIDI7CisgICAgfQorfQorCisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgTEVfQ0VOVFJJQ19NVUwoZHN0LCBzcmMsIHNjYWxlLCBkYykgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIHRtcHZhbCA9IEFWX1JOMzIoc3JjKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdG1wdmFsID0gKHRtcHZhbCA8PCAxNikgfCAodG1wdmFsID4+IDE2KTsgICAgICAgXAorICAgICAgICB0bXB2YWwgPSB0bXB2YWwgKiAoc2NhbGUpICsgKGRjKTsgICAgICAgICAgICAgICBcCisgICAgICAgIHRtcHZhbCA9ICh0bXB2YWwgPDwgMTYpIHwgKHRtcHZhbCA+PiAxNik7ICAgICAgIFwKKyAgICAgICAgQVZfV04zMkEoZHN0LCB0bXB2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIExFX0NFTlRSSUNfTVVMKGRzdCwgc3JjLCBzY2FsZSwgZGMpICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIHRtcHZhbCA9IEFWX1JOMzIoc3JjKSAqIChzY2FsZSkgKyAoZGMpOyBcCisgICAgICAgIEFWX1dOMzJBKGRzdCwgdG1wdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY2RjKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMsIGludCBsb2cydywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgc3RyaWRlLCBpbnQgc2NhbGUsIHVuc2lnbmVkIGRjKQoreworICAgIGludCBpOworICAgIGRjICo9IDB4MTAwMDE7CisKKyAgICBzd2l0Y2ggKGxvZzJ3KSB7CisgICAgY2FzZSAwOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgICAgICBkc3RbMF0gPSBzY2FsZSAqIHNyY1swXSArIGRjOworICAgICAgICAgICAgaWYgKHNjYWxlKQorICAgICAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICAgICAgTEVfQ0VOVFJJQ19NVUwoZHN0LCBzcmMsIHNjYWxlLCBkYyk7CisgICAgICAgICAgICBpZiAoc2NhbGUpCisgICAgICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgICAgICBMRV9DRU5UUklDX01VTChkc3QsIHNyYywgc2NhbGUsIGRjKTsKKyAgICAgICAgICAgIExFX0NFTlRSSUNfTVVMKGRzdCArIDIsIHNyYyArIDIsIHNjYWxlLCBkYyk7CisgICAgICAgICAgICBpZiAoc2NhbGUpCisgICAgICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgICAgICBMRV9DRU5UUklDX01VTChkc3QsICAgICBzcmMsICAgICBzY2FsZSwgZGMpOworICAgICAgICAgICAgTEVfQ0VOVFJJQ19NVUwoZHN0ICsgMiwgc3JjICsgMiwgc2NhbGUsIGRjKTsKKyAgICAgICAgICAgIExFX0NFTlRSSUNfTVVMKGRzdCArIDQsIHNyYyArIDQsIHNjYWxlLCBkYyk7CisgICAgICAgICAgICBMRV9DRU5UUklDX01VTChkc3QgKyA2LCBzcmMgKyA2LCBzY2FsZSwgZGMpOworICAgICAgICAgICAgaWYgKHNjYWxlKQorICAgICAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9wX2Jsb2NrKEZvdXJYQ29udGV4dCAqZiwgdWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJ3LCBpbnQgbG9nMmgsIGludCBzdHJpZGUpCit7CisgICAgaW50IGluZGV4LCBoLCBjb2RlLCByZXQsIHNjYWxlID0gMTsKKyAgICB1aW50MTZfdCAqc3RhcnQsICplbmQ7CisgICAgdW5zaWduZWQgZGMgPSAwOworCisgICAgYXZfYXNzZXJ0MChsb2cydyA+PSAwICYmIGxvZzJoID49IDApOworCisgICAgaW5kZXggPSBzaXplMmluZGV4W2xvZzJoXVtsb2cyd107CisgICAgYXZfYXNzZXJ0MChpbmRleCA+PSAwKTsKKworICAgIGggICAgID0gMSA8PCBsb2cyaDsKKyAgICBjb2RlICA9IGdldF92bGMyKCZmLT5nYiwgYmxvY2tfdHlwZV92bGNbMSAtIChmLT52ZXJzaW9uID4gMSldW2luZGV4XS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1RZUEVfVkxDX0JJVFMsIDEpOworICAgIGF2X2Fzc2VydDAoY29kZSA+PSAwICYmIGNvZGUgPD0gNik7CisKKyAgICBzdGFydCA9IGYtPmxhc3RfZnJhbWVfYnVmZmVyOworICAgIGVuZCAgID0gc3RhcnQgKyBzdHJpZGUgKiAoZi0+YXZjdHgtPmhlaWdodCAtIGggKyAxKSAtICgxIDw8IGxvZzJ3KTsKKworICAgIGlmIChjb2RlID09IDEpIHsKKyAgICAgICAgbG9nMmgtLTsKKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfcF9ibG9jayhmLCBkc3QsIHNyYywgbG9nMncsIGxvZzJoLCBzdHJpZGUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXR1cm4gZGVjb2RlX3BfYmxvY2soZiwgZHN0ICsgKHN0cmlkZSA8PCBsb2cyaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgKyAoc3RyaWRlIDw8IGxvZzJoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJ3LCBsb2cyaCwgc3RyaWRlKTsKKyAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMikgeworICAgICAgICBsb2cydy0tOworICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9wX2Jsb2NrKGYsIGRzdCAsIHNyYywgbG9nMncsIGxvZzJoLCBzdHJpZGUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXR1cm4gZGVjb2RlX3BfYmxvY2soZiwgZHN0ICsgKDEgPDwgbG9nMncpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgKDEgPDwgbG9nMncpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMncsIGxvZzJoLCBzdHJpZGUpOworICAgIH0gZWxzZSBpZiAoY29kZSA9PSA2KSB7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZi0+ZzIpIDwgNCkgeworICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3b3Jkc3RyZWFtIG92ZXJyZWFkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChsb2cydykgeworICAgICAgICAgICAgZHN0WzBdICAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmYtPmcyKTsKKyAgICAgICAgICAgIGRzdFsxXSAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZmLT5nMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RbMF0gICAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZi0+ZzIpOworICAgICAgICAgICAgZHN0W3N0cmlkZV0gPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmYtPmcyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoKGNvZGUmMyk9PTAgJiYgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmYtPmcpIDwgMSkgeworICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImJ5dGVzdHJlYW0gb3ZlcnJlYWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoY29kZSA9PSAwKSB7CisgICAgICAgIHNyYyAgKz0gZi0+bXZbYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmYtPmcpXTsKKyAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMyAmJiBmLT52ZXJzaW9uID49IDIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChjb2RlID09IDQpIHsKKyAgICAgICAgc3JjICArPSBmLT5tdltieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZi0+ZyldOworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmYtPmcyKSA8IDIpeworICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3b3Jkc3RyZWFtIG92ZXJyZWFkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGRjICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmYtPmcyKTsKKyAgICB9IGVsc2UgaWYgKGNvZGUgPT0gNSkgeworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmYtPmcyKSA8IDIpeworICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3b3Jkc3RyZWFtIG92ZXJyZWFkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGF2X2Fzc2VydDAoc3RhcnQgPD0gc3JjICYmIHNyYyA8PSBlbmQpOworICAgICAgICBzY2FsZSA9IDA7CisgICAgICAgIGRjICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmYtPmcyKTsKKyAgICB9CisKKyAgICBpZiAoc3RhcnQgPiBzcmMgfHwgc3JjID4gZW5kKSB7CisgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibXYgb3V0IG9mIHBpY1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIG1jZGMoZHN0LCBzcmMsIGxvZzJ3LCBoLCBzdHJpZGUsIHNjYWxlLCBkYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcF9mcmFtZShGb3VyWENvbnRleHQgKmYsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBjb25zdCBpbnQgd2lkdGggID0gZi0+YXZjdHgtPndpZHRoOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBmLT5hdmN0eC0+aGVpZ2h0OworICAgIHVpbnQxNl90ICpkc3QgICAgPSBmLT5mcmFtZV9idWZmZXI7CisgICAgdWludDE2X3QgKnNyYzsKKyAgICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX3NpemUsIGJ5dGVzdHJlYW1fc2l6ZSwgd29yZHN0cmVhbV9zaXplLCBleHRyYSwKKyAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9vZmZzZXQsIHdvcmRzdHJlYW1fb2Zmc2V0OworICAgIGludCByZXQ7CisKKyAgICBzcmMgPSBmLT5sYXN0X2ZyYW1lX2J1ZmZlcjsKKworICAgIGlmIChmLT52ZXJzaW9uID4gMSkgeworICAgICAgICBleHRyYSAgICAgICAgICAgPSAyMDsKKyAgICAgICAgaWYgKGxlbmd0aCA8IGV4dHJhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGJpdHN0cmVhbV9zaXplICA9IEFWX1JMMzIoYnVmICsgOCk7CisgICAgICAgIHdvcmRzdHJlYW1fc2l6ZSA9IEFWX1JMMzIoYnVmICsgMTIpOworICAgICAgICBieXRlc3RyZWFtX3NpemUgPSBBVl9STDMyKGJ1ZiArIDE2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBleHRyYSAgICAgICAgICAgPSAwOworICAgICAgICBiaXRzdHJlYW1fc2l6ZSAgPSBBVl9STDE2KGJ1ZiAtIDQpOworICAgICAgICB3b3Jkc3RyZWFtX3NpemUgPSBBVl9STDE2KGJ1ZiAtIDIpOworICAgICAgICBieXRlc3RyZWFtX3NpemUgPSBGRk1BWChsZW5ndGggLSBiaXRzdHJlYW1fc2l6ZSAtIHdvcmRzdHJlYW1fc2l6ZSwgMCk7CisgICAgfQorCisgICAgaWYgKGJpdHN0cmVhbV9zaXplID4gbGVuZ3RoIHx8IGJpdHN0cmVhbV9zaXplID49IElOVF9NQVgvOCB8fAorICAgICAgICBieXRlc3RyZWFtX3NpemUgPiBsZW5ndGggLSBiaXRzdHJlYW1fc2l6ZSB8fAorICAgICAgICB3b3Jkc3RyZWFtX3NpemUgPiBsZW5ndGggLSBieXRlc3RyZWFtX3NpemUgLSBiaXRzdHJlYW1fc2l6ZSB8fAorICAgICAgICBleHRyYSA+IGxlbmd0aCAtIGJ5dGVzdHJlYW1fc2l6ZSAtIGJpdHN0cmVhbV9zaXplIC0gd29yZHN0cmVhbV9zaXplKSB7CisgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibGVuZ3RocyAlZCAlZCAlZCAlZFxuIiwgYml0c3RyZWFtX3NpemUsIGJ5dGVzdHJlYW1fc2l6ZSwgd29yZHN0cmVhbV9zaXplLAorICAgICAgICBiaXRzdHJlYW1fc2l6ZSsgYnl0ZXN0cmVhbV9zaXplKyB3b3Jkc3RyZWFtX3NpemUgLSBsZW5ndGgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmYtPmJpdHN0cmVhbV9idWZmZXIsICZmLT5iaXRzdHJlYW1fYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbV9zaXplKTsKKyAgICBpZiAoIWYtPmJpdHN0cmVhbV9idWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZi0+YmJkc3AuYnN3YXBfYnVmKGYtPmJpdHN0cmVhbV9idWZmZXIsIChjb25zdCB1aW50MzJfdCAqKSAoYnVmICsgZXh0cmEpLAorICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW1fc2l6ZSAvIDQpOworICAgIGluaXRfZ2V0X2JpdHMoJmYtPmdiLCBmLT5iaXRzdHJlYW1fYnVmZmVyLCA4ICogYml0c3RyZWFtX3NpemUpOworCisgICAgd29yZHN0cmVhbV9vZmZzZXQgPSBleHRyYSArIGJpdHN0cmVhbV9zaXplOworICAgIGJ5dGVzdHJlYW1fb2Zmc2V0ID0gZXh0cmEgKyBiaXRzdHJlYW1fc2l6ZSArIHdvcmRzdHJlYW1fc2l6ZTsKKyAgICBieXRlc3RyZWFtMl9pbml0KCZmLT5nMiwgYnVmICsgd29yZHN0cmVhbV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBsZW5ndGggLSB3b3Jkc3RyZWFtX29mZnNldCk7CisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZi0+ZywgYnVmICsgYnl0ZXN0cmVhbV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBsZW5ndGggLSBieXRlc3RyZWFtX29mZnNldCk7CisKKyAgICBpbml0X212KGYsIHdpZHRoICogMik7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDgpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDgpCisgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9wX2Jsb2NrKGYsIGRzdCArIHgsIHNyYyArIHgsIDMsIDMsIHdpZHRoKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHNyYyArPSA4ICogd2lkdGg7CisgICAgICAgIGRzdCArPSA4ICogd2lkdGg7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogZGVjb2RlIGJsb2NrIGFuZCBkZXF1YW50aXplLgorICogTm90ZSB0aGlzIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gTUpQRUcuCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2lfYmxvY2soRm91clhDb250ZXh0ICpmLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgY29kZSwgaSwgaiwgbGV2ZWwsIHZhbDsKKworICAgIGlmIChnZXRfYml0c19sZWZ0KCZmLT5nYikgPCAyKXsKKyAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIlZCBiaXRzIGxlZnQgYmVmb3JlIGRlY29kZV9pX2Jsb2NrKClcbiIsIGdldF9iaXRzX2xlZnQoJmYtPmdiKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBEQyBjb2VmICovCisgICAgdmFsID0gZ2V0X3ZsYzIoJmYtPnByZV9nYiwgZi0+cHJlX3ZsYy50YWJsZSwgQUNEQ19WTENfQklUUywgMyk7CisgICAgaWYgKHZhbCA+PiA0KSB7CisgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgZGMgcnVuICE9IDBcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAodmFsKQorICAgICAgICB2YWwgPSBnZXRfeGJpdHMoJmYtPmdiLCB2YWwpOworCisgICAgdmFsICAgICAgICA9IHZhbCAqIGRlcXVhbnRfdGFibGVbMF0gKyBmLT5sYXN0X2RjOworICAgIGYtPmxhc3RfZGMgPSBibG9ja1swXSA9IHZhbDsKKyAgICAvKiBBQyBjb2VmcyAqLworICAgIGkgPSAxOworICAgIGZvciAoOzspIHsKKyAgICAgICAgY29kZSA9IGdldF92bGMyKCZmLT5wcmVfZ2IsIGYtPnByZV92bGMudGFibGUsIEFDRENfVkxDX0JJVFMsIDMpOworCisgICAgICAgIC8qIEVPQiAqLworICAgICAgICBpZiAoY29kZSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjb2RlID09IDB4ZjApIHsKKyAgICAgICAgICAgIGkgKz0gMTY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY29kZSAmIDB4ZikgeworICAgICAgICAgICAgICAgIGxldmVsID0gZ2V0X3hiaXRzKCZmLT5nYiwgY29kZSAmIDB4Zik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiMCBjb2VmZlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpICAgICs9IGNvZGUgPj4gNDsKKyAgICAgICAgICAgIGlmIChpID49IDY0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJydW4gJWQgb3ZlZmxvd1xuIiwgaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGogPSBmZl96aWd6YWdfZGlyZWN0W2ldOworICAgICAgICAgICAgYmxvY2tbal0gPSBsZXZlbCAqIGRlcXVhbnRfdGFibGVbal07CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZiAoaSA+PSA2NCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWRjdF9wdXQoRm91clhDb250ZXh0ICpmLCBpbnQgeCwgaW50IHkpCit7CisgICAgaW50MTZfdCAoKmJsb2NrKVs2NF0gPSBmLT5ibG9jazsKKyAgICBpbnQgc3RyaWRlICAgICAgICAgICA9IGYtPmF2Y3R4LT53aWR0aDsKKyAgICBpbnQgaTsKKyAgICB1aW50MTZfdCAqZHN0ID0gZi0+ZnJhbWVfYnVmZmVyICsgeSAqIHN0cmlkZSArIHg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGJsb2NrW2ldWzBdICs9IDB4ODAgKiA4ICogODsKKyAgICAgICAgaWRjdChibG9ja1tpXSk7CisgICAgfQorCisgICAgaWYgKCEoZi0+YXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkgeworICAgICAgICBmb3IgKGkgPSA0OyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgaWRjdChibG9ja1tpXSk7CisgICAgfQorCisgICAgLyogTm90ZSB0cmFuc2Zvcm0gaXM6CisgICAgICogeSAgPSAoIDFiICsgNGcgKyAycikgLyAxNAorICAgICAqIGNiID0gKCAzYiAtIDJnIC0gMXIpIC8gMTQKKyAgICAgKiBjciA9ICgtMWIgLSA0ZyArIDVyKSAvIDE0ICovCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7CisgICAgICAgICAgICBpbnQxNl90ICp0ZW1wID0gYmxvY2tbKHggPj4gMikgKyAyICogKHkgPj4gMildICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogKHggJiAzKSArIDIgKiA4ICogKHkgJiAzKTsgLy8gRklYTUUgb3B0aW1pemUKKyAgICAgICAgICAgIGludCBjYiA9IGJsb2NrWzRdW3ggKyA4ICogeV07CisgICAgICAgICAgICBpbnQgY3IgPSBibG9ja1s1XVt4ICsgOCAqIHldOworICAgICAgICAgICAgaW50IGNnID0gKGNiICsgY3IpID4+IDE7CisgICAgICAgICAgICBpbnQgeTsKKworICAgICAgICAgICAgY2IgKz0gY2I7CisKKyAgICAgICAgICAgIHkgICAgICAgICAgICAgICA9IHRlbXBbMF07CisgICAgICAgICAgICBkc3RbMF0gICAgICAgICAgPSAoKHkgKyBjYikgPj4gMykgKyAoKCh5IC0gY2cpICYgMHhGQykgPDwgMykgKyAoKCh5ICsgY3IpICYgMHhGOCkgPDwgOCk7CisgICAgICAgICAgICB5ICAgICAgICAgICAgICAgPSB0ZW1wWzFdOworICAgICAgICAgICAgZHN0WzFdICAgICAgICAgID0gKCh5ICsgY2IpID4+IDMpICsgKCgoeSAtIGNnKSAmIDB4RkMpIDw8IDMpICsgKCgoeSArIGNyKSAmIDB4RjgpIDw8IDgpOworICAgICAgICAgICAgeSAgICAgICAgICAgICAgID0gdGVtcFs4XTsKKyAgICAgICAgICAgIGRzdFtzdHJpZGVdICAgICA9ICgoeSArIGNiKSA+PiAzKSArICgoKHkgLSBjZykgJiAweEZDKSA8PCAzKSArICgoKHkgKyBjcikgJiAweEY4KSA8PCA4KTsKKyAgICAgICAgICAgIHkgICAgICAgICAgICAgICA9IHRlbXBbOV07CisgICAgICAgICAgICBkc3RbMSArIHN0cmlkZV0gPSAoKHkgKyBjYikgPj4gMykgKyAoKCh5IC0gY2cpICYgMHhGQykgPDwgMykgKyAoKCh5ICsgY3IpICYgMHhGOCkgPDwgOCk7CisgICAgICAgICAgICBkc3QgICAgICAgICAgICArPSAyOworICAgICAgICB9CisgICAgICAgIGRzdCArPSAyICogc3RyaWRlIC0gMiAqIDg7CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9pX21iKEZvdXJYQ29udGV4dCAqZikKK3sKKyAgICBpbnQgcmV0OworICAgIGludCBpOworCisgICAgZi0+YmRzcC5jbGVhcl9ibG9ja3MoZi0+YmxvY2tbMF0pOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfaV9ibG9jayhmLCBmLT5ibG9ja1tpXSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgKnJlYWRfaHVmZm1hbl90YWJsZXMoRm91clhDb250ZXh0ICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgZnJlcXVlbmN5WzUxMl0gPSB7IDAgfTsKKyAgICB1aW50OF90IGZsYWdbNTEyXTsKKyAgICBpbnQgdXBbNTEyXTsKKyAgICB1aW50OF90IGxlbl90YWJbMjU3XTsKKyAgICBpbnQgYml0c190YWJbMjU3XTsKKyAgICBpbnQgc3RhcnQsIGVuZDsKKyAgICBjb25zdCB1aW50OF90ICpwdHIgPSBidWY7CisgICAgY29uc3QgdWludDhfdCAqcHRyX2VuZCA9IGJ1ZiArIGJ1Zl9zaXplOworICAgIGludCBqOworCisgICAgbWVtc2V0KHVwLCAtMSwgc2l6ZW9mKHVwKSk7CisKKyAgICBzdGFydCA9ICpwdHIrKzsKKyAgICBlbmQgICA9ICpwdHIrKzsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmIChwdHJfZW5kIC0gcHRyIDwgRkZNQVgoZW5kIC0gc3RhcnQgKyAxLCAwKSArIDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBkYXRhIGluIHJlYWRfaHVmZm1hbl90YWJsZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykKKyAgICAgICAgICAgIGZyZXF1ZW5jeVtpXSA9ICpwdHIrKzsKKyAgICAgICAgc3RhcnQgPSAqcHRyKys7CisgICAgICAgIGlmIChzdGFydCA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZW5kID0gKnB0cisrOworICAgIH0KKyAgICBmcmVxdWVuY3lbMjU2XSA9IDE7CisKKyAgICB3aGlsZSAoKHB0ciAtIGJ1ZikgJiAzKQorICAgICAgICBwdHIrKzsgLy8gNGJ5dGUgYWxpZ24KKworICAgIGlmIChwdHIgPiBwdHJfZW5kKSB7CisgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicHRyIG92ZXJmbG93IGluIHJlYWRfaHVmZm1hbl90YWJsZXNcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGogPSAyNTc7IGogPCA1MTI7IGorKykgeworICAgICAgICBpbnQgbWluX2ZyZXFbMl0gPSB7IDI1NiAqIDI1NiwgMjU2ICogMjU2IH07CisgICAgICAgIGludCBzbWFsbGVzdFsyXSA9IHsgMCwgMCB9OworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworICAgICAgICAgICAgaWYgKGZyZXF1ZW5jeVtpXSA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGZyZXF1ZW5jeVtpXSA8IG1pbl9mcmVxWzFdKSB7CisgICAgICAgICAgICAgICAgaWYgKGZyZXF1ZW5jeVtpXSA8IG1pbl9mcmVxWzBdKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbl9mcmVxWzFdID0gbWluX2ZyZXFbMF07CisgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0WzFdID0gc21hbGxlc3RbMF07CisgICAgICAgICAgICAgICAgICAgIG1pbl9mcmVxWzBdID0gZnJlcXVlbmN5W2ldOworICAgICAgICAgICAgICAgICAgICBzbWFsbGVzdFswXSA9IGk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWluX2ZyZXFbMV0gPSBmcmVxdWVuY3lbaV07CisgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0WzFdID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1pbl9mcmVxWzFdID09IDI1NiAqIDI1NikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGZyZXF1ZW5jeVtqXSAgICAgICAgICAgPSBtaW5fZnJlcVswXSArIG1pbl9mcmVxWzFdOworICAgICAgICBmbGFnW3NtYWxsZXN0WzBdXSAgICAgID0gMDsKKyAgICAgICAgZmxhZ1tzbWFsbGVzdFsxXV0gICAgICA9IDE7CisgICAgICAgIHVwW3NtYWxsZXN0WzBdXSAgICAgICAgPQorICAgICAgICB1cFtzbWFsbGVzdFsxXV0gICAgICAgID0gajsKKyAgICAgICAgZnJlcXVlbmN5W3NtYWxsZXN0WzBdXSA9IGZyZXF1ZW5jeVtzbWFsbGVzdFsxXV0gPSAwOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCAyNTc7IGorKykgeworICAgICAgICBpbnQgbm9kZSwgbGVuID0gMCwgYml0cyA9IDA7CisKKyAgICAgICAgZm9yIChub2RlID0gajsgdXBbbm9kZV0gIT0gLTE7IG5vZGUgPSB1cFtub2RlXSkgeworICAgICAgICAgICAgYml0cyArPSBmbGFnW25vZGVdIDw8IGxlbjsKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgaWYgKGxlbiA+IDMxKQorICAgICAgICAgICAgICAgIC8vIGNhbiB0aGlzIGhhcHBlbiBhdCBhbGwgPworICAgICAgICAgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAidmxjIGxlbmd0aCBvdmVyZmxvd1xuIik7CisgICAgICAgIH0KKworICAgICAgICBiaXRzX3RhYltqXSA9IGJpdHM7CisgICAgICAgIGxlbl90YWJbal0gID0gbGVuOworICAgIH0KKworICAgIGlmIChpbml0X3ZsYygmZi0+cHJlX3ZsYywgQUNEQ19WTENfQklUUywgMjU3LCBsZW5fdGFiLCAxLCAxLAorICAgICAgICAgICAgICAgICBiaXRzX3RhYiwgNCwgNCwgMCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIHB0cjsKK30KKworc3RhdGljIGludCBtaXgoaW50IGMwLCBpbnQgYzEpCit7CisgICAgaW50IGJsdWUgID0gIDIgKiAoYzAgJiAweDAwMUYpICsgKGMxICYgMHgwMDFGKTsKKyAgICBpbnQgZ3JlZW4gPSAoMiAqIChjMCAmIDB4MDNFMCkgKyAoYzEgJiAweDAzRTApKSA+PiA1OworICAgIGludCByZWQgICA9ICAyICogKGMwID4+IDEwKSAgICArIChjMSA+PiAxMCk7CisgICAgcmV0dXJuIHJlZCAvIDMgKiAxMDI0ICsgZ3JlZW4gLyAzICogMzIgKyBibHVlIC8gMzsKK30KKworc3RhdGljIGludCBkZWNvZGVfaTJfZnJhbWUoRm91clhDb250ZXh0ICpmLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW5ndGgpCit7CisgICAgaW50IHgsIHksIHgyLCB5MjsKKyAgICBjb25zdCBpbnQgd2lkdGggID0gZi0+YXZjdHgtPndpZHRoOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBmLT5hdmN0eC0+aGVpZ2h0OworICAgIGNvbnN0IGludCBtYnMgICAgPSAoRkZBTElHTih3aWR0aCwgMTYpID4+IDQpICogKEZGQUxJR04oaGVpZ2h0LCAxNikgPj4gNCk7CisgICAgdWludDE2X3QgKmRzdCAgICA9IGYtPmZyYW1lX2J1ZmZlcjsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgbGVuZ3RoOworICAgIEdldEJ5dGVDb250ZXh0IGczOworCisgICAgaWYgKGxlbmd0aCA8IG1icyAqIDgpIHsKKyAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJwYWNrZXQgc2l6ZSB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZzMsIGJ1ZiwgbGVuZ3RoKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMTYpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDE2KSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29sb3JbNF0gPSB7IDAgfSwgYml0czsKKyAgICAgICAgICAgIGlmIChidWZfZW5kIC0gYnVmIDwgOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAvLyB3YXJuaW5nIGZvbGxvd2luZyBpcyBwdXJlbHkgZ3Vlc3NlZCAuLi4KKyAgICAgICAgICAgIGNvbG9yWzBdID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnMyk7CisgICAgICAgICAgICBjb2xvclsxXSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZzMpOworCisgICAgICAgICAgICBpZiAoY29sb3JbMF0gJiAweDgwMDApCisgICAgICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bmsgYml0IDFcbiIpOworICAgICAgICAgICAgaWYgKGNvbG9yWzFdICYgMHg4MDAwKQorICAgICAgICAgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5rIGJpdCAyXG4iKTsKKworICAgICAgICAgICAgY29sb3JbMl0gPSBtaXgoY29sb3JbMF0sIGNvbG9yWzFdKTsKKyAgICAgICAgICAgIGNvbG9yWzNdID0gbWl4KGNvbG9yWzFdLCBjb2xvclswXSk7CisKKyAgICAgICAgICAgIGJpdHMgPSBieXRlc3RyZWFtMl9nZXRfbGUzMnUoJmczKTsKKyAgICAgICAgICAgIGZvciAoeTIgPSAwOyB5MiA8IDE2OyB5MisrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4MiA9IDA7IHgyIDwgMTY7IHgyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMiAqICh4MiA+PiAyKSArIDggKiAoeTIgPj4gMik7CisgICAgICAgICAgICAgICAgICAgIGRzdFt5MiAqIHdpZHRoICsgeDJdID0gY29sb3JbKGJpdHMgPj4gaW5kZXgpICYgM107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICs9IDE2OworICAgICAgICB9CisgICAgICAgIGRzdCArPSAxNiAqIHdpZHRoIC0geDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfaV9mcmFtZShGb3VyWENvbnRleHQgKmYsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgeCwgeSwgcmV0OworICAgIGNvbnN0IGludCB3aWR0aCAgPSBmLT5hdmN0eC0+d2lkdGg7CisgICAgY29uc3QgaW50IGhlaWdodCA9IGYtPmF2Y3R4LT5oZWlnaHQ7CisgICAgY29uc3QgdW5zaWduZWQgaW50IGJpdHN0cmVhbV9zaXplID0gQVZfUkwzMihidWYpOworICAgIHVuc2lnbmVkIGludCBwcmVzdHJlYW1fc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpwcmVzdHJlYW07CisKKyAgICBpZiAoYml0c3RyZWFtX3NpemUgPiAoMSA8PCAyNikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGxlbmd0aCA8IGJpdHN0cmVhbV9zaXplICsgMTIpIHsKKyAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJwYWNrZXQgc2l6ZSB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBwcmVzdHJlYW1fc2l6ZSA9IDQgKiBBVl9STDMyKGJ1ZiArIGJpdHN0cmVhbV9zaXplICsgNCk7CisgICAgcHJlc3RyZWFtICAgICAgPSAgICAgICAgICAgICBidWYgKyBiaXRzdHJlYW1fc2l6ZSArIDEyOworCisgICAgaWYgKHByZXN0cmVhbV9zaXplICsgYml0c3RyZWFtX3NpemUgKyAxMiAhPSBsZW5ndGgKKyAgICAgICAgfHwgcHJlc3RyZWFtX3NpemUgPiAoMSA8PCAyNikpIHsKKyAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzaXplIG1pc21hdGNoICVkICVkICVkXG4iLAorICAgICAgICAgICAgICAgcHJlc3RyZWFtX3NpemUsIGJpdHN0cmVhbV9zaXplLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBwcmVzdHJlYW0gPSByZWFkX2h1ZmZtYW5fdGFibGVzKGYsIHByZXN0cmVhbSwgcHJlc3RyZWFtX3NpemUpOworICAgIGlmICghcHJlc3RyZWFtKSB7CisgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBIdWZmbWFuIHRhYmxlcy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdl9hc3NlcnQwKHByZXN0cmVhbSA8PSBidWYgKyBsZW5ndGgpOworCisgICAgaW5pdF9nZXRfYml0cygmZi0+Z2IsIGJ1ZiArIDQsIDggKiBiaXRzdHJlYW1fc2l6ZSk7CisKKyAgICBwcmVzdHJlYW1fc2l6ZSA9IGxlbmd0aCArIGJ1ZiAtIHByZXN0cmVhbTsKKworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmZi0+Yml0c3RyZWFtX2J1ZmZlciwgJmYtPmJpdHN0cmVhbV9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc3RyZWFtX3NpemUpOworICAgIGlmICghZi0+Yml0c3RyZWFtX2J1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmLT5iYmRzcC5ic3dhcF9idWYoZi0+Yml0c3RyZWFtX2J1ZmZlciwgKGNvbnN0IHVpbnQzMl90ICopIHByZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJlc3RyZWFtX3NpemUgLyA0KTsKKyAgICBpbml0X2dldF9iaXRzKCZmLT5wcmVfZ2IsIGYtPmJpdHN0cmVhbV9idWZmZXIsIDggKiBwcmVzdHJlYW1fc2l6ZSk7CisKKyAgICBmLT5sYXN0X2RjID0gMCAqIDEyOCAqIDggKiA4OworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAxNikgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMTYpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2lfbWIoZikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBpZGN0X3B1dChmLCB4LCB5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnZXRfdmxjMigmZi0+cHJlX2diLCBmLT5wcmVfdmxjLnRhYmxlLCBBQ0RDX1ZMQ19CSVRTLCAzKSAhPSAyNTYpCisgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5kIG1pc21hdGNoXG4iKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiAgICA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgICA9IGF2cGt0LT5zaXplOworICAgIEZvdXJYQ29udGV4dCAqY29uc3QgZiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqcGljdHVyZSAgICAgID0gZGF0YTsKKyAgICBpbnQgaSwgZnJhbWVfNGNjLCBmcmFtZV9zaXplLCByZXQ7CisKKyAgICBpZiAoYnVmX3NpemUgPCAyMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdl9hc3NlcnQwKGF2Y3R4LT53aWR0aCAlIDE2ID09IDAgJiYgYXZjdHgtPmhlaWdodCAlIDE2ID09IDApOworCisgICAgaWYgKGJ1Zl9zaXplIDwgQVZfUkwzMihidWYgKyA0KSArIDgpIHsKKyAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzaXplIG1pc21hdGNoICVkICUiUFJJdTMyIlxuIiwKKyAgICAgICAgICAgICAgIGJ1Zl9zaXplLCBBVl9STDMyKGJ1ZiArIDQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZnJhbWVfNGNjID0gQVZfUkwzMihidWYpOworCisgICAgaWYgKGZyYW1lXzRjYyA9PSBBVl9STDMyKCJjZnJtIikpIHsKKyAgICAgICAgaW50IGZyZWVfaW5kZXggICAgICAgPSAtMTsKKyAgICAgICAgaW50IGlkLCB3aG9sZV9zaXplOworICAgICAgICBjb25zdCBpbnQgZGF0YV9zaXplICA9IGJ1Zl9zaXplIC0gMjA7CisgICAgICAgIENGcmFtZUJ1ZmZlciAqY2ZybTsKKworICAgICAgICBpZiAoZi0+dmVyc2lvbiA8PSAxKSB7CisgICAgICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNmcm0gaW4gdmVyc2lvbiAlZFxuIiwgZi0+dmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlkICAgICAgICAgPSBBVl9STDMyKGJ1ZiArIDEyKTsKKyAgICAgICAgd2hvbGVfc2l6ZSA9IEFWX1JMMzIoYnVmICsgMTYpOworCisgICAgICAgIGlmIChkYXRhX3NpemUgPCAwIHx8IHdob2xlX3NpemUgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInNpemVzIGludmFsaWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQ0ZSQU1FX0JVRkZFUl9DT1VOVDsgaSsrKQorICAgICAgICAgICAgaWYgKGYtPmNmcm1baV0uaWQgJiYgZi0+Y2ZybVtpXS5pZCA8IGF2Y3R4LT5mcmFtZV9udW1iZXIpCisgICAgICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJsb3N0IGMgZnJhbWUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGYtPmNmcm1baV0uaWQpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBDRlJBTUVfQlVGRkVSX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmLT5jZnJtW2ldLmlkID09IGlkKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGYtPmNmcm1baV0uc2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgIGZyZWVfaW5kZXggPSBpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPj0gQ0ZSQU1FX0JVRkZFUl9DT1VOVCkgeworICAgICAgICAgICAgaSAgICAgICAgICAgICA9IGZyZWVfaW5kZXg7CisgICAgICAgICAgICBmLT5jZnJtW2ldLmlkID0gaWQ7CisgICAgICAgIH0KKyAgICAgICAgY2ZybSA9ICZmLT5jZnJtW2ldOworCisgICAgICAgIGlmIChkYXRhX3NpemUgPiBVSU5UX01BWCAtICBjZnJtLT5zaXplIC0gRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGNmcm0tPmRhdGEgPSBhdl9mYXN0X3JlYWxsb2MoY2ZybS0+ZGF0YSwgJmNmcm0tPmFsbG9jYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcm0tPnNpemUgKyBkYXRhX3NpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgLy8gZXhwbGljaXQgY2hlY2sgbmVlZGVkIGFzIG1lbWNweSBiZWxvdyBtaWdodCBub3QgY2F0Y2ggYSBOVUxMCisgICAgICAgIGlmICghY2ZybS0+ZGF0YSkgeworICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZWFsbG9jIGZhaWx1cmVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShjZnJtLT5kYXRhICsgY2ZybS0+c2l6ZSwgYnVmICsgMjAsIGRhdGFfc2l6ZSk7CisgICAgICAgIGNmcm0tPnNpemUgKz0gZGF0YV9zaXplOworCisgICAgICAgIGlmIChjZnJtLT5zaXplID49IHdob2xlX3NpemUpIHsKKyAgICAgICAgICAgIGJ1ZiAgICAgICAgPSBjZnJtLT5kYXRhOworICAgICAgICAgICAgZnJhbWVfc2l6ZSA9IGNmcm0tPnNpemU7CisKKyAgICAgICAgICAgIGlmIChpZCAhPSBhdmN0eC0+ZnJhbWVfbnVtYmVyKQorICAgICAgICAgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2ZyYW1lIGlkIG1pc21hdGNoICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBpZCwgYXZjdHgtPmZyYW1lX251bWJlcik7CisKKyAgICAgICAgICAgIGlmIChmLT52ZXJzaW9uIDw9IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIGNmcm0tPnNpemUgPSBjZnJtLT5pZCA9IDA7CisgICAgICAgICAgICBmcmFtZV80Y2MgID0gQVZfUkwzMigicGZybSIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBidWYgICAgICAgID0gYnVmICAgICAgKyAxMjsKKyAgICAgICAgZnJhbWVfc2l6ZSA9IGJ1Zl9zaXplIC0gMTI7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwaWN0dXJlLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGZyYW1lXzRjYyA9PSBBVl9STDMyKCJpZnIyIikpIHsKKyAgICAgICAgcGljdHVyZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2kyX2ZyYW1lKGYsIGJ1ZiAtIDQsIGZyYW1lX3NpemUgKyA0KSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRlY29kZSBpMiBmcmFtZSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZnJhbWVfNGNjID09IEFWX1JMMzIoImlmcm0iKSkgeworICAgICAgICBwaWN0dXJlLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfaV9mcmFtZShmLCBidWYsIGZyYW1lX3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlIGkgZnJhbWUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZyYW1lXzRjYyA9PSBBVl9STDMyKCJwZnJtIikgfHwgZnJhbWVfNGNjID09IEFWX1JMMzIoInBmcjIiKSkgeworICAgICAgICBwaWN0dXJlLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfcF9mcmFtZShmLCBidWYsIGZyYW1lX3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlIHAgZnJhbWUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZyYW1lXzRjYyA9PSBBVl9STDMyKCJzbmRfIikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpZ25vcmluZyBzbmRfIGNodW5rIGxlbmd0aDolZFxuIiwKKyAgICAgICAgICAgICAgIGJ1Zl9zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImlnbm9yaW5nIHVua25vd24gY2h1bmsgbGVuZ3RoOiVkXG4iLAorICAgICAgICAgICAgICAgYnVmX3NpemUpOworICAgIH0KKworICAgIHBpY3R1cmUtPmtleV9mcmFtZSA9IHBpY3R1cmUtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUocGljdHVyZS0+ZGF0YVswXSwgcGljdHVyZS0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopZi0+ZnJhbWVfYnVmZmVyLCAgYXZjdHgtPndpZHRoICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCAqIDIsIGF2Y3R4LT5oZWlnaHQpOworICAgIEZGU1dBUCh1aW50MTZfdCAqLCBmLT5mcmFtZV9idWZmZXIsIGYtPmxhc3RfZnJhbWVfYnVmZmVyKTsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgZW1tc19jKCk7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGb3VyWENvbnRleHQgKiBjb25zdCBmID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGF2X2ZyZWVwKCZmLT5mcmFtZV9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZmLT5sYXN0X2ZyYW1lX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJmYtPmJpdHN0cmVhbV9idWZmZXIpOworICAgIGYtPmJpdHN0cmVhbV9idWZmZXJfc2l6ZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IENGUkFNRV9CVUZGRVJfQ09VTlQ7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmZi0+Y2ZybVtpXS5kYXRhKTsKKyAgICAgICAgZi0+Y2ZybVtpXS5hbGxvY2F0ZWRfc2l6ZSA9IDA7CisgICAgfQorICAgIGZmX2ZyZWVfdmxjKCZmLT5wcmVfdmxjKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZvdXJYQ29udGV4dCAqIGNvbnN0IGYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplICE9IDQgfHwgIWF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJleHRyYWRhdGEgd3Jvbmcgb3IgbWlzc2luZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZigoYXZjdHgtPndpZHRoICUgMTYpIHx8IChhdmN0eC0+aGVpZ2h0ICUgMTYpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgd2lkdGgvaGVpZ2h0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0ID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIDAsIGF2Y3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGYtPmZyYW1lX2J1ZmZlciAgICAgID0gYXZfbWFsbG9jeihhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogMik7CisgICAgZi0+bGFzdF9mcmFtZV9idWZmZXIgPSBhdl9tYWxsb2N6KGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiAyKTsKKyAgICBpZiAoIWYtPmZyYW1lX2J1ZmZlciB8fCAhZi0+bGFzdF9mcmFtZV9idWZmZXIpIHsKKyAgICAgICAgZGVjb2RlX2VuZChhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZi0+dmVyc2lvbiA9IEFWX1JMMzIoYXZjdHgtPmV4dHJhZGF0YSkgPj4gMTY7CisgICAgZmZfYmxvY2tkc3BfaW5pdCgmZi0+YmRzcCwgYXZjdHgpOworICAgIGZmX2Jzd2FwZHNwX2luaXQoJmYtPmJiZHNwKTsKKyAgICBmLT5hdmN0eCA9IGF2Y3R4OworICAgIGluaXRfdmxjcyhmKTsKKworICAgIGlmIChmLT52ZXJzaW9uID4gMikKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU2NTsKKyAgICBlbHNlCisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1I1NTU7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9mb3VyeG1fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiNHhtIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiNFggTW92aWUiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfNFhNLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGb3VyWENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvOGJwcy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvOGJwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMGJkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy84YnBzLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBRdWlja3RpbWUgUGxhbmFyIFJHQiAoOEJQUykgVmlkZW8gRGVjb2RlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJvYmVydG8gVG9nbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUVQgOEJQUyBWaWRlbyBEZWNvZGVyIGJ5IFJvYmVydG8gVG9nbmkKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSA4QlBTIGZvcm1hdCwgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzLworICoKKyAqIFN1cHBvcnRzOiBQQUw4IChSR0IgOGJwcCwgcGFsZXR0ZWQpCisgKiAgICAgICAgIDogQkdSMjQgKFJHQiAyNGJwcCkgKGNhbiBhbHNvIG91dHB1dCBpdCBhcyBSR0IzMikKKyAqICAgICAgICAgOiBSR0IzMiAoUkdCIDMyYnBwLCA0dGggcGxhbmUgaXMgYWxwaGEpCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4Zm10X3JnYjI0W10gPSB7CisgICAgQVZfUElYX0ZNVF9CR1IyNCwgQVZfUElYX0ZNVF9SR0IzMiwgQVZfUElYX0ZNVF9OT05FIH07CisKK3R5cGVkZWYgc3RydWN0IEVpZ2h0QnBzQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworCisgICAgdW5zaWduZWQgY2hhciBwbGFuZXM7CisgICAgdW5zaWduZWQgY2hhciBwbGFuZW1hcFs0XTsKKworICAgIHVpbnQzMl90IHBhbFsyNTZdOworfSBFaWdodEJwc0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIEVpZ2h0QnBzQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuY29kZWQgPSBidWY7CisgICAgdW5zaWduZWQgY2hhciAqcGl4cHRyLCAqcGl4cHRyX2VuZDsKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsgLy8gUmVhbCBpbWFnZSBoZWlnaHQKKyAgICB1bnNpZ25lZCBpbnQgZGxlbiwgcCwgcm93OworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxwLCAqZHAsICplcDsKKyAgICB1bnNpZ25lZCBjaGFyIGNvdW50OworICAgIHVuc2lnbmVkIGludCBwbGFuZXMgICAgID0gYy0+cGxhbmVzOworICAgIHVuc2lnbmVkIGNoYXIgKnBsYW5lbWFwID0gYy0+cGxhbmVtYXA7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBlcCA9IGVuY29kZWQgKyBidWZfc2l6ZTsKKworICAgIC8qIFNldCBkYXRhIHBvaW50ZXIgYWZ0ZXIgbGluZSBsZW5ndGhzICovCisgICAgZHAgPSBlbmNvZGVkICsgcGxhbmVzICogKGhlaWdodCA8PCAxKTsKKworICAgIGZvciAocCA9IDA7IHAgPCBwbGFuZXM7IHArKykgeworICAgICAgICAvKiBMaW5lcyBsZW5ndGggcG9pbnRlciBmb3IgdGhpcyBwbGFuZSAqLworICAgICAgICBscCA9IGVuY29kZWQgKyBwICogKGhlaWdodCA8PCAxKTsKKworICAgICAgICAvKiBEZWNvZGUgYSBwbGFuZSAqLworICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgICAgIHBpeHB0ciA9IGZyYW1lLT5kYXRhWzBdICsgcm93ICogZnJhbWUtPmxpbmVzaXplWzBdICsgcGxhbmVtYXBbcF07CisgICAgICAgICAgICBwaXhwdHJfZW5kID0gcGl4cHRyICsgZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgaWYgKGVwIC0gbHAgPCByb3cgKiAyICsgMikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGRsZW4gPSBhdl9iZTJuZTE2KCooY29uc3QgdW5zaWduZWQgc2hvcnQgKikobHAgKyByb3cgKiAyKSk7CisgICAgICAgICAgICAvKiBEZWNvZGUgYSByb3cgb2YgdGhpcyBwbGFuZSAqLworICAgICAgICAgICAgd2hpbGUgKGRsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGVwIC0gZHAgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgaWYgKChjb3VudCA9ICpkcCsrKSA8PSAxMjcpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgZGxlbiAtPSBjb3VudCArIDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaXhwdHJfZW5kIC0gcGl4cHRyIDwgY291bnQgKiBwbGFuZXMpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVwIC0gZHAgPCBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBpeHB0ciA9ICpkcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgcGl4cHRyICs9IHBsYW5lczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMjU3IC0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaXhwdHJfZW5kIC0gcGl4cHRyIDwgY291bnQgKiBwbGFuZXMpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwaXhwdHIgPSAqZHA7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhwdHIgKz0gcGxhbmVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRwKys7CisgICAgICAgICAgICAgICAgICAgIGRsZW4gLT0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA8PSA4KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBhbCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9QQUxFVFRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgaWYgKHBhbCkgeworICAgICAgICAgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgICAgICAgICAgbWVtY3B5KGMtPnBhbCwgcGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkgKGZyYW1lLT5kYXRhWzFdLCBjLT5wYWwsIEFWUEFMRVRURV9TSVpFKTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIC8qIGFsd2F5cyByZXBvcnQgdGhhdCB0aGUgYnVmZmVyIHdhcyBjb21wbGV0ZWx5IGNvbnN1bWVkICovCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEVpZ2h0QnBzQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYy0+YXZjdHggICAgICAgPSBhdmN0eDsKKworICAgIHN3aXRjaCAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgIGNhc2UgODoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgICAgIGMtPnBsYW5lcyAgICAgID0gMTsKKyAgICAgICAgYy0+cGxhbmVtYXBbMF0gPSAwOyAvLyAxc3QgcGxhbmUgaXMgcGFsZXR0ZSBpbmRleGVzCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gZmZfZ2V0X2Zvcm1hdChhdmN0eCwgcGl4Zm10X3JnYjI0KTsKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSAzOworICAgICAgICBjLT5wbGFuZW1hcFswXSA9IDI7IC8vIDFzdCBwbGFuZSBpcyByZWQKKyAgICAgICAgYy0+cGxhbmVtYXBbMV0gPSAxOyAvLyAybmQgcGxhbmUgaXMgZ3JlZW4KKyAgICAgICAgYy0+cGxhbmVtYXBbMl0gPSAwOyAvLyAzcmQgcGxhbmUgaXMgYmx1ZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMzI7CisgICAgICAgIGMtPnBsYW5lcyAgICAgID0gNDsKKyAgICAgICAgLyogaGFuZGxlIHBsYW5lbWFwIHNldHVwIGxhdGVyIGZvciBkZWNvZGluZyByZ2IyNCBkYXRhIGFzIHJiZzMyICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3I6IFVuc3VwcG9ydGVkIGNvbG9yIGRlcHRoOiAldS5cbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMzIpIHsKKyAgICAgICAgYy0+cGxhbmVtYXBbMF0gPSBIQVZFX0JJR0VORElBTiA/IDEgOiAyOyAvLyAxc3QgcGxhbmUgaXMgcmVkCisgICAgICAgIGMtPnBsYW5lbWFwWzFdID0gSEFWRV9CSUdFTkRJQU4gPyAyIDogMTsgLy8gMm5kIHBsYW5lIGlzIGdyZWVuCisgICAgICAgIGMtPnBsYW5lbWFwWzJdID0gSEFWRV9CSUdFTkRJQU4gPyAzIDogMDsgLy8gM3JkIHBsYW5lIGlzIGJsdWUKKyAgICAgICAgYy0+cGxhbmVtYXBbM10gPSBIQVZFX0JJR0VORElBTiA/IDAgOiAzOyAvLyA0dGggcGxhbmUgaXMgYWxwaGEKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfZWlnaHRicHNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiOGJwcyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlF1aWNrVGltZSA4QlBTIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEXzhCUFMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEVpZ2h0QnBzQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvOHN2eC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvOHN2eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDk2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy84c3Z4LmMKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSmFpa3Jpc2huYW4gTWVub24KKyAqIENvcHlyaWdodCAoQykgMjAxMSBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIDhzdnggYXVkaW8gZGVjb2RlcgorICogQGF1dGhvciBKYWlrcmlzaG5hbiBNZW5vbgorICoKKyAqIHN1cHBvcnRzOiBmaWJvbmFjY2kgZGVsdGEgZW5jb2RpbmcKKyAqICAgICAgICAgOiBleHBvbmVudGlhbCBlbmNvZGluZworICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSA4U1ZYIGZvcm1hdDoKKyAqIGh0dHA6Ly9uZXRnaG9zdC5uYXJvZC5ydS9nZmYvdmVuZHNwZWMvaWZmL2lmZi50eHQKKyAqIGh0dHA6Ly9zb3guc291cmNlZm9yZ2UubmV0L0F1ZGlvRm9ybWF0cy0xMS5odG1sCisgKiBodHRwOi8vYW1pbmV0Lm5ldC9wYWNrYWdlL211cy9taXNjL3dhdmVwYWsKKyAqIGh0dHA6Ly9hbWlnYW4uMWVtdS5uZXQvcmVnLzhTVlgudHh0CisgKgorICogU2FtcGxlcyBjYW4gYmUgZm91bmQgaGVyZToKKyAqIGh0dHA6Ly9hbWluZXQubmV0L21vZHMvc21wbC8KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisvKiogZGVjb2RlciBjb250ZXh0ICovCit0eXBlZGVmIHN0cnVjdCBFaWdodFN2eENvbnRleHQgeworICAgIHVpbnQ4X3QgZmliX2FjY1syXTsKKyAgICBjb25zdCBpbnQ4X3QgKnRhYmxlOworCisgICAgLyogYnVmZmVyIHVzZWQgdG8gc3RvcmUgdGhlIHdob2xlIGZpcnN0IHBhY2tldC4KKyAgICAgICBkYXRhIGlzIG9ubHkgc2VudCBhcyBvbmUgbGFyZ2UgcGFja2V0ICovCisgICAgdWludDhfdCAqZGF0YVsyXTsKKyAgICBpbnQgZGF0YV9zaXplOworICAgIGludCBkYXRhX2lkeDsKK30gRWlnaHRTdnhDb250ZXh0OworCitzdGF0aWMgY29uc3QgaW50OF90IGZpYm9uYWNjaVsxNl0gICA9IHsgLTM0LCAgLTIxLCAtMTMsICAtOCwgLTUsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDUsIDgsICAxMywgMjEgfTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgZXhwb25lbnRpYWxbMTZdID0geyAtMTI4LCAtNjQsIC0zMiwgLTE2LCAtOCwgLTQsIC0yLCAtMSwgMCwgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NCB9OworCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFIDIwNDgKKworLyoqCisgKiBEZWx0YSBkZWNvZGUgdGhlIGNvbXByZXNzZWQgdmFsdWVzIGluIHNyYywgYW5kIHB1dCB0aGUgcmVzdWx0aW5nCisgKiBkZWNvZGVkIHNhbXBsZXMgaW4gZHN0LgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHN0YXRlIHN0YXJ0aW5nIHZhbHVlLiBpdCBpcyBzYXZlZCBmb3IgdXNlIGluIHRoZSBuZXh0IGNhbGwuCisgKiBAcGFyYW0gdGFibGUgZGVsdGEgc2VxdWVuY2UgdGFibGUKKyAqLworc3RhdGljIHZvaWQgZGVsdGFfZGVjb2RlKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3RhdGUsIGNvbnN0IGludDhfdCAqdGFibGUpCit7CisgICAgdWludDhfdCB2YWwgPSAqc3RhdGU7CisKKyAgICB3aGlsZSAoc3JjX3NpemUtLSkgeworICAgICAgICB1aW50OF90IGQgPSAqc3JjKys7CisgICAgICAgIHZhbCA9IGF2X2NsaXBfdWludDgodmFsICsgdGFibGVbZCAmIDB4Rl0pOworICAgICAgICAqZHN0KysgPSB2YWw7CisgICAgICAgIHZhbCA9IGF2X2NsaXBfdWludDgodmFsICsgdGFibGVbZCA+PiA0XSk7CisgICAgICAgICpkc3QrKyA9IHZhbDsKKyAgICB9CisKKyAgICAqc3RhdGUgPSB2YWw7Cit9CisKKy8qKiBkZWNvZGUgYSBmcmFtZSAqLworc3RhdGljIGludCBlaWdodHN2eF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgRWlnaHRTdnhDb250ZXh0ICplc2MgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lICAgICAgID0gZGF0YTsKKyAgICBpbnQgYnVmX3NpemU7CisgICAgaW50IGNoLCByZXQ7CisgICAgaW50IGhkcl9zaXplID0gMjsKKworICAgIC8qIGRlY29kZSBhbmQgaW50ZXJsZWF2ZSB0aGUgZmlyc3QgcGFja2V0ICovCisgICAgaWYgKCFlc2MtPmRhdGFbMF0gJiYgYXZwa3QpIHsKKyAgICAgICAgaW50IGNoYW5fc2l6ZSA9IGF2cGt0LT5zaXplIC8gYXZjdHgtPmNoYW5uZWxzIC0gaGRyX3NpemU7CisKKyAgICAgICAgaWYgKGF2cGt0LT5zaXplICUgYXZjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiUGFja2V0IHdpdGggb2RkIHNpemUsIGlnbm9yaW5nIGxhc3QgYnl0ZVxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2cGt0LT5zaXplIDwgKGhkcl9zaXplICsgMSkgKiBhdmN0eC0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGFja2V0IHNpemUgaXMgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgZXNjLT5maWJfYWNjWzBdID0gYXZwa3QtPmRhdGFbMV0gKyAxMjg7CisgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPT0gMikKKyAgICAgICAgICAgIGVzYy0+ZmliX2FjY1sxXSA9IGF2cGt0LT5kYXRhWzIrY2hhbl9zaXplKzFdICsgMTI4OworCisgICAgICAgIGVzYy0+ZGF0YV9pZHggID0gMDsKKyAgICAgICAgZXNjLT5kYXRhX3NpemUgPSBjaGFuX3NpemU7CisgICAgICAgIGlmICghKGVzYy0+ZGF0YVswXSA9IGF2X21hbGxvYyhjaGFuX3NpemUpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPT0gMikgeworICAgICAgICAgICAgaWYgKCEoZXNjLT5kYXRhWzFdID0gYXZfbWFsbG9jKGNoYW5fc2l6ZSkpKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmVzYy0+ZGF0YVswXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZXNjLT5kYXRhWzBdLCAmYXZwa3QtPmRhdGFbaGRyX3NpemVdLCBjaGFuX3NpemUpOworICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID09IDIpCisgICAgICAgICAgICBtZW1jcHkoZXNjLT5kYXRhWzFdLCAmYXZwa3QtPmRhdGFbMipoZHJfc2l6ZStjaGFuX3NpemVdLCBjaGFuX3NpemUpOworICAgIH0KKyAgICBpZiAoIWVzYy0+ZGF0YVswXSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInVuZXhwZWN0ZWQgZW1wdHkgcGFja2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogZGVjb2RlIG5leHQgcGllY2Ugb2YgZGF0YSBmcm9tIHRoZSBidWZmZXIgKi8KKyAgICBidWZfc2l6ZSA9IEZGTUlOKE1BWF9GUkFNRV9TSVpFLCBlc2MtPmRhdGFfc2l6ZSAtIGVzYy0+ZGF0YV9pZHgpOworICAgIGlmIChidWZfc2l6ZSA8PSAwKSB7CisgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgcmV0dXJuIGF2cGt0LT5zaXplOworICAgIH0KKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBidWZfc2l6ZSAqIDI7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICBkZWx0YV9kZWNvZGUoZnJhbWUtPmRhdGFbY2hdLCAmZXNjLT5kYXRhW2NoXVtlc2MtPmRhdGFfaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplLCAmZXNjLT5maWJfYWNjW2NoXSwgZXNjLT50YWJsZSk7CisgICAgfQorCisgICAgZXNjLT5kYXRhX2lkeCArPSBidWZfc2l6ZTsKKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiAoKGF2Y3R4LT5mcmFtZV9udW1iZXIgPT0gMCkqaGRyX3NpemUgKyBidWZfc2l6ZSkqYXZjdHgtPmNoYW5uZWxzOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZWlnaHRzdnhfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEVpZ2h0U3Z4Q29udGV4dCAqZXNjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPCAxIHx8IGF2Y3R4LT5jaGFubmVscyA+IDIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICI4U1ZYIGRvZXMgbm90IHN1cHBvcnQgbW9yZSB0aGFuIDIgY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlYy0+aWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEXzhTVlhfRklCOiBlc2MtPnRhYmxlID0gZmlib25hY2NpOyAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEXzhTVlhfRVhQOiBlc2MtPnRhYmxlID0gZXhwb25lbnRpYWw7ICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY29kZWMgaWQgJWQuXG4iLCBhdmN0eC0+Y29kZWMtPmlkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9VOFA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGVpZ2h0c3Z4X2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRWlnaHRTdnhDb250ZXh0ICplc2MgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmVzYy0+ZGF0YVswXSk7CisgICAgYXZfZnJlZXAoJmVzYy0+ZGF0YVsxXSk7CisgICAgZXNjLT5kYXRhX3NpemUgPSAwOworICAgIGVzYy0+ZGF0YV9pZHggPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfRUlHSFRTVlhfRklCX0RFQ09ERVIKK0FWQ29kZWMgZmZfZWlnaHRzdnhfZmliX2RlY29kZXIgPSB7CisgIC5uYW1lICAgICAgICAgICA9ICI4c3Z4X2ZpYiIsCisgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCI4U1ZYIGZpYm9uYWNjaSIpLAorICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEXzhTVlhfRklCLAorICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YgKEVpZ2h0U3Z4Q29udGV4dCksCisgIC5pbml0ICAgICAgICAgICA9IGVpZ2h0c3Z4X2RlY29kZV9pbml0LAorICAuZGVjb2RlICAgICAgICAgPSBlaWdodHN2eF9kZWNvZGVfZnJhbWUsCisgIC5jbG9zZSAgICAgICAgICA9IGVpZ2h0c3Z4X2RlY29kZV9jbG9zZSwKKyAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1U4UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CisjZW5kaWYKKyNpZiBDT05GSUdfRUlHSFRTVlhfRVhQX0RFQ09ERVIKK0FWQ29kZWMgZmZfZWlnaHRzdnhfZXhwX2RlY29kZXIgPSB7CisgIC5uYW1lICAgICAgICAgICA9ICI4c3Z4X2V4cCIsCisgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCI4U1ZYIGV4cG9uZW50aWFsIiksCisgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfOFNWWF9FWFAsCisgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZiAoRWlnaHRTdnhDb250ZXh0KSwKKyAgLmluaXQgICAgICAgICAgID0gZWlnaHRzdnhfZGVjb2RlX2luaXQsCisgIC5kZWNvZGUgICAgICAgICA9IGVpZ2h0c3Z4X2RlY29kZV9mcmFtZSwKKyAgLmNsb3NlICAgICAgICAgID0gZWlnaHRzdnhfZGVjb2RlX2Nsb3NlLAorICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfVThQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvTWFrZWZpbGUgYi9mZm1wZWcvbGliYXZjb2RlYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTBmNTNkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvTWFrZWZpbGUKQEAgLTAsMCArMSw5MjggQEAKK2luY2x1ZGUgJChTVUJESVIpLi4vY29uZmlnLm1haworCitOQU1FID0gYXZjb2RlYworCitIRUFERVJTID0gYXZjb2RlYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYXZmZnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZHZfcHJvZmlsZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZHh2YTIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgb2xkX2NvZGVjX2lkcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdmFhcGkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdmRhLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdmRwYXUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdmVyc2lvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdm9yYmlzX3BhcnNlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeHZtYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK09CSlMgPSBhbGxjb2RlY3MubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdWRpb2NvbnZlcnQubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdmRjdC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdnBhY2tldC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdnBpY3R1cmUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBiaXRzdHJlYW0ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBiaXRzdHJlYW1fZmlsdGVyLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBjb2RlY19kZXNjLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBkdl9wcm9maWxlLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBmbXRjb252ZXJ0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBpbWdjb252ZXJ0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBtYXRodGFibGVzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBvcHRpb25zLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBwYXJzZXIubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByYXcubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXNhbXBsZS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXNhbXBsZTIubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB1dGlscy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB2b3JiaXNfcGFyc2VyLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB4aXBoLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworIyBzdWJzeXN0ZW1zCitPQkpTLSQoQ09ORklHX0FBTkRDVFRBQkxFUykgICAgICAgICAgICArPSBhYW5kY3R0YWIubworT0JKUy0kKENPTkZJR19BQzNEU1ApICAgICAgICAgICAgICAgICAgKz0gYWMzZHNwLm8KK09CSlMtJChDT05GSUdfQVVESU9fRlJBTUVfUVVFVUUpICAgICAgICs9IGF1ZGlvX2ZyYW1lX3F1ZXVlLm8KK09CSlMtJChDT05GSUdfQVVESU9EU1ApICAgICAgICAgICAgICAgICs9IGF1ZGlvZHNwLm8KK09CSlMtJChDT05GSUdfQkxPQ0tEU1ApICAgICAgICAgICAgICAgICs9IGJsb2NrZHNwLm8KK09CSlMtJChDT05GSUdfQlNXQVBEU1ApICAgICAgICAgICAgICAgICs9IGJzd2FwZHNwLm8KK09CSlMtJChDT05GSUdfQ0FCQUMpICAgICAgICAgICAgICAgICAgICs9IGNhYmFjLm8KK09CSlMtJChDT05GSUdfQ1JZU1RBTEhEKSAgICAgICAgICAgICAgICs9IGNyeXN0YWxoZC5vCitPQkpTLSQoQ09ORklHX0RDVCkgICAgICAgICAgICAgICAgICAgICArPSBkY3QubyBkY3QzMl9maXhlZC5vIGRjdDMyX2Zsb2F0Lm8KK09CSlMtJChDT05GSUdfRVJST1JfUkVTSUxJRU5DRSkgICAgICAgICs9IGVycm9yX3Jlc2lsaWVuY2UubworT0JKUy0kKENPTkZJR19FWElGKSAgICAgICAgICAgICAgICAgICAgKz0gZXhpZi5vIHRpZmZfY29tbW9uLm8KK09CSlMtJChDT05GSUdfRkFBTkRDVCkgICAgICAgICAgICAgICAgICs9IGZhYW5kY3QubworT0JKUy0kKENPTkZJR19GQUFOSURDVCkgICAgICAgICAgICAgICAgKz0gZmFhbmlkY3QubworT0JKUy0kKENPTkZJR19GRENURFNQKSAgICAgICAgICAgICAgICAgKz0gZmRjdGRzcC5vIGpmZGN0ZnN0Lm8gamZkY3RpbnQubworRkZULU9CSlMtJChDT05GSUdfSEFSRENPREVEX1RBQkxFUykgICAgKz0gY29zX3RhYmxlcy5vIGNvc19maXhlZF90YWJsZXMubworT0JKUy0kKENPTkZJR19GRlQpICAgICAgICAgICAgICAgICAgICAgKz0gYXZmZnQubyBmZnRfZml4ZWQubyBmZnRfZmxvYXQubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZnRfZml4ZWRfMzIubyBmZnRfaW5pdF90YWJsZS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoRkZULU9CSlMteWVzKQorT0JKUy0kKENPTkZJR19HT0xPTUIpICAgICAgICAgICAgICAgICAgKz0gZ29sb21iLm8KK09CSlMtJChDT05GSUdfSDI2M0RTUCkgICAgICAgICAgICAgICAgICs9IGgyNjNkc3AubworT0JKUy0kKENPTkZJR19IMjY0Q0hST01BKSAgICAgICAgICAgICAgKz0gaDI2NGNocm9tYS5vCitPQkpTLSQoQ09ORklHX0gyNjREU1ApICAgICAgICAgICAgICAgICArPSBoMjY0ZHNwLm8gaDI2NGlkY3QubworT0JKUy0kKENPTkZJR19IMjY0UFJFRCkgICAgICAgICAgICAgICAgKz0gaDI2NHByZWQubworT0JKUy0kKENPTkZJR19IMjY0UVBFTCkgICAgICAgICAgICAgICAgKz0gaDI2NHFwZWwubworT0JKUy0kKENPTkZJR19IUEVMRFNQKSAgICAgICAgICAgICAgICAgKz0gaHBlbGRzcC5vCitPQkpTLSQoQ09ORklHX0hVRkZNQU4pICAgICAgICAgICAgICAgICArPSBodWZmbWFuLm8KK09CSlMtJChDT05GSUdfSFVGRllVVkRTUCkgICAgICAgICAgICAgICs9IGh1ZmZ5dXZkc3AubworT0JKUy0kKENPTkZJR19IVUZGWVVWRU5DRFNQKSAgICAgICAgICAgKz0gaHVmZnl1dmVuY2RzcC5vCitPQkpTLSQoQ09ORklHX0lEQ1REU1ApICAgICAgICAgICAgICAgICArPSBpZGN0ZHNwLm8gc2ltcGxlX2lkY3QubyBqcmV2ZGN0Lm8KK09CSlMtJChDT05GSUdfSUlSRklMVEVSKSAgICAgICAgICAgICAgICs9IGlpcmZpbHRlci5vCitPQkpTLSQoQ09ORklHX0lOVFJBWDgpICAgICAgICAgICAgICAgICArPSBpbnRyYXg4Lm8gaW50cmF4OGRzcC5vCitPQkpTLSQoQ09ORklHX0xJQlhWSUQpICAgICAgICAgICAgICAgICArPSBsaWJ4dmlkX3JjLm8KK09CSlMtJChDT05GSUdfTExBVUREU1ApICAgICAgICAgICAgICAgICs9IGxvc3NsZXNzX2F1ZGlvZHNwLm8KK09CSlMtJChDT05GSUdfTExWSUREU1ApICAgICAgICAgICAgICAgICs9IGxvc3NsZXNzX3ZpZGVvZHNwLm8KK09CSlMtJChDT05GSUdfTFBDKSAgICAgICAgICAgICAgICAgICAgICs9IGxwYy5vCitPQkpTLSQoQ09ORklHX0xTUCkgICAgICAgICAgICAgICAgICAgICArPSBsc3AubworT0JKUy0kKENPTkZJR19NRENUKSAgICAgICAgICAgICAgICAgICAgKz0gbWRjdF9maXhlZC5vIG1kY3RfZmxvYXQubyBtZGN0X2ZpeGVkXzMyLm8KK09CSlMtJChDT05GSUdfTUVfQ01QKSAgICAgICAgICAgICAgICAgICs9IG1lX2NtcC5vCitPQkpTLSQoQ09ORklHX01QRUdfRVIpICAgICAgICAgICAgICAgICArPSBtcGVnX2VyLm8KK09CSlMtJChDT05GSUdfTVBFR0FVRElPKSAgICAgICAgICAgICAgICs9IG1wZWdhdWRpby5vIG1wZWdhdWRpb2RhdGEubyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWdhdWRpb2RlY2hlYWRlci5vCitPQkpTLSQoQ09ORklHX01QRUdBVURJT0RTUCkgICAgICAgICAgICArPSBtcGVnYXVkaW9kc3AubyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnYXVkaW9kc3BfZGF0YS5vICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnYXVkaW9kc3BfZml4ZWQubyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnYXVkaW9kc3BfZmxvYXQubworT0JKUy0kKENPTkZJR19NUEVHVklERU8pICAgICAgICAgICAgICAgKz0gbXBlZ3ZpZGVvLm8gbXBlZ3ZpZGVvZHNwLm8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZ3ZpZGVvX21vdGlvbi5vIG1wZWd1dGlscy5vCitPQkpTLSQoQ09ORklHX01QRUdWSURFT0VOQykgICAgICAgICAgICArPSBtcGVndmlkZW9fZW5jLm8gbXBlZzEyZGF0YS5vICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25fZXN0Lm8gcmF0ZWNvbnRyb2wubyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVndmlkZW9lbmNkc3AubworT0JKUy0kKENPTkZJR19QSVhCTE9DS0RTUCkgICAgICAgICAgICAgKz0gcGl4YmxvY2tkc3AubworT0JKUy0kKENPTkZJR19RUEVMRFNQKSAgICAgICAgICAgICAgICAgKz0gcXBlbGRzcC5vCitPQkpTLSQoQ09ORklHX1JBTkdFQ09ERVIpICAgICAgICAgICAgICArPSByYW5nZWNvZGVyLm8KK1JERlQtT0JKUy0kKENPTkZJR19IQVJEQ09ERURfVEFCTEVTKSAgICs9IHNpbl90YWJsZXMubworT0JKUy0kKENPTkZJR19SREZUKSAgICAgICAgICAgICAgICAgICAgKz0gcmRmdC5vICQoUkRGVC1PQkpTLXllcykKK09CSlMtJChDT05GSUdfU0hBUkVEKSAgICAgICAgICAgICAgICAgICs9IGxvZzJfdGFiLm8KK09CSlMtJChDT05GSUdfU0lORVdJTikgICAgICAgICAgICAgICAgICs9IHNpbmV3aW4ubworT0JKUy0kKENPTkZJR19TVEFSVENPREUpICAgICAgICAgICAgICAgKz0gc3RhcnRjb2RlLm8KK09CSlMtJChDT05GSUdfVFBFTERTUCkgICAgICAgICAgICAgICAgICs9IHRwZWxkc3AubworT0JKUy0kKENPTkZJR19WSURFT0RTUCkgICAgICAgICAgICAgICAgKz0gdmlkZW9kc3AubworT0JKUy0kKENPTkZJR19WUDNEU1ApICAgICAgICAgICAgICAgICAgKz0gdnAzZHNwLm8KK09CSlMtJChDT05GSUdfV01BX0ZSRVFTKSAgICAgICAgICAgICAgICs9IHdtYV9mcmVxcy5vCisKKyMgZGVjb2RlcnMvZW5jb2RlcnMKK09CSlMtJChDT05GSUdfWkVSTzEyVl9ERUNPREVSKSAgICAgICAgICs9IDAxMnYubworT0JKUy0kKENPTkZJR19BNjRNVUxUSV9FTkNPREVSKSAgICAgICAgKz0gYTY0bXVsdGllbmMubyBlbGJnLm8KK09CSlMtJChDT05GSUdfQTY0TVVMVEk1X0VOQ09ERVIpICAgICAgICs9IGE2NG11bHRpZW5jLm8gZWxiZy5vCitPQkpTLSQoQ09ORklHX0FBQ19ERUNPREVSKSAgICAgICAgICAgICArPSBhYWNkZWMubyBhYWN0YWIubyBhYWNzYnIubyBhYWNwcy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhY2FkdHNkZWMubyBtcGVnNGF1ZGlvLm8ga2Jkd2luLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyZHNwLm8gYWFjcHNkc3AubworT0JKUy0kKENPTkZJR19BQUNfRU5DT0RFUikgICAgICAgICAgICAgKz0gYWFjZW5jLm8gYWFjY29kZXIubyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYWNwc3kubyBhYWN0YWIubyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeW1vZGVsLm8gbXBlZzRhdWRpby5vIGtiZHdpbi5vCitPQkpTLSQoQ09ORklHX0FBU0NfREVDT0RFUikgICAgICAgICAgICArPSBhYXNjLm8gbXNybGVkZWMubworT0JKUy0kKENPTkZJR19BQzNfREVDT0RFUikgICAgICAgICAgICAgKz0gYWMzZGVjX2Zsb2F0Lm8gYWMzZGVjX2RhdGEubyBhYzMubyBrYmR3aW4ubworT0JKUy0kKENPTkZJR19BQzNfRklYRURfREVDT0RFUikgICAgICAgKz0gYWMzZGVjX2ZpeGVkLm8gYWMzZGVjX2RhdGEubyBhYzMubyBrYmR3aW4ubworT0JKUy0kKENPTkZJR19BQzNfRU5DT0RFUikgICAgICAgICAgICAgKz0gYWMzZW5jX2Zsb2F0Lm8gYWMzZW5jLm8gYWMzdGFiLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWMzLm8ga2Jkd2luLm8KK09CSlMtJChDT05GSUdfQUMzX0ZJWEVEX0VOQ09ERVIpICAgICAgICs9IGFjM2VuY19maXhlZC5vIGFjM2VuYy5vIGFjM3RhYi5vIGFjMy5vCitPQkpTLSQoQ09ORklHX0FJQ19ERUNPREVSKSAgICAgICAgICAgICArPSBhaWMubworT0JKUy0kKENPTkZJR19BTEFDX0RFQ09ERVIpICAgICAgICAgICAgKz0gYWxhYy5vIGFsYWNfZGF0YS5vCitPQkpTLSQoQ09ORklHX0FMQUNfRU5DT0RFUikgICAgICAgICAgICArPSBhbGFjZW5jLm8gYWxhY19kYXRhLm8KK09CSlMtJChDT05GSUdfQUxJQVNfUElYX0RFQ09ERVIpICAgICAgICs9IGFsaWFzcGl4ZGVjLm8KK09CSlMtJChDT05GSUdfQUxJQVNfUElYX0VOQ09ERVIpICAgICAgICs9IGFsaWFzcGl4ZW5jLm8KK09CSlMtJChDT05GSUdfQUxTX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFsc2RlYy5vIGJnbWMubyBtcGVnNGF1ZGlvLm8KK09CSlMtJChDT05GSUdfQU1STkJfREVDT0RFUikgICAgICAgICAgICs9IGFtcm5iZGVjLm8gY2VscF9maWx0ZXJzLm8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxwX21hdGgubyBhY2VscF9maWx0ZXJzLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNlbHBfdmVjdG9ycy5vICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjZWxwX3BpdGNoX2RlbGF5Lm8KK09CSlMtJChDT05GSUdfQU1SV0JfREVDT0RFUikgICAgICAgICAgICs9IGFtcndiZGVjLm8gY2VscF9maWx0ZXJzLm8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxwX21hdGgubyBhY2VscF9maWx0ZXJzLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNlbHBfdmVjdG9ycy5vICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjZWxwX3BpdGNoX2RlbGF5Lm8KK09CSlMtJChDT05GSUdfQU1WX0VOQ09ERVIpICAgICAgICAgICAgICs9IG1qcGVnZW5jLm8gbWpwZWcubyBtanBlZ2VuY19jb21tb24ubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVndmlkZW9fZW5jLm8gbW90aW9uX2VzdC5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGVjb250cm9sLm8gbXBlZzEyZGF0YS5vICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZ3ZpZGVvLm8KK09CSlMtJChDT05GSUdfQU5NX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFubS5vCitPQkpTLSQoQ09ORklHX0FOU0lfREVDT0RFUikgICAgICAgICAgICArPSBhbnNpLm8gY2dhX2RhdGEubworT0JKUy0kKENPTkZJR19BUEVfREVDT0RFUikgICAgICAgICAgICAgKz0gYXBlZGVjLm8KK09CSlMtJChDT05GSUdfQVBOR19ERUNPREVSKSAgICAgICAgICAgICs9IHBuZy5vIHBuZ2RlYy5vIHBuZ2RzcC5vCitPQkpTLSQoQ09ORklHX1NTQV9ERUNPREVSKSAgICAgICAgICAgICArPSBhc3NkZWMubyBhc3MubyBhc3Nfc3BsaXQubworT0JKUy0kKENPTkZJR19TU0FfRU5DT0RFUikgICAgICAgICAgICAgKz0gYXNzZW5jLm8gYXNzLm8KK09CSlMtJChDT05GSUdfQVNTX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFzc2RlYy5vIGFzcy5vIGFzc19zcGxpdC5vCitPQkpTLSQoQ09ORklHX0FTU19FTkNPREVSKSAgICAgICAgICAgICArPSBhc3NlbmMubyBhc3MubworT0JKUy0kKENPTkZJR19BU1YxX0RFQ09ERVIpICAgICAgICAgICAgKz0gYXN2ZGVjLm8gYXN2Lm8gbXBlZzEyZGF0YS5vCitPQkpTLSQoQ09ORklHX0FTVjFfRU5DT0RFUikgICAgICAgICAgICArPSBhc3ZlbmMubyBhc3YubyBtcGVnMTJkYXRhLm8KK09CSlMtJChDT05GSUdfQVNWMl9ERUNPREVSKSAgICAgICAgICAgICs9IGFzdmRlYy5vIGFzdi5vIG1wZWcxMmRhdGEubworT0JKUy0kKENPTkZJR19BU1YyX0VOQ09ERVIpICAgICAgICAgICAgKz0gYXN2ZW5jLm8gYXN2Lm8gbXBlZzEyZGF0YS5vCitPQkpTLSQoQ09ORklHX0FUUkFDMV9ERUNPREVSKSAgICAgICAgICArPSBhdHJhYzEubyBhdHJhYy5vCitPQkpTLSQoQ09ORklHX0FUUkFDM19ERUNPREVSKSAgICAgICAgICArPSBhdHJhYzMubyBhdHJhYy5vCitPQkpTLSQoQ09ORklHX0FUUkFDM1BfREVDT0RFUikgICAgICAgICArPSBhdHJhYzNwbHVzZGVjLm8gYXRyYWMzcGx1cy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0cmFjM3BsdXNkc3AubyBhdHJhYy5vCitPQkpTLSQoQ09ORklHX0FVUkFfREVDT0RFUikgICAgICAgICAgICArPSBjeXV2Lm8KK09CSlMtJChDT05GSUdfQVVSQTJfREVDT0RFUikgICAgICAgICAgICs9IGF1cmEubworT0JKUy0kKENPTkZJR19BVlJOX0RFQ09ERVIpICAgICAgICAgICAgKz0gYXZybmRlYy5vIG1qcGVnZGVjLm8gbWpwZWcubworT0JKUy0kKENPTkZJR19BVlJQX0RFQ09ERVIpICAgICAgICAgICAgKz0gcjIxMGRlYy5vCitPQkpTLSQoQ09ORklHX0FWUlBfRU5DT0RFUikgICAgICAgICAgICArPSByMjEwZW5jLm8KK09CSlMtJChDT05GSUdfQVZTX0RFQ09ERVIpICAgICAgICAgICAgICs9IGF2cy5vCitPQkpTLSQoQ09ORklHX0FWVUlfREVDT0RFUikgICAgICAgICAgICArPSBhdnVpZGVjLm8KK09CSlMtJChDT05GSUdfQVZVSV9FTkNPREVSKSAgICAgICAgICAgICs9IGF2dWllbmMubworT0JKUy0kKENPTkZJR19BWVVWX0RFQ09ERVIpICAgICAgICAgICAgKz0gdjQwOGRlYy5vCitPQkpTLSQoQ09ORklHX0FZVVZfRU5DT0RFUikgICAgICAgICAgICArPSB2NDA4ZW5jLm8KK09CSlMtJChDT05GSUdfQkVUSFNPRlRWSURfREVDT0RFUikgICAgICs9IGJldGhzb2Z0dmlkZW8ubworT0JKUy0kKENPTkZJR19CRklfREVDT0RFUikgICAgICAgICAgICAgKz0gYmZpLm8KK09CSlMtJChDT05GSUdfQklOS19ERUNPREVSKSAgICAgICAgICAgICs9IGJpbmsubyBiaW5rZHNwLm8KK09CSlMtJChDT05GSUdfQklOS0FVRElPX0RDVF9ERUNPREVSKSAgICs9IGJpbmthdWRpby5vCitPQkpTLSQoQ09ORklHX0JJTktBVURJT19SREZUX0RFQ09ERVIpICArPSBiaW5rYXVkaW8ubworT0JKUy0kKENPTkZJR19CSU5URVhUX0RFQ09ERVIpICAgICAgICAgKz0gYmludGV4dC5vIGNnYV9kYXRhLm8KK09CSlMtJChDT05GSUdfQk1QX0RFQ09ERVIpICAgICAgICAgICAgICs9IGJtcC5vIG1zcmxlZGVjLm8KK09CSlMtJChDT05GSUdfQk1QX0VOQ09ERVIpICAgICAgICAgICAgICs9IGJtcGVuYy5vCitPQkpTLSQoQ09ORklHX0JNVl9BVURJT19ERUNPREVSKSAgICAgICArPSBibXZhdWRpby5vCitPQkpTLSQoQ09ORklHX0JNVl9WSURFT19ERUNPREVSKSAgICAgICArPSBibXZ2aWRlby5vCitPQkpTLSQoQ09ORklHX0JSRU5ERVJfUElYX0RFQ09ERVIpICAgICArPSBicmVuZGVycGl4Lm8KK09CSlMtJChDT05GSUdfQzkzX0RFQ09ERVIpICAgICAgICAgICAgICs9IGM5My5vCitPQkpTLSQoQ09ORklHX0NBVlNfREVDT0RFUikgICAgICAgICAgICArPSBjYXZzLm8gY2F2c2RlYy5vIGNhdnNkc3AubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXZzZGF0YS5vIG1wZWcxMmRhdGEubworT0JKUy0kKENPTkZJR19DREdSQVBISUNTX0RFQ09ERVIpICAgICAgKz0gY2RncmFwaGljcy5vCitPQkpTLSQoQ09ORklHX0NEWExfREVDT0RFUikgICAgICAgICAgICArPSBjZHhsLm8KK09CSlMtJChDT05GSUdfQ0lORVBBS19ERUNPREVSKSAgICAgICAgICs9IGNpbmVwYWsubworT0JKUy0kKENPTkZJR19DSU5FUEFLX0VOQ09ERVIpICAgICAgICAgKz0gY2luZXBha2VuYy5vIGVsYmcubworT0JKUy0kKENPTkZJR19DTEpSX0RFQ09ERVIpICAgICAgICAgICAgKz0gY2xqcmRlYy5vCitPQkpTLSQoQ09ORklHX0NMSlJfRU5DT0RFUikgICAgICAgICAgICArPSBjbGpyZW5jLm8KK09CSlMtJChDT05GSUdfQ0xMQ19ERUNPREVSKSAgICAgICAgICAgICs9IGNsbGMubworT0JKUy0kKENPTkZJR19DT09LX0RFQ09ERVIpICAgICAgICAgICAgKz0gY29vay5vCitPQkpTLSQoQ09ORklHX0NPTUZPUlROT0lTRV9ERUNPREVSKSAgICArPSBjbmdkZWMubyBjZWxwX2ZpbHRlcnMubworT0JKUy0kKENPTkZJR19DT01GT1JUTk9JU0VfRU5DT0RFUikgICAgKz0gY25nZW5jLm8KK09CSlMtJChDT05GSUdfQ1BJQV9ERUNPREVSKSAgICAgICAgICAgICs9IGNwaWEubworT0JKUy0kKENPTkZJR19DU0NEX0RFQ09ERVIpICAgICAgICAgICAgKz0gY3NjZC5vCitPQkpTLSQoQ09ORklHX0NZVVZfREVDT0RFUikgICAgICAgICAgICArPSBjeXV2Lm8KK09CSlMtJChDT05GSUdfRENBX0RFQ09ERVIpICAgICAgICAgICAgICs9IGRjYWRlYy5vIGRjYS5vIGRjYWRzcC5vICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGhfZmlsdGVyLm8KK09CSlMtJChDT05GSUdfRENBX0VOQ09ERVIpICAgICAgICAgICAgICs9IGRjYWVuYy5vIGRjYS5vCitPQkpTLSQoQ09ORklHX0RJUkFDX0RFQ09ERVIpICAgICAgICAgICArPSBkaXJhY2RlYy5vIGRpcmFjLm8gZGlyYWNkc3AubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJhY19hcml0aC5vIG1wZWcxMmRhdGEubyBkaXJhY19kd3QubworT0JKUy0kKENPTkZJR19ERkFfREVDT0RFUikgICAgICAgICAgICAgKz0gZGZhLm8KK09CSlMtJChDT05GSUdfRE5YSERfREVDT0RFUikgICAgICAgICAgICs9IGRueGhkZGVjLm8gZG54aGRkYXRhLm8KK09CSlMtJChDT05GSUdfRE5YSERfRU5DT0RFUikgICAgICAgICAgICs9IGRueGhkZW5jLm8gZG54aGRkYXRhLm8KK09CSlMtJChDT05GSUdfRFBYX0RFQ09ERVIpICAgICAgICAgICAgICs9IGRweC5vCitPQkpTLSQoQ09ORklHX0RQWF9FTkNPREVSKSAgICAgICAgICAgICArPSBkcHhlbmMubworT0JKUy0kKENPTkZJR19EU0RfTFNCRl9ERUNPREVSKSAgICAgICAgKz0gZHNkZGVjLm8KK09CSlMtJChDT05GSUdfRFNEX01TQkZfREVDT0RFUikgICAgICAgICs9IGRzZGRlYy5vCitPQkpTLSQoQ09ORklHX0RTRF9MU0JGX1BMQU5BUl9ERUNPREVSKSArPSBkc2RkZWMubworT0JKUy0kKENPTkZJR19EU0RfTVNCRl9QTEFOQVJfREVDT0RFUikgKz0gZHNkZGVjLm8KK09CSlMtJChDT05GSUdfRFNJQ0lOQVVESU9fREVDT0RFUikgICAgICs9IGRzaWNpbmF1ZGlvLm8KK09CSlMtJChDT05GSUdfRFNJQ0lOVklERU9fREVDT0RFUikgICAgICs9IGRzaWNpbnZpZGVvLm8KK09CSlMtJChDT05GSUdfRFZCU1VCX0RFQ09ERVIpICAgICAgICAgICs9IGR2YnN1YmRlYy5vCitPQkpTLSQoQ09ORklHX0RWQlNVQl9FTkNPREVSKSAgICAgICAgICArPSBkdmJzdWIubworT0JKUy0kKENPTkZJR19EVkRTVUJfREVDT0RFUikgICAgICAgICAgKz0gZHZkc3ViZGVjLm8KK09CSlMtJChDT05GSUdfRFZEU1VCX0VOQ09ERVIpICAgICAgICAgICs9IGR2ZHN1YmVuYy5vCitPQkpTLSQoQ09ORklHX0RWVklERU9fREVDT0RFUikgICAgICAgICArPSBkdmRlYy5vIGR2Lm8gZHZkYXRhLm8KK09CSlMtJChDT05GSUdfRFZWSURFT19FTkNPREVSKSAgICAgICAgICs9IGR2ZW5jLm8gZHYubyBkdmRhdGEubworT0JKUy0kKENPTkZJR19EWEFfREVDT0RFUikgICAgICAgICAgICAgKz0gZHhhLm8KK09CSlMtJChDT05GSUdfRFhUT1JZX0RFQ09ERVIpICAgICAgICAgICs9IGR4dG9yeS5vCitPQkpTLSQoQ09ORklHX0VBQzNfREVDT0RFUikgICAgICAgICAgICArPSBlYWMzZGVjLm8gZWFjM19kYXRhLm8KK09CSlMtJChDT05GSUdfRUFDM19FTkNPREVSKSAgICAgICAgICAgICs9IGVhYzNlbmMubyBlYWMzX2RhdGEubworT0JKUy0kKENPTkZJR19FQUNNVl9ERUNPREVSKSAgICAgICAgICAgKz0gZWFjbXYubworT0JKUy0kKENPTkZJR19FQU1BRF9ERUNPREVSKSAgICAgICAgICAgKz0gZWFtYWQubyBlYWlkY3QubyBtcGVnMTIubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMTJkYXRhLm8KK09CSlMtJChDT05GSUdfRUFUR1FfREVDT0RFUikgICAgICAgICAgICs9IGVhdGdxLm8gZWFpZGN0Lm8KK09CSlMtJChDT05GSUdfRUFUR1ZfREVDT0RFUikgICAgICAgICAgICs9IGVhdGd2Lm8KK09CSlMtJChDT05GSUdfRUFUUUlfREVDT0RFUikgICAgICAgICAgICs9IGVhdHFpLm8gZWFpZGN0Lm8KK09CSlMtJChDT05GSUdfRUlHSFRCUFNfREVDT0RFUikgICAgICAgICs9IDhicHMubworT0JKUy0kKENPTkZJR19FSUdIVFNWWF9FWFBfREVDT0RFUikgICAgKz0gOHN2eC5vCitPQkpTLSQoQ09ORklHX0VJR0hUU1ZYX0ZJQl9ERUNPREVSKSAgICArPSA4c3Z4Lm8KK09CSlMtJChDT05GSUdfRVNDQVBFMTI0X0RFQ09ERVIpICAgICAgICs9IGVzY2FwZTEyNC5vCitPQkpTLSQoQ09ORklHX0VTQ0FQRTEzMF9ERUNPREVSKSAgICAgICArPSBlc2NhcGUxMzAubworT0JKUy0kKENPTkZJR19FVlJDX0RFQ09ERVIpICAgICAgICAgICAgKz0gZXZyY2RlYy5vIGFjZWxwX3ZlY3RvcnMubyBsc3AubworT0JKUy0kKENPTkZJR19FWFJfREVDT0RFUikgICAgICAgICAgICAgKz0gZXhyLm8KK09CSlMtJChDT05GSUdfRkZWMV9ERUNPREVSKSAgICAgICAgICAgICs9IGZmdjFkZWMubyBmZnYxLm8KK09CSlMtJChDT05GSUdfRkZWMV9FTkNPREVSKSAgICAgICAgICAgICs9IGZmdjFlbmMubyBmZnYxLm8KK09CSlMtJChDT05GSUdfRkZXQVZFU1lOVEhfREVDT0RFUikgICAgICs9IGZmd2F2ZXN5bnRoLm8KK09CSlMtJChDT05GSUdfRklDX0RFQ09ERVIpICAgICAgICAgICAgICs9IGZpYy5vCitPQkpTLSQoQ09ORklHX0ZMQUNfREVDT0RFUikgICAgICAgICAgICArPSBmbGFjZGVjLm8gZmxhY2RhdGEubyBmbGFjLm8gZmxhY2RzcC5vCitPQkpTLSQoQ09ORklHX0ZMQUNfRU5DT0RFUikgICAgICAgICAgICArPSBmbGFjZW5jLm8gZmxhY2RhdGEubyBmbGFjLm8gZmxhY2RzcC5vIHZvcmJpc19kYXRhLm8KK09CSlMtJChDT05GSUdfRkxBU0hTVl9ERUNPREVSKSAgICAgICAgICs9IGZsYXNoc3YubworT0JKUy0kKENPTkZJR19GTEFTSFNWX0VOQ09ERVIpICAgICAgICAgKz0gZmxhc2hzdmVuYy5vCitPQkpTLSQoQ09ORklHX0ZMQVNIU1YyX0VOQ09ERVIpICAgICAgICArPSBmbGFzaHN2MmVuYy5vCitPQkpTLSQoQ09ORklHX0ZMQVNIU1YyX0RFQ09ERVIpICAgICAgICArPSBmbGFzaHN2Lm8KK09CSlMtJChDT05GSUdfRkxJQ19ERUNPREVSKSAgICAgICAgICAgICs9IGZsaWN2aWRlby5vCitPQkpTLSQoQ09ORklHX0ZPVVJYTV9ERUNPREVSKSAgICAgICAgICArPSA0eG0ubworT0JKUy0kKENPTkZJR19GUkFQU19ERUNPREVSKSAgICAgICAgICAgKz0gZnJhcHMubworT0JKUy0kKENPTkZJR19GUldVX0RFQ09ERVIpICAgICAgICAgICAgKz0gZnJ3dS5vCitPQkpTLSQoQ09ORklHX0cyTV9ERUNPREVSKSAgICAgICAgICAgICArPSBnMm1lZXQubyBtanBlZy5vCitPQkpTLSQoQ09ORklHX0c3MjNfMV9ERUNPREVSKSAgICAgICAgICArPSBnNzIzXzEubyBhY2VscF92ZWN0b3JzLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VscF9maWx0ZXJzLm8gY2VscF9tYXRoLm8KK09CSlMtJChDT05GSUdfRzcyM18xX0VOQ09ERVIpICAgICAgICAgICs9IGc3MjNfMS5vIGFjZWxwX3ZlY3RvcnMubyBjZWxwX21hdGgubworT0JKUy0kKENPTkZJR19HNzI5X0RFQ09ERVIpICAgICAgICAgICAgKz0gZzcyOWRlYy5vIGxzcC5vIGNlbHBfbWF0aC5vIGFjZWxwX2ZpbHRlcnMubyBhY2VscF9waXRjaF9kZWxheS5vIGFjZWxwX3ZlY3RvcnMubyBnNzI5cG9zdGZpbHRlci5vCitPQkpTLSQoQ09ORklHX0dJRl9ERUNPREVSKSAgICAgICAgICAgICArPSBnaWZkZWMubyBsencubworT0JKUy0kKENPTkZJR19HSUZfRU5DT0RFUikgICAgICAgICAgICAgKz0gZ2lmLm8gbHp3ZW5jLm8KK09CSlMtJChDT05GSUdfR1NNX0RFQ09ERVIpICAgICAgICAgICAgICs9IGdzbWRlYy5vIGdzbWRlY19kYXRhLm8gbXNnc21kZWMubworT0JKUy0kKENPTkZJR19HU01fTVNfREVDT0RFUikgICAgICAgICAgKz0gZ3NtZGVjLm8gZ3NtZGVjX2RhdGEubyBtc2dzbWRlYy5vCitPQkpTLSQoQ09ORklHX0gyNjFfREVDT0RFUikgICAgICAgICAgICArPSBoMjYxZGVjLm8gaDI2MWRhdGEubyBoMjYxLm8KK09CSlMtJChDT05GSUdfSDI2MV9FTkNPREVSKSAgICAgICAgICAgICs9IGgyNjFlbmMubyBoMjYxZGF0YS5vIGgyNjEubworT0JKUy0kKENPTkZJR19IMjYzX0RFQ09ERVIpICAgICAgICAgICAgKz0gaDI2M2RlYy5vIGgyNjMubyBpdHVoMjYzZGVjLm8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWc0dmlkZW8ubyBtcGVnNHZpZGVvZGVjLm8gZmx2ZGVjLm9cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbGgyNjNkZWMubworT0JKUy0kKENPTkZJR19IMjYzX0VOQ09ERVIpICAgICAgICAgICAgKz0gbXBlZzR2aWRlb2VuYy5vIG1wZWc0dmlkZW8ubyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2My5vIGl0dWgyNjNlbmMubyBmbHZlbmMubworT0JKUy0kKENPTkZJR19IMjY0X0RFQ09ERVIpICAgICAgICAgICAgKz0gaDI2NC5vIGgyNjRfY2FiYWMubyBoMjY0X2NhdmxjLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF9kaXJlY3QubyBoMjY0X2xvb3BmaWx0ZXIubyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF9tYi5vIGgyNjRfcGljdHVyZS5vIGgyNjRfcHMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0X3JlZnMubyBoMjY0X3NlaS5vIGgyNjRfc2xpY2UubworT0JKUy0kKENPTkZJR19IMjY0X1ZEQV9ERUNPREVSKSAgICAgICAgKz0gdmRhX2gyNjRfZGVjLm8KK09CSlMtJChDT05GSUdfSEVWQ19ERUNPREVSKSAgICAgICAgICAgICs9IGhldmMubyBoZXZjX212cy5vIGhldmNfcHMubyBoZXZjX3NlaS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhldmNfY2FiYWMubyBoZXZjX3JlZnMubyBoZXZjcHJlZC5vICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhldmNkc3AubyBoZXZjX2ZpbHRlci5vCitPQkpTLSQoQ09ORklHX0hOTTRfVklERU9fREVDT0RFUikgICAgICArPSBobm00dmlkZW8ubworT0JKUy0kKENPTkZJR19IVUZGWVVWX0RFQ09ERVIpICAgICAgICAgKz0gaHVmZnl1di5vIGh1ZmZ5dXZkZWMubworT0JKUy0kKENPTkZJR19IVUZGWVVWX0VOQ09ERVIpICAgICAgICAgKz0gaHVmZnl1di5vIGh1ZmZ5dXZlbmMubworT0JKUy0kKENPTkZJR19JRENJTl9ERUNPREVSKSAgICAgICAgICAgKz0gaWRjaW52aWRlby5vCitPQkpTLSQoQ09ORklHX0lERl9ERUNPREVSKSAgICAgICAgICAgICArPSBiaW50ZXh0Lm8gY2dhX2RhdGEubworT0JKUy0kKENPTkZJR19JRkZfQllURVJVTjFfREVDT0RFUikgICAgKz0gaWZmLm8KK09CSlMtJChDT05GSUdfSUZGX0lMQk1fREVDT0RFUikgICAgICAgICs9IGlmZi5vCitPQkpTLSQoQ09ORklHX0lNQ19ERUNPREVSKSAgICAgICAgICAgICArPSBpbWMubworT0JKUy0kKENPTkZJR19JTkRFTzJfREVDT0RFUikgICAgICAgICAgKz0gaW5kZW8yLm8KK09CSlMtJChDT05GSUdfSU5ERU8zX0RFQ09ERVIpICAgICAgICAgICs9IGluZGVvMy5vCitPQkpTLSQoQ09ORklHX0lOREVPNF9ERUNPREVSKSAgICAgICAgICArPSBpbmRlbzQubyBpdmlfY29tbW9uLm8gaXZpX2RzcC5vCitPQkpTLSQoQ09ORklHX0lOREVPNV9ERUNPREVSKSAgICAgICAgICArPSBpbmRlbzUubyBpdmlfY29tbW9uLm8gaXZpX2RzcC5vCitPQkpTLSQoQ09ORklHX0lOVEVSUExBWV9EUENNX0RFQ09ERVIpICArPSBkcGNtLm8KK09CSlMtJChDT05GSUdfSU5URVJQTEFZX1ZJREVPX0RFQ09ERVIpICs9IGludGVycGxheXZpZGVvLm8KK09CSlMtJChDT05GSUdfSkFDT1NVQl9ERUNPREVSKSAgICAgICAgICs9IGphY29zdWJkZWMubyBhc3MubworT0JKUy0kKENPTkZJR19KUEVHMjAwMF9FTkNPREVSKSAgICAgICAgKz0gajJrZW5jLm8gbXFjZW5jLm8gbXFjLm8ganBlZzIwMDAubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnMjAwMGR3dC5vCitPQkpTLSQoQ09ORklHX0pQRUcyMDAwX0RFQ09ERVIpICAgICAgICArPSBqcGVnMjAwMGRlYy5vIGpwZWcyMDAwLm8ganBlZzIwMDBkc3AubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnMjAwMGR3dC5vIG1xY2RlYy5vIG1xYy5vCitPQkpTLSQoQ09ORklHX0pQRUdMU19ERUNPREVSKSAgICAgICAgICArPSBqcGVnbHNkZWMubyBqcGVnbHMubworT0JKUy0kKENPTkZJR19KUEVHTFNfRU5DT0RFUikgICAgICAgICAgKz0ganBlZ2xzZW5jLm8ganBlZ2xzLm8KK09CSlMtJChDT05GSUdfSlZfREVDT0RFUikgICAgICAgICAgICAgICs9IGp2ZGVjLm8KK09CSlMtJChDT05GSUdfS0dWMV9ERUNPREVSKSAgICAgICAgICAgICs9IGtndjFkZWMubworT0JKUy0kKENPTkZJR19LTVZDX0RFQ09ERVIpICAgICAgICAgICAgKz0ga212Yy5vCitPQkpTLSQoQ09ORklHX0xBR0FSSVRIX0RFQ09ERVIpICAgICAgICArPSBsYWdhcml0aC5vIGxhZ2FyaXRocmFjLm8KK09CSlMtJChDT05GSUdfTEpQRUdfRU5DT0RFUikgICAgICAgICAgICs9IGxqcGVnZW5jLm8gbWpwZWcubyBtanBlZ2VuY19jb21tb24ubworT0JKUy0kKENPTkZJR19MT0NPX0RFQ09ERVIpICAgICAgICAgICAgKz0gbG9jby5vCitPQkpTLSQoQ09ORklHX01BQ0UzX0RFQ09ERVIpICAgICAgICAgICArPSBtYWNlLm8KK09CSlMtJChDT05GSUdfTUFDRTZfREVDT0RFUikgICAgICAgICAgICs9IG1hY2UubworT0JKUy0kKENPTkZJR19NREVDX0RFQ09ERVIpICAgICAgICAgICAgKz0gbWRlYy5vIG1wZWcxMi5vIG1wZWcxMmRhdGEubworT0JKUy0kKENPTkZJR19NRVRBU09VTkRfREVDT0RFUikgICAgICAgKz0gbWV0YXNvdW5kLm8gbWV0YXNvdW5kX2RhdGEubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d2ludnEubworT0JKUy0kKENPTkZJR19NSUNST0RWRF9ERUNPREVSKSAgICAgICAgKz0gbWljcm9kdmRkZWMubyBhc3MubworT0JKUy0kKENPTkZJR19NSU1JQ19ERUNPREVSKSAgICAgICAgICAgKz0gbWltaWMubworT0JKUy0kKENPTkZJR19NSlBFR19ERUNPREVSKSAgICAgICAgICAgKz0gbWpwZWdkZWMubyBtanBlZy5vCitPQkpTLSQoQ09ORklHX01KUEVHX0VOQ09ERVIpICAgICAgICAgICArPSBtanBlZ2VuYy5vIG1qcGVnLm8gbWpwZWdlbmNfY29tbW9uLm8KK09CSlMtJChDT05GSUdfTUpQRUdCX0RFQ09ERVIpICAgICAgICAgICs9IG1qcGVnYmRlYy5vCitPQkpTLSQoQ09ORklHX01MUF9ERUNPREVSKSAgICAgICAgICAgICArPSBtbHBkZWMubyBtbHBkc3AubworT0JKUy0kKENPTkZJR19NTVZJREVPX0RFQ09ERVIpICAgICAgICAgKz0gbW12aWRlby5vCitPQkpTLSQoQ09ORklHX01PVElPTlBJWEVMU19ERUNPREVSKSAgICArPSBtb3Rpb25waXhlbHMubworT0JKUy0kKENPTkZJR19NT1ZURVhUX0RFQ09ERVIpICAgICAgICAgKz0gbW92dGV4dGRlYy5vIGFzcy5vCitPQkpTLSQoQ09ORklHX01PVlRFWFRfRU5DT0RFUikgICAgICAgICArPSBtb3Z0ZXh0ZW5jLm8gYXNzX3NwbGl0Lm8KK09CSlMtJChDT05GSUdfTVAxX0RFQ09ERVIpICAgICAgICAgICAgICs9IG1wZWdhdWRpb2RlY19maXhlZC5vCitPQkpTLSQoQ09ORklHX01QMUZMT0FUX0RFQ09ERVIpICAgICAgICArPSBtcGVnYXVkaW9kZWNfZmxvYXQubworT0JKUy0kKENPTkZJR19NUDJfREVDT0RFUikgICAgICAgICAgICAgKz0gbXBlZ2F1ZGlvZGVjX2ZpeGVkLm8KK09CSlMtJChDT05GSUdfTVAyX0VOQ09ERVIpICAgICAgICAgICAgICs9IG1wZWdhdWRpb2VuY19mbG9hdC5vIG1wZWdhdWRpby5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWdhdWRpb2RhdGEubyBtcGVnYXVkaW9kc3BfZGF0YS5vCitPQkpTLSQoQ09ORklHX01QMkZJWEVEX0VOQ09ERVIpICAgICAgICArPSBtcGVnYXVkaW9lbmNfZml4ZWQubyBtcGVnYXVkaW8ubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnYXVkaW9kYXRhLm8gbXBlZ2F1ZGlvZHNwX2RhdGEubworT0JKUy0kKENPTkZJR19NUDJGTE9BVF9ERUNPREVSKSAgICAgICAgKz0gbXBlZ2F1ZGlvZGVjX2Zsb2F0Lm8KK09CSlMtJChDT05GSUdfTVAzX0RFQ09ERVIpICAgICAgICAgICAgICs9IG1wZWdhdWRpb2RlY19maXhlZC5vCitPQkpTLSQoQ09ORklHX01QM0FEVV9ERUNPREVSKSAgICAgICAgICArPSBtcGVnYXVkaW9kZWNfZml4ZWQubworT0JKUy0kKENPTkZJR19NUDNBRFVGTE9BVF9ERUNPREVSKSAgICAgKz0gbXBlZ2F1ZGlvZGVjX2Zsb2F0Lm8KK09CSlMtJChDT05GSUdfTVAzRkxPQVRfREVDT0RFUikgICAgICAgICs9IG1wZWdhdWRpb2RlY19mbG9hdC5vCitPQkpTLSQoQ09ORklHX01QM09ONF9ERUNPREVSKSAgICAgICAgICArPSBtcGVnYXVkaW9kZWNfZml4ZWQubyBtcGVnNGF1ZGlvLm8KK09CSlMtJChDT05GSUdfTVAzT040RkxPQVRfREVDT0RFUikgICAgICs9IG1wZWdhdWRpb2RlY19mbG9hdC5vIG1wZWc0YXVkaW8ubworT0JKUy0kKENPTkZJR19NUEM3X0RFQ09ERVIpICAgICAgICAgICAgKz0gbXBjNy5vIG1wYy5vCitPQkpTLSQoQ09ORklHX01QQzhfREVDT0RFUikgICAgICAgICAgICArPSBtcGM4Lm8gbXBjLm8KK09CSlMtJChDT05GSUdfTVBFR1ZJREVPX0RFQ09ERVIpICAgICAgICs9IG1wZWcxMmRlYy5vIG1wZWcxMi5vIG1wZWcxMmRhdGEubworT0JKUy0kKENPTkZJR19NUEVHMVZJREVPX0RFQ09ERVIpICAgICAgKz0gbXBlZzEyZGVjLm8gbXBlZzEyLm8gbXBlZzEyZGF0YS5vCitPQkpTLSQoQ09ORklHX01QRUcxVklERU9fRU5DT0RFUikgICAgICArPSBtcGVnMTJlbmMubyBtcGVnMTIubworT0JKUy0kKENPTkZJR19NUEVHMlZJREVPX0RFQ09ERVIpICAgICAgKz0gbXBlZzEyZGVjLm8gbXBlZzEyLm8gbXBlZzEyZGF0YS5vCitPQkpTLSQoQ09ORklHX01QRUcyVklERU9fRU5DT0RFUikgICAgICArPSBtcGVnMTJlbmMubyBtcGVnMTIubworT0JKUy0kKENPTkZJR19NUEVHNF9ERUNPREVSKSAgICAgICAgICAgKz0geHZpZGlkY3QubworT0JKUy0kKENPTkZJR19NUEwyX0RFQ09ERVIpICAgICAgICAgICAgKz0gbXBsMmRlYy5vIGFzcy5vCitPQkpTLSQoQ09ORklHX01TTVBFRzRWMV9ERUNPREVSKSAgICAgICArPSBtc21wZWc0ZGVjLm8gbXNtcGVnNC5vIG1zbXBlZzRkYXRhLm8KK09CSlMtJChDT05GSUdfTVNNUEVHNFYyX0RFQ09ERVIpICAgICAgICs9IG1zbXBlZzRkZWMubyBtc21wZWc0Lm8gbXNtcGVnNGRhdGEubworT0JKUy0kKENPTkZJR19NU01QRUc0VjJfRU5DT0RFUikgICAgICAgKz0gbXNtcGVnNGVuYy5vIG1zbXBlZzQubyBtc21wZWc0ZGF0YS5vCitPQkpTLSQoQ09ORklHX01TTVBFRzRWM19ERUNPREVSKSAgICAgICArPSBtc21wZWc0ZGVjLm8gbXNtcGVnNC5vIG1zbXBlZzRkYXRhLm8KK09CSlMtJChDT05GSUdfTVNNUEVHNFYzX0VOQ09ERVIpICAgICAgICs9IG1zbXBlZzRlbmMubyBtc21wZWc0Lm8gbXNtcGVnNGRhdGEubworT0JKUy0kKENPTkZJR19NU1JMRV9ERUNPREVSKSAgICAgICAgICAgKz0gbXNybGUubyBtc3JsZWRlYy5vCitPQkpTLSQoQ09ORklHX01TQTFfREVDT0RFUikgICAgICAgICAgICArPSBtc3MzLm8gbXNzMzRkc3AubworT0JKUy0kKENPTkZJR19NU1MxX0RFQ09ERVIpICAgICAgICAgICAgKz0gbXNzMS5vIG1zczEyLm8KK09CSlMtJChDT05GSUdfTVNTMl9ERUNPREVSKSAgICAgICAgICAgICs9IG1zczIubyBtc3MxMi5vIG1zczJkc3AubworT0JKUy0kKENPTkZJR19NU1ZJREVPMV9ERUNPREVSKSAgICAgICAgKz0gbXN2aWRlbzEubworT0JKUy0kKENPTkZJR19NU1ZJREVPMV9FTkNPREVSKSAgICAgICAgKz0gbXN2aWRlbzFlbmMubyBlbGJnLm8KK09CSlMtJChDT05GSUdfTVNaSF9ERUNPREVSKSAgICAgICAgICAgICs9IGxjbGRlYy5vCitPQkpTLSQoQ09ORklHX01UUzJfREVDT0RFUikgICAgICAgICAgICArPSBtc3M0Lm8gbXNzMzRkc3AubworT0JKUy0kKENPTkZJR19NVkMxX0RFQ09ERVIpICAgICAgICAgICAgKz0gbXZjZGVjLm8KK09CSlMtJChDT05GSUdfTVZDMl9ERUNPREVSKSAgICAgICAgICAgICs9IG12Y2RlYy5vCitPQkpTLSQoQ09ORklHX01YUEVHX0RFQ09ERVIpICAgICAgICAgICArPSBteHBlZ2RlYy5vCitPQkpTLSQoQ09ORklHX05FTExZTU9TRVJfREVDT0RFUikgICAgICArPSBuZWxseW1vc2VyZGVjLm8gbmVsbHltb3Nlci5vCitPQkpTLSQoQ09ORklHX05FTExZTU9TRVJfRU5DT0RFUikgICAgICArPSBuZWxseW1vc2VyZW5jLm8gbmVsbHltb3Nlci5vCitPQkpTLSQoQ09ORklHX05VVl9ERUNPREVSKSAgICAgICAgICAgICArPSBudXYubyBydGpwZWcubworT0JKUy0kKENPTkZJR19PTjJBVkNfREVDT0RFUikgICAgICAgICAgKz0gb24yYXZjLm8gb24yYXZjZGF0YS5vCitPQkpTLSQoQ09ORklHX09QVVNfREVDT0RFUikgICAgICAgICAgICArPSBvcHVzZGVjLm8gb3B1cy5vIG9wdXNfY2VsdC5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdXNfaW1kY3QubyBvcHVzX3NpbGsubyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19QQUZfQVVESU9fREVDT0RFUikgICAgICAgKz0gcGFmYXVkaW8ubworT0JKUy0kKENPTkZJR19QQUZfVklERU9fREVDT0RFUikgICAgICAgKz0gcGFmdmlkZW8ubworT0JKUy0kKENPTkZJR19QQU1fREVDT0RFUikgICAgICAgICAgICAgKz0gcG5tZGVjLm8gcG5tLm8KK09CSlMtJChDT05GSUdfUEFNX0VOQ09ERVIpICAgICAgICAgICAgICs9IHBhbWVuYy5vCitPQkpTLSQoQ09ORklHX1BCTV9ERUNPREVSKSAgICAgICAgICAgICArPSBwbm1kZWMubyBwbm0ubworT0JKUy0kKENPTkZJR19QQk1fRU5DT0RFUikgICAgICAgICAgICAgKz0gcG5tZW5jLm8KK09CSlMtJChDT05GSUdfUENYX0RFQ09ERVIpICAgICAgICAgICAgICs9IHBjeC5vCitPQkpTLSQoQ09ORklHX1BDWF9FTkNPREVSKSAgICAgICAgICAgICArPSBwY3hlbmMubworT0JKUy0kKENPTkZJR19QR01fREVDT0RFUikgICAgICAgICAgICAgKz0gcG5tZGVjLm8gcG5tLm8KK09CSlMtJChDT05GSUdfUEdNX0VOQ09ERVIpICAgICAgICAgICAgICs9IHBubWVuYy5vCitPQkpTLSQoQ09ORklHX1BHTVlVVl9ERUNPREVSKSAgICAgICAgICArPSBwbm1kZWMubyBwbm0ubworT0JKUy0kKENPTkZJR19QR01ZVVZfRU5DT0RFUikgICAgICAgICAgKz0gcG5tZW5jLm8KK09CSlMtJChDT05GSUdfUEdTU1VCX0RFQ09ERVIpICAgICAgICAgICs9IHBnc3N1YmRlYy5vCitPQkpTLSQoQ09ORklHX1BJQ1RPUl9ERUNPREVSKSAgICAgICAgICArPSBwaWN0b3JkZWMubyBjZ2FfZGF0YS5vCitPQkpTLSQoQ09ORklHX1BKU19ERUNPREVSKSAgICAgICAgICAgICArPSB0ZXh0ZGVjLm8gYXNzLm8KK09CSlMtJChDT05GSUdfUE5HX0RFQ09ERVIpICAgICAgICAgICAgICs9IHBuZy5vIHBuZ2RlYy5vIHBuZ2RzcC5vCitPQkpTLSQoQ09ORklHX1BOR19FTkNPREVSKSAgICAgICAgICAgICArPSBwbmcubyBwbmdlbmMubworT0JKUy0kKENPTkZJR19QUE1fREVDT0RFUikgICAgICAgICAgICAgKz0gcG5tZGVjLm8gcG5tLm8KK09CSlMtJChDT05GSUdfUFBNX0VOQ09ERVIpICAgICAgICAgICAgICs9IHBubWVuYy5vCitPQkpTLSQoQ09ORklHX1BST1JFU19ERUNPREVSKSAgICAgICAgICArPSBwcm9yZXNkZWMyLm8gcHJvcmVzZHNwLm8gcHJvcmVzZGF0YS5vCitPQkpTLSQoQ09ORklHX1BST1JFU19MR1BMX0RFQ09ERVIpICAgICArPSBwcm9yZXNkZWNfbGdwbC5vIHByb3Jlc2RzcC5vIHByb3Jlc2RhdGEubworT0JKUy0kKENPTkZJR19QUk9SRVNfRU5DT0RFUikgICAgICAgICAgKz0gcHJvcmVzZW5jX2FuYXRvbGl5Lm8KK09CSlMtJChDT05GSUdfUFJPUkVTX0FXX0VOQ09ERVIpICAgICAgICs9IHByb3Jlc2VuY19hbmF0b2xpeS5vCitPQkpTLSQoQ09ORklHX1BST1JFU19LU19FTkNPREVSKSAgICAgICArPSBwcm9yZXNlbmNfa29zdHlhLm8gcHJvcmVzZGF0YS5vCitPQkpTLSQoQ09ORklHX1BUWF9ERUNPREVSKSAgICAgICAgICAgICArPSBwdHgubworT0JKUy0kKENPTkZJR19RQ0VMUF9ERUNPREVSKSAgICAgICAgICAgKz0gcWNlbHBkZWMubyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbHBfZmlsdGVycy5vIGFjZWxwX3ZlY3RvcnMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2VscF9maWx0ZXJzLm8KK09CSlMtJChDT05GSUdfUURNMl9ERUNPREVSKSAgICAgICAgICAgICs9IHFkbTIubworT0JKUy0kKENPTkZJR19RRFJBV19ERUNPREVSKSAgICAgICAgICAgKz0gcWRydy5vCitPQkpTLSQoQ09ORklHX1FQRUdfREVDT0RFUikgICAgICAgICAgICArPSBxcGVnLm8KK09CSlMtJChDT05GSUdfUVRSTEVfREVDT0RFUikgICAgICAgICAgICs9IHF0cmxlLm8KK09CSlMtJChDT05GSUdfUVRSTEVfRU5DT0RFUikgICAgICAgICAgICs9IHF0cmxlZW5jLm8KK09CSlMtJChDT05GSUdfUjEwS19ERUNPREVSKSAgICAgICAgICAgICs9IHIyMTBkZWMubworT0JKUy0kKENPTkZJR19SMTBLX0VOQ09ERVIpICAgICAgICAgICAgKz0gcjIxMGVuYy5vCitPQkpTLSQoQ09ORklHX1IyMTBfREVDT0RFUikgICAgICAgICAgICArPSByMjEwZGVjLm8KK09CSlMtJChDT05GSUdfUjIxMF9FTkNPREVSKSAgICAgICAgICAgICs9IHIyMTBlbmMubworT0JKUy0kKENPTkZJR19SQV8xNDRfREVDT0RFUikgICAgICAgICAgKz0gcmExNDRkZWMubyByYTE0NC5vIGNlbHBfZmlsdGVycy5vCitPQkpTLSQoQ09ORklHX1JBXzE0NF9FTkNPREVSKSAgICAgICAgICArPSByYTE0NGVuYy5vIHJhMTQ0Lm8gY2VscF9maWx0ZXJzLm8KK09CSlMtJChDT05GSUdfUkFfMjg4X0RFQ09ERVIpICAgICAgICAgICs9IHJhMjg4Lm8gY2VscF9maWx0ZXJzLm8KK09CSlMtJChDT05GSUdfUkFMRl9ERUNPREVSKSAgICAgICAgICAgICs9IHJhbGYubworT0JKUy0kKENPTkZJR19SQVdWSURFT19ERUNPREVSKSAgICAgICAgKz0gcmF3ZGVjLm8KK09CSlMtJChDT05GSUdfUkFXVklERU9fRU5DT0RFUikgICAgICAgICs9IHJhd2VuYy5vCitPQkpTLSQoQ09ORklHX1JFQUxURVhUX0RFQ09ERVIpICAgICAgICArPSByZWFsdGV4dGRlYy5vIGFzcy5vCitPQkpTLSQoQ09ORklHX1JMMl9ERUNPREVSKSAgICAgICAgICAgICArPSBybDIubworT0JKUy0kKENPTkZJR19ST1FfREVDT0RFUikgICAgICAgICAgICAgKz0gcm9xdmlkZW9kZWMubyByb3F2aWRlby5vCitPQkpTLSQoQ09ORklHX1JPUV9FTkNPREVSKSAgICAgICAgICAgICArPSByb3F2aWRlb2VuYy5vIHJvcXZpZGVvLm8gZWxiZy5vCitPQkpTLSQoQ09ORklHX1JPUV9EUENNX0RFQ09ERVIpICAgICAgICArPSBkcGNtLm8KK09CSlMtJChDT05GSUdfUk9RX0RQQ01fRU5DT0RFUikgICAgICAgICs9IHJvcWF1ZGlvZW5jLm8KK09CSlMtJChDT05GSUdfUlBaQV9ERUNPREVSKSAgICAgICAgICAgICs9IHJwemEubworT0JKUy0kKENPTkZJR19SVjEwX0RFQ09ERVIpICAgICAgICAgICAgKz0gcnYxMC5vCitPQkpTLSQoQ09ORklHX1JWMTBfRU5DT0RFUikgICAgICAgICAgICArPSBydjEwZW5jLm8KK09CSlMtJChDT05GSUdfUlYyMF9ERUNPREVSKSAgICAgICAgICAgICs9IHJ2MTAubworT0JKUy0kKENPTkZJR19SVjIwX0VOQ09ERVIpICAgICAgICAgICAgKz0gcnYyMGVuYy5vCitPQkpTLSQoQ09ORklHX1JWMzBfREVDT0RFUikgICAgICAgICAgICArPSBydjMwLm8gcnYzNC5vIHJ2MzBkc3AubyBydjM0ZHNwLm8KK09CSlMtJChDT05GSUdfUlY0MF9ERUNPREVSKSAgICAgICAgICAgICs9IHJ2NDAubyBydjM0Lm8gcnYzNGRzcC5vIHJ2NDBkc3AubworT0JKUy0kKENPTkZJR19TQU1JX0RFQ09ERVIpICAgICAgICAgICAgKz0gc2FtaWRlYy5vIGFzcy5vCitPQkpTLSQoQ09ORklHX1MzMDJNX0RFQ09ERVIpICAgICAgICAgICArPSBzMzAybS5vCitPQkpTLSQoQ09ORklHX1MzMDJNX0VOQ09ERVIpICAgICAgICAgICArPSBzMzAybWVuYy5vCitPQkpTLSQoQ09ORklHX1NBTk1fREVDT0RFUikgICAgICAgICAgICArPSBzYW5tLm8KK09CSlMtJChDT05GSUdfU0dJX0RFQ09ERVIpICAgICAgICAgICAgICs9IHNnaWRlYy5vCitPQkpTLSQoQ09ORklHX1NHSV9FTkNPREVSKSAgICAgICAgICAgICArPSBzZ2llbmMubyBybGUubworT0JKUy0kKENPTkZJR19TR0lSTEVfREVDT0RFUikgICAgICAgICAgKz0gc2dpcmxlZGVjLm8KK09CSlMtJChDT05GSUdfU0hPUlRFTl9ERUNPREVSKSAgICAgICAgICs9IHNob3J0ZW4ubworT0JKUy0kKENPTkZJR19TSVBSX0RFQ09ERVIpICAgICAgICAgICAgKz0gc2lwci5vIGFjZWxwX3BpdGNoX2RlbGF5Lm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VscF9tYXRoLm8gYWNlbHBfdmVjdG9ycy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjZWxwX2ZpbHRlcnMubyBjZWxwX2ZpbHRlcnMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXByMTZrLm8KK09CSlMtJChDT05GSUdfU01BQ0tBVURfREVDT0RFUikgICAgICAgICs9IHNtYWNrZXIubworT0JKUy0kKENPTkZJR19TTUFDS0VSX0RFQ09ERVIpICAgICAgICAgKz0gc21hY2tlci5vCitPQkpTLSQoQ09ORklHX1NNQ19ERUNPREVSKSAgICAgICAgICAgICArPSBzbWMubworT0JKUy0kKENPTkZJR19TTVZKUEVHX0RFQ09ERVIpICAgICAgICAgKz0gc212anBlZ2RlYy5vCitPQkpTLSQoQ09ORklHX1NOT1dfREVDT0RFUikgICAgICAgICAgICArPSBzbm93ZGVjLm8gc25vdy5vIHNub3dfZHd0Lm8KK09CSlMtJChDT05GSUdfU05PV19FTkNPREVSKSAgICAgICAgICAgICs9IHNub3dlbmMubyBzbm93Lm8gc25vd19kd3QubyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjYzLm8gaXR1aDI2M2VuYy5vCitPQkpTLSQoQ09ORklHX1NPTF9EUENNX0RFQ09ERVIpICAgICAgICArPSBkcGNtLm8KK09CSlMtJChDT05GSUdfU09OSUNfREVDT0RFUikgICAgICAgICAgICs9IHNvbmljLm8KK09CSlMtJChDT05GSUdfU09OSUNfRU5DT0RFUikgICAgICAgICAgICs9IHNvbmljLm8KK09CSlMtJChDT05GSUdfU09OSUNfTFNfRU5DT0RFUikgICAgICAgICs9IHNvbmljLm8KK09CSlMtJChDT05GSUdfU1A1WF9ERUNPREVSKSAgICAgICAgICAgICs9IHNwNXhkZWMubworT0JKUy0kKENPTkZJR19TUlRfREVDT0RFUikgICAgICAgICAgICAgKz0gc3J0ZGVjLm8gYXNzLm8KK09CSlMtJChDT05GSUdfU1JUX0VOQ09ERVIpICAgICAgICAgICAgICs9IHNydGVuYy5vIGFzc19zcGxpdC5vCitPQkpTLSQoQ09ORklHX1NUTF9ERUNPREVSKSAgICAgICAgICAgICArPSB0ZXh0ZGVjLm8gYXNzLm8KK09CSlMtJChDT05GSUdfU1VCUklQX0RFQ09ERVIpICAgICAgICAgICs9IHNydGRlYy5vIGFzcy5vCitPQkpTLSQoQ09ORklHX1NVQlJJUF9FTkNPREVSKSAgICAgICAgICArPSBzcnRlbmMubyBhc3Nfc3BsaXQubworT0JKUy0kKENPTkZJR19TVUJWSUVXRVIxX0RFQ09ERVIpICAgICAgKz0gdGV4dGRlYy5vIGFzcy5vCitPQkpTLSQoQ09ORklHX1NVQlZJRVdFUl9ERUNPREVSKSAgICAgICArPSBzdWJ2aWV3ZXJkZWMubyBhc3MubworT0JKUy0kKENPTkZJR19TVU5SQVNUX0RFQ09ERVIpICAgICAgICAgKz0gc3VucmFzdC5vCitPQkpTLSQoQ09ORklHX1NVTlJBU1RfRU5DT0RFUikgICAgICAgICArPSBzdW5yYXN0ZW5jLm8KK09CSlMtJChDT05GSUdfU1ZRMV9ERUNPREVSKSAgICAgICAgICAgICs9IHN2cTFkZWMubyBzdnExLm8gc3ZxMTMubyBoMjYzLm8KK09CSlMtJChDT05GSUdfU1ZRMV9FTkNPREVSKSAgICAgICAgICAgICs9IHN2cTFlbmMubyBzdnExLm8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2My5vIGl0dWgyNjNlbmMubworT0JKUy0kKENPTkZJR19TVlEzX0RFQ09ERVIpICAgICAgICAgICAgKz0gc3ZxMy5vIHN2cTEzLm8gbXBlZ3V0aWxzLm8KK09CSlMtJChDT05GSUdfVEVYVF9ERUNPREVSKSAgICAgICAgICAgICs9IHRleHRkZWMubyBhc3MubworT0JKUy0kKENPTkZJR19UQUtfREVDT0RFUikgICAgICAgICAgICAgKz0gdGFrZGVjLm8gdGFrLm8KK09CSlMtJChDT05GSUdfVEFSR0FfREVDT0RFUikgICAgICAgICAgICs9IHRhcmdhLm8KK09CSlMtJChDT05GSUdfVEFSR0FfRU5DT0RFUikgICAgICAgICAgICs9IHRhcmdhZW5jLm8gcmxlLm8KK09CSlMtJChDT05GSUdfVEFSR0FfWTIxNl9ERUNPREVSKSAgICAgICs9IHRhcmdhX3kyMTZkZWMubworT0JKUy0kKENPTkZJR19USUVSVEVYU0VRVklERU9fREVDT0RFUikgKz0gdGllcnRleHNlcXYubworT0JKUy0kKENPTkZJR19USUZGX0RFQ09ERVIpICAgICAgICAgICAgKz0gdGlmZi5vIGx6dy5vIGZheGNvbXByLm8gdGlmZl9kYXRhLm8gdGlmZl9jb21tb24ubworT0JKUy0kKENPTkZJR19USUZGX0VOQ09ERVIpICAgICAgICAgICAgKz0gdGlmZmVuYy5vIHJsZS5vIGx6d2VuYy5vIHRpZmZfZGF0YS5vCitPQkpTLSQoQ09ORklHX1RNVl9ERUNPREVSKSAgICAgICAgICAgICArPSB0bXYubyBjZ2FfZGF0YS5vCitPQkpTLSQoQ09ORklHX1RSVUVIRF9ERUNPREVSKSAgICAgICAgICArPSBtbHBkZWMubyBtbHBkc3AubworT0JKUy0kKENPTkZJR19UUlVFTU9USU9OMV9ERUNPREVSKSAgICAgKz0gdHJ1ZW1vdGlvbjEubworT0JKUy0kKENPTkZJR19UUlVFTU9USU9OMl9ERUNPREVSKSAgICAgKz0gdHJ1ZW1vdGlvbjIubworT0JKUy0kKENPTkZJR19UUlVFU1BFRUNIX0RFQ09ERVIpICAgICAgKz0gdHJ1ZXNwZWVjaC5vCitPQkpTLSQoQ09ORklHX1RTQ0NfREVDT0RFUikgICAgICAgICAgICArPSB0c2NjLm8gbXNybGVkZWMubworT0JKUy0kKENPTkZJR19UU0NDMl9ERUNPREVSKSAgICAgICAgICAgKz0gdHNjYzIubworT0JKUy0kKENPTkZJR19UVEFfREVDT0RFUikgICAgICAgICAgICAgKz0gdHRhLm8gdHRhZGF0YS5vIHR0YWRzcC5vCitPQkpTLSQoQ09ORklHX1RUQV9FTkNPREVSKSAgICAgICAgICAgICArPSB0dGFlbmMubyB0dGFkYXRhLm8KK09CSlMtJChDT05GSUdfVFdJTlZRX0RFQ09ERVIpICAgICAgICAgICs9IHR3aW52cWRlYy5vIHR3aW52cS5vCitPQkpTLSQoQ09ORklHX1RYRF9ERUNPREVSKSAgICAgICAgICAgICArPSB0eGQubyBzM3RjLm8KK09CSlMtJChDT05GSUdfVUxUSV9ERUNPREVSKSAgICAgICAgICAgICs9IHVsdGkubworT0JKUy0kKENPTkZJR19VVFZJREVPX0RFQ09ERVIpICAgICAgICAgKz0gdXR2aWRlb2RlYy5vIHV0dmlkZW8ubworT0JKUy0kKENPTkZJR19VVFZJREVPX0VOQ09ERVIpICAgICAgICAgKz0gdXR2aWRlb2VuYy5vIHV0dmlkZW8ubworT0JKUy0kKENPTkZJR19WMjEwX0RFQ09ERVIpICAgICAgICAgICAgKz0gdjIxMGRlYy5vCitPQkpTLSQoQ09ORklHX1YyMTBfRU5DT0RFUikgICAgICAgICAgICArPSB2MjEwZW5jLm8KK09CSlMtJChDT05GSUdfVjMwOF9ERUNPREVSKSAgICAgICAgICAgICs9IHYzMDhkZWMubworT0JKUy0kKENPTkZJR19WMzA4X0VOQ09ERVIpICAgICAgICAgICAgKz0gdjMwOGVuYy5vCitPQkpTLSQoQ09ORklHX1Y0MDhfREVDT0RFUikgICAgICAgICAgICArPSB2NDA4ZGVjLm8KK09CSlMtJChDT05GSUdfVjQwOF9FTkNPREVSKSAgICAgICAgICAgICs9IHY0MDhlbmMubworT0JKUy0kKENPTkZJR19WNDEwX0RFQ09ERVIpICAgICAgICAgICAgKz0gdjQxMGRlYy5vCitPQkpTLSQoQ09ORklHX1Y0MTBfRU5DT0RFUikgICAgICAgICAgICArPSB2NDEwZW5jLm8KK09CSlMtJChDT05GSUdfVjIxMFhfREVDT0RFUikgICAgICAgICAgICs9IHYyMTB4Lm8KK09CSlMtJChDT05GSUdfVkJfREVDT0RFUikgICAgICAgICAgICAgICs9IHZiLm8KK09CSlMtJChDT05GSUdfVkJMRV9ERUNPREVSKSAgICAgICAgICAgICs9IHZibGUubworT0JKUy0kKENPTkZJR19WQzFfREVDT0RFUikgICAgICAgICAgICAgKz0gdmMxZGVjLm8gdmMxX2Jsb2NrLm8gdmMxX2xvb3BmaWx0ZXIubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YzFfbWMubyB2YzFfcHJlZC5vIHZjMS5vIHZjMWRhdGEubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YzFkc3AubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc21wZWc0ZGVjLm8gbXNtcGVnNC5vIG1zbXBlZzRkYXRhLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd212MmRzcC5vCitPQkpTLSQoQ09ORklHX1ZDUjFfREVDT0RFUikgICAgICAgICAgICArPSB2Y3IxLm8KK09CSlMtJChDT05GSUdfVk1EQVVESU9fREVDT0RFUikgICAgICAgICs9IHZtZGF1ZGlvLm8KK09CSlMtJChDT05GSUdfVk1EVklERU9fREVDT0RFUikgICAgICAgICs9IHZtZHZpZGVvLm8KK09CSlMtJChDT05GSUdfVk1OQ19ERUNPREVSKSAgICAgICAgICAgICs9IHZtbmMubworT0JKUy0kKENPTkZJR19WT1JCSVNfREVDT0RFUikgICAgICAgICAgKz0gdm9yYmlzZGVjLm8gdm9yYmlzZHNwLm8gdm9yYmlzLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19WT1JCSVNfRU5DT0RFUikgICAgICAgICAgKz0gdm9yYmlzZW5jLm8gdm9yYmlzLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19WUDNfREVDT0RFUikgICAgICAgICAgICAgKz0gdnAzLm8KK09CSlMtJChDT05GSUdfVlA1X0RFQ09ERVIpICAgICAgICAgICAgICs9IHZwNS5vIHZwNTYubyB2cDU2ZGF0YS5vIHZwNTZkc3AubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDU2cmFjLm8KK09CSlMtJChDT05GSUdfVlA2X0RFQ09ERVIpICAgICAgICAgICAgICs9IHZwNi5vIHZwNTYubyB2cDU2ZGF0YS5vIHZwNTZkc3AubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDZkc3AubyB2cDU2cmFjLm8KK09CSlMtJChDT05GSUdfVlA3X0RFQ09ERVIpICAgICAgICAgICAgICs9IHZwOC5vIHZwOGRzcC5vIHZwNTZyYWMubworT0JKUy0kKENPTkZJR19WUDhfREVDT0RFUikgICAgICAgICAgICAgKz0gdnA4Lm8gdnA4ZHNwLm8gdnA1NnJhYy5vCitPQkpTLSQoQ09ORklHX1ZQOV9ERUNPREVSKSAgICAgICAgICAgICArPSB2cDkubyB2cDlkc3AubyB2cDU2cmFjLm8KK09CSlMtJChDT05GSUdfVlBMQVlFUl9ERUNPREVSKSAgICAgICAgICs9IHRleHRkZWMubyBhc3MubworT0JKUy0kKENPTkZJR19WUUFfREVDT0RFUikgICAgICAgICAgICAgKz0gdnFhdmlkZW8ubworT0JKUy0kKENPTkZJR19XQVZQQUNLX0RFQ09ERVIpICAgICAgICAgKz0gd2F2cGFjay5vCitPQkpTLSQoQ09ORklHX1dBVlBBQ0tfRU5DT0RFUikgICAgICAgICArPSB3YXZwYWNrZW5jLm8KK09CSlMtJChDT05GSUdfV0VCUF9ERUNPREVSKSAgICAgICAgICAgICs9IHZwOC5vIHZwOGRzcC5vIHZwNTZyYWMubworT0JKUy0kKENPTkZJR19XRUJQX0RFQ09ERVIpICAgICAgICAgICAgKz0gd2VicC5vIGV4aWYubyB0aWZmX2NvbW1vbi5vCitPQkpTLSQoQ09ORklHX1dFQlZUVF9ERUNPREVSKSAgICAgICAgICArPSB3ZWJ2dHRkZWMubyBhc3MubworT0JKUy0kKENPTkZJR19XRUJWVFRfRU5DT0RFUikgICAgICAgICAgKz0gd2VidnR0ZW5jLm8gYXNzX3NwbGl0Lm8KK09CSlMtJChDT05GSUdfV01BTE9TU0xFU1NfREVDT0RFUikgICAgICs9IHdtYWxvc3NsZXNzZGVjLm8gd21hX2NvbW1vbi5vCitPQkpTLSQoQ09ORklHX1dNQVBST19ERUNPREVSKSAgICAgICAgICArPSB3bWFwcm9kZWMubyB3bWEubyB3bWFfY29tbW9uLm8KK09CSlMtJChDT05GSUdfV01BVjFfREVDT0RFUikgICAgICAgICAgICs9IHdtYWRlYy5vIHdtYS5vIHdtYV9jb21tb24ubyBhYWN0YWIubworT0JKUy0kKENPTkZJR19XTUFWMV9FTkNPREVSKSAgICAgICAgICAgKz0gd21hZW5jLm8gd21hLm8gd21hX2NvbW1vbi5vIGFhY3RhYi5vCitPQkpTLSQoQ09ORklHX1dNQVYyX0RFQ09ERVIpICAgICAgICAgICArPSB3bWFkZWMubyB3bWEubyB3bWFfY29tbW9uLm8gYWFjdGFiLm8KK09CSlMtJChDT05GSUdfV01BVjJfRU5DT0RFUikgICAgICAgICAgICs9IHdtYWVuYy5vIHdtYS5vIHdtYV9jb21tb24ubyBhYWN0YWIubworT0JKUy0kKENPTkZJR19XTUFWT0lDRV9ERUNPREVSKSAgICAgICAgKz0gd21hdm9pY2UubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxwX2ZpbHRlcnMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2VscF92ZWN0b3JzLm8gYWNlbHBfZmlsdGVycy5vCitPQkpTLSQoQ09ORklHX1dNVjFfREVDT0RFUikgICAgICAgICAgICArPSBtc21wZWc0ZGVjLm8gbXNtcGVnNC5vIG1zbXBlZzRkYXRhLm8KK09CSlMtJChDT05GSUdfV01WMV9FTkNPREVSKSAgICAgICAgICAgICs9IG1zbXBlZzRlbmMubworT0JKUy0kKENPTkZJR19XTVYyX0RFQ09ERVIpICAgICAgICAgICAgKz0gd212MmRlYy5vIHdtdjIubyB3bXYyZHNwLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNtcGVnNGRlYy5vIG1zbXBlZzQubyBtc21wZWc0ZGF0YS5vCitPQkpTLSQoQ09ORklHX1dNVjJfRU5DT0RFUikgICAgICAgICAgICArPSB3bXYyZW5jLm8gd212Mi5vIHdtdjJkc3AubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc21wZWc0Lm8gbXNtcGVnNGVuYy5vIG1zbXBlZzRkYXRhLm8KK09CSlMtJChDT05GSUdfV05WMV9ERUNPREVSKSAgICAgICAgICAgICs9IHdudjEubworT0JKUy0kKENPTkZJR19XU19TTkQxX0RFQ09ERVIpICAgICAgICAgKz0gd3Mtc25kMS5vCitPQkpTLSQoQ09ORklHX1hBTl9EUENNX0RFQ09ERVIpICAgICAgICArPSBkcGNtLm8KK09CSlMtJChDT05GSUdfWEFOX1dDM19ERUNPREVSKSAgICAgICAgICs9IHhhbi5vCitPQkpTLSQoQ09ORklHX1hBTl9XQzRfREVDT0RFUikgICAgICAgICArPSB4eGFuLm8KK09CSlMtJChDT05GSUdfWEJJTl9ERUNPREVSKSAgICAgICAgICAgICs9IGJpbnRleHQubyBjZ2FfZGF0YS5vCitPQkpTLSQoQ09ORklHX1hCTV9ERUNPREVSKSAgICAgICAgICAgICArPSB4Ym1kZWMubworT0JKUy0kKENPTkZJR19YQk1fRU5DT0RFUikgICAgICAgICAgICAgKz0geGJtZW5jLm8KK09CSlMtJChDT05GSUdfWEZBQ0VfREVDT0RFUikgICAgICAgICAgICs9IHhmYWNlZGVjLm8geGZhY2UubworT0JKUy0kKENPTkZJR19YRkFDRV9FTkNPREVSKSAgICAgICAgICAgKz0geGZhY2VlbmMubyB4ZmFjZS5vCitPQkpTLSQoQ09ORklHX1hMX0RFQ09ERVIpICAgICAgICAgICAgICArPSB4bC5vCitPQkpTLSQoQ09ORklHX1hTVUJfREVDT0RFUikgICAgICAgICAgICArPSB4c3ViZGVjLm8KK09CSlMtJChDT05GSUdfWFNVQl9FTkNPREVSKSAgICAgICAgICAgICs9IHhzdWJlbmMubworT0JKUy0kKENPTkZJR19YV0RfREVDT0RFUikgICAgICAgICAgICAgKz0geHdkZGVjLm8KK09CSlMtJChDT05GSUdfWFdEX0VOQ09ERVIpICAgICAgICAgICAgICs9IHh3ZGVuYy5vCitPQkpTLSQoQ09ORklHX1k0MVBfREVDT0RFUikgICAgICAgICAgICArPSB5NDFwZGVjLm8KK09CSlMtJChDT05GSUdfWTQxUF9FTkNPREVSKSAgICAgICAgICAgICs9IHk0MXBlbmMubworT0JKUy0kKENPTkZJR19ZT1BfREVDT0RFUikgICAgICAgICAgICAgKz0geW9wLm8KK09CSlMtJChDT05GSUdfWVVWNF9ERUNPREVSKSAgICAgICAgICAgICs9IHl1djRkZWMubworT0JKUy0kKENPTkZJR19ZVVY0X0VOQ09ERVIpICAgICAgICAgICAgKz0geXV2NGVuYy5vCitPQkpTLSQoQ09ORklHX1pFUk9DT0RFQ19ERUNPREVSKSAgICAgICArPSB6ZXJvY29kZWMubworT0JKUy0kKENPTkZJR19aTElCX0RFQ09ERVIpICAgICAgICAgICAgKz0gbGNsZGVjLm8KK09CSlMtJChDT05GSUdfWkxJQl9FTkNPREVSKSAgICAgICAgICAgICs9IGxjbGVuYy5vCitPQkpTLSQoQ09ORklHX1pNQlZfREVDT0RFUikgICAgICAgICAgICArPSB6bWJ2Lm8KK09CSlMtJChDT05GSUdfWk1CVl9FTkNPREVSKSAgICAgICAgICAgICs9IHptYnZlbmMubworCisjIChBRClQQ00gZGVjb2RlcnMvZW5jb2RlcnMKK09CSlMtJChDT05GSUdfUENNX0FMQVdfREVDT0RFUikgICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9BTEFXX0VOQ09ERVIpICAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fQkxVUkFZX0RFQ09ERVIpICAgICAgICAgKz0gcGNtLWJsdXJheS5vCitPQkpTLSQoQ09ORklHX1BDTV9EVkRfREVDT0RFUikgICAgICAgICAgICArPSBwY20tZHZkLm8KK09CSlMtJChDT05GSUdfUENNX0YzMkJFX0RFQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9GMzJCRV9FTkNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fRjMyTEVfREVDT0RFUikgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX0YzMkxFX0VOQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9GNjRCRV9ERUNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fRjY0QkVfRU5DT0RFUikgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX0Y2NExFX0RFQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9GNjRMRV9FTkNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fTFhGX0RFQ09ERVIpICAgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX01VTEFXX0RFQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9NVUxBV19FTkNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fUzhfREVDT0RFUikgICAgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1M4X0VOQ09ERVIpICAgICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9TOF9QTEFOQVJfREVDT0RFUikgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fUzhfUExBTkFSX0VOQ09ERVIpICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MxNkJFX0RFQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9TMTZCRV9FTkNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fUzE2QkVfUExBTkFSX0RFQ09ERVIpICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MxNkJFX1BMQU5BUl9FTkNPREVSKSAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9TMTZMRV9ERUNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fUzE2TEVfRU5DT0RFUikgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MxNkxFX1BMQU5BUl9ERUNPREVSKSAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9TMTZMRV9QTEFOQVJfRU5DT0RFUikgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fUzI0QkVfREVDT0RFUikgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MyNEJFX0VOQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9TMjREQVVEX0RFQ09ERVIpICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fUzI0REFVRF9FTkNPREVSKSAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MyNExFX0RFQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9TMjRMRV9FTkNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fUzI0TEVfUExBTkFSX0RFQ09ERVIpICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MyNExFX1BMQU5BUl9FTkNPREVSKSAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9TMzJCRV9ERUNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fUzMyQkVfRU5DT0RFUikgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MzMkxFX0RFQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9TMzJMRV9FTkNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fUzMyTEVfUExBTkFSX0RFQ09ERVIpICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MzMkxFX1BMQU5BUl9FTkNPREVSKSAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9VOF9ERUNPREVSKSAgICAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fVThfRU5DT0RFUikgICAgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1UxNkJFX0RFQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9VMTZCRV9FTkNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fVTE2TEVfREVDT0RFUikgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1UxNkxFX0VOQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9VMjRCRV9ERUNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fVTI0QkVfRU5DT0RFUikgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1UyNExFX0RFQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9VMjRMRV9FTkNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fVTMyQkVfREVDT0RFUikgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1UzMkJFX0VOQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9VMzJMRV9ERUNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fVTMyTEVfRU5DT0RFUikgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1pPUktfREVDT0RFUikgICAgICAgICAgICs9IHBjbS5vCisKK09CSlMtJChDT05GSUdfQURQQ01fNFhNX0RFQ09ERVIpICAgICAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX0FEWF9ERUNPREVSKSAgICAgICAgICArPSBhZHhkZWMubyBhZHgubworT0JKUy0kKENPTkZJR19BRFBDTV9BRFhfRU5DT0RFUikgICAgICAgICAgKz0gYWR4ZW5jLm8gYWR4Lm8KK09CSlMtJChDT05GSUdfQURQQ01fQUZDX0RFQ09ERVIpICAgICAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX0NUX0RFQ09ERVIpICAgICAgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9EVEtfREVDT0RFUikgICAgICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KK09CSlMtJChDT05GSUdfQURQQ01fRUFfREVDT0RFUikgICAgICAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX0VBX01BWElTX1hBX0RFQ09ERVIpICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9FQV9SMV9ERUNPREVSKSAgICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KK09CSlMtJChDT05GSUdfQURQQ01fRUFfUjJfREVDT0RFUikgICAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX0VBX1IzX0RFQ09ERVIpICAgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9FQV9YQVNfREVDT0RFUikgICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KK09CSlMtJChDT05GSUdfQURQQ01fRzcyMl9ERUNPREVSKSAgICAgICAgICs9IGc3MjIubyBnNzIyZGVjLm8KK09CSlMtJChDT05GSUdfQURQQ01fRzcyMl9FTkNPREVSKSAgICAgICAgICs9IGc3MjIubyBnNzIyZW5jLm8KK09CSlMtJChDT05GSUdfQURQQ01fRzcyNl9ERUNPREVSKSAgICAgICAgICs9IGc3MjYubworT0JKUy0kKENPTkZJR19BRFBDTV9HNzI2X0VOQ09ERVIpICAgICAgICAgKz0gZzcyNi5vCitPQkpTLSQoQ09ORklHX0FEUENNX0c3MjZMRV9ERUNPREVSKSAgICAgICArPSBnNzI2Lm8KK09CSlMtJChDT05GSUdfQURQQ01fSU1BX0FNVl9ERUNPREVSKSAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX0lNQV9BUENfREVDT0RFUikgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9JTUFfREszX0RFQ09ERVIpICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KK09CSlMtJChDT05GSUdfQURQQ01fSU1BX0RLNF9ERUNPREVSKSAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX0lNQV9FQV9FQUNTX0RFQ09ERVIpICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9JTUFfRUFfU0VBRF9ERUNPREVSKSAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KK09CSlMtJChDT05GSUdfQURQQ01fSU1BX0lTU19ERUNPREVSKSAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX0lNQV9PS0lfREVDT0RFUikgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9JTUFfUVRfREVDT0RFUikgICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KK09CSlMtJChDT05GSUdfQURQQ01fSU1BX1FUX0VOQ09ERVIpICAgICAgICs9IGFkcGNtZW5jLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX0lNQV9SQURfREVDT0RFUikgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9JTUFfU01KUEVHX0RFQ09ERVIpICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KK09CSlMtJChDT05GSUdfQURQQ01fSU1BX1dBVl9ERUNPREVSKSAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX0lNQV9XQVZfRU5DT0RFUikgICAgICArPSBhZHBjbWVuYy5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9JTUFfV1NfREVDT0RFUikgICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KK09CSlMtJChDT05GSUdfQURQQ01fTVNfREVDT0RFUikgICAgICAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX01TX0VOQ09ERVIpICAgICAgICAgICArPSBhZHBjbWVuYy5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9TQlBST18yX0RFQ09ERVIpICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KK09CSlMtJChDT05GSUdfQURQQ01fU0JQUk9fM19ERUNPREVSKSAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX1NCUFJPXzRfREVDT0RFUikgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9TV0ZfREVDT0RFUikgICAgICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KK09CSlMtJChDT05GSUdfQURQQ01fU1dGX0VOQ09ERVIpICAgICAgICAgICs9IGFkcGNtZW5jLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX1RIUF9ERUNPREVSKSAgICAgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9WSU1BX0RFQ09ERVIpICAgICAgICAgKz0gdmltYS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9YQV9ERUNPREVSKSAgICAgICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KK09CSlMtJChDT05GSUdfQURQQ01fWUFNQUhBX0RFQ09ERVIpICAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCitPQkpTLSQoQ09ORklHX0FEUENNX1lBTUFIQV9FTkNPREVSKSAgICAgICArPSBhZHBjbWVuYy5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19WSU1BX0RFQ09ERVIpICAgICAgICAgICAgICAgKz0gdmltYS5vIGFkcGNtX2RhdGEubworCisjIGhhcmR3YXJlIGFjY2VsZXJhdG9ycworT0JKUy0kKENPTkZJR19EWFZBMikgICAgICAgICAgICAgICAgICAgICAgKz0gZHh2YTIubworT0JKUy0kKENPTkZJR19WQUFQSSkgICAgICAgICAgICAgICAgICAgICAgKz0gdmFhcGkubworT0JKUy0kKENPTkZJR19WREEpICAgICAgICAgICAgICAgICAgICAgICAgKz0gdmRhLm8KK09CSlMtJChDT05GSUdfVkRQQVUpICAgICAgICAgICAgICAgICAgICAgICs9IHZkcGF1Lm8KKworT0JKUy0kKENPTkZJR19IMjYzX1ZBQVBJX0hXQUNDRUwpICAgICAgICAgKz0gdmFhcGlfbXBlZzQubyB2YWFwaV9tcGVnLm8KK09CSlMtJChDT05GSUdfSDI2M19WRFBBVV9IV0FDQ0VMKSAgICAgICAgICs9IHZkcGF1X21wZWc0Lm8KK09CSlMtJChDT05GSUdfSDI2NF9EWFZBMl9IV0FDQ0VMKSAgICAgICAgICs9IGR4dmEyX2gyNjQubworT0JKUy0kKENPTkZJR19IMjY0X1ZBQVBJX0hXQUNDRUwpICAgICAgICAgKz0gdmFhcGlfaDI2NC5vCitPQkpTLSQoQ09ORklHX0gyNjRfVkRBX0hXQUNDRUwpICAgICAgICAgICArPSB2ZGFfaDI2NC5vCitPQkpTLSQoQ09ORklHX0gyNjRfVkRQQVVfSFdBQ0NFTCkgICAgICAgICArPSB2ZHBhdV9oMjY0Lm8KK09CSlMtJChDT05GSUdfTVBFRzFfVkRQQVVfSFdBQ0NFTCkgICAgICAgICs9IHZkcGF1X21wZWcxMi5vCitPQkpTLSQoQ09ORklHX01QRUcxX1hWTUNfSFdBQ0NFTCkgICAgICAgICArPSBtcGVndmlkZW9feHZtYy5vCitPQkpTLSQoQ09ORklHX01QRUcyX0RYVkEyX0hXQUNDRUwpICAgICAgICArPSBkeHZhMl9tcGVnMi5vCitPQkpTLSQoQ09ORklHX01QRUcyX1ZBQVBJX0hXQUNDRUwpICAgICAgICArPSB2YWFwaV9tcGVnMi5vIHZhYXBpX21wZWcubworT0JKUy0kKENPTkZJR19NUEVHMl9WRFBBVV9IV0FDQ0VMKSAgICAgICAgKz0gdmRwYXVfbXBlZzEyLm8KK09CSlMtJChDT05GSUdfTVBFRzJfWFZNQ19IV0FDQ0VMKSAgICAgICAgICs9IG1wZWd2aWRlb194dm1jLm8KK09CSlMtJChDT05GSUdfTVBFRzRfVkFBUElfSFdBQ0NFTCkgICAgICAgICs9IHZhYXBpX21wZWc0Lm8gdmFhcGlfbXBlZy5vCitPQkpTLSQoQ09ORklHX01QRUc0X1ZEUEFVX0hXQUNDRUwpICAgICAgICArPSB2ZHBhdV9tcGVnNC5vCitPQkpTLSQoQ09ORklHX1ZDMV9EWFZBMl9IV0FDQ0VMKSAgICAgICAgICArPSBkeHZhMl92YzEubworT0JKUy0kKENPTkZJR19WQzFfVkFBUElfSFdBQ0NFTCkgICAgICAgICAgKz0gdmFhcGlfdmMxLm8gdmFhcGlfbXBlZy5vCitPQkpTLSQoQ09ORklHX1ZDMV9WRFBBVV9IV0FDQ0VMKSAgICAgICAgICArPSB2ZHBhdV92YzEubworCisjIGxpYmF2Zm9ybWF0IGRlcGVuZGVuY2llcworT0JKUy0kKENPTkZJR19BRFRTX01VWEVSKSAgICAgICAgICAgICAgKz0gbXBlZzRhdWRpby5vCitPQkpTLSQoQ09ORklHX0NBRl9ERU1VWEVSKSAgICAgICAgICAgICArPSBtcGVnNGF1ZGlvLm8gbXBlZ2F1ZGlvZGF0YS5vICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYzN0YWIubworT0JKUy0kKENPTkZJR19GTEFDX0RFTVVYRVIpICAgICAgICAgICAgKz0gZmxhYy5vIGZsYWNkYXRhLm8gdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19GTEFDX01VWEVSKSAgICAgICAgICAgICAgKz0gZmxhYy5vIGZsYWNkYXRhLm8gdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19GTFZfREVNVVhFUikgICAgICAgICAgICAgKz0gbXBlZzRhdWRpby5vCitPQkpTLSQoQ09ORklHX0dYRl9ERU1VWEVSKSAgICAgICAgICAgICArPSBtcGVnMTJkYXRhLm8KK09CSlMtJChDT05GSUdfSUZGX0RFTVVYRVIpICAgICAgICAgICAgICs9IGlmZi5vCitPQkpTLSQoQ09ORklHX0lTTVZfTVVYRVIpICAgICAgICAgICAgICArPSBtcGVnNGF1ZGlvLm8gbXBlZ2F1ZGlvZGF0YS5vCitPQkpTLSQoQ09ORklHX0xBVE1fTVVYRVIpICAgICAgICAgICAgICArPSBtcGVnNGF1ZGlvLm8KK09CSlMtJChDT05GSUdfTUFUUk9TS0FfQVVESU9fTVVYRVIpICAgICs9IG1wZWc0YXVkaW8ubyB2b3JiaXNfZGF0YS5vICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWMubyBmbGFjZGF0YS5vCitPQkpTLSQoQ09ORklHX01BVFJPU0tBX0RFTVVYRVIpICAgICAgICArPSBtcGVnNGF1ZGlvLm8gbXBlZ2F1ZGlvZGF0YS5vCitPQkpTLSQoQ09ORklHX01BVFJPU0tBX01VWEVSKSAgICAgICAgICArPSBtcGVnNGF1ZGlvLm8gbXBlZ2F1ZGlvZGF0YS5vICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFjLm8gZmxhY2RhdGEubyB2b3JiaXNfZGF0YS5vCitPQkpTLSQoQ09ORklHX01QMl9NVVhFUikgICAgICAgICAgICAgICArPSBtcGVnYXVkaW9kYXRhLm8gbXBlZ2F1ZGlvZGVjaGVhZGVyLm8KK09CSlMtJChDT05GSUdfTVAzX01VWEVSKSAgICAgICAgICAgICAgICs9IG1wZWdhdWRpb2RhdGEubyBtcGVnYXVkaW9kZWNoZWFkZXIubworT0JKUy0kKENPTkZJR19NT1ZfREVNVVhFUikgICAgICAgICAgICAgKz0gbXBlZzRhdWRpby5vIG1wZWdhdWRpb2RhdGEubyBhYzN0YWIubworT0JKUy0kKENPTkZJR19NT1ZfTVVYRVIpICAgICAgICAgICAgICAgKz0gbXBlZzRhdWRpby5vIG1wZWdhdWRpb2RhdGEubworT0JKUy0kKENPTkZJR19NUEVHVFNfTVVYRVIpICAgICAgICAgICAgKz0gbXBlZzRhdWRpby5vCitPQkpTLSQoQ09ORklHX01QRUdUU19ERU1VWEVSKSAgICAgICAgICArPSBtcGVnNGF1ZGlvLm8gbXBlZ2F1ZGlvZGF0YS5vCitPQkpTLSQoQ09ORklHX01YRl9NVVhFUikgICAgICAgICAgICAgICArPSBkbnhoZGRhdGEubworT0JKUy0kKENPTkZJR19OVVRfTVVYRVIpICAgICAgICAgICAgICAgKz0gbXBlZ2F1ZGlvZGF0YS5vCitPQkpTLSQoQ09ORklHX09HQV9NVVhFUikgICAgICAgICAgICAgICArPSBmbGFjLm8gZmxhY2RhdGEubworT0JKUy0kKENPTkZJR19PR0dfREVNVVhFUikgICAgICAgICAgICAgKz0gbXBlZzEyZGF0YS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmFjLm8gdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19PR0dfTVVYRVIpICAgICAgICAgICAgICAgKz0gZmxhYy5vIGZsYWNkYXRhLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19SVFBfTVVYRVIpICAgICAgICAgICAgICAgKz0gbXBlZzRhdWRpby5vCitPQkpTLSQoQ09ORklHX1JUUERFQykgICAgICAgICAgICAgICAgICArPSBtanBlZy5vCitPQkpTLSQoQ09ORklHX1NQRElGX0RFTVVYRVIpICAgICAgICAgICArPSBhYWNhZHRzZGVjLm8gbXBlZzRhdWRpby5vCitPQkpTLSQoQ09ORklHX1NQRElGX01VWEVSKSAgICAgICAgICAgICArPSBkY2EubworT0JKUy0kKENPTkZJR19UQUtfREVNVVhFUikgICAgICAgICAgICAgKz0gdGFrLm8KK09CSlMtJChDT05GSUdfV0VCTV9NVVhFUikgICAgICAgICAgICAgICs9IG1wZWc0YXVkaW8ubyBtcGVnYXVkaW9kYXRhLm8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWMubyBmbGFjZGF0YS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc19kYXRhLm8KK09CSlMtJChDT05GSUdfV1RWX0RFTVVYRVIpICAgICAgICAgICAgICs9IG1wZWc0YXVkaW8ubyBtcGVnYXVkaW9kYXRhLm8KKworIyBsaWJhdmZpbHRlciBkZXBlbmRlbmNpZXMKK09CSlMtJChDT05GSUdfRUxCR19GSUxURVIpICAgICAgICAgICAgICs9IGVsYmcubworCisjIGV4dGVybmFsIGNvZGVjIGxpYnJhcmllcworT0JKUy0kKENPTkZJR19MSUJBQUNQTFVTX0VOQ09ERVIpICAgICAgICAgKz0gbGliYWFjcGx1cy5vCitPQkpTLSQoQ09ORklHX0xJQkNFTFRfREVDT0RFUikgICAgICAgICAgICArPSBsaWJjZWx0X2RlYy5vCitPQkpTLSQoQ09ORklHX0xJQkZBQUNfRU5DT0RFUikgICAgICAgICAgICArPSBsaWJmYWFjLm8KK09CSlMtJChDT05GSUdfTElCRkRLX0FBQ19ERUNPREVSKSAgICAgICAgICs9IGxpYmZkay1hYWNkZWMubworT0JKUy0kKENPTkZJR19MSUJGREtfQUFDX0VOQ09ERVIpICAgICAgICAgKz0gbGliZmRrLWFhY2VuYy5vCitPQkpTLSQoQ09ORklHX0xJQkdTTV9ERUNPREVSKSAgICAgICAgICAgICArPSBsaWJnc21kZWMubworT0JKUy0kKENPTkZJR19MSUJHU01fRU5DT0RFUikgICAgICAgICAgICAgKz0gbGliZ3NtZW5jLm8KK09CSlMtJChDT05GSUdfTElCR1NNX01TX0RFQ09ERVIpICAgICAgICAgICs9IGxpYmdzbWRlYy5vCitPQkpTLSQoQ09ORklHX0xJQkdTTV9NU19FTkNPREVSKSAgICAgICAgICArPSBsaWJnc21lbmMubworT0JKUy0kKENPTkZJR19MSUJJTEJDX0RFQ09ERVIpICAgICAgICAgICAgKz0gbGliaWxiYy5vCitPQkpTLSQoQ09ORklHX0xJQklMQkNfRU5DT0RFUikgICAgICAgICAgICArPSBsaWJpbGJjLm8KK09CSlMtJChDT05GSUdfTElCTVAzTEFNRV9FTkNPREVSKSAgICAgICAgICs9IGxpYm1wM2xhbWUubyBtcGVnYXVkaW9kZWNoZWFkZXIubworT0JKUy0kKENPTkZJR19MSUJPUEVOQ09SRV9BTVJOQl9ERUNPREVSKSAgKz0gbGlib3BlbmNvcmUtYW1yLm8KK09CSlMtJChDT05GSUdfTElCT1BFTkNPUkVfQU1STkJfRU5DT0RFUikgICs9IGxpYm9wZW5jb3JlLWFtci5vCitPQkpTLSQoQ09ORklHX0xJQk9QRU5DT1JFX0FNUldCX0RFQ09ERVIpICArPSBsaWJvcGVuY29yZS1hbXIubworT0JKUy0kKENPTkZJR19MSUJPUEVOSlBFR19ERUNPREVSKSAgICAgICAgKz0gbGlib3BlbmpwZWdkZWMubworT0JKUy0kKENPTkZJR19MSUJPUEVOSlBFR19FTkNPREVSKSAgICAgICAgKz0gbGlib3BlbmpwZWdlbmMubworT0JKUy0kKENPTkZJR19MSUJPUFVTX0RFQ09ERVIpICAgICAgICAgICAgKz0gbGlib3B1c2RlYy5vIGxpYm9wdXMubyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19MSUJPUFVTX0VOQ09ERVIpICAgICAgICAgICAgKz0gbGlib3B1c2VuYy5vIGxpYm9wdXMubyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19MSUJTQ0hST0VESU5HRVJfREVDT0RFUikgICAgKz0gbGlic2Nocm9lZGluZ2VyZGVjLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlic2Nocm9lZGluZ2VyLm8KK09CSlMtJChDT05GSUdfTElCU0NIUk9FRElOR0VSX0VOQ09ERVIpICAgICs9IGxpYnNjaHJvZWRpbmdlcmVuYy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnNjaHJvZWRpbmdlci5vCitPQkpTLSQoQ09ORklHX0xJQlNISU5FX0VOQ09ERVIpICAgICAgICAgICArPSBsaWJzaGluZS5vCitPQkpTLSQoQ09ORklHX0xJQlNQRUVYX0RFQ09ERVIpICAgICAgICAgICArPSBsaWJzcGVleGRlYy5vCitPQkpTLSQoQ09ORklHX0xJQlNQRUVYX0VOQ09ERVIpICAgICAgICAgICArPSBsaWJzcGVleGVuYy5vCitPQkpTLSQoQ09ORklHX0xJQlNUQUdFRlJJR0hUX0gyNjRfREVDT0RFUikrPSBsaWJzdGFnZWZyaWdodC5vCitPQkpTLSQoQ09ORklHX0xJQlRIRU9SQV9FTkNPREVSKSAgICAgICAgICArPSBsaWJ0aGVvcmFlbmMubworT0JKUy0kKENPTkZJR19MSUJUV09MQU1FX0VOQ09ERVIpICAgICAgICAgKz0gbGlidHdvbGFtZS5vCitPQkpTLSQoQ09ORklHX0xJQlVUVklERU9fREVDT0RFUikgICAgICAgICArPSBsaWJ1dHZpZGVvZGVjLm8KK09CSlMtJChDT05GSUdfTElCVVRWSURFT19FTkNPREVSKSAgICAgICAgICs9IGxpYnV0dmlkZW9lbmMubworT0JKUy0kKENPTkZJR19MSUJWT19BQUNFTkNfRU5DT0RFUikgICAgICAgKz0gbGlidm8tYWFjZW5jLm8gbXBlZzRhdWRpby5vCitPQkpTLSQoQ09ORklHX0xJQlZPX0FNUldCRU5DX0VOQ09ERVIpICAgICArPSBsaWJ2by1hbXJ3YmVuYy5vCitPQkpTLSQoQ09ORklHX0xJQlZPUkJJU19ERUNPREVSKSAgICAgICAgICArPSBsaWJ2b3JiaXNkZWMubworT0JKUy0kKENPTkZJR19MSUJWT1JCSVNfRU5DT0RFUikgICAgICAgICAgKz0gbGlidm9yYmlzZW5jLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19MSUJWUFhfVlA4X0RFQ09ERVIpICAgICAgICAgKz0gbGlidnB4ZGVjLm8KK09CSlMtJChDT05GSUdfTElCVlBYX1ZQOF9FTkNPREVSKSAgICAgICAgICs9IGxpYnZweGVuYy5vCitPQkpTLSQoQ09ORklHX0xJQlZQWF9WUDlfREVDT0RFUikgICAgICAgICArPSBsaWJ2cHhkZWMubyBsaWJ2cHgubworT0JKUy0kKENPTkZJR19MSUJWUFhfVlA5X0VOQ09ERVIpICAgICAgICAgKz0gbGlidnB4ZW5jLm8gbGlidnB4Lm8KK09CSlMtJChDT05GSUdfTElCV0FWUEFDS19FTkNPREVSKSAgICAgICAgICs9IGxpYndhdnBhY2tlbmMubworT0JKUy0kKENPTkZJR19MSUJXRUJQX0VOQ09ERVIpICAgICAgICAgICAgKz0gbGlid2VicGVuYy5vCitPQkpTLSQoQ09ORklHX0xJQlgyNjRfRU5DT0RFUikgICAgICAgICAgICArPSBsaWJ4MjY0Lm8KK09CSlMtJChDT05GSUdfTElCWDI2NV9FTkNPREVSKSAgICAgICAgICAgICs9IGxpYngyNjUubworT0JKUy0kKENPTkZJR19MSUJYQVZTX0VOQ09ERVIpICAgICAgICAgICAgKz0gbGlieGF2cy5vCitPQkpTLSQoQ09ORklHX0xJQlhWSURfRU5DT0RFUikgICAgICAgICAgICArPSBsaWJ4dmlkLm8KK09CSlMtJChDT05GSUdfTElCWlZCSV9URUxFVEVYVF9ERUNPREVSKSAgICs9IGxpYnp2YmktdGVsZXRleHRkZWMubworCisjIHBhcnNlcnMKK09CSlMtJChDT05GSUdfQUFDX1BBUlNFUikgICAgICAgICAgICAgICs9IGFhY19wYXJzZXIubyBhYWNfYWMzX3BhcnNlci5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhY2FkdHNkZWMubyBtcGVnNGF1ZGlvLm8KK09CSlMtJChDT05GSUdfQUFDX0xBVE1fUEFSU0VSKSAgICAgICAgICs9IGxhdG1fcGFyc2VyLm8KK09CSlMtJChDT05GSUdfQUMzX1BBUlNFUikgICAgICAgICAgICAgICs9IGFjM19wYXJzZXIubyBhYzN0YWIubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYWNfYWMzX3BhcnNlci5vCitPQkpTLSQoQ09ORklHX0FEWF9QQVJTRVIpICAgICAgICAgICAgICArPSBhZHhfcGFyc2VyLm8gYWR4Lm8KK09CSlMtJChDT05GSUdfQk1QX1BBUlNFUikgICAgICAgICAgICAgICs9IGJtcF9wYXJzZXIubworT0JKUy0kKENPTkZJR19DQVZTVklERU9fUEFSU0VSKSAgICAgICAgKz0gY2F2c19wYXJzZXIubworT0JKUy0kKENPTkZJR19DT09LX1BBUlNFUikgICAgICAgICAgICAgKz0gY29va19wYXJzZXIubworT0JKUy0kKENPTkZJR19EQ0FfUEFSU0VSKSAgICAgICAgICAgICAgKz0gZGNhX3BhcnNlci5vIGRjYS5vCitPQkpTLSQoQ09ORklHX0RJUkFDX1BBUlNFUikgICAgICAgICAgICArPSBkaXJhY19wYXJzZXIubworT0JKUy0kKENPTkZJR19ETlhIRF9QQVJTRVIpICAgICAgICAgICAgKz0gZG54aGRfcGFyc2VyLm8KK09CSlMtJChDT05GSUdfRFBYX1BBUlNFUikgICAgICAgICAgICAgICs9IGRweF9wYXJzZXIubworT0JKUy0kKENPTkZJR19EVkJTVUJfUEFSU0VSKSAgICAgICAgICAgKz0gZHZic3ViX3BhcnNlci5vCitPQkpTLSQoQ09ORklHX0RWRF9OQVZfUEFSU0VSKSAgICAgICAgICArPSBkdmRfbmF2X3BhcnNlci5vCitPQkpTLSQoQ09ORklHX0RWRFNVQl9QQVJTRVIpICAgICAgICAgICArPSBkdmRzdWJfcGFyc2VyLm8KK09CSlMtJChDT05GSUdfRkxBQ19QQVJTRVIpICAgICAgICAgICAgICs9IGZsYWNfcGFyc2VyLm8gZmxhY2RhdGEubyBmbGFjLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19HU01fUEFSU0VSKSAgICAgICAgICAgICAgKz0gZ3NtX3BhcnNlci5vCitPQkpTLSQoQ09ORklHX0gyNjFfUEFSU0VSKSAgICAgICAgICAgICArPSBoMjYxX3BhcnNlci5vCitPQkpTLSQoQ09ORklHX0gyNjNfUEFSU0VSKSAgICAgICAgICAgICArPSBoMjYzX3BhcnNlci5vCitPQkpTLSQoQ09ORklHX0gyNjRfUEFSU0VSKSAgICAgICAgICAgICArPSBoMjY0X3BhcnNlci5vCitPQkpTLSQoQ09ORklHX0hFVkNfUEFSU0VSKSAgICAgICAgICAgICArPSBoZXZjX3BhcnNlci5vCitPQkpTLSQoQ09ORklHX01KUEVHX1BBUlNFUikgICAgICAgICAgICArPSBtanBlZ19wYXJzZXIubworT0JKUy0kKENPTkZJR19NTFBfUEFSU0VSKSAgICAgICAgICAgICAgKz0gbWxwX3BhcnNlci5vIG1scC5vCitPQkpTLSQoQ09ORklHX01QRUc0VklERU9fUEFSU0VSKSAgICAgICArPSBtcGVnNHZpZGVvX3BhcnNlci5vIGgyNjMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnNHZpZGVvZGVjLm8gbXBlZzR2aWRlby5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0dWgyNjNkZWMubyBoMjYzZGVjLm8KK09CSlMtJChDT05GSUdfUE5HX1BBUlNFUikgICAgICAgICAgICAgICs9IHBuZ19wYXJzZXIubworT0JKUy0kKENPTkZJR19NUEVHQVVESU9fUEFSU0VSKSAgICAgICAgKz0gbXBlZ2F1ZGlvX3BhcnNlci5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWdhdWRpb2RlY2hlYWRlci5vIG1wZWdhdWRpb2RhdGEubworT0JKUy0kKENPTkZJR19NUEVHVklERU9fUEFSU0VSKSAgICAgICAgKz0gbXBlZ3ZpZGVvX3BhcnNlci5vICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWcxMi5vIG1wZWcxMmRhdGEubworT0JKUy0kKENPTkZJR19PUFVTX1BBUlNFUikgICAgICAgICAgICAgKz0gb3B1c19wYXJzZXIubyBvcHVzLm8gdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19QTkdfUEFSU0VSKSAgICAgICAgICAgICAgKz0gcG5nX3BhcnNlci5vCitPQkpTLSQoQ09ORklHX1BOTV9QQVJTRVIpICAgICAgICAgICAgICArPSBwbm1fcGFyc2VyLm8gcG5tLm8KK09CSlMtJChDT05GSUdfUlYzMF9QQVJTRVIpICAgICAgICAgICAgICs9IHJ2MzRfcGFyc2VyLm8KK09CSlMtJChDT05GSUdfUlY0MF9QQVJTRVIpICAgICAgICAgICAgICs9IHJ2MzRfcGFyc2VyLm8KK09CSlMtJChDT05GSUdfVEFLX1BBUlNFUikgICAgICAgICAgICAgICs9IHRha19wYXJzZXIubyB0YWsubworT0JKUy0kKENPTkZJR19WQzFfUEFSU0VSKSAgICAgICAgICAgICAgKz0gdmMxX3BhcnNlci5vIHZjMS5vIHZjMWRhdGEubyB2YzFkc3AubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc21wZWc0Lm8gbXNtcGVnNGRhdGEubyBtcGVnNHZpZGVvLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2My5vCitPQkpTLSQoQ09ORklHX1ZQM19QQVJTRVIpICAgICAgICAgICAgICArPSB2cDNfcGFyc2VyLm8KK09CSlMtJChDT05GSUdfVlA4X1BBUlNFUikgICAgICAgICAgICAgICs9IHZwOF9wYXJzZXIubworT0JKUy0kKENPTkZJR19WUDlfUEFSU0VSKSAgICAgICAgICAgICAgKz0gdnA5X3BhcnNlci5vCisKKyMgYml0c3RyZWFtIGZpbHRlcnMKK09CSlMtJChDT05GSUdfQUFDX0FEVFNUT0FTQ19CU0YpICAgICAgICAgICs9IGFhY19hZHRzdG9hc2NfYnNmLm8gYWFjYWR0c2RlYy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWc0YXVkaW8ubworT0JKUy0kKENPTkZJR19DSE9NUF9CU0YpICAgICAgICAgICAgICAgICAgKz0gY2hvbXBfYnNmLm8KK09CSlMtJChDT05GSUdfRFVNUF9FWFRSQURBVEFfQlNGKSAgICAgICAgICs9IGR1bXBfZXh0cmFkYXRhX2JzZi5vCitPQkpTLSQoQ09ORklHX0gyNjRfTVA0VE9BTk5FWEJfQlNGKSAgICAgICArPSBoMjY0X21wNHRvYW5uZXhiX2JzZi5vCitPQkpTLSQoQ09ORklHX0lNWF9EVU1QX0hFQURFUl9CU0YpICAgICAgICArPSBpbXhfZHVtcF9oZWFkZXJfYnNmLm8KK09CSlMtJChDT05GSUdfTUpQRUcySlBFR19CU0YpICAgICAgICAgICAgICs9IG1qcGVnMmpwZWdfYnNmLm8gbWpwZWcubworT0JKUy0kKENPTkZJR19NSlBFR0FfRFVNUF9IRUFERVJfQlNGKSAgICAgKz0gbWpwZWdhX2R1bXBfaGVhZGVyX2JzZi5vCitPQkpTLSQoQ09ORklHX01PVjJURVhUU1VCX0JTRikgICAgICAgICAgICArPSBtb3ZzdWJfYnNmLm8KK09CSlMtJChDT05GSUdfTVAzX0hFQURFUl9ERUNPTVBSRVNTX0JTRikgICs9IG1wM19oZWFkZXJfZGVjb21wcmVzc19ic2YubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnYXVkaW9kYXRhLm8KK09CSlMtJChDT05GSUdfTk9JU0VfQlNGKSAgICAgICAgICAgICAgICAgICs9IG5vaXNlX2JzZi5vCitPQkpTLSQoQ09ORklHX1JFTU9WRV9FWFRSQURBVEFfQlNGKSAgICAgICArPSByZW1vdmVfZXh0cmFkYXRhX2JzZi5vCitPQkpTLSQoQ09ORklHX1RFWFQyTU9WU1VCX0JTRikgICAgICAgICAgICArPSBtb3ZzdWJfYnNmLm8KKworIyB0aHJlYWQgbGlicmFyaWVzCitPQkpTLSQoSEFWRV9MSUJDX01TVkNSVCkgICAgICAgICAgICAgICArPSBmaWxlX29wZW4ubworT0JKUy0kKEhBVkVfVEhSRUFEUykgICAgICAgICAgICAgICAgICAgKz0gcHRocmVhZC5vIHB0aHJlYWRfc2xpY2UubyBwdGhyZWFkX2ZyYW1lLm8KKworT0JKUy0kKENPTkZJR19GUkFNRV9USFJFQURfRU5DT0RFUikgICAgKz0gZnJhbWVfdGhyZWFkX2VuY29kZXIubworCisjIFdpbmRvd3MgcmVzb3VyY2UgZmlsZQorU0xJQk9CSlMtJChIQVZFX0dOVV9XSU5EUkVTKSAgICAgICAgICAgKz0gYXZjb2RlY3Jlcy5vCisKK1NLSVBIRUFERVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9ICVfdGFibGVnZW4uaCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVfdGFibGVzLmggICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhY190YWJsZWdlbl9kZWNsLmggICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmdC1pbnRlcm5hbC5oICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnV0dmlkZW8uaCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9jb2RlY19pZHMuaCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcHJpbnQuaCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQVJDSCkvdnA1Nl9hcml0aC5oICAgICAgICAgIFwKKworU0tJUEhFQURFUlMtJChDT05GSUdfRFhWQTIpICAgICAgICAgICAgKz0gZHh2YTIuaCBkeHZhMl9pbnRlcm5hbC5oCitTS0lQSEVBREVSUy0kKENPTkZJR19MSUJTQ0hST0VESU5HRVIpICArPSBsaWJzY2hyb2VkaW5nZXIuaAorU0tJUEhFQURFUlMtJChDT05GSUdfTElCVVRWSURFTykgICAgICAgKz0gbGlidXR2aWRlby5oCitTS0lQSEVBREVSUy0kKENPTkZJR19YVk1DKSAgICAgICAgICAgICArPSB4dm1jLmgKK1NLSVBIRUFERVJTLSQoQ09ORklHX1ZBQVBJKSAgICAgICAgICAgICs9IHZhYXBpX2ludGVybmFsLmgKK1NLSVBIRUFERVJTLSQoQ09ORklHX1ZEQSkgICAgICAgICAgICAgICs9IHZkYS5oIHZkYV9pbnRlcm5hbC5oCitTS0lQSEVBREVSUy0kKENPTkZJR19WRFBBVSkgICAgICAgICAgICArPSB2ZHBhdS5oIHZkcGF1X2ludGVybmFsLmgKKworVEVTVFBST0dTID0gaW1nY29udmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitURVNUUFJPR1MtJChDT05GSUdfQ0FCQUMpICAgICAgICAgICAgICAgICArPSBjYWJhYworVEVTVFBST0dTLSQoQ09ORklHX0ZGVCkgICAgICAgICAgICAgICAgICAgKz0gZmZ0IGZmdC1maXhlZCBmZnQtZml4ZWQzMgorVEVTVFBST0dTLSQoQ09ORklHX0lEQ1REU1ApICAgICAgICAgICAgICAgKz0gZGN0CitURVNUUFJPR1MtJChDT05GSUdfSUlSRklMVEVSKSAgICAgICAgICAgICArPSBpaXJmaWx0ZXIKK1RFU1RQUk9HUy0kKEhBVkVfTU1YKSAgICAgICAgICAgICAgICAgICAgICs9IG1vdGlvbgorVEVTVFBST0dTLSQoQ09ORklHX0dPTE9NQikgICAgICAgICAgICAgICAgKz0gZ29sb21iCitURVNUUFJPR1MtJChDT05GSUdfUkFOR0VDT0RFUikgICAgICAgICAgICArPSByYW5nZWNvZGVyCitURVNUUFJPR1MtJChDT05GSUdfU05PV19FTkNPREVSKSAgICAgICAgICArPSBzbm93ZW5jCisKK1RFU1RPQkpTID0gZGN0cmVmLm8KKworVE9PTFMgPSBmb3VyY2MycGl4Zm10CisKK0hPU1RQUk9HUyA9IGFhY190YWJsZWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFhY3BzX3RhYmxlZ2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFhY3Nicl90YWJsZWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNhYmFjX3RhYmxlZ2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNicnRfdGFibGVnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvc190YWJsZWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzZF90YWJsZWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGR2X3RhYmxlZ2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1vdGlvbnBpeGVsc190YWJsZWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1wZWdhdWRpb190YWJsZWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHBjbV90YWJsZWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHFkbTJfdGFibGVnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpbmV3aW5fdGFibGVnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworQ0xFQU5GSUxFUyA9ICpfdGFibGVzLmMgKl90YWJsZXMuaCAqX3RhYmxlZ2VuJChIT1NURVhFU1VGKQorCiskKFNVQkRJUilkY3QtdGVzdCQoRVhFU1VGKTogJChTVUJESVIpZGN0cmVmLm8gJChTVUJESVIpYWFuZGN0dGFiLm8KKyQoU1VCRElSKWR2X3RhYmxlZ2VuJChIT1NURVhFU1VGKTogJChTVUJESVIpZHZkYXRhX2hvc3QubworCitUUklHX1RBQkxFUyAgPSBjb3MgY29zX2ZpeGVkIHNpbgorVFJJR19UQUJMRVMgOj0gJChUUklHX1RBQkxFUzolPSQoU1VCRElSKSVfdGFibGVzLmMpCisKKyQoVFJJR19UQUJMRVMpOiAkKFNVQkRJUiklX3RhYmxlcy5jOiAkKFNVQkRJUiljb3NfdGFibGVnZW4kKEhPU1RFWEVTVUYpCisJJChNKS4vJDwgJCogPiAkQAorCitpZmRlZiBDT05GSUdfU01BTEwKKyQoU1VCRElSKSVfdGFibGVnZW4kKEhPU1RFWEVTVUYpOiBIT1NUQ0ZMQUdTICs9IC1EQ09ORklHX1NNQUxMPTEKK2Vsc2UKKyQoU1VCRElSKSVfdGFibGVnZW4kKEhPU1RFWEVTVUYpOiBIT1NUQ0ZMQUdTICs9IC1EQ09ORklHX1NNQUxMPTAKK2VuZGlmCisKK0dFTl9IRUFERVJTID0gY2FiYWNfdGFibGVzLmggY2JydF90YWJsZXMuaCBhYWNwc190YWJsZXMuaCBhYWNzYnJfdGFibGVzLmggYWFjX3RhYmxlcy5oIGRzZF90YWJsZXMuaCBkdl90YWJsZXMuaCAgICAgXAorICAgICAgICAgICAgICBzaW5ld2luX3RhYmxlcy5oIG1wZWdhdWRpb190YWJsZXMuaCBtb3Rpb25waXhlbHNfdGFibGVzLmggXAorICAgICAgICAgICAgICBwY21fdGFibGVzLmggcWRtMl90YWJsZXMuaAorR0VOX0hFQURFUlMgOj0gJChhZGRwcmVmaXggJChTVUJESVIpLCAkKEdFTl9IRUFERVJTKSkKKworJChHRU5fSEVBREVSUyk6ICQoU1VCRElSKSVfdGFibGVzLmg6ICQoU1VCRElSKSVfdGFibGVnZW4kKEhPU1RFWEVTVUYpCisJJChNKS4vJDwgPiAkQAorCitpZmRlZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUworJChTVUJESVIpYWFjZGVjLm86ICQoU1VCRElSKWNicnRfdGFibGVzLmgKKyQoU1VCRElSKWFhY3BzLm86ICQoU1VCRElSKWFhY3BzX3RhYmxlcy5oCiskKFNVQkRJUilhYWNzYnIubzogJChTVUJESVIpYWFjc2JyX3RhYmxlcy5oCiskKFNVQkRJUilhYWN0YWIubzogJChTVUJESVIpYWFjX3RhYmxlcy5oCiskKFNVQkRJUiljYWJhYy5vOiAkKFNVQkRJUiljYWJhY190YWJsZXMuaAorJChTVUJESVIpZHNkZGVjLm86ICQoU1VCRElSKWRzZF90YWJsZXMuaAorJChTVUJESVIpZHZlbmMubzogJChTVUJESVIpZHZfdGFibGVzLmgKKyQoU1VCRElSKXNpbmV3aW4ubzogJChTVUJESVIpc2luZXdpbl90YWJsZXMuaAorJChTVUJESVIpbXBlZ2F1ZGlvZGVjX2ZpeGVkLm86ICQoU1VCRElSKW1wZWdhdWRpb190YWJsZXMuaAorJChTVUJESVIpbXBlZ2F1ZGlvZGVjX2Zsb2F0Lm86ICQoU1VCRElSKW1wZWdhdWRpb190YWJsZXMuaAorJChTVUJESVIpbW90aW9ucGl4ZWxzLm86ICQoU1VCRElSKW1vdGlvbnBpeGVsc190YWJsZXMuaAorJChTVUJESVIpcGNtLm86ICQoU1VCRElSKXBjbV90YWJsZXMuaAorJChTVUJESVIpcWRtMi5vOiAkKFNVQkRJUilxZG0yX3RhYmxlcy5oCitlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYTY0Y29sb3JzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hNjRjb2xvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWNkYjZmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYTY0Y29sb3JzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIGE2NCB2aWRlbyBlbmNvZGVyIC0gYzY0IGNvbG9ycyBpbiByZ2IgKFBlcHRvKQorICogQ29weXJpZ2h0IChjKSAyMDA5IFRvYmlhcyBCaW5kaGFtbWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGE2NCB2aWRlbyBlbmNvZGVyIC0gYzY0IGNvbG9ycyBpbiByZ2IKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQTY0Q09MT1JTX0gKKyNkZWZpbmUgQVZDT0RFQ19BNjRDT0xPUlNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIGM2NCBwYWxldHRlIGluIFJHQiAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYTY0X3BhbGV0dGVbMTZdWzNdID0geworICAgIHsweDAwLCAweDAwLCAweDAwfSwKKyAgICB7MHhmZiwgMHhmZiwgMHhmZn0sCisgICAgezB4NjgsIDB4MzcsIDB4MmJ9LAorICAgIHsweDcwLCAweGE0LCAweGIyfSwKKyAgICB7MHg2ZiwgMHgzZCwgMHg4Nn0sCisgICAgezB4NTgsIDB4OGQsIDB4NDN9LAorICAgIHsweDM1LCAweDI4LCAweDc5fSwKKyAgICB7MHhiOCwgMHhjNywgMHg2Zn0sCisgICAgezB4NmYsIDB4NGYsIDB4MjV9LAorICAgIHsweDQzLCAweDM5LCAweDAwfSwKKyAgICB7MHg5YSwgMHg2NywgMHg1OX0sCisgICAgezB4NDQsIDB4NDQsIDB4NDR9LAorICAgIHsweDZjLCAweDZjLCAweDZjfSwKKyAgICB7MHg5YSwgMHhkMiwgMHg4NH0sCisgICAgezB4NmMsIDB4NWUsIDB4YjV9LAorICAgIHsweDk1LCAweDk1LCAweDk1fSwKK307CisKKyNlbmRpZiAvKiBBVkNPREVDX0E2NENPTE9SU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hNjRtdWx0aWVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYTY0bXVsdGllbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzAwZDNmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYTY0bXVsdGllbmMuYwpAQCAtMCwwICsxLDQyNCBAQAorLyoKKyAqIGE2NCB2aWRlbyBlbmNvZGVyIC0gbXVsdGljb2xvciBtb2RlcworICogQ29weXJpZ2h0IChjKSAyMDA5IFRvYmlhcyBCaW5kaGFtbWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGE2NCB2aWRlbyBlbmNvZGVyIC0gbXVsdGljb2xvciBtb2RlcworICovCisKKyNpbmNsdWRlICJhNjRjb2xvcnMuaCIKKyNpbmNsdWRlICJhNjR0YWJsZXMuaCIKKyNpbmNsdWRlICJlbGJnLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjZGVmaW5lIERJVEhFUlNURVBTICAgOAorI2RlZmluZSBDSEFSU0VUX0NIQVJTIDI1NgorI2RlZmluZSBJTlRFUkxBQ0VEICAgIDEKKyNkZWZpbmUgQ1JPUF9TQ1JFRU5TICAxCisKKyNkZWZpbmUgQzY0WFJFUyAzMjAKKyNkZWZpbmUgQzY0WVJFUyAyMDAKKwordHlwZWRlZiBzdHJ1Y3QgQTY0Q29udGV4dCB7CisgICAgLyogdmFyaWFibGVzIGZvciBtdWx0aWNvbG9yIG1vZGVzICovCisgICAgQVZMRkcgcmFuZGN0eDsKKyAgICBpbnQgbWNfbGlmZXRpbWU7CisgICAgaW50IG1jX3VzZV81Y29sOworICAgIHVuc2lnbmVkIG1jX2ZyYW1lX2NvdW50ZXI7CisgICAgaW50ICptY19tZXRhX2NoYXJzZXQ7CisgICAgaW50ICptY19jaGFybWFwOworICAgIGludCAqbWNfYmVzdF9jYjsKKyAgICBpbnQgbWNfbHVtYV92YWxzWzVdOworICAgIHVpbnQ4X3QgKm1jX2NoYXJzZXQ7CisgICAgdWludDhfdCAqbWNfY29scmFtOworICAgIHVpbnQ4X3QgKm1jX3BhbGV0dGU7CisgICAgaW50IG1jX3BhbF9zaXplOworCisgICAgLyogcHRzIG9mIHRoZSBuZXh0IHBhY2tldCB0aGF0IHdpbGwgYmUgb3V0cHV0ICovCisgICAgaW50NjRfdCBuZXh0X3B0czsKK30gQTY0Q29udGV4dDsKKworLyogZ3JheSBncmFkaWVudCAqLworc3RhdGljIGNvbnN0IGludCBtY19jb2xvcnNbNV09ezB4MCwweGIsMHhjLDB4ZiwweDF9OworCisvKiBvdGhlciBwb3NzaWJsZSBncmFkaWVudHMgLSB0byBiZSB0ZXN0ZWQgKi8KKy8vc3RhdGljIGNvbnN0IGludCBtY19jb2xvcnNbNV09ezB4MCwweDgsMHhhLDB4ZiwweDd9OworLy9zdGF0aWMgY29uc3QgaW50IG1jX2NvbG9yc1s1XT17MHgwLDB4OSwweDgsMHhhLDB4M307CisKK3N0YXRpYyB2b2lkIHRvX21ldGFfd2l0aF9jcm9wKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwgaW50ICpkZXN0KQoreworICAgIGludCBibG9ja3gsIGJsb2NreSwgeCwgeTsKKyAgICBpbnQgbHVtYSA9IDA7CisgICAgaW50IGhlaWdodCA9IEZGTUlOKGF2Y3R4LT5oZWlnaHQsIEM2NFlSRVMpOworICAgIGludCB3aWR0aCAgPSBGRk1JTihhdmN0eC0+d2lkdGggLCBDNjRYUkVTKTsKKyAgICB1aW50OF90ICpzcmMgPSBwLT5kYXRhWzBdOworCisgICAgZm9yIChibG9ja3kgPSAwOyBibG9ja3kgPCBDNjRZUkVTOyBibG9ja3kgKz0gOCkgeworICAgICAgICBmb3IgKGJsb2NreCA9IDA7IGJsb2NreCA8IEM2NFhSRVM7IGJsb2NreCArPSA4KSB7CisgICAgICAgICAgICBmb3IgKHkgPSBibG9ja3k7IHkgPCBibG9ja3kgKyA4ICYmIHkgPCBDNjRZUkVTOyB5KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSBibG9ja3g7IHggPCBibG9ja3ggKyA4ICYmIHggPCBDNjRYUkVTOyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoeCA8IHdpZHRoICYmIHkgPCBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkIGF2ZXJhZ2Ugb3ZlciAyIHBpeGVscyAqLworICAgICAgICAgICAgICAgICAgICAgICAgbHVtYSA9IChzcmNbKHggKyAwICsgeSAqIHAtPmxpbmVzaXplWzBdKV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbKHggKyAxICsgeSAqIHAtPmxpbmVzaXplWzBdKV0pIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGJsb2NrcyBhcyBsaW5lYXIgZGF0YSBub3cgc28gdGhleSBhcmUgc3VpdGFibGUgZm9yIGVsYmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbMF0gPSBsdW1hOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlc3QrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlbmRlcl9jaGFyc2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdWludDhfdCAqY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNvbHJhbW1hcCkKK3sKKyAgICBBNjRDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90IHJvdzEsIHJvdzI7CisgICAgaW50IGNoYXJwb3MsIHgsIHk7CisgICAgaW50IGEsIGI7CisgICAgdWludDhfdCBwaXg7CisgICAgaW50IGxvd2RpZmYsIGhpZ2hkaWZmOworICAgIGludCAqYmVzdF9jYiA9IGMtPm1jX2Jlc3RfY2I7CisgICAgc3RhdGljIHVpbnQ4X3QgaW5kZXgxWzI1Nl07CisgICAgc3RhdGljIHVpbnQ4X3QgaW5kZXgyWzI1Nl07CisgICAgc3RhdGljIHVpbnQ4X3QgZGl0aGVyWzI1Nl07CisgICAgaW50IGk7CisgICAgaW50IGRpc3RhbmNlOworCisgICAgLyogZ2VuZXJhdGUgbG9va3VwLXRhYmxlcyBmb3IgZGl0aGVyIGFuZCBpbmRleCBiZWZvcmUgbG9vcGluZyAqLworICAgIGkgPSAwOworICAgIGZvciAoYT0wOyBhIDwgMjU2OyBhKyspIHsKKyAgICAgICAgaWYoaSA8IGMtPm1jX3BhbF9zaXplIC0xICYmIGEgPT0gYy0+bWNfbHVtYV92YWxzW2kgKyAxXSkgeworICAgICAgICAgICAgZGlzdGFuY2UgPSBjLT5tY19sdW1hX3ZhbHNbaSArIDFdIC0gYy0+bWNfbHVtYV92YWxzW2ldOworICAgICAgICAgICAgZm9yKGIgPSAwOyBiIDw9IGRpc3RhbmNlOyBiKyspIHsKKyAgICAgICAgICAgICAgICAgIGRpdGhlcltjLT5tY19sdW1hX3ZhbHNbaV0gKyBiXSA9IGIgKiAoRElUSEVSU1RFUFMgLSAxKSAvIGRpc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGlmKGkgPj0gYy0+bWNfcGFsX3NpemUgLSAxKSBkaXRoZXJbYV0gPSAwOworICAgICAgICBpbmRleDFbYV0gPSBpOworICAgICAgICBpbmRleDJbYV0gPSBGRk1JTihpICsgMSwgYy0+bWNfcGFsX3NpemUgLSAxKTsKKyAgICB9CisKKyAgICAvKiBhbmQgcmVuZGVyIGNoYXJzZXQgKi8KKyAgICBmb3IgKGNoYXJwb3MgPSAwOyBjaGFycG9zIDwgQ0hBUlNFVF9DSEFSUzsgY2hhcnBvcysrKSB7CisgICAgICAgIGxvd2RpZmYgID0gMDsKKyAgICAgICAgaGlnaGRpZmYgPSAwOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgICAgICByb3cxID0gMDsgcm93MiA9IDA7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7CisgICAgICAgICAgICAgICAgcGl4ID0gYmVzdF9jYlt5ICogNCArIHhdOworCisgICAgICAgICAgICAgICAgLyogYWNjdW11bGF0ZSBlcnJvciBmb3IgYnJpZ2h0ZXN0L2Rhcmtlc3QgY29sb3IgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXgxW3BpeF0gPj0gMykKKyAgICAgICAgICAgICAgICAgICAgaGlnaGRpZmYgKz0gcGl4IC0gYy0+bWNfbHVtYV92YWxzWzNdOworICAgICAgICAgICAgICAgIGlmIChpbmRleDFbcGl4XSA8IDEpCisgICAgICAgICAgICAgICAgICAgIGxvd2RpZmYgKz0gYy0+bWNfbHVtYV92YWxzWzFdIC0gcGl4OworCisgICAgICAgICAgICAgICAgcm93MSA8PD0gMjsKKworICAgICAgICAgICAgICAgIGlmIChJTlRFUkxBQ0VEKSB7CisgICAgICAgICAgICAgICAgICAgIHJvdzIgPDw9IDI7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmxhY2VkX2RpdGhlcl9wYXR0ZXJuc1tkaXRoZXJbcGl4XV1bKHkgJiAzKSAqIDIgKyAwXVt4ICYgM10pCisgICAgICAgICAgICAgICAgICAgICAgICByb3cxIHw9IDMtKGluZGV4MltwaXhdICYgMyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdzEgfD0gMy0oaW5kZXgxW3BpeF0gJiAzKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJsYWNlZF9kaXRoZXJfcGF0dGVybnNbZGl0aGVyW3BpeF1dWyh5ICYgMykgKiAyICsgMV1beCAmIDNdKQorICAgICAgICAgICAgICAgICAgICAgICAgcm93MiB8PSAzLShpbmRleDJbcGl4XSAmIDMpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByb3cyIHw9IDMtKGluZGV4MVtwaXhdICYgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlfZGl0aGVyX3BhdHRlcm5zW2RpdGhlcltwaXhdXVsoeSAmIDMpXVt4ICYgM10pCisgICAgICAgICAgICAgICAgICAgICAgICByb3cxIHw9IDMtKGluZGV4MltwaXhdICYgMyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdzEgfD0gMy0oaW5kZXgxW3BpeF0gJiAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyc2V0W3krMHgwMDBdID0gcm93MTsKKyAgICAgICAgICAgIGlmIChJTlRFUkxBQ0VEKSBjaGFyc2V0W3krMHg4MDBdID0gcm93MjsKKyAgICAgICAgfQorICAgICAgICAvKiBkbyB3ZSBuZWVkIHRvIGFkanVzdCBwaXhlbHM/ICovCisgICAgICAgIGlmIChoaWdoZGlmZiA+IDAgJiYgbG93ZGlmZiA+IDAgJiYgYy0+bWNfdXNlXzVjb2wpIHsKKyAgICAgICAgICAgIGlmIChsb3dkaWZmID4gaGlnaGRpZmYpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgMzI7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9jYlt4XSA9IEZGTUlOKGMtPm1jX2x1bWFfdmFsc1szXSwgYmVzdF9jYlt4XSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAzMjsgeCsrKQorICAgICAgICAgICAgICAgICAgICBiZXN0X2NiW3hdID0gRkZNQVgoYy0+bWNfbHVtYV92YWxzWzFdLCBiZXN0X2NiW3hdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXJwb3MtLTsgICAgICAgICAgLyogcmVkbyBub3cgYWRqdXN0ZWQgY2hhciAqLworICAgICAgICAvKiBubyBhZGp1c3RtZW50IG5lZWRlZCwgYWxsIGZpbmUgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGFkdmFuY2UgcG9pbnRlcnMgKi8KKyAgICAgICAgICAgIGJlc3RfY2IgKz0gMzI7CisgICAgICAgICAgICBjaGFyc2V0ICs9IDg7CisKKyAgICAgICAgICAgIC8qIHJlbWVtYmVyIGNvbG9ycmFtIHZhbHVlICovCisgICAgICAgICAgICBjb2xyYW1tYXBbY2hhcnBvc10gPSAoaGlnaGRpZmYgPiAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGE2NG11bHRpX2Nsb3NlX2VuY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEE2NENvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisgICAgYXZfZnJlZXAoJmMtPm1jX21ldGFfY2hhcnNldCk7CisgICAgYXZfZnJlZXAoJmMtPm1jX2Jlc3RfY2IpOworICAgIGF2X2ZyZWVwKCZjLT5tY19jaGFyc2V0KTsKKyAgICBhdl9mcmVlcCgmYy0+bWNfY2hhcm1hcCk7CisgICAgYXZfZnJlZXAoJmMtPm1jX2NvbHJhbSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhNjRtdWx0aV9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQTY0Q29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGE7CisgICAgYXZfbGZnX2luaXQoJmMtPnJhbmRjdHgsIDEpOworCisgICAgaWYgKGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSA8IDEpIHsKKyAgICAgICAgYy0+bWNfbGlmZXRpbWUgPSA0OworICAgIH0gZWxzZSB7CisgICAgICAgIGMtPm1jX2xpZmV0aW1lID0gYXZjdHgtPmdsb2JhbF9xdWFsaXR5IC89IEZGX1FQMkxBTUJEQTsKKyAgICB9CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiY2hhcnNldCBsaWZldGltZSBzZXQgdG8gJWQgZnJhbWUocylcbiIsIGMtPm1jX2xpZmV0aW1lKTsKKworICAgIGMtPm1jX2ZyYW1lX2NvdW50ZXIgPSAwOworICAgIGMtPm1jX3VzZV81Y29sICAgICAgPSBhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX0E2NF9NVUxUSTU7CisgICAgYy0+bWNfcGFsX3NpemUgICAgICA9IDQgKyBjLT5tY191c2VfNWNvbDsKKworICAgIC8qIHByZWNhbGMgbHVtYSB2YWx1ZXMgZm9yIGxhdGVyIHVzZSAqLworICAgIGZvciAoYSA9IDA7IGEgPCBjLT5tY19wYWxfc2l6ZTsgYSsrKSB7CisgICAgICAgIGMtPm1jX2x1bWFfdmFsc1thXT1hNjRfcGFsZXR0ZVttY19jb2xvcnNbYV1dWzBdICogMC4zMCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhNjRfcGFsZXR0ZVttY19jb2xvcnNbYV1dWzFdICogMC41OSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhNjRfcGFsZXR0ZVttY19jb2xvcnNbYV1dWzJdICogMC4xMTsKKyAgICB9CisKKyAgICBpZiAoIShjLT5tY19tZXRhX2NoYXJzZXQgPSBhdl9tYWxsb2NfYXJyYXkoYy0+bWNfbGlmZXRpbWUsIDMyMDAwICogc2l6ZW9mKGludCkpKSB8fAorICAgICAgICEoYy0+bWNfYmVzdF9jYiAgICAgICA9IGF2X21hbGxvYyhDSEFSU0VUX0NIQVJTICogMzIgKiBzaXplb2YoaW50KSkpICAgICB8fAorICAgICAgICEoYy0+bWNfY2hhcm1hcCAgICAgICA9IGF2X21hbGxvY3pfYXJyYXkoYy0+bWNfbGlmZXRpbWUsIDEwMDAgKiBzaXplb2YoaW50KSkpIHx8CisgICAgICAgIShjLT5tY19jb2xyYW0gICAgICAgID0gYXZfbWFsbG9jeihDSEFSU0VUX0NIQVJTICogc2l6ZW9mKHVpbnQ4X3QpKSkgICAgIHx8CisgICAgICAgIShjLT5tY19jaGFyc2V0ICAgICAgID0gYXZfbWFsbG9jKDB4ODAwICogKElOVEVSTEFDRUQrMSkgKiBzaXplb2YodWludDhfdCkpKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgbWVtb3J5LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLyogc2V0IHVwIGV4dHJhZGF0YSAqLworICAgIGlmICghKGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KDggKiA0ICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZXh0cmFkYXRhLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IDggKiA0OworICAgIEFWX1dCMzIoYXZjdHgtPmV4dHJhZGF0YSwgYy0+bWNfbGlmZXRpbWUpOworICAgIEFWX1dCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDE2LCBJTlRFUkxBQ0VEKTsKKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpIHsKKyAgICAgICAgYTY0bXVsdGlfY2xvc2VfZW5jb2RlcihhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgaWYgKCFhdmN0eC0+Y29kZWNfdGFnKQorICAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IEFWX1JMMzIoImE2NG0iKTsKKworICAgIGMtPm5leHRfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYTY0X2NvbXByZXNzX2NvbHJhbSh1bnNpZ25lZCBjaGFyICpidWYsIGludCAqY2hhcm1hcCwgdWludDhfdCAqY29scmFtKQoreworICAgIGludCBhOworICAgIHVpbnQ4X3QgdGVtcDsKKyAgICAvKiBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgaW4gNWNvbCBtb2RlICovCisgICAgLyogWFhYIGNvdWxkIGJlIHNxdWVlemVkIHRvIDB4ODAgYnl0ZXMgKi8KKyAgICBmb3IgKGEgPSAwOyBhIDwgMjU2OyBhKyspIHsKKyAgICAgICAgdGVtcCAgPSBjb2xyYW1bY2hhcm1hcFthICsgMHgwMDBdXSA8PCAwOworICAgICAgICB0ZW1wIHw9IGNvbHJhbVtjaGFybWFwW2EgKyAweDEwMF1dIDw8IDE7CisgICAgICAgIHRlbXAgfD0gY29scmFtW2NoYXJtYXBbYSArIDB4MjAwXV0gPDwgMjsKKyAgICAgICAgaWYgKGEgPCAweGU4KSB0ZW1wIHw9IGNvbHJhbVtjaGFybWFwW2EgKyAweDMwMF1dIDw8IDM7CisgICAgICAgIGJ1ZlthXSA9IHRlbXAgPDwgMjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgYTY0bXVsdGlfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpY3QsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBBNjRDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpjb25zdCBwID0gYXZjdHgtPmNvZGVkX2ZyYW1lOworCisgICAgaW50IGZyYW1lOworICAgIGludCB4LCB5OworICAgIGludCBiX2hlaWdodDsKKyAgICBpbnQgYl93aWR0aDsKKworICAgIGludCByZXFfc2l6ZSwgcmV0OworICAgIHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7CisKKyAgICBpbnQgKmNoYXJtYXAgICAgID0gYy0+bWNfY2hhcm1hcDsKKyAgICB1aW50OF90ICpjb2xyYW0gID0gYy0+bWNfY29scmFtOworICAgIHVpbnQ4X3QgKmNoYXJzZXQgPSBjLT5tY19jaGFyc2V0OworICAgIGludCAqbWV0YSAgICAgICAgPSBjLT5tY19tZXRhX2NoYXJzZXQ7CisgICAgaW50ICpiZXN0X2NiICAgICA9IGMtPm1jX2Jlc3RfY2I7CisKKyAgICBpbnQgY2hhcnNldF9zaXplID0gMHg4MDAgKiAoSU5URVJMQUNFRCArIDEpOworICAgIGludCBjb2xyYW1fc2l6ZSAgPSAweDEwMCAqIGMtPm1jX3VzZV81Y29sOworICAgIGludCBzY3JlZW5fc2l6ZTsKKworICAgIGlmKENST1BfU0NSRUVOUykgeworICAgICAgICBiX2hlaWdodCA9IEZGTUlOKGF2Y3R4LT5oZWlnaHQsQzY0WVJFUykgPj4gMzsKKyAgICAgICAgYl93aWR0aCAgPSBGRk1JTihhdmN0eC0+d2lkdGggLEM2NFhSRVMpID4+IDM7CisgICAgICAgIHNjcmVlbl9zaXplID0gYl93aWR0aCAqIGJfaGVpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIGJfaGVpZ2h0ID0gQzY0WVJFUyA+PiAzOworICAgICAgICBiX3dpZHRoICA9IEM2NFhSRVMgPj4gMzsKKyAgICAgICAgc2NyZWVuX3NpemUgPSAweDQwMDsKKyAgICB9CisKKyAgICAvKiBubyBkYXRhLCBtZWFucyBlbmQgZW5jb2RpbmcgYXNhcCAqLworICAgIGlmICghcGljdCkgeworICAgICAgICAvKiBhbGwgZG9uZSwgZW5kIGVuY29kaW5nICovCisgICAgICAgIGlmICghYy0+bWNfbGlmZXRpbWUpIHJldHVybiAwOworICAgICAgICAvKiBubyBtb3JlIGZyYW1lcyBpbiBxdWV1ZSwgcHJlcGFyZSB0byBmbHVzaCByZW1haW5pbmcgZnJhbWVzICovCisgICAgICAgIGlmICghYy0+bWNfZnJhbWVfY291bnRlcikgeworICAgICAgICAgICAgYy0+bWNfbGlmZXRpbWUgPSAwOworICAgICAgICB9CisgICAgICAgIC8qIHN0aWxsIGZyYW1lcyBpbiBxdWV1ZSBzbyBsaW1pdCBsaWZldGltZSB0byByZW1haW5pbmcgZnJhbWVzICovCisgICAgICAgIGVsc2UgYy0+bWNfbGlmZXRpbWUgPSBjLT5tY19mcmFtZV9jb3VudGVyOworICAgIC8qIHN0aWxsIG5ldyBkYXRhIGF2YWlsYWJsZSAqLworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGZpbGwgdXAgbWNfbWV0YV9jaGFyc2V0IHdpdGggZGF0YSB1bnRpbCBsaWZldGltZSBleGNlZWRzICovCisgICAgICAgIGlmIChjLT5tY19mcmFtZV9jb3VudGVyIDwgYy0+bWNfbGlmZXRpbWUpIHsKKyAgICAgICAgICAgICpwID0gKnBpY3Q7CisgICAgICAgICAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgICAgIHAtPmtleV9mcmFtZSA9IDE7CisgICAgICAgICAgICB0b19tZXRhX3dpdGhfY3JvcChhdmN0eCwgcCwgbWV0YSArIDMyMDAwICogYy0+bWNfZnJhbWVfY291bnRlcik7CisgICAgICAgICAgICBjLT5tY19mcmFtZV9jb3VudGVyKys7CisgICAgICAgICAgICBpZiAoYy0+bmV4dF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgYy0+bmV4dF9wdHMgPSBwaWN0LT5wdHM7CisgICAgICAgICAgICAvKiBsaWZldGltZSBpcyBub3QgcmVhY2hlZCBzbyB3YWl0IGZvciBuZXh0IGZyYW1lIGZpcnN0ICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGxpZmV0aW1lIHJlYWNoZWQgc28gbm93IGNvbnZlcnQgWCBmcmFtZXMgYXQgb25jZSAqLworICAgIGlmIChjLT5tY19mcmFtZV9jb3VudGVyID09IGMtPm1jX2xpZmV0aW1lKSB7CisgICAgICAgIHJlcV9zaXplID0gMDsKKyAgICAgICAgLyogYW55IGZyYW1lcyB0byBlbmNvZGU/ICovCisgICAgICAgIGlmIChjLT5tY19saWZldGltZSkgeworICAgICAgICAgICAgcmVxX3NpemUgPSBjaGFyc2V0X3NpemUgKyBjLT5tY19saWZldGltZSooc2NyZWVuX3NpemUgKyBjb2xyYW1fc2l6ZSk7CisgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgcmVxX3NpemUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGJ1ZiA9IHBrdC0+ZGF0YTsKKworICAgICAgICAgICAgLyogY2FsYyBvcHRpbWFsIG5ldyBjaGFyc2V0ICsgY2hhcm1hcHMgKi8KKyAgICAgICAgICAgIGF2cHJpdl9pbml0X2VsYmcobWV0YSwgMzIsIDEwMDAgKiBjLT5tY19saWZldGltZSwgYmVzdF9jYiwgQ0hBUlNFVF9DSEFSUywgNTAsIGNoYXJtYXAsICZjLT5yYW5kY3R4KTsKKyAgICAgICAgICAgIGF2cHJpdl9kb19lbGJnICAobWV0YSwgMzIsIDEwMDAgKiBjLT5tY19saWZldGltZSwgYmVzdF9jYiwgQ0hBUlNFVF9DSEFSUywgNTAsIGNoYXJtYXAsICZjLT5yYW5kY3R4KTsKKworICAgICAgICAgICAgLyogY3JlYXRlIGNvbG9ycmFtIG1hcCBhbmQgYSBjNjQgcmVhZGFibGUgY2hhcnNldCAqLworICAgICAgICAgICAgcmVuZGVyX2NoYXJzZXQoYXZjdHgsIGNoYXJzZXQsIGNvbHJhbSk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgY2hhcnNldCB0byBidWYgKi8KKyAgICAgICAgICAgIG1lbWNweShidWYsIGNoYXJzZXQsIGNoYXJzZXRfc2l6ZSk7CisKKyAgICAgICAgICAgIC8qIGFkdmFuY2UgcG9pbnRlcnMgKi8KKyAgICAgICAgICAgIGJ1ZiAgICAgICs9IGNoYXJzZXRfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHdyaXRlIHggZnJhbWVzIHRvIGJ1ZiAqLworICAgICAgICBmb3IgKGZyYW1lID0gMDsgZnJhbWUgPCBjLT5tY19saWZldGltZTsgZnJhbWUrKykgeworICAgICAgICAgICAgLyogY29weSBjaGFybWFwIHRvIGJ1Zi4gYnVmIGlzIHVjaGFyKiwgY2hhcm1hcCBpcyBpbnQqLCBzbyBubyBtZW1jcHkgaGVyZSwgc29ycnkgKi8KKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBiX2hlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGJfd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBidWZbeSAqIGJfd2lkdGggKyB4XSA9IGNoYXJtYXBbeSAqIGJfd2lkdGggKyB4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBhZHZhbmNlIHBvaW50ZXJzICovCisgICAgICAgICAgICBidWYgKz0gc2NyZWVuX3NpemU7CisgICAgICAgICAgICByZXFfc2l6ZSArPSBzY3JlZW5fc2l6ZTsKKworICAgICAgICAgICAgLyogY29tcHJlc3MgYW5kIGNvcHkgY29scmFtIHRvIGJ1ZiAqLworICAgICAgICAgICAgaWYgKGMtPm1jX3VzZV81Y29sKSB7CisgICAgICAgICAgICAgICAgYTY0X2NvbXByZXNzX2NvbHJhbShidWYsIGNoYXJtYXAsIGNvbHJhbSk7CisgICAgICAgICAgICAgICAgLyogYWR2YW5jZSBwb2ludGVycyAqLworICAgICAgICAgICAgICAgIGJ1ZiArPSBjb2xyYW1fc2l6ZTsKKyAgICAgICAgICAgICAgICByZXFfc2l6ZSArPSBjb2xyYW1fc2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYWR2YW5jZSB0byBuZXh0IGNoYXJtYXAgKi8KKyAgICAgICAgICAgIGNoYXJtYXAgKz0gMTAwMDsKKyAgICAgICAgfQorCisgICAgICAgIEFWX1dCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDQsICBjLT5tY19mcmFtZV9jb3VudGVyKTsKKyAgICAgICAgQVZfV0IzMihhdmN0eC0+ZXh0cmFkYXRhICsgOCwgIGNoYXJzZXRfc2l6ZSk7CisgICAgICAgIEFWX1dCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDEyLCBzY3JlZW5fc2l6ZSArIGNvbHJhbV9zaXplKTsKKworICAgICAgICAvKiByZXNldCBjb3VudGVyICovCisgICAgICAgIGMtPm1jX2ZyYW1lX2NvdW50ZXIgPSAwOworCisgICAgICAgIHBrdC0+cHRzID0gcGt0LT5kdHMgPSBjLT5uZXh0X3B0czsKKyAgICAgICAgYy0+bmV4dF9wdHMgICAgICAgICA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgICAgIHBrdC0+c2l6ZSAgID0gcmVxX3NpemU7CisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICAqZ290X3BhY2tldCA9ICEhcmVxX3NpemU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX0E2NE1VTFRJX0VOQ09ERVIKK0FWQ29kZWMgZmZfYTY0bXVsdGlfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYTY0bXVsdGkiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNdWx0aWNvbG9yIGNoYXJzZXQgZm9yIENvbW1vZG9yZSA2NCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BNjRfTVVMVEksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEE2NENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGE2NG11bHRpX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGE2NG11bHRpX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBhNjRtdWx0aV9jbG9zZV9lbmNvZGVyLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkge0FWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfTk9ORX0sCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RFTEFZLAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19BNjRNVUxUSTVfRU5DT0RFUgorQVZDb2RlYyBmZl9hNjRtdWx0aTVfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYTY0bXVsdGk1IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTXVsdGljb2xvciBjaGFyc2V0IGZvciBDb21tb2RvcmUgNjQsIGV4dGVuZGVkIHdpdGggNXRoIGNvbG9yIChjb2xyYW0pIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0E2NF9NVUxUSTUsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEE2NENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGE2NG11bHRpX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGE2NG11bHRpX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBhNjRtdWx0aV9jbG9zZV9lbmNvZGVyLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkge0FWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfTk9ORX0sCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RFTEFZLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYTY0dGFibGVzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hNjR0YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTU1ZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYTY0dGFibGVzLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBhNjQgdmlkZW8gZW5jb2RlciAtIHRhYmxlcyB1c2VkIGJ5IGE2NCBlbmNvZGVycworICogQ29weXJpZ2h0IChjKSAyMDA5IFRvYmlhcyBCaW5kaGFtbWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGE2NCB2aWRlbyBlbmNvZGVyIC0gdGFibGVzIHVzZWQgYnkgYTY0IGVuY29kZXJzCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0E2NFRBQkxFU19ICisjZGVmaW5lIEFWQ09ERUNfQTY0VEFCTEVTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIGRpdGhlciBwYXR0ZXJucyB1c2VkIHZvciByZW5kZXJpbmcgdGhlIG11bHRpY29sb3IgY2hhcnNldAorICovCisKK3N0YXRpYyBjb25zdCB1aW50OF90IG11bHRpX2RpdGhlcl9wYXR0ZXJuc1s5XVs0XVs0XSA9IHsKKyAgICB7CisgICAgIHswLCAwLCAwLCAwfSwKKyAgICAgezAsIDAsIDAsIDB9LAorICAgICB7MCwgMCwgMCwgMH0sCisgICAgIHswLCAwLCAwLCAwfQorICAgICB9LAorICAgIHsKKyAgICAgezEsIDAsIDAsIDB9LAorICAgICB7MCwgMCwgMCwgMH0sCisgICAgIHswLCAwLCAxLCAwfSwKKyAgICAgezAsIDAsIDAsIDB9CisgICAgIH0sCisgICAgeworICAgICB7MSwgMCwgMCwgMH0sCisgICAgIHswLCAwLCAxLCAwfSwKKyAgICAgezAsIDEsIDAsIDB9LAorICAgICB7MCwgMCwgMCwgMX0KKyAgICAgfSwKKyAgICB7CisgICAgIHsxLCAwLCAwLCAwfSwKKyAgICAgezAsIDEsIDAsIDF9LAorICAgICB7MCwgMCwgMSwgMH0sCisgICAgIHswLCAxLCAwLCAxfQorICAgICB9LAorICAgIHsKKyAgICAgezEsIDAsIDEsIDB9LAorICAgICB7MCwgMSwgMCwgMX0sCisgICAgIHsxLCAwLCAxLCAwfSwKKyAgICAgezAsIDEsIDAsIDF9CisgICAgIH0sCisgICAgeworICAgICB7MSwgMSwgMSwgMH0sCisgICAgIHswLCAxLCAwLCAxfSwKKyAgICAgezEsIDAsIDEsIDF9LAorICAgICB7MCwgMSwgMCwgMX0KKyAgICAgfSwKKyAgICB7CisgICAgIHswLCAxLCAxLCAxfSwKKyAgICAgezEsIDEsIDAsIDF9LAorICAgICB7MSwgMCwgMSwgMX0sCisgICAgIHsxLCAxLCAxLCAwfQorICAgICB9LAorICAgIHsKKyAgICAgezAsIDEsIDEsIDF9LAorICAgICB7MSwgMSwgMSwgMX0sCisgICAgIHsxLCAxLCAwLCAxfSwKKyAgICAgezEsIDEsIDEsIDF9CisgICAgIH0sCisgICAgeworICAgICB7MSwgMSwgMSwgMX0sCisgICAgIHsxLCAxLCAxLCAxfSwKKyAgICAgezEsIDEsIDEsIDF9LAorICAgICB7MSwgMSwgMSwgMX0KKyAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGludGVybGFjZWRfZGl0aGVyX3BhdHRlcm5zWzldWzhdWzRdID0geworICAgIHsKKyAgICAgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0sCisgICAgIHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9LAorICAgICB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSwKKyAgICAgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0sCisgICAgIH0sCisgICAgeworICAgICB7MSwgMCwgMSwgMH0sIHswLCAwLCAwLCAwfSwKKyAgICAgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0sCisgICAgIHsxLCAwLCAxLCAwfSwgezAsIDAsIDAsIDB9LAorICAgICB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSwKKyAgICAgfSwKKyAgICB7CisgICAgIHsxLCAwLCAxLCAwfSwgezAsIDAsIDAsIDB9LAorICAgICB7MCwgMCwgMCwgMH0sIHswLCAxLCAwLCAxfSwKKyAgICAgezEsIDAsIDEsIDB9LCB7MCwgMCwgMCwgMH0sCisgICAgIHswLCAwLCAwLCAwfSwgezAsIDEsIDAsIDF9LAorICAgICB9LAorICAgIHsKKyAgICAgezEsIDAsIDEsIDB9LCB7MCwgMSwgMCwgMX0sCisgICAgIHswLCAxLCAwLCAxfSwgezAsIDAsIDAsIDB9LAorICAgICB7MSwgMCwgMSwgMH0sIHswLCAxLCAwLCAxfSwKKyAgICAgezAsIDEsIDAsIDF9LCB7MCwgMCwgMCwgMH0sCisgICAgIH0sCisgICAgeworICAgICB7MSwgMCwgMSwgMH0sIHswLCAxLCAwLCAxfSwKKyAgICAgezAsIDEsIDAsIDF9LCB7MSwgMCwgMSwgMH0sCisgICAgIHsxLCAwLCAxLCAwfSwgezAsIDEsIDAsIDF9LAorICAgICB7MCwgMSwgMCwgMX0sIHsxLCAwLCAxLCAwfSwKKyAgICAgfSwKKyAgICB7CisgICAgIHsxLCAwLCAxLCAwfSwgezAsIDEsIDAsIDF9LAorICAgICB7MSwgMSwgMSwgMX0sIHsxLCAwLCAxLCAwfSwKKyAgICAgezEsIDAsIDEsIDB9LCB7MCwgMSwgMCwgMX0sCisgICAgIHsxLCAxLCAxLCAxfSwgezEsIDAsIDEsIDB9LAorICAgICB9LAorICAgIHsKKyAgICAgezEsIDAsIDEsIDB9LCB7MSwgMSwgMSwgMX0sCisgICAgIHsxLCAxLCAxLCAxfSwgezAsIDEsIDAsIDF9LAorICAgICB7MSwgMCwgMSwgMH0sIHsxLCAxLCAxLCAxfSwKKyAgICAgezEsIDEsIDEsIDF9LCB7MCwgMSwgMCwgMX0sCisgICAgIH0sCisgICAgeworICAgICB7MSwgMSwgMSwgMX0sIHsxLCAxLCAxLCAxfSwKKyAgICAgezEsIDEsIDEsIDF9LCB7MCwgMSwgMCwgMX0sCisgICAgIHsxLCAxLCAxLCAxfSwgezEsIDEsIDEsIDF9LAorICAgICB7MSwgMSwgMSwgMX0sIHswLCAxLCAwLCAxfSwKKyAgICAgfSwKKyAgICB7CisgICAgIHsxLCAxLCAxLCAxfSwgezEsIDEsIDEsIDF9LAorICAgICB7MSwgMSwgMSwgMX0sIHsxLCAxLCAxLCAxfSwKKyAgICAgezEsIDEsIDEsIDF9LCB7MSwgMSwgMSwgMX0sCisgICAgIHsxLCAxLCAxLCAxfSwgezEsIDEsIDEsIDF9LAorICAgICB9Cit9OworCisjZW5kaWYgLyogQVZDT0RFQ19BNjRUQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFjLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTUxNzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjLmgKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiBBQUMgZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZXMKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IE9kZWQgU2hpbW9uICggb2RzMTUgb2RzMTUgZHluZG5zIG9yZyApCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBNYXhpbSBHYXZyaWxvdiAoIG1heGltLmdhdnJpbG92IGdtYWlsIGNvbSApCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFBQyBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcworICogQGF1dGhvciBPZGVkIFNoaW1vbiAgKCBvZHMxNSBvZHMxNSBkeW5kbnMgb3JnICkKKyAqIEBhdXRob3IgTWF4aW0gR2F2cmlsb3YgKCBtYXhpbS5nYXZyaWxvdiBnbWFpbCBjb20gKQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BQUNfSAorI2RlZmluZSBBVkNPREVDX0FBQ19ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgIm1wZWc0YXVkaW8uaCIKKyNpbmNsdWRlICJzYnIuaCIKKyNpbmNsdWRlICJmbXRjb252ZXJ0LmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBNQVhfQ0hBTk5FTFMgNjQKKyNkZWZpbmUgTUFYX0VMRU1fSUQgMTYKKworI2RlZmluZSBUTlNfTUFYX09SREVSIDIwCisjZGVmaW5lIE1BWF9MVFBfTE9OR19TRkIgNDAKKworZW51bSBSYXdEYXRhQmxvY2tUeXBlIHsKKyAgICBUWVBFX1NDRSwKKyAgICBUWVBFX0NQRSwKKyAgICBUWVBFX0NDRSwKKyAgICBUWVBFX0xGRSwKKyAgICBUWVBFX0RTRSwKKyAgICBUWVBFX1BDRSwKKyAgICBUWVBFX0ZJTCwKKyAgICBUWVBFX0VORCwKK307CisKK2VudW0gRXh0ZW5zaW9uUGF5bG9hZElEIHsKKyAgICBFWFRfRklMTCwKKyAgICBFWFRfRklMTF9EQVRBLAorICAgIEVYVF9EQVRBX0VMRU1FTlQsCisgICAgRVhUX0RZTkFNSUNfUkFOR0UgPSAweGIsCisgICAgRVhUX1NCUl9EQVRBICAgICAgPSAweGQsCisgICAgRVhUX1NCUl9EQVRBX0NSQyAgPSAweGUsCit9OworCitlbnVtIFdpbmRvd1NlcXVlbmNlIHsKKyAgICBPTkxZX0xPTkdfU0VRVUVOQ0UsCisgICAgTE9OR19TVEFSVF9TRVFVRU5DRSwKKyAgICBFSUdIVF9TSE9SVF9TRVFVRU5DRSwKKyAgICBMT05HX1NUT1BfU0VRVUVOQ0UsCit9OworCitlbnVtIEJhbmRUeXBlIHsKKyAgICBaRVJPX0JUICAgICAgICA9IDAsICAgICAvLy88IFNjYWxlZmFjdG9ycyBhbmQgc3BlY3RyYWwgZGF0YSBhcmUgYWxsIHplcm8uCisgICAgRklSU1RfUEFJUl9CVCAgPSA1LCAgICAgLy8vPCBUaGlzIGFuZCBsYXRlciBiYW5kIHR5cGVzIGVuY29kZSB0d28gdmFsdWVzIChyYXRoZXIgdGhhbiBmb3VyKSB3aXRoIG9uZSBjb2RlIHdvcmQuCisgICAgRVNDX0JUICAgICAgICAgPSAxMSwgICAgLy8vPCBTcGVjdHJhbCBkYXRhIGFyZSBjb2RlZCB3aXRoIGFuIGVzY2FwZSBzZXF1ZW5jZS4KKyAgICBOT0lTRV9CVCAgICAgICA9IDEzLCAgICAvLy88IFNwZWN0cmFsIGRhdGEgYXJlIHNjYWxlZCB3aGl0ZSBub2lzZSBub3QgY29kZWQgaW4gdGhlIGJpdHN0cmVhbS4KKyAgICBJTlRFTlNJVFlfQlQyICA9IDE0LCAgICAvLy88IFNjYWxlZmFjdG9yIGRhdGEgYXJlIGludGVuc2l0eSBzdGVyZW8gcG9zaXRpb25zLgorICAgIElOVEVOU0lUWV9CVCAgID0gMTUsICAgIC8vLzwgU2NhbGVmYWN0b3IgZGF0YSBhcmUgaW50ZW5zaXR5IHN0ZXJlbyBwb3NpdGlvbnMuCit9OworCisjZGVmaW5lIElTX0NPREVCT09LX1VOU0lHTkVEKHgpICgoKHgpIC0gMSkgJiAxMCkKKworZW51bSBDaGFubmVsUG9zaXRpb24geworICAgIEFBQ19DSEFOTkVMX09GRiAgID0gMCwKKyAgICBBQUNfQ0hBTk5FTF9GUk9OVCA9IDEsCisgICAgQUFDX0NIQU5ORUxfU0lERSAgPSAyLAorICAgIEFBQ19DSEFOTkVMX0JBQ0sgID0gMywKKyAgICBBQUNfQ0hBTk5FTF9MRkUgICA9IDQsCisgICAgQUFDX0NIQU5ORUxfQ0MgICAgPSA1LAorfTsKKworLyoqCisgKiBUaGUgcG9pbnQgZHVyaW5nIGRlY29kaW5nIGF0IHdoaWNoIGNoYW5uZWwgY291cGxpbmcgaXMgYXBwbGllZC4KKyAqLworZW51bSBDb3VwbGluZ1BvaW50IHsKKyAgICBCRUZPUkVfVE5TLAorICAgIEJFVFdFRU5fVE5TX0FORF9JTURDVCwKKyAgICBBRlRFUl9JTURDVCA9IDMsCit9OworCisvKioKKyAqIE91dHB1dCBjb25maWd1cmF0aW9uIHN0YXR1cworICovCitlbnVtIE9DU3RhdHVzIHsKKyAgICBPQ19OT05FLCAgICAgICAgLy8vPCBPdXRwdXQgdW5jb25maWd1cmVkCisgICAgT0NfVFJJQUxfUENFLCAgIC8vLzwgT3V0cHV0IGNvbmZpZ3VyYXRpb24gdW5kZXIgdHJpYWwgc3BlY2lmaWVkIGJ5IGFuIGluYmFuZCBQQ0UKKyAgICBPQ19UUklBTF9GUkFNRSwgLy8vPCBPdXRwdXQgY29uZmlndXJhdGlvbiB1bmRlciB0cmlhbCBzcGVjaWZpZWQgYnkgYSBmcmFtZSBoZWFkZXIKKyAgICBPQ19HTE9CQUxfSERSLCAgLy8vPCBPdXRwdXQgY29uZmlndXJhdGlvbiBzZXQgaW4gYSBnbG9iYWwgaGVhZGVyIGJ1dCBub3QgeWV0IGxvY2tlZAorICAgIE9DX0xPQ0tFRCwgICAgICAvLy88IE91dHB1dCBjb25maWd1cmF0aW9uIGxvY2tlZCBpbiBwbGFjZQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgT3V0cHV0Q29uZmlndXJhdGlvbiB7CisgICAgTVBFRzRBdWRpb0NvbmZpZyBtNGFjOworICAgIHVpbnQ4X3QgbGF5b3V0X21hcFtNQVhfRUxFTV9JRCo0XVszXTsKKyAgICBpbnQgbGF5b3V0X21hcF90YWdzOworICAgIGludCBjaGFubmVsczsKKyAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dDsKKyAgICBlbnVtIE9DU3RhdHVzIHN0YXR1czsKK30gT3V0cHV0Q29uZmlndXJhdGlvbjsKKworLyoqCisgKiBQcmVkaWN0b3IgU3RhdGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUHJlZGljdG9yU3RhdGUgeworICAgIGZsb2F0IGNvcjA7CisgICAgZmxvYXQgY29yMTsKKyAgICBmbG9hdCB2YXIwOworICAgIGZsb2F0IHZhcjE7CisgICAgZmxvYXQgcjA7CisgICAgZmxvYXQgcjE7Cit9IFByZWRpY3RvclN0YXRlOworCisjZGVmaW5lIE1BWF9QUkVESUNUT1JTIDY3MgorCisjZGVmaW5lIFNDQUxFX0RJVl81MTIgICAgMzYgICAgLy8vPCBzY2FsZWZhY3RvciBkaWZmZXJlbmNlIHRoYXQgY29ycmVzcG9uZHMgdG8gc2NhbGUgZGlmZmVyZW5jZSBpbiA1MTIgdGltZXMKKyNkZWZpbmUgU0NBTEVfT05FX1BPUyAgIDE0MCAgICAvLy88IHNjYWxlZmFjdG9yIGluZGV4IHRoYXQgY29ycmVzcG9uZHMgdG8gc2NhbGU9MS4wCisjZGVmaW5lIFNDQUxFX01BWF9QT1MgICAyNTUgICAgLy8vPCBzY2FsZWZhY3RvciBpbmRleCBtYXhpbXVtIHZhbHVlCisjZGVmaW5lIFNDQUxFX01BWF9ESUZGICAgNjAgICAgLy8vPCBtYXhpbXVtIHNjYWxlZmFjdG9yIGRpZmZlcmVuY2UgYWxsb3dlZCBieSBzdGFuZGFyZAorI2RlZmluZSBTQ0FMRV9ESUZGX1pFUk8gIDYwICAgIC8vLzwgY29kZWJvb2sgaW5kZXggY29ycmVzcG9uZGluZyB0byB6ZXJvIHNjYWxlZmFjdG9yIGluZGljZXMgZGlmZmVyZW5jZQorCisvKioKKyAqIExvbmcgVGVybSBQcmVkaWN0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IExvbmdUZXJtUHJlZGljdGlvbiB7CisgICAgaW50OF90IHByZXNlbnQ7CisgICAgaW50MTZfdCBsYWc7CisgICAgZmxvYXQgY29lZjsKKyAgICBpbnQ4X3QgdXNlZFtNQVhfTFRQX0xPTkdfU0ZCXTsKK30gTG9uZ1Rlcm1QcmVkaWN0aW9uOworCisvKioKKyAqIEluZGl2aWR1YWwgQ2hhbm5lbCBTdHJlYW0KKyAqLwordHlwZWRlZiBzdHJ1Y3QgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0geworICAgIHVpbnQ4X3QgbWF4X3NmYjsgICAgICAgICAgICAvLy88IG51bWJlciBvZiBzY2FsZWZhY3RvciBiYW5kcyBwZXIgZ3JvdXAKKyAgICBlbnVtIFdpbmRvd1NlcXVlbmNlIHdpbmRvd19zZXF1ZW5jZVsyXTsKKyAgICB1aW50OF90IHVzZV9rYl93aW5kb3dbMl07ICAgLy8vPCBJZiBzZXQsIHVzZSBLYWlzZXItQmVzc2VsIHdpbmRvdywgb3RoZXJ3aXNlIHVzZSBhIHNpbmUgd2luZG93LgorICAgIGludCBudW1fd2luZG93X2dyb3VwczsKKyAgICB1aW50OF90IGdyb3VwX2xlbls4XTsKKyAgICBMb25nVGVybVByZWRpY3Rpb24gbHRwOworICAgIGNvbnN0IHVpbnQxNl90ICpzd2Jfb2Zmc2V0OyAvLy88IHRhYmxlIG9mIG9mZnNldHMgdG8gdGhlIGxvd2VzdCBzcGVjdHJhbCBjb2VmZmljaWVudCBvZiBhIHNjYWxlZmFjdG9yIGJhbmQsIHNmYiwgZm9yIGEgcGFydGljdWxhciB3aW5kb3cKKyAgICBjb25zdCB1aW50OF90ICpzd2Jfc2l6ZXM7ICAgLy8vPCB0YWJsZSBvZiBzY2FsZWZhY3RvciBiYW5kIHNpemVzIGZvciBhIHBhcnRpY3VsYXIgd2luZG93CisgICAgaW50IG51bV9zd2I7ICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHNjYWxlZmFjdG9yIHdpbmRvdyBiYW5kcworICAgIGludCBudW1fd2luZG93czsKKyAgICBpbnQgdG5zX21heF9iYW5kczsKKyAgICBpbnQgcHJlZGljdG9yX3ByZXNlbnQ7CisgICAgaW50IHByZWRpY3Rvcl9pbml0aWFsaXplZDsKKyAgICBpbnQgcHJlZGljdG9yX3Jlc2V0X2dyb3VwOworICAgIHVpbnQ4X3QgcHJlZGljdGlvbl91c2VkWzQxXTsKK30gSW5kaXZpZHVhbENoYW5uZWxTdHJlYW07CisKKy8qKgorICogVGVtcG9yYWwgTm9pc2UgU2hhcGluZworICovCit0eXBlZGVmIHN0cnVjdCBUZW1wb3JhbE5vaXNlU2hhcGluZyB7CisgICAgaW50IHByZXNlbnQ7CisgICAgaW50IG5fZmlsdFs4XTsKKyAgICBpbnQgbGVuZ3RoWzhdWzRdOworICAgIGludCBkaXJlY3Rpb25bOF1bNF07CisgICAgaW50IG9yZGVyWzhdWzRdOworICAgIGZsb2F0IGNvZWZbOF1bNF1bVE5TX01BWF9PUkRFUl07Cit9IFRlbXBvcmFsTm9pc2VTaGFwaW5nOworCisvKioKKyAqIER5bmFtaWMgUmFuZ2UgQ29udHJvbCAtIGRlY29kZWQgZnJvbSB0aGUgYml0c3RyZWFtIGJ1dCBub3QgcHJvY2Vzc2VkIGZ1cnRoZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IER5bmFtaWNSYW5nZUNvbnRyb2wgeworICAgIGludCBwY2VfaW5zdGFuY2VfdGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSW5kaWNhdGVzIHdpdGggd2hpY2ggcHJvZ3JhbSB0aGUgRFJDIGluZm8gaXMgYXNzb2NpYXRlZC4KKyAgICBpbnQgZHluX3JuZ19zZ25bMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERSQyBzaWduIGluZm9ybWF0aW9uOyAwIC0gcG9zaXRpdmUsIDEgLSBuZWdhdGl2ZQorICAgIGludCBkeW5fcm5nX2N0bFsxN107ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRFJDIG1hZ25pdHVkZSBpbmZvcm1hdGlvbgorICAgIGludCBleGNsdWRlX21hc2tbTUFYX0NIQU5ORUxTXTsgICAgICAgICAgICAgICAgIC8vLzwgQ2hhbm5lbHMgdG8gYmUgZXhjbHVkZWQgZnJvbSBEUkMgcHJvY2Vzc2luZy4KKyAgICBpbnQgYmFuZF9pbmNyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE51bWJlciBvZiBEUkMgYmFuZHMgZ3JlYXRlciB0aGFuIDEgaGF2aW5nIERSQyBpbmZvLgorICAgIGludCBpbnRlcnBvbGF0aW9uX3NjaGVtZTsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSW5kaWNhdGVzIHRoZSBpbnRlcnBvbGF0aW9uIHNjaGVtZSB1c2VkIGluIHRoZSBTQlIgUU1GIGRvbWFpbi4KKyAgICBpbnQgYmFuZF90b3BbMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEluZGljYXRlcyB0aGUgdG9wIG9mIHRoZSBpLXRoIERSQyBiYW5kIGluIHVuaXRzIG9mIDQgc3BlY3RyYWwgbGluZXMuCisgICAgaW50IHByb2dfcmVmX2xldmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBIHJlZmVyZW5jZSBsZXZlbCBmb3IgdGhlIGxvbmctdGVybSBwcm9ncmFtIGF1ZGlvIGxldmVsIGZvciBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGNoYW5uZWxzIGNvbWJpbmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBEeW5hbWljUmFuZ2VDb250cm9sOworCit0eXBlZGVmIHN0cnVjdCBQdWxzZSB7CisgICAgaW50IG51bV9wdWxzZTsKKyAgICBpbnQgc3RhcnQ7CisgICAgaW50IHBvc1s0XTsKKyAgICBpbnQgYW1wWzRdOworfSBQdWxzZTsKKworLyoqCisgKiBjb3VwbGluZyBwYXJhbWV0ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IENoYW5uZWxDb3VwbGluZyB7CisgICAgZW51bSBDb3VwbGluZ1BvaW50IGNvdXBsaW5nX3BvaW50OyAgLy8vPCBUaGUgcG9pbnQgZHVyaW5nIGRlY29kaW5nIGF0IHdoaWNoIGNvdXBsaW5nIGlzIGFwcGxpZWQuCisgICAgaW50IG51bV9jb3VwbGVkOyAgICAgICAvLy88IG51bWJlciBvZiB0YXJnZXQgZWxlbWVudHMKKyAgICBlbnVtIFJhd0RhdGFCbG9ja1R5cGUgdHlwZVs4XTsgICAvLy88IFR5cGUgb2YgY2hhbm5lbCBlbGVtZW50IHRvIGJlIGNvdXBsZWQgLSBTQ0Ugb3IgQ1BFLgorICAgIGludCBpZF9zZWxlY3RbOF07ICAgICAgLy8vPCBlbGVtZW50IGlkCisgICAgaW50IGNoX3NlbGVjdFs4XTsgICAgICAvKio8IFswXSBzaGFyZWQgbGlzdCBvZiBnYWluczsgWzFdIGxpc3Qgb2YgZ2FpbnMgZm9yIHJpZ2h0IGNoYW5uZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFsyXSBsaXN0IG9mIGdhaW5zIGZvciBsZWZ0IGNoYW5uZWw7IFszXSBsaXN0cyBvZiBnYWlucyBmb3IgYm90aCBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZmxvYXQgZ2FpblsxNl1bMTIwXTsKK30gQ2hhbm5lbENvdXBsaW5nOworCisvKioKKyAqIFNpbmdsZSBDaGFubmVsIEVsZW1lbnQgLSB1c2VkIGZvciBib3RoIFNDRSBhbmQgTEZFIGVsZW1lbnRzLgorICovCit0eXBlZGVmIHN0cnVjdCBTaW5nbGVDaGFubmVsRWxlbWVudCB7CisgICAgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gaWNzOworICAgIFRlbXBvcmFsTm9pc2VTaGFwaW5nIHRuczsKKyAgICBQdWxzZSBwdWxzZTsKKyAgICBlbnVtIEJhbmRUeXBlIGJhbmRfdHlwZVsxMjhdOyAgICAgICAgICAgICAgICAgICAvLy88IGJhbmQgdHlwZXMKKyAgICBpbnQgYmFuZF90eXBlX3J1bl9lbmRbMTIwXTsgICAgICAgICAgICAgICAgICAgICAvLy88IGJhbmQgdHlwZSBydW4gZW5kIHBvaW50cworICAgIGZsb2F0IHNmWzEyMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc2NhbGVmYWN0b3JzCisgICAgaW50IHNmX2lkeFsxMjhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzY2FsZWZhY3RvciBpbmRpY2VzICh1c2VkIGJ5IGVuY29kZXIpCisgICAgdWludDhfdCB6ZXJvZXNbMTI4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBiYW5kIGlzIG5vdCBjb2RlZCAodXNlZCBieSBlbmNvZGVyKQorICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsICAgY29lZmZzKVsxMDI0XTsgICAgIC8vLzwgY29lZmZpY2llbnRzIGZvciBJTURDVAorICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsICAgc2F2ZWQpWzE1MzZdOyAgICAgIC8vLzwgb3ZlcmxhcAorICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsICAgcmV0X2J1ZilbMjA0OF07ICAgIC8vLzwgUENNIG91dHB1dCBidWZmZXIKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCAgIGx0cF9zdGF0ZSlbMzA3Ml07ICAvLy88IHRpbWUgc2lnbmFsIGZvciBMVFAKKyAgICBQcmVkaWN0b3JTdGF0ZSBwcmVkaWN0b3Jfc3RhdGVbTUFYX1BSRURJQ1RPUlNdOworICAgIGZsb2F0ICpyZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgUENNIG91dHB1dAorfSBTaW5nbGVDaGFubmVsRWxlbWVudDsKKworLyoqCisgKiBjaGFubmVsIGVsZW1lbnQgLSBnZW5lcmljIHN0cnVjdCBmb3IgU0NFL0NQRS9DQ0UvTEZFCisgKi8KK3R5cGVkZWYgc3RydWN0IENoYW5uZWxFbGVtZW50IHsKKyAgICBpbnQgcHJlc2VudDsKKyAgICAvLyBDUEUgc3BlY2lmaWMKKyAgICBpbnQgY29tbW9uX3dpbmRvdzsgICAgICAgIC8vLzwgU2V0IGlmIGNoYW5uZWxzIHNoYXJlIGEgY29tbW9uICdJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbScgaW4gYml0c3RyZWFtLgorICAgIGludCAgICAgbXNfbW9kZTsgICAgICAgICAgLy8vPCBTaWduYWxzIG1pZC9zaWRlIHN0ZXJlbyBmbGFncyBjb2RpbmcgbW9kZSAodXNlZCBieSBlbmNvZGVyKQorICAgIHVpbnQ4X3QgbXNfbWFza1sxMjhdOyAgICAgLy8vPCBTZXQgaWYgbWlkL3NpZGUgc3RlcmVvIGlzIHVzZWQgZm9yIGVhY2ggc2NhbGVmYWN0b3Igd2luZG93IGJhbmQKKyAgICAvLyBzaGFyZWQKKyAgICBTaW5nbGVDaGFubmVsRWxlbWVudCBjaFsyXTsKKyAgICAvLyBDQ0Ugc3BlY2lmaWMKKyAgICBDaGFubmVsQ291cGxpbmcgY291cDsKKyAgICBTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiBzYnI7Cit9IENoYW5uZWxFbGVtZW50OworCisvKioKKyAqIG1haW4gQUFDIGNvbnRleHQKKyAqLworc3RydWN0IEFBQ0NvbnRleHQgeworICAgIEFWQ2xhc3MgICAgICAgICpjbGFzczsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAqZnJhbWU7CisKKyAgICBpbnQgaXNfc2F2ZWQ7ICAgICAgICAgICAgICAgICAvLy88IFNldCBpZiBlbGVtZW50cyBoYXZlIHN0b3JlZCBvdmVybGFwIGZyb20gcHJldmlvdXMgZnJhbWUuCisgICAgRHluYW1pY1JhbmdlQ29udHJvbCBjaGVfZHJjOworCisgICAgLyoqCisgICAgICogQG5hbWUgQ2hhbm5lbCBlbGVtZW50IHJlbGF0ZWQgZGF0YQorICAgICAqIEB7CisgICAgICovCisgICAgQ2hhbm5lbEVsZW1lbnQgICAgICAgICAgKmNoZVs0XVtNQVhfRUxFTV9JRF07CisgICAgQ2hhbm5lbEVsZW1lbnQgICp0YWdfY2hlX21hcFs0XVtNQVhfRUxFTV9JRF07CisgICAgaW50IHRhZ3NfbWFwcGVkOworICAgIGludCB3YXJuZWRfcmVtYXBwaW5nX29uY2U7CisgICAgLyoqIEB9ICovCisKKyAgICAvKioKKyAgICAgKiBAbmFtZSB0ZW1wb3JhcnkgYWxpZ25lZCB0ZW1wb3JhcnkgYnVmZmVycworICAgICAqIChXZSBkbyBub3Qgd2FudCB0byBoYXZlIHRoZXNlIG9uIHRoZSBzdGFjay4pCisgICAgICogQHsKKyAgICAgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBidWZfbWRjdClbMTAyNF07CisgICAgLyoqIEB9ICovCisKKyAgICAvKioKKyAgICAgKiBAbmFtZSBDb21wdXRlZCAvIHNldCB1cCBkdXJpbmcgaW5pdGlhbGl6YXRpb24KKyAgICAgKiBAeworICAgICAqLworICAgIEZGVENvbnRleHQgbWRjdDsKKyAgICBGRlRDb250ZXh0IG1kY3Rfc21hbGw7CisgICAgRkZUQ29udGV4dCBtZGN0X2xkOworICAgIEZGVENvbnRleHQgbWRjdF9sdHA7CisgICAgRm10Q29udmVydENvbnRleHQgZm10X2NvbnY7CisgICAgQVZGbG9hdERTUENvbnRleHQgKmZkc3A7CisgICAgaW50IHJhbmRvbV9zdGF0ZTsKKyAgICAvKiogQH0gKi8KKworICAgIC8qKgorICAgICAqIEBuYW1lIE1lbWJlcnMgdXNlZCBmb3Igb3V0cHV0CisgICAgICogQHsKKyAgICAgKi8KKyAgICBTaW5nbGVDaGFubmVsRWxlbWVudCAqb3V0cHV0X2VsZW1lbnRbTUFYX0NIQU5ORUxTXTsgLy8vPCBQb2ludHMgdG8gZWFjaCBTaW5nbGVDaGFubmVsRWxlbWVudAorICAgIC8qKiBAfSAqLworCisKKyAgICAvKioKKyAgICAgKiBAbmFtZSBKYXBhbmVzZSBEVFYgc3BlY2lmaWMgZXh0ZW5zaW9uCisgICAgICogQHsKKyAgICAgKi8KKyAgICBpbnQgZm9yY2VfZG1vbm9fbW9kZTsvLy88IDAtPm5vdCBkbW9ubywgMS0+dXNlIGZpcnN0IGNoYW5uZWwsIDItPnVzZSBzZWNvbmQgY2hhbm5lbAorICAgIGludCBkbW9ub19tb2RlOyAgICAgIC8vLzwgMC0+bm90IGRtb25vLCAxLT51c2UgZmlyc3QgY2hhbm5lbCwgMi0+dXNlIHNlY29uZCBjaGFubmVsCisgICAgLyoqIEB9ICovCisKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCB0ZW1wKVsxMjhdOworCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvY1syXTsKKyAgICBpbnQgd2FybmVkX251bV9hYWNfZnJhbWVzOworCisgICAgLyogYWFjZGVjIGZ1bmN0aW9ucyBwb2ludGVycyAqLworICAgIHZvaWQgKCppbWRjdF9hbmRfd2luZG93aW5nKShBQUNDb250ZXh0ICphYywgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSk7CisgICAgdm9pZCAoKmFwcGx5X2x0cCkoQUFDQ29udGV4dCAqYWMsIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UpOworICAgIHZvaWQgKCphcHBseV90bnMpKGZsb2F0IGNvZWZbMTAyNF0sIFRlbXBvcmFsTm9pc2VTaGFwaW5nICp0bnMsCisgICAgICAgICAgICAgICAgICAgICAgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gKmljcywgaW50IGRlY29kZSk7CisgICAgdm9pZCAoKndpbmRvd2luZ19hbmRfbWRjdF9sdHApKEFBQ0NvbnRleHQgKmFjLCBmbG9hdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqaW4sIEluZGl2aWR1YWxDaGFubmVsU3RyZWFtICppY3MpOworICAgIHZvaWQgKCp1cGRhdGVfbHRwKShBQUNDb250ZXh0ICphYywgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSk7CisKK307CisKK3ZvaWQgZmZfYWFjZGVjX2luaXRfbWlwcyhBQUNDb250ZXh0ICpjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUFDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY19hYzNfcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNfYWMzX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZWZkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNfYWMzX3BhcnNlci5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29tbW9uIEFBQyBhbmQgQUMtMyBwYXJzZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAiYWFjX2FjM19wYXJzZXIuaCIKKworaW50IGZmX2FhY19hYzNfcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMxLAorICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgQUFDQUMzUGFyc2VDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBQYXJzZUNvbnRleHQgKnBjID0gJnMtPnBjOworICAgIGludCBsZW4sIGk7CisgICAgaW50IG5ld19mcmFtZV9zdGFydDsKKworZ2V0X25leHQ6CisgICAgaT1FTkRfTk9UX0ZPVU5EOworICAgIGlmKHMtPnJlbWFpbmluZ19zaXplIDw9IGJ1Zl9zaXplKXsKKyAgICAgICAgaWYocy0+cmVtYWluaW5nX3NpemUgJiYgIXMtPm5lZWRfbmV4dF9oZWFkZXIpeworICAgICAgICAgICAgaT0gcy0+cmVtYWluaW5nX3NpemU7CisgICAgICAgICAgICBzLT5yZW1haW5pbmdfc2l6ZSA9IDA7CisgICAgICAgIH1lbHNleyAvL3dlIG5lZWQgYSBoZWFkZXIgZmlyc3QKKyAgICAgICAgICAgIGxlbj0wOworICAgICAgICAgICAgZm9yKGk9cy0+cmVtYWluaW5nX3NpemU7IGk8YnVmX3NpemU7IGkrKyl7CisgICAgICAgICAgICAgICAgcy0+c3RhdGUgPSAocy0+c3RhdGU8PDgpICsgYnVmW2ldOworICAgICAgICAgICAgICAgIGlmKChsZW49cy0+c3luYyhzLT5zdGF0ZSwgcywgJnMtPm5lZWRfbmV4dF9oZWFkZXIsICZuZXdfZnJhbWVfc3RhcnQpKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihsZW48PTApeworICAgICAgICAgICAgICAgIGk9RU5EX05PVF9GT1VORDsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHMtPnN0YXRlPTA7CisgICAgICAgICAgICAgICAgaS09IHMtPmhlYWRlcl9zaXplIC0xOworICAgICAgICAgICAgICAgIHMtPnJlbWFpbmluZ19zaXplID0gbGVuOworICAgICAgICAgICAgICAgIGlmKCFuZXdfZnJhbWVfc3RhcnQgfHwgcGMtPmluZGV4K2k8PTApeworICAgICAgICAgICAgICAgICAgICBzLT5yZW1haW5pbmdfc2l6ZSArPSBpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGdldF9uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGZmX2NvbWJpbmVfZnJhbWUocGMsIGksICZidWYsICZidWZfc2l6ZSk8MCl7CisgICAgICAgIHMtPnJlbWFpbmluZ19zaXplIC09IEZGTUlOKHMtPnJlbWFpbmluZ19zaXplLCBidWZfc2l6ZSk7CisgICAgICAgICpwb3V0YnVmID0gTlVMTDsKKyAgICAgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisKKyAgICAqcG91dGJ1ZiA9IGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisKKyAgICAvKiB1cGRhdGUgY29kZWMgaW5mbyAqLworICAgIGlmKHMtPmNvZGVjX2lkKQorICAgICAgICBhdmN0eC0+Y29kZWNfaWQgPSBzLT5jb2RlY19pZDsKKworICAgIC8qIER1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJsZSBIRS1BQUMgdGhlIHNhbXBsZSByYXRlLCBjaGFubmVsIGNvdW50LAorICAgICAgIGFuZCB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyBmb3VuZCBpbiBhbiBBQUMgQURUUyBoZWFkZXIgYXJlIG5vdAorICAgICAgIHJlbGlhYmxlLiBCaXQgcmF0ZSBpcyBzdGlsbCBhY2N1cmF0ZSBiZWNhdXNlIHRoZSB0b3RhbCBmcmFtZSBkdXJhdGlvbiBpbgorICAgICAgIHNlY29uZHMgaXMgc3RpbGwgY29ycmVjdCAoYXMgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmcmFtZSkuICovCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9BQUMpIHsKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gcy0+c2FtcGxlX3JhdGU7CisKKyAgICAgICAgLyogKEUtKUFDLTM6IGFsbG93IGRvd25taXhpbmcgdG8gc3RlcmVvIG9yIG1vbm8gKi8KKyNpZiBGRl9BUElfUkVRVUVTVF9DSEFOTkVMUworRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICBpZiAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgICAgIGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxzID09IDIpCisgICAgICAgICAgICBhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorICAgICAgICBpZiAocy0+Y2hhbm5lbHMgPiAxICYmCisgICAgICAgICAgICBhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfTU9OTykgeworICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICB9IGVsc2UgaWYgKHMtPmNoYW5uZWxzID4gMiAmJgorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ID09IEFWX0NIX0xBWU9VVF9TVEVSRU8pIHsKKyAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICA9IDI7CisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzID0gcy0+Y2hhbm5lbHM7CisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBzLT5jaGFubmVsX2xheW91dDsKKyAgICAgICAgfQorICAgICAgICBzMS0+ZHVyYXRpb24gPSBzLT5zYW1wbGVzOworICAgICAgICBhdmN0eC0+YXVkaW9fc2VydmljZV90eXBlID0gcy0+c2VydmljZV90eXBlOworICAgIH0KKworICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IHMtPmJpdF9yYXRlOworCisgICAgcmV0dXJuIGk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYWNfYWMzX3BhcnNlci5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjX2FjM19wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjUwNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjX2FjM19wYXJzZXIuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29tbW9uIEFBQyBhbmQgQUMtMyBwYXJzZXIgcHJvdG90eXBlcworICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FBQ19BQzNfUEFSU0VSX0gKKyNkZWZpbmUgQVZDT0RFQ19BQUNfQUMzX1BBUlNFUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisKK3R5cGVkZWYgZW51bSB7CisgICAgQUFDX0FDM19QQVJTRV9FUlJPUl9TWU5DICAgICAgICA9IC0weDEwMzBjMGEsCisgICAgQUFDX0FDM19QQVJTRV9FUlJPUl9CU0lEICAgICAgICA9IC0weDIwMzBjMGEsCisgICAgQUFDX0FDM19QQVJTRV9FUlJPUl9TQU1QTEVfUkFURSA9IC0weDMwMzBjMGEsCisgICAgQUFDX0FDM19QQVJTRV9FUlJPUl9GUkFNRV9TSVpFICA9IC0weDQwMzBjMGEsCisgICAgQUFDX0FDM19QQVJTRV9FUlJPUl9GUkFNRV9UWVBFICA9IC0weDUwMzBjMGEsCisgICAgQUFDX0FDM19QQVJTRV9FUlJPUl9DUkMgICAgICAgICA9IC0weDYwMzBjMGEsCisgICAgQUFDX0FDM19QQVJTRV9FUlJPUl9DSEFOTkVMX0NGRyA9IC0weDcwMzBjMGEsCit9IEFBQ0FDM1BhcnNlRXJyb3I7CisKK3R5cGVkZWYgc3RydWN0IEFBQ0FDM1BhcnNlQ29udGV4dCB7CisgICAgUGFyc2VDb250ZXh0IHBjOworICAgIGludCBmcmFtZV9zaXplOworICAgIGludCBoZWFkZXJfc2l6ZTsKKyAgICBpbnQgKCpzeW5jKSh1aW50NjRfdCBzdGF0ZSwgc3RydWN0IEFBQ0FDM1BhcnNlQ29udGV4dCAqaGRyX2luZm8sCisgICAgICAgICAgICBpbnQgKm5lZWRfbmV4dF9oZWFkZXIsIGludCAqbmV3X2ZyYW1lX3N0YXJ0KTsKKworICAgIGludCBjaGFubmVsczsKKyAgICBpbnQgc2FtcGxlX3JhdGU7CisgICAgaW50IGJpdF9yYXRlOworICAgIGludCBzYW1wbGVzOworICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OworICAgIGludCBzZXJ2aWNlX3R5cGU7CisKKyAgICBpbnQgcmVtYWluaW5nX3NpemU7CisgICAgdWludDY0X3Qgc3RhdGU7CisKKyAgICBpbnQgbmVlZF9uZXh0X2hlYWRlcjsKKyAgICBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZDsKK30gQUFDQUMzUGFyc2VDb250ZXh0OworCitpbnQgZmZfYWFjX2FjM19wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqczEsCisgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FBQ19BQzNfUEFSU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY19hZHRzdG9hc2NfYnNmLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNfYWR0c3RvYXNjX2JzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTE1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNfYWR0c3RvYXNjX2JzZi5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTVBFRy0yLzQgQUFDIEFEVFMgdG8gTVBFRy00IEF1ZGlvIFNwZWNpZmljIENvbmZpZ3VyYXRpb24gYml0c3RyZWFtIGZpbHRlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IEFsZXggQ29udmVyc2UgPGFsZXguY29udmVyc2VAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImFhY2FkdHNkZWMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAibXBlZzRhdWRpby5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IEFBQ0JTRkNvbnRleHQgeworICAgIGludCBmaXJzdF9mcmFtZV9kb25lOworfSBBQUNCU0ZDb250ZXh0OworCisvKioKKyAqIFRoaXMgZmlsdGVyIGNyZWF0ZXMgYW4gTVBFRy00IEF1ZGlvU3BlY2lmaWNDb25maWcgZnJvbSBhbiBNUEVHLTIvNAorICogQURUUyBoZWFkZXIgYW5kIHJlbW92ZXMgdGhlIEFEVFMgaGVhZGVyLgorICovCitzdGF0aWMgaW50IGFhY19hZHRzdG9hc2NfZmlsdGVyKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCAgICAgIGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5ZnJhbWUpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIEFBQ0FEVFNIZWFkZXJJbmZvIGhkcjsKKworICAgIEFBQ0JTRkNvbnRleHQgKmN0eCA9IGJzZmMtPnByaXZfZGF0YTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIEFBQ19BRFRTX0hFQURFUl9TSVpFKjgpOworCisgICAgKnBvdXRidWYgPSAodWludDhfdCopIGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YSkKKyAgICAgICAgaWYgKHNob3dfYml0cygmZ2IsIDEyKSAhPSAweGZmZikKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGF2cHJpdl9hYWNfcGFyc2VfaGVhZGVyKCZnYiwgJmhkcikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyBBRFRTIGZyYW1lIGhlYWRlciFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoIWhkci5jcmNfYWJzZW50ICYmIGhkci5udW1fYWFjX2ZyYW1lcyA+IDEpIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBSREJzIHBlciBmcmFtZSB3aXRoIENSQyIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgYnVmICAgICAgKz0gQUFDX0FEVFNfSEVBREVSX1NJWkUgKyAyKiFoZHIuY3JjX2Fic2VudDsKKyAgICBidWZfc2l6ZSAtPSBBQUNfQURUU19IRUFERVJfU0laRSArIDIqIWhkci5jcmNfYWJzZW50OworCisgICAgaWYgKCFjdHgtPmZpcnN0X2ZyYW1lX2RvbmUpIHsKKyAgICAgICAgaW50ICAgICAgICAgICAgcGNlX3NpemUgPSAwOworICAgICAgICB1aW50OF90ICAgICAgICBwY2VfZGF0YVtNQVhfUENFX1NJWkVdOworICAgICAgICBpZiAoIWhkci5jaGFuX2NvbmZpZykgeworICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgYnVmX3NpemUgKiA4KTsKKyAgICAgICAgICAgIGlmIChnZXRfYml0cygmZ2IsIDMpICE9IDUpIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUENFLWJhc2VkIGNoYW5uZWwgY29uZmlndXJhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgUENFIGFzIGZpcnN0IHN5bnRheCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbml0X3B1dF9iaXRzKCZwYiwgcGNlX2RhdGEsIE1BWF9QQ0VfU0laRSk7CisgICAgICAgICAgICBwY2Vfc2l6ZSA9IGF2cHJpdl9jb3B5X3BjZV9kYXRhKCZwYiwgJmdiKS84OworICAgICAgICAgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKyAgICAgICAgICAgIGJ1Zl9zaXplIC09IGdldF9iaXRzX2NvdW50KCZnYikvODsKKyAgICAgICAgICAgIGJ1ZiAgICAgICs9IGdldF9iaXRzX2NvdW50KCZnYikvODsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlKGF2Y3R4LT5leHRyYWRhdGEpOworICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSAyICsgcGNlX3NpemU7CisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCisgICAgICAgIGluaXRfcHV0X2JpdHMoJnBiLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBwdXRfYml0cygmcGIsIDUsIGhkci5vYmplY3RfdHlwZSk7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgNCwgaGRyLnNhbXBsaW5nX2luZGV4KTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCA0LCBoZHIuY2hhbl9jb25maWcpOworICAgICAgICBwdXRfYml0cygmcGIsIDEsIDApOyAvL2ZyYW1lIGxlbmd0aCAtIDEwMjQgc2FtcGxlcworICAgICAgICBwdXRfYml0cygmcGIsIDEsIDApOyAvL2RvZXMgbm90IGRlcGVuZCBvbiBjb3JlIGNvZGVyCisgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7IC8vaXMgbm90IGV4dGVuc2lvbgorICAgICAgICBmbHVzaF9wdXRfYml0cygmcGIpOworICAgICAgICBpZiAocGNlX3NpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShhdmN0eC0+ZXh0cmFkYXRhICsgMiwgcGNlX2RhdGEsIHBjZV9zaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+Zmlyc3RfZnJhbWVfZG9uZSA9IDE7CisgICAgfQorCisgICAgKnBvdXRidWYgPSAodWludDhfdCopIGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZCaXRTdHJlYW1GaWx0ZXIgZmZfYWFjX2FkdHN0b2FzY19ic2YgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFhY19hZHRzdG9hc2MiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBQUNCU0ZDb250ZXh0KSwKKyAgICAuZmlsdGVyICAgICAgICAgPSBhYWNfYWR0c3RvYXNjX2ZpbHRlciwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYWNfcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5M2JhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY19wYXJzZXIuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogQXVkaW8gYW5kIFZpZGVvIGZyYW1lIGV4dHJhY3Rpb24KKyAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJhYWNfYWMzX3BhcnNlci5oIgorI2luY2x1ZGUgImFhY2FkdHNkZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgIm1wZWc0YXVkaW8uaCIKKworc3RhdGljIGludCBhYWNfc3luYyh1aW50NjRfdCBzdGF0ZSwgQUFDQUMzUGFyc2VDb250ZXh0ICpoZHJfaW5mbywKKyAgICAgICAgaW50ICpuZWVkX25leHRfaGVhZGVyLCBpbnQgKm5ld19mcmFtZV9zdGFydCkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGJpdHM7CisgICAgQUFDQURUU0hlYWRlckluZm8gaGRyOworICAgIGludCBzaXplOworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDY0X3QgdTY0OworICAgICAgICB1aW50OF90ICB1OFs4ICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV07CisgICAgfSB0bXA7CisKKyAgICB0bXAudTY0ID0gYXZfYmUybmU2NChzdGF0ZSk7CisgICAgaW5pdF9nZXRfYml0cygmYml0cywgdG1wLnU4KzgtQUFDX0FEVFNfSEVBREVSX1NJWkUsIEFBQ19BRFRTX0hFQURFUl9TSVpFICogOCk7CisKKyAgICBpZiAoKHNpemUgPSBhdnByaXZfYWFjX3BhcnNlX2hlYWRlcigmYml0cywgJmhkcikpIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgKm5lZWRfbmV4dF9oZWFkZXIgPSAwOworICAgICpuZXdfZnJhbWVfc3RhcnQgID0gMTsKKyAgICBoZHJfaW5mby0+c2FtcGxlX3JhdGUgPSBoZHIuc2FtcGxlX3JhdGU7CisgICAgaGRyX2luZm8tPmNoYW5uZWxzICAgID0gZmZfbXBlZzRhdWRpb19jaGFubmVsc1toZHIuY2hhbl9jb25maWddOworICAgIGhkcl9pbmZvLT5zYW1wbGVzICAgICA9IGhkci5zYW1wbGVzOworICAgIGhkcl9pbmZvLT5iaXRfcmF0ZSAgICA9IGhkci5iaXRfcmF0ZTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFhY19wYXJzZV9pbml0KEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzMSkKK3sKKyAgICBBQUNBQzNQYXJzZUNvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIHMtPmhlYWRlcl9zaXplID0gQUFDX0FEVFNfSEVBREVSX1NJWkU7CisgICAgcy0+c3luYyA9IGFhY19zeW5jOworICAgIHJldHVybiAwOworfQorCisKK0FWQ29kZWNQYXJzZXIgZmZfYWFjX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX0FBQyB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBQUNBQzNQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfaW5pdCAgICA9IGFhY19wYXJzZV9pbml0LAorICAgIC5wYXJzZXJfcGFyc2UgICA9IGZmX2FhY19hYzNfcGFyc2UsCisgICAgLnBhcnNlcl9jbG9zZSAgID0gZmZfcGFyc2VfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFjX3RhYmxlZ2VuLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNfdGFibGVnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2ExNzlmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjX3RhYmxlZ2VuLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIEdlbmVyYXRlIGEgaGVhZGVyIGZpbGUgZm9yIGhhcmRjb2RlZCBBQUMgdGFibGVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFsZXggQ29udmVyc2UgPGFsZXguY29udmVyc2VAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZGVmaW5lIENPTkZJR19IQVJEQ09ERURfVEFCTEVTIDAKKyNpbmNsdWRlICJhYWNfdGFibGVnZW4uaCIKKyNpbmNsdWRlICJ0YWJsZXByaW50LmgiCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgZmZfYWFjX3RhYmxlaW5pdCgpOworCisgICAgd3JpdGVfZmlsZWhlYWRlcigpOworCisgICAgV1JJVEVfQVJSQVkoImNvbnN0IiwgZmxvYXQsIGZmX2FhY19wb3cyc2ZfdGFiKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFjX3RhYmxlZ2VuLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNfdGFibGVnZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjcxZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjX3RhYmxlZ2VuLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIEhlYWRlciBmaWxlIGZvciBoYXJkY29kZWQgQUFDIHRhYmxlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBbGV4IENvbnZlcnNlIDxhbGV4LmNvbnZlcnNlQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FBQ19UQUJMRUdFTl9ICisjZGVmaW5lIEFWQ09ERUNfQUFDX1RBQkxFR0VOX0gKKworI2luY2x1ZGUgImFhY190YWJsZWdlbl9kZWNsLmgiCisKKyNpZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUworI2luY2x1ZGUgImxpYmF2Y29kZWMvYWFjX3RhYmxlcy5oIgorI2Vsc2UKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKK2Zsb2F0IGZmX2FhY19wb3cyc2ZfdGFiWzQyOF07CisKK2F2X2NvbGQgdm9pZCBmZl9hYWNfdGFibGVpbml0KHZvaWQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDQyODsgaSsrKQorICAgICAgICBmZl9hYWNfcG93MnNmX3RhYltpXSA9IHBvdygyLCAoaSAtIFBPV19TRjJfWkVSTykgLyA0LjApOworfQorI2VuZGlmIC8qIENPTkZJR19IQVJEQ09ERURfVEFCTEVTICovCisKKyNlbmRpZiAvKiBBVkNPREVDX0FBQ19UQUJMRUdFTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYWNfdGFibGVnZW5fZGVjbC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjX3RhYmxlZ2VuX2RlY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTA1ZGFlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjX3RhYmxlZ2VuX2RlY2wuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogSGVhZGVyIGZpbGUgZm9yIGhhcmRjb2RlZCBBQUMgdGFibGVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFsZXggQ29udmVyc2UgPGFsZXguY29udmVyc2VAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQUFDX1RBQkxFR0VOX0RFQ0xfSAorI2RlZmluZSBBVkNPREVDX0FBQ19UQUJMRUdFTl9ERUNMX0gKKworI2RlZmluZSBQT1dfU0YyX1pFUk8gICAgMjAwICAgIC8vLzwgZmZfYWFjX3BvdzJzZl90YWIgaW5kZXggY29ycmVzcG9uZGluZyB0byBwb3coMiwgMCk7CisKKyNpZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUworI2RlZmluZSBmZl9hYWNfdGFibGVpbml0KCkKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9hYWNfcG93MnNmX3RhYls0MjhdOworI2Vsc2UKK3ZvaWQgZmZfYWFjX3RhYmxlaW5pdCh2b2lkKTsKK2V4dGVybiAgICAgICBmbG9hdCBmZl9hYWNfcG93MnNmX3RhYls0MjhdOworI2VuZGlmIC8qIENPTkZJR19IQVJEQ09ERURfVEFCTEVTICovCisKKyNlbmRpZiAvKiBBVkNPREVDX0FBQ19UQUJMRUdFTl9ERUNMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY2FkdHNkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY2FkdHNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDgxNGFjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjYWR0c2RlYy5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBBdWRpbyBhbmQgVmlkZW8gZnJhbWUgZXh0cmFjdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBBbGV4IENvbnZlcnNlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhYWNfYWMzX3BhcnNlci5oIgorI2luY2x1ZGUgImFhY2FkdHNkZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgIm1wZWc0YXVkaW8uaCIKKworaW50IGF2cHJpdl9hYWNfcGFyc2VfaGVhZGVyKEdldEJpdENvbnRleHQgKmdiYywgQUFDQURUU0hlYWRlckluZm8gKmhkcikKK3sKKyAgICBpbnQgc2l6ZSwgcmRiLCBjaCwgc3I7CisgICAgaW50IGFvdCwgY3JjX2FiczsKKworICAgIGlmIChnZXRfYml0cyhnYmMsIDEyKSAhPSAweGZmZikKKyAgICAgICAgcmV0dXJuIEFBQ19BQzNfUEFSU0VfRVJST1JfU1lOQzsKKworICAgIHNraXBfYml0czEoZ2JjKTsgICAgICAgICAgICAgLyogaWQgKi8KKyAgICBza2lwX2JpdHMoZ2JjLCAyKTsgICAgICAgICAgIC8qIGxheWVyICovCisgICAgY3JjX2FicyA9IGdldF9iaXRzMShnYmMpOyAgICAvKiBwcm90ZWN0aW9uX2Fic2VudCAqLworICAgIGFvdCAgICAgPSBnZXRfYml0cyhnYmMsIDIpOyAgLyogcHJvZmlsZV9vYmplY3R0eXBlICovCisgICAgc3IgICAgICA9IGdldF9iaXRzKGdiYywgNCk7ICAvKiBzYW1wbGVfZnJlcXVlbmN5X2luZGV4ICovCisgICAgaWYgKCFhdnByaXZfbXBlZzRhdWRpb19zYW1wbGVfcmF0ZXNbc3JdKQorICAgICAgICByZXR1cm4gQUFDX0FDM19QQVJTRV9FUlJPUl9TQU1QTEVfUkFURTsKKyAgICBza2lwX2JpdHMxKGdiYyk7ICAgICAgICAgICAgIC8qIHByaXZhdGVfYml0ICovCisgICAgY2ggPSBnZXRfYml0cyhnYmMsIDMpOyAgICAgICAvKiBjaGFubmVsX2NvbmZpZ3VyYXRpb24gKi8KKworICAgIHNraXBfYml0czEoZ2JjKTsgICAgICAgICAgICAgLyogb3JpZ2luYWwvY29weSAqLworICAgIHNraXBfYml0czEoZ2JjKTsgICAgICAgICAgICAgLyogaG9tZSAqLworCisgICAgLyogYWR0c192YXJpYWJsZV9oZWFkZXIgKi8KKyAgICBza2lwX2JpdHMxKGdiYyk7ICAgICAgICAgICAgIC8qIGNvcHlyaWdodF9pZGVudGlmaWNhdGlvbl9iaXQgKi8KKyAgICBza2lwX2JpdHMxKGdiYyk7ICAgICAgICAgICAgIC8qIGNvcHlyaWdodF9pZGVudGlmaWNhdGlvbl9zdGFydCAqLworICAgIHNpemUgPSBnZXRfYml0cyhnYmMsIDEzKTsgICAgLyogYWFjX2ZyYW1lX2xlbmd0aCAqLworICAgIGlmIChzaXplIDwgQUFDX0FEVFNfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiBBQUNfQUMzX1BBUlNFX0VSUk9SX0ZSQU1FX1NJWkU7CisKKyAgICBza2lwX2JpdHMoZ2JjLCAxMSk7ICAgICAgICAgIC8qIGFkdHNfYnVmZmVyX2Z1bGxuZXNzICovCisgICAgcmRiID0gZ2V0X2JpdHMoZ2JjLCAyKTsgICAgICAvKiBudW1iZXJfb2ZfcmF3X2RhdGFfYmxvY2tzX2luX2ZyYW1lICovCisKKyAgICBoZHItPm9iamVjdF90eXBlICAgID0gYW90ICsgMTsKKyAgICBoZHItPmNoYW5fY29uZmlnICAgID0gY2g7CisgICAgaGRyLT5jcmNfYWJzZW50ICAgICA9IGNyY19hYnM7CisgICAgaGRyLT5udW1fYWFjX2ZyYW1lcyA9IHJkYiArIDE7CisgICAgaGRyLT5zYW1wbGluZ19pbmRleCA9IHNyOworICAgIGhkci0+c2FtcGxlX3JhdGUgICAgPSBhdnByaXZfbXBlZzRhdWRpb19zYW1wbGVfcmF0ZXNbc3JdOworICAgIGhkci0+c2FtcGxlcyAgICAgICAgPSAocmRiICsgMSkgKiAxMDI0OworICAgIGhkci0+Yml0X3JhdGUgICAgICAgPSBzaXplICogOCAqIGhkci0+c2FtcGxlX3JhdGUgLyBoZHItPnNhbXBsZXM7CisKKyAgICByZXR1cm4gc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY2FkdHNkZWMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY2FkdHNkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU4NGVmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjYWR0c2RlYy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBBQUMgQURUUyBoZWFkZXIgZGVjb2RpbmcgcHJvdG90eXBlcyBhbmQgc3RydWN0dXJlcworICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FBQ0FEVFNERUNfSAorI2RlZmluZSBBVkNPREVDX0FBQ0FEVFNERUNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworI2RlZmluZSBBQUNfQURUU19IRUFERVJfU0laRSA3CisKK3R5cGVkZWYgc3RydWN0IEFBQ0FEVFNIZWFkZXJJbmZvIHsKKyAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZTsKKyAgICB1aW50MzJfdCBzYW1wbGVzOworICAgIHVpbnQzMl90IGJpdF9yYXRlOworICAgIHVpbnQ4X3QgIGNyY19hYnNlbnQ7CisgICAgdWludDhfdCAgb2JqZWN0X3R5cGU7CisgICAgdWludDhfdCAgc2FtcGxpbmdfaW5kZXg7CisgICAgdWludDhfdCAgY2hhbl9jb25maWc7CisgICAgdWludDhfdCAgbnVtX2FhY19mcmFtZXM7Cit9IEFBQ0FEVFNIZWFkZXJJbmZvOworCisvKioKKyAqIFBhcnNlIEFBQyBmcmFtZSBoZWFkZXIuCisgKiBQYXJzZSB0aGUgQURUUyBmcmFtZSBoZWFkZXIgdG8gdGhlIGVuZCBvZiB0aGUgdmFyaWFibGUgaGVhZGVyLCB3aGljaCBpcworICogdGhlIGZpcnN0IDU0IGJpdHMuCisgKiBAcGFyYW1baW5dICBnYmMgQml0Q29udGV4dCBjb250YWluaW5nIHRoZSBmaXJzdCA1NCBiaXRzIG9mIHRoZSBmcmFtZS4KKyAqIEBwYXJhbVtvdXRdIGhkciBQb2ludGVyIHRvIHN0cnVjdCB3aGVyZSBoZWFkZXIgaW5mbyBpcyB3cml0dGVuLgorICogQHJldHVybiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgaWYgdGhlcmUgaXMgYSBzeW5jIHdvcmQgbWlzbWF0Y2gsCisgKiAtMiBpZiB0aGUgdmVyc2lvbiBlbGVtZW50IGlzIGludmFsaWQsIC0zIGlmIHRoZSBzYW1wbGUgcmF0ZQorICogZWxlbWVudCBpcyBpbnZhbGlkLCBvciAtNCBpZiB0aGUgYml0IHJhdGUgZWxlbWVudCBpcyBpbnZhbGlkLgorICovCitpbnQgYXZwcml2X2FhY19wYXJzZV9oZWFkZXIoR2V0Qml0Q29udGV4dCAqZ2JjLCBBQUNBRFRTSGVhZGVySW5mbyAqaGRyKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUFDQURUU0RFQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYWNjb2Rlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmY2YTljCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjY29kZXIuYwpAQCAtMCwwICsxLDExMzggQEAKKy8qCisgKiBBQUMgY29lZmZpY2llbnRzIGVuY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQUFDIGNvZWZmaWNpZW50cyBlbmNvZGVyCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgVE9ET3M6CisgKiBzcGVlZHVwIHF1YW50aXplciBzZWxlY3Rpb24KKyAqIGFkZCBzYW5lIHB1bHNlIGRldGVjdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIgLy8gYnJvdWdodCBmb3J3YXJkIHRvIHdvcmsgYXJvdW5kIGN5Z3dpbiBoZWFkZXIgYnJlYWthZ2UKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAiYWFjLmgiCisjaW5jbHVkZSAiYWFjZW5jLmgiCisjaW5jbHVkZSAiYWFjdGFiLmgiCisKKy8qKiBiaXRzIG5lZWRlZCB0byBjb2RlIGNvZGVib29rIHJ1biB2YWx1ZSBmb3IgbG9uZyB3aW5kb3dzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBydW5fdmFsdWVfYml0c19sb25nWzY0XSA9IHsKKyAgICAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwKKyAgICAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxNQorfTsKKworLyoqIGJpdHMgbmVlZGVkIHRvIGNvZGUgY29kZWJvb2sgcnVuIHZhbHVlIGZvciBzaG9ydCB3aW5kb3dzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBydW5fdmFsdWVfYml0c19zaG9ydFsxNl0gPSB7CisgICAgMywgMywgMywgMywgMywgMywgMywgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgOQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCBydW5fdmFsdWVfYml0c1syXSA9IHsKKyAgICBydW5fdmFsdWVfYml0c19sb25nLCBydW5fdmFsdWVfYml0c19zaG9ydAorfTsKKworCisvKioKKyAqIFF1YW50aXplIG9uZSBjb2VmZmljaWVudC4KKyAqIEByZXR1cm4gYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudAorICogQHNlZSAzR1BQIFRTMjYuNDAzIDUuNi4yICJTY2FsZWZhY3RvciBkZXRlcm1pbmF0aW9uIgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgcXVhbnQoZmxvYXQgY29lZiwgY29uc3QgZmxvYXQgUSkKK3sKKyAgICBmbG9hdCBhID0gY29lZiAqIFE7CisgICAgcmV0dXJuIHNxcnRmKGEgKiBzcXJ0ZihhKSkgKyAwLjQwNTQ7Cit9CisKK3N0YXRpYyB2b2lkIHF1YW50aXplX2JhbmRzKGludCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIGNvbnN0IGZsb2F0ICpzY2FsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgZmxvYXQgUTM0LCBpbnQgaXNfc2lnbmVkLCBpbnQgbWF4dmFsKQoreworICAgIGludCBpOworICAgIGRvdWJsZSBxYzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHFjID0gc2NhbGVkW2ldICogUTM0OworICAgICAgICBvdXRbaV0gPSAoaW50KUZGTUlOKHFjICsgMC40MDU0LCAoZG91YmxlKW1heHZhbCk7CisgICAgICAgIGlmIChpc19zaWduZWQgJiYgaW5baV0gPCAwLjBmKSB7CisgICAgICAgICAgICBvdXRbaV0gPSAtb3V0W2ldOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhYnNfcG93MzRfdihmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIGNvbnN0IGludCBzaXplKQoreworI2lmbmRlZiBVU0VfUkVBTExZX0ZVTExfU0VBUkNICisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBmbG9hdCBhID0gZmFic2YoaW5baV0pOworICAgICAgICBvdXRbaV0gPSBzcXJ0ZihhICogc3FydGYoYSkpOworICAgIH0KKyNlbmRpZiAvKiBVU0VfUkVBTExZX0ZVTExfU0VBUkNIICovCit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFhY19jYl9yYW5nZSBbMTJdID0gezAsIDMsIDMsIDMsIDMsIDksIDksIDgsIDgsIDEzLCAxMywgMTd9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWFjX2NiX21heHZhbFsxMl0gPSB7MCwgMSwgMSwgMiwgMiwgNCwgNCwgNywgNywgMTIsIDEyLCAxNn07CisKKy8qKgorICogQ2FsY3VsYXRlIHJhdGUgZGlzdG9ydGlvbiBjb3N0IGZvciBxdWFudGl6aW5nIHdpdGggZ2l2ZW4gY29kZWJvb2sKKyAqCisgKiBAcmV0dXJuIHF1YW50aXphdGlvbiBkaXN0b3J0aW9uCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGZsb2F0IHF1YW50aXplX2FuZF9lbmNvZGVfYmFuZF9jb3N0X3RlbXBsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqcGIsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpiaXRzLCBpbnQgQlRfWkVSTywgaW50IEJUX1VOU0lHTkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQlRfUEFJUiwgaW50IEJUX0VTQykKK3sKKyAgICBjb25zdCBpbnQgcV9pZHggPSBQT1dfU0YyX1pFUk8gLSBzY2FsZV9pZHggKyBTQ0FMRV9PTkVfUE9TIC0gU0NBTEVfRElWXzUxMjsKKyAgICBjb25zdCBmbG9hdCBRICAgPSBmZl9hYWNfcG93MnNmX3RhYiBbcV9pZHhdOworICAgIGNvbnN0IGZsb2F0IFEzNCA9IGZmX2FhY19wb3czNHNmX3RhYltxX2lkeF07CisgICAgY29uc3QgZmxvYXQgSVEgID0gZmZfYWFjX3BvdzJzZl90YWIgW1BPV19TRjJfWkVSTyArIHNjYWxlX2lkeCAtIFNDQUxFX09ORV9QT1MgKyBTQ0FMRV9ESVZfNTEyXTsKKyAgICBjb25zdCBmbG9hdCBDTElQUEVEX0VTQ0FQRSA9IDE2NTE0MC4wZipJUTsKKyAgICBpbnQgaSwgajsKKyAgICBmbG9hdCBjb3N0ID0gMDsKKyAgICBjb25zdCBpbnQgZGltID0gQlRfUEFJUiA/IDIgOiA0OworICAgIGludCByZXNiaXRzID0gMDsKKyAgICBjb25zdCBpbnQgcmFuZ2UgID0gYWFjX2NiX3JhbmdlW2NiXTsKKyAgICBjb25zdCBpbnQgbWF4dmFsID0gYWFjX2NiX21heHZhbFtjYl07CisgICAgaW50IG9mZjsKKworICAgIGlmIChCVF9aRVJPKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICBjb3N0ICs9IGluW2ldKmluW2ldOworICAgICAgICBpZiAoYml0cykKKyAgICAgICAgICAgICpiaXRzID0gMDsKKyAgICAgICAgcmV0dXJuIGNvc3QgKiBsYW1iZGE7CisgICAgfQorICAgIGlmICghc2NhbGVkKSB7CisgICAgICAgIGFic19wb3czNF92KHMtPnNjb2VmcywgaW4sIHNpemUpOworICAgICAgICBzY2FsZWQgPSBzLT5zY29lZnM7CisgICAgfQorICAgIHF1YW50aXplX2JhbmRzKHMtPnFjb2VmcywgaW4sIHNjYWxlZCwgc2l6ZSwgUTM0LCAhQlRfVU5TSUdORUQsIG1heHZhbCk7CisgICAgaWYgKEJUX1VOU0lHTkVEKSB7CisgICAgICAgIG9mZiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb2ZmID0gbWF4dmFsOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBkaW0pIHsKKyAgICAgICAgY29uc3QgZmxvYXQgKnZlYzsKKyAgICAgICAgaW50ICpxdWFudHMgPSBzLT5xY29lZnMgKyBpOworICAgICAgICBpbnQgY3VyaWR4ID0gMDsKKyAgICAgICAgaW50IGN1cmJpdHM7CisgICAgICAgIGZsb2F0IHJkID0gMC4wZjsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGRpbTsgaisrKSB7CisgICAgICAgICAgICBjdXJpZHggKj0gcmFuZ2U7CisgICAgICAgICAgICBjdXJpZHggKz0gcXVhbnRzW2pdICsgb2ZmOworICAgICAgICB9CisgICAgICAgIGN1cmJpdHMgPSAgZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV1bY3VyaWR4XTsKKyAgICAgICAgdmVjICAgICA9ICZmZl9hYWNfY29kZWJvb2tfdmVjdG9yc1tjYi0xXVtjdXJpZHgqZGltXTsKKyAgICAgICAgaWYgKEJUX1VOU0lHTkVEKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZGltOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ID0gZmFic2YoaW5baStqXSk7CisgICAgICAgICAgICAgICAgZmxvYXQgZGk7CisgICAgICAgICAgICAgICAgaWYgKEJUX0VTQyAmJiB2ZWNbal0gPT0gNjQuMGYpIHsgLy9GSVhNRTogc2xvdworICAgICAgICAgICAgICAgICAgICBpZiAodCA+PSBDTElQUEVEX0VTQ0FQRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGkgPSB0IC0gQ0xJUFBFRF9FU0NBUEU7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJiaXRzICs9IDIxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGMgPSBhdl9jbGlwKHF1YW50KHQsIFEpLCAwLCA4MTkxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpID0gdCAtIGMqY2JydGYoYykqSVE7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJiaXRzICs9IGF2X2xvZzIoYykqMiAtIDQgKyAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGkgPSB0IC0gdmVjW2pdKklROworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmVjW2pdICE9IDAuMGYpCisgICAgICAgICAgICAgICAgICAgIGN1cmJpdHMrKzsKKyAgICAgICAgICAgICAgICByZCArPSBkaSpkaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkaW07IGorKykgeworICAgICAgICAgICAgICAgIGZsb2F0IGRpID0gaW5baStqXSAtIHZlY1tqXSpJUTsKKyAgICAgICAgICAgICAgICByZCArPSBkaSpkaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb3N0ICAgICs9IHJkICogbGFtYmRhICsgY3VyYml0czsKKyAgICAgICAgcmVzYml0cyArPSBjdXJiaXRzOworICAgICAgICBpZiAoY29zdCA+PSB1cGxpbSkKKyAgICAgICAgICAgIHJldHVybiB1cGxpbTsKKyAgICAgICAgaWYgKHBiKSB7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV1bY3VyaWR4XSwgZmZfYWFjX3NwZWN0cmFsX2NvZGVzW2NiLTFdW2N1cmlkeF0pOworICAgICAgICAgICAgaWYgKEJUX1VOU0lHTkVEKQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkaW07IGorKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZmX2FhY19jb2RlYm9va192ZWN0b3JzW2NiLTFdW2N1cmlkeCpkaW0ral0gIT0gMC4wZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCBpbltpK2pdIDwgMC4wZik7CisgICAgICAgICAgICBpZiAoQlRfRVNDKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmZfYWFjX2NvZGVib29rX3ZlY3RvcnNbY2ItMV1bY3VyaWR4KjIral0gPT0gNjQuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2VmID0gYXZfY2xpcChxdWFudChmYWJzZihpbltpK2pdKSwgUSksIDAsIDgxOTEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IGF2X2xvZzIoY29lZik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBsZW4gLSA0ICsgMSwgKDEgPDwgKGxlbiAtIDQgKyAxKSkgLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBsZW4sIGNvZWYgJiAoKDEgPDwgbGVuKSAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiaXRzKQorICAgICAgICAqYml0cyA9IHJlc2JpdHM7CisgICAgcmV0dXJuIGNvc3Q7Cit9CisKKyNkZWZpbmUgUVVBTlRJWkVfQU5EX0VOQ09ERV9CQU5EX0NPU1RfRlVOQyhOQU1FLCBCVF9aRVJPLCBCVF9VTlNJR05FRCwgQlRfUEFJUiwgQlRfRVNDKSBcCitzdGF0aWMgZmxvYXQgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfICMjIE5BTUUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEFBQ0VuY0NvbnRleHQgKnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKnBiLCBjb25zdCBmbG9hdCAqaW4sICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLCBjb25zdCBmbG9hdCBsYW1iZGEsIGNvbnN0IGZsb2F0IHVwbGltLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYml0cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdF90ZW1wbGF0ZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgcGIsIGluLCBzY2FsZWQsIHNpemUsIHNjYWxlX2lkeCwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0VTQyA/IEVTQ19CVCA6IGNiLCBsYW1iZGEsIHVwbGltLCBiaXRzLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9aRVJPLCBCVF9VTlNJR05FRCwgQlRfUEFJUiwgQlRfRVNDKTsgICAgICAgICAgICAgICAgIFwKK30KKworUVVBTlRJWkVfQU5EX0VOQ09ERV9CQU5EX0NPU1RfRlVOQyhaRVJPLCAgMSwgMCwgMCwgMCkKK1FVQU5USVpFX0FORF9FTkNPREVfQkFORF9DT1NUX0ZVTkMoU1FVQUQsIDAsIDAsIDAsIDApCitRVUFOVElaRV9BTkRfRU5DT0RFX0JBTkRfQ09TVF9GVU5DKFVRVUFELCAwLCAxLCAwLCAwKQorUVVBTlRJWkVfQU5EX0VOQ09ERV9CQU5EX0NPU1RfRlVOQyhTUEFJUiwgMCwgMCwgMSwgMCkKK1FVQU5USVpFX0FORF9FTkNPREVfQkFORF9DT1NUX0ZVTkMoVVBBSVIsIDAsIDEsIDEsIDApCitRVUFOVElaRV9BTkRfRU5DT0RFX0JBTkRfQ09TVF9GVU5DKEVTQywgICAwLCAxLCAxLCAxKQorCitzdGF0aWMgZmxvYXQgKCpjb25zdCBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdF9hcnJbXSkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBBQUNFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLCBjb25zdCBmbG9hdCBsYW1iZGEsIGNvbnN0IGZsb2F0IHVwbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpID0geworICAgIHF1YW50aXplX2FuZF9lbmNvZGVfYmFuZF9jb3N0X1pFUk8sCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfU1FVQUQsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfU1FVQUQsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfVVFVQUQsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfVVFVQUQsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfU1BBSVIsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfU1BBSVIsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfVVBBSVIsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfVVBBSVIsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfVVBBSVIsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfVVBBSVIsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfRVNDLAorfTsKKworI2RlZmluZSBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBwYiwgaW4sIHNjYWxlZCwgc2l6ZSwgc2NhbGVfaWR4LCBjYiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEsIHVwbGltLCBiaXRzKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHF1YW50aXplX2FuZF9lbmNvZGVfYmFuZF9jb3N0X2FycltjYl0oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBwYiwgaW4sIHNjYWxlZCwgc2l6ZSwgc2NhbGVfaWR4LCBjYiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEsIHVwbGltLCBiaXRzKQorCitzdGF0aWMgZmxvYXQgcXVhbnRpemVfYmFuZF9jb3N0KHN0cnVjdCBBQUNFbmNDb250ZXh0ICpzLCBjb25zdCBmbG9hdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZWQsIGludCBzaXplLCBpbnQgc2NhbGVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2IsIGNvbnN0IGZsb2F0IGxhbWJkYSwgY29uc3QgZmxvYXQgdXBsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYml0cykKK3sKKyAgICByZXR1cm4gcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3QocywgTlVMTCwgaW4sIHNjYWxlZCwgc2l6ZSwgc2NhbGVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYiwgbGFtYmRhLCB1cGxpbSwgYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHF1YW50aXplX2FuZF9lbmNvZGVfYmFuZChzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywgUHV0Qml0Q29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2IsIGNvbnN0IGZsb2F0IGxhbWJkYSkKK3sKKyAgICBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdChzLCBwYiwgaW4sIE5VTEwsIHNpemUsIHNjYWxlX2lkeCwgY2IsIGxhbWJkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklUWSwgTlVMTCk7Cit9CisKK3N0YXRpYyBmbG9hdCBmaW5kX21heF92YWwoaW50IGdyb3VwX2xlbiwgaW50IHN3Yl9zaXplLCBjb25zdCBmbG9hdCAqc2NhbGVkKSB7CisgICAgZmxvYXQgbWF4dmFsID0gMC4wZjsKKyAgICBpbnQgdzIsIGk7CisgICAgZm9yICh3MiA9IDA7IHcyIDwgZ3JvdXBfbGVuOyB3MisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzd2Jfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBtYXh2YWwgPSBGRk1BWChtYXh2YWwsIHNjYWxlZFt3MioxMjgraV0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtYXh2YWw7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9taW5fYm9vayhmbG9hdCBtYXh2YWwsIGludCBzZikgeworICAgIGZsb2F0IFEgPSBmZl9hYWNfcG93MnNmX3RhYltQT1dfU0YyX1pFUk8gLSBzZiArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBmbG9hdCBRMzQgPSBzcXJ0ZihRICogc3FydGYoUSkpOworICAgIGludCBxbWF4dmFsLCBjYjsKKyAgICBxbWF4dmFsID0gbWF4dmFsICogUTM0ICsgMC40MDU0ZjsKKyAgICBpZiAgICAgIChxbWF4dmFsID09ICAwKSBjYiA9IDA7CisgICAgZWxzZSBpZiAocW1heHZhbCA9PSAgMSkgY2IgPSAxOworICAgIGVsc2UgaWYgKHFtYXh2YWwgPT0gIDIpIGNiID0gMzsKKyAgICBlbHNlIGlmIChxbWF4dmFsIDw9ICA0KSBjYiA9IDU7CisgICAgZWxzZSBpZiAocW1heHZhbCA8PSAgNykgY2IgPSA3OworICAgIGVsc2UgaWYgKHFtYXh2YWwgPD0gMTIpIGNiID0gOTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICBjYiA9IDExOworICAgIHJldHVybiBjYjsKK30KKworLyoqCisgKiBzdHJ1Y3R1cmUgdXNlZCBpbiBvcHRpbWFsIGNvZGVib29rIHNlYXJjaAorICovCit0eXBlZGVmIHN0cnVjdCBCYW5kQ29kaW5nUGF0aCB7CisgICAgaW50IHByZXZfaWR4OyAvLy88IHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIHBhdGggcG9pbnQKKyAgICBmbG9hdCBjb3N0OyAgIC8vLzwgcGF0aCBjb3N0CisgICAgaW50IHJ1bjsKK30gQmFuZENvZGluZ1BhdGg7CisKKy8qKgorICogRW5jb2RlIGJhbmQgaW5mbyBmb3Igc2luZ2xlIHdpbmRvdyBncm91cCBiYW5kcy4KKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX3dpbmRvd19iYW5kc19pbmZvKEFBQ0VuY0NvbnRleHQgKnMsIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbiwgaW50IGdyb3VwX2xlbiwgY29uc3QgZmxvYXQgbGFtYmRhKQoreworICAgIEJhbmRDb2RpbmdQYXRoIHBhdGhbMTIwXVsxMl07CisgICAgaW50IHcsIHN3YiwgY2IsIHN0YXJ0LCBzaXplOworICAgIGludCBpLCBqOworICAgIGNvbnN0IGludCBtYXhfc2ZiICA9IHNjZS0+aWNzLm1heF9zZmI7CisgICAgY29uc3QgaW50IHJ1bl9iaXRzID0gc2NlLT5pY3MubnVtX3dpbmRvd3MgPT0gMSA/IDUgOiAzOworICAgIGNvbnN0IGludCBydW5fZXNjICA9ICgxIDw8IHJ1bl9iaXRzKSAtIDE7CisgICAgaW50IGlkeCwgcHBvcywgY291bnQ7CisgICAgaW50IHN0YWNrcnVuWzEyMF0sIHN0YWNrY2JbMTIwXSwgc3RhY2tfbGVuOworICAgIGZsb2F0IG5leHRfbWlucmQgPSBJTkZJTklUWTsKKyAgICBpbnQgbmV4dF9taW5jYiA9IDA7CisKKyAgICBhYnNfcG93MzRfdihzLT5zY29lZnMsIHNjZS0+Y29lZmZzLCAxMDI0KTsKKyAgICBzdGFydCA9IHdpbioxMjg7CisgICAgZm9yIChjYiA9IDA7IGNiIDwgMTI7IGNiKyspIHsKKyAgICAgICAgcGF0aFswXVtjYl0uY29zdCAgICAgPSAwLjBmOworICAgICAgICBwYXRoWzBdW2NiXS5wcmV2X2lkeCA9IC0xOworICAgICAgICBwYXRoWzBdW2NiXS5ydW4gICAgICA9IDA7CisgICAgfQorICAgIGZvciAoc3diID0gMDsgc3diIDwgbWF4X3NmYjsgc3diKyspIHsKKyAgICAgICAgc2l6ZSA9IHNjZS0+aWNzLnN3Yl9zaXplc1tzd2JdOworICAgICAgICBpZiAoc2NlLT56ZXJvZXNbd2luKjE2ICsgc3diXSkgeworICAgICAgICAgICAgZm9yIChjYiA9IDA7IGNiIDwgMTI7IGNiKyspIHsKKyAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0ucHJldl9pZHggPSBjYjsKKyAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0uY29zdCAgICAgPSBwYXRoW3N3Yl1bY2JdLmNvc3Q7CisgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLnJ1biAgICAgID0gcGF0aFtzd2JdW2NiXS5ydW4gKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxvYXQgbWlucmQgPSBuZXh0X21pbnJkOworICAgICAgICAgICAgaW50IG1pbmNiID0gbmV4dF9taW5jYjsKKyAgICAgICAgICAgIG5leHRfbWlucmQgPSBJTkZJTklUWTsKKyAgICAgICAgICAgIG5leHRfbWluY2IgPSAwOworICAgICAgICAgICAgZm9yIChjYiA9IDA7IGNiIDwgMTI7IGNiKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBjb3N0X3N0YXlfaGVyZSwgY29zdF9nZXRfaGVyZTsKKyAgICAgICAgICAgICAgICBmbG9hdCByZCA9IDAuMGY7CisgICAgICAgICAgICAgICAgZm9yICh3ID0gMDsgdyA8IGdyb3VwX2xlbjsgdysrKSB7CisgICAgICAgICAgICAgICAgICAgIEZGUHN5QmFuZCAqYmFuZCA9ICZzLT5wc3kuY2hbcy0+Y3VyX2NoYW5uZWxdLnBzeV9iYW5kc1sod2luK3cpKjE2K3N3Yl07CisgICAgICAgICAgICAgICAgICAgIHJkICs9IHF1YW50aXplX2JhbmRfY29zdChzLCBzY2UtPmNvZWZmcyArIHN0YXJ0ICsgdyoxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zY29lZnMgKyBzdGFydCArIHcqMTI4LCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbKHdpbit3KSoxNitzd2JdLCBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSAvIGJhbmQtPnRocmVzaG9sZCwgSU5GSU5JVFksIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb3N0X3N0YXlfaGVyZSA9IHBhdGhbc3diXVtjYl0uY29zdCArIHJkOworICAgICAgICAgICAgICAgIGNvc3RfZ2V0X2hlcmUgID0gbWlucmQgICAgICAgICAgICAgICsgcmQgKyBydW5fYml0cyArIDQ7CisgICAgICAgICAgICAgICAgaWYgKCAgIHJ1bl92YWx1ZV9iaXRzW3NjZS0+aWNzLm51bV93aW5kb3dzID09IDhdW3BhdGhbc3diXVtjYl0ucnVuXQorICAgICAgICAgICAgICAgICAgICAhPSBydW5fdmFsdWVfYml0c1tzY2UtPmljcy5udW1fd2luZG93cyA9PSA4XVtwYXRoW3N3Yl1bY2JdLnJ1bisxXSkKKyAgICAgICAgICAgICAgICAgICAgY29zdF9zdGF5X2hlcmUgKz0gcnVuX2JpdHM7CisgICAgICAgICAgICAgICAgaWYgKGNvc3RfZ2V0X2hlcmUgPCBjb3N0X3N0YXlfaGVyZSkgeworICAgICAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0ucHJldl9pZHggPSBtaW5jYjsKKyAgICAgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLmNvc3QgICAgID0gY29zdF9nZXRfaGVyZTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLnJ1biAgICAgID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0ucHJldl9pZHggPSBjYjsKKyAgICAgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLmNvc3QgICAgID0gY29zdF9zdGF5X2hlcmU7CisgICAgICAgICAgICAgICAgICAgIHBhdGhbc3diKzFdW2NiXS5ydW4gICAgICA9IHBhdGhbc3diXVtjYl0ucnVuICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhdGhbc3diKzFdW2NiXS5jb3N0IDwgbmV4dF9taW5yZCkgeworICAgICAgICAgICAgICAgICAgICBuZXh0X21pbnJkID0gcGF0aFtzd2IrMV1bY2JdLmNvc3Q7CisgICAgICAgICAgICAgICAgICAgIG5leHRfbWluY2IgPSBjYjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhcnQgKz0gc2NlLT5pY3Muc3diX3NpemVzW3N3Yl07CisgICAgfQorCisgICAgLy9jb252ZXJ0IHJlc3VsdGluZyBwYXRoIGZyb20gYmFja3dhcmQtbGlua2VkIGxpc3QKKyAgICBzdGFja19sZW4gPSAwOworICAgIGlkeCAgICAgICA9IDA7CisgICAgZm9yIChjYiA9IDE7IGNiIDwgMTI7IGNiKyspCisgICAgICAgIGlmIChwYXRoW21heF9zZmJdW2NiXS5jb3N0IDwgcGF0aFttYXhfc2ZiXVtpZHhdLmNvc3QpCisgICAgICAgICAgICBpZHggPSBjYjsKKyAgICBwcG9zID0gbWF4X3NmYjsKKyAgICB3aGlsZSAocHBvcyA+IDApIHsKKyAgICAgICAgY2IgPSBpZHg7CisgICAgICAgIHN0YWNrcnVuW3N0YWNrX2xlbl0gPSBwYXRoW3Bwb3NdW2NiXS5ydW47CisgICAgICAgIHN0YWNrY2IgW3N0YWNrX2xlbl0gPSBjYjsKKyAgICAgICAgaWR4ID0gcGF0aFtwcG9zLXBhdGhbcHBvc11bY2JdLnJ1bisxXVtjYl0ucHJldl9pZHg7CisgICAgICAgIHBwb3MgLT0gcGF0aFtwcG9zXVtjYl0ucnVuOworICAgICAgICBzdGFja19sZW4rKzsKKyAgICB9CisgICAgLy9wZXJmb3JtIGFjdHVhbCBiYW5kIGluZm8gZW5jb2RpbmcKKyAgICBzdGFydCA9IDA7CisgICAgZm9yIChpID0gc3RhY2tfbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCBzdGFja2NiW2ldKTsKKyAgICAgICAgY291bnQgPSBzdGFja3J1bltpXTsKKyAgICAgICAgbWVtc2V0KHNjZS0+emVyb2VzICsgd2luKjE2ICsgc3RhcnQsICFzdGFja2NiW2ldLCBjb3VudCk7CisgICAgICAgIC8vWFhYOiBtZW1zZXQgd2hlbiBiYW5kX3R5cGUgaXMgYWxzbyB1aW50OF90CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisgICAgICAgICAgICBzY2UtPmJhbmRfdHlwZVt3aW4qMTYgKyBzdGFydF0gPSAgc3RhY2tjYltpXTsKKyAgICAgICAgICAgIHN0YXJ0Kys7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGNvdW50ID49IHJ1bl9lc2MpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcnVuX2JpdHMsIHJ1bl9lc2MpOworICAgICAgICAgICAgY291bnQgLT0gcnVuX2VzYzsKKyAgICAgICAgfQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIHJ1bl9iaXRzLCBjb3VudCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb2RlYm9va190cmVsbGlzX3JhdGUoQUFDRW5jQ29udGV4dCAqcywgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luLCBpbnQgZ3JvdXBfbGVuLCBjb25zdCBmbG9hdCBsYW1iZGEpCit7CisgICAgQmFuZENvZGluZ1BhdGggcGF0aFsxMjBdWzEyXTsKKyAgICBpbnQgdywgc3diLCBjYiwgc3RhcnQsIHNpemU7CisgICAgaW50IGksIGo7CisgICAgY29uc3QgaW50IG1heF9zZmIgID0gc2NlLT5pY3MubWF4X3NmYjsKKyAgICBjb25zdCBpbnQgcnVuX2JpdHMgPSBzY2UtPmljcy5udW1fd2luZG93cyA9PSAxID8gNSA6IDM7CisgICAgY29uc3QgaW50IHJ1bl9lc2MgID0gKDEgPDwgcnVuX2JpdHMpIC0gMTsKKyAgICBpbnQgaWR4LCBwcG9zLCBjb3VudDsKKyAgICBpbnQgc3RhY2tydW5bMTIwXSwgc3RhY2tjYlsxMjBdLCBzdGFja19sZW47CisgICAgZmxvYXQgbmV4dF9taW5iaXRzID0gSU5GSU5JVFk7CisgICAgaW50IG5leHRfbWluY2IgPSAwOworCisgICAgYWJzX3BvdzM0X3Yocy0+c2NvZWZzLCBzY2UtPmNvZWZmcywgMTAyNCk7CisgICAgc3RhcnQgPSB3aW4qMTI4OworICAgIGZvciAoY2IgPSAwOyBjYiA8IDEyOyBjYisrKSB7CisgICAgICAgIHBhdGhbMF1bY2JdLmNvc3QgICAgID0gcnVuX2JpdHMrNDsKKyAgICAgICAgcGF0aFswXVtjYl0ucHJldl9pZHggPSAtMTsKKyAgICAgICAgcGF0aFswXVtjYl0ucnVuICAgICAgPSAwOworICAgIH0KKyAgICBmb3IgKHN3YiA9IDA7IHN3YiA8IG1heF9zZmI7IHN3YisrKSB7CisgICAgICAgIHNpemUgPSBzY2UtPmljcy5zd2Jfc2l6ZXNbc3diXTsKKyAgICAgICAgaWYgKHNjZS0+emVyb2VzW3dpbioxNiArIHN3Yl0pIHsKKyAgICAgICAgICAgIGZsb2F0IGNvc3Rfc3RheV9oZXJlID0gcGF0aFtzd2JdWzBdLmNvc3Q7CisgICAgICAgICAgICBmbG9hdCBjb3N0X2dldF9oZXJlICA9IG5leHRfbWluYml0cyArIHJ1bl9iaXRzICsgNDsKKyAgICAgICAgICAgIGlmICggICBydW5fdmFsdWVfYml0c1tzY2UtPmljcy5udW1fd2luZG93cyA9PSA4XVtwYXRoW3N3Yl1bMF0ucnVuXQorICAgICAgICAgICAgICAgICE9IHJ1bl92YWx1ZV9iaXRzW3NjZS0+aWNzLm51bV93aW5kb3dzID09IDhdW3BhdGhbc3diXVswXS5ydW4rMV0pCisgICAgICAgICAgICAgICAgY29zdF9zdGF5X2hlcmUgKz0gcnVuX2JpdHM7CisgICAgICAgICAgICBpZiAoY29zdF9nZXRfaGVyZSA8IGNvc3Rfc3RheV9oZXJlKSB7CisgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bMF0ucHJldl9pZHggPSBuZXh0X21pbmNiOworICAgICAgICAgICAgICAgIHBhdGhbc3diKzFdWzBdLmNvc3QgICAgID0gY29zdF9nZXRfaGVyZTsKKyAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVswXS5ydW4gICAgICA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhdGhbc3diKzFdWzBdLnByZXZfaWR4ID0gMDsKKyAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVswXS5jb3N0ICAgICA9IGNvc3Rfc3RheV9oZXJlOworICAgICAgICAgICAgICAgIHBhdGhbc3diKzFdWzBdLnJ1biAgICAgID0gcGF0aFtzd2JdWzBdLnJ1biArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0X21pbmJpdHMgPSBwYXRoW3N3YisxXVswXS5jb3N0OworICAgICAgICAgICAgbmV4dF9taW5jYiA9IDA7CisgICAgICAgICAgICBmb3IgKGNiID0gMTsgY2IgPCAxMjsgY2IrKykgeworICAgICAgICAgICAgICAgIHBhdGhbc3diKzFdW2NiXS5jb3N0ID0gNjE0NTA7CisgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLnByZXZfaWR4ID0gLTE7CisgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLnJ1biA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbG9hdCBtaW5iaXRzID0gbmV4dF9taW5iaXRzOworICAgICAgICAgICAgaW50IG1pbmNiID0gbmV4dF9taW5jYjsKKyAgICAgICAgICAgIGludCBzdGFydGNiID0gc2NlLT5iYW5kX3R5cGVbd2luKjE2K3N3Yl07CisgICAgICAgICAgICBuZXh0X21pbmJpdHMgPSBJTkZJTklUWTsKKyAgICAgICAgICAgIG5leHRfbWluY2IgPSAwOworICAgICAgICAgICAgZm9yIChjYiA9IDA7IGNiIDwgc3RhcnRjYjsgY2IrKykgeworICAgICAgICAgICAgICAgIHBhdGhbc3diKzFdW2NiXS5jb3N0ID0gNjE0NTA7CisgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLnByZXZfaWR4ID0gLTE7CisgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLnJ1biA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNiID0gc3RhcnRjYjsgY2IgPCAxMjsgY2IrKykgeworICAgICAgICAgICAgICAgIGZsb2F0IGNvc3Rfc3RheV9oZXJlLCBjb3N0X2dldF9oZXJlOworICAgICAgICAgICAgICAgIGZsb2F0IGJpdHMgPSAwLjBmOworICAgICAgICAgICAgICAgIGZvciAodyA9IDA7IHcgPCBncm91cF9sZW47IHcrKykgeworICAgICAgICAgICAgICAgICAgICBiaXRzICs9IHF1YW50aXplX2JhbmRfY29zdChzLCBzY2UtPmNvZWZmcyArIHN0YXJ0ICsgdyoxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNjb2VmcyArIHN0YXJ0ICsgdyoxMjgsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4Wyh3aW4rdykqMTYrc3diXSwgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIElORklOSVRZLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29zdF9zdGF5X2hlcmUgPSBwYXRoW3N3Yl1bY2JdLmNvc3QgKyBiaXRzOworICAgICAgICAgICAgICAgIGNvc3RfZ2V0X2hlcmUgID0gbWluYml0cyAgICAgICAgICAgICsgYml0cyArIHJ1bl9iaXRzICsgNDsKKyAgICAgICAgICAgICAgICBpZiAoICAgcnVuX3ZhbHVlX2JpdHNbc2NlLT5pY3MubnVtX3dpbmRvd3MgPT0gOF1bcGF0aFtzd2JdW2NiXS5ydW5dCisgICAgICAgICAgICAgICAgICAgICE9IHJ1bl92YWx1ZV9iaXRzW3NjZS0+aWNzLm51bV93aW5kb3dzID09IDhdW3BhdGhbc3diXVtjYl0ucnVuKzFdKQorICAgICAgICAgICAgICAgICAgICBjb3N0X3N0YXlfaGVyZSArPSBydW5fYml0czsKKyAgICAgICAgICAgICAgICBpZiAoY29zdF9nZXRfaGVyZSA8IGNvc3Rfc3RheV9oZXJlKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGhbc3diKzFdW2NiXS5wcmV2X2lkeCA9IG1pbmNiOworICAgICAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0uY29zdCAgICAgPSBjb3N0X2dldF9oZXJlOworICAgICAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0ucnVuICAgICAgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGhbc3diKzFdW2NiXS5wcmV2X2lkeCA9IGNiOworICAgICAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0uY29zdCAgICAgPSBjb3N0X3N0YXlfaGVyZTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLnJ1biAgICAgID0gcGF0aFtzd2JdW2NiXS5ydW4gKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGF0aFtzd2IrMV1bY2JdLmNvc3QgPCBuZXh0X21pbmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dF9taW5iaXRzID0gcGF0aFtzd2IrMV1bY2JdLmNvc3Q7CisgICAgICAgICAgICAgICAgICAgIG5leHRfbWluY2IgPSBjYjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhcnQgKz0gc2NlLT5pY3Muc3diX3NpemVzW3N3Yl07CisgICAgfQorCisgICAgLy9jb252ZXJ0IHJlc3VsdGluZyBwYXRoIGZyb20gYmFja3dhcmQtbGlua2VkIGxpc3QKKyAgICBzdGFja19sZW4gPSAwOworICAgIGlkeCAgICAgICA9IDA7CisgICAgZm9yIChjYiA9IDE7IGNiIDwgMTI7IGNiKyspCisgICAgICAgIGlmIChwYXRoW21heF9zZmJdW2NiXS5jb3N0IDwgcGF0aFttYXhfc2ZiXVtpZHhdLmNvc3QpCisgICAgICAgICAgICBpZHggPSBjYjsKKyAgICBwcG9zID0gbWF4X3NmYjsKKyAgICB3aGlsZSAocHBvcyA+IDApIHsKKyAgICAgICAgYXZfYXNzZXJ0MShpZHggPj0gMCk7CisgICAgICAgIGNiID0gaWR4OworICAgICAgICBzdGFja3J1bltzdGFja19sZW5dID0gcGF0aFtwcG9zXVtjYl0ucnVuOworICAgICAgICBzdGFja2NiIFtzdGFja19sZW5dID0gY2I7CisgICAgICAgIGlkeCA9IHBhdGhbcHBvcy1wYXRoW3Bwb3NdW2NiXS5ydW4rMV1bY2JdLnByZXZfaWR4OworICAgICAgICBwcG9zIC09IHBhdGhbcHBvc11bY2JdLnJ1bjsKKyAgICAgICAgc3RhY2tfbGVuKys7CisgICAgfQorICAgIC8vcGVyZm9ybSBhY3R1YWwgYmFuZCBpbmZvIGVuY29kaW5nCisgICAgc3RhcnQgPSAwOworICAgIGZvciAoaSA9IHN0YWNrX2xlbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgc3RhY2tjYltpXSk7CisgICAgICAgIGNvdW50ID0gc3RhY2tydW5baV07CisgICAgICAgIG1lbXNldChzY2UtPnplcm9lcyArIHdpbioxNiArIHN0YXJ0LCAhc3RhY2tjYltpXSwgY291bnQpOworICAgICAgICAvL1hYWDogbWVtc2V0IHdoZW4gYmFuZF90eXBlIGlzIGFsc28gdWludDhfdAorICAgICAgICBmb3IgKGogPSAwOyBqIDwgY291bnQ7IGorKykgeworICAgICAgICAgICAgc2NlLT5iYW5kX3R5cGVbd2luKjE2ICsgc3RhcnRdID0gIHN0YWNrY2JbaV07CisgICAgICAgICAgICBzdGFydCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChjb3VudCA+PSBydW5fZXNjKSB7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIHJ1bl9iaXRzLCBydW5fZXNjKTsKKyAgICAgICAgICAgIGNvdW50IC09IHJ1bl9lc2M7CisgICAgICAgIH0KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBydW5fYml0cywgY291bnQpOworICAgIH0KK30KKworLyoqIFJldHVybiB0aGUgbWluaW11bSBzY2FsZWZhY3RvciB3aGVyZSB0aGUgcXVhbnRpemVkIGNvZWYgZG9lcyBub3QgY2xpcC4gKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQ4X3QgY29lZjJtaW5zZihmbG9hdCBjb2VmKSB7CisgICAgcmV0dXJuIGF2X2NsaXBfdWludDgobG9nMmYoY29lZikqNCAtIDY5ICsgU0NBTEVfT05FX1BPUyAtIFNDQUxFX0RJVl81MTIpOworfQorCisvKiogUmV0dXJuIHRoZSBtYXhpbXVtIHNjYWxlZmFjdG9yIHdoZXJlIHRoZSBxdWFudGl6ZWQgY29lZiBpcyBub3QgemVyby4gKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQ4X3QgY29lZjJtYXhzZihmbG9hdCBjb2VmKSB7CisgICAgcmV0dXJuIGF2X2NsaXBfdWludDgobG9nMmYoY29lZikqNCArICA2ICsgU0NBTEVfT05FX1BPUyAtIFNDQUxFX0RJVl81MTIpOworfQorCit0eXBlZGVmIHN0cnVjdCBUcmVsbGlzUGF0aCB7CisgICAgZmxvYXQgY29zdDsKKyAgICBpbnQgcHJldjsKK30gVHJlbGxpc1BhdGg7CisKKyNkZWZpbmUgVFJFTExJU19TVEFHRVMgMTIxCisjZGVmaW5lIFRSRUxMSVNfU1RBVEVTIChTQ0FMRV9NQVhfRElGRisxKQorCitzdGF0aWMgdm9pZCBzZWFyY2hfZm9yX3F1YW50aXplcnNfYW5tcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFBQ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgbGFtYmRhKQoreworICAgIGludCBxLCB3LCB3MiwgZywgc3RhcnQgPSAwOworICAgIGludCBpLCBqOworICAgIGludCBpZHg7CisgICAgVHJlbGxpc1BhdGggcGF0aHNbVFJFTExJU19TVEFHRVNdW1RSRUxMSVNfU1RBVEVTXTsKKyAgICBpbnQgYmFuZGFkZHJbVFJFTExJU19TVEFHRVNdOworICAgIGludCBtaW5xOworICAgIGZsb2F0IG1pbmNvc3Q7CisgICAgZmxvYXQgcTBmID0gRkxUX01BWCwgcTFmID0gMC4wZiwgcW5yZ2YgPSAwLjBmOworICAgIGludCBxMCwgcTEsIHFjbnQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykgeworICAgICAgICBmbG9hdCB0ID0gZmFic2Yoc2NlLT5jb2VmZnNbaV0pOworICAgICAgICBpZiAodCA+IDAuMGYpIHsKKyAgICAgICAgICAgIHEwZiA9IEZGTUlOKHEwZiwgdCk7CisgICAgICAgICAgICBxMWYgPSBGRk1BWChxMWYsIHQpOworICAgICAgICAgICAgcW5yZ2YgKz0gdCp0OworICAgICAgICAgICAgcWNudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFxY250KSB7CisgICAgICAgIG1lbXNldChzY2UtPnNmX2lkeCwgMCwgc2l6ZW9mKHNjZS0+c2ZfaWR4KSk7CisgICAgICAgIG1lbXNldChzY2UtPnplcm9lcywgMSwgc2l6ZW9mKHNjZS0+emVyb2VzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL21pbmltdW0gc2NhbGVmYWN0b3IgaW5kZXggaXMgd2hlbiBtaW5pbXVtIG5vbnplcm8gY29lZmZpY2llbnQgYWZ0ZXIgcXVhbnRpemluZyBpcyBub3QgY2xpcHBlZAorICAgIHEwID0gY29lZjJtaW5zZihxMGYpOworICAgIC8vbWF4aW11bSBzY2FsZWZhY3RvciBpbmRleCBpcyB3aGVuIG1heGltdW0gY29lZmZpY2llbnQgYWZ0ZXIgcXVhbnRpemluZyBpcyBzdGlsbCBub3QgemVybworICAgIHExID0gY29lZjJtYXhzZihxMWYpOworICAgIGlmIChxMSAtIHEwID4gNjApIHsKKyAgICAgICAgaW50IHEwbG93ICA9IHEwOworICAgICAgICBpbnQgcTFoaWdoID0gcTE7CisgICAgICAgIC8vbWluaW11bSBzY2FsZWZhY3RvciBpbmRleCBpcyB3aGVuIG1heGltdW0gbm9uemVybyBjb2VmZmljaWVudCBhZnRlciBxdWFudGl6aW5nIGlzIG5vdCBjbGlwcGVkCisgICAgICAgIGludCBxbnJnID0gYXZfY2xpcF91aW50OChsb2cyZihzcXJ0ZihxbnJnZi9xY250KSkqNCAtIDMxICsgU0NBTEVfT05FX1BPUyAtIFNDQUxFX0RJVl81MTIpOworICAgICAgICBxMSA9IHFucmcgKyAzMDsKKyAgICAgICAgcTAgPSBxbnJnIC0gMzA7CisgICAgICAgIGlmIChxMCA8IHEwbG93KSB7CisgICAgICAgICAgICBxMSArPSBxMGxvdyAtIHEwOworICAgICAgICAgICAgcTAgID0gcTBsb3c7CisgICAgICAgIH0gZWxzZSBpZiAocTEgPiBxMWhpZ2gpIHsKKyAgICAgICAgICAgIHEwIC09IHExIC0gcTFoaWdoOworICAgICAgICAgICAgcTEgID0gcTFoaWdoOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IFRSRUxMSVNfU1RBVEVTOyBpKyspIHsKKyAgICAgICAgcGF0aHNbMF1baV0uY29zdCAgICA9IDAuMGY7CisgICAgICAgIHBhdGhzWzBdW2ldLnByZXYgICAgPSAtMTsKKyAgICB9CisgICAgZm9yIChqID0gMTsgaiA8IFRSRUxMSVNfU1RBR0VTOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFRSRUxMSVNfU1RBVEVTOyBpKyspIHsKKyAgICAgICAgICAgIHBhdGhzW2pdW2ldLmNvc3QgICAgPSBJTkZJTklUWTsKKyAgICAgICAgICAgIHBhdGhzW2pdW2ldLnByZXYgICAgPSAtMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZHggPSAxOworICAgIGFic19wb3czNF92KHMtPnNjb2Vmcywgc2NlLT5jb2VmZnMsIDEwMjQpOworICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pIHsKKyAgICAgICAgc3RhcnQgPSB3KjEyODsKKyAgICAgICAgZm9yIChnID0gMDsgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgKmNvZWZzID0gc2NlLT5jb2VmZnMgKyBzdGFydDsKKyAgICAgICAgICAgIGZsb2F0IHFtaW4sIHFtYXg7CisgICAgICAgICAgICBpbnQgbnogPSAwOworCisgICAgICAgICAgICBiYW5kYWRkcltpZHhdID0gdyAqIDE2ICsgZzsKKyAgICAgICAgICAgIHFtaW4gPSBJTlRfTUFYOworICAgICAgICAgICAgcW1heCA9IDAuMGY7CisgICAgICAgICAgICBmb3IgKHcyID0gMDsgdzIgPCBzY2UtPmljcy5ncm91cF9sZW5bd107IHcyKyspIHsKKyAgICAgICAgICAgICAgICBGRlBzeUJhbmQgKmJhbmQgPSAmcy0+cHN5LmNoW3MtPmN1cl9jaGFubmVsXS5wc3lfYmFuZHNbKHcrdzIpKjE2K2ddOworICAgICAgICAgICAgICAgIGlmIChiYW5kLT5lbmVyZ3kgPD0gYmFuZC0+dGhyZXNob2xkIHx8IGJhbmQtPnRocmVzaG9sZCA9PSAwLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIHNjZS0+emVyb2VzWyh3K3cyKSoxNitnXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY2UtPnplcm9lc1sodyt3MikqMTYrZ10gPSAwOworICAgICAgICAgICAgICAgIG56ID0gMTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2NlLT5pY3Muc3diX3NpemVzW2ddOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdCA9IGZhYnNmKGNvZWZzW3cyKjEyOCtpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ID4gMC4wZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHFtaW4gPSBGRk1JTihxbWluLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgcW1heCA9IEZGTUFYKHFtYXgsIHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChueikgeworICAgICAgICAgICAgICAgIGludCBtaW5zY2FsZSwgbWF4c2NhbGU7CisgICAgICAgICAgICAgICAgZmxvYXQgbWlucmQgPSBJTkZJTklUWTsKKyAgICAgICAgICAgICAgICBmbG9hdCBtYXh2YWw7CisgICAgICAgICAgICAgICAgLy9taW5pbXVtIHNjYWxlZmFjdG9yIGluZGV4IGlzIHdoZW4gbWluaW11bSBub256ZXJvIGNvZWZmaWNpZW50IGFmdGVyIHF1YW50aXppbmcgaXMgbm90IGNsaXBwZWQKKyAgICAgICAgICAgICAgICBtaW5zY2FsZSA9IGNvZWYybWluc2YocW1pbik7CisgICAgICAgICAgICAgICAgLy9tYXhpbXVtIHNjYWxlZmFjdG9yIGluZGV4IGlzIHdoZW4gbWF4aW11bSBjb2VmZmljaWVudCBhZnRlciBxdWFudGl6aW5nIGlzIHN0aWxsIG5vdCB6ZXJvCisgICAgICAgICAgICAgICAgbWF4c2NhbGUgPSBjb2VmMm1heHNmKHFtYXgpOworICAgICAgICAgICAgICAgIG1pbnNjYWxlID0gYXZfY2xpcChtaW5zY2FsZSAtIHEwLCAwLCBUUkVMTElTX1NUQVRFUyAtIDEpOworICAgICAgICAgICAgICAgIG1heHNjYWxlID0gYXZfY2xpcChtYXhzY2FsZSAtIHEwLCAwLCBUUkVMTElTX1NUQVRFUyk7CisgICAgICAgICAgICAgICAgbWF4dmFsID0gZmluZF9tYXhfdmFsKHNjZS0+aWNzLmdyb3VwX2xlblt3XSwgc2NlLT5pY3Muc3diX3NpemVzW2ddLCBzLT5zY29lZnMrc3RhcnQpOworICAgICAgICAgICAgICAgIGZvciAocSA9IG1pbnNjYWxlOyBxIDwgbWF4c2NhbGU7IHErKykgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBkaXN0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNiID0gZmluZF9taW5fYm9vayhtYXh2YWwsIHNjZS0+c2ZfaWR4W3cqMTYrZ10pOworICAgICAgICAgICAgICAgICAgICBmb3IgKHcyID0gMDsgdzIgPCBzY2UtPmljcy5ncm91cF9sZW5bd107IHcyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZGUHN5QmFuZCAqYmFuZCA9ICZzLT5wc3kuY2hbcy0+Y3VyX2NoYW5uZWxdLnBzeV9iYW5kc1sodyt3MikqMTYrZ107CisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ICs9IHF1YW50aXplX2JhbmRfY29zdChzLCBjb2VmcyArIHcyKjEyOCwgcy0+c2NvZWZzICsgc3RhcnQgKyB3MioxMjgsIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgKyBxMCwgY2IsIGxhbWJkYSAvIGJhbmQtPnRocmVzaG9sZCwgSU5GSU5JVFksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1pbnJkID0gRkZNSU4obWlucmQsIGRpc3QpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBxMSAtIHEwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNvc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gcGF0aHNbaWR4IC0gMV1baV0uY29zdCArIGRpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZmX2FhY19zY2FsZWZhY3Rvcl9iaXRzW3EgLSBpICsgU0NBTEVfRElGRl9aRVJPXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3N0IDwgcGF0aHNbaWR4XVtxXS5jb3N0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHNbaWR4XVtxXS5jb3N0ICAgID0gY29zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoc1tpZHhdW3FdLnByZXYgICAgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHEgPSAwOyBxIDwgcTEgLSBxMDsgcSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGhzW2lkeF1bcV0uY29zdCA9IHBhdGhzW2lkeCAtIDFdW3FdLmNvc3QgKyAxOworICAgICAgICAgICAgICAgICAgICBwYXRoc1tpZHhdW3FdLnByZXYgPSBxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjZS0+emVyb2VzW3cqMTYrZ10gPSAhbno7CisgICAgICAgICAgICBzdGFydCArPSBzY2UtPmljcy5zd2Jfc2l6ZXNbZ107CisgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZHgtLTsKKyAgICBtaW5jb3N0ID0gcGF0aHNbaWR4XVswXS5jb3N0OworICAgIG1pbnEgICAgPSAwOworICAgIGZvciAoaSA9IDE7IGkgPCBUUkVMTElTX1NUQVRFUzsgaSsrKSB7CisgICAgICAgIGlmIChwYXRoc1tpZHhdW2ldLmNvc3QgPCBtaW5jb3N0KSB7CisgICAgICAgICAgICBtaW5jb3N0ID0gcGF0aHNbaWR4XVtpXS5jb3N0OworICAgICAgICAgICAgbWlucSA9IGk7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKGlkeCkgeworICAgICAgICBzY2UtPnNmX2lkeFtiYW5kYWRkcltpZHhdXSA9IG1pbnEgKyBxMDsKKyAgICAgICAgbWlucSA9IHBhdGhzW2lkeF1bbWlucV0ucHJldjsKKyAgICAgICAgaWR4LS07CisgICAgfQorICAgIC8vc2V0IHRoZSBzYW1lIHF1YW50aXplcnMgaW5zaWRlIHdpbmRvdyBncm91cHMKKyAgICBmb3IgKHcgPSAwOyB3IDwgc2NlLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlLT5pY3MuZ3JvdXBfbGVuW3ddKQorICAgICAgICBmb3IgKGcgPSAwOyAgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykKKyAgICAgICAgICAgIGZvciAodzIgPSAxOyB3MiA8IHNjZS0+aWNzLmdyb3VwX2xlblt3XTsgdzIrKykKKyAgICAgICAgICAgICAgICBzY2UtPnNmX2lkeFsodyt3MikqMTYrZ10gPSBzY2UtPnNmX2lkeFt3KjE2K2ddOworfQorCisvKioKKyAqIHR3by1sb29wIHF1YW50aXplcnMgc2VhcmNoIHRha2VuIGZyb20gSVNPIDEzODE4LTcgQXBwZW5kaXggQworICovCitzdGF0aWMgdm9pZCBzZWFyY2hfZm9yX3F1YW50aXplcnNfdHdvbG9vcChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGxhbWJkYSkKK3sKKyAgICBpbnQgc3RhcnQgPSAwLCBpLCB3LCB3MiwgZzsKKyAgICBpbnQgZGVzdGJpdHMgPSBhdmN0eC0+Yml0X3JhdGUgKiAxMDI0LjAgLyBhdmN0eC0+c2FtcGxlX3JhdGUgLyBhdmN0eC0+Y2hhbm5lbHMgKiAobGFtYmRhIC8gMTIwLmYpOworICAgIGZsb2F0IGRpc3RzWzEyOF0gPSB7IDAgfSwgdXBsaW1zWzEyOF07CisgICAgZmxvYXQgbWF4dmFsc1sxMjhdOworICAgIGludCBmZmxhZywgbWluc2NhbGVyOworICAgIGludCBpdHMgID0gMDsKKyAgICBpbnQgYWxseiA9IDA7CisgICAgZmxvYXQgbWludGhyID0gSU5GSU5JVFk7CisKKyAgICAvLyBmb3IgdmFsdWVzIGFib3ZlIHRoaXMgdGhlIGRlY29kZXIgbWlnaHQgZW5kIHVwIGluIGFuIGVuZGxlc3MgbG9vcAorICAgIC8vIGR1ZSB0byBhbHdheXMgaGF2aW5nIG1vcmUgYml0cyB0aGFuIHdoYXQgY2FuIGJlIGVuY29kZWQuCisgICAgZGVzdGJpdHMgPSBGRk1JTihkZXN0Yml0cywgNTgwMCk7CisgICAgLy9YWFg6IHNvbWUgaGV1cmlzdGljIHRvIGRldGVybWluZSBpbml0aWFsIHF1YW50aXplcnMgd2lsbCByZWR1Y2Ugc2VhcmNoIHRpbWUKKyAgICAvL2RldGVybWluZSB6ZXJvIGJhbmRzIGFuZCB1cHBlciBsaW1pdHMKKyAgICBmb3IgKHcgPSAwOyB3IDwgc2NlLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlLT5pY3MuZ3JvdXBfbGVuW3ddKSB7CisgICAgICAgIGZvciAoZyA9IDA7ICBnIDwgc2NlLT5pY3MubnVtX3N3YjsgZysrKSB7CisgICAgICAgICAgICBpbnQgbnogPSAwOworICAgICAgICAgICAgZmxvYXQgdXBsaW0gPSAwLjBmOworICAgICAgICAgICAgZm9yICh3MiA9IDA7IHcyIDwgc2NlLT5pY3MuZ3JvdXBfbGVuW3ddOyB3MisrKSB7CisgICAgICAgICAgICAgICAgRkZQc3lCYW5kICpiYW5kID0gJnMtPnBzeS5jaFtzLT5jdXJfY2hhbm5lbF0ucHN5X2JhbmRzWyh3K3cyKSoxNitnXTsKKyAgICAgICAgICAgICAgICB1cGxpbSArPSBiYW5kLT50aHJlc2hvbGQ7CisgICAgICAgICAgICAgICAgaWYgKGJhbmQtPmVuZXJneSA8PSBiYW5kLT50aHJlc2hvbGQgfHwgYmFuZC0+dGhyZXNob2xkID09IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NlLT56ZXJvZXNbKHcrdzIpKjE2K2ddID0gMTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG56ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwbGltc1t3KjE2K2ddID0gdXBsaW0gKjUxMjsKKyAgICAgICAgICAgIHNjZS0+emVyb2VzW3cqMTYrZ10gPSAhbno7CisgICAgICAgICAgICBpZiAobnopCisgICAgICAgICAgICAgICAgbWludGhyID0gRkZNSU4obWludGhyLCB1cGxpbSk7CisgICAgICAgICAgICBhbGx6IHw9IG56OworICAgICAgICB9CisgICAgfQorICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pIHsKKyAgICAgICAgZm9yIChnID0gMDsgIGcgPCBzY2UtPmljcy5udW1fc3diOyBnKyspIHsKKyAgICAgICAgICAgIGlmIChzY2UtPnplcm9lc1t3KjE2K2ddKSB7CisgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXSA9IFNDQUxFX09ORV9QT1M7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2UtPnNmX2lkeFt3KjE2K2ddID0gU0NBTEVfT05FX1BPUyArIEZGTUlOKGxvZzJmKHVwbGltc1t3KjE2K2ddL21pbnRocikqNCw1OSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWFsbHopCisgICAgICAgIHJldHVybjsKKyAgICBhYnNfcG93MzRfdihzLT5zY29lZnMsIHNjZS0+Y29lZmZzLCAxMDI0KTsKKworICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pIHsKKyAgICAgICAgc3RhcnQgPSB3KjEyODsKKyAgICAgICAgZm9yIChnID0gMDsgIGcgPCBzY2UtPmljcy5udW1fc3diOyBnKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZWQgPSBzLT5zY29lZnMgKyBzdGFydDsKKyAgICAgICAgICAgIG1heHZhbHNbdyoxNitnXSA9IGZpbmRfbWF4X3ZhbChzY2UtPmljcy5ncm91cF9sZW5bd10sIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSwgc2NhbGVkKTsKKyAgICAgICAgICAgIHN0YXJ0ICs9IHNjZS0+aWNzLnN3Yl9zaXplc1tnXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vcGVyZm9ybSB0d28tbG9vcCBzZWFyY2gKKyAgICAvL291dGVyIGxvb3AgLSBpbXByb3ZlIHF1YWxpdHkKKyAgICBkbyB7CisgICAgICAgIGludCB0Yml0cywgcXN0ZXA7CisgICAgICAgIG1pbnNjYWxlciA9IHNjZS0+c2ZfaWR4WzBdOworICAgICAgICAvL2lubmVyIGxvb3AgLSBxdWFudGl6ZSBzcGVjdHJ1bSB0byBmaXQgaW50byBnaXZlbiBudW1iZXIgb2YgYml0cworICAgICAgICBxc3RlcCA9IGl0cyA/IDEgOiAzMjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IHByZXYgPSAtMTsKKyAgICAgICAgICAgIHRiaXRzID0gMDsKKyAgICAgICAgICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pIHsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHcqMTI4OworICAgICAgICAgICAgICAgIGZvciAoZyA9IDA7ICBnIDwgc2NlLT5pY3MubnVtX3N3YjsgZysrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpjb2VmcyA9IHNjZS0+Y29lZmZzICsgc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZWQgPSBzLT5zY29lZnMgKyBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgY2I7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRpc3QgPSAwLjBmOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzY2UtPnplcm9lc1t3KjE2K2ddIHx8IHNjZS0+c2ZfaWR4W3cqMTYrZ10gPj0gMjE4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArPSBzY2UtPmljcy5zd2Jfc2l6ZXNbZ107CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtaW5zY2FsZXIgPSBGRk1JTihtaW5zY2FsZXIsIHNjZS0+c2ZfaWR4W3cqMTYrZ10pOworICAgICAgICAgICAgICAgICAgICBjYiA9IGZpbmRfbWluX2Jvb2sobWF4dmFsc1t3KjE2K2ddLCBzY2UtPnNmX2lkeFt3KjE2K2ddKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh3MiA9IDA7IHcyIDwgc2NlLT5pY3MuZ3JvdXBfbGVuW3ddOyB3MisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgKz0gcXVhbnRpemVfYmFuZF9jb3N0KHMsIGNvZWZzICsgdzIqMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkICsgdzIqMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5pY3Muc3diX3NpemVzW2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmIpOworICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSBiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRpc3RzW3cqMTYrZ10gPSBkaXN0IC0gYml0czsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gZmZfYWFjX3NjYWxlZmFjdG9yX2JpdHNbc2NlLT5zZl9pZHhbdyoxNitnXSAtIHByZXYgKyBTQ0FMRV9ESUZGX1pFUk9dOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRiaXRzICs9IGJpdHM7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHNjZS0+aWNzLnN3Yl9zaXplc1tnXTsKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IHNjZS0+c2ZfaWR4W3cqMTYrZ107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRiaXRzID4gZGVzdGJpdHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChzY2UtPnNmX2lkeFtpXSA8IDIxOCAtIHFzdGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbaV0gKz0gcXN0ZXA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjZS0+c2ZfaWR4W2ldID4gNjAgLSBxc3RlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4W2ldIC09IHFzdGVwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcXN0ZXAgPj49IDE7CisgICAgICAgICAgICBpZiAoIXFzdGVwICYmIHRiaXRzID4gZGVzdGJpdHMqMS4wMiAmJiBzY2UtPnNmX2lkeFswXSA8IDIxNykKKyAgICAgICAgICAgICAgICBxc3RlcCA9IDE7CisgICAgICAgIH0gd2hpbGUgKHFzdGVwKTsKKworICAgICAgICBmZmxhZyA9IDA7CisgICAgICAgIG1pbnNjYWxlciA9IGF2X2NsaXAobWluc2NhbGVyLCA2MCwgMjU1IC0gU0NBTEVfTUFYX0RJRkYpOworICAgICAgICBmb3IgKHcgPSAwOyB3IDwgc2NlLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlLT5pY3MuZ3JvdXBfbGVuW3ddKSB7CisgICAgICAgICAgICBmb3IgKGcgPSAwOyBnIDwgc2NlLT5pY3MubnVtX3N3YjsgZysrKSB7CisgICAgICAgICAgICAgICAgaW50IHByZXZzYyA9IHNjZS0+c2ZfaWR4W3cqMTYrZ107CisgICAgICAgICAgICAgICAgaWYgKGRpc3RzW3cqMTYrZ10gPiB1cGxpbXNbdyoxNitnXSAmJiBzY2UtPnNmX2lkeFt3KjE2K2ddID4gNjApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRfbWluX2Jvb2sobWF4dmFsc1t3KjE2K2ddLCBzY2UtPnNmX2lkeFt3KjE2K2ddLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXS0tOworICAgICAgICAgICAgICAgICAgICBlbHNlIC8vVHJ5IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBzb21lIGVuZXJneSBpbiBldmVyeSBiYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBzY2UtPnNmX2lkeFt3KjE2K2ddLT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY2UtPnNmX2lkeFt3KjE2K2ddID0gYXZfY2xpcChzY2UtPnNmX2lkeFt3KjE2K2ddLCBtaW5zY2FsZXIsIG1pbnNjYWxlciArIFNDQUxFX01BWF9ESUZGKTsKKyAgICAgICAgICAgICAgICBzY2UtPnNmX2lkeFt3KjE2K2ddID0gRkZNSU4oc2NlLT5zZl9pZHhbdyoxNitnXSwgMjE5KTsKKyAgICAgICAgICAgICAgICBpZiAoc2NlLT5zZl9pZHhbdyoxNitnXSAhPSBwcmV2c2MpCisgICAgICAgICAgICAgICAgICAgIGZmbGFnID0gMTsKKyAgICAgICAgICAgICAgICBzY2UtPmJhbmRfdHlwZVt3KjE2K2ddID0gZmluZF9taW5fYm9vayhtYXh2YWxzW3cqMTYrZ10sIHNjZS0+c2ZfaWR4W3cqMTYrZ10pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGl0cysrOworICAgIH0gd2hpbGUgKGZmbGFnICYmIGl0cyA8IDEwKTsKK30KKworc3RhdGljIHZvaWQgc2VhcmNoX2Zvcl9xdWFudGl6ZXJzX2ZhYWMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBQUNFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGxhbWJkYSkKK3sKKyAgICBpbnQgc3RhcnQgPSAwLCBpLCB3LCB3MiwgZzsKKyAgICBmbG9hdCB1cGxpbVsxMjhdLCBtYXhxWzEyOF07CisgICAgaW50IG1pbnEsIG1heHNmOworICAgIGZsb2F0IGRpc3RmYWN0ID0gKChzY2UtPmljcy5udW1fd2luZG93cyA+IDEpID8gODUuODAgOiAxNDcuODQpIC8gbGFtYmRhOworICAgIGludCBsYXN0ID0gMCwgbGFzdGJhbmQgPSAwLCBjdXJiYW5kID0gMDsKKyAgICBmbG9hdCBhdmdfZW5lcmd5ID0gMC4wOworICAgIGlmIChzY2UtPmljcy5udW1fd2luZG93cyA9PSAxKSB7CisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgLSBzdGFydCA+PSBzY2UtPmljcy5zd2Jfc2l6ZXNbY3VyYmFuZF0pIHsKKyAgICAgICAgICAgICAgICBzdGFydCArPSBzY2UtPmljcy5zd2Jfc2l6ZXNbY3VyYmFuZF07CisgICAgICAgICAgICAgICAgY3VyYmFuZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNjZS0+Y29lZmZzW2ldKSB7CisgICAgICAgICAgICAgICAgYXZnX2VuZXJneSArPSBzY2UtPmNvZWZmc1tpXSAqIHNjZS0+Y29lZmZzW2ldOworICAgICAgICAgICAgICAgIGxhc3QgPSBpOworICAgICAgICAgICAgICAgIGxhc3RiYW5kID0gY3VyYmFuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodyA9IDA7IHcgPCA4OyB3KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpjb2VmZnMgPSBzY2UtPmNvZWZmcyArIHcqMTI4OworICAgICAgICAgICAgY3VyYmFuZCA9IHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpIC0gc3RhcnQgPj0gc2NlLT5pY3Muc3diX3NpemVzW2N1cmJhbmRdKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHNjZS0+aWNzLnN3Yl9zaXplc1tjdXJiYW5kXTsKKyAgICAgICAgICAgICAgICAgICAgY3VyYmFuZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29lZmZzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIGF2Z19lbmVyZ3kgKz0gY29lZmZzW2ldICogY29lZmZzW2ldOworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gRkZNQVgobGFzdCwgaSk7CisgICAgICAgICAgICAgICAgICAgIGxhc3RiYW5kID0gRkZNQVgobGFzdGJhbmQsIGN1cmJhbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBsYXN0Kys7CisgICAgYXZnX2VuZXJneSAvPSBsYXN0OworICAgIGlmIChhdmdfZW5lcmd5ID09IDAuMGYpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHNjZS0+c2ZfaWR4KTsgaSsrKQorICAgICAgICAgICAgc2NlLT5zZl9pZHhbaV0gPSBTQ0FMRV9PTkVfUE9TOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pIHsKKyAgICAgICAgc3RhcnQgPSB3KjEyODsKKyAgICAgICAgZm9yIChnID0gMDsgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykgeworICAgICAgICAgICAgZmxvYXQgKmNvZWZzICAgPSBzY2UtPmNvZWZmcyArIHN0YXJ0OworICAgICAgICAgICAgY29uc3QgaW50IHNpemUgPSBzY2UtPmljcy5zd2Jfc2l6ZXNbZ107CisgICAgICAgICAgICBpbnQgc3RhcnQyID0gc3RhcnQsIGVuZDIgPSBzdGFydCArIHNpemUsIHBlYWtwb3MgPSBzdGFydDsKKyAgICAgICAgICAgIGZsb2F0IG1heHZhbCA9IC0xLCB0aHIgPSAwLjBmLCB0OworICAgICAgICAgICAgbWF4cVt3KjE2K2ddID0gMC4wZjsKKyAgICAgICAgICAgIGlmIChnID4gbGFzdGJhbmQpIHsKKyAgICAgICAgICAgICAgICBtYXhxW3cqMTYrZ10gPSAwLjBmOworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHNpemU7CisgICAgICAgICAgICAgICAgZm9yICh3MiA9IDA7IHcyIDwgc2NlLT5pY3MuZ3JvdXBfbGVuW3ddOyB3MisrKQorICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29lZnMgKyB3MioxMjgsIDAsIHNpemVvZihjb2Vmc1swXSkqc2l6ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHcyID0gMDsgdzIgPCBzY2UtPmljcy5ncm91cF9sZW5bd107IHcyKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQgPSBjb2Vmc1t3MioxMjgraV0qY29lZnNbdzIqMTI4K2ldOworICAgICAgICAgICAgICAgICAgICBtYXhxW3cqMTYrZ10gPSBGRk1BWChtYXhxW3cqMTYrZ10sIGZhYnNmKGNvZWZzW3cyKjEyOCArIGldKSk7CisgICAgICAgICAgICAgICAgICAgIHRociArPSB0OworICAgICAgICAgICAgICAgICAgICBpZiAoc2NlLT5pY3MubnVtX3dpbmRvd3MgPT0gMSAmJiBtYXh2YWwgPCB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXh2YWwgID0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlYWtwb3MgPSBzdGFydCtpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNjZS0+aWNzLm51bV93aW5kb3dzID09IDEpIHsKKyAgICAgICAgICAgICAgICBzdGFydDIgPSBGRk1BWChwZWFrcG9zIC0gMiwgc3RhcnQyKTsKKyAgICAgICAgICAgICAgICBlbmQyICAgPSBGRk1JTihwZWFrcG9zICsgMywgZW5kMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0MiAtPSBzdGFydDsKKyAgICAgICAgICAgICAgICBlbmQyICAgLT0gc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCArPSBzaXplOworICAgICAgICAgICAgdGhyID0gcG93KHRociAvIChhdmdfZW5lcmd5ICogKGVuZDIgLSBzdGFydDIpKSwgMC4zICsgMC4xKihsYXN0YmFuZCAtIGcpIC8gbGFzdGJhbmQpOworICAgICAgICAgICAgdCAgID0gMS4wIC0gKDEuMCAqIHN0YXJ0MiAvIGxhc3QpOworICAgICAgICAgICAgdXBsaW1bdyoxNitnXSA9IGRpc3RmYWN0IC8gKDEuNCAqIHRociArIHQqdCp0ICsgMC4wNzUpOworICAgICAgICB9CisgICAgfQorICAgIG1lbXNldChzY2UtPnNmX2lkeCwgMCwgc2l6ZW9mKHNjZS0+c2ZfaWR4KSk7CisgICAgYWJzX3BvdzM0X3Yocy0+c2NvZWZzLCBzY2UtPmNvZWZmcywgMTAyNCk7CisgICAgZm9yICh3ID0gMDsgdyA8IHNjZS0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZS0+aWNzLmdyb3VwX2xlblt3XSkgeworICAgICAgICBzdGFydCA9IHcqMTI4OworICAgICAgICBmb3IgKGcgPSAwOyAgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgKmNvZWZzICA9IHNjZS0+Y29lZmZzICsgc3RhcnQ7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkID0gcy0+c2NvZWZzICAgKyBzdGFydDsKKyAgICAgICAgICAgIGNvbnN0IGludCBzaXplICAgICAgPSBzY2UtPmljcy5zd2Jfc2l6ZXNbZ107CisgICAgICAgICAgICBpbnQgc2NmLCBwcmV2X3NjZiwgc3RlcDsKKyAgICAgICAgICAgIGludCBtaW5fc2NmID0gLTEsIG1heF9zY2YgPSAyNTY7CisgICAgICAgICAgICBmbG9hdCBjdXJkaWZmOworICAgICAgICAgICAgaWYgKG1heHFbdyoxNitnXSA8IDIxLjU0NCkgeworICAgICAgICAgICAgICAgIHNjZS0+emVyb2VzW3cqMTYrZ10gPSAxOworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHNpemU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2UtPnplcm9lc1t3KjE2K2ddID0gMDsKKyAgICAgICAgICAgIHNjZiAgPSBwcmV2X3NjZiA9IGF2X2NsaXAoU0NBTEVfT05FX1BPUyAtIFNDQUxFX0RJVl81MTIgLSBsb2cyZigxL21heHFbdyoxNitnXSkqMTYvMywgNjAsIDIxOCk7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgZmxvYXQgZGlzdCA9IDAuMGY7CisgICAgICAgICAgICAgICAgaW50IHF1YW50X21heDsKKworICAgICAgICAgICAgICAgIGZvciAodzIgPSAwOyB3MiA8IHNjZS0+aWNzLmdyb3VwX2xlblt3XTsgdzIrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgICAgICAgICAgZGlzdCArPSBxdWFudGl6ZV9iYW5kX2Nvc3QocywgY29lZnMgKyB3MioxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZCArIHcyKjEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5pY3Muc3diX3NpemVzW2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQ19CVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmIpOworICAgICAgICAgICAgICAgICAgICBkaXN0IC09IGI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpc3QgKj0gMS4wZiAvIDUxMi4wZiAvIGxhbWJkYTsKKyAgICAgICAgICAgICAgICBxdWFudF9tYXggPSBxdWFudChtYXhxW3cqMTYrZ10sIGZmX2FhY19wb3cyc2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjZiArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXSk7CisgICAgICAgICAgICAgICAgaWYgKHF1YW50X21heCA+PSA4MTkxKSB7IC8vIHRvbyBtdWNoLCByZXR1cm4gdG8gdGhlIHByZXZpb3VzIHF1YW50aXplcgorICAgICAgICAgICAgICAgICAgICBzY2UtPnNmX2lkeFt3KjE2K2ddID0gcHJldl9zY2Y7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmV2X3NjZiA9IHNjZjsKKyAgICAgICAgICAgICAgICBjdXJkaWZmID0gZmFic2YoZGlzdCAtIHVwbGltW3cqMTYrZ10pOworICAgICAgICAgICAgICAgIGlmIChjdXJkaWZmIDw9IDEuMGYpCisgICAgICAgICAgICAgICAgICAgIHN0ZXAgPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RlcCA9IGxvZzJmKGN1cmRpZmYpOworICAgICAgICAgICAgICAgIGlmIChkaXN0ID4gdXBsaW1bdyoxNitnXSkKKyAgICAgICAgICAgICAgICAgICAgc3RlcCA9IC1zdGVwOworICAgICAgICAgICAgICAgIHNjZiArPSBzdGVwOworICAgICAgICAgICAgICAgIHNjZiA9IGF2X2NsaXBfdWludDgoc2NmKTsKKyAgICAgICAgICAgICAgICBzdGVwID0gc2NmIC0gcHJldl9zY2Y7CisgICAgICAgICAgICAgICAgaWYgKEZGQUJTKHN0ZXApIDw9IDEgfHwgKHN0ZXAgPiAwICYmIHNjZiA+PSBtYXhfc2NmKSB8fCAoc3RlcCA8IDAgJiYgc2NmIDw9IG1pbl9zY2YpKSB7CisgICAgICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4W3cqMTYrZ10gPSBhdl9jbGlwKHNjZiwgbWluX3NjZiwgbWF4X3NjZik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RlcCA+IDApCisgICAgICAgICAgICAgICAgICAgIG1pbl9zY2YgPSBwcmV2X3NjZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1heF9zY2YgPSBwcmV2X3NjZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXJ0ICs9IHNpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgbWlucSA9IHNjZS0+c2ZfaWR4WzBdID8gc2NlLT5zZl9pZHhbMF0gOiBJTlRfTUFYOworICAgIGZvciAoaSA9IDE7IGkgPCAxMjg7IGkrKykgeworICAgICAgICBpZiAoIXNjZS0+c2ZfaWR4W2ldKQorICAgICAgICAgICAgc2NlLT5zZl9pZHhbaV0gPSBzY2UtPnNmX2lkeFtpLTFdOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtaW5xID0gRkZNSU4obWlucSwgc2NlLT5zZl9pZHhbaV0pOworICAgIH0KKyAgICBpZiAobWlucSA9PSBJTlRfTUFYKQorICAgICAgICBtaW5xID0gMDsKKyAgICBtaW5xID0gRkZNSU4obWlucSwgU0NBTEVfTUFYX1BPUyk7CisgICAgbWF4c2YgPSBGRk1JTihtaW5xICsgU0NBTEVfTUFYX0RJRkYsIFNDQUxFX01BWF9QT1MpOworICAgIGZvciAoaSA9IDEyNjsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaWYgKCFzY2UtPnNmX2lkeFtpXSkKKyAgICAgICAgICAgIHNjZS0+c2ZfaWR4W2ldID0gc2NlLT5zZl9pZHhbaSsxXTsKKyAgICAgICAgc2NlLT5zZl9pZHhbaV0gPSBhdl9jbGlwKHNjZS0+c2ZfaWR4W2ldLCBtaW5xLCBtYXhzZik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZWFyY2hfZm9yX3F1YW50aXplcnNfZmFzdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFBQ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgbGFtYmRhKQoreworICAgIGludCBpLCB3LCB3MiwgZzsKKyAgICBpbnQgbWlucSA9IDI1NTsKKworICAgIG1lbXNldChzY2UtPnNmX2lkeCwgMCwgc2l6ZW9mKHNjZS0+c2ZfaWR4KSk7CisgICAgZm9yICh3ID0gMDsgdyA8IHNjZS0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZS0+aWNzLmdyb3VwX2xlblt3XSkgeworICAgICAgICBmb3IgKGcgPSAwOyBnIDwgc2NlLT5pY3MubnVtX3N3YjsgZysrKSB7CisgICAgICAgICAgICBmb3IgKHcyID0gMDsgdzIgPCBzY2UtPmljcy5ncm91cF9sZW5bd107IHcyKyspIHsKKyAgICAgICAgICAgICAgICBGRlBzeUJhbmQgKmJhbmQgPSAmcy0+cHN5LmNoW3MtPmN1cl9jaGFubmVsXS5wc3lfYmFuZHNbKHcrdzIpKjE2K2ddOworICAgICAgICAgICAgICAgIGlmIChiYW5kLT5lbmVyZ3kgPD0gYmFuZC0+dGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4Wyh3K3cyKSoxNitnXSA9IDIxODsKKyAgICAgICAgICAgICAgICAgICAgc2NlLT56ZXJvZXNbKHcrdzIpKjE2K2ddID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY2UtPnNmX2lkeFsodyt3MikqMTYrZ10gPSBhdl9jbGlwKFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyICsgbG9nMmYoYmFuZC0+dGhyZXNob2xkKSwgODAsIDIxOCk7CisgICAgICAgICAgICAgICAgICAgIHNjZS0+emVyb2VzWyh3K3cyKSoxNitnXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1pbnEgPSBGRk1JTihtaW5xLCBzY2UtPnNmX2lkeFsodyt3MikqMTYrZ10pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworICAgICAgICBzY2UtPnNmX2lkeFtpXSA9IDE0MDsKKyAgICAgICAgLy9hdl9jbGlwKHNjZS0+c2ZfaWR4W2ldLCBtaW5xLCBtaW5xICsgU0NBTEVfTUFYX0RJRkYgLSAxKTsKKyAgICB9CisgICAgLy9zZXQgdGhlIHNhbWUgcXVhbnRpemVycyBpbnNpZGUgd2luZG93IGdyb3VwcworICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pCisgICAgICAgIGZvciAoZyA9IDA7ICBnIDwgc2NlLT5pY3MubnVtX3N3YjsgZysrKQorICAgICAgICAgICAgZm9yICh3MiA9IDE7IHcyIDwgc2NlLT5pY3MuZ3JvdXBfbGVuW3ddOyB3MisrKQorICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4Wyh3K3cyKSoxNitnXSA9IHNjZS0+c2ZfaWR4W3cqMTYrZ107Cit9CisKK3N0YXRpYyB2b2lkIHNlYXJjaF9mb3JfbXMoQUFDRW5jQ29udGV4dCAqcywgQ2hhbm5lbEVsZW1lbnQgKmNwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgbGFtYmRhKQoreworICAgIGludCBzdGFydCA9IDAsIGksIHcsIHcyLCBnOworICAgIGZsb2F0IE1bMTI4XSwgU1sxMjhdOworICAgIGZsb2F0ICpMMzQgPSBzLT5zY29lZnMsICpSMzQgPSBzLT5zY29lZnMgKyAxMjgsICpNMzQgPSBzLT5zY29lZnMgKyAxMjgqMiwgKlMzNCA9IHMtPnNjb2VmcyArIDEyOCozOworICAgIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UwID0gJmNwZS0+Y2hbMF07CisgICAgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZTEgPSAmY3BlLT5jaFsxXTsKKyAgICBpZiAoIWNwZS0+Y29tbW9uX3dpbmRvdykKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAodyA9IDA7IHcgPCBzY2UwLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlMC0+aWNzLmdyb3VwX2xlblt3XSkgeworICAgICAgICBmb3IgKGcgPSAwOyAgZyA8IHNjZTAtPmljcy5udW1fc3diOyBnKyspIHsKKyAgICAgICAgICAgIGlmICghY3BlLT5jaFswXS56ZXJvZXNbdyoxNitnXSAmJiAhY3BlLT5jaFsxXS56ZXJvZXNbdyoxNitnXSkgeworICAgICAgICAgICAgICAgIGZsb2F0IGRpc3QxID0gMC4wZiwgZGlzdDIgPSAwLjBmOworICAgICAgICAgICAgICAgIGZvciAodzIgPSAwOyB3MiA8IHNjZTAtPmljcy5ncm91cF9sZW5bd107IHcyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRkZQc3lCYW5kICpiYW5kMCA9ICZzLT5wc3kuY2hbcy0+Y3VyX2NoYW5uZWwrMF0ucHN5X2JhbmRzWyh3K3cyKSoxNitnXTsKKyAgICAgICAgICAgICAgICAgICAgRkZQc3lCYW5kICpiYW5kMSA9ICZzLT5wc3kuY2hbcy0+Y3VyX2NoYW5uZWwrMV0ucHN5X2JhbmRzWyh3K3cyKSoxNitnXTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWludGhyID0gRkZNSU4oYmFuZDAtPnRocmVzaG9sZCwgYmFuZDEtPnRocmVzaG9sZCk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heHRociA9IEZGTUFYKGJhbmQwLT50aHJlc2hvbGQsIGJhbmQxLT50aHJlc2hvbGQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2NlMC0+aWNzLnN3Yl9zaXplc1tnXTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNW2ldID0gKHNjZTAtPmNvZWZmc1tzdGFydCt3MioxMjgraV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2NlMS0+Y29lZmZzW3N0YXJ0K3cyKjEyOCtpXSkgKiAwLjU7CisgICAgICAgICAgICAgICAgICAgICAgICBTW2ldID0gIE1baV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2NlMS0+Y29lZmZzW3N0YXJ0K3cyKjEyOCtpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhYnNfcG93MzRfdihMMzQsIHNjZTAtPmNvZWZmcytzdGFydCt3MioxMjgsIHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ10pOworICAgICAgICAgICAgICAgICAgICBhYnNfcG93MzRfdihSMzQsIHNjZTEtPmNvZWZmcytzdGFydCt3MioxMjgsIHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ10pOworICAgICAgICAgICAgICAgICAgICBhYnNfcG93MzRfdihNMzQsIE0sICAgICAgICAgICAgICAgICAgICAgICAgIHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ10pOworICAgICAgICAgICAgICAgICAgICBhYnNfcG93MzRfdihTMzQsIFMsICAgICAgICAgICAgICAgICAgICAgICAgIHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ10pOworICAgICAgICAgICAgICAgICAgICBkaXN0MSArPSBxdWFudGl6ZV9iYW5kX2Nvc3Qocywgc2NlMC0+Y29lZmZzICsgc3RhcnQgKyB3MioxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2UwLT5pY3Muc3diX3NpemVzW2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlMC0+c2ZfaWR4Wyh3K3cyKSoxNitnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZTAtPmJhbmRfdHlwZVsodyt3MikqMTYrZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgLyBiYW5kMC0+dGhyZXNob2xkLCBJTkZJTklUWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGRpc3QxICs9IHF1YW50aXplX2JhbmRfY29zdChzLCBzY2UxLT5jb2VmZnMgKyBzdGFydCArIHcyKjEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZTEtPmljcy5zd2Jfc2l6ZXNbZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2UxLT5zZl9pZHhbKHcrdzIpKjE2K2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlMS0+YmFuZF90eXBlWyh3K3cyKSoxNitnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSAvIGJhbmQxLT50aHJlc2hvbGQsIElORklOSVRZLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzdDIgKz0gcXVhbnRpemVfYmFuZF9jb3N0KHMsIE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNMzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2UwLT5pY3Muc3diX3NpemVzW2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlMC0+c2ZfaWR4Wyh3K3cyKSoxNitnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZTAtPmJhbmRfdHlwZVsodyt3MikqMTYrZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgLyBtYXh0aHIsIElORklOSVRZLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzdDIgKz0gcXVhbnRpemVfYmFuZF9jb3N0KHMsIFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTMzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2UxLT5pY3Muc3diX3NpemVzW2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlMS0+c2ZfaWR4Wyh3K3cyKSoxNitnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZTEtPmJhbmRfdHlwZVsodyt3MikqMTYrZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgLyBtaW50aHIsIElORklOSVRZLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3BlLT5tc19tYXNrW3cqMTYrZ10gPSBkaXN0MiA8IGRpc3QxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnQgKz0gc2NlMC0+aWNzLnN3Yl9zaXplc1tnXTsKKyAgICAgICAgfQorICAgIH0KK30KKworQUFDQ29lZmZpY2llbnRzRW5jb2RlciBmZl9hYWNfY29kZXJzW0FBQ19DT0RFUl9OQl0gPSB7CisgICAgW0FBQ19DT0RFUl9GQUFDXSA9IHsKKyAgICAgICAgc2VhcmNoX2Zvcl9xdWFudGl6ZXJzX2ZhYWMsCisgICAgICAgIGVuY29kZV93aW5kb3dfYmFuZHNfaW5mbywKKyAgICAgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kLAorICAgICAgICBzZWFyY2hfZm9yX21zLAorICAgIH0sCisgICAgW0FBQ19DT0RFUl9BTk1SXSA9IHsKKyAgICAgICAgc2VhcmNoX2Zvcl9xdWFudGl6ZXJzX2FubXIsCisgICAgICAgIGVuY29kZV93aW5kb3dfYmFuZHNfaW5mbywKKyAgICAgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kLAorICAgICAgICBzZWFyY2hfZm9yX21zLAorICAgIH0sCisgICAgW0FBQ19DT0RFUl9UV09MT09QXSA9IHsKKyAgICAgICAgc2VhcmNoX2Zvcl9xdWFudGl6ZXJzX3R3b2xvb3AsCisgICAgICAgIGNvZGVib29rX3RyZWxsaXNfcmF0ZSwKKyAgICAgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kLAorICAgICAgICBzZWFyY2hfZm9yX21zLAorICAgIH0sCisgICAgW0FBQ19DT0RFUl9GQVNUXSA9IHsKKyAgICAgICAgc2VhcmNoX2Zvcl9xdWFudGl6ZXJzX2Zhc3QsCisgICAgICAgIGVuY29kZV93aW5kb3dfYmFuZHNfaW5mbywKKyAgICAgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kLAorICAgICAgICBzZWFyY2hfZm9yX21zLAorICAgIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFjZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBiM2QwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjZGVjLmMKQEAgLTAsMCArMSwzNTM0IEBACisvKgorICogQUFDIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IE9kZWQgU2hpbW9uICggb2RzMTUgb2RzMTUgZHluZG5zIG9yZyApCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBNYXhpbSBHYXZyaWxvdiAoIG1heGltLmdhdnJpbG92IGdtYWlsIGNvbSApCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMyBBbGV4IENvbnZlcnNlIDxhbGV4LmNvbnZlcnNlQGdtYWlsLmNvbT4KKyAqCisgKiBBQUMgTEFUTSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCBQYXVsIEtlbmRhbGwgPHBhdWxAa2NiYnMuZ2VuLm56PgorICogQ29weXJpZ2h0IChjKSAyMDEwICAgICAgSmFubmUgR3J1bmF1IDxqYW5uZS1saWJhdkBqYW5uYXUubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBQUMgZGVjb2RlcgorICogQGF1dGhvciBPZGVkIFNoaW1vbiAgKCBvZHMxNSBvZHMxNSBkeW5kbnMgb3JnICkKKyAqIEBhdXRob3IgTWF4aW0gR2F2cmlsb3YgKCBtYXhpbS5nYXZyaWxvdiBnbWFpbCBjb20gKQorICovCisKKy8qCisgKiBzdXBwb3J0ZWQgdG9vbHMKKyAqCisgKiBTdXBwb3J0PyAgICAgICAgICAgICBOYW1lCisgKiBOIChjb2RlIGluIFNvQyByZXBvKSBnYWluIGNvbnRyb2wKKyAqIFkgICAgICAgICAgICAgICAgICAgIGJsb2NrIHN3aXRjaGluZworICogWSAgICAgICAgICAgICAgICAgICAgd2luZG93IHNoYXBlcyAtIHN0YW5kYXJkCisgKiBOICAgICAgICAgICAgICAgICAgICB3aW5kb3cgc2hhcGVzIC0gTG93IERlbGF5CisgKiBZICAgICAgICAgICAgICAgICAgICBmaWx0ZXJiYW5rIC0gc3RhbmRhcmQKKyAqIE4gKGNvZGUgaW4gU29DIHJlcG8pIGZpbHRlcmJhbmsgLSBTY2FsYWJsZSBTYW1wbGUgUmF0ZQorICogWSAgICAgICAgICAgICAgICAgICAgVGVtcG9yYWwgTm9pc2UgU2hhcGluZworICogWSAgICAgICAgICAgICAgICAgICAgTG9uZyBUZXJtIFByZWRpY3Rpb24KKyAqIFkgICAgICAgICAgICAgICAgICAgIGludGVuc2l0eSBzdGVyZW8KKyAqIFkgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgY291cGxpbmcKKyAqIFkgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSBkb21haW4gcHJlZGljdGlvbgorICogWSAgICAgICAgICAgICAgICAgICAgUGVyY2VwdHVhbCBOb2lzZSBTdWJzdGl0dXRpb24KKyAqIFkgICAgICAgICAgICAgICAgICAgIE1pZC9TaWRlIHN0ZXJlbworICogTiAgICAgICAgICAgICAgICAgICAgU2NhbGFibGUgSW52ZXJzZSBBQUMgUXVhbnRpemF0aW9uCisgKiBOICAgICAgICAgICAgICAgICAgICBGcmVxdWVuY3kgU2VsZWN0aXZlIFN3aXRjaAorICogTiAgICAgICAgICAgICAgICAgICAgdXBzYW1wbGluZyBmaWx0ZXIKKyAqIFkgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiAmIGNvZGluZyAtIEFBQworICogTiAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uICYgY29kaW5nIC0gVHdpblZRCisgKiBOICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24gJiBjb2RpbmcgLSBCU0FDCisgKiBOICAgICAgICAgICAgICAgICAgICBBQUMgRXJyb3IgUmVzaWxpZW5jZSB0b29scworICogTiAgICAgICAgICAgICAgICAgICAgRXJyb3IgUmVzaWxpZW5jZSBwYXlsb2FkIHN5bnRheAorICogTiAgICAgICAgICAgICAgICAgICAgRXJyb3IgUHJvdGVjdGlvbiB0b29sCisgKiBOICAgICAgICAgICAgICAgICAgICBDRUxQCisgKiBOICAgICAgICAgICAgICAgICAgICBTaWxlbmNlIENvbXByZXNzaW9uCisgKiBOICAgICAgICAgICAgICAgICAgICBIVlhDCisgKiBOICAgICAgICAgICAgICAgICAgICBIVlhDIDRrYml0cy9zIFZSCisgKiBOICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVkIEF1ZGlvIHRvb2xzCisgKiBOICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVkIEF1ZGlvIFNhbXBsZSBCYW5rIEZvcm1hdAorICogTiAgICAgICAgICAgICAgICAgICAgTUlESQorICogTiAgICAgICAgICAgICAgICAgICAgSGFybW9uaWMgYW5kIEluZGl2aWR1YWwgTGluZXMgcGx1cyBOb2lzZQorICogTiAgICAgICAgICAgICAgICAgICAgVGV4dC1Uby1TcGVlY2ggSW50ZXJmYWNlCisgKiBZICAgICAgICAgICAgICAgICAgICBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uCisgKiBZIChub3QgaW4gdGhpcyBjb2RlKSBMYXllci0xCisgKiBZIChub3QgaW4gdGhpcyBjb2RlKSBMYXllci0yCisgKiBZIChub3QgaW4gdGhpcyBjb2RlKSBMYXllci0zCisgKiBOICAgICAgICAgICAgICAgICAgICBTaW51U29pZGFsIENvZGluZyAoVHJhbnNpZW50LCBTaW51c29pZCwgTm9pc2UpCisgKiBZICAgICAgICAgICAgICAgICAgICBQYXJhbWV0cmljIFN0ZXJlbworICogTiAgICAgICAgICAgICAgICAgICAgRGlyZWN0IFN0cmVhbSBUcmFuc2ZlcgorICogWSAgICAgICAgICAgICAgICAgICAgRW5oYW5jZWQgQUFDIExvdyBEZWxheSAoRVIgQUFDIEVMRCkKKyAqCisgKiBOb3RlOiAtIEhFIEFBQyB2MSBjb21wcmlzZXMgTEMgQUFDIHdpdGggU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbi4KKyAqICAgICAgIC0gSEUgQUFDIHYyIGNvbXByaXNlcyBMQyBBQUMgd2l0aCBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIGFuZAorICAgICAgICAgICBQYXJhbWV0cmljIFN0ZXJlby4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgImZtdGNvbnZlcnQuaCIKKyNpbmNsdWRlICJscGMuaCIKKyNpbmNsdWRlICJrYmR3aW4uaCIKKyNpbmNsdWRlICJzaW5ld2luLmgiCisKKyNpbmNsdWRlICJhYWMuaCIKKyNpbmNsdWRlICJhYWN0YWIuaCIKKyNpbmNsdWRlICJhYWNkZWN0YWIuaCIKKyNpbmNsdWRlICJjYnJ0X3RhYmxlZ2VuLmgiCisjaW5jbHVkZSAic2JyLmgiCisjaW5jbHVkZSAiYWFjc2JyLmgiCisjaW5jbHVkZSAibXBlZzRhdWRpby5oIgorI2luY2x1ZGUgImFhY2FkdHNkZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgQVJDSF9BUk0KKyMgICBpbmNsdWRlICJhcm0vYWFjLmgiCisjZWxpZiBBUkNIX01JUFMKKyMgICBpbmNsdWRlICJtaXBzL2FhY2RlY19taXBzLmgiCisjZW5kaWYKKworc3RhdGljIFZMQyB2bGNfc2NhbGVmYWN0b3JzOworc3RhdGljIFZMQyB2bGNfc3BlY3RyYWxbMTFdOworCitzdGF0aWMgaW50IG91dHB1dF9jb25maWd1cmUoQUFDQ29udGV4dCAqYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsYXlvdXRfbWFwW01BWF9FTEVNX0lEKjRdWzNdLCBpbnQgdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIE9DU3RhdHVzIG9jX3R5cGUsIGludCBnZXRfbmV3X2ZyYW1lKTsKKworI2RlZmluZSBvdmVycmVhZF9lcnIgIklucHV0IGJ1ZmZlciBleGhhdXN0ZWQgYmVmb3JlIEVORCBlbGVtZW50IGZvdW5kXG4iCisKK3N0YXRpYyBpbnQgY291bnRfY2hhbm5lbHModWludDhfdCAoKmxheW91dClbM10sIGludCB0YWdzKQoreworICAgIGludCBpLCBzdW0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCB0YWdzOyBpKyspIHsKKyAgICAgICAgaW50IHN5bl9lbGUgPSBsYXlvdXRbaV1bMF07CisgICAgICAgIGludCBwb3MgICAgID0gbGF5b3V0W2ldWzJdOworICAgICAgICBzdW0gKz0gKDEgKyAoc3luX2VsZSA9PSBUWVBFX0NQRSkpICoKKyAgICAgICAgICAgICAgIChwb3MgIT0gQUFDX0NIQU5ORUxfT0ZGICYmIHBvcyAhPSBBQUNfQ0hBTk5FTF9DQyk7CisgICAgfQorICAgIHJldHVybiBzdW07Cit9CisKKy8qKgorICogQ2hlY2sgZm9yIHRoZSBjaGFubmVsIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbCBwb3NpdGlvbiBjb25maWd1cmF0aW9uLgorICogSWYgaXQgZXhpc3RzLCBtYWtlIHN1cmUgdGhlIGFwcHJvcHJpYXRlIGVsZW1lbnQgaXMgYWxsb2NhdGVkIGFuZCBtYXAgdGhlCisgKiBjaGFubmVsIG9yZGVyIHRvIG1hdGNoIHRoZSBpbnRlcm5hbCBGRm1wZWcgY2hhbm5lbCBsYXlvdXQuCisgKgorICogQHBhcmFtICAgY2hlX3BvcyBjdXJyZW50IGNoYW5uZWwgcG9zaXRpb24gY29uZmlndXJhdGlvbgorICogQHBhcmFtICAgdHlwZSBjaGFubmVsIGVsZW1lbnQgdHlwZQorICogQHBhcmFtICAgaWQgY2hhbm5lbCBlbGVtZW50IGlkCisgKiBAcGFyYW0gICBjaGFubmVscyBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBjb25maWd1cmF0aW9uCisgKgorICogQHJldHVybiAgUmV0dXJucyBlcnJvciBzdGF0dXMuIDAgLSBPSywgITAgLSBlcnJvcgorICovCitzdGF0aWMgYXZfY29sZCBpbnQgY2hlX2NvbmZpZ3VyZShBQUNDb250ZXh0ICphYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQ2hhbm5lbFBvc2l0aW9uIGNoZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgaW50IGlkLCBpbnQgKmNoYW5uZWxzKQoreworICAgIGlmICgqY2hhbm5lbHMgPj0gTUFYX0NIQU5ORUxTKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoY2hlX3BvcykgeworICAgICAgICBpZiAoIWFjLT5jaGVbdHlwZV1baWRdKSB7CisgICAgICAgICAgICBpZiAoIShhYy0+Y2hlW3R5cGVdW2lkXSA9IGF2X21hbGxvY3ooc2l6ZW9mKENoYW5uZWxFbGVtZW50KSkpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBmZl9hYWNfc2JyX2N0eF9pbml0KGFjLCAmYWMtPmNoZVt0eXBlXVtpZF0tPnNicik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgIT0gVFlQRV9DQ0UpIHsKKyAgICAgICAgICAgIGlmICgqY2hhbm5lbHMgPj0gTUFYX0NIQU5ORUxTIC0gKHR5cGUgPT0gVFlQRV9DUEUgfHwgKHR5cGUgPT0gVFlQRV9TQ0UgJiYgYWMtPm9jWzFdLm00YWMucHMgPT0gMSkpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgY2hhbm5lbHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWMtPm91dHB1dF9lbGVtZW50WygqY2hhbm5lbHMpKytdID0gJmFjLT5jaGVbdHlwZV1baWRdLT5jaFswXTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IFRZUEVfQ1BFIHx8CisgICAgICAgICAgICAgICAgKHR5cGUgPT0gVFlQRV9TQ0UgJiYgYWMtPm9jWzFdLm00YWMucHMgPT0gMSkpIHsKKyAgICAgICAgICAgICAgICBhYy0+b3V0cHV0X2VsZW1lbnRbKCpjaGFubmVscykrK10gPSAmYWMtPmNoZVt0eXBlXVtpZF0tPmNoWzFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFjLT5jaGVbdHlwZV1baWRdKQorICAgICAgICAgICAgZmZfYWFjX3Nicl9jdHhfY2xvc2UoJmFjLT5jaGVbdHlwZV1baWRdLT5zYnIpOworICAgICAgICBhdl9mcmVlcCgmYWMtPmNoZVt0eXBlXVtpZF0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmcmFtZV9jb25maWd1cmVfZWxlbWVudHMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFBQ0NvbnRleHQgKmFjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgdHlwZSwgaWQsIGNoLCByZXQ7CisKKyAgICAvKiBzZXQgY2hhbm5lbCBwb2ludGVycyB0byBpbnRlcm5hbCBidWZmZXJzIGJ5IGRlZmF1bHQgKi8KKyAgICBmb3IgKHR5cGUgPSAwOyB0eXBlIDwgNDsgdHlwZSsrKSB7CisgICAgICAgIGZvciAoaWQgPSAwOyBpZCA8IE1BWF9FTEVNX0lEOyBpZCsrKSB7CisgICAgICAgICAgICBDaGFubmVsRWxlbWVudCAqY2hlID0gYWMtPmNoZVt0eXBlXVtpZF07CisgICAgICAgICAgICBpZiAoY2hlKSB7CisgICAgICAgICAgICAgICAgY2hlLT5jaFswXS5yZXQgPSBjaGUtPmNoWzBdLnJldF9idWY7CisgICAgICAgICAgICAgICAgY2hlLT5jaFsxXS5yZXQgPSBjaGUtPmNoWzFdLnJldF9idWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGF2X2ZyYW1lX3VucmVmKGFjLT5mcmFtZSk7CisgICAgaWYgKCFhdmN0eC0+Y2hhbm5lbHMpCisgICAgICAgIHJldHVybiAxOworCisgICAgYWMtPmZyYW1lLT5uYl9zYW1wbGVzID0gMjA0ODsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGFjLT5mcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIG1hcCBvdXRwdXQgY2hhbm5lbCBwb2ludGVycyB0byBBVkZyYW1lIGRhdGEgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBhdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKGFjLT5vdXRwdXRfZWxlbWVudFtjaF0pCisgICAgICAgICAgICBhYy0+b3V0cHV0X2VsZW1lbnRbY2hdLT5yZXQgPSAoZmxvYXQgKilhYy0+ZnJhbWUtPmV4dGVuZGVkX2RhdGFbY2hdOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdHJ1Y3QgZWxlbV90b19jaGFubmVsIHsKKyAgICB1aW50NjRfdCBhdl9wb3NpdGlvbjsKKyAgICB1aW50OF90IHN5bl9lbGU7CisgICAgdWludDhfdCBlbGVtX2lkOworICAgIHVpbnQ4X3QgYWFjX3Bvc2l0aW9uOworfTsKKworc3RhdGljIGludCBhc3NpZ25fcGFpcihzdHJ1Y3QgZWxlbV90b19jaGFubmVsIGUyY192ZWNbTUFYX0VMRU1fSURdLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICgqbGF5b3V0X21hcClbM10sIGludCBvZmZzZXQsIHVpbnQ2NF90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHJpZ2h0LCBpbnQgcG9zKQoreworICAgIGlmIChsYXlvdXRfbWFwW29mZnNldF1bMF0gPT0gVFlQRV9DUEUpIHsKKyAgICAgICAgZTJjX3ZlY1tvZmZzZXRdID0gKHN0cnVjdCBlbGVtX3RvX2NoYW5uZWwpIHsKKyAgICAgICAgICAgIC5hdl9wb3NpdGlvbiAgPSBsZWZ0IHwgcmlnaHQsCisgICAgICAgICAgICAuc3luX2VsZSAgICAgID0gVFlQRV9DUEUsCisgICAgICAgICAgICAuZWxlbV9pZCAgICAgID0gbGF5b3V0X21hcFtvZmZzZXRdWzFdLAorICAgICAgICAgICAgLmFhY19wb3NpdGlvbiA9IHBvcworICAgICAgICB9OworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBlMmNfdmVjW29mZnNldF0gPSAoc3RydWN0IGVsZW1fdG9fY2hhbm5lbCkgeworICAgICAgICAgICAgLmF2X3Bvc2l0aW9uICA9IGxlZnQsCisgICAgICAgICAgICAuc3luX2VsZSAgICAgID0gVFlQRV9TQ0UsCisgICAgICAgICAgICAuZWxlbV9pZCAgICAgID0gbGF5b3V0X21hcFtvZmZzZXRdWzFdLAorICAgICAgICAgICAgLmFhY19wb3NpdGlvbiA9IHBvcworICAgICAgICB9OworICAgICAgICBlMmNfdmVjW29mZnNldCArIDFdID0gKHN0cnVjdCBlbGVtX3RvX2NoYW5uZWwpIHsKKyAgICAgICAgICAgIC5hdl9wb3NpdGlvbiAgPSByaWdodCwKKyAgICAgICAgICAgIC5zeW5fZWxlICAgICAgPSBUWVBFX1NDRSwKKyAgICAgICAgICAgIC5lbGVtX2lkICAgICAgPSBsYXlvdXRfbWFwW29mZnNldCArIDFdWzFdLAorICAgICAgICAgICAgLmFhY19wb3NpdGlvbiA9IHBvcworICAgICAgICB9OworICAgICAgICByZXR1cm4gMjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY291bnRfcGFpcmVkX2NoYW5uZWxzKHVpbnQ4X3QgKCpsYXlvdXRfbWFwKVszXSwgaW50IHRhZ3MsIGludCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmN1cnJlbnQpCit7CisgICAgaW50IG51bV9wb3NfY2hhbm5lbHMgPSAwOworICAgIGludCBmaXJzdF9jcGUgICAgICAgID0gMDsKKyAgICBpbnQgc2NlX3Bhcml0eSAgICAgICA9IDA7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gKmN1cnJlbnQ7IGkgPCB0YWdzOyBpKyspIHsKKyAgICAgICAgaWYgKGxheW91dF9tYXBbaV1bMl0gIT0gcG9zKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChsYXlvdXRfbWFwW2ldWzBdID09IFRZUEVfQ1BFKSB7CisgICAgICAgICAgICBpZiAoc2NlX3Bhcml0eSkgeworICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gQUFDX0NIQU5ORUxfRlJPTlQgJiYgIWZpcnN0X2NwZSkgeworICAgICAgICAgICAgICAgICAgICBzY2VfcGFyaXR5ID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtX3Bvc19jaGFubmVscyArPSAyOworICAgICAgICAgICAgZmlyc3RfY3BlICAgICAgICAgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtX3Bvc19jaGFubmVscysrOworICAgICAgICAgICAgc2NlX3Bhcml0eSBePSAxOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzY2VfcGFyaXR5ICYmCisgICAgICAgICgocG9zID09IEFBQ19DSEFOTkVMX0ZST05UICYmIGZpcnN0X2NwZSkgfHwgcG9zID09IEFBQ19DSEFOTkVMX1NJREUpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKmN1cnJlbnQgPSBpOworICAgIHJldHVybiBudW1fcG9zX2NoYW5uZWxzOworfQorCitzdGF0aWMgdWludDY0X3Qgc25pZmZfY2hhbm5lbF9vcmRlcih1aW50OF90ICgqbGF5b3V0X21hcClbM10sIGludCB0YWdzKQoreworICAgIGludCBpLCBuLCB0b3RhbF9ub25fY2NfZWxlbWVudHM7CisgICAgc3RydWN0IGVsZW1fdG9fY2hhbm5lbCBlMmNfdmVjWzQgKiBNQVhfRUxFTV9JRF0gPSB7IHsgMCB9IH07CisgICAgaW50IG51bV9mcm9udF9jaGFubmVscywgbnVtX3NpZGVfY2hhbm5lbHMsIG51bV9iYWNrX2NoYW5uZWxzOworICAgIHVpbnQ2NF90IGxheW91dDsKKworICAgIGlmIChGRl9BUlJBWV9FTEVNUyhlMmNfdmVjKSA8IHRhZ3MpCisgICAgICAgIHJldHVybiAwOworCisgICAgaSA9IDA7CisgICAgbnVtX2Zyb250X2NoYW5uZWxzID0KKyAgICAgICAgY291bnRfcGFpcmVkX2NoYW5uZWxzKGxheW91dF9tYXAsIHRhZ3MsIEFBQ19DSEFOTkVMX0ZST05ULCAmaSk7CisgICAgaWYgKG51bV9mcm9udF9jaGFubmVscyA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIG51bV9zaWRlX2NoYW5uZWxzID0KKyAgICAgICAgY291bnRfcGFpcmVkX2NoYW5uZWxzKGxheW91dF9tYXAsIHRhZ3MsIEFBQ19DSEFOTkVMX1NJREUsICZpKTsKKyAgICBpZiAobnVtX3NpZGVfY2hhbm5lbHMgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBudW1fYmFja19jaGFubmVscyA9CisgICAgICAgIGNvdW50X3BhaXJlZF9jaGFubmVscyhsYXlvdXRfbWFwLCB0YWdzLCBBQUNfQ0hBTk5FTF9CQUNLLCAmaSk7CisgICAgaWYgKG51bV9iYWNrX2NoYW5uZWxzIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpID0gMDsKKyAgICBpZiAobnVtX2Zyb250X2NoYW5uZWxzICYgMSkgeworICAgICAgICBlMmNfdmVjW2ldID0gKHN0cnVjdCBlbGVtX3RvX2NoYW5uZWwpIHsKKyAgICAgICAgICAgIC5hdl9wb3NpdGlvbiAgPSBBVl9DSF9GUk9OVF9DRU5URVIsCisgICAgICAgICAgICAuc3luX2VsZSAgICAgID0gVFlQRV9TQ0UsCisgICAgICAgICAgICAuZWxlbV9pZCAgICAgID0gbGF5b3V0X21hcFtpXVsxXSwKKyAgICAgICAgICAgIC5hYWNfcG9zaXRpb24gPSBBQUNfQ0hBTk5FTF9GUk9OVAorICAgICAgICB9OworICAgICAgICBpKys7CisgICAgICAgIG51bV9mcm9udF9jaGFubmVscy0tOworICAgIH0KKyAgICBpZiAobnVtX2Zyb250X2NoYW5uZWxzID49IDQpIHsKKyAgICAgICAgaSArPSBhc3NpZ25fcGFpcihlMmNfdmVjLCBsYXlvdXRfbWFwLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0ZST05UX0xFRlRfT0ZfQ0VOVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0ZST05UX1JJR0hUX09GX0NFTlRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBQUNfQ0hBTk5FTF9GUk9OVCk7CisgICAgICAgIG51bV9mcm9udF9jaGFubmVscyAtPSAyOworICAgIH0KKyAgICBpZiAobnVtX2Zyb250X2NoYW5uZWxzID49IDIpIHsKKyAgICAgICAgaSArPSBhc3NpZ25fcGFpcihlMmNfdmVjLCBsYXlvdXRfbWFwLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0ZST05UX0xFRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfRlJPTlRfUklHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUFDX0NIQU5ORUxfRlJPTlQpOworICAgICAgICBudW1fZnJvbnRfY2hhbm5lbHMgLT0gMjsKKyAgICB9CisgICAgd2hpbGUgKG51bV9mcm9udF9jaGFubmVscyA+PSAyKSB7CisgICAgICAgIGkgKz0gYXNzaWduX3BhaXIoZTJjX3ZlYywgbGF5b3V0X21hcCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UNjRfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ2NF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUFDX0NIQU5ORUxfRlJPTlQpOworICAgICAgICBudW1fZnJvbnRfY2hhbm5lbHMgLT0gMjsKKyAgICB9CisKKyAgICBpZiAobnVtX3NpZGVfY2hhbm5lbHMgPj0gMikgeworICAgICAgICBpICs9IGFzc2lnbl9wYWlyKGUyY192ZWMsIGxheW91dF9tYXAsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfU0lERV9MRUZULAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX1NJREVfUklHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUFDX0NIQU5ORUxfRlJPTlQpOworICAgICAgICBudW1fc2lkZV9jaGFubmVscyAtPSAyOworICAgIH0KKyAgICB3aGlsZSAobnVtX3NpZGVfY2hhbm5lbHMgPj0gMikgeworICAgICAgICBpICs9IGFzc2lnbl9wYWlyKGUyY192ZWMsIGxheW91dF9tYXAsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDY0X01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UNjRfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ19DSEFOTkVMX1NJREUpOworICAgICAgICBudW1fc2lkZV9jaGFubmVscyAtPSAyOworICAgIH0KKworICAgIHdoaWxlIChudW1fYmFja19jaGFubmVscyA+PSA0KSB7CisgICAgICAgIGkgKz0gYXNzaWduX3BhaXIoZTJjX3ZlYywgbGF5b3V0X21hcCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UNjRfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ2NF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUFDX0NIQU5ORUxfQkFDSyk7CisgICAgICAgIG51bV9iYWNrX2NoYW5uZWxzIC09IDI7CisgICAgfQorICAgIGlmIChudW1fYmFja19jaGFubmVscyA+PSAyKSB7CisgICAgICAgIGkgKz0gYXNzaWduX3BhaXIoZTJjX3ZlYywgbGF5b3V0X21hcCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9CQUNLX0xFRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfQkFDS19SSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBQUNfQ0hBTk5FTF9CQUNLKTsKKyAgICAgICAgbnVtX2JhY2tfY2hhbm5lbHMgLT0gMjsKKyAgICB9CisgICAgaWYgKG51bV9iYWNrX2NoYW5uZWxzKSB7CisgICAgICAgIGUyY192ZWNbaV0gPSAoc3RydWN0IGVsZW1fdG9fY2hhbm5lbCkgeworICAgICAgICAgICAgLmF2X3Bvc2l0aW9uICA9IEFWX0NIX0JBQ0tfQ0VOVEVSLAorICAgICAgICAgICAgLnN5bl9lbGUgICAgICA9IFRZUEVfU0NFLAorICAgICAgICAgICAgLmVsZW1faWQgICAgICA9IGxheW91dF9tYXBbaV1bMV0sCisgICAgICAgICAgICAuYWFjX3Bvc2l0aW9uID0gQUFDX0NIQU5ORUxfQkFDSworICAgICAgICB9OworICAgICAgICBpKys7CisgICAgICAgIG51bV9iYWNrX2NoYW5uZWxzLS07CisgICAgfQorCisgICAgaWYgKGkgPCB0YWdzICYmIGxheW91dF9tYXBbaV1bMl0gPT0gQUFDX0NIQU5ORUxfTEZFKSB7CisgICAgICAgIGUyY192ZWNbaV0gPSAoc3RydWN0IGVsZW1fdG9fY2hhbm5lbCkgeworICAgICAgICAgICAgLmF2X3Bvc2l0aW9uICA9IEFWX0NIX0xPV19GUkVRVUVOQ1ksCisgICAgICAgICAgICAuc3luX2VsZSAgICAgID0gVFlQRV9MRkUsCisgICAgICAgICAgICAuZWxlbV9pZCAgICAgID0gbGF5b3V0X21hcFtpXVsxXSwKKyAgICAgICAgICAgIC5hYWNfcG9zaXRpb24gPSBBQUNfQ0hBTk5FTF9MRkUKKyAgICAgICAgfTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICB3aGlsZSAoaSA8IHRhZ3MgJiYgbGF5b3V0X21hcFtpXVsyXSA9PSBBQUNfQ0hBTk5FTF9MRkUpIHsKKyAgICAgICAgZTJjX3ZlY1tpXSA9IChzdHJ1Y3QgZWxlbV90b19jaGFubmVsKSB7CisgICAgICAgICAgICAuYXZfcG9zaXRpb24gID0gVUlOVDY0X01BWCwKKyAgICAgICAgICAgIC5zeW5fZWxlICAgICAgPSBUWVBFX0xGRSwKKyAgICAgICAgICAgIC5lbGVtX2lkICAgICAgPSBsYXlvdXRfbWFwW2ldWzFdLAorICAgICAgICAgICAgLmFhY19wb3NpdGlvbiA9IEFBQ19DSEFOTkVMX0xGRQorICAgICAgICB9OworICAgICAgICBpKys7CisgICAgfQorCisgICAgLy8gTXVzdCBjaG9vc2UgYSBzdGFibGUgc29ydAorICAgIHRvdGFsX25vbl9jY19lbGVtZW50cyA9IG4gPSBpOworICAgIGRvIHsKKyAgICAgICAgaW50IG5leHRfbiA9IDA7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspCisgICAgICAgICAgICBpZiAoZTJjX3ZlY1tpIC0gMV0uYXZfcG9zaXRpb24gPiBlMmNfdmVjW2ldLmF2X3Bvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgRkZTV0FQKHN0cnVjdCBlbGVtX3RvX2NoYW5uZWwsIGUyY192ZWNbaSAtIDFdLCBlMmNfdmVjW2ldKTsKKyAgICAgICAgICAgICAgICBuZXh0X24gPSBpOworICAgICAgICAgICAgfQorICAgICAgICBuID0gbmV4dF9uOworICAgIH0gd2hpbGUgKG4gPiAwKTsKKworICAgIGxheW91dCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsX25vbl9jY19lbGVtZW50czsgaSsrKSB7CisgICAgICAgIGxheW91dF9tYXBbaV1bMF0gPSBlMmNfdmVjW2ldLnN5bl9lbGU7CisgICAgICAgIGxheW91dF9tYXBbaV1bMV0gPSBlMmNfdmVjW2ldLmVsZW1faWQ7CisgICAgICAgIGxheW91dF9tYXBbaV1bMl0gPSBlMmNfdmVjW2ldLmFhY19wb3NpdGlvbjsKKyAgICAgICAgaWYgKGUyY192ZWNbaV0uYXZfcG9zaXRpb24gIT0gVUlOVDY0X01BWCkgeworICAgICAgICAgICAgbGF5b3V0IHw9IGUyY192ZWNbaV0uYXZfcG9zaXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbGF5b3V0OworfQorCisvKioKKyAqIFNhdmUgY3VycmVudCBvdXRwdXQgY29uZmlndXJhdGlvbiBpZiBhbmQgb25seSBpZiBpdCBoYXMgYmVlbiBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkIHB1c2hfb3V0cHV0X2NvbmZpZ3VyYXRpb24oQUFDQ29udGV4dCAqYWMpIHsKKyAgICBpZiAoYWMtPm9jWzFdLnN0YXR1cyA9PSBPQ19MT0NLRUQpIHsKKyAgICAgICAgYWMtPm9jWzBdID0gYWMtPm9jWzFdOworICAgIH0KKyAgICBhYy0+b2NbMV0uc3RhdHVzID0gT0NfTk9ORTsKK30KKworLyoqCisgKiBSZXN0b3JlIHRoZSBwcmV2aW91cyBvdXRwdXQgY29uZmlndXJhdGlvbiBpZiBhbmQgb25seSBpZiB0aGUgY3VycmVudAorICogY29uZmlndXJhdGlvbiBpcyB1bmxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQgcG9wX291dHB1dF9jb25maWd1cmF0aW9uKEFBQ0NvbnRleHQgKmFjKSB7CisgICAgaWYgKGFjLT5vY1sxXS5zdGF0dXMgIT0gT0NfTE9DS0VEICYmIGFjLT5vY1swXS5zdGF0dXMgIT0gT0NfTk9ORSkgeworICAgICAgICBhYy0+b2NbMV0gPSBhYy0+b2NbMF07CisgICAgICAgIGFjLT5hdmN0eC0+Y2hhbm5lbHMgPSBhYy0+b2NbMV0uY2hhbm5lbHM7CisgICAgICAgIGFjLT5hdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBhYy0+b2NbMV0uY2hhbm5lbF9sYXlvdXQ7CisgICAgICAgIG91dHB1dF9jb25maWd1cmUoYWMsIGFjLT5vY1sxXS5sYXlvdXRfbWFwLCBhYy0+b2NbMV0ubGF5b3V0X21hcF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFjLT5vY1sxXS5zdGF0dXMsIDApOworICAgIH0KK30KKworLyoqCisgKiBDb25maWd1cmUgb3V0cHV0IGNoYW5uZWwgb3JkZXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgcHJvZ3JhbQorICogY29uZmlndXJhdGlvbiBlbGVtZW50LgorICoKKyAqIEByZXR1cm4gIFJldHVybnMgZXJyb3Igc3RhdHVzLiAwIC0gT0ssICEwIC0gZXJyb3IKKyAqLworc3RhdGljIGludCBvdXRwdXRfY29uZmlndXJlKEFBQ0NvbnRleHQgKmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGF5b3V0X21hcFtNQVhfRUxFTV9JRCAqIDRdWzNdLCBpbnQgdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIE9DU3RhdHVzIG9jX3R5cGUsIGludCBnZXRfbmV3X2ZyYW1lKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IGFjLT5hdmN0eDsKKyAgICBpbnQgaSwgY2hhbm5lbHMgPSAwLCByZXQ7CisgICAgdWludDY0X3QgbGF5b3V0ID0gMDsKKworICAgIGlmIChhYy0+b2NbMV0ubGF5b3V0X21hcCAhPSBsYXlvdXRfbWFwKSB7CisgICAgICAgIG1lbWNweShhYy0+b2NbMV0ubGF5b3V0X21hcCwgbGF5b3V0X21hcCwgdGFncyAqIHNpemVvZihsYXlvdXRfbWFwWzBdKSk7CisgICAgICAgIGFjLT5vY1sxXS5sYXlvdXRfbWFwX3RhZ3MgPSB0YWdzOworICAgIH0KKworICAgIC8vIFRyeSB0byBzbmlmZiBhIHJlYXNvbmFibGUgY2hhbm5lbCBvcmRlciwgb3RoZXJ3aXNlIG91dHB1dCB0aGUKKyAgICAvLyBjaGFubmVscyBpbiB0aGUgb3JkZXIgdGhlIFBDRSBkZWNsYXJlZCB0aGVtLgorICAgIGlmIChhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCAhPSBBVl9DSF9MQVlPVVRfTkFUSVZFKQorICAgICAgICBsYXlvdXQgPSBzbmlmZl9jaGFubmVsX29yZGVyKGxheW91dF9tYXAsIHRhZ3MpOworICAgIGZvciAoaSA9IDA7IGkgPCB0YWdzOyBpKyspIHsKKyAgICAgICAgaW50IHR5cGUgPSAgICAgbGF5b3V0X21hcFtpXVswXTsKKyAgICAgICAgaW50IGlkID0gICAgICAgbGF5b3V0X21hcFtpXVsxXTsKKyAgICAgICAgaW50IHBvc2l0aW9uID0gbGF5b3V0X21hcFtpXVsyXTsKKyAgICAgICAgLy8gQWxsb2NhdGUgb3IgZnJlZSBlbGVtZW50cyBkZXBlbmRpbmcgb24gaWYgdGhleSBhcmUgaW4gdGhlCisgICAgICAgIC8vIGN1cnJlbnQgcHJvZ3JhbSBjb25maWd1cmF0aW9uLgorICAgICAgICByZXQgPSBjaGVfY29uZmlndXJlKGFjLCBwb3NpdGlvbiwgdHlwZSwgaWQsICZjaGFubmVscyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKGFjLT5vY1sxXS5tNGFjLnBzID09IDEgJiYgY2hhbm5lbHMgPT0gMikgeworICAgICAgICBpZiAobGF5b3V0ID09IEFWX0NIX0ZST05UX0NFTlRFUikgeworICAgICAgICAgICAgbGF5b3V0ID0gQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxheW91dCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1jcHkoYWMtPnRhZ19jaGVfbWFwLCBhYy0+Y2hlLCA0ICogTUFYX0VMRU1fSUQgKiBzaXplb2YoYWMtPmNoZVswXVswXSkpOworICAgIGlmIChsYXlvdXQpIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGxheW91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYy0+b2NbMV0uY2hhbm5lbF9sYXlvdXQgPSBsYXlvdXQ7CisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gYWMtPm9jWzFdLmNoYW5uZWxzICAgICAgID0gY2hhbm5lbHM7CisgICAgYWMtPm9jWzFdLnN0YXR1cyA9IG9jX3R5cGU7CisKKyAgICBpZiAoZ2V0X25ld19mcmFtZSkgeworICAgICAgICBpZiAoKHJldCA9IGZyYW1lX2NvbmZpZ3VyZV9lbGVtZW50cyhhYy0+YXZjdHgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQUFDQ29udGV4dCAqYWM9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHR5cGUsIGksIGo7CisKKyAgICBmb3IgKHR5cGUgPSAzOyB0eXBlID49IDA7IHR5cGUtLSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0VMRU1fSUQ7IGkrKykgeworICAgICAgICAgICAgQ2hhbm5lbEVsZW1lbnQgKmNoZSA9IGFjLT5jaGVbdHlwZV1baV07CisgICAgICAgICAgICBpZiAoY2hlKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSAxOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNoZS0+Y2hbal0uc2F2ZWQsIDAsIHNpemVvZihjaGUtPmNoW2pdLnNhdmVkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIFNldCB1cCBjaGFubmVsIHBvc2l0aW9ucyBiYXNlZCBvbiBhIGRlZmF1bHQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgKiBhcyBzcGVjaWZpZWQgaW4gdGFibGUgMS4xNy4KKyAqCisgKiBAcmV0dXJuICBSZXR1cm5zIGVycm9yIHN0YXR1cy4gMCAtIE9LLCAhMCAtIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgc2V0X2RlZmF1bHRfY2hhbm5lbF9jb25maWcoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICgqbGF5b3V0X21hcClbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxfY29uZmlnKQoreworICAgIGlmIChjaGFubmVsX2NvbmZpZyA8IDEgfHwgY2hhbm5lbF9jb25maWcgPiA3KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImludmFsaWQgZGVmYXVsdCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKCVkKVxuIiwKKyAgICAgICAgICAgICAgIGNoYW5uZWxfY29uZmlnKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgICp0YWdzID0gdGFnc19wZXJfY29uZmlnW2NoYW5uZWxfY29uZmlnXTsKKyAgICBtZW1jcHkobGF5b3V0X21hcCwgYWFjX2NoYW5uZWxfbGF5b3V0X21hcFtjaGFubmVsX2NvbmZpZyAtIDFdLAorICAgICAgICAgICAqdGFncyAqIHNpemVvZigqbGF5b3V0X21hcCkpOworCisgICAgLyoKKyAgICAgKiBBQUMgc3BlY2lmaWNhdGlvbiBoYXMgNy4xKHdpZGUpIGFzIGEgZGVmYXVsdCBsYXlvdXQgZm9yIDgtY2hhbm5lbCBzdHJlYW1zLgorICAgICAqIEhvd2V2ZXIsIGF0IGxlYXN0IE5lcm8gQUFDIGVuY29kZXIgZW5jb2RlcyA3LjEgc3RyZWFtcyB1c2luZyB0aGUgZGVmYXVsdAorICAgICAqIGNoYW5uZWwgY29uZmlnIDcsIG1hcHBpbmcgdGhlIHNpZGUgY2hhbm5lbHMgb2YgdGhlIG9yaWdpbmFsIGF1ZGlvIHN0cmVhbQorICAgICAqIHRvIHRoZSBzZWNvbmQgQUFDX0NIQU5ORUxfRlJPTlQgcGFpciBpbiB0aGUgQUFDIHN0cmVhbS4gU2ltaWxhcmx5LCBlLmcuIEZBQUQKKyAgICAgKiBkZWNvZGVzIHRoZSBzZWNvbmQgQUFDX0NIQU5ORUxfRlJPTlQgcGFpciBhcyBzaWRlIGNoYW5uZWxzLCB0aGVyZWZvcmUgZGVjb2RpbmcKKyAgICAgKiB0aGUgaW5jb3JyZWN0IHN0cmVhbXMgYXMgaWYgdGhleSB3ZXJlIGNvcnJlY3QgKGFuZCBhcyB0aGUgZW5jb2RlciBpbnRlbmRlZCkuCisgICAgICoKKyAgICAgKiBBcyBhY3R1YWwgaW50ZW5kZWQgNy4xKHdpZGUpIHN0cmVhbXMgYXJlIHZlcnkgcmFyZSwgZGVmYXVsdCB0byBhc3N1bWluZyBhCisgICAgICogNy4xIGxheW91dCB3YXMgaW50ZW5kZWQuCisgICAgICovCisgICAgaWYgKGNoYW5uZWxfY29uZmlnID09IDcgJiYgYXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA8IEZGX0NPTVBMSUFOQ0VfU1RSSUNUKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJBc3N1bWluZyBhbiBpbmNvcnJlY3RseSBlbmNvZGVkIDcuMSBjaGFubmVsIGxheW91dCIKKyAgICAgICAgICAgICAgICIgaW5zdGVhZCBvZiBhIHNwZWMtY29tcGxpYW50IDcuMSh3aWRlKSBsYXlvdXQsIHVzZSAtc3RyaWN0ICVkIHRvIGRlY29kZSIKKyAgICAgICAgICAgICAgICIgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGluc3RlYWQuXG4iLCBGRl9DT01QTElBTkNFX1NUUklDVCk7CisgICAgICAgIGxheW91dF9tYXBbMl1bMl0gPSBBQUNfQ0hBTk5FTF9TSURFOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQ2hhbm5lbEVsZW1lbnQgKmdldF9jaGUoQUFDQ29udGV4dCAqYWMsIGludCB0eXBlLCBpbnQgZWxlbV9pZCkKK3sKKyAgICAvKiBGb3IgUENFIGJhc2VkIGNoYW5uZWwgY29uZmlndXJhdGlvbnMgbWFwIHRoZSBjaGFubmVscyBzb2xlbHkgYmFzZWQKKyAgICAgKiBvbiB0YWdzLiAqLworICAgIGlmICghYWMtPm9jWzFdLm00YWMuY2hhbl9jb25maWcpIHsKKyAgICAgICAgcmV0dXJuIGFjLT50YWdfY2hlX21hcFt0eXBlXVtlbGVtX2lkXTsKKyAgICB9CisgICAgLy8gQWxsb3cgc2luZ2xlIENQRSBzdGVyZW8gZmlsZXMgdG8gYmUgc2lnbmFsbGVkIHdpdGggbW9ubyBjb25maWd1cmF0aW9uLgorICAgIGlmICghYWMtPnRhZ3NfbWFwcGVkICYmIHR5cGUgPT0gVFlQRV9DUEUgJiYKKyAgICAgICAgYWMtPm9jWzFdLm00YWMuY2hhbl9jb25maWcgPT0gMSkgeworICAgICAgICB1aW50OF90IGxheW91dF9tYXBbTUFYX0VMRU1fSUQqNF1bM107CisgICAgICAgIGludCBsYXlvdXRfbWFwX3RhZ3M7CisgICAgICAgIHB1c2hfb3V0cHV0X2NvbmZpZ3VyYXRpb24oYWMpOworCisgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIm1vbm8gd2l0aCBDUEVcbiIpOworCisgICAgICAgIGlmIChzZXRfZGVmYXVsdF9jaGFubmVsX2NvbmZpZyhhYy0+YXZjdHgsIGxheW91dF9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGF5b3V0X21hcF90YWdzLCAyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKG91dHB1dF9jb25maWd1cmUoYWMsIGxheW91dF9tYXAsIGxheW91dF9tYXBfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NfVFJJQUxfRlJBTUUsIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIGFjLT5vY1sxXS5tNGFjLmNoYW5fY29uZmlnID0gMjsKKyAgICAgICAgYWMtPm9jWzFdLm00YWMucHMgPSAwOworICAgIH0KKyAgICAvLyBBbmQgdmljZS12ZXJzYQorICAgIGlmICghYWMtPnRhZ3NfbWFwcGVkICYmIHR5cGUgPT0gVFlQRV9TQ0UgJiYKKyAgICAgICAgYWMtPm9jWzFdLm00YWMuY2hhbl9jb25maWcgPT0gMikgeworICAgICAgICB1aW50OF90IGxheW91dF9tYXBbTUFYX0VMRU1fSUQgKiA0XVszXTsKKyAgICAgICAgaW50IGxheW91dF9tYXBfdGFnczsKKyAgICAgICAgcHVzaF9vdXRwdXRfY29uZmlndXJhdGlvbihhYyk7CisKKyAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAic3RlcmVvIHdpdGggU0NFXG4iKTsKKworICAgICAgICBpZiAoc2V0X2RlZmF1bHRfY2hhbm5lbF9jb25maWcoYWMtPmF2Y3R4LCBsYXlvdXRfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxheW91dF9tYXBfdGFncywgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChvdXRwdXRfY29uZmlndXJlKGFjLCBsYXlvdXRfbWFwLCBsYXlvdXRfbWFwX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DX1RSSUFMX0ZSQU1FLCAxKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBhYy0+b2NbMV0ubTRhYy5jaGFuX2NvbmZpZyA9IDE7CisgICAgICAgIGlmIChhYy0+b2NbMV0ubTRhYy5zYnIpCisgICAgICAgICAgICBhYy0+b2NbMV0ubTRhYy5wcyA9IC0xOworICAgIH0KKyAgICAvKiBGb3IgaW5kZXhlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIG1hcCB0aGUgY2hhbm5lbHMgc29sZWx5IGJhc2VkCisgICAgICogb24gcG9zaXRpb24uICovCisgICAgc3dpdGNoIChhYy0+b2NbMV0ubTRhYy5jaGFuX2NvbmZpZykgeworICAgIGNhc2UgNzoKKyAgICAgICAgaWYgKGFjLT50YWdzX21hcHBlZCA9PSAzICYmIHR5cGUgPT0gVFlQRV9DUEUpIHsKKyAgICAgICAgICAgIGFjLT50YWdzX21hcHBlZCsrOworICAgICAgICAgICAgcmV0dXJuIGFjLT50YWdfY2hlX21hcFtUWVBFX0NQRV1bZWxlbV9pZF0gPSBhYy0+Y2hlW1RZUEVfQ1BFXVsyXTsKKyAgICAgICAgfQorICAgIGNhc2UgNjoKKyAgICAgICAgLyogU29tZSBzdHJlYW1zIGluY29ycmVjdGx5IGNvZGUgNS4xIGF1ZGlvIGFzCisgICAgICAgICAqIFNDRVswXSBDUEVbMF0gQ1BFWzFdIFNDRVsxXQorICAgICAgICAgKiBpbnN0ZWFkIG9mCisgICAgICAgICAqIFNDRVswXSBDUEVbMF0gQ1BFWzFdIExGRVswXS4KKyAgICAgICAgICogSWYgd2Ugc2VlbSB0byBoYXZlIGVuY291bnRlcmVkIHN1Y2ggYSBzdHJlYW0sIHRyYW5zZmVyCisgICAgICAgICAqIHRoZSBMRkVbMF0gZWxlbWVudCB0byB0aGUgU0NFWzFdJ3MgbWFwcGluZyAqLworICAgICAgICBpZiAoYWMtPnRhZ3NfbWFwcGVkID09IHRhZ3NfcGVyX2NvbmZpZ1thYy0+b2NbMV0ubTRhYy5jaGFuX2NvbmZpZ10gLSAxICYmICh0eXBlID09IFRZUEVfTEZFIHx8IHR5cGUgPT0gVFlQRV9TQ0UpKSB7CisgICAgICAgICAgICBpZiAoIWFjLT53YXJuZWRfcmVtYXBwaW5nX29uY2UgJiYgKHR5cGUgIT0gVFlQRV9MRkUgfHwgZWxlbV9pZCAhPSAwKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJUaGlzIHN0cmVhbSBzZWVtcyB0byBpbmNvcnJlY3RseSByZXBvcnQgaXRzIGxhc3QgY2hhbm5lbCBhcyAlc1slZF0sIG1hcHBpbmcgdG8gTEZFWzBdXG4iLAorICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gVFlQRV9TQ0UgPyAiU0NFIiA6ICJMRkUiLCBlbGVtX2lkKTsKKyAgICAgICAgICAgICAgICBhYy0+d2FybmVkX3JlbWFwcGluZ19vbmNlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhYy0+dGFnc19tYXBwZWQrKzsKKyAgICAgICAgICAgIHJldHVybiBhYy0+dGFnX2NoZV9tYXBbdHlwZV1bZWxlbV9pZF0gPSBhYy0+Y2hlW1RZUEVfTEZFXVswXTsKKyAgICAgICAgfQorICAgIGNhc2UgNToKKyAgICAgICAgaWYgKGFjLT50YWdzX21hcHBlZCA9PSAyICYmIHR5cGUgPT0gVFlQRV9DUEUpIHsKKyAgICAgICAgICAgIGFjLT50YWdzX21hcHBlZCsrOworICAgICAgICAgICAgcmV0dXJuIGFjLT50YWdfY2hlX21hcFtUWVBFX0NQRV1bZWxlbV9pZF0gPSBhYy0+Y2hlW1RZUEVfQ1BFXVsxXTsKKyAgICAgICAgfQorICAgIGNhc2UgNDoKKyAgICAgICAgLyogU29tZSBzdHJlYW1zIGluY29ycmVjdGx5IGNvZGUgNC4wIGF1ZGlvIGFzCisgICAgICAgICAqIFNDRVswXSBDUEVbMF0gTEZFWzBdCisgICAgICAgICAqIGluc3RlYWQgb2YKKyAgICAgICAgICogU0NFWzBdIENQRVswXSBTQ0VbMV0uCisgICAgICAgICAqIElmIHdlIHNlZW0gdG8gaGF2ZSBlbmNvdW50ZXJlZCBzdWNoIGEgc3RyZWFtLCB0cmFuc2ZlcgorICAgICAgICAgKiB0aGUgU0NFWzFdIGVsZW1lbnQgdG8gdGhlIExGRVswXSdzIG1hcHBpbmcgKi8KKyAgICAgICAgaWYgKGFjLT50YWdzX21hcHBlZCA9PSB0YWdzX3Blcl9jb25maWdbYWMtPm9jWzFdLm00YWMuY2hhbl9jb25maWddIC0gMSAmJiAodHlwZSA9PSBUWVBFX0xGRSB8fCB0eXBlID09IFRZUEVfU0NFKSkgeworICAgICAgICAgICAgaWYgKCFhYy0+d2FybmVkX3JlbWFwcGluZ19vbmNlICYmICh0eXBlICE9IFRZUEVfU0NFIHx8IGVsZW1faWQgIT0gMSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiVGhpcyBzdHJlYW0gc2VlbXMgdG8gaW5jb3JyZWN0bHkgcmVwb3J0IGl0cyBsYXN0IGNoYW5uZWwgYXMgJXNbJWRdLCBtYXBwaW5nIHRvIFNDRVsxXVxuIiwKKyAgICAgICAgICAgICAgICAgICB0eXBlID09IFRZUEVfU0NFID8gIlNDRSIgOiAiTEZFIiwgZWxlbV9pZCk7CisgICAgICAgICAgICAgICAgYWMtPndhcm5lZF9yZW1hcHBpbmdfb25jZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWMtPnRhZ3NfbWFwcGVkKys7CisgICAgICAgICAgICByZXR1cm4gYWMtPnRhZ19jaGVfbWFwW3R5cGVdW2VsZW1faWRdID0gYWMtPmNoZVtUWVBFX1NDRV1bMV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjLT50YWdzX21hcHBlZCA9PSAyICYmCisgICAgICAgICAgICBhYy0+b2NbMV0ubTRhYy5jaGFuX2NvbmZpZyA9PSA0ICYmCisgICAgICAgICAgICB0eXBlID09IFRZUEVfU0NFKSB7CisgICAgICAgICAgICBhYy0+dGFnc19tYXBwZWQrKzsKKyAgICAgICAgICAgIHJldHVybiBhYy0+dGFnX2NoZV9tYXBbVFlQRV9TQ0VdW2VsZW1faWRdID0gYWMtPmNoZVtUWVBFX1NDRV1bMV07CisgICAgICAgIH0KKyAgICBjYXNlIDM6CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoYWMtPnRhZ3NfbWFwcGVkID09IChhYy0+b2NbMV0ubTRhYy5jaGFuX2NvbmZpZyAhPSAyKSAmJgorICAgICAgICAgICAgdHlwZSA9PSBUWVBFX0NQRSkgeworICAgICAgICAgICAgYWMtPnRhZ3NfbWFwcGVkKys7CisgICAgICAgICAgICByZXR1cm4gYWMtPnRhZ19jaGVfbWFwW1RZUEVfQ1BFXVtlbGVtX2lkXSA9IGFjLT5jaGVbVFlQRV9DUEVdWzBdOworICAgICAgICB9IGVsc2UgaWYgKGFjLT5vY1sxXS5tNGFjLmNoYW5fY29uZmlnID09IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoIWFjLT50YWdzX21hcHBlZCAmJiB0eXBlID09IFRZUEVfU0NFKSB7CisgICAgICAgICAgICBhYy0+dGFnc19tYXBwZWQrKzsKKyAgICAgICAgICAgIHJldHVybiBhYy0+dGFnX2NoZV9tYXBbVFlQRV9TQ0VdW2VsZW1faWRdID0gYWMtPmNoZVtUWVBFX1NDRV1bMF07CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIGFuIGFycmF5IG9mIDQgYml0IGVsZW1lbnQgSURzLCBvcHRpb25hbGx5IGludGVybGVhdmVkIHdpdGggYQorICogc3RlcmVvL21vbm8gc3dpdGNoaW5nIGJpdC4KKyAqCisgKiBAcGFyYW0gdHlwZSBzcGVha2VyIHR5cGUvcG9zaXRpb24gZm9yIHRoZXNlIGNoYW5uZWxzCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9jaGFubmVsX21hcCh1aW50OF90IGxheW91dF9tYXBbXVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIENoYW5uZWxQb3NpdGlvbiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiLCBpbnQgbikKK3sKKyAgICB3aGlsZSAobi0tKSB7CisgICAgICAgIGVudW0gUmF3RGF0YUJsb2NrVHlwZSBzeW5fZWxlOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBBQUNfQ0hBTk5FTF9GUk9OVDoKKyAgICAgICAgY2FzZSBBQUNfQ0hBTk5FTF9CQUNLOgorICAgICAgICBjYXNlIEFBQ19DSEFOTkVMX1NJREU6CisgICAgICAgICAgICBzeW5fZWxlID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBQ19DSEFOTkVMX0NDOgorICAgICAgICAgICAgc2tpcF9iaXRzMShnYik7CisgICAgICAgICAgICBzeW5fZWxlID0gVFlQRV9DQ0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQUNfQ0hBTk5FTF9MRkU6CisgICAgICAgICAgICBzeW5fZWxlID0gVFlQRV9MRkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIEFBQ19DSEFOTkVMX09GRiBoYXMgbm8gY2hhbm5lbCBtYXAKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgICAgIH0KKyAgICAgICAgbGF5b3V0X21hcFswXVswXSA9IHN5bl9lbGU7CisgICAgICAgIGxheW91dF9tYXBbMF1bMV0gPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgIGxheW91dF9tYXBbMF1bMl0gPSB0eXBlOworICAgICAgICBsYXlvdXRfbWFwKys7CisgICAgfQorfQorCisvKioKKyAqIERlY29kZSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24gZWxlbWVudDsgcmVmZXJlbmNlOiB0YWJsZSA0LjIuCisgKgorICogQHJldHVybiAgUmV0dXJucyBlcnJvciBzdGF0dXMuIDAgLSBPSywgITAgLSBlcnJvcgorICovCitzdGF0aWMgaW50IGRlY29kZV9wY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBNUEVHNEF1ZGlvQ29uZmlnICptNGFjLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKCpsYXlvdXRfbWFwKVszXSwKKyAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgbnVtX2Zyb250LCBudW1fc2lkZSwgbnVtX2JhY2ssIG51bV9sZmUsIG51bV9hc3NvY19kYXRhLCBudW1fY2M7CisgICAgaW50IHNhbXBsaW5nX2luZGV4OworICAgIGludCBjb21tZW50X2xlbjsKKyAgICBpbnQgdGFnczsKKworICAgIHNraXBfYml0cyhnYiwgMik7ICAvLyBvYmplY3RfdHlwZQorCisgICAgc2FtcGxpbmdfaW5kZXggPSBnZXRfYml0cyhnYiwgNCk7CisgICAgaWYgKG00YWMtPnNhbXBsaW5nX2luZGV4ICE9IHNhbXBsaW5nX2luZGV4KQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlNhbXBsZSByYXRlIGluZGV4IGluIHByb2dyYW0gY29uZmlnIGVsZW1lbnQgZG9lcyBub3QgIgorICAgICAgICAgICAgICAgIm1hdGNoIHRoZSBzYW1wbGUgcmF0ZSBpbmRleCBjb25maWd1cmVkIGJ5IHRoZSBjb250YWluZXIuXG4iKTsKKworICAgIG51bV9mcm9udCAgICAgICA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICBudW1fc2lkZSAgICAgICAgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgbnVtX2JhY2sgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgIG51bV9sZmUgICAgICAgICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICBudW1fYXNzb2NfZGF0YSAgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgbnVtX2NjICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDQpOworCisgICAgaWYgKGdldF9iaXRzMShnYikpCisgICAgICAgIHNraXBfYml0cyhnYiwgNCk7IC8vIG1vbm9fbWl4ZG93bl90YWcKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgc2tpcF9iaXRzKGdiLCA0KTsgLy8gc3RlcmVvX21peGRvd25fdGFnCisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgc2tpcF9iaXRzKGdiLCAzKTsgLy8gbWl4ZG93bl9jb2VmZl9pbmRleCBhbmQgcHNldWRvX3N1cnJvdW5kCisKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA0ICogKG51bV9mcm9udCArIG51bV9zaWRlICsgbnVtX2JhY2sgKyBudW1fbGZlICsgbnVtX2Fzc29jX2RhdGEgKyBudW1fY2MpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlX3BjZTogIiBvdmVycmVhZF9lcnIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGRlY29kZV9jaGFubmVsX21hcChsYXlvdXRfbWFwICAgICAgICwgQUFDX0NIQU5ORUxfRlJPTlQsIGdiLCBudW1fZnJvbnQpOworICAgIHRhZ3MgPSBudW1fZnJvbnQ7CisgICAgZGVjb2RlX2NoYW5uZWxfbWFwKGxheW91dF9tYXAgKyB0YWdzLCBBQUNfQ0hBTk5FTF9TSURFLCAgZ2IsIG51bV9zaWRlKTsKKyAgICB0YWdzICs9IG51bV9zaWRlOworICAgIGRlY29kZV9jaGFubmVsX21hcChsYXlvdXRfbWFwICsgdGFncywgQUFDX0NIQU5ORUxfQkFDSywgIGdiLCBudW1fYmFjayk7CisgICAgdGFncyArPSBudW1fYmFjazsKKyAgICBkZWNvZGVfY2hhbm5lbF9tYXAobGF5b3V0X21hcCArIHRhZ3MsIEFBQ19DSEFOTkVMX0xGRSwgICBnYiwgbnVtX2xmZSk7CisgICAgdGFncyArPSBudW1fbGZlOworCisgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDQgKiBudW1fYXNzb2NfZGF0YSk7CisKKyAgICBkZWNvZGVfY2hhbm5lbF9tYXAobGF5b3V0X21hcCArIHRhZ3MsIEFBQ19DSEFOTkVMX0NDLCAgICBnYiwgbnVtX2NjKTsKKyAgICB0YWdzICs9IG51bV9jYzsKKworICAgIGFsaWduX2dldF9iaXRzKGdiKTsKKworICAgIC8qIGNvbW1lbnQgZmllbGQsIGZpcnN0IGJ5dGUgaXMgbGVuZ3RoICovCisgICAgY29tbWVudF9sZW4gPSBnZXRfYml0cyhnYiwgOCkgKiA4OworICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IGNvbW1lbnRfbGVuKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlX3BjZTogIiBvdmVycmVhZF9lcnIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGNvbW1lbnRfbGVuKTsKKyAgICByZXR1cm4gdGFnczsKK30KKworLyoqCisgKiBEZWNvZGUgR0EgIkdlbmVyYWwgQXVkaW8iIHNwZWNpZmljIGNvbmZpZ3VyYXRpb247IHJlZmVyZW5jZTogdGFibGUgNC4xLgorICoKKyAqIEBwYXJhbSAgIGFjICAgICAgICAgIHBvaW50ZXIgdG8gQUFDQ29udGV4dCwgbWF5IGJlIG51bGwKKyAqIEBwYXJhbSAgIGF2Y3R4ICAgICAgIHBvaW50ZXIgdG8gQVZDQ29kZWNDb250ZXh0LCB1c2VkIGZvciBsb2dnaW5nCisgKgorICogQHJldHVybiAgUmV0dXJucyBlcnJvciBzdGF0dXMuIDAgLSBPSywgITAgLSBlcnJvcgorICovCitzdGF0aWMgaW50IGRlY29kZV9nYV9zcGVjaWZpY19jb25maWcoQUFDQ29udGV4dCAqYWMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHNEF1ZGlvQ29uZmlnICptNGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsX2NvbmZpZykKK3sKKyAgICBpbnQgZXh0ZW5zaW9uX2ZsYWcsIHJldCwgZXBfY29uZmlnLCByZXNfZmxhZ3M7CisgICAgdWludDhfdCBsYXlvdXRfbWFwW01BWF9FTEVNX0lEKjRdWzNdOworICAgIGludCB0YWdzID0gMDsKKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7IC8vIGZyYW1lTGVuZ3RoRmxhZworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICI5NjAvMTIwIE1EQ1Qgd2luZG93Iik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgICAgICAgLy8gZGVwZW5kc09uQ29yZUNvZGVyCisgICAgICAgIHNraXBfYml0cyhnYiwgMTQpOyAgIC8vIGNvcmVDb2RlckRlbGF5CisgICAgZXh0ZW5zaW9uX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgaWYgKG00YWMtPm9iamVjdF90eXBlID09IEFPVF9BQUNfU0NBTEFCTEUgfHwKKyAgICAgICAgbTRhYy0+b2JqZWN0X3R5cGUgPT0gQU9UX0VSX0FBQ19TQ0FMQUJMRSkKKyAgICAgICAgc2tpcF9iaXRzKGdiLCAzKTsgICAgIC8vIGxheWVyTnIKKworICAgIGlmIChjaGFubmVsX2NvbmZpZyA9PSAwKSB7CisgICAgICAgIHNraXBfYml0cyhnYiwgNCk7ICAvLyBlbGVtZW50X2luc3RhbmNlX3RhZworICAgICAgICB0YWdzID0gZGVjb2RlX3BjZShhdmN0eCwgbTRhYywgbGF5b3V0X21hcCwgZ2IpOworICAgICAgICBpZiAodGFncyA8IDApCisgICAgICAgICAgICByZXR1cm4gdGFnczsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHJldCA9IHNldF9kZWZhdWx0X2NoYW5uZWxfY29uZmlnKGF2Y3R4LCBsYXlvdXRfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWdzLCBjaGFubmVsX2NvbmZpZykpKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoY291bnRfY2hhbm5lbHMobGF5b3V0X21hcCwgdGFncykgPiAxKSB7CisgICAgICAgIG00YWMtPnBzID0gMDsKKyAgICB9IGVsc2UgaWYgKG00YWMtPnNiciA9PSAxICYmIG00YWMtPnBzID09IC0xKQorICAgICAgICBtNGFjLT5wcyA9IDE7CisKKyAgICBpZiAoYWMgJiYgKHJldCA9IG91dHB1dF9jb25maWd1cmUoYWMsIGxheW91dF9tYXAsIHRhZ3MsIE9DX0dMT0JBTF9IRFIsIDApKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChleHRlbnNpb25fZmxhZykgeworICAgICAgICBzd2l0Y2ggKG00YWMtPm9iamVjdF90eXBlKSB7CisgICAgICAgIGNhc2UgQU9UX0VSX0JTQUM6CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDUpOyAgICAvLyBudW1PZlN1YkZyYW1lCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDExKTsgICAvLyBsYXllcl9sZW5ndGgKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEM6CisgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MVFA6CisgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMQUJMRToKKyAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgorICAgICAgICAgICAgcmVzX2ZsYWdzID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgaWYgKHJlc19mbGFncykgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQUMgZGF0YSByZXNpbGllbmNlIChmbGFncyAleCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc19mbGFncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2tpcF9iaXRzMShnYik7ICAgIC8vIGV4dGVuc2lvbkZsYWczIChUQkQgaW4gdmVyc2lvbiAzKQorICAgIH0KKyAgICBzd2l0Y2ggKG00YWMtPm9iamVjdF90eXBlKSB7CisgICAgY2FzZSBBT1RfRVJfQUFDX0xDOgorICAgIGNhc2UgQU9UX0VSX0FBQ19MVFA6CisgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUxBQkxFOgorICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICAgICAgZXBfY29uZmlnID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICBpZiAoZXBfY29uZmlnKSB7CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcENvbmZpZyAlZCIsIGVwX2NvbmZpZyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2VsZF9zcGVjaWZpY19jb25maWcoQUFDQ29udGV4dCAqYWMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHNEF1ZGlvQ29uZmlnICptNGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsX2NvbmZpZykKK3sKKyAgICBpbnQgcmV0LCBlcF9jb25maWcsIHJlc19mbGFnczsKKyAgICB1aW50OF90IGxheW91dF9tYXBbTUFYX0VMRU1fSUQqNF1bM107CisgICAgaW50IHRhZ3MgPSAwOworICAgIGNvbnN0IGludCBFTERFWFRfVEVSTSA9IDA7CisKKyAgICBtNGFjLT5wcyAgPSAwOworICAgIG00YWMtPnNiciA9IDA7CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvLyBmcmFtZUxlbmd0aEZsYWcKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiOTYwLzEyMCBNRENUIHdpbmRvdyIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgcmVzX2ZsYWdzID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgIGlmIChyZXNfZmxhZ3MpIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQUMgZGF0YSByZXNpbGllbmNlIChmbGFncyAleCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfZmxhZ3MpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsgLy8gbGRTYnJQcmVzZW50RmxhZworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvdyBEZWxheSBTQlIiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHdoaWxlIChnZXRfYml0cyhnYiwgNCkgIT0gRUxERVhUX1RFUk0pIHsKKyAgICAgICAgaW50IGxlbiA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgaWYgKGxlbiA9PSAxNSkKKyAgICAgICAgICAgIGxlbiArPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIGlmIChsZW4gPT0gMTUgKyAyNTUpCisgICAgICAgICAgICBsZW4gKz0gZ2V0X2JpdHMoZ2IsIDE2KTsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgbGVuICogOCArIDQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgb3ZlcnJlYWRfZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHNraXBfYml0c19sb25nKGdiLCA4ICogbGVuKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHNldF9kZWZhdWx0X2NoYW5uZWxfY29uZmlnKGF2Y3R4LCBsYXlvdXRfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhZ3MsIGNoYW5uZWxfY29uZmlnKSkpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoYWMgJiYgKHJldCA9IG91dHB1dF9jb25maWd1cmUoYWMsIGxheW91dF9tYXAsIHRhZ3MsIE9DX0dMT0JBTF9IRFIsIDApKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGVwX2NvbmZpZyA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICBpZiAoZXBfY29uZmlnKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXBDb25maWcgJWQiLCBlcF9jb25maWcpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSBhdWRpbyBzcGVjaWZpYyBjb25maWd1cmF0aW9uOyByZWZlcmVuY2U6IHRhYmxlIDEuMTMuCisgKgorICogQHBhcmFtICAgYWMgICAgICAgICAgcG9pbnRlciB0byBBQUNDb250ZXh0LCBtYXkgYmUgbnVsbAorICogQHBhcmFtICAgYXZjdHggICAgICAgcG9pbnRlciB0byBBVkNDb2RlY0NvbnRleHQsIHVzZWQgZm9yIGxvZ2dpbmcKKyAqIEBwYXJhbSAgIG00YWMgICAgICAgIHBvaW50ZXIgdG8gTVBFRzRBdWRpb0NvbmZpZywgdXNlZCBmb3IgcGFyc2luZworICogQHBhcmFtICAgZGF0YSAgICAgICAgcG9pbnRlciB0byBidWZmZXIgaG9sZGluZyBhbiBhdWRpbyBzcGVjaWZpYyBjb25maWcKKyAqIEBwYXJhbSAgIGJpdF9zaXplICAgIHNpemUgb2YgYXVkaW8gc3BlY2lmaWMgY29uZmlnIG9yIGRhdGEgaW4gYml0cworICogQHBhcmFtICAgc3luY19leHRlbnNpb24gbG9vayBmb3IgYW4gYXBwZW5kZWQgc3luYyBleHRlbnNpb24KKyAqCisgKiBAcmV0dXJuICBSZXR1cm5zIGVycm9yIHN0YXR1cyBvciBudW1iZXIgb2YgY29uc3VtZWQgYml0cy4gPDAgLSBlcnJvcgorICovCitzdGF0aWMgaW50IGRlY29kZV9hdWRpb19zcGVjaWZpY19jb25maWcoQUFDQ29udGV4dCAqYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUc0QXVkaW9Db25maWcgKm00YWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IGJpdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeW5jX2V4dGVuc2lvbikKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBpLCByZXQ7CisKKyAgICBhdl9kbG9nKGF2Y3R4LCAiYXVkaW8gc3BlY2lmaWMgY29uZmlnIHNpemUgJWRcbiIsIGJpdF9zaXplID4+IDMpOworICAgIGZvciAoaSA9IDA7IGkgPCBiaXRfc2l6ZSA+PiAzOyBpKyspCisgICAgICAgIGF2X2Rsb2coYXZjdHgsICIlMDJ4ICIsIGRhdGFbaV0pOworICAgIGF2X2Rsb2coYXZjdHgsICJcbiIpOworCisgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzKCZnYiwgZGF0YSwgYml0X3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKGkgPSBhdnByaXZfbXBlZzRhdWRpb19nZXRfY29uZmlnKG00YWMsIGRhdGEsIGJpdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19leHRlbnNpb24pKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChtNGFjLT5zYW1wbGluZ19pbmRleCA+IDEyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImludmFsaWQgc2FtcGxpbmcgcmF0ZSBpbmRleCAlZFxuIiwKKyAgICAgICAgICAgICAgIG00YWMtPnNhbXBsaW5nX2luZGV4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChtNGFjLT5vYmplY3RfdHlwZSA9PSBBT1RfRVJfQUFDX0xEICYmCisgICAgICAgIChtNGFjLT5zYW1wbGluZ19pbmRleCA8IDMgfHwgbTRhYy0+c2FtcGxpbmdfaW5kZXggPiA3KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJpbnZhbGlkIGxvdyBkZWxheSBzYW1wbGluZyByYXRlIGluZGV4ICVkXG4iLAorICAgICAgICAgICAgICAgbTRhYy0+c2FtcGxpbmdfaW5kZXgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBza2lwX2JpdHNfbG9uZygmZ2IsIGkpOworCisgICAgc3dpdGNoIChtNGFjLT5vYmplY3RfdHlwZSkgeworICAgIGNhc2UgQU9UX0FBQ19NQUlOOgorICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9BQUNfTFRQOgorICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2dhX3NwZWNpZmljX2NvbmZpZyhhYywgYXZjdHgsICZnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTRhYywgbTRhYy0+Y2hhbl9jb25maWcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9lbGRfc3BlY2lmaWNfY29uZmlnKGFjLCBhdmN0eCwgJmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG00YWMsIG00YWMtPmNoYW5fY29uZmlnKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdWRpbyBvYmplY3QgdHlwZSAlcyVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTRhYy0+c2JyID09IDEgPyAiU0JSKyIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTRhYy0+b2JqZWN0X3R5cGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGF2X2Rsb2coYXZjdHgsCisgICAgICAgICAgICAiQU9UICVkIGNoYW4gY29uZmlnICVkIHNhbXBsaW5nIGluZGV4ICVkICglZCkgU0JSICVkIFBTICVkXG4iLAorICAgICAgICAgICAgbTRhYy0+b2JqZWN0X3R5cGUsIG00YWMtPmNoYW5fY29uZmlnLCBtNGFjLT5zYW1wbGluZ19pbmRleCwKKyAgICAgICAgICAgIG00YWMtPnNhbXBsZV9yYXRlLCBtNGFjLT5zYnIsCisgICAgICAgICAgICBtNGFjLT5wcyk7CisKKyAgICByZXR1cm4gZ2V0X2JpdHNfY291bnQoJmdiKTsKK30KKworLyoqCisgKiBsaW5lYXIgY29uZ3J1ZW50aWFsIHBzZXVkb3JhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgKgorICogQHBhcmFtICAgcHJldmlvdXNfdmFsICAgIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGdlbmVyYXRvcgorICoKKyAqIEByZXR1cm4gIFJldHVybnMgYSAzMi1iaXQgcHNldWRvcmFuZG9tIGludGVnZXIKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGxjZ19yYW5kb20odW5zaWduZWQgcHJldmlvdXNfdmFsKQoreworICAgIHVuaW9uIHsgdW5zaWduZWQgdTsgaW50IHM7IH0gdiA9IHsgcHJldmlvdXNfdmFsICogMTY2NDUyNXUgKyAxMDEzOTA0MjIzIH07CisgICAgcmV0dXJuIHYuczsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCByZXNldF9wcmVkaWN0X3N0YXRlKFByZWRpY3RvclN0YXRlICpwcykKK3sKKyAgICBwcy0+cjAgICA9IDAuMGY7CisgICAgcHMtPnIxICAgPSAwLjBmOworICAgIHBzLT5jb3IwID0gMC4wZjsKKyAgICBwcy0+Y29yMSA9IDAuMGY7CisgICAgcHMtPnZhcjAgPSAxLjBmOworICAgIHBzLT52YXIxID0gMS4wZjsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfYWxsX3ByZWRpY3RvcnMoUHJlZGljdG9yU3RhdGUgKnBzKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUFJFRElDVE9SUzsgaSsrKQorICAgICAgICByZXNldF9wcmVkaWN0X3N0YXRlKCZwc1tpXSk7Cit9CisKK3N0YXRpYyBpbnQgc2FtcGxlX3JhdGVfaWR4IChpbnQgcmF0ZSkKK3sKKyAgICAgICAgIGlmICg5MjAxNyA8PSByYXRlKSByZXR1cm4gMDsKKyAgICBlbHNlIGlmICg3NTEzMiA8PSByYXRlKSByZXR1cm4gMTsKKyAgICBlbHNlIGlmICg1NTQyNiA8PSByYXRlKSByZXR1cm4gMjsKKyAgICBlbHNlIGlmICg0NjAwOSA8PSByYXRlKSByZXR1cm4gMzsKKyAgICBlbHNlIGlmICgzNzU2NiA8PSByYXRlKSByZXR1cm4gNDsKKyAgICBlbHNlIGlmICgyNzcxMyA8PSByYXRlKSByZXR1cm4gNTsKKyAgICBlbHNlIGlmICgyMzAwNCA8PSByYXRlKSByZXR1cm4gNjsKKyAgICBlbHNlIGlmICgxODc4MyA8PSByYXRlKSByZXR1cm4gNzsKKyAgICBlbHNlIGlmICgxMzg1NiA8PSByYXRlKSByZXR1cm4gODsKKyAgICBlbHNlIGlmICgxMTUwMiA8PSByYXRlKSByZXR1cm4gOTsKKyAgICBlbHNlIGlmICg5MzkxICA8PSByYXRlKSByZXR1cm4gMTA7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDExOworfQorCitzdGF0aWMgdm9pZCByZXNldF9wcmVkaWN0b3JfZ3JvdXAoUHJlZGljdG9yU3RhdGUgKnBzLCBpbnQgZ3JvdXBfbnVtKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IGdyb3VwX251bSAtIDE7IGkgPCBNQVhfUFJFRElDVE9SUzsgaSArPSAzMCkKKyAgICAgICAgcmVzZXRfcHJlZGljdF9zdGF0ZSgmcHNbaV0pOworfQorCisjZGVmaW5lIEFBQ19JTklUX1ZMQ19TVEFUSUMobnVtLCBzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSU5JVF9WTENfU1RBVElDKCZ2bGNfc3BlY3RyYWxbbnVtXSwgOCwgZmZfYWFjX3NwZWN0cmFsX3NpemVzW251bV0sICAgICBcCisgICAgICAgICBmZl9hYWNfc3BlY3RyYWxfYml0c1tudW1dLCBzaXplb2YoZmZfYWFjX3NwZWN0cmFsX2JpdHNbbnVtXVswXSksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmZfYWFjX3NwZWN0cmFsX2JpdHNbbnVtXVswXSksICBcCisgICAgICAgIGZmX2FhY19zcGVjdHJhbF9jb2Rlc1tudW1dLCBzaXplb2YoZmZfYWFjX3NwZWN0cmFsX2NvZGVzW251bV1bMF0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmZfYWFjX3NwZWN0cmFsX2NvZGVzW251bV1bMF0pLCBcCisgICAgICAgIHNpemUpOworCitzdGF0aWMgdm9pZCBhYWNkZWNfaW5pdChBQUNDb250ZXh0ICphYyk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBhYWNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFBQ0NvbnRleHQgKmFjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgYWMtPmF2Y3R4ID0gYXZjdHg7CisgICAgYWMtPm9jWzFdLm00YWMuc2FtcGxlX3JhdGUgPSBhdmN0eC0+c2FtcGxlX3JhdGU7CisKKyAgICBhYWNkZWNfaW5pdChhYyk7CisKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfRkxUUDsKKworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPiAwKSB7CisgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2F1ZGlvX3NwZWNpZmljX2NvbmZpZyhhYywgYWMtPmF2Y3R4LCAmYWMtPm9jWzFdLm00YWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplICogOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzciwgaTsKKyAgICAgICAgdWludDhfdCBsYXlvdXRfbWFwW01BWF9FTEVNX0lEKjRdWzNdOworICAgICAgICBpbnQgbGF5b3V0X21hcF90YWdzOworCisgICAgICAgIHNyID0gc2FtcGxlX3JhdGVfaWR4KGF2Y3R4LT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGFjLT5vY1sxXS5tNGFjLnNhbXBsaW5nX2luZGV4ID0gc3I7CisgICAgICAgIGFjLT5vY1sxXS5tNGFjLmNoYW5uZWxzID0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICBhYy0+b2NbMV0ubTRhYy5zYnIgPSAtMTsKKyAgICAgICAgYWMtPm9jWzFdLm00YWMucHMgPSAtMTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZmZfbXBlZzRhdWRpb19jaGFubmVscyk7IGkrKykKKyAgICAgICAgICAgIGlmIChmZl9tcGVnNGF1ZGlvX2NoYW5uZWxzW2ldID09IGF2Y3R4LT5jaGFubmVscykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGkgPT0gRkZfQVJSQVlfRUxFTVMoZmZfbXBlZzRhdWRpb19jaGFubmVscykpIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICB9CisgICAgICAgIGFjLT5vY1sxXS5tNGFjLmNoYW5fY29uZmlnID0gaTsKKworICAgICAgICBpZiAoYWMtPm9jWzFdLm00YWMuY2hhbl9jb25maWcpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBzZXRfZGVmYXVsdF9jaGFubmVsX2NvbmZpZyhhdmN0eCwgbGF5b3V0X21hcCwKKyAgICAgICAgICAgICAgICAmbGF5b3V0X21hcF90YWdzLCBhYy0+b2NbMV0ubTRhYy5jaGFuX2NvbmZpZyk7CisgICAgICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgICAgICBvdXRwdXRfY29uZmlndXJlKGFjLCBsYXlvdXRfbWFwLCBsYXlvdXRfbWFwX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ19HTE9CQUxfSERSLCAwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IE1BWF9DSEFOTkVMUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IGNoYW5uZWxzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgQUFDX0lOSVRfVkxDX1NUQVRJQyggMCwgMzA0KTsKKyAgICBBQUNfSU5JVF9WTENfU1RBVElDKCAxLCAyNzApOworICAgIEFBQ19JTklUX1ZMQ19TVEFUSUMoIDIsIDU1MCk7CisgICAgQUFDX0lOSVRfVkxDX1NUQVRJQyggMywgMzAwKTsKKyAgICBBQUNfSU5JVF9WTENfU1RBVElDKCA0LCAzMjgpOworICAgIEFBQ19JTklUX1ZMQ19TVEFUSUMoIDUsIDI5NCk7CisgICAgQUFDX0lOSVRfVkxDX1NUQVRJQyggNiwgMzA2KTsKKyAgICBBQUNfSU5JVF9WTENfU1RBVElDKCA3LCAyNjgpOworICAgIEFBQ19JTklUX1ZMQ19TVEFUSUMoIDgsIDUxMCk7CisgICAgQUFDX0lOSVRfVkxDX1NUQVRJQyggOSwgMzY2KTsKKyAgICBBQUNfSU5JVF9WTENfU1RBVElDKDEwLCA0NjIpOworCisgICAgZmZfYWFjX3Nicl9pbml0KCk7CisKKyAgICBmZl9mbXRfY29udmVydF9pbml0KCZhYy0+Zm10X2NvbnYsIGF2Y3R4KTsKKyAgICBhYy0+ZmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCk7CisgICAgaWYgKCFhYy0+ZmRzcCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGFjLT5yYW5kb21fc3RhdGUgPSAweDFmMmUzZDRjOworCisgICAgZmZfYWFjX3RhYmxlaW5pdCgpOworCisgICAgSU5JVF9WTENfU1RBVElDKCZ2bGNfc2NhbGVmYWN0b3JzLCA3LAorICAgICAgICAgICAgICAgICAgICBGRl9BUlJBWV9FTEVNUyhmZl9hYWNfc2NhbGVmYWN0b3JfY29kZSksCisgICAgICAgICAgICAgICAgICAgIGZmX2FhY19zY2FsZWZhY3Rvcl9iaXRzLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmZfYWFjX3NjYWxlZmFjdG9yX2JpdHNbMF0pLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmZfYWFjX3NjYWxlZmFjdG9yX2JpdHNbMF0pLAorICAgICAgICAgICAgICAgICAgICBmZl9hYWNfc2NhbGVmYWN0b3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZmX2FhY19zY2FsZWZhY3Rvcl9jb2RlWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZmX2FhY19zY2FsZWZhY3Rvcl9jb2RlWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgMzUyKTsKKworICAgIGZmX21kY3RfaW5pdCgmYWMtPm1kY3QsICAgICAgIDExLCAxLCAxLjAgLyAoMzI3NjguMCAqIDEwMjQuMCkpOworICAgIGZmX21kY3RfaW5pdCgmYWMtPm1kY3RfbGQsICAgIDEwLCAxLCAxLjAgLyAoMzI3NjguMCAqIDUxMi4wKSk7CisgICAgZmZfbWRjdF9pbml0KCZhYy0+bWRjdF9zbWFsbCwgIDgsIDEsIDEuMCAvICgzMjc2OC4wICogMTI4LjApKTsKKyAgICBmZl9tZGN0X2luaXQoJmFjLT5tZGN0X2x0cCwgICAxMSwgMCwgLTIuMCAqIDMyNzY4LjApOworICAgIC8vIHdpbmRvdyBpbml0aWFsaXphdGlvbgorICAgIGZmX2tiZF93aW5kb3dfaW5pdChmZl9hYWNfa2JkX2xvbmdfMTAyNCwgNC4wLCAxMDI0KTsKKyAgICBmZl9rYmRfd2luZG93X2luaXQoZmZfYWFjX2tiZF9zaG9ydF8xMjgsIDYuMCwgMTI4KTsKKyAgICBmZl9pbml0X2ZmX3NpbmVfd2luZG93cygxMCk7CisgICAgZmZfaW5pdF9mZl9zaW5lX3dpbmRvd3MoIDkpOworICAgIGZmX2luaXRfZmZfc2luZV93aW5kb3dzKCA3KTsKKworICAgIGNicnRfdGFibGVpbml0KCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBTa2lwIGRhdGFfc3RyZWFtX2VsZW1lbnQ7IHJlZmVyZW5jZTogdGFibGUgNC4xMC4KKyAqLworc3RhdGljIGludCBza2lwX2RhdGFfc3RyZWFtX2VsZW1lbnQoQUFDQ29udGV4dCAqYWMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBieXRlX2FsaWduID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpbnQgY291bnQgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgaWYgKGNvdW50ID09IDI1NSkKKyAgICAgICAgY291bnQgKz0gZ2V0X2JpdHMoZ2IsIDgpOworICAgIGlmIChieXRlX2FsaWduKQorICAgICAgICBhbGlnbl9nZXRfYml0cyhnYik7CisKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA4ICogY291bnQpIHsKKyAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic2tpcF9kYXRhX3N0cmVhbV9lbGVtZW50OiAib3ZlcnJlYWRfZXJyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHNraXBfYml0c19sb25nKGdiLCA4ICogY291bnQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9wcmVkaWN0aW9uKEFBQ0NvbnRleHQgKmFjLCBJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbSAqaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgc2ZiOworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGljcy0+cHJlZGljdG9yX3Jlc2V0X2dyb3VwID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgICAgICBpZiAoaWNzLT5wcmVkaWN0b3JfcmVzZXRfZ3JvdXAgPT0gMCB8fAorICAgICAgICAgICAgaWNzLT5wcmVkaWN0b3JfcmVzZXRfZ3JvdXAgPiAzMCkgeworICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFByZWRpY3RvciBSZXNldCBHcm91cC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBGRk1JTihpY3MtPm1heF9zZmIsIGZmX2FhY19wcmVkX3NmYl9tYXhbYWMtPm9jWzFdLm00YWMuc2FtcGxpbmdfaW5kZXhdKTsgc2ZiKyspIHsKKyAgICAgICAgaWNzLT5wcmVkaWN0aW9uX3VzZWRbc2ZiXSA9IGdldF9iaXRzMShnYik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSBMb25nIFRlcm0gUHJlZGljdGlvbiBkYXRhOyByZWZlcmVuY2U6IHRhYmxlIDQueHguCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9sdHAoTG9uZ1Rlcm1QcmVkaWN0aW9uICpsdHAsCisgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiLCB1aW50OF90IG1heF9zZmIpCit7CisgICAgaW50IHNmYjsKKworICAgIGx0cC0+bGFnICA9IGdldF9iaXRzKGdiLCAxMSk7CisgICAgbHRwLT5jb2VmID0gbHRwX2NvZWZbZ2V0X2JpdHMoZ2IsIDMpXTsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IEZGTUlOKG1heF9zZmIsIE1BWF9MVFBfTE9OR19TRkIpOyBzZmIrKykKKyAgICAgICAgbHRwLT51c2VkW3NmYl0gPSBnZXRfYml0czEoZ2IpOworfQorCisvKioKKyAqIERlY29kZSBJbmRpdmlkdWFsIENoYW5uZWwgU3RyZWFtIGluZm87IHJlZmVyZW5jZTogdGFibGUgNC42LgorICovCitzdGF0aWMgaW50IGRlY29kZV9pY3NfaW5mbyhBQUNDb250ZXh0ICphYywgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gKmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBhb3QgPSBhYy0+b2NbMV0ubTRhYy5vYmplY3RfdHlwZTsKKyAgICBpZiAoYW90ICE9IEFPVF9FUl9BQUNfRUxEKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZXNlcnZlZCBiaXQgc2V0LlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpY3MtPndpbmRvd19zZXF1ZW5jZVsxXSA9IGljcy0+d2luZG93X3NlcXVlbmNlWzBdOworICAgICAgICBpY3MtPndpbmRvd19zZXF1ZW5jZVswXSA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgaWYgKGFvdCA9PSBBT1RfRVJfQUFDX0xEICYmCisgICAgICAgICAgICBpY3MtPndpbmRvd19zZXF1ZW5jZVswXSAhPSBPTkxZX0xPTkdfU0VRVUVOQ0UpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQUFDIExEIGlzIG9ubHkgZGVmaW5lZCBmb3IgT05MWV9MT05HX1NFUVVFTkNFIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgIndpbmRvdyBzZXF1ZW5jZSAlZCBmb3VuZC5cbiIsIGljcy0+d2luZG93X3NlcXVlbmNlWzBdKTsKKyAgICAgICAgICAgIGljcy0+d2luZG93X3NlcXVlbmNlWzBdID0gT05MWV9MT05HX1NFUVVFTkNFOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWNzLT51c2Vfa2Jfd2luZG93WzFdICAgPSBpY3MtPnVzZV9rYl93aW5kb3dbMF07CisgICAgICAgIGljcy0+dXNlX2tiX3dpbmRvd1swXSAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB9CisgICAgaWNzLT5udW1fd2luZG93X2dyb3VwcyAgPSAxOworICAgIGljcy0+Z3JvdXBfbGVuWzBdICAgICAgID0gMTsKKyAgICBpZiAoaWNzLT53aW5kb3dfc2VxdWVuY2VbMF0gPT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGljcy0+bWF4X3NmYiA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgICAgICBpY3MtPmdyb3VwX2xlbltpY3MtPm51bV93aW5kb3dfZ3JvdXBzIC0gMV0rKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWNzLT5udW1fd2luZG93X2dyb3VwcysrOworICAgICAgICAgICAgICAgIGljcy0+Z3JvdXBfbGVuW2ljcy0+bnVtX3dpbmRvd19ncm91cHMgLSAxXSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWNzLT5udW1fd2luZG93cyAgICAgICA9IDg7CisgICAgICAgIGljcy0+c3diX29mZnNldCAgICAgICAgPSAgICBmZl9zd2Jfb2Zmc2V0XzEyOFthYy0+b2NbMV0ubTRhYy5zYW1wbGluZ19pbmRleF07CisgICAgICAgIGljcy0+bnVtX3N3YiAgICAgICAgICAgPSAgIGZmX2FhY19udW1fc3diXzEyOFthYy0+b2NbMV0ubTRhYy5zYW1wbGluZ19pbmRleF07CisgICAgICAgIGljcy0+dG5zX21heF9iYW5kcyAgICAgPSBmZl90bnNfbWF4X2JhbmRzXzEyOFthYy0+b2NbMV0ubTRhYy5zYW1wbGluZ19pbmRleF07CisgICAgICAgIGljcy0+cHJlZGljdG9yX3ByZXNlbnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGljcy0+bWF4X3NmYiAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgICAgICBpY3MtPm51bV93aW5kb3dzICAgICAgICAgICA9IDE7CisgICAgICAgIGlmIChhb3QgPT0gQU9UX0VSX0FBQ19MRCB8fCBhb3QgPT0gQU9UX0VSX0FBQ19FTEQpIHsKKyAgICAgICAgICAgIGljcy0+c3diX29mZnNldCAgICAgICAgPSAgICAgZmZfc3diX29mZnNldF81MTJbYWMtPm9jWzFdLm00YWMuc2FtcGxpbmdfaW5kZXhdOworICAgICAgICAgICAgaWNzLT5udW1fc3diICAgICAgICAgICA9ICAgIGZmX2FhY19udW1fc3diXzUxMlthYy0+b2NbMV0ubTRhYy5zYW1wbGluZ19pbmRleF07CisgICAgICAgICAgICBpY3MtPnRuc19tYXhfYmFuZHMgICAgID0gIGZmX3Ruc19tYXhfYmFuZHNfNTEyW2FjLT5vY1sxXS5tNGFjLnNhbXBsaW5nX2luZGV4XTsKKyAgICAgICAgICAgIGlmICghaWNzLT5udW1fc3diIHx8ICFpY3MtPnN3Yl9vZmZzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWNzLT5zd2Jfb2Zmc2V0ICAgICAgICA9ICAgIGZmX3N3Yl9vZmZzZXRfMTAyNFthYy0+b2NbMV0ubTRhYy5zYW1wbGluZ19pbmRleF07CisgICAgICAgICAgICBpY3MtPm51bV9zd2IgICAgICAgICAgID0gICBmZl9hYWNfbnVtX3N3Yl8xMDI0W2FjLT5vY1sxXS5tNGFjLnNhbXBsaW5nX2luZGV4XTsKKyAgICAgICAgICAgIGljcy0+dG5zX21heF9iYW5kcyAgICAgPSBmZl90bnNfbWF4X2JhbmRzXzEwMjRbYWMtPm9jWzFdLm00YWMuc2FtcGxpbmdfaW5kZXhdOworICAgICAgICB9CisgICAgICAgIGlmIChhb3QgIT0gQU9UX0VSX0FBQ19FTEQpIHsKKyAgICAgICAgICAgIGljcy0+cHJlZGljdG9yX3ByZXNlbnQgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGljcy0+cHJlZGljdG9yX3Jlc2V0X2dyb3VwID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaWNzLT5wcmVkaWN0b3JfcHJlc2VudCkgeworICAgICAgICAgICAgaWYgKGFvdCA9PSBBT1RfQUFDX01BSU4pIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlX3ByZWRpY3Rpb24oYWMsIGljcywgZ2IpKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFvdCA9PSBBT1RfQUFDX0xDIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGFvdCA9PSBBT1RfRVJfQUFDX0xDKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiUHJlZGljdGlvbiBpcyBub3QgYWxsb3dlZCBpbiBBQUMtTEMuXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhb3QgPT0gQU9UX0VSX0FBQ19MRCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTFRQIGluIEVSIEFBQyBMRCBub3QgeWV0IGltcGxlbWVudGVkLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChpY3MtPmx0cC5wcmVzZW50ID0gZ2V0X2JpdHMoZ2IsIDEpKSkKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2x0cCgmaWNzLT5sdHAsIGdiLCBpY3MtPm1heF9zZmIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGljcy0+bWF4X3NmYiA+IGljcy0+bnVtX3N3YikgeworICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmRzIGluIGdyb3VwICglZCkgIgorICAgICAgICAgICAgICAgImV4Y2VlZHMgbGltaXQgKCVkKS5cbiIsCisgICAgICAgICAgICAgICBpY3MtPm1heF9zZmIsIGljcy0+bnVtX3N3Yik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgaWNzLT5tYXhfc2ZiID0gMDsKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworLyoqCisgKiBEZWNvZGUgYmFuZCB0eXBlcyAoc2VjdGlvbl9kYXRhIHBheWxvYWQpOyByZWZlcmVuY2U6IHRhYmxlIDQuNDYuCisgKgorICogQHBhcmFtICAgYmFuZF90eXBlICAgICAgICAgICBhcnJheSBvZiB0aGUgdXNlZCBiYW5kIHR5cGUKKyAqIEBwYXJhbSAgIGJhbmRfdHlwZV9ydW5fZW5kICAgYXJyYXkgb2YgdGhlIGxhc3Qgc2NhbGVmYWN0b3IgYmFuZCBvZiBhIGJhbmQgdHlwZSBydW4KKyAqCisgKiBAcmV0dXJuICBSZXR1cm5zIGVycm9yIHN0YXR1cy4gMCAtIE9LLCAhMCAtIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2JhbmRfdHlwZXMoQUFDQ29udGV4dCAqYWMsIGVudW0gQmFuZFR5cGUgYmFuZF90eXBlWzEyMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYW5kX3R5cGVfcnVuX2VuZFsxMjBdLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gKmljcykKK3sKKyAgICBpbnQgZywgaWR4ID0gMDsKKyAgICBjb25zdCBpbnQgYml0cyA9IChpY3MtPndpbmRvd19zZXF1ZW5jZVswXSA9PSBFSUdIVF9TSE9SVF9TRVFVRU5DRSkgPyAzIDogNTsKKyAgICBmb3IgKGcgPSAwOyBnIDwgaWNzLT5udW1fd2luZG93X2dyb3VwczsgZysrKSB7CisgICAgICAgIGludCBrID0gMDsKKyAgICAgICAgd2hpbGUgKGsgPCBpY3MtPm1heF9zZmIpIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc2VjdF9lbmQgPSBrOworICAgICAgICAgICAgaW50IHNlY3RfbGVuX2luY3I7CisgICAgICAgICAgICBpbnQgc2VjdF9iYW5kX3R5cGUgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgICAgICBpZiAoc2VjdF9iYW5kX3R5cGUgPT0gMTIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGJhbmQgdHlwZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgc2VjdF9sZW5faW5jciA9IGdldF9iaXRzKGdiLCBiaXRzKTsKKyAgICAgICAgICAgICAgICBzZWN0X2VuZCArPSBzZWN0X2xlbl9pbmNyOworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlX2JhbmRfdHlwZXM6ICJvdmVycmVhZF9lcnIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNlY3RfZW5kID4gaWNzLT5tYXhfc2ZiKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgYmFuZHMgKCVkKSBleGNlZWRzIGxpbWl0ICglZCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdF9lbmQsIGljcy0+bWF4X3NmYik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHNlY3RfbGVuX2luY3IgPT0gKDEgPDwgYml0cykgLSAxKTsKKyAgICAgICAgICAgIGZvciAoOyBrIDwgc2VjdF9lbmQ7IGsrKykgeworICAgICAgICAgICAgICAgIGJhbmRfdHlwZSAgICAgICAgW2lkeF0gICA9IHNlY3RfYmFuZF90eXBlOworICAgICAgICAgICAgICAgIGJhbmRfdHlwZV9ydW5fZW5kW2lkeCsrXSA9IHNlY3RfZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSBzY2FsZWZhY3RvcnM7IHJlZmVyZW5jZTogdGFibGUgNC40Ny4KKyAqCisgKiBAcGFyYW0gICBnbG9iYWxfZ2FpbiAgICAgICAgIGZpcnN0IHNjYWxlZmFjdG9yIHZhbHVlIGFzIHNjYWxlZmFjdG9ycyBhcmUgZGlmZmVyZW50aWFsbHkgY29kZWQKKyAqIEBwYXJhbSAgIGJhbmRfdHlwZSAgICAgICAgICAgYXJyYXkgb2YgdGhlIHVzZWQgYmFuZCB0eXBlCisgKiBAcGFyYW0gICBiYW5kX3R5cGVfcnVuX2VuZCAgIGFycmF5IG9mIHRoZSBsYXN0IHNjYWxlZmFjdG9yIGJhbmQgb2YgYSBiYW5kIHR5cGUgcnVuCisgKiBAcGFyYW0gICBzZiAgICAgICAgICAgICAgICAgIGFycmF5IG9mIHNjYWxlZmFjdG9ycyBvciBpbnRlbnNpdHkgc3RlcmVvIHBvc2l0aW9ucworICoKKyAqIEByZXR1cm4gIFJldHVybnMgZXJyb3Igc3RhdHVzLiAwIC0gT0ssICEwIC0gZXJyb3IKKyAqLworc3RhdGljIGludCBkZWNvZGVfc2NhbGVmYWN0b3JzKEFBQ0NvbnRleHQgKmFjLCBmbG9hdCBzZlsxMjBdLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZ2xvYmFsX2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gKmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEJhbmRUeXBlIGJhbmRfdHlwZVsxMjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYW5kX3R5cGVfcnVuX2VuZFsxMjBdKQoreworICAgIGludCBnLCBpLCBpZHggPSAwOworICAgIGludCBvZmZzZXRbM10gPSB7IGdsb2JhbF9nYWluLCBnbG9iYWxfZ2FpbiAtIDkwLCAwIH07CisgICAgaW50IGNsaXBwZWRfb2Zmc2V0OworICAgIGludCBub2lzZV9mbGFnID0gMTsKKyAgICBmb3IgKGcgPSAwOyBnIDwgaWNzLT5udW1fd2luZG93X2dyb3VwczsgZysrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpY3MtPm1heF9zZmI7KSB7CisgICAgICAgICAgICBpbnQgcnVuX2VuZCA9IGJhbmRfdHlwZV9ydW5fZW5kW2lkeF07CisgICAgICAgICAgICBpZiAoYmFuZF90eXBlW2lkeF0gPT0gWkVST19CVCkgeworICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgcnVuX2VuZDsgaSsrLCBpZHgrKykKKyAgICAgICAgICAgICAgICAgICAgc2ZbaWR4XSA9IDAuMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJhbmRfdHlwZVtpZHhdID09IElOVEVOU0lUWV9CVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKGJhbmRfdHlwZVtpZHhdID09IElOVEVOU0lUWV9CVDIpKSB7CisgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBydW5fZW5kOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldFsyXSArPSBnZXRfdmxjMihnYiwgdmxjX3NjYWxlZmFjdG9ycy50YWJsZSwgNywgMykgLSA2MDsKKyAgICAgICAgICAgICAgICAgICAgY2xpcHBlZF9vZmZzZXQgPSBhdl9jbGlwKG9mZnNldFsyXSwgLTE1NSwgMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldFsyXSAhPSBjbGlwcGVkX29mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGFjLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWYgeW91IGhlYXJkIGFuIGF1ZGlibGUgYXJ0aWZhY3QsIHRoZXJlIG1heSBiZSBhIGJ1ZyBpbiB0aGUgZGVjb2Rlci4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGlwcGVkIGludGVuc2l0eSBzdGVyZW8gcG9zaXRpb24gKCVkIC0+ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WzJdLCBjbGlwcGVkX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2ZbaWR4XSA9IGZmX2FhY19wb3cyc2ZfdGFiWy1jbGlwcGVkX29mZnNldCArIFBPV19TRjJfWkVST107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChiYW5kX3R5cGVbaWR4XSA9PSBOT0lTRV9CVCkgeworICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgcnVuX2VuZDsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAobm9pc2VfZmxhZy0tID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFsxXSArPSBnZXRfYml0cyhnYiwgOSkgLSAyNTY7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFsxXSArPSBnZXRfdmxjMihnYiwgdmxjX3NjYWxlZmFjdG9ycy50YWJsZSwgNywgMykgLSA2MDsKKyAgICAgICAgICAgICAgICAgICAgY2xpcHBlZF9vZmZzZXQgPSBhdl9jbGlwKG9mZnNldFsxXSwgLTEwMCwgMTU1KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldFsxXSAhPSBjbGlwcGVkX29mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGFjLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWYgeW91IGhlYXJkIGFuIGF1ZGlibGUgYXJ0aWZhY3QsIHRoZXJlIG1heSBiZSBhIGJ1ZyBpbiB0aGUgZGVjb2Rlci4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGlwcGVkIG5vaXNlIGdhaW4gKCVkIC0+ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WzFdLCBjbGlwcGVkX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2ZbaWR4XSA9IC1mZl9hYWNfcG93MnNmX3RhYltjbGlwcGVkX29mZnNldCArIFBPV19TRjJfWkVST107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IHJ1bl9lbmQ7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WzBdICs9IGdldF92bGMyKGdiLCB2bGNfc2NhbGVmYWN0b3JzLnRhYmxlLCA3LCAzKSAtIDYwOworICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0WzBdID4gMjU1VSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTY2FsZWZhY3RvciAoJWQpIG91dCBvZiByYW5nZS5cbiIsIG9mZnNldFswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZltpZHhdID0gLWZmX2FhY19wb3cyc2ZfdGFiW29mZnNldFswXSAtIDEwMCArIFBPV19TRjJfWkVST107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSBwdWxzZSBkYXRhOyByZWZlcmVuY2U6IHRhYmxlIDQuNy4KKyAqLworc3RhdGljIGludCBkZWNvZGVfcHVsc2VzKFB1bHNlICpwdWxzZSwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnN3Yl9vZmZzZXQsIGludCBudW1fc3diKQoreworICAgIGludCBpLCBwdWxzZV9zd2I7CisgICAgcHVsc2UtPm51bV9wdWxzZSA9IGdldF9iaXRzKGdiLCAyKSArIDE7CisgICAgcHVsc2Vfc3diICAgICAgICA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICBpZiAocHVsc2Vfc3diID49IG51bV9zd2IpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBwdWxzZS0+cG9zWzBdICAgID0gc3diX29mZnNldFtwdWxzZV9zd2JdOworICAgIHB1bHNlLT5wb3NbMF0gICArPSBnZXRfYml0cyhnYiwgNSk7CisgICAgaWYgKHB1bHNlLT5wb3NbMF0gPj0gc3diX29mZnNldFtudW1fc3diXSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHB1bHNlLT5hbXBbMF0gICAgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgZm9yIChpID0gMTsgaSA8IHB1bHNlLT5udW1fcHVsc2U7IGkrKykgeworICAgICAgICBwdWxzZS0+cG9zW2ldID0gZ2V0X2JpdHMoZ2IsIDUpICsgcHVsc2UtPnBvc1tpIC0gMV07CisgICAgICAgIGlmIChwdWxzZS0+cG9zW2ldID49IHN3Yl9vZmZzZXRbbnVtX3N3Yl0pCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHB1bHNlLT5hbXBbaV0gPSBnZXRfYml0cyhnYiwgNCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSBUZW1wb3JhbCBOb2lzZSBTaGFwaW5nIGRhdGE7IHJlZmVyZW5jZTogdGFibGUgNC40OC4KKyAqCisgKiBAcmV0dXJuICBSZXR1cm5zIGVycm9yIHN0YXR1cy4gMCAtIE9LLCAhMCAtIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3RucyhBQUNDb250ZXh0ICphYywgVGVtcG9yYWxOb2lzZVNoYXBpbmcgKnRucywKKyAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYiwgY29uc3QgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gKmljcykKK3sKKyAgICBpbnQgdywgZmlsdCwgaSwgY29lZl9sZW4sIGNvZWZfcmVzLCBjb2VmX2NvbXByZXNzOworICAgIGNvbnN0IGludCBpczggPSBpY3MtPndpbmRvd19zZXF1ZW5jZVswXSA9PSBFSUdIVF9TSE9SVF9TRVFVRU5DRTsKKyAgICBjb25zdCBpbnQgdG5zX21heF9vcmRlciA9IGlzOCA/IDcgOiBhYy0+b2NbMV0ubTRhYy5vYmplY3RfdHlwZSA9PSBBT1RfQUFDX01BSU4gPyAyMCA6IDEyOworICAgIGZvciAodyA9IDA7IHcgPCBpY3MtPm51bV93aW5kb3dzOyB3KyspIHsKKyAgICAgICAgaWYgKCh0bnMtPm5fZmlsdFt3XSA9IGdldF9iaXRzKGdiLCAyIC0gaXM4KSkpIHsKKyAgICAgICAgICAgIGNvZWZfcmVzID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICAgICAgZm9yIChmaWx0ID0gMDsgZmlsdCA8IHRucy0+bl9maWx0W3ddOyBmaWx0KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgdG1wMl9pZHg7CisgICAgICAgICAgICAgICAgdG5zLT5sZW5ndGhbd11bZmlsdF0gPSBnZXRfYml0cyhnYiwgNiAtIDIgKiBpczgpOworCisgICAgICAgICAgICAgICAgaWYgKCh0bnMtPm9yZGVyW3ddW2ZpbHRdID0gZ2V0X2JpdHMoZ2IsIDUgLSAyICogaXM4KSkgPiB0bnNfbWF4X29yZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUTlMgZmlsdGVyIG9yZGVyICVkIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRucy0+b3JkZXJbd11bZmlsdF0sIHRuc19tYXhfb3JkZXIpOworICAgICAgICAgICAgICAgICAgICB0bnMtPm9yZGVyW3ddW2ZpbHRdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0bnMtPm9yZGVyW3ddW2ZpbHRdKSB7CisgICAgICAgICAgICAgICAgICAgIHRucy0+ZGlyZWN0aW9uW3ddW2ZpbHRdID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgICAgICAgICAgY29lZl9jb21wcmVzcyA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgICAgIGNvZWZfbGVuID0gY29lZl9yZXMgKyAzIC0gY29lZl9jb21wcmVzczsKKyAgICAgICAgICAgICAgICAgICAgdG1wMl9pZHggPSAyICogY29lZl9jb21wcmVzcyArIGNvZWZfcmVzOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0bnMtPm9yZGVyW3ddW2ZpbHRdOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB0bnMtPmNvZWZbd11bZmlsdF1baV0gPSB0bnNfdG1wMl9tYXBbdG1wMl9pZHhdW2dldF9iaXRzKGdiLCBjb2VmX2xlbildOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgTWlkL1NpZGUgZGF0YTsgcmVmZXJlbmNlOiB0YWJsZSA0LjU0LgorICoKKyAqIEBwYXJhbSAgIG1zX3ByZXNlbnQgIEluZGljYXRlcyBtaWQvc2lkZSBzdGVyZW8gcHJlc2VuY2UuIFswXSBtYXNrIGlzIGFsbCAwczsKKyAqICAgICAgICAgICAgICAgICAgICAgIFsxXSBtYXNrIGlzIGRlY29kZWQgZnJvbSBiaXRzdHJlYW07IFsyXSBtYXNrIGlzIGFsbCAxczsKKyAqICAgICAgICAgICAgICAgICAgICAgIFszXSByZXNlcnZlZCBmb3Igc2NhbGFibGUgQUFDCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9taWRfc2lkZV9zdGVyZW8oQ2hhbm5lbEVsZW1lbnQgKmNwZSwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtc19wcmVzZW50KQoreworICAgIGludCBpZHg7CisgICAgaW50IG1heF9pZHggPSBjcGUtPmNoWzBdLmljcy5udW1fd2luZG93X2dyb3VwcyAqIGNwZS0+Y2hbMF0uaWNzLm1heF9zZmI7CisgICAgaWYgKG1zX3ByZXNlbnQgPT0gMSkgeworICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heF9pZHg7IGlkeCsrKQorICAgICAgICAgICAgY3BlLT5tc19tYXNrW2lkeF0gPSBnZXRfYml0czEoZ2IpOworICAgIH0gZWxzZSBpZiAobXNfcHJlc2VudCA9PSAyKSB7CisgICAgICAgIG1lbXNldChjcGUtPm1zX21hc2ssIDEsIG1heF9pZHggKiBzaXplb2YoY3BlLT5tc19tYXNrWzBdKSk7CisgICAgfQorfQorCisjaWZuZGVmIFZNVUwyCitzdGF0aWMgaW5saW5lIGZsb2F0ICpWTVVMMihmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqdiwgdW5zaWduZWQgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlKQoreworICAgIGZsb2F0IHMgPSAqc2NhbGU7CisgICAgKmRzdCsrID0gdltpZHggICAgJiAxNV0gKiBzOworICAgICpkc3QrKyA9IHZbaWR4Pj40ICYgMTVdICogczsKKyAgICByZXR1cm4gZHN0OworfQorI2VuZGlmCisKKyNpZm5kZWYgVk1VTDQKK3N0YXRpYyBpbmxpbmUgZmxvYXQgKlZNVUw0KGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICp2LCB1bnNpZ25lZCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGUpCit7CisgICAgZmxvYXQgcyA9ICpzY2FsZTsKKyAgICAqZHN0KysgPSB2W2lkeCAgICAmIDNdICogczsKKyAgICAqZHN0KysgPSB2W2lkeD4+MiAmIDNdICogczsKKyAgICAqZHN0KysgPSB2W2lkeD4+NCAmIDNdICogczsKKyAgICAqZHN0KysgPSB2W2lkeD4+NiAmIDNdICogczsKKyAgICByZXR1cm4gZHN0OworfQorI2VuZGlmCisKKyNpZm5kZWYgVk1VTDJTCitzdGF0aWMgaW5saW5lIGZsb2F0ICpWTVVMMlMoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnYsIHVuc2lnbmVkIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaWduLCBjb25zdCBmbG9hdCAqc2NhbGUpCit7CisgICAgdW5pb24gYXZfaW50ZmxvYXQzMiBzMCwgczE7CisKKyAgICBzMC5mID0gczEuZiA9ICpzY2FsZTsKKyAgICBzMC5pIF49IHNpZ24gPj4gMSA8PCAzMTsKKyAgICBzMS5pIF49IHNpZ24gICAgICA8PCAzMTsKKworICAgICpkc3QrKyA9IHZbaWR4ICAgICYgMTVdICogczAuZjsKKyAgICAqZHN0KysgPSB2W2lkeD4+NCAmIDE1XSAqIHMxLmY7CisKKyAgICByZXR1cm4gZHN0OworfQorI2VuZGlmCisKKyNpZm5kZWYgVk1VTDRTCitzdGF0aWMgaW5saW5lIGZsb2F0ICpWTVVMNFMoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnYsIHVuc2lnbmVkIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaWduLCBjb25zdCBmbG9hdCAqc2NhbGUpCit7CisgICAgdW5zaWduZWQgbnogPSBpZHggPj4gMTI7CisgICAgdW5pb24gYXZfaW50ZmxvYXQzMiBzID0geyAuZiA9ICpzY2FsZSB9OworICAgIHVuaW9uIGF2X2ludGZsb2F0MzIgdDsKKworICAgIHQuaSA9IHMuaSBeIChzaWduICYgMVU8PDMxKTsKKyAgICAqZHN0KysgPSB2W2lkeCAgICAmIDNdICogdC5mOworCisgICAgc2lnbiA8PD0gbnogJiAxOyBueiA+Pj0gMTsKKyAgICB0LmkgPSBzLmkgXiAoc2lnbiAmIDFVPDwzMSk7CisgICAgKmRzdCsrID0gdltpZHg+PjIgJiAzXSAqIHQuZjsKKworICAgIHNpZ24gPDw9IG56ICYgMTsgbnogPj49IDE7CisgICAgdC5pID0gcy5pIF4gKHNpZ24gJiAxVTw8MzEpOworICAgICpkc3QrKyA9IHZbaWR4Pj40ICYgM10gKiB0LmY7CisKKyAgICBzaWduIDw8PSBueiAmIDE7CisgICAgdC5pID0gcy5pIF4gKHNpZ24gJiAxVTw8MzEpOworICAgICpkc3QrKyA9IHZbaWR4Pj42ICYgM10gKiB0LmY7CisKKyAgICByZXR1cm4gZHN0OworfQorI2VuZGlmCisKKy8qKgorICogRGVjb2RlIHNwZWN0cmFsIGRhdGE7IHJlZmVyZW5jZTogdGFibGUgNC41MC4KKyAqIERlcXVhbnRpemUgYW5kIHNjYWxlIHNwZWN0cmFsIGRhdGE7IHJlZmVyZW5jZTogNC42LjMuMy4KKyAqCisgKiBAcGFyYW0gICBjb2VmICAgICAgICAgICAgYXJyYXkgb2YgZGVxdWFudGl6ZWQsIHNjYWxlZCBzcGVjdHJhbCBkYXRhCisgKiBAcGFyYW0gICBzZiAgICAgICAgICAgICAgYXJyYXkgb2Ygc2NhbGVmYWN0b3JzIG9yIGludGVuc2l0eSBzdGVyZW8gcG9zaXRpb25zCisgKiBAcGFyYW0gICBwdWxzZV9wcmVzZW50ICAgc2V0IGlmIHB1bHNlcyBhcmUgcHJlc2VudAorICogQHBhcmFtICAgcHVsc2UgICAgICAgICAgIHBvaW50ZXIgdG8gcHVsc2UgZGF0YSBzdHJ1Y3QKKyAqIEBwYXJhbSAgIGJhbmRfdHlwZSAgICAgICBhcnJheSBvZiB0aGUgdXNlZCBiYW5kIHR5cGUKKyAqCisgKiBAcmV0dXJuICBSZXR1cm5zIGVycm9yIHN0YXR1cy4gMCAtIE9LLCAhMCAtIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3NwZWN0cnVtX2FuZF9kZXF1YW50KEFBQ0NvbnRleHQgKmFjLCBmbG9hdCBjb2VmWzEwMjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsIGNvbnN0IGZsb2F0IHNmWzEyMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHVsc2VfcHJlc2VudCwgY29uc3QgUHVsc2UgKnB1bHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gKmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQmFuZFR5cGUgYmFuZF90eXBlWzEyMF0pCit7CisgICAgaW50IGksIGssIGcsIGlkeCA9IDA7CisgICAgY29uc3QgaW50IGMgPSAxMDI0IC8gaWNzLT5udW1fd2luZG93czsKKyAgICBjb25zdCB1aW50MTZfdCAqb2Zmc2V0cyA9IGljcy0+c3diX29mZnNldDsKKyAgICBmbG9hdCAqY29lZl9iYXNlID0gY29lZjsKKworICAgIGZvciAoZyA9IDA7IGcgPCBpY3MtPm51bV93aW5kb3dzOyBnKyspCisgICAgICAgIG1lbXNldChjb2VmICsgZyAqIDEyOCArIG9mZnNldHNbaWNzLT5tYXhfc2ZiXSwgMCwKKyAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCkgKiAoYyAtIG9mZnNldHNbaWNzLT5tYXhfc2ZiXSkpOworCisgICAgZm9yIChnID0gMDsgZyA8IGljcy0+bnVtX3dpbmRvd19ncm91cHM7IGcrKykgeworICAgICAgICB1bnNpZ25lZCBnX2xlbiA9IGljcy0+Z3JvdXBfbGVuW2ddOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpY3MtPm1heF9zZmI7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNidF9tMSA9IGJhbmRfdHlwZVtpZHhdIC0gMTsKKyAgICAgICAgICAgIGZsb2F0ICpjZm8gPSBjb2VmICsgb2Zmc2V0c1tpXTsKKyAgICAgICAgICAgIGludCBvZmZfbGVuID0gb2Zmc2V0c1tpICsgMV0gLSBvZmZzZXRzW2ldOworICAgICAgICAgICAgaW50IGdyb3VwOworCisgICAgICAgICAgICBpZiAoY2J0X20xID49IElOVEVOU0lUWV9CVDIgLSAxKSB7CisgICAgICAgICAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgZ19sZW47IGdyb3VwKyssIGNmbys9MTI4KSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjZm8sIDAsIG9mZl9sZW4gKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNidF9tMSA9PSBOT0lTRV9CVCAtIDEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBnX2xlbjsgZ3JvdXArKywgY2ZvKz0xMjgpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGU7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJhbmRfZW5lcmd5OworCisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBvZmZfbGVuOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjLT5yYW5kb21fc3RhdGUgID0gbGNnX3JhbmRvbShhYy0+cmFuZG9tX3N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNmb1trXSA9IGFjLT5yYW5kb21fc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBiYW5kX2VuZXJneSA9IGFjLT5mZHNwLT5zY2FsYXJwcm9kdWN0X2Zsb2F0KGNmbywgY2ZvLCBvZmZfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBzZltpZHhdIC8gc3FydGYoYmFuZF9lbmVyZ3kpOworICAgICAgICAgICAgICAgICAgICBhYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyKGNmbywgY2ZvLCBzY2FsZSwgb2ZmX2xlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqdnEgPSBmZl9hYWNfY29kZWJvb2tfdmVjdG9yX3ZhbHNbY2J0X20xXTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqY2JfdmVjdG9yX2lkeCA9IGZmX2FhY19jb2RlYm9va192ZWN0b3JfaWR4W2NidF9tMV07CisgICAgICAgICAgICAgICAgVkxDX1RZUEUgKCp2bGNfdGFiKVsyXSA9IHZsY19zcGVjdHJhbFtjYnRfbTFdLnRhYmxlOworICAgICAgICAgICAgICAgIE9QRU5fUkVBREVSKHJlLCBnYik7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNidF9tMSA+PiAxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBnX2xlbjsgZ3JvdXArKywgY2ZvKz0xMjgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjZiA9IGNmbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBvZmZfbGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2JfaWR4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1ZMQyhjb2RlLCByZSwgZ2IsIHZsY190YWIsIDgsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX2lkeCA9IGNiX3ZlY3Rvcl9pZHhbY29kZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgPSBWTVVMNChjZiwgdnEsIGNiX2lkeCwgc2YgKyBpZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuIC09IDQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBnX2xlbjsgZ3JvdXArKywgY2ZvKz0xMjgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjZiA9IGNmbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBvZmZfbGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbm56OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNiX2lkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiaXRzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1ZMQyhjb2RlLCByZSwgZ2IsIHZsY190YWIsIDgsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX2lkeCA9IGNiX3ZlY3Rvcl9pZHhbY29kZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm56ID0gY2JfaWR4ID4+IDggJiAxNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzID0gbm56ID8gR0VUX0NBQ0hFKHJlLCBnYikgOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgbm56KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZiA9IFZNVUw0UyhjZiwgdnEsIGNiX2lkeCwgYml0cywgc2YgKyBpZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuIC09IDQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBnX2xlbjsgZ3JvdXArKywgY2ZvKz0xMjgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjZiA9IGNmbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBvZmZfbGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2JfaWR4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1ZMQyhjb2RlLCByZSwgZ2IsIHZsY190YWIsIDgsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX2lkeCA9IGNiX3ZlY3Rvcl9pZHhbY29kZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgPSBWTVVMMihjZiwgdnEsIGNiX2lkeCwgc2YgKyBpZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuIC09IDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgZ19sZW47IGdyb3VwKyssIGNmbys9MTI4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqY2YgPSBjZm87CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gb2ZmX2xlbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5uejsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjYl9pZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2lnbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9WTEMoY29kZSwgcmUsIGdiLCB2bGNfdGFiLCA4LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9pZHggPSBjYl92ZWN0b3JfaWR4W2NvZGVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ueiA9IGNiX2lkeCA+PiA4ICYgMTU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IG5ueiA/IFNIT1dfVUJJVFMocmUsIGdiLCBubnopIDw8IChjYl9pZHggPj4gMTIpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIG5ueik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YgPSBWTVVMMlMoY2YsIHZxLCBjYl9pZHgsIHNpZ24sIHNmICsgaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiAtPSAyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IGdfbGVuOyBncm91cCsrLCBjZm8rPTEyOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNmID0gY2ZvOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmljZiA9ICh1aW50MzJfdCAqKSBjZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBvZmZfbGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnp0LCBubno7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2JfaWR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsIGdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVkxDKGNvZGUsIHJlLCBnYiwgdmxjX3RhYiwgOCwgMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmljZisrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmljZisrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JfaWR4ID0gY2JfdmVjdG9yX2lkeFtjb2RlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBubnogPSBjYl9pZHggPj4gMTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnp0ID0gY2JfaWR4ID4+IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyA9IFNIT1dfVUJJVFMocmUsIGdiLCBubnopIDw8ICgzMi1ubnopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgbm56KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG56dCAmIDE8PGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB0b3RhbCBsZW5ndGggb2YgZXNjYXBlX3NlcXVlbmNlIG11c3QgYmUgPCAyMiBiaXRzIGFjY29yZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHNwZWNpZmljYXRpb24gKGkuZS4gbWF4IGlzIDExMTExMTExMHh4eHh4eHh4eHh4eCkuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsIGdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBHRVRfQ0FDSEUocmUsIGdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzMSAtIGF2X2xvZzIofmIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiA+IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBpbiBzcGVjdHJhbCBkYXRhLCBFU0Mgb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsIGdiLCBiICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gKDEgPDwgYikgKyBTSE9XX1VCSVRTKHJlLCBnYiwgYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIGIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmljZisrID0gY2JydF90YWJbbl0gfCAoYml0cyAmIDFVPDwzMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzIDw8PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdiA9ICgoY29uc3QgdWludDMyX3QqKXZxKVtjYl9pZHggJiAxNV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaWNmKysgPSAoYml0cyAmIDFVPDwzMSkgfCB2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyA8PD0gISF2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX2lkeCA+Pj0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gLT0gMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjLT5mZHNwLT52ZWN0b3JfZm11bF9zY2FsYXIoY2ZvLCBjZm8sIHNmW2lkeF0sIG9mZl9sZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29lZiArPSBnX2xlbiA8PCA3OworICAgIH0KKworICAgIGlmIChwdWxzZV9wcmVzZW50KSB7CisgICAgICAgIGlkeCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwdWxzZS0+bnVtX3B1bHNlOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGNvID0gY29lZl9iYXNlWyBwdWxzZS0+cG9zW2ldIF07CisgICAgICAgICAgICB3aGlsZSAob2Zmc2V0c1tpZHggKyAxXSA8PSBwdWxzZS0+cG9zW2ldKQorICAgICAgICAgICAgICAgIGlkeCsrOworICAgICAgICAgICAgaWYgKGJhbmRfdHlwZVtpZHhdICE9IE5PSVNFX0JUICYmIHNmW2lkeF0pIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBpY28gPSAtcHVsc2UtPmFtcFtpXTsKKyAgICAgICAgICAgICAgICBpZiAoY28pIHsKKyAgICAgICAgICAgICAgICAgICAgY28gLz0gc2ZbaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgaWNvID0gY28gLyBzcXJ0ZihzcXJ0ZihmYWJzZihjbykpKSArIChjbyA+IDAgPyAtaWNvIDogaWNvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29lZl9iYXNlWyBwdWxzZS0+cG9zW2ldIF0gPSBjYnJ0ZihmYWJzZihpY28pKSAqIGljbyAqIHNmW2lkeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGZsb2F0IGZsdDE2X3JvdW5kKGZsb2F0IHBmKQoreworICAgIHVuaW9uIGF2X2ludGZsb2F0MzIgdG1wOworICAgIHRtcC5mID0gcGY7CisgICAgdG1wLmkgPSAodG1wLmkgKyAweDAwMDA4MDAwVSkgJiAweEZGRkYwMDAwVTsKKyAgICByZXR1cm4gdG1wLmY7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGZsb2F0IGZsdDE2X2V2ZW4oZmxvYXQgcGYpCit7CisgICAgdW5pb24gYXZfaW50ZmxvYXQzMiB0bXA7CisgICAgdG1wLmYgPSBwZjsKKyAgICB0bXAuaSA9ICh0bXAuaSArIDB4MDAwMDdGRkZVICsgKHRtcC5pICYgMHgwMDAxMDAwMFUgPj4gMTYpKSAmIDB4RkZGRjAwMDBVOworICAgIHJldHVybiB0bXAuZjsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgZmxvYXQgZmx0MTZfdHJ1bmMoZmxvYXQgcGYpCit7CisgICAgdW5pb24gYXZfaW50ZmxvYXQzMiBwdW47CisgICAgcHVuLmYgPSBwZjsKKyAgICBwdW4uaSAmPSAweEZGRkYwMDAwVTsKKyAgICByZXR1cm4gcHVuLmY7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcHJlZGljdChQcmVkaWN0b3JTdGF0ZSAqcHMsIGZsb2F0ICpjb2VmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRfZW5hYmxlKQoreworICAgIGNvbnN0IGZsb2F0IGEgICAgID0gMC45NTMxMjU7IC8vIDYxLjAgLyA2NAorICAgIGNvbnN0IGZsb2F0IGFscGhhID0gMC45MDYyNTsgIC8vIDI5LjAgLyAzMgorICAgIGZsb2F0IGUwLCBlMTsKKyAgICBmbG9hdCBwdjsKKyAgICBmbG9hdCBrMSwgazI7CisgICAgZmxvYXQgICByMCA9IHBzLT5yMCwgICAgIHIxID0gcHMtPnIxOworICAgIGZsb2F0IGNvcjAgPSBwcy0+Y29yMCwgY29yMSA9IHBzLT5jb3IxOworICAgIGZsb2F0IHZhcjAgPSBwcy0+dmFyMCwgdmFyMSA9IHBzLT52YXIxOworCisgICAgazEgPSB2YXIwID4gMSA/IGNvcjAgKiBmbHQxNl9ldmVuKGEgLyB2YXIwKSA6IDA7CisgICAgazIgPSB2YXIxID4gMSA/IGNvcjEgKiBmbHQxNl9ldmVuKGEgLyB2YXIxKSA6IDA7CisKKyAgICBwdiA9IGZsdDE2X3JvdW5kKGsxICogcjAgKyBrMiAqIHIxKTsKKyAgICBpZiAob3V0cHV0X2VuYWJsZSkKKyAgICAgICAgKmNvZWYgKz0gcHY7CisKKyAgICBlMCA9ICpjb2VmOworICAgIGUxID0gZTAgLSBrMSAqIHIwOworCisgICAgcHMtPmNvcjEgPSBmbHQxNl90cnVuYyhhbHBoYSAqIGNvcjEgKyByMSAqIGUxKTsKKyAgICBwcy0+dmFyMSA9IGZsdDE2X3RydW5jKGFscGhhICogdmFyMSArIDAuNWYgKiAocjEgKiByMSArIGUxICogZTEpKTsKKyAgICBwcy0+Y29yMCA9IGZsdDE2X3RydW5jKGFscGhhICogY29yMCArIHIwICogZTApOworICAgIHBzLT52YXIwID0gZmx0MTZfdHJ1bmMoYWxwaGEgKiB2YXIwICsgMC41ZiAqIChyMCAqIHIwICsgZTAgKiBlMCkpOworCisgICAgcHMtPnIxID0gZmx0MTZfdHJ1bmMoYSAqIChyMCAtIGsxICogZTApKTsKKyAgICBwcy0+cjAgPSBmbHQxNl90cnVuYyhhICogZTApOworfQorCisvKioKKyAqIEFwcGx5IEFBQy1NYWluIHN0eWxlIGZyZXF1ZW5jeSBkb21haW4gcHJlZGljdGlvbi4KKyAqLworc3RhdGljIHZvaWQgYXBwbHlfcHJlZGljdGlvbihBQUNDb250ZXh0ICphYywgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSkKK3sKKyAgICBpbnQgc2ZiLCBrOworCisgICAgaWYgKCFzY2UtPmljcy5wcmVkaWN0b3JfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmVzZXRfYWxsX3ByZWRpY3RvcnMoc2NlLT5wcmVkaWN0b3Jfc3RhdGUpOworICAgICAgICBzY2UtPmljcy5wcmVkaWN0b3JfaW5pdGlhbGl6ZWQgPSAxOworICAgIH0KKworICAgIGlmIChzY2UtPmljcy53aW5kb3dfc2VxdWVuY2VbMF0gIT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgZm9yIChzZmIgPSAwOworICAgICAgICAgICAgIHNmYiA8IGZmX2FhY19wcmVkX3NmYl9tYXhbYWMtPm9jWzFdLm00YWMuc2FtcGxpbmdfaW5kZXhdOworICAgICAgICAgICAgIHNmYisrKSB7CisgICAgICAgICAgICBmb3IgKGsgPSBzY2UtPmljcy5zd2Jfb2Zmc2V0W3NmYl07CisgICAgICAgICAgICAgICAgIGsgPCBzY2UtPmljcy5zd2Jfb2Zmc2V0W3NmYiArIDFdOworICAgICAgICAgICAgICAgICBrKyspIHsKKyAgICAgICAgICAgICAgICBwcmVkaWN0KCZzY2UtPnByZWRpY3Rvcl9zdGF0ZVtrXSwgJnNjZS0+Y29lZmZzW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5pY3MucHJlZGljdG9yX3ByZXNlbnQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+aWNzLnByZWRpY3Rpb25fdXNlZFtzZmJdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2NlLT5pY3MucHJlZGljdG9yX3Jlc2V0X2dyb3VwKQorICAgICAgICAgICAgcmVzZXRfcHJlZGljdG9yX2dyb3VwKHNjZS0+cHJlZGljdG9yX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+aWNzLnByZWRpY3Rvcl9yZXNldF9ncm91cCk7CisgICAgfSBlbHNlCisgICAgICAgIHJlc2V0X2FsbF9wcmVkaWN0b3JzKHNjZS0+cHJlZGljdG9yX3N0YXRlKTsKK30KKworLyoqCisgKiBEZWNvZGUgYW4gaW5kaXZpZHVhbF9jaGFubmVsX3N0cmVhbSBwYXlsb2FkOyByZWZlcmVuY2U6IHRhYmxlIDQuNDQuCisgKgorICogQHBhcmFtICAgY29tbW9uX3dpbmRvdyAgIENoYW5uZWxzIGhhdmUgaW5kZXBlbmRlbnQgWzBdLCBvciBzaGFyZWQgWzFdLCBJbmRpdmlkdWFsIENoYW5uZWwgU3RyZWFtIGluZm9ybWF0aW9uLgorICogQHBhcmFtICAgc2NhbGVfZmxhZyAgICAgIHNjYWxhYmxlIFsxXSBvciBub24tc2NhbGFibGUgWzBdIEFBQyAoVW51c2VkIHVudGlsIHNjYWxhYmxlIEFBQyBpcyBpbXBsZW1lbnRlZC4pCisgKgorICogQHJldHVybiAgUmV0dXJucyBlcnJvciBzdGF0dXMuIDAgLSBPSywgITAgLSBlcnJvcgorICovCitzdGF0aWMgaW50IGRlY29kZV9pY3MoQUFDQ29udGV4dCAqYWMsIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UsCisgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBjb21tb25fd2luZG93LCBpbnQgc2NhbGVfZmxhZykKK3sKKyAgICBQdWxzZSBwdWxzZTsKKyAgICBUZW1wb3JhbE5vaXNlU2hhcGluZyAgICAqdG5zID0gJnNjZS0+dG5zOworICAgIEluZGl2aWR1YWxDaGFubmVsU3RyZWFtICppY3MgPSAmc2NlLT5pY3M7CisgICAgZmxvYXQgKm91dCA9IHNjZS0+Y29lZmZzOworICAgIGludCBnbG9iYWxfZ2FpbiwgZWxkX3N5bnRheCwgZXJfc3ludGF4LCBwdWxzZV9wcmVzZW50ID0gMDsKKyAgICBpbnQgcmV0OworCisgICAgZWxkX3N5bnRheCA9IGFjLT5vY1sxXS5tNGFjLm9iamVjdF90eXBlID09IEFPVF9FUl9BQUNfRUxEOworICAgIGVyX3N5bnRheCAgPSBhYy0+b2NbMV0ubTRhYy5vYmplY3RfdHlwZSA9PSBBT1RfRVJfQUFDX0xDIHx8CisgICAgICAgICAgICAgICAgIGFjLT5vY1sxXS5tNGFjLm9iamVjdF90eXBlID09IEFPVF9FUl9BQUNfTFRQIHx8CisgICAgICAgICAgICAgICAgIGFjLT5vY1sxXS5tNGFjLm9iamVjdF90eXBlID09IEFPVF9FUl9BQUNfTEQgfHwKKyAgICAgICAgICAgICAgICAgYWMtPm9jWzFdLm00YWMub2JqZWN0X3R5cGUgPT0gQU9UX0VSX0FBQ19FTEQ7CisKKyAgICAvKiBUaGlzIGFzc2lnbm1lbnQgaXMgdG8gc2lsZW5jZSBhIEdDQyB3YXJuaW5nIGFib3V0IHRoZSB2YXJpYWJsZSBiZWluZyB1c2VkCisgICAgICogdW5pbml0aWFsaXplZCB3aGVuIGluIGZhY3QgaXQgYWx3YXlzIGlzLgorICAgICAqLworICAgIHB1bHNlLm51bV9wdWxzZSA9IDA7CisKKyAgICBnbG9iYWxfZ2FpbiA9IGdldF9iaXRzKGdiLCA4KTsKKworICAgIGlmICghY29tbW9uX3dpbmRvdyAmJiAhc2NhbGVfZmxhZykgeworICAgICAgICBpZiAoZGVjb2RlX2ljc19pbmZvKGFjLCBpY3MsIGdiKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGRlY29kZV9iYW5kX3R5cGVzKGFjLCBzY2UtPmJhbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+YmFuZF90eXBlX3J1bl9lbmQsIGdiLCBpY3MpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBkZWNvZGVfc2NhbGVmYWN0b3JzKGFjLCBzY2UtPnNmLCBnYiwgZ2xvYmFsX2dhaW4sIGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2UtPmJhbmRfdHlwZSwgc2NlLT5iYW5kX3R5cGVfcnVuX2VuZCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHB1bHNlX3ByZXNlbnQgPSAwOworICAgIGlmICghc2NhbGVfZmxhZykgeworICAgICAgICBpZiAoIWVsZF9zeW50YXggJiYgKHB1bHNlX3ByZXNlbnQgPSBnZXRfYml0czEoZ2IpKSkgeworICAgICAgICAgICAgaWYgKGljcy0+d2luZG93X3NlcXVlbmNlWzBdID09IEVJR0hUX1NIT1JUX1NFUVVFTkNFKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiUHVsc2UgdG9vbCBub3QgYWxsb3dlZCBpbiBlaWdodCBzaG9ydCBzZXF1ZW5jZS5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlY29kZV9wdWxzZXMoJnB1bHNlLCBnYiwgaWNzLT5zd2Jfb2Zmc2V0LCBpY3MtPm51bV9zd2IpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiUHVsc2UgZGF0YSBjb3JydXB0IG9yIGludmFsaWQuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0bnMtPnByZXNlbnQgPSBnZXRfYml0czEoZ2IpOworICAgICAgICBpZiAodG5zLT5wcmVzZW50ICYmICFlcl9zeW50YXgpCisgICAgICAgICAgICBpZiAoZGVjb2RlX3RucyhhYywgdG5zLCBnYiwgaWNzKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmICghZWxkX3N5bnRheCAmJiBnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYWMtPmF2Y3R4LCAiU1NSIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICAgICAgLy8gSSBzZWUgbm8gdGV4dHVhbCBiYXNpcyBpbiB0aGUgc3BlYyBmb3IgdGhpcyBvY2N1cnJpbmcgYWZ0ZXIgU1NSIGdhaW4KKyAgICAgICAgLy8gY29udHJvbCwgYnV0IHRoaXMgaXMgd2hhdCBib3RoIHJlZmVyZW5jZSBhbmQgcmVhbCBpbXBsbWVudGF0aW9ucyBkbworICAgICAgICBpZiAodG5zLT5wcmVzZW50ICYmIGVyX3N5bnRheCkKKyAgICAgICAgICAgIGlmIChkZWNvZGVfdG5zKGFjLCB0bnMsIGdiLCBpY3MpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoZGVjb2RlX3NwZWN0cnVtX2FuZF9kZXF1YW50KGFjLCBvdXQsIGdiLCBzY2UtPnNmLCBwdWxzZV9wcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB1bHNlLCBpY3MsIHNjZS0+YmFuZF90eXBlKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGFjLT5vY1sxXS5tNGFjLm9iamVjdF90eXBlID09IEFPVF9BQUNfTUFJTiAmJiAhY29tbW9uX3dpbmRvdykKKyAgICAgICAgYXBwbHlfcHJlZGljdGlvbihhYywgc2NlKTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIE1pZC9TaWRlIHN0ZXJlbyBkZWNvZGluZzsgcmVmZXJlbmNlOiA0LjYuOC4xLjMuCisgKi8KK3N0YXRpYyB2b2lkIGFwcGx5X21pZF9zaWRlX3N0ZXJlbyhBQUNDb250ZXh0ICphYywgQ2hhbm5lbEVsZW1lbnQgKmNwZSkKK3sKKyAgICBjb25zdCBJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbSAqaWNzID0gJmNwZS0+Y2hbMF0uaWNzOworICAgIGZsb2F0ICpjaDAgPSBjcGUtPmNoWzBdLmNvZWZmczsKKyAgICBmbG9hdCAqY2gxID0gY3BlLT5jaFsxXS5jb2VmZnM7CisgICAgaW50IGcsIGksIGdyb3VwLCBpZHggPSAwOworICAgIGNvbnN0IHVpbnQxNl90ICpvZmZzZXRzID0gaWNzLT5zd2Jfb2Zmc2V0OworICAgIGZvciAoZyA9IDA7IGcgPCBpY3MtPm51bV93aW5kb3dfZ3JvdXBzOyBnKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGljcy0+bWF4X3NmYjsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgaWYgKGNwZS0+bXNfbWFza1tpZHhdICYmCisgICAgICAgICAgICAgICAgY3BlLT5jaFswXS5iYW5kX3R5cGVbaWR4XSA8IE5PSVNFX0JUICYmCisgICAgICAgICAgICAgICAgY3BlLT5jaFsxXS5iYW5kX3R5cGVbaWR4XSA8IE5PSVNFX0JUKSB7CisgICAgICAgICAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgaWNzLT5ncm91cF9sZW5bZ107IGdyb3VwKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYWMtPmZkc3AtPmJ1dHRlcmZsaWVzX2Zsb2F0KGNoMCArIGdyb3VwICogMTI4ICsgb2Zmc2V0c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gxICsgZ3JvdXAgKiAxMjggKyBvZmZzZXRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzW2krMV0gLSBvZmZzZXRzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2gwICs9IGljcy0+Z3JvdXBfbGVuW2ddICogMTI4OworICAgICAgICBjaDEgKz0gaWNzLT5ncm91cF9sZW5bZ10gKiAxMjg7CisgICAgfQorfQorCisvKioKKyAqIGludGVuc2l0eSBzdGVyZW8gZGVjb2Rpbmc7IHJlZmVyZW5jZTogNC42LjguMi4zCisgKgorICogQHBhcmFtICAgbXNfcHJlc2VudCAgSW5kaWNhdGVzIG1pZC9zaWRlIHN0ZXJlbyBwcmVzZW5jZS4gWzBdIG1hc2sgaXMgYWxsIDBzOworICogICAgICAgICAgICAgICAgICAgICAgWzFdIG1hc2sgaXMgZGVjb2RlZCBmcm9tIGJpdHN0cmVhbTsgWzJdIG1hc2sgaXMgYWxsIDFzOworICogICAgICAgICAgICAgICAgICAgICAgWzNdIHJlc2VydmVkIGZvciBzY2FsYWJsZSBBQUMKKyAqLworc3RhdGljIHZvaWQgYXBwbHlfaW50ZW5zaXR5X3N0ZXJlbyhBQUNDb250ZXh0ICphYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbEVsZW1lbnQgKmNwZSwgaW50IG1zX3ByZXNlbnQpCit7CisgICAgY29uc3QgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gKmljcyA9ICZjcGUtPmNoWzFdLmljczsKKyAgICBTaW5nbGVDaGFubmVsRWxlbWVudCAgICAgICAgICpzY2UxID0gJmNwZS0+Y2hbMV07CisgICAgZmxvYXQgKmNvZWYwID0gY3BlLT5jaFswXS5jb2VmZnMsICpjb2VmMSA9IGNwZS0+Y2hbMV0uY29lZmZzOworICAgIGNvbnN0IHVpbnQxNl90ICpvZmZzZXRzID0gaWNzLT5zd2Jfb2Zmc2V0OworICAgIGludCBnLCBncm91cCwgaSwgaWR4ID0gMDsKKyAgICBpbnQgYzsKKyAgICBmbG9hdCBzY2FsZTsKKyAgICBmb3IgKGcgPSAwOyBnIDwgaWNzLT5udW1fd2luZG93X2dyb3VwczsgZysrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpY3MtPm1heF9zZmI7KSB7CisgICAgICAgICAgICBpZiAoc2NlMS0+YmFuZF90eXBlW2lkeF0gPT0gSU5URU5TSVRZX0JUIHx8CisgICAgICAgICAgICAgICAgc2NlMS0+YmFuZF90eXBlW2lkeF0gPT0gSU5URU5TSVRZX0JUMikgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBidF9ydW5fZW5kID0gc2NlMS0+YmFuZF90eXBlX3J1bl9lbmRbaWR4XTsKKyAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGJ0X3J1bl9lbmQ7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IC0xICsgMiAqIChzY2UxLT5iYW5kX3R5cGVbaWR4XSAtIDE0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zX3ByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBjICo9IDEgLSAyICogY3BlLT5tc19tYXNrW2lkeF07CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gYyAqIHNjZTEtPnNmW2lkeF07CisgICAgICAgICAgICAgICAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IGljcy0+Z3JvdXBfbGVuW2ddOyBncm91cCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3NjYWxhcihjb2VmMSArIGdyb3VwICogMTI4ICsgb2Zmc2V0c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmMCArIGdyb3VwICogMTI4ICsgb2Zmc2V0c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzW2kgKyAxXSAtIG9mZnNldHNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGJ0X3J1bl9lbmQgPSBzY2UxLT5iYW5kX3R5cGVfcnVuX2VuZFtpZHhdOworICAgICAgICAgICAgICAgIGlkeCArPSBidF9ydW5fZW5kIC0gaTsKKyAgICAgICAgICAgICAgICBpICAgID0gYnRfcnVuX2VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb2VmMCArPSBpY3MtPmdyb3VwX2xlbltnXSAqIDEyODsKKyAgICAgICAgY29lZjEgKz0gaWNzLT5ncm91cF9sZW5bZ10gKiAxMjg7CisgICAgfQorfQorCisvKioKKyAqIERlY29kZSBhIGNoYW5uZWxfcGFpcl9lbGVtZW50OyByZWZlcmVuY2U6IHRhYmxlIDQuNC4KKyAqCisgKiBAcmV0dXJuICBSZXR1cm5zIGVycm9yIHN0YXR1cy4gMCAtIE9LLCAhMCAtIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2NwZShBQUNDb250ZXh0ICphYywgR2V0Qml0Q29udGV4dCAqZ2IsIENoYW5uZWxFbGVtZW50ICpjcGUpCit7CisgICAgaW50IGksIHJldCwgY29tbW9uX3dpbmRvdywgbXNfcHJlc2VudCA9IDA7CisgICAgaW50IGVsZF9zeW50YXggPSBhYy0+b2NbMV0ubTRhYy5vYmplY3RfdHlwZSA9PSBBT1RfRVJfQUFDX0VMRDsKKworICAgIGNvbW1vbl93aW5kb3cgPSBlbGRfc3ludGF4IHx8IGdldF9iaXRzMShnYik7CisgICAgaWYgKGNvbW1vbl93aW5kb3cpIHsKKyAgICAgICAgaWYgKGRlY29kZV9pY3NfaW5mbyhhYywgJmNwZS0+Y2hbMF0uaWNzLCBnYikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaSA9IGNwZS0+Y2hbMV0uaWNzLnVzZV9rYl93aW5kb3dbMF07CisgICAgICAgIGNwZS0+Y2hbMV0uaWNzID0gY3BlLT5jaFswXS5pY3M7CisgICAgICAgIGNwZS0+Y2hbMV0uaWNzLnVzZV9rYl93aW5kb3dbMV0gPSBpOworICAgICAgICBpZiAoY3BlLT5jaFsxXS5pY3MucHJlZGljdG9yX3ByZXNlbnQgJiYKKyAgICAgICAgICAgIChhYy0+b2NbMV0ubTRhYy5vYmplY3RfdHlwZSAhPSBBT1RfQUFDX01BSU4pKQorICAgICAgICAgICAgaWYgKChjcGUtPmNoWzFdLmljcy5sdHAucHJlc2VudCA9IGdldF9iaXRzKGdiLCAxKSkpCisgICAgICAgICAgICAgICAgZGVjb2RlX2x0cCgmY3BlLT5jaFsxXS5pY3MubHRwLCBnYiwgY3BlLT5jaFsxXS5pY3MubWF4X3NmYik7CisgICAgICAgIG1zX3ByZXNlbnQgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIGlmIChtc19wcmVzZW50ID09IDMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1zX3ByZXNlbnQgPSAzIGlzIHJlc2VydmVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfSBlbHNlIGlmIChtc19wcmVzZW50KQorICAgICAgICAgICAgZGVjb2RlX21pZF9zaWRlX3N0ZXJlbyhjcGUsIGdiLCBtc19wcmVzZW50KTsKKyAgICB9CisgICAgaWYgKChyZXQgPSBkZWNvZGVfaWNzKGFjLCAmY3BlLT5jaFswXSwgZ2IsIGNvbW1vbl93aW5kb3csIDApKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoKHJldCA9IGRlY29kZV9pY3MoYWMsICZjcGUtPmNoWzFdLCBnYiwgY29tbW9uX3dpbmRvdywgMCkpKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGNvbW1vbl93aW5kb3cpIHsKKyAgICAgICAgaWYgKG1zX3ByZXNlbnQpCisgICAgICAgICAgICBhcHBseV9taWRfc2lkZV9zdGVyZW8oYWMsIGNwZSk7CisgICAgICAgIGlmIChhYy0+b2NbMV0ubTRhYy5vYmplY3RfdHlwZSA9PSBBT1RfQUFDX01BSU4pIHsKKyAgICAgICAgICAgIGFwcGx5X3ByZWRpY3Rpb24oYWMsICZjcGUtPmNoWzBdKTsKKyAgICAgICAgICAgIGFwcGx5X3ByZWRpY3Rpb24oYWMsICZjcGUtPmNoWzFdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFwcGx5X2ludGVuc2l0eV9zdGVyZW8oYWMsIGNwZSwgbXNfcHJlc2VudCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBmbG9hdCBjY2Vfc2NhbGVbXSA9IHsKKyAgICAxLjA5MDUwNzczMjY2NTI1NzY1OTIxLCAvLzJeKDEvOCkKKyAgICAxLjE4OTIwNzExNTAwMjcyMTA2NjcyLCAvLzJeKDEvNCkKKyAgICBNX1NRUlQyLAorICAgIDIsCit9OworCisvKioKKyAqIERlY29kZSBjb3VwbGluZ19jaGFubmVsX2VsZW1lbnQ7IHJlZmVyZW5jZTogdGFibGUgNC44LgorICoKKyAqIEByZXR1cm4gIFJldHVybnMgZXJyb3Igc3RhdHVzLiAwIC0gT0ssICEwIC0gZXJyb3IKKyAqLworc3RhdGljIGludCBkZWNvZGVfY2NlKEFBQ0NvbnRleHQgKmFjLCBHZXRCaXRDb250ZXh0ICpnYiwgQ2hhbm5lbEVsZW1lbnQgKmNoZSkKK3sKKyAgICBpbnQgbnVtX2dhaW4gPSAwOworICAgIGludCBjLCBnLCBzZmIsIHJldDsKKyAgICBpbnQgc2lnbjsKKyAgICBmbG9hdCBzY2FsZTsKKyAgICBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlID0gJmNoZS0+Y2hbMF07CisgICAgQ2hhbm5lbENvdXBsaW5nICAgICAqY291cCA9ICZjaGUtPmNvdXA7CisKKyAgICBjb3VwLT5jb3VwbGluZ19wb2ludCA9IDIgKiBnZXRfYml0czEoZ2IpOworICAgIGNvdXAtPm51bV9jb3VwbGVkID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgIGZvciAoYyA9IDA7IGMgPD0gY291cC0+bnVtX2NvdXBsZWQ7IGMrKykgeworICAgICAgICBudW1fZ2FpbisrOworICAgICAgICBjb3VwLT50eXBlW2NdID0gZ2V0X2JpdHMxKGdiKSA/IFRZUEVfQ1BFIDogVFlQRV9TQ0U7CisgICAgICAgIGNvdXAtPmlkX3NlbGVjdFtjXSA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgaWYgKGNvdXAtPnR5cGVbY10gPT0gVFlQRV9DUEUpIHsKKyAgICAgICAgICAgIGNvdXAtPmNoX3NlbGVjdFtjXSA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgIGlmIChjb3VwLT5jaF9zZWxlY3RbY10gPT0gMykKKyAgICAgICAgICAgICAgICBudW1fZ2FpbisrOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNvdXAtPmNoX3NlbGVjdFtjXSA9IDI7CisgICAgfQorICAgIGNvdXAtPmNvdXBsaW5nX3BvaW50ICs9IGdldF9iaXRzMShnYikgfHwgKGNvdXAtPmNvdXBsaW5nX3BvaW50ID4+IDEpOworCisgICAgc2lnbiAgPSBnZXRfYml0cyhnYiwgMSk7CisgICAgc2NhbGUgPSBjY2Vfc2NhbGVbZ2V0X2JpdHMoZ2IsIDIpXTsKKworICAgIGlmICgocmV0ID0gZGVjb2RlX2ljcyhhYywgc2NlLCBnYiwgMCwgMCkpKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChjID0gMDsgYyA8IG51bV9nYWluOyBjKyspIHsKKyAgICAgICAgaW50IGlkeCAgPSAwOworICAgICAgICBpbnQgY2dlICA9IDE7CisgICAgICAgIGludCBnYWluID0gMDsKKyAgICAgICAgZmxvYXQgZ2Fpbl9jYWNoZSA9IDEuMDsKKyAgICAgICAgaWYgKGMpIHsKKyAgICAgICAgICAgIGNnZSA9IGNvdXAtPmNvdXBsaW5nX3BvaW50ID09IEFGVEVSX0lNRENUID8gMSA6IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBnYWluID0gY2dlID8gZ2V0X3ZsYzIoZ2IsIHZsY19zY2FsZWZhY3RvcnMudGFibGUsIDcsIDMpIC0gNjA6IDA7CisgICAgICAgICAgICBnYWluX2NhY2hlID0gcG93ZihzY2FsZSwgLWdhaW4pOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VwLT5jb3VwbGluZ19wb2ludCA9PSBBRlRFUl9JTURDVCkgeworICAgICAgICAgICAgY291cC0+Z2FpbltjXVswXSA9IGdhaW5fY2FjaGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGcgPSAwOyBnIDwgc2NlLT5pY3MubnVtX3dpbmRvd19ncm91cHM7IGcrKykgeworICAgICAgICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2NlLT5pY3MubWF4X3NmYjsgc2ZiKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY2UtPmJhbmRfdHlwZVtpZHhdICE9IFpFUk9fQlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2dlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHQgPSBnZXRfdmxjMihnYiwgdmxjX3NjYWxlZmFjdG9ycy50YWJsZSwgNywgMykgLSA2MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBnYWluICs9IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWduKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICAtPSAyICogKHQgJiAweDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA+Pj0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluX2NhY2hlID0gcG93ZihzY2FsZSwgLXQpICogczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VwLT5nYWluW2NdW2lkeF0gPSBnYWluX2NhY2hlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFBhcnNlIHdoZXRoZXIgY2hhbm5lbHMgYXJlIHRvIGJlIGV4Y2x1ZGVkIGZyb20gRHluYW1pYyBSYW5nZSBDb21wcmVzc2lvbjsgcmVmZXJlbmNlOiB0YWJsZSA0LjUzLgorICoKKyAqIEByZXR1cm4gIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkLgorICovCitzdGF0aWMgaW50IGRlY29kZV9kcmNfY2hhbm5lbF9leGNsdXNpb25zKER5bmFtaWNSYW5nZUNvbnRyb2wgKmNoZV9kcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBpOworICAgIGludCBudW1fZXhjbF9jaGFuID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgICAgICAgICAgIGNoZV9kcmMtPmV4Y2x1ZGVfbWFza1tudW1fZXhjbF9jaGFuKytdID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB9IHdoaWxlIChudW1fZXhjbF9jaGFuIDwgTUFYX0NIQU5ORUxTIC0gNyAmJiBnZXRfYml0czEoZ2IpKTsKKworICAgIHJldHVybiBudW1fZXhjbF9jaGFuIC8gNzsKK30KKworLyoqCisgKiBEZWNvZGUgZHluYW1pYyByYW5nZSBpbmZvcm1hdGlvbjsgcmVmZXJlbmNlOiB0YWJsZSA0LjUyLgorICoKKyAqIEByZXR1cm4gIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkLgorICovCitzdGF0aWMgaW50IGRlY29kZV9keW5hbWljX3JhbmdlKER5bmFtaWNSYW5nZUNvbnRyb2wgKmNoZV9kcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBuICAgICAgICAgICAgID0gMTsKKyAgICBpbnQgZHJjX251bV9iYW5kcyA9IDE7CisgICAgaW50IGk7CisKKyAgICAvKiBwY2VfdGFnX3ByZXNlbnQ/ICovCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgY2hlX2RyYy0+cGNlX2luc3RhbmNlX3RhZyAgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgIHNraXBfYml0cyhnYiwgNCk7IC8vIHRhZ19yZXNlcnZlZF9iaXRzCisgICAgICAgIG4rKzsKKyAgICB9CisKKyAgICAvKiBleGNsdWRlZF9jaG5zX3ByZXNlbnQ/ICovCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgbiArPSBkZWNvZGVfZHJjX2NoYW5uZWxfZXhjbHVzaW9ucyhjaGVfZHJjLCBnYik7CisgICAgfQorCisgICAgLyogZHJjX2JhbmRzX3ByZXNlbnQ/ICovCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgY2hlX2RyYy0+YmFuZF9pbmNyICAgICAgICAgICAgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgIGNoZV9kcmMtPmludGVycG9sYXRpb25fc2NoZW1lID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBuKys7CisgICAgICAgIGRyY19udW1fYmFuZHMgKz0gY2hlX2RyYy0+YmFuZF9pbmNyOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHJjX251bV9iYW5kczsgaSsrKSB7CisgICAgICAgICAgICBjaGVfZHJjLT5iYW5kX3RvcFtpXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHByb2dfcmVmX2xldmVsX3ByZXNlbnQ/ICovCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgY2hlX2RyYy0+cHJvZ19yZWZfbGV2ZWwgPSBnZXRfYml0cyhnYiwgNyk7CisgICAgICAgIHNraXBfYml0czEoZ2IpOyAvLyBwcm9nX3JlZl9sZXZlbF9yZXNlcnZlZF9iaXRzCisgICAgICAgIG4rKzsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHJjX251bV9iYW5kczsgaSsrKSB7CisgICAgICAgIGNoZV9kcmMtPmR5bl9ybmdfc2duW2ldID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgY2hlX2RyYy0+ZHluX3JuZ19jdGxbaV0gPSBnZXRfYml0cyhnYiwgNyk7CisgICAgICAgIG4rKzsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIGludCBkZWNvZGVfZmlsbChBQUNDb250ZXh0ICphYywgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBsZW4pIHsKKyAgICB1aW50OF90IGJ1ZlsyNTZdOworICAgIGludCBpLCBtYWpvciwgbWlub3I7CisKKyAgICBpZiAobGVuIDwgMTMrNyo4KQorICAgICAgICBnb3RvIHVua25vd247CisKKyAgICBnZXRfYml0cyhnYiwgMTMpOyBsZW4gLT0gMTM7CisKKyAgICBmb3IoaT0wOyBpKzE8c2l6ZW9mKGJ1ZikgJiYgbGVuPj04OyBpKyssIGxlbi09OCkKKyAgICAgICAgYnVmW2ldID0gZ2V0X2JpdHMoZ2IsIDgpOworCisgICAgYnVmW2ldID0gMDsKKyAgICBpZiAoYWMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiRklMTDolc1xuIiwgYnVmKTsKKworICAgIGlmIChzc2NhbmYoYnVmLCAibGliZmFhYyAlZC4lZCIsICZtYWpvciwgJm1pbm9yKSA9PSAyKXsKKyAgICAgICAgYWMtPmF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzID0gMTAyNDsKKyAgICB9CisKK3Vua25vd246CisgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGxlbik7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgZXh0ZW5zaW9uIGRhdGEgKGluY29tcGxldGUpOyByZWZlcmVuY2U6IHRhYmxlIDQuNTEuCisgKgorICogQHBhcmFtICAgY250IGxlbmd0aCBvZiBUWVBFX0ZJTCBzeW50YWN0aWMgZWxlbWVudCBpbiBieXRlcworICoKKyAqIEByZXR1cm4gUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKKyAqLworc3RhdGljIGludCBkZWNvZGVfZXh0ZW5zaW9uX3BheWxvYWQoQUFDQ29udGV4dCAqYWMsIEdldEJpdENvbnRleHQgKmdiLCBpbnQgY250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbEVsZW1lbnQgKmNoZSwgZW51bSBSYXdEYXRhQmxvY2tUeXBlIGVsZW1fdHlwZSkKK3sKKyAgICBpbnQgY3JjX2ZsYWcgPSAwOworICAgIGludCByZXMgPSBjbnQ7CisgICAgaW50IHR5cGUgPSBnZXRfYml0cyhnYiwgNCk7CisKKyAgICBpZiAoYWMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1NUQVJUQ09ERSkKKyAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiZXh0ZW5zaW9uIHR5cGU6ICVkIGxlbjolZFxuIiwgdHlwZSwgY250KTsKKworICAgIHN3aXRjaCAodHlwZSkgeyAvLyBleHRlbnNpb24gdHlwZQorICAgIGNhc2UgRVhUX1NCUl9EQVRBX0NSQzoKKyAgICAgICAgY3JjX2ZsYWcrKzsKKyAgICBjYXNlIEVYVF9TQlJfREFUQToKKyAgICAgICAgaWYgKCFjaGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlNCUiB3YXMgZm91bmQgYmVmb3JlIHRoZSBmaXJzdCBjaGFubmVsIGVsZW1lbnQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0gZWxzZSBpZiAoIWFjLT5vY1sxXS5tNGFjLnNicikgeworICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU0JSIHNpZ25hbGVkIHRvIGJlIG5vdC1wcmVzZW50IGJ1dCB3YXMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbS5cbiIpOworICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDggKiBjbnQgLSA0KTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0gZWxzZSBpZiAoYWMtPm9jWzFdLm00YWMuc2JyID09IC0xICYmIGFjLT5vY1sxXS5zdGF0dXMgPT0gT0NfTE9DS0VEKSB7CisgICAgICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbXBsaWNpdCBTQlIgd2FzIGZvdW5kIHdpdGggYSBmaXJzdCBvY2N1cnJlbmNlIGFmdGVyIHRoZSBmaXJzdCBmcmFtZS5cbiIpOworICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDggKiBjbnQgLSA0KTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0gZWxzZSBpZiAoYWMtPm9jWzFdLm00YWMucHMgPT0gLTEgJiYgYWMtPm9jWzFdLnN0YXR1cyA8IE9DX0xPQ0tFRCAmJiBhYy0+YXZjdHgtPmNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgICAgIGFjLT5vY1sxXS5tNGFjLnNiciA9IDE7CisgICAgICAgICAgICBhYy0+b2NbMV0ubTRhYy5wcyA9IDE7CisgICAgICAgICAgICBhYy0+YXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0FBQ19IRV9WMjsKKyAgICAgICAgICAgIG91dHB1dF9jb25maWd1cmUoYWMsIGFjLT5vY1sxXS5sYXlvdXRfbWFwLCBhYy0+b2NbMV0ubGF5b3V0X21hcF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYy0+b2NbMV0uc3RhdHVzLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFjLT5vY1sxXS5tNGFjLnNiciA9IDE7CisgICAgICAgICAgICBhYy0+YXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0FBQ19IRTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBmZl9kZWNvZGVfc2JyX2V4dGVuc2lvbihhYywgJmNoZS0+c2JyLCBnYiwgY3JjX2ZsYWcsIGNudCwgZWxlbV90eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFRfRFlOQU1JQ19SQU5HRToKKyAgICAgICAgcmVzID0gZGVjb2RlX2R5bmFtaWNfcmFuZ2UoJmFjLT5jaGVfZHJjLCBnYik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVhUX0ZJTEw6CisgICAgICAgIGRlY29kZV9maWxsKGFjLCBnYiwgOCAqIGNudCAtIDQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYVF9GSUxMX0RBVEE6CisgICAgY2FzZSBFWFRfREFUQV9FTEVNRU5UOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHNraXBfYml0c19sb25nKGdiLCA4ICogY250IC0gNCk7CisgICAgICAgIGJyZWFrOworICAgIH07CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBEZWNvZGUgVGVtcG9yYWwgTm9pc2UgU2hhcGluZyBmaWx0ZXIgY29lZmZpY2llbnRzIGFuZCBhcHBseSBhbGwtcG9sZSBmaWx0ZXJzOyByZWZlcmVuY2U6IDQuNi45LjMuCisgKgorICogQHBhcmFtICAgZGVjb2RlICAxIGlmIHRvb2wgaXMgdXNlZCBub3JtYWxseSwgMCBpZiB0b29sIGlzIHVzZWQgaW4gTFRQLgorICogQHBhcmFtICAgY29lZiAgICBzcGVjdHJhbCBjb2VmZmljaWVudHMKKyAqLworc3RhdGljIHZvaWQgYXBwbHlfdG5zKGZsb2F0IGNvZWZbMTAyNF0sIFRlbXBvcmFsTm9pc2VTaGFwaW5nICp0bnMsCisgICAgICAgICAgICAgICAgICAgICAgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gKmljcywgaW50IGRlY29kZSkKK3sKKyAgICBjb25zdCBpbnQgbW1tID0gRkZNSU4oaWNzLT50bnNfbWF4X2JhbmRzLCBpY3MtPm1heF9zZmIpOworICAgIGludCB3LCBmaWx0LCBtLCBpOworICAgIGludCBib3R0b20sIHRvcCwgb3JkZXIsIHN0YXJ0LCBlbmQsIHNpemUsIGluYzsKKyAgICBmbG9hdCBscGNbVE5TX01BWF9PUkRFUl07CisgICAgZmxvYXQgdG1wW1ROU19NQVhfT1JERVIrMV07CisKKyAgICBmb3IgKHcgPSAwOyB3IDwgaWNzLT5udW1fd2luZG93czsgdysrKSB7CisgICAgICAgIGJvdHRvbSA9IGljcy0+bnVtX3N3YjsKKyAgICAgICAgZm9yIChmaWx0ID0gMDsgZmlsdCA8IHRucy0+bl9maWx0W3ddOyBmaWx0KyspIHsKKyAgICAgICAgICAgIHRvcCAgICA9IGJvdHRvbTsKKyAgICAgICAgICAgIGJvdHRvbSA9IEZGTUFYKDAsIHRvcCAtIHRucy0+bGVuZ3RoW3ddW2ZpbHRdKTsKKyAgICAgICAgICAgIG9yZGVyICA9IHRucy0+b3JkZXJbd11bZmlsdF07CisgICAgICAgICAgICBpZiAob3JkZXIgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gdG5zX2RlY29kZV9jb2VmCisgICAgICAgICAgICBjb21wdXRlX2xwY19jb2Vmcyh0bnMtPmNvZWZbd11bZmlsdF0sIG9yZGVyLCBscGMsIDAsIDAsIDApOworCisgICAgICAgICAgICBzdGFydCA9IGljcy0+c3diX29mZnNldFtGRk1JTihib3R0b20sIG1tbSldOworICAgICAgICAgICAgZW5kICAgPSBpY3MtPnN3Yl9vZmZzZXRbRkZNSU4oICAgdG9wLCBtbW0pXTsKKyAgICAgICAgICAgIGlmICgoc2l6ZSA9IGVuZCAtIHN0YXJ0KSA8PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHRucy0+ZGlyZWN0aW9uW3ddW2ZpbHRdKSB7CisgICAgICAgICAgICAgICAgaW5jID0gLTE7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQgLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnQgKz0gdyAqIDEyODsKKworICAgICAgICAgICAgaWYgKGRlY29kZSkgeworICAgICAgICAgICAgICAgIC8vIGFyIGZpbHRlcgorICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCBzaXplOyBtKyssIHN0YXJ0ICs9IGluYykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBGRk1JTihtLCBvcmRlcik7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZbc3RhcnRdIC09IGNvZWZbc3RhcnQgLSBpICogaW5jXSAqIGxwY1tpIC0gMV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG1hIGZpbHRlcgorICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCBzaXplOyBtKyssIHN0YXJ0ICs9IGluYykgeworICAgICAgICAgICAgICAgICAgICB0bXBbMF0gPSBjb2VmW3N0YXJ0XTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBGRk1JTihtLCBvcmRlcik7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZbc3RhcnRdICs9IHRtcFtpXSAqIGxwY1tpIC0gMV07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IG9yZGVyOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wW2ldID0gdG1wW2kgLSAxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogIEFwcGx5IHdpbmRvd2luZyBhbmQgTURDVCB0byBvYnRhaW4gdGhlIHNwZWN0cmFsCisgKiAgY29lZmZpY2llbnQgZnJvbSB0aGUgcHJlZGljdGVkIHNhbXBsZSBieSBMVFAuCisgKi8KK3N0YXRpYyB2b2lkIHdpbmRvd2luZ19hbmRfbWRjdF9sdHAoQUFDQ29udGV4dCAqYWMsIGZsb2F0ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICppbiwgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gKmljcykKK3sKKyAgICBjb25zdCBmbG9hdCAqbHdpbmRvdyAgICAgID0gaWNzLT51c2Vfa2Jfd2luZG93WzBdID8gZmZfYWFjX2tiZF9sb25nXzEwMjQgOiBmZl9zaW5lXzEwMjQ7CisgICAgY29uc3QgZmxvYXQgKnN3aW5kb3cgICAgICA9IGljcy0+dXNlX2tiX3dpbmRvd1swXSA/IGZmX2FhY19rYmRfc2hvcnRfMTI4IDogZmZfc2luZV8xMjg7CisgICAgY29uc3QgZmxvYXQgKmx3aW5kb3dfcHJldiA9IGljcy0+dXNlX2tiX3dpbmRvd1sxXSA/IGZmX2FhY19rYmRfbG9uZ18xMDI0IDogZmZfc2luZV8xMDI0OworICAgIGNvbnN0IGZsb2F0ICpzd2luZG93X3ByZXYgPSBpY3MtPnVzZV9rYl93aW5kb3dbMV0gPyBmZl9hYWNfa2JkX3Nob3J0XzEyOCA6IGZmX3NpbmVfMTI4OworCisgICAgaWYgKGljcy0+d2luZG93X3NlcXVlbmNlWzBdICE9IExPTkdfU1RPUF9TRVFVRU5DRSkgeworICAgICAgICBhYy0+ZmRzcC0+dmVjdG9yX2ZtdWwoaW4sIGluLCBsd2luZG93X3ByZXYsIDEwMjQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldChpbiwgMCwgNDQ4ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIGFjLT5mZHNwLT52ZWN0b3JfZm11bChpbiArIDQ0OCwgaW4gKyA0NDgsIHN3aW5kb3dfcHJldiwgMTI4KTsKKyAgICB9CisgICAgaWYgKGljcy0+d2luZG93X3NlcXVlbmNlWzBdICE9IExPTkdfU1RBUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2UoaW4gKyAxMDI0LCBpbiArIDEwMjQsIGx3aW5kb3csIDEwMjQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFjLT5mZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKGluICsgMTAyNCArIDQ0OCwgaW4gKyAxMDI0ICsgNDQ4LCBzd2luZG93LCAxMjgpOworICAgICAgICBtZW1zZXQoaW4gKyAxMDI0ICsgNTc2LCAwLCA0NDggKiBzaXplb2YoZmxvYXQpKTsKKyAgICB9CisgICAgYWMtPm1kY3RfbHRwLm1kY3RfY2FsYygmYWMtPm1kY3RfbHRwLCBvdXQsIGluKTsKK30KKworLyoqCisgKiBBcHBseSB0aGUgbG9uZyB0ZXJtIHByZWRpY3Rpb24KKyAqLworc3RhdGljIHZvaWQgYXBwbHlfbHRwKEFBQ0NvbnRleHQgKmFjLCBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlKQoreworICAgIGNvbnN0IExvbmdUZXJtUHJlZGljdGlvbiAqbHRwID0gJnNjZS0+aWNzLmx0cDsKKyAgICBjb25zdCB1aW50MTZfdCAqb2Zmc2V0cyA9IHNjZS0+aWNzLnN3Yl9vZmZzZXQ7CisgICAgaW50IGksIHNmYjsKKworICAgIGlmIChzY2UtPmljcy53aW5kb3dfc2VxdWVuY2VbMF0gIT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgZmxvYXQgKnByZWRUaW1lID0gc2NlLT5yZXQ7CisgICAgICAgIGZsb2F0ICpwcmVkRnJlcSA9IGFjLT5idWZfbWRjdDsKKyAgICAgICAgaW50MTZfdCBudW1fc2FtcGxlcyA9IDIwNDg7CisKKyAgICAgICAgaWYgKGx0cC0+bGFnIDwgMTAyNCkKKyAgICAgICAgICAgIG51bV9zYW1wbGVzID0gbHRwLT5sYWcgKyAxMDI0OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7IGkrKykKKyAgICAgICAgICAgIHByZWRUaW1lW2ldID0gc2NlLT5sdHBfc3RhdGVbaSArIDIwNDggLSBsdHAtPmxhZ10gKiBsdHAtPmNvZWY7CisgICAgICAgIG1lbXNldCgmcHJlZFRpbWVbaV0sIDAsICgyMDQ4IC0gaSkgKiBzaXplb2YoZmxvYXQpKTsKKworICAgICAgICBhYy0+d2luZG93aW5nX2FuZF9tZGN0X2x0cChhYywgcHJlZEZyZXEsIHByZWRUaW1lLCAmc2NlLT5pY3MpOworCisgICAgICAgIGlmIChzY2UtPnRucy5wcmVzZW50KQorICAgICAgICAgICAgYWMtPmFwcGx5X3RucyhwcmVkRnJlcSwgJnNjZS0+dG5zLCAmc2NlLT5pY3MsIDApOworCisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgRkZNSU4oc2NlLT5pY3MubWF4X3NmYiwgTUFYX0xUUF9MT05HX1NGQik7IHNmYisrKQorICAgICAgICAgICAgaWYgKGx0cC0+dXNlZFtzZmJdKQorICAgICAgICAgICAgICAgIGZvciAoaSA9IG9mZnNldHNbc2ZiXTsgaSA8IG9mZnNldHNbc2ZiICsgMV07IGkrKykKKyAgICAgICAgICAgICAgICAgICAgc2NlLT5jb2VmZnNbaV0gKz0gcHJlZEZyZXFbaV07CisgICAgfQorfQorCisvKioKKyAqIFVwZGF0ZSB0aGUgTFRQIGJ1ZmZlciBmb3IgbmV4dCBmcmFtZQorICovCitzdGF0aWMgdm9pZCB1cGRhdGVfbHRwKEFBQ0NvbnRleHQgKmFjLCBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlKQoreworICAgIEluZGl2aWR1YWxDaGFubmVsU3RyZWFtICppY3MgPSAmc2NlLT5pY3M7CisgICAgZmxvYXQgKnNhdmVkICAgICA9IHNjZS0+c2F2ZWQ7CisgICAgZmxvYXQgKnNhdmVkX2x0cCA9IHNjZS0+Y29lZmZzOworICAgIGNvbnN0IGZsb2F0ICpsd2luZG93ID0gaWNzLT51c2Vfa2Jfd2luZG93WzBdID8gZmZfYWFjX2tiZF9sb25nXzEwMjQgOiBmZl9zaW5lXzEwMjQ7CisgICAgY29uc3QgZmxvYXQgKnN3aW5kb3cgPSBpY3MtPnVzZV9rYl93aW5kb3dbMF0gPyBmZl9hYWNfa2JkX3Nob3J0XzEyOCA6IGZmX3NpbmVfMTI4OworICAgIGludCBpOworCisgICAgaWYgKGljcy0+d2luZG93X3NlcXVlbmNlWzBdID09IEVJR0hUX1NIT1JUX1NFUVVFTkNFKSB7CisgICAgICAgIG1lbWNweShzYXZlZF9sdHAsICAgICAgIHNhdmVkLCA1MTIgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgbWVtc2V0KHNhdmVkX2x0cCArIDU3NiwgMCwgICAgIDQ0OCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBhYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZShzYXZlZF9sdHAgKyA0NDgsIGFjLT5idWZfbWRjdCArIDk2MCwgICAgICZzd2luZG93WzY0XSwgICAgICA2NCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgc2F2ZWRfbHRwW2kgKyA1MTJdID0gYWMtPmJ1Zl9tZGN0WzEwMjMgLSBpXSAqIHN3aW5kb3dbNjMgLSBpXTsKKyAgICB9IGVsc2UgaWYgKGljcy0+d2luZG93X3NlcXVlbmNlWzBdID09IExPTkdfU1RBUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgbWVtY3B5KHNhdmVkX2x0cCwgICAgICAgYWMtPmJ1Zl9tZGN0ICsgNTEyLCA0NDggKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgbWVtc2V0KHNhdmVkX2x0cCArIDU3NiwgMCwgICAgICAgICAgICAgICAgICA0NDggKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2Uoc2F2ZWRfbHRwICsgNDQ4LCBhYy0+YnVmX21kY3QgKyA5NjAsICAgICAmc3dpbmRvd1s2NF0sICAgICAgNjQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIHNhdmVkX2x0cFtpICsgNTEyXSA9IGFjLT5idWZfbWRjdFsxMDIzIC0gaV0gKiBzd2luZG93WzYzIC0gaV07CisgICAgfSBlbHNlIHsgLy8gTE9OR19TVE9QIG9yIE9OTFlfTE9ORworICAgICAgICBhYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZShzYXZlZF9sdHAsICAgICAgIGFjLT5idWZfbWRjdCArIDUxMiwgICAgICZsd2luZG93WzUxMl0sICAgICA1MTIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspCisgICAgICAgICAgICBzYXZlZF9sdHBbaSArIDUxMl0gPSBhYy0+YnVmX21kY3RbMTAyMyAtIGldICogbHdpbmRvd1s1MTEgLSBpXTsKKyAgICB9CisKKyAgICBtZW1jcHkoc2NlLT5sdHBfc3RhdGUsICAgICAgc2NlLT5sdHBfc3RhdGUrMTAyNCwgMTAyNCAqIHNpemVvZigqc2NlLT5sdHBfc3RhdGUpKTsKKyAgICBtZW1jcHkoc2NlLT5sdHBfc3RhdGUrMTAyNCwgc2NlLT5yZXQsICAgICAgICAgICAgMTAyNCAqIHNpemVvZigqc2NlLT5sdHBfc3RhdGUpKTsKKyAgICBtZW1jcHkoc2NlLT5sdHBfc3RhdGUrMjA0OCwgc2F2ZWRfbHRwLCAgICAgICAgICAgMTAyNCAqIHNpemVvZigqc2NlLT5sdHBfc3RhdGUpKTsKK30KKworLyoqCisgKiBDb25kdWN0IElNRENUIGFuZCB3aW5kb3dpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGltZGN0X2FuZF93aW5kb3dpbmcoQUFDQ29udGV4dCAqYWMsIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UpCit7CisgICAgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gKmljcyA9ICZzY2UtPmljczsKKyAgICBmbG9hdCAqaW4gICAgPSBzY2UtPmNvZWZmczsKKyAgICBmbG9hdCAqb3V0ICAgPSBzY2UtPnJldDsKKyAgICBmbG9hdCAqc2F2ZWQgPSBzY2UtPnNhdmVkOworICAgIGNvbnN0IGZsb2F0ICpzd2luZG93ICAgICAgPSBpY3MtPnVzZV9rYl93aW5kb3dbMF0gPyBmZl9hYWNfa2JkX3Nob3J0XzEyOCA6IGZmX3NpbmVfMTI4OworICAgIGNvbnN0IGZsb2F0ICpsd2luZG93X3ByZXYgPSBpY3MtPnVzZV9rYl93aW5kb3dbMV0gPyBmZl9hYWNfa2JkX2xvbmdfMTAyNCA6IGZmX3NpbmVfMTAyNDsKKyAgICBjb25zdCBmbG9hdCAqc3dpbmRvd19wcmV2ID0gaWNzLT51c2Vfa2Jfd2luZG93WzFdID8gZmZfYWFjX2tiZF9zaG9ydF8xMjggOiBmZl9zaW5lXzEyODsKKyAgICBmbG9hdCAqYnVmICA9IGFjLT5idWZfbWRjdDsKKyAgICBmbG9hdCAqdGVtcCA9IGFjLT50ZW1wOworICAgIGludCBpOworCisgICAgLy8gaW1kY3QKKyAgICBpZiAoaWNzLT53aW5kb3dfc2VxdWVuY2VbMF0gPT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gMTI4KQorICAgICAgICAgICAgYWMtPm1kY3Rfc21hbGwuaW1kY3RfaGFsZigmYWMtPm1kY3Rfc21hbGwsIGJ1ZiArIGksIGluICsgaSk7CisgICAgfSBlbHNlCisgICAgICAgIGFjLT5tZGN0LmltZGN0X2hhbGYoJmFjLT5tZGN0LCBidWYsIGluKTsKKworICAgIC8qIHdpbmRvdyBvdmVybGFwcGluZworICAgICAqIE5PVEU6IFRvIHNpbXBsaWZ5IHRoZSBvdmVybGFwcGluZyBjb2RlLCBhbGwgJ21lYW5pbmdsZXNzJyBzaG9ydCB0byBsb25nCisgICAgICogYW5kIGxvbmcgdG8gc2hvcnQgdHJhbnNpdGlvbnMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc2hvcnQgdG8gc2hvcnQKKyAgICAgKiB0cmFuc2l0aW9ucy4gVGhpcyBsZWF2ZXMganVzdCB0d28gY2FzZXMgKGxvbmcgdG8gbG9uZyBhbmQgc2hvcnQgdG8gc2hvcnQpCisgICAgICogd2l0aCBhIGxpdHRsZSBzcGVjaWFsIHNhdWNlIGZvciBFSUdIVF9TSE9SVF9TRVFVRU5DRS4KKyAgICAgKi8KKyAgICBpZiAoKGljcy0+d2luZG93X3NlcXVlbmNlWzFdID09IE9OTFlfTE9OR19TRVFVRU5DRSB8fCBpY3MtPndpbmRvd19zZXF1ZW5jZVsxXSA9PSBMT05HX1NUT1BfU0VRVUVOQ0UpICYmCisgICAgICAgICAgICAoaWNzLT53aW5kb3dfc2VxdWVuY2VbMF0gPT0gT05MWV9MT05HX1NFUVVFTkNFIHx8IGljcy0+d2luZG93X3NlcXVlbmNlWzBdID09IExPTkdfU1RBUlRfU0VRVUVOQ0UpKSB7CisgICAgICAgIGFjLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3coICAgIG91dCwgICAgICAgICAgICAgICBzYXZlZCwgICAgICAgICAgICBidWYsICAgICAgICAgbHdpbmRvd19wcmV2LCA1MTIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweSggICAgICAgICAgICAgICAgICAgICAgICAgb3V0LCAgICAgICAgICAgICAgIHNhdmVkLCAgICAgICAgICAgIDQ0OCAqIHNpemVvZihmbG9hdCkpOworCisgICAgICAgIGlmIChpY3MtPndpbmRvd19zZXF1ZW5jZVswXSA9PSBFSUdIVF9TSE9SVF9TRVFVRU5DRSkgeworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQgKyA0NDggKyAwKjEyOCwgc2F2ZWQgKyA0NDgsICAgICAgYnVmICsgMCoxMjgsIHN3aW5kb3dfcHJldiwgNjQpOworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQgKyA0NDggKyAxKjEyOCwgYnVmICsgMCoxMjggKyA2NCwgYnVmICsgMSoxMjgsIHN3aW5kb3csICAgICAgNjQpOworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQgKyA0NDggKyAyKjEyOCwgYnVmICsgMSoxMjggKyA2NCwgYnVmICsgMioxMjgsIHN3aW5kb3csICAgICAgNjQpOworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQgKyA0NDggKyAzKjEyOCwgYnVmICsgMioxMjggKyA2NCwgYnVmICsgMyoxMjgsIHN3aW5kb3csICAgICAgNjQpOworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyh0ZW1wLCAgICAgICAgICAgICAgYnVmICsgMyoxMjggKyA2NCwgYnVmICsgNCoxMjgsIHN3aW5kb3csICAgICAgNjQpOworICAgICAgICAgICAgbWVtY3B5KCAgICAgICAgICAgICAgICAgICAgIG91dCArIDQ0OCArIDQqMTI4LCB0ZW1wLCA2NCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQgKyA0NDgsICAgICAgICAgc2F2ZWQgKyA0NDgsICAgICAgYnVmLCAgICAgICAgIHN3aW5kb3dfcHJldiwgNjQpOworICAgICAgICAgICAgbWVtY3B5KCAgICAgICAgICAgICAgICAgICAgIG91dCArIDU3NiwgICAgICAgICBidWYgKyA2NCwgICAgICAgICA0NDggKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGJ1ZmZlciB1cGRhdGUKKyAgICBpZiAoaWNzLT53aW5kb3dfc2VxdWVuY2VbMF0gPT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgbWVtY3B5KCAgICAgICAgICAgICAgICAgICAgIHNhdmVkLCAgICAgICB0ZW1wICsgNjQsICAgICAgICAgNjQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhzYXZlZCArIDY0LCAgYnVmICsgNCoxMjggKyA2NCwgYnVmICsgNSoxMjgsIHN3aW5kb3csIDY0KTsKKyAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhzYXZlZCArIDE5MiwgYnVmICsgNSoxMjggKyA2NCwgYnVmICsgNioxMjgsIHN3aW5kb3csIDY0KTsKKyAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhzYXZlZCArIDMyMCwgYnVmICsgNioxMjggKyA2NCwgYnVmICsgNyoxMjgsIHN3aW5kb3csIDY0KTsKKyAgICAgICAgbWVtY3B5KCAgICAgICAgICAgICAgICAgICAgIHNhdmVkICsgNDQ4LCBidWYgKyA3KjEyOCArIDY0LCAgNjQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICB9IGVsc2UgaWYgKGljcy0+d2luZG93X3NlcXVlbmNlWzBdID09IExPTkdfU1RBUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgbWVtY3B5KCAgICAgICAgICAgICAgICAgICAgIHNhdmVkLCAgICAgICBidWYgKyA1MTIsICAgICAgICA0NDggKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgbWVtY3B5KCAgICAgICAgICAgICAgICAgICAgIHNhdmVkICsgNDQ4LCBidWYgKyA3KjEyOCArIDY0LCAgNjQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICB9IGVsc2UgeyAvLyBMT05HX1NUT1Agb3IgT05MWV9MT05HCisgICAgICAgIG1lbWNweSggICAgICAgICAgICAgICAgICAgICBzYXZlZCwgICAgICAgYnVmICsgNTEyLCAgICAgICAgNTEyICogc2l6ZW9mKGZsb2F0KSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpbWRjdF9hbmRfd2luZG93aW5nX2xkKEFBQ0NvbnRleHQgKmFjLCBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlKQoreworICAgIEluZGl2aWR1YWxDaGFubmVsU3RyZWFtICppY3MgPSAmc2NlLT5pY3M7CisgICAgZmxvYXQgKmluICAgID0gc2NlLT5jb2VmZnM7CisgICAgZmxvYXQgKm91dCAgID0gc2NlLT5yZXQ7CisgICAgZmxvYXQgKnNhdmVkID0gc2NlLT5zYXZlZDsKKyAgICBmbG9hdCAqYnVmICA9IGFjLT5idWZfbWRjdDsKKworICAgIC8vIGltZGN0CisgICAgYWMtPm1kY3QuaW1kY3RfaGFsZigmYWMtPm1kY3RfbGQsIGJ1ZiwgaW4pOworCisgICAgLy8gd2luZG93IG92ZXJsYXBwaW5nCisgICAgaWYgKGljcy0+dXNlX2tiX3dpbmRvd1sxXSkgeworICAgICAgICAvLyBBQUMgTEQgdXNlcyBhIGxvdyBvdmVybGFwIHNpbmUgd2luZG93IGluc3RlYWQgb2YgYSBLQkQgd2luZG93CisgICAgICAgIG1lbWNweShvdXQsIHNhdmVkLCAxOTIgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQgKyAxOTIsIHNhdmVkICsgMTkyLCBidWYsIGZmX3NpbmVfMTI4LCA2NCk7CisgICAgICAgIG1lbWNweSggICAgICAgICAgICAgICAgICAgICBvdXQgKyAzMjAsIGJ1ZiArIDY0LCAxOTIgKiBzaXplb2YoZmxvYXQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KG91dCwgc2F2ZWQsIGJ1ZiwgZmZfc2luZV81MTIsIDI1Nik7CisgICAgfQorCisgICAgLy8gYnVmZmVyIHVwZGF0ZQorICAgIG1lbWNweShzYXZlZCwgYnVmICsgMjU2LCAyNTYgKiBzaXplb2YoZmxvYXQpKTsKK30KKworc3RhdGljIHZvaWQgaW1kY3RfYW5kX3dpbmRvd2luZ19lbGQoQUFDQ29udGV4dCAqYWMsIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UpCit7CisgICAgZmxvYXQgKmluICAgID0gc2NlLT5jb2VmZnM7CisgICAgZmxvYXQgKm91dCAgID0gc2NlLT5yZXQ7CisgICAgZmxvYXQgKnNhdmVkID0gc2NlLT5zYXZlZDsKKyAgICBjb25zdCBmbG9hdCAqY29uc3Qgd2luZG93ID0gZmZfYWFjX2VsZF93aW5kb3c7CisgICAgZmxvYXQgKmJ1ZiAgPSBhYy0+YnVmX21kY3Q7CisgICAgaW50IGk7CisgICAgY29uc3QgaW50IG4gID0gNTEyOworICAgIGNvbnN0IGludCBuMiA9IG4gPj4gMTsKKyAgICBjb25zdCBpbnQgbjQgPSBuID4+IDI7CisKKyAgICAvLyBJbnZlcnNlIHRyYW5zZm9ybSwgbWFwcGVkIHRvIHRoZSBjb252ZW50aW9uYWwgSU1EQ1QgYnkKKyAgICAvLyBDaGl2dWt1bGEsIFIuSy47IFJlem5paywgWS5BLjsgRGV2YXJhamFuLCBWLiwKKyAgICAvLyAiRWZmaWNpZW50IGFsZ29yaXRobXMgZm9yIE1QRUctNCBBQUMtRUxELCBBQUMtTEQgYW5kIEFBQy1MQyBmaWx0ZXJiYW5rcywiCisgICAgLy8gSW50ZXJuYXRpb25hbCBDb25mZXJlbmNlIG9uIEF1ZGlvLCBMYW5ndWFnZSBhbmQgSW1hZ2UgUHJvY2Vzc2luZywgSUNBTElQIDIwMDguCisgICAgLy8gVVJMOiBodHRwOi8vaWVlZXhwbG9yZS5pZWVlLm9yZy9zdGFtcC9zdGFtcC5qc3A/dHA9JmFybnVtYmVyPTQ1OTAyNDUmaXNudW1iZXI9NDU4OTk1MAorICAgIGZvciAoaSA9IDA7IGkgPCBuMjsgaSs9MikgeworICAgICAgICBmbG9hdCB0ZW1wOworICAgICAgICB0ZW1wID0gIGluW2kgICAgXTsgaW5baSAgICBdID0gLWluW24gLSAxIC0gaV07IGluW24gLSAxIC0gaV0gPSB0ZW1wOworICAgICAgICB0ZW1wID0gLWluW2kgKyAxXTsgaW5baSArIDFdID0gIGluW24gLSAyIC0gaV07IGluW24gLSAyIC0gaV0gPSB0ZW1wOworICAgIH0KKyAgICBhYy0+bWRjdC5pbWRjdF9oYWxmKCZhYy0+bWRjdF9sZCwgYnVmLCBpbik7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrPTIpIHsKKyAgICAgICAgYnVmW2ldID0gLWJ1ZltpXTsKKyAgICB9CisgICAgLy8gTGlrZSB3aXRoIHRoZSByZWd1bGFyIElNRENUIGF0IHRoaXMgcG9pbnQgd2Ugc3RpbGwgaGF2ZSB0aGUgbWlkZGxlIGhhbGYKKyAgICAvLyBvZiBhIHRyYW5zZm9ybSBidXQgd2l0aCBldmVuIHN5bW1ldHJ5IG9uIHRoZSBsZWZ0IGFuZCBvZGQgc3ltbWV0cnkgb24KKyAgICAvLyB0aGUgcmlnaHQKKworICAgIC8vIHdpbmRvdyBvdmVybGFwcGluZworICAgIC8vIFRoZSBzcGVjIHNheXMgdG8gdXNlIHNhbXBsZXMgWzAuLjUxMV0gYnV0IHRoZSByZWZlcmVuY2UgZGVjb2RlciB1c2VzCisgICAgLy8gc2FtcGxlcyBbMTI4Li42MzldLgorICAgIGZvciAoaSA9IG40OyBpIDwgbjI7IGkgKyspIHsKKyAgICAgICAgb3V0W2kgLSBuNF0gPSAgICBidWZbbjIgLSAxIC0gaV0gICAgICAgKiB3aW5kb3dbaSAgICAgICAtIG40XSArCisgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkWyAgICAgIGkgKyBuMl0gICAgICogd2luZG93W2kgKyAgIG4gLSBuNF0gKworICAgICAgICAgICAgICAgICAgICAgIC1zYXZlZFsgIG4gKyBuMiAtIDEgLSBpXSAqIHdpbmRvd1tpICsgMipuIC0gbjRdICsKKyAgICAgICAgICAgICAgICAgICAgICAtc2F2ZWRbMipuICsgbjIgKyBpXSAgICAgKiB3aW5kb3dbaSArIDMqbiAtIG40XTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG4yOyBpICsrKSB7CisgICAgICAgIG91dFtuNCArIGldID0gICAgYnVmW2ldICAgICAgICAgICAgICAgKiB3aW5kb3dbaSArIG4yICAgICAgIC0gbjRdICsKKyAgICAgICAgICAgICAgICAgICAgICAtc2F2ZWRbICAgICAgbiAtIDEgLSBpXSAqIHdpbmRvd1tpICsgbjIgKyAgIG4gLSBuNF0gKworICAgICAgICAgICAgICAgICAgICAgIC1zYXZlZFsgIG4gKyBpXSAgICAgICAgICogd2luZG93W2kgKyBuMiArIDIqbiAtIG40XSArCisgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkWzIqbiArIG4gLSAxIC0gaV0gKiB3aW5kb3dbaSArIG4yICsgMypuIC0gbjRdOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjQ7IGkgKyspIHsKKyAgICAgICAgb3V0W24yICsgbjQgKyBpXSA9ICAgIGJ1ZlsgICAgICBpICsgbjJdICAgICAqIHdpbmRvd1tpICsgICBuIC0gbjRdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zYXZlZFsgICAgICBuMiAtIDEgLSBpXSAqIHdpbmRvd1tpICsgMipuIC0gbjRdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zYXZlZFsgIG4gKyBuMiArIGldICAgICAqIHdpbmRvd1tpICsgMypuIC0gbjRdOworICAgIH0KKworICAgIC8vIGJ1ZmZlciB1cGRhdGUKKyAgICBtZW1tb3ZlKHNhdmVkICsgbiwgc2F2ZWQsIDIgKiBuICogc2l6ZW9mKGZsb2F0KSk7CisgICAgbWVtY3B5KCBzYXZlZCwgICAgICAgYnVmLCAgICAgbiAqIHNpemVvZihmbG9hdCkpOworfQorCisvKioKKyAqIEFwcGx5IGRlcGVuZGVudCBjaGFubmVsIGNvdXBsaW5nIChhcHBsaWVkIGJlZm9yZSBJTURDVCkuCisgKgorICogQHBhcmFtICAgaW5kZXggICBpbmRleCBpbnRvIGNvdXBsaW5nIGdhaW4gYXJyYXkKKyAqLworc3RhdGljIHZvaWQgYXBwbHlfZGVwZW5kZW50X2NvdXBsaW5nKEFBQ0NvbnRleHQgKmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmdsZUNoYW5uZWxFbGVtZW50ICp0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbEVsZW1lbnQgKmNjZSwgaW50IGluZGV4KQoreworICAgIEluZGl2aWR1YWxDaGFubmVsU3RyZWFtICppY3MgPSAmY2NlLT5jaFswXS5pY3M7CisgICAgY29uc3QgdWludDE2X3QgKm9mZnNldHMgPSBpY3MtPnN3Yl9vZmZzZXQ7CisgICAgZmxvYXQgKmRlc3QgPSB0YXJnZXQtPmNvZWZmczsKKyAgICBjb25zdCBmbG9hdCAqc3JjID0gY2NlLT5jaFswXS5jb2VmZnM7CisgICAgaW50IGcsIGksIGdyb3VwLCBrLCBpZHggPSAwOworICAgIGlmIChhYy0+b2NbMV0ubTRhYy5vYmplY3RfdHlwZSA9PSBBT1RfQUFDX0xUUCkgeworICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRGVwZW5kZW50IGNvdXBsaW5nIGlzIG5vdCBzdXBwb3J0ZWQgdG9nZXRoZXIgd2l0aCBMVFBcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoZyA9IDA7IGcgPCBpY3MtPm51bV93aW5kb3dfZ3JvdXBzOyBnKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGljcy0+bWF4X3NmYjsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgaWYgKGNjZS0+Y2hbMF0uYmFuZF90eXBlW2lkeF0gIT0gWkVST19CVCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGdhaW4gPSBjY2UtPmNvdXAuZ2FpbltpbmRleF1baWR4XTsKKyAgICAgICAgICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBpY3MtPmdyb3VwX2xlbltnXTsgZ3JvdXArKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSBvZmZzZXRzW2ldOyBrIDwgb2Zmc2V0c1tpICsgMV07IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFNJTURpZnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZ3JvdXAgKiAxMjggKyBrXSArPSBnYWluICogc3JjW2dyb3VwICogMTI4ICsga107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVzdCArPSBpY3MtPmdyb3VwX2xlbltnXSAqIDEyODsKKyAgICAgICAgc3JjICArPSBpY3MtPmdyb3VwX2xlbltnXSAqIDEyODsKKyAgICB9Cit9CisKKy8qKgorICogQXBwbHkgaW5kZXBlbmRlbnQgY2hhbm5lbCBjb3VwbGluZyAoYXBwbGllZCBhZnRlciBJTURDVCkuCisgKgorICogQHBhcmFtICAgaW5kZXggICBpbmRleCBpbnRvIGNvdXBsaW5nIGdhaW4gYXJyYXkKKyAqLworc3RhdGljIHZvaWQgYXBwbHlfaW5kZXBlbmRlbnRfY291cGxpbmcoQUFDQ29udGV4dCAqYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGVDaGFubmVsRWxlbWVudCAqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbEVsZW1lbnQgKmNjZSwgaW50IGluZGV4KQoreworICAgIGludCBpOworICAgIGNvbnN0IGZsb2F0IGdhaW4gPSBjY2UtPmNvdXAuZ2FpbltpbmRleF1bMF07CisgICAgY29uc3QgZmxvYXQgKnNyYyA9IGNjZS0+Y2hbMF0ucmV0OworICAgIGZsb2F0ICpkZXN0ID0gdGFyZ2V0LT5yZXQ7CisgICAgY29uc3QgaW50IGxlbiA9IDEwMjQgPDwgKGFjLT5vY1sxXS5tNGFjLnNiciA9PSAxKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgZGVzdFtpXSArPSBnYWluICogc3JjW2ldOworfQorCisvKioKKyAqIGNoYW5uZWwgY291cGxpbmcgdHJhbnNmb3JtYXRpb24gaW50ZXJmYWNlCisgKgorICogQHBhcmFtICAgYXBwbHlfY291cGxpbmdfbWV0aG9kICAgcG9pbnRlciB0byAoaW4pZGVwZW5kZW50IGNvdXBsaW5nIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGFwcGx5X2NoYW5uZWxfY291cGxpbmcoQUFDQ29udGV4dCAqYWMsIENoYW5uZWxFbGVtZW50ICpjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBSYXdEYXRhQmxvY2tUeXBlIHR5cGUsIGludCBlbGVtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIENvdXBsaW5nUG9pbnQgY291cGxpbmdfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCphcHBseV9jb3VwbGluZ19tZXRob2QpKEFBQ0NvbnRleHQgKmFjLCBTaW5nbGVDaGFubmVsRWxlbWVudCAqdGFyZ2V0LCBDaGFubmVsRWxlbWVudCAqY2NlLCBpbnQgaW5kZXgpKQoreworICAgIGludCBpLCBjOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9FTEVNX0lEOyBpKyspIHsKKyAgICAgICAgQ2hhbm5lbEVsZW1lbnQgKmNjZSA9IGFjLT5jaGVbVFlQRV9DQ0VdW2ldOworICAgICAgICBpbnQgaW5kZXggPSAwOworCisgICAgICAgIGlmIChjY2UgJiYgY2NlLT5jb3VwLmNvdXBsaW5nX3BvaW50ID09IGNvdXBsaW5nX3BvaW50KSB7CisgICAgICAgICAgICBDaGFubmVsQ291cGxpbmcgKmNvdXAgPSAmY2NlLT5jb3VwOworCisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDw9IGNvdXAtPm51bV9jb3VwbGVkOyBjKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY291cC0+dHlwZVtjXSA9PSB0eXBlICYmIGNvdXAtPmlkX3NlbGVjdFtjXSA9PSBlbGVtX2lkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VwLT5jaF9zZWxlY3RbY10gIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlfY291cGxpbmdfbWV0aG9kKGFjLCAmY2MtPmNoWzBdLCBjY2UsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VwLT5jaF9zZWxlY3RbY10gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VwLT5jaF9zZWxlY3RbY10gIT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5X2NvdXBsaW5nX21ldGhvZChhYywgJmNjLT5jaFsxXSwgY2NlLCBpbmRleCsrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMSArIChjb3VwLT5jaF9zZWxlY3RbY10gPT0gMyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogQ29udmVydCBzcGVjdHJhbCBkYXRhIHRvIGZsb2F0IHNhbXBsZXMsIGFwcGx5aW5nIGFsbCBzdXBwb3J0ZWQgdG9vbHMgYXMgYXBwcm9wcmlhdGUuCisgKi8KK3N0YXRpYyB2b2lkIHNwZWN0cmFsX3RvX3NhbXBsZShBQUNDb250ZXh0ICphYykKK3sKKyAgICBpbnQgaSwgdHlwZTsKKyAgICB2b2lkICgqaW1kY3RfYW5kX3dpbmRvdykoQUFDQ29udGV4dCAqYWMsIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UpOworICAgIHN3aXRjaCAoYWMtPm9jWzFdLm00YWMub2JqZWN0X3R5cGUpIHsKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICAgIGltZGN0X2FuZF93aW5kb3cgPSBpbWRjdF9hbmRfd2luZG93aW5nX2xkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgICBpbWRjdF9hbmRfd2luZG93ID0gaW1kY3RfYW5kX3dpbmRvd2luZ19lbGQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGltZGN0X2FuZF93aW5kb3cgPSBhYy0+aW1kY3RfYW5kX3dpbmRvd2luZzsKKyAgICB9CisgICAgZm9yICh0eXBlID0gMzsgdHlwZSA+PSAwOyB0eXBlLS0pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9FTEVNX0lEOyBpKyspIHsKKyAgICAgICAgICAgIENoYW5uZWxFbGVtZW50ICpjaGUgPSBhYy0+Y2hlW3R5cGVdW2ldOworICAgICAgICAgICAgaWYgKGNoZSAmJiBjaGUtPnByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA8PSBUWVBFX0NQRSkKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlfY2hhbm5lbF9jb3VwbGluZyhhYywgY2hlLCB0eXBlLCBpLCBCRUZPUkVfVE5TLCBhcHBseV9kZXBlbmRlbnRfY291cGxpbmcpOworICAgICAgICAgICAgICAgIGlmIChhYy0+b2NbMV0ubTRhYy5vYmplY3RfdHlwZSA9PSBBT1RfQUFDX0xUUCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hlLT5jaFswXS5pY3MucHJlZGljdG9yX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGUtPmNoWzBdLmljcy5sdHAucHJlc2VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYy0+YXBwbHlfbHRwKGFjLCAmY2hlLT5jaFswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlLT5jaFsxXS5pY3MubHRwLnByZXNlbnQgJiYgdHlwZSA9PSBUWVBFX0NQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYy0+YXBwbHlfbHRwKGFjLCAmY2hlLT5jaFsxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNoZS0+Y2hbMF0udG5zLnByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgIGFjLT5hcHBseV90bnMoY2hlLT5jaFswXS5jb2VmZnMsICZjaGUtPmNoWzBdLnRucywgJmNoZS0+Y2hbMF0uaWNzLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hlLT5jaFsxXS50bnMucHJlc2VudCkKKyAgICAgICAgICAgICAgICAgICAgYWMtPmFwcGx5X3RucyhjaGUtPmNoWzFdLmNvZWZmcywgJmNoZS0+Y2hbMV0udG5zLCAmY2hlLT5jaFsxXS5pY3MsIDEpOworICAgICAgICAgICAgICAgIGlmICh0eXBlIDw9IFRZUEVfQ1BFKQorICAgICAgICAgICAgICAgICAgICBhcHBseV9jaGFubmVsX2NvdXBsaW5nKGFjLCBjaGUsIHR5cGUsIGksIEJFVFdFRU5fVE5TX0FORF9JTURDVCwgYXBwbHlfZGVwZW5kZW50X2NvdXBsaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBUWVBFX0NDRSB8fCBjaGUtPmNvdXAuY291cGxpbmdfcG9pbnQgPT0gQUZURVJfSU1EQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgaW1kY3RfYW5kX3dpbmRvdyhhYywgJmNoZS0+Y2hbMF0pOworICAgICAgICAgICAgICAgICAgICBpZiAoYWMtPm9jWzFdLm00YWMub2JqZWN0X3R5cGUgPT0gQU9UX0FBQ19MVFApCisgICAgICAgICAgICAgICAgICAgICAgICBhYy0+dXBkYXRlX2x0cChhYywgJmNoZS0+Y2hbMF0pOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUWVBFX0NQRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW1kY3RfYW5kX3dpbmRvdyhhYywgJmNoZS0+Y2hbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjLT5vY1sxXS5tNGFjLm9iamVjdF90eXBlID09IEFPVF9BQUNfTFRQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjLT51cGRhdGVfbHRwKGFjLCAmY2hlLT5jaFsxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjLT5vY1sxXS5tNGFjLnNiciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX3Nicl9hcHBseShhYywgJmNoZS0+c2JyLCB0eXBlLCBjaGUtPmNoWzBdLnJldCwgY2hlLT5jaFsxXS5yZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0eXBlIDw9IFRZUEVfQ0NFKQorICAgICAgICAgICAgICAgICAgICBhcHBseV9jaGFubmVsX2NvdXBsaW5nKGFjLCBjaGUsIHR5cGUsIGksIEFGVEVSX0lNRENULCBhcHBseV9pbmRlcGVuZGVudF9jb3VwbGluZyk7CisgICAgICAgICAgICAgICAgY2hlLT5wcmVzZW50ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJDaGFubmVsRWxlbWVudCAlZC4lZCBtaXNzaW5nIFxuIiwgdHlwZSwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYWR0c19mcmFtZV9oZWFkZXIoQUFDQ29udGV4dCAqYWMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBzaXplOworICAgIEFBQ0FEVFNIZWFkZXJJbmZvIGhkcl9pbmZvOworICAgIHVpbnQ4X3QgbGF5b3V0X21hcFtNQVhfRUxFTV9JRCo0XVszXTsKKyAgICBpbnQgbGF5b3V0X21hcF90YWdzLCByZXQ7CisKKyAgICBzaXplID0gYXZwcml2X2FhY19wYXJzZV9oZWFkZXIoZ2IsICZoZHJfaW5mbyk7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIGlmICghYWMtPndhcm5lZF9udW1fYWFjX2ZyYW1lcyAmJiBoZHJfaW5mby5udW1fYWFjX2ZyYW1lcyAhPSAxKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIDIgZm9yICJWTEIgIiBhdWRpbyBpbiBOU1YgZmlsZXMuCisgICAgICAgICAgICAvLyBTZWUgc2FtcGxlcy9uc3YvdmxiX2F1ZGlvLgorICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYWMtPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vcmUgdGhhbiBvbmUgQUFDIFJEQiBwZXIgQURUUyBmcmFtZSIpOworICAgICAgICAgICAgYWMtPndhcm5lZF9udW1fYWFjX2ZyYW1lcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcHVzaF9vdXRwdXRfY29uZmlndXJhdGlvbihhYyk7CisgICAgICAgIGlmIChoZHJfaW5mby5jaGFuX2NvbmZpZykgeworICAgICAgICAgICAgYWMtPm9jWzFdLm00YWMuY2hhbl9jb25maWcgPSBoZHJfaW5mby5jaGFuX2NvbmZpZzsKKyAgICAgICAgICAgIGlmICgocmV0ID0gc2V0X2RlZmF1bHRfY2hhbm5lbF9jb25maWcoYWMtPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGF5b3V0X21hcF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHJfaW5mby5jaGFuX2NvbmZpZykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKChyZXQgPSBvdXRwdXRfY29uZmlndXJlKGFjLCBsYXlvdXRfbWFwLCBsYXlvdXRfbWFwX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNQVgoYWMtPm9jWzFdLnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ19UUklBTF9GUkFNRSksIDApKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFjLT5vY1sxXS5tNGFjLmNoYW5fY29uZmlnID0gMDsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogZHVhbCBtb25vIGZyYW1lcyBpbiBKYXBhbmVzZSBEVFYgY2FuIGhhdmUgY2hhbl9jb25maWcgMAorICAgICAgICAgICAgICogV0lUSE9VVCBzcGVjaWZ5aW5nIFBDRS4KKyAgICAgICAgICAgICAqICB0aHVzLCBzZXQgZHVhbCBtb25vIGFzIGRlZmF1bHQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChhYy0+ZG1vbm9fbW9kZSAmJiBhYy0+b2NbMF0uc3RhdHVzID09IE9DX05PTkUpIHsKKyAgICAgICAgICAgICAgICBsYXlvdXRfbWFwX3RhZ3MgPSAyOworICAgICAgICAgICAgICAgIGxheW91dF9tYXBbMF1bMF0gPSBsYXlvdXRfbWFwWzFdWzBdID0gVFlQRV9TQ0U7CisgICAgICAgICAgICAgICAgbGF5b3V0X21hcFswXVsyXSA9IGxheW91dF9tYXBbMV1bMl0gPSBBQUNfQ0hBTk5FTF9GUk9OVDsKKyAgICAgICAgICAgICAgICBsYXlvdXRfbWFwWzBdWzFdID0gMDsKKyAgICAgICAgICAgICAgICBsYXlvdXRfbWFwWzFdWzFdID0gMTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0X2NvbmZpZ3VyZShhYywgbGF5b3V0X21hcCwgbGF5b3V0X21hcF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DX1RSSUFMX0ZSQU1FLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC03OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFjLT5vY1sxXS5tNGFjLnNhbXBsZV9yYXRlICAgICA9IGhkcl9pbmZvLnNhbXBsZV9yYXRlOworICAgICAgICBhYy0+b2NbMV0ubTRhYy5zYW1wbGluZ19pbmRleCAgPSBoZHJfaW5mby5zYW1wbGluZ19pbmRleDsKKyAgICAgICAgYWMtPm9jWzFdLm00YWMub2JqZWN0X3R5cGUgICAgID0gaGRyX2luZm8ub2JqZWN0X3R5cGU7CisgICAgICAgIGlmIChhYy0+b2NbMF0uc3RhdHVzICE9IE9DX0xPQ0tFRCB8fAorICAgICAgICAgICAgYWMtPm9jWzBdLm00YWMuY2hhbl9jb25maWcgIT0gaGRyX2luZm8uY2hhbl9jb25maWcgfHwKKyAgICAgICAgICAgIGFjLT5vY1swXS5tNGFjLnNhbXBsZV9yYXRlICE9IGhkcl9pbmZvLnNhbXBsZV9yYXRlKSB7CisgICAgICAgICAgICBhYy0+b2NbMV0ubTRhYy5zYnIgPSAtMTsKKyAgICAgICAgICAgIGFjLT5vY1sxXS5tNGFjLnBzICA9IC0xOworICAgICAgICB9CisgICAgICAgIGlmICghaGRyX2luZm8uY3JjX2Fic2VudCkKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTYpOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBhYWNfZGVjb2RlX2VyX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIEFBQ0NvbnRleHQgKmFjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBDaGFubmVsRWxlbWVudCAqY2hlOworICAgIGludCBlcnIsIGk7CisgICAgaW50IHNhbXBsZXMgPSAxMDI0OworICAgIGludCBjaGFuX2NvbmZpZyA9IGFjLT5vY1sxXS5tNGFjLmNoYW5fY29uZmlnOworICAgIGludCBhb3QgPSBhYy0+b2NbMV0ubTRhYy5vYmplY3RfdHlwZTsKKworICAgIGlmIChhb3QgPT0gQU9UX0VSX0FBQ19MRCB8fCBhb3QgPT0gQU9UX0VSX0FBQ19FTEQpCisgICAgICAgIHNhbXBsZXMgPj49IDE7CisKKyAgICBhYy0+ZnJhbWUgPSBkYXRhOworCisgICAgaWYgKChlcnIgPSBmcmFtZV9jb25maWd1cmVfZWxlbWVudHMoYXZjdHgpKSA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAvLyBUaGUgRkZfUFJPRklMRV9BQUNfKiBkZWZpbmVzIGFyZSBhbGwgb2JqZWN0X3R5cGUgLSAxCisgICAgLy8gVGhpcyBtYXkgbGVhZCB0byBhbiB1bmRlZmluZWQgcHJvZmlsZSBiZWluZyBzaWduYWxlZAorICAgIGFjLT5hdmN0eC0+cHJvZmlsZSA9IGFjLT5vY1sxXS5tNGFjLm9iamVjdF90eXBlIC0gMTsKKworICAgIGFjLT50YWdzX21hcHBlZCA9IDA7CisKKyAgICBpZiAoY2hhbl9jb25maWcgPCAwIHx8IGNoYW5fY29uZmlnID49IDgpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiVW5rbm93biBFUiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWMtPm9jWzFdLm00YWMuY2hhbl9jb25maWcpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHRhZ3NfcGVyX2NvbmZpZ1tjaGFuX2NvbmZpZ107IGkrKykgeworICAgICAgICBjb25zdCBpbnQgZWxlbV90eXBlID0gYWFjX2NoYW5uZWxfbGF5b3V0X21hcFtjaGFuX2NvbmZpZy0xXVtpXVswXTsKKyAgICAgICAgY29uc3QgaW50IGVsZW1faWQgICA9IGFhY19jaGFubmVsX2xheW91dF9tYXBbY2hhbl9jb25maWctMV1baV1bMV07CisgICAgICAgIGlmICghKGNoZT1nZXRfY2hlKGFjLCBlbGVtX3R5cGUsIGVsZW1faWQpKSkgeworICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJjaGFubmVsIGVsZW1lbnQgJWQuJWQgaXMgbm90IGFsbG9jYXRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBlbGVtX3R5cGUsIGVsZW1faWQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgY2hlLT5wcmVzZW50ID0gMTsKKyAgICAgICAgaWYgKGFvdCAhPSBBT1RfRVJfQUFDX0VMRCkKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNCk7CisgICAgICAgIHN3aXRjaCAoZWxlbV90eXBlKSB7CisgICAgICAgIGNhc2UgVFlQRV9TQ0U6CisgICAgICAgICAgICBlcnIgPSBkZWNvZGVfaWNzKGFjLCAmY2hlLT5jaFswXSwgZ2IsIDAsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9DUEU6CisgICAgICAgICAgICBlcnIgPSBkZWNvZGVfY3BlKGFjLCBnYiwgY2hlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRZUEVfTEZFOgorICAgICAgICAgICAgZXJyID0gZGVjb2RlX2ljcyhhYywgJmNoZS0+Y2hbMF0sIGdiLCAwLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzcGVjdHJhbF90b19zYW1wbGUoYWMpOworCisgICAgYWMtPmZyYW1lLT5uYl9zYW1wbGVzID0gc2FtcGxlczsKKyAgICBhYy0+ZnJhbWUtPnNhbXBsZV9yYXRlID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHNraXBfYml0c19sb25nKGdiLCBnZXRfYml0c19sZWZ0KGdiKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWFjX2RlY29kZV9mcmFtZV9pbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEdldEJpdENvbnRleHQgKmdiLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQUFDQ29udGV4dCAqYWMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIENoYW5uZWxFbGVtZW50ICpjaGUgPSBOVUxMLCAqY2hlX3ByZXYgPSBOVUxMOworICAgIGVudW0gUmF3RGF0YUJsb2NrVHlwZSBlbGVtX3R5cGUsIGVsZW1fdHlwZV9wcmV2ID0gVFlQRV9FTkQ7CisgICAgaW50IGVyciwgZWxlbV9pZDsKKyAgICBpbnQgc2FtcGxlcyA9IDAsIG11bHRpcGxpZXIsIGF1ZGlvX2ZvdW5kID0gMCwgcGNlX2ZvdW5kID0gMDsKKyAgICBpbnQgaXNfZG1vbm8sIHNjZV9jb3VudCA9IDA7CisKKyAgICBhYy0+ZnJhbWUgPSBkYXRhOworCisgICAgaWYgKHNob3dfYml0cyhnYiwgMTIpID09IDB4ZmZmKSB7CisgICAgICAgIGlmICgoZXJyID0gcGFyc2VfYWR0c19mcmFtZV9oZWFkZXIoYWMsIGdiKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGRlY29kaW5nIEFBQyBmcmFtZSBoZWFkZXIuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWMtPm9jWzFdLm00YWMuc2FtcGxpbmdfaW5kZXggPiAxMikgeworICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBzYW1wbGluZyByYXRlIGluZGV4ICVkXG4iLCBhYy0+b2NbMV0ubTRhYy5zYW1wbGluZ19pbmRleCk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChlcnIgPSBmcmFtZV9jb25maWd1cmVfZWxlbWVudHMoYXZjdHgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIC8vIFRoZSBGRl9QUk9GSUxFX0FBQ18qIGRlZmluZXMgYXJlIGFsbCBvYmplY3RfdHlwZSAtIDEKKyAgICAvLyBUaGlzIG1heSBsZWFkIHRvIGFuIHVuZGVmaW5lZCBwcm9maWxlIGJlaW5nIHNpZ25hbGVkCisgICAgYWMtPmF2Y3R4LT5wcm9maWxlID0gYWMtPm9jWzFdLm00YWMub2JqZWN0X3R5cGUgLSAxOworCisgICAgYWMtPnRhZ3NfbWFwcGVkID0gMDsKKyAgICAvLyBwYXJzZQorICAgIHdoaWxlICgoZWxlbV90eXBlID0gZ2V0X2JpdHMoZ2IsIDMpKSAhPSBUWVBFX0VORCkgeworICAgICAgICBlbGVtX2lkID0gZ2V0X2JpdHMoZ2IsIDQpOworCisgICAgICAgIGlmIChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19TVEFSVENPREUpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkVsZW0gdHlwZToleCBpZDoleFxuIiwgZWxlbV90eXBlLCBlbGVtX2lkKTsKKworICAgICAgICBpZiAoZWxlbV90eXBlIDwgVFlQRV9EU0UpIHsKKyAgICAgICAgICAgIGlmICghKGNoZT1nZXRfY2hlKGFjLCBlbGVtX3R5cGUsIGVsZW1faWQpKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNoYW5uZWwgZWxlbWVudCAlZC4lZCBpcyBub3QgYWxsb2NhdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBlbGVtX3R5cGUsIGVsZW1faWQpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2FtcGxlcyA9IDEwMjQ7CisgICAgICAgICAgICBjaGUtPnByZXNlbnQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChlbGVtX3R5cGUpIHsKKworICAgICAgICBjYXNlIFRZUEVfU0NFOgorICAgICAgICAgICAgZXJyID0gZGVjb2RlX2ljcyhhYywgJmNoZS0+Y2hbMF0sIGdiLCAwLCAwKTsKKyAgICAgICAgICAgIGF1ZGlvX2ZvdW5kID0gMTsKKyAgICAgICAgICAgIHNjZV9jb3VudCsrOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUWVBFX0NQRToKKyAgICAgICAgICAgIGVyciA9IGRlY29kZV9jcGUoYWMsIGdiLCBjaGUpOworICAgICAgICAgICAgYXVkaW9fZm91bmQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUWVBFX0NDRToKKyAgICAgICAgICAgIGVyciA9IGRlY29kZV9jY2UoYWMsIGdiLCBjaGUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUWVBFX0xGRToKKyAgICAgICAgICAgIGVyciA9IGRlY29kZV9pY3MoYWMsICZjaGUtPmNoWzBdLCBnYiwgMCwgMCk7CisgICAgICAgICAgICBhdWRpb19mb3VuZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRZUEVfRFNFOgorICAgICAgICAgICAgZXJyID0gc2tpcF9kYXRhX3N0cmVhbV9lbGVtZW50KGFjLCBnYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRZUEVfUENFOiB7CisgICAgICAgICAgICB1aW50OF90IGxheW91dF9tYXBbTUFYX0VMRU1fSUQqNF1bM107CisgICAgICAgICAgICBpbnQgdGFnczsKKyAgICAgICAgICAgIHB1c2hfb3V0cHV0X2NvbmZpZ3VyYXRpb24oYWMpOworICAgICAgICAgICAgdGFncyA9IGRlY29kZV9wY2UoYXZjdHgsICZhYy0+b2NbMV0ubTRhYywgbGF5b3V0X21hcCwgZ2IpOworICAgICAgICAgICAgaWYgKHRhZ3MgPCAwKSB7CisgICAgICAgICAgICAgICAgZXJyID0gdGFnczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwY2VfZm91bmQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBldmFsdWF0aW5nIGEgZnVydGhlciBwcm9ncmFtX2NvbmZpZ19lbGVtZW50IGFzIHRoaXMgY29uc3RydWN0IGlzIGR1YmlvdXMgYXQgYmVzdC5cbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBvdXRwdXRfY29uZmlndXJlKGFjLCBsYXlvdXRfbWFwLCB0YWdzLCBPQ19UUklBTF9QQ0UsIDEpOworICAgICAgICAgICAgICAgIGlmICghZXJyKQorICAgICAgICAgICAgICAgICAgICBhYy0+b2NbMV0ubTRhYy5jaGFuX2NvbmZpZyA9IDA7CisgICAgICAgICAgICAgICAgcGNlX2ZvdW5kID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBUWVBFX0ZJTDoKKyAgICAgICAgICAgIGlmIChlbGVtX2lkID09IDE1KQorICAgICAgICAgICAgICAgIGVsZW1faWQgKz0gZ2V0X2JpdHMoZ2IsIDgpIC0gMTsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDggKiBlbGVtX2lkKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVFlQRV9GSUw6ICJvdmVycmVhZF9lcnIpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoZWxlbV9pZCA+IDApCisgICAgICAgICAgICAgICAgZWxlbV9pZCAtPSBkZWNvZGVfZXh0ZW5zaW9uX3BheWxvYWQoYWMsIGdiLCBlbGVtX2lkLCBjaGVfcHJldiwgZWxlbV90eXBlX3ByZXYpOworICAgICAgICAgICAgZXJyID0gMDsgLyogRklYTUUgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SX0JVRzsgLyogc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBrZWVwcyBjb21waWxlciBoYXBweSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjaGVfcHJldiAgICAgICA9IGNoZTsKKyAgICAgICAgZWxlbV90eXBlX3ByZXYgPSBlbGVtX3R5cGU7CisKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgb3ZlcnJlYWRfZXJyKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcGVjdHJhbF90b19zYW1wbGUoYWMpOworCisgICAgbXVsdGlwbGllciA9IChhYy0+b2NbMV0ubTRhYy5zYnIgPT0gMSkgPyBhYy0+b2NbMV0ubTRhYy5leHRfc2FtcGxlX3JhdGUgPiBhYy0+b2NbMV0ubTRhYy5zYW1wbGVfcmF0ZSA6IDA7CisgICAgc2FtcGxlcyA8PD0gbXVsdGlwbGllcjsKKworICAgIGlmIChhYy0+b2NbMV0uc3RhdHVzICYmIGF1ZGlvX2ZvdW5kKSB7CisgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IGFjLT5vY1sxXS5tNGFjLnNhbXBsZV9yYXRlIDw8IG11bHRpcGxpZXI7CisgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gc2FtcGxlczsKKyAgICAgICAgYWMtPm9jWzFdLnN0YXR1cyA9IE9DX0xPQ0tFRDsKKyAgICB9CisKKyAgICBpZiAobXVsdGlwbGllcikgeworICAgICAgICBpbnQgc2lkZV9zaXplOworICAgICAgICBjb25zdCB1aW50OF90ICpzaWRlID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1NLSVBfU0FNUExFUywgJnNpZGVfc2l6ZSk7CisgICAgICAgIGlmIChzaWRlICYmIHNpZGVfc2l6ZT49NCkKKyAgICAgICAgICAgIEFWX1dMMzIoc2lkZSwgMipBVl9STDMyKHNpZGUpKTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9ICEhc2FtcGxlczsKKyAgICBpZiAoc2FtcGxlcykgeworICAgICAgICBhYy0+ZnJhbWUtPm5iX3NhbXBsZXMgPSBzYW1wbGVzOworICAgICAgICBhYy0+ZnJhbWUtPnNhbXBsZV9yYXRlID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIH0gZWxzZQorICAgICAgICBhdl9mcmFtZV91bnJlZihhYy0+ZnJhbWUpOworICAgICpnb3RfZnJhbWVfcHRyID0gISFzYW1wbGVzOworCisgICAgLyogZm9yIGR1YWwtbW9ubyBhdWRpbyAoU0NFICsgU0NFKSAqLworICAgIGlzX2Rtb25vID0gYWMtPmRtb25vX21vZGUgJiYgc2NlX2NvdW50ID09IDIgJiYKKyAgICAgICAgICAgICAgIGFjLT5vY1sxXS5jaGFubmVsX2xheW91dCA9PSAoQVZfQ0hfRlJPTlRfTEVGVCB8IEFWX0NIX0ZST05UX1JJR0hUKTsKKyAgICBpZiAoaXNfZG1vbm8pIHsKKyAgICAgICAgaWYgKGFjLT5kbW9ub19tb2RlID09IDEpCisgICAgICAgICAgICAoKEFWRnJhbWUgKilkYXRhKS0+ZGF0YVsxXSA9KChBVkZyYW1lICopZGF0YSktPmRhdGFbMF07CisgICAgICAgIGVsc2UgaWYgKGFjLT5kbW9ub19tb2RlID09IDIpCisgICAgICAgICAgICAoKEFWRnJhbWUgKilkYXRhKS0+ZGF0YVswXSA9KChBVkZyYW1lICopZGF0YSktPmRhdGFbMV07CisgICAgfQorCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIHBvcF9vdXRwdXRfY29uZmlndXJhdGlvbihhYyk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhYWNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBQUNDb250ZXh0ICphYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgYnVmX2NvbnN1bWVkOworICAgIGludCBidWZfb2Zmc2V0OworICAgIGludCBlcnI7CisgICAgaW50IG5ld19leHRyYWRhdGFfc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpuZXdfZXh0cmFkYXRhID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9ORVdfRVhUUkFEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19leHRyYWRhdGFfc2l6ZSk7CisgICAgaW50IGpwX2R1YWxtb25vX3NpemU7CisgICAgY29uc3QgdWludDhfdCAqanBfZHVhbG1vbm8gICA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfSlBfRFVBTE1PTk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmanBfZHVhbG1vbm9fc2l6ZSk7CisKKyAgICBpZiAobmV3X2V4dHJhZGF0YSAmJiAwKSB7CisgICAgICAgIGF2X2ZyZWUoYXZjdHgtPmV4dHJhZGF0YSk7CisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KG5ld19leHRyYWRhdGFfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSBuZXdfZXh0cmFkYXRhX3NpemU7CisgICAgICAgIG1lbWNweShhdmN0eC0+ZXh0cmFkYXRhLCBuZXdfZXh0cmFkYXRhLCBuZXdfZXh0cmFkYXRhX3NpemUpOworICAgICAgICBwdXNoX291dHB1dF9jb25maWd1cmF0aW9uKGFjKTsKKyAgICAgICAgaWYgKGRlY29kZV9hdWRpb19zcGVjaWZpY19jb25maWcoYWMsIGFjLT5hdmN0eCwgJmFjLT5vY1sxXS5tNGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUqOCwgMSkgPCAwKSB7CisgICAgICAgICAgICBwb3Bfb3V0cHV0X2NvbmZpZ3VyYXRpb24oYWMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhYy0+ZG1vbm9fbW9kZSA9IDA7CisgICAgaWYgKGpwX2R1YWxtb25vICYmIGpwX2R1YWxtb25vX3NpemUgPiAwKQorICAgICAgICBhYy0+ZG1vbm9fbW9kZSA9ICAxICsgKmpwX2R1YWxtb25vOworICAgIGlmIChhYy0+Zm9yY2VfZG1vbm9fbW9kZSA+PSAwKQorICAgICAgICBhYy0+ZG1vbm9fbW9kZSA9IGFjLT5mb3JjZV9kbW9ub19tb2RlOworCisgICAgaWYgKElOVF9NQVggLyA4IDw9IGJ1Zl9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICgoZXJyID0gaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgYnVmX3NpemUgKiA4KSkgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgc3dpdGNoIChhYy0+b2NbMV0ubTRhYy5vYmplY3RfdHlwZSkgeworICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9FUl9BQUNfTFRQOgorICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgICBlcnIgPSBhYWNfZGVjb2RlX2VyX2ZyYW1lKGF2Y3R4LCBkYXRhLCBnb3RfZnJhbWVfcHRyLCAmZ2IpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBlcnIgPSBhYWNfZGVjb2RlX2ZyYW1lX2ludChhdmN0eCwgZGF0YSwgZ290X2ZyYW1lX3B0ciwgJmdiLCBhdnBrdCk7CisgICAgfQorICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgYnVmX2NvbnN1bWVkID0gKGdldF9iaXRzX2NvdW50KCZnYikgKyA3KSA+PiAzOworICAgIGZvciAoYnVmX29mZnNldCA9IGJ1Zl9jb25zdW1lZDsgYnVmX29mZnNldCA8IGJ1Zl9zaXplOyBidWZfb2Zmc2V0KyspCisgICAgICAgIGlmIChidWZbYnVmX29mZnNldF0pCisgICAgICAgICAgICBicmVhazsKKworICAgIHJldHVybiBidWZfc2l6ZSA+IGJ1Zl9vZmZzZXQgPyBidWZfY29uc3VtZWQgOiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFhY19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFBQ0NvbnRleHQgKmFjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgdHlwZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRUxFTV9JRDsgaSsrKSB7CisgICAgICAgIGZvciAodHlwZSA9IDA7IHR5cGUgPCA0OyB0eXBlKyspIHsKKyAgICAgICAgICAgIGlmIChhYy0+Y2hlW3R5cGVdW2ldKQorICAgICAgICAgICAgICAgIGZmX2FhY19zYnJfY3R4X2Nsb3NlKCZhYy0+Y2hlW3R5cGVdW2ldLT5zYnIpOworICAgICAgICAgICAgYXZfZnJlZXAoJmFjLT5jaGVbdHlwZV1baV0pOworICAgICAgICB9CisgICAgfQorCisgICAgZmZfbWRjdF9lbmQoJmFjLT5tZGN0KTsKKyAgICBmZl9tZGN0X2VuZCgmYWMtPm1kY3Rfc21hbGwpOworICAgIGZmX21kY3RfZW5kKCZhYy0+bWRjdF9sZCk7CisgICAgZmZfbWRjdF9lbmQoJmFjLT5tZGN0X2x0cCk7CisgICAgYXZfZnJlZXAoJmFjLT5mZHNwKTsKKyAgICByZXR1cm4gMDsKK30KKworCisjZGVmaW5lIExPQVNfU1lOQ19XT1JEICAgMHgyYjcgICAgICAgLy8vPCAxMSBiaXRzIExPQVMgc3luYyB3b3JkCisKK3N0cnVjdCBMQVRNQ29udGV4dCB7CisgICAgQUFDQ29udGV4dCBhYWNfY3R4OyAgICAgLy8vPCBjb250YWluaW5nIEFBQ0NvbnRleHQKKyAgICBpbnQgaW5pdGlhbGl6ZWQ7ICAgICAgICAvLy88IGluaXRpYWxpemVkIGFmdGVyIGEgdmFsaWQgZXh0cmFkYXRhIHdhcyBzZWVuCisKKyAgICAvLyBwYXJzZXIgZGF0YQorICAgIGludCBhdWRpb19tdXhfdmVyc2lvbl9BOyAvLy88IExBVE0gc3ludGF4IHZlcnNpb24KKyAgICBpbnQgZnJhbWVfbGVuZ3RoX3R5cGU7ICAgLy8vPCAwLzEgdmFyaWFibGUvZml4ZWQgZnJhbWUgbGVuZ3RoCisgICAgaW50IGZyYW1lX2xlbmd0aDsgICAgICAgIC8vLzwgZnJhbWUgbGVuZ3RoIGZvciBmaXhlZCBmcmFtZSBsZW5ndGgKK307CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbGF0bV9nZXRfdmFsdWUoR2V0Qml0Q29udGV4dCAqYikKK3sKKyAgICBpbnQgbGVuZ3RoID0gZ2V0X2JpdHMoYiwgMik7CisKKyAgICByZXR1cm4gZ2V0X2JpdHNfbG9uZyhiLCAobGVuZ3RoKzEpKjgpOworfQorCitzdGF0aWMgaW50IGxhdG1fZGVjb2RlX2F1ZGlvX3NwZWNpZmljX2NvbmZpZyhzdHJ1Y3QgTEFUTUNvbnRleHQgKmxhdG1jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYiwgaW50IGFzY2xlbikKK3sKKyAgICBBQUNDb250ZXh0ICphYyAgICAgICAgPSAmbGF0bWN0eC0+YWFjX2N0eDsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBhYy0+YXZjdHg7CisgICAgTVBFRzRBdWRpb0NvbmZpZyBtNGFjID0geyAwIH07CisgICAgaW50IGNvbmZpZ19zdGFydF9iaXQgID0gZ2V0X2JpdHNfY291bnQoZ2IpOworICAgIGludCBzeW5jX2V4dGVuc2lvbiAgICA9IDA7CisgICAgaW50IGJpdHNfY29uc3VtZWQsIGVzaXplOworCisgICAgaWYgKGFzY2xlbikgeworICAgICAgICBzeW5jX2V4dGVuc2lvbiA9IDE7CisgICAgICAgIGFzY2xlbiAgICAgICAgID0gRkZNSU4oYXNjbGVuLCBnZXRfYml0c19sZWZ0KGdiKSk7CisgICAgfSBlbHNlCisgICAgICAgIGFzY2xlbiAgICAgICAgID0gZ2V0X2JpdHNfbGVmdChnYik7CisKKyAgICBpZiAoY29uZmlnX3N0YXJ0X2JpdCAlIDgpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGxhdG1jdHgtPmFhY19jdHguYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLWJ5dGUtYWxpZ25lZCBhdWRpby1zcGVjaWZpYyBjb25maWciKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAoYXNjbGVuIDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGJpdHNfY29uc3VtZWQgPSBkZWNvZGVfYXVkaW9fc3BlY2lmaWNfY29uZmlnKE5VTEwsIGF2Y3R4LCAmbTRhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ItPmJ1ZmZlciArIChjb25maWdfc3RhcnRfYml0IC8gOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY2xlbiwgc3luY19leHRlbnNpb24pOworCisgICAgaWYgKGJpdHNfY29uc3VtZWQgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICghbGF0bWN0eC0+aW5pdGlhbGl6ZWQgfHwKKyAgICAgICAgYWMtPm9jWzFdLm00YWMuc2FtcGxlX3JhdGUgIT0gbTRhYy5zYW1wbGVfcmF0ZSB8fAorICAgICAgICBhYy0+b2NbMV0ubTRhYy5jaGFuX2NvbmZpZyAhPSBtNGFjLmNoYW5fY29uZmlnKSB7CisKKyAgICAgICAgaWYobGF0bWN0eC0+aW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJhdWRpbyBjb25maWcgY2hhbmdlZFxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImluaXRpYWxpemluZyBsYXRtY3R4XG4iKTsKKyAgICAgICAgfQorICAgICAgICBsYXRtY3R4LT5pbml0aWFsaXplZCA9IDA7CisKKyAgICAgICAgZXNpemUgPSAoYml0c19jb25zdW1lZCs3KSAvIDg7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IGVzaXplKSB7CisgICAgICAgICAgICBhdl9mcmVlKGF2Y3R4LT5leHRyYWRhdGEpOworICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvYyhlc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSBlc2l6ZTsKKyAgICAgICAgbWVtY3B5KGF2Y3R4LT5leHRyYWRhdGEsIGdiLT5idWZmZXIgKyAoY29uZmlnX3N0YXJ0X2JpdC84KSwgZXNpemUpOworICAgICAgICBtZW1zZXQoYXZjdHgtPmV4dHJhZGF0YStlc2l6ZSwgMCwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgfQorICAgIHNraXBfYml0c19sb25nKGdiLCBiaXRzX2NvbnN1bWVkKTsKKworICAgIHJldHVybiBiaXRzX2NvbnN1bWVkOworfQorCitzdGF0aWMgaW50IHJlYWRfc3RyZWFtX211eF9jb25maWcoc3RydWN0IExBVE1Db250ZXh0ICpsYXRtY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCByZXQsIGF1ZGlvX211eF92ZXJzaW9uID0gZ2V0X2JpdHMoZ2IsIDEpOworCisgICAgbGF0bWN0eC0+YXVkaW9fbXV4X3ZlcnNpb25fQSA9IDA7CisgICAgaWYgKGF1ZGlvX211eF92ZXJzaW9uKQorICAgICAgICBsYXRtY3R4LT5hdWRpb19tdXhfdmVyc2lvbl9BID0gZ2V0X2JpdHMoZ2IsIDEpOworCisgICAgaWYgKCFsYXRtY3R4LT5hdWRpb19tdXhfdmVyc2lvbl9BKSB7CisKKyAgICAgICAgaWYgKGF1ZGlvX211eF92ZXJzaW9uKQorICAgICAgICAgICAgbGF0bV9nZXRfdmFsdWUoZ2IpOyAgICAgICAgICAgICAgICAgLy8gdGFyYUZ1bGxuZXNzCisKKyAgICAgICAgc2tpcF9iaXRzKGdiLCAxKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbFN0cmVhbVNhbWVUaW1lRnJhbWluZworICAgICAgICBza2lwX2JpdHMoZ2IsIDYpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbnVtU3ViRnJhbWVzCisgICAgICAgIC8vIG51bVByb2dyYW1zCisgICAgICAgIGlmIChnZXRfYml0cyhnYiwgNCkpIHsgICAgICAgICAgICAgICAgICAvLyBudW1Qcm9ncmFtcworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGxhdG1jdHgtPmFhY19jdHguYXZjdHgsICJNdWx0aXBsZSBwcm9ncmFtcyIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yIGVhY2ggcHJvZ3JhbSAod2hpY2ggdGhlcmUgaXMgb25seSBvbmUgaW4gRFZCKQorCisgICAgICAgIC8vIGZvciBlYWNoIGxheWVyICh3aGljaCB0aGVyZSBpcyBvbmx5IG9uZSBpbiBEVkIpCisgICAgICAgIGlmIChnZXRfYml0cyhnYiwgMykpIHsgICAgICAgICAgICAgICAgICAgLy8gbnVtTGF5ZXIKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShsYXRtY3R4LT5hYWNfY3R4LmF2Y3R4LCAiTXVsdGlwbGUgbGF5ZXJzIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3IgYWxsIGJ1dCBmaXJzdCBzdHJlYW06IHVzZV9zYW1lX2NvbmZpZyA9IGdldF9iaXRzKGdiLCAxKTsKKyAgICAgICAgaWYgKCFhdWRpb19tdXhfdmVyc2lvbikgeworICAgICAgICAgICAgaWYgKChyZXQgPSBsYXRtX2RlY29kZV9hdWRpb19zcGVjaWZpY19jb25maWcobGF0bWN0eCwgZ2IsIDApKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBhc2NMZW4gPSBsYXRtX2dldF92YWx1ZShnYik7CisgICAgICAgICAgICBpZiAoKHJldCA9IGxhdG1fZGVjb2RlX2F1ZGlvX3NwZWNpZmljX2NvbmZpZyhsYXRtY3R4LCBnYiwgYXNjTGVuKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBhc2NMZW4gLT0gcmV0OworICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGFzY0xlbik7CisgICAgICAgIH0KKworICAgICAgICBsYXRtY3R4LT5mcmFtZV9sZW5ndGhfdHlwZSA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgc3dpdGNoIChsYXRtY3R4LT5mcmFtZV9sZW5ndGhfdHlwZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDgpOyAgICAgICAvLyBsYXRtQnVmZmVyRnVsbG5lc3MKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBsYXRtY3R4LT5mcmFtZV9sZW5ndGggPSBnZXRfYml0cyhnYiwgOSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNik7ICAgICAgIC8vIENFTFAgZnJhbWUgbGVuZ3RoIHRhYmxlIGluZGV4CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDEpOyAgICAgICAvLyBIVlhDIGZyYW1lIGxlbmd0aCB0YWJsZSBpbmRleAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0X2JpdHMoZ2IsIDEpKSB7ICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgZGF0YQorICAgICAgICAgICAgaWYgKGF1ZGlvX211eF92ZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgbGF0bV9nZXRfdmFsdWUoZ2IpOyAgICAgICAgICAgICAvLyBvdGhlcl9kYXRhX2JpdHMKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGVzYzsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGVzYyA9IGdldF9iaXRzKGdiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChlc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldF9iaXRzKGdiLCAxKSkgICAgICAgICAgICAgICAgICAgICAvLyBjcmMgcHJlc2VudAorICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA4KTsgICAgICAgICAgICAgICAgICAgIC8vIGNvbmZpZ19jcmMKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3BheWxvYWRfbGVuZ3RoX2luZm8oc3RydWN0IExBVE1Db250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIHVpbnQ4X3QgdG1wOworCisgICAgaWYgKGN0eC0+ZnJhbWVfbGVuZ3RoX3R5cGUgPT0gMCkgeworICAgICAgICBpbnQgbXV4X3Nsb3RfbGVuZ3RoID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgdG1wID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgbXV4X3Nsb3RfbGVuZ3RoICs9IHRtcDsKKyAgICAgICAgfSB3aGlsZSAodG1wID09IDI1NSk7CisgICAgICAgIHJldHVybiBtdXhfc2xvdF9sZW5ndGg7CisgICAgfSBlbHNlIGlmIChjdHgtPmZyYW1lX2xlbmd0aF90eXBlID09IDEpIHsKKyAgICAgICAgcmV0dXJuIGN0eC0+ZnJhbWVfbGVuZ3RoOworICAgIH0gZWxzZSBpZiAoY3R4LT5mcmFtZV9sZW5ndGhfdHlwZSA9PSAzIHx8CisgICAgICAgICAgICAgICBjdHgtPmZyYW1lX2xlbmd0aF90eXBlID09IDUgfHwKKyAgICAgICAgICAgICAgIGN0eC0+ZnJhbWVfbGVuZ3RoX3R5cGUgPT0gNykgeworICAgICAgICBza2lwX2JpdHMoZ2IsIDIpOyAgICAgICAgICAvLyBtdXhfc2xvdF9sZW5ndGhfY29kZWQKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9hdWRpb19tdXhfZWxlbWVudChzdHJ1Y3QgTEFUTUNvbnRleHQgKmxhdG1jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IGVycjsKKyAgICB1aW50OF90IHVzZV9zYW1lX211eCA9IGdldF9iaXRzKGdiLCAxKTsKKyAgICBpZiAoIXVzZV9zYW1lX211eCkgeworICAgICAgICBpZiAoKGVyciA9IHJlYWRfc3RyZWFtX211eF9jb25maWcobGF0bWN0eCwgZ2IpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0gZWxzZSBpZiAoIWxhdG1jdHgtPmFhY19jdHguYXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICBhdl9sb2cobGF0bWN0eC0+YWFjX2N0eC5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgIm5vIGRlY29kZXIgY29uZmlnIGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisgICAgaWYgKGxhdG1jdHgtPmF1ZGlvX211eF92ZXJzaW9uX0EgPT0gMCkgeworICAgICAgICBpbnQgbXV4X3Nsb3RfbGVuZ3RoX2J5dGVzID0gcmVhZF9wYXlsb2FkX2xlbmd0aF9pbmZvKGxhdG1jdHgsIGdiKTsKKyAgICAgICAgaWYgKG11eF9zbG90X2xlbmd0aF9ieXRlcyAqIDggPiBnZXRfYml0c19sZWZ0KGdiKSkgeworICAgICAgICAgICAgYXZfbG9nKGxhdG1jdHgtPmFhY19jdHguYXZjdHgsIEFWX0xPR19FUlJPUiwgImluY29tcGxldGUgZnJhbWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0gZWxzZSBpZiAobXV4X3Nsb3RfbGVuZ3RoX2J5dGVzICogOCArIDI1NiA8IGdldF9iaXRzX2xlZnQoZ2IpKSB7CisgICAgICAgICAgICBhdl9sb2cobGF0bWN0eC0+YWFjX2N0eC5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJmcmFtZSBsZW5ndGggbWlzbWF0Y2ggJWQgPDwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgbXV4X3Nsb3RfbGVuZ3RoX2J5dGVzICogOCwgZ2V0X2JpdHNfbGVmdChnYikpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBsYXRtX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgc3RydWN0IExBVE1Db250ZXh0ICpsYXRtY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG11eGxlbmd0aCwgZXJyOworICAgIEdldEJpdENvbnRleHQgICAgICAgZ2I7CisKKyAgICBpZiAoKGVyciA9IGluaXRfZ2V0X2JpdHM4KCZnYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgLy8gY2hlY2sgZm9yIExPQVMgc3luYyB3b3JkCisgICAgaWYgKGdldF9iaXRzKCZnYiwgMTEpICE9IExPQVNfU1lOQ19XT1JEKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIG11eGxlbmd0aCA9IGdldF9iaXRzKCZnYiwgMTMpICsgMzsKKyAgICAvLyBub3QgZW5vdWdoIGRhdGEsIHRoZSBwYXJzZXIgc2hvdWxkIGhhdmUgc29ydGVkIHRoaXMgb3V0CisgICAgaWYgKG11eGxlbmd0aCA+IGF2cGt0LT5zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICgoZXJyID0gcmVhZF9hdWRpb19tdXhfZWxlbWVudChsYXRtY3R4LCAmZ2IpKSA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBpZiAoIWxhdG1jdHgtPmluaXRpYWxpemVkKSB7CisgICAgICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICAgICAgcmV0dXJuIGF2cGt0LT5zaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHVzaF9vdXRwdXRfY29uZmlndXJhdGlvbigmbGF0bWN0eC0+YWFjX2N0eCk7CisgICAgICAgICAgICBpZiAoKGVyciA9IGRlY29kZV9hdWRpb19zcGVjaWZpY19jb25maWcoCisgICAgICAgICAgICAgICAgICAgICZsYXRtY3R4LT5hYWNfY3R4LCBhdmN0eCwgJmxhdG1jdHgtPmFhY19jdHgub2NbMV0ubTRhYywKKyAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKjgsIDEpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBwb3Bfb3V0cHV0X2NvbmZpZ3VyYXRpb24oJmxhdG1jdHgtPmFhY19jdHgpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXRtY3R4LT5pbml0aWFsaXplZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2hvd19iaXRzKCZnYiwgMTIpID09IDB4ZmZmKSB7CisgICAgICAgIGF2X2xvZyhsYXRtY3R4LT5hYWNfY3R4LmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQURUUyBoZWFkZXIgZGV0ZWN0ZWQsIHByb2JhYmx5IGFzIHJlc3VsdCBvZiBjb25maWd1cmF0aW9uICIKKyAgICAgICAgICAgICAgICJtaXNwYXJzaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBhYWNfZGVjb2RlX2ZyYW1lX2ludChhdmN0eCwgb3V0LCBnb3RfZnJhbWVfcHRyLCAmZ2IsIGF2cGt0KSkgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIG11eGxlbmd0aDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxhdG1fZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHN0cnVjdCBMQVRNQ29udGV4dCAqbGF0bWN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldCA9IGFhY19kZWNvZGVfaW5pdChhdmN0eCk7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID4gMCkKKyAgICAgICAgbGF0bWN0eC0+aW5pdGlhbGl6ZWQgPSAhcmV0OworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYWFjZGVjX2luaXQoQUFDQ29udGV4dCAqYykKK3sKKyAgICBjLT5pbWRjdF9hbmRfd2luZG93aW5nICAgICAgICAgICAgICAgICAgICAgID0gaW1kY3RfYW5kX3dpbmRvd2luZzsKKyAgICBjLT5hcHBseV9sdHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXBwbHlfbHRwOworICAgIGMtPmFwcGx5X3RucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBhcHBseV90bnM7CisgICAgYy0+d2luZG93aW5nX2FuZF9tZGN0X2x0cCAgICAgICAgICAgICAgICAgICA9IHdpbmRvd2luZ19hbmRfbWRjdF9sdHA7CisgICAgYy0+dXBkYXRlX2x0cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHVwZGF0ZV9sdHA7CisKKyAgICBpZihBUkNIX01JUFMpCisgICAgICAgIGZmX2FhY2RlY19pbml0X21pcHMoYyk7Cit9CisvKioKKyAqIEFWT3B0aW9ucyBmb3IgSmFwYW5lc2UgRFRWIHNwZWNpZmljIGV4dGVuc2lvbnMgKEFEVFMgb25seSkKKyAqLworI2RlZmluZSBBQUNERUNfRkxBR1MgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19BVURJT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ImR1YWxfbW9ub19tb2RlIiwgIlNlbGVjdCB0aGUgY2hhbm5lbCB0byBkZWNvZGUgZm9yIGR1YWwgbW9ubyIsCisgICAgIG9mZnNldG9mKEFBQ0NvbnRleHQsIGZvcmNlX2Rtb25vX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PS0xfSwgLTEsIDIsCisgICAgIEFBQ0RFQ19GTEFHUywgImR1YWxfbW9ub19tb2RlIn0sCisKKyAgICB7ImF1dG8iLCAiYXV0b3NlbGVjdGlvbiIsICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PS0xfSwgSU5UX01JTiwgSU5UX01BWCwgQUFDREVDX0ZMQUdTLCAiZHVhbF9tb25vX21vZGUifSwKKyAgICB7Im1haW4iLCAiU2VsZWN0IE1haW4vTGVmdCBjaGFubmVsIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PSAxfSwgSU5UX01JTiwgSU5UX01BWCwgQUFDREVDX0ZMQUdTLCAiZHVhbF9tb25vX21vZGUifSwKKyAgICB7InN1YiIgLCAiU2VsZWN0IFN1Yi9SaWdodCBjaGFubmVsIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PSAyfSwgSU5UX01JTiwgSU5UX01BWCwgQUFDREVDX0ZMQUdTLCAiZHVhbF9tb25vX21vZGUifSwKKyAgICB7ImJvdGgiLCAiU2VsZWN0IGJvdGggY2hhbm5lbHMiLCAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PSAwfSwgSU5UX01JTiwgSU5UX01BWCwgQUFDREVDX0ZMQUdTLCAiZHVhbF9tb25vX21vZGUifSwKKworICAgIHtOVUxMfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGFhY19kZWNvZGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIkFBQyBkZWNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVlByb2ZpbGUgcHJvZmlsZXNbXSA9IHsKKyAgICB7IEZGX1BST0ZJTEVfQUFDX01BSU4sICAiTWFpbiIgICAgIH0sCisgICAgeyBGRl9QUk9GSUxFX0FBQ19MT1csICAgIkxDIiAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9BQUNfU1NSLCAgICJTU1IiICAgICAgfSwKKyAgICB7IEZGX1BST0ZJTEVfQUFDX0xUUCwgICAiTFRQIiAgICAgIH0sCisgICAgeyBGRl9QUk9GSUxFX0FBQ19IRSwgICAgIkhFLUFBQyIgICB9LAorICAgIHsgRkZfUFJPRklMRV9BQUNfSEVfVjIsICJIRS1BQUN2MiIgfSwKKyAgICB7IEZGX1BST0ZJTEVfQUFDX0xELCAgICAiTEQiICAgICAgIH0sCisgICAgeyBGRl9QUk9GSUxFX0FBQ19FTEQsICAgIkVMRCIgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9VTktOT1dOIH0sCit9OworCitBVkNvZGVjIGZmX2FhY19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgPSAiYWFjIiwKKyAgICAubG9uZ19uYW1lICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFBQyAoQWR2YW5jZWQgQXVkaW8gQ29kaW5nKSIpLAorICAgIC50eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FBQywKKyAgICAucHJpdl9kYXRhX3NpemUgID0gc2l6ZW9mKEFBQ0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgPSBhYWNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgICA9IGFhY19kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgICA9IGFhY19kZWNvZGVfZnJhbWUsCisgICAgLnNhbXBsZV9mbXRzICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFRQLCBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9LAorICAgIC5jYXBhYmlsaXRpZXMgICAgPSBDT0RFQ19DQVBfQ0hBTk5FTF9DT05GIHwgQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2hhbm5lbF9sYXlvdXRzID0gYWFjX2NoYW5uZWxfbGF5b3V0LAorICAgIC5mbHVzaCA9IGZsdXNoLAorICAgIC5wcml2X2NsYXNzICAgICAgPSAmYWFjX2RlY29kZXJfY2xhc3MsCisgICAgLnByb2ZpbGVzICAgICAgICA9IHByb2ZpbGVzLAorfTsKKworLyoKKyAgICBOb3RlOiBUaGlzIGRlY29kZXIgZmlsdGVyIGlzIGludGVuZGVkIHRvIGRlY29kZSBMQVRNIHN0cmVhbXMgdHJhbnNmZXJyZWQKKyAgICBpbiBNUEVHIHRyYW5zcG9ydCBzdHJlYW1zIHdoaWNoIG9ubHkgY29udGFpbiBvbmUgcHJvZ3JhbS4KKyAgICBUbyBkbyBhIG1vcmUgY29tcGxleCBMQVRNIGRlbXV4aW5nIGEgc2VwYXJhdGUgTEFUTSBkZW11eGVyIHNob3VsZCBiZSB1c2VkLgorKi8KK0FWQ29kZWMgZmZfYWFjX2xhdG1fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgID0gImFhY19sYXRtIiwKKyAgICAubG9uZ19uYW1lICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFBQyBMQVRNIChBZHZhbmNlZCBBdWRpbyBDb2RpbmcgTEFUTSBzeW50YXgpIiksCisgICAgLnR5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQUFDX0xBVE0sCisgICAgLnByaXZfZGF0YV9zaXplICA9IHNpemVvZihzdHJ1Y3QgTEFUTUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgPSBsYXRtX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgPSBhYWNfZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICAgPSBsYXRtX2RlY29kZV9mcmFtZSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeworICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX1NBTVBMRV9GTVRfTk9ORQorICAgIH0sCisgICAgLmNhcGFiaWxpdGllcyAgICA9IENPREVDX0NBUF9DSEFOTkVMX0NPTkYgfCBDT0RFQ19DQVBfRFIxLAorICAgIC5jaGFubmVsX2xheW91dHMgPSBhYWNfY2hhbm5lbF9sYXlvdXQsCisgICAgLmZsdXNoID0gZmx1c2gsCisgICAgLnByb2ZpbGVzICAgICAgICA9IHByb2ZpbGVzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY2RlY3RhYi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjZGVjdGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExMmI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY2RlY3RhYi5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQUFDIGRlY29kZXIgZGF0YQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgT2RlZCBTaGltb24gKCBvZHMxNSBvZHMxNSBkeW5kbnMgb3JnICkKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IE1heGltIEdhdnJpbG92ICggbWF4aW0uZ2F2cmlsb3YgZ21haWwgY29tICkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQUFDIGRlY29kZXIgZGF0YQorICogQGF1dGhvciBPZGVkIFNoaW1vbiAgKCBvZHMxNSBvZHMxNSBkeW5kbnMgb3JnICkKKyAqIEBhdXRob3IgTWF4aW0gR2F2cmlsb3YgKCBtYXhpbS5nYXZyaWxvdiBnbWFpbCBjb20gKQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BQUNERUNUQUJfSAorI2RlZmluZSBBVkNPREVDX0FBQ0RFQ1RBQl9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJhYWMuaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBAbmFtZSBsdHBfY29lZgorICogVGFibGUgb2YgdGhlIExUUCBjb2VmZmljaWVudHMKKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IGx0cF9jb2VmWzhdID0geworICAgIDAuNTcwODI5LCAwLjY5NjYxNiwgMC44MTMwMDQsIDAuOTExMzA0LAorICAgIDAuOTg0OTAwLCAxLjA2Nzg5NCwgMS4xOTQ2MDEsIDEuMzY5NTMzLAorfTsKKworLyogQG5hbWUgdG5zX3RtcDJfbWFwCisgKiBUYWJsZXMgb2YgdGhlIHRtcDJbXSBhcnJheXMgb2YgTFBDIGNvZWZmaWNpZW50cyB1c2VkIGZvciBUTlMuCisgKiBUaGUgc3VmZml4IF9NX05bXSBpbmRpY2F0ZSB0aGUgdmFsdWVzIG9mIGNvZWZfY29tcHJlc3MgYW5kIGNvZWZfcmVzCisgKiByZXNwZWN0aXZlbHkuCisgKiBAeworICovCitzdGF0aWMgY29uc3QgZmxvYXQgdG5zX3RtcDJfbWFwXzFfM1s0XSA9IHsKKyAgICAgMC4wMDAwMDAwMCwgLTAuNDMzODgzNzMsICAwLjY0Mjc4NzU4LCAgMC4zNDIwMjAxNSwKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCB0bnNfdG1wMl9tYXBfMF8zWzhdID0geworICAgICAwLjAwMDAwMDAwLCAtMC40MzM4ODM3MywgLTAuNzgxODMxNTAsIC0wLjk3NDkyNzkwLAorICAgICAwLjk4NDgwNzczLCAgMC44NjYwMjUzOSwgIDAuNjQyNzg3NTgsICAwLjM0MjAyMDE1LAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHRuc190bXAyX21hcF8xXzRbOF0gPSB7CisgICAgIDAuMDAwMDAwMDAsIC0wLjIwNzkxMTcwLCAtMC40MDY3MzY2NCwgLTAuNTg3Nzg1MjQsCisgICAgIDAuNjczNjk1NjIsICAwLjUyNjQzMjE2LCAgMC4zNjEyNDE2NywgIDAuMTgzNzQ5NTEsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgdG5zX3RtcDJfbWFwXzBfNFsxNl0gPSB7CisgICAgIDAuMDAwMDAwMDAsIC0wLjIwNzkxMTcwLCAtMC40MDY3MzY2NCwgLTAuNTg3Nzg1MjQsCisgICAgLTAuNzQzMTQ0ODEsIC0wLjg2NjAyNTM5LCAtMC45NTEwNTY1NCwgLTAuOTk0NTIxOTIsCisgICAgIDAuOTk1NzM0MTYsICAwLjk2MTgyNTYxLCAgMC44OTUxNjMzMCwgIDAuNzk4MDE3MjAsCisgICAgIDAuNjczNjk1NjIsICAwLjUyNjQzMjE2LCAgMC4zNjEyNDE2NywgIDAuMTgzNzQ5NTEsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgKiBjb25zdCB0bnNfdG1wMl9tYXBbNF0gPSB7CisgICAgdG5zX3RtcDJfbWFwXzBfMywKKyAgICB0bnNfdG1wMl9tYXBfMF80LAorICAgIHRuc190bXAyX21hcF8xXzMsCisgICAgdG5zX3RtcDJfbWFwXzFfNAorfTsKKy8vIEB9CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgdGFnc19wZXJfY29uZmlnWzE2XSA9IHsgMCwgMSwgMSwgMiwgMywgMywgNCwgNSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhYWNfY2hhbm5lbF9sYXlvdXRfbWFwWzddWzVdWzNdID0geworICAgIHsgeyBUWVBFX1NDRSwgMCwgQUFDX0NIQU5ORUxfRlJPTlQgfSwgfSwKKyAgICB7IHsgVFlQRV9DUEUsIDAsIEFBQ19DSEFOTkVMX0ZST05UIH0sIH0sCisgICAgeyB7IFRZUEVfU0NFLCAwLCBBQUNfQ0hBTk5FTF9GUk9OVCB9LCB7IFRZUEVfQ1BFLCAwLCBBQUNfQ0hBTk5FTF9GUk9OVCB9LCB9LAorICAgIHsgeyBUWVBFX1NDRSwgMCwgQUFDX0NIQU5ORUxfRlJPTlQgfSwgeyBUWVBFX0NQRSwgMCwgQUFDX0NIQU5ORUxfRlJPTlQgfSwgeyBUWVBFX1NDRSwgMSwgQUFDX0NIQU5ORUxfQkFDSyB9LCB9LAorICAgIHsgeyBUWVBFX1NDRSwgMCwgQUFDX0NIQU5ORUxfRlJPTlQgfSwgeyBUWVBFX0NQRSwgMCwgQUFDX0NIQU5ORUxfRlJPTlQgfSwgeyBUWVBFX0NQRSwgMSwgQUFDX0NIQU5ORUxfQkFDSyB9LCB9LAorICAgIHsgeyBUWVBFX1NDRSwgMCwgQUFDX0NIQU5ORUxfRlJPTlQgfSwgeyBUWVBFX0NQRSwgMCwgQUFDX0NIQU5ORUxfRlJPTlQgfSwgeyBUWVBFX0NQRSwgMSwgQUFDX0NIQU5ORUxfQkFDSyB9LCB7IFRZUEVfTEZFLCAwLCBBQUNfQ0hBTk5FTF9MRkUgIH0sIH0sCisgICAgeyB7IFRZUEVfU0NFLCAwLCBBQUNfQ0hBTk5FTF9GUk9OVCB9LCB7IFRZUEVfQ1BFLCAwLCBBQUNfQ0hBTk5FTF9GUk9OVCB9LCB7IFRZUEVfQ1BFLCAxLCBBQUNfQ0hBTk5FTF9GUk9OVCB9LCB7IFRZUEVfQ1BFLCAyLCBBQUNfQ0hBTk5FTF9CQUNLIH0sIHsgVFlQRV9MRkUsIDAsIEFBQ19DSEFOTkVMX0xGRSAgfSwgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50NjRfdCBhYWNfY2hhbm5lbF9sYXlvdXRbOF0gPSB7CisgICAgQVZfQ0hfTEFZT1VUX01PTk8sCisgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywKKyAgICBBVl9DSF9MQVlPVVRfU1VSUk9VTkQsCisgICAgQVZfQ0hfTEFZT1VUXzRQT0lOVDAsCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDBfQkFDSywKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLLAorICAgIEFWX0NIX0xBWU9VVF83UE9JTlQxX1dJREVfQkFDSywKKyAgICAwLAorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUFDREVDVEFCX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljNzIxNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY2VuYy5jCkBAIC0wLDAgKzEsODM4IEBACisvKgorICogQUFDIGVuY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFBQyBlbmNvZGVyCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgVE9ET3M6CisgKiBhZGQgc2FuZSBwdWxzZSBkZXRlY3Rpb24KKyAqIGFkZCB0ZW1wb3JhbCBub2lzZSBzaGFwaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXBlZzRhdWRpby5oIgorI2luY2x1ZGUgImtiZHdpbi5oIgorI2luY2x1ZGUgInNpbmV3aW4uaCIKKworI2luY2x1ZGUgImFhYy5oIgorI2luY2x1ZGUgImFhY3RhYi5oIgorI2luY2x1ZGUgImFhY2VuYy5oIgorCisjaW5jbHVkZSAicHN5bW9kZWwuaCIKKworI2RlZmluZSBBQUNfTUFYX0NIQU5ORUxTIDYKKworI2RlZmluZSBFUlJPUl9JRihjb25kLCAuLi4pIFwKKyAgICBpZiAoY29uZCkgeyBcCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCBfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsgXAorICAgIH0KKworZmxvYXQgZmZfYWFjX3BvdzM0c2ZfdGFiWzQyOF07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHN3Yl9zaXplXzEwMjRfOTZbXSA9IHsKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA4LCA4LCA4LCA4LCA4LAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAyNCwgMjgsIDM2LCA0NCwKKyAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHN3Yl9zaXplXzEwMjRfNjRbXSA9IHsKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA4LCA4LCA4LCA4LAorICAgIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYsIDIwLCAyNCwgMjQsIDI4LCAzNiwKKyAgICA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzd2Jfc2l6ZV8xMDI0XzQ4W10gPSB7CisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LAorICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgIDk2Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzd2Jfc2l6ZV8xMDI0XzMyW10gPSB7CisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LAorICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzd2Jfc2l6ZV8xMDI0XzI0W10gPSB7CisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMjAsIDIwLCAyNCwgMjQsIDI4LCAyOCwKKyAgICAzMiwgMzYsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTIsIDY0LCA2NCwgNjQsIDY0LCA2NAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3diX3NpemVfMTAyNF8xNltdID0geworICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LAorICAgIDMyLCAzNiwgNDAsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCA2NCwgNjQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHN3Yl9zaXplXzEwMjRfOFtdID0geworICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAyMCwgMjAsIDIwLCAyMCwgMjQsIDI0LCAyNCwgMjgsIDI4LAorICAgIDMyLCAzNiwgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCA4MAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgKnN3Yl9zaXplXzEwMjRbXSA9IHsKKyAgICBzd2Jfc2l6ZV8xMDI0Xzk2LCBzd2Jfc2l6ZV8xMDI0Xzk2LCBzd2Jfc2l6ZV8xMDI0XzY0LAorICAgIHN3Yl9zaXplXzEwMjRfNDgsIHN3Yl9zaXplXzEwMjRfNDgsIHN3Yl9zaXplXzEwMjRfMzIsCisgICAgc3diX3NpemVfMTAyNF8yNCwgc3diX3NpemVfMTAyNF8yNCwgc3diX3NpemVfMTAyNF8xNiwKKyAgICBzd2Jfc2l6ZV8xMDI0XzE2LCBzd2Jfc2l6ZV8xMDI0XzE2LCBzd2Jfc2l6ZV8xMDI0XzgKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHN3Yl9zaXplXzEyOF85NltdID0geworICAgIDQsIDQsIDQsIDQsIDQsIDQsIDgsIDgsIDgsIDE2LCAyOCwgMzYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHN3Yl9zaXplXzEyOF80OFtdID0geworICAgIDQsIDQsIDQsIDQsIDQsIDgsIDgsIDgsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHN3Yl9zaXplXzEyOF8yNFtdID0geworICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDgsIDgsIDgsIDEyLCAxMiwgMTYsIDE2LCAyMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3diX3NpemVfMTI4XzE2W10gPSB7CisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgOCwgOCwgMTIsIDEyLCAxNiwgMjAsIDIwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzd2Jfc2l6ZV8xMjhfOFtdID0geworICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDgsIDgsIDgsIDgsIDEyLCAxNiwgMjAsIDIwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCAqc3diX3NpemVfMTI4W10gPSB7CisgICAgLyogdGhlIGxhc3QgZW50cnkgb24gdGhlIGZvbGxvd2luZyByb3cgaXMgc3diX3NpemVfMTI4XzY0IGJ1dCBpcyBhCisgICAgICAgZHVwbGljYXRlIG9mIHN3Yl9zaXplXzEyOF85NiAqLworICAgIHN3Yl9zaXplXzEyOF85Niwgc3diX3NpemVfMTI4Xzk2LCBzd2Jfc2l6ZV8xMjhfOTYsCisgICAgc3diX3NpemVfMTI4XzQ4LCBzd2Jfc2l6ZV8xMjhfNDgsIHN3Yl9zaXplXzEyOF80OCwKKyAgICBzd2Jfc2l6ZV8xMjhfMjQsIHN3Yl9zaXplXzEyOF8yNCwgc3diX3NpemVfMTI4XzE2LAorICAgIHN3Yl9zaXplXzEyOF8xNiwgc3diX3NpemVfMTI4XzE2LCBzd2Jfc2l6ZV8xMjhfOAorfTsKKworLyoqIGRlZmF1bHQgY2hhbm5lbCBjb25maWd1cmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWFjX2NoYW5fY29uZmlnc1s2XVs1XSA9IHsKKyB7MSwgVFlQRV9TQ0V9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIGNoYW5uZWwgIC0gc2luZ2xlIGNoYW5uZWwgZWxlbWVudAorIHsxLCBUWVBFX0NQRX0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgY2hhbm5lbHMgLSBjaGFubmVsIHBhaXIKKyB7MiwgVFlQRV9TQ0UsIFRZUEVfQ1BFfSwgICAgICAgICAgICAgICAgICAgICAvLyAzIGNoYW5uZWxzIC0gY2VudGVyICsgc3RlcmVvCisgezMsIFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9TQ0V9LCAgICAgICAgICAgLy8gNCBjaGFubmVscyAtIGZyb250IGNlbnRlciArIHN0ZXJlbyArIGJhY2sgY2VudGVyCisgezMsIFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9DUEV9LCAgICAgICAgICAgLy8gNSBjaGFubmVscyAtIGZyb250IGNlbnRlciArIHN0ZXJlbyArIGJhY2sgc3RlcmVvCisgezQsIFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9DUEUsIFRZUEVfTEZFfSwgLy8gNiBjaGFubmVscyAtIGZyb250IGNlbnRlciArIHN0ZXJlbyArIGJhY2sgc3RlcmVvICsgTEZFCit9OworCisvKioKKyAqIFRhYmxlIHRvIHJlbWFwIGNoYW5uZWxzIGZyb20gbGliYXZjb2RlYydzIGRlZmF1bHQgb3JkZXIgdG8gQUFDIG9yZGVyLgorICovCitzdGF0aWMgY29uc3QgdWludDhfdCBhYWNfY2hhbl9tYXBzW0FBQ19NQVhfQ0hBTk5FTFNdW0FBQ19NQVhfQ0hBTk5FTFNdID0geworICAgIHsgMCB9LAorICAgIHsgMCwgMSB9LAorICAgIHsgMiwgMCwgMSB9LAorICAgIHsgMiwgMCwgMSwgMyB9LAorICAgIHsgMiwgMCwgMSwgMywgNCB9LAorICAgIHsgMiwgMCwgMSwgNCwgNSwgMyB9LAorfTsKKworLyoqCisgKiBNYWtlIEFBQyBhdWRpbyBjb25maWcgb2JqZWN0LgorICogQHNlZSAxLjYuMi4xICJTeW50YXggLSBBdWRpb1NwZWNpZmljQ29uZmlnIgorICovCitzdGF0aWMgdm9pZCBwdXRfYXVkaW9fc3BlY2lmaWNfY29uZmlnKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIEFBQ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaW5pdF9wdXRfYml0cygmcGIsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSo4KTsKKyAgICBwdXRfYml0cygmcGIsIDUsIDIpOyAvL29iamVjdCB0eXBlIC0gQUFDLUxDCisgICAgcHV0X2JpdHMoJnBiLCA0LCBzLT5zYW1wbGVyYXRlX2luZGV4KTsgLy9zYW1wbGUgcmF0ZSBpbmRleAorICAgIHB1dF9iaXRzKCZwYiwgNCwgcy0+Y2hhbm5lbHMpOworICAgIC8vR0FTcGVjaWZpY0NvbmZpZworICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7IC8vZnJhbWUgbGVuZ3RoIC0gMTAyNCBzYW1wbGVzCisgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgLy9kb2VzIG5vdCBkZXBlbmQgb24gY29yZSBjb2RlcgorICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7IC8vaXMgbm90IGV4dGVuc2lvbgorCisgICAgLy9FeHBsaWNpdGx5IE1hcmsgU0JSIGFic2VudAorICAgIHB1dF9iaXRzKCZwYiwgMTEsIDB4MmI3KTsgLy9zeW5jIGV4dGVuc2lvbgorICAgIHB1dF9iaXRzKCZwYiwgNSwgIEFPVF9TQlIpOworICAgIHB1dF9iaXRzKCZwYiwgMSwgIDApOworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7Cit9CisKKyNkZWZpbmUgV0lORE9XX0ZVTkModHlwZSkgXAorc3RhdGljIHZvaWQgYXBwbHlfICMjdHlwZSAjI193aW5kb3coQVZGbG9hdERTUENvbnRleHQgKmZkc3AsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICphdWRpbykKKworV0lORE9XX0ZVTkMob25seV9sb25nKQoreworICAgIGNvbnN0IGZsb2F0ICpsd2luZG93ID0gc2NlLT5pY3MudXNlX2tiX3dpbmRvd1swXSA/IGZmX2FhY19rYmRfbG9uZ18xMDI0IDogZmZfc2luZV8xMDI0OworICAgIGNvbnN0IGZsb2F0ICpwd2luZG93ID0gc2NlLT5pY3MudXNlX2tiX3dpbmRvd1sxXSA/IGZmX2FhY19rYmRfbG9uZ18xMDI0IDogZmZfc2luZV8xMDI0OworICAgIGZsb2F0ICpvdXQgPSBzY2UtPnJldF9idWY7CisKKyAgICBmZHNwLT52ZWN0b3JfZm11bCAgICAgICAgKG91dCwgICAgICAgIGF1ZGlvLCAgICAgICAgbHdpbmRvdywgMTAyNCk7CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZShvdXQgKyAxMDI0LCBhdWRpbyArIDEwMjQsIHB3aW5kb3csIDEwMjQpOworfQorCitXSU5ET1dfRlVOQyhsb25nX3N0YXJ0KQoreworICAgIGNvbnN0IGZsb2F0ICpsd2luZG93ID0gc2NlLT5pY3MudXNlX2tiX3dpbmRvd1sxXSA/IGZmX2FhY19rYmRfbG9uZ18xMDI0IDogZmZfc2luZV8xMDI0OworICAgIGNvbnN0IGZsb2F0ICpzd2luZG93ID0gc2NlLT5pY3MudXNlX2tiX3dpbmRvd1swXSA/IGZmX2FhY19rYmRfc2hvcnRfMTI4IDogZmZfc2luZV8xMjg7CisgICAgZmxvYXQgKm91dCA9IHNjZS0+cmV0X2J1ZjsKKworICAgIGZkc3AtPnZlY3Rvcl9mbXVsKG91dCwgYXVkaW8sIGx3aW5kb3csIDEwMjQpOworICAgIG1lbWNweShvdXQgKyAxMDI0LCBhdWRpbyArIDEwMjQsIHNpemVvZihvdXRbMF0pICogNDQ4KTsKKyAgICBmZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKG91dCArIDEwMjQgKyA0NDgsIGF1ZGlvICsgMTAyNCArIDQ0OCwgc3dpbmRvdywgMTI4KTsKKyAgICBtZW1zZXQob3V0ICsgMTAyNCArIDU3NiwgMCwgc2l6ZW9mKG91dFswXSkgKiA0NDgpOworfQorCitXSU5ET1dfRlVOQyhsb25nX3N0b3ApCit7CisgICAgY29uc3QgZmxvYXQgKmx3aW5kb3cgPSBzY2UtPmljcy51c2Vfa2Jfd2luZG93WzBdID8gZmZfYWFjX2tiZF9sb25nXzEwMjQgOiBmZl9zaW5lXzEwMjQ7CisgICAgY29uc3QgZmxvYXQgKnN3aW5kb3cgPSBzY2UtPmljcy51c2Vfa2Jfd2luZG93WzFdID8gZmZfYWFjX2tiZF9zaG9ydF8xMjggOiBmZl9zaW5lXzEyODsKKyAgICBmbG9hdCAqb3V0ID0gc2NlLT5yZXRfYnVmOworCisgICAgbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dFswXSkgKiA0NDgpOworICAgIGZkc3AtPnZlY3Rvcl9mbXVsKG91dCArIDQ0OCwgYXVkaW8gKyA0NDgsIHN3aW5kb3csIDEyOCk7CisgICAgbWVtY3B5KG91dCArIDU3NiwgYXVkaW8gKyA1NzYsIHNpemVvZihvdXRbMF0pICogNDQ4KTsKKyAgICBmZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKG91dCArIDEwMjQsIGF1ZGlvICsgMTAyNCwgbHdpbmRvdywgMTAyNCk7Cit9CisKK1dJTkRPV19GVU5DKGVpZ2h0X3Nob3J0KQoreworICAgIGNvbnN0IGZsb2F0ICpzd2luZG93ID0gc2NlLT5pY3MudXNlX2tiX3dpbmRvd1swXSA/IGZmX2FhY19rYmRfc2hvcnRfMTI4IDogZmZfc2luZV8xMjg7CisgICAgY29uc3QgZmxvYXQgKnB3aW5kb3cgPSBzY2UtPmljcy51c2Vfa2Jfd2luZG93WzFdID8gZmZfYWFjX2tiZF9zaG9ydF8xMjggOiBmZl9zaW5lXzEyODsKKyAgICBjb25zdCBmbG9hdCAqaW4gPSBhdWRpbyArIDQ0ODsKKyAgICBmbG9hdCAqb3V0ID0gc2NlLT5yZXRfYnVmOworICAgIGludCB3OworCisgICAgZm9yICh3ID0gMDsgdyA8IDg7IHcrKykgeworICAgICAgICBmZHNwLT52ZWN0b3JfZm11bCAgICAgICAgKG91dCwgaW4sIHcgPyBwd2luZG93IDogc3dpbmRvdywgMTI4KTsKKyAgICAgICAgb3V0ICs9IDEyODsKKyAgICAgICAgaW4gICs9IDEyODsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZShvdXQsIGluLCBzd2luZG93LCAxMjgpOworICAgICAgICBvdXQgKz0gMTI4OworICAgIH0KK30KKworc3RhdGljIHZvaWQgKCpjb25zdCBhcHBseV93aW5kb3dbNF0pKEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmF1ZGlvKSA9IHsKKyAgICBbT05MWV9MT05HX1NFUVVFTkNFXSAgID0gYXBwbHlfb25seV9sb25nX3dpbmRvdywKKyAgICBbTE9OR19TVEFSVF9TRVFVRU5DRV0gID0gYXBwbHlfbG9uZ19zdGFydF93aW5kb3csCisgICAgW0VJR0hUX1NIT1JUX1NFUVVFTkNFXSA9IGFwcGx5X2VpZ2h0X3Nob3J0X3dpbmRvdywKKyAgICBbTE9OR19TVE9QX1NFUVVFTkNFXSAgID0gYXBwbHlfbG9uZ19zdG9wX3dpbmRvdworfTsKKworc3RhdGljIHZvaWQgYXBwbHlfd2luZG93X2FuZF9tZGN0KEFBQ0VuY0NvbnRleHQgKnMsIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmF1ZGlvKQoreworICAgIGludCBpOworICAgIGZsb2F0ICpvdXRwdXQgPSBzY2UtPnJldF9idWY7CisKKyAgICBhcHBseV93aW5kb3dbc2NlLT5pY3Mud2luZG93X3NlcXVlbmNlWzBdXShzLT5mZHNwLCBzY2UsIGF1ZGlvKTsKKworICAgIGlmIChzY2UtPmljcy53aW5kb3dfc2VxdWVuY2VbMF0gIT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpCisgICAgICAgIHMtPm1kY3QxMDI0Lm1kY3RfY2FsYygmcy0+bWRjdDEwMjQsIHNjZS0+Y29lZmZzLCBvdXRwdXQpOworICAgIGVsc2UKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gMTI4KQorICAgICAgICAgICAgcy0+bWRjdDEyOC5tZGN0X2NhbGMoJnMtPm1kY3QxMjgsIHNjZS0+Y29lZmZzICsgaSwgb3V0cHV0ICsgaSoyKTsKKyAgICBtZW1jcHkoYXVkaW8sIGF1ZGlvICsgMTAyNCwgc2l6ZW9mKGF1ZGlvWzBdKSAqIDEwMjQpOworfQorCisvKioKKyAqIEVuY29kZSBpY3NfaW5mbyBlbGVtZW50LgorICogQHNlZSBUYWJsZSA0LjYgKHN5bnRheCBvZiBpY3NfaW5mbykKKyAqLworc3RhdGljIHZvaWQgcHV0X2ljc19pbmZvKEFBQ0VuY0NvbnRleHQgKnMsIEluZGl2aWR1YWxDaGFubmVsU3RyZWFtICppbmZvKQoreworICAgIGludCB3OworCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAgICAgLy8gaWNzX3Jlc2VydmVkIGJpdAorICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgaW5mby0+d2luZG93X3NlcXVlbmNlWzBdKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIGluZm8tPnVzZV9rYl93aW5kb3dbMF0pOworICAgIGlmIChpbmZvLT53aW5kb3dfc2VxdWVuY2VbMF0gIT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA2LCBpbmZvLT5tYXhfc2ZiKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAvLyBubyBwcmVkaWN0aW9uCisgICAgfSBlbHNlIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCBpbmZvLT5tYXhfc2ZiKTsKKyAgICAgICAgZm9yICh3ID0gMTsgdyA8IDg7IHcrKykKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgIWluZm8tPmdyb3VwX2xlblt3XSk7CisgICAgfQorfQorCisvKioKKyAqIEVuY29kZSBNUyBkYXRhLgorICogQHNlZSA0LjYuOC4xICJKb2ludCBDb2RpbmcgLSBNL1MgU3RlcmVvIgorICovCitzdGF0aWMgdm9pZCBlbmNvZGVfbXNfaW5mbyhQdXRCaXRDb250ZXh0ICpwYiwgQ2hhbm5lbEVsZW1lbnQgKmNwZSkKK3sKKyAgICBpbnQgaSwgdzsKKworICAgIHB1dF9iaXRzKHBiLCAyLCBjcGUtPm1zX21vZGUpOworICAgIGlmIChjcGUtPm1zX21vZGUgPT0gMSkKKyAgICAgICAgZm9yICh3ID0gMDsgdyA8IGNwZS0+Y2hbMF0uaWNzLm51bV93aW5kb3dzOyB3ICs9IGNwZS0+Y2hbMF0uaWNzLmdyb3VwX2xlblt3XSkKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcGUtPmNoWzBdLmljcy5tYXhfc2ZiOyBpKyspCisgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIsIDEsIGNwZS0+bXNfbWFza1t3KjE2ICsgaV0pOworfQorCisvKioKKyAqIFByb2R1Y2UgaW50ZWdlciBjb2VmZmljaWVudHMgZnJvbSBzY2FsZWZhY3RvcnMgcHJvdmlkZWQgYnkgdGhlIG1vZGVsLgorICovCitzdGF0aWMgdm9pZCBhZGp1c3RfZnJhbWVfaW5mb3JtYXRpb24oQ2hhbm5lbEVsZW1lbnQgKmNwZSwgaW50IGNoYW5zKQoreworICAgIGludCBpLCB3LCB3MiwgZywgY2g7CisgICAgaW50IHN0YXJ0LCBtYXhzZmIsIGNtYXhzZmI7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFuczsgY2grKykgeworICAgICAgICBJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbSAqaWNzID0gJmNwZS0+Y2hbY2hdLmljczsKKyAgICAgICAgc3RhcnQgPSAwOworICAgICAgICBtYXhzZmIgPSAwOworICAgICAgICBjcGUtPmNoW2NoXS5wdWxzZS5udW1fcHVsc2UgPSAwOworICAgICAgICBmb3IgKHcgPSAwOyB3IDwgaWNzLT5udW1fd2luZG93cyoxNjsgdyArPSAxNikgeworICAgICAgICAgICAgZm9yIChnID0gMDsgZyA8IGljcy0+bnVtX3N3YjsgZysrKSB7CisgICAgICAgICAgICAgICAgLy9hcHBseSBNL1MKKyAgICAgICAgICAgICAgICBpZiAoY3BlLT5jb21tb25fd2luZG93ICYmICFjaCAmJiBjcGUtPm1zX21hc2tbdyArIGddKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpY3MtPnN3Yl9zaXplc1tnXTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcGUtPmNoWzBdLmNvZWZmc1tzdGFydCtpXSA9IChjcGUtPmNoWzBdLmNvZWZmc1tzdGFydCtpXSArIGNwZS0+Y2hbMV0uY29lZmZzW3N0YXJ0K2ldKSAvIDIuMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwZS0+Y2hbMV0uY29lZmZzW3N0YXJ0K2ldID0gIGNwZS0+Y2hbMF0uY29lZmZzW3N0YXJ0K2ldIC0gY3BlLT5jaFsxXS5jb2VmZnNbc3RhcnQraV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhcnQgKz0gaWNzLT5zd2Jfc2l6ZXNbZ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNtYXhzZmIgPSBpY3MtPm51bV9zd2I7IGNtYXhzZmIgPiAwICYmIGNwZS0+Y2hbY2hdLnplcm9lc1t3K2NtYXhzZmItMV07IGNtYXhzZmItLSkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBtYXhzZmIgPSBGRk1BWChtYXhzZmIsIGNtYXhzZmIpOworICAgICAgICB9CisgICAgICAgIGljcy0+bWF4X3NmYiA9IG1heHNmYjsKKworICAgICAgICAvL2FkanVzdCB6ZXJvIGJhbmRzIGZvciB3aW5kb3cgZ3JvdXBzCisgICAgICAgIGZvciAodyA9IDA7IHcgPCBpY3MtPm51bV93aW5kb3dzOyB3ICs9IGljcy0+Z3JvdXBfbGVuW3ddKSB7CisgICAgICAgICAgICBmb3IgKGcgPSAwOyBnIDwgaWNzLT5tYXhfc2ZiOyBnKyspIHsKKyAgICAgICAgICAgICAgICBpID0gMTsKKyAgICAgICAgICAgICAgICBmb3IgKHcyID0gdzsgdzIgPCB3ICsgaWNzLT5ncm91cF9sZW5bd107IHcyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjcGUtPmNoW2NoXS56ZXJvZXNbdzIqMTYgKyBnXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjcGUtPmNoW2NoXS56ZXJvZXNbdyoxNiArIGddID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjaGFucyA+IDEgJiYgY3BlLT5jb21tb25fd2luZG93KSB7CisgICAgICAgIEluZGl2aWR1YWxDaGFubmVsU3RyZWFtICppY3MwID0gJmNwZS0+Y2hbMF0uaWNzOworICAgICAgICBJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbSAqaWNzMSA9ICZjcGUtPmNoWzFdLmljczsKKyAgICAgICAgaW50IG1zYyA9IDA7CisgICAgICAgIGljczAtPm1heF9zZmIgPSBGRk1BWChpY3MwLT5tYXhfc2ZiLCBpY3MxLT5tYXhfc2ZiKTsKKyAgICAgICAgaWNzMS0+bWF4X3NmYiA9IGljczAtPm1heF9zZmI7CisgICAgICAgIGZvciAodyA9IDA7IHcgPCBpY3MwLT5udW1fd2luZG93cyoxNjsgdyArPSAxNikKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpY3MwLT5tYXhfc2ZiOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGNwZS0+bXNfbWFza1t3K2ldKQorICAgICAgICAgICAgICAgICAgICBtc2MrKzsKKyAgICAgICAgaWYgKG1zYyA9PSAwIHx8IGljczAtPm1heF9zZmIgPT0gMCkKKyAgICAgICAgICAgIGNwZS0+bXNfbW9kZSA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNwZS0+bXNfbW9kZSA9IG1zYyA8IGljczAtPm1heF9zZmIgKiBpY3MwLT5udW1fd2luZG93cyA/IDEgOiAyOworICAgIH0KK30KKworLyoqCisgKiBFbmNvZGUgc2NhbGVmYWN0b3IgYmFuZCBjb2RpbmcgdHlwZS4KKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2JhbmRfaW5mbyhBQUNFbmNDb250ZXh0ICpzLCBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlKQoreworICAgIGludCB3OworCisgICAgZm9yICh3ID0gMDsgdyA8IHNjZS0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZS0+aWNzLmdyb3VwX2xlblt3XSkKKyAgICAgICAgcy0+Y29kZXItPmVuY29kZV93aW5kb3dfYmFuZHNfaW5mbyhzLCBzY2UsIHcsIHNjZS0+aWNzLmdyb3VwX2xlblt3XSwgcy0+bGFtYmRhKTsKK30KKworLyoqCisgKiBFbmNvZGUgc2NhbGVmYWN0b3JzLgorICovCitzdGF0aWMgdm9pZCBlbmNvZGVfc2NhbGVfZmFjdG9ycyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFBQ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlKQoreworICAgIGludCBvZmYgPSBzY2UtPnNmX2lkeFswXSwgZGlmZjsKKyAgICBpbnQgaSwgdzsKKworICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjZS0+aWNzLm1heF9zZmI7IGkrKykgeworICAgICAgICAgICAgaWYgKCFzY2UtPnplcm9lc1t3KjE2ICsgaV0pIHsKKyAgICAgICAgICAgICAgICBkaWZmID0gc2NlLT5zZl9pZHhbdyoxNiArIGldIC0gb2ZmICsgU0NBTEVfRElGRl9aRVJPOworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoZGlmZiA+PSAwICYmIGRpZmYgPD0gMTIwKTsKKyAgICAgICAgICAgICAgICBvZmYgPSBzY2UtPnNmX2lkeFt3KjE2ICsgaV07CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBmZl9hYWNfc2NhbGVmYWN0b3JfYml0c1tkaWZmXSwgZmZfYWFjX3NjYWxlZmFjdG9yX2NvZGVbZGlmZl0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEVuY29kZSBwdWxzZSBkYXRhLgorICovCitzdGF0aWMgdm9pZCBlbmNvZGVfcHVsc2VzKEFBQ0VuY0NvbnRleHQgKnMsIFB1bHNlICpwdWxzZSkKK3sKKyAgICBpbnQgaTsKKworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgISFwdWxzZS0+bnVtX3B1bHNlKTsKKyAgICBpZiAoIXB1bHNlLT5udW1fcHVsc2UpCisgICAgICAgIHJldHVybjsKKworICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgcHVsc2UtPm51bV9wdWxzZSAtIDEpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgNiwgcHVsc2UtPnN0YXJ0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcHVsc2UtPm51bV9wdWxzZTsgaSsrKSB7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgcHVsc2UtPnBvc1tpXSk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgcHVsc2UtPmFtcFtpXSk7CisgICAgfQorfQorCisvKioKKyAqIEVuY29kZSBzcGVjdHJhbCBjb2VmZmljaWVudHMgcHJvY2Vzc2VkIGJ5IHBzeWNob2Fjb3VzdGljIG1vZGVsLgorICovCitzdGF0aWMgdm9pZCBlbmNvZGVfc3BlY3RyYWxfY29lZmZzKEFBQ0VuY0NvbnRleHQgKnMsIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UpCit7CisgICAgaW50IHN0YXJ0LCBpLCB3LCB3MjsKKworICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pIHsKKyAgICAgICAgc3RhcnQgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2NlLT5pY3MubWF4X3NmYjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2NlLT56ZXJvZXNbdyoxNiArIGldKSB7CisgICAgICAgICAgICAgICAgc3RhcnQgKz0gc2NlLT5pY3Muc3diX3NpemVzW2ldOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICh3MiA9IHc7IHcyIDwgdyArIHNjZS0+aWNzLmdyb3VwX2xlblt3XTsgdzIrKykKKyAgICAgICAgICAgICAgICBzLT5jb2Rlci0+cXVhbnRpemVfYW5kX2VuY29kZV9iYW5kKHMsICZzLT5wYiwgc2NlLT5jb2VmZnMgKyBzdGFydCArIHcyKjEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+aWNzLnN3Yl9zaXplc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4W3cqMTYgKyBpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+YmFuZF90eXBlW3cqMTYgKyBpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhbWJkYSk7CisgICAgICAgICAgICBzdGFydCArPSBzY2UtPmljcy5zd2Jfc2l6ZXNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRW5jb2RlIG9uZSBjaGFubmVsIG9mIGF1ZGlvIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgZW5jb2RlX2luZGl2aWR1YWxfY2hhbm5lbChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFBQ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tbW9uX3dpbmRvdykKK3sKKyAgICBwdXRfYml0cygmcy0+cGIsIDgsIHNjZS0+c2ZfaWR4WzBdKTsKKyAgICBpZiAoIWNvbW1vbl93aW5kb3cpCisgICAgICAgIHB1dF9pY3NfaW5mbyhzLCAmc2NlLT5pY3MpOworICAgIGVuY29kZV9iYW5kX2luZm8ocywgc2NlKTsKKyAgICBlbmNvZGVfc2NhbGVfZmFjdG9ycyhhdmN0eCwgcywgc2NlKTsKKyAgICBlbmNvZGVfcHVsc2VzKHMsICZzY2UtPnB1bHNlKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAvL3RucworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7IC8vc3NyCisgICAgZW5jb2RlX3NwZWN0cmFsX2NvZWZmcyhzLCBzY2UpOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFdyaXRlIHNvbWUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjcmVhdGVkIEFBQyBmaWxlLgorICovCitzdGF0aWMgdm9pZCBwdXRfYml0c3RyZWFtX2luZm8oQUFDRW5jQ29udGV4dCAqcywgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgaSwgbmFtZWxlbiwgcGFkYml0czsKKworICAgIG5hbWVsZW4gPSBzdHJsZW4obmFtZSkgKyAyOworICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgVFlQRV9GSUwpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgRkZNSU4obmFtZWxlbiwgMTUpKTsKKyAgICBpZiAobmFtZWxlbiA+PSAxNSkKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCBuYW1lbGVuIC0gMTQpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgMCk7IC8vZXh0ZW5zaW9uIHR5cGUgLSBmaWxsZXIKKyAgICBwYWRiaXRzID0gLXB1dF9iaXRzX2NvdW50KCZzLT5wYikgJiA3OworICAgIGF2cHJpdl9hbGlnbl9wdXRfYml0cygmcy0+cGIpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lbGVuIC0gMjsgaSsrKQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIG5hbWVbaV0pOworICAgIHB1dF9iaXRzKCZzLT5wYiwgMTIgLSBwYWRiaXRzLCAwKTsKK30KKworLyoKKyAqIENvcHkgaW5wdXQgc2FtcGxlcy4KKyAqIENoYW5uZWxzIGFyZSByZW9yZGVyZWQgZnJvbSBsaWJhdmNvZGVjJ3MgZGVmYXVsdCBvcmRlciB0byBBQUMgb3JkZXIuCisgKi8KK3N0YXRpYyB2b2lkIGNvcHlfaW5wdXRfc2FtcGxlcyhBQUNFbmNDb250ZXh0ICpzLCBjb25zdCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgY2g7CisgICAgaW50IGVuZCA9IDIwNDggKyAoZnJhbWUgPyBmcmFtZS0+bmJfc2FtcGxlcyA6IDApOworICAgIGNvbnN0IHVpbnQ4X3QgKmNoYW5uZWxfbWFwID0gYWFjX2NoYW5fbWFwc1tzLT5jaGFubmVscyAtIDFdOworCisgICAgLyogY29weSBhbmQgcmVtYXAgaW5wdXQgc2FtcGxlcyAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIC8qIGNvcHkgbGFzdCAxMDI0IHNhbXBsZXMgb2YgcHJldmlvdXMgZnJhbWUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZyYW1lICovCisgICAgICAgIG1lbWNweSgmcy0+cGxhbmFyX3NhbXBsZXNbY2hdWzEwMjRdLCAmcy0+cGxhbmFyX3NhbXBsZXNbY2hdWzIwNDhdLCAxMDI0ICogc2l6ZW9mKHMtPnBsYW5hcl9zYW1wbGVzWzBdWzBdKSk7CisKKyAgICAgICAgLyogY29weSBuZXcgc2FtcGxlcyBhbmQgemVybyBhbnkgcmVtYWluaW5nIHNhbXBsZXMgKi8KKyAgICAgICAgaWYgKGZyYW1lKSB7CisgICAgICAgICAgICBtZW1jcHkoJnMtPnBsYW5hcl9zYW1wbGVzW2NoXVsyMDQ4XSwKKyAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaGFubmVsX21hcFtjaF1dLAorICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzICogc2l6ZW9mKHMtPnBsYW5hcl9zYW1wbGVzWzBdWzBdKSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KCZzLT5wbGFuYXJfc2FtcGxlc1tjaF1bZW5kXSwgMCwKKyAgICAgICAgICAgICAgICgzMDcyIC0gZW5kKSAqIHNpemVvZihzLT5wbGFuYXJfc2FtcGxlc1swXVswXSkpOworICAgIH0KK30KKworc3RhdGljIGludCBhYWNfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIEFBQ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGZsb2F0ICoqc2FtcGxlcyA9IHMtPnBsYW5hcl9zYW1wbGVzLCAqc2FtcGxlczIsICpsYSwgKm92ZXJsYXA7CisgICAgQ2hhbm5lbEVsZW1lbnQgKmNwZTsKKyAgICBpbnQgaSwgY2gsIHcsIGcsIGNoYW5zLCB0YWcsIHN0YXJ0X2NoLCByZXQ7CisgICAgaW50IGNoYW5fZWxfY291bnRlcls0XTsKKyAgICBGRlBzeVdpbmRvd0luZm8gd2luZG93c1tBQUNfTUFYX0NIQU5ORUxTXTsKKworICAgIGlmIChzLT5sYXN0X2ZyYW1lID09IDIpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogYWRkIGN1cnJlbnQgZnJhbWUgdG8gcXVldWUgKi8KKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9hZl9xdWV1ZV9hZGQoJnMtPmFmcSwgZnJhbWUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGNvcHlfaW5wdXRfc2FtcGxlcyhzLCBmcmFtZSk7CisgICAgaWYgKHMtPnBzeXBwKQorICAgICAgICBmZl9wc3lfcHJlcHJvY2VzcyhzLT5wc3lwcCwgcy0+cGxhbmFyX3NhbXBsZXMsIHMtPmNoYW5uZWxzKTsKKworICAgIGlmICghYXZjdHgtPmZyYW1lX251bWJlcikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdGFydF9jaCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPmNoYW5fbWFwWzBdOyBpKyspIHsKKyAgICAgICAgRkZQc3lXaW5kb3dJbmZvKiB3aSA9IHdpbmRvd3MgKyBzdGFydF9jaDsKKyAgICAgICAgdGFnICAgICAgPSBzLT5jaGFuX21hcFtpKzFdOworICAgICAgICBjaGFucyAgICA9IHRhZyA9PSBUWVBFX0NQRSA/IDIgOiAxOworICAgICAgICBjcGUgICAgICA9ICZzLT5jcGVbaV07CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5zOyBjaCsrKSB7CisgICAgICAgICAgICBJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbSAqaWNzID0gJmNwZS0+Y2hbY2hdLmljczsKKyAgICAgICAgICAgIGludCBjdXJfY2hhbm5lbCA9IHN0YXJ0X2NoICsgY2g7CisgICAgICAgICAgICBvdmVybGFwICA9ICZzYW1wbGVzW2N1cl9jaGFubmVsXVswXTsKKyAgICAgICAgICAgIHNhbXBsZXMyID0gb3ZlcmxhcCArIDEwMjQ7CisgICAgICAgICAgICBsYSAgICAgICA9IHNhbXBsZXMyICsgKDQ0OCs2NCk7CisgICAgICAgICAgICBpZiAoIWZyYW1lKQorICAgICAgICAgICAgICAgIGxhID0gTlVMTDsKKyAgICAgICAgICAgIGlmICh0YWcgPT0gVFlQRV9MRkUpIHsKKyAgICAgICAgICAgICAgICB3aVtjaF0ud2luZG93X3R5cGVbMF0gPSBPTkxZX0xPTkdfU0VRVUVOQ0U7CisgICAgICAgICAgICAgICAgd2lbY2hdLndpbmRvd19zaGFwZSAgID0gMDsKKyAgICAgICAgICAgICAgICB3aVtjaF0ubnVtX3dpbmRvd3MgICAgPSAxOworICAgICAgICAgICAgICAgIHdpW2NoXS5ncm91cGluZ1swXSAgICA9IDE7CisKKyAgICAgICAgICAgICAgICAvKiBPbmx5IHRoZSBsb3dlc3QgMTIgY29lZmZpY2llbnRzIGFyZSB1c2VkIGluIGEgTEZFIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICogVGhlIGV4cHJlc3Npb24gYmVsb3cgcmVzdWx0cyBpbiBvbmx5IHRoZSBib3R0b20gOCBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKiBiZWluZyB1c2VkIGZvciAxMS4wMjVrSHogdG8gMTZrSHogc2FtcGxlIHJhdGVzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGljcy0+bnVtX3N3YiA9IHMtPnNhbXBsZXJhdGVfaW5kZXggPj0gOCA/IDEgOiAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aVtjaF0gPSBzLT5wc3kubW9kZWwtPndpbmRvdygmcy0+cHN5LCBzYW1wbGVzMiwgbGEsIGN1cl9jaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljcy0+d2luZG93X3NlcXVlbmNlWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGljcy0+d2luZG93X3NlcXVlbmNlWzFdID0gaWNzLT53aW5kb3dfc2VxdWVuY2VbMF07CisgICAgICAgICAgICBpY3MtPndpbmRvd19zZXF1ZW5jZVswXSA9IHdpW2NoXS53aW5kb3dfdHlwZVswXTsKKyAgICAgICAgICAgIGljcy0+dXNlX2tiX3dpbmRvd1sxXSAgID0gaWNzLT51c2Vfa2Jfd2luZG93WzBdOworICAgICAgICAgICAgaWNzLT51c2Vfa2Jfd2luZG93WzBdICAgPSB3aVtjaF0ud2luZG93X3NoYXBlOworICAgICAgICAgICAgaWNzLT5udW1fd2luZG93cyAgICAgICAgPSB3aVtjaF0ubnVtX3dpbmRvd3M7CisgICAgICAgICAgICBpY3MtPnN3Yl9zaXplcyAgICAgICAgICA9IHMtPnBzeS5iYW5kcyAgICBbaWNzLT5udW1fd2luZG93cyA9PSA4XTsKKyAgICAgICAgICAgIGljcy0+bnVtX3N3YiAgICAgICAgICAgID0gdGFnID09IFRZUEVfTEZFID8gaWNzLT5udW1fc3diIDogcy0+cHN5Lm51bV9iYW5kc1tpY3MtPm51bV93aW5kb3dzID09IDhdOworICAgICAgICAgICAgZm9yICh3ID0gMDsgdyA8IGljcy0+bnVtX3dpbmRvd3M7IHcrKykKKyAgICAgICAgICAgICAgICBpY3MtPmdyb3VwX2xlblt3XSA9IHdpW2NoXS5ncm91cGluZ1t3XTsKKworICAgICAgICAgICAgYXBwbHlfd2luZG93X2FuZF9tZGN0KHMsICZjcGUtPmNoW2NoXSwgb3ZlcmxhcCk7CisgICAgICAgICAgICBpZiAoaXNuYW4oY3BlLT5jaC0+Y29lZmZzWzBdKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5wdXQgY29udGFpbnMgTmFOXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXJ0X2NoICs9IGNoYW5zOworICAgIH0KKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCA4MTkyICogcy0+Y2hhbm5lbHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZG8geworICAgICAgICBpbnQgZnJhbWVfYml0czsKKworICAgICAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgICAgICBpZiAoKGF2Y3R4LT5mcmFtZV9udW1iZXIgJiAweEZGKT09MSAmJiAhKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKQorICAgICAgICAgICAgcHV0X2JpdHN0cmVhbV9pbmZvKHMsIExJQkFWQ09ERUNfSURFTlQpOworICAgICAgICBzdGFydF9jaCA9IDA7CisgICAgICAgIG1lbXNldChjaGFuX2VsX2NvdW50ZXIsIDAsIHNpemVvZihjaGFuX2VsX2NvdW50ZXIpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmNoYW5fbWFwWzBdOyBpKyspIHsKKyAgICAgICAgICAgIEZGUHN5V2luZG93SW5mbyogd2kgPSB3aW5kb3dzICsgc3RhcnRfY2g7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqY29lZmZzWzJdOworICAgICAgICAgICAgdGFnICAgICAgPSBzLT5jaGFuX21hcFtpKzFdOworICAgICAgICAgICAgY2hhbnMgICAgPSB0YWcgPT0gVFlQRV9DUEUgPyAyIDogMTsKKyAgICAgICAgICAgIGNwZSAgICAgID0gJnMtPmNwZVtpXTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgdGFnKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgY2hhbl9lbF9jb3VudGVyW3RhZ10rKyk7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFuczsgY2grKykKKyAgICAgICAgICAgICAgICBjb2VmZnNbY2hdID0gY3BlLT5jaFtjaF0uY29lZmZzOworICAgICAgICAgICAgcy0+cHN5Lm1vZGVsLT5hbmFseXplKCZzLT5wc3ksIHN0YXJ0X2NoLCBjb2VmZnMsIHdpKTsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5zOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgcy0+Y3VyX2NoYW5uZWwgPSBzdGFydF9jaCArIGNoOworICAgICAgICAgICAgICAgIHMtPmNvZGVyLT5zZWFyY2hfZm9yX3F1YW50aXplcnMoYXZjdHgsIHMsICZjcGUtPmNoW2NoXSwgcy0+bGFtYmRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNwZS0+Y29tbW9uX3dpbmRvdyA9IDA7CisgICAgICAgICAgICBpZiAoY2hhbnMgPiAxCisgICAgICAgICAgICAgICAgJiYgd2lbMF0ud2luZG93X3R5cGVbMF0gPT0gd2lbMV0ud2luZG93X3R5cGVbMF0KKyAgICAgICAgICAgICAgICAmJiB3aVswXS53aW5kb3dfc2hhcGUgICA9PSB3aVsxXS53aW5kb3dfc2hhcGUpIHsKKworICAgICAgICAgICAgICAgIGNwZS0+Y29tbW9uX3dpbmRvdyA9IDE7CisgICAgICAgICAgICAgICAgZm9yICh3ID0gMDsgdyA8IHdpWzBdLm51bV93aW5kb3dzOyB3KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpWzBdLmdyb3VwaW5nW3ddICE9IHdpWzFdLmdyb3VwaW5nW3ddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcGUtPmNvbW1vbl93aW5kb3cgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5jdXJfY2hhbm5lbCA9IHN0YXJ0X2NoOworICAgICAgICAgICAgaWYgKHMtPm9wdGlvbnMuc3RlcmVvX21vZGUgJiYgY3BlLT5jb21tb25fd2luZG93KSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPm9wdGlvbnMuc3RlcmVvX21vZGUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEluZGl2aWR1YWxDaGFubmVsU3RyZWFtICppY3MgPSAmY3BlLT5jaFswXS5pY3M7CisgICAgICAgICAgICAgICAgICAgIGZvciAodyA9IDA7IHcgPCBpY3MtPm51bV93aW5kb3dzOyB3ICs9IGljcy0+Z3JvdXBfbGVuW3ddKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChnID0gMDsgIGcgPCBpY3MtPm51bV9zd2I7IGcrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGUtPm1zX21hc2tbdyoxNitnXSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5jb2Rlci0+c2VhcmNoX2Zvcl9tcykgeworICAgICAgICAgICAgICAgICAgICBzLT5jb2Rlci0+c2VhcmNoX2Zvcl9tcyhzLCBjcGUsIHMtPmxhbWJkYSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRqdXN0X2ZyYW1lX2luZm9ybWF0aW9uKGNwZSwgY2hhbnMpOworICAgICAgICAgICAgaWYgKGNoYW5zID09IDIpIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIGNwZS0+Y29tbW9uX3dpbmRvdyk7CisgICAgICAgICAgICAgICAgaWYgKGNwZS0+Y29tbW9uX3dpbmRvdykgeworICAgICAgICAgICAgICAgICAgICBwdXRfaWNzX2luZm8ocywgJmNwZS0+Y2hbMF0uaWNzKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21zX2luZm8oJnMtPnBiLCBjcGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5zOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgcy0+Y3VyX2NoYW5uZWwgPSBzdGFydF9jaCArIGNoOworICAgICAgICAgICAgICAgIGVuY29kZV9pbmRpdmlkdWFsX2NoYW5uZWwoYXZjdHgsIHMsICZjcGUtPmNoW2NoXSwgY3BlLT5jb21tb25fd2luZG93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXJ0X2NoICs9IGNoYW5zOworICAgICAgICB9CisKKyAgICAgICAgZnJhbWVfYml0cyA9IHB1dF9iaXRzX2NvdW50KCZzLT5wYik7CisgICAgICAgIGlmIChmcmFtZV9iaXRzIDw9IDYxNDQgKiBzLT5jaGFubmVscyAtIDMpIHsKKyAgICAgICAgICAgIHMtPnBzeS5iaXRyZXMuYml0cyA9IGZyYW1lX2JpdHMgLyBzLT5jaGFubmVsczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcy0+bGFtYmRhICo9IGF2Y3R4LT5iaXRfcmF0ZSAqIDEwMjQuMGYgLyBhdmN0eC0+c2FtcGxlX3JhdGUgLyBmcmFtZV9iaXRzOworCisgICAgfSB3aGlsZSAoMSk7CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDMsIFRZUEVfRU5EKTsKKyAgICBmbHVzaF9wdXRfYml0cygmcy0+cGIpOworICAgIGF2Y3R4LT5mcmFtZV9iaXRzID0gcHV0X2JpdHNfY291bnQoJnMtPnBiKTsKKworICAgIC8vIHJhdGUgY29udHJvbCBzdHVmZgorICAgIGlmICghKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUVNDQUxFKSkgeworICAgICAgICBmbG9hdCByYXRpbyA9IGF2Y3R4LT5iaXRfcmF0ZSAqIDEwMjQuMGYgLyBhdmN0eC0+c2FtcGxlX3JhdGUgLyBhdmN0eC0+ZnJhbWVfYml0czsKKyAgICAgICAgcy0+bGFtYmRhICo9IHJhdGlvOworICAgICAgICBzLT5sYW1iZGEgPSBGRk1JTihzLT5sYW1iZGEsIDY1NTM2LmYpOworICAgIH0KKworICAgIGlmICghZnJhbWUpCisgICAgICAgIHMtPmxhc3RfZnJhbWUrKzsKKworICAgIGZmX2FmX3F1ZXVlX3JlbW92ZSgmcy0+YWZxLCBhdmN0eC0+ZnJhbWVfc2l6ZSwgJmF2cGt0LT5wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICZhdnBrdC0+ZHVyYXRpb24pOworCisgICAgYXZwa3QtPnNpemUgPSBwdXRfYml0c19jb3VudCgmcy0+cGIpID4+IDM7CisgICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFhY19lbmNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBQUNFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGZmX21kY3RfZW5kKCZzLT5tZGN0MTAyNCk7CisgICAgZmZfbWRjdF9lbmQoJnMtPm1kY3QxMjgpOworICAgIGZmX3BzeV9lbmQoJnMtPnBzeSk7CisgICAgaWYgKHMtPnBzeXBwKQorICAgICAgICBmZl9wc3lfcHJlcHJvY2Vzc19lbmQocy0+cHN5cHApOworICAgIGF2X2ZyZWVwKCZzLT5idWZmZXIuc2FtcGxlcyk7CisgICAgYXZfZnJlZXAoJnMtPmNwZSk7CisgICAgYXZfZnJlZXAoJnMtPmZkc3ApOworICAgIGZmX2FmX3F1ZXVlX2Nsb3NlKCZzLT5hZnEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZHNwX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBQUNFbmNDb250ZXh0ICpzKQoreworICAgIGludCByZXQgPSAwOworCisgICAgcy0+ZmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCk7CisgICAgaWYgKCFzLT5mZHNwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLy8gd2luZG93IGluaXQKKyAgICBmZl9rYmRfd2luZG93X2luaXQoZmZfYWFjX2tiZF9sb25nXzEwMjQsIDQuMCwgMTAyNCk7CisgICAgZmZfa2JkX3dpbmRvd19pbml0KGZmX2FhY19rYmRfc2hvcnRfMTI4LCA2LjAsIDEyOCk7CisgICAgZmZfaW5pdF9mZl9zaW5lX3dpbmRvd3MoMTApOworICAgIGZmX2luaXRfZmZfc2luZV93aW5kb3dzKDcpOworCisgICAgaWYgKHJldCA9IGZmX21kY3RfaW5pdCgmcy0+bWRjdDEwMjQsIDExLCAwLCAzMjc2OC4wKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAocmV0ID0gZmZfbWRjdF9pbml0KCZzLT5tZGN0MTI4LCAgIDgsIDAsIDMyNzY4LjApKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhbGxvY19idWZmZXJzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQUFDRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY2g7CisgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oYXZjdHgsIHMtPmJ1ZmZlci5zYW1wbGVzLCBzLT5jaGFubmVscywgMyAqIDEwMjQgKiBzaXplb2Yocy0+YnVmZmVyLnNhbXBsZXNbMF0pLCBhbGxvY19mYWlsKTsKKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhhdmN0eCwgcy0+Y3BlLCBzLT5jaGFuX21hcFswXSwgc2l6ZW9mKENoYW5uZWxFbGVtZW50KSwgYWxsb2NfZmFpbCk7CisgICAgRkZfQUxMT0NaX09SX0dPVE8oYXZjdHgsIGF2Y3R4LT5leHRyYWRhdGEsIDUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFLCBhbGxvY19mYWlsKTsKKworICAgIGZvcihjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgIHMtPnBsYW5hcl9zYW1wbGVzW2NoXSA9IHMtPmJ1ZmZlci5zYW1wbGVzICsgMyAqIDEwMjQgKiBjaDsKKworICAgIHJldHVybiAwOworYWxsb2NfZmFpbDoKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYWFjX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBQUNFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcmV0ID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpzaXplc1syXTsKKyAgICB1aW50OF90IGdyb3VwaW5nW0FBQ19NQVhfQ0hBTk5FTFNdOworICAgIGludCBsZW5ndGhzWzJdOworCisgICAgYXZjdHgtPmZyYW1lX3NpemUgPSAxMDI0OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGlmIChhdmN0eC0+c2FtcGxlX3JhdGUgPT0gYXZwcml2X21wZWc0YXVkaW9fc2FtcGxlX3JhdGVzW2ldKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBzLT5jaGFubmVscyA9IGF2Y3R4LT5jaGFubmVsczsKKworICAgIEVSUk9SX0lGKGkgPT0gMTYsCisgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICVkXG4iLCBhdmN0eC0+c2FtcGxlX3JhdGUpOworICAgIEVSUk9SX0lGKHMtPmNoYW5uZWxzID4gQUFDX01BWF9DSEFOTkVMUywKKyAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAlZFxuIiwgcy0+Y2hhbm5lbHMpOworICAgIEVSUk9SX0lGKGF2Y3R4LT5wcm9maWxlICE9IEZGX1BST0ZJTEVfVU5LTk9XTiAmJiBhdmN0eC0+cHJvZmlsZSAhPSBGRl9QUk9GSUxFX0FBQ19MT1csCisgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHByb2ZpbGUgJWRcbiIsIGF2Y3R4LT5wcm9maWxlKTsKKyAgICBFUlJPUl9JRigxMDI0LjAgKiBhdmN0eC0+Yml0X3JhdGUgLyBhdmN0eC0+c2FtcGxlX3JhdGUgPiA2MTQ0ICogcy0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgIlRvbyBtYW55IGJpdHMgcGVyIGZyYW1lIHJlcXVlc3RlZFxuIik7CisKKyAgICBzLT5zYW1wbGVyYXRlX2luZGV4ID0gaTsKKworICAgIHMtPmNoYW5fbWFwID0gYWFjX2NoYW5fY29uZmlnc1tzLT5jaGFubmVscy0xXTsKKworICAgIGlmIChyZXQgPSBkc3BfaW5pdChhdmN0eCwgcykpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChyZXQgPSBhbGxvY19idWZmZXJzKGF2Y3R4LCBzKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gNTsKKyAgICBwdXRfYXVkaW9fc3BlY2lmaWNfY29uZmlnKGF2Y3R4KTsKKworICAgIHNpemVzWzBdICAgPSBzd2Jfc2l6ZV8xMDI0W2ldOworICAgIHNpemVzWzFdICAgPSBzd2Jfc2l6ZV8xMjhbaV07CisgICAgbGVuZ3Roc1swXSA9IGZmX2FhY19udW1fc3diXzEwMjRbaV07CisgICAgbGVuZ3Roc1sxXSA9IGZmX2FhY19udW1fc3diXzEyOFtpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hhbl9tYXBbMF07IGkrKykKKyAgICAgICAgZ3JvdXBpbmdbaV0gPSBzLT5jaGFuX21hcFtpICsgMV0gPT0gVFlQRV9DUEU7CisgICAgaWYgKHJldCA9IGZmX3BzeV9pbml0KCZzLT5wc3ksIGF2Y3R4LCAyLCBzaXplcywgbGVuZ3Rocywgcy0+Y2hhbl9tYXBbMF0sIGdyb3VwaW5nKSkKKyAgICAgICAgZ290byBmYWlsOworICAgIHMtPnBzeXBwID0gZmZfcHN5X3ByZXByb2Nlc3NfaW5pdChhdmN0eCk7CisgICAgcy0+Y29kZXIgPSAmZmZfYWFjX2NvZGVyc1tzLT5vcHRpb25zLmFhY19jb2Rlcl07CisKKyAgICBpZiAoSEFWRV9NSVBTRFNQUjEpCisgICAgICAgIGZmX2FhY19jb2Rlcl9pbml0X21pcHMocyk7CisKKyAgICBzLT5sYW1iZGEgPSBhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgPiAwID8gYXZjdHgtPmdsb2JhbF9xdWFsaXR5IDogMTIwOworCisgICAgZmZfYWFjX3RhYmxlaW5pdCgpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQyODsgaSsrKQorICAgICAgICBmZl9hYWNfcG93MzRzZl90YWJbaV0gPSBzcXJ0KGZmX2FhY19wb3cyc2ZfdGFiW2ldICogc3FydChmZl9hYWNfcG93MnNmX3RhYltpXSkpOworCisgICAgYXZjdHgtPmluaXRpYWxfcGFkZGluZyA9IDEwMjQ7CisgICAgZmZfYWZfcXVldWVfaW5pdChhdmN0eCwgJnMtPmFmcSk7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYWFjX2VuY29kZV9lbmQoYXZjdHgpOworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgQUFDRU5DX0ZMQUdTIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIHwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhYWNlbmNfb3B0aW9uc1tdID0geworICAgIHsic3RlcmVvX21vZGUiLCAiU3RlcmVvIGNvZGluZyBtZXRob2QiLCBvZmZzZXRvZihBQUNFbmNDb250ZXh0LCBvcHRpb25zLnN0ZXJlb19tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAtMSwgMSwgQUFDRU5DX0ZMQUdTLCAic3RlcmVvX21vZGUifSwKKyAgICAgICAgeyJhdXRvIiwgICAgICJTZWxlY3RlZCBieSB0aGUgRW5jb2RlciIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IC0xIH0sIElOVF9NSU4sIElOVF9NQVgsIEFBQ0VOQ19GTEFHUywgInN0ZXJlb19tb2RlIn0sCisgICAgICAgIHsibXNfb2ZmIiwgICAiRGlzYWJsZSBNaWQvU2lkZSBjb2RpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAgMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBQUNFTkNfRkxBR1MsICJzdGVyZW9fbW9kZSJ9LAorICAgICAgICB7Im1zX2ZvcmNlIiwgIkZvcmNlIE1pZC9TaWRlIGZvciB0aGUgd2hvbGUgZnJhbWUgaWYgcG9zc2libGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAgMSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBQUNFTkNfRkxBR1MsICJzdGVyZW9fbW9kZSJ9LAorICAgIHsiYWFjX2NvZGVyIiwgIiIsIG9mZnNldG9mKEFBQ0VuY0NvbnRleHQsIG9wdGlvbnMuYWFjX2NvZGVyKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFBQ19DT0RFUl9UV09MT09QfSwgMCwgQUFDX0NPREVSX05CLTEsIEFBQ0VOQ19GTEFHUywgImFhY19jb2RlciJ9LAorICAgICAgICB7ImZhYWMiLCAgICAgIkZBQUMtaW5zcGlyZWQgbWV0aG9kIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBQUNfQ09ERVJfRkFBQ30sICAgIElOVF9NSU4sIElOVF9NQVgsIEFBQ0VOQ19GTEFHUywgImFhY19jb2RlciJ9LAorICAgICAgICB7ImFubXIiLCAgICAgIkFOTVIgbWV0aG9kIiwgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBQUNfQ09ERVJfQU5NUn0sICAgIElOVF9NSU4sIElOVF9NQVgsIEFBQ0VOQ19GTEFHUywgImFhY19jb2RlciJ9LAorICAgICAgICB7InR3b2xvb3AiLCAgIlR3byBsb29wIHNlYXJjaGluZyBtZXRob2QiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBQUNfQ09ERVJfVFdPTE9PUH0sIElOVF9NSU4sIElOVF9NQVgsIEFBQ0VOQ19GTEFHUywgImFhY19jb2RlciJ9LAorICAgICAgICB7ImZhc3QiLCAgICAgIkNvbnN0YW50IHF1YW50aXplciIsICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBQUNfQ09ERVJfRkFTVH0sICAgIElOVF9NSU4sIElOVF9NQVgsIEFBQ0VOQ19GTEFHUywgImFhY19jb2RlciJ9LAorICAgIHtOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYWFjZW5jX2NsYXNzID0geworICAgICJBQUMgZW5jb2RlciIsCisgICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgYWFjZW5jX29wdGlvbnMsCisgICAgTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworLyogZHVwbGljYXRlZCBmcm9tIGF2cHJpdl9tcGVnNGF1ZGlvX3NhbXBsZV9yYXRlcyB0byBhdm9pZCBzaGFyZWQgYnVpbGQKKyAqIGZhaWx1cmVzICovCitzdGF0aWMgY29uc3QgaW50IG1wZWc0YXVkaW9fc2FtcGxlX3JhdGVzWzE2XSA9IHsKKyAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLAorICAgIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MAorfTsKKworQVZDb2RlYyBmZl9hYWNfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYWFjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQUFDIChBZHZhbmNlZCBBdWRpbyBDb2RpbmcpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FBQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQUFDRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gYWFjX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGFhY19lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gYWFjX2VuY29kZV9lbmQsCisgICAgLnN1cHBvcnRlZF9zYW1wbGVyYXRlcyA9IG1wZWc0YXVkaW9fc2FtcGxlX3JhdGVzLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FIHwgQ09ERUNfQ0FQX0RFTEFZIHwKKyAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfRVhQRVJJTUVOVEFMLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZhYWNlbmNfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFjZW5jLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGVjYjFkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjZW5jLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIEFBQyBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQUFDRU5DX0gKKyNkZWZpbmUgQVZDT0RFQ19BQUNFTkNfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCisjaW5jbHVkZSAiYWFjLmgiCisjaW5jbHVkZSAiYXVkaW9fZnJhbWVfcXVldWUuaCIKKyNpbmNsdWRlICJwc3ltb2RlbC5oIgorCit0eXBlZGVmIGVudW0gQUFDQ29kZXIgeworICAgIEFBQ19DT0RFUl9GQUFDID0gMCwKKyAgICBBQUNfQ09ERVJfQU5NUiwKKyAgICBBQUNfQ09ERVJfVFdPTE9PUCwKKyAgICBBQUNfQ09ERVJfRkFTVCwKKworICAgIEFBQ19DT0RFUl9OQiwKK31BQUNDb2RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgQUFDRW5jT3B0aW9ucyB7CisgICAgaW50IHN0ZXJlb19tb2RlOworICAgIGludCBhYWNfY29kZXI7Cit9IEFBQ0VuY09wdGlvbnM7CisKK3N0cnVjdCBBQUNFbmNDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBBQUNDb2VmZmljaWVudHNFbmNvZGVyIHsKKyAgICB2b2lkICgqc2VhcmNoX2Zvcl9xdWFudGl6ZXJzKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHN0cnVjdCBBQUNFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UsIGNvbnN0IGZsb2F0IGxhbWJkYSk7CisgICAgdm9pZCAoKmVuY29kZV93aW5kb3dfYmFuZHNfaW5mbykoc3RydWN0IEFBQ0VuY0NvbnRleHQgKnMsIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbiwgaW50IGdyb3VwX2xlbiwgY29uc3QgZmxvYXQgbGFtYmRhKTsKKyAgICB2b2lkICgqcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kKShzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywgUHV0Qml0Q29udGV4dCAqcGIsIGNvbnN0IGZsb2F0ICppbiwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYWxlX2lkeCwgaW50IGNiLCBjb25zdCBmbG9hdCBsYW1iZGEpOworICAgIHZvaWQgKCpzZWFyY2hfZm9yX21zKShzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywgQ2hhbm5lbEVsZW1lbnQgKmNwZSwgY29uc3QgZmxvYXQgbGFtYmRhKTsKK30gQUFDQ29lZmZpY2llbnRzRW5jb2RlcjsKKworZXh0ZXJuIEFBQ0NvZWZmaWNpZW50c0VuY29kZXIgZmZfYWFjX2NvZGVyc1tdOworCisvKioKKyAqIEFBQyBlbmNvZGVyIGNvbnRleHQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQUFDRW5jQ29udGV4dCB7CisgICAgQVZDbGFzcyAqYXZfY2xhc3M7CisgICAgQUFDRW5jT3B0aW9ucyBvcHRpb25zOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBlbmNvZGluZyBvcHRpb25zCisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBGRlRDb250ZXh0IG1kY3QxMDI0OyAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGxvbmcgKDEwMjQgc2FtcGxlcykgZnJhbWUgdHJhbnNmb3JtIGNvbnRleHQKKyAgICBGRlRDb250ZXh0IG1kY3QxMjg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHNob3J0ICgxMjggc2FtcGxlcykgZnJhbWUgdHJhbnNmb3JtIGNvbnRleHQKKyAgICBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcDsKKyAgICBmbG9hdCAqcGxhbmFyX3NhbXBsZXNbNl07ICAgICAgICAgICAgICAgICAgICAvLy88IHNhdmVkIHByZXByb2Nlc3NlZCBpbnB1dAorCisgICAgaW50IHNhbXBsZXJhdGVfaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgc2FtcGxlcmF0ZSBpbmRleAorICAgIGludCBjaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2hhbm5lbCBjb3VudAorICAgIGNvbnN0IHVpbnQ4X3QgKmNoYW5fbWFwOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2hhbm5lbCBjb25maWd1cmF0aW9uIG1hcAorCisgICAgQ2hhbm5lbEVsZW1lbnQgKmNwZTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjaGFubmVsIGVsZW1lbnRzCisgICAgRkZQc3lDb250ZXh0IHBzeTsKKyAgICBzdHJ1Y3QgRkZQc3lQcmVwcm9jZXNzQ29udGV4dCogcHN5cHA7CisgICAgQUFDQ29lZmZpY2llbnRzRW5jb2RlciAqY29kZXI7CisgICAgaW50IGN1cl9jaGFubmVsOworICAgIGludCBsYXN0X2ZyYW1lOworICAgIGZsb2F0IGxhbWJkYTsKKyAgICBBdWRpb0ZyYW1lUXVldWUgYWZxOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50LCAgIHFjb2VmcylbOTZdOyAgICAgIC8vLzwgcXVhbnRpemVkIGNvZWZmaWNpZW50cworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHNjb2VmcylbMTAyNF07ICAgIC8vLzwgc2NhbGVkIGNvZWZmaWNpZW50cworCisgICAgc3RydWN0IHsKKyAgICAgICAgZmxvYXQgKnNhbXBsZXM7CisgICAgfSBidWZmZXI7Cit9IEFBQ0VuY0NvbnRleHQ7CisKK2V4dGVybiBmbG9hdCBmZl9hYWNfcG93MzRzZl90YWJbNDI4XTsKKwordm9pZCBmZl9hYWNfY29kZXJfaW5pdF9taXBzKEFBQ0VuY0NvbnRleHQgKmMpOworCisjZW5kaWYgLyogQVZDT0RFQ19BQUNFTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFjcHMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwMTJmOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzLmMKQEAgLTAsMCArMSw5NzQgQEAKKy8qCisgKiBNUEVHLTQgUGFyYW1ldHJpYyBTdGVyZW8gZGVjb2RpbmcgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQWxleCBDb252ZXJzZSA8YWxleC5jb252ZXJzZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiYWFjcHMuaCIKKyNpbmNsdWRlICJhYWNwc190YWJsZWdlbi5oIgorI2luY2x1ZGUgImFhY3BzZGF0YS5jIgorCisjZGVmaW5lIFBTX0JBU0VMSU5FIDAgIC8vLzwgT3BlcmF0ZSBpbiBCYXNlbGluZSBQUyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQmFzZWxpbmUgaW1wbGllcyAxMCBvciAyMCBzdGVyZW8gYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbWl4aW5nIG1vZGUgQSwgYW5kIG5vIGlwZC9vcGQKKworI2RlZmluZSBudW1RTUZTbG90cyAzMiAvL251bVRpbWVTbG90cyAqIFJBVEUKKworc3RhdGljIGNvbnN0IGludDhfdCBudW1fZW52X3RhYlsyXVs0XSA9IHsKKyAgICB7IDAsIDEsIDIsIDQsIH0sCisgICAgeyAxLCAyLCAzLCA0LCB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBucl9paWRpY2NfcGFyX3RhYltdID0geworICAgIDEwLCAyMCwgMzQsIDEwLCAyMCwgMzQsCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IG5yX2lpZG9wZF9wYXJfdGFiW10gPSB7CisgICAgIDUsIDExLCAxNywgIDUsIDExLCAxNywKK307CisKK2VudW0geworICAgIGh1ZmZfaWlkX2RmMSwKKyAgICBodWZmX2lpZF9kdDEsCisgICAgaHVmZl9paWRfZGYwLAorICAgIGh1ZmZfaWlkX2R0MCwKKyAgICBodWZmX2ljY19kZiwKKyAgICBodWZmX2ljY19kdCwKKyAgICBodWZmX2lwZF9kZiwKKyAgICBodWZmX2lwZF9kdCwKKyAgICBodWZmX29wZF9kZiwKKyAgICBodWZmX29wZF9kdCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgaHVmZl9paWRbXSA9IHsKKyAgICBodWZmX2lpZF9kZjAsCisgICAgaHVmZl9paWRfZGYxLAorICAgIGh1ZmZfaWlkX2R0MCwKKyAgICBodWZmX2lpZF9kdDEsCit9OworCitzdGF0aWMgVkxDIHZsY19wc1sxMF07CisKKyNkZWZpbmUgUkVBRF9QQVJfREFUQShQQVIsIE9GRlNFVCwgTUFTSywgRVJSX0NPTkRJVElPTikgXAorLyoqIFwKKyAqIFJlYWQgSW50ZXItY2hhbm5lbCBJbnRlbnNpdHkgRGlmZmVyZW5jZS9JbnRlci1DaGFubmVsIENvaGVyZW5jZS8gXAorICogSW50ZXItY2hhbm5lbCBQaGFzZSBEaWZmZXJlbmNlL092ZXJhbGwgUGhhc2UgRGlmZmVyZW5jZSBwYXJhbWV0ZXJzIGZyb20gdGhlIFwKKyAqIGJpdHN0cmVhbS4gXAorICogXAorICogQHBhcmFtIGF2Y3R4IGNvbnRhaW5zIHRoZSBjdXJyZW50IGNvZGVjIGNvbnRleHQgXAorICogQHBhcmFtIGdiICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJpdHN0cmVhbSBcCisgKiBAcGFyYW0gcHMgICAgcG9pbnRlciB0byB0aGUgUGFyYW1ldHJpYyBTdGVyZW8gY29udGV4dCBcCisgKiBAcGFyYW0gUEFSICAgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVyIHRvIGJlIHJlYWQgXAorICogQHBhcmFtIGUgICAgIGVudmVsb3BlIHRvIGRlY29kZSBcCisgKiBAcGFyYW0gZHQgICAgMTogdGltZSBkZWx0YS1jb2RlZCwgMDogZnJlcXVlbmN5IGRlbHRhLWNvZGVkIFwKKyAqLyBcCitzdGF0aWMgaW50IHJlYWRfICMjIFBBUiAjIyBfZGF0YShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEdldEJpdENvbnRleHQgKmdiLCBQU0NvbnRleHQgKnBzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKCpQQVIpW1BTX01BWF9OUl9JSURJQ0NdLCBpbnQgdGFibGVfaWR4LCBpbnQgZSwgaW50IGR0KSBcCit7IFwKKyAgICBpbnQgYiwgbnVtID0gcHMtPm5yXyAjIyBQQVIgIyMgX3BhcjsgXAorICAgIFZMQ19UWVBFICgqdmxjX3RhYmxlKVsyXSA9IHZsY19wc1t0YWJsZV9pZHhdLnRhYmxlOyBcCisgICAgaWYgKGR0KSB7IFwKKyAgICAgICAgaW50IGVfcHJldiA9IGUgPyBlIC0gMSA6IHBzLT5udW1fZW52X29sZCAtIDE7IFwKKyAgICAgICAgZV9wcmV2ID0gRkZNQVgoZV9wcmV2LCAwKTsgXAorICAgICAgICBmb3IgKGIgPSAwOyBiIDwgbnVtOyBiKyspIHsgXAorICAgICAgICAgICAgaW50IHZhbCA9IFBBUltlX3ByZXZdW2JdICsgZ2V0X3ZsYzIoZ2IsIHZsY190YWJsZSwgOSwgMykgLSBPRkZTRVQ7IFwKKyAgICAgICAgICAgIGlmIChNQVNLKSB2YWwgJj0gTUFTSzsgXAorICAgICAgICAgICAgUEFSW2VdW2JdID0gdmFsOyBcCisgICAgICAgICAgICBpZiAoRVJSX0NPTkRJVElPTikgXAorICAgICAgICAgICAgICAgIGdvdG8gZXJyOyBcCisgICAgICAgIH0gXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgaW50IHZhbCA9IDA7IFwKKyAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bTsgYisrKSB7IFwKKyAgICAgICAgICAgIHZhbCArPSBnZXRfdmxjMihnYiwgdmxjX3RhYmxlLCA5LCAzKSAtIE9GRlNFVDsgXAorICAgICAgICAgICAgaWYgKE1BU0spIHZhbCAmPSBNQVNLOyBcCisgICAgICAgICAgICBQQVJbZV1bYl0gPSB2YWw7IFwKKyAgICAgICAgICAgIGlmIChFUlJfQ09ORElUSU9OKSBcCisgICAgICAgICAgICAgICAgZ290byBlcnI7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgcmV0dXJuIDA7IFwKK2VycjogXAorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCAiI1BBUiJcbiIpOyBcCisgICAgcmV0dXJuIC0xOyBcCit9CisKK1JFQURfUEFSX0RBVEEoaWlkLCAgICBodWZmX29mZnNldFt0YWJsZV9pZHhdLCAgICAwLCBGRkFCUyhwcy0+aWlkX3BhcltlXVtiXSkgPiA3ICsgOCAqIHBzLT5paWRfcXVhbnQpCitSRUFEX1BBUl9EQVRBKGljYywgICAgaHVmZl9vZmZzZXRbdGFibGVfaWR4XSwgICAgMCwgcHMtPmljY19wYXJbZV1bYl0gPiA3VSkKK1JFQURfUEFSX0RBVEEoaXBkb3BkLCAgICAgICAgICAgICAgICAgICAgICAwLCAweDA3LCAwKQorCitzdGF0aWMgaW50IHBzX3JlYWRfZXh0ZW5zaW9uX2RhdGEoR2V0Qml0Q29udGV4dCAqZ2IsIFBTQ29udGV4dCAqcHMsIGludCBwc19leHRlbnNpb25faWQpCit7CisgICAgaW50IGU7CisgICAgaW50IGNvdW50ID0gZ2V0X2JpdHNfY291bnQoZ2IpOworCisgICAgaWYgKHBzX2V4dGVuc2lvbl9pZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBwcy0+ZW5hYmxlX2lwZG9wZCA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKHBzLT5lbmFibGVfaXBkb3BkKSB7CisgICAgICAgIGZvciAoZSA9IDA7IGUgPCBwcy0+bnVtX2VudjsgZSsrKSB7CisgICAgICAgICAgICBpbnQgZHQgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgcmVhZF9pcGRvcGRfZGF0YShOVUxMLCBnYiwgcHMsIHBzLT5pcGRfcGFyLCBkdCA/IGh1ZmZfaXBkX2R0IDogaHVmZl9pcGRfZGYsIGUsIGR0KTsKKyAgICAgICAgICAgIGR0ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIHJlYWRfaXBkb3BkX2RhdGEoTlVMTCwgZ2IsIHBzLCBwcy0+b3BkX3BhciwgZHQgPyBodWZmX29wZF9kdCA6IGh1ZmZfb3BkX2RmLCBlLCBkdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcF9iaXRzMShnYik7ICAgICAgLy9yZXNlcnZlZF9wcworICAgIHJldHVybiBnZXRfYml0c19jb3VudChnYikgLSBjb3VudDsKK30KKworc3RhdGljIHZvaWQgaXBkb3BkX3Jlc2V0KGludDhfdCAqaXBkX2hpc3QsIGludDhfdCAqb3BkX2hpc3QpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IFBTX01BWF9OUl9JUERPUEQ7IGkrKykgeworICAgICAgICBvcGRfaGlzdFtpXSA9IDA7CisgICAgICAgIGlwZF9oaXN0W2ldID0gMDsKKyAgICB9Cit9CisKK2ludCBmZl9wc19yZWFkX2RhdGEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYl9ob3N0LCBQU0NvbnRleHQgKnBzLCBpbnQgYml0c19sZWZ0KQoreworICAgIGludCBlOworICAgIGludCBiaXRfY291bnRfc3RhcnQgPSBnZXRfYml0c19jb3VudChnYl9ob3N0KTsKKyAgICBpbnQgaGVhZGVyOworICAgIGludCBiaXRzX2NvbnN1bWVkOworICAgIEdldEJpdENvbnRleHQgZ2JjID0gKmdiX2hvc3QsICpnYiA9ICZnYmM7CisKKyAgICBoZWFkZXIgPSBnZXRfYml0czEoZ2IpOworICAgIGlmIChoZWFkZXIpIHsgICAgIC8vZW5hYmxlX3BzX2hlYWRlcgorICAgICAgICBwcy0+ZW5hYmxlX2lpZCA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGlmIChwcy0+ZW5hYmxlX2lpZCkgeworICAgICAgICAgICAgaW50IGlpZF9tb2RlID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgaWYgKGlpZF9tb2RlID4gNSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWlkX21vZGUgJWQgaXMgcmVzZXJ2ZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBpaWRfbW9kZSk7CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcy0+bnJfaWlkX3BhciAgICA9IG5yX2lpZGljY19wYXJfdGFiW2lpZF9tb2RlXTsKKyAgICAgICAgICAgIHBzLT5paWRfcXVhbnQgICAgID0gaWlkX21vZGUgPiAyOworICAgICAgICAgICAgcHMtPm5yX2lwZG9wZF9wYXIgPSBucl9paWRvcGRfcGFyX3RhYltpaWRfbW9kZV07CisgICAgICAgIH0KKyAgICAgICAgcHMtPmVuYWJsZV9pY2MgPSBnZXRfYml0czEoZ2IpOworICAgICAgICBpZiAocHMtPmVuYWJsZV9pY2MpIHsKKyAgICAgICAgICAgIHBzLT5pY2NfbW9kZSA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgICAgIGlmIChwcy0+aWNjX21vZGUgPiA1KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpY2NfbW9kZSAlZCBpcyByZXNlcnZlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHBzLT5pY2NfbW9kZSk7CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcy0+bnJfaWNjX3BhciA9IG5yX2lpZGljY19wYXJfdGFiW3BzLT5pY2NfbW9kZV07CisgICAgICAgIH0KKyAgICAgICAgcHMtPmVuYWJsZV9leHQgPSBnZXRfYml0czEoZ2IpOworICAgIH0KKworICAgIHBzLT5mcmFtZV9jbGFzcyA9IGdldF9iaXRzMShnYik7CisgICAgcHMtPm51bV9lbnZfb2xkID0gcHMtPm51bV9lbnY7CisgICAgcHMtPm51bV9lbnYgICAgID0gbnVtX2Vudl90YWJbcHMtPmZyYW1lX2NsYXNzXVtnZXRfYml0cyhnYiwgMildOworCisgICAgcHMtPmJvcmRlcl9wb3NpdGlvblswXSA9IC0xOworICAgIGlmIChwcy0+ZnJhbWVfY2xhc3MpIHsKKyAgICAgICAgZm9yIChlID0gMTsgZSA8PSBwcy0+bnVtX2VudjsgZSsrKQorICAgICAgICAgICAgcHMtPmJvcmRlcl9wb3NpdGlvbltlXSA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICB9IGVsc2UKKyAgICAgICAgZm9yIChlID0gMTsgZSA8PSBwcy0+bnVtX2VudjsgZSsrKQorICAgICAgICAgICAgcHMtPmJvcmRlcl9wb3NpdGlvbltlXSA9IChlICogbnVtUU1GU2xvdHMgPj4gZmZfbG9nMl90YWJbcHMtPm51bV9lbnZdKSAtIDE7CisKKyAgICBpZiAocHMtPmVuYWJsZV9paWQpIHsKKyAgICAgICAgZm9yIChlID0gMDsgZSA8IHBzLT5udW1fZW52OyBlKyspIHsKKyAgICAgICAgICAgIGludCBkdCA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAocmVhZF9paWRfZGF0YShhdmN0eCwgZ2IsIHBzLCBwcy0+aWlkX3BhciwgaHVmZl9paWRbMipkdCtwcy0+aWlkX3F1YW50XSwgZSwgZHQpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIG1lbXNldChwcy0+aWlkX3BhciwgMCwgc2l6ZW9mKHBzLT5paWRfcGFyKSk7CisKKyAgICBpZiAocHMtPmVuYWJsZV9pY2MpCisgICAgICAgIGZvciAoZSA9IDA7IGUgPCBwcy0+bnVtX2VudjsgZSsrKSB7CisgICAgICAgICAgICBpbnQgZHQgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgaWYgKHJlYWRfaWNjX2RhdGEoYXZjdHgsIGdiLCBwcywgcHMtPmljY19wYXIsIGR0ID8gaHVmZl9pY2NfZHQgOiBodWZmX2ljY19kZiwgZSwgZHQpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgZWxzZQorICAgICAgICBtZW1zZXQocHMtPmljY19wYXIsIDAsIHNpemVvZihwcy0+aWNjX3BhcikpOworCisgICAgaWYgKHBzLT5lbmFibGVfZXh0KSB7CisgICAgICAgIGludCBjbnQgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgIGlmIChjbnQgPT0gMTUpIHsKKyAgICAgICAgICAgIGNudCArPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIH0KKyAgICAgICAgY250ICo9IDg7CisgICAgICAgIHdoaWxlIChjbnQgPiA3KSB7CisgICAgICAgICAgICBpbnQgcHNfZXh0ZW5zaW9uX2lkID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgY250IC09IDIgKyBwc19yZWFkX2V4dGVuc2lvbl9kYXRhKGdiLCBwcywgcHNfZXh0ZW5zaW9uX2lkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY250IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwcyBleHRlbnNpb24gb3ZlcmZsb3cgJWRcbiIsIGNudCk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBza2lwX2JpdHMoZ2IsIGNudCk7CisgICAgfQorCisgICAgcHMtPmVuYWJsZV9pcGRvcGQgJj0gIVBTX0JBU0VMSU5FOworCisgICAgLy9GaXggdXAgZW52ZWxvcGVzCisgICAgaWYgKCFwcy0+bnVtX2VudiB8fCBwcy0+Ym9yZGVyX3Bvc2l0aW9uW3BzLT5udW1fZW52XSA8IG51bVFNRlNsb3RzIC0gMSkgeworICAgICAgICAvL0NyZWF0ZSBhIGZha2UgZW52ZWxvcGUKKyAgICAgICAgaW50IHNvdXJjZSA9IHBzLT5udW1fZW52ID8gcHMtPm51bV9lbnYgLSAxIDogcHMtPm51bV9lbnZfb2xkIC0gMTsKKyAgICAgICAgaW50IGI7CisgICAgICAgIGlmIChzb3VyY2UgPj0gMCAmJiBzb3VyY2UgIT0gcHMtPm51bV9lbnYpIHsKKyAgICAgICAgICAgIGlmIChwcy0+ZW5hYmxlX2lpZCkgeworICAgICAgICAgICAgICAgIG1lbWNweShwcy0+aWlkX3Bhcitwcy0+bnVtX2VudiwgcHMtPmlpZF9wYXIrc291cmNlLCBzaXplb2YocHMtPmlpZF9wYXJbMF0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcy0+ZW5hYmxlX2ljYykgeworICAgICAgICAgICAgICAgIG1lbWNweShwcy0+aWNjX3Bhcitwcy0+bnVtX2VudiwgcHMtPmljY19wYXIrc291cmNlLCBzaXplb2YocHMtPmljY19wYXJbMF0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcy0+ZW5hYmxlX2lwZG9wZCkgeworICAgICAgICAgICAgICAgIG1lbWNweShwcy0+aXBkX3Bhcitwcy0+bnVtX2VudiwgcHMtPmlwZF9wYXIrc291cmNlLCBzaXplb2YocHMtPmlwZF9wYXJbMF0pKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocHMtPm9wZF9wYXIrcHMtPm51bV9lbnYsIHBzLT5vcGRfcGFyK3NvdXJjZSwgc2l6ZW9mKHBzLT5vcGRfcGFyWzBdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBzLT5lbmFibGVfaWlkKXsKKyAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBwcy0+bnJfaWlkX3BhcjsgYisrKSB7CisgICAgICAgICAgICAgICAgaWYgKEZGQUJTKHBzLT5paWRfcGFyW3BzLT5udW1fZW52XVtiXSkgPiA3ICsgOCAqIHBzLT5paWRfcXVhbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpaWRfcGFyIGludmFsaWRcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBzLT5lbmFibGVfaWNjKXsKKyAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBwcy0+bnJfaWlkX3BhcjsgYisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBzLT5pY2NfcGFyW3BzLT5udW1fZW52XVtiXSA+IDdVKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWNjX3BhciBpbnZhbGlkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBzLT5udW1fZW52Kys7CisgICAgICAgIHBzLT5ib3JkZXJfcG9zaXRpb25bcHMtPm51bV9lbnZdID0gbnVtUU1GU2xvdHMgLSAxOworICAgIH0KKworCisgICAgcHMtPmlzMzRiYW5kc19vbGQgPSBwcy0+aXMzNGJhbmRzOworICAgIGlmICghUFNfQkFTRUxJTkUgJiYgKHBzLT5lbmFibGVfaWlkIHx8IHBzLT5lbmFibGVfaWNjKSkKKyAgICAgICAgcHMtPmlzMzRiYW5kcyA9IChwcy0+ZW5hYmxlX2lpZCAmJiBwcy0+bnJfaWlkX3BhciA9PSAzNCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwcy0+ZW5hYmxlX2ljYyAmJiBwcy0+bnJfaWNjX3BhciA9PSAzNCk7CisKKyAgICAvL0Jhc2VsaW5lCisgICAgaWYgKCFwcy0+ZW5hYmxlX2lwZG9wZCkgeworICAgICAgICBtZW1zZXQocHMtPmlwZF9wYXIsIDAsIHNpemVvZihwcy0+aXBkX3BhcikpOworICAgICAgICBtZW1zZXQocHMtPm9wZF9wYXIsIDAsIHNpemVvZihwcy0+b3BkX3BhcikpOworICAgIH0KKworICAgIGlmIChoZWFkZXIpCisgICAgICAgIHBzLT5zdGFydCA9IDE7CisKKyAgICBiaXRzX2NvbnN1bWVkID0gZ2V0X2JpdHNfY291bnQoZ2IpIC0gYml0X2NvdW50X3N0YXJ0OworICAgIGlmIChiaXRzX2NvbnN1bWVkIDw9IGJpdHNfbGVmdCkgeworICAgICAgICBza2lwX2JpdHNfbG9uZyhnYl9ob3N0LCBiaXRzX2NvbnN1bWVkKTsKKyAgICAgICAgcmV0dXJuIGJpdHNfY29uc3VtZWQ7CisgICAgfQorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXhwZWN0ZWQgdG8gcmVhZCAlZCBQUyBiaXRzIGFjdHVhbGx5IHJlYWQgJWQuXG4iLCBiaXRzX2xlZnQsIGJpdHNfY29uc3VtZWQpOworZXJyOgorICAgIHBzLT5zdGFydCA9IDA7CisgICAgc2tpcF9iaXRzX2xvbmcoZ2JfaG9zdCwgYml0c19sZWZ0KTsKKyAgICBtZW1zZXQocHMtPmlpZF9wYXIsIDAsIHNpemVvZihwcy0+aWlkX3BhcikpOworICAgIG1lbXNldChwcy0+aWNjX3BhciwgMCwgc2l6ZW9mKHBzLT5pY2NfcGFyKSk7CisgICAgbWVtc2V0KHBzLT5pcGRfcGFyLCAwLCBzaXplb2YocHMtPmlwZF9wYXIpKTsKKyAgICBtZW1zZXQocHMtPm9wZF9wYXIsIDAsIHNpemVvZihwcy0+b3BkX3BhcikpOworICAgIHJldHVybiBiaXRzX2xlZnQ7Cit9CisKKy8qKiBTcGxpdCBvbmUgc3ViYmFuZCBpbnRvIDIgc3Vic3ViYmFuZHMgd2l0aCBhIHN5bW1ldHJpYyByZWFsIGZpbHRlci4KKyAqIFRoZSBmaWx0ZXIgbXVzdCBoYXZlIGl0cyBub24tY2VudGVyIGV2ZW4gY29lZmZpY2llbnRzIGVxdWFsIHRvIHplcm8uICovCitzdGF0aWMgdm9pZCBoeWJyaWQyX3JlKGZsb2F0ICgqaW4pWzJdLCBmbG9hdCAoKm91dClbMzJdWzJdLCBjb25zdCBmbG9hdCBmaWx0ZXJbOF0sIGludCBsZW4sIGludCByZXZlcnNlKQoreworICAgIGludCBpLCBqOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgaW4rKykgeworICAgICAgICBmbG9hdCByZV9pbiA9IGZpbHRlcls2XSAqIGluWzZdWzBdOyAgICAgICAgICAvL3JlYWwgaW5waGFzZQorICAgICAgICBmbG9hdCByZV9vcCA9IDAuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JlYWwgb3V0IG9mIHBoYXNlCisgICAgICAgIGZsb2F0IGltX2luID0gZmlsdGVyWzZdICogaW5bNl1bMV07ICAgICAgICAgIC8vaW1hZyBpbnBoYXNlCisgICAgICAgIGZsb2F0IGltX29wID0gMC4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaW1hZyBvdXQgb2YgcGhhc2UKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDY7IGogKz0gMikgeworICAgICAgICAgICAgcmVfb3AgKz0gZmlsdGVyW2orMV0gKiAoaW5baisxXVswXSArIGluWzEyLWotMV1bMF0pOworICAgICAgICAgICAgaW1fb3AgKz0gZmlsdGVyW2orMV0gKiAoaW5baisxXVsxXSArIGluWzEyLWotMV1bMV0pOworICAgICAgICB9CisgICAgICAgIG91dFsgcmV2ZXJzZV1baV1bMF0gPSByZV9pbiArIHJlX29wOworICAgICAgICBvdXRbIHJldmVyc2VdW2ldWzFdID0gaW1faW4gKyBpbV9vcDsKKyAgICAgICAgb3V0WyFyZXZlcnNlXVtpXVswXSA9IHJlX2luIC0gcmVfb3A7CisgICAgICAgIG91dFshcmV2ZXJzZV1baV1bMV0gPSBpbV9pbiAtIGltX29wOworICAgIH0KK30KKworLyoqIFNwbGl0IG9uZSBzdWJiYW5kIGludG8gNiBzdWJzdWJiYW5kcyB3aXRoIGEgY29tcGxleCBmaWx0ZXIgKi8KK3N0YXRpYyB2b2lkIGh5YnJpZDZfY3goUFNEU1BDb250ZXh0ICpkc3AsIGZsb2F0ICgqaW4pWzJdLCBmbG9hdCAoKm91dClbMzJdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICBUQUJMRV9DT05TVCBmbG9hdCAoKmZpbHRlcilbOF1bMl0sIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgaW50IE4gPSA4OworICAgIExPQ0FMX0FMSUdORURfMTYoZmxvYXQsIHRlbXAsIFs4XSwgWzJdKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgaW4rKykgeworICAgICAgICBkc3AtPmh5YnJpZF9hbmFseXNpcyh0ZW1wLCBpbiwgKGNvbnN0IGZsb2F0ICgqKVs4XVsyXSkgZmlsdGVyLCAxLCBOKTsKKyAgICAgICAgb3V0WzBdW2ldWzBdID0gdGVtcFs2XVswXTsKKyAgICAgICAgb3V0WzBdW2ldWzFdID0gdGVtcFs2XVsxXTsKKyAgICAgICAgb3V0WzFdW2ldWzBdID0gdGVtcFs3XVswXTsKKyAgICAgICAgb3V0WzFdW2ldWzFdID0gdGVtcFs3XVsxXTsKKyAgICAgICAgb3V0WzJdW2ldWzBdID0gdGVtcFswXVswXTsKKyAgICAgICAgb3V0WzJdW2ldWzFdID0gdGVtcFswXVsxXTsKKyAgICAgICAgb3V0WzNdW2ldWzBdID0gdGVtcFsxXVswXTsKKyAgICAgICAgb3V0WzNdW2ldWzFdID0gdGVtcFsxXVsxXTsKKyAgICAgICAgb3V0WzRdW2ldWzBdID0gdGVtcFsyXVswXSArIHRlbXBbNV1bMF07CisgICAgICAgIG91dFs0XVtpXVsxXSA9IHRlbXBbMl1bMV0gKyB0ZW1wWzVdWzFdOworICAgICAgICBvdXRbNV1baV1bMF0gPSB0ZW1wWzNdWzBdICsgdGVtcFs0XVswXTsKKyAgICAgICAgb3V0WzVdW2ldWzFdID0gdGVtcFszXVsxXSArIHRlbXBbNF1bMV07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoeWJyaWQ0XzhfMTJfY3goUFNEU1BDb250ZXh0ICpkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKCppbilbMl0sIGZsb2F0ICgqb3V0KVszMl1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFCTEVfQ09OU1QgZmxvYXQgKCpmaWx0ZXIpWzhdWzJdLCBpbnQgTiwgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgaW4rKykgeworICAgICAgICBkc3AtPmh5YnJpZF9hbmFseXNpcyhvdXRbMF0gKyBpLCBpbiwgKGNvbnN0IGZsb2F0ICgqKVs4XVsyXSkgZmlsdGVyLCAzMiwgTik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoeWJyaWRfYW5hbHlzaXMoUFNEU1BDb250ZXh0ICpkc3AsIGZsb2F0IG91dFs5MV1bMzJdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGluWzVdWzQ0XVsyXSwgZmxvYXQgTFsyXVszOF1bNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpczM0LCBpbnQgbGVuKQoreworICAgIGludCBpLCBqOworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDM4OyBqKyspIHsKKyAgICAgICAgICAgIGluW2ldW2orNl1bMF0gPSBMWzBdW2pdW2ldOworICAgICAgICAgICAgaW5baV1bais2XVsxXSA9IExbMV1bal1baV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGlzMzQpIHsKKyAgICAgICAgaHlicmlkNF84XzEyX2N4KGRzcCwgaW5bMF0sIG91dCwgICAgZjM0XzBfMTIsIDEyLCBsZW4pOworICAgICAgICBoeWJyaWQ0XzhfMTJfY3goZHNwLCBpblsxXSwgb3V0KzEyLCBmMzRfMV84LCAgIDgsIGxlbik7CisgICAgICAgIGh5YnJpZDRfOF8xMl9jeChkc3AsIGluWzJdLCBvdXQrMjAsIGYzNF8yXzQsICAgNCwgbGVuKTsKKyAgICAgICAgaHlicmlkNF84XzEyX2N4KGRzcCwgaW5bM10sIG91dCsyNCwgZjM0XzJfNCwgICA0LCBsZW4pOworICAgICAgICBoeWJyaWQ0XzhfMTJfY3goZHNwLCBpbls0XSwgb3V0KzI4LCBmMzRfMl80LCAgIDQsIGxlbik7CisgICAgICAgIGRzcC0+aHlicmlkX2FuYWx5c2lzX2lsZWF2ZShvdXQgKyAyNywgTCwgNSwgbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoeWJyaWQ2X2N4KGRzcCwgaW5bMF0sIG91dCwgZjIwXzBfOCwgbGVuKTsKKyAgICAgICAgaHlicmlkMl9yZShpblsxXSwgb3V0KzYsIGcxX1EyLCBsZW4sIDEpOworICAgICAgICBoeWJyaWQyX3JlKGluWzJdLCBvdXQrOCwgZzFfUTIsIGxlbiwgMCk7CisgICAgICAgIGRzcC0+aHlicmlkX2FuYWx5c2lzX2lsZWF2ZShvdXQgKyA3LCBMLCAzLCBsZW4pOworICAgIH0KKyAgICAvL3VwZGF0ZSBpbl9idWYKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIG1lbWNweShpbltpXSwgaW5baV0rMzIsIDYgKiBzaXplb2YoaW5baV1bMF0pKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGh5YnJpZF9zeW50aGVzaXMoUFNEU1BDb250ZXh0ICpkc3AsIGZsb2F0IG91dFsyXVszOF1bNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBpbls5MV1bMzJdWzJdLCBpbnQgaXMzNCwgaW50IGxlbikKK3sKKyAgICBpbnQgaSwgbjsKKyAgICBpZiAoaXMzNCkgeworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbGVuOyBuKyspIHsKKyAgICAgICAgICAgIG1lbXNldChvdXRbMF1bbl0sIDAsIDUqc2l6ZW9mKG91dFswXVtuXVswXSkpOworICAgICAgICAgICAgbWVtc2V0KG91dFsxXVtuXSwgMCwgNSpzaXplb2Yob3V0WzFdW25dWzBdKSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworICAgICAgICAgICAgICAgIG91dFswXVtuXVswXSArPSBpblsgICBpXVtuXVswXTsKKyAgICAgICAgICAgICAgICBvdXRbMV1bbl1bMF0gKz0gaW5bICAgaV1bbl1bMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgICAgb3V0WzBdW25dWzFdICs9IGluWzEyK2ldW25dWzBdOworICAgICAgICAgICAgICAgIG91dFsxXVtuXVsxXSArPSBpblsxMitpXVtuXVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXRbMF1bbl1bMl0gKz0gaW5bMjAraV1bbl1bMF07CisgICAgICAgICAgICAgICAgb3V0WzFdW25dWzJdICs9IGluWzIwK2ldW25dWzFdOworICAgICAgICAgICAgICAgIG91dFswXVtuXVszXSArPSBpblsyNCtpXVtuXVswXTsKKyAgICAgICAgICAgICAgICBvdXRbMV1bbl1bM10gKz0gaW5bMjQraV1bbl1bMV07CisgICAgICAgICAgICAgICAgb3V0WzBdW25dWzRdICs9IGluWzI4K2ldW25dWzBdOworICAgICAgICAgICAgICAgIG91dFsxXVtuXVs0XSArPSBpblsyOCtpXVtuXVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc3AtPmh5YnJpZF9zeW50aGVzaXNfZGVpbnQob3V0LCBpbiArIDI3LCA1LCBsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBsZW47IG4rKykgeworICAgICAgICAgICAgb3V0WzBdW25dWzBdID0gaW5bMF1bbl1bMF0gKyBpblsxXVtuXVswXSArIGluWzJdW25dWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluWzNdW25dWzBdICsgaW5bNF1bbl1bMF0gKyBpbls1XVtuXVswXTsKKyAgICAgICAgICAgIG91dFsxXVtuXVswXSA9IGluWzBdW25dWzFdICsgaW5bMV1bbl1bMV0gKyBpblsyXVtuXVsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpblszXVtuXVsxXSArIGluWzRdW25dWzFdICsgaW5bNV1bbl1bMV07CisgICAgICAgICAgICBvdXRbMF1bbl1bMV0gPSBpbls2XVtuXVswXSArIGluWzddW25dWzBdOworICAgICAgICAgICAgb3V0WzFdW25dWzFdID0gaW5bNl1bbl1bMV0gKyBpbls3XVtuXVsxXTsKKyAgICAgICAgICAgIG91dFswXVtuXVsyXSA9IGluWzhdW25dWzBdICsgaW5bOV1bbl1bMF07CisgICAgICAgICAgICBvdXRbMV1bbl1bMl0gPSBpbls4XVtuXVsxXSArIGluWzldW25dWzFdOworICAgICAgICB9CisgICAgICAgIGRzcC0+aHlicmlkX3N5bnRoZXNpc19kZWludChvdXQsIGluICsgNywgMywgbGVuKTsKKyAgICB9Cit9CisKKy8vLyBBbGwtcGFzcyBmaWx0ZXIgZGVjYXkgc2xvcGUKKyNkZWZpbmUgREVDQVlfU0xPUEUgICAgICAwLjA1ZgorLy8vIE51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMgdGhhdCBjYW4gYmUgYWRkcmVzc2VkIGJ5IHRoZSBwYXJhbWV0ZXIgaW5kZXgsIGIoaykKK3N0YXRpYyBjb25zdCBpbnQgICBOUl9QQVJfQkFORFNbXSAgICAgID0geyAyMCwgMzQgfTsKK3N0YXRpYyBjb25zdCBpbnQgICBOUl9JUERPUERfQkFORFNbXSAgID0geyAxMSwgMTcgfTsKKy8vLyBOdW1iZXIgb2YgZnJlcXVlbmN5IGJhbmRzIHRoYXQgY2FuIGJlIGFkZHJlc3NlZCBieSB0aGUgc3ViIHN1YmJhbmQgaW5kZXgsIGsKK3N0YXRpYyBjb25zdCBpbnQgICBOUl9CQU5EU1tdICAgICAgICAgID0geyA3MSwgOTEgfTsKKy8vLyBTdGFydCBmcmVxdWVuY3kgYmFuZCBmb3IgdGhlIGFsbC1wYXNzIGZpbHRlciBkZWNheSBzbG9wZQorc3RhdGljIGNvbnN0IGludCAgIERFQ0FZX0NVVE9GRltdICAgICAgPSB7IDEwLCAzMiB9OworLy8vIE51bWJlciBvZiBhbGwtcGFzcyBmaWxlciBiYW5kcworc3RhdGljIGNvbnN0IGludCAgIE5SX0FMTFBBU1NfQkFORFNbXSAgPSB7IDMwLCA1MCB9OworLy8vIEZpcnN0IHN0ZXJlbyBiYW5kIHVzaW5nIHRoZSBzaG9ydCBvbmUgc2FtcGxlIGRlbGF5CitzdGF0aWMgY29uc3QgaW50ICAgU0hPUlRfREVMQVlfQkFORFtdICA9IHsgNDIsIDYyIH07CisKKy8qKiBUYWJsZSA4LjQ2ICovCitzdGF0aWMgdm9pZCBtYXBfaWR4XzEwX3RvXzIwKGludDhfdCAqcGFyX21hcHBlZCwgY29uc3QgaW50OF90ICpwYXIsIGludCBmdWxsKQoreworICAgIGludCBiOworICAgIGlmIChmdWxsKQorICAgICAgICBiID0gOTsKKyAgICBlbHNlIHsKKyAgICAgICAgYiA9IDQ7CisgICAgICAgIHBhcl9tYXBwZWRbMTBdID0gMDsKKyAgICB9CisgICAgZm9yICg7IGIgPj0gMDsgYi0tKSB7CisgICAgICAgIHBhcl9tYXBwZWRbMipiKzFdID0gcGFyX21hcHBlZFsyKmJdID0gcGFyW2JdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbWFwX2lkeF8zNF90b18yMChpbnQ4X3QgKnBhcl9tYXBwZWQsIGNvbnN0IGludDhfdCAqcGFyLCBpbnQgZnVsbCkKK3sKKyAgICBwYXJfbWFwcGVkWyAwXSA9ICgyKnBhclsgMF0gKyAgIHBhclsgMV0pIC8gMzsKKyAgICBwYXJfbWFwcGVkWyAxXSA9ICggIHBhclsgMV0gKyAyKnBhclsgMl0pIC8gMzsKKyAgICBwYXJfbWFwcGVkWyAyXSA9ICgyKnBhclsgM10gKyAgIHBhclsgNF0pIC8gMzsKKyAgICBwYXJfbWFwcGVkWyAzXSA9ICggIHBhclsgNF0gKyAyKnBhclsgNV0pIC8gMzsKKyAgICBwYXJfbWFwcGVkWyA0XSA9ICggIHBhclsgNl0gKyAgIHBhclsgN10pIC8gMjsKKyAgICBwYXJfbWFwcGVkWyA1XSA9ICggIHBhclsgOF0gKyAgIHBhclsgOV0pIC8gMjsKKyAgICBwYXJfbWFwcGVkWyA2XSA9ICAgIHBhclsxMF07CisgICAgcGFyX21hcHBlZFsgN10gPSAgICBwYXJbMTFdOworICAgIHBhcl9tYXBwZWRbIDhdID0gKCAgcGFyWzEyXSArICAgcGFyWzEzXSkgLyAyOworICAgIHBhcl9tYXBwZWRbIDldID0gKCAgcGFyWzE0XSArICAgcGFyWzE1XSkgLyAyOworICAgIHBhcl9tYXBwZWRbMTBdID0gICAgcGFyWzE2XTsKKyAgICBpZiAoZnVsbCkgeworICAgICAgICBwYXJfbWFwcGVkWzExXSA9ICAgIHBhclsxN107CisgICAgICAgIHBhcl9tYXBwZWRbMTJdID0gICAgcGFyWzE4XTsKKyAgICAgICAgcGFyX21hcHBlZFsxM10gPSAgICBwYXJbMTldOworICAgICAgICBwYXJfbWFwcGVkWzE0XSA9ICggIHBhclsyMF0gKyAgIHBhclsyMV0pIC8gMjsKKyAgICAgICAgcGFyX21hcHBlZFsxNV0gPSAoICBwYXJbMjJdICsgICBwYXJbMjNdKSAvIDI7CisgICAgICAgIHBhcl9tYXBwZWRbMTZdID0gKCAgcGFyWzI0XSArICAgcGFyWzI1XSkgLyAyOworICAgICAgICBwYXJfbWFwcGVkWzE3XSA9ICggIHBhclsyNl0gKyAgIHBhclsyN10pIC8gMjsKKyAgICAgICAgcGFyX21hcHBlZFsxOF0gPSAoICBwYXJbMjhdICsgICBwYXJbMjldICsgICBwYXJbMzBdICsgICBwYXJbMzFdKSAvIDQ7CisgICAgICAgIHBhcl9tYXBwZWRbMTldID0gKCAgcGFyWzMyXSArICAgcGFyWzMzXSkgLyAyOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbWFwX3ZhbF8zNF90b18yMChmbG9hdCBwYXJbUFNfTUFYX05SX0lJRElDQ10pCit7CisgICAgcGFyWyAwXSA9ICgyKnBhclsgMF0gKyAgIHBhclsgMV0pICogMC4zMzMzMzMzM2Y7CisgICAgcGFyWyAxXSA9ICggIHBhclsgMV0gKyAyKnBhclsgMl0pICogMC4zMzMzMzMzM2Y7CisgICAgcGFyWyAyXSA9ICgyKnBhclsgM10gKyAgIHBhclsgNF0pICogMC4zMzMzMzMzM2Y7CisgICAgcGFyWyAzXSA9ICggIHBhclsgNF0gKyAyKnBhclsgNV0pICogMC4zMzMzMzMzM2Y7CisgICAgcGFyWyA0XSA9ICggIHBhclsgNl0gKyAgIHBhclsgN10pICogMC41ZjsKKyAgICBwYXJbIDVdID0gKCAgcGFyWyA4XSArICAgcGFyWyA5XSkgKiAwLjVmOworICAgIHBhclsgNl0gPSAgICBwYXJbMTBdOworICAgIHBhclsgN10gPSAgICBwYXJbMTFdOworICAgIHBhclsgOF0gPSAoICBwYXJbMTJdICsgICBwYXJbMTNdKSAqIDAuNWY7CisgICAgcGFyWyA5XSA9ICggIHBhclsxNF0gKyAgIHBhclsxNV0pICogMC41ZjsKKyAgICBwYXJbMTBdID0gICAgcGFyWzE2XTsKKyAgICBwYXJbMTFdID0gICAgcGFyWzE3XTsKKyAgICBwYXJbMTJdID0gICAgcGFyWzE4XTsKKyAgICBwYXJbMTNdID0gICAgcGFyWzE5XTsKKyAgICBwYXJbMTRdID0gKCAgcGFyWzIwXSArICAgcGFyWzIxXSkgKiAwLjVmOworICAgIHBhclsxNV0gPSAoICBwYXJbMjJdICsgICBwYXJbMjNdKSAqIDAuNWY7CisgICAgcGFyWzE2XSA9ICggIHBhclsyNF0gKyAgIHBhclsyNV0pICogMC41ZjsKKyAgICBwYXJbMTddID0gKCAgcGFyWzI2XSArICAgcGFyWzI3XSkgKiAwLjVmOworICAgIHBhclsxOF0gPSAoICBwYXJbMjhdICsgICBwYXJbMjldICsgICBwYXJbMzBdICsgICBwYXJbMzFdKSAqIDAuMjVmOworICAgIHBhclsxOV0gPSAoICBwYXJbMzJdICsgICBwYXJbMzNdKSAqIDAuNWY7Cit9CisKK3N0YXRpYyB2b2lkIG1hcF9pZHhfMTBfdG9fMzQoaW50OF90ICpwYXJfbWFwcGVkLCBjb25zdCBpbnQ4X3QgKnBhciwgaW50IGZ1bGwpCit7CisgICAgaWYgKGZ1bGwpIHsKKyAgICAgICAgcGFyX21hcHBlZFszM10gPSBwYXJbOV07CisgICAgICAgIHBhcl9tYXBwZWRbMzJdID0gcGFyWzldOworICAgICAgICBwYXJfbWFwcGVkWzMxXSA9IHBhcls5XTsKKyAgICAgICAgcGFyX21hcHBlZFszMF0gPSBwYXJbOV07CisgICAgICAgIHBhcl9tYXBwZWRbMjldID0gcGFyWzldOworICAgICAgICBwYXJfbWFwcGVkWzI4XSA9IHBhcls5XTsKKyAgICAgICAgcGFyX21hcHBlZFsyN10gPSBwYXJbOF07CisgICAgICAgIHBhcl9tYXBwZWRbMjZdID0gcGFyWzhdOworICAgICAgICBwYXJfbWFwcGVkWzI1XSA9IHBhcls4XTsKKyAgICAgICAgcGFyX21hcHBlZFsyNF0gPSBwYXJbOF07CisgICAgICAgIHBhcl9tYXBwZWRbMjNdID0gcGFyWzddOworICAgICAgICBwYXJfbWFwcGVkWzIyXSA9IHBhcls3XTsKKyAgICAgICAgcGFyX21hcHBlZFsyMV0gPSBwYXJbN107CisgICAgICAgIHBhcl9tYXBwZWRbMjBdID0gcGFyWzddOworICAgICAgICBwYXJfbWFwcGVkWzE5XSA9IHBhcls2XTsKKyAgICAgICAgcGFyX21hcHBlZFsxOF0gPSBwYXJbNl07CisgICAgICAgIHBhcl9tYXBwZWRbMTddID0gcGFyWzVdOworICAgICAgICBwYXJfbWFwcGVkWzE2XSA9IHBhcls1XTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJfbWFwcGVkWzE2XSA9ICAgICAgMDsKKyAgICB9CisgICAgcGFyX21hcHBlZFsxNV0gPSBwYXJbNF07CisgICAgcGFyX21hcHBlZFsxNF0gPSBwYXJbNF07CisgICAgcGFyX21hcHBlZFsxM10gPSBwYXJbNF07CisgICAgcGFyX21hcHBlZFsxMl0gPSBwYXJbNF07CisgICAgcGFyX21hcHBlZFsxMV0gPSBwYXJbM107CisgICAgcGFyX21hcHBlZFsxMF0gPSBwYXJbM107CisgICAgcGFyX21hcHBlZFsgOV0gPSBwYXJbMl07CisgICAgcGFyX21hcHBlZFsgOF0gPSBwYXJbMl07CisgICAgcGFyX21hcHBlZFsgN10gPSBwYXJbMl07CisgICAgcGFyX21hcHBlZFsgNl0gPSBwYXJbMl07CisgICAgcGFyX21hcHBlZFsgNV0gPSBwYXJbMV07CisgICAgcGFyX21hcHBlZFsgNF0gPSBwYXJbMV07CisgICAgcGFyX21hcHBlZFsgM10gPSBwYXJbMV07CisgICAgcGFyX21hcHBlZFsgMl0gPSBwYXJbMF07CisgICAgcGFyX21hcHBlZFsgMV0gPSBwYXJbMF07CisgICAgcGFyX21hcHBlZFsgMF0gPSBwYXJbMF07Cit9CisKK3N0YXRpYyB2b2lkIG1hcF9pZHhfMjBfdG9fMzQoaW50OF90ICpwYXJfbWFwcGVkLCBjb25zdCBpbnQ4X3QgKnBhciwgaW50IGZ1bGwpCit7CisgICAgaWYgKGZ1bGwpIHsKKyAgICAgICAgcGFyX21hcHBlZFszM10gPSAgcGFyWzE5XTsKKyAgICAgICAgcGFyX21hcHBlZFszMl0gPSAgcGFyWzE5XTsKKyAgICAgICAgcGFyX21hcHBlZFszMV0gPSAgcGFyWzE4XTsKKyAgICAgICAgcGFyX21hcHBlZFszMF0gPSAgcGFyWzE4XTsKKyAgICAgICAgcGFyX21hcHBlZFsyOV0gPSAgcGFyWzE4XTsKKyAgICAgICAgcGFyX21hcHBlZFsyOF0gPSAgcGFyWzE4XTsKKyAgICAgICAgcGFyX21hcHBlZFsyN10gPSAgcGFyWzE3XTsKKyAgICAgICAgcGFyX21hcHBlZFsyNl0gPSAgcGFyWzE3XTsKKyAgICAgICAgcGFyX21hcHBlZFsyNV0gPSAgcGFyWzE2XTsKKyAgICAgICAgcGFyX21hcHBlZFsyNF0gPSAgcGFyWzE2XTsKKyAgICAgICAgcGFyX21hcHBlZFsyM10gPSAgcGFyWzE1XTsKKyAgICAgICAgcGFyX21hcHBlZFsyMl0gPSAgcGFyWzE1XTsKKyAgICAgICAgcGFyX21hcHBlZFsyMV0gPSAgcGFyWzE0XTsKKyAgICAgICAgcGFyX21hcHBlZFsyMF0gPSAgcGFyWzE0XTsKKyAgICAgICAgcGFyX21hcHBlZFsxOV0gPSAgcGFyWzEzXTsKKyAgICAgICAgcGFyX21hcHBlZFsxOF0gPSAgcGFyWzEyXTsKKyAgICAgICAgcGFyX21hcHBlZFsxN10gPSAgcGFyWzExXTsKKyAgICB9CisgICAgcGFyX21hcHBlZFsxNl0gPSAgcGFyWzEwXTsKKyAgICBwYXJfbWFwcGVkWzE1XSA9ICBwYXJbIDldOworICAgIHBhcl9tYXBwZWRbMTRdID0gIHBhclsgOV07CisgICAgcGFyX21hcHBlZFsxM10gPSAgcGFyWyA4XTsKKyAgICBwYXJfbWFwcGVkWzEyXSA9ICBwYXJbIDhdOworICAgIHBhcl9tYXBwZWRbMTFdID0gIHBhclsgN107CisgICAgcGFyX21hcHBlZFsxMF0gPSAgcGFyWyA2XTsKKyAgICBwYXJfbWFwcGVkWyA5XSA9ICBwYXJbIDVdOworICAgIHBhcl9tYXBwZWRbIDhdID0gIHBhclsgNV07CisgICAgcGFyX21hcHBlZFsgN10gPSAgcGFyWyA0XTsKKyAgICBwYXJfbWFwcGVkWyA2XSA9ICBwYXJbIDRdOworICAgIHBhcl9tYXBwZWRbIDVdID0gIHBhclsgM107CisgICAgcGFyX21hcHBlZFsgNF0gPSAocGFyWyAyXSArIHBhclsgM10pIC8gMjsKKyAgICBwYXJfbWFwcGVkWyAzXSA9ICBwYXJbIDJdOworICAgIHBhcl9tYXBwZWRbIDJdID0gIHBhclsgMV07CisgICAgcGFyX21hcHBlZFsgMV0gPSAocGFyWyAwXSArIHBhclsgMV0pIC8gMjsKKyAgICBwYXJfbWFwcGVkWyAwXSA9ICBwYXJbIDBdOworfQorCitzdGF0aWMgdm9pZCBtYXBfdmFsXzIwX3RvXzM0KGZsb2F0IHBhcltQU19NQVhfTlJfSUlESUNDXSkKK3sKKyAgICBwYXJbMzNdID0gIHBhclsxOV07CisgICAgcGFyWzMyXSA9ICBwYXJbMTldOworICAgIHBhclszMV0gPSAgcGFyWzE4XTsKKyAgICBwYXJbMzBdID0gIHBhclsxOF07CisgICAgcGFyWzI5XSA9ICBwYXJbMThdOworICAgIHBhclsyOF0gPSAgcGFyWzE4XTsKKyAgICBwYXJbMjddID0gIHBhclsxN107CisgICAgcGFyWzI2XSA9ICBwYXJbMTddOworICAgIHBhclsyNV0gPSAgcGFyWzE2XTsKKyAgICBwYXJbMjRdID0gIHBhclsxNl07CisgICAgcGFyWzIzXSA9ICBwYXJbMTVdOworICAgIHBhclsyMl0gPSAgcGFyWzE1XTsKKyAgICBwYXJbMjFdID0gIHBhclsxNF07CisgICAgcGFyWzIwXSA9ICBwYXJbMTRdOworICAgIHBhclsxOV0gPSAgcGFyWzEzXTsKKyAgICBwYXJbMThdID0gIHBhclsxMl07CisgICAgcGFyWzE3XSA9ICBwYXJbMTFdOworICAgIHBhclsxNl0gPSAgcGFyWzEwXTsKKyAgICBwYXJbMTVdID0gIHBhclsgOV07CisgICAgcGFyWzE0XSA9ICBwYXJbIDldOworICAgIHBhclsxM10gPSAgcGFyWyA4XTsKKyAgICBwYXJbMTJdID0gIHBhclsgOF07CisgICAgcGFyWzExXSA9ICBwYXJbIDddOworICAgIHBhclsxMF0gPSAgcGFyWyA2XTsKKyAgICBwYXJbIDldID0gIHBhclsgNV07CisgICAgcGFyWyA4XSA9ICBwYXJbIDVdOworICAgIHBhclsgN10gPSAgcGFyWyA0XTsKKyAgICBwYXJbIDZdID0gIHBhclsgNF07CisgICAgcGFyWyA1XSA9ICBwYXJbIDNdOworICAgIHBhclsgNF0gPSAocGFyWyAyXSArIHBhclsgM10pICogMC41ZjsKKyAgICBwYXJbIDNdID0gIHBhclsgMl07CisgICAgcGFyWyAyXSA9ICBwYXJbIDFdOworICAgIHBhclsgMV0gPSAocGFyWyAwXSArIHBhclsgMV0pICogMC41ZjsKK30KKworc3RhdGljIHZvaWQgZGVjb3JyZWxhdGlvbihQU0NvbnRleHQgKnBzLCBmbG9hdCAoKm91dClbMzJdWzJdLCBjb25zdCBmbG9hdCAoKnMpWzMyXVsyXSwgaW50IGlzMzQpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNihmbG9hdCwgcG93ZXIsIFszNF0sIFtQU19RTUZfVElNRV9TTE9UU10pOworICAgIExPQ0FMX0FMSUdORURfMTYoZmxvYXQsIHRyYW5zaWVudF9nYWluLCBbMzRdLCBbUFNfUU1GX1RJTUVfU0xPVFNdKTsKKyAgICBmbG9hdCAqcGVha19kZWNheV9ucmcgPSBwcy0+cGVha19kZWNheV9ucmc7CisgICAgZmxvYXQgKnBvd2VyX3Ntb290aCA9IHBzLT5wb3dlcl9zbW9vdGg7CisgICAgZmxvYXQgKnBlYWtfZGVjYXlfZGlmZl9zbW9vdGggPSBwcy0+cGVha19kZWNheV9kaWZmX3Ntb290aDsKKyAgICBmbG9hdCAoKmRlbGF5KVtQU19RTUZfVElNRV9TTE9UUyArIFBTX01BWF9ERUxBWV1bMl0gPSBwcy0+ZGVsYXk7CisgICAgZmxvYXQgKCphcF9kZWxheSlbUFNfQVBfTElOS1NdW1BTX1FNRl9USU1FX1NMT1RTICsgUFNfTUFYX0FQX0RFTEFZXVsyXSA9IHBzLT5hcF9kZWxheTsKKyAgICBjb25zdCBpbnQ4X3QgKmtfdG9faSA9IGlzMzQgPyBrX3RvX2lfMzQgOiBrX3RvX2lfMjA7CisgICAgY29uc3QgZmxvYXQgcGVha19kZWNheV9mYWN0b3IgPSAwLjc2NTkyODMzODM2NDY1ZjsKKyAgICBjb25zdCBmbG9hdCB0cmFuc2llbnRfaW1wYWN0ICA9IDEuNWY7CisgICAgY29uc3QgZmxvYXQgYV9zbW9vdGggICAgICAgICAgPSAwLjI1ZjsgLy8vPCBTbW9vdGhpbmcgY29lZmZpY2llbnQKKyAgICBpbnQgaSwgaywgbSwgbjsKKyAgICBpbnQgbjAgPSAwLCBuTCA9IDMyOworCisgICAgbWVtc2V0KHBvd2VyLCAwLCAzNCAqIHNpemVvZigqcG93ZXIpKTsKKworICAgIGlmIChpczM0ICE9IHBzLT5pczM0YmFuZHNfb2xkKSB7CisgICAgICAgIG1lbXNldChwcy0+cGVha19kZWNheV9ucmcsICAgICAgICAgMCwgc2l6ZW9mKHBzLT5wZWFrX2RlY2F5X25yZykpOworICAgICAgICBtZW1zZXQocHMtPnBvd2VyX3Ntb290aCwgICAgICAgICAgIDAsIHNpemVvZihwcy0+cG93ZXJfc21vb3RoKSk7CisgICAgICAgIG1lbXNldChwcy0+cGVha19kZWNheV9kaWZmX3Ntb290aCwgMCwgc2l6ZW9mKHBzLT5wZWFrX2RlY2F5X2RpZmZfc21vb3RoKSk7CisgICAgICAgIG1lbXNldChwcy0+ZGVsYXksICAgICAgICAgICAgICAgICAgMCwgc2l6ZW9mKHBzLT5kZWxheSkpOworICAgICAgICBtZW1zZXQocHMtPmFwX2RlbGF5LCAgICAgICAgICAgICAgIDAsIHNpemVvZihwcy0+YXBfZGVsYXkpKTsKKyAgICB9CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgTlJfQkFORFNbaXMzNF07IGsrKykgeworICAgICAgICBpbnQgaSA9IGtfdG9faVtrXTsKKyAgICAgICAgcHMtPmRzcC5hZGRfc3F1YXJlcyhwb3dlcltpXSwgc1trXSwgbkwgLSBuMCk7CisgICAgfQorCisgICAgLy9UcmFuc2llbnQgZGV0ZWN0aW9uCisgICAgZm9yIChpID0gMDsgaSA8IE5SX1BBUl9CQU5EU1tpczM0XTsgaSsrKSB7CisgICAgICAgIGZvciAobiA9IG4wOyBuIDwgbkw7IG4rKykgeworICAgICAgICAgICAgZmxvYXQgZGVjYXllZF9wZWFrID0gcGVha19kZWNheV9mYWN0b3IgKiBwZWFrX2RlY2F5X25yZ1tpXTsKKyAgICAgICAgICAgIGZsb2F0IGRlbm9tOworICAgICAgICAgICAgcGVha19kZWNheV9ucmdbaV0gPSBGRk1BWChkZWNheWVkX3BlYWssIHBvd2VyW2ldW25dKTsKKyAgICAgICAgICAgIHBvd2VyX3Ntb290aFtpXSArPSBhX3Ntb290aCAqIChwb3dlcltpXVtuXSAtIHBvd2VyX3Ntb290aFtpXSk7CisgICAgICAgICAgICBwZWFrX2RlY2F5X2RpZmZfc21vb3RoW2ldICs9IGFfc21vb3RoICogKHBlYWtfZGVjYXlfbnJnW2ldIC0gcG93ZXJbaV1bbl0gLSBwZWFrX2RlY2F5X2RpZmZfc21vb3RoW2ldKTsKKyAgICAgICAgICAgIGRlbm9tID0gdHJhbnNpZW50X2ltcGFjdCAqIHBlYWtfZGVjYXlfZGlmZl9zbW9vdGhbaV07CisgICAgICAgICAgICB0cmFuc2llbnRfZ2FpbltpXVtuXSAgID0gKGRlbm9tID4gcG93ZXJfc21vb3RoW2ldKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyX3Ntb290aFtpXSAvIGRlbm9tIDogMS4wZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vRGVjb3JyZWxhdGlvbiBhbmQgdHJhbnNpZW50IHJlZHVjdGlvbgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0FQX0xJTktTIC0gMQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgUV9mcmFjdF9hbGxwYXNzW2tdW21dKnpeLWxpbmtfZGVsYXlbbV0gLSBhW21dKmdfZGVjYXlfc2xvcGVba10KKyAgICAvL0hba11bel0gPSB6Xi0yICogcGhpX2ZyYWN0W2tdICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IDEgLSBhW21dKmdfZGVjYXlfc2xvcGVba10qUV9mcmFjdF9hbGxwYXNzW2tdW21dKnpeLWxpbmtfZGVsYXlbbV0KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gMAorICAgIC8vZFtrXVt6XSAob3V0KSA9IHRyYW5zaWVudF9nYWluX21hcHBlZFtrXVt6XSAqIEhba11bel0gKiBzW2tdW3pdCisgICAgZm9yIChrID0gMDsgayA8IE5SX0FMTFBBU1NfQkFORFNbaXMzNF07IGsrKykgeworICAgICAgICBpbnQgYiA9IGtfdG9faVtrXTsKKyAgICAgICAgZmxvYXQgZ19kZWNheV9zbG9wZSA9IDEuZiAtIERFQ0FZX1NMT1BFICogKGsgLSBERUNBWV9DVVRPRkZbaXMzNF0pOworICAgICAgICBnX2RlY2F5X3Nsb3BlID0gYXZfY2xpcGYoZ19kZWNheV9zbG9wZSwgMC5mLCAxLmYpOworICAgICAgICBtZW1jcHkoZGVsYXlba10sIGRlbGF5W2tdK25MLCBQU19NQVhfREVMQVkqc2l6ZW9mKGRlbGF5W2tdWzBdKSk7CisgICAgICAgIG1lbWNweShkZWxheVtrXStQU19NQVhfREVMQVksIHNba10sIG51bVFNRlNsb3RzKnNpemVvZihkZWxheVtrXVswXSkpOworICAgICAgICBmb3IgKG0gPSAwOyBtIDwgUFNfQVBfTElOS1M7IG0rKykgeworICAgICAgICAgICAgbWVtY3B5KGFwX2RlbGF5W2tdW21dLCAgIGFwX2RlbGF5W2tdW21dK251bVFNRlNsb3RzLCAgICAgICAgICAgNSpzaXplb2YoYXBfZGVsYXlba11bbV1bMF0pKTsKKyAgICAgICAgfQorICAgICAgICBwcy0+ZHNwLmRlY29ycmVsYXRlKG91dFtrXSwgZGVsYXlba10gKyBQU19NQVhfREVMQVkgLSAyLCBhcF9kZWxheVtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGlfZnJhY3RbaXMzNF1ba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICgqKVsyXSkgUV9mcmFjdF9hbGxwYXNzW2lzMzRdW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudF9nYWluW2JdLCBnX2RlY2F5X3Nsb3BlLCBuTCAtIG4wKTsKKyAgICB9CisgICAgZm9yICg7IGsgPCBTSE9SVF9ERUxBWV9CQU5EW2lzMzRdOyBrKyspIHsKKyAgICAgICAgaW50IGkgPSBrX3RvX2lba107CisgICAgICAgIG1lbWNweShkZWxheVtrXSwgZGVsYXlba10rbkwsIFBTX01BWF9ERUxBWSpzaXplb2YoZGVsYXlba11bMF0pKTsKKyAgICAgICAgbWVtY3B5KGRlbGF5W2tdK1BTX01BWF9ERUxBWSwgc1trXSwgbnVtUU1GU2xvdHMqc2l6ZW9mKGRlbGF5W2tdWzBdKSk7CisgICAgICAgIC8vSCA9IGRlbGF5IDE0CisgICAgICAgIHBzLT5kc3AubXVsX3BhaXJfc2luZ2xlKG91dFtrXSwgZGVsYXlba10gKyBQU19NQVhfREVMQVkgLSAxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50X2dhaW5baV0sIG5MIC0gbjApOworICAgIH0KKyAgICBmb3IgKDsgayA8IE5SX0JBTkRTW2lzMzRdOyBrKyspIHsKKyAgICAgICAgaW50IGkgPSBrX3RvX2lba107CisgICAgICAgIG1lbWNweShkZWxheVtrXSwgZGVsYXlba10rbkwsIFBTX01BWF9ERUxBWSpzaXplb2YoZGVsYXlba11bMF0pKTsKKyAgICAgICAgbWVtY3B5KGRlbGF5W2tdK1BTX01BWF9ERUxBWSwgc1trXSwgbnVtUU1GU2xvdHMqc2l6ZW9mKGRlbGF5W2tdWzBdKSk7CisgICAgICAgIC8vSCA9IGRlbGF5IDEKKyAgICAgICAgcHMtPmRzcC5tdWxfcGFpcl9zaW5nbGUob3V0W2tdLCBkZWxheVtrXSArIFBTX01BWF9ERUxBWSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudF9nYWluW2ldLCBuTCAtIG4wKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlbWFwMzQoaW50OF90ICgqKnBfcGFyX21hcHBlZClbUFNfTUFYX05SX0lJRElDQ10sCisgICAgICAgICAgICAgICAgICAgIGludDhfdCAgICAgICAgICAgKCpwYXIpW1BTX01BWF9OUl9JSURJQ0NdLAorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BhciwgaW50IG51bV9lbnYsIGludCBmdWxsKQoreworICAgIGludDhfdCAoKnBhcl9tYXBwZWQpW1BTX01BWF9OUl9JSURJQ0NdID0gKnBfcGFyX21hcHBlZDsKKyAgICBpbnQgZTsKKyAgICBpZiAobnVtX3BhciA9PSAyMCB8fCBudW1fcGFyID09IDExKSB7CisgICAgICAgIGZvciAoZSA9IDA7IGUgPCBudW1fZW52OyBlKyspIHsKKyAgICAgICAgICAgIG1hcF9pZHhfMjBfdG9fMzQocGFyX21hcHBlZFtlXSwgcGFyW2VdLCBmdWxsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobnVtX3BhciA9PSAxMCB8fCBudW1fcGFyID09IDUpIHsKKyAgICAgICAgZm9yIChlID0gMDsgZSA8IG51bV9lbnY7IGUrKykgeworICAgICAgICAgICAgbWFwX2lkeF8xMF90b18zNChwYXJfbWFwcGVkW2VdLCBwYXJbZV0sIGZ1bGwpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBfcGFyX21hcHBlZCA9IHBhcjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlbWFwMjAoaW50OF90ICgqKnBfcGFyX21hcHBlZClbUFNfTUFYX05SX0lJRElDQ10sCisgICAgICAgICAgICAgICAgICAgIGludDhfdCAgICAgICAgICAgKCpwYXIpW1BTX01BWF9OUl9JSURJQ0NdLAorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BhciwgaW50IG51bV9lbnYsIGludCBmdWxsKQoreworICAgIGludDhfdCAoKnBhcl9tYXBwZWQpW1BTX01BWF9OUl9JSURJQ0NdID0gKnBfcGFyX21hcHBlZDsKKyAgICBpbnQgZTsKKyAgICBpZiAobnVtX3BhciA9PSAzNCB8fCBudW1fcGFyID09IDE3KSB7CisgICAgICAgIGZvciAoZSA9IDA7IGUgPCBudW1fZW52OyBlKyspIHsKKyAgICAgICAgICAgIG1hcF9pZHhfMzRfdG9fMjAocGFyX21hcHBlZFtlXSwgcGFyW2VdLCBmdWxsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobnVtX3BhciA9PSAxMCB8fCBudW1fcGFyID09IDUpIHsKKyAgICAgICAgZm9yIChlID0gMDsgZSA8IG51bV9lbnY7IGUrKykgeworICAgICAgICAgICAgbWFwX2lkeF8xMF90b18yMChwYXJfbWFwcGVkW2VdLCBwYXJbZV0sIGZ1bGwpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBfcGFyX21hcHBlZCA9IHBhcjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHN0ZXJlb19wcm9jZXNzaW5nKFBTQ29udGV4dCAqcHMsIGZsb2F0ICgqbClbMzJdWzJdLCBmbG9hdCAoKnIpWzMyXVsyXSwgaW50IGlzMzQpCit7CisgICAgaW50IGUsIGIsIGs7CisKKyAgICBmbG9hdCAoKkgxMSlbUFNfTUFYX05VTV9FTlYrMV1bUFNfTUFYX05SX0lJRElDQ10gPSBwcy0+SDExOworICAgIGZsb2F0ICgqSDEyKVtQU19NQVhfTlVNX0VOVisxXVtQU19NQVhfTlJfSUlESUNDXSA9IHBzLT5IMTI7CisgICAgZmxvYXQgKCpIMjEpW1BTX01BWF9OVU1fRU5WKzFdW1BTX01BWF9OUl9JSURJQ0NdID0gcHMtPkgyMTsKKyAgICBmbG9hdCAoKkgyMilbUFNfTUFYX05VTV9FTlYrMV1bUFNfTUFYX05SX0lJRElDQ10gPSBwcy0+SDIyOworICAgIGludDhfdCAqb3BkX2hpc3QgPSBwcy0+b3BkX2hpc3Q7CisgICAgaW50OF90ICppcGRfaGlzdCA9IHBzLT5pcGRfaGlzdDsKKyAgICBpbnQ4X3QgaWlkX21hcHBlZF9idWZbUFNfTUFYX05VTV9FTlZdW1BTX01BWF9OUl9JSURJQ0NdOworICAgIGludDhfdCBpY2NfbWFwcGVkX2J1ZltQU19NQVhfTlVNX0VOVl1bUFNfTUFYX05SX0lJRElDQ107CisgICAgaW50OF90IGlwZF9tYXBwZWRfYnVmW1BTX01BWF9OVU1fRU5WXVtQU19NQVhfTlJfSUlESUNDXTsKKyAgICBpbnQ4X3Qgb3BkX21hcHBlZF9idWZbUFNfTUFYX05VTV9FTlZdW1BTX01BWF9OUl9JSURJQ0NdOworICAgIGludDhfdCAoKmlpZF9tYXBwZWQpW1BTX01BWF9OUl9JSURJQ0NdID0gaWlkX21hcHBlZF9idWY7CisgICAgaW50OF90ICgqaWNjX21hcHBlZClbUFNfTUFYX05SX0lJRElDQ10gPSBpY2NfbWFwcGVkX2J1ZjsKKyAgICBpbnQ4X3QgKCppcGRfbWFwcGVkKVtQU19NQVhfTlJfSUlESUNDXSA9IGlwZF9tYXBwZWRfYnVmOworICAgIGludDhfdCAoKm9wZF9tYXBwZWQpW1BTX01BWF9OUl9JSURJQ0NdID0gb3BkX21hcHBlZF9idWY7CisgICAgY29uc3QgaW50OF90ICprX3RvX2kgPSBpczM0ID8ga190b19pXzM0IDoga190b19pXzIwOworICAgIFRBQkxFX0NPTlNUIGZsb2F0ICgqSF9MVVQpWzhdWzRdID0gKFBTX0JBU0VMSU5FIHx8IHBzLT5pY2NfbW9kZSA8IDMpID8gSEEgOiBIQjsKKworICAgIC8vUmVtYXBwaW5nCisgICAgaWYgKHBzLT5udW1fZW52X29sZCkgeworICAgICAgICBtZW1jcHkoSDExWzBdWzBdLCBIMTFbMF1bcHMtPm51bV9lbnZfb2xkXSwgUFNfTUFYX05SX0lJRElDQypzaXplb2YoSDExWzBdWzBdWzBdKSk7CisgICAgICAgIG1lbWNweShIMTFbMV1bMF0sIEgxMVsxXVtwcy0+bnVtX2Vudl9vbGRdLCBQU19NQVhfTlJfSUlESUNDKnNpemVvZihIMTFbMV1bMF1bMF0pKTsKKyAgICAgICAgbWVtY3B5KEgxMlswXVswXSwgSDEyWzBdW3BzLT5udW1fZW52X29sZF0sIFBTX01BWF9OUl9JSURJQ0Mqc2l6ZW9mKEgxMlswXVswXVswXSkpOworICAgICAgICBtZW1jcHkoSDEyWzFdWzBdLCBIMTJbMV1bcHMtPm51bV9lbnZfb2xkXSwgUFNfTUFYX05SX0lJRElDQypzaXplb2YoSDEyWzFdWzBdWzBdKSk7CisgICAgICAgIG1lbWNweShIMjFbMF1bMF0sIEgyMVswXVtwcy0+bnVtX2Vudl9vbGRdLCBQU19NQVhfTlJfSUlESUNDKnNpemVvZihIMjFbMF1bMF1bMF0pKTsKKyAgICAgICAgbWVtY3B5KEgyMVsxXVswXSwgSDIxWzFdW3BzLT5udW1fZW52X29sZF0sIFBTX01BWF9OUl9JSURJQ0Mqc2l6ZW9mKEgyMVsxXVswXVswXSkpOworICAgICAgICBtZW1jcHkoSDIyWzBdWzBdLCBIMjJbMF1bcHMtPm51bV9lbnZfb2xkXSwgUFNfTUFYX05SX0lJRElDQypzaXplb2YoSDIyWzBdWzBdWzBdKSk7CisgICAgICAgIG1lbWNweShIMjJbMV1bMF0sIEgyMlsxXVtwcy0+bnVtX2Vudl9vbGRdLCBQU19NQVhfTlJfSUlESUNDKnNpemVvZihIMjJbMV1bMF1bMF0pKTsKKyAgICB9CisKKyAgICBpZiAoaXMzNCkgeworICAgICAgICByZW1hcDM0KCZpaWRfbWFwcGVkLCBwcy0+aWlkX3BhciwgcHMtPm5yX2lpZF9wYXIsIHBzLT5udW1fZW52LCAxKTsKKyAgICAgICAgcmVtYXAzNCgmaWNjX21hcHBlZCwgcHMtPmljY19wYXIsIHBzLT5ucl9pY2NfcGFyLCBwcy0+bnVtX2VudiwgMSk7CisgICAgICAgIGlmIChwcy0+ZW5hYmxlX2lwZG9wZCkgeworICAgICAgICAgICAgcmVtYXAzNCgmaXBkX21hcHBlZCwgcHMtPmlwZF9wYXIsIHBzLT5ucl9pcGRvcGRfcGFyLCBwcy0+bnVtX2VudiwgMCk7CisgICAgICAgICAgICByZW1hcDM0KCZvcGRfbWFwcGVkLCBwcy0+b3BkX3BhciwgcHMtPm5yX2lwZG9wZF9wYXIsIHBzLT5udW1fZW52LCAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXBzLT5pczM0YmFuZHNfb2xkKSB7CisgICAgICAgICAgICBtYXBfdmFsXzIwX3RvXzM0KEgxMVswXVswXSk7CisgICAgICAgICAgICBtYXBfdmFsXzIwX3RvXzM0KEgxMVsxXVswXSk7CisgICAgICAgICAgICBtYXBfdmFsXzIwX3RvXzM0KEgxMlswXVswXSk7CisgICAgICAgICAgICBtYXBfdmFsXzIwX3RvXzM0KEgxMlsxXVswXSk7CisgICAgICAgICAgICBtYXBfdmFsXzIwX3RvXzM0KEgyMVswXVswXSk7CisgICAgICAgICAgICBtYXBfdmFsXzIwX3RvXzM0KEgyMVsxXVswXSk7CisgICAgICAgICAgICBtYXBfdmFsXzIwX3RvXzM0KEgyMlswXVswXSk7CisgICAgICAgICAgICBtYXBfdmFsXzIwX3RvXzM0KEgyMlsxXVswXSk7CisgICAgICAgICAgICBpcGRvcGRfcmVzZXQoaXBkX2hpc3QsIG9wZF9oaXN0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlbWFwMjAoJmlpZF9tYXBwZWQsIHBzLT5paWRfcGFyLCBwcy0+bnJfaWlkX3BhciwgcHMtPm51bV9lbnYsIDEpOworICAgICAgICByZW1hcDIwKCZpY2NfbWFwcGVkLCBwcy0+aWNjX3BhciwgcHMtPm5yX2ljY19wYXIsIHBzLT5udW1fZW52LCAxKTsKKyAgICAgICAgaWYgKHBzLT5lbmFibGVfaXBkb3BkKSB7CisgICAgICAgICAgICByZW1hcDIwKCZpcGRfbWFwcGVkLCBwcy0+aXBkX3BhciwgcHMtPm5yX2lwZG9wZF9wYXIsIHBzLT5udW1fZW52LCAwKTsKKyAgICAgICAgICAgIHJlbWFwMjAoJm9wZF9tYXBwZWQsIHBzLT5vcGRfcGFyLCBwcy0+bnJfaXBkb3BkX3BhciwgcHMtPm51bV9lbnYsIDApOworICAgICAgICB9CisgICAgICAgIGlmIChwcy0+aXMzNGJhbmRzX29sZCkgeworICAgICAgICAgICAgbWFwX3ZhbF8zNF90b18yMChIMTFbMF1bMF0pOworICAgICAgICAgICAgbWFwX3ZhbF8zNF90b18yMChIMTFbMV1bMF0pOworICAgICAgICAgICAgbWFwX3ZhbF8zNF90b18yMChIMTJbMF1bMF0pOworICAgICAgICAgICAgbWFwX3ZhbF8zNF90b18yMChIMTJbMV1bMF0pOworICAgICAgICAgICAgbWFwX3ZhbF8zNF90b18yMChIMjFbMF1bMF0pOworICAgICAgICAgICAgbWFwX3ZhbF8zNF90b18yMChIMjFbMV1bMF0pOworICAgICAgICAgICAgbWFwX3ZhbF8zNF90b18yMChIMjJbMF1bMF0pOworICAgICAgICAgICAgbWFwX3ZhbF8zNF90b18yMChIMjJbMV1bMF0pOworICAgICAgICAgICAgaXBkb3BkX3Jlc2V0KGlwZF9oaXN0LCBvcGRfaGlzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL01peGluZworICAgIGZvciAoZSA9IDA7IGUgPCBwcy0+bnVtX2VudjsgZSsrKSB7CisgICAgICAgIGZvciAoYiA9IDA7IGIgPCBOUl9QQVJfQkFORFNbaXMzNF07IGIrKykgeworICAgICAgICAgICAgZmxvYXQgaDExLCBoMTIsIGgyMSwgaDIyOworICAgICAgICAgICAgaDExID0gSF9MVVRbaWlkX21hcHBlZFtlXVtiXSArIDcgKyAyMyAqIHBzLT5paWRfcXVhbnRdW2ljY19tYXBwZWRbZV1bYl1dWzBdOworICAgICAgICAgICAgaDEyID0gSF9MVVRbaWlkX21hcHBlZFtlXVtiXSArIDcgKyAyMyAqIHBzLT5paWRfcXVhbnRdW2ljY19tYXBwZWRbZV1bYl1dWzFdOworICAgICAgICAgICAgaDIxID0gSF9MVVRbaWlkX21hcHBlZFtlXVtiXSArIDcgKyAyMyAqIHBzLT5paWRfcXVhbnRdW2ljY19tYXBwZWRbZV1bYl1dWzJdOworICAgICAgICAgICAgaDIyID0gSF9MVVRbaWlkX21hcHBlZFtlXVtiXSArIDcgKyAyMyAqIHBzLT5paWRfcXVhbnRdW2ljY19tYXBwZWRbZV1bYl1dWzNdOworCisgICAgICAgICAgICBpZiAoIVBTX0JBU0VMSU5FICYmIHBzLT5lbmFibGVfaXBkb3BkICYmIGIgPCBOUl9JUERPUERfQkFORFNbaXMzNF0pIHsKKyAgICAgICAgICAgICAgICAvL1RoZSBzcGVjIHNheSBzYXlzIHRvIG9ubHkgcnVuIHRoaXMgc21vb3RoZXIgd2hlbiBlbmFibGVfaXBkb3BkCisgICAgICAgICAgICAgICAgLy9pcyBzZXQgYnV0IHRoZSByZWZlcmVuY2UgZGVjb2RlciBhcHBlYXJzIHRvIHJ1biBpdCBjb25zdGFudGx5CisgICAgICAgICAgICAgICAgZmxvYXQgaDExaSwgaDEyaSwgaDIxaSwgaDIyaTsKKyAgICAgICAgICAgICAgICBmbG9hdCBpcGRfYWRqX3JlLCBpcGRfYWRqX2ltOworICAgICAgICAgICAgICAgIGludCBvcGRfaWR4ID0gb3BkX2hpc3RbYl0gKiA4ICsgb3BkX21hcHBlZFtlXVtiXTsKKyAgICAgICAgICAgICAgICBpbnQgaXBkX2lkeCA9IGlwZF9oaXN0W2JdICogOCArIGlwZF9tYXBwZWRbZV1bYl07CisgICAgICAgICAgICAgICAgZmxvYXQgb3BkX3JlID0gcGRfcmVfc21vb3RoW29wZF9pZHhdOworICAgICAgICAgICAgICAgIGZsb2F0IG9wZF9pbSA9IHBkX2ltX3Ntb290aFtvcGRfaWR4XTsKKyAgICAgICAgICAgICAgICBmbG9hdCBpcGRfcmUgPSBwZF9yZV9zbW9vdGhbaXBkX2lkeF07CisgICAgICAgICAgICAgICAgZmxvYXQgaXBkX2ltID0gcGRfaW1fc21vb3RoW2lwZF9pZHhdOworICAgICAgICAgICAgICAgIG9wZF9oaXN0W2JdID0gb3BkX2lkeCAmIDB4M0Y7CisgICAgICAgICAgICAgICAgaXBkX2hpc3RbYl0gPSBpcGRfaWR4ICYgMHgzRjsKKworICAgICAgICAgICAgICAgIGlwZF9hZGpfcmUgPSBvcGRfcmUqaXBkX3JlICsgb3BkX2ltKmlwZF9pbTsKKyAgICAgICAgICAgICAgICBpcGRfYWRqX2ltID0gb3BkX2ltKmlwZF9yZSAtIG9wZF9yZSppcGRfaW07CisgICAgICAgICAgICAgICAgaDExaSA9IGgxMSAqIG9wZF9pbTsKKyAgICAgICAgICAgICAgICBoMTEgID0gaDExICogb3BkX3JlOworICAgICAgICAgICAgICAgIGgxMmkgPSBoMTIgKiBpcGRfYWRqX2ltOworICAgICAgICAgICAgICAgIGgxMiAgPSBoMTIgKiBpcGRfYWRqX3JlOworICAgICAgICAgICAgICAgIGgyMWkgPSBoMjEgKiBvcGRfaW07CisgICAgICAgICAgICAgICAgaDIxICA9IGgyMSAqIG9wZF9yZTsKKyAgICAgICAgICAgICAgICBoMjJpID0gaDIyICogaXBkX2Fkal9pbTsKKyAgICAgICAgICAgICAgICBoMjIgID0gaDIyICogaXBkX2Fkal9yZTsKKyAgICAgICAgICAgICAgICBIMTFbMV1bZSsxXVtiXSA9IGgxMWk7CisgICAgICAgICAgICAgICAgSDEyWzFdW2UrMV1bYl0gPSBoMTJpOworICAgICAgICAgICAgICAgIEgyMVsxXVtlKzFdW2JdID0gaDIxaTsKKyAgICAgICAgICAgICAgICBIMjJbMV1bZSsxXVtiXSA9IGgyMmk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIMTFbMF1bZSsxXVtiXSA9IGgxMTsKKyAgICAgICAgICAgIEgxMlswXVtlKzFdW2JdID0gaDEyOworICAgICAgICAgICAgSDIxWzBdW2UrMV1bYl0gPSBoMjE7CisgICAgICAgICAgICBIMjJbMF1bZSsxXVtiXSA9IGgyMjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTlJfQkFORFNbaXMzNF07IGsrKykgeworICAgICAgICAgICAgZmxvYXQgaFsyXVs0XTsKKyAgICAgICAgICAgIGZsb2F0IGhfc3RlcFsyXVs0XTsKKyAgICAgICAgICAgIGludCBzdGFydCA9IHBzLT5ib3JkZXJfcG9zaXRpb25bZV07CisgICAgICAgICAgICBpbnQgc3RvcCAgPSBwcy0+Ym9yZGVyX3Bvc2l0aW9uW2UrMV07CisgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IDEuZiAvIChzdG9wIC0gc3RhcnQpOworICAgICAgICAgICAgYiA9IGtfdG9faVtrXTsKKyAgICAgICAgICAgIGhbMF1bMF0gPSBIMTFbMF1bZV1bYl07CisgICAgICAgICAgICBoWzBdWzFdID0gSDEyWzBdW2VdW2JdOworICAgICAgICAgICAgaFswXVsyXSA9IEgyMVswXVtlXVtiXTsKKyAgICAgICAgICAgIGhbMF1bM10gPSBIMjJbMF1bZV1bYl07CisgICAgICAgICAgICBpZiAoIVBTX0JBU0VMSU5FICYmIHBzLT5lbmFibGVfaXBkb3BkKSB7CisgICAgICAgICAgICAvL0lzIHRoaXMgbmVjZXNzYXJ5PyBwc18wNF9uZXcgc2VlbXMgdW5jaGFuZ2VkCisgICAgICAgICAgICBpZiAoKGlzMzQgJiYgayA8PSAxMyAmJiBrID49IDkpIHx8ICghaXMzNCAmJiBrIDw9IDEpKSB7CisgICAgICAgICAgICAgICAgaFsxXVswXSA9IC1IMTFbMV1bZV1bYl07CisgICAgICAgICAgICAgICAgaFsxXVsxXSA9IC1IMTJbMV1bZV1bYl07CisgICAgICAgICAgICAgICAgaFsxXVsyXSA9IC1IMjFbMV1bZV1bYl07CisgICAgICAgICAgICAgICAgaFsxXVszXSA9IC1IMjJbMV1bZV1bYl07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhbMV1bMF0gPSBIMTFbMV1bZV1bYl07CisgICAgICAgICAgICAgICAgaFsxXVsxXSA9IEgxMlsxXVtlXVtiXTsKKyAgICAgICAgICAgICAgICBoWzFdWzJdID0gSDIxWzFdW2VdW2JdOworICAgICAgICAgICAgICAgIGhbMV1bM10gPSBIMjJbMV1bZV1bYl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0ludGVycG9sYXRpb24KKyAgICAgICAgICAgIGhfc3RlcFswXVswXSA9IChIMTFbMF1bZSsxXVtiXSAtIGhbMF1bMF0pICogd2lkdGg7CisgICAgICAgICAgICBoX3N0ZXBbMF1bMV0gPSAoSDEyWzBdW2UrMV1bYl0gLSBoWzBdWzFdKSAqIHdpZHRoOworICAgICAgICAgICAgaF9zdGVwWzBdWzJdID0gKEgyMVswXVtlKzFdW2JdIC0gaFswXVsyXSkgKiB3aWR0aDsKKyAgICAgICAgICAgIGhfc3RlcFswXVszXSA9IChIMjJbMF1bZSsxXVtiXSAtIGhbMF1bM10pICogd2lkdGg7CisgICAgICAgICAgICBpZiAoIVBTX0JBU0VMSU5FICYmIHBzLT5lbmFibGVfaXBkb3BkKSB7CisgICAgICAgICAgICAgICAgaF9zdGVwWzFdWzBdID0gKEgxMVsxXVtlKzFdW2JdIC0gaFsxXVswXSkgKiB3aWR0aDsKKyAgICAgICAgICAgICAgICBoX3N0ZXBbMV1bMV0gPSAoSDEyWzFdW2UrMV1bYl0gLSBoWzFdWzFdKSAqIHdpZHRoOworICAgICAgICAgICAgICAgIGhfc3RlcFsxXVsyXSA9IChIMjFbMV1bZSsxXVtiXSAtIGhbMV1bMl0pICogd2lkdGg7CisgICAgICAgICAgICAgICAgaF9zdGVwWzFdWzNdID0gKEgyMlsxXVtlKzFdW2JdIC0gaFsxXVszXSkgKiB3aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBzLT5kc3Auc3RlcmVvX2ludGVycG9sYXRlWyFQU19CQVNFTElORSAmJiBwcy0+ZW5hYmxlX2lwZG9wZF0oCisgICAgICAgICAgICAgICAgbFtrXSArIHN0YXJ0ICsgMSwgcltrXSArIHN0YXJ0ICsgMSwKKyAgICAgICAgICAgICAgICBoLCBoX3N0ZXAsIHN0b3AgLSBzdGFydCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBmZl9wc19hcHBseShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFBTQ29udGV4dCAqcHMsIGZsb2F0IExbMl1bMzhdWzY0XSwgZmxvYXQgUlsyXVszOF1bNjRdLCBpbnQgdG9wKQoreworICAgIExPQ0FMX0FMSUdORURfMTYoZmxvYXQsIExidWYsIFs5MV0sIFszMl1bMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoZmxvYXQsIFJidWYsIFs5MV0sIFszMl1bMl0pOworICAgIGNvbnN0IGludCBsZW4gPSAzMjsKKyAgICBpbnQgaXMzNCA9IHBzLT5pczM0YmFuZHM7CisKKyAgICB0b3AgKz0gTlJfQkFORFNbaXMzNF0gLSA2NDsKKyAgICBtZW1zZXQocHMtPmRlbGF5K3RvcCwgMCwgKE5SX0JBTkRTW2lzMzRdIC0gdG9wKSpzaXplb2YocHMtPmRlbGF5WzBdKSk7CisgICAgaWYgKHRvcCA8IE5SX0FMTFBBU1NfQkFORFNbaXMzNF0pCisgICAgICAgIG1lbXNldChwcy0+YXBfZGVsYXkgKyB0b3AsIDAsIChOUl9BTExQQVNTX0JBTkRTW2lzMzRdIC0gdG9wKSpzaXplb2YocHMtPmFwX2RlbGF5WzBdKSk7CisKKyAgICBoeWJyaWRfYW5hbHlzaXMoJnBzLT5kc3AsIExidWYsIHBzLT5pbl9idWYsIEwsIGlzMzQsIGxlbik7CisgICAgZGVjb3JyZWxhdGlvbihwcywgUmJ1ZiwgKGNvbnN0IGZsb2F0ICgqKVszMl1bMl0pIExidWYsIGlzMzQpOworICAgIHN0ZXJlb19wcm9jZXNzaW5nKHBzLCBMYnVmLCBSYnVmLCBpczM0KTsKKyAgICBoeWJyaWRfc3ludGhlc2lzKCZwcy0+ZHNwLCBMLCBMYnVmLCBpczM0LCBsZW4pOworICAgIGh5YnJpZF9zeW50aGVzaXMoJnBzLT5kc3AsIFIsIFJidWYsIGlzMzQsIGxlbik7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBQU19JTklUX1ZMQ19TVEFUSUMobnVtLCBzaXplKSBcCisgICAgSU5JVF9WTENfU1RBVElDKCZ2bGNfcHNbbnVtXSwgOSwgcHNfdG1wW251bV0udGFibGVfc2l6ZSAvIHBzX3RtcFtudW1dLmVsZW1fc2l6ZSwgICAgXAorICAgICAgICAgICAgICAgICAgICBwc190bXBbbnVtXS5wc19iaXRzLCAxLCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcHNfdG1wW251bV0ucHNfY29kZXMsIHBzX3RtcFtudW1dLmVsZW1fc2l6ZSwgcHNfdG1wW251bV0uZWxlbV9zaXplLCBcCisgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisjZGVmaW5lIFBTX1ZMQ19ST1cobmFtZSkgXAorICAgIHsgbmFtZSAjIyBfY29kZXMsIG5hbWUgIyMgX2JpdHMsIHNpemVvZihuYW1lICMjIF9jb2RlcyksIHNpemVvZihuYW1lICMjIF9jb2Rlc1swXSkgfQorCithdl9jb2xkIHZvaWQgZmZfcHNfaW5pdCh2b2lkKSB7CisgICAgLy8gU3ludGF4IGluaXRpYWxpemF0aW9uCisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IHZvaWQgKnBzX2NvZGVzLCAqcHNfYml0czsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHRhYmxlX3NpemUsIGVsZW1fc2l6ZTsKKyAgICB9IHBzX3RtcFtdID0geworICAgICAgICBQU19WTENfUk9XKGh1ZmZfaWlkX2RmMSksCisgICAgICAgIFBTX1ZMQ19ST1coaHVmZl9paWRfZHQxKSwKKyAgICAgICAgUFNfVkxDX1JPVyhodWZmX2lpZF9kZjApLAorICAgICAgICBQU19WTENfUk9XKGh1ZmZfaWlkX2R0MCksCisgICAgICAgIFBTX1ZMQ19ST1coaHVmZl9pY2NfZGYpLAorICAgICAgICBQU19WTENfUk9XKGh1ZmZfaWNjX2R0KSwKKyAgICAgICAgUFNfVkxDX1JPVyhodWZmX2lwZF9kZiksCisgICAgICAgIFBTX1ZMQ19ST1coaHVmZl9pcGRfZHQpLAorICAgICAgICBQU19WTENfUk9XKGh1ZmZfb3BkX2RmKSwKKyAgICAgICAgUFNfVkxDX1JPVyhodWZmX29wZF9kdCksCisgICAgfTsKKworICAgIFBTX0lOSVRfVkxDX1NUQVRJQygwLCAxNTQ0KTsKKyAgICBQU19JTklUX1ZMQ19TVEFUSUMoMSwgIDgzMik7CisgICAgUFNfSU5JVF9WTENfU1RBVElDKDIsIDEwMjQpOworICAgIFBTX0lOSVRfVkxDX1NUQVRJQygzLCAxMDM2KTsKKyAgICBQU19JTklUX1ZMQ19TVEFUSUMoNCwgIDU0NCk7CisgICAgUFNfSU5JVF9WTENfU1RBVElDKDUsICA1NDQpOworICAgIFBTX0lOSVRfVkxDX1NUQVRJQyg2LCAgNTEyKTsKKyAgICBQU19JTklUX1ZMQ19TVEFUSUMoNywgIDUxMik7CisgICAgUFNfSU5JVF9WTENfU1RBVElDKDgsICA1MTIpOworICAgIFBTX0lOSVRfVkxDX1NUQVRJQyg5LCAgNTEyKTsKKworICAgIHBzX3RhYmxlaW5pdCgpOworfQorCithdl9jb2xkIHZvaWQgZmZfcHNfY3R4X2luaXQoUFNDb250ZXh0ICpwcykKK3sKKyAgICBmZl9wc2RzcF9pbml0KCZwcy0+ZHNwKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MzIzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNwcy5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBNUEVHLTQgUGFyYW1ldHJpYyBTdGVyZW8gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDEwIEFsZXggQ29udmVyc2UgPGFsZXguY29udmVyc2VAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUFNfSAorI2RlZmluZSBBVkNPREVDX1BTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYWFjcHNkc3AuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworI2RlZmluZSBQU19NQVhfTlVNX0VOViA1CisjZGVmaW5lIFBTX01BWF9OUl9JSURJQ0MgMzQKKyNkZWZpbmUgUFNfTUFYX05SX0lQRE9QRCAxNworI2RlZmluZSBQU19NQVhfU1NCIDkxCisjZGVmaW5lIFBTX01BWF9BUF9CQU5EUyA1MAorI2RlZmluZSBQU19RTUZfVElNRV9TTE9UUyAzMgorI2RlZmluZSBQU19NQVhfREVMQVkgMTQKKyNkZWZpbmUgUFNfQVBfTElOS1MgMworI2RlZmluZSBQU19NQVhfQVBfREVMQVkgNQorCit0eXBlZGVmIHN0cnVjdCBQU0NvbnRleHQgeworICAgIGludCAgICBzdGFydDsKKyAgICBpbnQgICAgZW5hYmxlX2lpZDsKKyAgICBpbnQgICAgaWlkX3F1YW50OworICAgIGludCAgICBucl9paWRfcGFyOworICAgIGludCAgICBucl9pcGRvcGRfcGFyOworICAgIGludCAgICBlbmFibGVfaWNjOworICAgIGludCAgICBpY2NfbW9kZTsKKyAgICBpbnQgICAgbnJfaWNjX3BhcjsKKyAgICBpbnQgICAgZW5hYmxlX2V4dDsKKyAgICBpbnQgICAgZnJhbWVfY2xhc3M7CisgICAgaW50ICAgIG51bV9lbnZfb2xkOworICAgIGludCAgICBudW1fZW52OworICAgIGludCAgICBlbmFibGVfaXBkb3BkOworICAgIGludCAgICBib3JkZXJfcG9zaXRpb25bUFNfTUFYX05VTV9FTlYrMV07CisgICAgaW50OF90IGlpZF9wYXJbUFNfTUFYX05VTV9FTlZdW1BTX01BWF9OUl9JSURJQ0NdOyAvLy88IEludGVyLWNoYW5uZWwgSW50ZW5zaXR5IERpZmZlcmVuY2UgUGFyYW1ldGVycworICAgIGludDhfdCBpY2NfcGFyW1BTX01BWF9OVU1fRU5WXVtQU19NQVhfTlJfSUlESUNDXTsgLy8vPCBJbnRlci1DaGFubmVsIENvaGVyZW5jZSBQYXJhbWV0ZXJzCisgICAgLyogaXBkL29wZCBpcyBpaWQvaWNjIHNpemVkIHNvIHRoYXQgdGhlIHNhbWUgZnVuY3Rpb25zIGNhbiBoYW5kbGUgYm90aCAqLworICAgIGludDhfdCBpcGRfcGFyW1BTX01BWF9OVU1fRU5WXVtQU19NQVhfTlJfSUlESUNDXTsgLy8vPCBJbnRlci1jaGFubmVsIFBoYXNlIERpZmZlcmVuY2UgUGFyYW1ldGVycworICAgIGludDhfdCBvcGRfcGFyW1BTX01BWF9OVU1fRU5WXVtQU19NQVhfTlJfSUlESUNDXTsgLy8vPCBPdmVyYWxsIFBoYXNlIERpZmZlcmVuY2UgUGFyYW1ldGVycworICAgIGludCAgICBpczM0YmFuZHM7CisgICAgaW50ICAgIGlzMzRiYW5kc19vbGQ7CisKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBpbl9idWYpWzVdWzQ0XVsyXTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBkZWxheSlbUFNfTUFYX1NTQl1bUFNfUU1GX1RJTUVfU0xPVFMgKyBQU19NQVhfREVMQVldWzJdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIGFwX2RlbGF5KVtQU19NQVhfQVBfQkFORFNdW1BTX0FQX0xJTktTXVtQU19RTUZfVElNRV9TTE9UUyArIFBTX01BWF9BUF9ERUxBWV1bMl07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBmbG9hdCwgcGVha19kZWNheV9ucmcpWzM0XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBwb3dlcl9zbW9vdGgpWzM0XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBwZWFrX2RlY2F5X2RpZmZfc21vb3RoKVszNF07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBmbG9hdCwgSDExKVsyXVtQU19NQVhfTlVNX0VOVisxXVtQU19NQVhfTlJfSUlESUNDXTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBIMTIpWzJdW1BTX01BWF9OVU1fRU5WKzFdW1BTX01BWF9OUl9JSURJQ0NdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIEgyMSlbMl1bUFNfTUFYX05VTV9FTlYrMV1bUFNfTUFYX05SX0lJRElDQ107CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBmbG9hdCwgSDIyKVsyXVtQU19NQVhfTlVNX0VOVisxXVtQU19NQVhfTlJfSUlESUNDXTsKKyAgICBpbnQ4X3Qgb3BkX2hpc3RbUFNfTUFYX05SX0lJRElDQ107CisgICAgaW50OF90IGlwZF9oaXN0W1BTX01BWF9OUl9JSURJQ0NdOworICAgIFBTRFNQQ29udGV4dCBkc3A7Cit9IFBTQ29udGV4dDsKKwordm9pZCBmZl9wc19pbml0KHZvaWQpOwordm9pZCBmZl9wc19jdHhfaW5pdChQU0NvbnRleHQgKnBzKTsKK2ludCBmZl9wc19yZWFkX2RhdGEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYiwgUFNDb250ZXh0ICpwcywgaW50IGJpdHNfbGVmdCk7CitpbnQgZmZfcHNfYXBwbHkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBQU0NvbnRleHQgKnBzLCBmbG9hdCBMWzJdWzM4XVs2NF0sIGZsb2F0IFJbMl1bMzhdWzY0XSwgaW50IHRvcCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1BTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzX3RhYmxlZ2VuLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNwc190YWJsZWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjkzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNwc190YWJsZWdlbi5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBHZW5lcmF0ZSBhIGhlYWRlciBmaWxlIGZvciBoYXJkY29kZWQgUGFyYW1ldHJpYyBTdGVyZW8gdGFibGVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFsZXggQ29udmVyc2UgPGFsZXguY29udmVyc2VAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZGVmaW5lIENPTkZJR19IQVJEQ09ERURfVEFCTEVTIDAKKyNpbmNsdWRlICJhYWNwc190YWJsZWdlbi5oIgorI2luY2x1ZGUgInRhYmxlcHJpbnQuaCIKKwordm9pZCB3cml0ZV9mbG9hdF8zZF9hcnJheSAoY29uc3Qgdm9pZCAqcCwgaW50IGIsIGludCBjLCBpbnQgZCkKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCBmbG9hdCAqZiA9IHA7CisgICAgZm9yIChpID0gMDsgaSA8IGI7IGkrKykgeworICAgICAgICBwcmludGYoIntcbiIpOworICAgICAgICB3cml0ZV9mbG9hdF8yZF9hcnJheShmLCBjLCBkKTsKKyAgICAgICAgcHJpbnRmKCJ9LFxuIik7CisgICAgICAgIGYgKz0gYyAqIGQ7CisgICAgfQorfQorCit2b2lkIHdyaXRlX2Zsb2F0XzRkX2FycmF5IChjb25zdCB2b2lkICpwLCBpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCBmbG9hdCAqZiA9IHA7CisgICAgZm9yIChpID0gMDsgaSA8IGE7IGkrKykgeworICAgICAgICBwcmludGYoIntcbiIpOworICAgICAgICB3cml0ZV9mbG9hdF8zZF9hcnJheShmLCBiLCBjLCBkKTsKKyAgICAgICAgcHJpbnRmKCJ9LFxuIik7CisgICAgICAgIGYgKz0gYiAqIGMgKiBkOworICAgIH0KK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBwc190YWJsZWluaXQoKTsKKworICAgIHdyaXRlX2ZpbGVoZWFkZXIoKTsKKworICAgIHByaW50Zigic3RhdGljIGNvbnN0IGZsb2F0IHBkX3JlX3Ntb290aFs4KjgqOF0gPSB7XG4iKTsKKyAgICB3cml0ZV9mbG9hdF9hcnJheShwZF9yZV9zbW9vdGgsIDgqOCo4KTsKKyAgICBwcmludGYoIn07XG4iKTsKKyAgICBwcmludGYoInN0YXRpYyBjb25zdCBmbG9hdCBwZF9pbV9zbW9vdGhbOCo4KjhdID0ge1xuIik7CisgICAgd3JpdGVfZmxvYXRfYXJyYXkocGRfaW1fc21vb3RoLCA4KjgqOCk7CisgICAgcHJpbnRmKCJ9O1xuIik7CisKKyAgICBwcmludGYoInN0YXRpYyBjb25zdCBmbG9hdCBIQVs0Nl1bOF1bNF0gPSB7XG4iKTsKKyAgICB3cml0ZV9mbG9hdF8zZF9hcnJheShIQSwgNDYsIDgsIDQpOworICAgIHByaW50ZigifTtcbiIpOworICAgIHByaW50Zigic3RhdGljIGNvbnN0IGZsb2F0IEhCWzQ2XVs4XVs0XSA9IHtcbiIpOworICAgIHdyaXRlX2Zsb2F0XzNkX2FycmF5KEhCLCA0NiwgOCwgNCk7CisgICAgcHJpbnRmKCJ9O1xuIik7CisKKyAgICBwcmludGYoInN0YXRpYyBjb25zdCBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBmMjBfMF84KVs4XVs4XVsyXSA9IHtcbiIpOworICAgIHdyaXRlX2Zsb2F0XzNkX2FycmF5KGYyMF8wXzgsIDgsIDgsIDIpOworICAgIHByaW50ZigifTtcbiIpOworICAgIHByaW50Zigic3RhdGljIGNvbnN0IERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIGYzNF8wXzEyKVsxMl1bOF1bMl0gPSB7XG4iKTsKKyAgICB3cml0ZV9mbG9hdF8zZF9hcnJheShmMzRfMF8xMiwgMTIsIDgsIDIpOworICAgIHByaW50ZigifTtcbiIpOworICAgIHByaW50Zigic3RhdGljIGNvbnN0IERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIGYzNF8xXzgpWzhdWzhdWzJdID0ge1xuIik7CisgICAgd3JpdGVfZmxvYXRfM2RfYXJyYXkoZjM0XzFfOCwgOCwgOCwgMik7CisgICAgcHJpbnRmKCJ9O1xuIik7CisgICAgcHJpbnRmKCJzdGF0aWMgY29uc3QgREVDTEFSRV9BTElHTkVEKDE2LCBmbG9hdCwgZjM0XzJfNClbNF1bOF1bMl0gPSB7XG4iKTsKKyAgICB3cml0ZV9mbG9hdF8zZF9hcnJheShmMzRfMl80LCA0LCA4LCAyKTsKKyAgICBwcmludGYoIn07XG4iKTsKKworICAgIHByaW50Zigic3RhdGljIGNvbnN0IERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIFFfZnJhY3RfYWxscGFzcylbMl1bNTBdWzNdWzJdID0ge1xuIik7CisgICAgd3JpdGVfZmxvYXRfNGRfYXJyYXkoUV9mcmFjdF9hbGxwYXNzLCAyLCA1MCwgMywgMik7CisgICAgcHJpbnRmKCJ9O1xuIik7CisgICAgcHJpbnRmKCJzdGF0aWMgY29uc3QgREVDTEFSRV9BTElHTkVEKDE2LCBmbG9hdCwgcGhpX2ZyYWN0KVsyXVs1MF1bMl0gPSB7XG4iKTsKKyAgICB3cml0ZV9mbG9hdF8zZF9hcnJheShwaGlfZnJhY3QsIDIsIDUwLCAyKTsKKyAgICBwcmludGYoIn07XG4iKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFjcHNfdGFibGVnZW4uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzX3RhYmxlZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExMTEyZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzX3RhYmxlZ2VuLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBIZWFkZXIgZmlsZSBmb3IgaGFyZGNvZGVkIFBhcmFtZXRyaWMgU3RlcmVvIHRhYmxlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBbGV4IENvbnZlcnNlIDxhbGV4LmNvbnZlcnNlQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBQUNQU19UQUJMRUdFTl9ICisjZGVmaW5lIEFBQ1BTX1RBQkxFR0VOX0gKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmIENPTkZJR19IQVJEQ09ERURfVEFCTEVTCisjZGVmaW5lIHBzX3RhYmxlaW5pdCgpCisjZGVmaW5lIFRBQkxFX0NPTlNUIGNvbnN0CisjaW5jbHVkZSAibGliYXZjb2RlYy9hYWNwc190YWJsZXMuaCIKKyNlbHNlCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9saWJtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2RlZmluZSBOUl9BTExQQVNTX0JBTkRTMjAgMzAKKyNkZWZpbmUgTlJfQUxMUEFTU19CQU5EUzM0IDUwCisjZGVmaW5lIFBTX0FQX0xJTktTIDMKKyNkZWZpbmUgVEFCTEVfQ09OU1QKK3N0YXRpYyBmbG9hdCBwZF9yZV9zbW9vdGhbOCo4KjhdOworc3RhdGljIGZsb2F0IHBkX2ltX3Ntb290aFs4KjgqOF07CitzdGF0aWMgZmxvYXQgSEFbNDZdWzhdWzRdOworc3RhdGljIGZsb2F0IEhCWzQ2XVs4XVs0XTsKK3N0YXRpYyBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBmMjBfMF84KSBbIDhdWzhdWzJdOworc3RhdGljIERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIGYzNF8wXzEyKVsxMl1bOF1bMl07CitzdGF0aWMgREVDTEFSRV9BTElHTkVEKDE2LCBmbG9hdCwgZjM0XzFfOCkgWyA4XVs4XVsyXTsKK3N0YXRpYyBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBmMzRfMl80KSBbIDRdWzhdWzJdOworc3RhdGljIFRBQkxFX0NPTlNUIERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIFFfZnJhY3RfYWxscGFzcylbMl1bNTBdWzNdWzJdOworc3RhdGljIERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIHBoaV9mcmFjdClbMl1bNTBdWzJdOworCitzdGF0aWMgY29uc3QgZmxvYXQgZzBfUThbXSA9IHsKKyAgICAwLjAwNzQ2MDgyOTQ5ODEyZiwgMC4wMjI3MDQyMDk0OTgyNWYsIDAuMDQ1NDY4NjU5MzA0NzNmLCAwLjA3MjY2MTEzOTI5NTkxZiwKKyAgICAwLjA5ODg1MTA4NTc1MjY0ZiwgMC4xMTc5MzcxMDU2NzIxN2YsIDAuMTI1ZgorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGcwX1ExMltdID0geworICAgIDAuMDQwODExNzk5MjQ2OTJmLCAwLjAzODEyODEwOTk0OTI2ZiwgMC4wNTE0NDkwODEzNTY5OWYsIDAuMDYzOTk4MzExNTE1OTJmLAorICAgIDAuMDc0MjgzMTM4MDExMDZmLCAwLjA4MTAwMzQ3ODkyOTE0ZiwgMC4wODMzMzMzMzMzMzMzM2YKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBnMV9ROFtdID0geworICAgIDAuMDE1NjU2NzU2MDAxMjJmLCAwLjAzNzUyNzE2MzkxOTkxZiwgMC4wNTQxNzg5MTM3ODc4MmYsIDAuMDg0MTcwNDQxMTY3NjdmLAorICAgIDAuMTAzMDczNDQxNTgwMzZmLCAwLjEyMjIyNDUyMjQ5NzUzZiwgMC4xMjVmCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgZzJfUTRbXSA9IHsKKyAgICAtMC4wNTkwODIxMTE1NTYzOWYsIC0wLjA0ODcxNDk4Mzc0OTQ2ZiwgMC4wZiwgICAwLjA3Nzc4NzIzOTE1ODUxZiwKKyAgICAgMC4xNjQ4NjMwMzU2NzQwM2YsICAwLjIzMjc5ODU2NjYyOTk2ZiwgMC4yNWYKK307CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgbWFrZV9maWx0ZXJzX2Zyb21fcHJvdG8oZmxvYXQgKCpmaWx0ZXIpWzhdWzJdLCBjb25zdCBmbG9hdCAqcHJvdG8sIGludCBiYW5kcykKK3sKKyAgICBpbnQgcSwgbjsKKyAgICBmb3IgKHEgPSAwOyBxIDwgYmFuZHM7IHErKykgeworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgNzsgbisrKSB7CisgICAgICAgICAgICBkb3VibGUgdGhldGEgPSAyICogTV9QSSAqIChxICsgMC41KSAqIChuIC0gNikgLyBiYW5kczsKKyAgICAgICAgICAgIGZpbHRlcltxXVtuXVswXSA9IHByb3RvW25dICogIGNvcyh0aGV0YSk7CisgICAgICAgICAgICBmaWx0ZXJbcV1bbl1bMV0gPSBwcm90b1tuXSAqIC1zaW4odGhldGEpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHBzX3RhYmxlaW5pdCh2b2lkKQoreworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpcGRvcGRfc2luW10gPSB7IDAsIE1fU1FSVDFfMiwgMSwgIE1fU1FSVDFfMiwgIDAsIC1NX1NRUlQxXzIsIC0xLCAtTV9TUVJUMV8yIH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlwZG9wZF9jb3NbXSA9IHsgMSwgTV9TUVJUMV8yLCAwLCAtTV9TUVJUMV8yLCAtMSwgLU1fU1FSVDFfMiwgIDAsICBNX1NRUlQxXzIgfTsKKyAgICBpbnQgcGQwLCBwZDEsIHBkMjsKKworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpaWRfcGFyX2RlcXVhbnRbXSA9IHsKKyAgICAgICAgLy9paWRfcGFyX2RlcXVhbnRfZGVmYXVsdAorICAgICAgICAwLjA1NjIzNDEzMjUxOTAzLCAwLjEyNTg5MjU0MTE3OTQyLCAwLjE5OTUyNjIzMTQ5Njg5LCAwLjMxNjIyNzc2NjAxNjg0LAorICAgICAgICAwLjQ0NjY4MzU5MjE1MDk2LCAwLjYzMDk1NzM0NDQ4MDE5LCAwLjc5NDMyODIzNDcyNDI4LCAxLAorICAgICAgICAxLjI1ODkyNTQxMTc5NDE3LCAxLjU4NDg5MzE5MjQ2MTExLCAyLjIzODcyMTEzODU2ODM0LCAzLjE2MjI3NzY2MDE2ODM4LAorICAgICAgICA1LjAxMTg3MjMzNjI3MjcyLCA3Ljk0MzI4MjM0NzI0MjgyLCAxNy43ODI3OTQxMDAzODkyLAorICAgICAgICAvL2lpZF9wYXJfZGVxdWFudF9maW5lCisgICAgICAgIDAuMDAzMTYyMjc3NjYwMTcsIDAuMDA1NjIzNDEzMjUxOTAsIDAuMDEsICAgICAgICAgICAgIDAuMDE3NzgyNzk0MTAwMzksCisgICAgICAgIDAuMDMxNjIyNzc2NjAxNjgsIDAuMDU2MjM0MTMyNTE5MDMsIDAuMDc5NDMyODIzNDcyNDMsIDAuMTEyMjAxODQ1NDMwMjAsCisgICAgICAgIDAuMTU4NDg5MzE5MjQ2MTEsIDAuMjIzODcyMTEzODU2ODMsIDAuMzE2MjI3NzY2MDE2ODQsIDAuMzk4MTA3MTcwNTUzNTAsCisgICAgICAgIDAuNTAxMTg3MjMzNjI3MjcsIDAuNjMwOTU3MzQ0NDgwMTksIDAuNzk0MzI4MjM0NzI0MjgsIDEsCisgICAgICAgIDEuMjU4OTI1NDExNzk0MTcsIDEuNTg0ODkzMTkyNDYxMTEsIDEuOTk1MjYyMzE0OTY4ODgsIDIuNTExODg2NDMxNTA5NTgsCisgICAgICAgIDMuMTYyMjc3NjYwMTY4MzgsIDQuNDY2ODM1OTIxNTA5NjMsIDYuMzA5NTczNDQ0ODAxOTMsIDguOTEyNTA5MzgxMzM3NDUsCisgICAgICAgIDEyLjU4OTI1NDExNzk0MTcsIDE3Ljc4Mjc5NDEwMDM4OTIsIDMxLjYyMjc3NjYwMTY4MzgsIDU2LjIzNDEzMjUxOTAzNDksCisgICAgICAgIDEwMCwgICAgICAgICAgICAgIDE3Ny44Mjc5NDEwMDM4OTIsIDMxNi4yMjc3NjYwMTY4MzcsCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgaWNjX2ludnFbXSA9IHsKKyAgICAgICAgMSwgMC45MzcsICAgICAgMC44NDExOCwgICAgMC42MDA5MiwgICAgMC4zNjc2NCwgICAwLCAgICAgIC0wLjU4OSwgICAgLTEKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBhY29zX2ljY19pbnZxW10gPSB7CisgICAgICAgIDAsIDAuMzU2ODU1MjcsIDAuNTcxMzM0NjYsIDAuOTI2MTQ0NzIsIDEuMTk0MzI2MywgTV9QSS8yLCAyLjIwMDYxNzEsIE1fUEkKKyAgICB9OworICAgIGludCBpaWQsIGljYzsKKworICAgIGludCBrLCBtOworICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgZl9jZW50ZXJfMjBbXSA9IHsKKyAgICAgICAgLTMsIC0xLCAxLCAzLCA1LCA3LCAxMCwgMTQsIDE4LCAyMiwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgZl9jZW50ZXJfMzRbXSA9IHsKKyAgICAgICAgIDIsICA2LCAxMCwgMTQsIDE4LCAyMiwgMjYsIDMwLAorICAgICAgICAzNCwtMTAsIC02LCAtMiwgNTEsIDU3LCAxNSwgMjEsCisgICAgICAgIDI3LCAzMywgMzksIDQ1LCA1NCwgNjYsIDc4LCA0MiwKKyAgICAgICAxMDIsIDY2LCA3OCwgOTAsMTAyLDExNCwxMjYsIDkwLAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGZyYWN0aW9uYWxfZGVsYXlfbGlua3NbXSA9IHsgMC40M2YsIDAuNzVmLCAwLjM0N2YgfTsKKyAgICBjb25zdCBmbG9hdCBmcmFjdGlvbmFsX2RlbGF5X2dhaW4gPSAwLjM5ZjsKKworICAgIGZvciAocGQwID0gMDsgcGQwIDwgODsgcGQwKyspIHsKKyAgICAgICAgZmxvYXQgcGQwX3JlID0gaXBkb3BkX2Nvc1twZDBdOworICAgICAgICBmbG9hdCBwZDBfaW0gPSBpcGRvcGRfc2luW3BkMF07CisgICAgICAgIGZvciAocGQxID0gMDsgcGQxIDwgODsgcGQxKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHBkMV9yZSA9IGlwZG9wZF9jb3NbcGQxXTsKKyAgICAgICAgICAgIGZsb2F0IHBkMV9pbSA9IGlwZG9wZF9zaW5bcGQxXTsKKyAgICAgICAgICAgIGZvciAocGQyID0gMDsgcGQyIDwgODsgcGQyKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBwZDJfcmUgPSBpcGRvcGRfY29zW3BkMl07CisgICAgICAgICAgICAgICAgZmxvYXQgcGQyX2ltID0gaXBkb3BkX3NpbltwZDJdOworICAgICAgICAgICAgICAgIGZsb2F0IHJlX3Ntb290aCA9IDAuMjVmICogcGQwX3JlICsgMC41ZiAqIHBkMV9yZSArIHBkMl9yZTsKKyAgICAgICAgICAgICAgICBmbG9hdCBpbV9zbW9vdGggPSAwLjI1ZiAqIHBkMF9pbSArIDAuNWYgKiBwZDFfaW0gKyBwZDJfaW07CisgICAgICAgICAgICAgICAgZmxvYXQgcGRfbWFnID0gMSAvIHNxcnQoaW1fc21vb3RoICogaW1fc21vb3RoICsgcmVfc21vb3RoICogcmVfc21vb3RoKTsKKyAgICAgICAgICAgICAgICBwZF9yZV9zbW9vdGhbcGQwKjY0K3BkMSo4K3BkMl0gPSByZV9zbW9vdGggKiBwZF9tYWc7CisgICAgICAgICAgICAgICAgcGRfaW1fc21vb3RoW3BkMCo2NCtwZDEqOCtwZDJdID0gaW1fc21vb3RoICogcGRfbWFnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaWQgPSAwOyBpaWQgPCA0NjsgaWlkKyspIHsKKyAgICAgICAgZmxvYXQgYyA9IGlpZF9wYXJfZGVxdWFudFtpaWRdOyAvLy88IExpbmVhciBJbnRlci1jaGFubmVsIEludGVuc2l0eSBEaWZmZXJlbmNlCisgICAgICAgIGZsb2F0IGMxID0gKGZsb2F0KU1fU1FSVDIgLyBzcXJ0ZigxLjBmICsgYypjKTsKKyAgICAgICAgZmxvYXQgYzIgPSBjICogYzE7CisgICAgICAgIGZvciAoaWNjID0gMDsgaWNjIDwgODsgaWNjKyspIHsKKyAgICAgICAgICAgIC8qaWYgKFBTX0JBU0VMSU5FIHx8IHBzLT5pY2NfbW9kZSA8IDMpKi8geworICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gMC41ZiAqIGFjb3NfaWNjX2ludnFbaWNjXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBiZXRhICA9IGFscGhhICogKGMxIC0gYzIpICogKGZsb2F0KU1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBIQVtpaWRdW2ljY11bMF0gPSBjMiAqIGNvc2YoYmV0YSArIGFscGhhKTsKKyAgICAgICAgICAgICAgICBIQVtpaWRdW2ljY11bMV0gPSBjMSAqIGNvc2YoYmV0YSAtIGFscGhhKTsKKyAgICAgICAgICAgICAgICBIQVtpaWRdW2ljY11bMl0gPSBjMiAqIHNpbmYoYmV0YSArIGFscGhhKTsKKyAgICAgICAgICAgICAgICBIQVtpaWRdW2ljY11bM10gPSBjMSAqIHNpbmYoYmV0YSAtIGFscGhhKTsKKyAgICAgICAgICAgIH0gLyogZWxzZSAqLyB7CisgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEsIGdhbW1hLCBtdSwgcmhvOworICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhX2MsIGFscGhhX3MsIGdhbW1hX2MsIGdhbW1hX3M7CisgICAgICAgICAgICAgICAgcmhvID0gRkZNQVgoaWNjX2ludnFbaWNjXSwgMC4wNWYpOworICAgICAgICAgICAgICAgIGFscGhhID0gMC41ZiAqIGF0YW4yZigyLjBmICogYyAqIHJobywgYypjIC0gMS4wZik7CisgICAgICAgICAgICAgICAgbXUgPSBjICsgMS4wZiAvIGM7CisgICAgICAgICAgICAgICAgbXUgPSBzcXJ0ZigxICsgKDQgKiByaG8gKiByaG8gLSA0KS8obXUgKiBtdSkpOworICAgICAgICAgICAgICAgIGdhbW1hID0gYXRhbmYoc3FydGYoKDEuMGYgLSBtdSkvKDEuMGYgKyBtdSkpKTsKKyAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPCAwKSBhbHBoYSArPSBNX1BJLzI7CisgICAgICAgICAgICAgICAgYWxwaGFfYyA9IGNvc2YoYWxwaGEpOworICAgICAgICAgICAgICAgIGFscGhhX3MgPSBzaW5mKGFscGhhKTsKKyAgICAgICAgICAgICAgICBnYW1tYV9jID0gY29zZihnYW1tYSk7CisgICAgICAgICAgICAgICAgZ2FtbWFfcyA9IHNpbmYoZ2FtbWEpOworICAgICAgICAgICAgICAgIEhCW2lpZF1baWNjXVswXSA9ICBNX1NRUlQyICogYWxwaGFfYyAqIGdhbW1hX2M7CisgICAgICAgICAgICAgICAgSEJbaWlkXVtpY2NdWzFdID0gIE1fU1FSVDIgKiBhbHBoYV9zICogZ2FtbWFfYzsKKyAgICAgICAgICAgICAgICBIQltpaWRdW2ljY11bMl0gPSAtTV9TUVJUMiAqIGFscGhhX3MgKiBnYW1tYV9zOworICAgICAgICAgICAgICAgIEhCW2lpZF1baWNjXVszXSA9ICBNX1NRUlQyICogYWxwaGFfYyAqIGdhbW1hX3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgTlJfQUxMUEFTU19CQU5EUzIwOyBrKyspIHsKKyAgICAgICAgZG91YmxlIGZfY2VudGVyLCB0aGV0YTsKKyAgICAgICAgaWYgKGsgPCBGRl9BUlJBWV9FTEVNUyhmX2NlbnRlcl8yMCkpCisgICAgICAgICAgICBmX2NlbnRlciA9IGZfY2VudGVyXzIwW2tdICogMC4xMjU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZfY2VudGVyID0gayAtIDYuNWY7CisgICAgICAgIGZvciAobSA9IDA7IG0gPCBQU19BUF9MSU5LUzsgbSsrKSB7CisgICAgICAgICAgICB0aGV0YSA9IC1NX1BJICogZnJhY3Rpb25hbF9kZWxheV9saW5rc1ttXSAqIGZfY2VudGVyOworICAgICAgICAgICAgUV9mcmFjdF9hbGxwYXNzWzBdW2tdW21dWzBdID0gY29zKHRoZXRhKTsKKyAgICAgICAgICAgIFFfZnJhY3RfYWxscGFzc1swXVtrXVttXVsxXSA9IHNpbih0aGV0YSk7CisgICAgICAgIH0KKyAgICAgICAgdGhldGEgPSAtTV9QSSpmcmFjdGlvbmFsX2RlbGF5X2dhaW4qZl9jZW50ZXI7CisgICAgICAgIHBoaV9mcmFjdFswXVtrXVswXSA9IGNvcyh0aGV0YSk7CisgICAgICAgIHBoaV9mcmFjdFswXVtrXVsxXSA9IHNpbih0aGV0YSk7CisgICAgfQorICAgIGZvciAoayA9IDA7IGsgPCBOUl9BTExQQVNTX0JBTkRTMzQ7IGsrKykgeworICAgICAgICBkb3VibGUgZl9jZW50ZXIsIHRoZXRhOworICAgICAgICBpZiAoayA8IEZGX0FSUkFZX0VMRU1TKGZfY2VudGVyXzM0KSkKKyAgICAgICAgICAgIGZfY2VudGVyID0gZl9jZW50ZXJfMzRba10gLyAyNC4wOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmX2NlbnRlciA9IGsgLSAyNi41ZjsKKyAgICAgICAgZm9yIChtID0gMDsgbSA8IFBTX0FQX0xJTktTOyBtKyspIHsKKyAgICAgICAgICAgIHRoZXRhID0gLU1fUEkgKiBmcmFjdGlvbmFsX2RlbGF5X2xpbmtzW21dICogZl9jZW50ZXI7CisgICAgICAgICAgICBRX2ZyYWN0X2FsbHBhc3NbMV1ba11bbV1bMF0gPSBjb3ModGhldGEpOworICAgICAgICAgICAgUV9mcmFjdF9hbGxwYXNzWzFdW2tdW21dWzFdID0gc2luKHRoZXRhKTsKKyAgICAgICAgfQorICAgICAgICB0aGV0YSA9IC1NX1BJKmZyYWN0aW9uYWxfZGVsYXlfZ2FpbipmX2NlbnRlcjsKKyAgICAgICAgcGhpX2ZyYWN0WzFdW2tdWzBdID0gY29zKHRoZXRhKTsKKyAgICAgICAgcGhpX2ZyYWN0WzFdW2tdWzFdID0gc2luKHRoZXRhKTsKKyAgICB9CisKKyAgICBtYWtlX2ZpbHRlcnNfZnJvbV9wcm90byhmMjBfMF84LCAgZzBfUTgsICAgOCk7CisgICAgbWFrZV9maWx0ZXJzX2Zyb21fcHJvdG8oZjM0XzBfMTIsIGcwX1ExMiwgMTIpOworICAgIG1ha2VfZmlsdGVyc19mcm9tX3Byb3RvKGYzNF8xXzgsICBnMV9ROCwgICA4KTsKKyAgICBtYWtlX2ZpbHRlcnNfZnJvbV9wcm90byhmMzRfMl80LCAgZzJfUTQsICAgNCk7Cit9CisjZW5kaWYgLyogQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMgKi8KKworI2VuZGlmIC8qIEFBQ1BTX1RBQkxFR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzZGF0YS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjcHNkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzMWNhZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzZGF0YS5jCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogTVBFRy00IFBhcmFtZXRyaWMgU3RlcmVvIGRhdGEgdGFibGVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQWxleCBDb252ZXJzZSA8YWxleC5jb252ZXJzZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfaWlkX2RmMV9iaXRzW10gPSB7CisgICAgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTcsIDE4LCAxNywgMTcsIDE2LCAxNiwgMTUsIDE0LCAxNCwKKyAgICAxMywgMTIsIDEyLCAxMSwgMTAsIDEwLCAgOCwgIDcsICA2LCAgNSwgIDQsICAzLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LAorICAgICA4LCAgOSwgMTAsIDExLCAxMSwgMTIsIDEzLCAxNCwgMTQsIDE1LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE3LCAxOCwgMTgsCisgICAgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgaHVmZl9paWRfZGYxX2NvZGVzW10gPSB7CisgICAgMHgwMUZFQjQsIDB4MDFGRUI1LCAweDAxRkQ3NiwgMHgwMUZENzcsIDB4MDFGRDc0LCAweDAxRkQ3NSwgMHgwMUZFOEEsCisgICAgMHgwMUZFOEIsIDB4MDFGRTg4LCAweDAwRkU4MCwgMHgwMUZFQjYsIDB4MDBGRTgyLCAweDAwRkVCOCwgMHgwMDdGNDIsCisgICAgMHgwMDdGQUUsIDB4MDAzRkFGLCAweDAwMUZEMSwgMHgwMDFGRTksIDB4MDAwRkU5LCAweDAwMDdFQSwgMHgwMDA3RkIsCisgICAgMHgwMDAzRkIsIDB4MDAwMUZCLCAweDAwMDFGRiwgMHgwMDAwN0MsIDB4MDAwMDNDLCAweDAwMDAxQywgMHgwMDAwMEMsCisgICAgMHgwMDAwMDAsIDB4MDAwMDAxLCAweDAwMDAwMSwgMHgwMDAwMDIsIDB4MDAwMDAxLCAweDAwMDAwRCwgMHgwMDAwMUQsCisgICAgMHgwMDAwM0QsIDB4MDAwMDdELCAweDAwMDBGQywgMHgwMDAxRkMsIDB4MDAwM0ZDLCAweDAwMDNGNCwgMHgwMDA3RUIsCisgICAgMHgwMDBGRUEsIDB4MDAxRkVBLCAweDAwMUZENiwgMHgwMDNGRDAsIDB4MDA3RkFGLCAweDAwN0Y0MywgMHgwMEZFQjksCisgICAgMHgwMEZFODMsIDB4MDFGRUI3LCAweDAwRkU4MSwgMHgwMUZFODksIDB4MDFGRThFLCAweDAxRkU4RiwgMHgwMUZFOEMsCisgICAgMHgwMUZFOEQsIDB4MDFGRUIyLCAweDAxRkVCMywgMHgwMUZFQjAsIDB4MDFGRUIxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9paWRfZHQxX2JpdHNbXSA9IHsKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDEzLAorICAgIDEzLCAxMywgMTIsIDEyLCAxMSwgMTAsICA5LCAgOSwgIDcsICA2LCAgNSwgIDMsICAxLCAgMiwgIDUsICA2LCAgNywgIDgsCisgICAgIDksIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBodWZmX2lpZF9kdDFfY29kZXNbXSA9IHsKKyAgICAweDAwNEVENCwgMHgwMDRFRDUsIDB4MDA0RUNFLCAweDAwNEVDRiwgMHgwMDRFQ0MsIDB4MDA0RUQ2LCAweDAwNEVEOCwKKyAgICAweDAwNEY0NiwgMHgwMDRGNjAsIDB4MDAyNzE4LCAweDAwMjcxOSwgMHgwMDI3NjQsIDB4MDAyNzY1LCAweDAwMjc2RCwKKyAgICAweDAwMjdCMSwgMHgwMDEzQjcsIDB4MDAxM0Q2LCAweDAwMDlDNywgMHgwMDA5RTksIDB4MDAwOUVELCAweDAwMDRFRSwKKyAgICAweDAwMDRGNywgMHgwMDAyNzgsIDB4MDAwMTM5LCAweDAwMDA5QSwgMHgwMDAwOUYsIDB4MDAwMDIwLCAweDAwMDAxMSwKKyAgICAweDAwMDAwQSwgMHgwMDAwMDMsIDB4MDAwMDAxLCAweDAwMDAwMCwgMHgwMDAwMEIsIDB4MDAwMDEyLCAweDAwMDAyMSwKKyAgICAweDAwMDA0QywgMHgwMDAwOUIsIDB4MDAwMTNBLCAweDAwMDI3OSwgMHgwMDAyNzAsIDB4MDAwNEVGLCAweDAwMDRFMiwKKyAgICAweDAwMDlFQSwgMHgwMDA5RDgsIDB4MDAxM0Q3LCAweDAwMTNEMCwgMHgwMDI3QjIsIDB4MDAyN0EyLCAweDAwMjcxQSwKKyAgICAweDAwMjcxQiwgMHgwMDRGNjYsIDB4MDA0RjY3LCAweDAwNEY2MSwgMHgwMDRGNDcsIDB4MDA0RUQ5LCAweDAwNEVENywKKyAgICAweDAwNEVDRCwgMHgwMDRFRDIsIDB4MDA0RUQzLCAweDAwNEVEMCwgMHgwMDRFRDEsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2lpZF9kZjBfYml0c1tdID0geworICAgIDE3LCAxNywgMTcsIDE3LCAxNiwgMTUsIDEzLCAxMCwgIDksICA3LCAgNiwgIDUsICA0LCAgMywgIDEsICAzLCAgNCwgIDUsCisgICAgIDYsICA2LCAgOCwgMTEsIDEzLCAxNCwgMTQsIDE1LCAxNywgMTgsIDE4LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGh1ZmZfaWlkX2RmMF9jb2Rlc1tdID0geworICAgIDB4MDFGRkZCLCAweDAxRkZGQywgMHgwMUZGRkQsIDB4MDFGRkZBLCAweDAwRkZGQywgMHgwMDdGRkMsIDB4MDAxRkZELAorICAgIDB4MDAwM0ZFLCAweDAwMDFGRSwgMHgwMDAwN0UsIDB4MDAwMDNDLCAweDAwMDAxRCwgMHgwMDAwMEQsIDB4MDAwMDA1LAorICAgIDB4MDAwMDAwLCAweDAwMDAwNCwgMHgwMDAwMEMsIDB4MDAwMDFDLCAweDAwMDAzRCwgMHgwMDAwM0UsIDB4MDAwMEZFLAorICAgIDB4MDAwN0ZFLCAweDAwMUZGQywgMHgwMDNGRkMsIDB4MDAzRkZELCAweDAwN0ZGRCwgMHgwMUZGRkUsIDB4MDNGRkZFLAorICAgIDB4MDNGRkZGLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9paWRfZHQwX2JpdHNbXSA9IHsKKyAgICAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAxNywgMTUsIDEyLCAxMCwgIDgsICA2LCAgNCwgIDIsICAxLCAgMywgIDUsICA3LAorICAgICA5LCAxMSwgMTMsIDE0LCAxNywgMTksIDIwLCAyMCwgMjAsIDIwLCAyMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBodWZmX2lpZF9kdDBfY29kZXNbXSA9IHsKKyAgICAweDA3RkZGOSwgMHgwN0ZGRkEsIDB4MDdGRkZCLCAweDBGRkZGOCwgMHgwRkZGRjksIDB4MEZGRkZBLCAweDAxRkZGRCwKKyAgICAweDAwN0ZGRSwgMHgwMDBGRkUsIDB4MDAwM0ZFLCAweDAwMDBGRSwgMHgwMDAwM0UsIDB4MDAwMDBFLCAweDAwMDAwMiwKKyAgICAweDAwMDAwMCwgMHgwMDAwMDYsIDB4MDAwMDFFLCAweDAwMDA3RSwgMHgwMDAxRkUsIDB4MDAwN0ZFLCAweDAwMUZGRSwKKyAgICAweDAwM0ZGRSwgMHgwMUZGRkMsIDB4MDdGRkY4LCAweDBGRkZGQiwgMHgwRkZGRkMsIDB4MEZGRkZELCAweDBGRkZGRSwKKyAgICAweDBGRkZGRiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfaWNjX2RmX2JpdHNbXSA9IHsKKyAgICAxNCwgMTQsIDEyLCAxMCwgNywgNSwgMywgMSwgMiwgNCwgNiwgOCwgOSwgMTEsIDEzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGh1ZmZfaWNjX2RmX2NvZGVzW10gPSB7CisgICAgMHgzRkZGLCAweDNGRkUsIDB4MEZGRSwgMHgwM0ZFLCAweDAwN0UsIDB4MDAxRSwgMHgwMDA2LCAweDAwMDAsCisgICAgMHgwMDAyLCAweDAwMEUsIDB4MDAzRSwgMHgwMEZFLCAweDAxRkUsIDB4MDdGRSwgMHgxRkZFLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9pY2NfZHRfYml0c1tdID0geworICAgIDE0LCAxMywgMTEsIDksIDcsIDUsIDMsIDEsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgaHVmZl9pY2NfZHRfY29kZXNbXSA9IHsKKyAgICAweDNGRkUsIDB4MUZGRSwgMHgwN0ZFLCAweDAxRkUsIDB4MDA3RSwgMHgwMDFFLCAweDAwMDYsIDB4MDAwMCwKKyAgICAweDAwMDIsIDB4MDAwRSwgMHgwMDNFLCAweDAwRkUsIDB4MDNGRSwgMHgwRkZFLCAweDNGRkYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2lwZF9kZl9iaXRzW10gPSB7CisgICAgMSwgMywgNCwgNCwgNCwgNCwgNCwgNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfaXBkX2RmX2NvZGVzW10gPSB7CisgICAgMHgwMSwgMHgwMCwgMHgwNiwgMHgwNCwgMHgwMiwgMHgwMywgMHgwNSwgMHgwNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfaXBkX2R0X2JpdHNbXSA9IHsKKyAgICAxLCAzLCA0LCA1LCA1LCA0LCA0LCAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9pcGRfZHRfY29kZXNbXSA9IHsKKyAgICAweDAxLCAweDAyLCAweDAyLCAweDAzLCAweDAyLCAweDAwLCAweDAzLCAweDAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9vcGRfZGZfYml0c1tdID0geworICAgIDEsIDMsIDQsIDQsIDUsIDUsIDQsIDMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX29wZF9kZl9jb2Rlc1tdID0geworICAgIDB4MDEsIDB4MDEsIDB4MDYsIDB4MDQsIDB4MEYsIDB4MEUsIDB4MDUsIDB4MDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX29wZF9kdF9iaXRzW10gPSB7CisgICAgMSwgMywgNCwgNSwgNSwgNCwgNCwgMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfb3BkX2R0X2NvZGVzW10gPSB7CisgICAgMHgwMSwgMHgwMiwgMHgwMSwgMHgwNywgMHgwNiwgMHgwMCwgMHgwMiwgMHgwMywKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgaHVmZl9vZmZzZXRbXSA9IHsKKyAgICAzMCwgMzAsCisgICAgMTQsIDE0LAorICAgIDcsIDcsCisgICAgMCwgMCwKKyAgICAwLCAwLAorfTsKKworLy8vVGFibGUgOC40OAorc3RhdGljIGNvbnN0IGludDhfdCBrX3RvX2lfMjBbXSA9IHsKKyAgICAgMSwgIDAsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE0LCAxNSwKKyAgICAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwKKyAgICAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTkKK307CisvLy9UYWJsZSA4LjQ5CitzdGF0aWMgY29uc3QgaW50OF90IGtfdG9faV8zNFtdID0geworICAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNiwgIDcsICAyLCAgMSwgIDAsIDEwLCAxMCwgIDQsICA1LCAgNiwgIDcsICA4LAorICAgICA5LCAxMCwgMTEsIDEyLCAgOSwgMTQsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDEzLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLAorICAgIDIyLCAyMiwgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsIDI3LCAyOCwgMjgsIDI4LCAyOSwgMjksIDI5LAorICAgIDMwLCAzMCwgMzAsIDMxLCAzMSwgMzEsIDMxLCAzMiwgMzIsIDMyLCAzMiwgMzMsIDMzLCAzMywgMzMsIDMzLCAzMywgMzMsIDMzLAorICAgIDMzLCAzMywgMzMsIDMzLCAzMywgMzMsIDMzLCAzMywgMzMsIDMzLCAzMywgMzMsIDMzLCAzMywgMzMKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBnMV9RMltdID0geworICAgIDAuMGYsICAwLjAxODk5NDg3NTI2MDQ5ZiwgMC4wZiwgLTAuMDcyOTMxMzkxNjc1MzhmLAorICAgIDAuMGYsICAwLjMwNTk2NjMwNTQ1MTY4ZiwgMC41ZgorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNwc2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYzFhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNwc2RzcC5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFsZXggQ29udmVyc2UgPGFsZXguY29udmVyc2VAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJhYWNwc2RzcC5oIgorCitzdGF0aWMgdm9pZCBwc19hZGRfc3F1YXJlc19jKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICgqc3JjKVsyXSwgaW50IG4pCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgZHN0W2ldICs9IHNyY1tpXVswXSAqIHNyY1tpXVswXSArIHNyY1tpXVsxXSAqIHNyY1tpXVsxXTsKK30KKworc3RhdGljIHZvaWQgcHNfbXVsX3BhaXJfc2luZ2xlX2MoZmxvYXQgKCpkc3QpWzJdLCBmbG9hdCAoKnNyYzApWzJdLCBmbG9hdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZHN0W2ldWzBdID0gc3JjMFtpXVswXSAqIHNyYzFbaV07CisgICAgICAgIGRzdFtpXVsxXSA9IHNyYzBbaV1bMV0gKiBzcmMxW2ldOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHNfaHlicmlkX2FuYWx5c2lzX2MoZmxvYXQgKCpvdXQpWzJdLCBmbG9hdCAoKmluKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICgqZmlsdGVyKVs4XVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBuKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBmbG9hdCBzdW1fcmUgPSBmaWx0ZXJbaV1bNl1bMF0gKiBpbls2XVswXTsKKyAgICAgICAgZmxvYXQgc3VtX2ltID0gZmlsdGVyW2ldWzZdWzBdICogaW5bNl1bMV07CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDY7IGorKykgeworICAgICAgICAgICAgZmxvYXQgaW4wX3JlID0gaW5bal1bMF07CisgICAgICAgICAgICBmbG9hdCBpbjBfaW0gPSBpbltqXVsxXTsKKyAgICAgICAgICAgIGZsb2F0IGluMV9yZSA9IGluWzEyLWpdWzBdOworICAgICAgICAgICAgZmxvYXQgaW4xX2ltID0gaW5bMTItal1bMV07CisgICAgICAgICAgICBzdW1fcmUgKz0gZmlsdGVyW2ldW2pdWzBdICogKGluMF9yZSArIGluMV9yZSkgLQorICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcltpXVtqXVsxXSAqIChpbjBfaW0gLSBpbjFfaW0pOworICAgICAgICAgICAgc3VtX2ltICs9IGZpbHRlcltpXVtqXVswXSAqIChpbjBfaW0gKyBpbjFfaW0pICsKKyAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJbaV1bal1bMV0gKiAoaW4wX3JlIC0gaW4xX3JlKTsKKyAgICAgICAgfQorICAgICAgICBvdXRbaSAqIHN0cmlkZV1bMF0gPSBzdW1fcmU7CisgICAgICAgIG91dFtpICogc3RyaWRlXVsxXSA9IHN1bV9pbTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBzX2h5YnJpZF9hbmFseXNpc19pbGVhdmVfYyhmbG9hdCAoKm91dClbMzJdWzJdLCBmbG9hdCBMWzJdWzM4XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBsZW4pCit7CisgICAgaW50IGo7CisKKyAgICBmb3IgKDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgICAgICAgICBvdXRbaV1bal1bMF0gPSBMWzBdW2pdW2ldOworICAgICAgICAgICAgb3V0W2ldW2pdWzFdID0gTFsxXVtqXVtpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcHNfaHlicmlkX3N5bnRoZXNpc19kZWludF9jKGZsb2F0IG91dFsyXVszOF1bNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICgqaW4pWzMyXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGxlbikKK3sKKyAgICBpbnQgbjsKKworICAgIGZvciAoOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbGVuOyBuKyspIHsKKyAgICAgICAgICAgIG91dFswXVtuXVtpXSA9IGluW2ldW25dWzBdOworICAgICAgICAgICAgb3V0WzFdW25dW2ldID0gaW5baV1bbl1bMV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBzX2RlY29ycmVsYXRlX2MoZmxvYXQgKCpvdXQpWzJdLCBmbG9hdCAoKmRlbGF5KVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKCphcF9kZWxheSlbUFNfUU1GX1RJTUVfU0xPVFMgKyBQU19NQVhfQVBfREVMQVldWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBwaGlfZnJhY3RbMl0sIGNvbnN0IGZsb2F0ICgqUV9mcmFjdClbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICp0cmFuc2llbnRfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ19kZWNheV9zbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgYVtdID0geyAwLjY1MTQzOTA1NzUzMTA2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU2NDcxODEyMjAwNzc2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQ4OTU0MTY1OTU1Njk1ZiB9OworICAgIGZsb2F0IGFnW1BTX0FQX0xJTktTXTsKKyAgICBpbnQgbSwgbjsKKworICAgIGZvciAobSA9IDA7IG0gPCBQU19BUF9MSU5LUzsgbSsrKQorICAgICAgICBhZ1ttXSA9IGFbbV0gKiBnX2RlY2F5X3Nsb3BlOworCisgICAgZm9yIChuID0gMDsgbiA8IGxlbjsgbisrKSB7CisgICAgICAgIGZsb2F0IGluX3JlID0gZGVsYXlbbl1bMF0gKiBwaGlfZnJhY3RbMF0gLSBkZWxheVtuXVsxXSAqIHBoaV9mcmFjdFsxXTsKKyAgICAgICAgZmxvYXQgaW5faW0gPSBkZWxheVtuXVswXSAqIHBoaV9mcmFjdFsxXSArIGRlbGF5W25dWzFdICogcGhpX2ZyYWN0WzBdOworICAgICAgICBmb3IgKG0gPSAwOyBtIDwgUFNfQVBfTElOS1M7IG0rKykgeworICAgICAgICAgICAgZmxvYXQgYV9yZSAgICAgICAgICAgICAgICA9IGFnW21dICogaW5fcmU7CisgICAgICAgICAgICBmbG9hdCBhX2ltICAgICAgICAgICAgICAgID0gYWdbbV0gKiBpbl9pbTsKKyAgICAgICAgICAgIGZsb2F0IGxpbmtfZGVsYXlfcmUgICAgICAgPSBhcF9kZWxheVttXVtuKzItbV1bMF07CisgICAgICAgICAgICBmbG9hdCBsaW5rX2RlbGF5X2ltICAgICAgID0gYXBfZGVsYXlbbV1bbisyLW1dWzFdOworICAgICAgICAgICAgZmxvYXQgZnJhY3Rpb25hbF9kZWxheV9yZSA9IFFfZnJhY3RbbV1bMF07CisgICAgICAgICAgICBmbG9hdCBmcmFjdGlvbmFsX2RlbGF5X2ltID0gUV9mcmFjdFttXVsxXTsKKyAgICAgICAgICAgIGZsb2F0IGFwZF9yZSA9IGluX3JlOworICAgICAgICAgICAgZmxvYXQgYXBkX2ltID0gaW5faW07CisgICAgICAgICAgICBpbl9yZSA9IGxpbmtfZGVsYXlfcmUgKiBmcmFjdGlvbmFsX2RlbGF5X3JlIC0KKyAgICAgICAgICAgICAgICAgICAgbGlua19kZWxheV9pbSAqIGZyYWN0aW9uYWxfZGVsYXlfaW0gLSBhX3JlOworICAgICAgICAgICAgaW5faW0gPSBsaW5rX2RlbGF5X3JlICogZnJhY3Rpb25hbF9kZWxheV9pbSArCisgICAgICAgICAgICAgICAgICAgIGxpbmtfZGVsYXlfaW0gKiBmcmFjdGlvbmFsX2RlbGF5X3JlIC0gYV9pbTsKKyAgICAgICAgICAgIGFwX2RlbGF5W21dW24rNV1bMF0gPSBhcGRfcmUgKyBhZ1ttXSAqIGluX3JlOworICAgICAgICAgICAgYXBfZGVsYXlbbV1bbis1XVsxXSA9IGFwZF9pbSArIGFnW21dICogaW5faW07CisgICAgICAgIH0KKyAgICAgICAgb3V0W25dWzBdID0gdHJhbnNpZW50X2dhaW5bbl0gKiBpbl9yZTsKKyAgICAgICAgb3V0W25dWzFdID0gdHJhbnNpZW50X2dhaW5bbl0gKiBpbl9pbTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBzX3N0ZXJlb19pbnRlcnBvbGF0ZV9jKGZsb2F0ICgqbClbMl0sIGZsb2F0ICgqcilbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoWzJdWzRdLCBmbG9hdCBoX3N0ZXBbMl1bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIGZsb2F0IGgwID0gaFswXVswXTsKKyAgICBmbG9hdCBoMSA9IGhbMF1bMV07CisgICAgZmxvYXQgaDIgPSBoWzBdWzJdOworICAgIGZsb2F0IGgzID0gaFswXVszXTsKKyAgICBmbG9hdCBoczAgPSBoX3N0ZXBbMF1bMF07CisgICAgZmxvYXQgaHMxID0gaF9zdGVwWzBdWzFdOworICAgIGZsb2F0IGhzMiA9IGhfc3RlcFswXVsyXTsKKyAgICBmbG9hdCBoczMgPSBoX3N0ZXBbMF1bM107CisgICAgaW50IG47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbGVuOyBuKyspIHsKKyAgICAgICAgLy9sIGlzIHMsIHIgaXMgZAorICAgICAgICBmbG9hdCBsX3JlID0gbFtuXVswXTsKKyAgICAgICAgZmxvYXQgbF9pbSA9IGxbbl1bMV07CisgICAgICAgIGZsb2F0IHJfcmUgPSByW25dWzBdOworICAgICAgICBmbG9hdCByX2ltID0gcltuXVsxXTsKKyAgICAgICAgaDAgKz0gaHMwOworICAgICAgICBoMSArPSBoczE7CisgICAgICAgIGgyICs9IGhzMjsKKyAgICAgICAgaDMgKz0gaHMzOworICAgICAgICBsW25dWzBdID0gaDAgKiBsX3JlICsgaDIgKiByX3JlOworICAgICAgICBsW25dWzFdID0gaDAgKiBsX2ltICsgaDIgKiByX2ltOworICAgICAgICByW25dWzBdID0gaDEgKiBsX3JlICsgaDMgKiByX3JlOworICAgICAgICByW25dWzFdID0gaDEgKiBsX2ltICsgaDMgKiByX2ltOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHNfc3RlcmVvX2ludGVycG9sYXRlX2lwZG9wZF9jKGZsb2F0ICgqbClbMl0sIGZsb2F0ICgqcilbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaFsyXVs0XSwgZmxvYXQgaF9zdGVwWzJdWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgZmxvYXQgaDAwICA9IGhbMF1bMF0sICAgICAgaDEwICA9IGhbMV1bMF07CisgICAgZmxvYXQgaDAxICA9IGhbMF1bMV0sICAgICAgaDExICA9IGhbMV1bMV07CisgICAgZmxvYXQgaDAyICA9IGhbMF1bMl0sICAgICAgaDEyICA9IGhbMV1bMl07CisgICAgZmxvYXQgaDAzICA9IGhbMF1bM10sICAgICAgaDEzICA9IGhbMV1bM107CisgICAgZmxvYXQgaHMwMCA9IGhfc3RlcFswXVswXSwgaHMxMCA9IGhfc3RlcFsxXVswXTsKKyAgICBmbG9hdCBoczAxID0gaF9zdGVwWzBdWzFdLCBoczExID0gaF9zdGVwWzFdWzFdOworICAgIGZsb2F0IGhzMDIgPSBoX3N0ZXBbMF1bMl0sIGhzMTIgPSBoX3N0ZXBbMV1bMl07CisgICAgZmxvYXQgaHMwMyA9IGhfc3RlcFswXVszXSwgaHMxMyA9IGhfc3RlcFsxXVszXTsKKyAgICBpbnQgbjsKKworICAgIGZvciAobiA9IDA7IG4gPCBsZW47IG4rKykgeworICAgICAgICAvL2wgaXMgcywgciBpcyBkCisgICAgICAgIGZsb2F0IGxfcmUgPSBsW25dWzBdOworICAgICAgICBmbG9hdCBsX2ltID0gbFtuXVsxXTsKKyAgICAgICAgZmxvYXQgcl9yZSA9IHJbbl1bMF07CisgICAgICAgIGZsb2F0IHJfaW0gPSByW25dWzFdOworICAgICAgICBoMDAgKz0gaHMwMDsKKyAgICAgICAgaDAxICs9IGhzMDE7CisgICAgICAgIGgwMiArPSBoczAyOworICAgICAgICBoMDMgKz0gaHMwMzsKKyAgICAgICAgaDEwICs9IGhzMTA7CisgICAgICAgIGgxMSArPSBoczExOworICAgICAgICBoMTIgKz0gaHMxMjsKKyAgICAgICAgaDEzICs9IGhzMTM7CisKKyAgICAgICAgbFtuXVswXSA9IGgwMCAqIGxfcmUgKyBoMDIgKiByX3JlIC0gaDEwICogbF9pbSAtIGgxMiAqIHJfaW07CisgICAgICAgIGxbbl1bMV0gPSBoMDAgKiBsX2ltICsgaDAyICogcl9pbSArIGgxMCAqIGxfcmUgKyBoMTIgKiByX3JlOworICAgICAgICByW25dWzBdID0gaDAxICogbF9yZSArIGgwMyAqIHJfcmUgLSBoMTEgKiBsX2ltIC0gaDEzICogcl9pbTsKKyAgICAgICAgcltuXVsxXSA9IGgwMSAqIGxfaW0gKyBoMDMgKiByX2ltICsgaDExICogbF9yZSArIGgxMyAqIHJfcmU7CisgICAgfQorfQorCithdl9jb2xkIHZvaWQgZmZfcHNkc3BfaW5pdChQU0RTUENvbnRleHQgKnMpCit7CisgICAgcy0+YWRkX3NxdWFyZXMgICAgICAgICAgICA9IHBzX2FkZF9zcXVhcmVzX2M7CisgICAgcy0+bXVsX3BhaXJfc2luZ2xlICAgICAgICA9IHBzX211bF9wYWlyX3NpbmdsZV9jOworICAgIHMtPmh5YnJpZF9hbmFseXNpcyAgICAgICAgPSBwc19oeWJyaWRfYW5hbHlzaXNfYzsKKyAgICBzLT5oeWJyaWRfYW5hbHlzaXNfaWxlYXZlID0gcHNfaHlicmlkX2FuYWx5c2lzX2lsZWF2ZV9jOworICAgIHMtPmh5YnJpZF9zeW50aGVzaXNfZGVpbnQgPSBwc19oeWJyaWRfc3ludGhlc2lzX2RlaW50X2M7CisgICAgcy0+ZGVjb3JyZWxhdGUgICAgICAgICAgICA9IHBzX2RlY29ycmVsYXRlX2M7CisgICAgcy0+c3RlcmVvX2ludGVycG9sYXRlWzBdICA9IHBzX3N0ZXJlb19pbnRlcnBvbGF0ZV9jOworICAgIHMtPnN0ZXJlb19pbnRlcnBvbGF0ZVsxXSAgPSBwc19zdGVyZW9faW50ZXJwb2xhdGVfaXBkb3BkX2M7CisKKyAgICBpZiAoQVJDSF9BUk0pCisgICAgICAgIGZmX3BzZHNwX2luaXRfYXJtKHMpOworICAgIGlmIChBUkNIX01JUFMpCisgICAgICAgIGZmX3BzZHNwX2luaXRfbWlwcyhzKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNwc2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjMwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNwc2RzcC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFucyBSdWxsZ2FyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIExJQkFWQ09ERUNfQUFDUFNEU1BfSAorI2RlZmluZSBMSUJBVkNPREVDX0FBQ1BTRFNQX0gKKworI2RlZmluZSBQU19RTUZfVElNRV9TTE9UUyAzMgorI2RlZmluZSBQU19BUF9MSU5LUyAzCisjZGVmaW5lIFBTX01BWF9BUF9ERUxBWSA1CisKK3R5cGVkZWYgc3RydWN0IFBTRFNQQ29udGV4dCB7CisgICAgdm9pZCAoKmFkZF9zcXVhcmVzKShmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAoKnNyYylbMl0sIGludCBuKTsKKyAgICB2b2lkICgqbXVsX3BhaXJfc2luZ2xlKShmbG9hdCAoKmRzdClbMl0sIGZsb2F0ICgqc3JjMClbMl0sIGZsb2F0ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuKTsKKyAgICB2b2lkICgqaHlicmlkX2FuYWx5c2lzKShmbG9hdCAoKm91dClbMl0sIGZsb2F0ICgqaW4pWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICgqZmlsdGVyKVs4XVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgbik7CisgICAgdm9pZCAoKmh5YnJpZF9hbmFseXNpc19pbGVhdmUpKGZsb2F0ICgqb3V0KVszMl1bMl0sIGZsb2F0IExbMl1bMzhdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBsZW4pOworICAgIHZvaWQgKCpoeWJyaWRfc3ludGhlc2lzX2RlaW50KShmbG9hdCBvdXRbMl1bMzhdWzY0XSwgZmxvYXQgKCppbilbMzJdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGxlbik7CisgICAgdm9pZCAoKmRlY29ycmVsYXRlKShmbG9hdCAoKm91dClbMl0sIGZsb2F0ICgqZGVsYXkpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKCphcF9kZWxheSlbUFNfUU1GX1RJTUVfU0xPVFMrUFNfTUFYX0FQX0RFTEFZXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHBoaV9mcmFjdFsyXSwgY29uc3QgZmxvYXQgKCpRX2ZyYWN0KVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICp0cmFuc2llbnRfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGdfZGVjYXlfc2xvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKyAgICB2b2lkICgqc3RlcmVvX2ludGVycG9sYXRlWzJdKShmbG9hdCAoKmwpWzJdLCBmbG9hdCAoKnIpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhbMl1bNF0sIGZsb2F0IGhfc3RlcFsyXVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKK30gUFNEU1BDb250ZXh0OworCit2b2lkIGZmX3BzZHNwX2luaXQoUFNEU1BDb250ZXh0ICpzKTsKK3ZvaWQgZmZfcHNkc3BfaW5pdF9hcm0oUFNEU1BDb250ZXh0ICpzKTsKK3ZvaWQgZmZfcHNkc3BfaW5pdF9taXBzKFBTRFNQQ29udGV4dCAqcyk7CisKKyNlbmRpZiAvKiBMSUJBVkNPREVDX0FBQ1BTRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzeS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjcHN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlYjgzNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3BzeS5jCkBAIC0wLDAgKzEsOTY1IEBACisvKgorICogQUFDIGVuY29kZXIgcHN5Y2hvYWNvdXN0aWMgbW9kZWwKKyAqIENvcHlyaWdodCAoQykgMjAwOCBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFBQyBlbmNvZGVyIHBzeWNob2Fjb3VzdGljIG1vZGVsCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJhYWN0YWIuaCIKKyNpbmNsdWRlICJwc3ltb2RlbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBUT0RPczoKKyAqIHRyeSBvdGhlciBiaXRyYXRlIGNvbnRyb2xsaW5nIG1lY2hhbmlzbSAobWF5YmUgdXNlIHJhdGVjb250cm9sLmM/KQorICogY29udHJvbCBxdWFsaXR5IGZvciBxdWFsaXR5LWJhc2VkIG91dHB1dAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogY29uc3RhbnRzIGZvciAzR1BQIEFBQyBwc3ljaG9hY291c3RpYyBtb2RlbAorICogQHsKKyAqLworI2RlZmluZSBQU1lfM0dQUF9USFJfU1BSRUFEX0hJICAgMS41ZiAvLyBzcHJlYWRpbmcgZmFjdG9yIGZvciBsb3ctdG8taGkgdGhyZXNob2xkIHNwcmVhZGluZyAgKDE1IGRCL0JhcmspCisjZGVmaW5lIFBTWV8zR1BQX1RIUl9TUFJFQURfTE9XICAzLjBmIC8vIHNwcmVhZGluZyBmYWN0b3IgZm9yIGhpLXRvLWxvdyB0aHJlc2hvbGQgc3ByZWFkaW5nICAoMzAgZEIvQmFyaykKKy8qIHNwcmVhZGluZyBmYWN0b3IgZm9yIGxvdy10by1oaSBlbmVyZ3kgc3ByZWFkaW5nLCBsb25nIGJsb2NrLCA+IDIya2Jwcy9jaGFubmVsICgyMGRCL0JhcmspICovCisjZGVmaW5lIFBTWV8zR1BQX0VOX1NQUkVBRF9ISV9MMSAyLjBmCisvKiBzcHJlYWRpbmcgZmFjdG9yIGZvciBsb3ctdG8taGkgZW5lcmd5IHNwcmVhZGluZywgbG9uZyBibG9jaywgPD0gMjJrYnBzL2NoYW5uZWwgKDE1ZEIvQmFyaykgKi8KKyNkZWZpbmUgUFNZXzNHUFBfRU5fU1BSRUFEX0hJX0wyIDEuNWYKKy8qIHNwcmVhZGluZyBmYWN0b3IgZm9yIGxvdy10by1oaSBlbmVyZ3kgc3ByZWFkaW5nLCBzaG9ydCBibG9jayAoMTUgZEIvQmFyaykgKi8KKyNkZWZpbmUgUFNZXzNHUFBfRU5fU1BSRUFEX0hJX1MgIDEuNWYKKy8qIHNwcmVhZGluZyBmYWN0b3IgZm9yIGhpLXRvLWxvdyBlbmVyZ3kgc3ByZWFkaW5nLCBsb25nIGJsb2NrICgzMGRCL0JhcmspICovCisjZGVmaW5lIFBTWV8zR1BQX0VOX1NQUkVBRF9MT1dfTCAzLjBmCisvKiBzcHJlYWRpbmcgZmFjdG9yIGZvciBoaS10by1sb3cgZW5lcmd5IHNwcmVhZGluZywgc2hvcnQgYmxvY2sgKDIwZEIvQmFyaykgKi8KKyNkZWZpbmUgUFNZXzNHUFBfRU5fU1BSRUFEX0xPV19TIDIuMGYKKworI2RlZmluZSBQU1lfM0dQUF9SUEVNSU4gICAgICAwLjAxZgorI2RlZmluZSBQU1lfM0dQUF9SUEVMRVYgICAgICAyLjBmCisKKyNkZWZpbmUgUFNZXzNHUFBfQzEgICAgICAgICAgMy4wZiAgICAgICAgICAgLyogbG9nMig4KSAqLworI2RlZmluZSBQU1lfM0dQUF9DMiAgICAgICAgICAxLjMyMTkyODFmICAgICAvKiBsb2cyKDIuNSkgKi8KKyNkZWZpbmUgUFNZXzNHUFBfQzMgICAgICAgICAgMC41NTkzNTcyOWYgICAgLyogMSAtIEMyIC8gQzEgKi8KKworI2RlZmluZSBQU1lfU05SXzFEQiAgICAgICAgICA3Ljk0MzI4MjFlLTFmICAvKiAtMWRCICovCisjZGVmaW5lIFBTWV9TTlJfMjVEQiAgICAgICAgIDMuMTYyMjc3NmUtM2YgIC8qIC0yNWRCICovCisKKyNkZWZpbmUgUFNZXzNHUFBfU0FWRV9TTE9QRV9MICAtMC40NjY2NjY2N2YKKyNkZWZpbmUgUFNZXzNHUFBfU0FWRV9TTE9QRV9TICAtMC4zNjM2MzYzN2YKKyNkZWZpbmUgUFNZXzNHUFBfU0FWRV9BRERfTCAgICAtMC44NDI4NTcxMmYKKyNkZWZpbmUgUFNZXzNHUFBfU0FWRV9BRERfUyAgICAtMC43NWYKKyNkZWZpbmUgUFNZXzNHUFBfU1BFTkRfU0xPUEVfTCAgMC42NjY2NjY2OWYKKyNkZWZpbmUgUFNZXzNHUFBfU1BFTkRfU0xPUEVfUyAgMC44MTgxODE4MWYKKyNkZWZpbmUgUFNZXzNHUFBfU1BFTkRfQUREX0wgICAtMC4zNWYKKyNkZWZpbmUgUFNZXzNHUFBfU1BFTkRfQUREX1MgICAtMC4yNjExMTExMWYKKyNkZWZpbmUgUFNZXzNHUFBfQ0xJUF9MT19MICAgICAgMC4yZgorI2RlZmluZSBQU1lfM0dQUF9DTElQX0xPX1MgICAgICAwLjJmCisjZGVmaW5lIFBTWV8zR1BQX0NMSVBfSElfTCAgICAgIDAuOTVmCisjZGVmaW5lIFBTWV8zR1BQX0NMSVBfSElfUyAgICAgIDAuNzVmCisKKyNkZWZpbmUgUFNZXzNHUFBfQUhfVEhSX0xPTkcgICAgMC41ZgorI2RlZmluZSBQU1lfM0dQUF9BSF9USFJfU0hPUlQgICAwLjYzZgorCitlbnVtIHsKKyAgICBQU1lfM0dQUF9BSF9OT05FLAorICAgIFBTWV8zR1BQX0FIX0lOQUNUSVZFLAorICAgIFBTWV8zR1BQX0FIX0FDVElWRQorfTsKKworI2RlZmluZSBQU1lfM0dQUF9CSVRTX1RPX1BFKGJpdHMpICgoYml0cykgKiAxLjE4ZikKKworLyogTEFNRSBwc3kgbW9kZWwgY29uc3RhbnRzICovCisjZGVmaW5lIFBTWV9MQU1FX0ZJUl9MRU4gMjEgICAgICAgICAvLy88IExBTUUgcHN5IG1vZGVsIEZJUiBvcmRlcgorI2RlZmluZSBBQUNfQkxPQ0tfU0laRV9MT05HIDEwMjQgICAgLy8vPCBsb25nIGJsb2NrIHNpemUKKyNkZWZpbmUgQUFDX0JMT0NLX1NJWkVfU0hPUlQgMTI4ICAgIC8vLzwgc2hvcnQgYmxvY2sgc2l6ZQorI2RlZmluZSBBQUNfTlVNX0JMT0NLU19TSE9SVCA4ICAgICAgLy8vPCBudW1iZXIgb2YgYmxvY2tzIGluIGEgc2hvcnQgc2VxdWVuY2UKKyNkZWZpbmUgUFNZX0xBTUVfTlVNX1NVQkJMT0NLUyAzICAgIC8vLzwgTnVtYmVyIG9mIHN1Yi1ibG9ja3MgaW4gZWFjaCBzaG9ydCBibG9jaworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBpbmZvcm1hdGlvbiBmb3Igc2luZ2xlIGJhbmQgdXNlZCBieSAzR1BQIFRTMjYuNDAzLWluc3BpcmVkIHBzeWNob2Fjb3VzdGljIG1vZGVsCisgKi8KK3R5cGVkZWYgc3RydWN0IEFhY1BzeUJhbmR7CisgICAgZmxvYXQgZW5lcmd5OyAgICAgICAvLy88IGJhbmQgZW5lcmd5CisgICAgZmxvYXQgdGhyOyAgICAgICAgICAvLy88IGVuZXJneSB0aHJlc2hvbGQKKyAgICBmbG9hdCB0aHJfcXVpZXQ7ICAgIC8vLzwgdGhyZXNob2xkIGluIHF1aWV0CisgICAgZmxvYXQgbnpfbGluZXM7ICAgICAvLy88IG51bWJlciBvZiBub24temVybyBzcGVjdHJhbCBsaW5lcworICAgIGZsb2F0IGFjdGl2ZV9saW5lczsgLy8vPCBudW1iZXIgb2YgYWN0aXZlIHNwZWN0cmFsIGxpbmVzCisgICAgZmxvYXQgcGU7ICAgICAgICAgICAvLy88IHBlcmNlcHR1YWwgZW50cm9weQorICAgIGZsb2F0IHBlX2NvbnN0OyAgICAgLy8vPCBjb25zdGFudCBwYXJ0IG9mIHRoZSBQRSBjYWxjdWxhdGlvbgorICAgIGZsb2F0IG5vcm1fZmFjOyAgICAgLy8vPCBub3JtYWxpemF0aW9uIGZhY3RvciBmb3IgbGluZWFyaXphdGlvbgorICAgIGludCAgIGF2b2lkX2hvbGVzOyAgLy8vPCBob2xlIGF2b2lkYW5jZSBmbGFnCit9QWFjUHN5QmFuZDsKKworLyoqCisgKiBzaW5nbGUvcGFpciBjaGFubmVsIGNvbnRleHQgZm9yIHBzeWNob2Fjb3VzdGljIG1vZGVsCisgKi8KK3R5cGVkZWYgc3RydWN0IEFhY1BzeUNoYW5uZWx7CisgICAgQWFjUHN5QmFuZCBiYW5kWzEyOF07ICAgICAgICAgICAgICAgLy8vPCBiYW5kcyBpbmZvcm1hdGlvbgorICAgIEFhY1BzeUJhbmQgcHJldl9iYW5kWzEyOF07ICAgICAgICAgIC8vLzwgYmFuZHMgaW5mb3JtYXRpb24gZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUKKworICAgIGZsb2F0ICAgICAgIHdpbl9lbmVyZ3k7ICAgICAgICAgICAgICAvLy88IHNsaWRpbmcgYXZlcmFnZSBvZiBjaGFubmVsIGVuZXJneQorICAgIGZsb2F0ICAgICAgIGlpcl9zdGF0ZVsyXTsgICAgICAgICAgICAvLy88IGhpLXBhc3MgSUlSIGZpbHRlciBzdGF0ZQorICAgIHVpbnQ4X3QgICAgIG5leHRfZ3JvdXBpbmc7ICAgICAgICAgICAvLy88IHN0b3JlZCBncm91cGluZyBzY2hlbWUgZm9yIHRoZSBuZXh0IGZyYW1lIChpbiBjYXNlIG9mIDggc2hvcnQgd2luZG93IHNlcXVlbmNlKQorICAgIGVudW0gV2luZG93U2VxdWVuY2UgbmV4dF93aW5kb3dfc2VxOyAvLy88IHdpbmRvdyBzZXF1ZW5jZSB0byBiZSB1c2VkIGluIHRoZSBuZXh0IGZyYW1lCisgICAgLyogTEFNRSBwc3kgbW9kZWwgc3BlY2lmaWMgbWVtYmVycyAqLworICAgIGZsb2F0IGF0dGFja190aHJlc2hvbGQ7ICAgICAgICAgICAgICAvLy88IGF0dGFjayB0aHJlc2hvbGQgZm9yIHRoaXMgY2hhbm5lbAorICAgIGZsb2F0IHByZXZfZW5lcmd5X3N1YnNob3J0W0FBQ19OVU1fQkxPQ0tTX1NIT1JUICogUFNZX0xBTUVfTlVNX1NVQkJMT0NLU107CisgICAgaW50ICAgcHJldl9hdHRhY2s7ICAgICAgICAgICAgICAgICAgIC8vLzwgYXR0YWNrIHZhbHVlIGZvciB0aGUgbGFzdCBzaG9ydCBibG9jayBpbiB0aGUgcHJldmlvdXMgc2VxdWVuY2UKK31BYWNQc3lDaGFubmVsOworCisvKioKKyAqIHBzeWNob2Fjb3VzdGljIG1vZGVsIGZyYW1lIHR5cGUtZGVwZW5kZW50IGNvZWZmaWNpZW50cworICovCit0eXBlZGVmIHN0cnVjdCBBYWNQc3lDb2VmZnN7CisgICAgZmxvYXQgYXRoOyAgICAgICAgICAgLy8vPCBhYnNvbHV0ZSB0aHJlc2hvbGQgb2YgaGVhcmluZyBwZXIgYmFuZHMKKyAgICBmbG9hdCBiYXJrczsgICAgICAgICAvLy88IEJhcmsgdmFsdWUgZm9yIGVhY2ggc3BlY3RyYWwgYmFuZCBpbiBsb25nIGZyYW1lCisgICAgZmxvYXQgc3ByZWFkX2xvd1syXTsgLy8vPCBzcHJlYWRpbmcgZmFjdG9yIGZvciBsb3ctdG8taGlnaCB0aHJlc2hvbGQgc3ByZWFkaW5nIGluIGxvbmcgZnJhbWUKKyAgICBmbG9hdCBzcHJlYWRfaGkgWzJdOyAvLy88IHNwcmVhZGluZyBmYWN0b3IgZm9yIGhpZ2gtdG8tbG93IHRocmVzaG9sZCBzcHJlYWRpbmcgaW4gbG9uZyBmcmFtZQorICAgIGZsb2F0IG1pbl9zbnI7ICAgICAgIC8vLzwgbWluaW1hbCBTTlIKK31BYWNQc3lDb2VmZnM7CisKKy8qKgorICogM0dQUCBUUzI2LjQwMy1pbnNwaXJlZCBwc3ljaG9hY291c3RpYyBtb2RlbCBzcGVjaWZpYyBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0IEFhY1BzeUNvbnRleHR7CisgICAgaW50IGNoYW5fYml0cmF0ZTsgICAgIC8vLzwgYml0cmF0ZSBwZXIgY2hhbm5lbAorICAgIGludCBmcmFtZV9iaXRzOyAgICAgICAvLy88IGF2ZXJhZ2UgYml0cyBwZXIgZnJhbWUKKyAgICBpbnQgZmlsbF9sZXZlbDsgICAgICAgLy8vPCBiaXQgcmVzZXJ2b2lyIGZpbGwgbGV2ZWwKKyAgICBzdHJ1Y3QgeworICAgICAgICBmbG9hdCBtaW47ICAgICAgICAvLy88IG1pbmltdW0gYWxsb3dlZCBQRSBmb3IgYml0IGZhY3RvciBjYWxjdWxhdGlvbgorICAgICAgICBmbG9hdCBtYXg7ICAgICAgICAvLy88IG1heGltdW0gYWxsb3dlZCBQRSBmb3IgYml0IGZhY3RvciBjYWxjdWxhdGlvbgorICAgICAgICBmbG9hdCBwcmV2aW91czsgICAvLy88IGFsbG93ZWQgUEUgb2YgdGhlIHByZXZpb3VzIGZyYW1lCisgICAgICAgIGZsb2F0IGNvcnJlY3Rpb247IC8vLzwgUEUgY29ycmVjdGlvbiBmYWN0b3IKKyAgICB9IHBlOworICAgIEFhY1BzeUNvZWZmcyBwc3lfY29lZlsyXVs2NF07CisgICAgQWFjUHN5Q2hhbm5lbCAqY2g7Cit9QWFjUHN5Q29udGV4dDsKKworLyoqCisgKiBMQU1FIHBzeSBtb2RlbCBwcmVzZXQgc3RydWN0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICBxdWFsaXR5OyAgLy8vPCBRdWFsaXR5IHRvIG1hcCB0aGUgcmVzdCBvZiB0aGUgdmF1bGVzIHRvLgorICAgICAvKiBUaGlzIGlzIG92ZXJsb2FkZWQgdG8gYmUgYm90aCBrYnBzIHBlciBjaGFubmVsIGluIEFCUiBtb2RlLCBhbmQKKyAgICAgICogcmVxdWVzdGVkIHF1YWxpdHkgaW4gY29uc3RhbnQgcXVhbGl0eSBtb2RlLgorICAgICAgKi8KKyAgICBmbG9hdCBzdF9scm07ICAgLy8vPCBzaG9ydCB0aHJlc2hvbGQgZm9yIEwsIFIsIGFuZCBNIGNoYW5uZWxzCit9IFBzeUxhbWVQcmVzZXQ7CisKKy8qKgorICogTEFNRSBwc3kgbW9kZWwgcHJlc2V0IHRhYmxlIGZvciBBQlIKKyAqLworc3RhdGljIGNvbnN0IFBzeUxhbWVQcmVzZXQgcHN5X2Ficl9tYXBbXSA9IHsKKy8qIFRPRE86IFR1bmluZy4gVGhlc2Ugd2VyZSB0YWtlbiBmcm9tIExBTUUuICovCisvKiBrYnBzL2NoIHN0X2xybSAgICovCisgICAgeyAgOCwgIDYuNjB9LAorICAgIHsgMTYsICA2LjYwfSwKKyAgICB7IDI0LCAgNi42MH0sCisgICAgeyAzMiwgIDYuNjB9LAorICAgIHsgNDAsICA2LjYwfSwKKyAgICB7IDQ4LCAgNi42MH0sCisgICAgeyA1NiwgIDYuNjB9LAorICAgIHsgNjQsICA2LjQwfSwKKyAgICB7IDgwLCAgNi4wMH0sCisgICAgeyA5NiwgIDUuNjB9LAorICAgIHsxMTIsICA1LjIwfSwKKyAgICB7MTI4LCAgNS4yMH0sCisgICAgezE2MCwgIDUuMjB9Cit9OworCisvKioKKyogTEFNRSBwc3kgbW9kZWwgcHJlc2V0IHRhYmxlIGZvciBjb25zdGFudCBxdWFsaXR5CisqLworc3RhdGljIGNvbnN0IFBzeUxhbWVQcmVzZXQgcHN5X3Zicl9tYXBbXSA9IHsKKy8qIHZicl9xICBzdF9scm0gICAgKi8KKyAgICB7IDAsICA0LjIwfSwKKyAgICB7IDEsICA0LjIwfSwKKyAgICB7IDIsICA0LjIwfSwKKyAgICB7IDMsICA0LjIwfSwKKyAgICB7IDQsICA0LjIwfSwKKyAgICB7IDUsICA0LjIwfSwKKyAgICB7IDYsICA0LjIwfSwKKyAgICB7IDcsICA0LjIwfSwKKyAgICB7IDgsICA0LjIwfSwKKyAgICB7IDksICA0LjIwfSwKKyAgICB7MTAsICA0LjIwfQorfTsKKworLyoqCisgKiBMQU1FIHBzeSBtb2RlbCBGSVIgY29lZmZpY2llbnQgdGFibGUKKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IHBzeV9maXJfY29lZmZzW10gPSB7CisgICAgLTguNjUxNjNlLTE4ICogMiwgLTAuMDA4NTE1ODYgKiAyLCAtNi43NDc2NGUtMTggKiAyLCAwLjAyMDkwMzYgKiAyLAorICAgIC0zLjM2NjM5ZS0xNyAqIDIsIC0wLjA0MzgxNjIgKiAyLCAgLTEuNTQxNzVlLTE3ICogMiwgMC4wOTMxNzM4ICogMiwKKyAgICAtNS41MjIxMmUtMTcgKiAyLCAtMC4zMTM4MTkgKiAyCit9OworCisjaWYgQVJDSF9NSVBTCisjICAgaW5jbHVkZSAibWlwcy9hYWNwc3lfbWlwcy5oIgorI2VuZGlmIC8qIEFSQ0hfTUlQUyAqLworCisvKioKKyAqIENhbGN1bGF0ZSB0aGUgQUJSIGF0dGFjayB0aHJlc2hvbGQgZnJvbSB0aGUgYWJvdmUgTEFNRSBwc3ltb2RlbCB0YWJsZS4KKyAqLworc3RhdGljIGZsb2F0IGxhbWVfY2FsY19hdHRhY2tfdGhyZXNob2xkKGludCBiaXRyYXRlKQoreworICAgIC8qIEFzc3VtZSBtYXggYml0cmF0ZSB0byBzdGFydCB3aXRoICovCisgICAgaW50IGxvd2VyX3JhbmdlID0gMTIsIHVwcGVyX3JhbmdlID0gMTI7CisgICAgaW50IGxvd2VyX3JhbmdlX2ticHMgPSBwc3lfYWJyX21hcFsxMl0ucXVhbGl0eTsKKyAgICBpbnQgdXBwZXJfcmFuZ2Vfa2JwcyA9IHBzeV9hYnJfbWFwWzEyXS5xdWFsaXR5OworICAgIGludCBpOworCisgICAgLyogRGV0ZXJtaW5lIHdoaWNoIGJpdHJhdGVzIHRoZSB2YWx1ZSBzcGVjaWZpZWQgZmFsbHMgYmV0d2Vlbi4KKyAgICAgKiBJZiB0aGUgbG9vcCBlbmRzIHdpdGhvdXQgYnJlYWtpbmcgb3VyIGFib3ZlIGFzc3VtcHRpb24gb2YgMzIwa2JwcyB3YXMgY29ycmVjdC4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgMTM7IGkrKykgeworICAgICAgICBpZiAoRkZNQVgoYml0cmF0ZSwgcHN5X2Ficl9tYXBbaV0ucXVhbGl0eSkgIT0gYml0cmF0ZSkgeworICAgICAgICAgICAgdXBwZXJfcmFuZ2UgPSBpOworICAgICAgICAgICAgdXBwZXJfcmFuZ2Vfa2JwcyA9IHBzeV9hYnJfbWFwW2kgICAgXS5xdWFsaXR5OworICAgICAgICAgICAgbG93ZXJfcmFuZ2UgPSBpIC0gMTsKKyAgICAgICAgICAgIGxvd2VyX3JhbmdlX2ticHMgPSBwc3lfYWJyX21hcFtpIC0gMV0ucXVhbGl0eTsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBVcHBlciByYW5nZSBmb3VuZCAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyogRGV0ZXJtaW5lIHdoaWNoIHJhbmdlIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgY2xvc2VyIHRvICovCisgICAgaWYgKCh1cHBlcl9yYW5nZV9rYnBzIC0gYml0cmF0ZSkgPiAoYml0cmF0ZSAtIGxvd2VyX3JhbmdlX2ticHMpKQorICAgICAgICByZXR1cm4gcHN5X2Ficl9tYXBbbG93ZXJfcmFuZ2VdLnN0X2xybTsKKyAgICByZXR1cm4gcHN5X2Ficl9tYXBbdXBwZXJfcmFuZ2VdLnN0X2xybTsKK30KKworLyoqCisgKiBMQU1FIHBzeSBtb2RlbCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICovCitzdGF0aWMgYXZfY29sZCB2b2lkIGxhbWVfd2luZG93X2luaXQoQWFjUHN5Q29udGV4dCAqY3R4LCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgQWFjUHN5Q2hhbm5lbCAqcGNoID0gJmN0eC0+Y2hbaV07CisKKyAgICAgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUVNDQUxFKQorICAgICAgICAgICAgcGNoLT5hdHRhY2tfdGhyZXNob2xkID0gcHN5X3Zicl9tYXBbYXZjdHgtPmdsb2JhbF9xdWFsaXR5IC8gRkZfUVAyTEFNQkRBXS5zdF9scm07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBjaC0+YXR0YWNrX3RocmVzaG9sZCA9IGxhbWVfY2FsY19hdHRhY2tfdGhyZXNob2xkKGF2Y3R4LT5iaXRfcmF0ZSAvIGF2Y3R4LT5jaGFubmVscyAvIDEwMDApOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBBQUNfTlVNX0JMT0NLU19TSE9SVCAqIFBTWV9MQU1FX05VTV9TVUJCTE9DS1M7IGorKykKKyAgICAgICAgICAgIHBjaC0+cHJldl9lbmVyZ3lfc3Vic2hvcnRbal0gPSAxMC4wZjsKKyAgICB9Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIEJhcmsgdmFsdWUgZm9yIGdpdmVuIGxpbmUuCisgKi8KK3N0YXRpYyBhdl9jb2xkIGZsb2F0IGNhbGNfYmFyayhmbG9hdCBmKQoreworICAgIHJldHVybiAxMy4zZiAqIGF0YW5mKDAuMDAwNzZmICogZikgKyAzLjVmICogYXRhbmYoKGYgLyA3NTAwLjBmKSAqIChmIC8gNzUwMC4wZikpOworfQorCisjZGVmaW5lIEFUSF9BREQgNAorLyoqCisgKiBDYWxjdWxhdGUgQVRIIHZhbHVlIGZvciBnaXZlbiBmcmVxdWVuY3kuCisgKiBCb3Jyb3dlZCBmcm9tIExhbWUuCisgKi8KK3N0YXRpYyBhdl9jb2xkIGZsb2F0IGF0aChmbG9hdCBmLCBmbG9hdCBhZGQpCit7CisgICAgZiAvPSAxMDAwLjBmOworICAgIHJldHVybiAgICAzLjY0ICogcG93KGYsIC0wLjgpCisgICAgICAgICAgICAtIDYuOCAgKiBleHAoLTAuNiAgKiAoZiAtIDMuNCkgKiAoZiAtIDMuNCkpCisgICAgICAgICAgICArIDYuMCAgKiBleHAoLTAuMTUgKiAoZiAtIDguNykgKiAoZiAtIDguNykpCisgICAgICAgICAgICArICgwLjYgKyAwLjA0ICogYWRkKSAqIDAuMDAxICogZiAqIGYgKiBmICogZjsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHBzeV8zZ3BwX2luaXQoRkZQc3lDb250ZXh0ICpjdHgpIHsKKyAgICBBYWNQc3lDb250ZXh0ICpwY3R4OworICAgIGZsb2F0IGJhcms7CisgICAgaW50IGksIGosIGcsIHN0YXJ0OworICAgIGZsb2F0IHByZXYsIG1pbnNjYWxlLCBtaW5hdGgsIG1pbnNuciwgcGVfbWluOworICAgIGNvbnN0IGludCBjaGFuX2JpdHJhdGUgPSBjdHgtPmF2Y3R4LT5iaXRfcmF0ZSAvIGN0eC0+YXZjdHgtPmNoYW5uZWxzOworICAgIGNvbnN0IGludCBiYW5kd2lkdGggICAgPSBjdHgtPmF2Y3R4LT5jdXRvZmYgPyBjdHgtPmF2Y3R4LT5jdXRvZmYgOiBBQUNfQ1VUT0ZGKGN0eC0+YXZjdHgpOworICAgIGNvbnN0IGZsb2F0IG51bV9iYXJrICAgPSBjYWxjX2JhcmsoKGZsb2F0KWJhbmR3aWR0aCk7CisKKyAgICBjdHgtPm1vZGVsX3ByaXZfZGF0YSA9IGF2X21hbGxvY3ooc2l6ZW9mKEFhY1BzeUNvbnRleHQpKTsKKyAgICBwY3R4ID0gKEFhY1BzeUNvbnRleHQqKSBjdHgtPm1vZGVsX3ByaXZfZGF0YTsKKworICAgIHBjdHgtPmNoYW5fYml0cmF0ZSA9IGNoYW5fYml0cmF0ZTsKKyAgICBwY3R4LT5mcmFtZV9iaXRzICAgPSBjaGFuX2JpdHJhdGUgKiBBQUNfQkxPQ0tfU0laRV9MT05HIC8gY3R4LT5hdmN0eC0+c2FtcGxlX3JhdGU7CisgICAgcGN0eC0+cGUubWluICAgICAgID0gIDguMGYgKiBBQUNfQkxPQ0tfU0laRV9MT05HICogYmFuZHdpZHRoIC8gKGN0eC0+YXZjdHgtPnNhbXBsZV9yYXRlICogMi4wZik7CisgICAgcGN0eC0+cGUubWF4ICAgICAgID0gMTIuMGYgKiBBQUNfQkxPQ0tfU0laRV9MT05HICogYmFuZHdpZHRoIC8gKGN0eC0+YXZjdHgtPnNhbXBsZV9yYXRlICogMi4wZik7CisgICAgY3R4LT5iaXRyZXMuc2l6ZSAgID0gNjE0NCAtIHBjdHgtPmZyYW1lX2JpdHM7CisgICAgY3R4LT5iaXRyZXMuc2l6ZSAgLT0gY3R4LT5iaXRyZXMuc2l6ZSAlIDg7CisgICAgcGN0eC0+ZmlsbF9sZXZlbCAgID0gY3R4LT5iaXRyZXMuc2l6ZTsKKyAgICBtaW5hdGggPSBhdGgoMzQxMCwgQVRIX0FERCk7CisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICBBYWNQc3lDb2VmZnMgKmNvZWZmcyA9IHBjdHgtPnBzeV9jb2VmW2pdOworICAgICAgICBjb25zdCB1aW50OF90ICpiYW5kX3NpemVzID0gY3R4LT5iYW5kc1tqXTsKKyAgICAgICAgZmxvYXQgbGluZV90b19mcmVxdWVuY3kgPSBjdHgtPmF2Y3R4LT5zYW1wbGVfcmF0ZSAvIChqID8gMjU2LmYgOiAyMDQ4LjBmKTsKKyAgICAgICAgZmxvYXQgYXZnX2NoYW5fYml0cyA9IGNoYW5fYml0cmF0ZSAqIChqID8gMTI4LjBmIDogMTAyNC4wZikgLyBjdHgtPmF2Y3R4LT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgLyogcmVmZXJlbmNlIGVuY29kZXIgdXNlcyAyLjQlIGhlcmUgaW5zdGVhZCBvZiA2MCUgbGlrZSB0aGUgc3BlYyBzYXlzICovCisgICAgICAgIGZsb2F0IGJhcmtfcGUgPSAwLjAyNGYgKiBQU1lfM0dQUF9CSVRTX1RPX1BFKGF2Z19jaGFuX2JpdHMpIC8gbnVtX2Jhcms7CisgICAgICAgIGZsb2F0IGVuX3NwcmVhZF9sb3cgPSBqID8gUFNZXzNHUFBfRU5fU1BSRUFEX0xPV19TIDogUFNZXzNHUFBfRU5fU1BSRUFEX0xPV19MOworICAgICAgICAvKiBIaWdoIGVuZXJneSBzcHJlYWRpbmcgZm9yIGxvbmcgYmxvY2tzIDw9IDIya2Jwcy9jaGFubmVsIGFuZCBzaG9ydCBibG9ja3MgYXJlIHRoZSBzYW1lLiAqLworICAgICAgICBmbG9hdCBlbl9zcHJlYWRfaGkgID0gKGogfHwgKGNoYW5fYml0cmF0ZSA8PSAyMi4wZikpID8gUFNZXzNHUFBfRU5fU1BSRUFEX0hJX1MgOiBQU1lfM0dQUF9FTl9TUFJFQURfSElfTDE7CisKKyAgICAgICAgaSA9IDA7CisgICAgICAgIHByZXYgPSAwLjA7CisgICAgICAgIGZvciAoZyA9IDA7IGcgPCBjdHgtPm51bV9iYW5kc1tqXTsgZysrKSB7CisgICAgICAgICAgICBpICs9IGJhbmRfc2l6ZXNbZ107CisgICAgICAgICAgICBiYXJrID0gY2FsY19iYXJrKChpLTEpICogbGluZV90b19mcmVxdWVuY3kpOworICAgICAgICAgICAgY29lZmZzW2ddLmJhcmtzID0gKGJhcmsgKyBwcmV2KSAvIDIuMDsKKyAgICAgICAgICAgIHByZXYgPSBiYXJrOworICAgICAgICB9CisgICAgICAgIGZvciAoZyA9IDA7IGcgPCBjdHgtPm51bV9iYW5kc1tqXSAtIDE7IGcrKykgeworICAgICAgICAgICAgQWFjUHN5Q29lZmZzICpjb2VmZiA9ICZjb2VmZnNbZ107CisgICAgICAgICAgICBmbG9hdCBiYXJrX3dpZHRoID0gY29lZmZzW2crMV0uYmFya3MgLSBjb2VmZnMtPmJhcmtzOworICAgICAgICAgICAgY29lZmYtPnNwcmVhZF9sb3dbMF0gPSBwb3coMTAuMCwgLWJhcmtfd2lkdGggKiBQU1lfM0dQUF9USFJfU1BSRUFEX0xPVyk7CisgICAgICAgICAgICBjb2VmZi0+c3ByZWFkX2hpIFswXSA9IHBvdygxMC4wLCAtYmFya193aWR0aCAqIFBTWV8zR1BQX1RIUl9TUFJFQURfSEkpOworICAgICAgICAgICAgY29lZmYtPnNwcmVhZF9sb3dbMV0gPSBwb3coMTAuMCwgLWJhcmtfd2lkdGggKiBlbl9zcHJlYWRfbG93KTsKKyAgICAgICAgICAgIGNvZWZmLT5zcHJlYWRfaGkgWzFdID0gcG93KDEwLjAsIC1iYXJrX3dpZHRoICogZW5fc3ByZWFkX2hpKTsKKyAgICAgICAgICAgIHBlX21pbiA9IGJhcmtfcGUgKiBiYXJrX3dpZHRoOworICAgICAgICAgICAgbWluc25yID0gZXhwMihwZV9taW4gLyBiYW5kX3NpemVzW2ddKSAtIDEuNWY7CisgICAgICAgICAgICBjb2VmZi0+bWluX3NuciA9IGF2X2NsaXBmKDEuMGYgLyBtaW5zbnIsIFBTWV9TTlJfMjVEQiwgUFNZX1NOUl8xREIpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgZm9yIChnID0gMDsgZyA8IGN0eC0+bnVtX2JhbmRzW2pdOyBnKyspIHsKKyAgICAgICAgICAgIG1pbnNjYWxlID0gYXRoKHN0YXJ0ICogbGluZV90b19mcmVxdWVuY3ksIEFUSF9BREQpOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGJhbmRfc2l6ZXNbZ107IGkrKykKKyAgICAgICAgICAgICAgICBtaW5zY2FsZSA9IEZGTUlOKG1pbnNjYWxlLCBhdGgoKHN0YXJ0ICsgaSkgKiBsaW5lX3RvX2ZyZXF1ZW5jeSwgQVRIX0FERCkpOworICAgICAgICAgICAgY29lZmZzW2ddLmF0aCA9IG1pbnNjYWxlIC0gbWluYXRoOworICAgICAgICAgICAgc3RhcnQgKz0gYmFuZF9zaXplc1tnXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBjdHgtPmNoID0gYXZfbWFsbG9jel9hcnJheShjdHgtPmF2Y3R4LT5jaGFubmVscywgc2l6ZW9mKEFhY1BzeUNoYW5uZWwpKTsKKworICAgIGxhbWVfd2luZG93X2luaXQocGN0eCwgY3R4LT5hdmN0eCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBJSVIgZmlsdGVyIHVzZWQgaW4gYmxvY2sgc3dpdGNoaW5nIGRlY2lzaW9uCisgKi8KK3N0YXRpYyBmbG9hdCBpaXJfZmlsdGVyKGludCBpbiwgZmxvYXQgc3RhdGVbMl0pCit7CisgICAgZmxvYXQgcmV0OworCisgICAgcmV0ID0gMC43NTQ4ZiAqIChpbiAtIHN0YXRlWzBdKSArIDAuNTA5NWYgKiBzdGF0ZVsxXTsKKyAgICBzdGF0ZVswXSA9IGluOworICAgIHN0YXRlWzFdID0gcmV0OworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2luZG93IGdyb3VwaW5nIGluZm9ybWF0aW9uIHN0b3JlZCBhcyBiaXRzICgwIC0gbmV3IGdyb3VwLCAxIC0gZ3JvdXAgY29udGludWVzKQorICovCitzdGF0aWMgY29uc3QgdWludDhfdCB3aW5kb3dfZ3JvdXBpbmdbOV0gPSB7CisgICAgMHhCNiwgMHg2QywgMHhEOCwgMHhCMiwgMHg2NiwgMHhDNiwgMHg5NiwgMHgzNiwgMHgzNgorfTsKKworLyoqCisgKiBUZWxsIGVuY29kZXIgd2hpY2ggd2luZG93IHR5cGVzIHRvIHVzZS4KKyAqIEBzZWUgM0dQUCBUUzI2LjQwMyA1LjQuMSAiQmxvY2tzd2l0Y2hpbmciCisgKi8KK3N0YXRpYyBhdl91bnVzZWQgRkZQc3lXaW5kb3dJbmZvIHBzeV8zZ3BwX3dpbmRvdyhGRlBzeUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpsYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbCwgaW50IHByZXZfdHlwZSkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgYnIgICAgICAgICAgICAgICA9IGN0eC0+YXZjdHgtPmJpdF9yYXRlIC8gY3R4LT5hdmN0eC0+Y2hhbm5lbHM7CisgICAgaW50IGF0dGFja19yYXRpbyAgICAgPSBiciA8PSAxNjAwMCA/IDE4IDogMTA7CisgICAgQWFjUHN5Q29udGV4dCAqcGN0eCA9IChBYWNQc3lDb250ZXh0KikgY3R4LT5tb2RlbF9wcml2X2RhdGE7CisgICAgQWFjUHN5Q2hhbm5lbCAqcGNoICA9ICZwY3R4LT5jaFtjaGFubmVsXTsKKyAgICB1aW50OF90IGdyb3VwaW5nICAgICA9IDA7CisgICAgaW50IG5leHRfdHlwZSAgICAgICAgPSBwY2gtPm5leHRfd2luZG93X3NlcTsKKyAgICBGRlBzeVdpbmRvd0luZm8gd2kgID0geyB7IDAgfSB9OworCisgICAgaWYgKGxhKSB7CisgICAgICAgIGZsb2F0IHNbOF0sIHY7CisgICAgICAgIGludCBzd2l0Y2hfdG9fZWlnaHQgPSAwOworICAgICAgICBmbG9hdCBzdW0gPSAwLjAsIHN1bTIgPSAwLjA7CisgICAgICAgIGludCBhdHRhY2tfbiA9IDA7CisgICAgICAgIGludCBzdGF5X3Nob3J0ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDEyODsgaisrKSB7CisgICAgICAgICAgICAgICAgdiA9IGlpcl9maWx0ZXIobGFbaSoxMjgral0sIHBjaC0+aWlyX3N0YXRlKTsKKyAgICAgICAgICAgICAgICBzdW0gKz0gdip2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc1tpXSAgPSBzdW07CisgICAgICAgICAgICBzdW0yICs9IHN1bTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc1tpXSA+IHBjaC0+d2luX2VuZXJneSAqIGF0dGFja19yYXRpbykgeworICAgICAgICAgICAgICAgIGF0dGFja19uICAgICAgICA9IGkgKyAxOworICAgICAgICAgICAgICAgIHN3aXRjaF90b19laWdodCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcGNoLT53aW5fZW5lcmd5ID0gcGNoLT53aW5fZW5lcmd5KjcvOCArIHN1bTIvNjQ7CisKKyAgICAgICAgd2kud2luZG93X3R5cGVbMV0gPSBwcmV2X3R5cGU7CisgICAgICAgIHN3aXRjaCAocHJldl90eXBlKSB7CisgICAgICAgIGNhc2UgT05MWV9MT05HX1NFUVVFTkNFOgorICAgICAgICAgICAgd2kud2luZG93X3R5cGVbMF0gPSBzd2l0Y2hfdG9fZWlnaHQgPyBMT05HX1NUQVJUX1NFUVVFTkNFIDogT05MWV9MT05HX1NFUVVFTkNFOworICAgICAgICAgICAgbmV4dF90eXBlID0gc3dpdGNoX3RvX2VpZ2h0ID8gRUlHSFRfU0hPUlRfU0VRVUVOQ0UgOiBPTkxZX0xPTkdfU0VRVUVOQ0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMT05HX1NUQVJUX1NFUVVFTkNFOgorICAgICAgICAgICAgd2kud2luZG93X3R5cGVbMF0gPSBFSUdIVF9TSE9SVF9TRVFVRU5DRTsKKyAgICAgICAgICAgIGdyb3VwaW5nID0gcGNoLT5uZXh0X2dyb3VwaW5nOworICAgICAgICAgICAgbmV4dF90eXBlID0gc3dpdGNoX3RvX2VpZ2h0ID8gRUlHSFRfU0hPUlRfU0VRVUVOQ0UgOiBMT05HX1NUT1BfU0VRVUVOQ0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMT05HX1NUT1BfU0VRVUVOQ0U6CisgICAgICAgICAgICB3aS53aW5kb3dfdHlwZVswXSA9IHN3aXRjaF90b19laWdodCA/IExPTkdfU1RBUlRfU0VRVUVOQ0UgOiBPTkxZX0xPTkdfU0VRVUVOQ0U7CisgICAgICAgICAgICBuZXh0X3R5cGUgPSBzd2l0Y2hfdG9fZWlnaHQgPyBFSUdIVF9TSE9SVF9TRVFVRU5DRSA6IE9OTFlfTE9OR19TRVFVRU5DRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVJR0hUX1NIT1JUX1NFUVVFTkNFOgorICAgICAgICAgICAgc3RheV9zaG9ydCA9IG5leHRfdHlwZSA9PSBFSUdIVF9TSE9SVF9TRVFVRU5DRSB8fCBzd2l0Y2hfdG9fZWlnaHQ7CisgICAgICAgICAgICB3aS53aW5kb3dfdHlwZVswXSA9IHN0YXlfc2hvcnQgPyBFSUdIVF9TSE9SVF9TRVFVRU5DRSA6IExPTkdfU1RPUF9TRVFVRU5DRTsKKyAgICAgICAgICAgIGdyb3VwaW5nID0gbmV4dF90eXBlID09IEVJR0hUX1NIT1JUX1NFUVVFTkNFID8gcGNoLT5uZXh0X2dyb3VwaW5nIDogMDsKKyAgICAgICAgICAgIG5leHRfdHlwZSA9IHN3aXRjaF90b19laWdodCA/IEVJR0hUX1NIT1JUX1NFUVVFTkNFIDogTE9OR19TVE9QX1NFUVVFTkNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwY2gtPm5leHRfZ3JvdXBpbmcgPSB3aW5kb3dfZ3JvdXBpbmdbYXR0YWNrX25dOworICAgICAgICBwY2gtPm5leHRfd2luZG93X3NlcSA9IG5leHRfdHlwZTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgd2kud2luZG93X3R5cGVbaV0gPSBwcmV2X3R5cGU7CisgICAgICAgIGdyb3VwaW5nID0gKHByZXZfdHlwZSA9PSBFSUdIVF9TSE9SVF9TRVFVRU5DRSkgPyB3aW5kb3dfZ3JvdXBpbmdbMF0gOiAwOworICAgIH0KKworICAgIHdpLndpbmRvd19zaGFwZSAgID0gMTsKKyAgICBpZiAod2kud2luZG93X3R5cGVbMF0gIT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgd2kubnVtX3dpbmRvd3MgPSAxOworICAgICAgICB3aS5ncm91cGluZ1swXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGxhc3RncnAgPSAwOworICAgICAgICB3aS5udW1fd2luZG93cyA9IDg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGlmICghKChncm91cGluZyA+PiBpKSAmIDEpKQorICAgICAgICAgICAgICAgIGxhc3RncnAgPSBpOworICAgICAgICAgICAgd2kuZ3JvdXBpbmdbbGFzdGdycF0rKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB3aTsKK30KKworLyogNS42LjEuMiAiQ2FsY3VsYXRpb24gb2YgQml0IERlbWFuZCIgKi8KK3N0YXRpYyBpbnQgY2FsY19iaXRfZGVtYW5kKEFhY1BzeUNvbnRleHQgKmN0eCwgZmxvYXQgcGUsIGludCBiaXRzLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaG9ydF93aW5kb3cpCit7CisgICAgY29uc3QgZmxvYXQgYml0c2F2ZV9zbG9wZSAgPSBzaG9ydF93aW5kb3cgPyBQU1lfM0dQUF9TQVZFX1NMT1BFX1MgIDogUFNZXzNHUFBfU0FWRV9TTE9QRV9MOworICAgIGNvbnN0IGZsb2F0IGJpdHNhdmVfYWRkICAgID0gc2hvcnRfd2luZG93ID8gUFNZXzNHUFBfU0FWRV9BRERfUyAgICA6IFBTWV8zR1BQX1NBVkVfQUREX0w7CisgICAgY29uc3QgZmxvYXQgYml0c3BlbmRfc2xvcGUgPSBzaG9ydF93aW5kb3cgPyBQU1lfM0dQUF9TUEVORF9TTE9QRV9TIDogUFNZXzNHUFBfU1BFTkRfU0xPUEVfTDsKKyAgICBjb25zdCBmbG9hdCBiaXRzcGVuZF9hZGQgICA9IHNob3J0X3dpbmRvdyA/IFBTWV8zR1BQX1NQRU5EX0FERF9TICAgOiBQU1lfM0dQUF9TUEVORF9BRERfTDsKKyAgICBjb25zdCBmbG9hdCBjbGlwX2xvdyAgICAgICA9IHNob3J0X3dpbmRvdyA/IFBTWV8zR1BQX0NMSVBfTE9fUyAgICAgOiBQU1lfM0dQUF9DTElQX0xPX0w7CisgICAgY29uc3QgZmxvYXQgY2xpcF9oaWdoICAgICAgPSBzaG9ydF93aW5kb3cgPyBQU1lfM0dQUF9DTElQX0hJX1MgICAgIDogUFNZXzNHUFBfQ0xJUF9ISV9MOworICAgIGZsb2F0IGNsaXBwZWRfcGUsIGJpdF9zYXZlLCBiaXRfc3BlbmQsIGJpdF9mYWN0b3IsIGZpbGxfbGV2ZWw7CisKKyAgICBjdHgtPmZpbGxfbGV2ZWwgKz0gY3R4LT5mcmFtZV9iaXRzIC0gYml0czsKKyAgICBjdHgtPmZpbGxfbGV2ZWwgID0gYXZfY2xpcChjdHgtPmZpbGxfbGV2ZWwsIDAsIHNpemUpOworICAgIGZpbGxfbGV2ZWwgPSBhdl9jbGlwZigoZmxvYXQpY3R4LT5maWxsX2xldmVsIC8gc2l6ZSwgY2xpcF9sb3csIGNsaXBfaGlnaCk7CisgICAgY2xpcHBlZF9wZSA9IGF2X2NsaXBmKHBlLCBjdHgtPnBlLm1pbiwgY3R4LT5wZS5tYXgpOworICAgIGJpdF9zYXZlICAgPSAoZmlsbF9sZXZlbCArIGJpdHNhdmVfYWRkKSAqIGJpdHNhdmVfc2xvcGU7CisgICAgYXNzZXJ0KGJpdF9zYXZlIDw9IDAuM2YgJiYgYml0X3NhdmUgPj0gLTAuMDUwMDAwMDFmKTsKKyAgICBiaXRfc3BlbmQgID0gKGZpbGxfbGV2ZWwgKyBiaXRzcGVuZF9hZGQpICogYml0c3BlbmRfc2xvcGU7CisgICAgYXNzZXJ0KGJpdF9zcGVuZCA8PSAwLjVmICYmIGJpdF9zcGVuZCA+PSAtMC4xZik7CisgICAgLyogVGhlIGJpdCBmYWN0b3IgZ3JhcGggaW4gdGhlIHNwZWMgaXMgb2J2aW91c2x5IGluY29ycmVjdC4KKyAgICAgKiAgICAgIGJpdF9zcGVuZCArICgoYml0X3NwZW5kIC0gYml0X3NwZW5kKSkuLi4KKyAgICAgKiBUaGUgcmVmZXJlbmNlIGVuY29kZXIgc3VidHJhY3RzIGV2ZXJ5dGhpbmcgZnJvbSAxLCBidXQgYWxzbyBzZWVtcyBpbmNvcnJlY3QuCisgICAgICogICAgICAxIC0gYml0X3NhdmUgKyAoKGJpdF9zcGVuZCArIGJpdF9zYXZlKSkuLi4KKyAgICAgKiBIb3BlZnVsbHkgYmVsb3cgaXMgY29ycmVjdC4KKyAgICAgKi8KKyAgICBiaXRfZmFjdG9yID0gMS4wZiAtIGJpdF9zYXZlICsgKChiaXRfc3BlbmQgLSBiaXRfc2F2ZSkgLyAoY3R4LT5wZS5tYXggLSBjdHgtPnBlLm1pbikpICogKGNsaXBwZWRfcGUgLSBjdHgtPnBlLm1pbik7CisgICAgLyogTk9URTogVGhlIHJlZmVyZW5jZSBlbmNvZGVyIGF0dGVtcHRzIHRvIGNlbnRlciBwZSBtYXgvbWluIGFyb3VuZCB0aGUgY3VycmVudCBwZS4gKi8KKyAgICBjdHgtPnBlLm1heCA9IEZGTUFYKHBlLCBjdHgtPnBlLm1heCk7CisgICAgY3R4LT5wZS5taW4gPSBGRk1JTihwZSwgY3R4LT5wZS5taW4pOworCisgICAgcmV0dXJuIEZGTUlOKGN0eC0+ZnJhbWVfYml0cyAqIGJpdF9mYWN0b3IsIGN0eC0+ZnJhbWVfYml0cyArIHNpemUgLSBiaXRzKTsKK30KKworc3RhdGljIGZsb2F0IGNhbGNfcGVfM2dwcChBYWNQc3lCYW5kICpiYW5kKQoreworICAgIGZsb2F0IHBlLCBhOworCisgICAgYmFuZC0+cGUgICAgICAgICAgID0gMC4wZjsKKyAgICBiYW5kLT5wZV9jb25zdCAgICAgPSAwLjBmOworICAgIGJhbmQtPmFjdGl2ZV9saW5lcyA9IDAuMGY7CisgICAgaWYgKGJhbmQtPmVuZXJneSA+IGJhbmQtPnRocikgeworICAgICAgICBhICA9IGxvZzJmKGJhbmQtPmVuZXJneSk7CisgICAgICAgIHBlID0gYSAtIGxvZzJmKGJhbmQtPnRocik7CisgICAgICAgIGJhbmQtPmFjdGl2ZV9saW5lcyA9IGJhbmQtPm56X2xpbmVzOworICAgICAgICBpZiAocGUgPCBQU1lfM0dQUF9DMSkgeworICAgICAgICAgICAgcGUgPSBwZSAqIFBTWV8zR1BQX0MzICsgUFNZXzNHUFBfQzI7CisgICAgICAgICAgICBhICA9IGEgICogUFNZXzNHUFBfQzMgKyBQU1lfM0dQUF9DMjsKKyAgICAgICAgICAgIGJhbmQtPmFjdGl2ZV9saW5lcyAqPSBQU1lfM0dQUF9DMzsKKyAgICAgICAgfQorICAgICAgICBiYW5kLT5wZSAgICAgICA9IHBlICogYmFuZC0+bnpfbGluZXM7CisgICAgICAgIGJhbmQtPnBlX2NvbnN0ID0gYSAgKiBiYW5kLT5uel9saW5lczsKKyAgICB9CisKKyAgICByZXR1cm4gYmFuZC0+cGU7Cit9CisKK3N0YXRpYyBmbG9hdCBjYWxjX3JlZHVjdGlvbl8zZ3BwKGZsb2F0IGEsIGZsb2F0IGRlc2lyZWRfcGUsIGZsb2F0IHBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWN0aXZlX2xpbmVzKQoreworICAgIGZsb2F0IHRocl9hdmcsIHJlZHVjdGlvbjsKKworICAgIGlmKGFjdGl2ZV9saW5lcyA9PSAwLjApCisgICAgICAgIHJldHVybiAwOworCisgICAgdGhyX2F2ZyAgID0gZXhwMmYoKGEgLSBwZSkgLyAoNC4wZiAqIGFjdGl2ZV9saW5lcykpOworICAgIHJlZHVjdGlvbiA9IGV4cDJmKChhIC0gZGVzaXJlZF9wZSkgLyAoNC4wZiAqIGFjdGl2ZV9saW5lcykpIC0gdGhyX2F2ZzsKKworICAgIHJldHVybiBGRk1BWChyZWR1Y3Rpb24sIDAuMGYpOworfQorCitzdGF0aWMgZmxvYXQgY2FsY19yZWR1Y2VkX3Rocl8zZ3BwKEFhY1BzeUJhbmQgKmJhbmQsIGZsb2F0IG1pbl9zbnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJlZHVjdGlvbikKK3sKKyAgICBmbG9hdCB0aHIgPSBiYW5kLT50aHI7CisKKyAgICBpZiAoYmFuZC0+ZW5lcmd5ID4gdGhyKSB7CisgICAgICAgIHRociA9IHNxcnRmKHRocik7CisgICAgICAgIHRociA9IHNxcnRmKHRocikgKyByZWR1Y3Rpb247CisgICAgICAgIHRociAqPSB0aHI7CisgICAgICAgIHRociAqPSB0aHI7CisKKyAgICAgICAgLyogVGhpcyBkZXZpYXRlcyBmcm9tIHRoZSAzR1BQIHNwZWMgdG8gbWF0Y2ggdGhlIHJlZmVyZW5jZSBlbmNvZGVyLgorICAgICAgICAgKiBJdCBwZXJmb3JtcyBtaW4odGhyX3JlZHVjZWQsIG1heCh0aHIsIGVuZXJneS9taW5fc25yKSkgb25seSBmb3IgYmFuZHMKKyAgICAgICAgICogdGhhdCBoYXZlIGhvbGUgYXZvaWRhbmNlIG9uIChhY3RpdmUgb3IgaW5hY3RpdmUpLiBJdCBhbHdheXMgcmVkdWNlcyB0aGUKKyAgICAgICAgICogdGhyZXNob2xkIG9mIGJhbmRzIHdpdGggaG9sZSBhdm9pZGFuY2Ugb2ZmLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHRociA+IGJhbmQtPmVuZXJneSAqIG1pbl9zbnIgJiYgYmFuZC0+YXZvaWRfaG9sZXMgIT0gUFNZXzNHUFBfQUhfTk9ORSkgeworICAgICAgICAgICAgdGhyID0gRkZNQVgoYmFuZC0+dGhyLCBiYW5kLT5lbmVyZ3kgKiBtaW5fc25yKTsKKyAgICAgICAgICAgIGJhbmQtPmF2b2lkX2hvbGVzID0gUFNZXzNHUFBfQUhfQUNUSVZFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRocjsKK30KKworI2lmbmRlZiBjYWxjX3Rocl8zZ3BwCitzdGF0aWMgdm9pZCBjYWxjX3Rocl8zZ3BwKGNvbnN0IEZGUHN5V2luZG93SW5mbyAqd2ksIGNvbnN0IGludCBudW1fYmFuZHMsIEFhY1BzeUNoYW5uZWwgKnBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYmFuZF9zaXplcywgY29uc3QgZmxvYXQgKmNvZWZzKQoreworICAgIGludCBpLCB3LCBnOworICAgIGludCBzdGFydCA9IDA7CisgICAgZm9yICh3ID0gMDsgdyA8IHdpLT5udW1fd2luZG93cyoxNjsgdyArPSAxNikgeworICAgICAgICBmb3IgKGcgPSAwOyBnIDwgbnVtX2JhbmRzOyBnKyspIHsKKyAgICAgICAgICAgIEFhY1BzeUJhbmQgKmJhbmQgPSAmcGNoLT5iYW5kW3crZ107CisKKyAgICAgICAgICAgIGZsb2F0IGZvcm1fZmFjdG9yID0gMC4wZjsKKyAgICAgICAgICAgIGZsb2F0IFRlbXA7CisgICAgICAgICAgICBiYW5kLT5lbmVyZ3kgPSAwLjBmOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJhbmRfc2l6ZXNbZ107IGkrKykgeworICAgICAgICAgICAgICAgIGJhbmQtPmVuZXJneSArPSBjb2Vmc1tzdGFydCtpXSAqIGNvZWZzW3N0YXJ0K2ldOworICAgICAgICAgICAgICAgIGZvcm1fZmFjdG9yICArPSBzcXJ0ZihmYWJzKGNvZWZzW3N0YXJ0K2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUZW1wID0gYmFuZC0+ZW5lcmd5ID4gMCA/IHNxcnRmKChmbG9hdCliYW5kX3NpemVzW2ddIC8gYmFuZC0+ZW5lcmd5KSA6IDA7CisgICAgICAgICAgICBiYW5kLT50aHIgICAgICA9IGJhbmQtPmVuZXJneSAqIDAuMDAxMjU4OTI1ZjsKKyAgICAgICAgICAgIGJhbmQtPm56X2xpbmVzID0gZm9ybV9mYWN0b3IgKiBzcXJ0ZihUZW1wKTsKKworICAgICAgICAgICAgc3RhcnQgKz0gYmFuZF9zaXplc1tnXTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvKiBjYWxjX3Rocl8zZ3BwICovCisKKyNpZm5kZWYgcHN5X2hwX2ZpbHRlcgorc3RhdGljIHZvaWQgcHN5X2hwX2ZpbHRlcihjb25zdCBmbG9hdCAqZmlyYnVmLCBmbG9hdCAqaHBmc21wbCwgY29uc3QgZmxvYXQgKnBzeV9maXJfY29lZmZzKQoreworICAgIGludCBpLCBqOworICAgIGZvciAoaSA9IDA7IGkgPCBBQUNfQkxPQ0tfU0laRV9MT05HOyBpKyspIHsKKyAgICAgICAgZmxvYXQgc3VtMSwgc3VtMjsKKyAgICAgICAgc3VtMSA9IGZpcmJ1ZltpICsgKFBTWV9MQU1FX0ZJUl9MRU4gLSAxKSAvIDJdOworICAgICAgICBzdW0yID0gMC4wOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgKChQU1lfTEFNRV9GSVJfTEVOIC0gMSkgLyAyKSAtIDE7IGogKz0gMikgeworICAgICAgICAgICAgc3VtMSArPSBwc3lfZmlyX2NvZWZmc1tqXSAqIChmaXJidWZbaSArIGpdICsgZmlyYnVmW2kgKyBQU1lfTEFNRV9GSVJfTEVOIC0gal0pOworICAgICAgICAgICAgc3VtMiArPSBwc3lfZmlyX2NvZWZmc1tqICsgMV0gKiAoZmlyYnVmW2kgKyBqICsgMV0gKyBmaXJidWZbaSArIFBTWV9MQU1FX0ZJUl9MRU4gLSBqIC0gMV0pOworICAgICAgICB9CisgICAgICAgIC8qIE5PVEU6IFRoZSBMQU1FIHBzeW1vZGVsIGV4cGVjdHMgaXQncyBpbnB1dCBpbiB0aGUgcmFuZ2UgLTMyNzY4IHRvIDMyNzY4LgorICAgICAgICAgKiAgICAgICBUdW5pbmcgdGhpcyBmb3Igbm9ybWFsaXplZCBmbG9hdHMgd291bGQgYmUgZGlmZmljdWx0LiAqLworICAgICAgICBocGZzbXBsW2ldID0gKHN1bTEgKyBzdW0yKSAqIDMyNzY4LjBmOworICAgIH0KK30KKyNlbmRpZiAvKiBwc3lfaHBfZmlsdGVyICovCisKKy8qKgorICogQ2FsY3VsYXRlIGJhbmQgdGhyZXNob2xkcyBhcyBzdWdnZXN0ZWQgaW4gM0dQUCBUUzI2LjQwMworICovCitzdGF0aWMgdm9pZCBwc3lfM2dwcF9hbmFseXplX2NoYW5uZWwoRkZQc3lDb250ZXh0ICpjdHgsIGludCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpjb2VmcywgY29uc3QgRkZQc3lXaW5kb3dJbmZvICp3aSkKK3sKKyAgICBBYWNQc3lDb250ZXh0ICpwY3R4ID0gKEFhY1BzeUNvbnRleHQqKSBjdHgtPm1vZGVsX3ByaXZfZGF0YTsKKyAgICBBYWNQc3lDaGFubmVsICpwY2ggID0gJnBjdHgtPmNoW2NoYW5uZWxdOworICAgIGludCBpLCB3LCBnOworICAgIGZsb2F0IGRlc2lyZWRfYml0cywgZGVzaXJlZF9wZSwgZGVsdGFfcGUsIHJlZHVjdGlvbj0gTkFOLCBzcHJlYWRfZW5bMTI4XSA9IHswfTsKKyAgICBmbG9hdCBhID0gMC4wZiwgYWN0aXZlX2xpbmVzID0gMC4wZiwgbm9ybV9mYWMgPSAwLjBmOworICAgIGZsb2F0IHBlID0gcGN0eC0+Y2hhbl9iaXRyYXRlID4gMzIwMDAgPyAwLjBmIDogRkZNQVgoNTAuMGYsIDEwMC4wZiAtIHBjdHgtPmNoYW5fYml0cmF0ZSAqIDEwMC4wZiAvIDMyMDAwLjBmKTsKKyAgICBjb25zdCBpbnQgICAgICBudW1fYmFuZHMgICA9IGN0eC0+bnVtX2JhbmRzW3dpLT5udW1fd2luZG93cyA9PSA4XTsKKyAgICBjb25zdCB1aW50OF90ICpiYW5kX3NpemVzICA9IGN0eC0+YmFuZHNbd2ktPm51bV93aW5kb3dzID09IDhdOworICAgIEFhY1BzeUNvZWZmcyAgKmNvZWZmcyAgICAgID0gcGN0eC0+cHN5X2NvZWZbd2ktPm51bV93aW5kb3dzID09IDhdOworICAgIGNvbnN0IGZsb2F0IGF2b2lkX2hvbGVfdGhyID0gd2ktPm51bV93aW5kb3dzID09IDggPyBQU1lfM0dQUF9BSF9USFJfU0hPUlQgOiBQU1lfM0dQUF9BSF9USFJfTE9ORzsKKworICAgIC8vY2FsY3VsYXRlIGVuZXJnaWVzLCBpbml0aWFsIHRocmVzaG9sZHMgYW5kIHJlbGF0ZWQgdmFsdWVzIC0gNS40LjIgIlRocmVzaG9sZCBDYWxjdWxhdGlvbiIKKyAgICBjYWxjX3Rocl8zZ3BwKHdpLCBudW1fYmFuZHMsIHBjaCwgYmFuZF9zaXplcywgY29lZnMpOworCisgICAgLy9tb2RpZnkgdGhyZXNob2xkcyBhbmQgZW5lcmdpZXMgLSBzcHJlYWQsIHRocmVzaG9sZCBpbiBxdWlldCwgcHJlLWVjaG8gY29udHJvbAorICAgIGZvciAodyA9IDA7IHcgPCB3aS0+bnVtX3dpbmRvd3MqMTY7IHcgKz0gMTYpIHsKKyAgICAgICAgQWFjUHN5QmFuZCAqYmFuZHMgPSAmcGNoLT5iYW5kW3ddOworCisgICAgICAgIC8qIDUuNC4yLjMgIlNwcmVhZGluZyIgJiA1LjQuMyAiU3ByZWFkIEVuZXJneSBDYWxjdWxhdGlvbiIgKi8KKyAgICAgICAgc3ByZWFkX2VuWzBdID0gYmFuZHNbMF0uZW5lcmd5OworICAgICAgICBmb3IgKGcgPSAxOyBnIDwgbnVtX2JhbmRzOyBnKyspIHsKKyAgICAgICAgICAgIGJhbmRzW2ddLnRociAgID0gRkZNQVgoYmFuZHNbZ10udGhyLCAgICBiYW5kc1tnLTFdLnRociAqIGNvZWZmc1tnXS5zcHJlYWRfaGlbMF0pOworICAgICAgICAgICAgc3ByZWFkX2VuW3crZ10gPSBGRk1BWChiYW5kc1tnXS5lbmVyZ3ksIHNwcmVhZF9lblt3K2ctMV0gKiBjb2VmZnNbZ10uc3ByZWFkX2hpWzFdKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGcgPSBudW1fYmFuZHMgLSAyOyBnID49IDA7IGctLSkgeworICAgICAgICAgICAgYmFuZHNbZ10udGhyICAgPSBGRk1BWChiYW5kc1tnXS50aHIsICAgYmFuZHNbZysxXS50aHIgKiBjb2VmZnNbZ10uc3ByZWFkX2xvd1swXSk7CisgICAgICAgICAgICBzcHJlYWRfZW5bdytnXSA9IEZGTUFYKHNwcmVhZF9lblt3K2ddLCBzcHJlYWRfZW5bdytnKzFdICogY29lZmZzW2ddLnNwcmVhZF9sb3dbMV0pOworICAgICAgICB9CisgICAgICAgIC8vNS40LjIuNCAiVGhyZXNob2xkIGluIHF1aWV0IgorICAgICAgICBmb3IgKGcgPSAwOyBnIDwgbnVtX2JhbmRzOyBnKyspIHsKKyAgICAgICAgICAgIEFhY1BzeUJhbmQgKmJhbmQgPSAmYmFuZHNbZ107CisKKyAgICAgICAgICAgIGJhbmQtPnRocl9xdWlldCA9IGJhbmQtPnRociA9IEZGTUFYKGJhbmQtPnRociwgY29lZmZzW2ddLmF0aCk7CisgICAgICAgICAgICAvLzUuNC4yLjUgIlByZS1lY2hvIGNvbnRyb2wiCisgICAgICAgICAgICBpZiAoISh3aS0+d2luZG93X3R5cGVbMF0gPT0gTE9OR19TVE9QX1NFUVVFTkNFIHx8ICh3aS0+d2luZG93X3R5cGVbMV0gPT0gTE9OR19TVEFSVF9TRVFVRU5DRSAmJiAhdykpKQorICAgICAgICAgICAgICAgIGJhbmQtPnRociA9IEZGTUFYKFBTWV8zR1BQX1JQRU1JTipiYW5kLT50aHIsIEZGTUlOKGJhbmQtPnRociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfM0dQUF9SUEVMRVYqcGNoLT5wcmV2X2JhbmRbdytnXS50aHJfcXVpZXQpKTsKKworICAgICAgICAgICAgLyogNS42LjEuMy4xICJQcmVwYXJhdG9yeSBzdGVwcyBvZiB0aGUgcGVyY2VwdHVhbCBlbnRyb3B5IGNhbGN1bGF0aW9uIiAqLworICAgICAgICAgICAgcGUgKz0gY2FsY19wZV8zZ3BwKGJhbmQpOworICAgICAgICAgICAgYSAgKz0gYmFuZC0+cGVfY29uc3Q7CisgICAgICAgICAgICBhY3RpdmVfbGluZXMgKz0gYmFuZC0+YWN0aXZlX2xpbmVzOworCisgICAgICAgICAgICAvKiA1LjYuMS4zLjMgIlNlbGVjdGlvbiBvZiB0aGUgYmFuZHMgZm9yIGF2b2lkYW5jZSBvZiBob2xlcyIgKi8KKyAgICAgICAgICAgIGlmIChzcHJlYWRfZW5bdytnXSAqIGF2b2lkX2hvbGVfdGhyID4gYmFuZC0+ZW5lcmd5IHx8IGNvZWZmc1tnXS5taW5fc25yID4gMS4wZikKKyAgICAgICAgICAgICAgICBiYW5kLT5hdm9pZF9ob2xlcyA9IFBTWV8zR1BQX0FIX05PTkU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmFuZC0+YXZvaWRfaG9sZXMgPSBQU1lfM0dQUF9BSF9JTkFDVElWRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIDUuNi4xLjMuMiAiQ2FsY3VsYXRpb24gb2YgdGhlIGRlc2lyZWQgcGVyY2VwdHVhbCBlbnRyb3B5IiAqLworICAgIGN0eC0+Y2hbY2hhbm5lbF0uZW50cm9weSA9IHBlOworICAgIGRlc2lyZWRfYml0cyA9IGNhbGNfYml0X2RlbWFuZChwY3R4LCBwZSwgY3R4LT5iaXRyZXMuYml0cywgY3R4LT5iaXRyZXMuc2l6ZSwgd2ktPm51bV93aW5kb3dzID09IDgpOworICAgIGRlc2lyZWRfcGUgPSBQU1lfM0dQUF9CSVRTX1RPX1BFKGRlc2lyZWRfYml0cyk7CisgICAgLyogTk9URTogUEUgY29ycmVjdGlvbiBpcyBrZXB0IHNpbXBsZS4gRHVyaW5nIGluaXRpYWwgdGVzdGluZyBpdCBoYWQgdmVyeQorICAgICAqICAgICAgIGxpdHRsZSBlZmZlY3Qgb24gdGhlIGZpbmFsIGJpdHJhdGUuIFByb2JhYmx5IGEgZ29vZCBpZGVhIHRvIGNvbWUKKyAgICAgKiAgICAgICBiYWNrIGFuZCBkbyBtb3JlIHRlc3RpbmcgbGF0ZXIuCisgICAgICovCisgICAgaWYgKGN0eC0+Yml0cmVzLmJpdHMgPiAwKQorICAgICAgICBkZXNpcmVkX3BlICo9IGF2X2NsaXBmKHBjdHgtPnBlLnByZXZpb3VzIC8gUFNZXzNHUFBfQklUU19UT19QRShjdHgtPmJpdHJlcy5iaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg1ZiwgMS4xNWYpOworICAgIHBjdHgtPnBlLnByZXZpb3VzID0gUFNZXzNHUFBfQklUU19UT19QRShkZXNpcmVkX2JpdHMpOworCisgICAgaWYgKGRlc2lyZWRfcGUgPCBwZSkgeworICAgICAgICAvKiA1LjYuMS4zLjQgIkZpcnN0IEVzdGltYXRpb24gb2YgdGhlIHJlZHVjdGlvbiB2YWx1ZSIgKi8KKyAgICAgICAgZm9yICh3ID0gMDsgdyA8IHdpLT5udW1fd2luZG93cyoxNjsgdyArPSAxNikgeworICAgICAgICAgICAgcmVkdWN0aW9uID0gY2FsY19yZWR1Y3Rpb25fM2dwcChhLCBkZXNpcmVkX3BlLCBwZSwgYWN0aXZlX2xpbmVzKTsKKyAgICAgICAgICAgIHBlID0gMC4wZjsKKyAgICAgICAgICAgIGEgID0gMC4wZjsKKyAgICAgICAgICAgIGFjdGl2ZV9saW5lcyA9IDAuMGY7CisgICAgICAgICAgICBmb3IgKGcgPSAwOyBnIDwgbnVtX2JhbmRzOyBnKyspIHsKKyAgICAgICAgICAgICAgICBBYWNQc3lCYW5kICpiYW5kID0gJnBjaC0+YmFuZFt3K2ddOworCisgICAgICAgICAgICAgICAgYmFuZC0+dGhyID0gY2FsY19yZWR1Y2VkX3Rocl8zZ3BwKGJhbmQsIGNvZWZmc1tnXS5taW5fc25yLCByZWR1Y3Rpb24pOworICAgICAgICAgICAgICAgIC8qIHJlY2FsY3VsYXRlIFBFICovCisgICAgICAgICAgICAgICAgcGUgKz0gY2FsY19wZV8zZ3BwKGJhbmQpOworICAgICAgICAgICAgICAgIGEgICs9IGJhbmQtPnBlX2NvbnN0OworICAgICAgICAgICAgICAgIGFjdGl2ZV9saW5lcyArPSBiYW5kLT5hY3RpdmVfbGluZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiA1LjYuMS4zLjUgIlNlY29uZCBFc3RpbWF0aW9uIG9mIHRoZSByZWR1Y3Rpb24gdmFsdWUiICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHBlX25vX2FoID0gMC4wZiwgZGVzaXJlZF9wZV9ub19haDsKKyAgICAgICAgICAgIGFjdGl2ZV9saW5lcyA9IGEgPSAwLjBmOworICAgICAgICAgICAgZm9yICh3ID0gMDsgdyA8IHdpLT5udW1fd2luZG93cyoxNjsgdyArPSAxNikgeworICAgICAgICAgICAgICAgIGZvciAoZyA9IDA7IGcgPCBudW1fYmFuZHM7IGcrKykgeworICAgICAgICAgICAgICAgICAgICBBYWNQc3lCYW5kICpiYW5kID0gJnBjaC0+YmFuZFt3K2ddOworCisgICAgICAgICAgICAgICAgICAgIGlmIChiYW5kLT5hdm9pZF9ob2xlcyAhPSBQU1lfM0dQUF9BSF9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlX25vX2FoICs9IGJhbmQtPnBlOworICAgICAgICAgICAgICAgICAgICAgICAgYSAgICAgICAgKz0gYmFuZC0+cGVfY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVfbGluZXMgKz0gYmFuZC0+YWN0aXZlX2xpbmVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzaXJlZF9wZV9ub19haCA9IEZGTUFYKGRlc2lyZWRfcGUgLSAocGUgLSBwZV9ub19haCksIDAuMGYpOworICAgICAgICAgICAgaWYgKGFjdGl2ZV9saW5lcyA+IDAuMGYpCisgICAgICAgICAgICAgICAgcmVkdWN0aW9uICs9IGNhbGNfcmVkdWN0aW9uXzNncHAoYSwgZGVzaXJlZF9wZV9ub19haCwgcGVfbm9fYWgsIGFjdGl2ZV9saW5lcyk7CisKKyAgICAgICAgICAgIHBlID0gMC4wZjsKKyAgICAgICAgICAgIGZvciAodyA9IDA7IHcgPCB3aS0+bnVtX3dpbmRvd3MqMTY7IHcgKz0gMTYpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGcgPSAwOyBnIDwgbnVtX2JhbmRzOyBnKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQWFjUHN5QmFuZCAqYmFuZCA9ICZwY2gtPmJhbmRbdytnXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlX2xpbmVzID4gMC4wZikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPnRociA9IGNhbGNfcmVkdWNlZF90aHJfM2dwcChiYW5kLCBjb2VmZnNbZ10ubWluX3NuciwgcmVkdWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcGUgKz0gY2FsY19wZV8zZ3BwKGJhbmQpOworICAgICAgICAgICAgICAgICAgICBiYW5kLT5ub3JtX2ZhYyA9IGJhbmQtPmFjdGl2ZV9saW5lcyAvIGJhbmQtPnRocjsKKyAgICAgICAgICAgICAgICAgICAgbm9ybV9mYWMgKz0gYmFuZC0+bm9ybV9mYWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsdGFfcGUgPSBkZXNpcmVkX3BlIC0gcGU7CisgICAgICAgICAgICBpZiAoZmFicyhkZWx0YV9wZSkgPiAwLjA1ZiAqIGRlc2lyZWRfcGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGUgPCAxLjE1ZiAqIGRlc2lyZWRfcGUpIHsKKyAgICAgICAgICAgIC8qIDYuNi4xLjMuNiAiRmluYWwgdGhyZXNob2xkIG1vZGlmaWNhdGlvbiBieSBsaW5lYXJpemF0aW9uIiAqLworICAgICAgICAgICAgbm9ybV9mYWMgPSAxLjBmIC8gbm9ybV9mYWM7CisgICAgICAgICAgICBmb3IgKHcgPSAwOyB3IDwgd2ktPm51bV93aW5kb3dzKjE2OyB3ICs9IDE2KSB7CisgICAgICAgICAgICAgICAgZm9yIChnID0gMDsgZyA8IG51bV9iYW5kczsgZysrKSB7CisgICAgICAgICAgICAgICAgICAgIEFhY1BzeUJhbmQgKmJhbmQgPSAmcGNoLT5iYW5kW3crZ107CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJhbmQtPmFjdGl2ZV9saW5lcyA+IDAuNWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRlbHRhX3NmYl9wZSA9IGJhbmQtPm5vcm1fZmFjICogbm9ybV9mYWMgKiBkZWx0YV9wZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRociA9IGJhbmQtPnRocjsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyICo9IGV4cDJmKGRlbHRhX3NmYl9wZSAvIGJhbmQtPmFjdGl2ZV9saW5lcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyID4gY29lZmZzW2ddLm1pbl9zbnIgKiBiYW5kLT5lbmVyZ3kgJiYgYmFuZC0+YXZvaWRfaG9sZXMgPT0gUFNZXzNHUFBfQUhfSU5BQ1RJVkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyID0gRkZNQVgoYmFuZC0+dGhyLCBjb2VmZnNbZ10ubWluX3NuciAqIGJhbmQtPmVuZXJneSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLT50aHIgPSB0aHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiA1LjYuMS4zLjcgIkZ1cnRoZXIgcGVyY2VwdHVhbCBlbnRyb3B5IHJlZHVjdGlvbiIgKi8KKyAgICAgICAgICAgIGcgPSBudW1fYmFuZHM7CisgICAgICAgICAgICB3aGlsZSAocGUgPiBkZXNpcmVkX3BlICYmIGctLSkgeworICAgICAgICAgICAgICAgIGZvciAodyA9IDA7IHcgPCB3aS0+bnVtX3dpbmRvd3MqMTY7IHcrPSAxNikgeworICAgICAgICAgICAgICAgICAgICBBYWNQc3lCYW5kICpiYW5kID0gJnBjaC0+YmFuZFt3K2ddOworICAgICAgICAgICAgICAgICAgICBpZiAoYmFuZC0+YXZvaWRfaG9sZXMgIT0gUFNZXzNHUFBfQUhfTk9ORSAmJiBjb2VmZnNbZ10ubWluX3NuciA8IFBTWV9TTlJfMURCKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZnNbZ10ubWluX3NuciA9IFBTWV9TTlJfMURCOworICAgICAgICAgICAgICAgICAgICAgICAgYmFuZC0+dGhyID0gYmFuZC0+ZW5lcmd5ICogUFNZX1NOUl8xREI7CisgICAgICAgICAgICAgICAgICAgICAgICBwZSArPSBiYW5kLT5hY3RpdmVfbGluZXMgKiAxLjVmIC0gYmFuZC0+cGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBUT0RPOiBhbGxvdyBtb3JlIGhvbGVzICh1bnVzZWQgd2l0aG91dCBtaWQvc2lkZSkgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodyA9IDA7IHcgPCB3aS0+bnVtX3dpbmRvd3MqMTY7IHcgKz0gMTYpIHsKKyAgICAgICAgZm9yIChnID0gMDsgZyA8IG51bV9iYW5kczsgZysrKSB7CisgICAgICAgICAgICBBYWNQc3lCYW5kICpiYW5kICAgICA9ICZwY2gtPmJhbmRbdytnXTsKKyAgICAgICAgICAgIEZGUHN5QmFuZCAgKnBzeV9iYW5kID0gJmN0eC0+Y2hbY2hhbm5lbF0ucHN5X2JhbmRzW3crZ107CisKKyAgICAgICAgICAgIHBzeV9iYW5kLT50aHJlc2hvbGQgPSBiYW5kLT50aHI7CisgICAgICAgICAgICBwc3lfYmFuZC0+ZW5lcmd5ICAgID0gYmFuZC0+ZW5lcmd5OworICAgICAgICB9CisgICAgfQorCisgICAgbWVtY3B5KHBjaC0+cHJldl9iYW5kLCBwY2gtPmJhbmQsIHNpemVvZihwY2gtPmJhbmQpKTsKK30KKworc3RhdGljIHZvaWQgcHN5XzNncHBfYW5hbHl6ZShGRlBzeUNvbnRleHQgKmN0eCwgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICoqY29lZmZzLCBjb25zdCBGRlBzeVdpbmRvd0luZm8gKndpKQoreworICAgIGludCBjaDsKKyAgICBGRlBzeUNoYW5uZWxHcm91cCAqZ3JvdXAgPSBmZl9wc3lfZmluZF9ncm91cChjdHgsIGNoYW5uZWwpOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgZ3JvdXAtPm51bV9jaDsgY2grKykKKyAgICAgICAgcHN5XzNncHBfYW5hbHl6ZV9jaGFubmVsKGN0eCwgY2hhbm5lbCArIGNoLCBjb2VmZnNbY2hdLCAmd2lbY2hdKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBwc3lfM2dwcF9lbmQoRkZQc3lDb250ZXh0ICphcGMpCit7CisgICAgQWFjUHN5Q29udGV4dCAqcGN0eCA9IChBYWNQc3lDb250ZXh0KikgYXBjLT5tb2RlbF9wcml2X2RhdGE7CisgICAgYXZfZnJlZXAoJnBjdHgtPmNoKTsKKyAgICBhdl9mcmVlcCgmYXBjLT5tb2RlbF9wcml2X2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBsYW1lX2FwcGx5X2Jsb2NrX3R5cGUoQWFjUHN5Q2hhbm5lbCAqY3R4LCBGRlBzeVdpbmRvd0luZm8gKndpLCBpbnQgdXNlbG9uZ2Jsb2NrKQoreworICAgIGludCBibG9ja3R5cGUgPSBPTkxZX0xPTkdfU0VRVUVOQ0U7CisgICAgaWYgKHVzZWxvbmdibG9jaykgeworICAgICAgICBpZiAoY3R4LT5uZXh0X3dpbmRvd19zZXEgPT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpCisgICAgICAgICAgICBibG9ja3R5cGUgPSBMT05HX1NUT1BfU0VRVUVOQ0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmxvY2t0eXBlID0gRUlHSFRfU0hPUlRfU0VRVUVOQ0U7CisgICAgICAgIGlmIChjdHgtPm5leHRfd2luZG93X3NlcSA9PSBPTkxZX0xPTkdfU0VRVUVOQ0UpCisgICAgICAgICAgICBjdHgtPm5leHRfd2luZG93X3NlcSA9IExPTkdfU1RBUlRfU0VRVUVOQ0U7CisgICAgICAgIGlmIChjdHgtPm5leHRfd2luZG93X3NlcSA9PSBMT05HX1NUT1BfU0VRVUVOQ0UpCisgICAgICAgICAgICBjdHgtPm5leHRfd2luZG93X3NlcSA9IEVJR0hUX1NIT1JUX1NFUVVFTkNFOworICAgIH0KKworICAgIHdpLT53aW5kb3dfdHlwZVswXSA9IGN0eC0+bmV4dF93aW5kb3dfc2VxOworICAgIGN0eC0+bmV4dF93aW5kb3dfc2VxID0gYmxvY2t0eXBlOworfQorCitzdGF0aWMgRkZQc3lXaW5kb3dJbmZvIHBzeV9sYW1lX3dpbmRvdyhGRlBzeUNvbnRleHQgKmN0eCwgY29uc3QgZmxvYXQgKmF1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmxhLCBpbnQgY2hhbm5lbCwgaW50IHByZXZfdHlwZSkKK3sKKyAgICBBYWNQc3lDb250ZXh0ICpwY3R4ID0gKEFhY1BzeUNvbnRleHQqKSBjdHgtPm1vZGVsX3ByaXZfZGF0YTsKKyAgICBBYWNQc3lDaGFubmVsICpwY2ggID0gJnBjdHgtPmNoW2NoYW5uZWxdOworICAgIGludCBncm91cGluZyAgICAgPSAwOworICAgIGludCB1c2Vsb25nYmxvY2sgPSAxOworICAgIGludCBhdHRhY2tzW0FBQ19OVU1fQkxPQ0tTX1NIT1JUICsgMV0gPSB7IDAgfTsKKyAgICBpbnQgaTsKKyAgICBGRlBzeVdpbmRvd0luZm8gd2kgPSB7IHsgMCB9IH07CisKKyAgICBpZiAobGEpIHsKKyAgICAgICAgZmxvYXQgaHBmc21wbFtBQUNfQkxPQ0tfU0laRV9MT05HXTsKKyAgICAgICAgZmxvYXQgY29uc3QgKnBmID0gaHBmc21wbDsKKyAgICAgICAgZmxvYXQgYXR0YWNrX2ludGVuc2l0eVsoQUFDX05VTV9CTE9DS1NfU0hPUlQgKyAxKSAqIFBTWV9MQU1FX05VTV9TVUJCTE9DS1NdOworICAgICAgICBmbG9hdCBlbmVyZ3lfc3Vic2hvcnRbKEFBQ19OVU1fQkxPQ0tTX1NIT1JUICsgMSkgKiBQU1lfTEFNRV9OVU1fU1VCQkxPQ0tTXTsKKyAgICAgICAgZmxvYXQgZW5lcmd5X3Nob3J0W0FBQ19OVU1fQkxPQ0tTX1NIT1JUICsgMV0gPSB7IDAgfTsKKyAgICAgICAgY29uc3QgZmxvYXQgKmZpcmJ1ZiA9IGxhICsgKEFBQ19CTE9DS19TSVpFX1NIT1JULzQgLSBQU1lfTEFNRV9GSVJfTEVOKTsKKyAgICAgICAgaW50IGF0dF9zdW0gPSAwOworCisgICAgICAgIC8qIExBTUUgY29tbWVudDogYXBwbHkgaGlnaCBwYXNzIGZpbHRlciBvZiBmcy80ICovCisgICAgICAgIHBzeV9ocF9maWx0ZXIoZmlyYnVmLCBocGZzbXBsLCBwc3lfZmlyX2NvZWZmcyk7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBlbmVyZ2llcyBvZiBlYWNoIHN1Yi1zaG9ydGJsb2NrICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQU1lfTEFNRV9OVU1fU1VCQkxPQ0tTOyBpKyspIHsKKyAgICAgICAgICAgIGVuZXJneV9zdWJzaG9ydFtpXSA9IHBjaC0+cHJldl9lbmVyZ3lfc3Vic2hvcnRbaSArICgoQUFDX05VTV9CTE9DS1NfU0hPUlQgLSAxKSAqIFBTWV9MQU1FX05VTV9TVUJCTE9DS1MpXTsKKyAgICAgICAgICAgIGFzc2VydChwY2gtPnByZXZfZW5lcmd5X3N1YnNob3J0W2kgKyAoKEFBQ19OVU1fQkxPQ0tTX1NIT1JUIC0gMikgKiBQU1lfTEFNRV9OVU1fU1VCQkxPQ0tTICsgMSldID4gMCk7CisgICAgICAgICAgICBhdHRhY2tfaW50ZW5zaXR5W2ldID0gZW5lcmd5X3N1YnNob3J0W2ldIC8gcGNoLT5wcmV2X2VuZXJneV9zdWJzaG9ydFtpICsgKChBQUNfTlVNX0JMT0NLU19TSE9SVCAtIDIpICogUFNZX0xBTUVfTlVNX1NVQkJMT0NLUyArIDEpXTsKKyAgICAgICAgICAgIGVuZXJneV9zaG9ydFswXSArPSBlbmVyZ3lfc3Vic2hvcnRbaV07CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQUFDX05VTV9CTE9DS1NfU0hPUlQgKiBQU1lfTEFNRV9OVU1fU1VCQkxPQ0tTOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGNvbnN0ICpjb25zdCBwZmUgPSBwZiArIEFBQ19CTE9DS19TSVpFX0xPTkcgLyAoQUFDX05VTV9CTE9DS1NfU0hPUlQgKiBQU1lfTEFNRV9OVU1fU1VCQkxPQ0tTKTsKKyAgICAgICAgICAgIGZsb2F0IHAgPSAxLjBmOworICAgICAgICAgICAgZm9yICg7IHBmIDwgcGZlOyBwZisrKQorICAgICAgICAgICAgICAgIHAgPSBGRk1BWChwLCBmYWJzZigqcGYpKTsKKyAgICAgICAgICAgIHBjaC0+cHJldl9lbmVyZ3lfc3Vic2hvcnRbaV0gPSBlbmVyZ3lfc3Vic2hvcnRbaSArIFBTWV9MQU1FX05VTV9TVUJCTE9DS1NdID0gcDsKKyAgICAgICAgICAgIGVuZXJneV9zaG9ydFsxICsgaSAvIFBTWV9MQU1FX05VTV9TVUJCTE9DS1NdICs9IHA7CisgICAgICAgICAgICAvKiBOT1RFOiBUaGUgaW5kZXhlcyBiZWxvdyBhcmUgW2kgKyAzIC0gMl0gaW4gdGhlIExBTUUgc291cmNlLgorICAgICAgICAgICAgICogICAgICAgT2J2aW91c2x5IHRoZSAzIGFuZCAyIGhhdmUgc29tZSBzaWduaWZpY2FuY2UsIG9yIHRoaXMgd291bGQgYmUganVzdCBbaSArIDFdCisgICAgICAgICAgICAgKiAgICAgICAod2hpY2ggaXMgd2hhdCB3ZSB1c2UgaGVyZSkuIFdoYXQgdGhlIDMgc3RhbmRzIGZvciBpcyBhbWJpZ3VvdXMsIGFzIGl0IGlzIGJvdGgKKyAgICAgICAgICAgICAqICAgICAgIG51bWJlciBvZiBzaG9ydCBibG9ja3MsIGFuZCB0aGUgbnVtYmVyIG9mIHN1Yi1zaG9ydCBibG9ja3MuCisgICAgICAgICAgICAgKiAgICAgICBJdCBzZWVtcyB0aGF0IExBTUUgaXMgY29tcGFyaW5nIGVhY2ggc3ViLWJsb2NrIHRvIHN1Yi1ibG9jayArIDEgaW4gdGhlCisgICAgICAgICAgICAgKiAgICAgICBwcmV2aW91cyBibG9jay4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHAgPiBlbmVyZ3lfc3Vic2hvcnRbaSArIDFdKQorICAgICAgICAgICAgICAgIHAgPSBwIC8gZW5lcmd5X3N1YnNob3J0W2kgKyAxXTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGVuZXJneV9zdWJzaG9ydFtpICsgMV0gPiBwICogMTAuMGYpCisgICAgICAgICAgICAgICAgcCA9IGVuZXJneV9zdWJzaG9ydFtpICsgMV0gLyAocCAqIDEwLjBmKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwID0gMC4wOworICAgICAgICAgICAgYXR0YWNrX2ludGVuc2l0eVtpICsgUFNZX0xBTUVfTlVNX1NVQkJMT0NLU10gPSBwOworICAgICAgICB9CisKKyAgICAgICAgLyogY29tcGFyZSBlbmVyZ3kgYmV0d2VlbiBzdWItc2hvcnQgYmxvY2tzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQUFDX05VTV9CTE9DS1NfU0hPUlQgKyAxKSAqIFBTWV9MQU1FX05VTV9TVUJCTE9DS1M7IGkrKykKKyAgICAgICAgICAgIGlmICghYXR0YWNrc1tpIC8gUFNZX0xBTUVfTlVNX1NVQkJMT0NLU10pCisgICAgICAgICAgICAgICAgaWYgKGF0dGFja19pbnRlbnNpdHlbaV0gPiBwY2gtPmF0dGFja190aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgIGF0dGFja3NbaSAvIFBTWV9MQU1FX05VTV9TVUJCTE9DS1NdID0gKGkgJSBQU1lfTEFNRV9OVU1fU1VCQkxPQ0tTKSArIDE7CisKKyAgICAgICAgLyogc2hvdWxkIGhhdmUgZW5lcmd5IGNoYW5nZSBiZXR3ZWVuIHNob3J0IGJsb2NrcywgaW4gb3JkZXIgdG8gYXZvaWQgcGVyaW9kaWMgc2lnbmFscyAqLworICAgICAgICAvKiBHb29kIHNhbXBsZXMgdG8gc2hvdyB0aGUgZWZmZWN0IGFyZSBUcnVtcGV0IHRlc3Qgc29uZ3MgKi8KKyAgICAgICAgLyogR0I6IHR1bmVkICgxKSB0byBhdm9pZCB0b28gbWFueSBzaG9ydCBibG9ja3MgZm9yIHRlc3Qgc2FtcGxlIFRSVU1QRVQgKi8KKyAgICAgICAgLyogUkg6IHR1bmVkICgyKSB0byBsZXQgZW5vdWdoIHNob3J0IGJsb2NrcyB0aHJvdWdoIGZvciB0ZXN0IHNhbXBsZSBGU09MIGFuZCBTTkFQUyAqLworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgQUFDX05VTV9CTE9DS1NfU0hPUlQgKyAxOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGNvbnN0IHUgPSBlbmVyZ3lfc2hvcnRbaSAtIDFdOworICAgICAgICAgICAgZmxvYXQgY29uc3QgdiA9IGVuZXJneV9zaG9ydFtpXTsKKyAgICAgICAgICAgIGZsb2F0IGNvbnN0IG0gPSBGRk1BWCh1LCB2KTsKKyAgICAgICAgICAgIGlmIChtIDwgNDAwMDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICgyKSAqLworICAgICAgICAgICAgICAgIGlmICh1IDwgMS43ZiAqIHYgJiYgdiA8IDEuN2YgKiB1KSB7ICAgLyogKDEpICovCisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEgJiYgYXR0YWNrc1swXSA8IGF0dGFja3NbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2tzWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNrc1tpXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0X3N1bSArPSBhdHRhY2tzW2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF0dGFja3NbMF0gPD0gcGNoLT5wcmV2X2F0dGFjaykKKyAgICAgICAgICAgIGF0dGFja3NbMF0gPSAwOworCisgICAgICAgIGF0dF9zdW0gKz0gYXR0YWNrc1swXTsKKyAgICAgICAgLyogMyBiZWxvdyBpbmRpY2F0ZXMgdGhlIHByZXZpb3VzIGF0dGFjayBoYXBwZW5lZCBpbiB0aGUgbGFzdCBzdWItYmxvY2sgb2YgdGhlIHByZXZpb3VzIHNlcXVlbmNlICovCisgICAgICAgIGlmIChwY2gtPnByZXZfYXR0YWNrID09IDMgfHwgYXR0X3N1bSkgeworICAgICAgICAgICAgdXNlbG9uZ2Jsb2NrID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IEFBQ19OVU1fQkxPQ0tTX1NIT1JUICsgMTsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChhdHRhY2tzW2ldICYmIGF0dGFja3NbaS0xXSkKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNrc1tpXSA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSBoYXZlIG5vIGxvb2thaGVhZCBpbmZvLCBzbyBqdXN0IHVzZSBzYW1lIHR5cGUgYXMgdGhlIHByZXZpb3VzIHNlcXVlbmNlLiAqLworICAgICAgICB1c2Vsb25nYmxvY2sgPSAhKHByZXZfdHlwZSA9PSBFSUdIVF9TSE9SVF9TRVFVRU5DRSk7CisgICAgfQorCisgICAgbGFtZV9hcHBseV9ibG9ja190eXBlKHBjaCwgJndpLCB1c2Vsb25nYmxvY2spOworCisgICAgd2kud2luZG93X3R5cGVbMV0gPSBwcmV2X3R5cGU7CisgICAgaWYgKHdpLndpbmRvd190eXBlWzBdICE9IEVJR0hUX1NIT1JUX1NFUVVFTkNFKSB7CisgICAgICAgIHdpLm51bV93aW5kb3dzICA9IDE7CisgICAgICAgIHdpLmdyb3VwaW5nWzBdICA9IDE7CisgICAgICAgIGlmICh3aS53aW5kb3dfdHlwZVswXSA9PSBMT05HX1NUQVJUX1NFUVVFTkNFKQorICAgICAgICAgICAgd2kud2luZG93X3NoYXBlID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd2kud2luZG93X3NoYXBlID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgbGFzdGdycCA9IDA7CisKKyAgICAgICAgd2kubnVtX3dpbmRvd3MgPSA4OworICAgICAgICB3aS53aW5kb3dfc2hhcGUgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpZiAoISgocGNoLT5uZXh0X2dyb3VwaW5nID4+IGkpICYgMSkpCisgICAgICAgICAgICAgICAgbGFzdGdycCA9IGk7CisgICAgICAgICAgICB3aS5ncm91cGluZ1tsYXN0Z3JwXSsrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRGV0ZXJtaW5lIGdyb3VwaW5nLCBiYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IGF0dGFjaywgYW5kIHNhdmUgZm9yCisgICAgICogdGhlIG5leHQgZnJhbWUuCisgICAgICogRklYTUU6IE1vdmUgdGhpcyB0byBhbmFseXNpcy4KKyAgICAgKiBUT0RPOiBUdW5lIGdyb3VwaW5ncyBkZXBlbmRpbmcgb24gYXR0YWNrIGxvY2F0aW9uCisgICAgICogVE9ETzogSGFuZGxlIG1vcmUgdGhhbiBvbmUgYXR0YWNrIGluIGEgZ3JvdXAKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisgICAgICAgIGlmIChhdHRhY2tzW2ldKSB7CisgICAgICAgICAgICBncm91cGluZyA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBwY2gtPm5leHRfZ3JvdXBpbmcgPSB3aW5kb3dfZ3JvdXBpbmdbZ3JvdXBpbmddOworCisgICAgcGNoLT5wcmV2X2F0dGFjayA9IGF0dGFja3NbOF07CisKKyAgICByZXR1cm4gd2k7Cit9CisKK2NvbnN0IEZGUHN5TW9kZWwgZmZfYWFjX3BzeV9tb2RlbCA9Cit7CisgICAgLm5hbWUgICAgPSAiM0dQUCBUUyAyNi40MDMtaW5zcGlyZWQgbW9kZWwiLAorICAgIC5pbml0ICAgID0gcHN5XzNncHBfaW5pdCwKKyAgICAud2luZG93ICA9IHBzeV9sYW1lX3dpbmRvdywKKyAgICAuYW5hbHl6ZSA9IHBzeV8zZ3BwX2FuYWx5emUsCisgICAgLmVuZCAgICAgPSBwc3lfM2dwcF9lbmQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFjc2JyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNzYnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGE1Njg1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjc2JyLmMKQEAgLTAsMCArMSwxNzcxIEBACisvKgorICogQUFDIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24gZGVjb2RpbmcgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBSb2JlcnQgU3dhaW4gKCByb2Igb3BlbmRvdCBjbCApCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBBbGV4IENvbnZlcnNlIDxhbGV4LmNvbnZlcnNlQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQUFDIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24gZGVjb2RpbmcgZnVuY3Rpb25zCisgKiBAYXV0aG9yIFJvYmVydCBTd2FpbiAoIHJvYiBvcGVuZG90IGNsICkKKyAqLworCisjaW5jbHVkZSAiYWFjLmgiCisjaW5jbHVkZSAic2JyLmgiCisjaW5jbHVkZSAiYWFjc2JyLmgiCisjaW5jbHVkZSAiYWFjc2JyZGF0YS5oIgorI2luY2x1ZGUgImFhY3Nicl90YWJsZWdlbi5oIgorI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgImFhY3BzLmgiCisjaW5jbHVkZSAic2JyZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjZGVmaW5lIEVOVkVMT1BFX0FESlVTVE1FTlRfT0ZGU0VUIDIKKyNkZWZpbmUgTk9JU0VfRkxPT1JfT0ZGU0VUIDYuMGYKKworI2lmIEFSQ0hfTUlQUworI2luY2x1ZGUgIm1pcHMvYWFjc2JyX21pcHMuaCIKKyNlbmRpZiAvKiBBUkNIX01JUFMgKi8KKworLyoqCisgKiBTQlIgVkxDIHRhYmxlcworICovCitlbnVtIHsKKyAgICBUX0hVRkZNQU5fRU5WXzFfNURCLAorICAgIEZfSFVGRk1BTl9FTlZfMV81REIsCisgICAgVF9IVUZGTUFOX0VOVl9CQUxfMV81REIsCisgICAgRl9IVUZGTUFOX0VOVl9CQUxfMV81REIsCisgICAgVF9IVUZGTUFOX0VOVl8zXzBEQiwKKyAgICBGX0hVRkZNQU5fRU5WXzNfMERCLAorICAgIFRfSFVGRk1BTl9FTlZfQkFMXzNfMERCLAorICAgIEZfSFVGRk1BTl9FTlZfQkFMXzNfMERCLAorICAgIFRfSFVGRk1BTl9OT0lTRV8zXzBEQiwKKyAgICBUX0hVRkZNQU5fTk9JU0VfQkFMXzNfMERCLAorfTsKKworLyoqCisgKiBic19mcmFtZV9jbGFzcyAtIGZyYW1lIGNsYXNzIG9mIGN1cnJlbnQgU0JSIGZyYW1lICgxNDQ5Ni0zIHNwMDQgcDk4KQorICovCitlbnVtIHsKKyAgICBGSVhGSVgsCisgICAgRklYVkFSLAorICAgIFZBUkZJWCwKKyAgICBWQVJWQVIsCit9OworCitlbnVtIHsKKyAgICBFWFRFTlNJT05fSURfUFMgPSAyLAorfTsKKworc3RhdGljIFZMQyB2bGNfc2JyWzEwXTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgdmxjX3Nicl9sYXZbMTBdID0KKyAgICB7IDYwLCA2MCwgMjQsIDI0LCAzMSwgMzEsIDEyLCAxMiwgMzEsIDEyIH07CisKKyNkZWZpbmUgU0JSX0lOSVRfVkxDX1NUQVRJQyhudW0sIHNpemUpIFwKKyAgICBJTklUX1ZMQ19TVEFUSUMoJnZsY19zYnJbbnVtXSwgOSwgc2JyX3RtcFtudW1dLnRhYmxlX3NpemUgLyBzYnJfdG1wW251bV0uZWxlbV9zaXplLCAgICAgXAorICAgICAgICAgICAgICAgICAgICBzYnJfdG1wW251bV0uc2JyX2JpdHMgLCAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAxLCBcCisgICAgICAgICAgICAgICAgICAgIHNicl90bXBbbnVtXS5zYnJfY29kZXMsIHNicl90bXBbbnVtXS5lbGVtX3NpemUsIHNicl90bXBbbnVtXS5lbGVtX3NpemUsIFwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSkKKworI2RlZmluZSBTQlJfVkxDX1JPVyhuYW1lKSBcCisgICAgeyBuYW1lICMjIF9jb2RlcywgbmFtZSAjIyBfYml0cywgc2l6ZW9mKG5hbWUgIyMgX2NvZGVzKSwgc2l6ZW9mKG5hbWUgIyMgX2NvZGVzWzBdKSB9CisKK3N0YXRpYyB2b2lkIGFhY3Nicl9mdW5jX3B0cl9pbml0KEFBQ1NCUkNvbnRleHQgKmMpOworCithdl9jb2xkIHZvaWQgZmZfYWFjX3Nicl9pbml0KHZvaWQpCit7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IHZvaWQgKnNicl9jb2RlcywgKnNicl9iaXRzOworICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgdGFibGVfc2l6ZSwgZWxlbV9zaXplOworICAgIH0gc2JyX3RtcFtdID0geworICAgICAgICBTQlJfVkxDX1JPVyh0X2h1ZmZtYW5fZW52XzFfNWRCKSwKKyAgICAgICAgU0JSX1ZMQ19ST1coZl9odWZmbWFuX2Vudl8xXzVkQiksCisgICAgICAgIFNCUl9WTENfUk9XKHRfaHVmZm1hbl9lbnZfYmFsXzFfNWRCKSwKKyAgICAgICAgU0JSX1ZMQ19ST1coZl9odWZmbWFuX2Vudl9iYWxfMV81ZEIpLAorICAgICAgICBTQlJfVkxDX1JPVyh0X2h1ZmZtYW5fZW52XzNfMGRCKSwKKyAgICAgICAgU0JSX1ZMQ19ST1coZl9odWZmbWFuX2Vudl8zXzBkQiksCisgICAgICAgIFNCUl9WTENfUk9XKHRfaHVmZm1hbl9lbnZfYmFsXzNfMGRCKSwKKyAgICAgICAgU0JSX1ZMQ19ST1coZl9odWZmbWFuX2Vudl9iYWxfM18wZEIpLAorICAgICAgICBTQlJfVkxDX1JPVyh0X2h1ZmZtYW5fbm9pc2VfM18wZEIpLAorICAgICAgICBTQlJfVkxDX1JPVyh0X2h1ZmZtYW5fbm9pc2VfYmFsXzNfMGRCKSwKKyAgICB9OworCisgICAgLy8gU0JSIFZMQyB0YWJsZSBpbml0aWFsaXphdGlvbgorICAgIFNCUl9JTklUX1ZMQ19TVEFUSUMoMCwgMTA5OCk7CisgICAgU0JSX0lOSVRfVkxDX1NUQVRJQygxLCAxMDkyKTsKKyAgICBTQlJfSU5JVF9WTENfU1RBVElDKDIsIDc2OCk7CisgICAgU0JSX0lOSVRfVkxDX1NUQVRJQygzLCAxMDI2KTsKKyAgICBTQlJfSU5JVF9WTENfU1RBVElDKDQsIDEwNTgpOworICAgIFNCUl9JTklUX1ZMQ19TVEFUSUMoNSwgMTA1Mik7CisgICAgU0JSX0lOSVRfVkxDX1NUQVRJQyg2LCA1NDQpOworICAgIFNCUl9JTklUX1ZMQ19TVEFUSUMoNywgNTQ0KTsKKyAgICBTQlJfSU5JVF9WTENfU1RBVElDKDgsIDU5Mik7CisgICAgU0JSX0lOSVRfVkxDX1NUQVRJQyg5LCA1MTIpOworCisgICAgYWFjc2JyX3RhYmxlaW5pdCgpOworCisgICAgZmZfcHNfaW5pdCgpOworfQorCisvKiogUGxhY2VzIFNCUiBpbiBwdXJlIHVwc2FtcGxpbmcgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIHNicl90dXJub2ZmKFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIpIHsKKyAgICBzYnItPnN0YXJ0ID0gMDsKKyAgICAvLyBJbml0IGRlZnVsdHMgdXNlZCBpbiBwdXJlIHVwc2FtcGxpbmcgbW9kZQorICAgIHNici0+a3hbMV0gPSAzMjsgLy9UeXBvIGluIHNwZWMsIGt4JyBpbml0cyB0byAzMgorICAgIHNici0+bVsxXSA9IDA7CisgICAgLy8gUmVzZXQgdmFsdWVzIGZvciBmaXJzdCBTQlIgaGVhZGVyCisgICAgc2JyLT5kYXRhWzBdLmVfYVsxXSA9IHNici0+ZGF0YVsxXS5lX2FbMV0gPSAtMTsKKyAgICBtZW1zZXQoJnNici0+c3BlY3RydW1fcGFyYW1zLCAtMSwgc2l6ZW9mKFNwZWN0cnVtUGFyYW1ldGVycykpOworfQorCithdl9jb2xkIHZvaWQgZmZfYWFjX3Nicl9jdHhfaW5pdChBQUNDb250ZXh0ICphYywgU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNicikKK3sKKyAgICBpZihzYnItPm1kY3QubWRjdF9iaXRzKQorICAgICAgICByZXR1cm47CisgICAgc2JyLT5reFswXSA9IHNici0+a3hbMV07CisgICAgc2JyX3R1cm5vZmYoc2JyKTsKKyAgICBzYnItPmRhdGFbMF0uc3ludGhlc2lzX2ZpbHRlcmJhbmtfc2FtcGxlc19vZmZzZXQgPSBTQlJfU1lOVEhFU0lTX0JVRl9TSVpFIC0gKDEyODAgLSAxMjgpOworICAgIHNici0+ZGF0YVsxXS5zeW50aGVzaXNfZmlsdGVyYmFua19zYW1wbGVzX29mZnNldCA9IFNCUl9TWU5USEVTSVNfQlVGX1NJWkUgLSAoMTI4MCAtIDEyOCk7CisgICAgLyogU0JSIHJlcXVpcmVzIHNhbXBsZXMgdG8gYmUgc2NhbGVkIHRvICsvLTMyNzY4LjAgdG8gd29yayBjb3JyZWN0bHkuCisgICAgICogbWRjdCBzY2FsZSBmYWN0b3JzIGFyZSBhZGp1c3RlZCB0byBzY2FsZSB1cCBmcm9tICsvLTEuMCBhdCBhbmFseXNpcworICAgICAqIGFuZCBzY2FsZSBiYWNrIGRvd24gYXQgc3ludGhlc2lzLiAqLworICAgIGZmX21kY3RfaW5pdCgmc2JyLT5tZGN0LCAgICAgNywgMSwgMS4wIC8gKDY0ICogMzI3NjguMCkpOworICAgIGZmX21kY3RfaW5pdCgmc2JyLT5tZGN0X2FuYSwgNywgMSwgLTIuMCAqIDMyNzY4LjApOworICAgIGZmX3BzX2N0eF9pbml0KCZzYnItPnBzKTsKKyAgICBmZl9zYnJkc3BfaW5pdCgmc2JyLT5kc3ApOworICAgIGFhY3Nicl9mdW5jX3B0cl9pbml0KCZzYnItPmMpOworfQorCithdl9jb2xkIHZvaWQgZmZfYWFjX3Nicl9jdHhfY2xvc2UoU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNicikKK3sKKyAgICBmZl9tZGN0X2VuZCgmc2JyLT5tZGN0KTsKKyAgICBmZl9tZGN0X2VuZCgmc2JyLT5tZGN0X2FuYSk7Cit9CisKK3N0YXRpYyBpbnQgcXNvcnRfY29tcGFyaXNvbl9mdW5jdGlvbl9pbnQxNihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIHJldHVybiAqKGNvbnN0IGludDE2X3QgKilhIC0gKihjb25zdCBpbnQxNl90ICopYjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW5fdGFibGVfaW50MTYoY29uc3QgaW50MTZfdCAqdGFibGUsIGludCBsYXN0X2VsLCBpbnQxNl90IG5lZWRsZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IGxhc3RfZWw7IGkrKykKKyAgICAgICAgaWYgKHRhYmxlW2ldID09IG5lZWRsZSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisvLy8gTGltaXRlciBGcmVxdWVuY3kgQmFuZCBUYWJsZSAoMTQ0OTYtMyBzcDA0IHAxOTgpCitzdGF0aWMgdm9pZCBzYnJfbWFrZV9mX3RhYmxlbGltKFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIpCit7CisgICAgaW50IGs7CisgICAgaWYgKHNici0+YnNfbGltaXRlcl9iYW5kcyA+IDApIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0IGJhbmRzX3dhcnBlZFszXSA9IHsgMS4zMjcxNTE3NDIzMzg1NjgwMzkwOWYsICAgLy8yXigwLjQ5LzEuMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xODUwOTI3NzA5NDE1ODIxMDEyOWYsICAgLy8yXigwLjQ5LzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTE5ODcxNjA0MDQ2NzU5MTI1MDFmIH07IC8vMl4oMC40OS8zKQorICAgICAgICBjb25zdCBmbG9hdCBsaW1fYmFuZHNfcGVyX29jdGF2ZV93YXJwZWQgPSBiYW5kc193YXJwZWRbc2JyLT5ic19saW1pdGVyX2JhbmRzIC0gMV07CisgICAgICAgIGludDE2X3QgcGF0Y2hfYm9yZGVyc1s3XTsKKyAgICAgICAgdWludDE2X3QgKmluID0gc2JyLT5mX3RhYmxlbGltICsgMSwgKm91dCA9IHNici0+Zl90YWJsZWxpbTsKKworICAgICAgICBwYXRjaF9ib3JkZXJzWzBdID0gc2JyLT5reFsxXTsKKyAgICAgICAgZm9yIChrID0gMTsgayA8PSBzYnItPm51bV9wYXRjaGVzOyBrKyspCisgICAgICAgICAgICBwYXRjaF9ib3JkZXJzW2tdID0gcGF0Y2hfYm9yZGVyc1trLTFdICsgc2JyLT5wYXRjaF9udW1fc3ViYmFuZHNbay0xXTsKKworICAgICAgICBtZW1jcHkoc2JyLT5mX3RhYmxlbGltLCBzYnItPmZfdGFibGVsb3csCisgICAgICAgICAgICAgICAoc2JyLT5uWzBdICsgMSkgKiBzaXplb2Yoc2JyLT5mX3RhYmxlbG93WzBdKSk7CisgICAgICAgIGlmIChzYnItPm51bV9wYXRjaGVzID4gMSkKKyAgICAgICAgICAgIG1lbWNweShzYnItPmZfdGFibGVsaW0gKyBzYnItPm5bMF0gKyAxLCBwYXRjaF9ib3JkZXJzICsgMSwKKyAgICAgICAgICAgICAgICAgICAoc2JyLT5udW1fcGF0Y2hlcyAtIDEpICogc2l6ZW9mKHBhdGNoX2JvcmRlcnNbMF0pKTsKKworICAgICAgICBxc29ydChzYnItPmZfdGFibGVsaW0sIHNici0+bnVtX3BhdGNoZXMgKyBzYnItPm5bMF0sCisgICAgICAgICAgICAgIHNpemVvZihzYnItPmZfdGFibGVsaW1bMF0pLAorICAgICAgICAgICAgICBxc29ydF9jb21wYXJpc29uX2Z1bmN0aW9uX2ludDE2KTsKKworICAgICAgICBzYnItPm5fbGltID0gc2JyLT5uWzBdICsgc2JyLT5udW1fcGF0Y2hlcyAtIDE7CisgICAgICAgIHdoaWxlIChvdXQgPCBzYnItPmZfdGFibGVsaW0gKyBzYnItPm5fbGltKSB7CisgICAgICAgICAgICBpZiAoKmluID49ICpvdXQgKiBsaW1fYmFuZHNfcGVyX29jdGF2ZV93YXJwZWQpIHsKKyAgICAgICAgICAgICAgICAqKytvdXQgPSAqaW4rKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKmluID09ICpvdXQgfHwKKyAgICAgICAgICAgICAgICAhaW5fdGFibGVfaW50MTYocGF0Y2hfYm9yZGVycywgc2JyLT5udW1fcGF0Y2hlcywgKmluKSkgeworICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICAgICAgc2JyLT5uX2xpbS0tOworICAgICAgICAgICAgfSBlbHNlIGlmICghaW5fdGFibGVfaW50MTYocGF0Y2hfYm9yZGVycywgc2JyLT5udW1fcGF0Y2hlcywgKm91dCkpIHsKKyAgICAgICAgICAgICAgICAqb3V0ID0gKmluKys7CisgICAgICAgICAgICAgICAgc2JyLT5uX2xpbS0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqKytvdXQgPSAqaW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNici0+Zl90YWJsZWxpbVswXSA9IHNici0+Zl90YWJsZWxvd1swXTsKKyAgICAgICAgc2JyLT5mX3RhYmxlbGltWzFdID0gc2JyLT5mX3RhYmxlbG93W3Nici0+blswXV07CisgICAgICAgIHNici0+bl9saW0gPSAxOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCByZWFkX3Nicl9oZWFkZXIoU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNiciwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgdW5zaWduZWQgaW50IGNudCA9IGdldF9iaXRzX2NvdW50KGdiKTsKKyAgICB1aW50OF90IGJzX2hlYWRlcl9leHRyYV8xOworICAgIHVpbnQ4X3QgYnNfaGVhZGVyX2V4dHJhXzI7CisgICAgaW50IG9sZF9ic19saW1pdGVyX2JhbmRzID0gc2JyLT5ic19saW1pdGVyX2JhbmRzOworICAgIFNwZWN0cnVtUGFyYW1ldGVycyBvbGRfc3BlY3RydW1fcGFyYW1zOworCisgICAgc2JyLT5zdGFydCA9IDE7CisKKyAgICAvLyBTYXZlIGxhc3Qgc3BlY3RydW0gcGFyYW1ldGVycyB2YXJpYWJsZXMgdG8gY29tcGFyZSB0byBuZXcgb25lcworICAgIG1lbWNweSgmb2xkX3NwZWN0cnVtX3BhcmFtcywgJnNici0+c3BlY3RydW1fcGFyYW1zLCBzaXplb2YoU3BlY3RydW1QYXJhbWV0ZXJzKSk7CisKKyAgICBzYnItPmJzX2FtcF9yZXNfaGVhZGVyICAgICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CisgICAgc2JyLT5zcGVjdHJ1bV9wYXJhbXMuYnNfc3RhcnRfZnJlcSAgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgc2JyLT5zcGVjdHJ1bV9wYXJhbXMuYnNfc3RvcF9mcmVxICAgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgc2JyLT5zcGVjdHJ1bV9wYXJhbXMuYnNfeG92ZXJfYmFuZCAgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDIpOyAvLyBic19yZXNlcnZlZAorCisgICAgYnNfaGVhZGVyX2V4dHJhXzEgPSBnZXRfYml0czEoZ2IpOworICAgIGJzX2hlYWRlcl9leHRyYV8yID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIGlmIChic19oZWFkZXJfZXh0cmFfMSkgeworICAgICAgICBzYnItPnNwZWN0cnVtX3BhcmFtcy5ic19mcmVxX3NjYWxlICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgc2JyLT5zcGVjdHJ1bV9wYXJhbXMuYnNfYWx0ZXJfc2NhbGUgPSBnZXRfYml0czEoZ2IpOworICAgICAgICBzYnItPnNwZWN0cnVtX3BhcmFtcy5ic19ub2lzZV9iYW5kcyA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzYnItPnNwZWN0cnVtX3BhcmFtcy5ic19mcmVxX3NjYWxlICA9IDI7CisgICAgICAgIHNici0+c3BlY3RydW1fcGFyYW1zLmJzX2FsdGVyX3NjYWxlID0gMTsKKyAgICAgICAgc2JyLT5zcGVjdHJ1bV9wYXJhbXMuYnNfbm9pc2VfYmFuZHMgPSAyOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHNwZWN0cnVtIHBhcmFtZXRlcnMgY2hhbmdlZAorICAgIGlmIChtZW1jbXAoJm9sZF9zcGVjdHJ1bV9wYXJhbXMsICZzYnItPnNwZWN0cnVtX3BhcmFtcywgc2l6ZW9mKFNwZWN0cnVtUGFyYW1ldGVycykpKQorICAgICAgICBzYnItPnJlc2V0ID0gMTsKKworICAgIGlmIChic19oZWFkZXJfZXh0cmFfMikgeworICAgICAgICBzYnItPmJzX2xpbWl0ZXJfYmFuZHMgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICBzYnItPmJzX2xpbWl0ZXJfZ2FpbnMgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICBzYnItPmJzX2ludGVycG9sX2ZyZXEgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgc2JyLT5ic19zbW9vdGhpbmdfbW9kZSA9IGdldF9iaXRzMShnYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2JyLT5ic19saW1pdGVyX2JhbmRzICA9IDI7CisgICAgICAgIHNici0+YnNfbGltaXRlcl9nYWlucyAgPSAyOworICAgICAgICBzYnItPmJzX2ludGVycG9sX2ZyZXEgID0gMTsKKyAgICAgICAgc2JyLT5ic19zbW9vdGhpbmdfbW9kZSA9IDE7CisgICAgfQorCisgICAgaWYgKHNici0+YnNfbGltaXRlcl9iYW5kcyAhPSBvbGRfYnNfbGltaXRlcl9iYW5kcyAmJiAhc2JyLT5yZXNldCkKKyAgICAgICAgc2JyX21ha2VfZl90YWJsZWxpbShzYnIpOworCisgICAgcmV0dXJuIGdldF9iaXRzX2NvdW50KGdiKSAtIGNudDsKK30KKworc3RhdGljIGludCBhcnJheV9taW5faW50MTYoY29uc3QgaW50MTZfdCAqYXJyYXksIGludCBuZWwpCit7CisgICAgaW50IGksIG1pbiA9IGFycmF5WzBdOworICAgIGZvciAoaSA9IDE7IGkgPCBuZWw7IGkrKykKKyAgICAgICAgbWluID0gRkZNSU4oYXJyYXlbaV0sIG1pbik7CisgICAgcmV0dXJuIG1pbjsKK30KKworc3RhdGljIHZvaWQgbWFrZV9iYW5kcyhpbnQxNl90KiBiYW5kcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwgaW50IG51bV9iYW5kcykKK3sKKyAgICBpbnQgaywgcHJldmlvdXMsIHByZXNlbnQ7CisgICAgZmxvYXQgYmFzZSwgcHJvZDsKKworICAgIGJhc2UgPSBwb3dmKChmbG9hdClzdG9wIC8gc3RhcnQsIDEuMGYgLyBudW1fYmFuZHMpOworICAgIHByb2QgPSBzdGFydDsKKyAgICBwcmV2aW91cyA9IHN0YXJ0OworCisgICAgZm9yIChrID0gMDsgayA8IG51bV9iYW5kcy0xOyBrKyspIHsKKyAgICAgICAgcHJvZCAqPSBiYXNlOworICAgICAgICBwcmVzZW50ICA9IGxyaW50Zihwcm9kKTsKKyAgICAgICAgYmFuZHNba10gPSBwcmVzZW50IC0gcHJldmlvdXM7CisgICAgICAgIHByZXZpb3VzID0gcHJlc2VudDsKKyAgICB9CisgICAgYmFuZHNbbnVtX2JhbmRzLTFdID0gc3RvcCAtIHByZXZpb3VzOworfQorCitzdGF0aWMgaW50IGNoZWNrX25fbWFzdGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IG5fbWFzdGVyLCBpbnQgYnNfeG92ZXJfYmFuZCkKK3sKKyAgICAvLyBSZXF1aXJlbWVudHMgKDE0NDk2LTMgc3AwNCBwMjA1KQorICAgIGlmIChuX21hc3RlciA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBuX21hc3RlcjogJWRcbiIsIG5fbWFzdGVyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoYnNfeG92ZXJfYmFuZCA+PSBuX21hc3RlcikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIGJpdHN0cmVhbSwgY3Jvc3NvdmVyIGJhbmQgaW5kZXggYmV5b25kIGFycmF5IGJvdW5kczogJWRcbiIsCisgICAgICAgICAgICAgICBic194b3Zlcl9iYW5kKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy8vIE1hc3RlciBGcmVxdWVuY3kgQmFuZCBUYWJsZSAoMTQ0OTYtMyBzcDA0IHAxOTQpCitzdGF0aWMgaW50IHNicl9tYWtlX2ZfbWFzdGVyKEFBQ0NvbnRleHQgKmFjLCBTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjdHJ1bVBhcmFtZXRlcnMgKnNwZWN0cnVtKQoreworICAgIHVuc2lnbmVkIGludCB0ZW1wLCBtYXhfcW1mX3N1YmJhbmRzID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgc3RhcnRfbWluLCBzdG9wX21pbjsKKyAgICBpbnQgazsKKyAgICBjb25zdCBpbnQ4X3QgKnNicl9vZmZzZXRfcHRyOworICAgIGludDE2X3Qgc3RvcF9ka1sxM107CisKKyAgICBpZiAoc2JyLT5zYW1wbGVfcmF0ZSA8IDMyMDAwKSB7CisgICAgICAgIHRlbXAgPSAzMDAwOworICAgIH0gZWxzZSBpZiAoc2JyLT5zYW1wbGVfcmF0ZSA8IDY0MDAwKSB7CisgICAgICAgIHRlbXAgPSA0MDAwOworICAgIH0gZWxzZQorICAgICAgICB0ZW1wID0gNTAwMDsKKworICAgIHN3aXRjaCAoc2JyLT5zYW1wbGVfcmF0ZSkgeworICAgIGNhc2UgMTYwMDA6CisgICAgICAgIHNicl9vZmZzZXRfcHRyID0gc2JyX29mZnNldFswXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgICAgc2JyX29mZnNldF9wdHIgPSBzYnJfb2Zmc2V0WzFdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0MDAwOgorICAgICAgICBzYnJfb2Zmc2V0X3B0ciA9IHNicl9vZmZzZXRbMl07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzIwMDA6CisgICAgICAgIHNicl9vZmZzZXRfcHRyID0gc2JyX29mZnNldFszXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDogY2FzZSA0ODAwMDogY2FzZSA2NDAwMDoKKyAgICAgICAgc2JyX29mZnNldF9wdHIgPSBzYnJfb2Zmc2V0WzRdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg4MjAwOiBjYXNlIDk2MDAwOiBjYXNlIDEyODAwMDogY2FzZSAxNzY0MDA6IGNhc2UgMTkyMDAwOgorICAgICAgICBzYnJfb2Zmc2V0X3B0ciA9IHNicl9vZmZzZXRbNV07CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSBmb3IgU0JSOiAlZFxuIiwgc2JyLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzdGFydF9taW4gPSAoKHRlbXAgPDwgNykgKyAoc2JyLT5zYW1wbGVfcmF0ZSA+PiAxKSkgLyBzYnItPnNhbXBsZV9yYXRlOworICAgIHN0b3BfbWluICA9ICgodGVtcCA8PCA4KSArIChzYnItPnNhbXBsZV9yYXRlID4+IDEpKSAvIHNici0+c2FtcGxlX3JhdGU7CisKKyAgICBzYnItPmtbMF0gPSBzdGFydF9taW4gKyBzYnJfb2Zmc2V0X3B0cltzcGVjdHJ1bS0+YnNfc3RhcnRfZnJlcV07CisKKyAgICBpZiAoc3BlY3RydW0tPmJzX3N0b3BfZnJlcSA8IDE0KSB7CisgICAgICAgIHNici0+a1syXSA9IHN0b3BfbWluOworICAgICAgICBtYWtlX2JhbmRzKHN0b3BfZGssIHN0b3BfbWluLCA2NCwgMTMpOworICAgICAgICBxc29ydChzdG9wX2RrLCAxMywgc2l6ZW9mKHN0b3BfZGtbMF0pLCBxc29ydF9jb21wYXJpc29uX2Z1bmN0aW9uX2ludDE2KTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHNwZWN0cnVtLT5ic19zdG9wX2ZyZXE7IGsrKykKKyAgICAgICAgICAgIHNici0+a1syXSArPSBzdG9wX2RrW2tdOworICAgIH0gZWxzZSBpZiAoc3BlY3RydW0tPmJzX3N0b3BfZnJlcSA9PSAxNCkgeworICAgICAgICBzYnItPmtbMl0gPSAyKnNici0+a1swXTsKKyAgICB9IGVsc2UgaWYgKHNwZWN0cnVtLT5ic19zdG9wX2ZyZXEgPT0gMTUpIHsKKyAgICAgICAgc2JyLT5rWzJdID0gMypzYnItPmtbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkludmFsaWQgYnNfc3RvcF9mcmVxOiAlZFxuIiwgc3BlY3RydW0tPmJzX3N0b3BfZnJlcSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc2JyLT5rWzJdID0gRkZNSU4oNjQsIHNici0+a1syXSk7CisKKyAgICAvLyBSZXF1aXJlbWVudHMgKDE0NDk2LTMgc3AwNCBwMjA1KQorICAgIGlmIChzYnItPnNhbXBsZV9yYXRlIDw9IDMyMDAwKSB7CisgICAgICAgIG1heF9xbWZfc3ViYmFuZHMgPSA0ODsKKyAgICB9IGVsc2UgaWYgKHNici0+c2FtcGxlX3JhdGUgPT0gNDQxMDApIHsKKyAgICAgICAgbWF4X3FtZl9zdWJiYW5kcyA9IDM1OworICAgIH0gZWxzZSBpZiAoc2JyLT5zYW1wbGVfcmF0ZSA+PSA0ODAwMCkKKyAgICAgICAgbWF4X3FtZl9zdWJiYW5kcyA9IDMyOworICAgIGVsc2UKKyAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKworICAgIGlmIChzYnItPmtbMl0gLSBzYnItPmtbMF0gPiBtYXhfcW1mX3N1YmJhbmRzKSB7CisgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIGJpdHN0cmVhbSwgdG9vIG1hbnkgUU1GIHN1YmJhbmRzOiAlZFxuIiwgc2JyLT5rWzJdIC0gc2JyLT5rWzBdKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghc3BlY3RydW0tPmJzX2ZyZXFfc2NhbGUpIHsKKyAgICAgICAgaW50IGRrLCBrMmRpZmY7CisKKyAgICAgICAgZGsgPSBzcGVjdHJ1bS0+YnNfYWx0ZXJfc2NhbGUgKyAxOworICAgICAgICBzYnItPm5fbWFzdGVyID0gKChzYnItPmtbMl0gLSBzYnItPmtbMF0gKyAoZGsmMikpID4+IGRrKSA8PCAxOworICAgICAgICBpZiAoY2hlY2tfbl9tYXN0ZXIoYWMtPmF2Y3R4LCBzYnItPm5fbWFzdGVyLCBzYnItPnNwZWN0cnVtX3BhcmFtcy5ic194b3Zlcl9iYW5kKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBmb3IgKGsgPSAxOyBrIDw9IHNici0+bl9tYXN0ZXI7IGsrKykKKyAgICAgICAgICAgIHNici0+Zl9tYXN0ZXJba10gPSBkazsKKworICAgICAgICBrMmRpZmYgPSBzYnItPmtbMl0gLSBzYnItPmtbMF0gLSBzYnItPm5fbWFzdGVyICogZGs7CisgICAgICAgIGlmIChrMmRpZmYgPCAwKSB7CisgICAgICAgICAgICBzYnItPmZfbWFzdGVyWzFdLS07CisgICAgICAgICAgICBzYnItPmZfbWFzdGVyWzJdLT0gKGsyZGlmZiA8IC0xKTsKKyAgICAgICAgfSBlbHNlIGlmIChrMmRpZmYpIHsKKyAgICAgICAgICAgIHNici0+Zl9tYXN0ZXJbc2JyLT5uX21hc3Rlcl0rKzsKKyAgICAgICAgfQorCisgICAgICAgIHNici0+Zl9tYXN0ZXJbMF0gPSBzYnItPmtbMF07CisgICAgICAgIGZvciAoayA9IDE7IGsgPD0gc2JyLT5uX21hc3RlcjsgaysrKQorICAgICAgICAgICAgc2JyLT5mX21hc3RlcltrXSArPSBzYnItPmZfbWFzdGVyW2sgLSAxXTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBoYWxmX2JhbmRzID0gNyAtIHNwZWN0cnVtLT5ic19mcmVxX3NjYWxlOyAgICAgIC8vIGJzX2ZyZXFfc2NhbGUgID0gezEsMiwzfQorICAgICAgICBpbnQgdHdvX3JlZ2lvbnMsIG51bV9iYW5kc18wOworICAgICAgICBpbnQgdmRrMF9tYXgsIHZkazFfbWluOworICAgICAgICBpbnQxNl90IHZrMFs0OV07CisKKyAgICAgICAgaWYgKDQ5ICogc2JyLT5rWzJdID4gMTEwICogc2JyLT5rWzBdKSB7CisgICAgICAgICAgICB0d29fcmVnaW9ucyA9IDE7CisgICAgICAgICAgICBzYnItPmtbMV0gPSAyICogc2JyLT5rWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHdvX3JlZ2lvbnMgPSAwOworICAgICAgICAgICAgc2JyLT5rWzFdID0gc2JyLT5rWzJdOworICAgICAgICB9CisKKyAgICAgICAgbnVtX2JhbmRzXzAgPSBscmludGYoaGFsZl9iYW5kcyAqIGxvZzJmKHNici0+a1sxXSAvIChmbG9hdClzYnItPmtbMF0pKSAqIDI7CisKKyAgICAgICAgaWYgKG51bV9iYW5kc18wIDw9IDApIHsgLy8gUmVxdWlyZW1lbnRzICgxNDQ5Ni0zIHNwMDQgcDIwNSkKKyAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbnVtX2JhbmRzXzA6ICVkXG4iLCBudW1fYmFuZHNfMCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICB2azBbMF0gPSAwOworCisgICAgICAgIG1ha2VfYmFuZHModmswKzEsIHNici0+a1swXSwgc2JyLT5rWzFdLCBudW1fYmFuZHNfMCk7CisKKyAgICAgICAgcXNvcnQodmswICsgMSwgbnVtX2JhbmRzXzAsIHNpemVvZih2azBbMV0pLCBxc29ydF9jb21wYXJpc29uX2Z1bmN0aW9uX2ludDE2KTsKKyAgICAgICAgdmRrMF9tYXggPSB2azBbbnVtX2JhbmRzXzBdOworCisgICAgICAgIHZrMFswXSA9IHNici0+a1swXTsKKyAgICAgICAgZm9yIChrID0gMTsgayA8PSBudW1fYmFuZHNfMDsgaysrKSB7CisgICAgICAgICAgICBpZiAodmswW2tdIDw9IDApIHsgLy8gUmVxdWlyZW1lbnRzICgxNDQ5Ni0zIHNwMDQgcDIwNSkKKyAgICAgICAgICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHZEazBbJWRdOiAlZFxuIiwgaywgdmswW2tdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2azBba10gKz0gdmswW2stMV07CisgICAgICAgIH0KKworICAgICAgICBpZiAodHdvX3JlZ2lvbnMpIHsKKyAgICAgICAgICAgIGludDE2X3QgdmsxWzQ5XTsKKyAgICAgICAgICAgIGZsb2F0IGludndhcnAgPSBzcGVjdHJ1bS0+YnNfYWx0ZXJfc2NhbGUgPyAwLjc2OTIzMDc2OTIzMDc2OTIzMDc3ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDEuMGY7IC8vIGJzX2FsdGVyX3NjYWxlID0gezAsMX0KKyAgICAgICAgICAgIGludCBudW1fYmFuZHNfMSA9IGxyaW50ZihoYWxmX2JhbmRzICogaW52d2FycCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMmYoc2JyLT5rWzJdIC8gKGZsb2F0KXNici0+a1sxXSkpICogMjsKKworICAgICAgICAgICAgbWFrZV9iYW5kcyh2azErMSwgc2JyLT5rWzFdLCBzYnItPmtbMl0sIG51bV9iYW5kc18xKTsKKworICAgICAgICAgICAgdmRrMV9taW4gPSBhcnJheV9taW5faW50MTYodmsxICsgMSwgbnVtX2JhbmRzXzEpOworCisgICAgICAgICAgICBpZiAodmRrMV9taW4gPCB2ZGswX21heCkgeworICAgICAgICAgICAgICAgIGludCBjaGFuZ2U7CisgICAgICAgICAgICAgICAgcXNvcnQodmsxICsgMSwgbnVtX2JhbmRzXzEsIHNpemVvZih2azFbMV0pLCBxc29ydF9jb21wYXJpc29uX2Z1bmN0aW9uX2ludDE2KTsKKyAgICAgICAgICAgICAgICBjaGFuZ2UgPSBGRk1JTih2ZGswX21heCAtIHZrMVsxXSwgKHZrMVtudW1fYmFuZHNfMV0gLSB2azFbMV0pID4+IDEpOworICAgICAgICAgICAgICAgIHZrMVsxXSAgICAgICAgICAgKz0gY2hhbmdlOworICAgICAgICAgICAgICAgIHZrMVtudW1fYmFuZHNfMV0gLT0gY2hhbmdlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBxc29ydCh2azEgKyAxLCBudW1fYmFuZHNfMSwgc2l6ZW9mKHZrMVsxXSksIHFzb3J0X2NvbXBhcmlzb25fZnVuY3Rpb25faW50MTYpOworCisgICAgICAgICAgICB2azFbMF0gPSBzYnItPmtbMV07CisgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDw9IG51bV9iYW5kc18xOyBrKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodmsxW2tdIDw9IDApIHsgLy8gUmVxdWlyZW1lbnRzICgxNDQ5Ni0zIHNwMDQgcDIwNSkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCB2RGsxWyVkXTogJWRcbiIsIGssIHZrMVtrXSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmsxW2tdICs9IHZrMVtrLTFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzYnItPm5fbWFzdGVyID0gbnVtX2JhbmRzXzAgKyBudW1fYmFuZHNfMTsKKyAgICAgICAgICAgIGlmIChjaGVja19uX21hc3RlcihhYy0+YXZjdHgsIHNici0+bl9tYXN0ZXIsIHNici0+c3BlY3RydW1fcGFyYW1zLmJzX3hvdmVyX2JhbmQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIG1lbWNweSgmc2JyLT5mX21hc3RlclswXSwgICAgICAgICAgICAgICB2azAsCisgICAgICAgICAgICAgICAgICAgKG51bV9iYW5kc18wICsgMSkgKiBzaXplb2Yoc2JyLT5mX21hc3RlclswXSkpOworICAgICAgICAgICAgbWVtY3B5KCZzYnItPmZfbWFzdGVyW251bV9iYW5kc18wICsgMV0sIHZrMSArIDEsCisgICAgICAgICAgICAgICAgICAgIG51bV9iYW5kc18xICAgICAgKiBzaXplb2Yoc2JyLT5mX21hc3RlclswXSkpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzYnItPm5fbWFzdGVyID0gbnVtX2JhbmRzXzA7CisgICAgICAgICAgICBpZiAoY2hlY2tfbl9tYXN0ZXIoYWMtPmF2Y3R4LCBzYnItPm5fbWFzdGVyLCBzYnItPnNwZWN0cnVtX3BhcmFtcy5ic194b3Zlcl9iYW5kKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBtZW1jcHkoc2JyLT5mX21hc3RlciwgdmswLCAobnVtX2JhbmRzXzAgKyAxKSAqIHNpemVvZihzYnItPmZfbWFzdGVyWzBdKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLy8vIEhpZ2ggRnJlcXVlbmN5IEdlbmVyYXRpb24gLSBQYXRjaCBDb25zdHJ1Y3Rpb24gKDE0NDk2LTMgc3AwNCBwMjE2IGZpZy4gNC40NikKK3N0YXRpYyBpbnQgc2JyX2hmX2NhbGNfbnBhdGNoZXMoQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIpCit7CisgICAgaW50IGksIGssIHNiID0gMDsKKyAgICBpbnQgbXNiID0gc2JyLT5rWzBdOworICAgIGludCB1c2IgPSBzYnItPmt4WzFdOworICAgIGludCBnb2FsX3NiID0gKCgxMDAwIDw8IDExKSArIChzYnItPnNhbXBsZV9yYXRlID4+IDEpKSAvIHNici0+c2FtcGxlX3JhdGU7CisKKyAgICBzYnItPm51bV9wYXRjaGVzID0gMDsKKworICAgIGlmIChnb2FsX3NiIDwgc2JyLT5reFsxXSArIHNici0+bVsxXSkgeworICAgICAgICBmb3IgKGsgPSAwOyBzYnItPmZfbWFzdGVyW2tdIDwgZ29hbF9zYjsgaysrKSA7CisgICAgfSBlbHNlCisgICAgICAgIGsgPSBzYnItPm5fbWFzdGVyOworCisgICAgZG8geworICAgICAgICBpbnQgb2RkID0gMDsKKyAgICAgICAgZm9yIChpID0gazsgaSA9PSBrIHx8IHNiID4gKHNici0+a1swXSAtIDEgKyBtc2IgLSBvZGQpOyBpLS0pIHsKKyAgICAgICAgICAgIHNiID0gc2JyLT5mX21hc3RlcltpXTsKKyAgICAgICAgICAgIG9kZCA9IChzYiArIHNici0+a1swXSkgJiAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVxdWlyZW1lbnRzICgxNDQ5Ni0zIHNwMDQgcDIwNSkgc2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGF0Y2hlcyB0byA1LgorICAgICAgICAvLyBBZnRlciB0aGlzIGNoZWNrIHRoZSBmaW5hbCBudW1iZXIgb2YgcGF0Y2hlcyBjYW4gc3RpbGwgYmUgc2l4IHdoaWNoIGlzCisgICAgICAgIC8vIGlsbGVnYWwgaG93ZXZlciB0aGUgQ29kaW5nIFRlY2hub2xvZ2llcyBkZWNvZGVyIGNoZWNrIHN0cmVhbSBoYXMgYSBmaW5hbAorICAgICAgICAvLyBjb3VudCBvZiA2IHBhdGNoZXMKKyAgICAgICAgaWYgKHNici0+bnVtX3BhdGNoZXMgPiA1KSB7CisgICAgICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBwYXRjaGVzOiAlZFxuIiwgc2JyLT5udW1fcGF0Y2hlcyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzYnItPnBhdGNoX251bV9zdWJiYW5kc1tzYnItPm51bV9wYXRjaGVzXSAgPSBGRk1BWChzYiAtIHVzYiwgMCk7CisgICAgICAgIHNici0+cGF0Y2hfc3RhcnRfc3ViYmFuZFtzYnItPm51bV9wYXRjaGVzXSA9IHNici0+a1swXSAtIG9kZCAtIHNici0+cGF0Y2hfbnVtX3N1YmJhbmRzW3Nici0+bnVtX3BhdGNoZXNdOworCisgICAgICAgIGlmIChzYnItPnBhdGNoX251bV9zdWJiYW5kc1tzYnItPm51bV9wYXRjaGVzXSA+IDApIHsKKyAgICAgICAgICAgIHVzYiA9IHNiOworICAgICAgICAgICAgbXNiID0gc2I7CisgICAgICAgICAgICBzYnItPm51bV9wYXRjaGVzKys7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbXNiID0gc2JyLT5reFsxXTsKKworICAgICAgICBpZiAoc2JyLT5mX21hc3RlcltrXSAtIHNiIDwgMykKKyAgICAgICAgICAgIGsgPSBzYnItPm5fbWFzdGVyOworICAgIH0gd2hpbGUgKHNiICE9IHNici0+a3hbMV0gKyBzYnItPm1bMV0pOworCisgICAgaWYgKHNici0+bnVtX3BhdGNoZXMgPiAxICYmCisgICAgICAgIHNici0+cGF0Y2hfbnVtX3N1YmJhbmRzW3Nici0+bnVtX3BhdGNoZXMgLSAxXSA8IDMpCisgICAgICAgIHNici0+bnVtX3BhdGNoZXMtLTsKKworICAgIHJldHVybiAwOworfQorCisvLy8gRGVyaXZlZCBGcmVxdWVuY3kgQmFuZCBUYWJsZXMgKDE0NDk2LTMgc3AwNCBwMTk3KQorc3RhdGljIGludCBzYnJfbWFrZV9mX2Rlcml2ZWQoQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIpCit7CisgICAgaW50IGssIHRlbXA7CisKKyAgICBzYnItPm5bMV0gPSBzYnItPm5fbWFzdGVyIC0gc2JyLT5zcGVjdHJ1bV9wYXJhbXMuYnNfeG92ZXJfYmFuZDsKKyAgICBzYnItPm5bMF0gPSAoc2JyLT5uWzFdICsgMSkgPj4gMTsKKworICAgIG1lbWNweShzYnItPmZfdGFibGVoaWdoLCAmc2JyLT5mX21hc3RlcltzYnItPnNwZWN0cnVtX3BhcmFtcy5ic194b3Zlcl9iYW5kXSwKKyAgICAgICAgICAgKHNici0+blsxXSArIDEpICogc2l6ZW9mKHNici0+Zl9tYXN0ZXJbMF0pKTsKKyAgICBzYnItPm1bMV0gPSBzYnItPmZfdGFibGVoaWdoW3Nici0+blsxXV0gLSBzYnItPmZfdGFibGVoaWdoWzBdOworICAgIHNici0+a3hbMV0gPSBzYnItPmZfdGFibGVoaWdoWzBdOworCisgICAgLy8gUmVxdWlyZW1lbnRzICgxNDQ5Ni0zIHNwMDQgcDIwNSkKKyAgICBpZiAoc2JyLT5reFsxXSArIHNici0+bVsxXSA+IDY0KSB7CisgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJTdG9wIGZyZXF1ZW5jeSBib3JkZXIgdG9vIGhpZ2g6ICVkXG4iLCBzYnItPmt4WzFdICsgc2JyLT5tWzFdKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc2JyLT5reFsxXSA+IDMyKSB7CisgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlN0YXJ0IGZyZXF1ZW5jeSBib3JkZXIgdG9vIGhpZ2g6ICVkXG4iLCBzYnItPmt4WzFdKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHNici0+Zl90YWJsZWxvd1swXSA9IHNici0+Zl90YWJsZWhpZ2hbMF07CisgICAgdGVtcCA9IHNici0+blsxXSAmIDE7CisgICAgZm9yIChrID0gMTsgayA8PSBzYnItPm5bMF07IGsrKykKKyAgICAgICAgc2JyLT5mX3RhYmxlbG93W2tdID0gc2JyLT5mX3RhYmxlaGlnaFsyICogayAtIHRlbXBdOworCisgICAgc2JyLT5uX3EgPSBGRk1BWCgxLCBscmludGYoc2JyLT5zcGVjdHJ1bV9wYXJhbXMuYnNfbm9pc2VfYmFuZHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJmKHNici0+a1syXSAvIChmbG9hdClzYnItPmt4WzFdKSkpOyAvLyAwIDw9IGJzX25vaXNlX2JhbmRzIDw9IDMKKyAgICBpZiAoc2JyLT5uX3EgPiA1KSB7CisgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IG5vaXNlIGZsb29yIHNjYWxlIGZhY3RvcnM6ICVkXG4iLCBzYnItPm5fcSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzYnItPmZfdGFibGVub2lzZVswXSA9IHNici0+Zl90YWJsZWxvd1swXTsKKyAgICB0ZW1wID0gMDsKKyAgICBmb3IgKGsgPSAxOyBrIDw9IHNici0+bl9xOyBrKyspIHsKKyAgICAgICAgdGVtcCArPSAoc2JyLT5uWzBdIC0gdGVtcCkgLyAoc2JyLT5uX3EgKyAxIC0gayk7CisgICAgICAgIHNici0+Zl90YWJsZW5vaXNlW2tdID0gc2JyLT5mX3RhYmxlbG93W3RlbXBdOworICAgIH0KKworICAgIGlmIChzYnJfaGZfY2FsY19ucGF0Y2hlcyhhYywgc2JyKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHNicl9tYWtlX2ZfdGFibGVsaW0oc2JyKTsKKworICAgIHNici0+ZGF0YVswXS5mX2luZGV4bm9pc2UgPSAwOworICAgIHNici0+ZGF0YVsxXS5mX2luZGV4bm9pc2UgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZ2V0X2JpdHMxX3ZlY3RvcihHZXRCaXRDb250ZXh0ICpnYiwgdWludDhfdCAqdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbGVtZW50cykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHM7IGkrKykgeworICAgICAgICB2ZWNbaV0gPSBnZXRfYml0czEoZ2IpOworICAgIH0KK30KKworLyoqIGNlaWwobG9nMihpbmRleCsxKSkgKi8KK3N0YXRpYyBjb25zdCBpbnQ4X3QgY2VpbF9sb2cyW10gPSB7CisgICAgMCwgMSwgMiwgMiwgMywgMywKK307CisKK3N0YXRpYyBpbnQgcmVhZF9zYnJfZ3JpZChBQUNDb250ZXh0ICphYywgU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYiwgU0JSRGF0YSAqY2hfZGF0YSkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBic19wb2ludGVyID0gMDsKKyAgICAvLyBmcmFtZUxlbmd0aEZsYWcgPyAxNSA6IDE2OyA5NjAgc2FtcGxlIGxlbmd0aCBmcmFtZXMgdW5zdXBwb3J0ZWQ7IHRoaXMgdmFsdWUgaXMgbnVtVGltZVNsb3RzCisgICAgaW50IGFic19ib3JkX3RyYWlsID0gMTY7CisgICAgaW50IG51bV9yZWxfbGVhZCwgbnVtX3JlbF90cmFpbDsKKyAgICB1bnNpZ25lZCBic19udW1fZW52X29sZCA9IGNoX2RhdGEtPmJzX251bV9lbnY7CisKKyAgICBjaF9kYXRhLT5ic19mcmVxX3Jlc1swXSA9IGNoX2RhdGEtPmJzX2ZyZXFfcmVzW2NoX2RhdGEtPmJzX251bV9lbnZdOworICAgIGNoX2RhdGEtPmJzX2FtcF9yZXMgPSBzYnItPmJzX2FtcF9yZXNfaGVhZGVyOworICAgIGNoX2RhdGEtPnRfZW52X251bV9lbnZfb2xkID0gY2hfZGF0YS0+dF9lbnZbYnNfbnVtX2Vudl9vbGRdOworCisgICAgc3dpdGNoIChjaF9kYXRhLT5ic19mcmFtZV9jbGFzcyA9IGdldF9iaXRzKGdiLCAyKSkgeworICAgIGNhc2UgRklYRklYOgorICAgICAgICBjaF9kYXRhLT5ic19udW1fZW52ICAgICAgICAgICAgICAgICA9IDEgPDwgZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICBudW1fcmVsX2xlYWQgICAgICAgICAgICAgICAgICAgICAgICA9IGNoX2RhdGEtPmJzX251bV9lbnYgLSAxOworICAgICAgICBpZiAoY2hfZGF0YS0+YnNfbnVtX2VudiA9PSAxKQorICAgICAgICAgICAgY2hfZGF0YS0+YnNfYW1wX3JlcyA9IDA7CisKKyAgICAgICAgaWYgKGNoX2RhdGEtPmJzX251bV9lbnYgPiA0KSB7CisgICAgICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYml0c3RyZWFtLCB0b28gbWFueSBTQlIgZW52ZWxvcGVzIGluIEZJWEZJWCB0eXBlIFNCUiBmcmFtZTogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgY2hfZGF0YS0+YnNfbnVtX2Vudik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBjaF9kYXRhLT50X2VudlswXSAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgICAgIGNoX2RhdGEtPnRfZW52W2NoX2RhdGEtPmJzX251bV9lbnZdID0gYWJzX2JvcmRfdHJhaWw7CisKKyAgICAgICAgYWJzX2JvcmRfdHJhaWwgPSAoYWJzX2JvcmRfdHJhaWwgKyAoY2hfZGF0YS0+YnNfbnVtX2VudiA+PiAxKSkgLworICAgICAgICAgICAgICAgICAgIGNoX2RhdGEtPmJzX251bV9lbnY7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcmVsX2xlYWQ7IGkrKykKKyAgICAgICAgICAgIGNoX2RhdGEtPnRfZW52W2kgKyAxXSA9IGNoX2RhdGEtPnRfZW52W2ldICsgYWJzX2JvcmRfdHJhaWw7CisKKyAgICAgICAgY2hfZGF0YS0+YnNfZnJlcV9yZXNbMV0gPSBnZXRfYml0czEoZ2IpOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgY2hfZGF0YS0+YnNfbnVtX2VudjsgaSsrKQorICAgICAgICAgICAgY2hfZGF0YS0+YnNfZnJlcV9yZXNbaSArIDFdID0gY2hfZGF0YS0+YnNfZnJlcV9yZXNbMV07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRklYVkFSOgorICAgICAgICBhYnNfYm9yZF90cmFpbCAgICAgICAgICAgICAgICAgICAgICs9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgbnVtX3JlbF90cmFpbCAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIGNoX2RhdGEtPmJzX251bV9lbnYgICAgICAgICAgICAgICAgID0gbnVtX3JlbF90cmFpbCArIDE7CisgICAgICAgIGNoX2RhdGEtPnRfZW52WzBdICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgY2hfZGF0YS0+dF9lbnZbY2hfZGF0YS0+YnNfbnVtX2Vudl0gPSBhYnNfYm9yZF90cmFpbDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3JlbF90cmFpbDsgaSsrKQorICAgICAgICAgICAgY2hfZGF0YS0+dF9lbnZbY2hfZGF0YS0+YnNfbnVtX2VudiAtIDEgLSBpXSA9CisgICAgICAgICAgICAgICAgY2hfZGF0YS0+dF9lbnZbY2hfZGF0YS0+YnNfbnVtX2VudiAtIGldIC0gMiAqIGdldF9iaXRzKGdiLCAyKSAtIDI7CisKKyAgICAgICAgYnNfcG9pbnRlciA9IGdldF9iaXRzKGdiLCBjZWlsX2xvZzJbY2hfZGF0YS0+YnNfbnVtX2Vudl0pOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaF9kYXRhLT5ic19udW1fZW52OyBpKyspCisgICAgICAgICAgICBjaF9kYXRhLT5ic19mcmVxX3Jlc1tjaF9kYXRhLT5ic19udW1fZW52IC0gaV0gPSBnZXRfYml0czEoZ2IpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZBUkZJWDoKKyAgICAgICAgY2hfZGF0YS0+dF9lbnZbMF0gICAgICAgICAgICAgICAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIG51bV9yZWxfbGVhZCAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICBjaF9kYXRhLT5ic19udW1fZW52ICAgICAgICAgICAgICAgICA9IG51bV9yZWxfbGVhZCArIDE7CisgICAgICAgIGNoX2RhdGEtPnRfZW52W2NoX2RhdGEtPmJzX251bV9lbnZdID0gYWJzX2JvcmRfdHJhaWw7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9yZWxfbGVhZDsgaSsrKQorICAgICAgICAgICAgY2hfZGF0YS0+dF9lbnZbaSArIDFdID0gY2hfZGF0YS0+dF9lbnZbaV0gKyAyICogZ2V0X2JpdHMoZ2IsIDIpICsgMjsKKworICAgICAgICBic19wb2ludGVyID0gZ2V0X2JpdHMoZ2IsIGNlaWxfbG9nMltjaF9kYXRhLT5ic19udW1fZW52XSk7CisKKyAgICAgICAgZ2V0X2JpdHMxX3ZlY3RvcihnYiwgY2hfZGF0YS0+YnNfZnJlcV9yZXMgKyAxLCBjaF9kYXRhLT5ic19udW1fZW52KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWQVJWQVI6CisgICAgICAgIGNoX2RhdGEtPnRfZW52WzBdICAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICBhYnNfYm9yZF90cmFpbCAgICAgICAgICAgICAgICAgICAgICs9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgbnVtX3JlbF9sZWFkICAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIG51bV9yZWxfdHJhaWwgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICBjaF9kYXRhLT5ic19udW1fZW52ICAgICAgICAgICAgICAgICA9IG51bV9yZWxfbGVhZCArIG51bV9yZWxfdHJhaWwgKyAxOworCisgICAgICAgIGlmIChjaF9kYXRhLT5ic19udW1fZW52ID4gNSkgeworICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJpdHN0cmVhbSwgdG9vIG1hbnkgU0JSIGVudmVsb3BlcyBpbiBWQVJWQVIgdHlwZSBTQlIgZnJhbWU6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGNoX2RhdGEtPmJzX251bV9lbnYpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgY2hfZGF0YS0+dF9lbnZbY2hfZGF0YS0+YnNfbnVtX2Vudl0gPSBhYnNfYm9yZF90cmFpbDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3JlbF9sZWFkOyBpKyspCisgICAgICAgICAgICBjaF9kYXRhLT50X2VudltpICsgMV0gPSBjaF9kYXRhLT50X2VudltpXSArIDIgKiBnZXRfYml0cyhnYiwgMikgKyAyOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3JlbF90cmFpbDsgaSsrKQorICAgICAgICAgICAgY2hfZGF0YS0+dF9lbnZbY2hfZGF0YS0+YnNfbnVtX2VudiAtIDEgLSBpXSA9CisgICAgICAgICAgICAgICAgY2hfZGF0YS0+dF9lbnZbY2hfZGF0YS0+YnNfbnVtX2VudiAtIGldIC0gMiAqIGdldF9iaXRzKGdiLCAyKSAtIDI7CisKKyAgICAgICAgYnNfcG9pbnRlciA9IGdldF9iaXRzKGdiLCBjZWlsX2xvZzJbY2hfZGF0YS0+YnNfbnVtX2Vudl0pOworCisgICAgICAgIGdldF9iaXRzMV92ZWN0b3IoZ2IsIGNoX2RhdGEtPmJzX2ZyZXFfcmVzICsgMSwgY2hfZGF0YS0+YnNfbnVtX2Vudik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChic19wb2ludGVyID4gY2hfZGF0YS0+YnNfbnVtX2VudiArIDEpIHsKKyAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkludmFsaWQgYml0c3RyZWFtLCBic19wb2ludGVyIHBvaW50cyB0byBhIG1pZGRsZSBub2lzZSBib3JkZXIgb3V0c2lkZSB0aGUgdGltZSBib3JkZXJzIHRhYmxlOiAlZFxuIiwKKyAgICAgICAgICAgICAgIGJzX3BvaW50ZXIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChpID0gMTsgaSA8PSBjaF9kYXRhLT5ic19udW1fZW52OyBpKyspIHsKKyAgICAgICAgaWYgKGNoX2RhdGEtPnRfZW52W2ktMV0gPiBjaF9kYXRhLT50X2VudltpXSkgeworICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm9uIG1vbm90b25lIHRpbWUgYm9yZGVyc1xuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjaF9kYXRhLT5ic19udW1fbm9pc2UgPSAoY2hfZGF0YS0+YnNfbnVtX2VudiA+IDEpICsgMTsKKworICAgIGNoX2RhdGEtPnRfcVswXSAgICAgICAgICAgICAgICAgICAgID0gY2hfZGF0YS0+dF9lbnZbMF07CisgICAgY2hfZGF0YS0+dF9xW2NoX2RhdGEtPmJzX251bV9ub2lzZV0gPSBjaF9kYXRhLT50X2VudltjaF9kYXRhLT5ic19udW1fZW52XTsKKyAgICBpZiAoY2hfZGF0YS0+YnNfbnVtX25vaXNlID4gMSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgaWR4OworICAgICAgICBpZiAoY2hfZGF0YS0+YnNfZnJhbWVfY2xhc3MgPT0gRklYRklYKSB7CisgICAgICAgICAgICBpZHggPSBjaF9kYXRhLT5ic19udW1fZW52ID4+IDE7CisgICAgICAgIH0gZWxzZSBpZiAoY2hfZGF0YS0+YnNfZnJhbWVfY2xhc3MgJiAxKSB7IC8vIEZJWFZBUiBvciBWQVJWQVIKKyAgICAgICAgICAgIGlkeCA9IGNoX2RhdGEtPmJzX251bV9lbnYgLSBGRk1BWCgoaW50KWJzX3BvaW50ZXIgLSAxLCAxKTsKKyAgICAgICAgfSBlbHNlIHsgLy8gVkFSRklYCisgICAgICAgICAgICBpZiAoIWJzX3BvaW50ZXIpCisgICAgICAgICAgICAgICAgaWR4ID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJzX3BvaW50ZXIgPT0gMSkKKyAgICAgICAgICAgICAgICBpZHggPSBjaF9kYXRhLT5ic19udW1fZW52IC0gMTsKKyAgICAgICAgICAgIGVsc2UgLy8gYnNfcG9pbnRlciA+IDEKKyAgICAgICAgICAgICAgICBpZHggPSBic19wb2ludGVyIC0gMTsKKyAgICAgICAgfQorICAgICAgICBjaF9kYXRhLT50X3FbMV0gPSBjaF9kYXRhLT50X2VudltpZHhdOworICAgIH0KKworICAgIGNoX2RhdGEtPmVfYVswXSA9IC0oY2hfZGF0YS0+ZV9hWzFdICE9IGJzX251bV9lbnZfb2xkKTsgLy8gbF9BUHJldgorICAgIGNoX2RhdGEtPmVfYVsxXSA9IC0xOworICAgIGlmICgoY2hfZGF0YS0+YnNfZnJhbWVfY2xhc3MgJiAxKSAmJiBic19wb2ludGVyKSB7IC8vIEZJWFZBUiBvciBWQVJWQVIgYW5kIGJzX3BvaW50ZXIgIT0gMAorICAgICAgICBjaF9kYXRhLT5lX2FbMV0gPSBjaF9kYXRhLT5ic19udW1fZW52ICsgMSAtIGJzX3BvaW50ZXI7CisgICAgfSBlbHNlIGlmICgoY2hfZGF0YS0+YnNfZnJhbWVfY2xhc3MgPT0gMikgJiYgKGJzX3BvaW50ZXIgPiAxKSkgLy8gVkFSRklYIGFuZCBic19wb2ludGVyID4gMQorICAgICAgICBjaF9kYXRhLT5lX2FbMV0gPSBic19wb2ludGVyIC0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb3B5X3Nicl9ncmlkKFNCUkRhdGEgKmRzdCwgY29uc3QgU0JSRGF0YSAqc3JjKSB7CisgICAgLy9UaGVzZSB2YXJpYWJsZXMgYXJlIHNhdmVkIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lIHJhdGhlciB0aGFuIGNvcGllZAorICAgIGRzdC0+YnNfZnJlcV9yZXNbMF0gICAgPSBkc3QtPmJzX2ZyZXFfcmVzW2RzdC0+YnNfbnVtX2Vudl07CisgICAgZHN0LT50X2Vudl9udW1fZW52X29sZCA9IGRzdC0+dF9lbnZbZHN0LT5ic19udW1fZW52XTsKKyAgICBkc3QtPmVfYVswXSAgICAgICAgICAgID0gLShkc3QtPmVfYVsxXSAhPSBkc3QtPmJzX251bV9lbnYpOworCisgICAgLy9UaGVzZSB2YXJpYWJsZXMgYXJlIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtIGFuZCB0aGVyZWZvcmUgY29waWVkCisgICAgbWVtY3B5KGRzdC0+YnNfZnJlcV9yZXMrMSwgc3JjLT5ic19mcmVxX3JlcysxLCBzaXplb2YoZHN0LT5ic19mcmVxX3Jlcyktc2l6ZW9mKCpkc3QtPmJzX2ZyZXFfcmVzKSk7CisgICAgbWVtY3B5KGRzdC0+dF9lbnYsICAgICAgICAgc3JjLT50X2VudiwgICAgICAgICBzaXplb2YoZHN0LT50X2VudikpOworICAgIG1lbWNweShkc3QtPnRfcSwgICAgICAgICAgIHNyYy0+dF9xLCAgICAgICAgICAgc2l6ZW9mKGRzdC0+dF9xKSk7CisgICAgZHN0LT5ic19udW1fZW52ICAgICAgICA9IHNyYy0+YnNfbnVtX2VudjsKKyAgICBkc3QtPmJzX2FtcF9yZXMgICAgICAgID0gc3JjLT5ic19hbXBfcmVzOworICAgIGRzdC0+YnNfbnVtX25vaXNlICAgICAgPSBzcmMtPmJzX251bV9ub2lzZTsKKyAgICBkc3QtPmJzX2ZyYW1lX2NsYXNzICAgID0gc3JjLT5ic19mcmFtZV9jbGFzczsKKyAgICBkc3QtPmVfYVsxXSAgICAgICAgICAgID0gc3JjLT5lX2FbMV07Cit9CisKKy8vLyBSZWFkIGhvdyB0aGUgZW52ZWxvcGUgYW5kIG5vaXNlIGZsb29yIGRhdGEgaXMgZGVsdGEgY29kZWQKK3N0YXRpYyB2b2lkIHJlYWRfc2JyX2R0ZGYoU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNiciwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUkRhdGEgKmNoX2RhdGEpCit7CisgICAgZ2V0X2JpdHMxX3ZlY3RvcihnYiwgY2hfZGF0YS0+YnNfZGZfZW52LCAgIGNoX2RhdGEtPmJzX251bV9lbnYpOworICAgIGdldF9iaXRzMV92ZWN0b3IoZ2IsIGNoX2RhdGEtPmJzX2RmX25vaXNlLCBjaF9kYXRhLT5ic19udW1fbm9pc2UpOworfQorCisvLy8gUmVhZCBpbnZlcnNlIGZpbHRlcmluZyBkYXRhCitzdGF0aWMgdm9pZCByZWFkX3Nicl9pbnZmKFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJEYXRhICpjaF9kYXRhKQoreworICAgIGludCBpOworCisgICAgbWVtY3B5KGNoX2RhdGEtPmJzX2ludmZfbW9kZVsxXSwgY2hfZGF0YS0+YnNfaW52Zl9tb2RlWzBdLCA1ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2JyLT5uX3E7IGkrKykKKyAgICAgICAgY2hfZGF0YS0+YnNfaW52Zl9tb2RlWzBdW2ldID0gZ2V0X2JpdHMoZ2IsIDIpOworfQorCitzdGF0aWMgdm9pZCByZWFkX3Nicl9lbnZlbG9wZShTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUkRhdGEgKmNoX2RhdGEsIGludCBjaCkKK3sKKyAgICBpbnQgYml0czsKKyAgICBpbnQgaSwgaiwgazsKKyAgICBWTENfVFlQRSAoKnRfaHVmZilbMl0sICgqZl9odWZmKVsyXTsKKyAgICBpbnQgdF9sYXYsIGZfbGF2OworICAgIGNvbnN0IGludCBkZWx0YSA9IChjaCA9PSAxICYmIHNici0+YnNfY291cGxpbmcgPT0gMSkgKyAxOworICAgIGNvbnN0IGludCBvZGQgPSBzYnItPm5bMV0gJiAxOworCisgICAgaWYgKHNici0+YnNfY291cGxpbmcgJiYgY2gpIHsKKyAgICAgICAgaWYgKGNoX2RhdGEtPmJzX2FtcF9yZXMpIHsKKyAgICAgICAgICAgIGJpdHMgICA9IDU7CisgICAgICAgICAgICB0X2h1ZmYgPSB2bGNfc2JyW1RfSFVGRk1BTl9FTlZfQkFMXzNfMERCXS50YWJsZTsKKyAgICAgICAgICAgIHRfbGF2ICA9IHZsY19zYnJfbGF2W1RfSFVGRk1BTl9FTlZfQkFMXzNfMERCXTsKKyAgICAgICAgICAgIGZfaHVmZiA9IHZsY19zYnJbRl9IVUZGTUFOX0VOVl9CQUxfM18wREJdLnRhYmxlOworICAgICAgICAgICAgZl9sYXYgID0gdmxjX3Nicl9sYXZbRl9IVUZGTUFOX0VOVl9CQUxfM18wREJdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYml0cyAgID0gNjsKKyAgICAgICAgICAgIHRfaHVmZiA9IHZsY19zYnJbVF9IVUZGTUFOX0VOVl9CQUxfMV81REJdLnRhYmxlOworICAgICAgICAgICAgdF9sYXYgID0gdmxjX3Nicl9sYXZbVF9IVUZGTUFOX0VOVl9CQUxfMV81REJdOworICAgICAgICAgICAgZl9odWZmID0gdmxjX3NicltGX0hVRkZNQU5fRU5WX0JBTF8xXzVEQl0udGFibGU7CisgICAgICAgICAgICBmX2xhdiAgPSB2bGNfc2JyX2xhdltGX0hVRkZNQU5fRU5WX0JBTF8xXzVEQl07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY2hfZGF0YS0+YnNfYW1wX3JlcykgeworICAgICAgICAgICAgYml0cyAgID0gNjsKKyAgICAgICAgICAgIHRfaHVmZiA9IHZsY19zYnJbVF9IVUZGTUFOX0VOVl8zXzBEQl0udGFibGU7CisgICAgICAgICAgICB0X2xhdiAgPSB2bGNfc2JyX2xhdltUX0hVRkZNQU5fRU5WXzNfMERCXTsKKyAgICAgICAgICAgIGZfaHVmZiA9IHZsY19zYnJbRl9IVUZGTUFOX0VOVl8zXzBEQl0udGFibGU7CisgICAgICAgICAgICBmX2xhdiAgPSB2bGNfc2JyX2xhdltGX0hVRkZNQU5fRU5WXzNfMERCXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJpdHMgICA9IDc7CisgICAgICAgICAgICB0X2h1ZmYgPSB2bGNfc2JyW1RfSFVGRk1BTl9FTlZfMV81REJdLnRhYmxlOworICAgICAgICAgICAgdF9sYXYgID0gdmxjX3Nicl9sYXZbVF9IVUZGTUFOX0VOVl8xXzVEQl07CisgICAgICAgICAgICBmX2h1ZmYgPSB2bGNfc2JyW0ZfSFVGRk1BTl9FTlZfMV81REJdLnRhYmxlOworICAgICAgICAgICAgZl9sYXYgID0gdmxjX3Nicl9sYXZbRl9IVUZGTUFOX0VOVl8xXzVEQl07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hfZGF0YS0+YnNfbnVtX2VudjsgaSsrKSB7CisgICAgICAgIGlmIChjaF9kYXRhLT5ic19kZl9lbnZbaV0pIHsKKyAgICAgICAgICAgIC8vIGJzX2ZyZXFfcmVzWzBdID09IGJzX2ZyZXFfcmVzW2JzX251bV9lbnZdIGZyb20gcHJldiBmcmFtZQorICAgICAgICAgICAgaWYgKGNoX2RhdGEtPmJzX2ZyZXFfcmVzW2kgKyAxXSA9PSBjaF9kYXRhLT5ic19mcmVxX3Jlc1tpXSkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzYnItPm5bY2hfZGF0YS0+YnNfZnJlcV9yZXNbaSArIDFdXTsgaisrKQorICAgICAgICAgICAgICAgICAgICBjaF9kYXRhLT5lbnZfZmFjc1tpICsgMV1bal0gPSBjaF9kYXRhLT5lbnZfZmFjc1tpXVtqXSArIGRlbHRhICogKGdldF92bGMyKGdiLCB0X2h1ZmYsIDksIDMpIC0gdF9sYXYpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaF9kYXRhLT5ic19mcmVxX3Jlc1tpICsgMV0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2JyLT5uW2NoX2RhdGEtPmJzX2ZyZXFfcmVzW2kgKyAxXV07IGorKykgeworICAgICAgICAgICAgICAgICAgICBrID0gKGogKyBvZGQpID4+IDE7IC8vIGZpbmQgayBzdWNoIHRoYXQgZl90YWJsZWxvd1trXSA8PSBmX3RhYmxlaGlnaFtqXSA8IGZfdGFibGVsb3dbayArIDFdCisgICAgICAgICAgICAgICAgICAgIGNoX2RhdGEtPmVudl9mYWNzW2kgKyAxXVtqXSA9IGNoX2RhdGEtPmVudl9mYWNzW2ldW2tdICsgZGVsdGEgKiAoZ2V0X3ZsYzIoZ2IsIHRfaHVmZiwgOSwgMykgLSB0X2xhdik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2JyLT5uW2NoX2RhdGEtPmJzX2ZyZXFfcmVzW2kgKyAxXV07IGorKykgeworICAgICAgICAgICAgICAgICAgICBrID0gaiA/IDIqaiAtIG9kZCA6IDA7IC8vIGZpbmQgayBzdWNoIHRoYXQgZl90YWJsZWhpZ2hba10gPT0gZl90YWJsZWxvd1tqXQorICAgICAgICAgICAgICAgICAgICBjaF9kYXRhLT5lbnZfZmFjc1tpICsgMV1bal0gPSBjaF9kYXRhLT5lbnZfZmFjc1tpXVtrXSArIGRlbHRhICogKGdldF92bGMyKGdiLCB0X2h1ZmYsIDksIDMpIC0gdF9sYXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoX2RhdGEtPmVudl9mYWNzW2kgKyAxXVswXSA9IGRlbHRhICogZ2V0X2JpdHMoZ2IsIGJpdHMpOyAvLyBic19lbnZfc3RhcnRfdmFsdWVfYmFsYW5jZQorICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IHNici0+bltjaF9kYXRhLT5ic19mcmVxX3Jlc1tpICsgMV1dOyBqKyspCisgICAgICAgICAgICAgICAgY2hfZGF0YS0+ZW52X2ZhY3NbaSArIDFdW2pdID0gY2hfZGF0YS0+ZW52X2ZhY3NbaSArIDFdW2ogLSAxXSArIGRlbHRhICogKGdldF92bGMyKGdiLCBmX2h1ZmYsIDksIDMpIC0gZl9sYXYpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9hc3NpZ24gMHRoIGVsZW1lbnRzIG9mIGVudl9mYWNzIGZyb20gbGFzdCBlbGVtZW50cworICAgIG1lbWNweShjaF9kYXRhLT5lbnZfZmFjc1swXSwgY2hfZGF0YS0+ZW52X2ZhY3NbY2hfZGF0YS0+YnNfbnVtX2Vudl0sCisgICAgICAgICAgIHNpemVvZihjaF9kYXRhLT5lbnZfZmFjc1swXSkpOworfQorCitzdGF0aWMgdm9pZCByZWFkX3Nicl9ub2lzZShTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUkRhdGEgKmNoX2RhdGEsIGludCBjaCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBWTENfVFlQRSAoKnRfaHVmZilbMl0sICgqZl9odWZmKVsyXTsKKyAgICBpbnQgdF9sYXYsIGZfbGF2OworICAgIGludCBkZWx0YSA9IChjaCA9PSAxICYmIHNici0+YnNfY291cGxpbmcgPT0gMSkgKyAxOworCisgICAgaWYgKHNici0+YnNfY291cGxpbmcgJiYgY2gpIHsKKyAgICAgICAgdF9odWZmID0gdmxjX3NicltUX0hVRkZNQU5fTk9JU0VfQkFMXzNfMERCXS50YWJsZTsKKyAgICAgICAgdF9sYXYgID0gdmxjX3Nicl9sYXZbVF9IVUZGTUFOX05PSVNFX0JBTF8zXzBEQl07CisgICAgICAgIGZfaHVmZiA9IHZsY19zYnJbRl9IVUZGTUFOX0VOVl9CQUxfM18wREJdLnRhYmxlOworICAgICAgICBmX2xhdiAgPSB2bGNfc2JyX2xhdltGX0hVRkZNQU5fRU5WX0JBTF8zXzBEQl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgdF9odWZmID0gdmxjX3NicltUX0hVRkZNQU5fTk9JU0VfM18wREJdLnRhYmxlOworICAgICAgICB0X2xhdiAgPSB2bGNfc2JyX2xhdltUX0hVRkZNQU5fTk9JU0VfM18wREJdOworICAgICAgICBmX2h1ZmYgPSB2bGNfc2JyW0ZfSFVGRk1BTl9FTlZfM18wREJdLnRhYmxlOworICAgICAgICBmX2xhdiAgPSB2bGNfc2JyX2xhdltGX0hVRkZNQU5fRU5WXzNfMERCXTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hfZGF0YS0+YnNfbnVtX25vaXNlOyBpKyspIHsKKyAgICAgICAgaWYgKGNoX2RhdGEtPmJzX2RmX25vaXNlW2ldKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2JyLT5uX3E7IGorKykKKyAgICAgICAgICAgICAgICBjaF9kYXRhLT5ub2lzZV9mYWNzW2kgKyAxXVtqXSA9IGNoX2RhdGEtPm5vaXNlX2ZhY3NbaV1bal0gKyBkZWx0YSAqIChnZXRfdmxjMihnYiwgdF9odWZmLCA5LCAyKSAtIHRfbGF2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoX2RhdGEtPm5vaXNlX2ZhY3NbaSArIDFdWzBdID0gZGVsdGEgKiBnZXRfYml0cyhnYiwgNSk7IC8vIGJzX25vaXNlX3N0YXJ0X3ZhbHVlX2JhbGFuY2Ugb3IgYnNfbm9pc2Vfc3RhcnRfdmFsdWVfbGV2ZWwKKyAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCBzYnItPm5fcTsgaisrKQorICAgICAgICAgICAgICAgIGNoX2RhdGEtPm5vaXNlX2ZhY3NbaSArIDFdW2pdID0gY2hfZGF0YS0+bm9pc2VfZmFjc1tpICsgMV1baiAtIDFdICsgZGVsdGEgKiAoZ2V0X3ZsYzIoZ2IsIGZfaHVmZiwgOSwgMykgLSBmX2xhdik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL2Fzc2lnbiAwdGggZWxlbWVudHMgb2Ygbm9pc2VfZmFjcyBmcm9tIGxhc3QgZWxlbWVudHMKKyAgICBtZW1jcHkoY2hfZGF0YS0+bm9pc2VfZmFjc1swXSwgY2hfZGF0YS0+bm9pc2VfZmFjc1tjaF9kYXRhLT5ic19udW1fbm9pc2VdLAorICAgICAgICAgICBzaXplb2YoY2hfZGF0YS0+bm9pc2VfZmFjc1swXSkpOworfQorCitzdGF0aWMgdm9pZCByZWFkX3Nicl9leHRlbnNpb24oQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJzX2V4dGVuc2lvbl9pZCwgaW50ICpudW1fYml0c19sZWZ0KQoreworICAgIHN3aXRjaCAoYnNfZXh0ZW5zaW9uX2lkKSB7CisgICAgY2FzZSBFWFRFTlNJT05fSURfUFM6CisgICAgICAgIGlmICghYWMtPm9jWzFdLm00YWMucHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhcmFtZXRyaWMgU3RlcmVvIHNpZ25hbGVkIHRvIGJlIG5vdC1wcmVzZW50IGJ1dCB3YXMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbS5cbiIpOworICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsICpudW1fYml0c19sZWZ0KTsgLy8gYnNfZmlsbF9iaXRzCisgICAgICAgICAgICAqbnVtX2JpdHNfbGVmdCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisjaWYgMQorICAgICAgICAgICAgKm51bV9iaXRzX2xlZnQgLT0gZmZfcHNfcmVhZF9kYXRhKGFjLT5hdmN0eCwgZ2IsICZzYnItPnBzLCAqbnVtX2JpdHNfbGVmdCk7CisgICAgICAgICAgICBhYy0+YXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0FBQ19IRV9WMjsKKyNlbHNlCisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhYy0+YXZjdHgsICJQYXJhbWV0cmljIFN0ZXJlbyIpOworICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsICpudW1fYml0c19sZWZ0KTsgLy8gYnNfZmlsbF9iaXRzCisgICAgICAgICAgICAqbnVtX2JpdHNfbGVmdCA9IDA7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBzb21lIGZpbGVzIGNvbnRhaW4gMC1wYWRkaW5nCisgICAgICAgIGlmIChic19leHRlbnNpb25faWQgfHwgKm51bV9iaXRzX2xlZnQgPiAxNiB8fCBzaG93X2JpdHMoZ2IsICpudW1fYml0c19sZWZ0KSkKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhYy0+YXZjdHgsICJSZXNlcnZlZCBTQlIgZXh0ZW5zaW9ucyIpOworICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgKm51bV9iaXRzX2xlZnQpOyAvLyBic19maWxsX2JpdHMKKyAgICAgICAgKm51bV9iaXRzX2xlZnQgPSAwOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9zYnJfc2luZ2xlX2NoYW5uZWxfZWxlbWVudChBQUNDb250ZXh0ICphYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaWYgKGdldF9iaXRzMShnYikpIC8vIGJzX2RhdGFfZXh0cmEKKyAgICAgICAgc2tpcF9iaXRzKGdiLCA0KTsgLy8gYnNfcmVzZXJ2ZWQKKworICAgIGlmIChyZWFkX3Nicl9ncmlkKGFjLCBzYnIsIGdiLCAmc2JyLT5kYXRhWzBdKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJlYWRfc2JyX2R0ZGYoc2JyLCBnYiwgJnNici0+ZGF0YVswXSk7CisgICAgcmVhZF9zYnJfaW52ZihzYnIsIGdiLCAmc2JyLT5kYXRhWzBdKTsKKyAgICByZWFkX3Nicl9lbnZlbG9wZShzYnIsIGdiLCAmc2JyLT5kYXRhWzBdLCAwKTsKKyAgICByZWFkX3Nicl9ub2lzZShzYnIsIGdiLCAmc2JyLT5kYXRhWzBdLCAwKTsKKworICAgIGlmICgoc2JyLT5kYXRhWzBdLmJzX2FkZF9oYXJtb25pY19mbGFnID0gZ2V0X2JpdHMxKGdiKSkpCisgICAgICAgIGdldF9iaXRzMV92ZWN0b3IoZ2IsIHNici0+ZGF0YVswXS5ic19hZGRfaGFybW9uaWMsIHNici0+blsxXSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3Nicl9jaGFubmVsX3BhaXJfZWxlbWVudChBQUNDb250ZXh0ICphYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgICAgLy8gYnNfZGF0YV9leHRyYQorICAgICAgICBza2lwX2JpdHMoZ2IsIDgpOyAvLyBic19yZXNlcnZlZAorCisgICAgaWYgKChzYnItPmJzX2NvdXBsaW5nID0gZ2V0X2JpdHMxKGdiKSkpIHsKKyAgICAgICAgaWYgKHJlYWRfc2JyX2dyaWQoYWMsIHNiciwgZ2IsICZzYnItPmRhdGFbMF0pKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjb3B5X3Nicl9ncmlkKCZzYnItPmRhdGFbMV0sICZzYnItPmRhdGFbMF0pOworICAgICAgICByZWFkX3Nicl9kdGRmKHNiciwgZ2IsICZzYnItPmRhdGFbMF0pOworICAgICAgICByZWFkX3Nicl9kdGRmKHNiciwgZ2IsICZzYnItPmRhdGFbMV0pOworICAgICAgICByZWFkX3Nicl9pbnZmKHNiciwgZ2IsICZzYnItPmRhdGFbMF0pOworICAgICAgICBtZW1jcHkoc2JyLT5kYXRhWzFdLmJzX2ludmZfbW9kZVsxXSwgc2JyLT5kYXRhWzFdLmJzX2ludmZfbW9kZVswXSwgc2l6ZW9mKHNici0+ZGF0YVsxXS5ic19pbnZmX21vZGVbMF0pKTsKKyAgICAgICAgbWVtY3B5KHNici0+ZGF0YVsxXS5ic19pbnZmX21vZGVbMF0sIHNici0+ZGF0YVswXS5ic19pbnZmX21vZGVbMF0sIHNpemVvZihzYnItPmRhdGFbMV0uYnNfaW52Zl9tb2RlWzBdKSk7CisgICAgICAgIHJlYWRfc2JyX2VudmVsb3BlKHNiciwgZ2IsICZzYnItPmRhdGFbMF0sIDApOworICAgICAgICByZWFkX3Nicl9ub2lzZShzYnIsIGdiLCAmc2JyLT5kYXRhWzBdLCAwKTsKKyAgICAgICAgcmVhZF9zYnJfZW52ZWxvcGUoc2JyLCBnYiwgJnNici0+ZGF0YVsxXSwgMSk7CisgICAgICAgIHJlYWRfc2JyX25vaXNlKHNiciwgZ2IsICZzYnItPmRhdGFbMV0sIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyZWFkX3Nicl9ncmlkKGFjLCBzYnIsIGdiLCAmc2JyLT5kYXRhWzBdKSB8fAorICAgICAgICAgICAgcmVhZF9zYnJfZ3JpZChhYywgc2JyLCBnYiwgJnNici0+ZGF0YVsxXSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlYWRfc2JyX2R0ZGYoc2JyLCBnYiwgJnNici0+ZGF0YVswXSk7CisgICAgICAgIHJlYWRfc2JyX2R0ZGYoc2JyLCBnYiwgJnNici0+ZGF0YVsxXSk7CisgICAgICAgIHJlYWRfc2JyX2ludmYoc2JyLCBnYiwgJnNici0+ZGF0YVswXSk7CisgICAgICAgIHJlYWRfc2JyX2ludmYoc2JyLCBnYiwgJnNici0+ZGF0YVsxXSk7CisgICAgICAgIHJlYWRfc2JyX2VudmVsb3BlKHNiciwgZ2IsICZzYnItPmRhdGFbMF0sIDApOworICAgICAgICByZWFkX3Nicl9lbnZlbG9wZShzYnIsIGdiLCAmc2JyLT5kYXRhWzFdLCAxKTsKKyAgICAgICAgcmVhZF9zYnJfbm9pc2Uoc2JyLCBnYiwgJnNici0+ZGF0YVswXSwgMCk7CisgICAgICAgIHJlYWRfc2JyX25vaXNlKHNiciwgZ2IsICZzYnItPmRhdGFbMV0sIDEpOworICAgIH0KKworICAgIGlmICgoc2JyLT5kYXRhWzBdLmJzX2FkZF9oYXJtb25pY19mbGFnID0gZ2V0X2JpdHMxKGdiKSkpCisgICAgICAgIGdldF9iaXRzMV92ZWN0b3IoZ2IsIHNici0+ZGF0YVswXS5ic19hZGRfaGFybW9uaWMsIHNici0+blsxXSk7CisgICAgaWYgKChzYnItPmRhdGFbMV0uYnNfYWRkX2hhcm1vbmljX2ZsYWcgPSBnZXRfYml0czEoZ2IpKSkKKyAgICAgICAgZ2V0X2JpdHMxX3ZlY3RvcihnYiwgc2JyLT5kYXRhWzFdLmJzX2FkZF9oYXJtb25pYywgc2JyLT5uWzFdKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfc2JyX2RhdGEoQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBpZF9hYWMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCA9IGdldF9iaXRzX2NvdW50KGdiKTsKKworICAgIGlmIChpZF9hYWMgPT0gVFlQRV9TQ0UgfHwgaWRfYWFjID09IFRZUEVfQ0NFKSB7CisgICAgICAgIGlmIChyZWFkX3Nicl9zaW5nbGVfY2hhbm5lbF9lbGVtZW50KGFjLCBzYnIsIGdiKSkgeworICAgICAgICAgICAgc2JyX3R1cm5vZmYoc2JyKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRfYml0c19jb3VudChnYikgLSBjbnQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlkX2FhYyA9PSBUWVBFX0NQRSkgeworICAgICAgICBpZiAocmVhZF9zYnJfY2hhbm5lbF9wYWlyX2VsZW1lbnQoYWMsIHNiciwgZ2IpKSB7CisgICAgICAgICAgICBzYnJfdHVybm9mZihzYnIpOworICAgICAgICAgICAgcmV0dXJuIGdldF9iaXRzX2NvdW50KGdiKSAtIGNudDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICJJbnZhbGlkIGJpdHN0cmVhbSAtIGNhbm5vdCBhcHBseSBTQlIgdG8gZWxlbWVudCB0eXBlICVkXG4iLCBpZF9hYWMpOworICAgICAgICBzYnJfdHVybm9mZihzYnIpOworICAgICAgICByZXR1cm4gZ2V0X2JpdHNfY291bnQoZ2IpIC0gY250OworICAgIH0KKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvLyBic19leHRlbmRlZF9kYXRhCisgICAgICAgIGludCBudW1fYml0c19sZWZ0ID0gZ2V0X2JpdHMoZ2IsIDQpOyAvLyBic19leHRlbnNpb25fc2l6ZQorICAgICAgICBpZiAobnVtX2JpdHNfbGVmdCA9PSAxNSkKKyAgICAgICAgICAgIG51bV9iaXRzX2xlZnQgKz0gZ2V0X2JpdHMoZ2IsIDgpOyAvLyBic19lc2NfY291bnQKKworICAgICAgICBudW1fYml0c19sZWZ0IDw8PSAzOworICAgICAgICB3aGlsZSAobnVtX2JpdHNfbGVmdCA+IDcpIHsKKyAgICAgICAgICAgIG51bV9iaXRzX2xlZnQgLT0gMjsKKyAgICAgICAgICAgIHJlYWRfc2JyX2V4dGVuc2lvbihhYywgc2JyLCBnYiwgZ2V0X2JpdHMoZ2IsIDIpLCAmbnVtX2JpdHNfbGVmdCk7IC8vIGJzX2V4dGVuc2lvbl9pZAorICAgICAgICB9CisgICAgICAgIGlmIChudW1fYml0c19sZWZ0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU0JSIEV4dGVuc2lvbiBvdmVyIHJlYWQuXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVtX2JpdHNfbGVmdCA+IDApCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIG51bV9iaXRzX2xlZnQpOworICAgIH0KKworICAgIHJldHVybiBnZXRfYml0c19jb3VudChnYikgLSBjbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHNicl9yZXNldChBQUNDb250ZXh0ICphYywgU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNicikKK3sKKyAgICBpbnQgZXJyOworICAgIGVyciA9IHNicl9tYWtlX2ZfbWFzdGVyKGFjLCBzYnIsICZzYnItPnNwZWN0cnVtX3BhcmFtcyk7CisgICAgaWYgKGVyciA+PSAwKQorICAgICAgICBlcnIgPSBzYnJfbWFrZV9mX2Rlcml2ZWQoYWMsIHNicik7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlNCUiByZXNldCBmYWlsZWQuIFN3aXRjaGluZyBTQlIgdG8gcHVyZSB1cHNhbXBsaW5nIG1vZGUuXG4iKTsKKyAgICAgICAgc2JyX3R1cm5vZmYoc2JyKTsKKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24gZXh0ZW5zaW9uIGRhdGE7IHJlZmVyZW5jZTogdGFibGUgNC41NS4KKyAqCisgKiBAcGFyYW0gICBjcmMgZmxhZyBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiBDUkMgY2hlY2tzdW0KKyAqIEBwYXJhbSAgIGNudCBsZW5ndGggb2YgVFlQRV9GSUwgc3ludGFjdGljIGVsZW1lbnQgaW4gYnl0ZXMKKyAqCisgKiBAcmV0dXJuICBSZXR1cm5zIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBmcm9tIHRoZSBUWVBFX0ZJTCBlbGVtZW50LgorICovCitpbnQgZmZfZGVjb2RlX3Nicl9leHRlbnNpb24oQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2JfaG9zdCwgaW50IGNyYywgaW50IGNudCwgaW50IGlkX2FhYykKK3sKKyAgICB1bnNpZ25lZCBpbnQgbnVtX3Nicl9iaXRzID0gMCwgbnVtX2FsaWduX2JpdHM7CisgICAgdW5zaWduZWQgYnl0ZXNfcmVhZDsKKyAgICBHZXRCaXRDb250ZXh0IGdiYyA9ICpnYl9ob3N0LCAqZ2IgPSAmZ2JjOworICAgIHNraXBfYml0c19sb25nKGdiX2hvc3QsIGNudCo4IC0gNCk7CisKKyAgICBzYnItPnJlc2V0ID0gMDsKKworICAgIGlmICghc2JyLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgc2JyLT5zYW1wbGVfcmF0ZSA9IDIgKiBhYy0+b2NbMV0ubTRhYy5zYW1wbGVfcmF0ZTsgLy9UT0RPIHVzZSB0aGUgbm9taW5hbCBzYW1wbGUgcmF0ZSBmb3IgYXJiaXRyYXJ5IHNhbXBsZSByYXRlIHN1cHBvcnQKKyAgICBpZiAoIWFjLT5vY1sxXS5tNGFjLmV4dF9zYW1wbGVfcmF0ZSkKKyAgICAgICAgYWMtPm9jWzFdLm00YWMuZXh0X3NhbXBsZV9yYXRlID0gMiAqIGFjLT5vY1sxXS5tNGFjLnNhbXBsZV9yYXRlOworCisgICAgaWYgKGNyYykgeworICAgICAgICBza2lwX2JpdHMoZ2IsIDEwKTsgLy8gYnNfc2JyX2NyY19iaXRzOyBUT0RPIC0gaW1wbGVtZW50IENSQyBjaGVjaworICAgICAgICBudW1fc2JyX2JpdHMgKz0gMTA7CisgICAgfQorCisgICAgLy9TYXZlIHNvbWUgc3RhdGUgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUuCisgICAgc2JyLT5reFswXSA9IHNici0+a3hbMV07CisgICAgc2JyLT5tWzBdID0gc2JyLT5tWzFdOworICAgIHNici0+a3hfYW5kX21fcHVzaGVkID0gMTsKKworICAgIG51bV9zYnJfYml0cysrOworICAgIGlmIChnZXRfYml0czEoZ2IpKSAvLyBic19oZWFkZXJfZmxhZworICAgICAgICBudW1fc2JyX2JpdHMgKz0gcmVhZF9zYnJfaGVhZGVyKHNiciwgZ2IpOworCisgICAgaWYgKHNici0+cmVzZXQpCisgICAgICAgIHNicl9yZXNldChhYywgc2JyKTsKKworICAgIGlmIChzYnItPnN0YXJ0KQorICAgICAgICBudW1fc2JyX2JpdHMgICs9IHJlYWRfc2JyX2RhdGEoYWMsIHNiciwgZ2IsIGlkX2FhYyk7CisKKyAgICBudW1fYWxpZ25fYml0cyA9ICgoY250IDw8IDMpIC0gNCAtIG51bV9zYnJfYml0cykgJiA3OworICAgIGJ5dGVzX3JlYWQgPSAoKG51bV9zYnJfYml0cyArIG51bV9hbGlnbl9iaXRzICsgNCkgPj4gMyk7CisKKyAgICBpZiAoYnl0ZXNfcmVhZCA+IGNudCkgeworICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRXhwZWN0ZWQgdG8gcmVhZCAlZCBTQlIgYnl0ZXMgYWN0dWFsbHkgcmVhZCAlZC5cbiIsIGNudCwgYnl0ZXNfcmVhZCk7CisgICAgfQorICAgIHJldHVybiBjbnQ7Cit9CisKKy8vLyBEZXF1YW50aXphdGlvbiBhbmQgc3RlcmVvIGRlY29kaW5nICgxNDQ5Ni0zIHNwMDQgcDIwMykKK3N0YXRpYyB2b2lkIHNicl9kZXF1YW50KFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsIGludCBpZF9hYWMpCit7CisgICAgaW50IGssIGU7CisgICAgaW50IGNoOworCisgICAgaWYgKGlkX2FhYyA9PSBUWVBFX0NQRSAmJiBzYnItPmJzX2NvdXBsaW5nKSB7CisgICAgICAgIGZsb2F0IGFscGhhICAgICAgPSBzYnItPmRhdGFbMF0uYnNfYW1wX3JlcyA/ICAxLjBmIDogIDAuNWY7CisgICAgICAgIGZsb2F0IHBhbl9vZmZzZXQgPSBzYnItPmRhdGFbMF0uYnNfYW1wX3JlcyA/IDEyLjBmIDogMjQuMGY7CisgICAgICAgIGZvciAoZSA9IDE7IGUgPD0gc2JyLT5kYXRhWzBdLmJzX251bV9lbnY7IGUrKykgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNici0+bltzYnItPmRhdGFbMF0uYnNfZnJlcV9yZXNbZV1dOyBrKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ZW1wMSA9IGV4cDJmKHNici0+ZGF0YVswXS5lbnZfZmFjc1tlXVtrXSAqIGFscGhhICsgNy4wZik7CisgICAgICAgICAgICAgICAgZmxvYXQgdGVtcDIgPSBleHAyZigocGFuX29mZnNldCAtIHNici0+ZGF0YVsxXS5lbnZfZmFjc1tlXVtrXSkgKiBhbHBoYSk7CisgICAgICAgICAgICAgICAgZmxvYXQgZmFjOworICAgICAgICAgICAgICAgIGlmICh0ZW1wMSA+IDFFMjApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImVudmVsb3BlIHNjYWxlZmFjdG9yIG92ZXJmbG93IGluIGRlcXVhbnRcbiIpOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZhYyAgID0gdGVtcDEgLyAoMS4wZiArIHRlbXAyKTsKKyAgICAgICAgICAgICAgICBzYnItPmRhdGFbMF0uZW52X2ZhY3NbZV1ba10gPSBmYWM7CisgICAgICAgICAgICAgICAgc2JyLT5kYXRhWzFdLmVudl9mYWNzW2VdW2tdID0gZmFjICogdGVtcDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChlID0gMTsgZSA8PSBzYnItPmRhdGFbMF0uYnNfbnVtX25vaXNlOyBlKyspIHsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzYnItPm5fcTsgaysrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdGVtcDEgPSBleHAyZihOT0lTRV9GTE9PUl9PRkZTRVQgLSBzYnItPmRhdGFbMF0ubm9pc2VfZmFjc1tlXVtrXSArIDEpOworICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAyID0gZXhwMmYoMTIgLSBzYnItPmRhdGFbMV0ubm9pc2VfZmFjc1tlXVtrXSk7CisgICAgICAgICAgICAgICAgZmxvYXQgZmFjOworICAgICAgICAgICAgICAgIGlmICh0ZW1wMSA+IDFFMjApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImVudmVsb3BlIHNjYWxlZmFjdG9yIG92ZXJmbG93IGluIGRlcXVhbnRcbiIpOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZhYyA9IHRlbXAxIC8gKDEuMGYgKyB0ZW1wMik7CisgICAgICAgICAgICAgICAgc2JyLT5kYXRhWzBdLm5vaXNlX2ZhY3NbZV1ba10gPSBmYWM7CisgICAgICAgICAgICAgICAgc2JyLT5kYXRhWzFdLm5vaXNlX2ZhY3NbZV1ba10gPSBmYWMgKiB0ZW1wMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIFNDRSBvciBvbmUgbm9uLWNvdXBsZWQgQ1BFCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IChpZF9hYWMgPT0gVFlQRV9DUEUpICsgMTsgY2grKykgeworICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBzYnItPmRhdGFbY2hdLmJzX2FtcF9yZXMgPyAxLjBmIDogMC41ZjsKKyAgICAgICAgICAgIGZvciAoZSA9IDE7IGUgPD0gc2JyLT5kYXRhW2NoXS5ic19udW1fZW52OyBlKyspCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNici0+bltzYnItPmRhdGFbY2hdLmJzX2ZyZXFfcmVzW2VdXTsgaysrKXsKKyAgICAgICAgICAgICAgICAgICAgc2JyLT5kYXRhW2NoXS5lbnZfZmFjc1tlXVtrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBleHAyZihhbHBoYSAqIHNici0+ZGF0YVtjaF0uZW52X2ZhY3NbZV1ba10gKyA2LjBmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNici0+ZGF0YVtjaF0uZW52X2ZhY3NbZV1ba10gPiAxRTIwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiZW52ZWxvcGUgc2NhbGVmYWN0b3Igb3ZlcmZsb3cgaW4gZGVxdWFudFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzYnItPmRhdGFbY2hdLmVudl9mYWNzW2VdW2tdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChlID0gMTsgZSA8PSBzYnItPmRhdGFbY2hdLmJzX251bV9ub2lzZTsgZSsrKQorICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzYnItPm5fcTsgaysrKQorICAgICAgICAgICAgICAgICAgICBzYnItPmRhdGFbY2hdLm5vaXNlX2ZhY3NbZV1ba10gPQorICAgICAgICAgICAgICAgICAgICAgICAgZXhwMmYoTk9JU0VfRkxPT1JfT0ZGU0VUIC0gc2JyLT5kYXRhW2NoXS5ub2lzZV9mYWNzW2VdW2tdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBBbmFseXNpcyBRTUYgQmFuayAoMTQ0OTYtMyBzcDA0IHAyMDYpCisgKgorICogQHBhcmFtICAgeCAgICAgICBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IHNhbXBsZSB3aW5kb3cKKyAqIEBwYXJhbSAgIFcgICAgICAgYXJyYXkgb2YgY29tcGxleC12YWx1ZWQgc2FtcGxlcyBzcGxpdCBpbnRvIHN1YmJhbmRzCisgKi8KKyNpZm5kZWYgc2JyX3FtZl9hbmFseXNpcworc3RhdGljIHZvaWQgc2JyX3FtZl9hbmFseXNpcyhBVkZsb2F0RFNQQ29udGV4dCAqZHNwLCBGRlRDb250ZXh0ICptZGN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJEU1BDb250ZXh0ICpzYnJkc3AsIGNvbnN0IGZsb2F0ICppbiwgZmxvYXQgKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHpbMzIwXSwgZmxvYXQgV1syXVszMl1bMzJdWzJdLCBpbnQgYnVmX2lkeCkKK3sKKyAgICBpbnQgaTsKKyAgICBtZW1jcHkoeCAgICAsIHgrMTAyNCwgKDMyMC0zMikqc2l6ZW9mKHhbMF0pKTsKKyAgICBtZW1jcHkoeCsyODgsIGluLCAgICAgICAgIDEwMjQqc2l6ZW9mKHhbMF0pKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeyAvLyBudW1UaW1lU2xvdHMqUkFURSA9IDE2KjIgYXMgOTYwIHNhbXBsZSBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgbm90IHN1cHBvcnRlZAorICAgICAgICBkc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2Uoeiwgc2JyX3FtZl93aW5kb3dfZHMsIHgsIDMyMCk7CisgICAgICAgIHNicmRzcC0+c3VtNjR4NSh6KTsKKyAgICAgICAgc2JyZHNwLT5xbWZfcHJlX3NodWZmbGUoeik7CisgICAgICAgIG1kY3QtPmltZGN0X2hhbGYobWRjdCwgeiwgeis2NCk7CisgICAgICAgIHNicmRzcC0+cW1mX3Bvc3Rfc2h1ZmZsZShXW2J1Zl9pZHhdW2ldLCB6KTsKKyAgICAgICAgeCArPSAzMjsKKyAgICB9Cit9CisjZW5kaWYKKworLyoqCisgKiBTeW50aGVzaXMgUU1GIEJhbmsgKDE0NDk2LTMgc3AwNCBwMjA2KSBhbmQgRG93bnNhbXBsZWQgU3ludGhlc2lzIFFNRiBCYW5rCisgKiAoMTQ0OTYtMyBzcDA0IHAyMDYpCisgKi8KKyNpZm5kZWYgc2JyX3FtZl9zeW50aGVzaXMKK3N0YXRpYyB2b2lkIHNicl9xbWZfc3ludGhlc2lzKEZGVENvbnRleHQgKm1kY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJEU1BDb250ZXh0ICpzYnJkc3AsIEFWRmxvYXREU1BDb250ZXh0ICpkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0LCBmbG9hdCBYWzJdWzM4XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtZGN0X2J1ZlsyXVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqdjAsIGludCAqdl9vZmYsIGNvbnN0IHVuc2lnbmVkIGludCBkaXYpCit7CisgICAgaW50IGksIG47CisgICAgY29uc3QgZmxvYXQgKnNicl9xbWZfd2luZG93ID0gZGl2ID8gc2JyX3FtZl93aW5kb3dfZHMgOiBzYnJfcW1mX3dpbmRvd191czsKKyAgICBjb25zdCBpbnQgc3RlcCA9IDEyOCA+PiBkaXY7CisgICAgZmxvYXQgKnY7CisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgICAgaWYgKCp2X29mZiA8IHN0ZXApIHsKKyAgICAgICAgICAgIGludCBzYXZlZF9zYW1wbGVzID0gKDEyODAgLSAxMjgpID4+IGRpdjsKKyAgICAgICAgICAgIG1lbWNweSgmdjBbU0JSX1NZTlRIRVNJU19CVUZfU0laRSAtIHNhdmVkX3NhbXBsZXNdLCB2MCwgc2F2ZWRfc2FtcGxlcyAqIHNpemVvZihmbG9hdCkpOworICAgICAgICAgICAgKnZfb2ZmID0gU0JSX1NZTlRIRVNJU19CVUZfU0laRSAtIHNhdmVkX3NhbXBsZXMgLSBzdGVwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnZfb2ZmIC09IHN0ZXA7CisgICAgICAgIH0KKyAgICAgICAgdiA9IHYwICsgKnZfb2ZmOworICAgICAgICBpZiAoZGl2KSB7CisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMzI7IG4rKykgeworICAgICAgICAgICAgICAgIFhbMF1baV1bICAgbl0gPSAtWFswXVtpXVtuXTsKKyAgICAgICAgICAgICAgICBYWzBdW2ldWzMyK25dID0gIFhbMV1baV1bMzEtbl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZGN0LT5pbWRjdF9oYWxmKG1kY3QsIG1kY3RfYnVmWzBdLCBYWzBdW2ldKTsKKyAgICAgICAgICAgIHNicmRzcC0+cW1mX2RlaW50X25lZyh2LCBtZGN0X2J1ZlswXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzYnJkc3AtPm5lZ19vZGRfNjQoWFsxXVtpXSk7CisgICAgICAgICAgICBtZGN0LT5pbWRjdF9oYWxmKG1kY3QsIG1kY3RfYnVmWzBdLCBYWzBdW2ldKTsKKyAgICAgICAgICAgIG1kY3QtPmltZGN0X2hhbGYobWRjdCwgbWRjdF9idWZbMV0sIFhbMV1baV0pOworICAgICAgICAgICAgc2JyZHNwLT5xbWZfZGVpbnRfYmZseSh2LCBtZGN0X2J1ZlsxXSwgbWRjdF9idWZbMF0pOworICAgICAgICB9CisgICAgICAgIGRzcC0+dmVjdG9yX2ZtdWwgICAgKG91dCwgdiAgICAgICAgICAgICAgICAsIHNicl9xbWZfd2luZG93ICAgICAgICAgICAgICAgICAgICAgICAsIDY0ID4+IGRpdik7CisgICAgICAgIGRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICggMTkyID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKCA2NCA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgIGRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICggMjU2ID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKDEyOCA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgIGRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICggNDQ4ID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKDE5MiA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgIGRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICggNTEyID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKDI1NiA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgIGRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICggNzA0ID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKDMyMCA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgIGRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICggNzY4ID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKDM4NCA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgIGRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICggOTYwID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKDQ0OCA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgIGRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICgxMDI0ID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKDUxMiA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgIGRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICgxMjE2ID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKDU3NiA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgIG91dCArPSA2NCA+PiBkaXY7CisgICAgfQorfQorI2VuZGlmCisKKy8qKiBIaWdoIEZyZXF1ZW5jeSBHZW5lcmF0aW9uICgxNDQ5Ni0zIHNwMDQgcDIxNCspIGFuZCBJbnZlcnNlIEZpbHRlcmluZworICogKDE0NDk2LTMgc3AwNCBwMjE0KQorICogV2FybmluZzogVGhpcyByb3V0aW5lIGRvZXMgbm90IHNlZW0gbnVtZXJpY2FsbHkgc3RhYmxlLgorICovCitzdGF0aWMgdm9pZCBzYnJfaGZfaW52ZXJzZV9maWx0ZXIoU0JSRFNQQ29udGV4dCAqZHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICgqYWxwaGEwKVsyXSwgZmxvYXQgKCphbHBoYTEpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IFhfbG93WzMyXVs0MF1bMl0sIGludCBrMCkKK3sKKyAgICBpbnQgazsKKyAgICBmb3IgKGsgPSAwOyBrIDwgazA7IGsrKykgeworICAgICAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCBwaGksIFszXSwgWzJdWzJdKTsKKyAgICAgICAgZmxvYXQgZGs7CisKKyAgICAgICAgZHNwLT5hdXRvY29ycmVsYXRlKFhfbG93W2tdLCBwaGkpOworCisgICAgICAgIGRrID0gIHBoaVsyXVsxXVswXSAqIHBoaVsxXVswXVswXSAtCisgICAgICAgICAgICAgKHBoaVsxXVsxXVswXSAqIHBoaVsxXVsxXVswXSArIHBoaVsxXVsxXVsxXSAqIHBoaVsxXVsxXVsxXSkgLyAxLjAwMDAwMWY7CisKKyAgICAgICAgaWYgKCFkaykgeworICAgICAgICAgICAgYWxwaGExW2tdWzBdID0gMDsKKyAgICAgICAgICAgIGFscGhhMVtrXVsxXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbG9hdCB0ZW1wX3JlYWwsIHRlbXBfaW07CisgICAgICAgICAgICB0ZW1wX3JlYWwgPSBwaGlbMF1bMF1bMF0gKiBwaGlbMV1bMV1bMF0gLQorICAgICAgICAgICAgICAgICAgICAgICAgcGhpWzBdWzBdWzFdICogcGhpWzFdWzFdWzFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBoaVswXVsxXVswXSAqIHBoaVsxXVswXVswXTsKKyAgICAgICAgICAgIHRlbXBfaW0gICA9IHBoaVswXVswXVswXSAqIHBoaVsxXVsxXVsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICBwaGlbMF1bMF1bMV0gKiBwaGlbMV1bMV1bMF0gLQorICAgICAgICAgICAgICAgICAgICAgICAgcGhpWzBdWzFdWzFdICogcGhpWzFdWzBdWzBdOworCisgICAgICAgICAgICBhbHBoYTFba11bMF0gPSB0ZW1wX3JlYWwgLyBkazsKKyAgICAgICAgICAgIGFscGhhMVtrXVsxXSA9IHRlbXBfaW0gICAvIGRrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwaGlbMV1bMF1bMF0pIHsKKyAgICAgICAgICAgIGFscGhhMFtrXVswXSA9IDA7CisgICAgICAgICAgICBhbHBoYTBba11bMV0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxvYXQgdGVtcF9yZWFsLCB0ZW1wX2ltOworICAgICAgICAgICAgdGVtcF9yZWFsID0gcGhpWzBdWzBdWzBdICsgYWxwaGExW2tdWzBdICogcGhpWzFdWzFdWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhMVtrXVsxXSAqIHBoaVsxXVsxXVsxXTsKKyAgICAgICAgICAgIHRlbXBfaW0gICA9IHBoaVswXVswXVsxXSArIGFscGhhMVtrXVsxXSAqIHBoaVsxXVsxXVswXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYTFba11bMF0gKiBwaGlbMV1bMV1bMV07CisKKyAgICAgICAgICAgIGFscGhhMFtrXVswXSA9IC10ZW1wX3JlYWwgLyBwaGlbMV1bMF1bMF07CisgICAgICAgICAgICBhbHBoYTBba11bMV0gPSAtdGVtcF9pbSAgIC8gcGhpWzFdWzBdWzBdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFscGhhMVtrXVswXSAqIGFscGhhMVtrXVswXSArIGFscGhhMVtrXVsxXSAqIGFscGhhMVtrXVsxXSA+PSAxNi4wZiB8fAorICAgICAgICAgICBhbHBoYTBba11bMF0gKiBhbHBoYTBba11bMF0gKyBhbHBoYTBba11bMV0gKiBhbHBoYTBba11bMV0gPj0gMTYuMGYpIHsKKyAgICAgICAgICAgIGFscGhhMVtrXVswXSA9IDA7CisgICAgICAgICAgICBhbHBoYTFba11bMV0gPSAwOworICAgICAgICAgICAgYWxwaGEwW2tdWzBdID0gMDsKKyAgICAgICAgICAgIGFscGhhMFtrXVsxXSA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBDaGlycCBGYWN0b3JzICgxNDQ5Ni0zIHNwMDQgcDIxNCkKK3N0YXRpYyB2b2lkIHNicl9jaGlycChTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyLCBTQlJEYXRhICpjaF9kYXRhKQoreworICAgIGludCBpOworICAgIGZsb2F0IG5ld19idzsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgYndfdGFiW10gPSB7IDAuMGYsIDAuNzVmLCAwLjlmLCAwLjk4ZiB9OworCisgICAgZm9yIChpID0gMDsgaSA8IHNici0+bl9xOyBpKyspIHsKKyAgICAgICAgaWYgKGNoX2RhdGEtPmJzX2ludmZfbW9kZVswXVtpXSArIGNoX2RhdGEtPmJzX2ludmZfbW9kZVsxXVtpXSA9PSAxKSB7CisgICAgICAgICAgICBuZXdfYncgPSAwLjZmOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG5ld19idyA9IGJ3X3RhYltjaF9kYXRhLT5ic19pbnZmX21vZGVbMF1baV1dOworCisgICAgICAgIGlmIChuZXdfYncgPCBjaF9kYXRhLT5id19hcnJheVtpXSkgeworICAgICAgICAgICAgbmV3X2J3ID0gMC43NWYgICAgKiBuZXdfYncgKyAwLjI1ZiAgICAqIGNoX2RhdGEtPmJ3X2FycmF5W2ldOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG5ld19idyA9IDAuOTA2MjVmICogbmV3X2J3ICsgMC4wOTM3NWYgKiBjaF9kYXRhLT5id19hcnJheVtpXTsKKyAgICAgICAgY2hfZGF0YS0+YndfYXJyYXlbaV0gPSBuZXdfYncgPCAwLjAxNTYyNWYgPyAwLjBmIDogbmV3X2J3OworICAgIH0KK30KKworLy8vIEdlbmVyYXRlIHRoZSBzdWJiYW5kIGZpbHRlcmVkIGxvd2JhbmQKK3N0YXRpYyBpbnQgc2JyX2xmX2dlbihBQUNDb250ZXh0ICphYywgU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNiciwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBYX2xvd1szMl1bNDBdWzJdLCBjb25zdCBmbG9hdCBXWzJdWzMyXVszMl1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9pZHgpCit7CisgICAgaW50IGksIGs7CisgICAgY29uc3QgaW50IHRfSEZHZW4gPSA4OworICAgIGNvbnN0IGludCBpX2YgPSAzMjsKKyAgICBtZW1zZXQoWF9sb3csIDAsIDMyKnNpemVvZigqWF9sb3cpKTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgc2JyLT5reFsxXTsgaysrKSB7CisgICAgICAgIGZvciAoaSA9IHRfSEZHZW47IGkgPCBpX2YgKyB0X0hGR2VuOyBpKyspIHsKKyAgICAgICAgICAgIFhfbG93W2tdW2ldWzBdID0gV1tidWZfaWR4XVtpIC0gdF9IRkdlbl1ba11bMF07CisgICAgICAgICAgICBYX2xvd1trXVtpXVsxXSA9IFdbYnVmX2lkeF1baSAtIHRfSEZHZW5dW2tdWzFdOworICAgICAgICB9CisgICAgfQorICAgIGJ1Zl9pZHggPSAxLWJ1Zl9pZHg7CisgICAgZm9yIChrID0gMDsgayA8IHNici0+a3hbMF07IGsrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdF9IRkdlbjsgaSsrKSB7CisgICAgICAgICAgICBYX2xvd1trXVtpXVswXSA9IFdbYnVmX2lkeF1baSArIGlfZiAtIHRfSEZHZW5dW2tdWzBdOworICAgICAgICAgICAgWF9sb3dba11baV1bMV0gPSBXW2J1Zl9pZHhdW2kgKyBpX2YgLSB0X0hGR2VuXVtrXVsxXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy8vIEhpZ2ggRnJlcXVlbmN5IEdlbmVyYXRvciAoMTQ0OTYtMyBzcDA0IHAyMTUpCitzdGF0aWMgaW50IHNicl9oZl9nZW4oQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgWF9oaWdoWzY0XVs0MF1bMl0sIGNvbnN0IGZsb2F0IFhfbG93WzMyXVs0MF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKCphbHBoYTApWzJdLCBjb25zdCBmbG9hdCAoKmFscGhhMSlbMl0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgYndfYXJyYXlbNV0sIGNvbnN0IHVpbnQ4X3QgKnRfZW52LAorICAgICAgICAgICAgICAgICAgICAgIGludCBic19udW1fZW52KQoreworICAgIGludCBqLCB4OworICAgIGludCBnID0gMDsKKyAgICBpbnQgayA9IHNici0+a3hbMV07CisgICAgZm9yIChqID0gMDsgaiA8IHNici0+bnVtX3BhdGNoZXM7IGorKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgc2JyLT5wYXRjaF9udW1fc3ViYmFuZHNbal07IHgrKywgaysrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgcCA9IHNici0+cGF0Y2hfc3RhcnRfc3ViYmFuZFtqXSArIHg7CisgICAgICAgICAgICB3aGlsZSAoZyA8PSBzYnItPm5fcSAmJiBrID49IHNici0+Zl90YWJsZW5vaXNlW2ddKQorICAgICAgICAgICAgICAgIGcrKzsKKyAgICAgICAgICAgIGctLTsKKworICAgICAgICAgICAgaWYgKGcgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRVJST1IgOiBubyBzdWJiYW5kIGZvdW5kIGZvciBmcmVxdWVuY3kgJWRcbiIsIGspOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2JyLT5kc3AuaGZfZ2VuKFhfaGlnaFtrXSArIEVOVkVMT1BFX0FESlVTVE1FTlRfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhfbG93W3BdICArIEVOVkVMT1BFX0FESlVTVE1FTlRfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhMFtwXSwgYWxwaGExW3BdLCBid19hcnJheVtnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogdF9lbnZbMF0sIDIgKiB0X2Vudltic19udW1fZW52XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGsgPCBzYnItPm1bMV0gKyBzYnItPmt4WzFdKQorICAgICAgICBtZW1zZXQoWF9oaWdoICsgaywgMCwgKHNici0+bVsxXSArIHNici0+a3hbMV0gLSBrKSAqIHNpemVvZigqWF9oaWdoKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLy8vIEdlbmVyYXRlIHRoZSBzdWJiYW5kIGZpbHRlcmVkIGxvd2JhbmQKK3N0YXRpYyBpbnQgc2JyX3hfZ2VuKFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsIGZsb2F0IFhbMl1bMzhdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IFkwWzM4XVs2NF1bMl0sIGNvbnN0IGZsb2F0IFkxWzM4XVs2NF1bMl0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBYX2xvd1szMl1bNDBdWzJdLCBpbnQgY2gpCit7CisgICAgaW50IGssIGk7CisgICAgY29uc3QgaW50IGlfZiA9IDMyOworICAgIGNvbnN0IGludCBpX1RlbXAgPSBGRk1BWCgyKnNici0+ZGF0YVtjaF0udF9lbnZfbnVtX2Vudl9vbGQgLSBpX2YsIDApOworICAgIG1lbXNldChYLCAwLCAyKnNpemVvZigqWCkpOworICAgIGZvciAoayA9IDA7IGsgPCBzYnItPmt4WzBdOyBrKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlfVGVtcDsgaSsrKSB7CisgICAgICAgICAgICBYWzBdW2ldW2tdID0gWF9sb3dba11baSArIEVOVkVMT1BFX0FESlVTVE1FTlRfT0ZGU0VUXVswXTsKKyAgICAgICAgICAgIFhbMV1baV1ba10gPSBYX2xvd1trXVtpICsgRU5WRUxPUEVfQURKVVNUTUVOVF9PRkZTRVRdWzFdOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoOyBrIDwgc2JyLT5reFswXSArIHNici0+bVswXTsgaysrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpX1RlbXA7IGkrKykgeworICAgICAgICAgICAgWFswXVtpXVtrXSA9IFkwW2kgKyBpX2ZdW2tdWzBdOworICAgICAgICAgICAgWFsxXVtpXVtrXSA9IFkwW2kgKyBpX2ZdW2tdWzFdOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChrID0gMDsgayA8IHNici0+a3hbMV07IGsrKykgeworICAgICAgICBmb3IgKGkgPSBpX1RlbXA7IGkgPCAzODsgaSsrKSB7CisgICAgICAgICAgICBYWzBdW2ldW2tdID0gWF9sb3dba11baSArIEVOVkVMT1BFX0FESlVTVE1FTlRfT0ZGU0VUXVswXTsKKyAgICAgICAgICAgIFhbMV1baV1ba10gPSBYX2xvd1trXVtpICsgRU5WRUxPUEVfQURKVVNUTUVOVF9PRkZTRVRdWzFdOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoOyBrIDwgc2JyLT5reFsxXSArIHNici0+bVsxXTsgaysrKSB7CisgICAgICAgIGZvciAoaSA9IGlfVGVtcDsgaSA8IGlfZjsgaSsrKSB7CisgICAgICAgICAgICBYWzBdW2ldW2tdID0gWTFbaV1ba11bMF07CisgICAgICAgICAgICBYWzFdW2ldW2tdID0gWTFbaV1ba11bMV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBIaWdoIEZyZXF1ZW5jeSBBZGp1c3RtZW50ICgxNDQ5Ni0zIHNwMDQgcDIxNykgYW5kIE1hcHBpbmcKKyAqICgxNDQ5Ni0zIHNwMDQgcDIxNykKKyAqLworc3RhdGljIGludCBzYnJfbWFwcGluZyhBQUNDb250ZXh0ICphYywgU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNiciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNCUkRhdGEgKmNoX2RhdGEsIGludCBlX2FbMl0pCit7CisgICAgaW50IGUsIGksIG07CisKKyAgICBtZW1zZXQoY2hfZGF0YS0+c19pbmRleG1hcHBlZFsxXSwgMCwgNypzaXplb2YoY2hfZGF0YS0+c19pbmRleG1hcHBlZFsxXSkpOworICAgIGZvciAoZSA9IDA7IGUgPCBjaF9kYXRhLT5ic19udW1fZW52OyBlKyspIHsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGlsaW0gPSBzYnItPm5bY2hfZGF0YS0+YnNfZnJlcV9yZXNbZSArIDFdXTsKKyAgICAgICAgdWludDE2X3QgKnRhYmxlID0gY2hfZGF0YS0+YnNfZnJlcV9yZXNbZSArIDFdID8gc2JyLT5mX3RhYmxlaGlnaCA6IHNici0+Zl90YWJsZWxvdzsKKyAgICAgICAgaW50IGs7CisKKyAgICAgICAgaWYgKHNici0+a3hbMV0gIT0gdGFibGVbMF0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImt4ICE9IGZfdGFibGV7aGlnaCxsb3d9WzBdLiAiCisgICAgICAgICAgICAgICAgICAgIkRlcml2ZWQgZnJlcXVlbmN5IHRhYmxlcyB3ZXJlIG5vdCByZWdlbmVyYXRlZC5cbiIpOworICAgICAgICAgICAgc2JyX3R1cm5vZmYoc2JyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWxpbTsgaSsrKQorICAgICAgICAgICAgZm9yIChtID0gdGFibGVbaV07IG0gPCB0YWJsZVtpICsgMV07IG0rKykKKyAgICAgICAgICAgICAgICBzYnItPmVfb3JpZ21hcHBlZFtlXVttIC0gc2JyLT5reFsxXV0gPSBjaF9kYXRhLT5lbnZfZmFjc1tlKzFdW2ldOworCisgICAgICAgIC8vIGNoX2RhdGEtPmJzX251bV9ub2lzZSA+IDEgPT4gMiBub2lzZSBmbG9vcnMKKyAgICAgICAgayA9IChjaF9kYXRhLT5ic19udW1fbm9pc2UgPiAxKSAmJiAoY2hfZGF0YS0+dF9lbnZbZV0gPj0gY2hfZGF0YS0+dF9xWzFdKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNici0+bl9xOyBpKyspCisgICAgICAgICAgICBmb3IgKG0gPSBzYnItPmZfdGFibGVub2lzZVtpXTsgbSA8IHNici0+Zl90YWJsZW5vaXNlW2kgKyAxXTsgbSsrKQorICAgICAgICAgICAgICAgIHNici0+cV9tYXBwZWRbZV1bbSAtIHNici0+a3hbMV1dID0gY2hfZGF0YS0+bm9pc2VfZmFjc1trKzFdW2ldOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzYnItPm5bMV07IGkrKykgeworICAgICAgICAgICAgaWYgKGNoX2RhdGEtPmJzX2FkZF9oYXJtb25pY19mbGFnKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IG1fbWlkcG9pbnQgPQorICAgICAgICAgICAgICAgICAgICAoc2JyLT5mX3RhYmxlaGlnaFtpXSArIHNici0+Zl90YWJsZWhpZ2hbaSArIDFdKSA+PiAxOworCisgICAgICAgICAgICAgICAgY2hfZGF0YS0+c19pbmRleG1hcHBlZFtlICsgMV1bbV9taWRwb2ludCAtIHNici0+a3hbMV1dID0gY2hfZGF0YS0+YnNfYWRkX2hhcm1vbmljW2ldICoKKyAgICAgICAgICAgICAgICAgICAgKGUgPj0gZV9hWzFdIHx8IChjaF9kYXRhLT5zX2luZGV4bWFwcGVkWzBdW21fbWlkcG9pbnQgLSBzYnItPmt4WzFdXSA9PSAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWxpbTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYWRkaXRpb25hbF9zaW51c29pZF9wcmVzZW50ID0gMDsKKyAgICAgICAgICAgIGZvciAobSA9IHRhYmxlW2ldOyBtIDwgdGFibGVbaSArIDFdOyBtKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hfZGF0YS0+c19pbmRleG1hcHBlZFtlICsgMV1bbSAtIHNici0+a3hbMV1dKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfc2ludXNvaWRfcHJlc2VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldCgmc2JyLT5zX21hcHBlZFtlXVt0YWJsZVtpXSAtIHNici0+a3hbMV1dLCBhZGRpdGlvbmFsX3NpbnVzb2lkX3ByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgKHRhYmxlW2kgKyAxXSAtIHRhYmxlW2ldKSAqIHNpemVvZihzYnItPnNfbWFwcGVkW2VdWzBdKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1jcHkoY2hfZGF0YS0+c19pbmRleG1hcHBlZFswXSwgY2hfZGF0YS0+c19pbmRleG1hcHBlZFtjaF9kYXRhLT5ic19udW1fZW52XSwgc2l6ZW9mKGNoX2RhdGEtPnNfaW5kZXhtYXBwZWRbMF0pKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8vIEVzdGltYXRpb24gb2YgY3VycmVudCBlbnZlbG9wZSAoMTQ0OTYtMyBzcDA0IHAyMTgpCitzdGF0aWMgdm9pZCBzYnJfZW52X2VzdGltYXRlKGZsb2F0ICgqZV9jdXJyKVs0OF0sIGZsb2F0IFhfaGlnaFs2NF1bNDBdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyLCBTQlJEYXRhICpjaF9kYXRhKQoreworICAgIGludCBlLCBtOworICAgIGludCBreDEgPSBzYnItPmt4WzFdOworCisgICAgaWYgKHNici0+YnNfaW50ZXJwb2xfZnJlcSkgeworICAgICAgICBmb3IgKGUgPSAwOyBlIDwgY2hfZGF0YS0+YnNfbnVtX2VudjsgZSsrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByZWNpcF9lbnZfc2l6ZSA9IDAuNWYgLyAoY2hfZGF0YS0+dF9lbnZbZSArIDFdIC0gY2hfZGF0YS0+dF9lbnZbZV0pOworICAgICAgICAgICAgaW50IGlsYiA9IGNoX2RhdGEtPnRfZW52W2VdICAgICAqIDIgKyBFTlZFTE9QRV9BREpVU1RNRU5UX09GRlNFVDsKKyAgICAgICAgICAgIGludCBpdWIgPSBjaF9kYXRhLT50X2VudltlICsgMV0gKiAyICsgRU5WRUxPUEVfQURKVVNUTUVOVF9PRkZTRVQ7CisKKyAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCBzYnItPm1bMV07IG0rKykgeworICAgICAgICAgICAgICAgIGZsb2F0IHN1bSA9IHNici0+ZHNwLnN1bV9zcXVhcmUoWF9oaWdoW20ra3gxXSArIGlsYiwgaXViIC0gaWxiKTsKKyAgICAgICAgICAgICAgICBlX2N1cnJbZV1bbV0gPSBzdW0gKiByZWNpcF9lbnZfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBrLCBwOworCisgICAgICAgIGZvciAoZSA9IDA7IGUgPCBjaF9kYXRhLT5ic19udW1fZW52OyBlKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBlbnZfc2l6ZSA9IDIgKiAoY2hfZGF0YS0+dF9lbnZbZSArIDFdIC0gY2hfZGF0YS0+dF9lbnZbZV0pOworICAgICAgICAgICAgaW50IGlsYiA9IGNoX2RhdGEtPnRfZW52W2VdICAgICAqIDIgKyBFTlZFTE9QRV9BREpVU1RNRU5UX09GRlNFVDsKKyAgICAgICAgICAgIGludCBpdWIgPSBjaF9kYXRhLT50X2VudltlICsgMV0gKiAyICsgRU5WRUxPUEVfQURKVVNUTUVOVF9PRkZTRVQ7CisgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqdGFibGUgPSBjaF9kYXRhLT5ic19mcmVxX3Jlc1tlICsgMV0gPyBzYnItPmZfdGFibGVoaWdoIDogc2JyLT5mX3RhYmxlbG93OworCisgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgc2JyLT5uW2NoX2RhdGEtPmJzX2ZyZXFfcmVzW2UgKyAxXV07IHArKykgeworICAgICAgICAgICAgICAgIGZsb2F0IHN1bSA9IDAuMGY7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGRlbiA9IGVudl9zaXplICogKHRhYmxlW3AgKyAxXSAtIHRhYmxlW3BdKTsKKworICAgICAgICAgICAgICAgIGZvciAoayA9IHRhYmxlW3BdOyBrIDwgdGFibGVbcCArIDFdOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IHNici0+ZHNwLnN1bV9zcXVhcmUoWF9oaWdoW2tdICsgaWxiLCBpdWIgLSBpbGIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdW0gLz0gZGVuOworICAgICAgICAgICAgICAgIGZvciAoayA9IHRhYmxlW3BdOyBrIDwgdGFibGVbcCArIDFdOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZV9jdXJyW2VdW2sgLSBreDFdID0gc3VtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBDYWxjdWxhdGlvbiBvZiBsZXZlbHMgb2YgYWRkaXRpb25hbCBIRiBzaWduYWwgY29tcG9uZW50cyAoMTQ0OTYtMyBzcDA0IHAyMTkpCisgKiBhbmQgQ2FsY3VsYXRpb24gb2YgZ2FpbiAoMTQ0OTYtMyBzcDA0IHAyMTkpCisgKi8KK3N0YXRpYyB2b2lkIHNicl9nYWluX2NhbGMoQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUkRhdGEgKmNoX2RhdGEsIGNvbnN0IGludCBlX2FbMl0pCit7CisgICAgaW50IGUsIGssIG07CisgICAgLy8gbWF4IGdhaW4gbGltaXRzIDogLTNkQiwgMGRCLCAzZEIsIGluZiBkQiAobGltaXRlciBvZmYpCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGxpbWdhaW5bNF0gPSB7IDAuNzA3OTUsIDEuMCwgMS40MTI1NCwgMTAwMDAwMDAwMDAgfTsKKworICAgIGZvciAoZSA9IDA7IGUgPCBjaF9kYXRhLT5ic19udW1fZW52OyBlKyspIHsKKyAgICAgICAgaW50IGRlbHRhID0gISgoZSA9PSBlX2FbMV0pIHx8IChlID09IGVfYVswXSkpOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc2JyLT5uX2xpbTsgaysrKSB7CisgICAgICAgICAgICBmbG9hdCBnYWluX2Jvb3N0LCBnYWluX21heDsKKyAgICAgICAgICAgIGZsb2F0IHN1bVsyXSA9IHsgMC4wZiwgMC4wZiB9OworICAgICAgICAgICAgZm9yIChtID0gc2JyLT5mX3RhYmxlbGltW2tdIC0gc2JyLT5reFsxXTsgbSA8IHNici0+Zl90YWJsZWxpbVtrICsgMV0gLSBzYnItPmt4WzFdOyBtKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB0ZW1wID0gc2JyLT5lX29yaWdtYXBwZWRbZV1bbV0gLyAoMS4wZiArIHNici0+cV9tYXBwZWRbZV1bbV0pOworICAgICAgICAgICAgICAgIHNici0+cV9tW2VdW21dID0gc3FydGYodGVtcCAqIHNici0+cV9tYXBwZWRbZV1bbV0pOworICAgICAgICAgICAgICAgIHNici0+c19tW2VdW21dID0gc3FydGYodGVtcCAqIGNoX2RhdGEtPnNfaW5kZXhtYXBwZWRbZSArIDFdW21dKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNici0+c19tYXBwZWRbZV1bbV0pIHsKKyAgICAgICAgICAgICAgICAgICAgc2JyLT5nYWluW2VdW21dID0gc3FydGYoc2JyLT5lX29yaWdtYXBwZWRbZV1bbV0gLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDEuMGYgKyBzYnItPmVfY3VycltlXVttXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEuMGYgKyBzYnItPnFfbWFwcGVkW2VdW21dICogZGVsdGEpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2JyLT5nYWluW2VdW21dID0gc3FydGYoc2JyLT5lX29yaWdtYXBwZWRbZV1bbV0gKiBzYnItPnFfbWFwcGVkW2VdW21dIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgxLjBmICsgc2JyLT5lX2N1cnJbZV1bbV0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLjBmICsgc2JyLT5xX21hcHBlZFtlXVttXSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKG0gPSBzYnItPmZfdGFibGVsaW1ba10gLSBzYnItPmt4WzFdOyBtIDwgc2JyLT5mX3RhYmxlbGltW2sgKyAxXSAtIHNici0+a3hbMV07IG0rKykgeworICAgICAgICAgICAgICAgIHN1bVswXSArPSBzYnItPmVfb3JpZ21hcHBlZFtlXVttXTsKKyAgICAgICAgICAgICAgICBzdW1bMV0gKz0gc2JyLT5lX2N1cnJbZV1bbV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnYWluX21heCA9IGxpbWdhaW5bc2JyLT5ic19saW1pdGVyX2dhaW5zXSAqIHNxcnRmKChGTFRfRVBTSUxPTiArIHN1bVswXSkgLyAoRkxUX0VQU0lMT04gKyBzdW1bMV0pKTsKKyAgICAgICAgICAgIGdhaW5fbWF4ID0gRkZNSU4oMTAwMDAwLmYsIGdhaW5fbWF4KTsKKyAgICAgICAgICAgIGZvciAobSA9IHNici0+Zl90YWJsZWxpbVtrXSAtIHNici0+a3hbMV07IG0gPCBzYnItPmZfdGFibGVsaW1bayArIDFdIC0gc2JyLT5reFsxXTsgbSsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgcV9tX21heCAgID0gc2JyLT5xX21bZV1bbV0gKiBnYWluX21heCAvIHNici0+Z2FpbltlXVttXTsKKyAgICAgICAgICAgICAgICBzYnItPnFfbVtlXVttXSAgPSBGRk1JTihzYnItPnFfbVtlXVttXSwgcV9tX21heCk7CisgICAgICAgICAgICAgICAgc2JyLT5nYWluW2VdW21dID0gRkZNSU4oc2JyLT5nYWluW2VdW21dLCBnYWluX21heCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdW1bMF0gPSBzdW1bMV0gPSAwLjBmOworICAgICAgICAgICAgZm9yIChtID0gc2JyLT5mX3RhYmxlbGltW2tdIC0gc2JyLT5reFsxXTsgbSA8IHNici0+Zl90YWJsZWxpbVtrICsgMV0gLSBzYnItPmt4WzFdOyBtKyspIHsKKyAgICAgICAgICAgICAgICBzdW1bMF0gKz0gc2JyLT5lX29yaWdtYXBwZWRbZV1bbV07CisgICAgICAgICAgICAgICAgc3VtWzFdICs9IHNici0+ZV9jdXJyW2VdW21dICogc2JyLT5nYWluW2VdW21dICogc2JyLT5nYWluW2VdW21dCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2JyLT5zX21bZV1bbV0gKiBzYnItPnNfbVtlXVttXQorICAgICAgICAgICAgICAgICAgICAgICAgICArIChkZWx0YSAmJiAhc2JyLT5zX21bZV1bbV0pICogc2JyLT5xX21bZV1bbV0gKiBzYnItPnFfbVtlXVttXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdhaW5fYm9vc3QgPSBzcXJ0ZigoRkxUX0VQU0lMT04gKyBzdW1bMF0pIC8gKEZMVF9FUFNJTE9OICsgc3VtWzFdKSk7CisgICAgICAgICAgICBnYWluX2Jvb3N0ID0gRkZNSU4oMS41ODQ4OTMxOTJmLCBnYWluX2Jvb3N0KTsKKyAgICAgICAgICAgIGZvciAobSA9IHNici0+Zl90YWJsZWxpbVtrXSAtIHNici0+a3hbMV07IG0gPCBzYnItPmZfdGFibGVsaW1bayArIDFdIC0gc2JyLT5reFsxXTsgbSsrKSB7CisgICAgICAgICAgICAgICAgc2JyLT5nYWluW2VdW21dICo9IGdhaW5fYm9vc3Q7CisgICAgICAgICAgICAgICAgc2JyLT5xX21bZV1bbV0gICo9IGdhaW5fYm9vc3Q7CisgICAgICAgICAgICAgICAgc2JyLT5zX21bZV1bbV0gICo9IGdhaW5fYm9vc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBBc3NlbWJsaW5nIEhGIFNpZ25hbHMgKDE0NDk2LTMgc3AwNCBwMjIwKQorc3RhdGljIHZvaWQgc2JyX2hmX2Fzc2VtYmxlKGZsb2F0IFkxWzM4XVs2NF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgWF9oaWdoWzY0XVs0MF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNiciwgU0JSRGF0YSAqY2hfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZV9hWzJdKQoreworICAgIGludCBlLCBpLCBqLCBtOworICAgIGNvbnN0IGludCBoX1NMID0gNCAqICFzYnItPmJzX3Ntb290aGluZ19tb2RlOworICAgIGNvbnN0IGludCBreCA9IHNici0+a3hbMV07CisgICAgY29uc3QgaW50IG1fbWF4ID0gc2JyLT5tWzFdOworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBoX3Ntb290aFs1XSA9IHsKKyAgICAgICAgMC4zMzMzMzMzMzMzMzMzMywKKyAgICAgICAgMC4zMDE1MDI4MzIzOTU4MiwKKyAgICAgICAgMC4yMTgxNjk0OTkwNjI0OSwKKyAgICAgICAgMC4xMTUxNjM4MzQyNzA4NCwKKyAgICAgICAgMC4wMzE4MzA1MDA5Mzc1MSwKKyAgICB9OworICAgIGZsb2F0ICgqZ190ZW1wKVs0OF0gPSBjaF9kYXRhLT5nX3RlbXAsICgqcV90ZW1wKVs0OF0gPSBjaF9kYXRhLT5xX3RlbXA7CisgICAgaW50IGluZGV4bm9pc2UgPSBjaF9kYXRhLT5mX2luZGV4bm9pc2U7CisgICAgaW50IGluZGV4c2luZSAgPSBjaF9kYXRhLT5mX2luZGV4c2luZTsKKworICAgIGlmIChzYnItPnJlc2V0KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoX1NMOyBpKyspIHsKKyAgICAgICAgICAgIG1lbWNweShnX3RlbXBbaSArIDIqY2hfZGF0YS0+dF9lbnZbMF1dLCBzYnItPmdhaW5bMF0sIG1fbWF4ICogc2l6ZW9mKHNici0+Z2FpblswXVswXSkpOworICAgICAgICAgICAgbWVtY3B5KHFfdGVtcFtpICsgMipjaF9kYXRhLT50X2VudlswXV0sIHNici0+cV9tWzBdLCAgbV9tYXggKiBzaXplb2Yoc2JyLT5xX21bMF1bMF0pKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaF9TTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBtZW1jcHkoZ190ZW1wW2kgKyAyICogY2hfZGF0YS0+dF9lbnZbMF1dLAorICAgICAgICAgICAgICAgICAgIGdfdGVtcFtpICsgMiAqIGNoX2RhdGEtPnRfZW52X251bV9lbnZfb2xkXSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoZ190ZW1wWzBdKSk7CisgICAgICAgICAgICBtZW1jcHkocV90ZW1wW2kgKyAyICogY2hfZGF0YS0+dF9lbnZbMF1dLAorICAgICAgICAgICAgICAgICAgIHFfdGVtcFtpICsgMiAqIGNoX2RhdGEtPnRfZW52X251bV9lbnZfb2xkXSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YocV90ZW1wWzBdKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGUgPSAwOyBlIDwgY2hfZGF0YS0+YnNfbnVtX2VudjsgZSsrKSB7CisgICAgICAgIGZvciAoaSA9IDIgKiBjaF9kYXRhLT50X2VudltlXTsgaSA8IDIgKiBjaF9kYXRhLT50X2VudltlICsgMV07IGkrKykgeworICAgICAgICAgICAgbWVtY3B5KGdfdGVtcFtoX1NMICsgaV0sIHNici0+Z2FpbltlXSwgbV9tYXggKiBzaXplb2Yoc2JyLT5nYWluWzBdWzBdKSk7CisgICAgICAgICAgICBtZW1jcHkocV90ZW1wW2hfU0wgKyBpXSwgc2JyLT5xX21bZV0sICBtX21heCAqIHNpemVvZihzYnItPnFfbVswXVswXSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChlID0gMDsgZSA8IGNoX2RhdGEtPmJzX251bV9lbnY7IGUrKykgeworICAgICAgICBmb3IgKGkgPSAyICogY2hfZGF0YS0+dF9lbnZbZV07IGkgPCAyICogY2hfZGF0YS0+dF9lbnZbZSArIDFdOyBpKyspIHsKKyAgICAgICAgICAgIExPQ0FMX0FMSUdORURfMTYoZmxvYXQsIGdfZmlsdF90YWIsIFs0OF0pOworICAgICAgICAgICAgTE9DQUxfQUxJR05FRF8xNihmbG9hdCwgcV9maWx0X3RhYiwgWzQ4XSk7CisgICAgICAgICAgICBmbG9hdCAqZ19maWx0LCAqcV9maWx0OworCisgICAgICAgICAgICBpZiAoaF9TTCAmJiBlICE9IGVfYVswXSAmJiBlICE9IGVfYVsxXSkgeworICAgICAgICAgICAgICAgIGdfZmlsdCA9IGdfZmlsdF90YWI7CisgICAgICAgICAgICAgICAgcV9maWx0ID0gcV9maWx0X3RhYjsKKyAgICAgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgbV9tYXg7IG0rKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaWR4MSA9IGkgKyBoX1NMOworICAgICAgICAgICAgICAgICAgICBnX2ZpbHRbbV0gPSAwLjBmOworICAgICAgICAgICAgICAgICAgICBxX2ZpbHRbbV0gPSAwLjBmOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IGhfU0w7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZ19maWx0W21dICs9IGdfdGVtcFtpZHgxIC0gal1bbV0gKiBoX3Ntb290aFtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHFfZmlsdFttXSArPSBxX3RlbXBbaWR4MSAtIGpdW21dICogaF9zbW9vdGhbal07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdfZmlsdCA9IGdfdGVtcFtpICsgaF9TTF07CisgICAgICAgICAgICAgICAgcV9maWx0ID0gcV90ZW1wW2ldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzYnItPmRzcC5oZl9nX2ZpbHQoWTFbaV0gKyBreCwgWF9oaWdoICsga3gsIGdfZmlsdCwgbV9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIEVOVkVMT1BFX0FESlVTVE1FTlRfT0ZGU0VUKTsKKworICAgICAgICAgICAgaWYgKGUgIT0gZV9hWzBdICYmIGUgIT0gZV9hWzFdKSB7CisgICAgICAgICAgICAgICAgc2JyLT5kc3AuaGZfYXBwbHlfbm9pc2VbaW5kZXhzaW5lXShZMVtpXSArIGt4LCBzYnItPnNfbVtlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfZmlsdCwgaW5kZXhub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt4LCBtX21heCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBpbmRleHNpbmUmMTsKKyAgICAgICAgICAgICAgICBpbnQgQSA9ICgxLSgoaW5kZXhzaW5lKyhreCAmIDEpKSYyKSk7CisgICAgICAgICAgICAgICAgaW50IEIgPSAoQV4oLWlkeCkpICsgaWR4OworICAgICAgICAgICAgICAgIGZsb2F0ICpvdXQgPSAmWTFbaV1ba3hdW2lkeF07CisgICAgICAgICAgICAgICAgZmxvYXQgKmluICA9IHNici0+c19tW2VdOworICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0rMSA8IG1fbWF4OyBtKz0yKSB7CisgICAgICAgICAgICAgICAgICAgIG91dFsyKm0gIF0gKz0gaW5bbSAgXSAqIEE7CisgICAgICAgICAgICAgICAgICAgIG91dFsyKm0rMl0gKz0gaW5bbSsxXSAqIEI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKG1fbWF4JjEpCisgICAgICAgICAgICAgICAgICAgIG91dFsyKm0gIF0gKz0gaW5bbSAgXSAqIEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleG5vaXNlID0gKGluZGV4bm9pc2UgKyBtX21heCkgJiAweDFmZjsKKyAgICAgICAgICAgIGluZGV4c2luZSA9IChpbmRleHNpbmUgKyAxKSAmIDM7CisgICAgICAgIH0KKyAgICB9CisgICAgY2hfZGF0YS0+Zl9pbmRleG5vaXNlID0gaW5kZXhub2lzZTsKKyAgICBjaF9kYXRhLT5mX2luZGV4c2luZSAgPSBpbmRleHNpbmU7Cit9CisKK3ZvaWQgZmZfc2JyX2FwcGx5KEFBQ0NvbnRleHQgKmFjLCBTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyLCBpbnQgaWRfYWFjLAorICAgICAgICAgICAgICAgICAgZmxvYXQqIEwsIGZsb2F0KiBSKQoreworICAgIGludCBkb3duc2FtcGxlZCA9IGFjLT5vY1sxXS5tNGFjLmV4dF9zYW1wbGVfcmF0ZSA8IHNici0+c2FtcGxlX3JhdGU7CisgICAgaW50IGNoOworICAgIGludCBuY2ggPSAoaWRfYWFjID09IFRZUEVfQ1BFKSA/IDIgOiAxOworICAgIGludCBlcnI7CisKKyAgICBpZiAoIXNici0+a3hfYW5kX21fcHVzaGVkKSB7CisgICAgICAgIHNici0+a3hbMF0gPSBzYnItPmt4WzFdOworICAgICAgICBzYnItPm1bMF0gPSBzYnItPm1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2JyLT5reF9hbmRfbV9wdXNoZWQgPSAwOworICAgIH0KKworICAgIGlmIChzYnItPnN0YXJ0KSB7CisgICAgICAgIHNicl9kZXF1YW50KHNiciwgaWRfYWFjKTsKKyAgICB9CisgICAgZm9yIChjaCA9IDA7IGNoIDwgbmNoOyBjaCsrKSB7CisgICAgICAgIC8qIGRlY29kZSBjaGFubmVsICovCisgICAgICAgIHNicl9xbWZfYW5hbHlzaXMoYWMtPmZkc3AsICZzYnItPm1kY3RfYW5hLCAmc2JyLT5kc3AsIGNoID8gUiA6IEwsIHNici0+ZGF0YVtjaF0uYW5hbHlzaXNfZmlsdGVyYmFua19zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCopc2JyLT5xbWZfZmlsdGVyX3NjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2JyLT5kYXRhW2NoXS5XLCBzYnItPmRhdGFbY2hdLllwb3MpOworICAgICAgICBzYnItPmMuc2JyX2xmX2dlbihhYywgc2JyLCBzYnItPlhfbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKCopWzMyXVszMl1bMl0pIHNici0+ZGF0YVtjaF0uVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyLT5kYXRhW2NoXS5ZcG9zKTsKKyAgICAgICAgc2JyLT5kYXRhW2NoXS5ZcG9zIF49IDE7CisgICAgICAgIGlmIChzYnItPnN0YXJ0KSB7CisgICAgICAgICAgICBzYnItPmMuc2JyX2hmX2ludmVyc2VfZmlsdGVyKCZzYnItPmRzcCwgc2JyLT5hbHBoYTAsIHNici0+YWxwaGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKCopWzQwXVsyXSkgc2JyLT5YX2xvdywgc2JyLT5rWzBdKTsKKyAgICAgICAgICAgIHNicl9jaGlycChzYnIsICZzYnItPmRhdGFbY2hdKTsKKyAgICAgICAgICAgIHNicl9oZl9nZW4oYWMsIHNiciwgc2JyLT5YX2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAoKilbNDBdWzJdKSBzYnItPlhfbG93LAorICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKCopWzJdKSBzYnItPmFscGhhMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICgqKVsyXSkgc2JyLT5hbHBoYTEsCisgICAgICAgICAgICAgICAgICAgICAgIHNici0+ZGF0YVtjaF0uYndfYXJyYXksIHNici0+ZGF0YVtjaF0udF9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgIHNici0+ZGF0YVtjaF0uYnNfbnVtX2Vudik7CisKKyAgICAgICAgICAgIC8vIGhmX2FkagorICAgICAgICAgICAgZXJyID0gc2JyX21hcHBpbmcoYWMsIHNiciwgJnNici0+ZGF0YVtjaF0sIHNici0+ZGF0YVtjaF0uZV9hKTsKKyAgICAgICAgICAgIGlmICghZXJyKSB7CisgICAgICAgICAgICAgICAgc2JyX2Vudl9lc3RpbWF0ZShzYnItPmVfY3Vyciwgc2JyLT5YX2hpZ2gsIHNiciwgJnNici0+ZGF0YVtjaF0pOworICAgICAgICAgICAgICAgIHNicl9nYWluX2NhbGMoYWMsIHNiciwgJnNici0+ZGF0YVtjaF0sIHNici0+ZGF0YVtjaF0uZV9hKTsKKyAgICAgICAgICAgICAgICBzYnItPmMuc2JyX2hmX2Fzc2VtYmxlKHNici0+ZGF0YVtjaF0uWVtzYnItPmRhdGFbY2hdLllwb3NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKCopWzQwXVsyXSkgc2JyLT5YX2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiciwgJnNici0+ZGF0YVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNici0+ZGF0YVtjaF0uZV9hKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHN5bnRoZXNpcyAqLworICAgICAgICBzYnItPmMuc2JyX3hfZ2VuKHNiciwgc2JyLT5YW2NoXSwKKyAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAoKilbNjRdWzJdKSBzYnItPmRhdGFbY2hdLllbMS1zYnItPmRhdGFbY2hdLllwb3NdLAorICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICgqKVs2NF1bMl0pIHNici0+ZGF0YVtjaF0uWVsgIHNici0+ZGF0YVtjaF0uWXBvc10sCisgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKCopWzQwXVsyXSkgc2JyLT5YX2xvdywgY2gpOworICAgIH0KKworICAgIGlmIChhYy0+b2NbMV0ubTRhYy5wcyA9PSAxKSB7CisgICAgICAgIGlmIChzYnItPnBzLnN0YXJ0KSB7CisgICAgICAgICAgICBmZl9wc19hcHBseShhYy0+YXZjdHgsICZzYnItPnBzLCBzYnItPlhbMF0sIHNici0+WFsxXSwgc2JyLT5reFsxXSArIHNici0+bVsxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkoc2JyLT5YWzFdLCBzYnItPlhbMF0sIHNpemVvZihzYnItPlhbMF0pKTsKKyAgICAgICAgfQorICAgICAgICBuY2ggPSAyOworICAgIH0KKworICAgIHNicl9xbWZfc3ludGhlc2lzKCZzYnItPm1kY3QsICZzYnItPmRzcCwgYWMtPmZkc3AsCisgICAgICAgICAgICAgICAgICAgICAgTCwgc2JyLT5YWzBdLCBzYnItPnFtZl9maWx0ZXJfc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBzYnItPmRhdGFbMF0uc3ludGhlc2lzX2ZpbHRlcmJhbmtfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAmc2JyLT5kYXRhWzBdLnN5bnRoZXNpc19maWx0ZXJiYW5rX3NhbXBsZXNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGRvd25zYW1wbGVkKTsKKyAgICBpZiAobmNoID09IDIpCisgICAgICAgIHNicl9xbWZfc3ludGhlc2lzKCZzYnItPm1kY3QsICZzYnItPmRzcCwgYWMtPmZkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFIsIHNici0+WFsxXSwgc2JyLT5xbWZfZmlsdGVyX3NjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNici0+ZGF0YVsxXS5zeW50aGVzaXNfZmlsdGVyYmFua19zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JyLT5kYXRhWzFdLnN5bnRoZXNpc19maWx0ZXJiYW5rX3NhbXBsZXNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duc2FtcGxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFhY3Nicl9mdW5jX3B0cl9pbml0KEFBQ1NCUkNvbnRleHQgKmMpCit7CisgICAgYy0+c2JyX2xmX2dlbiAgICAgICAgICAgID0gc2JyX2xmX2dlbjsKKyAgICBjLT5zYnJfaGZfYXNzZW1ibGUgICAgICAgPSBzYnJfaGZfYXNzZW1ibGU7CisgICAgYy0+c2JyX3hfZ2VuICAgICAgICAgICAgID0gc2JyX3hfZ2VuOworICAgIGMtPnNicl9oZl9pbnZlcnNlX2ZpbHRlciA9IHNicl9oZl9pbnZlcnNlX2ZpbHRlcjsKKworICAgIGlmKEFSQ0hfTUlQUykKKyAgICAgICAgZmZfYWFjc2JyX2Z1bmNfcHRyX2luaXRfbWlwcyhjKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3Nici5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjc2JyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlMzNhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3Nici5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBBQUMgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFJvYmVydCBTd2FpbiAoIHJvYiBvcGVuZG90IGNsICkKKyAqIENvcHlyaWdodCAoYykgMjAxMCAgICAgIEFsZXggQ29udmVyc2UgPGFsZXguY29udmVyc2VAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBQUMgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqIEBhdXRob3IgUm9iZXJ0IFN3YWluICggcm9iIG9wZW5kb3QgY2wgKQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BQUNTQlJfSAorI2RlZmluZSBBVkNPREVDX0FBQ1NCUl9ICisKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImFhYy5oIgorI2luY2x1ZGUgInNici5oIgorCisvKiogSW5pdGlhbGl6ZSBTQlIuICovCit2b2lkIGZmX2FhY19zYnJfaW5pdCh2b2lkKTsKKy8qKiBJbml0aWFsaXplIG9uZSBTQlIgY29udGV4dC4gKi8KK3ZvaWQgZmZfYWFjX3Nicl9jdHhfaW5pdChBQUNDb250ZXh0ICphYywgU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNicik7CisvKiogQ2xvc2Ugb25lIFNCUiBjb250ZXh0LiAqLwordm9pZCBmZl9hYWNfc2JyX2N0eF9jbG9zZShTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyKTsKKy8qKiBEZWNvZGUgb25lIFNCUiBlbGVtZW50LiAqLworaW50IGZmX2RlY29kZV9zYnJfZXh0ZW5zaW9uKEFBQ0NvbnRleHQgKmFjLCBTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiLCBpbnQgY3JjLCBpbnQgY250LCBpbnQgaWRfYWFjKTsKKy8qKiBBcHBseSBvbmUgU0JSIGVsZW1lbnQgdG8gb25lIEFBQyBlbGVtZW50LiAqLwordm9pZCBmZl9zYnJfYXBwbHkoQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsIGludCBpZF9hYWMsCisgICAgICAgICAgICAgICAgICBmbG9hdCogTCwgZmxvYXQgKlIpOworCit2b2lkIGZmX2FhY3Nicl9mdW5jX3B0cl9pbml0X21pcHMoQUFDU0JSQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FBQ1NCUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYWNzYnJfdGFibGVnZW4uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3Nicl90YWJsZWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzBmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNzYnJfdGFibGVnZW4uYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogSGVhZGVyIGZpbGUgZm9yIGhhcmRjb2RlZCBBQUMgU0JSIHdpbmRvd3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2RlZmluZSBDT05GSUdfSEFSRENPREVEX1RBQkxFUyAwCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImFhY3Nicl90YWJsZWdlbi5oIgorI2luY2x1ZGUgInRhYmxlcHJpbnQuaCIKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBhYWNzYnJfdGFibGVpbml0KCk7CisKKyAgICB3cml0ZV9maWxlaGVhZGVyKCk7CisKKyAgICBXUklURV9BUlJBWV9BTElHTkVEKCJzdGF0aWMgY29uc3QiLCAzMiwgZmxvYXQsIHNicl9xbWZfd2luZG93X2RzKTsKKyAgICBXUklURV9BUlJBWV9BTElHTkVEKCJzdGF0aWMgY29uc3QiLCAzMiwgZmxvYXQsIHNicl9xbWZfd2luZG93X3VzKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFjc2JyX3RhYmxlZ2VuLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNzYnJfdGFibGVnZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmZkY2NjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFjc2JyX3RhYmxlZ2VuLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBIZWFkZXIgZmlsZSBmb3IgaGFyZGNvZGVkIEFBQyBTQlIgd2luZG93cworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBSZWltYXIgRMO2ZmZpbmdlciA8UmVpbWFyLkRvZWZmaW5nZXJAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQUFDU0JSX1RBQkxFR0VOX0gKKyNkZWZpbmUgQVZDT0RFQ19BQUNTQlJfVEFCTEVHRU5fSAorCisjaWYgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKKyNkZWZpbmUgYWFjc2JyX3RhYmxlaW5pdCgpCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYWNzYnJfdGFibGVzLmgiCisjZWxzZQorLy8vPCB3aW5kb3cgY29lZmZpY2llbnRzIGZvciBhbmFseXNpcy9zeW50aGVzaXMgUU1GIGJhbmtzCitzdGF0aWMgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgc2JyX3FtZl93aW5kb3dfZHMpWzMyMF07CitzdGF0aWMgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgc2JyX3FtZl93aW5kb3dfdXMpWzY0MF0gPSB7CisgICAgIDAuMDAwMDAwMDAwMCwgLTAuMDAwNTUyNTI4NiwgLTAuMDAwNTYxNzY5MiwgLTAuMDAwNDk0NzUxOCwKKyAgICAtMC4wMDA0ODc1MjI3LCAtMC4wMDA0ODkzNzkxLCAtMC4wMDA1MDQwNzE0LCAtMC4wMDA1MjI2NTY0LAorICAgIC0wLjAwMDU0NjY1NjUsIC0wLjAwMDU2Nzc4MDIsIC0wLjAwMDU4NzA5MzAsIC0wLjAwMDYxMzI3NDcsCisgICAgLTAuMDAwNjMxMjQ5MywgLTAuMDAwNjU0MDMzMywgLTAuMDAwNjc3NzY5MCwgLTAuMDAwNjk0MTYxNCwKKyAgICAtMC4wMDA3MTU3NzM2LCAtMC4wMDA3MjU1MDQzLCAtMC4wMDA3NDQwOTQxLCAtMC4wMDA3NDkwNTk4LAorICAgIC0wLjAwMDc2ODEzNzEsIC0wLjAwMDc3MjQ4NDgsIC0wLjAwMDc4MzQzMzIsIC0wLjAwMDc3Nzk4NjksCisgICAgLTAuMDAwNzgwMzY2NCwgLTAuMDAwNzgwMTQ0OSwgLTAuMDAwNzc1Nzk3NywgLTAuMDAwNzYzMDc5MywKKyAgICAtMC4wMDA3NTMwMDAxLCAtMC4wMDA3MzE5MzU3LCAtMC4wMDA3MjE1MzkxLCAtMC4wMDA2OTE3OTM3LAorICAgIC0wLjAwMDY2NTA0MTUsIC0wLjAwMDYzNDE1OTQsIC0wLjAwMDU5NDYxMTgsIC0wLjAwMDU1NjQ1NzYsCisgICAgLTAuMDAwNTE0NTU3MiwgLTAuMDAwNDYwNjMyNSwgLTAuMDAwNDA5NTEyMSwgLTAuMDAwMzUwMTE3NSwKKyAgICAtMC4wMDAyODk2OTgxLCAtMC4wMDAyMDk4MzM3LCAtMC4wMDAxNDQ2MzgwLCAtMC4wMDAwNjE3MzM0LAorICAgICAwLjAwMDAxMzQ5NDksICAwLjAwMDEwOTQzODMsICAwLjAwMDIwNDMwMTcsICAwLjAwMDI5NDk1MzEsCisgICAgIDAuMDAwNDAyNjU0MCwgIDAuMDAwNTEwNzM4OCwgIDAuMDAwNjIzOTM3NiwgIDAuMDAwNzQ1ODAyNSwKKyAgICAgMC4wMDA4NjA4NDQzLCAgMC4wMDA5ODg1OTg4LCAgMC4wMDExMjUwMTU1LCAgMC4wMDEyNTc3ODg0LAorICAgICAwLjAwMTM5MDI0OTQsICAwLjAwMTU0NDMyMTksICAwLjAwMTY4NjgwODMsICAwLjAwMTgzNDgyNjUsCisgICAgIDAuMDAxOTg0MTE0MCwgIDAuMDAyMTQ2MTU4MywgIDAuMDAyMzAxNzI1NCwgIDAuMDAyNDYyNTYxNiwKKyAgICAgMC4wMDI2MjAxNzU4LCAgMC4wMDI3ODcwNDY0LCAgMC4wMDI5NDY5NDQ3LCAgMC4wMDMxMTI1NDIwLAorICAgICAwLjAwMzI3Mzk2MTMsICAwLjAwMzQ0MTg4NzQsICAwLjAwMzYwMDgyNjgsICAwLjAwMzc2MDM5MjIsCisgICAgIDAuMDAzOTIwNzQzMiwgIDAuMDA0MDgxOTc1MywgIDAuMDA0MjI2NDI2OSwgIDAuMDA0MzczMDcxOSwKKyAgICAgMC4wMDQ1MjA5ODUyLCAgMC4wMDQ2NjA2NDYwLCAgMC4wMDQ3OTMyNTYwLCAgMC4wMDQ5MTM3NjAzLAorICAgICAwLjAwNTAzOTMwMjIsICAwLjAwNTE0MDczNTMsICAwLjAwNTI0NjExNjYsICAwLjAwNTM0NzE2ODEsCisgICAgIDAuMDA1NDE5Njc3NSwgIDAuMDA1NDg3NjA0MCwgIDAuMDA1NTQ3NTcxNCwgIDAuMDA1NTkzODAyMywKKyAgICAgMC4wMDU2MjIwNjQzLCAgMC4wMDU2NDU1MTk2LCAgMC4wMDU2Mzg5MTk5LCAgMC4wMDU2MjY2MTE0LAorICAgICAwLjAwNTU5MTcxMjgsICAwLjAwNTU0MDQzNjMsICAwLjAwNTQ3NTM3ODMsICAwLjAwNTM4Mzg5NzUsCisgICAgIDAuMDA1MjcxNTc1OCwgIDAuMDA1MTM4MjI3NSwgIDAuMDA0OTgzOTY4NywgIDAuMDA0ODEwOTQ2OSwKKyAgICAgMC4wMDQ2MDM5NTMwLCAgMC4wMDQzODAxODYxLCAgMC4wMDQxMjUxNjQyLCAgMC4wMDM4NDU2NDA4LAorICAgICAwLjAwMzU0MDEyNDYsICAwLjAwMzIwOTE4ODUsICAwLjAwMjg0NDY3NTcsICAwLjAwMjQ1MDg1NDAsCisgICAgIDAuMDAyMDI3NDE3NiwgIDAuMDAxNTc4NDY4MiwgIDAuMDAxMDkwMjMyOSwgIDAuMDAwNTgzMjI2NCwKKyAgICAgMC4wMDAwMjc2MDQ1LCAtMC4wMDA1NDY0MjgwLCAtMC4wMDExNTY4MTM1LCAtMC4wMDE4MDM5NDcyLAorICAgIC0wLjAwMjQ4MjY3MjMsIC0wLjAwMzE5MzM3NzgsIC0wLjAwMzk0MDExMjQsIC0wLjAwNDcyMjI1OTYsCisgICAgLTAuMDA1NTMzNzIxMSwgLTAuMDA2Mzc5MjI5MywgLTAuMDA3MjYxNTgxNiwgLTAuMDA4MTc5ODIzMywKKyAgICAtMC4wMDkxMzI1MzI5LCAtMC4wMTAxMTUwMjE1LCAtMC4wMTExMzE1NTQ4LCAtMC4wMTIxODQ5OTk1LAorICAgICAwLjAxMzI3MTgyMjAsICAwLjAxNDM5MDQ2NjYsICAwLjAxNTU0MDU1NTMsICAwLjAxNjczMjQ3MTIsCisgICAgIDAuMDE3OTQzMzM4MSwgIDAuMDE5MTg3MjQzMSwgIDAuMDIwNDUzMTc5MywgIDAuMDIxNzQ2NzU1MCwKKyAgICAgMC4wMjMwNjgwMTY5LCAgMC4wMjQ0MTYwOTkyLCAgMC4wMjU3ODc1ODQ3LCAgMC4wMjcxODU5NDI5LAorICAgICAwLjAyODYwNzIxNzMsICAwLjAzMDA1MDI2NTcsICAwLjAzMTUwMTc2MDgsICAwLjAzMjk3NTQwODEsCisgICAgIDAuMDM0NDYyMDk0OCwgIDAuMDM1OTY5NzU2MCwgIDAuMDM3NDgxMjg1MCwgIDAuMDM5MDA1MzY3OSwKKyAgICAgMC4wNDA1MzQ5MTcwLCAgMC4wNDIwNjQ5MDk0LCAgMC4wNDM2MDk3NTQyLCAgMC4wNDUxNDg4NDA1LAorICAgICAwLjA0NjY4NDMwMjcsICAwLjA0ODIxNjU3MjAsICAwLjA0OTczODU3NTUsICAwLjA1MTI1NTYxNTUsCisgICAgIDAuMDUyNzYzMDc0NiwgIDAuMDU0MjQ1Mjc2OCwgIDAuMDU1NzE3MzY0OCwgIDAuMDU3MTYxNjQ1MCwKKyAgICAgMC4wNTg1OTE1NjgzLCAgMC4wNTk5ODM3NDgwLCAgMC4wNjEzNDU1MTcxLCAgMC4wNjI2ODU3ODA4LAorICAgICAwLjA2Mzk3MTU4OTgsICAwLjA2NTIyNDcxMDYsICAwLjA2NjQzNjc1MTIsICAwLjA2NzYwNzU5ODUsCisgICAgIDAuMDY4NzA0MzgyOCwgIDAuMDY5NzYzMDI0NCwgIDAuMDcwNzYyODcxMCwgIDAuMDcxNzAwMjY3MywKKyAgICAgMC4wNzI1NjgyNTgzLCAgMC4wNzMzNjIwMjU1LCAgMC4wNzQxMDAzNjQyLCAgMC4wNzQ3NDUyNTU4LAorICAgICAwLjA3NTMxMzczMzYsICAwLjA3NTgwMDgzNTgsICAwLjA3NjE5OTI0NzksICAwLjA3NjQ5OTIxNzAsCisgICAgIDAuMDc2NzA5MzQ5MCwgIDAuMDc2ODE3Mzk3NSwgIDAuMDc2ODIzMDAxMSwgIDAuMDc2NzIwNDkyNCwKKyAgICAgMC4wNzY1MDUwNzE4LCAgMC4wNzYxNzQ4MzIxLCAgMC4wNzU3MzA1NzU2LCAgMC4wNzUxNTc2MjU1LAorICAgICAwLjA3NDQ2NjQzOTQsICAwLjA3MzY0MDYwMDUsICAwLjA3MjY3NzQ2NDIsICAwLjA3MTU4MjYzNjQsCisgICAgIDAuMDcwMzUzMzA3MywgIDAuMDY4OTY2NDAxMywgIDAuMDY3NDUyNTAyMSwgIDAuMDY1NzY5MDY2OCwKKyAgICAgMC4wNjM5NDQ0ODA1LCAgMC4wNjE5NjAyNzc5LCAgMC4wNTk4MTY2NTcwLCAgMC4wNTc1MTUyNjkxLAorICAgICAwLjA1NTA0NjAwMzQsICAwLjA1MjQwOTM4MjEsICAwLjA0OTU5Nzg2NzYsICAwLjA0NjYzMDMzMDUsCisgICAgIDAuMDQzNDc2ODc4MiwgIDAuMDQwMTQ1ODI3OCwgIDAuMDM2NjQxODExNiwgIDAuMDMyOTU4MzkzMCwKKyAgICAgMC4wMjkwODI0MDA2LCAgMC4wMjUwMzA3NTYxLCAgMC4wMjA3OTk3MDcyLCAgMC4wMTYzNzAxMjU4LAorICAgICAwLjAxMTc2MjM4MzIsICAwLjAwNjk2MzY4NjIsICAwLjAwMTk3NjU2MDEsIC0wLjAwMzIwODY4OTYsCisgICAgLTAuMDA4NTcxMTc0OSwgLTAuMDE0MTI4ODgyNywgLTAuMDE5ODgzNDEyOSwgLTAuMDI1ODIyNzI4OCwKKyAgICAtMC4wMzE5NTMxMjc0LCAtMC4wMzgyNzc2NTcyLCAtMC4wNDQ3ODA2ODIxLCAtMC4wNTE0ODA0MTc2LAorICAgIC0wLjA1ODM3MDUzMjYsIC0wLjA2NTQ0MDk4NTMsIC0wLjA3MjY5NDMzMDAsIC0wLjA4MDEzNzI5MzQsCisgICAgLTAuMDg3NzU0NzUzNiwgLTAuMDk1NTUzMzM1MiwgLTAuMTAzNTMyOTUzMSwgLTAuMTExNjgyNjkzMSwKKyAgICAtMC4xMjAwMDc3OTg0LCAtMC4xMjg1MDAyODUwLCAtMC4xMzcxNTUxNzYxLCAtMC4xNDU5NzY2NDkxLAorICAgIC0wLjE1NDk2MDcwNzEsIC0wLjE2NDA5NTg4NTUsIC0wLjE3MzM4MDgxNzIsIC0wLjE4MjgxNzI1NDgsCisgICAgLTAuMTkyMzk2Njc0NSwgLTAuMjAyMTI1MDE3NiwgLTAuMjExOTczNTg1MywgLTAuMjIxOTY1MjY5NiwKKyAgICAtMC4yMzIwNjkwODcwLCAtMC4yNDIzMDE2ODg0LCAtMC4yNTI2NDgwMzA5LCAtMC4yNjMxMDUzMjk5LAorICAgIC0wLjI3MzY2MzQwNDAsIC0wLjI4NDMyMTQxODksIC0wLjI5NTA3MTY3MTcsIC0wLjMwNTkwOTg1NzUsCisgICAgLTAuMzE2ODI3ODkxMywgLTAuMzI3ODExMzcyNywgLTAuMzM4ODcyMjY5MywgLTAuMzQ5OTkxNDEyMiwKKyAgICAgMC4zNjExNTg5OTAzLCAgMC4zNzIzNzk1NTQ2LCAgMC4zODM2MzUwMDEzLCAgMC4zOTQ5MjExNzYxLAorICAgICAwLjQwNjIzMTc2NzYsICAwLjQxNzU2OTY4OTYsICAwLjQyODkxMTk5MjAsICAwLjQ0MDI1NTM3NTQsCisgICAgIDAuNDUxNTk5NjUzNSwgIDAuNDYyOTMwODA4NSwgIDAuNDc0MjQ1MzIxNCwgIDAuNDg1NTI1MzA5MSwKKyAgICAgMC40OTY3NzA4MjU0LCAgMC41MDc5ODE3NTAwLCAgMC41MTkxMjM0OTcwLCAgMC41MzAyMjQwODk1LAorICAgICAwLjU0MTI1NTM0NDgsICAwLjU1MjIwNTEyNTgsICAwLjU2MzA3ODkxNDAsICAwLjU3Mzg1MjQxMzEsCisgICAgIDAuNTg0NTQwMzIzNSwgIDAuNTk1MTEyMzA4NiwgIDAuNjA1NTc4MzUzOCwgIDAuNjE1OTEwOTkzMiwKKyAgICAgMC42MjYxMjQyNjk1LCAgMC42MzYxOTgwMTA3LCAgMC42NDYxMjY5Njk1LCAgMC42NTU5MDE2MzAyLAorICAgICAwLjY2NTUxMzk4ODAsICAwLjY3NDk2NjMxOTAsICAwLjY4NDIzNTMyOTMsICAwLjY5MzMyODIzNzYsCisgICAgIDAuNzAyMjM4ODcxOSwgIDAuNzEwOTQxMDQyNiwgIDAuNzE5NDQ2MjYzNCwgIDAuNzI3NzQ0ODkwMCwKKyAgICAgMC43MzU4MjExNzU4LCAgMC43NDM2ODI3ODYzLCAgMC43NTEzMTM3NDU2LCAgMC43NTg3MDgwNzYwLAorICAgICAwLjc2NTg2NzQ4NjUsICAwLjc3Mjc3ODA4ODEsICAwLjc3OTQyODc1MTksICAwLjc4NTgzNTMxMjAsCisgICAgIDAuNzkxOTczNTg0MSwgIDAuNzk3ODQ2NjQxMywgIDAuODAzNDQ4NTc1MSwgIDAuODA4NzY5NTAwNCwKKyAgICAgMC44MTM4MTkxMjcwLCAgMC44MTg1Nzc2MDA0LCAgMC44MjMwNDE5ODkwLCAgMC44MjcyMjc1MzQ3LAorICAgICAwLjgzMTEwMzg0NTcsICAwLjgzNDY5MzczNjEsICAwLjgzNzk3MTczMzcsICAwLjg0MDk1NDEzOTIsCisgICAgIDAuODQzNjIzODI4MSwgIDAuODQ1OTgxODQ2OSwgIDAuODQ4MDMxNTc3NywgIDAuODQ5NzgwNTE5OCwKKyAgICAgMC44NTExOTcxNTI0LCAgMC44NTIzMDQ3MDM1LCAgMC44NTMxMDIwOTQ5LCAgMC44NTM1NzIwNTczLAorICAgICAwLjg1MzczODU2MDAsCit9OworCitzdGF0aWMgYXZfY29sZCB2b2lkIGFhY3Nicl90YWJsZWluaXQodm9pZCkKK3sKKyAgICBpbnQgbjsKKyAgICBmb3IgKG4gPSAxOyBuIDwgMzIwOyBuKyspCisgICAgICAgIHNicl9xbWZfd2luZG93X3VzWzMyMCArIG5dID0gc2JyX3FtZl93aW5kb3dfdXNbMzIwIC0gbl07CisgICAgc2JyX3FtZl93aW5kb3dfdXNbMzg0XSA9IC1zYnJfcW1mX3dpbmRvd191c1szODRdOworICAgIHNicl9xbWZfd2luZG93X3VzWzUxMl0gPSAtc2JyX3FtZl93aW5kb3dfdXNbNTEyXTsKKworICAgIGZvciAobiA9IDA7IG4gPCAzMjA7IG4rKykKKyAgICAgICAgc2JyX3FtZl93aW5kb3dfZHNbbl0gPSBzYnJfcW1mX3dpbmRvd191c1syKm5dOworfQorI2VuZGlmIC8qIENPTkZJR19IQVJEQ09ERURfVEFCTEVTICovCisKKyNlbmRpZiAvKiBBVkNPREVDX0FBQ1NCUl9UQUJMRUdFTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYWNzYnJkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hYWNzYnJkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2N2UwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3NicmRhdGEuaApAQCAtMCwwICsxLDUzNCBAQAorLyoKKyAqIEFBQyBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIGRlY29kaW5nIGRhdGEKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFJvYmVydCBTd2FpbiAoIHJvYiBvcGVuZG90IGNsICkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQUFDIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24gZGVjb2RpbmcgZGF0YQorICogQGF1dGhvciBSb2JlcnQgU3dhaW4gKCByb2Igb3BlbmRvdCBjbCApCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FBQ1NCUkRBVEFfSAorI2RlZmluZSBBVkNPREVDX0FBQ1NCUkRBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisvLy88IEh1ZmZtYW4gdGFibGVzIGZvciBTQlIKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdF9odWZmbWFuX2Vudl8xXzVkQl9iaXRzWzEyMV0gPSB7CisgICAgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTcsIDE4LCAxNiwgMTcsIDE4LCAxNywKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTUsIDE0LCAxNCwgMTMsCisgICAgMTMsIDEyLCAxMSwgMTAsICA5LCAgOCwgIDcsICA2LAorICAgICA1LCAgNCwgIDMsICAyLCAgMiwgIDMsICA0LCAgNSwKKyAgICAgNiwgIDcsICA4LCAgOSwgMTAsIDEyLCAxMywgMTQsCisgICAgMTQsIDE1LCAxNiwgMTcsIDE2LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdF9odWZmbWFuX2Vudl8xXzVkQl9jb2Rlc1sxMjFdID0geworICAgIDB4M2ZmZDYsIDB4M2ZmZDcsIDB4M2ZmZDgsIDB4M2ZmZDksIDB4M2ZmZGEsIDB4M2ZmZGIsIDB4N2ZmYjgsIDB4N2ZmYjksCisgICAgMHg3ZmZiYSwgMHg3ZmZiYiwgMHg3ZmZiYywgMHg3ZmZiZCwgMHg3ZmZiZSwgMHg3ZmZiZiwgMHg3ZmZjMCwgMHg3ZmZjMSwKKyAgICAweDdmZmMyLCAweDdmZmMzLCAweDdmZmM0LCAweDdmZmM1LCAweDdmZmM2LCAweDdmZmM3LCAweDdmZmM4LCAweDdmZmM5LAorICAgIDB4N2ZmY2EsIDB4N2ZmY2IsIDB4N2ZmY2MsIDB4N2ZmY2QsIDB4N2ZmY2UsIDB4N2ZmY2YsIDB4N2ZmZDAsIDB4N2ZmZDEsCisgICAgMHg3ZmZkMiwgMHg3ZmZkMywgMHgxZmZlNiwgMHgzZmZkNCwgMHgwZmZmMCwgMHgxZmZlOSwgMHgzZmZkNSwgMHgxZmZlNywKKyAgICAweDBmZmYxLCAweDBmZmVjLCAweDBmZmVkLCAweDBmZmVlLCAweDA3ZmY0LCAweDAzZmY5LCAweDAzZmY3LCAweDAxZmZhLAorICAgIDB4MDFmZjksIDB4MDBmZmIsIDB4MDA3ZmMsIDB4MDAzZmMsIDB4MDAxZmQsIDB4MDAwZmQsIDB4MDAwN2QsIDB4MDAwM2QsCisgICAgMHgwMDAxZCwgMHgwMDAwZCwgMHgwMDAwNSwgMHgwMDAwMSwgMHgwMDAwMCwgMHgwMDAwNCwgMHgwMDAwYywgMHgwMDAxYywKKyAgICAweDAwMDNjLCAweDAwMDdjLCAweDAwMGZjLCAweDAwMWZjLCAweDAwM2ZkLCAweDAwZmZhLCAweDAxZmY4LCAweDAzZmY2LAorICAgIDB4MDNmZjgsIDB4MDdmZjUsIDB4MGZmZWYsIDB4MWZmZTgsIDB4MGZmZjIsIDB4N2ZmZDQsIDB4N2ZmZDUsIDB4N2ZmZDYsCisgICAgMHg3ZmZkNywgMHg3ZmZkOCwgMHg3ZmZkOSwgMHg3ZmZkYSwgMHg3ZmZkYiwgMHg3ZmZkYywgMHg3ZmZkZCwgMHg3ZmZkZSwKKyAgICAweDdmZmRmLCAweDdmZmUwLCAweDdmZmUxLCAweDdmZmUyLCAweDdmZmUzLCAweDdmZmU0LCAweDdmZmU1LCAweDdmZmU2LAorICAgIDB4N2ZmZTcsIDB4N2ZmZTgsIDB4N2ZmZTksIDB4N2ZmZWEsIDB4N2ZmZWIsIDB4N2ZmZWMsIDB4N2ZmZWQsIDB4N2ZmZWUsCisgICAgMHg3ZmZlZiwgMHg3ZmZmMCwgMHg3ZmZmMSwgMHg3ZmZmMiwgMHg3ZmZmMywgMHg3ZmZmNCwgMHg3ZmZmNSwgMHg3ZmZmNiwKKyAgICAweDdmZmY3LCAweDdmZmY4LCAweDdmZmY5LCAweDdmZmZhLCAweDdmZmZiLCAweDdmZmZjLCAweDdmZmZkLCAweDdmZmZlLAorICAgIDB4N2ZmZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBmX2h1ZmZtYW5fZW52XzFfNWRCX2JpdHNbMTIxXSA9IHsKKyAgICAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsCisgICAgMjAsIDE5LCAyMCwgMjAsIDIwLCAyMCwgMTksIDIwLAorICAgIDE5LCAxOSwgMjAsIDE4LCAyMCwgMjAsIDIwLCAxOSwKKyAgICAyMCwgMjAsIDIwLCAxOSwgMjAsIDE5LCAxOCwgMTksCisgICAgMTgsIDE4LCAxNywgMTgsIDE3LCAxNywgMTcsIDE2LAorICAgIDE2LCAxNiwgMTUsIDE1LCAxNCwgMTMsIDEzLCAxMiwKKyAgICAxMiwgMTEsIDEwLCAgOSwgIDksICA4LCAgNywgIDYsCisgICAgIDUsICA0LCAgMywgIDIsICAyLCAgMywgIDQsICA1LAorICAgICA2LCAgOCwgIDgsICA5LCAxMCwgMTEsIDExLCAxMSwKKyAgICAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNiwgMTYsCisgICAgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE4LCAyMCwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMCwKKyAgICAyMCwgMTksIDIwLCAyMCwgMjAsIDIwLCAxOSwgMjAsCisgICAgMTgsIDIwLCAyMCwgMTksIDE5LCAyMCwgMjAsIDIwLAorICAgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwKKyAgICAyMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBmX2h1ZmZtYW5fZW52XzFfNWRCX2NvZGVzWzEyMV0gPSB7CisgICAgMHg3ZmZlNywgMHg3ZmZlOCwgMHhmZmZkMiwgMHhmZmZkMywgMHhmZmZkNCwgMHhmZmZkNSwgMHhmZmZkNiwgMHhmZmZkNywKKyAgICAweGZmZmQ4LCAweDdmZmRhLCAweGZmZmQ5LCAweGZmZmRhLCAweGZmZmRiLCAweGZmZmRjLCAweDdmZmRiLCAweGZmZmRkLAorICAgIDB4N2ZmZGMsIDB4N2ZmZGQsIDB4ZmZmZGUsIDB4M2ZmZTQsIDB4ZmZmZGYsIDB4ZmZmZTAsIDB4ZmZmZTEsIDB4N2ZmZGUsCisgICAgMHhmZmZlMiwgMHhmZmZlMywgMHhmZmZlNCwgMHg3ZmZkZiwgMHhmZmZlNSwgMHg3ZmZlMCwgMHgzZmZlOCwgMHg3ZmZlMSwKKyAgICAweDNmZmUwLCAweDNmZmU5LCAweDFmZmVmLCAweDNmZmU1LCAweDFmZmVjLCAweDFmZmVkLCAweDFmZmVlLCAweDBmZmY0LAorICAgIDB4MGZmZjMsIDB4MGZmZjAsIDB4MDdmZjcsIDB4MDdmZjYsIDB4MDNmZmEsIDB4MDFmZmEsIDB4MDFmZjksIDB4MDBmZmEsCisgICAgMHgwMGZmOCwgMHgwMDdmOSwgMHgwMDNmYiwgMHgwMDFmYywgMHgwMDFmYSwgMHgwMDBmYiwgMHgwMDA3YywgMHgwMDAzYywKKyAgICAweDAwMDFjLCAweDAwMDBjLCAweDAwMDA1LCAweDAwMDAxLCAweDAwMDAwLCAweDAwMDA0LCAweDAwMDBkLCAweDAwMDFkLAorICAgIDB4MDAwM2QsIDB4MDAwZmEsIDB4MDAwZmMsIDB4MDAxZmIsIDB4MDAzZmEsIDB4MDA3ZjgsIDB4MDA3ZmEsIDB4MDA3ZmIsCisgICAgMHgwMGZmOSwgMHgwMGZmYiwgMHgwMWZmOCwgMHgwMWZmYiwgMHgwM2ZmOCwgMHgwM2ZmOSwgMHgwZmZmMSwgMHgwZmZmMiwKKyAgICAweDFmZmVhLCAweDFmZmViLCAweDNmZmUxLCAweDNmZmUyLCAweDNmZmVhLCAweDNmZmUzLCAweDNmZmU2LCAweDNmZmU3LAorICAgIDB4M2ZmZWIsIDB4ZmZmZTYsIDB4N2ZmZTIsIDB4ZmZmZTcsIDB4ZmZmZTgsIDB4ZmZmZTksIDB4ZmZmZWEsIDB4ZmZmZWIsCisgICAgMHhmZmZlYywgMHg3ZmZlMywgMHhmZmZlZCwgMHhmZmZlZSwgMHhmZmZlZiwgMHhmZmZmMCwgMHg3ZmZlNCwgMHhmZmZmMSwKKyAgICAweDNmZmVjLCAweGZmZmYyLCAweGZmZmYzLCAweDdmZmU1LCAweDdmZmU2LCAweGZmZmY0LCAweGZmZmY1LCAweGZmZmY2LAorICAgIDB4ZmZmZjcsIDB4ZmZmZjgsIDB4ZmZmZjksIDB4ZmZmZmEsIDB4ZmZmZmIsIDB4ZmZmZmMsIDB4ZmZmZmQsIDB4ZmZmZmUsCisgICAgMHhmZmZmZiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRfaHVmZm1hbl9lbnZfYmFsXzFfNWRCX2JpdHNbNDldID0geworICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxMiwgMTEsICA5LCAgNywgIDUsICAzLAorICAgICAxLCAgMiwgIDQsICA2LCAgOCwgMTEsIDEyLCAxNSwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHRfaHVmZm1hbl9lbnZfYmFsXzFfNWRCX2NvZGVzWzQ5XSA9IHsKKyAgICAweDBmZmU0LCAweDBmZmU1LCAweDBmZmU2LCAweDBmZmU3LCAweDBmZmU4LCAweDBmZmU5LCAweDBmZmVhLCAweDBmZmViLAorICAgIDB4MGZmZWMsIDB4MGZmZWQsIDB4MGZmZWUsIDB4MGZmZWYsIDB4MGZmZjAsIDB4MGZmZjEsIDB4MGZmZjIsIDB4MGZmZjMsCisgICAgMHgwZmZmNCwgMHgwZmZlMiwgMHgwMGZmYywgMHgwMDdmYywgMHgwMDFmZSwgMHgwMDA3ZSwgMHgwMDAxZSwgMHgwMDAwNiwKKyAgICAweDAwMDAwLCAweDAwMDAyLCAweDAwMDBlLCAweDAwMDNlLCAweDAwMGZlLCAweDAwN2ZkLCAweDAwZmZkLCAweDA3ZmYwLAorICAgIDB4MGZmZTMsIDB4MGZmZjUsIDB4MGZmZjYsIDB4MGZmZjcsIDB4MGZmZjgsIDB4MGZmZjksIDB4MGZmZmEsIDB4MWZmZjYsCisgICAgMHgxZmZmNywgMHgxZmZmOCwgMHgxZmZmOSwgMHgxZmZmYSwgMHgxZmZmYiwgMHgxZmZmYywgMHgxZmZmZCwgMHgxZmZmZSwKKyAgICAweDFmZmZmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZl9odWZmbWFuX2Vudl9iYWxfMV81ZEJfYml0c1s0OV0gPSB7CisgICAgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxNiwKKyAgICAxNywgMTQsIDExLCAxMSwgIDgsICA3LCAgNCwgIDIsCisgICAgIDEsICAzLCAgNSwgIDYsICA5LCAxMSwgMTIsIDE1LAorICAgIDE2LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwKKyAgICAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksCisgICAgMTksCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgZl9odWZmbWFuX2Vudl9iYWxfMV81ZEJfY29kZXNbNDldID0geworICAgIDB4M2ZmZTIsIDB4M2ZmZTMsIDB4M2ZmZTQsIDB4M2ZmZTUsIDB4M2ZmZTYsIDB4M2ZmZTcsIDB4M2ZmZTgsIDB4M2ZmZTksCisgICAgMHgzZmZlYSwgMHgzZmZlYiwgMHgzZmZlYywgMHgzZmZlZCwgMHgzZmZlZSwgMHgzZmZlZiwgMHgzZmZmMCwgMHgwZmZmNywKKyAgICAweDFmZmYwLCAweDAzZmZjLCAweDAwN2ZlLCAweDAwN2ZjLCAweDAwMGZlLCAweDAwMDdlLCAweDAwMDBlLCAweDAwMDAyLAorICAgIDB4MDAwMDAsIDB4MDAwMDYsIDB4MDAwMWUsIDB4MDAwM2UsIDB4MDAxZmUsIDB4MDA3ZmQsIDB4MDBmZmUsIDB4MDdmZmEsCisgICAgMHgwZmZmNiwgMHgzZmZmMSwgMHgzZmZmMiwgMHgzZmZmMywgMHgzZmZmNCwgMHgzZmZmNSwgMHgzZmZmNiwgMHgzZmZmNywKKyAgICAweDNmZmY4LCAweDNmZmY5LCAweDNmZmZhLCAweDNmZmZiLCAweDNmZmZjLCAweDNmZmZkLCAweDNmZmZlLCAweDdmZmZlLAorICAgIDB4N2ZmZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0X2h1ZmZtYW5fZW52XzNfMGRCX2JpdHNbNjNdID0geworICAgIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE3LCAxNiwgMTYsIDE2LCAxNCwgMTQsIDE0LAorICAgIDEzLCAxMiwgMTEsICA4LCAgNiwgIDQsICAyLCAgMSwKKyAgICAgMywgIDUsICA3LCAgOSwgMTEsIDEzLCAxNCwgMTQsCisgICAgMTUsIDE2LCAxNywgMTgsIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB0X2h1ZmZtYW5fZW52XzNfMGRCX2NvZGVzWzYzXSA9IHsKKyAgICAweDNmZmVkLCAweDNmZmVlLCAweDdmZmRlLCAweDdmZmRmLCAweDdmZmUwLCAweDdmZmUxLCAweDdmZmUyLCAweDdmZmUzLAorICAgIDB4N2ZmZTQsIDB4N2ZmZTUsIDB4N2ZmZTYsIDB4N2ZmZTcsIDB4N2ZmZTgsIDB4N2ZmZTksIDB4N2ZmZWEsIDB4N2ZmZWIsCisgICAgMHg3ZmZlYywgMHgxZmZmNCwgMHgwZmZmNywgMHgwZmZmOSwgMHgwZmZmOCwgMHgwM2ZmYiwgMHgwM2ZmYSwgMHgwM2ZmOCwKKyAgICAweDAxZmZhLCAweDAwZmZjLCAweDAwN2ZjLCAweDAwMGZlLCAweDAwMDNlLCAweDAwMDBlLCAweDAwMDAyLCAweDAwMDAwLAorICAgIDB4MDAwMDYsIDB4MDAwMWUsIDB4MDAwN2UsIDB4MDAxZmUsIDB4MDA3ZmQsIDB4MDFmZmIsIDB4MDNmZjksIDB4MDNmZmMsCisgICAgMHgwN2ZmYSwgMHgwZmZmNiwgMHgxZmZmNSwgMHgzZmZlYywgMHg3ZmZlZCwgMHg3ZmZlZSwgMHg3ZmZlZiwgMHg3ZmZmMCwKKyAgICAweDdmZmYxLCAweDdmZmYyLCAweDdmZmYzLCAweDdmZmY0LCAweDdmZmY1LCAweDdmZmY2LCAweDdmZmY3LCAweDdmZmY4LAorICAgIDB4N2ZmZjksIDB4N2ZmZmEsIDB4N2ZmZmIsIDB4N2ZmZmMsIDB4N2ZmZmQsIDB4N2ZmZmUsIDB4N2ZmZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBmX2h1ZmZtYW5fZW52XzNfMGRCX2JpdHNbNjNdID0geworICAgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAxOCwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTgsIDE4LCAyMCwgMTksCisgICAgMTcsIDE4LCAxNywgMTYsIDE2LCAxNSwgMTQsIDEyLAorICAgIDExLCAxMCwgIDksICA4LCAgNiwgIDQsICAyLCAgMSwKKyAgICAgMywgIDUsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsCisgICAgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNywgMTcsIDE4LAorICAgIDE4LCAxOCwgMjAsIDE5LCAxOSwgMTksIDIwLCAxOSwKKyAgICAxOSwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBmX2h1ZmZtYW5fZW52XzNfMGRCX2NvZGVzWzYzXSA9IHsKKyAgICAweGZmZmYwLCAweGZmZmYxLCAweGZmZmYyLCAweGZmZmYzLCAweGZmZmY0LCAweGZmZmY1LCAweGZmZmY2LCAweDNmZmYzLAorICAgIDB4N2ZmZjUsIDB4N2ZmZWUsIDB4N2ZmZWYsIDB4N2ZmZjYsIDB4M2ZmZjQsIDB4M2ZmZjIsIDB4ZmZmZjcsIDB4N2ZmZjAsCisgICAgMHgxZmZmNSwgMHgzZmZmMCwgMHgxZmZmNCwgMHgwZmZmNywgMHgwZmZmNiwgMHgwN2ZmOCwgMHgwM2ZmYiwgMHgwMGZmZCwKKyAgICAweDAwN2ZkLCAweDAwM2ZkLCAweDAwMWZkLCAweDAwMGZkLCAweDAwMDNlLCAweDAwMDBlLCAweDAwMDAyLCAweDAwMDAwLAorICAgIDB4MDAwMDYsIDB4MDAwMWUsIDB4MDAwZmMsIDB4MDAxZmMsIDB4MDAzZmMsIDB4MDA3ZmMsIDB4MDBmZmMsIDB4MDFmZmMsCisgICAgMHgwM2ZmYSwgMHgwN2ZmOSwgMHgwN2ZmYSwgMHgwZmZmOCwgMHgwZmZmOSwgMHgxZmZmNiwgMHgxZmZmNywgMHgzZmZmNSwKKyAgICAweDNmZmY2LCAweDNmZmYxLCAweGZmZmY4LCAweDdmZmYxLCAweDdmZmYyLCAweDdmZmYzLCAweGZmZmY5LCAweDdmZmY3LAorICAgIDB4N2ZmZjQsIDB4ZmZmZmEsIDB4ZmZmZmIsIDB4ZmZmZmMsIDB4ZmZmZmQsIDB4ZmZmZmUsIDB4ZmZmZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0X2h1ZmZtYW5fZW52X2JhbF8zXzBkQl9iaXRzWzI1XSA9IHsKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsCisgICAgIDgsICA3LCAgNCwgIDMsICAxLCAgMiwgIDUsICA2LAorICAgICA5LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwKKyAgICAxNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB0X2h1ZmZtYW5fZW52X2JhbF8zXzBkQl9jb2Rlc1syNV0gPSB7CisgICAgMHgxZmYyLCAweDFmZjMsIDB4MWZmNCwgMHgxZmY1LCAweDFmZjYsIDB4MWZmNywgMHgxZmY4LCAweDBmZjgsCisgICAgMHgwMGZlLCAweDAwN2UsIDB4MDAwZSwgMHgwMDA2LCAweDAwMDAsIDB4MDAwMiwgMHgwMDFlLCAweDAwM2UsCisgICAgMHgwMWZlLCAweDFmZjksIDB4MWZmYSwgMHgxZmZiLCAweDFmZmMsIDB4MWZmZCwgMHgxZmZlLCAweDNmZmUsCisgICAgMHgzZmZmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZl9odWZmbWFuX2Vudl9iYWxfM18wZEJfYml0c1syNV0gPSB7CisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDExLAorICAgICA4LCAgNywgIDQsICAyLCAgMSwgIDMsICA1LCAgNiwKKyAgICAgOSwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgZl9odWZmbWFuX2Vudl9iYWxfM18wZEJfY29kZXNbMjVdID0geworICAgIDB4MWZmNywgMHgxZmY4LCAweDFmZjksIDB4MWZmYSwgMHgxZmZiLCAweDNmZjgsIDB4M2ZmOSwgMHgwN2ZjLAorICAgIDB4MDBmZSwgMHgwMDdlLCAweDAwMGUsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDYsIDB4MDAxZSwgMHgwMDNlLAorICAgIDB4MDFmZSwgMHgwZmZhLCAweDFmZjYsIDB4M2ZmYSwgMHgzZmZiLCAweDNmZmMsIDB4M2ZmZCwgMHgzZmZlLAorICAgIDB4M2ZmZiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRfaHVmZm1hbl9ub2lzZV8zXzBkQl9iaXRzWzYzXSA9IHsKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDExLCAgOCwgIDYsICA0LCAgMywgIDEsCisgICAgIDIsICA1LCAgOCwgMTAsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgdF9odWZmbWFuX25vaXNlXzNfMGRCX2NvZGVzWzYzXSA9IHsKKyAgICAweDFmY2UsIDB4MWZjZiwgMHgxZmQwLCAweDFmZDEsIDB4MWZkMiwgMHgxZmQzLCAweDFmZDQsIDB4MWZkNSwKKyAgICAweDFmZDYsIDB4MWZkNywgMHgxZmQ4LCAweDFmZDksIDB4MWZkYSwgMHgxZmRiLCAweDFmZGMsIDB4MWZkZCwKKyAgICAweDFmZGUsIDB4MWZkZiwgMHgxZmUwLCAweDFmZTEsIDB4MWZlMiwgMHgxZmUzLCAweDFmZTQsIDB4MWZlNSwKKyAgICAweDFmZTYsIDB4MWZlNywgMHgwN2YyLCAweDAwZmQsIDB4MDAzZSwgMHgwMDBlLCAweDAwMDYsIDB4MDAwMCwKKyAgICAweDAwMDIsIDB4MDAxZSwgMHgwMGZjLCAweDAzZjgsIDB4MWZjYywgMHgxZmU4LCAweDFmZTksIDB4MWZlYSwKKyAgICAweDFmZWIsIDB4MWZlYywgMHgxZmNkLCAweDFmZWQsIDB4MWZlZSwgMHgxZmVmLCAweDFmZjAsIDB4MWZmMSwKKyAgICAweDFmZjIsIDB4MWZmMywgMHgxZmY0LCAweDFmZjUsIDB4MWZmNiwgMHgxZmY3LCAweDFmZjgsIDB4MWZmOSwKKyAgICAweDFmZmEsIDB4MWZmYiwgMHgxZmZjLCAweDFmZmQsIDB4MWZmZSwgMHgzZmZlLCAweDNmZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0X2h1ZmZtYW5fbm9pc2VfYmFsXzNfMGRCX2JpdHNbMjVdID0geworICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgOCwgOCwgNSwgMiwgMSwgMywgNiwgOCwKKyAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0X2h1ZmZtYW5fbm9pc2VfYmFsXzNfMGRCX2NvZGVzWzI1XSA9IHsKKyAgICAweGVjLCAweGVkLCAweGVlLCAweGVmLCAweGYwLCAweGYxLCAweGYyLCAweGYzLAorICAgIDB4ZjQsIDB4ZjUsIDB4MWMsIDB4MDIsIDB4MDAsIDB4MDYsIDB4M2EsIDB4ZjYsCisgICAgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwKKyAgICAweGZmLAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBzYnJfb2Zmc2V0WzZdWzE2XSA9IHsKKyAgICB7LTgsIC03LCAtNiwgLTUsIC00LCAtMywgLTIsIC0xLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9LCAvLyAgICAgICAgICAgICBmc19zYnIgID0gMTYwMDAgSHoKKyAgICB7LTUsIC00LCAtMywgLTIsIC0xLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA5LCAxMSwgMTN9LCAvLyAgICAgICAgICAgICBmc19zYnIgID0gMjIwNTAgSHoKKyAgICB7LTUsIC0zLCAtMiwgLTEsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDksIDExLCAxMywgMTZ9LCAvLyAgICAgICAgICAgICBmc19zYnIgID0gMjQwMDAgSHoKKyAgICB7LTYsIC00LCAtMiwgLTEsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDksIDExLCAxMywgMTZ9LCAvLyAgICAgICAgICAgICBmc19zYnIgID0gMzIwMDAgSHoKKyAgICB7LTQsIC0yLCAtMSwgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOSwgMTEsIDEzLCAxNiwgMjB9LCAvLyA0NDEwMCBIeiA8PSBmc19zYnIgPD0gNjQwMDAgSHoKKyAgICB7LTIsIC0xLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA5LCAxMSwgMTMsIDE2LCAyMCwgMjR9LCAvLyA2NDAwMCBIeiA8ICBmc19zYnIKK307CisKKy8qIEZpcnN0IGVpZ2h0IGVudHJpZXMgcmVwZWF0ZWQgYXQgZW5kIHRvIHNpbXBsaWZ5IFNJTUQgaW1wbGVtZW50YXRpb25zLiAqLworY29uc3QgREVDTEFSRV9BTElHTkVEKDE2LCBmbG9hdCwgZmZfc2JyX25vaXNlX3RhYmxlKVtdWzJdID0geworey0wLjk5OTQ4MTUzMjc4Mjk2LCAtMC41OTQ4MzQxNzUxNjYwN30sIHsgMC45NzExMzQ1NDM5Mzk5MSwgLTAuNjc1Mjg1MTUyMjU2NDd9LAoreyAwLjE0MTMwMDUxNzU4NDg3LCAtMC45NTA5MDk4MzU3NTY4OX0sIHstMC40NzAwNTQ5NjcwMTY5NywgLTAuMzczNDA1NDk3Mjg2NDd9LAoreyAwLjgwNzA1MDYzNzY5MzUxLCAgMC4yOTY1MzY2ODI4NDQwOH0sIHstMC4zODk4MTQ3ODg5NjkyNiwgIDAuODk1NzI2MDU3MTcwODd9LAorey0wLjAxMDUzMDQ5ODYyMDIwLCAtMC42Njk1OTA1ODAzNjE2Nn0sIHstMC45MTI2NjM2Nzk1NzI5MywgLTAuMTE1MjI5MzgxNDAwMzR9LAoreyAwLjU0ODQwNDIyOTEwMzA5LCAgMC43NTIyMTM2NzE3NjMwMn0sIHsgMC40MDAwOTI1Mjg2Nzk1NSwgLTAuOTg5Mjk0MDAzMzQ0MjF9LAorey0wLjk5ODY3OTc0NzExODU1LCAtMC44ODE0NzA2ODY0NTM1OH0sIHstMC45NTUzMTA3NjgwNTA0MCwgIDAuOTA5MDg3NTcxNTQ1OTN9LAorey0wLjQ1NzI1OTMzMzE3MTQ0LCAtMC41NjcxNjMyMzY0Njc2MH0sIHstMC43MjkyOTY3NTAyOTI3NSwgLTAuOTgwMDgyNzI3MjczMjR9LAoreyAwLjc1NjIyODAxMzk5MDM2LCAgMC4yMDk1MDMyOTk5NTU0OX0sIHsgMC4wNzA2OTQ0MjYwMTA1MCwgLTAuNzgyNDc4OTg0NzA3MDZ9LAoreyAwLjc0NDk2MjUyOTI2MDU1LCAtMC45MTE2OTAwNDQ0NTgwN30sIHstMC45NjQ0MDE4MjcwMzg1NiwgLTAuOTQ3Mzk5MTgyOTY2MjJ9LAoreyAwLjMwNDI0NjI5MzY5NTM5LCAtMC40OTQzODI2NzAxMjQ3OX0sIHsgMC42NjU2NTAzMzc0NjkyNSwgIDAuNjQ2NTI5MzU1NDI0OTF9LAoreyAwLjkxNjk3MDA4MDIwNTk0LCAgMC4xNzUxNDA5NzMzMjAwOX0sIHstMC43MDc3NDkxODc2MDQyNywgIDAuNTI1NDg2NTM0MTY1NDN9LAorey0wLjcwMDUxNDE1MzQ1NTYwLCAtMC40NTM0MDAyODgwODc2M30sIHstMC45OTQ5NjUxMzA1NDc5NywgLTAuOTAwNzE5MDgwNjY5NzN9LAoreyAwLjk4MTY0NDkwNzkwMTIzLCAtMC43NzQ2MzE1NTUyODY5N30sIHstMC41NDY3MTU4MDU0ODE4MSwgLTAuMDI1NzA5Mjg1MzYwMDR9LAorey0wLjAxNjg5NjI5MDY1Mzg5LCAgMC4wMDI4NzUwNjQ0NTczMn0sIHstMC44NjExMDM0OTUzMTk4NiwgIDAuNDI1NDg1ODM3MjY0Nzd9LAorey0wLjk4ODkyOTgwNTg2MDMyLCAtMC44Nzg4MTEzMjI2NzU1Nn0sIHsgMC41MTc1NjYyNzY3ODY5MSwgIDAuNjY5MjY3ODQ3MTAxMzl9LAorey0wLjk5NjM1MDI2NDA5NjQwLCAtMC41ODEwNzczMDU3NDc2NX0sIHstMC45OTk2OTM3MDg2MjE2MywgIDAuOTgzNjk5ODkzNjAyNTB9LAoreyAwLjU1MjY2MjU4NjI3MTk0LCAgMC41OTQ0OTA1NzQ2NTU5MX0sIHsgMC4zNDU4MTE3Nzc0MTY3MywgIDAuOTQ4Nzk0MjEwNjE4NjZ9LAoreyAwLjYyNjY0MjA5NTc3OTk5LCAtMC43NDQwMjk3MDkwNjQ3MX0sIHstMC43NzE0OTcwMTQwNDk3MywgLTAuMzM4ODM2NTgwNDI4MDF9LAorey0wLjkxNTkyMjQ0MjU0NDMyLCAgMC4wMzY4NzkwMTM3NjcxM30sIHstMC43NjI4NTQ5MjM1Nzg4NywgLTAuOTEzNzE4Njc5MTkxMjR9LAoreyAwLjc5Nzg4MzM3MTk1MzMxLCAtMC45MzE4MDk3MTE5OTg0OX0sIHsgMC41NDQ3MzA4MDYxMDIwMCwgLTAuMTE5MTkyMDYwMzcxODZ9LAorey0wLjg1NjM5MjgxNjcxMDU4LCAgMC40MjQyOTg1NDc2MDQ1MX0sIHstMC45Mjg4MjQwMjk3MTQyMywgIDAuMjc4NzE4MDkwNzg2MDl9LAorey0wLjExNzA4MzcxMDQ2Nzc0LCAtMC45OTgwMDg0MzQ0NDk2Nn0sIHsgMC4yMTM1Njc0OTgxNzQ5MywgLTAuOTA3MTYyOTU2MjcwMzN9LAorey0wLjc2MTkxNjkyNTczOTA5LCAgMC45OTc2ODExODM1NjI2NX0sIHsgMC45ODExMTA0MzEwMDg4NCwgLTAuOTU4NTQ0NTk3MzQ0MDd9LAorey0wLjg1OTEzMjY5ODk1NTcyLCAgMC45NTc2NjU2NjE2ODg4MH0sIHstMC45MzMwNzI0MjI1MzY5MiwgIDAuNDk0MzE3NTc2OTY0NjZ9LAoreyAwLjMwNDg1NzU0ODc5NjMyLCAtMC43MDU0MDAzNDM1NzUyOX0sIHsgMC44NTI4OTY1MDkyNTE5MCwgIDAuNDY3NjYxMzE3OTEwNDR9LAoreyAwLjkxMzI4MDgyNjE4MTI1LCAtMC45OTgzOTU5NzM2MTc2OX0sIHstMC4wNTg5MDE5OTkyNDE1NCwgIDAuNzA3NDE4Mjc4MTk0OTd9LAoreyAwLjI4Mzk4Njg2MTUwMTQ4LCAgMC4zNDYzMzU1NTcwMjE4OH0sIHsgMC45NTI1ODE2NDUzOTYxMiwgLTAuNTQ4OTM0MTYwMjY5Mzl9LAorey0wLjc4NTY2MzI0MTY4NTA3LCAtMC43NTU2ODU0MTA3OTY5MX0sIHstMC45NTc4OTQ5NTQ0Nzg3NywgLTAuMjA0MjMxOTQ2OTY5NjZ9LAoreyAwLjgyNDExMTU4NzExMTk3LCAgMC45NjY1NDYxODQzMjU2Mn0sIHstMC42NTE4NTQ0NjczNTg4NSwgLTAuODg3MzQ5OTA3NzMyODl9LAorey0wLjkzNjQzNjAzMTM0NjY2LCAgMC45OTg3MDc5MDQ0MjM4NX0sIHsgMC45MTQyNzE1OTUyOTYxOCwgLTAuOTgyOTA1MDU1NDQ0NDR9LAorey0wLjcwMzk1Njg0MDM2ODg2LCAgMC41ODc5Njc5ODIyMTAzOX0sIHsgMC4wMDU2Mzc3MTk2OTM2NSwgIDAuNjE3NjgxOTY3MjcyNDR9LAoreyAwLjg5MDY1MDUxOTMxODk1LCAgMC41Mjc4MzM1MjY5NzU4NX0sIHstMC42ODY4MzcwNzcxMjc2MiwgIDAuODA4MDY5NDQ3MTAzMzl9LAoreyAwLjcyMTY1MzQyNTE4NzE4LCAtMC42OTI1OTg1NzM0OTU2NH0sIHstMC42MjkyODI0NzczMDY2NywgIDAuMTM2MjcwMzc0MDczMzV9LAoreyAwLjI5OTM4NDM0MDY1NTE0LCAtMC40NjA1MTMyOTY4MjI0Nn0sIHstMC45MTc4MTk1ODg3OTI4MCwgLTAuNzQwMTI3MTY2ODQxODZ9LAoreyAwLjk5Mjk4NzE3MDQzNjg4LCAgMC40MDgxNjYxMDA3NTY2MX0sIHsgMC44MjM2ODI5ODYyMjc0OCwgLTAuNzQwMzYwNDcxOTAxNzN9LAorey0wLjk4NTEyODMzMzg2ODMzLCAtMC45OTk3MjMzMDcwOTU5NH0sIHstMC45NTkxNTM2ODI0MjI1NywgLTAuOTkyMzc4MDA0NjYwNDB9LAorey0wLjIxNDExMTI2NTcyNzkwLCAtMC45MzQyNDgxOTA1MjU0NX0sIHstMC42ODgyMTQ3NjEwNjg4NCwgLTAuMjY4OTIzMDYzMTU0NTd9LAoreyAwLjkxODUxOTk3OTgyMzE3LCAgMC4wOTM1ODIyODkwMTc4NX0sIHstMC45NjA2Mjc2OTU1OTEyNywgIDAuMzYwOTkwOTUxMzM3Mzl9LAoreyAwLjUxNjQ2MTg0OTIyMjg3LCAtMC43MTM3MzMzMjg3MzkxN30sIHsgMC42MTEzMDcyMTEzOTY2OSwgIDAuNDY5NTAxNDExNzU5MTd9LAoreyAwLjQ3MzM2MTI5MzcxMjk5LCAtMC4yNzMzMzE3ODI5NjE2Mn0sIHsgMC45MDk5ODMwODcwMzUxOSwgIDAuOTY3MTU2NjI5MzgxMzJ9LAoreyAwLjQ0ODQ0Nzk5MTk0MzU3LCAgMC45OTIxMTU3NDYyODMwNn0sIHsgMC42NjYxNDg5MTA3OTA5MiwgIDAuOTY1OTAxNzYxNjkxMjF9LAoreyAwLjc0OTIyMjM5MTI5MjM3LCAtMC44OTg3OTg1ODgyNjA4N30sIHstMC45OTU3MTU4ODUwNjQ4NSwgIDAuNTI3ODU1MjE0OTQzNDl9LAoreyAwLjk3NDAxMDgyNDc3NTYzLCAtMC4xNjg1NTg3MDA3NTE5MH0sIHsgMC43MjY4Mzc0NzczMzg3OSwgLTAuNDgwNjA3NzQ0MzIyNTF9LAoreyAwLjk1NDMyMTkzNDU3MTI4LCAgMC42ODg0OTYwMzQwODQ0MX0sIHstMC43Mjk2MjIwODQyNTE5MSwgLTAuNzY2MDg0NDM0MjA5MTd9LAorey0wLjg1MzU5NDc5MjMzNTM3LCAgMC44ODczODEyNTkwMTU3OX0sIHstMC44MTQxMjQzMDMzODUzNSwgLTAuOTc0ODA3NjgwNDk2Mzd9LAorey0wLjg3OTMwNzcyMzU2Nzg2LCAgMC43NDc0ODMwNzY5MDQzNn0sIHstMC43MTU3MzMzMTA2NDk3NywgLTAuOTg1NzA2MDgxNzg5MjN9LAoreyAwLjgzNTI0MzAwMDI4MjI4LCAgMC44MzcwMjUzNzA3NTE2M30sIHstMC40ODA4NjA2NTYwMTQyMywgLTAuOTg4NDg1MDQ5MjM1MzF9LAoreyAwLjk3MTM5MTI4NTc0Nzc4LCAgMC44MDA5MzYyMTE5ODIzNn0sIHsgMC41MTk5MjgyNTM0Nzg5NSwgIDAuODAyNDc2MzE0MDA1MTB9LAorey0wLjAwODQ4NTkxMTk1MzI1LCAtMC43NjY3MDEyODAwMDQ4Nn0sIHstMC43MDI5NDM3NDMwMzAzNiwgIDAuNTUzNTk5MTA0NDU1Nzd9LAorey0wLjk1ODk0NDI4MTY4MTQwLCAtMC40MzI2NTUwNDM0NDc4M30sIHsgMC45NzA3OTI1Mjk1MDMyMSwgIDAuMDkzMjU4NTcyMzg2ODJ9LAorey0wLjkyNDA0MjkzNjcwNzk3LCAgMC44NTUwNzcwNDAyNzg1NX0sIHstMC42OTUwNjQ2OTUwMDQ1MCwgIDAuOTg2MzM0MTI2MjU0NTl9LAoreyAwLjI2NTU5MjAzNjIwMDI0LCAgMC43MzMxNDMwNzk2NjUyNH0sIHsgMC4yODAzODQ0MzMzNjk0MywgIDAuMTQ1Mzc5MTM2NTQ0Mjd9LAorey0wLjc0MTM4MTI0ODI1NTIzLCAgMC45OTMxMDMzOTgwNzc2Mn0sIHstMC4wMTc1Mjc5NTk5NTQ0NCwgLTAuODI2MTY2MzUyODQxNzh9LAorey0wLjU1MTI2NzczMDk0OTMwLCAtMC45ODg5ODU0Mzg2MjE1M30sIHsgMC45Nzk2MDg5ODg1MDk5NiwgLTAuOTQwMjE0NDY3NTI4NTF9LAorey0wLjk5MTk2MzA5MTQ2OTM2LCAgMC42NzAxOTAxNzM1ODQ1Nn0sIHstMC42NzY4NDkyODA4NTI2MCwgIDAuMTI2MzE0OTE2NDkzNzh9LAoreyAwLjA5MTQwMDM5NDY1NTAwLCAtMC4yMDUzNzczMTQ1MzEwOH0sIHstMC43MTY1ODk2NTc1MTk5NiwgLTAuOTc3ODgyMDAzOTEyMjR9LAoreyAwLjgxMDE0NjQwMDc4OTI1LCAgMC41MzcyMjY0ODM2MjQ0M30sIHsgMC40MDYxNjk5MTY3MTIwNSwgLTAuMjY0NjkwMDg1OTg0NDl9LAorey0wLjY3NjgwMTg4NjgyOTcyLCAgMC45NDUwMjA1MjMzNzY5NX0sIHsgMC44Njg0OTc3NDM0ODc0OSwgLTAuMTgzMzM1OTg2NDc4OTl9LAorey0wLjk5NTAwMzgxMjg0ODUxLCAtMC4wMjYzNDEyMjA2ODU1MH0sIHsgMC44NDMyOTE4OTM0MDY2NywgIDAuMTA0MDY5NTc0NjIyMTN9LAorey0wLjA5MjE1OTY4NTMxNDQ2LCAgMC42OTU0MDAxMjEwMTI1M30sIHsgMC45OTk1NjE3MzMyNzIwNiwgLTAuMTIzNTg1NDIwMDE0MDR9LAorey0wLjc5NzMyNzc5NDczNTM1LCAtMC45MTU4MjUyNDczNjE1OX0sIHsgMC45NjM0OTk3MzY0MjQwNiwgIDAuOTY2NDA0NTgwNDEwMDB9LAorey0wLjc5OTQyNzc4NDk2NTQ3LCAgMC42NDMyMzkwMjgyMjg1N30sIHstMC4xMTU2NjAzOTg1Mzg5NiwgIDAuMjg1ODc4NDYyNTM3MjZ9LAorey0wLjM5OTIyOTU0NTE0NjYyLCAgMC45NDEyOTYwMTYxNjk2Nn0sIHsgMC45OTA4OTE5NzU2NTk4NywgLTAuOTIwNjI2MjU1ODE1ODd9LAoreyAwLjI4NjMxMjg1MTc5OTA5LCAtMC45MTAzNTA0NzE0MzYwM30sIHstMC44MzMwMjcyNTYwNTYwOCwgLTAuNjczMzA0MTA4OTIwODR9LAoreyAwLjk1NDA0NDQzNDAyMDcyLCAgMC40OTE2Mjc2NTM5ODc0M30sIHstMC4wNjQ0OTg2MzU3OTQzNCwgIDAuMDMyNTA1NjA4MTMxMzV9LAorey0wLjk5NTc1MDU0NDg2MzExLCAgMC40MjM4OTc4NDQ2OTUwN30sIHstMC42NTUwMTE0Mjc5MDg0NywgIDAuODI1NDYxMTQ2NTU2MjR9LAorey0wLjgxMjU0NDQxOTA4ODg3LCAtMC41MTYyNzIzNDY2MDYyOX0sIHstMC45OTY0NjM2OTQ4NTQ4MSwgIDAuODQ0OTA1MzM1MjA3NTJ9LAoreyAwLjAwMjg3ODQwNjAzMzQ4LCAgMC42NDc2ODI2MTE1ODE2Nn0sIHsgMC43MDE3Njk4OTQwODQ1NSwgLTAuMjA0NTMwMjg1NzMzMjJ9LAoreyAwLjk2MzYxODgyMjcwMTkwLCAgMC40MDcwNjk2NzE0MDk4OX0sIHstMC42ODg4Mzc1ODE5MjQyNiwgIDAuOTEzMzg5NTg4NDA3NzJ9LAorey0wLjM0ODc1NTg1NTAyMjM4LCAgMC43MTQ3MjI5MDY5MzMwMH0sIHsgMC45MTk4MDA4MTI0MzA4NywgIDAuNjY1MDc0NTU2NDQ5MTl9LAorey0wLjk5MDA5MDQ4MzQzODgxLCAgMC44NTg2ODAyMTYwNDg0OH0sIHsgMC42ODg2NTc5MTQ1ODM5NSwgIDAuNTU2NjAzMTY4MDk2Nzh9LAorey0wLjk5NDg0NDAyMTI5MzY4LCAtMC4yMDA1MjU1OTI1NDkzNH0sIHsgMC45NDIxNDUxMTQwODAyMywgLTAuOTk2OTY0MjUzNjc0NjF9LAorey0wLjY3NDE0NjI2NzkzNTQ0LCAgMC40OTU0ODIyMTE4MDA3OH0sIHstMC40NzMzOTM1MzY4NDY2NCwgLTAuODU5MDQzMjg4MzQwNDd9LAoreyAwLjE0MzIzNjUxMzg3MzYwLCAtMC45NDE0NTU5ODIyMjQ4OH0sIHstMC4yOTI2ODI5MzU3NTY3MiwgIDAuMDU3NTkyMjQ5Mjc5NTJ9LAoreyAwLjQzNzkzODYxNDU4NzU0LCAtMC43ODkwNDk2OTg5MjcyNH0sIHstMC4zNjM0NTEyNjM3NDQ0MSwgIDAuNjQ4NzQ0MzUzNTcxNjJ9LAorey0wLjA4NzUwNjA0NjU2ODI1LCAgMC45NzY4Njk0NDM2MjUyN30sIHstMC45NjQ5NTI2NzgxMjUxMSwgLTAuNTM5NjAzMDU5NDY1MTF9LAoreyAwLjU1NTI2OTQwNjU5OTQ3LCAgMC43ODg5MTUyMzczNDc3NH0sIHsgMC43MzUzODIxNTc1MjYzMCwgIDAuOTY0NTIwNzIzNzM0MDR9LAorey0wLjMwODg5NzczOTE5NDM3LCAtMC44MDY2NDM4OTc3Njg2MH0sIHsgMC4wMzU3NDk5NTYyNjE5NCwgLTAuOTczMjU2MTY5MDA5NTl9LAoreyAwLjk4NzIwNjg0NjYwNDg4LCAgMC40ODQwOTEzMzY5MTk2Mn0sIHstMC44MTY4OTI5NjI3MTIwMywgLTAuOTA4Mjc3MDM2MjgyOTh9LAoreyAwLjY3ODY2ODYwMTE4MjE1LCAgMC44MTI4NDUwMzg3MDg1Nn0sIHstMC4xNTgwODU2OTczMjU4MywgIDAuODUyNzk1NTUwMjQzODJ9LAoreyAwLjgwNzIzMzk1MTE0MzcxLCAtMC4yNDcxNzQxODUxNDYwNX0sIHsgMC40Nzc4ODc1NzMyOTAzOCwgLTAuNDYzMzMxNDc4MzkyOTV9LAoreyAwLjk2MzY3NTU0NzYzMjAxLCAgMC4zODQ4Njc0OTMwMzI0Mn0sIHstMC45OTE0Mzg3NTcxNjgxOCwgLTAuMjQ5NDUyNzcyMzk4MDl9LAoreyAwLjgzMDgxODc2OTI1ODMzLCAtMC45NDc4MDg1MTQxNDc2M30sIHstMC41ODc1MzE5MTkwNTM0MSwgIDAuMDEyOTA3NzIzODkxNjN9LAoreyAwLjk1NTM4MTA4MjIwOTYwLCAtMC44NTU1NzA1MjA5NjUzOH0sIHstMC45NjQ5MDkyMDQ3NjIxMSwgLTAuNjQwMjA5NzA5MjMxMDJ9LAorey0wLjk3MzI3MTAxMDI4NTIxLCAgMC4xMjM3ODEyODEzMzExMH0sIHsgMC45MTQwMDM2NjAyMjEyNCwgIDAuNTc5NzI0NzEzNDY5MzB9LAorey0wLjk5OTI1ODM3MzYzODI0LCAgMC43MTA4NDg0Nzg2NDA2N30sIHstMC44Njg3NTkwMzUwNzMxMywgLTAuMjAyOTE2OTkyMDM1NjR9LAorey0wLjI2MjQwMDM0Nzk1MTI0LCAtMC42ODI2NDU1NDM2OTEwOH0sIHstMC4yNDY2NDQxMjk1MzM4OCwgLTAuODc2NDIyNzMxMTUxODN9LAoreyAwLjAyNDE2Mjc1ODA2ODY5LCAgMC4yNzE5MjkxNDI4ODkwNX0sIHsgMC44MjA2ODYxOTU5MDUxNSwgLTAuODUwODc3ODc5OTQ0NzZ9LAoreyAwLjg4NTQ3MzczNzYwNzU5LCAtMC44OTYzNjgwMjkwMTQ2OX0sIHstMC4xODE3MzA3ODE1MjIyNiwgLTAuMjYxNTIxNDUxNTY4MDB9LAoreyAwLjA5MzU1NDc2NTU4NTM0LCAgMC41NDg0NTEyMzA0NTYwNH0sIHstMC41NDY2ODQxNDIyNDA5MCwgIDAuOTU5ODA3NzQwMjAyMjF9LAoreyAwLjM3MDUwOTkwNjA0MDkxLCAtMC41OTkxMDE0MDM4MzE3MX0sIHstMC43MDM3MzU5NDI2Mjg5MSwgIDAuOTEyMjc2NjU4MjcwODF9LAorey0wLjM0NjAwNzg1ODc5NTk0LCAtMC45OTQ0MTQyNjE0NDIwMH0sIHstMC42ODc3NDQ4MTczMTAwOCwgLTAuMzAyMzg4Mzc5NTYyOTl9LAorey0wLjI2ODQzMjkxMjUxMjM0LCAgMC44MzExNTY2ODAwNDM2Mn0sIHsgMC40OTA3MjMzNDYxMzI0MiwgLTAuNDUzNTk3MDg3Mzc3NzV9LAoreyAwLjM4OTc1OTkzMDkzOTc1LCAgMC45NTUxNTM1ODA5OTEyMX0sIHstMC45Nzc1NzEyNTIyNDE1MCwgIDAuMDUzMDU4OTQ1ODA2MDZ9LAorey0wLjE3MzI1NTUyODU5NjE2LCAtMC45Mjc3MDY3MjI1MDQ5NH0sIHsgMC45OTk0ODAzNTAyNTc0NCwgIDAuNTgyODU1NDU1NjM0MjZ9LAorey0wLjY0OTQ2MjQ2NTI3NDU4LCAgMC42ODY0NTUwNzEwNDk2MH0sIHstMC4xMjAxNjkyMDU3NjQzNywgLTAuNTcxNDczMjIxNTMzMTJ9LAorey0wLjU4OTQ3NDU2NTE3NzUxLCAtMC4zNDg0NzEzMjQ1NDM4OH0sIHstMC40MTgxNTE0MDQ1NDQ2NSwgIDAuMTYyNzY0MjIzNTg4NjF9LAoreyAwLjk5ODg1NjUwMjA0ODg0LCAgMC4xMTEzNjA5NTQ5MDQ0NH0sIHstMC41NjY0OTYxNDEyODM4NiwgLTAuOTA0OTQ4NjYzNjE1ODd9LAoreyAwLjk0MTM4MDIxMDMyMzMwLCAgMC4zNTI4MTkxNjczMzAxOH0sIHstMC43NTcyNTA3NjUzNDY0MSwgIDAuNTM2NTA1NDk2NDA1ODd9LAoreyAwLjIwNTQxOTczNjkyNjMwLCAtMC45NDQzNTE0NDM2OTkxOH0sIHsgMC45OTk4MDM3MTAyMzM1MSwgIDAuNzk4MzU5MTM1NjU1OTl9LAoreyAwLjI5MDc4Mjc3NjA1Nzc1LCAgMC4zNTM5Mzc3NzkyMTUyMH0sIHstMC42Mjg1ODc3MjEwMzAzMCwgIDAuMzg3NjU2OTMzODcxMDJ9LAoreyAwLjQzNDQwOTA0NDY3Njg4LCAtMC45ODU0NjMzMDQ2MzIzMn0sIHstMC45ODI5ODU4Mzc2MjM5MCwgIDAuMjEwMjE1MjQ2MjUyMDl9LAoreyAwLjE5NTEzMDI5MTQ2OTM0LCAtMC45NDIzOTgzMjI1MTg2N30sIHstMC45NTQ3NjY2MjQwMDEwMSwgIDAuOTgzNjQ1NTQxNzkxNDN9LAoreyAwLjkzMzc5NjM1MzA0ODEwLCAtMC43MDg4MTk5NDU4MzY4Mn0sIHstMC44NTIzNTQxMDU3MzMzNiwgLTAuMDgzNDIzNDc5NjY0MTB9LAorey0wLjg2NDI1MDkzMDExMjQ1LCAtMC40NTc5NTAyNTAyOTQ2Nn0sIHsgMC4zODg3OTc3OTA1OTA0NSwgIDAuOTcyNzQ0MjkzNDQ1OTN9LAoreyAwLjkyMDQ1MTI0NzM1NDk1LCAtMC42MjQzMzY1MjUyNDIyMH0sIHsgMC44OTE2MjUzMjI1MTg3OCwgIDAuNTQ5NTA5NTU1NzA1NjN9LAorey0wLjM2ODM0MzM2OTQ5MjUyLCAgMC45NjQ1ODI5ODAyMDk3NX0sIHsgMC45Mzg5MTc2MDk4ODA0NSwgLTAuODk5NjgzNTM3NDAzODh9LAoreyAwLjk5MjY3NjU3NTY1MDk0LCAtMC4wMzc1NzAzNDMxNjk1OH0sIHstMC45NDA2MzQ3MTYxNDE3NiwgIDAuNDEzMzIzMzg1Mzg5NjN9LAoreyAwLjk5NzQwMjI0MTE3MDE5LCAtMC4xNjgzMDQ5NDk5NjM3MH0sIHstMC4zNTg5OTQxMzE3MDU1NSwgLTAuNDY2MzMyMjY2NDk2MTN9LAoreyAwLjA1MjM3MjM3Mjc0OTQ3LCAtMC4yNTY0MDM2MTYwMjY2MX0sIHsgMC4zNjcwMzU4Mzk1NzQyNCwgLTAuMzg2NTMyNjU2NDE4NzV9LAoreyAwLjkxNjUzMTgwMzY3OTEzLCAtMC4zMDU4NzYyODcyNjU5N30sIHsgMC42OTAwMDgwMzQ5OTMxNiwgIDAuOTA5NTIxNzEzODYxMzJ9LAorey0wLjM4NjU4NzUxMTMzNTI3LCAgMC45OTUwMTU3MTIwODk4NX0sIHstMC4yOTI1MDgxNDAyOTg1MSwgIDAuMzc0NDQ5OTQzNDQ2MTV9LAorey0wLjYwMTgyMjA0Njc3NjA4LCAgMC44Njc3OTY1MTAzNjEyM30sIHstMC45NzQxODU4ODE2MzIxNywgIDAuOTY0Njg1MjM2NjY0NzV9LAoreyAwLjg4NDYxNTc0MDAzOTYzLCAgMC41NzUwODQwNTI3NjQxNH0sIHsgMC4wNTE5ODkzMzA1NTE2MiwgIDAuMjEyNjk2NjE2Njk5NjR9LAorey0wLjUzNDk5NjIxOTc5NzIwLCAgMC45NzI0MTU1MzczMTIzN30sIHstMC40OTQyOTU2MDIyNjQ5NywgIDAuOTgxODM4NjUyOTE5MDN9LAorey0wLjk4OTM1MTQyMzM5MTM5LCAtMC40MDI0OTE1OTAwNjkzM30sIHstMC45ODA4MTM4MDA5MTEzMCwgLTAuNzI4NTY4OTU1MzQwNDF9LAorey0wLjI3MzM4MTQ4ODM1NTMyLCAgMC45OTk1MDkyMjQ0NzIwOX0sIHsgMC4wNjMxMDgwMjMzODMwMiwgLTAuNTQ1Mzk1ODc1Mjk2MTh9LAorey0wLjIwNDYxNjc3MTk5NTM5LCAtMC4xNDIwOTk3NzYyODQ4OX0sIHsgMC42NjIyMzg0MzE0MTY0NywgIDAuNzI1Mjg1Nzk5NDAzMjZ9LAorey0wLjg0NzY0MzQ1NDgzNjY1LCAgMC4wMjM3MjMxNjgwMTI2MX0sIHstMC44OTAzOTg2MzQ4MzgxMSwgIDAuODg4NjY1ODE0ODQ2MDJ9LAoreyAwLjk1OTAzMzA4NDc3OTg2LCAgMC43Njc0NDkyNzE3Mzg3M30sIHsgMC43MzUwNDEyMzkwOTg3OSwgLTAuMDM3NDcyMDMxNzMxOTJ9LAorey0wLjMxNzQ0NDM0OTY2MDU2LCAtMC4zNjgzNDExMTg4MzY1Mn0sIHstMC4zNDExMDgyNzU5MTYyMywgIDAuNDAyMTEyMjI4MDc2OTF9LAoreyAwLjQ3ODAzODgzNzE0MTk5LCAtMC4zOTQyMzIxOTc4NjI4OH0sIHsgMC45ODI5OTE5NTg3OTUxNCwgIDAuMDE5ODk3OTEzOTAwNDd9LAorey0wLjMwOTYzMDczMTI5NzUxLCAtMC4xODA3NjcyMDU5OTMzNn0sIHsgMC45OTk5MjU4ODIyOTAxOCwgLTAuMjYyODE4NzIwOTQyODl9LAorey0wLjkzMTQ5NzMxMDgwNzY3LCAtMC45ODMxMzE2MjU3MDQ5MH0sIHsgMC45OTkyMzQ3MjMwMjc3MywgLTAuODAxNDI5OTM3Njc1NTR9LAorey0wLjI2MDI0MTY5NjMzNDE3LCAtMC43NTk5OTc1OTg1NTc1Mn0sIHstMC4zNTcxMjUxNDc0MzU2MywgIDAuMTkyOTg5NjM3Njg1NzR9LAorey0wLjk5ODk5MDg0NTA5NTMwLCAgMC43NDY0NTE1Njk5MjQ5M30sIHsgMC44NjU1NzE3MTU3OTQ1MiwgIDAuNTU1OTM4NjY2OTYyOTl9LAoreyAwLjMzNDA4MDQyNDM4NzUyLCAgMC44NjE4NTk1Mzg3NDcwOX0sIHsgMC45OTAxMDczNjM3NDcxNiwgIDAuMDQ2MDIzOTc1NzY2MjN9LAorey0wLjY2Njk0MjY5NjkxMTk1LCAtMC45MTY0MzYxMTgxMDE0OH0sIHsgMC42NDAxNjc5MjA3OTQ4MCwgIDAuMTU2NDk1MzA4MzY4NTZ9LAoreyAwLjk5NTcwNTM0ODA0ODM2LCAgMC40NTg0NDU4NjAzODExMX0sIHstMC42MzQzMTQ2Njk0NzM0MCwgIDAuMjEwNzkxMTY0NTkyMzR9LAorey0wLjA3NzA2ODQ3MDA1OTMxLCAtMC44OTU4MTQzNzEwMTMyOX0sIHsgMC45ODU5MDA5MDU3NzcyNCwgIDAuODgyNDE3MjExMzM5ODF9LAoreyAwLjgwMDk5MzM1MjU0Njc4LCAtMC4zNjg1MTg5NjcxMDg1M30sIHsgMC43ODM2ODEzMTM5MjY2NiwgIDAuNDU1MDY5OTk4MDI1OTd9LAoreyAwLjA4NzA3ODA2NjcxNjkxLCAgMC44MDkzODk5NDkxODc0NX0sIHstMC44NjgxMTg4MzA4MDcxMiwgIDAuMzkzNDczMDg2NTQ3MDV9LAorey0wLjM5NDY2NTI5NzQwMzc1LCAtMC42NjgwOTQzMjExNDQ1Nn0sIHsgMC45Nzg3NTMyNTY0OTY4MywgLTAuNzI0Njc4NDA5Njc3NDZ9LAorey0wLjk1MDM4NTYwMjg4ODY0LCAgMC44OTU2MzIxOTU4NzYyNX0sIHsgMC4xNzAwNTIzOTQyNDIxMiwgIDAuNTQ2ODMwNTM5NjI2NTh9LAorey0wLjc2OTEwNzkyMDI2ODQ4LCAtMC45NjIyNjYxNzU0OTI5OH0sIHsgMC45OTc0MzI4MTAxNjg0NiwgIDAuNDI2OTcxNTcwMzc1Njd9LAoreyAwLjk1NDM3MzgzNTQ5OTczLCAgMC45NzAwMjMyNDEwOTk1Mn0sIHsgMC45OTU3ODkwNTM2NTU2OSwgLTAuNTQxMDY4MjYyNTczNTZ9LAoreyAwLjI4MDU4MjU5ODI5OTkwLCAtMC44NTM2MTQyMDYzNDAzNn0sIHsgMC44NTI1NjUyNDQ3MDU3MywgLTAuNjQ1Njc2MDc3MzU1ODl9LAorey0wLjUwNjA4NTQwMTA1MTI4LCAtMC42NTg0NjAxNTQ4MDMwMH0sIHstMC45NzIxMDczNTE4MzI0MywgLTAuMjMwOTUyMTMwNjc3OTF9LAoreyAwLjk1NDI0MDQ4MjM0NDQxLCAtMC45OTI0MDE0NzA5MTIxOX0sIHstMC45NjkyNjU3MDUyNDAyMywgIDAuNzM3NzU2NTQ4OTY1NzR9LAoreyAwLjMwODcyMTYzMjE0NzI2LCAgMC40MTUxNDk2MDU1NjEyNn0sIHstMC4yNDUyMzgzOTU3MjYzOSwgIDAuNjMyMDY2MzMzOTQ4MDd9LAorey0wLjMzODEzMjY1MDg2MDI0LCAtMC4zODY2MTc3OTQ0MTg5N30sIHstMC4wNTgyNjgyODQyMDE0NiwgLTAuMDY5NDA3NzQxODgwMjl9LAorey0wLjIyODk4NDYxNDU1MDU0LCAgMC45NzA1NDg1MzMxNjMxNn0sIHstMC4xODUwOTkxNTAxOTg4MSwgIDAuNDc1NjU3NjI4OTIwODR9LAorey0wLjEwNDg4MjM4MDQ1MDA5LCAtMC44Nzc2OTk0NzQwMjM5NH0sIHstMC43MTg4NjU4NjE4MjAzNywgIDAuNzgwMzA5ODI0ODA1Mzh9LAoreyAwLjk5NzkzODczNzM4NjU0LCAgMC45MDA0MTMxMDQ5MTQ5N30sIHsgMC41NzU2MzMwNzYyNjEyMCwgLTAuOTEwMzQzMzczNTIwOTd9LAoreyAwLjI4OTA5NjQ2MzgzNzE3LCAgMC45NjMwNzc4Mzk3MDUzNH0sIHsgMC40MjE4ODk5ODMxMjUyMCwgIDAuNDgxNDg2NTEyMzA0Mzd9LAoreyAwLjkzMzM1MDQ5NjgxMDQ3LCAtMC40MzUzNzAyMzg4MzU4OH0sIHstMC45NzA4NzM3NDQxODI2NywgIDAuODY2MzY0NDU3MTEzNjR9LAoreyAwLjM2NzIyODcxMjg2OTIzLCAgMC42NTI5MTY1NDE3Mjk2MX0sIHstMC44MTA5MzAyNTY2NTY5NiwgIDAuMDg3NzgzNzAyMjkzNjN9LAorey0wLjI2MjQwNjAzMDYyMjM3LCAtMC45Mjc3NDA5NTM3OTA5OH0sIHsgMC44Mzk5NjQ5Nzk4NDYwNCwgIDAuNTU4Mzk4NDkxMzk2NDd9LAorey0wLjk5OTA5NjE1NzIwMjI1LCAtMC45NjAyNDYwNTcxMzk3MH0sIHsgMC43NDY0OTQ2NDE1NTA2MSwgIDAuMTIxNDQ4OTM2MDY0NjJ9LAorey0wLjc0Nzc0NTk1NTY5ODA1LCAtMC4yNjg5ODA2MjAwODk1OX0sIHsgMC45NTc4MTY2NzQ2OTU2NywgLTAuNzkwNDc5MjcwNTI2Mjh9LAoreyAwLjk1NDcyMzA4NzEzMDk5LCAtMC4wODU4ODc3NjAxOTU1MH0sIHsgMC40ODcwODMzMjc0NjI5OSwgIDAuOTk5OTkwNDE1Nzk0MzJ9LAoreyAwLjQ2MzMyMDM4MjQ3NDk3LCAgMC4xMDk2NDEyNjE4NTA2M30sIHstMC43NjQ5NzAwNDk0MDE2MiwgIDAuODkyMTA5MjkyNDIyMzh9LAoreyAwLjU3Mzk3Mzg5MzY0MzM5LCAgMC4zNTI4OTcwMzM3Mzc2MH0sIHsgMC43NTM3NDMxNjk3NDQ5NSwgIDAuOTY3MDUyMTQ2NTEzMzV9LAorey0wLjU5MTc0Mzk3Njg1NzE0LCAtMC44OTQwNTM3MDQyMjc1Mn0sIHsgMC43NTA4NzkwNjY5MTg5MCwgLTAuMjk2MTI2NzI5ODIzOTZ9LAorey0wLjk4NjA3ODU3MzM2MjMwLCAgMC4yNTAzNDkxMTczMDAyM30sIHstMC40MDc2MTA1NjY0MDUwNSwgLTAuOTAwNDU1NzM0NDQ2OTV9LAoreyAwLjY2OTI5MjY2NzQwNDc3LCAgMC45ODYyOTQ5MzQwMTc0OH0sIHstMC45NzQ2MzY5NTI1NzMxMCwgLTAuMDAxOTAyMjMzMDEzMDF9LAoreyAwLjkwMTQ1NTA5NDA5ODU5LCAgMC45OTc4MTM5MDM2NTQ0Nn0sIHstMC44NzI1OTI4OTA0ODA0MywgIDAuOTkyMzM1ODczNTM2NjZ9LAorey0wLjkxNTI5NDYxNDQ3NjkyLCAtMC4xNTY5ODcwNzUzNDIwNn0sIHstMC4wMzMwNTczODg0MDcwNSwgLTAuMzcyMDUyNjI4NTk3NjR9LAoreyAwLjA3MjIzMDUxMzY4MzM3LCAtMC44ODgwNTAwMTczMzYyNn0sIHsgMC45OTQ5ODAxMjE4ODM1MywgIDAuOTcwOTQzNTgxMTMzODd9LAorey0wLjc0OTA0OTM5NTAwNTE5LCAgMC45OTk4NTQ4MzY0MTUyMX0sIHsgMC4wNDU4NTIyODU3NDIxMSwgIDAuOTk4MTIzMzc0NDQwODJ9LAorey0wLjg5MDU0OTU0MjU3OTkzLCAtMC4zMTc5MTkxMzE4ODA2NH0sIHstMC44Mzc4MjE0NDY1MTI1MSwgIDAuOTc2Mzc2MzI1NDc0NjZ9LAoreyAwLjMzNDU0ODA0OTMzODA0LCAtMC44NjIzMTUxNjgwMDQwOH0sIHstMC45OTcwNzU3OTM2MjgyNCwgIDAuOTMyMzc5OTAwNzk0NDF9LAorey0wLjIyODI3NTI3ODQzOTk0LCAgMC4xODg3NDc1OTM5Nzk5N30sIHsgMC42NzI0ODA0NjI4OTE0MywgLTAuMDM2NDYyMTEzOTA1Njl9LAorey0wLjA1MTQ2NTM4MTg3OTQ0LCAtMC45MjU5OTcwMDEyMDY3OX0sIHsgMC45OTk0NzI5NTc0OTkwNSwgIDAuOTM2MjUyMjk3MDc5MTJ9LAoreyAwLjY2OTUxMTI0MzkwMzYzLCAgMC45ODkwNTgyNTYyMzg5M30sIHstMC45OTYwMjk1NjU1OTE3OSwgLTAuNDQ2NTQ3MTU3NTc2ODh9LAoreyAwLjgyMTA0OTA1NDgzNTkwLCAgMC45OTU0MDc0MTcyNDkyOH0sIHsgMC45OTE4NjUxMDk4ODc4MiwgIDAuNzIwMjMwMDEzMTI5NDd9LAorey0wLjY1Mjg0NTkyMzkyOTE4LCAgMC41MjE4NjcyMzI1MzYzN30sIHsgMC45Mzg4NTQ0Mzc5ODE4OCwgLTAuNzQ4OTUzMTI2MTUyNTl9LAoreyAwLjk2NzM1MjQ4NzM4Mzg4LCAgMC45MDg5MTgxNjk3ODYyOX0sIHstMC4yMjIyNTk2ODg0MTExNCwgIDAuNTcxMjQwMjk3ODEyMjh9LAorey0wLjQ0MTMyNzgzNzUzNDE0LCAtMC45MjY4ODg0MDY1OTI4MH0sIHstMC44NTY5NDk3NDIxOTU3NCwgIDAuODg4NDQ1MzI3MTk4NDR9LAoreyAwLjkxNzgzMDQyMDkxNzYyLCAtMC40NjM1Njg5MjM4Mzk3MH0sIHsgMC43MjU1Njk3NDQxNTY5MCwgLTAuOTk4OTk1NTU3NzA3NDd9LAorey0wLjk5NzExNTgxODM0NTA4LCAgMC41ODIxMTU2MDE4MDQyNn0sIHsgMC43NzYzODk3NjM3MTk2NiwgIDAuOTQzMjE4MzQ4NzM4MTl9LAoreyAwLjA3NzE3MzI0MjUzOTI1LCAgMC41ODYzODM5OTg1NjU5NX0sIHstMC41NjA0OTgyOTE5NDE2MywgIDAuODI1MjIzMDE1NjkwMzZ9LAoreyAwLjk4Mzk4ODkzNjM5OTg4LCAgMC4zOTQ2NzQ0MDQyMDU2OX0sIHsgMC40NzU0Njk0Njg0NDkzOCwgIDAuNjg2MTMwNDQ4MzY4MTF9LAoreyAwLjY1Njc1MDg5MzE0NjMxLCAgMC4xODMzMTYzNzEzNDg4MH0sIHsgMC4wMzI3MzM3NTQ1Nzk4MCwgLTAuNzQ5MzMxMDk1NjQxMDh9LAorey0wLjM4Njg0MTQ0Nzg0NzM4LCAgMC41MTMzNzM0OTAzMDQwNn0sIHstMC45NzM0NjI2Nzk0NDU0NSwgLTAuOTY1NDkzNjQzODQwOTh9LAorey0wLjUzMjgyMTU2MDYxOTQyLCAtMC45MTQyMzI2NTA5MTM1NH0sIHsgMC45OTgxNzMxMDczMTE3NiwgIDAuNjExMzM1NzI0ODIxNDh9LAorey0wLjUwMjU0NTAwNzcyNjM1LCAtMC44ODgyOTMzODEzNDI5NH0sIHsgMC4wMTk5NTg3MzIzODg1NSwgIDAuODUyMjM1MTUwOTY3NjV9LAoreyAwLjk5OTMwMzgxOTczODA0LCAgMC45NDU3ODg5NjI5NjY0OX0sIHsgMC44MjkwNzc2NzYwMDc4MywgLTAuMDYzMjM0NDI1OTgxMjh9LAorey0wLjU4NjYwNzA5NjY5NzI4LCAgMC45Njg0MDc3MzgwNjU4Mn0sIHstMC4xNzU3MzczNjY2NzI2NywgLTAuNDgxNjY5MjA4NTk0ODV9LAoreyAwLjgzNDM0MjkyNDAxMzQ2LCAtMC4xMzAyMzQ1MDY0Njk5N30sIHsgMC4wNTk0NjQ5MTMwNzAyNSwgIDAuMjA1MTEwNDcwNzQ4NjZ9LAoreyAwLjgxNTA1NDg0NTc0NjAyLCAtMC45NDY4NTk0Nzg2MTM2OX0sIHstMC40NDk3NjM4MDk1NDg2MCwgIDAuNDA4OTQ1NzI2NzE1NDV9LAorey0wLjg5NzQ2NDc0NjI1NjcxLCAgMC45OTg0NjU3ODgzODUzN30sIHsgMC4zOTY3NzI1NjEzMDc5MiwgLTAuNzQ4NTQ2Njg2MDkzNTl9LAorey0wLjA3NTg4OTQ4NTYzMDc5LCAgMC43NDA5NjIxNDA4NDE3MH0sIHsgMC43NjM0MzE5ODk1MTQ0NSwgIDAuNDE3NDY2Mjk0MjI2MzR9LAorey0wLjc0NDkwMTA0Njk5NjI2LCAgMC45NDcyNTkxMTc0NDYxMH0sIHsgMC42NDg4MDExOTc5Mjc1OSwgIDAuNDEzMzY2NjA4MzA1NzF9LAoreyAwLjYyMzE5NTM3NDYyNTQyLCAtMC45MzA5ODMxMzU1MjU5OX0sIHsgMC40MjIxNTgxNzU5NDgwNywgLTAuMDc3MTI3ODczODUyMDh9LAoreyAwLjAyNzA0NTU0MTQxODg1LCAtMC4wNTQxNzUxODA1MzY2Nn0sIHsgMC44MDAwMTc3MzU2NjgxOCwgIDAuOTE1NDIxOTUxNDEwMzl9LAorey0wLjc5MzUxODMyMzQ4ODE2LCAtMC4zNjIwODg5Nzk4OTEzNn0sIHsgMC42Mzg3MjM1OTE1MTYzNiwgIDAuMDgxMjgyNTI0OTM0NDR9LAoreyAwLjUyODkwNTIwOTYwMjk1LCAgMC42MDA0ODg3MjQ1NTU5Mn0sIHsgMC43NDIzODU1MjkxNDU4NywgIDAuMDQ0OTE5MTUyOTEwNDR9LAoreyAwLjk5MDk2MTMxNDQ5MjUwLCAtMC4xOTQ1MTE4Mjg1NDQwMn0sIHstMC44MDQxMjMyOTY0MzEwOSwgLTAuODg1MTM4MTgxOTk0NTd9LAorey0wLjY0NjEyNjE2MTI5NzM2LCAgMC43MjE5ODY3NDgwNDU0NH0sIHsgMC4xMTY1Nzc3MDY2MzE5MSwgLTAuODM2NjI4MzM4MTUwNDF9LAorey0wLjk1MDUzMTgyNDg4MTAxLCAtMC45NjkzOTkwNTEzODA4Mn0sIHstMC42MjIyODg3MjkyODYyMiwgIDAuODI3NjcyNjI4NDY2NjF9LAoreyAwLjAzMDA0NDc1Nzg3MzE2LCAtMC45OTczODg5NjMzMzM4NH0sIHstMC45Nzk4NzIxNDM0MTAzNCwgIDAuMzY1MjYxMjk2ODY0MjV9LAorey0wLjk5OTg2OTgwNzQ2MjAwLCAtMC4zNjAyMTYxMDI5OTcxNX0sIHsgMC44OTExMDY0ODU5OTg3OSwgLTAuOTc4OTQyNTAzNDMwNDR9LAoreyAwLjEwNDA3OTYwNTEwNTgyLCAgMC43NzM1Nzc5MzgxMTYxOX0sIHsgMC45NTk2NDczNzgyMTcyOCwgLTAuMzU0MzU4MTgyODU1MDJ9LAoreyAwLjUwODQzMjMzMTU5MTYyLCAgMC45NjEwNzY5MTI2NjIwNX0sIHsgMC4xNzAwNjMzNDY3MDYxNSwgLTAuNzY4NTQwMjUzMTQ4Mjl9LAoreyAwLjI1ODcyNjc1MDYzMzYwLCAgMC45OTg5MzMwMzkzMzgxNn0sIHstMC4wMTExNTk5ODY4MTkzNywgIDAuOTg0OTYwMTk3NDI0NDR9LAorey0wLjc5NTk4NzAyOTczMjYxLCAgMC45NzEzODQxMTMxODg5NH0sIHstMC45OTI2NDcwODk0ODEwMSwgLTAuOTk1NDI4MjI0MDI1MzZ9LAorey0wLjk5ODI5NjYzNzUyODE4LCAgMC4wMTg3NzEzODgyNDMxMX0sIHstMC43MDgwMTAxNjU0ODE4NCwgIDAuMzM2ODA2ODU5NDgxMTd9LAorey0wLjcwNDY3MDU3Nzg2ODI2LCAgMC45MzI3Mjc3NzUwMTg1N30sIHsgMC45OTg0NjAyMTkwNTI1NCwgLTAuOTg3MjU3NDYyNTQ0MzN9LAorey0wLjYzMzY0OTY4NTM0NjUwLCAtMC4xNjQ3MzU5NDQyMzc0Nn0sIHstMC4xNjI1ODIxNzUwMDc5MiwgLTAuOTU5MzkxMjU0MDA4MDJ9LAorey0wLjQzNjQ1NTk0MzYwNjMzLCAtMC45NDgwNTAzMDExMzI4NH0sIHstMC45OTg0ODQ3MTcwMjk3NiwgIDAuOTYyNDUxNjY5MjM4MDl9LAorey0wLjE2Nzk2NDU4OTY4OTk4LCAtMC45ODk4NzUxMTg5MDQ3MH0sIHstMC44Nzk3OTIyNTc0NTIxMywgLTAuNzE3MjU3MjUwNDE2ODB9LAoreyAwLjQ0MTgzMDk5MDIxNzg2LCAtMC45MzU2ODk3NDQ5ODc2MX0sIHsgMC45MzMxMDE4MDEyNTUzMiwgLTAuOTk5MTMzMDgwNjgyNDZ9LAorey0wLjkzOTQxOTMxNzgyMDAyLCAtMC41NjQwOTM3OTY0MDM1Nn0sIHstMC44ODU5MDAwMzE4ODY3NywgIDAuNDc2MjQ2MDA0OTEzODJ9LAoreyAwLjk5OTcxNDYzNzAzNjkxLCAtMC44Mzg4OTk1NDI1MzQ2Mn0sIHstMC43NTM3NjM4NTYzOTk3OCwgIDAuMDA4MTQ2NDM0Mzg2MjV9LAoreyAwLjkzODg3Njg1NjE1ODc1LCAtMC4xMTI4NDUyODIwNDYzNn0sIHsgMC44NTEyNjQzNTc4MjMwOSwgIDAuNTIzNDkyNTE1NDM1NDd9LAoreyAwLjM5NzAxNDIxNDQ2MzgxLCAgMC44MTc3OTYzNDE3NDMxNn0sIHstMC4zNzAyNDQ2NDE4NzQzNywgLTAuODcwNzE2NTYyMjI5NTl9LAorey0wLjM2MDI0ODI4MjQyODk2LCAgMC4zNDY1NTczNTY0ODI4N30sIHstMC45MzM4ODgxMjU0OTIwOSwgLTAuODQ0NzY1NDEwOTY0Mjl9LAorey0wLjY1Mjk4ODA0NTUyMTE5LCAtMC4xODQzOTU3NTQ1MDkyMX0sIHsgMC4xMTk2MDMxOTAwNjg0MywgIDAuOTk4OTkzNDY3ODAxNjh9LAoreyAwLjk0MjkyNTY1NTUzMTYwLCAgMC44MzE2MzkwNjUxODI5M30sIHsgMC43NTA4MTE0NTI4Njk0OCwgLTAuMzU1MzMyMjMxNDIyNjV9LAoreyAwLjU2NzIxOTc5NzQ4Mzk0LCAtMC4yNDA3NjgzNjQxNDQ5OX0sIHsgMC40Njg1Nzc2Njc0NjAyOSwgLTAuMzAxNDAyMzM0NTcxOTh9LAoreyAwLjk3MzEyMzEzOTIzNjM1LCAtMC45OTU0ODE5MTYzMDAzMX0sIHstMC4zODI5OTk3NjU2NzAxNywgIDAuOTg1MTY5MDk3MTU0Mjd9LAoreyAwLjQxMDI1ODAwMDE5NDYzLCAgMC4wMjExNjczNjkzNTczNH0sIHsgMC4wOTYzODA2MjAwODA0OCwgIDAuMDQ0MTE5ODQzODE0NTd9LAorey0wLjg1MjgzMjQ5Mjc1Mzk3LCAgMC45MTQ3NTU2MzkyMjQyMX0sIHsgMC44ODg2NjgwODk1ODEyNCwgLTAuOTk3MzUyNjcwODMyMjZ9LAorey0wLjQ4MjAyNDI5NTM2OTg5LCAtMC45NjgwNTYwODg4NDE2NH0sIHsgMC4yNzU3MjU4MjQxNjU2NywgIDAuNTg2MzQ3NTMzMzU4MzJ9LAorey0wLjY1ODg5MTI5NjU5MTY4LCAgMC41ODgzNTYzNDEzODU4M30sIHsgMC45ODgzODA4Njk1MzczMiwgIDAuOTk5OTQzNDk2MDAyMzZ9LAorey0wLjIwNjUxMzQ5NjIwNjg5LCAgMC41NDU5MzA0NDA2NjM1NX0sIHstMC42MjEyNjQxNjM1NjkyMCwgLTAuNTk4OTM2ODE3MDAzOTJ9LAoreyAwLjIwMzIwMTA1NDEwNDM3LCAtMC44Njg3OTE4MDM1NTI4OX0sIHstMC45Nzc5MDU0ODYwMDU4NCwgIDAuOTYyOTA4MDY5OTkyNDJ9LAoreyAwLjExMTEyNTM0NzM1MTI2LCAgMC4yMTQ4NDc2MzMxMzMwMX0sIHstMC40MTM2ODMzNzMxNDE4MiwgIDAuMjgyMTY4Mzc2ODAzNjV9LAoreyAwLjI0MTMzMDM4OTkyOTYwLCAgMC41MTI5NDM2MjYzMDIzOH0sIHstMC42NjM5MzQxMDY3NDg4NSwgLTAuMDgyNDk2Nzk2MjkwODF9LAorey0wLjUzNjk3ODI5MTc4NzUyLCAtMC45NzY0OTkwMzkzNjIyOH0sIHstMC45NzIyNDczNzg4OTM0OCwgIDAuMjIwODEzMzM1Nzk4Mzd9LAoreyAwLjg3MzkyNDc3MTQ0NTQ5LCAtMC4xMjc5NjE3Mzc0MDM2MX0sIHsgMC4xOTA1MDM2MTAxNTc1MywgIDAuMDE2MDI2MTUzODcxOTV9LAorey0wLjQ2MzUzNDQxMjEyNzI0LCAtMC45NTI0OTA0MTUzOTAwNn0sIHstMC4wNzA2NDA5NjMzOTAyMSwgLTAuOTQ0Nzk4MDMyMDU4ODZ9LAorey0wLjkyNDQ0MDg1NDg0NDY2LCAtMC4xMDQ1NzU5MDE4NzQzNn0sIHstMC44MzgyMjU5MzU3ODcyOCwgLTAuMDE2OTUwNDMyMDg4ODV9LAoreyAwLjc1MjE0NjgxODExMTUwLCAtMC45OTk1NTY4MTA0MjY2NX0sIHstMC40MjEwMjk5ODgyOTMzOSwgIDAuOTk3MjA5NDE5OTkzOTR9LAorey0wLjcyMDk0Nzg2MjM3Njk2LCAtMC4zNTAwODk2MTkzNDI1NX0sIHsgMC43ODg0MzMxMTAxOTI1MSwgIDAuNTI4NTEzOTg5NTgyNzF9LAoreyAwLjk3Mzk0MDI3ODk3NDQyLCAtMC4yNjY5NTk0NDA4NjU2MX0sIHsgMC45OTIwNjQ2MzQ3Nzk0NiwgLTAuNTcwMTAxMjA4NDk0Mjl9LAoreyAwLjc2Nzg5NjA5NDYxNzk1LCAtMC43NjUxOTM1NjczMDk2Nn0sIHstMC44MjAwMjQyMTgzNjQwOSwgLTAuNzM1MzAxNzk1NTM3Njd9LAoreyAwLjgxOTI0OTkwMDI1NzI0LCAgMC45OTY5ODQyNTI1MDU3OX0sIHstMC4yNjcxOTg1MDg3MzM1NywgIDAuNjg5MDMzNjk3NzYxOTN9LAorey0wLjQzMzExMjYwMzgwOTc1LCAgMC44NTMyMTgxNTk0NzQ5MH0sIHsgMC45OTE5NDk3OTY3MzgzNiwgIDAuOTE4NzYyNDk3NjY0MjJ9LAorey0wLjgwNjkyMDAxMjQ4NDg3LCAtMC4zMjYyNzU0MDY2MzIxNH0sIHsgMC40MzA4MDAwMzY0OTk3NiwgLTAuMjE5MTkwOTU2MzY2Mzh9LAoreyAwLjY3NzA5NDkxOTM3MzU3LCAtMC45NTQ3ODA3NTgyMjkwNn0sIHsgMC41NjE1MTc3MDU2ODMxNiwgLTAuNzA2OTM4MTE3NDc3Nzh9LAoreyAwLjEwODMxODYyODEwNzQ5LCAtMC4wODYyODgzNzE3NDU5Mn0sIHsgMC45MTIyOTQxNzU0MDQzNiwgLTAuNjU5ODczNTE0MDg0MTB9LAorey0wLjQ4OTcyODkzOTMyMjc0LCAgMC41NjI4OTI0NjM2MjY4Nn0sIHstMC44OTAzMzY1ODY4OTY5NywgLTAuNzE2NTY1NjM5ODcwODJ9LAoreyAwLjY1MjY5NDQ3NDc1MDk0LCAgMC42NTkxNjAwNDgzMzkzMn0sIHsgMC42NzQzOTQ3ODE0MTEyMSwgLTAuODE2ODQzODA4NDY3OTZ9LAorey0wLjQ3NzcwODMyNDE2OTczLCAtMC4xNjc4OTU1NjIwMzAyNX0sIHstMC45OTcxNTk3OTI2MDg3OCwgLTAuOTM1NjU3ODQwMDc2NDh9LAorey0wLjkwODg5NTkzNjAyNTQ2LCAgMC42MjAzNDM5NzA1NDM4MH0sIHstMC4wNjYxODYyMjU0ODE3NywgLTAuMjM4MTIyMTcyMjEzNTl9LAoreyAwLjk5NDMwMjY2OTE5NzI4LCAgMC4xODgxMjU1NTMxNzU1M30sIHsgMC45NzY4NjQwMjM4MTg0MywgLTAuMjg2NjQ1MzQzNjY2MjB9LAoreyAwLjk0ODEzNjUwMjIxMjY4LCAtMC45NzUwNjY0MDAyNzEyOH0sIHstMC45NTQzNDQ5NzQ5Mjg1MywgLTAuNzk2MDc5Nzg1MDE5ODN9LAorey0wLjQ5MTA0NzgzMTM3MTUwLCAgMC4zMjg5NTIxNDM1OTY2M30sIHsgMC45OTg4MTE3NTEyMDc1MSwgIDAuODg5OTM5ODM4MzEzNTR9LAoreyAwLjUwNDQ5MTY2NzYwMzAzLCAtMC44NTk5NTA3MjQwODQzNH0sIHsgMC40NzE2Mjg5MTA2NTEwOCwgLTAuMTg2ODAyMDQwNDk1Njl9LAorey0wLjYyMDgxNTgxMzYxODQwLCAgMC43NTAwMDY3NjIxODk1Nn0sIHstMC40Mzg2NzAxNTI1MDgxMiwgIDAuOTk5OTgwNjkyNDQzMjJ9LAoreyAwLjk4NjMwNTYzMjMyMDc1LCAtMC41MzU3ODg5OTYwMDY2Mn0sIHstMC42MTUxMDM2MjI3NzM3NCwgLTAuODk1MTUwMTk4OTk5OTd9LAorey0wLjAzODQxNTE3NjAxODQzLCAtMC42OTg4ODgxNTY4MTE3OX0sIHstMC4zMDEwMjE1NzMwNDY0NCwgLTAuMDc2Njc4MDg5MjIyMDV9LAoreyAwLjQxODgxMjg0MTgyNjgzLCAgMC4wMjE4ODA5ODkyMjI4Mn0sIHstMC44NjEzNTQ1NDk0MTIzNywgIDAuOTg5NDc0ODA5MDkzNTl9LAoreyAwLjY3MjI2ODYxMzkzNzg4LCAtMC4xMzQ5NDM4OTAxMTAxNH0sIHstMC43MDczNzM5ODg0MjA2OCwgLTAuNzY1NDczNDkzMjU5OTJ9LAoreyAwLjk0MDQ0OTQ2Njg3OTYzLCAgMC4wOTAyNjIwMTE1NzQxNn0sIHstMC44MjM4NjM1MjUzNDMyNywgIDAuMDg5MjQ3Njg4MjM2NzZ9LAorey0wLjMyMDcwNjY2Njk4NjU2LCAgMC41MDE0MzQyMTkwODc1M30sIHsgMC41NzU5MzE2MzIyNDQ4NywgLTAuOTg5NjY0MjI5MjE1MDl9LAorey0wLjM2MzI2MDE4NDE5OTY1LCAgMC4wNzQ0MDI0MzEyMzIyOH0sIHsgMC45OTk3OTA0NDY3NDM1MCwgLTAuMTQxMzAyODczNDc0MDV9LAorey0wLjkyMzY2MDIzMzI2OTMyLCAtMC45Nzk3OTI5ODA2ODE4MH0sIHstMC40NDYwNzE3ODUxODU5OCwgLTAuNTQyMzMyNTIwMTYzOTR9LAoreyAwLjQ0MjI2ODAwOTMyOTU2LCAgMC43MTMyNjc1Njc0Mjc1Mn0sIHsgMC4wMzY3MTkwNzE1ODMxMiwgIDAuNjM2MDYzODkzNjY2NzV9LAoreyAwLjUyMTc1NDI0NjgyMTk1LCAtMC44NTM5NjgyNjczNTcwNX0sIHstMC45NDcwMTEzOTY5MDk1NiwgLTAuMDE4MjYzNDgxOTQyNTV9LAorey0wLjk4NzU5NjA2OTQ2MDQ5LCAgMC44MjI4ODcxNDMwMzA3M30sIHsgMC44NzQzNDc5NDc0MzYyNSwgIDAuODkzOTk0OTU2NTU0MzN9LAorey0wLjkzNDEyMDQxNzU4NzQ0LCAgMC40MTM3NDA1MjAyNDM2M30sIHsgMC45NjA2Mzk0MzMxNTUxMSwgIDAuOTMxMTY3MDk1NDEyODB9LAoreyAwLjk3NTM0MjUzNDU3ODM3LCAgMC44NjE1MDkzMDgxMjY4OX0sIHsgMC45OTY0MjQ2NjUwNDE2MywgIDAuNzAxOTAwNDM0Mjc1MTJ9LAorey0wLjk0NzA1MDg5NjY1OTg0LCAtMC4yOTU4MDA0MjgxNDMwNn0sIHsgMC45MTU5OTgwNzA4NzM3NiwgLTAuOTgxNDc4MzAzODU3ODF9LAorLy8gU3RhcnQgb2YgZHVwbGljYXRlZCB0YWJsZQorey0wLjk5OTQ4MTUzMjc4Mjk2LCAtMC41OTQ4MzQxNzUxNjYwN30sIHsgMC45NzExMzQ1NDM5Mzk5MSwgLTAuNjc1Mjg1MTUyMjU2NDd9LAoreyAwLjE0MTMwMDUxNzU4NDg3LCAtMC45NTA5MDk4MzU3NTY4OX0sIHstMC40NzAwNTQ5NjcwMTY5NywgLTAuMzczNDA1NDk3Mjg2NDd9LAoreyAwLjgwNzA1MDYzNzY5MzUxLCAgMC4yOTY1MzY2ODI4NDQwOH0sIHstMC4zODk4MTQ3ODg5NjkyNiwgIDAuODk1NzI2MDU3MTcwODd9LAorey0wLjAxMDUzMDQ5ODYyMDIwLCAtMC42Njk1OTA1ODAzNjE2Nn0sIHstMC45MTI2NjM2Nzk1NzI5MywgLTAuMTE1MjI5MzgxNDAwMzR9LAorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUFDU0JSREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYWN0YWIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3RhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODgyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWN0YWIuYwpAQCAtMCwwICsxLDE3MjkgQEAKKy8qCisgKiBBQUMgZGF0YQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgT2RlZCBTaGltb24gKCBvZHMxNSBvZHMxNSBkeW5kbnMgb3JnICkKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IE1heGltIEdhdnJpbG92ICggbWF4aW0uZ2F2cmlsb3YgZ21haWwgY29tICkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQUFDIGRhdGEKKyAqIEBhdXRob3IgT2RlZCBTaGltb24gICggb2RzMTUgb2RzMTUgZHluZG5zIG9yZyApCisgKiBAYXV0aG9yIE1heGltIEdhdnJpbG92ICggbWF4aW0uZ2F2cmlsb3YgZ21haWwgY29tICkKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImFhYy5oIgorI2luY2x1ZGUgImFhY190YWJsZWdlbi5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK0RFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsICBmZl9hYWNfa2JkX2xvbmdfMTAyNClbMTAyNF07CitERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCAgZmZfYWFjX2tiZF9zaG9ydF8xMjgpWzEyOF07CisKK2NvbnN0IHVpbnQ4X3QgZmZfYWFjX251bV9zd2JfMTAyNFtdID0geworICAgIDQxLCA0MSwgNDcsIDQ5LCA0OSwgNTEsIDQ3LCA0NywgNDMsIDQzLCA0MywgNDAsIDQwCit9OworCitjb25zdCB1aW50OF90IGZmX2FhY19udW1fc3diXzUxMltdID0geworICAgICAwLCAgMCwgIDAsIDM2LCAzNiwgMzcsIDMxLCAzMSwgIDAsICAwLCAgMCwgIDAsICAwCit9OworCitjb25zdCB1aW50OF90IGZmX2FhY19udW1fc3diXzEyOFtdID0geworICAgIDEyLCAxMiwgMTIsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1Cit9OworCitjb25zdCB1aW50OF90IGZmX2FhY19wcmVkX3NmYl9tYXhbXSA9IHsKKyAgICAzMywgMzMsIDM4LCA0MCwgNDAsIDQwLCA0MSwgNDEsIDM3LCAzNywgMzcsIDM0LCAzNAorfTsKKworY29uc3QgdWludDMyX3QgZmZfYWFjX3NjYWxlZmFjdG9yX2NvZGVbMTIxXSA9IHsKKyAgICAweDNmZmU4LCAweDNmZmU2LCAweDNmZmU3LCAweDNmZmU1LCAweDdmZmY1LCAweDdmZmYxLCAweDdmZmVkLCAweDdmZmY2LAorICAgIDB4N2ZmZWUsIDB4N2ZmZWYsIDB4N2ZmZjAsIDB4N2ZmZmMsIDB4N2ZmZmQsIDB4N2ZmZmYsIDB4N2ZmZmUsIDB4N2ZmZjcsCisgICAgMHg3ZmZmOCwgMHg3ZmZmYiwgMHg3ZmZmOSwgMHgzZmZlNCwgMHg3ZmZmYSwgMHgzZmZlMywgMHgxZmZlZiwgMHgxZmZmMCwKKyAgICAweDBmZmY1LCAweDFmZmVlLCAweDBmZmYyLCAweDBmZmYzLCAweDBmZmY0LCAweDBmZmYxLCAweDA3ZmY2LCAweDA3ZmY3LAorICAgIDB4MDNmZjksIDB4MDNmZjUsIDB4MDNmZjcsIDB4MDNmZjMsIDB4MDNmZjYsIDB4MDNmZjIsIDB4MDFmZjcsIDB4MDFmZjUsCisgICAgMHgwMGZmOSwgMHgwMGZmNywgMHgwMGZmNiwgMHgwMDdmOSwgMHgwMGZmNCwgMHgwMDdmOCwgMHgwMDNmOSwgMHgwMDNmNywKKyAgICAweDAwM2Y1LCAweDAwMWY4LCAweDAwMWY3LCAweDAwMGZhLCAweDAwMGY4LCAweDAwMGY2LCAweDAwMDc5LCAweDAwMDNhLAorICAgIDB4MDAwMzgsIDB4MDAwMWEsIDB4MDAwMGIsIDB4MDAwMDQsIDB4MDAwMDAsIDB4MDAwMGEsIDB4MDAwMGMsIDB4MDAwMWIsCisgICAgMHgwMDAzOSwgMHgwMDAzYiwgMHgwMDA3OCwgMHgwMDA3YSwgMHgwMDBmNywgMHgwMDBmOSwgMHgwMDFmNiwgMHgwMDFmOSwKKyAgICAweDAwM2Y0LCAweDAwM2Y2LCAweDAwM2Y4LCAweDAwN2Y1LCAweDAwN2Y0LCAweDAwN2Y2LCAweDAwN2Y3LCAweDAwZmY1LAorICAgIDB4MDBmZjgsIDB4MDFmZjQsIDB4MDFmZjYsIDB4MDFmZjgsIDB4MDNmZjgsIDB4MDNmZjQsIDB4MGZmZjAsIDB4MDdmZjQsCisgICAgMHgwZmZmNiwgMHgwN2ZmNSwgMHgzZmZlMiwgMHg3ZmZkOSwgMHg3ZmZkYSwgMHg3ZmZkYiwgMHg3ZmZkYywgMHg3ZmZkZCwKKyAgICAweDdmZmRlLCAweDdmZmQ4LCAweDdmZmQyLCAweDdmZmQzLCAweDdmZmQ0LCAweDdmZmQ1LCAweDdmZmQ2LCAweDdmZmYyLAorICAgIDB4N2ZmZGYsIDB4N2ZmZTcsIDB4N2ZmZTgsIDB4N2ZmZTksIDB4N2ZmZWEsIDB4N2ZmZWIsIDB4N2ZmZTYsIDB4N2ZmZTAsCisgICAgMHg3ZmZlMSwgMHg3ZmZlMiwgMHg3ZmZlMywgMHg3ZmZlNCwgMHg3ZmZlNSwgMHg3ZmZkNywgMHg3ZmZlYywgMHg3ZmZmNCwKKyAgICAweDdmZmYzLAorfTsKKworY29uc3QgdWludDhfdCBmZl9hYWNfc2NhbGVmYWN0b3JfYml0c1sxMjFdID0geworICAgIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE4LCAxOSwgMTgsIDE3LCAxNywgMTYsIDE3LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTEsIDEyLCAxMSwgMTAsIDEwLAorICAgIDEwLCAgOSwgIDksICA4LCAgOCwgIDgsICA3LCAgNiwgIDYsICA1LCAgNCwgIDMsICAxLCAgNCwgIDQsICA1LAorICAgICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLAorICAgIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE2LCAxNSwgMTYsIDE1LCAxOCwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY29kZXMxWzgxXSA9IHsKKyAgICAweDdmOCwgMHgxZjEsIDB4N2ZkLCAweDNmNSwgMHgwNjgsIDB4M2YwLCAweDdmNywgMHgxZWMsCisgICAgMHg3ZjUsIDB4M2YxLCAweDA3MiwgMHgzZjQsIDB4MDc0LCAweDAxMSwgMHgwNzYsIDB4MWViLAorICAgIDB4MDZjLCAweDNmNiwgMHg3ZmMsIDB4MWUxLCAweDdmMSwgMHgxZjAsIDB4MDYxLCAweDFmNiwKKyAgICAweDdmMiwgMHgxZWEsIDB4N2ZiLCAweDFmMiwgMHgwNjksIDB4MWVkLCAweDA3NywgMHgwMTcsCisgICAgMHgwNmYsIDB4MWU2LCAweDA2NCwgMHgxZTUsIDB4MDY3LCAweDAxNSwgMHgwNjIsIDB4MDEyLAorICAgIDB4MDAwLCAweDAxNCwgMHgwNjUsIDB4MDE2LCAweDA2ZCwgMHgxZTksIDB4MDYzLCAweDFlNCwKKyAgICAweDA2YiwgMHgwMTMsIDB4MDcxLCAweDFlMywgMHgwNzAsIDB4MWYzLCAweDdmZSwgMHgxZTcsCisgICAgMHg3ZjMsIDB4MWVmLCAweDA2MCwgMHgxZWUsIDB4N2YwLCAweDFlMiwgMHg3ZmEsIDB4M2YzLAorICAgIDB4MDZhLCAweDFlOCwgMHgwNzUsIDB4MDEwLCAweDA3MywgMHgxZjQsIDB4MDZlLCAweDNmNywKKyAgICAweDdmNiwgMHgxZTAsIDB4N2Y5LCAweDNmMiwgMHgwNjYsIDB4MWY1LCAweDdmZiwgMHgxZjcsCisgICAgMHg3ZjQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRzMVs4MV0gPSB7CisgICAgMTEsICA5LCAxMSwgMTAsICA3LCAxMCwgMTEsICA5LCAxMSwgMTAsICA3LCAxMCwgIDcsICA1LCAgNywgIDksCisgICAgIDcsIDEwLCAxMSwgIDksIDExLCAgOSwgIDcsICA5LCAxMSwgIDksIDExLCAgOSwgIDcsICA5LCAgNywgIDUsCisgICAgIDcsICA5LCAgNywgIDksICA3LCAgNSwgIDcsICA1LCAgMSwgIDUsICA3LCAgNSwgIDcsICA5LCAgNywgIDksCisgICAgIDcsICA1LCAgNywgIDksICA3LCAgOSwgMTEsICA5LCAxMSwgIDksICA3LCAgOSwgMTEsICA5LCAxMSwgMTAsCisgICAgIDcsICA5LCAgNywgIDUsICA3LCAgOSwgIDcsIDEwLCAxMSwgIDksIDExLCAxMCwgIDcsICA5LCAxMSwgIDksCisgICAgMTEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY29kZXMyWzgxXSA9IHsKKyAgICAweDFmMywgMHgwNmYsIDB4MWZkLCAweDBlYiwgMHgwMjMsIDB4MGVhLCAweDFmNywgMHgwZTgsCisgICAgMHgxZmEsIDB4MGYyLCAweDAyZCwgMHgwNzAsIDB4MDIwLCAweDAwNiwgMHgwMmIsIDB4MDZlLAorICAgIDB4MDI4LCAweDBlOSwgMHgxZjksIDB4MDY2LCAweDBmOCwgMHgwZTcsIDB4MDFiLCAweDBmMSwKKyAgICAweDFmNCwgMHgwNmIsIDB4MWY1LCAweDBlYywgMHgwMmEsIDB4MDZjLCAweDAyYywgMHgwMGEsCisgICAgMHgwMjcsIDB4MDY3LCAweDAxYSwgMHgwZjUsIDB4MDI0LCAweDAwOCwgMHgwMWYsIDB4MDA5LAorICAgIDB4MDAwLCAweDAwNywgMHgwMWQsIDB4MDBiLCAweDAzMCwgMHgwZWYsIDB4MDFjLCAweDA2NCwKKyAgICAweDAxZSwgMHgwMGMsIDB4MDI5LCAweDBmMywgMHgwMmYsIDB4MGYwLCAweDFmYywgMHgwNzEsCisgICAgMHgxZjIsIDB4MGY0LCAweDAyMSwgMHgwZTYsIDB4MGY3LCAweDA2OCwgMHgxZjgsIDB4MGVlLAorICAgIDB4MDIyLCAweDA2NSwgMHgwMzEsIDB4MDAyLCAweDAyNiwgMHgwZWQsIDB4MDI1LCAweDA2YSwKKyAgICAweDFmYiwgMHgwNzIsIDB4MWZlLCAweDA2OSwgMHgwMmUsIDB4MGY2LCAweDFmZiwgMHgwNmQsCisgICAgMHgxZjYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRzMls4MV0gPSB7CisgICAgOSwgNywgOSwgOCwgNiwgOCwgOSwgOCwgOSwgOCwgNiwgNywgNiwgNSwgNiwgNywKKyAgICA2LCA4LCA5LCA3LCA4LCA4LCA2LCA4LCA5LCA3LCA5LCA4LCA2LCA3LCA2LCA1LAorICAgIDYsIDcsIDYsIDgsIDYsIDUsIDYsIDUsIDMsIDUsIDYsIDUsIDYsIDgsIDYsIDcsCisgICAgNiwgNSwgNiwgOCwgNiwgOCwgOSwgNywgOSwgOCwgNiwgOCwgOCwgNywgOSwgOCwKKyAgICA2LCA3LCA2LCA0LCA2LCA4LCA2LCA3LCA5LCA3LCA5LCA3LCA2LCA4LCA5LCA3LAorICAgIDksCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY29kZXMzWzgxXSA9IHsKKyAgICAweDAwMDAsIDB4MDAwOSwgMHgwMGVmLCAweDAwMGIsIDB4MDAxOSwgMHgwMGYwLCAweDAxZWIsIDB4MDFlNiwKKyAgICAweDAzZjIsIDB4MDAwYSwgMHgwMDM1LCAweDAxZWYsIDB4MDAzNCwgMHgwMDM3LCAweDAxZTksIDB4MDFlZCwKKyAgICAweDAxZTcsIDB4MDNmMywgMHgwMWVlLCAweDAzZWQsIDB4MWZmYSwgMHgwMWVjLCAweDAxZjIsIDB4MDdmOSwKKyAgICAweDA3ZjgsIDB4MDNmOCwgMHgwZmY4LCAweDAwMDgsIDB4MDAzOCwgMHgwM2Y2LCAweDAwMzYsIDB4MDA3NSwKKyAgICAweDAzZjEsIDB4MDNlYiwgMHgwM2VjLCAweDBmZjQsIDB4MDAxOCwgMHgwMDc2LCAweDA3ZjQsIDB4MDAzOSwKKyAgICAweDAwNzQsIDB4MDNlZiwgMHgwMWYzLCAweDAxZjQsIDB4MDdmNiwgMHgwMWU4LCAweDAzZWEsIDB4MWZmYywKKyAgICAweDAwZjIsIDB4MDFmMSwgMHgwZmZiLCAweDAzZjUsIDB4MDdmMywgMHgwZmZjLCAweDAwZWUsIDB4MDNmNywKKyAgICAweDdmZmUsIDB4MDFmMCwgMHgwN2Y1LCAweDdmZmQsIDB4MWZmYiwgMHgzZmZhLCAweGZmZmYsIDB4MDBmMSwKKyAgICAweDAzZjAsIDB4M2ZmYywgMHgwMWVhLCAweDAzZWUsIDB4M2ZmYiwgMHgwZmY2LCAweDBmZmEsIDB4N2ZmYywKKyAgICAweDA3ZjIsIDB4MGZmNSwgMHhmZmZlLCAweDAzZjQsIDB4MDdmNywgMHg3ZmZiLCAweDBmZjcsIDB4MGZmOSwKKyAgICAweDdmZmEsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRzM1s4MV0gPSB7CisgICAgIDEsICA0LCAgOCwgIDQsICA1LCAgOCwgIDksICA5LCAxMCwgIDQsICA2LCAgOSwgIDYsICA2LCAgOSwgIDksCisgICAgIDksIDEwLCAgOSwgMTAsIDEzLCAgOSwgIDksIDExLCAxMSwgMTAsIDEyLCAgNCwgIDYsIDEwLCAgNiwgIDcsCisgICAgMTAsIDEwLCAxMCwgMTIsICA1LCAgNywgMTEsICA2LCAgNywgMTAsICA5LCAgOSwgMTEsICA5LCAxMCwgMTMsCisgICAgIDgsICA5LCAxMiwgMTAsIDExLCAxMiwgIDgsIDEwLCAxNSwgIDksIDExLCAxNSwgMTMsIDE0LCAxNiwgIDgsCisgICAgMTAsIDE0LCAgOSwgMTAsIDE0LCAxMiwgMTIsIDE1LCAxMSwgMTIsIDE2LCAxMCwgMTEsIDE1LCAxMiwgMTIsCisgICAgMTUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY29kZXM0WzgxXSA9IHsKKyAgICAweDAwNywgMHgwMTYsIDB4MGY2LCAweDAxOCwgMHgwMDgsIDB4MGVmLCAweDFlZiwgMHgwZjMsCisgICAgMHg3ZjgsIDB4MDE5LCAweDAxNywgMHgwZWQsIDB4MDE1LCAweDAwMSwgMHgwZTIsIDB4MGYwLAorICAgIDB4MDcwLCAweDNmMCwgMHgxZWUsIDB4MGYxLCAweDdmYSwgMHgwZWUsIDB4MGU0LCAweDNmMiwKKyAgICAweDdmNiwgMHgzZWYsIDB4N2ZkLCAweDAwNSwgMHgwMTQsIDB4MGYyLCAweDAwOSwgMHgwMDQsCisgICAgMHgwZTUsIDB4MGY0LCAweDBlOCwgMHgzZjQsIDB4MDA2LCAweDAwMiwgMHgwZTcsIDB4MDAzLAorICAgIDB4MDAwLCAweDA2YiwgMHgwZTMsIDB4MDY5LCAweDFmMywgMHgwZWIsIDB4MGU2LCAweDNmNiwKKyAgICAweDA2ZSwgMHgwNmEsIDB4MWY0LCAweDNlYywgMHgxZjAsIDB4M2Y5LCAweDBmNSwgMHgwZWMsCisgICAgMHg3ZmIsIDB4MGVhLCAweDA2ZiwgMHgzZjcsIDB4N2Y5LCAweDNmMywgMHhmZmYsIDB4MGU5LAorICAgIDB4MDZkLCAweDNmOCwgMHgwNmMsIDB4MDY4LCAweDFmNSwgMHgzZWUsIDB4MWYyLCAweDdmNCwKKyAgICAweDdmNywgMHgzZjEsIDB4ZmZlLCAweDNlZCwgMHgxZjEsIDB4N2Y1LCAweDdmZSwgMHgzZjUsCisgICAgMHg3ZmMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRzNFs4MV0gPSB7CisgICAgIDQsICA1LCAgOCwgIDUsICA0LCAgOCwgIDksICA4LCAxMSwgIDUsICA1LCAgOCwgIDUsICA0LCAgOCwgIDgsCisgICAgIDcsIDEwLCAgOSwgIDgsIDExLCAgOCwgIDgsIDEwLCAxMSwgMTAsIDExLCAgNCwgIDUsICA4LCAgNCwgIDQsCisgICAgIDgsICA4LCAgOCwgMTAsICA0LCAgNCwgIDgsICA0LCAgNCwgIDcsICA4LCAgNywgIDksICA4LCAgOCwgMTAsCisgICAgIDcsICA3LCAgOSwgMTAsICA5LCAxMCwgIDgsICA4LCAxMSwgIDgsICA3LCAxMCwgMTEsIDEwLCAxMiwgIDgsCisgICAgIDcsIDEwLCAgNywgIDcsICA5LCAxMCwgIDksIDExLCAxMSwgMTAsIDEyLCAxMCwgIDksIDExLCAxMSwgMTAsCisgICAgMTEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY29kZXM1WzgxXSA9IHsKKyAgICAweDFmZmYsIDB4MGZmNywgMHgwN2Y0LCAweDA3ZTgsIDB4MDNmMSwgMHgwN2VlLCAweDA3ZjksIDB4MGZmOCwKKyAgICAweDFmZmQsIDB4MGZmZCwgMHgwN2YxLCAweDAzZTgsIDB4MDFlOCwgMHgwMGYwLCAweDAxZWMsIDB4MDNlZSwKKyAgICAweDA3ZjIsIDB4MGZmYSwgMHgwZmY0LCAweDAzZWYsIDB4MDFmMiwgMHgwMGU4LCAweDAwNzAsIDB4MDBlYywKKyAgICAweDAxZjAsIDB4MDNlYSwgMHgwN2YzLCAweDA3ZWIsIDB4MDFlYiwgMHgwMGVhLCAweDAwMWEsIDB4MDAwOCwKKyAgICAweDAwMTksIDB4MDBlZSwgMHgwMWVmLCAweDA3ZWQsIDB4MDNmMCwgMHgwMGYyLCAweDAwNzMsIDB4MDAwYiwKKyAgICAweDAwMDAsIDB4MDAwYSwgMHgwMDcxLCAweDAwZjMsIDB4MDdlOSwgMHgwN2VmLCAweDAxZWUsIDB4MDBlZiwKKyAgICAweDAwMTgsIDB4MDAwOSwgMHgwMDFiLCAweDAwZWIsIDB4MDFlOSwgMHgwN2VjLCAweDA3ZjYsIDB4MDNlYiwKKyAgICAweDAxZjMsIDB4MDBlZCwgMHgwMDcyLCAweDAwZTksIDB4MDFmMSwgMHgwM2VkLCAweDA3ZjcsIDB4MGZmNiwKKyAgICAweDA3ZjAsIDB4MDNlOSwgMHgwMWVkLCAweDAwZjEsIDB4MDFlYSwgMHgwM2VjLCAweDA3ZjgsIDB4MGZmOSwKKyAgICAweDFmZmMsIDB4MGZmYywgMHgwZmY1LCAweDA3ZWEsIDB4MDNmMywgMHgwM2YyLCAweDA3ZjUsIDB4MGZmYiwKKyAgICAweDFmZmUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRzNVs4MV0gPSB7CisgICAgMTMsIDEyLCAxMSwgMTEsIDEwLCAxMSwgMTEsIDEyLCAxMywgMTIsIDExLCAxMCwgIDksICA4LCAgOSwgMTAsCisgICAgMTEsIDEyLCAxMiwgMTAsICA5LCAgOCwgIDcsICA4LCAgOSwgMTAsIDExLCAxMSwgIDksICA4LCAgNSwgIDQsCisgICAgIDUsICA4LCAgOSwgMTEsIDEwLCAgOCwgIDcsICA0LCAgMSwgIDQsICA3LCAgOCwgMTEsIDExLCAgOSwgIDgsCisgICAgIDUsICA0LCAgNSwgIDgsICA5LCAxMSwgMTEsIDEwLCAgOSwgIDgsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsCisgICAgMTEsIDEwLCAgOSwgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTIsIDEyLCAxMSwgMTAsIDEwLCAxMSwgMTIsCisgICAgMTMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY29kZXM2WzgxXSA9IHsKKyAgICAweDdmZSwgMHgzZmQsIDB4MWYxLCAweDFlYiwgMHgxZjQsIDB4MWVhLCAweDFmMCwgMHgzZmMsCisgICAgMHg3ZmQsIDB4M2Y2LCAweDFlNSwgMHgwZWEsIDB4MDZjLCAweDA3MSwgMHgwNjgsIDB4MGYwLAorICAgIDB4MWU2LCAweDNmNywgMHgxZjMsIDB4MGVmLCAweDAzMiwgMHgwMjcsIDB4MDI4LCAweDAyNiwKKyAgICAweDAzMSwgMHgwZWIsIDB4MWY3LCAweDFlOCwgMHgwNmYsIDB4MDJlLCAweDAwOCwgMHgwMDQsCisgICAgMHgwMDYsIDB4MDI5LCAweDA2YiwgMHgxZWUsIDB4MWVmLCAweDA3MiwgMHgwMmQsIDB4MDAyLAorICAgIDB4MDAwLCAweDAwMywgMHgwMmYsIDB4MDczLCAweDFmYSwgMHgxZTcsIDB4MDZlLCAweDAyYiwKKyAgICAweDAwNywgMHgwMDEsIDB4MDA1LCAweDAyYywgMHgwNmQsIDB4MWVjLCAweDFmOSwgMHgwZWUsCisgICAgMHgwMzAsIDB4MDI0LCAweDAyYSwgMHgwMjUsIDB4MDMzLCAweDBlYywgMHgxZjIsIDB4M2Y4LAorICAgIDB4MWU0LCAweDBlZCwgMHgwNmEsIDB4MDcwLCAweDA2OSwgMHgwNzQsIDB4MGYxLCAweDNmYSwKKyAgICAweDdmZiwgMHgzZjksIDB4MWY2LCAweDFlZCwgMHgxZjgsIDB4MWU5LCAweDFmNSwgMHgzZmIsCisgICAgMHg3ZmMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRzNls4MV0gPSB7CisgICAgMTEsIDEwLCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMSwgMTAsICA5LCAgOCwgIDcsICA3LCAgNywgIDgsCisgICAgIDksIDEwLCAgOSwgIDgsICA2LCAgNiwgIDYsICA2LCAgNiwgIDgsICA5LCAgOSwgIDcsICA2LCAgNCwgIDQsCisgICAgIDQsICA2LCAgNywgIDksICA5LCAgNywgIDYsICA0LCAgNCwgIDQsICA2LCAgNywgIDksICA5LCAgNywgIDYsCisgICAgIDQsICA0LCAgNCwgIDYsICA3LCAgOSwgIDksICA4LCAgNiwgIDYsICA2LCAgNiwgIDYsICA4LCAgOSwgMTAsCisgICAgIDksICA4LCAgNywgIDcsICA3LCAgNywgIDgsIDEwLCAxMSwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgMTAsCisgICAgMTEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY29kZXM3WzY0XSA9IHsKKyAgICAweDAwMCwgMHgwMDUsIDB4MDM3LCAweDA3NCwgMHgwZjIsIDB4MWViLCAweDNlZCwgMHg3ZjcsCisgICAgMHgwMDQsIDB4MDBjLCAweDAzNSwgMHgwNzEsIDB4MGVjLCAweDBlZSwgMHgxZWUsIDB4MWY1LAorICAgIDB4MDM2LCAweDAzNCwgMHgwNzIsIDB4MGVhLCAweDBmMSwgMHgxZTksIDB4MWYzLCAweDNmNSwKKyAgICAweDA3MywgMHgwNzAsIDB4MGViLCAweDBmMCwgMHgxZjEsIDB4MWYwLCAweDNlYywgMHgzZmEsCisgICAgMHgwZjMsIDB4MGVkLCAweDFlOCwgMHgxZWYsIDB4M2VmLCAweDNmMSwgMHgzZjksIDB4N2ZiLAorICAgIDB4MWVkLCAweDBlZiwgMHgxZWEsIDB4MWYyLCAweDNmMywgMHgzZjgsIDB4N2Y5LCAweDdmYywKKyAgICAweDNlZSwgMHgxZWMsIDB4MWY0LCAweDNmNCwgMHgzZjcsIDB4N2Y4LCAweGZmZCwgMHhmZmUsCisgICAgMHg3ZjYsIDB4M2YwLCAweDNmMiwgMHgzZjYsIDB4N2ZhLCAweDdmZCwgMHhmZmMsIDB4ZmZmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0czdbNjRdID0geworICAgICAxLCAgMywgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgIDMsICA0LCAgNiwgIDcsICA4LCAgOCwgIDksICA5LAorICAgICA2LCAgNiwgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLAorICAgICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwgIDksICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLAorICAgIDEwLCAgOSwgIDksIDEwLCAxMCwgMTEsIDEyLCAxMiwgMTEsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNvZGVzOFs2NF0gPSB7CisgICAgMHgwMGUsIDB4MDA1LCAweDAxMCwgMHgwMzAsIDB4MDZmLCAweDBmMSwgMHgxZmEsIDB4M2ZlLAorICAgIDB4MDAzLCAweDAwMCwgMHgwMDQsIDB4MDEyLCAweDAyYywgMHgwNmEsIDB4MDc1LCAweDBmOCwKKyAgICAweDAwZiwgMHgwMDIsIDB4MDA2LCAweDAxNCwgMHgwMmUsIDB4MDY5LCAweDA3MiwgMHgwZjUsCisgICAgMHgwMmYsIDB4MDExLCAweDAxMywgMHgwMmEsIDB4MDMyLCAweDA2YywgMHgwZWMsIDB4MGZhLAorICAgIDB4MDcxLCAweDAyYiwgMHgwMmQsIDB4MDMxLCAweDA2ZCwgMHgwNzAsIDB4MGYyLCAweDFmOSwKKyAgICAweDBlZiwgMHgwNjgsIDB4MDMzLCAweDA2YiwgMHgwNmUsIDB4MGVlLCAweDBmOSwgMHgzZmMsCisgICAgMHgxZjgsIDB4MDc0LCAweDA3MywgMHgwZWQsIDB4MGYwLCAweDBmNiwgMHgxZjYsIDB4MWZkLAorICAgIDB4M2ZkLCAweDBmMywgMHgwZjQsIDB4MGY3LCAweDFmNywgMHgxZmIsIDB4MWZjLCAweDNmZiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdHM4WzY0XSA9IHsKKyAgICAgNSwgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsICA0LCAgMywgIDQsICA1LCAgNiwgIDcsICA3LCAgOCwKKyAgICAgNSwgIDQsICA0LCAgNSwgIDYsICA3LCAgNywgIDgsICA2LCAgNSwgIDUsICA2LCAgNiwgIDcsICA4LCAgOCwKKyAgICAgNywgIDYsICA2LCAgNiwgIDcsICA3LCAgOCwgIDksICA4LCAgNywgIDYsICA3LCAgNywgIDgsICA4LCAxMCwKKyAgICAgOSwgIDcsICA3LCAgOCwgIDgsICA4LCAgOSwgIDksIDEwLCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjb2RlczlbMTY5XSA9IHsKKyAgICAweDAwMDAsIDB4MDAwNSwgMHgwMDM3LCAweDAwZTcsIDB4MDFkZSwgMHgwM2NlLCAweDAzZDksIDB4MDdjOCwKKyAgICAweDA3Y2QsIDB4MGZjOCwgMHgwZmRkLCAweDFmZTQsIDB4MWZlYywgMHgwMDA0LCAweDAwMGMsIDB4MDAzNSwKKyAgICAweDAwNzIsIDB4MDBlYSwgMHgwMGVkLCAweDAxZTIsIDB4MDNkMSwgMHgwM2QzLCAweDAzZTAsIDB4MDdkOCwKKyAgICAweDBmY2YsIDB4MGZkNSwgMHgwMDM2LCAweDAwMzQsIDB4MDA3MSwgMHgwMGU4LCAweDAwZWMsIDB4MDFlMSwKKyAgICAweDAzY2YsIDB4MDNkZCwgMHgwM2RiLCAweDA3ZDAsIDB4MGZjNywgMHgwZmQ0LCAweDBmZTQsIDB4MDBlNiwKKyAgICAweDAwNzAsIDB4MDBlOSwgMHgwMWRkLCAweDAxZTMsIDB4MDNkMiwgMHgwM2RjLCAweDA3Y2MsIDB4MDdjYSwKKyAgICAweDA3ZGUsIDB4MGZkOCwgMHgwZmVhLCAweDFmZGIsIDB4MDFkZiwgMHgwMGViLCAweDAxZGMsIDB4MDFlNiwKKyAgICAweDAzZDUsIDB4MDNkZSwgMHgwN2NiLCAweDA3ZGQsIDB4MDdkYywgMHgwZmNkLCAweDBmZTIsIDB4MGZlNywKKyAgICAweDFmZTEsIDB4MDNkMCwgMHgwMWUwLCAweDAxZTQsIDB4MDNkNiwgMHgwN2M1LCAweDA3ZDEsIDB4MDdkYiwKKyAgICAweDBmZDIsIDB4MDdlMCwgMHgwZmQ5LCAweDBmZWIsIDB4MWZlMywgMHgxZmU5LCAweDA3YzQsIDB4MDFlNSwKKyAgICAweDAzZDcsIDB4MDdjNiwgMHgwN2NmLCAweDA3ZGEsIDB4MGZjYiwgMHgwZmRhLCAweDBmZTMsIDB4MGZlOSwKKyAgICAweDFmZTYsIDB4MWZmMywgMHgxZmY3LCAweDA3ZDMsIDB4MDNkOCwgMHgwM2UxLCAweDA3ZDQsIDB4MDdkOSwKKyAgICAweDBmZDMsIDB4MGZkZSwgMHgxZmRkLCAweDFmZDksIDB4MWZlMiwgMHgxZmVhLCAweDFmZjEsIDB4MWZmNiwKKyAgICAweDA3ZDIsIDB4MDNkNCwgMHgwM2RhLCAweDA3YzcsIDB4MDdkNywgMHgwN2UyLCAweDBmY2UsIDB4MGZkYiwKKyAgICAweDFmZDgsIDB4MWZlZSwgMHgzZmYwLCAweDFmZjQsIDB4M2ZmMiwgMHgwN2UxLCAweDAzZGYsIDB4MDdjOSwKKyAgICAweDA3ZDYsIDB4MGZjYSwgMHgwZmQwLCAweDBmZTUsIDB4MGZlNiwgMHgxZmViLCAweDFmZWYsIDB4M2ZmMywKKyAgICAweDNmZjQsIDB4M2ZmNSwgMHgwZmUwLCAweDA3Y2UsIDB4MDdkNSwgMHgwZmM2LCAweDBmZDEsIDB4MGZlMSwKKyAgICAweDFmZTAsIDB4MWZlOCwgMHgxZmYwLCAweDNmZjEsIDB4M2ZmOCwgMHgzZmY2LCAweDdmZmMsIDB4MGZlOCwKKyAgICAweDA3ZGYsIDB4MGZjOSwgMHgwZmQ3LCAweDBmZGMsIDB4MWZkYywgMHgxZmRmLCAweDFmZWQsIDB4MWZmNSwKKyAgICAweDNmZjksIDB4M2ZmYiwgMHg3ZmZkLCAweDdmZmUsIDB4MWZlNywgMHgwZmNjLCAweDBmZDYsIDB4MGZkZiwKKyAgICAweDFmZGUsIDB4MWZkYSwgMHgxZmU1LCAweDFmZjIsIDB4M2ZmYSwgMHgzZmY3LCAweDNmZmMsIDB4M2ZmZCwKKyAgICAweDdmZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRzOVsxNjldID0geworICAgICAxLCAgMywgIDYsICA4LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAgMywgIDQsICA2LAorICAgICA3LCAgOCwgIDgsICA5LCAxMCwgMTAsIDEwLCAxMSwgMTIsIDEyLCAgNiwgIDYsICA3LCAgOCwgIDgsICA5LAorICAgIDEwLCAxMCwgMTAsIDExLCAxMiwgMTIsIDEyLCAgOCwgIDcsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLAorICAgIDExLCAxMiwgMTIsIDEzLCAgOSwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxMCwgIDksICA5LCAxMCwgMTEsIDExLCAxMSwgMTIsIDExLCAxMiwgMTIsIDEzLCAxMywgMTEsICA5LAorICAgIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTEsIDEwLCAxMCwgMTEsIDExLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTEsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLAorICAgIDEzLCAxMywgMTQsIDEzLCAxNCwgMTEsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LAorICAgIDE0LCAxNCwgMTIsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDEyLAorICAgIDExLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsIDEzLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY29kZXMxMFsxNjldID0geworICAgIDB4MDIyLCAweDAwOCwgMHgwMWQsIDB4MDI2LCAweDA1ZiwgMHgwZDMsIDB4MWNmLCAweDNkMCwKKyAgICAweDNkNywgMHgzZWQsIDB4N2YwLCAweDdmNiwgMHhmZmQsIDB4MDA3LCAweDAwMCwgMHgwMDEsCisgICAgMHgwMDksIDB4MDIwLCAweDA1NCwgMHgwNjAsIDB4MGQ1LCAweDBkYywgMHgxZDQsIDB4M2NkLAorICAgIDB4M2RlLCAweDdlNywgMHgwMWMsIDB4MDAyLCAweDAwNiwgMHgwMGMsIDB4MDFlLCAweDAyOCwKKyAgICAweDA1YiwgMHgwY2QsIDB4MGQ5LCAweDFjZSwgMHgxZGMsIDB4M2Q5LCAweDNmMSwgMHgwMjUsCisgICAgMHgwMGIsIDB4MDBhLCAweDAwZCwgMHgwMjQsIDB4MDU3LCAweDA2MSwgMHgwY2MsIDB4MGRkLAorICAgIDB4MWNjLCAweDFkZSwgMHgzZDMsIDB4M2U3LCAweDA1ZCwgMHgwMjEsIDB4MDFmLCAweDAyMywKKyAgICAweDAyNywgMHgwNTksIDB4MDY0LCAweDBkOCwgMHgwZGYsIDB4MWQyLCAweDFlMiwgMHgzZGQsCisgICAgMHgzZWUsIDB4MGQxLCAweDA1NSwgMHgwMjksIDB4MDU2LCAweDA1OCwgMHgwNjIsIDB4MGNlLAorICAgIDB4MGUwLCAweDBlMiwgMHgxZGEsIDB4M2Q0LCAweDNlMywgMHg3ZWIsIDB4MWM5LCAweDA1ZSwKKyAgICAweDA1YSwgMHgwNWMsIDB4MDYzLCAweDBjYSwgMHgwZGEsIDB4MWM3LCAweDFjYSwgMHgxZTAsCisgICAgMHgzZGIsIDB4M2U4LCAweDdlYywgMHgxZTMsIDB4MGQyLCAweDBjYiwgMHgwZDAsIDB4MGQ3LAorICAgIDB4MGRiLCAweDFjNiwgMHgxZDUsIDB4MWQ4LCAweDNjYSwgMHgzZGEsIDB4N2VhLCAweDdmMSwKKyAgICAweDFlMSwgMHgwZDQsIDB4MGNmLCAweDBkNiwgMHgwZGUsIDB4MGUxLCAweDFkMCwgMHgxZDYsCisgICAgMHgzZDEsIDB4M2Q1LCAweDNmMiwgMHg3ZWUsIDB4N2ZiLCAweDNlOSwgMHgxY2QsIDB4MWM4LAorICAgIDB4MWNiLCAweDFkMSwgMHgxZDcsIDB4MWRmLCAweDNjZiwgMHgzZTAsIDB4M2VmLCAweDdlNiwKKyAgICAweDdmOCwgMHhmZmEsIDB4M2ViLCAweDFkZCwgMHgxZDMsIDB4MWQ5LCAweDFkYiwgMHgzZDIsCisgICAgMHgzY2MsIDB4M2RjLCAweDNlYSwgMHg3ZWQsIDB4N2YzLCAweDdmOSwgMHhmZjksIDB4N2YyLAorICAgIDB4M2NlLCAweDFlNCwgMHgzY2IsIDB4M2Q4LCAweDNkNiwgMHgzZTIsIDB4M2U1LCAweDdlOCwKKyAgICAweDdmNCwgMHg3ZjUsIDB4N2Y3LCAweGZmYiwgMHg3ZmEsIDB4M2VjLCAweDNkZiwgMHgzZTEsCisgICAgMHgzZTQsIDB4M2U2LCAweDNmMCwgMHg3ZTksIDB4N2VmLCAweGZmOCwgMHhmZmUsIDB4ZmZjLAorICAgIDB4ZmZmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0czEwWzE2OV0gPSB7CisgICAgIDYsICA1LCAgNiwgIDYsICA3LCAgOCwgIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsICA1LCAgNCwgIDQsCisgICAgIDUsICA2LCAgNywgIDcsICA4LCAgOCwgIDksIDEwLCAxMCwgMTEsICA2LCAgNCwgIDUsICA1LCAgNiwgIDYsCisgICAgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsICA2LCAgNSwgIDUsICA1LCAgNiwgIDcsICA3LCAgOCwgIDgsCisgICAgIDksICA5LCAxMCwgMTAsICA3LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsCisgICAgMTAsICA4LCAgNywgIDYsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAxMCwgMTAsIDExLCAgOSwgIDcsCisgICAgIDcsICA3LCAgNywgIDgsICA4LCAgOSwgIDksICA5LCAxMCwgMTAsIDExLCAgOSwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA5LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksCisgICAgMTAsIDEwLCAxMCwgMTEsIDExLCAxMCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTEsCisgICAgMTEsIDEyLCAxMCwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTEsCisgICAgMTAsICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTEsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjb2RlczExWzI4OV0gPSB7CisgICAgMHgwMDAsIDB4MDA2LCAweDAxOSwgMHgwM2QsIDB4MDljLCAweDBjNiwgMHgxYTcsIDB4MzkwLAorICAgIDB4M2MyLCAweDNkZiwgMHg3ZTYsIDB4N2YzLCAweGZmYiwgMHg3ZWMsIDB4ZmZhLCAweGZmZSwKKyAgICAweDM4ZSwgMHgwMDUsIDB4MDAxLCAweDAwOCwgMHgwMTQsIDB4MDM3LCAweDA0MiwgMHgwOTIsCisgICAgMHgwYWYsIDB4MTkxLCAweDFhNSwgMHgxYjUsIDB4MzllLCAweDNjMCwgMHgzYTIsIDB4M2NkLAorICAgIDB4N2Q2LCAweDBhZSwgMHgwMTcsIDB4MDA3LCAweDAwOSwgMHgwMTgsIDB4MDM5LCAweDA0MCwKKyAgICAweDA4ZSwgMHgwYTMsIDB4MGI4LCAweDE5OSwgMHgxYWMsIDB4MWMxLCAweDNiMSwgMHgzOTYsCisgICAgMHgzYmUsIDB4M2NhLCAweDA5ZCwgMHgwM2MsIDB4MDE1LCAweDAxNiwgMHgwMWEsIDB4MDNiLAorICAgIDB4MDQ0LCAweDA5MSwgMHgwYTUsIDB4MGJlLCAweDE5NiwgMHgxYWUsIDB4MWI5LCAweDNhMSwKKyAgICAweDM5MSwgMHgzYTUsIDB4M2Q1LCAweDA5NCwgMHgwOWEsIDB4MDM2LCAweDAzOCwgMHgwM2EsCisgICAgMHgwNDEsIDB4MDhjLCAweDA5YiwgMHgwYjAsIDB4MGMzLCAweDE5ZSwgMHgxYWIsIDB4MWJjLAorICAgIDB4MzlmLCAweDM4ZiwgMHgzYTksIDB4M2NmLCAweDA5MywgMHgwYmYsIDB4MDNlLCAweDAzZiwKKyAgICAweDA0MywgMHgwNDUsIDB4MDllLCAweDBhNywgMHgwYjksIDB4MTk0LCAweDFhMiwgMHgxYmEsCisgICAgMHgxYzMsIDB4M2E2LCAweDNhNywgMHgzYmIsIDB4M2Q0LCAweDA5ZiwgMHgxYTAsIDB4MDhmLAorICAgIDB4MDhkLCAweDA5MCwgMHgwOTgsIDB4MGE2LCAweDBiNiwgMHgwYzQsIDB4MTlmLCAweDFhZiwKKyAgICAweDFiZiwgMHgzOTksIDB4M2JmLCAweDNiNCwgMHgzYzksIDB4M2U3LCAweDBhOCwgMHgxYjYsCisgICAgMHgwYWIsIDB4MGE0LCAweDBhYSwgMHgwYjIsIDB4MGMyLCAweDBjNSwgMHgxOTgsIDB4MWE0LAorICAgIDB4MWI4LCAweDM4YywgMHgzYTQsIDB4M2M0LCAweDNjNiwgMHgzZGQsIDB4M2U4LCAweDBhZCwKKyAgICAweDNhZiwgMHgxOTIsIDB4MGJkLCAweDBiYywgMHgxOGUsIDB4MTk3LCAweDE5YSwgMHgxYTMsCisgICAgMHgxYjEsIDB4MzhkLCAweDM5OCwgMHgzYjcsIDB4M2QzLCAweDNkMSwgMHgzZGIsIDB4N2RkLAorICAgIDB4MGI0LCAweDNkZSwgMHgxYTksIDB4MTliLCAweDE5YywgMHgxYTEsIDB4MWFhLCAweDFhZCwKKyAgICAweDFiMywgMHgzOGIsIDB4M2IyLCAweDNiOCwgMHgzY2UsIDB4M2UxLCAweDNlMCwgMHg3ZDIsCisgICAgMHg3ZTUsIDB4MGI3LCAweDdlMywgMHgxYmIsIDB4MWE4LCAweDFhNiwgMHgxYjAsIDB4MWIyLAorICAgIDB4MWI3LCAweDM5YiwgMHgzOWEsIDB4M2JhLCAweDNiNSwgMHgzZDYsIDB4N2Q3LCAweDNlNCwKKyAgICAweDdkOCwgMHg3ZWEsIDB4MGJhLCAweDdlOCwgMHgzYTAsIDB4MWJkLCAweDFiNCwgMHgzOGEsCisgICAgMHgxYzQsIDB4MzkyLCAweDNhYSwgMHgzYjAsIDB4M2JjLCAweDNkNywgMHg3ZDQsIDB4N2RjLAorICAgIDB4N2RiLCAweDdkNSwgMHg3ZjAsIDB4MGMxLCAweDdmYiwgMHgzYzgsIDB4M2EzLCAweDM5NSwKKyAgICAweDM5ZCwgMHgzYWMsIDB4M2FlLCAweDNjNSwgMHgzZDgsIDB4M2UyLCAweDNlNiwgMHg3ZTQsCisgICAgMHg3ZTcsIDB4N2UwLCAweDdlOSwgMHg3ZjcsIDB4MTkwLCAweDdmMiwgMHgzOTMsIDB4MWJlLAorICAgIDB4MWMwLCAweDM5NCwgMHgzOTcsIDB4M2FkLCAweDNjMywgMHgzYzEsIDB4M2QyLCAweDdkYSwKKyAgICAweDdkOSwgMHg3ZGYsIDB4N2ViLCAweDdmNCwgMHg3ZmEsIDB4MTk1LCAweDdmOCwgMHgzYmQsCisgICAgMHgzOWMsIDB4M2FiLCAweDNhOCwgMHgzYjMsIDB4M2I5LCAweDNkMCwgMHgzZTMsIDB4M2U1LAorICAgIDB4N2UyLCAweDdkZSwgMHg3ZWQsIDB4N2YxLCAweDdmOSwgMHg3ZmMsIDB4MTkzLCAweGZmZCwKKyAgICAweDNkYywgMHgzYjYsIDB4M2M3LCAweDNjYywgMHgzY2IsIDB4M2Q5LCAweDNkYSwgMHg3ZDMsCisgICAgMHg3ZTEsIDB4N2VlLCAweDdlZiwgMHg3ZjUsIDB4N2Y2LCAweGZmYywgMHhmZmYsIDB4MTlkLAorICAgIDB4MWMyLCAweDBiNSwgMHgwYTEsIDB4MDk2LCAweDA5NywgMHgwOTUsIDB4MDk5LCAweDBhMCwKKyAgICAweDBhMiwgMHgwYWMsIDB4MGE5LCAweDBiMSwgMHgwYjMsIDB4MGJiLCAweDBjMCwgMHgxOGYsCisgICAgMHgwMDQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRzMTFbMjg5XSA9IHsKKyAgICAgNCwgIDUsICA2LCAgNywgIDgsICA4LCAgOSwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMiwgMTEsIDEyLCAxMiwKKyAgICAxMCwgIDUsICA0LCAgNSwgIDYsICA3LCAgNywgIDgsICA4LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMSwgIDgsICA2LCAgNSwgIDUsICA2LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksIDEwLCAxMCwKKyAgICAxMCwgMTAsICA4LCAgNywgIDYsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAxMCwKKyAgICAxMCwgMTAsIDEwLCAgOCwgIDgsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwKKyAgICAxMCwgMTAsIDEwLCAxMCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDksICA5LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMCwgMTAsICA4LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOCwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDgsIDEwLCAgOSwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsICA4LCAxMCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAgOCwgMTEsICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTAsIDExLCAxMSwgIDgsIDExLCAxMCwgIDksICA5LCAxMCwKKyAgICAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsICA4LCAxMSwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAgOSwgMTEsIDEwLCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgIDksIDExLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsICA5LCAxMiwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAgOSwKKyAgICAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwKKyAgICAgNSwKK307CisKK2NvbnN0IHVpbnQxNl90ICogY29uc3QgZmZfYWFjX3NwZWN0cmFsX2NvZGVzWzExXSA9IHsKKyAgICBjb2RlczEsICBjb2RlczIsICBjb2RlczMsIGNvZGVzNCwgY29kZXM1LCBjb2RlczYsIGNvZGVzNywgY29kZXM4LAorICAgIGNvZGVzOSwgY29kZXMxMCwgY29kZXMxMSwKK307CisKK2NvbnN0IHVpbnQ4X3QgKiBjb25zdCBmZl9hYWNfc3BlY3RyYWxfYml0c1sxMV0gPSB7CisgICAgYml0czEsICBiaXRzMiwgIGJpdHMzLCBiaXRzNCwgYml0czUsIGJpdHM2LCBiaXRzNywgYml0czgsCisgICAgYml0czksIGJpdHMxMCwgYml0czExLAorfTsKKworY29uc3QgdWludDE2X3QgZmZfYWFjX3NwZWN0cmFsX3NpemVzWzExXSA9IHsKKyAgICA4MSwgODEsIDgxLCA4MSwgODEsIDgxLCA2NCwgNjQsIDE2OSwgMTY5LCAyODksCit9OworCisvKiBOT1RFOgorICogNjQuMGYgaXMgYSBzcGVjaWFsIHZhbHVlIGluZGljYXRpbmcgdGhlIGV4aXN0ZW5jZSBvZiBhbiBlc2NhcGUgY29kZSBpbiB0aGUKKyAqIGJpdHN0cmVhbS4KKyAqLworc3RhdGljIGNvbnN0IERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIGNvZGVib29rX3ZlY3RvcjApWzMyNF0gPSB7CisgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAtMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorIC0xLjAwMDAwMDAsIC0xLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAtMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorIC0xLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAtMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorIC0xLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgLTEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorIC0xLjAwMDAwMDAsICAwLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgLTEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorIC0xLjAwMDAwMDAsICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgLTEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorIC0xLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgLTEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAtMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgLTEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAtMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgLTEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAtMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMC4wMDAwMDAwLCAtMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsIC0xLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMC4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMC4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsIC0xLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAtMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgREVDTEFSRV9BTElHTkVEKDE2LCBmbG9hdCwgY29kZWJvb2tfdmVjdG9yMilbMzI0XSA9IHsKKyAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwKKyAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwKKyAgMC4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAyLjUxOTg0MjEsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMC4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMC4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAyLjUxOTg0MjEsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAyLjUxOTg0MjEsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLAorICAxLjAwMDAwMDAsICAyLjUxOTg0MjEsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwKKyAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAyLjUxOTg0MjEsICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDIuNTE5ODQyMSwgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAyLjUxOTg0MjEsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDIuNTE5ODQyMSwgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLAorICAyLjUxOTg0MjEsICAwLjAwMDAwMDAsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsCisgIDIuNTE5ODQyMSwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwKKyAgMi41MTk4NDIxLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDIuNTE5ODQyMSwgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMi41MTk4NDIxLCAgMS4wMDAwMDAwLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDIuNTE5ODQyMSwgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMi41MTk4NDIxLCAgMS4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLAorICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsCisgIDIuNTE5ODQyMSwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwKKyAgMi41MTk4NDIxLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAyLjUxOTg0MjEsICAyLjUxOTg0MjEsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMi41MTk4NDIxLCAgMi41MTk4NDIxLCAgMS4wMDAwMDAwLCAgMC4wMDAwMDAwLAorICAyLjUxOTg0MjEsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMi41MTk4NDIxLCAgMi41MTk4NDIxLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLAorICAyLjUxOTg0MjEsICAyLjUxOTg0MjEsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsCisgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwKK307CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBjb2RlYm9va192ZWN0b3I0KVsxNjJdID0geworIC02LjM0OTYwNDIsIC02LjM0OTYwNDIsIC02LjM0OTYwNDIsIC00LjMyNjc0ODcsCisgLTYuMzQ5NjA0MiwgLTIuNTE5ODQyMSwgLTYuMzQ5NjA0MiwgLTEuMDAwMDAwMCwKKyAtNi4zNDk2MDQyLCAgMC4wMDAwMDAwLCAtNi4zNDk2MDQyLCAgMS4wMDAwMDAwLAorIC02LjM0OTYwNDIsICAyLjUxOTg0MjEsIC02LjM0OTYwNDIsICA0LjMyNjc0ODcsCisgLTYuMzQ5NjA0MiwgIDYuMzQ5NjA0MiwgLTQuMzI2NzQ4NywgLTYuMzQ5NjA0MiwKKyAtNC4zMjY3NDg3LCAtNC4zMjY3NDg3LCAtNC4zMjY3NDg3LCAtMi41MTk4NDIxLAorIC00LjMyNjc0ODcsIC0xLjAwMDAwMDAsIC00LjMyNjc0ODcsICAwLjAwMDAwMDAsCisgLTQuMzI2NzQ4NywgIDEuMDAwMDAwMCwgLTQuMzI2NzQ4NywgIDIuNTE5ODQyMSwKKyAtNC4zMjY3NDg3LCAgNC4zMjY3NDg3LCAtNC4zMjY3NDg3LCAgNi4zNDk2MDQyLAorIC0yLjUxOTg0MjEsIC02LjM0OTYwNDIsIC0yLjUxOTg0MjEsIC00LjMyNjc0ODcsCisgLTIuNTE5ODQyMSwgLTIuNTE5ODQyMSwgLTIuNTE5ODQyMSwgLTEuMDAwMDAwMCwKKyAtMi41MTk4NDIxLCAgMC4wMDAwMDAwLCAtMi41MTk4NDIxLCAgMS4wMDAwMDAwLAorIC0yLjUxOTg0MjEsICAyLjUxOTg0MjEsIC0yLjUxOTg0MjEsICA0LjMyNjc0ODcsCisgLTIuNTE5ODQyMSwgIDYuMzQ5NjA0MiwgLTEuMDAwMDAwMCwgLTYuMzQ5NjA0MiwKKyAtMS4wMDAwMDAwLCAtNC4zMjY3NDg3LCAtMS4wMDAwMDAwLCAtMi41MTk4NDIxLAorIC0xLjAwMDAwMDAsIC0xLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAwLjAwMDAwMDAsCisgLTEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgLTEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAtMS4wMDAwMDAwLCAgNC4zMjY3NDg3LCAtMS4wMDAwMDAwLCAgNi4zNDk2MDQyLAorICAwLjAwMDAwMDAsIC02LjM0OTYwNDIsICAwLjAwMDAwMDAsIC00LjMyNjc0ODcsCisgIDAuMDAwMDAwMCwgLTIuNTE5ODQyMSwgIDAuMDAwMDAwMCwgLTEuMDAwMDAwMCwKKyAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLAorICAwLjAwMDAwMDAsICAyLjUxOTg0MjEsICAwLjAwMDAwMDAsICA0LjMyNjc0ODcsCisgIDAuMDAwMDAwMCwgIDYuMzQ5NjA0MiwgIDEuMDAwMDAwMCwgLTYuMzQ5NjA0MiwKKyAgMS4wMDAwMDAwLCAtNC4zMjY3NDg3LCAgMS4wMDAwMDAwLCAtMi41MTk4NDIxLAorICAxLjAwMDAwMDAsIC0xLjAwMDAwMDAsICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgNC4zMjY3NDg3LCAgMS4wMDAwMDAwLCAgNi4zNDk2MDQyLAorICAyLjUxOTg0MjEsIC02LjM0OTYwNDIsICAyLjUxOTg0MjEsIC00LjMyNjc0ODcsCisgIDIuNTE5ODQyMSwgLTIuNTE5ODQyMSwgIDIuNTE5ODQyMSwgLTEuMDAwMDAwMCwKKyAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMS4wMDAwMDAwLAorICAyLjUxOTg0MjEsICAyLjUxOTg0MjEsICAyLjUxOTg0MjEsICA0LjMyNjc0ODcsCisgIDIuNTE5ODQyMSwgIDYuMzQ5NjA0MiwgIDQuMzI2NzQ4NywgLTYuMzQ5NjA0MiwKKyAgNC4zMjY3NDg3LCAtNC4zMjY3NDg3LCAgNC4zMjY3NDg3LCAtMi41MTk4NDIxLAorICA0LjMyNjc0ODcsIC0xLjAwMDAwMDAsICA0LjMyNjc0ODcsICAwLjAwMDAwMDAsCisgIDQuMzI2NzQ4NywgIDEuMDAwMDAwMCwgIDQuMzI2NzQ4NywgIDIuNTE5ODQyMSwKKyAgNC4zMjY3NDg3LCAgNC4zMjY3NDg3LCAgNC4zMjY3NDg3LCAgNi4zNDk2MDQyLAorICA2LjM0OTYwNDIsIC02LjM0OTYwNDIsICA2LjM0OTYwNDIsIC00LjMyNjc0ODcsCisgIDYuMzQ5NjA0MiwgLTIuNTE5ODQyMSwgIDYuMzQ5NjA0MiwgLTEuMDAwMDAwMCwKKyAgNi4zNDk2MDQyLCAgMC4wMDAwMDAwLCAgNi4zNDk2MDQyLCAgMS4wMDAwMDAwLAorICA2LjM0OTYwNDIsICAyLjUxOTg0MjEsICA2LjM0OTYwNDIsICA0LjMyNjc0ODcsCisgIDYuMzQ5NjA0MiwgIDYuMzQ5NjA0MiwKK307CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBjb2RlYm9va192ZWN0b3I2KVsxMjhdID0geworICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDAuMDAwMDAwMCwgIDQuMzI2NzQ4NywKKyAgMC4wMDAwMDAwLCAgNi4zNDk2MDQyLCAgMC4wMDAwMDAwLCAgOC41NDk4Nzk3LAorICAwLjAwMDAwMDAsIDEwLjkwMjcyMzYsICAwLjAwMDAwMDAsIDEzLjM5MDUxODMsCisgIDEuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMS4wMDAwMDAwLCAgNC4zMjY3NDg3LAorICAxLjAwMDAwMDAsICA2LjM0OTYwNDIsICAxLjAwMDAwMDAsICA4LjU0OTg3OTcsCisgIDEuMDAwMDAwMCwgMTAuOTAyNzIzNiwgIDEuMDAwMDAwMCwgMTMuMzkwNTE4MywKKyAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMS4wMDAwMDAwLAorICAyLjUxOTg0MjEsICAyLjUxOTg0MjEsICAyLjUxOTg0MjEsICA0LjMyNjc0ODcsCisgIDIuNTE5ODQyMSwgIDYuMzQ5NjA0MiwgIDIuNTE5ODQyMSwgIDguNTQ5ODc5NywKKyAgMi41MTk4NDIxLCAxMC45MDI3MjM2LCAgMi41MTk4NDIxLCAxMy4zOTA1MTgzLAorICA0LjMyNjc0ODcsICAwLjAwMDAwMDAsICA0LjMyNjc0ODcsICAxLjAwMDAwMDAsCisgIDQuMzI2NzQ4NywgIDIuNTE5ODQyMSwgIDQuMzI2NzQ4NywgIDQuMzI2NzQ4NywKKyAgNC4zMjY3NDg3LCAgNi4zNDk2MDQyLCAgNC4zMjY3NDg3LCAgOC41NDk4Nzk3LAorICA0LjMyNjc0ODcsIDEwLjkwMjcyMzYsICA0LjMyNjc0ODcsIDEzLjM5MDUxODMsCisgIDYuMzQ5NjA0MiwgIDAuMDAwMDAwMCwgIDYuMzQ5NjA0MiwgIDEuMDAwMDAwMCwKKyAgNi4zNDk2MDQyLCAgMi41MTk4NDIxLCAgNi4zNDk2MDQyLCAgNC4zMjY3NDg3LAorICA2LjM0OTYwNDIsICA2LjM0OTYwNDIsICA2LjM0OTYwNDIsICA4LjU0OTg3OTcsCisgIDYuMzQ5NjA0MiwgMTAuOTAyNzIzNiwgIDYuMzQ5NjA0MiwgMTMuMzkwNTE4MywKKyAgOC41NDk4Nzk3LCAgMC4wMDAwMDAwLCAgOC41NDk4Nzk3LCAgMS4wMDAwMDAwLAorICA4LjU0OTg3OTcsICAyLjUxOTg0MjEsICA4LjU0OTg3OTcsICA0LjMyNjc0ODcsCisgIDguNTQ5ODc5NywgIDYuMzQ5NjA0MiwgIDguNTQ5ODc5NywgIDguNTQ5ODc5NywKKyAgOC41NDk4Nzk3LCAxMC45MDI3MjM2LCAgOC41NDk4Nzk3LCAxMy4zOTA1MTgzLAorIDEwLjkwMjcyMzYsICAwLjAwMDAwMDAsIDEwLjkwMjcyMzYsICAxLjAwMDAwMDAsCisgMTAuOTAyNzIzNiwgIDIuNTE5ODQyMSwgMTAuOTAyNzIzNiwgIDQuMzI2NzQ4NywKKyAxMC45MDI3MjM2LCAgNi4zNDk2MDQyLCAxMC45MDI3MjM2LCAgOC41NDk4Nzk3LAorIDEwLjkwMjcyMzYsIDEwLjkwMjcyMzYsIDEwLjkwMjcyMzYsIDEzLjM5MDUxODMsCisgMTMuMzkwNTE4MywgIDAuMDAwMDAwMCwgMTMuMzkwNTE4MywgIDEuMDAwMDAwMCwKKyAxMy4zOTA1MTgzLCAgMi41MTk4NDIxLCAxMy4zOTA1MTgzLCAgNC4zMjY3NDg3LAorIDEzLjM5MDUxODMsICA2LjM0OTYwNDIsIDEzLjM5MDUxODMsICA4LjU0OTg3OTcsCisgMTMuMzkwNTE4MywgMTAuOTAyNzIzNiwgMTMuMzkwNTE4MywgMTMuMzkwNTE4MywKK307CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBjb2RlYm9va192ZWN0b3I4KVszMzhdID0geworICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDAuMDAwMDAwMCwgIDQuMzI2NzQ4NywKKyAgMC4wMDAwMDAwLCAgNi4zNDk2MDQyLCAgMC4wMDAwMDAwLCAgOC41NDk4Nzk3LAorICAwLjAwMDAwMDAsIDEwLjkwMjcyMzYsICAwLjAwMDAwMDAsIDEzLjM5MDUxODMsCisgIDAuMDAwMDAwMCwgMTYuMDAwMDAwMCwgIDAuMDAwMDAwMCwgMTguNzIwNzU0NCwKKyAgMC4wMDAwMDAwLCAyMS41NDQzNDY5LCAgMC4wMDAwMDAwLCAyNC40NjM3ODEwLAorICAwLjAwMDAwMDAsIDI3LjQ3MzE0MTgsICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgNC4zMjY3NDg3LCAgMS4wMDAwMDAwLCAgNi4zNDk2MDQyLAorICAxLjAwMDAwMDAsICA4LjU0OTg3OTcsICAxLjAwMDAwMDAsIDEwLjkwMjcyMzYsCisgIDEuMDAwMDAwMCwgMTMuMzkwNTE4MywgIDEuMDAwMDAwMCwgMTYuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAxOC43MjA3NTQ0LCAgMS4wMDAwMDAwLCAyMS41NDQzNDY5LAorICAxLjAwMDAwMDAsIDI0LjQ2Mzc4MTAsICAxLjAwMDAwMDAsIDI3LjQ3MzE0MTgsCisgIDIuNTE5ODQyMSwgIDAuMDAwMDAwMCwgIDIuNTE5ODQyMSwgIDEuMDAwMDAwMCwKKyAgMi41MTk4NDIxLCAgMi41MTk4NDIxLCAgMi41MTk4NDIxLCAgNC4zMjY3NDg3LAorICAyLjUxOTg0MjEsICA2LjM0OTYwNDIsICAyLjUxOTg0MjEsICA4LjU0OTg3OTcsCisgIDIuNTE5ODQyMSwgMTAuOTAyNzIzNiwgIDIuNTE5ODQyMSwgMTMuMzkwNTE4MywKKyAgMi41MTk4NDIxLCAxNi4wMDAwMDAwLCAgMi41MTk4NDIxLCAxOC43MjA3NTQ0LAorICAyLjUxOTg0MjEsIDIxLjU0NDM0NjksICAyLjUxOTg0MjEsIDI0LjQ2Mzc4MTAsCisgIDIuNTE5ODQyMSwgMjcuNDczMTQxOCwgIDQuMzI2NzQ4NywgIDAuMDAwMDAwMCwKKyAgNC4zMjY3NDg3LCAgMS4wMDAwMDAwLCAgNC4zMjY3NDg3LCAgMi41MTk4NDIxLAorICA0LjMyNjc0ODcsICA0LjMyNjc0ODcsICA0LjMyNjc0ODcsICA2LjM0OTYwNDIsCisgIDQuMzI2NzQ4NywgIDguNTQ5ODc5NywgIDQuMzI2NzQ4NywgMTAuOTAyNzIzNiwKKyAgNC4zMjY3NDg3LCAxMy4zOTA1MTgzLCAgNC4zMjY3NDg3LCAxNi4wMDAwMDAwLAorICA0LjMyNjc0ODcsIDE4LjcyMDc1NDQsICA0LjMyNjc0ODcsIDIxLjU0NDM0NjksCisgIDQuMzI2NzQ4NywgMjQuNDYzNzgxMCwgIDQuMzI2NzQ4NywgMjcuNDczMTQxOCwKKyAgNi4zNDk2MDQyLCAgMC4wMDAwMDAwLCAgNi4zNDk2MDQyLCAgMS4wMDAwMDAwLAorICA2LjM0OTYwNDIsICAyLjUxOTg0MjEsICA2LjM0OTYwNDIsICA0LjMyNjc0ODcsCisgIDYuMzQ5NjA0MiwgIDYuMzQ5NjA0MiwgIDYuMzQ5NjA0MiwgIDguNTQ5ODc5NywKKyAgNi4zNDk2MDQyLCAxMC45MDI3MjM2LCAgNi4zNDk2MDQyLCAxMy4zOTA1MTgzLAorICA2LjM0OTYwNDIsIDE2LjAwMDAwMDAsICA2LjM0OTYwNDIsIDE4LjcyMDc1NDQsCisgIDYuMzQ5NjA0MiwgMjEuNTQ0MzQ2OSwgIDYuMzQ5NjA0MiwgMjQuNDYzNzgxMCwKKyAgNi4zNDk2MDQyLCAyNy40NzMxNDE4LCAgOC41NDk4Nzk3LCAgMC4wMDAwMDAwLAorICA4LjU0OTg3OTcsICAxLjAwMDAwMDAsICA4LjU0OTg3OTcsICAyLjUxOTg0MjEsCisgIDguNTQ5ODc5NywgIDQuMzI2NzQ4NywgIDguNTQ5ODc5NywgIDYuMzQ5NjA0MiwKKyAgOC41NDk4Nzk3LCAgOC41NDk4Nzk3LCAgOC41NDk4Nzk3LCAxMC45MDI3MjM2LAorICA4LjU0OTg3OTcsIDEzLjM5MDUxODMsICA4LjU0OTg3OTcsIDE2LjAwMDAwMDAsCisgIDguNTQ5ODc5NywgMTguNzIwNzU0NCwgIDguNTQ5ODc5NywgMjEuNTQ0MzQ2OSwKKyAgOC41NDk4Nzk3LCAyNC40NjM3ODEwLCAgOC41NDk4Nzk3LCAyNy40NzMxNDE4LAorIDEwLjkwMjcyMzYsICAwLjAwMDAwMDAsIDEwLjkwMjcyMzYsICAxLjAwMDAwMDAsCisgMTAuOTAyNzIzNiwgIDIuNTE5ODQyMSwgMTAuOTAyNzIzNiwgIDQuMzI2NzQ4NywKKyAxMC45MDI3MjM2LCAgNi4zNDk2MDQyLCAxMC45MDI3MjM2LCAgOC41NDk4Nzk3LAorIDEwLjkwMjcyMzYsIDEwLjkwMjcyMzYsIDEwLjkwMjcyMzYsIDEzLjM5MDUxODMsCisgMTAuOTAyNzIzNiwgMTYuMDAwMDAwMCwgMTAuOTAyNzIzNiwgMTguNzIwNzU0NCwKKyAxMC45MDI3MjM2LCAyMS41NDQzNDY5LCAxMC45MDI3MjM2LCAyNC40NjM3ODEwLAorIDEwLjkwMjcyMzYsIDI3LjQ3MzE0MTgsIDEzLjM5MDUxODMsICAwLjAwMDAwMDAsCisgMTMuMzkwNTE4MywgIDEuMDAwMDAwMCwgMTMuMzkwNTE4MywgIDIuNTE5ODQyMSwKKyAxMy4zOTA1MTgzLCAgNC4zMjY3NDg3LCAxMy4zOTA1MTgzLCAgNi4zNDk2MDQyLAorIDEzLjM5MDUxODMsICA4LjU0OTg3OTcsIDEzLjM5MDUxODMsIDEwLjkwMjcyMzYsCisgMTMuMzkwNTE4MywgMTMuMzkwNTE4MywgMTMuMzkwNTE4MywgMTYuMDAwMDAwMCwKKyAxMy4zOTA1MTgzLCAxOC43MjA3NTQ0LCAxMy4zOTA1MTgzLCAyMS41NDQzNDY5LAorIDEzLjM5MDUxODMsIDI0LjQ2Mzc4MTAsIDEzLjM5MDUxODMsIDI3LjQ3MzE0MTgsCisgMTYuMDAwMDAwMCwgIDAuMDAwMDAwMCwgMTYuMDAwMDAwMCwgIDEuMDAwMDAwMCwKKyAxNi4wMDAwMDAwLCAgMi41MTk4NDIxLCAxNi4wMDAwMDAwLCAgNC4zMjY3NDg3LAorIDE2LjAwMDAwMDAsICA2LjM0OTYwNDIsIDE2LjAwMDAwMDAsICA4LjU0OTg3OTcsCisgMTYuMDAwMDAwMCwgMTAuOTAyNzIzNiwgMTYuMDAwMDAwMCwgMTMuMzkwNTE4MywKKyAxNi4wMDAwMDAwLCAxNi4wMDAwMDAwLCAxNi4wMDAwMDAwLCAxOC43MjA3NTQ0LAorIDE2LjAwMDAwMDAsIDIxLjU0NDM0NjksIDE2LjAwMDAwMDAsIDI0LjQ2Mzc4MTAsCisgMTYuMDAwMDAwMCwgMjcuNDczMTQxOCwgMTguNzIwNzU0NCwgIDAuMDAwMDAwMCwKKyAxOC43MjA3NTQ0LCAgMS4wMDAwMDAwLCAxOC43MjA3NTQ0LCAgMi41MTk4NDIxLAorIDE4LjcyMDc1NDQsICA0LjMyNjc0ODcsIDE4LjcyMDc1NDQsICA2LjM0OTYwNDIsCisgMTguNzIwNzU0NCwgIDguNTQ5ODc5NywgMTguNzIwNzU0NCwgMTAuOTAyNzIzNiwKKyAxOC43MjA3NTQ0LCAxMy4zOTA1MTgzLCAxOC43MjA3NTQ0LCAxNi4wMDAwMDAwLAorIDE4LjcyMDc1NDQsIDE4LjcyMDc1NDQsIDE4LjcyMDc1NDQsIDIxLjU0NDM0NjksCisgMTguNzIwNzU0NCwgMjQuNDYzNzgxMCwgMTguNzIwNzU0NCwgMjcuNDczMTQxOCwKKyAyMS41NDQzNDY5LCAgMC4wMDAwMDAwLCAyMS41NDQzNDY5LCAgMS4wMDAwMDAwLAorIDIxLjU0NDM0NjksICAyLjUxOTg0MjEsIDIxLjU0NDM0NjksICA0LjMyNjc0ODcsCisgMjEuNTQ0MzQ2OSwgIDYuMzQ5NjA0MiwgMjEuNTQ0MzQ2OSwgIDguNTQ5ODc5NywKKyAyMS41NDQzNDY5LCAxMC45MDI3MjM2LCAyMS41NDQzNDY5LCAxMy4zOTA1MTgzLAorIDIxLjU0NDM0NjksIDE2LjAwMDAwMDAsIDIxLjU0NDM0NjksIDE4LjcyMDc1NDQsCisgMjEuNTQ0MzQ2OSwgMjEuNTQ0MzQ2OSwgMjEuNTQ0MzQ2OSwgMjQuNDYzNzgxMCwKKyAyMS41NDQzNDY5LCAyNy40NzMxNDE4LCAyNC40NjM3ODEwLCAgMC4wMDAwMDAwLAorIDI0LjQ2Mzc4MTAsICAxLjAwMDAwMDAsIDI0LjQ2Mzc4MTAsICAyLjUxOTg0MjEsCisgMjQuNDYzNzgxMCwgIDQuMzI2NzQ4NywgMjQuNDYzNzgxMCwgIDYuMzQ5NjA0MiwKKyAyNC40NjM3ODEwLCAgOC41NDk4Nzk3LCAyNC40NjM3ODEwLCAxMC45MDI3MjM2LAorIDI0LjQ2Mzc4MTAsIDEzLjM5MDUxODMsIDI0LjQ2Mzc4MTAsIDE2LjAwMDAwMDAsCisgMjQuNDYzNzgxMCwgMTguNzIwNzU0NCwgMjQuNDYzNzgxMCwgMjEuNTQ0MzQ2OSwKKyAyNC40NjM3ODEwLCAyNC40NjM3ODEwLCAyNC40NjM3ODEwLCAyNy40NzMxNDE4LAorIDI3LjQ3MzE0MTgsICAwLjAwMDAwMDAsIDI3LjQ3MzE0MTgsICAxLjAwMDAwMDAsCisgMjcuNDczMTQxOCwgIDIuNTE5ODQyMSwgMjcuNDczMTQxOCwgIDQuMzI2NzQ4NywKKyAyNy40NzMxNDE4LCAgNi4zNDk2MDQyLCAyNy40NzMxNDE4LCAgOC41NDk4Nzk3LAorIDI3LjQ3MzE0MTgsIDEwLjkwMjcyMzYsIDI3LjQ3MzE0MTgsIDEzLjM5MDUxODMsCisgMjcuNDczMTQxOCwgMTYuMDAwMDAwMCwgMjcuNDczMTQxOCwgMTguNzIwNzU0NCwKKyAyNy40NzMxNDE4LCAyMS41NDQzNDY5LCAyNy40NzMxNDE4LCAyNC40NjM3ODEwLAorIDI3LjQ3MzE0MTgsIDI3LjQ3MzE0MTgsCit9OworCitzdGF0aWMgY29uc3QgREVDTEFSRV9BTElHTkVEKDE2LCBmbG9hdCwgY29kZWJvb2tfdmVjdG9yMTApWzU3OF0gPSB7CisgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDAuMDAwMDAwMCwgIDEuMDAwMDAwMCwKKyAgMC4wMDAwMDAwLCAgMi41MTk4NDIxLCAgMC4wMDAwMDAwLCAgNC4zMjY3NDg3LAorICAwLjAwMDAwMDAsICA2LjM0OTYwNDIsICAwLjAwMDAwMDAsICA4LjU0OTg3OTcsCisgIDAuMDAwMDAwMCwgMTAuOTAyNzIzNiwgIDAuMDAwMDAwMCwgMTMuMzkwNTE4MywKKyAgMC4wMDAwMDAwLCAxNi4wMDAwMDAwLCAgMC4wMDAwMDAwLCAxOC43MjA3NTQ0LAorICAwLjAwMDAwMDAsIDIxLjU0NDM0NjksICAwLjAwMDAwMDAsIDI0LjQ2Mzc4MTAsCisgIDAuMDAwMDAwMCwgMjcuNDczMTQxOCwgIDAuMDAwMDAwMCwgMzAuNTY3MzUwOSwKKyAgMC4wMDAwMDAwLCAzMy43NDE5OTE3LCAgMC4wMDAwMDAwLCAzNi45OTMxODExLAorICAwLjAwMDAwMDAsICAgICAgNjQuMGYsICAxLjAwMDAwMDAsICAwLjAwMDAwMDAsCisgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDEuMDAwMDAwMCwgIDIuNTE5ODQyMSwKKyAgMS4wMDAwMDAwLCAgNC4zMjY3NDg3LCAgMS4wMDAwMDAwLCAgNi4zNDk2MDQyLAorICAxLjAwMDAwMDAsICA4LjU0OTg3OTcsICAxLjAwMDAwMDAsIDEwLjkwMjcyMzYsCisgIDEuMDAwMDAwMCwgMTMuMzkwNTE4MywgIDEuMDAwMDAwMCwgMTYuMDAwMDAwMCwKKyAgMS4wMDAwMDAwLCAxOC43MjA3NTQ0LCAgMS4wMDAwMDAwLCAyMS41NDQzNDY5LAorICAxLjAwMDAwMDAsIDI0LjQ2Mzc4MTAsICAxLjAwMDAwMDAsIDI3LjQ3MzE0MTgsCisgIDEuMDAwMDAwMCwgMzAuNTY3MzUwOSwgIDEuMDAwMDAwMCwgMzMuNzQxOTkxNywKKyAgMS4wMDAwMDAwLCAzNi45OTMxODExLCAgMS4wMDAwMDAwLCAgICAgIDY0LjBmLAorICAyLjUxOTg0MjEsICAwLjAwMDAwMDAsICAyLjUxOTg0MjEsICAxLjAwMDAwMDAsCisgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwgIDIuNTE5ODQyMSwgIDQuMzI2NzQ4NywKKyAgMi41MTk4NDIxLCAgNi4zNDk2MDQyLCAgMi41MTk4NDIxLCAgOC41NDk4Nzk3LAorICAyLjUxOTg0MjEsIDEwLjkwMjcyMzYsICAyLjUxOTg0MjEsIDEzLjM5MDUxODMsCisgIDIuNTE5ODQyMSwgMTYuMDAwMDAwMCwgIDIuNTE5ODQyMSwgMTguNzIwNzU0NCwKKyAgMi41MTk4NDIxLCAyMS41NDQzNDY5LCAgMi41MTk4NDIxLCAyNC40NjM3ODEwLAorICAyLjUxOTg0MjEsIDI3LjQ3MzE0MTgsICAyLjUxOTg0MjEsIDMwLjU2NzM1MDksCisgIDIuNTE5ODQyMSwgMzMuNzQxOTkxNywgIDIuNTE5ODQyMSwgMzYuOTkzMTgxMSwKKyAgMi41MTk4NDIxLCAgICAgIDY0LjBmLCAgNC4zMjY3NDg3LCAgMC4wMDAwMDAwLAorICA0LjMyNjc0ODcsICAxLjAwMDAwMDAsICA0LjMyNjc0ODcsICAyLjUxOTg0MjEsCisgIDQuMzI2NzQ4NywgIDQuMzI2NzQ4NywgIDQuMzI2NzQ4NywgIDYuMzQ5NjA0MiwKKyAgNC4zMjY3NDg3LCAgOC41NDk4Nzk3LCAgNC4zMjY3NDg3LCAxMC45MDI3MjM2LAorICA0LjMyNjc0ODcsIDEzLjM5MDUxODMsICA0LjMyNjc0ODcsIDE2LjAwMDAwMDAsCisgIDQuMzI2NzQ4NywgMTguNzIwNzU0NCwgIDQuMzI2NzQ4NywgMjEuNTQ0MzQ2OSwKKyAgNC4zMjY3NDg3LCAyNC40NjM3ODEwLCAgNC4zMjY3NDg3LCAyNy40NzMxNDE4LAorICA0LjMyNjc0ODcsIDMwLjU2NzM1MDksICA0LjMyNjc0ODcsIDMzLjc0MTk5MTcsCisgIDQuMzI2NzQ4NywgMzYuOTkzMTgxMSwgIDQuMzI2NzQ4NywgICAgICA2NC4wZiwKKyAgNi4zNDk2MDQyLCAgMC4wMDAwMDAwLCAgNi4zNDk2MDQyLCAgMS4wMDAwMDAwLAorICA2LjM0OTYwNDIsICAyLjUxOTg0MjEsICA2LjM0OTYwNDIsICA0LjMyNjc0ODcsCisgIDYuMzQ5NjA0MiwgIDYuMzQ5NjA0MiwgIDYuMzQ5NjA0MiwgIDguNTQ5ODc5NywKKyAgNi4zNDk2MDQyLCAxMC45MDI3MjM2LCAgNi4zNDk2MDQyLCAxMy4zOTA1MTgzLAorICA2LjM0OTYwNDIsIDE2LjAwMDAwMDAsICA2LjM0OTYwNDIsIDE4LjcyMDc1NDQsCisgIDYuMzQ5NjA0MiwgMjEuNTQ0MzQ2OSwgIDYuMzQ5NjA0MiwgMjQuNDYzNzgxMCwKKyAgNi4zNDk2MDQyLCAyNy40NzMxNDE4LCAgNi4zNDk2MDQyLCAzMC41NjczNTA5LAorICA2LjM0OTYwNDIsIDMzLjc0MTk5MTcsICA2LjM0OTYwNDIsIDM2Ljk5MzE4MTEsCisgIDYuMzQ5NjA0MiwgICAgICA2NC4wZiwgIDguNTQ5ODc5NywgIDAuMDAwMDAwMCwKKyAgOC41NDk4Nzk3LCAgMS4wMDAwMDAwLCAgOC41NDk4Nzk3LCAgMi41MTk4NDIxLAorICA4LjU0OTg3OTcsICA0LjMyNjc0ODcsICA4LjU0OTg3OTcsICA2LjM0OTYwNDIsCisgIDguNTQ5ODc5NywgIDguNTQ5ODc5NywgIDguNTQ5ODc5NywgMTAuOTAyNzIzNiwKKyAgOC41NDk4Nzk3LCAxMy4zOTA1MTgzLCAgOC41NDk4Nzk3LCAxNi4wMDAwMDAwLAorICA4LjU0OTg3OTcsIDE4LjcyMDc1NDQsICA4LjU0OTg3OTcsIDIxLjU0NDM0NjksCisgIDguNTQ5ODc5NywgMjQuNDYzNzgxMCwgIDguNTQ5ODc5NywgMjcuNDczMTQxOCwKKyAgOC41NDk4Nzk3LCAzMC41NjczNTA5LCAgOC41NDk4Nzk3LCAzMy43NDE5OTE3LAorICA4LjU0OTg3OTcsIDM2Ljk5MzE4MTEsICA4LjU0OTg3OTcsICAgICAgNjQuMGYsCisgMTAuOTAyNzIzNiwgIDAuMDAwMDAwMCwgMTAuOTAyNzIzNiwgIDEuMDAwMDAwMCwKKyAxMC45MDI3MjM2LCAgMi41MTk4NDIxLCAxMC45MDI3MjM2LCAgNC4zMjY3NDg3LAorIDEwLjkwMjcyMzYsICA2LjM0OTYwNDIsIDEwLjkwMjcyMzYsICA4LjU0OTg3OTcsCisgMTAuOTAyNzIzNiwgMTAuOTAyNzIzNiwgMTAuOTAyNzIzNiwgMTMuMzkwNTE4MywKKyAxMC45MDI3MjM2LCAxNi4wMDAwMDAwLCAxMC45MDI3MjM2LCAxOC43MjA3NTQ0LAorIDEwLjkwMjcyMzYsIDIxLjU0NDM0NjksIDEwLjkwMjcyMzYsIDI0LjQ2Mzc4MTAsCisgMTAuOTAyNzIzNiwgMjcuNDczMTQxOCwgMTAuOTAyNzIzNiwgMzAuNTY3MzUwOSwKKyAxMC45MDI3MjM2LCAzMy43NDE5OTE3LCAxMC45MDI3MjM2LCAzNi45OTMxODExLAorIDEwLjkwMjcyMzYsICAgICAgNjQuMGYsIDEzLjM5MDUxODMsICAwLjAwMDAwMDAsCisgMTMuMzkwNTE4MywgIDEuMDAwMDAwMCwgMTMuMzkwNTE4MywgIDIuNTE5ODQyMSwKKyAxMy4zOTA1MTgzLCAgNC4zMjY3NDg3LCAxMy4zOTA1MTgzLCAgNi4zNDk2MDQyLAorIDEzLjM5MDUxODMsICA4LjU0OTg3OTcsIDEzLjM5MDUxODMsIDEwLjkwMjcyMzYsCisgMTMuMzkwNTE4MywgMTMuMzkwNTE4MywgMTMuMzkwNTE4MywgMTYuMDAwMDAwMCwKKyAxMy4zOTA1MTgzLCAxOC43MjA3NTQ0LCAxMy4zOTA1MTgzLCAyMS41NDQzNDY5LAorIDEzLjM5MDUxODMsIDI0LjQ2Mzc4MTAsIDEzLjM5MDUxODMsIDI3LjQ3MzE0MTgsCisgMTMuMzkwNTE4MywgMzAuNTY3MzUwOSwgMTMuMzkwNTE4MywgMzMuNzQxOTkxNywKKyAxMy4zOTA1MTgzLCAzNi45OTMxODExLCAxMy4zOTA1MTgzLCAgICAgIDY0LjBmLAorIDE2LjAwMDAwMDAsICAwLjAwMDAwMDAsIDE2LjAwMDAwMDAsICAxLjAwMDAwMDAsCisgMTYuMDAwMDAwMCwgIDIuNTE5ODQyMSwgMTYuMDAwMDAwMCwgIDQuMzI2NzQ4NywKKyAxNi4wMDAwMDAwLCAgNi4zNDk2MDQyLCAxNi4wMDAwMDAwLCAgOC41NDk4Nzk3LAorIDE2LjAwMDAwMDAsIDEwLjkwMjcyMzYsIDE2LjAwMDAwMDAsIDEzLjM5MDUxODMsCisgMTYuMDAwMDAwMCwgMTYuMDAwMDAwMCwgMTYuMDAwMDAwMCwgMTguNzIwNzU0NCwKKyAxNi4wMDAwMDAwLCAyMS41NDQzNDY5LCAxNi4wMDAwMDAwLCAyNC40NjM3ODEwLAorIDE2LjAwMDAwMDAsIDI3LjQ3MzE0MTgsIDE2LjAwMDAwMDAsIDMwLjU2NzM1MDksCisgMTYuMDAwMDAwMCwgMzMuNzQxOTkxNywgMTYuMDAwMDAwMCwgMzYuOTkzMTgxMSwKKyAxNi4wMDAwMDAwLCAgICAgIDY0LjBmLCAxOC43MjA3NTQ0LCAgMC4wMDAwMDAwLAorIDE4LjcyMDc1NDQsICAxLjAwMDAwMDAsIDE4LjcyMDc1NDQsICAyLjUxOTg0MjEsCisgMTguNzIwNzU0NCwgIDQuMzI2NzQ4NywgMTguNzIwNzU0NCwgIDYuMzQ5NjA0MiwKKyAxOC43MjA3NTQ0LCAgOC41NDk4Nzk3LCAxOC43MjA3NTQ0LCAxMC45MDI3MjM2LAorIDE4LjcyMDc1NDQsIDEzLjM5MDUxODMsIDE4LjcyMDc1NDQsIDE2LjAwMDAwMDAsCisgMTguNzIwNzU0NCwgMTguNzIwNzU0NCwgMTguNzIwNzU0NCwgMjEuNTQ0MzQ2OSwKKyAxOC43MjA3NTQ0LCAyNC40NjM3ODEwLCAxOC43MjA3NTQ0LCAyNy40NzMxNDE4LAorIDE4LjcyMDc1NDQsIDMwLjU2NzM1MDksIDE4LjcyMDc1NDQsIDMzLjc0MTk5MTcsCisgMTguNzIwNzU0NCwgMzYuOTkzMTgxMSwgMTguNzIwNzU0NCwgICAgICA2NC4wZiwKKyAyMS41NDQzNDY5LCAgMC4wMDAwMDAwLCAyMS41NDQzNDY5LCAgMS4wMDAwMDAwLAorIDIxLjU0NDM0NjksICAyLjUxOTg0MjEsIDIxLjU0NDM0NjksICA0LjMyNjc0ODcsCisgMjEuNTQ0MzQ2OSwgIDYuMzQ5NjA0MiwgMjEuNTQ0MzQ2OSwgIDguNTQ5ODc5NywKKyAyMS41NDQzNDY5LCAxMC45MDI3MjM2LCAyMS41NDQzNDY5LCAxMy4zOTA1MTgzLAorIDIxLjU0NDM0NjksIDE2LjAwMDAwMDAsIDIxLjU0NDM0NjksIDE4LjcyMDc1NDQsCisgMjEuNTQ0MzQ2OSwgMjEuNTQ0MzQ2OSwgMjEuNTQ0MzQ2OSwgMjQuNDYzNzgxMCwKKyAyMS41NDQzNDY5LCAyNy40NzMxNDE4LCAyMS41NDQzNDY5LCAzMC41NjczNTA5LAorIDIxLjU0NDM0NjksIDMzLjc0MTk5MTcsIDIxLjU0NDM0NjksIDM2Ljk5MzE4MTEsCisgMjEuNTQ0MzQ2OSwgICAgICA2NC4wZiwgMjQuNDYzNzgxMCwgIDAuMDAwMDAwMCwKKyAyNC40NjM3ODEwLCAgMS4wMDAwMDAwLCAyNC40NjM3ODEwLCAgMi41MTk4NDIxLAorIDI0LjQ2Mzc4MTAsICA0LjMyNjc0ODcsIDI0LjQ2Mzc4MTAsICA2LjM0OTYwNDIsCisgMjQuNDYzNzgxMCwgIDguNTQ5ODc5NywgMjQuNDYzNzgxMCwgMTAuOTAyNzIzNiwKKyAyNC40NjM3ODEwLCAxMy4zOTA1MTgzLCAyNC40NjM3ODEwLCAxNi4wMDAwMDAwLAorIDI0LjQ2Mzc4MTAsIDE4LjcyMDc1NDQsIDI0LjQ2Mzc4MTAsIDIxLjU0NDM0NjksCisgMjQuNDYzNzgxMCwgMjQuNDYzNzgxMCwgMjQuNDYzNzgxMCwgMjcuNDczMTQxOCwKKyAyNC40NjM3ODEwLCAzMC41NjczNTA5LCAyNC40NjM3ODEwLCAzMy43NDE5OTE3LAorIDI0LjQ2Mzc4MTAsIDM2Ljk5MzE4MTEsIDI0LjQ2Mzc4MTAsICAgICAgNjQuMGYsCisgMjcuNDczMTQxOCwgIDAuMDAwMDAwMCwgMjcuNDczMTQxOCwgIDEuMDAwMDAwMCwKKyAyNy40NzMxNDE4LCAgMi41MTk4NDIxLCAyNy40NzMxNDE4LCAgNC4zMjY3NDg3LAorIDI3LjQ3MzE0MTgsICA2LjM0OTYwNDIsIDI3LjQ3MzE0MTgsICA4LjU0OTg3OTcsCisgMjcuNDczMTQxOCwgMTAuOTAyNzIzNiwgMjcuNDczMTQxOCwgMTMuMzkwNTE4MywKKyAyNy40NzMxNDE4LCAxNi4wMDAwMDAwLCAyNy40NzMxNDE4LCAxOC43MjA3NTQ0LAorIDI3LjQ3MzE0MTgsIDIxLjU0NDM0NjksIDI3LjQ3MzE0MTgsIDI0LjQ2Mzc4MTAsCisgMjcuNDczMTQxOCwgMjcuNDczMTQxOCwgMjcuNDczMTQxOCwgMzAuNTY3MzUwOSwKKyAyNy40NzMxNDE4LCAzMy43NDE5OTE3LCAyNy40NzMxNDE4LCAzNi45OTMxODExLAorIDI3LjQ3MzE0MTgsICAgICAgNjQuMGYsIDMwLjU2NzM1MDksICAwLjAwMDAwMDAsCisgMzAuNTY3MzUwOSwgIDEuMDAwMDAwMCwgMzAuNTY3MzUwOSwgIDIuNTE5ODQyMSwKKyAzMC41NjczNTA5LCAgNC4zMjY3NDg3LCAzMC41NjczNTA5LCAgNi4zNDk2MDQyLAorIDMwLjU2NzM1MDksICA4LjU0OTg3OTcsIDMwLjU2NzM1MDksIDEwLjkwMjcyMzYsCisgMzAuNTY3MzUwOSwgMTMuMzkwNTE4MywgMzAuNTY3MzUwOSwgMTYuMDAwMDAwMCwKKyAzMC41NjczNTA5LCAxOC43MjA3NTQ0LCAzMC41NjczNTA5LCAyMS41NDQzNDY5LAorIDMwLjU2NzM1MDksIDI0LjQ2Mzc4MTAsIDMwLjU2NzM1MDksIDI3LjQ3MzE0MTgsCisgMzAuNTY3MzUwOSwgMzAuNTY3MzUwOSwgMzAuNTY3MzUwOSwgMzMuNzQxOTkxNywKKyAzMC41NjczNTA5LCAzNi45OTMxODExLCAzMC41NjczNTA5LCAgICAgIDY0LjBmLAorIDMzLjc0MTk5MTcsICAwLjAwMDAwMDAsIDMzLjc0MTk5MTcsICAxLjAwMDAwMDAsCisgMzMuNzQxOTkxNywgIDIuNTE5ODQyMSwgMzMuNzQxOTkxNywgIDQuMzI2NzQ4NywKKyAzMy43NDE5OTE3LCAgNi4zNDk2MDQyLCAzMy43NDE5OTE3LCAgOC41NDk4Nzk3LAorIDMzLjc0MTk5MTcsIDEwLjkwMjcyMzYsIDMzLjc0MTk5MTcsIDEzLjM5MDUxODMsCisgMzMuNzQxOTkxNywgMTYuMDAwMDAwMCwgMzMuNzQxOTkxNywgMTguNzIwNzU0NCwKKyAzMy43NDE5OTE3LCAyMS41NDQzNDY5LCAzMy43NDE5OTE3LCAyNC40NjM3ODEwLAorIDMzLjc0MTk5MTcsIDI3LjQ3MzE0MTgsIDMzLjc0MTk5MTcsIDMwLjU2NzM1MDksCisgMzMuNzQxOTkxNywgMzMuNzQxOTkxNywgMzMuNzQxOTkxNywgMzYuOTkzMTgxMSwKKyAzMy43NDE5OTE3LCAgICAgIDY0LjBmLCAzNi45OTMxODExLCAgMC4wMDAwMDAwLAorIDM2Ljk5MzE4MTEsICAxLjAwMDAwMDAsIDM2Ljk5MzE4MTEsICAyLjUxOTg0MjEsCisgMzYuOTkzMTgxMSwgIDQuMzI2NzQ4NywgMzYuOTkzMTgxMSwgIDYuMzQ5NjA0MiwKKyAzNi45OTMxODExLCAgOC41NDk4Nzk3LCAzNi45OTMxODExLCAxMC45MDI3MjM2LAorIDM2Ljk5MzE4MTEsIDEzLjM5MDUxODMsIDM2Ljk5MzE4MTEsIDE2LjAwMDAwMDAsCisgMzYuOTkzMTgxMSwgMTguNzIwNzU0NCwgMzYuOTkzMTgxMSwgMjEuNTQ0MzQ2OSwKKyAzNi45OTMxODExLCAyNC40NjM3ODEwLCAzNi45OTMxODExLCAyNy40NzMxNDE4LAorIDM2Ljk5MzE4MTEsIDMwLjU2NzM1MDksIDM2Ljk5MzE4MTEsIDMzLjc0MTk5MTcsCisgMzYuOTkzMTgxMSwgMzYuOTkzMTgxMSwgMzYuOTkzMTgxMSwgICAgICA2NC4wZiwKKyAgICAgIDY0LjBmLCAgMC4wMDAwMDAwLCAgICAgIDY0LjBmLCAgMS4wMDAwMDAwLAorICAgICAgNjQuMGYsICAyLjUxOTg0MjEsICAgICAgNjQuMGYsICA0LjMyNjc0ODcsCisgICAgICA2NC4wZiwgIDYuMzQ5NjA0MiwgICAgICA2NC4wZiwgIDguNTQ5ODc5NywKKyAgICAgIDY0LjBmLCAxMC45MDI3MjM2LCAgICAgIDY0LjBmLCAxMy4zOTA1MTgzLAorICAgICAgNjQuMGYsIDE2LjAwMDAwMDAsICAgICAgNjQuMGYsIDE4LjcyMDc1NDQsCisgICAgICA2NC4wZiwgMjEuNTQ0MzQ2OSwgICAgICA2NC4wZiwgMjQuNDYzNzgxMCwKKyAgICAgIDY0LjBmLCAyNy40NzMxNDE4LCAgICAgIDY0LjBmLCAzMC41NjczNTA5LAorICAgICAgNjQuMGYsIDMzLjc0MTk5MTcsICAgICAgNjQuMGYsIDM2Ljk5MzE4MTEsCisgICAgICA2NC4wZiwgICAgICA2NC4wZiwKK307CisKK2NvbnN0IGZsb2F0ICogY29uc3QgZmZfYWFjX2NvZGVib29rX3ZlY3RvcnNbXSA9IHsKKyAgICBjb2RlYm9va192ZWN0b3IwLCBjb2RlYm9va192ZWN0b3IwLCBjb2RlYm9va192ZWN0b3IyLAorICAgIGNvZGVib29rX3ZlY3RvcjIsIGNvZGVib29rX3ZlY3RvcjQsIGNvZGVib29rX3ZlY3RvcjQsCisgICAgY29kZWJvb2tfdmVjdG9yNiwgY29kZWJvb2tfdmVjdG9yNiwgY29kZWJvb2tfdmVjdG9yOCwKKyAgICBjb2RlYm9va192ZWN0b3I4LCBjb2RlYm9va192ZWN0b3IxMCwKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBjb2RlYm9va192ZWN0b3IwX3ZhbHNbXSA9IHsKKyAgIC0xLjAwMDAwMDAsICAwLjAwMDAwMDAsICAxLjAwMDAwMDAKK307CisKKy8qCisgKiBiaXRzICAwOjEsIDI6MywgNDo1LCA2OjcgIGluZGV4IGludG8gX3ZhbHMgYXJyYXkKKyAqICAgICAgIDg6MTEgICAgICAgICAgICAgICAgbnVtYmVyIG9mIG5vbi16ZXJvIHZhbHVlcworICogICAgICAxMjoxNSAgICAgICAgICAgICAgICBiaXQgbWFzayBvZiBub24temVybyB2YWx1ZXMKKyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNvZGVib29rX3ZlY3RvcjAyX2lkeFtdID0geworICAgIDB4MDAwMCwgMHg4MTQwLCAweDgxODAsIDB4NDExMCwgMHhjMjUwLCAweGMyOTAsIDB4NDEyMCwgMHhjMjYwLCAweGMyYTAsCisgICAgMHgyMTA0LCAweGEyNDQsIDB4YTI4NCwgMHg2MjE0LCAweGUzNTQsIDB4ZTM5NCwgMHg2MjI0LCAweGUzNjQsIDB4ZTNhNCwKKyAgICAweDIxMDgsIDB4YTI0OCwgMHhhMjg4LCAweDYyMTgsIDB4ZTM1OCwgMHhlMzk4LCAweDYyMjgsIDB4ZTM2OCwgMHhlM2E4LAorICAgIDB4MTEwMSwgMHg5MjQxLCAweDkyODEsIDB4NTIxMSwgMHhkMzUxLCAweGQzOTEsIDB4NTIyMSwgMHhkMzYxLCAweGQzYTEsCisgICAgMHgzMjA1LCAweGIzNDUsIDB4YjM4NSwgMHg3MzE1LCAweGY0NTUsIDB4ZjQ5NSwgMHg3MzI1LCAweGY0NjUsIDB4ZjRhNSwKKyAgICAweDMyMDksIDB4YjM0OSwgMHhiMzg5LCAweDczMTksIDB4ZjQ1OSwgMHhmNDk5LCAweDczMjksIDB4ZjQ2OSwgMHhmNGE5LAorICAgIDB4MTEwMiwgMHg5MjQyLCAweDkyODIsIDB4NTIxMiwgMHhkMzUyLCAweGQzOTIsIDB4NTIyMiwgMHhkMzYyLCAweGQzYTIsCisgICAgMHgzMjA2LCAweGIzNDYsIDB4YjM4NiwgMHg3MzE2LCAweGY0NTYsIDB4ZjQ5NiwgMHg3MzI2LCAweGY0NjYsIDB4ZjRhNiwKKyAgICAweDMyMGEsIDB4YjM0YSwgMHhiMzhhLCAweDczMWEsIDB4ZjQ1YSwgMHhmNDlhLCAweDczMmEsIDB4ZjQ2YSwgMHhmNGFhLAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGNvZGVib29rX3ZlY3RvcjRfdmFsc1tdID0geworICAgLTYuMzQ5NjA0MiwgLTQuMzI2NzQ4NywKKyAgIC0yLjUxOTg0MjEsIC0xLjAwMDAwMDAsCisgICAgMC4wMDAwMDAwLCAgMS4wMDAwMDAwLAorICAgIDIuNTE5ODQyMSwgIDQuMzI2NzQ4NywKKyAgICA2LjM0OTYwNDIsCit9OworCisvKgorICogYml0cyAgMDozLCA0OjcgIGluZGV4IGludG8gX3ZhbHMgYXJyYXkKKyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNvZGVib29rX3ZlY3RvcjRfaWR4W10gPSB7CisgICAgMHgwMDAwLCAweDAwMTAsIDB4MDAyMCwgMHgwMDMwLCAweDAwNDAsIDB4MDA1MCwgMHgwMDYwLCAweDAwNzAsIDB4MDA4MCwKKyAgICAweDAwMDEsIDB4MDAxMSwgMHgwMDIxLCAweDAwMzEsIDB4MDA0MSwgMHgwMDUxLCAweDAwNjEsIDB4MDA3MSwgMHgwMDgxLAorICAgIDB4MDAwMiwgMHgwMDEyLCAweDAwMjIsIDB4MDAzMiwgMHgwMDQyLCAweDAwNTIsIDB4MDA2MiwgMHgwMDcyLCAweDAwODIsCisgICAgMHgwMDAzLCAweDAwMTMsIDB4MDAyMywgMHgwMDMzLCAweDAwNDMsIDB4MDA1MywgMHgwMDYzLCAweDAwNzMsIDB4MDA4MywKKyAgICAweDAwMDQsIDB4MDAxNCwgMHgwMDI0LCAweDAwMzQsIDB4MDA0NCwgMHgwMDU0LCAweDAwNjQsIDB4MDA3NCwgMHgwMDg0LAorICAgIDB4MDAwNSwgMHgwMDE1LCAweDAwMjUsIDB4MDAzNSwgMHgwMDQ1LCAweDAwNTUsIDB4MDA2NSwgMHgwMDc1LCAweDAwODUsCisgICAgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgwMDY2LCAweDAwNzYsIDB4MDA4NiwKKyAgICAweDAwMDcsIDB4MDAxNywgMHgwMDI3LCAweDAwMzcsIDB4MDA0NywgMHgwMDU3LCAweDAwNjcsIDB4MDA3NywgMHgwMDg3LAorICAgIDB4MDAwOCwgMHgwMDE4LCAweDAwMjgsIDB4MDAzOCwgMHgwMDQ4LCAweDAwNTgsIDB4MDA2OCwgMHgwMDc4LCAweDAwODgsCit9OworCisvKgorICogYml0cyAgMDozLCA0OjcgIGluZGV4IGludG8gX3ZhbHMgYXJyYXkKKyAqICAgICAgIDg6MTEgICAgICBudW1iZXIgb2Ygbm9uLXplcm8gdmFsdWVzCisgKiAgICAgIDEyOjE1ICAgICAgMTogb25seSBzZWNvbmQgdmFsdWUgbm9uLXplcm8KKyAqICAgICAgICAgICAgICAgICAwOiBvdGhlciBjYXNlcworICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgY29kZWJvb2tfdmVjdG9yNl9pZHhbXSA9IHsKKyAgICAweDAwMDAsIDB4MDExMCwgMHgwMTIwLCAweDAxMzAsIDB4MDE0MCwgMHgwMTUwLCAweDAxNjAsIDB4MDE3MCwKKyAgICAweDExMDEsIDB4MDIxMSwgMHgwMjIxLCAweDAyMzEsIDB4MDI0MSwgMHgwMjUxLCAweDAyNjEsIDB4MDI3MSwKKyAgICAweDExMDIsIDB4MDIxMiwgMHgwMjIyLCAweDAyMzIsIDB4MDI0MiwgMHgwMjUyLCAweDAyNjIsIDB4MDI3MiwKKyAgICAweDExMDMsIDB4MDIxMywgMHgwMjIzLCAweDAyMzMsIDB4MDI0MywgMHgwMjUzLCAweDAyNjMsIDB4MDI3MywKKyAgICAweDExMDQsIDB4MDIxNCwgMHgwMjI0LCAweDAyMzQsIDB4MDI0NCwgMHgwMjU0LCAweDAyNjQsIDB4MDI3NCwKKyAgICAweDExMDUsIDB4MDIxNSwgMHgwMjI1LCAweDAyMzUsIDB4MDI0NSwgMHgwMjU1LCAweDAyNjUsIDB4MDI3NSwKKyAgICAweDExMDYsIDB4MDIxNiwgMHgwMjI2LCAweDAyMzYsIDB4MDI0NiwgMHgwMjU2LCAweDAyNjYsIDB4MDI3NiwKKyAgICAweDExMDcsIDB4MDIxNywgMHgwMjI3LCAweDAyMzcsIDB4MDI0NywgMHgwMjU3LCAweDAyNjcsIDB4MDI3NywKK307CisKKy8qCisgKiBiaXRzICAwOjMsIDQ6NyAgaW5kZXggaW50byBfdmFscyBhcnJheQorICogICAgICAgODoxMSAgICAgIG51bWJlciBvZiBub24temVybyB2YWx1ZXMKKyAqICAgICAgMTI6MTUgICAgICAxOiBvbmx5IHNlY29uZCB2YWx1ZSBub24temVybworICogICAgICAgICAgICAgICAgIDA6IG90aGVyIGNhc2VzCisgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjb2RlYm9va192ZWN0b3I4X2lkeFtdID0geworICAweDAwMDAsIDB4MDExMCwgMHgwMTIwLCAweDAxMzAsIDB4MDE0MCwgMHgwMTUwLCAweDAxNjAsCisgIDB4MDE3MCwgMHgwMTgwLCAweDAxOTAsIDB4MDFhMCwgMHgwMWIwLCAweDAxYzAsCisgIDB4MTEwMSwgMHgwMjExLCAweDAyMjEsIDB4MDIzMSwgMHgwMjQxLCAweDAyNTEsIDB4MDI2MSwKKyAgMHgwMjcxLCAweDAyODEsIDB4MDI5MSwgMHgwMmExLCAweDAyYjEsIDB4MDJjMSwKKyAgMHgxMTAyLCAweDAyMTIsIDB4MDIyMiwgMHgwMjMyLCAweDAyNDIsIDB4MDI1MiwgMHgwMjYyLAorICAweDAyNzIsIDB4MDI4MiwgMHgwMjkyLCAweDAyYTIsIDB4MDJiMiwgMHgwMmMyLAorICAweDExMDMsIDB4MDIxMywgMHgwMjIzLCAweDAyMzMsIDB4MDI0MywgMHgwMjUzLCAweDAyNjMsCisgIDB4MDI3MywgMHgwMjgzLCAweDAyOTMsIDB4MDJhMywgMHgwMmIzLCAweDAyYzMsCisgIDB4MTEwNCwgMHgwMjE0LCAweDAyMjQsIDB4MDIzNCwgMHgwMjQ0LCAweDAyNTQsIDB4MDI2NCwKKyAgMHgwMjc0LCAweDAyODQsIDB4MDI5NCwgMHgwMmE0LCAweDAyYjQsIDB4MDJjNCwKKyAgMHgxMTA1LCAweDAyMTUsIDB4MDIyNSwgMHgwMjM1LCAweDAyNDUsIDB4MDI1NSwgMHgwMjY1LAorICAweDAyNzUsIDB4MDI4NSwgMHgwMjk1LCAweDAyYTUsIDB4MDJiNSwgMHgwMmM1LAorICAweDExMDYsIDB4MDIxNiwgMHgwMjI2LCAweDAyMzYsIDB4MDI0NiwgMHgwMjU2LCAweDAyNjYsCisgIDB4MDI3NiwgMHgwMjg2LCAweDAyOTYsIDB4MDJhNiwgMHgwMmI2LCAweDAyYzYsCisgIDB4MTEwNywgMHgwMjE3LCAweDAyMjcsIDB4MDIzNywgMHgwMjQ3LCAweDAyNTcsIDB4MDI2NywKKyAgMHgwMjc3LCAweDAyODcsIDB4MDI5NywgMHgwMmE3LCAweDAyYjcsIDB4MDJjNywKKyAgMHgxMTA4LCAweDAyMTgsIDB4MDIyOCwgMHgwMjM4LCAweDAyNDgsIDB4MDI1OCwgMHgwMjY4LAorICAweDAyNzgsIDB4MDI4OCwgMHgwMjk4LCAweDAyYTgsIDB4MDJiOCwgMHgwMmM4LAorICAweDExMDksIDB4MDIxOSwgMHgwMjI5LCAweDAyMzksIDB4MDI0OSwgMHgwMjU5LCAweDAyNjksCisgIDB4MDI3OSwgMHgwMjg5LCAweDAyOTksIDB4MDJhOSwgMHgwMmI5LCAweDAyYzksCisgIDB4MTEwYSwgMHgwMjFhLCAweDAyMmEsIDB4MDIzYSwgMHgwMjRhLCAweDAyNWEsIDB4MDI2YSwKKyAgMHgwMjdhLCAweDAyOGEsIDB4MDI5YSwgMHgwMmFhLCAweDAyYmEsIDB4MDJjYSwKKyAgMHgxMTBiLCAweDAyMWIsIDB4MDIyYiwgMHgwMjNiLCAweDAyNGIsIDB4MDI1YiwgMHgwMjZiLAorICAweDAyN2IsIDB4MDI4YiwgMHgwMjliLCAweDAyYWIsIDB4MDJiYiwgMHgwMmNiLAorICAweDExMGMsIDB4MDIxYywgMHgwMjJjLCAweDAyM2MsIDB4MDI0YywgMHgwMjVjLCAweDAyNmMsCisgIDB4MDI3YywgMHgwMjhjLCAweDAyOWMsIDB4MDJhYywgMHgwMmJjLCAweDAyY2MsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgY29kZWJvb2tfdmVjdG9yMTBfdmFsc1tdID0geworICAgICAwLjAwMDAwMDAsICAxLjAwMDAwMDAsCisgICAgIDIuNTE5ODQyMSwgIDQuMzI2NzQ4NywKKyAgICAgNi4zNDk2MDQyLCAgOC41NDk4Nzk3LAorICAgIDEwLjkwMjcyMzYsIDEzLjM5MDUxODMsCisgICAgMTYuMDAwMDAwMCwgMTguNzIwNzU0NCwKKyAgICAyMS41NDQzNDY5LCAyNC40NjM3ODEwLAorICAgIDI3LjQ3MzE0MTgsIDMwLjU2NzM1MDksCisgICAgMzMuNzQxOTkxNywgMzYuOTkzMTgxMSwKK307CisKKy8qCisgKiBiaXRzICAwOjMsIDQ6NyAgaW5kZXggaW50byBfdmFscyBhcnJheQorICogICAgICAgODo5ICAgICAgIGJpdCBtYXNrIG9mIGVzY2FwZS1jb2RlZCBlbnRyaWVzCisgKiAgICAgIDEyOjE1ICAgICAgbnVtYmVyIG9mIG5vbi16ZXJvIHZhbHVlcworICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgY29kZWJvb2tfdmVjdG9yMTBfaWR4W10gPSB7CisgICAgMHgwMDAwLCAweDEwMTAsIDB4MTAyMCwgMHgxMDMwLCAweDEwNDAsIDB4MTA1MCwgMHgxMDYwLCAweDEwNzAsCisgICAgMHgxMDgwLCAweDEwOTAsIDB4MTBhMCwgMHgxMGIwLCAweDEwYzAsIDB4MTBkMCwgMHgxMGUwLCAweDEwZjAsIDB4MTIwMCwKKyAgICAweDEwMDEsIDB4MjAxMSwgMHgyMDIxLCAweDIwMzEsIDB4MjA0MSwgMHgyMDUxLCAweDIwNjEsIDB4MjA3MSwKKyAgICAweDIwODEsIDB4MjA5MSwgMHgyMGExLCAweDIwYjEsIDB4MjBjMSwgMHgyMGQxLCAweDIwZTEsIDB4MjBmMSwgMHgyMjAxLAorICAgIDB4MTAwMiwgMHgyMDEyLCAweDIwMjIsIDB4MjAzMiwgMHgyMDQyLCAweDIwNTIsIDB4MjA2MiwgMHgyMDcyLAorICAgIDB4MjA4MiwgMHgyMDkyLCAweDIwYTIsIDB4MjBiMiwgMHgyMGMyLCAweDIwZDIsIDB4MjBlMiwgMHgyMGYyLCAweDIyMDIsCisgICAgMHgxMDAzLCAweDIwMTMsIDB4MjAyMywgMHgyMDMzLCAweDIwNDMsIDB4MjA1MywgMHgyMDYzLCAweDIwNzMsCisgICAgMHgyMDgzLCAweDIwOTMsIDB4MjBhMywgMHgyMGIzLCAweDIwYzMsIDB4MjBkMywgMHgyMGUzLCAweDIwZjMsIDB4MjIwMywKKyAgICAweDEwMDQsIDB4MjAxNCwgMHgyMDI0LCAweDIwMzQsIDB4MjA0NCwgMHgyMDU0LCAweDIwNjQsIDB4MjA3NCwKKyAgICAweDIwODQsIDB4MjA5NCwgMHgyMGE0LCAweDIwYjQsIDB4MjBjNCwgMHgyMGQ0LCAweDIwZTQsIDB4MjBmNCwgMHgyMjA0LAorICAgIDB4MTAwNSwgMHgyMDE1LCAweDIwMjUsIDB4MjAzNSwgMHgyMDQ1LCAweDIwNTUsIDB4MjA2NSwgMHgyMDc1LAorICAgIDB4MjA4NSwgMHgyMDk1LCAweDIwYTUsIDB4MjBiNSwgMHgyMGM1LCAweDIwZDUsIDB4MjBlNSwgMHgyMGY1LCAweDIyMDUsCisgICAgMHgxMDA2LCAweDIwMTYsIDB4MjAyNiwgMHgyMDM2LCAweDIwNDYsIDB4MjA1NiwgMHgyMDY2LCAweDIwNzYsCisgICAgMHgyMDg2LCAweDIwOTYsIDB4MjBhNiwgMHgyMGI2LCAweDIwYzYsIDB4MjBkNiwgMHgyMGU2LCAweDIwZjYsIDB4MjIwNiwKKyAgICAweDEwMDcsIDB4MjAxNywgMHgyMDI3LCAweDIwMzcsIDB4MjA0NywgMHgyMDU3LCAweDIwNjcsIDB4MjA3NywKKyAgICAweDIwODcsIDB4MjA5NywgMHgyMGE3LCAweDIwYjcsIDB4MjBjNywgMHgyMGQ3LCAweDIwZTcsIDB4MjBmNywgMHgyMjA3LAorICAgIDB4MTAwOCwgMHgyMDE4LCAweDIwMjgsIDB4MjAzOCwgMHgyMDQ4LCAweDIwNTgsIDB4MjA2OCwgMHgyMDc4LAorICAgIDB4MjA4OCwgMHgyMDk4LCAweDIwYTgsIDB4MjBiOCwgMHgyMGM4LCAweDIwZDgsIDB4MjBlOCwgMHgyMGY4LCAweDIyMDgsCisgICAgMHgxMDA5LCAweDIwMTksIDB4MjAyOSwgMHgyMDM5LCAweDIwNDksIDB4MjA1OSwgMHgyMDY5LCAweDIwNzksCisgICAgMHgyMDg5LCAweDIwOTksIDB4MjBhOSwgMHgyMGI5LCAweDIwYzksIDB4MjBkOSwgMHgyMGU5LCAweDIwZjksIDB4MjIwOSwKKyAgICAweDEwMGEsIDB4MjAxYSwgMHgyMDJhLCAweDIwM2EsIDB4MjA0YSwgMHgyMDVhLCAweDIwNmEsIDB4MjA3YSwKKyAgICAweDIwOGEsIDB4MjA5YSwgMHgyMGFhLCAweDIwYmEsIDB4MjBjYSwgMHgyMGRhLCAweDIwZWEsIDB4MjBmYSwgMHgyMjBhLAorICAgIDB4MTAwYiwgMHgyMDFiLCAweDIwMmIsIDB4MjAzYiwgMHgyMDRiLCAweDIwNWIsIDB4MjA2YiwgMHgyMDdiLAorICAgIDB4MjA4YiwgMHgyMDliLCAweDIwYWIsIDB4MjBiYiwgMHgyMGNiLCAweDIwZGIsIDB4MjBlYiwgMHgyMGZiLCAweDIyMGIsCisgICAgMHgxMDBjLCAweDIwMWMsIDB4MjAyYywgMHgyMDNjLCAweDIwNGMsIDB4MjA1YywgMHgyMDZjLCAweDIwN2MsCisgICAgMHgyMDhjLCAweDIwOWMsIDB4MjBhYywgMHgyMGJjLCAweDIwY2MsIDB4MjBkYywgMHgyMGVjLCAweDIwZmMsIDB4MjIwYywKKyAgICAweDEwMGQsIDB4MjAxZCwgMHgyMDJkLCAweDIwM2QsIDB4MjA0ZCwgMHgyMDVkLCAweDIwNmQsIDB4MjA3ZCwKKyAgICAweDIwOGQsIDB4MjA5ZCwgMHgyMGFkLCAweDIwYmQsIDB4MjBjZCwgMHgyMGRkLCAweDIwZWQsIDB4MjBmZCwgMHgyMjBkLAorICAgIDB4MTAwZSwgMHgyMDFlLCAweDIwMmUsIDB4MjAzZSwgMHgyMDRlLCAweDIwNWUsIDB4MjA2ZSwgMHgyMDdlLAorICAgIDB4MjA4ZSwgMHgyMDllLCAweDIwYWUsIDB4MjBiZSwgMHgyMGNlLCAweDIwZGUsIDB4MjBlZSwgMHgyMGZlLCAweDIyMGUsCisgICAgMHgxMDBmLCAweDIwMWYsIDB4MjAyZiwgMHgyMDNmLCAweDIwNGYsIDB4MjA1ZiwgMHgyMDZmLCAweDIwN2YsCisgICAgMHgyMDhmLCAweDIwOWYsIDB4MjBhZiwgMHgyMGJmLCAweDIwY2YsIDB4MjBkZiwgMHgyMGVmLCAweDIwZmYsIDB4MjIwZiwKKyAgICAweDExMDAsIDB4MjExMCwgMHgyMTIwLCAweDIxMzAsIDB4MjE0MCwgMHgyMTUwLCAweDIxNjAsIDB4MjE3MCwKKyAgICAweDIxODAsIDB4MjE5MCwgMHgyMWEwLCAweDIxYjAsIDB4MjFjMCwgMHgyMWQwLCAweDIxZTAsIDB4MjFmMCwgMHgyMzAwLAorfTsKKworY29uc3QgZmxvYXQgKmNvbnN0IGZmX2FhY19jb2RlYm9va192ZWN0b3JfdmFsc1tdID0geworICAgIGNvZGVib29rX3ZlY3RvcjBfdmFscywgIGNvZGVib29rX3ZlY3RvcjBfdmFscywKKyAgICBjb2RlYm9va192ZWN0b3IxMF92YWxzLCBjb2RlYm9va192ZWN0b3IxMF92YWxzLAorICAgIGNvZGVib29rX3ZlY3RvcjRfdmFscywgIGNvZGVib29rX3ZlY3RvcjRfdmFscywKKyAgICBjb2RlYm9va192ZWN0b3IxMF92YWxzLCBjb2RlYm9va192ZWN0b3IxMF92YWxzLAorICAgIGNvZGVib29rX3ZlY3RvcjEwX3ZhbHMsIGNvZGVib29rX3ZlY3RvcjEwX3ZhbHMsCisgICAgY29kZWJvb2tfdmVjdG9yMTBfdmFscywKK307CisKK2NvbnN0IHVpbnQxNl90ICpjb25zdCBmZl9hYWNfY29kZWJvb2tfdmVjdG9yX2lkeFtdID0geworICAgIGNvZGVib29rX3ZlY3RvcjAyX2lkeCwgY29kZWJvb2tfdmVjdG9yMDJfaWR4LAorICAgIGNvZGVib29rX3ZlY3RvcjAyX2lkeCwgY29kZWJvb2tfdmVjdG9yMDJfaWR4LAorICAgIGNvZGVib29rX3ZlY3RvcjRfaWR4LCAgY29kZWJvb2tfdmVjdG9yNF9pZHgsCisgICAgY29kZWJvb2tfdmVjdG9yNl9pZHgsICBjb2RlYm9va192ZWN0b3I2X2lkeCwKKyAgICBjb2RlYm9va192ZWN0b3I4X2lkeCwgIGNvZGVib29rX3ZlY3RvcjhfaWR4LAorICAgIGNvZGVib29rX3ZlY3RvcjEwX2lkeCwKK307CisKKy8qIEBuYW1lIHN3Yl9vZmZzZXRzCisgKiBTYW1wbGUgb2Zmc2V0IGludG8gdGhlIHdpbmRvdyBpbmRpY2F0aW5nIHRoZSBiZWdpbm5pbmcgb2YgYSBzY2FsZWZhY3RvcgorICogd2luZG93IGJhbmQKKyAqCisgKiBzY2FsZWZhY3RvciB3aW5kb3cgYmFuZCAtIHRlcm0gZm9yIHNjYWxlZmFjdG9yIGJhbmRzIHdpdGhpbiBhIHdpbmRvdywKKyAqIGdpdmVuIGluIFRhYmxlIDQuMTEwIHRvIFRhYmxlIDQuMTI4LgorICoKKyAqIHNjYWxlZmFjdG9yIGJhbmQgLSBhIHNldCBvZiBzcGVjdHJhbCBjb2VmZmljaWVudHMgd2hpY2ggYXJlIHNjYWxlZCBieSBvbmUKKyAqIHNjYWxlZmFjdG9yLiBJbiBjYXNlIG9mIEVJR0hUX1NIT1JUX1NFUVVFTkNFIGFuZCBncm91cGluZyBhIHNjYWxlZmFjdG9yIGJhbmQKKyAqIG1heSBjb250YWluIHNldmVyYWwgc2NhbGVmYWN0b3Igd2luZG93IGJhbmRzIG9mIGNvcnJlc3BvbmRpbmcgZnJlcXVlbmN5LiBGb3IKKyAqIGFsbCBvdGhlciB3aW5kb3dfc2VxdWVuY2VzIHNjYWxlZmFjdG9yIGJhbmRzIGFuZCBzY2FsZWZhY3RvciB3aW5kb3cgYmFuZHMgYXJlCisgKiBpZGVudGljYWwuCisgKiBAeworICovCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzd2Jfb2Zmc2V0XzEwMjRfOTZbXSA9IHsKKyAgICAgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwKKyAgICAgMzIsICAzNiwgIDQwLCAgNDQsICA0OCwgIDUyLCAgNTYsICA2NCwKKyAgICAgNzIsICA4MCwgIDg4LCAgOTYsIDEwOCwgMTIwLCAxMzIsIDE0NCwKKyAgICAxNTYsIDE3MiwgMTg4LCAyMTIsIDI0MCwgMjc2LCAzMjAsIDM4NCwKKyAgICA0NDgsIDUxMiwgNTc2LCA2NDAsIDcwNCwgNzY4LCA4MzIsIDg5NiwKKyAgICA5NjAsIDEwMjQKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzd2Jfb2Zmc2V0XzEyOF85NltdID0geworICAgIDAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAzMiwgNDAsIDQ4LCA2NCwgOTIsIDEyOAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfMTAyNF82NFtdID0geworICAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LAorICAgICAzMiwgIDM2LCAgNDAsICA0NCwgIDQ4LCAgNTIsICA1NiwgIDY0LAorICAgICA3MiwgIDgwLCAgODgsIDEwMCwgMTEyLCAxMjQsIDE0MCwgMTU2LAorICAgIDE3MiwgMTkyLCAyMTYsIDI0MCwgMjY4LCAzMDQsIDM0NCwgMzg0LAorICAgIDQyNCwgNDY0LCA1MDQsIDU0NCwgNTg0LCA2MjQsIDY2NCwgNzA0LAorICAgIDc0NCwgNzg0LCA4MjQsIDg2NCwgOTA0LCA5NDQsIDk4NCwgMTAyNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfMTAyNF80OFtdID0geworICAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LAorICAgICAzMiwgIDM2LCAgNDAsICA0OCwgIDU2LCAgNjQsICA3MiwgIDgwLAorICAgICA4OCwgIDk2LCAxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LAorICAgIDE5NiwgMjE2LCAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LAorICAgIDQxNiwgNDQ4LCA0ODAsIDUxMiwgNTQ0LCA1NzYsIDYwOCwgNjQwLAorICAgIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LAorICAgIDkyOCwgMTAyNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfNTEyXzQ4W10gPSB7CisgICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsCisgICAgIDMyLCAgMzYsICA0MCwgIDQ0LCAgNDgsICA1MiwgIDU2LCAgNjAsCisgICAgIDY4LCAgNzYsICA4NCwgIDkyLCAxMDAsIDExMiwgMTI0LCAxMzYsCisgICAgMTQ4LCAxNjQsIDE4NCwgMjA4LCAyMzYsIDI2OCwgMzAwLCAzMzIsCisgICAgMzY0LCAzOTYsIDQyOCwgNDYwLCA1MTIKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzd2Jfb2Zmc2V0XzEyOF80OFtdID0geworICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI4LCAgMzYsCisgICAgNDQsICA1NiwgIDY4LCAgODAsICA5NiwgMTEyLCAxMjgKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzd2Jfb2Zmc2V0XzEwMjRfMzJbXSA9IHsKKyAgICAgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwKKyAgICAgMzIsICAzNiwgIDQwLCAgNDgsICA1NiwgIDY0LCAgNzIsICA4MCwKKyAgICAgODgsICA5NiwgMTA4LCAxMjAsIDEzMiwgMTQ0LCAxNjAsIDE3NiwKKyAgICAxOTYsIDIxNiwgMjQwLCAyNjQsIDI5MiwgMzIwLCAzNTIsIDM4NCwKKyAgICA0MTYsIDQ0OCwgNDgwLCA1MTIsIDU0NCwgNTc2LCA2MDgsIDY0MCwKKyAgICA2NzIsIDcwNCwgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwKKyAgICA5MjgsIDk2MCwgOTkyLCAxMDI0Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc3diX29mZnNldF81MTJfMzJbXSA9IHsKKyAgICAgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwKKyAgICAgMzIsICAzNiwgIDQwLCAgNDQsICA0OCwgIDUyLCAgNTYsICA2NCwKKyAgICAgNzIsICA4MCwgIDg4LCAgOTYsIDEwOCwgMTIwLCAxMzIsIDE0NCwKKyAgICAxNjAsIDE3NiwgMTkyLCAyMTIsIDIzNiwgMjYwLCAyODgsIDMyMCwKKyAgICAzNTIsIDM4NCwgNDE2LCA0NDgsIDQ4MCwgNTEyCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc3diX29mZnNldF8xMDI0XzI0W10gPSB7CisgICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsCisgICAgIDMyLCAgMzYsICA0MCwgIDQ0LCAgNTIsICA2MCwgIDY4LCAgNzYsCisgICAgIDg0LCAgOTIsIDEwMCwgMTA4LCAxMTYsIDEyNCwgMTM2LCAxNDgsCisgICAgMTYwLCAxNzIsIDE4OCwgMjA0LCAyMjAsIDI0MCwgMjYwLCAyODQsCisgICAgMzA4LCAzMzYsIDM2NCwgMzk2LCA0MzIsIDQ2OCwgNTA4LCA1NTIsCisgICAgNjAwLCA2NTIsIDcwNCwgNzY4LCA4MzIsIDg5NiwgOTYwLCAxMDI0Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc3diX29mZnNldF81MTJfMjRbXSA9IHsKKyAgICAgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwKKyAgICAgMzIsICAzNiwgIDQwLCAgNDQsICA1MiwgIDYwLCAgNjgsICA4MCwKKyAgICAgOTIsIDEwNCwgMTIwLCAxNDAsIDE2NCwgMTkyLCAyMjQsIDI1NiwKKyAgICAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4LCA0ODAsIDUxMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzd2Jfb2Zmc2V0XzEyOF8yNFtdID0geworICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsCisgICAgMzYsICA0NCwgIDUyLCAgNjQsICA3NiwgIDkyLCAxMDgsIDEyOAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfMTAyNF8xNltdID0geworICAgICAgMCwgICA4LCAgMTYsICAyNCwgIDMyLCAgNDAsICA0OCwgIDU2LAorICAgICA2NCwgIDcyLCAgODAsICA4OCwgMTAwLCAxMTIsIDEyNCwgMTM2LAorICAgIDE0OCwgMTYwLCAxNzIsIDE4NCwgMTk2LCAyMTIsIDIyOCwgMjQ0LAorICAgIDI2MCwgMjgwLCAzMDAsIDMyMCwgMzQ0LCAzNjgsIDM5NiwgNDI0LAorICAgIDQ1NiwgNDkyLCA1MzIsIDU3MiwgNjE2LCA2NjQsIDcxNiwgNzcyLAorICAgIDgzMiwgODk2LCA5NjAsIDEwMjQKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzd2Jfb2Zmc2V0XzEyOF8xNltdID0geworICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsCisgICAgMzIsICA0MCwgIDQ4LCAgNjAsICA3MiwgIDg4LCAxMDgsIDEyOAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfMTAyNF84W10gPSB7CisgICAgICAwLCAgMTIsICAyNCwgIDM2LCAgNDgsICA2MCwgIDcyLCAgODQsCisgICAgIDk2LCAxMDgsIDEyMCwgMTMyLCAxNDQsIDE1NiwgMTcyLCAxODgsCisgICAgMjA0LCAyMjAsIDIzNiwgMjUyLCAyNjgsIDI4OCwgMzA4LCAzMjgsCisgICAgMzQ4LCAzNzIsIDM5NiwgNDIwLCA0NDgsIDQ3NiwgNTA4LCA1NDQsCisgICAgNTgwLCA2MjAsIDY2NCwgNzEyLCA3NjQsIDgyMCwgODgwLCA5NDQsCisgICAgMTAyNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfMTI4XzhbXSA9IHsKKyAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LAorICAgIDM2LCAgNDQsICA1MiwgIDYwLCAgNzIsICA4OCwgMTA4LCAxMjgKK307CisKK2NvbnN0IHVpbnQxNl90ICogY29uc3QgZmZfc3diX29mZnNldF8xMDI0W10gPSB7CisgICAgc3diX29mZnNldF8xMDI0Xzk2LCBzd2Jfb2Zmc2V0XzEwMjRfOTYsIHN3Yl9vZmZzZXRfMTAyNF82NCwKKyAgICBzd2Jfb2Zmc2V0XzEwMjRfNDgsIHN3Yl9vZmZzZXRfMTAyNF80OCwgc3diX29mZnNldF8xMDI0XzMyLAorICAgIHN3Yl9vZmZzZXRfMTAyNF8yNCwgc3diX29mZnNldF8xMDI0XzI0LCBzd2Jfb2Zmc2V0XzEwMjRfMTYsCisgICAgc3diX29mZnNldF8xMDI0XzE2LCBzd2Jfb2Zmc2V0XzEwMjRfMTYsIHN3Yl9vZmZzZXRfMTAyNF84LAorICAgIHN3Yl9vZmZzZXRfMTAyNF84Cit9OworCitjb25zdCB1aW50MTZfdCAqIGNvbnN0IGZmX3N3Yl9vZmZzZXRfNTEyW10gPSB7CisgICAgTlVMTCwgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgIE5VTEwsCisgICAgc3diX29mZnNldF81MTJfNDgsICBzd2Jfb2Zmc2V0XzUxMl80OCwgIHN3Yl9vZmZzZXRfNTEyXzMyLAorICAgIHN3Yl9vZmZzZXRfNTEyXzI0LCAgc3diX29mZnNldF81MTJfMjQsICBOVUxMLAorICAgIE5VTEwsICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICBOVUxMLAorICAgIE5VTEwKK307CisKK2NvbnN0IHVpbnQxNl90ICogY29uc3QgZmZfc3diX29mZnNldF8xMjhbXSA9IHsKKyAgICAvKiBUaGUgbGFzdCBlbnRyeSBvbiB0aGUgZm9sbG93aW5nIHJvdyBpcyBzd2Jfb2Zmc2V0XzEyOF82NCBidXQgaXMgYQorICAgICAgIGR1cGxpY2F0ZSBvZiBzd2Jfb2Zmc2V0XzEyOF85Ni4gKi8KKyAgICBzd2Jfb2Zmc2V0XzEyOF85Niwgc3diX29mZnNldF8xMjhfOTYsIHN3Yl9vZmZzZXRfMTI4Xzk2LAorICAgIHN3Yl9vZmZzZXRfMTI4XzQ4LCBzd2Jfb2Zmc2V0XzEyOF80OCwgc3diX29mZnNldF8xMjhfNDgsCisgICAgc3diX29mZnNldF8xMjhfMjQsIHN3Yl9vZmZzZXRfMTI4XzI0LCBzd2Jfb2Zmc2V0XzEyOF8xNiwKKyAgICBzd2Jfb2Zmc2V0XzEyOF8xNiwgc3diX29mZnNldF8xMjhfMTYsIHN3Yl9vZmZzZXRfMTI4XzgsCisgICAgc3diX29mZnNldF8xMjhfOAorfTsKKworLy8gQH0KKworLyogQG5hbWUgZmZfdG5zX21heF9iYW5kcworICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmRzIG9uIHdoaWNoIFROUyBjYW4gb3BlcmF0ZSBmb3IgdGhlIGxvbmcKKyAqIGFuZCBzaG9ydCB0cmFuc2Zvcm1zIHJlc3BlY3RpdmVseS4gVGhlIGluZGV4IHRvIHRoZXNlIHRhYmxlcyBpcyByZWxhdGVkIHRvCisgKiB0aGUgc2FtcGxlIHJhdGUgb2YgdGhlIGF1ZGlvLgorICogQHsKKyAqLworY29uc3QgdWludDhfdCBmZl90bnNfbWF4X2JhbmRzXzEwMjRbXSA9IHsKKyAgICAzMSwgMzEsIDM0LCA0MCwgNDIsIDUxLCA0NiwgNDYsIDQyLCA0MiwgNDIsIDM5LCAzOQorfTsKKworY29uc3QgdWludDhfdCBmZl90bnNfbWF4X2JhbmRzXzUxMltdID0geworICAgIDAsIDAsIDAsIDMxLCAzMiwgMzcsIDMxLCAzMSwgMCwgMCwgMCwgMCwgMAorfTsKKworY29uc3QgdWludDhfdCBmZl90bnNfbWF4X2JhbmRzXzEyOFtdID0geworICAgIDksIDksIDEwLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNAorfTsKKy8vIEB9CisKK2NvbnN0IERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGZmX2FhY19lbGRfd2luZG93KVsxOTIwXSA9IHsKKyAgICAgMC4wMDMzODgzNCwgIDAuMDA1Njc3NDUsICAwLjAwODQ3Njc3LCAgMC4wMTE3MjY0MSwKKyAgICAgMC4wMTUzMjU1NSwgIDAuMDE5MTc2NjQsICAwLjAyMzE4ODA5LCAgMC4wMjcyOTI1OSwKKyAgICAgMC4wMzE0NDUwMywgIDAuMDM1NjAyNjEsICAwLjAzOTcyNDk5LCAgMC4wNDM3OTc4MywKKyAgICAgMC4wNDc4MzA5NCwgIDAuMDUxODMzNTcsICAwLjA1NTgxMzQyLCAgMC4wNTk3NzcyMywKKyAgICAgMC4wNjM3MzE3MywgIDAuMDY3NjgzNjQsICAwLjA3MTYzOTM3LCAgMC4wNzU1OTk3NiwKKyAgICAgMC4wNzk1NjA5NiwgIDAuMDgzNTIwMjQsICAwLjA4NzQ3NjIzLCAgMC4wOTE0MzAzNSwKKyAgICAgMC4wOTUzODYxOCwgIDAuMDk5MzQ3NzEsICAwLjEwMzMxOTE3LCAgMC4xMDczMDQ1NiwKKyAgICAgMC4xMTEzMDY5NywgIDAuMTE1MzI4NjcsICAwLjExOTM3MTMzLCAgMC4xMjM0MzkyMiwKKyAgICAgMC4xMjc1MzkxMSwgIDAuMTMxNjc3MDUsICAwLjEzNTg1ODEyLCAgMC4xNDAwODUyOSwKKyAgICAgMC4xNDQzNTk4NiwgIDAuMTQ4NjgyOTEsICAwLjE1MzA1NTMxLCAgMC4xNTc0NzU5NCwKKyAgICAgMC4xNjE5NDE5MywgIDAuMTY2NDUwNzAsICAwLjE3MDk5OTkxLCAgMC4xNzU1ODYzMywKKyAgICAgMC4xODAyMDYwMCwgIDAuMTg0ODU1NDgsICAwLjE4OTUzMTkxLCAgMC4xOTQyMzMyMiwKKyAgICAgMC4xOTg5NTgwMCwgIDAuMjAzNzA1MTIsICAwLjIwODQ3Mzc0LCAgMC4yMTMyNjMxMiwKKyAgICAgMC4yMTgwNzI0NCwgIDAuMjIyOTAwODMsICAwLjIyNzc0NzQyLCAgMC4yMzI2MTIxMCwKKyAgICAgMC4yMzc0OTU0MiwgIDAuMjQyMzk3NjcsICAwLjI0NzMxODg5LCAgMC4yNTIyNTg4NywKKyAgICAgMC4yNTcyMTcxOSwgIDAuMjYyMTkzMzAsICAwLjI2NzE4NjQ4LCAgMC4yNzIxOTYzMCwKKyAgICAgMC4yNzcyMjI2MiwgIDAuMjgyMjY1MTQsICAwLjI4NzMyMzM2LCAgMC4yOTIzOTYyOCwKKyAgICAgMC4yOTc0ODI0NywgIDAuMzAyNTgwNTUsICAwLjMwNzY4OTE0LCAgMC4zMTI4MDUwOCwKKyAgICAgMC4zMTc5MjM4NSwgIDAuMzIzMDQxNzIsICAwLjMyODE1NTc5LCAgMC4zMzMyNjM5NywKKyAgICAgMC4zMzgzNjQ3MCwgIDAuMzQzNDU2NjEsICAwLjM0ODUzODY4LCAgMC4zNTM2MTE4OCwKKyAgICAgMC4zNTg2Nzg2NSwgIDAuMzYzNzQwNzIsICAwLjM2ODc5OTAwLCAgMC4zNzM4NTM0NywKKyAgICAgMC4zNzg5MDM0OSwgIDAuMzgzOTQ4MzYsICAwLjM4ODk4NzMwLCAgMC4zOTQwMTkxMiwKKyAgICAgMC4zOTkwNDIzNiwgIDAuNDA0MDU1NzUsICAwLjQwOTA1ODIwLCAgMC40MTQwNDgxOSwKKyAgICAgMC40MTkwMjM5OCwgIDAuNDIzOTg0MjMsICAwLjQyODkyODA1LCAgMC40MzM4NTQ0MSwKKyAgICAgMC40Mzg3NjIxMCwgIDAuNDQzNjUwMTQsICAwLjQ0ODUxNzg2LCAgMC40NTMzNjYzMiwKKyAgICAgMC40NTgxOTc1OSwgIDAuNDYzMDEzMDIsICAwLjQ2NzgxMzA5LCAgMC40NzI1OTcyMiwKKyAgICAgMC40NzczNjQzNSwgIDAuNDgyMTEzNjUsICAwLjQ4Njg0NDUwLCAgMC40OTE1NTU5NCwKKyAgICAgMC40OTYyNDY3OSwgIDAuNTAwOTE2MzYsICAwLjUwNTU2NDQwLCAgMC41MTAxOTEzMiwKKyAgICAgMC41MTQ3OTc3MSwgIDAuNTE5MzgzOTEsICAwLjUyMzk0OTk4LCAgMC41Mjg0OTU4NywKKyAgICAgMC41MzMwMjE1MSwgIDAuNTM3NTI2ODAsICAwLjU0MjAxMTYwLCAgMC41NDY0NzU3NSwKKyAgICAgMC41NTA5MTkxNiwgIDAuNTU1MzQxODEsICAwLjU1OTc0Mzc2LCAgMC41NjQxMjUxMywKKyAgICAgMC41Njg0ODYxNSwgIDAuNTcyODI3MTAsICAwLjU3NzE0ODM0LCAgMC41ODE0NTAzMCwKKyAgICAgMC41ODQ5MjQ4OSwgIDAuNTg5MTg1MTEsICAwLjU5MzQyMzI2LCAgMC41OTc2MzkzNiwKKyAgICAgMC42MDE4MzM0NywgIDAuNjA2MDA1NjEsICAwLjYxMDE1NTgxLCAgMC42MTQyODQxMiwKKyAgICAgMC42MTgzOTA1NiwgIDAuNjIyNDc1MTcsICAwLjYyNjUzNzk5LCAgMC42MzA1NzkxMiwKKyAgICAgMC42MzQ1OTg3MiwgIDAuNjM4NTk2OTcsICAwLjY0MjU3NDAzLCAgMC42NDY1MzAwMSwKKyAgICAgMC42NTA0NjQ5NSwgIDAuNjU0Mzc4ODcsICAwLjY1ODI3MTgxLCAgMC42NjIxNDM4MywKKyAgICAgMC42NjU5OTQ5OSwgIDAuNjY5ODI1MzUsICAwLjY3MzYzNDk5LCAgMC42Nzc0MjM5NCwKKyAgICAgMC42ODExOTIxOSwgIDAuNjg0OTM5NzIsICAwLjY4ODY2NjUzLCAgMC42OTIzNzI1OCwKKyAgICAgMC42OTYwNTc3OCwgIDAuNjk5NzIyMDcsICAwLjcwMzM2NTM3LCAgMC43MDY5ODc1OCwKKyAgICAgMC43MTA1ODg2MiwgIDAuNzE0MTY4MzcsICAwLjcxNzcyNjc0LCAgMC43MjEyNjM2MSwKKyAgICAgMC43MjQ3Nzg4OSwgIDAuNzI4MjcyNDYsICAwLjczMTc0NDE5LCAgMC43MzUxOTM5MiwKKyAgICAgMC43Mzg2MjE0MSwgIDAuNzQyMDI2NDMsICAwLjc0NTQwODc0LCAgMC43NDg3NjgxNywKKyAgICAgMC43NTIxMDQ1OCwgIDAuNzU1NDE3ODUsICAwLjc1ODcwNzg1LCAgMC43NjE5NzQzNywKKyAgICAgMC43NjUyMTcwOSwgIDAuNzY4NDM1NzAsICAwLjc3MTYyOTg4LCAgMC43NzQ3OTkzOSwKKyAgICAgMC43Nzc5NDQwMywgIDAuNzgxMDYzNTksICAwLjc4NDE1Nzg5LCAgMC43ODcyMjY3MCwKKyAgICAgMC43OTAyNjk3OSwgIDAuNzkzMjg2OTQsICAwLjc5NjI3NzkxLCAgMC43OTkyNDI0NCwKKyAgICAgMC44MDIxODAyNywgIDAuODA1MDkxMTIsICAwLjgwNzk3NDcyLCAgMC44MTA4MzA4MSwKKyAgICAgMC44MTM2NTkxNSwgIDAuODE2NDU5NDksICAwLjgxOTIzMTYwLCAgMC44MjE5NzUyOCwKKyAgICAgMC44MjQ2OTAzNywgIDAuODI3Mzc2NzMsICAwLjgzMDAzNDE5LCAgMC44MzI2NjI2MiwKKyAgICAgMC44MzUyNjE4NiwgIDAuODM3ODMxNzYsICAwLjg0MDM3MjE3LCAgMC44NDI4ODI5NywKKyAgICAgMC44NDUzNjQwMSwgIDAuODQ3ODE1MTcsICAwLjg1MDIzNjMyLCAgMC44NTI2MjczOSwKKyAgICAgMC44NTQ5ODgzNiwgIDAuODU3MzE5MjEsICAwLjg1OTYxOTkzLCAgMC44NjE4OTA1MiwKKyAgICAgMC44NjQxMzEwMSwgIDAuODY2MzQxNDAsICAwLjg2ODUyMTczLCAgMC44NzA2NzIxMSwKKyAgICAgMC44NzI3OTI3NSwgIDAuODc0ODgzODQsICAwLjg3Njk0NTU5LCAgMC44Nzg5NzgyNCwKKyAgICAgMC44ODA5ODIwNiwgIDAuODgyOTU3MjksICAwLjg4NDkwNDIzLCAgMC44ODY4MjMzMiwKKyAgICAgMC44ODg3MTUxOSwgIDAuODkwNTgwNDgsICAwLjg5MjQxOTgzLCAgMC44OTQyMzM5MSwKKyAgICAgMC44OTYwMjMzOCwgIDAuODk3Nzg4OTMsICAwLjg5OTUzMTI2LCAgMC45MDEyNTE0MiwKKyAgICAgMC45MDI5NTA4NiwgIDAuOTA0NjMxMDQsICAwLjkwNjI5MzQxLCAgMC45MDc5Mzk0NiwKKyAgICAgMC45MDk1NzA2NywgIDAuOTExMTg4NTYsICAwLjkxMjc5NDY0LCAgMC45MTQzOTA3MywKKyAgICAgMC45MTU5Nzg5OCwgIDAuOTE3NTYxNTMsICAwLjkxOTE0MDQ5LCAgMC45MjA3MTY5MCwKKyAgICAgMC45MjIyOTA3MCwgIDAuOTIzODYxODIsICAwLjkyNTQyOTkzLCAgMC45MjY5ODk0NiwKKyAgICAgMC45Mjg1Mjk2MCwgIDAuOTMwMDM5MjksICAwLjkzMTUwNzI3LCAgMC45MzI5MTczOSwKKyAgICAgMC45MzQyNDg2MywgIDAuOTM1NDc5NzQsICAwLjkzNjU4OTgyLCAgMC45Mzc1NjU4NywKKyAgICAgMC45Mzg5NDA3MiwgIDAuOTM5MjI3ODAsICAwLjkzOTU1NDc3LCAgMC45Mzk5MTI5MCwKKyAgICAgMC45NDAyOTEwNCwgIDAuOTQwNjc3OTQsICAwLjk0MTA2MjU4LCAgMC45NDE0NDA4NCwKKyAgICAgMC45NDE4MTU0OSwgIDAuOTQyMTg5NjMsICAwLjk0MjU2NjI4LCAgMC45NDI5NDY2MiwKKyAgICAgMC45NDMzMjk5OCwgIDAuOTQzNzE1NjIsICAwLjk0NDEwMjgwLCAgMC45NDQ0OTEyMiwKKyAgICAgMC45NDQ4ODEwNiwgIDAuOTQ1MjcyNDksICAwLjk0NTY2NTY4LCAgMC45NDYwNjA3NCwKKyAgICAgMC45NDY0NTc3MiwgIDAuOTQ2ODU2NjUsICAwLjk0NzI1NzU5LCAgMC45NDc2NjA1NCwKKyAgICAgMC45NDgwNjU0NywgIDAuOTQ4NDcyMzQsICAwLjk0ODg4MTE1LCAgMC45NDkyOTE5MCwKKyAgICAgMC45NDk3MDQ2OSwgIDAuOTUwMTE5NjAsICAwLjk1MDUzNjcyLCAgMC45NTA5NTYwNCwKKyAgICAgMC45NTEzNzc1MSwgIDAuOTUxODAxMDUsICAwLjk1MjIyNjU4LCAgMC45NTI2NTQxMywKKyAgICAgMC45NTMwODM4MCwgIDAuOTUzNTE1NzEsICAwLjk1Mzk0OTk0LCAgMC45NTQzODY1MywKKyAgICAgMC45NTQ4MjUzOCwgIDAuOTU1MjY2NDMsICAwLjk1NTcwOTU4LCAgMC45NTYxNTQ4NiwKKyAgICAgMC45NTY2MDIzNCwgIDAuOTU3MDUyMTQsICAwLjk1NzUwNDMzLCAgMC45NTc5NTg5MiwKKyAgICAgMC45NTg0MTU4MiwgIDAuOTU4ODc0OTMsICAwLjk1OTMzNjE2LCAgMC45NTk3OTk0OSwKKyAgICAgMC45NjAyNjUwMCwgIDAuOTYwNzMyNzcsICAwLjk2MTIwMjg2LCAgMC45NjE2NzUyNiwKKyAgICAgMC45NjIxNDk4NiwgIDAuOTYyNjI2NTUsICAwLjk2MzEwNTIyLCAgMC45NjM1ODU4NiwKKyAgICAgMC45NjQwNjg1MywgIDAuOTY0NTUzMzAsICAwLjk2NTA0MDI2LCAgMC45NjU1MjkzNiwKKyAgICAgMC45NjYwMjA1MSwgIDAuOTY2NTEzNjAsICAwLjk2NzAwODUwLCAgMC45Njc1MDUyMCwKKyAgICAgMC45NjgwMDM3NiwgIDAuOTY4NTA0MjQsICAwLjk2OTAwNjcwLCAgMC45Njk1MTExMiwKKyAgICAgMC45NzAwMTczOCwgIDAuOTcwNTI1MzMsICAwLjk3MTAzNDg4LCAgMC45NzE1NDU5NywKKyAgICAgMC45NzIwNTg2NywgIDAuOTcyNTczMDQsICAwLjk3MzA4OTE1LCAgMC45NzM2MDY5NCwKKyAgICAgMC45NzQxMjYzMSwgIDAuOTc0NjQ3MTEsICAwLjk3NTE2OTIzLCAgMC45NzU2OTI2MiwKKyAgICAgMC45NzYyMTczNSwgIDAuOTc2NzQzNTAsICAwLjk3NzI3MTExLCAgMC45Nzc4MDAxNiwKKyAgICAgMC45NzgzMzA1MSwgIDAuOTc4ODYyMDUsICAwLjk3OTM5NDYzLCAgMC45Nzk5MjgyMywKKyAgICAgMC45ODA0NjI5MSwgIDAuOTgwOTk4NzUsICAwLjk4MTUzNTgwLCAgMC45ODIwNzQwNSwKKyAgICAgMC45ODI2MTMzNywgIDAuOTgzMTUzNjQsICAwLjk4MzY5NDc0LCAgMC45ODQyMzY2NCwKKyAgICAgMC45ODQ3Nzk0MSwgIDAuOTg1MzIzMTEsICAwLjk4NTg2NzgwLCAgMC45ODY0MTM0OCwKKyAgICAgMC45ODY5NjAwMywgIDAuOTg3NTA3MzQsICAwLjk4ODA1NTMwLCAgMC45ODg2MDM4OSwKKyAgICAgMC45ODkxNTMyMCwgIDAuOTg5NzAzMjgsICAwLjk5MDI1NDIzLCAgMC45OTA4MDYwMiwKKyAgICAgMC45OTEzNTg1NSwgIDAuOTkxOTExNzEsICAwLjk5MjQ2NTQxLCAgMC45OTMwMTk2MiwKKyAgICAgMC45OTM1NzQ0MywgIDAuOTk0MTI5OTIsICAwLjk5NDY4NjE3LCAgMC45OTUyNDMyMCwKKyAgICAgMC45OTU4MDA5MiwgIDAuOTk2MzU5MjYsICAwLjk5NjkxODE0LCAgMC45OTc0Nzc0OCwKKyAgICAgMC45OTgwMzcyMSwgIDAuOTk4NTk3MjUsICAwLjk5OTE1NzUyLCAgMC45OTk3MTc5MywKKyAgICAgMS4wMDAyODIxNSwgIDEuMDAwODQzMTksICAxLjAwMTQwNDcyLCAgMS4wMDE5NjY2NSwKKyAgICAgMS4wMDI1Mjg4OSwgIDEuMDAzMDkxMzksICAxLjAwMzY1NDA0LCAgMS4wMDQyMTY3OSwKKyAgICAgMS4wMDQ3Nzk1NCwgIDEuMDA1MzQyMjEsICAxLjAwNTkwNDc0LCAgMS4wMDY0NjcxMywKKyAgICAgMS4wMDcwMjk0NSwgIDEuMDA3NTkxNzksICAxLjAwODE1NDI0LCAgMS4wMDg3MTY3OCwKKyAgICAgMS4wMDkyNzkzMCwgIDEuMDA5ODQxNjksICAxLjAxMDQwMzg0LCAgMS4wMTA5NjU3NSwKKyAgICAgMS4wMTE1Mjc0NywgIDEuMDEyMDg5MTAsICAxLjAxMjY1MDcwLCAgMS4wMTMyMTIyNiwKKyAgICAgMS4wMTM3NzM2NSwgIDEuMDE0MzM0NzgsICAxLjAxNDg5NTUxLCAgMS4wMTU0NTU4NCwKKyAgICAgMS4wMTYwMTU4MiwgIDEuMDE2NTc1NTMsICAxLjAxNzEzNTAyLCAgMS4wMTc2OTQyNywKKyAgICAgMS4wMTgyNTMxNiwgIDEuMDE4ODExNTQsICAxLjAxOTM2OTI5LCAgMS4wMTk5MjYzOSwKKyAgICAgMS4wMjA0ODI4OSwgIDEuMDIxMDM4ODgsICAxLjAyMTU5NDQxLCAgMS4wMjIxNDk0NSwKKyAgICAgMS4wMjI3MDM4NywgIDEuMDIzMjU3NTEsICAxLjAyMzgxMDI1LCAgMS4wMjQzNjIwNCwKKyAgICAgMS4wMjQ5MTI5NSwgIDEuMDI1NDYzMDQsICAxLjAyNjAxMjM4LCAgMS4wMjY1NjA5MiwKKyAgICAgMS4wMjcxMDg1MywgIDEuMDI3NjU1MDgsICAxLjAyODIwMDQxLCAgMS4wMjg3NDQ0OSwKKyAgICAgMS4wMjkyODczNywgIDEuMDI5ODI5MTMsICAxLjAzMDM2OTgxLCAgMS4wMzA5MDkzNywKKyAgICAgMS4wMzE0NDc2OCwgIDEuMDMxOTg0NjAsICAxLjAzMjUyMDAwLCAgMS4wMzMwNTM4NCwKKyAgICAgMS4wMzM1ODYxNywgIDEuMDM0MTE3MDcsICAxLjAzNDY0NjU5LCAgMS4wMzUxNzQ3MCwKKyAgICAgMS4wMzU3MDEyOCwgIDEuMDM2MjI2MjAsICAxLjAzNjc0OTM0LCAgMS4wMzcyNzA2NiwKKyAgICAgMS4wMzc3OTAyNCwgIDEuMDM4MzA4MTUsICAxLjAzODgyNDQ2LCAgMS4wMzkzMzkxNCwKKyAgICAgMS4wMzk4NTIwNiwgIDEuMDQwMzYzMTIsICAxLjA0MDg3MjE3LCAgMS4wNDEzNzkyMCwKKyAgICAgMS4wNDE4ODQyOCwgIDEuMDQyMzg3NDgsICAxLjA0Mjg4ODg4LCAgMS4wNDMzODg0NSwKKyAgICAgMS4wNDM4ODYxMCwgIDEuMDQ0MzgxNzAsICAxLjA0NDg3NTE1LCAgMS4wNDUzNjY0NSwKKyAgICAgMS4wNDU4NTU2OSwgIDEuMDQ2MzQyOTcsICAxLjA0NjgyODM4LCAgMS4wNDczMTE5MiwKKyAgICAgMS4wNDc3OTM1MCwgIDEuMDQ4MjczMDMsICAxLjA0ODc1MDQyLCAgMS4wNDkyMjU2OCwKKyAgICAgMS4wNDk2OTg5MSwgIDEuMDUwMTcwMjIsICAxLjA1MDYzOTc0LCAgMS4wNTExMDc0NiwKKyAgICAgMS4wNTE1NzMzMiwgIDEuMDUyMDM3MjEsICAxLjA1MjQ5OTA3LCAgMS4wNTI5NTg4OSwKKyAgICAgMS4wNTM0MTY3NiwgIDEuMDUzODcyNzcsICAxLjA1NDMyNzAwLCAgMS4wNTQ3Nzk0OCwKKyAgICAgMS4wNTUyMzAxOCwgIDEuMDU1Njc5MDYsICAxLjA1NjEyNjA4LCAgMS4wNTY1NzEyNCwKKyAgICAgMS4wNTcwMTQ1OSwgIDEuMDU3NDU2MTYsICAxLjA1Nzg5NjAxLCAgMS4wNTgzMzQyNiwKKyAgICAgMS4wNTg3NzEwOSwgIDEuMDU5MjA2NjksICAxLjA1OTY0MTI1LCAgMS4wNjAwNzQ0NCwKKyAgICAgMS4wNjA1MDU0MiwgIDEuMDYwOTMzMzUsICAxLjA2MTM1NzQ2LCAgMS4wNjE3NzkwOSwKKyAgICAgMS4wNjIyMDE2NCwgIDEuMDYyNjI4NTgsICAxLjA2MzA2MzA5LCAgMS4wNjM1MDA1MCwKKyAgICAgMS4wNjM5MjgzNywgIDEuMDY0MzMzOTEsICAxLjA2NDcwNDQzLCAgMS4wNjUwMjk5NiwKKyAgICAgMS4wNjQ4MTA3NiwgIDEuMDY0Njk3NjUsICAxLjA2NDQ1MDA0LCAgMS4wNjQwODAwMiwKKyAgICAgMS4wNjM2MTM4MiwgIDEuMDYzMDc3MTksICAxLjA2MjQ5NDUzLCAgMS4wNjE4ODM2NSwKKyAgICAgMS4wNjEyNTYxMiwgIDEuMDYwNjIyOTEsICAxLjA1OTk5NDE4LCAgMS4wNTkzNzEzMiwKKyAgICAgMS4wNTg3NDcyNiwgIDEuMDU4MTE0ODYsICAxLjA1NzQ2NzI4LCAgMS4wNTY4MDAwMCwKKyAgICAgMS4wNTYxMTA3MCwgIDEuMDU1Mzk3MTUsICAxLjA1NDY1NzM1LCAgMS4wNTM4OTMyOSwKKyAgICAgMS4wNTMxMTA4MywgIDEuMDUyMzE1NzgsICAxLjA1MTUxMzcyLCAgMS4wNTA3MDgxMSwKKyAgICAgMS4wNDk5MDA0NCwgIDEuMDQ5MDkyMTAsICAxLjA0ODI4NDM0LCAgMS4wNDc0NzY0NywKKyAgICAgMS4wNDY2NjU5MCwgIDEuMDQ1ODUwMDMsICAxLjA0NTAyNjI4LCAgMS4wNDQxOTAwOSwKKyAgICAgMS4wNDMzMzQ5OSwgIDEuMDQyNDU0NTIsICAxLjA0MTU0MjQ0LCAgMS4wNDA1OTQ1MiwKKyAgICAgMS4wMzk2MDg0NiwgIDEuMDM4NTgyMDcsICAxLjAzNzUxMzI2LCAgMS4wMzY0MDE4OSwKKyAgICAgMS4wMzUyNDk3NiwgIDEuMDM0MDU4NjgsICAxLjAzMjgzMDQ3LCAgMS4wMzE1NjgxMiwKKyAgICAgMS4wMzAyNzU3NCwgIDEuMDI4OTU3NDMsICAxLjAyNzYxNzE3LCAgMS4wMjYyNTgwNCwKKyAgICAgMS4wMjQ4ODIyMiwgIDEuMDIzNDkxODQsICAxLjAyMjA4ODkyLCAgMS4wMjA2NzQ1MCwKKyAgICAgMS4wMTkyNDg2MSwgIDEuMDE3ODExMjMsICAxLjAxNjM2MjI5LCAgMS4wMTQ5MDA0NSwKKyAgICAgMS4wMTM0MjMxNSwgIDEuMDExOTI3NzgsICAxLjAxMDQxMTc1LCAgMS4wMDg4NzI4NCwKKyAgICAgMS4wMDczMDkxNSwgIDEuMDA1NzE4ODIsICAxLjAwNDA5OTk2LCAgMS4wMDI0NTAzMiwKKyAgICAgMS4wMDA3NjczNCwgIDAuOTk5MDQ4NDIsICAwLjk5NzI5MTAxLCAgMC45OTU0OTM4MCwKKyAgICAgMC45OTM2NTY2NCwgIDAuOTkxNzc5NDYsICAwLjk4OTg2MjM0LCAgMC45ODc5MTAyNCwKKyAgICAgMC45ODU5MzI5NCwgIDAuOTgzOTQwMzcsICAwLjk4MTk0MjI2LCAgMC45Nzk5NDUzMiwKKyAgICAgMC45Nzc5NTMyNCwgIDAuOTc1OTY5NTUsICAwLjk3Mzk5NzQ4LCAgMC45NzIwMzMyNiwKKyAgICAgMC45NzAwNjYyNCwgIDAuOTY4MDg1NDYsICAwLjk2NjA4MDE4LCAgMC45NjQwNDQxNiwKKyAgICAgMC45NjE5NzU1NiwgIDAuOTU5ODcyNzYsICAwLjk1NzczNDIwLCAgMC45NTU1NjAxOCwKKyAgICAgMC45NTMzNTI5MSwgIDAuOTUxMTE0NjIsICAwLjk0ODg0NzY0LCAgMC45NDY1NTY2MywKKyAgICAgMC45NDQyNDg1OCwgIDAuOTQxOTMwNTUsICAwLjkzOTYwOTUzLCAgMC45MzcyOTE1NCwKKyAgICAgMC45MzQ5ODE1NywgIDAuOTMyNjg0NTYsICAwLjkzMDQwNTAzLCAgMC45MjgxMzc3MSwKKyAgICAgMC45MjU4Njc1NSwgIDAuOTIzNTc5MTAsICAwLjkyMTI1NzMxLCAgMC45MTg4OTY0MiwKKyAgICAgMC45MTY0OTk5OCwgIDAuOTE0MDcxOTEsICAwLjkxMTYxNjIzLCAgMC45MDkxMzk3NSwKKyAgICAgMC45MDY2NTIwMiwgIDAuOTA0MTYyNzEsICAwLjkwMTY4MTE1LCAgMC44OTkyMDkzNCwKKyAgICAgMC44OTY3NDE4OSwgIDAuODk0MjczMTIsICAwLjg5MTc5NzQzLCAgMC44ODkzMTE0NywKKyAgICAgMC44ODY4MTQxNSwgIDAuODg0MzA0NDUsICAwLjg4MTc4MTQxLCAgMC44NzkyNDUyOCwKKyAgICAgMC44NzY2OTc1MywgIDAuODc0MTM5NjYsICAwLjg3MTU3MzE4LCAgMC44Njg5OTk1OCwKKyAgICAgMC44NjY0MjAzNywgIDAuODYzODM3MDMsICAwLjg2MTI1MTA2LCAgMC44NTg2NjM5MywKKyAgICAgMC44NTYwNDIzNiwgIDAuODUzNDQzODUsICAwLjg1MDgzMDkzLCAgMC44NDgyMDU1MCwKKyAgICAgMC44NDU1Njk0MywgIDAuODQyOTI0NTgsICAwLjg0MDI3Mjc4LCAgMC44Mzc2MTU4NiwKKyAgICAgMC44MzQ5NTU2NSwgIDAuODMyMjkzOTMsICAwLjgyOTYzMjQzLCAgMC44MjY5NzEzNSwKKyAgICAgMC44MjQzMDkzMywgIDAuODIxNjQ0OTYsICAwLjgxODk3NjY5LCAgMC44MTYzMDAxNywKKyAgICAgMC44MTM2MDgyMiwgIDAuODEwODkzNTUsICAwLjgwODE0OTI0LCAgMC44MDUzNzc0MSwKKyAgICAgMC44MDI1ODkyMCwgIDAuNzk5Nzk2MTEsICAwLjc5NzAwOTU0LCAgMC43OTQyMzgxMywKKyAgICAgMC43OTE0ODc4MCwgIDAuNzg4NzY0MzIsICAwLjc4NjA3MjkwLCAgMC43ODM0MDU5MCwKKyAgICAgMC43ODA3NDI4OCwgIDAuNzc4MDYyNzksICAwLjc3NTM0NTE0LCAgMC43NzI1ODE4NywKKyAgICAgMC43Njk3NzczNywgIDAuNzY2OTM2NTQsICAwLjc2NDA2NDQxLCAgMC43NjExNjg1MSwKKyAgICAgMC43NTgyNTg5MiwgIDAuNzU1MzQ1ODIsICAwLjc1MjQzOTI0LCAgMC43NDk1NDYzNCwKKyAgICAgMC43NDY2NzEzNSwgIDAuNzQzODE4NDAsICAwLjc0MDk5MTQ1LCAgMC43MzgxOTE0NywKKyAgICAgMC43MzU0MTY0MSwgIDAuNzMyNjY0MDgsICAwLjcyOTkzMTkzLCAgMC43MjcyMDkxMywKKyAgICAgMC43MjQ0NzY2MSwgIDAuNzIxNzE0OTQsICAwLjcxODkwNTE1LCAgMC43MTYwMzkzMiwKKyAgICAgMC43MTMxMjA1NiwgIDAuNzEwMTUyNTAsICAwLjcwNzEzOTAwLCAgMC43MDQwOTA4NCwKKyAgICAgMC43MDEwMjU2NSwgIDAuNjk3OTYxMzcsICAwLjY5NDkxNTU2LCAgMC42OTE4OTc3MiwKKyAgICAgMC42ODg5MDkzMSwgIDAuNjg1OTUxNDEsICAwLjY4MzAyNDk4LCAgMC42ODAxMjg1MiwKKyAgICAgMC42NzcyNTgwMSwgIDAuNjc0NDA5MzYsICAwLjY3MTU3ODQxLCAgMC42Njg3NjA4MSwKKyAgICAgMC42NjU5NTE5NSwgIDAuNjYzMTQ3MjIsICAwLjY2MDM0MTk0LCAgMC42NTc1MzAyNywKKyAgICAgMC42NTQ3MDUyNSwgIDAuNjUxODU5ODQsICAwLjY0ODk4NzA5LCAgMC42NDYwODIxNCwKKyAgICAgMC42NDMxNDIyMSwgIDAuNjQwMTY0NjAsICAwLjYzNzE0NjgwLCAgMC42MzQwOTAzNCwKKyAgICAgMC42MzEwMDA4MiwgIDAuNjI3ODg0MDAsICAwLjYyNDc0NTc3LCAgMC42MjE1OTQ3MywKKyAgICAgMC42MTg0NDIyNSwgIDAuNjE1Mjk5NzcsICAwLjYxMjE3ODY2LCAgMC42MDkwODgxMSwKKyAgICAgMC42MDYwMzUxMCwgIDAuNjAzMDI2NTQsICAwLjYwMDA2OTE2LCAgMC41OTcxNjU4OCwKKyAgICAgMC41OTQzMTU4MCwgIDAuNTkxNTE3ODcsICAwLjU4ODc3MDY4LCAgMC41ODYwNjQ5NSwKKyAgICAgMC41ODMzODM1MywgIDAuNTgwNzA4OTEsICAwLjU3ODAyMzU2LCAgMC41NzUzMDg2NCwKKyAgICAgMC41NzI1NDQwNCwgIDAuNTY5NzA5NTgsICAwLjU2Njc4NTc3LCAgMC41NjM3Njg2MCwKKyAgICAgMC41NjA2Njk1MSwgIDAuNTU3NTAwNjQsICAwLjU1NDI3NDUxLCAgMC41NTEwMTMwMSwKKyAgICAgMC41NDc3NDczMiwgIDAuNTQ0NTA5MDcsICAwLjU0MTMyOTM2LCAgMC41MzgyMjc0NCwKKyAgICAgMC41MzUyMTA3MiwgIDAuNTMyMjg2MTMsICAwLjUyOTQ1OTc5LCAgMC41MjY3MTk5NywKKyAgICAgMC41MjQwMzcwOCwgIDAuNTIxMzgwNzIsICAwLjUxODcyMDg1LCAgMC41MTYwMzU3MCwKKyAgICAgMC41MTMzMTE3MCwgIDAuNTEwNTM1NjAsICAwLjUwNzY5NDY2LCAgMC41MDQ3ODkzMSwKKyAgICAgMC41MDE4MzMwOCwgIDAuNDk4ODQwMDEsICAwLjQ5NTgyNDA2LCAgMC40OTI3OTkwNSwKKyAgICAgMC40ODk4NTc0OCwgIDAuNDg2Nzk2NDEsICAwLjQ4Mzc5NDI5LCAgMC40ODA4NTM2MywKKyAgICAgMC40Nzc5NjU3NiwgIDAuNDc1MTIxNTEsICAwLjQ3MjMxMTUxLCAgMC40Njk1MjQwMiwKKyAgICAgMC40NjY3NDQ4NiwgIDAuNDYzOTU5NzgsICAwLjQ2MTE1NDk2LCAgMC40NTgzMjYwNywKKyAgICAgMC40NTU0NzgzMCwgIDAuNDUyNjE3MjcsICAwLjQ0OTc0ODY2LCAgMC40NDY4ODAxMSwKKyAgICAgMC40NDQwMjEyNSwgIDAuNDQxMTgxNzgsICAwLjQzODM3MDk0LCAgMC40MzU1ODc3MiwKKyAgICAgMC40MzI4MjA4MiwgIDAuNDMwMDU4NDcsICAwLjQyNzI4OTEzLCAgMC40MjQ1MDU3MiwKKyAgICAgMC40MjE3MDU2NywgIDAuNDE4ODg2NTgsICAwLjQxNjA0NjMzLCAgMC40MTMxODg5NywKKyAgICAgMC40MTAzMjQ3MiwgIDAuNDA3NDY0MDUsICAwLjQwNDYxNzI0LCAgMC40MDE3ODk0MywKKyAgICAgMC4zOTg5ODA2NiwgIDAuMzk2MTkwNzMsICAwLjM5MzQxOTQwLCAgMC4zOTA2NjUxOSwKKyAgICAgMC4zODc5MjUzNiwgIDAuMzg1MTk3MTMsICAwLjM4MjQ3NzczLCAgMC4zNzk3NjQ3NiwKKyAgICAgMC4zNzcwNTYyMCwgIDAuMzc0MzUwMDYsICAwLjM3MTY0NDM4LCAgMC4zNjg5Mzg2OSwKKyAgICAgMC4zNjYyMzM5NiwgIDAuMzYzNTMxMjQsICAwLjM2MDgzMTUzLCAgMC4zNTgxMzUzMywKKyAgICAgMC4zNTU0NDI2MiwgIDAuMzUyNzUzMzgsICAwLjM1MDA2NzU1LCAgMC4zNDczODUzMCwKKyAgICAgMC4zNDQ3MDY5OSwgIDAuMzQyMDMyOTYsICAwLjMzOTM2MzU5LCAgMC4zMzY2OTkyMiwKKyAgICAgMC4zMzQwNDAyNywgIDAuMzMxMzg3MTEsICAwLjMyODc0MDEzLCAgMC4zMjYwOTk0NCwKKyAgICAgMC4zMjM0NjQ5MywgIDAuMzIwODM2NDUsICAwLjMxODIxMzg4LCAgMC4zMTU1OTcwMywKKyAgICAgMC4zMTI5ODU3MywgIDAuMzEwMzc5ODcsICAwLjMwNzc3OTQxLCAgMC4zMDUxODQ0NiwKKyAgICAgMC4zMDI1OTUyNSwgIDAuMzAwMDEyMDIsICAwLjI5NzQzNDk5LCAgMC4yOTQ4NjQyOCwKKyAgICAgMC4yOTIyOTk4OSwgIDAuMjg5NzQxNzksICAwLjI4NzE4OTk3LCAgMC4yODQ2NDQ1MiwKKyAgICAgMC4yODIxMDU2MiwgIDAuMjc5NTczNDYsICAwLjI3NzA0ODIwLCAgMC4yNzQ1Mjk5MiwKKyAgICAgMC4yNzIwMTg1NCwgIDAuMjY5NTEzOTksICAwLjI2NzAxNjIyLCAgMC4yNjQ1MjUzMywKKyAgICAgMC4yNjIwNDE1OCwgIDAuMjU5NTY1MjYsICAwLjI1NzA5NjYyLCAgMC4yNTQ2MzU4MywKKyAgICAgMC4yNTIxODI5NCwgIDAuMjQ5NzM3OTgsICAwLjI0NzMwMTAwLCAgMC4yNDQ4NzIwNywKKyAgICAgMC4yNDI0NTEzMywgIDAuMjQwMDM4OTMsICAwLjIzNzYzNTAwLCAgMC4yMzUyMzk1OSwKKyAgICAgMC4yMzI4NTI2MiwgIDAuMjMwNDc0MDEsICAwLjIyODEwMzY5LCAgMC4yMjU3NDE3MCwKKyAgICAgMC4yMjMzODgxOCwgIDAuMjIxMDQzMjksICAwLjIxODcwNzE5LCAgMC4yMTYzNzk4NiwKKyAgICAgMC4yMTQwNjExNywgIDAuMjExNzUwOTUsICAwLjIwOTQ0OTA0LCAgMC4yMDcxNTUzNSwKKyAgICAgMC4yMDQ4Njk4NywgIDAuMjAyNTkyNjEsICAwLjIwMDMyMzU2LCAgMC4xOTgwNjI1OSwKKyAgICAgMC4xOTU4MDk0NCwgIDAuMTkzNTYzODUsICAwLjE5MTMyNTU2LCAgMC4xODkwOTQ0MiwKKyAgICAgMC4xODY4NzA0MCwgIDAuMTg0NjUzNTAsICAwLjE4MjQ0MzcyLCAgMC4xODAyNDE2NCwKKyAgICAgMC4xNzgwNDg0MSwgIDAuMTc1ODY1MjEsICAwLjE3MzY5MzIyLCAgMC4xNzE1MzM2MCwKKyAgICAgMC4xNjkzODc1NSwgIDAuMTY3MjU2MjIsICAwLjE2NTE0MDgxLCAgMC4xNjMwNDI0NywKKyAgICAgMC4xNjA5ODk3NCwgIDAuMTU4OTY1NjEsICAwLjE1Njk2MDI2LCAgMC4xNTQ5NzI1OSwKKyAgICAgMC4xNTMwMDE1MSwgIDAuMTUxMDQ1OTAsICAwLjE0OTEwNDY2LCAgMC4xNDcxNzY2NiwKKyAgICAgMC4xNDUyNjA4MSwgIDAuMTQzMzU1OTksICAwLjE0MTQ2MTExLCAgMC4xMzk1NzU3MCwKKyAgICAgMC4xMzc2OTk5MywgIDAuMTM1ODMzOTksICAwLjEzMzk3ODA2LCAgMC4xMzIxMzIyOSwKKyAgICAgMC4xMzAyOTY4MiwgIDAuMTI4NDcxNzgsICAwLjEyNjY1NzI5LCAgMC4xMjQ4NTM1MywKKyAgICAgMC4xMjMwNjA3NCwgIDAuMTIxMjc5MTYsICAwLjExOTUwOTAwLCAgMC4xMTc3NTA0MywKKyAgICAgMC4xMTYwMDM0NywgIDAuMTE0MjY4MjAsICAwLjExMjU0NDY0LCAgMC4xMTA4MzI5MiwKKyAgICAgMC4xMDkxMzMxOCwgIDAuMTA3NDQ1NTksICAwLjEwNTc3MDI4LCAgMC4xMDQxMDczMywKKyAgICAgMC4xMDI0NTY3MiwgIDAuMTAwODE4NDIsICAwLjA5OTE5MjQwLCAgMC4wOTc1Nzg3MiwKKyAgICAgMC4wOTU5Nzc1MCwgIDAuMDk0Mzg4ODQsICAwLjA5MjgxMjg4LCAgMC4wOTEyNDk2NCwKKyAgICAgMC4wODk2OTkwNywgIDAuMDg4MTYxMTEsICAwLjA4NjYzNTcwLCAgMC4wODUxMjI4OCwKKyAgICAgMC4wODM2MjI3NCwgIDAuMDgyMTM1NDAsICAwLjA4MDY2MDk2LCAgMC4wNzkxOTk0NCwKKyAgICAgMC4wNzc3NTA3NiwgIDAuMDc2MzE0ODQsICAwLjA3NDg5MTYxLCAgMC4wNzM0ODEwOCwKKyAgICAgMC4wNzIwODMzNSwgIDAuMDcwNjk4NTEsICAwLjA2OTMyNjY2LCAgMC4wNjc5Njc4MSwKKyAgICAgMC4wNjY2MjE4NywgIDAuMDY1Mjg4NzQsICAwLjA2Mzk2ODMzLCAgMC4wNjI2NjA2NSwKKyAgICAgMC4wNjEzNjU3OCwgIDAuMDYwMDgzODAsICAwLjA1ODgxNDgwLCAgMC4wNTc1NTg3NiwKKyAgICAgMC4wNTYzMTU1NywgIDAuMDU1MDg1MTEsICAwLjA1Mzg2NzI4LCAgMC4wNTI2NjIwNiwKKyAgICAgMC4wNTE0Njk1MSwgIDAuMDUwMjg5NzEsICAwLjA0OTEyMjcyLCAgMC4wNDc5Njg1NSwKKyAgICAgMC4wNDY4MjcwOSwgIDAuMDQ1Njk4MjUsICAwLjA0NDU4MTk0LCAgMC4wNDM0NzgxNywKKyAgICAgMC4wNDIzODcwNCwgIDAuMDQxMzA4NjgsICAwLjA0MDI0MzE4LCAgMC4wMzkxOTA1NiwKKyAgICAgMC4wMzgxNTA3MSwgIDAuMDM3MTIzNTIsICAwLjAzNjEwODkwLCAgMC4wMzUxMDY3OSwKKyAgICAgMC4wMzQxMTcyMCwgIDAuMDMzMTQwMTMsICAwLjAzMjE3NTYwLCAgMC4wMzEyMjM0MywKKyAgICAgMC4wMzAyODMzMiwgIDAuMDI5MzU0OTQsICAwLjAyODQzNzk5LCAgMC4wMjc1MzIzMCwKKyAgICAgMC4wMjY2Mzc4OCwgIDAuMDI1NzU0NzIsICAwLjAyNDg4MjgzLCAgMC4wMjQwMjIzMiwKKyAgICAgMC4wMjMxNzM0MSwgIDAuMDIyMzM2MzEsICAwLjAyMTUxMTI0LCAgMC4wMjA2OTg2NiwKKyAgICAgMC4wMTk4OTkyMiwgIDAuMDE5MTEzNTksICAwLjAxODM0MjQxLCAgMC4wMTc1ODU2MywKKyAgICAgMC4wMTY4NDI0OCwgIDAuMDE2MTEyMTksICAwLjAxNTM5Mzk3LCAgMC4wMTQ2ODcyNiwKKyAgICAgMC4wMTM5OTE2NywgIDAuMDEzMzA2ODcsICAwLjAxMjYzMjUwLCAgMC4wMTE5Njg3MSwKKyAgICAgMC4wMTEzMTYwOSwgIDAuMDEwNjc1MjcsICAwLjAxMDA0Njg0LCAgMC4wMDk0MzA3NywKKyAgICAgMC4wMDg4MjY0MSwgIDAuMDA4MjMzMDcsICAwLjAwNzY1MDExLCAgMC4wMDcwNzczNSwKKyAgICAgMC4wMDY1MTUxMywgIDAuMDA1OTYzNzcsICAwLjAwNTQyMzY0LCAgMC4wMDQ4OTUxNCwKKyAgICAgMC4wMDQzNzg4NCwgIDAuMDAzODc1MzAsICAwLjAwMzM4NTA5LCAgMC4wMDI5MDc5NSwKKyAgICAgMC4wMDI0NDI4MiwgIDAuMDAxOTg4NjAsICAwLjAwMTU0NDE3LCAgMC4wMDExMDgyNSwKKyAgICAgMC4wMDA2NzkzNCwgIDAuMDAwMjU1ODksIC0wLjAwMDE2MzU3LCAtMC4wMDA1Nzg5NywKKyAgICAtMC4wMDA5ODg2NSwgLTAuMDAxMzkwODksIC0wLjAwMTc4Mzk3LCAtMC4wMDIxNjU0NywKKyAgICAtMC4wMDI1MzIzMCwgLTAuMDAyODgxMzMsIC0wLjAwMzIwOTU1LCAtMC4wMDM1MTYyNiwKKyAgICAtMC4wMDM4MDMxNSwgLTAuMDA0MDcxOTgsIC0wLjAwNDMyNDU3LCAtMC4wMDQ1NjM3MywKKyAgICAtMC4wMDQ3OTMyNiwgLTAuMDA1MDE2OTksIC0wLjAwNTIzODcxLCAtMC4wMDU0NjA2NiwKKyAgICAtMC4wMDU2ODM2MCwgLTAuMDA1OTA4MjEsIC0wLjAwNjEzNTA4LCAtMC4wMDYzNjMxMSwKKyAgICAtMC4wMDY1ODk0NCwgLTAuMDA2ODExMTcsIC0wLjAwNzAyNTQwLCAtMC4wMDcyMjk4MiwKKyAgICAtMC4wMDc0MjI2OCwgLTAuMDA3NjAyMjYsIC0wLjAwNzc2Njg3LCAtMC4wMDc5MTU4MCwKKyAgICAtMC4wMDgwNDkzMywgLTAuMDA4MTY3NzQsIC0wLjAwODI3MTM5LCAtMC4wMDgzNjEyMiwKKyAgICAtMC4wMDg0Mzg4MiwgLTAuMDA4NTA1ODMsIC0wLjAwODU2MzgzLCAtMC4wMDg2MTQzMCwKKyAgICAtMC4wMDg2NTg1MywgLTAuMDA4Njk3ODEsIC0wLjAwODczMzQ0LCAtMC4wMDg3NjYzMywKKyAgICAtMC4wMDg3OTcwNywgLTAuMDA4ODI2MjIsIC0wLjAwODg1NDMzLCAtMC4wMDg4ODEzMiwKKyAgICAtMC4wMDg5MDY1MiwgLTAuMDA4OTI5MjUsIC0wLjAwODk0ODgxLCAtMC4wMDg5NjQ0NiwKKyAgICAtMC4wMDg5NzU0MSwgLTAuMDA4OTgwODgsIC0wLjAwODk4MDEwLCAtMC4wMDg5NzIzNCwKKyAgICAtMC4wMDg5NTY5NiwgLTAuMDA4OTMzMzAsIC0wLjAwODkwMDc2LCAtMC4wMDg4NTkxNCwKKyAgICAtMC4wMDg4MDg3NSwgLTAuMDA4NzQ5ODcsIC0wLjAwODY4MjgyLCAtMC4wMDg2MDgyNSwKKyAgICAtMC4wMDg1MjcxNiwgLTAuMDA4NDQwNTUsIC0wLjAwODM0OTQxLCAtMC4wMDgyNTQ4NSwKKyAgICAtMC4wMDgxNTgwNywgLTAuMDA4MDYwMjUsIC0wLjAwNzk2MjUzLCAtMC4wMDc4NjUxOSwKKyAgICAtMC4wMDc3Njc2NywgLTAuMDA3NjY5MzcsIC0wLjAwNzU2OTcxLCAtMC4wMDc0Njc5MCwKKyAgICAtMC4wMDczNjMwNSwgLTAuMDA3MjU0MjIsIC0wLjAwNzE0MDU1LCAtMC4wMDcwMjE2MSwKKyAgICAtMC4wMDY4OTc0NiwgLTAuMDA2NzY4MTYsIC0wLjAwNjYzMzgxLCAtMC4wMDY0OTQ4OSwKKyAgICAtMC4wMDYzNTIzMCwgLTAuMDA2MjA2OTQsIC0wLjAwNjA1OTY5LCAtMC4wMDU5MTExNiwKKyAgICAtMC4wMDU3NjE2NywgLTAuMDA1NjExNTUsIC0wLjAwNTQ2MTEwLCAtMC4wMDUzMTAzNywKKyAgICAtMC4wMDUxNTkxNywgLTAuMDA1MDA3MzIsIC0wLjAwNDg1NDYyLCAtMC4wMDQ3MDA3NSwKKyAgICAtMC4wMDQ1NDUzMCwgLTAuMDA0Mzg3ODYsIC0wLjAwNDIyODA1LCAtMC4wMDQwNjU5NCwKKyAgICAtMC4wMDM5MDIwNCwgLTAuMDAzNzM2ODYsIC0wLjAwMzU3MDkxLCAtMC4wMDM0MDQ0OCwKKyAgICAtMC4wMDMyMzc3MCwgLTAuMDAzMDcwNjYsIC0wLjAwMjkwMzQ0LCAtMC4wMDI3MzYxMCwKKyAgICAtMC4wMDI1Njg2NywgLTAuMDAyNDAxMTcsIC0wLjAwMjIzMzY1LCAtMC4wMDIwNjYxNCwKKyAgICAtMC4wMDE4OTg2NiwgLTAuMDAxNzMxMjMsIC0wLjAwMTU2MzkwLCAtMC4wMDEzOTY3NCwKKyAgICAtMC4wMDEyMjk4OSwgLTAuMDAxMDYzNTEsIC0wLjAwMDg5NzcyLCAtMC4wMDA3MzI2NywKKyAgICAtMC4wMDA1Njg0OSwgLTAuMDAwNDA1MzAsIC0wLjAwMDI0MzI0LCAtMC4wMDAwODI0MSwKKyAgICAgMC4wMDAwODIxNCwgIDAuMDAwMjQxMDIsICAwLjAwMDM5OTIyLCAgMC4wMDA1NTY2MCwKKyAgICAgMC4wMDA3MTI5OSwgIDAuMDAwODY4MjYsICAwLjAwMTAyMjI0LCAgMC4wMDExNzQ4MCwKKyAgICAgMC4wMDEzMjU3OSwgIDAuMDAxNDc1MDcsICAwLjAwMTYyMjUyLCAgMC4wMDE3NjgwNCwKKyAgICAgMC4wMDE5MTE2MSwgIDAuMDAyMDUzMTksICAwLjAwMjE5Mjc3LCAgMC4wMDIzMzAyOSwKKyAgICAgMC4wMDI0NjU2NywgIDAuMDAyNTk4ODYsICAwLjAwMjcyOTc1LCAgMC4wMDI4NTgzMiwKKyAgICAgMC4wMDI5ODQ1MywgIDAuMDAzMTA4MzksICAwLjAwMzIyOTkwLCAgMC4wMDMzNDg4NiwKKyAgICAgMC4wMDM0NjQ5NCwgIDAuMDAzNTc3NzgsICAwLjAwMzY4NzA2LCAgMC4wMDM3OTI3MywKKyAgICAgMC4wMDM4OTUwMSwgIDAuMDAzOTk0MTEsICAwLjAwNDA5MDIwLCAgMC4wMDQxODM1MCwKKyAgICAgMC4wMDQyNzQxOSwgIDAuMDA0MzYyNDksICAwLjAwNDQ0ODU4LCAgMC4wMDQ1MzI1MCwKKyAgICAgMC4wMDQ2MTQxMSwgIDAuMDA0NjkzMjgsICAwLjAwNDc2OTg4LCAgMC4wMDQ4NDM1NiwKKyAgICAgMC4wMDQ5MTM3NSwgIDAuMDA0OTc5ODcsICAwLjAwNTA0MTM5LCAgMC4wMDUwOTgwNiwKKyAgICAgMC4wMDUxNDk5MCwgIDAuMDA1MTk2OTMsICAwLjAwNTIzOTIwLCAgMC4wMDUyNzcwMCwKKyAgICAgMC4wMDUzMTA4MywgIDAuMDA1MzQxMjIsICAwLjAwNTM2ODY0LCAgMC4wMDUzOTM1NywKKyAgICAgMC4wMDU0MTY0OSwgIDAuMDA1NDM3ODUsICAwLjAwNTQ1ODA5LCAgMC4wMDU0NzcxMywKKyAgICAgMC4wMDU0OTQ0MSwgIDAuMDA1NTA5MzYsICAwLjAwNTUyMTQ2LCAgMC4wMDU1MzAxNywKKyAgICAgMC4wMDU1MzQ5NCwgIDAuMDA1NTM1MjQsICAwLjAwNTUzMDU4LCAgMC4wMDU1MjA2NSwKKyAgICAgMC4wMDU1MDUzNiwgIDAuMDA1NDg0NTksICAwLjAwNTQ1ODI4LCAgMC4wMDU0MjY2MiwKKyAgICAgMC4wMDUzOTAwNywgIDAuMDA1MzQ5MTAsICAwLjAwNTMwNDE1LCAgMC4wMDUyNTU2OCwKKyAgICAgMC4wMDUyMDQxNywgIDAuMDA1MTUwMDksICAwLjAwNTA5Mzg3LCAgMC4wMDUwMzU5NSwKKyAgICAgMC4wMDQ5NzY3NCwgIDAuMDA0OTE2NjUsICAwLjAwNDg1NjA1LCAgMC4wMDQ3OTUwMywKKyAgICAgMC4wMDQ3MzMzNiwgIDAuMDA0NjcwODIsICAwLjAwNDYwNzIxLCAgMC4wMDQ1NDIxNiwKKyAgICAgMC4wMDQ0NzUxNywgIDAuMDA0NDA1NzUsICAwLjAwNDMzMzQ0LCAgMC4wMDQyNTc2OCwKKyAgICAgMC4wMDQxNzc4NiwgIDAuMDA0MDkzMzYsICAwLjAwNDAwMzYzLCAgMC4wMDM5MDgzNywKKyAgICAgMC4wMDM4MDc1OSwgIDAuMDAzNzAxMzAsICAwLjAwMzU4OTUyLCAgMC4wMDM0NzI2OCwKKyAgICAgMC4wMDMzNTE1NywgIDAuMDAzMjI2OTksICAwLjAwMzA5OTc1LCAgMC4wMDI5NzA4OCwKKyAgICAgMC4wMDI4NDE2NCwgIDAuMDAyNzEzMjgsICAwLjAwMjU4NzAwLCAgMC4wMDI0NjMyOCwKKyAgICAgMC4wMDIzNDE5NSwgIDAuMDAyMjIyODEsICAwLjAwMjEwNTYyLCAgMC4wMDE5ODk1OCwKKyAgICAgMC4wMDE4NzMzMSwgIDAuMDAxNzU1NDYsICAwLjAwMTYzNDc0LCAgMC4wMDE1MTAyMCwKKyAgICAgMC4wMDEzODEzMCwgIDAuMDAxMjQ3NTAsICAwLjAwMTEwODMxLCAgMC4wMDA5NjQxMSwKKyAgICAgMC4wMDA4MTYxMSwgIDAuMDAwNjY1NTQsICAwLjAwMDUxMzYzLCAgMC4wMDAzNjEzNCwKKyAgICAgMC4wMDAyMDk0MCwgIDAuMDAwMDU4NTMsIC0wLjAwMDA5MDU4LCAtMC4wMDAyMzc4MywKKyAgICAtMC4wMDAzODM2OCwgLTAuMDAwNTI4NjEsIC0wLjAwMDY3MzEwLCAtMC4wMDA4MTc1NywKKyAgICAtMC4wMDA5NjIzNywgLTAuMDAxMTA3ODYsIC0wLjAwMTI1NDQyLCAtMC4wMDE0MDIxMCwKKyAgICAtMC4wMDE1NTA2NSwgLTAuMDAxNjk5ODQsIC0wLjAwMTg0OTQwLCAtMC4wMDE5OTkxMCwKKyAgICAtMC4wMDIxNDg3MiwgLTAuMDAyMjk3OTgsIC0wLjAwMjQ0NjY0LCAtMC4wMDI1OTQ2MiwKKyAgICAtMC4wMDI3NDIwNSwgLTAuMDAyODg5MTIsIC0wLjAwMzAzNTk2LCAtMC4wMDMxODI1OSwKKyAgICAtMC4wMDMzMjg5MCwgLTAuMDAzNDc0ODAsIC0wLjAwMzYyMDI0LCAtMC4wMDM3NjUxOSwKKyAgICAtMC4wMDM5MDk2MiwgLTAuMDA0MDUzNDUsIC0wLjAwNDE5NjU4LCAtMC4wMDQzMzkwMiwKKyAgICAtMC4wMDQ0ODA4NSwgLTAuMDA0NjIyMTksIC0wLjAwNDc2MzA5LCAtMC4wMDQ5MDM1NywKKyAgICAtMC4wMDUwNDM2MSwgLTAuMDA1MTgzMjEsIC0wLjAwNTMyMjQzLCAtMC4wMDU0NjEzMiwKKyAgICAtMC4wMDU1OTk4OCwgLTAuMDA1NzM4MTEsIC0wLjAwNTg3NjAyLCAtMC4wMDYwMTM2MywKKyAgICAtMC4wMDYxNTA5NCwgLTAuMDA2Mjg3OTUsIC0wLjAwNjQyNDY2LCAtMC4wMDY1NjExMSwKKyAgICAtMC4wMDY2OTczNywgLTAuMDA2ODMzNTIsIC0wLjAwNjk2OTYzLCAtMC4wMDcxMDU3OCwKKyAgICAtMC4wMDcyNDIwOCwgLTAuMDA3Mzc4NjIsIC0wLjAwNzUxNTU0LCAtMC4wMDc2NTI5NSwKKyAgICAtMC4wMDc3OTA5OCwgLTAuMDA3OTI5NzYsIC0wLjAwODA2OTQxLCAtMC4wMDgyMTAwNiwKKyAgICAtMC4wMDgzNTE4MywgLTAuMDA4NDk0ODUsIC0wLjAwODYzOTI2LCAtMC4wMDg3ODUyMiwKKyAgICAtMC4wMDg5MzI5MywgLTAuMDA5MDgyNjAsIC0wLjAwOTIzNDQ0LCAtMC4wMDkzODg2NCwKKyAgICAtMC4wMDk1NDUzNywgLTAuMDA5NzA0ODIsIC0wLjAwOTg2NzE1LCAtMC4wMTAwMzE3MywKKyAgICAtMC4wMTAxOTcxMSwgLTAuMDEwMzYxNjQsIC0wLjAxMDUyMzU3LCAtMC4wMTA2ODE4NCwKKyAgICAtMC4wMTA4MzYyMiwgLTAuMDEwOTg2NTIsIC0wLjAxMTEzMjUyLCAtMC4wMTEyNzQwOSwKKyAgICAtMC4wMTE0MTExNCwgLTAuMDExNTQzNTgsIC0wLjAxMTY3MTM1LCAtMC4wMTE3OTQzOSwKKyAgICAtMC4wMTE5MTI2OCwgLTAuMDEyMDI2MTksIC0wLjAxMjEzNDkzLCAtMC4wMTIyMzg5MSwKKyAgICAtMC4wMTIzMzgxNywgLTAuMDEyNDMyNzUsIC0wLjAxMjUyMjcyLCAtMC4wMTI2MDgxNSwKKyAgICAtMC4wMTI2ODkxNSwgLTAuMDEyNzY1ODMsIC0wLjAxMjgzODMyLCAtMC4wMTI5MDY4NSwKKyAgICAtMC4wMTI5NzE3MSwgLTAuMDEzMDMzMjAsIC0wLjAxMzA5MTY4LCAtMC4wMTMxNDcyMiwKKyAgICAtMC4wMTMxOTk2OSwgLTAuMDEzMjQ4ODksIC0wLjAxMzI5NDY2LCAtMC4wMTMzMzY5MywKKyAgICAtMC4wMTMzNzU3NywgLTAuMDEzNDExMjUsIC0wLjAxMzQ0MzQ1LCAtMC4wMTM0NzI0MywKKyAgICAtMC4wMTM0OTgyMywgLTAuMDEzNTIwODksIC0wLjAxMzU0MDQ1LCAtMC4wMTM1NTcwMCwKKyAgICAtMC4wMTM1NzA2OCwgLTAuMDEzNTgxNjQsIC0wLjAxMzU5MDAzLCAtMC4wMTM1OTU4NywKKyAgICAtMC4wMTM1OTkwMSwgLTAuMDEzNTk5MzEsIC0wLjAxMzU5NjYxLCAtMC4wMTM1OTA4NywKKyAgICAtMC4wMTM1ODIxOSwgLTAuMDEzNTcwNjUsIC0wLjAxMzU1NjM3LCAtMC4wMTM1MzkzNSwKKyAgICAtMC4wMTM1MTk0OSwgLTAuMDEzNDk2NzAsIC0wLjAxMzQ3MDg4LCAtMC4wMTM0NDIxNCwKKyAgICAtMC4wMTM0MTA3OCwgLTAuMDEzMzc3MTUsIC0wLjAxMzM0MTU4LCAtMC4wMTMzMDQ0MiwKKyAgICAtMC4wMTMyNjYwMSwgLTAuMDEzMjI2NzEsIC0wLjAxMzE4Njg5LCAtMC4wMTMxNDY5MiwKKyAgICAtMC4wMTMxMDEyMywgLTAuMDEzMDY0NzAsIC0wLjAxMzAyNTU2LCAtMC4wMTI5ODM4MSwKKyAgICAtMC4wMTI5Mzk0OCwgLTAuMDEyODkyNTUsIC0wLjAxMjg0MzA1LCAtMC4wMTI3OTA5NSwKKyAgICAtMC4wMTI3MzYyNSwgLTAuMDEyNjc4OTMsIC0wLjAxMjYxODk3LCAtMC4wMTI1NTYzMiwKKyAgICAtMC4wMTI0OTA5NiwgLTAuMDEyNDIyODMsIC0wLjAxMjM1MTkwLCAtMC4wMTIyNzgyNywKKyAgICAtMC4wMTIyMDIxMywgLTAuMDEyMTIzNjYsIC0wLjAxMjA0MzA0LCAtMC4wMTE5NjAzMiwKKyAgICAtMC4wMTE4NzU0MywgLTAuMDExNzg4MjksIC0wLjAxMTY5ODg0LCAtMC4wMTE2MDcxOCwKKyAgICAtMC4wMTE1MTM1MiwgLTAuMDExNDE4MDksIC0wLjAxMTMyMTExLCAtMC4wMTEyMjI3MiwKKyAgICAtMC4wMTExMjMwNCwgLTAuMDExMDIyMTcsIC0wLjAxMDkyMDIyLCAtMC4wMTA4MTczMCwKKyAgICAtMC4wMTA3MTM1NSwgLTAuMDEwNjA5MTIsIC0wLjAxMDUwNDExLCAtMC4wMTAzOTg1NCwKKyAgICAtMC4wMTAyOTIyNywgLTAuMDEwMTg1MjEsIC0wLjAxMDA3NzI3LCAtMC4wMDk5Njg1OSwKKyAgICAtMC4wMDk4NTk1OSwgLTAuMDA5NzUwNjMsIC0wLjAwOTY0MjA4LCAtMC4wMDk1MzQyMCwKKyAgICAtMC4wMDk0MjcyMywgLTAuMDA5MzIxMzUsIC0wLjAwOTIxNjc3LCAtMC4wMDkxMTM2NCwKKyAgICAtMC4wMDkwMTIwOCwgLTAuMDA4OTEyMjAsIC0wLjAwODgxNDEyLCAtMC4wMDg3MTc5MiwKKyAgICAtMC4wMDg2MjM2OSwgLTAuMDA4NTMxNTMsIC0wLjAwODQ0MTQ5LCAtMC4wMDgzNTM2MCwKKyAgICAtMC4wMDgyNjc4NSwgLTAuMDA4MTg0MjIsIC0wLjAwODEwMjY3LCAtMC4wMDgwMjMxMiwKKyAgICAtMC4wMDc5NDU0NywgLTAuMDA3ODY5NTksIC0wLjAwNzc5NTMzLCAtMC4wMDc3MjE2NSwKKyAgICAtMC4wMDc2NDY3MywgLTAuMDA3NTY4ODYsIC0wLjAwNzQ4NjQ5LCAtMC4wMDczOTkwNSwKKyAgICAtMC4wMDczMDY4MSwgLTAuMDA3MjEwMDYsIC0wLjAwNzEwOTEwLCAtMC4wMDcwMDQxOSwKKyAgICAtMC4wMDY4OTU1OSwgLTAuMDA2NzgzNTQsIC0wLjAwNjY2ODI5LCAtMC4wMDY1NTAwNywKKyAgICAtMC4wMDY0MjkxNiwgLTAuMDA2MzA1NzksIC0wLjAwNjE4MDIyLCAtMC4wMDYwNTI2NywKKyAgICAtMC4wMDU5MjMzMywgLTAuMDA1NzkyNDAsIC0wLjAwNTY2MDA2LCAtMC4wMDU1MjY1MSwKKyAgICAtMC4wMDUzOTE5NCwgLTAuMDA1MjU2NTMsIC0wLjAwNTEyMDQ3LCAtMC4wMDQ5ODM5MCwKKyAgICAtMC4wMDQ4NDY5MywgLTAuMDA0NzA5NjksIC0wLjAwNDU3MjI4LCAtMC4wMDQ0MzQ4MiwKKyAgICAtMC4wMDQyOTc0NiwgLTAuMDA0MTYwMzQsIC0wLjAwNDAyMzU5LCAtMC4wMDM4ODczOCwKKyAgICAtMC4wMDM3NTE4NSwgLTAuMDAzNjE3MTgsIC0wLjAwMzQ4MzUwLCAtMC4wMDMzNTEwMCwKKyAgICAtMC4wMDMyMTk5MSwgLTAuMDAzMDkwNDMsIC0wLjAwMjk2Mjc2LCAtMC4wMDI4MzY5OCwKKyAgICAtMC4wMDI3MTMwNywgLTAuMDAyNTkwOTgsIC0wLjAwMjQ3MDY2LCAtMC4wMDIzNTIxMCwKKyAgICAtMC4wMDIyMzUzMSwgLTAuMDAyMTIwMzAsIC0wLjAwMjAwNzA5LCAtMC4wMDE4OTU3NiwKKyAgICAtMC4wMDE3ODY0NywgLTAuMDAxNjc5MzYsIC0wLjAwMTU3NDU3LCAtMC4wMDE0NzIxNiwKKyAgICAtMC4wMDEzNzIwNSwgLTAuMDAxMjc0MTgsIC0wLjAwMTE3ODQ5LCAtMC4wMDEwODQ5OCwKKyAgICAtMC4wMDA5OTM3NSwgLTAuMDAwOTA0ODYsIC0wLjAwMDgxODQwLCAtMC4wMDA3MzQ0NCwKKyAgICAtMC4wMDA2NTMwOSwgLTAuMDAwNTc0NDUsIC0wLjAwMDQ5ODYwLCAtMC4wMDA0MjU1MSwKKyAgICAtMC4wMDAzNTUwMywgLTAuMDAwMjg3MDAsIC0wLjAwMDIyMTI1LCAtMC4wMDAxNTc2MSwKKyAgICAtMC4wMDAwOTU4OCwgLTAuMDAwMDM1ODMsICAwLjAwMDAyMjcyLCAgMC4wMDAwNzk3NSwKKyAgICAgMC4wMDAxMzUwMSwgIDAuMDAwMTg4MjgsICAwLjAwMDIzOTMzLCAgMC4wMDAyODc4NCwKKyAgICAgMC4wMDAzMzM0MiwgIDAuMDAwMzc1NzIsICAwLjAwMDQxNDM4LCAgMC4wMDA0NDkzOSwKKyAgICAgMC4wMDA0ODEwMywgIDAuMDAwNTA5NTgsICAwLjAwMDUzNTMzLCAgMC4wMDA1NTg2OSwKKyAgICAgMC4wMDA1ODAxNSwgIDAuMDAwNjAwMjIsICAwLjAwMDYxOTM1LCAgMC4wMDA2Mzc4MSwKKyAgICAgMC4wMDA2NTU2OCwgIDAuMDAwNjczMDMsICAwLjAwMDY4OTkxLCAgMC4wMDA3MDYxOSwKKyAgICAgMC4wMDA3MjE1NSwgIDAuMDAwNzM1NjcsICAwLjAwMDc0ODI2LCAgMC4wMDA3NTkxMiwKKyAgICAgMC4wMDA3NjgxMSwgIDAuMDAwNzc1MDksICAwLjAwMDc3OTk3LCAgMC4wMDA3ODI3NSwKKyAgICAgMC4wMDA3ODM1MSwgIDAuMDAwNzgyMzcsICAwLjAwMDc3OTQzLCAgMC4wMDA3NzQ4NCwKKyAgICAgMC4wMDA3Njg4NCwgIDAuMDAwNzYxNjAsICAwLjAwMDc1MzM1LCAgMC4wMDA3NDQyMywKKyAgICAgMC4wMDA3MzQ0MiwgIDAuMDAwNzI0MDQsICAwLjAwMDcxMzIzLCAgMC4wMDA3MDIwOSwKKyAgICAgMC4wMDA2OTA2OCwgIDAuMDAwNjc5MDYsICAwLjAwMDY2NzI4LCAgMC4wMDA2NTUzNCwKKyAgICAgMC4wMDA2NDMyMSwgIDAuMDAwNjMwODYsICAwLjAwMDYxODI0LCAgMC4wMDA2MDUzNCwKKyAgICAgMC4wMDA1OTIxMSwgIDAuMDAwNTc4NTUsICAwLjAwMDU2NDYyLCAgMC4wMDA1NTAzMywKKyAgICAgMC4wMDA1MzU2NiwgIDAuMDAwNTIwNjMsICAwLjAwMDUwNTIyLCAgMC4wMDA0ODk0OSwKKyAgICAgMC4wMDA0NzM0OSwgIDAuMDAwNDU3MjgsICAwLjAwMDQ0MDkyLCAgMC4wMDA0MjQ0NywKKyAgICAgMC4wMDA0MDgwMywgIDAuMDAwMzkxNjYsICAwLjAwMDM3NTQ0LCAgMC4wMDAzNTk0MywKKyAgICAgMC4wMDAzNDM3MSwgIDAuMDAwMzI4MzMsICAwLjAwMDMxMzMzLCAgMC4wMDAyOTg3NCwKKyAgICAgMC4wMDAyODQ1MiwgIDAuMDAwMjcwNjcsICAwLjAwMDI1NzE1LCAgMC4wMDAyNDM5NSwKKyAgICAgMC4wMDAyMzEwNCwgIDAuMDAwMjE4NDIsICAwLjAwMDIwNjA2LCAgMC4wMDAxOTM5OCwKKyAgICAgMC4wMDAxODIxOCwgIDAuMDAwMTcwNjksICAwLjAwMDE1OTUzLCAgMC4wMDAxNDg3MSwKKyAgICAgMC4wMDAxMzgyNywgIDAuMDAwMTI4MjMsICAwLjAwMDExODYxLCAgMC4wMDAxMDk0MiwKKyAgICAgMC4wMDAxMDA2NywgIDAuMDAwMDkyMzYsICAwLjAwMDA4NDQ4LCAgMC4wMDAwNzcwMywKKyAgICAgMC4wMDAwNjk5OSwgIDAuMDAwMDYzMzcsICAwLjAwMDA1NzE0LCAgMC4wMDAwNTEyOSwKKyAgICAgMC4wMDAwNDU4MywgIDAuMDAwMDQwNzIsICAwLjAwMDAzNTk3LCAgMC4wMDAwMzE1NywKKyAgICAgMC4wMDAwMjc1MiwgIDAuMDAwMDIzODAsICAwLjAwMDAyMDQyLCAgMC4wMDAwMTczNiwKKyAgICAgMC4wMDAwMTQ2MSwgIDAuMDAwMDEyMTUsICAwLjAwMDAwOTk4LCAgMC4wMDAwMDgwNywKKyAgICAgMC4wMDAwMDY0MSwgIDAuMDAwMDA0OTksICAwLjAwMDAwMzc4LCAgMC4wMDAwMDI3OCwKKyAgICAgMC4wMDAwMDE5NiwgIDAuMDAwMDAxMzIsICAwLjAwMDAwMDgyLCAgMC4wMDAwMDA0NiwKKyAgICAgMC4wMDAwMDAyMCwgIDAuMDAwMDAwMDUsIC0wLjAwMDAwMDAzLCAtMC4wMDAwMDAwNiwKKyAgICAtMC4wMDAwMDAwNCwgLTAuMDAwMDAwMDEsICAwLjAwMDAwMDAxLCAgMC4wMDAwMDAwMSwKKyAgICAgMC4wMDAwMDAwMSwgIDAuMDAwMDAwMDEsIC0wLjAwMDAwMDAxLCAtMC4wMDAwMDAwNCwKKyAgICAtMC4wMDAwMDAwNSwgLTAuMDAwMDAwMDMsICAwLjAwMDAwMDA1LCAgMC4wMDAwMDAyMCwKKyAgICAgMC4wMDAwMDA0MywgIDAuMDAwMDAwNzcsICAwLjAwMDAwMTIzLCAgMC4wMDAwMDE4MywKKyAgICAgMC4wMDAwMDI1NywgIDAuMDAwMDAzNDgsICAwLjAwMDAwNDU1LCAgMC4wMDAwMDU4MSwKKyAgICAgMC4wMDAwMDcyNywgIDAuMDAwMDA4OTMsICAwLjAwMDAxMDgwLCAgMC4wMDAwMTI5MCwKKyAgICAgMC4wMDAwMTUyMiwgIDAuMDAwMDE3NzgsICAwLjAwMDAyMDU3LCAgMC4wMDAwMjM2MiwKKyAgICAgMC4wMDAwMjY5MSwgIDAuMDAwMDMwNDQsICAwLjAwMDAzNDIyLCAgMC4wMDAwMzgyNCwKKyAgICAgMC4wMDAwNDI1MCwgIDAuMDAwMDQ3MDEsICAwLjAwMDA1MTc2LCAgMC4wMDAwNTY3NiwKKyAgICAgMC4wMDAwNjIwMCwgIDAuMDAwMDY3NDksICAwLjAwMDA3MzIyLCAgMC4wMDAwNzkyMCwKKyAgICAgMC4wMDAwODU0MSwgIDAuMDAwMDkxODYsICAwLjAwMDA5ODU0LCAgMC4wMDAxMDU0MywKKyAgICAgMC4wMDAxMTI1MSwgIDAuMDAwMTE5NzUsICAwLjAwMDEyNzE0LCAgMC4wMDAxMzQ2NSwKKyAgICAgMC4wMDAxNDIyNywgIDAuMDAwMTQ5OTcsICAwLjAwMDE1Nzc1LCAgMC4wMDAxNjU1OCwKKyAgICAgMC4wMDAxNzM0OCwgIDAuMDAwMTgxNDQsICAwLjAwMDE4OTQ3LCAgMC4wMDAxOTc1NiwKKyAgICAgMC4wMDAyMDU3MywgIDAuMDAwMjEzOTksICAwLjAwMDIyMjMzLCAgMC4wMDAyMzA3NiwKKyAgICAgMC4wMDAyMzkyNCwgIDAuMDAwMjQ3NzMsICAwLjAwMDI1NjIxLCAgMC4wMDAyNjQ2MiwKKyAgICAgMC4wMDAyNzI5MywgIDAuMDAwMjgxMDgsICAwLjAwMDI4OTA0LCAgMC4wMDAyOTY3NSwKKyAgICAgMC4wMDAzMDQxOSwgIDAuMDAwMzExMzIsICAwLjAwMDMxODEwLCAgMC4wMDAzMjQ1MywKKyAgICAgMC4wMDAzMzA2MSwgIDAuMDAwMzM2MzIsICAwLjAwMDM0MTY5LCAgMC4wMDAzNDY3MiwKKyAgICAgMC4wMDAzNTE0MiwgIDAuMDAwMzU1ODAsICAwLjAwMDM1OTg4LCAgMC4wMDAzNjM2OSwKKyAgICAgMC4wMDAzNjcyMywgIDAuMDAwMzcwNTMsICAwLjAwMDM3MzYxLCAgMC4wMDAzNzY0NywKKyAgICAgMC4wMDAzNzkwOSwgIDAuMDAwMzgxNDUsICAwLjAwMDM4MzUyLCAgMC4wMDAzODUyNywKKyAgICAgMC4wMDAzODY2MywgIDAuMDAwMzg3NTcsICAwLjAwMDM4ODAxLCAgMC4wMDAzODc5MCwKKyAgICAgMC4wMDAzODcxNywgIDAuMDAwMzg1NzIsICAwLjAwMDM4MzUwLCAgMC4wMDAzODA0NCwKKyAgICAgMC4wMDAzNzY1MSwgIDAuMDAwMzcxNzAsICAwLjAwMDM2NTk3LCAgMC4wMDAzNTkzNiwKKyAgICAgMC4wMDAzNTE5MSwgIDAuMDAwMzQzNzAsICAwLjAwMDMzNDgwLCAgMC4wMDAzMjUzMSwKKyAgICAgMC4wMDAzMTUzNywgIDAuMDAwMzA1MTIsICAwLjAwMDI5NDcwLCAgMC4wMDAyODQxNywKKyAgICAgMC4wMDAyNzM1NCwgIDAuMDAwMjYyNzksICAwLjAwMDI1MTkxLCAgMC4wMDAyNDA4MSwKKyAgICAgMC4wMDAyMjkzMywgIDAuMDAwMjE3MzEsICAwLjAwMDIwNDU4LCAgMC4wMDAxOTEwMSwKKyAgICAgMC4wMDAxNzY1NCwgIDAuMDAwMTYxMDYsICAwLjAwMDE0NDUyLCAgMC4wMDAxMjY5NCwKKyAgICAgMC4wMDAxMDg0OCwgIDAuMDAwMDg5MjksICAwLjAwMDA2OTUzLCAgMC4wMDAwNDkzNSwKKyAgICAgMC4wMDAwMjg4NCwgIDAuMDAwMDA4MTMsIC0wLjAwMDAxMjY4LCAtMC4wMDAwMzM1NywKKyAgICAtMC4wMDAwNTQ1NywgLTAuMDAwMDc1NzQsIC0wLjAwMDA5NzE0LCAtMC4wMDAxMTg4MiwKKyAgICAtMC4wMDAxNDA4MiwgLTAuMDAwMTYzMTgsIC0wLjAwMDE4NTk1LCAtMC4wMDAyMDkxMiwKKyAgICAtMC4wMDAyMzI2NSwgLTAuMDAwMjU2NTAsIC0wLjAwMDI4MDYwLCAtMC4wMDAzMDQ5MiwKKyAgICAtMC4wMDAzMjk0MSwgLTAuMDAwMzU0MDAsIC0wLjAwMDM3ODY1LCAtMC4wMDA0MDMzMywKKyAgICAtMC4wMDA0MjgwNCwgLTAuMDAwNDUyNzksIC0wLjAwMDQ3NzU5LCAtMC4wMDA1MDI0MywKKyAgICAtMC4wMDA1MjcyOCwgLTAuMDAwNTUyMDksIC0wLjAwMDU3Njg1LCAtMC4wMDA2MDE1MywKKyAgICAtMC4wMDA2MjYxMSwgLTAuMDAwNjUwNTYsIC0wLjAwMDY3NDg1LCAtMC4wMDA2OTg5NSwKKyAgICAtMC4wMDA3MjI4NywgLTAuMDAwNzQ2NjAsIC0wLjAwMDc3MDEzLCAtMC4wMDA3OTM0NSwKKyAgICAtMC4wMDA4MTY1MywgLTAuMDAwODM5MzYsIC0wLjAwMDg2MTkyLCAtMC4wMDA4ODQyMSwKKyAgICAtMC4wMDA5MDYxOSwgLTAuMDAwOTI3ODYsIC0wLjAwMDk0OTE5LCAtMC4wMDA5NzAxNywKKyAgICAtMC4wMDA5OTA3NywgLTAuMDAxMDEwOTgsIC0wLjAwMTAzMDc3LCAtMC4wMDEwNTAxMiwKKyAgICAtMC4wMDEwNjkwNCwgLTAuMDAxMDg3NTAsIC0wLjAwMTEwNTQ5LCAtMC4wMDExMjMwMSwKKyAgICAtMC4wMDExNDAwNSwgLTAuMDAxMTU2NjAsIC0wLjAwMTE3MjY1LCAtMC4wMDExODgyMSwKKyAgICAtMC4wMDEyMDMyNSwgLTAuMDAxMjE3NzksIC0wLjAwMTIzMTgwLCAtMC4wMDEyNDUyOCwKKyAgICAtMC4wMDEyNTgyMiwgLTAuMDAxMjcwNjEsIC0wLjAwMTI4MjQzLCAtMC4wMDEyOTM2OCwKKyAgICAtMC4wMDEzMDQzNSwgLTAuMDAxMzE0NDUsIC0wLjAwMTMyMzk1LCAtMC4wMDEzMzI4NSwKKyAgICAtMC4wMDEzNDExMywgLTAuMDAxMzQ4NzgsIC0wLjAwMTM1NTc3LCAtMC4wMDEzNjIxNSwKKyAgICAtMC4wMDEzNjc5NywgLTAuMDAxMzczMzMsIC0wLjAwMTM3ODM0LCAtMC4wMDEzODMwNSwKKyAgICAtMC4wMDEzODc0OCwgLTAuMDAxMzkxNjMsIC0wLjAwMTM5NTUxLCAtMC4wMDEzOTkxMywKKyAgICAtMC4wMDE0MDI0OSwgLTAuMDAxNDA1NTksIC0wLjAwMTQwODQ0LCAtMC4wMDE0MTEwMiwKKyAgICAtMC4wMDE0MTMzNCwgLTAuMDAxNDE1MzgsIC0wLjAwMTQxNzE0LCAtMC4wMDE0MTg2MSwKKyAgICAtMC4wMDE0MTk3OCwgLTAuMDAxNDIwNjQsIC0wLjAwMTQyMTE3LCAtMC4wMDE0MjEzOCwKKyAgICAtMC4wMDE0MjEyNSwgLTAuMDAxNDIwNzcsIC0wLjAwMTQxOTkyLCAtMC4wMDE0MTg3MCwKKyAgICAtMC4wMDE0MTcxMCwgLTAuMDAxNDE1MTAsIC0wLjAwMTQxMjY4LCAtMC4wMDE0MDk4NiwKKyAgICAtMC4wMDE0MDY2MywgLTAuMDAxNDAzMDEsIC0wLjAwMTM5OTAwLCAtMC4wMDEzOTQ2MCwKKyAgICAtMC4wMDEzODk4MSwgLTAuMDAxMzg0NjQsIC0wLjAwMTM3OTA4LCAtMC4wMDEzNzMxMywKKyAgICAtMC4wMDEzNjY4MCwgLTAuMDAxMzYwMTAsIC0wLjAwMTM1MzAxLCAtMC4wMDEzNDU1NSwKKyAgICAtMC4wMDEzMzc3MiwgLTAuMDAxMzI5NTIsIC0wLjAwMTMyMDk1LCAtMC4wMDEzMTIwMSwKKyAgICAtMC4wMDEzMDI3MiwgLTAuMDAxMjkzMDcsIC0wLjAwMTI4MzA5LCAtMC4wMDEyNzI3NywKKyAgICAtMC4wMDEyNjIxMSwgLTAuMDAxMjUxMTMsIC0wLjAwMTIzOTgxLCAtMC4wMDEyMjgxNywKKyAgICAtMC4wMDEyMTYyMiwgLTAuMDAxMjAzOTcsIC0wLjAwMTE5MTQxLCAtMC4wMDExNzg1OSwKKyAgICAtMC4wMDExNjU1MiwgLTAuMDAxMTUyMjMsIC0wLjAwMTEzODc3LCAtMC4wMDExMjUxNywKKyAgICAtMC4wMDExMTE0NCwgLTAuMDAxMDk3NjQsIC0wLjAwMTA4Mzc3LCAtMC4wMDEwNjk4OSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYWN0YWIuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhY3RhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZDg1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYWN0YWIuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQUFDIGRhdGEgZGVjbGFyYXRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBPZGVkIFNoaW1vbiAoIG9kczE1IG9kczE1IGR5bmRucyBvcmcgKQorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgTWF4aW0gR2F2cmlsb3YgKCBtYXhpbS5nYXZyaWxvdiBnbWFpbCBjb20gKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBQUMgZGF0YSBkZWNsYXJhdGlvbnMKKyAqIEBhdXRob3IgT2RlZCBTaGltb24gICggb2RzMTUgb2RzMTUgZHluZG5zIG9yZyApCisgKiBAYXV0aG9yIE1heGltIEdhdnJpbG92ICggbWF4aW0uZ2F2cmlsb3YgZ21haWwgY29tICkKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQUFDVEFCX0gKKyNkZWZpbmUgQVZDT0RFQ19BQUNUQUJfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImFhYy5oIgorI2luY2x1ZGUgImFhY190YWJsZWdlbl9kZWNsLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogTk9URToKKyAqIFRhYmxlcyBpbiB0aGlzIGZpbGUgYXJlIHVzZWQgYnkgdGhlIEFBQyBkZWNvZGVyIGFuZCB3aWxsIGJlIHVzZWQgYnkgdGhlIEFBQworICogZW5jb2Rlci4KKyAqLworCisvKiBAbmFtZSB3aW5kb3cgY29lZmZpY2llbnRzCisgKiBAeworICovCitERUNMQVJFX0FMSUdORUQoMzIsIGV4dGVybiBmbG9hdCwgIGZmX2FhY19rYmRfbG9uZ18xMDI0KVsxMDI0XTsKK0RFQ0xBUkVfQUxJR05FRCgzMiwgZXh0ZXJuIGZsb2F0LCAgZmZfYWFjX2tiZF9zaG9ydF8xMjgpWzEyOF07Citjb25zdCBERUNMQVJFX0FMSUdORUQoMzIsIGV4dGVybiBmbG9hdCwgZmZfYWFjX2VsZF93aW5kb3cpWzE5MjBdOworLy8gQH0KKworLyogQG5hbWUgbnVtYmVyIG9mIHNjYWxlZmFjdG9yIHdpbmRvdyBiYW5kcyBmb3IgbG9uZyBhbmQgc2hvcnQgdHJhbnNmb3JtIHdpbmRvd3MgcmVzcGVjdGl2ZWx5CisgKiBAeworICovCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9hYWNfbnVtX3N3Yl8xMDI0W107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9hYWNfbnVtX3N3Yl81MTIgW107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9hYWNfbnVtX3N3Yl8xMjggW107CisvLyBAfQorCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9hYWNfcHJlZF9zZmJfbWF4IFtdOworCitleHRlcm4gY29uc3QgdWludDMyX3QgZmZfYWFjX3NjYWxlZmFjdG9yX2NvZGVbMTIxXTsKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl9hYWNfc2NhbGVmYWN0b3JfYml0c1sxMjFdOworCitleHRlcm4gY29uc3QgdWludDE2X3QgKiBjb25zdCBmZl9hYWNfc3BlY3RyYWxfY29kZXNbMTFdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgICogY29uc3QgZmZfYWFjX3NwZWN0cmFsX2JpdHMgWzExXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCAgZmZfYWFjX3NwZWN0cmFsX3NpemVzWzExXTsKKworZXh0ZXJuIGNvbnN0IGZsb2F0ICpmZl9hYWNfY29kZWJvb2tfdmVjdG9yc1tdOworZXh0ZXJuIGNvbnN0IGZsb2F0ICpmZl9hYWNfY29kZWJvb2tfdmVjdG9yX3ZhbHNbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCAqZmZfYWFjX2NvZGVib29rX3ZlY3Rvcl9pZHhbXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90ICogY29uc3QgZmZfc3diX29mZnNldF8xMDI0WzEzXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCAqIGNvbnN0IGZmX3N3Yl9vZmZzZXRfNTEyIFsxM107CitleHRlcm4gY29uc3QgdWludDE2X3QgKiBjb25zdCBmZl9zd2Jfb2Zmc2V0XzEyOCBbMTNdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl90bnNfbWF4X2JhbmRzXzEwMjRbMTNdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdG5zX21heF9iYW5kc181MTIgWzEzXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3Ruc19tYXhfYmFuZHNfMTI4IFsxM107CisKKyNlbmRpZiAvKiBBVkNPREVDX0FBQ1RBQl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYW5kY3R0YWIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhbmRjdHRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MDEzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYW5kY3R0YWIuYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFBTiAoQXJhaSwgQWd1aSBhbmQgTmFrYWppbWEpIChJKURDVCB0YWJsZXMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2NvbnN0IHVpbnQxNl90IGZmX2FhbnNjYWxlc1s2NF0gPSB7CisgICAgLyogcHJlY29tcHV0ZWQgdmFsdWVzIHNjYWxlZCB1cCBieSAxNCBiaXRzICovCisgICAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorICAgIDIyNzI1LCAzMTUyMSwgMjk2OTIsIDI2NzIyLCAyMjcyNSwgMTc4NTUsIDEyMjk5LCAgNjI3MCwKKyAgICAyMTQwNywgMjk2OTIsIDI3OTY5LCAyNTE3MiwgMjE0MDcsIDE2ODE5LCAxMTU4NSwgIDU5MDYsCisgICAgMTkyNjYsIDI2NzIyLCAyNTE3MiwgMjI2NTQsIDE5MjY2LCAxNTEzNywgMTA0MjYsICA1MzE1LAorICAgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKKyAgICAxMjg3MywgMTc4NTUsIDE2ODE5LCAxNTEzNywgMTI4NzMsIDEwMTE0LCAgNjk2NywgIDM1NTIsCisgICAgODg2NyAsIDEyMjk5LCAxMTU4NSwgMTA0MjYsICA4ODY3LCAgNjk2NywgIDQ3OTksICAyNDQ2LAorICAgIDQ1MjAgLCAgNjI3MCwgIDU5MDYsICA1MzE1LCAgNDUyMCwgIDM1NTIsICAyNDQ2LCAgMTI0NworfTsKKworY29uc3QgdWludDE2X3QgZmZfaW52X2FhbnNjYWxlc1s2NF0gPSB7CisgIDQwOTYsICAyOTUzLCAgMzEzNSwgIDM0ODMsICA0MDk2LCAgNTIxMywgIDc1NjgsIDE0ODQ2LAorICAyOTUzLCAgMjEyOSwgIDIyNjAsICAyNTExLCAgMjk1MywgIDM3NTksICA1NDU3LCAxMDcwMywKKyAgMzEzNSwgIDIyNjAsICAyMzk5LCAgMjY2NiwgIDMxMzUsICAzOTkwLCAgNTc5MywgMTEzNjMsCisgIDM0ODMsICAyNTExLCAgMjY2NiwgIDI5NjIsICAzNDgzLCAgNDQzMywgIDY0MzYsIDEyNjI1LAorICA0MDk2LCAgMjk1MywgIDMxMzUsICAzNDgzLCAgNDA5NiwgIDUyMTMsICA3NTY4LCAxNDg0NiwKKyAgNTIxMywgIDM3NTksICAzOTkwLCAgNDQzMywgIDUyMTMsICA2NjM1LCAgOTYzMywgMTg4OTUsCisgIDc1NjgsICA1NDU3LCAgNTc5MywgIDY0MzYsICA3NTY4LCAgOTYzMywgMTM5ODUsIDI3NDMyLAorIDE0ODQ2LCAxMDcwMywgMTEzNjMsIDEyNjI1LCAxNDg0NiwgMTg4OTUsIDI3NDMyLCA1MzgwOSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYW5kY3R0YWIuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhbmRjdHRhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYTJmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYW5kY3R0YWIuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFBTiAoQXJhaSwgQWd1aSBhbmQgTmFrYWppbWEpIChJKURDVCB0YWJsZXMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQUFORENUVEFCX0gKKyNkZWZpbmUgQVZDT0RFQ19BQU5EQ1RUQUJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9hYW5zY2FsZXNbNjRdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX2ludl9hYW5zY2FsZXNbNjRdOworCisjZW5kaWYgLyogQVZDT0RFQ19BQU5EQ1RUQUJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9NYWtlZmlsZSBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0NDI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvTWFrZWZpbGUKQEAgLTAsMCArMSwyOCBAQAorT0JKUy0kKENPTkZJR19GRlQpICAgICAgICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvZmZ0X2luaXRfYWFyY2g2NC5vCitPQkpTLSQoQ09ORklHX0gyNjRDSFJPTUEpICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9oMjY0Y2hyb21hX2luaXRfYWFyY2g2NC5vCitPQkpTLSQoQ09ORklHX0gyNjREU1ApICAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9oMjY0ZHNwX2luaXRfYWFyY2g2NC5vCitPQkpTLSQoQ09ORklHX0gyNjRRUEVMKSAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9oMjY0cXBlbF9pbml0X2FhcmNoNjQubworT0JKUy0kKENPTkZJR19IUEVMRFNQKSAgICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvaHBlbGRzcF9pbml0X2FhcmNoNjQubworT0JKUy0kKENPTkZJR19NUEVHQVVESU9EU1ApICAgICAgICAgICAgICs9IGFhcmNoNjQvbXBlZ2F1ZGlvZHNwX2luaXQubworT0JKUy0kKENPTkZJR19ORU9OX0NMT0JCRVJfVEVTVCkgICAgICAgICs9IGFhcmNoNjQvbmVvbnRlc3QubworT0JKUy0kKENPTkZJR19WSURFT0RTUCkgICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvdmlkZW9kc3BfaW5pdC5vCisKK09CSlMtJChDT05GSUdfT1BVU19ERUNPREVSKSAgICAgICAgICAgICArPSBhYXJjaDY0L29wdXNfaW1kY3RfaW5pdC5vCitPQkpTLSQoQ09ORklHX1JWNDBfREVDT0RFUikgICAgICAgICAgICAgKz0gYWFyY2g2NC9ydjQwZHNwX2luaXRfYWFyY2g2NC5vCitPQkpTLSQoQ09ORklHX1ZDMV9ERUNPREVSKSAgICAgICAgICAgICAgKz0gYWFyY2g2NC92YzFkc3BfaW5pdF9hYXJjaDY0Lm8KK09CSlMtJChDT05GSUdfVk9SQklTX0RFQ09ERVIpICAgICAgICAgICArPSBhYXJjaDY0L3ZvcmJpc2RzcF9pbml0Lm8KKworQVJNVjgtT0JKUy0kKENPTkZJR19WSURFT0RTUCkgICAgICAgICAgICs9IGFhcmNoNjQvdmlkZW9kc3AubworCitORU9OLU9CSlMtJChDT05GSUdfRkZUKSAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9mZnRfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfSDI2NENIUk9NQSkgICAgICAgICAgKz0gYWFyY2g2NC9oMjY0Y21jX25lb24ubworTkVPTi1PQkpTLSQoQ09ORklHX0gyNjREU1ApICAgICAgICAgICAgICs9IGFhcmNoNjQvaDI2NGRzcF9uZW9uLm8gICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXJjaDY0L2gyNjRpZGN0X25lb24ubworTkVPTi1PQkpTLSQoQ09ORklHX0gyNjRRUEVMKSAgICAgICAgICAgICs9IGFhcmNoNjQvaDI2NHFwZWxfbmVvbi5vICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXJjaDY0L2hwZWxkc3BfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfSFBFTERTUCkgICAgICAgICAgICAgKz0gYWFyY2g2NC9ocGVsZHNwX25lb24ubworTkVPTi1PQkpTLSQoQ09ORklHX01QRUdBVURJT0RTUCkgICAgICAgICs9IGFhcmNoNjQvbXBlZ2F1ZGlvZHNwX25lb24ubworTkVPTi1PQkpTLSQoQ09ORklHX01EQ1QpICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvbWRjdF9uZW9uLm8KKworTkVPTi1PQkpTLSQoQ09ORklHX09QVVNfREVDT0RFUikgICAgICAgICs9IGFhcmNoNjQvb3B1c19pbWRjdF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19WT1JCSVNfREVDT0RFUikgICAgICArPSBhYXJjaDY0L3ZvcmJpc2RzcF9uZW9uLm8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvYXNtLW9mZnNldHMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvYXNtLW9mZnNldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGVmZDdjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9hc20tb2Zmc2V0cy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FBUkNINjRfQVNNX09GRlNFVFNfSAorI2RlZmluZSBBVkNPREVDX0FBUkNINjRfQVNNX09GRlNFVFNfSAorCisvKiBDZWx0SU1EQ1RDb250ZXh0ICovCisjZGVmaW5lIENFTFRfRVhQVEFCICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBDRUxUX0ZGVF9OICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQ0VMVF9MRU4yICAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIENFTFRfTEVONCAgICAgICAgICAgICAgICAgICAgICAgKENFTFRfTEVOMiArIDB4NCkgICAvLyBsb2FkZWQgYXMgcGFpcgorI2RlZmluZSBDRUxUX1RNUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQ0VMVF9UV0lERExFICAgICAgICAgICAgICAgICAgICAoQ0VMVF9UTVAgKyAweDgpICAgIC8vIGxvYWRlZCBhcyBwYWlyCisKKyNlbmRpZiAvKiBBVkNPREVDX0FBUkNINjRfQVNNX09GRlNFVFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9jYWJhYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9jYWJhYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOWI3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L2NhYmFjLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FBUkNINjRfQ0FCQUNfSAorI2RlZmluZSBBVkNPREVDX0FBUkNINjRfQ0FCQUNfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvY2FiYWMuaCIKKworI2RlZmluZSBnZXRfY2FiYWNfaW5saW5lIGdldF9jYWJhY19pbmxpbmVfYWFyY2g2NAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF9jYWJhY19pbmxpbmVfYWFyY2g2NChDQUJBQ0NvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNvbnN0IHN0YXRlKQoreworICAgIGludCBiaXQ7CisgICAgdm9pZCAqcmVnX2EsICpyZWdfYiwgKnJlZ19jLCAqdG1wOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxkcmIgICAgICAgJXdbYml0XSAgICAgICAsIFslW3N0YXRlXV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICAgICAlW3JfYl0gICAgICAgICwgJVt0YWJsZXNdICAgLCAlW2xwc19vZmZdICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICV3W3RtcF0gICAgICAgLCAld1tyYW5nZV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJXdbcmFuZ2VdICAgICAsICV3W3JhbmdlXSAgICwgIzB4QzAgICAgICAgICBcblx0IgorICAgICAgICAibHNsICAgICAgICAld1tyX2NdICAgICAgICwgJXdbcmFuZ2VdICAgLCAjMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgICAgICVbcl9iXSAgICAgICAgLCAlW3JfYl0gICAgICAsICV3W2JpdF0sIFVYVFcgXG5cdCIKKyAgICAgICAgImxkcmIgICAgICAgJXdbcmFuZ2VdICAgICAsIFslW3JfYl0sICV3W3JfY10sIFNYVFddICAgICBcblx0IgorICAgICAgICAic3ViICAgICAgICAld1tyX2NdICAgICAgICwgJXdbdG1wXSAgICAgLCAld1tyYW5nZV0gICAgIFxuXHQiCisgICAgICAgICJsc2wgICAgICAgICV3W3RtcF0gICAgICAgLCAld1tyX2NdICAgICAsICMxNyAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImNtcCAgICAgICAgJXdbdG1wXSAgICAgICAsICV3W2xvd10gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiY3NlbCAgICAgICAld1t0bXBdICAgICAgICwgJXdbdG1wXSAgICAgLCB3enIgICAgICAsIGNjIFxuXHQiCisgICAgICAgICJjc2VsICAgICAgICV3W3JhbmdlXSAgICAgLCAld1tyX2NdICAgICAsICV3W3JhbmdlXSwgZ3QgXG5cdCIKKyAgICAgICAgImNpbnYgICAgICAgJXdbYml0XSAgICAgICAsICV3W2JpdF0gICAgICwgY2MgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICAgICAgICAld1tsb3ddICAgICAgICwgJXdbbG93XSAgICAgLCAld1t0bXBdICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgICAgICVbcl9iXSAgICAgICAgLCAlW3RhYmxlc10gICAsICVbbm9ybV9vZmZdICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAgICAgJVtyX2FdICAgICAgICAsICVbdGFibGVzXSAgICwgJVttbHBzX29mZl0gICBcblx0IgorICAgICAgICAibGRyYiAgICAgICAld1t0bXBdICAgICAgICwgWyVbcl9iXSwgJXdbcmFuZ2VdLCBTWFRXXSAgIFxuXHQiCisgICAgICAgICJsZHJiICAgICAgICV3W3JfYV0gICAgICAgLCBbJVtyX2FdLCAld1tiaXRdLCBTWFRXXSAgICAgXG5cdCIKKyAgICAgICAgImxzbCAgICAgICAgJXdbbG93XSAgICAgICAsICV3W2xvd10gICAgICwgJXdbdG1wXSAgICAgICBcblx0IgorICAgICAgICAibHNsICAgICAgICAld1tyYW5nZV0gICAgICwgJXdbcmFuZ2VdICAgLCAld1t0bXBdICAgICAgIFxuXHQiCisgICAgICAgICJ1eHRoICAgICAgICV3W3JfY10gICAgICAgLCAld1tsb3ddICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN0cmIgICAgICAgJXdbcl9hXSAgICAgICAsIFslW3N0YXRlXV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiY2JueiAgICAgICAld1tyX2NdICAgICAgICwgMmYgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZHIgICAgICAgICVbcl9jXSAgICAgICAgLCBbJVtjXSwgJVtieXRlXV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxkciAgICAgICAgJVtyX2FdICAgICAgICAsIFslW2NdLCAlW2VuZF1dICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGRyaCAgICAgICAld1t0bXBdICAgICAgICwgWyVbcl9jXV0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjbXAgICAgICAgICVbcl9jXSAgICAgICAgLCAlW3JfYV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImIuZ2UgICAgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICAgICAlW3JfYV0gICAgICAgICwgJVtyX2NdICAgICAgLCAjMiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdHIgICAgICAgICVbcl9hXSAgICAgICAgLCBbJVtjXSwgJVtieXRlXV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICAgICAgICAld1tyX2NdICAgICAgICwgJXdbbG93XSAgICAgLCAjMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJlb3IgICAgICAgICV3W3JfY10gICAgICAgLCAld1tyX2NdICAgICAsICV3W2xvd10gICAgICAgXG5cdCIKKyAgICAgICAgInJldiAgICAgICAgJXdbdG1wXSAgICAgICAsICV3W3RtcF0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHNyICAgICAgICAld1tyX2NdICAgICAgICwgJXdbcl9jXSAgICAgLCAjMTUgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsc3IgICAgICAgICV3W3RtcF0gICAgICAgLCAld1t0bXBdICAgICAsICMxNSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxkcmIgICAgICAgJXdbcl9jXSAgICAgICAsIFslW3JfYl0sICV3W3JfY10sIFNYVFddICAgICBcblx0IgorICAgICAgICAibW92ICAgICAgICAld1tyX2JdICAgICAgICwgIzB4RkZGRiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICV3W3JfYV0gICAgICAgLCAjNyAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YiAgICAgICAgJXdbdG1wXSAgICAgICAsICV3W3RtcF0gICAgICwgJXdbcl9iXSAgICAgICBcblx0IgorICAgICAgICAic3ViICAgICAgICAld1tyX2NdICAgICAgICwgJXdbcl9hXSAgICAgLCAld1tyX2NdICAgICAgIFxuXHQiCisgICAgICAgICJsc2wgICAgICAgICV3W3RtcF0gICAgICAgLCAld1t0bXBdICAgICAsICV3W3JfY10gICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAgICAgJXdbbG93XSAgICAgICAsICV3W2xvd10gICAgICwgJXdbdG1wXSAgICAgICBcblx0IgorICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogICAgW2JpdF0iPSZyIihiaXQpLAorICAgICAgICAgICAgIFtsb3ddIismciIoYy0+bG93KSwKKyAgICAgICAgICAgW3JhbmdlXSIrJnIiKGMtPnJhbmdlKSwKKyAgICAgICAgICAgICBbcl9hXSI9JnIiKHJlZ19hKSwKKyAgICAgICAgICAgICBbcl9iXSI9JnIiKHJlZ19iKSwKKyAgICAgICAgICAgICBbcl9jXSI9JnIiKHJlZ19jKSwKKyAgICAgICAgICAgICBbdG1wXSI9JnIiKHRtcCkKKyAgICAgICAgOiAgICAgICAgW2NdInIiKGMpLAorICAgICAgICAgICAgIFtzdGF0ZV0iciIoc3RhdGUpLAorICAgICAgICAgICAgW3RhYmxlc10iciIoZmZfaDI2NF9jYWJhY190YWJsZXMpLAorICAgICAgICAgICAgICBbYnl0ZV0iaSIob2Zmc2V0b2YoQ0FCQUNDb250ZXh0LCBieXRlc3RyZWFtKSksCisgICAgICAgICAgICAgICBbZW5kXSJpIihvZmZzZXRvZihDQUJBQ0NvbnRleHQsIGJ5dGVzdHJlYW1fZW5kKSksCisgICAgICAgICAgW25vcm1fb2ZmXSJJIihIMjY0X05PUk1fU0hJRlRfT0ZGU0VUKSwKKyAgICAgICAgICAgW2xwc19vZmZdIkkiKEgyNjRfTFBTX1JBTkdFX09GRlNFVCksCisgICAgICAgICAgW21scHNfb2ZmXSJJIihIMjY0X01MUFNfU1RBVEVfT0ZGU0VUICsgMTI4KQorICAgICAgICA6ICJtZW1vcnkiLCAiY2MiCisgICAgICAgICk7CisKKyAgICByZXR1cm4gYml0ICYgMTsKK30KKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCisjZW5kaWYgLyogQVZDT0RFQ19BQVJDSDY0X0NBQkFDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvZmZ0X2luaXRfYWFyY2g2NC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9mZnRfaW5pdF9hYXJjaDY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxNGQzYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvZmZ0X2luaXRfYWFyY2g2NC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZmZ0LmgiCisKK3ZvaWQgZmZfZmZ0X3Blcm11dGVfbmVvbihGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KTsKK3ZvaWQgZmZfZmZ0X2NhbGNfbmVvbihGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KTsKKwordm9pZCBmZl9pbWRjdF9jYWxjX25lb24oRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpOwordm9pZCBmZl9pbWRjdF9oYWxmX25lb24oRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpOwordm9pZCBmZl9tZGN0X2NhbGNfbmVvbihGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm91dHB1dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dCk7CisKK2F2X2NvbGQgdm9pZCBmZl9mZnRfaW5pdF9hYXJjaDY0KEZGVENvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5mZnRfcGVybXV0ZSAgPSBmZl9mZnRfcGVybXV0ZV9uZW9uOworICAgICAgICBzLT5mZnRfY2FsYyAgICAgPSBmZl9mZnRfY2FsY19uZW9uOworI2lmIENPTkZJR19NRENUCisgICAgICAgIHMtPmltZGN0X2NhbGMgICA9IGZmX2ltZGN0X2NhbGNfbmVvbjsKKyAgICAgICAgcy0+aW1kY3RfaGFsZiAgID0gZmZfaW1kY3RfaGFsZl9uZW9uOworICAgICAgICBzLT5tZGN0X2NhbGMgICAgPSBmZl9tZGN0X2NhbGNfbmVvbjsKKyAgICAgICAgcy0+bWRjdF9wZXJtdXRhdGlvbiA9IEZGX01EQ1RfUEVSTV9JTlRFUkxFQVZFOworI2VuZGlmCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9mZnRfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9mZnRfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZjI0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L2ZmdF9uZW9uLlMKQEAgLTAsMCArMSw0NDMgQEAKKy8qCisgKiBBUk0gTkVPTiBvcHRpbWlzZWQgRkZUCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA5IE5hb3Rvc2hpIE5vamlyaQorICogQ29weXJpZ2h0IChjKSAyMDE0IEphbm5lIEdydW5hdSA8amFubmUtbGliYXZAamFubmF1Lm5ldD4KKyAqCisgKiBUaGlzIGFsZ29yaXRobSAodGhvdWdoIG5vdCBhbnkgb2YgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMpIGlzCisgKiBiYXNlZCBvbiBsaWJkamJmZnQgYnkgRC4gSi4gQmVybnN0ZWluLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMiCisKKyNkZWZpbmUgTV9TUVJUMV8yIDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAKKworLm1hY3JvIHRyYW5zcG9zZSBkMCwgZDEsIHMwLCBzMQorICAgICAgICB0cm4xICAgICAgICAgICAgXGQwLCBcczAsIFxzMQorICAgICAgICB0cm4yICAgICAgICAgICAgXGQxLCBcczAsIFxzMQorLmVuZG0KKworCitmdW5jdGlvbiBmZnQ0X25lb24KKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC4ycyx2MS4ycyx2Mi4ycyx2My4yc30sIFt4MF0KKworICAgICAgICBmYWRkICAgICAgICAgICAgdjQuMnMsICB2MC4ycywgIHYxLjJzICAgLy8gcjArcjEsaTAraTEKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHY2LjJzLCAgdjAuMnMsICB2MS4ycyAgIC8vIHIwLXIxLGkwLWkxCisKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYxNi44YiwgdjIuOGIsICB2My44YiwgICM0CisgICAgICAgIGV4dCAgICAgICAgICAgICB2MTcuOGIsIHYzLjhiLCAgdjIuOGIsICAjNAorCisgICAgICAgIGZhZGQgICAgICAgICAgICB2NS4ycywgIHYyLjJzLCAgdjMuMnMgICAvLyBpMitpMyxyMityMworICAgICAgICBmc3ViICAgICAgICAgICAgdjcuMnMsICB2MTYuMnMsIHYxNy4ycyAgLy8gcjMtcjIsaTItaTMKKworICAgICAgICBmYWRkICAgICAgICAgICAgdjAuMnMsICB2NC4ycywgIHY1LjJzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2Mi4ycywgIHY0LjJzLCAgdjUuMnMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYxLjJzLCAgdjYuMnMsICB2Ny4ycworICAgICAgICBmc3ViICAgICAgICAgICAgdjMuMnMsICB2Ni4ycywgIHY3LjJzCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC4ycyx2MS4ycyx2Mi4ycyx2My4yc30sIFt4MF0KKworICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZ0OF9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgIHgwCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMnMsIHYxLjJzLCB2Mi4ycywgdjMuMnN9LCAgW3gwXSwgIzMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjJzLHYxNy4ycyx2MTguMnMsdjE5LjJzfSwgW3gwXQorICAgICAgICBleHQgICAgICAgICAgICAgdjIyLjhiLCB2Mi44YiwgIHYzLjhiLCAgIzQKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYyMy44YiwgdjMuOGIsICB2Mi44YiwgICM0CisgICAgICAgIGZhZGQgICAgICAgICAgICB2NC4ycywgIHYxNi4ycywgdjE3LjJzICAgICAgICAgICAvLyByNCtyNSxpNCtpNQorICAgICAgICBmYWRkICAgICAgICAgICAgdjUuMnMsICB2MTguMnMsIHYxOS4ycyAgICAgICAgICAgLy8gcjYrcjcsaTYraTcKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYxNy4ycywgdjE2LjJzLCB2MTcuMnMgICAgICAgICAgIC8vIHI0LXI1LGk0LWk1CisgICAgICAgIGZzdWIgICAgICAgICAgICB2MTkuMnMsIHYxOC4ycywgdjE5LjJzICAgICAgICAgICAvLyByNi1yNyxpNi1pNworICAgICAgICByZXY2NCAgICAgICAgICAgdjI3LjJzLCB2MjguMnMgIC8vID8/PworICAgICAgICBmYWRkICAgICAgICAgICAgdjIwLjJzLCB2MC4ycywgIHYxLjJzICAgICAgICAgICAgLy8gcjArcjEsaTAraTEKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYyMS4ycywgdjIuMnMsICB2My4ycyAgICAgICAgICAgIC8vIHIyK3IzLGkyK2kzCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjYuMnMsIHYxNy4ycywgdjI4LjJzICAgICAgICAgICAvLyAtYTJyKncsYTJpKncKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHY2LjhiLCAgdjQuOGIsICB2NS44YiwgICM0CisgICAgICAgIGV4dCAgICAgICAgICAgICB2Ny44YiwgIHY1LjhiLCAgdjQuOGIsICAjNAorICAgICAgICBmbXVsICAgICAgICAgICAgdjI3LjJzLCB2MTkuMnMsIHYyNy4ycyAgICAgICAgICAgLy8gYTNyKncsLWEzaSp3CisgICAgICAgIGZzdWIgICAgICAgICAgICB2MjMuMnMsIHYyMi4ycywgdjIzLjJzICAgICAgICAgICAvLyBpMi1pMyxyMy1yMgorICAgICAgICBmc3ViICAgICAgICAgICAgdjIyLjJzLCB2MC4ycywgIHYxLjJzICAgICAgICAgICAgLy8gcjAtcjEsaTAtaTEKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYyNC4ycywgdjE3LjJzLCB2Mjguc1sxXSAgICAgICAgIC8vIGEycip3LGEyaSp3CisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjUuMnMsIHYxOS4ycywgdjI4LnNbMV0gICAgICAgICAvLyBhM3IqdyxhM2kqdworICAgICAgICBmYWRkICAgICAgICAgICAgdjAuMnMsICB2MjAuMnMsIHYyMS4ycworICAgICAgICBmc3ViICAgICAgICAgICAgdjIuMnMsICB2MjAuMnMsIHYyMS4ycworICAgICAgICBmYWRkICAgICAgICAgICAgdjEuMnMsICB2MjIuMnMsIHYyMy4ycworICAgICAgICByZXY2NCAgICAgICAgICAgdjI2LjJzLCB2MjYuMnMKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHYyNy4ycywgdjI3LjJzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2My4ycywgIHYyMi4ycywgdjIzLjJzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2Ni4ycywgIHY2LjJzLCAgdjcuMnMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYyNC4ycywgdjI0LjJzLCB2MjYuMnMgIC8vIGEycithMmksYTJpLWEyciAgIHQxLHQyCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MjUuMnMsIHYyNS4ycywgdjI3LjJzICAvLyBhM3ItYTNpLGEzaSthM3IgICB0NSx0NgorICAgICAgICBmYWRkICAgICAgICAgICAgdjcuMnMsICB2NC4ycywgIHY1LjJzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2MTguMnMsIHYyLjJzLCAgdjYuMnMKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYyNi44YiwgdjI0LjhiLCB2MjUuOGIsICM0CisgICAgICAgIGV4dCAgICAgICAgICAgICB2MjcuOGIsIHYyNS44YiwgdjI0LjhiLCAjNAorICAgICAgICBmYWRkICAgICAgICAgICAgdjIuMnMsICB2Mi4ycywgIHY2LjJzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2MTYuMnMsIHYwLjJzLCAgdjcuMnMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHY1LjJzLCAgdjI1LjJzLCB2MjQuMnMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHY0LjJzLCAgdjI2LjJzLCB2MjcuMnMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYwLjJzLCAgdjAuMnMsICB2Ny4ycworICAgICAgICBmc3ViICAgICAgICAgICAgdjE3LjJzLCB2MS4ycywgIHY1LjJzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2MTkuMnMsIHYzLjJzLCAgdjQuMnMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYzLjJzLCAgdjMuMnMsICB2NC4ycworICAgICAgICBmYWRkICAgICAgICAgICAgdjEuMnMsICB2MS4ycywgIHY1LjJzCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuMnMsdjE3LjJzLHYxOC4ycyx2MTkuMnN9LCBbeDBdCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuMnMsIHYxLjJzLCB2Mi4ycywgdjMuMnN9LCAgW3gxXQorCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZnQxNl9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgIHgwCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMnMsIHYxLjJzLCB2Mi4ycywgdjMuMnN9LCAgW3gwXSwgIzMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjJzLHYxNy4ycyx2MTguMnMsdjE5LjJzfSwgW3gwXSwgIzMyCisgICAgICAgIGV4dCAgICAgICAgICAgICB2MjIuOGIsIHYyLjhiLCAgdjMuOGIsICAjNAorICAgICAgICBleHQgICAgICAgICAgICAgdjIzLjhiLCB2My44YiwgIHYyLjhiLCAgIzQKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHY0LjJzLCAgdjE2LjJzLCB2MTcuMnMgICAgICAgICAgIC8vIHI0K3I1LGk0K2k1CisgICAgICAgIGZhZGQgICAgICAgICAgICB2NS4ycywgIHYxOC4ycywgdjE5LjJzICAgICAgICAgICAvLyByNityNyxpNitpNworICAgICAgICBmc3ViICAgICAgICAgICAgdjE3LjJzLCB2MTYuMnMsIHYxNy4ycyAgICAgICAgICAgLy8gcjQtcjUsaTQtaTUKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYxOS4ycywgdjE4LjJzLCB2MTkuMnMgICAgICAgICAgIC8vIHI2LXI3LGk2LWk3CisgICAgICAgIHJldjY0ICAgICAgICAgICB2MjcuMnMsIHYyOC4ycyAgLy8gPz8/CisgICAgICAgIGZhZGQgICAgICAgICAgICB2MjAuMnMsIHYwLjJzLCAgdjEuMnMgICAgICAgICAgICAvLyByMCtyMSxpMCtpMQorICAgICAgICBmYWRkICAgICAgICAgICAgdjIxLjJzLCB2Mi4ycywgIHYzLjJzICAgICAgICAgICAgLy8gcjIrcjMsaTIraTMKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYyNi4ycywgdjE3LjJzLCB2MjguMnMgICAgICAgICAgIC8vIC1hMnIqdyxhMmkqdworICAgICAgICBleHQgICAgICAgICAgICAgdjYuOGIsICB2NC44YiwgIHY1LjhiLCAgIzQKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHY3LjhiLCAgdjUuOGIsICB2NC44YiwgICM0CisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjcuMnMsIHYxOS4ycywgdjI3LjJzICAgICAgICAgICAvLyBhM3IqdywtYTNpKncKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYyMy4ycywgdjIyLjJzLCB2MjMuMnMgICAgICAgICAgIC8vIGkyLWkzLHIzLXIyCisgICAgICAgIGZzdWIgICAgICAgICAgICB2MjIuMnMsIHYwLjJzLCAgdjEuMnMgICAgICAgICAgICAvLyByMC1yMSxpMC1pMQorICAgICAgICBmbXVsICAgICAgICAgICAgdjI0LjJzLCB2MTcuMnMsIHYyOC5zWzFdICAgICAgICAgLy8gYTJyKncsYTJpKncKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYyNS4ycywgdjE5LjJzLCB2Mjguc1sxXSAgICAgICAgIC8vIGEzcip3LGEzaSp3CisgICAgICAgIGZhZGQgICAgICAgICAgICB2MC4ycywgIHYyMC4ycywgdjIxLjJzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2Mi4ycywgIHYyMC4ycywgdjIxLjJzCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MS4ycywgIHYyMi4ycywgdjIzLjJzCisgICAgICAgIHJldjY0ICAgICAgICAgICB2MjYuMnMsIHYyNi4ycworICAgICAgICByZXY2NCAgICAgICAgICAgdjI3LjJzLCB2MjcuMnMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYzLjJzLCAgdjIyLjJzLCB2MjMuMnMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHY2LjJzLCAgdjYuMnMsICB2Ny4ycworICAgICAgICBmYWRkICAgICAgICAgICAgdjI0LjJzLCB2MjQuMnMsIHYyNi4ycyAgLy8gYTJyK2EyaSxhMmktYTJyICAgdDEsdDIKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYyNS4ycywgdjI1LjJzLCB2MjcuMnMgIC8vIGEzci1hM2ksYTNpK2EzciAgIHQ1LHQ2CisgICAgICAgIGZhZGQgICAgICAgICAgICB2Ny4ycywgIHY0LjJzLCAgdjUuMnMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYxOC4ycywgdjIuMnMsICB2Ni4ycworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC40cyx2MjEuNHN9LCBbeDBdLCAjMzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjIuNHMsdjIzLjRzfSwgW3gwXSwgIzMyCisgICAgICAgIGV4dCAgICAgICAgICAgICB2MjYuOGIsIHYyNC44YiwgdjI1LjhiLCAjNAorICAgICAgICBleHQgICAgICAgICAgICAgdjI3LjhiLCB2MjUuOGIsIHYyNC44YiwgIzQKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYyLjJzLCAgdjIuMnMsICB2Ni4ycworICAgICAgICBmc3ViICAgICAgICAgICAgdjE2LjJzLCB2MC4ycywgIHY3LjJzCisgICAgICAgIGZhZGQgICAgICAgICAgICB2NS4ycywgIHYyNS4ycywgdjI0LjJzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2NC4ycywgIHYyNi4ycywgdjI3LjJzCisgICAgICAgIHRyYW5zcG9zZSAgICAgICB2MjQuMmQsIHYyNS4yZCwgdjIwLjJkLCB2MjIuMmQKKyAgICAgICAgdHJhbnNwb3NlICAgICAgIHYyNi4yZCwgdjI3LjJkLCB2MjEuMmQsIHYyMy4yZAorICAgICAgICBmYWRkICAgICAgICAgICAgdjAuMnMsICB2MC4ycywgIHY3LjJzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2MTcuMnMsIHYxLjJzLCAgdjUuMnMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYxOS4ycywgdjMuMnMsICB2NC4ycworICAgICAgICBmYWRkICAgICAgICAgICAgdjMuMnMsICB2My4ycywgIHY0LjJzCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MS4ycywgIHYxLjJzLCAgdjUuMnMKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYyMC4xNmIsIHYyMS4xNmIsIHYyMS4xNmIsICAjNAorICAgICAgICBleHQgICAgICAgICAgICAgdjIxLjE2YiwgdjIzLjE2YiwgdjIzLjE2YiwgICM0CisKKyAgICAgICAgemlwMSAgICAgICAgICAgIHYwLjJkLCAgdjAuMmQsICB2MS4yZCAgIC8vIHt6WzBdLCAgIHpbMV19CisgICAgICAgIHppcDEgICAgICAgICAgICB2MS4yZCwgIHYyLjJkLCAgdjMuMmQgICAvLyB7elsyXSwgICB6WzNdfQorICAgICAgICB6aXAxICAgICAgICAgICAgdjIuMmQsICB2MTYuMmQsIHYxNy4yZCAgLy8ge3pbbzFdLCAgeltvMSsxXX0KKyAgICAgICAgemlwMSAgICAgICAgICAgIHYzLjJkLCAgdjE4LjJkLCB2MTkuMmQgIC8vIHt6W28xKzJdLHpbbzErM119CisKKyAgICAgICAgLy8gMiB4IGZmdDQKKyAgICAgICAgdHJhbnNwb3NlICAgICAgIHYyMi4yZCwgdjIzLjJkLCB2MjAuMmQsIHYyMS4yZAorCisgICAgICAgIGZhZGQgICAgICAgICAgICB2NC40cywgIHYyNC40cywgdjI1LjRzCisgICAgICAgIGZhZGQgICAgICAgICAgICB2NS40cywgIHYyNi40cywgdjI3LjRzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2Ni40cywgIHYyNC40cywgdjI1LjRzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2Ny40cywgIHYyMi40cywgdjIzLjRzCisKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuNHN9LCAgW3gxNF0KKworICAgICAgICBmYWRkICAgICAgICAgICAgdjI0LjRzLCB2NC40cywgIHY1LjRzICAgLy8ge3pbbzIrMF0seltvMisxXX0KKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYyNi40cywgdjQuNHMsICB2NS40cyAgIC8vIHt6W28yKzJdLHpbbzIrM119CisgICAgICAgIGZhZGQgICAgICAgICAgICB2MjUuNHMsIHY2LjRzLCAgdjcuNHMgICAvLyB7eltvMyswXSx6W28zKzFdfQorICAgICAgICBmc3ViICAgICAgICAgICAgdjI3LjRzLCB2Ni40cywgIHY3LjRzICAgLy8ge3pbbzMrMl0seltvMyszXX0KKworICAgICAgICAvL2ZmdF9wYXNzX25lb25fMTYKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY3LjRzLCAgdjI1LjRzCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjUuNHMsIHYyNS40cywgdjIzLnNbMV0KKyAgICAgICAgZm11bCAgICAgICAgICAgIHY3LjRzLCAgdjcuNHMsICB2MjkuNHMKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYyNS40cywgdjcuNHMsICB2MjMuc1szXSAvLyB7dDFhLHQyYSx0NWEsdDZhfQorCisgICAgICAgIHppcDEgICAgICAgICAgICB2MjAuNHMsIHYyNC40cywgdjI1LjRzCisgICAgICAgIHppcDIgICAgICAgICAgICB2MjEuNHMsIHYyNC40cywgdjI1LjRzCisgICAgICAgIGZuZWcgICAgICAgICAgICB2MjIuNHMsIHYyMC40cworICAgICAgICBmYWRkICAgICAgICAgICAgdjQuNHMsICB2MjEuNHMsIHYyMC40cworICAgICAgICBmc3ViICAgICAgICAgICAgdjYuNHMsICB2MjAuNHMsIHYyMS40cyAgLy8ganVzdCB0aGUgc2Vjb25kIGhhbGYKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHY1LjRzLCAgdjIxLjRzLCB2MjIuNHMgIC8vIGp1c3QgdGhlIGZpcnN0IGhhbGYKKworICAgICAgICB0YmwgICAgICAgICAgICAgdjQuMTZiLCB7djQuMTZifSwgICAgICAgIHYzMC4xNmIgLy8gdHJhbnM0X2Zsb2F0CisgICAgICAgIHRibCAgICAgICAgICAgICB2NS4xNmIsIHt2NS4xNmIsdjYuMTZifSwgdjMxLjE2YiAvLyB0cmFuczhfZmxvYXQKKworICAgICAgICBmc3ViICAgICAgICAgICAgdjIwLjRzLCB2MC40cywgIHY0LjRzICAgLy8ge3pbbzJdLHpbbzIrMV19CisgICAgICAgIGZhZGQgICAgICAgICAgICB2MTYuNHMsIHYwLjRzLCAgdjQuNHMgICAvLyB7elswXSwgelsxXX0KKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYyMi40cywgdjIuNHMsICB2NS40cyAgIC8vIHt6W28zXSx6W28zKzFdfQorICAgICAgICBmYWRkICAgICAgICAgICAgdjE4LjRzLCB2Mi40cywgIHY1LjRzICAgLy8ge3pbbzFdLHpbbzErMV19CisKKy8vc2Vjb25kIGhhbGYKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY2LjRzLCAgdjI2LjRzCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjYuNHMsIHYyNi40cywgdjIzLnNbMl0KKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY3LjRzLCAgdjI3LjRzCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjcuNHMsIHYyNy40cywgdjIzLnNbM10KKyAgICAgICAgZm11bCAgICAgICAgICAgIHY2LjRzLCAgdjYuNHMsICB2MjkuNHMKKyAgICAgICAgZm11bCAgICAgICAgICAgIHY3LjRzLCAgdjcuNHMsICB2MjkuNHMKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYyNi40cywgdjYuNHMsICB2MjMuc1syXSAvLyB7dDEsdDIsdDUsdDZ9CisgICAgICAgIGZtbGEgICAgICAgICAgICB2MjcuNHMsIHY3LjRzLCAgdjIzLnNbMV0gLy8ge3QxYSx0MmEsdDVhLHQ2YX0KKworICAgICAgICB6aXAxICAgICAgICAgICAgdjI0LjRzLCB2MjYuNHMsIHYyNy40cworICAgICAgICB6aXAyICAgICAgICAgICAgdjI1LjRzLCB2MjYuNHMsIHYyNy40cworICAgICAgICBmbmVnICAgICAgICAgICAgdjI2LjRzLCB2MjQuNHMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHY0LjRzLCAgdjI1LjRzLCB2MjQuNHMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHY2LjRzLCAgdjI0LjRzLCB2MjUuNHMgIC8vIGp1c3QgdGhlIHNlY29uZCBoYWxmCisgICAgICAgIGZhZGQgICAgICAgICAgICB2NS40cywgIHYyNS40cywgdjI2LjRzICAvLyBqdXN0IHRoZSBmaXJzdCBoYWxmCisKKyAgICAgICAgdGJsICAgICAgICAgICAgIHY0LjE2Yiwge3Y0LjE2Yn0sICAgICAgICB2MzAuMTZiIC8vIHRyYW5zNF9mbG9hdAorICAgICAgICB0YmwgICAgICAgICAgICAgdjUuMTZiLCB7djUuMTZiLHY2LjE2Yn0sIHYzMS4xNmIgLy8gdHJhbnM4X2Zsb2F0CisKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYxNy40cywgdjEuNHMsIHY0LjRzICAgIC8vIHt6WzJdLCB6WzNdfQorICAgICAgICBmc3ViICAgICAgICAgICAgdjIxLjRzLCB2MS40cywgdjQuNHMgICAgLy8ge3pbbzIrMl0seltvMiszXX0KKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYxOS40cywgdjMuNHMsIHY1LjRzICAgIC8vIHt6W28xKzJdLHpbbzErM119CisgICAgICAgIGZzdWIgICAgICAgICAgICB2MjMuNHMsIHYzLjRzLCB2NS40cyAgICAvLyB7eltvMysyXSx6W28zKzNdfQorCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LjRzLHYxNy40c30sIFt4MV0sICMzMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxOC40cyx2MTkuNHN9LCBbeDFdLCAjMzIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjAuNHMsdjIxLjRzfSwgW3gxXSwgIzMyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLjRzLHYyMy40c30sIFt4MV0sICMzMgorCisgICAgICAgIHJldAorZW5kZnVuYworCisKK2NvbnN0ICB0cmFuczRfZmxvYXQsIGFsaWduPTQKKyAgICAgICAgLmJ5dGUgICAgMCwgIDEsICAyLCAgMworICAgICAgICAuYnl0ZSAgICA4LCAgOSwgMTAsIDExCisgICAgICAgIC5ieXRlICAgIDQsICA1LCAgNiwgIDcKKyAgICAgICAgLmJ5dGUgICAxMiwgMTMsIDE0LCAxNQorZW5kY29uc3QKKworY29uc3QgIHRyYW5zOF9mbG9hdCwgYWxpZ249NAorICAgICAgICAuYnl0ZSAgIDI0LCAyNSwgMjYsIDI3CisgICAgICAgIC5ieXRlICAgIDAsICAxLCAgMiwgIDMKKyAgICAgICAgLmJ5dGUgICAyOCwgMjksIDMwLCAzMQorICAgICAgICAuYnl0ZSAgICA0LCAgNSwgIDYsICA3CitlbmRjb25zdAorCitmdW5jdGlvbiBmZnRfcGFzc19uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICB4NiwgIHgyLCAgIzEgICAgICAgICAgICAvLyBuIC0gMSwgbG9vcCBjb3VudGVyCisgICAgICAgIGxzbCAgICAgICAgICAgICB4NSwgIHgyLCAgIzMgICAgICAgICAgICAvLyAyICogbiAqIHNpemVvZiBGRlRTYW1wbGUKKyAgICAgICAgbHNsICAgICAgICAgICAgIHgxLCAgeDIsICAjNCAgICAgICAgICAgIC8vIDIgKiBuICogc2l6ZW9mIEZGVENvbXBsZXgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg1LCAgeDQsICB4NSAgICAgICAgICAgIC8vIHdpbQorICAgICAgICBhZGQgICAgICAgICAgICAgeDMsICB4MSwgIHgyLCAgbHNsICM1ICAgLy8gNCAqIG4gKiBzaXplb2YgRkZUQ29tcGxleAorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MCwgIHgyLCAgbHNsICM1ICAgLy8gJnpbbzJdCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MywgIHgwLCAgeDMgICAgICAgICAgICAvLyAmeltvM10KKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDAsICB4MSAgICAgICAgICAgIC8vICZ6W28xXQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC40c30sW3gyXSAgICAgICAgICAgLy8ge3pbbzJdLHpbbzIrMV19CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIyLjRzfSxbeDNdICAgICAgICAgICAvLyB7eltvM10seltvMysxXX0KKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC4yc30sICBbeDRdLCAjOCAgICAgIC8vIHt3cmVbMF0sd3JlWzFdfQorICAgICAgICB0cm4yICAgICAgICAgICAgdjI1LjJkLCB2MjAuMmQsIHYyMi4yZAorICAgICAgICBzdWIgICAgICAgICAgICAgeDUsICB4NSwgICM0ICAgICAgICAgICAgLy8gd2ltLS0KKyAgICAgICAgdHJuMSAgICAgICAgICAgIHYyNC4yZCwgdjIwLjJkLCB2MjIuMmQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS5zfVswXSwgIFt4NV0sIHg3ICAgIC8vIGQ1WzBdID0gd2ltWy0xXQorICAgICAgICByZXY2NCAgICAgICAgICAgdjcuNHMsICB2MjUuNHMKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYyNS40cywgdjI1LjRzLCB2NC5zWzFdCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjRzfSwgW3gwXSAgICAgICAgICAvLyB7elswXSx6WzFdfQorICAgICAgICBmbXVsICAgICAgICAgICAgdjcuNHMsICB2Ny40cywgIHYyOS40cworICAgICAgICBsZDEgICAgICAgICAgICAge3YxNy40c30sIFt4MV0gICAgICAgICAgLy8ge3pbbzFdLHpbbzErMV19CisgICAgICAgIHByZm0gICAgICAgICAgICBwbGRsMWtlZXAsIFt4MiwgIzE2XQorICAgICAgICBwcmZtICAgICAgICAgICAgcGxkbDFrZWVwLCBbeDMsICMxNl0KKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYyNS40cywgdjcuNHMsICB2NS5zWzBdIC8vIHt0MWEsdDJhLHQ1YSx0NmF9CisgICAgICAgIHByZm0gICAgICAgICAgICBwbGRsMWtlZXAsIFt4MCwgIzE2XQorICAgICAgICBwcmZtICAgICAgICAgICAgcGxkbDFrZWVwLCBbeDEsICMxNl0KKworICAgICAgICB6aXAxICAgICAgICAgICAgdjIwLjRzLCB2MjQuNHMsIHYyNS40cworICAgICAgICB6aXAyICAgICAgICAgICAgdjIxLjRzLCB2MjQuNHMsIHYyNS40cworICAgICAgICBmbmVnICAgICAgICAgICAgdjIyLjRzLCB2MjAuNHMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHY0LjRzLCAgdjIxLjRzLCB2MjAuNHMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHY2LjRzLCAgdjIwLjRzLCB2MjEuNHMgIC8vIGp1c3QgdGhlIHNlY29uZCBoYWxmCisgICAgICAgIGZhZGQgICAgICAgICAgICB2NS40cywgIHYyMS40cywgdjIyLjRzICAvLyBqdXN0IHRoZSBmaXJzdCBoYWxmCisKKyAgICAgICAgdGJsICAgICAgICAgICAgIHY0LjE2Yiwge3Y0LjE2Yn0sICAgICAgICB2MzAuMTZiIC8vIHRyYW5zNF9mbG9hdAorICAgICAgICB0YmwgICAgICAgICAgICAgdjUuMTZiLCB7djUuMTZiLHY2LjE2Yn0sIHYzMS4xNmIgLy8gdHJhbnM4X2Zsb2F0CisKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYyMC40cywgdjE2LjRzLCB2NC40cworICAgICAgICBmc3ViICAgICAgICAgICAgdjIyLjRzLCB2MTYuNHMsIHY0LjRzCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MjEuNHMsIHYxNy40cywgdjUuNHMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjAuNHN9LCBbeDBdLCAjMTYgICAgIC8vIHt6WzBdLCB6WzFdfQorICAgICAgICBmc3ViICAgICAgICAgICAgdjIzLjRzLCB2MTcuNHMsIHY1LjRzCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjEuNHN9LCBbeDFdLCAjMTYgICAgIC8vIHt6W28xXSx6W28xKzFdfQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi40c30sIFt4Ml0sICMxNiAgICAgLy8ge3pbbzJdLHpbbzIrMV19CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLjRzfSwgW3gzXSwgIzE2ICAgICAvLyB7eltvM10seltvMysxXX0KKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjRzfSxbeDJdICAgIC8vIHt6W28yXSx6W28yKzFdfQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi40c30sW3gzXSAgICAvLyB7eltvM10seltvMysxXX0KKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC4yc30sIFt4NF0sICM4ICAgICAgIC8vIHt3cmVbMF0sd3JlWzFdfQorICAgICAgICB0cmFuc3Bvc2UgICAgICAgdjI2LjJkLCB2MjcuMmQsIHYyMC4yZCwgdjIyLjJkCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuMnN9LCBbeDVdLCB4NyAgICAgICAvLyB7d2ltWy0xXSx3aW1bMF19CisgICAgICAgIHJldjY0ICAgICAgICAgICB2Ni40cywgIHYyNi40cworICAgICAgICBmbXVsICAgICAgICAgICAgdjI2LjRzLCB2MjYuNHMsIHY0LnNbMF0KKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY3LjRzLCAgdjI3LjRzCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjcuNHMsIHYyNy40cywgdjQuc1sxXQorICAgICAgICBmbXVsICAgICAgICAgICAgdjYuNHMsICB2Ni40cywgIHYyOS40cworICAgICAgICBmbXVsICAgICAgICAgICAgdjcuNHMsICB2Ny40cywgIHYyOS40cworICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi40c30sW3gwXSAgICAgICAgICAgLy8ge3pbMF0selsxXX0KKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYyNi40cywgdjYuNHMsICB2NS5zWzFdIC8vIHt0MSx0Mix0NSx0Nn0KKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYyNy40cywgdjcuNHMsICB2NS5zWzBdIC8vIHt0MWEsdDJhLHQ1YSx0NmF9CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE3LjRzfSxbeDFdICAgICAgICAgICAvLyB7eltvMV0seltvMSsxXX0KKworICAgICAgICBzdWJzICAgICAgICAgICAgeDYsICB4NiwgICMxICAgICAgICAgICAgLy8gbi0tCisKKyAgICAgICAgemlwMSAgICAgICAgICAgIHYyMC40cywgdjI2LjRzLCB2MjcuNHMKKyAgICAgICAgemlwMiAgICAgICAgICAgIHYyMS40cywgdjI2LjRzLCB2MjcuNHMKKyAgICAgICAgZm5lZyAgICAgICAgICAgIHYyMi40cywgdjIwLjRzCisgICAgICAgIGZhZGQgICAgICAgICAgICB2NC40cywgIHYyMS40cywgdjIwLjRzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2Ni40cywgIHYyMC40cywgdjIxLjRzICAvLyBqdXN0IHRoZSBzZWNvbmQgaGFsZgorICAgICAgICBmYWRkICAgICAgICAgICAgdjUuNHMsICB2MjEuNHMsIHYyMi40cyAgLy8ganVzdCB0aGUgZmlyc3QgaGFsZgorCisgICAgICAgIHRibCAgICAgICAgICAgICB2NC4xNmIsIHt2NC4xNmJ9LCAgICAgICAgdjMwLjE2YiAvLyB0cmFuczRfZmxvYXQKKyAgICAgICAgdGJsICAgICAgICAgICAgIHY1LjE2Yiwge3Y1LjE2Yix2Ni4xNmJ9LCB2MzEuMTZiIC8vIHRyYW5zOF9mbG9hdAorCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MjAuNHMsIHYxNi40cywgdjQuNHMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYyMi40cywgdjE2LjRzLCB2NC40cworICAgICAgICBmYWRkICAgICAgICAgICAgdjIxLjRzLCB2MTcuNHMsIHY1LjRzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIwLjRzfSwgW3gwXSwgIzE2ICAgICAvLyB7elswXSwgelsxXX0KKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYyMy40cywgdjE3LjRzLCB2NS40cworCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIxLjRzfSwgW3gxXSwgIzE2ICAgICAvLyB7eltvMV0seltvMSsxXX0KKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuNHN9LCBbeDJdLCAjMTYgICAgIC8vIHt6W28yXSx6W28yKzFdfQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy40c30sIFt4M10sICMxNiAgICAgLy8ge3pbbzNdLHpbbzMrMV19CisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorCisgICAgICAgIHJldAorZW5kZnVuYworCisubWFjcm8gIGRlZl9mZnQgbiwgbjIsIG40CitmdW5jdGlvbiBmZnRcblwoKV9uZW9uLCBhbGlnbj02CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzE2CisgICAgICAgIHN0cCAgICAgICAgICAgICB4MjgsIHgzMCwgW3NwXQorICAgICAgICBhZGQgICAgICAgICAgICAgeDI4LCB4MCwgICNcbjQqMio4CisgICAgICAgIGJsICAgICAgICAgICAgICBmZnRcbjJcKClfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDAsICB4MjgKKyAgICAgICAgYmwgICAgICAgICAgICAgIGZmdFxuNFwoKV9uZW9uCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgyOCwgI1xuNCoxKjgKKyAgICAgICAgYmwgICAgICAgICAgICAgIGZmdFxuNFwoKV9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgyOCwgI1xuNCoyKjgKKyAgICAgICAgbGRwICAgICAgICAgICAgIHgyOCwgeDMwLCBbc3BdLCAjMTYKKyAgICAgICAgbW92cmVsICAgICAgICAgIHg0LCAgWChmZl9jb3NfXG4pCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MiwgICNcbjQ+PjEKKyAgICAgICAgYiAgICAgICAgICAgICAgIGZmdF9wYXNzX25lb24KK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgZGVmX2ZmdCAgICAzMiwgICAgMTYsICAgICA4CisgICAgICAgIGRlZl9mZnQgICAgNjQsICAgIDMyLCAgICAxNgorICAgICAgICBkZWZfZmZ0ICAgMTI4LCAgICA2NCwgICAgMzIKKyAgICAgICAgZGVmX2ZmdCAgIDI1NiwgICAxMjgsICAgIDY0CisgICAgICAgIGRlZl9mZnQgICA1MTIsICAgMjU2LCAgIDEyOAorICAgICAgICBkZWZfZmZ0ICAxMDI0LCAgIDUxMiwgICAyNTYKKyAgICAgICAgZGVmX2ZmdCAgMjA0OCwgIDEwMjQsICAgNTEyCisgICAgICAgIGRlZl9mZnQgIDQwOTYsICAyMDQ4LCAgMTAyNAorICAgICAgICBkZWZfZmZ0ICA4MTkyLCAgNDA5NiwgIDIwNDgKKyAgICAgICAgZGVmX2ZmdCAxNjM4NCwgIDgxOTIsICA0MDk2CisgICAgICAgIGRlZl9mZnQgMzI3NjgsIDE2Mzg0LCAgODE5MgorICAgICAgICBkZWZfZmZ0IDY1NTM2LCAzMjc2OCwgMTYzODQKKworZnVuY3Rpb24gZmZfZmZ0X2NhbGNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHJmbSAgICAgICAgICAgIHBsZGwxa2VlcCwgW3gxXQorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDEwLCB0cmFuczRfZmxvYXQKKyAgICAgICAgbGRyICAgICAgICAgICAgIHcyLCAgW3gwXQorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDExLCB0cmFuczhfZmxvYXQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHcyLCAgdzIsICAjMgorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDMsICBmZnRfdGFiX25lb24KKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzAuMTZifSwgW3gxMF0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHg3LCAgIy04CisgICAgICAgIG1vdnJlbCAgICAgICAgICB4MTIsIHBtbXAKKyAgICAgICAgbGRyICAgICAgICAgICAgIHg0LCAgW3gzLCB4MiwgbHNsICMzXQorICAgICAgICBhZGQgICAgICAgICAgICAgeDMsICB4MywgIHg0CisgICAgICAgIG1vdnJlbCAgICAgICAgICB4MTMsIG1wcG0KKyAgICAgICAgbW92cmVsICAgICAgICAgIHgxNCwgWChmZl9jb3NfMTYpCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMxLjE2Yn0sIFt4MTFdCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MCwgIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI5LjRzfSwgIFt4MTJdICAgICAgICAgLy8gcG1tcAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyOC40c30sICBbeDEzXQorICAgICAgICBiciAgICAgICAgICAgICAgeDMKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfZmZ0X3Blcm11dGVfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg2LCAgIzEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHcyLCAgW3gwXSAgICAgICAvLyBuYml0cworICAgICAgICBsZHIgICAgICAgICAgICAgeDMsICBbeDAsICMxNl0gIC8vIHRtcF9idWYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHgwLCAgW3gwLCAjOF0gICAvLyByZXZ0YWIKKyAgICAgICAgbHNsICAgICAgICAgICAgIHg2LCAgeDYsIHgyCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MiwgIHg2CisxOgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjJzLHYxLjJzfSwgW3gxXSwgIzE2CisgICAgICAgIGxkciAgICAgICAgICAgICB3NCwgIFt4MF0sICM0CisgICAgICAgIHV4dGggICAgICAgICAgICB3NSwgIHc0CisgICAgICAgIGxzciAgICAgICAgICAgICB3NCwgIHc0LCAgIzE2CisgICAgICAgIGFkZCAgICAgICAgICAgICB4NSwgIHgzLCAgeDUsICBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg0LCAgeDMsICB4NCwgIGxzbCAjMworICAgICAgICBzdDEgICAgICAgICAgICAge3YwLjJzfSwgW3g1XQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLjJzfSwgW3g0XQorICAgICAgICBzdWJzICAgICAgICAgICAgeDYsICB4NiwgIzIKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFiCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICB4MiwgIGxzbCAjMworMToKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40cyx2MS40c30sIFt4M10sICMzMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLjRzLHYxLjRzfSwgW3gxXSwgIzMyCisgICAgICAgIHN1YnMgICAgICAgICAgICB4MiwgIHgyLCAgIzQKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFiCisKKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2NvbnN0ICAgZmZ0X3RhYl9uZW9uCisgICAgICAgIC5xdWFkIGZmdDRfbmVvbiAgICAgLSBmZnRfdGFiX25lb24KKyAgICAgICAgLnF1YWQgZmZ0OF9uZW9uICAgICAtIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQxNl9uZW9uICAgIC0gZmZ0X3RhYl9uZW9uCisgICAgICAgIC5xdWFkIGZmdDMyX25lb24gICAgLSBmZnRfdGFiX25lb24KKyAgICAgICAgLnF1YWQgZmZ0NjRfbmVvbiAgICAtIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQxMjhfbmVvbiAgIC0gZmZ0X3RhYl9uZW9uCisgICAgICAgIC5xdWFkIGZmdDI1Nl9uZW9uICAgLSBmZnRfdGFiX25lb24KKyAgICAgICAgLnF1YWQgZmZ0NTEyX25lb24gICAtIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQxMDI0X25lb24gIC0gZmZ0X3RhYl9uZW9uCisgICAgICAgIC5xdWFkIGZmdDIwNDhfbmVvbiAgLSBmZnRfdGFiX25lb24KKyAgICAgICAgLnF1YWQgZmZ0NDA5Nl9uZW9uICAtIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQ4MTkyX25lb24gIC0gZmZ0X3RhYl9uZW9uCisgICAgICAgIC5xdWFkIGZmdDE2Mzg0X25lb24gLSBmZnRfdGFiX25lb24KKyAgICAgICAgLnF1YWQgZmZ0MzI3NjhfbmVvbiAtIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQ2NTUzNl9uZW9uIC0gZmZ0X3RhYl9uZW9uCitlbmRjb25zdAorCitjb25zdCAgIHBtbXAsIGFsaWduPTQKKyAgICAgICAgLmZsb2F0ICAgICAgICAgICsxLjAsIC0xLjAsIC0xLjAsICsxLjAKK2VuZGNvbnN0CisKK2NvbnN0ICAgbXBwbSwgYWxpZ249NAorICAgICAgICAuZmxvYXQgICAgICAgICAgLU1fU1FSVDFfMiwgTV9TUVJUMV8yLCBNX1NRUlQxXzIsIC1NX1NRUlQxXzIKK2VuZGNvbnN0CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRjaHJvbWFfaW5pdF9hYXJjaDY0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRjaHJvbWFfaW5pdF9hYXJjaDY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmNjJiZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvaDI2NGNocm9tYV9pbml0X2FhcmNoNjQuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQVJNIE5FT04gb3B0aW1pc2VkIEguMjY0IGNocm9tYSBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9oMjY0Y2hyb21hLmgiCisKKyNpbmNsdWRlICJjb25maWcuaCIKKwordm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM4X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jNF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7Cit2b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzJfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgeCwgaW50IHkpOworCit2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzhfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM0X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jMl9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7CisKK2F2X2NvbGQgdm9pZCBmZl9oMjY0Y2hyb21hX2luaXRfYWFyY2g2NChIMjY0Q2hyb21hQ29udGV4dCAqYywgaW50IGJpdF9kZXB0aCkKK3sKKyAgICBjb25zdCBpbnQgaGlnaF9iaXRfZGVwdGggPSBiaXRfZGVwdGggPiA4OworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykgJiYgIWhpZ2hfYml0X2RlcHRoKSB7CisgICAgICAgIGMtPnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfcHV0X2gyNjRfY2hyb21hX21jOF9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsxXSA9IGZmX3B1dF9oMjY0X2Nocm9tYV9tYzRfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWJbMl0gPSBmZl9wdXRfaDI2NF9jaHJvbWFfbWMyX25lb247CisKKyAgICAgICAgYy0+YXZnX2gyNjRfY2hyb21hX3BpeGVsc190YWJbMF0gPSBmZl9hdmdfaDI2NF9jaHJvbWFfbWM4X25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdID0gZmZfYXZnX2gyNjRfY2hyb21hX21jNF9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsyXSA9IGZmX2F2Z19oMjY0X2Nocm9tYV9tYzJfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRjbWNfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9oMjY0Y21jX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODYwNzlmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9oMjY0Y21jX25lb24uUwpAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBKYW5uZSBHcnVuYXUgPGphbm5lLWxpYmF2QGphbm5hdS5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9hc20uUyIKKworLyogY2hyb21hX21jOCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSkgKi8KKy5tYWNybyAgaDI2NF9jaHJvbWFfbWM4IHR5cGUsIGNvZGVjPWgyNjQKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX1xjb2RlY1woKV9jaHJvbWFfbWM4X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN4dHcgICAgICAgICAgICB4MiwgIHcyCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIG1vdiAgICAgICAgICAgICB4OCwgIHgwCisgIC5lbmRpZgorICAgICAgICBwcmZtICAgICAgICAgICAgcGxkbDFzdHJtLCBbeDFdCisgICAgICAgIHByZm0gICAgICAgICAgICBwbGRsMXN0cm0sIFt4MSwgeDJdCisgIC5pZmMgXGNvZGVjLHJ2NDAKKyAgICAgICAgbW92cmVsICAgICAgICAgIHg2LCAgcnY0MGJpYXMKKyAgICAgICAgbHNyICAgICAgICAgICAgIHc5LCAgdzUsICAjMQorICAgICAgICBsc3IgICAgICAgICAgICAgdzEwLCB3NCwgICMxCisgICAgICAgIGxzbCAgICAgICAgICAgICB3OSwgIHc5LCAgIzMKKyAgICAgICAgbHNsICAgICAgICAgICAgIHcxMCwgdzEwLCAjMQorICAgICAgICBhZGQgICAgICAgICAgICAgdzksICB3OSwgIHcxMAorICAgICAgICBhZGQgICAgICAgICAgICAgeDYsICB4NiwgIHc5LCBVWFRXCisgICAgICAgIGxkMXIgICAgICAgICAgICB7djIyLjhIfSwgW3g2XQorICAuZW5kaWYKKyAgLmlmYyBcY29kZWMsdmMxCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MjIuOEgsICAgIzI4CisgIC5lbmRpZgorICAgICAgICBtdWwgICAgICAgICAgICAgdzcsICB3NCwgIHc1CisgICAgICAgIGxzbCAgICAgICAgICAgICB3MTQsIHc1LCAgIzMKKyAgICAgICAgbHNsICAgICAgICAgICAgIHcxMywgdzQsICAjMworICAgICAgICBjbXAgICAgICAgICAgICAgdzcsICAjMAorICAgICAgICBzdWIgICAgICAgICAgICAgdzYsICB3MTQsIHc3CisgICAgICAgIHN1YiAgICAgICAgICAgICB3MTIsIHcxMywgdzcKKyAgICAgICAgc3ViICAgICAgICAgICAgIHc0LCAgdzcsICB3MTMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHc0LCAgdzQsICB3MTQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHc0LCAgdzQsICAjNjQKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDJmCisKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYwLjhCLCAgdzQKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYxLjhCLCAgdzEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOEIsIHY1LjhCfSwgW3gxXSwgeDIKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYyLjhCLCAgdzYKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYzLjhCLCAgdzcKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHY1LjhCLCAgdjQuOEIsICB2NS44QiwgICMxCisxOiAgICAgIGxkMSAgICAgICAgICAgICB7djYuOEIsIHY3LjhCfSwgW3gxXSwgeDIKKyAgICAgICAgdW11bGwgICAgICAgICAgIHYxNi44SCwgdjQuOEIsICB2MC44QgorICAgICAgICB1bWxhbCAgICAgICAgICAgdjE2LjhILCB2NS44QiwgIHYxLjhCCisgICAgICAgIGV4dCAgICAgICAgICAgICB2Ny44QiwgIHY2LjhCLCAgdjcuOEIsICAjMQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhCLCB2NS44Qn0sIFt4MV0sIHgyCisgICAgICAgIHVtbGFsICAgICAgICAgICB2MTYuOEgsIHY2LjhCLCAgdjIuOEIKKyAgICAgICAgcHJmbSAgICAgICAgICAgIHBsZGwxc3RybSwgW3gxXQorICAgICAgICBleHQgICAgICAgICAgICAgdjUuOEIsICB2NC44QiwgIHY1LjhCLCAgIzEKKyAgICAgICAgdW1sYWwgICAgICAgICAgIHYxNi44SCwgdjcuOEIsICB2My44QgorICAgICAgICB1bXVsbCAgICAgICAgICAgdjE3LjhILCB2Ni44QiwgIHYwLjhCCisgICAgICAgIHN1YnMgICAgICAgICAgICB3MywgIHczLCAgIzIKKyAgICAgICAgdW1sYWwgICAgICAgICAgIHYxNy44SCwgdjcuOEIsIHYxLjhCCisgICAgICAgIHVtbGFsICAgICAgICAgICB2MTcuOEgsIHY0LjhCLCB2Mi44QgorICAgICAgICB1bWxhbCAgICAgICAgICAgdjE3LjhILCB2NS44QiwgdjMuOEIKKyAgICAgICAgcHJmbSAgICAgICAgICAgIHBsZGwxc3RybSwgW3gxLCB4Ml0KKyAgLmlmYyBcY29kZWMsaDI2NAorICAgICAgICByc2hybiAgICAgICAgICAgdjE2LjhCLCB2MTYuOEgsICM2CisgICAgICAgIHJzaHJuICAgICAgICAgICB2MTcuOEIsIHYxNy44SCwgIzYKKyAgLmVsc2UKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNi44SCwgdjE2LjhILCB2MjIuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNy44SCwgdjE3LjhILCB2MjIuOEgKKyAgICAgICAgc2hybiAgICAgICAgICAgIHYxNi44QiwgdjE2LjhILCAjNgorICAgICAgICBzaHJuICAgICAgICAgICAgdjE3LjhCLCB2MTcuOEgsICM2CisgIC5lbmRpZgorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC44Qn0sIFt4OF0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLjhCfSwgW3g4XSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNi44QiwgdjE2LjhCLCB2MjAuOEIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNy44QiwgdjE3LjhCLCB2MjEuOEIKKyAgLmVuZGlmCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTcuOEJ9LCBbeDBdLCB4MgorICAgICAgICBiLmd0ICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CisKKzI6ICAgICAgYWRkcyAgICAgICAgICAgIHcxMiwgdzEyLCB3NgorICAgICAgICBkdXAgICAgICAgICAgICAgdjAuOEIsIHc0CisgICAgICAgIGIuZXEgICAgICAgICAgICA1ZgorICAgICAgICB0c3QgICAgICAgICAgICAgdzYsICB3NgorICAgICAgICBkdXAgICAgICAgICAgICAgdjEuOEIsIHcxMgorICAgICAgICBiLmVxICAgICAgICAgICAgNGYKKworICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhCfSwgW3gxXSwgeDIKKzM6ICAgICAgbGQxICAgICAgICAgICAgIHt2Ni44Qn0sIFt4MV0sIHgyCisgICAgICAgIHVtdWxsICAgICAgICAgICB2MTYuOEgsIHY0LjhCLCAgdjAuOEIKKyAgICAgICAgdW1sYWwgICAgICAgICAgIHYxNi44SCwgdjYuOEIsICB2MS44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhCfSwgW3gxXSwgeDIKKyAgICAgICAgdW11bGwgICAgICAgICAgIHYxNy44SCwgdjYuOEIsICB2MC44QgorICAgICAgICB1bWxhbCAgICAgICAgICAgdjE3LjhILCB2NC44QiwgIHYxLjhCCisgICAgICAgIHByZm0gICAgICAgICAgICBwbGRsMXN0cm0sIFt4MV0KKyAgLmlmYyBcY29kZWMsaDI2NAorICAgICAgICByc2hybiAgICAgICAgICAgdjE2LjhCLCB2MTYuOEgsICM2CisgICAgICAgIHJzaHJuICAgICAgICAgICB2MTcuOEIsIHYxNy44SCwgIzYKKyAgLmVsc2UKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNi44SCwgdjE2LjhILCB2MjIuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNy44SCwgdjE3LjhILCB2MjIuOEgKKyAgICAgICAgc2hybiAgICAgICAgICAgIHYxNi44QiwgdjE2LjhILCAjNgorICAgICAgICBzaHJuICAgICAgICAgICAgdjE3LjhCLCB2MTcuOEgsICM2CisgIC5lbmRpZgorICAgICAgICBwcmZtICAgICAgICAgICAgcGxkbDFzdHJtLCBbeDEsIHgyXQorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC44Qn0sIFt4OF0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLjhCfSwgW3g4XSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNi44QiwgdjE2LjhCLCB2MjAuOEIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNy44QiwgdjE3LjhCLCB2MjEuOEIKKyAgLmVuZGlmCisgICAgICAgIHN1YnMgICAgICAgICAgICB3MywgIHczLCAgIzIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuOEJ9LCBbeDBdLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNy44Qn0sIFt4MF0sIHgyCisgICAgICAgIGIuZ3QgICAgICAgICAgICAzYgorICAgICAgICByZXQKKworNDogICAgICBsZDEgICAgICAgICAgICAge3Y0LjhCLCB2NS44Qn0sIFt4MV0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuOEIsIHY3LjhCfSwgW3gxXSwgeDIKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHY1LjhCLCAgdjQuOEIsICB2NS44QiwgICMxCisgICAgICAgIGV4dCAgICAgICAgICAgICB2Ny44QiwgIHY2LjhCLCAgdjcuOEIsICAjMQorICAgICAgICBwcmZtICAgICAgICAgICAgcGxkbDFzdHJtLCBbeDFdCisgICAgICAgIHN1YnMgICAgICAgICAgICB3MywgIHczLCAgIzIKKyAgICAgICAgdW11bGwgICAgICAgICAgIHYxNi44SCwgdjQuOEIsIHYwLjhCCisgICAgICAgIHVtbGFsICAgICAgICAgICB2MTYuOEgsIHY1LjhCLCB2MS44QgorICAgICAgICB1bXVsbCAgICAgICAgICAgdjE3LjhILCB2Ni44QiwgdjAuOEIKKyAgICAgICAgdW1sYWwgICAgICAgICAgIHYxNy44SCwgdjcuOEIsIHYxLjhCCisgICAgICAgIHByZm0gICAgICAgICAgICBwbGRsMXN0cm0sIFt4MSwgeDJdCisgIC5pZmMgXGNvZGVjLGgyNjQKKyAgICAgICAgcnNocm4gICAgICAgICAgIHYxNi44QiwgdjE2LjhILCAjNgorICAgICAgICByc2hybiAgICAgICAgICAgdjE3LjhCLCB2MTcuOEgsICM2CisgIC5lbHNlCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTYuOEgsIHYxNi44SCwgdjIyLjhICisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTcuOEgsIHYxNy44SCwgdjIyLjhICisgICAgICAgIHNocm4gICAgICAgICAgICB2MTYuOEIsIHYxNi44SCwgIzYKKyAgICAgICAgc2hybiAgICAgICAgICAgIHYxNy44QiwgdjE3LjhILCAjNgorICAuZW5kaWYKKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOEJ9LCBbeDhdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMS44Qn0sIFt4OF0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MTYuOEIsIHYxNi44QiwgdjIwLjhCCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MTcuOEIsIHYxNy44QiwgdjIxLjhCCisgIC5lbmRpZgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi44Qn0sIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE3LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDRiCisgICAgICAgIHJldAorCis1OiAgICAgIGxkMSAgICAgICAgICAgICB7djQuOEJ9LCBbeDFdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjhCfSwgW3gxXSwgeDIKKyAgICAgICAgcHJmbSAgICAgICAgICAgIHBsZGwxc3RybSwgW3gxXQorICAgICAgICBzdWJzICAgICAgICAgICAgdzMsICB3MywgICMyCisgICAgICAgIHVtdWxsICAgICAgICAgICB2MTYuOEgsIHY0LjhCLCB2MC44QgorICAgICAgICB1bXVsbCAgICAgICAgICAgdjE3LjhILCB2NS44QiwgdjAuOEIKKyAgICAgICAgcHJmbSAgICAgICAgICAgIHBsZGwxc3RybSwgW3gxLCB4Ml0KKyAgLmlmYyBcY29kZWMsaDI2NAorICAgICAgICByc2hybiAgICAgICAgICAgdjE2LjhCLCB2MTYuOEgsICM2CisgICAgICAgIHJzaHJuICAgICAgICAgICB2MTcuOEIsIHYxNy44SCwgIzYKKyAgLmVsc2UKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNi44SCwgdjE2LjhILCB2MjIuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNy44SCwgdjE3LjhILCB2MjIuOEgKKyAgICAgICAgc2hybiAgICAgICAgICAgIHYxNi44QiwgdjE2LjhILCAjNgorICAgICAgICBzaHJuICAgICAgICAgICAgdjE3LjhCLCB2MTcuOEgsICM2CisgIC5lbmRpZgorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC44Qn0sIFt4OF0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLjhCfSwgW3g4XSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNi44QiwgdjE2LjhCLCB2MjAuOEIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNy44QiwgdjE3LjhCLCB2MjEuOEIKKyAgLmVuZGlmCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTcuOEJ9LCBbeDBdLCB4MgorICAgICAgICBiLmd0ICAgICAgICAgICAgNWIKKyAgICAgICAgcmV0CitlbmRmdW5jCisuZW5kbQorCisvKiBjaHJvbWFfbWM0KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KSAqLworLm1hY3JvICBoMjY0X2Nocm9tYV9tYzQgdHlwZSwgY29kZWM9aDI2NAorZnVuY3Rpb24gZmZfXHR5cGVcKClfXGNvZGVjXCgpX2Nocm9tYV9tYzRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3h0dyAgICAgICAgICAgIHgyLCAgdzIKKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgLmVuZGlmCisgICAgICAgIHByZm0gICAgICAgICAgICBwbGRsMXN0cm0sIFt4MV0KKyAgICAgICAgcHJmbSAgICAgICAgICAgIHBsZGwxc3RybSwgW3gxLCB4Ml0KKyAgLmlmYyBcY29kZWMscnY0MAorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDYsICBydjQwYmlhcworICAgICAgICBsc3IgICAgICAgICAgICAgdzksICB3NSwgICMxCisgICAgICAgIGxzciAgICAgICAgICAgICB3MTAsIHc0LCAgIzEKKyAgICAgICAgbHNsICAgICAgICAgICAgIHc5LCAgdzksICAjMworICAgICAgICBsc2wgICAgICAgICAgICAgdzEwLCB3MTAsICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICB3OSwgIHc5LCAgdzEwCisgICAgICAgIGFkZCAgICAgICAgICAgICB4NiwgIHg2LCAgdzksIFVYVFcKKyAgICAgICAgbGQxciAgICAgICAgICAgIHt2MjIuOEh9LCBbeDZdCisgIC5lbmRpZgorICAuaWZjIFxjb2RlYyx2YzEKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYyMi44SCwgICAjMjgKKyAgLmVuZGlmCisgICAgICAgIG11bCAgICAgICAgICAgICB3NywgIHc0LCAgdzUKKyAgICAgICAgbHNsICAgICAgICAgICAgIHcxNCwgdzUsICAjMworICAgICAgICBsc2wgICAgICAgICAgICAgdzEzLCB3NCwgICMzCisgICAgICAgIGNtcCAgICAgICAgICAgICB3NywgICMwCisgICAgICAgIHN1YiAgICAgICAgICAgICB3NiwgIHcxNCwgdzcKKyAgICAgICAgc3ViICAgICAgICAgICAgIHcxMiwgdzEzLCB3NworICAgICAgICBzdWIgICAgICAgICAgICAgdzQsICB3NywgIHcxMworICAgICAgICBzdWIgICAgICAgICAgICAgdzQsICB3NCwgIHcxNAorICAgICAgICBhZGQgICAgICAgICAgICAgdzQsICB3NCwgICM2NAorICAgICAgICBiLmVxICAgICAgICAgICAgMmYKKworICAgICAgICBkdXAgICAgICAgICAgICAgdjI0LjhCLCAgdzQKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYyNS44QiwgIHcxMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhCfSwgW3gxXSwgeDIKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYyNi44QiwgIHc2CisgICAgICAgIGR1cCAgICAgICAgICAgICB2MjcuOEIsICB3NworICAgICAgICBleHQgICAgICAgICAgICAgdjUuOEIsICB2NC44QiwgIHY1LjhCLCAjMQorICAgICAgICB0cm4xICAgICAgICAgICAgdjAuMlMsICB2MjQuMlMsIHYyNS4yUworICAgICAgICB0cm4xICAgICAgICAgICAgdjIuMlMsICB2MjYuMlMsIHYyNy4yUworICAgICAgICB0cm4xICAgICAgICAgICAgdjQuMlMsICB2NC4yUywgIHY1LjJTCisxOiAgICAgIGxkMSAgICAgICAgICAgICB7djYuOEJ9LCBbeDFdLCB4MgorICAgICAgICBleHQgICAgICAgICAgICAgdjcuOEIsICB2Ni44QiwgIHY3LjhCLCAjMQorICAgICAgICB0cm4xICAgICAgICAgICAgdjYuMlMsICB2Ni4yUywgIHY3LjJTCisgICAgICAgIHVtdWxsICAgICAgICAgICB2MTguOEgsIHY0LjhCLCAgdjAuOEIKKyAgICAgICAgdW1sYWwgICAgICAgICAgIHYxOC44SCwgdjYuOEIsICB2Mi44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhCfSwgW3gxXSwgeDIKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHY1LjhCLCAgdjQuOEIsICB2NS44QiwgIzEKKyAgICAgICAgdHJuMSAgICAgICAgICAgIHY0LjJTLCAgdjQuMlMsICB2NS4yUworICAgICAgICBwcmZtICAgICAgICAgICAgcGxkbDFzdHJtLCBbeDFdCisgICAgICAgIHVtdWxsICAgICAgICAgICB2MTkuOEgsIHY2LjhCLCAgdjAuOEIKKyAgICAgICAgdW1sYWwgICAgICAgICAgIHYxOS44SCwgdjQuOEIsICB2Mi44QgorICAgICAgICB0cm4xICAgICAgICAgICAgdjMwLjJELCB2MTguMkQsIHYxOS4yRAorICAgICAgICB0cm4yICAgICAgICAgICAgdjMxLjJELCB2MTguMkQsIHYxOS4yRAorICAgICAgICBhZGQgICAgICAgICAgICAgdjE4LjhILCB2MzAuOEgsIHYzMS44SAorICAuaWZjIFxjb2RlYyxoMjY0CisgICAgICAgIHJzaHJuICAgICAgICAgICB2MTYuOEIsIHYxOC44SCwgIzYKKyAgLmVsc2UKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxOC44SCwgdjE4LjhILCB2MjIuOEgKKyAgICAgICAgc2hybiAgICAgICAgICAgIHYxNi44QiwgdjE4LjhILCAjNgorICAuZW5kaWYKKyAgICAgICAgc3VicyAgICAgICAgICAgIHczLCAgdzMsICAjMgorICAgICAgICBwcmZtICAgICAgICAgICAgcGxkbDFzdHJtLCBbeDEsIHgyXQorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC5TfVswXSwgW3g4XSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuU31bMV0sIFt4OF0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MTYuOEIsIHYxNi44QiwgdjIwLjhCCisgIC5lbmRpZgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi5TfVswXSwgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuU31bMV0sIFt4MF0sIHgyCisgICAgICAgIGIuZ3QgICAgICAgICAgICAxYgorICAgICAgICByZXQKKworMjogICAgICBhZGRzICAgICAgICAgICAgdzEyLCB3MTIsIHc2CisgICAgICAgIGR1cCAgICAgICAgICAgICB2MzAuOEIsIHc0CisgICAgICAgIGIuZXEgICAgICAgICAgICA1ZgorICAgICAgICB0c3QgICAgICAgICAgICAgdzYsICB3NgorICAgICAgICBkdXAgICAgICAgICAgICAgdjMxLjhCLCB3MTIKKyAgICAgICAgdHJuMSAgICAgICAgICAgIHYwLjJTLCAgdjMwLjJTLCB2MzEuMlMKKyAgICAgICAgdHJuMiAgICAgICAgICAgIHYxLjJTLCAgdjMwLjJTLCB2MzEuMlMKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDRmCisKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYxLjhCLCAgdjAuOEIsICB2MS44QiwgIzQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC5TfVswXSwgW3gxXSwgeDIKKzM6ICAgICAgbGQxICAgICAgICAgICAgIHt2NC5TfVsxXSwgW3gxXSwgeDIKKyAgICAgICAgdW11bGwgICAgICAgICAgIHYxOC44SCwgdjQuOEIsICB2MC44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LlN9WzBdLCBbeDFdLCB4MgorICAgICAgICB1bXVsbCAgICAgICAgICAgdjE5LjhILCB2NC44QiwgIHYxLjhCCisgICAgICAgIHRybjEgICAgICAgICAgICB2MzAuMkQsIHYxOC4yRCwgdjE5LjJECisgICAgICAgIHRybjIgICAgICAgICAgICB2MzEuMkQsIHYxOC4yRCwgdjE5LjJECisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTguOEgsIHYzMC44SCwgdjMxLjhICisgICAgICAgIHByZm0gICAgICAgICAgICBwbGRsMXN0cm0sIFt4MV0KKyAgLmlmYyBcY29kZWMsaDI2NAorICAgICAgICByc2hybiAgICAgICAgICAgdjE2LjhCLCB2MTguOEgsICM2CisgIC5lbHNlCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTguOEgsIHYxOC44SCwgdjIyLjhICisgICAgICAgIHNocm4gICAgICAgICAgICB2MTYuOEIsIHYxOC44SCwgIzYKKyAgLmVuZGlmCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLlN9WzBdLCBbeDhdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC5TfVsxXSwgW3g4XSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNi44QiwgdjE2LjhCLCB2MjAuOEIKKyAgLmVuZGlmCisgICAgICAgIHN1YnMgICAgICAgICAgICB3MywgIHczLCAgIzIKKyAgICAgICAgcHJmbSAgICAgICAgICAgIHBsZGwxc3RybSwgW3gxLCB4Ml0KKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuU31bMF0sIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LlN9WzFdLCBbeDBdLCB4MgorICAgICAgICBiLmd0ICAgICAgICAgICAgM2IKKyAgICAgICAgcmV0CisKKzQ6ICAgICAgbGQxICAgICAgICAgICAgIHt2NC44Qn0sIFt4MV0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuOEJ9LCBbeDFdLCB4MgorICAgICAgICBleHQgICAgICAgICAgICAgdjUuOEIsICB2NC44QiwgIHY1LjhCLCAjMQorICAgICAgICBleHQgICAgICAgICAgICAgdjcuOEIsICB2Ni44QiwgIHY3LjhCLCAjMQorICAgICAgICB0cm4xICAgICAgICAgICAgdjQuMlMsICB2NC4yUywgIHY1LjJTCisgICAgICAgIHRybjEgICAgICAgICAgICB2Ni4yUywgIHY2LjJTLCAgdjcuMlMKKyAgICAgICAgdW11bGwgICAgICAgICAgIHYxOC44SCwgdjQuOEIsICB2MC44QgorICAgICAgICB1bXVsbCAgICAgICAgICAgdjE5LjhILCB2Ni44QiwgIHYwLjhCCisgICAgICAgIHN1YnMgICAgICAgICAgICB3MywgIHczLCAgIzIKKyAgICAgICAgdHJuMSAgICAgICAgICAgIHYzMC4yRCwgdjE4LjJELCB2MTkuMkQKKyAgICAgICAgdHJuMiAgICAgICAgICAgIHYzMS4yRCwgdjE4LjJELCB2MTkuMkQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxOC44SCwgdjMwLjhILCB2MzEuOEgKKyAgICAgICAgcHJmbSAgICAgICAgICAgIHBsZGwxc3RybSwgW3gxXQorICAuaWZjIFxjb2RlYyxoMjY0CisgICAgICAgIHJzaHJuICAgICAgICAgICB2MTYuOEIsIHYxOC44SCwgIzYKKyAgLmVsc2UKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxOC44SCwgdjE4LjhILCB2MjIuOEgKKyAgICAgICAgc2hybiAgICAgICAgICAgIHYxNi44QiwgdjE4LjhILCAjNgorICAuZW5kaWYKKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuU31bMF0sIFt4OF0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLlN9WzFdLCBbeDhdLCB4MgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE2LjhCLCB2MTYuOEIsIHYyMC44QgorICAuZW5kaWYKKyAgICAgICAgcHJmbSAgICAgICAgICAgIHBsZGwxc3RybSwgW3gxXQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi5TfVswXSwgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuU31bMV0sIFt4MF0sIHgyCisgICAgICAgIGIuZ3QgICAgICAgICAgICA0YgorICAgICAgICByZXQKKworNTogICAgICBsZDEgICAgICAgICAgICAge3Y0LlN9WzBdLCBbeDFdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LlN9WzFdLCBbeDFdLCB4MgorICAgICAgICB1bXVsbCAgICAgICAgICAgdjE4LjhILCB2NC44QiwgIHYzMC44QgorICAgICAgICBzdWJzICAgICAgICAgICAgdzMsICB3MywgICMyCisgICAgICAgIHByZm0gICAgICAgICAgICBwbGRsMXN0cm0sIFt4MV0KKyAgLmlmYyBcY29kZWMsaDI2NAorICAgICAgICByc2hybiAgICAgICAgICAgdjE2LjhCLCB2MTguOEgsICM2CisgIC5lbHNlCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTguOEgsIHYxOC44SCwgdjIyLjhICisgICAgICAgIHNocm4gICAgICAgICAgICB2MTYuOEIsIHYxOC44SCwgIzYKKyAgLmVuZGlmCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLlN9WzBdLCBbeDhdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC5TfVsxXSwgW3g4XSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNi44QiwgdjE2LjhCLCB2MjAuOEIKKyAgLmVuZGlmCisgICAgICAgIHByZm0gICAgICAgICAgICBwbGRsMXN0cm0sIFt4MV0KKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuU31bMF0sIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LlN9WzFdLCBbeDBdLCB4MgorICAgICAgICBiLmd0ICAgICAgICAgICAgNWIKKyAgICAgICAgcmV0CitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gIGgyNjRfY2hyb21hX21jMiB0eXBlCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X2Nocm9tYV9tYzJfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3h0dyAgICAgICAgICAgIHgyLCAgdzIKKyAgICAgICAgcHJmbSAgICAgICAgICAgIHBsZGwxc3RybSwgW3gxXQorICAgICAgICBwcmZtICAgICAgICAgICAgcGxkbDFzdHJtLCBbeDEsIHgyXQorICAgICAgICBvcnIgICAgICAgICAgICAgdzcsICB3NCwgIHc1CisgICAgICAgIGNieiAgICAgICAgICAgICB3NywgIDJmCisKKyAgICAgICAgbXVsICAgICAgICAgICAgIHc3LCAgdzQsICB3NQorICAgICAgICBsc2wgICAgICAgICAgICAgdzE0LCB3NSwgICMzCisgICAgICAgIGxzbCAgICAgICAgICAgICB3MTMsIHc0LCAgIzMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHc2LCAgdzE0LCB3NworICAgICAgICBzdWIgICAgICAgICAgICAgdzEyLCB3MTMsIHc3CisgICAgICAgIHN1YiAgICAgICAgICAgICB3NCwgIHc3LCAgdzEzCisgICAgICAgIHN1YiAgICAgICAgICAgICB3NCwgIHc0LCAgdzE0CisgICAgICAgIGFkZCAgICAgICAgICAgICB3NCwgIHc0LCAgIzY0CisgICAgICAgIGR1cCAgICAgICAgICAgICB2MC44QiwgIHc0CisgICAgICAgIGR1cCAgICAgICAgICAgICB2Mi44QiwgIHcxMgorICAgICAgICBkdXAgICAgICAgICAgICAgdjEuOEIsICB3NgorICAgICAgICBkdXAgICAgICAgICAgICAgdjMuOEIsICB3NworICAgICAgICB0cm4xICAgICAgICAgICAgdjAuNEgsICB2MC40SCwgIHYyLjRICisgICAgICAgIHRybjEgICAgICAgICAgICB2MS40SCwgIHYxLjRILCAgdjMuNEgKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuU31bMF0sICBbeDFdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LlN9WzFdLCAgW3gxXSwgeDIKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY1LjJTLCAgdjQuMlMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS5TfVsxXSwgIFt4MV0KKyAgICAgICAgZXh0ICAgICAgICAgICAgIHY2LjhCLCAgdjQuOEIsICB2NS44QiwgICMxCisgICAgICAgIGV4dCAgICAgICAgICAgICB2Ny44QiwgIHY1LjhCLCAgdjQuOEIsICAjMQorICAgICAgICB0cm4xICAgICAgICAgICAgdjQuNEgsICB2NC40SCwgIHY2LjRICisgICAgICAgIHRybjEgICAgICAgICAgICB2NS40SCwgIHY1LjRILCAgdjcuNEgKKyAgICAgICAgdW11bGwgICAgICAgICAgIHYxNi44SCwgdjQuOEIsICB2MC44QgorICAgICAgICB1bWxhbCAgICAgICAgICAgdjE2LjhILCB2NS44QiwgIHYxLjhCCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE4Lkh9WzBdLCBbeDBdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxOC5IfVsyXSwgW3gwXQorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgyCisgIC5lbmRpZgorICAgICAgICByZXY2NCAgICAgICAgICAgdjE3LjRTLCB2MTYuNFMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNi44SCwgdjE2LjhILCB2MTcuOEgKKyAgICAgICAgcnNocm4gICAgICAgICAgIHYxNi44QiwgdjE2LjhILCAjNgorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICB1cmhhZGQgICAgICAgICAgdjE2LjhCLCB2MTYuOEIsIHYxOC44QgorICAuZW5kaWYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuSH1bMF0sIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2Lkh9WzJdLCBbeDBdLCB4MgorICAgICAgICBzdWJzICAgICAgICAgICAgdzMsICB3MywgICMyCisgICAgICAgIGIuZ3QgICAgICAgICAgICAxYgorICAgICAgICByZXQKKworMjoKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTYuSH1bMF0sIFt4MV0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2Lkh9WzFdLCBbeDFdLCB4MgorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3YxOC5IfVswXSwgW3gwXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguSH1bMV0sIFt4MF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE2LjhCLCB2MTYuOEIsIHYxOC44QgorICAuZW5kaWYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuSH1bMF0sIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2Lkh9WzFdLCBbeDBdLCB4MgorICAgICAgICBzdWJzICAgICAgICAgICAgdzMsICB3MywgICMyCisgICAgICAgIGIuZ3QgICAgICAgICAgICAyYgorICAgICAgICByZXQKK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgaDI2NF9jaHJvbWFfbWM4IHB1dAorICAgICAgICBoMjY0X2Nocm9tYV9tYzggYXZnCisgICAgICAgIGgyNjRfY2hyb21hX21jNCBwdXQKKyAgICAgICAgaDI2NF9jaHJvbWFfbWM0IGF2ZworICAgICAgICBoMjY0X2Nocm9tYV9tYzIgcHV0CisgICAgICAgIGgyNjRfY2hyb21hX21jMiBhdmcKKworI2lmIENPTkZJR19SVjQwX0RFQ09ERVIKK2NvbnN0ICAgcnY0MGJpYXMKKyAgICAgICAgLnNob3J0ICAgICAgICAgICAwLCAxNiwgMzIsIDE2CisgICAgICAgIC5zaG9ydCAgICAgICAgICAzMiwgMjgsIDMyLCAyOAorICAgICAgICAuc2hvcnQgICAgICAgICAgIDAsIDMyLCAxNiwgMzIKKyAgICAgICAgLnNob3J0ICAgICAgICAgIDMyLCAyOCwgMzIsIDI4CitlbmRjb25zdAorCisgICAgICAgIGgyNjRfY2hyb21hX21jOCBwdXQsIHJ2NDAKKyAgICAgICAgaDI2NF9jaHJvbWFfbWM4IGF2ZywgcnY0MAorICAgICAgICBoMjY0X2Nocm9tYV9tYzQgcHV0LCBydjQwCisgICAgICAgIGgyNjRfY2hyb21hX21jNCBhdmcsIHJ2NDAKKyNlbmRpZgorCisjaWYgQ09ORklHX1ZDMV9ERUNPREVSCisgICAgICAgIGgyNjRfY2hyb21hX21jOCBwdXQsIHZjMQorICAgICAgICBoMjY0X2Nocm9tYV9tYzggYXZnLCB2YzEKKyAgICAgICAgaDI2NF9jaHJvbWFfbWM0IHB1dCwgdmMxCisgICAgICAgIGgyNjRfY2hyb21hX21jNCBhdmcsIHZjMQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRkc3BfaW5pdF9hYXJjaDY0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRkc3BfaW5pdF9hYXJjaDY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ1ZTRiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvaDI2NGRzcF9pbml0X2FhcmNoNjQuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9oMjY0ZHNwLmgiCisKK3ZvaWQgZmZfaDI2NF92X2xvb3BfZmlsdGVyX2x1bWFfbmVvbih1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmV0YSwgaW50OF90ICp0YzApOwordm9pZCBmZl9oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9uZW9uKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXRhLCBpbnQ4X3QgKnRjMCk7Cit2b2lkIGZmX2gyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWFfbmVvbih1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXRhLCBpbnQ4X3QgKnRjMCk7Cit2b2lkIGZmX2gyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfbmVvbih1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXRhLCBpbnQ4X3QgKnRjMCk7CisKK3ZvaWQgZmZfd2VpZ2h0X2gyNjRfcGl4ZWxzXzE2X25lb24odWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW4sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpOwordm9pZCBmZl93ZWlnaHRfaDI2NF9waXhlbHNfOF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW4sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpOwordm9pZCBmZl93ZWlnaHRfaDI2NF9waXhlbHNfNF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW4sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpOworCit2b2lkIGZmX2Jpd2VpZ2h0X2gyNjRfcGl4ZWxzXzE2X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGxvZzJfZGVuLCBpbnQgd2VpZ2h0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0cywgaW50IG9mZnNldCk7Cit2b2lkIGZmX2Jpd2VpZ2h0X2gyNjRfcGl4ZWxzXzhfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBsb2cyX2RlbiwgaW50IHdlaWdodGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0cywgaW50IG9mZnNldCk7Cit2b2lkIGZmX2Jpd2VpZ2h0X2gyNjRfcGl4ZWxzXzRfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBsb2cyX2RlbiwgaW50IHdlaWdodGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0cywgaW50IG9mZnNldCk7CisKK3ZvaWQgZmZfaDI2NF9pZGN0X2FkZF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpOwordm9pZCBmZl9oMjY0X2lkY3RfZGNfYWRkX25lb24odWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSk7Cit2b2lkIGZmX2gyNjRfaWRjdF9hZGQxNl9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgaW50ICpibG9ja19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5uemNbNio4XSk7Cit2b2lkIGZmX2gyNjRfaWRjdF9hZGQxNmludHJhX25lb24odWludDhfdCAqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5uemNbNio4XSk7Cit2b2lkIGZmX2gyNjRfaWRjdF9hZGQ4X25lb24odWludDhfdCAqKmRlc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2KjhdKTsKKwordm9pZCBmZl9oMjY0X2lkY3Q4X2FkZF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpOwordm9pZCBmZl9oMjY0X2lkY3Q4X2RjX2FkZF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpOwordm9pZCBmZl9oMjY0X2lkY3Q4X2FkZDRfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYqOF0pOworCithdl9jb2xkIHZvaWQgZmZfaDI2NGRzcF9pbml0X2FhcmNoNjQoSDI2NERTUENvbnRleHQgKmMsIGNvbnN0IGludCBiaXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNocm9tYV9mb3JtYXRfaWRjKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykgJiYgYml0X2RlcHRoID09IDgpIHsKKyAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2x1bWEgICA9IGZmX2gyNjRfdl9sb29wX2ZpbHRlcl9sdW1hX25lb247CisgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hICAgPSBmZl9oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9uZW9uOworICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfY2hyb21hID0gZmZfaDI2NF92X2xvb3BfZmlsdGVyX2Nocm9tYV9uZW9uOworICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hID0gZmZfaDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYV9uZW9uOworCisgICAgICAgIGMtPndlaWdodF9oMjY0X3BpeGVsc190YWJbMF0gPSBmZl93ZWlnaHRfaDI2NF9waXhlbHNfMTZfbmVvbjsKKyAgICAgICAgYy0+d2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlsxXSA9IGZmX3dlaWdodF9oMjY0X3BpeGVsc184X25lb247CisgICAgICAgIGMtPndlaWdodF9oMjY0X3BpeGVsc190YWJbMl0gPSBmZl93ZWlnaHRfaDI2NF9waXhlbHNfNF9uZW9uOworCisgICAgICAgIGMtPmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlswXSA9IGZmX2Jpd2VpZ2h0X2gyNjRfcGl4ZWxzXzE2X25lb247CisgICAgICAgIGMtPmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlsxXSA9IGZmX2Jpd2VpZ2h0X2gyNjRfcGl4ZWxzXzhfbmVvbjsKKyAgICAgICAgYy0+Yml3ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzJdID0gZmZfYml3ZWlnaHRfaDI2NF9waXhlbHNfNF9uZW9uOworCisgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQgICAgICAgID0gZmZfaDI2NF9pZGN0X2FkZF9uZW9uOworICAgICAgICBjLT5oMjY0X2lkY3RfZGNfYWRkICAgICA9IGZmX2gyNjRfaWRjdF9kY19hZGRfbmVvbjsKKyAgICAgICAgYy0+aDI2NF9pZGN0X2FkZDE2ICAgICAgPSBmZl9oMjY0X2lkY3RfYWRkMTZfbmVvbjsKKyAgICAgICAgYy0+aDI2NF9pZGN0X2FkZDE2aW50cmEgPSBmZl9oMjY0X2lkY3RfYWRkMTZpbnRyYV9uZW9uOworICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQ4ICAgPSBmZl9oMjY0X2lkY3RfYWRkOF9uZW9uOworICAgICAgICBjLT5oMjY0X2lkY3Q4X2FkZCAgICAgICA9IGZmX2gyNjRfaWRjdDhfYWRkX25lb247CisgICAgICAgIGMtPmgyNjRfaWRjdDhfZGNfYWRkICAgID0gZmZfaDI2NF9pZGN0OF9kY19hZGRfbmVvbjsKKyAgICAgICAgYy0+aDI2NF9pZGN0OF9hZGQ0ICAgICAgPSBmZl9oMjY0X2lkY3Q4X2FkZDRfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRkc3BfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9oMjY0ZHNwX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWMzNWYyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9oMjY0ZHNwX25lb24uUwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBKYW5uZSBHcnVuYXUgPGphbm5lLWxpYmF2QGphbm5hdS5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9hc20uUyIKKyNpbmNsdWRlICJuZW9uLlMiCisKKy5tYWNybyAgaDI2NF9sb29wX2ZpbHRlcl9zdGFydAorICAgICAgICBjbXAgICAgICAgICAgICAgdzIsICAjMAorICAgICAgICBsZHIgICAgICAgICAgICAgdzYsICBbeDRdCisgICAgICAgIGNjbXAgICAgICAgICAgICB3MywgICMwLCAjMCwgbmUKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyNC5TWzBdLCB3NgorICAgICAgICBhbmQgICAgICAgICAgICAgdzYsICB3NiwgIHc2LCAgbHNsICMxNgorICAgICAgICBiLmVxICAgICAgICAgICAgMWYKKyAgICAgICAgYW5kcyAgICAgICAgICAgIHc2LCAgdzYsICB3NiwgIGxzbCAjOAorICAgICAgICBiLmdlICAgICAgICAgICAgMmYKKzE6CisgICAgICAgIHJldAorMjoKKy5lbmRtCisKKy5tYWNybyAgaDI2NF9sb29wX2ZpbHRlcl9sdW1hCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MjIuMTZCLCB3MiAgICAgICAgICAgICAgICAgICAgIC8vIGFscGhhCisgICAgICAgIHV4dGwgICAgICAgICAgICB2MjQuOEgsICB2MjQuOEIKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHYyMS4xNkIsIHYxNi4xNkIsIHYwLjE2QiAgICAgICAgLy8gYWJzKHAwIC0gcTApCisgICAgICAgIHV4dGwgICAgICAgICAgICB2MjQuNFMsICB2MjQuNEgKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHYyOC4xNkIsIHYxOC4xNkIsIHYxNi4xNkIgICAgICAgLy8gYWJzKHAxIC0gcDApCisgICAgICAgIHNsaSAgICAgICAgICAgICB2MjQuOEgsICB2MjQuOEgsICAjOAorICAgICAgICB1YWJkICAgICAgICAgICAgdjMwLjE2QiwgdjIuMTZCLCAgdjAuMTZCICAgICAgICAvLyBhYnMocTEgLSBxMCkKKyAgICAgICAgc2xpICAgICAgICAgICAgIHYyNC40UywgIHYyNC40UywgICMxNgorICAgICAgICBjbWhpICAgICAgICAgICAgdjIxLjE2QiwgdjIyLjE2QiwgdjIxLjE2QiAgICAgICAvLyA8IGFscGhhCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MjIuMTZCLCB3MyAgICAgICAgICAgICAgICAgICAgIC8vIGJldGEKKyAgICAgICAgY21sdCAgICAgICAgICAgIHYyMy4xNkIsIHYyNC4xNkIsICMwCisgICAgICAgIGNtaGkgICAgICAgICAgICB2MjguMTZCLCB2MjIuMTZCLCB2MjguMTZCICAgICAgIC8vIDwgYmV0YQorICAgICAgICBjbWhpICAgICAgICAgICAgdjMwLjE2QiwgdjIyLjE2QiwgdjMwLjE2QiAgICAgICAvLyA8IGJldGEKKyAgICAgICAgYmljICAgICAgICAgICAgIHYyMS4xNkIsIHYyMS4xNkIsIHYyMy4xNkIKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHYxNy4xNkIsIHYyMC4xNkIsIHYxNi4xNkIgICAgICAgLy8gYWJzKHAyIC0gcDApCisgICAgICAgIGFuZCAgICAgICAgICAgICB2MjEuMTZCLCB2MjEuMTZCLCB2MjguMTZCCisgICAgICAgIHVhYmQgICAgICAgICAgICB2MTkuMTZCLCAgdjQuMTZCLCAgdjAuMTZCICAgICAgIC8vIGFicyhxMiAtIHEwKQorICAgICAgICBjbWhpICAgICAgICAgICAgdjE3LjE2QiwgdjIyLjE2QiwgdjE3LjE2QiAgICAgICAvLyA8IGJldGEKKyAgICAgICAgYW5kICAgICAgICAgICAgIHYyMS4xNkIsIHYyMS4xNkIsIHYzMC4xNkIKKyAgICAgICAgY21oaSAgICAgICAgICAgIHYxOS4xNkIsIHYyMi4xNkIsIHYxOS4xNkIgICAgICAgLy8gPCBiZXRhCisgICAgICAgIGFuZCAgICAgICAgICAgICB2MTcuMTZCLCB2MTcuMTZCLCB2MjEuMTZCCisgICAgICAgIGFuZCAgICAgICAgICAgICB2MTkuMTZCLCB2MTkuMTZCLCB2MjEuMTZCCisgICAgICAgIGFuZCAgICAgICAgICAgICB2MjQuMTZCLCB2MjQuMTZCLCB2MjEuMTZCCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MjguMTZCLCB2MTYuMTZCLCAgdjAuMTZCCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MjEuMTZCLCB2MjQuMTZCLCB2MTcuMTZCCisgICAgICAgIHVxYWRkICAgICAgICAgICB2MjMuMTZCLCB2MTguMTZCLCB2MjQuMTZCCisgICAgICAgIHVoYWRkICAgICAgICAgICB2MjAuMTZCLCB2MjAuMTZCLCB2MjguMTZCCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MjEuMTZCLCB2MjEuMTZCLCB2MTkuMTZCCisgICAgICAgIHVoYWRkICAgICAgICAgICB2MjguMTZCLCAgdjQuMTZCLCB2MjguMTZCCisgICAgICAgIHVtaW4gICAgICAgICAgICB2MjMuMTZCLCB2MjMuMTZCLCB2MjAuMTZCCisgICAgICAgIHVxc3ViICAgICAgICAgICB2MjIuMTZCLCB2MTguMTZCLCB2MjQuMTZCCisgICAgICAgIHVxYWRkICAgICAgICAgICB2NC4xNkIsICAgdjIuMTZCLCB2MjQuMTZCCisgICAgICAgIHVtYXggICAgICAgICAgICB2MjMuMTZCLCB2MjMuMTZCLCB2MjIuMTZCCisgICAgICAgIHVxc3ViICAgICAgICAgICB2MjIuMTZCLCAgdjIuMTZCLCB2MjQuMTZCCisgICAgICAgIHVtaW4gICAgICAgICAgICB2MjguMTZCLCAgdjQuMTZCLCB2MjguMTZCCisgICAgICAgIHV4dGwgICAgICAgICAgICB2NC44SCwgICAgdjAuOEIKKyAgICAgICAgdW1heCAgICAgICAgICAgIHYyOC4xNkIsIHYyOC4xNkIsIHYyMi4xNkIKKyAgICAgICAgdXh0bDIgICAgICAgICAgIHYyMC44SCwgICB2MC4xNkIKKyAgICAgICAgdXN1YncgICAgICAgICAgIHY0LjhILCAgICB2NC44SCwgIHYxNi44QgorICAgICAgICB1c3VidzIgICAgICAgICAgdjIwLjhILCAgdjIwLjhILCAgdjE2LjE2QgorICAgICAgICBzaGwgICAgICAgICAgICAgdjQuOEgsICAgIHY0LjhILCAgIzIKKyAgICAgICAgc2hsICAgICAgICAgICAgIHYyMC44SCwgIHYyMC44SCwgICMyCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2NC44SCwgICAgdjQuOEgsICB2MTguOEIKKyAgICAgICAgdWFkZHcyICAgICAgICAgIHYyMC44SCwgIHYyMC44SCwgIHYxOC4xNkIKKyAgICAgICAgdXN1YncgICAgICAgICAgIHY0LjhILCAgICB2NC44SCwgICB2Mi44QgorICAgICAgICB1c3VidzIgICAgICAgICAgdjIwLjhILCAgdjIwLjhILCAgIHYyLjE2QgorICAgICAgICByc2hybiAgICAgICAgICAgdjQuOEIsICAgIHY0LjhILCAgIzMKKyAgICAgICAgcnNocm4yICAgICAgICAgIHY0LjE2QiwgIHYyMC44SCwgICMzCisgICAgICAgIGJzbCAgICAgICAgICAgICB2MTcuMTZCLCB2MjMuMTZCLCB2MTguMTZCCisgICAgICAgIGJzbCAgICAgICAgICAgICB2MTkuMTZCLCB2MjguMTZCLCAgdjIuMTZCCisgICAgICAgIG5lZyAgICAgICAgICAgICB2MjMuMTZCLCB2MjEuMTZCCisgICAgICAgIHV4dGwgICAgICAgICAgICB2MjguOEgsICB2MTYuOEIKKyAgICAgICAgc21pbiAgICAgICAgICAgIHY0LjE2QiwgICB2NC4xNkIsIHYyMS4xNkIKKyAgICAgICAgdXh0bDIgICAgICAgICAgIHYyMS44SCwgIHYxNi4xNkIKKyAgICAgICAgc21heCAgICAgICAgICAgIHY0LjE2QiwgICB2NC4xNkIsIHYyMy4xNkIKKyAgICAgICAgdXh0bCAgICAgICAgICAgIHYyMi44SCwgICB2MC44QgorICAgICAgICB1eHRsMiAgICAgICAgICAgdjI0LjhILCAgIHYwLjE2QgorICAgICAgICBzYWRkdyAgICAgICAgICAgdjI4LjhILCAgdjI4LjhILCAgdjQuOEIKKyAgICAgICAgc2FkZHcyICAgICAgICAgIHYyMS44SCwgIHYyMS44SCwgIHY0LjE2QgorICAgICAgICBzc3VidyAgICAgICAgICAgdjIyLjhILCAgdjIyLjhILCAgdjQuOEIKKyAgICAgICAgc3N1YncyICAgICAgICAgIHYyNC44SCwgIHYyNC44SCwgIHY0LjE2QgorICAgICAgICBzcXh0dW4gICAgICAgICAgdjE2LjhCLCAgdjI4LjhICisgICAgICAgIHNxeHR1bjIgICAgICAgICB2MTYuMTZCLCB2MjEuOEgKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYwLjhCLCAgIHYyMi44SAorICAgICAgICBzcXh0dW4yICAgICAgICAgdjAuMTZCLCAgdjI0LjhICisuZW5kbQorCitmdW5jdGlvbiBmZl9oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBoMjY0X2xvb3BfZmlsdGVyX3N0YXJ0CisgICAgICAgIHN4dHcgICAgICAgICAgICB4MSwgIHcxCisKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC4xNkJ9LCAgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi4xNkJ9LCAgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC4xNkJ9LCAgW3gwXSwgeDEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC4xNkJ9LCAgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguMTZCfSwgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjE2Qn0sICBbeDBdLCB4MQorCisgICAgICAgIGgyNjRfbG9vcF9maWx0ZXJfbHVtYQorCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNy4xNkJ9LCAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuMTZCfSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC4xNkJ9LCAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuMTZCfSwgW3gwXQorCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBoMjY0X2xvb3BfZmlsdGVyX3N0YXJ0CisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICAjNAorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjhCfSwgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjhCfSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguOEJ9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi44Qn0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuOEJ9LCAgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi44Qn0sICBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhCfSwgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LjhCfSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni5EfVsxXSwgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLkR9WzFdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxOC5EfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTYuRH1bMV0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuRH1bMV0sICBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLkR9WzFdLCAgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC5EfVsxXSwgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LkR9WzFdLCBbeDBdLCB4MQorCisgICAgICAgIHRyYW5zcG9zZV84eDE2QiB2NiwgdjIwLCB2MTgsIHYxNiwgdjAsIHYyLCB2NCwgdjI2LCB2MjEsIHYyMworCisgICAgICAgIGgyNjRfbG9vcF9maWx0ZXJfbHVtYQorCisgICAgICAgIHRyYW5zcG9zZV80eDE2QiB2MTcsIHYxNiwgdjAsIHYxOSwgdjIxLCB2MjMsIHYyNSwgdjI3CisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTcuU31bMF0sICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi5TfVswXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5TfVswXSwgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE5LlN9WzBdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNy5TfVsxXSwgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LlN9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLlN9WzFdLCAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuU31bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE3LlN9WzJdLCAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuU31bMl0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuU31bMl0sICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxOS5TfVsyXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTcuU31bM10sICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi5TfVszXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5TfVszXSwgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE5LlN9WzNdLCBbeDBdLCB4MQorCisgICAgICAgIHJldAorZW5kZnVuYworCisubWFjcm8gIGgyNjRfbG9vcF9maWx0ZXJfY2hyb21hCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MjIuOEIsIHcyICAgICAgICAgICAgICAvLyBhbHBoYQorICAgICAgICB1eHRsICAgICAgICAgICAgdjI0LjhILCB2MjQuOEIKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHYyNi44QiwgdjE2LjhCLCB2MC44QiAgIC8vIGFicyhwMCAtIHEwKQorICAgICAgICB1eHRsICAgICAgICAgICAgdjQuOEgsICB2MC44QgorICAgICAgICB1YWJkICAgICAgICAgICAgdjI4LjhCLCB2MTguOEIsIHYxNi44QiAgLy8gYWJzKHAxIC0gcDApCisgICAgICAgIHVzdWJ3ICAgICAgICAgICB2NC44SCwgIHY0LjhILCAgdjE2LjhCCisgICAgICAgIHNsaSAgICAgICAgICAgICB2MjQuOEgsIHYyNC44SCwgIzgKKyAgICAgICAgc2hsICAgICAgICAgICAgIHY0LjhILCAgdjQuOEgsICAjMgorICAgICAgICB1YWJkICAgICAgICAgICAgdjMwLjhCLCB2Mi44QiwgIHYwLjhCICAgLy8gYWJzKHExIC0gcTApCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2NC44SCwgIHY0LjhILCAgdjE4LjhCCisgICAgICAgIGNtaGkgICAgICAgICAgICB2MjYuOEIsIHYyMi44QiwgdjI2LjhCICAvLyA8IGFscGhhCisgICAgICAgIHVzdWJ3ICAgICAgICAgICB2NC44SCwgIHY0LjhILCAgdjIuOEIKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYyMi44QiwgdzMgICAgICAgICAgICAgIC8vIGJldGEKKyAgICAgICAgcnNocm4gICAgICAgICAgIHY0LjhCLCAgdjQuOEgsICAjMworICAgICAgICBjbWhpICAgICAgICAgICAgdjI4LjhCLCB2MjIuOEIsIHYyOC44QiAgLy8gPCBiZXRhCisgICAgICAgIGNtaGkgICAgICAgICAgICB2MzAuOEIsIHYyMi44QiwgdjMwLjhCICAvLyA8IGJldGEKKyAgICAgICAgc21pbiAgICAgICAgICAgIHY0LjhCLCAgdjQuOEIsICB2MjQuOEIKKyAgICAgICAgbmVnICAgICAgICAgICAgIHYyNS44QiwgdjI0LjhCCisgICAgICAgIGFuZCAgICAgICAgICAgICB2MjYuOEIsIHYyNi44QiwgdjI4LjhCCisgICAgICAgIHNtYXggICAgICAgICAgICB2NC44QiwgIHY0LjhCLCAgdjI1LjhCCisgICAgICAgIGFuZCAgICAgICAgICAgICB2MjYuOEIsIHYyNi44QiwgdjMwLjhCCisgICAgICAgIHV4dGwgICAgICAgICAgICB2MjIuOEgsIHYwLjhCCisgICAgICAgIGFuZCAgICAgICAgICAgICB2NC44QiwgIHY0LjhCLCAgdjI2LjhCCisgICAgICAgIHV4dGwgICAgICAgICAgICB2MjguOEgsIHYxNi44QgorICAgICAgICBzYWRkdyAgICAgICAgICAgdjI4LjhILCB2MjguOEgsIHY0LjhCCisgICAgICAgIHNzdWJ3ICAgICAgICAgICB2MjIuOEgsIHYyMi44SCwgdjQuOEIKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYxNi44QiwgdjI4LjhICisgICAgICAgIHNxeHR1biAgICAgICAgICB2MC44QiwgIHYyMi44SAorLmVuZG0KKworZnVuY3Rpb24gZmZfaDI2NF92X2xvb3BfZmlsdGVyX2Nocm9tYV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBoMjY0X2xvb3BfZmlsdGVyX3N0YXJ0CisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE4LjhCfSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTYuOEJ9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhCfSwgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuOEJ9LCAgW3gwXQorCisgICAgICAgIGgyNjRfbG9vcF9maWx0ZXJfY2hyb21hCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LjhCfSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC44Qn0sICBbeDBdLCB4MQorCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hX25lb24sIGV4cG9ydD0xCisgICAgICAgIGgyNjRfbG9vcF9maWx0ZXJfc3RhcnQKKworICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgICMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE4LlN9WzBdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi5TfVswXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5TfVswXSwgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuU31bMF0sICBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxOC5TfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTYuU31bMV0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuU31bMV0sICBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLlN9WzFdLCAgW3gwXSwgeDEKKworICAgICAgICB0cmFuc3Bvc2VfNHg4QiAgdjE4LCB2MTYsIHYwLCB2MiwgdjI4LCB2MjksIHYzMCwgdjMxCisKKyAgICAgICAgaDI2NF9sb29wX2ZpbHRlcl9jaHJvbWEKKworICAgICAgICB0cmFuc3Bvc2VfNHg4QiAgdjE4LCB2MTYsIHYwLCB2MiwgdjI4LCB2MjksIHYzMCwgdjMxCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE4LlN9WzBdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi5TfVswXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5TfVswXSwgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuU31bMF0sICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxOC5TfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuU31bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuU31bMV0sICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLlN9WzFdLCAgW3gwXSwgeDEKKworICAgICAgICByZXQKK2VuZGZ1bmMKKworLm1hY3JvICBiaXdlaWdodF8xNiAgICAgbWFjcywgbWFjZAorICAgICAgICBkdXAgICAgICAgICAgICAgdjAuMTZCLCAgdzUKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYxLjE2QiwgIHc2CisgICAgICAgIG1vdiAgICAgICAgICAgICB2NC4xNkIsICB2MTYuMTZCCisgICAgICAgIG1vdiAgICAgICAgICAgICB2Ni4xNkIsICB2MTYuMTZCCisxOiAgICAgIHN1YnMgICAgICAgICAgICB3MywgIHczLCAgIzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuMTZCfSwgW3gwXSwgeDIKKyAgICAgICAgXG1hY2QgICAgICAgICAgIHY0LjhILCAgIHYwLjhCLCAgdjIwLjhCCisgICAgICAgIFxtYWNkXCgpMiAgICAgICB2Ni44SCwgICB2MC4xNkIsIHYyMC4xNkIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjIuMTZCfSwgW3gxXSwgeDIKKyAgICAgICAgXG1hY3MgICAgICAgICAgIHY0LjhILCAgIHYxLjhCLCAgdjIyLjhCCisgICAgICAgIFxtYWNzXCgpMiAgICAgICB2Ni44SCwgICB2MS4xNkIsIHYyMi4xNkIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyNC4xNkIsIHYxNi4xNkIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjguMTZCfSwgW3gwXSwgeDIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyNi4xNkIsIHYxNi4xNkIKKyAgICAgICAgXG1hY2QgICAgICAgICAgIHYyNC44SCwgIHYwLjhCLCAgdjI4LjhCCisgICAgICAgIFxtYWNkXCgpMiAgICAgICB2MjYuOEgsICB2MC4xNkIsIHYyOC4xNkIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzAuMTZCfSwgW3gxXSwgeDIKKyAgICAgICAgXG1hY3MgICAgICAgICAgIHYyNC44SCwgIHYxLjhCLCAgdjMwLjhCCisgICAgICAgIFxtYWNzXCgpMiAgICAgICB2MjYuOEgsICB2MS4xNkIsIHYzMC4xNkIKKyAgICAgICAgc3NobCAgICAgICAgICAgIHY0LjhILCAgIHY0LjhILCAgdjE4LjhICisgICAgICAgIHNzaGwgICAgICAgICAgICB2Ni44SCwgICB2Ni44SCwgIHYxOC44SAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjQuOEIsICAgdjQuOEgKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHY0LjE2QiwgIHY2LjhICisgICAgICAgIHNzaGwgICAgICAgICAgICB2MjQuOEgsICB2MjQuOEgsIHYxOC44SAorICAgICAgICBzc2hsICAgICAgICAgICAgdjI2LjhILCAgdjI2LjhILCB2MTguOEgKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYyNC44QiwgIHYyNC44SAorICAgICAgICBzcXh0dW4yICAgICAgICAgdjI0LjE2QiwgdjI2LjhICisgICAgICAgIG1vdiAgICAgICAgICAgICB2Ni4xNkIsICB2MTYuMTZCCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuMTZCfSwgIFt4N10sIHgyCisgICAgICAgIG1vdiAgICAgICAgICAgICB2NC4xNkIsICB2MTYuMTZCCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LjE2Qn0sIFt4N10sIHgyCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQKKy5lbmRtCisKKy5tYWNybyAgYml3ZWlnaHRfOCAgICAgIG1hY3MsIG1hY2QKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYwLjhCLCAgdzUKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYxLjhCLCAgdzYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyLjE2QiwgIHYxNi4xNkIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyMC4xNkIsIHYxNi4xNkIKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHczLCAgdzMsICAjMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgXG1hY2QgICAgICAgICAgIHYyLjhILCAgdjAuOEIsICB2NC44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjhCfSwgW3gxXSwgeDIKKyAgICAgICAgXG1hY3MgICAgICAgICAgIHYyLjhILCAgdjEuOEIsICB2NS44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgXG1hY2QgICAgICAgICAgIHYyMC44SCwgdjAuOEIsICB2Ni44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y3LjhCfSwgW3gxXSwgeDIKKyAgICAgICAgXG1hY3MgICAgICAgICAgIHYyMC44SCwgdjEuOEIsICB2Ny44QgorICAgICAgICBzc2hsICAgICAgICAgICAgdjIuOEgsICB2Mi44SCwgIHYxOC44SAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjIuOEIsICB2Mi44SAorICAgICAgICBzc2hsICAgICAgICAgICAgdjIwLjhILCB2MjAuOEgsIHYxOC44SAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjQuOEIsICB2MjAuOEgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyMC4xNkIsIHYxNi4xNkIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi44Qn0sIFt4N10sIHgyCisgICAgICAgIG1vdiAgICAgICAgICAgICB2Mi4xNkIsICB2MTYuMTZCCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuOEJ9LCBbeDddLCB4MgorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CisuZW5kbQorCisubWFjcm8gIGJpd2VpZ2h0XzQgICAgICBtYWNzLCBtYWNkCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MC44QiwgIHc1CisgICAgICAgIGR1cCAgICAgICAgICAgICB2MS44QiwgIHc2CisgICAgICAgIG1vdiAgICAgICAgICAgICB2Mi4xNkIsIHYxNi4xNkIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyMC4xNkIsdjE2LjE2QgorMTogICAgICBzdWJzICAgICAgICAgICAgdzMsICB3MywgICM0CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuU31bMF0sIFt4MF0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuU31bMV0sIFt4MF0sIHgyCisgICAgICAgIFxtYWNkICAgICAgICAgICB2Mi44SCwgIHYwLjhCLCAgdjQuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS5TfVswXSwgW3gxXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS5TfVsxXSwgW3gxXSwgeDIKKyAgICAgICAgXG1hY3MgICAgICAgICAgIHYyLjhILCAgdjEuOEIsICB2NS44QgorICAgICAgICBiLmx0ICAgICAgICAgICAgMmYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni5TfVswXSwgW3gwXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni5TfVsxXSwgW3gwXSwgeDIKKyAgICAgICAgXG1hY2QgICAgICAgICAgIHYyMC44SCwgdjAuOEIsICB2Ni44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y3LlN9WzBdLCBbeDFdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y3LlN9WzFdLCBbeDFdLCB4MgorICAgICAgICBcbWFjcyAgICAgICAgICAgdjIwLjhILCB2MS44QiwgIHY3LjhCCisgICAgICAgIHNzaGwgICAgICAgICAgICB2Mi44SCwgIHYyLjhILCAgdjE4LjhICisgICAgICAgIHNxeHR1biAgICAgICAgICB2Mi44QiwgIHYyLjhICisgICAgICAgIHNzaGwgICAgICAgICAgICB2MjAuOEgsIHYyMC44SCwgdjE4LjhICisgICAgICAgIHNxeHR1biAgICAgICAgICB2NC44QiwgIHYyMC44SAorICAgICAgICBtb3YgICAgICAgICAgICAgdjIwLjE2QiwgdjE2LjE2QgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLlN9WzBdLCBbeDddLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLlN9WzFdLCBbeDddLCB4MgorICAgICAgICBtb3YgICAgICAgICAgICAgdjIuMTZCLCAgdjE2LjE2QgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LlN9WzBdLCBbeDddLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LlN9WzFdLCBbeDddLCB4MgorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CisyOiAgICAgIHNzaGwgICAgICAgICAgICB2Mi44SCwgIHYyLjhILCAgdjE4LjhICisgICAgICAgIHNxeHR1biAgICAgICAgICB2Mi44QiwgIHYyLjhICisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuU31bMF0sIFt4N10sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuU31bMV0sIFt4N10sIHgyCisgICAgICAgIHJldAorLmVuZG0KKworLm1hY3JvICBiaXdlaWdodF9mdW5jICAgdworZnVuY3Rpb24gZmZfYml3ZWlnaHRfaDI2NF9waXhlbHNfXHdcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3h0dyAgICAgICAgICAgIHgyLCAgdzIKKyAgICAgICAgbHNyICAgICAgICAgICAgIHc4LCAgdzUsICAjMzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHc3LCAgdzcsICAjMQorICAgICAgICBlb3IgICAgICAgICAgICAgdzgsICB3OCwgIHc2LCAgbHNyICMzMAorICAgICAgICBvcnIgICAgICAgICAgICAgdzcsICB3NywgICMxCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MTguOEgsICAgdzQKKyAgICAgICAgbHNsICAgICAgICAgICAgIHc3LCAgdzcsICB3NAorICAgICAgICBub3QgICAgICAgICAgICAgdjE4LjE2QiwgIHYxOC4xNkIKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYxNi44SCwgICB3NworICAgICAgICBtb3YgICAgICAgICAgICAgeDcsICB4MAorICAgICAgICBjYnogICAgICAgICAgICAgdzgsICAxMGYKKyAgICAgICAgc3VicyAgICAgICAgICAgIHc4LCAgdzgsICAjMQorICAgICAgICBiLmVxICAgICAgICAgICAgMjBmCisgICAgICAgIHN1YnMgICAgICAgICAgICB3OCwgIHc4LCAgIzEKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDMwZgorICAgICAgICBiICAgICAgICAgICAgICAgNDBmCisxMDogICAgIGJpd2VpZ2h0X1x3ICAgICB1bWxhbCwgdW1sYWwKKzIwOiAgICAgbmVnICAgICAgICAgICAgIHc1LCB3NQorICAgICAgICBiaXdlaWdodF9cdyAgICAgdW1sYWwsIHVtbHNsCiszMDogICAgIG5lZyAgICAgICAgICAgICB3NSwgdzUKKyAgICAgICAgbmVnICAgICAgICAgICAgIHc2LCB3NgorICAgICAgICBiaXdlaWdodF9cdyAgICAgdW1sc2wsIHVtbHNsCis0MDogICAgIG5lZyAgICAgICAgICAgICB3NiwgdzYKKyAgICAgICAgYml3ZWlnaHRfXHcgICAgIHVtbHNsLCB1bWxhbAorZW5kZnVuYworLmVuZG0KKworICAgICAgICBiaXdlaWdodF9mdW5jICAgMTYKKyAgICAgICAgYml3ZWlnaHRfZnVuYyAgIDgKKyAgICAgICAgYml3ZWlnaHRfZnVuYyAgIDQKKworLm1hY3JvICB3ZWlnaHRfMTYgICAgICAgYWRkCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MC4xNkIsICB3NAorMTogICAgICBzdWJzICAgICAgICAgICAgdzIsICB3MiwgICMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjE2Qn0sIFt4MF0sIHgxCisgICAgICAgIHVtdWxsICAgICAgICAgICB2NC44SCwgICB2MC44QiwgIHYyMC44QgorICAgICAgICB1bXVsbDIgICAgICAgICAgdjYuOEgsICAgdjAuMTZCLCB2MjAuMTZCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjE2Qn0sIFt4MF0sIHgxCisgICAgICAgIHVtdWxsICAgICAgICAgICB2MjQuOEgsICB2MC44QiwgIHYyOC44QgorICAgICAgICB1bXVsbDIgICAgICAgICAgdjI2LjhILCAgdjAuMTZCLCB2MjguMTZCCisgICAgICAgIFxhZGQgICAgICAgICAgICB2NC44SCwgICB2MTYuOEgsIHY0LjhICisgICAgICAgIHNyc2hsICAgICAgICAgICB2NC44SCwgICB2NC44SCwgIHYxOC44SAorICAgICAgICBcYWRkICAgICAgICAgICAgdjYuOEgsICAgdjE2LjhILCB2Ni44SAorICAgICAgICBzcnNobCAgICAgICAgICAgdjYuOEgsICAgdjYuOEgsICB2MTguOEgKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHY0LjhCLCAgIHY0LjhICisgICAgICAgIHNxeHR1bjIgICAgICAgICB2NC4xNkIsICB2Ni44SAorICAgICAgICBcYWRkICAgICAgICAgICAgdjI0LjhILCAgdjE2LjhILCB2MjQuOEgKKyAgICAgICAgc3JzaGwgICAgICAgICAgIHYyNC44SCwgIHYyNC44SCwgdjE4LjhICisgICAgICAgIFxhZGQgICAgICAgICAgICB2MjYuOEgsICB2MTYuOEgsIHYyNi44SAorICAgICAgICBzcnNobCAgICAgICAgICAgdjI2LjhILCAgdjI2LjhILCB2MTguOEgKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYyNC44QiwgIHYyNC44SAorICAgICAgICBzcXh0dW4yICAgICAgICAgdjI0LjE2QiwgdjI2LjhICisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuMTZCfSwgIFt4NV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LjE2Qn0sIFt4NV0sIHgxCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQKKy5lbmRtCisKKy5tYWNybyAgd2VpZ2h0XzggICAgICAgIGFkZAorICAgICAgICBkdXAgICAgICAgICAgICAgdjAuOEIsICB3NAorMTogICAgICBzdWJzICAgICAgICAgICAgdzIsICB3MiwgICMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOEJ9LCBbeDBdLCB4MQorICAgICAgICB1bXVsbCAgICAgICAgICAgdjIuOEgsICB2MC44QiwgIHY0LjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuOEJ9LCBbeDBdLCB4MQorICAgICAgICB1bXVsbCAgICAgICAgICAgdjIwLjhILCB2MC44QiwgIHY2LjhCCisgICAgICAgIFxhZGQgICAgICAgICAgICB2Mi44SCwgIHYxNi44SCwgIHYyLjhICisgICAgICAgIHNyc2hsICAgICAgICAgICB2Mi44SCwgIHYyLjhILCAgdjE4LjhICisgICAgICAgIHNxeHR1biAgICAgICAgICB2Mi44QiwgIHYyLjhICisgICAgICAgIFxhZGQgICAgICAgICAgICB2MjAuOEgsIHYxNi44SCwgIHYyMC44SAorICAgICAgICBzcnNobCAgICAgICAgICAgdjIwLjhILCB2MjAuOEgsIHYxOC44SAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjQuOEIsICB2MjAuOEgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi44Qn0sIFt4NV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuOEJ9LCBbeDVdLCB4MQorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CisuZW5kbQorCisubWFjcm8gIHdlaWdodF80ICAgICAgICBhZGQKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYwLjhCLCAgdzQKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHcyLCAgdzIsICAjNAorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LlN9WzBdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LlN9WzFdLCBbeDBdLCB4MQorICAgICAgICB1bXVsbCAgICAgICAgICAgdjIuOEgsICB2MC44QiwgIHY0LjhCCisgICAgICAgIGIubHQgICAgICAgICAgICAyZgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LlN9WzBdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LlN9WzFdLCBbeDBdLCB4MQorICAgICAgICB1bXVsbCAgICAgICAgICAgdjIwLjhILCB2MC44QiwgIHY2LjhCCisgICAgICAgIFxhZGQgICAgICAgICAgICB2Mi44SCwgIHYxNi44SCwgIHYyLjhICisgICAgICAgIHNyc2hsICAgICAgICAgICB2Mi44SCwgIHYyLjhILCAgdjE4LjhICisgICAgICAgIHNxeHR1biAgICAgICAgICB2Mi44QiwgIHYyLjhICisgICAgICAgIFxhZGQgICAgICAgICAgICB2MjAuOEgsIHYxNi44SCwgIHYyMC44SAorICAgICAgICBzcnNobCAgICAgICAgICAgdjIwLjhILCB2MjAuOGgsIHYxOC44SAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjQuOEIsICB2MjAuOEgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi5TfVswXSwgW3g1XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi5TfVsxXSwgW3g1XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC5TfVswXSwgW3g1XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC5TfVsxXSwgW3g1XSwgeDEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorMjogICAgICBcYWRkICAgICAgICAgICAgdjIuOEgsICB2MTYuOEgsICB2Mi44SAorICAgICAgICBzcnNobCAgICAgICAgICAgdjIuOEgsICB2Mi44SCwgIHYxOC44SAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjIuOEIsICB2Mi44SAorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLlN9WzBdLCBbeDVdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLlN9WzFdLCBbeDVdLCB4MQorICAgICAgICByZXQKKy5lbmRtCisKKy5tYWNybyAgd2VpZ2h0X2Z1bmMgICAgIHcKK2Z1bmN0aW9uIGZmX3dlaWdodF9oMjY0X3BpeGVsc19cd1woKV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzeHR3ICAgICAgICAgICAgeDEsICB3MQorICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjMQorICAgICAgICBtb3YgICAgICAgICAgICAgdzYsICAjMQorICAgICAgICBsc2wgICAgICAgICAgICAgdzUsICB3NSwgIHczCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MTYuOEgsICB3NQorICAgICAgICBtb3YgICAgICAgICAgICAgeDUsICB4MAorICAgICAgICBiLmxlICAgICAgICAgICAgMjBmCisgICAgICAgIHN1YiAgICAgICAgICAgICB3NiwgIHc2LCAgdzMKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYxOC44SCwgIHc2CisgICAgICAgIGNtcCAgICAgICAgICAgICB3NCwgIzAKKyAgICAgICAgYi5sdCAgICAgICAgICAgIDEwZgorICAgICAgICB3ZWlnaHRfXHcgICAgICAgc2hhZGQKKzEwOiAgICAgbmVnICAgICAgICAgICAgIHc0LCAgdzQKKyAgICAgICAgd2VpZ2h0X1x3ICAgICAgIHNoc3ViCisyMDogICAgIG5lZyAgICAgICAgICAgICB3NiwgIHczCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MTguOEgsICB3NgorICAgICAgICBjbXAgICAgICAgICAgICAgdzQsICAjMAorICAgICAgICBiLmx0ICAgICAgICAgICAgMTBmCisgICAgICAgIHdlaWdodF9cdyAgICAgICBhZGQKKzEwOiAgICAgbmVnICAgICAgICAgICAgIHc0LCAgdzQKKyAgICAgICAgd2VpZ2h0X1x3ICAgICAgIHN1YgorZW5kZnVuYworLmVuZG0KKworICAgICAgICB3ZWlnaHRfZnVuYyAgICAgMTYKKyAgICAgICAgd2VpZ2h0X2Z1bmMgICAgIDgKKyAgICAgICAgd2VpZ2h0X2Z1bmMgICAgIDQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvaDI2NGlkY3RfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9oMjY0aWRjdF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiNWE0NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvaDI2NGlkY3RfbmVvbi5TCkBAIC0wLDAgKzEsNDA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDEzIEphbm5lIEdydW5hdSA8amFubmUtbGliYXZAamFubmF1Lm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2FzbS5TIgorI2luY2x1ZGUgIm5lb24uUyIKKworZnVuY3Rpb24gZmZfaDI2NF9pZGN0X2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRILCB2MS40SCwgdjIuNEgsIHYzLjRIfSwgIFt4MV0KKyAgICAgICAgc3h0dyAgICAgICAgICAgIHgyLCAgICAgdzIKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYzMC44SCwgIzAKKworICAgICAgICBhZGQgICAgICAgICAgICAgdjQuNEgsICB2MC40SCwgIHYyLjRICisgICAgICAgIHNzaHIgICAgICAgICAgICB2MTYuNEgsIHYxLjRILCAgIzEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MzAuOEh9LCAgICBbeDFdLCAjMTYKKyAgICAgICAgc3NociAgICAgICAgICAgIHYxNy40SCwgdjMuNEgsICAjMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YzMC44SH0sICAgIFt4MV0sICMxNgorICAgICAgICBzdWIgICAgICAgICAgICAgdjUuNEgsICB2MC40SCwgIHYyLjRICisgICAgICAgIGFkZCAgICAgICAgICAgICB2Ni40SCwgIHYxLjRILCAgdjE3LjRICisgICAgICAgIHN1YiAgICAgICAgICAgICB2Ny40SCwgIHYxNi40SCwgdjMuNEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjRILCAgdjQuNEgsICB2Ni40SAorICAgICAgICBhZGQgICAgICAgICAgICAgdjEuNEgsICB2NS40SCwgIHY3LjRICisgICAgICAgIHN1YiAgICAgICAgICAgICB2Mi40SCwgIHY0LjRILCAgdjYuNEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYzLjRILCAgdjUuNEgsICB2Ny40SAorCisgICAgICAgIHRyYW5zcG9zZV80eDRIICB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcKKworICAgICAgICBhZGQgICAgICAgICAgICAgdjQuNEgsICB2MC40SCwgIHYzLjRICisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE4LlN9WzBdLCBbeDBdLCB4MgorICAgICAgICBzc2hyICAgICAgICAgICAgdjE2LjRILCAgdjIuNEgsICAjMQorICAgICAgICBzc2hyICAgICAgICAgICAgdjE3LjRILCAgdjEuNEgsICAjMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxOS5TfVsxXSwgW3gwXSwgeDIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHY1LjRILCAgdjAuNEgsICB2My40SAorICAgICAgICBsZDEgICAgICAgICAgICAge3YxOC5TfVsxXSwgW3gwXSwgeDIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHY2LjRILCAgdjE2LjRILCB2MS40SAorICAgICAgICBpbnMgICAgICAgICAgICAgdjQuRFsxXSwgIHY1LkRbMF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHY3LjRILCAgdjIuNEgsICB2MTcuNEgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTkuU31bMF0sIFt4MF0sIHgyCisgICAgICAgIGlucyAgICAgICAgICAgICB2Ni5EWzFdLCAgdjcuRFswXQorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgyLCBsc2wgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhILCAgdjQuOEgsICB2Ni44SAorICAgICAgICBzdWIgICAgICAgICAgICAgdjEuOEgsICB2NC44SCwgIHY2LjhICisKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYwLjhILCAgdjAuOEgsICAjNgorICAgICAgICBzcnNociAgICAgICAgICAgdjEuOEgsICB2MS44SCwgICM2CisKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYwLjhILCAgdjAuOEgsICB2MTguOEIKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYxLjhILCAgdjEuOEgsICB2MTkuOEIKKworICAgICAgICBzcXh0dW4gICAgICAgICAgdjAuOEIsIHYwLjhICisgICAgICAgIHNxeHR1biAgICAgICAgICB2MS44QiwgdjEuOEgKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YwLlN9WzBdLCAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5TfVsxXSwgIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuU31bMV0sICBbeDBdLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLlN9WzBdLCAgW3gwXSwgeDIKKworICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgICMzMgorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfaDI2NF9pZGN0X2RjX2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzeHR3ICAgICAgICAgICAgeDIsICB3MgorICAgICAgICBtb3YgICAgICAgICAgICAgdzMsICAgICAgICMwCisgICAgICAgIGxkMXIgICAgICAgICAgICB7djIuOEh9LCAgW3gxXQorICAgICAgICBzdHJoICAgICAgICAgICAgdzMsICAgICAgIFt4MV0KKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyLjhILCAgdjIuOEgsICAjNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLlN9WzBdLCAgW3gwXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5TfVsxXSwgIFt4MF0sIHgyCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2My44SCwgIHYyLjhILCAgdjAuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS5TfVswXSwgIFt4MF0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuU31bMV0sICBbeDBdLCB4MgorICAgICAgICB1YWRkdyAgICAgICAgICAgdjQuOEgsICB2Mi44SCwgIHYxLjhCCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MC44QiwgIHYzLjhICisgICAgICAgIHNxeHR1biAgICAgICAgICB2MS44QiwgIHY0LjhICisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDIsIGxzbCAjMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLlN9WzBdLCAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5TfVsxXSwgIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuU31bMF0sICBbeDBdLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLlN9WzFdLCAgW3gwXSwgeDIKKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2gyNjRfaWRjdF9hZGQxNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg2LCAgeDAgICAgICAgICAvLyBkZXN0CisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgIHgxICAgICAgICAgLy8gYmxvY2tfb2Zmc2V0CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgIHgyICAgICAgICAgLy8gYmxvY2sKKyAgICAgICAgbW92ICAgICAgICAgICAgIHc5LCAgdzMgICAgICAgICAvLyBzdHJpZGUKKyAgICAgICAgbW92cmVsICAgICAgICAgIHg3LCAgc2NhbjgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMCwgIzE2CisgICAgICAgIG1vdnJlbCAgICAgICAgICB4MTMsIFgoZmZfaDI2NF9pZGN0X2RjX2FkZF9uZW9uKQorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDE0LCBYKGZmX2gyNjRfaWRjdF9hZGRfbmVvbikKKzE6ICAgICAgbW92ICAgICAgICAgICAgIHcyLCAgdzkKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHczLCAgW3g3XSwgIzEKKyAgICAgICAgbGRyc3cgICAgICAgICAgIHgwLCAgW3g1XSwgIzQKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHczLCAgW3g0LCAgdzMsICB1eHR3XQorICAgICAgICBzdWJzICAgICAgICAgICAgdzMsICB3MywgICMxCisgICAgICAgIGIubHQgICAgICAgICAgICAyZgorICAgICAgICBsZHJzaCAgICAgICAgICAgdzMsICBbeDFdCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgeDYKKyAgICAgICAgY2NtcCAgICAgICAgICAgIHczLCAgIzAsICAjNCwgIGVxCisgICAgICAgIGNzZWwgICAgICAgICAgICB4MTUsIHgxMywgeDE0LCBuZQorICAgICAgICBibHIgICAgICAgICAgICAgeDE1CisyOiAgICAgIHN1YnMgICAgICAgICAgICB4MTAsIHgxMCwgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICAjMzIKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldCAgICAgICAgICAgICB4MTIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfaDI2NF9pZGN0X2FkZDE2aW50cmFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgeDMwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NiwgIHgwICAgICAgICAgLy8gZGVzdAorICAgICAgICBtb3YgICAgICAgICAgICAgeDUsICB4MSAgICAgICAgIC8vIGJsb2NrX29mZnNldAorICAgICAgICBtb3YgICAgICAgICAgICAgeDEsICB4MiAgICAgICAgIC8vIGJsb2NrCisgICAgICAgIG1vdiAgICAgICAgICAgICB3OSwgIHczICAgICAgICAgLy8gc3RyaWRlCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4NywgIHNjYW44CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTAsICMxNgorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDEzLCBYKGZmX2gyNjRfaWRjdF9kY19hZGRfbmVvbikKKyAgICAgICAgbW92cmVsICAgICAgICAgIHgxNCwgWChmZl9oMjY0X2lkY3RfYWRkX25lb24pCisxOiAgICAgIG1vdiAgICAgICAgICAgICB3MiwgIHc5CisgICAgICAgIGxkcmIgICAgICAgICAgICB3MywgIFt4N10sICMxCisgICAgICAgIGxkcnN3ICAgICAgICAgICB4MCwgIFt4NV0sICM0CisgICAgICAgIGxkcmIgICAgICAgICAgICB3MywgIFt4NCwgIHczLCAgdXh0d10KKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICB4NgorICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjMAorICAgICAgICBsZHJzaCAgICAgICAgICAgdzMsICBbeDFdCisgICAgICAgIGNzZWwgICAgICAgICAgICB4MTUsIHgxMywgeDE0LCBlcQorICAgICAgICBjY21wICAgICAgICAgICAgdzMsICAjMCwgICMwLCAgZXEKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDJmCisgICAgICAgIGJsciAgICAgICAgICAgICB4MTUKKzI6ICAgICAgc3VicyAgICAgICAgICAgIHgxMCwgeDEwLCAjMQorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MSwgICMzMgorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0ICAgICAgICAgICAgIHgxMgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9oMjY0X2lkY3RfYWRkOF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgIzB4NDAKKyAgICAgICAgc3RwICAgICAgICAgICAgIHgxOSwgeDIwLCBbc3BdCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTIsIHgzMAorICAgICAgICBsZHAgICAgICAgICAgICAgeDYsICB4MTUsIFt4MF0gICAgICAgICAgLy8gZGVzdFswXSwgZGVzdFsxXQorICAgICAgICBhZGQgICAgICAgICAgICAgeDUsICB4MSwgICMxNio0ICAgICAgICAgLy8gYmxvY2tfb2Zmc2V0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4OSwgIHgyLCAgIzE2KjMyICAgICAgICAvLyBibG9jaworICAgICAgICBtb3YgICAgICAgICAgICAgdzE5LCB3MyAgICAgICAgICAgICAgICAgLy8gc3RyaWRlCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4MTMsIFgoZmZfaDI2NF9pZGN0X2RjX2FkZF9uZW9uKQorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDE0LCBYKGZmX2gyNjRfaWRjdF9hZGRfbmVvbikKKyAgICAgICAgbW92cmVsICAgICAgICAgIHg3LCAgc2NhbjgrMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMCwgIzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMSwgIzE2CisxOiAgICAgIG1vdiAgICAgICAgICAgICB3MiwgIHcxOQorICAgICAgICBsZHJiICAgICAgICAgICAgdzMsICBbeDcsIHgxMF0gICAgICAgICAgLy8gc2NhbjhbaV0KKyAgICAgICAgbGRyc3cgICAgICAgICAgIHgwLCAgW3g1LCB4MTAsIGxzbCAjMl0gIC8vIGJsb2NrX29mZnNldFtpXQorICAgICAgICBsZHJiICAgICAgICAgICAgdzMsICBbeDQsIHczLCAgdXh0d10gICAgLy8gbm56Y1sgc2NhbjhbaV0gXQorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgIHg2ICAgICAgICAgICAgLy8gYmxvY2tfb2Zmc2V0W2ldICsgZHN0W2otMV0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDksICB4MTAsIGxzbCAjNSAgIC8vIGJsb2NrICsgaSAqIDE2CisgICAgICAgIGNtcCAgICAgICAgICAgICB3MywgICMwCisgICAgICAgIGxkcnNoICAgICAgICAgICB3MywgIFt4MV0gICAgICAgICAgICAgICAvLyBibG9ja1tpKjE2XQorICAgICAgICBjc2VsICAgICAgICAgICAgeDIwLCB4MTMsIHgxNCwgZXEKKyAgICAgICAgY2NtcCAgICAgICAgICAgIHczLCAgIzAsICAjMCwgIGVxCisgICAgICAgIGIuZXEgICAgICAgICAgICAyZgorICAgICAgICBibHIgICAgICAgICAgICAgeDIwCisyOiAgICAgIGFkZCAgICAgICAgICAgICB4MTAsIHgxMCwgIzEKKyAgICAgICAgY21wICAgICAgICAgICAgIHgxMCwgIzQKKyAgICAgICAgY3NlbCAgICAgICAgICAgIHgxMCwgeDExLCB4MTAsIGVxICAgICAvLyBtb3YgeDEwLCAjMTYKKyAgICAgICAgY3NlbCAgICAgICAgICAgIHg2LCAgeDE1LCB4NiwgIGVxCisgICAgICAgIGNtcCAgICAgICAgICAgICB4MTAsICMyMAorICAgICAgICBiLmx0ICAgICAgICAgICAgMWIKKyAgICAgICAgbGRwICAgICAgICAgICAgIHgxOSwgeDIwLCBbc3BdCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzB4NDAKKyAgICAgICAgcmV0ICAgICAgICAgICAgIHgxMgorZW5kZnVuYworCisubWFjcm8gIGlkY3Q4eDhfY29scyAgICBwYXNzCisgIC5pZiBccGFzcyA9PSAwCisgICAgICAgIHZhICAgICAgLnJlcSAgICB2MTgKKyAgICAgICAgdmIgICAgICAucmVxICAgIHYzMAorICAgICAgICBzc2hyICAgICAgICAgICAgdjE4LjhILCB2MjYuOEgsICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTYuOEgsIHYyNC44SCwgdjI4LjhICisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMwLjhILCB2MzEuOEh9LCBbeDFdCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE5LjhIfSwgW3gxXSwgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxOS44SH0sIFt4MV0sICAjMTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxNy44SCwgIHYyNC44SCwgdjI4LjhICisgICAgICAgIHNzaHIgICAgICAgICAgICB2MTkuOEgsICB2MzAuOEgsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTguOEgsICB2MTguOEgsICB2MzAuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxOS44SCwgIHYxOS44SCwgIHYyNi44SAorICAuZWxzZQorICAgICAgICB2YSAgICAgIC5yZXEgICAgdjMwCisgICAgICAgIHZiICAgICAgLnJlcSAgICB2MTgKKyAgICAgICAgc3NociAgICAgICAgICAgIHYzMC44SCwgdjI2LjhILCAjMQorICAgICAgICBzc2hyICAgICAgICAgICAgdjE5LjhILCB2MTguOEgsICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTYuOEgsIHYyNC44SCwgdjI4LjhICisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTcuOEgsIHYyNC44SCwgdjI4LjhICisgICAgICAgIHN1YiAgICAgICAgICAgICB2MzAuOEgsIHYzMC44SCwgdjE4LjhICisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTkuOEgsIHYxOS44SCwgdjI2LjhICisgIC5lbmRpZgorICAgICAgICBhZGQgICAgICAgICAgICAgdjI2LjhILCB2MTcuOEgsIHZhLjhICisgICAgICAgIHN1YiAgICAgICAgICAgICB2MjguOEgsIHYxNy44SCwgdmEuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyNC44SCwgdjE2LjhILCB2MTkuOEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHZiLjhILCAgdjE2LjhILCB2MTkuOEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxNi44SCwgdjI5LjhILCB2MjcuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNy44SCwgdjMxLjhILCB2MjUuOEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHZhLjhILCAgdjMxLjhILCB2MjUuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxOS44SCwgdjI5LjhILCB2MjcuOEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxNi44SCwgdjE2LjhILCB2MzEuOEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxNy44SCwgdjE3LjhILCB2MjcuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHZhLjhILCAgdmEuOEgsICB2MjkuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxOS44SCwgdjE5LjhILCB2MjUuOEgKKyAgICAgICAgc3NociAgICAgICAgICAgIHYyNS44SCwgdjI1LjhILCAjMQorICAgICAgICBzc2hyICAgICAgICAgICAgdjI3LjhILCB2MjcuOEgsICMxCisgICAgICAgIHNzaHIgICAgICAgICAgICB2MjkuOEgsIHYyOS44SCwgIzEKKyAgICAgICAgc3NociAgICAgICAgICAgIHYzMS44SCwgdjMxLjhILCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgdjE2LjhILCB2MTYuOEgsIHYzMS44SAorICAgICAgICBzdWIgICAgICAgICAgICAgdjE3LjhILCB2MTcuOEgsIHYyNy44SAorICAgICAgICBhZGQgICAgICAgICAgICAgdmEuOEgsICB2YS44SCwgIHYyOS44SAorICAgICAgICBhZGQgICAgICAgICAgICAgdjE5LjhILCB2MTkuOEgsIHYyNS44SAorICAgICAgICBzc2hyICAgICAgICAgICAgdjI1LjhILCB2MTYuOEgsICMyCisgICAgICAgIHNzaHIgICAgICAgICAgICB2MjcuOEgsIHYxNy44SCwgIzIKKyAgICAgICAgc3NociAgICAgICAgICAgIHYyOS44SCwgdmEuOEgsICAjMgorICAgICAgICBzc2hyICAgICAgICAgICAgdjMxLjhILCB2MTkuOEgsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTkuOEgsIHYxOS44SCwgdjI1LjhICisgICAgICAgIHN1YiAgICAgICAgICAgICB2YS44SCwgIHYyNy44SCwgdmEuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNy44SCwgdjE3LjhILCB2MjkuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNi44SCwgdjE2LjhILCB2MzEuOEgKKyAgLmlmIFxwYXNzID09IDAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYzMS44SCwgdjI0LjhILCB2MTkuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyNC44SCwgdjI0LjhILCB2MTkuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyNS44SCwgdjI2LjhILCB2MTguOEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxOC44SCwgdjI2LjhILCB2MTguOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyNi44SCwgdjI4LjhILCB2MTcuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyNy44SCwgdjMwLjhILCB2MTYuOEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYyOS44SCwgdjI4LjhILCB2MTcuOEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYyOC44SCwgdjMwLjhILCB2MTYuOEgKKyAgLmVsc2UKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYzMS44SCwgdjI0LjhILCB2MTkuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyNC44SCwgdjI0LjhILCB2MTkuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyNS44SCwgdjI2LjhILCB2MzAuOEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYzMC44SCwgdjI2LjhILCB2MzAuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyNi44SCwgdjI4LjhILCB2MTcuOEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYyOS44SCwgdjI4LjhILCB2MTcuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyNy44SCwgdjE4LjhILCB2MTYuOEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYyOC44SCwgdjE4LjhILCB2MTYuOEgKKyAgLmVuZGlmCisgICAgICAgIC51bnJlcSAgICAgICAgICB2YQorICAgICAgICAudW5yZXEgICAgICAgICAgdmIKKy5lbmRtCisKK2Z1bmN0aW9uIGZmX2gyNjRfaWRjdDhfYWRkX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MTkuOEgsICAgIzAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuOEgsIHYyNS44SH0sIFt4MV0KKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuOEh9LCAgW3gxXSwgICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuOEh9LCAgW3gxXSwgICAjMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjYuOEgsIHYyNy44SH0sIFt4MV0KKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuOEh9LCAgW3gxXSwgICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuOEh9LCAgW3gxXSwgICAjMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjguOEgsIHYyOS44SH0sIFt4MV0KKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuOEh9LCAgW3gxXSwgICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuOEh9LCAgW3gxXSwgICAjMTYKKworICAgICAgICBpZGN0OHg4X2NvbHMgICAgMAorICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjE4LCB2MzEsIHY2LCB2NworICAgICAgICBpZGN0OHg4X2NvbHMgICAgMQorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgIHgwCisgICAgICAgIHNyc2hyICAgICAgICAgICB2MjQuOEgsIHYyNC44SCwgIzYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC44Qn0sICAgICBbeDBdLCB4MgorICAgICAgICBzcnNociAgICAgICAgICAgdjI1LjhILCB2MjUuOEgsICM2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyNi44SCwgdjI2LjhILCAjNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHNyc2hyICAgICAgICAgICB2MjcuOEgsIHYyNy44SCwgIzYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My44Qn0sICAgICBbeDBdLCB4MgorICAgICAgICBzcnNociAgICAgICAgICAgdjI4LjhILCB2MjguOEgsICM2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyOS44SCwgdjI5LjhILCAjNgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHNyc2hyICAgICAgICAgICB2MzAuOEgsIHYzMC44SCwgIzYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni44Qn0sICAgICBbeDBdLCB4MgorICAgICAgICBzcnNociAgICAgICAgICAgdjMxLjhILCB2MzEuOEgsICM2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYyNC44SCwgdjI0LjhILCB2MC44QgorICAgICAgICB1YWRkdyAgICAgICAgICAgdjI1LjhILCB2MjUuOEgsIHYxLjhCCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjYuOEgsIHYyNi44SCwgdjIuOEIKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYwLjhCLCAgdjI0LjhICisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjcuOEgsIHYyNy44SCwgdjMuOEIKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYxLjhCLCAgdjI1LjhICisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjguOEgsIHYyOC44SCwgdjQuOEIKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYyLjhCLCAgdjI2LjhICisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuOEJ9LCAgICAgW3gzXSwgeDIKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYyOS44SCwgdjI5LjhILCB2NS44QgorICAgICAgICBzcXh0dW4gICAgICAgICAgdjMuOEIsICB2MjcuOEgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS44Qn0sICAgICBbeDNdLCB4MgorICAgICAgICB1YWRkdyAgICAgICAgICAgdjMwLjhILCB2MzAuOEgsIHY2LjhCCisgICAgICAgIHNxeHR1biAgICAgICAgICB2NC44QiwgIHYyOC44SAorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjhCfSwgICAgIFt4M10sIHgyCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MzEuOEgsIHYzMS44SCwgdjcuOEIKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHY1LjhCLCAgdjI5LjhICisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuOEJ9LCAgICAgW3gzXSwgeDIKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHY2LjhCLCAgdjMwLjhICisgICAgICAgIHNxeHR1biAgICAgICAgICB2Ny44QiwgIHYzMS44SAorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjhCfSwgICAgIFt4M10sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuOEJ9LCAgICAgW3gzXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ni44Qn0sICAgICBbeDNdLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y3LjhCfSwgICAgIFt4M10sIHgyCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICAjMTI4CisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9oMjY0X2lkY3Q4X2RjX2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgdzMsICAgICAgICMwCisgICAgICAgIHN4dHcgICAgICAgICAgICB4MiwgICAgICAgdzIKKyAgICAgICAgbGQxciAgICAgICAgICAgIHt2MzEuOEh9LCBbeDFdCisgICAgICAgIHN0cmggICAgICAgICAgICB3MywgICAgICAgW3gxXQorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhCfSwgIFt4MF0sIHgyCisgICAgICAgIHNyc2hyICAgICAgICAgICB2MzEuOEgsIHYzMS44SCwgIzYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS44Qn0sICAgICBbeDBdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjQuOEgsIHYzMS44SCwgdjAuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My44Qn0sICAgICBbeDBdLCB4MgorICAgICAgICB1YWRkdyAgICAgICAgICAgdjI1LjhILCB2MzEuOEgsIHYxLjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYyNi44SCwgdjMxLjhILCB2Mi44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjcuOEgsIHYzMS44SCwgdjMuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni44Qn0sICAgICBbeDBdLCB4MgorICAgICAgICB1YWRkdyAgICAgICAgICAgdjI4LjhILCB2MzEuOEgsIHY0LjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYyOS44SCwgdjMxLjhILCB2NS44QgorICAgICAgICB1YWRkdyAgICAgICAgICAgdjMwLjhILCB2MzEuOEgsIHY2LjhCCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MzEuOEgsIHYzMS44SCwgdjcuOEIKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYwLjhCLCAgdjI0LjhICisgICAgICAgIHNxeHR1biAgICAgICAgICB2MS44QiwgIHYyNS44SAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjIuOEIsICB2MjYuOEgKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYzLjhCLCAgdjI3LjhICisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDIsIGxzbCAjMworICAgICAgICBzdDEgICAgICAgICAgICAge3YwLjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHNxeHR1biAgICAgICAgICB2NC44QiwgIHYyOC44SAorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHNxeHR1biAgICAgICAgICB2NS44QiwgIHYyOS44SAorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHNxeHR1biAgICAgICAgICB2Ni44QiwgIHYzMC44SAorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHNxeHR1biAgICAgICAgICB2Ny44QiwgIHYzMS44SAorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ni44Qn0sICAgICBbeDBdLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y3LjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9oMjY0X2lkY3Q4X2FkZDRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgeDMwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NiwgIHgwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgIHgxCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgIHgyCisgICAgICAgIG1vdiAgICAgICAgICAgICB3MiwgIHczCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4NywgIHNjYW44CisgICAgICAgIG1vdiAgICAgICAgICAgICB3MTAsICMxNgorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDEzLCBYKGZmX2gyNjRfaWRjdDhfZGNfYWRkX25lb24pCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4MTQsIFgoZmZfaDI2NF9pZGN0OF9hZGRfbmVvbikKKzE6ICAgICAgbGRyYiAgICAgICAgICAgIHc5LCAgW3g3XSwgIzQKKyAgICAgICAgbGRyc3cgICAgICAgICAgIHgwLCAgW3g1XSwgIzE2CisgICAgICAgIGxkcmIgICAgICAgICAgICB3OSwgIFt4NCwgdzksIFVYVFddCisgICAgICAgIHN1YnMgICAgICAgICAgICB3OSwgIHc5LCAgIzEKKyAgICAgICAgYi5sdCAgICAgICAgICAgIDJmCisgICAgICAgIGxkcnNoICAgICAgICAgICB3MTEsICBbeDFdCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHg2LCAgeDAKKyAgICAgICAgY2NtcCAgICAgICAgICAgIHcxMSwgIzAsICAjNCwgIGVxCisgICAgICAgIGNzZWwgICAgICAgICAgICB4MTUsIHgxMywgeDE0LCBuZQorICAgICAgICBibHIgICAgICAgICAgICAgeDE1CisyOiAgICAgIHN1YnMgICAgICAgICAgICB3MTAsIHcxMCwgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICAjMTI4CisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQgICAgICAgICAgICAgeDEyCitlbmRmdW5jCisKK2NvbnN0ICAgc2NhbjgKKyAgICAgICAgLmJ5dGUgICAgICAgICAgIDQrIDEqOCwgNSsgMSo4LCA0KyAyKjgsIDUrIDIqOAorICAgICAgICAuYnl0ZSAgICAgICAgICAgNisgMSo4LCA3KyAxKjgsIDYrIDIqOCwgNysgMio4CisgICAgICAgIC5ieXRlICAgICAgICAgICA0KyAzKjgsIDUrIDMqOCwgNCsgNCo4LCA1KyA0KjgKKyAgICAgICAgLmJ5dGUgICAgICAgICAgIDYrIDMqOCwgNysgMyo4LCA2KyA0KjgsIDcrIDQqOAorICAgICAgICAuYnl0ZSAgICAgICAgICAgNCsgNio4LCA1KyA2KjgsIDQrIDcqOCwgNSsgNyo4CisgICAgICAgIC5ieXRlICAgICAgICAgICA2KyA2KjgsIDcrIDYqOCwgNisgNyo4LCA3KyA3KjgKKyAgICAgICAgLmJ5dGUgICAgICAgICAgIDQrIDgqOCwgNSsgOCo4LCA0KyA5KjgsIDUrIDkqOAorICAgICAgICAuYnl0ZSAgICAgICAgICAgNisgOCo4LCA3KyA4KjgsIDYrIDkqOCwgNysgOSo4CisgICAgICAgIC5ieXRlICAgICAgICAgICA0KzExKjgsIDUrMTEqOCwgNCsxMio4LCA1KzEyKjgKKyAgICAgICAgLmJ5dGUgICAgICAgICAgIDYrMTEqOCwgNysxMSo4LCA2KzEyKjgsIDcrMTIqOAorICAgICAgICAuYnl0ZSAgICAgICAgICAgNCsxMyo4LCA1KzEzKjgsIDQrMTQqOCwgNSsxNCo4CisgICAgICAgIC5ieXRlICAgICAgICAgICA2KzEzKjgsIDcrMTMqOCwgNisxNCo4LCA3KzE0KjgKK2VuZGNvbnN0CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRxcGVsX2luaXRfYWFyY2g2NC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9oMjY0cXBlbF9pbml0X2FhcmNoNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Y0MWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9oMjY0cXBlbF9pbml0X2FhcmNoNjQuYwpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIEFSTSBORU9OIG9wdGltaXNlZCBEU1AgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaDI2NHFwZWwuaCIKKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMwMF9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMTBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzIwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMzMF9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMDFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzExX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMyMV9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMzFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzAyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMxMl9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMjJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzMyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMwM19uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMTNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzIzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMzM19uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzEwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAxX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzExX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIxX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMxX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzEyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzEzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOworCit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxMF9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMjBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzMwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMwMV9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMTFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzIxX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMzMV9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMDJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzEyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMyMl9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMzJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxM19uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMjNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzMzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOworCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7CisKK2F2X2NvbGQgdm9pZCBmZl9oMjY0cXBlbF9pbml0X2FhcmNoNjQoSDI2NFFwZWxDb250ZXh0ICpjLCBpbnQgYml0X2RlcHRoKQoreworICAgIGNvbnN0IGludCBoaWdoX2JpdF9kZXB0aCA9IGJpdF9kZXB0aCA+IDg7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSAmJiAhaGlnaF9iaXRfZGVwdGgpIHsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyAwXSA9IGZmX3B1dF9oMjY0X3FwZWwxNl9tYzAwX25lb247CisgICAgICAgIGMtPnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgMV0gPSBmZl9wdXRfaDI2NF9xcGVsMTZfbWMxMF9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDJdID0gZmZfcHV0X2gyNjRfcXBlbDE2X21jMjBfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyAzXSA9IGZmX3B1dF9oMjY0X3FwZWwxNl9tYzMwX25lb247CisgICAgICAgIGMtPnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgNF0gPSBmZl9wdXRfaDI2NF9xcGVsMTZfbWMwMV9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDVdID0gZmZfcHV0X2gyNjRfcXBlbDE2X21jMTFfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyA2XSA9IGZmX3B1dF9oMjY0X3FwZWwxNl9tYzIxX25lb247CisgICAgICAgIGMtPnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgN10gPSBmZl9wdXRfaDI2NF9xcGVsMTZfbWMzMV9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDhdID0gZmZfcHV0X2gyNjRfcXBlbDE2X21jMDJfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyA5XSA9IGZmX3B1dF9oMjY0X3FwZWwxNl9tYzEyX25lb247CisgICAgICAgIGMtPnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsxMF0gPSBmZl9wdXRfaDI2NF9xcGVsMTZfbWMyMl9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bMTFdID0gZmZfcHV0X2gyNjRfcXBlbDE2X21jMzJfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWzEyXSA9IGZmX3B1dF9oMjY0X3FwZWwxNl9tYzAzX25lb247CisgICAgICAgIGMtPnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsxM10gPSBmZl9wdXRfaDI2NF9xcGVsMTZfbWMxM19uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bMTRdID0gZmZfcHV0X2gyNjRfcXBlbDE2X21jMjNfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWzE1XSA9IGZmX3B1dF9oMjY0X3FwZWwxNl9tYzMzX25lb247CisKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWyAwXSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMDBfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWyAxXSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMTBfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWyAyXSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMjBfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWyAzXSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMzBfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWyA0XSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMDFfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWyA1XSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMTFfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWyA2XSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMjFfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWyA3XSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMzFfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWyA4XSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMDJfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWyA5XSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMTJfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWzEwXSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMjJfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWzExXSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMzJfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWzEyXSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMDNfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWzEzXSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMTNfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWzE0XSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMjNfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWzE1XSA9IGZmX3B1dF9oMjY0X3FwZWw4X21jMzNfbmVvbjsKKworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDBdID0gZmZfYXZnX2gyNjRfcXBlbDE2X21jMDBfbmVvbjsKKyAgICAgICAgYy0+YXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyAxXSA9IGZmX2F2Z19oMjY0X3FwZWwxNl9tYzEwX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgMl0gPSBmZl9hdmdfaDI2NF9xcGVsMTZfbWMyMF9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDNdID0gZmZfYXZnX2gyNjRfcXBlbDE2X21jMzBfbmVvbjsKKyAgICAgICAgYy0+YXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyA0XSA9IGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAxX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgNV0gPSBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxMV9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDZdID0gZmZfYXZnX2gyNjRfcXBlbDE2X21jMjFfbmVvbjsKKyAgICAgICAgYy0+YXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyA3XSA9IGZmX2F2Z19oMjY0X3FwZWwxNl9tYzMxX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgOF0gPSBmZl9hdmdfaDI2NF9xcGVsMTZfbWMwMl9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDldID0gZmZfYXZnX2gyNjRfcXBlbDE2X21jMTJfbmVvbjsKKyAgICAgICAgYy0+YXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWzEwXSA9IGZmX2F2Z19oMjY0X3FwZWwxNl9tYzIyX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsxMV0gPSBmZl9hdmdfaDI2NF9xcGVsMTZfbWMzMl9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bMTJdID0gZmZfYXZnX2gyNjRfcXBlbDE2X21jMDNfbmVvbjsKKyAgICAgICAgYy0+YXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWzEzXSA9IGZmX2F2Z19oMjY0X3FwZWwxNl9tYzEzX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsxNF0gPSBmZl9hdmdfaDI2NF9xcGVsMTZfbWMyM19uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bMTVdID0gZmZfYXZnX2gyNjRfcXBlbDE2X21jMzNfbmVvbjsKKworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDBdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMwMF9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDFdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMxMF9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDJdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMyMF9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDNdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMzMF9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDRdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMwMV9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDVdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMxMV9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDZdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMyMV9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDddID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMzMV9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDhdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMwMl9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDldID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMxMl9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTBdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMyMl9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTFdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMzMl9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTJdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMwM19uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTNdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMxM19uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTRdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMyM19uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTVdID0gZmZfYXZnX2gyNjRfcXBlbDhfbWMzM19uZW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvaDI2NHFwZWxfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9oMjY0cXBlbF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3Y2ZhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvaDI2NHFwZWxfbmVvbi5TCkBAIC0wLDAgKzEsOTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDEzIEphbm5lIEdydW5hdSA8amFubmUtbGliYXZAamFubmF1Lm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2FzbS5TIgorI2luY2x1ZGUgIm5lb24uUyIKKworICAgICAgICAvKiBILjI2NCBxcGVsIE1DICovCisKKy5tYWNybyAgbG93cGFzc19jb25zdCAgIHIKKyAgICAgICAgbW92eiAgICAgICAgICAgIFxyLCAjMjAsIGxzbCAjMTYKKyAgICAgICAgbW92ayAgICAgICAgICAgIFxyLCAjNQorICAgICAgICBtb3YgICAgICAgICAgICAgdjYuU1swXSwgXHIKKy5lbmRtCisKKy8vdHJhc2hlcyB2MC12NQorLm1hY3JvICBsb3dwYXNzXzggICAgICAgcjAsICByMSwgIHIyLCAgcjMsICBkMCwgIGQxLCAgbmFycm93PTEKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYyLjhCLCAgICAgIFxyMFwoKS44QiwgXHIxXCgpLjhCLCAjMgorICAgICAgICBleHQgICAgICAgICAgICAgdjMuOEIsICAgICAgXHIwXCgpLjhCLCBccjFcKCkuOEIsICMzCisgICAgICAgIHVhZGRsICAgICAgICAgICB2Mi44SCwgICAgICB2Mi44QiwgICAgIHYzLjhCCisgICAgICAgIGV4dCAgICAgICAgICAgICB2NC44QiwgICAgICBccjBcKCkuOEIsIFxyMVwoKS44QiwgIzEKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHY1LjhCLCAgICAgIFxyMFwoKS44QiwgXHIxXCgpLjhCLCAjNAorICAgICAgICB1YWRkbCAgICAgICAgICAgdjQuOEgsICAgICAgdjQuOEIsICAgICB2NS44QgorICAgICAgICBleHQgICAgICAgICAgICAgdjEuOEIsICAgICAgXHIwXCgpLjhCLCBccjFcKCkuOEIsICM1CisgICAgICAgIHVhZGRsICAgICAgICAgICBcZDBcKCkuOEgsICBccjBcKCkuOEIsIHYxLjhCCisgICAgICAgIGV4dCAgICAgICAgICAgICB2MC44QiwgICAgICBccjJcKCkuOEIsIFxyM1woKS44QiwgIzIKKyAgICAgICAgbWxhICAgICAgICAgICAgIFxkMFwoKS44SCwgIHYyLjhILCAgICAgdjYuSFsxXQorICAgICAgICBleHQgICAgICAgICAgICAgdjEuOEIsICAgICAgXHIyXCgpLjhCLCBccjNcKCkuOEIsICMzCisgICAgICAgIHVhZGRsICAgICAgICAgICB2MC44SCwgICAgICB2MC44QiwgICAgIHYxLjhCCisgICAgICAgIGV4dCAgICAgICAgICAgICB2MS44QiwgICAgICBccjJcKCkuOEIsIFxyM1woKS44QiwgIzEKKyAgICAgICAgbWxzICAgICAgICAgICAgIFxkMFwoKS44SCwgIHY0LjhILCAgICAgdjYuSFswXQorICAgICAgICBleHQgICAgICAgICAgICAgdjMuOEIsICAgICAgXHIyXCgpLjhCLCBccjNcKCkuOEIsICM0CisgICAgICAgIHVhZGRsICAgICAgICAgICB2MS44SCwgICAgICB2MS44QiwgICAgIHYzLjhCCisgICAgICAgIGV4dCAgICAgICAgICAgICB2Mi44QiwgICAgICBccjJcKCkuOEIsIFxyM1woKS44QiwgIzUKKyAgICAgICAgdWFkZGwgICAgICAgICAgIFxkMVwoKS44SCwgIFxyMlwoKS44QiwgdjIuOEIKKyAgICAgICAgbWxhICAgICAgICAgICAgIFxkMVwoKS44SCwgIHYwLjhILCAgICAgdjYuSFsxXQorICAgICAgICBtbHMgICAgICAgICAgICAgXGQxXCgpLjhILCAgdjEuOEgsICAgICB2Ni5IWzBdCisgIC5pZiBcbmFycm93CisgICAgICAgIHNxcnNocnVuICAgICAgICBcZDBcKCkuOEIsICBcZDBcKCkuOEgsICM1CisgICAgICAgIHNxcnNocnVuICAgICAgICBcZDFcKCkuOEIsICBcZDFcKCkuOEgsICM1CisgIC5lbmRpZgorLmVuZG0KKworLy90cmFzaGVzIHYwLXY1LCB2NywgdjMwLXYzMQorLm1hY3JvICBsb3dwYXNzXzhIICAgICAgcjAsICByMQorICAgICAgICBleHQgICAgICAgICAgICAgdjAuMTZCLCAgICAgXHIwXCgpLjE2QiwgXHIwXCgpLjE2QiwgIzIKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYxLjE2QiwgICAgIFxyMFwoKS4xNkIsIFxyMFwoKS4xNkIsICMzCisgICAgICAgIHVhZGRsICAgICAgICAgICB2MC44SCwgICAgICB2MC44QiwgICAgICB2MS44QgorICAgICAgICBleHQgICAgICAgICAgICAgdjIuMTZCLCAgICAgXHIwXCgpLjE2QiwgXHIwXCgpLjE2QiwgIzEKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYzLjE2QiwgICAgIFxyMFwoKS4xNkIsIFxyMFwoKS4xNkIsICM0CisgICAgICAgIHVhZGRsICAgICAgICAgICB2Mi44SCwgICAgICB2Mi44QiwgICAgICB2My44QgorICAgICAgICBleHQgICAgICAgICAgICAgdjMwLjE2QiwgICAgXHIwXCgpLjE2QiwgXHIwXCgpLjE2QiwgIzUKKyAgICAgICAgdWFkZGwgICAgICAgICAgIFxyMFwoKS44SCwgIFxyMFwoKS44QiwgIHYzMC44QgorICAgICAgICBleHQgICAgICAgICAgICAgdjQuMTZCLCAgICAgXHIxXCgpLjE2QiwgXHIxXCgpLjE2QiwgIzIKKyAgICAgICAgbWxhICAgICAgICAgICAgIFxyMFwoKS44SCwgIHYwLjhILCAgICAgIHY2LkhbMV0KKyAgICAgICAgZXh0ICAgICAgICAgICAgIHY1LjE2QiwgICAgIFxyMVwoKS4xNkIsIFxyMVwoKS4xNkIsICMzCisgICAgICAgIHVhZGRsICAgICAgICAgICB2NC44SCwgICAgICB2NC44QiwgICAgICB2NS44QgorICAgICAgICBleHQgICAgICAgICAgICAgdjcuMTZCLCAgICAgXHIxXCgpLjE2QiwgXHIxXCgpLjE2QiwgIzEKKyAgICAgICAgbWxzICAgICAgICAgICAgIFxyMFwoKS44SCwgIHYyLjhILCAgICAgIHY2LkhbMF0KKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYwLjE2QiwgICAgIFxyMVwoKS4xNkIsIFxyMVwoKS4xNkIsICM0CisgICAgICAgIHVhZGRsICAgICAgICAgICB2Ny44SCwgICAgICB2Ny44QiwgICAgICB2MC44QgorICAgICAgICBleHQgICAgICAgICAgICAgdjMxLjE2QiwgICAgXHIxXCgpLjE2QiwgXHIxXCgpLjE2QiwgIzUKKyAgICAgICAgdWFkZGwgICAgICAgICAgIFxyMVwoKS44SCwgIFxyMVwoKS44QiwgIHYzMS44QgorICAgICAgICBtbGEgICAgICAgICAgICAgXHIxXCgpLjhILCAgdjQuOEgsICAgICAgdjYuSFsxXQorICAgICAgICBtbHMgICAgICAgICAgICAgXHIxXCgpLjhILCAgdjcuOEgsICAgICAgdjYuSFswXQorLmVuZG0KKworLy8gdHJhc2hlcyB2Mi12NSwgdjMwCisubWFjcm8gIGxvd3Bhc3NfOF8xICAgICByMCwgIHIxLCAgZDAsICBuYXJyb3c9MQorICAgICAgICBleHQgICAgICAgICAgICAgdjIuOEIsICAgICBccjBcKCkuOEIsIFxyMVwoKS44QiwgIzIKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYzLjhCLCAgICAgXHIwXCgpLjhCLCBccjFcKCkuOEIsICMzCisgICAgICAgIHVhZGRsICAgICAgICAgICB2Mi44SCwgICAgIHYyLjhCLCAgICAgdjMuOEIKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHY0LjhCLCAgICAgXHIwXCgpLjhCLCBccjFcKCkuOEIsICMxCisgICAgICAgIGV4dCAgICAgICAgICAgICB2NS44QiwgICAgIFxyMFwoKS44QiwgXHIxXCgpLjhCLCAjNAorICAgICAgICB1YWRkbCAgICAgICAgICAgdjQuOEgsICAgICB2NC44QiwgICAgIHY1LjhCCisgICAgICAgIGV4dCAgICAgICAgICAgICB2MzAuOEIsICAgIFxyMFwoKS44QiwgXHIxXCgpLjhCLCAjNQorICAgICAgICB1YWRkbCAgICAgICAgICAgXGQwXCgpLjhILCBccjBcKCkuOEIsIHYzMC44QgorICAgICAgICBtbGEgICAgICAgICAgICAgXGQwXCgpLjhILCB2Mi44SCwgICAgIHY2LkhbMV0KKyAgICAgICAgbWxzICAgICAgICAgICAgIFxkMFwoKS44SCwgdjQuOEgsICAgICB2Ni5IWzBdCisgIC5pZiBcbmFycm93CisgICAgICAgIHNxcnNocnVuICAgICAgICBcZDBcKCkuOEIsIFxkMFwoKS44SCwgIzUKKyAgLmVuZGlmCisuZW5kbQorCisvLyB0cmFzaGVkIHYwLXY3CisubWFjcm8gIGxvd3Bhc3NfOC4xNiAgICByMCwgIHIxLCAgcjIKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYxLjE2QiwgICAgIFxyMFwoKS4xNkIsIFxyMVwoKS4xNkIsICM0CisgICAgICAgIGV4dCAgICAgICAgICAgICB2MC4xNkIsICAgICBccjBcKCkuMTZCLCBccjFcKCkuMTZCLCAjNgorICAgICAgICBzYWRkbCAgICAgICAgICAgdjUuNFMsICAgICAgdjEuNEgsICAgICAgdjAuNEgKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYyLjE2QiwgICAgIFxyMFwoKS4xNkIsIFxyMVwoKS4xNkIsICMyCisgICAgICAgIHNhZGRsMiAgICAgICAgICB2MS40UywgICAgICB2MS44SCwgICAgICB2MC44SAorICAgICAgICBleHQgICAgICAgICAgICAgdjMuMTZCLCAgICAgXHIwXCgpLjE2QiwgXHIxXCgpLjE2QiwgIzgKKyAgICAgICAgc2FkZGwgICAgICAgICAgIHY2LjRTLCAgICAgIHYyLjRILCAgICAgIHYzLjRICisgICAgICAgIGV4dCAgICAgICAgICAgICBccjFcKCkuMTZCLCBccjBcKCkuMTZCLCBccjFcKCkuMTZCLCAjMTAKKyAgICAgICAgc2FkZGwyICAgICAgICAgIHYyLjRTLCAgICAgIHYyLjhILCAgICAgIHYzLjhICisgICAgICAgIHNhZGRsICAgICAgICAgICB2MC40UywgICAgICBccjBcKCkuNEgsICBccjFcKCkuNEgKKyAgICAgICAgc2FkZGwyICAgICAgICAgIHY0LjRTLCAgICAgIFxyMFwoKS44SCwgIFxyMVwoKS44SAorCisgICAgICAgIHNobCAgICAgICAgICAgICB2My40UywgIHY1LjRTLCAgIzQKKyAgICAgICAgc2hsICAgICAgICAgICAgIHY1LjRTLCAgdjUuNFMsICAjMgorICAgICAgICBzaGwgICAgICAgICAgICAgdjcuNFMsICB2Ni40UywgICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICB2NS40UywgIHY1LjRTLCAgdjMuNFMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHY2LjRTLCAgdjYuNFMsICB2Ny40UworCisgICAgICAgIHNobCAgICAgICAgICAgICB2My40UywgIHYxLjRTLCAgIzQKKyAgICAgICAgc2hsICAgICAgICAgICAgIHYxLjRTLCAgdjEuNFMsICAjMgorICAgICAgICBzaGwgICAgICAgICAgICAgdjcuNFMsICB2Mi40UywgICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MS40UywgIHYxLjRTLCAgdjMuNFMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyLjRTLCAgdjIuNFMsICB2Ny40UworCisgICAgICAgIGFkZCAgICAgICAgICAgICB2NS40UywgIHY1LjRTLCAgdjAuNFMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHY1LjRTLCAgdjUuNFMsICB2Ni40UworCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MS40UywgIHYxLjRTLCAgdjQuNFMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxLjRTLCAgdjEuNFMsICB2Mi40UworCisgICAgICAgIHJzaHJuICAgICAgICAgICB2NS40SCwgIHY1LjRTLCAgIzEwCisgICAgICAgIHJzaHJuMiAgICAgICAgICB2NS44SCwgIHYxLjRTLCAgIzEwCisKKyAgICAgICAgc3F4dHVuICAgICAgICAgIFxyMlwoKS44QiwgIHY1LjhICisuZW5kbQorCitmdW5jdGlvbiBwdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX25lb25fcGFja2VkCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NCwgIHgzMAorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCAjMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgIzgKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDIsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MSwgICM4CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTIsICMxNgorICAgICAgICBtb3YgICAgICAgICAgICAgeDMwLCB4NAorICAgICAgICBiICAgICAgICAgICAgICAgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX25lb24KK2VuZGZ1bmMKKworLm1hY3JvICBoMjY0X3FwZWxfaF9sb3dwYXNzIHR5cGUKK2Z1bmN0aW9uIFx0eXBlXCgpX2gyNjRfcXBlbDE2X2hfbG93cGFzc19uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTMsIHgzMAorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCAjMTYKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfaF9sb3dwYXNzX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MywgbHNsICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDIsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgIHgxLCAgIzgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgIzE2CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MzAsIHgxMworZW5kZnVuYworCitmdW5jdGlvbiBcdHlwZVwoKV9oMjY0X3FwZWw4X2hfbG93cGFzc19uZW9uCisxOiAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjhCLCB2MjkuOEJ9LCBbeDFdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi44QiwgdjE3LjhCfSwgW3gxXSwgeDIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHgxMiwgeDEyLCAjMgorICAgICAgICBsb3dwYXNzXzggICAgICAgdjI4LCB2MjksIHYxNiwgdjE3LCB2MjgsIHYxNgorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjhCfSwgICAgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyOC44QiwgdjI4LjhCLCAgdjIuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My44Qn0sICAgIFt4MF0KKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNi44QiwgdjE2LjhCLCB2My44QgorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgzCisgIC5lbmRpZgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyOC44Qn0sICAgIFt4MF0sIHgzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LjhCfSwgICAgW3gwXSwgeDMKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworLmVuZG0KKworICAgICAgICBoMjY0X3FwZWxfaF9sb3dwYXNzIHB1dAorICAgICAgICBoMjY0X3FwZWxfaF9sb3dwYXNzIGF2ZworCisubWFjcm8gIGgyNjRfcXBlbF9oX2xvd3Bhc3NfbDIgdHlwZQorZnVuY3Rpb24gXHR5cGVcKClfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX2wyX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMywgeDMwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTIsICMxNgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgyLCBsc2wgIzQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICB4MiwgbHNsICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MywgIHgzLCAgeDIsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgIHgxLCAgIzgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgzLCAgeDMsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCAjMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzMCwgeDEzCitlbmRmdW5jCisKK2Z1bmN0aW9uIFx0eXBlXCgpX2gyNjRfcXBlbDhfaF9sb3dwYXNzX2wyX25lb24KKzE6ICAgICAgbGQxICAgICAgICAgICAgIHt2MjYuOEIsIHYyNy44Qn0sIFt4MV0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjhCLCB2MTcuOEJ9LCBbeDFdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyOC44Qn0sICAgICBbeDNdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyOS44Qn0sICAgICBbeDNdLCB4MgorICAgICAgICBzdWJzICAgICAgICAgICAgeDEyLCB4MTIsICMyCisgICAgICAgIGxvd3Bhc3NfOCAgICAgICB2MjYsIHYyNywgdjE2LCB2MTcsIHYyNiwgdjI3CisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MjYuOEIsIHYyNi44QiwgdjI4LjhCCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MjcuOEIsIHYyNy44QiwgdjI5LjhCCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuOEJ9LCAgICAgIFt4MF0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MjYuOEIsIHYyNi44QiwgdjIuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My44Qn0sICAgICAgW3gwXQorICAgICAgICB1cmhhZGQgICAgICAgICAgdjI3LjhCLCB2MjcuOEIsIHYzLjhCCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDIKKyAgLmVuZGlmCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI2LjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI3LjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQKK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgaDI2NF9xcGVsX2hfbG93cGFzc19sMiBwdXQKKyAgICAgICAgaDI2NF9xcGVsX2hfbG93cGFzc19sMiBhdmcKKworZnVuY3Rpb24gcHV0X2gyNjRfcXBlbDE2X3ZfbG93cGFzc19uZW9uX3BhY2tlZAorICAgICAgICBtb3YgICAgICAgICAgICAgeDQsICB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgyLCAgIzgKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDMsIGxzbCAjMgorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X2gyNjRfcXBlbDhfdl9sb3dwYXNzX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICB4MywgbHNsICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDMsIGxzbCAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MSwgICM4CisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgIHgzLCBsc2wgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzMCwgeDQKKyAgICAgICAgYiAgICAgICAgICAgICAgIHB1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19uZW9uCitlbmRmdW5jCisKKy5tYWNybyAgaDI2NF9xcGVsX3ZfbG93cGFzcyB0eXBlCitmdW5jdGlvbiBcdHlwZVwoKV9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDQsICB4MzAKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfdl9sb3dwYXNzX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICB4MywgbHNsICMyCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X3ZfbG93cGFzc19uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDIsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICM4CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDMsIGxzbCAjNAorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgIHgzLCBsc2wgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICAjOAorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgIHgzLCBsc2wgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzMCwgeDQKK2VuZGZ1bmMKKworZnVuY3Rpb24gXHR5cGVcKClfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbmVvbgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi44Qn0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE4LjhCfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOEJ9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi44Qn0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI0LjhCfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjYuOEJ9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyOC44Qn0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMwLjhCfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTcuOEJ9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YxOS44Qn0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLjhCfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuOEJ9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyNS44Qn0sIFt4MV0KKworICAgICAgICB0cmFuc3Bvc2VfOHg4QiAgdjE2LCB2MTgsIHYyMCwgdjIyLCB2MjQsIHYyNiwgdjI4LCB2MzAsIHYwLCAgdjEKKyAgICAgICAgdHJhbnNwb3NlXzh4OEIgIHYxNywgdjE5LCB2MjEsIHYyMywgdjI1LCB2MjcsIHYyOSwgdjMxLCB2MCwgIHYxCisgICAgICAgIGxvd3Bhc3NfOCAgICAgICB2MTYsIHYxNywgdjE4LCB2MTksIHYxNiwgdjE3CisgICAgICAgIGxvd3Bhc3NfOCAgICAgICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYxOCwgdjE5CisgICAgICAgIGxvd3Bhc3NfOCAgICAgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyMCwgdjIxCisgICAgICAgIGxvd3Bhc3NfOCAgICAgICB2MjgsIHYyOSwgdjMwLCB2MzEsIHYyMiwgdjIzCisgICAgICAgIHRyYW5zcG9zZV84eDhCICB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjAsICB2MQorCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI0LjhCfSwgIFt4MF0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MTYuOEIsIHYxNi44QiwgdjI0LjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI1LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNy44QiwgdjE3LjhCLCB2MjUuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjYuOEJ9LCBbeDBdLCB4MgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE4LjhCLCB2MTguOEIsIHYyNi44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNy44Qn0sIFt4MF0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MTkuOEIsIHYxOS44QiwgdjI3LjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyMC44QiwgdjIwLjhCLCB2MjguOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjkuOEJ9LCBbeDBdLCB4MgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjIxLjhCLCB2MjEuOEIsIHYyOS44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3YzMC44Qn0sIFt4MF0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MjIuOEIsIHYyMi44QiwgdjMwLjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMxLjhCfSwgW3gwXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyMy44QiwgdjIzLjhCLCB2MzEuOEIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MiwgIGxzbCAjMworICAuZW5kaWYKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi44Qn0sIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE3LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguOEJ9LCBbeDBdLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxOS44Qn0sIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIwLjhCfSwgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjEuOEJ9LCBbeDBdLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi44Qn0sIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLjhCfSwgW3gwXSwgeDIKKworICAgICAgICByZXQKK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgaDI2NF9xcGVsX3ZfbG93cGFzcyBwdXQKKyAgICAgICAgaDI2NF9xcGVsX3ZfbG93cGFzcyBhdmcKKworLm1hY3JvICBoMjY0X3FwZWxfdl9sb3dwYXNzX2wyIHR5cGUKK2Z1bmN0aW9uIFx0eXBlXCgpX2gyNjRfcXBlbDE2X3ZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NCwgIHgzMAorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgIHgzLCBsc2wgIzIKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfdl9sb3dwYXNzX2wyX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MywgbHNsICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MTIsIHgxMiwgeDIsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MTIsIHgxMiwgIzgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICB4MywgbHNsICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDMsIGxzbCAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MSwgICM4CisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X3ZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDMsIGxzbCAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgeDMwLCB4NAorZW5kZnVuYworCitmdW5jdGlvbiBcdHlwZVwoKV9oMjY0X3FwZWw4X3ZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjhCfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguOEJ9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC44Qn0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIyLjhCfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuOEJ9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyNi44Qn0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjhCfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzAuOEJ9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YxNy44Qn0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE5LjhCfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuOEJ9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMy44Qn0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI1LjhCfSwgW3gxXQorCisgICAgICAgIHRyYW5zcG9zZV84eDhCICB2MTYsIHYxOCwgdjIwLCB2MjIsIHYyNCwgdjI2LCB2MjgsIHYzMCwgdjAsICB2MQorICAgICAgICB0cmFuc3Bvc2VfOHg4QiAgdjE3LCB2MTksIHYyMSwgdjIzLCB2MjUsIHYyNywgdjI5LCB2MzEsIHYwLCAgdjEKKyAgICAgICAgbG93cGFzc184ICAgICAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjE2LCB2MTcKKyAgICAgICAgbG93cGFzc184ICAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjE4LCB2MTkKKyAgICAgICAgbG93cGFzc184ICAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjIwLCB2MjEKKyAgICAgICAgbG93cGFzc184ICAgICAgIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjIyLCB2MjMKKyAgICAgICAgdHJhbnNwb3NlXzh4OEIgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MCwgIHYxCisKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuOEJ9LCAgW3gxMl0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI1LjhCfSwgIFt4MTJdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNi44Qn0sICBbeDEyXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjcuOEJ9LCAgW3gxMl0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjhCfSwgIFt4MTJdLCB4MgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE2LjhCLCB2MjQuOEIsIHYxNi44QgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE3LjhCLCB2MjUuOEIsIHYxNy44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyOS44Qn0sICBbeDEyXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxOC44QiwgdjI2LjhCLCB2MTguOEIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxOS44QiwgdjI3LjhCLCB2MTkuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzAuOEJ9LCBbeDEyXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyMC44QiwgdjI4LjhCLCB2MjAuOEIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyMS44QiwgdjI5LjhCLCB2MjEuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzEuOEJ9LCBbeDEyXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyMi44QiwgdjMwLjhCLCB2MjIuOEIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyMy44QiwgdjMxLjhCLCB2MjMuOEIKKworICAuaWZjIFx0eXBlLGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3YyNC44Qn0sIFt4MF0sIHgzCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MTYuOEIsIHYxNi44QiwgdjI0LjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI1LjhCfSwgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNy44QiwgdjE3LjhCLCB2MjUuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjYuOEJ9LCBbeDBdLCB4MworICAgICAgICB1cmhhZGQgICAgICAgICAgdjE4LjhCLCB2MTguOEIsIHYyNi44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNy44Qn0sIFt4MF0sIHgzCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MTkuOEIsIHYxOS44QiwgdjI3LjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjhCfSwgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyMC44QiwgdjIwLjhCLCB2MjguOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjkuOEJ9LCBbeDBdLCB4MworICAgICAgICB1cmhhZGQgICAgICAgICAgdjIxLjhCLCB2MjEuOEIsIHYyOS44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3YzMC44Qn0sIFt4MF0sIHgzCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MjIuOEIsIHYyMi44QiwgdjMwLjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMxLjhCfSwgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyMy44QiwgdjIzLjhCLCB2MzEuOEIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MywgIGxzbCAjMworICAuZW5kaWYKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi44Qn0sIFt4MF0sIHgzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE3LjhCfSwgW3gwXSwgeDMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguOEJ9LCBbeDBdLCB4MworICAgICAgICBzdDEgICAgICAgICAgICAge3YxOS44Qn0sIFt4MF0sIHgzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIwLjhCfSwgW3gwXSwgeDMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjEuOEJ9LCBbeDBdLCB4MworICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi44Qn0sIFt4MF0sIHgzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLjhCfSwgW3gwXSwgeDMKKworICAgICAgICByZXQKK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgaDI2NF9xcGVsX3ZfbG93cGFzc19sMiBwdXQKKyAgICAgICAgaDI2NF9xcGVsX3ZfbG93cGFzc19sMiBhdmcKKworZnVuY3Rpb24gcHV0X2gyNjRfcXBlbDhfaHZfbG93cGFzc19uZW9uX3RvcAorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgdzEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjhIfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTcuOEh9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YxOC44SH0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE5LjhIfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOEh9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMS44SH0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIyLjhIfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuOEh9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyNC44SH0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI1LjhIfSwgW3gxXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjYuOEh9LCBbeDFdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyNy44SH0sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjhIfSwgW3gxXQorICAgICAgICBsb3dwYXNzXzhIICAgICAgdjE2LCB2MTcKKyAgICAgICAgbG93cGFzc184SCAgICAgIHYxOCwgdjE5CisgICAgICAgIGxvd3Bhc3NfOEggICAgICB2MjAsIHYyMQorICAgICAgICBsb3dwYXNzXzhIICAgICAgdjIyLCB2MjMKKyAgICAgICAgbG93cGFzc184SCAgICAgIHYyNCwgdjI1CisgICAgICAgIGxvd3Bhc3NfOEggICAgICB2MjYsIHYyNworICAgICAgICBsb3dwYXNzXzhIICAgICAgdjI4LCB2MjkKKworICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYwLCAgdjEKKyAgICAgICAgdHJhbnNwb3NlXzh4OEggIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MCwgIHYxCisKKyAgICAgICAgbG93cGFzc184LjE2ICAgIHYxNiwgdjI0LCB2MTYKKyAgICAgICAgbG93cGFzc184LjE2ICAgIHYxNywgdjI1LCB2MTcKKworICAgICAgICBsb3dwYXNzXzguMTYgICAgdjE4LCB2MjYsIHYxOAorICAgICAgICBsb3dwYXNzXzguMTYgICAgdjE5LCB2MjcsIHYxOQorCisgICAgICAgIGxvd3Bhc3NfOC4xNiAgICB2MjAsIHYyOCwgdjIwCisgICAgICAgIGxvd3Bhc3NfOC4xNiAgICB2MjEsIHYyOSwgdjIxCisKKyAgICAgICAgbG93cGFzc184LjE2ICAgIHYyMiwgdjMwLCB2MjIKKyAgICAgICAgbG93cGFzc184LjE2ICAgIHYyMywgdjMxLCB2MjMKKworICAgICAgICB0cmFuc3Bvc2VfOHg4QiB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjAsICB2MQorCisgICAgICAgIHJldAorZW5kZnVuYworCisubWFjcm8gIGgyNjRfcXBlbDhfaHZfbG93cGFzcyB0eXBlCitmdW5jdGlvbiBcdHlwZVwoKV9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDEwLCB4MzAKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbmVvbl90b3AKKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC44Qn0sICAgICAgW3gwXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNi44QiwgdjE2LjhCLCB2MC44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjhCfSwgICAgICBbeDBdLCB4MgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE3LjhCLCB2MTcuOEIsIHYxLjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuOEJ9LCAgICAgIFt4MF0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MTguOEIsIHYxOC44QiwgdjIuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My44Qn0sICAgICAgW3gwXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxOS44QiwgdjE5LjhCLCB2My44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhCfSwgICAgICBbeDBdLCB4MgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjIwLjhCLCB2MjAuOEIsIHY0LjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuOEJ9LCAgICAgIFt4MF0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MjEuOEIsIHYyMS44QiwgdjUuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni44Qn0sICAgICAgW3gwXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyMi44QiwgdjIyLjhCLCB2Ni44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y3LjhCfSwgICAgICBbeDBdLCB4MgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjIzLjhCLCB2MjMuOEIsIHY3LjhCCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDIsICBsc2wgIzMKKyAgLmVuZGlmCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTcuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjAuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjEuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuOEJ9LCAgICAgW3gwXSwgeDIKKworICAgICAgICByZXQgICAgICAgICAgICAgeDEwCitlbmRmdW5jCisuZW5kbQorCisgICAgICAgIGgyNjRfcXBlbDhfaHZfbG93cGFzcyBwdXQKKyAgICAgICAgaDI2NF9xcGVsOF9odl9sb3dwYXNzIGF2ZworCisubWFjcm8gIGgyNjRfcXBlbDhfaHZfbG93cGFzc19sMiB0eXBlCitmdW5jdGlvbiBcdHlwZVwoKV9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDEwLCB4MzAKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbmVvbl90b3AKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhCLCB2MS44Qn0sICBbeDJdLCAjMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi44QiwgdjMuOEJ9LCAgW3gyXSwgIzE2CisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MC44QiwgIHYwLjhCLCAgdjE2LjhCCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MS44QiwgIHYxLjhCLCAgdjE3LjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOEIsIHY1LjhCfSwgIFt4Ml0sICMxNgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjIuOEIsICB2Mi44QiwgIHYxOC44QgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjMuOEIsICB2My44QiwgIHYxOS44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjhCLCB2Ny44Qn0sICBbeDJdLCAjMTYKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHY0LjhCLCAgdjQuOEIsICB2MjAuOEIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHY1LjhCLCAgdjUuOEIsICB2MjEuOEIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHY2LjhCLCAgdjYuOEIsICB2MjIuOEIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHY3LjhCLCAgdjcuOEIsICB2MjMuOEIKKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTYuOEJ9LCAgICAgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYwLjhCLCAgdjAuOEIsICB2MTYuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTcuOEJ9LCAgICAgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxLjhCLCAgdjEuOEIsICB2MTcuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguOEJ9LCAgICAgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyLjhCLCAgdjIuOEIsICB2MTguOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTkuOEJ9LCAgICAgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYzLjhCLCAgdjMuOEIsICB2MTkuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOEJ9LCAgICAgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHY0LjhCLCAgdjQuOEIsICB2MjAuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuOEJ9LCAgICAgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHY1LjhCLCAgdjUuOEIsICB2MjEuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjIuOEJ9LCAgICAgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHY2LjhCLCAgdjYuOEIsICB2MjIuOEIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuOEJ9LCAgICAgW3gwXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHY3LjhCLCAgdjcuOEIsICB2MjMuOEIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MywgIGxzbCAjMworICAuZW5kaWYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC44Qn0sICAgICAgW3gwXSwgeDMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS44Qn0sICAgICAgW3gwXSwgeDMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi44Qn0sICAgICAgW3gwXSwgeDMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My44Qn0sICAgICAgW3gwXSwgeDMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC44Qn0sICAgICAgW3gwXSwgeDMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS44Qn0sICAgICAgW3gwXSwgeDMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ni44Qn0sICAgICAgW3gwXSwgeDMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny44Qn0sICAgICAgW3gwXSwgeDMKKworICAgICAgICByZXQgICAgICAgICAgICAgeDEwCitlbmRmdW5jCisuZW5kbQorCisgICAgICAgIGgyNjRfcXBlbDhfaHZfbG93cGFzc19sMiBwdXQKKyAgICAgICAgaDI2NF9xcGVsOF9odl9sb3dwYXNzX2wyIGF2ZworCisubWFjcm8gIGgyNjRfcXBlbDE2X2h2ICB0eXBlCitmdW5jdGlvbiBcdHlwZVwoKV9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMywgeDMwCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgIHgzLCBsc2wgIzIKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfaHZfbG93cGFzc19uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDMsIGxzbCAjNAorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgIHgzLCBsc2wgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICAjOAorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgyLCBsc2wgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjOAorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9odl9sb3dwYXNzX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICB4MywgbHNsICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MzAsIHgxMworICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9odl9sb3dwYXNzX25lb24KK2VuZGZ1bmMKKworZnVuY3Rpb24gXHR5cGVcKClfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTMsIHgzMAorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4NCwgICMyNTYKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfaHZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDMsIGxzbCAjMgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9odl9sb3dwYXNzX2wyX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICB4MywgbHNsICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDMsIGxzbCAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MSwgICM4CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDMsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICM4CisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgIHgzLCBsc2wgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzMCwgeDEzCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbDJfbmVvbgorZW5kZnVuYworLmVuZG0KKworICAgICAgICBoMjY0X3FwZWwxNl9odiBwdXQKKyAgICAgICAgaDI2NF9xcGVsMTZfaHYgYXZnCisKKy5tYWNybyAgaDI2NF9xcGVsOCAgICAgIHR5cGUKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMxMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgdzMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgeDEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCAjOAorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfbmVvbgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWw4X21jMjBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbG93cGFzc19jb25zdCAgIHczCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgeDIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgIzgKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfaF9sb3dwYXNzX25lb24KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsOF9tYzMwX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxvd3Bhc3NfY29uc3QgICB3MworICAgICAgICBhZGQgICAgICAgICAgICAgeDMsICB4MSwgICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgIzgKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfaF9sb3dwYXNzX2wyX25lb24KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsOF9tYzAxX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTQsIHgzMAorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCB4MQorXHR5cGVcKClfaDI2NF9xcGVsOF9tYzAxOgorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgdzMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgeDIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICB4MiwgbHNsICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X3ZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIHJldCAgICAgICAgICAgICB4MTQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsOF9tYzExX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTQsIHgzMAorICAgICAgICBtb3YgICAgICAgICAgICAgeDgsICB4MAorICAgICAgICBtb3YgICAgICAgICAgICAgeDksICB4MQorXHR5cGVcKClfaDI2NF9xcGVsOF9tYzExOgorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgdzMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMSwgc3AKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjNjQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgwLCAgc3AKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCAjOAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgwLCAgeDgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgeDIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgc3AKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDksICB4MiwgbHNsICMxCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MiwgICM4CisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X3ZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICBzcCwgIHgxMQorICAgICAgICByZXQgICAgICAgICAgICAgeDE0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMyMV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgeDEKK1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMyMToKKyAgICAgICAgbG93cGFzc19jb25zdCAgIHczCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTEsIHNwCisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIyg4KjgrMTYqMTIpCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgIzgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgwLCAgc3AKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgIzgKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NCwgIHgwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MCwgIHg4CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHg5LCAgeDIsIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgIHgyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHg0LCAgIzY0CisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgc3AsICB4MTEKKyAgICAgICAgcmV0ICAgICAgICAgICAgIHgxNAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWw4X21jMzFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICAjMQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgeDEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICAjMQorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9tYzExCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMwMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbG93cGFzc19jb25zdCAgIHczCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDIsIGxzbCAjMQorICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICB4MgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbmVvbgorICAgICAgICByZXQgICAgICAgICAgICAgeDE0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMxMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgeDEKK1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMxMjoKKyAgICAgICAgbG93cGFzc19jb25zdCAgIHczCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTEsIHNwCisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIyg4KjgrMTYqMTIpCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDIsIGxzbCAjMQorICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICB4MgorICAgICAgICBtb3YgICAgICAgICAgICAgeDIsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgeDAsICBzcAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X2gyNjRfcXBlbDhfdl9sb3dwYXNzX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHg0LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgwLCAgeDgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDksICB4MywgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDQsICAjNjQKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfaHZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICBzcCwgIHgxMQorICAgICAgICByZXQgICAgICAgICAgICAgeDE0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMyMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMSwgc3AKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICB4MiwgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgeDIKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfaHZfbG93cGFzc19uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICBzcCwgIHgxMQorICAgICAgICByZXQgICAgICAgICAgICAgeDE0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMzMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgeDEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICAjMQorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9tYzEyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMwM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxMiwgeDEsICB4MgorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9tYzAxCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMxM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgeDEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICB4MgorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9tYzExCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMyM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgeDEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICB4MgorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9tYzIxCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMzM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MSwgICMxCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTQsIHgzMAorICAgICAgICBtb3YgICAgICAgICAgICAgeDgsICB4MAorICAgICAgICBtb3YgICAgICAgICAgICAgeDksICB4MQorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MSwgIHgyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgIzEKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfbWMxMQorZW5kZnVuYworLmVuZG0KKworICAgICAgICBoMjY0X3FwZWw4IHB1dAorICAgICAgICBoMjY0X3FwZWw4IGF2ZworCisubWFjcm8gIGgyNjRfcXBlbDE2ICAgICB0eXBlCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzEwX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxvd3Bhc3NfY29uc3QgICB3MworICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICB4MQorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgICMyCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbDJfbmVvbgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzIwX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxvd3Bhc3NfY29uc3QgICB3MworICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgIHgyCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbmVvbgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzMwX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxvd3Bhc3NfY29uc3QgICB3MworICAgICAgICBhZGQgICAgICAgICAgICAgeDMsICB4MSwgICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgIzIKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDE2X2hfbG93cGFzc19sMl9uZW9uCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMDFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNCwgeDMwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTIsIHgxCitcdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzAxOgorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgdzMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgeDIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICB4MiwgbHNsICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICByZXQgICAgICAgICAgICAgeDE0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMTFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNCwgeDMwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4OCwgIHgwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4OSwgIHgxCitcdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzExOgorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgdzMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMSwgc3AKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMjU2CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MCwgIHNwCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgIzE2CisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgwLCAgeDgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgeDIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgc3AKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDksICB4MiwgbHNsICMxCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MiwgICMxNgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX2wyX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgeDExCisgICAgICAgIHJldCAgICAgICAgICAgICB4MTQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsMTZfbWMyMV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgeDEKK1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMjE6CisgICAgICAgIGxvd3Bhc3NfY29uc3QgICB3MworICAgICAgICBtb3YgICAgICAgICAgICAgeDExLCBzcAorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMoMTYqMTYrMTYqMTIpCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgwLCAgc3AKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbmVvbl9wYWNrZWQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg0LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgwLCAgeDgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDksICB4MiwgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgeDIKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgc3AsICB4MTEKKyAgICAgICAgcmV0ICAgICAgICAgICAgIHgxNAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzMxX25lb24sIGV4cG9ydD0xCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgIHgxLCAgIzEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNCwgeDMwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4OCwgIHgwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4OSwgIHgxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgIzEKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDE2X21jMTEKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsMTZfbWMwMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbG93cGFzc19jb25zdCAgIHczCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDIsIGxzbCAjMQorICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICB4MgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX25lb24KKyAgICAgICAgcmV0ICAgICAgICAgICAgIHgxNAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzEyX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTQsIHgzMAorICAgICAgICBtb3YgICAgICAgICAgICAgeDgsICB4MAorICAgICAgICBtb3YgICAgICAgICAgICAgeDksICB4MQorXHR5cGVcKClfaDI2NF9xcGVsMTZfbWMxMjoKKyAgICAgICAgbG93cGFzc19jb25zdCAgIHczCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTEsIHNwCisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIygxNioxNisxNioxMikKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICB4MiwgbHNsICMxCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MCwgIHNwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgIHgyCisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX25lb25fcGFja2VkCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NCwgIHgwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MCwgIHg4CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHg5LCAgeDMsIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MiwgIHgzCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX2wyX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgeDExCisgICAgICAgIHJldCAgICAgICAgICAgICB4MTQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsMTZfbWMyMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbG93cGFzc19jb25zdCAgIHczCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTEsIHNwCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDIsIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgIHgyCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgeDExIC8vIHJlc3RvcmUgc3RhY2sKKyAgICAgICAgcmV0ICAgICAgICAgICAgIHgxNAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzMyX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTQsIHgzMAorICAgICAgICBtb3YgICAgICAgICAgICAgeDgsICB4MAorICAgICAgICBtb3YgICAgICAgICAgICAgeDksICB4MQorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MSwgICMxCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzEyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMDNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNCwgeDMwCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MTIsIHgxLCAgeDIKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDE2X21jMDEKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsMTZfbWMxM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgeDEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICB4MgorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsMTZfbWMxMQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzIzX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTQsIHgzMAorICAgICAgICBtb3YgICAgICAgICAgICAgeDgsICB4MAorICAgICAgICBtb3YgICAgICAgICAgICAgeDksICB4MQorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MSwgIHgyCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzIxCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMzNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICAjMQorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgeDEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICB4MgorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgICMxCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzExCitlbmRmdW5jCisuZW5kbQorCisgICAgICAgIGgyNjRfcXBlbDE2IHB1dAorICAgICAgICBoMjY0X3FwZWwxNiBhdmcKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvaHBlbGRzcF9pbml0X2FhcmNoNjQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvaHBlbGRzcF9pbml0X2FhcmNoNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRhZTJiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9ocGVsZHNwX2luaXRfYWFyY2g2NC5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQVJNIE5FT04gb3B0aW1pc2VkIERTUCBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2hwZWxkc3AuaCIKKwordm9pZCAgICAgZmZfcHV0X3BpeGVsczE2X25lb24odWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgIGZmX3B1dF9waXhlbHMxNl94Ml9uZW9uKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkICBmZl9wdXRfcGl4ZWxzMTZfeTJfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzMTZfeHkyX25lb24odWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgICAgICBmZl9wdXRfcGl4ZWxzOF9uZW9uKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkICAgZmZfcHV0X3BpeGVsczhfeDJfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCAgIGZmX3B1dF9waXhlbHM4X3kyX25lb24odWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgIGZmX3B1dF9waXhlbHM4X3h5Ml9uZW9uKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CisKK3ZvaWQgIGZmX3B1dF9waXhlbHMxNl94Ml9ub19ybmRfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgIGZmX3B1dF9waXhlbHMxNl95Ml9ub19ybmRfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczE2X3h5Ml9ub19ybmRfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgICBmZl9wdXRfcGl4ZWxzOF94Ml9ub19ybmRfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgICBmZl9wdXRfcGl4ZWxzOF95Ml9ub19ybmRfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgIGZmX3B1dF9waXhlbHM4X3h5Ml9ub19ybmRfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKKwordm9pZCAgICAgZmZfYXZnX3BpeGVsczE2X25lb24odWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgIGZmX2F2Z19waXhlbHMxNl94Ml9uZW9uKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkICBmZl9hdmdfcGl4ZWxzMTZfeTJfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfeHkyX25lb24odWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgICAgICBmZl9hdmdfcGl4ZWxzOF9uZW9uKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkICAgZmZfYXZnX3BpeGVsczhfeDJfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCAgIGZmX2F2Z19waXhlbHM4X3kyX25lb24odWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgIGZmX2F2Z19waXhlbHM4X3h5Ml9uZW9uKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CisKK3ZvaWQgIGZmX2F2Z19waXhlbHMxNl94Ml9ub19ybmRfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgIGZmX2F2Z19waXhlbHMxNl95Ml9ub19ybmRfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X3h5Ml9ub19ybmRfbmVvbih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKKworYXZfY29sZCB2b2lkIGZmX2hwZWxkc3BfaW5pdF9hYXJjaDY0KEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVswXSA9IGZmX3B1dF9waXhlbHMxNl9uZW9uOworICAgICAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsxXSA9IGZmX3B1dF9waXhlbHMxNl94Ml9uZW9uOworICAgICAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsyXSA9IGZmX3B1dF9waXhlbHMxNl95Ml9uZW9uOworICAgICAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVszXSA9IGZmX3B1dF9waXhlbHMxNl94eTJfbmVvbjsKKyAgICAgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bMF0gPSBmZl9wdXRfcGl4ZWxzOF9uZW9uOworICAgICAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsxXSA9IGZmX3B1dF9waXhlbHM4X3gyX25lb247CisgICAgICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzJdID0gZmZfcHV0X3BpeGVsczhfeTJfbmVvbjsKKyAgICAgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bM10gPSBmZl9wdXRfcGl4ZWxzOF94eTJfbmVvbjsKKworICAgICAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMF1bMF0gPSBmZl9wdXRfcGl4ZWxzMTZfbmVvbjsKKyAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzFdID0gZmZfcHV0X3BpeGVsczE2X3gyX25vX3JuZF9uZW9uOworICAgICAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMF1bMl0gPSBmZl9wdXRfcGl4ZWxzMTZfeTJfbm9fcm5kX25lb247CisgICAgICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlswXVszXSA9IGZmX3B1dF9waXhlbHMxNl94eTJfbm9fcm5kX25lb247CisgICAgICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVswXSA9IGZmX3B1dF9waXhlbHM4X25lb247CisgICAgICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVsxXSA9IGZmX3B1dF9waXhlbHM4X3gyX25vX3JuZF9uZW9uOworICAgICAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bMl0gPSBmZl9wdXRfcGl4ZWxzOF95Ml9ub19ybmRfbmVvbjsKKyAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzNdID0gZmZfcHV0X3BpeGVsczhfeHkyX25vX3JuZF9uZW9uOworCisgICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzBdID0gZmZfYXZnX3BpeGVsczE2X25lb247CisgICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzFdID0gZmZfYXZnX3BpeGVsczE2X3gyX25lb247CisgICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzJdID0gZmZfYXZnX3BpeGVsczE2X3kyX25lb247CisgICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzNdID0gZmZfYXZnX3BpeGVsczE2X3h5Ml9uZW9uOworICAgICAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVswXSA9IGZmX2F2Z19waXhlbHM4X25lb247CisgICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzFdID0gZmZfYXZnX3BpeGVsczhfeDJfbmVvbjsKKyAgICAgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMl0gPSBmZl9hdmdfcGl4ZWxzOF95Ml9uZW9uOworICAgICAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVszXSA9IGZmX2F2Z19waXhlbHM4X3h5Ml9uZW9uOworCisgICAgICAgIGMtPmF2Z19ub19ybmRfcGl4ZWxzX3RhYlswXSA9IGZmX2F2Z19waXhlbHMxNl9uZW9uOworICAgICAgICBjLT5hdmdfbm9fcm5kX3BpeGVsc190YWJbMV0gPSBmZl9hdmdfcGl4ZWxzMTZfeDJfbm9fcm5kX25lb247CisgICAgICAgIGMtPmF2Z19ub19ybmRfcGl4ZWxzX3RhYlsyXSA9IGZmX2F2Z19waXhlbHMxNl95Ml9ub19ybmRfbmVvbjsKKyAgICAgICAgYy0+YXZnX25vX3JuZF9waXhlbHNfdGFiWzNdID0gZmZfYXZnX3BpeGVsczE2X3h5Ml9ub19ybmRfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L2hwZWxkc3BfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9ocGVsZHNwX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDkxYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9ocGVsZHNwX25lb24uUwpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIEFSTSBORU9OIG9wdGltaXNlZCBEU1AgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgSmFubmUgR3J1bmF1IDxqYW5uZS1saWJhdkBqYW5uYXUubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMiCisKKy5tYWNybyAgcGl4ZWxzMTYgICAgICAgIHJuZD0xLCBhdmc9MAorICAuaWYgXGF2ZworICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCB4MAorICAuZW5kaWYKKzE6ICAgICAgbGQxICAgICAgICAgICAgIHt2MC4xNkJ9LCAgW3gxXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS4xNkJ9LCAgW3gxXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi4xNkJ9LCAgW3gxXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My4xNkJ9LCAgW3gxXSwgeDIKKyAgLmlmIFxhdmcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC4xNkJ9LCAgW3gxMl0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MC4xNkIsICB2MC4xNkIsICB2NC4xNkIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS4xNkJ9LCAgW3gxMl0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MS4xNkIsICB2MS4xNkIsICB2NS4xNkIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni4xNkJ9LCAgW3gxMl0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2Mi4xNkIsICB2Mi4xNkIsICB2Ni4xNkIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny4xNkJ9LCAgW3gxMl0sIHgyCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2My4xNkIsICB2My4xNkIsICB2Ny4xNkIKKyAgLmVuZGlmCisgICAgICAgIHN1YnMgICAgICAgICAgICB3MywgIHczLCAgIzQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC4xNkJ9LCAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS4xNkJ9LCAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi4xNkJ9LCAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My4xNkJ9LCAgW3gwXSwgeDIKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorLmVuZG0KKworLm1hY3JvICBwaXhlbHMxNl94MiAgICAgcm5kPTEsIGF2Zz0wCisxOiAgICAgIGxkMSAgICAgICAgICAgICB7djAuMTZCLCB2MS4xNkJ9LCBbeDFdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjE2QiwgdjMuMTZCfSwgW3gxXSwgeDIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHczLCAgdzMsICAjMgorICAgICAgICBleHQgICAgICAgICAgICAgdjEuMTZCLCAgdjAuMTZCLCAgdjEuMTZCLCAgIzEKKyAgICAgICAgYXZnICAgICAgICAgICAgIHYwLjE2QiwgIHYwLjE2QiwgIHYxLjE2QgorICAgICAgICBleHQgICAgICAgICAgICAgdjMuMTZCLCAgdjIuMTZCLCAgdjMuMTZCLCAgIzEKKyAgICAgICAgYXZnICAgICAgICAgICAgIHYyLjE2QiwgIHYyLjE2QiwgIHYzLjE2QgorICAuaWYgXGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjE2Qn0sIFt4MF0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuMTZCfSwgW3gwXQorICAgICAgICB1cmhhZGQgICAgICAgICAgdjAuMTZCLCAgdjAuMTZCLCAgdjEuMTZCCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2Mi4xNkIsICB2Mi4xNkIsICB2My4xNkIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MgorICAuZW5kaWYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC4xNkJ9LCBbeDBdLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjE2Qn0sIFt4MF0sIHgyCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQKKy5lbmRtCisKKy5tYWNybyAgcGl4ZWxzMTZfeTIgICAgIHJuZD0xLCBhdmc9MAorICAgICAgICBzdWIgICAgICAgICAgICAgdzMsICB3MywgICMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMTZCfSwgW3gxXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS4xNkJ9LCBbeDFdLCB4MgorMTogICAgICBzdWJzICAgICAgICAgICAgdzMsICB3MywgICMyCisgICAgICAgIGF2ZyAgICAgICAgICAgICB2Mi4xNkIsICB2MC4xNkIsICB2MS4xNkIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC4xNkJ9LCBbeDFdLCB4MgorICAgICAgICBhdmcgICAgICAgICAgICAgdjMuMTZCLCAgdjAuMTZCLCAgdjEuMTZCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuMTZCfSwgW3gxXSwgeDIKKyAgLmlmIFxhdmcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC4xNkJ9LCBbeDBdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjE2Qn0sIFt4MF0KKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyLjE2QiwgIHYyLjE2QiwgIHY0LjE2QgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjMuMTZCLCAgdjMuMTZCLCAgdjUuMTZCCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDIKKyAgLmVuZGlmCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuMTZCfSwgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My4xNkJ9LCBbeDBdLCB4MgorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKworICAgICAgICBhdmcgICAgICAgICAgICAgdjIuMTZCLCAgdjAuMTZCLCAgdjEuMTZCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMTZCfSwgW3gxXSwgeDIKKyAgICAgICAgYXZnICAgICAgICAgICAgIHYzLjE2QiwgIHYwLjE2QiwgIHYxLjE2QgorICAuaWYgXGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjE2Qn0sIFt4MF0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuMTZCfSwgW3gwXQorICAgICAgICB1cmhhZGQgICAgICAgICAgdjIuMTZCLCAgdjIuMTZCLCAgdjQuMTZCCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2My4xNkIsICB2My4xNkIsICB2NS4xNkIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MgorICAuZW5kaWYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi4xNkJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My4xNkJ9LCAgICAgW3gwXSwgeDIKKworICAgICAgICByZXQKKy5lbmRtCisKKy5tYWNybyAgcGl4ZWxzMTZfeHkyICAgIHJuZD0xLCBhdmc9MAorICAgICAgICBzdWIgICAgICAgICAgICAgdzMsICB3MywgICMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMTZCLCB2MS4xNkJ9LCBbeDFdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjE2QiwgdjUuMTZCfSwgW3gxXSwgeDIKK05STkQgICAgbW92aSAgICAgICAgICAgIHYyNi44SCwgIzEKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYxLjE2QiwgIHYwLjE2QiwgIHYxLjE2QiwgICMxCisgICAgICAgIGV4dCAgICAgICAgICAgICB2NS4xNkIsICB2NC4xNkIsICB2NS4xNkIsICAjMQorICAgICAgICB1YWRkbCAgICAgICAgICAgdjE2LjhILCAgdjAuOEIsICAgdjEuOEIKKyAgICAgICAgdWFkZGwyICAgICAgICAgIHYyMC44SCwgIHYwLjE2QiwgIHYxLjE2QgorICAgICAgICB1YWRkbCAgICAgICAgICAgdjE4LjhILCAgdjQuOEIsICAgdjUuOEIKKyAgICAgICAgdWFkZGwyICAgICAgICAgIHYyMi44SCwgIHY0LjE2QiwgIHY1LjE2QgorMTogICAgICBzdWJzICAgICAgICAgICAgdzMsICB3MywgICMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMTZCLCB2MS4xNkJ9LCBbeDFdLCB4MgorICAgICAgICBhZGQgICAgICAgICAgICAgdjI0LjhILCAgdjE2LjhILCAgdjE4LjhICitOUk5EICAgIGFkZCAgICAgICAgICAgICB2MjQuOEgsICB2MjQuOEgsICB2MjYuOEgKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYzMC4xNkIsIHYwLjE2QiwgIHYxLjE2QiwgICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MS44SCwgICB2MjAuOEgsICB2MjIuOEgKKyAgICAgICAgbXNocm4gICAgICAgICAgIHYyOC44QiwgIHYyNC44SCwgICMyCitOUk5EICAgIGFkZCAgICAgICAgICAgICB2MS44SCwgICB2MS44SCwgICB2MjYuOEgKKyAgICAgICAgbXNocm4yICAgICAgICAgIHYyOC4xNkIsIHYxLjhILCAgICMyCisgIC5pZiBcYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjE2Qn0sICAgICAgICBbeDBdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MjguMTZCLCB2MjguMTZCLCB2MTYuMTZCCisgIC5lbmRpZgorICAgICAgICB1YWRkbCAgICAgICAgICAgdjE2LjhILCAgdjAuOEIsICAgdjMwLjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuMTZCLCB2My4xNkJ9LCBbeDFdLCB4MgorICAgICAgICB1YWRkbDIgICAgICAgICAgdjIwLjhILCAgdjAuMTZCLCAgdjMwLjE2QgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyOC4xNkJ9LCAgICAgICAgW3gwXSwgeDIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyNC44SCwgIHYxNi44SCwgIHYxOC44SAorTlJORCAgICBhZGQgICAgICAgICAgICAgdjI0LjhILCAgdjI0LjhILCAgdjI2LjhICisgICAgICAgIGV4dCAgICAgICAgICAgICB2My4xNkIsICB2Mi4xNkIsICB2My4xNkIsICAjMQorICAgICAgICBhZGQgICAgICAgICAgICAgdjAuOEgsICAgdjIwLjhILCAgdjIyLjhICisgICAgICAgIG1zaHJuICAgICAgICAgICB2MzAuOEIsICB2MjQuOEgsICAjMgorTlJORCAgICBhZGQgICAgICAgICAgICAgdjAuOEgsICAgdjAuOEgsICAgdjI2LjhICisgICAgICAgIG1zaHJuMiAgICAgICAgICB2MzAuMTZCLCB2MC44SCwgICAjMgorICAuaWYgXGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3YxOC4xNkJ9LCAgICAgICAgW3gwXQorICAgICAgICB1cmhhZGQgICAgICAgICAgdjMwLjE2QiwgdjMwLjE2QiwgdjE4LjE2QgorICAuZW5kaWYKKyAgICAgICAgdWFkZGwgICAgICAgICAgIHYxOC44SCwgICB2Mi44QiwgIHYzLjhCCisgICAgICAgIHVhZGRsMiAgICAgICAgICB2MjIuOEgsICAgdjIuMTZCLCB2My4xNkIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MzAuMTZCfSwgICAgICAgIFt4MF0sIHgyCisgICAgICAgIGIuZ3QgICAgICAgICAgICAxYgorCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMTZCLCB2MS4xNkJ9LCBbeDFdLCB4MgorICAgICAgICBhZGQgICAgICAgICAgICAgdjI0LjhILCAgdjE2LjhILCAgdjE4LjhICitOUk5EICAgIGFkZCAgICAgICAgICAgICB2MjQuOEgsICB2MjQuOEgsICB2MjYuOEgKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYzMC4xNkIsIHYwLjE2QiwgIHYxLjE2QiwgICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MS44SCwgICB2MjAuOEgsICB2MjIuOEgKKyAgICAgICAgbXNocm4gICAgICAgICAgIHYyOC44QiwgIHYyNC44SCwgICMyCitOUk5EICAgIGFkZCAgICAgICAgICAgICB2MS44SCwgICB2MS44SCwgICB2MjYuOEgKKyAgICAgICAgbXNocm4yICAgICAgICAgIHYyOC4xNkIsIHYxLjhILCAgICMyCisgIC5pZiBcYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjE2Qn0sICAgICAgICBbeDBdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MjguMTZCLCB2MjguMTZCLCB2MTYuMTZCCisgIC5lbmRpZgorICAgICAgICB1YWRkbCAgICAgICAgICAgdjE2LjhILCAgdjAuOEIsICAgdjMwLjhCCisgICAgICAgIHVhZGRsMiAgICAgICAgICB2MjAuOEgsICB2MC4xNkIsICB2MzAuMTZCCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI4LjE2Qn0sICAgICAgICBbeDBdLCB4MgorICAgICAgICBhZGQgICAgICAgICAgICAgdjI0LjhILCAgdjE2LjhILCAgdjE4LjhICitOUk5EICAgIGFkZCAgICAgICAgICAgICB2MjQuOEgsICB2MjQuOEgsICB2MjYuOEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhILCAgIHYyMC44SCwgIHYyMi44SAorICAgICAgICBtc2hybiAgICAgICAgICAgdjMwLjhCLCAgdjI0LjhILCAgIzIKK05STkQgICAgYWRkICAgICAgICAgICAgIHYwLjhILCAgIHYwLjhILCAgIHYyNi44SAorICAgICAgICBtc2hybjIgICAgICAgICAgdjMwLjE2QiwgdjAuOEgsICAgIzIKKyAgLmlmIFxhdmcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguMTZCfSwgICAgICAgIFt4MF0KKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYzMC4xNkIsIHYzMC4xNkIsIHYxOC4xNkIKKyAgLmVuZGlmCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMwLjE2Qn0sICAgICAgICBbeDBdLCB4MgorCisgICAgICAgIHJldAorLmVuZG0KKworLm1hY3JvICBwaXhlbHM4ICAgICAgICAgcm5kPTEsIGF2Zz0wCisxOiAgICAgIGxkMSAgICAgICAgICAgICB7djAuOEJ9LCBbeDFdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjhCfSwgW3gxXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi44Qn0sIFt4MV0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuOEJ9LCBbeDFdLCB4MgorICAuaWYgXGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYwLjhCLCAgdjAuOEIsICB2NC44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxLjhCLCAgdjEuOEIsICB2NS44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyLjhCLCAgdjIuOEIsICB2Ni44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y3LjhCfSwgW3gwXSwgeDIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYzLjhCLCAgdjMuOEIsICB2Ny44QgorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgyLCAgbHNsICMyCisgIC5lbmRpZgorICAgICAgICBzdWJzICAgICAgICAgICAgdzMsICB3MywgICM0CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuOEJ9LCBbeDBdLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLjhCfSwgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi44Qn0sIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuOEJ9LCBbeDBdLCB4MgorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CisuZW5kbQorCisubWFjcm8gIHBpeGVsczhfeDIgICAgICBybmQ9MSwgYXZnPTAKKzE6ICAgICAgbGQxICAgICAgICAgICAgIHt2MC44QiwgdjEuOEJ9LCBbeDFdLCB4MgorICAgICAgICBleHQgICAgICAgICAgICAgdjEuOEIsICB2MC44QiwgIHYxLjhCLCAgIzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi44QiwgdjMuOEJ9LCBbeDFdLCB4MgorICAgICAgICBleHQgICAgICAgICAgICAgdjMuOEIsICB2Mi44QiwgIHYzLjhCLCAgIzEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHczLCAgdzMsICAjMgorICAgICAgICBhdmcgICAgICAgICAgICAgdjAuOEIsICAgdjAuOEIsICAgdjEuOEIKKyAgICAgICAgYXZnICAgICAgICAgICAgIHYyLjhCLCAgIHYyLjhCLCAgIHYzLjhCCisgIC5pZiBcYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS44Qn0sICAgICBbeDBdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MC44QiwgICB2MC44QiwgICB2NC44QgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjIuOEIsICAgdjIuOEIsICAgdjUuOEIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MgorICAuZW5kaWYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC44Qn0sIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuOEJ9LCBbeDBdLCB4MgorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CisuZW5kbQorCisubWFjcm8gIHBpeGVsczhfeTIgICAgICBybmQ9MSwgYXZnPTAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHczLCAgdzMsICAjMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhCfSwgIFt4MV0sIHgyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuOEJ9LCAgW3gxXSwgeDIKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHczLCAgdzMsICAjMgorICAgICAgICBhdmcgICAgICAgICAgICAgdjQuOEIsICB2MC44QiwgIHYxLjhCCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuOEJ9LCAgW3gxXSwgeDIKKyAgICAgICAgYXZnICAgICAgICAgICAgIHY1LjhCLCAgdjAuOEIsICB2MS44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjhCfSwgIFt4MV0sIHgyCisgIC5pZiBcYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My44Qn0sICAgICBbeDBdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2NC44QiwgIHY0LjhCLCAgdjIuOEIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHY1LjhCLCAgdjUuOEIsICB2My44QgorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgyCisgIC5lbmRpZgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisKKyAgICAgICAgYXZnICAgICAgICAgICAgIHY0LjhCLCAgdjAuOEIsICB2MS44QgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhCfSwgIFt4MV0sIHgyCisgICAgICAgIGF2ZyAgICAgICAgICAgICB2NS44QiwgIHYwLjhCLCAgdjEuOEIKKyAgLmlmIFxhdmcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi44Qn0sICAgICBbeDBdLCB4MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjhCfSwgICAgIFt4MF0KKyAgICAgICAgdXJoYWRkICAgICAgICAgIHY0LjhCLCAgdjQuOEIsICB2Mi44QgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjUuOEIsICB2NS44QiwgIHYzLjhCCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDIKKyAgLmVuZGlmCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS44Qn0sICAgICBbeDBdLCB4MgorCisgICAgICAgIHJldAorLmVuZG0KKworLm1hY3JvICBwaXhlbHM4X3h5MiAgICAgcm5kPTEsIGF2Zz0wCisgICAgICAgIHN1YiAgICAgICAgICAgICB3MywgIHczLCAgIzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC4xNkJ9LCAgICAgW3gxXSwgeDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS4xNkJ9LCAgICAgW3gxXSwgeDIKK05STkQgICAgbW92aSAgICAgICAgICAgIHYxOS44SCwgIzEKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHY0LjE2QiwgIHYwLjE2QiwgIHY0LjE2QiwgICMxCisgICAgICAgIGV4dCAgICAgICAgICAgICB2Ni4xNkIsICB2MS4xNkIsICB2Ni4xNkIsICAjMQorICAgICAgICB1YWRkbCAgICAgICAgICAgdjE2LjhILCAgdjAuOEIsICB2NC44QgorICAgICAgICB1YWRkbCAgICAgICAgICAgdjE3LjhILCAgdjEuOEIsICB2Ni44QgorMTogICAgICBzdWJzICAgICAgICAgICAgdzMsICB3MywgICMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMTZCfSwgICAgIFt4MV0sIHgyCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTguOEgsIHYxNi44SCwgIHYxNy44SAorICAgICAgICBleHQgICAgICAgICAgICAgdjQuMTZCLCAgdjAuMTZCLCAgdjQuMTZCLCAgIzEKK05STkQgICAgYWRkICAgICAgICAgICAgIHYxOC44SCwgdjE4LjhILCB2MTkuOEgKKyAgICAgICAgdWFkZGwgICAgICAgICAgIHYxNi44SCwgIHYwLjhCLCAgdjQuOEIKKyAgICAgICAgbXNocm4gICAgICAgICAgIHY1LjhCLCAgdjE4LjhILCAjMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjE2Qn0sICAgICBbeDFdLCB4MgorICAgICAgICBhZGQgICAgICAgICAgICAgdjE4LjhILCB2MTYuOEgsICB2MTcuOEgKKyAgLmlmIFxhdmcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny44Qn0sICAgICBbeDBdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2NS44QiwgIHY1LjhCLCAgdjcuOEIKKyAgLmVuZGlmCitOUk5EICAgIGFkZCAgICAgICAgICAgICB2MTguOEgsIHYxOC44SCwgdjE5LjhICisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuOEJ9LCAgICAgW3gwXSwgeDIKKyAgICAgICAgbXNocm4gICAgICAgICAgIHY3LjhCLCAgdjE4LjhILCAjMgorICAuaWYgXGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjhCfSwgICAgIFt4MF0KKyAgICAgICAgdXJoYWRkICAgICAgICAgIHY3LjhCLCAgdjcuOEIsICB2NS44QgorICAuZW5kaWYKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHY2LjE2QiwgIHYxLjE2QiwgIHY2LjE2QiwgICMxCisgICAgICAgIHVhZGRsICAgICAgICAgICB2MTcuOEgsICB2MS44QiwgICB2Ni44QgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y3LjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIGIuZ3QgICAgICAgICAgICAxYgorCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMTZCfSwgICAgIFt4MV0sIHgyCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTguOEgsIHYxNi44SCwgdjE3LjhICisgICAgICAgIGV4dCAgICAgICAgICAgICB2NC4xNkIsIHYwLjE2QiwgdjQuMTZCLCAgIzEKK05STkQgICAgYWRkICAgICAgICAgICAgIHYxOC44SCwgdjE4LjhILCB2MTkuOEgKKyAgICAgICAgdWFkZGwgICAgICAgICAgIHYxNi44SCwgIHYwLjhCLCB2NC44QgorICAgICAgICBtc2hybiAgICAgICAgICAgdjUuOEIsICB2MTguOEgsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTguOEgsIHYxNi44SCwgdjE3LjhICisgIC5pZiBcYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuOEJ9LCAgICAgW3gwXQorICAgICAgICB1cmhhZGQgICAgICAgICAgdjUuOEIsICB2NS44QiwgIHY3LjhCCisgIC5lbmRpZgorTlJORCAgICBhZGQgICAgICAgICAgICAgdjE4LjhILCB2MTguOEgsIHYxOS44SAorICAgICAgICBzdDEgICAgICAgICAgICAge3Y1LjhCfSwgICAgIFt4MF0sIHgyCisgICAgICAgIG1zaHJuICAgICAgICAgICB2Ny44QiwgIHYxOC44SCwgIzIKKyAgLmlmIFxhdmcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS44Qn0sICAgICBbeDBdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2Ny44QiwgIHY3LjhCLCAgdjUuOEIKKyAgLmVuZGlmCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuOEJ9LCAgICAgW3gwXSwgeDIKKworICAgICAgICByZXQKKy5lbmRtCisKKy5tYWNybyAgcGl4ZnVuYyAgICAgICAgIHBmeCwgbmFtZSwgc3VmLCBybmQ9MSwgYXZnPTAKKyAgLmlmIFxybmQKKyAgICAubWFjcm8gYXZnICByZCwgcm4sIHJtCisgICAgICAgIHVyaGFkZCAgICAgICAgICBccmQsIFxybiwgXHJtCisgICAgLmVuZG0KKyAgICAubWFjcm8gbXNocm4gcmQsIHJuLCBybQorICAgICAgICByc2hybiAgICAgICAgICAgXHJkLCBccm4sIFxybQorICAgIC5lbmRtCisgICAgLm1hY3JvIG1zaHJuMiByZCwgcm4sIHJtCisgICAgICAgIHJzaHJuMiAgICAgICAgICBccmQsIFxybiwgXHJtCisgICAgLmVuZG0KKyAgICAubWFjcm8gTlJORCBpbnNuOnZhcmFyZworICAgIC5lbmRtCisgIC5lbHNlCisgICAgLm1hY3JvIGF2ZyAgcmQsIHJuLCBybQorICAgICAgICB1aGFkZCAgICAgICAgICAgXHJkLCBccm4sIFxybQorICAgIC5lbmRtCisgICAgLm1hY3JvIG1zaHJuIHJkLCBybiwgcm0KKyAgICAgICAgc2hybiAgICAgICAgICAgIFxyZCwgXHJuLCBccm0KKyAgICAuZW5kbQorICAgIC5tYWNybyBtc2hybjIgcmQsIHJuLCBybQorICAgICAgICBzaHJuMiAgICAgICAgICAgXHJkLCBccm4sIFxybQorICAgIC5lbmRtCisgICAgLm1hY3JvIE5STkQgaW5zbjp2YXJhcmcKKyAgICAgICAgXGluc24KKyAgICAuZW5kbQorICAuZW5kaWYKK2Z1bmN0aW9uIGZmX1xwZnhcbmFtZVxzdWZcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgXG5hbWUgICAgICAgICAgIFxybmQsIFxhdmcKK2VuZGZ1bmMKKyAgICAgICAgLnB1cmdlbSAgICAgICAgIGF2ZworICAgICAgICAucHVyZ2VtICAgICAgICAgbXNocm4KKyAgICAgICAgLnB1cmdlbSAgICAgICAgIG1zaHJuMgorICAgICAgICAucHVyZ2VtICAgICAgICAgTlJORAorLmVuZG0KKworLm1hY3JvICBwaXhmdW5jMiAgICAgICAgcGZ4LCBuYW1lLCBhdmc9MAorICAgICAgICBwaXhmdW5jICAgICAgICAgXHBmeCwgXG5hbWUsICAgICAgICAgIHJuZD0xLCBhdmc9XGF2ZworICAgICAgICBwaXhmdW5jICAgICAgICAgXHBmeCwgXG5hbWUsIF9ub19ybmQsIHJuZD0wLCBhdmc9XGF2ZworLmVuZG0KKworZnVuY3Rpb24gZmZfcHV0X2gyNjRfcXBlbDE2X21jMDBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHczLCAgIzE2CitlbmRmdW5jCisKKyAgICAgICAgcGl4ZnVuYyAgICAgICAgIHB1dF8sIHBpeGVsczE2LCAgICAgYXZnPTAKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIHB1dF8sIHBpeGVsczE2X3gyLCAgYXZnPTAKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIHB1dF8sIHBpeGVsczE2X3kyLCAgYXZnPTAKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIHB1dF8sIHBpeGVsczE2X3h5MiwgYXZnPTAKKworZnVuY3Rpb24gZmZfYXZnX2gyNjRfcXBlbDE2X21jMDBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHczLCAgIzE2CitlbmRmdW5jCisKKyAgICAgICAgcGl4ZnVuYyAgICAgICAgIGF2Z18sIHBpeGVsczE2LCAgICAgYXZnPTEKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIGF2Z18sIHBpeGVsczE2X3gyLCAgYXZnPTEKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIGF2Z18sIHBpeGVsczE2X3kyLCAgYXZnPTEKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIGF2Z18sIHBpeGVsczE2X3h5MiwgYXZnPTEKKworZnVuY3Rpb24gZmZfcHV0X2gyNjRfcXBlbDhfbWMwMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgdzMsICAjOAorZW5kZnVuYworCisgICAgICAgIHBpeGZ1bmMgICAgICAgICBwdXRfLCBwaXhlbHM4LCAgICAgYXZnPTAKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIHB1dF8sIHBpeGVsczhfeDIsICBhdmc9MAorICAgICAgICBwaXhmdW5jMiAgICAgICAgcHV0XywgcGl4ZWxzOF95MiwgIGF2Zz0wCisgICAgICAgIHBpeGZ1bmMyICAgICAgICBwdXRfLCBwaXhlbHM4X3h5MiwgYXZnPTAKKworZnVuY3Rpb24gZmZfYXZnX2gyNjRfcXBlbDhfbWMwMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgdzMsICAjOAorZW5kZnVuYworCisgICAgICAgIHBpeGZ1bmMgICAgICAgICBhdmdfLCBwaXhlbHM4LCAgICAgYXZnPTEKKyAgICAgICAgcGl4ZnVuYyAgICAgICAgIGF2Z18sIHBpeGVsczhfeDIsICBhdmc9MQorICAgICAgICBwaXhmdW5jICAgICAgICAgYXZnXywgcGl4ZWxzOF95MiwgIGF2Zz0xCisgICAgICAgIHBpeGZ1bmMgICAgICAgICBhdmdfLCBwaXhlbHM4X3h5MiwgYXZnPTEKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvbWRjdF9uZW9uLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L21kY3RfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZDE5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L21kY3RfbmVvbi5TCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogQUFyY2g2NCBORU9OIG9wdGltaXNlZCBNRENUCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSmFubmUgR3J1bmF1IDxqYW5uZS1saWJhdkBqYW5uYXUubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMiCisKK2Z1bmN0aW9uIGZmX2ltZGN0X2hhbGZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMzIKKyAgICAgICAgc3RwICAgICAgICAgICAgIHgxOSwgeDIwLCBbc3BdCisgICAgICAgIHN0ciAgICAgICAgICAgICB4MzAsIFtzcCwgIzE2XQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCAjMQorICAgICAgICBsZHIgICAgICAgICAgICAgdzE0LCBbeDAsICMyOF0gICAgICAgICAgLy8gbWRjdF9iaXRzCisgICAgICAgIGxkciAgICAgICAgICAgICB4NCwgIFt4MCwgIzMyXSAgICAgICAgICAvLyB0Y29zCisgICAgICAgIGxkciAgICAgICAgICAgICB4MywgIFt4MCwgIzhdICAgICAgICAgICAvLyByZXZ0YWIKKyAgICAgICAgbHNsICAgICAgICAgICAgIHgxMiwgeDEyLCB4MTQgICAgICAgICAgIC8vIG4gID0gMSA8PCBuYml0cworICAgICAgICBsc3IgICAgICAgICAgICAgeDE0LCB4MTIsICMyICAgICAgICAgICAgLy8gbjQgPSBuID4+IDIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg3LCAgeDIsICB4MTIsICBsc2wgIzEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgIy0xNgorICAgICAgICBzdWIgICAgICAgICAgICAgeDcsICB4NywgICMxNgorCisgICAgICAgIGxkMiAgICAgICAgICAgICB7djE2LjJzLHYxNy4yc30sIFt4N10sIHgxMiAvLyBkMTY9eCxuMSBkMTc9eCxuMAorICAgICAgICBsZDIgICAgICAgICAgICAge3YwLjJzLHYxLjJzfSwgICBbeDJdLCAjMTYgLy8gZDAgPW0wLHggZDEgPW0xLHgKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHYxNy4ycywgdjE3LjJzCisgICAgICAgIGxkMiAgICAgICAgICAgICB7djIuMnMsdjMuMnN9LCAgIFt4NF0sICMxNiAvLyBkMj1jMCxjMSBkMz1zMCxzMgorICAgICAgICBmbXVsICAgICAgICAgICAgdjYuMnMsICB2MTcuMnMsIHYyLjJzCisgICAgICAgIGZtdWwgICAgICAgICAgICB2Ny4ycywgIHYwLjJzLCAgdjIuMnMKKzE6CisgICAgICAgIHN1YnMgICAgICAgICAgICB4MTQsIHgxNCwgIzIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHc2LCAgW3gzXSwgIzQKKyAgICAgICAgZm11bCAgICAgICAgICAgIHY0LjJzLCAgdjAuMnMsICB2My4ycworICAgICAgICBmbXVsICAgICAgICAgICAgdjUuMnMsICB2MTcuMnMsIHYzLjJzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2NC4ycywgIHY2LjJzLCAgdjQuMnMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHY1LjJzLCAgdjUuMnMsICB2Ny4ycworICAgICAgICB1YmZtICAgICAgICAgICAgeDgsICB4NiwgICMxNiwgIzMxCisgICAgICAgIHViZm0gICAgICAgICAgICB4NiwgIHg2LCAgIzAsICAjMTUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg4LCAgeDEsICB4OCwgIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDYsICB4MSwgIHg2LCAgbHNsICMzCisgICAgICAgIGIuZXEgICAgICAgICAgICAyZgorICAgICAgICBsZDIgICAgICAgICAgICAge3YxNi4ycyx2MTcuMnN9LCBbeDddLCB4MTIKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MC4ycyx2MS4yc30sICAgW3gyXSwgIzE2CisgICAgICAgIHJldjY0ICAgICAgICAgICB2MTcuMnMsIHYxNy4ycworICAgICAgICBsZDIgICAgICAgICAgICAge3YyLjJzLHYzLjJzfSwgICBbeDRdLCAjMTYgICAgLy8gZDI9YzAsYzEgZDM9czAsczIKKyAgICAgICAgZm11bCAgICAgICAgICAgIHY2LjJzLCAgdjE3LjJzLCB2Mi4ycworICAgICAgICBmbXVsICAgICAgICAgICAgdjcuMnMsICB2MC4ycywgIHYyLjJzCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djQucyx2NS5zfVswXSwgW3g2XQorICAgICAgICBzdDIgICAgICAgICAgICAge3Y0LnMsdjUuc31bMV0sIFt4OF0KKyAgICAgICAgYiAgICAgICAgICAgICAgIDFiCisyOgorICAgICAgICBzdDIgICAgICAgICAgICAge3Y0LnMsdjUuc31bMF0sIFt4Nl0KKyAgICAgICAgc3QyICAgICAgICAgICAgIHt2NC5zLHY1LnN9WzFdLCBbeDhdCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxOSwgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgyMCwgeDEKKyAgICAgICAgYmwgICAgICAgICAgICAgIFgoZmZfZmZ0X2NhbGNfbmVvbikKKworICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCAjMQorICAgICAgICBsZHIgICAgICAgICAgICAgdzE0LCBbeDE5LCAjMjhdICAgICAgICAgIC8vIG1kY3RfYml0cworICAgICAgICBsZHIgICAgICAgICAgICAgeDQsICBbeDE5LCAjMzJdICAgICAgICAgIC8vIHRjb3MKKyAgICAgICAgbHNsICAgICAgICAgICAgIHgxMiwgeDEyLCB4MTQgICAgICAgICAgICAvLyBuICA9IDEgPDwgbmJpdHMKKyAgICAgICAgbHNyICAgICAgICAgICAgIHgxNCwgeDEyLCAjMyAgICAgICAgICAgICAvLyBuOCA9IG4gPj4gMworCisgICAgICAgIGFkZCAgICAgICAgICAgICB4NCwgIHg0LCAgeDE0LCBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg2LCAgeDIwLCB4MTQsIGxzbCAjMworICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4NCwgICMxNgorICAgICAgICBzdWIgICAgICAgICAgICAgeDMsICB4NiwgICMxNgorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NywgICMtMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgwLCAgeDMKKworICAgICAgICBsZDIgICAgICAgICAgICAge3YwLjJzLHYxLjJzfSwgIFt4M10sIHg3IC8vIGQwID1pMSxyMSBkMSA9aTAscjAKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MjAuMnMsdjIxLjJzfSxbeDZdLCAjMTYgLy8gZDIwPWkyLHIyIGQyMT1pMyxyMworICAgICAgICBsZDIgICAgICAgICAgICAge3YxNi4ycyx2MTcuMnN9LFt4MV0sIHg3IC8vIGQxNj1jMSxjMCBkMTg9czEsczAKKzM6CisgICAgICAgIHN1YnMgICAgICAgICAgICB4MTQsIHgxNCwgIzIKKyAgICAgICAgZm11bCAgICAgICAgICAgIHY3LjJzLCAgdjAuMnMsICB2MTcuMnMKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MTguMnMsdjE5LjJzfSxbeDRdLCAjMTYgICAgLy8gZDE3PWMyLGMzIGQxOT1zMixzMworICAgICAgICBmbXVsICAgICAgICAgICAgdjQuMnMsICB2MS4ycywgIHYxNy4ycworICAgICAgICBmbXVsICAgICAgICAgICAgdjYuMnMsICB2MjEuMnMsIHYxOS4ycworICAgICAgICBmbXVsICAgICAgICAgICAgdjUuMnMsICB2MjAuMnMsIHYxOS4ycworICAgICAgICBmbXVsICAgICAgICAgICAgdjIyLjJzLCB2MS4ycywgIHYxNi4ycworICAgICAgICBmbXVsICAgICAgICAgICAgdjIzLjJzLCB2MjEuMnMsIHYxOC4ycworICAgICAgICBmbXVsICAgICAgICAgICAgdjI0LjJzLCB2MC4ycywgIHYxNi4ycworICAgICAgICBmbXVsICAgICAgICAgICAgdjI1LjJzLCB2MjAuMnMsIHYxOC4ycworICAgICAgICBmYWRkICAgICAgICAgICAgdjcuMnMsICB2Ny4ycywgIHYyMi4ycworICAgICAgICBmYWRkICAgICAgICAgICAgdjUuMnMsICB2NS4ycywgIHYyMy4ycworICAgICAgICBmc3ViICAgICAgICAgICAgdjQuMnMsICB2NC4ycywgIHYyNC4ycworICAgICAgICBmc3ViICAgICAgICAgICAgdjYuMnMsICB2Ni4ycywgIHYyNS4ycworICAgICAgICBiLmVxICAgICAgICAgICAgNGYKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MC4ycyx2MS4yc30sICBbeDNdLCB4NworICAgICAgICBsZDIgICAgICAgICAgICAge3YyMC4ycyx2MjEuMnN9LFt4Nl0sICMxNgorICAgICAgICBsZDIgICAgICAgICAgICAge3YxNi4ycyx2MTcuMnN9LFt4MV0sIHg3IC8vIGQxNj1jMSxjMCBkMTg9czEsczAKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY1LjJzLCAgdjUuMnMKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY3LjJzLCAgdjcuMnMKKyAgICAgICAgc3QyICAgICAgICAgICAgIHt2NC4ycyx2NS4yc30sICBbeDBdLCB4NworICAgICAgICBzdDIgICAgICAgICAgICAge3Y2LjJzLHY3LjJzfSwgIFt4OF0sICMxNgorICAgICAgICBiICAgICAgICAgICAgICAgM2IKKzQ6CisgICAgICAgIHJldjY0ICAgICAgICAgICB2NS4ycywgIHY1LjJzCisgICAgICAgIHJldjY0ICAgICAgICAgICB2Ny4ycywgIHY3LjJzCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djQuMnMsdjUuMnN9LCAgW3gwXQorICAgICAgICBzdDIgICAgICAgICAgICAge3Y2LjJzLHY3LjJzfSwgIFt4OF0KKworICAgICAgICBsZHAgICAgICAgICAgICAgeDE5LCB4MjAsIFtzcF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHgzMCwgW3NwLCAjMTZdCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzMyCisKKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2ltZGN0X2NhbGNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMzIKKyAgICAgICAgc3RwICAgICAgICAgICAgIHgxOSwgeDIwLCBbc3BdCisgICAgICAgIHN0ciAgICAgICAgICAgICB4MzAsIFtzcCwgIzE2XQorICAgICAgICBsZHIgICAgICAgICAgICAgdzMsICBbeDAsICMyOF0gICAgICAgICAgLy8gbWRjdF9iaXRzCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTksICMxCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MjAsIHgxCisgICAgICAgIGxzbCAgICAgICAgICAgICB4MTksIHgxOSwgeDMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICB4MTkKKworICAgICAgICBibCAgICAgICAgICAgICAgWChmZl9pbWRjdF9oYWxmX25lb24pCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDIwLCB4MTksICBsc2wgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDIwLCB4MTksICBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICAjOAorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MSwgICMxNgorICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICAjLTE2CisgICAgICAgIG1vdiAgICAgICAgICAgICB4NiwgICMtOAorMToKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40c30sIFt4Ml0sIHgzCisgICAgICAgIHByZnVtICAgICAgICAgICBwbGRsMWtlZXAsIFt4MCwgIy0xNl0KKyAgICAgICAgcmV2NjQgICAgICAgICAgIHYwLjRzLCB2MC40cworICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjJzLHYzLjJzfSwgW3gxXSwgIzE2CisgICAgICAgIGZuZWcgICAgICAgICAgICB2NC40cywgIHYwLjRzCisgICAgICAgIHByZnVtICAgICAgICAgICBwbGRsMWtlZXAsIFt4MiwgIy0xNl0KKyAgICAgICAgcmV2NjQgICAgICAgICAgIHYyLjJzLCB2Mi4ycworICAgICAgICByZXY2NCAgICAgICAgICAgdjMuMnMsIHYzLjJzCisgICAgICAgIGV4dCAgICAgICAgICAgICB2NC4xNmIsIHY0LjE2YiwgdjQuMTZiLCAjOAorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjJzfSwgW3gwXSwgeDYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My4yc30sIFt4MF0sIHg2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNHN9LCBbeDIwXSwgIzE2CisgICAgICAgIHN1YnMgICAgICAgICAgICB4MTksIHgxOSwgICMxNgorICAgICAgICBiLmd0ICAgICAgICAgICAgMWIKKworICAgICAgICBsZHAgICAgICAgICAgICAgeDE5LCB4MjAsIFtzcF0sICMxNgorICAgICAgICBsZHIgICAgICAgICAgICAgeDMwLCBbc3BdLCAjMTYKKworICAgICAgICByZXQKK2VuZGZ1bmMKKworCitmdW5jdGlvbiBmZl9tZGN0X2NhbGNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMzIKKyAgICAgICAgc3RwICAgICAgICAgICAgIHgxOSwgeDIwLCBbc3BdCisgICAgICAgIHN0ciAgICAgICAgICAgICB4MzAsIFtzcCwgIzE2XQorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTIsICMxCisgICAgICAgIGxkciAgICAgICAgICAgICB3MTQsIFt4MCwgIzI4XSAgICAgICAgICAvLyBtZGN0X2JpdHMKKyAgICAgICAgbGRyICAgICAgICAgICAgIHg0LCAgW3gwLCAjMzJdICAgICAgICAgIC8vIHRjb3MKKyAgICAgICAgbGRyICAgICAgICAgICAgIHgzLCAgW3gwLCAjOF0gICAgICAgICAgIC8vIHJldnRhYgorICAgICAgICBsc2wgICAgICAgICAgICAgeDE0LCB4MTIsIHgxNCAgICAgICAgICAgLy8gbiAgPSAxIDw8IG5iaXRzCisgICAgICAgIGFkZCAgICAgICAgICAgICB4NywgIHgyLCAgeDE0ICAgICAgICAgICAvLyBpbjR1CisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHg3LCAgIzE2ICAgICAgICAgICAvLyBpbjRkCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHg3LCAgeDE0LCBsc2wgIzEgICAvLyBpbjN1CisgICAgICAgIGFkZCAgICAgICAgICAgICB4OCwgIHg5LCAgeDE0LCBsc2wgIzEgICAvLyBpbjNkCisgICAgICAgIGFkZCAgICAgICAgICAgICB4NSwgIHg0LCAgeDE0LCBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg1LCAgeDUsICAjMTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgzLCAgeDMsICAjNAorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCAjLTE2CisgICAgICAgIGxzciAgICAgICAgICAgICB4MTMsIHgxNCwgIzEKKworICAgICAgICBsZDIgICAgICAgICAgICAge3YxNi4ycyx2MTcuMnN9LCBbeDldLCB4MTIgIC8vIGluMHUwLGluMHUxIGluNGQxLGluNGQwCisgICAgICAgIGxkMiAgICAgICAgICAgICB7djE4LjJzLHYxOS4yc30sIFt4OF0sIHgxMiAgLy8gaW4ydTAsaW4ydTEgaW4zZDEsaW4zZDAKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MC4ycywgdjEuMnN9LCAgW3g3XSwgIzE2ICAvLyBpbjR1MCxpbjR1MSBpbjJkMSxpbjJkMAorICAgICAgICByZXY2NCAgICAgICAgICAgdjE3LjJzLCB2MTcuMnMgICAgICAgICAgICAgIC8vIGluNGQwLGluNGQxIGluM2QwLGluM2QxCisgICAgICAgIHJldjY0ICAgICAgICAgICB2MTkuMnMsIHYxOS4ycyAgICAgICAgICAgICAgLy8gaW40ZDAsaW40ZDEgaW4zZDAsaW4zZDEKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2Mi4ycywgdjMuMnN9LCAgW3gyXSwgIzE2ICAvLyBpbjN1MCxpbjN1MSBpbjFkMSxpbjFkMAorICAgICAgICBmc3ViICAgICAgICAgICAgdjAuMnMsICB2MTcuMnMsIHYwLjJzICAgICAgIC8vIGluNGQtaW40dSAgICAgIEkKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MjAuMnMsdjIxLjJzfSwgW3g0XSwgIzE2ICAvLyBjMCxjMSBzMCxzMQorICAgICAgICByZXY2NCAgICAgICAgICAgdjEuMnMsICB2MS4ycyAgICAgICAgICAgICAgIC8vIGluMmQwLGluMmQxIGluMWQwLGluMWQxCisgICAgICAgIHJldjY0ICAgICAgICAgICB2My4ycywgIHYzLjJzICAgICAgICAgICAgICAgLy8gaW4yZDAsaW4yZDEgaW4xZDAsaW4xZDEKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MzAuMnMsdjMxLjJzfSwgW3g1XSwgeDEyICAvLyBjMixjMyBzMixzMworICAgICAgICBmYWRkICAgICAgICAgICAgdjIuMnMsICB2Mi4ycywgIHYxOS4ycyAgICAgIC8vIGluM3UraW4zZCAgICAgLVIKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYxNi4ycywgdjE2LjJzLCB2MS4ycyAgICAgICAvLyBpbjB1LWluMmQgICAgICBSCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MTguMnMsIHYxOC4ycywgdjMuMnMgICAgICAgLy8gaW4ydStpbjFkICAgICAtSQorMToKKyAgICAgICAgZm11bCAgICAgICAgICAgIHY3LjJzLCAgdjAuMnMsICB2MjEuMnMgICAgICAvLyAgSSpzCisgICAgICAgIGxkciAgICAgICAgICAgICB3MTAsIFt4MywgeDEzXQorICAgICAgICBmbXVsICAgICAgICAgICAgdjYuMnMsICB2Mi4ycywgIHYyMC4ycyAgICAgIC8vIC1SKmMKKyAgICAgICAgbGRyICAgICAgICAgICAgIHc2LCAgW3gzLCAjNF0hCisgICAgICAgIGZtdWwgICAgICAgICAgICB2NC4ycywgIHYyLjJzLCAgdjIxLjJzICAgICAgLy8gLVIqcworICAgICAgICBmbXVsICAgICAgICAgICAgdjUuMnMsICB2MC4ycywgIHYyMC4ycyAgICAgIC8vICBJKmMKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYyNC4ycywgdjE2LjJzLCB2MzAuMnMgICAgICAvLyAgUipjCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjUuMnMsIHYxOC4ycywgdjMxLjJzICAgICAgLy8gLUkqcworICAgICAgICBmbXVsICAgICAgICAgICAgdjIyLjJzLCB2MTYuMnMsIHYzMS4ycyAgICAgIC8vICBSKnMKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYyMy4ycywgdjE4LjJzLCB2MzAuMnMgICAgICAvLyAgSSpjCisgICAgICAgIHN1YnMgICAgICAgICAgICB4MTQsIHgxNCwgIzE2CisgICAgICAgIHN1YnMgICAgICAgICAgICB4MTMsIHgxMywgIzgKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHY2LjJzLCAgdjYuMnMsICB2Ny4ycyAgICAgICAvLyAtUipjLUkqcworICAgICAgICBmYWRkICAgICAgICAgICAgdjcuMnMsICB2NC4ycywgIHY1LjJzICAgICAgIC8vIC1SKnMrSSpjCisgICAgICAgIGZzdWIgICAgICAgICAgICB2MjQuMnMsIHYyNS4ycywgdjI0LjJzICAgICAgLy8gSSpzLVIqYworICAgICAgICBmYWRkICAgICAgICAgICAgdjI1LjJzLCB2MjIuMnMsIHYyMy4ycyAgICAgIC8vIFIqcy1JKmMKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDFmCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTIsICMtMTYKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MTYuMnMsdjE3LjJzfSwgW3g5XSwgeDEyICAvLyBpbjB1MCxpbjB1MSBpbjRkMSxpbjRkMAorICAgICAgICBsZDIgICAgICAgICAgICAge3YxOC4ycyx2MTkuMnN9LCBbeDhdLCB4MTIgIC8vIGluMnUwLGluMnUxIGluM2QxLGluM2QwCisgICAgICAgIGZuZWcgICAgICAgICAgICB2Ny4ycywgIHY3LjJzICAgICAgICAgICAgICAgLy8gIFIqcy1JKmMKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MC4ycywgdjEuMnN9LCAgW3g3XSwgIzE2ICAvLyBpbjR1MCxpbjR1MSBpbjJkMSxpbjJkMAorICAgICAgICByZXY2NCAgICAgICAgICAgdjE3LjJzLCB2MTcuMnMgICAgICAgICAgICAgIC8vIGluNGQwLGluNGQxIGluM2QwLGluM2QxCisgICAgICAgIHJldjY0ICAgICAgICAgICB2MTkuMnMsIHYxOS4ycyAgICAgICAgICAgICAgLy8gaW40ZDAsaW40ZDEgaW4zZDAsaW4zZDEKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2Mi4ycywgdjMuMnN9LCAgW3gyXSwgIzE2ICAvLyBpbjN1MCxpbjN1MSBpbjFkMSxpbjFkMAorICAgICAgICBmc3ViICAgICAgICAgICAgdjAuMnMsICB2MTcuMnMsIHYwLjJzICAgICAgIC8vIGluNGQtaW40dSAgICAgIEkKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MjAuMnMsdjIxLjJzfSwgW3g0XSwgIzE2ICAvLyBjMCxjMSBzMCxzMQorICAgICAgICByZXY2NCAgICAgICAgICAgdjEuMnMsICB2MS4ycyAgICAgICAgICAgICAgIC8vIGluMmQwLGluMmQxIGluMWQwLGluMWQxCisgICAgICAgIHJldjY0ICAgICAgICAgICB2My4ycywgIHYzLjJzICAgICAgICAgICAgICAgLy8gaW4yZDAsaW4yZDEgaW4xZDAsaW4xZDEKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MzAuMnMsdjMxLjJzfSwgW3g1XSwgeDEyICAvLyBjMixjMyBzMixzMworICAgICAgICBmYWRkICAgICAgICAgICAgdjIuMnMsICB2Mi4ycywgIHYxOS4ycyAgICAgIC8vIGluM3UraW4zZCAgICAgLVIKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYxNi4ycywgdjE2LjJzLCB2MS4ycyAgICAgICAvLyBpbjB1LWluMmQgICAgICBSCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MTguMnMsIHYxOC4ycywgdjMuMnMgICAgICAgLy8gaW4ydStpbjFkICAgICAtSQorICAgICAgICB1YmZtICAgICAgICAgICAgeDEyLCB4NiwgICMxNiwgIzMxCisgICAgICAgIHViZm0gICAgICAgICAgICB4NiwgIHg2LCAgIzAsICAjMTUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxMiwgeDEsICB4MTIsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDYsICB4MSwgIHg2LCAgbHNsICMzCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djYucyx2Ny5zfVswXSwgICBbeDZdCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djYucyx2Ny5zfVsxXSwgICBbeDEyXQorICAgICAgICB1YmZtICAgICAgICAgICAgeDYsICB4MTAsICMxNiwgIzMxCisgICAgICAgIHViZm0gICAgICAgICAgICB4MTAsIHgxMCwgIzAsICAjMTUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg2ICwgeDEsICB4NiwgIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDEwLCB4MSwgIHgxMCwgbHNsICMzCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djI0LnMsdjI1LnN9WzBdLCBbeDEwXQorICAgICAgICBzdDIgICAgICAgICAgICAge3YyNC5zLHYyNS5zfVsxXSwgW3g2XQorICAgICAgICBiICAgICAgICAgICAgICAgMWIKKzE6CisgICAgICAgIGZuZWcgICAgICAgICAgICB2Ny4ycywgIHY3LjJzICAgICAgICAgICAvLyAgUipzLUkqYworICAgICAgICB1YmZtICAgICAgICAgICAgeDEyLCB4NiwgICMxNiwgIzMxCisgICAgICAgIHViZm0gICAgICAgICAgICB4NiwgIHg2LCAgIzAsICAjMTUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxMiwgeDEsICB4MTIsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDYsICB4MSwgIHg2LCAgbHNsICMzCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djYucyx2Ny5zfVswXSwgICBbeDZdCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djYucyx2Ny5zfVsxXSwgICBbeDEyXQorICAgICAgICB1YmZtICAgICAgICAgICAgeDYsICB4MTAsICMxNiwgIzMxCisgICAgICAgIHViZm0gICAgICAgICAgICB4MTAsIHgxMCwgIzAsICAjMTUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg2ICwgeDEsICB4NiwgIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDEwLCB4MSwgIHgxMCwgbHNsICMzCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djI0LnMsdjI1LnN9WzBdLCBbeDEwXQorICAgICAgICBzdDIgICAgICAgICAgICAge3YyNC5zLHYyNS5zfVsxXSwgW3g2XQorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTksIHgwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MjAsIHgxCisgICAgICAgIGJsICAgICAgICAgICAgICBYKGZmX2ZmdF9jYWxjX25lb24pCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgIzEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHcxNCwgW3gxOSwgIzI4XSAgICAgICAgIC8vIG1kY3RfYml0cworICAgICAgICBsZHIgICAgICAgICAgICAgeDQsICBbeDE5LCAjMzJdICAgICAgICAgLy8gdGNvcworICAgICAgICBsc2wgICAgICAgICAgICAgeDEyLCB4MTIsIHgxNCAgICAgICAgICAgLy8gbiAgPSAxIDw8IG5iaXRzCisgICAgICAgIGxzciAgICAgICAgICAgICB4MTQsIHgxMiwgIzMgICAgICAgICAgICAvLyBuOCA9IG4gPj4gMworCisgICAgICAgIGFkZCAgICAgICAgICAgICB4NCwgIHg0LCAgeDE0LCBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg2LCAgeDIwLCB4MTQsIGxzbCAjMworICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4NCwgICMxNgorICAgICAgICBzdWIgICAgICAgICAgICAgeDMsICB4NiwgICMxNgorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NywgICMtMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgwLCAgeDMKKworICAgICAgICBsZDIgICAgICAgICAgICAge3YwLjJzLHYxLjJzfSwgICBbeDNdLCB4NyAgIC8vIGQwID1yMSxpMSBkMSA9cjAsaTAKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MjAuMnMsdjIxLjJzfSwgW3g2XSwgIzE2ICAvLyBkMjA9cjIsaTIgZDIxPXIzLGkzCisgICAgICAgIGxkMiAgICAgICAgICAgICB7djE2LjJzLHYxNy4yc30sIFt4MV0sIHg3ICAgLy8gYzEsYzAgczEsczAKKzE6CisgICAgICAgIHN1YnMgICAgICAgICAgICB4MTQsIHgxNCwgIzIKKyAgICAgICAgZm11bCAgICAgICAgICAgIHY3LjJzLCAgdjAuMnMsICB2MTcuMnMgICAgICAvLyByMSpzMSxyMCpzMAorICAgICAgICBsZDIgICAgICAgICAgICAge3YxOC4ycyx2MTkuMnN9LCBbeDRdLCAjMTYgIC8vIGMyLGMzIHMyLHMzCisgICAgICAgIGZtdWwgICAgICAgICAgICB2NC4ycywgIHYxLjJzLCAgdjE3LjJzICAgICAgLy8gaTEqczEsaTAqczAKKyAgICAgICAgZm11bCAgICAgICAgICAgIHY2LjJzLCAgdjIxLjJzLCB2MTkuMnMgICAgICAvLyBpMipzMixpMypzMworICAgICAgICBmbXVsICAgICAgICAgICAgdjUuMnMsICB2MjAuMnMsIHYxOS4ycyAgICAgIC8vIHIyKnMyLHIzKnMzCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjQuMnMsIHYwLjJzLCAgdjE2LjJzICAgICAgLy8gcjEqYzEscjAqYzAKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYyNS4ycywgdjIwLjJzLCB2MTguMnMgICAgICAvLyByMipjMixyMypjMworICAgICAgICBmbXVsICAgICAgICAgICAgdjIyLjJzLCB2MjEuMnMsIHYxOC4ycyAgICAgIC8vIGkyKmMyLGkzKmMzCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjMuMnMsIHYxLjJzLCAgdjE2LjJzICAgICAgLy8gaTEqYzEsaTAqYzAKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHY0LjJzLCAgdjQuMnMsICB2MjQuMnMgICAgICAvLyBpMSpzMStyMSpjMSxpMCpzMCtyMCpjMAorICAgICAgICBmYWRkICAgICAgICAgICAgdjYuMnMsICB2Ni4ycywgIHYyNS4ycyAgICAgIC8vIGkyKnMyK3IyKmMyLGkzKnMzK3IzKmMzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2NS4ycywgIHYyMi4ycywgdjUuMnMgICAgICAgLy8gaTIqYzItcjIqczIsaTMqYzMtcjMqczMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHY3LjJzLCAgdjIzLjJzLCB2Ny4ycyAgICAgICAvLyBpMSpjMS1yMSpzMSxpMCpjMC1yMCpzMAorICAgICAgICBmbmVnICAgICAgICAgICAgdjQuMnMsICB2NC4ycworICAgICAgICBmbmVnICAgICAgICAgICAgdjYuMnMsICB2Ni4ycworICAgICAgICBiLmVxICAgICAgICAgICAgMWYKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MC4ycywgdjEuMnN9LCAgW3gzXSwgeDcKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MjAuMnMsdjIxLjJzfSwgW3g2XSwgIzE2CisgICAgICAgIGxkMiAgICAgICAgICAgICB7djE2LjJzLHYxNy4yc30sIFt4MV0sIHg3ICAgLy8gYzEsYzAgczEsczAKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY1LjJzLCAgdjUuMnMKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY3LjJzLCAgdjcuMnMKKyAgICAgICAgc3QyICAgICAgICAgICAgIHt2NC4ycyx2NS4yc30sICBbeDBdLCB4NworICAgICAgICBzdDIgICAgICAgICAgICAge3Y2LjJzLHY3LjJzfSwgIFt4OF0sICMxNgorICAgICAgICBiICAgICAgICAgICAgICAgMWIKKzE6CisgICAgICAgIHJldjY0ICAgICAgICAgICB2NS4ycywgIHY1LjJzCisgICAgICAgIHJldjY0ICAgICAgICAgICB2Ny4ycywgIHY3LjJzCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djQuMnMsdjUuMnN9LCAgW3gwXQorICAgICAgICBzdDIgICAgICAgICAgICAge3Y2LjJzLHY3LjJzfSwgIFt4OF0KKworICAgICAgICBsZHAgICAgICAgICAgICAgeDE5LCB4MjAsIFtzcF0sICMxNgorICAgICAgICBsZHIgICAgICAgICAgICAgeDMwLCBbc3BdLCAjMTYKKyAgICAgICAgcmV0CitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L21wZWdhdWRpb2RzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L21wZWdhdWRpb2RzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0NTE0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvbXBlZ2F1ZGlvZHNwX2luaXQuYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVnYXVkaW9kc3AuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKwordm9pZCBmZl9tcGFkc3BfYXBwbHlfd2luZG93X2ZpeGVkX25lb24oaW50MzJfdCAqc3ludGhfYnVmLCBpbnQzMl90ICp3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpdGhlciwgaW50MTZfdCAqc2FtcGxlcywgaW50IGluY3IpOwordm9pZCBmZl9tcGFkc3BfYXBwbHlfd2luZG93X2Zsb2F0X25lb24oZmxvYXQgKnN5bnRoX2J1ZiwgZmxvYXQgKndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyLCBmbG9hdCAqc2FtcGxlcywgaW50IGluY3IpOworCithdl9jb2xkIHZvaWQgZmZfbXBhZHNwX2luaXRfYWFyY2g2NChNUEFEU1BDb250ZXh0ICpzKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+YXBwbHlfd2luZG93X2ZpeGVkID0gZmZfbXBhZHNwX2FwcGx5X3dpbmRvd19maXhlZF9uZW9uOworICAgICAgICBzLT5hcHBseV93aW5kb3dfZmxvYXQgPSBmZl9tcGFkc3BfYXBwbHlfd2luZG93X2Zsb2F0X25lb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9tcGVnYXVkaW9kc3BfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9tcGVnYXVkaW9kc3BfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2ZjODQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L21wZWdhdWRpb2RzcF9uZW9uLlMKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSmFubmUgR3J1bmF1IDxqYW5uZS1saWJhdkBqYW5uYXUubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMiCisKKyNkZWZpbmUgRlJBQ19CSVRTICAgMjMgICAvLyBmcmFjdGlvbmFsIGJpdHMgZm9yIHNiX3NhbXBsZXMgYW5kIGRjdAorI2RlZmluZSBXRlJBQ19CSVRTICAxNiAgIC8vIGZyYWN0aW9uYWwgYml0cyBmb3Igd2luZG93CisjZGVmaW5lIE9VVF9TSElGVCAoV0ZSQUNfQklUUyArIEZSQUNfQklUUyAtIDE1KQorCitjb25zdCAgIHRibF9yZXYxMjgucywgYWxpZ249NAorICAgICAgICAuYnl0ZSAgICAgICAgICAgMTIsIDEzLCAxNCwgMTUKKyAgICAgICAgLmJ5dGUgICAgICAgICAgICA4LCAgOSwgMTAsIDExCisgICAgICAgIC5ieXRlICAgICAgICAgICAgNCwgIDUsICA2LCAgNworICAgICAgICAuYnl0ZSAgICAgICAgICAgIDAsICAxLCAgMiwgIDMKK2VuZGNvbnN0CisKKy5tYWNybyAgIGFwcGx5X3dpbmRvdyAgIHR5cGUsIHN0CitmdW5jdGlvbiBmZl9tcGFkc3BfYXBwbHlfd2luZG93X1x0eXBlXCgpX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NywgIHgwCisgICAgICAgIHN4dHcgICAgICAgICAgICB4NCwgIHc0ICAvLyBpbmNyCisgICAgICAgIGFkZCAgICAgICAgICAgICB4OCwgIHgwLCAgIzUxMjw8MgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRzLHYxLjRzLHYyLjRzLHYzLjRzfSwgIFt4N10sICAjNjQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40cyx2NS40cyx2Ni40cyx2Ny40c30sICBbeDddLCAgIzY0CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuNHMsdjEuNHMsdjIuNHMsdjMuNHN9LCAgW3g4XSwgICM2NAorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjRzLHY1LjRzLHY2LjRzLHY3LjRzfSwgIFt4OF0sICAjNjQKKyAgICAgICAgbW92cmVsICAgICAgICAgIHgxNSwgdGJsX3JldjEyOC5zCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI3LjRzfSwgW3gxNV0KKy5pZmMgXHR5cGUsIGZpeGVkCisgICAgICAgIGxzbCAgICAgICAgICAgICB4NCwgIHg0LCAgIzEKKy5lbHNlCisgICAgICAgIGxzbCAgICAgICAgICAgICB4NCwgIHg0LCAgIzIKKy5lbmRpZgorICAgICAgICBhZGQgICAgICAgICAgICAgeDEwLCB4MCwgICM0NTw8MgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICMxNjw8MgorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MSwgICMxNjw8MgorICAgICAgICBhZGQgICAgICAgICAgICAgeDUsICB4MywgIHg0LCAgbHNsICM1CisgICAgICAgIHN1YiAgICAgICAgICAgICB4NSwgIHg1LCAgeDQgICAgICAgICAgICAvLyBzYW1wbGVzMgorICAgICAgICBuZWcgICAgICAgICAgICAgeDEzLCB4NCAgICAgICAgICAgICAgICAgLy8gLWluY3IKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgIzY0PDwyCisuaWZjIFx0eXBlLCBmaXhlZAorICAgICAgICBsZDFyICAgICAgICAgICAge3YxNi4yc30sIFt4Ml0gICAgICAgICAgLy8gZGl0aGVyX3N0YXRlCisgICAgICAgIHN4dGwgICAgICAgICAgICB2MTYuMmQsIHYxNi4ycworICAgICAgICBtb3ZpICAgICAgICAgICAgdjI5LjJkLCAjMAorICAgICAgICBtb3ZpICAgICAgICAgICAgdjMwLjJkLCAjKDE8PE9VVF9TSElGVCktMQorICAgICAgICB0cm4xICAgICAgICAgICAgdjMxLjJkLCB2MjkuMmQsIHYzMC4yZAorICAgICAgICB0cm4yICAgICAgICAgICAgdjMwLjJkLCB2MzAuMmQsIHYyOS4yZAorICAgICAgICB0cm4xICAgICAgICAgICAgdjE2LjJkLCB2MTYuMmQsIHYyOS4yZAorLmVsc2UKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYxNi40cywgIzAKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYyOC40cywgIzAKKy5lbmRpZgorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCAjNAorMToKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg3LCAgeDEsICAjMzw8MgorICAgICAgICBzdWIgICAgICAgICAgICAgeDYsICB4MSwgIHgxNCwgbHNsICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4NywgIHg3LCAgeDE0LCBsc2wgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxMSwgeDYsICMoMzIpPDwyICAgICAgLy8gdyAgKyAzMgorICAgICAgICBhZGQgICAgICAgICAgICAgeDEyLCB4NywgIygzMik8PDIgICAgICAvLyB3MiArIDMyCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTUsICM4CisgICAgICAgIG1vdmkgICAgICAgICAgICB2MTcuMmQsICMwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MTguMmQsICMwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MTkuMmQsICMwCisyOgorICAgICAgICBzdWJzICAgICAgICAgICAgeDE1LCB4MTUsICMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHN9LCAgW3g4XSwgIHg5CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNHN9LCAgW3gxMF0sIHg5CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNHN9LCAgW3g2XSwgIHg5CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuNHN9LCAgW3g3XSwgIHg5CisgICAgICAgIHRibCAgICAgICAgICAgICB2Ni4xNmIsIHt2MC4xNmJ9LCB2MjcuMTZiCisgICAgICAgIHRibCAgICAgICAgICAgICB2Ny4xNmIsIHt2MS4xNmJ9LCB2MjcuMTZiCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHN9LCAgW3gxMV0sIHg5CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuNHN9LCAgW3gxMl0sIHg5CisgICAgICAgIE1MQSAgICAgICAgICAgICB2MTYsIHYyLCB2MAorICAgICAgICBNTEEyICAgICAgICAgICAgdjE3LCB2MiwgdjAKKyAgICAgICAgTUxTICAgICAgICAgICAgIHYxOCwgdjMsIHY2CisgICAgICAgIE1MUzIgICAgICAgICAgICB2MTksIHYzLCB2NgorICAgICAgICBNTFMgICAgICAgICAgICAgdjE2LCB2NCwgdjcKKyAgICAgICAgTUxTMiAgICAgICAgICAgIHYxNywgdjQsIHY3CisgICAgICAgIE1MUyAgICAgICAgICAgICB2MTgsIHY1LCB2MQorICAgICAgICBNTFMyICAgICAgICAgICAgdjE5LCB2NSwgdjEKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDJiCisKKyAgICAgICAgY21wICAgICAgICAgICAgIHgxNCwgIzQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxMCwgeDEwLCAjNjQ8PDUgICAgICAgIC8vIDY0ICogOCAqIHNpemVvZihpbnQzMl90KQorCisuaWZjIFx0eXBlLCBmaXhlZAorICAgICAgICBhbmQgICAgICAgICAgICAgdjI4LjE2YiwgdjE2LjE2YiwgdjMwLjE2YgorICAgICAgICBleHQgICAgICAgICAgICAgdjI4LjE2YiwgdjI5LjE2YiwgdjI4LjE2YiwgIzgKKworICAgICAgICBiLmVxICAgICAgICAgICAgNGYKKyAgICAgICAgcm91bmRfc2FtcGxlICAgIHYxOSwgMSwgMQorNDoKKyAgICAgICAgcm91bmRfc2FtcGxlICAgIHYxNiwgMSwgMAorICAgICAgICBzaHJuICAgICAgICAgICAgdjE2LjJzLCB2MTYuMmQsICAjT1VUX1NISUZUCisgICAgICAgIHJvdW5kX3NhbXBsZSAgICB2MTksIDAsIDAKKyAgICAgICAgc2hybiAgICAgICAgICAgIHYxOS4ycywgdjE5LjJkLCAgI09VVF9TSElGVAorICAgICAgICByb3VuZF9zYW1wbGUgICAgdjE3LCAwLCAxCisgICAgICAgIHJvdW5kX3NhbXBsZSAgICB2MTgsIDEsIDEKKyAgICAgICAgcm91bmRfc2FtcGxlICAgIHYxNywgMSwgMAorICAgICAgICBzaHJuMiAgICAgICAgICAgdjE2LjRzLCB2MTcuMmQsICAjT1VUX1NISUZUCisgICAgICAgIHJvdW5kX3NhbXBsZSAgICB2MTgsIDAsIDAKKyAgICAgICAgc2hybjIgICAgICAgICAgIHYxOS40cywgdjE4LjJkLCAgI09VVF9TSElGVAorICAgICAgICBzcXh0biAgICAgICAgICAgdjE2LjRoLCB2MTYuNHMKKyAgICAgICAgc3F4dG4gICAgICAgICAgIHYxOC40aCwgdjE5LjRzCisuZWxzZQorICAgICAgICBleHQgICAgICAgICAgICAgdjE4LjE2YiwgdjE4LjE2YiwgdjE4LjE2YiwgIzgKKy5lbmRpZgorCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LlxzdFwoKX1bMF0sIFt4M10sIHg0CisgICAgICAgIGIuZXEgICAgICAgICAgICA0ZgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxOC5cc3RcKCl9WzFdLCBbeDVdLCB4MTMKKzQ6CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LlxzdFwoKX1bMV0sIFt4M10sIHg0CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE4LlxzdFwoKX1bMF0sIFt4NV0sIHgxMworICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi5cc3RcKCl9WzJdLCBbeDNdLCB4NAorICAgICAgICBzdDEgICAgICAgICAgICAge3YxOC5cc3RcKCl9WzNdLCBbeDVdLCB4MTMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuXHN0XCgpfVszXSwgW3gzXSwgeDQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguXHN0XCgpfVsyXSwgW3g1XSwgeDEzCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYxNi4xNmIsIHYyOC4xNmIKKworICAgICAgICBzdWJzICAgICAgICAgICAgeDE0LCB4MTQsICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzQ8PDIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxMCwgeDEwLCAjNDw8MgorICAgICAgICBiLmd0ICAgICAgICAgICAgMWIKKworLy8gY29tdXRpbmcgc2FtcGxlc1sxNl0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHg2LCAgeDEsICAjMzI8PDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC4yc30sICBbeDZdLCAgeDkKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS4yc30sICBbeDBdLCAgeDkKKy5yZXB0ICAgMworICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjJzfSwgIFt4Nl0sICB4OQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjJzfSwgIFt4MF0sICB4OQorICAgICAgICBNTFMgICAgICAgICAgICAgdjE2LCB2MCwgIHYxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMnN9LCAgW3g2XSwgIHg5CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuMnN9LCAgW3gwXSwgIHg5CisgICAgICAgIE1MUyAgICAgICAgICAgICB2MTYsIHYyLCAgdjMKKy5lbmRyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuMnN9LCAgW3g2XSwgIHg5CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuMnN9LCAgW3gwXSwgIHg5CisgICAgICAgIE1MUyAgICAgICAgICAgICB2MTYsIHYwLCAgdjEKKyAgICAgICAgTUxTICAgICAgICAgICAgIHYxNiwgdjIsICB2MworCisuaWZjIFx0eXBlLCBmaXhlZAorICAgICAgICBhbmQgICAgICAgICAgICAgdjI4LjE2YiwgdjE2LjE2YiwgdjMwLjE2YgorICAgICAgICBzaHJuICAgICAgICAgICAgdjIwLjJzLCAgdjE2LjJkLCAgI09VVF9TSElGVAorICAgICAgICB4dG4gICAgICAgICAgICAgdjI4LjJzLCAgdjI4LjJkCisgICAgICAgIHNxeHRuICAgICAgICAgICB2MjAuNGgsICB2MjAuNHMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mjguc31bMF0sIFt4Ml0gICAgICAgIC8vIHNhdmUgZGl0aGVyX3N0YXRlCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIwLmh9WzBdLCBbeDNdCisuZWxzZQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi5zfVswXSwgW3gzXQorLmVuZGlmCisKKyAgICAgICAgcmV0CitlbmRmdW5jCisucHVyZ2VtIHJvdW5kX3NhbXBsZQorLnB1cmdlbSBNTEEKKy5wdXJnZW0gTUxBMgorLnB1cmdlbSBNTFMKKy5wdXJnZW0gTUxTMgorLmVuZG0KKworCisubWFjcm8gIHJvdW5kX3NhbXBsZSAgICByLCBpZHgsIG5leHQKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxyXCgpLjJkLCBcclwoKS4yZCwgdjI4LjJkCisuaWYgXGlkeCA9PSAwCisgICAgICAgIGFuZCAgICAgICAgICAgICB2MjguMTZiLCAgXHJcKCkuMTZiLCAgdjMwLjE2YgorLmVsc2UgLy8gXGlkeCA9PSAxCisgICAgICAgIGFuZCAgICAgICAgICAgICB2MjguMTZiLCAgXHJcKCkuMTZiLCAgdjMxLjE2YgorLmVuZGlmCisuaWYgXGlkeCAhPSBcbmV4dAorICAuaWYgXG5leHQgPT0gMAorICAgICAgICBleHQgICAgICAgICAgICAgdjI4LjE2YiwgdjI4LjE2YiwgdjI5LjE2YiwgIzgKKyAgLmVsc2UKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYyOC4xNmIsIHYyOS4xNmIsIHYyOC4xNmIsICM4CisgIC5lbmRpZgorLmVuZGlmCisuZW5kbQorLm1hY3JvICBNTEEgICAgICAgICAgICAgZCwgczEsIHMyCisgICAgICAgIHNtbGFsICAgICAgICAgICBcZFwoKS4yZCwgXHMxXCgpLjJzLCBcczJcKCkuMnMKKy5lbmRtCisubWFjcm8gIE1MQTIgICAgICAgICAgICBkLCBzMSwgczIKKyAgICAgICAgc21sYWwyICAgICAgICAgIFxkXCgpLjJkLCBcczFcKCkuNHMsIFxzMlwoKS40cworLmVuZG0KKy5tYWNybyAgTUxTICAgICAgICAgICAgIGQsIHMxLCBzMgorICAgICAgICBzbWxzbCAgICAgICAgICAgXGRcKCkuMmQsIFxzMVwoKS4ycywgXHMyXCgpLjJzCisuZW5kbQorLm1hY3JvICBNTFMyICAgICAgICAgICAgZCwgczEsIHMyCisgICAgICAgIHNtbHNsMiAgICAgICAgICBcZFwoKS4yZCwgXHMxXCgpLjRzLCBcczJcKCkuNHMKKy5lbmRtCithcHBseV93aW5kb3cgZml4ZWQsIGgKKworCisvLyBub3RoaW5nIHRvIGRvIGZvciByb3VuZF9zYW1wbGUgYW5kIE1Me0EsU30yCisubWFjcm8gIHJvdW5kX3NhbXBsZSAgICByLCBpZHgsIG5leHQKKy5lbmRtCisubWFjcm8gIE1MQTIgICAgICAgICAgICBkLCBzMSwgczIKKy5lbmRtCisubWFjcm8gIE1MUzIgICAgICAgICAgICBkLCBzMSwgczIKKy5lbmRtCisubWFjcm8gIE1MQSAgICAgICAgICAgICBkLCBzMSwgczIKKyAgICAgICAgZm1sYSAgICAgICAgICAgIFxkXCgpLjRzLCBcczFcKCkuNHMsIFxzMlwoKS40cworLmVuZG0KKy5tYWNybyAgTUxTICAgICAgICAgICAgIGQsIHMxLCBzMgorICAgICAgICBmbWxzICAgICAgICAgICAgXGRcKCkuNHMsIFxzMVwoKS40cywgXHMyXCgpLjRzCisuZW5kbQorYXBwbHlfd2luZG93IGZsb2F0LCBzCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOWFlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L25lb24uUwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisubWFjcm8gIHRyYW5zcG9zZV84eDhCICByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByOQorICAgICAgICB0cm4xICAgICAgICAgICAgXHI4XCgpLjhCLCAgXHIwXCgpLjhCLCAgXHIxXCgpLjhCCisgICAgICAgIHRybjIgICAgICAgICAgICBccjlcKCkuOEIsICBccjBcKCkuOEIsICBccjFcKCkuOEIKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyMVwoKS44QiwgIFxyMlwoKS44QiwgIFxyM1woKS44QgorICAgICAgICB0cm4yICAgICAgICAgICAgXHIzXCgpLjhCLCAgXHIyXCgpLjhCLCAgXHIzXCgpLjhCCisgICAgICAgIHRybjEgICAgICAgICAgICBccjBcKCkuOEIsICBccjRcKCkuOEIsICBccjVcKCkuOEIKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyNVwoKS44QiwgIFxyNFwoKS44QiwgIFxyNVwoKS44QgorICAgICAgICB0cm4xICAgICAgICAgICAgXHIyXCgpLjhCLCAgXHI2XCgpLjhCLCAgXHI3XCgpLjhCCisgICAgICAgIHRybjIgICAgICAgICAgICBccjdcKCkuOEIsICBccjZcKCkuOEIsICBccjdcKCkuOEIKKworICAgICAgICB0cm4xICAgICAgICAgICAgXHI0XCgpLjRILCAgXHIwXCgpLjRILCAgXHIyXCgpLjRICisgICAgICAgIHRybjIgICAgICAgICAgICBccjJcKCkuNEgsICBccjBcKCkuNEgsICBccjJcKCkuNEgKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyNlwoKS40SCwgIFxyNVwoKS40SCwgIFxyN1woKS40SAorICAgICAgICB0cm4yICAgICAgICAgICAgXHI3XCgpLjRILCAgXHI1XCgpLjRILCAgXHI3XCgpLjRICisgICAgICAgIHRybjEgICAgICAgICAgICBccjVcKCkuNEgsICBccjlcKCkuNEgsICBccjNcKCkuNEgKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyOVwoKS40SCwgIFxyOVwoKS40SCwgIFxyM1woKS40SAorICAgICAgICB0cm4xICAgICAgICAgICAgXHIzXCgpLjRILCAgXHI4XCgpLjRILCAgXHIxXCgpLjRICisgICAgICAgIHRybjIgICAgICAgICAgICBccjhcKCkuNEgsICBccjhcKCkuNEgsICBccjFcKCkuNEgKKworICAgICAgICB0cm4xICAgICAgICAgICAgXHIwXCgpLjJTLCAgXHIzXCgpLjJTLCAgXHI0XCgpLjJTCisgICAgICAgIHRybjIgICAgICAgICAgICBccjRcKCkuMlMsICBccjNcKCkuMlMsICBccjRcKCkuMlMKKworICAgICAgICB0cm4xICAgICAgICAgICAgXHIxXCgpLjJTLCAgXHI1XCgpLjJTLCAgXHI2XCgpLjJTCisgICAgICAgIHRybjIgICAgICAgICAgICBccjVcKCkuMlMsICBccjVcKCkuMlMsICBccjZcKCkuMlMKKworICAgICAgICB0cm4yICAgICAgICAgICAgXHI2XCgpLjJTLCAgXHI4XCgpLjJTLCAgXHIyXCgpLjJTCisgICAgICAgIHRybjEgICAgICAgICAgICBccjJcKCkuMlMsICBccjhcKCkuMlMsICBccjJcKCkuMlMKKworICAgICAgICB0cm4xICAgICAgICAgICAgXHIzXCgpLjJTLCAgXHI5XCgpLjJTLCAgXHI3XCgpLjJTCisgICAgICAgIHRybjIgICAgICAgICAgICBccjdcKCkuMlMsICBccjlcKCkuMlMsICBccjdcKCkuMlMKKy5lbmRtCisKKy5tYWNybyAgdHJhbnNwb3NlXzh4MTZCIHIwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgdDAsIHQxCisgICAgICAgIHRybjEgICAgICAgICAgICBcdDBcKCkuMTZCLCBccjBcKCkuMTZCLCBccjFcKCkuMTZCCisgICAgICAgIHRybjIgICAgICAgICAgICBcdDFcKCkuMTZCLCBccjBcKCkuMTZCLCBccjFcKCkuMTZCCisgICAgICAgIHRybjEgICAgICAgICAgICBccjFcKCkuMTZCLCBccjJcKCkuMTZCLCBccjNcKCkuMTZCCisgICAgICAgIHRybjIgICAgICAgICAgICBccjNcKCkuMTZCLCBccjJcKCkuMTZCLCBccjNcKCkuMTZCCisgICAgICAgIHRybjEgICAgICAgICAgICBccjBcKCkuMTZCLCBccjRcKCkuMTZCLCBccjVcKCkuMTZCCisgICAgICAgIHRybjIgICAgICAgICAgICBccjVcKCkuMTZCLCBccjRcKCkuMTZCLCBccjVcKCkuMTZCCisgICAgICAgIHRybjEgICAgICAgICAgICBccjJcKCkuMTZCLCBccjZcKCkuMTZCLCBccjdcKCkuMTZCCisgICAgICAgIHRybjIgICAgICAgICAgICBccjdcKCkuMTZCLCBccjZcKCkuMTZCLCBccjdcKCkuMTZCCisKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyNFwoKS44SCwgIFxyMFwoKS44SCwgIFxyMlwoKS44SAorICAgICAgICB0cm4yICAgICAgICAgICAgXHIyXCgpLjhILCAgXHIwXCgpLjhILCAgXHIyXCgpLjhICisgICAgICAgIHRybjEgICAgICAgICAgICBccjZcKCkuOEgsICBccjVcKCkuOEgsICBccjdcKCkuOEgKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyN1woKS44SCwgIFxyNVwoKS44SCwgIFxyN1woKS44SAorICAgICAgICB0cm4xICAgICAgICAgICAgXHI1XCgpLjhILCAgXHQxXCgpLjhILCAgXHIzXCgpLjhICisgICAgICAgIHRybjIgICAgICAgICAgICBcdDFcKCkuOEgsICBcdDFcKCkuOEgsICBccjNcKCkuOEgKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyM1woKS44SCwgIFx0MFwoKS44SCwgIFxyMVwoKS44SAorICAgICAgICB0cm4yICAgICAgICAgICAgXHQwXCgpLjhILCAgXHQwXCgpLjhILCAgXHIxXCgpLjhICisKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyMFwoKS40UywgIFxyM1woKS40UywgIFxyNFwoKS40UworICAgICAgICB0cm4yICAgICAgICAgICAgXHI0XCgpLjRTLCAgXHIzXCgpLjRTLCAgXHI0XCgpLjRTCisKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyMVwoKS40UywgIFxyNVwoKS40UywgIFxyNlwoKS40UworICAgICAgICB0cm4yICAgICAgICAgICAgXHI1XCgpLjRTLCAgXHI1XCgpLjRTLCAgXHI2XCgpLjRTCisKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyNlwoKS40UywgIFx0MFwoKS40UywgIFxyMlwoKS40UworICAgICAgICB0cm4xICAgICAgICAgICAgXHIyXCgpLjRTLCAgXHQwXCgpLjRTLCAgXHIyXCgpLjRTCisKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyM1woKS40UywgIFx0MVwoKS40UywgIFxyN1woKS40UworICAgICAgICB0cm4yICAgICAgICAgICAgXHI3XCgpLjRTLCAgXHQxXCgpLjRTLCAgXHI3XCgpLjRTCisuZW5kbQorCisubWFjcm8gIHRyYW5zcG9zZV80eDE2QiByMCwgcjEsIHIyLCByMywgdDQsIHQ1LCB0NiwgdDcKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFx0NFwoKS4xNkIsIFxyMFwoKS4xNkIsICBccjFcKCkuMTZCCisgICAgICAgIHRybjIgICAgICAgICAgICBcdDVcKCkuMTZCLCBccjBcKCkuMTZCLCAgXHIxXCgpLjE2QgorICAgICAgICB0cm4xICAgICAgICAgICAgXHQ2XCgpLjE2QiwgXHIyXCgpLjE2QiwgIFxyM1woKS4xNkIKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFx0N1woKS4xNkIsIFxyMlwoKS4xNkIsICBccjNcKCkuMTZCCisKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyMFwoKS44SCwgIFx0NFwoKS44SCwgIFx0NlwoKS44SAorICAgICAgICB0cm4yICAgICAgICAgICAgXHIyXCgpLjhILCAgXHQ0XCgpLjhILCAgXHQ2XCgpLjhICisgICAgICAgIHRybjEgICAgICAgICAgICBccjFcKCkuOEgsICBcdDVcKCkuOEgsICBcdDdcKCkuOEgKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyM1woKS44SCwgIFx0NVwoKS44SCwgIFx0N1woKS44SAorLmVuZG0KKworLm1hY3JvICB0cmFuc3Bvc2VfNHg4QiAgcjAsIHIxLCByMiwgcjMsIHQ0LCB0NSwgdDYsIHQ3CisgICAgICAgIHRybjEgICAgICAgICAgICBcdDRcKCkuOEIsICBccjBcKCkuOEIsICBccjFcKCkuOEIKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFx0NVwoKS44QiwgIFxyMFwoKS44QiwgIFxyMVwoKS44QgorICAgICAgICB0cm4xICAgICAgICAgICAgXHQ2XCgpLjhCLCAgXHIyXCgpLjhCLCAgXHIzXCgpLjhCCisgICAgICAgIHRybjIgICAgICAgICAgICBcdDdcKCkuOEIsICBccjJcKCkuOEIsICBccjNcKCkuOEIKKworICAgICAgICB0cm4xICAgICAgICAgICAgXHIwXCgpLjRILCAgXHQ0XCgpLjRILCAgXHQ2XCgpLjRICisgICAgICAgIHRybjIgICAgICAgICAgICBccjJcKCkuNEgsICBcdDRcKCkuNEgsICBcdDZcKCkuNEgKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyMVwoKS40SCwgIFx0NVwoKS40SCwgIFx0N1woKS40SAorICAgICAgICB0cm4yICAgICAgICAgICAgXHIzXCgpLjRILCAgXHQ1XCgpLjRILCAgXHQ3XCgpLjRICisuZW5kbQorCisubWFjcm8gIHRyYW5zcG9zZV80eDRIICByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyNFwoKS40SCwgIFxyMFwoKS40SCwgIFxyMVwoKS40SAorICAgICAgICB0cm4yICAgICAgICAgICAgXHI1XCgpLjRILCAgXHIwXCgpLjRILCAgXHIxXCgpLjRICisgICAgICAgIHRybjEgICAgICAgICAgICBccjdcKCkuNEgsICBccjNcKCkuNEgsICBccjJcKCkuNEgKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyNlwoKS40SCwgIFxyM1woKS40SCwgIFxyMlwoKS40SAorICAgICAgICB0cm4xICAgICAgICAgICAgXHIwXCgpLjJTLCAgXHI0XCgpLjJTLCAgXHI3XCgpLjJTCisgICAgICAgIHRybjIgICAgICAgICAgICBccjNcKCkuMlMsICBccjRcKCkuMlMsICBccjdcKCkuMlMKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyMVwoKS4yUywgIFxyNVwoKS4yUywgIFxyNlwoKS4yUworICAgICAgICB0cm4yICAgICAgICAgICAgXHIyXCgpLjJTLCAgXHI1XCgpLjJTLCAgXHI2XCgpLjJTCisuZW5kbQorCisubWFjcm8gIHRyYW5zcG9zZV84eDhIICByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByOQorICAgICAgICB0cm4xICAgICAgICAgICAgXHI4XCgpLjhILCAgXHIwXCgpLjhILCAgXHIxXCgpLjhICisgICAgICAgIHRybjIgICAgICAgICAgICBccjlcKCkuOEgsICBccjBcKCkuOEgsICBccjFcKCkuOEgKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyMVwoKS44SCwgIFxyMlwoKS44SCwgIFxyM1woKS44SAorICAgICAgICB0cm4yICAgICAgICAgICAgXHIzXCgpLjhILCAgXHIyXCgpLjhILCAgXHIzXCgpLjhICisgICAgICAgIHRybjEgICAgICAgICAgICBccjBcKCkuOEgsICBccjRcKCkuOEgsICBccjVcKCkuOEgKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyNVwoKS44SCwgIFxyNFwoKS44SCwgIFxyNVwoKS44SAorICAgICAgICB0cm4xICAgICAgICAgICAgXHIyXCgpLjhILCAgXHI2XCgpLjhILCAgXHI3XCgpLjhICisgICAgICAgIHRybjIgICAgICAgICAgICBccjdcKCkuOEgsICBccjZcKCkuOEgsICBccjdcKCkuOEgKKworICAgICAgICB0cm4xICAgICAgICAgICAgXHI0XCgpLjRTLCAgXHIwXCgpLjRTLCAgXHIyXCgpLjRTCisgICAgICAgIHRybjIgICAgICAgICAgICBccjJcKCkuNFMsICBccjBcKCkuNFMsICBccjJcKCkuNFMKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyNlwoKS40UywgIFxyNVwoKS40UywgIFxyN1woKS40UworICAgICAgICB0cm4yICAgICAgICAgICAgXHI3XCgpLjRTLCAgXHI1XCgpLjRTLCAgXHI3XCgpLjRTCisgICAgICAgIHRybjEgICAgICAgICAgICBccjVcKCkuNFMsICBccjlcKCkuNFMsICBccjNcKCkuNFMKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyOVwoKS40UywgIFxyOVwoKS40UywgIFxyM1woKS40UworICAgICAgICB0cm4xICAgICAgICAgICAgXHIzXCgpLjRTLCAgXHI4XCgpLjRTLCAgXHIxXCgpLjRTCisgICAgICAgIHRybjIgICAgICAgICAgICBccjhcKCkuNFMsICBccjhcKCkuNFMsICBccjFcKCkuNFMKKworICAgICAgICB0cm4xICAgICAgICAgICAgXHIwXCgpLjJELCAgXHIzXCgpLjJELCAgXHI0XCgpLjJECisgICAgICAgIHRybjIgICAgICAgICAgICBccjRcKCkuMkQsICBccjNcKCkuMkQsICBccjRcKCkuMkQKKworICAgICAgICB0cm4xICAgICAgICAgICAgXHIxXCgpLjJELCAgXHI1XCgpLjJELCAgXHI2XCgpLjJECisgICAgICAgIHRybjIgICAgICAgICAgICBccjVcKCkuMkQsICBccjVcKCkuMkQsICBccjZcKCkuMkQKKworICAgICAgICB0cm4yICAgICAgICAgICAgXHI2XCgpLjJELCAgXHI4XCgpLjJELCAgXHIyXCgpLjJECisgICAgICAgIHRybjEgICAgICAgICAgICBccjJcKCkuMkQsICBccjhcKCkuMkQsICBccjJcKCkuMkQKKworICAgICAgICB0cm4xICAgICAgICAgICAgXHIzXCgpLjJELCAgXHI5XCgpLjJELCAgXHI3XCgpLjJECisgICAgICAgIHRybjIgICAgICAgICAgICBccjdcKCkuMkQsICBccjlcKCkuMkQsICBccjdcKCkuMkQKKworLmVuZG0KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvbmVvbnRlc3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvbmVvbnRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTQxZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9uZW9udGVzdC5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBjaGVjayBORU9OIHJlZ2lzdGVycyBmb3IgY2xvYmJlcnMKKyAqIENvcHlyaWdodCAoYykgMjAxMyBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvbmVvbnRlc3QuaCIKKword3JhcChhdmNvZGVjX29wZW4yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICBBVkNvZGVjICpjb2RlYywKKyAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKipvcHRpb25zKSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfb3BlbjIsIGF2Y3R4LCBjb2RlYywgb3B0aW9ucyk7Cit9CisKK3dyYXAoYXZjb2RlY19kZWNvZGVfYXVkaW80KEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfZGVjb2RlX2F1ZGlvNCwgYXZjdHgsIGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgZ290X2ZyYW1lX3B0ciwgYXZwa3QpOworfQorCit3cmFwKGF2Y29kZWNfZGVjb2RlX3ZpZGVvMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfcGljdHVyZV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpKQoreworICAgIHRlc3RuZW9uY2xvYmJlcnMoYXZjb2RlY19kZWNvZGVfdmlkZW8yLCBhdmN0eCwgcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgIGdvdF9waWN0dXJlX3B0ciwgYXZwa3QpOworfQorCit3cmFwKGF2Y29kZWNfZGVjb2RlX3N1YnRpdGxlMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN1YnRpdGxlICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9zdWJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfZGVjb2RlX3N1YnRpdGxlMiwgYXZjdHgsIHN1YiwKKyAgICAgICAgICAgICAgICAgICAgIGdvdF9zdWJfcHRyLCBhdnBrdCk7Cit9CisKK3dyYXAoYXZjb2RlY19lbmNvZGVfYXVkaW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfcGFja2V0X3B0cikpCit7CisgICAgdGVzdG5lb25jbG9iYmVycyhhdmNvZGVjX2VuY29kZV9hdWRpbzIsIGF2Y3R4LCBhdnBrdCwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICBnb3RfcGFja2V0X3B0cik7Cit9CisKK3dyYXAoYXZjb2RlY19lbmNvZGVfc3VidGl0bGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZTdWJ0aXRsZSAqc3ViKSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfZW5jb2RlX3N1YnRpdGxlLCBhdmN0eCwgYnVmLCBidWZfc2l6ZSwgc3ViKTsKK30KKword3JhcChhdmNvZGVjX2VuY29kZV92aWRlbzIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikpCit7CisgICAgdGVzdG5lb25jbG9iYmVycyhhdmNvZGVjX2VuY29kZV92aWRlbzIsIGF2Y3R4LCBhdnBrdCwgZnJhbWUsIGdvdF9wYWNrZXRfcHRyKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvb3B1c19pbWRjdF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L29wdXNfaW1kY3RfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTlhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L29wdXNfaW1kY3RfaW5pdC5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvb3B1c19pbWRjdC5oIgorCisjaW5jbHVkZSAiYXNtLW9mZnNldHMuaCIKKworQVZfQ0hFQ0tfT0ZGU0VUKENlbHRJTURDVENvbnRleHQsIGV4cHRhYiwgICAgICAgICBDRUxUX0VYUFRBQik7CitBVl9DSEVDS19PRkZTRVQoQ2VsdElNRENUQ29udGV4dCwgZmZ0X24sICAgICAgICAgIENFTFRfRkZUX04pOworQVZfQ0hFQ0tfT0ZGU0VUKENlbHRJTURDVENvbnRleHQsIGxlbjIsICAgICAgICAgICBDRUxUX0xFTjIpOworQVZfQ0hFQ0tfT0ZGU0VUKENlbHRJTURDVENvbnRleHQsIGxlbjQsICAgICAgICAgICBDRUxUX0xFTjQpOworQVZfQ0hFQ0tfT0ZGU0VUKENlbHRJTURDVENvbnRleHQsIHRtcCwgICAgICAgICAgICBDRUxUX1RNUCk7CitBVl9DSEVDS19PRkZTRVQoQ2VsdElNRENUQ29udGV4dCwgdHdpZGRsZV9leHB0YWIsIENFTFRfVFdJRERMRSk7CisKK3ZvaWQgZmZfY2VsdF9pbWRjdF9oYWxmX25lb24oQ2VsdElNRENUQ29udGV4dCAqcywgZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgZmxvYXQgc2NhbGUpOworCit2b2lkIGZmX2NlbHRfaW1kY3RfaW5pdF9hYXJjaDY0KENlbHRJTURDVENvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5pbWRjdF9oYWxmID0gZmZfY2VsdF9pbWRjdF9oYWxmX25lb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9vcHVzX2ltZGN0X25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvb3B1c19pbWRjdF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0MjI2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvb3B1c19pbWRjdF9uZW9uLlMKQEAgLTAsMCArMSw2NDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSmFubmUgR3J1bmF1IDxqYW5uZS1saWJhdkBqYW5uYXUubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMiCisKKyNpbmNsdWRlICJhc20tb2Zmc2V0cy5oIgorCisubWFjcm8gc2h1ZmZsZSBhLCBiLCBjLCBkCitjb25zdCBzaHVmZmxlX1xhXGJcY1xkLCBhbGlnbj00CisgICAgICAgIC5ieXRlIChcYSAqIDQpLCAoXGEgKiA0ICsgMSksIChcYSAqIDQgKyAyKSwgKFxhICogNCArIDMpCisgICAgICAgIC5ieXRlIChcYiAqIDQpLCAoXGIgKiA0ICsgMSksIChcYiAqIDQgKyAyKSwgKFxiICogNCArIDMpCisgICAgICAgIC5ieXRlIChcYyAqIDQpLCAoXGMgKiA0ICsgMSksIChcYyAqIDQgKyAyKSwgKFxjICogNCArIDMpCisgICAgICAgIC5ieXRlIChcZCAqIDQpLCAoXGQgKiA0ICsgMSksIChcZCAqIDQgKyAyKSwgKFxkICogNCArIDMpCitlbmRjb25zdAorLmVuZG0KKworc2h1ZmZsZSAwLCAyLCAxLCAzCitzaHVmZmxlIDEsIDAsIDMsIDIKK3NodWZmbGUgMiwgMywgMCwgMQorc2h1ZmZsZSAzLCAxLCAyLCAwCisKKworZnVuY3Rpb24gZmZ0NV9uZW9uCisgICAgICAgIGxzbCAgICAgICAgICAgICB4MiwgIHgyLCAgIzMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuMnN9LCAgICAgICAgIFt4MV0sICB4MgorICAgICAgICBsZDIgICAgICAgICAgICAge3YyNS5zLHYyNi5zfVswXSwgW3gxXSwgIHgyCisgICAgICAgIGxkMiAgICAgICAgICAgICB7djI1LnMsdjI2LnN9WzFdLCBbeDFdLCAgeDIKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MjUucyx2MjYuc31bMl0sIFt4MV0sICB4MgorICAgICAgICBsZDIgICAgICAgICAgICAge3YyNS5zLHYyNi5zfVszXSwgW3gxXQorICAgICAgICBkdXAgICAgICAgICAgICAgdjYuNHMsICB2MjQuc1swXQorICAgICAgICBkdXAgICAgICAgICAgICAgdjcuNHMsICB2MjQuc1sxXQorCisgICAgICAgIGZhZGRwICAgICAgICAgICB2MC40cywgIHYyNS40cywgdjI2LjRzCisgICAgICAgIC8vIHpbXVswXSwgeltdWzNdCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MTYuNHMsIHYyNS40cywgdjE1LnNbMF0gLy8gcnIKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYxNy40cywgdjI1LjRzLCB2MTUuc1sxXSAvLyByaQorICAgICAgICBmbXVsICAgICAgICAgICAgdjE4LjRzLCB2MjYuNHMsIHYxNS5zWzBdIC8vIGlyCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MTkuNHMsIHYyNi40cywgdjE1LnNbMV0gLy8gaWkKKyAgICAgICAgZmFkZHAgICAgICAgICAgIHYwLjRzLCAgdjAuNHMsICB2MC40cworICAgICAgICAvLyB6W11bMV0sIHpbXVsyXQorICAgICAgICBmbXVsICAgICAgICAgICAgdjIwLjRzLCB2MjUuNHMsIHYxNS5zWzJdIC8vIHJyCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjEuNHMsIHYyNS40cywgdjE1LnNbM10gLy8gcmkKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYyMi40cywgdjI2LjRzLCB2MTUuc1syXSAvLyBpcgorICAgICAgICBmbXVsICAgICAgICAgICAgdjIzLjRzLCB2MjYuNHMsIHYxNS5zWzNdIC8vIGlpCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MC4ycywgIHYyNC4ycywgdjAuMnMgICAvLyBvdXRbMF0KKworICAgICAgICAvLyB6WzAxMjNdWzBdLCB6WzAxMjNdWzNdCisgICAgICAgIGZzdWIgICAgICAgICAgICB2MjQuNHMsIHYxNi40cywgdjE5LjRzICAvLyAgICAoYykucmUgPSAgcnIgLSBpaTsKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYyNy40cywgdjE2LjRzLCB2MTkuNHMgIC8vICAgIChkKS5yZSA9ICByciArIGlpOworICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi4xNmJ9LCAgW3gxMV0KKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTkuMTZifSwgIFt4MTRdCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MjguNHMsIHYxNy40cywgdjE4LjRzICAvLyAgICAoYykuaW0gPSAgcmkgKyBpcjsKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYzMS40cywgdjE4LjRzLCB2MTcuNHMgIC8vICAgIChkKS5pbSA9IC1yaSArIGlyOworICAgICAgICBsZDEgICAgICAgICAgICAge3YxNy4xNmJ9LCAgW3gxMl0KKyAgICAgICAgLy8gelswMTIzXVsxXSwgelswMTIzXVsyXQorICAgICAgICBmc3ViICAgICAgICAgICAgdjI1LjRzLCB2MjAuNHMsIHYyMy40cyAgLy8gICAgKGMpLnJlID0gIHJyIC0gaWk7CisgICAgICAgIGZhZGQgICAgICAgICAgICB2MjYuNHMsIHYyMC40cywgdjIzLjRzICAvLyAgICAoZCkucmUgPSAgcnIgKyBpaTsKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguMTZifSwgIFt4MTNdCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MjkuNHMsIHYyMS40cywgdjIyLjRzICAvLyAgICAoYykuaW0gPSAgcmkgKyBpcjsKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYzMC40cywgdjIyLjRzLCB2MjEuNHMgIC8vICAgIChkKS5pbSA9IC1yaSArIGlyOworCisgICAgICAgIC8vcmVhbAorICAgICAgICB0YmwgICAgICAgICAgICAgdjIwLjE2Yiwge3YyNC4xNmJ9LCB2MTYuMTZiCisgICAgICAgIHRibCAgICAgICAgICAgICB2MjEuMTZiLCB7djI1LjE2Yn0sIHYxNy4xNmIKKyAgICAgICAgdGJsICAgICAgICAgICAgIHYyMi4xNmIsIHt2MjYuMTZifSwgdjE4LjE2YgorICAgICAgICB0YmwgICAgICAgICAgICAgdjIzLjE2Yiwge3YyNy4xNmJ9LCB2MTkuMTZiCisgICAgICAgIC8vaW1hZworICAgICAgICB0YmwgICAgICAgICAgICAgdjE2LjE2Yiwge3YyOC4xNmJ9LCB2MTYuMTZiCisgICAgICAgIHRibCAgICAgICAgICAgICB2MTcuMTZiLCB7djI5LjE2Yn0sIHYxNy4xNmIKKyAgICAgICAgdGJsICAgICAgICAgICAgIHYxOC4xNmIsIHt2MzAuMTZifSwgdjE4LjE2YgorICAgICAgICB0YmwgICAgICAgICAgICAgdjE5LjE2Yiwge3YzMS4xNmJ9LCB2MTkuMTZiCisKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHY2LjRzLCAgdjYuNHMsICB2MjAuNHMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYyMi40cywgdjIyLjRzLCB2MjMuNHMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHY3LjRzLCAgdjcuNHMsICB2MTYuNHMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYxOC40cywgdjE4LjRzLCB2MTkuNHMKKworICAgICAgICBmYWRkICAgICAgICAgICAgdjIxLjRzLCB2MjEuNHMsIHYyMi40cworICAgICAgICBmYWRkICAgICAgICAgICAgdjE3LjRzLCB2MTcuNHMsIHYxOC40cworICAgICAgICBmYWRkICAgICAgICAgICAgdjYuNHMsICB2Ni40cywgIHYyMS40cworICAgICAgICBmYWRkICAgICAgICAgICAgdjcuNHMsICB2Ny40cywgIHYxNy40cworCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZnQxNV9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4OCwgIHgxCisgICAgICAgIG1vdiAgICAgICAgICAgICB4OSwgIHgzMAorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MywgIHgzLCAgbHNsICMxICAgLy8gMyAqIHN0cmlkZQorCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgIHg4LCAgeDMsICBsc2wgIzMgICAvLyBpbiArIDEgKiBzdHJpZGUKKyAgICAgICAgYmwgICAgICAgICAgICAgIGZmdDVfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgdjEuOGIsICAgdjAuOGIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyLjE2YiwgIHY2LjE2YgorICAgICAgICBtb3YgICAgICAgICAgICAgdjMuMTZiLCAgdjcuMTZiCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDgsICB4MywgIGxzbCAjNCAgIC8vIGluICsgMiAqIHN0cmlkZQorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MywgIHgzLCAgbHNsICMxICAgLy8gMyAqIHN0cmlkZQorICAgICAgICBibCAgICAgICAgICAgICAgZmZ0NV9uZW9uCisgICAgICAgIHppcDEgICAgICAgICAgICB2MS40cywgICB2MS40cywgIHYwLjRzCisgICAgICAgIG1vdiAgICAgICAgICAgICB2NC4xNmIsICB2Ni4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHY1LjE2YiwgIHY3LjE2YgorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgIHg4ICAgICAgICAgICAgICAgICAvLyBpbiArIDAgKiBzdHJpZGUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDMsICB4MywgIGxzbCAjMSAgIC8vIDMgKiBzdHJpZGUKKyAgICAgICAgYmwgICAgICAgICAgICAgIGZmdDVfbmVvbgorCisgICAgICAgIGZhZGRwICAgICAgICAgICB2MjAuNHMsIHYxLjRzLCAgdjEuNHMKKworICAgICAgICBleHQgICAgICAgICAgICAgdjE4LjE2YiwgdjguMTZiLCAgdjguMTZiLCAgIzQKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYxOS4xNmIsIHY5LjE2YiwgIHY5LjE2YiwgICM0CisgICAgICAgIG1vdiAgICAgICAgICAgICB2MTYuMTZiLCB2Ni4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYxNy4xNmIsIHY3LjE2YgorICAgICAgICBmYWRkICAgICAgICAgICAgdjIwLjJzLCB2MjAuMnMsIHYwLjJzCisKKyAgICAgICAgdXpwMSAgICAgICAgICAgIHYxOC40cywgdjE4LjRzLCB2MTAuNHMgIC8vIGV4cFsyLDQsNiw4XS5yZQorICAgICAgICB1enAxICAgICAgICAgICAgdjE5LjRzLCB2MTkuNHMsIHYxMS40cyAgLy8gZXhwWzIsNCw2LDhdLmltCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjAuMnN9LCAgW3gwXSwgIzggICAgIC8vIG91dFswXQorCisgICAgICAgIGZtbGEgICAgICAgICAgICB2MTYuNHMsIHYyLjRzLCAgdjguNHMKKyAgICAgICAgZm1scyAgICAgICAgICAgIHYxNi40cywgdjMuNHMsICB2OS40cworCisgICAgICAgIGZtbGEgICAgICAgICAgICB2MTcuNHMsIHYyLjRzLCAgdjkuNHMKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNy40cywgdjMuNHMsICB2OC40cworCisgICAgICAgIGZtbGEgICAgICAgICAgICB2MTYuNHMsIHY0LjRzLCAgdjE4LjRzCisgICAgICAgIGZtbHMgICAgICAgICAgICB2MTYuNHMsIHY1LjRzLCAgdjE5LjRzCisKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNy40cywgdjQuNHMsICB2MTkuNHMKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNy40cywgdjUuNHMsICB2MTguNHMKKworICAgICAgICB6aXAxICAgICAgICAgICAgdjE4LjRzLCB2MTYuNHMsIHYxNy40cworICAgICAgICB6aXAyICAgICAgICAgICAgdjE5LjRzLCB2MTYuNHMsIHYxNy40cworCisgICAgICAgIHJldjY0ICAgICAgICAgICB2MzEuNHMsIHYxNC40cworICAgICAgICB0cm4xICAgICAgICAgICAgdjI4LjJkLCB2MS4yZCwgIHYxLjJkCisgICAgICAgIHRybjIgICAgICAgICAgICB2MjkuMmQsIHYxLjJkLCAgdjEuMmQKKyAgICAgICAgemlwMSAgICAgICAgICAgIHYzMC4yZCwgdjE0LjJkLCB2MzEuMmQKKyAgICAgICAgemlwMiAgICAgICAgICAgIHYzMS4yZCwgdjE0LjJkLCB2MzEuMmQKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YxOC40cyx2MTkuNHN9LCAgW3gwXSwgIzMyIC8vIG91dFsxLTRdCisKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYxNi40cywgdjI4LjRzLCB2MzAuNHMKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYxNy40cywgdjI5LjRzLCB2MzAuNHMKKyAgICAgICAgZm1scyAgICAgICAgICAgIHYxNi40cywgdjI5LjRzLCB2MzEuNHMKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNy40cywgdjI4LjRzLCB2MzEuNHMKKyAgICAgICAgZmFkZHAgICAgICAgICAgIHYxNi40cywgdjE2LjRzLCB2MTYuNHMKKyAgICAgICAgZmFkZHAgICAgICAgICAgIHYxNy40cywgdjE3LjRzLCB2MTcuNHMKKyAgICAgICAgemlwMSAgICAgICAgICAgIHYxOC4ycywgdjE2LjJzLCB2MTcuMnMKKyAgICAgICAgemlwMiAgICAgICAgICAgIHYxOS4ycywgdjE2LjJzLCB2MTcuMnMKKworICAgICAgICBmYWRkICAgICAgICAgICAgdjE4LjJzLCB2MTguMnMsIHYwLjJzCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MC4ycywgIHYxOS4ycywgdjAuMnMKKworICAgICAgICBleHQgICAgICAgICAgICAgdjMwLjE2YiwgdjEyLjE2YiwgdjEyLjE2YiwgIzQKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYzMS4xNmIsIHYxMy4xNmIsIHYxMy4xNmIsICM0CisgICAgICAgIG1vdiAgICAgICAgICAgICB2MTYuMTZiLCB2Ni4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYxNy4xNmIsIHY3LjE2YgorCisgICAgICAgIHV6cDEgICAgICAgICAgICB2MzAuNHMsIHYzMC40cywgdjguNHMKKyAgICAgICAgdXpwMSAgICAgICAgICAgIHYzMS40cywgdjMxLjRzLCB2OS40cworCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE4LjJzfSwgIFt4MF0sICM4ICAgICAvLyBvdXRbNV0KKworICAgICAgICBmbWxhICAgICAgICAgICAgdjE2LjRzLCB2Mi40cywgIHYxMC40cworICAgICAgICBmbWxzICAgICAgICAgICAgdjE2LjRzLCB2My40cywgIHYxMS40cworCisgICAgICAgIGZtbGEgICAgICAgICAgICB2MTcuNHMsIHYyLjRzLCAgdjExLjRzCisgICAgICAgIGZtbGEgICAgICAgICAgICB2MTcuNHMsIHYzLjRzLCAgdjEwLjRzCisKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNi40cywgdjQuNHMsICB2MzAuNHMKKyAgICAgICAgZm1scyAgICAgICAgICAgIHYxNi40cywgdjUuNHMsICB2MzEuNHMKKworICAgICAgICBmbWxhICAgICAgICAgICAgdjE3LjRzLCB2NC40cywgIHYzMS40cworICAgICAgICBmbWxhICAgICAgICAgICAgdjE3LjRzLCB2NS40cywgIHYzMC40cworCisgICAgICAgIHppcDEgICAgICAgICAgICB2MTguNHMsIHYxNi40cywgdjE3LjRzCisgICAgICAgIHppcDIgICAgICAgICAgICB2MTkuNHMsIHYxNi40cywgdjE3LjRzCisKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYzMC4xNmIsIHYxMC4xNmIsIHYxMC4xNmIsICM0CisgICAgICAgIGV4dCAgICAgICAgICAgICB2MzEuMTZiLCB2MTEuMTZiLCB2MTEuMTZiLCAjNAorCisgICAgICAgIGZtbGEgICAgICAgICAgICB2Ni40cywgIHYyLjRzLCAgdjEyLjRzCisgICAgICAgIGZtbHMgICAgICAgICAgICB2Ni40cywgIHYzLjRzLCAgdjEzLjRzCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguNHMsdjE5LjRzfSwgIFt4MF0sICMzMiAvLyBvdXRbNi05XQorCisgICAgICAgIHV6cDEgICAgICAgICAgICB2MzAuNHMsIHYzMC40cywgdjEyLjRzCisgICAgICAgIHV6cDEgICAgICAgICAgICB2MzEuNHMsIHYzMS40cywgdjEzLjRzCisKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHY3LjRzLCAgdjIuNHMsICB2MTMuNHMKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHY3LjRzLCAgdjMuNHMsICB2MTIuNHMKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YwLjJzfSwgIFt4MF0sICM4ICAgICAvLyBvdXRbMTBdCisKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHY2LjRzLCAgdjQuNHMsICB2MzAuNHMKKyAgICAgICAgZm1scyAgICAgICAgICAgIHY2LjRzLCAgdjUuNHMsICB2MzEuNHMKKworICAgICAgICBmbWxhICAgICAgICAgICAgdjcuNHMsICB2NC40cywgIHYzMS40cworICAgICAgICBmbWxhICAgICAgICAgICAgdjcuNHMsICB2NS40cywgIHYzMC40cworCisgICAgICAgIHppcDEgICAgICAgICAgICB2MTguNHMsIHY2LjRzLCAgdjcuNHMKKyAgICAgICAgemlwMiAgICAgICAgICAgIHYxOS40cywgdjYuNHMsICB2Ny40cworCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE4LjRzLHYxOS40c30sICBbeDBdLCAjMzIgLy8gb3V0WzExLTE0XQorCisgICAgICAgIHJldCAgICAgICAgICAgICB4OQorZW5kZnVuYworCisvLyB4MDogb3V0LCB4MTogb3V0K2xlbjIsIHgyOiBleHB0YWIsIHgzOiBsZW4yCitmdW5jdGlvbiBmZnQxNV9wYXNzCisgICAgICAgIGFuZHMgICAgICAgICAgICB4NiwgIHgzLCAgIzMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg0LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgeDEKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDlmCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMnN9LCAgW3gwXSwgIzgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS4yc30sICBbeDFdLCAjOAorICAgICAgICBzdWIgICAgICAgICAgICAgeDMsICB4MywgIHg2CisgICAgICAgIHN1YnMgICAgICAgICAgICB4NiwgIHg2LCAgIzEKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYyLjJzLCAgdjAuMnMsICB2MS4ycworICAgICAgICBmc3ViICAgICAgICAgICAgdjMuMnMsICB2MC4ycywgIHYxLjJzCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHgyLCAgIzgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi4yc30sICBbeDRdLCAjOAorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLjJzfSwgIFt4NV0sICM4CisgICAgICAgIGIuZXEgICAgICAgICAgICA5ZgorMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIHg2LCAgeDYsICAjMQorICAgICAgICBsZHAgICAgICAgICAgICAgczQsICBzNSwgIFt4Ml0sICM4CisgICAgICAgIGxkcCAgICAgICAgICAgICBzMiwgIHMzLCAgW3gxXSwgIzgKKyAgICAgICAgbGRwICAgICAgICAgICAgIHMwLCAgczEsICBbeDBdLCAjOAorCisgICAgICAgIGZtdWwgICAgICAgICAgICBzNiwgIHMyLCAgczQKKyAgICAgICAgZm11bCAgICAgICAgICAgIHM3LCAgczIsICBzNQorICAgICAgICBmbWxzICAgICAgICAgICAgczYsICBzMywgIHY1LnNbMF0KKyAgICAgICAgZm1sYSAgICAgICAgICAgIHM3LCAgczMsICB2NC5zWzBdCisKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHMyLCAgczAsICBzNgorICAgICAgICBmc3ViICAgICAgICAgICAgczMsICBzMSwgIHM3CisgICAgICAgIGZhZGQgICAgICAgICAgICBzMCwgIHMwLCAgczYKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHMxLCAgczEsICBzNworCisgICAgICAgIHN0cCAgICAgICAgICAgICBzMiwgIHMzLCAgW3g1XSwgIzgKKyAgICAgICAgc3RwICAgICAgICAgICAgIHMwLCAgczEsICBbeDRdLCAjOAorICAgICAgICBiLmd0ICAgICAgICAgICAgMWIKKzk6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHMsdjUuNHN9LCBbeDJdLCAgIzMyCisgICAgICAgIGxkMiAgICAgICAgICAgICB7djIuNHMsdjMuNHN9LCBbeDFdLCAgIzMyCisgICAgICAgIHV6cDEgICAgICAgICAgICB2Ni40cywgIHY0LjRzLCAgdjUuNHMKKyAgICAgICAgdXpwMiAgICAgICAgICAgIHY3LjRzLCAgdjQuNHMsICB2NS40cworICAgICAgICBsZDIgICAgICAgICAgICAge3YwLjRzLHYxLjRzfSwgW3gwXSwgICMzMgorODoKKyAgICAgICAgc3VicyAgICAgICAgICAgIHgzLCAgeDMsICAjOAorCisgICAgICAgIGZtdWwgICAgICAgICAgICB2NC40cywgIHYyLjRzLCAgdjYuNHMKKyAgICAgICAgZm11bCAgICAgICAgICAgIHY1LjRzLCAgdjIuNHMsICB2Ny40cworICAgICAgICBiLmx0ICAgICAgICAgICAgNGYKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YxOC40cyx2MTkuNHN9LCBbeDJdLCAgIzMyCisKKyAgICAgICAgZm1scyAgICAgICAgICAgIHY0LjRzLCAgdjMuNHMsICB2Ny40cworICAgICAgICBmbWxhICAgICAgICAgICAgdjUuNHMsICB2My40cywgIHY2LjRzCisKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MjIuNHMsdjIzLjRzfSwgW3gxXSwgICMzMgorCisgICAgICAgIGZzdWIgICAgICAgICAgICB2Mi40cywgIHYwLjRzLCAgdjQuNHMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYwLjRzLCAgdjAuNHMsICB2NC40cworICAgICAgICBmc3ViICAgICAgICAgICAgdjMuNHMsICB2MS40cywgIHY1LjRzCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MS40cywgIHYxLjRzLCAgdjUuNHMKKworICAgICAgICB1enAxICAgICAgICAgICAgdjE2LjRzLCB2MTguNHMsIHYxOS40cworICAgICAgICB1enAyICAgICAgICAgICAgdjE3LjRzLCB2MTguNHMsIHYxOS40cworCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djIuNHMsdjMuNHN9LCBbeDVdLCAgIzMyCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djAuNHMsdjEuNHN9LCBbeDRdLCAgIzMyCisgICAgICAgIGxkMiAgICAgICAgICAgICB7djIwLjRzLHYyMS40c30sIFt4MF0sICAjMzIKKworICAgICAgICBmbXVsICAgICAgICAgICAgdjE4LjRzLCB2MjIuNHMsIHYxNi40cworICAgICAgICBmbXVsICAgICAgICAgICAgdjE5LjRzLCB2MjIuNHMsIHYxNy40cworICAgICAgICBiLmVxICAgICAgICAgICAgMGYKKworICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzLHY1LjRzfSwgW3gyXSwgICMzMgorCisgICAgICAgIGZtbHMgICAgICAgICAgICB2MTguNHMsIHYyMy40cywgdjE3LjRzCisgICAgICAgIGZtbGEgICAgICAgICAgICB2MTkuNHMsIHYyMy40cywgdjE2LjRzCisKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2Mi40cyx2My40c30sIFt4MV0sICAjMzIKKworICAgICAgICBmc3ViICAgICAgICAgICAgdjIyLjRzLCB2MjAuNHMsIHYxOC40cworICAgICAgICBmYWRkICAgICAgICAgICAgdjIwLjRzLCB2MjAuNHMsIHYxOC40cworICAgICAgICBmc3ViICAgICAgICAgICAgdjIzLjRzLCB2MjEuNHMsIHYxOS40cworICAgICAgICBmYWRkICAgICAgICAgICAgdjIxLjRzLCB2MjEuNHMsIHYxOS40cworCisgICAgICAgIHV6cDEgICAgICAgICAgICB2Ni40cywgIHY0LjRzLCAgdjUuNHMKKyAgICAgICAgdXpwMiAgICAgICAgICAgIHY3LjRzLCAgdjQuNHMsICB2NS40cworCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djIyLjRzLHYyMy40c30sIFt4NV0sICAjMzIKKyAgICAgICAgc3QyICAgICAgICAgICAgIHt2MjAuNHMsdjIxLjRzfSwgW3g0XSwgICMzMgorICAgICAgICBsZDIgICAgICAgICAgICAge3YwLjRzLHYxLjRzfSwgW3gwXSwgICMzMgorCisgICAgICAgIGIgICAgICAgICAgICAgICA4YgorNDoKKyAgICAgICAgZm1scyAgICAgICAgICAgIHY0LjRzLCAgdjMuNHMsICB2Ny40cworICAgICAgICBmbWxhICAgICAgICAgICAgdjUuNHMsICB2My40cywgIHY2LjRzCisKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYyLjRzLCAgdjAuNHMsICB2NC40cworICAgICAgICBmYWRkICAgICAgICAgICAgdjAuNHMsICB2MC40cywgIHY0LjRzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2My40cywgIHYxLjRzLCAgdjUuNHMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYxLjRzLCAgdjEuNHMsICB2NS40cworCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djIuNHMsdjMuNHN9LCBbeDVdLCAgIzMyCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djAuNHMsdjEuNHN9LCBbeDRdLCAgIzMyCisKKyAgICAgICAgcmV0CiswOgorICAgICAgICBmbWxzICAgICAgICAgICAgdjE4LjRzLCB2MjMuNHMsIHYxNy40cworICAgICAgICBmbWxhICAgICAgICAgICAgdjE5LjRzLCB2MjMuNHMsIHYxNi40cworCisgICAgICAgIGZzdWIgICAgICAgICAgICB2MjIuNHMsIHYyMC40cywgdjE4LjRzCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MjAuNHMsIHYyMC40cywgdjE4LjRzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2MjMuNHMsIHYyMS40cywgdjE5LjRzCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MjEuNHMsIHYyMS40cywgdjE5LjRzCisKKyAgICAgICAgc3QyICAgICAgICAgICAgIHt2MjIuNHMsdjIzLjRzfSwgW3g1XSwgICMzMgorICAgICAgICBzdDIgICAgICAgICAgICAge3YyMC40cyx2MjEuNHN9LCBbeDRdLCAgIzMyCisKKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmdDMwX25lb24sIGFsaWduPTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMHgyMAorICAgICAgICBzdHAgICAgICAgICAgICAgeDIwLCB4MjEsIFtzcF0KKyAgICAgICAgc3RwICAgICAgICAgICAgIHgyMiwgeDMwLCBbc3AsICMweDEwXQorICAgICAgICBtb3YgICAgICAgICAgICAgeDIxLCB4MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDIyLCB4MgorICAgICAgICBtb3YgICAgICAgICAgICAgeDIwLCB4NAorICAgICAgICBtb3YgICAgICAgICAgICAgeDAsICB4MjEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxLCAgeDIyCisgICAgICAgIGxzbCAgICAgICAgICAgICB4MywgIHgyMCwgIzEKKyAgICAgICAgYmwgICAgICAgICAgICAgIGZmdDE1X25lb24KKworICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MjEsICMxNSo4CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgIHgyMiwgeDIwLCAgbHNsICMzCisgICAgICAgIGxzbCAgICAgICAgICAgICB4MywgIHgyMCwgIzEKKyAgICAgICAgYmwgICAgICAgICAgICAgIGZmdDE1X25lb24KKworICAgICAgICBsZHIgICAgICAgICAgICAgeDIsICBbeDEwLCAjKENFTFRfRVhQVEFCICsgOCldICAvLyBzLT5leHB0YWJbMV0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDIxLCAjMAorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MjEsICMxNSo4CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgICMxNQorICAgICAgICBsZHAgICAgICAgICAgICAgeDIwLCB4MjEsIFtzcF0KKyAgICAgICAgbGRwICAgICAgICAgICAgIHgyMiwgeDMwLCBbc3AsICMweDEwXQorICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMweDIwCisgICAgICAgIGIgICAgICAgICAgICAgICBmZnQxNV9wYXNzCitlbmRmdW5jCisKKy5tYWNybyAgZGVmX2ZmdCBuLCBuMgorZnVuY3Rpb24gZmZ0XG5cKClfbmVvbiwgYWxpZ249NgorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMweDMwCisgICAgICAgIHN0cCAgICAgICAgICAgICB4MjAsIHgyMSwgW3NwXQorICAgICAgICBzdHAgICAgICAgICAgICAgeDIyLCB4MzAsIFtzcCwgIzB4MTBdCisgICAgICAgIHN0cCAgICAgICAgICAgICB4MjMsIHgyNCwgW3NwLCAjMHgyMF0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgyMSwgeDEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgyMiwgeDIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgyMywgeDMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgyMCwgeDQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgzLCAgeDMsICAjMQorICAgICAgICBsc2wgICAgICAgICAgICAgeDQsICB4NCwgICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBmZnRcbjJcKClfbmVvbgorCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgIHgyMSwgIyhcbjIgKiA4KQorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MjIsIHgyMCwgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MywgIHgyMywgIzEKKyAgICAgICAgbHNsICAgICAgICAgICAgIHg0LCAgeDIwLCAjMQorICAgICAgICBibCAgICAgICAgICAgICAgZmZ0XG4yXCgpX25lb24KKworICAgICAgICBhZGQgICAgICAgICAgICAgeDUsICB4MTAsICNDRUxUX0VYUFRBQgorICAgICAgICBtb3YgICAgICAgICAgICAgeDAsICB4MjEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHgyLCAgW3g1LCAgeDIzLCBsc2wgIzNdIC8vIHMtPmV4cHRhYltOXQorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4MjEsICMoXG4yICogOCkKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgI1xuMgorICAgICAgICBsZHAgICAgICAgICAgICAgeDIwLCB4MjEsIFtzcF0KKyAgICAgICAgbGRwICAgICAgICAgICAgIHgyMiwgeDMwLCBbc3AsICMweDEwXQorICAgICAgICBsZHAgICAgICAgICAgICAgeDIzLCB4MjQsIFtzcCwgIzB4MjBdCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzB4MzAKKyAgICAgICAgYiAgICAgICAgICAgICAgIGZmdDE1X3Bhc3MKK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgZGVmX2ZmdCAgICA2MCwgIDMwCisgICAgICAgIGRlZl9mZnQgICAxMjAsICA2MAorICAgICAgICBkZWZfZmZ0ICAgMjQwLCAxMjAKKyAgICAgICAgZGVmX2ZmdCAgIDQ4MCwgMjQwCisgICAgICAgIGRlZl9mZnQgICA5NjAsIDQ4MAorCitmdW5jdGlvbiBmZnRfYjE1X2NhbGNfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMweDUwCisgICAgICAgIGxkciAgICAgICAgICAgICB4OCwgIFt4MCwgICNDRUxUX0VYUFRBQl0gICAgLy8gcy0+ZXhwdGFiWzBdCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4NiwgIGZhY3Q1CisgICAgICAgIG1vdnJlbCAgICAgICAgICB4MTEsIHNodWZmbGVfMDIxMworICAgICAgICBtb3ZyZWwgICAgICAgICAgeDEyLCBzaHVmZmxlXzEwMzIKKyAgICAgICAgbW92cmVsICAgICAgICAgIHgxMywgc2h1ZmZsZV8yMzAxCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4MTQsIHNodWZmbGVfMzEyMAorICAgICAgICBhZGQgICAgICAgICAgICAgeDgsICB4OCwgICM4CisgICAgICAgIG1vdnJlbCAgICAgICAgICB4NSwgIGZmdF90YWJfbmVvbgorICAgICAgICBzdHAgICAgICAgICAgICAgeDIwLCB4MzAsIFtzcF0KKyAgICAgICAgc3RwICAgICAgICAgICAgIGQ4LCAgZDksICBbc3AsICMweDEwXQorICAgICAgICBzdHAgICAgICAgICAgICAgZDEwLCBkMTEsIFtzcCwgIzB4MjBdCisgICAgICAgIHN0cCAgICAgICAgICAgICBkMTIsIGQxMywgW3NwLCAjMHgzMF0KKyAgICAgICAgc3RwICAgICAgICAgICAgIGQxNCwgZDE1LCBbc3AsICMweDQwXQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNS40c30sIFt4Nl0KKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40cyx2MS40c30sICAgW3g4XSwgICMzMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjJzfSwgIFt4OF0sICAjOAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRzLHYzLjRzfSwgICBbeDhdLCAgIzMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuMnN9LCAgW3g4XSwgICM4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHMsdjUuNHN9LCAgIFt4OF0sICAjMzIKKyAgICAgICAgdXpwMSAgICAgICAgICAgIHY4LjRzLCAgdjAuNHMsICB2MS40cyAgIC8vIGV4cFsgMSAtICA0XS5yZQorICAgICAgICB1enAyICAgICAgICAgICAgdjkuNHMsICB2MC40cywgIHYxLjRzICAgLy8gZXhwWyAxIC0gIDRdLmltCisgICAgICAgIHV6cDEgICAgICAgICAgICB2MTAuNHMsIHYyLjRzLCAgdjMuNHMgICAvLyBleHBbIDYgLSAgOV0ucmUKKyAgICAgICAgdXpwMiAgICAgICAgICAgIHYxMS40cywgdjIuNHMsICB2My40cyAgIC8vIGV4cFsgNiAtICA5XS5pbQorICAgICAgICB1enAxICAgICAgICAgICAgdjEyLjRzLCB2NC40cywgIHY1LjRzICAgLy8gZXhwWzExIC0gMTRdLnJlCisgICAgICAgIHV6cDIgICAgICAgICAgICB2MTMuNHMsIHY0LjRzLCAgdjUuNHMgICAvLyBleHBbMTEgLSAxNF0uaW0KKyAgICAgICAgemlwMSAgICAgICAgICAgIHYxNC40cywgdjYuNHMsICB2Ny40cyAgIC8vIGV4cFs1LDEwXS5yZS9leHBbNSwxMF0uaW0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHg2LCAgW3g1LCB4MywgbHNsICMzXQorICAgICAgICBhZGQgICAgICAgICAgICAgeDUsICB4NSwgIHg2CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTAsIHgwCisgICAgICAgIGJsciAgICAgICAgICAgICB4NQorICAgICAgICBsZHAgICAgICAgICAgICAgeDIwLCB4MzAsIFtzcF0KKyAgICAgICAgbGRwICAgICAgICAgICAgIGQ4LCAgZDksICBbc3AsICMweDEwXQorICAgICAgICBsZHAgICAgICAgICAgICAgZDEwLCBkMTEsIFtzcCwgIzB4MjBdCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTIsIGQxMywgW3NwLCAjMHgzMF0KKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxNCwgZDE1LCBbc3AsICMweDQwXQorICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMweDUwCisgICAgICAgIHJldAorZW5kZnVuYworCitjb25zdCAgIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQxNV9uZW9uICAtIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQzMF9uZW9uICAtIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQ2MF9uZW9uICAtIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQxMjBfbmVvbiAtIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQyNDBfbmVvbiAtIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQ0ODBfbmVvbiAtIGZmdF90YWJfbmVvbgorICAgICAgICAucXVhZCBmZnQ5NjBfbmVvbiAtIGZmdF90YWJfbmVvbgorZW5kY29uc3QKKworZnVuY3Rpb24gZmZfY2VsdF9pbWRjdF9oYWxmX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzB4MjAKKyAgICAgICAgc3RwICAgICAgICAgICAgIHgyMSwgeDMwLCBbc3BdCisgICAgICAgIHN0ciAgICAgICAgICAgICBzMCwgW3NwLCAjMHgxMF0KKworICAgICAgICBsZHAgICAgICAgICAgICAgdzUsICB3NiwgIFt4MCwgICNDRUxUX0xFTjJdIC8vIENFTFRfTEVONAorICAgICAgICBtb3YgICAgICAgICAgICAgeDEwLCB4MAorICAgICAgICBtb3YgICAgICAgICAgICAgeDIxLCB4MQorICAgICAgICBzdWIgICAgICAgICAgICAgdzUsICB3NSwgICMxCisgICAgICAgIGxzbCAgICAgICAgICAgICB4NywgIHgzLCAgIzMgICAgICAgICAgICAvLyAgMiAqIHN0cmlkZSAqIHNpemVvZihmbG9hdCkKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg4LCAgeHpyLCB4MywgIGxzbCAjMyAgIC8vIC0yICogc3RyaWRlICogc2l6ZW9mKGZsb2F0KQorICAgICAgICBtdWwgICAgICAgICAgICAgeDUsICB4NSwgIHgzCisgICAgICAgIGxkcCAgICAgICAgICAgICB4OSwgIHgxMCwgW3gwLCAgI0NFTFRfVE1QXSAgLy8gQ0VMVF9UV0lERExFCisgICAgICAgIGxkciAgICAgICAgICAgICB3MywgIFt4MCwgI0NFTFRfRkZUX05dCisgICAgICAgIGFkZCAgICAgICAgICAgICB4NSwgIHgyLCAgeDUsICBsc2wgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMSwgeDkKKworICAgICAgICBzdWIgICAgICAgICAgICAgdzYsICB3NiwgICM0CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuc31bMF0sICBbeDVdLCB4OAorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLnN9WzBdLCAgW3gyXSwgeDcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40cyx2NS40c30sIFt4MTBdLCAjMzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5zfVsxXSwgIFt4NV0sIHg4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuc31bMV0sICBbeDJdLCB4NworICAgICAgICB1enAxICAgICAgICAgICAgdjIuNHMsICB2NC40cywgIHY1LjRzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuc31bMl0sICBbeDVdLCB4OAorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLnN9WzJdLCAgW3gyXSwgeDcKKyAgICAgICAgdXpwMiAgICAgICAgICAgIHYzLjRzLCAgdjQuNHMsICB2NS40cworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLnN9WzNdLCAgW3g1XSwgeDgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS5zfVszXSwgIFt4Ml0sIHg3CisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgdzYsICB3NiwgICM0CisKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuc31bMF0sIFt4NV0sIHg4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLnN9WzBdLCBbeDJdLCB4NworICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzLHY1LjRzfSwgW3gxMF0sICMzMgorCisgICAgICAgIGZtdWwgICAgICAgICAgICB2Ni40cywgIHYwLjRzLCAgdjIuNHMKKyAgICAgICAgZm11bCAgICAgICAgICAgIHY3LjRzLCAgdjAuNHMsICB2My40cworCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLnN9WzFdLCBbeDVdLCB4OAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMS5zfVsxXSwgW3gyXSwgeDcKKworICAgICAgICBmbWxzICAgICAgICAgICAgdjYuNHMsICB2MS40cywgIHYzLjRzCisgICAgICAgIGZtbGEgICAgICAgICAgICB2Ny40cywgIHYxLjRzLCAgdjIuNHMKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC5zfVsyXSwgW3g1XSwgeDgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuc31bMl0sIFt4Ml0sIHg3CisKKyAgICAgICAgdXpwMSAgICAgICAgICAgIHYyLjRzLCAgdjQuNHMsICB2NS40cworICAgICAgICB1enAyICAgICAgICAgICAgdjMuNHMsICB2NC40cywgIHY1LjRzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLnN9WzNdLCBbeDVdLCB4OAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMS5zfVszXSwgW3gyXSwgeDcKKworICAgICAgICB6aXAxICAgICAgICAgICAgdjQuNHMsICB2Ni40cywgIHY3LjRzCisgICAgICAgIHppcDIgICAgICAgICAgICB2NS40cywgIHY2LjRzLCAgdjcuNHMKKworICAgICAgICBmbXVsICAgICAgICAgICAgdjYuNHMsICB2MjAuNHMsIHYyLjRzCisgICAgICAgIGZtdWwgICAgICAgICAgICB2Ny40cywgIHYyMC40cywgdjMuNHMKKworICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjRzLHY1LjRzfSwgW3g5XSwgIzMyCisKKyAgICAgICAgZm1scyAgICAgICAgICAgIHY2LjRzLCAgdjIxLjRzLCB2My40cworICAgICAgICBmbWxhICAgICAgICAgICAgdjcuNHMsICB2MjEuNHMsIHYyLjRzCisKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDNmCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHc2LCAgdzYsICAjNAorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzLHY1LjRzfSwgW3gxMF0sICMzMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLnN9WzBdLCAgW3g1XSwgeDgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS5zfVswXSwgIFt4Ml0sIHg3CisgICAgICAgIHV6cDEgICAgICAgICAgICB2Mi40cywgIHY0LjRzLCAgdjUuNHMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5zfVsxXSwgIFt4NV0sIHg4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuc31bMV0sICBbeDJdLCB4NworICAgICAgICB1enAyICAgICAgICAgICAgdjMuNHMsICB2NC40cywgIHY1LjRzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuc31bMl0sICBbeDVdLCB4OAorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLnN9WzJdLCAgW3gyXSwgeDcKKyAgICAgICAgemlwMSAgICAgICAgICAgIHY0LjRzLCAgdjYuNHMsICB2Ny40cworICAgICAgICB6aXAyICAgICAgICAgICAgdjUuNHMsICB2Ni40cywgIHY3LjRzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuc31bM10sICBbeDVdLCB4OAorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLnN9WzNdLCAgW3gyXSwgeDcKKworICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjRzLHY1LjRzfSwgW3g5XSwgIzMyCisKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFiCisKKyAgICAgICAgZm11bCAgICAgICAgICAgIHY2LjRzLCAgdjAuNHMsICB2Mi40cworICAgICAgICBmbXVsICAgICAgICAgICAgdjcuNHMsICB2MC40cywgIHYzLjRzCisgICAgICAgIGZtbHMgICAgICAgICAgICB2Ni40cywgIHYxLjRzLCAgdjMuNHMKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHY3LjRzLCAgdjEuNHMsICB2Mi40cworMzoKKyAgICAgICAgemlwMSAgICAgICAgICAgIHY0LjRzLCAgdjYuNHMsICB2Ny40cworICAgICAgICB6aXAyICAgICAgICAgICAgdjUuNHMsICB2Ni40cywgIHY3LjRzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNHMsdjUuNHN9LCBbeDldLCAjMzIKKworICAgICAgICBtb3YgICAgICAgICAgICAgeDIsICB4MTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg0LCAgIzEKKworICAgICAgICBibCAgICAgICAgICAgICAgZmZ0X2IxNV9jYWxjX25lb24KKworICAgICAgICBsZHIgICAgICAgICAgICAgdzUsICBbeDEwLCAjQ0VMVF9MRU40XQorICAgICAgICBsZHIgICAgICAgICAgICAgeDYsICBbeDEwLCAjQ0VMVF9UV0lERExFXQorICAgICAgICBsZHIgICAgICAgICAgICAgczMxLCBbc3AsICMweDEwXQorCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgIHgyMSwgeDUsICBsc2wgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgzLCAgeDYsICB4NSwgIGxzbCAjMgorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MSwgICMxNgorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MywgICMxNgorICAgICAgICBtb3YgICAgICAgICAgICAgeDgsICAjLTE2CisgICAgICAgIG1vdiAgICAgICAgICAgICB4NywgICMxNgorICAgICAgICBtb3YgICAgICAgICAgICAgeDEwLCB4MAorICAgICAgICBtb3YgICAgICAgICAgICAgeDExLCB4MQorCisgICAgICAgIHN1YiAgICAgICAgICAgICB3NSwgIHc1LCAgIzQKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRzfSwgIFt4MF0sIHg4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNHN9LCAgW3gxXSwgeDcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi40c30sICBbeDJdLCB4OAorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjRzfSwgIFt4M10sIHg3CisKKyAgICAgICAgdXpwMSAgICAgICAgICAgIHY0LjRzLCAgdjAuNHMsICB2MS40cyAgIC8vIHpbLWktMiwgLWktMSwgK2ksIGkrMV0ucmUKKyAgICAgICAgdXpwMiAgICAgICAgICAgIHY2LjRzLCAgdjAuNHMsICB2MS40cyAgIC8vIHpbLWktMiwgLWktMSwgK2ksIGkrMV0uaW0KKworICAgICAgICB1enAxICAgICAgICAgICAgdjUuNHMsICB2Mi40cywgIHYzLjRzICAgLy8gdHdpZGxsZV9leHB0YWJbLWktMiwgLWktMSwgK2ksIGkrMV0ucmUKKyAgICAgICAgdXpwMiAgICAgICAgICAgIHY3LjRzLCAgdjIuNHMsICB2My40cyAgIC8vIHR3aWRsbGVfZXhwdGFiWy1pLTIsIC1pLTEsICtpLCBpKzFdLmltCisKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYxLjRzLCAgdjYuNHMsICB2NS40cworICAgICAgICBmbXVsICAgICAgICAgICAgdjAuNHMsICB2Ni40cywgIHY3LjRzCisyOgorICAgICAgICBzdWJzICAgICAgICAgICAgdzUsICB3NSwgICM0CisKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuNHN9LCBbeDBdLCB4OAorCisgICAgICAgIGZtbGEgICAgICAgICAgICB2MS40cywgIHY0LjRzLCAgdjcuNHMKKyAgICAgICAgZm1scyAgICAgICAgICAgIHYwLjRzLCAgdjQuNHMsICB2NS40cworCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLjRzfSwgW3gxXSwgeDcKKworICAgICAgICBleHQgICAgICAgICAgICAgdjEuMTZiLCB2MS4xNmIsIHYxLjE2YiwgIzgKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYwLjRzLCAgdjAuNHMsICB2MzEuc1swXQorCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNHN9LCAgW3gyXSwgeDgKKworICAgICAgICByZXY2NCAgICAgICAgICAgdjEuNHMsICB2MS40cworICAgICAgICBmbXVsICAgICAgICAgICAgdjEuNHMsICB2MS40cywgIHYzMS5zWzBdCisKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My40c30sICBbeDNdLCB4NworCisgICAgICAgIHppcDEgICAgICAgICAgICB2NS40cywgIHYwLjRzLCAgdjEuNHMKKyAgICAgICAgemlwMiAgICAgICAgICAgIHY3LjRzLCAgdjAuNHMsICB2MS40cworCisgICAgICAgIHV6cDEgICAgICAgICAgICB2NC40cywgIHYyMC40cywgdjIxLjRzICAvLyB6Wy1pLTIsIC1pLTEsICtpLCBpKzFdLnJlCisgICAgICAgIHV6cDIgICAgICAgICAgICB2Ni40cywgIHYyMC40cywgdjIxLjRzICAvLyB6Wy1pLTIsIC1pLTEsICtpLCBpKzFdLmltCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS40c30sICBbeDEwXSwgeDgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny40c30sICBbeDExXSwgeDcKKworICAgICAgICB1enAxICAgICAgICAgICAgdjUuNHMsICB2Mi40cywgIHYzLjRzICAgLy8gdHdpZGxsZV9leHB0YWJbLWktMiwgLWktMSwgK2ksIGkrMV0ucmUKKyAgICAgICAgdXpwMiAgICAgICAgICAgIHY3LjRzLCAgdjIuNHMsICB2My40cyAgIC8vIHR3aWRsbGVfZXhwdGFiWy1pLTIsIC1pLTEsICtpLCBpKzFdLmltCisKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYxLjRzLCAgdjYuNHMsICB2NS40cworICAgICAgICBmbXVsICAgICAgICAgICAgdjAuNHMsICB2Ni40cywgIHY3LjRzCisgICAgICAgIGIuZ3QgICAgICAgICAgICAyYgorCisgICAgICAgIGZtbGEgICAgICAgICAgICB2MS40cywgIHY0LjRzLCAgdjcuNHMKKyAgICAgICAgZm1scyAgICAgICAgICAgIHYwLjRzLCAgdjQuNHMsICB2NS40cworICAgICAgICBleHQgICAgICAgICAgICAgdjEuMTZiLCB2MS4xNmIsIHYxLjE2YiwgIzgKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYwLjRzLCAgdjAuNHMsICB2MzEuc1swXQorICAgICAgICByZXY2NCAgICAgICAgICAgdjEuNHMsICB2MS40cworICAgICAgICBmbXVsICAgICAgICAgICAgdjEuNHMsICB2MS40cywgIHYzMS5zWzBdCisgICAgICAgIHppcDEgICAgICAgICAgICB2NS40cywgIHYwLjRzLCAgdjEuNHMKKyAgICAgICAgemlwMiAgICAgICAgICAgIHY3LjRzLCAgdjAuNHMsICB2MS40cworICAgICAgICBzdDEgICAgICAgICAgICAge3Y1LjRzfSwgIFt4MTBdLCB4OAorICAgICAgICBzdDEgICAgICAgICAgICAge3Y3LjRzfSwgIFt4MTFdLCB4NworCisgICAgICAgIGxkcCAgICAgICAgICAgICB4MjEsIHgzMCwgW3NwXQorICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMweDIwCisgICAgICAgIHJldAorZW5kZnVuYworCisvLyBbMF0gPSBleHAoMiAqIGkgKiBwaSAvIDUpLCBbMV0gPSBleHAoMiAqIGkgKiBwaSAqIDIgLyA1KQorY29uc3QgICBmYWN0NSwgICAgICAgICAgYWxpZ249NAorICAgICAgICAuZmxvYXQgICAgICAgICAgIDAuMzA5MDE2OTk0Mzc0OTQ3NDUsIDAuOTUxMDU2NTE2Mjk1MTUzNTMKKyAgICAgICAgLmZsb2F0ICAgICAgICAgIC0wLjgwOTAxNjk5NDM3NDk0NzM0LCAwLjU4Nzc4NTI1MjI5MjQ3MzI1CitlbmRjb25zdApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9ydjQwZHNwX2luaXRfYWFyY2g2NC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC9ydjQwZHNwX2luaXRfYWFyY2g2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NGJjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L3J2NDBkc3BfaW5pdF9hYXJjaDY0LmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3J2MzRkc3AuaCIKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCit2b2lkIGZmX3B1dF9ydjQwX2Nocm9tYV9tYzhfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9wdXRfcnY0MF9jaHJvbWFfbWM0X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KTsKKwordm9pZCBmZl9hdmdfcnY0MF9jaHJvbWFfbWM4X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX3J2NDBfY2hyb21hX21jNF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSk7CisKK2F2X2NvbGQgdm9pZCBmZl9ydjQwZHNwX2luaXRfYWFyY2g2NChSVjM0RFNQQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnB1dF9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGZmX3B1dF9ydjQwX2Nocm9tYV9tYzhfbmVvbjsKKyAgICAgICAgYy0+cHV0X2Nocm9tYV9waXhlbHNfdGFiWzFdID0gZmZfcHV0X3J2NDBfY2hyb21hX21jNF9uZW9uOworICAgICAgICBjLT5hdmdfY2hyb21hX3BpeGVsc190YWJbMF0gPSBmZl9hdmdfcnY0MF9jaHJvbWFfbWM4X25lb247CisgICAgICAgIGMtPmF2Z19jaHJvbWFfcGl4ZWxzX3RhYlsxXSA9IGZmX2F2Z19ydjQwX2Nocm9tYV9tYzRfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L3ZjMWRzcF9pbml0X2FhcmNoNjQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvdmMxZHNwX2luaXRfYWFyY2g2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OWU1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L3ZjMWRzcF9pbml0X2FhcmNoNjQuYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdmMxZHNwLmgiCisKKyNpbmNsdWRlICJjb25maWcuaCIKKwordm9pZCBmZl9wdXRfdmMxX2Nocm9tYV9tYzhfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSk7Cit2b2lkIGZmX2F2Z192YzFfY2hyb21hX21jOF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfcHV0X3ZjMV9jaHJvbWFfbWM0X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfdmMxX2Nocm9tYV9tYzRfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSk7CisKK2F2X2NvbGQgdm9pZCBmZl92YzFkc3BfaW5pdF9hYXJjaDY0KFZDMURTUENvbnRleHQgKmRzcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGRzcC0+cHV0X25vX3JuZF92YzFfY2hyb21hX3BpeGVsc190YWJbMF0gPSBmZl9wdXRfdmMxX2Nocm9tYV9tYzhfbmVvbjsKKyAgICAgICAgZHNwLT5hdmdfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGZmX2F2Z192YzFfY2hyb21hX21jOF9uZW9uOworICAgICAgICBkc3AtPnB1dF9ub19ybmRfdmMxX2Nocm9tYV9waXhlbHNfdGFiWzFdID0gZmZfcHV0X3ZjMV9jaHJvbWFfbWM0X25lb247CisgICAgICAgIGRzcC0+YXZnX25vX3JuZF92YzFfY2hyb21hX3BpeGVsc190YWJbMV0gPSBmZl9hdmdfdmMxX2Nocm9tYV9tYzRfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L3ZpZGVvZHNwLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L3ZpZGVvZHNwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwNjdjYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvdmlkZW9kc3AuUwpAQCAtMCwwICsxLDI4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9hc20uUyIKKworZnVuY3Rpb24gZmZfcHJlZmV0Y2hfYWFyY2g2NCwgZXhwb3J0PTEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHcyLCAgdzIsICAjMgorICAgICAgICBwcmZtICAgICAgICAgICAgcGxkbDFzdHJtLCBbeDBdCisgICAgICAgIHByZm0gICAgICAgICAgICBwbGRsMXN0cm0sIFt4MCwgIHgxXQorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgIHgxLCAgbHNsICMxCisgICAgICAgIGIuZ3QgICAgICAgICAgICBYKGZmX3ByZWZldGNoX2FhcmNoNjQpCisgICAgICAgIHJldAorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC92aWRlb2RzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L3ZpZGVvZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjY2N2E2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC92aWRlb2RzcF9pbml0LmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92aWRlb2RzcC5oIgorCit2b2lkIGZmX3ByZWZldGNoX2FhcmNoNjQodWludDhfdCAqbWVtLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCk7CisKK2F2X2NvbGQgdm9pZCBmZl92aWRlb2RzcF9pbml0X2FhcmNoNjQoVmlkZW9EU1BDb250ZXh0ICpjdHgsIGludCBicGMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX2FybXY4KGNwdV9mbGFncykpCisgICAgICAgIGN0eC0+cHJlZmV0Y2ggPSBmZl9wcmVmZXRjaF9hYXJjaDY0OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC92b3JiaXNkc3BfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFyY2g2NC92b3JiaXNkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTZmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L3ZvcmJpc2RzcF9pbml0LmMKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92b3JiaXNkc3AuaCIKKwordm9pZCBmZl92b3JiaXNfaW52ZXJzZV9jb3VwbGluZ19uZW9uKGZsb2F0ICptYWcsIGZsb2F0ICphbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgYmxvY2tzaXplKTsKKworYXZfY29sZCB2b2lkIGZmX3ZvcmJpc2RzcF9pbml0X2FhcmNoNjQoVm9yYmlzRFNQQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnZvcmJpc19pbnZlcnNlX2NvdXBsaW5nID0gZmZfdm9yYmlzX2ludmVyc2VfY291cGxpbmdfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L3ZvcmJpc2RzcF9uZW9uLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYXJjaDY0L3ZvcmJpc2RzcF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2ZmVlYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FhcmNoNjQvdm9yYmlzZHNwX25lb24uUwpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMiCisKK2Z1bmN0aW9uIGZmX3ZvcmJpc19pbnZlcnNlX2NvdXBsaW5nX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MjAuNHMsICAjMTw8NywgbHNsICMyNAorICAgICAgICBzdWJzICAgICAgICAgICAgeDIsICB4MiwgICM0CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgIHgwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NCwgIHgxCisgICAgICAgIGIuZXEgICAgICAgICAgICAzZgorCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuNHN9LCAgW3gxXSwgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIGNtbGUgICAgICAgICAgICB2NC40cywgIHY3LjRzLCAgIzAKKyAgICAgICAgYW5kICAgICAgICAgICAgIHY1LjE2YiwgdjYuMTZiLCB2MjAuMTZiCisgICAgICAgIGVvciAgICAgICAgICAgICB2Ny4xNmIsIHY3LjE2YiwgdjUuMTZiCisgICAgICAgIGFuZCAgICAgICAgICAgICB2Mi4xNmIsIHY3LjE2YiwgdjQuMTZiCisgICAgICAgIGJpYyAgICAgICAgICAgICB2My4xNmIsIHY3LjE2YiwgdjQuMTZiCisgICAgICAgIGZhZGQgICAgICAgICAgICB2Ny40cywgIHY2LjRzLCAgdjIuNHMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHY2LjRzLCAgdjYuNHMsICB2My40cworMTogICAgICBsZDEgICAgICAgICAgICAge3YxLjRzfSwgIFt4MV0sICMxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRzfSwgIFt4MF0sICMxNgorICAgICAgICBjbWxlICAgICAgICAgICAgdjQuNHMsICB2MS40cywgICMwCisgICAgICAgIGFuZCAgICAgICAgICAgICB2NS4xNmIsIHYwLjE2YiwgdjIwLjE2YgorICAgICAgICBlb3IgICAgICAgICAgICAgdjEuMTZiLCB2MS4xNmIsIHY1LjE2YgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y3LjRzfSwgIFt4M10sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y2LjRzfSwgIFt4NF0sICMxNgorICAgICAgICBhbmQgICAgICAgICAgICAgdjIuMTZiLCB2MS4xNmIsIHY0LjE2YgorICAgICAgICBiaWMgICAgICAgICAgICAgdjMuMTZiLCB2MS4xNmIsIHY0LjE2YgorICAgICAgICBmYWRkICAgICAgICAgICAgdjEuNHMsICB2MC40cywgIHYyLjRzCisgICAgICAgIGZzdWIgICAgICAgICAgICB2MC40cywgIHYwLjRzLCAgdjMuNHMKKyAgICAgICAgc3VicyAgICAgICAgICAgIHgyLCAgeDIsICAjOAorICAgICAgICBiLmxlICAgICAgICAgICAgMmYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny40c30sICBbeDFdLCAjMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni40c30sICBbeDBdLCAjMTYKKyAgICAgICAgY21sZSAgICAgICAgICAgIHY0LjRzLCAgdjcuNHMsICAjMAorICAgICAgICBhbmQgICAgICAgICAgICAgdjUuMTZiLCB2Ni4xNmIsIHYyMC4xNmIKKyAgICAgICAgZW9yICAgICAgICAgICAgIHY3LjE2YiwgdjcuMTZiLCB2NS4xNmIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS40c30sICBbeDNdLCAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC40c30sICBbeDRdLCAjMTYKKyAgICAgICAgYW5kICAgICAgICAgICAgIHYyLjE2YiwgdjcuMTZiLCB2NC4xNmIKKyAgICAgICAgYmljICAgICAgICAgICAgIHYzLjE2YiwgdjcuMTZiLCB2NC4xNmIKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHY3LjRzLCAgdjYuNHMsICB2Mi40cworICAgICAgICBmc3ViICAgICAgICAgICAgdjYuNHMsICB2Ni40cywgIHYzLjRzCisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorCisyOiAgICAgIHN0MSAgICAgICAgICAgICB7djEuNHN9LCAgW3gzXSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuNHN9LCAgW3g0XSwgIzE2CisgICAgICAgIGIubHQgICAgICAgICAgICByZXQKKworMzogICAgICBsZDEgICAgICAgICAgICAge3YxLjRzfSwgIFt4MV0KKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40c30sICBbeDBdCisgICAgICAgIGNtbGUgICAgICAgICAgICB2NC40cywgIHYxLjRzLCAgIzAKKyAgICAgICAgYW5kICAgICAgICAgICAgIHY1LjE2YiwgdjAuMTZiLCB2MjAuMTZiCisgICAgICAgIGVvciAgICAgICAgICAgICB2MS4xNmIsIHYxLjE2YiwgdjUuMTZiCisgICAgICAgIGFuZCAgICAgICAgICAgICB2Mi4xNmIsIHYxLjE2YiwgdjQuMTZiCisgICAgICAgIGJpYyAgICAgICAgICAgICB2My4xNmIsIHYxLjE2YiwgdjQuMTZiCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MS40cywgIHYwLjRzLCAgdjIuNHMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYwLjRzLCAgdjAuNHMsICB2My40cworICAgICAgICBzdDEgICAgICAgICAgICAge3YxLjRzfSwgIFt4MF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLjRzfSwgIFt4MV0sICMxNgorcmV0OgorICAgICAgICByZXQKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2Fhc2MuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Fhc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWVmNzgyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWFzYy5jCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQXV0b2Rlc2sgUkxFIERlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQXV0b2Rlc2sgUkxFIFZpZGVvIERlY29kZXIgYnkgS29uc3RhbnRpbiBTaGlzaGtvdgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXNybGVkZWMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQWFzY0NvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBBVkZyYW1lICpmcmFtZTsKKworICAgIHVpbnQzMl90IHBhbGV0dGVbQVZQQUxFVFRFX0NPVU5UXTsKKyAgICBpbnQgcGFsZXR0ZV9zaXplOworfSBBYXNjQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGFhc2NfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFhc2NDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpwdHI7CisgICAgaW50IGk7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIHN3aXRjaCAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgIGNhc2UgODoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICAgICAgcHRyID0gYXZjdHgtPmV4dHJhZGF0YTsKKyAgICAgICAgcy0+cGFsZXR0ZV9zaXplID0gRkZNSU4oYXZjdHgtPmV4dHJhZGF0YV9zaXplLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5wYWxldHRlX3NpemUgLyA0OyBpKyspIHsKKyAgICAgICAgICAgIHMtPnBhbGV0dGVbaV0gPSAweEZGVSA8PCAyNCB8IEFWX1JMMzIocHRyKTsKKyAgICAgICAgICAgIHB0ciArPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjI0OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGJpdCBkZXB0aDogJWRcbiIsIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcy0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+ZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYXNjX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBBYXNjQ29udGV4dCAqcyAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBjb21wciwgaSwgc3RyaWRlLCBwc2l6ZSwgcmV0OworCisgICAgaWYgKGJ1Zl9zaXplIDwgNCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImZyYW1lIHRvbyBzaG9ydFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGNvbXByICAgICA9IEFWX1JMMzIoYnVmKTsKKyAgICBidWYgICAgICArPSA0OworICAgIGJ1Zl9zaXplIC09IDQ7CisgICAgcHNpemUgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC8gODsKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY190YWcpIHsKKyAgICBjYXNlIE1LVEFHKCdBJywgJ0EnLCAnUycsICc0Jyk6CisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmdiLCBidWYgLSA0LCBidWZfc2l6ZSArIDQpOworICAgICAgICBmZl9tc3JsZV9kZWNvZGUoYXZjdHgsIChBVlBpY3R1cmUqKXMtPmZyYW1lLCA4LCAmcy0+Z2IpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdBJywgJ0EnLCAnUycsICdDJyk6CisgICAgc3dpdGNoIChjb21wcikgeworICAgIGNhc2UgMDoKKyAgICAgICAgc3RyaWRlID0gKGF2Y3R4LT53aWR0aCAqIHBzaXplICsgcHNpemUpICYgfnBzaXplOworICAgICAgICBpZiAoYnVmX3NpemUgPCBzdHJpZGUgKiBhdmN0eC0+aGVpZ2h0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGZvciAoaSA9IGF2Y3R4LT5oZWlnaHQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbWVtY3B5KHMtPmZyYW1lLT5kYXRhWzBdICsgaSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXSwgYnVmLCBhdmN0eC0+d2lkdGggKiBwc2l6ZSk7CisgICAgICAgICAgICBidWYgKz0gc3RyaWRlOworICAgICAgICAgICAgYnVmX3NpemUgLT0gc3RyaWRlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+Z2IsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICBmZl9tc3JsZV9kZWNvZGUoYXZjdHgsIChBVlBpY3R1cmUqKXMtPmZyYW1lLCA4LCAmcy0+Z2IpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gY29tcHJlc3Npb24gdHlwZSAlZFxuIiwgY29tcHIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBGb3VyQ0M6ICVYXG4iLCBhdmN0eC0+Y29kZWNfdGFnKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpCisgICAgICAgIG1lbWNweShzLT5mcmFtZS0+ZGF0YVsxXSwgcy0+cGFsZXR0ZSwgcy0+cGFsZXR0ZV9zaXplKTsKKworICAgICpnb3RfZnJhbWUgPSAxOworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogcmVwb3J0IHRoYXQgdGhlIGJ1ZmZlciB3YXMgY29tcGxldGVseSBjb25zdW1lZCAqLworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFhc2NfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQWFzY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfYWFzY19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhYXNjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXV0b2Rlc2sgUkxFIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FBU0MsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFhc2NDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBhYXNjX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGFhc2NfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBhYXNjX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FjMy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWMzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllMTMyZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjMy5jCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogQ29tbW9uIGNvZGUgYmV0d2VlbiB0aGUgQUMtMyBlbmNvZGVyIGFuZCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENvbW1vbiBjb2RlIGJldHdlZW4gdGhlIEFDLTMgZW5jb2RlciBhbmQgZGVjb2Rlci4KKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImFjMy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisKKy8qKgorICogU3RhcnRpbmcgZnJlcXVlbmN5IGNvZWZmaWNpZW50IGJpbiBmb3IgZWFjaCBjcml0aWNhbCBiYW5kLgorICovCitjb25zdCB1aW50OF90IGZmX2FjM19iYW5kX3N0YXJ0X3RhYltBQzNfQ1JJVElDQUxfQkFORFMrMV0gPSB7CisgICAgICAwLCAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksCisgICAgIDEwLCAgMTEsIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksCisgICAgIDIwLCAgMjEsIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMzEsCisgICAgIDM0LCAgMzcsIDQwLCAgNDMsICA0NiwgIDQ5LCAgNTUsICA2MSwgIDY3LCAgNzMsCisgICAgIDc5LCAgODUsIDk3LCAxMDksIDEyMSwgMTMzLCAxNTcsIDE4MSwgMjA1LCAyMjksIDI1MworfTsKKworI2lmIENPTkZJR19IQVJEQ09ERURfVEFCTEVTCisKKy8qKgorICogTWFwIGVhY2ggZnJlcXVlbmN5IGNvZWZmaWNpZW50IGJpbiB0byB0aGUgY3JpdGljYWwgYmFuZCB0aGF0IGNvbnRhaW5zIGl0LgorICovCitjb25zdCB1aW50OF90IGZmX2FjM19iaW5fdG9fYmFuZF90YWJbMjUzXSA9IHsKKyAgICAgMCwKKyAgICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLAorICAgIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisgICAgMjUsIDI2LCAyNywgMjgsIDI4LCAyOCwgMjksIDI5LCAyOSwgMzAsIDMwLCAzMCwKKyAgICAzMSwgMzEsIDMxLCAzMiwgMzIsIDMyLCAzMywgMzMsIDMzLCAzNCwgMzQsIDM0LAorICAgIDM1LCAzNSwgMzUsIDM1LCAzNSwgMzUsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzgsIDM4LCAzOCwgMzgsIDM4LCAzOCwKKyAgICAzOSwgMzksIDM5LCAzOSwgMzksIDM5LCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLAorICAgIDQxLCA0MSwgNDEsIDQxLCA0MSwgNDEsIDQxLCA0MSwgNDEsIDQxLCA0MSwgNDEsCisgICAgNDIsIDQyLCA0MiwgNDIsIDQyLCA0MiwgNDIsIDQyLCA0MiwgNDIsIDQyLCA0MiwKKyAgICA0MywgNDMsIDQzLCA0MywgNDMsIDQzLCA0MywgNDMsIDQzLCA0MywgNDMsIDQzLAorICAgIDQ0LCA0NCwgNDQsIDQ0LCA0NCwgNDQsIDQ0LCA0NCwgNDQsIDQ0LCA0NCwgNDQsCisgICAgNDUsIDQ1LCA0NSwgNDUsIDQ1LCA0NSwgNDUsIDQ1LCA0NSwgNDUsIDQ1LCA0NSwKKyAgICA0NSwgNDUsIDQ1LCA0NSwgNDUsIDQ1LCA0NSwgNDUsIDQ1LCA0NSwgNDUsIDQ1LAorICAgIDQ2LCA0NiwgNDYsIDQ2LCA0NiwgNDYsIDQ2LCA0NiwgNDYsIDQ2LCA0NiwgNDYsCisgICAgNDYsIDQ2LCA0NiwgNDYsIDQ2LCA0NiwgNDYsIDQ2LCA0NiwgNDYsIDQ2LCA0NiwKKyAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ5LCA0OSwgNDksIDQ5LCA0OSwgNDksIDQ5LCA0OSwgNDksIDQ5LCA0OSwgNDksCisgICAgNDksIDQ5LCA0OSwgNDksIDQ5LCA0OSwgNDksIDQ5LCA0OSwgNDksIDQ5LCA0OQorfTsKKworI2Vsc2UgLyogQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMgKi8KK3VpbnQ4X3QgZmZfYWMzX2Jpbl90b19iYW5kX3RhYlsyNTNdOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IGNhbGNfbG93Y29tcDEoaW50IGEsIGludCBiMCwgaW50IGIxLCBpbnQgYykKK3sKKyAgICBpZiAoKGIwICsgMjU2KSA9PSBiMSkgeworICAgICAgICBhID0gYzsKKyAgICB9IGVsc2UgaWYgKGIwID4gYjEpIHsKKyAgICAgICAgYSA9IEZGTUFYKGEgLSA2NCwgMCk7CisgICAgfQorICAgIHJldHVybiBhOworfQorCitzdGF0aWMgaW5saW5lIGludCBjYWxjX2xvd2NvbXAoaW50IGEsIGludCBiMCwgaW50IGIxLCBpbnQgYmluKQoreworICAgIGlmIChiaW4gPCA3KSB7CisgICAgICAgIHJldHVybiBjYWxjX2xvd2NvbXAxKGEsIGIwLCBiMSwgMzg0KTsKKyAgICB9IGVsc2UgaWYgKGJpbiA8IDIwKSB7CisgICAgICAgIHJldHVybiBjYWxjX2xvd2NvbXAxKGEsIGIwLCBiMSwgMzIwKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRkZNQVgoYSAtIDEyOCwgMCk7CisgICAgfQorfQorCit2b2lkIGZmX2FjM19iaXRfYWxsb2NfY2FsY19wc2QoaW50OF90ICpleHAsIGludCBzdGFydCwgaW50IGVuZCwgaW50MTZfdCAqcHNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJhbmRfcHNkKQoreworICAgIGludCBiaW4sIGJhbmQ7CisKKyAgICAvKiBleHBvbmVudCBtYXBwaW5nIHRvIFBTRCAqLworICAgIGZvciAoYmluID0gc3RhcnQ7IGJpbiA8IGVuZDsgYmluKyspIHsKKyAgICAgICAgcHNkW2Jpbl09KDMwNzIgLSAoZXhwW2Jpbl0gPDwgNykpOworICAgIH0KKworICAgIC8qIFBTRCBpbnRlZ3JhdGlvbiAqLworICAgIGJpbiAgPSBzdGFydDsKKyAgICBiYW5kID0gZmZfYWMzX2Jpbl90b19iYW5kX3RhYltzdGFydF07CisgICAgZG8geworICAgICAgICBpbnQgdiA9IHBzZFtiaW4rK107CisgICAgICAgIGludCBiYW5kX2VuZCA9IEZGTUlOKGZmX2FjM19iYW5kX3N0YXJ0X3RhYltiYW5kKzFdLCBlbmQpOworICAgICAgICBmb3IgKDsgYmluIDwgYmFuZF9lbmQ7IGJpbisrKSB7CisgICAgICAgICAgICBpbnQgbWF4ID0gRkZNQVgodiwgcHNkW2Jpbl0pOworICAgICAgICAgICAgLyogbG9nYWRkICovCisgICAgICAgICAgICBpbnQgYWRyID0gRkZNSU4obWF4IC0gKCh2ICsgcHNkW2Jpbl0gKyAxKSA+PiAxKSwgMjU1KTsKKyAgICAgICAgICAgIHYgPSBtYXggKyBmZl9hYzNfbG9nX2FkZF90YWJbYWRyXTsKKyAgICAgICAgfQorICAgICAgICBiYW5kX3BzZFtiYW5kKytdID0gdjsKKyAgICB9IHdoaWxlIChlbmQgPiBmZl9hYzNfYmFuZF9zdGFydF90YWJbYmFuZF0pOworfQorCitpbnQgZmZfYWMzX2JpdF9hbGxvY19jYWxjX21hc2soQUMzQml0QWxsb2NQYXJhbWV0ZXJzICpzLCBpbnQxNl90ICpiYW5kX3BzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGludCBmYXN0X2dhaW4sIGludCBpc19sZmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRiYV9tb2RlLCBpbnQgZGJhX25zZWdzLCB1aW50OF90ICpkYmFfb2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYmFfbGVuZ3RocywgdWludDhfdCAqZGJhX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICptYXNrKQoreworICAgIGludDE2X3QgZXhjaXRlW0FDM19DUklUSUNBTF9CQU5EU107IC8qIGV4Y2l0YXRpb24gKi8KKyAgICBpbnQgYmFuZDsKKyAgICBpbnQgYmFuZF9zdGFydCwgYmFuZF9lbmQsIGJlZ2luLCBlbmQxOworICAgIGludCBsb3djb21wLCBmYXN0bGVhaywgc2xvd2xlYWs7CisKKyAgICAvKiBleGNpdGF0aW9uIGZ1bmN0aW9uICovCisgICAgYmFuZF9zdGFydCA9IGZmX2FjM19iaW5fdG9fYmFuZF90YWJbc3RhcnRdOworICAgIGJhbmRfZW5kICAgPSBmZl9hYzNfYmluX3RvX2JhbmRfdGFiW2VuZC0xXSArIDE7CisKKyAgICBpZiAoYmFuZF9zdGFydCA9PSAwKSB7CisgICAgICAgIGxvd2NvbXAgPSAwOworICAgICAgICBsb3djb21wID0gY2FsY19sb3djb21wMShsb3djb21wLCBiYW5kX3BzZFswXSwgYmFuZF9wc2RbMV0sIDM4NCk7CisgICAgICAgIGV4Y2l0ZVswXSA9IGJhbmRfcHNkWzBdIC0gZmFzdF9nYWluIC0gbG93Y29tcDsKKyAgICAgICAgbG93Y29tcCA9IGNhbGNfbG93Y29tcDEobG93Y29tcCwgYmFuZF9wc2RbMV0sIGJhbmRfcHNkWzJdLCAzODQpOworICAgICAgICBleGNpdGVbMV0gPSBiYW5kX3BzZFsxXSAtIGZhc3RfZ2FpbiAtIGxvd2NvbXA7CisgICAgICAgIGJlZ2luID0gNzsKKyAgICAgICAgZm9yIChiYW5kID0gMjsgYmFuZCA8IDc7IGJhbmQrKykgeworICAgICAgICAgICAgaWYgKCEoaXNfbGZlICYmIGJhbmQgPT0gNikpCisgICAgICAgICAgICAgICAgbG93Y29tcCA9IGNhbGNfbG93Y29tcDEobG93Y29tcCwgYmFuZF9wc2RbYmFuZF0sIGJhbmRfcHNkW2JhbmQrMV0sIDM4NCk7CisgICAgICAgICAgICBmYXN0bGVhayA9IGJhbmRfcHNkW2JhbmRdIC0gZmFzdF9nYWluOworICAgICAgICAgICAgc2xvd2xlYWsgPSBiYW5kX3BzZFtiYW5kXSAtIHMtPnNsb3dfZ2FpbjsKKyAgICAgICAgICAgIGV4Y2l0ZVtiYW5kXSA9IGZhc3RsZWFrIC0gbG93Y29tcDsKKyAgICAgICAgICAgIGlmICghKGlzX2xmZSAmJiBiYW5kID09IDYpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJhbmRfcHNkW2JhbmRdIDw9IGJhbmRfcHNkW2JhbmQrMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSBiYW5kICsgMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZW5kMSA9IEZGTUlOKGJhbmRfZW5kLCAyMik7CisgICAgICAgIGZvciAoYmFuZCA9IGJlZ2luOyBiYW5kIDwgZW5kMTsgYmFuZCsrKSB7CisgICAgICAgICAgICBpZiAoIShpc19sZmUgJiYgYmFuZCA9PSA2KSkKKyAgICAgICAgICAgICAgICBsb3djb21wID0gY2FsY19sb3djb21wKGxvd2NvbXAsIGJhbmRfcHNkW2JhbmRdLCBiYW5kX3BzZFtiYW5kKzFdLCBiYW5kKTsKKyAgICAgICAgICAgIGZhc3RsZWFrID0gRkZNQVgoZmFzdGxlYWsgLSBzLT5mYXN0X2RlY2F5LCBiYW5kX3BzZFtiYW5kXSAtIGZhc3RfZ2Fpbik7CisgICAgICAgICAgICBzbG93bGVhayA9IEZGTUFYKHNsb3dsZWFrIC0gcy0+c2xvd19kZWNheSwgYmFuZF9wc2RbYmFuZF0gLSBzLT5zbG93X2dhaW4pOworICAgICAgICAgICAgZXhjaXRlW2JhbmRdID0gRkZNQVgoZmFzdGxlYWsgLSBsb3djb21wLCBzbG93bGVhayk7CisgICAgICAgIH0KKyAgICAgICAgYmVnaW4gPSAyMjsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBjb3VwbGluZyBjaGFubmVsICovCisgICAgICAgIGJlZ2luID0gYmFuZF9zdGFydDsKKyAgICAgICAgZmFzdGxlYWsgPSAocy0+Y3BsX2Zhc3RfbGVhayA8PCA4KSArIDc2ODsKKyAgICAgICAgc2xvd2xlYWsgPSAocy0+Y3BsX3Nsb3dfbGVhayA8PCA4KSArIDc2ODsKKyAgICB9CisKKyAgICBmb3IgKGJhbmQgPSBiZWdpbjsgYmFuZCA8IGJhbmRfZW5kOyBiYW5kKyspIHsKKyAgICAgICAgZmFzdGxlYWsgPSBGRk1BWChmYXN0bGVhayAtIHMtPmZhc3RfZGVjYXksIGJhbmRfcHNkW2JhbmRdIC0gZmFzdF9nYWluKTsKKyAgICAgICAgc2xvd2xlYWsgPSBGRk1BWChzbG93bGVhayAtIHMtPnNsb3dfZGVjYXksIGJhbmRfcHNkW2JhbmRdIC0gcy0+c2xvd19nYWluKTsKKyAgICAgICAgZXhjaXRlW2JhbmRdID0gRkZNQVgoZmFzdGxlYWssIHNsb3dsZWFrKTsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIG1hc2tpbmcgY3VydmUgKi8KKworICAgIGZvciAoYmFuZCA9IGJhbmRfc3RhcnQ7IGJhbmQgPCBiYW5kX2VuZDsgYmFuZCsrKSB7CisgICAgICAgIGludCB0bXAgPSBzLT5kYl9wZXJfYml0IC0gYmFuZF9wc2RbYmFuZF07CisgICAgICAgIGlmICh0bXAgPiAwKSB7CisgICAgICAgICAgICBleGNpdGVbYmFuZF0gKz0gdG1wID4+IDI7CisgICAgICAgIH0KKyAgICAgICAgbWFza1tiYW5kXSA9IEZGTUFYKGZmX2FjM19oZWFyaW5nX3RocmVzaG9sZF90YWJbYmFuZCA+PiBzLT5zcl9zaGlmdF1bcy0+c3JfY29kZV0sIGV4Y2l0ZVtiYW5kXSk7CisgICAgfQorCisgICAgLyogZGVsdGEgYml0IGFsbG9jYXRpb24gKi8KKworICAgIGlmIChkYmFfbW9kZSA9PSBEQkFfUkVVU0UgfHwgZGJhX21vZGUgPT0gREJBX05FVykgeworICAgICAgICBpbnQgaSwgc2VnLCBkZWx0YTsKKyAgICAgICAgaWYgKGRiYV9uc2VncyA+IDgpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJhbmQgPSBiYW5kX3N0YXJ0OworICAgICAgICBmb3IgKHNlZyA9IDA7IHNlZyA8IGRiYV9uc2Vnczsgc2VnKyspIHsKKyAgICAgICAgICAgIGJhbmQgKz0gZGJhX29mZnNldHNbc2VnXTsKKyAgICAgICAgICAgIGlmIChiYW5kID49IEFDM19DUklUSUNBTF9CQU5EUyB8fCBkYmFfbGVuZ3Roc1tzZWddID4gQUMzX0NSSVRJQ0FMX0JBTkRTLWJhbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKGRiYV92YWx1ZXNbc2VnXSA+PSA0KSB7CisgICAgICAgICAgICAgICAgZGVsdGEgPSAoZGJhX3ZhbHVlc1tzZWddIC0gMykgPDwgNzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVsdGEgPSAoZGJhX3ZhbHVlc1tzZWddIC0gNCkgPDwgNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkYmFfbGVuZ3Roc1tzZWddOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtYXNrW2JhbmQrK10gKz0gZGVsdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBzb21lIHRhYmxlcy4KKyAqIG5vdGU6IFRoaXMgZnVuY3Rpb24gbXVzdCByZW1haW4gdGhyZWFkIHNhZmUgYmVjYXVzZSBpdCBpcyBjYWxsZWQgYnkgdGhlCisgKiAgICAgICBBVlBhcnNlciBpbml0IGNvZGUuCisgKi8KK2F2X2NvbGQgdm9pZCBmZl9hYzNfY29tbW9uX2luaXQodm9pZCkKK3sKKyNpZiAhQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKKyAgICAvKiBjb21wdXRlIGZmX2FjM19iaW5fdG9fYmFuZF90YWIgZnJvbSBmZl9hYzNfYmFuZF9zdGFydF90YWIgKi8KKyAgICBpbnQgYmluID0gMCwgYmFuZDsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgQUMzX0NSSVRJQ0FMX0JBTkRTOyBiYW5kKyspIHsKKyAgICAgICAgaW50IGJhbmRfZW5kID0gZmZfYWMzX2JhbmRfc3RhcnRfdGFiW2JhbmQrMV07CisgICAgICAgIHdoaWxlIChiaW4gPCBiYW5kX2VuZCkKKyAgICAgICAgICAgIGZmX2FjM19iaW5fdG9fYmFuZF90YWJbYmluKytdID0gYmFuZDsKKyAgICB9CisjZW5kaWYgLyogIUNPTkZJR19IQVJEQ09ERURfVEFCTEVTICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYzMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTY0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzMuaApAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvbW1vbiBjb2RlIGJldHdlZW4gdGhlIEFDLTMgZW5jb2RlciBhbmQgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDb21tb24gY29kZSBiZXR3ZWVuIHRoZSBBQy0zIGVuY29kZXIgYW5kIGRlY29kZXIuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FDM19ICisjZGVmaW5lIEFWQ09ERUNfQUMzX0gKKworI2RlZmluZSBBQzNfTUFYX0NPREVEX0ZSQU1FX1NJWkUgMzg0MCAvKiBpbiBieXRlcyAqLworI2RlZmluZSBBQzNfTUFYX0NIQU5ORUxTIDcgICAgICAgICAgICAvKio8IG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzLCBpbmNsdWRpbmcgY291cGxpbmcgY2hhbm5lbCAqLworI2RlZmluZSBDUExfQ0ggMCAgICAgICAgICAgICAgICAgICAgICAvKio8IGNvdXBsaW5nIGNoYW5uZWwgaW5kZXggKi8KKworI2RlZmluZSBBQzNfTUFYX0NPRUZTICAgMjU2CisjZGVmaW5lIEFDM19CTE9DS19TSVpFICAyNTYKKyNkZWZpbmUgQUMzX01BWF9CTE9DS1MgICAgNgorI2RlZmluZSBBQzNfRlJBTUVfU0laRSAoQUMzX01BWF9CTE9DS1MgKiAyNTYpCisjZGVmaW5lIEFDM19XSU5ET1dfU0laRSAoQUMzX0JMT0NLX1NJWkUgKiAyKQorI2RlZmluZSBBQzNfQ1JJVElDQUxfQkFORFMgNTAKKyNkZWZpbmUgQUMzX01BWF9DUExfQkFORFMgIDE4CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImFjM3RhYi5oIgorCisvKiBleHBvbmVudCBlbmNvZGluZyBzdHJhdGVneSAqLworI2RlZmluZSBFWFBfUkVVU0UgMAorI2RlZmluZSBFWFBfTkVXICAgMQorCisjZGVmaW5lIEVYUF9EMTUgICAxCisjZGVmaW5lIEVYUF9EMjUgICAyCisjZGVmaW5lIEVYUF9ENDUgICAzCisKKyNpZm5kZWYgVVNFX0ZJWEVECisjZGVmaW5lIFVTRV9GSVhFRCAwCisjZW5kaWYKKworI2lmIFVTRV9GSVhFRAorCisjZGVmaW5lIEZGVF9GTE9BVCAwCisKKyNkZWZpbmUgRklYUihhKSAgICAgICAgICAgICAgICAgKChpbnQpKChhKSAqIDAgKyAwLjUpKQorI2RlZmluZSBGSVhSMTIoYSkgICAgICAgICAgICAgICAoKGludCkoKGEpICogNDA5NiArIDAuNSkpCisjZGVmaW5lIEZJWFIxNShhKSAgICAgICAgICAgICAgICgoaW50KSgoYSkgKiAzMjc2OCArIDAuNSkpCisjZGVmaW5lIFJPVU5EMTUoeCkgICAgICAgICAgICAgICgoeCkgKyAxNjM4NCkgPj4gMTUKKworI2RlZmluZSBBQzNfUkVOQU1FKHgpICAgICAgICAgICB4ICMjIF9maXhlZAorI2RlZmluZSBBQzNfTk9STShub3JtKSAgICAgICAgICAoMTw8MjQpLyhub3JtKQorI2RlZmluZSBBQzNfTVVMKGEsYikgICAgICAgICAgICAoKCgoaW50NjRfdCkgKGEpKSAqIChiKSk+PjEyKQorI2RlZmluZSBBQzNfUkFOR0UoeCkgICAgICAgICAgICAoeHwoKHgmMTI4KTw8MSkpCisjZGVmaW5lIEFDM19IRUFWWV9SQU5HRSh4KSAgICAgICh4PDwxKQorI2RlZmluZSBBQzNfRFlOQU1JQ19SQU5HRSh4KSAgICAoeCkKKyNkZWZpbmUgQUMzX1NQWF9CTEVORCh4KSAgICAgICAgKHgpCisjZGVmaW5lIEFDM19EWU5BTUlDX1JBTkdFMSAgICAgIDAKKworI2RlZmluZSBJTlRGTE9BVCAgICAgICAgICAgICAgICBpbnQKKyNkZWZpbmUgU0hPUlRGTE9BVCAgICAgICAgICAgICAgaW50MTZfdAorCisjZWxzZSAvKiBVU0VfRklYRUQgKi8KKworI2RlZmluZSBGSVhSKHgpICAgICAgICAgICAgICAgICAoKGZsb2F0KSh4KSkKKyNkZWZpbmUgRklYUjEyKHgpICAgICAgICAgICAgICAgKChmbG9hdCkoeCkpCisjZGVmaW5lIEZJWFIxNSh4KSAgICAgICAgICAgICAgICgoZmxvYXQpKHgpKQorI2RlZmluZSBST1VORDE1KHgpICAgICAgICAgICAgICAoeCkKKworI2RlZmluZSBBQzNfUkVOQU1FKHgpICAgICAgICAgICB4CisjZGVmaW5lIEFDM19OT1JNKG5vcm0pICAgICAgICAgICgxLjBmLyhub3JtKSkKKyNkZWZpbmUgQUMzX01VTChhLGIpICAgICAgICAgICAgKChhKSAqIChiKSkKKyNkZWZpbmUgQUMzX1JBTkdFKHgpICAgICAgICAgICAgKGR5bmFtaWNfcmFuZ2VfdGFiWyh4KV0pCisjZGVmaW5lIEFDM19IRUFWWV9SQU5HRSh4KSAgICAgIChoZWF2eV9keW5hbWljX3JhbmdlX3RhYlsoeCldKQorI2RlZmluZSBBQzNfRFlOQU1JQ19SQU5HRSh4KSAgICAocG93Zih4LCAgcy0+ZHJjX3NjYWxlKSkKKyNkZWZpbmUgQUMzX1NQWF9CTEVORCh4KSAgICAgICAgKHgpKiAoMS4wZi8zMikKKyNkZWZpbmUgQUMzX0RZTkFNSUNfUkFOR0UxICAgICAgMS4wZgorCisjZGVmaW5lIElOVEZMT0FUICAgICAgICAgICAgICAgIGZsb2F0CisjZGVmaW5lIFNIT1JURkxPQVQgICAgICAgICAgICAgIGZsb2F0CisKKyNlbmRpZiAvKiBVU0VfRklYRUQgKi8KKworI2RlZmluZSBBQzNfTEVWRUwoeCkgICAgICAgICAgICBST1VORDE1KCh4KSAqIEZJWFIxNSgwLjcwNzEwNjc4MTE4NjU0NzYpKQorCisvKiBwcmUtZGVmaW5lZCBnYWluIHZhbHVlcyAqLworI2RlZmluZSBMRVZFTF9QTFVTXzNEQiAgICAgICAgICAxLjQxNDIxMzU2MjM3MzA5NTAKKyNkZWZpbmUgTEVWRUxfUExVU18xUE9JTlQ1REIgICAgMS4xODkyMDcxMTUwMDI3MjA5CisjZGVmaW5lIExFVkVMX01JTlVTXzFQT0lOVDVEQiAgIDAuODQwODk2NDE1MjUzNzE0NQorI2RlZmluZSBMRVZFTF9NSU5VU18zREIgICAgICAgICAwLjcwNzEwNjc4MTE4NjU0NzYKKyNkZWZpbmUgTEVWRUxfTUlOVVNfNFBPSU5UNURCICAgMC41OTQ2MDM1NTc1MDEzNjA1CisjZGVmaW5lIExFVkVMX01JTlVTXzZEQiAgICAgICAgIDAuNTAwMDAwMDAwMDAwMDAwMAorI2RlZmluZSBMRVZFTF9NSU5VU185REIgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzgKKyNkZWZpbmUgTEVWRUxfWkVSTyAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIExFVkVMX09ORSAgICAgICAgICAgICAgIDEuMDAwMDAwMDAwMDAwMDAwMAorCisvKiogRGVsdGEgYml0IGFsbG9jYXRpb24gc3RyYXRlZ3kgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgREJBX1JFVVNFID0gMCwKKyAgICBEQkFfTkVXLAorICAgIERCQV9OT05FLAorICAgIERCQV9SRVNFUlZFRAorfSBBQzNEZWx0YVN0cmF0ZWd5OworCisvKiogQ2hhbm5lbCBtb2RlIChhdWRpbyBjb2RpbmcgbW9kZSkgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQUMzX0NITU9ERV9EVUFMTU9OTyA9IDAsCisgICAgQUMzX0NITU9ERV9NT05PLAorICAgIEFDM19DSE1PREVfU1RFUkVPLAorICAgIEFDM19DSE1PREVfM0YsCisgICAgQUMzX0NITU9ERV8yRjFSLAorICAgIEFDM19DSE1PREVfM0YxUiwKKyAgICBBQzNfQ0hNT0RFXzJGMlIsCisgICAgQUMzX0NITU9ERV8zRjJSCit9IEFDM0NoYW5uZWxNb2RlOworCisvKiogRG9sYnkgU3Vycm91bmQgbW9kZSAqLwordHlwZWRlZiBlbnVtIEFDM0RvbGJ5U3Vycm91bmRNb2RlIHsKKyAgICBBQzNfRFNVUk1PRF9OT1RJTkRJQ0FURUQgPSAwLAorICAgIEFDM19EU1VSTU9EX09GRiwKKyAgICBBQzNfRFNVUk1PRF9PTiwKKyAgICBBQzNfRFNVUk1PRF9SRVNFUlZFRAorfSBBQzNEb2xieVN1cnJvdW5kTW9kZTsKKworLyoqIERvbGJ5IFN1cnJvdW5kIEVYIG1vZGUgKi8KK3R5cGVkZWYgZW51bSBBQzNEb2xieVN1cnJvdW5kRVhNb2RlIHsKKyAgICBBQzNfRFNVUkVYTU9EX05PVElORElDQVRFRCA9IDAsCisgICAgQUMzX0RTVVJFWE1PRF9PRkYsCisgICAgQUMzX0RTVVJFWE1PRF9PTiwKKyAgICBBQzNfRFNVUkVYTU9EX1BMSUlaCit9IEFDM0RvbGJ5U3Vycm91bmRFWE1vZGU7CisKKy8qKiBEb2xieSBIZWFkcGhvbmUgbW9kZSAqLwordHlwZWRlZiBlbnVtIEFDM0RvbGJ5SGVhZHBob25lTW9kZSB7CisgICAgQUMzX0RIRUFEUEhPTk1PRF9OT1RJTkRJQ0FURUQgPSAwLAorICAgIEFDM19ESEVBRFBIT05NT0RfT0ZGLAorICAgIEFDM19ESEVBRFBIT05NT0RfT04sCisgICAgQUMzX0RIRUFEUEhPTk1PRF9SRVNFUlZFRAorfSBBQzNEb2xieUhlYWRwaG9uZU1vZGU7CisKKy8qKiBQcmVmZXJyZWQgU3RlcmVvIERvd25taXggbW9kZSAqLwordHlwZWRlZiBlbnVtIEFDM1ByZWZlcnJlZFN0ZXJlb0Rvd25taXhNb2RlIHsKKyAgICBBQzNfRE1JWE1PRF9OT1RJTkRJQ0FURUQgPSAwLAorICAgIEFDM19ETUlYTU9EX0xUUlQsCisgICAgQUMzX0RNSVhNT0RfTE9STywKKyAgICBBQzNfRE1JWE1PRF9EUExJSSAvLyByZXNlcnZlZCB2YWx1ZSBpbiBBLzUyLCBidXQgdXNlZCBieSBlbmNvZGVycyB0byBpbmRpY2F0ZSBEUEwyCit9IEFDM1ByZWZlcnJlZFN0ZXJlb0Rvd25taXhNb2RlOworCit0eXBlZGVmIHN0cnVjdCBBQzNCaXRBbGxvY1BhcmFtZXRlcnMgeworICAgIGludCBzcl9jb2RlOworICAgIGludCBzcl9zaGlmdDsKKyAgICBpbnQgc2xvd19nYWluLCBzbG93X2RlY2F5LCBmYXN0X2RlY2F5LCBkYl9wZXJfYml0LCBmbG9vcjsKKyAgICBpbnQgY3BsX2Zhc3RfbGVhaywgY3BsX3Nsb3dfbGVhazsKK30gQUMzQml0QWxsb2NQYXJhbWV0ZXJzOworCisvKioKKyAqIEBzdHJ1Y3QgQUMzSGVhZGVySW5mbworICogQ29kZWQgQUMtMyBoZWFkZXIgdmFsdWVzIHVwIHRvIHRoZSBsZmVvbiBlbGVtZW50LCBwbHVzIGRlcml2ZWQgdmFsdWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBBQzNIZWFkZXJJbmZvIHsKKyAgICAvKiogQG5hbWUgQ29kZWQgZWxlbWVudHMKKyAgICAgKiBAeworICAgICAqLworICAgIHVpbnQxNl90IHN5bmNfd29yZDsKKyAgICB1aW50MTZfdCBjcmMxOworICAgIHVpbnQ4X3Qgc3JfY29kZTsKKyAgICB1aW50OF90IGJpdHN0cmVhbV9pZDsKKyAgICB1aW50OF90IGJpdHN0cmVhbV9tb2RlOworICAgIHVpbnQ4X3QgY2hhbm5lbF9tb2RlOworICAgIHVpbnQ4X3QgbGZlX29uOworICAgIHVpbnQ4X3QgZnJhbWVfdHlwZTsKKyAgICBpbnQgc3Vic3RyZWFtaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzdWJzdHJlYW0gaWRlbnRpZmljYXRpb24KKyAgICBpbnQgY2VudGVyX21peF9sZXZlbDsgICAgICAgICAgICAgICAgICAgLy8vPCBDZW50ZXIgbWl4IGxldmVsIGluZGV4CisgICAgaW50IHN1cnJvdW5kX21peF9sZXZlbDsgICAgICAgICAgICAgICAgIC8vLzwgU3Vycm91bmQgbWl4IGxldmVsIGluZGV4CisgICAgdWludDE2X3QgY2hhbm5lbF9tYXA7CisgICAgaW50IG51bV9ibG9ja3M7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGF1ZGlvIGJsb2NrcworI2lmIEFWX0hBVkVfSU5DT01QQVRJQkxFX0xJQkFWX0FCSQorICAgIGludCBkb2xieV9zdXJyb3VuZF9tb2RlOworI2VuZGlmCisgICAgLyoqIEB9ICovCisKKyAgICAvKiogQG5hbWUgRGVyaXZlZCB2YWx1ZXMKKyAgICAgKiBAeworICAgICAqLworICAgIHVpbnQ4X3Qgc3Jfc2hpZnQ7CisgICAgdWludDE2X3Qgc2FtcGxlX3JhdGU7CisgICAgdWludDMyX3QgYml0X3JhdGU7CisgICAgdWludDhfdCBjaGFubmVsczsKKyAgICB1aW50MTZfdCBmcmFtZV9zaXplOworICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OworICAgIC8qKiBAfSAqLworI2lmICFBVl9IQVZFX0lOQ09NUEFUSUJMRV9MSUJBVl9BQkkKKyAgICBpbnQgZG9sYnlfc3Vycm91bmRfbW9kZTsKKyNlbmRpZgorfSBBQzNIZWFkZXJJbmZvOworCit0eXBlZGVmIGVudW0geworICAgIEVBQzNfRlJBTUVfVFlQRV9JTkRFUEVOREVOVCA9IDAsCisgICAgRUFDM19GUkFNRV9UWVBFX0RFUEVOREVOVCwKKyAgICBFQUMzX0ZSQU1FX1RZUEVfQUMzX0NPTlZFUlQsCisgICAgRUFDM19GUkFNRV9UWVBFX1JFU0VSVkVECit9IEVBQzNGcmFtZVR5cGU7CisKK3ZvaWQgZmZfYWMzX2NvbW1vbl9pbml0KHZvaWQpOworCisvKioKKyAqIENhbGN1bGF0ZSB0aGUgbG9nIHBvd2VyLXNwZWN0cmFsIGRlbnNpdHkgb2YgdGhlIGlucHV0IHNpZ25hbC4KKyAqIFRoaXMgZ2l2ZXMgYSByb3VnaCBlc3RpbWF0ZSBvZiBzaWduYWwgcG93ZXIgaW4gdGhlIGZyZXF1ZW5jeSBkb21haW4gYnkgdXNpbmcKKyAqIHRoZSBzcGVjdHJhbCBlbnZlbG9wZSAoZXhwb25lbnRzKS4gIFRoZSBwc2QgaXMgYWxzbyBzZXBhcmF0ZWx5IGdyb3VwZWQKKyAqIGludG8gY3JpdGljYWwgYmFuZHMgZm9yIHVzZSBpbiB0aGUgY2FsY3VsYXRpbmcgdGhlIG1hc2tpbmcgY3VydmUuCisgKiAxMjggdW5pdHMgaW4gcHNkID0gLTYgZEIuICBUaGUgZGJrbmVlIHBhcmFtZXRlciBpbiBBQzNCaXRBbGxvY1BhcmFtZXRlcnMKKyAqIGRldGVybWluZXMgdGhlIHJlZmVyZW5jZSBsZXZlbC4KKyAqCisgKiBAcGFyYW1baW5dICBleHAgICAgICAgIGZyZXF1ZW5jeSBjb2VmZmljaWVudCBleHBvbmVudHMKKyAqIEBwYXJhbVtpbl0gIHN0YXJ0ICAgICAgc3RhcnRpbmcgYmluIGxvY2F0aW9uCisgKiBAcGFyYW1baW5dICBlbmQgICAgICAgIGVuZGluZyBiaW4gbG9jYXRpb24KKyAqIEBwYXJhbVtvdXRdIHBzZCAgICAgICAgc2lnbmFsIHBvd2VyIGZvciBlYWNoIGZyZXF1ZW5jeSBiaW4KKyAqIEBwYXJhbVtvdXRdIGJhbmRfcHNkICAgc2lnbmFsIHBvd2VyIGZvciBlYWNoIGNyaXRpY2FsIGJhbmQKKyAqLwordm9pZCBmZl9hYzNfYml0X2FsbG9jX2NhbGNfcHNkKGludDhfdCAqZXhwLCBpbnQgc3RhcnQsIGludCBlbmQsIGludDE2X3QgKnBzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpiYW5kX3BzZCk7CisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSBtYXNraW5nIGN1cnZlLgorICogRmlyc3QsIHRoZSBleGNpdGF0aW9uIGlzIGNhbGN1bGF0ZWQgdXNpbmcgcGFyYW1ldGVycyBpbiBzIGFuZCB0aGUgc2lnbmFsCisgKiBwb3dlciBpbiBlYWNoIGNyaXRpY2FsIGJhbmQuICBUaGUgZXhjaXRhdGlvbiBpcyBjb21wYXJlZCB3aXRoIGEgcHJlZGVmaW5lZAorICogaGVhcmluZyB0aHJlc2hvbGQgdGFibGUgdG8gcHJvZHVjZSB0aGUgbWFza2luZyBjdXJ2ZS4gIElmIGRlbHRhIGJpdAorICogYWxsb2NhdGlvbiBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCwgaXQgaXMgdXNlZCBmb3IgYWRqdXN0aW5nIHRoZSBtYXNraW5nCisgKiBjdXJ2ZSwgdXN1YWxseSB0byBnaXZlIGEgY2xvc2VyIG1hdGNoIHRvIGEgYmV0dGVyIHBzeWNob2Fjb3VzdGljIG1vZGVsLgorICoKKyAqIEBwYXJhbVtpbl0gIHMgICAgICAgICAgICBhZGp1c3RhYmxlIGJpdCBhbGxvY2F0aW9uIHBhcmFtZXRlcnMKKyAqIEBwYXJhbVtpbl0gIGJhbmRfcHNkICAgICBzaWduYWwgcG93ZXIgZm9yIGVhY2ggY3JpdGljYWwgYmFuZAorICogQHBhcmFtW2luXSAgc3RhcnQgICAgICAgIHN0YXJ0aW5nIGJpbiBsb2NhdGlvbgorICogQHBhcmFtW2luXSAgZW5kICAgICAgICAgIGVuZGluZyBiaW4gbG9jYXRpb24KKyAqIEBwYXJhbVtpbl0gIGZhc3RfZ2FpbiAgICBmYXN0IGdhaW4gKGVzdGltYXRlZCBzaWduYWwtdG8tbWFzayByYXRpbykKKyAqIEBwYXJhbVtpbl0gIGlzX2xmZSAgICAgICB3aGV0aGVyIG9yIG5vdCB0aGUgY2hhbm5lbCBiZWluZyBwcm9jZXNzZWQgaXMgdGhlIExGRQorICogQHBhcmFtW2luXSAgZGJhX21vZGUgICAgIGRlbHRhIGJpdCBhbGxvY2F0aW9uIG1vZGUgKG5vbmUsIHJldXNlLCBvciBuZXcpCisgKiBAcGFyYW1baW5dICBkYmFfbnNlZ3MgICAgbnVtYmVyIG9mIGRlbHRhIHNlZ21lbnRzCisgKiBAcGFyYW1baW5dICBkYmFfb2Zmc2V0cyAgbG9jYXRpb24gb2Zmc2V0cyBmb3IgZWFjaCBzZWdtZW50CisgKiBAcGFyYW1baW5dICBkYmFfbGVuZ3RocyAgbGVuZ3RoIG9mIGVhY2ggc2VnbWVudAorICogQHBhcmFtW2luXSAgZGJhX3ZhbHVlcyAgIGRlbHRhIGJpdCBhbGxvY2F0aW9uIGZvciBlYWNoIHNlZ21lbnQKKyAqIEBwYXJhbVtvdXRdIG1hc2sgICAgICAgICBjYWxjdWxhdGVkIG1hc2tpbmcgY3VydmUKKyAqIEByZXR1cm4gcmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZXJyb3IKKyAqLworaW50IGZmX2FjM19iaXRfYWxsb2NfY2FsY19tYXNrKEFDM0JpdEFsbG9jUGFyYW1ldGVycyAqcywgaW50MTZfdCAqYmFuZF9wc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgZmFzdF9nYWluLCBpbnQgaXNfbGZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYmFfbW9kZSwgaW50IGRiYV9uc2VncywgdWludDhfdCAqZGJhX29mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGJhX2xlbmd0aHMsIHVpbnQ4X3QgKmRiYV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqbWFzayk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FDM19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYzNfcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxZTE4MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM19wYXJzZXIuYwpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIEFDLTMgcGFyc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAiYWMzX3BhcnNlci5oIgorI2luY2x1ZGUgImFhY19hYzNfcGFyc2VyLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworCisjZGVmaW5lIEFDM19IRUFERVJfU0laRSA3CisKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZWFjM19ibG9ja3NbNF0gPSB7CisgICAgMSwgMiwgMywgNgorfTsKKworLyoqCisgKiBUYWJsZSBmb3IgY2VudGVyIG1peCBsZXZlbHMKKyAqIHJlZmVyZW5jZTogU2VjdGlvbiA1LjQuMi40IGNtaXhsZXYKKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2VudGVyX2xldmVsc1s0XSA9IHsgNCwgNSwgNiwgNSB9OworCisvKioKKyAqIFRhYmxlIGZvciBzdXJyb3VuZCBtaXggbGV2ZWxzCisgKiByZWZlcmVuY2U6IFNlY3Rpb24gNS40LjIuNSBzdXJtaXhsZXYKKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3Vycm91bmRfbGV2ZWxzWzRdID0geyA0LCA2LCA3LCA2IH07CisKKworaW50IGF2cHJpdl9hYzNfcGFyc2VfaGVhZGVyMihHZXRCaXRDb250ZXh0ICpnYmMsIEFDM0hlYWRlckluZm8gKipwaGRyKQoreworICAgIGludCBmcmFtZV9zaXplX2NvZGU7CisgICAgQUMzSGVhZGVySW5mbyAqaGRyOworCisgICAgaWYgKCEqcGhkcikKKyAgICAgICAgKnBoZHIgPSBhdl9tYWxsb2N6KHNpemVvZihBQzNIZWFkZXJJbmZvKSk7CisgICAgaWYgKCEqcGhkcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBoZHIgPSAqcGhkcjsKKworICAgIG1lbXNldChoZHIsIDAsIHNpemVvZigqaGRyKSk7CisKKyAgICBoZHItPnN5bmNfd29yZCA9IGdldF9iaXRzKGdiYywgMTYpOworICAgIGlmKGhkci0+c3luY193b3JkICE9IDB4MEI3NykKKyAgICAgICAgcmV0dXJuIEFBQ19BQzNfUEFSU0VfRVJST1JfU1lOQzsKKworICAgIC8qIHJlYWQgYWhlYWQgdG8gYnNpZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIEFDLTMgYW5kIEUtQUMtMyAqLworICAgIGhkci0+Yml0c3RyZWFtX2lkID0gc2hvd19iaXRzX2xvbmcoZ2JjLCAyOSkgJiAweDFGOworICAgIGlmKGhkci0+Yml0c3RyZWFtX2lkID4gMTYpCisgICAgICAgIHJldHVybiBBQUNfQUMzX1BBUlNFX0VSUk9SX0JTSUQ7CisKKyAgICBoZHItPm51bV9ibG9ja3MgPSA2OworCisgICAgLyogc2V0IGRlZmF1bHQgbWl4IGxldmVscyAqLworICAgIGhkci0+Y2VudGVyX21peF9sZXZlbCAgID0gNTsgIC8vIC00LjVkQgorICAgIGhkci0+c3Vycm91bmRfbWl4X2xldmVsID0gNjsgIC8vIC02LjBkQgorCisgICAgLyogc2V0IGRlZmF1bHQgZG9sYnkgc3Vycm91bmQgbW9kZSAqLworICAgIGhkci0+ZG9sYnlfc3Vycm91bmRfbW9kZSA9IEFDM19EU1VSTU9EX05PVElORElDQVRFRDsKKworICAgIGlmKGhkci0+Yml0c3RyZWFtX2lkIDw9IDEwKSB7CisgICAgICAgIC8qIE5vcm1hbCBBQy0zICovCisgICAgICAgIGhkci0+Y3JjMSA9IGdldF9iaXRzKGdiYywgMTYpOworICAgICAgICBoZHItPnNyX2NvZGUgPSBnZXRfYml0cyhnYmMsIDIpOworICAgICAgICBpZihoZHItPnNyX2NvZGUgPT0gMykKKyAgICAgICAgICAgIHJldHVybiBBQUNfQUMzX1BBUlNFX0VSUk9SX1NBTVBMRV9SQVRFOworCisgICAgICAgIGZyYW1lX3NpemVfY29kZSA9IGdldF9iaXRzKGdiYywgNik7CisgICAgICAgIGlmKGZyYW1lX3NpemVfY29kZSA+IDM3KQorICAgICAgICAgICAgcmV0dXJuIEFBQ19BQzNfUEFSU0VfRVJST1JfRlJBTUVfU0laRTsKKworICAgICAgICBza2lwX2JpdHMoZ2JjLCA1KTsgLy8gc2tpcCBic2lkLCBhbHJlYWR5IGdvdCBpdAorCisgICAgICAgIGhkci0+Yml0c3RyZWFtX21vZGUgPSBnZXRfYml0cyhnYmMsIDMpOworICAgICAgICBoZHItPmNoYW5uZWxfbW9kZSA9IGdldF9iaXRzKGdiYywgMyk7CisKKyAgICAgICAgaWYoaGRyLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8pIHsKKyAgICAgICAgICAgIGhkci0+ZG9sYnlfc3Vycm91bmRfbW9kZSA9IGdldF9iaXRzKGdiYywgMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZigoaGRyLT5jaGFubmVsX21vZGUgJiAxKSAmJiBoZHItPmNoYW5uZWxfbW9kZSAhPSBBQzNfQ0hNT0RFX01PTk8pCisgICAgICAgICAgICAgICAgaGRyLT4gIGNlbnRlcl9taXhfbGV2ZWwgPSAgIGNlbnRlcl9sZXZlbHNbZ2V0X2JpdHMoZ2JjLCAyKV07CisgICAgICAgICAgICBpZihoZHItPmNoYW5uZWxfbW9kZSAmIDQpCisgICAgICAgICAgICAgICAgaGRyLT5zdXJyb3VuZF9taXhfbGV2ZWwgPSBzdXJyb3VuZF9sZXZlbHNbZ2V0X2JpdHMoZ2JjLCAyKV07CisgICAgICAgIH0KKyAgICAgICAgaGRyLT5sZmVfb24gPSBnZXRfYml0czEoZ2JjKTsKKworICAgICAgICBoZHItPnNyX3NoaWZ0ID0gRkZNQVgoaGRyLT5iaXRzdHJlYW1faWQsIDgpIC0gODsKKyAgICAgICAgaGRyLT5zYW1wbGVfcmF0ZSA9IGZmX2FjM19zYW1wbGVfcmF0ZV90YWJbaGRyLT5zcl9jb2RlXSA+PiBoZHItPnNyX3NoaWZ0OworICAgICAgICBoZHItPmJpdF9yYXRlID0gKGZmX2FjM19iaXRyYXRlX3RhYltmcmFtZV9zaXplX2NvZGU+PjFdICogMTAwMCkgPj4gaGRyLT5zcl9zaGlmdDsKKyAgICAgICAgaGRyLT5jaGFubmVscyA9IGZmX2FjM19jaGFubmVsc190YWJbaGRyLT5jaGFubmVsX21vZGVdICsgaGRyLT5sZmVfb247CisgICAgICAgIGhkci0+ZnJhbWVfc2l6ZSA9IGZmX2FjM19mcmFtZV9zaXplX3RhYltmcmFtZV9zaXplX2NvZGVdW2hkci0+c3JfY29kZV0gKiAyOworICAgICAgICBoZHItPmZyYW1lX3R5cGUgPSBFQUMzX0ZSQU1FX1RZUEVfQUMzX0NPTlZFUlQ7IC8vRUFDM19GUkFNRV9UWVBFX0lOREVQRU5ERU5UOworICAgICAgICBoZHItPnN1YnN0cmVhbWlkID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBFbmhhbmNlZCBBQy0zICovCisgICAgICAgIGhkci0+Y3JjMSA9IDA7CisgICAgICAgIGhkci0+ZnJhbWVfdHlwZSA9IGdldF9iaXRzKGdiYywgMik7CisgICAgICAgIGlmKGhkci0+ZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfUkVTRVJWRUQpCisgICAgICAgICAgICByZXR1cm4gQUFDX0FDM19QQVJTRV9FUlJPUl9GUkFNRV9UWVBFOworCisgICAgICAgIGhkci0+c3Vic3RyZWFtaWQgPSBnZXRfYml0cyhnYmMsIDMpOworCisgICAgICAgIGhkci0+ZnJhbWVfc2l6ZSA9IChnZXRfYml0cyhnYmMsIDExKSArIDEpIDw8IDE7CisgICAgICAgIGlmKGhkci0+ZnJhbWVfc2l6ZSA8IEFDM19IRUFERVJfU0laRSkKKyAgICAgICAgICAgIHJldHVybiBBQUNfQUMzX1BBUlNFX0VSUk9SX0ZSQU1FX1NJWkU7CisKKyAgICAgICAgaGRyLT5zcl9jb2RlID0gZ2V0X2JpdHMoZ2JjLCAyKTsKKyAgICAgICAgaWYgKGhkci0+c3JfY29kZSA9PSAzKSB7CisgICAgICAgICAgICBpbnQgc3JfY29kZTIgPSBnZXRfYml0cyhnYmMsIDIpOworICAgICAgICAgICAgaWYoc3JfY29kZTIgPT0gMykKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFDX0FDM19QQVJTRV9FUlJPUl9TQU1QTEVfUkFURTsKKyAgICAgICAgICAgIGhkci0+c2FtcGxlX3JhdGUgPSBmZl9hYzNfc2FtcGxlX3JhdGVfdGFiW3NyX2NvZGUyXSAvIDI7CisgICAgICAgICAgICBoZHItPnNyX3NoaWZ0ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhkci0+bnVtX2Jsb2NrcyA9IGVhYzNfYmxvY2tzW2dldF9iaXRzKGdiYywgMildOworICAgICAgICAgICAgaGRyLT5zYW1wbGVfcmF0ZSA9IGZmX2FjM19zYW1wbGVfcmF0ZV90YWJbaGRyLT5zcl9jb2RlXTsKKyAgICAgICAgICAgIGhkci0+c3Jfc2hpZnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaGRyLT5jaGFubmVsX21vZGUgPSBnZXRfYml0cyhnYmMsIDMpOworICAgICAgICBoZHItPmxmZV9vbiA9IGdldF9iaXRzMShnYmMpOworCisgICAgICAgIGhkci0+Yml0X3JhdGUgPSAodWludDMyX3QpKDguMCAqIGhkci0+ZnJhbWVfc2l6ZSAqIGhkci0+c2FtcGxlX3JhdGUgLworICAgICAgICAgICAgICAgICAgICAgICAgKGhkci0+bnVtX2Jsb2NrcyAqIDI1Ni4wKSk7CisgICAgICAgIGhkci0+Y2hhbm5lbHMgPSBmZl9hYzNfY2hhbm5lbHNfdGFiW2hkci0+Y2hhbm5lbF9tb2RlXSArIGhkci0+bGZlX29uOworICAgIH0KKyAgICBoZHItPmNoYW5uZWxfbGF5b3V0ID0gYXZwcml2X2FjM19jaGFubmVsX2xheW91dF90YWJbaGRyLT5jaGFubmVsX21vZGVdOworICAgIGlmIChoZHItPmxmZV9vbikKKyAgICAgICAgaGRyLT5jaGFubmVsX2xheW91dCB8PSBBVl9DSF9MT1dfRlJFUVVFTkNZOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdnByaXZfYWMzX3BhcnNlX2hlYWRlcihHZXRCaXRDb250ZXh0ICpnYmMsIEFDM0hlYWRlckluZm8gKmhkcikKK3sKKyAgICBBQzNIZWFkZXJJbmZvIHRtcCwgKnB0bXAgPSAmdG1wOworICAgIGludCByZXQgPSBhdnByaXZfYWMzX3BhcnNlX2hlYWRlcjIoZ2JjLCAmcHRtcCk7CisKKyAgICBtZW1jcHkoaGRyLCBwdG1wLCAoKGludHB0cl90KSZ0bXAuY2hhbm5lbF9sYXlvdXQpIC0gKChpbnRwdHJfdCkmdG1wKSArIHNpemVvZih1aW50NjRfdCkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWMzX3N5bmModWludDY0X3Qgc3RhdGUsIEFBQ0FDM1BhcnNlQ29udGV4dCAqaGRyX2luZm8sCisgICAgICAgIGludCAqbmVlZF9uZXh0X2hlYWRlciwgaW50ICpuZXdfZnJhbWVfc3RhcnQpCit7CisgICAgaW50IGVycjsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQ2NF90IHU2NDsKKyAgICAgICAgdWludDhfdCAgdThbOCArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkVdOworICAgIH0gdG1wID0geyBhdl9iZTJuZTY0KHN0YXRlKSB9OworICAgIEFDM0hlYWRlckluZm8gaGRyLCAqcGhkciA9ICZoZHI7CisgICAgR2V0Qml0Q29udGV4dCBnYmM7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYmMsIHRtcC51OCs4LUFDM19IRUFERVJfU0laRSwgNTQpOworICAgIGVyciA9IGF2cHJpdl9hYzNfcGFyc2VfaGVhZGVyMigmZ2JjLCAmcGhkcik7CisKKyAgICBpZihlcnIgPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGhkcl9pbmZvLT5zYW1wbGVfcmF0ZSA9IGhkci5zYW1wbGVfcmF0ZTsKKyAgICBoZHJfaW5mby0+Yml0X3JhdGUgPSBoZHIuYml0X3JhdGU7CisgICAgaGRyX2luZm8tPmNoYW5uZWxzID0gaGRyLmNoYW5uZWxzOworICAgIGhkcl9pbmZvLT5jaGFubmVsX2xheW91dCA9IGhkci5jaGFubmVsX2xheW91dDsKKyAgICBoZHJfaW5mby0+c2FtcGxlcyA9IGhkci5udW1fYmxvY2tzICogMjU2OworICAgIGhkcl9pbmZvLT5zZXJ2aWNlX3R5cGUgPSBoZHIuYml0c3RyZWFtX21vZGU7CisgICAgaWYgKGhkci5iaXRzdHJlYW1fbW9kZSA9PSAweDcgJiYgaGRyLmNoYW5uZWxzID4gMSkKKyAgICAgICAgaGRyX2luZm8tPnNlcnZpY2VfdHlwZSA9IEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9LQVJBT0tFOworICAgIGlmKGhkci5iaXRzdHJlYW1faWQ+MTApCisgICAgICAgIGhkcl9pbmZvLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0VBQzM7CisgICAgZWxzZSBpZiAoaGRyX2luZm8tPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCisgICAgICAgIGhkcl9pbmZvLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FDMzsKKworICAgICpuZWVkX25leHRfaGVhZGVyID0gKGhkci5mcmFtZV90eXBlICE9IEVBQzNfRlJBTUVfVFlQRV9BQzNfQ09OVkVSVCk7CisgICAgKm5ld19mcmFtZV9zdGFydCAgPSAoaGRyLmZyYW1lX3R5cGUgIT0gRUFDM19GUkFNRV9UWVBFX0RFUEVOREVOVCk7CisgICAgcmV0dXJuIGhkci5mcmFtZV9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYWMzX3BhcnNlX2luaXQoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMxKQoreworICAgIEFBQ0FDM1BhcnNlQ29udGV4dCAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgcy0+aGVhZGVyX3NpemUgPSBBQzNfSEVBREVSX1NJWkU7CisgICAgcy0+c3luYyA9IGFjM19zeW5jOworICAgIHJldHVybiAwOworfQorCisKK0FWQ29kZWNQYXJzZXIgZmZfYWMzX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX0FDMywgQVZfQ09ERUNfSURfRUFDMyB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBQUNBQzNQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfaW5pdCAgICA9IGFjM19wYXJzZV9pbml0LAorICAgIC5wYXJzZXJfcGFyc2UgICA9IGZmX2FhY19hYzNfcGFyc2UsCisgICAgLnBhcnNlcl9jbG9zZSAgID0gZmZfcGFyc2VfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWMzX3BhcnNlci5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWMzX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzM4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNfcGFyc2VyLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIEFDLTMgcGFyc2VyIHByb3RvdHlwZXMKKyAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BQzNfUEFSU0VSX0gKKyNkZWZpbmUgQVZDT0RFQ19BQzNfUEFSU0VSX0gKKworI2luY2x1ZGUgImFjMy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisKKy8qKgorICogUGFyc2UgQUMtMyBmcmFtZSBoZWFkZXIuCisgKiBQYXJzZSB0aGUgaGVhZGVyIHVwIHRvIHRoZSBsZmVvbiBlbGVtZW50LCB3aGljaCBpcyB0aGUgZmlyc3QgNTIgb3IgNTQgYml0cworICogZGVwZW5kaW5nIG9uIHRoZSBhdWRpbyBjb2RpbmcgbW9kZS4KKyAqIEBwYXJhbVtpbl0gIGdiYyBCaXRDb250ZXh0IGNvbnRhaW5pbmcgdGhlIGZpcnN0IDU0IGJpdHMgb2YgdGhlIGZyYW1lLgorICogQHBhcmFtW291dF0gaGRyIFBvaW50ZXIgdG8gUG9pbnRlciB0byBzdHJ1Y3Qgd2hlcmUgaGVhZGVyIGluZm8gaXMgd3JpdHRlbi4KKyAqICAgICAgICAgICAgICAgICB3aWxsIGJlIGFsbG9jYXRlZCBpZiBOVUxMCisgKiBAcmV0dXJuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBpZiB0aGVyZSBpcyBhIHN5bmMgd29yZCBtaXNtYXRjaCwKKyAqIC0yIGlmIHRoZSBic2lkICh2ZXJzaW9uKSBlbGVtZW50IGlzIGludmFsaWQsIC0zIGlmIHRoZSBmc2NvZCAoc2FtcGxlIHJhdGUpCisgKiBlbGVtZW50IGlzIGludmFsaWQsIG9yIC00IGlmIHRoZSBmcm1zaXplY29kIChiaXQgcmF0ZSkgZWxlbWVudCBpcyBpbnZhbGlkLgorICovCitpbnQgYXZwcml2X2FjM19wYXJzZV9oZWFkZXIyKEdldEJpdENvbnRleHQgKmdiYywgQUMzSGVhZGVySW5mbyAqKmhkcik7CisKK2ludCBhdnByaXZfYWMzX3BhcnNlX2hlYWRlcihHZXRCaXRDb250ZXh0ICpnYmMsIEFDM0hlYWRlckluZm8gKmhkcik7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FDM19QQVJTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWMzZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2U4NzEzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWMzZGVjLmMKQEAgLTAsMCArMSwxNjQ0IEBACisvKgorICogQUMtMyBBdWRpbyBEZWNvZGVyCisgKiBUaGlzIGNvZGUgd2FzIGRldmVsb3BlZCBhcyBwYXJ0IG9mIEdvb2dsZSBTdW1tZXIgb2YgQ29kZSAyMDA2LgorICogRS1BQy0zIHN1cHBvcnQgd2FzIGFkZGVkIGFzIHBhcnQgb2YgR29vZ2xlIFN1bW1lciBvZiBDb2RlIDIwMDcuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEthcnRpa2V5IE1haGVuZHJhIEJIQVRUIChiaGF0dGttIGF0IGdtYWlsIGRvdCBjb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBCYXJ0bG9taWVqIFdvbG93aWVjIDxiYXJ0ZWsud29sb3dpZWNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA3IEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZG93bm1peF9pbmZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhYWNfYWMzX3BhcnNlci5oIgorI2luY2x1ZGUgImFjM19wYXJzZXIuaCIKKyNpbmNsdWRlICJhYzNkZWMuaCIKKyNpbmNsdWRlICJhYzNkZWNfZGF0YS5oIgorI2luY2x1ZGUgImtiZHdpbi5oIgorCisvKioKKyAqIHRhYmxlIGZvciB1bmdyb3VwaW5nIDMgdmFsdWVzIGluIDcgYml0cy4KKyAqIHVzZWQgZm9yIGV4cG9uZW50cyBhbmQgYmFwPTIgbWFudGlzc2FzCisgKi8KK3N0YXRpYyB1aW50OF90IHVuZ3JvdXBfM19pbl83X2JpdHNfdGFiWzEyOF1bM107CisKKy8qKiB0YWJsZXMgZm9yIHVuZ3JvdXBpbmcgbWFudGlzc2FzICovCitzdGF0aWMgaW50IGIxX21hbnRpc3Nhc1szMl1bM107CitzdGF0aWMgaW50IGIyX21hbnRpc3Nhc1sxMjhdWzNdOworc3RhdGljIGludCBiM19tYW50aXNzYXNbOF07CitzdGF0aWMgaW50IGI0X21hbnRpc3Nhc1sxMjhdWzJdOworc3RhdGljIGludCBiNV9tYW50aXNzYXNbMTZdOworCisvKioKKyAqIFF1YW50aXphdGlvbiB0YWJsZTogbGV2ZWxzIGZvciBzeW1tZXRyaWMuIGJpdHMgZm9yIGFzeW1tZXRyaWMuCisgKiByZWZlcmVuY2U6IFRhYmxlIDcuMTggTWFwcGluZyBvZiBiYXAgdG8gUXVhbnRpemVyCisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHF1YW50aXphdGlvbl90YWJbMTZdID0geworICAgIDAsIDMsIDUsIDcsIDExLCAxNSwKKyAgICA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxNCwgMTYKK307CisKKy8qKiBkeW5hbWljIHJhbmdlIHRhYmxlLiBjb252ZXJ0cyBjb2RlcyB0byBzY2FsZSBmYWN0b3JzLiAqLworc3RhdGljIGZsb2F0IGR5bmFtaWNfcmFuZ2VfdGFiWzI1Nl07CitzdGF0aWMgZmxvYXQgaGVhdnlfZHluYW1pY19yYW5nZV90YWJbMjU2XTsKKworLyoqIEFkanVzdG1lbnRzIGluIGRCIGdhaW4gKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBnYWluX2xldmVsc1s5XSA9IHsKKyAgICBMRVZFTF9QTFVTXzNEQiwKKyAgICBMRVZFTF9QTFVTXzFQT0lOVDVEQiwKKyAgICBMRVZFTF9PTkUsCisgICAgTEVWRUxfTUlOVVNfMVBPSU5UNURCLAorICAgIExFVkVMX01JTlVTXzNEQiwKKyAgICBMRVZFTF9NSU5VU180UE9JTlQ1REIsCisgICAgTEVWRUxfTUlOVVNfNkRCLAorICAgIExFVkVMX1pFUk8sCisgICAgTEVWRUxfTUlOVVNfOURCCit9OworCisvKiogQWRqdXN0bWVudHMgaW4gZEIgZ2FpbiAoTEZFLCArMTAgdG8gLTIxIGRCKSAqLworc3RhdGljIGNvbnN0IGZsb2F0IGdhaW5fbGV2ZWxzX2xmZVszMl0gPSB7CisgICAgMy4xNjIyNzUsIDIuODE4MzgyLCAyLjUxMTg4NiwgMi4yMzg3MTksIDEuOTk1MjYxLCAxLjc3ODI3OCwgMS41ODQ4OTMsCisgICAgMS40MTI1MzYsIDEuMjU4OTI0LCAxLjEyMjAxOCwgMS4wMDAwMDAsIDAuODkxMjUxLCAwLjc5NDMyOCwgMC43MDc5NDYsCisgICAgMC42MzA5NTcsIDAuNTYyMzQxLCAwLjUwMTE4NywgMC40NDY2ODMsIDAuMzk4MTA3LCAwLjM1NDgxMywgMC4zMTYyMjcsCisgICAgMC4yODE4MzgsIDAuMjUxMTg4LCAwLjIyMzg3MiwgMC4xOTk1MjYsIDAuMTc3ODI4LCAwLjE1ODQ4OSwgMC4xNDEyNTMsCisgICAgMC4xMjU4OTIsIDAuMTEyMjAxLCAwLjEwMDAwMCwgMC4wODkxMjUKK307CisKKy8qKgorICogVGFibGUgZm9yIGRlZmF1bHQgc3RlcmVvIGRvd25taXhpbmcgY29lZmZpY2llbnRzCisgKiByZWZlcmVuY2U6IFNlY3Rpb24gNy44LjIgRG93bm1peGluZyBJbnRvIFR3byBDaGFubmVscworICovCitzdGF0aWMgY29uc3QgdWludDhfdCBhYzNfZGVmYXVsdF9jb2VmZnNbOF1bNV1bMl0gPSB7CisgICAgeyB7IDIsIDcgfSwgeyA3LCAyIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyB7IDQsIDQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyB7IDIsIDcgfSwgeyA3LCAyIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyB7IDIsIDcgfSwgeyA1LCA1IH0sIHsgNywgMiB9LCAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyB7IDIsIDcgfSwgeyA3LCAyIH0sIHsgNiwgNiB9LCAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyB7IDIsIDcgfSwgeyA1LCA1IH0sIHsgNywgMiB9LCB7IDgsIDggfSwgICAgICAgICAgIH0sCisgICAgeyB7IDIsIDcgfSwgeyA3LCAyIH0sIHsgNiwgNyB9LCB7IDcsIDYgfSwgICAgICAgICAgIH0sCisgICAgeyB7IDIsIDcgfSwgeyA1LCA1IH0sIHsgNywgMiB9LCB7IDYsIDcgfSwgeyA3LCA2IH0sIH0sCit9OworCisvKioKKyAqIFN5bW1ldHJpY2FsIERlcXVhbnRpemF0aW9uCisgKiByZWZlcmVuY2U6IFNlY3Rpb24gNy4zLjMgRXhwYW5zaW9uIG9mIE1hbnRpc3NhcyBmb3IgU3ltbWV0cmljYWwgUXVhbnRpemF0aW9uCisgKiAgICAgICAgICAgIFRhYmxlcyA3LjE5IHRvIDcuMjMKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3N5bW1ldHJpY19kZXF1YW50KGludCBjb2RlLCBpbnQgbGV2ZWxzKQoreworICAgIHJldHVybiAoKGNvZGUgLSAobGV2ZWxzID4+IDEpKSA8PCAyNCkgLyBsZXZlbHM7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRhYmxlcyBhdCBydW50aW1lLgorICovCitzdGF0aWMgYXZfY29sZCB2b2lkIGFjM190YWJsZXNfaW5pdCh2b2lkKQoreworICAgIGludCBpOworCisgICAgLyogZ2VuZXJhdGUgdGFibGUgZm9yIHVuZ3JvdXBpbmcgMyB2YWx1ZXMgaW4gNyBiaXRzCisgICAgICAgcmVmZXJlbmNlOiBTZWN0aW9uIDcuMS4zIEV4cG9uZW50IERlY29kaW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgIHVuZ3JvdXBfM19pbl83X2JpdHNfdGFiW2ldWzBdID0gIGkgLyAyNTsKKyAgICAgICAgdW5ncm91cF8zX2luXzdfYml0c190YWJbaV1bMV0gPSAoaSAlIDI1KSAvIDU7CisgICAgICAgIHVuZ3JvdXBfM19pbl83X2JpdHNfdGFiW2ldWzJdID0gKGkgJSAyNSkgJSA1OworICAgIH0KKworICAgIC8qIGdlbmVyYXRlIGdyb3VwZWQgbWFudGlzc2EgdGFibGVzCisgICAgICAgcmVmZXJlbmNlOiBTZWN0aW9uIDcuMy41IFVuZ3JvdXBpbmcgb2YgTWFudGlzc2FzICovCisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgICAgLyogYmFwPTEgbWFudGlzc2FzICovCisgICAgICAgIGIxX21hbnRpc3Nhc1tpXVswXSA9IHN5bW1ldHJpY19kZXF1YW50KGZmX2FjM191bmdyb3VwXzNfaW5fNV9iaXRzX3RhYltpXVswXSwgMyk7CisgICAgICAgIGIxX21hbnRpc3Nhc1tpXVsxXSA9IHN5bW1ldHJpY19kZXF1YW50KGZmX2FjM191bmdyb3VwXzNfaW5fNV9iaXRzX3RhYltpXVsxXSwgMyk7CisgICAgICAgIGIxX21hbnRpc3Nhc1tpXVsyXSA9IHN5bW1ldHJpY19kZXF1YW50KGZmX2FjM191bmdyb3VwXzNfaW5fNV9iaXRzX3RhYltpXVsyXSwgMyk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworICAgICAgICAvKiBiYXA9MiBtYW50aXNzYXMgKi8KKyAgICAgICAgYjJfbWFudGlzc2FzW2ldWzBdID0gc3ltbWV0cmljX2RlcXVhbnQodW5ncm91cF8zX2luXzdfYml0c190YWJbaV1bMF0sIDUpOworICAgICAgICBiMl9tYW50aXNzYXNbaV1bMV0gPSBzeW1tZXRyaWNfZGVxdWFudCh1bmdyb3VwXzNfaW5fN19iaXRzX3RhYltpXVsxXSwgNSk7CisgICAgICAgIGIyX21hbnRpc3Nhc1tpXVsyXSA9IHN5bW1ldHJpY19kZXF1YW50KHVuZ3JvdXBfM19pbl83X2JpdHNfdGFiW2ldWzJdLCA1KTsKKworICAgICAgICAvKiBiYXA9NCBtYW50aXNzYXMgKi8KKyAgICAgICAgYjRfbWFudGlzc2FzW2ldWzBdID0gc3ltbWV0cmljX2RlcXVhbnQoaSAvIDExLCAxMSk7CisgICAgICAgIGI0X21hbnRpc3Nhc1tpXVsxXSA9IHN5bW1ldHJpY19kZXF1YW50KGkgJSAxMSwgMTEpOworICAgIH0KKyAgICAvKiBnZW5lcmF0ZSB1bmdyb3VwZWQgbWFudGlzc2EgdGFibGVzCisgICAgICAgcmVmZXJlbmNlOiBUYWJsZXMgNy4yMSBhbmQgNy4yMyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKyAgICAgICAgLyogYmFwPTMgbWFudGlzc2FzICovCisgICAgICAgIGIzX21hbnRpc3Nhc1tpXSA9IHN5bW1ldHJpY19kZXF1YW50KGksIDcpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgeworICAgICAgICAvKiBiYXA9NSBtYW50aXNzYXMgKi8KKyAgICAgICAgYjVfbWFudGlzc2FzW2ldID0gc3ltbWV0cmljX2RlcXVhbnQoaSwgMTUpOworICAgIH0KKworICAgIC8qIGdlbmVyYXRlIGR5bmFtaWMgcmFuZ2UgdGFibGUKKyAgICAgICByZWZlcmVuY2U6IFNlY3Rpb24gNy43LjEgRHluYW1pYyBSYW5nZSBDb250cm9sICovCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGludCB2ID0gKGkgPj4gNSkgLSAoKGkgPj4gNykgPDwgMykgLSA1OworICAgICAgICBkeW5hbWljX3JhbmdlX3RhYltpXSA9IHBvd2YoMi4wZiwgdikgKiAoKGkgJiAweDFGKSB8IDB4MjApOworICAgIH0KKworICAgIC8qIGdlbmVyYXRlIGNvbXByIGR5bmFtaWMgcmFuZ2UgdGFibGUKKyAgICAgICByZWZlcmVuY2U6IFNlY3Rpb24gNy43LjIgSGVhdnkgQ29tcHJlc3Npb24gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgaW50IHYgPSAoaSA+PiA0KSAtICgoaSA+PiA3KSA8PCA0KSAtIDQ7CisgICAgICAgIGhlYXZ5X2R5bmFtaWNfcmFuZ2VfdGFiW2ldID0gcG93ZigyLjBmLCB2KSAqICgoaSAmIDB4RikgfCAweDEwKTsKKyAgICB9CisKK30KKworLyoqCisgKiBBVkNvZGVjIGluaXRpYWxpemF0aW9uCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBhYzNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFDM0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIGZmX2FjM19jb21tb25faW5pdCgpOworICAgIGFjM190YWJsZXNfaW5pdCgpOworICAgIGZmX21kY3RfaW5pdCgmcy0+aW1kY3RfMjU2LCA4LCAxLCAxLjApOworICAgIGZmX21kY3RfaW5pdCgmcy0+aW1kY3RfNTEyLCA5LCAxLCAxLjApOworICAgIEFDM19SRU5BTUUoZmZfa2JkX3dpbmRvd19pbml0KShzLT53aW5kb3csIDUuMCwgMjU2KTsKKyAgICBmZl9ic3dhcGRzcF9pbml0KCZzLT5iZHNwKTsKKworI2lmIChVU0VfRklYRUQpCisgICAgcy0+ZmRzcCA9IGF2cHJpdl9hbGxvY19maXhlZF9kc3AoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCk7CisjZWxzZQorICAgIHMtPmZkc3AgPSBhdnByaXZfZmxvYXRfZHNwX2FsbG9jKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpOworI2VuZGlmCisKKyAgICBmZl9hYzNkc3BfaW5pdCgmcy0+YWMzZHNwLCBhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBmZl9mbXRfY29udmVydF9pbml0KCZzLT5mbXRfY29udiwgYXZjdHgpOworICAgIGF2X2xmZ19pbml0KCZzLT5kaXRoX3N0YXRlLCAwKTsKKworICAgIGlmIChVU0VfRklYRUQpCisgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTZQOworICAgIGVsc2UKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX0ZMVFA7CisKKyAgICAvKiBhbGxvdyBkb3dubWl4aW5nIHRvIHN0ZXJlbyBvciBtb25vICovCisjaWYgRkZfQVBJX1JFUVVFU1RfQ0hBTk5FTFMKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBpZiAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBlbHNlIGlmIChhdmN0eC0+cmVxdWVzdF9jaGFubmVscyA9PSAyKQorICAgICAgICBhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiAxICYmCisgICAgICAgIGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ID09IEFWX0NIX0xBWU9VVF9NT05PKQorICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgPSAxOworICAgIGVsc2UgaWYgKGF2Y3R4LT5jaGFubmVscyA+IDIgJiYKKyAgICAgICAgICAgICBhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfU1RFUkVPKQorICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgPSAyOworICAgIHMtPmRvd25taXhlZCA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQUMzX01BWF9DSEFOTkVMUzsgaSsrKSB7CisgICAgICAgIHMtPnhjZnB0cltpXSA9IHMtPnRyYW5zZm9ybV9jb2VmZnNbaV07CisgICAgICAgIHMtPmRseXB0cltpXSA9IHMtPmRlbGF5W2ldOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFBhcnNlIHRoZSAnc3luYyBpbmZvJyBhbmQgJ2JpdCBzdHJlYW0gaW5mbycgZnJvbSB0aGUgQUMtMyBiaXRzdHJlYW0uCisgKiBHZXRCaXRDb250ZXh0IHdpdGhpbiBBQzNEZWNvZGVDb250ZXh0IG11c3QgcG9pbnQgdG8KKyAqIHRoZSBzdGFydCBvZiB0aGUgc3luY2hyb25pemVkIEFDLTMgYml0c3RyZWFtLgorICovCitzdGF0aWMgaW50IGFjM19wYXJzZV9oZWFkZXIoQUMzRGVjb2RlQ29udGV4dCAqcykKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYmMgPSAmcy0+Z2JjOworICAgIGludCBpOworCisgICAgLyogcmVhZCB0aGUgcmVzdCBvZiB0aGUgYnNpLiByZWFkIHR3aWNlIGZvciBkdWFsIG1vbm8gbW9kZS4gKi8KKyAgICBpID0gIXMtPmNoYW5uZWxfbW9kZTsKKyAgICBkbyB7CisgICAgICAgIHMtPmRpYWxvZ19ub3JtYWxpemF0aW9uWyghcy0+Y2hhbm5lbF9tb2RlKS1pXSA9IC1nZXRfYml0cyhnYmMsIDUpOworICAgICAgICBpZiAocy0+ZGlhbG9nX25vcm1hbGl6YXRpb25bKCFzLT5jaGFubmVsX21vZGUpLWldID09IDApIHsKKyAgICAgICAgICAgIHMtPmRpYWxvZ19ub3JtYWxpemF0aW9uWyghcy0+Y2hhbm5lbF9tb2RlKS1pXSA9IC0zMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+dGFyZ2V0X2xldmVsICE9IDApIHsKKyAgICAgICAgICAgIHMtPmxldmVsX2dhaW5bKCFzLT5jaGFubmVsX21vZGUpLWldID0gcG93ZigyLjBmLAorICAgICAgICAgICAgICAgIChmbG9hdCkocy0+dGFyZ2V0X2xldmVsIC0KKyAgICAgICAgICAgICAgICBzLT5kaWFsb2dfbm9ybWFsaXphdGlvblsoIXMtPmNoYW5uZWxfbW9kZSktaV0pLzYuMGYpOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5jb21wcmVzc2lvbl9leGlzdHNbKCFzLT5jaGFubmVsX21vZGUpLWldID0gZ2V0X2JpdHMxKGdiYykpIHsKKyAgICAgICAgICAgIHMtPmhlYXZ5X2R5bmFtaWNfcmFuZ2VbKCFzLT5jaGFubmVsX21vZGUpLWldID0KKyAgICAgICAgICAgICAgICBBQzNfSEVBVllfUkFOR0UoZ2V0X2JpdHMoZ2JjLCA4KSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldF9iaXRzMShnYmMpKQorICAgICAgICAgICAgc2tpcF9iaXRzKGdiYywgOCk7IC8vc2tpcCBsYW5ndWFnZSBjb2RlCisgICAgICAgIGlmIChnZXRfYml0czEoZ2JjKSkKKyAgICAgICAgICAgIHNraXBfYml0cyhnYmMsIDcpOyAvL3NraXAgYXVkaW8gcHJvZHVjdGlvbiBpbmZvcm1hdGlvbgorICAgIH0gd2hpbGUgKGktLSk7CisKKyAgICBza2lwX2JpdHMoZ2JjLCAyKTsgLy9za2lwIGNvcHlyaWdodCBiaXQgYW5kIG9yaWdpbmFsIGJpdHN0cmVhbSBiaXQKKworICAgIC8qIHNraXAgdGhlIHRpbWVjb2RlcyBvciBwYXJzZSB0aGUgQWx0ZXJuYXRlIEJpdCBTdHJlYW0gU3ludGF4ICovCisgICAgaWYgKHMtPmJpdHN0cmVhbV9pZCAhPSA2KSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2JjKSkKKyAgICAgICAgICAgIHNraXBfYml0cyhnYmMsIDE0KTsgLy9za2lwIHRpbWVjb2RlMQorICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiYykpCisgICAgICAgICAgICBza2lwX2JpdHMoZ2JjLCAxNCk7IC8vc2tpcCB0aW1lY29kZTIKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiYykpIHsKKyAgICAgICAgICAgIHMtPnByZWZlcnJlZF9kb3dubWl4ICAgICAgID0gZ2V0X2JpdHMoZ2JjLCAyKTsKKyAgICAgICAgICAgIHMtPmNlbnRlcl9taXhfbGV2ZWxfbHRydCAgID0gZ2V0X2JpdHMoZ2JjLCAzKTsKKyAgICAgICAgICAgIHMtPnN1cnJvdW5kX21peF9sZXZlbF9sdHJ0ID0gYXZfY2xpcChnZXRfYml0cyhnYmMsIDMpLCAzLCA3KTsKKyAgICAgICAgICAgIHMtPmNlbnRlcl9taXhfbGV2ZWwgICAgICAgID0gZ2V0X2JpdHMoZ2JjLCAzKTsKKyAgICAgICAgICAgIHMtPnN1cnJvdW5kX21peF9sZXZlbCAgICAgID0gYXZfY2xpcChnZXRfYml0cyhnYmMsIDMpLCAzLCA3KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiYykpIHsKKyAgICAgICAgICAgIHMtPmRvbGJ5X3N1cnJvdW5kX2V4X21vZGUgPSBnZXRfYml0cyhnYmMsIDIpOworICAgICAgICAgICAgcy0+ZG9sYnlfaGVhZHBob25lX21vZGUgICA9IGdldF9iaXRzKGdiYywgMik7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2JjLCAxMCk7IC8vIHNraXAgYWRjb252dHlwICgxKSwgeGJzaTIgKDgpLCBlbmNpbmZvICgxKQorICAgICAgICB9CisgICAgfQorCisgICAgLyogc2tpcCBhZGRpdGlvbmFsIGJpdHN0cmVhbSBpbmZvICovCisgICAgaWYgKGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgIGkgPSBnZXRfYml0cyhnYmMsIDYpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2JjLCA4KTsKKyAgICAgICAgfSB3aGlsZSAoaS0tKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDb21tb24gZnVuY3Rpb24gdG8gcGFyc2UgQUMtMyBvciBFLUFDLTMgZnJhbWUgaGVhZGVyCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfZnJhbWVfaGVhZGVyKEFDM0RlY29kZUNvbnRleHQgKnMpCit7CisgICAgQUMzSGVhZGVySW5mbyBoZHIsICpwaGRyPSZoZHI7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGF2cHJpdl9hYzNfcGFyc2VfaGVhZGVyMigmcy0+Z2JjLCAmcGhkcik7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIC8qIGdldCBkZWNvZGluZyBwYXJhbWV0ZXJzIGZyb20gaGVhZGVyIGluZm8gKi8KKyAgICBzLT5iaXRfYWxsb2NfcGFyYW1zLnNyX2NvZGUgICAgID0gaGRyLnNyX2NvZGU7CisgICAgcy0+Yml0c3RyZWFtX2lkICAgICAgICAgICAgICAgICA9IGhkci5iaXRzdHJlYW1faWQ7CisgICAgcy0+Yml0c3RyZWFtX21vZGUgICAgICAgICAgICAgICA9IGhkci5iaXRzdHJlYW1fbW9kZTsKKyAgICBzLT5jaGFubmVsX21vZGUgICAgICAgICAgICAgICAgID0gaGRyLmNoYW5uZWxfbW9kZTsKKyAgICBzLT5sZmVfb24gICAgICAgICAgICAgICAgICAgICAgID0gaGRyLmxmZV9vbjsKKyAgICBzLT5iaXRfYWxsb2NfcGFyYW1zLnNyX3NoaWZ0ICAgID0gaGRyLnNyX3NoaWZ0OworICAgIHMtPnNhbXBsZV9yYXRlICAgICAgICAgICAgICAgICAgPSBoZHIuc2FtcGxlX3JhdGU7CisgICAgcy0+Yml0X3JhdGUgICAgICAgICAgICAgICAgICAgICA9IGhkci5iaXRfcmF0ZTsKKyAgICBzLT5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gaGRyLmNoYW5uZWxzOworICAgIHMtPmZid19jaGFubmVscyAgICAgICAgICAgICAgICAgPSBzLT5jaGFubmVscyAtIHMtPmxmZV9vbjsKKyAgICBzLT5sZmVfY2ggICAgICAgICAgICAgICAgICAgICAgID0gcy0+ZmJ3X2NoYW5uZWxzICsgMTsKKyAgICBzLT5mcmFtZV9zaXplICAgICAgICAgICAgICAgICAgID0gaGRyLmZyYW1lX3NpemU7CisgICAgcy0+cHJlZmVycmVkX2Rvd25taXggICAgICAgICAgICA9IEFDM19ETUlYTU9EX05PVElORElDQVRFRDsKKyAgICBzLT5jZW50ZXJfbWl4X2xldmVsICAgICAgICAgICAgID0gaGRyLmNlbnRlcl9taXhfbGV2ZWw7CisgICAgcy0+Y2VudGVyX21peF9sZXZlbF9sdHJ0ICAgICAgICA9IDQ7IC8vIC0zLjBkQgorICAgIHMtPnN1cnJvdW5kX21peF9sZXZlbCAgICAgICAgICAgPSBoZHIuc3Vycm91bmRfbWl4X2xldmVsOworICAgIHMtPnN1cnJvdW5kX21peF9sZXZlbF9sdHJ0ICAgICAgPSA0OyAvLyAtMy4wZEIKKyAgICBzLT5sZmVfbWl4X2xldmVsX2V4aXN0cyAgICAgICAgID0gMDsKKyAgICBzLT5udW1fYmxvY2tzICAgICAgICAgICAgICAgICAgID0gaGRyLm51bV9ibG9ja3M7CisgICAgcy0+ZnJhbWVfdHlwZSAgICAgICAgICAgICAgICAgICA9IGhkci5mcmFtZV90eXBlOworICAgIHMtPnN1YnN0cmVhbWlkICAgICAgICAgICAgICAgICAgPSBoZHIuc3Vic3RyZWFtaWQ7CisgICAgcy0+ZG9sYnlfc3Vycm91bmRfbW9kZSAgICAgICAgICA9IGhkci5kb2xieV9zdXJyb3VuZF9tb2RlOworICAgIHMtPmRvbGJ5X3N1cnJvdW5kX2V4X21vZGUgICAgICAgPSBBQzNfRFNVUkVYTU9EX05PVElORElDQVRFRDsKKyAgICBzLT5kb2xieV9oZWFkcGhvbmVfbW9kZSAgICAgICAgID0gQUMzX0RIRUFEUEhPTk1PRF9OT1RJTkRJQ0FURUQ7CisKKyAgICBpZiAocy0+bGZlX29uKSB7CisgICAgICAgIHMtPnN0YXJ0X2ZyZXFbcy0+bGZlX2NoXSAgICAgPSAwOworICAgICAgICBzLT5lbmRfZnJlcVtzLT5sZmVfY2hdICAgICAgID0gNzsKKyAgICAgICAgcy0+bnVtX2V4cF9ncm91cHNbcy0+bGZlX2NoXSA9IDI7CisgICAgICAgIHMtPmNoYW5uZWxfaW5fY3BsW3MtPmxmZV9jaF0gPSAwOworICAgIH0KKworICAgIGlmIChzLT5iaXRzdHJlYW1faWQgPD0gMTApIHsKKyAgICAgICAgcy0+ZWFjMyAgICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgcy0+c25yX29mZnNldF9zdHJhdGVneSAgID0gMjsKKyAgICAgICAgcy0+YmxvY2tfc3dpdGNoX3N5bnRheCAgID0gMTsKKyAgICAgICAgcy0+ZGl0aGVyX2ZsYWdfc3ludGF4ICAgID0gMTsKKyAgICAgICAgcy0+Yml0X2FsbG9jYXRpb25fc3ludGF4ID0gMTsKKyAgICAgICAgcy0+ZmFzdF9nYWluX3N5bnRheCAgICAgID0gMDsKKyAgICAgICAgcy0+Zmlyc3RfY3BsX2xlYWsgICAgICAgID0gMDsKKyAgICAgICAgcy0+ZGJhX3N5bnRheCAgICAgICAgICAgID0gMTsKKyAgICAgICAgcy0+c2tpcF9zeW50YXggICAgICAgICAgID0gMTsKKyAgICAgICAgbWVtc2V0KHMtPmNoYW5uZWxfdXNlc19haHQsIDAsIHNpemVvZihzLT5jaGFubmVsX3VzZXNfYWh0KSk7CisgICAgICAgIHJldHVybiBhYzNfcGFyc2VfaGVhZGVyKHMpOworICAgIH0gZWxzZSBpZiAoQ09ORklHX0VBQzNfREVDT0RFUikgeworICAgICAgICBzLT5lYWMzID0gMTsKKyAgICAgICAgcmV0dXJuIGZmX2VhYzNfcGFyc2VfaGVhZGVyKHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRS1BQy0zIHN1cHBvcnQgbm90IGNvbXBpbGVkIGluXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9Cit9CisKKy8qKgorICogU2V0IHN0ZXJlbyBkb3dubWl4aW5nIGNvZWZmaWNpZW50cyBiYXNlZCBvbiBmcmFtZSBoZWFkZXIgaW5mby4KKyAqIHJlZmVyZW5jZTogU2VjdGlvbiA3LjguMiBEb3dubWl4aW5nIEludG8gVHdvIENoYW5uZWxzCisgKi8KK3N0YXRpYyB2b2lkIHNldF9kb3dubWl4X2NvZWZmcyhBQzNEZWNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIGZsb2F0IGNtaXggPSBnYWluX2xldmVsc1tzLT4gIGNlbnRlcl9taXhfbGV2ZWxdOworICAgIGZsb2F0IHNtaXggPSBnYWluX2xldmVsc1tzLT5zdXJyb3VuZF9taXhfbGV2ZWxdOworICAgIGZsb2F0IG5vcm0wLCBub3JtMTsKKyAgICBmbG9hdCBkb3dubWl4X2NvZWZmc1tBQzNfTUFYX0NIQU5ORUxTXVsyXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mYndfY2hhbm5lbHM7IGkrKykgeworICAgICAgICBkb3dubWl4X2NvZWZmc1tpXVswXSA9IGdhaW5fbGV2ZWxzW2FjM19kZWZhdWx0X2NvZWZmc1tzLT5jaGFubmVsX21vZGVdW2ldWzBdXTsKKyAgICAgICAgZG93bm1peF9jb2VmZnNbaV1bMV0gPSBnYWluX2xldmVsc1thYzNfZGVmYXVsdF9jb2VmZnNbcy0+Y2hhbm5lbF9tb2RlXVtpXVsxXV07CisgICAgfQorICAgIGlmIChzLT5jaGFubmVsX21vZGUgPiAxICYmIHMtPmNoYW5uZWxfbW9kZSAmIDEpIHsKKyAgICAgICAgZG93bm1peF9jb2VmZnNbMV1bMF0gPSBkb3dubWl4X2NvZWZmc1sxXVsxXSA9IGNtaXg7CisgICAgfQorICAgIGlmIChzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV8yRjFSIHx8IHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFXzNGMVIpIHsKKyAgICAgICAgaW50IG5mID0gcy0+Y2hhbm5lbF9tb2RlIC0gMjsKKyAgICAgICAgZG93bm1peF9jb2VmZnNbbmZdWzBdID0gZG93bm1peF9jb2VmZnNbbmZdWzFdID0gc21peCAqIExFVkVMX01JTlVTXzNEQjsKKyAgICB9CisgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFXzJGMlIgfHwgcy0+Y2hhbm5lbF9tb2RlID09IEFDM19DSE1PREVfM0YyUikgeworICAgICAgICBpbnQgbmYgPSBzLT5jaGFubmVsX21vZGUgLSA0OworICAgICAgICBkb3dubWl4X2NvZWZmc1tuZl1bMF0gPSBkb3dubWl4X2NvZWZmc1tuZisxXVsxXSA9IHNtaXg7CisgICAgfQorCisgICAgLyogcmVub3JtYWxpemUgKi8KKyAgICBub3JtMCA9IG5vcm0xID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mYndfY2hhbm5lbHM7IGkrKykgeworICAgICAgICBub3JtMCArPSBkb3dubWl4X2NvZWZmc1tpXVswXTsKKyAgICAgICAgbm9ybTEgKz0gZG93bm1peF9jb2VmZnNbaV1bMV07CisgICAgfQorICAgIG5vcm0wID0gMS4wZiAvIG5vcm0wOworICAgIG5vcm0xID0gMS4wZiAvIG5vcm0xOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mYndfY2hhbm5lbHM7IGkrKykgeworICAgICAgICBkb3dubWl4X2NvZWZmc1tpXVswXSAqPSBub3JtMDsKKyAgICAgICAgZG93bm1peF9jb2VmZnNbaV1bMV0gKj0gbm9ybTE7CisgICAgfQorCisgICAgaWYgKHMtPm91dHB1dF9tb2RlID09IEFDM19DSE1PREVfTU9OTykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZmJ3X2NoYW5uZWxzOyBpKyspCisgICAgICAgICAgICBkb3dubWl4X2NvZWZmc1tpXVswXSA9IChkb3dubWl4X2NvZWZmc1tpXVswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X2NvZWZmc1tpXVsxXSkgKiBMRVZFTF9NSU5VU18zREI7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mYndfY2hhbm5lbHM7IGkrKykgeworICAgICAgICBzLT5kb3dubWl4X2NvZWZmc1tpXVswXSA9IEZJWFIxMihkb3dubWl4X2NvZWZmc1tpXVswXSk7CisgICAgICAgIHMtPmRvd25taXhfY29lZmZzW2ldWzFdID0gRklYUjEyKGRvd25taXhfY29lZmZzW2ldWzFdKTsKKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIHRoZSBncm91cGVkIGV4cG9uZW50cyBhY2NvcmRpbmcgdG8gZXhwb25lbnQgc3RyYXRlZ3kuCisgKiByZWZlcmVuY2U6IFNlY3Rpb24gNy4xLjMgRXhwb25lbnQgRGVjb2RpbmcKKyAqLworc3RhdGljIGludCBkZWNvZGVfZXhwb25lbnRzKEdldEJpdENvbnRleHQgKmdiYywgaW50IGV4cF9zdHJhdGVneSwgaW50IG5ncnBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWJzZXhwLCBpbnQ4X3QgKmRleHBzKQoreworICAgIGludCBpLCBqLCBncnAsIGdyb3VwX3NpemU7CisgICAgaW50IGRleHBbMjU2XTsKKyAgICBpbnQgZXhwYWNjLCBwcmV2ZXhwOworCisgICAgLyogdW5wYWNrIGdyb3VwcyAqLworICAgIGdyb3VwX3NpemUgPSBleHBfc3RyYXRlZ3kgKyAoZXhwX3N0cmF0ZWd5ID09IEVYUF9ENDUpOworICAgIGZvciAoZ3JwID0gMCwgaSA9IDA7IGdycCA8IG5ncnBzOyBncnArKykgeworICAgICAgICBleHBhY2MgPSBnZXRfYml0cyhnYmMsIDcpOworICAgICAgICBkZXhwW2krK10gPSB1bmdyb3VwXzNfaW5fN19iaXRzX3RhYltleHBhY2NdWzBdOworICAgICAgICBkZXhwW2krK10gPSB1bmdyb3VwXzNfaW5fN19iaXRzX3RhYltleHBhY2NdWzFdOworICAgICAgICBkZXhwW2krK10gPSB1bmdyb3VwXzNfaW5fN19iaXRzX3RhYltleHBhY2NdWzJdOworICAgIH0KKworICAgIC8qIGNvbnZlcnQgdG8gYWJzb2x1dGUgZXhwcyBhbmQgZXhwYW5kIGdyb3VwcyAqLworICAgIHByZXZleHAgPSBhYnNleHA7CisgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBuZ3JwcyAqIDM7IGkrKykgeworICAgICAgICBwcmV2ZXhwICs9IGRleHBbaV0gLSAyOworICAgICAgICBpZiAocHJldmV4cCA+IDI0VSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc3dpdGNoIChncm91cF9zaXplKSB7CisgICAgICAgIGNhc2UgNDogZGV4cHNbaisrXSA9IHByZXZleHA7CisgICAgICAgICAgICAgICAgZGV4cHNbaisrXSA9IHByZXZleHA7CisgICAgICAgIGNhc2UgMjogZGV4cHNbaisrXSA9IHByZXZleHA7CisgICAgICAgIGNhc2UgMTogZGV4cHNbaisrXSA9IHByZXZleHA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBjb3VwbGVkIGNoYW5uZWwgaW4gdGhlIGNvdXBsaW5nCisgKiByYW5nZSB1c2luZyB0aGUgY291cGxpbmcgY29lZmZpY2llbnRzIGFuZCBjb3VwbGluZyBjb29yZGluYXRlcy4KKyAqIHJlZmVyZW5jZTogU2VjdGlvbiA3LjQuMyBDb3VwbGluZyBDb29yZGluYXRlIEZvcm1hdAorICovCitzdGF0aWMgdm9pZCBjYWxjX3RyYW5zZm9ybV9jb2VmZnNfY3BsKEFDM0RlY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGJpbiwgYmFuZCwgY2g7CisKKyAgICBiaW4gPSBzLT5zdGFydF9mcmVxW0NQTF9DSF07CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHMtPm51bV9jcGxfYmFuZHM7IGJhbmQrKykgeworICAgICAgICBpbnQgYmFuZF9zdGFydCA9IGJpbjsKKyAgICAgICAgaW50IGJhbmRfZW5kID0gYmluICsgcy0+Y3BsX2JhbmRfc2l6ZXNbYmFuZF07CisgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX2luX2NwbFtjaF0pIHsKKyAgICAgICAgICAgICAgICBpbnQgY3BsX2Nvb3JkID0gcy0+Y3BsX2Nvb3Jkc1tjaF1bYmFuZF0gPDwgNTsKKyAgICAgICAgICAgICAgICBmb3IgKGJpbiA9IGJhbmRfc3RhcnQ7IGJpbiA8IGJhbmRfZW5kOyBiaW4rKykgeworICAgICAgICAgICAgICAgICAgICBzLT5maXhlZF9jb2VmZnNbY2hdW2Jpbl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgTVVMSChzLT5maXhlZF9jb2VmZnNbQ1BMX0NIXVtiaW5dIDw8IDQsIGNwbF9jb29yZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaCA9PSAyICYmIHMtPnBoYXNlX2ZsYWdzW2JhbmRdKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYmluID0gYmFuZF9zdGFydDsgYmluIDwgYmFuZF9lbmQ7IGJpbisrKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+Zml4ZWRfY29lZmZzWzJdW2Jpbl0gPSAtcy0+Zml4ZWRfY29lZmZzWzJdW2Jpbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJpbiA9IGJhbmRfZW5kOworICAgIH0KK30KKworLyoqCisgKiBHcm91cGVkIG1hbnRpc3NhcyBmb3IgMy1sZXZlbCA1LWxldmVsIGFuZCAxMS1sZXZlbCBxdWFudGl6YXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBiMV9tYW50WzJdOworICAgIGludCBiMl9tYW50WzJdOworICAgIGludCBiNF9tYW50OworICAgIGludCBiMTsKKyAgICBpbnQgYjI7CisgICAgaW50IGI0OworfSBtYW50X2dyb3VwczsKKworLyoqCisgKiBEZWNvZGUgdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudHMgZm9yIGEgcGFydGljdWxhciBjaGFubmVsCisgKiByZWZlcmVuY2U6IFNlY3Rpb24gNy4zIFF1YW50aXphdGlvbiBhbmQgRGVjb2Rpbmcgb2YgTWFudGlzc2FzCisgKi8KK3N0YXRpYyB2b2lkIGFjM19kZWNvZGVfdHJhbnNmb3JtX2NvZWZmc19jaChBQzNEZWNvZGVDb250ZXh0ICpzLCBpbnQgY2hfaW5kZXgsIG1hbnRfZ3JvdXBzICptKQoreworICAgIGludCBzdGFydF9mcmVxID0gcy0+c3RhcnRfZnJlcVtjaF9pbmRleF07CisgICAgaW50IGVuZF9mcmVxICAgPSBzLT5lbmRfZnJlcVtjaF9pbmRleF07CisgICAgdWludDhfdCAqYmFwcyAgPSBzLT5iYXBbY2hfaW5kZXhdOworICAgIGludDhfdCAqZXhwcyAgID0gcy0+ZGV4cHNbY2hfaW5kZXhdOworICAgIGludDMyX3QgKmNvZWZmcyA9IHMtPmZpeGVkX2NvZWZmc1tjaF9pbmRleF07CisgICAgaW50IGRpdGhlciAgICAgPSAoY2hfaW5kZXggPT0gQ1BMX0NIKSB8fCBzLT5kaXRoZXJfZmxhZ1tjaF9pbmRleF07CisgICAgR2V0Qml0Q29udGV4dCAqZ2JjID0gJnMtPmdiYzsKKyAgICBpbnQgZnJlcTsKKworICAgIGZvciAoZnJlcSA9IHN0YXJ0X2ZyZXE7IGZyZXEgPCBlbmRfZnJlcTsgZnJlcSsrKSB7CisgICAgICAgIGludCBiYXAgPSBiYXBzW2ZyZXFdOworICAgICAgICBpbnQgbWFudGlzc2E7CisgICAgICAgIHN3aXRjaCAoYmFwKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIC8qIHJhbmRvbSBub2lzZSB3aXRoIGFwcHJveGltYXRlIHJhbmdlIG9mIC0wLjcwNyB0byAwLjcwNyAqLworICAgICAgICAgICAgaWYgKGRpdGhlcikKKyAgICAgICAgICAgICAgICBtYW50aXNzYSA9ICgoKGF2X2xmZ19nZXQoJnMtPmRpdGhfc3RhdGUpPj44KSoxODEpPj44KSAtIDU5MzEwMDg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWFudGlzc2EgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChtLT5iMSkgeworICAgICAgICAgICAgICAgIG0tPmIxLS07CisgICAgICAgICAgICAgICAgbWFudGlzc2EgPSBtLT5iMV9tYW50W20tPmIxXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGJpdHMgICAgICA9IGdldF9iaXRzKGdiYywgNSk7CisgICAgICAgICAgICAgICAgbWFudGlzc2EgICAgICA9IGIxX21hbnRpc3Nhc1tiaXRzXVswXTsKKyAgICAgICAgICAgICAgICBtLT5iMV9tYW50WzFdID0gYjFfbWFudGlzc2FzW2JpdHNdWzFdOworICAgICAgICAgICAgICAgIG0tPmIxX21hbnRbMF0gPSBiMV9tYW50aXNzYXNbYml0c11bMl07CisgICAgICAgICAgICAgICAgbS0+YjEgICAgICAgICA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKG0tPmIyKSB7CisgICAgICAgICAgICAgICAgbS0+YjItLTsKKyAgICAgICAgICAgICAgICBtYW50aXNzYSA9IG0tPmIyX21hbnRbbS0+YjJdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgYml0cyAgICAgID0gZ2V0X2JpdHMoZ2JjLCA3KTsKKyAgICAgICAgICAgICAgICBtYW50aXNzYSAgICAgID0gYjJfbWFudGlzc2FzW2JpdHNdWzBdOworICAgICAgICAgICAgICAgIG0tPmIyX21hbnRbMV0gPSBiMl9tYW50aXNzYXNbYml0c11bMV07CisgICAgICAgICAgICAgICAgbS0+YjJfbWFudFswXSA9IGIyX21hbnRpc3Nhc1tiaXRzXVsyXTsKKyAgICAgICAgICAgICAgICBtLT5iMiAgICAgICAgID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBtYW50aXNzYSA9IGIzX21hbnRpc3Nhc1tnZXRfYml0cyhnYmMsIDMpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBpZiAobS0+YjQpIHsKKyAgICAgICAgICAgICAgICBtLT5iNCA9IDA7CisgICAgICAgICAgICAgICAgbWFudGlzc2EgPSBtLT5iNF9tYW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgYml0cyAgID0gZ2V0X2JpdHMoZ2JjLCA3KTsKKyAgICAgICAgICAgICAgICBtYW50aXNzYSAgID0gYjRfbWFudGlzc2FzW2JpdHNdWzBdOworICAgICAgICAgICAgICAgIG0tPmI0X21hbnQgPSBiNF9tYW50aXNzYXNbYml0c11bMV07CisgICAgICAgICAgICAgICAgbS0+YjQgICAgICA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgbWFudGlzc2EgPSBiNV9tYW50aXNzYXNbZ2V0X2JpdHMoZ2JjLCA0KV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLyogNiB0byAxNSAqLworICAgICAgICAgICAgLyogU2hpZnQgbWFudGlzc2EgYW5kIHNpZ24tZXh0ZW5kIGl0LiAqLworICAgICAgICAgICAgaWYgKGJhcCA+IDE1KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJiYXAgJWQgaXMgaW52YWxpZCBpbiBwbGFpbiBBQy0zXG4iLCBiYXApOworICAgICAgICAgICAgICAgIGJhcCA9IDE1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFudGlzc2EgPSBnZXRfc2JpdHMoZ2JjLCBxdWFudGl6YXRpb25fdGFiW2JhcF0pOworICAgICAgICAgICAgbWFudGlzc2EgPDw9IDI0IC0gcXVhbnRpemF0aW9uX3RhYltiYXBdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29lZmZzW2ZyZXFdID0gbWFudGlzc2EgPj4gZXhwc1tmcmVxXTsKKyAgICB9Cit9CisKKy8qKgorICogUmVtb3ZlIHJhbmRvbSBkaXRoZXJpbmcgZnJvbSBjb3VwbGluZyByYW5nZSBjb2VmZmljaWVudHMgd2l0aCB6ZXJvLWJpdAorICogbWFudGlzc2FzIGZvciBjb3VwbGVkIGNoYW5uZWxzIHdoaWNoIGRvIG5vdCB1c2UgZGl0aGVyaW5nLgorICogcmVmZXJlbmNlOiBTZWN0aW9uIDcuMy40IERpdGhlciBmb3IgWmVybyBCaXQgTWFudGlzc2FzIChiYXA9MCkKKyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX2RpdGhlcmluZyhBQzNEZWNvZGVDb250ZXh0ICpzKSB7CisgICAgaW50IGNoLCBpOworCisgICAgZm9yIChjaCA9IDE7IGNoIDw9IHMtPmZid19jaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAoIXMtPmRpdGhlcl9mbGFnW2NoXSAmJiBzLT5jaGFubmVsX2luX2NwbFtjaF0pIHsKKyAgICAgICAgICAgIGZvciAoaSA9IHMtPnN0YXJ0X2ZyZXFbQ1BMX0NIXTsgaSA8IHMtPmVuZF9mcmVxW0NQTF9DSF07IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghcy0+YmFwW0NQTF9DSF1baV0pCisgICAgICAgICAgICAgICAgICAgIHMtPmZpeGVkX2NvZWZmc1tjaF1baV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfdHJhbnNmb3JtX2NvZWZmc19jaChBQzNEZWNvZGVDb250ZXh0ICpzLCBpbnQgYmxrLCBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW50X2dyb3VwcyAqbSkKK3sKKyAgICBpZiAoIXMtPmNoYW5uZWxfdXNlc19haHRbY2hdKSB7CisgICAgICAgIGFjM19kZWNvZGVfdHJhbnNmb3JtX2NvZWZmc19jaChzLCBjaCwgbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogaWYgQUhUIGlzIHVzZWQsIG1hbnRpc3NhcyBmb3IgYWxsIGJsb2NrcyBhcmUgZW5jb2RlZCBpbiB0aGUgZmlyc3QKKyAgICAgICAgICAgYmxvY2sgb2YgdGhlIGZyYW1lLiAqLworICAgICAgICBpbnQgYmluOworICAgICAgICBpZiAoIWJsayAmJiBDT05GSUdfRUFDM19ERUNPREVSKQorICAgICAgICAgICAgZmZfZWFjM19kZWNvZGVfdHJhbnNmb3JtX2NvZWZmc19haHRfY2gocywgY2gpOworICAgICAgICBmb3IgKGJpbiA9IHMtPnN0YXJ0X2ZyZXFbY2hdOyBiaW4gPCBzLT5lbmRfZnJlcVtjaF07IGJpbisrKSB7CisgICAgICAgICAgICBzLT5maXhlZF9jb2VmZnNbY2hdW2Jpbl0gPSBzLT5wcmVfbWFudGlzc2FbY2hdW2Jpbl1bYmxrXSA+PiBzLT5kZXhwc1tjaF1bYmluXTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBEZWNvZGUgdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudHMuCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV90cmFuc2Zvcm1fY29lZmZzKEFDM0RlY29kZUNvbnRleHQgKnMsIGludCBibGspCit7CisgICAgaW50IGNoLCBlbmQ7CisgICAgaW50IGdvdF9jcGxjaGFuID0gMDsKKyAgICBtYW50X2dyb3VwcyBtOworCisgICAgbS5iMSA9IG0uYjIgPSBtLmI0ID0gMDsKKworICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAvKiB0cmFuc2Zvcm0gY29lZmZpY2llbnRzIGZvciBmdWxsLWJhbmR3aWR0aCBjaGFubmVsICovCisgICAgICAgIGRlY29kZV90cmFuc2Zvcm1fY29lZmZzX2NoKHMsIGJsaywgY2gsICZtKTsKKyAgICAgICAgLyogdHJhbnNmb3JtIGNvZWZmaWNpZW50cyBmb3IgY291cGxpbmcgY2hhbm5lbCBjb21lIHJpZ2h0IGFmdGVyIHRoZQorICAgICAgICAgICBjb2VmZmljaWVudHMgZm9yIHRoZSBmaXJzdCBjb3VwbGVkIGNoYW5uZWwqLworICAgICAgICBpZiAocy0+Y2hhbm5lbF9pbl9jcGxbY2hdKSAgeworICAgICAgICAgICAgaWYgKCFnb3RfY3BsY2hhbikgeworICAgICAgICAgICAgICAgIGRlY29kZV90cmFuc2Zvcm1fY29lZmZzX2NoKHMsIGJsaywgQ1BMX0NILCAmbSk7CisgICAgICAgICAgICAgICAgY2FsY190cmFuc2Zvcm1fY29lZmZzX2NwbChzKTsKKyAgICAgICAgICAgICAgICBnb3RfY3BsY2hhbiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmQgPSBzLT5lbmRfZnJlcVtDUExfQ0hdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW5kID0gcy0+ZW5kX2ZyZXFbY2hdOworICAgICAgICB9CisgICAgICAgIGRvCisgICAgICAgICAgICBzLT5maXhlZF9jb2VmZnNbY2hdW2VuZF0gPSAwOworICAgICAgICB3aGlsZSAoKytlbmQgPCAyNTYpOworICAgIH0KKworICAgIC8qIHplcm8gdGhlIGRpdGhlcmVkIGNvZWZmaWNpZW50cyBmb3IgYXBwcm9wcmlhdGUgY2hhbm5lbHMgKi8KKyAgICByZW1vdmVfZGl0aGVyaW5nKHMpOworfQorCisvKioKKyAqIFN0ZXJlbyByZW1hdHJpeGluZy4KKyAqIHJlZmVyZW5jZTogU2VjdGlvbiA3LjUuNCBSZW1hdHJpeGluZyA6IERlY29kaW5nIFRlY2huaXF1ZQorICovCitzdGF0aWMgdm9pZCBkb19yZW1hdHJpeGluZyhBQzNEZWNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBibmQsIGk7CisgICAgaW50IGVuZCwgYm5kZW5kOworCisgICAgZW5kID0gRkZNSU4ocy0+ZW5kX2ZyZXFbMV0sIHMtPmVuZF9mcmVxWzJdKTsKKworICAgIGZvciAoYm5kID0gMDsgYm5kIDwgcy0+bnVtX3JlbWF0cml4aW5nX2JhbmRzOyBibmQrKykgeworICAgICAgICBpZiAocy0+cmVtYXRyaXhpbmdfZmxhZ3NbYm5kXSkgeworICAgICAgICAgICAgYm5kZW5kID0gRkZNSU4oZW5kLCBmZl9hYzNfcmVtYXRyaXhfYmFuZF90YWJbYm5kICsgMV0pOworICAgICAgICAgICAgZm9yIChpID0gZmZfYWMzX3JlbWF0cml4X2JhbmRfdGFiW2JuZF07IGkgPCBibmRlbmQ7IGkrKykgeworICAgICAgICAgICAgICAgIGludCB0bXAwID0gcy0+Zml4ZWRfY29lZmZzWzFdW2ldOworICAgICAgICAgICAgICAgIHMtPmZpeGVkX2NvZWZmc1sxXVtpXSArPSBzLT5maXhlZF9jb2VmZnNbMl1baV07CisgICAgICAgICAgICAgICAgcy0+Zml4ZWRfY29lZmZzWzJdW2ldICA9IHRtcDAgLSBzLT5maXhlZF9jb2VmZnNbMl1baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogSW52ZXJzZSBNRENUIFRyYW5zZm9ybS4KKyAqIENvbnZlcnQgZnJlcXVlbmN5IGRvbWFpbiBjb2VmZmljaWVudHMgdG8gdGltZS1kb21haW4gYXVkaW8gc2FtcGxlcy4KKyAqIHJlZmVyZW5jZTogU2VjdGlvbiA3LjkuNCBUcmFuc2Zvcm1hdGlvbiBFcXVhdGlvbnMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRvX2ltZGN0KEFDM0RlY29kZUNvbnRleHQgKnMsIGludCBjaGFubmVscykKK3sKKyAgICBpbnQgY2g7CisKKyAgICBmb3IgKGNoID0gMTsgY2ggPD0gY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKHMtPmJsb2NrX3N3aXRjaFtjaF0pIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgRkZUU2FtcGxlICp4ID0gcy0+dG1wX291dHB1dCArIDEyODsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICAgICAgICAgICAgICB4W2ldID0gcy0+dHJhbnNmb3JtX2NvZWZmc1tjaF1bMiAqIGldOworICAgICAgICAgICAgcy0+aW1kY3RfMjU2LmltZGN0X2hhbGYoJnMtPmltZGN0XzI1Niwgcy0+dG1wX291dHB1dCwgeCk7CisjaWYgVVNFX0ZJWEVECisgICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3dfc2NhbGVkKHMtPm91dHB0cltjaCAtIDFdLCBzLT5kZWxheVtjaCAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dG1wX291dHB1dCwgcy0+d2luZG93LCAxMjgsIDgpOworI2Vsc2UKKyAgICAgICAgICAgIHMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhzLT5vdXRwdHJbY2ggLSAxXSwgcy0+ZGVsYXlbY2ggLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRtcF9vdXRwdXQsIHMtPndpbmRvdywgMTI4KTsKKyNlbmRpZgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgICAgICAgICAgICAgIHhbaV0gPSBzLT50cmFuc2Zvcm1fY29lZmZzW2NoXVsyICogaSArIDFdOworICAgICAgICAgICAgcy0+aW1kY3RfMjU2LmltZGN0X2hhbGYoJnMtPmltZGN0XzI1Niwgcy0+ZGVsYXlbY2ggLSAxXSwgeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5pbWRjdF81MTIuaW1kY3RfaGFsZigmcy0+aW1kY3RfNTEyLCBzLT50bXBfb3V0cHV0LCBzLT50cmFuc2Zvcm1fY29lZmZzW2NoXSk7CisjaWYgVVNFX0ZJWEVECisgICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3dfc2NhbGVkKHMtPm91dHB0cltjaCAtIDFdLCBzLT5kZWxheVtjaCAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dG1wX291dHB1dCwgcy0+d2luZG93LCAxMjgsIDgpOworI2Vsc2UKKyAgICAgICAgICAgIHMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhzLT5vdXRwdHJbY2ggLSAxXSwgcy0+ZGVsYXlbY2ggLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRtcF9vdXRwdXQsIHMtPndpbmRvdywgMTI4KTsKKyNlbmRpZgorICAgICAgICAgICAgbWVtY3B5KHMtPmRlbGF5W2NoIC0gMV0sIHMtPnRtcF9vdXRwdXQgKyAxMjgsIDEyOCAqIHNpemVvZihGRlRTYW1wbGUpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBVcG1peCBkZWxheSBzYW1wbGVzIGZyb20gc3RlcmVvIHRvIG9yaWdpbmFsIGNoYW5uZWwgbGF5b3V0LgorICovCitzdGF0aWMgdm9pZCBhYzNfdXBtaXhfZGVsYXkoQUMzRGVjb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY2hhbm5lbF9kYXRhX3NpemUgPSBzaXplb2Yocy0+ZGVsYXlbMF0pOworICAgIHN3aXRjaCAocy0+Y2hhbm5lbF9tb2RlKSB7CisgICAgY2FzZSBBQzNfQ0hNT0RFX0RVQUxNT05POgorICAgIGNhc2UgQUMzX0NITU9ERV9TVEVSRU86CisgICAgICAgIC8qIHVwbWl4IG1vbm8gdG8gc3RlcmVvICovCisgICAgICAgIG1lbWNweShzLT5kZWxheVsxXSwgcy0+ZGVsYXlbMF0sIGNoYW5uZWxfZGF0YV9zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQzNfQ0hNT0RFXzJGMlI6CisgICAgICAgIG1lbXNldChzLT5kZWxheVszXSwgMCwgY2hhbm5lbF9kYXRhX3NpemUpOworICAgIGNhc2UgQUMzX0NITU9ERV8yRjFSOgorICAgICAgICBtZW1zZXQocy0+ZGVsYXlbMl0sIDAsIGNoYW5uZWxfZGF0YV9zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQzNfQ0hNT0RFXzNGMlI6CisgICAgICAgIG1lbXNldChzLT5kZWxheVs0XSwgMCwgY2hhbm5lbF9kYXRhX3NpemUpOworICAgIGNhc2UgQUMzX0NITU9ERV8zRjFSOgorICAgICAgICBtZW1zZXQocy0+ZGVsYXlbM10sIDAsIGNoYW5uZWxfZGF0YV9zaXplKTsKKyAgICBjYXNlIEFDM19DSE1PREVfM0Y6CisgICAgICAgIG1lbWNweShzLT5kZWxheVsyXSwgcy0+ZGVsYXlbMV0sIGNoYW5uZWxfZGF0YV9zaXplKTsKKyAgICAgICAgbWVtc2V0KHMtPmRlbGF5WzFdLCAwLCBjaGFubmVsX2RhdGFfc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqCisgKiBEZWNvZGUgYmFuZCBzdHJ1Y3R1cmUgZm9yIGNvdXBsaW5nLCBzcGVjdHJhbCBleHRlbnNpb24sIG9yIGVuaGFuY2VkIGNvdXBsaW5nLgorICogVGhlIGJhbmQgc3RydWN0dXJlIGRlZmluZXMgaG93IG1hbnkgc3ViYmFuZHMgYXJlIGluIGVhY2ggYmFuZC4gIEZvciBlYWNoCisgKiBzdWJiYW5kIGluIHRoZSByYW5nZSwgMSBtZWFucyBpdCBpcyBjb21iaW5lZCB3aXRoIHRoZSBwcmV2aW91cyBiYW5kLCBhbmQgMAorICogbWVhbnMgdGhhdCBpdCBzdGFydHMgYSBuZXcgYmFuZC4KKyAqCisgKiBAcGFyYW1baW5dIGdiYyBiaXQgcmVhZGVyIGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gYmxrIGJsb2NrIG51bWJlcgorICogQHBhcmFtW2luXSBlYWMzIGZsYWcgdG8gaW5kaWNhdGUgRS1BQy0zCisgKiBAcGFyYW1baW5dIGVjcGwgZmxhZyB0byBpbmRpY2F0ZSBlbmhhbmNlZCBjb3VwbGluZworICogQHBhcmFtW2luXSBzdGFydF9zdWJiYW5kIHN1YmJhbmQgbnVtYmVyIGZvciBzdGFydCBvZiByYW5nZQorICogQHBhcmFtW2luXSBlbmRfc3ViYmFuZCBzdWJiYW5kIG51bWJlciBmb3IgZW5kIG9mIHJhbmdlCisgKiBAcGFyYW1baW5dIGRlZmF1bHRfYmFuZF9zdHJ1Y3QgZGVmYXVsdCBiYW5kIHN0cnVjdHVyZSB0YWJsZQorICogQHBhcmFtW291dF0gbnVtX2JhbmRzIG51bWJlciBvZiBiYW5kcyAob3B0aW9uYWxseSBOVUxMKQorICogQHBhcmFtW291dF0gYmFuZF9zaXplcyBhcnJheSBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgYmlucyBpbiBlYWNoIGJhbmQgKG9wdGlvbmFsbHkgTlVMTCkKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX2JhbmRfc3RydWN0dXJlKEdldEJpdENvbnRleHQgKmdiYywgaW50IGJsaywgaW50IGVhYzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVjcGwsIGludCBzdGFydF9zdWJiYW5kLCBpbnQgZW5kX3N1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGVmYXVsdF9iYW5kX3N0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm51bV9iYW5kcywgdWludDhfdCAqYmFuZF9zaXplcykKK3sKKyAgICBpbnQgc3ViYm5kLCBibmQsIG5fc3ViYmFuZHMsIG5fYmFuZHM9MDsKKyAgICB1aW50OF90IGJuZF9zelsyMl07CisgICAgdWludDhfdCBjb2RlZF9iYW5kX3N0cnVjdFsyMl07CisgICAgY29uc3QgdWludDhfdCAqYmFuZF9zdHJ1Y3Q7CisKKyAgICBuX3N1YmJhbmRzID0gZW5kX3N1YmJhbmQgLSBzdGFydF9zdWJiYW5kOworCisgICAgLyogZGVjb2RlIGJhbmQgc3RydWN0dXJlIGZyb20gYml0c3RyZWFtIG9yIHVzZSBkZWZhdWx0ICovCisgICAgaWYgKCFlYWMzIHx8IGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgIGZvciAoc3ViYm5kID0gMDsgc3ViYm5kIDwgbl9zdWJiYW5kcyAtIDE7IHN1YmJuZCsrKSB7CisgICAgICAgICAgICBjb2RlZF9iYW5kX3N0cnVjdFtzdWJibmRdID0gZ2V0X2JpdHMxKGdiYyk7CisgICAgICAgIH0KKyAgICAgICAgYmFuZF9zdHJ1Y3QgPSBjb2RlZF9iYW5kX3N0cnVjdDsKKyAgICB9IGVsc2UgaWYgKCFibGspIHsKKyAgICAgICAgYmFuZF9zdHJ1Y3QgPSAmZGVmYXVsdF9iYW5kX3N0cnVjdFtzdGFydF9zdWJiYW5kKzFdOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5vIGNoYW5nZSBpbiBiYW5kIHN0cnVjdHVyZSAqLworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiBiYW5kcyBhbmQgYmFuZCBzaXplcyBiYXNlZCBvbiBiYW5kIHN0cnVjdHVyZS4KKyAgICAgICBub3RlIHRoYXQgdGhlIGZpcnN0IDQgc3ViYmFuZHMgaW4gZW5oYW5jZWQgY291cGxpbmcgc3BhbiBvbmx5IDYgYmlucworICAgICAgIGluc3RlYWQgb2YgMTIuICovCisgICAgaWYgKG51bV9iYW5kcyB8fCBiYW5kX3NpemVzICkgeworICAgICAgICBuX2JhbmRzID0gbl9zdWJiYW5kczsKKyAgICAgICAgYm5kX3N6WzBdID0gZWNwbCA/IDYgOiAxMjsKKyAgICAgICAgZm9yIChibmQgPSAwLCBzdWJibmQgPSAxOyBzdWJibmQgPCBuX3N1YmJhbmRzOyBzdWJibmQrKykgeworICAgICAgICAgICAgaW50IHN1YmJuZF9zaXplID0gKGVjcGwgJiYgc3ViYm5kIDwgNCkgPyA2IDogMTI7CisgICAgICAgICAgICBpZiAoYmFuZF9zdHJ1Y3Rbc3ViYm5kIC0gMV0pIHsKKyAgICAgICAgICAgICAgICBuX2JhbmRzLS07CisgICAgICAgICAgICAgICAgYm5kX3N6W2JuZF0gKz0gc3ViYm5kX3NpemU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJuZF9zelsrK2JuZF0gPSBzdWJibmRfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNldCBvcHRpb25hbCBvdXRwdXQgcGFyYW1zICovCisgICAgaWYgKG51bV9iYW5kcykKKyAgICAgICAgKm51bV9iYW5kcyA9IG5fYmFuZHM7CisgICAgaWYgKGJhbmRfc2l6ZXMpCisgICAgICAgIG1lbWNweShiYW5kX3NpemVzLCBibmRfc3osIG5fYmFuZHMpOworfQorCisvKioKKyAqIERlY29kZSBhIHNpbmdsZSBhdWRpbyBibG9jayBmcm9tIHRoZSBBQy0zIGJpdHN0cmVhbS4KKyAqLworc3RhdGljIGludCBkZWNvZGVfYXVkaW9fYmxvY2soQUMzRGVjb2RlQ29udGV4dCAqcywgaW50IGJsaykKK3sKKyAgICBpbnQgZmJ3X2NoYW5uZWxzID0gcy0+ZmJ3X2NoYW5uZWxzOworICAgIGludCBjaGFubmVsX21vZGUgPSBzLT5jaGFubmVsX21vZGU7CisgICAgaW50IGksIGJuZCwgc2VnLCBjaDsKKyAgICBpbnQgZGlmZmVyZW50X3RyYW5zZm9ybXM7CisgICAgaW50IGRvd25taXhfb3V0cHV0OworICAgIGludCBjcGxfaW5fdXNlOworICAgIEdldEJpdENvbnRleHQgKmdiYyA9ICZzLT5nYmM7CisgICAgdWludDhfdCBiaXRfYWxsb2Nfc3RhZ2VzW0FDM19NQVhfQ0hBTk5FTFNdID0geyAwIH07CisKKyAgICAvKiBibG9jayBzd2l0Y2ggZmxhZ3MgKi8KKyAgICBkaWZmZXJlbnRfdHJhbnNmb3JtcyA9IDA7CisgICAgaWYgKHMtPmJsb2NrX3N3aXRjaF9zeW50YXgpIHsKKyAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IGZid19jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgcy0+YmxvY2tfc3dpdGNoW2NoXSA9IGdldF9iaXRzMShnYmMpOworICAgICAgICAgICAgaWYgKGNoID4gMSAmJiBzLT5ibG9ja19zd2l0Y2hbY2hdICE9IHMtPmJsb2NrX3N3aXRjaFsxXSkKKyAgICAgICAgICAgICAgICBkaWZmZXJlbnRfdHJhbnNmb3JtcyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBkaXRoZXJpbmcgZmxhZ3MgKi8KKyAgICBpZiAocy0+ZGl0aGVyX2ZsYWdfc3ludGF4KSB7CisgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBmYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIHMtPmRpdGhlcl9mbGFnW2NoXSA9IGdldF9iaXRzMShnYmMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZHluYW1pYyByYW5nZSAqLworICAgIGkgPSAhcy0+Y2hhbm5lbF9tb2RlOworICAgIGRvIHsKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgICAgICAvKiBBbGxvdyBhc3ltbWV0cmljIGFwcGxpY2F0aW9uIG9mIERSQyB3aGVuIGRyY19zY2FsZSA+IDEuCisgICAgICAgICAgICAgICBBbXBsaWZpY2F0aW9uIG9mIHF1aWV0IHNvdW5kcyBpcyBlbmhhbmNlZCAqLworICAgICAgICAgICAgaW50IHJhbmdlX2JpdHMgPSBnZXRfYml0cyhnYmMsIDgpOworICAgICAgICAgICAgSU5URkxPQVQgcmFuZ2UgPSBBQzNfUkFOR0UocmFuZ2VfYml0cyk7CisgICAgICAgICAgICBpZiAocmFuZ2VfYml0cyA8PSAxMjcgfHwgcy0+ZHJjX3NjYWxlIDw9IDEuMCkKKyAgICAgICAgICAgICAgICBzLT5keW5hbWljX3JhbmdlW2ldID0gQUMzX0RZTkFNSUNfUkFOR0UocmFuZ2UpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHMtPmR5bmFtaWNfcmFuZ2VbaV0gPSByYW5nZTsKKyAgICAgICAgfSBlbHNlIGlmIChibGsgPT0gMCkgeworICAgICAgICAgICAgcy0+ZHluYW1pY19yYW5nZVtpXSA9IEFDM19EWU5BTUlDX1JBTkdFMTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGktLSk7CisKKyAgICAvKiBzcGVjdHJhbCBleHRlbnNpb24gc3RyYXRlZ3kgKi8KKyAgICBpZiAocy0+ZWFjMyAmJiAoIWJsayB8fCBnZXRfYml0czEoZ2JjKSkpIHsKKyAgICAgICAgcy0+c3B4X2luX3VzZSA9IGdldF9iaXRzMShnYmMpOworICAgICAgICBpZiAocy0+c3B4X2luX3VzZSkgeworICAgICAgICAgICAgaW50IGRzdF9zdGFydF9mcmVxLCBkc3RfZW5kX2ZyZXEsIHNyY19zdGFydF9mcmVxLAorICAgICAgICAgICAgICAgIHN0YXJ0X3N1YmJhbmQsIGVuZF9zdWJiYW5kOworCisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgd2hpY2ggY2hhbm5lbHMgdXNlIHNweCAqLworICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFX01PTk8pIHsKKyAgICAgICAgICAgICAgICBzLT5jaGFubmVsX3VzZXNfc3B4WzFdID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IGZid19jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF91c2VzX3NweFtjaF0gPSBnZXRfYml0czEoZ2JjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZ2V0IHRoZSBmcmVxdWVuY3kgYmlucyBvZiB0aGUgc3B4IGNvcHkgcmVnaW9uIGFuZCB0aGUgc3B4IHN0YXJ0CisgICAgICAgICAgICAgICBhbmQgZW5kIHN1YmJhbmRzICovCisgICAgICAgICAgICBkc3Rfc3RhcnRfZnJlcSA9IGdldF9iaXRzKGdiYywgMik7CisgICAgICAgICAgICBzdGFydF9zdWJiYW5kICA9IGdldF9iaXRzKGdiYywgMykgKyAyOworICAgICAgICAgICAgaWYgKHN0YXJ0X3N1YmJhbmQgPiA3KQorICAgICAgICAgICAgICAgIHN0YXJ0X3N1YmJhbmQgKz0gc3RhcnRfc3ViYmFuZCAtIDc7CisgICAgICAgICAgICBlbmRfc3ViYmFuZCAgICA9IGdldF9iaXRzKGdiYywgMykgKyA1OworI2lmIFVTRV9GSVhFRAorICAgICAgICAgICAgcy0+c3B4X2RzdF9lbmRfZnJlcSA9IGVuZF9mcmVxX2ludl90YWJbZW5kX3N1YmJhbmRdOworI2VuZGlmCisgICAgICAgICAgICBpZiAoZW5kX3N1YmJhbmQgICA+IDcpCisgICAgICAgICAgICAgICAgZW5kX3N1YmJhbmQgICArPSBlbmRfc3ViYmFuZCAgIC0gNzsKKyAgICAgICAgICAgIGRzdF9zdGFydF9mcmVxID0gZHN0X3N0YXJ0X2ZyZXEgKiAxMiArIDI1OworICAgICAgICAgICAgc3JjX3N0YXJ0X2ZyZXEgPSBzdGFydF9zdWJiYW5kICAqIDEyICsgMjU7CisgICAgICAgICAgICBkc3RfZW5kX2ZyZXEgICA9IGVuZF9zdWJiYW5kICAgICogMTIgKyAyNTsKKworICAgICAgICAgICAgLyogY2hlY2sgdmFsaWRpdHkgb2Ygc3B4IHJhbmdlcyAqLworICAgICAgICAgICAgaWYgKHN0YXJ0X3N1YmJhbmQgPj0gZW5kX3N1YmJhbmQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc3BlY3RyYWwgZXh0ZW5zaW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlICglZCA+PSAlZClcbiIsIHN0YXJ0X3N1YmJhbmQsIGVuZF9zdWJiYW5kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkc3Rfc3RhcnRfZnJlcSA+PSBzcmNfc3RhcnRfZnJlcSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBzcGVjdHJhbCBleHRlbnNpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAiY29weSBzdGFydCBiaW4gKCVkID49ICVkKVxuIiwgZHN0X3N0YXJ0X2ZyZXEsIHNyY19zdGFydF9mcmVxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+c3B4X2RzdF9zdGFydF9mcmVxID0gZHN0X3N0YXJ0X2ZyZXE7CisgICAgICAgICAgICBzLT5zcHhfc3JjX3N0YXJ0X2ZyZXEgPSBzcmNfc3RhcnRfZnJlcTsKKyAgICAgICAgICAgIGlmICghVVNFX0ZJWEVEKQorICAgICAgICAgICAgICAgIHMtPnNweF9kc3RfZW5kX2ZyZXEgICA9IGRzdF9lbmRfZnJlcTsKKworICAgICAgICAgICAgZGVjb2RlX2JhbmRfc3RydWN0dXJlKGdiYywgYmxrLCBzLT5lYWMzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3N1YmJhbmQsIGVuZF9zdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2VhYzNfZGVmYXVsdF9zcHhfYmFuZF9zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPm51bV9zcHhfYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3B4X2JhbmRfc2l6ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IGZid19jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfdXNlc19zcHhbY2hdID0gMDsKKyAgICAgICAgICAgICAgICBzLT5maXJzdF9zcHhfY29vcmRzW2NoXSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzcGVjdHJhbCBleHRlbnNpb24gY29vcmRpbmF0ZXMgKi8KKyAgICBpZiAocy0+c3B4X2luX3VzZSkgeworICAgICAgICBmb3IgKGNoID0gMTsgY2ggPD0gZmJ3X2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF91c2VzX3NweFtjaF0pIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+Zmlyc3Rfc3B4X2Nvb3Jkc1tjaF0gfHwgZ2V0X2JpdHMxKGdiYykpIHsKKyAgICAgICAgICAgICAgICAgICAgSU5URkxPQVQgc3B4X2JsZW5kOworICAgICAgICAgICAgICAgICAgICBpbnQgYmluLCBtYXN0ZXJfc3B4X2Nvb3JkOworCisgICAgICAgICAgICAgICAgICAgIHMtPmZpcnN0X3NweF9jb29yZHNbY2hdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3B4X2JsZW5kID0gQUMzX1NQWF9CTEVORChnZXRfYml0cyhnYmMsIDUpKTsKKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3NweF9jb29yZCA9IGdldF9iaXRzKGdiYywgMikgKiAzOworCisgICAgICAgICAgICAgICAgICAgIGJpbiA9IHMtPnNweF9zcmNfc3RhcnRfZnJlcTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChibmQgPSAwOyBibmQgPCBzLT5udW1fc3B4X2JhbmRzOyBibmQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhbmRzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNweF9jb29yZF9leHAsIHNweF9jb29yZF9tYW50OworICAgICAgICAgICAgICAgICAgICAgICAgSU5URkxPQVQgbnJhdGlvLCBzYmxlbmQsIG5ibGVuZDsKKyNpZiBVU0VfRklYRUQKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgYWNjdTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBibGVuZGluZyBmYWN0b3JzICovCisgICAgICAgICAgICAgICAgICAgICAgICBiYW5kc2l6ZSA9IHMtPnNweF9iYW5kX3NpemVzW2JuZF07CisgICAgICAgICAgICAgICAgICAgICAgICBhY2N1ID0gKGludDY0X3QpKChiaW4gPDwgMjMpICsgKGJhbmRzaXplIDw8IDIyKSkgKiBzLT5zcHhfZHN0X2VuZF9mcmVxOworICAgICAgICAgICAgICAgICAgICAgICAgbnJhdGlvID0gKGludCkoYWNjdSA+PiAzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBucmF0aW8gLT0gc3B4X2JsZW5kIDw8IDE4OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnJhdGlvIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ibGVuZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JsZW5kID0gMHg4MDAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5yYXRpbyA+IDB4N2ZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJsZW5kID0gMHg4MDAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JsZW5kID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJsZW5kID0gZml4ZWRfc3FydChucmF0aW8sIDIzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1ID0gKGludDY0X3QpbmJsZW5kICogMTg1OTc3NTM5MzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYmxlbmQgPSAoaW50KSgoYWNjdSArICgxPDwyOSkpID4+IDMwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYmxlbmQgPSBmaXhlZF9zcXJ0KDB4ODAwMDAwIC0gbnJhdGlvLCAyMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3B4X2Nvb3JkOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgYmxlbmRpbmcgZmFjdG9ycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHNpemUgPSBzLT5zcHhfYmFuZF9zaXplc1tibmRdOworICAgICAgICAgICAgICAgICAgICAgICAgbnJhdGlvID0gKChmbG9hdCkoKGJpbiArIChiYW5kc2l6ZSA+PiAxKSkpIC8gcy0+c3B4X2RzdF9lbmRfZnJlcSkgLSBzcHhfYmxlbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBucmF0aW8gPSBhdl9jbGlwZihucmF0aW8sIDAuMGYsIDEuMGYpOworICAgICAgICAgICAgICAgICAgICAgICAgbmJsZW5kID0gc3FydGYoMy4wZiAqIG5yYXRpbyk7IC8vIG5vaXNlIGlzIHNjYWxlZCBieSBzcXJ0KDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZ2l2ZSB1bml0eSB2YXJpYW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgc2JsZW5kID0gc3FydGYoMS4wZiAtIG5yYXRpbyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbiArPSBiYW5kc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVjb2RlIHNweCBjb29yZGluYXRlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3B4X2Nvb3JkX2V4cCAgPSBnZXRfYml0cyhnYmMsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgc3B4X2Nvb3JkX21hbnQgPSBnZXRfYml0cyhnYmMsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNweF9jb29yZF9leHAgPT0gMTUpIHNweF9jb29yZF9tYW50IDw8PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgIHNweF9jb29yZF9tYW50ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzcHhfY29vcmRfbWFudCA8PD0gKDI1IC0gc3B4X2Nvb3JkX2V4cCAtIG1hc3Rlcl9zcHhfY29vcmQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdWx0aXBseSBub2lzZSBhbmQgc2lnbmFsIGJsZW5kaW5nIGZhY3RvcnMgYnkgc3B4IGNvb3JkaW5hdGUgKi8KKyNpZiBVU0VfRklYRUQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY3UgPSAoaW50NjRfdCluYmxlbmQgKiBzcHhfY29vcmRfbWFudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNweF9ub2lzZV9ibGVuZFtjaF1bYm5kXSAgPSAoaW50KSgoYWNjdSArICgxPDwyMikpID4+IDIzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY3UgPSAoaW50NjRfdClzYmxlbmQgKiBzcHhfY29vcmRfbWFudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNweF9zaWduYWxfYmxlbmRbY2hdW2JuZF0gPSAoaW50KSgoYWNjdSArICgxPDwyMikpID4+IDIzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzcHhfY29vcmQgPSBzcHhfY29vcmRfbWFudCAqICgxLjBmIC8gKDEgPDwgMjMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNweF9ub2lzZV9ibGVuZCBbY2hdW2JuZF0gPSBuYmxlbmQgKiBzcHhfY29vcmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zcHhfc2lnbmFsX2JsZW5kW2NoXVtibmRdID0gc2JsZW5kICogc3B4X2Nvb3JkOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPmZpcnN0X3NweF9jb29yZHNbY2hdID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvdXBsaW5nIHN0cmF0ZWd5ICovCisgICAgaWYgKHMtPmVhYzMgPyBzLT5jcGxfc3RyYXRlZ3lfZXhpc3RzW2Jsa10gOiBnZXRfYml0czEoZ2JjKSkgeworICAgICAgICBtZW1zZXQoYml0X2FsbG9jX3N0YWdlcywgMywgQUMzX01BWF9DSEFOTkVMUyk7CisgICAgICAgIGlmICghcy0+ZWFjMykKKyAgICAgICAgICAgIHMtPmNwbF9pbl91c2VbYmxrXSA9IGdldF9iaXRzMShnYmMpOworICAgICAgICBpZiAocy0+Y3BsX2luX3VzZVtibGtdKSB7CisgICAgICAgICAgICAvKiBjb3VwbGluZyBpbiB1c2UgKi8KKyAgICAgICAgICAgIGludCBjcGxfc3RhcnRfc3ViYmFuZCwgY3BsX2VuZF9zdWJiYW5kOworCisgICAgICAgICAgICBpZiAoY2hhbm5lbF9tb2RlIDwgQUMzX0NITU9ERV9TVEVSRU8pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNvdXBsaW5nIG5vdCBhbGxvd2VkIGluIG1vbm8gb3IgZHVhbC1tb25vXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVuaGFuY2VkIGNvdXBsaW5nICovCisgICAgICAgICAgICBpZiAocy0+ZWFjMyAmJiBnZXRfYml0czEoZ2JjKSkgeworICAgICAgICAgICAgICAgIC8qIFRPRE86IHBhcnNlIGVuaGFuY2VkIGNvdXBsaW5nIHN0cmF0ZWd5IGluZm8gKi8KKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJFbmhhbmNlZCBjb3VwbGluZyIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHdoaWNoIGNoYW5uZWxzIGFyZSBjb3VwbGVkICovCisgICAgICAgICAgICBpZiAocy0+ZWFjMyAmJiBzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8pIHsKKyAgICAgICAgICAgICAgICBzLT5jaGFubmVsX2luX2NwbFsxXSA9IDE7CisgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9pbl9jcGxbMl0gPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNoID0gMTsgY2ggPD0gZmJ3X2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgICAgICBzLT5jaGFubmVsX2luX2NwbFtjaF0gPSBnZXRfYml0czEoZ2JjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcGhhc2UgZmxhZ3MgaW4gdXNlICovCisgICAgICAgICAgICBpZiAoY2hhbm5lbF9tb2RlID09IEFDM19DSE1PREVfU1RFUkVPKQorICAgICAgICAgICAgICAgIHMtPnBoYXNlX2ZsYWdzX2luX3VzZSA9IGdldF9iaXRzMShnYmMpOworCisgICAgICAgICAgICAvKiBjb3VwbGluZyBmcmVxdWVuY3kgcmFuZ2UgKi8KKyAgICAgICAgICAgIGNwbF9zdGFydF9zdWJiYW5kID0gZ2V0X2JpdHMoZ2JjLCA0KTsKKyAgICAgICAgICAgIGNwbF9lbmRfc3ViYmFuZCA9IHMtPnNweF9pbl91c2UgPyAocy0+c3B4X3NyY19zdGFydF9mcmVxIC0gMzcpIC8gMTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzKGdiYywgNCkgKyAzOworICAgICAgICAgICAgaWYgKGNwbF9zdGFydF9zdWJiYW5kID49IGNwbF9lbmRfc3ViYmFuZCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBjb3VwbGluZyByYW5nZSAoJWQgPj0gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjcGxfc3RhcnRfc3ViYmFuZCwgY3BsX2VuZF9zdWJiYW5kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnN0YXJ0X2ZyZXFbQ1BMX0NIXSA9IGNwbF9zdGFydF9zdWJiYW5kICogMTIgKyAzNzsKKyAgICAgICAgICAgIHMtPmVuZF9mcmVxW0NQTF9DSF0gICA9IGNwbF9lbmRfc3ViYmFuZCAgICogMTIgKyAzNzsKKworICAgICAgICAgICAgZGVjb2RlX2JhbmRfc3RydWN0dXJlKGdiYywgYmxrLCBzLT5lYWMzLCAwLCBjcGxfc3RhcnRfc3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGxfZW5kX3N1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfZWFjM19kZWZhdWx0X2NwbF9iYW5kX3N0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+bnVtX2NwbF9iYW5kcywgcy0+Y3BsX2JhbmRfc2l6ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogY291cGxpbmcgbm90IGluIHVzZSAqLworICAgICAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IGZid19jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfaW5fY3BsW2NoXSA9IDA7CisgICAgICAgICAgICAgICAgcy0+Zmlyc3RfY3BsX2Nvb3Jkc1tjaF0gPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+Zmlyc3RfY3BsX2xlYWsgPSBzLT5lYWMzOworICAgICAgICAgICAgcy0+cGhhc2VfZmxhZ3NfaW5fdXNlID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXMtPmVhYzMpIHsKKyAgICAgICAgaWYgKCFibGspIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibmV3IGNvdXBsaW5nIHN0cmF0ZWd5IG11c3QgIgorICAgICAgICAgICAgICAgICAgICJiZSBwcmVzZW50IGluIGJsb2NrIDBcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5jcGxfaW5fdXNlW2Jsa10gPSBzLT5jcGxfaW5fdXNlW2Jsay0xXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjcGxfaW5fdXNlID0gcy0+Y3BsX2luX3VzZVtibGtdOworCisgICAgLyogY291cGxpbmcgY29vcmRpbmF0ZXMgKi8KKyAgICBpZiAoY3BsX2luX3VzZSkgeworICAgICAgICBpbnQgY3BsX2Nvb3Jkc19leGlzdCA9IDA7CisKKyAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IGZid19jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfaW5fY3BsW2NoXSkgeworICAgICAgICAgICAgICAgIGlmICgocy0+ZWFjMyAmJiBzLT5maXJzdF9jcGxfY29vcmRzW2NoXSkgfHwgZ2V0X2JpdHMxKGdiYykpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1hc3Rlcl9jcGxfY29vcmQsIGNwbF9jb29yZF9leHAsIGNwbF9jb29yZF9tYW50OworICAgICAgICAgICAgICAgICAgICBzLT5maXJzdF9jcGxfY29vcmRzW2NoXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNwbF9jb29yZHNfZXhpc3QgPSAxOworICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfY3BsX2Nvb3JkID0gMyAqIGdldF9iaXRzKGdiYywgMik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYm5kID0gMDsgYm5kIDwgcy0+bnVtX2NwbF9iYW5kczsgYm5kKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwbF9jb29yZF9leHAgPSBnZXRfYml0cyhnYmMsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgY3BsX2Nvb3JkX21hbnQgPSBnZXRfYml0cyhnYmMsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNwbF9jb29yZF9leHAgPT0gMTUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3BsX2Nvb3Jkc1tjaF1bYm5kXSA9IGNwbF9jb29yZF9tYW50IDw8IDIyOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNwbF9jb29yZHNbY2hdW2JuZF0gPSAoY3BsX2Nvb3JkX21hbnQgKyAxNikgPDwgMjE7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jcGxfY29vcmRzW2NoXVtibmRdID4+PSAoY3BsX2Nvb3JkX2V4cCArIG1hc3Rlcl9jcGxfY29vcmQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYmxrKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibmV3IGNvdXBsaW5nIGNvb3JkaW5hdGVzIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIHByZXNlbnQgaW4gYmxvY2sgMFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogY2hhbm5lbCBub3QgaW4gY291cGxpbmcgKi8KKyAgICAgICAgICAgICAgICBzLT5maXJzdF9jcGxfY29vcmRzW2NoXSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogcGhhc2UgZmxhZ3MgKi8KKyAgICAgICAgaWYgKGNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFX1NURVJFTyAmJiBjcGxfY29vcmRzX2V4aXN0KSB7CisgICAgICAgICAgICBmb3IgKGJuZCA9IDA7IGJuZCA8IHMtPm51bV9jcGxfYmFuZHM7IGJuZCsrKSB7CisgICAgICAgICAgICAgICAgcy0+cGhhc2VfZmxhZ3NbYm5kXSA9IHMtPnBoYXNlX2ZsYWdzX2luX3VzZT8gZ2V0X2JpdHMxKGdiYykgOiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogc3RlcmVvIHJlbWF0cml4aW5nIHN0cmF0ZWd5IGFuZCBiYW5kIHN0cnVjdHVyZSAqLworICAgIGlmIChjaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8pIHsKKyAgICAgICAgaWYgKChzLT5lYWMzICYmICFibGspIHx8IGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgICAgICBzLT5udW1fcmVtYXRyaXhpbmdfYmFuZHMgPSA0OworICAgICAgICAgICAgaWYgKGNwbF9pbl91c2UgJiYgcy0+c3RhcnRfZnJlcVtDUExfQ0hdIDw9IDYxKSB7CisgICAgICAgICAgICAgICAgcy0+bnVtX3JlbWF0cml4aW5nX2JhbmRzIC09IDEgKyAocy0+c3RhcnRfZnJlcVtDUExfQ0hdID09IDM3KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c3B4X2luX3VzZSAmJiBzLT5zcHhfc3JjX3N0YXJ0X2ZyZXEgPD0gNjEpIHsKKyAgICAgICAgICAgICAgICBzLT5udW1fcmVtYXRyaXhpbmdfYmFuZHMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoYm5kID0gMDsgYm5kIDwgcy0+bnVtX3JlbWF0cml4aW5nX2JhbmRzOyBibmQrKykKKyAgICAgICAgICAgICAgICBzLT5yZW1hdHJpeGluZ19mbGFnc1tibmRdID0gZ2V0X2JpdHMxKGdiYyk7CisgICAgICAgIH0gZWxzZSBpZiAoIWJsaykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIldhcm5pbmc6ICIKKyAgICAgICAgICAgICAgICAgICAibmV3IHJlbWF0cml4aW5nIHN0cmF0ZWd5IG5vdCBwcmVzZW50IGluIGJsb2NrIDBcbiIpOworICAgICAgICAgICAgcy0+bnVtX3JlbWF0cml4aW5nX2JhbmRzID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGV4cG9uZW50IHN0cmF0ZWdpZXMgZm9yIGVhY2ggY2hhbm5lbCAqLworICAgIGZvciAoY2ggPSAhY3BsX2luX3VzZTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKCFzLT5lYWMzKQorICAgICAgICAgICAgcy0+ZXhwX3N0cmF0ZWd5W2Jsa11bY2hdID0gZ2V0X2JpdHMoZ2JjLCAyIC0gKGNoID09IHMtPmxmZV9jaCkpOworICAgICAgICBpZiAocy0+ZXhwX3N0cmF0ZWd5W2Jsa11bY2hdICE9IEVYUF9SRVVTRSkKKyAgICAgICAgICAgIGJpdF9hbGxvY19zdGFnZXNbY2hdID0gMzsKKyAgICB9CisKKyAgICAvKiBjaGFubmVsIGJhbmR3aWR0aCAqLworICAgIGZvciAoY2ggPSAxOyBjaCA8PSBmYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgcy0+c3RhcnRfZnJlcVtjaF0gPSAwOworICAgICAgICBpZiAocy0+ZXhwX3N0cmF0ZWd5W2Jsa11bY2hdICE9IEVYUF9SRVVTRSkgeworICAgICAgICAgICAgaW50IGdyb3VwX3NpemU7CisgICAgICAgICAgICBpbnQgcHJldiA9IHMtPmVuZF9mcmVxW2NoXTsKKyAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX2luX2NwbFtjaF0pCisgICAgICAgICAgICAgICAgcy0+ZW5kX2ZyZXFbY2hdID0gcy0+c3RhcnRfZnJlcVtDUExfQ0hdOworICAgICAgICAgICAgZWxzZSBpZiAocy0+Y2hhbm5lbF91c2VzX3NweFtjaF0pCisgICAgICAgICAgICAgICAgcy0+ZW5kX2ZyZXFbY2hdID0gcy0+c3B4X3NyY19zdGFydF9mcmVxOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGJhbmR3aWR0aF9jb2RlID0gZ2V0X2JpdHMoZ2JjLCA2KTsKKyAgICAgICAgICAgICAgICBpZiAoYmFuZHdpZHRoX2NvZGUgPiA2MCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImJhbmR3aWR0aCBjb2RlID0gJWQgPiA2MFxuIiwgYmFuZHdpZHRoX2NvZGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+ZW5kX2ZyZXFbY2hdID0gYmFuZHdpZHRoX2NvZGUgKiAzICsgNzM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBncm91cF9zaXplID0gMyA8PCAocy0+ZXhwX3N0cmF0ZWd5W2Jsa11bY2hdIC0gMSk7CisgICAgICAgICAgICBzLT5udW1fZXhwX2dyb3Vwc1tjaF0gPSAocy0+ZW5kX2ZyZXFbY2hdICsgZ3JvdXBfc2l6ZS00KSAvIGdyb3VwX3NpemU7CisgICAgICAgICAgICBpZiAoYmxrID4gMCAmJiBzLT5lbmRfZnJlcVtjaF0gIT0gcHJldikKKyAgICAgICAgICAgICAgICBtZW1zZXQoYml0X2FsbG9jX3N0YWdlcywgMywgQUMzX01BWF9DSEFOTkVMUyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNwbF9pbl91c2UgJiYgcy0+ZXhwX3N0cmF0ZWd5W2Jsa11bQ1BMX0NIXSAhPSBFWFBfUkVVU0UpIHsKKyAgICAgICAgcy0+bnVtX2V4cF9ncm91cHNbQ1BMX0NIXSA9IChzLT5lbmRfZnJlcVtDUExfQ0hdIC0gcy0+c3RhcnRfZnJlcVtDUExfQ0hdKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAocy0+ZXhwX3N0cmF0ZWd5W2Jsa11bQ1BMX0NIXSAtIDEpKTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgZXhwb25lbnRzIGZvciBlYWNoIGNoYW5uZWwgKi8KKyAgICBmb3IgKGNoID0gIWNwbF9pbl91c2U7IGNoIDw9IHMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGlmIChzLT5leHBfc3RyYXRlZ3lbYmxrXVtjaF0gIT0gRVhQX1JFVVNFKSB7CisgICAgICAgICAgICBzLT5kZXhwc1tjaF1bMF0gPSBnZXRfYml0cyhnYmMsIDQpIDw8ICFjaDsKKyAgICAgICAgICAgIGlmIChkZWNvZGVfZXhwb25lbnRzKGdiYywgcy0+ZXhwX3N0cmF0ZWd5W2Jsa11bY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bnVtX2V4cF9ncm91cHNbY2hdLCBzLT5kZXhwc1tjaF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+ZGV4cHNbY2hdW3MtPnN0YXJ0X2ZyZXFbY2hdKyEhY2hdKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXhwb25lbnQgb3V0LW9mLXJhbmdlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCAhPSBDUExfQ0ggJiYgY2ggIT0gcy0+bGZlX2NoKQorICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYmMsIDIpOyAvKiBza2lwIGdhaW5ybmcgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGJpdCBhbGxvY2F0aW9uIGluZm9ybWF0aW9uICovCisgICAgaWYgKHMtPmJpdF9hbGxvY2F0aW9uX3N5bnRheCkgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiYykpIHsKKyAgICAgICAgICAgIHMtPmJpdF9hbGxvY19wYXJhbXMuc2xvd19kZWNheSA9IGZmX2FjM19zbG93X2RlY2F5X3RhYltnZXRfYml0cyhnYmMsIDIpXSA+PiBzLT5iaXRfYWxsb2NfcGFyYW1zLnNyX3NoaWZ0OworICAgICAgICAgICAgcy0+Yml0X2FsbG9jX3BhcmFtcy5mYXN0X2RlY2F5ID0gZmZfYWMzX2Zhc3RfZGVjYXlfdGFiW2dldF9iaXRzKGdiYywgMildID4+IHMtPmJpdF9hbGxvY19wYXJhbXMuc3Jfc2hpZnQ7CisgICAgICAgICAgICBzLT5iaXRfYWxsb2NfcGFyYW1zLnNsb3dfZ2FpbiAgPSBmZl9hYzNfc2xvd19nYWluX3RhYltnZXRfYml0cyhnYmMsIDIpXTsKKyAgICAgICAgICAgIHMtPmJpdF9hbGxvY19wYXJhbXMuZGJfcGVyX2JpdCA9IGZmX2FjM19kYl9wZXJfYml0X3RhYltnZXRfYml0cyhnYmMsIDIpXTsKKyAgICAgICAgICAgIHMtPmJpdF9hbGxvY19wYXJhbXMuZmxvb3IgID0gZmZfYWMzX2Zsb29yX3RhYltnZXRfYml0cyhnYmMsIDMpXTsKKyAgICAgICAgICAgIGZvciAoY2ggPSAhY3BsX2luX3VzZTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgYml0X2FsbG9jX3N0YWdlc1tjaF0gPSBGRk1BWChiaXRfYWxsb2Nfc3RhZ2VzW2NoXSwgMik7CisgICAgICAgIH0gZWxzZSBpZiAoIWJsaykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJuZXcgYml0IGFsbG9jYXRpb24gaW5mbyBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAiYmUgcHJlc2VudCBpbiBibG9jayAwXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc2lnbmFsLXRvLW5vaXNlIHJhdGlvIG9mZnNldHMgYW5kIGZhc3QgZ2FpbnMgKHNpZ25hbC10by1tYXNrIHJhdGlvcykgKi8KKyAgICBpZiAoIXMtPmVhYzMgfHwgIWJsaykgeworICAgICAgICBpZiAocy0+c25yX29mZnNldF9zdHJhdGVneSAmJiBnZXRfYml0czEoZ2JjKSkgeworICAgICAgICAgICAgaW50IHNuciA9IDA7CisgICAgICAgICAgICBpbnQgY3NucjsKKyAgICAgICAgICAgIGNzbnIgPSAoZ2V0X2JpdHMoZ2JjLCA2KSAtIDE1KSA8PCA0OworICAgICAgICAgICAgZm9yIChpID0gY2ggPSAhY3BsX2luX3VzZTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICAvKiBzbnIgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgaWYgKGNoID09IGkgfHwgcy0+c25yX29mZnNldF9zdHJhdGVneSA9PSAyKQorICAgICAgICAgICAgICAgICAgICBzbnIgPSAoY3NuciArIGdldF9iaXRzKGdiYywgNCkpIDw8IDI7CisgICAgICAgICAgICAgICAgLyogcnVuIGF0IGxlYXN0IGxhc3QgYml0IGFsbG9jYXRpb24gc3RhZ2UgaWYgc25yIG9mZnNldCBjaGFuZ2VzICovCisgICAgICAgICAgICAgICAgaWYgKGJsayAmJiBzLT5zbnJfb2Zmc2V0W2NoXSAhPSBzbnIpIHsKKyAgICAgICAgICAgICAgICAgICAgYml0X2FsbG9jX3N0YWdlc1tjaF0gPSBGRk1BWChiaXRfYWxsb2Nfc3RhZ2VzW2NoXSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPnNucl9vZmZzZXRbY2hdID0gc25yOworCisgICAgICAgICAgICAgICAgLyogZmFzdCBnYWluIChub3JtYWwgQUMtMyBvbmx5KSAqLworICAgICAgICAgICAgICAgIGlmICghcy0+ZWFjMykgeworICAgICAgICAgICAgICAgICAgICBpbnQgcHJldiA9IHMtPmZhc3RfZ2FpbltjaF07CisgICAgICAgICAgICAgICAgICAgIHMtPmZhc3RfZ2FpbltjaF0gPSBmZl9hYzNfZmFzdF9nYWluX3RhYltnZXRfYml0cyhnYmMsIDMpXTsKKyAgICAgICAgICAgICAgICAgICAgLyogcnVuIGxhc3QgMiBiaXQgYWxsb2NhdGlvbiBzdGFnZXMgaWYgZmFzdCBnYWluIGNoYW5nZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJsayAmJiBwcmV2ICE9IHMtPmZhc3RfZ2FpbltjaF0pCisgICAgICAgICAgICAgICAgICAgICAgICBiaXRfYWxsb2Nfc3RhZ2VzW2NoXSA9IEZGTUFYKGJpdF9hbGxvY19zdGFnZXNbY2hdLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXMtPmVhYzMgJiYgIWJsaykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJuZXcgc25yIG9mZnNldHMgbXVzdCBiZSBwcmVzZW50IGluIGJsb2NrIDBcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmYXN0IGdhaW4gKEUtQUMtMyBvbmx5KSAqLworICAgIGlmIChzLT5mYXN0X2dhaW5fc3ludGF4ICYmIGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgIGZvciAoY2ggPSAhY3BsX2luX3VzZTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGludCBwcmV2ID0gcy0+ZmFzdF9nYWluW2NoXTsKKyAgICAgICAgICAgIHMtPmZhc3RfZ2FpbltjaF0gPSBmZl9hYzNfZmFzdF9nYWluX3RhYltnZXRfYml0cyhnYmMsIDMpXTsKKyAgICAgICAgICAgIC8qIHJ1biBsYXN0IDIgYml0IGFsbG9jYXRpb24gc3RhZ2VzIGlmIGZhc3QgZ2FpbiBjaGFuZ2VzICovCisgICAgICAgICAgICBpZiAoYmxrICYmIHByZXYgIT0gcy0+ZmFzdF9nYWluW2NoXSkKKyAgICAgICAgICAgICAgICBiaXRfYWxsb2Nfc3RhZ2VzW2NoXSA9IEZGTUFYKGJpdF9hbGxvY19zdGFnZXNbY2hdLCAyKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocy0+ZWFjMyAmJiAhYmxrKSB7CisgICAgICAgIGZvciAoY2ggPSAhY3BsX2luX3VzZTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBzLT5mYXN0X2dhaW5bY2hdID0gZmZfYWMzX2Zhc3RfZ2Fpbl90YWJbNF07CisgICAgfQorCisgICAgLyogRS1BQy0zIHRvIEFDLTMgY29udmVydGVyIFNOUiBvZmZzZXQgKi8KKyAgICBpZiAocy0+ZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfSU5ERVBFTkRFTlQgJiYgZ2V0X2JpdHMxKGdiYykpIHsKKyAgICAgICAgc2tpcF9iaXRzKGdiYywgMTApOyAvLyBza2lwIGNvbnZlcnRlciBzbnIgb2Zmc2V0CisgICAgfQorCisgICAgLyogY291cGxpbmcgbGVhayBpbmZvcm1hdGlvbiAqLworICAgIGlmIChjcGxfaW5fdXNlKSB7CisgICAgICAgIGlmIChzLT5maXJzdF9jcGxfbGVhayB8fCBnZXRfYml0czEoZ2JjKSkgeworICAgICAgICAgICAgaW50IGZsID0gZ2V0X2JpdHMoZ2JjLCAzKTsKKyAgICAgICAgICAgIGludCBzbCA9IGdldF9iaXRzKGdiYywgMyk7CisgICAgICAgICAgICAvKiBydW4gbGFzdCAyIGJpdCBhbGxvY2F0aW9uIHN0YWdlcyBmb3IgY291cGxpbmcgY2hhbm5lbCBpZgorICAgICAgICAgICAgICAgY291cGxpbmcgbGVhayBjaGFuZ2VzICovCisgICAgICAgICAgICBpZiAoYmxrICYmIChmbCAhPSBzLT5iaXRfYWxsb2NfcGFyYW1zLmNwbF9mYXN0X2xlYWsgfHwKKyAgICAgICAgICAgICAgICBzbCAhPSBzLT5iaXRfYWxsb2NfcGFyYW1zLmNwbF9zbG93X2xlYWspKSB7CisgICAgICAgICAgICAgICAgYml0X2FsbG9jX3N0YWdlc1tDUExfQ0hdID0gRkZNQVgoYml0X2FsbG9jX3N0YWdlc1tDUExfQ0hdLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmJpdF9hbGxvY19wYXJhbXMuY3BsX2Zhc3RfbGVhayA9IGZsOworICAgICAgICAgICAgcy0+Yml0X2FsbG9jX3BhcmFtcy5jcGxfc2xvd19sZWFrID0gc2w7CisgICAgICAgIH0gZWxzZSBpZiAoIXMtPmVhYzMgJiYgIWJsaykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJuZXcgY291cGxpbmcgbGVhayBpbmZvIG11c3QgIgorICAgICAgICAgICAgICAgICAgICJiZSBwcmVzZW50IGluIGJsb2NrIDBcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgcy0+Zmlyc3RfY3BsX2xlYWsgPSAwOworICAgIH0KKworICAgIC8qIGRlbHRhIGJpdCBhbGxvY2F0aW9uIGluZm9ybWF0aW9uICovCisgICAgaWYgKHMtPmRiYV9zeW50YXggJiYgZ2V0X2JpdHMxKGdiYykpIHsKKyAgICAgICAgLyogZGVsdGEgYml0IGFsbG9jYXRpb24gZXhpc3RzIChzdHJhdGVneSkgKi8KKyAgICAgICAgZm9yIChjaCA9ICFjcGxfaW5fdXNlOyBjaCA8PSBmYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIHMtPmRiYV9tb2RlW2NoXSA9IGdldF9iaXRzKGdiYywgMik7CisgICAgICAgICAgICBpZiAocy0+ZGJhX21vZGVbY2hdID09IERCQV9SRVNFUlZFRCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVsdGEgYml0IGFsbG9jYXRpb24gc3RyYXRlZ3kgcmVzZXJ2ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYml0X2FsbG9jX3N0YWdlc1tjaF0gPSBGRk1BWChiaXRfYWxsb2Nfc3RhZ2VzW2NoXSwgMik7CisgICAgICAgIH0KKyAgICAgICAgLyogY2hhbm5lbCBkZWx0YSBvZmZzZXQsIGxlbiBhbmQgYml0IGFsbG9jYXRpb24gKi8KKyAgICAgICAgZm9yIChjaCA9ICFjcGxfaW5fdXNlOyBjaCA8PSBmYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5kYmFfbW9kZVtjaF0gPT0gREJBX05FVykgeworICAgICAgICAgICAgICAgIHMtPmRiYV9uc2Vnc1tjaF0gPSBnZXRfYml0cyhnYmMsIDMpICsgMTsKKyAgICAgICAgICAgICAgICBmb3IgKHNlZyA9IDA7IHNlZyA8IHMtPmRiYV9uc2Vnc1tjaF07IHNlZysrKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmRiYV9vZmZzZXRzW2NoXVtzZWddID0gZ2V0X2JpdHMoZ2JjLCA1KTsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZGJhX2xlbmd0aHNbY2hdW3NlZ10gPSBnZXRfYml0cyhnYmMsIDQpOworICAgICAgICAgICAgICAgICAgICBzLT5kYmFfdmFsdWVzW2NoXVtzZWddICA9IGdldF9iaXRzKGdiYywgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIHJ1biBsYXN0IDIgYml0IGFsbG9jYXRpb24gc3RhZ2VzIGlmIG5ldyBkYmEgdmFsdWVzICovCisgICAgICAgICAgICAgICAgYml0X2FsbG9jX3N0YWdlc1tjaF0gPSBGRk1BWChiaXRfYWxsb2Nfc3RhZ2VzW2NoXSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJsayA9PSAwKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8PSBzLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgcy0+ZGJhX21vZGVbY2hdID0gREJBX05PTkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBCaXQgYWxsb2NhdGlvbiAqLworICAgIGZvciAoY2ggPSAhY3BsX2luX3VzZTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKGJpdF9hbGxvY19zdGFnZXNbY2hdID4gMikgeworICAgICAgICAgICAgLyogRXhwb25lbnQgbWFwcGluZyBpbnRvIFBTRCBhbmQgUFNEIGludGVncmF0aW9uICovCisgICAgICAgICAgICBmZl9hYzNfYml0X2FsbG9jX2NhbGNfcHNkKHMtPmRleHBzW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhcnRfZnJlcVtjaF0sIHMtPmVuZF9mcmVxW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHNkW2NoXSwgcy0+YmFuZF9wc2RbY2hdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYml0X2FsbG9jX3N0YWdlc1tjaF0gPiAxKSB7CisgICAgICAgICAgICAvKiBDb21wdXRlIGV4Y2l0YXRpb24gZnVuY3Rpb24sIENvbXB1dGUgbWFza2luZyBjdXJ2ZSwgYW5kCisgICAgICAgICAgICAgICBBcHBseSBkZWx0YSBiaXQgYWxsb2NhdGlvbiAqLworICAgICAgICAgICAgaWYgKGZmX2FjM19iaXRfYWxsb2NfY2FsY19tYXNrKCZzLT5iaXRfYWxsb2NfcGFyYW1zLCBzLT5iYW5kX3BzZFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhcnRfZnJlcVtjaF0sICBzLT5lbmRfZnJlcVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmFzdF9nYWluW2NoXSwgICAoY2ggPT0gcy0+bGZlX2NoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kYmFfbW9kZVtjaF0sICAgIHMtPmRiYV9uc2Vnc1tjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGJhX29mZnNldHNbY2hdLCBzLT5kYmFfbGVuZ3Roc1tjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGJhX3ZhbHVlc1tjaF0sICBzLT5tYXNrW2NoXSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGluIGJpdCBhbGxvY2F0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYml0X2FsbG9jX3N0YWdlc1tjaF0gPiAwKSB7CisgICAgICAgICAgICAvKiBDb21wdXRlIGJpdCBhbGxvY2F0aW9uICovCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpiYXBfdGFiID0gcy0+Y2hhbm5lbF91c2VzX2FodFtjaF0gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2VhYzNfaGViYXBfdGFiIDogZmZfYWMzX2JhcF90YWI7CisgICAgICAgICAgICBzLT5hYzNkc3AuYml0X2FsbG9jX2NhbGNfYmFwKHMtPm1hc2tbY2hdLCBzLT5wc2RbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdGFydF9mcmVxW2NoXSwgcy0+ZW5kX2ZyZXFbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zbnJfb2Zmc2V0W2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Yml0X2FsbG9jX3BhcmFtcy5mbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFwX3RhYiwgcy0+YmFwW2NoXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1bnVzZWQgZHVtbXkgZGF0YSAqLworICAgIGlmIChzLT5za2lwX3N5bnRheCAmJiBnZXRfYml0czEoZ2JjKSkgeworICAgICAgICBpbnQgc2tpcGwgPSBnZXRfYml0cyhnYmMsIDkpOworICAgICAgICB3aGlsZSAoc2tpcGwtLSkKKyAgICAgICAgICAgIHNraXBfYml0cyhnYmMsIDgpOworICAgIH0KKworICAgIC8qIHVucGFjayB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50cworICAgICAgIHRoaXMgYWxzbyB1bmNvdXBsZXMgY2hhbm5lbHMgaWYgY291cGxpbmcgaXMgaW4gdXNlLiAqLworICAgIGRlY29kZV90cmFuc2Zvcm1fY29lZmZzKHMsIGJsayk7CisKKyAgICAvKiBUT0RPOiBnZW5lcmF0ZSBlbmhhbmNlZCBjb3VwbGluZyBjb29yZGluYXRlcyBhbmQgdW5jb3VwbGUgKi8KKworICAgIC8qIHJlY292ZXIgY29lZmZpY2llbnRzIGlmIHJlbWF0cml4aW5nIGlzIGluIHVzZSAqLworICAgIGlmIChzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8pCisgICAgICAgIGRvX3JlbWF0cml4aW5nKHMpOworCisgICAgLyogYXBwbHkgc2NhbGluZyB0byBjb2VmZmljaWVudHMgKGhlYWRyb29tLCBkeW5ybmcpICovCisgICAgZm9yIChjaCA9IDE7IGNoIDw9IHMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGludCBhdWRpb19jaGFubmVsID0gMDsKKyAgICAgICAgSU5URkxPQVQgZ2FpbjsKKyAgICAgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFX0RVQUxNT05PKQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbCA9IDItY2g7CisgICAgICAgIGlmIChzLT5oZWF2eV9jb21wcmVzc2lvbiAmJiBzLT5jb21wcmVzc2lvbl9leGlzdHNbYXVkaW9fY2hhbm5lbF0pCisgICAgICAgICAgICBnYWluID0gcy0+aGVhdnlfZHluYW1pY19yYW5nZVthdWRpb19jaGFubmVsXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ2FpbiA9IHMtPmR5bmFtaWNfcmFuZ2VbYXVkaW9fY2hhbm5lbF07CisKKyNpZiBVU0VfRklYRUQKKyAgICAgICAgc2NhbGVfY29lZnMocy0+dHJhbnNmb3JtX2NvZWZmc1tjaF0sIHMtPmZpeGVkX2NvZWZmc1tjaF0sIGdhaW4sIDI1Nik7CisjZWxzZQorICAgICAgICBpZiAocy0+dGFyZ2V0X2xldmVsICE9IDApCisgICAgICAgICAgZ2FpbiA9IGdhaW4gKiBzLT5sZXZlbF9nYWluW2F1ZGlvX2NoYW5uZWxdOworICAgICAgICBnYWluICo9IDEuMCAvIDQxOTQzMDQuMGY7CisgICAgICAgIHMtPmZtdF9jb252LmludDMyX3RvX2Zsb2F0X2ZtdWxfc2NhbGFyKHMtPnRyYW5zZm9ybV9jb2VmZnNbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5maXhlZF9jb2VmZnNbY2hdLCBnYWluLCAyNTYpOworI2VuZGlmCisgICAgfQorCisgICAgLyogYXBwbHkgc3BlY3RyYWwgZXh0ZW5zaW9uIHRvIGhpZ2ggZnJlcXVlbmN5IGJpbnMgKi8KKyAgICBpZiAocy0+c3B4X2luX3VzZSAmJiBDT05GSUdfRUFDM19ERUNPREVSKSB7CisgICAgICAgIGZmX2VhYzNfYXBwbHlfc3BlY3RyYWxfZXh0ZW5zaW9uKHMpOworICAgIH0KKworICAgIC8qIGRvd25taXggYW5kIE1EQ1QuIG9yZGVyIGRlcGVuZHMgb24gd2hldGhlciBibG9jayBzd2l0Y2hpbmcgaXMgdXNlZCBmb3IKKyAgICAgICBhbnkgY2hhbm5lbCBpbiB0aGlzIGJsb2NrLiB0aGlzIGlzIGJlY2F1c2UgY29lZmZpY2llbnRzIGZvciB0aGUgbG9uZworICAgICAgIGFuZCBzaG9ydCB0cmFuc2Zvcm1zIGNhbm5vdCBiZSBtaXhlZC4gKi8KKyAgICBkb3dubWl4X291dHB1dCA9IHMtPmNoYW5uZWxzICE9IHMtPm91dF9jaGFubmVscyAmJgorICAgICAgICAgICAgICAgICAgICAgISgocy0+b3V0cHV0X21vZGUgJiBBQzNfT1VUUFVUX0xGRU9OKSAmJgorICAgICAgICAgICAgICAgICAgICAgcy0+ZmJ3X2NoYW5uZWxzID09IHMtPm91dF9jaGFubmVscyk7CisgICAgaWYgKGRpZmZlcmVudF90cmFuc2Zvcm1zKSB7CisgICAgICAgIC8qIHRoZSBkZWxheSBzYW1wbGVzIGhhdmUgYWxyZWFkeSBiZWVuIGRvd25taXhlZCwgc28gd2UgdXBtaXggdGhlIGRlbGF5CisgICAgICAgICAgIHNhbXBsZXMgaW4gb3JkZXIgdG8gcmVjb25zdHJ1Y3QgYWxsIGNoYW5uZWxzIGJlZm9yZSBkb3dubWl4aW5nLiAqLworICAgICAgICBpZiAocy0+ZG93bm1peGVkKSB7CisgICAgICAgICAgICBzLT5kb3dubWl4ZWQgPSAwOworICAgICAgICAgICAgYWMzX3VwbWl4X2RlbGF5KHMpOworICAgICAgICB9CisKKyAgICAgICAgZG9faW1kY3Qocywgcy0+Y2hhbm5lbHMpOworCisgICAgICAgIGlmIChkb3dubWl4X291dHB1dCkgeworI2lmIFVTRV9GSVhFRAorICAgICAgICAgICAgYWMzX2Rvd25taXhfY19maXhlZDE2KHMtPm91dHB0ciwgcy0+ZG93bm1peF9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5vdXRfY2hhbm5lbHMsIHMtPmZid19jaGFubmVscywgMjU2KTsKKyNlbHNlCisgICAgICAgICAgICBzLT5hYzNkc3AuZG93bm1peChzLT5vdXRwdHIsIHMtPmRvd25taXhfY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+b3V0X2NoYW5uZWxzLCBzLT5mYndfY2hhbm5lbHMsIDI1Nik7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkb3dubWl4X291dHB1dCkgeworICAgICAgICAgICAgcy0+YWMzZHNwLkFDM19SRU5BTUUoZG93bm1peCkocy0+eGNmcHRyICsgMSwgcy0+ZG93bm1peF9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5vdXRfY2hhbm5lbHMsIHMtPmZid19jaGFubmVscywgMjU2KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb3dubWl4X291dHB1dCAmJiAhcy0+ZG93bm1peGVkKSB7CisgICAgICAgICAgICBzLT5kb3dubWl4ZWQgPSAxOworICAgICAgICAgICAgcy0+YWMzZHNwLkFDM19SRU5BTUUoZG93bm1peCkocy0+ZGx5cHRyLCBzLT5kb3dubWl4X2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dF9jaGFubmVscywgcy0+ZmJ3X2NoYW5uZWxzLCAxMjgpOworICAgICAgICB9CisKKyAgICAgICAgZG9faW1kY3Qocywgcy0+b3V0X2NoYW5uZWxzKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgYSBzaW5nbGUgQUMtMyBmcmFtZS4KKyAqLworc3RhdGljIGludCBhYzNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICogYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBBQzNEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgYmxrLCBjaCwgZXJyLCByZXQ7CisgICAgY29uc3QgdWludDhfdCAqY2hhbm5lbF9tYXA7CisgICAgY29uc3QgU0hPUlRGTE9BVCAqb3V0cHV0W0FDM19NQVhfQ0hBTk5FTFNdOworICAgIGVudW0gQVZNYXRyaXhFbmNvZGluZyBtYXRyaXhfZW5jb2Rpbmc7CisgICAgQVZEb3dubWl4SW5mbyAqZG93bm1peF9pbmZvOworCisgICAgLyogY29weSBpbnB1dCBidWZmZXIgdG8gZGVjb2RlciBjb250ZXh0IHRvIGF2b2lkIHJlYWRpbmcgcGFzdCB0aGUgZW5kCisgICAgICAgb2YgdGhlIGJ1ZmZlciwgd2hpY2ggY2FuIGJlIGNhdXNlZCBieSBhIGRhbWFnZWQgaW5wdXQgc3RyZWFtLiAqLworICAgIGlmIChidWZfc2l6ZSA+PSAyICYmIEFWX1JCMTYoYnVmKSA9PSAweDc3MEIpIHsKKyAgICAgICAgLy8gc2VlbXMgdG8gYmUgYnl0ZS1zd2FwcGVkIEFDLTMKKyAgICAgICAgaW50IGNudCA9IEZGTUlOKGJ1Zl9zaXplLCBBQzNfRlJBTUVfQlVGRkVSX1NJWkUpID4+IDE7CisgICAgICAgIHMtPmJkc3AuYnN3YXAxNl9idWYoKHVpbnQxNl90ICopIHMtPmlucHV0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDE2X3QgKikgYnVmLCBjbnQpOworICAgIH0gZWxzZQorICAgICAgICBtZW1jcHkocy0+aW5wdXRfYnVmZmVyLCBidWYsIEZGTUlOKGJ1Zl9zaXplLCBBQzNfRlJBTUVfQlVGRkVSX1NJWkUpKTsKKyAgICBidWYgPSBzLT5pbnB1dF9idWZmZXI7CisgICAgLyogaW5pdGlhbGl6ZSB0aGUgR2V0Qml0Q29udGV4dCB3aXRoIHRoZSBzdGFydCBvZiB2YWxpZCBBQy0zIEZyYW1lICovCisgICAgaW5pdF9nZXRfYml0cygmcy0+Z2JjLCBidWYsIGJ1Zl9zaXplICogOCk7CisKKyAgICAvKiBwYXJzZSB0aGUgc3luY2luZm8gKi8KKyAgICBlcnIgPSBwYXJzZV9mcmFtZV9oZWFkZXIocyk7CisKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICAgIGNhc2UgQUFDX0FDM19QQVJTRV9FUlJPUl9TWU5DOgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmcmFtZSBzeW5jIGVycm9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBjYXNlIEFBQ19BQzNfUEFSU0VfRVJST1JfQlNJRDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBiaXRzdHJlYW0gaWRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFDX0FDM19QQVJTRV9FUlJPUl9TQU1QTEVfUkFURToKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBzYW1wbGUgcmF0ZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQUNfQUMzX1BBUlNFX0VSUk9SX0ZSQU1FX1NJWkU6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgZnJhbWUgc2l6ZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQUNfQUMzX1BBUlNFX0VSUk9SX0ZSQU1FX1RZUEU6CisgICAgICAgICAgICAvKiBza2lwIGZyYW1lIGlmIENSQyBpcyBvay4gb3RoZXJ3aXNlIHVzZSBlcnJvciBjb25jZWFsbWVudC4gKi8KKyAgICAgICAgICAgIC8qIFRPRE86IGFkZCBzdXBwb3J0IGZvciBzdWJzdHJlYW1zIGFuZCBkZXBlbmRlbnQgZnJhbWVzICovCisgICAgICAgICAgICBpZiAocy0+ZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfREVQRU5ERU5UIHx8IHMtPnN1YnN0cmVhbWlkKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgInVuc3VwcG9ydGVkIGZyYW1lIHR5cGUgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICJza2lwcGluZyBmcmFtZVxuIik7CisgICAgICAgICAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGZyYW1lIHR5cGVcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFDX0FDM19QQVJTRV9FUlJPUl9DUkM6CisgICAgICAgIGNhc2UgQUFDX0FDM19QQVJTRV9FUlJPUl9DSEFOTkVMX0NGRzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBOb3JtYWwgQVZFUlJPUiBkbyBub3QgdHJ5IHRvIHJlY292ZXIuCisgICAgICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogY2hlY2sgdGhhdCByZXBvcnRlZCBmcmFtZSBzaXplIGZpdHMgaW4gaW5wdXQgYnVmZmVyICovCisgICAgICAgIGlmIChzLT5mcmFtZV9zaXplID4gYnVmX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW5jb21wbGV0ZSBmcmFtZVxuIik7CisgICAgICAgICAgICBlcnIgPSBBQUNfQUMzX1BBUlNFX0VSUk9SX0ZSQU1FX1NJWkU7CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9DUkNDSEVDS3xBVl9FRl9DQVJFRlVMKSkgeworICAgICAgICAgICAgLyogY2hlY2sgZm9yIGNyYyBtaXNtYXRjaCAqLworICAgICAgICAgICAgaWYgKGF2X2NyYyhhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18xNl9BTlNJKSwgMCwgJmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWVfc2l6ZSAtIDIpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmcmFtZSBDUkMgbWlzbWF0Y2hcbiIpOworICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZXJyID0gQUFDX0FDM19QQVJTRV9FUlJPUl9DUkM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBmcmFtZSBpcyBvaywgc2V0IGF1ZGlvIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoIWVycikgeworICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBzLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgYXZjdHgtPmJpdF9yYXRlICAgID0gcy0+Yml0X3JhdGU7CisgICAgfQorCisgICAgLyogY2hhbm5lbCBjb25maWcgKi8KKyAgICBpZiAoIWVyciB8fCAocy0+Y2hhbm5lbHMgJiYgcy0+b3V0X2NoYW5uZWxzICE9IHMtPmNoYW5uZWxzKSkgeworICAgICAgICBzLT5vdXRfY2hhbm5lbHMgPSBzLT5jaGFubmVsczsKKyAgICAgICAgcy0+b3V0cHV0X21vZGUgID0gcy0+Y2hhbm5lbF9tb2RlOworICAgICAgICBpZiAocy0+bGZlX29uKQorICAgICAgICAgICAgcy0+b3V0cHV0X21vZGUgfD0gQUMzX09VVFBVVF9MRkVPTjsKKyAgICAgICAgaWYgKHMtPmNoYW5uZWxzID4gMSAmJgorICAgICAgICAgICAgYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgPT0gQVZfQ0hfTEFZT1VUX01PTk8pIHsKKyAgICAgICAgICAgIHMtPm91dF9jaGFubmVscyA9IDE7CisgICAgICAgICAgICBzLT5vdXRwdXRfbW9kZSAgPSBBQzNfQ0hNT0RFX01PTk87CisgICAgICAgIH0gZWxzZSBpZiAocy0+Y2hhbm5lbHMgPiAyICYmCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgPT0gQVZfQ0hfTEFZT1VUX1NURVJFTykgeworICAgICAgICAgICAgcy0+b3V0X2NoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIHMtPm91dHB1dF9tb2RlICA9IEFDM19DSE1PREVfU1RFUkVPOworICAgICAgICB9CisKKyAgICAgICAgcy0+bG9yb19jZW50ZXJfbWl4X2xldmVsICAgPSBnYWluX2xldmVsc1tzLT4gIGNlbnRlcl9taXhfbGV2ZWxdOworICAgICAgICBzLT5sb3JvX3N1cnJvdW5kX21peF9sZXZlbCA9IGdhaW5fbGV2ZWxzW3MtPnN1cnJvdW5kX21peF9sZXZlbF07CisgICAgICAgIHMtPmx0cnRfY2VudGVyX21peF9sZXZlbCAgID0gTEVWRUxfTUlOVVNfM0RCOworICAgICAgICBzLT5sdHJ0X3N1cnJvdW5kX21peF9sZXZlbCA9IExFVkVMX01JTlVTXzNEQjsKKyAgICAgICAgLyogc2V0IGRvd25taXhpbmcgY29lZmZpY2llbnRzIGlmIG5lZWRlZCAqLworICAgICAgICBpZiAocy0+Y2hhbm5lbHMgIT0gcy0+b3V0X2NoYW5uZWxzICYmICEoKHMtPm91dHB1dF9tb2RlICYgQUMzX09VVFBVVF9MRkVPTikgJiYKKyAgICAgICAgICAgICAgICBzLT5mYndfY2hhbm5lbHMgPT0gcy0+b3V0X2NoYW5uZWxzKSkgeworICAgICAgICAgICAgc2V0X2Rvd25taXhfY29lZmZzKHMpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghcy0+Y2hhbm5lbHMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bmFibGUgdG8gZGV0ZXJtaW5lIGNoYW5uZWwgbW9kZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhdmN0eC0+Y2hhbm5lbHMgPSBzLT5vdXRfY2hhbm5lbHM7CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gYXZwcml2X2FjM19jaGFubmVsX2xheW91dF90YWJbcy0+b3V0cHV0X21vZGUgJiB+QUMzX09VVFBVVF9MRkVPTl07CisgICAgaWYgKHMtPm91dHB1dF9tb2RlICYgQUMzX09VVFBVVF9MRkVPTikKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0IHw9IEFWX0NIX0xPV19GUkVRVUVOQ1k7CisKKyAgICAvKiBzZXQgYXVkaW8gc2VydmljZSB0eXBlIGJhc2VkIG9uIGJpdHN0cmVhbSBtb2RlIGZvciBBQy0zICovCisgICAgYXZjdHgtPmF1ZGlvX3NlcnZpY2VfdHlwZSA9IHMtPmJpdHN0cmVhbV9tb2RlOworICAgIGlmIChzLT5iaXRzdHJlYW1fbW9kZSA9PSAweDcgJiYgcy0+Y2hhbm5lbHMgPiAxKQorICAgICAgICBhdmN0eC0+YXVkaW9fc2VydmljZV90eXBlID0gQVZfQVVESU9fU0VSVklDRV9UWVBFX0tBUkFPS0U7CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gcy0+bnVtX2Jsb2NrcyAqIEFDM19CTE9DS19TSVpFOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBkZWNvZGUgdGhlIGF1ZGlvIGJsb2NrcyAqLworICAgIGNoYW5uZWxfbWFwID0gZmZfYWMzX2RlY19jaGFubmVsX21hcFtzLT5vdXRwdXRfbW9kZSAmIH5BQzNfT1VUUFVUX0xGRU9OXVtzLT5sZmVfb25dOworICAgIGZvciAoY2ggPSAwOyBjaCA8IEFDM19NQVhfQ0hBTk5FTFM7IGNoKyspIHsKKyAgICAgICAgb3V0cHV0W2NoXSA9IHMtPm91dHB1dFtjaF07CisgICAgICAgIHMtPm91dHB0cltjaF0gPSBzLT5vdXRwdXRbY2hdOworICAgIH0KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAoY2ggPCBzLT5vdXRfY2hhbm5lbHMpCisgICAgICAgICAgICBzLT5vdXRwdHJbY2hhbm5lbF9tYXBbY2hdXSA9IChTSE9SVEZMT0FUICopZnJhbWUtPmRhdGFbY2hdOworICAgIH0KKyAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgIGlmICghZXJyICYmIGRlY29kZV9hdWRpb19ibG9jayhzLCBibGspKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGRlY29kaW5nIHRoZSBhdWRpbyBibG9ja1xuIik7CisgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5vdXRfY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgbWVtY3B5KCgoU0hPUlRGTE9BVCopZnJhbWUtPmRhdGFbY2hdKSArIEFDM19CTE9DS19TSVpFKmJsaywgb3V0cHV0W2NoXSwgQUMzX0JMT0NLX1NJWkUqc2l6ZW9mKFNIT1JURkxPQVQpKTsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+b3V0X2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgb3V0cHV0W2NoXSA9IHMtPm91dHB0cltjaGFubmVsX21hcFtjaF1dOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5vdXRfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGlmICghY2ggfHwgY2hhbm5lbF9tYXBbY2hdKQorICAgICAgICAgICAgICAgIHMtPm91dHB0cltjaGFubmVsX21hcFtjaF1dICs9IEFDM19CTE9DS19TSVpFOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJhbWVfc2V0X2RlY29kZV9lcnJvcl9mbGFncyhmcmFtZSwgZXJyID8gRkZfREVDT0RFX0VSUk9SX0lOVkFMSURfQklUU1RSRUFNIDogMCk7CisKKyAgICAvKiBrZWVwIGxhc3QgYmxvY2sgZm9yIGVycm9yIGNvbmNlYWxtZW50IGluIG5leHQgZnJhbWUgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5vdXRfY2hhbm5lbHM7IGNoKyspCisgICAgICAgIG1lbWNweShzLT5vdXRwdXRbY2hdLCBvdXRwdXRbY2hdLCBBQzNfQkxPQ0tfU0laRSpzaXplb2YoU0hPUlRGTE9BVCkpOworCisgICAgLyoKKyAgICAgKiBBVk1hdHJpeEVuY29kaW5nCisgICAgICoKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBpbnB1dCBsYXlvdXQgaXMgY29tcGF0aWJsZSwgYW5kIG1ha2Ugc3VyZSB3ZSdyZSBub3QKKyAgICAgKiBkb3dubWl4aW5nIChlbHNlIHRoZSBtYXRyaXggZW5jb2RpbmcgaXMgbm8gbG9uZ2VyIGFwcGxpY2FibGUpLgorICAgICAqLworICAgIG1hdHJpeF9lbmNvZGluZyA9IEFWX01BVFJJWF9FTkNPRElOR19OT05FOworICAgIGlmIChzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8gJiYKKyAgICAgICAgcy0+Y2hhbm5lbF9tb2RlID09IChzLT5vdXRwdXRfbW9kZSAmIH5BQzNfT1VUUFVUX0xGRU9OKSkgeworICAgICAgICBpZiAocy0+ZG9sYnlfc3Vycm91bmRfbW9kZSA9PSBBQzNfRFNVUk1PRF9PTikKKyAgICAgICAgICAgIG1hdHJpeF9lbmNvZGluZyA9IEFWX01BVFJJWF9FTkNPRElOR19ET0xCWTsKKyAgICAgICAgZWxzZSBpZiAocy0+ZG9sYnlfaGVhZHBob25lX21vZGUgPT0gQUMzX0RIRUFEUEhPTk1PRF9PTikKKyAgICAgICAgICAgIG1hdHJpeF9lbmNvZGluZyA9IEFWX01BVFJJWF9FTkNPRElOR19ET0xCWUhFQURQSE9ORTsKKyAgICB9IGVsc2UgaWYgKHMtPmNoYW5uZWxfbW9kZSA+PSBBQzNfQ0hNT0RFXzJGMlIgJiYKKyAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfbW9kZSA9PSAocy0+b3V0cHV0X21vZGUgJiB+QUMzX09VVFBVVF9MRkVPTikpIHsKKyAgICAgICAgc3dpdGNoIChzLT5kb2xieV9zdXJyb3VuZF9leF9tb2RlKSB7CisgICAgICAgIGNhc2UgQUMzX0RTVVJFWE1PRF9PTjogLy8gRVggb3IgUExJSXgKKyAgICAgICAgICAgIG1hdHJpeF9lbmNvZGluZyA9IEFWX01BVFJJWF9FTkNPRElOR19ET0xCWUVYOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUMzX0RTVVJFWE1PRF9QTElJWjoKKyAgICAgICAgICAgIG1hdHJpeF9lbmNvZGluZyA9IEFWX01BVFJJWF9FTkNPRElOR19EUExJSVo7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy8gbm90IGluZGljYXRlZCBvciBvZmYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICgocmV0ID0gZmZfc2lkZV9kYXRhX3VwZGF0ZV9tYXRyaXhfZW5jb2RpbmcoZnJhbWUsIG1hdHJpeF9lbmNvZGluZykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIEFWRG93bm1peEluZm8gKi8KKyAgICBpZiAoKGRvd25taXhfaW5mbyA9IGF2X2Rvd25taXhfaW5mb191cGRhdGVfc2lkZV9kYXRhKGZyYW1lKSkpIHsKKyAgICAgICAgc3dpdGNoIChzLT5wcmVmZXJyZWRfZG93bm1peCkgeworICAgICAgICBjYXNlIEFDM19ETUlYTU9EX0xUUlQ6CisgICAgICAgICAgICBkb3dubWl4X2luZm8tPnByZWZlcnJlZF9kb3dubWl4X3R5cGUgPSBBVl9ET1dOTUlYX1RZUEVfTFRSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFDM19ETUlYTU9EX0xPUk86CisgICAgICAgICAgICBkb3dubWl4X2luZm8tPnByZWZlcnJlZF9kb3dubWl4X3R5cGUgPSBBVl9ET1dOTUlYX1RZUEVfTE9STzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFDM19ETUlYTU9EX0RQTElJOgorICAgICAgICAgICAgZG93bm1peF9pbmZvLT5wcmVmZXJyZWRfZG93bm1peF90eXBlID0gQVZfRE9XTk1JWF9UWVBFX0RQTElJOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBkb3dubWl4X2luZm8tPnByZWZlcnJlZF9kb3dubWl4X3R5cGUgPSBBVl9ET1dOTUlYX1RZUEVfVU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRvd25taXhfaW5mby0+Y2VudGVyX21peF9sZXZlbCAgICAgICAgPSBnYWluX2xldmVsc1tzLT4gICAgICAgY2VudGVyX21peF9sZXZlbF07CisgICAgICAgIGRvd25taXhfaW5mby0+Y2VudGVyX21peF9sZXZlbF9sdHJ0ICAgPSBnYWluX2xldmVsc1tzLT4gIGNlbnRlcl9taXhfbGV2ZWxfbHRydF07CisgICAgICAgIGRvd25taXhfaW5mby0+c3Vycm91bmRfbWl4X2xldmVsICAgICAgPSBnYWluX2xldmVsc1tzLT4gICAgIHN1cnJvdW5kX21peF9sZXZlbF07CisgICAgICAgIGRvd25taXhfaW5mby0+c3Vycm91bmRfbWl4X2xldmVsX2x0cnQgPSBnYWluX2xldmVsc1tzLT5zdXJyb3VuZF9taXhfbGV2ZWxfbHRydF07CisgICAgICAgIGlmIChzLT5sZmVfbWl4X2xldmVsX2V4aXN0cykKKyAgICAgICAgICAgIGRvd25taXhfaW5mby0+bGZlX21peF9sZXZlbCAgICAgICA9IGdhaW5fbGV2ZWxzX2xmZVtzLT5sZmVfbWl4X2xldmVsXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZG93bm1peF9pbmZvLT5sZmVfbWl4X2xldmVsICAgICAgID0gMC4wOyAvLyAtaW5mIGRCCisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gRkZNSU4oYnVmX3NpemUsIHMtPmZyYW1lX3NpemUpOworfQorCisvKioKKyAqIFVuaW5pdGlhbGl6ZSB0aGUgQUMtMyBkZWNvZGVyLgorICovCitzdGF0aWMgYXZfY29sZCBpbnQgYWMzX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFDM0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGZmX21kY3RfZW5kKCZzLT5pbWRjdF81MTIpOworICAgIGZmX21kY3RfZW5kKCZzLT5pbWRjdF8yNTYpOworICAgIGF2X2ZyZWVwKCZzLT5mZHNwKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBQzNEZWNvZGVDb250ZXh0LCB4KQorI2RlZmluZSBQQVIgKEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIHwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0pCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYzNkZWMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjlmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNkZWMuaApAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIENvbW1vbiBjb2RlIGJldHdlZW4gdGhlIEFDLTMgYW5kIEUtQUMtMyBkZWNvZGVycworICogQ29weXJpZ2h0IChjKSAyMDA3IEJhcnRsb21pZWogV29sb3dpZWMgPGJhcnRlay53b2xvd2llY0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENvbW1vbiBjb2RlIGJldHdlZW4gdGhlIEFDLTMgYW5kIEUtQUMtMyBkZWNvZGVycy4KKyAqCisgKiBTdW1tYXJ5IG9mIE1EQ1QgQ29lZmZpY2llbnQgR3JvdXBpbmc6CisgKiBUaGUgaW5kaXZpZHVhbCBNRENUIGNvZWZmaWNpZW50IGluZGljZXMgYXJlIG9mdGVuIHJlZmVycmVkIHRvIGluIHRoZQorICogKEUtKUFDLTMgc3BlY2lmaWNhdGlvbiBhcyBmcmVxdWVuY3kgYmlucy4gIFRoZXNlIGJpbnMgYXJlIGdyb3VwZWQgdG9nZXRoZXIKKyAqIGludG8gc3ViYmFuZHMgb2YgMTIgY29lZmZpY2llbnRzIGVhY2guICBUaGUgc3ViYmFuZHMgYXJlIGdyb3VwZWQgdG9nZXRoZXIKKyAqIGludG8gYmFuZHMgYXMgZGVmaW5lZCBpbiB0aGUgYml0c3RyZWFtIGJ5IHRoZSBiYW5kIHN0cnVjdHVyZXMsIHdoaWNoCisgKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiYW5kcyBhbmQgdGhlIHNpemUgb2YgZWFjaCBiYW5kLiAgVGhlIGZ1bGwgc3BlY3RydW0KKyAqIG9mIDI1NiBmcmVxdWVuY3kgYmlucyBpcyBkaXZpZGVkIGludG8gMSBEQyBiaW4gKyAyMSBzdWJiYW5kcyA9IDI1MyBiaW5zLgorICogVGhpcyBzeXN0ZW0gb2YgZ3JvdXBpbmcgY29lZmZpY2llbnRzIGlzIHVzZWQgZm9yIGNoYW5uZWwgYmFuZHdpZHRoLCBzdGVyZW8KKyAqIHJlbWF0cml4aW5nLCBjaGFubmVsIGNvdXBsaW5nLCBlbmhhbmNlZCBjb3VwbGluZywgYW5kIHNwZWN0cmFsIGV4dGVuc2lvbi4KKyAqCisgKiArLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstKworICogfDF8ICB8MTJ8ICB8ICBbMTJ8MTJ8MTJ8MTJdICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8M3wKKyAqICstKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0rCisgKiB+fn4gIH5+fn4gICAgIH5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5+fgorICogIHwgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogIHwgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAzIHVudXNlZCBmcmVxdWVuY3kgYmlucy0tKworICogIHwgICAgIHwgICAgICAgICAgICB8CisgKiAgfCAgICAgfCAgICAgICAgICAgICstLTEgYmFuZCBjb250YWluaW5nIDQgc3ViYmFuZHMKKyAqICB8ICAgICB8CisgKiAgfCAgICAgKy0tMSBzdWJiYW5kIG9mIDEyIGZyZXF1ZW5jeSBiaW5zCisgKiAgfAorICogICstLURDIGZyZXF1ZW5jeSBiaW4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQUMzREVDX0gKKyNkZWZpbmUgQVZDT0RFQ19BQzNERUNfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9maXhlZF9kc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCisjaW5jbHVkZSAiYWMzLmgiCisjaW5jbHVkZSAiYWMzZHNwLmgiCisjaW5jbHVkZSAiYnN3YXBkc3AuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgImZtdGNvbnZlcnQuaCIKKworI2RlZmluZSBBQzNfT1VUUFVUX0xGRU9OICA4CisKKyNkZWZpbmUgU1BYX01BWF9CQU5EUyAgICAxNworCisvKiogTGFyZ2UgZW5vdWdoIGZvciBtYXhpbXVtIHBvc3NpYmxlIGZyYW1lIHNpemUgd2hlbiB0aGUgc3BlY2lmaWNhdGlvbiBsaW1pdCBpcyBpZ25vcmVkICovCisjZGVmaW5lIEFDM19GUkFNRV9CVUZGRVJfU0laRSAzMjc2OAorCit0eXBlZGVmIHN0cnVjdCBBQzNEZWNvZGVDb250ZXh0IHsKKyAgICBBVkNsYXNzICAgICAgICAqY2xhc3M7ICAgICAgICAgICAgICAgICAgLy8vPCBjbGFzcyBmb3IgQVZPcHRpb25zCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OyAgICAgICAgICAgICAgICAgIC8vLzwgcGFyZW50IGNvbnRleHQKKyAgICBHZXRCaXRDb250ZXh0IGdiYzsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBiaXRzdHJlYW0gcmVhZGVyCisKKy8vL0BuYW1lIEJpdCBzdHJlYW0gaW5mb3JtYXRpb24KKy8vL0B7CisgICAgaW50IGZyYW1lX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZnJhbWUgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cm10eXApCisgICAgaW50IHN1YnN0cmVhbWlkOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc3Vic3RyZWFtIGlkZW50aWZpY2F0aW9uCisgICAgaW50IGZyYW1lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY3VycmVudCBmcmFtZSBzaXplLCBpbiBieXRlcworICAgIGludCBiaXRfcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHN0cmVhbSBiaXQgcmF0ZSwgaW4gYml0cy1wZXItc2Vjb25kCisgICAgaW50IHNhbXBsZV9yYXRlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc2FtcGxlIGZyZXF1ZW5jeSwgaW4gSHoKKyAgICBpbnQgbnVtX2Jsb2NrczsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgYXVkaW8gYmxvY2tzCisgICAgaW50IGJpdHN0cmVhbV9pZDsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYml0c3RyZWFtIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJzaWQpCisgICAgaW50IGJpdHN0cmVhbV9tb2RlOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgYml0c3RyZWFtIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgKGJzbW9kKQorICAgIGludCBjaGFubmVsX21vZGU7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNoYW5uZWwgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY21vZCkKKyAgICBpbnQgbGZlX29uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsZmUgY2hhbm5lbCBpbiB1c2UKKyAgICBpbnQgZGlhbG9nX25vcm1hbGl6YXRpb25bMl07ICAgICAgICAgICAgLy8vPCBkaWFsb2cgbGV2ZWwgaW4gZEJGUyAgICAgICAgICAgICAgICAgICAoZGlhbG5vcm0pCisgICAgaW50IGNvbXByZXNzaW9uX2V4aXN0c1syXTsgICAgICAgICAgICAgIC8vLzwgY29tcHJlc3Npb24gZmllbGQgaXMgdmFsaWQgZm9yIGZyYW1lICAgKGNvbXByZSkKKyAgICBpbnQgY29tcHJlc3Npb25fZ2FpblsyXTsgICAgICAgICAgICAgICAgLy8vPCBnYWluIHRvIGFwcGx5IGZvciBoZWF2eSBjb21wcmVzc2lvbiAgICAoY29tcHIpCisgICAgaW50IGNoYW5uZWxfbWFwOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY3VzdG9tIGNoYW5uZWwgbWFwCisgICAgaW50IHByZWZlcnJlZF9kb3dubWl4OyAgICAgICAgICAgICAgICAgIC8vLzwgUHJlZmVycmVkIDItY2hhbm5lbCBkb3dubWl4IG1vZGUgICAgICAgKGRtaXhtb2QpCisgICAgaW50IGNlbnRlcl9taXhfbGV2ZWw7ICAgICAgICAgICAgICAgICAgIC8vLzwgQ2VudGVyIG1peCBsZXZlbCBpbmRleAorICAgIGludCBjZW50ZXJfbWl4X2xldmVsX2x0cnQ7ICAgICAgICAgICAgICAvLy88IENlbnRlciBtaXggbGV2ZWwgaW5kZXggZm9yIEx0L1J0ICAgICAgIChsdHJ0Y21peGxldikKKyAgICBpbnQgc3Vycm91bmRfbWl4X2xldmVsOyAgICAgICAgICAgICAgICAgLy8vPCBTdXJyb3VuZCBtaXggbGV2ZWwgaW5kZXgKKyAgICBpbnQgc3Vycm91bmRfbWl4X2xldmVsX2x0cnQ7ICAgICAgICAgICAgLy8vPCBTdXJyb3VuZCBtaXggbGV2ZWwgaW5kZXggZm9yIEx0L1J0ICAgICAobHRydHN1cm1peGxldikKKyAgICBpbnQgbGZlX21peF9sZXZlbF9leGlzdHM7ICAgICAgICAgICAgICAgLy8vPCBpbmRpY2F0ZXMgaWYgbGZlbWl4bGV2Y29kIGlzIHNwZWNpZmllZCAobGZlbWl4bGV2Y29kZSkKKyAgICBpbnQgbGZlX21peF9sZXZlbDsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBMRkUgbWl4IGxldmVsIGluZGV4ICAgICAgICAgICAgICAgICAgICAobGZlbWl4bGV2Y29kKQorICAgIGludCBlYWMzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGluZGljYXRlcyBpZiBjdXJyZW50IGZyYW1lIGlzIEUtQUMtMworICAgIGludCBkb2xieV9zdXJyb3VuZF9tb2RlOyAgICAgICAgICAgICAgICAvLy88IGRvbGJ5IHN1cnJvdW5kIG1vZGUgICAgICAgICAgICAgICAgICAgIChkc3VybW9kKQorICAgIGludCBkb2xieV9zdXJyb3VuZF9leF9tb2RlOyAgICAgICAgICAgICAvLy88IGRvbGJ5IHN1cnJvdW5kIGV4IG1vZGUgICAgICAgICAgICAgICAgIChkc3VyZXhtb2QpCisgICAgaW50IGRvbGJ5X2hlYWRwaG9uZV9tb2RlOyAgICAgICAgICAgICAgIC8vLzwgZG9sYnkgaGVhZHBob25lIG1vZGUgICAgICAgICAgICAgICAgICAgKGRoZWFkcGhvbm1vZCkKKy8vL0B9CisKKyAgICBpbnQgcHJlZmVycmVkX3N0ZXJlb19kb3dubWl4OworICAgIGZsb2F0IGx0cnRfY2VudGVyX21peF9sZXZlbDsKKyAgICBmbG9hdCBsdHJ0X3N1cnJvdW5kX21peF9sZXZlbDsKKyAgICBmbG9hdCBsb3JvX2NlbnRlcl9taXhfbGV2ZWw7CisgICAgZmxvYXQgbG9yb19zdXJyb3VuZF9taXhfbGV2ZWw7CisgICAgaW50IHRhcmdldF9sZXZlbDsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdGFyZ2V0IGxldmVsIGluIGRCRlMKKyAgICBmbG9hdCBsZXZlbF9nYWluWzJdOworCisvLy9AbmFtZSBGcmFtZSBzeW50YXggcGFyYW1ldGVycworICAgIGludCBzbnJfb2Zmc2V0X3N0cmF0ZWd5OyAgICAgICAgICAgICAgICAvLy88IFNOUiBvZmZzZXQgc3RyYXRlZ3kgICAgICAgICAgICAgICAgICAgIChzbnJvZmZzdHN0cikKKyAgICBpbnQgYmxvY2tfc3dpdGNoX3N5bnRheDsgICAgICAgICAgICAgICAgLy8vPCBibG9jayBzd2l0Y2ggc3ludGF4IGVuYWJsZWQgICAgICAgICAgICAoYmxrc3dlKQorICAgIGludCBkaXRoZXJfZmxhZ19zeW50YXg7ICAgICAgICAgICAgICAgICAvLy88IGRpdGhlciBmbGFnIHN5bnRheCBlbmFibGVkICAgICAgICAgICAgIChkaXRoZmxhZ2UpCisgICAgaW50IGJpdF9hbGxvY2F0aW9uX3N5bnRheDsgICAgICAgICAgICAgIC8vLzwgYml0IGFsbG9jYXRpb24gbW9kZWwgc3ludGF4IGVuYWJsZWQgICAgKGJhbW9kZSkKKyAgICBpbnQgZmFzdF9nYWluX3N5bnRheDsgICAgICAgICAgICAgICAgICAgLy8vPCBmYXN0IGdhaW4gY29kZXMgZW5hYmxlZCAgICAgICAgICAgICAgICAoZnJtZmdhaW5jb2RlKQorICAgIGludCBkYmFfc3ludGF4OyAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGRlbHRhIGJpdCBhbGxvY2F0aW9uIHN5bnRheCBlbmFibGVkICAgIChkYmFmbGRlKQorICAgIGludCBza2lwX3N5bnRheDsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHNraXAgZmllbGQgc3ludGF4IGVuYWJsZWQgICAgICAgICAgICAgIChza2lwZmxkZSkKKyAvLy9AfQorCisvLy9AbmFtZSBTdGFuZGFyZCBjb3VwbGluZworICAgIGludCBjcGxfaW5fdXNlW0FDM19NQVhfQkxPQ0tTXTsgICAgICAgICAvLy88IGNvdXBsaW5nIGluIHVzZSAgICAgICAgICAgICAgICAgICAgICAgIChjcGxpbnUpCisgICAgaW50IGNwbF9zdHJhdGVneV9leGlzdHNbQUMzX01BWF9CTE9DS1NdOy8vLzwgY291cGxpbmcgc3RyYXRlZ3kgZXhpc3RzICAgICAgICAgICAgICAgKGNwbHN0cmUpCisgICAgaW50IGNoYW5uZWxfaW5fY3BsW0FDM19NQVhfQ0hBTk5FTFNdOyAgIC8vLzwgY2hhbm5lbCBpbiBjb3VwbGluZyAgICAgICAgICAgICAgICAgICAgKGNoaW5jcGwpCisgICAgaW50IHBoYXNlX2ZsYWdzX2luX3VzZTsgICAgICAgICAgICAgICAgIC8vLzwgcGhhc2UgZmxhZ3MgaW4gdXNlICAgICAgICAgICAgICAgICAgICAgKHBoc2ZsZ2ludSkKKyAgICBpbnQgcGhhc2VfZmxhZ3NbQUMzX01BWF9DUExfQkFORFNdOyAgICAgLy8vPCBwaGFzZSBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGhzZmxnKQorICAgIGludCBudW1fY3BsX2JhbmRzOyAgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBjb3VwbGluZyBiYW5kcyAgICAgICAgICAgICAgIChuY3BsYm5kKQorICAgIHVpbnQ4X3QgY3BsX2JhbmRfc2l6ZXNbQUMzX01BWF9DUExfQkFORFNdOyAvLy88IG51bWJlciBvZiBjb2VmZnMgaW4gZWFjaCBjb3VwbGluZyBiYW5kCisgICAgaW50IGZpcnN0Y2hpbmNwbDsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZmlyc3QgY2hhbm5lbCBpbiBjb3VwbGluZworICAgIGludCBmaXJzdF9jcGxfY29vcmRzW0FDM19NQVhfQ0hBTk5FTFNdOyAvLy88IGZpcnN0IGNvdXBsaW5nIGNvb3JkaW5hdGVzIHN0YXRlcyAgICAgIChmaXJzdGNwbGNvcykKKyAgICBpbnQgY3BsX2Nvb3Jkc1tBQzNfTUFYX0NIQU5ORUxTXVtBQzNfTUFYX0NQTF9CQU5EU107IC8vLzwgY291cGxpbmcgY29vcmRpbmF0ZXMgICAgICAoY3BsY28pCisvLy9AfQorCisvLy9AbmFtZSBTcGVjdHJhbCBleHRlbnNpb24KKy8vL0B7CisgICAgaW50IHNweF9pbl91c2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHNwZWN0cmFsIGV4dGVuc2lvbiBpbiB1c2UgICAgICAgICAgICAgIChzcHhpbnUpCisgICAgdWludDhfdCBjaGFubmVsX3VzZXNfc3B4W0FDM19NQVhfQ0hBTk5FTFNdOyAvLy88IGNoYW5uZWwgdXNlcyBzcGVjdHJhbCBleHRlbnNpb24gICAgICAgIChjaGluc3B4KQorICAgIGludDhfdCBzcHhfYXR0ZW5fY29kZVtBQzNfTUFYX0NIQU5ORUxTXTsgICAgLy8vPCBzcHggYXR0ZW51YXRpb24gY29kZSAgICAgICAgICAgICAgICAgICAoc3B4YXR0ZW5jb2QpCisgICAgaW50IHNweF9zcmNfc3RhcnRfZnJlcTsgICAgICAgICAgICAgICAgICAgICAvLy88IHNweCBzdGFydCBmcmVxdWVuY3kgYmluCisgICAgaW50IHNweF9kc3RfZW5kX2ZyZXE7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IHNweCBlbmQgZnJlcXVlbmN5IGJpbgorICAgIGludCBzcHhfZHN0X3N0YXJ0X2ZyZXE7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBzcHggc3RhcnRpbmcgZnJlcXVlbmN5IGJpbiBmb3IgY29weWluZyAoY29weXN0YXJ0bWFudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdGhlIGNvcHkgcmVnaW9uIGVuZHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzcHggcmVnaW9uLgorICAgIGludCBudW1fc3B4X2JhbmRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2Ygc3B4IGJhbmRzICAgICAgICAgICAgICAgICAgICAobnNweGJuZHMpCisgICAgdWludDhfdCBzcHhfYmFuZF9zaXplc1tTUFhfTUFYX0JBTkRTXTsgICAgICAvLy88IG51bWJlciBvZiBiaW5zIGluIGVhY2ggc3B4IGJhbmQKKyAgICB1aW50OF90IGZpcnN0X3NweF9jb29yZHNbQUMzX01BWF9DSEFOTkVMU107IC8vLzwgZmlyc3Qgc3B4IGNvb3JkaW5hdGVzIHN0YXRlcyAgICAgICAgICAgKGZpcnN0c3B4Y29zKQorICAgIElOVEZMT0FUIHNweF9ub2lzZV9ibGVuZFtBQzNfTUFYX0NIQU5ORUxTXVtTUFhfTUFYX0JBTkRTXTsgLy8vPCBzcHggbm9pc2UgYmxlbmRpbmcgZmFjdG9yICAobmJsZW5kZmFjdCkKKyAgICBJTlRGTE9BVCBzcHhfc2lnbmFsX2JsZW5kW0FDM19NQVhfQ0hBTk5FTFNdW1NQWF9NQVhfQkFORFNdOy8vLzwgc3B4IHNpZ25hbCBibGVuZGluZyBmYWN0b3IgKHNibGVuZGZhY3QpCisvLy9AfQorCisvLy9AbmFtZSBBZGFwdGl2ZSBoeWJyaWQgdHJhbnNmb3JtCisgICAgaW50IGNoYW5uZWxfdXNlc19haHRbQUMzX01BWF9DSEFOTkVMU107ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2hhbm5lbCBBSFQgaW4gdXNlIChjaGFodGludSkKKyAgICBpbnQgcHJlX21hbnRpc3NhW0FDM19NQVhfQ0hBTk5FTFNdW0FDM19NQVhfQ09FRlNdW0FDM19NQVhfQkxPQ0tTXTsgIC8vLzwgcHJlLUlEQ1QgbWFudGlzc2FzCisvLy9AfQorCisvLy9AbmFtZSBDaGFubmVsCisgICAgaW50IGZid19jaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBmdWxsLWJhbmR3aWR0aCBjaGFubmVscworICAgIGludCBjaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgdG90YWwgY2hhbm5lbHMKKyAgICBpbnQgbGZlX2NoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5kZXggb2YgTEZFIGNoYW5uZWwKKyAgICBTSE9SVEZMT0FUIGRvd25taXhfY29lZmZzW0FDM19NQVhfQ0hBTk5FTFNdWzJdOyAgLy8vPCBzdGVyZW8gZG93bm1peCBjb2VmZmljaWVudHMKKyAgICBpbnQgZG93bm1peGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5kaWNhdGVzIGlmIGNvZWZmcyBhcmUgY3VycmVudGx5IGRvd25taXhlZAorICAgIGludCBvdXRwdXRfbW9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBvdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgICAgaW50IG91dF9jaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMKKy8vL0B9CisKKy8vL0BuYW1lIER5bmFtaWMgcmFuZ2UKKyAgICBJTlRGTE9BVCBkeW5hbWljX3JhbmdlWzJdOyAgICAgICAgICAgICAgICAgLy8vPCBkeW5hbWljIHJhbmdlCisgICAgSU5URkxPQVQgZHJjX3NjYWxlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcGVyY2VudGFnZSBvZiBkeW5hbWljIHJhbmdlIGNvbXByZXNzaW9uIHRvIGJlIGFwcGxpZWQKKyAgICBpbnQgaGVhdnlfY29tcHJlc3Npb247ICAgICAgICAgICAgICAgICAgICAgLy8vPCBhcHBseSBoZWF2eSBjb21wcmVzc2lvbgorICAgIElOVEZMT0FUIGhlYXZ5X2R5bmFtaWNfcmFuZ2VbMl07ICAgICAgICAgICAvLy88IGhlYXZ5IGR5bmFtaWMgcmFuZ2UgY29tcHJlc3Npb24KKy8vL0B9CisKKy8vL0BuYW1lIEJhbmR3aWR0aAorICAgIGludCBzdGFydF9mcmVxW0FDM19NQVhfQ0hBTk5FTFNdOyAgICAgICAvLy88IHN0YXJ0IGZyZXF1ZW5jeSBiaW4gICAgICAgICAgICAgICAgICAgIChzdHJ0bWFudCkKKyAgICBpbnQgZW5kX2ZyZXFbQUMzX01BWF9DSEFOTkVMU107ICAgICAgICAgLy8vPCBlbmQgZnJlcXVlbmN5IGJpbiAgICAgICAgICAgICAgICAgICAgICAoZW5kbWFudCkKKy8vL0B9CisKKy8vL0BuYW1lIFJlbWF0cml4aW5nCisgICAgaW50IG51bV9yZW1hdHJpeGluZ19iYW5kczsgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHJlbWF0cml4aW5nIGJhbmRzICAgICAgICAgICAgKG5yZW1hdGJuZCkKKyAgICBpbnQgcmVtYXRyaXhpbmdfZmxhZ3NbNF07ICAgICAgICAgICAgICAgLy8vPCByZW1hdHJpeGluZyBmbGFncyAgICAgICAgICAgICAgICAgICAgICAocmVtYXRmbGcpCisvLy9AfQorCisvLy9AbmFtZSBFeHBvbmVudHMKKyAgICBpbnQgbnVtX2V4cF9ncm91cHNbQUMzX01BWF9DSEFOTkVMU107ICAgICAgICAgICAvLy88IE51bWJlciBvZiBleHBvbmVudCBncm91cHMgICAgICAobmV4cGdycCkKKyAgICBpbnQ4X3QgZGV4cHNbQUMzX01BWF9DSEFOTkVMU11bQUMzX01BWF9DT0VGU107ICAvLy88IGRlY29kZWQgZXhwb25lbnRzCisgICAgaW50IGV4cF9zdHJhdGVneVtBQzNfTUFYX0JMT0NLU11bQUMzX01BWF9DSEFOTkVMU107IC8vLzwgZXhwb25lbnQgc3RyYXRlZ2llcyAgICAgICAgKGV4cHN0cikKKy8vL0B9CisKKy8vL0BuYW1lIEJpdCBhbGxvY2F0aW9uCisgICAgQUMzQml0QWxsb2NQYXJhbWV0ZXJzIGJpdF9hbGxvY19wYXJhbXM7ICAgICAgICAgLy8vPCBiaXQgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzCisgICAgaW50IGZpcnN0X2NwbF9sZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmaXJzdCBjb3VwbGluZyBsZWFrIHN0YXRlICAgICAgKGZpcnN0Y3BsbGVhaykKKyAgICBpbnQgc25yX29mZnNldFtBQzNfTUFYX0NIQU5ORUxTXTsgICAgICAgICAgICAgICAvLy88IHNpZ25hbC10by1ub2lzZSByYXRpbyBvZmZzZXRzICAoc25yb2Zmc3QpCisgICAgaW50IGZhc3RfZ2FpbltBQzNfTUFYX0NIQU5ORUxTXTsgICAgICAgICAgICAgICAgLy8vPCBmYXN0IGdhaW4gdmFsdWVzL1NNUidzICAgICAgICAgKGZnYWluKQorICAgIHVpbnQ4X3QgYmFwW0FDM19NQVhfQ0hBTk5FTFNdW0FDM19NQVhfQ09FRlNdOyAgIC8vLzwgYml0IGFsbG9jYXRpb24gcG9pbnRlcnMKKyAgICBpbnQxNl90IHBzZFtBQzNfTUFYX0NIQU5ORUxTXVtBQzNfTUFYX0NPRUZTXTsgICAvLy88IHNjYWxlZCBleHBvbmVudHMKKyAgICBpbnQxNl90IGJhbmRfcHNkW0FDM19NQVhfQ0hBTk5FTFNdW0FDM19DUklUSUNBTF9CQU5EU107IC8vLzwgaW50ZXJwb2xhdGVkIGV4cG9uZW50cworICAgIGludDE2X3QgbWFza1tBQzNfTUFYX0NIQU5ORUxTXVtBQzNfQ1JJVElDQUxfQkFORFNdOyAgICAgLy8vPCBtYXNraW5nIGN1cnZlIHZhbHVlcworICAgIGludCBkYmFfbW9kZVtBQzNfTUFYX0NIQU5ORUxTXTsgICAgICAgICAgICAgICAgIC8vLzwgZGVsdGEgYml0IGFsbG9jYXRpb24gbW9kZQorICAgIGludCBkYmFfbnNlZ3NbQUMzX01BWF9DSEFOTkVMU107ICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGRlbHRhIHNlZ21lbnRzCisgICAgdWludDhfdCBkYmFfb2Zmc2V0c1tBQzNfTUFYX0NIQU5ORUxTXVs4XTsgICAgICAgLy8vPCBkZWx0YSBzZWdtZW50IG9mZnNldHMKKyAgICB1aW50OF90IGRiYV9sZW5ndGhzW0FDM19NQVhfQ0hBTk5FTFNdWzhdOyAgICAgICAvLy88IGRlbHRhIHNlZ21lbnQgbGVuZ3RocworICAgIHVpbnQ4X3QgZGJhX3ZhbHVlc1tBQzNfTUFYX0NIQU5ORUxTXVs4XTsgICAgICAgIC8vLzwgZGVsdGEgdmFsdWVzIGZvciBlYWNoIHNlZ21lbnQKKy8vL0B9CisKKy8vL0BuYW1lIFplcm8tbWFudGlzc2EgZGl0aGVyaW5nCisgICAgaW50IGRpdGhlcl9mbGFnW0FDM19NQVhfQ0hBTk5FTFNdOyAgICAgIC8vLzwgZGl0aGVyIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpdGhmbGcpCisgICAgQVZMRkcgZGl0aF9zdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZm9yIGRpdGhlciBnZW5lcmF0aW9uCisvLy9AfQorCisvLy9AbmFtZSBJTURDVAorICAgIGludCBibG9ja19zd2l0Y2hbQUMzX01BWF9DSEFOTkVMU107ICAgICAvLy88IGJsb2NrIHN3aXRjaCBmbGFncyAgICAgICAgICAgICAgICAgICAgIChibGtzdykKKyAgICBGRlRDb250ZXh0IGltZGN0XzUxMjsgICAgICAgICAgICAgICAgICAgLy8vPCBmb3IgNTEyIHNhbXBsZSBJTURDVAorICAgIEZGVENvbnRleHQgaW1kY3RfMjU2OyAgICAgICAgICAgICAgICAgICAvLy88IGZvciAyNTYgc2FtcGxlIElNRENUCisvLy9AfQorCisvLy9AbmFtZSBPcHRpbWl6YXRpb24KKyAgICBCc3dhcERTUENvbnRleHQgYmRzcDsKKyNpZiBVU0VfRklYRUQKKyAgICBBVkZpeGVkRFNQQ29udGV4dCAqZmRzcDsKKyNlbHNlCisgICAgQVZGbG9hdERTUENvbnRleHQgKmZkc3A7CisjZW5kaWYKKyAgICBBQzNEU1BDb250ZXh0IGFjM2RzcDsKKyAgICBGbXRDb252ZXJ0Q29udGV4dCBmbXRfY29udjsgICAgICAgICAgICAgLy8vPCBvcHRpbWl6ZWQgY29udmVyc2lvbiBmdW5jdGlvbnMKKy8vL0B9CisKKyAgICBTSE9SVEZMT0FUICpvdXRwdHJbQUMzX01BWF9DSEFOTkVMU107CisgICAgSU5URkxPQVQgKnhjZnB0cltBQzNfTUFYX0NIQU5ORUxTXTsKKyAgICBJTlRGTE9BVCAqZGx5cHRyW0FDM19NQVhfQ0hBTk5FTFNdOworCisvLy9AbmFtZSBBbGlnbmVkIGFycmF5cworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50LCAgIGZpeGVkX2NvZWZmcylbQUMzX01BWF9DSEFOTkVMU11bQUMzX01BWF9DT0VGU107ICAgICAgIC8vLzwgZml4ZWQtcG9pbnQgdHJhbnNmb3JtIGNvZWZmaWNpZW50cworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgSU5URkxPQVQsIHRyYW5zZm9ybV9jb2VmZnMpW0FDM19NQVhfQ0hBTk5FTFNdW0FDM19NQVhfQ09FRlNdOyAgIC8vLzwgdHJhbnNmb3JtIGNvZWZmaWNpZW50cworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgSU5URkxPQVQsIGRlbGF5KVtBQzNfTUFYX0NIQU5ORUxTXVtBQzNfQkxPQ0tfU0laRV07ICAgICAgICAgICAgIC8vLzwgZGVsYXkgLSBhZGRlZCB0byB0aGUgbmV4dCBibG9jaworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgSU5URkxPQVQsIHdpbmRvdylbQUMzX0JMT0NLX1NJWkVdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgd2luZG93IGNvZWZmaWNpZW50cworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgSU5URkxPQVQsIHRtcF9vdXRwdXQpW0FDM19CTE9DS19TSVpFXTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIG91dHB1dCBiZWZvcmUgd2luZG93aW5nCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBTSE9SVEZMT0FULCBvdXRwdXQpW0FDM19NQVhfQ0hBTk5FTFNdW0FDM19CTE9DS19TSVpFXTsgICAgICAgICAgICAvLy88IG91dHB1dCBhZnRlciBpbWRjdCB0cmFuc2Zvcm0gYW5kIHdpbmRvd2luZworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgdWludDhfdCwgaW5wdXRfYnVmZmVyKVtBQzNfRlJBTUVfQlVGRkVSX1NJWkUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFXTsgLy8vPCB0ZW1wIGJ1ZmZlciB0byBwcmV2ZW50IG92ZXJyZWFkCisvLy9AfQorfSBBQzNEZWNvZGVDb250ZXh0OworCisvKioKKyAqIFBhcnNlIHRoZSBFLUFDLTMgZnJhbWUgaGVhZGVyLgorICogVGhpcyBwYXJzZXMgYm90aCB0aGUgYml0IHN0cmVhbSBpbmZvIGFuZCBhdWRpbyBmcmFtZSBoZWFkZXIuCisgKi8KK2ludCBmZl9lYWMzX3BhcnNlX2hlYWRlcihBQzNEZWNvZGVDb250ZXh0ICpzKTsKKworLyoqCisgKiBEZWNvZGUgbWFudGlzc2FzIGluIGEgc2luZ2xlIGNoYW5uZWwgZm9yIHRoZSBlbnRpcmUgZnJhbWUuCisgKiBUaGlzIGlzIHVzZWQgd2hlbiBBSFQgbW9kZSBpcyBlbmFibGVkLgorICovCit2b2lkIGZmX2VhYzNfZGVjb2RlX3RyYW5zZm9ybV9jb2VmZnNfYWh0X2NoKEFDM0RlY29kZUNvbnRleHQgKnMsIGludCBjaCk7CisKKy8qKgorICogQXBwbHkgc3BlY3RyYWwgZXh0ZW5zaW9uIHRvIGVhY2ggY2hhbm5lbCBieSBjb3B5aW5nIGxvd2VyIGZyZXF1ZW5jeQorICogY29lZmZpY2llbnRzIHRvIGhpZ2hlciBmcmVxdWVuY3kgYmlucyBhbmQgYXBwbHlpbmcgc2lkZSBpbmZvcm1hdGlvbiB0bworICogYXBwcm94aW1hdGUgdGhlIG9yaWdpbmFsIGhpZ2ggZnJlcXVlbmN5IHNpZ25hbC4KKyAqLwordm9pZCBmZl9lYWMzX2FwcGx5X3NwZWN0cmFsX2V4dGVuc2lvbihBQzNEZWNvZGVDb250ZXh0ICpzKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUMzREVDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2RlY19kYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNkZWNfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYTliMWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNkZWNfZGF0YS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBBQy0zIGFuZCBFLUFDLTMgZGVjb2RlciB0YWJsZXMKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCYXJ0bG9taWVqIFdvbG93aWVjIDxiYXJ0ZWsud29sb3dpZWNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUYWJsZXMgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUgQUMtMyBzcGVjLgorICovCisKKyNpbmNsdWRlICJhYzNkZWNfZGF0YS5oIgorI2luY2x1ZGUgImFjMy5oIgorCisvKioKKyAqIFRhYmxlIHVzZWQgdG8gdW5ncm91cCAzIHZhbHVlcyBzdG9yZWQgaW4gNSBiaXRzLgorICogVXNlZCBieSBiYXA9MSBtYW50aXNzYXMgYW5kIEdBUS4KKyAqIGZmX2FjM191bmdyb3VwXzNfaW5fNV9iaXRzX3RhYltpXSA9IHsgaS85LCAoaSU5KS8zLCAoaSU5KSUzIH0KKyAqLworY29uc3QgdWludDhfdCBmZl9hYzNfdW5ncm91cF8zX2luXzVfYml0c190YWJbMzJdWzNdID0geworICAgIHsgMCwgMCwgMCB9LCB7IDAsIDAsIDEgfSwgeyAwLCAwLCAyIH0sIHsgMCwgMSwgMCB9LAorICAgIHsgMCwgMSwgMSB9LCB7IDAsIDEsIDIgfSwgeyAwLCAyLCAwIH0sIHsgMCwgMiwgMSB9LAorICAgIHsgMCwgMiwgMiB9LCB7IDEsIDAsIDAgfSwgeyAxLCAwLCAxIH0sIHsgMSwgMCwgMiB9LAorICAgIHsgMSwgMSwgMCB9LCB7IDEsIDEsIDEgfSwgeyAxLCAxLCAyIH0sIHsgMSwgMiwgMCB9LAorICAgIHsgMSwgMiwgMSB9LCB7IDEsIDIsIDIgfSwgeyAyLCAwLCAwIH0sIHsgMiwgMCwgMSB9LAorICAgIHsgMiwgMCwgMiB9LCB7IDIsIDEsIDAgfSwgeyAyLCAxLCAxIH0sIHsgMiwgMSwgMiB9LAorICAgIHsgMiwgMiwgMCB9LCB7IDIsIDIsIDEgfSwgeyAyLCAyLCAyIH0sIHsgMywgMCwgMCB9LAorICAgIHsgMywgMCwgMSB9LCB7IDMsIDAsIDIgfSwgeyAzLCAxLCAwIH0sIHsgMywgMSwgMSB9Cit9OworCitjb25zdCB1aW50OF90IGZmX2VhYzNfaGViYXBfdGFiWzY0XSA9IHsKKyAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA4LAorICAgIDgsIDgsIDksIDksIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwKKyAgICAxOCwgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwKK307CisKKy8qKgorICogVGFibGUgRTIuMTUgRGVmYXVsdCBTcGVjdHJhbCBFeHRlbnNpb24gQmFuZGluZyBTdHJ1Y3R1cmUKKyAqLworY29uc3QgdWludDhfdCBmZl9lYWMzX2RlZmF1bHRfc3B4X2JhbmRfc3RydWN0WzE3XSA9Cit7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEgfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2RlY19kYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNkZWNfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NWI1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNkZWNfZGF0YS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBBQy0zIGFuZCBFLUFDLTMgZGVjb2RlciB0YWJsZXMKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCYXJ0bG9taWVqIFdvbG93aWVjIDxiYXJ0ZWsud29sb3dpZWNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQUMzREVDX0RBVEFfSAorI2RlZmluZSBBVkNPREVDX0FDM0RFQ19EQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9hYzNfdW5ncm91cF8zX2luXzVfYml0c190YWJbMzJdWzNdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9lYWMzX2hlYmFwX3RhYls2NF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9lYWMzX2RlZmF1bHRfc3B4X2JhbmRfc3RydWN0WzE3XTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUMzREVDX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWMzZGVjX2ZpeGVkLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNkZWNfZml4ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNiMjUxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWMzZGVjX2ZpeGVkLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIKKyAqICAgICAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIENhbGlmb3JuaWEuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3I6ICBTdGFuaXNsYXYgT2NvdmFqIChzb2NvdmFqQG1pcHMuY29tKQorICoKKyAqIEFDMyBmaXhlZC1wb2ludCBkZWNvZGVyIGZvciBNSVBTIHBsYXRmb3JtcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIEZGVF9GTE9BVCAwCisjZGVmaW5lIFVTRV9GSVhFRCAxCisjZGVmaW5lIEZGVF9GSVhFRF8zMiAxCisjaW5jbHVkZSAiYWMzZGVjLmgiCisKKworc3RhdGljIGNvbnN0IGludCBlbmRfZnJlcV9pbnZfdGFiWzhdID0KK3sKKyAgICA1MDUyOTAyNywgNDQyNzgwMTMsIDM5NDAzMzcwLCAzMjI5Mjk4NywgMjczNTY0ODAsIDIzNzI5MTAxLCAyMDk1MTA2MCwgMTg3NTUzMTYKK307CisKK3N0YXRpYyB2b2lkIHNjYWxlX2NvZWZzICgKKyAgICBpbnQzMl90ICpkc3QsCisgICAgY29uc3QgaW50MzJfdCAqc3JjLAorICAgIGludCBkeW5ybmcsCisgICAgaW50IGxlbikKK3sKKyAgICBpbnQgaSwgc2hpZnQsIHJvdW5kOworICAgIGludDE2X3QgbXVsOworICAgIGludCB0ZW1wLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKworICAgIG11bCA9IChkeW5ybmcgJiAweDFmKSArIDB4MjA7CisgICAgc2hpZnQgPSA0IC0gKChkeW5ybmcgPDwgMjMpID4+IDI4KTsKKyAgICBpZiAoc2hpZnQgPiAwICkgeworICAgICAgcm91bmQgPSAxIDw8IChzaGlmdC0xKTsKKyAgICAgIGZvciAoaT0wOyBpPGxlbjsgaSs9OCkgeworCisgICAgICAgICAgdGVtcCA9IHNyY1tpXSAqIG11bDsKKyAgICAgICAgICB0ZW1wMSA9IHNyY1tpKzFdICogbXVsOworICAgICAgICAgIHRlbXAgPSB0ZW1wICsgcm91bmQ7CisgICAgICAgICAgdGVtcDIgPSBzcmNbaSsyXSAqIG11bDsKKworICAgICAgICAgIHRlbXAxID0gdGVtcDEgKyByb3VuZDsKKyAgICAgICAgICBkc3RbaV0gPSB0ZW1wID4+IHNoaWZ0OworICAgICAgICAgIHRlbXAzID0gc3JjW2krM10gKiBtdWw7CisgICAgICAgICAgdGVtcDIgPSB0ZW1wMiArIHJvdW5kOworCisgICAgICAgICAgZHN0W2krMV0gPSB0ZW1wMSA+PiBzaGlmdDsKKyAgICAgICAgICB0ZW1wNCA9IHNyY1tpICsgNF0gKiBtdWw7CisgICAgICAgICAgdGVtcDMgPSB0ZW1wMyArIHJvdW5kOworICAgICAgICAgIGRzdFtpKzJdID0gdGVtcDIgPj4gc2hpZnQ7CisKKyAgICAgICAgICB0ZW1wNSA9IHNyY1tpKzVdICogbXVsOworICAgICAgICAgIHRlbXA0ID0gdGVtcDQgKyByb3VuZDsKKyAgICAgICAgICBkc3RbaSszXSA9IHRlbXAzID4+IHNoaWZ0OworICAgICAgICAgIHRlbXA2ID0gc3JjW2krNl0gKiBtdWw7CisKKyAgICAgICAgICBkc3RbaSs0XSA9IHRlbXA0ID4+IHNoaWZ0OworICAgICAgICAgIHRlbXA1ID0gdGVtcDUgKyByb3VuZDsKKyAgICAgICAgICB0ZW1wNyA9IHNyY1tpKzddICogbXVsOworICAgICAgICAgIHRlbXA2ID0gdGVtcDYgKyByb3VuZDsKKworICAgICAgICAgIGRzdFtpKzVdID0gdGVtcDUgPj4gc2hpZnQ7CisgICAgICAgICAgdGVtcDcgPSB0ZW1wNyArIHJvdW5kOworICAgICAgICAgIGRzdFtpKzZdID0gdGVtcDYgPj4gc2hpZnQ7CisgICAgICAgICAgZHN0W2krN10gPSB0ZW1wNyA+PiBzaGlmdDsKKworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzaGlmdCA9IC1zaGlmdDsKKyAgICAgIGZvciAoaT0wOyBpPGxlbjsgaSs9OCkgeworCisgICAgICAgICAgdGVtcCA9IHNyY1tpXSAqIG11bDsKKyAgICAgICAgICB0ZW1wMSA9IHNyY1tpKzFdICogbXVsOworICAgICAgICAgIHRlbXAyID0gc3JjW2krMl0gKiBtdWw7CisKKyAgICAgICAgICBkc3RbaV0gPSB0ZW1wIDw8IHNoaWZ0OworICAgICAgICAgIHRlbXAzID0gc3JjW2krM10gKiBtdWw7CisKKyAgICAgICAgICBkc3RbaSsxXSA9IHRlbXAxIDw8IHNoaWZ0OworICAgICAgICAgIHRlbXA0ID0gc3JjW2kgKyA0XSAqIG11bDsKKyAgICAgICAgICBkc3RbaSsyXSA9IHRlbXAyIDw8IHNoaWZ0OworCisgICAgICAgICAgdGVtcDUgPSBzcmNbaSs1XSAqIG11bDsKKyAgICAgICAgICBkc3RbaSszXSA9IHRlbXAzIDw8IHNoaWZ0OworICAgICAgICAgIHRlbXA2ID0gc3JjW2krNl0gKiBtdWw7CisKKyAgICAgICAgICBkc3RbaSs0XSA9IHRlbXA0IDw8IHNoaWZ0OworICAgICAgICAgIHRlbXA3ID0gc3JjW2krN10gKiBtdWw7CisKKyAgICAgICAgICBkc3RbaSs1XSA9IHRlbXA1IDw8IHNoaWZ0OworICAgICAgICAgIGRzdFtpKzZdID0gdGVtcDYgPDwgc2hpZnQ7CisgICAgICAgICAgZHN0W2krN10gPSB0ZW1wNyA8PCBzaGlmdDsKKworICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBEb3dubWl4IHNhbXBsZXMgZnJvbSBvcmlnaW5hbCBzaWduYWwgdG8gc3RlcmVvIG9yIG1vbm8gKHRoaXMgaXMgZm9yIDE2LWJpdCBzYW1wbGVzCisgKiBhbmQgZml4ZWQgcG9pbnQgZGVjb2RlciAtIG9yaWdpbmFsIChmb3IgMzItYml0IHNhbXBsZXMpIGlzIGluIGFjM2RzcC5jKS4KKyAqLworc3RhdGljIHZvaWQgYWMzX2Rvd25taXhfY19maXhlZDE2KGludDE2X3QgKipzYW1wbGVzLCBpbnQxNl90ICgqbWF0cml4KVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gsIGludCBsZW4pCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHYwLCB2MTsKKyAgICBpZiAob3V0X2NoID09IDIpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICB2MCA9IHYxID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbl9jaDsgaisrKSB7CisgICAgICAgICAgICAgICAgdjAgKz0gc2FtcGxlc1tqXVtpXSAqIG1hdHJpeFtqXVswXTsKKyAgICAgICAgICAgICAgICB2MSArPSBzYW1wbGVzW2pdW2ldICogbWF0cml4W2pdWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2FtcGxlc1swXVtpXSA9ICh2MCsyMDQ4KT4+MTI7CisgICAgICAgICAgICBzYW1wbGVzWzFdW2ldID0gKHYxKzIwNDgpPj4xMjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob3V0X2NoID09IDEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICB2MCA9IDA7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5fY2g7IGorKykKKyAgICAgICAgICAgICAgICB2MCArPSBzYW1wbGVzW2pdW2ldICogbWF0cml4W2pdWzBdOworICAgICAgICAgICAgc2FtcGxlc1swXVtpXSA9ICh2MCsyMDQ4KT4+MTI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpbmNsdWRlICJhYzNkZWMuYyIKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJkcmNfc2NhbGUiLCAicGVyY2VudGFnZSBvZiBkeW5hbWljIHJhbmdlIGNvbXByZXNzaW9uIHRvIGFwcGx5IiwgT0ZGU0VUKGRyY19zY2FsZSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IDEuMH0sIDAuMCwgNi4wLCBQQVIgfSwKKyAgICB7ICJoZWF2eV9jb21wciIsICJoZWF2eSBkeW5hbWljIHJhbmdlIGNvbXByZXNzaW9uIGVuYWJsZWQiLCBPRkZTRVQoaGVhdnlfY29tcHJlc3Npb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAwLCAxLCBQQVIgfSwKKyAgICB7IE5VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYWMzX2RlY29kZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiRml4ZWQtUG9pbnQgQUMtMyBEZWNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfYWMzX2ZpeGVkX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFjM19maXhlZCIsCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FDMywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YgKEFDM0RlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGFjM19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBhYzNfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBhYzNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFUU0MgQS81MkEgKEFDLTMpIiksCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmYWMzX2RlY29kZXJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWMzZGVjX2Zsb2F0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNkZWNfZmxvYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ZjNWNiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWMzZGVjX2Zsb2F0LmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIEFDLTMgQXVkaW8gRGVjb2RlcgorICogVGhpcyBjb2RlIHdhcyBkZXZlbG9wZWQgYXMgcGFydCBvZiBHb29nbGUgU3VtbWVyIG9mIENvZGUgMjAwNi4KKyAqIEUtQUMtMyBzdXBwb3J0IHdhcyBhZGRlZCBhcyBwYXJ0IG9mIEdvb2dsZSBTdW1tZXIgb2YgQ29kZSAyMDA3LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBLYXJ0aWtleSBNYWhlbmRyYSBCSEFUVCAoYmhhdHRrbSBhdCBnbWFpbCBkb3QgY29tKQorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQmFydGxvbWllaiBXb2xvd2llYyA8YmFydGVrLndvbG93aWVjQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBKdXN0aW4gUnVnZ2xlcyA8anVzdGluLnJ1Z2dsZXNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIFVwbWl4IGRlbGF5IHNhbXBsZXMgZnJvbSBzdGVyZW8gdG8gb3JpZ2luYWwgY2hhbm5lbCBsYXlvdXQuCisgKi8KKyNpbmNsdWRlICJhYzNkZWMuaCIKKyNpbmNsdWRlICJhYzNkZWMuYyIKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJkcmNfc2NhbGUiLCAicGVyY2VudGFnZSBvZiBkeW5hbWljIHJhbmdlIGNvbXByZXNzaW9uIHRvIGFwcGx5IiwgT0ZGU0VUKGRyY19zY2FsZSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IDEuMH0sIDAuMCwgNi4wLCBQQVIgfSwKKyAgICB7ICJoZWF2eV9jb21wciIsICJoZWF2eSBkeW5hbWljIHJhbmdlIGNvbXByZXNzaW9uIGVuYWJsZWQiLCBPRkZTRVQoaGVhdnlfY29tcHJlc3Npb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAwLCAxLCBQQVIgfSwKKyAgICB7ICJ0YXJnZXRfbGV2ZWwiLCAidGFyZ2V0IGxldmVsIGluIC1kQkZTICgwIG5vdCBhcHBsaWVkKSIsIE9GRlNFVCh0YXJnZXRfbGV2ZWwpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAtMzEsIDAsIFBBUiB9LAorCit7ImRtaXhfbW9kZSIsICJQcmVmZXJyZWQgU3RlcmVvIERvd25taXggTW9kZSIsIE9GRlNFVChwcmVmZXJyZWRfc3RlcmVvX2Rvd25taXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTEgfSwgLTEsIDIsIDAsICJkbWl4X21vZGUifSwKK3sibHRydF9jbWl4bGV2IiwgICAiTHQvUnQgQ2VudGVyIE1peCBMZXZlbCIsICAgT0ZGU0VUKGx0cnRfY2VudGVyX21peF9sZXZlbCksICAgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IC0xLjAgfSwgLTEuMCwgMi4wLCAwfSwKK3sibHRydF9zdXJtaXhsZXYiLCAiTHQvUnQgU3Vycm91bmQgTWl4IExldmVsIiwgT0ZGU0VUKGx0cnRfc3Vycm91bmRfbWl4X2xldmVsKSwgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IC0xLjAgfSwgLTEuMCwgMi4wLCAwfSwKK3sibG9yb19jbWl4bGV2IiwgICAiTG8vUm8gQ2VudGVyIE1peCBMZXZlbCIsICAgT0ZGU0VUKGxvcm9fY2VudGVyX21peF9sZXZlbCksICAgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IC0xLjAgfSwgLTEuMCwgMi4wLCAwfSwKK3sibG9yb19zdXJtaXhsZXYiLCAiTG8vUm8gU3Vycm91bmQgTWl4IExldmVsIiwgT0ZGU0VUKGxvcm9fc3Vycm91bmRfbWl4X2xldmVsKSwgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IC0xLjAgfSwgLTEuMCwgMi4wLCAwfSwKKworICAgIHsgTlVMTH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBhYzNfZGVjb2Rlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJBQzMgZGVjb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2FjM19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhYzMiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BQzMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mIChBQzNEZWNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBhYzNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gYWMzX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gYWMzX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVFNDIEEvNTJBIChBQy0zKSIpLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJmFjM19kZWNvZGVyX2NsYXNzLAorfTsKKworI2lmIENPTkZJR19FQUMzX0RFQ09ERVIKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGVhYzNfZGVjb2Rlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJFLUFDMyBkZWNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfZWFjM19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJlYWMzIiwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRUFDMywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YgKEFDM0RlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGFjM19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBhYzNfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBhYzNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFUU0MgQS81MkIgKEFDLTMsIEUtQUMtMykiKSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZlYWMzX2RlY29kZXJfY2xhc3MsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYzNkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDY4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNkc3AuYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIEFDLTMgRFNQIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDExIEp1c3RpbiBSdWdnbGVzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYWMzLmgiCisjaW5jbHVkZSAiYWMzZHNwLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCitzdGF0aWMgdm9pZCBhYzNfZXhwb25lbnRfbWluX2ModWludDhfdCAqZXhwLCBpbnQgbnVtX3JldXNlX2Jsb2NrcywgaW50IG5iX2NvZWZzKQoreworICAgIGludCBibGssIGk7CisKKyAgICBpZiAoIW51bV9yZXVzZV9ibG9ja3MpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb2VmczsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgbWluX2V4cCA9ICpleHA7CisgICAgICAgIHVpbnQ4X3QgKmV4cDEgPSBleHAgKyAyNTY7CisgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgbnVtX3JldXNlX2Jsb2NrczsgYmxrKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbmV4dF9leHAgPSAqZXhwMTsKKyAgICAgICAgICAgIGlmIChuZXh0X2V4cCA8IG1pbl9leHApCisgICAgICAgICAgICAgICAgbWluX2V4cCA9IG5leHRfZXhwOworICAgICAgICAgICAgZXhwMSArPSAyNTY7CisgICAgICAgIH0KKyAgICAgICAgKmV4cCsrID0gbWluX2V4cDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgYWMzX21heF9tc2JfYWJzX2ludDE2X2MoY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgbGVuKQoreworICAgIGludCBpLCB2ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgIHYgfD0gYWJzKHNyY1tpXSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyB2b2lkIGFjM19sc2hpZnRfaW50MTZfYyhpbnQxNl90ICpzcmMsIHVuc2lnbmVkIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNoaWZ0KQoreworICAgIHVpbnQzMl90ICpzcmMzMiA9ICh1aW50MzJfdCAqKXNyYzsKKyAgICBjb25zdCB1aW50MzJfdCBtYXNrID0gfigoKDEgPDwgc2hpZnQpIC0gMSkgPDwgMTYpOworICAgIGludCBpOworICAgIGxlbiA+Pj0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHsKKyAgICAgICAgc3JjMzJbaSAgXSA9IChzcmMzMltpICBdIDw8IHNoaWZ0KSAmIG1hc2s7CisgICAgICAgIHNyYzMyW2krMV0gPSAoc3JjMzJbaSsxXSA8PCBzaGlmdCkgJiBtYXNrOworICAgICAgICBzcmMzMltpKzJdID0gKHNyYzMyW2krMl0gPDwgc2hpZnQpICYgbWFzazsKKyAgICAgICAgc3JjMzJbaSszXSA9IChzcmMzMltpKzNdIDw8IHNoaWZ0KSAmIG1hc2s7CisgICAgICAgIHNyYzMyW2krNF0gPSAoc3JjMzJbaSs0XSA8PCBzaGlmdCkgJiBtYXNrOworICAgICAgICBzcmMzMltpKzVdID0gKHNyYzMyW2krNV0gPDwgc2hpZnQpICYgbWFzazsKKyAgICAgICAgc3JjMzJbaSs2XSA9IChzcmMzMltpKzZdIDw8IHNoaWZ0KSAmIG1hc2s7CisgICAgICAgIHNyYzMyW2krN10gPSAoc3JjMzJbaSs3XSA8PCBzaGlmdCkgJiBtYXNrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWMzX3JzaGlmdF9pbnQzMl9jKGludDMyX3QgKnNyYywgdW5zaWduZWQgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2hpZnQpCit7CisgICAgZG8geworICAgICAgICAqc3JjKysgPj49IHNoaWZ0OworICAgICAgICAqc3JjKysgPj49IHNoaWZ0OworICAgICAgICAqc3JjKysgPj49IHNoaWZ0OworICAgICAgICAqc3JjKysgPj49IHNoaWZ0OworICAgICAgICAqc3JjKysgPj49IHNoaWZ0OworICAgICAgICAqc3JjKysgPj49IHNoaWZ0OworICAgICAgICAqc3JjKysgPj49IHNoaWZ0OworICAgICAgICAqc3JjKysgPj49IHNoaWZ0OworICAgICAgICBsZW4gLT0gODsKKyAgICB9IHdoaWxlIChsZW4gPiAwKTsKK30KKworc3RhdGljIHZvaWQgZmxvYXRfdG9fZml4ZWQyNF9jKGludDMyX3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICBjb25zdCBmbG9hdCBzY2FsZSA9IDEgPDwgMjQ7CisgICAgZG8geworICAgICAgICAqZHN0KysgPSBscmludGYoKnNyYysrICogc2NhbGUpOworICAgICAgICAqZHN0KysgPSBscmludGYoKnNyYysrICogc2NhbGUpOworICAgICAgICAqZHN0KysgPSBscmludGYoKnNyYysrICogc2NhbGUpOworICAgICAgICAqZHN0KysgPSBscmludGYoKnNyYysrICogc2NhbGUpOworICAgICAgICAqZHN0KysgPSBscmludGYoKnNyYysrICogc2NhbGUpOworICAgICAgICAqZHN0KysgPSBscmludGYoKnNyYysrICogc2NhbGUpOworICAgICAgICAqZHN0KysgPSBscmludGYoKnNyYysrICogc2NhbGUpOworICAgICAgICAqZHN0KysgPSBscmludGYoKnNyYysrICogc2NhbGUpOworICAgICAgICBsZW4gLT0gODsKKyAgICB9IHdoaWxlIChsZW4gPiAwKTsKK30KKworc3RhdGljIHZvaWQgYWMzX2JpdF9hbGxvY19jYWxjX2JhcF9jKGludDE2X3QgKm1hc2ssIGludDE2X3QgKnBzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNucl9vZmZzZXQsIGludCBmbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpiYXBfdGFiLCB1aW50OF90ICpiYXApCit7CisgICAgaW50IGJpbiwgYmFuZCwgYmFuZF9lbmQ7CisKKyAgICAvKiBzcGVjaWFsIGNhc2UsIGlmIHNuciBvZmZzZXQgaXMgLTk2MCwgc2V0IGFsbCBiYXAncyB0byB6ZXJvICovCisgICAgaWYgKHNucl9vZmZzZXQgPT0gLTk2MCkgeworICAgICAgICBtZW1zZXQoYmFwLCAwLCBBQzNfTUFYX0NPRUZTKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJpbiAgPSBzdGFydDsKKyAgICBiYW5kID0gZmZfYWMzX2Jpbl90b19iYW5kX3RhYltzdGFydF07CisgICAgZG8geworICAgICAgICBpbnQgbSA9IChGRk1BWChtYXNrW2JhbmRdIC0gc25yX29mZnNldCAtIGZsb29yLCAwKSAmIDB4MUZFMCkgKyBmbG9vcjsKKyAgICAgICAgYmFuZF9lbmQgPSBmZl9hYzNfYmFuZF9zdGFydF90YWJbKytiYW5kXTsKKyAgICAgICAgYmFuZF9lbmQgPSBGRk1JTihiYW5kX2VuZCwgZW5kKTsKKworICAgICAgICBmb3IgKDsgYmluIDwgYmFuZF9lbmQ7IGJpbisrKSB7CisgICAgICAgICAgICBpbnQgYWRkcmVzcyA9IGF2X2NsaXAoKHBzZFtiaW5dIC0gbSkgPj4gNSwgMCwgNjMpOworICAgICAgICAgICAgYmFwW2Jpbl0gPSBiYXBfdGFiW2FkZHJlc3NdOworICAgICAgICB9CisgICAgfSB3aGlsZSAoZW5kID4gYmFuZF9lbmQpOworfQorCitzdGF0aWMgdm9pZCBhYzNfdXBkYXRlX2JhcF9jb3VudHNfYyh1aW50MTZfdCBtYW50X2NudFsxNl0sIHVpbnQ4X3QgKmJhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgd2hpbGUgKGxlbi0tID4gMCkKKyAgICAgICAgbWFudF9jbnRbYmFwW2xlbl1dKys7Cit9CisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgdWludDE2X3QsIGZmX2FjM19iYXBfYml0cylbMTZdID0geworICAgIDAsICAwLCAgMCwgIDMsICAwLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxNCwgMTYKK307CisKK3N0YXRpYyBpbnQgYWMzX2NvbXB1dGVfbWFudGlzc2Ffc2l6ZV9jKHVpbnQxNl90IG1hbnRfY250WzZdWzE2XSkKK3sKKyAgICBpbnQgYmxrLCBiYXA7CisgICAgaW50IGJpdHMgPSAwOworCisgICAgZm9yIChibGsgPSAwOyBibGsgPCBBQzNfTUFYX0JMT0NLUzsgYmxrKyspIHsKKyAgICAgICAgLy8gYmFwPTEgOiAzIG1hbnRpc3NhcyBpbiA1IGJpdHMKKyAgICAgICAgYml0cyArPSAobWFudF9jbnRbYmxrXVsxXSAvIDMpICogNTsKKyAgICAgICAgLy8gYmFwPTIgOiAzIG1hbnRpc3NhcyBpbiA3IGJpdHMKKyAgICAgICAgLy8gYmFwPTQgOiAyIG1hbnRpc3NhcyBpbiA3IGJpdHMKKyAgICAgICAgYml0cyArPSAoKG1hbnRfY250W2Jsa11bMl0gLyAzKSArIChtYW50X2NudFtibGtdWzRdID4+IDEpKSAqIDc7CisgICAgICAgIC8vIGJhcD0zIDogMSBtYW50aXNzYSBpbiAzIGJpdHMKKyAgICAgICAgYml0cyArPSBtYW50X2NudFtibGtdWzNdICogMzsKKyAgICAgICAgLy8gYmFwPTUgdG8gMTUgOiBnZXQgYml0cyBwZXIgbWFudGlzc2EgZnJvbSB0YWJsZQorICAgICAgICBmb3IgKGJhcCA9IDU7IGJhcCA8IDE2OyBiYXArKykKKyAgICAgICAgICAgIGJpdHMgKz0gbWFudF9jbnRbYmxrXVtiYXBdICogZmZfYWMzX2JhcF9iaXRzW2JhcF07CisgICAgfQorICAgIHJldHVybiBiaXRzOworfQorCitzdGF0aWMgdm9pZCBhYzNfZXh0cmFjdF9leHBvbmVudHNfYyh1aW50OF90ICpleHAsIGludDMyX3QgKmNvZWYsIGludCBuYl9jb2VmcykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb2VmczsgaSsrKSB7CisgICAgICAgIGludCB2ID0gYWJzKGNvZWZbaV0pOworICAgICAgICBleHBbaV0gPSB2ID8gMjMgLSBhdl9sb2cyKHYpIDogMjQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhYzNfc3VtX3NxdWFyZV9idXR0ZXJmbHlfaW50MzJfYyhpbnQ2NF90IHN1bVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmNvZWYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqY29lZjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIGludCBpOworCisgICAgc3VtWzBdID0gc3VtWzFdID0gc3VtWzJdID0gc3VtWzNdID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpbnQgbHQgPSBjb2VmMFtpXTsKKyAgICAgICAgaW50IHJ0ID0gY29lZjFbaV07CisgICAgICAgIGludCBtZCA9IGx0ICsgcnQ7CisgICAgICAgIGludCBzZCA9IGx0IC0gcnQ7CisgICAgICAgIE1BQzY0KHN1bVswXSwgbHQsIGx0KTsKKyAgICAgICAgTUFDNjQoc3VtWzFdLCBydCwgcnQpOworICAgICAgICBNQUM2NChzdW1bMl0sIG1kLCBtZCk7CisgICAgICAgIE1BQzY0KHN1bVszXSwgc2QsIHNkKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFjM19zdW1fc3F1YXJlX2J1dHRlcmZseV9mbG9hdF9jKGZsb2F0IHN1bVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpjb2VmMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpjb2VmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgaW50IGk7CisKKyAgICBzdW1bMF0gPSBzdW1bMV0gPSBzdW1bMl0gPSBzdW1bM10gPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGZsb2F0IGx0ID0gY29lZjBbaV07CisgICAgICAgIGZsb2F0IHJ0ID0gY29lZjFbaV07CisgICAgICAgIGZsb2F0IG1kID0gbHQgKyBydDsKKyAgICAgICAgZmxvYXQgc2QgPSBsdCAtIHJ0OworICAgICAgICBzdW1bMF0gKz0gbHQgKiBsdDsKKyAgICAgICAgc3VtWzFdICs9IHJ0ICogcnQ7CisgICAgICAgIHN1bVsyXSArPSBtZCAqIG1kOworICAgICAgICBzdW1bM10gKz0gc2QgKiBzZDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFjM19kb3dubWl4X2MoZmxvYXQgKipzYW1wbGVzLCBmbG9hdCAoKm1hdHJpeClbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfY2gsIGludCBpbl9jaCwgaW50IGxlbikKK3sKKyAgICBpbnQgaSwgajsKKyAgICBmbG9hdCB2MCwgdjE7CisgICAgaWYgKG91dF9jaCA9PSAyKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgdjAgPSB2MSA9IDAuMGY7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5fY2g7IGorKykgeworICAgICAgICAgICAgICAgIHYwICs9IHNhbXBsZXNbal1baV0gKiBtYXRyaXhbal1bMF07CisgICAgICAgICAgICAgICAgdjEgKz0gc2FtcGxlc1tqXVtpXSAqIG1hdHJpeFtqXVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNhbXBsZXNbMF1baV0gPSB2MDsKKyAgICAgICAgICAgIHNhbXBsZXNbMV1baV0gPSB2MTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob3V0X2NoID09IDEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICB2MCA9IDAuMGY7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5fY2g7IGorKykKKyAgICAgICAgICAgICAgICB2MCArPSBzYW1wbGVzW2pdW2ldICogbWF0cml4W2pdWzBdOworICAgICAgICAgICAgc2FtcGxlc1swXVtpXSA9IHYwOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhYzNfZG93bm1peF9jX2ZpeGVkKGludDMyX3QgKipzYW1wbGVzLCBpbnQxNl90ICgqbWF0cml4KVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoLCBpbnQgbGVuKQoreworICAgIGludCBpLCBqOworICAgIGludDY0X3QgdjAsIHYxOworICAgIGlmIChvdXRfY2ggPT0gMikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIHYwID0gdjEgPSAwOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGluX2NoOyBqKyspIHsKKyAgICAgICAgICAgICAgICB2MCArPSAoaW50NjRfdClzYW1wbGVzW2pdW2ldICogbWF0cml4W2pdWzBdOworICAgICAgICAgICAgICAgIHYxICs9IChpbnQ2NF90KXNhbXBsZXNbal1baV0gKiBtYXRyaXhbal1bMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYW1wbGVzWzBdW2ldID0gKHYwKzIwNDgpPj4xMjsKKyAgICAgICAgICAgIHNhbXBsZXNbMV1baV0gPSAodjErMjA0OCk+PjEyOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvdXRfY2ggPT0gMSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIHYwID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbl9jaDsgaisrKQorICAgICAgICAgICAgICAgIHYwICs9IChpbnQ2NF90KXNhbXBsZXNbal1baV0gKiBtYXRyaXhbal1bMF07CisgICAgICAgICAgICBzYW1wbGVzWzBdW2ldID0gKHYwKzIwNDgpPj4xMjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgYXBwbHlfd2luZG93X2ludDE2X2MoaW50MTZfdCAqb3V0cHV0LCBjb25zdCBpbnQxNl90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKndpbmRvdywgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbGVuMiA9IGxlbiA+PiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjI7IGkrKykgeworICAgICAgICBpbnQxNl90IHcgICAgICAgPSB3aW5kb3dbaV07CisgICAgICAgIG91dHB1dFtpXSAgICAgICA9IChNVUwxNihpbnB1dFtpXSwgICAgICAgdykgKyAoMSA8PCAxNCkpID4+IDE1OworICAgICAgICBvdXRwdXRbbGVuLWktMV0gPSAoTVVMMTYoaW5wdXRbbGVuLWktMV0sIHcpICsgKDEgPDwgMTQpKSA+PiAxNTsKKyAgICB9Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9hYzNkc3BfaW5pdChBQzNEU1BDb250ZXh0ICpjLCBpbnQgYml0X2V4YWN0KQoreworICAgIGMtPmFjM19leHBvbmVudF9taW4gPSBhYzNfZXhwb25lbnRfbWluX2M7CisgICAgYy0+YWMzX21heF9tc2JfYWJzX2ludDE2ID0gYWMzX21heF9tc2JfYWJzX2ludDE2X2M7CisgICAgYy0+YWMzX2xzaGlmdF9pbnQxNiA9IGFjM19sc2hpZnRfaW50MTZfYzsKKyAgICBjLT5hYzNfcnNoaWZ0X2ludDMyID0gYWMzX3JzaGlmdF9pbnQzMl9jOworICAgIGMtPmZsb2F0X3RvX2ZpeGVkMjQgPSBmbG9hdF90b19maXhlZDI0X2M7CisgICAgYy0+Yml0X2FsbG9jX2NhbGNfYmFwID0gYWMzX2JpdF9hbGxvY19jYWxjX2JhcF9jOworICAgIGMtPnVwZGF0ZV9iYXBfY291bnRzID0gYWMzX3VwZGF0ZV9iYXBfY291bnRzX2M7CisgICAgYy0+Y29tcHV0ZV9tYW50aXNzYV9zaXplID0gYWMzX2NvbXB1dGVfbWFudGlzc2Ffc2l6ZV9jOworICAgIGMtPmV4dHJhY3RfZXhwb25lbnRzID0gYWMzX2V4dHJhY3RfZXhwb25lbnRzX2M7CisgICAgYy0+c3VtX3NxdWFyZV9idXR0ZXJmbHlfaW50MzIgPSBhYzNfc3VtX3NxdWFyZV9idXR0ZXJmbHlfaW50MzJfYzsKKyAgICBjLT5zdW1fc3F1YXJlX2J1dHRlcmZseV9mbG9hdCA9IGFjM19zdW1fc3F1YXJlX2J1dHRlcmZseV9mbG9hdF9jOworICAgIGMtPmRvd25taXggPSBhYzNfZG93bm1peF9jOworICAgIGMtPmRvd25taXhfZml4ZWQgPSBhYzNfZG93bm1peF9jX2ZpeGVkOworICAgIGMtPmFwcGx5X3dpbmRvd19pbnQxNiA9IGFwcGx5X3dpbmRvd19pbnQxNl9jOworCisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl9hYzNkc3BfaW5pdF9hcm0oYywgYml0X2V4YWN0KTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2FjM2RzcF9pbml0X3g4NihjLCBiaXRfZXhhY3QpOworICAgIGlmIChBUkNIX01JUFMpCisgICAgICAgIGZmX2FjM2RzcF9pbml0X21pcHMoYywgYml0X2V4YWN0KTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2RzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWMzZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5OGM4YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2RzcC5oCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQUMtMyBEU1AgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSnVzdGluIFJ1Z2dsZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FDM0RTUF9ICisjZGVmaW5lIEFWQ09ERUNfQUMzRFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIE51bWJlciBvZiBtYW50aXNzYSBiaXRzIHdyaXR0ZW4gZm9yIGVhY2ggYmFwIHZhbHVlLgorICogYmFwIHZhbHVlcyB3aXRoIGZyYWN0aW9uYWwgYml0cyBhcmUgc2V0IHRvIDAgYW5kIGFyZSBjYWxjdWxhdGVkIHNlcGFyYXRlbHkuCisgKi8KK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9hYzNfYmFwX2JpdHNbMTZdOworCit0eXBlZGVmIHN0cnVjdCBBQzNEU1BDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBTZXQgZWFjaCBlbmNvZGVkIGV4cG9uZW50IGluIGEgYmxvY2sgdG8gdGhlIG1pbmltdW0gb2YgaXRzZWxmIGFuZCB0aGUKKyAgICAgKiBleHBvbmVudHMgaW4gdGhlIHNhbWUgZnJlcXVlbmN5IGJpbiBvZiB1cCB0byA1IGZvbGxvd2luZyBibG9ja3MuCisgICAgICogQHBhcmFtIGV4cCAgIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIG9mIGV4cG9uZW50cy4KKyAgICAgKiAgICAgICAgICAgICAgY29uc3RyYWludHM6IGFsaWduIDE2CisgICAgICogQHBhcmFtIG51bV9yZXVzZV9ibG9ja3MgIG51bWJlciBvZiBibG9ja3MgdGhhdCB3aWxsIHJldXNlIGV4cG9uZW50cyBmcm9tIHRoZSBjdXJyZW50IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50czogcmFuZ2UgMCB0byA1CisgICAgICogQHBhcmFtIG5iX2NvZWZzICBudW1iZXIgb2YgZnJlcXVlbmN5IGNvZWZmaWNpZW50cy4KKyAgICAgKi8KKyAgICB2b2lkICgqYWMzX2V4cG9uZW50X21pbikodWludDhfdCAqZXhwLCBpbnQgbnVtX3JldXNlX2Jsb2NrcywgaW50IG5iX2NvZWZzKTsKKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBNU0Igb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIGVhY2ggZWxlbWVudCBpbiBhbgorICAgICAqIGFycmF5IG9mIGludDE2X3QuCisgICAgICogQHBhcmFtIHNyYyBpbnB1dCBhcnJheQorICAgICAqICAgICAgICAgICAgY29uc3RyYWludHM6IGFsaWduIDE2LiB2YWx1ZXMgbXVzdCBiZSBpbiByYW5nZSBbLTMyNzY3LDMyNzY3XQorICAgICAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBtdWx0aXBsZSBvZiAxNiBncmVhdGVyIHRoYW4gMAorICAgICAqIEByZXR1cm4gICAgYSB2YWx1ZSB3aXRoIHRoZSBzYW1lIE1TQiBhcyBtYXgoYWJzKHNyY1tdKSkKKyAgICAgKi8KKyAgICBpbnQgKCphYzNfbWF4X21zYl9hYnNfaW50MTYpKGNvbnN0IGludDE2X3QgKnNyYywgaW50IGxlbik7CisKKyAgICAvKioKKyAgICAgKiBMZWZ0LXNoaWZ0IGVhY2ggdmFsdWUgaW4gYW4gYXJyYXkgb2YgaW50MTZfdCBieSBhIHNwZWNpZmllZCBhbW91bnQuCisgICAgICogQHBhcmFtIHNyYyAgICBpbnB1dCBhcnJheQorICAgICAqICAgICAgICAgICAgICAgY29uc3RyYWludHM6IGFsaWduIDE2CisgICAgICogQHBhcmFtIGxlbiAgICBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBhcnJheQorICAgICAqICAgICAgICAgICAgICAgY29uc3RyYWludHM6IG11bHRpcGxlIG9mIDMyIGdyZWF0ZXIgdGhhbiAwCisgICAgICogQHBhcmFtIHNoaWZ0ICBsZWZ0IHNoaWZ0IGFtb3VudAorICAgICAqICAgICAgICAgICAgICAgY29uc3RyYWludHM6IHJhbmdlIFswLDE1XQorICAgICAqLworICAgIHZvaWQgKCphYzNfbHNoaWZ0X2ludDE2KShpbnQxNl90ICpzcmMsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBzaGlmdCk7CisKKyAgICAvKioKKyAgICAgKiBSaWdodC1zaGlmdCBlYWNoIHZhbHVlIGluIGFuIGFycmF5IG9mIGludDMyX3QgYnkgYSBzcGVjaWZpZWQgYW1vdW50LgorICAgICAqIEBwYXJhbSBzcmMgICAgaW5wdXQgYXJyYXkKKyAgICAgKiAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBhbGlnbiAxNgorICAgICAqIEBwYXJhbSBsZW4gICAgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBtdWx0aXBsZSBvZiAxNiBncmVhdGVyIHRoYW4gMAorICAgICAqIEBwYXJhbSBzaGlmdCAgcmlnaHQgc2hpZnQgYW1vdW50CisgICAgICogICAgICAgICAgICAgICBjb25zdHJhaW50czogcmFuZ2UgWzAsMzFdCisgICAgICovCisgICAgdm9pZCAoKmFjM19yc2hpZnRfaW50MzIpKGludDMyX3QgKnNyYywgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IHNoaWZ0KTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYW4gYXJyYXkgb2YgZmxvYXQgaW4gcmFuZ2UgWy0xLjAsMS4wXSB0byBpbnQzMl90IHdpdGggcmFuZ2UKKyAgICAgKiBbLSgxPDwyNCksKDE8PDI0KV0KKyAgICAgKgorICAgICAqIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gYXJyYXkgb2YgaW50MzJfdC4KKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gc3JjIHNvdXJjZSBhcnJheSBvZiBmbG9hdC4KKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBlbGVtZW50cyB0byBjb252ZXJ0LgorICAgICAqICAgICAgICAgICAgY29uc3RyYWludHM6IG11bHRpcGxlIG9mIDMyIGdyZWF0ZXIgdGhhbiB6ZXJvCisgICAgICovCisgICAgdm9pZCAoKmZsb2F0X3RvX2ZpeGVkMjQpKGludDMyX3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgdW5zaWduZWQgaW50IGxlbik7CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgYml0IGFsbG9jYXRpb24gcG9pbnRlcnMuCisgICAgICogVGhlIFNOUiBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtYXNraW5nIGN1cnZlIGFuZCB0aGUgc2lnbmFsLiAgQUMtMworICAgICAqIHVzZXMgdGhpcyB2YWx1ZSBmb3IgZWFjaCBmcmVxdWVuY3kgYmluIHRvIGFsbG9jYXRlIGJpdHMuICBUaGUgc25yb2Zmc2V0CisgICAgICogcGFyYW1ldGVyIGlzIGEgZ2xvYmFsIGFkanVzdG1lbnQgdG8gdGhlIFNOUiBmb3IgYWxsIGJpbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dICBtYXNrICAgICAgIG1hc2tpbmcgY3VydmUKKyAgICAgKiBAcGFyYW1baW5dICBwc2QgICAgICAgIHNpZ25hbCBwb3dlciBmb3IgZWFjaCBmcmVxdWVuY3kgYmluCisgICAgICogQHBhcmFtW2luXSAgc3RhcnQgICAgICBzdGFydGluZyBiaW4gbG9jYXRpb24KKyAgICAgKiBAcGFyYW1baW5dICBlbmQgICAgICAgIGVuZGluZyBiaW4gbG9jYXRpb24KKyAgICAgKiBAcGFyYW1baW5dICBzbnJfb2Zmc2V0IFNOUiBhZGp1c3RtZW50CisgICAgICogQHBhcmFtW2luXSAgZmxvb3IgICAgICBub2lzZSBmbG9vcgorICAgICAqIEBwYXJhbVtpbl0gIGJhcF90YWIgICAgbG9vay11cCB0YWJsZSBmb3IgYml0IGFsbG9jYXRpb24gcG9pbnRlcnMKKyAgICAgKiBAcGFyYW1bb3V0XSBiYXAgICAgICAgIGJpdCBhbGxvY2F0aW9uIHBvaW50ZXJzCisgICAgICovCisgICAgdm9pZCAoKmJpdF9hbGxvY19jYWxjX2JhcCkoaW50MTZfdCAqbWFzaywgaW50MTZfdCAqcHNkLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNucl9vZmZzZXQsIGludCBmbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpiYXBfdGFiLCB1aW50OF90ICpiYXApOworCisgICAgLyoqCisgICAgICogVXBkYXRlIGJhcCBjb3VudHMgdXNpbmcgdGhlIHN1cHBsaWVkIGFycmF5IG9mIGJhcC4KKyAgICAgKgorICAgICAqIEBwYXJhbVtvdXRdIG1hbnRfY250ICAgYmFwIGNvdW50cyBmb3IgMSBibG9jaworICAgICAqIEBwYXJhbVtpbl0gIGJhcCAgICAgICAgYXJyYXkgb2YgYmFwLCBwb2ludGluZyB0byBzdGFydCBjb2VmIGJpbgorICAgICAqIEBwYXJhbVtpbl0gIGxlbiAgICAgICAgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHByb2Nlc3MKKyAgICAgKi8KKyAgICB2b2lkICgqdXBkYXRlX2JhcF9jb3VudHMpKHVpbnQxNl90IG1hbnRfY250WzE2XSwgdWludDhfdCAqYmFwLCBpbnQgbGVuKTsKKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIGVuY29kZSBhIHNldCBvZiBtYW50aXNzYXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG1hbnRfY250ICAgIGJhcCBjb3VudHMgZm9yIGFsbCBibG9ja3MKKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgIG1hbnRpc3NhIGJpdCBjb3VudAorICAgICAqLworICAgIGludCAoKmNvbXB1dGVfbWFudGlzc2Ffc2l6ZSkodWludDE2X3QgbWFudF9jbnRbNl1bMTZdKTsKKworICAgIHZvaWQgKCpleHRyYWN0X2V4cG9uZW50cykodWludDhfdCAqZXhwLCBpbnQzMl90ICpjb2VmLCBpbnQgbmJfY29lZnMpOworCisgICAgdm9pZCAoKnN1bV9zcXVhcmVfYnV0dGVyZmx5X2ludDMyKShpbnQ2NF90IHN1bVs0XSwgY29uc3QgaW50MzJfdCAqY29lZjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpjb2VmMSwgaW50IGxlbik7CisKKyAgICB2b2lkICgqc3VtX3NxdWFyZV9idXR0ZXJmbHlfZmxvYXQpKGZsb2F0IHN1bVs0XSwgY29uc3QgZmxvYXQgKmNvZWYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmNvZWYxLCBpbnQgbGVuKTsKKworICAgIHZvaWQgKCpkb3dubWl4KShmbG9hdCAqKnNhbXBsZXMsIGZsb2F0ICgqbWF0cml4KVsyXSwgaW50IG91dF9jaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGluX2NoLCBpbnQgbGVuKTsKKworICAgIHZvaWQgKCpkb3dubWl4X2ZpeGVkKShpbnQzMl90ICoqc2FtcGxlcywgaW50MTZfdCAoKm1hdHJpeClbMl0sIGludCBvdXRfY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl9jaCwgaW50IGxlbik7CisKKyAgICAvKioKKyAgICAgKiBBcHBseSBzeW1tZXRyaWMgd2luZG93IGluIDE2LWJpdCBmaXhlZC1wb2ludC4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IGRlc3RpbmF0aW9uIGFycmF5CisgICAgICogICAgICAgICAgICAgICBjb25zdHJhaW50czogMTYtYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIGlucHV0ICBzb3VyY2UgYXJyYXkKKyAgICAgKiAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gd2luZG93IHdpbmRvdyBhcnJheQorICAgICAqICAgICAgICAgICAgICAgY29uc3RyYWludHM6IDE2LWJ5dGUgYWxpZ25lZCwgYXQgbGVhc3QgbGVuLzIgZWxlbWVudHMKKyAgICAgKiBAcGFyYW0gbGVuICAgIGZ1bGwgd2luZG93IGxlbmd0aAorICAgICAqICAgICAgICAgICAgICAgY29uc3RyYWludHM6IG11bHRpcGxlIG9mID8gZ3JlYXRlciB0aGFuIHplcm8KKyAgICAgKi8KKyAgICB2b2lkICgqYXBwbHlfd2luZG93X2ludDE2KShpbnQxNl90ICpvdXRwdXQsIGNvbnN0IGludDE2X3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKndpbmRvdywgdW5zaWduZWQgaW50IGxlbik7Cit9IEFDM0RTUENvbnRleHQ7CisKK3ZvaWQgZmZfYWMzZHNwX2luaXQgICAgKEFDM0RTUENvbnRleHQgKmMsIGludCBiaXRfZXhhY3QpOwordm9pZCBmZl9hYzNkc3BfaW5pdF9hcm0oQUMzRFNQQ29udGV4dCAqYywgaW50IGJpdF9leGFjdCk7Cit2b2lkIGZmX2FjM2RzcF9pbml0X3g4NihBQzNEU1BDb250ZXh0ICpjLCBpbnQgYml0X2V4YWN0KTsKK3ZvaWQgZmZfYWMzZHNwX2luaXRfbWlwcyhBQzNEU1BDb250ZXh0ICpjLCBpbnQgYml0X2V4YWN0KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUMzRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWMzZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1MjkwOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2VuYy5jCkBAIC0wLDAgKzEsMjQ5NCBAQAorLyoKKyAqIFRoZSBzaW1wbGVzdCBBQy0zIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDEwIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMCBQcmFrYXNoIFB1bm5vb3IgPHByYWthc2hAcHVubm9vci5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVGhlIHNpbXBsZXN0IEFDLTMgZW5jb2Rlci4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1lX2NtcC5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAiYXVkaW9kc3AuaCIKKyNpbmNsdWRlICJhYzNkc3AuaCIKKyNpbmNsdWRlICJhYzMuaCIKKyNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJhYzNlbmMuaCIKKyNpbmNsdWRlICJlYWMzZW5jLmgiCisKK3R5cGVkZWYgc3RydWN0IEFDM01hbnQgeworICAgIGludDE2X3QgKnFtYW50MV9wdHIsICpxbWFudDJfcHRyLCAqcW1hbnQ0X3B0cjsgLy8vPCBtYW50aXNzYSBwb2ludGVycyBmb3IgYmFwPTEsMiw0CisgICAgaW50IG1hbnQxX2NudCwgbWFudDJfY250LCBtYW50NF9jbnQ7ICAgIC8vLzwgbWFudGlzc2EgY291bnRzIGZvciBiYXA9MSwyLDQKK30gQUMzTWFudDsKKworI2RlZmluZSBDTUlYTEVWX05VTV9PUFRJT05TIDMKK3N0YXRpYyBjb25zdCBmbG9hdCBjbWl4bGV2X29wdGlvbnNbQ01JWExFVl9OVU1fT1BUSU9OU10gPSB7CisgICAgTEVWRUxfTUlOVVNfM0RCLCBMRVZFTF9NSU5VU180UE9JTlQ1REIsIExFVkVMX01JTlVTXzZEQgorfTsKKworI2RlZmluZSBTVVJNSVhMRVZfTlVNX09QVElPTlMgMworc3RhdGljIGNvbnN0IGZsb2F0IHN1cm1peGxldl9vcHRpb25zW1NVUk1JWExFVl9OVU1fT1BUSU9OU10gPSB7CisgICAgTEVWRUxfTUlOVVNfM0RCLCBMRVZFTF9NSU5VU182REIsIExFVkVMX1pFUk8KK307CisKKyNkZWZpbmUgRVhUTUlYTEVWX05VTV9PUFRJT05TIDgKK3N0YXRpYyBjb25zdCBmbG9hdCBleHRtaXhsZXZfb3B0aW9uc1tFWFRNSVhMRVZfTlVNX09QVElPTlNdID0geworICAgIExFVkVMX1BMVVNfM0RCLCAgTEVWRUxfUExVU18xUE9JTlQ1REIsICBMRVZFTF9PTkUsICAgICAgIExFVkVMX01JTlVTXzRQT0lOVDVEQiwKKyAgICBMRVZFTF9NSU5VU18zREIsIExFVkVMX01JTlVTXzRQT0lOVDVEQiwgTEVWRUxfTUlOVVNfNkRCLCBMRVZFTF9aRVJPCit9OworCisKKy8qKgorICogTFVUIGZvciBudW1iZXIgb2YgZXhwb25lbnQgZ3JvdXBzLgorICogZXhwb25lbnRfZ3JvdXBfdGFiW2NvdXBsaW5nXVtleHBvbmVudCBzdHJhdGVneS0xXVtudW1iZXIgb2YgY29lZmZpY2llbnRzXQorICovCitzdGF0aWMgdWludDhfdCBleHBvbmVudF9ncm91cF90YWJbMl1bM11bMjU2XTsKKworCisvKioKKyAqIExpc3Qgb2Ygc3VwcG9ydGVkIGNoYW5uZWwgbGF5b3V0cy4KKyAqLworY29uc3QgdWludDY0X3QgZmZfYWMzX2NoYW5uZWxfbGF5b3V0c1sxOV0gPSB7CisgICAgIEFWX0NIX0xBWU9VVF9NT05PLAorICAgICBBVl9DSF9MQVlPVVRfU1RFUkVPLAorICAgICBBVl9DSF9MQVlPVVRfMl8xLAorICAgICBBVl9DSF9MQVlPVVRfU1VSUk9VTkQsCisgICAgIEFWX0NIX0xBWU9VVF8yXzIsCisgICAgIEFWX0NIX0xBWU9VVF9RVUFELAorICAgICBBVl9DSF9MQVlPVVRfNFBPSU5UMCwKKyAgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDAsCisgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0ssCisgICAgKEFWX0NIX0xBWU9VVF9NT05PICAgICB8IEFWX0NIX0xPV19GUkVRVUVOQ1kpLAorICAgIChBVl9DSF9MQVlPVVRfU1RFUkVPICAgfCBBVl9DSF9MT1dfRlJFUVVFTkNZKSwKKyAgICAoQVZfQ0hfTEFZT1VUXzJfMSAgICAgIHwgQVZfQ0hfTE9XX0ZSRVFVRU5DWSksCisgICAgKEFWX0NIX0xBWU9VVF9TVVJST1VORCB8IEFWX0NIX0xPV19GUkVRVUVOQ1kpLAorICAgIChBVl9DSF9MQVlPVVRfMl8yICAgICAgfCBBVl9DSF9MT1dfRlJFUVVFTkNZKSwKKyAgICAoQVZfQ0hfTEFZT1VUX1FVQUQgICAgIHwgQVZfQ0hfTE9XX0ZSRVFVRU5DWSksCisgICAgKEFWX0NIX0xBWU9VVF80UE9JTlQwICB8IEFWX0NIX0xPV19GUkVRVUVOQ1kpLAorICAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMSwKKyAgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSywKKyAgICAgMAorfTsKKworCisvKioKKyAqIExVVCB0byBzZWxlY3QgdGhlIGJhbmR3aWR0aCBjb2RlIGJhc2VkIG9uIHRoZSBiaXQgcmF0ZSwgc2FtcGxlIHJhdGUsIGFuZAorICogbnVtYmVyIG9mIGZ1bGwtYmFuZHdpZHRoIGNoYW5uZWxzLgorICogYmFuZHdpZHRoX3RhYltmYndfY2hhbm5lbHMtMV1bc2FtcGxlIHJhdGUgY29kZV1bYml0IHJhdGUgY29kZV0KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWMzX2JhbmR3aWR0aF90YWJbNV1bM11bMTldID0geworLy8gICAgICAzMiAgNDAgIDQ4ICA1NiAgNjQgIDgwICA5NiAxMTIgMTI4IDE2MCAxOTIgMjI0IDI1NiAzMjAgMzg0IDQ0OCA1MTIgNTc2IDY0MAorCisgICAgeyB7ICAwLCAgMCwgIDAsIDEyLCAxNiwgMzIsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4IH0sCisgICAgICB7ICAwLCAgMCwgIDAsIDE2LCAyMCwgMzYsIDU2LCA1NiwgNTYsIDU2LCA1NiwgNTYsIDU2LCA1NiwgNTYsIDU2LCA1NiwgNTYsIDU2IH0sCisgICAgICB7ICAwLCAgMCwgIDAsIDMyLCA0MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwIH0gfSwKKworICAgIHsgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsIDI0LCAzMiwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCB9LAorICAgICAgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgNCwgMjQsIDI4LCAzNiwgNTYsIDU2LCA1NiwgNTYsIDU2LCA1NiwgNTYsIDU2LCA1NiB9LAorICAgICAgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgNDQsIDUyLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCB9IH0sCisKKyAgICB7IHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDggfSwKKyAgICAgIHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgNCwgMjAsIDI4LCAzNiwgNDQsIDU2LCA1NiwgNTYsIDU2LCA1NiwgNTYgfSwKKyAgICAgIHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgNDAsIDQ4LCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAgfSB9LAorCisgICAgeyB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxMiwgMjQsIDMyLCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4IH0sCisgICAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNiwgMjgsIDM2LCA1NiwgNTYsIDU2LCA1NiwgNTYsIDU2IH0sCisgICAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMiwgNDgsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwIH0gfSwKKworICAgIHsgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA4LCAyMCwgMzIsIDQwLCA0OCwgNDgsIDQ4LCA0OCB9LAorICAgICAgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDEyLCAyNCwgMzYsIDQ0LCA1NiwgNTYsIDU2LCA1NiB9LAorICAgICAgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDI4LCA0NCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCB9IH0KK307CisKKworLyoqCisgKiBMVVQgdG8gc2VsZWN0IHRoZSBjb3VwbGluZyBzdGFydCBiYW5kIGJhc2VkIG9uIHRoZSBiaXQgcmF0ZSwgc2FtcGxlIHJhdGUsIGFuZAorICogbnVtYmVyIG9mIGZ1bGwtYmFuZHdpZHRoIGNoYW5uZWxzLiAtMSA9IGNvdXBsaW5nIG9mZgorICogYWMzX2NvdXBsaW5nX3N0YXJ0X3RhYltjaGFubmVsX21vZGUtMl1bc2FtcGxlIHJhdGUgY29kZV1bYml0IHJhdGUgY29kZV0KKyAqCisgKiBUT0RPOiBtb3JlIHRlc3RpbmcgZm9yIG9wdGltYWwgcGFyYW1ldGVycy4KKyAqICAgICAgIG11bHRpLWNoYW5uZWwgdGVzdHMgYXQgNDQuMWtIeiBhbmQgMzJrSHouCisgKi8KK3N0YXRpYyBjb25zdCBpbnQ4X3QgYWMzX2NvdXBsaW5nX3N0YXJ0X3RhYls2XVszXVsxOV0gPSB7CisvLyAgICAgIDMyICA0MCAgNDggIDU2ICA2NCAgODAgIDk2IDExMiAxMjggMTYwIDE5MiAyMjQgMjU2IDMyMCAzODQgNDQ4IDUxMiA1NzYgNjQwCisKKyAgICAvLyAyLzAKKyAgICB7IHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDcsICA4LCAxMSwgMTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICAgIHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAzLCAgNSwgIDcsIDEwLCAxMiwgMTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICAgIHsgIDAsICAwLCAgMCwgIDAsICAxLCAgMiwgIDIsICA5LCAxMywgMTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSB9LAorCisgICAgLy8gMy8wCisgICAgeyB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDIsICAyLCAgNiwgIDksIDExLCAxMiwgMTMsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDIsICAyLCAgNiwgIDksIDExLCAxMiwgMTMsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgICB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0gfSwKKworICAgIC8vIDIvMSAtIHVudGVzdGVkCisgICAgeyB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDIsICAyLCAgNiwgIDksIDExLCAxMiwgMTMsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDIsICAyLCAgNiwgIDksIDExLCAxMiwgMTMsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgICB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0gfSwKKworICAgIC8vIDMvMQorICAgIHsgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDMsICAyLCAxMCwgMTEsIDExLCAxMiwgMTIsIDE0LCAtMSB9LAorICAgICAgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDMsICAyLCAxMCwgMTEsIDExLCAxMiwgMTIsIDE0LCAtMSB9LAorICAgICAgeyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9IH0sCisKKyAgICAvLyAyLzIgLSB1bnRlc3RlZAorICAgIHsgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDMsICAyLCAxMCwgMTEsIDExLCAxMiwgMTIsIDE0LCAtMSB9LAorICAgICAgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDMsICAyLCAxMCwgMTEsIDExLCAxMiwgMTIsIDE0LCAtMSB9LAorICAgICAgeyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9IH0sCisKKyAgICAvLyAzLzIKKyAgICB7IHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDYsICA4LCAxMSwgMTIsIDEyLCAtMSwgLTEgfSwKKyAgICAgIHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDYsICA4LCAxMSwgMTIsIDEyLCAtMSwgLTEgfSwKKyAgICAgIHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSB9LAorfTsKKworCisvKioKKyAqIEFkanVzdCB0aGUgZnJhbWUgc2l6ZSB0byBtYWtlIHRoZSBhdmVyYWdlIGJpdCByYXRlIG1hdGNoIHRoZSB0YXJnZXQgYml0IHJhdGUuCisgKiBUaGlzIGlzIG9ubHkgbmVlZGVkIGZvciAxMTAyNSwgMjIwNTAsIGFuZCA0NDEwMCBzYW1wbGUgcmF0ZXMgb3IgYW55IEUtQUMtMy4KKyAqCisgKiBAcGFyYW0gcyAgQUMtMyBlbmNvZGVyIHByaXZhdGUgY29udGV4dAorICovCit2b2lkIGZmX2FjM19hZGp1c3RfZnJhbWVfc2l6ZShBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIHdoaWxlIChzLT5iaXRzX3dyaXR0ZW4gPj0gcy0+Yml0X3JhdGUgJiYgcy0+c2FtcGxlc193cml0dGVuID49IHMtPnNhbXBsZV9yYXRlKSB7CisgICAgICAgIHMtPmJpdHNfd3JpdHRlbiAgICAtPSBzLT5iaXRfcmF0ZTsKKyAgICAgICAgcy0+c2FtcGxlc193cml0dGVuIC09IHMtPnNhbXBsZV9yYXRlOworICAgIH0KKyAgICBzLT5mcmFtZV9zaXplID0gcy0+ZnJhbWVfc2l6ZV9taW4gKworICAgICAgICAgICAgICAgICAgICAyICogKHMtPmJpdHNfd3JpdHRlbiAqIHMtPnNhbXBsZV9yYXRlIDwgcy0+c2FtcGxlc193cml0dGVuICogcy0+Yml0X3JhdGUpOworICAgIHMtPmJpdHNfd3JpdHRlbiAgICArPSBzLT5mcmFtZV9zaXplICogODsKKyAgICBzLT5zYW1wbGVzX3dyaXR0ZW4gKz0gQUMzX0JMT0NLX1NJWkUgKiBzLT5udW1fYmxvY2tzOworfQorCisKKy8qKgorICogU2V0IHRoZSBpbml0aWFsIGNvdXBsaW5nIHN0cmF0ZWd5IHBhcmFtZXRlcnMgcHJpb3IgdG8gY291cGxpbmcgYW5hbHlzaXMuCisgKgorICogQHBhcmFtIHMgIEFDLTMgZW5jb2RlciBwcml2YXRlIGNvbnRleHQKKyAqLwordm9pZCBmZl9hYzNfY29tcHV0ZV9jb3VwbGluZ19zdHJhdGVneShBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBibGssIGNoOworICAgIGludCBnb3RfY3BsX3NucjsKKyAgICBpbnQgbnVtX2NwbF9ibG9ja3M7CisKKyAgICAvKiBzZXQgY291cGxpbmcgdXNlIGZsYWdzIGZvciBlYWNoIGJsb2NrL2NoYW5uZWwgKi8KKyAgICAvKiBUT0RPOiB0dXJuIGNvdXBsaW5nIG9uL29mZiBhbmQgYWRqdXN0IHN0YXJ0IGJhbmQgYmFzZWQgb24gYml0IHVzYWdlICovCisgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICBBQzNCbG9jayAqYmxvY2sgPSAmcy0+YmxvY2tzW2Jsa107CisgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBibG9jay0+Y2hhbm5lbF9pbl9jcGxbY2hdID0gcy0+Y3BsX29uOworICAgIH0KKworICAgIC8qIGVuYWJsZSBjb3VwbGluZyBmb3IgZWFjaCBibG9jayBpZiBhdCBsZWFzdCAyIGNoYW5uZWxzIGhhdmUgY291cGxpbmcKKyAgICAgICBlbmFibGVkIGZvciB0aGF0IGJsb2NrICovCisgICAgZ290X2NwbF9zbnIgPSAwOworICAgIG51bV9jcGxfYmxvY2tzID0gMDsKKyAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgIEFDM0Jsb2NrICpibG9jayA9ICZzLT5ibG9ja3NbYmxrXTsKKyAgICAgICAgYmxvY2stPm51bV9jcGxfY2hhbm5lbHMgPSAwOworICAgICAgICBmb3IgKGNoID0gMTsgY2ggPD0gcy0+ZmJ3X2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgYmxvY2stPm51bV9jcGxfY2hhbm5lbHMgKz0gYmxvY2stPmNoYW5uZWxfaW5fY3BsW2NoXTsKKyAgICAgICAgYmxvY2stPmNwbF9pbl91c2UgPSBibG9jay0+bnVtX2NwbF9jaGFubmVscyA+IDE7CisgICAgICAgIG51bV9jcGxfYmxvY2tzICs9IGJsb2NrLT5jcGxfaW5fdXNlOworICAgICAgICBpZiAoIWJsb2NrLT5jcGxfaW5fdXNlKSB7CisgICAgICAgICAgICBibG9jay0+bnVtX2NwbF9jaGFubmVscyA9IDA7CisgICAgICAgICAgICBmb3IgKGNoID0gMTsgY2ggPD0gcy0+ZmJ3X2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgIGJsb2NrLT5jaGFubmVsX2luX2NwbFtjaF0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgYmxvY2stPm5ld19jcGxfc3RyYXRlZ3kgPSAhYmxrOworICAgICAgICBpZiAoYmxrKSB7CisgICAgICAgICAgICBmb3IgKGNoID0gMTsgY2ggPD0gcy0+ZmJ3X2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5jaGFubmVsX2luX2NwbFtjaF0gIT0gcy0+YmxvY2tzW2Jsay0xXS5jaGFubmVsX2luX2NwbFtjaF0pIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2stPm5ld19jcGxfc3RyYXRlZ3kgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYmxvY2stPm5ld19jcGxfbGVhayA9IGJsb2NrLT5uZXdfY3BsX3N0cmF0ZWd5OworCisgICAgICAgIGlmICghYmxrIHx8IChibG9jay0+Y3BsX2luX3VzZSAmJiAhZ290X2NwbF9zbnIpKSB7CisgICAgICAgICAgICBibG9jay0+bmV3X3Nucl9vZmZzZXRzID0gMTsKKyAgICAgICAgICAgIGlmIChibG9jay0+Y3BsX2luX3VzZSkKKyAgICAgICAgICAgICAgICBnb3RfY3BsX3NuciA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibG9jay0+bmV3X3Nucl9vZmZzZXRzID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW51bV9jcGxfYmxvY2tzKQorICAgICAgICBzLT5jcGxfb24gPSAwOworCisgICAgLyogc2V0IGJhbmR3aWR0aCBmb3IgZWFjaCBjaGFubmVsICovCisgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICBBQzNCbG9jayAqYmxvY2sgPSAmcy0+YmxvY2tzW2Jsa107CisgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGlmIChibG9jay0+Y2hhbm5lbF9pbl9jcGxbY2hdKQorICAgICAgICAgICAgICAgIGJsb2NrLT5lbmRfZnJlcVtjaF0gPSBzLT5zdGFydF9mcmVxW0NQTF9DSF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmxvY2stPmVuZF9mcmVxW2NoXSA9IHMtPmJhbmR3aWR0aF9jb2RlICogMyArIDczOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qKgorICogQXBwbHkgc3RlcmVvIHJlbWF0cml4aW5nIHRvIGNvZWZmaWNpZW50cyBiYXNlZCBvbiByZW1hdHJpeGluZyBmbGFncy4KKyAqCisgKiBAcGFyYW0gcyAgQUMtMyBlbmNvZGVyIHByaXZhdGUgY29udGV4dAorICovCit2b2lkIGZmX2FjM19hcHBseV9yZW1hdHJpeGluZyhBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBuYl9jb2VmczsKKyAgICBpbnQgYmxrLCBibmQsIGk7CisgICAgaW50IHN0YXJ0LCBlbmQ7CisgICAgdWludDhfdCAqZmxhZ3MgPSBOVUxMOworCisgICAgaWYgKCFzLT5yZW1hdHJpeGluZ19lbmFibGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgIEFDM0Jsb2NrICpibG9jayA9ICZzLT5ibG9ja3NbYmxrXTsKKyAgICAgICAgaWYgKGJsb2NrLT5uZXdfcmVtYXRyaXhpbmdfc3RyYXRlZ3kpCisgICAgICAgICAgICBmbGFncyA9IGJsb2NrLT5yZW1hdHJpeGluZ19mbGFnczsKKyAgICAgICAgbmJfY29lZnMgPSBGRk1JTihibG9jay0+ZW5kX2ZyZXFbMV0sIGJsb2NrLT5lbmRfZnJlcVsyXSk7CisgICAgICAgIGZvciAoYm5kID0gMDsgYm5kIDwgYmxvY2stPm51bV9yZW1hdHJpeGluZ19iYW5kczsgYm5kKyspIHsKKyAgICAgICAgICAgIGlmIChmbGFnc1tibmRdKSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBmZl9hYzNfcmVtYXRyaXhfYmFuZF90YWJbYm5kXTsKKyAgICAgICAgICAgICAgICBlbmQgICA9IEZGTUlOKG5iX2NvZWZzLCBmZl9hYzNfcmVtYXRyaXhfYmFuZF90YWJbYm5kKzFdKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbHQgPSBibG9jay0+Zml4ZWRfY29lZlsxXVtpXTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBydCA9IGJsb2NrLT5maXhlZF9jb2VmWzJdW2ldOworICAgICAgICAgICAgICAgICAgICBibG9jay0+Zml4ZWRfY29lZlsxXVtpXSA9IChsdCArIHJ0KSA+PiAxOworICAgICAgICAgICAgICAgICAgICBibG9jay0+Zml4ZWRfY29lZlsyXVtpXSA9IChsdCAtIHJ0KSA+PiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSBleHBvbmVudCB0YWJsZXMuCisgKi8KK3N0YXRpYyBhdl9jb2xkIHZvaWQgZXhwb25lbnRfaW5pdChBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBleHBzdHIsIGksIGdycHNpemU7CisKKyAgICBmb3IgKGV4cHN0ciA9IEVYUF9EMTUtMTsgZXhwc3RyIDw9IEVYUF9ENDUtMTsgZXhwc3RyKyspIHsKKyAgICAgICAgZ3Jwc2l6ZSA9IDMgPDwgZXhwc3RyOworICAgICAgICBmb3IgKGkgPSAxMjsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICBleHBvbmVudF9ncm91cF90YWJbMF1bZXhwc3RyXVtpXSA9IChpICsgZ3Jwc2l6ZSAtIDQpIC8gZ3Jwc2l6ZTsKKyAgICAgICAgICAgIGV4cG9uZW50X2dyb3VwX3RhYlsxXVtleHBzdHJdW2ldID0gKGkgICAgICAgICAgICAgICkgLyBncnBzaXplOworICAgICAgICB9CisgICAgfQorICAgIC8qIExGRSAqLworICAgIGV4cG9uZW50X2dyb3VwX3RhYlswXVswXVs3XSA9IDI7CisKKyAgICBpZiAoQ09ORklHX0VBQzNfRU5DT0RFUiAmJiBzLT5lYWMzKQorICAgICAgICBmZl9lYWMzX2V4cG9uZW50X2luaXQoKTsKK30KKworCisvKgorICogRXh0cmFjdCBleHBvbmVudHMgZnJvbSB0aGUgTURDVCBjb2VmZmljaWVudHMuCisgKi8KK3N0YXRpYyB2b2lkIGV4dHJhY3RfZXhwb25lbnRzKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGNoICAgICAgICA9ICFzLT5jcGxfb247CisgICAgaW50IGNoYW5fc2l6ZSA9IEFDM19NQVhfQ09FRlMgKiBzLT5udW1fYmxvY2tzICogKHMtPmNoYW5uZWxzIC0gY2ggKyAxKTsKKyAgICBBQzNCbG9jayAqYmxvY2sgPSAmcy0+YmxvY2tzWzBdOworCisgICAgcy0+YWMzZHNwLmV4dHJhY3RfZXhwb25lbnRzKGJsb2NrLT5leHBbY2hdLCBibG9jay0+Zml4ZWRfY29lZltjaF0sIGNoYW5fc2l6ZSk7Cit9CisKKworLyoqCisgKiBFeHBvbmVudCBEaWZmZXJlbmNlIFRocmVzaG9sZC4KKyAqIE5ldyBleHBvbmVudHMgYXJlIHNlbnQgaWYgdGhlaXIgU0FEIGV4Y2VlZCB0aGlzIG51bWJlci4KKyAqLworI2RlZmluZSBFWFBfRElGRl9USFJFU0hPTEQgNTAwCisKKy8qKgorICogVGFibGUgdXNlZCB0byBzZWxlY3QgZXhwb25lbnQgc3RyYXRlZ3kgYmFzZWQgb24gZXhwb25lbnQgcmV1c2UgYmxvY2sgaW50ZXJ2YWwuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGV4cF9zdHJhdGVneV9yZXVzZV90YWJbNF1bNl0gPSB7CisgICAgeyBFWFBfRDE1LCBFWFBfRDE1LCBFWFBfRDE1LCBFWFBfRDE1LCBFWFBfRDE1LCBFWFBfRDE1IH0sCisgICAgeyBFWFBfRDE1LCBFWFBfRDE1LCBFWFBfRDE1LCBFWFBfRDE1LCBFWFBfRDE1LCBFWFBfRDE1IH0sCisgICAgeyBFWFBfRDI1LCBFWFBfRDI1LCBFWFBfRDE1LCBFWFBfRDE1LCBFWFBfRDE1LCBFWFBfRDE1IH0sCisgICAgeyBFWFBfRDQ1LCBFWFBfRDI1LCBFWFBfRDI1LCBFWFBfRDE1LCBFWFBfRDE1LCBFWFBfRDE1IH0KK307CisKKy8qCisgKiBDYWxjdWxhdGUgZXhwb25lbnQgc3RyYXRlZ2llcyBmb3IgYWxsIGNoYW5uZWxzLgorICogQXJyYXkgYXJyYW5nZW1lbnQgaXMgcmV2ZXJzZWQgdG8gc2ltcGxpZnkgdGhlIHBlci1jaGFubmVsIGNhbGN1bGF0aW9uLgorICovCitzdGF0aWMgdm9pZCBjb21wdXRlX2V4cF9zdHJhdGVneShBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBjaCwgYmxrLCBibGsxOworCisgICAgZm9yIChjaCA9ICFzLT5jcGxfb247IGNoIDw9IHMtPmZid19jaGFubmVsczsgY2grKykgeworICAgICAgICB1aW50OF90ICpleHBfc3RyYXRlZ3kgPSBzLT5leHBfc3RyYXRlZ3lbY2hdOworICAgICAgICB1aW50OF90ICpleHAgICAgICAgICAgPSBzLT5ibG9ja3NbMF0uZXhwW2NoXTsKKyAgICAgICAgaW50IGV4cF9kaWZmOworCisgICAgICAgIC8qIGVzdGltYXRlIGlmIHRoZSBleHBvbmVudCB2YXJpYXRpb24gJiBkZWNpZGUgaWYgdGhleSBzaG91bGQgYmUKKyAgICAgICAgICAgcmV1c2VkIGluIHRoZSBuZXh0IGZyYW1lICovCisgICAgICAgIGV4cF9zdHJhdGVneVswXSA9IEVYUF9ORVc7CisgICAgICAgIGV4cCArPSBBQzNfTUFYX0NPRUZTOworICAgICAgICBmb3IgKGJsayA9IDE7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrLCBleHAgKz0gQUMzX01BWF9DT0VGUykgeworICAgICAgICAgICAgaWYgKGNoID09IENQTF9DSCkgeworICAgICAgICAgICAgICAgIGlmICghcy0+YmxvY2tzW2Jsay0xXS5jcGxfaW5fdXNlKSB7CisgICAgICAgICAgICAgICAgICAgIGV4cF9zdHJhdGVneVtibGtdID0gRVhQX05FVzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcy0+YmxvY2tzW2Jsa10uY3BsX2luX3VzZSkgeworICAgICAgICAgICAgICAgICAgICBleHBfc3RyYXRlZ3lbYmxrXSA9IEVYUF9SRVVTRTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5ibG9ja3NbYmxrXS5jaGFubmVsX2luX2NwbFtjaF0gIT0gcy0+YmxvY2tzW2Jsay0xXS5jaGFubmVsX2luX2NwbFtjaF0pIHsKKyAgICAgICAgICAgICAgICBleHBfc3RyYXRlZ3lbYmxrXSA9IEVYUF9ORVc7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHBfZGlmZiA9IHMtPm1lY2Muc2FkWzBdKE5VTEwsIGV4cCwgZXhwIC0gQUMzX01BWF9DT0VGUywgMTYsIDE2KTsKKyAgICAgICAgICAgIGV4cF9zdHJhdGVneVtibGtdID0gRVhQX1JFVVNFOworICAgICAgICAgICAgaWYgKGNoID09IENQTF9DSCAmJiBleHBfZGlmZiA+IChFWFBfRElGRl9USFJFU0hPTEQgKiAocy0+YmxvY2tzW2Jsa10uZW5kX2ZyZXFbY2hdIC0gcy0+c3RhcnRfZnJlcVtjaF0pIC8gQUMzX01BWF9DT0VGUykpCisgICAgICAgICAgICAgICAgZXhwX3N0cmF0ZWd5W2Jsa10gPSBFWFBfTkVXOworICAgICAgICAgICAgZWxzZSBpZiAoY2ggPiBDUExfQ0ggJiYgZXhwX2RpZmYgPiBFWFBfRElGRl9USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgZXhwX3N0cmF0ZWd5W2Jsa10gPSBFWFBfTkVXOworICAgICAgICB9CisKKyAgICAgICAgLyogbm93IHNlbGVjdCB0aGUgZW5jb2Rpbmcgc3RyYXRlZ3kgdHlwZSA6IGlmIGV4cG9uZW50cyBhcmUgb2Z0ZW4KKyAgICAgICAgICAgcmVjb2RlZCwgd2UgdXNlIGEgY29hcnNlIGVuY29kaW5nICovCisgICAgICAgIGJsayA9IDA7CisgICAgICAgIHdoaWxlIChibGsgPCBzLT5udW1fYmxvY2tzKSB7CisgICAgICAgICAgICBibGsxID0gYmxrICsgMTsKKyAgICAgICAgICAgIHdoaWxlIChibGsxIDwgcy0+bnVtX2Jsb2NrcyAmJiBleHBfc3RyYXRlZ3lbYmxrMV0gPT0gRVhQX1JFVVNFKQorICAgICAgICAgICAgICAgIGJsazErKzsKKyAgICAgICAgICAgIGV4cF9zdHJhdGVneVtibGtdID0gZXhwX3N0cmF0ZWd5X3JldXNlX3RhYltzLT5udW1fYmxrc19jb2RlXVtibGsxLWJsay0xXTsKKyAgICAgICAgICAgIGJsayA9IGJsazE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPmxmZV9vbikgeworICAgICAgICBjaCA9IHMtPmxmZV9jaGFubmVsOworICAgICAgICBzLT5leHBfc3RyYXRlZ3lbY2hdWzBdID0gRVhQX0QxNTsKKyAgICAgICAgZm9yIChibGsgPSAxOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykKKyAgICAgICAgICAgIHMtPmV4cF9zdHJhdGVneVtjaF1bYmxrXSA9IEVYUF9SRVVTRTsKKyAgICB9CisKKyAgICAvKiBmb3IgRS1BQy0zLCBkZXRlcm1pbmUgZnJhbWUgZXhwb25lbnQgc3RyYXRlZ3kgKi8KKyAgICBpZiAoQ09ORklHX0VBQzNfRU5DT0RFUiAmJiBzLT5lYWMzKQorICAgICAgICBmZl9lYWMzX2dldF9mcmFtZV9leHBfc3RyYXRlZ3kocyk7Cit9CisKKworLyoqCisgKiBVcGRhdGUgdGhlIGV4cG9uZW50cyBzbyB0aGF0IHRoZXkgYXJlIHRoZSBvbmVzIHRoZSBkZWNvZGVyIHdpbGwgZGVjb2RlLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIGV4cCAgIGFycmF5IG9mIGV4cG9uZW50cyBmb3IgMSBibG9jayBpbiAxIGNoYW5uZWwKKyAqIEBwYXJhbSBuYl9leHBzICAgICAgIG51bWJlciBvZiBleHBvbmVudHMgaW4gYWN0aXZlIGJhbmR3aWR0aAorICogQHBhcmFtIGV4cF9zdHJhdGVneSAgZXhwb25lbnQgc3RyYXRlZ3kgZm9yIHRoZSBibG9jaworICogQHBhcmFtIGNwbCAgICAgICAgICAgaW5kaWNhdGVzIGlmIHRoZSBibG9jayBpcyBpbiB0aGUgY291cGxpbmcgY2hhbm5lbAorICovCitzdGF0aWMgdm9pZCBlbmNvZGVfZXhwb25lbnRzX2Jsa19jaCh1aW50OF90ICpleHAsIGludCBuYl9leHBzLCBpbnQgZXhwX3N0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNwbCkKK3sKKyAgICBpbnQgbmJfZ3JvdXBzLCBpLCBrOworCisgICAgbmJfZ3JvdXBzID0gZXhwb25lbnRfZ3JvdXBfdGFiW2NwbF1bZXhwX3N0cmF0ZWd5LTFdW25iX2V4cHNdICogMzsKKworICAgIC8qIGZvciBlYWNoIGdyb3VwLCBjb21wdXRlIHRoZSBtaW5pbXVtIGV4cG9uZW50ICovCisgICAgc3dpdGNoKGV4cF9zdHJhdGVneSkgeworICAgIGNhc2UgRVhQX0QyNToKKyAgICAgICAgZm9yIChpID0gMSwgayA9IDEtY3BsOyBpIDw9IG5iX2dyb3VwczsgaSsrKSB7CisgICAgICAgICAgICB1aW50OF90IGV4cF9taW4gPSBleHBba107CisgICAgICAgICAgICBpZiAoZXhwW2srMV0gPCBleHBfbWluKQorICAgICAgICAgICAgICAgIGV4cF9taW4gPSBleHBbaysxXTsKKyAgICAgICAgICAgIGV4cFtpLWNwbF0gPSBleHBfbWluOworICAgICAgICAgICAgayArPSAyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVhQX0Q0NToKKyAgICAgICAgZm9yIChpID0gMSwgayA9IDEtY3BsOyBpIDw9IG5iX2dyb3VwczsgaSsrKSB7CisgICAgICAgICAgICB1aW50OF90IGV4cF9taW4gPSBleHBba107CisgICAgICAgICAgICBpZiAoZXhwW2srMV0gPCBleHBfbWluKQorICAgICAgICAgICAgICAgIGV4cF9taW4gPSBleHBbaysxXTsKKyAgICAgICAgICAgIGlmIChleHBbaysyXSA8IGV4cF9taW4pCisgICAgICAgICAgICAgICAgZXhwX21pbiA9IGV4cFtrKzJdOworICAgICAgICAgICAgaWYgKGV4cFtrKzNdIDwgZXhwX21pbikKKyAgICAgICAgICAgICAgICBleHBfbWluID0gZXhwW2srM107CisgICAgICAgICAgICBleHBbaS1jcGxdID0gZXhwX21pbjsKKyAgICAgICAgICAgIGsgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBjb25zdHJhaW50IGZvciBEQyBleHBvbmVudCAqLworICAgIGlmICghY3BsICYmIGV4cFswXSA+IDE1KQorICAgICAgICBleHBbMF0gPSAxNTsKKworICAgIC8qIGRlY3JlYXNlIHRoZSBkZWx0YSBiZXR3ZWVuIGVhY2ggZ3JvdXBzIHRvIHdpdGhpbiAyIHNvIHRoYXQgdGhleSBjYW4gYmUKKyAgICAgICBkaWZmZXJlbnRpYWxseSBlbmNvZGVkICovCisgICAgZm9yIChpID0gMTsgaSA8PSBuYl9ncm91cHM7IGkrKykKKyAgICAgICAgZXhwW2ldID0gRkZNSU4oZXhwW2ldLCBleHBbaS0xXSArIDIpOworICAgIGktLTsKKyAgICB3aGlsZSAoLS1pID49IDApCisgICAgICAgIGV4cFtpXSA9IEZGTUlOKGV4cFtpXSwgZXhwW2krMV0gKyAyKTsKKworICAgIGlmIChjcGwpCisgICAgICAgIGV4cFstMV0gPSBleHBbMF0gJiB+MTsKKworICAgIC8qIG5vdyB3ZSBoYXZlIHRoZSBleHBvbmVudCB2YWx1ZXMgdGhlIGRlY29kZXIgd2lsbCBzZWUgKi8KKyAgICBzd2l0Y2ggKGV4cF9zdHJhdGVneSkgeworICAgIGNhc2UgRVhQX0QyNToKKyAgICAgICAgZm9yIChpID0gbmJfZ3JvdXBzLCBrID0gKG5iX2dyb3VwcyAqIDIpLWNwbDsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgdWludDhfdCBleHAxID0gZXhwW2ktY3BsXTsKKyAgICAgICAgICAgIGV4cFtrLS1dID0gZXhwMTsKKyAgICAgICAgICAgIGV4cFtrLS1dID0gZXhwMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYUF9ENDU6CisgICAgICAgIGZvciAoaSA9IG5iX2dyb3VwcywgayA9IChuYl9ncm91cHMgKiA0KS1jcGw7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgICAgIGV4cFtrXSA9IGV4cFtrLTFdID0gZXhwW2stMl0gPSBleHBbay0zXSA9IGV4cFtpLWNwbF07CisgICAgICAgICAgICBrIC09IDQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKy8qCisgKiBFbmNvZGUgZXhwb25lbnRzIGZyb20gb3JpZ2luYWwgZXh0cmFjdGVkIGZvcm0gdG8gd2hhdCB0aGUgZGVjb2RlciB3aWxsIHNlZS4KKyAqIFRoaXMgY29waWVzIGFuZCBncm91cHMgZXhwb25lbnRzIGJhc2VkIG9uIGV4cG9uZW50IHN0cmF0ZWd5IGFuZCByZWR1Y2VzCisgKiBkZWx0YXMgYmV0d2VlbiBhZGphY2VudCBleHBvbmVudCBncm91cHMgc28gdGhhdCB0aGV5IGNhbiBiZSBkaWZmZXJlbnRpYWxseQorICogZW5jb2RlZC4KKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2V4cG9uZW50cyhBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBibGssIGJsazEsIGNoLCBjcGw7CisgICAgdWludDhfdCAqZXhwLCAqZXhwX3N0cmF0ZWd5OworICAgIGludCBuYl9jb2VmcywgbnVtX3JldXNlX2Jsb2NrczsKKworICAgIGZvciAoY2ggPSAhcy0+Y3BsX29uOyBjaCA8PSBzLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBleHAgICAgICAgICAgPSBzLT5ibG9ja3NbMF0uZXhwW2NoXSArIHMtPnN0YXJ0X2ZyZXFbY2hdOworICAgICAgICBleHBfc3RyYXRlZ3kgPSBzLT5leHBfc3RyYXRlZ3lbY2hdOworCisgICAgICAgIGNwbCA9IChjaCA9PSBDUExfQ0gpOworICAgICAgICBibGsgPSAwOworICAgICAgICB3aGlsZSAoYmxrIDwgcy0+bnVtX2Jsb2NrcykgeworICAgICAgICAgICAgQUMzQmxvY2sgKmJsb2NrID0gJnMtPmJsb2Nrc1tibGtdOworICAgICAgICAgICAgaWYgKGNwbCAmJiAhYmxvY2stPmNwbF9pbl91c2UpIHsKKyAgICAgICAgICAgICAgICBleHAgKz0gQUMzX01BWF9DT0VGUzsKKyAgICAgICAgICAgICAgICBibGsrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5iX2NvZWZzID0gYmxvY2stPmVuZF9mcmVxW2NoXSAtIHMtPnN0YXJ0X2ZyZXFbY2hdOworICAgICAgICAgICAgYmxrMSA9IGJsayArIDE7CisKKyAgICAgICAgICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2YgRVhQX1JFVVNFIGJsb2NrcyBhZnRlciB0aGUgY3VycmVudCBibG9jaworICAgICAgICAgICAgICAgYW5kIHNldCBleHBvbmVudCByZWZlcmVuY2UgYmxvY2sgbnVtYmVycyAqLworICAgICAgICAgICAgcy0+ZXhwX3JlZl9ibG9ja1tjaF1bYmxrXSA9IGJsazsKKyAgICAgICAgICAgIHdoaWxlIChibGsxIDwgcy0+bnVtX2Jsb2NrcyAmJiBleHBfc3RyYXRlZ3lbYmxrMV0gPT0gRVhQX1JFVVNFKSB7CisgICAgICAgICAgICAgICAgcy0+ZXhwX3JlZl9ibG9ja1tjaF1bYmxrMV0gPSBibGs7CisgICAgICAgICAgICAgICAgYmxrMSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtX3JldXNlX2Jsb2NrcyA9IGJsazEgLSBibGsgLSAxOworCisgICAgICAgICAgICAvKiBmb3IgdGhlIEVYUF9SRVVTRSBjYXNlIHdlIHNlbGVjdCB0aGUgbWluIG9mIHRoZSBleHBvbmVudHMgKi8KKyAgICAgICAgICAgIHMtPmFjM2RzcC5hYzNfZXhwb25lbnRfbWluKGV4cC1zLT5zdGFydF9mcmVxW2NoXSwgbnVtX3JldXNlX2Jsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDM19NQVhfQ09FRlMpOworCisgICAgICAgICAgICBlbmNvZGVfZXhwb25lbnRzX2Jsa19jaChleHAsIG5iX2NvZWZzLCBleHBfc3RyYXRlZ3lbYmxrXSwgY3BsKTsKKworICAgICAgICAgICAgZXhwICs9IEFDM19NQVhfQ09FRlMgKiAobnVtX3JldXNlX2Jsb2NrcyArIDEpOworICAgICAgICAgICAgYmxrID0gYmxrMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlZmVyZW5jZSBibG9jayBudW1iZXJzIGhhdmUgYmVlbiBjaGFuZ2VkLCBzbyByZXNldCByZWZfYmFwX3NldCAqLworICAgIHMtPnJlZl9iYXBfc2V0ID0gMDsKK30KKworCisvKgorICogQ291bnQgZXhwb25lbnQgYml0cyBiYXNlZCBvbiBiYW5kd2lkdGgsIGNvdXBsaW5nLCBhbmQgZXhwb25lbnQgc3RyYXRlZ2llcy4KKyAqLworc3RhdGljIGludCBjb3VudF9leHBvbmVudF9iaXRzKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGJsaywgY2g7CisgICAgaW50IG5iX2dyb3VwcywgYml0X2NvdW50OworCisgICAgYml0X2NvdW50ID0gMDsKKyAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgIEFDM0Jsb2NrICpibG9jayA9ICZzLT5ibG9ja3NbYmxrXTsKKyAgICAgICAgZm9yIChjaCA9ICFibG9jay0+Y3BsX2luX3VzZTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGludCBleHBfc3RyYXRlZ3kgPSBzLT5leHBfc3RyYXRlZ3lbY2hdW2Jsa107CisgICAgICAgICAgICBpbnQgY3BsICAgICAgICAgID0gKGNoID09IENQTF9DSCk7CisgICAgICAgICAgICBpbnQgbmJfY29lZnMgICAgID0gYmxvY2stPmVuZF9mcmVxW2NoXSAtIHMtPnN0YXJ0X2ZyZXFbY2hdOworCisgICAgICAgICAgICBpZiAoZXhwX3N0cmF0ZWd5ID09IEVYUF9SRVVTRSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbmJfZ3JvdXBzID0gZXhwb25lbnRfZ3JvdXBfdGFiW2NwbF1bZXhwX3N0cmF0ZWd5LTFdW25iX2NvZWZzXTsKKyAgICAgICAgICAgIGJpdF9jb3VudCArPSA0ICsgKG5iX2dyb3VwcyAqIDcpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJpdF9jb3VudDsKK30KKworCisvKioKKyAqIEdyb3VwIGV4cG9uZW50cy4KKyAqIDMgZGVsdGEtZW5jb2RlZCBleHBvbmVudHMgYXJlIGluIGVhY2ggNy1iaXQgZ3JvdXAuIFRoZSBudW1iZXIgb2YgZ3JvdXBzCisgKiB2YXJpZXMgZGVwZW5kaW5nIG9uIGV4cG9uZW50IHN0cmF0ZWd5IGFuZCBiYW5kd2lkdGguCisgKgorICogQHBhcmFtIHMgIEFDLTMgZW5jb2RlciBwcml2YXRlIGNvbnRleHQKKyAqLwordm9pZCBmZl9hYzNfZ3JvdXBfZXhwb25lbnRzKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGJsaywgY2gsIGksIGNwbDsKKyAgICBpbnQgZ3JvdXBfc2l6ZSwgbmJfZ3JvdXBzOworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IGRlbHRhMCwgZGVsdGExLCBkZWx0YTI7CisgICAgaW50IGV4cDAsIGV4cDE7CisKKyAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgIEFDM0Jsb2NrICpibG9jayA9ICZzLT5ibG9ja3NbYmxrXTsKKyAgICAgICAgZm9yIChjaCA9ICFibG9jay0+Y3BsX2luX3VzZTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGludCBleHBfc3RyYXRlZ3kgPSBzLT5leHBfc3RyYXRlZ3lbY2hdW2Jsa107CisgICAgICAgICAgICBpZiAoZXhwX3N0cmF0ZWd5ID09IEVYUF9SRVVTRSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNwbCA9IChjaCA9PSBDUExfQ0gpOworICAgICAgICAgICAgZ3JvdXBfc2l6ZSA9IGV4cF9zdHJhdGVneSArIChleHBfc3RyYXRlZ3kgPT0gRVhQX0Q0NSk7CisgICAgICAgICAgICBuYl9ncm91cHMgPSBleHBvbmVudF9ncm91cF90YWJbY3BsXVtleHBfc3RyYXRlZ3ktMV1bYmxvY2stPmVuZF9mcmVxW2NoXS1zLT5zdGFydF9mcmVxW2NoXV07CisgICAgICAgICAgICBwID0gYmxvY2stPmV4cFtjaF0gKyBzLT5zdGFydF9mcmVxW2NoXSAtIGNwbDsKKworICAgICAgICAgICAgLyogREMgZXhwb25lbnQgKi8KKyAgICAgICAgICAgIGV4cDEgPSAqcCsrOworICAgICAgICAgICAgYmxvY2stPmdyb3VwZWRfZXhwW2NoXVswXSA9IGV4cDE7CisKKyAgICAgICAgICAgIC8qIHJlbWFpbmluZyBleHBvbmVudHMgYXJlIGRlbHRhIGVuY29kZWQgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbmJfZ3JvdXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvKiBtZXJnZSB0aHJlZSBkZWx0YSBpbiBvbmUgY29kZSAqLworICAgICAgICAgICAgICAgIGV4cDAgICA9IGV4cDE7CisgICAgICAgICAgICAgICAgZXhwMSAgID0gcFswXTsKKyAgICAgICAgICAgICAgICBwICAgICArPSBncm91cF9zaXplOworICAgICAgICAgICAgICAgIGRlbHRhMCA9IGV4cDEgLSBleHAwICsgMjsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKGRlbHRhMCA+PSAwICYmIGRlbHRhMCA8PSA0KTsKKworICAgICAgICAgICAgICAgIGV4cDAgICA9IGV4cDE7CisgICAgICAgICAgICAgICAgZXhwMSAgID0gcFswXTsKKyAgICAgICAgICAgICAgICBwICAgICArPSBncm91cF9zaXplOworICAgICAgICAgICAgICAgIGRlbHRhMSA9IGV4cDEgLSBleHAwICsgMjsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKGRlbHRhMSA+PSAwICYmIGRlbHRhMSA8PSA0KTsKKworICAgICAgICAgICAgICAgIGV4cDAgICA9IGV4cDE7CisgICAgICAgICAgICAgICAgZXhwMSAgID0gcFswXTsKKyAgICAgICAgICAgICAgICBwICAgICArPSBncm91cF9zaXplOworICAgICAgICAgICAgICAgIGRlbHRhMiA9IGV4cDEgLSBleHAwICsgMjsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKGRlbHRhMiA+PSAwICYmIGRlbHRhMiA8PSA0KTsKKworICAgICAgICAgICAgICAgIGJsb2NrLT5ncm91cGVkX2V4cFtjaF1baV0gPSAoKGRlbHRhMCAqIDUgKyBkZWx0YTEpICogNSkgKyBkZWx0YTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoqCisgKiBDYWxjdWxhdGUgZmluYWwgZXhwb25lbnRzIGZyb20gdGhlIHN1cHBsaWVkIE1EQ1QgY29lZmZpY2llbnRzIGFuZCBleHBvbmVudCBzaGlmdC4KKyAqIEV4dHJhY3QgZXhwb25lbnRzIGZyb20gTURDVCBjb2VmZmljaWVudHMsIGNhbGN1bGF0ZSBleHBvbmVudCBzdHJhdGVnaWVzLAorICogYW5kIGVuY29kZSBmaW5hbCBleHBvbmVudHMuCisgKgorICogQHBhcmFtIHMgIEFDLTMgZW5jb2RlciBwcml2YXRlIGNvbnRleHQKKyAqLwordm9pZCBmZl9hYzNfcHJvY2Vzc19leHBvbmVudHMoQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBleHRyYWN0X2V4cG9uZW50cyhzKTsKKworICAgIGNvbXB1dGVfZXhwX3N0cmF0ZWd5KHMpOworCisgICAgZW5jb2RlX2V4cG9uZW50cyhzKTsKKworICAgIGVtbXNfYygpOworfQorCisKKy8qCisgKiBDb3VudCBmcmFtZSBiaXRzIHRoYXQgYXJlIGJhc2VkIHNvbGVseSBvbiBmaXhlZCBwYXJhbWV0ZXJzLgorICogVGhpcyBvbmx5IGhhcyB0byBiZSBydW4gb25jZSB3aGVuIHRoZSBlbmNvZGVyIGlzIGluaXRpYWxpemVkLgorICovCitzdGF0aWMgdm9pZCBjb3VudF9mcmFtZV9iaXRzX2ZpeGVkKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgc3RhdGljIGNvbnN0IGludCBmcmFtZV9iaXRzX2luY1s4XSA9IHsgMCwgMCwgMiwgMiwgMiwgNCwgMiwgNCB9OworICAgIGludCBibGs7CisgICAgaW50IGZyYW1lX2JpdHM7CisKKyAgICAvKiBhc3N1bXB0aW9uczoKKyAgICAgKiAgIG5vIGR5bmFtaWMgcmFuZ2UgY29kZXMKKyAgICAgKiAgIGJpdCBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZG8gbm90IGNoYW5nZSBiZXR3ZWVuIGJsb2NrcworICAgICAqICAgbm8gZGVsdGEgYml0IGFsbG9jYXRpb24KKyAgICAgKiAgIG5vIHNraXBwZWQgZGF0YQorICAgICAqICAgbm8gYXV4aWxpYXJ5IGRhdGEKKyAgICAgKiAgIG5vIEUtQUMtMyBtZXRhZGF0YQorICAgICAqLworCisgICAgLyogaGVhZGVyICovCisgICAgZnJhbWVfYml0cyA9IDE2OyAvKiBzeW5jIGluZm8gKi8KKyAgICBpZiAocy0+ZWFjMykgeworICAgICAgICAvKiBiaXRzdHJlYW0gaW5mbyBoZWFkZXIgKi8KKyAgICAgICAgZnJhbWVfYml0cyArPSAzNTsKKyAgICAgICAgZnJhbWVfYml0cyArPSAxICsgMTsKKyAgICAgICAgaWYgKHMtPm51bV9ibG9ja3MgIT0gMHg2KQorICAgICAgICAgICAgZnJhbWVfYml0cysrOworICAgICAgICBmcmFtZV9iaXRzKys7CisgICAgICAgIC8qIGF1ZGlvIGZyYW1lIGhlYWRlciAqLworICAgICAgICBpZiAocy0+bnVtX2Jsb2NrcyA9PSA2KQorICAgICAgICAgICAgZnJhbWVfYml0cyArPSAyOworICAgICAgICBmcmFtZV9iaXRzICs9IDEwOworICAgICAgICAvKiBleHBvbmVudCBzdHJhdGVneSAqLworICAgICAgICBpZiAocy0+dXNlX2ZyYW1lX2V4cF9zdHJhdGVneSkKKyAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gNSAqIHMtPmZid19jaGFubmVsczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnJhbWVfYml0cyArPSBzLT5udW1fYmxvY2tzICogMiAqIHMtPmZid19jaGFubmVsczsKKyAgICAgICAgaWYgKHMtPmxmZV9vbikKKyAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gcy0+bnVtX2Jsb2NrczsKKyAgICAgICAgLyogY29udmVydGVyIGV4cG9uZW50IHN0cmF0ZWd5ICovCisgICAgICAgIGlmIChzLT5udW1fYmxrc19jb2RlICE9IDB4MykKKyAgICAgICAgICAgIGZyYW1lX2JpdHMrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnJhbWVfYml0cyArPSBzLT5mYndfY2hhbm5lbHMgKiA1OworICAgICAgICAvKiBzbnIgb2Zmc2V0cyAqLworICAgICAgICBmcmFtZV9iaXRzICs9IDEwOworICAgICAgICAvKiBibG9jayBzdGFydCBpbmZvICovCisgICAgICAgIGlmIChzLT5udW1fYmxvY2tzICE9IDEpCisgICAgICAgICAgICBmcmFtZV9iaXRzKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhbWVfYml0cyArPSA0OTsKKyAgICAgICAgZnJhbWVfYml0cyArPSBmcmFtZV9iaXRzX2luY1tzLT5jaGFubmVsX21vZGVdOworICAgIH0KKworICAgIC8qIGF1ZGlvIGJsb2NrcyAqLworICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspIHsKKyAgICAgICAgaWYgKCFzLT5lYWMzKSB7CisgICAgICAgICAgICAvKiBibG9jayBzd2l0Y2ggZmxhZ3MgKi8KKyAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gcy0+ZmJ3X2NoYW5uZWxzOworCisgICAgICAgICAgICAvKiBkaXRoZXIgZmxhZ3MgKi8KKyAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gcy0+ZmJ3X2NoYW5uZWxzOworICAgICAgICB9CisKKyAgICAgICAgLyogZHluYW1pYyByYW5nZSAqLworICAgICAgICBmcmFtZV9iaXRzKys7CisKKyAgICAgICAgLyogc3BlY3RyYWwgZXh0ZW5zaW9uICovCisgICAgICAgIGlmIChzLT5lYWMzKQorICAgICAgICAgICAgZnJhbWVfYml0cysrOworCisgICAgICAgIGlmICghcy0+ZWFjMykgeworICAgICAgICAgICAgLyogZXhwb25lbnQgc3RyYXRlZ3kgKi8KKyAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gMiAqIHMtPmZid19jaGFubmVsczsKKyAgICAgICAgICAgIGlmIChzLT5sZmVfb24pCisgICAgICAgICAgICAgICAgZnJhbWVfYml0cysrOworCisgICAgICAgICAgICAvKiBiaXQgYWxsb2NhdGlvbiBwYXJhbXMgKi8KKyAgICAgICAgICAgIGZyYW1lX2JpdHMrKzsKKyAgICAgICAgICAgIGlmICghYmxrKQorICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gMiArIDIgKyAyICsgMiArIDM7CisgICAgICAgIH0KKworICAgICAgICAvKiBjb252ZXJ0ZXIgc25yIG9mZnNldCAqLworICAgICAgICBpZiAocy0+ZWFjMykKKyAgICAgICAgICAgIGZyYW1lX2JpdHMrKzsKKworICAgICAgICBpZiAoIXMtPmVhYzMpIHsKKyAgICAgICAgICAgIC8qIGRlbHRhIGJpdCBhbGxvY2F0aW9uICovCisgICAgICAgICAgICBmcmFtZV9iaXRzKys7CisKKyAgICAgICAgICAgIC8qIHNraXBwZWQgZGF0YSAqLworICAgICAgICAgICAgZnJhbWVfYml0cysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogYXV4aWxpYXJ5IGRhdGEgKi8KKyAgICBmcmFtZV9iaXRzKys7CisKKyAgICAvKiBDUkMgKi8KKyAgICBmcmFtZV9iaXRzICs9IDEgKyAxNjsKKworICAgIHMtPmZyYW1lX2JpdHNfZml4ZWQgPSBmcmFtZV9iaXRzOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIGJpdCBhbGxvY2F0aW9uLgorICogU2V0IGRlZmF1bHQgcGFyYW1ldGVyIGNvZGVzIGFuZCBjYWxjdWxhdGUgcGFyYW1ldGVyIHZhbHVlcy4KKyAqLworc3RhdGljIGF2X2NvbGQgdm9pZCBiaXRfYWxsb2NfaW5pdChBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBjaDsKKworICAgIC8qIGluaXQgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisgICAgcy0+c2xvd19kZWNheV9jb2RlID0gMjsKKyAgICBzLT5mYXN0X2RlY2F5X2NvZGUgPSAxOworICAgIHMtPnNsb3dfZ2Fpbl9jb2RlICA9IDE7CisgICAgcy0+ZGJfcGVyX2JpdF9jb2RlID0gcy0+ZWFjMyA/IDIgOiAzOworICAgIHMtPmZsb29yX2NvZGUgICAgICA9IDc7CisgICAgZm9yIChjaCA9IDA7IGNoIDw9IHMtPmNoYW5uZWxzOyBjaCsrKQorICAgICAgICBzLT5mYXN0X2dhaW5fY29kZVtjaF0gPSA0OworCisgICAgLyogaW5pdGlhbCBzbnIgb2Zmc2V0ICovCisgICAgcy0+Y29hcnNlX3Nucl9vZmZzZXQgPSA0MDsKKworICAgIC8qIGNvbXB1dGUgcmVhbCB2YWx1ZXMgKi8KKyAgICAvKiBjdXJyZW50bHkgbm9uZSBvZiB0aGVzZSB2YWx1ZXMgY2hhbmdlIGR1cmluZyBlbmNvZGluZywgc28gd2UgY2FuIGp1c3QKKyAgICAgICBzZXQgdGhlbSBvbmNlIGF0IGluaXRpYWxpemF0aW9uICovCisgICAgcy0+Yml0X2FsbG9jLnNsb3dfZGVjYXkgPSBmZl9hYzNfc2xvd19kZWNheV90YWJbcy0+c2xvd19kZWNheV9jb2RlXSA+PiBzLT5iaXRfYWxsb2Muc3Jfc2hpZnQ7CisgICAgcy0+Yml0X2FsbG9jLmZhc3RfZGVjYXkgPSBmZl9hYzNfZmFzdF9kZWNheV90YWJbcy0+ZmFzdF9kZWNheV9jb2RlXSA+PiBzLT5iaXRfYWxsb2Muc3Jfc2hpZnQ7CisgICAgcy0+Yml0X2FsbG9jLnNsb3dfZ2FpbiAgPSBmZl9hYzNfc2xvd19nYWluX3RhYltzLT5zbG93X2dhaW5fY29kZV07CisgICAgcy0+Yml0X2FsbG9jLmRiX3Blcl9iaXQgPSBmZl9hYzNfZGJfcGVyX2JpdF90YWJbcy0+ZGJfcGVyX2JpdF9jb2RlXTsKKyAgICBzLT5iaXRfYWxsb2MuZmxvb3IgICAgICA9IGZmX2FjM19mbG9vcl90YWJbcy0+Zmxvb3JfY29kZV07CisgICAgcy0+Yml0X2FsbG9jLmNwbF9mYXN0X2xlYWsgPSAwOworICAgIHMtPmJpdF9hbGxvYy5jcGxfc2xvd19sZWFrID0gMDsKKworICAgIGNvdW50X2ZyYW1lX2JpdHNfZml4ZWQocyk7Cit9CisKKworLyoKKyAqIENvdW50IHRoZSBiaXRzIHVzZWQgdG8gZW5jb2RlIHRoZSBmcmFtZSwgbWludXMgZXhwb25lbnRzIGFuZCBtYW50aXNzYXMuCisgKiBCaXRzIGJhc2VkIG9uIGZpeGVkIHBhcmFtZXRlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gY291bnRlZCwgc28gbm93IHdlIGp1c3QKKyAqIGhhdmUgdG8gYWRkIHRoZSBiaXRzIGJhc2VkIG9uIHBhcmFtZXRlcnMgdGhhdCBjaGFuZ2UgZHVyaW5nIGVuY29kaW5nLgorICovCitzdGF0aWMgdm9pZCBjb3VudF9mcmFtZV9iaXRzKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgQUMzRW5jT3B0aW9ucyAqb3B0ID0gJnMtPm9wdGlvbnM7CisgICAgaW50IGJsaywgY2g7CisgICAgaW50IGZyYW1lX2JpdHMgPSAwOworCisgICAgLyogaGVhZGVyICovCisgICAgaWYgKHMtPmVhYzMpIHsKKyAgICAgICAgaWYgKG9wdC0+ZWFjM19taXhpbmdfbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX21vZGUgPiBBQzNfQ0hNT0RFX1NURVJFTykKKyAgICAgICAgICAgICAgICBmcmFtZV9iaXRzICs9IDI7CisgICAgICAgICAgICBpZiAocy0+aGFzX2NlbnRlcikKKyAgICAgICAgICAgICAgICBmcmFtZV9iaXRzICs9IDY7CisgICAgICAgICAgICBpZiAocy0+aGFzX3N1cnJvdW5kKQorICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gNjsKKyAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gcy0+bGZlX29uOworICAgICAgICAgICAgZnJhbWVfYml0cyArPSAxICsgMSArIDI7CisgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlIDwgQUMzX0NITU9ERV9TVEVSRU8pCisgICAgICAgICAgICAgICAgZnJhbWVfYml0cysrOworICAgICAgICAgICAgZnJhbWVfYml0cysrOworICAgICAgICB9CisgICAgICAgIGlmIChvcHQtPmVhYzNfaW5mb19tZXRhZGF0YSkgeworICAgICAgICAgICAgZnJhbWVfYml0cyArPSAzICsgMSArIDE7CisgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID09IEFDM19DSE1PREVfU1RFUkVPKQorICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gMiArIDI7CisgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID49IEFDM19DSE1PREVfMkYyUikKKyAgICAgICAgICAgICAgICBmcmFtZV9iaXRzICs9IDI7CisgICAgICAgICAgICBmcmFtZV9iaXRzKys7CisgICAgICAgICAgICBpZiAob3B0LT5hdWRpb19wcm9kdWN0aW9uX2luZm8pCisgICAgICAgICAgICAgICAgZnJhbWVfYml0cyArPSA1ICsgMiArIDE7CisgICAgICAgICAgICBmcmFtZV9iaXRzKys7CisgICAgICAgIH0KKyAgICAgICAgLyogY291cGxpbmcgKi8KKyAgICAgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA+IEFDM19DSE1PREVfTU9OTykgeworICAgICAgICAgICAgZnJhbWVfYml0cysrOworICAgICAgICAgICAgZm9yIChibGsgPSAxOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICAgICAgICAgIEFDM0Jsb2NrICpibG9jayA9ICZzLT5ibG9ja3NbYmxrXTsKKyAgICAgICAgICAgICAgICBmcmFtZV9iaXRzKys7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5uZXdfY3BsX3N0cmF0ZWd5KQorICAgICAgICAgICAgICAgICAgICBmcmFtZV9iaXRzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogY291cGxpbmcgZXhwb25lbnQgc3RyYXRlZ3kgKi8KKyAgICAgICAgaWYgKHMtPmNwbF9vbikgeworICAgICAgICAgICAgaWYgKHMtPnVzZV9mcmFtZV9leHBfc3RyYXRlZ3kpIHsKKyAgICAgICAgICAgICAgICBmcmFtZV9iaXRzICs9IDUgKiBzLT5jcGxfb247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspCisgICAgICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gMiAqIHMtPmJsb2Nrc1tibGtdLmNwbF9pbl91c2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAob3B0LT5hdWRpb19wcm9kdWN0aW9uX2luZm8pCisgICAgICAgICAgICBmcmFtZV9iaXRzICs9IDc7CisgICAgICAgIGlmIChzLT5iaXRzdHJlYW1faWQgPT0gNikgeworICAgICAgICAgICAgaWYgKG9wdC0+ZXh0ZW5kZWRfYnNpXzEpCisgICAgICAgICAgICAgICAgZnJhbWVfYml0cyArPSAxNDsKKyAgICAgICAgICAgIGlmIChvcHQtPmV4dGVuZGVkX2JzaV8yKQorICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gMTQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhdWRpbyBibG9ja3MgKi8KKyAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgIEFDM0Jsb2NrICpibG9jayA9ICZzLT5ibG9ja3NbYmxrXTsKKworICAgICAgICAvKiBjb3VwbGluZyBzdHJhdGVneSAqLworICAgICAgICBpZiAoIXMtPmVhYzMpCisgICAgICAgICAgICBmcmFtZV9iaXRzKys7CisgICAgICAgIGlmIChibG9jay0+bmV3X2NwbF9zdHJhdGVneSkgeworICAgICAgICAgICAgaWYgKCFzLT5lYWMzKQorICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMrKzsKKyAgICAgICAgICAgIGlmIChibG9jay0+Y3BsX2luX3VzZSkgeworICAgICAgICAgICAgICAgIGlmIChzLT5lYWMzKQorICAgICAgICAgICAgICAgICAgICBmcmFtZV9iaXRzKys7CisgICAgICAgICAgICAgICAgaWYgKCFzLT5lYWMzIHx8IHMtPmNoYW5uZWxfbW9kZSAhPSBBQzNfQ0hNT0RFX1NURVJFTykKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVfYml0cyArPSBzLT5mYndfY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFX1NURVJFTykKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVfYml0cysrOworICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gNCArIDQ7CisgICAgICAgICAgICAgICAgaWYgKHMtPmVhYzMpCisgICAgICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMrKzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gcy0+bnVtX2NwbF9zdWJiYW5kcyAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBjb3VwbGluZyBjb29yZGluYXRlcyAqLworICAgICAgICBpZiAoYmxvY2stPmNwbF9pbl91c2UpIHsKKyAgICAgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmNoYW5uZWxfaW5fY3BsW2NoXSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPmVhYzMgfHwgYmxvY2stPm5ld19jcGxfY29vcmRzW2NoXSAhPSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfYml0cysrOworICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2stPm5ld19jcGxfY29vcmRzW2NoXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfYml0cyArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfYml0cyArPSAoNCArIDQpICogcy0+bnVtX2NwbF9iYW5kczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0ZXJlbyByZW1hdHJpeGluZyAqLworICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID09IEFDM19DSE1PREVfU1RFUkVPKSB7CisgICAgICAgICAgICBpZiAoIXMtPmVhYzMgfHwgYmxrID4gMCkKKyAgICAgICAgICAgICAgICBmcmFtZV9iaXRzKys7CisgICAgICAgICAgICBpZiAocy0+YmxvY2tzW2Jsa10ubmV3X3JlbWF0cml4aW5nX3N0cmF0ZWd5KQorICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gYmxvY2stPm51bV9yZW1hdHJpeGluZ19iYW5kczsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGJhbmR3aWR0aCBjb2RlcyAmIGdhaW4gcmFuZ2UgKi8KKyAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IHMtPmZid19jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgaWYgKHMtPmV4cF9zdHJhdGVneVtjaF1bYmxrXSAhPSBFWFBfUkVVU0UpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJsb2NrLT5jaGFubmVsX2luX2NwbFtjaF0pCisgICAgICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gNjsKKyAgICAgICAgICAgICAgICBmcmFtZV9iaXRzICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBjb3VwbGluZyBleHBvbmVudCBzdHJhdGVneSAqLworICAgICAgICBpZiAoIXMtPmVhYzMgJiYgYmxvY2stPmNwbF9pbl91c2UpCisgICAgICAgICAgICBmcmFtZV9iaXRzICs9IDI7CisKKyAgICAgICAgLyogc25yIG9mZnNldHMgYW5kIGZhc3QgZ2FpbiBjb2RlcyAqLworICAgICAgICBpZiAoIXMtPmVhYzMpIHsKKyAgICAgICAgICAgIGZyYW1lX2JpdHMrKzsKKyAgICAgICAgICAgIGlmIChibG9jay0+bmV3X3Nucl9vZmZzZXRzKQorICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gNiArIChzLT5jaGFubmVscyArIGJsb2NrLT5jcGxfaW5fdXNlKSAqICg0ICsgMyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBjb3VwbGluZyBsZWFrIGluZm8gKi8KKyAgICAgICAgaWYgKGJsb2NrLT5jcGxfaW5fdXNlKSB7CisgICAgICAgICAgICBpZiAoIXMtPmVhYzMgfHwgYmxvY2stPm5ld19jcGxfbGVhayAhPSAyKQorICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMrKzsKKyAgICAgICAgICAgIGlmIChibG9jay0+bmV3X2NwbF9sZWFrKQorICAgICAgICAgICAgICAgIGZyYW1lX2JpdHMgKz0gMyArIDM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5mcmFtZV9iaXRzID0gcy0+ZnJhbWVfYml0c19maXhlZCArIGZyYW1lX2JpdHM7Cit9CisKKworLyoKKyAqIENhbGN1bGF0ZSBtYXNraW5nIGN1cnZlIGJhc2VkIG9uIHRoZSBmaW5hbCBleHBvbmVudHMuCisgKiBBbHNvIGNhbGN1bGF0ZSB0aGUgcG93ZXIgc3BlY3RyYWwgZGVuc2l0aWVzIHRvIHVzZSBpbiBmdXR1cmUgY2FsY3VsYXRpb25zLgorICovCitzdGF0aWMgdm9pZCBiaXRfYWxsb2NfbWFza2luZyhBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBibGssIGNoOworCisgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICBBQzNCbG9jayAqYmxvY2sgPSAmcy0+YmxvY2tzW2Jsa107CisgICAgICAgIGZvciAoY2ggPSAhYmxvY2stPmNwbF9pbl91c2U7IGNoIDw9IHMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAvKiBXZSBvbmx5IG5lZWQgcHNkIGFuZCBtYXNrIGZvciBjYWxjdWxhdGluZyBiYXAuCisgICAgICAgICAgICAgICBTaW5jZSB3ZSBjdXJyZW50bHkgZG8gbm90IGNhbGN1bGF0ZSBiYXAgd2hlbiBleHBvbmVudAorICAgICAgICAgICAgICAgc3RyYXRlZ3kgaXMgRVhQX1JFVVNFIHdlIGRvIG5vdCBuZWVkIHRvIGNhbGN1bGF0ZSBwc2Qgb3IgbWFzay4gKi8KKyAgICAgICAgICAgIGlmIChzLT5leHBfc3RyYXRlZ3lbY2hdW2Jsa10gIT0gRVhQX1JFVVNFKSB7CisgICAgICAgICAgICAgICAgZmZfYWMzX2JpdF9hbGxvY19jYWxjX3BzZChibG9jay0+ZXhwW2NoXSwgcy0+c3RhcnRfZnJlcVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+ZW5kX2ZyZXFbY2hdLCBibG9jay0+cHNkW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5iYW5kX3BzZFtjaF0pOworICAgICAgICAgICAgICAgIGZmX2FjM19iaXRfYWxsb2NfY2FsY19tYXNrKCZzLT5iaXRfYWxsb2MsIGJsb2NrLT5iYW5kX3BzZFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhcnRfZnJlcVtjaF0sIGJsb2NrLT5lbmRfZnJlcVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfYWMzX2Zhc3RfZ2Fpbl90YWJbcy0+ZmFzdF9nYWluX2NvZGVbY2hdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9PSBzLT5sZmVfY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkFfTk9ORSwgMCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+bWFza1tjaF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKy8qCisgKiBFbnN1cmUgdGhhdCBiYXAgZm9yIGVhY2ggYmxvY2sgYW5kIGNoYW5uZWwgcG9pbnQgdG8gdGhlIGN1cnJlbnQgYmFwX2J1ZmZlci4KKyAqIFRoZXkgbWF5IGhhdmUgYmVlbiBzd2l0Y2hlZCBkdXJpbmcgdGhlIGJpdCBhbGxvY2F0aW9uIHNlYXJjaC4KKyAqLworc3RhdGljIHZvaWQgcmVzZXRfYmxvY2tfYmFwKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGJsaywgY2g7CisgICAgdWludDhfdCAqcmVmX2JhcDsKKworICAgIGlmIChzLT5yZWZfYmFwWzBdWzBdID09IHMtPmJhcF9idWZmZXIgJiYgcy0+cmVmX2JhcF9zZXQpCisgICAgICAgIHJldHVybjsKKworICAgIHJlZl9iYXAgPSBzLT5iYXBfYnVmZmVyOworICAgIGZvciAoY2ggPSAwOyBjaCA8PSBzLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKQorICAgICAgICAgICAgcy0+cmVmX2JhcFtjaF1bYmxrXSA9IHJlZl9iYXAgKyBBQzNfTUFYX0NPRUZTICogcy0+ZXhwX3JlZl9ibG9ja1tjaF1bYmxrXTsKKyAgICAgICAgcmVmX2JhcCArPSBBQzNfTUFYX0NPRUZTICogcy0+bnVtX2Jsb2NrczsKKyAgICB9CisgICAgcy0+cmVmX2JhcF9zZXQgPSAxOworfQorCisKKy8qKgorICogSW5pdGlhbGl6ZSBtYW50aXNzYSBjb3VudHMuCisgKiBUaGVzZSBhcmUgc2V0IHNvIHRoYXQgdGhleSBhcmUgcGFkZGVkIHRvIHRoZSBuZXh0IHdob2xlIGdyb3VwIHNpemUgd2hlbiBiaXRzCisgKiBhcmUgY291bnRlZCBpbiBjb21wdXRlX21hbnRpc3NhX3NpemUuCisgKgorICogQHBhcmFtW2luLG91dF0gbWFudF9jbnQgIHJ1bm5pbmcgY291bnRzIGZvciBlYWNoIGJhcCB2YWx1ZSBmb3IgZWFjaCBibG9jaworICovCitzdGF0aWMgdm9pZCBjb3VudF9tYW50aXNzYV9iaXRzX2luaXQodWludDE2X3QgbWFudF9jbnRbQUMzX01BWF9CTE9DS1NdWzE2XSkKK3sKKyAgICBpbnQgYmxrOworCisgICAgZm9yIChibGsgPSAwOyBibGsgPCBBQzNfTUFYX0JMT0NLUzsgYmxrKyspIHsKKyAgICAgICAgbWVtc2V0KG1hbnRfY250W2Jsa10sIDAsIHNpemVvZihtYW50X2NudFtibGtdKSk7CisgICAgICAgIG1hbnRfY250W2Jsa11bMV0gPSBtYW50X2NudFtibGtdWzJdID0gMjsKKyAgICAgICAgbWFudF9jbnRbYmxrXVs0XSA9IDE7CisgICAgfQorfQorCisKKy8qKgorICogVXBkYXRlIG1hbnRpc3NhIGJpdCBjb3VudHMgZm9yIGFsbCBibG9ja3MgaW4gMSBjaGFubmVsIGluIGEgZ2l2ZW4gYmFuZHdpZHRoCisgKiByYW5nZS4KKyAqCisgKiBAcGFyYW0gcyAgICAgICAgICAgICAgICAgQUMtMyBlbmNvZGVyIHByaXZhdGUgY29udGV4dAorICogQHBhcmFtIGNoICAgICAgICAgICAgICAgIGNoYW5uZWwgaW5kZXgKKyAqIEBwYXJhbVtpbixvdXRdIG1hbnRfY250ICBydW5uaW5nIGNvdW50cyBmb3IgZWFjaCBiYXAgdmFsdWUgZm9yIGVhY2ggYmxvY2sKKyAqIEBwYXJhbSBzdGFydCAgICAgICAgICAgICBzdGFydGluZyBjb2VmZmljaWVudCBiaW4KKyAqIEBwYXJhbSBlbmQgICAgICAgICAgICAgICBlbmRpbmcgY29lZmZpY2llbnQgYmluCisgKi8KK3N0YXRpYyB2b2lkIGNvdW50X21hbnRpc3NhX2JpdHNfdXBkYXRlX2NoKEFDM0VuY29kZUNvbnRleHQgKnMsIGludCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1hbnRfY250W0FDM19NQVhfQkxPQ0tTXVsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICAgaW50IGJsazsKKworICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspIHsKKyAgICAgICAgQUMzQmxvY2sgKmJsb2NrID0gJnMtPmJsb2Nrc1tibGtdOworICAgICAgICBpZiAoY2ggPT0gQ1BMX0NIICYmICFibG9jay0+Y3BsX2luX3VzZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBzLT5hYzNkc3AudXBkYXRlX2JhcF9jb3VudHMobWFudF9jbnRbYmxrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlZl9iYXBbY2hdW2Jsa10gKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGVuZCwgYmxvY2stPmVuZF9mcmVxW2NoXSkgLSBzdGFydCk7CisgICAgfQorfQorCisKKy8qCisgKiBDb3VudCB0aGUgbnVtYmVyIG9mIG1hbnRpc3NhIGJpdHMgaW4gdGhlIGZyYW1lIGJhc2VkIG9uIHRoZSBiYXAgdmFsdWVzLgorICovCitzdGF0aWMgaW50IGNvdW50X21hbnRpc3NhX2JpdHMoQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY2gsIG1heF9lbmRfZnJlcTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQxNl90LCBtYW50X2NudCwgW0FDM19NQVhfQkxPQ0tTXSwgWzE2XSk7CisKKyAgICBjb3VudF9tYW50aXNzYV9iaXRzX2luaXQobWFudF9jbnQpOworCisgICAgbWF4X2VuZF9mcmVxID0gcy0+YmFuZHdpZHRoX2NvZGUgKiAzICsgNzM7CisgICAgZm9yIChjaCA9ICFzLT5jcGxfZW5hYmxlZDsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgIGNvdW50X21hbnRpc3NhX2JpdHNfdXBkYXRlX2NoKHMsIGNoLCBtYW50X2NudCwgcy0+c3RhcnRfZnJlcVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9lbmRfZnJlcSk7CisKKyAgICByZXR1cm4gcy0+YWMzZHNwLmNvbXB1dGVfbWFudGlzc2Ffc2l6ZShtYW50X2NudCk7Cit9CisKKworLyoqCisgKiBSdW4gdGhlIGJpdCBhbGxvY2F0aW9uIHdpdGggYSBnaXZlbiBTTlIgb2Zmc2V0LgorICogVGhpcyBjYWxjdWxhdGVzIHRoZSBiaXQgYWxsb2NhdGlvbiBwb2ludGVycyB0aGF0IHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUKKyAqIHRoZSBxdWFudGl6YXRpb24gb2YgZWFjaCBtYW50aXNzYS4KKyAqCisgKiBAcGFyYW0gcyAgICAgICAgICAgQUMtMyBlbmNvZGVyIHByaXZhdGUgY29udGV4dAorICogQHBhcmFtIHNucl9vZmZzZXQgIFNOUiBvZmZzZXQsIDAgdG8gMTAyMworICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciBtYW50aXNzYXMgaWYgdGhlIGdpdmVuIFNOUiBvZmZzZXQgaXMKKyAqICAgICAgICAgaXMgdXNlZC4KKyAqLworc3RhdGljIGludCBiaXRfYWxsb2MoQUMzRW5jb2RlQ29udGV4dCAqcywgaW50IHNucl9vZmZzZXQpCit7CisgICAgaW50IGJsaywgY2g7CisKKyAgICBzbnJfb2Zmc2V0ID0gKHNucl9vZmZzZXQgLSAyNDApIDw8IDI7CisKKyAgICByZXNldF9ibG9ja19iYXAocyk7CisgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICBBQzNCbG9jayAqYmxvY2sgPSAmcy0+YmxvY2tzW2Jsa107CisKKyAgICAgICAgZm9yIChjaCA9ICFibG9jay0+Y3BsX2luX3VzZTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIC8qIEN1cnJlbnRseSB0aGUgb25seSBiaXQgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIHdoaWNoIHZhcnkgYWNyb3NzCisgICAgICAgICAgICAgICBibG9ja3Mgd2l0aGluIGEgZnJhbWUgYXJlIHRoZSBleHBvbmVudCB2YWx1ZXMuICBXZSBjYW4gdGFrZQorICAgICAgICAgICAgICAgYWR2YW50YWdlIG9mIHRoYXQgYnkgcmV1c2luZyB0aGUgYml0IGFsbG9jYXRpb24gcG9pbnRlcnMKKyAgICAgICAgICAgICAgIHdoZW5ldmVyIHdlIHJldXNlIGV4cG9uZW50cy4gKi8KKyAgICAgICAgICAgIGlmIChzLT5leHBfc3RyYXRlZ3lbY2hdW2Jsa10gIT0gRVhQX1JFVVNFKSB7CisgICAgICAgICAgICAgICAgcy0+YWMzZHNwLmJpdF9hbGxvY19jYWxjX2JhcChibG9jay0+bWFza1tjaF0sIGJsb2NrLT5wc2RbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhcnRfZnJlcVtjaF0sIGJsb2NrLT5lbmRfZnJlcVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnJfb2Zmc2V0LCBzLT5iaXRfYWxsb2MuZmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9hYzNfYmFwX3RhYiwgcy0+cmVmX2JhcFtjaF1bYmxrXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvdW50X21hbnRpc3NhX2JpdHMocyk7Cit9CisKKworLyoKKyAqIENvbnN0YW50IGJpdHJhdGUgYml0IGFsbG9jYXRpb24gc2VhcmNoLgorICogRmluZCB0aGUgbGFyZ2VzdCBTTlIgb2Zmc2V0IHRoYXQgd2lsbCBhbGxvdyBkYXRhIHRvIGZpdCBpbiB0aGUgZnJhbWUuCisgKi8KK3N0YXRpYyBpbnQgY2JyX2JpdF9hbGxvY2F0aW9uKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGNoOworICAgIGludCBiaXRzX2xlZnQ7CisgICAgaW50IHNucl9vZmZzZXQsIHNucl9pbmNyOworCisgICAgYml0c19sZWZ0ID0gOCAqIHMtPmZyYW1lX3NpemUgLSAocy0+ZnJhbWVfYml0cyArIHMtPmV4cG9uZW50X2JpdHMpOworICAgIGlmIChiaXRzX2xlZnQgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgc25yX29mZnNldCA9IHMtPmNvYXJzZV9zbnJfb2Zmc2V0IDw8IDQ7CisKKyAgICAvKiBpZiBwcmV2aW91cyBmcmFtZSBTTlIgb2Zmc2V0IHdhcyAxMDIzLCBjaGVjayBpZiBjdXJyZW50IGZyYW1lIGNhbiBhbHNvCisgICAgICAgdXNlIFNOUiBvZmZzZXQgb2YgMTAyMy4gaWYgc28sIHNraXAgdGhlIHNlYXJjaC4gKi8KKyAgICBpZiAoKHNucl9vZmZzZXQgfCBzLT5maW5lX3Nucl9vZmZzZXRbMV0pID09IDEwMjMpIHsKKyAgICAgICAgaWYgKGJpdF9hbGxvYyhzLCAxMDIzKSA8PSBiaXRzX2xlZnQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB3aGlsZSAoc25yX29mZnNldCA+PSAwICYmCisgICAgICAgICAgIGJpdF9hbGxvYyhzLCBzbnJfb2Zmc2V0KSA+IGJpdHNfbGVmdCkgeworICAgICAgICBzbnJfb2Zmc2V0IC09IDY0OworICAgIH0KKyAgICBpZiAoc25yX29mZnNldCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBGRlNXQVAodWludDhfdCAqLCBzLT5iYXBfYnVmZmVyLCBzLT5iYXAxX2J1ZmZlcik7CisgICAgZm9yIChzbnJfaW5jciA9IDY0OyBzbnJfaW5jciA+IDA7IHNucl9pbmNyID4+PSAyKSB7CisgICAgICAgIHdoaWxlIChzbnJfb2Zmc2V0ICsgc25yX2luY3IgPD0gMTAyMyAmJgorICAgICAgICAgICAgICAgYml0X2FsbG9jKHMsIHNucl9vZmZzZXQgKyBzbnJfaW5jcikgPD0gYml0c19sZWZ0KSB7CisgICAgICAgICAgICBzbnJfb2Zmc2V0ICs9IHNucl9pbmNyOworICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QgKiwgcy0+YmFwX2J1ZmZlciwgcy0+YmFwMV9idWZmZXIpOworICAgICAgICB9CisgICAgfQorICAgIEZGU1dBUCh1aW50OF90ICosIHMtPmJhcF9idWZmZXIsIHMtPmJhcDFfYnVmZmVyKTsKKyAgICByZXNldF9ibG9ja19iYXAocyk7CisKKyAgICBzLT5jb2Fyc2Vfc25yX29mZnNldCA9IHNucl9vZmZzZXQgPj4gNDsKKyAgICBmb3IgKGNoID0gIXMtPmNwbF9vbjsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgIHMtPmZpbmVfc25yX29mZnNldFtjaF0gPSBzbnJfb2Zmc2V0ICYgMHhGOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFBlcmZvcm0gYml0IGFsbG9jYXRpb24gc2VhcmNoLgorICogRmluZHMgdGhlIFNOUiBvZmZzZXQgdmFsdWUgdGhhdCBtYXhpbWl6ZXMgcXVhbGl0eSBhbmQgZml0cyBpbiB0aGUgc3BlY2lmaWVkCisgKiBmcmFtZSBzaXplLiAgT3V0cHV0IGlzIHRoZSBTTlIgb2Zmc2V0IGFuZCBhIHNldCBvZiBiaXQgYWxsb2NhdGlvbiBwb2ludGVycworICogdXNlZCB0byBxdWFudGl6ZSB0aGUgbWFudGlzc2FzLgorICovCitpbnQgZmZfYWMzX2NvbXB1dGVfYml0X2FsbG9jYXRpb24oQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBjb3VudF9mcmFtZV9iaXRzKHMpOworCisgICAgcy0+ZXhwb25lbnRfYml0cyA9IGNvdW50X2V4cG9uZW50X2JpdHMocyk7CisKKyAgICBiaXRfYWxsb2NfbWFza2luZyhzKTsKKworICAgIHJldHVybiBjYnJfYml0X2FsbG9jYXRpb24ocyk7Cit9CisKKworLyoqCisgKiBTeW1tZXRyaWMgcXVhbnRpemF0aW9uIG9uICdsZXZlbHMnIGxldmVscy4KKyAqCisgKiBAcGFyYW0gYyAgICAgICB1bnF1YW50aXplZCBjb2VmZmljaWVudAorICogQHBhcmFtIGUgICAgICAgZXhwb25lbnQKKyAqIEBwYXJhbSBsZXZlbHMgIG51bWJlciBvZiBxdWFudGl6YXRpb24gbGV2ZWxzCisgKiBAcmV0dXJuICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnQKKyAqLworc3RhdGljIGlubGluZSBpbnQgc3ltX3F1YW50KGludCBjLCBpbnQgZSwgaW50IGxldmVscykKK3sKKyAgICBpbnQgdiA9ICgoKGxldmVscyAqIGMpID4+ICgyNCAtIGUpKSArIGxldmVscykgPj4gMTsKKyAgICBhdl9hc3NlcnQyKHYgPj0gMCAmJiB2IDwgbGV2ZWxzKTsKKyAgICByZXR1cm4gdjsKK30KKworCisvKioKKyAqIEFzeW1tZXRyaWMgcXVhbnRpemF0aW9uIG9uIDJecWJpdHMgbGV2ZWxzLgorICoKKyAqIEBwYXJhbSBjICAgICAgdW5xdWFudGl6ZWQgY29lZmZpY2llbnQKKyAqIEBwYXJhbSBlICAgICAgZXhwb25lbnQKKyAqIEBwYXJhbSBxYml0cyAgbnVtYmVyIG9mIHF1YW50aXphdGlvbiBiaXRzCisgKiBAcmV0dXJuICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudAorICovCitzdGF0aWMgaW5saW5lIGludCBhc3ltX3F1YW50KGludCBjLCBpbnQgZSwgaW50IHFiaXRzKQoreworICAgIGludCBtOworCisgICAgYyA9ICgoKGMgPDwgZSkgPj4gKDI0IC0gcWJpdHMpKSArIDEpID4+IDE7CisgICAgbSA9ICgxIDw8IChxYml0cy0xKSk7CisgICAgaWYgKGMgPj0gbSkKKyAgICAgICAgYyA9IG0gLSAxOworICAgIGF2X2Fzc2VydDIoYyA+PSAtbSk7CisgICAgcmV0dXJuIGM7Cit9CisKKworLyoqCisgKiBRdWFudGl6ZSBhIHNldCBvZiBtYW50aXNzYXMgZm9yIGEgc2luZ2xlIGNoYW5uZWwgaW4gYSBzaW5nbGUgYmxvY2suCisgKgorICogQHBhcmFtIHMgICAgICAgICAgIE1hbnRpc3NhIGNvdW50IGNvbnRleHQKKyAqIEBwYXJhbSBmaXhlZF9jb2VmICB1bnF1YW50aXplZCBmaXhlZC1wb2ludCBjb2VmZmljaWVudHMKKyAqIEBwYXJhbSBleHAgICAgICAgICBleHBvbmVudHMKKyAqIEBwYXJhbSBiYXAgICAgICAgICBiaXQgYWxsb2NhdGlvbiBwb2ludGVyIGluZGljZXMKKyAqIEBwYXJhbVtvdXRdIHFtYW50ICBxdWFudGl6ZWQgY29lZmZpY2llbnRzCisgKiBAcGFyYW0gc3RhcnRfZnJlcSAgc3RhcnRpbmcgY29lZmZpY2llbnQgYmluCisgKiBAcGFyYW0gZW5kX2ZyZXEgICAgZW5kaW5nIGNvZWZmaWNpZW50IGJpbgorICovCitzdGF0aWMgdm9pZCBxdWFudGl6ZV9tYW50aXNzYXNfYmxrX2NoKEFDM01hbnQgKnMsIGludDMyX3QgKmZpeGVkX2NvZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmV4cCwgdWludDhfdCAqYmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpxbWFudCwgaW50IHN0YXJ0X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRfZnJlcSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IHN0YXJ0X2ZyZXE7IGkgPCBlbmRfZnJlcTsgaSsrKSB7CisgICAgICAgIGludCBjID0gZml4ZWRfY29lZltpXTsKKyAgICAgICAgaW50IGUgPSBleHBbaV07CisgICAgICAgIGludCB2ID0gYmFwW2ldOworICAgICAgICBpZiAodikKKyAgICAgICAgc3dpdGNoICh2KSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHYgPSBzeW1fcXVhbnQoYywgZSwgMyk7CisgICAgICAgICAgICBzd2l0Y2ggKHMtPm1hbnQxX2NudCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHMtPnFtYW50MV9wdHIgPSAmcW1hbnRbaV07CisgICAgICAgICAgICAgICAgdiA9IDkgKiB2OworICAgICAgICAgICAgICAgIHMtPm1hbnQxX2NudCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgKnMtPnFtYW50MV9wdHIgKz0gMyAqIHY7CisgICAgICAgICAgICAgICAgcy0+bWFudDFfY250ID0gMjsKKyAgICAgICAgICAgICAgICB2ID0gMTI4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqcy0+cW1hbnQxX3B0ciArPSB2OworICAgICAgICAgICAgICAgIHMtPm1hbnQxX2NudCA9IDA7CisgICAgICAgICAgICAgICAgdiA9IDEyODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB2ID0gc3ltX3F1YW50KGMsIGUsIDUpOworICAgICAgICAgICAgc3dpdGNoIChzLT5tYW50Ml9jbnQpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBzLT5xbWFudDJfcHRyID0gJnFtYW50W2ldOworICAgICAgICAgICAgICAgIHYgPSAyNSAqIHY7CisgICAgICAgICAgICAgICAgcy0+bWFudDJfY250ID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAqcy0+cW1hbnQyX3B0ciArPSA1ICogdjsKKyAgICAgICAgICAgICAgICBzLT5tYW50Ml9jbnQgPSAyOworICAgICAgICAgICAgICAgIHYgPSAxMjg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpzLT5xbWFudDJfcHRyICs9IHY7CisgICAgICAgICAgICAgICAgcy0+bWFudDJfY250ID0gMDsKKyAgICAgICAgICAgICAgICB2ID0gMTI4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHYgPSBzeW1fcXVhbnQoYywgZSwgNyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgdiA9IHN5bV9xdWFudChjLCBlLCAxMSk7CisgICAgICAgICAgICBzd2l0Y2ggKHMtPm1hbnQ0X2NudCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHMtPnFtYW50NF9wdHIgPSAmcW1hbnRbaV07CisgICAgICAgICAgICAgICAgdiA9IDExICogdjsKKyAgICAgICAgICAgICAgICBzLT5tYW50NF9jbnQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqcy0+cW1hbnQ0X3B0ciArPSB2OworICAgICAgICAgICAgICAgIHMtPm1hbnQ0X2NudCA9IDA7CisgICAgICAgICAgICAgICAgdiA9IDEyODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB2ID0gc3ltX3F1YW50KGMsIGUsIDE1KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgdiA9IGFzeW1fcXVhbnQoYywgZSwgMTQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICB2ID0gYXN5bV9xdWFudChjLCBlLCAxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHYgPSBhc3ltX3F1YW50KGMsIGUsIHYgLSAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHFtYW50W2ldID0gdjsKKyAgICB9Cit9CisKKworLyoqCisgKiBRdWFudGl6ZSBtYW50aXNzYXMgdXNpbmcgY29lZmZpY2llbnRzLCBleHBvbmVudHMsIGFuZCBiaXQgYWxsb2NhdGlvbiBwb2ludGVycy4KKyAqCisgKiBAcGFyYW0gcyAgQUMtMyBlbmNvZGVyIHByaXZhdGUgY29udGV4dAorICovCit2b2lkIGZmX2FjM19xdWFudGl6ZV9tYW50aXNzYXMoQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgYmxrLCBjaCwgY2gwPTAsIGdvdF9jcGw7CisKKyAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgIEFDM0Jsb2NrICpibG9jayA9ICZzLT5ibG9ja3NbYmxrXTsKKyAgICAgICAgQUMzTWFudCBtID0geyAwIH07CisKKyAgICAgICAgZ290X2NwbCA9ICFibG9jay0+Y3BsX2luX3VzZTsKKyAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IHMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBpZiAoIWdvdF9jcGwgJiYgY2ggPiAxICYmIGJsb2NrLT5jaGFubmVsX2luX2NwbFtjaC0xXSkgeworICAgICAgICAgICAgICAgIGNoMCAgICAgPSBjaCAtIDE7CisgICAgICAgICAgICAgICAgY2ggICAgICA9IENQTF9DSDsKKyAgICAgICAgICAgICAgICBnb3RfY3BsID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1YW50aXplX21hbnRpc3Nhc19ibGtfY2goJm0sIGJsb2NrLT5maXhlZF9jb2VmW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tzW3MtPmV4cF9yZWZfYmxvY2tbY2hdW2Jsa11dLmV4cFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlZl9iYXBbY2hdW2Jsa10sIGJsb2NrLT5xbWFudFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXJ0X2ZyZXFbY2hdLCBibG9jay0+ZW5kX2ZyZXFbY2hdKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSBDUExfQ0gpCisgICAgICAgICAgICAgICAgY2ggPSBjaDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoKKyAqIFdyaXRlIHRoZSBBQy0zIGZyYW1lIGhlYWRlciB0byB0aGUgb3V0cHV0IGJpdHN0cmVhbS4KKyAqLworc3RhdGljIHZvaWQgYWMzX291dHB1dF9mcmFtZV9oZWFkZXIoQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBBQzNFbmNPcHRpb25zICpvcHQgPSAmcy0+b3B0aW9uczsKKworICAgIHB1dF9iaXRzKCZzLT5wYiwgMTYsIDB4MGI3Nyk7ICAgLyogZnJhbWUgaGVhZGVyICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgMCk7ICAgICAgICAvKiBjcmMxOiB3aWxsIGJlIGZpbGxlZCBsYXRlciAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgIHMtPmJpdF9hbGxvYy5zcl9jb2RlKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDYsICBzLT5mcmFtZV9zaXplX2NvZGUgKyAocy0+ZnJhbWVfc2l6ZSAtIHMtPmZyYW1lX3NpemVfbWluKSAvIDIpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgIHMtPmJpdHN0cmVhbV9pZCk7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCAgcy0+Yml0c3RyZWFtX21vZGUpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgIHMtPmNoYW5uZWxfbW9kZSk7CisgICAgaWYgKChzLT5jaGFubmVsX21vZGUgJiAweDAxKSAmJiBzLT5jaGFubmVsX21vZGUgIT0gQUMzX0NITU9ERV9NT05PKQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIHMtPmNlbnRlcl9taXhfbGV2ZWwpOworICAgIGlmIChzLT5jaGFubmVsX21vZGUgJiAweDA0KQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIHMtPnN1cnJvdW5kX21peF9sZXZlbCk7CisgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFX1NURVJFTykKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBvcHQtPmRvbGJ5X3N1cnJvdW5kX21vZGUpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+bGZlX29uKTsgLyogTEZFICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCA1LCAtb3B0LT5kaWFsb2d1ZV9sZXZlbCk7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAvKiBubyBjb21wcmVzc2lvbiBjb250cm9sIHdvcmQgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgIC8qIG5vIGxhbmcgY29kZSAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgb3B0LT5hdWRpb19wcm9kdWN0aW9uX2luZm8pOworICAgIGlmIChvcHQtPmF1ZGlvX3Byb2R1Y3Rpb25faW5mbykgeworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIG9wdC0+bWl4aW5nX2xldmVsIC0gODApOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIG9wdC0+cm9vbV90eXBlKTsKKyAgICB9CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBvcHQtPmNvcHlyaWdodCk7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBvcHQtPm9yaWdpbmFsKTsKKyAgICBpZiAocy0+Yml0c3RyZWFtX2lkID09IDYpIHsKKyAgICAgICAgLyogYWx0ZXJuYXRlIGJpdCBzdHJlYW0gc3ludGF4ICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgb3B0LT5leHRlbmRlZF9ic2lfMSk7CisgICAgICAgIGlmIChvcHQtPmV4dGVuZGVkX2JzaV8xKSB7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIG9wdC0+cHJlZmVycmVkX3N0ZXJlb19kb3dubWl4KTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+bHRydF9jZW50ZXJfbWl4X2xldmVsKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+bHRydF9zdXJyb3VuZF9taXhfbGV2ZWwpOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCBzLT5sb3JvX2NlbnRlcl9taXhfbGV2ZWwpOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCBzLT5sb3JvX3N1cnJvdW5kX21peF9sZXZlbCk7CisgICAgICAgIH0KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBvcHQtPmV4dGVuZGVkX2JzaV8yKTsKKyAgICAgICAgaWYgKG9wdC0+ZXh0ZW5kZWRfYnNpXzIpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgb3B0LT5kb2xieV9zdXJyb3VuZF9leF9tb2RlKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgb3B0LT5kb2xieV9oZWFkcGhvbmVfbW9kZSk7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIG9wdC0+YWRfY29udmVydGVyX3R5cGUpOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA5LCAwKTsgICAgIC8qIHhic2kyIGFuZCBlbmNpbmZvIDogcmVzZXJ2ZWQgKi8KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAvKiBubyB0aW1lIGNvZGUgMSAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgLyogbm8gdGltZSBjb2RlIDIgKi8KKyAgICB9CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAvKiBubyBhZGRpdGlvbmFsIGJpdCBzdHJlYW0gaW5mbyAqLworfQorCisKKy8qCisgKiBXcml0ZSBvbmUgYXVkaW8gYmxvY2sgdG8gdGhlIG91dHB1dCBiaXRzdHJlYW0uCisgKi8KK3N0YXRpYyB2b2lkIG91dHB1dF9hdWRpb19ibG9jayhBQzNFbmNvZGVDb250ZXh0ICpzLCBpbnQgYmxrKQoreworICAgIGludCBjaCwgaSwgYmFpZSwgYm5kLCBnb3RfY3BsLCBhdl91bmluaXQoY2gwKTsKKyAgICBBQzNCbG9jayAqYmxvY2sgPSAmcy0+YmxvY2tzW2Jsa107CisKKyAgICAvKiBibG9jayBzd2l0Y2hpbmcgKi8KKyAgICBpZiAoIXMtPmVhYzMpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+ZmJ3X2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsKKyAgICB9CisKKyAgICAvKiBkaXRoZXIgZmxhZ3MgKi8KKyAgICBpZiAoIXMtPmVhYzMpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+ZmJ3X2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsKKyAgICB9CisKKyAgICAvKiBkeW5hbWljIHJhbmdlIGNvZGVzICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsKKworICAgIC8qIHNwZWN0cmFsIGV4dGVuc2lvbiAqLworICAgIGlmIChzLT5lYWMzKQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOworCisgICAgLyogY2hhbm5lbCBjb3VwbGluZyAqLworICAgIGlmICghcy0+ZWFjMykKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBibG9jay0+bmV3X2NwbF9zdHJhdGVneSk7CisgICAgaWYgKGJsb2NrLT5uZXdfY3BsX3N0cmF0ZWd5KSB7CisgICAgICAgIGlmICghcy0+ZWFjMykKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgYmxvY2stPmNwbF9pbl91c2UpOworICAgICAgICBpZiAoYmxvY2stPmNwbF9pbl91c2UpIHsKKyAgICAgICAgICAgIGludCBzdGFydF9zdWIsIGVuZF9zdWI7CisgICAgICAgICAgICBpZiAocy0+ZWFjMykKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAvKiBlbmhhbmNlZCBjb3VwbGluZyAqLworICAgICAgICAgICAgaWYgKCFzLT5lYWMzIHx8IHMtPmNoYW5uZWxfbW9kZSAhPSBBQzNfQ0hNT0RFX1NURVJFTykgeworICAgICAgICAgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgYmxvY2stPmNoYW5uZWxfaW5fY3BsW2NoXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID09IEFDM19DSE1PREVfU1RFUkVPKQorICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7IC8qIHBoYXNlIGZsYWdzIGluIHVzZSAqLworICAgICAgICAgICAgc3RhcnRfc3ViID0gKHMtPnN0YXJ0X2ZyZXFbQ1BMX0NIXSAtIDM3KSAvIDEyOworICAgICAgICAgICAgZW5kX3N1YiAgID0gKHMtPmNwbF9lbmRfZnJlcSAgICAgICAtIDM3KSAvIDEyOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCBzdGFydF9zdWIpOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCBlbmRfc3ViIC0gMyk7CisgICAgICAgICAgICAvKiBjb3VwbGluZyBiYW5kIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgaWYgKHMtPmVhYzMpIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAvKiB1c2UgZGVmYXVsdCAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGJuZCA9IHN0YXJ0X3N1YisxOyBibmQgPCBlbmRfc3ViOyBibmQrKykKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBmZl9lYWMzX2RlZmF1bHRfY3BsX2JhbmRfc3RydWN0W2JuZF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogY291cGxpbmcgY29vcmRpbmF0ZXMgKi8KKyAgICBpZiAoYmxvY2stPmNwbF9pbl91c2UpIHsKKyAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IHMtPmZid19jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgaWYgKGJsb2NrLT5jaGFubmVsX2luX2NwbFtjaF0pIHsKKyAgICAgICAgICAgICAgICBpZiAoIXMtPmVhYzMgfHwgYmxvY2stPm5ld19jcGxfY29vcmRzW2NoXSAhPSAyKQorICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIGJsb2NrLT5uZXdfY3BsX2Nvb3Jkc1tjaF0pOworICAgICAgICAgICAgICAgIGlmIChibG9jay0+bmV3X2NwbF9jb29yZHNbY2hdKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgYmxvY2stPmNwbF9tYXN0ZXJfZXhwW2NoXSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYm5kID0gMDsgYm5kIDwgcy0+bnVtX2NwbF9iYW5kczsgYm5kKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgYmxvY2stPmNwbF9jb29yZF9leHAgW2NoXVtibmRdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgYmxvY2stPmNwbF9jb29yZF9tYW50W2NoXVtibmRdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHN0ZXJlbyByZW1hdHJpeGluZyAqLworICAgIGlmIChzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8pIHsKKyAgICAgICAgaWYgKCFzLT5lYWMzIHx8IGJsayA+IDApCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIGJsb2NrLT5uZXdfcmVtYXRyaXhpbmdfc3RyYXRlZ3kpOworICAgICAgICBpZiAoYmxvY2stPm5ld19yZW1hdHJpeGluZ19zdHJhdGVneSkgeworICAgICAgICAgICAgLyogcmVtYXRyaXhpbmcgZmxhZ3MgKi8KKyAgICAgICAgICAgIGZvciAoYm5kID0gMDsgYm5kIDwgYmxvY2stPm51bV9yZW1hdHJpeGluZ19iYW5kczsgYm5kKyspCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBibG9jay0+cmVtYXRyaXhpbmdfZmxhZ3NbYm5kXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBleHBvbmVudCBzdHJhdGVneSAqLworICAgIGlmICghcy0+ZWFjMykgeworICAgICAgICBmb3IgKGNoID0gIWJsb2NrLT5jcGxfaW5fdXNlOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIHMtPmV4cF9zdHJhdGVneVtjaF1bYmxrXSk7CisgICAgICAgIGlmIChzLT5sZmVfb24pCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmV4cF9zdHJhdGVneVtzLT5sZmVfY2hhbm5lbF1bYmxrXSk7CisgICAgfQorCisgICAgLyogYmFuZHdpZHRoICovCisgICAgZm9yIChjaCA9IDE7IGNoIDw9IHMtPmZid19jaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAocy0+ZXhwX3N0cmF0ZWd5W2NoXVtibGtdICE9IEVYUF9SRVVTRSAmJiAhYmxvY2stPmNoYW5uZWxfaW5fY3BsW2NoXSkKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNiwgcy0+YmFuZHdpZHRoX2NvZGUpOworICAgIH0KKworICAgIC8qIGV4cG9uZW50cyAqLworICAgIGZvciAoY2ggPSAhYmxvY2stPmNwbF9pbl91c2U7IGNoIDw9IHMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGludCBuYl9ncm91cHM7CisgICAgICAgIGludCBjcGwgPSAoY2ggPT0gQ1BMX0NIKTsKKworICAgICAgICBpZiAocy0+ZXhwX3N0cmF0ZWd5W2NoXVtibGtdID09IEVYUF9SRVVTRSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIERDIGV4cG9uZW50ICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgYmxvY2stPmdyb3VwZWRfZXhwW2NoXVswXSA+PiBjcGwpOworCisgICAgICAgIC8qIGV4cG9uZW50IGdyb3VwcyAqLworICAgICAgICBuYl9ncm91cHMgPSBleHBvbmVudF9ncm91cF90YWJbY3BsXVtzLT5leHBfc3RyYXRlZ3lbY2hdW2Jsa10tMV1bYmxvY2stPmVuZF9mcmVxW2NoXS1zLT5zdGFydF9mcmVxW2NoXV07CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbmJfZ3JvdXBzOyBpKyspCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDcsIGJsb2NrLT5ncm91cGVkX2V4cFtjaF1baV0pOworCisgICAgICAgIC8qIGdhaW4gcmFuZ2UgaW5mbyAqLworICAgICAgICBpZiAoY2ggIT0gcy0+bGZlX2NoYW5uZWwgJiYgIWNwbCkKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgMCk7CisgICAgfQorCisgICAgLyogYml0IGFsbG9jYXRpb24gaW5mbyAqLworICAgIGlmICghcy0+ZWFjMykgeworICAgICAgICBiYWllID0gKGJsayA9PSAwKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBiYWllKTsKKyAgICAgICAgaWYgKGJhaWUpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgcy0+c2xvd19kZWNheV9jb2RlKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgcy0+ZmFzdF9kZWNheV9jb2RlKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgcy0+c2xvd19nYWluX2NvZGUpOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBzLT5kYl9wZXJfYml0X2NvZGUpOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCBzLT5mbG9vcl9jb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNuciBvZmZzZXQgKi8KKyAgICBpZiAoIXMtPmVhYzMpIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBibG9jay0+bmV3X3Nucl9vZmZzZXRzKTsKKyAgICAgICAgaWYgKGJsb2NrLT5uZXdfc25yX29mZnNldHMpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNiwgcy0+Y29hcnNlX3Nucl9vZmZzZXQpOworICAgICAgICAgICAgZm9yIChjaCA9ICFibG9jay0+Y3BsX2luX3VzZTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDQsIHMtPmZpbmVfc25yX29mZnNldFtjaF0pOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+ZmFzdF9nYWluX2NvZGVbY2hdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7IC8qIG5vIGNvbnZlcnRlciBzbnIgb2Zmc2V0ICovCisgICAgfQorCisgICAgLyogY291cGxpbmcgbGVhayAqLworICAgIGlmIChibG9jay0+Y3BsX2luX3VzZSkgeworICAgICAgICBpZiAoIXMtPmVhYzMgfHwgYmxvY2stPm5ld19jcGxfbGVhayAhPSAyKQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBibG9jay0+bmV3X2NwbF9sZWFrKTsKKyAgICAgICAgaWYgKGJsb2NrLT5uZXdfY3BsX2xlYWspIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+Yml0X2FsbG9jLmNwbF9mYXN0X2xlYWspOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCBzLT5iaXRfYWxsb2MuY3BsX3Nsb3dfbGVhayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXMtPmVhYzMpIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgLyogbm8gZGVsdGEgYml0IGFsbG9jYXRpb24gKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgLyogbm8gZGF0YSB0byBza2lwICovCisgICAgfQorCisgICAgLyogbWFudGlzc2FzICovCisgICAgZ290X2NwbCA9ICFibG9jay0+Y3BsX2luX3VzZTsKKyAgICBmb3IgKGNoID0gMTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaW50IGIsIHE7CisKKyAgICAgICAgaWYgKCFnb3RfY3BsICYmIGNoID4gMSAmJiBibG9jay0+Y2hhbm5lbF9pbl9jcGxbY2gtMV0pIHsKKyAgICAgICAgICAgIGNoMCAgICAgPSBjaCAtIDE7CisgICAgICAgICAgICBjaCAgICAgID0gQ1BMX0NIOworICAgICAgICAgICAgZ290X2NwbCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gcy0+c3RhcnRfZnJlcVtjaF07IGkgPCBibG9jay0+ZW5kX2ZyZXFbY2hdOyBpKyspIHsKKyAgICAgICAgICAgIHEgPSBibG9jay0+cW1hbnRbY2hdW2ldOworICAgICAgICAgICAgYiA9IHMtPnJlZl9iYXBbY2hdW2Jsa11baV07CisgICAgICAgICAgICBzd2l0Y2ggKGIpIHsKKyAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogaWYgKHEgIT0gMTI4KSBwdXRfYml0cyAoJnMtPnBiLCAgIDUsIHEpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogaWYgKHEgIT0gMTI4KSBwdXRfYml0cyAoJnMtPnBiLCAgIDcsIHEpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCAgIDMsIHEpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDogaWYgKHEgIT0gMTI4KSBwdXRfYml0cyAoJnMtPnBiLCAgIDcsIHEpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ6ICAgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCAgMTQsIHEpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6ICAgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCAgMTYsIHEpOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCBiLTEsIHEpOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggPT0gQ1BMX0NIKQorICAgICAgICAgICAgY2ggPSBjaDA7CisgICAgfQorfQorCisKKy8qKiBDUkMtMTYgUG9seW5vbWlhbCAqLworI2RlZmluZSBDUkMxNl9QT0xZICgoMSA8PCAwKSB8ICgxIDw8IDIpIHwgKDEgPDwgMTUpIHwgKDEgPDwgMTYpKQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXVsX3BvbHkodW5zaWduZWQgaW50IGEsIHVuc2lnbmVkIGludCBiLCB1bnNpZ25lZCBpbnQgcG9seSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgYzsKKworICAgIGMgPSAwOworICAgIHdoaWxlIChhKSB7CisgICAgICAgIGlmIChhICYgMSkKKyAgICAgICAgICAgIGMgXj0gYjsKKyAgICAgICAgYSA9IGEgPj4gMTsKKyAgICAgICAgYiA9IGIgPDwgMTsKKyAgICAgICAgaWYgKGIgJiAoMSA8PCAxNikpCisgICAgICAgICAgICBiIF49IHBvbHk7CisgICAgfQorICAgIHJldHVybiBjOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG93X3BvbHkodW5zaWduZWQgaW50IGEsIHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgcG9seSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgcjsKKyAgICByID0gMTsKKyAgICB3aGlsZSAobikgeworICAgICAgICBpZiAobiAmIDEpCisgICAgICAgICAgICByID0gbXVsX3BvbHkociwgYSwgcG9seSk7CisgICAgICAgIGEgPSBtdWxfcG9seShhLCBhLCBwb2x5KTsKKyAgICAgICAgbiA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisKKworLyoKKyAqIEZpbGwgdGhlIGVuZCBvZiB0aGUgZnJhbWUgd2l0aCAwJ3MgYW5kIGNvbXB1dGUgdGhlIHR3byBDUkNzLgorICovCitzdGF0aWMgdm9pZCBvdXRwdXRfZnJhbWVfZW5kKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgY29uc3QgQVZDUkMgKmNyY19jdHggPSBhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18xNl9BTlNJKTsKKyAgICBpbnQgZnJhbWVfc2l6ZV81OCwgcGFkX2J5dGVzLCBjcmMxLCBjcmMyX3BhcnRpYWwsIGNyYzIsIGNyY19pbnY7CisgICAgdWludDhfdCAqZnJhbWU7CisKKyAgICBmcmFtZV9zaXplXzU4ID0gKChzLT5mcmFtZV9zaXplID4+IDIpICsgKHMtPmZyYW1lX3NpemUgPj4gNCkpIDw8IDE7CisKKyAgICAvKiBwYWQgdGhlIHJlbWFpbmRlciBvZiB0aGUgZnJhbWUgd2l0aCB6ZXJvcyAqLworICAgIGF2X2Fzc2VydDIocy0+ZnJhbWVfc2l6ZSAqIDggLSBwdXRfYml0c19jb3VudCgmcy0+cGIpID49IDE4KTsKKyAgICBmbHVzaF9wdXRfYml0cygmcy0+cGIpOworICAgIGZyYW1lID0gcy0+cGIuYnVmOworICAgIHBhZF9ieXRlcyA9IHMtPmZyYW1lX3NpemUgLSAocHV0X2JpdHNfcHRyKCZzLT5wYikgLSBmcmFtZSkgLSAyOworICAgIGF2X2Fzc2VydDIocGFkX2J5dGVzID49IDApOworICAgIGlmIChwYWRfYnl0ZXMgPiAwKQorICAgICAgICBtZW1zZXQocHV0X2JpdHNfcHRyKCZzLT5wYiksIDAsIHBhZF9ieXRlcyk7CisKKyAgICBpZiAocy0+ZWFjMykgeworICAgICAgICAvKiBjb21wdXRlIGNyYzIgKi8KKyAgICAgICAgY3JjMl9wYXJ0aWFsID0gYXZfY3JjKGNyY19jdHgsIDAsIGZyYW1lICsgMiwgcy0+ZnJhbWVfc2l6ZSAtIDUpOworICAgIH0gZWxzZSB7CisgICAgLyogY29tcHV0ZSBjcmMxICovCisgICAgLyogdGhpcyBpcyBub3Qgc28gZWFzeSBiZWNhdXNlIGl0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEuLi4gKi8KKyAgICBjcmMxICAgID0gYXZfYnN3YXAxNihhdl9jcmMoY3JjX2N0eCwgMCwgZnJhbWUgKyA0LCBmcmFtZV9zaXplXzU4IC0gNCkpOworICAgIGNyY19pbnYgPSBzLT5jcmNfaW52W3MtPmZyYW1lX3NpemUgPiBzLT5mcmFtZV9zaXplX21pbl07CisgICAgY3JjMSAgICA9IG11bF9wb2x5KGNyY19pbnYsIGNyYzEsIENSQzE2X1BPTFkpOworICAgIEFWX1dCMTYoZnJhbWUgKyAyLCBjcmMxKTsKKworICAgIC8qIGNvbXB1dGUgY3JjMiAqLworICAgIGNyYzJfcGFydGlhbCA9IGF2X2NyYyhjcmNfY3R4LCAwLCBmcmFtZSArIGZyYW1lX3NpemVfNTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lX3NpemUgLSBmcmFtZV9zaXplXzU4IC0gMyk7CisgICAgfQorICAgIGNyYzIgPSBhdl9jcmMoY3JjX2N0eCwgY3JjMl9wYXJ0aWFsLCBmcmFtZSArIHMtPmZyYW1lX3NpemUgLSAzLCAxKTsKKyAgICAvKiBlbnN1cmUgY3JjMiBkb2VzIG5vdCBtYXRjaCBzeW5jIHdvcmQgYnkgZmxpcHBpbmcgY3JjcnN2IGJpdCBpZiBuZWVkZWQgKi8KKyAgICBpZiAoY3JjMiA9PSAweDc3MEIpIHsKKyAgICAgICAgZnJhbWVbcy0+ZnJhbWVfc2l6ZSAtIDNdIF49IDB4MTsKKyAgICAgICAgY3JjMiA9IGF2X2NyYyhjcmNfY3R4LCBjcmMyX3BhcnRpYWwsIGZyYW1lICsgcy0+ZnJhbWVfc2l6ZSAtIDMsIDEpOworICAgIH0KKyAgICBjcmMyID0gYXZfYnN3YXAxNihjcmMyKTsKKyAgICBBVl9XQjE2KGZyYW1lICsgcy0+ZnJhbWVfc2l6ZSAtIDIsIGNyYzIpOworfQorCisKKy8qKgorICogV3JpdGUgdGhlIGZyYW1lIHRvIHRoZSBvdXRwdXQgYml0c3RyZWFtLgorICoKKyAqIEBwYXJhbSBzICAgICAgQUMtMyBlbmNvZGVyIHByaXZhdGUgY29udGV4dAorICogQHBhcmFtIGZyYW1lICBvdXRwdXQgZGF0YSBidWZmZXIKKyAqLwordm9pZCBmZl9hYzNfb3V0cHV0X2ZyYW1lKEFDM0VuY29kZUNvbnRleHQgKnMsIHVuc2lnbmVkIGNoYXIgKmZyYW1lKQoreworICAgIGludCBibGs7CisKKyAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgZnJhbWUsIEFDM19NQVhfQ09ERURfRlJBTUVfU0laRSk7CisKKyAgICBzLT5vdXRwdXRfZnJhbWVfaGVhZGVyKHMpOworCisgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykKKyAgICAgICAgb3V0cHV0X2F1ZGlvX2Jsb2NrKHMsIGJsayk7CisKKyAgICBvdXRwdXRfZnJhbWVfZW5kKHMpOworfQorCisKK3N0YXRpYyB2b2lkIGRwcmludF9vcHRpb25zKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisjaWZkZWYgREVCVUcKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5hdmN0eDsKKyAgICBBQzNFbmNPcHRpb25zICpvcHQgPSAmcy0+b3B0aW9uczsKKyAgICBjaGFyIHN0cmJ1ZlszMl07CisKKyAgICBzd2l0Y2ggKHMtPmJpdHN0cmVhbV9pZCkgeworICAgIGNhc2UgIDY6ICBhdl9zdHJsY3B5KHN0cmJ1ZiwgIkFDLTMgKGFsdCBzeW50YXgpIiwgICAgICAgMzIpOyBicmVhazsKKyAgICBjYXNlICA4OiAgYXZfc3RybGNweShzdHJidWYsICJBQy0zIChzdGFuZGFyZCkiLCAgICAgICAgIDMyKTsgYnJlYWs7CisgICAgY2FzZSAgOTogIGF2X3N0cmxjcHkoc3RyYnVmLCAiQUMtMyAoZG5ldCBoYWxmLXJhdGUpIiwgICAzMik7IGJyZWFrOworICAgIGNhc2UgMTA6ICBhdl9zdHJsY3B5KHN0cmJ1ZiwgIkFDLTMgKGRuZXQgcXVhdGVyLXJhdGUpIiwgMzIpOyBicmVhazsKKyAgICBjYXNlIDE2OiAgYXZfc3RybGNweShzdHJidWYsICJFLUFDLTMgKGVuaGFuY2VkKSIsICAgICAgIDMyKTsgYnJlYWs7CisgICAgZGVmYXVsdDogc25wcmludGYoc3RyYnVmLCAzMiwgIkVSUk9SIik7CisgICAgfQorICAgIGF2X2Rsb2coYXZjdHgsICJiaXRzdHJlYW1faWQ6ICVzICglZClcbiIsIHN0cmJ1Ziwgcy0+Yml0c3RyZWFtX2lkKTsKKyAgICBhdl9kbG9nKGF2Y3R4LCAic2FtcGxlX2ZtdDogJXNcbiIsIGF2X2dldF9zYW1wbGVfZm10X25hbWUoYXZjdHgtPnNhbXBsZV9mbXQpKTsKKyAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKHN0cmJ1ZiwgMzIsIHMtPmNoYW5uZWxzLCBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQpOworICAgIGF2X2Rsb2coYXZjdHgsICJjaGFubmVsX2xheW91dDogJXNcbiIsIHN0cmJ1Zik7CisgICAgYXZfZGxvZyhhdmN0eCwgInNhbXBsZV9yYXRlOiAlZFxuIiwgcy0+c2FtcGxlX3JhdGUpOworICAgIGF2X2Rsb2coYXZjdHgsICJiaXRfcmF0ZTogJWRcbiIsIHMtPmJpdF9yYXRlKTsKKyAgICBhdl9kbG9nKGF2Y3R4LCAiYmxvY2tzL2ZyYW1lOiAlZCAoY29kZT0lZClcbiIsIHMtPm51bV9ibG9ja3MsIHMtPm51bV9ibGtzX2NvZGUpOworICAgIGlmIChzLT5jdXRvZmYpCisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJjdXRvZmY6ICVkXG4iLCBzLT5jdXRvZmYpOworCisgICAgYXZfZGxvZyhhdmN0eCwgInBlcl9mcmFtZV9tZXRhZGF0YTogJXNcbiIsCisgICAgICAgICAgICBvcHQtPmFsbG93X3Blcl9mcmFtZV9tZXRhZGF0YT8ib24iOiJvZmYiKTsKKyAgICBpZiAocy0+aGFzX2NlbnRlcikKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgImNlbnRlcl9taXhsZXY6ICUwLjNmICglZClcbiIsIG9wdC0+Y2VudGVyX21peF9sZXZlbCwKKyAgICAgICAgICAgICAgICBzLT5jZW50ZXJfbWl4X2xldmVsKTsKKyAgICBlbHNlCisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJjZW50ZXJfbWl4bGV2OiB7bm90IHdyaXR0ZW59XG4iKTsKKyAgICBpZiAocy0+aGFzX3N1cnJvdW5kKQorICAgICAgICBhdl9kbG9nKGF2Y3R4LCAic3Vycm91bmRfbWl4bGV2OiAlMC4zZiAoJWQpXG4iLCBvcHQtPnN1cnJvdW5kX21peF9sZXZlbCwKKyAgICAgICAgICAgICAgICBzLT5zdXJyb3VuZF9taXhfbGV2ZWwpOworICAgIGVsc2UKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgInN1cnJvdW5kX21peGxldjoge25vdCB3cml0dGVufVxuIik7CisgICAgaWYgKG9wdC0+YXVkaW9fcHJvZHVjdGlvbl9pbmZvKSB7CisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJtaXhpbmdfbGV2ZWw6ICVkZEJcbiIsIG9wdC0+bWl4aW5nX2xldmVsKTsKKyAgICAgICAgc3dpdGNoIChvcHQtPnJvb21fdHlwZSkgeworICAgICAgICBjYXNlIEFDM0VOQ19PUFRfTk9UX0lORElDQVRFRDogYXZfc3RybGNweShzdHJidWYsICJub3RpbmRpY2F0ZWQiLCAzMik7IGJyZWFrOworICAgICAgICBjYXNlIEFDM0VOQ19PUFRfTEFSR0VfUk9PTTogICAgYXZfc3RybGNweShzdHJidWYsICJsYXJnZSIsIDMyKTsgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFDM0VOQ19PUFRfU01BTExfUk9PTTogICAgYXZfc3RybGNweShzdHJidWYsICJzbWFsbCIsIDMyKTsgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzbnByaW50ZihzdHJidWYsIDMyLCAiRVJST1IgKCVkKSIsIG9wdC0+cm9vbV90eXBlKTsKKyAgICAgICAgfQorICAgICAgICBhdl9kbG9nKGF2Y3R4LCAicm9vbV90eXBlOiAlc1xuIiwgc3RyYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9kbG9nKGF2Y3R4LCAibWl4aW5nX2xldmVsOiB7bm90IHdyaXR0ZW59XG4iKTsKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgInJvb21fdHlwZToge25vdCB3cml0dGVufVxuIik7CisgICAgfQorICAgIGF2X2Rsb2coYXZjdHgsICJjb3B5cmlnaHQ6ICVzXG4iLCBvcHQtPmNvcHlyaWdodD8ib24iOiJvZmYiKTsKKyAgICBhdl9kbG9nKGF2Y3R4LCAiZGlhbG5vcm06ICVkZEJcbiIsIG9wdC0+ZGlhbG9ndWVfbGV2ZWwpOworICAgIGlmIChzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8pIHsKKyAgICAgICAgc3dpdGNoIChvcHQtPmRvbGJ5X3N1cnJvdW5kX21vZGUpIHsKKyAgICAgICAgY2FzZSBBQzNFTkNfT1BUX05PVF9JTkRJQ0FURUQ6IGF2X3N0cmxjcHkoc3RyYnVmLCAibm90aW5kaWNhdGVkIiwgMzIpOyBicmVhazsKKyAgICAgICAgY2FzZSBBQzNFTkNfT1BUX01PREVfT046ICAgICAgIGF2X3N0cmxjcHkoc3RyYnVmLCAib24iLCAzMik7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQzNFTkNfT1BUX01PREVfT0ZGOiAgICAgIGF2X3N0cmxjcHkoc3RyYnVmLCAib2ZmIiwgMzIpOyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogc25wcmludGYoc3RyYnVmLCAzMiwgIkVSUk9SICglZCkiLCBvcHQtPmRvbGJ5X3N1cnJvdW5kX21vZGUpOworICAgICAgICB9CisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJkc3VyX21vZGU6ICVzXG4iLCBzdHJidWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJkc3VyX21vZGU6IHtub3Qgd3JpdHRlbn1cbiIpOworICAgIH0KKyAgICBhdl9kbG9nKGF2Y3R4LCAib3JpZ2luYWw6ICVzXG4iLCBvcHQtPm9yaWdpbmFsPyJvbiI6Im9mZiIpOworCisgICAgaWYgKHMtPmJpdHN0cmVhbV9pZCA9PSA2KSB7CisgICAgICAgIGlmIChvcHQtPmV4dGVuZGVkX2JzaV8xKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wdC0+cHJlZmVycmVkX3N0ZXJlb19kb3dubWl4KSB7CisgICAgICAgICAgICBjYXNlIEFDM0VOQ19PUFRfTk9UX0lORElDQVRFRDogYXZfc3RybGNweShzdHJidWYsICJub3RpbmRpY2F0ZWQiLCAzMik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQzNFTkNfT1BUX0RPV05NSVhfTFRSVDogIGF2X3N0cmxjcHkoc3RyYnVmLCAibHRydCIsIDMyKTsgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUMzRU5DX09QVF9ET1dOTUlYX0xPUk86ICBhdl9zdHJsY3B5KHN0cmJ1ZiwgImxvcm8iLCAzMik7ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBzbnByaW50ZihzdHJidWYsIDMyLCAiRVJST1IgKCVkKSIsIG9wdC0+cHJlZmVycmVkX3N0ZXJlb19kb3dubWl4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2Rsb2coYXZjdHgsICJkbWl4X21vZGU6ICVzXG4iLCBzdHJidWYpOworICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgImx0cnRfY21peGxldjogJTAuM2YgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgb3B0LT5sdHJ0X2NlbnRlcl9taXhfbGV2ZWwsIHMtPmx0cnRfY2VudGVyX21peF9sZXZlbCk7CisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAibHRydF9zdXJtaXhsZXY6ICUwLjNmICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgIG9wdC0+bHRydF9zdXJyb3VuZF9taXhfbGV2ZWwsIHMtPmx0cnRfc3Vycm91bmRfbWl4X2xldmVsKTsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZjdHgsICJsb3JvX2NtaXhsZXY6ICUwLjNmICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgIG9wdC0+bG9yb19jZW50ZXJfbWl4X2xldmVsLCBzLT5sb3JvX2NlbnRlcl9taXhfbGV2ZWwpOworICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgImxvcm9fc3VybWl4bGV2OiAlMC4zZiAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBvcHQtPmxvcm9fc3Vycm91bmRfbWl4X2xldmVsLCBzLT5sb3JvX3N1cnJvdW5kX21peF9sZXZlbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiZXh0ZW5kZWQgYml0c3RyZWFtIGluZm8gMToge25vdCB3cml0dGVufVxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wdC0+ZXh0ZW5kZWRfYnNpXzIpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3B0LT5kb2xieV9zdXJyb3VuZF9leF9tb2RlKSB7CisgICAgICAgICAgICBjYXNlIEFDM0VOQ19PUFRfTk9UX0lORElDQVRFRDogYXZfc3RybGNweShzdHJidWYsICJub3RpbmRpY2F0ZWQiLCAzMik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQzNFTkNfT1BUX01PREVfT046ICAgICAgIGF2X3N0cmxjcHkoc3RyYnVmLCAib24iLCAzMik7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUMzRU5DX09QVF9NT0RFX09GRjogICAgICBhdl9zdHJsY3B5KHN0cmJ1ZiwgIm9mZiIsIDMyKTsgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBzbnByaW50ZihzdHJidWYsIDMyLCAiRVJST1IgKCVkKSIsIG9wdC0+ZG9sYnlfc3Vycm91bmRfZXhfbW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiZHN1cmV4X21vZGU6ICVzXG4iLCBzdHJidWYpOworICAgICAgICAgICAgc3dpdGNoIChvcHQtPmRvbGJ5X2hlYWRwaG9uZV9tb2RlKSB7CisgICAgICAgICAgICBjYXNlIEFDM0VOQ19PUFRfTk9UX0lORElDQVRFRDogYXZfc3RybGNweShzdHJidWYsICJub3RpbmRpY2F0ZWQiLCAzMik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQzNFTkNfT1BUX01PREVfT046ICAgICAgIGF2X3N0cmxjcHkoc3RyYnVmLCAib24iLCAzMik7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUMzRU5DX09QVF9NT0RFX09GRjogICAgICBhdl9zdHJsY3B5KHN0cmJ1ZiwgIm9mZiIsIDMyKTsgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBzbnByaW50ZihzdHJidWYsIDMyLCAiRVJST1IgKCVkKSIsIG9wdC0+ZG9sYnlfaGVhZHBob25lX21vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgImRoZWFkcGhvbmVfbW9kZTogJXNcbiIsIHN0cmJ1Zik7CisKKyAgICAgICAgICAgIHN3aXRjaCAob3B0LT5hZF9jb252ZXJ0ZXJfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBBQzNFTkNfT1BUX0FEQ09OVl9TVEFOREFSRDogYXZfc3RybGNweShzdHJidWYsICJzdGFuZGFyZCIsIDMyKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFDM0VOQ19PUFRfQURDT05WX0hEQ0Q6ICAgICBhdl9zdHJsY3B5KHN0cmJ1ZiwgImhkY2QiLCAzMik7ICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHNucHJpbnRmKHN0cmJ1ZiwgMzIsICJFUlJPUiAoJWQpIiwgb3B0LT5hZF9jb252ZXJ0ZXJfdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiYWRfY29udl90eXBlOiAlc1xuIiwgc3RyYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZjdHgsICJleHRlbmRlZCBiaXRzdHJlYW0gaW5mbyAyOiB7bm90IHdyaXR0ZW59XG4iKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfQorCisKKyNkZWZpbmUgRkxUX09QVElPTl9USFJFU0hPTEQgMC4wMQorCitzdGF0aWMgaW50IHZhbGlkYXRlX2Zsb2F0X29wdGlvbihmbG9hdCB2LCBjb25zdCBmbG9hdCAqdl9saXN0LCBpbnQgdl9saXN0X3NpemUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdl9saXN0X3NpemU7IGkrKykgeworICAgICAgICBpZiAodiA8ICh2X2xpc3RbaV0gKyBGTFRfT1BUSU9OX1RIUkVTSE9MRCkgJiYKKyAgICAgICAgICAgIHYgPiAodl9saXN0W2ldIC0gRkxUX09QVElPTl9USFJFU0hPTEQpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IHZfbGlzdF9zaXplKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gaTsKK30KKworCitzdGF0aWMgdm9pZCB2YWxpZGF0ZV9taXhfbGV2ZWwodm9pZCAqbG9nX2N0eCwgY29uc3QgY2hhciAqb3B0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm9wdF9wYXJhbSwgY29uc3QgZmxvYXQgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpc3Rfc2l6ZSwgaW50IGRlZmF1bHRfdmFsdWUsIGludCBtaW5fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjdHhfcGFyYW0pCit7CisgICAgaW50IG1peGxldiA9IHZhbGlkYXRlX2Zsb2F0X29wdGlvbigqb3B0X3BhcmFtLCBsaXN0LCBsaXN0X3NpemUpOworICAgIGlmIChtaXhsZXYgPCBtaW5fdmFsdWUpIHsKKyAgICAgICAgbWl4bGV2ID0gZGVmYXVsdF92YWx1ZTsKKyAgICAgICAgaWYgKCpvcHRfcGFyYW0gPj0gMC4wKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX1dBUk5JTkcsICJyZXF1ZXN0ZWQgJXMgaXMgbm90IHZhbGlkLiB1c2luZyAiCisgICAgICAgICAgICAgICAgICAgImRlZmF1bHQgdmFsdWU6ICUwLjNmXG4iLCBvcHRfbmFtZSwgbGlzdFttaXhsZXZdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqb3B0X3BhcmFtID0gbGlzdFttaXhsZXZdOworICAgICpjdHhfcGFyYW0gPSBtaXhsZXY7Cit9CisKKworLyoqCisgKiBWYWxpZGF0ZSBtZXRhZGF0YSBvcHRpb25zIGFzIHNldCBieSBBVk9wdGlvbiBzeXN0ZW0uCisgKiBUaGVzZSB2YWx1ZXMgY2FuIG9wdGlvbmFsbHkgYmUgY2hhbmdlZCBwZXItZnJhbWUuCisgKgorICogQHBhcmFtIHMgIEFDLTMgZW5jb2RlciBwcml2YXRlIGNvbnRleHQKKyAqLworaW50IGZmX2FjM192YWxpZGF0ZV9tZXRhZGF0YShBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPmF2Y3R4OworICAgIEFDM0VuY09wdGlvbnMgKm9wdCA9ICZzLT5vcHRpb25zOworCisgICAgb3B0LT5hdWRpb19wcm9kdWN0aW9uX2luZm8gPSAwOworICAgIG9wdC0+ZXh0ZW5kZWRfYnNpXzEgICAgICAgID0gMDsKKyAgICBvcHQtPmV4dGVuZGVkX2JzaV8yICAgICAgICA9IDA7CisgICAgb3B0LT5lYWMzX21peGluZ19tZXRhZGF0YSAgPSAwOworICAgIG9wdC0+ZWFjM19pbmZvX21ldGFkYXRhICAgID0gMDsKKworICAgIC8qIGRldGVybWluZSBtaXhpbmcgbWV0YWRhdGEgLyB4YnNpMSB1c2UgKi8KKyAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID4gQUMzX0NITU9ERV9TVEVSRU8gJiYgb3B0LT5wcmVmZXJyZWRfc3RlcmVvX2Rvd25taXggIT0gQUMzRU5DX09QVF9OT05FKSB7CisgICAgICAgIG9wdC0+ZXh0ZW5kZWRfYnNpXzEgICAgICAgPSAxOworICAgICAgICBvcHQtPmVhYzNfbWl4aW5nX21ldGFkYXRhID0gMTsKKyAgICB9CisgICAgaWYgKHMtPmhhc19jZW50ZXIgJiYKKyAgICAgICAgKG9wdC0+bHRydF9jZW50ZXJfbWl4X2xldmVsID49IDAgfHwgb3B0LT5sb3JvX2NlbnRlcl9taXhfbGV2ZWwgPj0gMCkpIHsKKyAgICAgICAgb3B0LT5leHRlbmRlZF9ic2lfMSAgICAgICA9IDE7CisgICAgICAgIG9wdC0+ZWFjM19taXhpbmdfbWV0YWRhdGEgPSAxOworICAgIH0KKyAgICBpZiAocy0+aGFzX3N1cnJvdW5kICYmCisgICAgICAgIChvcHQtPmx0cnRfc3Vycm91bmRfbWl4X2xldmVsID49IDAgfHwgb3B0LT5sb3JvX3N1cnJvdW5kX21peF9sZXZlbCA+PSAwKSkgeworICAgICAgICBvcHQtPmV4dGVuZGVkX2JzaV8xICAgICAgID0gMTsKKyAgICAgICAgb3B0LT5lYWMzX21peGluZ19tZXRhZGF0YSA9IDE7CisgICAgfQorCisgICAgaWYgKHMtPmVhYzMpIHsKKyAgICAgICAgLyogZGV0ZXJtaW5lIGluZm8gbWV0YWRhdGEgdXNlICovCisgICAgICAgIGlmIChhdmN0eC0+YXVkaW9fc2VydmljZV90eXBlICE9IEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9NQUlOKQorICAgICAgICAgICAgb3B0LT5lYWMzX2luZm9fbWV0YWRhdGEgPSAxOworICAgICAgICBpZiAob3B0LT5jb3B5cmlnaHQgIT0gQUMzRU5DX09QVF9OT05FIHx8IG9wdC0+b3JpZ2luYWwgIT0gQUMzRU5DX09QVF9OT05FKQorICAgICAgICAgICAgb3B0LT5lYWMzX2luZm9fbWV0YWRhdGEgPSAxOworICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID09IEFDM19DSE1PREVfU1RFUkVPICYmCisgICAgICAgICAgICAob3B0LT5kb2xieV9oZWFkcGhvbmVfbW9kZSAhPSBBQzNFTkNfT1BUX05PTkUgfHwgb3B0LT5kb2xieV9zdXJyb3VuZF9tb2RlICE9IEFDM0VOQ19PUFRfTk9ORSkpCisgICAgICAgICAgICBvcHQtPmVhYzNfaW5mb19tZXRhZGF0YSA9IDE7CisgICAgICAgIGlmIChzLT5jaGFubmVsX21vZGUgPj0gQUMzX0NITU9ERV8yRjJSICYmIG9wdC0+ZG9sYnlfc3Vycm91bmRfZXhfbW9kZSAhPSBBQzNFTkNfT1BUX05PTkUpCisgICAgICAgICAgICBvcHQtPmVhYzNfaW5mb19tZXRhZGF0YSA9IDE7CisgICAgICAgIGlmIChvcHQtPm1peGluZ19sZXZlbCAhPSBBQzNFTkNfT1BUX05PTkUgfHwgb3B0LT5yb29tX3R5cGUgIT0gQUMzRU5DX09QVF9OT05FIHx8CisgICAgICAgICAgICBvcHQtPmFkX2NvbnZlcnRlcl90eXBlICE9IEFDM0VOQ19PUFRfTk9ORSkgeworICAgICAgICAgICAgb3B0LT5hdWRpb19wcm9kdWN0aW9uX2luZm8gPSAxOworICAgICAgICAgICAgb3B0LT5lYWMzX2luZm9fbWV0YWRhdGEgICAgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZGV0ZXJtaW5lIGF1ZGlvIHByb2R1Y3Rpb24gaW5mbyB1c2UgKi8KKyAgICAgICAgaWYgKG9wdC0+bWl4aW5nX2xldmVsICE9IEFDM0VOQ19PUFRfTk9ORSB8fCBvcHQtPnJvb21fdHlwZSAhPSBBQzNFTkNfT1BUX05PTkUpCisgICAgICAgICAgICBvcHQtPmF1ZGlvX3Byb2R1Y3Rpb25faW5mbyA9IDE7CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIHhic2kyIHVzZSAqLworICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID49IEFDM19DSE1PREVfMkYyUiAmJiBvcHQtPmRvbGJ5X3N1cnJvdW5kX2V4X21vZGUgIT0gQUMzRU5DX09QVF9OT05FKQorICAgICAgICAgICAgb3B0LT5leHRlbmRlZF9ic2lfMiA9IDE7CisgICAgICAgIGlmIChzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8gJiYgb3B0LT5kb2xieV9oZWFkcGhvbmVfbW9kZSAhPSBBQzNFTkNfT1BUX05PTkUpCisgICAgICAgICAgICBvcHQtPmV4dGVuZGVkX2JzaV8yID0gMTsKKyAgICAgICAgaWYgKG9wdC0+YWRfY29udmVydGVyX3R5cGUgIT0gQUMzRU5DX09QVF9OT05FKQorICAgICAgICAgICAgb3B0LT5leHRlbmRlZF9ic2lfMiA9IDE7CisgICAgfQorCisgICAgLyogdmFsaWRhdGUgQUMtMyBtaXhpbmcgbGV2ZWxzICovCisgICAgaWYgKCFzLT5lYWMzKSB7CisgICAgICAgIGlmIChzLT5oYXNfY2VudGVyKSB7CisgICAgICAgICAgICB2YWxpZGF0ZV9taXhfbGV2ZWwoYXZjdHgsICJjZW50ZXJfbWl4X2xldmVsIiwgJm9wdC0+Y2VudGVyX21peF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWl4bGV2X29wdGlvbnMsIENNSVhMRVZfTlVNX09QVElPTlMsIDEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmNlbnRlcl9taXhfbGV2ZWwpOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5oYXNfc3Vycm91bmQpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlX21peF9sZXZlbChhdmN0eCwgInN1cnJvdW5kX21peF9sZXZlbCIsICZvcHQtPnN1cnJvdW5kX21peF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJtaXhsZXZfb3B0aW9ucywgU1VSTUlYTEVWX05VTV9PUFRJT05TLCAxLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5zdXJyb3VuZF9taXhfbGV2ZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogdmFsaWRhdGUgZXh0ZW5kZWQgYnNpIDEgLyBtaXhpbmcgbWV0YWRhdGEgKi8KKyAgICBpZiAob3B0LT5leHRlbmRlZF9ic2lfMSB8fCBvcHQtPmVhYzNfbWl4aW5nX21ldGFkYXRhKSB7CisgICAgICAgIC8qIGRlZmF1bHQgcHJlZmVycmVkIHN0ZXJlbyBkb3dubWl4ICovCisgICAgICAgIGlmIChvcHQtPnByZWZlcnJlZF9zdGVyZW9fZG93bm1peCA9PSBBQzNFTkNfT1BUX05PTkUpCisgICAgICAgICAgICBvcHQtPnByZWZlcnJlZF9zdGVyZW9fZG93bm1peCA9IEFDM0VOQ19PUFRfTk9UX0lORElDQVRFRDsKKyAgICAgICAgaWYgKCFzLT5lYWMzIHx8IHMtPmhhc19jZW50ZXIpIHsKKyAgICAgICAgICAgIC8qIHZhbGlkYXRlIEx0L1J0IGNlbnRlciBtaXggbGV2ZWwgKi8KKyAgICAgICAgICAgIHZhbGlkYXRlX21peF9sZXZlbChhdmN0eCwgImx0cnRfY2VudGVyX21peF9sZXZlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdC0+bHRydF9jZW50ZXJfbWl4X2xldmVsLCBleHRtaXhsZXZfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRNSVhMRVZfTlVNX09QVElPTlMsIDUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmx0cnRfY2VudGVyX21peF9sZXZlbCk7CisgICAgICAgICAgICAvKiB2YWxpZGF0ZSBMby9SbyBjZW50ZXIgbWl4IGxldmVsICovCisgICAgICAgICAgICB2YWxpZGF0ZV9taXhfbGV2ZWwoYXZjdHgsICJsb3JvX2NlbnRlcl9taXhfbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHQtPmxvcm9fY2VudGVyX21peF9sZXZlbCwgZXh0bWl4bGV2X29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUTUlYTEVWX05VTV9PUFRJT05TLCA1LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5sb3JvX2NlbnRlcl9taXhfbGV2ZWwpOworICAgICAgICB9CisgICAgICAgIGlmICghcy0+ZWFjMyB8fCBzLT5oYXNfc3Vycm91bmQpIHsKKyAgICAgICAgICAgIC8qIHZhbGlkYXRlIEx0L1J0IHN1cnJvdW5kIG1peCBsZXZlbCAqLworICAgICAgICAgICAgdmFsaWRhdGVfbWl4X2xldmVsKGF2Y3R4LCAibHRydF9zdXJyb3VuZF9taXhfbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHQtPmx0cnRfc3Vycm91bmRfbWl4X2xldmVsLCBleHRtaXhsZXZfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRNSVhMRVZfTlVNX09QVElPTlMsIDYsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmx0cnRfc3Vycm91bmRfbWl4X2xldmVsKTsKKyAgICAgICAgICAgIC8qIHZhbGlkYXRlIExvL1JvIHN1cnJvdW5kIG1peCBsZXZlbCAqLworICAgICAgICAgICAgdmFsaWRhdGVfbWl4X2xldmVsKGF2Y3R4LCAibG9yb19zdXJyb3VuZF9taXhfbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHQtPmxvcm9fc3Vycm91bmRfbWl4X2xldmVsLCBleHRtaXhsZXZfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRNSVhMRVZfTlVNX09QVElPTlMsIDYsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmxvcm9fc3Vycm91bmRfbWl4X2xldmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHZhbGlkYXRlIGF1ZGlvIHNlcnZpY2UgdHlwZSAvIGNoYW5uZWxzIGNvbWJpbmF0aW9uICovCisgICAgaWYgKChhdmN0eC0+YXVkaW9fc2VydmljZV90eXBlID09IEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9LQVJBT0tFICYmCisgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgPT0gMSkgfHwKKyAgICAgICAgKChhdmN0eC0+YXVkaW9fc2VydmljZV90eXBlID09IEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9DT01NRU5UQVJZIHx8CisgICAgICAgICAgYXZjdHgtPmF1ZGlvX3NlcnZpY2VfdHlwZSA9PSBBVl9BVURJT19TRVJWSUNFX1RZUEVfRU1FUkdFTkNZICB8fAorICAgICAgICAgIGF2Y3R4LT5hdWRpb19zZXJ2aWNlX3R5cGUgPT0gQVZfQVVESU9fU0VSVklDRV9UWVBFX1ZPSUNFX09WRVIpCisgICAgICAgICAmJiBhdmN0eC0+Y2hhbm5lbHMgPiAxKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgYXVkaW8gc2VydmljZSB0eXBlIGZvciB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWNpZmllZCBudW1iZXIgb2YgY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8qIHZhbGlkYXRlIGV4dGVuZGVkIGJzaSAyIC8gaW5mbyBtZXRhZGF0YSAqLworICAgIGlmIChvcHQtPmV4dGVuZGVkX2JzaV8yIHx8IG9wdC0+ZWFjM19pbmZvX21ldGFkYXRhKSB7CisgICAgICAgIC8qIGRlZmF1bHQgZG9sYnkgaGVhZHBob25lIG1vZGUgKi8KKyAgICAgICAgaWYgKG9wdC0+ZG9sYnlfaGVhZHBob25lX21vZGUgPT0gQUMzRU5DX09QVF9OT05FKQorICAgICAgICAgICAgb3B0LT5kb2xieV9oZWFkcGhvbmVfbW9kZSA9IEFDM0VOQ19PUFRfTk9UX0lORElDQVRFRDsKKyAgICAgICAgLyogZGVmYXVsdCBkb2xieSBzdXJyb3VuZCBleCBtb2RlICovCisgICAgICAgIGlmIChvcHQtPmRvbGJ5X3N1cnJvdW5kX2V4X21vZGUgPT0gQUMzRU5DX09QVF9OT05FKQorICAgICAgICAgICAgb3B0LT5kb2xieV9zdXJyb3VuZF9leF9tb2RlID0gQUMzRU5DX09QVF9OT1RfSU5ESUNBVEVEOworICAgICAgICAvKiBkZWZhdWx0IEEvRCBjb252ZXJ0ZXIgdHlwZSAqLworICAgICAgICBpZiAob3B0LT5hZF9jb252ZXJ0ZXJfdHlwZSA9PSBBQzNFTkNfT1BUX05PTkUpCisgICAgICAgICAgICBvcHQtPmFkX2NvbnZlcnRlcl90eXBlID0gQUMzRU5DX09QVF9BRENPTlZfU1RBTkRBUkQ7CisgICAgfQorCisgICAgLyogY29weXJpZ2h0ICYgb3JpZ2luYWwgZGVmYXVsdHMgKi8KKyAgICBpZiAoIXMtPmVhYzMgfHwgb3B0LT5lYWMzX2luZm9fbWV0YWRhdGEpIHsKKyAgICAgICAgLyogZGVmYXVsdCBjb3B5cmlnaHQgKi8KKyAgICAgICAgaWYgKG9wdC0+Y29weXJpZ2h0ID09IEFDM0VOQ19PUFRfTk9ORSkKKyAgICAgICAgICAgIG9wdC0+Y29weXJpZ2h0ID0gQUMzRU5DX09QVF9PRkY7CisgICAgICAgIC8qIGRlZmF1bHQgb3JpZ2luYWwgKi8KKyAgICAgICAgaWYgKG9wdC0+b3JpZ2luYWwgPT0gQUMzRU5DX09QVF9OT05FKQorICAgICAgICAgICAgb3B0LT5vcmlnaW5hbCA9IEFDM0VOQ19PUFRfT047CisgICAgfQorCisgICAgLyogZG9sYnkgc3Vycm91bmQgbW9kZSBkZWZhdWx0ICovCisgICAgaWYgKCFzLT5lYWMzIHx8IG9wdC0+ZWFjM19pbmZvX21ldGFkYXRhKSB7CisgICAgICAgIGlmIChvcHQtPmRvbGJ5X3N1cnJvdW5kX21vZGUgPT0gQUMzRU5DX09QVF9OT05FKQorICAgICAgICAgICAgb3B0LT5kb2xieV9zdXJyb3VuZF9tb2RlID0gQUMzRU5DX09QVF9OT1RfSU5ESUNBVEVEOworICAgIH0KKworICAgIC8qIHZhbGlkYXRlIGF1ZGlvIHByb2R1Y3Rpb24gaW5mbyAqLworICAgIGlmIChvcHQtPmF1ZGlvX3Byb2R1Y3Rpb25faW5mbykgeworICAgICAgICBpZiAob3B0LT5taXhpbmdfbGV2ZWwgPT0gQUMzRU5DX09QVF9OT05FKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1peGluZ19sZXZlbCBtdXN0IGJlIHNldCBpZiAiCisgICAgICAgICAgICAgICAgICAgInJvb21fdHlwZSBpcyBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3B0LT5taXhpbmdfbGV2ZWwgPCA4MCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG1peGluZyBsZXZlbC4gbXVzdCBiZSBiZXR3ZWVuICIKKyAgICAgICAgICAgICAgICAgICAiODBkQiBhbmQgMTExZEJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICAvKiBkZWZhdWx0IHJvb20gdHlwZSAqLworICAgICAgICBpZiAob3B0LT5yb29tX3R5cGUgPT0gQUMzRU5DX09QVF9OT05FKQorICAgICAgICAgICAgb3B0LT5yb29tX3R5cGUgPSBBQzNFTkNfT1BUX05PVF9JTkRJQ0FURUQ7CisgICAgfQorCisgICAgLyogc2V0IGJpdHN0cmVhbSBpZCBmb3IgYWx0ZXJuYXRlIGJpdHN0cmVhbSBzeW50YXggKi8KKyAgICBpZiAoIXMtPmVhYzMgJiYgKG9wdC0+ZXh0ZW5kZWRfYnNpXzEgfHwgb3B0LT5leHRlbmRlZF9ic2lfMikpIHsKKyAgICAgICAgaWYgKHMtPmJpdHN0cmVhbV9pZCA+IDggJiYgcy0+Yml0c3RyZWFtX2lkIDwgMTEpIHsKKyAgICAgICAgICAgIHN0YXRpYyBpbnQgd2Fybl9vbmNlID0gMTsKKyAgICAgICAgICAgIGlmICh3YXJuX29uY2UpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiYWx0ZXJuYXRlIGJpdHN0cmVhbSBzeW50YXggaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAibm90IGNvbXBhdGlibGUgd2l0aCByZWR1Y2VkIHNhbXBsZXJhdGVzLiB3cml0aW5nIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgImV4dGVuZGVkIGJpdHN0cmVhbSBpbmZvcm1hdGlvbiB3aWxsIGJlIGRpc2FibGVkLlxuIik7CisgICAgICAgICAgICAgICAgd2Fybl9vbmNlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPmJpdHN0cmVhbV9pZCA9IDY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIEZpbmFsaXplIGVuY29kaW5nIGFuZCBmcmVlIGFueSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBlbmNvZGVyLgorICoKKyAqIEBwYXJhbSBhdmN0eCAgQ29kZWMgY29udGV4dAorICovCithdl9jb2xkIGludCBmZl9hYzNfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgYmxrLCBjaDsKKyAgICBBQzNFbmNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZzLT53aW5kb3dlZF9zYW1wbGVzKTsKKyAgICBpZiAocy0+cGxhbmFyX3NhbXBsZXMpCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgIGF2X2ZyZWVwKCZzLT5wbGFuYXJfc2FtcGxlc1tjaF0pOworICAgIGF2X2ZyZWVwKCZzLT5wbGFuYXJfc2FtcGxlcyk7CisgICAgYXZfZnJlZXAoJnMtPmJhcF9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5iYXAxX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPm1kY3RfY29lZl9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5maXhlZF9jb2VmX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPmV4cF9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5ncm91cGVkX2V4cF9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5wc2RfYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmcy0+YmFuZF9wc2RfYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmcy0+bWFza19idWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5xbWFudF9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5jcGxfY29vcmRfZXhwX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPmNwbF9jb29yZF9tYW50X2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPmZkc3ApOworICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspIHsKKyAgICAgICAgQUMzQmxvY2sgKmJsb2NrID0gJnMtPmJsb2Nrc1tibGtdOworICAgICAgICBhdl9mcmVlcCgmYmxvY2stPm1kY3RfY29lZik7CisgICAgICAgIGF2X2ZyZWVwKCZibG9jay0+Zml4ZWRfY29lZik7CisgICAgICAgIGF2X2ZyZWVwKCZibG9jay0+ZXhwKTsKKyAgICAgICAgYXZfZnJlZXAoJmJsb2NrLT5ncm91cGVkX2V4cCk7CisgICAgICAgIGF2X2ZyZWVwKCZibG9jay0+cHNkKTsKKyAgICAgICAgYXZfZnJlZXAoJmJsb2NrLT5iYW5kX3BzZCk7CisgICAgICAgIGF2X2ZyZWVwKCZibG9jay0+bWFzayk7CisgICAgICAgIGF2X2ZyZWVwKCZibG9jay0+cW1hbnQpOworICAgICAgICBhdl9mcmVlcCgmYmxvY2stPmNwbF9jb29yZF9leHApOworICAgICAgICBhdl9mcmVlcCgmYmxvY2stPmNwbF9jb29yZF9tYW50KTsKKyAgICB9CisKKyAgICBzLT5tZGN0X2VuZChzKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBTZXQgY2hhbm5lbCBpbmZvcm1hdGlvbiBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBzZXRfY2hhbm5lbF9pbmZvKEFDM0VuY29kZUNvbnRleHQgKnMsIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpjaGFubmVsX2xheW91dCkKK3sKKyAgICBpbnQgY2hfbGF5b3V0OworCisgICAgaWYgKGNoYW5uZWxzIDwgMSB8fCBjaGFubmVscyA+IEFDM19NQVhfQ0hBTk5FTFMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKCpjaGFubmVsX2xheW91dCA+IDB4N0ZGKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGNoX2xheW91dCA9ICpjaGFubmVsX2xheW91dDsKKyAgICBpZiAoIWNoX2xheW91dCkKKyAgICAgICAgY2hfbGF5b3V0ID0gYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQoY2hhbm5lbHMpOworCisgICAgcy0+bGZlX29uICAgICAgID0gISEoY2hfbGF5b3V0ICYgQVZfQ0hfTE9XX0ZSRVFVRU5DWSk7CisgICAgcy0+Y2hhbm5lbHMgICAgID0gY2hhbm5lbHM7CisgICAgcy0+ZmJ3X2NoYW5uZWxzID0gY2hhbm5lbHMgLSBzLT5sZmVfb247CisgICAgcy0+bGZlX2NoYW5uZWwgID0gcy0+bGZlX29uID8gcy0+ZmJ3X2NoYW5uZWxzICsgMSA6IC0xOworICAgIGlmIChzLT5sZmVfb24pCisgICAgICAgIGNoX2xheW91dCAtPSBBVl9DSF9MT1dfRlJFUVVFTkNZOworCisgICAgc3dpdGNoIChjaF9sYXlvdXQpIHsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF9NT05POiAgICAgICAgICAgcy0+Y2hhbm5lbF9tb2RlID0gQUMzX0NITU9ERV9NT05POyAgIGJyZWFrOworICAgIGNhc2UgQVZfQ0hfTEFZT1VUX1NURVJFTzogICAgICAgICBzLT5jaGFubmVsX21vZGUgPSBBQzNfQ0hNT0RFX1NURVJFTzsgYnJlYWs7CisgICAgY2FzZSBBVl9DSF9MQVlPVVRfU1VSUk9VTkQ6ICAgICAgIHMtPmNoYW5uZWxfbW9kZSA9IEFDM19DSE1PREVfM0Y7ICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF8yXzE6ICAgICAgICAgICAgcy0+Y2hhbm5lbF9tb2RlID0gQUMzX0NITU9ERV8yRjFSOyAgIGJyZWFrOworICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzRQT0lOVDA6ICAgICAgICBzLT5jaGFubmVsX21vZGUgPSBBQzNfQ0hNT0RFXzNGMVI7ICAgYnJlYWs7CisgICAgY2FzZSBBVl9DSF9MQVlPVVRfUVVBRDoKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF8yXzI6ICAgICAgICAgICAgcy0+Y2hhbm5lbF9tb2RlID0gQUMzX0NITU9ERV8yRjJSOyAgIGJyZWFrOworICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzVQT0lOVDA6CisgICAgY2FzZSBBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLOiAgIHMtPmNoYW5uZWxfbW9kZSA9IEFDM19DSE1PREVfM0YyUjsgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBzLT5oYXNfY2VudGVyICAgPSAocy0+Y2hhbm5lbF9tb2RlICYgMHgwMSkgJiYgcy0+Y2hhbm5lbF9tb2RlICE9IEFDM19DSE1PREVfTU9OTzsKKyAgICBzLT5oYXNfc3Vycm91bmQgPSAgcy0+Y2hhbm5lbF9tb2RlICYgMHgwNDsKKworICAgIHMtPmNoYW5uZWxfbWFwICA9IGZmX2FjM19lbmNfY2hhbm5lbF9tYXBbcy0+Y2hhbm5lbF9tb2RlXVtzLT5sZmVfb25dOworICAgICpjaGFubmVsX2xheW91dCA9IGNoX2xheW91dDsKKyAgICBpZiAocy0+bGZlX29uKQorICAgICAgICAqY2hhbm5lbF9sYXlvdXQgfD0gQVZfQ0hfTE9XX0ZSRVFVRU5DWTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBhdl9jb2xkIGludCB2YWxpZGF0ZV9vcHRpb25zKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gcy0+YXZjdHg7CisgICAgaW50IGksIHJldCwgbWF4X3NyOworCisgICAgLyogdmFsaWRhdGUgY2hhbm5lbCBsYXlvdXQgKi8KKyAgICBpZiAoIWF2Y3R4LT5jaGFubmVsX2xheW91dCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiTm8gY2hhbm5lbCBsYXlvdXQgc3BlY2lmaWVkLiBUaGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RlciB3aWxsIGd1ZXNzIHRoZSBsYXlvdXQsIGJ1dCBpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaWdodCBiZSBpbmNvcnJlY3QuXG4iKTsKKyAgICB9CisgICAgcmV0ID0gc2V0X2NoYW5uZWxfaW5mbyhzLCBhdmN0eC0+Y2hhbm5lbHMsICZhdmN0eC0+Y2hhbm5lbF9sYXlvdXQpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGNoYW5uZWwgbGF5b3V0XG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiB2YWxpZGF0ZSBzYW1wbGUgcmF0ZSAqLworICAgIC8qIG5vdGU6IG1heF9zciBjb3VsZCBiZSBjaGFuZ2VkIGZyb20gMiB0byA1IGZvciBFLUFDLTMgb25jZSB3ZSBmaW5kIGEKKyAgICAgICAgICAgICBkZWNvZGVyIHRoYXQgc3VwcG9ydHMgaGFsZiBzYW1wbGUgcmF0ZSBzbyB3ZSBjYW4gdmFsaWRhdGUgdGhhdAorICAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgZmlsZXMgYXJlIGNvcnJlY3QuICovCisgICAgbWF4X3NyID0gcy0+ZWFjMyA/IDIgOiA4OworICAgIGZvciAoaSA9IDA7IGkgPD0gbWF4X3NyOyBpKyspIHsKKyAgICAgICAgaWYgKChmZl9hYzNfc2FtcGxlX3JhdGVfdGFiW2kgJSAzXSA+PiAoaSAvIDMpKSA9PSBhdmN0eC0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPiBtYXhfc3IpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHNhbXBsZSByYXRlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcy0+c2FtcGxlX3JhdGUgICAgICAgID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIHMtPmJpdF9hbGxvYy5zcl9zaGlmdCA9IGkgLyAzOworICAgIHMtPmJpdF9hbGxvYy5zcl9jb2RlICA9IGkgJSAzOworICAgIHMtPmJpdHN0cmVhbV9pZCAgICAgICA9IHMtPmVhYzMgPyAxNiA6IDggKyBzLT5iaXRfYWxsb2Muc3Jfc2hpZnQ7CisKKyAgICAvKiBzZWxlY3QgYSBkZWZhdWx0IGJpdCByYXRlIGlmIG5vdCBzZXQgYnkgdGhlIHVzZXIgKi8KKyAgICBpZiAoIWF2Y3R4LT5iaXRfcmF0ZSkgeworICAgICAgICBzd2l0Y2ggKHMtPmZid19jaGFubmVscykgeworICAgICAgICBjYXNlIDE6IGF2Y3R4LT5iaXRfcmF0ZSA9ICA5NjAwMDsgYnJlYWs7CisgICAgICAgIGNhc2UgMjogYXZjdHgtPmJpdF9yYXRlID0gMTkyMDAwOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBhdmN0eC0+Yml0X3JhdGUgPSAzMjAwMDA7IGJyZWFrOworICAgICAgICBjYXNlIDQ6IGF2Y3R4LT5iaXRfcmF0ZSA9IDM4NDAwMDsgYnJlYWs7CisgICAgICAgIGNhc2UgNTogYXZjdHgtPmJpdF9yYXRlID0gNDQ4MDAwOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHZhbGlkYXRlIGJpdCByYXRlICovCisgICAgaWYgKHMtPmVhYzMpIHsKKyAgICAgICAgaW50IG1heF9iciwgbWluX2JyLCB3cGYsIG1pbl9icl9kaXN0LCBtaW5fYnJfY29kZTsKKyAgICAgICAgaW50IG51bV9ibGtzX2NvZGUsIG51bV9ibG9ja3MsIGZyYW1lX3NhbXBsZXM7CisKKyAgICAgICAgLyogY2FsY3VsYXRlIG1pbi9tYXggYml0cmF0ZSAqLworICAgICAgICAvKiBUT0RPOiBNb3JlIHRlc3Rpbmcgd2l0aCAzIGFuZCAyIGJsb2Nrcy4gQWxsIEUtQUMtMyBzYW1wbGVzIEkndmUKKyAgICAgICAgICAgICAgICAgZm91bmQgdXNlIGVpdGhlciA2IGJsb2NrcyBvciAxIGJsb2NrLCBldmVuIHRob3VnaCAyIG9yIDMgYmxvY2tzCisgICAgICAgICAgICAgICAgIHdvdWxkIHdvcmsgYXMgZmFyIGFzIHRoZSBiaXQgcmF0ZSBpcyBjb25jZXJuZWQuICovCisgICAgICAgIGZvciAobnVtX2Jsa3NfY29kZSA9IDM7IG51bV9ibGtzX2NvZGUgPj0gMDsgbnVtX2Jsa3NfY29kZS0tKSB7CisgICAgICAgICAgICBudW1fYmxvY2tzID0gKChpbnRbXSl7IDEsIDIsIDMsIDYgfSlbbnVtX2Jsa3NfY29kZV07CisgICAgICAgICAgICBmcmFtZV9zYW1wbGVzICA9IEFDM19CTE9DS19TSVpFICogbnVtX2Jsb2NrczsKKyAgICAgICAgICAgIG1heF9iciA9IDIwNDggKiBzLT5zYW1wbGVfcmF0ZSAvIGZyYW1lX3NhbXBsZXMgKiAxNjsKKyAgICAgICAgICAgIG1pbl9iciA9ICgocy0+c2FtcGxlX3JhdGUgKyAoZnJhbWVfc2FtcGxlcy0xKSkgLyBmcmFtZV9zYW1wbGVzKSAqIDE2OworICAgICAgICAgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA8PSBtYXhfYnIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA8IG1pbl9iciB8fCBhdmN0eC0+Yml0X3JhdGUgPiBtYXhfYnIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBiaXQgcmF0ZS4gbXVzdCBiZSAlZCB0byAlZCAiCisgICAgICAgICAgICAgICAgICAgImZvciB0aGlzIHNhbXBsZSByYXRlXG4iLCBtaW5fYnIsIG1heF9icik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIHMtPm51bV9ibGtzX2NvZGUgPSBudW1fYmxrc19jb2RlOworICAgICAgICBzLT5udW1fYmxvY2tzICAgID0gbnVtX2Jsb2NrczsKKworICAgICAgICAvKiBjYWxjdWxhdGUgd29yZHMtcGVyLWZyYW1lIGZvciB0aGUgc2VsZWN0ZWQgYml0cmF0ZSAqLworICAgICAgICB3cGYgPSAoYXZjdHgtPmJpdF9yYXRlIC8gMTYpICogZnJhbWVfc2FtcGxlcyAvIHMtPnNhbXBsZV9yYXRlOworICAgICAgICBhdl9hc3NlcnQxKHdwZiA+IDAgJiYgd3BmIDw9IDIwNDgpOworCisgICAgICAgIC8qIGZpbmQgdGhlIGNsb3Nlc3QgQUMtMyBiaXRyYXRlIGNvZGUgdG8gdGhlIHNlbGVjdGVkIGJpdHJhdGUuCisgICAgICAgICAgIHRoaXMgaXMgbmVlZGVkIGZvciBsb29rdXAgdGFibGVzIGZvciBiYW5kd2lkdGggYW5kIGNvdXBsaW5nCisgICAgICAgICAgIHBhcmFtZXRlciBzZWxlY3Rpb24gKi8KKyAgICAgICAgbWluX2JyX2NvZGUgPSAtMTsKKyAgICAgICAgbWluX2JyX2Rpc3QgPSBJTlRfTUFYOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTk7IGkrKykgeworICAgICAgICAgICAgaW50IGJyX2Rpc3QgPSBhYnMoZmZfYWMzX2JpdHJhdGVfdGFiW2ldICogMTAwMCAtIGF2Y3R4LT5iaXRfcmF0ZSk7CisgICAgICAgICAgICBpZiAoYnJfZGlzdCA8IG1pbl9icl9kaXN0KSB7CisgICAgICAgICAgICAgICAgbWluX2JyX2Rpc3QgPSBicl9kaXN0OworICAgICAgICAgICAgICAgIG1pbl9icl9jb2RlID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGUgbWluaW11bSBmcmFtZSBzaXplIGlzIGJlbG93IHRoZSBhdmVyYWdlIGZyYW1lIHNpemUgKi8KKyAgICAgICAgcy0+ZnJhbWVfc2l6ZV9jb2RlID0gbWluX2JyX2NvZGUgPDwgMTsKKyAgICAgICAgd2hpbGUgKHdwZiA+IDEgJiYgd3BmICogcy0+c2FtcGxlX3JhdGUgLyBBQzNfRlJBTUVfU0laRSAqIDE2ID4gYXZjdHgtPmJpdF9yYXRlKQorICAgICAgICAgICAgd3BmLS07CisgICAgICAgIHMtPmZyYW1lX3NpemVfbWluID0gMiAqIHdwZjsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgYmVzdF9iciA9IDAsIGJlc3RfY29kZSA9IDAsIGJlc3RfZGlmZiA9IElOVF9NQVg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxOTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYnIgICA9IChmZl9hYzNfYml0cmF0ZV90YWJbaV0gPj4gcy0+Yml0X2FsbG9jLnNyX3NoaWZ0KSAqIDEwMDA7CisgICAgICAgICAgICBpbnQgZGlmZiA9IGFicyhiciAtIGF2Y3R4LT5iaXRfcmF0ZSk7CisgICAgICAgICAgICBpZiAoZGlmZiA8IGJlc3RfZGlmZikgeworICAgICAgICAgICAgICAgIGJlc3RfYnIgICA9IGJyOworICAgICAgICAgICAgICAgIGJlc3RfY29kZSA9IGk7CisgICAgICAgICAgICAgICAgYmVzdF9kaWZmID0gZGlmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYmVzdF9kaWZmKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSAgICA9IGJlc3RfYnI7CisgICAgICAgIHMtPmZyYW1lX3NpemVfY29kZSA9IGJlc3RfY29kZSA8PCAxOworICAgICAgICBzLT5mcmFtZV9zaXplX21pbiAgPSAyICogZmZfYWMzX2ZyYW1lX3NpemVfdGFiW3MtPmZyYW1lX3NpemVfY29kZV1bcy0+Yml0X2FsbG9jLnNyX2NvZGVdOworICAgICAgICBzLT5udW1fYmxrc19jb2RlICAgPSAweDM7CisgICAgICAgIHMtPm51bV9ibG9ja3MgICAgICA9IDY7CisgICAgfQorICAgIHMtPmJpdF9yYXRlICAgPSBhdmN0eC0+Yml0X3JhdGU7CisgICAgcy0+ZnJhbWVfc2l6ZSA9IHMtPmZyYW1lX3NpemVfbWluOworCisgICAgLyogdmFsaWRhdGUgY3V0b2ZmICovCisgICAgaWYgKGF2Y3R4LT5jdXRvZmYgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBjdXRvZmYgZnJlcXVlbmN5XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcy0+Y3V0b2ZmID0gYXZjdHgtPmN1dG9mZjsKKyAgICBpZiAocy0+Y3V0b2ZmID4gKHMtPnNhbXBsZV9yYXRlID4+IDEpKQorICAgICAgICBzLT5jdXRvZmYgPSBzLT5zYW1wbGVfcmF0ZSA+PiAxOworCisgICAgcmV0ID0gZmZfYWMzX3ZhbGlkYXRlX21ldGFkYXRhKHMpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5yZW1hdHJpeGluZ19lbmFibGVkID0gcy0+b3B0aW9ucy5zdGVyZW9fcmVtYXRyaXhpbmcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFX1NURVJFTyk7CisKKyAgICBzLT5jcGxfZW5hYmxlZCA9IHMtPm9wdGlvbnMuY2hhbm5lbF9jb3VwbGluZyAmJgorICAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9tb2RlID49IEFDM19DSE1PREVfU1RFUkVPOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFNldCBiYW5kd2lkdGggZm9yIGFsbCBjaGFubmVscy4KKyAqIFRoZSB1c2VyIGNhbiBvcHRpb25hbGx5IHN1cHBseSBhIGN1dG9mZiBmcmVxdWVuY3kuIE90aGVyd2lzZSBhbiBhcHByb3ByaWF0ZQorICogZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuCisgKi8KK3N0YXRpYyBhdl9jb2xkIHZvaWQgc2V0X2JhbmR3aWR0aChBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBibGssIGNoLCBhdl91bmluaXQoY3BsX3N0YXJ0KTsKKworICAgIGlmIChzLT5jdXRvZmYpIHsKKyAgICAgICAgLyogY2FsY3VsYXRlIGJhbmR3aWR0aCBiYXNlZCBvbiB1c2VyLXNwZWNpZmllZCBjdXRvZmYgZnJlcXVlbmN5ICovCisgICAgICAgIGludCBmYndfY29lZmZzOworICAgICAgICBmYndfY29lZmZzICAgICA9IHMtPmN1dG9mZiAqIDIgKiBBQzNfTUFYX0NPRUZTIC8gcy0+c2FtcGxlX3JhdGU7CisgICAgICAgIHMtPmJhbmR3aWR0aF9jb2RlID0gYXZfY2xpcCgoZmJ3X2NvZWZmcyAtIDczKSAvIDMsIDAsIDYwKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiB1c2UgZGVmYXVsdCBiYW5kd2lkdGggc2V0dGluZyAqLworICAgICAgICBzLT5iYW5kd2lkdGhfY29kZSA9IGFjM19iYW5kd2lkdGhfdGFiW3MtPmZid19jaGFubmVscy0xXVtzLT5iaXRfYWxsb2Muc3JfY29kZV1bcy0+ZnJhbWVfc2l6ZV9jb2RlLzJdOworICAgIH0KKworICAgIC8qIHNldCBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciBlYWNoIGNoYW5uZWwgKi8KKyAgICBmb3IgKGNoID0gMTsgY2ggPD0gcy0+ZmJ3X2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIHMtPnN0YXJ0X2ZyZXFbY2hdID0gMDsKKyAgICAgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykKKyAgICAgICAgICAgIHMtPmJsb2Nrc1tibGtdLmVuZF9mcmVxW2NoXSA9IHMtPmJhbmR3aWR0aF9jb2RlICogMyArIDczOworICAgIH0KKyAgICAvKiBMRkUgY2hhbm5lbCBhbHdheXMgaGFzIDcgY29lZnMgKi8KKyAgICBpZiAocy0+bGZlX29uKSB7CisgICAgICAgIHMtPnN0YXJ0X2ZyZXFbcy0+bGZlX2NoYW5uZWxdID0gMDsKKyAgICAgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykKKyAgICAgICAgICAgIHMtPmJsb2Nrc1tibGtdLmVuZF9mcmVxW2NoXSA9IDc7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBjb3VwbGluZyBzdHJhdGVneSAqLworICAgIGlmIChzLT5jcGxfZW5hYmxlZCkgeworICAgICAgICBpZiAocy0+b3B0aW9ucy5jcGxfc3RhcnQgIT0gQUMzRU5DX09QVF9BVVRPKSB7CisgICAgICAgICAgICBjcGxfc3RhcnQgPSBzLT5vcHRpb25zLmNwbF9zdGFydDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNwbF9zdGFydCA9IGFjM19jb3VwbGluZ19zdGFydF90YWJbcy0+Y2hhbm5lbF9tb2RlLTJdW3MtPmJpdF9hbGxvYy5zcl9jb2RlXVtzLT5mcmFtZV9zaXplX2NvZGUvMl07CisgICAgICAgICAgICBpZiAoY3BsX3N0YXJ0IDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5vcHRpb25zLmNoYW5uZWxfY291cGxpbmcgPT0gQUMzRU5DX09QVF9BVVRPKQorICAgICAgICAgICAgICAgICAgICBzLT5jcGxfZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjcGxfc3RhcnQgPSAxNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+Y3BsX2VuYWJsZWQpIHsKKyAgICAgICAgaW50IGksIGNwbF9zdGFydF9iYW5kLCBjcGxfZW5kX2JhbmQ7CisgICAgICAgIHVpbnQ4X3QgKmNwbF9iYW5kX3NpemVzID0gcy0+Y3BsX2JhbmRfc2l6ZXM7CisKKyAgICAgICAgY3BsX2VuZF9iYW5kICAgPSBzLT5iYW5kd2lkdGhfY29kZSAvIDQgKyAzOworICAgICAgICBjcGxfc3RhcnRfYmFuZCA9IGF2X2NsaXAoY3BsX3N0YXJ0LCAwLCBGRk1JTihjcGxfZW5kX2JhbmQtMSwgMTUpKTsKKworICAgICAgICBzLT5udW1fY3BsX3N1YmJhbmRzID0gY3BsX2VuZF9iYW5kIC0gY3BsX3N0YXJ0X2JhbmQ7CisKKyAgICAgICAgcy0+bnVtX2NwbF9iYW5kcyA9IDE7CisgICAgICAgICpjcGxfYmFuZF9zaXplcyAgPSAxMjsKKyAgICAgICAgZm9yIChpID0gY3BsX3N0YXJ0X2JhbmQgKyAxOyBpIDwgY3BsX2VuZF9iYW5kOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmZl9lYWMzX2RlZmF1bHRfY3BsX2JhbmRfc3RydWN0W2ldKSB7CisgICAgICAgICAgICAgICAgKmNwbF9iYW5kX3NpemVzICs9IDEyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5udW1fY3BsX2JhbmRzKys7CisgICAgICAgICAgICAgICAgY3BsX2JhbmRfc2l6ZXMrKzsKKyAgICAgICAgICAgICAgICAqY3BsX2JhbmRfc2l6ZXMgPSAxMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHMtPnN0YXJ0X2ZyZXFbQ1BMX0NIXSA9IGNwbF9zdGFydF9iYW5kICogMTIgKyAzNzsKKyAgICAgICAgcy0+Y3BsX2VuZF9mcmVxICAgICAgID0gY3BsX2VuZF9iYW5kICAgKiAxMiArIDM3OworICAgICAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKQorICAgICAgICAgICAgcy0+YmxvY2tzW2Jsa10uZW5kX2ZyZXFbQ1BMX0NIXSA9IHMtPmNwbF9lbmRfZnJlcTsKKyAgICB9Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IGFsbG9jYXRlX2J1ZmZlcnMoQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5hdmN0eDsKKyAgICBpbnQgYmxrLCBjaDsKKyAgICBpbnQgY2hhbm5lbHMgPSBzLT5jaGFubmVscyArIDE7IC8qIGluY2x1ZGVzIGNvdXBsaW5nIGNoYW5uZWwgKi8KKyAgICBpbnQgY2hhbm5lbF9ibG9ja3MgPSBjaGFubmVscyAqIHMtPm51bV9ibG9ja3M7CisgICAgaW50IHRvdGFsX2NvZWZzICAgID0gQUMzX01BWF9DT0VGUyAqIGNoYW5uZWxfYmxvY2tzOworCisgICAgaWYgKHMtPmFsbG9jYXRlX3NhbXBsZV9idWZmZXJzKHMpKQorICAgICAgICBnb3RvIGFsbG9jX2ZhaWw7CisKKyAgICBGRl9BTExPQ19BUlJBWV9PUl9HT1RPKGF2Y3R4LCBzLT5iYXBfYnVmZmVyLCB0b3RhbF9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+YmFwX2J1ZmZlciksIGFsbG9jX2ZhaWwpOworICAgIEZGX0FMTE9DX0FSUkFZX09SX0dPVE8oYXZjdHgsIHMtPmJhcDFfYnVmZmVyLCB0b3RhbF9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+YmFwMV9idWZmZXIpLCBhbGxvY19mYWlsKTsKKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhhdmN0eCwgcy0+bWRjdF9jb2VmX2J1ZmZlciwgdG90YWxfY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5tZGN0X2NvZWZfYnVmZmVyKSwgYWxsb2NfZmFpbCk7CisgICAgRkZfQUxMT0NfQVJSQVlfT1JfR09UTyhhdmN0eCwgcy0+ZXhwX2J1ZmZlciwgdG90YWxfY29lZnMsCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPmV4cF9idWZmZXIpLCBhbGxvY19mYWlsKTsKKyAgICBGRl9BTExPQ19BUlJBWV9PUl9HT1RPKGF2Y3R4LCBzLT5ncm91cGVkX2V4cF9idWZmZXIsIGNoYW5uZWxfYmxvY2tzLCAxMjggKgorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5ncm91cGVkX2V4cF9idWZmZXIpLCBhbGxvY19mYWlsKTsKKyAgICBGRl9BTExPQ19BUlJBWV9PUl9HT1RPKGF2Y3R4LCBzLT5wc2RfYnVmZmVyLCB0b3RhbF9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+cHNkX2J1ZmZlciksIGFsbG9jX2ZhaWwpOworICAgIEZGX0FMTE9DX0FSUkFZX09SX0dPVE8oYXZjdHgsIHMtPmJhbmRfcHNkX2J1ZmZlciwgY2hhbm5lbF9ibG9ja3MsIDY0ICoKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+YmFuZF9wc2RfYnVmZmVyKSwgYWxsb2NfZmFpbCk7CisgICAgRkZfQUxMT0NfQVJSQVlfT1JfR09UTyhhdmN0eCwgcy0+bWFza19idWZmZXIsIGNoYW5uZWxfYmxvY2tzLCA2NCAqCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPm1hc2tfYnVmZmVyKSwgYWxsb2NfZmFpbCk7CisgICAgRkZfQUxMT0NfQVJSQVlfT1JfR09UTyhhdmN0eCwgcy0+cW1hbnRfYnVmZmVyLCB0b3RhbF9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+cW1hbnRfYnVmZmVyKSwgYWxsb2NfZmFpbCk7CisgICAgaWYgKHMtPmNwbF9lbmFibGVkKSB7CisgICAgICAgIEZGX0FMTE9DX0FSUkFZX09SX0dPVE8oYXZjdHgsIHMtPmNwbF9jb29yZF9leHBfYnVmZmVyLCBjaGFubmVsX2Jsb2NrcywgMTYgKgorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+Y3BsX2Nvb3JkX2V4cF9idWZmZXIpLCBhbGxvY19mYWlsKTsKKyAgICAgICAgRkZfQUxMT0NfQVJSQVlfT1JfR09UTyhhdmN0eCwgcy0+Y3BsX2Nvb3JkX21hbnRfYnVmZmVyLCBjaGFubmVsX2Jsb2NrcywgMTYgKgorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+Y3BsX2Nvb3JkX21hbnRfYnVmZmVyKSwgYWxsb2NfZmFpbCk7CisgICAgfQorICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspIHsKKyAgICAgICAgQUMzQmxvY2sgKmJsb2NrID0gJnMtPmJsb2Nrc1tibGtdOworICAgICAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhhdmN0eCwgYmxvY2stPm1kY3RfY29lZiwgY2hhbm5lbHMsIHNpemVvZigqYmxvY2stPm1kY3RfY29lZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2ZhaWwpOworICAgICAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhhdmN0eCwgYmxvY2stPmV4cCwgY2hhbm5lbHMsIHNpemVvZigqYmxvY2stPmV4cCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2ZhaWwpOworICAgICAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhhdmN0eCwgYmxvY2stPmdyb3VwZWRfZXhwLCBjaGFubmVscywgc2l6ZW9mKCpibG9jay0+Z3JvdXBlZF9leHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19mYWlsKTsKKyAgICAgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oYXZjdHgsIGJsb2NrLT5wc2QsIGNoYW5uZWxzLCBzaXplb2YoKmJsb2NrLT5wc2QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19mYWlsKTsKKyAgICAgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oYXZjdHgsIGJsb2NrLT5iYW5kX3BzZCwgY2hhbm5lbHMsIHNpemVvZigqYmxvY2stPmJhbmRfcHNkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZmFpbCk7CisgICAgICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGF2Y3R4LCBibG9jay0+bWFzaywgY2hhbm5lbHMsIHNpemVvZigqYmxvY2stPm1hc2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19mYWlsKTsKKyAgICAgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oYXZjdHgsIGJsb2NrLT5xbWFudCwgY2hhbm5lbHMsIHNpemVvZigqYmxvY2stPnFtYW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZmFpbCk7CisgICAgICAgIGlmIChzLT5jcGxfZW5hYmxlZCkgeworICAgICAgICAgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oYXZjdHgsIGJsb2NrLT5jcGxfY29vcmRfZXhwLCBjaGFubmVscywgc2l6ZW9mKCpibG9jay0+Y3BsX2Nvb3JkX2V4cCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19mYWlsKTsKKyAgICAgICAgICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGF2Y3R4LCBibG9jay0+Y3BsX2Nvb3JkX21hbnQsIGNoYW5uZWxzLCBzaXplb2YoKmJsb2NrLT5jcGxfY29vcmRfbWFudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19mYWlsKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAvKiBhcnJhbmdlbWVudDogYmxvY2ssIGNoYW5uZWwsIGNvZWZmICovCisgICAgICAgICAgICBibG9jay0+Z3JvdXBlZF9leHBbY2hdID0gJnMtPmdyb3VwZWRfZXhwX2J1ZmZlclsxMjggICAgICAgICAgICogKGJsayAqIGNoYW5uZWxzICsgY2gpXTsKKyAgICAgICAgICAgIGJsb2NrLT5wc2RbY2hdICAgICAgICAgPSAmcy0+cHNkX2J1ZmZlciAgICAgICAgW0FDM19NQVhfQ09FRlMgKiAoYmxrICogY2hhbm5lbHMgKyBjaCldOworICAgICAgICAgICAgYmxvY2stPmJhbmRfcHNkW2NoXSAgICA9ICZzLT5iYW5kX3BzZF9idWZmZXIgICBbNjQgICAgICAgICAgICAqIChibGsgKiBjaGFubmVscyArIGNoKV07CisgICAgICAgICAgICBibG9jay0+bWFza1tjaF0gICAgICAgID0gJnMtPm1hc2tfYnVmZmVyICAgICAgIFs2NCAgICAgICAgICAgICogKGJsayAqIGNoYW5uZWxzICsgY2gpXTsKKyAgICAgICAgICAgIGJsb2NrLT5xbWFudFtjaF0gICAgICAgPSAmcy0+cW1hbnRfYnVmZmVyICAgICAgW0FDM19NQVhfQ09FRlMgKiAoYmxrICogY2hhbm5lbHMgKyBjaCldOworICAgICAgICAgICAgaWYgKHMtPmNwbF9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgYmxvY2stPmNwbF9jb29yZF9leHBbY2hdICA9ICZzLT5jcGxfY29vcmRfZXhwX2J1ZmZlciBbMTYgICogKGJsayAqIGNoYW5uZWxzICsgY2gpXTsKKyAgICAgICAgICAgICAgICBibG9jay0+Y3BsX2Nvb3JkX21hbnRbY2hdID0gJnMtPmNwbF9jb29yZF9tYW50X2J1ZmZlclsxNiAgKiAoYmxrICogY2hhbm5lbHMgKyBjaCldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBhcnJhbmdlbWVudDogY2hhbm5lbCwgYmxvY2ssIGNvZWZmICovCisgICAgICAgICAgICBibG9jay0+ZXhwW2NoXSAgICAgICAgID0gJnMtPmV4cF9idWZmZXIgICAgICAgIFtBQzNfTUFYX0NPRUZTICogKHMtPm51bV9ibG9ja3MgKiBjaCArIGJsayldOworICAgICAgICAgICAgYmxvY2stPm1kY3RfY29lZltjaF0gICA9ICZzLT5tZGN0X2NvZWZfYnVmZmVyICBbQUMzX01BWF9DT0VGUyAqIChzLT5udW1fYmxvY2tzICogY2ggKyBibGspXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcy0+Zml4ZWRfcG9pbnQpIHsKKyAgICAgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oYXZjdHgsIHMtPmZpeGVkX2NvZWZfYnVmZmVyLCB0b3RhbF9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5maXhlZF9jb2VmX2J1ZmZlciksIGFsbG9jX2ZhaWwpOworICAgICAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgICAgICBBQzNCbG9jayAqYmxvY2sgPSAmcy0+YmxvY2tzW2Jsa107CisgICAgICAgICAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhhdmN0eCwgYmxvY2stPmZpeGVkX2NvZWYsIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpibG9jay0+Zml4ZWRfY29lZiksIGFsbG9jX2ZhaWwpOworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgYmxvY2stPmZpeGVkX2NvZWZbY2hdID0gJnMtPmZpeGVkX2NvZWZfYnVmZmVyW0FDM19NQVhfQ09FRlMgKiAocy0+bnVtX2Jsb2NrcyAqIGNoICsgYmxrKV07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgICAgICBBQzNCbG9jayAqYmxvY2sgPSAmcy0+YmxvY2tzW2Jsa107CisgICAgICAgICAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhhdmN0eCwgYmxvY2stPmZpeGVkX2NvZWYsIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpibG9jay0+Zml4ZWRfY29lZiksIGFsbG9jX2ZhaWwpOworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgYmxvY2stPmZpeGVkX2NvZWZbY2hdID0gKGludDMyX3QgKilibG9jay0+bWRjdF9jb2VmW2NoXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworYWxsb2NfZmFpbDoKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCisKK2F2X2NvbGQgaW50IGZmX2FjM19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQUMzRW5jb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldCwgZnJhbWVfc2l6ZV81ODsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICBzLT5lYWMzID0gYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0VBQzM7CisKKyAgICBmZl9hYzNfY29tbW9uX2luaXQoKTsKKworICAgIHJldCA9IHZhbGlkYXRlX29wdGlvbnMocyk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gQUMzX0JMT0NLX1NJWkUgKiBzLT5udW1fYmxvY2tzOworICAgIGF2Y3R4LT5pbml0aWFsX3BhZGRpbmcgPSBBQzNfQkxPQ0tfU0laRTsKKworICAgIHMtPmJpdHN0cmVhbV9tb2RlID0gYXZjdHgtPmF1ZGlvX3NlcnZpY2VfdHlwZTsKKyAgICBpZiAocy0+Yml0c3RyZWFtX21vZGUgPT0gQVZfQVVESU9fU0VSVklDRV9UWVBFX0tBUkFPS0UpCisgICAgICAgIHMtPmJpdHN0cmVhbV9tb2RlID0gMHg3OworCisgICAgcy0+Yml0c193cml0dGVuICAgID0gMDsKKyAgICBzLT5zYW1wbGVzX3dyaXR0ZW4gPSAwOworCisgICAgLyogY2FsY3VsYXRlIGNyY19pbnYgZm9yIGJvdGggcG9zc2libGUgZnJhbWUgc2l6ZXMgKi8KKyAgICBmcmFtZV9zaXplXzU4ID0gKCggcy0+ZnJhbWVfc2l6ZSAgICA+PiAyKSArICggcy0+ZnJhbWVfc2l6ZSAgICA+PiA0KSkgPDwgMTsKKyAgICBzLT5jcmNfaW52WzBdID0gcG93X3BvbHkoKENSQzE2X1BPTFkgPj4gMSksICg4ICogZnJhbWVfc2l6ZV81OCkgLSAxNiwgQ1JDMTZfUE9MWSk7CisgICAgaWYgKHMtPmJpdF9hbGxvYy5zcl9jb2RlID09IDEpIHsKKyAgICAgICAgZnJhbWVfc2l6ZV81OCA9ICgoKHMtPmZyYW1lX3NpemUrMikgPj4gMikgKyAoKHMtPmZyYW1lX3NpemUrMikgPj4gNCkpIDw8IDE7CisgICAgICAgIHMtPmNyY19pbnZbMV0gPSBwb3dfcG9seSgoQ1JDMTZfUE9MWSA+PiAxKSwgKDggKiBmcmFtZV9zaXplXzU4KSAtIDE2LCBDUkMxNl9QT0xZKTsKKyAgICB9CisKKyAgICAvKiBzZXQgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBpZiAoQ09ORklHX0FDM19GSVhFRF9FTkNPREVSICYmIHMtPmZpeGVkX3BvaW50KSB7CisgICAgICAgIHMtPm1kY3RfZW5kICAgICAgICAgICAgICAgICAgICAgPSBmZl9hYzNfZml4ZWRfbWRjdF9lbmQ7CisgICAgICAgIHMtPm1kY3RfaW5pdCAgICAgICAgICAgICAgICAgICAgPSBmZl9hYzNfZml4ZWRfbWRjdF9pbml0OworICAgICAgICBzLT5hbGxvY2F0ZV9zYW1wbGVfYnVmZmVycyAgICAgID0gZmZfYWMzX2ZpeGVkX2FsbG9jYXRlX3NhbXBsZV9idWZmZXJzOworICAgIH0gZWxzZSBpZiAoQ09ORklHX0FDM19FTkNPREVSIHx8IENPTkZJR19FQUMzX0VOQ09ERVIpIHsKKyAgICAgICAgcy0+bWRjdF9lbmQgICAgICAgICAgICAgICAgICAgICA9IGZmX2FjM19mbG9hdF9tZGN0X2VuZDsKKyAgICAgICAgcy0+bWRjdF9pbml0ICAgICAgICAgICAgICAgICAgICA9IGZmX2FjM19mbG9hdF9tZGN0X2luaXQ7CisgICAgICAgIHMtPmFsbG9jYXRlX3NhbXBsZV9idWZmZXJzICAgICAgPSBmZl9hYzNfZmxvYXRfYWxsb2NhdGVfc2FtcGxlX2J1ZmZlcnM7CisgICAgfQorICAgIGlmIChDT05GSUdfRUFDM19FTkNPREVSICYmIHMtPmVhYzMpCisgICAgICAgIHMtPm91dHB1dF9mcmFtZV9oZWFkZXIgPSBmZl9lYWMzX291dHB1dF9mcmFtZV9oZWFkZXI7CisgICAgZWxzZQorICAgICAgICBzLT5vdXRwdXRfZnJhbWVfaGVhZGVyID0gYWMzX291dHB1dF9mcmFtZV9oZWFkZXI7CisKKyAgICBzZXRfYmFuZHdpZHRoKHMpOworCisgICAgZXhwb25lbnRfaW5pdChzKTsKKworICAgIGJpdF9hbGxvY19pbml0KHMpOworCisgICAgcmV0ID0gcy0+bWRjdF9pbml0KHMpOworICAgIGlmIChyZXQpCisgICAgICAgIGdvdG8gaW5pdF9mYWlsOworCisgICAgcmV0ID0gYWxsb2NhdGVfYnVmZmVycyhzKTsKKyAgICBpZiAocmV0KQorICAgICAgICBnb3RvIGluaXRfZmFpbDsKKworICAgIGZmX2F1ZGlvZHNwX2luaXQoJnMtPmFkc3ApOworICAgIGZmX21lX2NtcF9pbml0KCZzLT5tZWNjLCBhdmN0eCk7CisgICAgZmZfYWMzZHNwX2luaXQoJnMtPmFjM2RzcCwgYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCk7CisKKyAgICBkcHJpbnRfb3B0aW9ucyhzKTsKKworICAgIHJldHVybiAwOworaW5pdF9mYWlsOgorICAgIGZmX2FjM19lbmNvZGVfY2xvc2UoYXZjdHgpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYzNlbmMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNDQyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNlbmMuaApAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIEFDLTMgZW5jb2RlciAmIEUtQUMtMyBlbmNvZGVyIGNvbW1vbiBoZWFkZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDEwIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFDLTMgZW5jb2RlciAmIEUtQUMtMyBlbmNvZGVyIGNvbW1vbiBoZWFkZXIKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQUMzRU5DX0gKKyNkZWZpbmUgQVZDT0RFQ19BQzNFTkNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisKKyNpbmNsdWRlICJhYzMuaCIKKyNpbmNsdWRlICJhYzNkc3AuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZmZ0LmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgIm1lX2NtcC5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAiYXVkaW9kc3AuaCIKKworI2lmbmRlZiBDT05GSUdfQUMzRU5DX0ZMT0FUCisjZGVmaW5lIENPTkZJR19BQzNFTkNfRkxPQVQgMAorI2VuZGlmCisKKyNkZWZpbmUgT0ZGU0VUKHBhcmFtKSBvZmZzZXRvZihBQzNFbmNvZGVDb250ZXh0LCBvcHRpb25zLnBhcmFtKQorI2RlZmluZSBBQzNFTkNfUEFSQU0gKEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0pCisKKyNkZWZpbmUgQUMzRU5DX1RZUEVfQUMzX0ZJWEVEICAgMAorI2RlZmluZSBBQzNFTkNfVFlQRV9BQzMgICAgICAgICAxCisjZGVmaW5lIEFDM0VOQ19UWVBFX0VBQzMgICAgICAgIDIKKworI2lmIENPTkZJR19BQzNFTkNfRkxPQVQKKyNkZWZpbmUgQUMzX05BTUUoeCkgZmZfYWMzX2Zsb2F0XyAjIyB4CisjZGVmaW5lIE1BQ19DT0VGKGQsYSxiKSAoKGQpKz0oYSkqKGIpKQorI2RlZmluZSBDT0VGX01JTiAoLTE2Nzc3MjE1LjAvMTY3NzcyMTYuMCkKKyNkZWZpbmUgQ09FRl9NQVggKCAxNjc3NzIxNS4wLzE2Nzc3MjE2LjApCisjZGVmaW5lIE5FV19DUExfQ09PUkRfVEhSRVNIT0xEIDAuMDMKK3R5cGVkZWYgZmxvYXQgU2FtcGxlVHlwZTsKK3R5cGVkZWYgZmxvYXQgQ29lZlR5cGU7Cit0eXBlZGVmIGZsb2F0IENvZWZTdW1UeXBlOworI2Vsc2UKKyNkZWZpbmUgQUMzX05BTUUoeCkgZmZfYWMzX2ZpeGVkXyAjIyB4CisjZGVmaW5lIE1BQ19DT0VGKGQsYSxiKSBNQUM2NChkLGEsYikKKyNkZWZpbmUgQ09FRl9NSU4gLTE2Nzc3MjE1CisjZGVmaW5lIENPRUZfTUFYICAxNjc3NzIxNQorI2RlZmluZSBORVdfQ1BMX0NPT1JEX1RIUkVTSE9MRCA1MDMzMTcKK3R5cGVkZWYgaW50MTZfdCBTYW1wbGVUeXBlOwordHlwZWRlZiBpbnQzMl90IENvZWZUeXBlOwordHlwZWRlZiBpbnQ2NF90IENvZWZTdW1UeXBlOworI2VuZGlmCisKKy8qIGNvbW1vbiBvcHRpb24gdmFsdWVzICovCisjZGVmaW5lIEFDM0VOQ19PUFRfTk9ORSAgICAgICAgICAgIC0xCisjZGVmaW5lIEFDM0VOQ19PUFRfQVVUTyAgICAgICAgICAgIC0xCisjZGVmaW5lIEFDM0VOQ19PUFRfT0ZGICAgICAgICAgICAgICAwCisjZGVmaW5lIEFDM0VOQ19PUFRfT04gICAgICAgICAgICAgICAxCisjZGVmaW5lIEFDM0VOQ19PUFRfTk9UX0lORElDQVRFRCAgICAwCisjZGVmaW5lIEFDM0VOQ19PUFRfTU9ERV9PTiAgICAgICAgICAyCisjZGVmaW5lIEFDM0VOQ19PUFRfTU9ERV9PRkYgICAgICAgICAxCisjZGVmaW5lIEFDM0VOQ19PUFRfRFNVUkVYX0RQTElJWiAgICAzCisKKy8qIHNwZWNpZmljIG9wdGlvbiB2YWx1ZXMgKi8KKyNkZWZpbmUgQUMzRU5DX09QVF9MQVJHRV9ST09NICAgICAgIDEKKyNkZWZpbmUgQUMzRU5DX09QVF9TTUFMTF9ST09NICAgICAgIDIKKyNkZWZpbmUgQUMzRU5DX09QVF9ET1dOTUlYX0xUUlQgICAgIDEKKyNkZWZpbmUgQUMzRU5DX09QVF9ET1dOTUlYX0xPUk8gICAgIDIKKyNkZWZpbmUgQUMzRU5DX09QVF9ET1dOTUlYX0RQTElJICAgIDMgLy8gcmVzZXJ2ZWQgdmFsdWUgaW4gQS81MiwgYnV0IHVzZWQgYnkgZW5jb2RlcnMgdG8gaW5kaWNhdGUgRFBMMgorI2RlZmluZSBBQzNFTkNfT1BUX0FEQ09OVl9TVEFOREFSRCAgMAorI2RlZmluZSBBQzNFTkNfT1BUX0FEQ09OVl9IRENEICAgICAgMQorCisKKy8qKgorICogRW5jb2RpbmcgT3B0aW9ucyB1c2VkIGJ5IEFWT3B0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBBQzNFbmNPcHRpb25zIHsKKyAgICAvKiBBQy0zIG1ldGFkYXRhIG9wdGlvbnMqLworICAgIGludCBkaWFsb2d1ZV9sZXZlbDsKKyAgICBpbnQgYml0c3RyZWFtX21vZGU7CisgICAgZmxvYXQgY2VudGVyX21peF9sZXZlbDsKKyAgICBmbG9hdCBzdXJyb3VuZF9taXhfbGV2ZWw7CisgICAgaW50IGRvbGJ5X3N1cnJvdW5kX21vZGU7CisgICAgaW50IGF1ZGlvX3Byb2R1Y3Rpb25faW5mbzsKKyAgICBpbnQgbWl4aW5nX2xldmVsOworICAgIGludCByb29tX3R5cGU7CisgICAgaW50IGNvcHlyaWdodDsKKyAgICBpbnQgb3JpZ2luYWw7CisgICAgaW50IGV4dGVuZGVkX2JzaV8xOworICAgIGludCBwcmVmZXJyZWRfc3RlcmVvX2Rvd25taXg7CisgICAgZmxvYXQgbHRydF9jZW50ZXJfbWl4X2xldmVsOworICAgIGZsb2F0IGx0cnRfc3Vycm91bmRfbWl4X2xldmVsOworICAgIGZsb2F0IGxvcm9fY2VudGVyX21peF9sZXZlbDsKKyAgICBmbG9hdCBsb3JvX3N1cnJvdW5kX21peF9sZXZlbDsKKyAgICBpbnQgZXh0ZW5kZWRfYnNpXzI7CisgICAgaW50IGRvbGJ5X3N1cnJvdW5kX2V4X21vZGU7CisgICAgaW50IGRvbGJ5X2hlYWRwaG9uZV9tb2RlOworICAgIGludCBhZF9jb252ZXJ0ZXJfdHlwZTsKKyAgICBpbnQgZWFjM19taXhpbmdfbWV0YWRhdGE7CisgICAgaW50IGVhYzNfaW5mb19tZXRhZGF0YTsKKworICAgIC8qIG90aGVyIGVuY29kaW5nIG9wdGlvbnMgKi8KKyAgICBpbnQgYWxsb3dfcGVyX2ZyYW1lX21ldGFkYXRhOworICAgIGludCBzdGVyZW9fcmVtYXRyaXhpbmc7CisgICAgaW50IGNoYW5uZWxfY291cGxpbmc7CisgICAgaW50IGNwbF9zdGFydDsKK30gQUMzRW5jT3B0aW9uczsKKworLyoqCisgKiBEYXRhIGZvciBhIHNpbmdsZSBhdWRpbyBibG9jay4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQUMzQmxvY2sgeworICAgIENvZWZUeXBlICoqbWRjdF9jb2VmOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNRENUIGNvZWZmaWNpZW50cworICAgIGludDMyX3QgICoqZml4ZWRfY29lZjsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmaXhlZC1wb2ludCBNRENUIGNvZWZmaWNpZW50cworICAgIHVpbnQ4X3QgICoqZXhwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBvcmlnaW5hbCBleHBvbmVudHMKKyAgICB1aW50OF90ICAqKmdyb3VwZWRfZXhwOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgZ3JvdXBlZCBleHBvbmVudHMKKyAgICBpbnQxNl90ICAqKnBzZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcHNkIHBlciBmcmVxdWVuY3kgYmluCisgICAgaW50MTZfdCAgKipiYW5kX3BzZDsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHBzZCBwZXIgY3JpdGljYWwgYmFuZAorICAgIGludDE2X3QgICoqbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXNraW5nIGN1cnZlCisgICAgdWludDE2X3QgKipxbWFudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHF1YW50aXplZCBtYW50aXNzYXMKKyAgICB1aW50OF90ICAqKmNwbF9jb29yZF9leHA7ICAgICAgICAgICAgICAgICAgIC8vLzwgY291cGxpbmcgY29vcmQgZXhwb25lbnRzICAgICAgICAgICAoY3BsY29leHApCisgICAgdWludDhfdCAgKipjcGxfY29vcmRfbWFudDsgICAgICAgICAgICAgICAgICAvLy88IGNvdXBsaW5nIGNvb3JkIG1hbnRpc3NhcyAgICAgICAgICAgKGNwbGNvbWFudCkKKyAgICB1aW50OF90ICBjb2VmZl9zaGlmdFtBQzNfTUFYX0NIQU5ORUxTXTsgICAgIC8vLzwgZml4ZWQtcG9pbnQgY29lZmZpY2llbnQgc2hpZnQgdmFsdWVzCisgICAgdWludDhfdCAgbmV3X3JlbWF0cml4aW5nX3N0cmF0ZWd5OyAgICAgICAgICAvLy88IHNlbmQgbmV3IHJlbWF0cml4aW5nIGZsYWdzIGluIHRoaXMgYmxvY2sKKyAgICBpbnQgICAgICBudW1fcmVtYXRyaXhpbmdfYmFuZHM7ICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHJlbWF0cml4aW5nIGJhbmRzCisgICAgdWludDhfdCAgcmVtYXRyaXhpbmdfZmxhZ3NbNF07ICAgICAgICAgICAgICAvLy88IHJlbWF0cml4aW5nIGZsYWdzCisgICAgaW50ICAgICAgbmV3X2NwbF9zdHJhdGVneTsgICAgICAgICAgICAgICAgICAvLy88IHNlbmQgbmV3IGNvdXBsaW5nIHN0cmF0ZWd5CisgICAgaW50ICAgICAgY3BsX2luX3VzZTsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNvdXBsaW5nIGluIHVzZSBmb3IgdGhpcyBibG9jayAgICAgKGNwbGludSkKKyAgICB1aW50OF90ICBjaGFubmVsX2luX2NwbFtBQzNfTUFYX0NIQU5ORUxTXTsgIC8vLzwgY2hhbm5lbCBpbiBjb3VwbGluZyAgICAgICAgICAgICAgICAoY2hpbmNwbCkKKyAgICBpbnQgICAgICBudW1fY3BsX2NoYW5uZWxzOyAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGNoYW5uZWxzIGluIGNvdXBsaW5nCisgICAgdWludDhfdCAgbmV3X2NwbF9jb29yZHNbQUMzX01BWF9DSEFOTkVMU107ICAvLy88IHNlbmQgbmV3IGNvdXBsaW5nIGNvb3JkaW5hdGVzICAgICAgKGNwbGNvZSkKKyAgICB1aW50OF90ICBjcGxfbWFzdGVyX2V4cFtBQzNfTUFYX0NIQU5ORUxTXTsgIC8vLzwgY291cGxpbmcgY29vcmQgbWFzdGVyIGV4cG9uZW50cyAgICAobXN0cmNwbGNvKQorICAgIGludCAgICAgIG5ld19zbnJfb2Zmc2V0czsgICAgICAgICAgICAgICAgICAgLy8vPCBzZW5kIG5ldyBTTlIgb2Zmc2V0cworICAgIGludCAgICAgIG5ld19jcGxfbGVhazsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzZW5kIG5ldyBjb3VwbGluZyBsZWFrIGluZm8KKyAgICBpbnQgICAgICBlbmRfZnJlcVtBQzNfTUFYX0NIQU5ORUxTXTsgICAgICAgIC8vLzwgZW5kIGZyZXF1ZW5jeSBiaW4gICAgICAgICAgICAgICAgICAoZW5kbWFudCkKK30gQUMzQmxvY2s7CisKKy8qKgorICogQUMtMyBlbmNvZGVyIHByaXZhdGUgY29udGV4dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQUMzRW5jb2RlQ29udGV4dCB7CisgICAgQVZDbGFzcyAqYXZfY2xhc3M7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDbGFzcyB1c2VkIGZvciBBVk9wdGlvbgorICAgIEFDM0VuY09wdGlvbnMgb3B0aW9uczsgICAgICAgICAgICAgICAgICAvLy88IGVuY29kaW5nIG9wdGlvbnMKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7ICAgICAgICAgICAgICAgICAgLy8vPCBwYXJlbnQgQVZDb2RlY0NvbnRleHQKKyAgICBQdXRCaXRDb250ZXh0IHBiOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBiaXRzdHJlYW0gd3JpdGVyIGNvbnRleHQKKyAgICBBdWRpb0RTUENvbnRleHQgYWRzcDsKKyAgICBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcDsKKyAgICBNRUNtcENvbnRleHQgbWVjYzsKKyAgICBBQzNEU1BDb250ZXh0IGFjM2RzcDsgICAgICAgICAgICAgICAgICAgLy8vPCBBQy0zIG9wdGltaXplZCBmdW5jdGlvbnMKKyAgICBGRlRDb250ZXh0IG1kY3Q7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBGRlQgY29udGV4dCBmb3IgTURDVCBjYWxjdWxhdGlvbgorICAgIGNvbnN0IFNhbXBsZVR5cGUgKm1kY3Rfd2luZG93OyAgICAgICAgICAvLy88IE1EQ1Qgd2luZG93IGZ1bmN0aW9uIGFycmF5CisKKyAgICBBQzNCbG9jayBibG9ja3NbQUMzX01BWF9CTE9DS1NdOyAgICAgICAgLy8vPCBwZXItYmxvY2sgaW5mbworCisgICAgaW50IGZpeGVkX3BvaW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5kaWNhdGVzIGlmIGZpeGVkLXBvaW50IGVuY29kZXIgaXMgYmVpbmcgdXNlZAorICAgIGludCBlYWMzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGluZGljYXRlcyBpZiB0aGlzIGlzIEUtQUMtMyB2cy4gQUMtMworICAgIGludCBiaXRzdHJlYW1faWQ7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IGJpdHN0cmVhbSBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgIChic2lkKQorICAgIGludCBiaXRzdHJlYW1fbW9kZTsgICAgICAgICAgICAgICAgICAgICAvLy88IGJpdHN0cmVhbSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgIChic21vZCkKKworICAgIGludCBiaXRfcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHRhcmdldCBiaXQgcmF0ZSwgaW4gYml0cy1wZXItc2Vjb25kCisgICAgaW50IHNhbXBsZV9yYXRlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc2FtcGxpbmcgZnJlcXVlbmN5LCBpbiBIegorCisgICAgaW50IG51bV9ibGtzX2NvZGU7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJsb2NrcyBjb2RlICAgICAgICAgICAgICAgICAgKG51bWJsa3Njb2QpCisgICAgaW50IG51bV9ibG9ja3M7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJsb2NrcyBwZXIgZnJhbWUKKyAgICBpbnQgZnJhbWVfc2l6ZV9taW47ICAgICAgICAgICAgICAgICAgICAgLy8vPCBtaW5pbXVtIGZyYW1lIHNpemUgaW4gY2FzZSByb3VuZGluZyBpcyBuZWNlc3NhcnkKKyAgICBpbnQgZnJhbWVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGZyYW1lIHNpemUgaW4gYnl0ZXMKKyAgICBpbnQgZnJhbWVfc2l6ZV9jb2RlOyAgICAgICAgICAgICAgICAgICAgLy8vPCBmcmFtZSBzaXplIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAoZnJtc2l6ZWNvZCkKKyAgICB1aW50MTZfdCBjcmNfaW52WzJdOworICAgIGludDY0X3QgYml0c193cml0dGVuOyAgICAgICAgICAgICAgICAgICAvLy88IGJpdCBjb3VudCAgICAodXNlZCB0byBhdmcuIGJpdHJhdGUpCisgICAgaW50NjRfdCBzYW1wbGVzX3dyaXR0ZW47ICAgICAgICAgICAgICAgIC8vLzwgc2FtcGxlIGNvdW50ICh1c2VkIHRvIGF2Zy4gYml0cmF0ZSkKKworICAgIGludCBmYndfY2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBmdWxsLWJhbmR3aWR0aCBjaGFubmVscyAgICAgIChuZmNoYW5zKQorICAgIGludCBjaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHRvdGFsIG51bWJlciBvZiBjaGFubmVscyAgICAgICAgICAgICAgIChuY2hhbnMpCisgICAgaW50IGxmZV9vbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5kaWNhdGVzIGlmIHRoZXJlIGlzIGFuIExGRSBjaGFubmVsICAgKGxmZW9uKQorICAgIGludCBsZmVfY2hhbm5lbDsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNoYW5uZWwgaW5kZXggb2YgdGhlIExGRSBjaGFubmVsCisgICAgaW50IGhhc19jZW50ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5kaWNhdGVzIGlmIHRoZXJlIGlzIGEgY2VudGVyIGNoYW5uZWwKKyAgICBpbnQgaGFzX3N1cnJvdW5kOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbmRpY2F0ZXMgaWYgdGhlcmUgYXJlIG9uZSBvciBtb3JlIHN1cnJvdW5kIGNoYW5uZWxzCisgICAgaW50IGNoYW5uZWxfbW9kZTsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2hhbm5lbCBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjbW9kKQorICAgIGNvbnN0IHVpbnQ4X3QgKmNoYW5uZWxfbWFwOyAgICAgICAgICAgICAvLy88IGNoYW5uZWwgbWFwIHVzZWQgdG8gcmVvcmRlciBjaGFubmVscworCisgICAgaW50IGNlbnRlcl9taXhfbGV2ZWw7ICAgICAgICAgICAgICAgICAgIC8vLzwgY2VudGVyIG1peCBsZXZlbCBjb2RlCisgICAgaW50IHN1cnJvdW5kX21peF9sZXZlbDsgICAgICAgICAgICAgICAgIC8vLzwgc3Vycm91bmQgbWl4IGxldmVsIGNvZGUKKyAgICBpbnQgbHRydF9jZW50ZXJfbWl4X2xldmVsOyAgICAgICAgICAgICAgLy8vPCBMdC9SdCBjZW50ZXIgbWl4IGxldmVsIGNvZGUKKyAgICBpbnQgbHRydF9zdXJyb3VuZF9taXhfbGV2ZWw7ICAgICAgICAgICAgLy8vPCBMdC9SdCBzdXJyb3VuZCBtaXggbGV2ZWwgY29kZQorICAgIGludCBsb3JvX2NlbnRlcl9taXhfbGV2ZWw7ICAgICAgICAgICAgICAvLy88IExvL1JvIGNlbnRlciBtaXggbGV2ZWwgY29kZQorICAgIGludCBsb3JvX3N1cnJvdW5kX21peF9sZXZlbDsgICAgICAgICAgICAvLy88IExvL1JvIHN1cnJvdW5kIG1peCBsZXZlbCBjb2RlCisKKyAgICBpbnQgY3V0b2ZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB1c2VyLXNwZWNpZmllZCBjdXRvZmYgZnJlcXVlbmN5LCBpbiBIegorICAgIGludCBiYW5kd2lkdGhfY29kZTsgICAgICAgICAgICAgICAgICAgICAvLy88IGJhbmR3aWR0aCBjb2RlICgwIHRvIDYwKSAgICAgICAgICAgICAgIChjaGJ3Y29kKQorICAgIGludCBzdGFydF9mcmVxW0FDM19NQVhfQ0hBTk5FTFNdOyAgICAgICAvLy88IHN0YXJ0IGZyZXF1ZW5jeSBiaW4gICAgICAgICAgICAgICAgICAgIChzdHJ0bWFudCkKKyAgICBpbnQgY3BsX2VuZF9mcmVxOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjb3VwbGluZyBjaGFubmVsIGVuZCBmcmVxdWVuY3kgYmluCisKKyAgICBpbnQgY3BsX29uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjb3VwbGluZyB0dXJuZWQgb24gZm9yIHRoaXMgZnJhbWUKKyAgICBpbnQgY3BsX2VuYWJsZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjb3VwbGluZyBlbmFibGVkIGZvciBhbGwgZnJhbWVzCisgICAgaW50IG51bV9jcGxfc3ViYmFuZHM7ICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGNvdXBsaW5nIHN1YmJhbmRzICAgICAgICAgICAgKG5jcGxzdWJuZCkKKyAgICBpbnQgbnVtX2NwbF9iYW5kczsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgY291cGxpbmcgYmFuZHMgICAgICAgICAgICAgICAobmNwbGJuZCkKKyAgICB1aW50OF90IGNwbF9iYW5kX3NpemVzW0FDM19NQVhfQ1BMX0JBTkRTXTsgIC8vLzwgbnVtYmVyIG9mIGNvZWZmcyBpbiBlYWNoIGNvdXBsaW5nIGJhbmQKKworICAgIGludCByZW1hdHJpeGluZ19lbmFibGVkOyAgICAgICAgICAgICAgICAvLy88IHN0ZXJlbyByZW1hdHJpeGluZyBlbmFibGVkCisKKyAgICAvKiBiaXRyYXRlIGFsbG9jYXRpb24gY29udHJvbCAqLworICAgIGludCBzbG93X2dhaW5fY29kZTsgICAgICAgICAgICAgICAgICAgICAvLy88IHNsb3cgZ2FpbiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgIChzZ2FpbmNvZCkKKyAgICBpbnQgc2xvd19kZWNheV9jb2RlOyAgICAgICAgICAgICAgICAgICAgLy8vPCBzbG93IGRlY2F5IGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAoc2RjeWNvZCkKKyAgICBpbnQgZmFzdF9kZWNheV9jb2RlOyAgICAgICAgICAgICAgICAgICAgLy8vPCBmYXN0IGRlY2F5IGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAoZmRjeWNvZCkKKyAgICBpbnQgZGJfcGVyX2JpdF9jb2RlOyAgICAgICAgICAgICAgICAgICAgLy8vPCBkQi9iaXQgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJwYmNvZCkKKyAgICBpbnQgZmxvb3JfY29kZTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmbG9vciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvb3Jjb2QpCisgICAgQUMzQml0QWxsb2NQYXJhbWV0ZXJzIGJpdF9hbGxvYzsgICAgICAgIC8vLzwgYml0IGFsbG9jYXRpb24gcGFyYW1ldGVycworICAgIGludCBjb2Fyc2Vfc25yX29mZnNldDsgICAgICAgICAgICAgICAgICAvLy88IGNvYXJzZSBTTlIgb2Zmc2V0cyAgICAgICAgICAgICAgICAgICAgIChjc25yb2Zmc3QpCisgICAgaW50IGZhc3RfZ2Fpbl9jb2RlW0FDM19NQVhfQ0hBTk5FTFNdOyAgIC8vLzwgZmFzdCBnYWluIGNvZGVzIChzaWduYWwtdG8tbWFzayByYXRpbykgKGZnYWluY29kKQorICAgIGludCBmaW5lX3Nucl9vZmZzZXRbQUMzX01BWF9DSEFOTkVMU107ICAvLy88IGZpbmUgU05SIG9mZnNldHMgICAgICAgICAgICAgICAgICAgICAgIChmc25yb2Zmc3QpCisgICAgaW50IGZyYW1lX2JpdHNfZml4ZWQ7ICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIG5vbi1jb2VmZmljaWVudCBiaXRzIGZvciBmaXhlZCBwYXJhbWV0ZXJzCisgICAgaW50IGZyYW1lX2JpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYWxsIGZyYW1lIGJpdHMgZXhjZXB0IGV4cG9uZW50cyBhbmQgbWFudGlzc2FzCisgICAgaW50IGV4cG9uZW50X2JpdHM7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgZXhwb25lbnRzCisKKyAgICBTYW1wbGVUeXBlICp3aW5kb3dlZF9zYW1wbGVzOworICAgIFNhbXBsZVR5cGUgKipwbGFuYXJfc2FtcGxlczsKKyAgICB1aW50OF90ICpiYXBfYnVmZmVyOworICAgIHVpbnQ4X3QgKmJhcDFfYnVmZmVyOworICAgIENvZWZUeXBlICptZGN0X2NvZWZfYnVmZmVyOworICAgIGludDMyX3QgKmZpeGVkX2NvZWZfYnVmZmVyOworICAgIHVpbnQ4X3QgKmV4cF9idWZmZXI7CisgICAgdWludDhfdCAqZ3JvdXBlZF9leHBfYnVmZmVyOworICAgIGludDE2X3QgKnBzZF9idWZmZXI7CisgICAgaW50MTZfdCAqYmFuZF9wc2RfYnVmZmVyOworICAgIGludDE2X3QgKm1hc2tfYnVmZmVyOworICAgIGludDE2X3QgKnFtYW50X2J1ZmZlcjsKKyAgICB1aW50OF90ICpjcGxfY29vcmRfZXhwX2J1ZmZlcjsKKyAgICB1aW50OF90ICpjcGxfY29vcmRfbWFudF9idWZmZXI7CisKKyAgICB1aW50OF90IGV4cF9zdHJhdGVneVtBQzNfTUFYX0NIQU5ORUxTXVtBQzNfTUFYX0JMT0NLU107IC8vLzwgZXhwb25lbnQgc3RyYXRlZ2llcworICAgIHVpbnQ4X3QgZnJhbWVfZXhwX3N0cmF0ZWd5W0FDM19NQVhfQ0hBTk5FTFNdOyAgICAgICAgICAgLy8vPCBmcmFtZSBleHAgc3RyYXRlZ3kgaW5kZXgKKyAgICBpbnQgdXNlX2ZyYW1lX2V4cF9zdHJhdGVneTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5kaWNhdGVzIHVzZSBvZiBmcmFtZSBleHAgc3RyYXRlZ3kKKyAgICB1aW50OF90IGV4cF9yZWZfYmxvY2tbQUMzX01BWF9DSEFOTkVMU11bQUMzX01BWF9CTE9DS1NdOyAvLy88IHJlZmVyZW5jZSBibG9ja3MgZm9yIEVYUF9SRVVTRQorICAgIHVpbnQ4X3QgKnJlZl9iYXAgICAgIFtBQzNfTUFYX0NIQU5ORUxTXVtBQzNfTUFYX0JMT0NLU107IC8vLzwgYml0IGFsbG9jYXRpb24gcG9pbnRlcnMgKGJhcCkKKyAgICBpbnQgcmVmX2JhcF9zZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGluZGljYXRlcyBpZiByZWZfYmFwIHBvaW50ZXJzIGhhdmUgYmVlbiBzZXQKKworICAgIC8qIGZpeGVkIHZzLiBmbG9hdCBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIHZvaWQgKCptZGN0X2VuZCkoc3RydWN0IEFDM0VuY29kZUNvbnRleHQgKnMpOworICAgIGludCAgKCptZGN0X2luaXQpKHN0cnVjdCBBQzNFbmNvZGVDb250ZXh0ICpzKTsKKworICAgIC8qIGZpeGVkIHZzLiBmbG9hdCB0ZW1wbGF0ZWQgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBpbnQgICgqYWxsb2NhdGVfc2FtcGxlX2J1ZmZlcnMpKHN0cnVjdCBBQzNFbmNvZGVDb250ZXh0ICpzKTsKKworICAgIC8qIEFDLTMgdnMuIEUtQUMtMyBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIHZvaWQgKCpvdXRwdXRfZnJhbWVfaGVhZGVyKShzdHJ1Y3QgQUMzRW5jb2RlQ29udGV4dCAqcyk7Cit9IEFDM0VuY29kZUNvbnRleHQ7CisKKworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX2FjM19jaGFubmVsX2xheW91dHNbMTldOworCitpbnQgZmZfYWMzX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CitpbnQgZmZfYWMzX2Zsb2F0X2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK2ludCBmZl9hYzNfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK2ludCBmZl9hYzNfdmFsaWRhdGVfbWV0YWRhdGEoQUMzRW5jb2RlQ29udGV4dCAqcyk7CisKK3ZvaWQgZmZfYWMzX2FkanVzdF9mcmFtZV9zaXplKEFDM0VuY29kZUNvbnRleHQgKnMpOworCit2b2lkIGZmX2FjM19jb21wdXRlX2NvdXBsaW5nX3N0cmF0ZWd5KEFDM0VuY29kZUNvbnRleHQgKnMpOworCit2b2lkIGZmX2FjM19hcHBseV9yZW1hdHJpeGluZyhBQzNFbmNvZGVDb250ZXh0ICpzKTsKKwordm9pZCBmZl9hYzNfcHJvY2Vzc19leHBvbmVudHMoQUMzRW5jb2RlQ29udGV4dCAqcyk7CisKK2ludCBmZl9hYzNfY29tcHV0ZV9iaXRfYWxsb2NhdGlvbihBQzNFbmNvZGVDb250ZXh0ICpzKTsKKwordm9pZCBmZl9hYzNfZ3JvdXBfZXhwb25lbnRzKEFDM0VuY29kZUNvbnRleHQgKnMpOworCit2b2lkIGZmX2FjM19xdWFudGl6ZV9tYW50aXNzYXMoQUMzRW5jb2RlQ29udGV4dCAqcyk7CisKK3ZvaWQgZmZfYWMzX291dHB1dF9mcmFtZShBQzNFbmNvZGVDb250ZXh0ICpzLCB1bnNpZ25lZCBjaGFyICpmcmFtZSk7CisKKworLyogcHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGluIGFjM2VuY19maXhlZC5jIGFuZCBhYzNlbmNfZmxvYXQuYyAqLworCit2b2lkIGZmX2FjM19maXhlZF9tZGN0X2VuZChBQzNFbmNvZGVDb250ZXh0ICpzKTsKK3ZvaWQgZmZfYWMzX2Zsb2F0X21kY3RfZW5kKEFDM0VuY29kZUNvbnRleHQgKnMpOworCitpbnQgZmZfYWMzX2ZpeGVkX21kY3RfaW5pdChBQzNFbmNvZGVDb250ZXh0ICpzKTsKK2ludCBmZl9hYzNfZmxvYXRfbWRjdF9pbml0KEFDM0VuY29kZUNvbnRleHQgKnMpOworCisKKy8qIHByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBpbiBhYzNlbmNfdGVtcGxhdGUuYyAqLworCitpbnQgZmZfYWMzX2ZpeGVkX2FsbG9jYXRlX3NhbXBsZV9idWZmZXJzKEFDM0VuY29kZUNvbnRleHQgKnMpOworaW50IGZmX2FjM19mbG9hdF9hbGxvY2F0ZV9zYW1wbGVfYnVmZmVycyhBQzNFbmNvZGVDb250ZXh0ICpzKTsKKworaW50IGZmX2FjM19maXhlZF9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cik7CitpbnQgZmZfYWMzX2Zsb2F0X2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUMzRU5DX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2VuY19maXhlZC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWMzZW5jX2ZpeGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzOTAyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2VuY19maXhlZC5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogVGhlIHNpbXBsZXN0IEFDLTMgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAwIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTAgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDEwIFByYWthc2ggUHVubm9vciA8cHJha2FzaEBwdW5ub29yLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBmaXhlZC1wb2ludCBBQy0zIGVuY29kZXIuCisgKi8KKworI2RlZmluZSBGRlRfRkxPQVQgMAorI3VuZGVmIENPTkZJR19BQzNFTkNfRkxPQVQKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF1ZGlvZHNwLmgiCisjaW5jbHVkZSAiYWMzZW5jLmgiCisjaW5jbHVkZSAiZWFjM2VuYy5oIgorCisjZGVmaW5lIEFDM0VOQ19UWVBFIEFDM0VOQ19UWVBFX0FDM19GSVhFRAorI2luY2x1ZGUgImFjM2VuY19vcHRzX3RlbXBsYXRlLmMiCisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGFjM2VuY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJGaXhlZC1Qb2ludCBBQy0zIEVuY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBhYzNfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKKyNpbmNsdWRlICJhYzNlbmNfdGVtcGxhdGUuYyIKKworCisvKioKKyAqIEZpbmFsaXplIE1EQ1QgYW5kIGZyZWUgYWxsb2NhdGVkIG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gcyAgQUMtMyBlbmNvZGVyIHByaXZhdGUgY29udGV4dAorICovCithdl9jb2xkIHZvaWQgQUMzX05BTUUobWRjdF9lbmQpKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgZmZfbWRjdF9lbmQoJnMtPm1kY3QpOworfQorCisKKy8qKgorICogSW5pdGlhbGl6ZSBNRENUIHRhYmxlcy4KKyAqCisgKiBAcGFyYW0gcyAgQUMtMyBlbmNvZGVyIHByaXZhdGUgY29udGV4dAorICogQHJldHVybiAgIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2F2X2NvbGQgaW50IEFDM19OQU1FKG1kY3RfaW5pdCkoQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgcmV0ID0gZmZfbWRjdF9pbml0KCZzLT5tZGN0LCA5LCAwLCAtMS4wKTsKKyAgICBzLT5tZGN0X3dpbmRvdyA9IGZmX2FjM193aW5kb3c7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKgorICogTm9ybWFsaXplIHRoZSBpbnB1dCBzYW1wbGVzIHRvIHVzZSB0aGUgbWF4aW11bSBhdmFpbGFibGUgcHJlY2lzaW9uLgorICogVGhpcyBhc3N1bWVzIHNpZ25lZCAxNi1iaXQgaW5wdXQgc2FtcGxlcy4KKyAqLworc3RhdGljIGludCBub3JtYWxpemVfc2FtcGxlcyhBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCB2ID0gcy0+YWMzZHNwLmFjM19tYXhfbXNiX2Fic19pbnQxNihzLT53aW5kb3dlZF9zYW1wbGVzLCBBQzNfV0lORE9XX1NJWkUpOworICAgIHYgPSAxNCAtIGF2X2xvZzIodik7CisgICAgaWYgKHYgPiAwKQorICAgICAgICBzLT5hYzNkc3AuYWMzX2xzaGlmdF9pbnQxNihzLT53aW5kb3dlZF9zYW1wbGVzLCBBQzNfV0lORE9XX1NJWkUsIHYpOworICAgIC8qICs2IHRvIHJpZ2h0LXNoaWZ0IGZyb20gMzEtYml0IHRvIDI1LWJpdCAqLworICAgIHJldHVybiB2ICsgNjsKK30KKworCisvKgorICogU2NhbGUgTURDVCBjb2VmZmljaWVudHMgdG8gMjUtYml0IHNpZ25lZCBmaXhlZC1wb2ludC4KKyAqLworc3RhdGljIHZvaWQgc2NhbGVfY29lZmZpY2llbnRzKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGJsaywgY2g7CisKKyAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgIEFDM0Jsb2NrICpibG9jayA9ICZzLT5ibG9ja3NbYmxrXTsKKyAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IHMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBzLT5hYzNkc3AuYWMzX3JzaGlmdF9pbnQzMihibG9jay0+bWRjdF9jb2VmW2NoXSwgQUMzX01BWF9DT0VGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5jb2VmZl9zaGlmdFtjaF0pOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzdW1fc3F1YXJlX2J1dHRlcmZseShBQzNFbmNvZGVDb250ZXh0ICpzLCBpbnQ2NF90IHN1bVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmNvZWYwLCBjb25zdCBpbnQzMl90ICpjb2VmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgcy0+YWMzZHNwLnN1bV9zcXVhcmVfYnV0dGVyZmx5X2ludDMyKHN1bSwgY29lZjAsIGNvZWYxLCBsZW4pOworfQorCisvKgorICogQ2xpcCBNRENUIGNvZWZmaWNpZW50cyB0byBhbGxvd2FibGUgcmFuZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGNsaXBfY29lZmZpY2llbnRzKEF1ZGlvRFNQQ29udGV4dCAqYWRzcCwgaW50MzJfdCAqY29lZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisgICAgYWRzcC0+dmVjdG9yX2NsaXBfaW50MzIoY29lZiwgY29lZiwgQ09FRl9NSU4sIENPRUZfTUFYLCBsZW4pOworfQorCisKKy8qCisgKiBDYWxjdWxhdGUgYSBzaW5nbGUgY291cGxpbmcgY29vcmRpbmF0ZS4KKyAqLworc3RhdGljIENvZWZUeXBlIGNhbGNfY3BsX2Nvb3JkKENvZWZTdW1UeXBlIGVuZXJneV9jaCwgQ29lZlN1bVR5cGUgZW5lcmd5X2NwbCkKK3sKKyAgICBpZiAoZW5lcmd5X2NwbCA8PSBDT0VGX01BWCkgeworICAgICAgICByZXR1cm4gMTA0ODU3NjsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50NjRfdCBjb29yZCAgID0gZW5lcmd5X2NoIC8gKGVuZXJneV9jcGwgPj4gMjQpOworICAgICAgICB1aW50MzJfdCBjb29yZDMyID0gRkZNSU4oY29vcmQsIDEwNzM3NDE4MjQpOworICAgICAgICBjb29yZDMyICAgICAgICAgID0gZmZfc3FydChjb29yZDMyKSA8PCA5OworICAgICAgICByZXR1cm4gRkZNSU4oY29vcmQzMiwgQ09FRl9NQVgpOworICAgIH0KK30KKworCitzdGF0aWMgYXZfY29sZCBpbnQgYWMzX2ZpeGVkX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBQzNFbmNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzLT5maXhlZF9wb2ludCA9IDE7CisgICAgcmV0dXJuIGZmX2FjM19lbmNvZGVfaW5pdChhdmN0eCk7Cit9CisKKworQVZDb2RlYyBmZl9hYzNfZml4ZWRfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgID0gImFjM19maXhlZCIsCisgICAgLmxvbmdfbmFtZSAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVFNDIEEvNTJBIChBQy0zKSIpLAorICAgIC50eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FDMywKKyAgICAucHJpdl9kYXRhX3NpemUgID0gc2l6ZW9mKEFDM0VuY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgPSBhYzNfZml4ZWRfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICA9IGZmX2FjM19maXhlZF9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgICA9IGZmX2FjM19lbmNvZGVfY2xvc2UsCisgICAgLnNhbXBsZV9mbXRzICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgID0gJmFjM2VuY19jbGFzcywKKyAgICAuY2hhbm5lbF9sYXlvdXRzID0gZmZfYWMzX2NoYW5uZWxfbGF5b3V0cywKKyAgICAuZGVmYXVsdHMgICAgICAgID0gYWMzX2RlZmF1bHRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2VuY19mbG9hdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWMzZW5jX2Zsb2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2YjE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2VuY19mbG9hdC5jCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogVGhlIHNpbXBsZXN0IEFDLTMgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAwIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTAgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDEwIFByYWthc2ggUHVubm9vciA8cHJha2FzaEBwdW5ub29yLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBmbG9hdGluZy1wb2ludCBBQy0zIGVuY29kZXIuCisgKi8KKworI2RlZmluZSBDT05GSUdfQUMzRU5DX0ZMT0FUIDEKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF1ZGlvZHNwLmgiCisjaW5jbHVkZSAiYWMzZW5jLmgiCisjaW5jbHVkZSAiZWFjM2VuYy5oIgorI2luY2x1ZGUgImtiZHdpbi5oIgorCisKKyNkZWZpbmUgQUMzRU5DX1RZUEUgQUMzRU5DX1RZUEVfQUMzCisjaW5jbHVkZSAiYWMzZW5jX29wdHNfdGVtcGxhdGUuYyIKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGFjM2VuY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJBQy0zIEVuY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBhYzNfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKKyNpbmNsdWRlICJhYzNlbmNfdGVtcGxhdGUuYyIKKworCisvKioKKyAqIEZpbmFsaXplIE1EQ1QgYW5kIGZyZWUgYWxsb2NhdGVkIG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gcyAgQUMtMyBlbmNvZGVyIHByaXZhdGUgY29udGV4dAorICovCithdl9jb2xkIHZvaWQgZmZfYWMzX2Zsb2F0X21kY3RfZW5kKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgZmZfbWRjdF9lbmQoJnMtPm1kY3QpOworICAgIGF2X2ZyZWVwKCZzLT5tZGN0X3dpbmRvdyk7Cit9CisKKworLyoqCisgKiBJbml0aWFsaXplIE1EQ1QgdGFibGVzLgorICoKKyAqIEBwYXJhbSBzICBBQy0zIGVuY29kZXIgcHJpdmF0ZSBjb250ZXh0CisgKiBAcmV0dXJuICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworYXZfY29sZCBpbnQgZmZfYWMzX2Zsb2F0X21kY3RfaW5pdChBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGZsb2F0ICp3aW5kb3c7CisgICAgaW50IGksIG4sIG4yOworCisgICAgbiAgPSAxIDw8IDk7CisgICAgbjIgPSBuID4+IDE7CisKKyAgICB3aW5kb3cgPSBhdl9tYWxsb2NfYXJyYXkobiwgc2l6ZW9mKCp3aW5kb3cpKTsKKyAgICBpZiAoIXdpbmRvdykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgZmZfa2JkX3dpbmRvd19pbml0KHdpbmRvdywgNS4wLCBuMik7CisgICAgZm9yIChpID0gMDsgaSA8IG4yOyBpKyspCisgICAgICAgIHdpbmRvd1tuLTEtaV0gPSB3aW5kb3dbaV07CisgICAgcy0+bWRjdF93aW5kb3cgPSB3aW5kb3c7CisKKyAgICByZXR1cm4gZmZfbWRjdF9pbml0KCZzLT5tZGN0LCA5LCAwLCAtMi4wIC8gbik7Cit9CisKKworLyoKKyAqIE5vcm1hbGl6ZSB0aGUgaW5wdXQgc2FtcGxlcy4KKyAqIE5vdCBuZWVkZWQgZm9yIHRoZSBmbG9hdGluZy1wb2ludCBlbmNvZGVyLgorICovCitzdGF0aWMgaW50IG5vcm1hbGl6ZV9zYW1wbGVzKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFNjYWxlIE1EQ1QgY29lZmZpY2llbnRzIGZyb20gZmxvYXQgdG8gMjQtYml0IGZpeGVkLXBvaW50LgorICovCitzdGF0aWMgdm9pZCBzY2FsZV9jb2VmZmljaWVudHMoQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY2hhbl9zaXplID0gQUMzX01BWF9DT0VGUyAqIHMtPm51bV9ibG9ja3M7CisgICAgaW50IGNwbCAgICAgICA9IHMtPmNwbF9vbjsKKyAgICBzLT5hYzNkc3AuZmxvYXRfdG9fZml4ZWQyNChzLT5maXhlZF9jb2VmX2J1ZmZlciArIChjaGFuX3NpemUgKiAhY3BsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tZGN0X2NvZWZfYnVmZmVyICArIChjaGFuX3NpemUgKiAhY3BsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuX3NpemUgKiAocy0+Y2hhbm5lbHMgKyBjcGwpKTsKK30KKworc3RhdGljIHZvaWQgc3VtX3NxdWFyZV9idXR0ZXJmbHkoQUMzRW5jb2RlQ29udGV4dCAqcywgZmxvYXQgc3VtWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmNvZWYwLCBjb25zdCBmbG9hdCAqY29lZjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIHMtPmFjM2RzcC5zdW1fc3F1YXJlX2J1dHRlcmZseV9mbG9hdChzdW0sIGNvZWYwLCBjb2VmMSwgbGVuKTsKK30KKworLyoKKyAqIENsaXAgTURDVCBjb2VmZmljaWVudHMgdG8gYWxsb3dhYmxlIHJhbmdlLgorICovCitzdGF0aWMgdm9pZCBjbGlwX2NvZWZmaWNpZW50cyhBdWRpb0RTUENvbnRleHQgKmFkc3AsIGZsb2F0ICpjb2VmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICBhZHNwLT52ZWN0b3JfY2xpcGYoY29lZiwgY29lZiwgQ09FRl9NSU4sIENPRUZfTUFYLCBsZW4pOworfQorCisKKy8qCisgKiBDYWxjdWxhdGUgYSBzaW5nbGUgY291cGxpbmcgY29vcmRpbmF0ZS4KKyAqLworc3RhdGljIENvZWZUeXBlIGNhbGNfY3BsX2Nvb3JkKENvZWZTdW1UeXBlIGVuZXJneV9jaCwgQ29lZlN1bVR5cGUgZW5lcmd5X2NwbCkKK3sKKyAgICBmbG9hdCBjb29yZCA9IDAuMTI1OworICAgIGlmIChlbmVyZ3lfY3BsID4gMCkKKyAgICAgICAgY29vcmQgKj0gc3FydGYoZW5lcmd5X2NoIC8gZW5lcmd5X2NwbCk7CisgICAgcmV0dXJuIEZGTUlOKGNvb3JkLCBDT0VGX01BWCk7Cit9CisKK2F2X2NvbGQgaW50IGZmX2FjM19mbG9hdF9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQUMzRW5jb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcy0+ZmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCk7CisgICAgaWYgKCFzLT5mZHNwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiBmZl9hYzNfZW5jb2RlX2luaXQoYXZjdHgpOworfQorCitBVkNvZGVjIGZmX2FjM19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgPSAiYWMzIiwKKyAgICAubG9uZ19uYW1lICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFUU0MgQS81MkEgKEFDLTMpIiksCisgICAgLnR5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQUMzLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgPSBzaXplb2YoQUMzRW5jb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICA9IGZmX2FjM19mbG9hdF9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgID0gZmZfYWMzX2Zsb2F0X2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgID0gZmZfYWMzX2VuY29kZV9jbG9zZSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5wcml2X2NsYXNzICAgICAgPSAmYWMzZW5jX2NsYXNzLAorICAgIC5jaGFubmVsX2xheW91dHMgPSBmZl9hYzNfY2hhbm5lbF9sYXlvdXRzLAorICAgIC5kZWZhdWx0cyAgICAgICAgPSBhYzNfZGVmYXVsdHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWMzZW5jX29wdHNfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2VuY19vcHRzX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxMTNiOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2VuY19vcHRzX3RlbXBsYXRlLmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIEFDLTMgZW5jb2RlciBvcHRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImFjMy5oIgorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYWMzX29wdGlvbnNbXSA9IHsKKy8qIE1ldGFkYXRhIE9wdGlvbnMgKi8KK3sicGVyX2ZyYW1lX21ldGFkYXRhIiwgIkFsbG93IENoYW5naW5nIE1ldGFkYXRhIFBlci1GcmFtZSIsIE9GRlNFVChhbGxvd19wZXJfZnJhbWVfbWV0YWRhdGEpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAwLCAxLCBBQzNFTkNfUEFSQU19LAorI2lmIEFDM0VOQ19UWVBFICE9IEFDM0VOQ19UWVBFX0VBQzMKKy8qIEFDLTMgZG93bm1peCBsZXZlbHMgKi8KK3siY2VudGVyX21peGxldiIsICJDZW50ZXIgTWl4IExldmVsIiwgT0ZGU0VUKGNlbnRlcl9taXhfbGV2ZWwpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSBMRVZFTF9NSU5VU180UE9JTlQ1REIgfSwgMC4wLCAxLjAsIEFDM0VOQ19QQVJBTX0sCit7InN1cnJvdW5kX21peGxldiIsICJTdXJyb3VuZCBNaXggTGV2ZWwiLCBPRkZTRVQoc3Vycm91bmRfbWl4X2xldmVsKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gTEVWRUxfTUlOVVNfNkRCIH0sIDAuMCwgMS4wLCBBQzNFTkNfUEFSQU19LAorI2VuZGlmCisvKiBhdWRpbyBwcm9kdWN0aW9uIGluZm9ybWF0aW9uICovCit7Im1peGluZ19sZXZlbCIsICJNaXhpbmcgTGV2ZWwiLCBPRkZTRVQobWl4aW5nX2xldmVsKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFDM0VOQ19PUFRfTk9ORSB9LCBBQzNFTkNfT1BUX05PTkUsIDExMSwgQUMzRU5DX1BBUkFNfSwKK3sicm9vbV90eXBlIiwgIlJvb20gVHlwZSIsIE9GRlNFVChyb29tX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQUMzRU5DX09QVF9OT05FIH0sIEFDM0VOQ19PUFRfTk9ORSwgQUMzRU5DX09QVF9TTUFMTF9ST09NLCBBQzNFTkNfUEFSQU0sICJyb29tX3R5cGUifSwKKyAgICB7Im5vdGluZGljYXRlZCIsICJOb3QgSW5kaWNhdGVkIChkZWZhdWx0KSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFDM0VOQ19PUFRfTk9UX0lORElDQVRFRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBQzNFTkNfUEFSQU0sICJyb29tX3R5cGUifSwKKyAgICB7ImxhcmdlIiwgICAgICAgICJMYXJnZSBSb29tIiwgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFDM0VOQ19PUFRfTEFSR0VfUk9PTSAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBQzNFTkNfUEFSQU0sICJyb29tX3R5cGUifSwKKyAgICB7InNtYWxsIiwgICAgICAgICJTbWFsbCBSb29tIiwgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFDM0VOQ19PUFRfU01BTExfUk9PTSAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBQzNFTkNfUEFSQU0sICJyb29tX3R5cGUifSwKKy8qIG90aGVyIG1ldGFkYXRhIG9wdGlvbnMgKi8KK3siY29weXJpZ2h0IiwgIkNvcHlyaWdodCBCaXQiLCBPRkZTRVQoY29weXJpZ2h0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFDM0VOQ19PUFRfTk9ORSB9LCBBQzNFTkNfT1BUX05PTkUsIDEsIEFDM0VOQ19QQVJBTX0sCit7ImRpYWxub3JtIiwgIkRpYWxvZ3VlIExldmVsIChkQikiLCBPRkZTRVQoZGlhbG9ndWVfbGV2ZWwpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTMxIH0sIC0zMSwgLTEsIEFDM0VOQ19QQVJBTX0sCit7ImRzdXJfbW9kZSIsICJEb2xieSBTdXJyb3VuZCBNb2RlIiwgT0ZGU0VUKGRvbGJ5X3N1cnJvdW5kX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQUMzRU5DX09QVF9OT05FIH0sIEFDM0VOQ19PUFRfTk9ORSwgQUMzRU5DX09QVF9NT0RFX09OLCBBQzNFTkNfUEFSQU0sICJkc3VyX21vZGUifSwKKyAgICB7Im5vdGluZGljYXRlZCIsICJOb3QgSW5kaWNhdGVkIChkZWZhdWx0KSIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFDM0VOQ19PUFRfTk9UX0lORElDQVRFRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBQzNFTkNfUEFSQU0sICJkc3VyX21vZGUifSwKKyAgICB7Im9uIiwgICAgICAgICAgICJEb2xieSBTdXJyb3VuZCBFbmNvZGVkIiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFDM0VOQ19PUFRfTU9ERV9PTiAgICAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBQzNFTkNfUEFSQU0sICJkc3VyX21vZGUifSwKKyAgICB7Im9mZiIsICAgICAgICAgICJOb3QgRG9sYnkgU3Vycm91bmQgRW5jb2RlZCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFDM0VOQ19PUFRfTU9ERV9PRkYgICAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBQzNFTkNfUEFSQU0sICJkc3VyX21vZGUifSwKK3sib3JpZ2luYWwiLCAiT3JpZ2luYWwgQml0IFN0cmVhbSIsIE9GRlNFVChvcmlnaW5hbCksIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2NCA9IEFDM0VOQ19PUFRfTk9ORSB9LCBBQzNFTkNfT1BUX05PTkUsIDEsIEFDM0VOQ19QQVJBTX0sCisvKiBleHRlbmRlZCBiaXRzdHJlYW0gaW5mb3JtYXRpb24gKi8KK3siZG1peF9tb2RlIiwgIlByZWZlcnJlZCBTdGVyZW8gRG93bm1peCBNb2RlIiwgT0ZGU0VUKHByZWZlcnJlZF9zdGVyZW9fZG93bm1peCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBQzNFTkNfT1BUX05PTkUgfSwgQUMzRU5DX09QVF9OT05FLCBBQzNFTkNfT1BUX0RPV05NSVhfRFBMSUksIEFDM0VOQ19QQVJBTSwgImRtaXhfbW9kZSJ9LAorICAgIHsibm90aW5kaWNhdGVkIiwgIk5vdCBJbmRpY2F0ZWQgKGRlZmF1bHQpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQUMzRU5DX09QVF9OT1RfSU5ESUNBVEVEIH0sIElOVF9NSU4sIElOVF9NQVgsIEFDM0VOQ19QQVJBTSwgImRtaXhfbW9kZSJ9LAorICAgIHsibHRydCIsICJMdC9SdCBEb3dubWl4IFByZWZlcnJlZCIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQUMzRU5DX09QVF9ET1dOTUlYX0xUUlQgIH0sIElOVF9NSU4sIElOVF9NQVgsIEFDM0VOQ19QQVJBTSwgImRtaXhfbW9kZSJ9LAorICAgIHsibG9ybyIsICJMby9SbyBEb3dubWl4IFByZWZlcnJlZCIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQUMzRU5DX09QVF9ET1dOTUlYX0xPUk8gIH0sIElOVF9NSU4sIElOVF9NQVgsIEFDM0VOQ19QQVJBTSwgImRtaXhfbW9kZSJ9LAorICAgIHsiZHBsaWkiLCAiRG9sYnkgUHJvIExvZ2ljIElJIERvd25taXggUHJlZmVycmVkIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQUMzRU5DX09QVF9ET1dOTUlYX0RQTElJIH0sIElOVF9NSU4sIElOVF9NQVgsIEFDM0VOQ19QQVJBTSwgImRtaXhfbW9kZSJ9LAoreyJsdHJ0X2NtaXhsZXYiLCAiTHQvUnQgQ2VudGVyIE1peCBMZXZlbCIsIE9GRlNFVChsdHJ0X2NlbnRlcl9taXhfbGV2ZWwpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAtMS4wIH0sIC0xLjAsIDIuMCwgQUMzRU5DX1BBUkFNfSwKK3sibHRydF9zdXJtaXhsZXYiLCAiTHQvUnQgU3Vycm91bmQgTWl4IExldmVsIiwgT0ZGU0VUKGx0cnRfc3Vycm91bmRfbWl4X2xldmVsKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gLTEuMCB9LCAtMS4wLCAyLjAsIEFDM0VOQ19QQVJBTX0sCit7Imxvcm9fY21peGxldiIsICJMby9SbyBDZW50ZXIgTWl4IExldmVsIiwgT0ZGU0VUKGxvcm9fY2VudGVyX21peF9sZXZlbCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IC0xLjAgfSwgLTEuMCwgMi4wLCBBQzNFTkNfUEFSQU19LAoreyJsb3JvX3N1cm1peGxldiIsICJMby9SbyBTdXJyb3VuZCBNaXggTGV2ZWwiLCBPRkZTRVQobG9yb19zdXJyb3VuZF9taXhfbGV2ZWwpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAtMS4wIH0sIC0xLjAsIDIuMCwgQUMzRU5DX1BBUkFNfSwKK3siZHN1cmV4X21vZGUiLCAiRG9sYnkgU3Vycm91bmQgRVggTW9kZSIsIE9GRlNFVChkb2xieV9zdXJyb3VuZF9leF9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFDM0VOQ19PUFRfTk9ORSB9LCBBQzNFTkNfT1BUX05PTkUsIEFDM0VOQ19PUFRfRFNVUkVYX0RQTElJWiwgQUMzRU5DX1BBUkFNLCAiZHN1cmV4X21vZGUifSwKKyAgICB7Im5vdGluZGljYXRlZCIsICJOb3QgSW5kaWNhdGVkIChkZWZhdWx0KSIsICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFDM0VOQ19PUFRfTk9UX0lORElDQVRFRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBQzNFTkNfUEFSQU0sICJkc3VyZXhfbW9kZSJ9LAorICAgIHsib24iLCAgICAgICAgICAgIkRvbGJ5IFN1cnJvdW5kIEVYIEVuY29kZWQiLCAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQUMzRU5DX09QVF9NT0RFX09OICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsIEFDM0VOQ19QQVJBTSwgImRzdXJleF9tb2RlIn0sCisgICAgeyJvZmYiLCAgICAgICAgICAiTm90IERvbGJ5IFN1cnJvdW5kIEVYIEVuY29kZWQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBQzNFTkNfT1BUX01PREVfT0ZGICAgICAgfSwgSU5UX01JTiwgSU5UX01BWCwgQUMzRU5DX1BBUkFNLCAiZHN1cmV4X21vZGUifSwKKyAgICB7ImRwbGlpeiIsICAgICAgICJEb2xieSBQcm8gTG9naWMgSUl6LWVuY29kZWQiLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFDM0VOQ19PUFRfRFNVUkVYX0RQTElJWiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBQzNFTkNfUEFSQU0sICJkc3VyZXhfbW9kZSJ9LAoreyJkaGVhZHBob25lX21vZGUiLCAiRG9sYnkgSGVhZHBob25lIE1vZGUiLCBPRkZTRVQoZG9sYnlfaGVhZHBob25lX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQUMzRU5DX09QVF9OT05FIH0sIEFDM0VOQ19PUFRfTk9ORSwgQUMzRU5DX09QVF9NT0RFX09OLCBBQzNFTkNfUEFSQU0sICJkaGVhZHBob25lX21vZGUifSwKKyAgICB7Im5vdGluZGljYXRlZCIsICJOb3QgSW5kaWNhdGVkIChkZWZhdWx0KSIsICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBQzNFTkNfT1BUX05PVF9JTkRJQ0FURUQgfSwgSU5UX01JTiwgSU5UX01BWCwgQUMzRU5DX1BBUkFNLCAiZGhlYWRwaG9uZV9tb2RlIn0sCisgICAgeyJvbiIsICAgICAgICAgICAiRG9sYnkgSGVhZHBob25lIEVuY29kZWQiLCAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQUMzRU5DX09QVF9NT0RFX09OICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsIEFDM0VOQ19QQVJBTSwgImRoZWFkcGhvbmVfbW9kZSJ9LAorICAgIHsib2ZmIiwgICAgICAgICAgIk5vdCBEb2xieSBIZWFkcGhvbmUgRW5jb2RlZCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFDM0VOQ19PUFRfTU9ERV9PRkYgICAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBQzNFTkNfUEFSQU0sICJkaGVhZHBob25lX21vZGUifSwKK3siYWRfY29udl90eXBlIiwgIkEvRCBDb252ZXJ0ZXIgVHlwZSIsIE9GRlNFVChhZF9jb252ZXJ0ZXJfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBQzNFTkNfT1BUX05PTkUgfSwgQUMzRU5DX09QVF9OT05FLCBBQzNFTkNfT1BUX0FEQ09OVl9IRENELCBBQzNFTkNfUEFSQU0sICJhZF9jb252X3R5cGUifSwKKyAgICB7InN0YW5kYXJkIiwgIlN0YW5kYXJkIChkZWZhdWx0KSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFDM0VOQ19PUFRfQURDT05WX1NUQU5EQVJEIH0sIElOVF9NSU4sIElOVF9NQVgsIEFDM0VOQ19QQVJBTSwgImFkX2NvbnZfdHlwZSJ9LAorICAgIHsiaGRjZCIsICAgICAiSERDRCIsICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQUMzRU5DX09QVF9BRENPTlZfSERDRCAgICAgfSwgSU5UX01JTiwgSU5UX01BWCwgQUMzRU5DX1BBUkFNLCAiYWRfY29udl90eXBlIn0sCisvKiBPdGhlciBFbmNvZGluZyBPcHRpb25zICovCit7InN0ZXJlb19yZW1hdHJpeGluZyIsICJTdGVyZW8gUmVtYXRyaXhpbmciLCBPRkZTRVQoc3RlcmVvX3JlbWF0cml4aW5nKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFDM0VOQ19PUFRfT04gfSwgQUMzRU5DX09QVF9PRkYsIEFDM0VOQ19PUFRfT04sIEFDM0VOQ19QQVJBTX0sCit7ImNoYW5uZWxfY291cGxpbmciLCAgICJDaGFubmVsIENvdXBsaW5nIiwgICBPRkZTRVQoY2hhbm5lbF9jb3VwbGluZyksICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFDM0VOQ19PUFRfQVVUTyB9LCBBQzNFTkNfT1BUX0FVVE8sIEFDM0VOQ19PUFRfT04sIEFDM0VOQ19QQVJBTSwgImNoYW5uZWxfY291cGxpbmcifSwKKyAgICB7ImF1dG8iLCAiU2VsZWN0ZWQgYnkgdGhlIEVuY29kZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBQzNFTkNfT1BUX0FVVE8gfSwgSU5UX01JTiwgSU5UX01BWCwgQUMzRU5DX1BBUkFNLCAiY2hhbm5lbF9jb3VwbGluZyJ9LAoreyJjcGxfc3RhcnRfYmFuZCIsICJDb3VwbGluZyBTdGFydCBCYW5kIiwgT0ZGU0VUKGNwbF9zdGFydCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBQzNFTkNfT1BUX0FVVE8gfSwgQUMzRU5DX09QVF9BVVRPLCAxNSwgQUMzRU5DX1BBUkFNLCAiY3BsX3N0YXJ0X2JhbmQifSwKKyAgICB7ImF1dG8iLCAiU2VsZWN0ZWQgYnkgdGhlIEVuY29kZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBQzNFTkNfT1BUX0FVVE8gfSwgSU5UX01JTiwgSU5UX01BWCwgQUMzRU5DX1BBUkFNLCAiY3BsX3N0YXJ0X2JhbmQifSwKK3tOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ29kZWNEZWZhdWx0IGFjM19kZWZhdWx0c1tdID0geworICAgIHsgImIiLCAgIjAiIH0sCisgICAgeyBOVUxMIH0KK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYzNlbmNfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM2VuY190ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYWQ3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzNlbmNfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIEFDLTMgZW5jb2RlciBmbG9hdC9maXhlZCB0ZW1wbGF0ZQorICogQ29weXJpZ2h0IChjKSAyMDAwIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTEgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDEwIFByYWthc2ggUHVubm9vciA8cHJha2FzaEBwdW5ub29yLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBQy0zIGVuY29kZXIgZmxvYXQvZml4ZWQgdGVtcGxhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSAiYXVkaW9kc3AuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImFjM2VuYy5oIgorI2luY2x1ZGUgImVhYzNlbmMuaCIKKworLyogcHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucyBpbiBhYzNlbmNfZml4ZWQuYyBhbmQgYWMzZW5jX2Zsb2F0LmMgKi8KKworc3RhdGljIHZvaWQgc2NhbGVfY29lZmZpY2llbnRzKEFDM0VuY29kZUNvbnRleHQgKnMpOworCitzdGF0aWMgaW50IG5vcm1hbGl6ZV9zYW1wbGVzKEFDM0VuY29kZUNvbnRleHQgKnMpOworCitzdGF0aWMgdm9pZCBjbGlwX2NvZWZmaWNpZW50cyhBdWRpb0RTUENvbnRleHQgKmFkc3AsIENvZWZUeXBlICpjb2VmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbik7CisKK3N0YXRpYyBDb2VmVHlwZSBjYWxjX2NwbF9jb29yZChDb2VmU3VtVHlwZSBlbmVyZ3lfY2gsIENvZWZTdW1UeXBlIGVuZXJneV9jcGwpOworCitzdGF0aWMgdm9pZCBzdW1fc3F1YXJlX2J1dHRlcmZseShBQzNFbmNvZGVDb250ZXh0ICpzLCBDb2VmU3VtVHlwZSBzdW1bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2VmVHlwZSAqY29lZjAsIGNvbnN0IENvZWZUeXBlICpjb2VmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCitpbnQgQUMzX05BTUUoYWxsb2NhdGVfc2FtcGxlX2J1ZmZlcnMpKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGNoOworCisgICAgRkZfQUxMT0NfT1JfR09UTyhzLT5hdmN0eCwgcy0+d2luZG93ZWRfc2FtcGxlcywgQUMzX1dJTkRPV19TSVpFICoKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+d2luZG93ZWRfc2FtcGxlcyksIGFsbG9jX2ZhaWwpOworICAgIEZGX0FMTE9DX0FSUkFZX09SX0dPVE8ocy0+YXZjdHgsIHMtPnBsYW5hcl9zYW1wbGVzLCBzLT5jaGFubmVscywgc2l6ZW9mKCpzLT5wbGFuYXJfc2FtcGxlcyksCisgICAgICAgICAgICAgICAgICAgICBhbGxvY19mYWlsKTsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+cGxhbmFyX3NhbXBsZXNbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoQUMzX0ZSQU1FX1NJWkUrQUMzX0JMT0NLX1NJWkUpICogc2l6ZW9mKCoqcy0+cGxhbmFyX3NhbXBsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19mYWlsKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2FsbG9jX2ZhaWw6CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworCisvKgorICogQ29weSBpbnB1dCBzYW1wbGVzLgorICogQ2hhbm5lbHMgYXJlIHJlb3JkZXJlZCBmcm9tIEZGbXBlZydzIGRlZmF1bHQgb3JkZXIgdG8gQUMtMyBvcmRlci4KKyAqLworc3RhdGljIHZvaWQgY29weV9pbnB1dF9zYW1wbGVzKEFDM0VuY29kZUNvbnRleHQgKnMsIFNhbXBsZVR5cGUgKipzYW1wbGVzKQoreworICAgIGludCBjaDsKKworICAgIC8qIGNvcHkgYW5kIHJlbWFwIGlucHV0IHNhbXBsZXMgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAvKiBjb3B5IGxhc3QgMjU2IHNhbXBsZXMgb2YgcHJldmlvdXMgZnJhbWUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZyYW1lICovCisgICAgICAgIG1lbWNweSgmcy0+cGxhbmFyX3NhbXBsZXNbY2hdWzBdLCAmcy0+cGxhbmFyX3NhbXBsZXNbY2hdW0FDM19CTE9DS19TSVpFICogcy0+bnVtX2Jsb2Nrc10sCisgICAgICAgICAgICAgICBBQzNfQkxPQ0tfU0laRSAqIHNpemVvZihzLT5wbGFuYXJfc2FtcGxlc1swXVswXSkpOworCisgICAgICAgIC8qIGNvcHkgbmV3IHNhbXBsZXMgZm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgbWVtY3B5KCZzLT5wbGFuYXJfc2FtcGxlc1tjaF1bQUMzX0JMT0NLX1NJWkVdLAorICAgICAgICAgICAgICAgc2FtcGxlc1tzLT5jaGFubmVsX21hcFtjaF1dLAorICAgICAgICAgICAgICAgQUMzX0JMT0NLX1NJWkUgKiBzLT5udW1fYmxvY2tzICogc2l6ZW9mKHMtPnBsYW5hcl9zYW1wbGVzWzBdWzBdKSk7CisgICAgfQorfQorCisKKy8qCisgKiBBcHBseSB0aGUgTURDVCB0byBpbnB1dCBzYW1wbGVzIHRvIGdlbmVyYXRlIGZyZXF1ZW5jeSBjb2VmZmljaWVudHMuCisgKiBUaGlzIGFwcGxpZXMgdGhlIEtCRCB3aW5kb3cgYW5kIG5vcm1hbGl6ZXMgdGhlIGlucHV0IHRvIHJlZHVjZSBwcmVjaXNpb24KKyAqIGxvc3MgZHVlIHRvIGZpeGVkLXBvaW50IGNhbGN1bGF0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgYXBwbHlfbWRjdChBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBibGssIGNoOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICAgICAgQUMzQmxvY2sgKmJsb2NrID0gJnMtPmJsb2Nrc1tibGtdOworICAgICAgICAgICAgY29uc3QgU2FtcGxlVHlwZSAqaW5wdXRfc2FtcGxlcyA9ICZzLT5wbGFuYXJfc2FtcGxlc1tjaF1bYmxrICogQUMzX0JMT0NLX1NJWkVdOworCisjaWYgQ09ORklHX0FDM0VOQ19GTE9BVAorICAgICAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWwocy0+d2luZG93ZWRfc2FtcGxlcywgaW5wdXRfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWRjdF93aW5kb3csIEFDM19XSU5ET1dfU0laRSk7CisjZWxzZQorICAgICAgICAgICAgcy0+YWMzZHNwLmFwcGx5X3dpbmRvd19pbnQxNihzLT53aW5kb3dlZF9zYW1wbGVzLCBpbnB1dF9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tZGN0X3dpbmRvdywgQUMzX1dJTkRPV19TSVpFKTsKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAocy0+Zml4ZWRfcG9pbnQpCisgICAgICAgICAgICAgICAgYmxvY2stPmNvZWZmX3NoaWZ0W2NoKzFdID0gbm9ybWFsaXplX3NhbXBsZXMocyk7CisKKyAgICAgICAgICAgIHMtPm1kY3QubWRjdF9jYWxjdygmcy0+bWRjdCwgYmxvY2stPm1kY3RfY29lZltjaCsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53aW5kb3dlZF9zYW1wbGVzKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKgorICogQ2FsY3VsYXRlIGNvdXBsaW5nIGNoYW5uZWwgYW5kIGNvdXBsaW5nIGNvb3JkaW5hdGVzLgorICovCitzdGF0aWMgdm9pZCBhcHBseV9jaGFubmVsX2NvdXBsaW5nKEFDM0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNihDb2VmVHlwZSwgY3BsX2Nvb3JkcywgICAgICBbQUMzX01BWF9CTE9DS1NdLCBbQUMzX01BWF9DSEFOTkVMU11bMTZdKTsKKyNpZiBDT05GSUdfQUMzRU5DX0ZMT0FUCisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQzMl90LCBmaXhlZF9jcGxfY29vcmRzLCBbQUMzX01BWF9CTE9DS1NdLCBbQUMzX01BWF9DSEFOTkVMU11bMTZdKTsKKyNlbHNlCisgICAgaW50MzJfdCAoKmZpeGVkX2NwbF9jb29yZHMpW0FDM19NQVhfQ0hBTk5FTFNdWzE2XSA9IGNwbF9jb29yZHM7CisjZW5kaWYKKyAgICBpbnQgYXZfdW5pbml0KGJsayksIGNoLCBibmQsIGksIGo7CisgICAgQ29lZlN1bVR5cGUgZW5lcmd5W0FDM19NQVhfQkxPQ0tTXVtBQzNfTUFYX0NIQU5ORUxTXVsxNl0gPSB7e3swfX19OworICAgIGludCBjcGxfc3RhcnQsIG51bV9jcGxfY29lZnM7CisKKyAgICBtZW1zZXQoY3BsX2Nvb3JkcywgICAgICAgMCwgQUMzX01BWF9CTE9DS1MgKiBzaXplb2YoKmNwbF9jb29yZHMpKTsKKyNpZiBDT05GSUdfQUMzRU5DX0ZMT0FUCisgICAgbWVtc2V0KGZpeGVkX2NwbF9jb29yZHMsIDAsIEFDM19NQVhfQkxPQ0tTICogc2l6ZW9mKCpjcGxfY29vcmRzKSk7CisjZW5kaWYKKworICAgIC8qIGFsaWduIHN0YXJ0IHRvIDE2LWJ5dGUgYm91bmRhcnkuIGFsaWduIGxlbmd0aCB0byBtdWx0aXBsZSBvZiAzMi4KKyAgICAgICAgbm90ZTogY291cGxpbmcgc3RhcnQgYmluICUgNCB3aWxsIGFsd2F5cyBiZSAxICovCisgICAgY3BsX3N0YXJ0ICAgICA9IHMtPnN0YXJ0X2ZyZXFbQ1BMX0NIXSAtIDE7CisgICAgbnVtX2NwbF9jb2VmcyA9IEZGQUxJR04ocy0+bnVtX2NwbF9zdWJiYW5kcyAqIDEyICsgMSwgMzIpOworICAgIGNwbF9zdGFydCAgICAgPSBGRk1JTigyNTYsIGNwbF9zdGFydCArIG51bV9jcGxfY29lZnMpIC0gbnVtX2NwbF9jb2VmczsKKworICAgIC8qIGNhbGN1bGF0ZSBjb3VwbGluZyBjaGFubmVsIGZyb20gZmJ3IGNoYW5uZWxzICovCisgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICBBQzNCbG9jayAqYmxvY2sgPSAmcy0+YmxvY2tzW2Jsa107CisgICAgICAgIENvZWZUeXBlICpjcGxfY29lZiA9ICZibG9jay0+bWRjdF9jb2VmW0NQTF9DSF1bY3BsX3N0YXJ0XTsKKyAgICAgICAgaWYgKCFibG9jay0+Y3BsX2luX3VzZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBtZW1zZXQoY3BsX2NvZWYsIDAsIG51bV9jcGxfY29lZnMgKiBzaXplb2YoKmNwbF9jb2VmKSk7CisgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIENvZWZUeXBlICpjaF9jb2VmID0gJmJsb2NrLT5tZGN0X2NvZWZbY2hdW2NwbF9zdGFydF07CisgICAgICAgICAgICBpZiAoIWJsb2NrLT5jaGFubmVsX2luX2NwbFtjaF0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NwbF9jb2VmczsgaSsrKQorICAgICAgICAgICAgICAgIGNwbF9jb2VmW2ldICs9IGNoX2NvZWZbaV07CisgICAgICAgIH0KKworICAgICAgICAvKiBjb2VmZmljaWVudHMgbXVzdCBiZSBjbGlwcGVkIGluIG9yZGVyIHRvIGJlIGVuY29kZWQgKi8KKyAgICAgICAgY2xpcF9jb2VmZmljaWVudHMoJnMtPmFkc3AsIGNwbF9jb2VmLCBudW1fY3BsX2NvZWZzKTsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgZW5lcmd5IGluIGVhY2ggYmFuZCBpbiBjb3VwbGluZyBjaGFubmVsIGFuZCBlYWNoIGZidyBjaGFubmVsICovCisgICAgLyogVE9ETzogcG9zc2libHkgdXNlIFNJTUQgdG8gc3BlZWQgdXAgZW5lcmd5IGNhbGN1bGF0aW9uICovCisgICAgYm5kID0gMDsKKyAgICBpID0gcy0+c3RhcnRfZnJlcVtDUExfQ0hdOworICAgIHdoaWxlIChpIDwgcy0+Y3BsX2VuZF9mcmVxKSB7CisgICAgICAgIGludCBiYW5kX3NpemUgPSBzLT5jcGxfYmFuZF9zaXplc1tibmRdOworICAgICAgICBmb3IgKGNoID0gQ1BMX0NIOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspIHsKKyAgICAgICAgICAgICAgICBBQzNCbG9jayAqYmxvY2sgPSAmcy0+YmxvY2tzW2Jsa107CisgICAgICAgICAgICAgICAgaWYgKCFibG9jay0+Y3BsX2luX3VzZSB8fCAoY2ggPiBDUExfQ0ggJiYgIWJsb2NrLT5jaGFubmVsX2luX2NwbFtjaF0pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmFuZF9zaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQ29lZlR5cGUgdiA9IGJsb2NrLT5tZGN0X2NvZWZbY2hdW2kral07CisgICAgICAgICAgICAgICAgICAgIE1BQ19DT0VGKGVuZXJneVtibGtdW2NoXVtibmRdLCB2LCB2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaSArPSBiYW5kX3NpemU7CisgICAgICAgIGJuZCsrOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBjb3VwbGluZyBjb29yZGluYXRlcyBmb3IgYWxsIGJsb2NrcyBmb3IgYWxsIGNoYW5uZWxzICovCisgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICBBQzNCbG9jayAqYmxvY2sgID0gJnMtPmJsb2Nrc1tibGtdOworICAgICAgICBpZiAoIWJsb2NrLT5jcGxfaW5fdXNlKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGlmICghYmxvY2stPmNoYW5uZWxfaW5fY3BsW2NoXSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAoYm5kID0gMDsgYm5kIDwgcy0+bnVtX2NwbF9iYW5kczsgYm5kKyspIHsKKyAgICAgICAgICAgICAgICBjcGxfY29vcmRzW2Jsa11bY2hdW2JuZF0gPSBjYWxjX2NwbF9jb29yZChlbmVyZ3lbYmxrXVtjaF1bYm5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmVyZ3lbYmxrXVtDUExfQ0hdW2JuZF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogZGV0ZXJtaW5lIHdoaWNoIGJsb2NrcyB0byBzZW5kIG5ldyBjb3VwbGluZyBjb29yZGluYXRlcyBmb3IgKi8KKyAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgIEFDM0Jsb2NrICpibG9jayAgPSAmcy0+YmxvY2tzW2Jsa107CisgICAgICAgIEFDM0Jsb2NrICpibG9jazAgPSBibGsgPyAmcy0+YmxvY2tzW2Jsay0xXSA6IE5VTEw7CisKKyAgICAgICAgbWVtc2V0KGJsb2NrLT5uZXdfY3BsX2Nvb3JkcywgMCwgc2l6ZW9mKGJsb2NrLT5uZXdfY3BsX2Nvb3JkcykpOworCisgICAgICAgIGlmIChibG9jay0+Y3BsX2luX3VzZSkgeworICAgICAgICAgICAgLyogc2VuZCBuZXcgY29vcmRpbmF0ZXMgaWYgdGhpcyBpcyB0aGUgZmlyc3QgYmxvY2ssIGlmIHByZXZpb3VzCisgICAgICAgICAgICAgKiBibG9jayBkaWQgbm90IHVzZSBjb3VwbGluZyBidXQgdGhpcyBibG9jayBkb2VzLCB0aGUgY2hhbm5lbHMKKyAgICAgICAgICAgICAqIHVzaW5nIGNvdXBsaW5nIGhhcyBjaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIGJsb2NrLCBvciB0aGUKKyAgICAgICAgICAgICAqIGNvb3JkaW5hdGUgZGlmZmVyZW5jZSBmcm9tIHRoZSBsYXN0IGJsb2NrIGZvciBhbnkgY2hhbm5lbCBpcworICAgICAgICAgICAgICogZ3JlYXRlciB0aGFuIGEgdGhyZXNob2xkIHZhbHVlLiAqLworICAgICAgICAgICAgaWYgKGJsayA9PSAwIHx8ICFibG9jazAtPmNwbF9pbl91c2UpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNoID0gMTsgY2ggPD0gcy0+ZmJ3X2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgICAgICBibG9jay0+bmV3X2NwbF9jb29yZHNbY2hdID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IHMtPmZid19jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJsb2NrLT5jaGFubmVsX2luX2NwbFtjaF0pCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFibG9jazAtPmNoYW5uZWxfaW5fY3BsW2NoXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPm5ld19jcGxfY29vcmRzW2NoXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2VmU3VtVHlwZSBjb29yZF9kaWZmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYm5kID0gMDsgYm5kIDwgcy0+bnVtX2NwbF9iYW5kczsgYm5kKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZF9kaWZmICs9IEZGQUJTKGNwbF9jb29yZHNbYmxrLTFdW2NoXVtibmRdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbF9jb29yZHNbYmxrICBdW2NoXVtibmRdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2RpZmYgLz0gcy0+bnVtX2NwbF9iYW5kczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb29yZF9kaWZmID4gTkVXX0NQTF9DT09SRF9USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPm5ld19jcGxfY29vcmRzW2NoXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgZmluYWwgY291cGxpbmcgY29vcmRpbmF0ZXMsIHRha2luZyBpbnRvIGFjY291bnQgcmV1c2luZyBvZgorICAgICAgIGNvb3JkaW5hdGVzIGluIHN1Y2Nlc3NpdmUgYmxvY2tzICovCisgICAgZm9yIChibmQgPSAwOyBibmQgPCBzLT5udW1fY3BsX2JhbmRzOyBibmQrKykgeworICAgICAgICBibGsgPSAwOworICAgICAgICB3aGlsZSAoYmxrIDwgcy0+bnVtX2Jsb2NrcykgeworICAgICAgICAgICAgaW50IGF2X3VuaW5pdChibGsxKTsKKyAgICAgICAgICAgIEFDM0Jsb2NrICpibG9jayAgPSAmcy0+YmxvY2tzW2Jsa107CisKKyAgICAgICAgICAgIGlmICghYmxvY2stPmNwbF9pbl91c2UpIHsKKyAgICAgICAgICAgICAgICBibGsrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IHMtPmZid19jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgICAgIENvZWZTdW1UeXBlIGVuZXJneV9jaCwgZW5lcmd5X2NwbDsKKyAgICAgICAgICAgICAgICBpZiAoIWJsb2NrLT5jaGFubmVsX2luX2NwbFtjaF0pCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGVuZXJneV9jcGwgPSBlbmVyZ3lbYmxrXVtDUExfQ0hdW2JuZF07CisgICAgICAgICAgICAgICAgZW5lcmd5X2NoID0gZW5lcmd5W2Jsa11bY2hdW2JuZF07CisgICAgICAgICAgICAgICAgYmxrMSA9IGJsaysxOworICAgICAgICAgICAgICAgIHdoaWxlIChibGsxIDwgcy0+bnVtX2Jsb2NrcyAmJiAhcy0+YmxvY2tzW2JsazFdLm5ld19jcGxfY29vcmRzW2NoXSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+YmxvY2tzW2JsazFdLmNwbF9pbl91c2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZXJneV9jcGwgKz0gZW5lcmd5W2JsazFdW0NQTF9DSF1bYm5kXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZXJneV9jaCArPSBlbmVyZ3lbYmxrMV1bY2hdW2JuZF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYmxrMSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjcGxfY29vcmRzW2Jsa11bY2hdW2JuZF0gPSBjYWxjX2NwbF9jb29yZChlbmVyZ3lfY2gsIGVuZXJneV9jcGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxrID0gYmxrMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBleHBvbmVudHMvbWFudGlzc2FzIGZvciBjb3VwbGluZyBjb29yZGluYXRlcyAqLworICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspIHsKKyAgICAgICAgQUMzQmxvY2sgKmJsb2NrID0gJnMtPmJsb2Nrc1tibGtdOworICAgICAgICBpZiAoIWJsb2NrLT5jcGxfaW5fdXNlKQorICAgICAgICAgICAgY29udGludWU7CisKKyNpZiBDT05GSUdfQUMzRU5DX0ZMT0FUCisgICAgICAgIHMtPmFjM2RzcC5mbG9hdF90b19maXhlZDI0KGZpeGVkX2NwbF9jb29yZHNbYmxrXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BsX2Nvb3Jkc1tibGtdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mYndfY2hhbm5lbHMgKiAxNik7CisjZW5kaWYKKyAgICAgICAgcy0+YWMzZHNwLmV4dHJhY3RfZXhwb25lbnRzKGJsb2NrLT5jcGxfY29vcmRfZXhwWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfY3BsX2Nvb3Jkc1tibGtdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmJ3X2NoYW5uZWxzICogMTYpOworCisgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGludCBibmQsIG1pbl9leHAsIG1heF9leHAsIG1hc3Rlcl9leHA7CisKKyAgICAgICAgICAgIGlmICghYmxvY2stPm5ld19jcGxfY29vcmRzW2NoXSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLyogZGV0ZXJtaW5lIG1hc3RlciBleHBvbmVudCAqLworICAgICAgICAgICAgbWluX2V4cCA9IG1heF9leHAgPSBibG9jay0+Y3BsX2Nvb3JkX2V4cFtjaF1bMF07CisgICAgICAgICAgICBmb3IgKGJuZCA9IDE7IGJuZCA8IHMtPm51bV9jcGxfYmFuZHM7IGJuZCsrKSB7CisgICAgICAgICAgICAgICAgaW50IGV4cCA9IGJsb2NrLT5jcGxfY29vcmRfZXhwW2NoXVtibmRdOworICAgICAgICAgICAgICAgIG1pbl9leHAgPSBGRk1JTihleHAsIG1pbl9leHApOworICAgICAgICAgICAgICAgIG1heF9leHAgPSBGRk1BWChleHAsIG1heF9leHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFzdGVyX2V4cCA9ICgobWF4X2V4cCAtIDE1KSArIDIpIC8gMzsKKyAgICAgICAgICAgIG1hc3Rlcl9leHAgPSBGRk1BWChtYXN0ZXJfZXhwLCAwKTsKKyAgICAgICAgICAgIHdoaWxlIChtaW5fZXhwIDwgbWFzdGVyX2V4cCAqIDMpCisgICAgICAgICAgICAgICAgbWFzdGVyX2V4cC0tOworICAgICAgICAgICAgZm9yIChibmQgPSAwOyBibmQgPCBzLT5udW1fY3BsX2JhbmRzOyBibmQrKykgeworICAgICAgICAgICAgICAgIGJsb2NrLT5jcGxfY29vcmRfZXhwW2NoXVtibmRdID0gYXZfY2xpcChibG9jay0+Y3BsX2Nvb3JkX2V4cFtjaF1bYm5kXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl9leHAgKiAzLCAwLCAxNSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibG9jay0+Y3BsX21hc3Rlcl9leHBbY2hdID0gbWFzdGVyX2V4cDsKKworICAgICAgICAgICAgLyogcXVhbnRpemUgbWFudGlzc2FzICovCisgICAgICAgICAgICBmb3IgKGJuZCA9IDA7IGJuZCA8IHMtPm51bV9jcGxfYmFuZHM7IGJuZCsrKSB7CisgICAgICAgICAgICAgICAgaW50IGNwbF9leHAgID0gYmxvY2stPmNwbF9jb29yZF9leHBbY2hdW2JuZF07CisgICAgICAgICAgICAgICAgaW50IGNwbF9tYW50ID0gKGZpeGVkX2NwbF9jb29yZHNbYmxrXVtjaF1bYm5kXSA8PCAoNSArIGNwbF9leHAgKyBtYXN0ZXJfZXhwICogMykpID4+IDI0OworICAgICAgICAgICAgICAgIGlmIChjcGxfZXhwID09IDE1KQorICAgICAgICAgICAgICAgICAgICBjcGxfbWFudCA+Pj0gMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNwbF9tYW50IC09IDE2OworCisgICAgICAgICAgICAgICAgYmxvY2stPmNwbF9jb29yZF9tYW50W2NoXVtibmRdID0gY3BsX21hbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoQ09ORklHX0VBQzNfRU5DT0RFUiAmJiBzLT5lYWMzKQorICAgICAgICBmZl9lYWMzX3NldF9jcGxfc3RhdGVzKHMpOworfQorCisKKy8qCisgKiBEZXRlcm1pbmUgcmVtYXRyaXhpbmcgZmxhZ3MgZm9yIGVhY2ggYmxvY2sgYW5kIGJhbmQuCisgKi8KK3N0YXRpYyB2b2lkIGNvbXB1dGVfcmVtYXRyaXhpbmdfc3RyYXRlZ3koQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgbmJfY29lZnM7CisgICAgaW50IGJsaywgYm5kOworICAgIEFDM0Jsb2NrICpibG9jaywgKmJsb2NrMCA9IE5VTEw7CisKKyAgICBpZiAocy0+Y2hhbm5lbF9tb2RlICE9IEFDM19DSE1PREVfU1RFUkVPKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKSB7CisgICAgICAgIGJsb2NrID0gJnMtPmJsb2Nrc1tibGtdOworICAgICAgICBibG9jay0+bmV3X3JlbWF0cml4aW5nX3N0cmF0ZWd5ID0gIWJsazsKKworICAgICAgICBibG9jay0+bnVtX3JlbWF0cml4aW5nX2JhbmRzID0gNDsKKyAgICAgICAgaWYgKGJsb2NrLT5jcGxfaW5fdXNlKSB7CisgICAgICAgICAgICBibG9jay0+bnVtX3JlbWF0cml4aW5nX2JhbmRzIC09IChzLT5zdGFydF9mcmVxW0NQTF9DSF0gPD0gNjEpOworICAgICAgICAgICAgYmxvY2stPm51bV9yZW1hdHJpeGluZ19iYW5kcyAtPSAocy0+c3RhcnRfZnJlcVtDUExfQ0hdID09IDM3KTsKKyAgICAgICAgICAgIGlmIChibGsgJiYgYmxvY2stPm51bV9yZW1hdHJpeGluZ19iYW5kcyAhPSBibG9jazAtPm51bV9yZW1hdHJpeGluZ19iYW5kcykKKyAgICAgICAgICAgICAgICBibG9jay0+bmV3X3JlbWF0cml4aW5nX3N0cmF0ZWd5ID0gMTsKKyAgICAgICAgfQorICAgICAgICBuYl9jb2VmcyA9IEZGTUlOKGJsb2NrLT5lbmRfZnJlcVsxXSwgYmxvY2stPmVuZF9mcmVxWzJdKTsKKworICAgICAgICBpZiAoIXMtPnJlbWF0cml4aW5nX2VuYWJsZWQpIHsKKyAgICAgICAgICAgIGJsb2NrMCA9IGJsb2NrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGJuZCA9IDA7IGJuZCA8IGJsb2NrLT5udW1fcmVtYXRyaXhpbmdfYmFuZHM7IGJuZCsrKSB7CisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgc3VtIG9mIHNxdWFyZWQgY29lZmZzIGZvciBvbmUgYmFuZCBpbiBvbmUgYmxvY2sgKi8KKyAgICAgICAgICAgIGludCBzdGFydCA9IGZmX2FjM19yZW1hdHJpeF9iYW5kX3RhYltibmRdOworICAgICAgICAgICAgaW50IGVuZCAgID0gRkZNSU4obmJfY29lZnMsIGZmX2FjM19yZW1hdHJpeF9iYW5kX3RhYltibmQrMV0pOworICAgICAgICAgICAgQ29lZlN1bVR5cGUgc3VtWzRdOworICAgICAgICAgICAgc3VtX3NxdWFyZV9idXR0ZXJmbHkocywgc3VtLCBibG9jay0+bWRjdF9jb2VmWzFdICsgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+bWRjdF9jb2VmWzJdICsgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKworICAgICAgICAgICAgLyogY29tcGFyZSBzdW1zIHRvIGRldGVybWluZSBpZiByZW1hdHJpeGluZyB3aWxsIGJlIHVzZWQgZm9yIHRoaXMgYmFuZCAqLworICAgICAgICAgICAgaWYgKEZGTUlOKHN1bVsyXSwgc3VtWzNdKSA8IEZGTUlOKHN1bVswXSwgc3VtWzFdKSkKKyAgICAgICAgICAgICAgICBibG9jay0+cmVtYXRyaXhpbmdfZmxhZ3NbYm5kXSA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmxvY2stPnJlbWF0cml4aW5nX2ZsYWdzW2JuZF0gPSAwOworCisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgaWYgbmV3IHJlbWF0cml4aW5nIGZsYWdzIHdpbGwgYmUgc2VudCAqLworICAgICAgICAgICAgaWYgKGJsayAmJgorICAgICAgICAgICAgICAgIGJsb2NrLT5yZW1hdHJpeGluZ19mbGFnc1tibmRdICE9IGJsb2NrMC0+cmVtYXRyaXhpbmdfZmxhZ3NbYm5kXSkgeworICAgICAgICAgICAgICAgIGJsb2NrLT5uZXdfcmVtYXRyaXhpbmdfc3RyYXRlZ3kgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJsb2NrMCA9IGJsb2NrOworICAgIH0KK30KKworCitpbnQgQUMzX05BTUUoZW5jb2RlX2ZyYW1lKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIEFDM0VuY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAocy0+b3B0aW9ucy5hbGxvd19wZXJfZnJhbWVfbWV0YWRhdGEpIHsKKyAgICAgICAgcmV0ID0gZmZfYWMzX3ZhbGlkYXRlX21ldGFkYXRhKHMpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAocy0+Yml0X2FsbG9jLnNyX2NvZGUgPT0gMSB8fCBzLT5lYWMzKQorICAgICAgICBmZl9hYzNfYWRqdXN0X2ZyYW1lX3NpemUocyk7CisKKyAgICBjb3B5X2lucHV0X3NhbXBsZXMocywgKFNhbXBsZVR5cGUgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGEpOworCisgICAgYXBwbHlfbWRjdChzKTsKKworICAgIGlmIChzLT5maXhlZF9wb2ludCkKKyAgICAgICAgc2NhbGVfY29lZmZpY2llbnRzKHMpOworCisgICAgY2xpcF9jb2VmZmljaWVudHMoJnMtPmFkc3AsIHMtPmJsb2Nrc1swXS5tZGN0X2NvZWZbMV0sCisgICAgICAgICAgICAgICAgICAgICAgQUMzX01BWF9DT0VGUyAqIHMtPm51bV9ibG9ja3MgKiBzLT5jaGFubmVscyk7CisKKyAgICBzLT5jcGxfb24gPSBzLT5jcGxfZW5hYmxlZDsKKyAgICBmZl9hYzNfY29tcHV0ZV9jb3VwbGluZ19zdHJhdGVneShzKTsKKworICAgIGlmIChzLT5jcGxfb24pCisgICAgICAgIGFwcGx5X2NoYW5uZWxfY291cGxpbmcocyk7CisKKyAgICBjb21wdXRlX3JlbWF0cml4aW5nX3N0cmF0ZWd5KHMpOworCisgICAgaWYgKCFzLT5maXhlZF9wb2ludCkKKyAgICAgICAgc2NhbGVfY29lZmZpY2llbnRzKHMpOworCisgICAgZmZfYWMzX2FwcGx5X3JlbWF0cml4aW5nKHMpOworCisgICAgZmZfYWMzX3Byb2Nlc3NfZXhwb25lbnRzKHMpOworCisgICAgcmV0ID0gZmZfYWMzX2NvbXB1dGVfYml0X2FsbG9jYXRpb24ocyk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJpdCBhbGxvY2F0aW9uIGZhaWxlZC4gVHJ5IGluY3JlYXNpbmcgdGhlIGJpdHJhdGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmZl9hYzNfZ3JvdXBfZXhwb25lbnRzKHMpOworCisgICAgZmZfYWMzX3F1YW50aXplX21hbnRpc3NhcyhzKTsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIHMtPmZyYW1lX3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZmZfYWMzX291dHB1dF9mcmFtZShzLCBhdnBrdC0+ZGF0YSk7CisKKyAgICBpZiAoZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgYXZwa3QtPnB0cyA9IGZyYW1lLT5wdHMgLSBmZl9zYW1wbGVzX3RvX3RpbWVfYmFzZShhdmN0eCwgYXZjdHgtPmluaXRpYWxfcGFkZGluZyk7CisKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWMzdGFiLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzN0YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjJkOGJmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWMzdGFiLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBBQy0zIHRhYmxlcworICogY29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiB0YWJsZXMgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUgQUMtMyBzcGVjLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYWMzdGFiLmgiCisKKy8qKgorICogUG9zc2libGUgZnJhbWUgc2l6ZXMuCisgKiBmcm9tIEFUU0MgQS81MiBUYWJsZSA1LjE4IEZyYW1lIFNpemUgQ29kZSBUYWJsZS4KKyAqLworY29uc3QgdWludDE2X3QgZmZfYWMzX2ZyYW1lX3NpemVfdGFiWzM4XVszXSA9IHsKKyAgICB7IDY0LCAgIDY5LCAgIDk2ICAgfSwKKyAgICB7IDY0LCAgIDcwLCAgIDk2ICAgfSwKKyAgICB7IDgwLCAgIDg3LCAgIDEyMCAgfSwKKyAgICB7IDgwLCAgIDg4LCAgIDEyMCAgfSwKKyAgICB7IDk2LCAgIDEwNCwgIDE0NCAgfSwKKyAgICB7IDk2LCAgIDEwNSwgIDE0NCAgfSwKKyAgICB7IDExMiwgIDEyMSwgIDE2OCAgfSwKKyAgICB7IDExMiwgIDEyMiwgIDE2OCAgfSwKKyAgICB7IDEyOCwgIDEzOSwgIDE5MiAgfSwKKyAgICB7IDEyOCwgIDE0MCwgIDE5MiAgfSwKKyAgICB7IDE2MCwgIDE3NCwgIDI0MCAgfSwKKyAgICB7IDE2MCwgIDE3NSwgIDI0MCAgfSwKKyAgICB7IDE5MiwgIDIwOCwgIDI4OCAgfSwKKyAgICB7IDE5MiwgIDIwOSwgIDI4OCAgfSwKKyAgICB7IDIyNCwgIDI0MywgIDMzNiAgfSwKKyAgICB7IDIyNCwgIDI0NCwgIDMzNiAgfSwKKyAgICB7IDI1NiwgIDI3OCwgIDM4NCAgfSwKKyAgICB7IDI1NiwgIDI3OSwgIDM4NCAgfSwKKyAgICB7IDMyMCwgIDM0OCwgIDQ4MCAgfSwKKyAgICB7IDMyMCwgIDM0OSwgIDQ4MCAgfSwKKyAgICB7IDM4NCwgIDQxNywgIDU3NiAgfSwKKyAgICB7IDM4NCwgIDQxOCwgIDU3NiAgfSwKKyAgICB7IDQ0OCwgIDQ4NywgIDY3MiAgfSwKKyAgICB7IDQ0OCwgIDQ4OCwgIDY3MiAgfSwKKyAgICB7IDUxMiwgIDU1NywgIDc2OCAgfSwKKyAgICB7IDUxMiwgIDU1OCwgIDc2OCAgfSwKKyAgICB7IDY0MCwgIDY5NiwgIDk2MCAgfSwKKyAgICB7IDY0MCwgIDY5NywgIDk2MCAgfSwKKyAgICB7IDc2OCwgIDgzNSwgIDExNTIgfSwKKyAgICB7IDc2OCwgIDgzNiwgIDExNTIgfSwKKyAgICB7IDg5NiwgIDk3NSwgIDEzNDQgfSwKKyAgICB7IDg5NiwgIDk3NiwgIDEzNDQgfSwKKyAgICB7IDEwMjQsIDExMTQsIDE1MzYgfSwKKyAgICB7IDEwMjQsIDExMTUsIDE1MzYgfSwKKyAgICB7IDExNTIsIDEyNTMsIDE3MjggfSwKKyAgICB7IDExNTIsIDEyNTQsIDE3MjggfSwKKyAgICB7IDEyODAsIDEzOTMsIDE5MjAgfSwKKyAgICB7IDEyODAsIDEzOTQsIDE5MjAgfSwKK307CisKKy8qKgorICogTWFwIGF1ZGlvIGNvZGluZyBtb2RlIChhY21vZCkgdG8gbnVtYmVyIG9mIGZ1bGwtYmFuZHdpZHRoIGNoYW5uZWxzLgorICogZnJvbSBBVFNDIEEvNTIgVGFibGUgNS44IEF1ZGlvIENvZGluZyBNb2RlCisgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfYWMzX2NoYW5uZWxzX3RhYls4XSA9IHsKKyAgICAyLCAxLCAyLCAzLCAzLCA0LCA0LCA1Cit9OworCisvKioKKyAqIE1hcCBhdWRpbyBjb2RpbmcgbW9kZSAoYWNtb2QpIHRvIGNoYW5uZWwgbGF5b3V0IG1hc2suCisgKi8KK2NvbnN0IHVpbnQxNl90IGF2cHJpdl9hYzNfY2hhbm5lbF9sYXlvdXRfdGFiWzhdID0geworICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgQVZfQ0hfTEFZT1VUX01PTk8sCisgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywKKyAgICBBVl9DSF9MQVlPVVRfU1VSUk9VTkQsCisgICAgQVZfQ0hfTEFZT1VUXzJfMSwKKyAgICBBVl9DSF9MQVlPVVRfNFBPSU5UMCwKKyAgICBBVl9DSF9MQVlPVVRfMl8yLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwCit9OworCisjZGVmaW5lIENPTU1PTl9DSEFOTkVMX01BUCBcCisgICAgeyB7IDAsIDEsICAgICAgICAgIH0sIHsgMCwgMSwgMiwgICAgICAgICB9IH0sXAorICAgIHsgeyAwLCAgICAgICAgICAgICB9LCB7IDAsIDEsICAgICAgICAgICAgfSB9LFwKKyAgICB7IHsgMCwgMSwgICAgICAgICAgfSwgeyAwLCAxLCAyLCAgICAgICAgIH0gfSxcCisgICAgeyB7IDAsIDIsIDEsICAgICAgIH0sIHsgMCwgMiwgMSwgMywgICAgICB9IH0sXAorICAgIHsgeyAwLCAxLCAyLCAgICAgICB9LCB7IDAsIDEsIDMsIDIsICAgICAgfSB9LFwKKyAgICB7IHsgMCwgMiwgMSwgMywgICAgfSwgeyAwLCAyLCAxLCA0LCAzLCAgIH0gfSwKKworLyoqCisgKiBUYWJsZSB0byByZW1hcCBjaGFubmVscyBmcm9tIFNNUFRFIG9yZGVyIHRvIEFDLTMgb3JkZXIuCisgKiBbY2hhbm5lbF9tb2RlXVtsZmVdW2NoXQorICovCitjb25zdCB1aW50OF90IGZmX2FjM19lbmNfY2hhbm5lbF9tYXBbOF1bMl1bNl0gPSB7CisgICAgQ09NTU9OX0NIQU5ORUxfTUFQCisgICAgeyB7IDAsIDEsIDIsIDMsICAgIH0sIHsgMCwgMSwgMywgNCwgMiwgICB9IH0sCisgICAgeyB7IDAsIDIsIDEsIDMsIDQsIH0sIHsgMCwgMiwgMSwgNCwgNSwgMyB9IH0sCit9OworCisvKioKKyAqIFRhYmxlIHRvIHJlbWFwIGNoYW5uZWxzIGZyb20gQUMtMyBvcmRlciB0byBTTVBURSBvcmRlci4KKyAqIFtjaGFubmVsX21vZGVdW2xmZV1bY2hdCisgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfYWMzX2RlY19jaGFubmVsX21hcFs4XVsyXVs2XSA9IHsKKyAgICBDT01NT05fQ0hBTk5FTF9NQVAKKyAgICB7IHsgMCwgMSwgMiwgMywgICAgfSwgeyAwLCAxLCA0LCAyLCAzLCAgIH0gfSwKKyAgICB7IHsgMCwgMiwgMSwgMywgNCwgfSwgeyAwLCAyLCAxLCA1LCAzLCA0IH0gfSwKK307CisKKy8qIHBvc3NpYmxlIGZyZXF1ZW5jaWVzICovCitjb25zdCB1aW50MTZfdCBmZl9hYzNfc2FtcGxlX3JhdGVfdGFiWzNdID0geyA0ODAwMCwgNDQxMDAsIDMyMDAwIH07CisKKy8qIHBvc3NpYmxlIGJpdHJhdGVzICovCitjb25zdCB1aW50MTZfdCBmZl9hYzNfYml0cmF0ZV90YWJbMTldID0geworICAgIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwKKyAgICAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0LCA0NDgsIDUxMiwgNTc2LCA2NDAKK307CisKKy8qKgorICogVGFibGUgb2YgYmluIGxvY2F0aW9ucyBmb3IgcmVtYXRyaXhpbmcgYmFuZHMKKyAqIHJlZmVyZW5jZTogU2VjdGlvbiA3LjUuMiBSZW1hdHJpeGluZyA6IEZyZXF1ZW5jeSBCYW5kIERlZmluaXRpb25zCisgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfYWMzX3JlbWF0cml4X2JhbmRfdGFiWzVdID0geyAxMywgMjUsIDM3LCA2MSwgMjUzIH07CisKKy8qKgorICogVGFibGUgRTIuMTYgRGVmYXVsdCBDb3VwbGluZyBCYW5kaW5nIFN0cnVjdHVyZQorICovCitjb25zdCB1aW50OF90IGZmX2VhYzNfZGVmYXVsdF9jcGxfYmFuZF9zdHJ1Y3RbMThdID0geworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEKK307CisKKy8qIEFDLTMgTURDVCB3aW5kb3cgKi8KKworLyogTURDVCB3aW5kb3cgKi8KK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgaW50MTZfdCwgZmZfYWMzX3dpbmRvdylbQUMzX1dJTkRPV19TSVpFLzJdID0geworICAgIDQsICAgIDcsICAgMTIsICAgMTYsICAgMjEsICAgMjgsICAgMzQsICAgNDIsCisgICA1MSwgICA2MSwgICA3MiwgICA4NCwgICA5NywgIDExMSwgIDEyNywgIDE0NSwKKyAgMTY0LCAgMTg0LCAgMjA3LCAgMjMxLCAgMjU3LCAgMjg1LCAgMzE1LCAgMzQ3LAorICAzODIsICA0MTksICA0NTgsICA1MDAsICA1NDQsICA1OTEsICA2NDEsICA2OTQsCisgIDc1MCwgIDgxMCwgIDg3MiwgIDkzNywgMTAwNywgMTA3OSwgMTE1NSwgMTIzNSwKKyAxMzE4LCAxNDA2LCAxNDk3LCAxNTkzLCAxNjkyLCAxNzk2LCAxOTAzLCAyMDE2LAorIDIxMzIsIDIyNTMsIDIzNzksIDI1MDksIDI2NDQsIDI3ODMsIDI5MjcsIDMwNzYsCisgMzIzMCwgMzM4OSwgMzU1MiwgMzcyMSwgMzg5NCwgNDA3MiwgNDI1NSwgNDQ0NCwKKyA0NjM3LCA0ODM1LCA1MDM4LCA1MjQ2LCA1NDU5LCA1Njc3LCA1ODk5LCA2MTI3LAorIDYzNTksIDY1OTYsIDY4MzcsIDcwODMsIDczMzQsIDc1ODksIDc4NDgsIDgxMTIsCisgODM4MCwgODY1MiwgODkyNywgOTIwNywgOTQ5MSwgOTc3OCwxMDA2OSwxMDM2MywKKzEwNjYwLDEwOTYwLDExMjY0LDExNTcwLDExODc5LDEyMTkwLDEyNTA0LDEyODIwLAorMTMxMzgsMTM0NTgsMTM3ODAsMTQxMDMsMTQ0MjcsMTQ3NTMsMTUwNzksMTU0MDcsCisxNTczNSwxNjA2MywxNjM5MiwxNjcyMCwxNzA0OSwxNzM3NywxNzcwNSwxODAzMiwKKzE4MzU4LDE4NjgzLDE5MDA3LDE5MzMwLDE5NjUxLDE5OTcwLDIwMjg3LDIwNjAyLAorMjA5MTQsMjEyMjUsMjE1MzIsMjE4MzcsMjIxMzksMjI0MzgsMjI3MzMsMjMwMjUsCisyMzMxNCwyMzU5OSwyMzg4MCwyNDE1NywyNDQzMCwyNDY5OSwyNDk2NCwyNTIyNSwKKzI1NDgxLDI1NzMyLDI1OTc5LDI2MjIxLDI2NDU5LDI2NjkxLDI2OTE5LDI3MTQyLAorMjczNTksMjc1NzIsMjc3ODAsMjc5ODMsMjgxODAsMjgzNzMsMjg1NjAsMjg3NDIsCisyODkxOSwyOTA5MSwyOTI1OCwyOTQyMCwyOTU3NywyOTcyOSwyOTg3NiwzMDAxOCwKKzMwMTU1LDMwMjg4LDMwNDE1LDMwNTM4LDMwNjU3LDMwNzcxLDMwODgwLDMwOTg1LAorMzEwODYsMzExODIsMzEyNzQsMzEzNjMsMzE0NDcsMzE1MjgsMzE2MDUsMzE2NzgsCiszMTc0NywzMTgxNCwzMTg3NywzMTkzNiwzMTk5MywzMjA0NiwzMjA5NywzMjE0NSwKKzMyMTkwLDMyMjMyLDMyMjcyLDMyMzEwLDMyMzQ1LDMyMzc4LDMyNDA5LDMyNDM4LAorMzI0NjUsMzI0OTAsMzI1MTMsMzI1MzUsMzI1NTYsMzI1NzQsMzI1OTIsMzI2MDgsCiszMjYyMywzMjYzNiwzMjY0OSwzMjY2MSwzMjY3MSwzMjY4MSwzMjY5MCwzMjY5OCwKKzMyNzA1LDMyNzEyLDMyNzE4LDMyNzI0LDMyNzI5LDMyNzMzLDMyNzM3LDMyNzQxLAorMzI3NDQsMzI3NDcsMzI3NTAsMzI3NTIsMzI3NTQsMzI3NTYsMzI3NTcsMzI3NTksCiszMjc2MCwzMjc2MSwzMjc2MiwzMjc2MywzMjc2NCwzMjc2NCwzMjc2NSwzMjc2NSwKKzMyNzY2LDMyNzY2LDMyNzY2LDMyNzY2LDMyNzY3LDMyNzY3LDMyNzY3LDMyNzY3LAorMzI3NjcsMzI3NjcsMzI3NjcsMzI3NjcsMzI3NjcsMzI3NjcsMzI3NjcsMzI3NjcsCiszMjc2NywzMjc2NywzMjc2NywzMjc2NywzMjc2NywzMjc2NywzMjc2NywzMjc2NywKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfYWMzX2xvZ19hZGRfdGFiWzI2MF09IHsKKzB4NDAsMHgzZiwweDNlLDB4M2QsMHgzYywweDNiLDB4M2EsMHgzOSwweDM4LDB4MzcsCisweDM2LDB4MzUsMHgzNCwweDM0LDB4MzMsMHgzMiwweDMxLDB4MzAsMHgyZiwweDJmLAorMHgyZSwweDJkLDB4MmMsMHgyYywweDJiLDB4MmEsMHgyOSwweDI5LDB4MjgsMHgyNywKKzB4MjYsMHgyNiwweDI1LDB4MjQsMHgyNCwweDIzLDB4MjMsMHgyMiwweDIxLDB4MjEsCisweDIwLDB4MjAsMHgxZiwweDFlLDB4MWUsMHgxZCwweDFkLDB4MWMsMHgxYywweDFiLAorMHgxYiwweDFhLDB4MWEsMHgxOSwweDE5LDB4MTgsMHgxOCwweDE3LDB4MTcsMHgxNiwKKzB4MTYsMHgxNSwweDE1LDB4MTUsMHgxNCwweDE0LDB4MTMsMHgxMywweDEzLDB4MTIsCisweDEyLDB4MTIsMHgxMSwweDExLDB4MTEsMHgxMCwweDEwLDB4MTAsMHgwZiwweDBmLAorMHgwZiwweDBlLDB4MGUsMHgwZSwweDBkLDB4MGQsMHgwZCwweDBkLDB4MGMsMHgwYywKKzB4MGMsMHgwYywweDBiLDB4MGIsMHgwYiwweDBiLDB4MGEsMHgwYSwweDBhLDB4MGEsCisweDBhLDB4MDksMHgwOSwweDA5LDB4MDksMHgwOSwweDA4LDB4MDgsMHgwOCwweDA4LAorMHgwOCwweDA4LDB4MDcsMHgwNywweDA3LDB4MDcsMHgwNywweDA3LDB4MDYsMHgwNiwKKzB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDUsMHgwNSwweDA1LDB4MDUsCisweDA1LDB4MDUsMHgwNSwweDA1LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LAorMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDMsMHgwMywweDAzLDB4MDMsMHgwMywKKzB4MDMsMHgwMywweDAzLDB4MDMsMHgwMywweDAzLDB4MDMsMHgwMywweDAzLDB4MDIsCisweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLAorMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDEsMHgwMSwKKzB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCisweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorfTsKKworY29uc3QgdWludDE2X3QgZmZfYWMzX2hlYXJpbmdfdGhyZXNob2xkX3RhYltBQzNfQ1JJVElDQUxfQkFORFNdWzNdPSB7Cit7IDB4MDRkMCwweDA0ZjAsMHgwNTgwIH0sCit7IDB4MDRkMCwweDA0ZjAsMHgwNTgwIH0sCit7IDB4MDQ0MCwweDA0NjAsMHgwNGIwIH0sCit7IDB4MDQwMCwweDA0MTAsMHgwNDUwIH0sCit7IDB4MDNlMCwweDAzZTAsMHgwNDIwIH0sCit7IDB4MDNjMCwweDAzZDAsMHgwM2YwIH0sCit7IDB4MDNiMCwweDAzYzAsMHgwM2UwIH0sCit7IDB4MDNiMCwweDAzYjAsMHgwM2QwIH0sCit7IDB4MDNhMCwweDAzYjAsMHgwM2MwIH0sCit7IDB4MDNhMCwweDAzYTAsMHgwM2IwIH0sCit7IDB4MDNhMCwweDAzYTAsMHgwM2IwIH0sCit7IDB4MDNhMCwweDAzYTAsMHgwM2IwIH0sCit7IDB4MDNhMCwweDAzYTAsMHgwM2EwIH0sCit7IDB4MDM5MCwweDAzYTAsMHgwM2EwIH0sCit7IDB4MDM5MCwweDAzOTAsMHgwM2EwIH0sCit7IDB4MDM5MCwweDAzOTAsMHgwM2EwIH0sCit7IDB4MDM4MCwweDAzOTAsMHgwM2EwIH0sCit7IDB4MDM4MCwweDAzODAsMHgwM2EwIH0sCit7IDB4MDM3MCwweDAzODAsMHgwM2EwIH0sCit7IDB4MDM3MCwweDAzODAsMHgwM2EwIH0sCit7IDB4MDM2MCwweDAzNzAsMHgwMzkwIH0sCit7IDB4MDM2MCwweDAzNzAsMHgwMzkwIH0sCit7IDB4MDM1MCwweDAzNjAsMHgwMzkwIH0sCit7IDB4MDM1MCwweDAzNjAsMHgwMzkwIH0sCit7IDB4MDM0MCwweDAzNTAsMHgwMzgwIH0sCit7IDB4MDM0MCwweDAzNTAsMHgwMzgwIH0sCit7IDB4MDMzMCwweDAzNDAsMHgwMzgwIH0sCit7IDB4MDMyMCwweDAzNDAsMHgwMzcwIH0sCit7IDB4MDMxMCwweDAzMjAsMHgwMzYwIH0sCit7IDB4MDMwMCwweDAzMTAsMHgwMzUwIH0sCit7IDB4MDJmMCwweDAzMDAsMHgwMzQwIH0sCit7IDB4MDJmMCwweDAyZjAsMHgwMzMwIH0sCit7IDB4MDJmMCwweDAyZjAsMHgwMzIwIH0sCit7IDB4MDJmMCwweDAyZjAsMHgwMzEwIH0sCit7IDB4MDMwMCwweDAyZjAsMHgwMzAwIH0sCit7IDB4MDMxMCwweDAzMDAsMHgwMmYwIH0sCit7IDB4MDM0MCwweDAzMjAsMHgwMmYwIH0sCit7IDB4MDM5MCwweDAzNTAsMHgwMmYwIH0sCit7IDB4MDNlMCwweDAzOTAsMHgwMzAwIH0sCit7IDB4MDQyMCwweDAzZTAsMHgwMzEwIH0sCit7IDB4MDQ2MCwweDA0MjAsMHgwMzMwIH0sCit7IDB4MDQ5MCwweDA0NTAsMHgwMzUwIH0sCit7IDB4MDRhMCwweDA0YTAsMHgwM2MwIH0sCit7IDB4MDQ2MCwweDA0OTAsMHgwNDEwIH0sCit7IDB4MDQ0MCwweDA0NjAsMHgwNDcwIH0sCit7IDB4MDQ0MCwweDA0NDAsMHgwNGEwIH0sCit7IDB4MDUyMCwweDA0ODAsMHgwNDYwIH0sCit7IDB4MDgwMCwweDA2MzAsMHgwNDQwIH0sCit7IDB4MDg0MCwweDA4NDAsMHgwNDUwIH0sCit7IDB4MDg0MCwweDA4NDAsMHgwNGUwIH0sCit9OworCitjb25zdCB1aW50OF90IGZmX2FjM19iYXBfdGFiWzY0XT0geworICAgIDAsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDMsIDMsCisgICAgMywgNCwgNCwgNSwgNSwgNiwgNiwgNiwgNiwgNywKKyAgICA3LCA3LCA3LCA4LCA4LCA4LCA4LCA5LCA5LCA5LAorICAgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsCit9OworCitjb25zdCB1aW50OF90IGZmX2FjM19zbG93X2RlY2F5X3RhYls0XT17CisgICAgMHgwZiwgMHgxMSwgMHgxMywgMHgxNSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfYWMzX2Zhc3RfZGVjYXlfdGFiWzRdPXsKKyAgICAweDNmLCAweDUzLCAweDY3LCAweDdiLAorfTsKKworY29uc3QgdWludDE2X3QgZmZfYWMzX3Nsb3dfZ2Fpbl90YWJbNF09IHsKKyAgICAweDU0MCwgMHg0ZDgsIDB4NDc4LCAweDQxMCwKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX2FjM19kYl9wZXJfYml0X3RhYls0XT0geworICAgIDB4MDAwLCAweDcwMCwgMHg5MDAsIDB4YjAwLAorfTsKKworY29uc3QgaW50MTZfdCBmZl9hYzNfZmxvb3JfdGFiWzhdPSB7CisgICAgMHgyZjAsIDB4MmIwLCAweDI3MCwgMHgyMzAsIDB4MWYwLCAweDE3MCwgMHgwZjAsIDB4ZjgwMCwKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX2FjM19mYXN0X2dhaW5fdGFiWzhdPSB7CisgICAgMHgwODAsIDB4MTAwLCAweDE4MCwgMHgyMDAsIDB4MjgwLCAweDMwMCwgMHgzODAsIDB4NDAwLAorfTsKKworLyoqCisgKiBEZWZhdWx0IGNoYW5uZWwgbWFwIGZvciBhIGRlcGVuZGVudCBzdWJzdHJlYW0gZGVmaW5lZCBieSBhY21vZAorICovCitjb25zdCB1aW50MTZfdCBmZl9lYWMzX2RlZmF1bHRfY2htYXBbOF0gPSB7CisgICAgQUMzX0NITUFQX0wgfCAgICAgICAgICAgICAgIEFDM19DSE1BUF9SLCAvLyBGSVhNRSBDaDErQ2gyCisgICAgICAgICAgICAgICAgICBBQzNfQ0hNQVBfQywKKyAgICBBQzNfQ0hNQVBfTCB8ICAgICAgICAgICAgICAgQUMzX0NITUFQX1IsCisgICAgQUMzX0NITUFQX0wgfCBBQzNfQ0hNQVBfQyB8IEFDM19DSE1BUF9SLAorICAgIEFDM19DSE1BUF9MIHwgICAgICAgICAgICAgICBBQzNfQ0hNQVBfUiB8ICAgICAgICAgICAgICAgICAgIEFDM19DSE1BUF9DX1NVUiwKKyAgICBBQzNfQ0hNQVBfTCB8IEFDM19DSE1BUF9DIHwgQUMzX0NITUFQX1IgfCAgICAgICAgICAgICAgICAgICBBQzNfQ0hNQVBfQ19TVVIsCisgICAgQUMzX0NITUFQX0wgfCAgICAgICAgICAgICAgIEFDM19DSE1BUF9SIHwgQUMzX0NITUFQX0xfU1VSIHwgICAgICAgICAgICAgICAgICBBQzNfQ0hNQVBfUl9TVVIsCisgICAgQUMzX0NITUFQX0wgfCBBQzNfQ0hNQVBfQyB8IEFDM19DSE1BUF9SIHwgQUMzX0NITUFQX0xfU1VSIHwgICAgICAgICAgICAgICAgICBBQzNfQ0hNQVBfUl9TVVIKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hYzN0YWIuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjM3RhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Y2JkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hYzN0YWIuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQUMtMyB0YWJsZXMKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FDM1RBQl9ICisjZGVmaW5lIEFWQ09ERUNfQUMzVEFCX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAiYWMzLmgiCisKKyNpZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUworIyAgIGRlZmluZSBIQ09OU1QgY29uc3QKKyNlbHNlCisjICAgZGVmaW5lIEhDT05TVAorI2VuZGlmCisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9hYzNfZnJhbWVfc2l6ZV90YWJbMzhdWzNdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX2FjM19jaGFubmVsc190YWJbOF07CitleHRlcm4gYXZfZXhwb3J0IGNvbnN0IHVpbnQxNl90IGF2cHJpdl9hYzNfY2hhbm5lbF9sYXlvdXRfdGFiWzhdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX2FjM19lbmNfY2hhbm5lbF9tYXBbOF1bMl1bNl07CitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfYWMzX2RlY19jaGFubmVsX21hcFs4XVsyXVs2XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9hYzNfc2FtcGxlX3JhdGVfdGFiWzNdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX2FjM19iaXRyYXRlX3RhYlsxOV07CitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfYWMzX3JlbWF0cml4X2JhbmRfdGFiWzVdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX2VhYzNfZGVmYXVsdF9jcGxfYmFuZF9zdHJ1Y3RbMThdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgIGZmX2FjM193aW5kb3dbQUMzX1dJTkRPV19TSVpFLzJdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX2FjM19sb2dfYWRkX3RhYlsyNjBdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX2FjM19oZWFyaW5nX3RocmVzaG9sZF90YWJbQUMzX0NSSVRJQ0FMX0JBTkRTXVszXTsKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl9hYzNfYmFwX3RhYls2NF07CitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfYWMzX3Nsb3dfZGVjYXlfdGFiWzRdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX2FjM19mYXN0X2RlY2F5X3RhYls0XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9hYzNfc2xvd19nYWluX3RhYls0XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9hYzNfZGJfcGVyX2JpdF90YWJbNF07CitleHRlcm4gY29uc3QgaW50MTZfdCAgZmZfYWMzX2Zsb29yX3RhYls4XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9hYzNfZmFzdF9nYWluX3RhYls4XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9lYWMzX2RlZmF1bHRfY2htYXBbOF07CitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfYWMzX2JhbmRfc3RhcnRfdGFiW0FDM19DUklUSUNBTF9CQU5EUysxXTsKK2V4dGVybiBIQ09OU1QgdWludDhfdCBmZl9hYzNfYmluX3RvX2JhbmRfdGFiWzI1M107CisKKy8qKiBDdXN0b20gY2hhbm5lbCBtYXAgbG9jYXRpb25zIGJpdG1hc2sKKyAqICBPdGhlciBjaGFubmVscyBkZXNjcmliZWQgaW4gZG9jdW1lbnRhdGlvbjoKKyAqICAgICAgTGMvUmMgcGFpciwgTHJzL1JycyBwYWlyLCBUcywgTHNkL1JzZCBwYWlyLAorICogICAgICBMdy9SdyBwYWlyLCBMdmgvUnZoIHBhaXIsIEN2aCwgUmVzZXJ2ZWQsIExGRTIKKyAqLworZW51bSBDdXN0b21DaGFubmVsTWFwTG9jYXRpb257CisgICAgQUMzX0NITUFQX0w9ICAgICAgICAxPDwoMTUtMCksCisgICAgQUMzX0NITUFQX0M9ICAgICAgICAxPDwoMTUtMSksCisgICAgQUMzX0NITUFQX1I9ICAgICAgICAxPDwoMTUtMiksCisgICAgQUMzX0NITUFQX0xfU1VSPSAgICAxPDwoMTUtMyksCisgICAgQUMzX0NITUFQX1JfU1VSID0gICAxPDwoMTUtNCksCisgICAgQUMzX0NITUFQX0NfU1VSPSAgICAxPDwoMTUtNyksCisgICAgQUMzX0NITUFQX0xGRSA9ICAgICAxPDwoMTUtMTUpCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19BQzNUQUJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWNlbHBfZmlsdGVycy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWNlbHBfZmlsdGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjc1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hY2VscF9maWx0ZXJzLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiB2YXJpb3VzIGZpbHRlcnMgZm9yIEFDRUxQLWJhc2VkIGNvZGVjcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBWbGFkaW1pciBWb3Jvc2hpbG92CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJhY2VscF9maWx0ZXJzLmgiCisKK2NvbnN0IGludDE2X3QgZmZfYWNlbHBfaW50ZXJwX2ZpbHRlcls2MV0gPSB7IC8qICgwLjE1KSAqLworICAyOTQ0MywgMjgzNDYsIDI1MjA3LCAyMDQ0OSwgMTQ3MDEsICA4NjkzLAorICAgMzE0MywgLTEzNTIsIC00NDAyLCAtNTg2NSwgLTU4NTAsIC00NjczLAorICAtMjc4MywgIC02NzIsICAxMjExLCAgMjUzNiwgIDMxMzAsICAyOTkxLAorICAgMjI1OSwgIDExNzAsICAgICAwLCAtMTAwMSwgLTE2NTIsIC0xODY4LAorICAtMTY2NiwgLTExNDcsICAtNDY0LCAgIDIxOCwgICA3NTYsICAxMDYwLAorICAgMTA5OSwgICA5MDQsICAgNTUwLCAgIDEzNSwgIC0yNDUsICAtNTE0LAorICAgLTYzNCwgIC02MDIsICAtNDUxLCAgLTIzMSwgICAgIDAsICAgMTkxLAorICAgIDMwOCwgICAzNDAsICAgMjk2LCAgIDE5OCwgICAgNzgsICAgLTM2LAorICAgLTEyMCwgIC0xNjMsICAtMTY1LCAgLTEzMiwgICAtNzksICAgLTE5LAorICAgICAzNCwgICAgNzMsICAgIDkxLCAgICA4OSwgICAgNzAsICAgIDM4LAorICAgICAgMCwKK307CisKK3ZvaWQgZmZfYWNlbHBfaW50ZXJwb2xhdGUoaW50MTZfdCogb3V0LCBjb25zdCBpbnQxNl90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogZmlsdGVyX2NvZWZmcywgaW50IHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYWNfcG9zLCBpbnQgZmlsdGVyX2xlbmd0aCwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgbiwgaTsKKworICAgIGF2X2Fzc2VydDEoZnJhY19wb3MgPj0gMCAmJiBmcmFjX3BvcyA8IHByZWNpc2lvbik7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbGVuZ3RoOyBuKyspIHsKKyAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgIGludCB2ID0gMHg0MDAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJfbGVuZ3RoOykgeworCisgICAgICAgICAgICAvKiBUaGUgcmVmZXJlbmNlIEcuNzI5IGFuZCBBTVIgZml4ZWQgcG9pbnQgY29kZSBwZXJmb3JtcyBjbGlwcGluZyBhZnRlcgorICAgICAgICAgICAgICAgZWFjaCBvZiB0aGUgdHdvIGZvbGxvd2luZyBhY2N1bXVsYXRpb25zLgorICAgICAgICAgICAgICAgU2luY2UgY2xpcHBpbmcgYWZmZWN0cyBvbmx5IHRoZSBzeW50aGV0aWMgT1ZFUkZMT1cgdGVzdCB3aXRob3V0CisgICAgICAgICAgICAgICBjYXVzaW5nIGFuIGludCB0eXBlIG92ZXJmbG93LCBpdCB3YXMgbW92ZWQgb3V0c2lkZSB0aGUgbG9vcC4gKi8KKworICAgICAgICAgICAgLyogIFIoeCk6PWFjX3ZbLWsreF0KKyAgICAgICAgICAgICAgICB2ICs9IFIobi1pKSpmZl9hY2VscF9pbnRlcnBfZmlsdGVyKHQrNmkpCisgICAgICAgICAgICAgICAgdiArPSBSKG4raSsxKSpmZl9hY2VscF9pbnRlcnBfZmlsdGVyKDYtdCs2aSkgKi8KKworICAgICAgICAgICAgdiArPSBpbltuICsgaV0gKiBmaWx0ZXJfY29lZmZzW2lkeCArIGZyYWNfcG9zXTsKKyAgICAgICAgICAgIGlkeCArPSBwcmVjaXNpb247CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB2ICs9IGluW24gLSBpXSAqIGZpbHRlcl9jb2VmZnNbaWR4IC0gZnJhY19wb3NdOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9jbGlwX2ludDE2KHYgPj4gMTUpICE9ICh2ID4+IDE1KSkKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIm92ZXJmbG93IHRoYXQgd291bGQgbmVlZCBjbGlwaW5nIGluIGZmX2FjZWxwX2ludGVycG9sYXRlKClcbiIpOworICAgICAgICBvdXRbbl0gPSB2ID4+IDE1OworICAgIH0KK30KKwordm9pZCBmZl9hY2VscF9pbnRlcnBvbGF0ZWYoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmZpbHRlcl9jb2VmZnMsIGludCBwcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhY19wb3MsIGludCBmaWx0ZXJfbGVuZ3RoLCBpbnQgbGVuZ3RoKQoreworICAgIGludCBuLCBpOworCisgICAgZm9yIChuID0gMDsgbiA8IGxlbmd0aDsgbisrKSB7CisgICAgICAgIGludCBpZHggPSAwOworICAgICAgICBmbG9hdCB2ID0gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyX2xlbmd0aDspIHsKKyAgICAgICAgICAgIHYgKz0gaW5bbiArIGldICogZmlsdGVyX2NvZWZmc1tpZHggKyBmcmFjX3Bvc107CisgICAgICAgICAgICBpZHggKz0gcHJlY2lzaW9uOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgdiArPSBpbltuIC0gaV0gKiBmaWx0ZXJfY29lZmZzW2lkeCAtIGZyYWNfcG9zXTsKKyAgICAgICAgfQorICAgICAgICBvdXRbbl0gPSB2OworICAgIH0KK30KKworCit2b2lkIGZmX2FjZWxwX2hpZ2hfcGFzc19maWx0ZXIoaW50MTZfdCogb3V0LCBpbnQgaHBmX2ZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW4sIGludCBsZW5ndGgpCit7CisgICAgaW50IGk7CisgICAgaW50IHRtcDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICB0bXAgID0gKGhwZl9mWzBdKiAxNTgzNkxMKSA+PiAxMzsKKyAgICAgICAgdG1wICs9IChocGZfZlsxXSogLTc2NjdMTCkgPj4gMTM7CisgICAgICAgIHRtcCArPSA3Njk5ICogKGluW2ldIC0gMippbltpLTFdICsgaW5baS0yXSk7CisKKyAgICAgICAgLyogV2l0aCAiKzB4ODAwIiByb3VuZGluZywgY2xpcHBpbmcgaXMgbmVlZGVkCisgICAgICAgICAgIGZvciBBTEdUSE0gYW5kIFNQRUVDSCB0ZXN0cy4gKi8KKyAgICAgICAgb3V0W2ldID0gYXZfY2xpcF9pbnQxNigodG1wICsgMHg4MDApID4+IDEyKTsKKworICAgICAgICBocGZfZlsxXSA9IGhwZl9mWzBdOworICAgICAgICBocGZfZlswXSA9IHRtcDsKKyAgICB9Cit9CisKK3ZvaWQgZmZfYWNlbHBfYXBwbHlfb3JkZXJfMl90cmFuc2Zlcl9mdW5jdGlvbihmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgemVyb19jb2VmZnNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcG9sZV9jb2VmZnNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ2FpbiwgZmxvYXQgbWVtWzJdLCBpbnQgbikKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCB0bXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHRtcCA9IGdhaW4gKiBpbltpXSAtIHBvbGVfY29lZmZzWzBdICogbWVtWzBdIC0gcG9sZV9jb2VmZnNbMV0gKiBtZW1bMV07CisgICAgICAgIG91dFtpXSA9ICAgICAgIHRtcCArIHplcm9fY29lZmZzWzBdICogbWVtWzBdICsgemVyb19jb2VmZnNbMV0gKiBtZW1bMV07CisKKyAgICAgICAgbWVtWzFdID0gbWVtWzBdOworICAgICAgICBtZW1bMF0gPSB0bXA7CisgICAgfQorfQorCit2b2lkIGZmX3RpbHRfY29tcGVuc2F0aW9uKGZsb2F0ICptZW0sIGZsb2F0IHRpbHQsIGZsb2F0ICpzYW1wbGVzLCBpbnQgc2l6ZSkKK3sKKyAgICBmbG9hdCBuZXdfdGlsdF9tZW0gPSBzYW1wbGVzW3NpemUgLSAxXTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IHNpemUgLSAxOyBpID4gMDsgaS0tKQorICAgICAgICBzYW1wbGVzW2ldIC09IHRpbHQgKiBzYW1wbGVzW2kgLSAxXTsKKworICAgIHNhbXBsZXNbMF0gLT0gdGlsdCAqICptZW07CisgICAgKm1lbSA9IG5ld190aWx0X21lbTsKK30KKwordm9pZCBmZl9hY2VscF9maWx0ZXJfaW5pdChBQ0VMUEZDb250ZXh0ICpjKQoreworICAgIGMtPmFjZWxwX2ludGVycG9sYXRlZiAgICAgICAgICAgICAgICAgICAgICA9IGZmX2FjZWxwX2ludGVycG9sYXRlZjsKKyAgICBjLT5hY2VscF9hcHBseV9vcmRlcl8yX3RyYW5zZmVyX2Z1bmN0aW9uICAgPSBmZl9hY2VscF9hcHBseV9vcmRlcl8yX3RyYW5zZmVyX2Z1bmN0aW9uOworCisgICAgaWYoSEFWRV9NSVBTRlBVKQorICAgICAgICBmZl9hY2VscF9maWx0ZXJfaW5pdF9taXBzKGMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWNlbHBfZmlsdGVycy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWNlbHBfZmlsdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzA2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hY2VscF9maWx0ZXJzLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiB2YXJpb3VzIGZpbHRlcnMgZm9yIEFDRUxQLWJhc2VkIGNvZGVjcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBWbGFkaW1pciBWb3Jvc2hpbG92CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BQ0VMUF9GSUxURVJTX0gKKyNkZWZpbmUgQVZDT0RFQ19BQ0VMUF9GSUxURVJTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHN0cnVjdCBBQ0VMUEZDb250ZXh0IHsKKyAgICAvKioKKyAgICAqIEZsb2F0aW5nIHBvaW50IHZlcnNpb24gb2YgZmZfYWNlbHBfaW50ZXJwb2xhdGUoKQorICAgICovCisgICAgdm9pZCAoKmFjZWxwX2ludGVycG9sYXRlZikoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpmaWx0ZXJfY29lZmZzLCBpbnQgcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFjX3BvcywgaW50IGZpbHRlcl9sZW5ndGgsIGludCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogQXBwbHkgYW4gb3JkZXIgMiByYXRpb25hbCB0cmFuc2ZlciBmdW5jdGlvbiBpbi1wbGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgb3V0cHV0IGJ1ZmZlciBmb3IgZmlsdGVyZWQgc3BlZWNoIHNhbXBsZXMKKyAgICAgKiBAcGFyYW0gaW4gaW5wdXQgYnVmZmVyIGNvbnRhaW5pbmcgc3BlZWNoIGRhdGEgKG1heSBiZSB0aGUgc2FtZSBhcyBvdXQpCisgICAgICogQHBhcmFtIHplcm9fY29lZmZzIHpeLTEgYW5kIHpeLTIgY29lZmZpY2llbnRzIG9mIHRoZSBudW1lcmF0b3IKKyAgICAgKiBAcGFyYW0gcG9sZV9jb2VmZnMgel4tMSBhbmQgel4tMiBjb2VmZmljaWVudHMgb2YgdGhlIGRlbm9taW5hdG9yCisgICAgICogQHBhcmFtIGdhaW4gc2NhbGUgZmFjdG9yIGZvciBmaW5hbCBvdXRwdXQKKyAgICAgKiBAcGFyYW0gbWVtIGludGVybWVkaWF0ZSB2YWx1ZXMgdXNlZCBieSBmaWx0ZXIgKHNob3VsZCBiZSAwIGluaXRpYWxseSkKKyAgICAgKiBAcGFyYW0gbiBudW1iZXIgb2Ygc2FtcGxlcyAoc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgZWlnaHQpCisgICAgICovCisgICAgdm9pZCAoKmFjZWxwX2FwcGx5X29yZGVyXzJfdHJhbnNmZXJfZnVuY3Rpb24pKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgemVyb19jb2VmZnNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHBvbGVfY29lZmZzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBnYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtZW1bMl0sIGludCBuKTsKKworfUFDRUxQRkNvbnRleHQ7CisKKy8qKgorICogSW5pdGlhbGl6ZSBBQ0VMUEZDb250ZXh0LgorICovCit2b2lkIGZmX2FjZWxwX2ZpbHRlcl9pbml0KEFDRUxQRkNvbnRleHQgKmMpOwordm9pZCBmZl9hY2VscF9maWx0ZXJfaW5pdF9taXBzKEFDRUxQRkNvbnRleHQgKmMpOworCisvKioKKyAqIGxvdy1wYXNzIEZpbml0ZSBJbXB1bHNlIFJlc3BvbnNlIGZpbHRlciBjb2VmZmljaWVudHMuCisgKgorICogSGFtbWluZyB3aW5kb3dlZCBzaW5jIGZpbHRlciB3aXRoIGN1dG9mZiBmcmVxIDMvNDAgb2YgdGhlIHNhbXBsaW5nIGZyZXEsCisgKiB0aGUgY29lZmZpY2llbnRzIGFyZSBzY2FsZWQgYnkgMl4xNS4KKyAqIFRoaXMgYXJyYXkgb25seSBjb250YWlucyB0aGUgcmlnaHQgaGFsZiBvZiB0aGUgZmlsdGVyLgorICogVGhpcyBmaWx0ZXIgaXMgbGlrZWx5IGlkZW50aWNhbCB0byB0aGUgb25lIHVzZWQgaW4gRy43MjksIHRob3VnaCB0aGlzCisgKiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBvcmlnaW5hbCBjb21tZW50cyB3aXRoIGNlcnRhaW50eS4KKyAqLworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfYWNlbHBfaW50ZXJwX2ZpbHRlcls2MV07CisKKy8qKgorICogR2VuZXJpYyBGSVIgaW50ZXJwb2xhdGlvbiByb3V0aW5lLgorICogQHBhcmFtW291dF0gb3V0IGJ1ZmZlciBmb3IgaW50ZXJwb2xhdGVkIGRhdGEKKyAqIEBwYXJhbSBpbiBpbnB1dCBkYXRhCisgKiBAcGFyYW0gZmlsdGVyX2NvZWZmcyBpbnRlcnBvbGF0aW9uIGZpbHRlciBjb2VmZmljaWVudHMgKDAuMTUpCisgKiBAcGFyYW0gcHJlY2lzaW9uIHN1YiBzYW1wbGUgZmFjdG9yLCB0aGF0IGlzIHRoZSBwcmVjaXNpb24gb2YgdGhlIHBvc2l0aW9uCisgKiBAcGFyYW0gZnJhY19wb3MgZnJhY3Rpb25hbCBwYXJ0IG9mIHBvc2l0aW9uIFswLi5wcmVjaXNpb24tMV0KKyAqIEBwYXJhbSBmaWx0ZXJfbGVuZ3RoIGZpbHRlciBsZW5ndGgKKyAqIEBwYXJhbSBsZW5ndGggbGVuZ3RoIG9mIG91dHB1dAorICoKKyAqIGZpbHRlcl9jb2VmZnMgY29udGFpbnMgY29lZmZpY2llbnRzIG9mIHRoZSByaWdodCBoYWxmIG9mIHRoZSBzeW1tZXRyaWMKKyAqIGludGVycG9sYXRpb24gZmlsdGVyLiBmaWx0ZXJfY29lZmZzWzBdIHNob3VsZCB0aGUgY2VudHJhbCAodW5wYWlyZWQpIGNvZWZmaWNpZW50LgorICogU2VlIGZmX2FjZWxwX2ludGVycF9maWx0ZXIgZm9yIGFuIGV4YW1wbGUuCisgKgorICovCit2b2lkIGZmX2FjZWxwX2ludGVycG9sYXRlKGludDE2X3QqIG91dCwgY29uc3QgaW50MTZfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGZpbHRlcl9jb2VmZnMsIGludCBwcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFjX3BvcywgaW50IGZpbHRlcl9sZW5ndGgsIGludCBsZW5ndGgpOworCisvKioKKyAqIEZsb2F0aW5nIHBvaW50IHZlcnNpb24gb2YgZmZfYWNlbHBfaW50ZXJwb2xhdGUoKQorICovCit2b2lkIGZmX2FjZWxwX2ludGVycG9sYXRlZihmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZmlsdGVyX2NvZWZmcywgaW50IHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFjX3BvcywgaW50IGZpbHRlcl9sZW5ndGgsIGludCBsZW5ndGgpOworCisKKy8qKgorICogaGlnaC1wYXNzIGZpbHRlcmluZyBhbmQgdXBzY2FsaW5nICg0LjIuNSBvZiBHLjcyOSkuCisgKiBAcGFyYW1bb3V0XSAgICAgb3V0ICAgb3V0cHV0IGJ1ZmZlciBmb3IgZmlsdGVyZWQgc3BlZWNoIGRhdGEKKyAqIEBwYXJhbVtpbixvdXRdICBocGZfZiBwYXN0IGZpbHRlcmVkIGRhdGEgZnJvbSBwcmV2aW91cyAoMiBpdGVtcyBsb25nKQorICogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcyAoLTB4MjAwMDAwMDAgPD0gKDE0LjEzKSA8IDB4MjAwMDAwMDApCisgKiBAcGFyYW0gaW4gc3BlZWNoIGRhdGEgdG8gcHJvY2VzcworICogQHBhcmFtIGxlbmd0aCBpbnB1dCBkYXRhIHNpemUKKyAqCisgKiBvdXRbaV0gPSAwLjkzOTgwNTgxICogaW5baV0gLSAxLjg3OTU4MzQgKiBpbltpLTFdICsgMC45Mzk4MDU4MSAqIGluW2ktMl0gKworICogICAgICAgICAgMS45MzMwNzM1ICogb3V0W2ktMV0gLSAwLjkzNTg5MTk5ICogb3V0W2ktMl0KKyAqCisgKiBUaGUgZmlsdGVyIGhhcyBhIGN1dC1vZmYgZnJlcXVlbmN5IG9mIDEvODAgb2YgdGhlIHNhbXBsaW5nIGZyZXEKKyAqCisgKiBAbm90ZSBUd28gaXRlbXMgYmVmb3JlIHRoZSB0b3Agb2YgdGhlIGluIGJ1ZmZlciBtdXN0IGNvbnRhaW4gdHdvIGl0ZW1zIGZyb20gdGhlCisgKiAgICAgICB0YWlsIG9mIHRoZSBwcmV2aW91cyBzdWJmcmFtZS4KKyAqCisgKiBAcmVtYXJrIEl0IGlzIHNhZmUgdG8gcGFzcyB0aGUgc2FtZSBhcnJheSBpbiBpbiBhbmQgb3V0IHBhcmFtZXRlcnMuCisgKgorICogQHJlbWFyayBBTVIgdXNlcyBtb3N0bHkgdGhlIHNhbWUgZmlsdGVyIChjdXQtb2ZmIGZyZXF1ZW5jeSA2MEh6LCBzYW1lIGZvcm11bGEsCisgKiAgICAgICAgIGJ1dCBjb25zdGFudHMgZGlmZmVycyBpbiA1dGggc2lnbiBhZnRlciBjb21tYSkuIEZvcnR1bmF0ZWx5IGluCisgKiAgICAgICAgIGZpeGVkLXBvaW50IGFsbCBjb2VmZmljaWVudHMgYXJlIHRoZSBzYW1lIGFzIGluIEcuNzI5LiBUaHVzIHRoaXMKKyAqICAgICAgICAgcm91dGluZSBjYW4gYmUgdXNlZCBmb3IgdGhlIGZpeGVkLXBvaW50IEFNUiBkZWNvZGVyLCB0b28uCisgKi8KK3ZvaWQgZmZfYWNlbHBfaGlnaF9wYXNzX2ZpbHRlcihpbnQxNl90KiBvdXQsIGludCBocGZfZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBpbiwgaW50IGxlbmd0aCk7CisKKy8qKgorICogQXBwbHkgYW4gb3JkZXIgMiByYXRpb25hbCB0cmFuc2ZlciBmdW5jdGlvbiBpbi1wbGFjZS4KKyAqCisgKiBAcGFyYW0gb3V0IG91dHB1dCBidWZmZXIgZm9yIGZpbHRlcmVkIHNwZWVjaCBzYW1wbGVzCisgKiBAcGFyYW0gaW4gaW5wdXQgYnVmZmVyIGNvbnRhaW5pbmcgc3BlZWNoIGRhdGEgKG1heSBiZSB0aGUgc2FtZSBhcyBvdXQpCisgKiBAcGFyYW0gemVyb19jb2VmZnMgel4tMSBhbmQgel4tMiBjb2VmZmljaWVudHMgb2YgdGhlIG51bWVyYXRvcgorICogQHBhcmFtIHBvbGVfY29lZmZzIHpeLTEgYW5kIHpeLTIgY29lZmZpY2llbnRzIG9mIHRoZSBkZW5vbWluYXRvcgorICogQHBhcmFtIGdhaW4gc2NhbGUgZmFjdG9yIGZvciBmaW5hbCBvdXRwdXQKKyAqIEBwYXJhbSBtZW0gaW50ZXJtZWRpYXRlIHZhbHVlcyB1c2VkIGJ5IGZpbHRlciAoc2hvdWxkIGJlIDAgaW5pdGlhbGx5KQorICogQHBhcmFtIG4gbnVtYmVyIG9mIHNhbXBsZXMKKyAqLwordm9pZCBmZl9hY2VscF9hcHBseV9vcmRlcl8yX3RyYW5zZmVyX2Z1bmN0aW9uKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB6ZXJvX2NvZWZmc1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBwb2xlX2NvZWZmc1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBnYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1lbVsyXSwgaW50IG4pOworCisvKioKKyAqIEFwcGx5IHRpbHQgY29tcGVuc2F0aW9uIGZpbHRlciwgMSAtIHRpbHQgKiB6LTEuCisgKgorICogQHBhcmFtIG1lbSBwb2ludGVyIHRvIHRoZSBmaWx0ZXIncyBzdGF0ZSAob25lIHNpbmdsZSBmbG9hdCkKKyAqIEBwYXJhbSB0aWx0IHRpbHQgZmFjdG9yCisgKiBAcGFyYW0gc2FtcGxlcyBhcnJheSB3aGVyZSB0aGUgZmlsdGVyIGlzIGFwcGxpZWQKKyAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBzYW1wbGVzIGFycmF5CisgKi8KK3ZvaWQgZmZfdGlsdF9jb21wZW5zYXRpb24oZmxvYXQgKm1lbSwgZmxvYXQgdGlsdCwgZmxvYXQgKnNhbXBsZXMsIGludCBzaXplKTsKKworCisjZW5kaWYgLyogQVZDT0RFQ19BQ0VMUF9GSUxURVJTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FjZWxwX3BpdGNoX2RlbGF5LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hY2VscF9waXRjaF9kZWxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlY2VjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hY2VscF9waXRjaF9kZWxheS5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogZ2FpbiBjb2RlLCBnYWluIHBpdGNoIGFuZCBwaXRjaCBkZWxheSBkZWNvZGluZworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBWbGFkaW1pciBWb3Jvc2hpbG92CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9saWJtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImFjZWxwX3BpdGNoX2RlbGF5LmgiCisjaW5jbHVkZSAiY2VscF9tYXRoLmgiCisjaW5jbHVkZSAiYXVkaW9kc3AuaCIKKworaW50IGZmX2FjZWxwX2RlY29kZV84Yml0X3RvXzFzdF9kZWxheTMoaW50IGFjX2luZGV4KQoreworICAgIGFjX2luZGV4ICs9IDU4OworICAgIGlmKGFjX2luZGV4ID4gMjU0KQorICAgICAgICBhY19pbmRleCA9IDMgKiBhY19pbmRleCAtIDUxMDsKKyAgICByZXR1cm4gYWNfaW5kZXg7Cit9CisKK2ludCBmZl9hY2VscF9kZWNvZGVfNGJpdF90b18ybmRfZGVsYXkzKAorICAgICAgICBpbnQgYWNfaW5kZXgsCisgICAgICAgIGludCBwaXRjaF9kZWxheV9taW4pCit7CisgICAgaWYoYWNfaW5kZXggPCA0KQorICAgICAgICByZXR1cm4gMyAqIChhY19pbmRleCArIHBpdGNoX2RlbGF5X21pbik7CisgICAgZWxzZSBpZihhY19pbmRleCA8IDEyKQorICAgICAgICByZXR1cm4gMyAqIHBpdGNoX2RlbGF5X21pbiArIGFjX2luZGV4ICsgNjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAzICogKGFjX2luZGV4ICsgcGl0Y2hfZGVsYXlfbWluKSAtIDE4OworfQorCitpbnQgZmZfYWNlbHBfZGVjb2RlXzVfNl9iaXRfdG9fMm5kX2RlbGF5MygKKyAgICAgICAgaW50IGFjX2luZGV4LAorICAgICAgICBpbnQgcGl0Y2hfZGVsYXlfbWluKQoreworICAgICAgICByZXR1cm4gMyAqIHBpdGNoX2RlbGF5X21pbiArIGFjX2luZGV4IC0gMjsKK30KKworaW50IGZmX2FjZWxwX2RlY29kZV85Yml0X3RvXzFzdF9kZWxheTYoaW50IGFjX2luZGV4KQoreworICAgIGlmKGFjX2luZGV4IDwgNDYzKQorICAgICAgICByZXR1cm4gYWNfaW5kZXggKyAxMDU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gNiAqIChhY19pbmRleCAtIDM2OCk7Cit9CitpbnQgZmZfYWNlbHBfZGVjb2RlXzZiaXRfdG9fMm5kX2RlbGF5NigKKyAgICAgICAgaW50IGFjX2luZGV4LAorICAgICAgICBpbnQgcGl0Y2hfZGVsYXlfbWluKQoreworICAgIHJldHVybiA2ICogcGl0Y2hfZGVsYXlfbWluICsgYWNfaW5kZXggLSAzOworfQorCit2b2lkIGZmX2FjZWxwX3VwZGF0ZV9wYXN0X2dhaW4oCisgICAgaW50MTZfdCogcXVhbnRfZW5lcmd5LAorICAgIGludCBnYWluX2NvcnJfZmFjdG9yLAorICAgIGludCBsb2cyX21hX3ByZWRfb3JkZXIsCisgICAgaW50IGVyYXN1cmUpCit7CisgICAgaW50IGk7CisgICAgaW50IGF2Z19nYWluPXF1YW50X2VuZXJneVsoMSA8PCBsb2cyX21hX3ByZWRfb3JkZXIpIC0gMV07IC8vICg1LjEwKQorCisgICAgZm9yKGk9KDEgPDwgbG9nMl9tYV9wcmVkX29yZGVyKSAtIDE7IGk+MDsgaS0tKQorICAgIHsKKyAgICAgICAgYXZnX2dhaW4gICAgICAgKz0gcXVhbnRfZW5lcmd5W2ktMV07CisgICAgICAgIHF1YW50X2VuZXJneVtpXSA9IHF1YW50X2VuZXJneVtpLTFdOworICAgIH0KKworICAgIGlmKGVyYXN1cmUpCisgICAgICAgIHF1YW50X2VuZXJneVswXSA9IEZGTUFYKGF2Z19nYWluID4+IGxvZzJfbWFfcHJlZF9vcmRlciwgLTEwMjQwKSAtIDQwOTY7IC8vIC0xMCBhbmQgLTQgaW4gKDUuMTApCisgICAgZWxzZQorICAgICAgICBxdWFudF9lbmVyZ3lbMF0gPSAoNjE2NSAqICgoZmZfbG9nMl9xMTUoZ2Fpbl9jb3JyX2ZhY3RvcikgPj4gMikgLSAoMTMgPDwgMTMpKSkgPj4gMTM7Cit9CisKK2ludDE2X3QgZmZfYWNlbHBfZGVjb2RlX2dhaW5fY29kZSgKKyAgICBBdWRpb0RTUENvbnRleHQgKmFkc3AsCisgICAgaW50IGdhaW5fY29ycl9mYWN0b3IsCisgICAgY29uc3QgaW50MTZfdCogZmNfdiwKKyAgICBpbnQgbXJfZW5lcmd5LAorICAgIGNvbnN0IGludDE2X3QqIHF1YW50X2VuZXJneSwKKyAgICBjb25zdCBpbnQxNl90KiBtYV9wcmVkaWN0aW9uX2NvZWZmLAorICAgIGludCBzdWJmcmFtZV9zaXplLAorICAgIGludCBtYV9wcmVkX29yZGVyKQoreworICAgIGludCBpOworCisgICAgbXJfZW5lcmd5IDw8PSAxMDsKKworICAgIGZvcihpPTA7IGk8bWFfcHJlZF9vcmRlcjsgaSsrKQorICAgICAgICBtcl9lbmVyZ3kgKz0gcXVhbnRfZW5lcmd5W2ldICogbWFfcHJlZGljdGlvbl9jb2VmZltpXTsKKworI2lmZGVmIEc3MjlfQklURVhBQ1QKKyAgICBtcl9lbmVyZ3kgKz0gKCgoLTYxNjVMTCAqIGZmX2xvZzIoZHNwLT5zY2FsYXJwcm9kdWN0X2ludDE2KGZjX3YsIGZjX3YsIHN1YmZyYW1lX3NpemUsIDApKSkgPj4gMykgJiB+MHgzZmYpOworCisgICAgbXJfZW5lcmd5ID0gKDU0MzkgKiAobXJfZW5lcmd5ID4+IDE1KSkgPj4gODsgICAgICAgICAgIC8vICgwLjE1KSA9ICgwLjE1KSAqICg3LjIzKQorCisgICAgcmV0dXJuIGJpZGlyX3NhbCgKKyAgICAgICAgICAgICAgICgoZmZfZXhwMihtcl9lbmVyZ3kgJiAweDdmZmYpICsgMTYpID4+IDUpICogKGdhaW5fY29ycl9mYWN0b3IgPj4gMSksCisgICAgICAgICAgICAgICAobXJfZW5lcmd5ID4+IDE1KSAtIDI1CisgICAgICAgICAgICk7CisjZWxzZQorICAgIG1yX2VuZXJneSA9IGdhaW5fY29ycl9mYWN0b3IgKiBleHAoTV9MTjEwIC8gKDIwIDw8IDIzKSAqIG1yX2VuZXJneSkgLworICAgICAgICAgICAgICAgIHNxcnQoYWRzcC0+c2NhbGFycHJvZHVjdF9pbnQxNihmY192LCBmY192LCBzdWJmcmFtZV9zaXplKSk7CisgICAgcmV0dXJuIG1yX2VuZXJneSA+PiAxMjsKKyNlbmRpZgorfQorCitmbG9hdCBmZl9hbXJfc2V0X2ZpeGVkX2dhaW4oZmxvYXQgZml4ZWRfZ2Fpbl9mYWN0b3IsIGZsb2F0IGZpeGVkX21lYW5fZW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpwcmVkaWN0aW9uX2Vycm9yLCBmbG9hdCBlbmVyZ3lfbWVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqcHJlZF90YWJsZSkKK3sKKyAgICAvLyBFcXVhdGlvbnMgNjYtNjk6CisgICAgLy8gXmdfYyA9IF5nYW1tYV9nYyAqIDEwMC4wNSAocHJlZGljdGVkIGRCICsgbWVhbiBkQiAtIGRCIG9mIGZpeGVkIHZlY3RvcikKKyAgICAvLyBOb3RlIDEwXigwLjA1ICogLTEwbG9nKGF2ZXJhZ2UgeDIpKSA9IDEvc3FydCgoYXZlcmFnZSB4MikpLgorICAgIGZsb2F0IHZhbCA9IGZpeGVkX2dhaW5fZmFjdG9yICoKKyAgICAgICAgZXhwMmYoTV9MT0cyXzEwICogMC4wNSAqCisgICAgICAgICAgICAgIChhdnByaXZfc2NhbGFycHJvZHVjdF9mbG9hdF9jKHByZWRfdGFibGUsIHByZWRpY3Rpb25fZXJyb3IsIDQpICsKKyAgICAgICAgICAgICAgIGVuZXJneV9tZWFuKSkgLworICAgICAgICBzcXJ0ZihmaXhlZF9tZWFuX2VuZXJneSk7CisKKyAgICAvLyB1cGRhdGUgcXVhbnRpZmllZCBwcmVkaWN0aW9uIGVycm9yIGVuZXJneSBoaXN0b3J5CisgICAgbWVtbW92ZSgmcHJlZGljdGlvbl9lcnJvclswXSwgJnByZWRpY3Rpb25fZXJyb3JbMV0sCisgICAgICAgICAgICAzICogc2l6ZW9mKHByZWRpY3Rpb25fZXJyb3JbMF0pKTsKKyAgICBwcmVkaWN0aW9uX2Vycm9yWzNdID0gMjAuMCAqIGxvZzEwZihmaXhlZF9nYWluX2ZhY3Rvcik7CisKKyAgICByZXR1cm4gdmFsOworfQorCit2b2lkIGZmX2RlY29kZV9waXRjaF9sYWcoaW50ICpsYWdfaW50LCBpbnQgKmxhZ19mcmFjLCBpbnQgcGl0Y2hfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHByZXZfbGFnX2ludCwgY29uc3QgaW50IHN1YmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aGlyZF9hc19maXJzdCwgaW50IHJlc29sdXRpb24pCit7CisgICAgLyogTm90ZSBuICogMTA5MjMgPj4gMTUgaXMgZmxvb3IoeC8zKSBmb3IgMCA8PSBuIDw9IDMyNzY3ICovCisgICAgaWYgKHN1YmZyYW1lID09IDAgfHwgKHN1YmZyYW1lID09IDIgJiYgdGhpcmRfYXNfZmlyc3QpKSB7CisKKyAgICAgICAgaWYgKHBpdGNoX2luZGV4IDwgMTk3KQorICAgICAgICAgICAgcGl0Y2hfaW5kZXggKz0gNTk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBpdGNoX2luZGV4ID0gMyAqIHBpdGNoX2luZGV4IC0gMzM1OworCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJlc29sdXRpb24gPT0gNCkgeworICAgICAgICAgICAgaW50IHNlYXJjaF9yYW5nZV9taW4gPSBhdl9jbGlwKHByZXZfbGFnX2ludCAtIDUsIFBJVENIX0RFTEFZX01JTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVRDSF9ERUxBWV9NQVggLSA5KTsKKworICAgICAgICAgICAgLy8gZGVjb2Rpbmcgd2l0aCA0LWJpdCByZXNvbHV0aW9uCisgICAgICAgICAgICBpZiAocGl0Y2hfaW5kZXggPCA0KSB7CisgICAgICAgICAgICAgICAgLy8gaW50ZWdlciBvbmx5IHByZWNpc2lvbiBmb3IgW3NlYXJjaF9yYW5nZV9taW4sIHNlYXJjaF9yYW5nZV9taW4rM10KKyAgICAgICAgICAgICAgICBwaXRjaF9pbmRleCA9IDMgKiAocGl0Y2hfaW5kZXggKyBzZWFyY2hfcmFuZ2VfbWluKSArIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBpdGNoX2luZGV4IDwgMTIpIHsKKyAgICAgICAgICAgICAgICAvLyAxLzMgZnJhY3Rpb25hbCBwcmVjaXNpb24gZm9yIFtzZWFyY2hfcmFuZ2VfbWluKzMgMS8zLCBzZWFyY2hfcmFuZ2VfbWluKzUgMi8zXQorICAgICAgICAgICAgICAgIHBpdGNoX2luZGV4ICs9IDMgKiBzZWFyY2hfcmFuZ2VfbWluICsgNzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaW50ZWdlciBvbmx5IHByZWNpc2lvbiBmb3IgW3NlYXJjaF9yYW5nZV9taW4rNiwgc2VhcmNoX3JhbmdlX21pbis5XQorICAgICAgICAgICAgICAgIHBpdGNoX2luZGV4ID0gMyAqIChwaXRjaF9pbmRleCArIHNlYXJjaF9yYW5nZV9taW4gLSA2KSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBkZWNvZGluZyB3aXRoIDUgb3IgNiBiaXQgcmVzb2x1dGlvbiwgMS8zIGZyYWN0aW9uYWwgcHJlY2lzaW9uCisgICAgICAgICAgICBwaXRjaF9pbmRleC0tOworCisgICAgICAgICAgICBpZiAocmVzb2x1dGlvbiA9PSA1KSB7CisgICAgICAgICAgICAgICAgcGl0Y2hfaW5kZXggKz0gMyAqIGF2X2NsaXAocHJldl9sYWdfaW50IC0gMTAsIFBJVENIX0RFTEFZX01JTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVRDSF9ERUxBWV9NQVggLSAxOSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBwaXRjaF9pbmRleCArPSAzICogYXZfY2xpcChwcmV2X2xhZ19pbnQgLSA1LCBQSVRDSF9ERUxBWV9NSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElUQ0hfREVMQVlfTUFYIC0gOSk7CisgICAgICAgIH0KKyAgICB9CisgICAgKmxhZ19pbnQgID0gcGl0Y2hfaW5kZXggKiAxMDkyMyA+PiAxNTsKKyAgICAqbGFnX2ZyYWMgPSBwaXRjaF9pbmRleCAtIDMgKiAqbGFnX2ludCAtIDE7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hY2VscF9waXRjaF9kZWxheS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWNlbHBfcGl0Y2hfZGVsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWFkZTJmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWNlbHBfcGl0Y2hfZGVsYXkuaApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIGdhaW4gY29kZSwgZ2FpbiBwaXRjaCBhbmQgcGl0Y2ggZGVsYXkgZGVjb2RpbmcKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQUNFTFBfUElUQ0hfREVMQVlfSAorI2RlZmluZSBBVkNPREVDX0FDRUxQX1BJVENIX0RFTEFZX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYXVkaW9kc3AuaCIKKworI2RlZmluZSBQSVRDSF9ERUxBWV9NSU4gICAgICAgICAgICAgMjAKKyNkZWZpbmUgUElUQ0hfREVMQVlfTUFYICAgICAgICAgICAgIDE0MworCisvKioKKyAqIEBicmllZiBEZWNvZGUgcGl0Y2ggZGVsYXkgb2YgdGhlIGZpcnN0IHN1YmZyYW1lIGVuY29kZWQgYnkgOCBiaXRzIHdpdGggMS8zCisgKiAgICAgICAgcmVzb2x1dGlvbi4KKyAqIEBwYXJhbSBhY19pbmRleCBhZGFwdGl2ZSBjb2RlYm9vayBpbmRleCAoOCBiaXRzKQorICoKKyAqIEByZXR1cm4gcGl0Y2ggZGVsYXkgaW4gMS8zIHVuaXRzCisgKgorICogUGl0Y2ggZGVsYXkgaXMgY29kZWQ6CisgKiAgICB3aXRoIDEvMyByZXNvbHV0aW9uLCAxOSAgPCBwaXRjaF9kZWxheSA8ICA4NQorICogICAgaW50ZWdlcnMgb25seSwgICAgICAgODUgPD0gcGl0Y2hfZGVsYXkgPD0gMTQzCisgKi8KK2ludCBmZl9hY2VscF9kZWNvZGVfOGJpdF90b18xc3RfZGVsYXkzKGludCBhY19pbmRleCk7CisKKy8qKgorICogQGJyaWVmIERlY29kZSBwaXRjaCBkZWxheSBvZiB0aGUgc2Vjb25kIHN1YmZyYW1lIGVuY29kZWQgYnkgNSBvciA2IGJpdHMKKyAqICAgICAgICB3aXRoIDEvMyBwcmVjaXNpb24uCisgKiBAcGFyYW0gYWNfaW5kZXggYWRhcHRpdmUgY29kZWJvb2sgaW5kZXggKDUgb3IgNiBiaXRzKQorICogQHBhcmFtIHBpdGNoX2RlbGF5X21pbiBsb3dlciBib3VuZCAoaW50ZWdlcikgb2YgcGl0Y2ggZGVsYXkgaW50ZXJ2YWwKKyAqICAgICAgICAgICAgICAgICAgICAgIGZvciBzZWNvbmQgc3ViZnJhbWUKKyAqCisgKiBAcmV0dXJuIHBpdGNoIGRlbGF5IGluIDEvMyB1bml0cworICoKKyAqIFBpdGNoIGRlbGF5IGlzIGNvZGVkOgorICogICAgd2l0aCAxLzMgcmVzb2x1dGlvbiwgLTYgPCBwaXRjaF9kZWxheSAtIGludChwcmV2X3BpdGNoX2RlbGF5KSA8IDUKKyAqCisgKiBAcmVtYXJrIFRoZSByb3V0aW5lIGlzIHVzZWQgaW4gRy43MjkgQEA4aywgQU1SIEBAMTAuMmssIEFNUiBAQDcuOTVrLAorICogICAgICAgICBBTVIgQEA3LjRrIGZvciB0aGUgc2Vjb25kIHN1YmZyYW1lLgorICovCitpbnQgZmZfYWNlbHBfZGVjb2RlXzVfNl9iaXRfdG9fMm5kX2RlbGF5MygKKyAgICAgICAgaW50IGFjX2luZGV4LAorICAgICAgICBpbnQgcGl0Y2hfZGVsYXlfbWluKTsKKworLyoqCisgKiBAYnJpZWYgRGVjb2RlIHBpdGNoIGRlbGF5IHdpdGggMS8zIHByZWNpc2lvbi4KKyAqIEBwYXJhbSBhY19pbmRleCBhZGFwdGl2ZSBjb2RlYm9vayBpbmRleCAoNCBiaXRzKQorICogQHBhcmFtIHBpdGNoX2RlbGF5X21pbiBsb3dlciBib3VuZCAoaW50ZWdlcikgb2YgcGl0Y2ggZGVsYXkgaW50ZXJ2YWwgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgc3ViZnJhbWUKKyAqCisgKiBAcmV0dXJuIHBpdGNoIGRlbGF5IGluIDEvMyB1bml0cworICoKKyAqIFBpdGNoIGRlbGF5IGlzIGNvZGVkOgorICogICAgaW50ZWdlcnMgb25seSwgICAgICAgICAgLTYgIDwgcGl0Y2hfZGVsYXkgLSBpbnQocHJldl9waXRjaF9kZWxheSkgPD0gLTIKKyAqICAgIHdpdGggMS8zIHJlc29sdXRpb24sICAgIC0yICA8IHBpdGNoX2RlbGF5IC0gaW50KHByZXZfcGl0Y2hfZGVsYXkpIDwgIDEKKyAqICAgIGludGVnZXJzIG9ubHksICAgICAgICAgICAxIDw9IHBpdGNoX2RlbGF5IC0gaW50KHByZXZfcGl0Y2hfZGVsYXkpIDwgIDUKKyAqCisgKiBAcmVtYXJrIFRoZSByb3V0aW5lIGlzIHVzZWQgaW4gRy43MjkgQEA2LjRrLCBBTVIgQEA2LjdrLCBBTVIgQEA1LjlrLAorICogICAgICAgICBBTVIgQEA1LjE1aywgQU1SIEBANC43NWsgZm9yIHRoZSBzZWNvbmQgc3ViZnJhbWUuCisgKi8KK2ludCBmZl9hY2VscF9kZWNvZGVfNGJpdF90b18ybmRfZGVsYXkzKAorICAgICAgICBpbnQgYWNfaW5kZXgsCisgICAgICAgIGludCBwaXRjaF9kZWxheV9taW4pOworCisvKioKKyAqIEBicmllZiBEZWNvZGUgcGl0Y2ggZGVsYXkgb2YgdGhlIGZpcnN0IHN1YmZyYW1lIGVuY29kZWQgYnkgOSBiaXRzCisgKiAgICAgICAgd2l0aCAxLzYgcHJlY2lzaW9uLgorICogQHBhcmFtIGFjX2luZGV4IGFkYXB0aXZlIGNvZGVib29rIGluZGV4ICg5IGJpdHMpCisgKgorICogQHJldHVybiBwaXRjaCBkZWxheSBpbiAxLzYgdW5pdHMKKyAqCisgKiBQaXRjaCBkZWxheSBpcyBjb2RlZDoKKyAqICAgIHdpdGggMS82IHJlc29sdXRpb24sICAxNyAgPCBwaXRjaF9kZWxheSA8ICA5NQorICogICAgaW50ZWdlcnMgb25seSwgICAgICAgIDk1IDw9IHBpdGNoX2RlbGF5IDw9IDE0MworICoKKyAqIEByZW1hcmsgVGhlIHJvdXRpbmUgaXMgdXNlZCBpbiBBTVIgQEAxMi4yayBmb3IgdGhlIGZpcnN0IGFuZCB0aGlyZCBzdWJmcmFtZXMuCisgKi8KK2ludCBmZl9hY2VscF9kZWNvZGVfOWJpdF90b18xc3RfZGVsYXk2KGludCBhY19pbmRleCk7CisKKy8qKgorICogQGJyaWVmIERlY29kZSBwaXRjaCBkZWxheSBvZiB0aGUgc2Vjb25kIHN1YmZyYW1lIGVuY29kZWQgYnkgNiBiaXRzCisgKiAgICAgICAgd2l0aCAxLzYgcHJlY2lzaW9uLgorICogQHBhcmFtIGFjX2luZGV4IGFkYXB0aXZlIGNvZGVib29rIGluZGV4ICg2IGJpdHMpCisgKiBAcGFyYW0gcGl0Y2hfZGVsYXlfbWluIGxvd2VyIGJvdW5kIChpbnRlZ2VyKSBvZiBwaXRjaCBkZWxheSBpbnRlcnZhbCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCBzdWJmcmFtZQorICoKKyAqIEByZXR1cm4gcGl0Y2ggZGVsYXkgaW4gMS82IHVuaXRzCisgKgorICogUGl0Y2ggZGVsYXkgaXMgY29kZWQ6CisgKiAgICB3aXRoIDEvNiByZXNvbHV0aW9uLCAtNiA8IHBpdGNoX2RlbGF5IC0gaW50KHByZXZfcGl0Y2hfZGVsYXkpIDwgNQorICoKKyAqIEByZW1hcmsgVGhlIHJvdXRpbmUgaXMgdXNlZCBpbiBBTVIgQEAxMi4yayBmb3IgdGhlIHNlY29uZCBhbmQgZm91cnRoIHN1YmZyYW1lcy4KKyAqLworaW50IGZmX2FjZWxwX2RlY29kZV82Yml0X3RvXzJuZF9kZWxheTYoCisgICAgICAgIGludCBhY19pbmRleCwKKyAgICAgICAgaW50IHBpdGNoX2RlbGF5X21pbik7CisKKy8qKgorICogQGJyaWVmIFVwZGF0ZSBwYXN0IHF1YW50aXplZCBlbmVyZ2llcworICogQHBhcmFtW2luLG91dF0gIHF1YW50X2VuZXJneSAgcGFzdCBxdWFudGl6ZWQgZW5lcmdpZXMgKDUuMTApCisgKiBAcGFyYW0gZ2Fpbl9jb3JyX2ZhY3RvciBnYWluIGNvcnJlY3Rpb24gZmFjdG9yCisgKiBAcGFyYW0gbG9nMl9tYV9wcmVkX29yZGVyIGxvZzIoKSBvZiBNQSBwcmVkaWN0aW9uIG9yZGVyCisgKiBAcGFyYW0gZXJhc3VyZSBmcmFtZSBlcmFzdXJlIGZsYWcKKyAqCisgKiBJZiBmcmFtZSBlcmFzdXJlIGZsYWcgaXMgbm90IGVxdWFsIHRvIHplcm8sIG1lbW9yeSBpcyB1cGRhdGVkIHdpdGgKKyAqIGF2ZXJhZ2VkIGVuZXJneSwgYXR0ZW51YXRlZCBieSA0ZEI6CisgKiAgICAgbWF4KGF2ZyhxdWFudF9lbmVyZ3lbaV0pLTQsIC0xNCksIGk9MCxtYV9wcmVkX29yZGVyCisgKgorICogSW4gbm9ybWFsIG1vZGUgbWVtb3J5IGlzIHVwZGF0ZWQgd2l0aAorICogICAgIEVyIC0gRXAgPSAyMCAqIGxvZzEwKGdhaW5fY29ycl9mYWN0b3IpCisgKgorICogQHJlbWFyayBUaGUgcm91dGluZSBpcyB1c2VkIGluIEcuNzI5IGFuZCBBTVIgKGFsbCBtb2RlcykuCisgKi8KK3ZvaWQgZmZfYWNlbHBfdXBkYXRlX3Bhc3RfZ2FpbigKKyAgICAgICAgaW50MTZfdCogcXVhbnRfZW5lcmd5LAorICAgICAgICBpbnQgZ2Fpbl9jb3JyX2ZhY3RvciwKKyAgICAgICAgaW50IGxvZzJfbWFfcHJlZF9vcmRlciwKKyAgICAgICAgaW50IGVyYXN1cmUpOworCisvKioKKyAqIEBicmllZiBEZWNvZGUgdGhlIGFkYXB0aXZlIGNvZGVib29rIGdhaW4gYW5kIGFkZAorICogICAgICAgIGNvcnJlY3Rpb24gKDQuMS41IGFuZCAzLjkuMSBvZiBHLjcyOSkuCisgKiBAcGFyYW0gYWRzcCBpbml0aWFsaXplZCBhdWRpbyBEU1AgY29udGV4dAorICogQHBhcmFtIGdhaW5fY29ycl9mYWN0b3IgZ2FpbiBjb3JyZWN0aW9uIGZhY3RvciAoMi4xMykKKyAqIEBwYXJhbSBmY192IGZpeGVkLWNvZGVib29rIHZlY3RvciAoMi4xMykKKyAqIEBwYXJhbSBtcl9lbmVyZ3kgbWVhbiBpbm5vdmF0aW9uIGVuZXJneSBhbmQgZml4ZWQtcG9pbnQgY29ycmVjdGlvbiAoNy4xMykKKyAqIEBwYXJhbVtpbixvdXRdICBxdWFudF9lbmVyZ3kgIHBhc3QgcXVhbnRpemVkIGVuZXJnaWVzICg1LjEwKQorICogQHBhcmFtIHN1YmZyYW1lX3NpemUgbGVuZ3RoIG9mIHN1YmZyYW1lCisgKgorICogQHJldHVybiBxdWFudGl6ZWQgZml4ZWQtY29kZWJvb2sgZ2FpbiAoMTQuMSkKKyAqCisgKiBUaGUgcm91dGluZSBpbXBsZW1lbnRzIGVxdWF0aW9ucyA2OSwgNjYgYW5kIDcxIG9mIHRoZSBHLjcyOSBzcGVjaWZpY2F0aW9uICgzLjkuMSkKKyAqCisgKiAgICBFbSAgIC0gbWVhbiBpbm5vdmF0aW9uIGVuZXJneSAoZEIsIGNvbnN0YW50LCBkZXBlbmRzIG9uIGRlY29kaW5nIGFsZ29yaXRobSkKKyAqICAgIEVwICAgLSBtZWFuLXJlbW92ZWQgcHJlZGljdGVkIGVuZXJneSAoZEIpCisgKiAgICBFciAgIC0gbWVhbi1yZW1vdmVkIGlubm92YXRpb24gZW5lcmd5IChkQikKKyAqICAgIEVpICAgLSBtZWFuIGVuZXJneSBvZiB0aGUgZml4ZWQtY29kZWJvb2sgY29udHJpYnV0aW9uIChkQikKKyAqICAgIE4gICAgLSBzdWJmcmFtZV9zaXplCisgKiAgICBNICAgIC0gTUEgKE1vdmluZyBBdmVyYWdlKSBwcmVkaWN0aW9uIG9yZGVyCisgKiAgICBnYyAgIC0gZml4ZWQtY29kZWJvb2sgZ2FpbgorICogICAgZ2NfcCAtIHByZWRpY3RlZCBmaXhlZC1jb2RlYm9vayBnYWluCisgKgorICogICAgRml4ZWQgY29kZWJvb2sgZ2FpbiBpcyBjb21wdXRlZCB1c2luZyBwcmVkaWN0ZWQgZ2FpbiBnY19wIGFuZAorICogICAgY29ycmVjdGlvbiBmYWN0b3IgZ2Fpbl9jb3JyX2ZhY3RvciBhcyBzaG93biBiZWxvdzoKKyAqCisgKiAgICAgICAgZ2MgPSBnY19wICogZ2Fpbl9jb3JyX2ZhY3RvcgorICoKKyAqICAgIFRoZSBwcmVkaWN0ZWQgZml4ZWQgY29kZWJvb2sgZ2FpbiBnY19wIGlzIGZvdW5kIGJ5IHByZWRpY3RpbmcKKyAqICAgIHRoZSBlbmVyZ3kgb2YgdGhlIGZpeGVkLWNvZGVib29rIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBlbmVyZ3kKKyAqICAgIG9mIHByZXZpb3VzIGZpeGVkLWNvZGVib29rIGNvbnRyaWJ1dGlvbnMuCisgKgorICogICAgICAgIG1lYW4gPSAxL04gKiBzdW0oaSwwLE4peyBmY192W2ldICogZmNfdltpXSB9CisgKgorICogICAgICAgIEVpID0gMTBsb2cobWVhbikKKyAqCisgKiAgICAgICAgRXIgPSAxMGxvZygxL04gKiBnY14yICogbWVhbikgLSBFbSA9IDIwbG9nKGdjKSArIEVpIC0gRW0KKyAqCisgKiAgICBSZXBsYWNpbmcgRXIgd2l0aCBFcCBhbmQgZ2Mgd2l0aCBnY19wIHdlIHdpbGwgcmVjZWl2ZToKKyAqCisgKiAgICAgICAgRXAgPSAxMGxvZygxL04gKiBnY19wXjIgKiBtZWFuKSAtIEVtID0gMjBsb2coZ2NfcCkgKyBFaSAtIEVtCisgKgorICogICAgYW5kIGZyb20gYWJvdmU6CisgKgorICogICAgICAgIGdjX3AgPSAxMF4oKEVwIC0gRWkgKyBFbSkgLyAyMCkKKyAqCisgKiAgICBFcCBpcyBwcmVkaWN0ZWQgdXNpbmcgcGFzdCBlbmVyZ2llcyBhbmQgcHJlZGljdGlvbiBjb2VmZmljaWVudHM6CisgKgorICogICAgICAgIEVwID0gc3VtKGksMCxNKXsgbWFfcHJlZGljdGlvbl9jb2VmZltpXSAqIHF1YW50X2VuZXJneVtpXSB9CisgKgorICogICAgZ2NfcCBpbiBmaXhlZC1wb2ludCBhcml0aG1ldGljIGlzIGNhbGN1bGF0ZWQgYXMgZm9sbG93aW5nOgorICoKKyAqICAgICAgICBtZWFuID0gMS9OICogc3VtKGksMCxOKXsgKGZjX3ZbaV0gLyAyXjEzKSAqIChmY192W2ldIC8gMl4xMykgfSA9CisgKiAgICAgICAgPSAxL04gKiBzdW0oaSwwLE4pIHsgZmNfdltpXSAqIGZjX3ZbaV0gfSAvIDJeMjYKKyAqCisgKiAgICAgICAgRWkgPSAxMGxvZyhtZWFuKSA9IC0xMGxvZyhOKSAtIDEwbG9nKDJeMjYpICsKKyAqICAgICAgICArIDEwbG9nKHN1bShpLDAsTikgeyBmY192W2ldICogZmNfdltpXSB9KQorICoKKyAqICAgICAgICBFcCAtIEVpICsgRW0gPSBFcCArIEVtICsgMTBsb2coTikgKyAxMGxvZygyXjI2KSAtCisgKiAgICAgICAgLSAxMGxvZyhzdW0oaSwwLE4pIHsgZmNfdltpXSAqIGZjX3ZbaV0gfSkgPQorICogICAgICAgID0gRXAgKyBtcl9lbmVyZ3kgLSAxMGxvZyhzdW0oaSwwLE4pIHsgZmNfdltpXSAqIGZjX3ZbaV0gfSkKKyAqCisgKiAgICAgICAgZ2NfcCA9IDEwIF4gKChFcCAtIEVpICsgRW0pIC8gMjApID0KKyAqICAgICAgICA9IDIgXiAoMy4zMjE5ICogKEVwIC0gRWkgKyBFbSkgLyAyMCkgPSAyIF4gKDAuMTY2ICogKEVwIC0gRWkgKyBFbSkpCisgKgorICogICAgd2hlcmUKKyAqCisgKiAgICAgICAgbXJfZW5lcmd5ID0gRW0gKyAxMGxvZyhOKSArIDEwbG9nKDJeMjYpCisgKgorICogQHJlbWFyayBUaGUgcm91dGluZSBpcyB1c2VkIGluIEcuNzI5IGFuZCBBTVIgKGFsbCBtb2RlcykuCisgKi8KK2ludDE2X3QgZmZfYWNlbHBfZGVjb2RlX2dhaW5fY29kZSgKKyAgICBBdWRpb0RTUENvbnRleHQgKmFkc3AsCisgICAgaW50IGdhaW5fY29ycl9mYWN0b3IsCisgICAgY29uc3QgaW50MTZfdCogZmNfdiwKKyAgICBpbnQgbXJfZW5lcmd5LAorICAgIGNvbnN0IGludDE2X3QqIHF1YW50X2VuZXJneSwKKyAgICBjb25zdCBpbnQxNl90KiBtYV9wcmVkaWN0aW9uX2NvZWZmLAorICAgIGludCBzdWJmcmFtZV9zaXplLAorICAgIGludCBtYXhfcHJlZF9vcmRlcik7CisKKy8qKgorICogQ2FsY3VsYXRlIGZpeGVkIGdhaW4gKHBhcnQgb2Ygc2VjdGlvbiA2LjEuMyBvZiBBTVIgc3BlYykKKyAqCisgKiBAcGFyYW0gZml4ZWRfZ2Fpbl9mYWN0b3IgZ2FpbiBjb3JyZWN0aW9uIGZhY3RvcgorICogQHBhcmFtIGZpeGVkX21lYW5fZW5lcmd5IG1lYW4gZGVjb2RlZCBhbGdlYnJhaWMgY29kZWJvb2sgdmVjdG9yIGVuZXJneQorICogQHBhcmFtIHByZWRpY3Rpb25fZXJyb3IgdmVjdG9yIG9mIHRoZSBxdWFudGlmaWVkIHByZWRpY3RvciBlcnJvcnMgb2YKKyAqICAgICAgICB0aGUgZm91ciBwcmV2aW91cyBzdWJmcmFtZXMuIEl0IGlzIHVwZGF0ZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqIEBwYXJhbSBlbmVyZ3lfbWVhbiBkZXNpcmVkIG1lYW4gaW5ub3ZhdGlvbiBlbmVyZ3kKKyAqIEBwYXJhbSBwcmVkX3RhYmxlIHRhYmxlIG9mIGZvdXIgbW92aW5nIGF2ZXJhZ2UgY29lZmZpY2llbnRzCisgKi8KK2Zsb2F0IGZmX2Ftcl9zZXRfZml4ZWRfZ2FpbihmbG9hdCBmaXhlZF9nYWluX2ZhY3RvciwgZmxvYXQgZml4ZWRfbWVhbl9lbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnByZWRpY3Rpb25fZXJyb3IsIGZsb2F0IGVuZXJneV9tZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpwcmVkX3RhYmxlKTsKKworCisvKioKKyAqIERlY29kZSB0aGUgYWRhcHRpdmUgY29kZWJvb2sgaW5kZXggdG8gdGhlIGludGVnZXIgYW5kIGZyYWN0aW9uYWwgcGFydHMKKyAqIG9mIHRoZSBwaXRjaCBsYWcgZm9yIG9uZSBzdWJmcmFtZSBhdCAxLzMgZnJhY3Rpb25hbCBwcmVjaXNpb24uCisgKgorICogVGhlIGNob2ljZSBvZiBwaXRjaCBsYWcgaXMgZGVzY3JpYmVkIGluIDNHUFAgVFMgMjYuMDkwIHNlY3Rpb24gNS42LjEuCisgKgorICogQHBhcmFtIGxhZ19pbnQgICAgICAgICAgICAgaW50ZWdlciBwYXJ0IG9mIHBpdGNoIGxhZyBvZiB0aGUgY3VycmVudCBzdWJmcmFtZQorICogQHBhcmFtIGxhZ19mcmFjICAgICAgICAgICAgZnJhY3Rpb25hbCBwYXJ0IG9mIHBpdGNoIGxhZyBvZiB0aGUgY3VycmVudCBzdWJmcmFtZQorICogQHBhcmFtIHBpdGNoX2luZGV4ICAgICAgICAgcGFyc2VkIGFkYXB0aXZlIGNvZGVib29rIChwaXRjaCkgaW5kZXgKKyAqIEBwYXJhbSBwcmV2X2xhZ19pbnQgICAgICAgIGludGVnZXIgcGFydCBvZiBwaXRjaCBsYWcgZm9yIHRoZSBwcmV2aW91cyBzdWJmcmFtZQorICogQHBhcmFtIHN1YmZyYW1lICAgICAgICAgICAgY3VycmVudCBzdWJmcmFtZSBudW1iZXIKKyAqIEBwYXJhbSB0aGlyZF9hc19maXJzdCAgICAgIHRyZWF0IHRoZSB0aGlyZCBmcmFtZSB0aGUgc2FtZSB3YXkgYXMgdGhlIGZpcnN0CisgKi8KK3ZvaWQgZmZfZGVjb2RlX3BpdGNoX2xhZyhpbnQgKmxhZ19pbnQsIGludCAqbGFnX2ZyYWMsIGludCBwaXRjaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcHJldl9sYWdfaW50LCBjb25zdCBpbnQgc3ViZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRoaXJkX2FzX2ZpcnN0LCBpbnQgcmVzb2x1dGlvbik7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FDRUxQX1BJVENIX0RFTEFZX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FjZWxwX3ZlY3RvcnMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjZWxwX3ZlY3RvcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njg1MWEzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWNlbHBfdmVjdG9ycy5jCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogYWRhcHRpdmUgYW5kIGZpeGVkIGNvZGVib29rIHZlY3RvciBvcGVyYXRpb25zIGZvciBBQ0VMUC1iYXNlZCBjb2RlY3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImFjZWxwX3ZlY3RvcnMuaCIKKworY29uc3QgdWludDhfdCBmZl9mY18ycHVsc2VzXzliaXRzX3RyYWNrMVsxNl0gPQoreworICAgIDEsICAzLAorICAgIDYsICA4LAorICAgIDExLCAxMywKKyAgICAxNiwgMTgsCisgICAgMjEsIDIzLAorICAgIDI2LCAyOCwKKyAgICAzMSwgMzMsCisgICAgMzYsIDM4Cit9OworY29uc3QgdWludDhfdCBmZl9mY18ycHVsc2VzXzliaXRzX3RyYWNrMV9ncmF5WzE2XSA9Cit7CisgIDEsICAzLAorICA4LCAgNiwKKyAgMTgsIDE2LAorICAxMSwgMTMsCisgIDM4LCAzNiwKKyAgMzEsIDMzLAorICAyMSwgMjMsCisgIDI4LCAyNiwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfZmNfMnB1bHNlc185Yml0c190cmFjazJfZ3JheVszMl0gPQoreworICAwLCAgMiwKKyAgNSwgIDQsCisgIDEyLCAxMCwKKyAgNywgIDksCisgIDI1LCAyNCwKKyAgMjAsIDIyLAorICAxNCwgMTUsCisgIDE5LCAxNywKKyAgMzYsIDMxLAorICAyMSwgMjYsCisgIDEsICA2LAorICAxNiwgMTEsCisgIDI3LCAyOSwKKyAgMzIsIDMwLAorICAzOSwgMzcsCisgIDM0LCAzNSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfZmNfNHB1bHNlc184Yml0c190cmFja3NfMTNbMTZdID0KK3sKKyAgMCwgNSwgMTAsIDE1LCAyMCwgMjUsIDMwLCAzNSwgNDAsIDQ1LCA1MCwgNTUsIDYwLCA2NSwgNzAsIDc1LAorfTsKKworY29uc3QgdWludDhfdCBmZl9mY180cHVsc2VzXzhiaXRzX3RyYWNrXzRbMzJdID0KK3sKKyAgICAzLCAgNCwKKyAgICA4LCAgOSwKKyAgICAxMywgMTQsCisgICAgMTgsIDE5LAorICAgIDIzLCAyNCwKKyAgICAyOCwgMjksCisgICAgMzMsIDM0LAorICAgIDM4LCAzOSwKKyAgICA0MywgNDQsCisgICAgNDgsIDQ5LAorICAgIDUzLCA1NCwKKyAgICA1OCwgNTksCisgICAgNjMsIDY0LAorICAgIDY4LCA2OSwKKyAgICA3MywgNzQsCisgICAgNzgsIDc5LAorfTsKKworY29uc3QgZmxvYXQgZmZfcG93XzBfN1sxMF0gPSB7CisgICAgMC43MDAwMDAsIDAuNDkwMDAwLCAwLjM0MzAwMCwgMC4yNDAxMDAsIDAuMTY4MDcwLAorICAgIDAuMTE3NjQ5LCAwLjA4MjM1NCwgMC4wNTc2NDgsIDAuMDQwMzU0LCAwLjAyODI0OAorfTsKKworY29uc3QgZmxvYXQgZmZfcG93XzBfNzVbMTBdID0geworICAgIDAuNzUwMDAwLCAwLjU2MjUwMCwgMC40MjE4NzUsIDAuMzE2NDA2LCAwLjIzNzMwNSwKKyAgICAwLjE3Nzk3OSwgMC4xMzM0ODQsIDAuMTAwMTEzLCAwLjA3NTA4NSwgMC4wNTYzMTQKK307CisKK2NvbnN0IGZsb2F0IGZmX3Bvd18wXzU1WzEwXSA9IHsKKyAgICAwLjU1MDAwMCwgMC4zMDI1MDAsIDAuMTY2Mzc1LCAwLjA5MTUwNiwgMC4wNTAzMjgsCisgICAgMC4wMjc2ODEsIDAuMDE1MjI0LCAwLjAwODM3MywgMC4wMDQ2MDUsIDAuMDAyNTMzCit9OworCitjb25zdCBmbG9hdCBmZl9iNjBfc2luY1s2MV0gPSB7CisgMC44OTg1MjkgICwgIDAuODY1MDUxICAsICAwLjc2OTI1NyAgLCAgMC42MjQwNTQgICwgIDAuNDQ4NjM5ICAsICAwLjI2NTI4OSAgICwKKyAwLjA5NTkxNjcgLCAtMC4wNDEyNTk4ICwgLTAuMTM0MzM4ICAsIC0wLjE3ODk4NiAgLCAtMC4xNzg1MjggICwgLTAuMTQyNjA5ICAgLAorLTAuMDg0OTMwNCAsIC0wLjAyMDUwNzggLCAgMC4wMzY5NTY4ICwgIDAuMDc3MzkyNiAsICAwLjA5NTUyMDAgLCAgMC4wOTEyNzgxICAsCisgMC4wNjg5MzkyICwgIDAuMDM1NzA1NiAsICAwLjAgICAgICAgLCAtMC4wMzA1NDgxICwgLTAuMDUwNDE1MCAsIC0wLjA1NzAwNjggICwKKy0wLjA1MDg0MjMgLCAtMC4wMzUwMDM3ICwgLTAuMDE0MTYwMiAsICAwLjAwNjY1MjgzLCAgMC4wMjMwNzEzICwgIDAuMDMyMzQ4NiAgLAorIDAuMDMzNTM4OCAsICAwLjAyNzU4NzkgLCAgMC4wMTY3ODQ3ICwgIDAuMDA0MTE5ODcsIC0wLjAwNzQ3NjgxLCAtMC4wMTU2ODYwICAsCistMC4wMTkzNDgxICwgLTAuMDE4MzcxNiAsIC0wLjAxMzc2MzQgLCAtMC4wMDcwNDk1NiwgIDAuMCAgICAgICAsICAwLjAwNTgyODg2ICwKKyAwLjAwOTM5OTQxLCAgMC4wMTAzNzYwICwgIDAuMDA5MDMzMjAsICAwLjAwNjA0MjQ4LCAgMC4wMDIzODAzNywgLTAuMDAxMDk4NjMgLAorLTAuMDAzNjYyMTEsIC0wLjAwNDk3NDM3LCAtMC4wMDUwMzU0MCwgLTAuMDA0MDI4MzIsIC0wLjAwMjQxMDg5LCAtMC4wMDA1Nzk4MzQsCisgMC4wMDEwMzc2MCwgIDAuMDAyMjI3NzgsICAwLjAwMjc3NzEwLCAgMC4wMDI3MTYwNiwgIDAuMDAyMTM2MjMsICAwLjAwMTE1OTY3ICwKKyAwLgorfTsKKwordm9pZCBmZl9hY2VscF9mY19wdWxzZV9wZXJfdHJhY2soCisgICAgICAgIGludDE2X3QqIGZjX3YsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRhYjEsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRhYjIsCisgICAgICAgIGludCBwdWxzZV9pbmRleGVzLAorICAgICAgICBpbnQgcHVsc2Vfc2lnbnMsCisgICAgICAgIGludCBwdWxzZV9jb3VudCwKKyAgICAgICAgaW50IGJpdHMpCit7CisgICAgaW50IG1hc2sgPSAoMSA8PCBiaXRzKSAtIDE7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPHB1bHNlX2NvdW50OyBpKyspCisgICAgeworICAgICAgICBmY192W2kgKyB0YWIxW3B1bHNlX2luZGV4ZXMgJiBtYXNrXV0gKz0KKyAgICAgICAgICAgICAgICAocHVsc2Vfc2lnbnMgJiAxKSA/IDgxOTEgOiAtODE5MjsgLy8gKy8tMSBpbiAoMi4xMykKKworICAgICAgICBwdWxzZV9pbmRleGVzID4+PSBiaXRzOworICAgICAgICBwdWxzZV9zaWducyA+Pj0gMTsKKyAgICB9CisKKyAgICBmY192W3RhYjJbcHVsc2VfaW5kZXhlc11dICs9IChwdWxzZV9zaWducyAmIDEpID8gODE5MSA6IC04MTkyOworfQorCit2b2lkIGZmX2RlY29kZV8xMF9wdWxzZXNfMzViaXRzKGNvbnN0IGludDE2X3QgKmZpeGVkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJGaXhlZCAqZml4ZWRfc3BhcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpncmF5X2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbGZfcHVsc2VfY291bnQsIGludCBiaXRzKQoreworICAgIGludCBpOworICAgIGludCBtYXNrID0gKDEgPDwgYml0cykgLSAxOworCisgICAgZml4ZWRfc3BhcnNlLT5ub19yZXBlYXRfbWFzayA9IDA7CisgICAgZml4ZWRfc3BhcnNlLT5uID0gMiAqIGhhbGZfcHVsc2VfY291bnQ7CisgICAgZm9yIChpID0gMDsgaSA8IGhhbGZfcHVsc2VfY291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBpbnQgcG9zMSAgID0gZ3JheV9kZWNvZGVbZml4ZWRfaW5kZXhbMippKzFdICYgbWFza10gKyBpOworICAgICAgICBjb25zdCBpbnQgcG9zMiAgID0gZ3JheV9kZWNvZGVbZml4ZWRfaW5kZXhbMippICBdICYgbWFza10gKyBpOworICAgICAgICBjb25zdCBmbG9hdCBzaWduID0gKGZpeGVkX2luZGV4WzIqaSsxXSAmICgxIDw8IGJpdHMpKSA/IC0xLjAgOiAxLjA7CisgICAgICAgIGZpeGVkX3NwYXJzZS0+eFsyKmkrMV0gPSBwb3MxOworICAgICAgICBmaXhlZF9zcGFyc2UtPnhbMippICBdID0gcG9zMjsKKyAgICAgICAgZml4ZWRfc3BhcnNlLT55WzIqaSsxXSA9IHNpZ247CisgICAgICAgIGZpeGVkX3NwYXJzZS0+eVsyKmkgIF0gPSBwb3MyIDwgcG9zMSA/IC1zaWduIDogc2lnbjsKKyAgICB9Cit9CisKK3ZvaWQgZmZfYWNlbHBfd2VpZ2h0ZWRfdmVjdG9yX3N1bSgKKyAgICAgICAgaW50MTZfdCogb3V0LAorICAgICAgICBjb25zdCBpbnQxNl90ICppbl9hLAorICAgICAgICBjb25zdCBpbnQxNl90ICppbl9iLAorICAgICAgICBpbnQxNl90IHdlaWdodF9jb2VmZl9hLAorICAgICAgICBpbnQxNl90IHdlaWdodF9jb2VmZl9iLAorICAgICAgICBpbnQxNl90IHJvdW5kZXIsCisgICAgICAgIGludCBzaGlmdCwKKyAgICAgICAgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8vIENsaXBwaW5nIHJlcXVpcmVkIGhlcmU7IGJyZWFrcyBPVkVSRkxPVyB0ZXN0LgorICAgIGZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCisgICAgICAgIG91dFtpXSA9IGF2X2NsaXBfaW50MTYoKAorICAgICAgICAgICAgICAgICBpbl9hW2ldICogd2VpZ2h0X2NvZWZmX2EgKworICAgICAgICAgICAgICAgICBpbl9iW2ldICogd2VpZ2h0X2NvZWZmX2IgKworICAgICAgICAgICAgICAgICByb3VuZGVyKSA+PiBzaGlmdCk7Cit9CisKK3ZvaWQgZmZfd2VpZ2h0ZWRfdmVjdG9yX3N1bWYoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluX2EsIGNvbnN0IGZsb2F0ICppbl9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHRfY29lZmZfYSwgZmxvYXQgd2VpZ2h0X2NvZWZmX2IsIGludCBsZW5ndGgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgICAgICBvdXRbaV0gPSB3ZWlnaHRfY29lZmZfYSAqIGluX2FbaV0KKyAgICAgICAgICAgICAgICsgd2VpZ2h0X2NvZWZmX2IgKiBpbl9iW2ldOworfQorCit2b2lkIGZmX2FkYXB0aXZlX2dhaW5fY29udHJvbChmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIGZsb2F0IHNwZWVjaF9lbmVyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBmbG9hdCBhbHBoYSwgZmxvYXQgKmdhaW5fbWVtKQoreworICAgIGludCBpOworICAgIGZsb2F0IHBvc3RmaWx0ZXJfZW5lcmcgPSBhdnByaXZfc2NhbGFycHJvZHVjdF9mbG9hdF9jKGluLCBpbiwgc2l6ZSk7CisgICAgZmxvYXQgZ2Fpbl9zY2FsZV9mYWN0b3IgPSAxLjA7CisgICAgZmxvYXQgbWVtID0gKmdhaW5fbWVtOworCisgICAgaWYgKHBvc3RmaWx0ZXJfZW5lcmcpCisgICAgICAgIGdhaW5fc2NhbGVfZmFjdG9yID0gc3FydChzcGVlY2hfZW5lcmcgLyBwb3N0ZmlsdGVyX2VuZXJnKTsKKworICAgIGdhaW5fc2NhbGVfZmFjdG9yICo9IDEuMCAtIGFscGhhOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBtZW0gPSBhbHBoYSAqIG1lbSArIGdhaW5fc2NhbGVfZmFjdG9yOworICAgICAgICBvdXRbaV0gPSBpbltpXSAqIG1lbTsKKyAgICB9CisKKyAgICAqZ2Fpbl9tZW0gPSBtZW07Cit9CisKK3ZvaWQgZmZfc2NhbGVfdmVjdG9yX3RvX2dpdmVuX3N1bV9vZl9zcXVhcmVzKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHN1bV9vZl9zcXVhcmVzLCBjb25zdCBpbnQgbikKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCBzY2FsZWZhY3RvciA9IGF2cHJpdl9zY2FsYXJwcm9kdWN0X2Zsb2F0X2MoaW4sIGluLCBuKTsKKyAgICBpZiAoc2NhbGVmYWN0b3IpCisgICAgICAgIHNjYWxlZmFjdG9yID0gc3FydChzdW1fb2Zfc3F1YXJlcyAvIHNjYWxlZmFjdG9yKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBvdXRbaV0gPSBpbltpXSAqIHNjYWxlZmFjdG9yOworfQorCit2b2lkIGZmX3NldF9maXhlZF92ZWN0b3IoZmxvYXQgKm91dCwgY29uc3QgQU1SRml4ZWQgKmluLCBmbG9hdCBzY2FsZSwgaW50IHNpemUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IGluLT5uOyBpKyspIHsKKyAgICAgICAgaW50IHggICA9IGluLT54W2ldLCByZXBlYXRzID0gISgoaW4tPm5vX3JlcGVhdF9tYXNrID4+IGkpICYgMSk7CisgICAgICAgIGZsb2F0IHkgPSBpbi0+eVtpXSAqIHNjYWxlOworCisgICAgICAgIGlmIChpbi0+cGl0Y2hfbGFnID4gMCkKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBvdXRbeF0gKz0geTsKKyAgICAgICAgICAgICAgICB5ICo9IGluLT5waXRjaF9mYWM7CisgICAgICAgICAgICAgICAgeCArPSBpbi0+cGl0Y2hfbGFnOworICAgICAgICAgICAgfSB3aGlsZSAoeCA8IHNpemUgJiYgcmVwZWF0cyk7CisgICAgfQorfQorCit2b2lkIGZmX2NsZWFyX2ZpeGVkX3ZlY3RvcihmbG9hdCAqb3V0LCBjb25zdCBBTVJGaXhlZCAqaW4sIGludCBzaXplKQoreworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGkgPCBpbi0+bjsgaSsrKSB7CisgICAgICAgIGludCB4ICA9IGluLT54W2ldLCByZXBlYXRzID0gISgoaW4tPm5vX3JlcGVhdF9tYXNrID4+IGkpICYgMSk7CisKKyAgICAgICAgaWYgKGluLT5waXRjaF9sYWcgPiAwKQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG91dFt4XSA9IDAuMDsKKyAgICAgICAgICAgICAgICB4ICs9IGluLT5waXRjaF9sYWc7CisgICAgICAgICAgICB9IHdoaWxlICh4IDwgc2l6ZSAmJiByZXBlYXRzKTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfYWNlbHBfdmVjdG9yc19pbml0KEFDRUxQVkNvbnRleHQgKmMpCit7CisgICAgYy0+d2VpZ2h0ZWRfdmVjdG9yX3N1bWYgICA9IGZmX3dlaWdodGVkX3ZlY3Rvcl9zdW1mOworCisgICAgaWYoSEFWRV9NSVBTRlBVKQorICAgICAgICBmZl9hY2VscF92ZWN0b3JzX2luaXRfbWlwcyhjKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FjZWxwX3ZlY3RvcnMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FjZWxwX3ZlY3RvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWU4MzRkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWNlbHBfdmVjdG9ycy5oCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogYWRhcHRpdmUgYW5kIGZpeGVkIGNvZGVib29rIHZlY3RvciBvcGVyYXRpb25zIGZvciBBQ0VMUC1iYXNlZCBjb2RlY3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQUNFTFBfVkVDVE9SU19ICisjZGVmaW5lIEFWQ09ERUNfQUNFTFBfVkVDVE9SU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgQUNFTFBWQ29udGV4dCB7CisgICAgLyoqCisgICAgICogZmxvYXQgaW1wbGVtZW50YXRpb24gb2Ygd2VpZ2h0ZWQgc3VtIG9mIHR3byB2ZWN0b3JzLgorICAgICAqIEBwYXJhbVtvdXRdIG91dCByZXN1bHQgb2YgYWRkaXRpb24KKyAgICAgKiBAcGFyYW0gaW5fYSBmaXJzdCB2ZWN0b3IKKyAgICAgKiBAcGFyYW0gaW5fYiBzZWNvbmQgdmVjdG9yCisgICAgICogQHBhcmFtIHdlaWdodF9jb2VmZl9hIGZpcnN0IHZlY3RvciB3ZWlnaHQgY29lZmZpY2llbnQKKyAgICAgKiBAcGFyYW0gd2VpZ2h0X2NvZWZmX2Egc2Vjb25kIHZlY3RvciB3ZWlnaHQgY29lZmZpY2llbnQKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIHZlY3RvcnMgbGVuZ3RoIChzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiB0d28pCisgICAgICoKKyAgICAgKiBAbm90ZSBJdCBpcyBzYWZlIHRvIHBhc3MgdGhlIHNhbWUgYnVmZmVyIGZvciBvdXQgYW5kIGluX2Egb3IgaW5fYi4KKyAgICAgKi8KKyAgICB2b2lkICgqd2VpZ2h0ZWRfdmVjdG9yX3N1bWYpKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbl9hLCBjb25zdCBmbG9hdCAqaW5fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdlaWdodF9jb2VmZl9hLCBmbG9hdCB3ZWlnaHRfY29lZmZfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOworCit9QUNFTFBWQ29udGV4dDsKKworLyoqCisgKiBJbml0aWFsaXplIEFDRUxQVkNvbnRleHQuCisgKi8KK3ZvaWQgZmZfYWNlbHBfdmVjdG9yc19pbml0KEFDRUxQVkNvbnRleHQgKmMpOwordm9pZCBmZl9hY2VscF92ZWN0b3JzX2luaXRfbWlwcyhBQ0VMUFZDb250ZXh0ICpjKTsKKworLyoqIFNwYXJzZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGFsZ2VicmFpYyBjb2RlYm9vayAoZml4ZWQpIHZlY3RvciAqLwordHlwZWRlZiBzdHJ1Y3QgQU1SRml4ZWQgeworICAgIGludCAgICAgIG47CisgICAgaW50ICAgICAgeFsxMF07CisgICAgZmxvYXQgICAgeVsxMF07CisgICAgaW50ICAgICAgbm9fcmVwZWF0X21hc2s7CisgICAgaW50ICAgICAgcGl0Y2hfbGFnOworICAgIGZsb2F0ICAgIHBpdGNoX2ZhYzsKK30gQU1SRml4ZWQ7CisKKy8qKgorICogVHJhY2t8UHVsc2V8ICAgICAgICBQb3NpdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAxICAgfCAwICAgfCAwLCA1LCAxMCwgMTUsIDIwLCAyNSwgMzAsIDM1LCA0MCwgNDUsIDUwLCA1NSwgNjAsIDY1LCA3MCwgNzUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAyICAgfCAxICAgfCAxLCA2LCAxMSwgMTYsIDIxLCAyNiwgMzEsIDM2LCA0MSwgNDYsIDUxLCA1NiwgNjEsIDY2LCA3MSwgNzYKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAzICAgfCAyICAgfCAyLCA3LCAxMiwgMTcsIDIyLCAyNywgMzIsIDM3LCA0MiwgNDcsIDUyLCA1NywgNjIsIDY3LCA3MiwgNzcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUYWJsZSBjb250YWlucyBvbmx5IGZpcnN0IHRoZSBwdWxzZSBpbmRleGVzLgorICoKKyAqIFVzZWQgaW4gRy43MjkgQEA4aywgRy43MjkgQEA0LjRrLCBBTVIgQEA3Ljk1aywgQU1SIEBANy40MGsKKyAqLworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZmNfNHB1bHNlc184Yml0c190cmFja3NfMTNbMTZdOworCisvKioKKyAqIFRyYWNrfFB1bHNlfCAgICAgICAgUG9zaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgNCAgIHwgMyAgIHwgMywgOCwgMTMsIDE4LCAyMywgMjgsIDMzLCAzOCwgNDMsIDQ4LCA1MywgNTgsIDYzLCA2OCwgNzMsIDc4CisgKiAgICAgIHwgICAgIHwgNCwgOSwgMTQsIDE5LCAyNCwgMjksIDM0LCAzOSwgNDQsIDQ5LCA1NCwgNTksIDY0LCA2OSwgNzQsIDc5CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQHJlbWFyayBUcmFjayBpbiB0aGUgdGFibGUgc2hvdWxkIGJlIHJlYWQgdG9wLXRvLWJvdHRvbSwgbGVmdC10by1yaWdodC4KKyAqCisgKiBVc2VkIGluIEcuNzI5IEBAOGssIEcuNzI5IEBANC40aywgQU1SIEBANy45NWssIEFNUiBAQDcuNDBrCisgKi8KK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2ZjXzRwdWxzZXNfOGJpdHNfdHJhY2tfNFszMl07CisKKy8qKgorICogVHJhY2t8UHVsc2V8ICAgICAgICBQb3NpdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgMSAgIHwgMCAgIHwgMSwgNiwgMTEsIDE2LCAyMSwgMjYsIDMxLCAzNgorICogICAgICB8ICAgICB8IDMsIDgsIDEzLCAxOCwgMjMsIDI4LCAzMywgMzgKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQHJlbWFyayBUcmFjayBpbiB0aGUgdGFibGUgc2hvdWxkIGJlIHJlYWQgdG9wLXRvLWJvdHRvbSwgbGVmdC10by1yaWdodC4KKyAqCisgKiBAbm90ZSAoRUUpIFJlZmVyZW5jZSBHLjcyOUQgY29kZSBhbHNvIHVzZXMgZ3JheSBkZWNvZGluZyBmb3IgZWFjaAorICogICAgICAgICAgICBwdWxzZSBpbmRleCBiZWZvcmUgbG9va2luZyB1cCB0aGUgdmFsdWUgaW4gdGhlIHRhYmxlLgorICoKKyAqIFVzZWQgaW4gRy43MjkgQEA2LjRrICh3aXRoIGdyYXkgY29kaW5nKSwgQU1SIEBANS45ayAod2l0aG91dCBncmF5IGNvZGluZykKKyAqLworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZmNfMnB1bHNlc185Yml0c190cmFjazFbMTZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZmNfMnB1bHNlc185Yml0c190cmFjazFfZ3JheVsxNl07CisKKy8qKgorICogVHJhY2t8UHVsc2V8ICAgICAgICBQb3NpdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgMiAgIHwgMSAgIHwgMCwgNywgMTQsIDIwLCAyNywgMzQsICAxLCAyMQorICogICAgICB8ICAgICB8IDIsIDksIDE1LCAyMiwgMjksIDM1LCAgNiwgMjYKKyAqICAgICAgfCAgICAgfCA0LDEwLCAxNywgMjQsIDMwLCAzNywgMTEsIDMxCisgKiAgICAgIHwgICAgIHwgNSwxMiwgMTksIDI1LCAzMiwgMzksIDE2LCAzNgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBAcmVtYXJrIFRyYWNrIGluIHRoZSB0YWJsZSBzaG91bGQgYmUgcmVhZCB0b3AtdG8tYm90dG9tLCBsZWZ0LXRvLXJpZ2h0LgorICoKKyAqIEBub3RlIChFRS4xKSBUaGlzIHRhYmxlIChmcm9tIHRoZSByZWZlcmVuY2UgY29kZSkgZG9lcyBub3QgY29tcGx5IHdpdGgKKyAqICAgICAgICAgICAgICB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqICAgICAgICAgICAgICBUaGUgc3BlY2lmaWNhdGlvbiBjb250YWlucyB0aGUgZm9sbG93aW5nIHRhYmxlOgorICoKKyAqIFRyYWNrfFB1bHNlfCAgICAgICAgUG9zaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIDIgICB8IDEgICB8IDAsIDUsIDEwLCAxNSwgMjAsIDI1LCAzMCwgMzUKKyAqICAgICAgfCAgICAgfCAxLCA2LCAxMSwgMTYsIDIxLCAyNiwgMzEsIDM2CisgKiAgICAgIHwgICAgIHwgMiwgNywgMTIsIDE3LCAyMiwgMjcsIDMyLCAzNworICogICAgICB8ICAgICB8IDQsIDksIDE0LCAxOSwgMjQsIDI5LCAzNCwgMzkKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEBub3RlIChFRS4yKSBSZWZlcmVuY2UgRy43MjlEIGNvZGUgYWxzbyB1c2VzIGdyYXkgZGVjb2RpbmcgZm9yIGVhY2gKKyAqICAgICAgICAgICAgICBwdWxzZSBpbmRleCBiZWZvcmUgbG9va2luZyB1cCB0aGUgdmFsdWUgaW4gdGhlIHRhYmxlLgorICoKKyAqIFVzZWQgaW4gRy43MjkgQEA2LjRrICh3aXRoIGdyYXkgY29kaW5nKQorICovCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9mY18ycHVsc2VzXzliaXRzX3RyYWNrMl9ncmF5WzMyXTsKKworLyoqCisgKiBiNjAgaGFtbWluZyB3aW5kb3dlZCBzaW5jIGZ1bmN0aW9uIGNvZWZmaWNpZW50cworICovCitleHRlcm4gY29uc3QgZmxvYXQgZmZfYjYwX3NpbmNbNjFdOworCisvKioKKyAqIFRhYmxlIG9mIHBvdygwLjcsbikKKyAqLworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX3Bvd18wXzdbMTBdOworCisvKioKKyAqIFRhYmxlIG9mIHBvdygwLjc1LG4pCisgKi8KK2V4dGVybiBjb25zdCBmbG9hdCBmZl9wb3dfMF83NVsxMF07CisKKy8qKgorICogVGFibGUgb2YgcG93KDAuNTUsbikKKyAqLworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX3Bvd18wXzU1WzEwXTsKKworLyoqCisgKiBEZWNvZGUgZml4ZWQtY29kZWJvb2sgdmVjdG9yICgzLjggYW5kIEQuNS44IG9mIEcuNzI5LCA1LjcuMSBvZiBBTVIpLgorICogQHBhcmFtW291dF0gZmNfdiBkZWNvZGVkIGZpeGVkIGNvZGVib29rIHZlY3RvciAoMi4xMykKKyAqIEBwYXJhbSB0YWIxIHRhYmxlIHVzZWQgZm9yIGZpcnN0IHB1bHNlX2NvdW50IHB1bHNlcworICogQHBhcmFtIHRhYjIgdGFibGUgdXNlZCBmb3IgbGFzdCBwdWxzZQorICogQHBhcmFtIHB1bHNlX2luZGV4ZXMgZml4ZWQgY29kZWJvb2sgaW5kZXhlcworICogQHBhcmFtIHB1bHNlX3NpZ25zIHNpZ25zIG9mIHRoZSBleGNpdGF0aW9uIHB1bHNlcyAoMCBiaXQgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgbWVhbnMgbmVnYXRpdmUgc2lnbikKKyAqIEBwYXJhbSBiaXRzIG51bWJlciBvZiBiaXRzIHBlciBvbmUgcHVsc2UgaW5kZXgKKyAqIEBwYXJhbSBwdWxzZV9jb3VudCBudW1iZXIgb2YgcHVsc2VzIGRlY29kZWQgdXNpbmcgZmlyc3QgdGFibGUKKyAqIEBwYXJhbSBiaXRzIGxlbmd0aCBvZiBvbmUgcHVsc2UgaW5kZXggaW4gYml0cworICoKKyAqIFVzZWQgaW4gRy43MjkgQEA4aywgRy43MjkgQEA0LjRrLCBHLjcyOSBAQDYuNGssIEFNUiBAQDcuOTVrLCBBTVIgQEA3LjQwaworICovCit2b2lkIGZmX2FjZWxwX2ZjX3B1bHNlX3Blcl90cmFjayhpbnQxNl90KiBmY192LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdGFiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRhYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHVsc2VfaW5kZXhlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwdWxzZV9zaWducywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwdWxzZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzKTsKKworLyoqCisgKiBEZWNvZGUgdGhlIGFsZ2VicmFpYyBjb2RlYm9vayBpbmRleCB0byBwdWxzZSBwb3NpdGlvbnMgYW5kIHNpZ25zIGFuZAorICogY29uc3RydWN0IHRoZSBhbGdlYnJhaWMgY29kZWJvb2sgdmVjdG9yIGZvciBNT0RFXzEyazIuCisgKgorICogQG5vdGU6IFRoZSBwb3NpdGlvbnMgYW5kIHNpZ25zIGFyZSBleHBsaWNpdGx5IGNvZGVkIGluIE1PREVfMTJrMi4KKyAqCisgKiBAcGFyYW0gZml4ZWRfaW5kZXggICAgICAgICAgcG9zaXRpb25zIG9mIHRoZSB0ZW4gcHVsc2VzCisgKiBAcGFyYW0gZml4ZWRfc3BhcnNlICAgICAgICAgcG9pbnRlciB0byB0aGUgYWxnZWJyYWljIGNvZGVib29rIHZlY3RvcgorICogQHBhcmFtIGdyYXlfZGVjb2RlICAgICAgICAgIGdyYXkgZGVjb2RpbmcgdGFibGUKKyAqIEBwYXJhbSBoYWxmX3B1bHNlX2NvdW50ICAgICBudW1iZXIgb2YgY291cGxlcyBvZiBwdWxzZXMKKyAqIEBwYXJhbSBiaXRzICAgICAgICAgICAgICAgICBsZW5ndGggb2Ygb25lIHB1bHNlIGluZGV4IGluIGJpdHMKKyAqLwordm9pZCBmZl9kZWNvZGVfMTBfcHVsc2VzXzM1Yml0cyhjb25zdCBpbnQxNl90ICpmaXhlZF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SRml4ZWQgKmZpeGVkX3NwYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZ3JheV9kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYWxmX3B1bHNlX2NvdW50LCBpbnQgYml0cyk7CisKKworLyoqCisgKiB3ZWlnaHRlZCBzdW0gb2YgdHdvIHZlY3RvcnMgd2l0aCByb3VuZGluZy4KKyAqIEBwYXJhbVtvdXRdIG91dCByZXN1bHQgb2YgYWRkaXRpb24KKyAqIEBwYXJhbSBpbl9hIGZpcnN0IHZlY3RvcgorICogQHBhcmFtIGluX2Igc2Vjb25kIHZlY3RvcgorICogQHBhcmFtIHdlaWdodF9jb2VmZl9hIGZpcnN0IHZlY3RvciB3ZWlnaHQgY29lZmZpY2llbnQKKyAqIEBwYXJhbSB3ZWlnaHRfY29lZmZfYSBzZWNvbmQgdmVjdG9yIHdlaWdodCBjb2VmZmljaWVudAorICogQHBhcmFtIHJvdW5kZXIgdGhpcyB2YWx1ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzdW0gb2YgdGhlIHR3byB2ZWN0b3JzCisgKiBAcGFyYW0gc2hpZnQgcmVzdWx0IHdpbGwgYmUgc2hpZnRlZCB0byByaWdodCBieSB0aGlzIHZhbHVlCisgKiBAcGFyYW0gbGVuZ3RoIHZlY3RvcnMgbGVuZ3RoCisgKgorICogQG5vdGUgSXQgaXMgc2FmZSB0byBwYXNzIHRoZSBzYW1lIGJ1ZmZlciBmb3Igb3V0IGFuZCBpbl9hIG9yIGluX2IuCisgKgorICogIG91dFtpXSA9IChpbl9hW2ldKndlaWdodF9hICsgaW5fYltpXSp3ZWlnaHRfYiArIHJvdW5kZXIpID4+IHNoaWZ0CisgKi8KK3ZvaWQgZmZfYWNlbHBfd2VpZ2h0ZWRfdmVjdG9yX3N1bShpbnQxNl90KiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqaW5fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICppbl9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3Qgd2VpZ2h0X2NvZWZmX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB3ZWlnaHRfY29lZmZfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHJvdW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOworCisvKioKKyAqIGZsb2F0IGltcGxlbWVudGF0aW9uIG9mIHdlaWdodGVkIHN1bSBvZiB0d28gdmVjdG9ycy4KKyAqIEBwYXJhbVtvdXRdIG91dCByZXN1bHQgb2YgYWRkaXRpb24KKyAqIEBwYXJhbSBpbl9hIGZpcnN0IHZlY3RvcgorICogQHBhcmFtIGluX2Igc2Vjb25kIHZlY3RvcgorICogQHBhcmFtIHdlaWdodF9jb2VmZl9hIGZpcnN0IHZlY3RvciB3ZWlnaHQgY29lZmZpY2llbnQKKyAqIEBwYXJhbSB3ZWlnaHRfY29lZmZfYSBzZWNvbmQgdmVjdG9yIHdlaWdodCBjb2VmZmljaWVudAorICogQHBhcmFtIGxlbmd0aCB2ZWN0b3JzIGxlbmd0aAorICoKKyAqIEBub3RlIEl0IGlzIHNhZmUgdG8gcGFzcyB0aGUgc2FtZSBidWZmZXIgZm9yIG91dCBhbmQgaW5fYSBvciBpbl9iLgorICovCit2b2lkIGZmX3dlaWdodGVkX3ZlY3Rvcl9zdW1mKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbl9hLCBjb25zdCBmbG9hdCAqaW5fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2VpZ2h0X2NvZWZmX2EsIGZsb2F0IHdlaWdodF9jb2VmZl9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKTsKKworLyoqCisgKiBBZGFwdGl2ZSBnYWluIGNvbnRyb2wgKGFzIHVzZWQgaW4gQU1SIHBvc3RmaWx0ZXJpbmcpCisgKgorICogQHBhcmFtIG91dCBvdXRwdXQgYnVmZmVyIGZvciBmaWx0ZXJlZCBzcGVlY2ggZGF0YQorICogQHBhcmFtIGluIHRoZSBpbnB1dCBzcGVlY2ggYnVmZmVyIChtYXkgYmUgdGhlIHNhbWUgYXMgb3V0KQorICogQHBhcmFtIHNwZWVjaF9lbmVyZyBpbnB1dCBlbmVyZ3kKKyAqIEBwYXJhbSBzaXplIHRoZSBpbnB1dCBidWZmZXIgc2l6ZQorICogQHBhcmFtIGFscGhhIGV4cG9uZW50aWFsIGZpbHRlciBmYWN0b3IKKyAqIEBwYXJhbSBnYWluX21lbSBhIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBtZW1vcnkgKHNpbmdsZSBmbG9hdCBvZiBzaXplKQorICovCit2b2lkIGZmX2FkYXB0aXZlX2dhaW5fY29udHJvbChmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIGZsb2F0IHNwZWVjaF9lbmVyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBmbG9hdCBhbHBoYSwgZmxvYXQgKmdhaW5fbWVtKTsKKworLyoqCisgKiBTZXQgdGhlIHN1bSBvZiBzcXVhcmVzIG9mIGEgc2lnbmFsIGJ5IHNjYWxpbmcKKyAqCisgKiBAcGFyYW0gb3V0IG91dHB1dCBzYW1wbGVzCisgKiBAcGFyYW0gaW4gaW5wdXQgc2FtcGxlcworICogQHBhcmFtIHN1bV9vZl9zcXVhcmVzIG5ldyBzdW0gb2Ygc3F1YXJlcworICogQHBhcmFtIG4gbnVtYmVyIG9mIHNhbXBsZXMKKyAqCisgKiBAbm90ZSBJZiB0aGUgaW5wdXQgaXMgemVybyAob3IgaXRzIGVuZXJneSB1bmRlcmZsb3dzKSwgdGhlIG91dHB1dCBpcyB6ZXJvLgorICogICAgICAgVGhpcyBpcyB0aGUgYmVoYXZpb3Igb2YgQUdDIGluIHRoZSBBTVIgcmVmZXJlbmNlIGRlY29kZXIuIFRoZSBRQ0VMUAorICogICAgICAgcmVmZXJlbmNlIGRlY29kZXIgc2VlbXMgdG8gaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IuCisgKgorICogVElBL0VJQS9JUy03MzMgMi40LjguMy0yLzMvNC81LCAyLjQuOC42CisgKiAzR1BQIFRTIDI2LjA5MCA2LjEgKDYpCisgKi8KK3ZvaWQgZmZfc2NhbGVfdmVjdG9yX3RvX2dpdmVuX3N1bV9vZl9zcXVhcmVzKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHN1bV9vZl9zcXVhcmVzLCBjb25zdCBpbnQgbik7CisKKy8qKgorICogQWRkIGZpeGVkIHZlY3RvciB0byBhbiBhcnJheSBmcm9tIGEgc3BhcnNlIHJlcHJlc2VudGF0aW9uCisgKgorICogQHBhcmFtIG91dCBmaXhlZCB2ZWN0b3Igd2l0aCBwaXRjaCBzaGFycGVuaW5nCisgKiBAcGFyYW0gaW4gc3BhcnNlIGZpeGVkIHZlY3RvcgorICogQHBhcmFtIHNjYWxlIG51bWJlciB0byBtdWx0aXBseSB0aGUgZml4ZWQgdmVjdG9yIGJ5CisgKiBAcGFyYW0gc2l6ZSB0aGUgb3V0cHV0IHZlY3RvciBzaXplCisgKi8KK3ZvaWQgZmZfc2V0X2ZpeGVkX3ZlY3RvcihmbG9hdCAqb3V0LCBjb25zdCBBTVJGaXhlZCAqaW4sIGZsb2F0IHNjYWxlLCBpbnQgc2l6ZSk7CisKKy8qKgorICogQ2xlYXIgYXJyYXkgdmFsdWVzIHNldCBieSBzZXRfZml4ZWRfdmVjdG9yCisgKgorICogQHBhcmFtIG91dCBmaXhlZCB2ZWN0b3IgdG8gYmUgY2xlYXJlZAorICogQHBhcmFtIGluIHNwYXJzZSBmaXhlZCB2ZWN0b3IKKyAqIEBwYXJhbSBzaXplIHRoZSBvdXRwdXQgdmVjdG9yIHNpemUKKyAqLwordm9pZCBmZl9jbGVhcl9maXhlZF92ZWN0b3IoZmxvYXQgKm91dCwgY29uc3QgQU1SRml4ZWQgKmluLCBpbnQgc2l6ZSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FDRUxQX1ZFQ1RPUlNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWRwY20uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FkcGNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5NWE2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FkcGNtLmMKQEAgLTAsMCArMSwxNTgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogZmlyc3QgdmVyc2lvbiBieSBGcmFuY29pcyBSZXZvbCAocmV2b2xAZnJlZS5mcikKKyAqIGZyaW5nZSBBRFBDTSBjb2RlY3MgKGUuZy4sIERLMywgREs0LCBXZXN0d29vZCkKKyAqICAgYnkgTWlrZSBNZWxhbnNvbiAobWVsYW5zb25AcGNpc3lzLm5ldCkKKyAqIENELVJPTSBYQSBBRFBDTSBjb2RlYyBieSBCRVJPCisgKiBFQSBBRFBDTSBkZWNvZGVyIGJ5IFJvYmluIEtheSAoa29tYWRvcmlAbXlyZWFsYm94LmNvbSkKKyAqIEVBIEFEUENNIFIxL1IyL1IzIGRlY29kZXIgYnkgUGV0ZXIgUm9zcyAocHJvc3NAeHZpZC5vcmcpCisgKiBFQSBJTUEgRUFDUyBkZWNvZGVyIGJ5IFBldGVyIFJvc3MgKHByb3NzQHh2aWQub3JnKQorICogRUEgSU1BIFNFQUQgZGVjb2RlciBieSBQZXRlciBSb3NzIChwcm9zc0B4dmlkLm9yZykKKyAqIEVBIEFEUENNIFhBUyBkZWNvZGVyIGJ5IFBldGVyIFJvc3MgKHByb3NzQHh2aWQub3JnKQorICogTUFYSVMgRUEgQURQQ00gZGVjb2RlciBieSBSb2JlcnQgTWFyc3RvbiAocm1hcnN0b25AZ21haWwuY29tKQorICogVEhQIEFEUENNIGRlY29kZXIgYnkgTWFyY28gR2VyYXJkcyAobWdlcmFyZHNAeHM0YWxsLm5sKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhZHBjbS5oIgorI2luY2x1ZGUgImFkcGNtX2RhdGEuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKioKKyAqIEBmaWxlCisgKiBBRFBDTSBkZWNvZGVycworICogRmVhdHVyZXMgYW5kIGxpbWl0YXRpb25zOgorICoKKyAqIFJlZmVyZW5jZSBkb2N1bWVudHM6CisgKiBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1DYXRlZ29yeTpBRFBDTV9BdWRpb19Db2RlY3MKKyAqIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzL3NpbXBsZWF1ZGlvLmh0bWwgW2RlYWRdCisgKiBodHRwOi8vd3d3Lmdlb2NpdGllcy5jb20vU2lsaWNvblZhbGxleS84NjgyL2F1ZDMudHh0IFtkZWFkXQorICogaHR0cDovL29wZW5xdWlja3RpbWUuc291cmNlZm9yZ2UubmV0LworICogWEFuaW0gc291cmNlcyAoeGFfY29kZWMuYykgaHR0cDovL3hhbmltLnBvbHRlci5uZXQvCisgKiBodHRwOi8vd3d3LmNzLnVjbGEuZWR1L35sZWVjL21lZGlhYmVuY2gvYXBwbGljYXRpb25zLmh0bWwgW2RlYWRdCisgKiBTb1ggc291cmNlIGNvZGUgaHR0cDovL3NveC5zb3VyY2Vmb3JnZS5uZXQvCisgKgorICogQ0QtUk9NIFhBOgorICogaHR0cDovL2t1LXd3dy5zcy50aXRlY2guYWMuanAvfnlhdHN1c2hpL3hhYWRwY20uaHRtbCBbZGVhZF0KKyAqIHZhZ3BhY2sgJiBkZXBhY2sgaHR0cDovL2hvbWVwYWdlcy5jb21wdXNlcnZlLmRlL2JJVG1BU1RFUjMyL3BzeC1pbmRleC5odG1sIFtkZWFkXQorICogcmVhZHN0ciBodHRwOi8vd3d3Lmdlb2NpdGllcy5jby5qcC9QbGF5dG93bi8yMDA0LworICovCisKKy8qIFRoZXNlIGFyZSBmb3IgQ0QtUk9NIFhBIEFEUENNICovCitzdGF0aWMgY29uc3QgaW50IHhhX2FkcGNtX3RhYmxlWzVdWzJdID0geworICAgIHsgICAwLCAgIDAgfSwKKyAgICB7ICA2MCwgICAwIH0sCisgICAgeyAxMTUsIC01MiB9LAorICAgIHsgIDk4LCAtNTUgfSwKKyAgICB7IDEyMiwgLTYwIH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgZWFfYWRwY21fdGFibGVbXSA9IHsKKyAgICAwLCAgMjQwLCAgNDYwLCAgMzkyLAorICAgIDAsICAgIDAsIC0yMDgsIC0yMjAsCisgICAgMCwgICAgMSwgICAgMywgICAgNCwKKyAgICA3LCAgICA4LCAgIDEwLCAgIDExLAorICAgIDAsICAgLTEsICAgLTMsICAgLTQKK307CisKKy8vIHBhZGRlZCB0byB6ZXJvIHdoZXJlIHRhYmxlIHNpemUgaXMgbGVzcyB0aGVuIDE2CitzdGF0aWMgY29uc3QgaW50IHN3Zl9pbmRleF90YWJsZXNbNF1bMTZdID0geworICAgIC8qMiovIHsgLTEsIDIgfSwKKyAgICAvKjMqLyB7IC0xLCAtMSwgMiwgNCB9LAorICAgIC8qNCovIHsgLTEsIC0xLCAtMSwgLTEsIDIsIDQsIDYsIDggfSwKKyAgICAvKjUqLyB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMSwgMiwgNCwgNiwgOCwgMTAsIDEzLCAxNiB9Cit9OworCisvKiBlbmQgb2YgdGFibGVzICovCisKK3R5cGVkZWYgc3RydWN0IEFEUENNRGVjb2RlQ29udGV4dCB7CisgICAgQURQQ01DaGFubmVsU3RhdHVzIHN0YXR1c1s2XTsKKyAgICBpbnQgdnFhX3ZlcnNpb247ICAgICAgICAgICAgICAgIC8qKjwgVlFBIHZlcnNpb24uIFVzZWQgZm9yIEFEUENNX0lNQV9XUyAqLworfSBBRFBDTURlY29kZUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBhZHBjbV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqIGF2Y3R4KQoreworICAgIEFEUENNRGVjb2RlQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdW5zaWduZWQgaW50IG1pbl9jaGFubmVscyA9IDE7CisgICAgdW5zaWduZWQgaW50IG1heF9jaGFubmVscyA9IDI7CisKKyAgICBzd2l0Y2goYXZjdHgtPmNvZGVjLT5pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRFRLOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRUE6CisgICAgICAgIG1pbl9jaGFubmVscyA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fQUZDOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRUFfUjE6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9SMjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0VBX1IzOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRUFfWEFTOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fVEhQOgorICAgICAgICBtYXhfY2hhbm5lbHMgPSA2OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA8IG1pbl9jaGFubmVscyB8fCBhdmN0eC0+Y2hhbm5lbHMgPiBtYXhfY2hhbm5lbHMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVsc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgc3dpdGNoKGF2Y3R4LT5jb2RlYy0+aWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0NUOgorICAgICAgICBjLT5zdGF0dXNbMF0uc3RlcCA9IGMtPnN0YXR1c1sxXS5zdGVwID0gNTExOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVY6CisgICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIDwgMiB8fCBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID4gNSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9BUEM6CisgICAgICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhICYmIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSA4KSB7CisgICAgICAgICAgICBjLT5zdGF0dXNbMF0ucHJlZGljdG9yID0gQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgIGMtPnN0YXR1c1sxXS5wcmVkaWN0b3IgPSBBVl9STDMyKGF2Y3R4LT5leHRyYWRhdGEgKyA0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9XUzoKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGEgJiYgYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDIpCisgICAgICAgICAgICBjLT52cWFfdmVyc2lvbiA9IEFWX1JMMTYoYXZjdHgtPmV4dHJhZGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaChhdmN0eC0+Y29kZWMtPmlkKSB7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1FUOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVY6CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fNFhNOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1hBOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0VBX1IxOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0VBX1IyOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0VBX1IzOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0VBX1hBUzoKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9USFA6CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fQUZDOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0RUSzoKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTZQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1dTOgorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBjLT52cWFfdmVyc2lvbiA9PSAzID8gQVZfU0FNUExFX0ZNVF9TMTZQIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzE2OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHNob3J0IGFkcGNtX2ltYV9leHBhbmRfbmliYmxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywgY2hhciBuaWJibGUsIGludCBzaGlmdCkKK3sKKyAgICBpbnQgc3RlcF9pbmRleDsKKyAgICBpbnQgcHJlZGljdG9yOworICAgIGludCBzaWduLCBkZWx0YSwgZGlmZiwgc3RlcDsKKworICAgIHN0ZXAgPSBmZl9hZHBjbV9zdGVwX3RhYmxlW2MtPnN0ZXBfaW5kZXhdOworICAgIHN0ZXBfaW5kZXggPSBjLT5zdGVwX2luZGV4ICsgZmZfYWRwY21faW5kZXhfdGFibGVbKHVuc2lnbmVkKW5pYmJsZV07CisgICAgc3RlcF9pbmRleCA9IGF2X2NsaXAoc3RlcF9pbmRleCwgMCwgODgpOworCisgICAgc2lnbiA9IG5pYmJsZSAmIDg7CisgICAgZGVsdGEgPSBuaWJibGUgJiA3OworICAgIC8qIHBlcmZvcm0gZGlyZWN0IG11bHRpcGxpY2F0aW9uIGluc3RlYWQgb2Ygc2VyaWVzIG9mIGp1bXBzIHByb3Bvc2VkIGJ5CisgICAgICogdGhlIHJlZmVyZW5jZSBBRFBDTSBpbXBsZW1lbnRhdGlvbiBzaW5jZSBtb2Rlcm4gQ1BVcyBjYW4gZG8gdGhlIG11bHRzCisgICAgICogcXVpY2tseSBlbm91Z2ggKi8KKyAgICBkaWZmID0gKCgyICogZGVsdGEgKyAxKSAqIHN0ZXApID4+IHNoaWZ0OworICAgIHByZWRpY3RvciA9IGMtPnByZWRpY3RvcjsKKyAgICBpZiAoc2lnbikgcHJlZGljdG9yIC09IGRpZmY7CisgICAgZWxzZSBwcmVkaWN0b3IgKz0gZGlmZjsKKworICAgIGMtPnByZWRpY3RvciA9IGF2X2NsaXBfaW50MTYocHJlZGljdG9yKTsKKyAgICBjLT5zdGVwX2luZGV4ID0gc3RlcF9pbmRleDsKKworICAgIHJldHVybiAoc2hvcnQpYy0+cHJlZGljdG9yOworfQorCitzdGF0aWMgaW5saW5lIGludDE2X3QgYWRwY21faW1hX3dhdl9leHBhbmRfbmliYmxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBicHMpCit7CisgICAgaW50IG5pYmJsZSwgc3RlcF9pbmRleCwgcHJlZGljdG9yLCBzaWduLCBkZWx0YSwgZGlmZiwgc3RlcCwgc2hpZnQ7CisKKyAgICBzaGlmdCA9IGJwcyAtIDE7CisgICAgbmliYmxlID0gZ2V0X2JpdHNfbGUoZ2IsIGJwcyksCisgICAgc3RlcCA9IGZmX2FkcGNtX3N0ZXBfdGFibGVbYy0+c3RlcF9pbmRleF07CisgICAgc3RlcF9pbmRleCA9IGMtPnN0ZXBfaW5kZXggKyBmZl9hZHBjbV9pbmRleF90YWJsZXNbYnBzIC0gMl1bbmliYmxlXTsKKyAgICBzdGVwX2luZGV4ID0gYXZfY2xpcChzdGVwX2luZGV4LCAwLCA4OCk7CisKKyAgICBzaWduID0gbmliYmxlICYgKDEgPDwgc2hpZnQpOworICAgIGRlbHRhID0gbmliYmxlICYgKCgxIDw8IHNoaWZ0KSAtIDEpOworICAgIGRpZmYgPSAoKDIgKiBkZWx0YSArIDEpICogc3RlcCkgPj4gc2hpZnQ7CisgICAgcHJlZGljdG9yID0gYy0+cHJlZGljdG9yOworICAgIGlmIChzaWduKSBwcmVkaWN0b3IgLT0gZGlmZjsKKyAgICBlbHNlIHByZWRpY3RvciArPSBkaWZmOworCisgICAgYy0+cHJlZGljdG9yID0gYXZfY2xpcF9pbnQxNihwcmVkaWN0b3IpOworICAgIGMtPnN0ZXBfaW5kZXggPSBzdGVwX2luZGV4OworCisgICAgcmV0dXJuIChpbnQxNl90KWMtPnByZWRpY3RvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRwY21faW1hX3F0X2V4cGFuZF9uaWJibGUoQURQQ01DaGFubmVsU3RhdHVzICpjLCBpbnQgbmliYmxlLCBpbnQgc2hpZnQpCit7CisgICAgaW50IHN0ZXBfaW5kZXg7CisgICAgaW50IHByZWRpY3RvcjsKKyAgICBpbnQgZGlmZiwgc3RlcDsKKworICAgIHN0ZXAgPSBmZl9hZHBjbV9zdGVwX3RhYmxlW2MtPnN0ZXBfaW5kZXhdOworICAgIHN0ZXBfaW5kZXggPSBjLT5zdGVwX2luZGV4ICsgZmZfYWRwY21faW5kZXhfdGFibGVbbmliYmxlXTsKKyAgICBzdGVwX2luZGV4ID0gYXZfY2xpcChzdGVwX2luZGV4LCAwLCA4OCk7CisKKyAgICBkaWZmID0gc3RlcCA+PiAzOworICAgIGlmIChuaWJibGUgJiA0KSBkaWZmICs9IHN0ZXA7CisgICAgaWYgKG5pYmJsZSAmIDIpIGRpZmYgKz0gc3RlcCA+PiAxOworICAgIGlmIChuaWJibGUgJiAxKSBkaWZmICs9IHN0ZXAgPj4gMjsKKworICAgIGlmIChuaWJibGUgJiA4KQorICAgICAgICBwcmVkaWN0b3IgPSBjLT5wcmVkaWN0b3IgLSBkaWZmOworICAgIGVsc2UKKyAgICAgICAgcHJlZGljdG9yID0gYy0+cHJlZGljdG9yICsgZGlmZjsKKworICAgIGMtPnByZWRpY3RvciA9IGF2X2NsaXBfaW50MTYocHJlZGljdG9yKTsKKyAgICBjLT5zdGVwX2luZGV4ID0gc3RlcF9pbmRleDsKKworICAgIHJldHVybiBjLT5wcmVkaWN0b3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2hvcnQgYWRwY21fbXNfZXhwYW5kX25pYmJsZShBRFBDTUNoYW5uZWxTdGF0dXMgKmMsIGludCBuaWJibGUpCit7CisgICAgaW50IHByZWRpY3RvcjsKKworICAgIHByZWRpY3RvciA9ICgoKGMtPnNhbXBsZTEpICogKGMtPmNvZWZmMSkpICsgKChjLT5zYW1wbGUyKSAqIChjLT5jb2VmZjIpKSkgLyA2NDsKKyAgICBwcmVkaWN0b3IgKz0gKChuaWJibGUgJiAweDA4KT8obmliYmxlIC0gMHgxMCk6KG5pYmJsZSkpICogYy0+aWRlbHRhOworCisgICAgYy0+c2FtcGxlMiA9IGMtPnNhbXBsZTE7CisgICAgYy0+c2FtcGxlMSA9IGF2X2NsaXBfaW50MTYocHJlZGljdG9yKTsKKyAgICBjLT5pZGVsdGEgPSAoZmZfYWRwY21fQWRhcHRhdGlvblRhYmxlWyhpbnQpbmliYmxlXSAqIGMtPmlkZWx0YSkgPj4gODsKKyAgICBpZiAoYy0+aWRlbHRhIDwgMTYpIGMtPmlkZWx0YSA9IDE2OworCisgICAgcmV0dXJuIGMtPnNhbXBsZTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2hvcnQgYWRwY21faW1hX29raV9leHBhbmRfbmliYmxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywgaW50IG5pYmJsZSkKK3sKKyAgICBpbnQgc3RlcF9pbmRleCwgcHJlZGljdG9yLCBzaWduLCBkZWx0YSwgZGlmZiwgc3RlcDsKKworICAgIHN0ZXAgPSBmZl9hZHBjbV9va2lfc3RlcF90YWJsZVtjLT5zdGVwX2luZGV4XTsKKyAgICBzdGVwX2luZGV4ID0gYy0+c3RlcF9pbmRleCArIGZmX2FkcGNtX2luZGV4X3RhYmxlWyh1bnNpZ25lZCluaWJibGVdOworICAgIHN0ZXBfaW5kZXggPSBhdl9jbGlwKHN0ZXBfaW5kZXgsIDAsIDQ4KTsKKworICAgIHNpZ24gPSBuaWJibGUgJiA4OworICAgIGRlbHRhID0gbmliYmxlICYgNzsKKyAgICBkaWZmID0gKCgyICogZGVsdGEgKyAxKSAqIHN0ZXApID4+IDM7CisgICAgcHJlZGljdG9yID0gYy0+cHJlZGljdG9yOworICAgIGlmIChzaWduKSBwcmVkaWN0b3IgLT0gZGlmZjsKKyAgICBlbHNlIHByZWRpY3RvciArPSBkaWZmOworCisgICAgYy0+cHJlZGljdG9yID0gYXZfY2xpcChwcmVkaWN0b3IsIC0yMDQ4LCAyMDQ3KTsKKyAgICBjLT5zdGVwX2luZGV4ID0gc3RlcF9pbmRleDsKKworICAgIHJldHVybiBjLT5wcmVkaWN0b3IgPDwgNDsKK30KKworc3RhdGljIGlubGluZSBzaG9ydCBhZHBjbV9jdF9leHBhbmRfbmliYmxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywgY2hhciBuaWJibGUpCit7CisgICAgaW50IHNpZ24sIGRlbHRhLCBkaWZmOworICAgIGludCBuZXdfc3RlcDsKKworICAgIHNpZ24gPSBuaWJibGUgJiA4OworICAgIGRlbHRhID0gbmliYmxlICYgNzsKKyAgICAvKiBwZXJmb3JtIGRpcmVjdCBtdWx0aXBsaWNhdGlvbiBpbnN0ZWFkIG9mIHNlcmllcyBvZiBqdW1wcyBwcm9wb3NlZCBieQorICAgICAqIHRoZSByZWZlcmVuY2UgQURQQ00gaW1wbGVtZW50YXRpb24gc2luY2UgbW9kZXJuIENQVXMgY2FuIGRvIHRoZSBtdWx0cworICAgICAqIHF1aWNrbHkgZW5vdWdoICovCisgICAgZGlmZiA9ICgoMiAqIGRlbHRhICsgMSkgKiBjLT5zdGVwKSA+PiAzOworICAgIC8qIHByZWRpY3RvciB1cGRhdGUgaXMgbm90IHNvIHRyaXZpYWw6IHByZWRpY3RvciBpcyBtdWx0aXBsaWVkIG9uIDI1NC8yNTYgYmVmb3JlIHVwZGF0aW5nICovCisgICAgYy0+cHJlZGljdG9yID0gKChjLT5wcmVkaWN0b3IgKiAyNTQpID4+IDgpICsgKHNpZ24gPyAtZGlmZiA6IGRpZmYpOworICAgIGMtPnByZWRpY3RvciA9IGF2X2NsaXBfaW50MTYoYy0+cHJlZGljdG9yKTsKKyAgICAvKiBjYWxjdWxhdGUgbmV3IHN0ZXAgYW5kIGNsYW1wIGl0IHRvIHJhbmdlIDUxMS4uMzI3NjcgKi8KKyAgICBuZXdfc3RlcCA9IChmZl9hZHBjbV9BZGFwdGF0aW9uVGFibGVbbmliYmxlICYgN10gKiBjLT5zdGVwKSA+PiA4OworICAgIGMtPnN0ZXAgPSBhdl9jbGlwKG5ld19zdGVwLCA1MTEsIDMyNzY3KTsKKworICAgIHJldHVybiAoc2hvcnQpYy0+cHJlZGljdG9yOworfQorCitzdGF0aWMgaW5saW5lIHNob3J0IGFkcGNtX3NicHJvX2V4cGFuZF9uaWJibGUoQURQQ01DaGFubmVsU3RhdHVzICpjLCBjaGFyIG5pYmJsZSwgaW50IHNpemUsIGludCBzaGlmdCkKK3sKKyAgICBpbnQgc2lnbiwgZGVsdGEsIGRpZmY7CisKKyAgICBzaWduID0gbmliYmxlICYgKDE8PChzaXplLTEpKTsKKyAgICBkZWx0YSA9IG5pYmJsZSAmICgoMTw8KHNpemUtMSkpLTEpOworICAgIGRpZmYgPSBkZWx0YSA8PCAoNyArIGMtPnN0ZXAgKyBzaGlmdCk7CisKKyAgICAvKiBjbGFtcCByZXN1bHQgKi8KKyAgICBjLT5wcmVkaWN0b3IgPSBhdl9jbGlwKGMtPnByZWRpY3RvciArIChzaWduID8gLWRpZmYgOiBkaWZmKSwgLTE2Mzg0LDE2MjU2KTsKKworICAgIC8qIGNhbGN1bGF0ZSBuZXcgc3RlcCAqLworICAgIGlmIChkZWx0YSA+PSAoMipzaXplIC0gMykgJiYgYy0+c3RlcCA8IDMpCisgICAgICAgIGMtPnN0ZXArKzsKKyAgICBlbHNlIGlmIChkZWx0YSA9PSAwICYmIGMtPnN0ZXAgPiAwKQorICAgICAgICBjLT5zdGVwLS07CisKKyAgICByZXR1cm4gKHNob3J0KSBjLT5wcmVkaWN0b3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2hvcnQgYWRwY21feWFtYWhhX2V4cGFuZF9uaWJibGUoQURQQ01DaGFubmVsU3RhdHVzICpjLCB1bnNpZ25lZCBjaGFyIG5pYmJsZSkKK3sKKyAgICBpZighYy0+c3RlcCkgeworICAgICAgICBjLT5wcmVkaWN0b3IgPSAwOworICAgICAgICBjLT5zdGVwID0gMTI3OworICAgIH0KKworICAgIGMtPnByZWRpY3RvciArPSAoYy0+c3RlcCAqIGZmX2FkcGNtX3lhbWFoYV9kaWZmbG9va3VwW25pYmJsZV0pIC8gODsKKyAgICBjLT5wcmVkaWN0b3IgPSBhdl9jbGlwX2ludDE2KGMtPnByZWRpY3Rvcik7CisgICAgYy0+c3RlcCA9IChjLT5zdGVwICogZmZfYWRwY21feWFtYWhhX2luZGV4c2NhbGVbbmliYmxlXSkgPj4gODsKKyAgICBjLT5zdGVwID0gYXZfY2xpcChjLT5zdGVwLCAxMjcsIDI0NTY3KTsKKyAgICByZXR1cm4gYy0+cHJlZGljdG9yOworfQorCitzdGF0aWMgaW50IHhhX2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludDE2X3QgKm91dDAsIGludDE2X3QgKm91dDEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgQURQQ01DaGFubmVsU3RhdHVzICpsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgQURQQ01DaGFubmVsU3RhdHVzICpyaWdodCwgaW50IGNoYW5uZWxzLCBpbnQgc2FtcGxlX29mZnNldCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2hpZnQsZmlsdGVyLGYwLGYxOworICAgIGludCBzXzEsc18yOworICAgIGludCBkLHMsdDsKKworICAgIG91dDAgKz0gc2FtcGxlX29mZnNldDsKKyAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgb3V0MSA9IG91dDAgKyAyODsKKyAgICBlbHNlCisgICAgICAgIG91dDEgKz0gc2FtcGxlX29mZnNldDsKKworICAgIGZvcihpPTA7aTw0O2krKykgeworICAgICAgICBzaGlmdCAgPSAxMiAtIChpbls0K2kqMl0gJiAxNSk7CisgICAgICAgIGZpbHRlciA9IGluWzQraSoyXSA+PiA0OworICAgICAgICBpZiAoZmlsdGVyID49IEZGX0FSUkFZX0VMRU1TKHhhX2FkcGNtX3RhYmxlKSkgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAidW5rbm93biBYQS1BRFBDTSBmaWx0ZXIgJWQiLCBmaWx0ZXIpOworICAgICAgICAgICAgZmlsdGVyPTA7CisgICAgICAgIH0KKyAgICAgICAgZjAgPSB4YV9hZHBjbV90YWJsZVtmaWx0ZXJdWzBdOworICAgICAgICBmMSA9IHhhX2FkcGNtX3RhYmxlW2ZpbHRlcl1bMV07CisKKyAgICAgICAgc18xID0gbGVmdC0+c2FtcGxlMTsKKyAgICAgICAgc18yID0gbGVmdC0+c2FtcGxlMjsKKworICAgICAgICBmb3Ioaj0wO2o8Mjg7aisrKSB7CisgICAgICAgICAgICBkID0gaW5bMTYraStqKjRdOworCisgICAgICAgICAgICB0ID0gc2lnbl9leHRlbmQoZCwgNCk7CisgICAgICAgICAgICBzID0gKCB0PDxzaGlmdCApICsgKChzXzEqZjAgKyBzXzIqZjErMzIpPj42KTsKKyAgICAgICAgICAgIHNfMiA9IHNfMTsKKyAgICAgICAgICAgIHNfMSA9IGF2X2NsaXBfaW50MTYocyk7CisgICAgICAgICAgICBvdXQwW2pdID0gc18xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgICAgIGxlZnQtPnNhbXBsZTEgPSBzXzE7CisgICAgICAgICAgICBsZWZ0LT5zYW1wbGUyID0gc18yOworICAgICAgICAgICAgc18xID0gcmlnaHQtPnNhbXBsZTE7CisgICAgICAgICAgICBzXzIgPSByaWdodC0+c2FtcGxlMjsKKyAgICAgICAgfQorCisgICAgICAgIHNoaWZ0ICA9IDEyIC0gKGluWzUraSoyXSAmIDE1KTsKKyAgICAgICAgZmlsdGVyID0gaW5bNStpKjJdID4+IDQ7CisgICAgICAgIGlmIChmaWx0ZXIgPj0gRkZfQVJSQVlfRUxFTVMoeGFfYWRwY21fdGFibGUpKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJ1bmtub3duIFhBLUFEUENNIGZpbHRlciAlZCIsIGZpbHRlcik7CisgICAgICAgICAgICBmaWx0ZXI9MDsKKyAgICAgICAgfQorCisgICAgICAgIGYwID0geGFfYWRwY21fdGFibGVbZmlsdGVyXVswXTsKKyAgICAgICAgZjEgPSB4YV9hZHBjbV90YWJsZVtmaWx0ZXJdWzFdOworCisgICAgICAgIGZvcihqPTA7ajwyODtqKyspIHsKKyAgICAgICAgICAgIGQgPSBpblsxNitpK2oqNF07CisKKyAgICAgICAgICAgIHQgPSBzaWduX2V4dGVuZChkID4+IDQsIDQpOworICAgICAgICAgICAgcyA9ICggdDw8c2hpZnQgKSArICgoc18xKmYwICsgc18yKmYxKzMyKT4+Nik7CisgICAgICAgICAgICBzXzIgPSBzXzE7CisgICAgICAgICAgICBzXzEgPSBhdl9jbGlwX2ludDE2KHMpOworICAgICAgICAgICAgb3V0MVtqXSA9IHNfMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGFubmVscyA9PSAyKSB7CisgICAgICAgICAgICByaWdodC0+c2FtcGxlMSA9IHNfMTsKKyAgICAgICAgICAgIHJpZ2h0LT5zYW1wbGUyID0gc18yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVmdC0+c2FtcGxlMSA9IHNfMTsKKyAgICAgICAgICAgIGxlZnQtPnNhbXBsZTIgPSBzXzI7CisgICAgICAgIH0KKworICAgICAgICBvdXQwICs9IDI4ICogKDMgLSBjaGFubmVscyk7CisgICAgICAgIG91dDEgKz0gMjggKiAoMyAtIGNoYW5uZWxzKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWRwY21fc3dmX2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQxNl90ICpzYW1wbGVzKQoreworICAgIEFEUENNRGVjb2RlQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBjb25zdCBpbnQgKnRhYmxlOworICAgIGludCBrMCwgc2lnbm1hc2ssIG5iX2JpdHMsIGNvdW50OworICAgIGludCBzaXplID0gYnVmX3NpemUqODsKKyAgICBpbnQgaTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIHNpemUpOworCisgICAgLy9yZWFkIGJpdHMgJiBpbml0aWFsIHZhbHVlcworICAgIG5iX2JpdHMgPSBnZXRfYml0cygmZ2IsIDIpKzI7CisgICAgdGFibGUgPSBzd2ZfaW5kZXhfdGFibGVzW25iX2JpdHMtMl07CisgICAgazAgPSAxIDw8IChuYl9iaXRzLTIpOworICAgIHNpZ25tYXNrID0gMSA8PCAobmJfYml0cy0xKTsKKworICAgIHdoaWxlIChnZXRfYml0c19jb3VudCgmZ2IpIDw9IHNpemUgLSAyMiphdmN0eC0+Y2hhbm5lbHMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICAqc2FtcGxlcysrID0gYy0+c3RhdHVzW2ldLnByZWRpY3RvciA9IGdldF9zYml0cygmZ2IsIDE2KTsKKyAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5zdGVwX2luZGV4ID0gZ2V0X2JpdHMoJmdiLCA2KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY291bnQgPSAwOyBnZXRfYml0c19jb3VudCgmZ2IpIDw9IHNpemUgLSBuYl9iaXRzKmF2Y3R4LT5jaGFubmVscyAmJiBjb3VudCA8IDQwOTU7IGNvdW50KyspIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBzaW1pbGFyIHRvIElNQSBhZHBjbQorICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IGdldF9iaXRzKCZnYiwgbmJfYml0cyk7CisgICAgICAgICAgICAgICAgaW50IHN0ZXAgPSBmZl9hZHBjbV9zdGVwX3RhYmxlW2MtPnN0YXR1c1tpXS5zdGVwX2luZGV4XTsKKyAgICAgICAgICAgICAgICBsb25nIHZwZGlmZiA9IDA7IC8vIHZwZGlmZiA9IChkZWx0YSswLjUpKnN0ZXAvNAorICAgICAgICAgICAgICAgIGludCBrID0gazA7CisKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSAmIGspCisgICAgICAgICAgICAgICAgICAgICAgICB2cGRpZmYgKz0gc3RlcDsKKyAgICAgICAgICAgICAgICAgICAgc3RlcCA+Pj0gMTsKKyAgICAgICAgICAgICAgICAgICAgayA+Pj0gMTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlKGspOworICAgICAgICAgICAgICAgIHZwZGlmZiArPSBzdGVwOworCisgICAgICAgICAgICAgICAgaWYgKGRlbHRhICYgc2lnbm1hc2spCisgICAgICAgICAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5wcmVkaWN0b3IgLT0gdnBkaWZmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYy0+c3RhdHVzW2ldLnByZWRpY3RvciArPSB2cGRpZmY7CisKKyAgICAgICAgICAgICAgICBjLT5zdGF0dXNbaV0uc3RlcF9pbmRleCArPSB0YWJsZVtkZWx0YSAmICh+c2lnbm1hc2spXTsKKworICAgICAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5zdGVwX2luZGV4ID0gYXZfY2xpcChjLT5zdGF0dXNbaV0uc3RlcF9pbmRleCwgMCwgODgpOworICAgICAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5wcmVkaWN0b3IgPSBhdl9jbGlwX2ludDE2KGMtPnN0YXR1c1tpXS5wcmVkaWN0b3IpOworCisgICAgICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGMtPnN0YXR1c1tpXS5wcmVkaWN0b3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IHdpbGwgYmUgZGVjb2RlZCBmcm9tIHRoZSBwYWNrZXQuCisgKiBJbiBvbmUgY2FzZSwgdGhpcyBpcyBhY3R1YWxseSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2FtcGxlcyBwb3NzaWJsZSB0bworICogZGVjb2RlIHdpdGggdGhlIGdpdmVuIGJ1Zl9zaXplLgorICoKKyAqIEBwYXJhbVtvdXRdIGNvZGVkX3NhbXBsZXMgc2V0IHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBhcyBjb2RlZCBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LCBvciAwIGlmIHRoZSBjb2RlYyBkb2VzIG5vdCBlbmNvZGUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBzYW1wbGVzIGluIGVhY2ggZnJhbWUuCisgKiBAcGFyYW1bb3V0XSBhcHByb3hfbmJfc2FtcGxlcyBzZXQgdG8gbm9uLXplcm8gaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBpcyBhbiBhcHByb3hpbWF0aW9uLgorICovCitzdGF0aWMgaW50IGdldF9uYl9zYW1wbGVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgR2V0Qnl0ZUNvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUsIGludCAqY29kZWRfc2FtcGxlcywgaW50ICphcHByb3hfbmJfc2FtcGxlcykKK3sKKyAgICBBRFBDTURlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBuYl9zYW1wbGVzICAgICAgICA9IDA7CisgICAgaW50IGNoICAgICAgICAgICAgICAgID0gYXZjdHgtPmNoYW5uZWxzOworICAgIGludCBoYXNfY29kZWRfc2FtcGxlcyA9IDA7CisgICAgaW50IGhlYWRlcl9zaXplOworCisgICAgKmNvZGVkX3NhbXBsZXMgPSAwOworICAgICphcHByb3hfbmJfc2FtcGxlcyA9IDA7CisKKyAgICBpZihjaCA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgeworICAgIC8qIGNvbnN0YW50LCBvbmx5IGNoZWNrIGJ1Zl9zaXplICovCisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9YQVM6CisgICAgICAgIGlmIChidWZfc2l6ZSA8IDc2ICogY2gpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmJfc2FtcGxlcyA9IDEyODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQ6CisgICAgICAgIGlmIChidWZfc2l6ZSA8IDM0ICogY2gpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmJfc2FtcGxlcyA9IDY0OworICAgICAgICBicmVhazsKKyAgICAvKiBzaW1wbGUgNC1iaXQgYWRwY20gKi8KKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0NUOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX0FQQzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9FQV9TRUFEOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX09LSToKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9XUzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1lBTUFIQToKKyAgICAgICAgbmJfc2FtcGxlcyA9IGJ1Zl9zaXplICogMiAvIGNoOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG5iX3NhbXBsZXMpCisgICAgICAgIHJldHVybiBuYl9zYW1wbGVzOworCisgICAgLyogc2ltcGxlIDQtYml0IGFkcGNtLCB3aXRoIGhlYWRlciAqLworICAgIGhlYWRlcl9zaXplID0gMDsKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlYy0+aWQpIHsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV80WE06CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX0lTUzogICAgIGhlYWRlcl9zaXplID0gNCAqIGNoOyAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9BTVY6ICAgICBoZWFkZXJfc2l6ZSA9IDg7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfU01KUEVHOiAgaGVhZGVyX3NpemUgPSA0ICogY2g7ICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChoZWFkZXJfc2l6ZSA+IDApCisgICAgICAgIHJldHVybiAoYnVmX3NpemUgLSBoZWFkZXJfc2l6ZSkgKiAyIC8gY2g7CisKKyAgICAvKiBtb3JlIGNvbXBsZXggZm9ybWF0cyAqLworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRUE6CisgICAgICAgIGhhc19jb2RlZF9zYW1wbGVzID0gMTsKKyAgICAgICAgKmNvZGVkX3NhbXBsZXMgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgICAgICAqY29kZWRfc2FtcGxlcyAtPSAqY29kZWRfc2FtcGxlcyAlIDI4OworICAgICAgICBuYl9zYW1wbGVzICAgICAgPSAoYnVmX3NpemUgLSAxMikgLyAzMCAqIDI4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9FQV9FQUNTOgorICAgICAgICBoYXNfY29kZWRfc2FtcGxlcyA9IDE7CisgICAgICAgICpjb2RlZF9zYW1wbGVzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgICAgICBuYl9zYW1wbGVzICAgICA9IChidWZfc2l6ZSAtICg0ICsgOCAqIGNoKSkgKiAyIC8gY2g7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRUFfTUFYSVNfWEE6CisgICAgICAgIG5iX3NhbXBsZXMgPSAoYnVmX3NpemUgLSBjaCkgLyBjaCAqIDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRUFfUjE6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9SMjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0VBX1IzOgorICAgICAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgICAgIC8qIGhhcyBpbnRlcm5hbCBvZmZzZXRzIGFuZCBhIHBlci1mcmFtZSBzd2l0Y2ggdG8gc2lnbmFsIHJhdyAxNi1iaXQgKi8KKyAgICAgICAgaGFzX2NvZGVkX3NhbXBsZXMgPSAxOworICAgICAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlYy0+aWQpIHsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9SMToKKyAgICAgICAgICAgIGhlYWRlcl9zaXplICAgID0gNCArIDkgKiBjaDsKKyAgICAgICAgICAgICpjb2RlZF9zYW1wbGVzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRUFfUjI6CisgICAgICAgICAgICBoZWFkZXJfc2l6ZSAgICA9IDQgKyA1ICogY2g7CisgICAgICAgICAgICAqY29kZWRfc2FtcGxlcyA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0VBX1IzOgorICAgICAgICAgICAgaGVhZGVyX3NpemUgICAgPSA0ICsgNSAqIGNoOworICAgICAgICAgICAgKmNvZGVkX3NhbXBsZXMgPSBieXRlc3RyZWFtMl9nZXRfYmUzMihnYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqY29kZWRfc2FtcGxlcyAtPSAqY29kZWRfc2FtcGxlcyAlIDI4OworICAgICAgICBuYl9zYW1wbGVzICAgICAgPSAoYnVmX3NpemUgLSBoZWFkZXJfc2l6ZSkgKiAyIC8gY2g7CisgICAgICAgIG5iX3NhbXBsZXMgICAgIC09IG5iX3NhbXBsZXMgJSAyODsKKyAgICAgICAgKmFwcHJveF9uYl9zYW1wbGVzID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREszOgorICAgICAgICBpZiAoYXZjdHgtPmJsb2NrX2FsaWduID4gMCkKKyAgICAgICAgICAgIGJ1Zl9zaXplID0gRkZNSU4oYnVmX3NpemUsIGF2Y3R4LT5ibG9ja19hbGlnbik7CisgICAgICAgIG5iX3NhbXBsZXMgPSAoKGJ1Zl9zaXplIC0gMTYpICogMiAvIDMgKiA0KSAvIGNoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9ESzQ6CisgICAgICAgIGlmIChhdmN0eC0+YmxvY2tfYWxpZ24gPiAwKQorICAgICAgICAgICAgYnVmX3NpemUgPSBGRk1JTihidWZfc2l6ZSwgYXZjdHgtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgbmJfc2FtcGxlcyA9IDEgKyAoYnVmX3NpemUgLSA0ICogY2gpICogMiAvIGNoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9SQUQ6CisgICAgICAgIGlmIChhdmN0eC0+YmxvY2tfYWxpZ24gPiAwKQorICAgICAgICAgICAgYnVmX3NpemUgPSBGRk1JTihidWZfc2l6ZSwgYXZjdHgtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgbmJfc2FtcGxlcyA9IChidWZfc2l6ZSAtIDQgKiBjaCkgKiAyIC8gY2g7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVjoKKyAgICB7CisgICAgICAgIGludCBic2l6ZSA9IGZmX2FkcGNtX2ltYV9ibG9ja19zaXplc1thdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC0gMl07CisgICAgICAgIGludCBic2FtcGxlcyA9IGZmX2FkcGNtX2ltYV9ibG9ja19zYW1wbGVzW2F2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgLSAyXTsKKyAgICAgICAgaWYgKGF2Y3R4LT5ibG9ja19hbGlnbiA+IDApCisgICAgICAgICAgICBidWZfc2l6ZSA9IEZGTUlOKGJ1Zl9zaXplLCBhdmN0eC0+YmxvY2tfYWxpZ24pOworICAgICAgICBuYl9zYW1wbGVzID0gMSArIChidWZfc2l6ZSAtIDQgKiBjaCkgLyAoYnNpemUgKiBjaCkgKiBic2FtcGxlczsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fTVM6CisgICAgICAgIGlmIChhdmN0eC0+YmxvY2tfYWxpZ24gPiAwKQorICAgICAgICAgICAgYnVmX3NpemUgPSBGRk1JTihidWZfc2l6ZSwgYXZjdHgtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgbmJfc2FtcGxlcyA9IDIgKyAoYnVmX3NpemUgLSA3ICogY2gpICogMiAvIGNoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1NCUFJPXzI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9TQlBST18zOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fU0JQUk9fNDoKKyAgICB7CisgICAgICAgIGludCBzYW1wbGVzX3Blcl9ieXRlOworICAgICAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlYy0+aWQpIHsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9TQlBST18yOiBzYW1wbGVzX3Blcl9ieXRlID0gNDsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fU0JQUk9fMzogc2FtcGxlc19wZXJfYnl0ZSA9IDM7IGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1NCUFJPXzQ6IHNhbXBsZXNfcGVyX2J5dGUgPSAyOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXMtPnN0YXR1c1swXS5zdGVwX2luZGV4KSB7CisgICAgICAgICAgICBuYl9zYW1wbGVzKys7CisgICAgICAgICAgICBidWZfc2l6ZSAtPSBjaDsKKyAgICAgICAgfQorICAgICAgICBuYl9zYW1wbGVzICs9IGJ1Zl9zaXplICogc2FtcGxlc19wZXJfYnl0ZSAvIGNoOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9TV0Y6CisgICAgeworICAgICAgICBpbnQgYnVmX2JpdHMgICAgICAgPSBidWZfc2l6ZSAqIDggLSAyOworICAgICAgICBpbnQgbmJpdHMgICAgICAgICAgPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpID4+IDYpICsgMjsKKyAgICAgICAgaW50IGJsb2NrX2hkcl9zaXplID0gMjIgKiBjaDsKKyAgICAgICAgaW50IGJsb2NrX3NpemUgICAgID0gYmxvY2tfaGRyX3NpemUgKyBuYml0cyAqIGNoICogNDA5NTsKKyAgICAgICAgaW50IG5ibG9ja3MgICAgICAgID0gYnVmX2JpdHMgLyBibG9ja19zaXplOworICAgICAgICBpbnQgYml0c19sZWZ0ICAgICAgPSBidWZfYml0cyAtIG5ibG9ja3MgKiBibG9ja19zaXplOworICAgICAgICBuYl9zYW1wbGVzICAgICAgICAgPSBuYmxvY2tzICogNDA5NjsKKyAgICAgICAgaWYgKGJpdHNfbGVmdCA+PSBibG9ja19oZHJfc2l6ZSkKKyAgICAgICAgICAgIG5iX3NhbXBsZXMgKz0gMSArIChiaXRzX2xlZnQgLSBibG9ja19oZHJfc2l6ZSkgLyAobmJpdHMgKiBjaCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1RIUDoKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgIG5iX3NhbXBsZXMgPSBidWZfc2l6ZSAvICg4ICogY2gpICogMTQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBoYXNfY29kZWRfc2FtcGxlcyA9IDE7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIDQpOyAvLyBjaGFubmVsIHNpemUKKyAgICAgICAgKmNvZGVkX3NhbXBsZXMgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoZ2IpOworICAgICAgICAqY29kZWRfc2FtcGxlcyAtPSAqY29kZWRfc2FtcGxlcyAlIDE0OworICAgICAgICBuYl9zYW1wbGVzICAgICAgPSAoYnVmX3NpemUgLSAoOCArIDM2ICogY2gpKSAvICg4ICogY2gpICogMTQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fQUZDOgorICAgICAgICBuYl9zYW1wbGVzID0gYnVmX3NpemUgLyAoOSAqIGNoKSAqIDE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1hBOgorICAgICAgICBuYl9zYW1wbGVzID0gKGJ1Zl9zaXplIC8gMTI4KSAqIDIyNCAvIGNoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0RUSzoKKyAgICAgICAgbmJfc2FtcGxlcyA9IGJ1Zl9zaXplIC8gKDE2ICogY2gpICogMjg7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIHZhbGlkYXRlIGNvZGVkIHNhbXBsZSBjb3VudCAqLworICAgIGlmIChoYXNfY29kZWRfc2FtcGxlcyAmJiAoKmNvZGVkX3NhbXBsZXMgPD0gMCB8fCAqY29kZWRfc2FtcGxlcyA+IG5iX3NhbXBsZXMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHJldHVybiBuYl9zYW1wbGVzOworfQorCitzdGF0aWMgaW50IGFkcGNtX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIEFEUENNRGVjb2RlQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQURQQ01DaGFubmVsU3RhdHVzICpjczsKKyAgICBpbnQgbiwgbSwgY2hhbm5lbCwgaTsKKyAgICBzaG9ydCAqc2FtcGxlczsKKyAgICBpbnQxNl90ICoqc2FtcGxlc19wOworICAgIGludCBzdDsgLyogc3RlcmVvICovCisgICAgaW50IGNvdW50MSwgY291bnQyOworICAgIGludCBuYl9zYW1wbGVzLCBjb2RlZF9zYW1wbGVzLCBhcHByb3hfbmJfc2FtcGxlcywgcmV0OworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGJ1ZiwgYnVmX3NpemUpOworICAgIG5iX3NhbXBsZXMgPSBnZXRfbmJfc2FtcGxlcyhhdmN0eCwgJmdiLCBidWZfc2l6ZSwgJmNvZGVkX3NhbXBsZXMsICZhcHByb3hfbmJfc2FtcGxlcyk7CisgICAgaWYgKG5iX3NhbXBsZXMgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbnVtYmVyIG9mIHNhbXBsZXMgaW4gcGFja2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IG5iX3NhbXBsZXM7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzYW1wbGVzID0gKHNob3J0ICopZnJhbWUtPmRhdGFbMF07CisgICAgc2FtcGxlc19wID0gKGludDE2X3QgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGE7CisKKyAgICAvKiB1c2UgY29kZWRfc2FtcGxlcyB3aGVuIGFwcGxpY2FibGUgKi8KKyAgICAvKiBpdCBpcyBhbHdheXMgPD0gbmJfc2FtcGxlcywgc28gdGhlIG91dHB1dCBidWZmZXIgd2lsbCBiZSBsYXJnZSBlbm91Z2ggKi8KKyAgICBpZiAoY29kZWRfc2FtcGxlcykgeworICAgICAgICBpZiAoIWFwcHJveF9uYl9zYW1wbGVzICYmIGNvZGVkX3NhbXBsZXMgIT0gbmJfc2FtcGxlcykKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJtaXNtYXRjaCBpbiBjb2RlZCBzYW1wbGUgY291bnRcbiIpOworICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IG5iX3NhbXBsZXMgPSBjb2RlZF9zYW1wbGVzOworICAgIH0KKworICAgIHN0ID0gYXZjdHgtPmNoYW5uZWxzID09IDIgPyAxIDogMDsKKworICAgIHN3aXRjaChhdmN0eC0+Y29kZWMtPmlkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQ6CisgICAgICAgIC8qIEluIFF1aWNrVGltZSwgSU1BIGlzIGVuY29kZWQgYnkgY2h1bmtzIG9mIDM0IGJ5dGVzICg9NjQgc2FtcGxlcykuCisgICAgICAgICAgIENoYW5uZWwgZGF0YSBpcyBpbnRlcmxlYXZlZCBwZXItY2h1bmsuICovCisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBhdmN0eC0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgaW50IHByZWRpY3RvcjsKKyAgICAgICAgICAgIGludCBzdGVwX2luZGV4OworICAgICAgICAgICAgY3MgPSAmKGMtPnN0YXR1c1tjaGFubmVsXSk7CisgICAgICAgICAgICAvKiAocHBwcHBwKSAocGlpaWlpaWkpICovCisKKyAgICAgICAgICAgIC8qIEJpdHMgMTUtNyBhcmUgdGhlIF90b3BfIDkgYml0cyBvZiB0aGUgMTYtYml0IGluaXRpYWwgcHJlZGljdG9yIHZhbHVlICovCisgICAgICAgICAgICBwcmVkaWN0b3IgPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfYmUxNnUoJmdiKSwgMTYpOworICAgICAgICAgICAgc3RlcF9pbmRleCA9IHByZWRpY3RvciAmIDB4N0Y7CisgICAgICAgICAgICBwcmVkaWN0b3IgJj0gfjB4N0Y7CisKKyAgICAgICAgICAgIGlmIChjcy0+c3RlcF9pbmRleCA9PSBzdGVwX2luZGV4KSB7CisgICAgICAgICAgICAgICAgaW50IGRpZmYgPSBwcmVkaWN0b3IgLSBjcy0+cHJlZGljdG9yOworICAgICAgICAgICAgICAgIGlmIChkaWZmIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZGlmZiA9IC0gZGlmZjsKKyAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDB4N2YpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gdXBkYXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVwZGF0ZToKKyAgICAgICAgICAgICAgICBjcy0+c3RlcF9pbmRleCA9IHN0ZXBfaW5kZXg7CisgICAgICAgICAgICAgICAgY3MtPnByZWRpY3RvciA9IHByZWRpY3RvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNzLT5zdGVwX2luZGV4ID4gODh1KXsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVSUk9SOiBzdGVwX2luZGV4WyVkXSA9ICVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLCBjcy0+c3RlcF9pbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNhbXBsZXMgPSBzYW1wbGVzX3BbY2hhbm5lbF07CisKKyAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCA2NDsgbSArPSAyKSB7CisgICAgICAgICAgICAgICAgaW50IGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW20gICAgXSA9IGFkcGNtX2ltYV9xdF9leHBhbmRfbmliYmxlKGNzLCBieXRlICYgMHgwRiwgMyk7CisgICAgICAgICAgICAgICAgc2FtcGxlc1ttICsgMV0gPSBhZHBjbV9pbWFfcXRfZXhwYW5kX25pYmJsZShjcywgYnl0ZSA+PiA0ICAsIDMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVjoKKyAgICAgICAgZm9yKGk9MDsgaTxhdmN0eC0+Y2hhbm5lbHM7IGkrKyl7CisgICAgICAgICAgICBjcyA9ICYoYy0+c3RhdHVzW2ldKTsKKyAgICAgICAgICAgIGNzLT5wcmVkaWN0b3IgPSBzYW1wbGVzX3BbaV1bMF0gPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmdiKSwgMTYpOworCisgICAgICAgICAgICBjcy0+c3RlcF9pbmRleCA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgICAgICBpZiAoY3MtPnN0ZXBfaW5kZXggPiA4OHUpeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRVJST1I6IHN0ZXBfaW5kZXhbJWRdID0gJWlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGksIGNzLT5zdGVwX2luZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlICE9IDQpIHsKKyAgICAgICAgICAgIGludCBzYW1wbGVzX3Blcl9ibG9jayA9IGZmX2FkcGNtX2ltYV9ibG9ja19zYW1wbGVzW2F2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgLSAyXTsKKyAgICAgICAgICAgIEdldEJpdENvbnRleHQgZzsKKworICAgICAgICAgICAgaW5pdF9nZXRfYml0czgoJmcsIGdiLmJ1ZmZlciwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSk7CisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKG5iX3NhbXBsZXMgLSAxKSAvIHNhbXBsZXNfcGVyX2Jsb2NrOyBuKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY3MgPSAmYy0+c3RhdHVzW2ldOworICAgICAgICAgICAgICAgICAgICBzYW1wbGVzID0gJnNhbXBsZXNfcFtpXVsxICsgbiAqIHNhbXBsZXNfcGVyX2Jsb2NrXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IHNhbXBsZXNfcGVyX2Jsb2NrOyBtKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbbV0gPSBhZHBjbV9pbWFfd2F2X2V4cGFuZF9uaWJibGUoY3MsICZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgYXZjdHgtPmJsb2NrX2FsaWduIC0gYXZjdHgtPmNoYW5uZWxzICogNCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAobmJfc2FtcGxlcyAtIDEpIC8gODsgbisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjcyA9ICZjLT5zdGF0dXNbaV07CisgICAgICAgICAgICAgICAgc2FtcGxlcyA9ICZzYW1wbGVzX3BbaV1bMSArIG4gKiA4XTsKKyAgICAgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgODsgbSArPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbbSAgICBdID0gYWRwY21faW1hX2V4cGFuZF9uaWJibGUoY3MsIHYgJiAweDBGLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1ttICsgMV0gPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZShjcywgdiA+PiA0ICAsIDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fNFhNOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspCisgICAgICAgICAgICBjLT5zdGF0dXNbaV0ucHJlZGljdG9yID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYiksIDE2KTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5zdGVwX2luZGV4ID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYiksIDE2KTsKKyAgICAgICAgICAgIGlmIChjLT5zdGF0dXNbaV0uc3RlcF9pbmRleCA+IDg4dSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRVJST1I6IHN0ZXBfaW5kZXhbJWRdID0gJWlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGksIGMtPnN0YXR1c1tpXS5zdGVwX2luZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgc2FtcGxlcyA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbaV07CisgICAgICAgICAgICBjcyA9ICZjLT5zdGF0dXNbaV07CisgICAgICAgICAgICBmb3IgKG4gPSBuYl9zYW1wbGVzID4+IDE7IG4gPiAwOyBuLS0pIHsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZShjcywgdiAmIDB4MEYsIDQpOworICAgICAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZShjcywgdiA+PiA0ICAsIDQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fTVM6CisgICAgeworICAgICAgICBpbnQgYmxvY2tfcHJlZGljdG9yOworCisgICAgICAgIGJsb2NrX3ByZWRpY3RvciA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICBpZiAoYmxvY2tfcHJlZGljdG9yID4gNikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFUlJPUjogYmxvY2tfcHJlZGljdG9yWzBdID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgYmxvY2tfcHJlZGljdG9yKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGMtPnN0YXR1c1swXS5jb2VmZjEgPSBmZl9hZHBjbV9BZGFwdENvZWZmMVtibG9ja19wcmVkaWN0b3JdOworICAgICAgICBjLT5zdGF0dXNbMF0uY29lZmYyID0gZmZfYWRwY21fQWRhcHRDb2VmZjJbYmxvY2tfcHJlZGljdG9yXTsKKyAgICAgICAgaWYgKHN0KSB7CisgICAgICAgICAgICBibG9ja19wcmVkaWN0b3IgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgIGlmIChibG9ja19wcmVkaWN0b3IgPiA2KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFUlJPUjogYmxvY2tfcHJlZGljdG9yWzFdID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3ByZWRpY3Rvcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLT5zdGF0dXNbMV0uY29lZmYxID0gZmZfYWRwY21fQWRhcHRDb2VmZjFbYmxvY2tfcHJlZGljdG9yXTsKKyAgICAgICAgICAgIGMtPnN0YXR1c1sxXS5jb2VmZjIgPSBmZl9hZHBjbV9BZGFwdENvZWZmMltibG9ja19wcmVkaWN0b3JdOworICAgICAgICB9CisgICAgICAgIGMtPnN0YXR1c1swXS5pZGVsdGEgPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmdiKSwgMTYpOworICAgICAgICBpZiAoc3QpeworICAgICAgICAgICAgYy0+c3RhdHVzWzFdLmlkZWx0YSA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgIH0KKworICAgICAgICBjLT5zdGF0dXNbMF0uc2FtcGxlMSA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgIGlmIChzdCkgYy0+c3RhdHVzWzFdLnNhbXBsZTEgPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmdiKSwgMTYpOworICAgICAgICBjLT5zdGF0dXNbMF0uc2FtcGxlMiA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgIGlmIChzdCkgYy0+c3RhdHVzWzFdLnNhbXBsZTIgPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmdiKSwgMTYpOworCisgICAgICAgICpzYW1wbGVzKysgPSBjLT5zdGF0dXNbMF0uc2FtcGxlMjsKKyAgICAgICAgaWYgKHN0KSAqc2FtcGxlcysrID0gYy0+c3RhdHVzWzFdLnNhbXBsZTI7CisgICAgICAgICpzYW1wbGVzKysgPSBjLT5zdGF0dXNbMF0uc2FtcGxlMTsKKyAgICAgICAgaWYgKHN0KSAqc2FtcGxlcysrID0gYy0+c3RhdHVzWzFdLnNhbXBsZTE7CisgICAgICAgIGZvcihuID0gKG5iX3NhbXBsZXMgLSAyKSA+PiAoMSAtIHN0KTsgbiA+IDA7IG4tLSkgeworICAgICAgICAgICAgaW50IGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9tc19leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbMCBdLCBieXRlID4+IDQgICk7CisgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21fbXNfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzW3N0XSwgYnl0ZSAmIDB4MEYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9ESzQ6CisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBhdmN0eC0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgY3MgPSAmYy0+c3RhdHVzW2NoYW5uZWxdOworICAgICAgICAgICAgY3MtPnByZWRpY3RvciAgPSAqc2FtcGxlcysrID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYiksIDE2KTsKKyAgICAgICAgICAgIGNzLT5zdGVwX2luZGV4ID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYiksIDE2KTsKKyAgICAgICAgICAgIGlmIChjcy0+c3RlcF9pbmRleCA+IDg4dSl7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFUlJPUjogc3RlcF9pbmRleFslZF0gPSAlaVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwgY3MtPnN0ZXBfaW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAobiA9IChuYl9zYW1wbGVzIC0gMSkgPj4gKDEgLSBzdCk7IG4gPiAwOyBuLS0pIHsKKyAgICAgICAgICAgIGludCB2ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21faW1hX2V4cGFuZF9uaWJibGUoJmMtPnN0YXR1c1swIF0sIHYgPj4gNCAgLCAzKTsKKyAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzW3N0XSwgdiAmIDB4MEYsIDMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX0RLMzoKKyAgICB7CisgICAgICAgIGludCBsYXN0X2J5dGUgPSAwOworICAgICAgICBpbnQgbmliYmxlOworICAgICAgICBpbnQgZGVjb2RlX3RvcF9uaWJibGVfbmV4dCA9IDA7CisgICAgICAgIGludCBkaWZmX2NoYW5uZWw7CisgICAgICAgIGNvbnN0IGludDE2X3QgKnNhbXBsZXNfZW5kID0gc2FtcGxlcyArIGF2Y3R4LT5jaGFubmVscyAqIG5iX3NhbXBsZXM7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCAxMCk7CisgICAgICAgIGMtPnN0YXR1c1swXS5wcmVkaWN0b3IgID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYiksIDE2KTsKKyAgICAgICAgYy0+c3RhdHVzWzFdLnByZWRpY3RvciAgPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmdiKSwgMTYpOworICAgICAgICBjLT5zdGF0dXNbMF0uc3RlcF9pbmRleCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICBjLT5zdGF0dXNbMV0uc3RlcF9pbmRleCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICBpZiAoYy0+c3RhdHVzWzBdLnN0ZXBfaW5kZXggPiA4OHUgfHwgYy0+c3RhdHVzWzFdLnN0ZXBfaW5kZXggPiA4OHUpeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFUlJPUjogc3RlcF9pbmRleCA9ICVpLyVpXG4iLAorICAgICAgICAgICAgICAgICAgIGMtPnN0YXR1c1swXS5zdGVwX2luZGV4LCBjLT5zdGF0dXNbMV0uc3RlcF9pbmRleCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICAvKiBzaWduIGV4dGVuZCB0aGUgcHJlZGljdG9ycyAqLworICAgICAgICBkaWZmX2NoYW5uZWwgPSBjLT5zdGF0dXNbMV0ucHJlZGljdG9yOworCisgICAgICAgIC8qIERLMyBBRFBDTSBzdXBwb3J0IG1hY3JvICovCisjZGVmaW5lIERLM19HRVRfTkVYVF9OSUJCTEUoKSBcCisgICAgaWYgKGRlY29kZV90b3BfbmliYmxlX25leHQpIHsgXAorICAgICAgICBuaWJibGUgPSBsYXN0X2J5dGUgPj4gNDsgXAorICAgICAgICBkZWNvZGVfdG9wX25pYmJsZV9uZXh0ID0gMDsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgbGFzdF9ieXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7IFwKKyAgICAgICAgbmliYmxlID0gbGFzdF9ieXRlICYgMHgwRjsgXAorICAgICAgICBkZWNvZGVfdG9wX25pYmJsZV9uZXh0ID0gMTsgXAorICAgIH0KKworICAgICAgICB3aGlsZSAoc2FtcGxlcyA8IHNhbXBsZXNfZW5kKSB7CisKKyAgICAgICAgICAgIC8qIGZvciB0aGlzIGFsZ29yaXRobSwgYy0+c3RhdHVzWzBdIGlzIHRoZSBzdW0gY2hhbm5lbCBhbmQKKyAgICAgICAgICAgICAqIGMtPnN0YXR1c1sxXSBpcyB0aGUgZGlmZiBjaGFubmVsICovCisKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgdGhlIGZpcnN0IHByZWRpY3RvciBvZiB0aGUgc3VtIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIERLM19HRVRfTkVYVF9OSUJCTEUoKTsKKyAgICAgICAgICAgIGFkcGNtX2ltYV9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbMF0sIG5pYmJsZSwgMyk7CisKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgdGhlIGRpZmYgY2hhbm5lbCBwcmVkaWN0b3IgKi8KKyAgICAgICAgICAgIERLM19HRVRfTkVYVF9OSUJCTEUoKTsKKyAgICAgICAgICAgIGFkcGNtX2ltYV9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbMV0sIG5pYmJsZSwgMyk7CisKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgdGhlIGZpcnN0IHBhaXIgb2Ygc3RlcmVvIFBDTSBzYW1wbGVzICovCisgICAgICAgICAgICBkaWZmX2NoYW5uZWwgPSAoZGlmZl9jaGFubmVsICsgYy0+c3RhdHVzWzFdLnByZWRpY3RvcikgLyAyOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGMtPnN0YXR1c1swXS5wcmVkaWN0b3IgKyBjLT5zdGF0dXNbMV0ucHJlZGljdG9yOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGMtPnN0YXR1c1swXS5wcmVkaWN0b3IgLSBjLT5zdGF0dXNbMV0ucHJlZGljdG9yOworCisgICAgICAgICAgICAvKiBwcm9jZXNzIHRoZSBzZWNvbmQgcHJlZGljdG9yIG9mIHRoZSBzdW0gY2hhbm5lbCAqLworICAgICAgICAgICAgREszX0dFVF9ORVhUX05JQkJMRSgpOworICAgICAgICAgICAgYWRwY21faW1hX2V4cGFuZF9uaWJibGUoJmMtPnN0YXR1c1swXSwgbmliYmxlLCAzKTsKKworICAgICAgICAgICAgLyogcHJvY2VzcyB0aGUgc2Vjb25kIHBhaXIgb2Ygc3RlcmVvIFBDTSBzYW1wbGVzICovCisgICAgICAgICAgICBkaWZmX2NoYW5uZWwgPSAoZGlmZl9jaGFubmVsICsgYy0+c3RhdHVzWzFdLnByZWRpY3RvcikgLyAyOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGMtPnN0YXR1c1swXS5wcmVkaWN0b3IgKyBjLT5zdGF0dXNbMV0ucHJlZGljdG9yOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGMtPnN0YXR1c1swXS5wcmVkaWN0b3IgLSBjLT5zdGF0dXNbMV0ucHJlZGljdG9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChieXRlc3RyZWFtMl90ZWxsKCZnYikgJiAxKSkKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX0lTUzoKKyAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGF2Y3R4LT5jaGFubmVsczsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICBjcyA9ICZjLT5zdGF0dXNbY2hhbm5lbF07CisgICAgICAgICAgICBjcy0+cHJlZGljdG9yICA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgICAgICBjcy0+c3RlcF9pbmRleCA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgICAgICBpZiAoY3MtPnN0ZXBfaW5kZXggPiA4OHUpeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRVJST1I6IHN0ZXBfaW5kZXhbJWRdID0gJWlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsIGNzLT5zdGVwX2luZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAobiA9IG5iX3NhbXBsZXMgPj4gKDEgLSBzdCk7IG4gPiAwOyBuLS0pIHsKKyAgICAgICAgICAgIGludCB2MSwgdjI7CisgICAgICAgICAgICBpbnQgdiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgLyogbmliYmxlcyBhcmUgc3dhcHBlZCBmb3IgbW9ubyAqLworICAgICAgICAgICAgaWYgKHN0KSB7CisgICAgICAgICAgICAgICAgdjEgPSB2ID4+IDQ7CisgICAgICAgICAgICAgICAgdjIgPSB2ICYgMHgwRjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdjIgPSB2ID4+IDQ7CisgICAgICAgICAgICAgICAgdjEgPSB2ICYgMHgwRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzWzAgXSwgdjEsIDMpOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX2ltYV9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbc3RdLCB2MiwgMyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQVBDOgorICAgICAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA+IDApIHsKKyAgICAgICAgICAgIGludCB2ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21faW1hX2V4cGFuZF9uaWJibGUoJmMtPnN0YXR1c1swXSwgIHYgPj4gNCAgLCAzKTsKKyAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzW3N0XSwgdiAmIDB4MEYsIDMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX09LSToKKyAgICAgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPiAwKSB7CisgICAgICAgICAgICBpbnQgdiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX2ltYV9va2lfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzWzBdLCAgdiA+PiA0ICApOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX2ltYV9va2lfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzW3N0XSwgdiAmIDB4MEYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1JBRDoKKyAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGF2Y3R4LT5jaGFubmVsczsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICBjcyA9ICZjLT5zdGF0dXNbY2hhbm5lbF07CisgICAgICAgICAgICBjcy0+c3RlcF9pbmRleCA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgICAgICBjcy0+cHJlZGljdG9yICA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgICAgICBpZiAoY3MtPnN0ZXBfaW5kZXggPiA4OHUpeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRVJST1I6IHN0ZXBfaW5kZXhbJWRdID0gJWlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsIGNzLT5zdGVwX2luZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbmJfc2FtcGxlcyAvIDI7IG4rKykgeworICAgICAgICAgICAgaW50IGJ5dGVbMl07CisKKyAgICAgICAgICAgIGJ5dGVbMF0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgIGlmIChzdCkKKyAgICAgICAgICAgICAgICBieXRlWzFdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgICAgICBmb3IoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBhdmN0eC0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzW2NoYW5uZWxdLCBieXRlW2NoYW5uZWxdICYgMHgwRiwgMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBhdmN0eC0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzW2NoYW5uZWxdLCBieXRlW2NoYW5uZWxdID4+IDQgICwgMyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV1M6CisgICAgICAgIGlmIChjLT52cWFfdmVyc2lvbiA9PSAzKSB7CisgICAgICAgICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgYXZjdHgtPmNoYW5uZWxzOyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgICAgICBpbnQxNl90ICpzbXAgPSBzYW1wbGVzX3BbY2hhbm5lbF07CisKKyAgICAgICAgICAgICAgICBmb3IgKG4gPSBuYl9zYW1wbGVzIC8gMjsgbiA+IDA7IG4tLSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgICAgICAgICAqc21wKysgPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzW2NoYW5uZWxdLCB2ID4+IDQgICwgMyk7CisgICAgICAgICAgICAgICAgICAgICpzbXArKyA9IGFkcGNtX2ltYV9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbY2hhbm5lbF0sIHYgJiAweDBGLCAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKG4gPSBuYl9zYW1wbGVzIC8gMjsgbiA+IDA7IG4tLSkgeworICAgICAgICAgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBhdmN0eC0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgICAgICAgICAqc2FtcGxlcysrICA9IGFkcGNtX2ltYV9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbY2hhbm5lbF0sIHYgPj4gNCAgLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1tzdF0gPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzW2NoYW5uZWxdLCB2ICYgMHgwRiwgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNhbXBsZXMgKz0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmdiLCAwLCBTRUVLX0VORCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fWEE6CisgICAgeworICAgICAgICBpbnQxNl90ICpvdXQwID0gc2FtcGxlc19wWzBdOworICAgICAgICBpbnQxNl90ICpvdXQxID0gc2FtcGxlc19wWzFdOworICAgICAgICBpbnQgc2FtcGxlc19wZXJfYmxvY2sgPSAyOCAqICgzIC0gYXZjdHgtPmNoYW5uZWxzKSAqIDQ7CisgICAgICAgIGludCBzYW1wbGVfb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPj0gMTI4KSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IHhhX2RlY29kZShhdmN0eCwgb3V0MCwgb3V0MSwgYnVmICsgYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmMtPnN0YXR1c1swXSwgJmMtPnN0YXR1c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscywgc2FtcGxlX29mZnNldCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCAxMjgpOworICAgICAgICAgICAgc2FtcGxlX29mZnNldCArPSBzYW1wbGVzX3Blcl9ibG9jazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfRUFfRUFDUzoKKyAgICAgICAgZm9yIChpPTA7IGk8PXN0OyBpKyspIHsKKyAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5zdGVwX2luZGV4ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzJ1KCZnYik7CisgICAgICAgICAgICBpZiAoYy0+c3RhdHVzW2ldLnN0ZXBfaW5kZXggPiA4OHUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVSUk9SOiBzdGVwX2luZGV4WyVkXSA9ICVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBpLCBjLT5zdGF0dXNbaV0uc3RlcF9pbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpPTA7IGk8PXN0OyBpKyspCisgICAgICAgICAgICBjLT5zdGF0dXNbaV0ucHJlZGljdG9yICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMydSgmZ2IpOworCisgICAgICAgIGZvciAobiA9IG5iX3NhbXBsZXMgPj4gKDEgLSBzdCk7IG4gPiAwOyBuLS0pIHsKKyAgICAgICAgICAgIGludCBieXRlICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzWzBdLCAgYnl0ZSA+PiA0LCAgIDMpOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX2ltYV9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbc3RdLCBieXRlICYgMHgwRiwgMyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfRUFfU0VBRDoKKyAgICAgICAgZm9yIChuID0gbmJfc2FtcGxlcyA+PiAoMSAtIHN0KTsgbiA+IDA7IG4tLSkgeworICAgICAgICAgICAgaW50IGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzWzBdLCAgYnl0ZSA+PiA0LCAgIDYpOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX2ltYV9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbc3RdLCBieXRlICYgMHgwRiwgNik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9FQToKKyAgICB7CisgICAgICAgIGludCBwcmV2aW91c19sZWZ0X3NhbXBsZSwgcHJldmlvdXNfcmlnaHRfc2FtcGxlOworICAgICAgICBpbnQgY3VycmVudF9sZWZ0X3NhbXBsZSwgY3VycmVudF9yaWdodF9zYW1wbGU7CisgICAgICAgIGludCBuZXh0X2xlZnRfc2FtcGxlLCBuZXh0X3JpZ2h0X3NhbXBsZTsKKyAgICAgICAgaW50IGNvZWZmMWwsIGNvZWZmMmwsIGNvZWZmMXIsIGNvZWZmMnI7CisgICAgICAgIGludCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodDsKKworICAgICAgICAvKiBFYWNoIEVBIEFEUENNIGZyYW1lIGhhcyBhIDEyLWJ5dGUgaGVhZGVyIGZvbGxvd2VkIGJ5IDMwLWJ5dGUgcGllY2VzLAorICAgICAgICAgICBlYWNoIGNvZGluZyAyOCBzdGVyZW8gc2FtcGxlcy4gKi8KKworICAgICAgICBpZihhdmN0eC0+Y2hhbm5lbHMgIT0gMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGN1cnJlbnRfbGVmdF9zYW1wbGUgICA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgIHByZXZpb3VzX2xlZnRfc2FtcGxlICA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgIGN1cnJlbnRfcmlnaHRfc2FtcGxlICA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgIHByZXZpb3VzX3JpZ2h0X3NhbXBsZSA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisKKyAgICAgICAgZm9yIChjb3VudDEgPSAwOyBjb3VudDEgPCBuYl9zYW1wbGVzIC8gMjg7IGNvdW50MSsrKSB7CisgICAgICAgICAgICBpbnQgYnl0ZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgY29lZmYxbCA9IGVhX2FkcGNtX3RhYmxlWyBieXRlID4+IDQgICAgICAgXTsKKyAgICAgICAgICAgIGNvZWZmMmwgPSBlYV9hZHBjbV90YWJsZVsoYnl0ZSA+PiA0ICApICsgNF07CisgICAgICAgICAgICBjb2VmZjFyID0gZWFfYWRwY21fdGFibGVbIGJ5dGUgJiAweDBGXTsKKyAgICAgICAgICAgIGNvZWZmMnIgPSBlYV9hZHBjbV90YWJsZVsoYnl0ZSAmIDB4MEYpICsgNF07CisKKyAgICAgICAgICAgIGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgIHNoaWZ0X2xlZnQgID0gMjAgLSAoYnl0ZSA+PiA0KTsKKyAgICAgICAgICAgIHNoaWZ0X3JpZ2h0ID0gMjAgLSAoYnl0ZSAmIDB4MEYpOworCisgICAgICAgICAgICBmb3IgKGNvdW50MiA9IDA7IGNvdW50MiA8IDI4OyBjb3VudDIrKykgeworICAgICAgICAgICAgICAgIGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICBuZXh0X2xlZnRfc2FtcGxlICA9IHNpZ25fZXh0ZW5kKGJ5dGUgPj4gNCwgNCkgPDwgc2hpZnRfbGVmdDsKKyAgICAgICAgICAgICAgICBuZXh0X3JpZ2h0X3NhbXBsZSA9IHNpZ25fZXh0ZW5kKGJ5dGUsICAgICAgNCkgPDwgc2hpZnRfcmlnaHQ7CisKKyAgICAgICAgICAgICAgICBuZXh0X2xlZnRfc2FtcGxlID0gKG5leHRfbGVmdF9zYW1wbGUgKworICAgICAgICAgICAgICAgICAgICAoY3VycmVudF9sZWZ0X3NhbXBsZSAqIGNvZWZmMWwpICsKKyAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzX2xlZnRfc2FtcGxlICogY29lZmYybCkgKyAweDgwKSA+PiA4OworICAgICAgICAgICAgICAgIG5leHRfcmlnaHRfc2FtcGxlID0gKG5leHRfcmlnaHRfc2FtcGxlICsKKyAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfcmlnaHRfc2FtcGxlICogY29lZmYxcikgKworICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNfcmlnaHRfc2FtcGxlICogY29lZmYycikgKyAweDgwKSA+PiA4OworCisgICAgICAgICAgICAgICAgcHJldmlvdXNfbGVmdF9zYW1wbGUgPSBjdXJyZW50X2xlZnRfc2FtcGxlOworICAgICAgICAgICAgICAgIGN1cnJlbnRfbGVmdF9zYW1wbGUgPSBhdl9jbGlwX2ludDE2KG5leHRfbGVmdF9zYW1wbGUpOworICAgICAgICAgICAgICAgIHByZXZpb3VzX3JpZ2h0X3NhbXBsZSA9IGN1cnJlbnRfcmlnaHRfc2FtcGxlOworICAgICAgICAgICAgICAgIGN1cnJlbnRfcmlnaHRfc2FtcGxlID0gYXZfY2xpcF9pbnQxNihuZXh0X3JpZ2h0X3NhbXBsZSk7CisgICAgICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGN1cnJlbnRfbGVmdF9zYW1wbGU7CisgICAgICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGN1cnJlbnRfcmlnaHRfc2FtcGxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDIpOyAvLyBTa2lwIHRlcm1pbmF0aW5nIDB4MDAwMAorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0VBX01BWElTX1hBOgorICAgIHsKKyAgICAgICAgaW50IGNvZWZmWzJdWzJdLCBzaGlmdFsyXTsKKworICAgICAgICBmb3IoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBhdmN0eC0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgaW50IGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDI7IGkrKykKKyAgICAgICAgICAgICAgICBjb2VmZltjaGFubmVsXVtpXSA9IGVhX2FkcGNtX3RhYmxlWyhieXRlID4+IDQpICsgNCppXTsKKyAgICAgICAgICAgIHNoaWZ0W2NoYW5uZWxdID0gMjAgLSAoYnl0ZSAmIDB4MEYpOworICAgICAgICB9CisgICAgICAgIGZvciAoY291bnQxID0gMDsgY291bnQxIDwgbmJfc2FtcGxlcyAvIDI7IGNvdW50MSsrKSB7CisgICAgICAgICAgICBpbnQgYnl0ZVsyXTsKKworICAgICAgICAgICAgYnl0ZVswXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgaWYgKHN0KSBieXRlWzFdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgICAgICBmb3IoaSA9IDQ7IGkgPj0gMDsgaS09NCkgeyAvKiBQYWlyd2lzZSBzYW1wbGVzIExMIFJSIChzdCkgb3IgTEwgTEwgKG1vbm8pICovCisgICAgICAgICAgICAgICAgZm9yKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgYXZjdHgtPmNoYW5uZWxzOyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZSA9IHNpZ25fZXh0ZW5kKGJ5dGVbY2hhbm5lbF0gPj4gaSwgNCkgPDwgc2hpZnRbY2hhbm5lbF07CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZSA9IChzYW1wbGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zdGF0dXNbY2hhbm5lbF0uc2FtcGxlMSAqIGNvZWZmW2NoYW5uZWxdWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c3RhdHVzW2NoYW5uZWxdLnNhbXBsZTIgKiBjb2VmZltjaGFubmVsXVsxXSArIDB4ODApID4+IDg7CisgICAgICAgICAgICAgICAgICAgIGMtPnN0YXR1c1tjaGFubmVsXS5zYW1wbGUyID0gYy0+c3RhdHVzW2NoYW5uZWxdLnNhbXBsZTE7CisgICAgICAgICAgICAgICAgICAgIGMtPnN0YXR1c1tjaGFubmVsXS5zYW1wbGUxID0gYXZfY2xpcF9pbnQxNihzYW1wbGUpOworICAgICAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gYy0+c3RhdHVzW2NoYW5uZWxdLnNhbXBsZTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmdiLCAwLCBTRUVLX0VORCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0VBX1IxOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRUFfUjI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9SMzogeworICAgICAgICAvKiBjaGFubmVsIG51bWJlcmluZworICAgICAgICAgICAyY2hhbjogMD1mbCwgMT1mcgorICAgICAgICAgICA0Y2hhbjogMD1mbCwgMT1ybCwgMj1mciwgMz1ycgorICAgICAgICAgICA2Y2hhbjogMD1mbCwgMT1jLCAgMj1mciwgMz1ybCwgIDQ9cnIsIDU9c3ViICovCisgICAgICAgIGNvbnN0IGludCBiaWdfZW5kaWFuID0gYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9SMzsKKyAgICAgICAgaW50IHByZXZpb3VzX3NhbXBsZSwgY3VycmVudF9zYW1wbGUsIG5leHRfc2FtcGxlOworICAgICAgICBpbnQgY29lZmYxLCBjb2VmZjI7CisgICAgICAgIGludCBzaGlmdDsKKyAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWw7CisgICAgICAgIHVpbnQxNl90ICpzYW1wbGVzQzsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgaW50IG9mZnNldHNbNl07CisKKyAgICAgICAgZm9yIChjaGFubmVsPTA7IGNoYW5uZWw8YXZjdHgtPmNoYW5uZWxzOyBjaGFubmVsKyspCisgICAgICAgICAgICBvZmZzZXRzW2NoYW5uZWxdID0gKGJpZ19lbmRpYW4gPyBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPmNoYW5uZWxzICsgMSkgKiA0OworCisgICAgICAgIGZvciAoY2hhbm5lbD0wOyBjaGFubmVsPGF2Y3R4LT5jaGFubmVsczsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZnYiwgb2Zmc2V0c1tjaGFubmVsXSwgU0VFS19TRVQpOworICAgICAgICAgICAgc2FtcGxlc0MgPSBzYW1wbGVzX3BbY2hhbm5lbF07CisKKyAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX0FEUENNX0VBX1IxKSB7CisgICAgICAgICAgICAgICAgY3VycmVudF9zYW1wbGUgID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKSwgMTYpOworICAgICAgICAgICAgICAgIHByZXZpb3VzX3NhbXBsZSA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnYiksIDE2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3VycmVudF9zYW1wbGUgID0gYy0+c3RhdHVzW2NoYW5uZWxdLnByZWRpY3RvcjsKKyAgICAgICAgICAgICAgICBwcmV2aW91c19zYW1wbGUgPSBjLT5zdGF0dXNbY2hhbm5lbF0ucHJldl9zYW1wbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoY291bnQxID0gMDsgY291bnQxIDwgbmJfc2FtcGxlcyAvIDI4OyBjb3VudDErKykgeworICAgICAgICAgICAgICAgIGludCBieXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PSAweEVFKSB7ICAvKiBvbmx5IHNlZW4gaW4gUjIgYW5kIFIzICovCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfc2FtcGxlICA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYiksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfc2FtcGxlID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKSwgMTYpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoY291bnQyPTA7IGNvdW50MjwyODsgY291bnQyKyspCisgICAgICAgICAgICAgICAgICAgICAgICAqc2FtcGxlc0MrKyA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYiksIDE2KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb2VmZjEgPSBlYV9hZHBjbV90YWJsZVsgYnl0ZSA+PiA0ICAgICBdOworICAgICAgICAgICAgICAgICAgICBjb2VmZjIgPSBlYV9hZHBjbV90YWJsZVsoYnl0ZSA+PiA0KSArIDRdOworICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDIwIC0gKGJ5dGUgJiAweDBGKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvdW50Mj0wOyBjb3VudDI8Mjg7IGNvdW50MisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQyICYgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3NhbXBsZSA9IHNpZ25fZXh0ZW5kKGJ5dGUsICAgIDQpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9zYW1wbGUgPSBzaWduX2V4dGVuZChieXRlID4+IDQsIDQpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3NhbXBsZSArPSAoY3VycmVudF9zYW1wbGUgICogY29lZmYxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNfc2FtcGxlICogY29lZmYyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfc2FtcGxlID0gYXZfY2xpcF9pbnQxNihuZXh0X3NhbXBsZSA+PiA4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfc2FtcGxlID0gY3VycmVudF9zYW1wbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NhbXBsZSAgPSBuZXh0X3NhbXBsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpzYW1wbGVzQysrID0gY3VycmVudF9zYW1wbGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNvdW50KSB7CisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50ICE9IGNvdW50MSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJwZXItY2hhbm5lbCBzYW1wbGUgY291bnQgbWlzbWF0Y2hcbiIpOworICAgICAgICAgICAgICAgIGNvdW50ID0gRkZNQVgoY291bnQsIGNvdW50MSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPmlkICE9IEFWX0NPREVDX0lEX0FEUENNX0VBX1IxKSB7CisgICAgICAgICAgICAgICAgYy0+c3RhdHVzW2NoYW5uZWxdLnByZWRpY3RvciAgID0gY3VycmVudF9zYW1wbGU7CisgICAgICAgICAgICAgICAgYy0+c3RhdHVzW2NoYW5uZWxdLnByZXZfc2FtcGxlID0gcHJldmlvdXNfc2FtcGxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBjb3VudCAqIDI4OworICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZnYiwgMCwgU0VFS19FTkQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9YQVM6CisgICAgICAgIGZvciAoY2hhbm5lbD0wOyBjaGFubmVsPGF2Y3R4LT5jaGFubmVsczsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICBpbnQgY29lZmZbMl1bNF0sIHNoaWZ0WzRdOworICAgICAgICAgICAgaW50MTZfdCAqcyA9IHNhbXBsZXNfcFtjaGFubmVsXTsKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCA0OyBuKyssIHMgKz0gMzIpIHsKKyAgICAgICAgICAgICAgICBpbnQgdmFsID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYiksIDE2KTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGNvZWZmW2ldW25dID0gZWFfYWRwY21fdGFibGVbKHZhbCYweDBGKSs0KmldOworICAgICAgICAgICAgICAgIHNbMF0gPSB2YWwgJiB+MHgwRjsKKworICAgICAgICAgICAgICAgIHZhbCA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgICAgICAgICAgc2hpZnRbbl0gPSAyMCAtICh2YWwgJiAweDBGKTsKKyAgICAgICAgICAgICAgICBzWzFdID0gdmFsICYgfjB4MEY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAobT0yOyBtPDMyOyBtKz0yKSB7CisgICAgICAgICAgICAgICAgcyA9ICZzYW1wbGVzX3BbY2hhbm5lbF1bbV07CisgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IDQ7IG4rKywgcyArPSAzMikgeworICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsIHByZWQ7CisgICAgICAgICAgICAgICAgICAgIGludCBieXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBzaWduX2V4dGVuZChieXRlID4+IDQsIDQpIDw8IHNoaWZ0W25dOworICAgICAgICAgICAgICAgICAgICBwcmVkICA9IHNbLTFdICogY29lZmZbMF1bbl0gKyBzWy0yXSAqIGNvZWZmWzFdW25dOworICAgICAgICAgICAgICAgICAgICBzWzBdICA9IGF2X2NsaXBfaW50MTYoKGxldmVsICsgcHJlZCArIDB4ODApID4+IDgpOworCisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gc2lnbl9leHRlbmQoYnl0ZSwgNCkgPDwgc2hpZnRbbl07CisgICAgICAgICAgICAgICAgICAgIHByZWQgID0gc1swXSAqIGNvZWZmWzBdW25dICsgc1stMV0gKiBjb2VmZlsxXVtuXTsKKyAgICAgICAgICAgICAgICAgICAgc1sxXSAgPSBhdl9jbGlwX2ludDE2KChsZXZlbCArIHByZWQgKyAweDgwKSA+PiA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQU1WOgorICAgICAgICBjLT5zdGF0dXNbMF0ucHJlZGljdG9yID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYiksIDE2KTsKKyAgICAgICAgYy0+c3RhdHVzWzBdLnN0ZXBfaW5kZXggPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmdiKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCA0KTsKKyAgICAgICAgaWYgKGMtPnN0YXR1c1swXS5zdGVwX2luZGV4ID4gODh1KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVSUk9SOiBzdGVwX2luZGV4ID0gJWlcbiIsCisgICAgICAgICAgICAgICAgICAgYy0+c3RhdHVzWzBdLnN0ZXBfaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKG4gPSBuYl9zYW1wbGVzID4+ICgxIC0gc3QpOyBuID4gMDsgbi0tKSB7CisgICAgICAgICAgICBpbnQgdiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworCisgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21faW1hX2V4cGFuZF9uaWJibGUoJmMtPnN0YXR1c1swXSwgdiA+PiA0LCAzKTsKKyAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzWzBdLCB2ICYgMHhmLCAzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9TTUpQRUc6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgYy0+c3RhdHVzW2ldLnByZWRpY3RvciA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpLCAxNik7CisgICAgICAgICAgICBjLT5zdGF0dXNbaV0uc3RlcF9pbmRleCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCAxKTsKKyAgICAgICAgICAgIGlmIChjLT5zdGF0dXNbaV0uc3RlcF9pbmRleCA+IDg4dSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRVJST1I6IHN0ZXBfaW5kZXggPSAlaVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYy0+c3RhdHVzW2ldLnN0ZXBfaW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChuID0gbmJfc2FtcGxlcyA+PiAoMSAtIHN0KTsgbiA+IDA7IG4tLSkgeworICAgICAgICAgICAgaW50IHYgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX2ltYV9xdF9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbMCBdLCB2ID4+IDQsIDMpOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX2ltYV9xdF9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbc3RdLCB2ICYgMHhmLCAzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0NUOgorICAgICAgICBmb3IgKG4gPSBuYl9zYW1wbGVzID4+ICgxIC0gc3QpOyBuID4gMDsgbi0tKSB7CisgICAgICAgICAgICBpbnQgdiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX2N0X2V4cGFuZF9uaWJibGUoJmMtPnN0YXR1c1swIF0sIHYgPj4gNCAgKTsKKyAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9jdF9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbc3RdLCB2ICYgMHgwRik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9TQlBST180OgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fU0JQUk9fMzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1NCUFJPXzI6CisgICAgICAgIGlmICghYy0+c3RhdHVzWzBdLnN0ZXBfaW5kZXgpIHsKKyAgICAgICAgICAgIC8qIHRoZSBmaXJzdCBieXRlIGlzIGEgcmF3IHNhbXBsZSAqLworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IDEyOCAqIChieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKSAtIDB4ODApOworICAgICAgICAgICAgaWYgKHN0KQorICAgICAgICAgICAgICAgICpzYW1wbGVzKysgPSAxMjggKiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYikgLSAweDgwKTsKKyAgICAgICAgICAgIGMtPnN0YXR1c1swXS5zdGVwX2luZGV4ID0gMTsKKyAgICAgICAgICAgIG5iX3NhbXBsZXMtLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9TQlBST180KSB7CisgICAgICAgICAgICBmb3IgKG4gPSBuYl9zYW1wbGVzID4+ICgxIC0gc3QpOyBuID4gMDsgbi0tKSB7CisgICAgICAgICAgICAgICAgaW50IGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21fc2Jwcm9fZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgPj4gNCwgICA0LCAwKTsKKyAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21fc2Jwcm9fZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzW3N0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlICYgMHgwRiwgNCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9TQlBST18zKSB7CisgICAgICAgICAgICBmb3IgKG4gPSAobmJfc2FtcGxlczw8c3QpIC8gMzsgbiA+IDA7IG4tLSkgeworICAgICAgICAgICAgICAgIGludCBieXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX3NicHJvX2V4cGFuZF9uaWJibGUoJmMtPnN0YXR1c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSA+PiA1ICAgICAgICAsIDMsIDApOworICAgICAgICAgICAgICAgICpzYW1wbGVzKysgPSBhZHBjbV9zYnByb19leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUgPj4gMikgJiAweDA3LCAzLCAwKTsKKyAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21fc2Jwcm9fZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlICYgMHgwMywgICAgICAgMiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKG4gPSBuYl9zYW1wbGVzID4+ICgyIC0gc3QpOyBuID4gMDsgbi0tKSB7CisgICAgICAgICAgICAgICAgaW50IGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21fc2Jwcm9fZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlID4+IDYgICAgICAgICwgMiwgMik7CisgICAgICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX3NicHJvX2V4cGFuZF9uaWJibGUoJmMtPnN0YXR1c1tzdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUgPj4gNCkgJiAweDAzLCAyLCAyKTsKKyAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21fc2Jwcm9fZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlID4+IDIpICYgMHgwMywgMiwgMik7CisgICAgICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX3NicHJvX2V4cGFuZF9uaWJibGUoJmMtPnN0YXR1c1tzdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgJiAweDAzLCAgICAgICAyLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1NXRjoKKyAgICAgICAgYWRwY21fc3dmX2RlY29kZShhdmN0eCwgYnVmLCBidWZfc2l6ZSwgc2FtcGxlcyk7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmdiLCAwLCBTRUVLX0VORCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fWUFNQUhBOgorICAgICAgICBmb3IgKG4gPSBuYl9zYW1wbGVzID4+ICgxIC0gc3QpOyBuID4gMDsgbi0tKSB7CisgICAgICAgICAgICBpbnQgdiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGFkcGNtX3lhbWFoYV9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbMCBdLCB2ICYgMHgwRik7CisgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21feWFtYWhhX2V4cGFuZF9uaWJibGUoJmMtPnN0YXR1c1tzdF0sIHYgPj4gNCAgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0FGQzoKKyAgICB7CisgICAgICAgIGludCBzYW1wbGVzX3Blcl9ibG9jazsKKyAgICAgICAgaW50IGJsb2NrczsKKworICAgICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YSAmJiBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPT0gMSAmJiBhdmN0eC0+ZXh0cmFkYXRhWzBdKSB7CisgICAgICAgICAgICBzYW1wbGVzX3Blcl9ibG9jayA9IGF2Y3R4LT5leHRyYWRhdGFbMF0gLyAxNjsKKyAgICAgICAgICAgIGJsb2NrcyA9IG5iX3NhbXBsZXMgLyBhdmN0eC0+ZXh0cmFkYXRhWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2FtcGxlc19wZXJfYmxvY2sgPSBuYl9zYW1wbGVzIC8gMTY7CisgICAgICAgICAgICBibG9ja3MgPSAxOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChtID0gMDsgbSA8IGJsb2NrczsgbSsrKSB7CisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBhdmN0eC0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgaW50IHByZXYxID0gYy0+c3RhdHVzW2NoYW5uZWxdLnNhbXBsZTE7CisgICAgICAgICAgICBpbnQgcHJldjIgPSBjLT5zdGF0dXNbY2hhbm5lbF0uc2FtcGxlMjsKKworICAgICAgICAgICAgc2FtcGxlcyA9IHNhbXBsZXNfcFtjaGFubmVsXSArIG0gKiAxNjsKKyAgICAgICAgICAgIC8qIFJlYWQgaW4gZXZlcnkgc2FtcGxlIGZvciB0aGlzIGNoYW5uZWwuICAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXNfcGVyX2Jsb2NrOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYnl0ZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgICAgIGludCBzY2FsZSA9IDEgPDwgKGJ5dGUgPj4gNCk7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gYnl0ZSAmIDB4ZjsKKyAgICAgICAgICAgICAgICBpbnQgZmFjdG9yMSA9IGZmX2FkcGNtX2FmY19jb2VmZnNbMF1baW5kZXhdOworICAgICAgICAgICAgICAgIGludCBmYWN0b3IyID0gZmZfYWRwY21fYWZjX2NvZWZmc1sxXVtpbmRleF07CisKKyAgICAgICAgICAgICAgICAvKiBEZWNvZGUgMTYgc2FtcGxlcy4gICovCisgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IDE2OyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVkYXQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVkYXQgPSBzaWduX2V4dGVuZChieXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZWRhdCA9IHNpZ25fZXh0ZW5kKGJ5dGUgPj4gNCwgNCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzYW1wbGVkYXQgPSAoKHByZXYxICogZmFjdG9yMSArIHByZXYyICogZmFjdG9yMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzYW1wbGVkYXQgKiBzY2FsZSkgPDwgMTEpKSA+PiAxMTsKKyAgICAgICAgICAgICAgICAgICAgKnNhbXBsZXMgPSBhdl9jbGlwX2ludDE2KHNhbXBsZWRhdCk7CisgICAgICAgICAgICAgICAgICAgIHByZXYyID0gcHJldjE7CisgICAgICAgICAgICAgICAgICAgIHByZXYxID0gKnNhbXBsZXMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGMtPnN0YXR1c1tjaGFubmVsXS5zYW1wbGUxID0gcHJldjE7CisgICAgICAgICAgICBjLT5zdGF0dXNbY2hhbm5lbF0uc2FtcGxlMiA9IHByZXYyOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXN0cmVhbTJfc2VlaygmZ2IsIDAsIFNFRUtfRU5EKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fVEhQOgorICAgIHsKKyAgICAgICAgaW50IHRhYmxlWzZdWzE2XTsKKyAgICAgICAgaW50IGNoOworCisgICAgICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICBHZXRCeXRlQ29udGV4dCB0YjsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCAzMiAqIGF2Y3R4LT5jaGFubmVscykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBjb2VmZiB0YWJsZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJnRiLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCAxNjsgbisrKQorICAgICAgICAgICAgICAgICAgICB0YWJsZVtpXVtuXSA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmdGIpLCAxNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCAxNjsgbisrKQorICAgICAgICAgICAgICAgIHRhYmxlW2ldW25dID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZnYiksIDE2KTsKKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwcmV2aW91cyBzYW1wbGUuICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5zYW1wbGUxID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZnYiksIDE2KTsKKyAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5zYW1wbGUyID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZnYiksIDE2KTsKKyAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBzYW1wbGVzID0gc2FtcGxlc19wW2NoXTsKKworICAgICAgICAgICAgLyogUmVhZCBpbiBldmVyeSBzYW1wbGUgZm9yIHRoaXMgY2hhbm5lbC4gICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlcyAvIDE0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYnl0ZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IChieXRlID4+IDQpICYgNzsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZXhwID0gYnl0ZSAmIDB4MEY7CisgICAgICAgICAgICAgICAgaW50IGZhY3RvcjEgPSB0YWJsZVtjaF1baW5kZXggKiAyXTsKKyAgICAgICAgICAgICAgICBpbnQgZmFjdG9yMiA9IHRhYmxlW2NoXVtpbmRleCAqIDIgKyAxXTsKKworICAgICAgICAgICAgICAgIC8qIERlY29kZSAxNCBzYW1wbGVzLiAgKi8KKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMTQ7IG4rKykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZWRhdDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobiAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZWRhdCA9IHNpZ25fZXh0ZW5kKGJ5dGUsIDQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlZGF0ID0gc2lnbl9leHRlbmQoYnl0ZSA+PiA0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZWRhdCA9ICgoYy0+c3RhdHVzW2NoXS5zYW1wbGUxICogZmFjdG9yMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGMtPnN0YXR1c1tjaF0uc2FtcGxlMiAqIGZhY3RvcjIpID4+IDExKSArIChzYW1wbGVkYXQgPDwgZXhwKTsKKyAgICAgICAgICAgICAgICAgICAgKnNhbXBsZXMgPSBhdl9jbGlwX2ludDE2KHNhbXBsZWRhdCk7CisgICAgICAgICAgICAgICAgICAgIGMtPnN0YXR1c1tjaF0uc2FtcGxlMiA9IGMtPnN0YXR1c1tjaF0uc2FtcGxlMTsKKyAgICAgICAgICAgICAgICAgICAgYy0+c3RhdHVzW2NoXS5zYW1wbGUxID0gKnNhbXBsZXMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRFRLOgorICAgICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgYXZjdHgtPmNoYW5uZWxzOyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgIHNhbXBsZXMgPSBzYW1wbGVzX3BbY2hhbm5lbF07CisKKyAgICAgICAgICAgIC8qIFJlYWQgaW4gZXZlcnkgc2FtcGxlIGZvciB0aGlzIGNoYW5uZWwuICAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXMgLyAyODsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGJ5dGUsIGhlYWRlcjsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbCkKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCAxKTsKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIDMgLSBjaGFubmVsKTsKKworICAgICAgICAgICAgICAgIC8qIERlY29kZSAyOCBzYW1wbGVzLiAgKi8KKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMjg7IG4rKykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZWRhdCwgcHJldjsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhlYWRlciA+PiA0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSAoYy0+c3RhdHVzW2NoYW5uZWxdLnNhbXBsZTEgKiAweDNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gKGMtPnN0YXR1c1tjaGFubmVsXS5zYW1wbGUxICogMHg3MykgLSAoYy0+c3RhdHVzW2NoYW5uZWxdLnNhbXBsZTIgKiAweDM0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gKGMtPnN0YXR1c1tjaGFubmVsXS5zYW1wbGUxICogMHg2MikgLSAoYy0+c3RhdHVzW2NoYW5uZWxdLnNhbXBsZTIgKiAweDM3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcmV2ID0gYXZfY2xpcCgocHJldiArIDB4MjApID4+IDYsIC0weDIwMDAwMCwgMHgxZmZmZmYpOworCisgICAgICAgICAgICAgICAgICAgIGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlZGF0ID0gc2lnbl9leHRlbmQoYnl0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZWRhdCA9IHNpZ25fZXh0ZW5kKGJ5dGUgPj4gNCwgNCk7CisKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlZGF0ID0gKCgoc2FtcGxlZGF0IDw8IDEyKSA+PiAoaGVhZGVyICYgMHhmKSkgPDwgNikgKyBwcmV2OworICAgICAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gYXZfY2xpcF9pbnQxNihzYW1wbGVkYXQgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGMtPnN0YXR1c1tjaGFubmVsXS5zYW1wbGUyID0gYy0+c3RhdHVzW2NoYW5uZWxdLnNhbXBsZTE7CisgICAgICAgICAgICAgICAgICAgIGMtPnN0YXR1c1tjaGFubmVsXS5zYW1wbGUxID0gc2FtcGxlZGF0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY2hhbm5lbCkKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZnYiwgMCwgU0VFS19TRVQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChhdnBrdC0+c2l6ZSAmJiBieXRlc3RyZWFtMl90ZWxsKCZnYikgPT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vdGhpbmcgY29uc3VtZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpOworfQorCisKK3N0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRzX3MxNltdICA9IHsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9Oworc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNfczE2cFtdID0geyBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9Oworc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNfYm90aFtdID0geyBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfTsKKworI2RlZmluZSBBRFBDTV9ERUNPREVSKGlkXywgc2FtcGxlX2ZtdHNfLCBuYW1lXywgbG9uZ19uYW1lXykgXAorQVZDb2RlYyBmZl8gIyMgbmFtZV8gIyMgX2RlY29kZXIgPSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5uYW1lICAgICAgICAgICA9ICNuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGxvbmdfbmFtZV8pLCAgICAgXAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywgICAgICAgICAgICAgICAgICAgXAorICAgIC5pZCAgICAgICAgICAgICA9IGlkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBRFBDTURlY29kZUNvbnRleHQpLCAgICAgICAgICAgXAorICAgIC5pbml0ICAgICAgICAgICA9IGFkcGNtX2RlY29kZV9pbml0LCAgICAgICAgICAgICAgICAgICAgXAorICAgIC5kZWNvZGUgICAgICAgICA9IGFkcGNtX2RlY29kZV9mcmFtZSwgICAgICAgICAgICAgICAgICAgXAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zYW1wbGVfZm10cyAgICA9IHNhbXBsZV9mbXRzXywgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvKiBOb3RlOiBEbyBub3QgZm9yZ2V0IHRvIGFkZCBuZXcgZW50cmllcyB0byB0aGUgTWFrZWZpbGUgYXMgd2VsbC4gKi8KK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fNFhNLCAgICAgICAgIHNhbXBsZV9mbXRzX3MxNnAsIGFkcGNtXzR4bSwgICAgICAgICAiQURQQ00gNFggTW92aWUiKTsKK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fQUZDLCAgICAgICAgIHNhbXBsZV9mbXRzX3MxNnAsIGFkcGNtX2FmYywgICAgICAgICAiQURQQ00gTmludGVuZG8gR2FtZWN1YmUgQUZDIik7CitBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX0NULCAgICAgICAgICBzYW1wbGVfZm10c19zMTYsICBhZHBjbV9jdCwgICAgICAgICAgIkFEUENNIENyZWF0aXZlIFRlY2hub2xvZ3kiKTsKK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fRFRLLCAgICAgICAgIHNhbXBsZV9mbXRzX3MxNnAsIGFkcGNtX2R0aywgICAgICAgICAiQURQQ00gTmludGVuZG8gR2FtZWN1YmUgRFRLIik7CitBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX0VBLCAgICAgICAgICBzYW1wbGVfZm10c19zMTYsICBhZHBjbV9lYSwgICAgICAgICAgIkFEUENNIEVsZWN0cm9uaWMgQXJ0cyIpOworQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9FQV9NQVhJU19YQSwgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21fZWFfbWF4aXNfeGEsICJBRFBDTSBFbGVjdHJvbmljIEFydHMgTWF4aXMgQ0RST00gWEEiKTsKK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fRUFfUjEsICAgICAgIHNhbXBsZV9mbXRzX3MxNnAsIGFkcGNtX2VhX3IxLCAgICAgICAiQURQQ00gRWxlY3Ryb25pYyBBcnRzIFIxIik7CitBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX0VBX1IyLCAgICAgICBzYW1wbGVfZm10c19zMTZwLCBhZHBjbV9lYV9yMiwgICAgICAgIkFEUENNIEVsZWN0cm9uaWMgQXJ0cyBSMiIpOworQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9FQV9SMywgICAgICAgc2FtcGxlX2ZtdHNfczE2cCwgYWRwY21fZWFfcjMsICAgICAgICJBRFBDTSBFbGVjdHJvbmljIEFydHMgUjMiKTsKK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fRUFfWEFTLCAgICAgIHNhbXBsZV9mbXRzX3MxNnAsIGFkcGNtX2VhX3hhcywgICAgICAiQURQQ00gRWxlY3Ryb25pYyBBcnRzIFhBUyIpOworQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQU1WLCAgICAgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21faW1hX2FtdiwgICAgICJBRFBDTSBJTUEgQU1WIik7CitBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX0lNQV9BUEMsICAgICBzYW1wbGVfZm10c19zMTYsICBhZHBjbV9pbWFfYXBjLCAgICAgIkFEUENNIElNQSBDUllPIEFQQyIpOworQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREszLCAgICAgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21faW1hX2RrMywgICAgICJBRFBDTSBJTUEgRHVjayBESzMiKTsKK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fSU1BX0RLNCwgICAgIHNhbXBsZV9mbXRzX3MxNiwgIGFkcGNtX2ltYV9kazQsICAgICAiQURQQ00gSU1BIER1Y2sgREs0Iik7CitBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX0lNQV9FQV9FQUNTLCBzYW1wbGVfZm10c19zMTYsICBhZHBjbV9pbWFfZWFfZWFjcywgIkFEUENNIElNQSBFbGVjdHJvbmljIEFydHMgRUFDUyIpOworQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9JTUFfRUFfU0VBRCwgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21faW1hX2VhX3NlYWQsICJBRFBDTSBJTUEgRWxlY3Ryb25pYyBBcnRzIFNFQUQiKTsKK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fSU1BX0lTUywgICAgIHNhbXBsZV9mbXRzX3MxNiwgIGFkcGNtX2ltYV9pc3MsICAgICAiQURQQ00gSU1BIEZ1bmNvbSBJU1MiKTsKK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fSU1BX09LSSwgICAgIHNhbXBsZV9mbXRzX3MxNiwgIGFkcGNtX2ltYV9va2ksICAgICAiQURQQ00gSU1BIERpYWxvZ2ljIE9LSSIpOworQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQsICAgICAgc2FtcGxlX2ZtdHNfczE2cCwgYWRwY21faW1hX3F0LCAgICAgICJBRFBDTSBJTUEgUXVpY2tUaW1lIik7CitBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX0lNQV9SQUQsICAgICBzYW1wbGVfZm10c19zMTYsICBhZHBjbV9pbWFfcmFkLCAgICAgIkFEUENNIElNQSBSYWRpY2FsIik7CitBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX0lNQV9TTUpQRUcsICBzYW1wbGVfZm10c19zMTYsICBhZHBjbV9pbWFfc21qcGVnLCAgIkFEUENNIElNQSBMb2tpIFNETCBNSlBFRyIpOworQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWLCAgICAgc2FtcGxlX2ZtdHNfczE2cCwgYWRwY21faW1hX3dhdiwgICAgICJBRFBDTSBJTUEgV0FWIik7CitBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX0lNQV9XUywgICAgICBzYW1wbGVfZm10c19ib3RoLCBhZHBjbV9pbWFfd3MsICAgICAgIkFEUENNIElNQSBXZXN0d29vZCIpOworQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9NUywgICAgICAgICAgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21fbXMsICAgICAgICAgICJBRFBDTSBNaWNyb3NvZnQiKTsKK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fU0JQUk9fMiwgICAgIHNhbXBsZV9mbXRzX3MxNiwgIGFkcGNtX3NicHJvXzIsICAgICAiQURQQ00gU291bmQgQmxhc3RlciBQcm8gMi1iaXQiKTsKK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fU0JQUk9fMywgICAgIHNhbXBsZV9mbXRzX3MxNiwgIGFkcGNtX3NicHJvXzMsICAgICAiQURQQ00gU291bmQgQmxhc3RlciBQcm8gMi42LWJpdCIpOworQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9TQlBST180LCAgICAgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21fc2Jwcm9fNCwgICAgICJBRFBDTSBTb3VuZCBCbGFzdGVyIFBybyA0LWJpdCIpOworQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9TV0YsICAgICAgICAgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21fc3dmLCAgICAgICAgICJBRFBDTSBTaG9ja3dhdmUgRmxhc2giKTsKK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fVEhQLCAgICAgICAgIHNhbXBsZV9mbXRzX3MxNnAsIGFkcGNtX3RocCwgICAgICAgICAiQURQQ00gTmludGVuZG8gR2FtZWN1YmUgVEhQIik7CitBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX1hBLCAgICAgICAgICBzYW1wbGVfZm10c19zMTZwLCBhZHBjbV94YSwgICAgICAgICAgIkFEUENNIENEUk9NIFhBIik7CitBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX1lBTUFIQSwgICAgICBzYW1wbGVfZm10c19zMTYsICBhZHBjbV95YW1haGEsICAgICAgIkFEUENNIFlhbWFoYSIpOwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWRwY20uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FkcGNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiYjcwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FkcGNtLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBRFBDTSBlbmNvZGVyL2RlY29kZXIgY29tbW9uIGhlYWRlci4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQURQQ01fSAorI2RlZmluZSBBVkNPREVDX0FEUENNX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEJMS1NJWkUgMTAyNAorCit0eXBlZGVmIHN0cnVjdCBBRFBDTUNoYW5uZWxTdGF0dXMgeworICAgIGludCBwcmVkaWN0b3I7CisgICAgaW50MTZfdCBzdGVwX2luZGV4OworICAgIGludCBzdGVwOworICAgIC8qIGZvciBlbmNvZGluZyAqLworICAgIGludCBwcmV2X3NhbXBsZTsKKworICAgIC8qIE1TIHZlcnNpb24gKi8KKyAgICBpbnQgc2FtcGxlMTsKKyAgICBpbnQgc2FtcGxlMjsKKyAgICBpbnQgY29lZmYxOworICAgIGludCBjb2VmZjI7CisgICAgaW50IGlkZWx0YTsKK30gQURQQ01DaGFubmVsU3RhdHVzOworCisjZW5kaWYgLyogQVZDT0RFQ19BRFBDTV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hZHBjbV9kYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hZHBjbV9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzODM2MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FkcGNtX2RhdGEuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBRFBDTSB0YWJsZXMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIGZmX2FkcGNtX3N0ZXBfdGFibGVbXSBhbmQgZmZfYWRwY21faW5kZXhfdGFibGVbXSBhcmUgZnJvbSB0aGUgQURQQ00KKyAgIHJlZmVyZW5jZSBzb3VyY2UgKi8KK3N0YXRpYyBjb25zdCBpbnQ4X3QgYWRwY21faW5kZXhfdGFibGUyWzRdID0geworICAgIC0xLCAgMiwKKyAgICAtMSwgIDIsCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGFkcGNtX2luZGV4X3RhYmxlM1s4XSA9IHsKKyAgICAtMSwgLTEsICAxLCAgMiwKKyAgICAtMSwgLTEsICAxLCAgMiwKK307CisKK2NvbnN0IGludDhfdCBmZl9hZHBjbV9pbmRleF90YWJsZVsxNl0gPSB7CisgICAgLTEsIC0xLCAtMSwgLTEsIDIsIDQsIDYsIDgsCisgICAgLTEsIC0xLCAtMSwgLTEsIDIsIDQsIDYsIDgsCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGFkcGNtX2luZGV4X3RhYmxlNVszMl0gPSB7CisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxLCAyLCA0LCA2LCA4LCAxMCwgMTMsIDE2LAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMSwgMiwgNCwgNiwgOCwgMTAsIDEzLCAxNiwKK307CisKK2NvbnN0IGludDhfdCAqIGNvbnN0IGZmX2FkcGNtX2luZGV4X3RhYmxlc1s0XSA9IHsKKyAgICAmYWRwY21faW5kZXhfdGFibGUyWzBdLAorICAgICZhZHBjbV9pbmRleF90YWJsZTNbMF0sCisgICAgJmZmX2FkcGNtX2luZGV4X3RhYmxlWzBdLAorICAgICZhZHBjbV9pbmRleF90YWJsZTVbMF0sCit9OworCisvKioKKyAqIFRoaXMgaXMgdGhlIHN0ZXAgdGFibGUuIE5vdGUgdGhhdCBtYW55IHByb2dyYW1zIHVzZSBzbGlnaHQgZGV2aWF0aW9ucyBmcm9tCisgKiB0aGlzIHRhYmxlLCBidXQgc3VjaCBkZXZpYXRpb25zIGFyZSBuZWdsaWdpYmxlOgorICovCitjb25zdCBpbnQxNl90IGZmX2FkcGNtX3N0ZXBfdGFibGVbODldID0geworICAgICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTYsICAgIDE3LAorICAgICAgIDE5LCAgICAyMSwgICAgMjMsICAgIDI1LCAgICAyOCwgICAgMzEsICAgIDM0LCAgICAzNywgICAgNDEsICAgIDQ1LAorICAgICAgIDUwLCAgICA1NSwgICAgNjAsICAgIDY2LCAgICA3MywgICAgODAsICAgIDg4LCAgICA5NywgICAxMDcsICAgMTE4LAorICAgICAgMTMwLCAgIDE0MywgICAxNTcsICAgMTczLCAgIDE5MCwgICAyMDksICAgMjMwLCAgIDI1MywgICAyNzksICAgMzA3LAorICAgICAgMzM3LCAgIDM3MSwgICA0MDgsICAgNDQ5LCAgIDQ5NCwgICA1NDQsICAgNTk4LCAgIDY1OCwgICA3MjQsICAgNzk2LAorICAgICAgODc2LCAgIDk2MywgIDEwNjAsICAxMTY2LCAgMTI4MiwgIDE0MTEsICAxNTUyLCAgMTcwNywgIDE4NzgsICAyMDY2LAorICAgICAyMjcyLCAgMjQ5OSwgIDI3NDksICAzMDI0LCAgMzMyNywgIDM2NjAsICA0MDI2LCAgNDQyOCwgIDQ4NzEsICA1MzU4LAorICAgICA1ODk0LCAgNjQ4NCwgIDcxMzIsICA3ODQ1LCAgODYzMCwgIDk0OTMsIDEwNDQyLCAxMTQ4NywgMTI2MzUsIDEzODk5LAorICAgIDE1Mjg5LCAxNjgxOCwgMTg1MDAsIDIwMzUwLCAyMjM4NSwgMjQ2MjMsIDI3MDg2LCAyOTc5NCwgMzI3NjcKK307CisKK2NvbnN0IGludDE2X3QgZmZfYWRwY21fb2tpX3N0ZXBfdGFibGVbNDldID0geworICAgICAxNiwgIDE3LCAgMTksICAyMSwgICAyMywgICAyNSwgICAyOCwgICAzMSwgICAzNCwgIDM3LAorICAgICA0MSwgIDQ1LCAgNTAsICA1NSwgICA2MCwgICA2NiwgICA3MywgICA4MCwgICA4OCwgIDk3LAorICAgIDEwNywgMTE4LCAxMzAsIDE0MywgIDE1NywgIDE3MywgIDE5MCwgIDIwOSwgIDIzMCwgMjUzLAorICAgIDI3OSwgMzA3LCAzMzcsIDM3MSwgIDQwOCwgIDQ0OSwgIDQ5NCwgIDU0NCwgIDU5OCwgNjU4LAorICAgIDcyNCwgNzk2LCA4NzYsIDk2MywgMTA2MCwgMTE2NiwgMTI4MiwgMTQxMSwgMTU1MgorfTsKKworLyogVGhlc2UgYXJlIGZvciBNUy1BRFBDTSAqLworLyogZmZfYWRwY21fQWRhcHRhdGlvblRhYmxlW10sIGZmX2FkcGNtX0FkYXB0Q29lZmYxW10sIGFuZAorICAgZmZfYWRwY21fQWRhcHRDb2VmZjJbXSBhcmUgZnJvbSBsaWJzbmRmaWxlICovCitjb25zdCBpbnQxNl90IGZmX2FkcGNtX0FkYXB0YXRpb25UYWJsZVtdID0geworICAgIDIzMCwgMjMwLCAyMzAsIDIzMCwgMzA3LCA0MDksIDUxMiwgNjE0LAorICAgIDc2OCwgNjE0LCA1MTIsIDQwOSwgMzA3LCAyMzAsIDIzMCwgMjMwCit9OworCisvKiogRGl2aWRlZCBieSA0IHRvIGZpdCBpbiA4LWJpdCBpbnRlZ2VycyAqLworY29uc3QgdWludDhfdCBmZl9hZHBjbV9BZGFwdENvZWZmMVtdID0geworICAgIDY0LCAxMjgsIDAsIDQ4LCA2MCwgMTE1LCA5OAorfTsKKworLyoqIERpdmlkZWQgYnkgNCB0byBmaXQgaW4gOC1iaXQgaW50ZWdlcnMgKi8KK2NvbnN0IGludDhfdCBmZl9hZHBjbV9BZGFwdENvZWZmMltdID0geworICAgIDAsIC02NCwgMCwgMTYsIDAsIC01MiwgLTU4Cit9OworCitjb25zdCBpbnQxNl90IGZmX2FkcGNtX3lhbWFoYV9pbmRleHNjYWxlW10gPSB7CisgICAgMjMwLCAyMzAsIDIzMCwgMjMwLCAzMDcsIDQwOSwgNTEyLCA2MTQsCisgICAgMjMwLCAyMzAsIDIzMCwgMjMwLCAzMDcsIDQwOSwgNTEyLCA2MTQKK307CisKK2NvbnN0IGludDhfdCBmZl9hZHBjbV95YW1haGFfZGlmZmxvb2t1cFtdID0geworICAgICAxLCAgMywgIDUsICA3LCAgOSwgIDExLCAgMTMsICAxNSwKKyAgICAtMSwgLTMsIC01LCAtNywgLTksIC0xMSwgLTEzLCAtMTUKK307CisKK2NvbnN0IGludDE2X3QgZmZfYWRwY21fYWZjX2NvZWZmc1syXVsxNl0gPSB7CisgICAgeyAwLCAyMDQ4LCAwLCAxMDI0LCA0MDk2LCAzNTg0LCAzMDcyLCA0NjA4LCA0MjAwLCA0ODAwLCA1MTIwLCAyMDQ4LCAxMDI0LCA2NDUxMiwgNjQ1MTIsIDYzNDg4IH0sCisgICAgeyAwLCAwLCAyMDQ4LCAxMDI0LCA2MzQ4OCwgNjQwMDAsIDY0NTEyLCA2Mjk3NiwgNjMyODgsIDYzMjM2LCA2MjQ2NCwgNjM0ODgsIDY0NTEyLCAxMDI0LCAwLCAwIH0KK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hZHBjbV9kYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hZHBjbV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3OWQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FkcGNtX2RhdGEuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFEUENNIHRhYmxlcworICovCisKKyNpZm5kZWYgQVZDT0RFQ19BRFBDTV9EQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19BRFBDTV9EQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdGF0aWMgY29uc3QgdWludDhfdCBmZl9hZHBjbV9pbWFfYmxvY2tfc2l6ZXNbNF0gICA9IHsgIDQsIDEyLCA0LCAyMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZmZfYWRwY21faW1hX2Jsb2NrX3NhbXBsZXNbNF0gPSB7IDE2LCAzMiwgOCwgMzIgfTsKKworZXh0ZXJuIGNvbnN0IGludDhfdCAqIGNvbnN0IGZmX2FkcGNtX2luZGV4X3RhYmxlc1s0XTsKK2V4dGVybiBjb25zdCBpbnQ4X3QgIGZmX2FkcGNtX2luZGV4X3RhYmxlWzE2XTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX2FkcGNtX3N0ZXBfdGFibGVbODldOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfYWRwY21fb2tpX3N0ZXBfdGFibGVbNDldOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfYWRwY21fQWRhcHRhdGlvblRhYmxlW107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9hZHBjbV9BZGFwdENvZWZmMVtdOworZXh0ZXJuIGNvbnN0IGludDhfdCAgZmZfYWRwY21fQWRhcHRDb2VmZjJbXTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX2FkcGNtX3lhbWFoYV9pbmRleHNjYWxlW107CitleHRlcm4gY29uc3QgaW50OF90ICBmZl9hZHBjbV95YW1haGFfZGlmZmxvb2t1cFtdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfYWRwY21fYWZjX2NvZWZmc1syXVsxNl07CisKKyNlbmRpZiAvKiBBVkNPREVDX0FEUENNX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWRwY21lbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FkcGNtZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2Y2MyMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FkcGNtZW5jLmMKQEAgLTAsMCArMSw3MjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBmaXJzdCB2ZXJzaW9uIGJ5IEZyYW5jb2lzIFJldm9sIChyZXZvbEBmcmVlLmZyKQorICogZnJpbmdlIEFEUENNIGNvZGVjcyAoZS5nLiwgREszLCBESzQsIFdlc3R3b29kKQorICogICBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImFkcGNtLmgiCisjaW5jbHVkZSAiYWRwY21fZGF0YS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qKgorICogQGZpbGUKKyAqIEFEUENNIGVuY29kZXJzCisgKiBTZWUgQURQQ00gZGVjb2RlciByZWZlcmVuY2UgZG9jdW1lbnRzIGZvciBjb2RlYyBpbmZvcm1hdGlvbi4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBUcmVsbGlzUGF0aCB7CisgICAgaW50IG5pYmJsZTsKKyAgICBpbnQgcHJldjsKK30gVHJlbGxpc1BhdGg7CisKK3R5cGVkZWYgc3RydWN0IFRyZWxsaXNOb2RlIHsKKyAgICB1aW50MzJfdCBzc2Q7CisgICAgaW50IHBhdGg7CisgICAgaW50IHNhbXBsZTE7CisgICAgaW50IHNhbXBsZTI7CisgICAgaW50IHN0ZXA7Cit9IFRyZWxsaXNOb2RlOworCit0eXBlZGVmIHN0cnVjdCBBRFBDTUVuY29kZUNvbnRleHQgeworICAgIEFEUENNQ2hhbm5lbFN0YXR1cyBzdGF0dXNbNl07CisgICAgVHJlbGxpc1BhdGggKnBhdGhzOworICAgIFRyZWxsaXNOb2RlICpub2RlX2J1ZjsKKyAgICBUcmVsbGlzTm9kZSAqKm5vZGVwX2J1ZjsKKyAgICB1aW50OF90ICp0cmVsbGlzX2hhc2g7Cit9IEFEUENNRW5jb2RlQ29udGV4dDsKKworI2RlZmluZSBGUkVFWkVfSU5URVJWQUwgMTI4CisKK3N0YXRpYyBhdl9jb2xkIGludCBhZHBjbV9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworc3RhdGljIGF2X2NvbGQgaW50IGFkcGNtX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBRFBDTUVuY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKmV4dHJhZGF0YTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IDIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJvbmx5IHN0ZXJlbyBvciBtb25vIGlzIHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT50cmVsbGlzICYmICh1bnNpZ25lZClhdmN0eC0+dHJlbGxpcyA+IDE2VSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdHJlbGxpcyBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPnRyZWxsaXMpIHsKKyAgICAgICAgaW50IGZyb250aWVyICA9IDEgPDwgYXZjdHgtPnRyZWxsaXM7CisgICAgICAgIGludCBtYXhfcGF0aHMgPSAgZnJvbnRpZXIgKiBGUkVFWkVfSU5URVJWQUw7CisgICAgICAgIEZGX0FMTE9DX09SX0dPVE8oYXZjdHgsIHMtPnBhdGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9wYXRocyAqIHNpemVvZigqcy0+cGF0aHMpLCBlcnJvcik7CisgICAgICAgIEZGX0FMTE9DX09SX0dPVE8oYXZjdHgsIHMtPm5vZGVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBmcm9udGllciAqIHNpemVvZigqcy0+bm9kZV9idWYpLCAgZXJyb3IpOworICAgICAgICBGRl9BTExPQ19PUl9HT1RPKGF2Y3R4LCBzLT5ub2RlcF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIGZyb250aWVyICogc2l6ZW9mKCpzLT5ub2RlcF9idWYpLCBlcnJvcik7CisgICAgICAgIEZGX0FMTE9DX09SX0dPVE8oYXZjdHgsIHMtPnRyZWxsaXNfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNiAqIHNpemVvZigqcy0+dHJlbGxpc19oYXNoKSwgZXJyb3IpOworICAgIH0KKworICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGF2Y3R4LT5jb2RlYy0+aWQpOworCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWMtPmlkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWOgorICAgICAgICAvKiBlYWNoIDE2IGJpdHMgc2FtcGxlIGdpdmVzIG9uZSBuaWJibGUKKyAgICAgICAgICAgYW5kIHdlIGhhdmUgNCBieXRlcyBwZXIgY2hhbm5lbCBvdmVyaGVhZCAqLworICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IChCTEtTSVpFIC0gNCAqIGF2Y3R4LT5jaGFubmVscykgKiA4IC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCAqIGF2Y3R4LT5jaGFubmVscykgKyAxOworICAgICAgICAvKiBzZWVtcyBmcmFtZV9zaXplIGlzbid0IHRha2VuIGludG8gYWNjb3VudC4uLgorICAgICAgICAgICBoYXZlIHRvIGJ1ZmZlciB0aGUgc2FtcGxlcyA6LSggKi8KKyAgICAgICAgYXZjdHgtPmJsb2NrX2FsaWduID0gQkxLU0laRTsKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1FUOgorICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSAgPSA2NDsKKyAgICAgICAgYXZjdHgtPmJsb2NrX2FsaWduID0gMzQgKiBhdmN0eC0+Y2hhbm5lbHM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fTVM6CisgICAgICAgIC8qIGVhY2ggMTYgYml0cyBzYW1wbGUgZ2l2ZXMgb25lIG5pYmJsZQorICAgICAgICAgICBhbmQgd2UgaGF2ZSA3IGJ5dGVzIHBlciBjaGFubmVsIG92ZXJoZWFkICovCisgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gKEJMS1NJWkUgLSA3ICogYXZjdHgtPmNoYW5uZWxzKSAqIDIgLyBhdmN0eC0+Y2hhbm5lbHMgKyAyOworICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gNDsKKyAgICAgICAgYXZjdHgtPmJsb2NrX2FsaWduICAgID0gQkxLU0laRTsKKyAgICAgICAgaWYgKCEoYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvYygzMiArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IDMyOworICAgICAgICBleHRyYWRhdGEgPSBhdmN0eC0+ZXh0cmFkYXRhOworICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZleHRyYWRhdGEsIGF2Y3R4LT5mcmFtZV9zaXplKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmZXh0cmFkYXRhLCA3KTsgLyogd051bUNvZWYgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmZXh0cmFkYXRhLCBmZl9hZHBjbV9BZGFwdENvZWZmMVtpXSAqIDQpOworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmZXh0cmFkYXRhLCBmZl9hZHBjbV9BZGFwdENvZWZmMltpXSAqIDQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fWUFNQUhBOgorICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSAgPSBCTEtTSVpFICogMiAvIGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgYXZjdHgtPmJsb2NrX2FsaWduID0gQkxLU0laRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9TV0Y6CisgICAgICAgIGlmIChhdmN0eC0+c2FtcGxlX3JhdGUgIT0gMTEwMjUgJiYKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSAhPSAyMjA1MCAmJgorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlICE9IDQ0MTAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNhbXBsZSByYXRlIG11c3QgYmUgMTEwMjUsICIKKyAgICAgICAgICAgICAgICAgICAiMjIwNTAgb3IgNDQxMDBcbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IDUxMiAqIChhdmN0eC0+c2FtcGxlX3JhdGUgLyAxMTAyNSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2Vycm9yOgorICAgIGFkcGNtX2VuY29kZV9jbG9zZShhdmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFkcGNtX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQURQQ01FbmNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdl9mcmVlcCgmcy0+cGF0aHMpOworICAgIGF2X2ZyZWVwKCZzLT5ub2RlX2J1Zik7CisgICAgYXZfZnJlZXAoJnMtPm5vZGVwX2J1Zik7CisgICAgYXZfZnJlZXAoJnMtPnRyZWxsaXNfaGFzaCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgYWRwY21faW1hX2NvbXByZXNzX3NhbXBsZShBRFBDTUNoYW5uZWxTdGF0dXMgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHNhbXBsZSkKK3sKKyAgICBpbnQgZGVsdGEgID0gc2FtcGxlIC0gYy0+cHJldl9zYW1wbGU7CisgICAgaW50IG5pYmJsZSA9IEZGTUlOKDcsIGFicyhkZWx0YSkgKiA0IC8KKyAgICAgICAgICAgICAgICAgICAgICAgZmZfYWRwY21fc3RlcF90YWJsZVtjLT5zdGVwX2luZGV4XSkgKyAoZGVsdGEgPCAwKSAqIDg7CisgICAgYy0+cHJldl9zYW1wbGUgKz0gKChmZl9hZHBjbV9zdGVwX3RhYmxlW2MtPnN0ZXBfaW5kZXhdICoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FkcGNtX3lhbWFoYV9kaWZmbG9va3VwW25pYmJsZV0pIC8gOCk7CisgICAgYy0+cHJldl9zYW1wbGUgPSBhdl9jbGlwX2ludDE2KGMtPnByZXZfc2FtcGxlKTsKKyAgICBjLT5zdGVwX2luZGV4ICA9IGF2X2NsaXAoYy0+c3RlcF9pbmRleCArIGZmX2FkcGNtX2luZGV4X3RhYmxlW25pYmJsZV0sIDAsIDg4KTsKKyAgICByZXR1cm4gbmliYmxlOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgYWRwY21faW1hX3F0X2NvbXByZXNzX3NhbXBsZShBRFBDTUNoYW5uZWxTdGF0dXMgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHNhbXBsZSkKK3sKKyAgICBpbnQgZGVsdGEgID0gc2FtcGxlIC0gYy0+cHJldl9zYW1wbGU7CisgICAgaW50IGRpZmYsIHN0ZXAgPSBmZl9hZHBjbV9zdGVwX3RhYmxlW2MtPnN0ZXBfaW5kZXhdOworICAgIGludCBuaWJibGUgPSA4KihkZWx0YSA8IDApOworCisgICAgZGVsdGE9IGFicyhkZWx0YSk7CisgICAgZGlmZiA9IGRlbHRhICsgKHN0ZXAgPj4gMyk7CisKKyAgICBpZiAoZGVsdGEgPj0gc3RlcCkgeworICAgICAgICBuaWJibGUgfD0gNDsKKyAgICAgICAgZGVsdGEgIC09IHN0ZXA7CisgICAgfQorICAgIHN0ZXAgPj49IDE7CisgICAgaWYgKGRlbHRhID49IHN0ZXApIHsKKyAgICAgICAgbmliYmxlIHw9IDI7CisgICAgICAgIGRlbHRhICAtPSBzdGVwOworICAgIH0KKyAgICBzdGVwID4+PSAxOworICAgIGlmIChkZWx0YSA+PSBzdGVwKSB7CisgICAgICAgIG5pYmJsZSB8PSAxOworICAgICAgICBkZWx0YSAgLT0gc3RlcDsKKyAgICB9CisgICAgZGlmZiAtPSBkZWx0YTsKKworICAgIGlmIChuaWJibGUgJiA4KQorICAgICAgICBjLT5wcmV2X3NhbXBsZSAtPSBkaWZmOworICAgIGVsc2UKKyAgICAgICAgYy0+cHJldl9zYW1wbGUgKz0gZGlmZjsKKworICAgIGMtPnByZXZfc2FtcGxlID0gYXZfY2xpcF9pbnQxNihjLT5wcmV2X3NhbXBsZSk7CisgICAgYy0+c3RlcF9pbmRleCAgPSBhdl9jbGlwKGMtPnN0ZXBfaW5kZXggKyBmZl9hZHBjbV9pbmRleF90YWJsZVtuaWJibGVdLCAwLCA4OCk7CisKKyAgICByZXR1cm4gbmliYmxlOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgYWRwY21fbXNfY29tcHJlc3Nfc2FtcGxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBzYW1wbGUpCit7CisgICAgaW50IHByZWRpY3RvciwgbmliYmxlLCBiaWFzOworCisgICAgcHJlZGljdG9yID0gKCgoYy0+c2FtcGxlMSkgKiAoYy0+Y29lZmYxKSkgKworICAgICAgICAgICAgICAgICgoIGMtPnNhbXBsZTIpICogKGMtPmNvZWZmMikpKSAvIDY0OworCisgICAgbmliYmxlID0gc2FtcGxlIC0gcHJlZGljdG9yOworICAgIGlmIChuaWJibGUgPj0gMCkKKyAgICAgICAgYmlhcyA9ICBjLT5pZGVsdGEgLyAyOworICAgIGVsc2UKKyAgICAgICAgYmlhcyA9IC1jLT5pZGVsdGEgLyAyOworCisgICAgbmliYmxlID0gKG5pYmJsZSArIGJpYXMpIC8gYy0+aWRlbHRhOworICAgIG5pYmJsZSA9IGF2X2NsaXAobmliYmxlLCAtOCwgNykgJiAweDBGOworCisgICAgcHJlZGljdG9yICs9ICgobmliYmxlICYgMHgwOCkgPyAobmliYmxlIC0gMHgxMCkgOiBuaWJibGUpICogYy0+aWRlbHRhOworCisgICAgYy0+c2FtcGxlMiA9IGMtPnNhbXBsZTE7CisgICAgYy0+c2FtcGxlMSA9IGF2X2NsaXBfaW50MTYocHJlZGljdG9yKTsKKworICAgIGMtPmlkZWx0YSA9IChmZl9hZHBjbV9BZGFwdGF0aW9uVGFibGVbbmliYmxlXSAqIGMtPmlkZWx0YSkgPj4gODsKKyAgICBpZiAoYy0+aWRlbHRhIDwgMTYpCisgICAgICAgIGMtPmlkZWx0YSA9IDE2OworCisgICAgcmV0dXJuIG5pYmJsZTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IGFkcGNtX3lhbWFoYV9jb21wcmVzc19zYW1wbGUoQURQQ01DaGFubmVsU3RhdHVzICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBzYW1wbGUpCit7CisgICAgaW50IG5pYmJsZSwgZGVsdGE7CisKKyAgICBpZiAoIWMtPnN0ZXApIHsKKyAgICAgICAgYy0+cHJlZGljdG9yID0gMDsKKyAgICAgICAgYy0+c3RlcCAgICAgID0gMTI3OworICAgIH0KKworICAgIGRlbHRhID0gc2FtcGxlIC0gYy0+cHJlZGljdG9yOworCisgICAgbmliYmxlID0gRkZNSU4oNywgYWJzKGRlbHRhKSAqIDQgLyBjLT5zdGVwKSArIChkZWx0YSA8IDApICogODsKKworICAgIGMtPnByZWRpY3RvciArPSAoKGMtPnN0ZXAgKiBmZl9hZHBjbV95YW1haGFfZGlmZmxvb2t1cFtuaWJibGVdKSAvIDgpOworICAgIGMtPnByZWRpY3RvciA9IGF2X2NsaXBfaW50MTYoYy0+cHJlZGljdG9yKTsKKyAgICBjLT5zdGVwID0gKGMtPnN0ZXAgKiBmZl9hZHBjbV95YW1haGFfaW5kZXhzY2FsZVtuaWJibGVdKSA+PiA4OworICAgIGMtPnN0ZXAgPSBhdl9jbGlwKGMtPnN0ZXAsIDEyNywgMjQ1NjcpOworCisgICAgcmV0dXJuIG5pYmJsZTsKK30KKworc3RhdGljIHZvaWQgYWRwY21fY29tcHJlc3NfdHJlbGxpcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnNhbXBsZXMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURQQ01DaGFubmVsU3RhdHVzICpjLCBpbnQgbiwgaW50IHN0cmlkZSkKK3sKKyAgICAvL0ZJWE1FIDYlIGZhc3RlciBpZiBmcm9udGllciBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudAorICAgIEFEUENNRW5jb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgaW50IGZyb250aWVyID0gMSA8PCBhdmN0eC0+dHJlbGxpczsKKyAgICBjb25zdCBpbnQgdmVyc2lvbiAgPSBhdmN0eC0+Y29kZWMtPmlkOworICAgIFRyZWxsaXNQYXRoICpwYXRocyAgICAgICA9IHMtPnBhdGhzLCAqcDsKKyAgICBUcmVsbGlzTm9kZSAqbm9kZV9idWYgICAgPSBzLT5ub2RlX2J1ZjsKKyAgICBUcmVsbGlzTm9kZSAqKm5vZGVwX2J1ZiAgPSBzLT5ub2RlcF9idWY7CisgICAgVHJlbGxpc05vZGUgKipub2RlcyAgICAgID0gbm9kZXBfYnVmOyAvLyBub2Rlc1tdIGlzIGFsd2F5cyBzb3J0ZWQgYnkgLnNzZAorICAgIFRyZWxsaXNOb2RlICoqbm9kZXNfbmV4dCA9IG5vZGVwX2J1ZiArIGZyb250aWVyOworICAgIGludCBwYXRobiA9IDAsIGZyb3plID0gLTEsIGksIGosIGssIGdlbmVyYXRpb24gPSAwOworICAgIHVpbnQ4X3QgKmhhc2ggPSBzLT50cmVsbGlzX2hhc2g7CisgICAgbWVtc2V0KGhhc2gsIDB4ZmYsIDY1NTM2ICogc2l6ZW9mKCpoYXNoKSk7CisKKyAgICBtZW1zZXQobm9kZXBfYnVmLCAwLCAyICogZnJvbnRpZXIgKiBzaXplb2YoKm5vZGVwX2J1ZikpOworICAgIG5vZGVzWzBdICAgICAgICAgID0gbm9kZV9idWYgKyBmcm9udGllcjsKKyAgICBub2Rlc1swXS0+c3NkICAgICA9IDA7CisgICAgbm9kZXNbMF0tPnBhdGggICAgPSAwOworICAgIG5vZGVzWzBdLT5zdGVwICAgID0gYy0+c3RlcF9pbmRleDsKKyAgICBub2Rlc1swXS0+c2FtcGxlMSA9IGMtPnNhbXBsZTE7CisgICAgbm9kZXNbMF0tPnNhbXBsZTIgPSBjLT5zYW1wbGUyOworICAgIGlmICh2ZXJzaW9uID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYgfHwKKyAgICAgICAgdmVyc2lvbiA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQgIHx8CisgICAgICAgIHZlcnNpb24gPT0gQVZfQ09ERUNfSURfQURQQ01fU1dGKQorICAgICAgICBub2Rlc1swXS0+c2FtcGxlMSA9IGMtPnByZXZfc2FtcGxlOworICAgIGlmICh2ZXJzaW9uID09IEFWX0NPREVDX0lEX0FEUENNX01TKQorICAgICAgICBub2Rlc1swXS0+c3RlcCA9IGMtPmlkZWx0YTsKKyAgICBpZiAodmVyc2lvbiA9PSBBVl9DT0RFQ19JRF9BRFBDTV9ZQU1BSEEpIHsKKyAgICAgICAgaWYgKGMtPnN0ZXAgPT0gMCkgeworICAgICAgICAgICAgbm9kZXNbMF0tPnN0ZXAgICAgPSAxMjc7CisgICAgICAgICAgICBub2Rlc1swXS0+c2FtcGxlMSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub2Rlc1swXS0+c3RlcCAgICA9IGMtPnN0ZXA7CisgICAgICAgICAgICBub2Rlc1swXS0+c2FtcGxlMSA9IGMtPnByZWRpY3RvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgVHJlbGxpc05vZGUgKnQgPSBub2RlX2J1ZiArIGZyb250aWVyKihpJjEpOworICAgICAgICBUcmVsbGlzTm9kZSAqKnU7CisgICAgICAgIGludCBzYW1wbGUgICA9IHNhbXBsZXNbaSAqIHN0cmlkZV07CisgICAgICAgIGludCBoZWFwX3BvcyA9IDA7CisgICAgICAgIG1lbXNldChub2Rlc19uZXh0LCAwLCBmcm9udGllciAqIHNpemVvZihUcmVsbGlzTm9kZSopKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGZyb250aWVyICYmIG5vZGVzW2pdOyBqKyspIHsKKyAgICAgICAgICAgIC8vIGhpZ2hlciBqIGhhdmUgaGlnaGVyIHNzZCBhbHJlYWR5LCBzbyB0aGV5J3JlIGxpa2VseQorICAgICAgICAgICAgLy8gdG8geWllbGQgYSBzdWJvcHRpbWFsIG5leHQgc2FtcGxlIHRvbworICAgICAgICAgICAgY29uc3QgaW50IHJhbmdlID0gKGogPCBmcm9udGllciAvIDIpID8gMSA6IDA7CisgICAgICAgICAgICBjb25zdCBpbnQgc3RlcCAgPSBub2Rlc1tqXS0+c3RlcDsKKyAgICAgICAgICAgIGludCBuaWR4OworICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gQVZfQ09ERUNfSURfQURQQ01fTVMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcHJlZGljdG9yID0gKChub2Rlc1tqXS0+c2FtcGxlMSAqIGMtPmNvZWZmMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vZGVzW2pdLT5zYW1wbGUyICogYy0+Y29lZmYyKSkgLyA2NDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGl2ICA9IChzYW1wbGUgLSBwcmVkaWN0b3IpIC8gc3RlcDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgbm1pbiA9IGF2X2NsaXAoZGl2LXJhbmdlLCAtOCwgNik7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IG5tYXggPSBhdl9jbGlwKGRpdityYW5nZSwgLTcsIDcpOworICAgICAgICAgICAgICAgIGZvciAobmlkeCA9IG5taW47IG5pZHggPD0gbm1heDsgbmlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuaWJibGUgPSBuaWR4ICYgMHhmOworICAgICAgICAgICAgICAgICAgICBpbnQgZGVjX3NhbXBsZSAgID0gcHJlZGljdG9yICsgbmlkeCAqIHN0ZXA7CisjZGVmaW5lIFNUT1JFX05PREUoTkFNRSwgU1RFUF9JTkRFWClcCisgICAgICAgICAgICAgICAgICAgIGludCBkO1wKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3NkO1wKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvcztcCisgICAgICAgICAgICAgICAgICAgIFRyZWxsaXNOb2RlICp1O1wKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaDtcCisgICAgICAgICAgICAgICAgICAgIGRlY19zYW1wbGUgPSBhdl9jbGlwX2ludDE2KGRlY19zYW1wbGUpO1wKKyAgICAgICAgICAgICAgICAgICAgZCA9IHNhbXBsZSAtIGRlY19zYW1wbGU7XAorICAgICAgICAgICAgICAgICAgICBzc2QgPSBub2Rlc1tqXS0+c3NkICsgZCoodW5zaWduZWQpZDtcCisgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciB3cmFwYXJvdW5kLCBza2lwIHN1Y2ggc2FtcGxlcyBjb21wbGV0ZWx5LiBcCisgICAgICAgICAgICAgICAgICAgICAqIE5vdGUsIGNoYW5naW5nIHNzZCB0byBhIDY0IGJpdCB2YXJpYWJsZSB3b3VsZCBiZSBcCisgICAgICAgICAgICAgICAgICAgICAqIHNpbXBsZXIsIGF2b2lkaW5nIHRoaXMgY2hlY2ssIGJ1dCBpdCdzIHNsb3dlciBvbiBcCisgICAgICAgICAgICAgICAgICAgICAqIHg4NiAzMiBiaXQgYXQgdGhlIG1vbWVudC4gKi9cCisgICAgICAgICAgICAgICAgICAgIGlmIChzc2QgPCBub2Rlc1tqXS0+c3NkKVwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dF8jI05BTUU7XAorICAgICAgICAgICAgICAgICAgICAvKiBDb2xsYXBzZSBhbnkgdHdvIHN0YXRlcyB3aXRoIHRoZSBzYW1lIHByZXZpb3VzIHNhbXBsZSB2YWx1ZS4gXAorICAgICAgICAgICAgICAgICAgICAgKiBPbmUgY291bGQgYWxzbyBkaXN0aW5ndWlzaCBzdGF0ZXMgYnkgc3RlcCBhbmQgYnkgMm5kIHRvIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgICogc2FtcGxlLCBidXQgdGhlIGVmZmVjdHMgb2YgdGhhdCBhcmUgbmVnbGlnaWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICogU2luY2Ugbm9kZXMgaW4gdGhlIHByZXZpb3VzIGdlbmVyYXRpb24gYXJlIGl0ZXJhdGVkCisgICAgICAgICAgICAgICAgICAgICAqIHRocm91Z2ggYSBoZWFwLCB0aGV5J3JlIHJvdWdobHkgb3JkZXJlZCBmcm9tIGJldHRlciB0bworICAgICAgICAgICAgICAgICAgICAgKiB3b3JzZSwgYnV0IG5vdCBzdHJpY3RseSBvcmRlcmVkLiBUaGVyZWZvcmUsIGFuIGVhcmxpZXIKKyAgICAgICAgICAgICAgICAgICAgICogbm9kZSB3aXRoIHRoZSBzYW1lIHNhbXBsZSB2YWx1ZSBpcyBiZXR0ZXIgaW4gbW9zdCBjYXNlcworICAgICAgICAgICAgICAgICAgICAgKiAoYW5kIHRodXMgdGhlIGN1cnJlbnQgaXMgc2tpcHBlZCksIGJ1dCBub3Qgc3RyaWN0bHkKKyAgICAgICAgICAgICAgICAgICAgICogaW4gYWxsIGNhc2VzLiBPbmx5IHNraXBwaW5nIHNhbXBsZXMgd2hlcmUgc3NkID49CisgICAgICAgICAgICAgICAgICAgICAqIHNzZCBvZiB0aGUgZWFybGllciBub2RlIHdpdGggdGhlIHNhbWUgc2FtcGxlIGdpdmVzCisgICAgICAgICAgICAgICAgICAgICAqIHNsaWdodGx5IHdvcnNlIHF1YWxpdHksIHRob3VnaCwgZm9yIHNvbWUgcmVhc29uLiAqLyBcCisgICAgICAgICAgICAgICAgICAgIGggPSAmaGFzaFsodWludDE2X3QpIGRlY19zYW1wbGVdO1wKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpoID09IGdlbmVyYXRpb24pXAorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0XyMjTkFNRTtcCisgICAgICAgICAgICAgICAgICAgIGlmIChoZWFwX3BvcyA8IGZyb250aWVyKSB7XAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gaGVhcF9wb3MrKztcCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XAorICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJ5IHRvIHJlcGxhY2Ugb25lIG9mIHRoZSBsZWFmIG5vZGVzIHdpdGggdGhlIG5ldyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvbmUsIGJ1dCB0cnkgYSBkaWZmZXJlbnQgc2xvdCBlYWNoIHRpbWUuICovXAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gKGZyb250aWVyID4+IDEpICtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGVhcF9wb3MgJiAoKGZyb250aWVyID4+IDEpIC0gMSkpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzc2QgPiBub2Rlc19uZXh0W3Bvc10tPnNzZClcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0XyMjTkFNRTtcCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFwX3BvcysrO1wKKyAgICAgICAgICAgICAgICAgICAgfVwKKyAgICAgICAgICAgICAgICAgICAgKmggPSBnZW5lcmF0aW9uO1wKKyAgICAgICAgICAgICAgICAgICAgdSAgPSBub2Rlc19uZXh0W3Bvc107XAorICAgICAgICAgICAgICAgICAgICBpZiAoIXUpIHtcCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQxKHBhdGhuIDwgRlJFRVpFX0lOVEVSVkFMIDw8IGF2Y3R4LT50cmVsbGlzKTtcCisgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdCsrO1wKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzX25leHRbcG9zXSA9IHU7XAorICAgICAgICAgICAgICAgICAgICAgICAgdS0+cGF0aCA9IHBhdGhuKys7XAorICAgICAgICAgICAgICAgICAgICB9XAorICAgICAgICAgICAgICAgICAgICB1LT5zc2QgID0gc3NkO1wKKyAgICAgICAgICAgICAgICAgICAgdS0+c3RlcCA9IFNURVBfSU5ERVg7XAorICAgICAgICAgICAgICAgICAgICB1LT5zYW1wbGUyID0gbm9kZXNbal0tPnNhbXBsZTE7XAorICAgICAgICAgICAgICAgICAgICB1LT5zYW1wbGUxID0gZGVjX3NhbXBsZTtcCisgICAgICAgICAgICAgICAgICAgIHBhdGhzW3UtPnBhdGhdLm5pYmJsZSA9IG5pYmJsZTtcCisgICAgICAgICAgICAgICAgICAgIHBhdGhzW3UtPnBhdGhdLnByZXYgICA9IG5vZGVzW2pdLT5wYXRoO1wKKyAgICAgICAgICAgICAgICAgICAgLyogU2lmdCB0aGUgbmV3bHkgaW5zZXJ0ZWQgbm9kZSB1cCBpbiB0aGUgaGVhcCB0byBcCisgICAgICAgICAgICAgICAgICAgICAqIHJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkuICovXAorICAgICAgICAgICAgICAgICAgICB3aGlsZSAocG9zID4gMCkge1wKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJlbnQgPSAocG9zIC0gMSkgPj4gMTtcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZXNfbmV4dFtwYXJlbnRdLT5zc2QgPD0gc3NkKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcCisgICAgICAgICAgICAgICAgICAgICAgICBGRlNXQVAoVHJlbGxpc05vZGUqLCBub2Rlc19uZXh0W3BhcmVudF0sIG5vZGVzX25leHRbcG9zXSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gcGFyZW50O1wKKyAgICAgICAgICAgICAgICAgICAgfVwKKyAgICAgICAgICAgICAgICAgICAgbmV4dF8jI05BTUU6OworICAgICAgICAgICAgICAgICAgICBTVE9SRV9OT0RFKG1zLCBGRk1BWCgxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmZfYWRwY21fQWRhcHRhdGlvblRhYmxlW25pYmJsZV0gKiBzdGVwKSA+PiA4KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQgIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPT0gQVZfQ09ERUNfSURfQURQQ01fU1dGKSB7CisjZGVmaW5lIExPT1BfTk9ERVMoTkFNRSwgU1RFUF9UQUJMRSwgU1RFUF9JTkRFWClcCisgICAgICAgICAgICAgICAgY29uc3QgaW50IHByZWRpY3RvciA9IG5vZGVzW2pdLT5zYW1wbGUxO1wKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGl2ID0gKHNhbXBsZSAtIHByZWRpY3RvcikgKiA0IC8gU1RFUF9UQUJMRTtcCisgICAgICAgICAgICAgICAgaW50IG5taW4gPSBhdl9jbGlwKGRpdiAtIHJhbmdlLCAtNywgNik7XAorICAgICAgICAgICAgICAgIGludCBubWF4ID0gYXZfY2xpcChkaXYgKyByYW5nZSwgLTYsIDcpO1wKKyAgICAgICAgICAgICAgICBpZiAobm1pbiA8PSAwKVwKKyAgICAgICAgICAgICAgICAgICAgbm1pbi0tOyAvKiBkaXN0aW5ndWlzaCAtMCBmcm9tICswICovXAorICAgICAgICAgICAgICAgIGlmIChubWF4IDwgMClcCisgICAgICAgICAgICAgICAgICAgIG5tYXgtLTtcCisgICAgICAgICAgICAgICAgZm9yIChuaWR4ID0gbm1pbjsgbmlkeCA8PSBubWF4OyBuaWR4KyspIHtcCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuaWJibGUgPSBuaWR4IDwgMCA/IDcgLSBuaWR4IDogbmlkeDtcCisgICAgICAgICAgICAgICAgICAgIGludCBkZWNfc2FtcGxlID0gcHJlZGljdG9yICtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1RFUF9UQUJMRSAqXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FkcGNtX3lhbWFoYV9kaWZmbG9va3VwW25pYmJsZV0pIC8gODtcCisgICAgICAgICAgICAgICAgICAgIFNUT1JFX05PREUoTkFNRSwgU1RFUF9JTkRFWCk7XAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMT09QX05PREVTKGltYSwgZmZfYWRwY21fc3RlcF90YWJsZVtzdGVwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2NsaXAoc3RlcCArIGZmX2FkcGNtX2luZGV4X3RhYmxlW25pYmJsZV0sIDAsIDg4KSk7CisgICAgICAgICAgICB9IGVsc2UgeyAvL0FWX0NPREVDX0lEX0FEUENNX1lBTUFIQQorICAgICAgICAgICAgICAgIExPT1BfTk9ERVMoeWFtYWhhLCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfY2xpcCgoc3RlcCAqIGZmX2FkcGNtX3lhbWFoYV9pbmRleHNjYWxlW25pYmJsZV0pID4+IDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNywgMjQ1NjcpKTsKKyN1bmRlZiBMT09QX05PREVTCisjdW5kZWYgU1RPUkVfTk9ERQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdSA9IG5vZGVzOworICAgICAgICBub2RlcyA9IG5vZGVzX25leHQ7CisgICAgICAgIG5vZGVzX25leHQgPSB1OworCisgICAgICAgIGdlbmVyYXRpb24rKzsKKyAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gMjU1KSB7CisgICAgICAgICAgICBtZW1zZXQoaGFzaCwgMHhmZiwgNjU1MzYgKiBzaXplb2YoKmhhc2gpKTsKKyAgICAgICAgICAgIGdlbmVyYXRpb24gPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJldmVudCBvdmVyZmxvdworICAgICAgICBpZiAobm9kZXNbMF0tPnNzZCA+ICgxIDw8IDI4KSkgeworICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IGZyb250aWVyICYmIG5vZGVzW2pdOyBqKyspCisgICAgICAgICAgICAgICAgbm9kZXNbal0tPnNzZCAtPSBub2Rlc1swXS0+c3NkOworICAgICAgICAgICAgbm9kZXNbMF0tPnNzZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBtZXJnZSBvbGQgcGF0aHMgdG8gc2F2ZSBtZW1vcnkKKyAgICAgICAgaWYgKGkgPT0gZnJvemUgKyBGUkVFWkVfSU5URVJWQUwpIHsKKyAgICAgICAgICAgIHAgPSAmcGF0aHNbbm9kZXNbMF0tPnBhdGhdOworICAgICAgICAgICAgZm9yIChrID0gaTsgayA+IGZyb3plOyBrLS0pIHsKKyAgICAgICAgICAgICAgICBkc3Rba10gPSBwLT5uaWJibGU7CisgICAgICAgICAgICAgICAgcCA9ICZwYXRoc1twLT5wcmV2XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyb3plID0gaTsKKyAgICAgICAgICAgIHBhdGhuID0gMDsKKyAgICAgICAgICAgIC8vIG90aGVyIG5vZGVzIG1pZ2h0IHVzZSBwYXRocyB0aGF0IGRvbid0IGNvaW5jaWRlIHdpdGggdGhlIGZyb3plbiBvbmUuCisgICAgICAgICAgICAvLyBjaGVja2luZyB3aGljaCBub2RlcyBkbyBzbyBpcyB0b28gc2xvdywgc28ganVzdCBraWxsIHRoZW0gYWxsLgorICAgICAgICAgICAgLy8gdGhpcyBhbHNvIHNsaWdodGx5IGltcHJvdmVzIHF1YWxpdHksIGJ1dCBJIGRvbid0IGtub3cgd2h5LgorICAgICAgICAgICAgbWVtc2V0KG5vZGVzICsgMSwgMCwgKGZyb250aWVyIC0gMSkgKiBzaXplb2YoVHJlbGxpc05vZGUqKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwID0gJnBhdGhzW25vZGVzWzBdLT5wYXRoXTsKKyAgICBmb3IgKGkgPSBuIC0gMTsgaSA+IGZyb3plOyBpLS0pIHsKKyAgICAgICAgZHN0W2ldID0gcC0+bmliYmxlOworICAgICAgICBwID0gJnBhdGhzW3AtPnByZXZdOworICAgIH0KKworICAgIGMtPnByZWRpY3RvciAgPSBub2Rlc1swXS0+c2FtcGxlMTsKKyAgICBjLT5zYW1wbGUxICAgID0gbm9kZXNbMF0tPnNhbXBsZTE7CisgICAgYy0+c2FtcGxlMiAgICA9IG5vZGVzWzBdLT5zYW1wbGUyOworICAgIGMtPnN0ZXBfaW5kZXggPSBub2Rlc1swXS0+c3RlcDsKKyAgICBjLT5zdGVwICAgICAgID0gbm9kZXNbMF0tPnN0ZXA7CisgICAgYy0+aWRlbHRhICAgICA9IG5vZGVzWzBdLT5zdGVwOworfQorCitzdGF0aWMgaW50IGFkcGNtX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIGludCBuLCBpLCBjaCwgc3QsIHBrdF9zaXplLCByZXQ7CisgICAgY29uc3QgaW50MTZfdCAqc2FtcGxlczsKKyAgICBpbnQxNl90ICoqc2FtcGxlc19wOworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBBRFBDTUVuY29kZUNvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKmJ1ZjsKKworICAgIHNhbXBsZXMgPSAoY29uc3QgaW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdOworICAgIHNhbXBsZXNfcCA9IChpbnQxNl90ICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhOworICAgIHN0ID0gYXZjdHgtPmNoYW5uZWxzID09IDI7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX1NXRikKKyAgICAgICAgcGt0X3NpemUgPSAoMiArIGF2Y3R4LT5jaGFubmVscyAqICgyMiArIDQgKiAoZnJhbWUtPm5iX3NhbXBsZXMgLSAxKSkgKyA3KSAvIDg7CisgICAgZWxzZQorICAgICAgICBwa3Rfc2l6ZSA9IGF2Y3R4LT5ibG9ja19hbGlnbjsKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBwa3Rfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBkc3QgPSBhdnBrdC0+ZGF0YTsKKworICAgIHN3aXRjaChhdmN0eC0+Y29kZWMtPmlkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWOgorICAgIHsKKyAgICAgICAgaW50IGJsb2NrcywgajsKKworICAgICAgICBibG9ja3MgPSAoZnJhbWUtPm5iX3NhbXBsZXMgLSAxKSAvIDg7CisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBBRFBDTUNoYW5uZWxTdGF0dXMgKnN0YXR1cyA9ICZjLT5zdGF0dXNbY2hdOworICAgICAgICAgICAgc3RhdHVzLT5wcmV2X3NhbXBsZSA9IHNhbXBsZXNfcFtjaF1bMF07CisgICAgICAgICAgICAvKiBzdGF0dXMtPnN0ZXBfaW5kZXggPSAwOworICAgICAgICAgICAgICAgWFhYOiBub3Qgc3VyZSBob3cgdG8gaW5pdCB0aGUgc3RhdGUgbWFjaGluZSAqLworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmZHN0LCBzdGF0dXMtPnByZXZfc2FtcGxlKTsKKyAgICAgICAgICAgICpkc3QrKyA9IHN0YXR1cy0+c3RlcF9pbmRleDsKKyAgICAgICAgICAgICpkc3QrKyA9IDA7IC8qIHVua25vd24gKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0ZXJlbzogNCBieXRlcyAoOCBzYW1wbGVzKSBmb3IgbGVmdCwgNCBieXRlcyBmb3IgcmlnaHQgKi8KKyAgICAgICAgaWYgKGF2Y3R4LT50cmVsbGlzID4gMCkgeworICAgICAgICAgICAgRkZfQUxMT0NfQVJSQVlfT1JfR09UTyhhdmN0eCwgYnVmLCBhdmN0eC0+Y2hhbm5lbHMsIGJsb2NrcyAqIDgsIGVycm9yKTsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgICAgIGFkcGNtX2NvbXByZXNzX3RyZWxsaXMoYXZjdHgsICZzYW1wbGVzX3BbY2hdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgY2ggKiBibG9ja3MgKiA4LCAmYy0+c3RhdHVzW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAqIDgsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZjEgPSBidWYgKyBjaCAqIGJsb2NrcyAqIDggKyBpICogODsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGogKz0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IGJ1ZjFbal0gfCAoYnVmMVtqICsgMV0gPDwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgICAgIEFEUENNQ2hhbm5lbFN0YXR1cyAqc3RhdHVzID0gJmMtPnN0YXR1c1tjaF07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnNtcCA9ICZzYW1wbGVzX3BbY2hdWzEgKyBpICogOF07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdiA9IGFkcGNtX2ltYV9jb21wcmVzc19zYW1wbGUoc3RhdHVzLCBzbXBbaiAgICBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgICAgICAgIHw9IGFkcGNtX2ltYV9jb21wcmVzc19zYW1wbGUoc3RhdHVzLCBzbXBbaiArIDFdKSA8PCA0OworICAgICAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gdjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQ6CisgICAgeworICAgICAgICBQdXRCaXRDb250ZXh0IHBiOworICAgICAgICBpbml0X3B1dF9iaXRzKCZwYiwgZHN0LCBwa3Rfc2l6ZSAqIDgpOworCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgQURQQ01DaGFubmVsU3RhdHVzICpzdGF0dXMgPSAmYy0+c3RhdHVzW2NoXTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgOSwgKHN0YXR1cy0+cHJldl9zYW1wbGUgJiAweEZGRkYpID4+IDcpOworICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCA3LCAgc3RhdHVzLT5zdGVwX2luZGV4KTsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+dHJlbGxpcyA+IDApIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGJ1Zls2NF07CisgICAgICAgICAgICAgICAgYWRwY21fY29tcHJlc3NfdHJlbGxpcyhhdmN0eCwgJnNhbXBsZXNfcFtjaF1bMF0sIGJ1Ziwgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsIDEpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcGIsIDQsIGJ1ZltpIF4gMV0pOworICAgICAgICAgICAgICAgIHN0YXR1cy0+cHJldl9zYW1wbGUgPSBzdGF0dXMtPnByZWRpY3RvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHQxLCB0MjsKKyAgICAgICAgICAgICAgICAgICAgdDEgPSBhZHBjbV9pbWFfcXRfY29tcHJlc3Nfc2FtcGxlKHN0YXR1cywgc2FtcGxlc19wW2NoXVtpICAgIF0pOworICAgICAgICAgICAgICAgICAgICB0MiA9IGFkcGNtX2ltYV9xdF9jb21wcmVzc19zYW1wbGUoc3RhdHVzLCBzYW1wbGVzX3BbY2hdW2kgKyAxXSk7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgNCwgdDIpOworICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcGIsIDQsIHQxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbHVzaF9wdXRfYml0cygmcGIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9TV0Y6CisgICAgeworICAgICAgICBQdXRCaXRDb250ZXh0IHBiOworICAgICAgICBpbml0X3B1dF9iaXRzKCZwYiwgZHN0LCBwa3Rfc2l6ZSAqIDgpOworCisgICAgICAgIG4gPSBmcmFtZS0+bmJfc2FtcGxlcyAtIDE7CisKKyAgICAgICAgLy8gc3RvcmUgQWRwY21Db2RlU2l6ZQorICAgICAgICBwdXRfYml0cygmcGIsIDIsIDIpOyAgICAvLyBzZXQgNC1iaXQgZmxhc2ggYWRwY20gZm9ybWF0CisKKyAgICAgICAgLy8gaW5pdCB0aGUgZW5jb2RlciBzdGF0ZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGNsaXAgc3RlcCBzbyBpdCBmaXRzIDYgYml0cworICAgICAgICAgICAgYy0+c3RhdHVzW2ldLnN0ZXBfaW5kZXggPSBhdl9jbGlwKGMtPnN0YXR1c1tpXS5zdGVwX2luZGV4LCAwLCA2Myk7CisgICAgICAgICAgICBwdXRfc2JpdHMoJnBiLCAxNiwgc2FtcGxlc1tpXSk7CisgICAgICAgICAgICBwdXRfYml0cygmcGIsIDYsIGMtPnN0YXR1c1tpXS5zdGVwX2luZGV4KTsKKyAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5wcmV2X3NhbXBsZSA9IHNhbXBsZXNbaV07CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXZjdHgtPnRyZWxsaXMgPiAwKSB7CisgICAgICAgICAgICBGRl9BTExPQ19PUl9HT1RPKGF2Y3R4LCBidWYsIDIgKiBuLCBlcnJvcik7CisgICAgICAgICAgICBhZHBjbV9jb21wcmVzc190cmVsbGlzKGF2Y3R4LCBzYW1wbGVzICsgYXZjdHgtPmNoYW5uZWxzLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5zdGF0dXNbMF0sIG4sIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID09IDIpCisgICAgICAgICAgICAgICAgYWRwY21fY29tcHJlc3NfdHJlbGxpcyhhdmN0eCwgc2FtcGxlcyArIGF2Y3R4LT5jaGFubmVscyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgKyBuLCAmYy0+c3RhdHVzWzFdLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcGIsIDQsIGJ1ZltpXSk7CisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA9PSAyKQorICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcGIsIDQsIGJ1ZltuICsgaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGZyYW1lLT5uYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcGIsIDQsIGFkcGNtX2ltYV9jb21wcmVzc19zYW1wbGUoJmMtPnN0YXR1c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzW2F2Y3R4LT5jaGFubmVscyAqIGldKSk7CisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA9PSAyKQorICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcGIsIDQsIGFkcGNtX2ltYV9jb21wcmVzc19zYW1wbGUoJmMtPnN0YXR1c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1syICogaSArIDFdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fTVM6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgaW50IHByZWRpY3RvciA9IDA7CisgICAgICAgICAgICAqZHN0KysgPSBwcmVkaWN0b3I7CisgICAgICAgICAgICBjLT5zdGF0dXNbaV0uY29lZmYxID0gZmZfYWRwY21fQWRhcHRDb2VmZjFbcHJlZGljdG9yXTsKKyAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5jb2VmZjIgPSBmZl9hZHBjbV9BZGFwdENvZWZmMltwcmVkaWN0b3JdOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgaWYgKGMtPnN0YXR1c1tpXS5pZGVsdGEgPCAxNikKKyAgICAgICAgICAgICAgICBjLT5zdGF0dXNbaV0uaWRlbHRhID0gMTY7CisgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZkc3QsIGMtPnN0YXR1c1tpXS5pZGVsdGEpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5zYW1wbGUyPSAqc2FtcGxlcysrOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGMtPnN0YXR1c1tpXS5zYW1wbGUxID0gKnNhbXBsZXMrKzsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmRzdCwgYy0+c3RhdHVzW2ldLnNhbXBsZTEpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmRzdCwgYy0+c3RhdHVzW2ldLnNhbXBsZTIpOworCisgICAgICAgIGlmIChhdmN0eC0+dHJlbGxpcyA+IDApIHsKKyAgICAgICAgICAgIG4gPSBhdmN0eC0+YmxvY2tfYWxpZ24gLSA3ICogYXZjdHgtPmNoYW5uZWxzOworICAgICAgICAgICAgRkZfQUxMT0NfT1JfR09UTyhhdmN0eCwgYnVmLCAyICogbiwgZXJyb3IpOworICAgICAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA9PSAxKSB7CisgICAgICAgICAgICAgICAgYWRwY21fY29tcHJlc3NfdHJlbGxpcyhhdmN0eCwgc2FtcGxlcywgYnVmLCAmYy0+c3RhdHVzWzBdLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSArPSAyKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoYnVmW2ldIDw8IDQpIHwgYnVmW2kgKyAxXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRwY21fY29tcHJlc3NfdHJlbGxpcyhhdmN0eCwgc2FtcGxlcywgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5zdGF0dXNbMF0sIG4sIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgYWRwY21fY29tcHJlc3NfdHJlbGxpcyhhdmN0eCwgc2FtcGxlcyArIDEsIGJ1ZiArIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYy0+c3RhdHVzWzFdLCBuLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChidWZbaV0gPDwgNCkgfCBidWZbbiArIGldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gNyAqIGF2Y3R4LT5jaGFubmVsczsgaSA8IGF2Y3R4LT5ibG9ja19hbGlnbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IG5pYmJsZTsKKyAgICAgICAgICAgICAgICBuaWJibGUgID0gYWRwY21fbXNfY29tcHJlc3Nfc2FtcGxlKCZjLT5zdGF0dXNbIDBdLCAqc2FtcGxlcysrKSA8PCA0OworICAgICAgICAgICAgICAgIG5pYmJsZSB8PSBhZHBjbV9tc19jb21wcmVzc19zYW1wbGUoJmMtPnN0YXR1c1tzdF0sICpzYW1wbGVzKyspOworICAgICAgICAgICAgICAgICpkc3QrKyAgPSBuaWJibGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9ZQU1BSEE6CisgICAgICAgIG4gPSBmcmFtZS0+bmJfc2FtcGxlcyAvIDI7CisgICAgICAgIGlmIChhdmN0eC0+dHJlbGxpcyA+IDApIHsKKyAgICAgICAgICAgIEZGX0FMTE9DX09SX0dPVE8oYXZjdHgsIGJ1ZiwgMiAqIG4gKiAyLCBlcnJvcik7CisgICAgICAgICAgICBuICo9IDI7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgICAgICAgICBhZHBjbV9jb21wcmVzc190cmVsbGlzKGF2Y3R4LCBzYW1wbGVzLCBidWYsICZjLT5zdGF0dXNbMF0sIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpICs9IDIpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IGJ1ZltpXSB8IChidWZbaSArIDFdIDw8IDQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZHBjbV9jb21wcmVzc190cmVsbGlzKGF2Y3R4LCBzYW1wbGVzLCAgICAgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmMtPnN0YXR1c1swXSwgbiwgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBhZHBjbV9jb21wcmVzc190cmVsbGlzKGF2Y3R4LCBzYW1wbGVzICsgMSwgYnVmICsgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5zdGF0dXNbMV0sIG4sIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gYnVmW2ldIHwgKGJ1ZltuICsgaV0gPDwgNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZm9yIChuICo9IGF2Y3R4LT5jaGFubmVsczsgbiA+IDA7IG4tLSkgeworICAgICAgICAgICAgICAgIGludCBuaWJibGU7CisgICAgICAgICAgICAgICAgbmliYmxlICA9IGFkcGNtX3lhbWFoYV9jb21wcmVzc19zYW1wbGUoJmMtPnN0YXR1c1sgMF0sICpzYW1wbGVzKyspOworICAgICAgICAgICAgICAgIG5pYmJsZSB8PSBhZHBjbV95YW1haGFfY29tcHJlc3Nfc2FtcGxlKCZjLT5zdGF0dXNbc3RdLCAqc2FtcGxlcysrKSA8PCA0OworICAgICAgICAgICAgICAgICpkc3QrKyAgPSBuaWJibGU7CisgICAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZwa3QtPnNpemUgPSBwa3Rfc2l6ZTsKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworZXJyb3I6CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c19wW10gPSB7CisgICAgQVZfU0FNUExFX0ZNVF9TMTZQLCBBVl9TQU1QTEVfRk1UX05PTkUKK307CisKKyNkZWZpbmUgQURQQ01fRU5DT0RFUihpZF8sIG5hbWVfLCBzYW1wbGVfZm10c18sIGxvbmdfbmFtZV8pIFwKK0FWQ29kZWMgZmZfICMjIG5hbWVfICMjIF9lbmNvZGVyID0geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubmFtZSAgICAgICAgICAgPSAjbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChsb25nX25hbWVfKSwgICAgIFwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaWQgICAgICAgICAgICAgPSBpZF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQURQQ01FbmNvZGVDb250ZXh0KSwgICAgICAgICAgIFwKKyAgICAuaW5pdCAgICAgICAgICAgPSBhZHBjbV9lbmNvZGVfaW5pdCwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBhZHBjbV9lbmNvZGVfZnJhbWUsICAgICAgICAgICAgICAgICAgIFwKKyAgICAuY2xvc2UgICAgICAgICAgPSBhZHBjbV9lbmNvZGVfY2xvc2UsICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSBzYW1wbGVfZm10c18sICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworQURQQ01fRU5DT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQsICBhZHBjbV9pbWFfcXQsICBzYW1wbGVfZm10c19wLCAiQURQQ00gSU1BIFF1aWNrVGltZSIpOworQURQQ01fRU5DT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWLCBhZHBjbV9pbWFfd2F2LCBzYW1wbGVfZm10c19wLCAiQURQQ00gSU1BIFdBViIpOworQURQQ01fRU5DT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9NUywgICAgICBhZHBjbV9tcywgICAgICBzYW1wbGVfZm10cywgICAiQURQQ00gTWljcm9zb2Z0Iik7CitBRFBDTV9FTkNPREVSKEFWX0NPREVDX0lEX0FEUENNX1NXRiwgICAgIGFkcGNtX3N3ZiwgICAgIHNhbXBsZV9mbXRzLCAgICJBRFBDTSBTaG9ja3dhdmUgRmxhc2giKTsKK0FEUENNX0VOQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fWUFNQUhBLCAgYWRwY21feWFtYWhhLCAgc2FtcGxlX2ZtdHMsICAgIkFEUENNIFlhbWFoYSIpOwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWR4LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hZHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDg4YjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWR4LmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSAgSnVzdGluIFJ1Z2dsZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAiYWR4LmgiCisKK3ZvaWQgZmZfYWR4X2NhbGN1bGF0ZV9jb2VmZnMoaW50IGN1dG9mZiwgaW50IHNhbXBsZV9yYXRlLCBpbnQgYml0cywgaW50ICpjb2VmZikKK3sKKyAgICBkb3VibGUgYSwgYiwgYzsKKworICAgIGEgPSBNX1NRUlQyIC0gY29zKDIuMCAqIE1fUEkgKiBjdXRvZmYgLyBzYW1wbGVfcmF0ZSk7CisgICAgYiA9IE1fU1FSVDIgLSAxLjA7CisgICAgYyA9IChhIC0gc3FydCgoYSArIGIpICogKGEgLSBiKSkpIC8gYjsKKworICAgIGNvZWZmWzBdID0gbHJpbnRmKGMgKiAyLjAgICogKDEgPDwgYml0cykpOworICAgIGNvZWZmWzFdID0gbHJpbnRmKC0oYyAqIGMpICogKDEgPDwgYml0cykpOworfQorCitpbnQgZmZfYWR4X2RlY29kZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZnNpemUsIGludCAqaGVhZGVyX3NpemUsIGludCAqY29lZmYpCit7CisgICAgaW50IG9mZnNldCwgY3V0b2ZmOworCisgICAgaWYgKGJ1ZnNpemUgPCAyNCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoQVZfUkIxNihidWYpICE9IDB4ODAwMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgb2Zmc2V0ID0gQVZfUkIxNihidWYgKyAyKSArIDQ7CisKKyAgICAvKiBpZiBjb3B5cmlnaHQgc3RyaW5nIGlzIHdpdGhpbiB0aGUgcHJvdmlkZWQgZGF0YSwgdmFsaWRhdGUgaXQgKi8KKyAgICBpZiAoYnVmc2l6ZSA+PSBvZmZzZXQgJiYgb2Zmc2V0ID49IDYgJiYgbWVtY21wKGJ1ZiArIG9mZnNldCAtIDYsICIoYylDUkkiLCA2KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiBjaGVjayBmb3IgZW5jb2Rpbmc9MyBibG9ja19zaXplPTE4LCBzYW1wbGVfc2l6ZT00ICovCisgICAgaWYgKGJ1Zls0XSAhPSAzIHx8IGJ1Zls1XSAhPSAxOCB8fCBidWZbNl0gIT0gNCkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJTdXBwb3J0IGZvciB0aGlzIEFEWCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIC8qIGNoYW5uZWxzICovCisgICAgYXZjdHgtPmNoYW5uZWxzID0gYnVmWzddOworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPD0gMCB8fCBhdmN0eC0+Y2hhbm5lbHMgPiAyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIHNhbXBsZSByYXRlICovCisgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gQVZfUkIzMihidWYgKyA4KTsKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlIDwgMSB8fAorICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPiBJTlRfTUFYIC8gKGF2Y3R4LT5jaGFubmVscyAqIEJMT0NLX1NJWkUgKiA4KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiBiaXQgcmF0ZSAqLworICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IGF2Y3R4LT5zYW1wbGVfcmF0ZSAqIGF2Y3R4LT5jaGFubmVscyAqIEJMT0NLX1NJWkUgKiA4IC8gQkxPQ0tfU0FNUExFUzsKKworICAgIC8qIExQQyBjb2VmZmljaWVudHMgKi8KKyAgICBpZiAoY29lZmYpIHsKKyAgICAgICAgY3V0b2ZmID0gQVZfUkIxNihidWYgKyAxNik7CisgICAgICAgIGZmX2FkeF9jYWxjdWxhdGVfY29lZmZzKGN1dG9mZiwgYXZjdHgtPnNhbXBsZV9yYXRlLCBDT0VGRl9CSVRTLCBjb2VmZik7CisgICAgfQorCisgICAgKmhlYWRlcl9zaXplID0gb2Zmc2V0OworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWR4LmggYi9mZm1wZWcvbGliYXZjb2RlYy9hZHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY3NDlhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWR4LmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIEFEWCBBRFBDTSBjb2RlY3MKKyAqIENvcHlyaWdodCAoYykgMjAwMSwyMDAzIEJFUk8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU0VHQSBDUkkgYWR4IGNvZGVjcy4KKyAqCisgKiBSZWZlcmVuY2UgZG9jdW1lbnRzOgorICogaHR0cDovL2t1LXd3dy5zcy50aXRlY2guYWMuanAvfnlhdHN1c2hpL2FkeC5odG1sCisgKiBhZHgyd2F2ICYgd2F2MmFkeCBodHRwOi8vd3d3Lmdlb2NpdGllcy5jby5qcC9QbGF5dG93bi8yMDA0LworICovCisKKyNpZm5kZWYgQVZDT0RFQ19BRFhfSAorI2RlZmluZSBBVkNPREVDX0FEWF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQURYQ2hhbm5lbFN0YXRlIHsKKyAgICBpbnQgczEsczI7Cit9IEFEWENoYW5uZWxTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgQURYQ29udGV4dCB7CisgICAgaW50IGNoYW5uZWxzOworICAgIEFEWENoYW5uZWxTdGF0ZSBwcmV2WzJdOworICAgIGludCBoZWFkZXJfcGFyc2VkOworICAgIGludCBlb2Y7CisgICAgaW50IGN1dG9mZjsKKyAgICBpbnQgY29lZmZbMl07Cit9IEFEWENvbnRleHQ7CisKKyNkZWZpbmUgQ09FRkZfQklUUyAgMTIKKworI2RlZmluZSBCTE9DS19TSVpFICAgICAgMTgKKyNkZWZpbmUgQkxPQ0tfU0FNUExFUyAgIDMyCisKKy8qKgorICogQ2FsY3VsYXRlIExQQyBjb2VmZmljaWVudHMgYmFzZWQgb24gY3V0b2ZmIGZyZXF1ZW5jeSBhbmQgc2FtcGxlIHJhdGUuCisgKgorICogQHBhcmFtIGN1dG9mZiAgICAgICBjdXRvZmYgZnJlcXVlbmN5CisgKiBAcGFyYW0gc2FtcGxlX3JhdGUgIHNhbXBsZSByYXRlCisgKiBAcGFyYW0gYml0cyAgICAgICAgIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gcXVhbnRpemUgY29lZmZpY2llbnRzCisgKiBAcGFyYW1bb3V0XSBjb2VmZiAgIDIgcXVhbnRpemVkIExQQyBjb2VmZmljaWVudHMKKyAqLwordm9pZCBmZl9hZHhfY2FsY3VsYXRlX2NvZWZmcyhpbnQgY3V0b2ZmLCBpbnQgc2FtcGxlX3JhdGUsIGludCBiaXRzLCBpbnQgKmNvZWZmKTsKKworLyoqCisgKiBEZWNvZGUgQURYIHN0cmVhbSBoZWFkZXIuCisgKiBTZXRzIGF2Y3R4LT5jaGFubmVscyBhbmQgYXZjdHgtPnNhbXBsZV9yYXRlLgorICoKKyAqIEBwYXJhbSAgICAgIGF2Y3R4ICAgICAgICBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW0gICAgICBidWYgICAgICAgICAgaGVhZGVyIGRhdGEKKyAqIEBwYXJhbSAgICAgIGJ1ZnNpemUgICAgICBkYXRhIHNpemUsIHNob3VsZCBiZSBhdCBsZWFzdCAyNCBieXRlcworICogQHBhcmFtW291dF0gaGVhZGVyX3NpemUgIHNpemUgb2YgQURYIGhlYWRlcgorICogQHBhcmFtW291dF0gY29lZmYgICAgICAgIDIgTFBDIGNvZWZmaWNpZW50cywgY2FuIGJlIE5VTEwKKyAqIEByZXR1cm4gZGF0YSBvZmZzZXQgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiBoZWFkZXIgaXMgaW52YWxpZAorICovCitpbnQgZmZfYWR4X2RlY29kZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZnNpemUsIGludCAqaGVhZGVyX3NpemUsIGludCAqY29lZmYpOworCisjZW5kaWYgLyogQVZDT0RFQ19BRFhfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWR4X3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWR4X3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYTcxOGYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hZHhfcGFyc2VyLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSAgSnVzdGluIFJ1Z2dsZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQURYIGF1ZGlvIHBhcnNlcgorICoKKyAqIFNwbGl0cyBwYWNrZXRzIGludG8gaW5kaXZpZHVhbCBibG9ja3MuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJhZHguaCIKKwordHlwZWRlZiBzdHJ1Y3QgQURYUGFyc2VDb250ZXh0IHsKKyAgICBQYXJzZUNvbnRleHQgcGM7CisgICAgaW50IGhlYWRlcl9zaXplOworICAgIGludCBibG9ja19zaXplOworICAgIGludCByZW1haW5pbmc7Cit9IEFEWFBhcnNlQ29udGV4dDsKKworc3RhdGljIGludCBhZHhfcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgQURYUGFyc2VDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBQYXJzZUNvbnRleHQgKnBjID0gJnMtPnBjOworICAgIGludCBuZXh0ID0gRU5EX05PVF9GT1VORDsKKyAgICBpbnQgaTsKKyAgICB1aW50NjRfdCBzdGF0ZSA9IHBjLT5zdGF0ZTY0OworCisgICAgaWYgKCFzLT5oZWFkZXJfc2l6ZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykgeworICAgICAgICAgICAgc3RhdGUgPSAoc3RhdGUgPDwgOCkgfCBidWZbaV07CisgICAgICAgICAgICAvKiBjaGVjayBmb3IgZml4ZWQgZmllbGRzIGluIEFEWCBoZWFkZXIgZm9yIHBvc3NpYmxlIG1hdGNoICovCisgICAgICAgICAgICBpZiAoKHN0YXRlICYgMHhGRkZGMDAwMEZGRkZGRjAwKSA9PSAweDgwMDAwMDAwMDMxMjA0MDBVTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgICAgPSBzdGF0ZSAmIDB4RkY7CisgICAgICAgICAgICAgICAgaW50IGhlYWRlcl9zaXplID0gKChzdGF0ZSA+PiAzMikgJiAweEZGRkYpICsgNDsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgPiAwICYmIGhlYWRlcl9zaXplID49IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+aGVhZGVyX3NpemUgPSBoZWFkZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2l6ZSAgPSBCTE9DS19TSVpFICogY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgIHMtPnJlbWFpbmluZyAgID0gaSAtIDcgKyBzLT5oZWFkZXJfc2l6ZSArIHMtPmJsb2NrX3NpemU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwYy0+c3RhdGU2NCA9IHN0YXRlOworICAgIH0KKworICAgIGlmIChzLT5oZWFkZXJfc2l6ZSkgeworICAgICAgICBpZiAoIXMtPnJlbWFpbmluZykKKyAgICAgICAgICAgIHMtPnJlbWFpbmluZyA9IHMtPmJsb2NrX3NpemU7CisgICAgICAgIGlmIChzLT5yZW1haW5pbmcgPD0gYnVmX3NpemUpIHsKKyAgICAgICAgICAgIG5leHQgPSBzLT5yZW1haW5pbmc7CisgICAgICAgICAgICBzLT5yZW1haW5pbmcgPSAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHMtPnJlbWFpbmluZyAtPSBidWZfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoZmZfY29tYmluZV9mcmFtZShwYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDAgfHwgIWJ1Zl9zaXplKSB7CisgICAgICAgICpwb3V0YnVmICAgICAgPSBOVUxMOworICAgICAgICAqcG91dGJ1Zl9zaXplID0gMDsKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKworICAgIHMxLT5kdXJhdGlvbiA9IEJMT0NLX1NBTVBMRVM7CisKKyAgICAqcG91dGJ1ZiA9IGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK0FWQ29kZWNQYXJzZXIgZmZfYWR4X3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX0FEUENNX0FEWCB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBRFhQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfcGFyc2UgICA9IGFkeF9wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hZHhkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FkeGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTVjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hZHhkZWMuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIEFEWCBBRFBDTSBjb2RlY3MKKyAqIENvcHlyaWdodCAoYykgMjAwMSwyMDAzIEJFUk8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYWR4LmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKioKKyAqIEBmaWxlCisgKiBTRUdBIENSSSBhZHggY29kZWNzLgorICoKKyAqIFJlZmVyZW5jZSBkb2N1bWVudHM6CisgKiBodHRwOi8va3Utd3d3LnNzLnRpdGVjaC5hYy5qcC9+eWF0c3VzaGkvYWR4Lmh0bWwKKyAqIGFkeDJ3YXYgJiB3YXYyYWR4IGh0dHA6Ly93d3cuZ2VvY2l0aWVzLmNvLmpwL1BsYXl0b3duLzIwMDQvCisgKi8KKworc3RhdGljIGF2X2NvbGQgaW50IGFkeF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQURYQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldCwgaGVhZGVyX3NpemU7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDI0KSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfYWR4X2RlY29kZV9oZWFkZXIoYXZjdHgsIGF2Y3R4LT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplLCAmaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y29lZmYpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgcGFyc2luZyBBRFggaGVhZGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGMtPmNoYW5uZWxzICAgICAgPSBhdmN0eC0+Y2hhbm5lbHM7CisgICAgICAgIGMtPmhlYWRlcl9wYXJzZWQgPSAxOworICAgIH0KKworICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTZQOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVjb2RlIDMyIHNhbXBsZXMgZnJvbSAxOCBieXRlcy4KKyAqCisgKiBBIDE2LWJpdCBzY2FsYXIgdmFsdWUgaXMgYXBwbGllZCB0byAzMiByZXNpZHVhbHMsIHdoaWNoIHRoZW4gaGF2ZSBhCisgKiAybmQtb3JkZXIgTFBDIGZpbHRlciBhcHBsaWVkIHRvIGl0IHRvIGZvcm0gdGhlIG91dHB1dCBzaWduYWwgZm9yIGEgc2luZ2xlCisgKiBjaGFubmVsLgorICovCitzdGF0aWMgaW50IGFkeF9kZWNvZGUoQURYQ29udGV4dCAqYywgaW50MTZfdCAqb3V0LCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBpbnQgY2gpCit7CisgICAgQURYQ2hhbm5lbFN0YXRlICpwcmV2ID0gJmMtPnByZXZbY2hdOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IHNjYWxlID0gQVZfUkIxNihpbik7CisgICAgaW50IGk7CisgICAgaW50IHMwLCBzMSwgczIsIGQ7CisKKyAgICAvKiBjaGVjayBpZiB0aGlzIGlzIGFuIEVPRiBwYWNrZXQgKi8KKyAgICBpZiAoc2NhbGUgJiAweDgwMDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBpbiArIDIsIChCTE9DS19TSVpFIC0gMikgKiA4KTsKKyAgICBvdXQgKz0gb2Zmc2V0OworICAgIHMxID0gcHJldi0+czE7CisgICAgczIgPSBwcmV2LT5zMjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0FNUExFUzsgaSsrKSB7CisgICAgICAgIGQgID0gZ2V0X3NiaXRzKCZnYiwgNCk7CisgICAgICAgIHMwID0gKChkIDw8IENPRUZGX0JJVFMpICogc2NhbGUgKyBjLT5jb2VmZlswXSAqIHMxICsgYy0+Y29lZmZbMV0gKiBzMikgPj4gQ09FRkZfQklUUzsKKyAgICAgICAgczIgPSBzMTsKKyAgICAgICAgczEgPSBhdl9jbGlwX2ludDE2KHMwKTsKKyAgICAgICAgKm91dCsrID0gczE7CisgICAgfQorICAgIHByZXYtPnMxID0gczE7CisgICAgcHJldi0+czIgPSBzMjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkeF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lICAgICAgPSBkYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBBRFhDb250ZXh0ICpjICAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQxNl90ICoqc2FtcGxlczsKKyAgICBpbnQgc2FtcGxlc19vZmZzZXQ7CisgICAgY29uc3QgdWludDhfdCAqYnVmICA9IGF2cGt0LT5kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBidWYgKyBhdnBrdC0+c2l6ZTsKKyAgICBpbnQgbnVtX2Jsb2NrcywgY2gsIHJldDsKKworICAgIGlmIChjLT5lb2YpIHsKKyAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgaWYgKCFjLT5oZWFkZXJfcGFyc2VkICYmIGJ1Zl9zaXplID49IDIgJiYgQVZfUkIxNihidWYpID09IDB4ODAwMCkgeworICAgICAgICBpbnQgaGVhZGVyX3NpemU7CisgICAgICAgIGlmICgocmV0ID0gZmZfYWR4X2RlY29kZV9oZWFkZXIoYXZjdHgsIGJ1ZiwgYnVmX3NpemUsICZoZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jb2VmZikpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBwYXJzaW5nIEFEWCBoZWFkZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYy0+Y2hhbm5lbHMgICAgICA9IGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgYy0+aGVhZGVyX3BhcnNlZCA9IDE7CisgICAgICAgIGlmIChidWZfc2l6ZSA8IGhlYWRlcl9zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGJ1ZiAgICAgICs9IGhlYWRlcl9zaXplOworICAgICAgICBidWZfc2l6ZSAtPSBoZWFkZXJfc2l6ZTsKKyAgICB9CisgICAgaWYgKCFjLT5oZWFkZXJfcGFyc2VkKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIGluIHRoZSBwYWNrZXQgKi8KKyAgICBudW1fYmxvY2tzID0gYnVmX3NpemUgLyAoQkxPQ0tfU0laRSAqIGMtPmNoYW5uZWxzKTsKKworICAgIC8qIGlmIHRoZSBwYWNrZXQgaXMgbm90IGFuIGV2ZW4gbXVsdGlwbGUgb2YgQkxPQ0tfU0laRSwgY2hlY2sgZm9yIGFuIEVPRgorICAgICAgIHBhY2tldCAqLworICAgIGlmICghbnVtX2Jsb2NrcyB8fCBidWZfc2l6ZSAlIChCTE9DS19TSVpFICogYXZjdHgtPmNoYW5uZWxzKSkgeworICAgICAgICBpZiAoYnVmX3NpemUgPj0gNCAmJiAoQVZfUkIxNihidWYpICYgMHg4MDAwKSkgeworICAgICAgICAgICAgYy0+ZW9mID0gMTsKKyAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gbnVtX2Jsb2NrcyAqIEJMT0NLX1NBTVBMRVM7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzYW1wbGVzID0gKGludDE2X3QgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGE7CisgICAgc2FtcGxlc19vZmZzZXQgPSAwOworCisgICAgd2hpbGUgKG51bV9ibG9ja3MtLSkgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPCBCTE9DS19TSVpFIHx8IGFkeF9kZWNvZGUoYywgc2FtcGxlc1tjaF0sIHNhbXBsZXNfb2Zmc2V0LCBidWYsIGNoKSkgeworICAgICAgICAgICAgICAgIGMtPmVvZiA9IDE7CisgICAgICAgICAgICAgICAgYnVmID0gYXZwa3QtPmRhdGEgKyBhdnBrdC0+c2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zl9zaXplIC09IEJMT0NLX1NJWkU7CisgICAgICAgICAgICBidWYgICAgICArPSBCTE9DS19TSVpFOworICAgICAgICB9CisgICAgICAgIGlmICghYy0+ZW9mKQorICAgICAgICAgICAgc2FtcGxlc19vZmZzZXQgKz0gQkxPQ0tfU0FNUExFUzsKKyAgICB9CisKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IHNhbXBsZXNfb2Zmc2V0OworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBidWYgLSBhdnBrdC0+ZGF0YTsKK30KKworc3RhdGljIHZvaWQgYWR4X2RlY29kZV9mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQURYQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgbWVtc2V0KGMtPnByZXYsIDAsIHNpemVvZihjLT5wcmV2KSk7CisgICAgYy0+ZW9mID0gMDsKK30KKworQVZDb2RlYyBmZl9hZHBjbV9hZHhfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYWRwY21fYWR4IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU0VHQSBDUkkgQURYIEFEUENNIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0FEWCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQURYQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gYWR4X2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGFkeF9kZWNvZGVfZnJhbWUsCisgICAgLmZsdXNoICAgICAgICAgID0gYWR4X2RlY29kZV9mbHVzaCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWR4ZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hZHhlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzg3ZmZiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWR4ZW5jLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBBRFggQURQQ00gY29kZWNzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsMjAwMyBCRVJPCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYWR4LmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKworLyoqCisgKiBAZmlsZQorICogU0VHQSBDUkkgYWR4IGNvZGVjcy4KKyAqCisgKiBSZWZlcmVuY2UgZG9jdW1lbnRzOgorICogaHR0cDovL2t1LXd3dy5zcy50aXRlY2guYWMuanAvfnlhdHN1c2hpL2FkeC5odG1sCisgKiBhZHgyd2F2ICYgd2F2MmFkeCBodHRwOi8vd3d3Lmdlb2NpdGllcy5jby5qcC9QbGF5dG93bi8yMDA0LworICovCisKK3N0YXRpYyB2b2lkIGFkeF9lbmNvZGUoQURYQ29udGV4dCAqYywgdWludDhfdCAqYWR4LCBjb25zdCBpbnQxNl90ICp3YXYsCisgICAgICAgICAgICAgICAgICAgICAgIEFEWENoYW5uZWxTdGF0ZSAqcHJldiwgaW50IGNoYW5uZWxzKQoreworICAgIFB1dEJpdENvbnRleHQgcGI7CisgICAgaW50IHNjYWxlOworICAgIGludCBpLCBqOworICAgIGludCBzMCwgczEsIHMyLCBkOworICAgIGludCBtYXggPSAwOworICAgIGludCBtaW4gPSAwOworCisgICAgczEgPSBwcmV2LT5zMTsKKyAgICBzMiA9IHByZXYtPnMyOworICAgIGZvciAoaSA9IDAsIGogPSAwOyBqIDwgMzI7IGkgKz0gY2hhbm5lbHMsIGorKykgeworICAgICAgICBzMCA9IHdhdltpXTsKKyAgICAgICAgZCA9ICgoczAgPDwgQ09FRkZfQklUUykgLSBjLT5jb2VmZlswXSAqIHMxIC0gYy0+Y29lZmZbMV0gKiBzMikgPj4gQ09FRkZfQklUUzsKKyAgICAgICAgaWYgKG1heCA8IGQpCisgICAgICAgICAgICBtYXggPSBkOworICAgICAgICBpZiAobWluID4gZCkKKyAgICAgICAgICAgIG1pbiA9IGQ7CisgICAgICAgIHMyID0gczE7CisgICAgICAgIHMxID0gczA7CisgICAgfQorCisgICAgaWYgKG1heCA9PSAwICYmIG1pbiA9PSAwKSB7CisgICAgICAgIHByZXYtPnMxID0gczE7CisgICAgICAgIHByZXYtPnMyID0gczI7CisgICAgICAgIG1lbXNldChhZHgsIDAsIEJMT0NLX1NJWkUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1heCAvIDcgPiAtbWluIC8gOCkKKyAgICAgICAgc2NhbGUgPSBtYXggLyA3OworICAgIGVsc2UKKyAgICAgICAgc2NhbGUgPSAtbWluIC8gODsKKworICAgIGlmIChzY2FsZSA9PSAwKQorICAgICAgICBzY2FsZSA9IDE7CisKKyAgICBBVl9XQjE2KGFkeCwgc2NhbGUpOworCisgICAgaW5pdF9wdXRfYml0cygmcGIsIGFkeCArIDIsIDE2KTsKKworICAgIHMxID0gcHJldi0+czE7CisgICAgczIgPSBwcmV2LT5zMjsKKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaiA8IDMyOyBpICs9IGNoYW5uZWxzLCBqKyspIHsKKyAgICAgICAgZCA9ICgod2F2W2ldIDw8IENPRUZGX0JJVFMpIC0gYy0+Y29lZmZbMF0gKiBzMSAtIGMtPmNvZWZmWzFdICogczIpID4+IENPRUZGX0JJVFM7CisKKyAgICAgICAgZCA9IGF2X2NsaXAoUk9VTkRFRF9ESVYoZCwgc2NhbGUpLCAtOCwgNyk7CisKKyAgICAgICAgcHV0X3NiaXRzKCZwYiwgNCwgZCk7CisKKyAgICAgICAgczAgPSAoKGQgPDwgQ09FRkZfQklUUykgKiBzY2FsZSArIGMtPmNvZWZmWzBdICogczEgKyBjLT5jb2VmZlsxXSAqIHMyKSA+PiBDT0VGRl9CSVRTOworICAgICAgICBzMiA9IHMxOworICAgICAgICBzMSA9IHMwOworICAgIH0KKyAgICBwcmV2LT5zMSA9IHMxOworICAgIHByZXYtPnMyID0gczI7CisKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworfQorCisjZGVmaW5lIEhFQURFUl9TSVpFIDM2CisKK3N0YXRpYyBpbnQgYWR4X2VuY29kZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB1aW50OF90ICpidWYsIGludCBidWZzaXplKQoreworICAgIEFEWENvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmYnVmLCAweDgwMDApOyAgICAgICAgICAgICAgLyogaGVhZGVyIHNpZ25hdHVyZSAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgSEVBREVSX1NJWkUgLSA0KTsgICAgIC8qIGNvcHlyaWdodCBvZmZzZXQgKi8KKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZidWYsIDMpOyAgICAgICAgICAgICAgICAgICAvKiBlbmNvZGluZyAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgQkxPQ0tfU0laRSk7ICAgICAgICAgIC8qIGJsb2NrIHNpemUgKi8KKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZidWYsIDQpOyAgICAgICAgICAgICAgICAgICAvKiBzYW1wbGUgc2l6ZSAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgYXZjdHgtPmNoYW5uZWxzKTsgICAgIC8qIGNoYW5uZWxzICovCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCBhdmN0eC0+c2FtcGxlX3JhdGUpOyAgLyogc2FtcGxlIHJhdGUgKi8KKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIDApOyAgICAgICAgICAgICAgICAgICAvKiB0b3RhbCBzYW1wbGUgY291bnQgKi8KKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZidWYsIGMtPmN1dG9mZik7ICAgICAgICAgICAvKiBjdXRvZmYgZnJlcXVlbmN5ICovCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCAzKTsgICAgICAgICAgICAgICAgICAgLyogdmVyc2lvbiAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgMCk7ICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzICovCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCAwKTsgICAgICAgICAgICAgICAgICAgLyogdW5rbm93biAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgMCk7ICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgZW5hYmxlZCAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgMCk7ICAgICAgICAgICAgICAgICAgIC8qIHBhZGRpbmcgKi8KKyAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJmJ1ZiwgIihjKUNSSSIsIDYpOyAgICAgICAvKiBjb3B5cmlnaHQgc2lnbmF0dXJlICovCisKKyAgICByZXR1cm4gSEVBREVSX1NJWkU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhZHhfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFEWENvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IDIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVsc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gQkxPQ0tfU0FNUExFUzsKKworICAgIC8qIHRoZSBjdXRvZmYgY2FuIGJlIGFkanVzdGVkLCBidXQgdGhpcyBzZWVtcyB0byB3b3JrIHByZXR0eSB3ZWxsICovCisgICAgYy0+Y3V0b2ZmID0gNTAwOworICAgIGZmX2FkeF9jYWxjdWxhdGVfY29lZmZzKGMtPmN1dG9mZiwgYXZjdHgtPnNhbXBsZV9yYXRlLCBDT0VGRl9CSVRTLCBjLT5jb2VmZik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHhfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIEFEWENvbnRleHQgKmMgICAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IGludDE2X3QgKnNhbXBsZXMgPSAoY29uc3QgaW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdOworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBpbnQgY2gsIG91dF9zaXplLCByZXQ7CisKKyAgICBvdXRfc2l6ZSA9IEJMT0NLX1NJWkUgKiBhdmN0eC0+Y2hhbm5lbHMgKyAhYy0+aGVhZGVyX3BhcnNlZCAqIEhFQURFUl9TSVpFOworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIG91dF9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGRzdCA9IGF2cGt0LT5kYXRhOworCisgICAgaWYgKCFjLT5oZWFkZXJfcGFyc2VkKSB7CisgICAgICAgIGludCBoZHJzaXplOworICAgICAgICBpZiAoKGhkcnNpemUgPSBhZHhfZW5jb2RlX2hlYWRlcihhdmN0eCwgZHN0LCBhdnBrdC0+c2l6ZSkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJvdXRwdXQgYnVmZmVyIGlzIHRvbyBzbWFsbFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGRzdCAgICAgICs9IGhkcnNpemU7CisgICAgICAgIGMtPmhlYWRlcl9wYXJzZWQgPSAxOworICAgIH0KKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICBhZHhfZW5jb2RlKGMsIGRzdCwgc2FtcGxlcyArIGNoLCAmYy0+cHJldltjaF0sIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIGRzdCArPSBCTE9DS19TSVpFOworICAgIH0KKworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfYWRwY21fYWR4X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFkcGNtX2FkeCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNFR0EgQ1JJIEFEWCBBRFBDTSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9BRFgsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFEWENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGFkeF9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBhZHhfZW5jb2RlX2ZyYW1lLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9haWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NzIzMDEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9haWMuYwpAQCAtMCwwICsxLDQ4NSBAQAorLyoKKyAqIEFwcGxlIEludGVybWVkaWF0ZSBDb2RlYyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAidW5hcnkuaCIKKworI2RlZmluZSBBSUNfSERSX1NJWkUgICAgMjQKKyNkZWZpbmUgQUlDX0JBTkRfQ09FRkZTICg2NCArIDMyICsgMTkyICsgOTYpCisKK2VudW0gQUlDQmFuZHMgeworICAgIENPRUZGX0xVTUEgPSAwLAorICAgIENPRUZGX0NIUk9NQSwKKyAgICBDT0VGRl9MVU1BX0VYVCwKKyAgICBDT0VGRl9DSFJPTUFfRVhULAorICAgIE5VTV9CQU5EUworfTsKKworc3RhdGljIGNvbnN0IGludCBhaWNfbnVtX2JhbmRfY29lZmZzW05VTV9CQU5EU10gPSB7IDY0LCAzMiwgMTkyLCA5NiB9OworCitzdGF0aWMgY29uc3QgaW50IGFpY19iYW5kX29mZltOVU1fQkFORFNdID0geyAwLCA2NCwgOTYsIDI4OCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhaWNfcXVhbnRfbWF0cml4WzY0XSA9IHsKKyAgICAgOCwgMTYsIDE5LCAyMiwgMjIsIDI2LCAyNiwgMjcsCisgICAgMTYsIDE2LCAyMiwgMjIsIDI2LCAyNywgMjcsIDI5LAorICAgIDE5LCAyMiwgMjYsIDI2LCAyNywgMjksIDI5LCAzNSwKKyAgICAyMiwgMjQsIDI3LCAyNywgMjksIDMyLCAzNCwgMzgsCisgICAgMjYsIDI3LCAyOSwgMjksIDMyLCAzNSwgMzgsIDQ2LAorICAgIDI3LCAyOSwgMzQsIDM0LCAzNSwgNDAsIDQ2LCA1NiwKKyAgICAyOSwgMzQsIDM0LCAzNywgNDAsIDQ4LCA1NiwgNjksCisgICAgMzQsIDM3LCAzOCwgNDAsIDQ4LCA1OCwgNjksIDgzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWljX3lfc2Nhbls2NF0gPSB7CisgICAgIDAsICA0LCAgMSwgIDIsICA1LCAgOCwgMTIsICA5LAorICAgICA2LCAgMywgIDcsIDEwLCAxMywgMTQsIDExLCAxNSwKKyAgICA0NywgNDMsIDQ2LCA0NSwgNDIsIDM5LCAzNSwgMzgsCisgICAgNDEsIDQ0LCA0MCwgMzcsIDM0LCAzMywgMzYsIDMyLAorICAgIDE2LCAyMCwgMTcsIDE4LCAyMSwgMjQsIDI4LCAyNSwKKyAgICAyMiwgMTksIDIzLCAyNiwgMjksIDMwLCAyNywgMzEsCisgICAgNjMsIDU5LCA2MiwgNjEsIDU4LCA1NSwgNTEsIDU0LAorICAgIDU3LCA2MCwgNTYsIDUzLCA1MCwgNDksIDUyLCA0OCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFpY195X2V4dF9zY2FuWzE5Ml0gPSB7CisgICAgIDY0LCAgNzIsICA2NSwgIDY2LCAgNzMsICA4MCwgIDg4LCAgODEsCisgICAgIDc0LCAgNjcsICA3NSwgIDgyLCAgODksICA5MCwgIDgzLCAgOTEsCisgICAgICAwLCAgIDQsICAgMSwgICAyLCAgIDUsICAgOCwgIDEyLCAgIDksCisgICAgICA2LCAgIDMsICAgNywgIDEwLCAgMTMsICAxNCwgIDExLCAgMTUsCisgICAgIDE2LCAgMjAsICAxNywgIDE4LCAgMjEsICAyNCwgIDI4LCAgMjUsCisgICAgIDIyLCAgMTksICAyMywgIDI2LCAgMjksICAzMCwgIDI3LCAgMzEsCisgICAgMTU1LCAxNDcsIDE1NCwgMTUzLCAxNDYsIDEzOSwgMTMxLCAxMzgsCisgICAgMTQ1LCAxNTIsIDE0NCwgMTM3LCAxMzAsIDEyOSwgMTM2LCAxMjgsCisgICAgIDQ3LCAgNDMsICA0NiwgIDQ1LCAgNDIsICAzOSwgIDM1LCAgMzgsCisgICAgIDQxLCAgNDQsICA0MCwgIDM3LCAgMzQsICAzMywgIDM2LCAgMzIsCisgICAgIDYzLCAgNTksICA2MiwgIDYxLCAgNTgsICA1NSwgIDUxLCAgNTQsCisgICAgIDU3LCAgNjAsICA1NiwgIDUzLCAgNTAsICA0OSwgIDUyLCAgNDgsCisgICAgIDk2LCAxMDQsICA5NywgIDk4LCAxMDUsIDExMiwgMTIwLCAxMTMsCisgICAgMTA2LCAgOTksIDEwNywgMTE0LCAxMjEsIDEyMiwgMTE1LCAxMjMsCisgICAgIDY4LCAgNzYsICA2OSwgIDcwLCAgNzcsICA4NCwgIDkyLCAgODUsCisgICAgIDc4LCAgNzEsICA3OSwgIDg2LCAgOTMsICA5NCwgIDg3LCAgOTUsCisgICAgMTAwLCAxMDgsIDEwMSwgMTAyLCAxMDksIDExNiwgMTI0LCAxMTcsCisgICAgMTEwLCAxMDMsIDExMSwgMTE4LCAxMjUsIDEyNiwgMTE5LCAxMjcsCisgICAgMTg3LCAxNzksIDE4NiwgMTg1LCAxNzgsIDE3MSwgMTYzLCAxNzAsCisgICAgMTc3LCAxODQsIDE3NiwgMTY5LCAxNjIsIDE2MSwgMTY4LCAxNjAsCisgICAgMTU5LCAxNTEsIDE1OCwgMTU3LCAxNTAsIDE0MywgMTM1LCAxNDIsCisgICAgMTQ5LCAxNTYsIDE0OCwgMTQxLCAxMzQsIDEzMywgMTQwLCAxMzIsCisgICAgMTkxLCAxODMsIDE5MCwgMTg5LCAxODIsIDE3NSwgMTY3LCAxNzQsCisgICAgMTgxLCAxODgsIDE4MCwgMTczLCAxNjYsIDE2NSwgMTcyLCAxNjQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhaWNfY19zY2FuWzY0XSA9IHsKKyAgICAgMCwgIDQsICAxLCAgMiwgIDUsICA4LCAxMiwgIDksCisgICAgIDYsICAzLCAgNywgMTAsIDEzLCAxNCwgMTEsIDE1LAorICAgIDMxLCAyNywgMzAsIDI5LCAyNiwgMjMsIDE5LCAyMiwKKyAgICAyNSwgMjgsIDI0LCAyMSwgMTgsIDE3LCAyMCwgMTYsCisgICAgMzIsIDM2LCAzMywgMzQsIDM3LCA0MCwgNDQsIDQxLAorICAgIDM4LCAzNSwgMzksIDQyLCA0NSwgNDYsIDQzLCA0NywKKyAgICA2MywgNTksIDYyLCA2MSwgNTgsIDU1LCA1MSwgNTQsCisgICAgNTcsIDYwLCA1NiwgNTMsIDUwLCA0OSwgNTIsIDQ4LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWljX2NfZXh0X3NjYW5bMTkyXSA9IHsKKyAgICAgMTYsICAyNCwgIDE3LCAgMTgsICAyNSwgIDMyLCAgNDAsICAzMywKKyAgICAgMjYsICAxOSwgIDI3LCAgMzQsICA0MSwgIDQyLCAgMzUsICA0MywKKyAgICAgIDAsICAgNCwgICAxLCAgIDIsICAgNSwgICA4LCAgMTIsICAgOSwKKyAgICAgIDYsICAgMywgICA3LCAgMTAsICAxMywgIDE0LCAgMTEsICAxNSwKKyAgICAgMjAsICAyOCwgIDIxLCAgMjIsICAyOSwgIDM2LCAgNDQsICAzNywKKyAgICAgMzAsICAyMywgIDMxLCAgMzgsICA0NSwgIDQ2LCAgMzksICA0NywKKyAgICAgOTUsICA4NywgIDk0LCAgOTMsICA4NiwgIDc5LCAgNzEsICA3OCwKKyAgICAgODUsICA5MiwgIDg0LCAgNzcsICA3MCwgIDY5LCAgNzYsICA2OCwKKyAgICAgNjMsICA1OSwgIDYyLCAgNjEsICA1OCwgIDU1LCAgNTEsICA1NCwKKyAgICAgNTcsICA2MCwgIDU2LCAgNTMsICA1MCwgIDQ5LCAgNTIsICA0OCwKKyAgICAgOTEsICA4MywgIDkwLCAgODksICA4MiwgIDc1LCAgNjcsICA3NCwKKyAgICAgODEsICA4OCwgIDgwLCAgNzMsICA2NiwgIDY1LCAgNzIsICA2NCwKKyAgICAxMTIsIDEyMCwgMTEzLCAxMTQsIDEyMSwgMTI4LCAxMzYsIDEyOSwKKyAgICAxMjIsIDExNSwgMTIzLCAxMzAsIDEzNywgMTM4LCAxMzEsIDEzOSwKKyAgICAgOTYsIDEwMCwgIDk3LCAgOTgsIDEwMSwgMTA0LCAxMDgsIDEwNSwKKyAgICAxMDIsICA5OSwgMTAzLCAxMDYsIDEwOSwgMTEwLCAxMDcsIDExMSwKKyAgICAxMTYsIDEyNCwgMTE3LCAxMTgsIDEyNSwgMTMyLCAxNDAsIDEzMywKKyAgICAxMjYsIDExOSwgMTI3LCAxMzQsIDE0MSwgMTQyLCAxMzUsIDE0MywKKyAgICAxOTEsIDE4MywgMTkwLCAxODksIDE4MiwgMTc1LCAxNjcsIDE3NCwKKyAgICAxODEsIDE4OCwgMTgwLCAxNzMsIDE2NiwgMTY1LCAxNzIsIDE2NCwKKyAgICAxNTksIDE1NSwgMTU4LCAxNTcsIDE1NCwgMTUxLCAxNDcsIDE1MCwKKyAgICAxNTMsIDE1NiwgMTUyLCAxNDksIDE0NiwgMTQ1LCAxNDgsIDE0NCwKKyAgICAxODcsIDE3OSwgMTg2LCAxODUsIDE3OCwgMTcxLCAxNjMsIDE3MCwKKyAgICAxNzcsIDE4NCwgMTc2LCAxNjksIDE2MiwgMTYxLCAxNjgsIDE2MCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90ICogY29uc3QgYWljX3NjYW5bTlVNX0JBTkRTXSA9IHsKKyAgICBhaWNfeV9zY2FuLCBhaWNfY19zY2FuLCBhaWNfeV9leHRfc2NhbiwgYWljX2NfZXh0X3NjYW4KK307CisKK3R5cGVkZWYgc3RydWN0IEFJQ0NvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBVkZyYW1lICAgICAgICAqZnJhbWU7CisgICAgSURDVERTUENvbnRleHQgaWRzcDsKKyAgICBTY2FuVGFibGUgICAgICBzY2FudGFibGU7CisKKyAgICBpbnQgICAgICAgICAgICBudW1feF9zbGljZXM7CisgICAgaW50ICAgICAgICAgICAgc2xpY2Vfd2lkdGg7CisgICAgaW50ICAgICAgICAgICAgbWJfd2lkdGgsIG1iX2hlaWdodDsKKyAgICBpbnQgICAgICAgICAgICBxdWFudDsKKyAgICBpbnQgICAgICAgICAgICBpbnRlcmxhY2VkOworCisgICAgaW50MTZfdCAgICAgICAgKnNsaWNlX2RhdGE7CisgICAgaW50MTZfdCAgICAgICAgKmRhdGFfcHRyW05VTV9CQU5EU107CisKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrKVs2NF07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBxdWFudF9tYXRyaXgpWzY0XTsKK30gQUlDQ29udGV4dDsKKworc3RhdGljIGludCBhaWNfZGVjb2RlX2hlYWRlcihBSUNDb250ZXh0ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNpemUpCit7CisgICAgdWludDMyX3QgZnJhbWVfc2l6ZTsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKworICAgIGlmIChzcmNbMF0gIT0gMSkgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCB2ZXJzaW9uICVkXG4iLCBzcmNbMF0pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKHNyY1sxXSAhPSBBSUNfSERSX1NJWkUgLSAyKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGhlYWRlciBzaXplICVkXG4iLCBzcmNbMV0pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZnJhbWVfc2l6ZSA9IEFWX1JCMzIoc3JjICsgMik7CisgICAgd2lkdGggICAgICA9IEFWX1JCMTYoc3JjICsgNik7CisgICAgaGVpZ2h0ICAgICA9IEFWX1JCMTYoc3JjICsgOCk7CisgICAgaWYgKGZyYW1lX3NpemUgPiBzaXplKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJGcmFtZSBzaXplIHNob3VsZCBiZSAlIlBSSXUzMiIgZ290ICVkXG4iLAorICAgICAgICAgICAgICAgZnJhbWVfc2l6ZSwgc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAod2lkdGggIT0gY3R4LT5hdmN0eC0+d2lkdGggfHwgaGVpZ2h0ICE9IGN0eC0+YXZjdHgtPmhlaWdodCkgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlBpY3R1cmUgZGltZW5zaW9uIGNoYW5nZWQ6IG9sZDogJWQgeCAlZCwgbmV3OiAlZCB4ICVkXG4iLAorICAgICAgICAgICAgICAgY3R4LT5hdmN0eC0+d2lkdGgsIGN0eC0+YXZjdHgtPmhlaWdodCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBjdHgtPnF1YW50ICAgICAgPSBzcmNbMTVdOworICAgIGN0eC0+aW50ZXJsYWNlZCA9ICgoc3JjWzE2XSA+PiA0KSA9PSAzKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEdFVF9DT0RFKHZhbCwgdHlwZSwgYWRkX2JpdHMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2YWwgPSBnZXRfdWVfZ29sb21iKGdiKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmFsID0gZ2V0X3VuYXJ5KGdiLCAxLCAzMSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChhZGRfYml0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgYWRkX2JpdHMpICsgZ2V0X2JpdHMoZ2IsIGFkZF9iaXRzKTsgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgYWljX2RlY29kZV9jb2VmZnMoR2V0Qml0Q29udGV4dCAqZ2IsIGludDE2X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhbmQsIGludCBzbGljZV93aWR0aCwgaW50IGZvcmNlX2Nocm9tYSkKK3sKKyAgICBpbnQgaGFzX3NraXBzLCBjb2VmZl90eXBlLCBjb2VmZl9iaXRzLCBza2lwX3R5cGUsIHNraXBfYml0czsKKyAgICBjb25zdCBpbnQgbnVtX2NvZWZmcyA9IGFpY19udW1fYmFuZF9jb2VmZnNbYmFuZF07CisgICAgY29uc3QgdWludDhfdCAqc2NhbiA9IGFpY19zY2FuW2JhbmQgfCBmb3JjZV9jaHJvbWFdOworICAgIGludCBtYiwgaWR4OworICAgIHVuc2lnbmVkIHZhbDsKKworICAgIGhhc19za2lwcyAgPSBnZXRfYml0czEoZ2IpOworICAgIGNvZWZmX3R5cGUgPSBnZXRfYml0czEoZ2IpOworICAgIGNvZWZmX2JpdHMgPSBnZXRfYml0cyhnYiwgMyk7CisKKyAgICBpZiAoaGFzX3NraXBzKSB7CisgICAgICAgIHNraXBfdHlwZSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIHNraXBfYml0cyA9IGdldF9iaXRzKGdiLCAzKTsKKworICAgICAgICBmb3IgKG1iID0gMDsgbWIgPCBzbGljZV93aWR0aDsgbWIrKykgeworICAgICAgICAgICAgaWR4ID0gLTE7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgR0VUX0NPREUodmFsLCBza2lwX3R5cGUsIHNraXBfYml0cyk7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA+PSAweDEwMDAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBpZHggKz0gdmFsICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ID49IG51bV9jb2VmZnMpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIEdFVF9DT0RFKHZhbCwgY29lZmZfdHlwZSwgY29lZmZfYml0cyk7CisgICAgICAgICAgICAgICAgdmFsKys7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA+PSAweDEwMDAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBkc3Rbc2NhbltpZHhdXSA9IHZhbDsKKyAgICAgICAgICAgIH0gd2hpbGUgKGlkeCA8IG51bV9jb2VmZnMgLSAxKTsKKyAgICAgICAgICAgIGRzdCArPSBudW1fY29lZmZzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChtYiA9IDA7IG1iIDwgc2xpY2Vfd2lkdGg7IG1iKyspIHsKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbnVtX2NvZWZmczsgaWR4KyspIHsKKyAgICAgICAgICAgICAgICBHRVRfQ09ERSh2YWwsIGNvZWZmX3R5cGUsIGNvZWZmX2JpdHMpOworICAgICAgICAgICAgICAgIGlmICh2YWwgPj0gMHgxMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZHN0W3NjYW5baWR4XV0gPSB2YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3QgKz0gbnVtX2NvZWZmczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVjb21iaW5lX2Jsb2NrKGludDE2X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICoqYmFzZSwgaW50MTZfdCAqKmV4dCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgIGRzdFtzY2FuW2kgKiA4ICsgal1dICAgICA9ICgqYmFzZSlbal07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICBkc3Rbc2NhbltpICogOCArIGogKyA0XV0gPSAoKmV4dClbal07CisgICAgICAgICpiYXNlICs9IDQ7CisgICAgICAgICpleHQgICs9IDQ7CisgICAgfQorICAgIGZvciAoOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICBkc3Rbc2NhbltpICogOCArIGpdXSA9ICgqZXh0KVtqXTsKKyAgICAgICAgKmV4dCAgKz0gODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlY29tYmluZV9ibG9ja19pbChpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqKmJhc2UsIGludDE2X3QgKipleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX25vKQoreworICAgIGludCBpLCBqOworCisgICAgaWYgKGJsb2NrX25vIDwgMikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgICAgIGRzdFtzY2FuW2kgKiA4ICsgal1dICAgICA9ICgqYmFzZSlbal07CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgICAgIGRzdFtzY2FuW2kgKiA4ICsgaiArIDRdXSA9ICgqZXh0KVtqXTsKKyAgICAgICAgICAgICpiYXNlICs9IDQ7CisgICAgICAgICAgICAqZXh0ICArPSA0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICBkc3Rbc2NhbltpXV0gPSAoKmV4dClbaV07CisgICAgICAgICpleHQgKz0gNjQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1bnF1YW50X2Jsb2NrKGludDE2X3QgKmJsb2NrLCBpbnQgcSwgdWludDhfdCAqcXVhbnRfbWF0cml4KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgaW50IHZhbCAgPSAodWludDE2X3QpYmxvY2tbaV07CisgICAgICAgIGludCBzaWduID0gdmFsICYgMTsKKworICAgICAgICBibG9ja1tpXSA9ICgoKHZhbCA+PiAxKSBeIC1zaWduKSAqIHEgKiBxdWFudF9tYXRyaXhbaV0gPj4gNCkKKyAgICAgICAgICAgICAgICAgICArIHNpZ247CisgICAgfQorfQorCitzdGF0aWMgaW50IGFpY19kZWNvZGVfc2xpY2UoQUlDQ29udGV4dCAqY3R4LCBpbnQgbWJfeCwgaW50IG1iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3NpemUpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgcmV0LCBpLCBtYiwgYmxrOworICAgIGludCBzbGljZV93aWR0aCA9IEZGTUlOKGN0eC0+c2xpY2Vfd2lkdGgsIGN0eC0+bWJfd2lkdGggLSBtYl94KTsKKyAgICB1aW50OF90ICpZLCAqQ1syXTsKKyAgICB1aW50OF90ICpkc3Q7CisgICAgaW50MTZfdCAqYmFzZV95ID0gY3R4LT5kYXRhX3B0cltDT0VGRl9MVU1BXTsKKyAgICBpbnQxNl90ICpiYXNlX2MgPSBjdHgtPmRhdGFfcHRyW0NPRUZGX0NIUk9NQV07CisgICAgaW50MTZfdCAqZXh0X3kgID0gY3R4LT5kYXRhX3B0cltDT0VGRl9MVU1BX0VYVF07CisgICAgaW50MTZfdCAqZXh0X2MgID0gY3R4LT5kYXRhX3B0cltDT0VGRl9DSFJPTUFfRVhUXTsKKyAgICBjb25zdCBpbnQgeXN0cmlkZSA9IGN0eC0+ZnJhbWUtPmxpbmVzaXplWzBdOworCisgICAgWSA9IGN0eC0+ZnJhbWUtPmRhdGFbMF0gKyBtYl94ICogMTYgKyBtYl95ICogMTYgKiB5c3RyaWRlOworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIENbaV0gPSBjdHgtPmZyYW1lLT5kYXRhW2kgKyAxXSArIG1iX3ggKiA4CisgICAgICAgICAgICAgICArIG1iX3kgKiA4ICogY3R4LT5mcmFtZS0+bGluZXNpemVbaSArIDFdOworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBzcmMsIHNyY19zaXplICogOCk7CisKKyAgICBtZW1zZXQoY3R4LT5zbGljZV9kYXRhLCAwLAorICAgICAgICAgICBzaXplb2YoKmN0eC0+c2xpY2VfZGF0YSkgKiBzbGljZV93aWR0aCAqIEFJQ19CQU5EX0NPRUZGUyk7CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9CQU5EUzsgaSsrKQorICAgICAgICBpZiAoKHJldCA9IGFpY19kZWNvZGVfY29lZmZzKCZnYiwgY3R4LT5kYXRhX3B0cltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzbGljZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY3R4LT5pbnRlcmxhY2VkKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAobWIgPSAwOyBtYiA8IHNsaWNlX3dpZHRoOyBtYisrKSB7CisgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgNDsgYmxrKyspIHsKKyAgICAgICAgICAgIGlmICghY3R4LT5pbnRlcmxhY2VkKQorICAgICAgICAgICAgICAgIHJlY29tYmluZV9ibG9jayhjdHgtPmJsb2NrLCBjdHgtPnNjYW50YWJsZS5wZXJtdXRhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzZV95LCAmZXh0X3kpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlY29tYmluZV9ibG9ja19pbChjdHgtPmJsb2NrLCBjdHgtPnNjYW50YWJsZS5wZXJtdXRhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzZV95LCAmZXh0X3ksIGJsayk7CisgICAgICAgICAgICB1bnF1YW50X2Jsb2NrKGN0eC0+YmxvY2ssIGN0eC0+cXVhbnQsIGN0eC0+cXVhbnRfbWF0cml4KTsKKyAgICAgICAgICAgIGN0eC0+aWRzcC5pZGN0KGN0eC0+YmxvY2spOworCisgICAgICAgICAgICBpZiAoIWN0eC0+aW50ZXJsYWNlZCkgeworICAgICAgICAgICAgICAgIGRzdCA9IFkgKyAoYmxrID4+IDEpICogOCAqIHlzdHJpZGUgKyAoYmxrICYgMSkgKiA4OworICAgICAgICAgICAgICAgIGN0eC0+aWRzcC5wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkKGN0eC0+YmxvY2ssIGRzdCwgeXN0cmlkZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRzdCA9IFkgKyAoYmxrICYgMSkgKiA4ICsgKGJsayA+PiAxKSAqIHlzdHJpZGU7CisgICAgICAgICAgICAgICAgY3R4LT5pZHNwLnB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQoY3R4LT5ibG9jaywgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdHJpZGUgKiAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBZICs9IDE2OworCisgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgMjsgYmxrKyspIHsKKyAgICAgICAgICAgIHJlY29tYmluZV9ibG9jayhjdHgtPmJsb2NrLCBjdHgtPnNjYW50YWJsZS5wZXJtdXRhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXNlX2MsICZleHRfYyk7CisgICAgICAgICAgICB1bnF1YW50X2Jsb2NrKGN0eC0+YmxvY2ssIGN0eC0+cXVhbnQsIGN0eC0+cXVhbnRfbWF0cml4KTsKKyAgICAgICAgICAgIGN0eC0+aWRzcC5pZGN0KGN0eC0+YmxvY2spOworICAgICAgICAgICAgY3R4LT5pZHNwLnB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQoY3R4LT5ibG9jaywgQ1tibGtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5mcmFtZS0+bGluZXNpemVbYmxrICsgMV0pOworICAgICAgICAgICAgQ1tibGtdICs9IDg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFJQ0NvbnRleHQgKmN0eCAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgdWludDMyX3Qgb2ZmOworICAgIGludCB4LCB5LCByZXQ7CisgICAgaW50IHNsaWNlX3NpemU7CisKKyAgICBjdHgtPmZyYW1lICAgICAgICAgICAgPSBkYXRhOworICAgIGN0eC0+ZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGN0eC0+ZnJhbWUtPmtleV9mcmFtZSA9IDE7CisKKyAgICBvZmYgPSBGRkFMSUdOKEFJQ19IRFJfU0laRSArIGN0eC0+bnVtX3hfc2xpY2VzICogY3R4LT5tYl9oZWlnaHQgKiAyLCA0KTsKKworICAgIGlmIChidWZfc2l6ZSA8IG9mZikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBzbWFsbCBmcmFtZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gYWljX2RlY29kZV9oZWFkZXIoY3R4LCBidWYsIGJ1Zl9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBjdHgtPmZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGJ1ZiArIEFJQ19IRFJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgIGN0eC0+bnVtX3hfc2xpY2VzICogY3R4LT5tYl9oZWlnaHQgKiAyKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBjdHgtPm1iX2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBjdHgtPm1iX3dpZHRoOyB4ICs9IGN0eC0+c2xpY2Vfd2lkdGgpIHsKKyAgICAgICAgICAgIHNsaWNlX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpICogNDsKKyAgICAgICAgICAgIGlmIChzbGljZV9zaXplICsgb2ZmID4gYnVmX3NpemUgfHwgIXNsaWNlX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29ycmVjdCBzbGljZSBzaXplXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChyZXQgPSBhaWNfZGVjb2RlX3NsaWNlKGN0eCwgeCwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgKyBvZmYsIHNsaWNlX3NpemUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgb2ZmICs9IHNsaWNlX3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFpY19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQUlDQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKyAgICB1aW50OF90IHNjYW5bNjRdOworCisgICAgY3R4LT5hdmN0eCA9IGF2Y3R4OworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisKKyAgICBmZl9pZGN0ZHNwX2luaXQoJmN0eC0+aWRzcCwgYXZjdHgpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgIHNjYW5baV0gPSBpOworICAgIGZmX2luaXRfc2NhbnRhYmxlKGN0eC0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmY3R4LT5zY2FudGFibGUsIHNjYW4pOworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICBjdHgtPnF1YW50X21hdHJpeFtjdHgtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltpXV0gPSBhaWNfcXVhbnRfbWF0cml4W2ldOworCisgICAgY3R4LT5tYl93aWR0aCAgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgIDE2KSA+PiA0OworICAgIGN0eC0+bWJfaGVpZ2h0ID0gRkZBTElHTihhdmN0eC0+aGVpZ2h0LCAxNikgPj4gNDsKKworICAgIGN0eC0+bnVtX3hfc2xpY2VzID0gMTY7CisgICAgY3R4LT5zbGljZV93aWR0aCAgPSBjdHgtPm1iX3dpZHRoIC8gMTY7CisgICAgZm9yIChpID0gMTsgaSA8IDMyOyBpKyspIHsKKyAgICAgICAgaWYgKCEoY3R4LT5tYl93aWR0aCAlIGkpICYmIChjdHgtPm1iX3dpZHRoIC8gaSA8IDMyKSkgeworICAgICAgICAgICAgY3R4LT5zbGljZV93aWR0aCAgPSBjdHgtPm1iX3dpZHRoIC8gaTsKKyAgICAgICAgICAgIGN0eC0+bnVtX3hfc2xpY2VzID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgY3R4LT5zbGljZV9kYXRhID0gYXZfbWFsbG9jKGN0eC0+c2xpY2Vfd2lkdGggKiBBSUNfQkFORF9DT0VGRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoKmN0eC0+c2xpY2VfZGF0YSkpOworICAgIGlmICghY3R4LT5zbGljZV9kYXRhKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYWxsb2NhdGluZyBzbGljZSBidWZmZXJcbiIpOworCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9CQU5EUzsgaSsrKQorICAgICAgICBjdHgtPmRhdGFfcHRyW2ldID0gY3R4LT5zbGljZV9kYXRhICsgY3R4LT5zbGljZV93aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhaWNfYmFuZF9vZmZbaV07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFpY19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFJQ0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5zbGljZV9kYXRhKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2FpY19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhaWMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBsZSBJbnRlcm1lZGlhdGUgQ29kZWMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQUlDLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBSUNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBhaWNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gYWljX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBhaWNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWxhYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYzdiYjQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hbGFjLmMKQEAgLTAsMCArMSw2NjcgQEAKKy8qCisgKiBBTEFDIChBcHBsZSBMb3NzbGVzcyBBdWRpbyBDb2RlYykgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIEhhbW1lcnRvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBTEFDIChBcHBsZSBMb3NzbGVzcyBBdWRpbyBDb2RlYykgZGVjb2RlcgorICogQGF1dGhvciAyMDA1IERhdmlkIEhhbW1lcnRvbgorICogQHNlZSBodHRwOi8vY3Jhem5leS5uZXQvcHJvZ3JhbXMvaXR1bmVzL2FsYWMuaHRtbAorICoKKyAqIE5vdGU6IFRoaXMgZGVjb2RlciBleHBlY3RzIGEgMzYtYnl0ZSBRdWlja1RpbWUgYXRvbSB0byBiZQorICogcGFzc2VkIHRocm91Z2ggdGhlIGV4dHJhZGF0YVtfc2l6ZV0gZmllbGRzLiBUaGlzIGF0b20gaXMgdGFja2VkIG9udG8KKyAqIHRoZSBlbmQgb2YgYW4gJ2FsYWMnIHN0c2QgYXRvbSBhbmQgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICoKKyAqIDMyYml0ICBhdG9tIHNpemUKKyAqIDMyYml0ICB0YWcgICAgICAgICAgICAgICAgICAoImFsYWMiKQorICogMzJiaXQgIHRhZyB2ZXJzaW9uICAgICAgICAgICgwKQorICogMzJiaXQgIHNhbXBsZXMgcGVyIGZyYW1lICAgICh1c2VkIHdoZW4gbm90IHNldCBleHBsaWNpdGx5IGluIHRoZSBmcmFtZXMpCisgKiAgOGJpdCAgY29tcGF0aWJsZSB2ZXJzaW9uICAgKDApCisgKiAgOGJpdCAgc2FtcGxlIHNpemUKKyAqICA4Yml0ICBoaXN0b3J5IG11bHQgICAgICAgICAoNDApCisgKiAgOGJpdCAgaW5pdGlhbCBoaXN0b3J5ICAgICAgKDEwKQorICogIDhiaXQgIHJpY2UgcGFyYW0gbGltaXQgICAgICgxNCkKKyAqICA4Yml0ICBjaGFubmVscworICogMTZiaXQgIG1heFJ1biAgICAgICAgICAgICAgICgyNTUpCisgKiAzMmJpdCAgbWF4IGNvZGVkIGZyYW1lIHNpemUgKDAgbWVhbnMgdW5rbm93bikKKyAqIDMyYml0ICBhdmVyYWdlIGJpdHJhdGUgICAgICAoMCBtZWFucyB1bmtub3duKQorICogMzJiaXQgIHNhbXBsZXJhdGUKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJhbGFjX2RhdGEuaCIKKworI2RlZmluZSBBTEFDX0VYVFJBREFUQV9TSVpFIDM2CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgY2hhbm5lbHM7CisKKyAgICBpbnQzMl90ICpwcmVkaWN0X2Vycm9yX2J1ZmZlclsyXTsKKyAgICBpbnQzMl90ICpvdXRwdXRfc2FtcGxlc19idWZmZXJbMl07CisgICAgaW50MzJfdCAqZXh0cmFfYml0c19idWZmZXJbMl07CisKKyAgICB1aW50MzJfdCBtYXhfc2FtcGxlc19wZXJfZnJhbWU7CisgICAgdWludDhfdCAgc2FtcGxlX3NpemU7CisgICAgdWludDhfdCAgcmljZV9oaXN0b3J5X211bHQ7CisgICAgdWludDhfdCAgcmljZV9pbml0aWFsX2hpc3Rvcnk7CisgICAgdWludDhfdCAgcmljZV9saW1pdDsKKworICAgIGludCBleHRyYV9iaXRzOyAgICAgLyoqPCBudW1iZXIgb2YgZXh0cmEgYml0cyBiZXlvbmQgMTYtYml0ICovCisgICAgaW50IG5iX3NhbXBsZXM7ICAgICAvKio8IG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBjdXJyZW50IGZyYW1lICovCisKKyAgICBpbnQgZGlyZWN0X291dHB1dDsKKyAgICBpbnQgZXh0cmFfYml0X2J1ZzsKK30gQUxBQ0NvbnRleHQ7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRlY29kZV9zY2FsYXIoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBrLCBpbnQgYnBzKQoreworICAgIHVuc2lnbmVkIGludCB4ID0gZ2V0X3VuYXJ5XzBfOShnYik7CisKKyAgICBpZiAoeCA+IDgpIHsgLyogUklDRSBUSFJFU0hPTEQgKi8KKyAgICAgICAgLyogdXNlIGFsdGVybmF0aXZlIGVuY29kaW5nICovCisgICAgICAgIHggPSBnZXRfYml0c19sb25nKGdiLCBicHMpOworICAgIH0gZWxzZSBpZiAoayAhPSAxKSB7CisgICAgICAgIGludCBleHRyYWJpdHMgPSBzaG93X2JpdHMoZ2IsIGspOworCisgICAgICAgIC8qIG11bHRpcGx5IHggYnkgMl5rIC0gMSwgYXMgcGFydCBvZiB0aGVpciBzdHJhbmdlIGFsZ29yaXRobSAqLworICAgICAgICB4ID0gKHggPDwgaykgLSB4OworCisgICAgICAgIGlmIChleHRyYWJpdHMgPiAxKSB7CisgICAgICAgICAgICB4ICs9IGV4dHJhYml0cyAtIDE7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIGspOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgayAtIDEpOworICAgIH0KKyAgICByZXR1cm4geDsKK30KKworc3RhdGljIGludCByaWNlX2RlY29tcHJlc3MoQUxBQ0NvbnRleHQgKmFsYWMsIGludDMyX3QgKm91dHB1dF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCBicHMsIGludCByaWNlX2hpc3RvcnlfbXVsdCkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBpbnQgaGlzdG9yeSA9IGFsYWMtPnJpY2VfaW5pdGlhbF9oaXN0b3J5OworICAgIGludCBzaWduX21vZGlmaWVyID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgaW50IGs7CisgICAgICAgIHVuc2lnbmVkIGludCB4OworCisgICAgICAgIGlmKGdldF9iaXRzX2xlZnQoJmFsYWMtPmdiKSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIC8qIGNhbGN1bGF0ZSByaWNlIHBhcmFtIGFuZCBkZWNvZGUgbmV4dCB2YWx1ZSAqLworICAgICAgICBrID0gYXZfbG9nMigoaGlzdG9yeSA+PiA5KSArIDMpOworICAgICAgICBrID0gRkZNSU4oaywgYWxhYy0+cmljZV9saW1pdCk7CisgICAgICAgIHggPSBkZWNvZGVfc2NhbGFyKCZhbGFjLT5nYiwgaywgYnBzKTsKKyAgICAgICAgeCArPSBzaWduX21vZGlmaWVyOworICAgICAgICBzaWduX21vZGlmaWVyID0gMDsKKyAgICAgICAgb3V0cHV0X2J1ZmZlcltpXSA9ICh4ID4+IDEpIF4gLSh4ICYgMSk7CisKKyAgICAgICAgLyogdXBkYXRlIHRoZSBoaXN0b3J5ICovCisgICAgICAgIGlmICh4ID4gMHhmZmZmKQorICAgICAgICAgICAgaGlzdG9yeSA9IDB4ZmZmZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGlzdG9yeSArPSAgICAgICAgIHggKiByaWNlX2hpc3RvcnlfbXVsdCAtCisgICAgICAgICAgICAgICAgICAgICAgICgoaGlzdG9yeSAqIHJpY2VfaGlzdG9yeV9tdWx0KSA+PiA5KTsKKworICAgICAgICAvKiBzcGVjaWFsIGNhc2U6IHRoZXJlIG1heSBiZSBjb21wcmVzc2VkIGJsb2NrcyBvZiAwICovCisgICAgICAgIGlmICgoaGlzdG9yeSA8IDEyOCkgJiYgKGkgKyAxIDwgbmJfc2FtcGxlcykpIHsKKyAgICAgICAgICAgIGludCBibG9ja19zaXplOworCisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgcmljZSBwYXJhbSBhbmQgZGVjb2RlIGJsb2NrIHNpemUgKi8KKyAgICAgICAgICAgIGsgPSA3IC0gYXZfbG9nMihoaXN0b3J5KSArICgoaGlzdG9yeSArIDE2KSA+PiA2KTsKKyAgICAgICAgICAgIGsgPSBGRk1JTihrLCBhbGFjLT5yaWNlX2xpbWl0KTsKKyAgICAgICAgICAgIGJsb2NrX3NpemUgPSBkZWNvZGVfc2NhbGFyKCZhbGFjLT5nYiwgaywgMTYpOworCisgICAgICAgICAgICBpZiAoYmxvY2tfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2tfc2l6ZSA+PSBuYl9zYW1wbGVzIC0gaSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYWxhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHplcm8gYmxvY2sgc2l6ZSBvZiAlZCAlZCAlZFxuIiwgYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX3NhbXBsZXMsIGkpOworICAgICAgICAgICAgICAgICAgICBibG9ja19zaXplID0gbmJfc2FtcGxlcyAtIGkgLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1zZXQoJm91dHB1dF9idWZmZXJbaSArIDFdLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBibG9ja19zaXplICogc2l6ZW9mKCpvdXRwdXRfYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgaSArPSBibG9ja19zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJsb2NrX3NpemUgPD0gMHhmZmZmKQorICAgICAgICAgICAgICAgIHNpZ25fbW9kaWZpZXIgPSAxOworICAgICAgICAgICAgaGlzdG9yeSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNpZ25fb25seShpbnQgdikKK3sKKyAgICByZXR1cm4gdiA/IEZGU0lHTih2KSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGxwY19wcmVkaWN0aW9uKGludDMyX3QgKmVycm9yX2J1ZmZlciwgaW50MzJfdCAqYnVmZmVyX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLCBpbnQgYnBzLCBpbnQxNl90ICpscGNfY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHBjX29yZGVyLCBpbnQgbHBjX3F1YW50KQoreworICAgIGludCBpOworICAgIGludDMyX3QgKnByZWQgPSBidWZmZXJfb3V0OworCisgICAgLyogZmlyc3Qgc2FtcGxlIGFsd2F5cyBjb3BpZXMgKi8KKyAgICAqYnVmZmVyX291dCA9ICplcnJvcl9idWZmZXI7CisKKyAgICBpZiAobmJfc2FtcGxlcyA8PSAxKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWxwY19vcmRlcikgeworICAgICAgICBtZW1jcHkoJmJ1ZmZlcl9vdXRbMV0sICZlcnJvcl9idWZmZXJbMV0sCisgICAgICAgICAgICAgICAobmJfc2FtcGxlcyAtIDEpICogc2l6ZW9mKCpidWZmZXJfb3V0KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobHBjX29yZGVyID09IDMxKSB7CisgICAgICAgIC8qIHNpbXBsZSAxc3Qtb3JkZXIgcHJlZGljdGlvbiAqLworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBidWZmZXJfb3V0W2ldID0gc2lnbl9leHRlbmQoYnVmZmVyX291dFtpIC0gMV0gKyBlcnJvcl9idWZmZXJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogcmVhZCB3YXJtLXVwIHNhbXBsZXMgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDw9IGxwY19vcmRlciAmJiBpIDwgbmJfc2FtcGxlczsgaSsrKQorICAgICAgICBidWZmZXJfb3V0W2ldID0gc2lnbl9leHRlbmQoYnVmZmVyX291dFtpIC0gMV0gKyBlcnJvcl9idWZmZXJbaV0sIGJwcyk7CisKKyAgICAvKiBOT1RFOiA0IGFuZCA4IGFyZSB2ZXJ5IGNvbW1vbiBjYXNlcyB0aGF0IGNvdWxkIGJlIG9wdGltaXplZC4gKi8KKworICAgIGZvciAoOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludCBqOworICAgICAgICBpbnQgdmFsID0gMDsKKyAgICAgICAgaW50IGVycm9yX3ZhbCA9IGVycm9yX2J1ZmZlcltpXTsKKyAgICAgICAgaW50IGVycm9yX3NpZ247CisgICAgICAgIGludCBkID0gKnByZWQrKzsKKworICAgICAgICAvKiBMUEMgcHJlZGljdGlvbiAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbHBjX29yZGVyOyBqKyspCisgICAgICAgICAgICB2YWwgKz0gKHByZWRbal0gLSBkKSAqIGxwY19jb2Vmc1tqXTsKKyAgICAgICAgdmFsID0gKHZhbCArICgxIDw8IChscGNfcXVhbnQgLSAxKSkpID4+IGxwY19xdWFudDsKKyAgICAgICAgdmFsICs9IGQgKyBlcnJvcl92YWw7CisgICAgICAgIGJ1ZmZlcl9vdXRbaV0gPSBzaWduX2V4dGVuZCh2YWwsIGJwcyk7CisKKyAgICAgICAgLyogYWRhcHQgTFBDIGNvZWZmaWNpZW50cyAqLworICAgICAgICBlcnJvcl9zaWduID0gc2lnbl9vbmx5KGVycm9yX3ZhbCk7CisgICAgICAgIGlmIChlcnJvcl9zaWduKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbHBjX29yZGVyICYmIGVycm9yX3ZhbCAqIGVycm9yX3NpZ24gPiAwOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc2lnbjsKKyAgICAgICAgICAgICAgICB2YWwgID0gZCAtIHByZWRbal07CisgICAgICAgICAgICAgICAgc2lnbiA9IHNpZ25fb25seSh2YWwpICogZXJyb3Jfc2lnbjsKKyAgICAgICAgICAgICAgICBscGNfY29lZnNbal0gLT0gc2lnbjsKKyAgICAgICAgICAgICAgICB2YWwgKj0gc2lnbjsKKyAgICAgICAgICAgICAgICBlcnJvcl92YWwgLT0gKHZhbCA+PiBscGNfcXVhbnQpICogKGogKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb3JyZWxhdGVfc3RlcmVvKGludDMyX3QgKmJ1ZmZlclsyXSwgaW50IG5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY29ycl9zaGlmdCwgaW50IGRlY29ycl9sZWZ0X3dlaWdodCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgaW50MzJfdCBhLCBiOworCisgICAgICAgIGEgPSBidWZmZXJbMF1baV07CisgICAgICAgIGIgPSBidWZmZXJbMV1baV07CisKKyAgICAgICAgYSAtPSAoYiAqIGRlY29ycl9sZWZ0X3dlaWdodCkgPj4gZGVjb3JyX3NoaWZ0OworICAgICAgICBiICs9IGE7CisKKyAgICAgICAgYnVmZmVyWzBdW2ldID0gYjsKKyAgICAgICAgYnVmZmVyWzFdW2ldID0gYTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZF9leHRyYV9iaXRzKGludDMyX3QgKmJ1ZmZlclsyXSwgaW50MzJfdCAqZXh0cmFfYml0c19idWZmZXJbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0cmFfYml0cywgaW50IGNoYW5uZWxzLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgY2g7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykKKyAgICAgICAgICAgIGJ1ZmZlcltjaF1baV0gPSAoYnVmZmVyW2NoXVtpXSA8PCBleHRyYV9iaXRzKSB8IGV4dHJhX2JpdHNfYnVmZmVyW2NoXVtpXTsKK30KKworc3RhdGljIGludCBkZWNvZGVfZWxlbWVudChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgY2hfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscykKK3sKKyAgICBBTEFDQ29udGV4dCAqYWxhYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGhhc19zaXplLCBicHMsIGlzX2NvbXByZXNzZWQsIGRlY29ycl9zaGlmdCwgZGVjb3JyX2xlZnRfd2VpZ2h0LCByZXQ7CisgICAgdWludDMyX3Qgb3V0cHV0X3NhbXBsZXM7CisgICAgaW50IGksIGNoOworCisgICAgc2tpcF9iaXRzKCZhbGFjLT5nYiwgNCk7ICAvKiBlbGVtZW50IGluc3RhbmNlIHRhZyAqLworICAgIHNraXBfYml0cygmYWxhYy0+Z2IsIDEyKTsgLyogdW51c2VkIGhlYWRlciBiaXRzICovCisKKyAgICAvKiB0aGUgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIGlzIHN0b3JlZCBpbiB0aGUgZnJhbWUgKi8KKyAgICBoYXNfc2l6ZSA9IGdldF9iaXRzMSgmYWxhYy0+Z2IpOworCisgICAgYWxhYy0+ZXh0cmFfYml0cyA9IGdldF9iaXRzKCZhbGFjLT5nYiwgMikgPDwgMzsKKyAgICBicHMgPSBhbGFjLT5zYW1wbGVfc2l6ZSAtIGFsYWMtPmV4dHJhX2JpdHMgKyBjaGFubmVscyAtIDE7CisgICAgaWYgKGJwcyA+IDMyVSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJwcyBpcyB1bnN1cHBvcnRlZDogJWRcbiIsIGJwcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvKiB3aGV0aGVyIHRoZSBmcmFtZSBpcyBjb21wcmVzc2VkICovCisgICAgaXNfY29tcHJlc3NlZCA9ICFnZXRfYml0czEoJmFsYWMtPmdiKTsKKworICAgIGlmIChoYXNfc2l6ZSkKKyAgICAgICAgb3V0cHV0X3NhbXBsZXMgPSBnZXRfYml0c19sb25nKCZhbGFjLT5nYiwgMzIpOworICAgIGVsc2UKKyAgICAgICAgb3V0cHV0X3NhbXBsZXMgPSBhbGFjLT5tYXhfc2FtcGxlc19wZXJfZnJhbWU7CisgICAgaWYgKCFvdXRwdXRfc2FtcGxlcyB8fCBvdXRwdXRfc2FtcGxlcyA+IGFsYWMtPm1heF9zYW1wbGVzX3Blcl9mcmFtZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc2FtcGxlcyBwZXIgZnJhbWU6ICUiUFJJdTMyIlxuIiwKKyAgICAgICAgICAgICAgIG91dHB1dF9zYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICghYWxhYy0+bmJfc2FtcGxlcykgeworICAgICAgICBUaHJlYWRGcmFtZSB0ZnJhbWUgPSB7IC5mID0gZnJhbWUgfTsKKyAgICAgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBvdXRwdXRfc2FtcGxlczsKKyAgICAgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJnRmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIGlmIChvdXRwdXRfc2FtcGxlcyAhPSBhbGFjLT5uYl9zYW1wbGVzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAic2FtcGxlIGNvdW50IG1pc21hdGNoOiAlIlBSSXUzMiIgIT0gJWRcbiIsCisgICAgICAgICAgICAgICBvdXRwdXRfc2FtcGxlcywgYWxhYy0+bmJfc2FtcGxlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhbGFjLT5uYl9zYW1wbGVzID0gb3V0cHV0X3NhbXBsZXM7CisgICAgaWYgKGFsYWMtPmRpcmVjdF9vdXRwdXQpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBhbGFjLT5vdXRwdXRfc2FtcGxlc19idWZmZXJbY2hdID0gKGludDMyX3QgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaF9pbmRleCArIGNoXTsKKyAgICB9CisKKyAgICBpZiAoaXNfY29tcHJlc3NlZCkgeworICAgICAgICBpbnQxNl90IGxwY19jb2Vmc1syXVszMl07CisgICAgICAgIGludCBscGNfb3JkZXJbMl07CisgICAgICAgIGludCBwcmVkaWN0aW9uX3R5cGVbMl07CisgICAgICAgIGludCBscGNfcXVhbnRbMl07CisgICAgICAgIGludCByaWNlX2hpc3RvcnlfbXVsdFsyXTsKKworICAgICAgICBkZWNvcnJfc2hpZnQgICAgICAgPSBnZXRfYml0cygmYWxhYy0+Z2IsIDgpOworICAgICAgICBkZWNvcnJfbGVmdF93ZWlnaHQgPSBnZXRfYml0cygmYWxhYy0+Z2IsIDgpOworCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBwcmVkaWN0aW9uX3R5cGVbY2hdICAgPSBnZXRfYml0cygmYWxhYy0+Z2IsIDQpOworICAgICAgICAgICAgbHBjX3F1YW50W2NoXSAgICAgICAgID0gZ2V0X2JpdHMoJmFsYWMtPmdiLCA0KTsKKyAgICAgICAgICAgIHJpY2VfaGlzdG9yeV9tdWx0W2NoXSA9IGdldF9iaXRzKCZhbGFjLT5nYiwgMyk7CisgICAgICAgICAgICBscGNfb3JkZXJbY2hdICAgICAgICAgPSBnZXRfYml0cygmYWxhYy0+Z2IsIDUpOworCisgICAgICAgICAgICBpZiAobHBjX29yZGVyW2NoXSA+PSBhbGFjLT5tYXhfc2FtcGxlc19wZXJfZnJhbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIC8qIHJlYWQgdGhlIHByZWRpY3RvciB0YWJsZSAqLworICAgICAgICAgICAgZm9yIChpID0gbHBjX29yZGVyW2NoXSAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIGxwY19jb2Vmc1tjaF1baV0gPSBnZXRfc2JpdHMoJmFsYWMtPmdiLCAxNik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWxhYy0+ZXh0cmFfYml0cykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFsYWMtPm5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmKGdldF9iaXRzX2xlZnQoJmFsYWMtPmdiKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgICAgIGFsYWMtPmV4dHJhX2JpdHNfYnVmZmVyW2NoXVtpXSA9IGdldF9iaXRzKCZhbGFjLT5nYiwgYWxhYy0+ZXh0cmFfYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGludCByZXQ9cmljZV9kZWNvbXByZXNzKGFsYWMsIGFsYWMtPnByZWRpY3RfZXJyb3JfYnVmZmVyW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGFjLT5uYl9zYW1wbGVzLCBicHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmljZV9oaXN0b3J5X211bHRbY2hdICogYWxhYy0+cmljZV9oaXN0b3J5X211bHQgLyA0KTsKKyAgICAgICAgICAgIGlmKHJldDwwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIC8qIGFkYXB0aXZlIEZJUiBmaWx0ZXIgKi8KKyAgICAgICAgICAgIGlmIChwcmVkaWN0aW9uX3R5cGVbY2hdID09IDE1KSB7CisgICAgICAgICAgICAgICAgLyogUHJlZGljdGlvbiB0eXBlIDE1IHJ1bnMgdGhlIGFkYXB0aXZlIEZJUiB0d2ljZS4KKyAgICAgICAgICAgICAgICAgKiBUaGUgZmlyc3QgcGFzcyB1c2VzIHRoZSBzcGVjaWFsLWNhc2UgY29lZl9udW0gPSAzMSwgd2hpbGUKKyAgICAgICAgICAgICAgICAgKiB0aGUgc2Vjb25kIHBhc3MgdXNlcyB0aGUgY29lZnMgZnJvbSB0aGUgYml0c3RyZWFtLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogSG93ZXZlciwgdGhpcyBwcmVkaWN0aW9uIHR5cGUgaXMgbm90IGN1cnJlbnRseSB1c2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAqIHJlZmVyZW5jZSBlbmNvZGVyLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxwY19wcmVkaWN0aW9uKGFsYWMtPnByZWRpY3RfZXJyb3JfYnVmZmVyW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGFjLT5wcmVkaWN0X2Vycm9yX2J1ZmZlcltjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxhYy0+bmJfc2FtcGxlcywgYnBzLCBOVUxMLCAzMSwgMCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByZWRpY3Rpb25fdHlwZVtjaF0gPiAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgInVua25vd24gcHJlZGljdGlvbiB0eXBlOiAlaVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbl90eXBlW2NoXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBscGNfcHJlZGljdGlvbihhbGFjLT5wcmVkaWN0X2Vycm9yX2J1ZmZlcltjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGFjLT5vdXRwdXRfc2FtcGxlc19idWZmZXJbY2hdLCBhbGFjLT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBzLCBscGNfY29lZnNbY2hdLCBscGNfb3JkZXJbY2hdLCBscGNfcXVhbnRbY2hdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5vdCBjb21wcmVzc2VkLCBlYXN5IGNhc2UgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFsYWMtPm5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaWYoZ2V0X2JpdHNfbGVmdCgmYWxhYy0+Z2IpIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBhbGFjLT5vdXRwdXRfc2FtcGxlc19idWZmZXJbY2hdW2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc2JpdHNfbG9uZygmYWxhYy0+Z2IsIGFsYWMtPnNhbXBsZV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhbGFjLT5leHRyYV9iaXRzICAgPSAwOworICAgICAgICBkZWNvcnJfc2hpZnQgICAgICAgPSAwOworICAgICAgICBkZWNvcnJfbGVmdF93ZWlnaHQgPSAwOworICAgIH0KKworICAgIGlmIChhbGFjLT5leHRyYV9iaXRzICYmIGFsYWMtPmV4dHJhX2JpdF9idWcpIHsKKyAgICAgICAgYXBwZW5kX2V4dHJhX2JpdHMoYWxhYy0+b3V0cHV0X3NhbXBsZXNfYnVmZmVyLCBhbGFjLT5leHRyYV9iaXRzX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWxhYy0+ZXh0cmFfYml0cywgY2hhbm5lbHMsIGFsYWMtPm5iX3NhbXBsZXMpOworICAgIH0KKworICAgIGlmIChjaGFubmVscyA9PSAyICYmIGRlY29ycl9sZWZ0X3dlaWdodCkgeworICAgICAgICBkZWNvcnJlbGF0ZV9zdGVyZW8oYWxhYy0+b3V0cHV0X3NhbXBsZXNfYnVmZmVyLCBhbGFjLT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JyX3NoaWZ0LCBkZWNvcnJfbGVmdF93ZWlnaHQpOworICAgIH0KKworICAgIGlmIChhbGFjLT5leHRyYV9iaXRzICYmICFhbGFjLT5leHRyYV9iaXRfYnVnKSB7CisgICAgICAgIGFwcGVuZF9leHRyYV9iaXRzKGFsYWMtPm91dHB1dF9zYW1wbGVzX2J1ZmZlciwgYWxhYy0+ZXh0cmFfYml0c19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYWMtPmV4dHJhX2JpdHMsIGNoYW5uZWxzLCBhbGFjLT5uYl9zYW1wbGVzKTsKKyAgICB9CisKKyAgICBpZihhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihhdmN0eC0+c2FtcGxlX2ZtdCkpIHsKKyAgICBzd2l0Y2goYWxhYy0+c2FtcGxlX3NpemUpIHsKKyAgICBjYXNlIDE2OiB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBpbnQxNl90ICpvdXRidWZmZXIgPSAoaW50MTZfdCAqKWZyYW1lLT5leHRlbmRlZF9kYXRhW2NoX2luZGV4ICsgY2hdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFsYWMtPm5iX3NhbXBsZXM7IGkrKykKKyAgICAgICAgICAgICAgICAqb3V0YnVmZmVyKysgPSBhbGFjLT5vdXRwdXRfc2FtcGxlc19idWZmZXJbY2hdW2ldOworICAgICAgICB9fQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0OiB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWxhYy0+bmJfc2FtcGxlczsgaSsrKQorICAgICAgICAgICAgICAgIGFsYWMtPm91dHB1dF9zYW1wbGVzX2J1ZmZlcltjaF1baV0gPDw9IDg7CisgICAgICAgIH19CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgICAgc3dpdGNoKGFsYWMtPnNhbXBsZV9zaXplKSB7CisgICAgICAgIGNhc2UgMTY6IHsKKyAgICAgICAgICAgIGludDE2X3QgKm91dGJ1ZmZlciA9ICgoaW50MTZfdCAqKWZyYW1lLT5leHRlbmRlZF9kYXRhWzBdKSArIGNoX2luZGV4OworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFsYWMtPm5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgICAgICAqb3V0YnVmZmVyKysgPSBhbGFjLT5vdXRwdXRfc2FtcGxlc19idWZmZXJbY2hdW2ldOworICAgICAgICAgICAgICAgIG91dGJ1ZmZlciArPSBhbGFjLT5jaGFubmVscyAtIGNoYW5uZWxzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjQ6IHsKKyAgICAgICAgICAgIGludDMyX3QgKm91dGJ1ZmZlciA9ICgoaW50MzJfdCAqKWZyYW1lLT5leHRlbmRlZF9kYXRhWzBdKSArIGNoX2luZGV4OworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFsYWMtPm5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgICAgICAqb3V0YnVmZmVyKysgPSBhbGFjLT5vdXRwdXRfc2FtcGxlc19idWZmZXJbY2hdW2ldIDw8IDg7CisgICAgICAgICAgICAgICAgb3V0YnVmZmVyICs9IGFsYWMtPmNoYW5uZWxzIC0gY2hhbm5lbHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzMjogeworICAgICAgICAgICAgaW50MzJfdCAqb3V0YnVmZmVyID0gKChpbnQzMl90ICopZnJhbWUtPmV4dGVuZGVkX2RhdGFbMF0pICsgY2hfaW5kZXg7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWxhYy0+bmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgICAgICpvdXRidWZmZXIrKyA9IGFsYWMtPm91dHB1dF9zYW1wbGVzX2J1ZmZlcltjaF1baV07CisgICAgICAgICAgICAgICAgb3V0YnVmZmVyICs9IGFsYWMtPmNoYW5uZWxzIC0gY2hhbm5lbHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsYWNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQUxBQ0NvbnRleHQgKmFsYWMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lICAgID0gZGF0YTsKKyAgICBlbnVtIEFsYWNSYXdEYXRhQmxvY2tUeXBlIGVsZW1lbnQ7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBjaCwgcmV0LCBnb3RfZW5kOworCisgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmYWxhYy0+Z2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGdvdF9lbmQgPSAwOworICAgIGFsYWMtPm5iX3NhbXBsZXMgPSAwOworICAgIGNoID0gMDsKKyAgICB3aGlsZSAoZ2V0X2JpdHNfbGVmdCgmYWxhYy0+Z2IpID49IDMpIHsKKyAgICAgICAgZWxlbWVudCA9IGdldF9iaXRzKCZhbGFjLT5nYiwgMyk7CisgICAgICAgIGlmIChlbGVtZW50ID09IFRZUEVfRU5EKSB7CisgICAgICAgICAgICBnb3RfZW5kID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChlbGVtZW50ID4gVFlQRV9DUEUgJiYgZWxlbWVudCAhPSBUWVBFX0xGRSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJzeW50YXggZWxlbWVudCB1bnN1cHBvcnRlZDogJWRcbiIsIGVsZW1lbnQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisKKyAgICAgICAgY2hhbm5lbHMgPSAoZWxlbWVudCA9PSBUWVBFX0NQRSkgPyAyIDogMTsKKyAgICAgICAgaWYgKGNoICsgY2hhbm5lbHMgPiBhbGFjLT5jaGFubmVscyB8fAorICAgICAgICAgICAgZmZfYWxhY19jaGFubmVsX2xheW91dF9vZmZzZXRzW2FsYWMtPmNoYW5uZWxzIC0gMV1bY2hdICsgY2hhbm5lbHMgPiBhbGFjLT5jaGFubmVscykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGVsZW1lbnQgY2hhbm5lbCBjb3VudFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGRlY29kZV9lbGVtZW50KGF2Y3R4LCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfYWxhY19jaGFubmVsX2xheW91dF9vZmZzZXRzW2FsYWMtPmNoYW5uZWxzIC0gMV1bY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7CisgICAgICAgIGlmIChyZXQgPCAwICYmIGdldF9iaXRzX2xlZnQoJmFsYWMtPmdiKSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgY2ggKz0gY2hhbm5lbHM7CisgICAgfQorICAgIGlmICghZ290X2VuZCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm5vIGVuZCB0YWcgZm91bmQuIGluY29tcGxldGUgcGFja2V0LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChhdnBrdC0+c2l6ZSAqIDggLSBnZXRfYml0c19jb3VudCgmYWxhYy0+Z2IpID4gOCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIDogJWQgYml0cyBsZWZ0XG4iLAorICAgICAgICAgICAgICAgYXZwa3QtPnNpemUgKiA4IC0gZ2V0X2JpdHNfY291bnQoJmFsYWMtPmdiKSk7CisgICAgfQorCisgICAgaWYgKGFsYWMtPmNoYW5uZWxzID09IGNoKQorICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisgICAgZWxzZQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRmFpbGVkIHRvIGRlY29kZSBhbGwgY2hhbm5lbHNcbiIpOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYWxhY19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFMQUNDb250ZXh0ICphbGFjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGludCBjaDsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBGRk1JTihhbGFjLT5jaGFubmVscywgMik7IGNoKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJmFsYWMtPnByZWRpY3RfZXJyb3JfYnVmZmVyW2NoXSk7CisgICAgICAgIGlmICghYWxhYy0+ZGlyZWN0X291dHB1dCkKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZhbGFjLT5vdXRwdXRfc2FtcGxlc19idWZmZXJbY2hdKTsKKyAgICAgICAgYXZfZnJlZXAoJmFsYWMtPmV4dHJhX2JpdHNfYnVmZmVyW2NoXSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NhdGVfYnVmZmVycyhBTEFDQ29udGV4dCAqYWxhYykKK3sKKyAgICBpbnQgY2g7CisgICAgaW50IGJ1Zl9zaXplID0gYWxhYy0+bWF4X3NhbXBsZXNfcGVyX2ZyYW1lICogc2l6ZW9mKGludDMyX3QpOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgRkZNSU4oYWxhYy0+Y2hhbm5lbHMsIDIpOyBjaCsrKSB7CisgICAgICAgIEZGX0FMTE9DX09SX0dPVE8oYWxhYy0+YXZjdHgsIGFsYWMtPnByZWRpY3RfZXJyb3JfYnVmZmVyW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSwgYnVmX2FsbG9jX2ZhaWwpOworCisgICAgICAgIGFsYWMtPmRpcmVjdF9vdXRwdXQgPSBhbGFjLT5zYW1wbGVfc2l6ZSA+IDE2ICYmIGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGFsYWMtPmF2Y3R4LT5zYW1wbGVfZm10KTsKKyAgICAgICAgaWYgKCFhbGFjLT5kaXJlY3Rfb3V0cHV0KSB7CisgICAgICAgICAgICBGRl9BTExPQ19PUl9HT1RPKGFsYWMtPmF2Y3R4LCBhbGFjLT5vdXRwdXRfc2FtcGxlc19idWZmZXJbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSwgYnVmX2FsbG9jX2ZhaWwpOworICAgICAgICB9CisKKyAgICAgICAgRkZfQUxMT0NfT1JfR09UTyhhbGFjLT5hdmN0eCwgYWxhYy0+ZXh0cmFfYml0c19idWZmZXJbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplLCBidWZfYWxsb2NfZmFpbCk7CisgICAgfQorICAgIHJldHVybiAwOworYnVmX2FsbG9jX2ZhaWw6CisgICAgYWxhY19kZWNvZGVfY2xvc2UoYWxhYy0+YXZjdHgpOworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKK3N0YXRpYyBpbnQgYWxhY19zZXRfaW5mbyhBTEFDQ29udGV4dCAqYWxhYykKK3sKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBhbGFjLT5hdmN0eC0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgYWxhYy0+YXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKworICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgMTIpOyAvLyBzaXplOjQsIGFsYWM6NCwgdmVyc2lvbjo0CisKKyAgICBhbGFjLT5tYXhfc2FtcGxlc19wZXJfZnJhbWUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiKTsKKyAgICBpZiAoIWFsYWMtPm1heF9zYW1wbGVzX3Blcl9mcmFtZSB8fAorICAgICAgICBhbGFjLT5tYXhfc2FtcGxlc19wZXJfZnJhbWUgPiBJTlRfTUFYIC8gc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgIGF2X2xvZyhhbGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIm1heCBzYW1wbGVzIHBlciBmcmFtZSBpbnZhbGlkOiAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICBhbGFjLT5tYXhfc2FtcGxlc19wZXJfZnJhbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCAxKTsgIC8vIGNvbXBhdGlibGUgdmVyc2lvbgorICAgIGFsYWMtPnNhbXBsZV9zaXplICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgYWxhYy0+cmljZV9oaXN0b3J5X211bHQgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICBhbGFjLT5yaWNlX2luaXRpYWxfaGlzdG9yeSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgIGFsYWMtPnJpY2VfbGltaXQgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgYWxhYy0+Y2hhbm5lbHMgICAgICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJmdiKTsgLy8gbWF4UnVuCisgICAgYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7IC8vIG1heCBjb2RlZCBmcmFtZSBzaXplCisgICAgYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7IC8vIGF2ZXJhZ2UgYml0cmF0ZQorICAgIGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOyAvLyBzYW1wbGVyYXRlCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFsYWNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCByZXFfcGFja2VkOworICAgIEFMQUNDb250ZXh0ICphbGFjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhbGFjLT5hdmN0eCA9IGF2Y3R4OworCisgICAgLyogaW5pdGlhbGl6ZSBmcm9tIHRoZSBleHRyYWRhdGEgKi8KKyAgICBpZiAoYWxhYy0+YXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgQUxBQ19FWFRSQURBVEFfU0laRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImV4dHJhZGF0YSBpcyB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGFsYWNfc2V0X2luZm8oYWxhYykpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJzZXRfaW5mbyBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmVxX3BhY2tlZCA9IExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU1ICYmICFhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihhdmN0eC0+cmVxdWVzdF9zYW1wbGVfZm10KTsKKyAgICBzd2l0Y2ggKGFsYWMtPnNhbXBsZV9zaXplKSB7CisgICAgY2FzZSAxNjogYXZjdHgtPnNhbXBsZV9mbXQgPSByZXFfcGFja2VkID8gQVZfU0FNUExFX0ZNVF9TMTYgOiBBVl9TQU1QTEVfRk1UX1MxNlA7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICBjYXNlIDMyOiBhdmN0eC0+c2FtcGxlX2ZtdCA9IHJlcV9wYWNrZWQgPyBBVl9TQU1QTEVfRk1UX1MzMiA6IEFWX1NBTVBMRV9GTVRfUzMyUDsKKyAgICAgICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJTYW1wbGUgZGVwdGggJWQiLCBhbGFjLT5zYW1wbGVfc2l6ZSk7CisgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IGFsYWMtPnNhbXBsZV9zaXplOworCisgICAgaWYgKGFsYWMtPmNoYW5uZWxzIDwgMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBjaGFubmVsIGNvdW50XG4iKTsKKyAgICAgICAgYWxhYy0+Y2hhbm5lbHMgPSBhdmN0eC0+Y2hhbm5lbHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFsYWMtPmNoYW5uZWxzID4gQUxBQ19NQVhfQ0hBTk5FTFMpCisgICAgICAgICAgICBhbGFjLT5jaGFubmVscyA9IGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzID0gYWxhYy0+Y2hhbm5lbHM7CisgICAgfQorICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiBBTEFDX01BWF9DSEFOTkVMUyB8fCBhdmN0eC0+Y2hhbm5lbHMgPD0gMCApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjaGFubmVsIGNvdW50OiAlZFxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gZmZfYWxhY19jaGFubmVsX2xheW91dHNbYWxhYy0+Y2hhbm5lbHMgLSAxXTsKKworICAgIGlmICgocmV0ID0gYWxsb2NhdGVfYnVmZmVycyhhbGFjKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYWxsb2NhdGluZyBidWZmZXJzXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X3RocmVhZF9jb3B5KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBTEFDQ29udGV4dCAqYWxhYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYWxhYy0+YXZjdHggPSBhdmN0eDsKKyAgICByZXR1cm4gYWxsb2NhdGVfYnVmZmVycyhhbGFjKTsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJleHRyYV9iaXRzX2J1ZyIsICJGb3JjZSBub24tc3RhbmRhcmQgZGVjb2RpbmcgcHJvY2VzcyIsCisgICAgICBvZmZzZXRvZihBTEFDQ29udGV4dCwgZXh0cmFfYml0X2J1ZyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LAorICAgICAgMCwgMSwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYWxhY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJhbGFjIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfYWxhY19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhbGFjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQUxBQyAoQXBwbGUgTG9zc2xlc3MgQXVkaW8gQ29kZWMpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FMQUMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFMQUNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBhbGFjX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGFsYWNfZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGFsYWNfZGVjb2RlX2ZyYW1lLAorICAgIC5pbml0X3RocmVhZF9jb3B5ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoaW5pdF90aHJlYWRfY29weSksCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZhbGFjX2NsYXNzCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWxhY19kYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hbGFjX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmNiMDZjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxhY19kYXRhLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIEFMQUMgZW5jb2RlciBhbmQgZGVjb2RlciBjb21tb24gZGF0YQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYWxhY19kYXRhLmgiCisKK2NvbnN0IHVpbnQ4X3QgZmZfYWxhY19jaGFubmVsX2xheW91dF9vZmZzZXRzW0FMQUNfTUFYX0NIQU5ORUxTXVtBTEFDX01BWF9DSEFOTkVMU10gPSB7CisgICAgeyAwIH0sCisgICAgeyAwLCAxIH0sCisgICAgeyAyLCAwLCAxIH0sCisgICAgeyAyLCAwLCAxLCAzIH0sCisgICAgeyAyLCAwLCAxLCAzLCA0IH0sCisgICAgeyAyLCAwLCAxLCA0LCA1LCAzIH0sCisgICAgeyAyLCAwLCAxLCA0LCA1LCA2LCAzIH0sCisgICAgeyAyLCA2LCA3LCAwLCAxLCA0LCA1LCAzIH0KK307CisKK2NvbnN0IHVpbnQ2NF90IGZmX2FsYWNfY2hhbm5lbF9sYXlvdXRzW0FMQUNfTUFYX0NIQU5ORUxTICsgMV0gPSB7CisgICAgQVZfQ0hfTEFZT1VUX01PTk8sCisgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywKKyAgICBBVl9DSF9MQVlPVVRfU1VSUk9VTkQsCisgICAgQVZfQ0hfTEFZT1VUXzRQT0lOVDAsCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDBfQkFDSywKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLLAorICAgIEFWX0NIX0xBWU9VVF82UE9JTlQxX0JBQ0ssCisgICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDFfV0lERV9CQUNLLAorICAgIDAKK307CisKK2NvbnN0IGVudW0gQWxhY1Jhd0RhdGFCbG9ja1R5cGUgZmZfYWxhY19jaGFubmVsX2VsZW1lbnRzW0FMQUNfTUFYX0NIQU5ORUxTXVs1XSA9IHsKKyAgICB7IFRZUEVfU0NFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IFRZUEVfQ1BFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IFRZUEVfU0NFLCBUWVBFX0NQRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9TQ0UgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9DUEUsICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9DUEUsIFRZUEVfU0NFLCAgICAgICAgICAgfSwKKyAgICB7IFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9DUEUsIFRZUEVfU0NFLCBUWVBFX1NDRSwgfSwKKyAgICB7IFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9DUEUsIFRZUEVfQ1BFLCBUWVBFX1NDRSwgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbGFjX2RhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FsYWNfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MGQ2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hbGFjX2RhdGEuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQUxBQyBlbmNvZGVyIGFuZCBkZWNvZGVyIGNvbW1vbiBkYXRhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BTEFDX0RBVEFfSAorI2RlZmluZSBBVkNPREVDX0FMQUNfREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworZW51bSBBbGFjUmF3RGF0YUJsb2NrVHlwZSB7CisgICAgLyogQXQgdGhlIG1vbWVudCwgb25seSBTQ0UsIENQRSwgTEZFLCBhbmQgRU5EIGFyZSByZWNvZ25pemVkLiAqLworICAgIFRZUEVfU0NFLAorICAgIFRZUEVfQ1BFLAorICAgIFRZUEVfQ0NFLAorICAgIFRZUEVfTEZFLAorICAgIFRZUEVfRFNFLAorICAgIFRZUEVfUENFLAorICAgIFRZUEVfRklMLAorICAgIFRZUEVfRU5ECit9OworCisjZGVmaW5lIEFMQUNfTUFYX0NIQU5ORUxTIDgKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfYWxhY19jaGFubmVsX2xheW91dF9vZmZzZXRzW0FMQUNfTUFYX0NIQU5ORUxTXVtBTEFDX01BWF9DSEFOTkVMU107CisKK2V4dGVybiBjb25zdCB1aW50NjRfdCBmZl9hbGFjX2NoYW5uZWxfbGF5b3V0c1tBTEFDX01BWF9DSEFOTkVMUyArIDFdOworCitleHRlcm4gY29uc3QgZW51bSBBbGFjUmF3RGF0YUJsb2NrVHlwZSBmZl9hbGFjX2NoYW5uZWxfZWxlbWVudHNbQUxBQ19NQVhfQ0hBTk5FTFNdWzVdOworCisjZW5kaWYgLyogQVZDT0RFQ19BTEFDX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWxhY2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxhY2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNjNkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hbGFjZW5jLmMKQEAgLTAsMCArMSw2NjEgQEAKKy8qCisgKiBBTEFDIGF1ZGlvIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCAgSmFpa3Jpc2huYW4gTWVub24gPHJlYWxpdHltYW5AZ214Lm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibHBjLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgImFsYWNfZGF0YS5oIgorCisjZGVmaW5lIERFRkFVTFRfRlJBTUVfU0laRSAgICAgICAgNDA5NgorI2RlZmluZSBBTEFDX0VYVFJBREFUQV9TSVpFICAgICAgIDM2CisjZGVmaW5lIEFMQUNfRlJBTUVfSEVBREVSX1NJWkUgICAgNTUKKyNkZWZpbmUgQUxBQ19GUkFNRV9GT09URVJfU0laRSAgICAzCisKKyNkZWZpbmUgQUxBQ19FU0NBUEVfQ09ERSAgICAgICAgICAweDFGRgorI2RlZmluZSBBTEFDX01BWF9MUENfT1JERVIgICAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfTUFYX1BSRURfT1JERVIgICAgNgorI2RlZmluZSBERUZBVUxUX01JTl9QUkVEX09SREVSICAgIDQKKyNkZWZpbmUgQUxBQ19NQVhfTFBDX1BSRUNJU0lPTiAgICA5CisjZGVmaW5lIEFMQUNfTUFYX0xQQ19TSElGVCAgICAgICAgOQorCisjZGVmaW5lIEFMQUNfQ0hNT0RFX0xFRlRfUklHSFQgICAgMAorI2RlZmluZSBBTEFDX0NITU9ERV9MRUZUX1NJREUgICAgIDEKKyNkZWZpbmUgQUxBQ19DSE1PREVfUklHSFRfU0lERSAgICAyCisjZGVmaW5lIEFMQUNfQ0hNT0RFX01JRF9TSURFICAgICAgMworCit0eXBlZGVmIHN0cnVjdCBSaWNlQ29udGV4dCB7CisgICAgaW50IGhpc3RvcnlfbXVsdDsKKyAgICBpbnQgaW5pdGlhbF9oaXN0b3J5OworICAgIGludCBrX21vZGlmaWVyOworICAgIGludCByaWNlX21vZGlmaWVyOworfSBSaWNlQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgQWxhY0xQQ0NvbnRleHQgeworICAgIGludCBscGNfb3JkZXI7CisgICAgaW50IGxwY19jb2VmZltBTEFDX01BWF9MUENfT1JERVIrMV07CisgICAgaW50IGxwY19xdWFudDsKK30gQWxhY0xQQ0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IEFsYWNFbmNvZGVDb250ZXh0IHsKKyAgICBpbnQgZnJhbWVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IGN1cnJlbnQgZnJhbWUgc2l6ZSAgICAgICAgICAgICAgICovCisgICAgaW50IHZlcmJhdGltOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBjdXJyZW50IGZyYW1lIHZlcmJhdGltIG1vZGUgZmxhZyAqLworICAgIGludCBjb21wcmVzc2lvbl9sZXZlbDsKKyAgICBpbnQgbWluX3ByZWRpY3Rpb25fb3JkZXI7CisgICAgaW50IG1heF9wcmVkaWN0aW9uX29yZGVyOworICAgIGludCBtYXhfY29kZWRfZnJhbWVfc2l6ZTsKKyAgICBpbnQgd3JpdGVfc2FtcGxlX3NpemU7CisgICAgaW50IGV4dHJhX2JpdHM7CisgICAgaW50MzJfdCBzYW1wbGVfYnVmWzJdW0RFRkFVTFRfRlJBTUVfU0laRV07CisgICAgaW50MzJfdCBwcmVkaWN0b3JfYnVmWzJdW0RFRkFVTFRfRlJBTUVfU0laRV07CisgICAgaW50IGludGVybGFjaW5nX3NoaWZ0OworICAgIGludCBpbnRlcmxhY2luZ19sZWZ0d2VpZ2h0OworICAgIFB1dEJpdENvbnRleHQgcGJjdHg7CisgICAgUmljZUNvbnRleHQgcmM7CisgICAgQWxhY0xQQ0NvbnRleHQgbHBjWzJdOworICAgIExQQ0NvbnRleHQgbHBjX2N0eDsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7Cit9IEFsYWNFbmNvZGVDb250ZXh0OworCisKK3N0YXRpYyB2b2lkIGluaXRfc2FtcGxlX2J1ZmZlcnMoQWxhY0VuY29kZUNvbnRleHQgKnMsIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb25zdCAqc2FtcGxlc1syXSkKK3sKKyAgICBpbnQgY2gsIGk7CisgICAgaW50IHNoaWZ0ID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUocy0+YXZjdHgtPnNhbXBsZV9mbXQpICogOCAtCisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGU7CisKKyNkZWZpbmUgQ09QWV9TQU1QTEVTKHR5cGUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgKmJwdHIgPSBzLT5zYW1wbGVfYnVmW2NoXTsgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHR5cGUgKnNwdHIgPSAoY29uc3QgdHlwZSAqKXNhbXBsZXNbY2hdOyAgIFwKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZV9zaXplOyBpKyspICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBicHRyW2ldID0gc3B0cltpXSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgaWYgKHMtPmF2Y3R4LT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUCkKKyAgICAgICAgQ09QWV9TQU1QTEVTKGludDMyX3QpOworICAgIGVsc2UKKyAgICAgICAgQ09QWV9TQU1QTEVTKGludDE2X3QpOworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfc2NhbGFyKEFsYWNFbmNvZGVDb250ZXh0ICpzLCBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGssIGludCB3cml0ZV9zYW1wbGVfc2l6ZSkKK3sKKyAgICBpbnQgZGl2aXNvciwgcSwgcjsKKworICAgIGsgPSBGRk1JTihrLCBzLT5yYy5rX21vZGlmaWVyKTsKKyAgICBkaXZpc29yID0gKDE8PGspIC0gMTsKKyAgICBxID0geCAvIGRpdmlzb3I7CisgICAgciA9IHggJSBkaXZpc29yOworCisgICAgaWYgKHEgPiA4KSB7CisgICAgICAgIC8vIHdyaXRlIGVzY2FwZSBjb2RlIGFuZCBzYW1wbGUgdmFsdWUgZGlyZWN0bHkKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiY3R4LCA5LCBBTEFDX0VTQ0FQRV9DT0RFKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiY3R4LCB3cml0ZV9zYW1wbGVfc2l6ZSwgeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHEpCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGJjdHgsIHEsICgxPDxxKSAtIDEpOworICAgICAgICBwdXRfYml0cygmcy0+cGJjdHgsIDEsIDApOworCisgICAgICAgIGlmIChrICE9IDEpIHsKKyAgICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGJjdHgsIGssIHIrMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiY3R4LCBrLTEsIDApOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV9lbGVtZW50X2hlYWRlcihBbGFjRW5jb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQWxhY1Jhd0RhdGFCbG9ja1R5cGUgZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnN0YW5jZSkKK3sKKyAgICBpbnQgZW5jb2RlX2ZzID0gMDsKKworICAgIGlmIChzLT5mcmFtZV9zaXplIDwgREVGQVVMVF9GUkFNRV9TSVpFKQorICAgICAgICBlbmNvZGVfZnMgPSAxOworCisgICAgcHV0X2JpdHMoJnMtPnBiY3R4LCAzLCAgZWxlbWVudCk7ICAgICAgICAgICAgICAgLy8gZWxlbWVudCB0eXBlCisgICAgcHV0X2JpdHMoJnMtPnBiY3R4LCA0LCAgaW5zdGFuY2UpOyAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbnN0YW5jZQorICAgIHB1dF9iaXRzKCZzLT5wYmN0eCwgMTIsIDApOyAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZCBoZWFkZXIgYml0cworICAgIHB1dF9iaXRzKCZzLT5wYmN0eCwgMSwgIGVuY29kZV9mcyk7ICAgICAgICAgICAgIC8vIFNhbXBsZSBjb3VudCBpcyBpbiB0aGUgaGVhZGVyCisgICAgcHV0X2JpdHMoJnMtPnBiY3R4LCAyLCAgcy0+ZXh0cmFfYml0cyA+PiAzKTsgICAgLy8gRXh0cmEgYnl0ZXMgKGZvciAyNC1iaXQpCisgICAgcHV0X2JpdHMoJnMtPnBiY3R4LCAxLCAgcy0+dmVyYmF0aW0pOyAgICAgICAgICAgLy8gQXVkaW8gYmxvY2sgaXMgdmVyYmF0aW0KKyAgICBpZiAoZW5jb2RlX2ZzKQorICAgICAgICBwdXRfYml0czMyKCZzLT5wYmN0eCwgcy0+ZnJhbWVfc2l6ZSk7ICAgICAgIC8vIE5vLiBvZiBzYW1wbGVzIGluIHRoZSBmcmFtZQorfQorCitzdGF0aWMgdm9pZCBjYWxjX3ByZWRpY3Rvcl9wYXJhbXMoQWxhY0VuY29kZUNvbnRleHQgKnMsIGludCBjaCkKK3sKKyAgICBpbnQzMl90IGNvZWZzW01BWF9MUENfT1JERVJdW01BWF9MUENfT1JERVJdOworICAgIGludCBzaGlmdFtNQVhfTFBDX09SREVSXTsKKyAgICBpbnQgb3B0X29yZGVyOworCisgICAgaWYgKHMtPmNvbXByZXNzaW9uX2xldmVsID09IDEpIHsKKyAgICAgICAgcy0+bHBjW2NoXS5scGNfb3JkZXIgPSA2OworICAgICAgICBzLT5scGNbY2hdLmxwY19xdWFudCA9IDY7CisgICAgICAgIHMtPmxwY1tjaF0ubHBjX2NvZWZmWzBdID0gIDE2MDsKKyAgICAgICAgcy0+bHBjW2NoXS5scGNfY29lZmZbMV0gPSAtMTkwOworICAgICAgICBzLT5scGNbY2hdLmxwY19jb2VmZlsyXSA9ICAxNzA7CisgICAgICAgIHMtPmxwY1tjaF0ubHBjX2NvZWZmWzNdID0gLTEzMDsKKyAgICAgICAgcy0+bHBjW2NoXS5scGNfY29lZmZbNF0gPSAgIDgwOworICAgICAgICBzLT5scGNbY2hdLmxwY19jb2VmZls1XSA9ICAtMjU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3B0X29yZGVyID0gZmZfbHBjX2NhbGNfY29lZnMoJnMtPmxwY19jdHgsIHMtPnNhbXBsZV9idWZbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5taW5fcHJlZGljdGlvbl9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF4X3ByZWRpY3Rpb25fb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMQUNfTUFYX0xQQ19QUkVDSVNJT04sIGNvZWZzLCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfTFBDX1RZUEVfTEVWSU5TT04sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9SREVSX01FVEhPRF9FU1QsIEFMQUNfTUFYX0xQQ19TSElGVCwgMSk7CisKKyAgICAgICAgcy0+bHBjW2NoXS5scGNfb3JkZXIgPSBvcHRfb3JkZXI7CisgICAgICAgIHMtPmxwY1tjaF0ubHBjX3F1YW50ID0gc2hpZnRbb3B0X29yZGVyLTFdOworICAgICAgICBtZW1jcHkocy0+bHBjW2NoXS5scGNfY29lZmYsIGNvZWZzW29wdF9vcmRlci0xXSwgb3B0X29yZGVyKnNpemVvZihpbnQpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZXN0aW1hdGVfc3RlcmVvX21vZGUoaW50MzJfdCAqbGVmdF9jaCwgaW50MzJfdCAqcmlnaHRfY2gsIGludCBuKQoreworICAgIGludCBpLCBiZXN0OworICAgIGludDMyX3QgbHQsIHJ0OworICAgIHVpbnQ2NF90IHN1bVs0XTsKKyAgICB1aW50NjRfdCBzY29yZVs0XTsKKworICAgIC8qIGNhbGN1bGF0ZSBzdW0gb2YgMm5kIG9yZGVyIHJlc2lkdWFsIGZvciBlYWNoIGNoYW5uZWwgKi8KKyAgICBzdW1bMF0gPSBzdW1bMV0gPSBzdW1bMl0gPSBzdW1bM10gPSAwOworICAgIGZvciAoaSA9IDI7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgbHQgPSAgbGVmdF9jaFtpXSAtIDIgKiAgbGVmdF9jaFtpIC0gMV0gKyAgbGVmdF9jaFtpIC0gMl07CisgICAgICAgIHJ0ID0gcmlnaHRfY2hbaV0gLSAyICogcmlnaHRfY2hbaSAtIDFdICsgcmlnaHRfY2hbaSAtIDJdOworICAgICAgICBzdW1bMl0gKz0gRkZBQlMoKGx0ICsgcnQpID4+IDEpOworICAgICAgICBzdW1bM10gKz0gRkZBQlMobHQgLSBydCk7CisgICAgICAgIHN1bVswXSArPSBGRkFCUyhsdCk7CisgICAgICAgIHN1bVsxXSArPSBGRkFCUyhydCk7CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIHNjb3JlIGZvciBlYWNoIG1vZGUgKi8KKyAgICBzY29yZVswXSA9IHN1bVswXSArIHN1bVsxXTsKKyAgICBzY29yZVsxXSA9IHN1bVswXSArIHN1bVszXTsKKyAgICBzY29yZVsyXSA9IHN1bVsxXSArIHN1bVszXTsKKyAgICBzY29yZVszXSA9IHN1bVsyXSArIHN1bVszXTsKKworICAgIC8qIHJldHVybiBtb2RlIHdpdGggbG93ZXN0IHNjb3JlICovCisgICAgYmVzdCA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgeworICAgICAgICBpZiAoc2NvcmVbaV0gPCBzY29yZVtiZXN0XSkKKyAgICAgICAgICAgIGJlc3QgPSBpOworICAgIH0KKyAgICByZXR1cm4gYmVzdDsKK30KKworc3RhdGljIHZvaWQgYWxhY19zdGVyZW9fZGVjb3JyZWxhdGlvbihBbGFjRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQzMl90ICpsZWZ0ID0gcy0+c2FtcGxlX2J1ZlswXSwgKnJpZ2h0ID0gcy0+c2FtcGxlX2J1ZlsxXTsKKyAgICBpbnQgaSwgbW9kZSwgbiA9IHMtPmZyYW1lX3NpemU7CisgICAgaW50MzJfdCB0bXA7CisKKyAgICBtb2RlID0gZXN0aW1hdGVfc3RlcmVvX21vZGUobGVmdCwgcmlnaHQsIG4pOworCisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBBTEFDX0NITU9ERV9MRUZUX1JJR0hUOgorICAgICAgICBzLT5pbnRlcmxhY2luZ19sZWZ0d2VpZ2h0ID0gMDsKKyAgICAgICAgcy0+aW50ZXJsYWNpbmdfc2hpZnQgICAgICA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUxBQ19DSE1PREVfTEVGVF9TSURFOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgcmlnaHRbaV0gPSBsZWZ0W2ldIC0gcmlnaHRbaV07CisgICAgICAgIHMtPmludGVybGFjaW5nX2xlZnR3ZWlnaHQgPSAxOworICAgICAgICBzLT5pbnRlcmxhY2luZ19zaGlmdCAgICAgID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTEFDX0NITU9ERV9SSUdIVF9TSURFOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB0bXAgPSByaWdodFtpXTsKKyAgICAgICAgICAgIHJpZ2h0W2ldID0gbGVmdFtpXSAtIHJpZ2h0W2ldOworICAgICAgICAgICAgbGVmdFtpXSAgPSB0bXAgKyAocmlnaHRbaV0gPj4gMzEpOworICAgICAgICB9CisgICAgICAgIHMtPmludGVybGFjaW5nX2xlZnR3ZWlnaHQgPSAxOworICAgICAgICBzLT5pbnRlcmxhY2luZ19zaGlmdCAgICAgID0gMzE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHRtcCA9IGxlZnRbaV07CisgICAgICAgICAgICBsZWZ0W2ldICA9ICh0bXAgKyByaWdodFtpXSkgPj4gMTsKKyAgICAgICAgICAgIHJpZ2h0W2ldID0gIHRtcCAtIHJpZ2h0W2ldOworICAgICAgICB9CisgICAgICAgIHMtPmludGVybGFjaW5nX2xlZnR3ZWlnaHQgPSAxOworICAgICAgICBzLT5pbnRlcmxhY2luZ19zaGlmdCAgICAgID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhbGFjX2xpbmVhcl9wcmVkaWN0b3IoQWxhY0VuY29kZUNvbnRleHQgKnMsIGludCBjaCkKK3sKKyAgICBpbnQgaTsKKyAgICBBbGFjTFBDQ29udGV4dCBscGMgPSBzLT5scGNbY2hdOworICAgIGludDMyX3QgKnJlc2lkdWFsID0gcy0+cHJlZGljdG9yX2J1ZltjaF07CisKKyAgICBpZiAobHBjLmxwY19vcmRlciA9PSAzMSkgeworICAgICAgICByZXNpZHVhbFswXSA9IHMtPnNhbXBsZV9idWZbY2hdWzBdOworCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzLT5mcmFtZV9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIHJlc2lkdWFsW2ldID0gcy0+c2FtcGxlX2J1ZltjaF1baSAgICBdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2FtcGxlX2J1ZltjaF1baSAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGdlbmVyYWxpc2VkIGxpbmVhciBwcmVkaWN0b3IKKworICAgIGlmIChscGMubHBjX29yZGVyID4gMCkgeworICAgICAgICBpbnQzMl90ICpzYW1wbGVzICA9IHMtPnNhbXBsZV9idWZbY2hdOworCisgICAgICAgIC8vIGdlbmVyYXRlIHdhcm0tdXAgc2FtcGxlcworICAgICAgICByZXNpZHVhbFswXSA9IHNhbXBsZXNbMF07CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbHBjLmxwY19vcmRlcjsgaSsrKQorICAgICAgICAgICAgcmVzaWR1YWxbaV0gPSBzaWduX2V4dGVuZChzYW1wbGVzW2ldIC0gc2FtcGxlc1tpLTFdLCBzLT53cml0ZV9zYW1wbGVfc2l6ZSk7CisKKyAgICAgICAgLy8gcGVyZm9ybSBscGMgb24gcmVtYWluaW5nIHNhbXBsZXMKKyAgICAgICAgZm9yIChpID0gbHBjLmxwY19vcmRlciArIDE7IGkgPCBzLT5mcmFtZV9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAxIDw8IChscGMubHBjX3F1YW50IC0gMSksIHJlc192YWwsIGo7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBscGMubHBjX29yZGVyOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gKHNhbXBsZXNbbHBjLmxwY19vcmRlci1qXSAtIHNhbXBsZXNbMF0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgbHBjLmxwY19jb2VmZltqXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3VtID4+PSBscGMubHBjX3F1YW50OworICAgICAgICAgICAgc3VtICs9IHNhbXBsZXNbMF07CisgICAgICAgICAgICByZXNpZHVhbFtpXSA9IHNpZ25fZXh0ZW5kKHNhbXBsZXNbbHBjLmxwY19vcmRlcisxXSAtIHN1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+d3JpdGVfc2FtcGxlX3NpemUpOworICAgICAgICAgICAgcmVzX3ZhbCA9IHJlc2lkdWFsW2ldOworCisgICAgICAgICAgICBpZiAocmVzX3ZhbCkgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGxwYy5scGNfb3JkZXIgLSAxOworICAgICAgICAgICAgICAgIGludCBuZWcgPSAocmVzX3ZhbCA8IDApOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4ID49IDAgJiYgKG5lZyA/IChyZXNfdmFsIDwgMCkgOiAocmVzX3ZhbCA+IDApKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgdmFsICA9IHNhbXBsZXNbMF0gLSBzYW1wbGVzW2xwYy5scGNfb3JkZXIgLSBpbmRleF07CisgICAgICAgICAgICAgICAgICAgIGludCBzaWduID0gKHZhbCA/IEZGU0lHTih2YWwpIDogMCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5lZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gKj0gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgbHBjLmxwY19jb2VmZltpbmRleF0gLT0gc2lnbjsKKyAgICAgICAgICAgICAgICAgICAgdmFsICo9IHNpZ247CisgICAgICAgICAgICAgICAgICAgIHJlc192YWwgLT0gKHZhbCA+PiBscGMubHBjX3F1YW50KSAqIChscGMubHBjX29yZGVyIC0gaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNhbXBsZXMrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgYWxhY19lbnRyb3B5X2NvZGVyKEFsYWNFbmNvZGVDb250ZXh0ICpzLCBpbnQgY2gpCit7CisgICAgdW5zaWduZWQgaW50IGhpc3RvcnkgPSBzLT5yYy5pbml0aWFsX2hpc3Rvcnk7CisgICAgaW50IHNpZ25fbW9kaWZpZXIgPSAwLCBpLCBrOworICAgIGludDMyX3QgKnNhbXBsZXMgPSBzLT5wcmVkaWN0b3JfYnVmW2NoXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZV9zaXplOykgeworICAgICAgICBpbnQgeDsKKworICAgICAgICBrID0gYXZfbG9nMigoaGlzdG9yeSA+PiA5KSArIDMpOworCisgICAgICAgIHggID0gLTIgKiAoKnNhbXBsZXMpIC0xOworICAgICAgICB4IF49IHggPj4gMzE7CisKKyAgICAgICAgc2FtcGxlcysrOworICAgICAgICBpKys7CisKKyAgICAgICAgZW5jb2RlX3NjYWxhcihzLCB4IC0gc2lnbl9tb2RpZmllciwgaywgcy0+d3JpdGVfc2FtcGxlX3NpemUpOworCisgICAgICAgIGhpc3RvcnkgKz0geCAqIHMtPnJjLmhpc3RvcnlfbXVsdCAtCisgICAgICAgICAgICAgICAgICAgKChoaXN0b3J5ICogcy0+cmMuaGlzdG9yeV9tdWx0KSA+PiA5KTsKKworICAgICAgICBzaWduX21vZGlmaWVyID0gMDsKKyAgICAgICAgaWYgKHggPiAweEZGRkYpCisgICAgICAgICAgICBoaXN0b3J5ID0gMHhGRkZGOworCisgICAgICAgIGlmIChoaXN0b3J5IDwgMTI4ICYmIGkgPCBzLT5mcmFtZV9zaXplKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIGsgPSA3IC0gYXZfbG9nMihoaXN0b3J5KSArICgoaGlzdG9yeSArIDE2KSA+PiA2KTsKKworICAgICAgICAgICAgd2hpbGUgKCpzYW1wbGVzID09IDAgJiYgaSA8IHMtPmZyYW1lX3NpemUpIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVzKys7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGJsb2NrX3NpemUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuY29kZV9zY2FsYXIocywgYmxvY2tfc2l6ZSwgaywgMTYpOworICAgICAgICAgICAgc2lnbl9tb2RpZmllciA9IChibG9ja19zaXplIDw9IDB4RkZGRik7CisgICAgICAgICAgICBoaXN0b3J5ID0gMDsKKyAgICAgICAgfQorCisgICAgfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV9lbGVtZW50KEFsYWNFbmNvZGVDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFsYWNSYXdEYXRhQmxvY2tUeXBlIGVsZW1lbnQsIGludCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2FtcGxlczAsIGNvbnN0IHVpbnQ4X3QgKnNhbXBsZXMxKQoreworICAgIHVpbnQ4X3QgY29uc3QgKnNhbXBsZXNbMl0gPSB7IHNhbXBsZXMwLCBzYW1wbGVzMSB9OworICAgIGludCBpLCBqLCBjaGFubmVsczsKKyAgICBpbnQgcHJlZGljdGlvbl90eXBlID0gMDsKKyAgICBQdXRCaXRDb250ZXh0ICpwYiA9ICZzLT5wYmN0eDsKKworICAgIGNoYW5uZWxzID0gZWxlbWVudCA9PSBUWVBFX0NQRSA/IDIgOiAxOworCisgICAgaWYgKHMtPnZlcmJhdGltKSB7CisgICAgICAgIHdyaXRlX2VsZW1lbnRfaGVhZGVyKHMsIGVsZW1lbnQsIGluc3RhbmNlKTsKKyAgICAgICAgLyogc2FtcGxlcyBhcmUgY2hhbm5lbC1pbnRlcmxlYXZlZCBpbiB2ZXJiYXRpbSBtb2RlICovCisgICAgICAgIGlmIChzLT5hdmN0eC0+c2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMlApIHsKKyAgICAgICAgICAgIGludCBzaGlmdCA9IDMyIC0gcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGU7CisgICAgICAgICAgICBpbnQzMl90IGNvbnN0ICpzYW1wbGVzX3MzMlsyXSA9IHsgKGNvbnN0IGludDMyX3QgKilzYW1wbGVzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MzJfdCAqKXNhbXBsZXMxIH07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZnJhbWVfc2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKQorICAgICAgICAgICAgICAgICAgICBwdXRfc2JpdHMocGIsIHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc19zMzJbal1baV0gPj4gc2hpZnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50MTZfdCBjb25zdCAqc2FtcGxlc19zMTZbMl0gPSB7IChjb25zdCBpbnQxNl90ICopc2FtcGxlczAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKilzYW1wbGVzMSB9OworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmZyYW1lX3NpemU7IGkrKykKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykKKyAgICAgICAgICAgICAgICAgICAgcHV0X3NiaXRzKHBiLCBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfczE2W2pdW2ldKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHMtPndyaXRlX3NhbXBsZV9zaXplID0gcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgLSBzLT5leHRyYV9iaXRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyAtIDE7CisKKyAgICAgICAgaW5pdF9zYW1wbGVfYnVmZmVycyhzLCBjaGFubmVscywgc2FtcGxlcyk7CisgICAgICAgIHdyaXRlX2VsZW1lbnRfaGVhZGVyKHMsIGVsZW1lbnQsIGluc3RhbmNlKTsKKworICAgICAgICAvLyBleHRyYWN0IGV4dHJhIGJpdHMgaWYgbmVlZGVkCisgICAgICAgIGlmIChzLT5leHRyYV9iaXRzKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtYXNrID0gKDEgPDwgcy0+ZXh0cmFfYml0cykgLSAxOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90ICpleHRyYSA9IHMtPnByZWRpY3Rvcl9idWZbal07CisgICAgICAgICAgICAgICAgaW50MzJfdCAqc21wICAgPSBzLT5zYW1wbGVfYnVmW2pdOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZV9zaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFbaV0gPSBzbXBbaV0gJiBtYXNrOworICAgICAgICAgICAgICAgICAgICBzbXBbaV0gPj49IHMtPmV4dHJhX2JpdHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoYW5uZWxzID09IDIpCisgICAgICAgICAgICBhbGFjX3N0ZXJlb19kZWNvcnJlbGF0aW9uKHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5pbnRlcmxhY2luZ19zaGlmdCA9IHMtPmludGVybGFjaW5nX2xlZnR3ZWlnaHQgPSAwOworICAgICAgICBwdXRfYml0cyhwYiwgOCwgcy0+aW50ZXJsYWNpbmdfc2hpZnQpOworICAgICAgICBwdXRfYml0cyhwYiwgOCwgcy0+aW50ZXJsYWNpbmdfbGVmdHdlaWdodCk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGNhbGNfcHJlZGljdG9yX3BhcmFtcyhzLCBpKTsKKworICAgICAgICAgICAgcHV0X2JpdHMocGIsIDQsIHByZWRpY3Rpb25fdHlwZSk7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgNCwgcy0+bHBjW2ldLmxwY19xdWFudCk7CisKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAzLCBzLT5yYy5yaWNlX21vZGlmaWVyKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCA1LCBzLT5scGNbaV0ubHBjX29yZGVyKTsKKyAgICAgICAgICAgIC8vIHByZWRpY3RvciBjb2VmZi4gdGFibGUKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5scGNbaV0ubHBjX29yZGVyOyBqKyspCisgICAgICAgICAgICAgICAgcHV0X3NiaXRzKHBiLCAxNiwgcy0+bHBjW2ldLmxwY19jb2VmZltqXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3cml0ZSBleHRyYSBiaXRzIGlmIG5lZWRlZAorICAgICAgICBpZiAocy0+ZXh0cmFfYml0cykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmZyYW1lX3NpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBzLT5leHRyYV9iaXRzLCBzLT5wcmVkaWN0b3JfYnVmW2pdW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhcHBseSBscGMgYW5kIGVudHJvcHkgY29kaW5nIHRvIGF1ZGlvIHNhbXBsZXMKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGFsYWNfbGluZWFyX3ByZWRpY3RvcihzLCBpKTsKKworICAgICAgICAgICAgLy8gVE9ETzogZGV0ZXJtaW5lIHdoZW4gdGhpcyB3aWxsIGFjdHVhbGx5IGhlbHAuIGZvciBub3cgaXQncyBub3QgdXNlZC4KKyAgICAgICAgICAgIGlmIChwcmVkaWN0aW9uX3R5cGUgPT0gMTUpIHsKKyAgICAgICAgICAgICAgICAvLyAybmQgcGFzcyAxc3Qgb3JkZXIgZmlsdGVyCisgICAgICAgICAgICAgICAgaW50MzJfdCAqcmVzaWR1YWwgPSBzLT5wcmVkaWN0b3JfYnVmW2ldOworICAgICAgICAgICAgICAgIGZvciAoaiA9IHMtPmZyYW1lX3NpemUgLSAxOyBqID4gMDsgai0tKQorICAgICAgICAgICAgICAgICAgICByZXNpZHVhbFtqXSAtPSByZXNpZHVhbFtqIC0gMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbGFjX2VudHJvcHlfY29kZXIocywgaSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZnJhbWUoQWxhY0VuY29kZUNvbnRleHQgKnMsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0ICpzYW1wbGVzKQoreworICAgIFB1dEJpdENvbnRleHQgKnBiID0gJnMtPnBiY3R4OworICAgIGNvbnN0IGVudW0gQWxhY1Jhd0RhdGFCbG9ja1R5cGUgKmNoX2VsZW1lbnRzID0gZmZfYWxhY19jaGFubmVsX2VsZW1lbnRzW3MtPmF2Y3R4LT5jaGFubmVscyAtIDFdOworICAgIGNvbnN0IHVpbnQ4X3QgKmNoX21hcCA9IGZmX2FsYWNfY2hhbm5lbF9sYXlvdXRfb2Zmc2V0c1tzLT5hdmN0eC0+Y2hhbm5lbHMgLSAxXTsKKyAgICBpbnQgY2gsIGVsZW1lbnQsIHNjZSwgY3BlOworCisgICAgaW5pdF9wdXRfYml0cyhwYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIGNoID0gZWxlbWVudCA9IHNjZSA9IGNwZSA9IDA7CisgICAgd2hpbGUgKGNoIDwgcy0+YXZjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgIGlmIChjaF9lbGVtZW50c1tlbGVtZW50XSA9PSBUWVBFX0NQRSkgeworICAgICAgICAgICAgd3JpdGVfZWxlbWVudChzLCBUWVBFX0NQRSwgY3BlLCBzYW1wbGVzW2NoX21hcFtjaF1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzW2NoX21hcFtjaCArIDFdXSk7CisgICAgICAgICAgICBjcGUrKzsKKyAgICAgICAgICAgIGNoICs9IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZV9lbGVtZW50KHMsIFRZUEVfU0NFLCBzY2UsIHNhbXBsZXNbY2hfbWFwW2NoXV0sIE5VTEwpOworICAgICAgICAgICAgc2NlKys7CisgICAgICAgICAgICBjaCsrOworICAgICAgICB9CisgICAgICAgIGVsZW1lbnQrKzsKKyAgICB9CisKKyAgICBwdXRfYml0cyhwYiwgMywgVFlQRV9FTkQpOworICAgIGZsdXNoX3B1dF9iaXRzKHBiKTsKKworICAgIHJldHVybiBwdXRfYml0c19jb3VudChwYikgPj4gMzsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF9tYXhfZnJhbWVfc2l6ZShpbnQgZnJhbWVfc2l6ZSwgaW50IGNoLCBpbnQgYnBzKQoreworICAgIGludCBoZWFkZXJfYml0cyA9IDIzICsgMzIgKiAoZnJhbWVfc2l6ZSA8IERFRkFVTFRfRlJBTUVfU0laRSk7CisgICAgcmV0dXJuIEZGQUxJR04oaGVhZGVyX2JpdHMgKyBicHMgKiBjaCAqIGZyYW1lX3NpemUgKyAzLCA4KSAvIDg7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhbGFjX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQWxhY0VuY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGZmX2xwY19lbmQoJnMtPmxwY19jdHgpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYWxhY19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQWxhY0VuY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisgICAgdWludDhfdCAqYWxhY19leHRyYWRhdGE7CisKKyAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IHMtPmZyYW1lX3NpemUgPSBERUZBVUxUX0ZSQU1FX1NJWkU7CisKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzJQKSB7CisgICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSAhPSAyNCkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJlbmNvZGluZyBhcyAyNCBiaXRzLXBlci1zYW1wbGVcbiIpOworICAgICAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDI0OworICAgIH0gZWxzZSB7CisgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTY7CisgICAgICAgIHMtPmV4dHJhX2JpdHMgICAgICAgICAgICAgID0gMDsKKyAgICB9CisKKyAgICAvLyBTZXQgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbAorICAgIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPT0gRkZfQ09NUFJFU1NJT05fREVGQVVMVCkKKyAgICAgICAgcy0+Y29tcHJlc3Npb25fbGV2ZWwgPSAyOworICAgIGVsc2UKKyAgICAgICAgcy0+Y29tcHJlc3Npb25fbGV2ZWwgPSBhdl9jbGlwKGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbCwgMCwgMik7CisKKyAgICAvLyBJbml0aWFsaXplIGRlZmF1bHQgUmljZSBwYXJhbWV0ZXJzCisgICAgcy0+cmMuaGlzdG9yeV9tdWx0ICAgID0gNDA7CisgICAgcy0+cmMuaW5pdGlhbF9oaXN0b3J5ID0gMTA7CisgICAgcy0+cmMua19tb2RpZmllciAgICAgID0gMTQ7CisgICAgcy0+cmMucmljZV9tb2RpZmllciAgID0gNDsKKworICAgIHMtPm1heF9jb2RlZF9mcmFtZV9zaXplID0gZ2V0X21heF9mcmFtZV9zaXplKGF2Y3R4LT5mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSk7CisKKyAgICBhdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihBTEFDX0VYVFJBREFUQV9TSVpFICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gQUxBQ19FWFRSQURBVEFfU0laRTsKKworICAgIGFsYWNfZXh0cmFkYXRhID0gYXZjdHgtPmV4dHJhZGF0YTsKKyAgICBBVl9XQjMyKGFsYWNfZXh0cmFkYXRhLCAgICBBTEFDX0VYVFJBREFUQV9TSVpFKTsKKyAgICBBVl9XQjMyKGFsYWNfZXh0cmFkYXRhKzQsICBNS0JFVEFHKCdhJywnbCcsJ2EnLCdjJykpOworICAgIEFWX1dCMzIoYWxhY19leHRyYWRhdGErMTIsIGF2Y3R4LT5mcmFtZV9zaXplKTsKKyAgICBBVl9XQjggKGFsYWNfZXh0cmFkYXRhKzE3LCBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSk7CisgICAgQVZfV0I4IChhbGFjX2V4dHJhZGF0YSsyMSwgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICBBVl9XQjMyKGFsYWNfZXh0cmFkYXRhKzI0LCBzLT5tYXhfY29kZWRfZnJhbWVfc2l6ZSk7CisgICAgQVZfV0IzMihhbGFjX2V4dHJhZGF0YSsyOCwKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSAqIGF2Y3R4LT5jaGFubmVscyAqIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKTsgLy8gYXZlcmFnZSBiaXRyYXRlCisgICAgQVZfV0IzMihhbGFjX2V4dHJhZGF0YSszMiwgYXZjdHgtPnNhbXBsZV9yYXRlKTsKKworICAgIC8vIFNldCByZWxldmFudCBleHRyYWRhdGEgZmllbGRzCisgICAgaWYgKHMtPmNvbXByZXNzaW9uX2xldmVsID4gMCkgeworICAgICAgICBBVl9XQjgoYWxhY19leHRyYWRhdGErMTgsIHMtPnJjLmhpc3RvcnlfbXVsdCk7CisgICAgICAgIEFWX1dCOChhbGFjX2V4dHJhZGF0YSsxOSwgcy0+cmMuaW5pdGlhbF9oaXN0b3J5KTsKKyAgICAgICAgQVZfV0I4KGFsYWNfZXh0cmFkYXRhKzIwLCBzLT5yYy5rX21vZGlmaWVyKTsKKyAgICB9CisKKyAgICBzLT5taW5fcHJlZGljdGlvbl9vcmRlciA9IERFRkFVTFRfTUlOX1BSRURfT1JERVI7CisgICAgaWYgKGF2Y3R4LT5taW5fcHJlZGljdGlvbl9vcmRlciA+PSAwKSB7CisgICAgICAgIGlmIChhdmN0eC0+bWluX3ByZWRpY3Rpb25fb3JkZXIgPCBNSU5fTFBDX09SREVSIHx8CisgICAgICAgICAgIGF2Y3R4LT5taW5fcHJlZGljdGlvbl9vcmRlciA+IEFMQUNfTUFYX0xQQ19PUkRFUikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG1pbiBwcmVkaWN0aW9uIG9yZGVyOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+bWluX3ByZWRpY3Rpb25fb3JkZXIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHMtPm1pbl9wcmVkaWN0aW9uX29yZGVyID0gYXZjdHgtPm1pbl9wcmVkaWN0aW9uX29yZGVyOworICAgIH0KKworICAgIHMtPm1heF9wcmVkaWN0aW9uX29yZGVyID0gREVGQVVMVF9NQVhfUFJFRF9PUkRFUjsKKyAgICBpZiAoYXZjdHgtPm1heF9wcmVkaWN0aW9uX29yZGVyID49IDApIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5tYXhfcHJlZGljdGlvbl9vcmRlciA8IE1JTl9MUENfT1JERVIgfHwKKyAgICAgICAgICAgIGF2Y3R4LT5tYXhfcHJlZGljdGlvbl9vcmRlciA+IEFMQUNfTUFYX0xQQ19PUkRFUikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG1heCBwcmVkaWN0aW9uIG9yZGVyOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+bWF4X3ByZWRpY3Rpb25fb3JkZXIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHMtPm1heF9wcmVkaWN0aW9uX29yZGVyID0gYXZjdHgtPm1heF9wcmVkaWN0aW9uX29yZGVyOworICAgIH0KKworICAgIGlmIChzLT5tYXhfcHJlZGljdGlvbl9vcmRlciA8IHMtPm1pbl9wcmVkaWN0aW9uX29yZGVyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImludmFsaWQgcHJlZGljdGlvbiBvcmRlcnM6IG1pbj0lZCBtYXg9JWRcbiIsCisgICAgICAgICAgICAgICBzLT5taW5fcHJlZGljdGlvbl9vcmRlciwgcy0+bWF4X3ByZWRpY3Rpb25fb3JkZXIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIGlmICgocmV0ID0gZmZfbHBjX2luaXQoJnMtPmxwY19jdHgsIGF2Y3R4LT5mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF4X3ByZWRpY3Rpb25fb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9MUENfVFlQRV9MRVZJTlNPTikpIDwgMCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldHVybiAwOworZXJyb3I6CisgICAgYWxhY19lbmNvZGVfY2xvc2UoYXZjdHgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWxhY19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIEFsYWNFbmNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgb3V0X2J5dGVzLCBtYXhfZnJhbWVfc2l6ZSwgcmV0OworCisgICAgcy0+ZnJhbWVfc2l6ZSA9IGZyYW1lLT5uYl9zYW1wbGVzOworCisgICAgaWYgKGZyYW1lLT5uYl9zYW1wbGVzIDwgREVGQVVMVF9GUkFNRV9TSVpFKQorICAgICAgICBtYXhfZnJhbWVfc2l6ZSA9IGdldF9tYXhfZnJhbWVfc2l6ZShzLT5mcmFtZV9zaXplLCBhdmN0eC0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKTsKKyAgICBlbHNlCisgICAgICAgIG1heF9mcmFtZV9zaXplID0gcy0+bWF4X2NvZGVkX2ZyYW1lX3NpemU7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCAyICogbWF4X2ZyYW1lX3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiB1c2UgdmVyYmF0aW0gbW9kZSBmb3IgY29tcHJlc3Npb25fbGV2ZWwgMCAqLworICAgIGlmIChzLT5jb21wcmVzc2lvbl9sZXZlbCkgeworICAgICAgICBzLT52ZXJiYXRpbSAgID0gMDsKKyAgICAgICAgcy0+ZXh0cmFfYml0cyA9IGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlIC0gMTY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+dmVyYmF0aW0gICA9IDE7CisgICAgICAgIHMtPmV4dHJhX2JpdHMgPSAwOworICAgIH0KKworICAgIG91dF9ieXRlcyA9IHdyaXRlX2ZyYW1lKHMsIGF2cGt0LCBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSk7CisKKyAgICBpZiAob3V0X2J5dGVzID4gbWF4X2ZyYW1lX3NpemUpIHsKKyAgICAgICAgLyogZnJhbWUgdG9vIGxhcmdlLiB1c2UgdmVyYmF0aW0gbW9kZSAqLworICAgICAgICBzLT52ZXJiYXRpbSA9IDE7CisgICAgICAgIHMtPmV4dHJhX2JpdHMgPSAwOworICAgICAgICBvdXRfYnl0ZXMgPSB3cml0ZV9mcmFtZShzLCBhdnBrdCwgZnJhbWUtPmV4dGVuZGVkX2RhdGEpOworICAgIH0KKworICAgIGF2cGt0LT5zaXplID0gb3V0X2J5dGVzOworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfYWxhY19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhbGFjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQUxBQyAoQXBwbGUgTG9zc2xlc3MgQXVkaW8gQ29kZWMpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FMQUMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFsYWNFbmNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBhbGFjX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGFsYWNfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGFsYWNfZW5jb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FLAorICAgIC5jaGFubmVsX2xheW91dHMgPSBmZl9hbGFjX2NoYW5uZWxfbGF5b3V0cywKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMzJQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FsaWFzcGl4ZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hbGlhc3BpeGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzRjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hbGlhc3BpeGRlYy5jCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQWxpYXMgUElYIGltYWdlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNCBWaXR0b3JpbyBHaW92YXJhIDx2aXR0b3Jpby5naW92YXJhQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBBTElBU19IRUFERVJfU0laRSAxMAorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmYgPSBkYXRhOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIGludCB3aWR0aCwgaGVpZ2h0LCByZXQsIGJpdHNfcGl4ZWwsIHBpeGVsOworICAgIHVpbnQ4X3QgKm91dF9idWY7CisgICAgdWludDhfdCBjb3VudDsKKyAgICBpbnQgeCwgeTsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCBBTElBU19IRUFERVJfU0laRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkhlYWRlciB0b28gc21hbGwgJWQuXG4iLCBhdnBrdC0+c2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHdpZHRoICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgIGhlaWdodCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgNCk7IC8vIG9ic29sZXRlIFgsIFkgb2Zmc2V0CisgICAgYml0c19waXhlbCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworCisgICAgaWYgKGJpdHNfcGl4ZWwgPT0gMjQpCisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IyNDsKKyAgICBlbHNlIGlmIChiaXRzX3BpeGVsID09IDgpCisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZODsKKyAgICBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBpeGVsIGZvcm1hdC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGYtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGYtPmtleV9mcmFtZSA9IDE7CisKKyAgICB4ID0gMDsKKyAgICB5ID0gMTsKKyAgICBvdXRfYnVmID0gZi0+ZGF0YVswXTsKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA+IDApIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgLyogc2V0IGJ1ZmZlciBhdCB0aGUgcmlnaHQgcG9zaXRpb24gYXQgZXZlcnkgbmV3IGxpbmUgKi8KKyAgICAgICAgaWYgKHggPT0gYXZjdHgtPndpZHRoKSB7CisgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgIG91dF9idWYgPSBmLT5kYXRhWzBdICsgZi0+bGluZXNpemVbMF0gKiB5Kys7CisgICAgICAgICAgICBpZiAoeSA+IGF2Y3R4LT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkVuZGVkIGZyYW1lIGRlY29kaW5nIHdpdGggJWQgYnl0ZXMgbGVmdC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogcmVhZCBwYWNrZXQgYW5kIGNvcHkgZGF0YSAqLworICAgICAgICBjb3VudCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICBpZiAoIWNvdW50IHx8IHggKyBjb3VudCA+IGF2Y3R4LT53aWR0aCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHJ1biBsZW5ndGggJWQuXG4iLCBjb3VudCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjI0KSB7CisgICAgICAgICAgICBwaXhlbCA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0KCZnYik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIEFWX1dCMjQob3V0X2J1ZiwgcGl4ZWwpOworICAgICAgICAgICAgICAgIG91dF9idWYgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gQVZfUElYX0ZNVF9HUkFZOAorICAgICAgICAgICAgcGl4ZWwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgKm91dF9idWYrKyA9IHBpeGVsOworICAgICAgICB9CisKKyAgICAgICAgeCArPSBpOworICAgIH0KKworICAgIGlmICh4ICE9IHdpZHRoIHx8IHkgIT0gaGVpZ2h0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGljdHVyZSBzdG9wcGVkIGF0ICVkLCVkLlxuIiwgeCwgeSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl9hbGlhc19waXhfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gImFsaWFzX3BpeCIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBbGlhcy9XYXZlZnJvbnQgUElYIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfQUxJQVNfUElYLAorICAgIC5kZWNvZGUgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWxpYXNwaXhlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FsaWFzcGl4ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjZWEwOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FsaWFzcGl4ZW5jLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBBbGlhcyBQSVggaW1hZ2UgZW5jb2RlcgorICogQ29weXJpZ2h0IChDKSAyMDE0IFZpdHRvcmlvIEdpb3ZhcmEgPHZpdHRvcmlvLmdpb3ZhcmFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIEFMSUFTX0hFQURFUl9TSVpFIDEwCisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWF2Y3R4LT5jb2RlZF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBpbnQgd2lkdGgsIGhlaWdodCwgYml0c19waXhlbCwgaSwgaiwgbGVuZ3RoLCByZXQ7CisgICAgdWludDhfdCAqaW5fYnVmLCAqYnVmOworCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDE7CisKKyAgICB3aWR0aCAgPSBhdmN0eC0+d2lkdGg7CisgICAgaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKworICAgIGlmICh3aWR0aCA+IDY1NTM1IHx8IGhlaWdodCA+IDY1NTM1IHx8CisgICAgICAgIHdpZHRoICogaGVpZ2h0ID49IElOVF9NQVggLyA0IC0gQUxJQVNfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGltYWdlIHNpemUgJWR4JWQuXG4iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICAgICAgYml0c19waXhlbCA9IDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IyNDoKKyAgICAgICAgYml0c19waXhlbCA9IDI0OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGxlbmd0aCA9IEFMSUFTX0hFQURFUl9TSVpFICsgNCAqIHdpZHRoICogaGVpZ2h0OyAvLyBtYXggcG9zc2libGUKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldChwa3QsIGxlbmd0aCkpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGdldHRpbmcgb3V0cHV0IHBhY2tldCBvZiBzaXplICVkLlxuIiwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBidWYgPSBwa3QtPmRhdGE7CisKKyAgICAvKiBFbmNvZGUgaGVhZGVyLiAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1Ziwgd2lkdGgpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgaGVpZ2h0KTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIDApOyAvKiBYLCBZIG9mZnNldCAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgYml0c19waXhlbCk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgaW5fYnVmID0gZnJhbWUtPmRhdGFbMF0gKyBmcmFtZS0+bGluZXNpemVbMF0gKiBqOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIGludCBwaXhlbDsKKworICAgICAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR1JBWTgpIHsKKyAgICAgICAgICAgICAgICBwaXhlbCA9ICppbl9idWY7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNvdW50IDwgMjU1ICYmIGNvdW50ICsgaSA8IHdpZHRoICYmIHBpeGVsID09ICppbl9idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgaW5fYnVmKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgY291bnQpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgcGl4ZWwpOworICAgICAgICAgICAgfSBlbHNlIHsgLyogQVZfUElYX0ZNVF9CR1IyNCAqLworICAgICAgICAgICAgICAgIHBpeGVsID0gQVZfUkIyNChpbl9idWYpOworICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDI1NSAmJiBjb3VudCArIGkgPCB3aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCA9PSBBVl9SQjI0KGluX2J1ZikpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgaW5fYnVmICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgY291bnQpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMjQoJmJ1ZiwgcGl4ZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSArPSBjb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRvdGFsIGxlbmd0aCAqLworICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCBidWYgLSBwa3QtPmRhdGEpOworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdl9mcmFtZV9mcmVlKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2FsaWFzX3BpeF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgPSAiYWxpYXNfcGl4IiwKKyAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFsaWFzL1dhdmVmcm9udCBQSVggaW1hZ2UiKSwKKyAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BTElBU19QSVgsCisgICAgLmluaXQgICAgICA9IGVuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgPSBlbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICA9IGVuY29kZV9jbG9zZSwKKyAgICAucGl4X2ZtdHMgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfQkdSMjQsIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfTk9ORQorICAgIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWxsY29kZWNzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hbGxjb2RlY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDM5ZDMzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxsY29kZWNzLmMKQEAgLTAsMCArMSw1OTMgQEAKKy8qCisgKiBQcm92aWRlIHJlZ2lzdHJhdGlvbiBvZiBhbGwgY29kZWNzLCBwYXJzZXJzIGFuZCBiaXRzdHJlYW0gZmlsdGVycyBmb3IgbGliYXZjb2RlYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUHJvdmlkZSByZWdpc3RyYXRpb24gb2YgYWxsIGNvZGVjcywgcGFyc2VycyBhbmQgYml0c3RyZWFtIGZpbHRlcnMgZm9yIGxpYmF2Y29kZWMuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNkZWZpbmUgUkVHSVNURVJfSFdBQ0NFTChYLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZXh0ZXJuIEFWSFdBY2NlbCBmZl8jI3gjI19od2FjY2VsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKENPTkZJR18jI1gjI19IV0FDQ0VMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2X3JlZ2lzdGVyX2h3YWNjZWwoJmZmXyMjeCMjX2h3YWNjZWwpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgUkVHSVNURVJfRU5DT0RFUihYLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZXh0ZXJuIEFWQ29kZWMgZmZfIyN4IyNfZW5jb2RlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKENPTkZJR18jI1gjI19FTkNPREVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2Y29kZWNfcmVnaXN0ZXIoJmZmXyMjeCMjX2VuY29kZXIpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgUkVHSVNURVJfREVDT0RFUihYLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZXh0ZXJuIEFWQ29kZWMgZmZfIyN4IyNfZGVjb2RlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKENPTkZJR18jI1gjI19ERUNPREVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2Y29kZWNfcmVnaXN0ZXIoJmZmXyMjeCMjX2RlY29kZXIpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgUkVHSVNURVJfRU5DREVDKFgsIHgpIFJFR0lTVEVSX0VOQ09ERVIoWCwgeCk7IFJFR0lTVEVSX0RFQ09ERVIoWCwgeCkKKworI2RlZmluZSBSRUdJU1RFUl9QQVJTRVIoWCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBleHRlcm4gQVZDb2RlY1BhcnNlciBmZl8jI3gjI19wYXJzZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoQ09ORklHXyMjWCMjX1BBUlNFUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXZfcmVnaXN0ZXJfY29kZWNfcGFyc2VyKCZmZl8jI3gjI19wYXJzZXIpOyAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBSRUdJU1RFUl9CU0YoWCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBleHRlcm4gQVZCaXRTdHJlYW1GaWx0ZXIgZmZfIyN4IyNfYnNmOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoQ09ORklHXyMjWCMjX0JTRikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXZfcmVnaXN0ZXJfYml0c3RyZWFtX2ZpbHRlcigmZmZfIyN4IyNfYnNmKTsgICAgICAgICAgICAgICAgXAorICAgIH0KKwordm9pZCBhdmNvZGVjX3JlZ2lzdGVyX2FsbCh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisKKyAgICBpZiAoaW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBpbml0aWFsaXplZCA9IDE7CisKKyAgICAvKiBoYXJkd2FyZSBhY2NlbGVyYXRvcnMgKi8KKyAgICBSRUdJU1RFUl9IV0FDQ0VMKEgyNjNfVkFBUEksICAgICAgICBoMjYzX3ZhYXBpKTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKEgyNjNfVkRQQVUsICAgICAgICBoMjYzX3ZkcGF1KTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKEgyNjRfRFhWQTIsICAgICAgICBoMjY0X2R4dmEyKTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKEgyNjRfVkFBUEksICAgICAgICBoMjY0X3ZhYXBpKTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKEgyNjRfVkRBLCAgICAgICAgICBoMjY0X3ZkYSk7CisgICAgUkVHSVNURVJfSFdBQ0NFTChIMjY0X1ZEQV9PTEQsICAgICAgaDI2NF92ZGFfb2xkKTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKEgyNjRfVkRQQVUsICAgICAgICBoMjY0X3ZkcGF1KTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKE1QRUcxX1hWTUMsICAgICAgICBtcGVnMV94dm1jKTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKE1QRUcxX1ZEUEFVLCAgICAgICBtcGVnMV92ZHBhdSk7CisgICAgUkVHSVNURVJfSFdBQ0NFTChNUEVHMl9YVk1DLCAgICAgICAgbXBlZzJfeHZtYyk7CisgICAgUkVHSVNURVJfSFdBQ0NFTChNUEVHMl9EWFZBMiwgICAgICAgbXBlZzJfZHh2YTIpOworICAgIFJFR0lTVEVSX0hXQUNDRUwoTVBFRzJfVkFBUEksICAgICAgIG1wZWcyX3ZhYXBpKTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKE1QRUcyX1ZEUEFVLCAgICAgICBtcGVnMl92ZHBhdSk7CisgICAgUkVHSVNURVJfSFdBQ0NFTChNUEVHNF9WQUFQSSwgICAgICAgbXBlZzRfdmFhcGkpOworICAgIFJFR0lTVEVSX0hXQUNDRUwoTVBFRzRfVkRQQVUsICAgICAgIG1wZWc0X3ZkcGF1KTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKFZDMV9EWFZBMiwgICAgICAgICB2YzFfZHh2YTIpOworICAgIFJFR0lTVEVSX0hXQUNDRUwoVkMxX1ZBQVBJLCAgICAgICAgIHZjMV92YWFwaSk7CisgICAgUkVHSVNURVJfSFdBQ0NFTChWQzFfVkRQQVUsICAgICAgICAgdmMxX3ZkcGF1KTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKFdNVjNfRFhWQTIsICAgICAgICB3bXYzX2R4dmEyKTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKFdNVjNfVkFBUEksICAgICAgICB3bXYzX3ZhYXBpKTsKKyAgICBSRUdJU1RFUl9IV0FDQ0VMKFdNVjNfVkRQQVUsICAgICAgICB3bXYzX3ZkcGF1KTsKKworICAgIC8qIHZpZGVvIGNvZGVjcyAqLworICAgIFJFR0lTVEVSX0VOQ09ERVIoQTY0TVVMVEksICAgICAgICAgIGE2NG11bHRpKTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKEE2NE1VTFRJNSwgICAgICAgICBhNjRtdWx0aTUpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQUFTQywgICAgICAgICAgICAgIGFhc2MpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQUlDLCAgICAgICAgICAgICAgIGFpYyk7CisgICAgUkVHSVNURVJfRU5DREVDIChBTElBU19QSVgsICAgICAgICAgYWxpYXNfcGl4KTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKEFNViwgICAgICAgICAgICAgICBhbXYpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQU5NLCAgICAgICAgICAgICAgIGFubSk7CisgICAgUkVHSVNURVJfREVDT0RFUihBTlNJLCAgICAgICAgICAgICAgYW5zaSk7CisgICAgUkVHSVNURVJfREVDT0RFUihBUE5HLCAgICAgICAgICAgICAgYXBuZyk7CisgICAgUkVHSVNURVJfRU5DREVDIChBU1YxLCAgICAgICAgICAgICAgYXN2MSk7CisgICAgUkVHSVNURVJfRU5DREVDIChBU1YyLCAgICAgICAgICAgICAgYXN2Mik7CisgICAgUkVHSVNURVJfREVDT0RFUihBVVJBLCAgICAgICAgICAgICAgYXVyYSk7CisgICAgUkVHSVNURVJfREVDT0RFUihBVVJBMiwgICAgICAgICAgICAgYXVyYTIpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoQVZSUCwgICAgICAgICAgICAgIGF2cnApOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQVZSTiwgICAgICAgICAgICAgIGF2cm4pOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQVZTLCAgICAgICAgICAgICAgIGF2cyk7CisgICAgUkVHSVNURVJfRU5DREVDIChBVlVJLCAgICAgICAgICAgICAgYXZ1aSk7CisgICAgUkVHSVNURVJfRU5DREVDIChBWVVWLCAgICAgICAgICAgICAgYXl1dik7CisgICAgUkVHSVNURVJfREVDT0RFUihCRVRIU09GVFZJRCwgICAgICAgYmV0aHNvZnR2aWQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQkZJLCAgICAgICAgICAgICAgIGJmaSk7CisgICAgUkVHSVNURVJfREVDT0RFUihCSU5LLCAgICAgICAgICAgICAgYmluayk7CisgICAgUkVHSVNURVJfRU5DREVDIChCTVAsICAgICAgICAgICAgICAgYm1wKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEJNVl9WSURFTywgICAgICAgICBibXZfdmlkZW8pOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQlJFTkRFUl9QSVgsICAgICAgIGJyZW5kZXJfcGl4KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEM5MywgICAgICAgICAgICAgICBjOTMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQ0FWUywgICAgICAgICAgICAgIGNhdnMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQ0RHUkFQSElDUywgICAgICAgIGNkZ3JhcGhpY3MpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQ0RYTCwgICAgICAgICAgICAgIGNkeGwpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoQ0lORVBBSywgICAgICAgICAgIGNpbmVwYWspOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoQ0xKUiwgICAgICAgICAgICAgIGNsanIpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQ0xMQywgICAgICAgICAgICAgIGNsbGMpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoQ09NRk9SVE5PSVNFLCAgICAgIGNvbWZvcnRub2lzZSk7CisgICAgUkVHSVNURVJfREVDT0RFUihDUElBLCAgICAgICAgICAgICAgY3BpYSk7CisgICAgUkVHSVNURVJfREVDT0RFUihDU0NELCAgICAgICAgICAgICAgY3NjZCk7CisgICAgUkVHSVNURVJfREVDT0RFUihDWVVWLCAgICAgICAgICAgICAgY3l1dik7CisgICAgUkVHSVNURVJfREVDT0RFUihERkEsICAgICAgICAgICAgICAgZGZhKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKERJUkFDLCAgICAgICAgICAgICBkaXJhYyk7CisgICAgUkVHSVNURVJfRU5DREVDIChETlhIRCwgICAgICAgICAgICAgZG54aGQpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoRFBYLCAgICAgICAgICAgICAgIGRweCk7CisgICAgUkVHSVNURVJfREVDT0RFUihEU0lDSU5WSURFTywgICAgICAgZHNpY2ludmlkZW8pOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoRFZWSURFTywgICAgICAgICAgIGR2dmlkZW8pOworICAgIFJFR0lTVEVSX0RFQ09ERVIoRFhBLCAgICAgICAgICAgICAgIGR4YSk7CisgICAgUkVHSVNURVJfREVDT0RFUihEWFRPUlksICAgICAgICAgICAgZHh0b3J5KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEVBQ01WLCAgICAgICAgICAgICBlYWNtdik7CisgICAgUkVHSVNURVJfREVDT0RFUihFQU1BRCwgICAgICAgICAgICAgZWFtYWQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoRUFUR1EsICAgICAgICAgICAgIGVhdGdxKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEVBVEdWLCAgICAgICAgICAgICBlYXRndik7CisgICAgUkVHSVNURVJfREVDT0RFUihFQVRRSSwgICAgICAgICAgICAgZWF0cWkpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoRUlHSFRCUFMsICAgICAgICAgIGVpZ2h0YnBzKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEVJR0hUU1ZYX0VYUCwgICAgICBlaWdodHN2eF9leHApOworICAgIFJFR0lTVEVSX0RFQ09ERVIoRUlHSFRTVlhfRklCLCAgICAgIGVpZ2h0c3Z4X2ZpYik7CisgICAgUkVHSVNURVJfREVDT0RFUihFU0NBUEUxMjQsICAgICAgICAgZXNjYXBlMTI0KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEVTQ0FQRTEzMCwgICAgICAgICBlc2NhcGUxMzApOworICAgIFJFR0lTVEVSX0RFQ09ERVIoRVhSLCAgICAgICAgICAgICAgIGV4cik7CisgICAgUkVHSVNURVJfRU5DREVDIChGRlYxLCAgICAgICAgICAgICAgZmZ2MSk7CisgICAgUkVHSVNURVJfRU5DREVDIChGRlZIVUZGLCAgICAgICAgICAgZmZ2aHVmZik7CisgICAgUkVHSVNURVJfREVDT0RFUihGSUMsICAgICAgICAgICAgICAgZmljKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKEZMQVNIU1YsICAgICAgICAgICBmbGFzaHN2KTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKEZMQVNIU1YyLCAgICAgICAgICBmbGFzaHN2Mik7CisgICAgUkVHSVNURVJfREVDT0RFUihGTElDLCAgICAgICAgICAgICAgZmxpYyk7CisgICAgUkVHSVNURVJfRU5DREVDIChGTFYsICAgICAgICAgICAgICAgZmx2KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEZPVVJYTSwgICAgICAgICAgICBmb3VyeG0pOworICAgIFJFR0lTVEVSX0RFQ09ERVIoRlJBUFMsICAgICAgICAgICAgIGZyYXBzKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEZSV1UsICAgICAgICAgICAgICBmcnd1KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEcyTSwgICAgICAgICAgICAgICBnMm0pOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoR0lGLCAgICAgICAgICAgICAgIGdpZik7CisgICAgUkVHSVNURVJfRU5DREVDIChIMjYxLCAgICAgICAgICAgICAgaDI2MSk7CisgICAgUkVHSVNURVJfRU5DREVDIChIMjYzLCAgICAgICAgICAgICAgaDI2Myk7CisgICAgUkVHSVNURVJfREVDT0RFUihIMjYzSSwgICAgICAgICAgICAgaDI2M2kpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoSDI2M1AsICAgICAgICAgICAgIGgyNjNwKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEgyNjQsICAgICAgICAgICAgICBoMjY0KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEgyNjRfQ1JZU1RBTEhELCAgICBoMjY0X2NyeXN0YWxoZCk7CisgICAgUkVHSVNURVJfREVDT0RFUihIMjY0X1ZEQSwgICAgICAgICAgaDI2NF92ZGEpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoSDI2NF9WRFBBVSwgICAgICAgIGgyNjRfdmRwYXUpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoSEVWQywgICAgICAgICAgICAgIGhldmMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoSE5NNF9WSURFTywgICAgICAgIGhubTRfdmlkZW8pOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoSFVGRllVViwgICAgICAgICAgIGh1ZmZ5dXYpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoSURDSU4sICAgICAgICAgICAgIGlkY2luKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKElGRl9CWVRFUlVOMSwgICAgICBpZmZfYnl0ZXJ1bjEpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoSUZGX0lMQk0sICAgICAgICAgIGlmZl9pbGJtKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKElOREVPMiwgICAgICAgICAgICBpbmRlbzIpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoSU5ERU8zLCAgICAgICAgICAgIGluZGVvMyk7CisgICAgUkVHSVNURVJfREVDT0RFUihJTkRFTzQsICAgICAgICAgICAgaW5kZW80KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKElOREVPNSwgICAgICAgICAgICBpbmRlbzUpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoSU5URVJQTEFZX1ZJREVPLCAgIGludGVycGxheV92aWRlbyk7CisgICAgUkVHSVNURVJfRU5DREVDIChKUEVHMjAwMCwgICAgICAgICAganBlZzIwMDApOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoSlBFR0xTLCAgICAgICAgICAgIGpwZWdscyk7CisgICAgUkVHSVNURVJfREVDT0RFUihKViwgICAgICAgICAgICAgICAganYpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoS0dWMSwgICAgICAgICAgICAgIGtndjEpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoS01WQywgICAgICAgICAgICAgIGttdmMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTEFHQVJJVEgsICAgICAgICAgIGxhZ2FyaXRoKTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKExKUEVHLCAgICAgICAgICAgICBsanBlZyk7CisgICAgUkVHSVNURVJfREVDT0RFUihMT0NPLCAgICAgICAgICAgICAgbG9jbyk7CisgICAgUkVHSVNURVJfREVDT0RFUihNREVDLCAgICAgICAgICAgICAgbWRlYyk7CisgICAgUkVHSVNURVJfREVDT0RFUihNSU1JQywgICAgICAgICAgICAgbWltaWMpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoTUpQRUcsICAgICAgICAgICAgIG1qcGVnKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKE1KUEVHQiwgICAgICAgICAgICBtanBlZ2IpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTU1WSURFTywgICAgICAgICAgIG1tdmlkZW8pOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTU9USU9OUElYRUxTLCAgICAgIG1vdGlvbnBpeGVscyk7CisjaWYgRkZfQVBJX1hWTUMKKyAgICBSRUdJU1RFUl9ERUNPREVSKE1QRUdfWFZNQywgICAgICAgICBtcGVnX3h2bWMpOworI2VuZGlmIC8qIEZGX0FQSV9YVk1DICovCisgICAgUkVHSVNURVJfRU5DREVDIChNUEVHMVZJREVPLCAgICAgICAgbXBlZzF2aWRlbyk7CisgICAgUkVHSVNURVJfRU5DREVDIChNUEVHMlZJREVPLCAgICAgICAgbXBlZzJ2aWRlbyk7CisgICAgUkVHSVNURVJfRU5DREVDIChNUEVHNCwgICAgICAgICAgICAgbXBlZzQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTVBFRzRfQ1JZU1RBTEhELCAgIG1wZWc0X2NyeXN0YWxoZCk7CisgICAgUkVHSVNURVJfREVDT0RFUihNUEVHNF9WRFBBVSwgICAgICAgbXBlZzRfdmRwYXUpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTVBFR1ZJREVPLCAgICAgICAgIG1wZWd2aWRlbyk7CisgICAgUkVHSVNURVJfREVDT0RFUihNUEVHX1ZEUEFVLCAgICAgICAgbXBlZ192ZHBhdSk7CisgICAgUkVHSVNURVJfREVDT0RFUihNUEVHMV9WRFBBVSwgICAgICAgbXBlZzFfdmRwYXUpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTVBFRzJfQ1JZU1RBTEhELCAgIG1wZWcyX2NyeXN0YWxoZCk7CisgICAgUkVHSVNURVJfREVDT0RFUihNU0ExLCAgICAgICAgICAgICAgbXNhMSk7CisgICAgUkVHSVNURVJfREVDT0RFUihNU01QRUc0X0NSWVNUQUxIRCwgbXNtcGVnNF9jcnlzdGFsaGQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTVNNUEVHNFYxLCAgICAgICAgIG1zbXBlZzR2MSk7CisgICAgUkVHSVNURVJfRU5DREVDIChNU01QRUc0VjIsICAgICAgICAgbXNtcGVnNHYyKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKE1TTVBFRzRWMywgICAgICAgICBtc21wZWc0djMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTVNSTEUsICAgICAgICAgICAgIG1zcmxlKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKE1TUzEsICAgICAgICAgICAgICBtc3MxKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKE1TUzIsICAgICAgICAgICAgICBtc3MyKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKE1TVklERU8xLCAgICAgICAgICBtc3ZpZGVvMSk7CisgICAgUkVHSVNURVJfREVDT0RFUihNU1pILCAgICAgICAgICAgICAgbXN6aCk7CisgICAgUkVHSVNURVJfREVDT0RFUihNVFMyLCAgICAgICAgICAgICAgbXRzMik7CisgICAgUkVHSVNURVJfREVDT0RFUihNVkMxLCAgICAgICAgICAgICAgbXZjMSk7CisgICAgUkVHSVNURVJfREVDT0RFUihNVkMyLCAgICAgICAgICAgICAgbXZjMik7CisgICAgUkVHSVNURVJfREVDT0RFUihNWFBFRywgICAgICAgICAgICAgbXhwZWcpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTlVWLCAgICAgICAgICAgICAgIG51dik7CisgICAgUkVHSVNURVJfREVDT0RFUihQQUZfVklERU8sICAgICAgICAgcGFmX3ZpZGVvKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBBTSwgICAgICAgICAgICAgICBwYW0pOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUEJNLCAgICAgICAgICAgICAgIHBibSk7CisgICAgUkVHSVNURVJfRU5DREVDIChQQ1gsICAgICAgICAgICAgICAgcGN4KTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBHTSwgICAgICAgICAgICAgICBwZ20pOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUEdNWVVWLCAgICAgICAgICAgIHBnbXl1dik7CisgICAgUkVHSVNURVJfREVDT0RFUihQSUNUT1IsICAgICAgICAgICAgcGljdG9yKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBORywgICAgICAgICAgICAgICBwbmcpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUFBNLCAgICAgICAgICAgICAgIHBwbSk7CisgICAgUkVHSVNURVJfRU5DREVDIChQUk9SRVMsICAgICAgICAgICAgcHJvcmVzKTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKFBST1JFU19BVywgICAgICAgICBwcm9yZXNfYXcpOworICAgIFJFR0lTVEVSX0VOQ09ERVIoUFJPUkVTX0tTLCAgICAgICAgIHByb3Jlc19rcyk7CisgICAgUkVHSVNURVJfREVDT0RFUihQUk9SRVNfTEdQTCwgICAgICAgcHJvcmVzX2xncGwpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoUFRYLCAgICAgICAgICAgICAgIHB0eCk7CisgICAgUkVHSVNURVJfREVDT0RFUihRRFJBVywgICAgICAgICAgICAgcWRyYXcpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoUVBFRywgICAgICAgICAgICAgIHFwZWcpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUVRSTEUsICAgICAgICAgICAgIHF0cmxlKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFIxMEssICAgICAgICAgICAgICByMTBrKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFIyMTAsICAgICAgICAgICAgICByMjEwKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFJBV1ZJREVPLCAgICAgICAgICByYXd2aWRlbyk7CisgICAgUkVHSVNURVJfREVDT0RFUihSTDIsICAgICAgICAgICAgICAgcmwyKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFJPUSwgICAgICAgICAgICAgICByb3EpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoUlBaQSwgICAgICAgICAgICAgIHJwemEpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUlYxMCwgICAgICAgICAgICAgIHJ2MTApOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUlYyMCwgICAgICAgICAgICAgIHJ2MjApOworICAgIFJFR0lTVEVSX0RFQ09ERVIoUlYzMCwgICAgICAgICAgICAgIHJ2MzApOworICAgIFJFR0lTVEVSX0RFQ09ERVIoUlY0MCwgICAgICAgICAgICAgIHJ2NDApOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUzMwMk0sICAgICAgICAgICAgIHMzMDJtKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFNBTk0sICAgICAgICAgICAgICBzYW5tKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFNHSSwgICAgICAgICAgICAgICBzZ2kpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoU0dJUkxFLCAgICAgICAgICAgIHNnaXJsZSk7CisgICAgUkVHSVNURVJfREVDT0RFUihTTUFDS0VSLCAgICAgICAgICAgc21hY2tlcik7CisgICAgUkVHSVNURVJfREVDT0RFUihTTUMsICAgICAgICAgICAgICAgc21jKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFNNVkpQRUcsICAgICAgICAgICBzbXZqcGVnKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFNOT1csICAgICAgICAgICAgICBzbm93KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFNQNVgsICAgICAgICAgICAgICBzcDV4KTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFNVTlJBU1QsICAgICAgICAgICBzdW5yYXN0KTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFNWUTEsICAgICAgICAgICAgICBzdnExKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFNWUTMsICAgICAgICAgICAgICBzdnEzKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFRBUkdBLCAgICAgICAgICAgICB0YXJnYSk7CisgICAgUkVHSVNURVJfREVDT0RFUihUQVJHQV9ZMjE2LCAgICAgICAgdGFyZ2FfeTIxNik7CisgICAgUkVHSVNURVJfREVDT0RFUihUSEVPUkEsICAgICAgICAgICAgdGhlb3JhKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFRIUCwgICAgICAgICAgICAgICB0aHApOworICAgIFJFR0lTVEVSX0RFQ09ERVIoVElFUlRFWFNFUVZJREVPLCAgIHRpZXJ0ZXhzZXF2aWRlbyk7CisgICAgUkVHSVNURVJfRU5DREVDIChUSUZGLCAgICAgICAgICAgICAgdGlmZik7CisgICAgUkVHSVNURVJfREVDT0RFUihUTVYsICAgICAgICAgICAgICAgdG12KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFRSVUVNT1RJT04xLCAgICAgICB0cnVlbW90aW9uMSk7CisgICAgUkVHSVNURVJfREVDT0RFUihUUlVFTU9USU9OMiwgICAgICAgdHJ1ZW1vdGlvbjIpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoVFNDQywgICAgICAgICAgICAgIHRzY2MpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoVFNDQzIsICAgICAgICAgICAgIHRzY2MyKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFRYRCwgICAgICAgICAgICAgICB0eGQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoVUxUSSwgICAgICAgICAgICAgIHVsdGkpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoVVRWSURFTywgICAgICAgICAgIHV0dmlkZW8pOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoVjIxMCwgICAgICAgICAgICAgIHYyMTApOworICAgIFJFR0lTVEVSX0RFQ09ERVIoVjIxMFgsICAgICAgICAgICAgIHYyMTB4KTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFYzMDgsICAgICAgICAgICAgICB2MzA4KTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFY0MDgsICAgICAgICAgICAgICB2NDA4KTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFY0MTAsICAgICAgICAgICAgICB2NDEwKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFZCLCAgICAgICAgICAgICAgICB2Yik7CisgICAgUkVHSVNURVJfREVDT0RFUihWQkxFLCAgICAgICAgICAgICAgdmJsZSk7CisgICAgUkVHSVNURVJfREVDT0RFUihWQzEsICAgICAgICAgICAgICAgdmMxKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFZDMV9DUllTVEFMSEQsICAgICB2YzFfY3J5c3RhbGhkKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFZDMV9WRFBBVSwgICAgICAgICB2YzFfdmRwYXUpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoVkMxSU1BR0UsICAgICAgICAgIHZjMWltYWdlKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFZDUjEsICAgICAgICAgICAgICB2Y3IxKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFZNRFZJREVPLCAgICAgICAgICB2bWR2aWRlbyk7CisgICAgUkVHSVNURVJfREVDT0RFUihWTU5DLCAgICAgICAgICAgICAgdm1uYyk7CisgICAgUkVHSVNURVJfREVDT0RFUihWUDMsICAgICAgICAgICAgICAgdnAzKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFZQNSwgICAgICAgICAgICAgICB2cDUpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoVlA2LCAgICAgICAgICAgICAgIHZwNik7CisgICAgUkVHSVNURVJfREVDT0RFUihWUDZBLCAgICAgICAgICAgICAgdnA2YSk7CisgICAgUkVHSVNURVJfREVDT0RFUihWUDZGLCAgICAgICAgICAgICAgdnA2Zik7CisgICAgUkVHSVNURVJfREVDT0RFUihWUDcsICAgICAgICAgICAgICAgdnA3KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFZQOCwgICAgICAgICAgICAgICB2cDgpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoVlA5LCAgICAgICAgICAgICAgIHZwOSk7CisgICAgUkVHSVNURVJfREVDT0RFUihWUUEsICAgICAgICAgICAgICAgdnFhKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFdFQlAsICAgICAgICAgICAgICB3ZWJwKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFdNVjEsICAgICAgICAgICAgICB3bXYxKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFdNVjIsICAgICAgICAgICAgICB3bXYyKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFdNVjMsICAgICAgICAgICAgICB3bXYzKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFdNVjNfQ1JZU1RBTEhELCAgICB3bXYzX2NyeXN0YWxoZCk7CisgICAgUkVHSVNURVJfREVDT0RFUihXTVYzX1ZEUEFVLCAgICAgICAgd212M192ZHBhdSk7CisgICAgUkVHSVNURVJfREVDT0RFUihXTVYzSU1BR0UsICAgICAgICAgd212M2ltYWdlKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFdOVjEsICAgICAgICAgICAgICB3bnYxKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFhBTl9XQzMsICAgICAgICAgICB4YW5fd2MzKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFhBTl9XQzQsICAgICAgICAgICB4YW5fd2M0KTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFhCTSwgICAgICAgICAgICAgICB4Ym0pOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoWEZBQ0UsICAgICAgICAgICAgIHhmYWNlKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFhMLCAgICAgICAgICAgICAgICB4bCk7CisgICAgUkVHSVNURVJfRU5DREVDIChYV0QsICAgICAgICAgICAgICAgeHdkKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFk0MVAsICAgICAgICAgICAgICB5NDFwKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFlPUCwgICAgICAgICAgICAgICB5b3ApOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoWVVWNCwgICAgICAgICAgICAgIHl1djQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoWkVSTzEyViwgICAgICAgICAgIHplcm8xMnYpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoWkVST0NPREVDLCAgICAgICAgIHplcm9jb2RlYyk7CisgICAgUkVHSVNURVJfRU5DREVDIChaTElCLCAgICAgICAgICAgICAgemxpYik7CisgICAgUkVHSVNURVJfRU5DREVDIChaTUJWLCAgICAgICAgICAgICAgem1idik7CisKKyAgICAvKiBhdWRpbyBjb2RlY3MgKi8KKyAgICBSRUdJU1RFUl9FTkNERUMgKEFBQywgICAgICAgICAgICAgICBhYWMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQUFDX0xBVE0sICAgICAgICAgIGFhY19sYXRtKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKEFDMywgICAgICAgICAgICAgICBhYzMpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoQUMzX0ZJWEVELCAgICAgICAgIGFjM19maXhlZCk7CisgICAgUkVHSVNURVJfRU5DREVDIChBTEFDLCAgICAgICAgICAgICAgYWxhYyk7CisgICAgUkVHSVNURVJfREVDT0RFUihBTFMsICAgICAgICAgICAgICAgYWxzKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEFNUk5CLCAgICAgICAgICAgICBhbXJuYik7CisgICAgUkVHSVNURVJfREVDT0RFUihBTVJXQiwgICAgICAgICAgICAgYW1yd2IpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQVBFLCAgICAgICAgICAgICAgIGFwZSk7CisgICAgUkVHSVNURVJfREVDT0RFUihBVFJBQzEsICAgICAgICAgICAgYXRyYWMxKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEFUUkFDMywgICAgICAgICAgICBhdHJhYzMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQVRSQUMzUCwgICAgICAgICAgIGF0cmFjM3ApOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQklOS0FVRElPX0RDVCwgICAgIGJpbmthdWRpb19kY3QpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQklOS0FVRElPX1JERlQsICAgIGJpbmthdWRpb19yZGZ0KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEJNVl9BVURJTywgICAgICAgICBibXZfYXVkaW8pOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQ09PSywgICAgICAgICAgICAgIGNvb2spOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoRENBLCAgICAgICAgICAgICAgIGRjYSk7CisgICAgUkVHSVNURVJfREVDT0RFUihEU0RfTFNCRiwgICAgICAgICAgZHNkX2xzYmYpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoRFNEX01TQkYsICAgICAgICAgIGRzZF9tc2JmKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKERTRF9MU0JGX1BMQU5BUiwgICBkc2RfbHNiZl9wbGFuYXIpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoRFNEX01TQkZfUExBTkFSLCAgIGRzZF9tc2JmX3BsYW5hcik7CisgICAgUkVHSVNURVJfREVDT0RFUihEU0lDSU5BVURJTywgICAgICAgZHNpY2luYXVkaW8pOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoRUFDMywgICAgICAgICAgICAgIGVhYzMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoRVZSQywgICAgICAgICAgICAgIGV2cmMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoRkZXQVZFU1lOVEgsICAgICAgIGZmd2F2ZXN5bnRoKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKEZMQUMsICAgICAgICAgICAgICBmbGFjKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKEc3MjNfMSwgICAgICAgICAgICBnNzIzXzEpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoRzcyOSwgICAgICAgICAgICAgIGc3MjkpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoR1NNLCAgICAgICAgICAgICAgIGdzbSk7CisgICAgUkVHSVNURVJfREVDT0RFUihHU01fTVMsICAgICAgICAgICAgZ3NtX21zKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKElBQywgICAgICAgICAgICAgICBpYWMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoSU1DLCAgICAgICAgICAgICAgIGltYyk7CisgICAgUkVHSVNURVJfREVDT0RFUihNQUNFMywgICAgICAgICAgICAgbWFjZTMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTUFDRTYsICAgICAgICAgICAgIG1hY2U2KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKE1FVEFTT1VORCwgICAgICAgICBtZXRhc291bmQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTUxQLCAgICAgICAgICAgICAgIG1scCk7CisgICAgUkVHSVNURVJfREVDT0RFUihNUDEsICAgICAgICAgICAgICAgbXAxKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKE1QMUZMT0FULCAgICAgICAgICBtcDFmbG9hdCk7CisgICAgUkVHSVNURVJfRU5DREVDIChNUDIsICAgICAgICAgICAgICAgbXAyKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKE1QMkZMT0FULCAgICAgICAgICBtcDJmbG9hdCk7CisgICAgUkVHSVNURVJfRU5DT0RFUihNUDJGSVhFRCwgICAgICAgICAgbXAyZml4ZWQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTVAzLCAgICAgICAgICAgICAgIG1wMyk7CisgICAgUkVHSVNURVJfREVDT0RFUihNUDNGTE9BVCwgICAgICAgICAgbXAzZmxvYXQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTVAzQURVLCAgICAgICAgICAgIG1wM2FkdSk7CisgICAgUkVHSVNURVJfREVDT0RFUihNUDNBRFVGTE9BVCwgICAgICAgbXAzYWR1ZmxvYXQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTVAzT040LCAgICAgICAgICAgIG1wM29uNCk7CisgICAgUkVHSVNURVJfREVDT0RFUihNUDNPTjRGTE9BVCwgICAgICAgbXAzb240ZmxvYXQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTVBDNywgICAgICAgICAgICAgIG1wYzcpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTVBDOCwgICAgICAgICAgICAgIG1wYzgpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoTkVMTFlNT1NFUiwgICAgICAgIG5lbGx5bW9zZXIpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoT04yQVZDLCAgICAgICAgICAgIG9uMmF2Yyk7CisgICAgUkVHSVNURVJfREVDT0RFUihPUFVTLCAgICAgICAgICAgICAgb3B1cyk7CisgICAgUkVHSVNURVJfREVDT0RFUihQQUZfQVVESU8sICAgICAgICAgcGFmX2F1ZGlvKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFFDRUxQLCAgICAgICAgICAgICBxY2VscCk7CisgICAgUkVHSVNURVJfREVDT0RFUihRRE0yLCAgICAgICAgICAgICAgcWRtMik7CisgICAgUkVHSVNURVJfRU5DREVDIChSQV8xNDQsICAgICAgICAgICAgcmFfMTQ0KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFJBXzI4OCwgICAgICAgICAgICByYV8yODgpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoUkFMRiwgICAgICAgICAgICAgIHJhbGYpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoU0hPUlRFTiwgICAgICAgICAgIHNob3J0ZW4pOworICAgIFJFR0lTVEVSX0RFQ09ERVIoU0lQUiwgICAgICAgICAgICAgIHNpcHIpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoU01BQ0tBVUQsICAgICAgICAgIHNtYWNrYXVkKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFNPTklDLCAgICAgICAgICAgICBzb25pYyk7CisgICAgUkVHSVNURVJfRU5DT0RFUihTT05JQ19MUywgICAgICAgICAgc29uaWNfbHMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoVEFLLCAgICAgICAgICAgICAgIHRhayk7CisgICAgUkVHSVNURVJfREVDT0RFUihUUlVFSEQsICAgICAgICAgICAgdHJ1ZWhkKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFRSVUVTUEVFQ0gsICAgICAgICB0cnVlc3BlZWNoKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFRUQSwgICAgICAgICAgICAgICB0dGEpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoVFdJTlZRLCAgICAgICAgICAgIHR3aW52cSk7CisgICAgUkVHSVNURVJfREVDT0RFUihWTURBVURJTywgICAgICAgICAgdm1kYXVkaW8pOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoVk9SQklTLCAgICAgICAgICAgIHZvcmJpcyk7CisgICAgUkVHSVNURVJfRU5DREVDIChXQVZQQUNLLCAgICAgICAgICAgd2F2cGFjayk7CisgICAgUkVHSVNURVJfREVDT0RFUihXTUFMT1NTTEVTUywgICAgICAgd21hbG9zc2xlc3MpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoV01BUFJPLCAgICAgICAgICAgIHdtYXBybyk7CisgICAgUkVHSVNURVJfRU5DREVDIChXTUFWMSwgICAgICAgICAgICAgd21hdjEpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoV01BVjIsICAgICAgICAgICAgIHdtYXYyKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFdNQVZPSUNFLCAgICAgICAgICB3bWF2b2ljZSk7CisgICAgUkVHSVNURVJfREVDT0RFUihXU19TTkQxLCAgICAgICAgICAgd3Nfc25kMSk7CisKKyAgICAvKiBQQ00gY29kZWNzICovCisgICAgUkVHSVNURVJfRU5DREVDIChQQ01fQUxBVywgICAgICAgICAgcGNtX2FsYXcpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoUENNX0JMVVJBWSwgICAgICAgIHBjbV9ibHVyYXkpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoUENNX0RWRCwgICAgICAgICAgIHBjbV9kdmQpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX0YzMkJFLCAgICAgICAgIHBjbV9mMzJiZSk7CisgICAgUkVHSVNURVJfRU5DREVDIChQQ01fRjMyTEUsICAgICAgICAgcGNtX2YzMmxlKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9GNjRCRSwgICAgICAgICBwY21fZjY0YmUpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX0Y2NExFLCAgICAgICAgIHBjbV9mNjRsZSk7CisgICAgUkVHSVNURVJfREVDT0RFUihQQ01fTFhGLCAgICAgICAgICAgcGNtX2x4Zik7CisgICAgUkVHSVNURVJfRU5DREVDIChQQ01fTVVMQVcsICAgICAgICAgcGNtX211bGF3KTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9TOCwgICAgICAgICAgICBwY21fczgpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1M4X1BMQU5BUiwgICAgIHBjbV9zOF9wbGFuYXIpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1MxNkJFLCAgICAgICAgIHBjbV9zMTZiZSk7CisgICAgUkVHSVNURVJfRU5DREVDIChQQ01fUzE2QkVfUExBTkFSLCAgcGNtX3MxNmJlX3BsYW5hcik7CisgICAgUkVHSVNURVJfRU5DREVDIChQQ01fUzE2TEUsICAgICAgICAgcGNtX3MxNmxlKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9TMTZMRV9QTEFOQVIsICBwY21fczE2bGVfcGxhbmFyKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9TMjRCRSwgICAgICAgICBwY21fczI0YmUpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1MyNERBVUQsICAgICAgIHBjbV9zMjRkYXVkKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9TMjRMRSwgICAgICAgICBwY21fczI0bGUpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1MyNExFX1BMQU5BUiwgIHBjbV9zMjRsZV9wbGFuYXIpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1MzMkJFLCAgICAgICAgIHBjbV9zMzJiZSk7CisgICAgUkVHSVNURVJfRU5DREVDIChQQ01fUzMyTEUsICAgICAgICAgcGNtX3MzMmxlKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9TMzJMRV9QTEFOQVIsICBwY21fczMybGVfcGxhbmFyKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9VOCwgICAgICAgICAgICBwY21fdTgpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1UxNkJFLCAgICAgICAgIHBjbV91MTZiZSk7CisgICAgUkVHSVNURVJfRU5DREVDIChQQ01fVTE2TEUsICAgICAgICAgcGNtX3UxNmxlKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9VMjRCRSwgICAgICAgICBwY21fdTI0YmUpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1UyNExFLCAgICAgICAgIHBjbV91MjRsZSk7CisgICAgUkVHSVNURVJfRU5DREVDIChQQ01fVTMyQkUsICAgICAgICAgcGNtX3UzMmJlKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9VMzJMRSwgICAgICAgICBwY21fdTMybGUpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoUENNX1pPUkssICAgICAgICAgIHBjbV96b3JrKTsKKworICAgIC8qIERQQ00gY29kZWNzICovCisgICAgUkVHSVNURVJfREVDT0RFUihJTlRFUlBMQVlfRFBDTSwgICAgaW50ZXJwbGF5X2RwY20pOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoUk9RX0RQQ00sICAgICAgICAgIHJvcV9kcGNtKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFNPTF9EUENNLCAgICAgICAgICBzb2xfZHBjbSk7CisgICAgUkVHSVNURVJfREVDT0RFUihYQU5fRFBDTSwgICAgICAgICAgeGFuX2RwY20pOworCisgICAgLyogQURQQ00gY29kZWNzICovCisgICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV80WE0sICAgICAgICAgYWRwY21fNHhtKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKEFEUENNX0FEWCwgICAgICAgICBhZHBjbV9hZHgpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fQUZDLCAgICAgICAgIGFkcGNtX2FmYyk7CisgICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9DVCwgICAgICAgICAgYWRwY21fY3QpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fRFRLLCAgICAgICAgIGFkcGNtX2R0ayk7CisgICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9FQSwgICAgICAgICAgYWRwY21fZWEpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fRUFfTUFYSVNfWEEsIGFkcGNtX2VhX21heGlzX3hhKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0VBX1IxLCAgICAgICBhZHBjbV9lYV9yMSk7CisgICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9FQV9SMiwgICAgICAgYWRwY21fZWFfcjIpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fRUFfUjMsICAgICAgIGFkcGNtX2VhX3IzKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0VBX1hBUywgICAgICBhZHBjbV9lYV94YXMpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoQURQQ01fRzcyMiwgICAgICAgIGFkcGNtX2c3MjIpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoQURQQ01fRzcyNiwgICAgICAgIGFkcGNtX2c3MjYpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fRzcyNkxFLCAgICAgIGFkcGNtX2c3MjZsZSk7CisgICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9JTUFfQU1WLCAgICAgYWRwY21faW1hX2Ftdik7CisgICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9JTUFfQVBDLCAgICAgYWRwY21faW1hX2FwYyk7CisgICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9JTUFfREszLCAgICAgYWRwY21faW1hX2RrMyk7CisgICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9JTUFfREs0LCAgICAgYWRwY21faW1hX2RrNCk7CisgICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9JTUFfRUFfRUFDUywgYWRwY21faW1hX2VhX2VhY3MpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fSU1BX0VBX1NFQUQsIGFkcGNtX2ltYV9lYV9zZWFkKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0lNQV9JU1MsICAgICBhZHBjbV9pbWFfaXNzKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0lNQV9PS0ksICAgICBhZHBjbV9pbWFfb2tpKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKEFEUENNX0lNQV9RVCwgICAgICBhZHBjbV9pbWFfcXQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fSU1BX1JBRCwgICAgIGFkcGNtX2ltYV9yYWQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fSU1BX1NNSlBFRywgIGFkcGNtX2ltYV9zbWpwZWcpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoQURQQ01fSU1BX1dBViwgICAgIGFkcGNtX2ltYV93YXYpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fSU1BX1dTLCAgICAgIGFkcGNtX2ltYV93cyk7CisgICAgUkVHSVNURVJfRU5DREVDIChBRFBDTV9NUywgICAgICAgICAgYWRwY21fbXMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fU0JQUk9fMiwgICAgIGFkcGNtX3NicHJvXzIpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fU0JQUk9fMywgICAgIGFkcGNtX3NicHJvXzMpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fU0JQUk9fNCwgICAgIGFkcGNtX3NicHJvXzQpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoQURQQ01fU1dGLCAgICAgICAgIGFkcGNtX3N3Zik7CisgICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9USFAsICAgICAgICAgYWRwY21fdGhwKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX1ZJTUEsICAgICAgICBhZHBjbV92aW1hKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX1hBLCAgICAgICAgICBhZHBjbV94YSk7CisgICAgUkVHSVNURVJfRU5DREVDIChBRFBDTV9ZQU1BSEEsICAgICAgYWRwY21feWFtYWhhKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFZJTUEsICAgICAgICAgICAgICB2aW1hKTsKKworICAgIC8qIHN1YnRpdGxlcyAqLworICAgIFJFR0lTVEVSX0VOQ0RFQyAoU1NBLCAgICAgICAgICAgICAgIHNzYSk7CisgICAgUkVHSVNURVJfRU5DREVDIChBU1MsICAgICAgICAgICAgICAgYXNzKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKERWQlNVQiwgICAgICAgICAgICBkdmJzdWIpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoRFZEU1VCLCAgICAgICAgICAgIGR2ZHN1Yik7CisgICAgUkVHSVNURVJfREVDT0RFUihKQUNPU1VCLCAgICAgICAgICAgamFjb3N1Yik7CisgICAgUkVHSVNURVJfREVDT0RFUihNSUNST0RWRCwgICAgICAgICAgbWljcm9kdmQpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoTU9WVEVYVCwgICAgICAgICAgIG1vdnRleHQpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoTVBMMiwgICAgICAgICAgICAgIG1wbDIpOworICAgIFJFR0lTVEVSX0RFQ09ERVIoUEdTU1VCLCAgICAgICAgICAgIHBnc3N1Yik7CisgICAgUkVHSVNURVJfREVDT0RFUihQSlMsICAgICAgICAgICAgICAgcGpzKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFJFQUxURVhULCAgICAgICAgICByZWFsdGV4dCk7CisgICAgUkVHSVNURVJfREVDT0RFUihTQU1JLCAgICAgICAgICAgICAgc2FtaSk7CisgICAgUkVHSVNURVJfRU5DREVDIChTUlQsICAgICAgICAgICAgICAgc3J0KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFNUTCwgICAgICAgICAgICAgICBzdGwpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoU1VCUklQLCAgICAgICAgICAgIHN1YnJpcCk7CisgICAgUkVHSVNURVJfREVDT0RFUihTVUJWSUVXRVIsICAgICAgICAgc3Vidmlld2VyKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFNVQlZJRVdFUjEsICAgICAgICBzdWJ2aWV3ZXIxKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFRFWFQsICAgICAgICAgICAgICB0ZXh0KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFZQTEFZRVIsICAgICAgICAgICB2cGxheWVyKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKFdFQlZUVCwgICAgICAgICAgICB3ZWJ2dHQpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoWFNVQiwgICAgICAgICAgICAgIHhzdWIpOworCisgICAgLyogZXh0ZXJuYWwgbGlicmFyaWVzICovCisgICAgUkVHSVNURVJfREVDT0RFUihMSUJDRUxULCAgICAgICAgICAgbGliY2VsdCk7CisgICAgUkVHSVNURVJfRU5DT0RFUihMSUJGQUFDLCAgICAgICAgICAgbGliZmFhYyk7CisgICAgUkVHSVNURVJfRU5DREVDIChMSUJGREtfQUFDLCAgICAgICAgbGliZmRrX2FhYyk7CisgICAgUkVHSVNURVJfRU5DREVDIChMSUJHU00sICAgICAgICAgICAgbGliZ3NtKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKExJQkdTTV9NUywgICAgICAgICBsaWJnc21fbXMpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoTElCSUxCQywgICAgICAgICAgIGxpYmlsYmMpOworICAgIFJFR0lTVEVSX0VOQ09ERVIoTElCTVAzTEFNRSwgICAgICAgIGxpYm1wM2xhbWUpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoTElCT1BFTkNPUkVfQU1STkIsIGxpYm9wZW5jb3JlX2Ftcm5iKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKExJQk9QRU5DT1JFX0FNUldCLCBsaWJvcGVuY29yZV9hbXJ3Yik7CisgICAgUkVHSVNURVJfRU5DREVDIChMSUJPUEVOSlBFRywgICAgICAgbGlib3BlbmpwZWcpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoTElCT1BVUywgICAgICAgICAgIGxpYm9wdXMpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoTElCU0NIUk9FRElOR0VSLCAgIGxpYnNjaHJvZWRpbmdlcik7CisgICAgUkVHSVNURVJfRU5DT0RFUihMSUJTSElORSwgICAgICAgICAgbGlic2hpbmUpOworICAgIFJFR0lTVEVSX0VOQ0RFQyAoTElCU1BFRVgsICAgICAgICAgIGxpYnNwZWV4KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKExJQlNUQUdFRlJJR0hUX0gyNjQsIGxpYnN0YWdlZnJpZ2h0X2gyNjQpOworICAgIFJFR0lTVEVSX0VOQ09ERVIoTElCVEhFT1JBLCAgICAgICAgIGxpYnRoZW9yYSk7CisgICAgUkVHSVNURVJfRU5DT0RFUihMSUJUV09MQU1FLCAgICAgICAgbGlidHdvbGFtZSk7CisgICAgUkVHSVNURVJfRU5DREVDIChMSUJVVFZJREVPLCAgICAgICAgbGlidXR2aWRlbyk7CisgICAgUkVHSVNURVJfRU5DT0RFUihMSUJWT19BQUNFTkMsICAgICAgbGlidm9fYWFjZW5jKTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKExJQlZPX0FNUldCRU5DLCAgICBsaWJ2b19hbXJ3YmVuYyk7CisgICAgUkVHSVNURVJfRU5DREVDIChMSUJWT1JCSVMsICAgICAgICAgbGlidm9yYmlzKTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKExJQlZQWF9WUDgsICAgICAgICBsaWJ2cHhfdnA4KTsKKyAgICBSRUdJU1RFUl9FTkNERUMgKExJQlZQWF9WUDksICAgICAgICBsaWJ2cHhfdnA5KTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKExJQldBVlBBQ0ssICAgICAgICBsaWJ3YXZwYWNrKTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKExJQldFQlAsICAgICAgICAgICBsaWJ3ZWJwKTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKExJQlgyNjQsICAgICAgICAgICBsaWJ4MjY0KTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKExJQlgyNjRSR0IsICAgICAgICBsaWJ4MjY0cmdiKTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKExJQlgyNjUsICAgICAgICAgICBsaWJ4MjY1KTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKExJQlhBVlMsICAgICAgICAgICBsaWJ4YXZzKTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKExJQlhWSUQsICAgICAgICAgICBsaWJ4dmlkKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKExJQlpWQklfVEVMRVRFWFQsICBsaWJ6dmJpX3RlbGV0ZXh0KTsKKyAgICBSRUdJU1RFUl9FTkNPREVSKExJQkFBQ1BMVVMsICAgICAgICBsaWJhYWNwbHVzKTsKKworICAgIC8qIHRleHQgKi8KKyAgICBSRUdJU1RFUl9ERUNPREVSKEJJTlRFWFQsICAgICAgICAgICBiaW50ZXh0KTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKFhCSU4sICAgICAgICAgICAgICB4YmluKTsKKyAgICBSRUdJU1RFUl9ERUNPREVSKElERiwgICAgICAgICAgICAgICBpZGYpOworCisgICAgLyogcGFyc2VycyAqLworICAgIFJFR0lTVEVSX1BBUlNFUihBQUMsICAgICAgICAgICAgICAgIGFhYyk7CisgICAgUkVHSVNURVJfUEFSU0VSKEFBQ19MQVRNLCAgICAgICAgICAgYWFjX2xhdG0pOworICAgIFJFR0lTVEVSX1BBUlNFUihBQzMsICAgICAgICAgICAgICAgIGFjMyk7CisgICAgUkVHSVNURVJfUEFSU0VSKEFEWCwgICAgICAgICAgICAgICAgYWR4KTsKKyAgICBSRUdJU1RFUl9QQVJTRVIoQk1QLCAgICAgICAgICAgICAgICBibXApOworICAgIFJFR0lTVEVSX1BBUlNFUihDQVZTVklERU8sICAgICAgICAgIGNhdnN2aWRlbyk7CisgICAgUkVHSVNURVJfUEFSU0VSKENPT0ssICAgICAgICAgICAgICAgY29vayk7CisgICAgUkVHSVNURVJfUEFSU0VSKERDQSwgICAgICAgICAgICAgICAgZGNhKTsKKyAgICBSRUdJU1RFUl9QQVJTRVIoRElSQUMsICAgICAgICAgICAgICBkaXJhYyk7CisgICAgUkVHSVNURVJfUEFSU0VSKEROWEhELCAgICAgICAgICAgICAgZG54aGQpOworICAgIFJFR0lTVEVSX1BBUlNFUihEUFgsICAgICAgICAgICAgICAgIGRweCk7CisgICAgUkVHSVNURVJfUEFSU0VSKERWQlNVQiwgICAgICAgICAgICAgZHZic3ViKTsKKyAgICBSRUdJU1RFUl9QQVJTRVIoRFZEU1VCLCAgICAgICAgICAgICBkdmRzdWIpOworICAgIFJFR0lTVEVSX1BBUlNFUihEVkRfTkFWLCAgICAgICAgICAgIGR2ZF9uYXYpOworICAgIFJFR0lTVEVSX1BBUlNFUihGTEFDLCAgICAgICAgICAgICAgIGZsYWMpOworICAgIFJFR0lTVEVSX1BBUlNFUihHU00sICAgICAgICAgICAgICAgIGdzbSk7CisgICAgUkVHSVNURVJfUEFSU0VSKEgyNjEsICAgICAgICAgICAgICAgaDI2MSk7CisgICAgUkVHSVNURVJfUEFSU0VSKEgyNjMsICAgICAgICAgICAgICAgaDI2Myk7CisgICAgUkVHSVNURVJfUEFSU0VSKEgyNjQsICAgICAgICAgICAgICAgaDI2NCk7CisgICAgUkVHSVNURVJfUEFSU0VSKEhFVkMsICAgICAgICAgICAgICAgaGV2Yyk7CisgICAgUkVHSVNURVJfUEFSU0VSKE1KUEVHLCAgICAgICAgICAgICAgbWpwZWcpOworICAgIFJFR0lTVEVSX1BBUlNFUihNTFAsICAgICAgICAgICAgICAgIG1scCk7CisgICAgUkVHSVNURVJfUEFSU0VSKE1QRUc0VklERU8sICAgICAgICAgbXBlZzR2aWRlbyk7CisgICAgUkVHSVNURVJfUEFSU0VSKE1QRUdBVURJTywgICAgICAgICAgbXBlZ2F1ZGlvKTsKKyAgICBSRUdJU1RFUl9QQVJTRVIoTVBFR1ZJREVPLCAgICAgICAgICBtcGVndmlkZW8pOworICAgIFJFR0lTVEVSX1BBUlNFUihPUFVTLCAgICAgICAgICAgICAgIG9wdXMpOworICAgIFJFR0lTVEVSX1BBUlNFUihQTkcsICAgICAgICAgICAgICAgIHBuZyk7CisgICAgUkVHSVNURVJfUEFSU0VSKFBOTSwgICAgICAgICAgICAgICAgcG5tKTsKKyAgICBSRUdJU1RFUl9QQVJTRVIoUlYzMCwgICAgICAgICAgICAgICBydjMwKTsKKyAgICBSRUdJU1RFUl9QQVJTRVIoUlY0MCwgICAgICAgICAgICAgICBydjQwKTsKKyAgICBSRUdJU1RFUl9QQVJTRVIoVEFLLCAgICAgICAgICAgICAgICB0YWspOworICAgIFJFR0lTVEVSX1BBUlNFUihWQzEsICAgICAgICAgICAgICAgIHZjMSk7CisgICAgUkVHSVNURVJfUEFSU0VSKFZPUkJJUywgICAgICAgICAgICAgdm9yYmlzKTsKKyAgICBSRUdJU1RFUl9QQVJTRVIoVlAzLCAgICAgICAgICAgICAgICB2cDMpOworICAgIFJFR0lTVEVSX1BBUlNFUihWUDgsICAgICAgICAgICAgICAgIHZwOCk7CisgICAgUkVHSVNURVJfUEFSU0VSKFZQOSwgICAgICAgICAgICAgICAgdnA5KTsKKworICAgIC8qIGJpdHN0cmVhbSBmaWx0ZXJzICovCisgICAgUkVHSVNURVJfQlNGKEFBQ19BRFRTVE9BU0MsICAgICAgICAgYWFjX2FkdHN0b2FzYyk7CisgICAgUkVHSVNURVJfQlNGKENIT01QLCAgICAgICAgICAgICAgICAgY2hvbXApOworICAgIFJFR0lTVEVSX0JTRihEVU1QX0VYVFJBREFUQSwgICAgICAgIGR1bXBfZXh0cmFkYXRhKTsKKyAgICBSRUdJU1RFUl9CU0YoSDI2NF9NUDRUT0FOTkVYQiwgICAgICBoMjY0X21wNHRvYW5uZXhiKTsKKyAgICBSRUdJU1RFUl9CU0YoSU1YX0RVTVBfSEVBREVSLCAgICAgICBpbXhfZHVtcF9oZWFkZXIpOworICAgIFJFR0lTVEVSX0JTRihNSlBFRzJKUEVHLCAgICAgICAgICAgIG1qcGVnMmpwZWcpOworICAgIFJFR0lTVEVSX0JTRihNSlBFR0FfRFVNUF9IRUFERVIsICAgIG1qcGVnYV9kdW1wX2hlYWRlcik7CisgICAgUkVHSVNURVJfQlNGKE1QM19IRUFERVJfREVDT01QUkVTUywgbXAzX2hlYWRlcl9kZWNvbXByZXNzKTsKKyAgICBSRUdJU1RFUl9CU0YoTU9WMlRFWFRTVUIsICAgICAgICAgICBtb3YydGV4dHN1Yik7CisgICAgUkVHSVNURVJfQlNGKE5PSVNFLCAgICAgICAgICAgICAgICAgbm9pc2UpOworICAgIFJFR0lTVEVSX0JTRihSRU1PVkVfRVhUUkFEQVRBLCAgICAgIHJlbW92ZV9leHRyYWRhdGEpOworICAgIFJFR0lTVEVSX0JTRihURVhUMk1PVlNVQiwgICAgICAgICAgIHRleHQybW92c3ViKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL01ha2VmaWxlIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2ZDk3NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL01ha2VmaWxlCkBAIC0wLDAgKzEsMTAgQEAKK09CSlMtJChDT05GSUdfQkxPQ0tEU1ApICAgICAgICAgICAgICAgICArPSBhbHBoYS9ibG9ja2RzcF9hbHBoYS5vCitPQkpTLSQoQ09ORklHX01FX0NNUCkgICAgICAgICAgICAgICAgICAgKz0gYWxwaGEvbWVfY21wX2FscGhhLm8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEvbWVfY21wX212aV9hc20ubworT0JKUy0kKENPTkZJR19IUEVMRFNQKSAgICAgICAgICAgICAgICAgICs9IGFscGhhL2hwZWxkc3BfYWxwaGEubyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhL2hwZWxkc3BfYWxwaGFfYXNtLm8KK09CSlMtJChDT05GSUdfSURDVERTUCkgICAgICAgICAgICAgICAgICArPSBhbHBoYS9pZGN0ZHNwX2FscGhhLm8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS9pZGN0ZHNwX2FscGhhX2FzbS5vICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS9zaW1wbGVfaWRjdF9hbHBoYS5vCitPQkpTLSQoQ09ORklHX01QRUdWSURFTykgICAgICAgICAgICAgICAgKz0gYWxwaGEvbXBlZ3ZpZGVvX2FscGhhLm8KK09CSlMtJChDT05GSUdfUElYQkxPQ0tEU1ApICAgICAgICAgICAgICArPSBhbHBoYS9waXhibG9ja2RzcF9hbHBoYS5vCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9hc20uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzcyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9hc20uaApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIEFscGhhIG9wdGltaXplZCBEU1AgdXRpbHMKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWxrIEh1ZWZmbmVyIDxmYWxrQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BTFBIQV9BU01fSAorI2RlZmluZSBBVkNPREVDX0FMUEhBX0FTTV9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisjaWYgQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoMiw5NikKKyMgZGVmaW5lIGxpa2VseSh4KSAgICAgIF9fYnVpbHRpbl9leHBlY3QoKHgpICE9IDAsIDEpCisjIGRlZmluZSB1bmxpa2VseSh4KSAgICBfX2J1aWx0aW5fZXhwZWN0KCh4KSAhPSAwLCAwKQorI2Vsc2UKKyMgZGVmaW5lIGxpa2VseSh4KSAgICAgICh4KQorIyBkZWZpbmUgdW5saWtlbHkoeCkgICAgKHgpCisjZW5kaWYKKworI2RlZmluZSBBTUFTS19CV1ggKDEgPDwgMCkKKyNkZWZpbmUgQU1BU0tfRklYICgxIDw8IDEpCisjZGVmaW5lIEFNQVNLX0NJWCAoMSA8PCAyKQorI2RlZmluZSBBTUFTS19NVkkgKDEgPDwgOCkKKworc3RhdGljIGlubGluZSB1aW50NjRfdCBCWVRFX1ZFQyh1aW50NjRfdCB4KQoreworICAgIHggfD0geCA8PCAgODsKKyAgICB4IHw9IHggPDwgMTY7CisgICAgeCB8PSB4IDw8IDMyOworICAgIHJldHVybiB4OworfQorc3RhdGljIGlubGluZSB1aW50NjRfdCBXT1JEX1ZFQyh1aW50NjRfdCB4KQoreworICAgIHggfD0geCA8PCAxNjsKKyAgICB4IHw9IHggPDwgMzI7CisgICAgcmV0dXJuIHg7Cit9CisKKyNkZWZpbmUgc2V4dHcoeCkgKChpbnQxNl90KSAoeCkpCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBsZHEocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChjb25zdCB1bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQ2NF90IF9fbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX3R5cGVvZl9fKCoocCkpIF9fc1tzaXplb2YgKHVpbnQ2NF90KSAvIHNpemVvZiAqKHApXTsgIFwKKyAgICB9ICopIChwKSktPl9fbCkKKyNkZWZpbmUgbGRsKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoY29uc3QgdW5pb24geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQzMl90IF9fbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX190eXBlb2ZfXygqKHApKSBfX3Nbc2l6ZW9mIChpbnQzMl90KSAvIHNpemVvZiAqKHApXTsgICBcCisgICAgfSAqKSAocCkpLT5fX2wpCisjZGVmaW5lIHN0cShsLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKHVuaW9uIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50NjRfdCBfX2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX3R5cGVvZl9fKCoocCkpIF9fc1tzaXplb2YgKHVpbnQ2NF90KSAvIHNpemVvZiAqKHApXTsgICAgICBcCisgICAgICAgIH0gKikgKHApKS0+X19sKSA9IGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc3RsKGwsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCgodW5pb24geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludDMyX3QgX19sOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fdHlwZW9mX18oKihwKSkgX19zW3NpemVvZiAoaW50MzJfdCkgLyBzaXplb2YgKihwKV07ICAgICAgIFwKKyAgICAgICAgfSAqKSAocCkpLT5fX2wpID0gbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorc3RydWN0IHVuYWxpZ25lZF9sb25nIHsgdWludDY0X3QgbDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyNkZWZpbmUgbGRxX3UocCkgICAgICAgICgqKGNvbnN0IHVpbnQ2NF90ICopICgoKHVpbnQ2NF90KSAocCkpICYgfjd1bCkpCisjZGVmaW5lIHVsZHEoYSkgICAgICAgICAoKChjb25zdCBzdHJ1Y3QgdW5hbGlnbmVkX2xvbmcgKikgKGEpKS0+bCkKKworI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsMykKKyNkZWZpbmUgcHJlZmV0Y2gocCkgICAgIF9fYnVpbHRpbl9wcmVmZXRjaCgocCksIDAsIDEpCisjZGVmaW5lIHByZWZldGNoX2VuKHApICBfX2J1aWx0aW5fcHJlZmV0Y2goKHApLCAwLCAwKQorI2RlZmluZSBwcmVmZXRjaF9tKHApICAgX19idWlsdGluX3ByZWZldGNoKChwKSwgMSwgMSkKKyNkZWZpbmUgcHJlZmV0Y2hfbWVuKHApIF9fYnVpbHRpbl9wcmVmZXRjaCgocCksIDEsIDApCisjZGVmaW5lIGNtcGJnZSAgICAgICAgICBfX2J1aWx0aW5fYWxwaGFfY21wYmdlCisvKiBBdm9pZCB3YXJuaW5ncy4gICovCisjZGVmaW5lIGV4dHFsKGEsIGIpICAgICBfX2J1aWx0aW5fYWxwaGFfZXh0cWwoYSwgKHVpbnQ2NF90KSAoYikpCisjZGVmaW5lIGV4dHdsKGEsIGIpICAgICBfX2J1aWx0aW5fYWxwaGFfZXh0d2woYSwgKHVpbnQ2NF90KSAoYikpCisjZGVmaW5lIGV4dHFoKGEsIGIpICAgICBfX2J1aWx0aW5fYWxwaGFfZXh0cWgoYSwgKHVpbnQ2NF90KSAoYikpCisjZGVmaW5lIHphcCAgICAgICAgICAgICBfX2J1aWx0aW5fYWxwaGFfemFwCisjZGVmaW5lIHphcG5vdCAgICAgICAgICBfX2J1aWx0aW5fYWxwaGFfemFwbm90CisjZGVmaW5lIGFtYXNrICAgICAgICAgICBfX2J1aWx0aW5fYWxwaGFfYW1hc2sKKyNkZWZpbmUgaW1wbHZlciAgICAgICAgIF9fYnVpbHRpbl9hbHBoYV9pbXBsdmVyCisjZGVmaW5lIHJwY2MgICAgICAgICAgICBfX2J1aWx0aW5fYWxwaGFfcnBjYworI2Vsc2UKKyNkZWZpbmUgcHJlZmV0Y2gocCkgICAgIF9fYXNtX18gdm9sYXRpbGUoImxkbCAkMzEsJTAiICA6IDogIm0iKCooY29uc3QgY2hhciAqKSAocCkpIDogIm1lbW9yeSIpCisjZGVmaW5lIHByZWZldGNoX2VuKHApICBfX2FzbV9fIHZvbGF0aWxlKCJsZHEgJDMxLCUwIiAgOiA6ICJtIigqKGNvbnN0IGNoYXIgKikgKHApKSA6ICJtZW1vcnkiKQorI2RlZmluZSBwcmVmZXRjaF9tKHApICAgX19hc21fXyB2b2xhdGlsZSgibGRzICRmMzEsJTAiIDogOiAibSIoKihjb25zdCBjaGFyICopIChwKSkgOiAibWVtb3J5IikKKyNkZWZpbmUgcHJlZmV0Y2hfbWVuKHApIF9fYXNtX18gdm9sYXRpbGUoImxkdCAkZjMxLCUwIiA6IDogIm0iKCooY29uc3QgY2hhciAqKSAocCkpIDogIm1lbW9yeSIpCisjZGVmaW5lIGNtcGJnZShhLCBiKSAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCJjbXBiZ2UgICVyMSwlMiwlMCIgIDogIj1yIiAoX19yKSA6ICJySiIgIChhKSwgInJJIiAoYikpOyBfX3I7IH0pCisjZGVmaW5lIGV4dHFsKGEsIGIpICAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCJleHRxbCAgICVyMSwlMiwlMCIgIDogIj1yIiAoX19yKSA6ICJySiIgIChhKSwgInJJIiAoYikpOyBfX3I7IH0pCisjZGVmaW5lIGV4dHdsKGEsIGIpICAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCJleHR3bCAgICVyMSwlMiwlMCIgIDogIj1yIiAoX19yKSA6ICJySiIgIChhKSwgInJJIiAoYikpOyBfX3I7IH0pCisjZGVmaW5lIGV4dHFoKGEsIGIpICAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCJleHRxaCAgICVyMSwlMiwlMCIgIDogIj1yIiAoX19yKSA6ICJySiIgIChhKSwgInJJIiAoYikpOyBfX3I7IH0pCisjZGVmaW5lIHphcChhLCBiKSAgICAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCJ6YXAgICAgICVyMSwlMiwlMCIgIDogIj1yIiAoX19yKSA6ICJySiIgIChhKSwgInJJIiAoYikpOyBfX3I7IH0pCisjZGVmaW5lIHphcG5vdChhLCBiKSAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCJ6YXBub3QgICVyMSwlMiwlMCIgIDogIj1yIiAoX19yKSA6ICJySiIgIChhKSwgInJJIiAoYikpOyBfX3I7IH0pCisjZGVmaW5lIGFtYXNrKGEpICAgICAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCJhbWFzayAgICUxLCUwIiAgICAgIDogIj1yIiAoX19yKSA6ICJySSIgIChhKSk7ICAgICAgICAgICBfX3I7IH0pCisjZGVmaW5lIGltcGx2ZXIoKSAgICAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCJpbXBsdmVyICUwIiAgICAgICAgIDogIj1yIiAoX19yKSk7ICAgICAgICAgICAgICAgICAgICAgICBfX3I7IH0pCisjZGVmaW5lIHJwY2MoKSAgICAgICAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gdm9sYXRpbGUgKCJycGNjICUwIiAgIDogIj1yIiAoX19yKSk7ICAgICAgICAgICAgICAgICAgICAgICBfX3I7IH0pCisjZW5kaWYKKyNkZWZpbmUgd2g2NChwKSBfX2FzbV9fIHZvbGF0aWxlKCJ3aDY0ICglMCkiIDogOiAiciIocCkgOiAibWVtb3J5IikKKworI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsMykgJiYgZGVmaW5lZChfX2FscGhhX21heF9fKQorI2RlZmluZSBtaW51YjggIF9fYnVpbHRpbl9hbHBoYV9taW51YjgKKyNkZWZpbmUgbWluc2I4ICBfX2J1aWx0aW5fYWxwaGFfbWluc2I4CisjZGVmaW5lIG1pbnV3NCAgX19idWlsdGluX2FscGhhX21pbnV3NAorI2RlZmluZSBtaW5zdzQgIF9fYnVpbHRpbl9hbHBoYV9taW5zdzQKKyNkZWZpbmUgbWF4dWI4ICBfX2J1aWx0aW5fYWxwaGFfbWF4dWI4CisjZGVmaW5lIG1heHNiOCAgX19idWlsdGluX2FscGhhX21heHNiOAorI2RlZmluZSBtYXh1dzQgIF9fYnVpbHRpbl9hbHBoYV9tYXh1dzQKKyNkZWZpbmUgbWF4c3c0ICBfX2J1aWx0aW5fYWxwaGFfbWF4c3c0CisjZGVmaW5lIHBlcnIgICAgX19idWlsdGluX2FscGhhX3BlcnIKKyNkZWZpbmUgcGtsYiAgICBfX2J1aWx0aW5fYWxwaGFfcGtsYgorI2RlZmluZSBwa3diICAgIF9fYnVpbHRpbl9hbHBoYV9wa3diCisjZGVmaW5lIHVucGtibCAgX19idWlsdGluX2FscGhhX3VucGtibAorI2RlZmluZSB1bnBrYncgIF9fYnVpbHRpbl9hbHBoYV91bnBrYncKKyNlbHNlCisjZGVmaW5lIG1pbnViOChhLCBiKSAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCIuYXJjaCBldjY7IG1pbnViOCAgJXIxLCUyLCUwIiAgOiAiPXIiIChfX3IpIDogIiVySiIgKGEpLCAickkiIChiKSk7IF9fcjsgfSkKKyNkZWZpbmUgbWluc2I4KGEsIGIpICh7IHVpbnQ2NF90IF9fcjsgX19hc21fXyAoIi5hcmNoIGV2NjsgbWluc2I4ICAlcjEsJTIsJTAiICA6ICI9ciIgKF9fcikgOiAiJXJKIiAoYSksICJySSIgKGIpKTsgX19yOyB9KQorI2RlZmluZSBtaW51dzQoYSwgYikgKHsgdWludDY0X3QgX19yOyBfX2FzbV9fICgiLmFyY2ggZXY2OyBtaW51dzQgICVyMSwlMiwlMCIgIDogIj1yIiAoX19yKSA6ICIlckoiIChhKSwgInJJIiAoYikpOyBfX3I7IH0pCisjZGVmaW5lIG1pbnN3NChhLCBiKSAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCIuYXJjaCBldjY7IG1pbnN3NCAgJXIxLCUyLCUwIiAgOiAiPXIiIChfX3IpIDogIiVySiIgKGEpLCAickkiIChiKSk7IF9fcjsgfSkKKyNkZWZpbmUgbWF4dWI4KGEsIGIpICh7IHVpbnQ2NF90IF9fcjsgX19hc21fXyAoIi5hcmNoIGV2NjsgbWF4dWI4ICAlcjEsJTIsJTAiICA6ICI9ciIgKF9fcikgOiAiJXJKIiAoYSksICJySSIgKGIpKTsgX19yOyB9KQorI2RlZmluZSBtYXhzYjgoYSwgYikgKHsgdWludDY0X3QgX19yOyBfX2FzbV9fICgiLmFyY2ggZXY2OyBtYXhzYjggICVyMSwlMiwlMCIgIDogIj1yIiAoX19yKSA6ICIlckoiIChhKSwgInJJIiAoYikpOyBfX3I7IH0pCisjZGVmaW5lIG1heHV3NChhLCBiKSAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCIuYXJjaCBldjY7IG1heHV3NCAgJXIxLCUyLCUwIiAgOiAiPXIiIChfX3IpIDogIiVySiIgKGEpLCAickkiIChiKSk7IF9fcjsgfSkKKyNkZWZpbmUgbWF4c3c0KGEsIGIpICh7IHVpbnQ2NF90IF9fcjsgX19hc21fXyAoIi5hcmNoIGV2NjsgbWF4c3c0ICAlcjEsJTIsJTAiICA6ICI9ciIgKF9fcikgOiAiJXJKIiAoYSksICJySSIgKGIpKTsgX19yOyB9KQorI2RlZmluZSBwZXJyKGEsIGIpICAgKHsgdWludDY0X3QgX19yOyBfX2FzbV9fICgiLmFyY2ggZXY2OyBwZXJyICAgICVyMSwlcjIsJTAiIDogIj1yIiAoX19yKSA6ICIlckoiIChhKSwgInJKIiAoYikpOyBfX3I7IH0pCisjZGVmaW5lIHBrbGIoYSkgICAgICAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCIuYXJjaCBldjY7IHBrbGIgICAgJXIxLCUwIiAgICAgOiAiPXIiIChfX3IpIDogInJKIiAgKGEpKTsgICAgICAgICAgIF9fcjsgfSkKKyNkZWZpbmUgcGt3YihhKSAgICAgICh7IHVpbnQ2NF90IF9fcjsgX19hc21fXyAoIi5hcmNoIGV2NjsgcGt3YiAgICAlcjEsJTAiICAgICA6ICI9ciIgKF9fcikgOiAickoiICAoYSkpOyAgICAgICAgICAgX19yOyB9KQorI2RlZmluZSB1bnBrYmwoYSkgICAgKHsgdWludDY0X3QgX19yOyBfX2FzbV9fICgiLmFyY2ggZXY2OyB1bnBrYmwgICVyMSwlMCIgICAgIDogIj1yIiAoX19yKSA6ICJySiIgIChhKSk7ICAgICAgICAgICBfX3I7IH0pCisjZGVmaW5lIHVucGtidyhhKSAgICAoeyB1aW50NjRfdCBfX3I7IF9fYXNtX18gKCIuYXJjaCBldjY7IHVucGtidyAgJXIxLCUwIiAgICAgOiAiPXIiIChfX3IpIDogInJKIiAgKGEpKTsgICAgICAgICAgIF9fcjsgfSkKKyNlbmRpZgorCisjZWxpZiBkZWZpbmVkKF9fREVDQykgICAgICAgICAgIC8qIERpZ2l0YWwvQ29tcGFxL2hwICJjY2MiIGNvbXBpbGVyICovCisKKyNpbmNsdWRlIDxjX2FzbS5oPgorI2RlZmluZSBsZHEocCkgKCooY29uc3QgdWludDY0X3QgKikgKHApKQorI2RlZmluZSBsZGwocCkgKCooY29uc3QgaW50MzJfdCAqKSAgKHApKQorI2RlZmluZSBzdHEobCwgcCkgZG8geyAqKHVpbnQ2NF90ICopIChwKSA9IChsKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc3RsKGwsIHApIGRvIHsgKihpbnQzMl90ICopICAocCkgPSAobCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIGxkcV91KGEpICAgICBhc20gKCJsZHFfdSAgICV2MCwwKCVhMCkiLCBhKQorI2RlZmluZSB1bGRxKGEpICAgICAgKCooY29uc3QgX191bmFsaWduZWQgdWludDY0X3QgKikgKGEpKQorI2RlZmluZSBjbXBiZ2UoYSwgYikgYXNtICgiY21wYmdlICAlYTAsJWExLCV2MCIsIGEsIGIpCisjZGVmaW5lIGV4dHFsKGEsIGIpICBhc20gKCJleHRxbCAgICVhMCwlYTEsJXYwIiwgYSwgYikKKyNkZWZpbmUgZXh0d2woYSwgYikgIGFzbSAoImV4dHdsICAgJWEwLCVhMSwldjAiLCBhLCBiKQorI2RlZmluZSBleHRxaChhLCBiKSAgYXNtICgiZXh0cWggICAlYTAsJWExLCV2MCIsIGEsIGIpCisjZGVmaW5lIHphcChhLCBiKSAgICBhc20gKCJ6YXAgICAgICVhMCwlYTEsJXYwIiwgYSwgYikKKyNkZWZpbmUgemFwbm90KGEsIGIpIGFzbSAoInphcG5vdCAgJWEwLCVhMSwldjAiLCBhLCBiKQorI2RlZmluZSBhbWFzayhhKSAgICAgYXNtICgiYW1hc2sgICAlYTAsJXYwIiwgYSkKKyNkZWZpbmUgaW1wbHZlcigpICAgIGFzbSAoImltcGx2ZXIgJXYwIikKKyNkZWZpbmUgcnBjYygpICAgICAgIGFzbSAoInJwY2MgICAgICAgICAgICV2MCIpCisjZGVmaW5lIG1pbnViOChhLCBiKSBhc20gKCJtaW51YjggICVhMCwlYTEsJXYwIiwgYSwgYikKKyNkZWZpbmUgbWluc2I4KGEsIGIpIGFzbSAoIm1pbnNiOCAgJWEwLCVhMSwldjAiLCBhLCBiKQorI2RlZmluZSBtaW51dzQoYSwgYikgYXNtICgibWludXc0ICAlYTAsJWExLCV2MCIsIGEsIGIpCisjZGVmaW5lIG1pbnN3NChhLCBiKSBhc20gKCJtaW5zdzQgICVhMCwlYTEsJXYwIiwgYSwgYikKKyNkZWZpbmUgbWF4dWI4KGEsIGIpIGFzbSAoIm1heHViOCAgJWEwLCVhMSwldjAiLCBhLCBiKQorI2RlZmluZSBtYXhzYjgoYSwgYikgYXNtICgibWF4c2I4ICAlYTAsJWExLCV2MCIsIGEsIGIpCisjZGVmaW5lIG1heHV3NChhLCBiKSBhc20gKCJtYXh1dzQgICVhMCwlYTEsJXYwIiwgYSwgYikKKyNkZWZpbmUgbWF4c3c0KGEsIGIpIGFzbSAoIm1heHN3NCAgJWEwLCVhMSwldjAiLCBhLCBiKQorI2RlZmluZSBwZXJyKGEsIGIpICAgYXNtICgicGVyciAgICAlYTAsJWExLCV2MCIsIGEsIGIpCisjZGVmaW5lIHBrbGIoYSkgICAgICBhc20gKCJwa2xiICAgICVhMCwldjAiLCBhKQorI2RlZmluZSBwa3diKGEpICAgICAgYXNtICgicGt3YiAgICAlYTAsJXYwIiwgYSkKKyNkZWZpbmUgdW5wa2JsKGEpICAgIGFzbSAoInVucGtibCAgJWEwLCV2MCIsIGEpCisjZGVmaW5lIHVucGtidyhhKSAgICBhc20gKCJ1bnBrYncgICVhMCwldjAiLCBhKQorI2RlZmluZSB3aDY0KGEpICAgICAgYXNtICgid2g2NCAgICAlYTAiLCBhKQorCisjZWxzZQorI2Vycm9yICJVbmtub3duIGNvbXBpbGVyISIKKyNlbmRpZgorCisjZW5kaWYgLyogQVZDT0RFQ19BTFBIQV9BU01fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvYmxvY2tkc3BfYWxwaGEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL2Jsb2NrZHNwX2FscGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkNDM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL2Jsb2NrZHNwX2FscGhhLmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIEFscGhhIG9wdGltaXNlZCBibG9jayBvcGVyYXRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFsayBIdWVmZm5lciA8ZmFsa0BkZWJpYW4ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJhc20uaCIKKworc3RhdGljIHZvaWQgY2xlYXJfYmxvY2tzX2F4cChpbnQxNl90ICpibG9ja3MpIHsKKyAgICB1aW50NjRfdCAqcCA9ICh1aW50NjRfdCAqKSBibG9ja3M7CisgICAgaW50IG4gPSBzaXplb2YoaW50MTZfdCkgKiA2ICogNjQ7CisKKyAgICBkbyB7CisgICAgICAgIHBbMF0gPSAwOworICAgICAgICBwWzFdID0gMDsKKyAgICAgICAgcFsyXSA9IDA7CisgICAgICAgIHBbM10gPSAwOworICAgICAgICBwWzRdID0gMDsKKyAgICAgICAgcFs1XSA9IDA7CisgICAgICAgIHBbNl0gPSAwOworICAgICAgICBwWzddID0gMDsKKyAgICAgICAgcCArPSA4OworICAgICAgICBuIC09IDggKiA4OworICAgIH0gd2hpbGUgKG4pOworfQorCithdl9jb2xkIHZvaWQgZmZfYmxvY2tkc3BfaW5pdF9hbHBoYShCbG9ja0RTUENvbnRleHQgKmMsIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKQoreworICAgIGlmICghaGlnaF9iaXRfZGVwdGgpIHsKKyAgICAgICAgYy0+Y2xlYXJfYmxvY2tzID0gY2xlYXJfYmxvY2tzX2F4cDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9ocGVsZHNwX2FscGhhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9ocGVsZHNwX2FscGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1NDgwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL2hwZWxkc3BfYWxwaGEuYwpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIEFscGhhIG9wdGltaXplZCBEU1AgdXRpbHMKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWxrIEh1ZWZmbmVyIDxmYWxrQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaHBlbGRzcC5oIgorI2luY2x1ZGUgImhwZWxkc3BfYWxwaGEuaCIKKyNpbmNsdWRlICJhc20uaCIKKworc3RhdGljIGlubGluZSB1aW50NjRfdCBhdmcyX25vX3JuZCh1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworICAgIHJldHVybiAoYSAmIGIpICsgKCgoYSBeIGIpICYgQllURV9WRUMoMHhmZSkpID4+IDEpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGF2ZzIodWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyAgICByZXR1cm4gKGEgfCBiKSAtICgoKGEgXiBiKSAmIEJZVEVfVkVDKDB4ZmUpKSA+PiAxKTsKK30KKworI2lmIDAKKy8qIFRoZSBYWTIgcm91dGluZXMgYmFzaWNhbGx5IHV0aWxpemUgdGhpcyBzY2hlbWUsIGJ1dCByZXVzZSBwYXJ0cyBpbgorICAgZWFjaCBpdGVyYXRpb24uICAqLworc3RhdGljIGlubGluZSB1aW50NjRfdCBhdmc0KHVpbnQ2NF90IGwxLCB1aW50NjRfdCBsMiwgdWludDY0X3QgbDMsIHVpbnQ2NF90IGw0KQoreworICAgIHVpbnQ2NF90IHIxID0gKChsMSAmIH5CWVRFX1ZFQygweDAzKSkgPj4gMikKKyAgICAgICAgICAgICAgICArICgobDIgJiB+QllURV9WRUMoMHgwMykpID4+IDIpCisgICAgICAgICAgICAgICAgKyAoKGwzICYgfkJZVEVfVkVDKDB4MDMpKSA+PiAyKQorICAgICAgICAgICAgICAgICsgKChsNCAmIH5CWVRFX1ZFQygweDAzKSkgPj4gMik7CisgICAgdWludDY0X3QgcjIgPSAoKCAgKGwxICYgQllURV9WRUMoMHgwMykpCisgICAgICAgICAgICAgICAgICAgICsgKGwyICYgQllURV9WRUMoMHgwMykpCisgICAgICAgICAgICAgICAgICAgICsgKGwzICYgQllURV9WRUMoMHgwMykpCisgICAgICAgICAgICAgICAgICAgICsgKGw0ICYgQllURV9WRUMoMHgwMykpCisgICAgICAgICAgICAgICAgICAgICsgQllURV9WRUMoMHgwMikpID4+IDIpICYgQllURV9WRUMoMHgwMyk7CisgICAgcmV0dXJuIHIxICsgcjI7Cit9CisjZW5kaWYKKworI2RlZmluZSBPUChMT0FELCBTVE9SRSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTVE9SRShMT0FEKHBpeGVscyksIGJsb2NrKTsgICAgICAgICAgICAgXAorICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBibG9jayArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKC0taCkKKworI2RlZmluZSBPUF9YMihMT0FELCBTVE9SRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQ2NF90IHBpeDEsIHBpeDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcGl4MSA9IExPQUQocGl4ZWxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeDIgPSBwaXgxID4+IDggfCAoKHVpbnQ2NF90KSBwaXhlbHNbOF0gPDwgNTYpOyAgICAgICAgXAorICAgICAgICBTVE9SRShBVkcyKHBpeDEsIHBpeDIpLCBibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrICs9IGxpbmVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKC0taCkKKworI2RlZmluZSBPUF9ZMihMT0FELCBTVE9SRSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50NjRfdCBwaXggPSBMT0FEKHBpeGVscyk7ICAgICAgICAgICAgXAorICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDY0X3QgbmV4dF9waXg7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV4dF9waXggPSBMT0FEKHBpeGVscyk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgU1RPUkUoQVZHMihwaXgsIG5leHRfcGl4KSwgYmxvY2spOyAgXAorICAgICAgICAgICAgYmxvY2sgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcGl4ID0gbmV4dF9waXg7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IHdoaWxlICgtLWgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgT1BfWFkyKExPQUQsIFNUT1JFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50NjRfdCBwaXgxID0gTE9BRChwaXhlbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDY0X3QgcGl4MiA9IHBpeDEgPj4gOCB8ICgodWludDY0X3QpIHBpeGVsc1s4XSA8PCA1Nik7ICAgICAgICAgICBcCisgICAgICAgIHVpbnQ2NF90IHBpeF9sID0gKHBpeDEgJiBCWVRFX1ZFQygweDAzKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICArIChwaXgyICYgQllURV9WRUMoMHgwMykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDY0X3QgcGl4X2ggPSAoKHBpeDEgJiB+QllURV9WRUMoMHgwMykpID4+IDIpICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICsgKChwaXgyICYgfkJZVEVfVkVDKDB4MDMpKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50NjRfdCBucGl4MSwgbnBpeDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDY0X3QgbnBpeF9sLCBucGl4X2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQ2NF90IGF2ZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5waXgxID0gTE9BRChwaXhlbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBucGl4MiA9IG5waXgxID4+IDggfCAoKHVpbnQ2NF90KSBwaXhlbHNbOF0gPDwgNTYpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbnBpeF9sID0gKG5waXgxICYgQllURV9WRUMoMHgwMykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICArIChucGl4MiAmIEJZVEVfVkVDKDB4MDMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBucGl4X2ggPSAoKG5waXgxICYgfkJZVEVfVkVDKDB4MDMpKSA+PiAyKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICsgKChucGl4MiAmIH5CWVRFX1ZFQygweDAzKSkgPj4gMik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2ZyA9ICgoKHBpeF9sICsgbnBpeF9sICsgQVZHNF9ST1VOREVSKSA+PiAyKSAmIEJZVEVfVkVDKDB4MDMpKSBcCisgICAgICAgICAgICAgICAgKyBwaXhfaCArIG5waXhfaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgU1RPUkUoYXZnLCBibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBibG9jayArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcGl4X2wgPSBucGl4X2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHBpeF9oID0gbnBpeF9oOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gd2hpbGUgKC0taCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTUFLRV9PUChPUE5BTUUsIFNVRkYsIE9QS0lORCwgU1RPUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgX3BpeGVscyAjIyBTVUZGICMjIF9heHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodWludDhfdCAqcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnJlc3RyaWN0IHBpeGVscywgICAgICAgICAgIFwKKyAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoc2l6ZV90KSBwaXhlbHMgJiAweDcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BLSU5EKHVsZHEsIFNUT1JFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUEtJTkQobGRxLCBTVE9SRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBfcGl4ZWxzMTYgIyMgU1VGRiAjIyBfYXhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh1aW50OF90ICpyZXN0cmljdCBibG9jaywgY29uc3QgdWludDhfdCAqcmVzdHJpY3QgcGl4ZWxzLCAgICAgICAgICAgXAorICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9waXhlbHMgIyMgU1VGRiAjIyBfYXhwKGJsb2NrLCAgICAgcGl4ZWxzLCAgICAgbGluZV9zaXplLCBoKTsgXAorICAgIE9QTkFNRSAjIyBfcGl4ZWxzICMjIFNVRkYgIyMgX2F4cChibG9jayArIDgsIHBpeGVscyArIDgsIGxpbmVfc2l6ZSwgaCk7IFwKK30KKworI2RlZmluZSBQSVhPUChPUE5BTUUsIFNUT1JFKSAgICAgICAgICAgICAgICAgICAgXAorICAgIE1BS0VfT1AoT1BOQU1FLCAsICAgICBPUCwgICAgIFNUT1JFKSAgICAgICAgXAorICAgIE1BS0VfT1AoT1BOQU1FLCBfeDIsICBPUF9YMiwgIFNUT1JFKSAgICAgICAgXAorICAgIE1BS0VfT1AoT1BOQU1FLCBfeTIsICBPUF9ZMiwgIFNUT1JFKSAgICAgICAgXAorICAgIE1BS0VfT1AoT1BOQU1FLCBfeHkyLCBPUF9YWTIsIFNUT1JFKQorCisvKiBSb3VuZGluZyBwcmltaXRpdmVzLiAgKi8KKyNkZWZpbmUgQVZHMiBhdmcyCisjZGVmaW5lIEFWRzQgYXZnNAorI2RlZmluZSBBVkc0X1JPVU5ERVIgQllURV9WRUMoMHgwMikKKyNkZWZpbmUgU1RPUkUobCwgYikgc3RxKGwsIGIpCitQSVhPUChwdXQsIFNUT1JFKTsKKworI3VuZGVmIFNUT1JFCisjZGVmaW5lIFNUT1JFKGwsIGIpIHN0cShBVkcyKGwsIGxkcShiKSksIGIpOworUElYT1AoYXZnLCBTVE9SRSk7CisKKy8qIE5vdCByb3VuZGluZyBwcmltaXRpdmVzLiAgKi8KKyN1bmRlZiBBVkcyCisjdW5kZWYgQVZHNAorI3VuZGVmIEFWRzRfUk9VTkRFUgorI3VuZGVmIFNUT1JFCisjZGVmaW5lIEFWRzIgYXZnMl9ub19ybmQKKyNkZWZpbmUgQVZHNCBhdmc0X25vX3JuZAorI2RlZmluZSBBVkc0X1JPVU5ERVIgQllURV9WRUMoMHgwMSkKKyNkZWZpbmUgU1RPUkUobCwgYikgc3RxKGwsIGIpCitQSVhPUChwdXRfbm9fcm5kLCBTVE9SRSk7CisKKyN1bmRlZiBTVE9SRQorI2RlZmluZSBTVE9SRShsLCBiKSBzdHEoQVZHMihsLCBsZHEoYikpLCBiKTsKK1BJWE9QKGF2Z19ub19ybmQsIFNUT1JFKTsKKworc3RhdGljIHZvaWQgcHV0X3BpeGVsczE2X2F4cF9hc20odWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIHB1dF9waXhlbHNfYXhwX2FzbShibG9jaywgICAgIHBpeGVscywgICAgIGxpbmVfc2l6ZSwgaCk7CisgICAgcHV0X3BpeGVsc19heHBfYXNtKGJsb2NrICsgOCwgcGl4ZWxzICsgOCwgbGluZV9zaXplLCBoKTsKK30KKworYXZfY29sZCB2b2lkIGZmX2hwZWxkc3BfaW5pdF9hbHBoYShIcGVsRFNQQ29udGV4dCAqYywgaW50IGZsYWdzKQoreworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzBdID0gcHV0X3BpeGVsczE2X2F4cF9hc207CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMV0gPSBwdXRfcGl4ZWxzMTZfeDJfYXhwOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzJdID0gcHV0X3BpeGVsczE2X3kyX2F4cDsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVszXSA9IHB1dF9waXhlbHMxNl94eTJfYXhwOworCisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzBdID0gcHV0X3BpeGVsczE2X2F4cF9hc207CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzFdID0gcHV0X25vX3JuZF9waXhlbHMxNl94Ml9heHA7CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzJdID0gcHV0X25vX3JuZF9waXhlbHMxNl95Ml9heHA7CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzNdID0gcHV0X25vX3JuZF9waXhlbHMxNl94eTJfYXhwOworCisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMF0gPSBhdmdfcGl4ZWxzMTZfYXhwOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzFdID0gYXZnX3BpeGVsczE2X3gyX2F4cDsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsyXSA9IGF2Z19waXhlbHMxNl95Ml9heHA7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bM10gPSBhdmdfcGl4ZWxzMTZfeHkyX2F4cDsKKworICAgIGMtPmF2Z19ub19ybmRfcGl4ZWxzX3RhYlswXSA9IGF2Z19ub19ybmRfcGl4ZWxzMTZfYXhwOworICAgIGMtPmF2Z19ub19ybmRfcGl4ZWxzX3RhYlsxXSA9IGF2Z19ub19ybmRfcGl4ZWxzMTZfeDJfYXhwOworICAgIGMtPmF2Z19ub19ybmRfcGl4ZWxzX3RhYlsyXSA9IGF2Z19ub19ybmRfcGl4ZWxzMTZfeTJfYXhwOworICAgIGMtPmF2Z19ub19ybmRfcGl4ZWxzX3RhYlszXSA9IGF2Z19ub19ybmRfcGl4ZWxzMTZfeHkyX2F4cDsKKworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzBdID0gcHV0X3BpeGVsc19heHBfYXNtOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzFdID0gcHV0X3BpeGVsc194Ml9heHA7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bMl0gPSBwdXRfcGl4ZWxzX3kyX2F4cDsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVszXSA9IHB1dF9waXhlbHNfeHkyX2F4cDsKKworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVswXSA9IHB1dF9waXhlbHNfYXhwX2FzbTsKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bMV0gPSBwdXRfbm9fcm5kX3BpeGVsc194Ml9heHA7CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzJdID0gcHV0X25vX3JuZF9waXhlbHNfeTJfYXhwOworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVszXSA9IHB1dF9ub19ybmRfcGl4ZWxzX3h5Ml9heHA7CisKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVswXSA9IGF2Z19waXhlbHNfYXhwOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzFdID0gYXZnX3BpeGVsc194Ml9heHA7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMl0gPSBhdmdfcGl4ZWxzX3kyX2F4cDsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVszXSA9IGF2Z19waXhlbHNfeHkyX2F4cDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL2hwZWxkc3BfYWxwaGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL2hwZWxkc3BfYWxwaGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODUxODJjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvaHBlbGRzcF9hbHBoYS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FMUEhBX0hQRUxEU1BfQUxQSEFfSAorI2RlZmluZSBBVkNPREVDX0FMUEhBX0hQRUxEU1BfQUxQSEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK3ZvaWQgcHV0X3BpeGVsc19heHBfYXNtKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FMUEhBX0hQRUxEU1BfQUxQSEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvaHBlbGRzcF9hbHBoYV9hc20uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL2hwZWxkc3BfYWxwaGFfYXNtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzODZjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL2hwZWxkc3BfYWxwaGFfYXNtLlMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBBbHBoYSBvcHRpbWl6ZWQgRFNQIHV0aWxzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFsayBIdWVmZm5lciA8ZmFsa0BkZWJpYW4ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBzY2hlZHVsZWQgZm9yIHBjYTU2LiBUaGV5IHNob3VsZCB3b3JrCisgKiByZWFzb25hYmx5IG9uIGV2NiwgdGhvdWdoLgorICovCisKKyNpbmNsdWRlICJyZWdkZWYuaCIKKworCisgICAgICAgIC5zZXQgbm9hdAorICAgICAgICAuc2V0IG5vcmVvcmRlcgorICAgICAgICAuYXJjaCBwY2E1NgorICAgICAgICAudGV4dAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB2b2lkIHB1dF9waXhlbHNfYXhwX2FzbSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfc2l6ZSwgaW50IGgpCisgKi8KKyAgICAgICAgLmFsaWduIDYKKyAgICAgICAgLmdsb2JsIHB1dF9waXhlbHNfYXhwX2FzbQorICAgICAgICAuZW50IHB1dF9waXhlbHNfYXhwX2FzbQorcHV0X3BpeGVsc19heHBfYXNtOgorICAgICAgICAuZnJhbWUgc3AsIDAsIHJhCisgICAgICAgIC5wcm9sb2d1ZSAwCisKKyAgICAgICAgYW5kICAgICBhMSwgNywgdDAKKyAgICAgICAgYmVxICAgICB0MCwgJGFsaWduZWQKKworICAgICAgICAuYWxpZ24gNAorJHVuYWxpZ25lZDoKKyAgICAgICAgbGRxX3UgICB0MCwgMChhMSkKKyAgICAgICAgbGRxX3UgICB0MSwgOChhMSkKKyAgICAgICAgYWRkcSAgICBhMSwgYTIsIGExCisgICAgICAgIG5vcAorCisgICAgICAgIGxkcV91ICAgdDIsIDAoYTEpCisgICAgICAgIGxkcV91ICAgdDMsIDgoYTEpCisgICAgICAgIGFkZHEgICAgYTEsIGEyLCBhMQorICAgICAgICBub3AKKworICAgICAgICBsZHFfdSAgIHQ0LCAwKGExKQorICAgICAgICBsZHFfdSAgIHQ1LCA4KGExKQorICAgICAgICBhZGRxICAgIGExLCBhMiwgYTEKKyAgICAgICAgbm9wCisKKyAgICAgICAgbGRxX3UgICB0NiwgMChhMSkKKyAgICAgICAgbGRxX3UgICB0NywgOChhMSkKKyAgICAgICAgZXh0cWwgICB0MCwgYTEsIHQwCisgICAgICAgIGFkZHEgICAgYTEsIGEyLCBhMQorCisgICAgICAgIGV4dHFoICAgdDEsIGExLCB0MQorICAgICAgICBhZGRxICAgIGEwLCBhMiwgdDgKKyAgICAgICAgZXh0cWwgICB0MiwgYTEsIHQyCisgICAgICAgIGFkZHEgICAgdDgsIGEyLCB0OQorCisgICAgICAgIGV4dHFoICAgdDMsIGExLCB0MworICAgICAgICBhZGRxICAgIHQ5LCBhMiwgdGEKKyAgICAgICAgZXh0cWwgICB0NCwgYTEsIHQ0CisgICAgICAgIG9yICAgICAgdDAsIHQxLCB0MAorCisgICAgICAgIGV4dHFoICAgdDUsIGExLCB0NQorICAgICAgICBvciAgICAgIHQyLCB0MywgdDIKKyAgICAgICAgZXh0cWwgICB0NiwgYTEsIHQ2CisgICAgICAgIG9yICAgICAgdDQsIHQ1LCB0NAorCisgICAgICAgIGV4dHFoICAgdDcsIGExLCB0NworICAgICAgICBvciAgICAgIHQ2LCB0NywgdDYKKyAgICAgICAgc3RxICAgICB0MCwgMChhMCkKKyAgICAgICAgc3RxICAgICB0MiwgMCh0OCkKKworICAgICAgICBzdHEgICAgIHQ0LCAwKHQ5KQorICAgICAgICBzdWJxICAgIGEzLCA0LCBhMworICAgICAgICBzdHEgICAgIHQ2LCAwKHRhKQorICAgICAgICBhZGRxICAgIHRhLCBhMiwgYTAKKworICAgICAgICBibmUgICAgIGEzLCAkdW5hbGlnbmVkCisgICAgICAgIHJldAorCisgICAgICAgIC5hbGlnbiA0CiskYWxpZ25lZDoKKyAgICAgICAgbGRxICAgICB0MCwgMChhMSkKKyAgICAgICAgYWRkcSAgICBhMSwgYTIsIGExCisgICAgICAgIGxkcSAgICAgdDEsIDAoYTEpCisgICAgICAgIGFkZHEgICAgYTEsIGEyLCBhMQorCisgICAgICAgIGxkcSAgICAgdDIsIDAoYTEpCisgICAgICAgIGFkZHEgICAgYTEsIGEyLCBhMQorICAgICAgICBsZHEgICAgIHQzLCAwKGExKQorCisgICAgICAgIGFkZHEgICAgYTAsIGEyLCB0NAorICAgICAgICBhZGRxICAgIGExLCBhMiwgYTEKKyAgICAgICAgYWRkcSAgICB0NCwgYTIsIHQ1CisgICAgICAgIHN1YnEgICAgYTMsIDQsIGEzCisKKyAgICAgICAgc3RxICAgICB0MCwgMChhMCkKKyAgICAgICAgYWRkcSAgICB0NSwgYTIsIHQ2CisgICAgICAgIHN0cSAgICAgdDEsIDAodDQpCisgICAgICAgIGFkZHEgICAgdDYsIGEyLCBhMAorCisgICAgICAgIHN0cSAgICAgdDIsIDAodDUpCisgICAgICAgIHN0cSAgICAgdDMsIDAodDYpCisKKyAgICAgICAgYm5lICAgICBhMywgJGFsaWduZWQKKyAgICAgICAgcmV0CisgICAgICAgIC5lbmQgcHV0X3BpeGVsc19heHBfYXNtCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9pZGN0ZHNwX2FscGhhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9pZGN0ZHNwX2FscGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkyM2ViYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL2lkY3Rkc3BfYWxwaGEuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWxrIEh1ZWZmbmVyIDxmYWxrQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaWRjdGRzcC5oIgorI2luY2x1ZGUgImlkY3Rkc3BfYWxwaGEuaCIKKyNpbmNsdWRlICJhc20uaCIKKwordm9pZCBwdXRfcGl4ZWxzX2NsYW1wZWRfbXZpX2FzbShjb25zdCBpbnQxNl90ICpibG9jaywgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKK3ZvaWQgYWRkX3BpeGVsc19jbGFtcGVkX212aV9hc20oY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CisKK3ZvaWQgKCpwdXRfcGl4ZWxzX2NsYW1wZWRfYXhwX3ApKGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKK3ZvaWQgKCphZGRfcGl4ZWxzX2NsYW1wZWRfYXhwX3ApKGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKKworI2lmIDAKKy8qIFRoZXNlIGZ1bmN0aW9ucyB3ZXJlIHRoZSBiYXNlIGZvciB0aGUgb3B0aW1pemVkIGFzc2VtYmxlciByb3V0aW5lcywKKyAgIGFuZCByZW1haW4gaGVyZSBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy4gICovCitzdGF0aWMgdm9pZCBwdXRfcGl4ZWxzX2NsYW1wZWRfbXZpKGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCit7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQ2NF90IGNsYW1wbWFzayA9IHphcCgtMSwgMHhhYSk7IC8qIDB4MDBmZjAwZmYwMGZmMDBmZiAqLworCisgICAgZG8geworICAgICAgICB1aW50NjRfdCBzaG9ydHMwLCBzaG9ydHMxOworCisgICAgICAgIHNob3J0czAgPSBsZHEoYmxvY2spOworICAgICAgICBzaG9ydHMwID0gbWF4c3c0KHNob3J0czAsIDApOworICAgICAgICBzaG9ydHMwID0gbWluc3c0KHNob3J0czAsIGNsYW1wbWFzayk7CisgICAgICAgIHN0bChwa3diKHNob3J0czApLCBwaXhlbHMpOworCisgICAgICAgIHNob3J0czEgPSBsZHEoYmxvY2sgKyA0KTsKKyAgICAgICAgc2hvcnRzMSA9IG1heHN3NChzaG9ydHMxLCAwKTsKKyAgICAgICAgc2hvcnRzMSA9IG1pbnN3NChzaG9ydHMxLCBjbGFtcG1hc2spOworICAgICAgICBzdGwocGt3YihzaG9ydHMxKSwgcGl4ZWxzICsgNCk7CisKKyAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgYmxvY2sgKz0gODsKKyAgICB9IHdoaWxlICgtLWkpOworfQorCit2b2lkIGFkZF9waXhlbHNfY2xhbXBlZF9tdmkoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKQoreworICAgIGludCBoID0gODsKKyAgICAvKiBLZWVwIHRoaXMgZnVuY3Rpb24gYSBsZWFmIGZ1bmN0aW9uIGJ5IGdlbmVyYXRpbmcgdGhlIGNvbnN0YW50cworICAgICAgIG1hbnVhbGx5IChtYWlubHkgZm9yIHRoZSBoYWNrIHZhbHVlIDstKS4gICovCisgICAgdWludDY0X3QgY2xhbXBtYXNrID0gemFwKC0xLCAweGFhKTsgLyogMHgwMGZmMDBmZjAwZmYwMGZmICovCisgICAgdWludDY0X3Qgc2lnbm1hc2sgID0gemFwKC0xLCAweDMzKTsKKyAgICBzaWdubWFzayBePSBzaWdubWFzayA+PiAxOyAgLyogMHg4MDAwODAwMDgwMDA4MDAwICovCisKKyAgICBkbyB7CisgICAgICAgIHVpbnQ2NF90IHNob3J0czAsIHBpeDAsIHNpZ25zMDsKKyAgICAgICAgdWludDY0X3Qgc2hvcnRzMSwgcGl4MSwgc2lnbnMxOworCisgICAgICAgIHNob3J0czAgPSBsZHEoYmxvY2spOworICAgICAgICBzaG9ydHMxID0gbGRxKGJsb2NrICsgNCk7CisKKyAgICAgICAgcGl4MCAgICA9IHVucGtidyhsZGwocGl4ZWxzKSk7CisgICAgICAgIC8qIFNpZ25lZCBzdWJ3b3JkIGFkZCAoTU1YIHBhZGR3KS4gICovCisgICAgICAgIHNpZ25zMCAgPSBzaG9ydHMwICYgc2lnbm1hc2s7CisgICAgICAgIHNob3J0czAgJj0gfnNpZ25tYXNrOworICAgICAgICBzaG9ydHMwICs9IHBpeDA7CisgICAgICAgIHNob3J0czAgXj0gc2lnbnMwOworICAgICAgICAvKiBDbGFtcC4gKi8KKyAgICAgICAgc2hvcnRzMCA9IG1heHN3NChzaG9ydHMwLCAwKTsKKyAgICAgICAgc2hvcnRzMCA9IG1pbnN3NChzaG9ydHMwLCBjbGFtcG1hc2spOworCisgICAgICAgIC8qIE5leHQgNC4gICovCisgICAgICAgIHBpeDEgICAgPSB1bnBrYncobGRsKHBpeGVscyArIDQpKTsKKyAgICAgICAgc2lnbnMxICA9IHNob3J0czEgJiBzaWdubWFzazsKKyAgICAgICAgc2hvcnRzMSAmPSB+c2lnbm1hc2s7CisgICAgICAgIHNob3J0czEgKz0gcGl4MTsKKyAgICAgICAgc2hvcnRzMSBePSBzaWduczE7CisgICAgICAgIHNob3J0czEgPSBtYXhzdzQoc2hvcnRzMSwgMCk7CisgICAgICAgIHNob3J0czEgPSBtaW5zdzQoc2hvcnRzMSwgY2xhbXBtYXNrKTsKKworICAgICAgICBzdGwocGt3YihzaG9ydHMwKSwgcGl4ZWxzKTsKKyAgICAgICAgc3RsKHBrd2Ioc2hvcnRzMSksIHBpeGVscyArIDQpOworCisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7CisgICAgICAgIGJsb2NrICs9IDg7CisgICAgfSB3aGlsZSAoLS1oKTsKK30KKyNlbmRpZgorCithdl9jb2xkIHZvaWQgZmZfaWRjdGRzcF9pbml0X2FscGhhKElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKQoreworICAgIC8qIGFtYXNrIGNsZWFycyBhbGwgYml0cyB0aGF0IGNvcnJlc3BvbmQgdG8gcHJlc2VudCBmZWF0dXJlcy4gICovCisgICAgaWYgKGFtYXNrKEFNQVNLX01WSSkgPT0gMCkgeworICAgICAgICBjLT5wdXRfcGl4ZWxzX2NsYW1wZWQgPSBwdXRfcGl4ZWxzX2NsYW1wZWRfbXZpX2FzbTsKKyAgICAgICAgYy0+YWRkX3BpeGVsc19jbGFtcGVkID0gYWRkX3BpeGVsc19jbGFtcGVkX212aV9hc207CisgICAgfQorCisgICAgcHV0X3BpeGVsc19jbGFtcGVkX2F4cF9wID0gYy0+cHV0X3BpeGVsc19jbGFtcGVkOworICAgIGFkZF9waXhlbHNfY2xhbXBlZF9heHBfcCA9IGMtPmFkZF9waXhlbHNfY2xhbXBlZDsKKworICAgIGlmICghaGlnaF9iaXRfZGVwdGggJiYgIWF2Y3R4LT5sb3dyZXMgJiYKKyAgICAgICAgKGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9BVVRPIHx8CisgICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfU0lNUExFQUxQSEEpKSB7CisgICAgICAgIGMtPmlkY3RfcHV0ID0gZmZfc2ltcGxlX2lkY3RfcHV0X2F4cDsKKyAgICAgICAgYy0+aWRjdF9hZGQgPSBmZl9zaW1wbGVfaWRjdF9hZGRfYXhwOworICAgICAgICBjLT5pZGN0ID0gICAgIGZmX3NpbXBsZV9pZGN0X2F4cDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9pZGN0ZHNwX2FscGhhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9pZGN0ZHNwX2FscGhhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5ODQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL2lkY3Rkc3BfYWxwaGEuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BTFBIQV9JRENURFNQX0FMUEhBX0gKKyNkZWZpbmUgQVZDT0RFQ19BTFBIQV9JRENURFNQX0FMUEhBX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitleHRlcm4gdm9pZCAoKnB1dF9waXhlbHNfY2xhbXBlZF9heHBfcCkoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKK2V4dGVybiB2b2lkICgqYWRkX3BpeGVsc19jbGFtcGVkX2F4cF9wKShjb25zdCBpbnQxNl90ICpibG9jaywgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpOworCit2b2lkIGZmX3NpbXBsZV9pZGN0X2F4cChpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9heHAodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdF9hZGRfYXhwKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUxQSEFfSURDVERTUF9BTFBIQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9pZGN0ZHNwX2FscGhhX2FzbS5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvaWRjdGRzcF9hbHBoYV9hc20uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTQ1ZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvaWRjdGRzcF9hbHBoYV9hc20uUwpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIEFscGhhIG9wdGltaXplZCBJRENULXJlbGF0ZWQgcm91dGluZXMKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWxrIEh1ZWZmbmVyIDxmYWxrQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHNjaGVkdWxlZCBmb3IgcGNhNTYuIFRoZXkgc2hvdWxkIHdvcmsKKyAqIHJlYXNvbmFibHkgb24gZXY2LCB0aG91Z2guCisgKi8KKworI2luY2x1ZGUgInJlZ2RlZi5oIgorCisgICAgICAgIC5zZXQgbm9hdAorICAgICAgICAuc2V0IG5vcmVvcmRlcgorICAgICAgICAuYXJjaCBwY2E1NgorICAgICAgICAudGV4dAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB2b2lkIHB1dF9waXhlbHNfY2xhbXBlZF9tdmlfYXNtKGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICpwaXhlbHMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCisgKi8KKyAgICAgICAgLmFsaWduIDYKKyAgICAgICAgLmdsb2JsIHB1dF9waXhlbHNfY2xhbXBlZF9tdmlfYXNtCisgICAgICAgIC5lbnQgcHV0X3BpeGVsc19jbGFtcGVkX212aV9hc20KK3B1dF9waXhlbHNfY2xhbXBlZF9tdmlfYXNtOgorICAgICAgICAuZnJhbWUgc3AsIDAsIHJhCisgICAgICAgIC5wcm9sb2d1ZSAwCisKKyAgICAgICAgbGRhICAgICB0OCwgLTEKKyAgICAgICAgbGRhICAgICB0OSwgOCAgICAgICAgICAgIyBsb29wIGNvdW50ZXIKKyAgICAgICAgemFwICAgICB0OCwgMHhhYSwgdDggICAgIyAwMGZmMDBmZjAwZmYwMGZmCisKKyAgICAgICAgLmFsaWduIDQKKzE6ICAgICAgbGRxICAgICB0MCwgIDAoYTApCisgICAgICAgIGxkcSAgICAgdDEsICA4KGEwKQorICAgICAgICBsZHEgICAgIHQyLCAxNihhMCkKKyAgICAgICAgbGRxICAgICB0MywgMjQoYTApCisKKyAgICAgICAgbWF4c3c0ICB0MCwgemVybywgdDAKKyAgICAgICAgc3VicSAgICB0OSwgMiwgdDkKKyAgICAgICAgbWF4c3c0ICB0MSwgemVybywgdDEKKyAgICAgICAgbGRhICAgICBhMCwgMzIoYTApCisKKyAgICAgICAgbWF4c3c0ICB0MiwgemVybywgdDIKKyAgICAgICAgYWRkcSAgICBhMSwgYTIsIHRhCisgICAgICAgIG1heHN3NCAgdDMsIHplcm8sIHQzCisgICAgICAgIG1pbnN3NCAgdDAsIHQ4LCB0MAorCisgICAgICAgIG1pbnN3NCAgdDEsIHQ4LCB0MQorICAgICAgICBtaW5zdzQgIHQyLCB0OCwgdDIKKyAgICAgICAgbWluc3c0ICB0MywgdDgsIHQzCisgICAgICAgIHBrd2IgICAgdDAsIHQwCisKKyAgICAgICAgcGt3YiAgICB0MSwgdDEKKyAgICAgICAgcGt3YiAgICB0MiwgdDIKKyAgICAgICAgcGt3YiAgICB0MywgdDMKKyAgICAgICAgc3RsICAgICB0MCwgMChhMSkKKworICAgICAgICBzdGwgICAgIHQxLCA0KGExKQorICAgICAgICBhZGRxICAgIHRhLCBhMiwgYTEKKyAgICAgICAgc3RsICAgICB0MiwgMCh0YSkKKyAgICAgICAgc3RsICAgICB0MywgNCh0YSkKKworICAgICAgICBibmUgICAgIHQ5LCAxYgorICAgICAgICByZXQKKyAgICAgICAgLmVuZCBwdXRfcGl4ZWxzX2NsYW1wZWRfbXZpX2FzbQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB2b2lkIGFkZF9waXhlbHNfY2xhbXBlZF9tdmlfYXNtKGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICpwaXhlbHMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCisgKi8KKyAgICAgICAgLmFsaWduIDYKKyAgICAgICAgLmdsb2JsIGFkZF9waXhlbHNfY2xhbXBlZF9tdmlfYXNtCisgICAgICAgIC5lbnQgYWRkX3BpeGVsc19jbGFtcGVkX212aV9hc20KK2FkZF9waXhlbHNfY2xhbXBlZF9tdmlfYXNtOgorICAgICAgICAuZnJhbWUgc3AsIDAsIHJhCisgICAgICAgIC5wcm9sb2d1ZSAwCisKKyAgICAgICAgbGRhICAgICB0MSwgLTEKKyAgICAgICAgbGRhICAgICB0aCwgOAorICAgICAgICB6YXAgICAgIHQxLCAweDMzLCB0ZworICAgICAgICBub3AKKworICAgICAgICBzcmwgICAgIHRnLCAxLCB0MAorICAgICAgICB4b3IgICAgIHRnLCB0MCwgdGcgICAgICAjIDB4ODAwMDgwMDA4MDAwODAwMAorICAgICAgICB6YXAgICAgIHQxLCAweGFhLCB0ZiAgICAjIDB4MDBmZjAwZmYwMGZmMDBmZgorCisgICAgICAgIC5hbGlnbiA0CisxOiAgICAgIGxkbCAgICAgdDEsIDAoYTEpICAgICAgICMgcGl4MCAodHJ5IHRvIGhpdCBjYWNoZSBsaW5lIHNvb24pCisgICAgICAgIGxkbCAgICAgdDQsIDQoYTEpICAgICAgICMgcGl4MQorICAgICAgICBhZGRxICAgIGExLCBhMiwgdGUgICAgICAjIHBpeGVscyArPSBsaW5lX3NpemUKKyAgICAgICAgbGRxICAgICB0MCwgMChhMCkgICAgICAgIyBzaG9ydHMwCisKKyAgICAgICAgbGRsICAgICB0NywgMCh0ZSkgICAgICAgIyBwaXgyICh0cnkgdG8gaGl0IGNhY2hlIGxpbmUgc29vbikKKyAgICAgICAgbGRsICAgICB0YSwgNCh0ZSkgICAgICAgIyBwaXgzCisgICAgICAgIGxkcSAgICAgdDMsIDgoYTApICAgICAgICMgc2hvcnRzMQorICAgICAgICBsZHEgICAgIHQ2LCAxNihhMCkgICAgICAjIHNob3J0czIKKworICAgICAgICBsZHEgICAgIHQ5LCAyNChhMCkgICAgICAjIHNob3J0czMKKyAgICAgICAgdW5wa2J3ICB0MSwgdDEgICAgICAgICAgIyAwIDAgKHF1YXJ0ZXIvb3Agbm8uKQorICAgICAgICBhbmQgICAgIHQwLCB0ZywgdDIgICAgICAjIDAgMQorICAgICAgICB1bnBrYncgIHQ0LCB0NCAgICAgICAgICAjIDEgMAorCisgICAgICAgIGJpYyAgICAgdDAsIHRnLCB0MCAgICAgICMgMCAyCisgICAgICAgIHVucGtidyAgdDcsIHQ3ICAgICAgICAgICMgMiAwCisgICAgICAgIGFuZCAgICAgdDMsIHRnLCB0NSAgICAgICMgMSAxCisgICAgICAgIGFkZHEgICAgdDAsIHQxLCB0MCAgICAgICMgMCAzCisKKyAgICAgICAgeG9yICAgICB0MCwgdDIsIHQwICAgICAgIyAwIDQKKyAgICAgICAgdW5wa2J3ICB0YSwgdGEgICAgICAgICAgIyAzIDAKKyAgICAgICAgYW5kICAgICB0NiwgdGcsIHQ4ICAgICAgIyAyIDEKKyAgICAgICAgbWF4c3c0ICB0MCwgemVybywgdDAgICAgIyAwIDUKKworICAgICAgICBiaWMgICAgIHQzLCB0ZywgdDMgICAgICAjIDEgMgorICAgICAgICBiaWMgICAgIHQ2LCB0ZywgdDYgICAgICAjIDIgMgorICAgICAgICBtaW5zdzQgIHQwLCB0ZiwgdDAgICAgICAjIDAgNgorICAgICAgICBhZGRxICAgIHQzLCB0NCwgdDMgICAgICAjIDEgMworCisgICAgICAgIHBrd2IgICAgdDAsIHQwICAgICAgICAgICMgMCA3CisgICAgICAgIHhvciAgICAgdDMsIHQ1LCB0MyAgICAgICMgMSA0CisgICAgICAgIG1heHN3NCAgdDMsIHplcm8sIHQzICAgICMgMSA1CisgICAgICAgIGFkZHEgICAgdDYsIHQ3LCB0NiAgICAgICMgMiAzCisKKyAgICAgICAgeG9yICAgICB0NiwgdDgsIHQ2ICAgICAgIyAyIDQKKyAgICAgICAgYW5kICAgICB0OSwgdGcsIHRiICAgICAgIyAzIDEKKyAgICAgICAgbWluc3c0ICB0MywgdGYsIHQzICAgICAgIyAxIDYKKyAgICAgICAgYmljICAgICB0OSwgdGcsIHQ5ICAgICAgIyAzIDIKKworICAgICAgICBtYXhzdzQgIHQ2LCB6ZXJvLCB0NiAgICAjIDIgNQorICAgICAgICBhZGRxICAgIHQ5LCB0YSwgdDkgICAgICAjIDMgMworICAgICAgICBzdGwgICAgIHQwLCAwKGExKSAgICAgICAjIDAgOAorICAgICAgICBtaW5zdzQgIHQ2LCB0ZiwgdDYgICAgICAjIDIgNgorCisgICAgICAgIHhvciAgICAgdDksIHRiLCB0OSAgICAgICMgMyA0CisgICAgICAgIG1heHN3NCAgdDksIHplcm8sIHQ5ICAgICMgMyA1CisgICAgICAgIGxkYSAgICAgYTAsIDMyKGEwKSAgICAgICMgYmxvY2sgKz0gMTY7CisgICAgICAgIHBrd2IgICAgdDMsIHQzICAgICAgICAgICMgMSA3CisKKyAgICAgICAgbWluc3c0ICB0OSwgdGYsIHQ5ICAgICAgIyAzIDYKKyAgICAgICAgc3VicSAgICB0aCwgMiwgdGgKKyAgICAgICAgcGt3YiAgICB0NiwgdDYgICAgICAgICAgIyAyIDcKKyAgICAgICAgcGt3YiAgICB0OSwgdDkgICAgICAgICAgIyAzIDcKKworICAgICAgICBzdGwgICAgIHQzLCA0KGExKSAgICAgICAjIDEgOAorICAgICAgICBhZGRxICAgIHRlLCBhMiwgYTEgICAgICAjIHBpeGVscyArPSBsaW5lX3NpemUKKyAgICAgICAgc3RsICAgICB0NiwgMCh0ZSkgICAgICAgIyAyIDgKKyAgICAgICAgc3RsICAgICB0OSwgNCh0ZSkgICAgICAgIyAzIDgKKworICAgICAgICBibmUgICAgIHRoLCAxYgorICAgICAgICByZXQKKyAgICAgICAgLmVuZCBhZGRfcGl4ZWxzX2NsYW1wZWRfbXZpX2FzbQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvbWVfY21wX2FscGhhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9tZV9jbXBfYWxwaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjM2MDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvbWVfY21wX2FscGhhLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBBbHBoYSBvcHRpbWl6ZWQgRFNQIHV0aWxzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFsayBIdWVmZm5lciA8ZmFsa0BkZWJpYW4ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21lX2NtcC5oIgorI2luY2x1ZGUgImFzbS5oIgorCitpbnQgcGl4X2FiczE2eDE2X212aV9hc20odm9pZCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwgaW50IGxpbmVfc2l6ZSwgaW50IGgpOworCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGF2ZzIodWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyAgICByZXR1cm4gKGEgfCBiKSAtICgoKGEgXiBiKSAmIEJZVEVfVkVDKDB4ZmUpKSA+PiAxKTsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCBhdmc0KHVpbnQ2NF90IGwxLCB1aW50NjRfdCBsMiwgdWludDY0X3QgbDMsIHVpbnQ2NF90IGw0KQoreworICAgIHVpbnQ2NF90IHIxID0gKChsMSAmIH5CWVRFX1ZFQygweDAzKSkgPj4gMikKKyAgICAgICAgICAgICAgICArICgobDIgJiB+QllURV9WRUMoMHgwMykpID4+IDIpCisgICAgICAgICAgICAgICAgKyAoKGwzICYgfkJZVEVfVkVDKDB4MDMpKSA+PiAyKQorICAgICAgICAgICAgICAgICsgKChsNCAmIH5CWVRFX1ZFQygweDAzKSkgPj4gMik7CisgICAgdWludDY0X3QgcjIgPSAoKCAgKGwxICYgQllURV9WRUMoMHgwMykpCisgICAgICAgICAgICAgICAgICAgICsgKGwyICYgQllURV9WRUMoMHgwMykpCisgICAgICAgICAgICAgICAgICAgICsgKGwzICYgQllURV9WRUMoMHgwMykpCisgICAgICAgICAgICAgICAgICAgICsgKGw0ICYgQllURV9WRUMoMHgwMykpCisgICAgICAgICAgICAgICAgICAgICsgQllURV9WRUMoMHgwMikpID4+IDIpICYgQllURV9WRUMoMHgwMyk7CisgICAgcmV0dXJuIHIxICsgcjI7Cit9CisKK3N0YXRpYyBpbnQgcGl4X2Ficzh4OF9tdmkodm9pZCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwgaW50IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICBpZiAoKHNpemVfdCkgcGl4MiAmIDB4NykgeworICAgICAgICAvKiB3b3JrcyBvbmx5IHdoZW4gcGl4MiBpcyBhY3R1YWxseSB1bmFsaWduZWQgKi8KKyAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgLyogZG8gOCBwaXhlbCBhIHRpbWUgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHAxLCBwMjsKKworICAgICAgICAgICAgcDEgID0gbGRxKHBpeDEpOworICAgICAgICAgICAgcDIgID0gdWxkcShwaXgyKTsKKyAgICAgICAgICAgIHJlc3VsdCArPSBwZXJyKHAxLCBwMik7CisKKyAgICAgICAgICAgIHBpeDEgKz0gbGluZV9zaXplOworICAgICAgICAgICAgcGl4MiArPSBsaW5lX3NpemU7CisgICAgICAgIH0gd2hpbGUgKC0taCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgdWludDY0X3QgcDEsIHAyOworCisgICAgICAgICAgICBwMSA9IGxkcShwaXgxKTsKKyAgICAgICAgICAgIHAyID0gbGRxKHBpeDIpOworICAgICAgICAgICAgcmVzdWx0ICs9IHBlcnIocDEsIHAyKTsKKworICAgICAgICAgICAgcGl4MSArPSBsaW5lX3NpemU7CisgICAgICAgICAgICBwaXgyICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgfSB3aGlsZSAoLS1oKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjaWYgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBkb25lIGluIGFzc2VtYmx5ICovCitpbnQgcGl4X2FiczE2eDE2X212aSh1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLCBpbnQgbGluZV9zaXplKQoreworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBoID0gMTY7CisKKyAgICBpZiAoKHNpemVfdCkgcGl4MiAmIDB4NykgeworICAgICAgICAvKiB3b3JrcyBvbmx5IHdoZW4gcGl4MiBpcyBhY3R1YWxseSB1bmFsaWduZWQgKi8KKyAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgLyogZG8gMTYgcGl4ZWwgYSB0aW1lICovCisgICAgICAgICAgICB1aW50NjRfdCBwMV9sLCBwMV9yLCBwMl9sLCBwMl9yOworICAgICAgICAgICAgdWludDY0X3QgdDsKKworICAgICAgICAgICAgcDFfbCAgPSBsZHEocGl4MSk7CisgICAgICAgICAgICBwMV9yICA9IGxkcShwaXgxICsgOCk7CisgICAgICAgICAgICB0ICAgICA9IGxkcV91KHBpeDIgKyA4KTsKKyAgICAgICAgICAgIHAyX2wgID0gZXh0cWwobGRxX3UocGl4MiksIHBpeDIpIHwgZXh0cWgodCwgcGl4Mik7CisgICAgICAgICAgICBwMl9yICA9IGV4dHFsKHQsIHBpeDIpIHwgZXh0cWgobGRxX3UocGl4MiArIDE2KSwgcGl4Mik7CisgICAgICAgICAgICBwaXgxICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgICAgIHBpeDIgKz0gbGluZV9zaXplOworCisgICAgICAgICAgICByZXN1bHQgKz0gcGVycihwMV9sLCBwMl9sKQorICAgICAgICAgICAgICAgICAgICArIHBlcnIocDFfciwgcDJfcik7CisgICAgICAgIH0gd2hpbGUgKC0taCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgdWludDY0X3QgcDFfbCwgcDFfciwgcDJfbCwgcDJfcjsKKworICAgICAgICAgICAgcDFfbCA9IGxkcShwaXgxKTsKKyAgICAgICAgICAgIHAxX3IgPSBsZHEocGl4MSArIDgpOworICAgICAgICAgICAgcDJfbCA9IGxkcShwaXgyKTsKKyAgICAgICAgICAgIHAyX3IgPSBsZHEocGl4MiArIDgpOworICAgICAgICAgICAgcGl4MSArPSBsaW5lX3NpemU7CisgICAgICAgICAgICBwaXgyICs9IGxpbmVfc2l6ZTsKKworICAgICAgICAgICAgcmVzdWx0ICs9IHBlcnIocDFfbCwgcDJfbCkKKyAgICAgICAgICAgICAgICAgICAgKyBwZXJyKHAxX3IsIHAyX3IpOworICAgICAgICB9IHdoaWxlICgtLWgpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBwaXhfYWJzMTZ4MTZfeDJfbXZpKHZvaWQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsIGludCBsaW5lX3NpemUsIGludCBoKQoreworICAgIGludCByZXN1bHQgPSAwOworICAgIHVpbnQ2NF90IGRpc2FsaWduID0gKHNpemVfdCkgcGl4MiAmIDB4NzsKKworICAgIHN3aXRjaCAoZGlzYWxpZ24pIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHAxX2wsIHAxX3IsIHAyX2wsIHAyX3I7CisgICAgICAgICAgICB1aW50NjRfdCBsLCByOworCisgICAgICAgICAgICBwMV9sID0gbGRxKHBpeDEpOworICAgICAgICAgICAgcDFfciA9IGxkcShwaXgxICsgOCk7CisgICAgICAgICAgICBsICAgID0gbGRxKHBpeDIpOworICAgICAgICAgICAgciAgICA9IGxkcShwaXgyICsgOCk7CisgICAgICAgICAgICBwMl9sID0gYXZnMihsLCAobCA+PiA4KSB8ICgodWludDY0X3QpIHIgPDwgNTYpKTsKKyAgICAgICAgICAgIHAyX3IgPSBhdmcyKHIsIChyID4+IDgpIHwgKCh1aW50NjRfdCkgcGl4MlsxNl0gPDwgNTYpKTsKKyAgICAgICAgICAgIHBpeDEgKz0gbGluZV9zaXplOworICAgICAgICAgICAgcGl4MiArPSBsaW5lX3NpemU7CisKKyAgICAgICAgICAgIHJlc3VsdCArPSBwZXJyKHAxX2wsIHAyX2wpCisgICAgICAgICAgICAgICAgICAgICsgcGVycihwMV9yLCBwMl9yKTsKKyAgICAgICAgfSB3aGlsZSAoLS1oKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICAvKiB8Li4uLi4uLmx8bGxsbGxsbHJ8cnJycnJycip8CisgICAgICAgICAgIFRoaXMgY2FzZSBpcyBzcGVjaWFsIGJlY2F1c2UgZGlzYWxpZ24xIHdvdWxkIGJlIDgsIHdoaWNoCisgICAgICAgICAgIGdldHMgdHJlYXRlZCBhcyAwIGJ5IGV4dHFoLiAgQXQgbGVhc3QgaXQgaXMgYSBiaXQgZmFzdGVyCisgICAgICAgICAgIHRoYXQgd2F5IDopICAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICB1aW50NjRfdCBwMV9sLCBwMV9yLCBwMl9sLCBwMl9yOworICAgICAgICAgICAgdWludDY0X3QgbCwgbSwgcjsKKworICAgICAgICAgICAgcDFfbCA9IGxkcShwaXgxKTsKKyAgICAgICAgICAgIHAxX3IgPSBsZHEocGl4MSArIDgpOworICAgICAgICAgICAgbCAgICAgPSBsZHFfdShwaXgyKTsKKyAgICAgICAgICAgIG0gICAgID0gbGRxX3UocGl4MiArIDgpOworICAgICAgICAgICAgciAgICAgPSBsZHFfdShwaXgyICsgMTYpOworICAgICAgICAgICAgcDJfbCAgPSBhdmcyKGV4dHFsKGwsIGRpc2FsaWduKSB8IGV4dHFoKG0sIGRpc2FsaWduKSwgbSk7CisgICAgICAgICAgICBwMl9yICA9IGF2ZzIoZXh0cWwobSwgZGlzYWxpZ24pIHwgZXh0cWgociwgZGlzYWxpZ24pLCByKTsKKyAgICAgICAgICAgIHBpeDEgKz0gbGluZV9zaXplOworICAgICAgICAgICAgcGl4MiArPSBsaW5lX3NpemU7CisKKyAgICAgICAgICAgIHJlc3VsdCArPSBwZXJyKHAxX2wsIHAyX2wpCisgICAgICAgICAgICAgICAgICAgICsgcGVycihwMV9yLCBwMl9yKTsKKyAgICAgICAgfSB3aGlsZSAoLS1oKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZG8geworICAgICAgICAgICAgdWludDY0X3QgZGlzYWxpZ24xID0gZGlzYWxpZ24gKyAxOworICAgICAgICAgICAgdWludDY0X3QgcDFfbCwgcDFfciwgcDJfbCwgcDJfcjsKKyAgICAgICAgICAgIHVpbnQ2NF90IGwsIG0sIHI7CisKKyAgICAgICAgICAgIHAxX2wgID0gbGRxKHBpeDEpOworICAgICAgICAgICAgcDFfciAgPSBsZHEocGl4MSArIDgpOworICAgICAgICAgICAgbCAgICAgPSBsZHFfdShwaXgyKTsKKyAgICAgICAgICAgIG0gICAgID0gbGRxX3UocGl4MiArIDgpOworICAgICAgICAgICAgciAgICAgPSBsZHFfdShwaXgyICsgMTYpOworICAgICAgICAgICAgcDJfbCAgPSBhdmcyKGV4dHFsKGwsIGRpc2FsaWduKSB8IGV4dHFoKG0sIGRpc2FsaWduKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHRxbChsLCBkaXNhbGlnbjEpIHwgZXh0cWgobSwgZGlzYWxpZ24xKSk7CisgICAgICAgICAgICBwMl9yICA9IGF2ZzIoZXh0cWwobSwgZGlzYWxpZ24pIHwgZXh0cWgociwgZGlzYWxpZ24pLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHFsKG0sIGRpc2FsaWduMSkgfCBleHRxaChyLCBkaXNhbGlnbjEpKTsKKyAgICAgICAgICAgIHBpeDEgKz0gbGluZV9zaXplOworICAgICAgICAgICAgcGl4MiArPSBsaW5lX3NpemU7CisKKyAgICAgICAgICAgIHJlc3VsdCArPSBwZXJyKHAxX2wsIHAyX2wpCisgICAgICAgICAgICAgICAgICAgICsgcGVycihwMV9yLCBwMl9yKTsKKyAgICAgICAgfSB3aGlsZSAoLS1oKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcGl4X2FiczE2eDE2X3kyX212aSh2b2lkICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLCBpbnQgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIGlmICgoc2l6ZV90KSBwaXgyICYgMHg3KSB7CisgICAgICAgIHVpbnQ2NF90IHQsIHAyX2wsIHAyX3I7CisgICAgICAgIHQgICAgID0gbGRxX3UocGl4MiArIDgpOworICAgICAgICBwMl9sICA9IGV4dHFsKGxkcV91KHBpeDIpLCBwaXgyKSB8IGV4dHFoKHQsIHBpeDIpOworICAgICAgICBwMl9yICA9IGV4dHFsKHQsIHBpeDIpIHwgZXh0cWgobGRxX3UocGl4MiArIDE2KSwgcGl4Mik7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgdWludDY0X3QgcDFfbCwgcDFfciwgbnAyX2wsIG5wMl9yOworICAgICAgICAgICAgdWludDY0X3QgdDsKKworICAgICAgICAgICAgcDFfbCAgPSBsZHEocGl4MSk7CisgICAgICAgICAgICBwMV9yICA9IGxkcShwaXgxICsgOCk7CisgICAgICAgICAgICBwaXgyICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgICAgIHQgICAgID0gbGRxX3UocGl4MiArIDgpOworICAgICAgICAgICAgbnAyX2wgPSBleHRxbChsZHFfdShwaXgyKSwgcGl4MikgfCBleHRxaCh0LCBwaXgyKTsKKyAgICAgICAgICAgIG5wMl9yID0gZXh0cWwodCwgcGl4MikgfCBleHRxaChsZHFfdShwaXgyICsgMTYpLCBwaXgyKTsKKworICAgICAgICAgICAgcmVzdWx0ICs9IHBlcnIocDFfbCwgYXZnMihwMl9sLCBucDJfbCkpCisgICAgICAgICAgICAgICAgICAgICsgcGVycihwMV9yLCBhdmcyKHAyX3IsIG5wMl9yKSk7CisKKyAgICAgICAgICAgIHBpeDEgKz0gbGluZV9zaXplOworICAgICAgICAgICAgcDJfbCAgPSBucDJfbDsKKyAgICAgICAgICAgIHAyX3IgID0gbnAyX3I7CisKKyAgICAgICAgfSB3aGlsZSAoLS1oKTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50NjRfdCBwMl9sLCBwMl9yOworICAgICAgICBwMl9sID0gbGRxKHBpeDIpOworICAgICAgICBwMl9yID0gbGRxKHBpeDIgKyA4KTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgdWludDY0X3QgcDFfbCwgcDFfciwgbnAyX2wsIG5wMl9yOworCisgICAgICAgICAgICBwMV9sID0gbGRxKHBpeDEpOworICAgICAgICAgICAgcDFfciA9IGxkcShwaXgxICsgOCk7CisgICAgICAgICAgICBwaXgyICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgICAgIG5wMl9sID0gbGRxKHBpeDIpOworICAgICAgICAgICAgbnAyX3IgPSBsZHEocGl4MiArIDgpOworCisgICAgICAgICAgICByZXN1bHQgKz0gcGVycihwMV9sLCBhdmcyKHAyX2wsIG5wMl9sKSkKKyAgICAgICAgICAgICAgICAgICAgKyBwZXJyKHAxX3IsIGF2ZzIocDJfciwgbnAyX3IpKTsKKworICAgICAgICAgICAgcGl4MSArPSBsaW5lX3NpemU7CisgICAgICAgICAgICBwMl9sICA9IG5wMl9sOworICAgICAgICAgICAgcDJfciAgPSBucDJfcjsKKyAgICAgICAgfSB3aGlsZSAoLS1oKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwaXhfYWJzMTZ4MTZfeHkyX212aSh2b2lkICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLCBpbnQgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIHVpbnQ2NF90IHAxX2wsIHAxX3I7CisgICAgdWludDY0X3QgcDJfbCwgcDJfciwgcDJfeDsKKworICAgIHAxX2wgPSBsZHEocGl4MSk7CisgICAgcDFfciA9IGxkcShwaXgxICsgOCk7CisKKyAgICBpZiAoKHNpemVfdCkgcGl4MiAmIDB4NykgeyAvKiBjb3VsZCBiZSBvcHRpbWl6ZWQgYSBsb3QgKi8KKyAgICAgICAgcDJfbCA9IHVsZHEocGl4Mik7CisgICAgICAgIHAyX3IgPSB1bGRxKHBpeDIgKyA4KTsKKyAgICAgICAgcDJfeCA9ICh1aW50NjRfdCkgcGl4MlsxNl0gPDwgNTY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcDJfbCA9IGxkcShwaXgyKTsKKyAgICAgICAgcDJfciA9IGxkcShwaXgyICsgOCk7CisgICAgICAgIHAyX3ggPSBsZHEocGl4MiArIDE2KSA8PCA1NjsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIHVpbnQ2NF90IG5wMV9sLCBucDFfcjsKKyAgICAgICAgdWludDY0X3QgbnAyX2wsIG5wMl9yLCBucDJfeDsKKworICAgICAgICBwaXgxICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgcGl4MiArPSBsaW5lX3NpemU7CisKKyAgICAgICAgbnAxX2wgPSBsZHEocGl4MSk7CisgICAgICAgIG5wMV9yID0gbGRxKHBpeDEgKyA4KTsKKworICAgICAgICBpZiAoKHNpemVfdCkgcGl4MiAmIDB4NykgeyAvKiBjb3VsZCBiZSBvcHRpbWl6ZWQgYSBsb3QgKi8KKyAgICAgICAgICAgIG5wMl9sID0gdWxkcShwaXgyKTsKKyAgICAgICAgICAgIG5wMl9yID0gdWxkcShwaXgyICsgOCk7CisgICAgICAgICAgICBucDJfeCA9ICh1aW50NjRfdCkgcGl4MlsxNl0gPDwgNTY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBucDJfbCA9IGxkcShwaXgyKTsKKyAgICAgICAgICAgIG5wMl9yID0gbGRxKHBpeDIgKyA4KTsKKyAgICAgICAgICAgIG5wMl94ID0gbGRxKHBpeDIgKyAxNikgPDwgNTY7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgKz0gcGVycihwMV9sLAorICAgICAgICAgICAgICAgICAgICAgICBhdmc0KCBwMl9sLCAoIHAyX2wgPj4gOCkgfCAoKHVpbnQ2NF90KSAgcDJfciA8PCA1NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnAyX2wsIChucDJfbCA+PiA4KSB8ICgodWludDY0X3QpIG5wMl9yIDw8IDU2KSkpCisgICAgICAgICAgICAgICAgKyBwZXJyKHAxX3IsCisgICAgICAgICAgICAgICAgICAgICAgIGF2ZzQoIHAyX3IsICggcDJfciA+PiA4KSB8ICgodWludDY0X3QpICBwMl94KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBucDJfciwgKG5wMl9yID4+IDgpIHwgKCh1aW50NjRfdCkgbnAyX3gpKSk7CisKKyAgICAgICAgcDFfbCA9IG5wMV9sOworICAgICAgICBwMV9yID0gbnAxX3I7CisgICAgICAgIHAyX2wgPSBucDJfbDsKKyAgICAgICAgcDJfciA9IG5wMl9yOworICAgICAgICBwMl94ID0gbnAyX3g7CisgICAgfSB3aGlsZSAoLS1oKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9tZV9jbXBfaW5pdF9hbHBoYShNRUNtcENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICAvKiBhbWFzayBjbGVhcnMgYWxsIGJpdHMgdGhhdCBjb3JyZXNwb25kIHRvIHByZXNlbnQgZmVhdHVyZXMuICAqLworICAgIGlmIChhbWFzayhBTUFTS19NVkkpID09IDApIHsKKyAgICAgICAgYy0+c2FkWzBdICAgICAgICAgICA9IHBpeF9hYnMxNngxNl9tdmlfYXNtOworICAgICAgICBjLT5zYWRbMV0gICAgICAgICAgID0gcGl4X2Ficzh4OF9tdmk7CisgICAgICAgIGMtPnBpeF9hYnNbMF1bMF0gICAgPSBwaXhfYWJzMTZ4MTZfbXZpX2FzbTsKKyAgICAgICAgYy0+cGl4X2Fic1sxXVswXSAgICA9IHBpeF9hYnM4eDhfbXZpOworICAgICAgICBjLT5waXhfYWJzWzBdWzFdICAgID0gcGl4X2FiczE2eDE2X3gyX212aTsKKyAgICAgICAgYy0+cGl4X2Fic1swXVsyXSAgICA9IHBpeF9hYnMxNngxNl95Ml9tdmk7CisgICAgICAgIGMtPnBpeF9hYnNbMF1bM10gICAgPSBwaXhfYWJzMTZ4MTZfeHkyX212aTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9tZV9jbXBfbXZpX2FzbS5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvbWVfY21wX212aV9hc20uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzk5MDg1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvbWVfY21wX212aV9hc20uUwpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIEFscGhhIG9wdGltaXplZCBEU1AgdXRpbHMKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWxrIEh1ZWZmbmVyIDxmYWxrQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJyZWdkZWYuaCIKKworLyogU29tZSBuaWNlciByZWdpc3RlciBuYW1lcy4gICovCisjZGVmaW5lIHRhIHQxMAorI2RlZmluZSB0YiB0MTEKKyNkZWZpbmUgdGMgdDEyCisjZGVmaW5lIHRkIEFUCisvKiBEYW5nZXI6IHRoZXNlIG92ZXJsYXAgd2l0aCB0aGUgYXJndW1lbnQgbGlzdCBhbmQgdGhlIHJldHVybiB2YWx1ZSAqLworI2RlZmluZSB0ZSBhNQorI2RlZmluZSB0ZiBhNAorI2RlZmluZSB0ZyBhMworI2RlZmluZSB0aCB2MAorCisgICAgICAgIC5zZXQgbm9hdAorICAgICAgICAuc2V0IG5vcmVvcmRlcgorICAgICAgICAuYXJjaCBwY2E1NgorICAgICAgICAudGV4dAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGludCBwaXhfYWJzMTZ4MTZfbXZpX2FzbSh1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLCBpbnQgbGluZV9zaXplKQorICoKKyAqIFRoaXMgY29kZSBpcyB3cml0dGVuIHdpdGggYSBwY2E1NiBpbiBtaW5kLiBGb3IgZXY2LCBvbmUgc2hvdWxkCisgKiByZWFsbHkgdGFrZSB0aGUgaW5jcmVhc2VkIGxhdGVuY3kgb2YgMyBjeWNsZXMgZm9yIE1WSSBpbnN0cnVjdGlvbnMKKyAqIGludG8gYWNjb3VudC4KKyAqCisgKiBJdCBpcyBpbXBvcnRhbnQgdG8ga2VlcCB0aGUgbG9hZGluZyBhbmQgZmlyc3QgdXNlIG9mIGEgcmVnaXN0ZXIgYXMKKyAqIGZhciBhcGFydCBhcyBwb3NzaWJsZSwgYmVjYXVzZSBpZiBhIHJlZ2lzdGVyIGlzIGFjY2Vzc2VkIGJlZm9yZSBpdAorICogaGFzIGJlZW4gZmV0Y2hlZCBmcm9tIG1lbW9yeSwgdGhlIENQVSB3aWxsIHN0YWxsLgorICovCisgICAgICAgIC5hbGlnbiA0CisgICAgICAgIC5nbG9ibCBwaXhfYWJzMTZ4MTZfbXZpX2FzbQorICAgICAgICAuZW50IHBpeF9hYnMxNngxNl9tdmlfYXNtCitwaXhfYWJzMTZ4MTZfbXZpX2FzbToKKyAgICAgICAgLmZyYW1lIHNwLCAwLCByYSwgMAorICAgICAgICAucHJvbG9ndWUgMAorCisgICAgICAgIGFuZCAgICAgYTIsIDcsIHQwCisgICAgICAgIGNsciAgICAgdjAKKyAgICAgICAgYmVxICAgICB0MCwgJGFsaWduZWQKKyAgICAgICAgLmFsaWduIDQKKyR1bmFsaWduZWQ6CisgICAgICAgIC8qIFJlZ2lzdGVyczoKKyAgICAgICAgICAgbGluZSAwOgorICAgICAgICAgICB0MDogIGxlZnRfdSAtPiBsZWZ0IGxvIC0+IGxlZnQKKyAgICAgICAgICAgdDE6ICBtaWQKKyAgICAgICAgICAgdDI6ICByaWdodF91IC0+IHJpZ2h0IGhpIC0+IHJpZ2h0CisgICAgICAgICAgIHQzOiAgcmVmIGxlZnQKKyAgICAgICAgICAgdDQ6ICByZWYgcmlnaHQKKyAgICAgICAgICAgbGluZSAxOgorICAgICAgICAgICB0NTogIGxlZnRfdSAtPiBsZWZ0IGxvIC0+IGxlZnQKKyAgICAgICAgICAgdDY6ICBtaWQKKyAgICAgICAgICAgdDc6ICByaWdodF91IC0+IHJpZ2h0IGhpIC0+IHJpZ2h0CisgICAgICAgICAgIHQ4OiAgcmVmIGxlZnQKKyAgICAgICAgICAgdDk6ICByZWYgcmlnaHQKKyAgICAgICAgICAgdGVtcDoKKyAgICAgICAgICAgdGE6ICBsZWZ0IGhpCisgICAgICAgICAgIHRiOiAgcmlnaHQgbG8KKyAgICAgICAgICAgdGM6ICBlcnJvciBsZWZ0CisgICAgICAgICAgIHRkOiAgZXJyb3IgcmlnaHQgICovCisKKyAgICAgICAgLyogbG9hZCBsaW5lIDAgKi8KKyAgICAgICAgbGRxX3UgICB0MCwgMChhMikgICAgICAgIyBsZWZ0X3UKKyAgICAgICAgbGRxX3UgICB0MSwgOChhMikgICAgICAgIyBtaWQKKyAgICAgICAgbGRxX3UgICB0MiwgMTYoYTIpICAgICAgIyByaWdodF91CisgICAgICAgIGxkcSAgICAgdDMsIDAoYTEpICAgICAgICMgcmVmIGxlZnQKKyAgICAgICAgbGRxICAgICB0NCwgOChhMSkgICAgICAgIyByZWYgcmlnaHQKKyAgICAgICAgYWRkcSAgICBhMSwgYTMsIGExICAgICAgIyBwaXgxCisgICAgICAgIGFkZHEgICAgYTIsIGEzLCBhMiAgICAgICMgcGl4MgorICAgICAgICAvKiBsb2FkIGxpbmUgMSAqLworICAgICAgICBsZHFfdSAgIHQ1LCAwKGEyKSAgICAgICAjIGxlZnRfdQorICAgICAgICBsZHFfdSAgIHQ2LCA4KGEyKSAgICAgICAjIG1pZAorICAgICAgICBsZHFfdSAgIHQ3LCAxNihhMikgICAgICAjIHJpZ2h0X3UKKyAgICAgICAgbGRxICAgICB0OCwgMChhMSkgICAgICAgIyByZWYgbGVmdAorICAgICAgICBsZHEgICAgIHQ5LCA4KGExKSAgICAgICAjIHJlZiByaWdodAorICAgICAgICBhZGRxICAgIGExLCBhMywgYTEgICAgICAjIHBpeDEKKyAgICAgICAgYWRkcSAgICBhMiwgYTMsIGEyICAgICAgIyBwaXgyCisgICAgICAgIC8qIGNhbGMgbGluZSAwICovCisgICAgICAgIGV4dHFsICAgdDAsIGEyLCB0MCAgICAgICMgbGVmdCBsbworICAgICAgICBleHRxaCAgIHQxLCBhMiwgdGEgICAgICAjIGxlZnQgaGkKKyAgICAgICAgZXh0cWwgICB0MSwgYTIsIHRiICAgICAgIyByaWdodCBsbworICAgICAgICBvciAgICAgIHQwLCB0YSwgdDAgICAgICAjIGxlZnQKKyAgICAgICAgZXh0cWggICB0MiwgYTIsIHQyICAgICAgIyByaWdodCBoaQorICAgICAgICBwZXJyICAgIHQzLCB0MCwgdGMgICAgICAjIGVycm9yIGxlZnQKKyAgICAgICAgb3IgICAgICB0MiwgdGIsIHQyICAgICAgIyByaWdodAorICAgICAgICBwZXJyICAgIHQ0LCB0MiwgdGQgICAgICAjIGVycm9yIHJpZ2h0CisgICAgICAgIGFkZHEgICAgdjAsIHRjLCB2MCAgICAgICMgYWRkIGVycm9yIGxlZnQKKyAgICAgICAgYWRkcSAgICB2MCwgdGQsIHYwICAgICAgIyBhZGQgZXJyb3IgbGVmdAorICAgICAgICAvKiBjYWxjIGxpbmUgMSAqLworICAgICAgICBleHRxbCAgIHQ1LCBhMiwgdDUgICAgICAjIGxlZnQgbG8KKyAgICAgICAgZXh0cWggICB0NiwgYTIsIHRhICAgICAgIyBsZWZ0IGhpCisgICAgICAgIGV4dHFsICAgdDYsIGEyLCB0YiAgICAgICMgcmlnaHQgbG8KKyAgICAgICAgb3IgICAgICB0NSwgdGEsIHQ1ICAgICAgIyBsZWZ0CisgICAgICAgIGV4dHFoICAgdDcsIGEyLCB0NyAgICAgICMgcmlnaHQgaGkKKyAgICAgICAgcGVyciAgICB0OCwgdDUsIHRjICAgICAgIyBlcnJvciBsZWZ0CisgICAgICAgIG9yICAgICAgdDcsIHRiLCB0NyAgICAgICMgcmlnaHQKKyAgICAgICAgcGVyciAgICB0OSwgdDcsIHRkICAgICAgIyBlcnJvciByaWdodAorICAgICAgICBhZGRxICAgIHYwLCB0YywgdjAgICAgICAjIGFkZCBlcnJvciBsZWZ0CisgICAgICAgIGFkZHEgICAgdjAsIHRkLCB2MCAgICAgICMgYWRkIGVycm9yIGxlZnQKKyAgICAgICAgLyogbG9vcCAqLworICAgICAgICBzdWJxICAgIGE0LCAgMiwgYTQgICAgICAjIGggLT0gMgorICAgICAgICBibmUgICAgIGE0LCAkdW5hbGlnbmVkCisgICAgICAgIHJldAorCisgICAgICAgIC5hbGlnbiA0CiskYWxpZ25lZDoKKyAgICAgICAgLyogbG9hZCBsaW5lIDAgKi8KKyAgICAgICAgbGRxICAgICB0MCwgMChhMikgICAgICAgIyBsZWZ0CisgICAgICAgIGxkcSAgICAgdDEsIDgoYTIpICAgICAgICMgcmlnaHQKKyAgICAgICAgYWRkcSAgICBhMiwgYTMsIGEyICAgICAgIyBwaXgyCisgICAgICAgIGxkcSAgICAgdDIsIDAoYTEpICAgICAgICMgcmVmIGxlZnQKKyAgICAgICAgbGRxICAgICB0MywgOChhMSkgICAgICAgIyByZWYgcmlnaHQKKyAgICAgICAgYWRkcSAgICBhMSwgYTMsIGExICAgICAgIyBwaXgxCisgICAgICAgIC8qIGxvYWQgbGluZSAxICovCisgICAgICAgIGxkcSAgICAgdDQsIDAoYTIpICAgICAgICMgbGVmdAorICAgICAgICBsZHEgICAgIHQ1LCA4KGEyKSAgICAgICAjIHJpZ2h0CisgICAgICAgIGFkZHEgICAgYTIsIGEzLCBhMiAgICAgICMgcGl4MgorICAgICAgICBsZHEgICAgIHQ2LCAwKGExKSAgICAgICAjIHJlZiBsZWZ0CisgICAgICAgIGxkcSAgICAgdDcsIDgoYTEpICAgICAgICMgcmVmIHJpZ2h0CisgICAgICAgIGFkZHEgICAgYTEsIGEzLCBhMSAgICAgICMgcGl4MQorICAgICAgICAvKiBsb2FkIGxpbmUgMiAqLworICAgICAgICBsZHEgICAgIHQ4LCAwKGEyKSAgICAgICAjIGxlZnQKKyAgICAgICAgbGRxICAgICB0OSwgOChhMikgICAgICAgIyByaWdodAorICAgICAgICBhZGRxICAgIGEyLCBhMywgYTIgICAgICAjIHBpeDIKKyAgICAgICAgbGRxICAgICB0YSwgMChhMSkgICAgICAgIyByZWYgbGVmdAorICAgICAgICBsZHEgICAgIHRiLCA4KGExKSAgICAgICAjIHJlZiByaWdodAorICAgICAgICBhZGRxICAgIGExLCBhMywgYTEgICAgICAjIHBpeDEKKyAgICAgICAgLyogbG9hZCBsaW5lIDMgKi8KKyAgICAgICAgbGRxICAgICB0YywgMChhMikgICAgICAgIyBsZWZ0CisgICAgICAgIGxkcSAgICAgdGQsIDgoYTIpICAgICAgICMgcmlnaHQKKyAgICAgICAgYWRkcSAgICBhMiwgYTMsIGEyICAgICAgIyBwaXgyCisgICAgICAgIGxkcSAgICAgdGUsIDAoYTEpICAgICAgICMgcmVmIGxlZnQKKyAgICAgICAgbGRxICAgICBhMCwgOChhMSkgICAgICAgIyByZWYgcmlnaHQKKyAgICAgICAgLyogY2FsYyBsaW5lIDAgKi8KKyAgICAgICAgcGVyciAgICB0MCwgdDIsIHQwICAgICAgIyBlcnJvciBsZWZ0CisgICAgICAgIGFkZHEgICAgYTEsIGEzLCBhMSAgICAgICMgcGl4MQorICAgICAgICBwZXJyICAgIHQxLCB0MywgdDEgICAgICAjIGVycm9yIHJpZ2h0CisgICAgICAgIGFkZHEgICAgdjAsIHQwLCB2MCAgICAgICMgYWRkIGVycm9yIGxlZnQKKyAgICAgICAgLyogY2FsYyBsaW5lIDEgKi8KKyAgICAgICAgcGVyciAgICB0NCwgdDYsIHQwICAgICAgIyBlcnJvciBsZWZ0CisgICAgICAgIGFkZHEgICAgdjAsIHQxLCB2MCAgICAgICMgYWRkIGVycm9yIHJpZ2h0CisgICAgICAgIHBlcnIgICAgdDUsIHQ3LCB0MSAgICAgICMgZXJyb3IgcmlnaHQKKyAgICAgICAgYWRkcSAgICB2MCwgdDAsIHYwICAgICAgIyBhZGQgZXJyb3IgbGVmdAorICAgICAgICAvKiBjYWxjIGxpbmUgMiAqLworICAgICAgICBwZXJyICAgIHQ4LCB0YSwgdDAgICAgICAjIGVycm9yIGxlZnQKKyAgICAgICAgYWRkcSAgICB2MCwgdDEsIHYwICAgICAgIyBhZGQgZXJyb3IgcmlnaHQKKyAgICAgICAgcGVyciAgICB0OSwgdGIsIHQxICAgICAgIyBlcnJvciByaWdodAorICAgICAgICBhZGRxICAgIHYwLCB0MCwgdjAgICAgICAjIGFkZCBlcnJvciBsZWZ0CisgICAgICAgIC8qIGNhbGMgbGluZSAzICovCisgICAgICAgIHBlcnIgICAgdGMsIHRlLCB0MCAgICAgICMgZXJyb3IgbGVmdAorICAgICAgICBhZGRxICAgIHYwLCB0MSwgdjAgICAgICAjIGFkZCBlcnJvciByaWdodAorICAgICAgICBwZXJyICAgIHRkLCBhMCwgdDEgICAgICAjIGVycm9yIHJpZ2h0CisgICAgICAgIGFkZHEgICAgdjAsIHQwLCB2MCAgICAgICMgYWRkIGVycm9yIGxlZnQKKyAgICAgICAgYWRkcSAgICB2MCwgdDEsIHYwICAgICAgIyBhZGQgZXJyb3IgcmlnaHQKKyAgICAgICAgLyogbG9vcCAqLworICAgICAgICBzdWJxICAgIGE0LCAgNCwgYTQgICAgICAjIGggLT0gNAorICAgICAgICBibmUgICAgIGE0LCAkYWxpZ25lZAorICAgICAgICByZXQKKyAgICAgICAgLmVuZCBwaXhfYWJzMTZ4MTZfbXZpX2FzbQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvbXBlZ3ZpZGVvX2FscGhhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9tcGVndmlkZW9fYWxwaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZmZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvbXBlZ3ZpZGVvX2FscGhhLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBBbHBoYSBvcHRpbWl6ZWQgRFNQIHV0aWxzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFsayBIdWVmZm5lciA8ZmFsa0BkZWJpYW4ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWd2aWRlby5oIgorI2luY2x1ZGUgImFzbS5oIgorCitzdGF0aWMgdm9pZCBkY3RfdW5xdWFudGl6ZV9oMjYzX2F4cChpbnQxNl90ICpibG9jaywgaW50IG5fY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgcXNjYWxlLCB1aW50NjRfdCBxYWRkKQoreworICAgIHVpbnQ2NF90IHFtdWwgPSBxc2NhbGUgPDwgMTsKKyAgICB1aW50NjRfdCBjb3JyZWN0aW9uID0gV09SRF9WRUMocW11bCAqIDI1NSA+PiA4KTsKKyAgICBpbnQgaTsKKworICAgIHFhZGQgPSBXT1JEX1ZFQyhxYWRkKTsKKworICAgIGZvcihpID0gMDsgaSA8PSBuX2NvZWZmczsgYmxvY2sgKz0gNCwgaSArPSA0KSB7CisgICAgICAgIHVpbnQ2NF90IGxldmVscywgbmVnbWFzaywgemVyb3MsIGFkZCwgc3ViOworCisgICAgICAgIGxldmVscyA9IGxkcShibG9jayk7CisgICAgICAgIGlmIChsZXZlbHMgPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisjaWZkZWYgX19hbHBoYV9tYXhfXworICAgICAgICAvKiBJIGRvbid0IHRoaW5rIHRoZSBzcGVlZCBkaWZmZXJlbmNlIGp1c3RpZmllcyBydW50aW1lCisgICAgICAgICAgIGRldGVjdGlvbi4gICovCisgICAgICAgIG5lZ21hc2sgPSBtYXhzdzQobGV2ZWxzLCAtMSk7IC8qIG5lZ2F0aXZlIC0+IGZmZmYgKC0xKSAqLworICAgICAgICBuZWdtYXNrID0gbWluc3c0KG5lZ21hc2ssIDApOyAvKiBwb3NpdGl2ZSAtPiAwMDAwICgwKSAqLworI2Vsc2UKKyAgICAgICAgbmVnbWFzayA9IGNtcGJnZShXT1JEX1ZFQygweDdmZmYpLCBsZXZlbHMpOworICAgICAgICBuZWdtYXNrICY9IChuZWdtYXNrID4+IDEpIHwgKDEgPDwgNyk7CisgICAgICAgIG5lZ21hc2sgPSB6YXAoLTEsIG5lZ21hc2spOworI2VuZGlmCisKKyAgICAgICAgemVyb3MgPSBjbXBiZ2UoMCwgbGV2ZWxzKTsKKyAgICAgICAgemVyb3MgJj0gemVyb3MgPj4gMTsKKyAgICAgICAgLyogemVyb3MgfD0gemVyb3MgPDwgMSBpcyBub3QgbmVlZGVkIHNpbmNlIHFhZGQgPD0gMjU1LCBzbworICAgICAgICAgICB6YXBwaW5nIHRoZSBsb3dlciBieXRlIHN1ZmZpY2VzLiAgKi8KKworICAgICAgICBsZXZlbHMgKj0gcW11bDsKKyAgICAgICAgbGV2ZWxzIC09IGNvcnJlY3Rpb24gJiAobmVnbWFzayA8PCAxNik7CisKKyAgICAgICAgYWRkID0gcWFkZCAmIH5uZWdtYXNrOworICAgICAgICBzdWIgPSBxYWRkICYgIG5lZ21hc2s7CisgICAgICAgIC8qIFNldCBxYWRkIHRvIDAgZm9yIGxldmVscyA9PSAwLiAgKi8KKyAgICAgICAgYWRkID0gemFwKGFkZCwgemVyb3MpOworICAgICAgICBsZXZlbHMgKz0gYWRkOworICAgICAgICBsZXZlbHMgLT0gc3ViOworCisgICAgICAgIHN0cShsZXZlbHMsIGJsb2NrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjdF91bnF1YW50aXplX2gyNjNfaW50cmFfYXhwKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgcXNjYWxlKQoreworICAgIGludCBuX2NvZWZmczsKKyAgICB1aW50NjRfdCBxYWRkOworICAgIGludDE2X3QgYmxvY2swID0gYmxvY2tbMF07CisKKyAgICBpZiAoIXMtPmgyNjNfYWljKSB7CisgICAgICAgIGlmIChuIDwgNCkKKyAgICAgICAgICAgIGJsb2NrMCAqPSBzLT55X2RjX3NjYWxlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBibG9jazAgKj0gcy0+Y19kY19zY2FsZTsKKyAgICAgICAgcWFkZCA9IChxc2NhbGUgLSAxKSB8IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcWFkZCA9IDA7CisgICAgfQorCisgICAgaWYocy0+YWNfcHJlZCkKKyAgICAgICAgbl9jb2VmZnMgPSA2MzsKKyAgICBlbHNlCisgICAgICAgIG5fY29lZmZzID0gcy0+aW50ZXJfc2NhbnRhYmxlLnJhc3Rlcl9lbmRbcy0+YmxvY2tfbGFzdF9pbmRleFtuXV07CisKKyAgICBkY3RfdW5xdWFudGl6ZV9oMjYzX2F4cChibG9jaywgbl9jb2VmZnMsIHFzY2FsZSwgcWFkZCk7CisKKyAgICBibG9ja1swXSA9IGJsb2NrMDsKK30KKworc3RhdGljIHZvaWQgZGN0X3VucXVhbnRpemVfaDI2M19pbnRlcl9heHAoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCBxc2NhbGUpCit7CisgICAgaW50IG5fY29lZmZzID0gcy0+aW50ZXJfc2NhbnRhYmxlLnJhc3Rlcl9lbmRbcy0+YmxvY2tfbGFzdF9pbmRleFtuXV07CisgICAgZGN0X3VucXVhbnRpemVfaDI2M19heHAoYmxvY2ssIG5fY29lZmZzLCBxc2NhbGUsIChxc2NhbGUgLSAxKSB8IDEpOworfQorCithdl9jb2xkIHZvaWQgZmZfbXB2X2NvbW1vbl9pbml0X2F4cChNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBzLT5kY3RfdW5xdWFudGl6ZV9oMjYzX2ludHJhID0gZGN0X3VucXVhbnRpemVfaDI2M19pbnRyYV9heHA7CisgICAgcy0+ZGN0X3VucXVhbnRpemVfaDI2M19pbnRlciA9IGRjdF91bnF1YW50aXplX2gyNjNfaW50ZXJfYXhwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvcGl4YmxvY2tkc3BfYWxwaGEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL3BpeGJsb2NrZHNwX2FscGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY2Yjc2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FscGhhL3BpeGJsb2NrZHNwX2FscGhhLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIFNJTUQtb3B0aW1pemVkIHBpeGVsIG9wZXJhdGlvbnMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9waXhibG9ja2RzcC5oIgorI2luY2x1ZGUgImFzbS5oIgorCitzdGF0aWMgdm9pZCBnZXRfcGl4ZWxzX212aShpbnQxNl90ICpyZXN0cmljdCBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3RyaWN0IHBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSkKK3sKKyAgICBpbnQgaCA9IDg7CisKKyAgICBkbyB7CisgICAgICAgIHVpbnQ2NF90IHA7CisKKyAgICAgICAgcCA9IGxkcShwaXhlbHMpOworICAgICAgICBzdHEodW5wa2J3KHApLCAgICAgICBibG9jayk7CisgICAgICAgIHN0cSh1bnBrYncocCA+PiAzMiksIGJsb2NrICsgNCk7CisKKyAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgYmxvY2sgKz0gODsKKyAgICB9IHdoaWxlICgtLWgpOworfQorCitzdGF0aWMgdm9pZCBkaWZmX3BpeGVsc19tdmkoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnMxLCBjb25zdCB1aW50OF90ICpzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKSB7CisgICAgaW50IGggPSA4OworICAgIHVpbnQ2NF90IG1hc2sgPSAweDQwNDA7CisKKyAgICBtYXNrIHw9IG1hc2sgPDwgMTY7CisgICAgbWFzayB8PSBtYXNrIDw8IDMyOworICAgIGRvIHsKKyAgICAgICAgdWludDY0X3QgeCwgeSwgYywgZCwgYTsKKyAgICAgICAgdWludDY0X3Qgc2lnbnM7CisKKyAgICAgICAgeCA9IGxkcShzMSk7CisgICAgICAgIHkgPSBsZHEoczIpOworICAgICAgICBjID0gY21wYmdlKHgsIHkpOworICAgICAgICBkID0geCAtIHk7CisgICAgICAgIGEgPSB6YXAobWFzaywgYyk7ICAgICAgIC8qIFdlIHVzZSAweDQwNDA0MDQwNDA0MDQwNDAgaGVyZS4uLiAgKi8KKyAgICAgICAgZCArPSA0ICogYTsgICAgICAgICAgICAgLyogLi4uc28gd2UgY2FuIHVzZSBzNGFkZHEgaGVyZS4gICAgICAqLworICAgICAgICBzaWducyA9IHphcCgtMSwgYyk7CisKKyAgICAgICAgc3RxKHVucGtidyhkKSAgICAgICB8ICh1bnBrYncoc2lnbnMpICAgICAgIDw8IDgpLCBibG9jayk7CisgICAgICAgIHN0cSh1bnBrYncoZCA+PiAzMikgfCAodW5wa2J3KHNpZ25zID4+IDMyKSA8PCA4KSwgYmxvY2sgKyA0KTsKKworICAgICAgICBzMSArPSBzdHJpZGU7CisgICAgICAgIHMyICs9IHN0cmlkZTsKKyAgICAgICAgYmxvY2sgKz0gODsKKyAgICB9IHdoaWxlICgtLWgpOworfQorCithdl9jb2xkIHZvaWQgZmZfcGl4YmxvY2tkc3BfaW5pdF9hbHBoYShQaXhibG9ja0RTUENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKQoreworICAgIGlmIChhbWFzayhBTUFTS19NVkkpID09IDApIHsKKyAgICAgICAgaWYgKCFoaWdoX2JpdF9kZXB0aCkKKyAgICAgICAgICAgIGMtPmdldF9waXhlbHMgPSBnZXRfcGl4ZWxzX212aTsKKyAgICAgICAgYy0+ZGlmZl9waXhlbHMgPSBkaWZmX3BpeGVsc19tdmk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvcmVnZGVmLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9yZWdkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDU1NzdhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvcmVnZGVmLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIEFscGhhIG9wdGltaXplZCBEU1AgdXRpbHMKKyAqIGNvcHlyaWdodCAoYykgMjAwMiBGYWxrIEh1ZWZmbmVyIDxmYWxrQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qIFNvbWUgQlNEcyBkb24ndCBzZWVtIHRvIGhhdmUgcmVnZGVmLmguLi4gc2lnaCAgKi8KKyNpZm5kZWYgQVZDT0RFQ19BTFBIQV9SRUdERUZfSAorI2RlZmluZSBBVkNPREVDX0FMUEhBX1JFR0RFRl9ICisKKyNkZWZpbmUgdjAgICAgICAkMCAgICAgIC8qIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSAqLworCisjZGVmaW5lIHQwICAgICAgJDEgICAgICAvKiB0ZW1wb3JhcnkgcmVnaXN0ZXJzIChjYWxsZXItc2F2ZWQpICovCisjZGVmaW5lIHQxICAgICAgJDIKKyNkZWZpbmUgdDIgICAgICAkMworI2RlZmluZSB0MyAgICAgICQ0CisjZGVmaW5lIHQ0ICAgICAgJDUKKyNkZWZpbmUgdDUgICAgICAkNgorI2RlZmluZSB0NiAgICAgICQ3CisjZGVmaW5lIHQ3ICAgICAgJDgKKworI2RlZmluZSBzMCAgICAgICQ5ICAgICAgLyogc2F2ZWQtcmVnaXN0ZXJzIChjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzKSAqLworI2RlZmluZSBzMSAgICAgICQxMAorI2RlZmluZSBzMiAgICAgICQxMQorI2RlZmluZSBzMyAgICAgICQxMgorI2RlZmluZSBzNCAgICAgICQxMworI2RlZmluZSBzNSAgICAgICQxNAorI2RlZmluZSBzNiAgICAgICQxNQorI2RlZmluZSBmcCAgICAgIHM2ICAgICAgLyogZnJhbWUtcG9pbnRlciAoczYgaW4gZnJhbWUtbGVzcyBwcm9jZWR1cmVzKSAqLworCisjZGVmaW5lIGEwICAgICAgJDE2ICAgICAvKiBhcmd1bWVudCByZWdpc3RlcnMgKGNhbGxlci1zYXZlZCkgKi8KKyNkZWZpbmUgYTEgICAgICAkMTcKKyNkZWZpbmUgYTIgICAgICAkMTgKKyNkZWZpbmUgYTMgICAgICAkMTkKKyNkZWZpbmUgYTQgICAgICAkMjAKKyNkZWZpbmUgYTUgICAgICAkMjEKKworI2RlZmluZSB0OCAgICAgICQyMiAgICAgLyogbW9yZSB0ZW1wcyAoY2FsbGVyLXNhdmVkKSAqLworI2RlZmluZSB0OSAgICAgICQyMworI2RlZmluZSB0MTAgICAgICQyNAorI2RlZmluZSB0MTEgICAgICQyNQorI2RlZmluZSByYSAgICAgICQyNiAgICAgLyogcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgdDEyICAgICAkMjcKKworI2RlZmluZSBwdiAgICAgIHQxMiAgICAgLyogcHJvY2VkdXJlLXZhcmlhYmxlIHJlZ2lzdGVyICovCisjZGVmaW5lIEFUICAgICAgJGF0ICAgICAvKiBhc3NlbWJsZXIgdGVtcG9yYXJ5ICovCisjZGVmaW5lIGdwICAgICAgJDI5ICAgICAvKiBnbG9iYWwgcG9pbnRlciAqLworI2RlZmluZSBzcCAgICAgICQzMCAgICAgLyogc3RhY2sgcG9pbnRlciAqLworI2RlZmluZSB6ZXJvICAgICQzMSAgICAgLyogcmVhZHMgYXMgemVybywgd3JpdGVzIGFyZSBub29wcyAqLworCisvKiBTb21lIG5pY2VyIHJlZ2lzdGVyIG5hbWVzLiAgKi8KKyNkZWZpbmUgdGEgdDEwCisjZGVmaW5lIHRiIHQxMQorI2RlZmluZSB0YyB0MTIKKyNkZWZpbmUgdGQgQVQKKy8qIERhbmdlcjogdGhlc2Ugb3ZlcmxhcCB3aXRoIHRoZSBhcmd1bWVudCBsaXN0IGFuZCB0aGUgcmV0dXJuIHZhbHVlICovCisjZGVmaW5lIHRlIGE1CisjZGVmaW5lIHRmIGE0CisjZGVmaW5lIHRnIGEzCisjZGVmaW5lIHRoIHYwCisKKyNlbmRpZiAvKiBBVkNPREVDX0FMUEhBX1JFR0RFRl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbHBoYS9zaW1wbGVfaWRjdF9hbHBoYS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvc2ltcGxlX2lkY3RfYWxwaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGJlMGNlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYWxwaGEvc2ltcGxlX2lkY3RfYWxwaGEuYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIFNpbXBsZSBJRENUIChBbHBoYSBvcHRpbWl6ZWQpCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogYmFzZWQgdXBvbiBzb21lIG91dGNvbW1lbnRlZCBDIGNvZGUgZnJvbSBtcGVnMmRlYyAoaWRjdF9tbXguYworICogd3JpdHRlbiBieSBBYXJvbiBIb2x0em1hbiA8YWhvbHR6bWFAZXNzLmVuZ3IudXZpYy5jYT4pCisgKgorICogQWxwaGEgb3B0aW1pemF0aW9ucyBieSBNw6VucyBSdWxsZ8OlcmQgPG1hbnNAbWFuc3IuY29tPgorICogICAgICAgICAgICAgICAgICAgICBhbmQgRmFsayBIdWVmZm5lciA8ZmFsa0BkZWJpYW4ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiaWRjdGRzcF9hbHBoYS5oIgorI2luY2x1ZGUgImFzbS5oIgorCisvLyBjb3MoaSAqIE1fUEkgLyAxNikgKiBzcXJ0KDIpICogKDEgPDwgMTQpCisvLyBXNCBpcyBhY3R1YWxseSBleGFjdGx5IDE2Mzg0LCBidXQgdXNpbmcgMTYzODMgd29ya3MgYXJvdW5kCisvLyBhY2N1bXVsYXRpbmcgcm91bmRpbmcgZXJyb3JzIGZvciBzb21lIGVuY29kZXJzCisjZGVmaW5lIFcxIDIyNzI1CisjZGVmaW5lIFcyIDIxNDA3CisjZGVmaW5lIFczIDE5MjY2CisjZGVmaW5lIFc0IDE2MzgzCisjZGVmaW5lIFc1IDEyODczCisjZGVmaW5lIFc2ICA4ODY3CisjZGVmaW5lIFc3ICA0NTIwCisjZGVmaW5lIFJPV19TSElGVCAxMQorI2RlZmluZSBDT0xfU0hJRlQgMjAKKworLyogMDogYWxsIGVudHJpZXMgMCwgMTogb25seSBmaXJzdCBlbnRyeSBub256ZXJvLCAyOiBvdGhlcndpc2UgICovCitzdGF0aWMgaW5saW5lIGludCBpZGN0X3JvdyhpbnQxNl90ICpyb3cpCit7CisgICAgaW50IGEwLCBhMSwgYTIsIGEzLCBiMCwgYjEsIGIyLCBiMywgdDsKKyAgICB1aW50NjRfdCBsLCByLCB0MjsKKyAgICBsID0gbGRxKHJvdyk7CisgICAgciA9IGxkcShyb3cgKyA0KTsKKworICAgIGlmIChsID09IDAgJiYgciA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGEwID0gVzQgKiBzZXh0dyhsKSArICgxIDw8IChST1dfU0hJRlQgLSAxKSk7CisKKyAgICBpZiAoKChsICYgfjB4ZmZmZlVMKSB8IHIpID09IDApIHsKKyAgICAgICAgYTAgPj49IFJPV19TSElGVDsKKyAgICAgICAgdDIgPSAodWludDE2X3QpIGEwOworICAgICAgICB0MiB8PSB0MiA8PCAxNjsKKyAgICAgICAgdDIgfD0gdDIgPDwgMzI7CisKKyAgICAgICAgc3RxKHQyLCByb3cpOworICAgICAgICBzdHEodDIsIHJvdyArIDQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBhMSA9IGEwOworICAgIGEyID0gYTA7CisgICAgYTMgPSBhMDsKKworICAgIHQgPSBleHR3bChsLCA0KTsgICAgICAgICAgICAvKiByb3dbMl0gKi8KKyAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIHQgPSBzZXh0dyh0KTsKKyAgICAgICAgYTAgKz0gVzIgKiB0OworICAgICAgICBhMSArPSBXNiAqIHQ7CisgICAgICAgIGEyIC09IFc2ICogdDsKKyAgICAgICAgYTMgLT0gVzIgKiB0OworICAgIH0KKworICAgIHQgPSBleHR3bChyLCAwKTsgICAgICAgICAgICAvKiByb3dbNF0gKi8KKyAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIHQgPSBzZXh0dyh0KTsKKyAgICAgICAgYTAgKz0gVzQgKiB0OworICAgICAgICBhMSAtPSBXNCAqIHQ7CisgICAgICAgIGEyIC09IFc0ICogdDsKKyAgICAgICAgYTMgKz0gVzQgKiB0OworICAgIH0KKworICAgIHQgPSBleHR3bChyLCA0KTsgICAgICAgICAgICAvKiByb3dbNl0gKi8KKyAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIHQgPSBzZXh0dyh0KTsKKyAgICAgICAgYTAgKz0gVzYgKiB0OworICAgICAgICBhMSAtPSBXMiAqIHQ7CisgICAgICAgIGEyICs9IFcyICogdDsKKyAgICAgICAgYTMgLT0gVzYgKiB0OworICAgIH0KKworICAgIHQgPSBleHR3bChsLCAyKTsgICAgICAgICAgICAvKiByb3dbMV0gKi8KKyAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIHQgPSBzZXh0dyh0KTsKKyAgICAgICAgYjAgPSBXMSAqIHQ7CisgICAgICAgIGIxID0gVzMgKiB0OworICAgICAgICBiMiA9IFc1ICogdDsKKyAgICAgICAgYjMgPSBXNyAqIHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYjAgPSAwOworICAgICAgICBiMSA9IDA7CisgICAgICAgIGIyID0gMDsKKyAgICAgICAgYjMgPSAwOworICAgIH0KKworICAgIHQgPSBleHR3bChsLCA2KTsgICAgICAgICAgICAvKiByb3dbM10gKi8KKyAgICBpZiAodCkgeworICAgICAgICB0ID0gc2V4dHcodCk7CisgICAgICAgIGIwICs9IFczICogdDsKKyAgICAgICAgYjEgLT0gVzcgKiB0OworICAgICAgICBiMiAtPSBXMSAqIHQ7CisgICAgICAgIGIzIC09IFc1ICogdDsKKyAgICB9CisKKworICAgIHQgPSBleHR3bChyLCAyKTsgICAgICAgICAgICAvKiByb3dbNV0gKi8KKyAgICBpZiAodCkgeworICAgICAgICB0ID0gc2V4dHcodCk7CisgICAgICAgIGIwICs9IFc1ICogdDsKKyAgICAgICAgYjEgLT0gVzEgKiB0OworICAgICAgICBiMiArPSBXNyAqIHQ7CisgICAgICAgIGIzICs9IFczICogdDsKKyAgICB9CisKKyAgICB0ID0gZXh0d2wociwgNik7ICAgICAgICAgICAgLyogcm93WzddICovCisgICAgaWYgKHQpIHsKKyAgICAgICAgdCA9IHNleHR3KHQpOworICAgICAgICBiMCArPSBXNyAqIHQ7CisgICAgICAgIGIxIC09IFc1ICogdDsKKyAgICAgICAgYjIgKz0gVzMgKiB0OworICAgICAgICBiMyAtPSBXMSAqIHQ7CisgICAgfQorCisgICAgcm93WzBdID0gKGEwICsgYjApID4+IFJPV19TSElGVDsKKyAgICByb3dbMV0gPSAoYTEgKyBiMSkgPj4gUk9XX1NISUZUOworICAgIHJvd1syXSA9IChhMiArIGIyKSA+PiBST1dfU0hJRlQ7CisgICAgcm93WzNdID0gKGEzICsgYjMpID4+IFJPV19TSElGVDsKKyAgICByb3dbNF0gPSAoYTMgLSBiMykgPj4gUk9XX1NISUZUOworICAgIHJvd1s1XSA9IChhMiAtIGIyKSA+PiBST1dfU0hJRlQ7CisgICAgcm93WzZdID0gKGExIC0gYjEpID4+IFJPV19TSElGVDsKKyAgICByb3dbN10gPSAoYTAgLSBiMCkgPj4gUk9XX1NISUZUOworCisgICAgcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGN0X2NvbChpbnQxNl90ICpjb2wpCit7CisgICAgaW50IGEwLCBhMSwgYTIsIGEzLCBiMCwgYjEsIGIyLCBiMzsKKworICAgIGNvbFswXSArPSAoMSA8PCAoQ09MX1NISUZUIC0gMSkpIC8gVzQ7CisKKyAgICBhMCA9IFc0ICogY29sWzggKiAwXTsKKyAgICBhMSA9IFc0ICogY29sWzggKiAwXTsKKyAgICBhMiA9IFc0ICogY29sWzggKiAwXTsKKyAgICBhMyA9IFc0ICogY29sWzggKiAwXTsKKworICAgIGlmIChjb2xbOCAqIDJdKSB7CisgICAgICAgIGEwICs9IFcyICogY29sWzggKiAyXTsKKyAgICAgICAgYTEgKz0gVzYgKiBjb2xbOCAqIDJdOworICAgICAgICBhMiAtPSBXNiAqIGNvbFs4ICogMl07CisgICAgICAgIGEzIC09IFcyICogY29sWzggKiAyXTsKKyAgICB9CisKKyAgICBpZiAoY29sWzggKiA0XSkgeworICAgICAgICBhMCArPSBXNCAqIGNvbFs4ICogNF07CisgICAgICAgIGExIC09IFc0ICogY29sWzggKiA0XTsKKyAgICAgICAgYTIgLT0gVzQgKiBjb2xbOCAqIDRdOworICAgICAgICBhMyArPSBXNCAqIGNvbFs4ICogNF07CisgICAgfQorCisgICAgaWYgKGNvbFs4ICogNl0pIHsKKyAgICAgICAgYTAgKz0gVzYgKiBjb2xbOCAqIDZdOworICAgICAgICBhMSAtPSBXMiAqIGNvbFs4ICogNl07CisgICAgICAgIGEyICs9IFcyICogY29sWzggKiA2XTsKKyAgICAgICAgYTMgLT0gVzYgKiBjb2xbOCAqIDZdOworICAgIH0KKworICAgIGlmIChjb2xbOCAqIDFdKSB7CisgICAgICAgIGIwID0gVzEgKiBjb2xbOCAqIDFdOworICAgICAgICBiMSA9IFczICogY29sWzggKiAxXTsKKyAgICAgICAgYjIgPSBXNSAqIGNvbFs4ICogMV07CisgICAgICAgIGIzID0gVzcgKiBjb2xbOCAqIDFdOworICAgIH0gZWxzZSB7CisgICAgICAgIGIwID0gMDsKKyAgICAgICAgYjEgPSAwOworICAgICAgICBiMiA9IDA7CisgICAgICAgIGIzID0gMDsKKyAgICB9CisKKyAgICBpZiAoY29sWzggKiAzXSkgeworICAgICAgICBiMCArPSBXMyAqIGNvbFs4ICogM107CisgICAgICAgIGIxIC09IFc3ICogY29sWzggKiAzXTsKKyAgICAgICAgYjIgLT0gVzEgKiBjb2xbOCAqIDNdOworICAgICAgICBiMyAtPSBXNSAqIGNvbFs4ICogM107CisgICAgfQorCisgICAgaWYgKGNvbFs4ICogNV0pIHsKKyAgICAgICAgYjAgKz0gVzUgKiBjb2xbOCAqIDVdOworICAgICAgICBiMSAtPSBXMSAqIGNvbFs4ICogNV07CisgICAgICAgIGIyICs9IFc3ICogY29sWzggKiA1XTsKKyAgICAgICAgYjMgKz0gVzMgKiBjb2xbOCAqIDVdOworICAgIH0KKworICAgIGlmIChjb2xbOCAqIDddKSB7CisgICAgICAgIGIwICs9IFc3ICogY29sWzggKiA3XTsKKyAgICAgICAgYjEgLT0gVzUgKiBjb2xbOCAqIDddOworICAgICAgICBiMiArPSBXMyAqIGNvbFs4ICogN107CisgICAgICAgIGIzIC09IFcxICogY29sWzggKiA3XTsKKyAgICB9CisKKyAgICBjb2xbOCAqIDBdID0gKGEwICsgYjApID4+IENPTF9TSElGVDsKKyAgICBjb2xbOCAqIDddID0gKGEwIC0gYjApID4+IENPTF9TSElGVDsKKyAgICBjb2xbOCAqIDFdID0gKGExICsgYjEpID4+IENPTF9TSElGVDsKKyAgICBjb2xbOCAqIDZdID0gKGExIC0gYjEpID4+IENPTF9TSElGVDsKKyAgICBjb2xbOCAqIDJdID0gKGEyICsgYjIpID4+IENPTF9TSElGVDsKKyAgICBjb2xbOCAqIDVdID0gKGEyIC0gYjIpID4+IENPTF9TSElGVDsKKyAgICBjb2xbOCAqIDNdID0gKGEzICsgYjMpID4+IENPTF9TSElGVDsKKyAgICBjb2xbOCAqIDRdID0gKGEzIC0gYjMpID4+IENPTF9TSElGVDsKK30KKworLyogSWYgYWxsIHJvd3MgYnV0IHRoZSBmaXJzdCBvbmUgYXJlIHplcm8gYWZ0ZXIgcm93IHRyYW5zZm9ybWF0aW9uLAorICAgYWxsIHJvd3Mgd2lsbCBiZSBpZGVudGljYWwgYWZ0ZXIgY29sdW1uIHRyYW5zZm9ybWF0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGN0X2NvbDIoaW50MTZfdCAqY29sKQoreworICAgIGludCBpOworICAgIHVpbnQ2NF90IGwsIHI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICAgIGludCBhMCA9IGNvbFtpXSArICgxIDw8IChDT0xfU0hJRlQgLSAxKSkgLyBXNDsKKworICAgICAgICBhMCAqPSBXNDsKKyAgICAgICAgY29sW2ldID0gYTAgPj4gQ09MX1NISUZUOworICAgIH0KKworICAgIGwgPSBsZHEoY29sICsgMCAqIDQpOyByID0gbGRxKGNvbCArIDEgKiA0KTsKKyAgICBzdHEobCwgY29sICsgIDIgKiA0KTsgc3RxKHIsIGNvbCArICAzICogNCk7CisgICAgc3RxKGwsIGNvbCArICA0ICogNCk7IHN0cShyLCBjb2wgKyAgNSAqIDQpOworICAgIHN0cShsLCBjb2wgKyAgNiAqIDQpOyBzdHEociwgY29sICsgIDcgKiA0KTsKKyAgICBzdHEobCwgY29sICsgIDggKiA0KTsgc3RxKHIsIGNvbCArICA5ICogNCk7CisgICAgc3RxKGwsIGNvbCArIDEwICogNCk7IHN0cShyLCBjb2wgKyAxMSAqIDQpOworICAgIHN0cShsLCBjb2wgKyAxMiAqIDQpOyBzdHEociwgY29sICsgMTMgKiA0KTsKKyAgICBzdHEobCwgY29sICsgMTQgKiA0KTsgc3RxKHIsIGNvbCArIDE1ICogNCk7Cit9CisKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfYXhwKGludDE2X3QgKmJsb2NrKQoreworCisgICAgaW50IGk7CisgICAgaW50IHJvd3NaZXJvID0gMTsgICAgICAgICAgIC8qIGFsbCByb3dzIGV4Y2VwdCByb3cgMCB6ZXJvICovCisgICAgaW50IHJvd3NDb25zdGFudCA9IDE7ICAgICAgIC8qIGFsbCByb3dzIGNvbnNpc3Qgb2YgYSBjb25zdGFudCB2YWx1ZSAqLworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBpbnQgc3BhcnNlbmVzcyA9IGlkY3Rfcm93KGJsb2NrICsgOCAqIGkpOworCisgICAgICAgIGlmIChpID4gMCAmJiBzcGFyc2VuZXNzID4gMCkKKyAgICAgICAgICAgIHJvd3NaZXJvID0gMDsKKyAgICAgICAgaWYgKHNwYXJzZW5lc3MgPT0gMikKKyAgICAgICAgICAgIHJvd3NDb25zdGFudCA9IDA7CisgICAgfQorCisgICAgaWYgKHJvd3NaZXJvKSB7CisgICAgICAgIGlkY3RfY29sMihibG9jayk7CisgICAgfSBlbHNlIGlmIChyb3dzQ29uc3RhbnQpIHsKKyAgICAgICAgaWRjdF9jb2woYmxvY2spOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAyKSB7CisgICAgICAgICAgICB1aW50NjRfdCB2ID0gKHVpbnQxNl90KSBibG9ja1swXTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHcgPSAodWludDE2X3QpIGJsb2NrWzhdOworCisgICAgICAgICAgICB2IHw9IHYgPDwgMTY7CisgICAgICAgICAgICB3IHw9IHcgPDwgMTY7CisgICAgICAgICAgICB2IHw9IHYgPDwgMzI7CisgICAgICAgICAgICB3IHw9IHcgPDwgMzI7CisgICAgICAgICAgICBzdHEodiwgYmxvY2sgKyAwICogNCk7CisgICAgICAgICAgICBzdHEodiwgYmxvY2sgKyAxICogNCk7CisgICAgICAgICAgICBzdHEodywgYmxvY2sgKyAyICogNCk7CisgICAgICAgICAgICBzdHEodywgYmxvY2sgKyAzICogNCk7CisgICAgICAgICAgICBibG9jayArPSA0ICogNDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBpZGN0X2NvbChibG9jayArIGkpOworICAgIH0KK30KKwordm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfYXhwKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGZmX3NpbXBsZV9pZGN0X2F4cChibG9jayk7CisgICAgcHV0X3BpeGVsc19jbGFtcGVkX2F4cF9wKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworfQorCit2b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF9heHAodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgZmZfc2ltcGxlX2lkY3RfYXhwKGJsb2NrKTsKKyAgICBhZGRfcGl4ZWxzX2NsYW1wZWRfYXhwX3AoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbHNkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Fsc2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZWNlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hbHNkZWMuYwpAQCAtMCwwICsxLDE4MTQgQEAKKy8qCisgKiBNUEVHLTQgQUxTIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBUaGlsbyBCb3JnbWFubiA8dGhpbG8uYm9yZ21hbm4gX2F0XyBtYWlsLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNUEVHLTQgQUxTIGRlY29kZXIKKyAqIEBhdXRob3IgVGhpbG8gQm9yZ21hbm4gPHRoaWxvLmJvcmdtYW5uIF9hdF8gbWFpbC5kZT4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInVuYXJ5LmgiCisjaW5jbHVkZSAibXBlZzRhdWRpby5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJiZ21jLmgiCisjaW5jbHVkZSAiYnN3YXBkc3AuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqIFJpY2UgcGFyYW1ldGVycyBhbmQgY29ycmVzcG9uZGluZyBpbmRleCBvZmZzZXRzIGZvciBkZWNvZGluZyB0aGUKKyAqICBpbmRpY2VzIG9mIHNjYWxlZCBQQVJDT1IgdmFsdWVzLiBUaGUgdGFibGUgY2hvc2VuIGlzIHNldCBnbG9iYWxseQorICogIGJ5IHRoZSBlbmNvZGVyIGFuZCBzdG9yZWQgaW4gQUxTU3BlY2lmaWNDb25maWcuCisgKi8KK3N0YXRpYyBjb25zdCBpbnQ4X3QgcGFyY29yX3JpY2VfdGFibGVbM11bMjBdWzJdID0geworICAgIHsgey01MiwgNH0sIHstMjksIDV9LCB7LTMxLCA0fSwgeyAxOSwgNH0sIHstMTYsIDR9LAorICAgICAgeyAxMiwgM30sIHsgLTcsIDN9LCB7ICA5LCAzfSwgeyAtNSwgM30sIHsgIDYsIDN9LAorICAgICAgeyAtNCwgM30sIHsgIDMsIDN9LCB7IC0zLCAyfSwgeyAgMywgMn0sIHsgLTIsIDJ9LAorICAgICAgeyAgMywgMn0sIHsgLTEsIDJ9LCB7ICAyLCAyfSwgeyAtMSwgMn0sIHsgIDIsIDJ9IH0sCisgICAgeyB7LTU4LCAzfSwgey00MiwgNH0sIHstNDYsIDR9LCB7IDM3LCA1fSwgey0zNiwgNH0sCisgICAgICB7IDI5LCA0fSwgey0yOSwgNH0sIHsgMjUsIDR9LCB7LTIzLCA0fSwgeyAyMCwgNH0sCisgICAgICB7LTE3LCA0fSwgeyAxNiwgNH0sIHstMTIsIDR9LCB7IDEyLCAzfSwgey0xMCwgNH0sCisgICAgICB7ICA3LCAzfSwgeyAtNCwgNH0sIHsgIDMsIDN9LCB7IC0xLCAzfSwgeyAgMSwgM30gfSwKKyAgICB7IHstNTksIDN9LCB7LTQ1LCA1fSwgey01MCwgNH0sIHsgMzgsIDR9LCB7LTM5LCA0fSwKKyAgICAgIHsgMzIsIDR9LCB7LTMwLCA0fSwgeyAyNSwgM30sIHstMjMsIDN9LCB7IDIwLCAzfSwKKyAgICAgIHstMjAsIDN9LCB7IDE2LCAzfSwgey0xMywgM30sIHsgMTAsIDN9LCB7IC03LCAzfSwKKyAgICAgIHsgIDMsIDN9LCB7ICAwLCAzfSwgeyAtMSwgM30sIHsgIDIsIDN9LCB7IC0xLCAyfSB9Cit9OworCisKKy8qKiBTY2FsZWQgUEFSQ09SIHZhbHVlcyB1c2VkIGZvciB0aGUgZmlyc3QgdHdvIFBBUkNPUiBjb2VmZmljaWVudHMuCisgKiAgVG8gYmUgaW5kZXhlZCBieSB0aGUgUmljZSBjb2RlZCBpbmRpY2VzLgorICogIEdlbmVyYXRlZCBieTogcGFyY29yX3NjYWxlZF92YWx1ZXNbaV0gPSAzMiArICgoaSAqIChpKzEpKSA8PCA3KSAtICgxIDw8IDIwKQorICogIEFjdHVhbCB2YWx1ZXMgYXJlIGRpdmlkZWQgYnkgMzIgaW4gb3JkZXIgdG8gYmUgc3RvcmVkIGluIDE2IGJpdHMuCisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IHBhcmNvcl9zY2FsZWRfdmFsdWVzW10gPSB7CisgICAgLTEwNDg1NDQgLyAzMiwgLTEwNDgyODggLyAzMiwgLTEwNDc3NzYgLyAzMiwgLTEwNDcwMDggLyAzMiwKKyAgICAtMTA0NTk4NCAvIDMyLCAtMTA0NDcwNCAvIDMyLCAtMTA0MzE2OCAvIDMyLCAtMTA0MTM3NiAvIDMyLAorICAgIC0xMDM5MzI4IC8gMzIsIC0xMDM3MDI0IC8gMzIsIC0xMDM0NDY0IC8gMzIsIC0xMDMxNjQ4IC8gMzIsCisgICAgLTEwMjg1NzYgLyAzMiwgLTEwMjUyNDggLyAzMiwgLTEwMjE2NjQgLyAzMiwgLTEwMTc4MjQgLyAzMiwKKyAgICAtMTAxMzcyOCAvIDMyLCAtMTAwOTM3NiAvIDMyLCAtMTAwNDc2OCAvIDMyLCAgLTk5OTkwNCAvIDMyLAorICAgICAtOTk0Nzg0IC8gMzIsICAtOTg5NDA4IC8gMzIsICAtOTgzNzc2IC8gMzIsICAtOTc3ODg4IC8gMzIsCisgICAgIC05NzE3NDQgLyAzMiwgIC05NjUzNDQgLyAzMiwgIC05NTg2ODggLyAzMiwgIC05NTE3NzYgLyAzMiwKKyAgICAgLTk0NDYwOCAvIDMyLCAgLTkzNzE4NCAvIDMyLCAgLTkyOTUwNCAvIDMyLCAgLTkyMTU2OCAvIDMyLAorICAgICAtOTEzMzc2IC8gMzIsICAtOTA0OTI4IC8gMzIsICAtODk2MjI0IC8gMzIsICAtODg3MjY0IC8gMzIsCisgICAgIC04NzgwNDggLyAzMiwgIC04Njg1NzYgLyAzMiwgIC04NTg4NDggLyAzMiwgIC04NDg4NjQgLyAzMiwKKyAgICAgLTgzODYyNCAvIDMyLCAgLTgyODEyOCAvIDMyLCAgLTgxNzM3NiAvIDMyLCAgLTgwNjM2OCAvIDMyLAorICAgICAtNzk1MTA0IC8gMzIsICAtNzgzNTg0IC8gMzIsICAtNzcxODA4IC8gMzIsICAtNzU5Nzc2IC8gMzIsCisgICAgIC03NDc0ODggLyAzMiwgIC03MzQ5NDQgLyAzMiwgIC03MjIxNDQgLyAzMiwgIC03MDkwODggLyAzMiwKKyAgICAgLTY5NTc3NiAvIDMyLCAgLTY4MjIwOCAvIDMyLCAgLTY2ODM4NCAvIDMyLCAgLTY1NDMwNCAvIDMyLAorICAgICAtNjM5OTY4IC8gMzIsICAtNjI1Mzc2IC8gMzIsICAtNjEwNTI4IC8gMzIsICAtNTk1NDI0IC8gMzIsCisgICAgIC01ODAwNjQgLyAzMiwgIC01NjQ0NDggLyAzMiwgIC01NDg1NzYgLyAzMiwgIC01MzI0NDggLyAzMiwKKyAgICAgLTUxNjA2NCAvIDMyLCAgLTQ5OTQyNCAvIDMyLCAgLTQ4MjUyOCAvIDMyLCAgLTQ2NTM3NiAvIDMyLAorICAgICAtNDQ3OTY4IC8gMzIsICAtNDMwMzA0IC8gMzIsICAtNDEyMzg0IC8gMzIsICAtMzk0MjA4IC8gMzIsCisgICAgIC0zNzU3NzYgLyAzMiwgIC0zNTcwODggLyAzMiwgIC0zMzgxNDQgLyAzMiwgIC0zMTg5NDQgLyAzMiwKKyAgICAgLTI5OTQ4OCAvIDMyLCAgLTI3OTc3NiAvIDMyLCAgLTI1OTgwOCAvIDMyLCAgLTIzOTU4NCAvIDMyLAorICAgICAtMjE5MTA0IC8gMzIsICAtMTk4MzY4IC8gMzIsICAtMTc3Mzc2IC8gMzIsICAtMTU2MTI4IC8gMzIsCisgICAgIC0xMzQ2MjQgLyAzMiwgIC0xMTI4NjQgLyAzMiwgICAtOTA4NDggLyAzMiwgICAtNjg1NzYgLyAzMiwKKyAgICAgIC00NjA0OCAvIDMyLCAgIC0yMzI2NCAvIDMyLCAgICAgLTIyNCAvIDMyLCAgICAyMzA3MiAvIDMyLAorICAgICAgIDQ2NjI0IC8gMzIsICAgIDcwNDMyIC8gMzIsICAgIDk0NDk2IC8gMzIsICAgMTE4ODE2IC8gMzIsCisgICAgICAxNDMzOTIgLyAzMiwgICAxNjgyMjQgLyAzMiwgICAxOTMzMTIgLyAzMiwgICAyMTg2NTYgLyAzMiwKKyAgICAgIDI0NDI1NiAvIDMyLCAgIDI3MDExMiAvIDMyLCAgIDI5NjIyNCAvIDMyLCAgIDMyMjU5MiAvIDMyLAorICAgICAgMzQ5MjE2IC8gMzIsICAgMzc2MDk2IC8gMzIsICAgNDAzMjMyIC8gMzIsICAgNDMwNjI0IC8gMzIsCisgICAgICA0NTgyNzIgLyAzMiwgICA0ODYxNzYgLyAzMiwgICA1MTQzMzYgLyAzMiwgICA1NDI3NTIgLyAzMiwKKyAgICAgIDU3MTQyNCAvIDMyLCAgIDYwMDM1MiAvIDMyLCAgIDYyOTUzNiAvIDMyLCAgIDY1ODk3NiAvIDMyLAorICAgICAgNjg4NjcyIC8gMzIsICAgNzE4NjI0IC8gMzIsICAgNzQ4ODMyIC8gMzIsICAgNzc5Mjk2IC8gMzIsCisgICAgICA4MTAwMTYgLyAzMiwgICA4NDA5OTIgLyAzMiwgICA4NzIyMjQgLyAzMiwgICA5MDM3MTIgLyAzMiwKKyAgICAgIDkzNTQ1NiAvIDMyLCAgIDk2NzQ1NiAvIDMyLCAgIDk5OTcxMiAvIDMyLCAgMTAzMjIyNCAvIDMyCit9OworCisKKy8qKiBHYWluIHZhbHVlcyBvZiBwKDApIGZvciBsb25nLXRlcm0gcHJlZGljdGlvbi4KKyAqICBUbyBiZSBpbmRleGVkIGJ5IHRoZSBSaWNlIGNvZGVkIGluZGljZXMuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGx0cF9nYWluX3ZhbHVlcyBbNF1bNF0gPSB7CisgICAgeyAwLCAgOCwgMTYsICAyNH0sCisgICAgezMyLCA0MCwgNDgsICA1Nn0sCisgICAgezY0LCA3MCwgNzYsICA4Mn0sCisgICAgezg4LCA5MiwgOTYsIDEwMH0KK307CisKKworLyoqIEludGVyLWNoYW5uZWwgd2VpZ2h0aW5nIGZhY3RvcnMgZm9yIG11bHRpLWNoYW5uZWwgY29ycmVsYXRpb24uCisgKiAgVG8gYmUgaW5kZXhlZCBieSB0aGUgUmljZSBjb2RlZCBpbmRpY2VzLgorICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBtY2Nfd2VpZ2h0aW5nc1tdID0geworICAgIDIwNCwgIDE5MiwgIDE3OSwgIDE2NiwgIDE1MywgIDE0MCwgIDEyOCwgIDExNSwKKyAgICAxMDIsICAgODksICAgNzYsICAgNjQsICAgNTEsICAgMzgsICAgMjUsICAgMTIsCisgICAgICAwLCAgLTEyLCAgLTI1LCAgLTM4LCAgLTUxLCAgLTY0LCAgLTc2LCAgLTg5LAorICAgLTEwMiwgLTExNSwgLTEyOCwgLTE0MCwgLTE1MywgLTE2NiwgLTE3OSwgLTE5MgorfTsKKworCisvKiogVGFpbCBjb2RlcyB1c2VkIGluIGFyaXRobWV0aWMgY29kaW5nIHVzaW5nIGJsb2NrIEdpbGJlcnQtTW9vcmUgY29kZXMuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHRhaWxfY29kZVsxNl1bNl0gPSB7CisgICAgeyA3NCwgNDQsIDI1LCAxMywgIDcsIDN9LAorICAgIHsgNjgsIDQyLCAyNCwgMTMsICA3LCAzfSwKKyAgICB7IDU4LCAzOSwgMjMsIDEzLCAgNywgM30sCisgICAgezEyNiwgNzAsIDM3LCAxOSwgMTAsIDV9LAorICAgIHsxMzIsIDcwLCAzNywgMjAsIDEwLCA1fSwKKyAgICB7MTI0LCA3MCwgMzgsIDIwLCAxMCwgNX0sCisgICAgezEyMCwgNjksIDM3LCAyMCwgMTEsIDV9LAorICAgIHsxMTYsIDY3LCAzNywgMjAsIDExLCA1fSwKKyAgICB7MTA4LCA2NiwgMzYsIDIwLCAxMCwgNX0sCisgICAgezEwMiwgNjIsIDM2LCAyMCwgMTAsIDV9LAorICAgIHsgODgsIDU4LCAzNCwgMTksIDEwLCA1fSwKKyAgICB7MTYyLCA4OSwgNDksIDI1LCAxMywgN30sCisgICAgezE1NiwgODcsIDQ5LCAyNiwgMTQsIDd9LAorICAgIHsxNTAsIDg2LCA0NywgMjYsIDE0LCA3fSwKKyAgICB7MTQyLCA4NCwgNDcsIDI2LCAxNCwgN30sCisgICAgezEzMSwgNzksIDQ2LCAyNiwgMTQsIDd9Cit9OworCisKK2VudW0gUkFfRmxhZyB7CisgICAgUkFfRkxBR19OT05FLAorICAgIFJBX0ZMQUdfRlJBTUVTLAorICAgIFJBX0ZMQUdfSEVBREVSCit9OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBzYW1wbGVzOyAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHNhbXBsZXMsIDB4RkZGRkZGRkYgaWYgdW5rbm93bgorICAgIGludCByZXNvbHV0aW9uOyAgICAgICAgICAgLy8vPCAwMDAgPSA4LWJpdDsgMDAxID0gMTYtYml0OyAwMTAgPSAyNC1iaXQ7IDAxMSA9IDMyLWJpdAorICAgIGludCBmbG9hdGluZzsgICAgICAgICAgICAgLy8vPCAxID0gSUVFRSAzMi1iaXQgZmxvYXRpbmctcG9pbnQsIDAgPSBpbnRlZ2VyCisgICAgaW50IG1zYl9maXJzdDsgICAgICAgICAgICAvLy88IDEgPSBvcmlnaW5hbCBDUkMgY2FsY3VsYXRlZCBvbiBiaWctZW5kaWFuIHN5c3RlbSwgMCA9IGxpdHRsZS1lbmRpYW4KKyAgICBpbnQgZnJhbWVfbGVuZ3RoOyAgICAgICAgIC8vLzwgZnJhbWUgbGVuZ3RoIGZvciBlYWNoIGZyYW1lIChsYXN0IGZyYW1lIG1heSBkaWZmZXIpCisgICAgaW50IHJhX2Rpc3RhbmNlOyAgICAgICAgICAvLy88IGRpc3RhbmNlIGJldHdlZW4gUkEgZnJhbWVzIChpbiBmcmFtZXMsIDAuLi4yNTUpCisgICAgZW51bSBSQV9GbGFnIHJhX2ZsYWc7ICAgICAvLy88IGluZGljYXRlcyB3aGVyZSB0aGUgc2l6ZSBvZiByYSB1bml0cyBpcyBzdG9yZWQKKyAgICBpbnQgYWRhcHRfb3JkZXI7ICAgICAgICAgIC8vLzwgYWRhcHRpdmUgb3JkZXI6IDEgPSBvbiwgMCA9IG9mZgorICAgIGludCBjb2VmX3RhYmxlOyAgICAgICAgICAgLy8vPCB0YWJsZSBpbmRleCBvZiBSaWNlIGNvZGUgcGFyYW1ldGVycworICAgIGludCBsb25nX3Rlcm1fcHJlZGljdGlvbjsgLy8vPCBsb25nIHRlcm0gcHJlZGljdGlvbiAoTFRQKTogMSA9IG9uLCAwID0gb2ZmCisgICAgaW50IG1heF9vcmRlcjsgICAgICAgICAgICAvLy88IG1heGltdW0gcHJlZGljdGlvbiBvcmRlciAoMC4uMTAyMykKKyAgICBpbnQgYmxvY2tfc3dpdGNoaW5nOyAgICAgIC8vLzwgbnVtYmVyIG9mIGJsb2NrIHN3aXRjaGluZyBsZXZlbHMKKyAgICBpbnQgYmdtYzsgICAgICAgICAgICAgICAgIC8vLzwgIkJsb2NrIEdpbGJlcnQtTW9vcmUgQ29kZSI6IDEgPSBvbiwgMCA9IG9mZiAoUmljZSBjb2Rpbmcgb25seSkKKyAgICBpbnQgc2JfcGFydDsgICAgICAgICAgICAgIC8vLzwgc3ViLWJsb2NrIHBhcnRpdGlvbgorICAgIGludCBqb2ludF9zdGVyZW87ICAgICAgICAgLy8vPCBqb2ludCBzdGVyZW86IDEgPSBvbiwgMCA9IG9mZgorICAgIGludCBtY19jb2Rpbmc7ICAgICAgICAgICAgLy8vPCBleHRlbmRlZCBpbnRlci1jaGFubmVsIGNvZGluZyAobXVsdGkgY2hhbm5lbCBjb2RpbmcpOiAxID0gb24sIDAgPSBvZmYKKyAgICBpbnQgY2hhbl9jb25maWc7ICAgICAgICAgIC8vLzwgaW5kaWNhdGVzIHRoYXQgYSBjaGFuX2NvbmZpZ19pbmZvIGZpZWxkIGlzIHByZXNlbnQKKyAgICBpbnQgY2hhbl9zb3J0OyAgICAgICAgICAgIC8vLzwgY2hhbm5lbCByZWFycmFuZ2VtZW50OiAxID0gb24sIDAgPSBvZmYKKyAgICBpbnQgcmxzbG1zOyAgICAgICAgICAgICAgIC8vLzwgdXNlICJSZWN1cnNpdmUgTGVhc3QgU3F1YXJlLUxlYXN0IE1lYW4gU3F1YXJlIiBwcmVkaWN0b3I6IDEgPSBvbiwgMCA9IG9mZgorICAgIGludCBjaGFuX2NvbmZpZ19pbmZvOyAgICAgLy8vPCBtYXBwaW5nIG9mIGNoYW5uZWxzIHRvIGxvdWRzcGVha2VyIGxvY2F0aW9ucy4gVW51c2VkIHVudGlsIHNldHRpbmcgY2hhbm5lbCBjb25maWd1cmF0aW9uIGlzIGltcGxlbWVudGVkLgorICAgIGludCAqY2hhbl9wb3M7ICAgICAgICAgICAgLy8vPCBvcmlnaW5hbCBjaGFubmVsIHBvc2l0aW9ucworICAgIGludCBjcmNfZW5hYmxlZDsgICAgICAgICAgLy8vPCBlbmFibGUgQ3ljbGljIFJlZHVuZGFuY3kgQ2hlY2tzdW0KK30gQUxTU3BlY2lmaWNDb25maWc7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBzdG9wX2ZsYWc7CisgICAgaW50IG1hc3Rlcl9jaGFubmVsOworICAgIGludCB0aW1lX2RpZmZfZmxhZzsKKyAgICBpbnQgdGltZV9kaWZmX3NpZ247CisgICAgaW50IHRpbWVfZGlmZl9pbmRleDsKKyAgICBpbnQgd2VpZ2h0aW5nWzZdOworfSBBTFNDaGFubmVsRGF0YTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFMU1NwZWNpZmljQ29uZmlnIHNjb25mOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgQnN3YXBEU1BDb250ZXh0IGJkc3A7CisgICAgY29uc3QgQVZDUkMgKmNyY190YWJsZTsKKyAgICB1aW50MzJfdCBjcmNfb3JnOyAgICAgICAgICAgICAgIC8vLzwgQ1JDIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBkYXRhCisgICAgdWludDMyX3QgY3JjOyAgICAgICAgICAgICAgICAgICAvLy88IENSQyB2YWx1ZSBjYWxjdWxhdGVkIGZyb20gZGVjb2RlZCBkYXRhCisgICAgdW5zaWduZWQgaW50IGN1cl9mcmFtZV9sZW5ndGg7ICAvLy88IGxlbmd0aCBvZiB0aGUgY3VycmVudCBmcmFtZSB0byBkZWNvZGUKKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVfaWQ7ICAgICAgICAgIC8vLzwgdGhlIGZyYW1lIElEIC8gbnVtYmVyIG9mIHRoZSBjdXJyZW50IGZyYW1lCisgICAgdW5zaWduZWQgaW50IGpzX3N3aXRjaDsgICAgICAgICAvLy88IGlmIHRydWUsIGpvaW50LXN0ZXJlbyBkZWNvZGluZyBpcyBlbmZvcmNlZAorICAgIHVuc2lnbmVkIGludCBjc19zd2l0Y2g7ICAgICAgICAgLy8vPCBpZiB0cnVlLCBjaGFubmVsIHJlYXJyYW5nZW1lbnQgaXMgZG9uZQorICAgIHVuc2lnbmVkIGludCBudW1fYmxvY2tzOyAgICAgICAgLy8vPCBudW1iZXIgb2YgYmxvY2tzIHVzZWQgaW4gdGhlIGN1cnJlbnQgZnJhbWUKKyAgICB1bnNpZ25lZCBpbnQgc19tYXg7ICAgICAgICAgICAgIC8vLzwgbWF4aW11bSBSaWNlIHBhcmFtZXRlciBhbGxvd2VkIGluIGVudHJvcHkgY29kaW5nCisgICAgdWludDhfdCAqYmdtY19sdXQ7ICAgICAgICAgICAgICAvLy88IHBvaW50ZXIgYXQgbG9va3VwIHRhYmxlcyB1c2VkIGZvciBCR01DCisgICAgaW50ICpiZ21jX2x1dF9zdGF0dXM7ICAgICAgICAgICAvLy88IHBvaW50ZXIgYXQgbG9va3VwIHRhYmxlIHN0YXR1cyBmbGFncyB1c2VkIGZvciBCR01DCisgICAgaW50IGx0cF9sYWdfbGVuZ3RoOyAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBiaXRzIHVzZWQgZm9yIGx0cCBsYWcgdmFsdWUKKyAgICBpbnQgKmNvbnN0X2Jsb2NrOyAgICAgICAgICAgICAgIC8vLzwgY29udGFpbnMgY29uc3RfYmxvY2sgZmxhZ3MgZm9yIGFsbCBjaGFubmVscworICAgIHVuc2lnbmVkIGludCAqc2hpZnRfbHNiczsgICAgICAgLy8vPCBjb250YWlucyBzaGlmdF9sc2JzIGZsYWdzIGZvciBhbGwgY2hhbm5lbHMKKyAgICB1bnNpZ25lZCBpbnQgKm9wdF9vcmRlcjsgICAgICAgIC8vLzwgY29udGFpbnMgb3B0X29yZGVyIGZsYWdzIGZvciBhbGwgY2hhbm5lbHMKKyAgICBpbnQgKnN0b3JlX3ByZXZfc2FtcGxlczsgICAgICAgIC8vLzwgY29udGFpbnMgc3RvcmVfcHJldl9zYW1wbGVzIGZsYWdzIGZvciBhbGwgY2hhbm5lbHMKKyAgICBpbnQgKnVzZV9sdHA7ICAgICAgICAgICAgICAgICAgIC8vLzwgY29udGFpbnMgdXNlX2x0cCBmbGFncyBmb3IgYWxsIGNoYW5uZWxzCisgICAgaW50ICpsdHBfbGFnOyAgICAgICAgICAgICAgICAgICAvLy88IGNvbnRhaW5zIGx0cCBsYWcgdmFsdWVzIGZvciBhbGwgY2hhbm5lbHMKKyAgICBpbnQgKipsdHBfZ2FpbjsgICAgICAgICAgICAgICAgIC8vLzwgZ2FpbiB2YWx1ZXMgZm9yIGx0cCA1LXRhcCBmaWx0ZXIgZm9yIGEgY2hhbm5lbAorICAgIGludCAqbHRwX2dhaW5fYnVmZmVyOyAgICAgICAgICAgLy8vPCBjb250YWlucyBhbGwgZ2FpbiB2YWx1ZXMgZm9yIGx0cCA1LXRhcCBmaWx0ZXIKKyAgICBpbnQzMl90ICoqcXVhbnRfY29mOyAgICAgICAgICAgIC8vLzwgcXVhbnRpemVkIHBhcmNvciBjb2VmZmljaWVudHMgZm9yIGEgY2hhbm5lbAorICAgIGludDMyX3QgKnF1YW50X2NvZl9idWZmZXI7ICAgICAgLy8vPCBjb250YWlucyBhbGwgcXVhbnRpemVkIHBhcmNvciBjb2VmZmljaWVudHMKKyAgICBpbnQzMl90ICoqbHBjX2NvZjsgICAgICAgICAgICAgIC8vLzwgY29lZmZpY2llbnRzIG9mIHRoZSBkaXJlY3QgZm9ybSBwcmVkaWN0aW9uIGZpbHRlciBmb3IgYSBjaGFubmVsCisgICAgaW50MzJfdCAqbHBjX2NvZl9idWZmZXI7ICAgICAgICAvLy88IGNvbnRhaW5zIGFsbCBjb2VmZmljaWVudHMgb2YgdGhlIGRpcmVjdCBmb3JtIHByZWRpY3Rpb24gZmlsdGVyCisgICAgaW50MzJfdCAqbHBjX2NvZl9yZXZlcnNlZF9idWZmZXI7IC8vLzwgdGVtcG9yYXJ5IGJ1ZmZlciB0byBzZXQgdXAgYSByZXZlcnNlZCB2ZXJzaW8gb2YgbHBjX2NvZl9idWZmZXIKKyAgICBBTFNDaGFubmVsRGF0YSAqKmNoYW5fZGF0YTsgICAgIC8vLzwgY2hhbm5lbCBkYXRhIGZvciBtdWx0aS1jaGFubmVsIGNvcnJlbGF0aW9uCisgICAgQUxTQ2hhbm5lbERhdGEgKmNoYW5fZGF0YV9idWZmZXI7IC8vLzwgY29udGFpbnMgY2hhbm5lbCBkYXRhIGZvciBhbGwgY2hhbm5lbHMKKyAgICBpbnQgKnJldmVydGVkX2NoYW5uZWxzOyAgICAgICAgIC8vLzwgc3RvcmVzIGEgZmxhZyBmb3IgZWFjaCByZXZlcnRlZCBjaGFubmVsCisgICAgaW50MzJfdCAqcHJldl9yYXdfc2FtcGxlczsgICAgICAvLy88IGNvbnRhaW5zIHVuc2hpZnRlZCByYXcgc2FtcGxlcyBmcm9tIHRoZSBwcmV2aW91cyBibG9jaworICAgIGludDMyX3QgKipyYXdfc2FtcGxlczsgICAgICAgICAgLy8vPCBkZWNvZGVkIHJhdyBzYW1wbGVzIGZvciBlYWNoIGNoYW5uZWwKKyAgICBpbnQzMl90ICpyYXdfYnVmZmVyOyAgICAgICAgICAgIC8vLzwgY29udGFpbnMgYWxsIGRlY29kZWQgcmF3IHNhbXBsZXMgaW5jbHVkaW5nIGNhcnJ5b3ZlciBzYW1wbGVzCisgICAgdWludDhfdCAqY3JjX2J1ZmZlcjsgICAgICAgICAgICAvLy88IGJ1ZmZlciBvZiBieXRlIG9yZGVyIGNvcnJlY3RlZCBzYW1wbGVzIHVzZWQgZm9yIENSQyBjaGVjaworfSBBTFNEZWNDb250ZXh0OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgYmxvY2tfbGVuZ3RoOyAgICAgIC8vLzwgbnVtYmVyIG9mIHNhbXBsZXMgd2l0aGluIHRoZSBibG9jaworICAgIHVuc2lnbmVkIGludCByYV9ibG9jazsgICAgICAgICAgLy8vPCBpZiB0cnVlLCB0aGlzIGlzIGEgcmFuZG9tIGFjY2VzcyBibG9jaworICAgIGludCAgICAgICAgICAqY29uc3RfYmxvY2s7ICAgICAgLy8vPCBpZiB0cnVlLCB0aGlzIGlzIGEgY29uc3RhbnQgdmFsdWUgYmxvY2sKKyAgICBpbnQgICAgICAgICAganNfYmxvY2tzOyAgICAgICAgIC8vLzwgdHJ1ZSBpZiB0aGlzIGJsb2NrIGNvbnRhaW5zIGEgZGlmZmVyZW5jZSBzaWduYWwKKyAgICB1bnNpZ25lZCBpbnQgKnNoaWZ0X2xzYnM7ICAgICAgIC8vLzwgc2hpZnQgb2YgdmFsdWVzIGZvciB0aGlzIGJsb2NrCisgICAgdW5zaWduZWQgaW50ICpvcHRfb3JkZXI7ICAgICAgICAvLy88IHByZWRpY3Rpb24gb3JkZXIgb2YgdGhpcyBibG9jaworICAgIGludCAgICAgICAgICAqc3RvcmVfcHJldl9zYW1wbGVzOy8vLzwgaWYgdHJ1ZSwgY2FycnlvdmVyIHNhbXBsZXMgaGF2ZSB0byBiZSBzdG9yZWQKKyAgICBpbnQgICAgICAgICAgKnVzZV9sdHA7ICAgICAgICAgIC8vLzwgaWYgdHJ1ZSwgbG9uZy10ZXJtIHByZWRpY3Rpb24gaXMgdXNlZAorICAgIGludCAgICAgICAgICAqbHRwX2xhZzsgICAgICAgICAgLy8vPCBsYWcgdmFsdWUgZm9yIGxvbmctdGVybSBwcmVkaWN0aW9uCisgICAgaW50ICAgICAgICAgICpsdHBfZ2FpbjsgICAgICAgICAvLy88IGdhaW4gdmFsdWVzIGZvciBsdHAgNS10YXAgZmlsdGVyCisgICAgaW50MzJfdCAgICAgICpxdWFudF9jb2Y7ICAgICAgICAvLy88IHF1YW50aXplZCBwYXJjb3IgY29lZmZpY2llbnRzCisgICAgaW50MzJfdCAgICAgICpscGNfY29mOyAgICAgICAgICAvLy88IGNvZWZmaWNpZW50cyBvZiB0aGUgZGlyZWN0IGZvcm0gcHJlZGljdGlvbgorICAgIGludDMyX3QgICAgICAqcmF3X3NhbXBsZXM7ICAgICAgLy8vPCBkZWNvZGVkIHJhdyBzYW1wbGVzIC8gcmVzaWR1YWxzIGZvciB0aGlzIGJsb2NrCisgICAgaW50MzJfdCAgICAgICpwcmV2X3Jhd19zYW1wbGVzOyAvLy88IGNvbnRhaW5zIHVuc2hpZnRlZCByYXcgc2FtcGxlcyBmcm9tIHRoZSBwcmV2aW91cyBibG9jaworICAgIGludDMyX3QgICAgICAqcmF3X290aGVyOyAgICAgICAgLy8vPCBkZWNvZGVkIHJhdyBzYW1wbGVzIG9mIHRoZSBvdGhlciBjaGFubmVsIG9mIGEgY2hhbm5lbCBwYWlyCit9IEFMU0Jsb2NrRGF0YTsKKworCitzdGF0aWMgYXZfY29sZCB2b2lkIGRwcmludF9zcGVjaWZpY19jb25maWcoQUxTRGVjQ29udGV4dCAqY3R4KQoreworI2lmZGVmIERFQlVHCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ICAgID0gY3R4LT5hdmN0eDsKKyAgICBBTFNTcGVjaWZpY0NvbmZpZyAqc2NvbmYgPSAmY3R4LT5zY29uZjsKKworICAgIGF2X2Rsb2coYXZjdHgsICJyZXNvbHV0aW9uID0gJWlcbiIsICAgICAgICAgICBzY29uZi0+cmVzb2x1dGlvbik7CisgICAgYXZfZGxvZyhhdmN0eCwgImZsb2F0aW5nID0gJWlcbiIsICAgICAgICAgICAgIHNjb25mLT5mbG9hdGluZyk7CisgICAgYXZfZGxvZyhhdmN0eCwgImZyYW1lX2xlbmd0aCA9ICVpXG4iLCAgICAgICAgIHNjb25mLT5mcmFtZV9sZW5ndGgpOworICAgIGF2X2Rsb2coYXZjdHgsICJyYV9kaXN0YW5jZSA9ICVpXG4iLCAgICAgICAgICBzY29uZi0+cmFfZGlzdGFuY2UpOworICAgIGF2X2Rsb2coYXZjdHgsICJyYV9mbGFnID0gJWlcbiIsICAgICAgICAgICAgICBzY29uZi0+cmFfZmxhZyk7CisgICAgYXZfZGxvZyhhdmN0eCwgImFkYXB0X29yZGVyID0gJWlcbiIsICAgICAgICAgIHNjb25mLT5hZGFwdF9vcmRlcik7CisgICAgYXZfZGxvZyhhdmN0eCwgImNvZWZfdGFibGUgPSAlaVxuIiwgICAgICAgICAgIHNjb25mLT5jb2VmX3RhYmxlKTsKKyAgICBhdl9kbG9nKGF2Y3R4LCAibG9uZ190ZXJtX3ByZWRpY3Rpb24gPSAlaVxuIiwgc2NvbmYtPmxvbmdfdGVybV9wcmVkaWN0aW9uKTsKKyAgICBhdl9kbG9nKGF2Y3R4LCAibWF4X29yZGVyID0gJWlcbiIsICAgICAgICAgICAgc2NvbmYtPm1heF9vcmRlcik7CisgICAgYXZfZGxvZyhhdmN0eCwgImJsb2NrX3N3aXRjaGluZyA9ICVpXG4iLCAgICAgIHNjb25mLT5ibG9ja19zd2l0Y2hpbmcpOworICAgIGF2X2Rsb2coYXZjdHgsICJiZ21jID0gJWlcbiIsICAgICAgICAgICAgICAgICBzY29uZi0+YmdtYyk7CisgICAgYXZfZGxvZyhhdmN0eCwgInNiX3BhcnQgPSAlaVxuIiwgICAgICAgICAgICAgIHNjb25mLT5zYl9wYXJ0KTsKKyAgICBhdl9kbG9nKGF2Y3R4LCAiam9pbnRfc3RlcmVvID0gJWlcbiIsICAgICAgICAgc2NvbmYtPmpvaW50X3N0ZXJlbyk7CisgICAgYXZfZGxvZyhhdmN0eCwgIm1jX2NvZGluZyA9ICVpXG4iLCAgICAgICAgICAgIHNjb25mLT5tY19jb2RpbmcpOworICAgIGF2X2Rsb2coYXZjdHgsICJjaGFuX2NvbmZpZyA9ICVpXG4iLCAgICAgICAgICBzY29uZi0+Y2hhbl9jb25maWcpOworICAgIGF2X2Rsb2coYXZjdHgsICJjaGFuX3NvcnQgPSAlaVxuIiwgICAgICAgICAgICBzY29uZi0+Y2hhbl9zb3J0KTsKKyAgICBhdl9kbG9nKGF2Y3R4LCAiUkxTTE1TID0gJWlcbiIsICAgICAgICAgICAgICAgc2NvbmYtPnJsc2xtcyk7CisgICAgYXZfZGxvZyhhdmN0eCwgImNoYW5fY29uZmlnX2luZm8gPSAlaVxuIiwgICAgIHNjb25mLT5jaGFuX2NvbmZpZ19pbmZvKTsKKyNlbmRpZgorfQorCisKKy8qKiBSZWFkIGFuIEFMU1NwZWNpZmljQ29uZmlnIGZyb20gYSBidWZmZXIgaW50byB0aGUgb3V0cHV0IHN0cnVjdC4KKyAqLworc3RhdGljIGF2X2NvbGQgaW50IHJlYWRfc3BlY2lmaWNfY29uZmlnKEFMU0RlY0NvbnRleHQgKmN0eCkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIHVpbnQ2NF90IGh0X3NpemU7CisgICAgaW50IGksIGNvbmZpZ19vZmZzZXQ7CisgICAgTVBFRzRBdWRpb0NvbmZpZyBtNGFjID0gezB9OworICAgIEFMU1NwZWNpZmljQ29uZmlnICpzY29uZiA9ICZjdHgtPnNjb25mOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCAgICA9IGN0eC0+YXZjdHg7CisgICAgdWludDMyX3QgYWxzX2lkLCBoZWFkZXJfc2l6ZSwgdHJhaWxlcl9zaXplOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGluaXRfZ2V0X2JpdHM4KCZnYiwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgY29uZmlnX29mZnNldCA9IGF2cHJpdl9tcGVnNGF1ZGlvX2dldF9jb25maWcoJm00YWMsIGF2Y3R4LT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplICogOCwgMSk7CisKKyAgICBpZiAoY29uZmlnX29mZnNldCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCBjb25maWdfb2Zmc2V0KTsKKworICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPCAoMzAgPDwgMykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLy8gcmVhZCB0aGUgZml4ZWQgaXRlbXMKKyAgICBhbHNfaWQgICAgICAgICAgICAgICAgICAgICAgPSBnZXRfYml0c19sb25nKCZnYiwgMzIpOworICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSAgICAgICAgICA9IG00YWMuc2FtcGxlX3JhdGU7CisgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCAzMik7IC8vIHNhbXBsZSByYXRlIGFscmVhZHkga25vd24KKyAgICBzY29uZi0+c2FtcGxlcyAgICAgICAgICAgICAgPSBnZXRfYml0c19sb25nKCZnYiwgMzIpOworICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICAgICAgICA9IG00YWMuY2hhbm5lbHM7CisgICAgc2tpcF9iaXRzKCZnYiwgMTYpOyAgICAgIC8vIG51bWJlciBvZiBjaGFubmVscyBhbHJlYWR5IGtub3duCisgICAgc2tpcF9iaXRzKCZnYiwgMyk7ICAgICAgIC8vIHNraXAgZmlsZV90eXBlCisgICAgc2NvbmYtPnJlc29sdXRpb24gICAgICAgICAgID0gZ2V0X2JpdHMoJmdiLCAzKTsKKyAgICBzY29uZi0+ZmxvYXRpbmcgICAgICAgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBzY29uZi0+bXNiX2ZpcnN0ICAgICAgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBzY29uZi0+ZnJhbWVfbGVuZ3RoICAgICAgICAgPSBnZXRfYml0cygmZ2IsIDE2KSArIDE7CisgICAgc2NvbmYtPnJhX2Rpc3RhbmNlICAgICAgICAgID0gZ2V0X2JpdHMoJmdiLCA4KTsKKyAgICBzY29uZi0+cmFfZmxhZyAgICAgICAgICAgICAgPSBnZXRfYml0cygmZ2IsIDIpOworICAgIHNjb25mLT5hZGFwdF9vcmRlciAgICAgICAgICA9IGdldF9iaXRzMSgmZ2IpOworICAgIHNjb25mLT5jb2VmX3RhYmxlICAgICAgICAgICA9IGdldF9iaXRzKCZnYiwgMik7CisgICAgc2NvbmYtPmxvbmdfdGVybV9wcmVkaWN0aW9uID0gZ2V0X2JpdHMxKCZnYik7CisgICAgc2NvbmYtPm1heF9vcmRlciAgICAgICAgICAgID0gZ2V0X2JpdHMoJmdiLCAxMCk7CisgICAgc2NvbmYtPmJsb2NrX3N3aXRjaGluZyAgICAgID0gZ2V0X2JpdHMoJmdiLCAyKTsKKyAgICBzY29uZi0+YmdtYyAgICAgICAgICAgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBzY29uZi0+c2JfcGFydCAgICAgICAgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBzY29uZi0+am9pbnRfc3RlcmVvICAgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBzY29uZi0+bWNfY29kaW5nICAgICAgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBzY29uZi0+Y2hhbl9jb25maWcgICAgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBzY29uZi0+Y2hhbl9zb3J0ICAgICAgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBzY29uZi0+Y3JjX2VuYWJsZWQgICAgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBzY29uZi0+cmxzbG1zICAgICAgICAgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBza2lwX2JpdHMoJmdiLCA1KTsgICAgICAgLy8gc2tpcCA1IHJlc2VydmVkIGJpdHMKKyAgICBza2lwX2JpdHMxKCZnYik7ICAgICAgICAgLy8gc2tpcCBhdXhfZGF0YV9lbmFibGVkCisKKworICAgIC8vIGNoZWNrIGZvciBBTFNTcGVjaWZpY0NvbmZpZyBzdHJ1Y3QKKyAgICBpZiAoYWxzX2lkICE9IE1LQkVUQUcoJ0EnLCdMJywnUycsJ1wwJykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgY3R4LT5jdXJfZnJhbWVfbGVuZ3RoID0gc2NvbmYtPmZyYW1lX2xlbmd0aDsKKworICAgIC8vIHJlYWQgY2hhbm5lbCBjb25maWcKKyAgICBpZiAoc2NvbmYtPmNoYW5fY29uZmlnKQorICAgICAgICBzY29uZi0+Y2hhbl9jb25maWdfaW5mbyA9IGdldF9iaXRzKCZnYiwgMTYpOworICAgIC8vIFRPRE86IHVzZSB0aGlzIHRvIHNldCBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQKKworCisgICAgLy8gcmVhZCBjaGFubmVsIHNvcnRpbmcKKyAgICBpZiAoc2NvbmYtPmNoYW5fc29ydCAmJiBhdmN0eC0+Y2hhbm5lbHMgPiAxKSB7CisgICAgICAgIGludCBjaGFuX3Bvc19iaXRzID0gYXZfY2VpbF9sb2cyKGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIGludCBiaXRzX25lZWRlZCAgPSBhdmN0eC0+Y2hhbm5lbHMgKiBjaGFuX3Bvc19iaXRzICsgNzsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmdiKSA8IGJpdHNfbmVlZGVkKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKCEoc2NvbmYtPmNoYW5fcG9zID0gYXZfbWFsbG9jKGF2Y3R4LT5jaGFubmVscyAqIHNpemVvZigqc2NvbmYtPmNoYW5fcG9zKSkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBjdHgtPmNzX3N3aXRjaCA9IDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaWR4OworCisgICAgICAgICAgICBpZHggPSBnZXRfYml0cygmZ2IsIGNoYW5fcG9zX2JpdHMpOworICAgICAgICAgICAgaWYgKGlkeCA+PSBhdmN0eC0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBjaGFubmVsIHJlb3JkZXJpbmcuXG4iKTsKKyAgICAgICAgICAgICAgICBjdHgtPmNzX3N3aXRjaCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY29uZi0+Y2hhbl9wb3NbaWR4XSA9IGk7CisgICAgICAgIH0KKworICAgICAgICBhbGlnbl9nZXRfYml0cygmZ2IpOworICAgIH0KKworCisgICAgLy8gcmVhZCBmaXhlZCBoZWFkZXIgYW5kIHRyYWlsZXIgc2l6ZXMsCisgICAgLy8gaWYgc2l6ZSA9IDB4RkZGRkZGRkYgdGhlbiB0aGVyZSBpcyBubyBkYXRhIGZpZWxkIQorICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPCA2NCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBoZWFkZXJfc2l6ZSAgPSBnZXRfYml0c19sb25nKCZnYiwgMzIpOworICAgIHRyYWlsZXJfc2l6ZSA9IGdldF9iaXRzX2xvbmcoJmdiLCAzMik7CisgICAgaWYgKGhlYWRlcl9zaXplICA9PSAweEZGRkZGRkZGKQorICAgICAgICBoZWFkZXJfc2l6ZSAgPSAwOworICAgIGlmICh0cmFpbGVyX3NpemUgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgdHJhaWxlcl9zaXplID0gMDsKKworICAgIGh0X3NpemUgPSAoKGludDY0X3QpKGhlYWRlcl9zaXplKSArIChpbnQ2NF90KSh0cmFpbGVyX3NpemUpKSA8PCAzOworCisKKyAgICAvLyBza2lwIHRoZSBoZWFkZXIgYW5kIHRyYWlsZXIgZGF0YQorICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPCBodF9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChodF9zaXplID4gSU5UMzJfTUFYKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisKKyAgICBza2lwX2JpdHNfbG9uZygmZ2IsIGh0X3NpemUpOworCisKKyAgICAvLyBpbml0aWFsaXplIENSQyBjYWxjdWxhdGlvbgorICAgIGlmIChzY29uZi0+Y3JjX2VuYWJsZWQpIHsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmdiKSA8IDMyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiAoQVZfRUZfQ1JDQ0hFQ0t8QVZfRUZfQ0FSRUZVTCkpIHsKKyAgICAgICAgICAgIGN0eC0+Y3JjX3RhYmxlID0gYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMzJfSUVFRV9MRSk7CisgICAgICAgICAgICBjdHgtPmNyYyAgICAgICA9IDB4RkZGRkZGRkY7CisgICAgICAgICAgICBjdHgtPmNyY19vcmcgICA9IH5nZXRfYml0c19sb25nKCZnYiwgMzIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZnYiwgMzIpOworICAgIH0KKworCisgICAgLy8gbm8gbmVlZCB0byByZWFkIHRoZSByZXN0IG9mIEFMU1NwZWNpZmljQ29uZmlnIChyYV91bml0X3NpemUgJiBhdXggZGF0YSkKKworICAgIGRwcmludF9zcGVjaWZpY19jb25maWcoY3R4KTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKiBDaGVjayB0aGUgQUxTU3BlY2lmaWNDb25maWcgZm9yIHVuc3VwcG9ydGVkIGZlYXR1cmVzLgorICovCitzdGF0aWMgaW50IGNoZWNrX3NwZWNpZmljX2NvbmZpZyhBTFNEZWNDb250ZXh0ICpjdHgpCit7CisgICAgQUxTU3BlY2lmaWNDb25maWcgKnNjb25mID0gJmN0eC0+c2NvbmY7CisgICAgaW50IGVycm9yID0gMDsKKworICAgIC8vIHJlcG9ydCB1bnN1cHBvcnRlZCBmZWF0dXJlIGFuZCBzZXQgZXJyb3IgdmFsdWUKKyAgICAjZGVmaW5lIE1JU1NJTkdfRVJSKGNvbmQsIHN0ciwgZXJydmFsKSAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChjb25kKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGN0eC0+YXZjdHgsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsgICAgICAgICBcCisgICAgICAgICAgICBlcnJvciA9IGVycnZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICAgIE1JU1NJTkdfRVJSKHNjb25mLT5mbG9hdGluZywgICJGbG9hdGluZyBwb2ludCBkZWNvZGluZyIsICAgICBBVkVSUk9SX1BBVENIV0VMQ09NRSk7CisgICAgTUlTU0lOR19FUlIoc2NvbmYtPnJsc2xtcywgICAgIkFkYXB0aXZlIFJMUy1MTVMgcHJlZGljdGlvbiIsIEFWRVJST1JfUEFUQ0hXRUxDT01FKTsKKworICAgIHJldHVybiBlcnJvcjsKK30KKworCisvKiogUGFyc2UgdGhlIGJzX2luZm8gZmllbGQgdG8gZXh0cmFjdCB0aGUgYmxvY2sgcGFydGl0aW9uaW5nIHVzZWQgaW4KKyAqICBibG9jayBzd2l0Y2hpbmcgbW9kZSwgcmVmZXIgdG8gSVNPL0lFQyAxNDQ5Ni0zLCBzZWN0aW9uIDExLjYuMi4KKyAqLworc3RhdGljIHZvaWQgcGFyc2VfYnNfaW5mbyhjb25zdCB1aW50MzJfdCBic19pbmZvLCB1bnNpZ25lZCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRpdiwgdW5zaWduZWQgaW50ICoqZGl2X2Jsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fYmxvY2tzKQoreworICAgIGlmIChuIDwgMzEgJiYgKChic19pbmZvIDw8IG4pICYgMHg0MDAwMDAwMCkpIHsKKyAgICAgICAgLy8gaWYgdGhlIGxldmVsIGlzIHZhbGlkIGFuZCB0aGUgaW52ZXN0aWdhdGVkIGJpdCBuIGlzIHNldAorICAgICAgICAvLyB0aGVuIHJlY3Vyc2l2ZWx5IGNoZWNrIGJvdGggY2hpbGRyZW4gYXQgYml0cyAoMm4rMSkgYW5kICgybisyKQorICAgICAgICBuICAgKj0gMjsKKyAgICAgICAgZGl2ICs9IDE7CisgICAgICAgIHBhcnNlX2JzX2luZm8oYnNfaW5mbywgbiArIDEsIGRpdiwgZGl2X2Jsb2NrcywgbnVtX2Jsb2Nrcyk7CisgICAgICAgIHBhcnNlX2JzX2luZm8oYnNfaW5mbywgbiArIDIsIGRpdiwgZGl2X2Jsb2NrcywgbnVtX2Jsb2Nrcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZWxzZSB0aGUgYml0IGlzIG5vdCBzZXQgb3IgdGhlIGxhc3QgbGV2ZWwgaGFzIGJlZW4gcmVhY2hlZAorICAgICAgICAvLyAoYml0IGltcGxpY2l0bHkgbm90IHNldCkKKyAgICAgICAgKipkaXZfYmxvY2tzID0gZGl2OworICAgICAgICAoKmRpdl9ibG9ja3MpKys7CisgICAgICAgICgqbnVtX2Jsb2NrcykrKzsKKyAgICB9Cit9CisKKworLyoqIFJlYWQgYW5kIGRlY29kZSBhIFJpY2UgY29kZXdvcmQuCisgKi8KK3N0YXRpYyBpbnQzMl90IGRlY29kZV9yaWNlKEdldEJpdENvbnRleHQgKmdiLCB1bnNpZ25lZCBpbnQgaykKK3sKKyAgICBpbnQgbWF4ID0gZ2V0X2JpdHNfbGVmdChnYikgLSBrOworICAgIGludCBxICAgPSBnZXRfdW5hcnkoZ2IsIDAsIG1heCk7CisgICAgaW50IHIgICA9IGsgPyBnZXRfYml0czEoZ2IpIDogIShxICYgMSk7CisKKyAgICBpZiAoayA+IDEpIHsKKyAgICAgICAgcSA8PD0gKGsgLSAxKTsKKyAgICAgICAgcSAgKz0gZ2V0X2JpdHNfbG9uZyhnYiwgayAtIDEpOworICAgIH0gZWxzZSBpZiAoIWspIHsKKyAgICAgICAgcSA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuIHIgPyBxIDogfnE7Cit9CisKKworLyoqIENvbnZlcnQgUEFSQ09SIGNvZWZmaWNpZW50IGsgdG8gZGlyZWN0IGZpbHRlciBjb2VmZmljaWVudC4KKyAqLworc3RhdGljIHZvaWQgcGFyY29yX3RvX2xwYyh1bnNpZ25lZCBpbnQgaywgY29uc3QgaW50MzJfdCAqcGFyLCBpbnQzMl90ICpjb2YpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwLCBqID0gayAtIDE7IGkgPCBqOyBpKyssIGotLSkgeworICAgICAgICBpbnQgdG1wMSA9ICgoTVVMNjQocGFyW2tdLCBjb2Zbal0pICsgKDEgPDwgMTkpKSA+PiAyMCk7CisgICAgICAgIGNvZltqXSAgKz0gKChNVUw2NChwYXJba10sIGNvZltpXSkgKyAoMSA8PCAxOSkpID4+IDIwKTsKKyAgICAgICAgY29mW2ldICArPSB0bXAxOworICAgIH0KKyAgICBpZiAoaSA9PSBqKQorICAgICAgICBjb2ZbaV0gKz0gKChNVUw2NChwYXJba10sIGNvZltqXSkgKyAoMSA8PCAxOSkpID4+IDIwKTsKKworICAgIGNvZltrXSA9IHBhcltrXTsKK30KKworCisvKiogUmVhZCBibG9jayBzd2l0Y2hpbmcgZmllbGQgaWYgbmVjZXNzYXJ5IGFuZCBzZXQgYWN0dWFsIGJsb2NrIHNpemVzLgorICogIEFsc28gYXNzdXJlIHRoYXQgdGhlIGJsb2NrIHNpemVzIG9mIHRoZSBsYXN0IGZyYW1lIGNvcnJlc3BvbmQgdG8gdGhlCisgKiAgYWN0dWFsIG51bWJlciBvZiBzYW1wbGVzLgorICovCitzdGF0aWMgdm9pZCBnZXRfYmxvY2tfc2l6ZXMoQUxTRGVjQ29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgKmRpdl9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmJzX2luZm8pCit7CisgICAgQUxTU3BlY2lmaWNDb25maWcgKnNjb25mICAgICA9ICZjdHgtPnNjb25mOworICAgIEdldEJpdENvbnRleHQgKmdiICAgICAgICAgICAgPSAmY3R4LT5nYjsKKyAgICB1bnNpZ25lZCBpbnQgKnB0cl9kaXZfYmxvY2tzID0gZGl2X2Jsb2NrczsKKyAgICB1bnNpZ25lZCBpbnQgYjsKKworICAgIGlmIChzY29uZi0+YmxvY2tfc3dpdGNoaW5nKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBic19pbmZvX2xlbiA9IDEgPDwgKHNjb25mLT5ibG9ja19zd2l0Y2hpbmcgKyAyKTsKKyAgICAgICAgKmJzX2luZm8gPSBnZXRfYml0c19sb25nKGdiLCBic19pbmZvX2xlbik7CisgICAgICAgICpic19pbmZvIDw8PSAoMzIgLSBic19pbmZvX2xlbik7CisgICAgfQorCisgICAgY3R4LT5udW1fYmxvY2tzID0gMDsKKyAgICBwYXJzZV9ic19pbmZvKCpic19pbmZvLCAwLCAwLCAmcHRyX2Rpdl9ibG9ja3MsICZjdHgtPm51bV9ibG9ja3MpOworCisgICAgLy8gVGhlIGxhc3QgZnJhbWUgbWF5IGhhdmUgYW4gb3ZlcmRldGVybWluZWQgYmxvY2sgc3RydWN0dXJlIGdpdmVuIGluCisgICAgLy8gdGhlIGJpdHN0cmVhbS4gSW4gdGhhdCBjYXNlIHRoZSBkZWZpbmVkIGJsb2NrIHN0cnVjdHVyZSB3b3VsZCBuZWVkCisgICAgLy8gbW9yZSBzYW1wbGVzIHRoYW4gYXZhaWxhYmxlIHRvIGJlIGNvbnNpc3RlbnQuCisgICAgLy8gVGhlIGJsb2NrIHN0cnVjdHVyZSBpcyBhY3R1YWxseSB1c2VkIGJ1dCB0aGUgYmxvY2sgc2l6ZXMgYXJlIGFkYXB0ZWQKKyAgICAvLyB0byBmaXQgdGhlIGFjdHVhbCBudW1iZXIgb2YgYXZhaWxhYmxlIHNhbXBsZXMuCisgICAgLy8gRXhhbXBsZTogNSBzYW1wbGVzLCAybmQgbGV2ZWwgYmxvY2sgc2l6ZXM6IDIgMiAyIDIuCisgICAgLy8gVGhpcyByZXN1bHRzIGluIHRoZSBhY3R1YWwgYmxvY2sgc2l6ZXM6ICAgIDIgMiAxIDAuCisgICAgLy8gVGhpcyBpcyBub3Qgc3BlY2lmaWVkIGluIDE0NDk2LTMgYnV0IGFjdHVhbGx5IGRvbmUgYnkgdGhlIHJlZmVyZW5jZQorICAgIC8vIGNvZGVjIFJNMjIgcmV2aXNpb24gMi4KKyAgICAvLyBUaGlzIGFwcGVhcnMgdG8gaGFwcGVuIGluIGNhc2Ugb2YgYW4gb2RkIG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBsYXN0CisgICAgLy8gZnJhbWUgd2hpY2ggaXMgYWN0dWFsbHkgbm90IGFsbG93ZWQgYnkgdGhlIGJsb2NrIGxlbmd0aCBzd2l0Y2hpbmcgcGFydAorICAgIC8vIG9mIDE0NDk2LTMuCisgICAgLy8gVGhlIEFMUyBjb25mb3JtYW5jZSBmaWxlcyBmZWF0dXJlIGFuIG9kZCBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgbGFzdAorICAgIC8vIGZyYW1lLgorCisgICAgZm9yIChiID0gMDsgYiA8IGN0eC0+bnVtX2Jsb2NrczsgYisrKQorICAgICAgICBkaXZfYmxvY2tzW2JdID0gY3R4LT5zY29uZi5mcmFtZV9sZW5ndGggPj4gZGl2X2Jsb2Nrc1tiXTsKKworICAgIGlmIChjdHgtPmN1cl9mcmFtZV9sZW5ndGggIT0gY3R4LT5zY29uZi5mcmFtZV9sZW5ndGgpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHJlbWFpbmluZyA9IGN0eC0+Y3VyX2ZyYW1lX2xlbmd0aDsKKworICAgICAgICBmb3IgKGIgPSAwOyBiIDwgY3R4LT5udW1fYmxvY2tzOyBiKyspIHsKKyAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gZGl2X2Jsb2Nrc1tiXSkgeworICAgICAgICAgICAgICAgIGRpdl9ibG9ja3NbYl0gPSByZW1haW5pbmc7CisgICAgICAgICAgICAgICAgY3R4LT5udW1fYmxvY2tzID0gYiArIDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBkaXZfYmxvY2tzW2JdOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qKiBSZWFkIHRoZSBibG9jayBkYXRhIGZvciBhIGNvbnN0YW50IGJsb2NrCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9jb25zdF9ibG9ja19kYXRhKEFMU0RlY0NvbnRleHQgKmN0eCwgQUxTQmxvY2tEYXRhICpiZCkKK3sKKyAgICBBTFNTcGVjaWZpY0NvbmZpZyAqc2NvbmYgPSAmY3R4LT5zY29uZjsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggICAgPSBjdHgtPmF2Y3R4OworICAgIEdldEJpdENvbnRleHQgKmdiICAgICAgICA9ICZjdHgtPmdiOworCisgICAgaWYgKGJkLT5ibG9ja19sZW5ndGggPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAqYmQtPnJhd19zYW1wbGVzID0gMDsKKyAgICAqYmQtPmNvbnN0X2Jsb2NrID0gZ2V0X2JpdHMxKGdiKTsgICAgLy8gMSA9IGNvbnN0YW50IHZhbHVlLCAwID0gemVybyBibG9jayAoc2lsZW5jZSkKKyAgICBiZC0+anNfYmxvY2tzICAgID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIC8vIHNraXAgNSByZXNlcnZlZCBiaXRzCisgICAgc2tpcF9iaXRzKGdiLCA1KTsKKworICAgIGlmICgqYmQtPmNvbnN0X2Jsb2NrKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdF92YWxfYml0cyA9IHNjb25mLT5mbG9hdGluZyA/IDI0IDogYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGU7CisgICAgICAgICpiZC0+cmF3X3NhbXBsZXMgPSBnZXRfc2JpdHNfbG9uZyhnYiwgY29uc3RfdmFsX2JpdHMpOworICAgIH0KKworICAgIC8vIGVuc3VyZSBjb25zdGFudCBibG9jayBkZWNvZGluZyBieSByZXVzaW5nIHRoaXMgZmllbGQKKyAgICAqYmQtPmNvbnN0X2Jsb2NrID0gMTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKiBEZWNvZGUgdGhlIGJsb2NrIGRhdGEgZm9yIGEgY29uc3RhbnQgYmxvY2sKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX2NvbnN0X2Jsb2NrX2RhdGEoQUxTRGVjQ29udGV4dCAqY3R4LCBBTFNCbG9ja0RhdGEgKmJkKQoreworICAgIGludCAgICAgIHNtcCA9IGJkLT5ibG9ja19sZW5ndGggLSAxOworICAgIGludDMyX3QgIHZhbCA9ICpiZC0+cmF3X3NhbXBsZXM7CisgICAgaW50MzJfdCAqZHN0ID0gYmQtPnJhd19zYW1wbGVzICsgMTsKKworICAgIC8vIHdyaXRlIHJhdyBzYW1wbGVzIGludG8gYnVmZmVyCisgICAgZm9yICg7IHNtcDsgc21wLS0pCisgICAgICAgICpkc3QrKyA9IHZhbDsKK30KKworCisvKiogUmVhZCB0aGUgYmxvY2sgZGF0YSBmb3IgYSBub24tY29uc3RhbnQgYmxvY2sKKyAqLworc3RhdGljIGludCByZWFkX3Zhcl9ibG9ja19kYXRhKEFMU0RlY0NvbnRleHQgKmN0eCwgQUxTQmxvY2tEYXRhICpiZCkKK3sKKyAgICBBTFNTcGVjaWZpY0NvbmZpZyAqc2NvbmYgPSAmY3R4LT5zY29uZjsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggICAgPSBjdHgtPmF2Y3R4OworICAgIEdldEJpdENvbnRleHQgKmdiICAgICAgICA9ICZjdHgtPmdiOworICAgIHVuc2lnbmVkIGludCBrOworICAgIHVuc2lnbmVkIGludCBzWzhdOworICAgIHVuc2lnbmVkIGludCBzeFs4XTsKKyAgICB1bnNpZ25lZCBpbnQgc3ViX2Jsb2NrcywgbG9nMl9zdWJfYmxvY2tzLCBzYl9sZW5ndGg7CisgICAgdW5zaWduZWQgaW50IHN0YXJ0ICAgICAgPSAwOworICAgIHVuc2lnbmVkIGludCBvcHRfb3JkZXI7CisgICAgaW50ICAgICAgICAgIHNiOworICAgIGludDMyX3QgICAgICAqcXVhbnRfY29mID0gYmQtPnF1YW50X2NvZjsKKyAgICBpbnQzMl90ICAgICAgKmN1cnJlbnRfcmVzOworCisKKyAgICAvLyBlbnN1cmUgdmFyaWFibGUgYmxvY2sgZGVjb2RpbmcgYnkgcmV1c2luZyB0aGlzIGZpZWxkCisgICAgKmJkLT5jb25zdF9ibG9jayA9IDA7CisKKyAgICAqYmQtPm9wdF9vcmRlciAgPSAxOworICAgIGJkLT5qc19ibG9ja3MgICA9IGdldF9iaXRzMShnYik7CisKKyAgICBvcHRfb3JkZXIgICAgICAgPSAqYmQtPm9wdF9vcmRlcjsKKworICAgIC8vIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHN1YmJsb2NrcyBmb3IgZW50cm9weSBkZWNvZGluZworICAgIGlmICghc2NvbmYtPmJnbWMgJiYgIXNjb25mLT5zYl9wYXJ0KSB7CisgICAgICAgIGxvZzJfc3ViX2Jsb2NrcyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNjb25mLT5iZ21jICYmIHNjb25mLT5zYl9wYXJ0KQorICAgICAgICAgICAgbG9nMl9zdWJfYmxvY2tzID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2cyX3N1Yl9ibG9ja3MgPSAyICogZ2V0X2JpdHMxKGdiKTsKKyAgICB9CisKKyAgICBzdWJfYmxvY2tzID0gMSA8PCBsb2cyX3N1Yl9ibG9ja3M7CisKKyAgICAvLyBkbyBub3QgY29udGludWUgaW4gY2FzZSBvZiBhIGRhbWFnZWQgc3RyZWFtIHNpbmNlCisgICAgLy8gYmxvY2tfbGVuZ3RoIG11c3QgYmUgZXZlbmx5IGRpdmlzaWJsZSBieSBzdWJfYmxvY2tzCisgICAgaWYgKGJkLT5ibG9ja19sZW5ndGggJiAoc3ViX2Jsb2NrcyAtIDEpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiQmxvY2sgbGVuZ3RoIGlzIG5vdCBldmVubHkgZGl2aXNpYmxlIGJ5IHRoZSBudW1iZXIgb2Ygc3ViYmxvY2tzLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHNiX2xlbmd0aCA9IGJkLT5ibG9ja19sZW5ndGggPj4gbG9nMl9zdWJfYmxvY2tzOworCisgICAgaWYgKHNjb25mLT5iZ21jKSB7CisgICAgICAgIHNbMF0gPSBnZXRfYml0cyhnYiwgOCArIChzY29uZi0+cmVzb2x1dGlvbiA+IDEpKTsKKyAgICAgICAgZm9yIChrID0gMTsgayA8IHN1Yl9ibG9ja3M7IGsrKykKKyAgICAgICAgICAgIHNba10gPSBzW2sgLSAxXSArIGRlY29kZV9yaWNlKGdiLCAyKTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc3ViX2Jsb2NrczsgaysrKSB7CisgICAgICAgICAgICBzeFtrXSAgID0gc1trXSAmIDB4MEY7CisgICAgICAgICAgICBzIFtrXSA+Pj0gNDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNbMF0gPSBnZXRfYml0cyhnYiwgNCArIChzY29uZi0+cmVzb2x1dGlvbiA+IDEpKTsKKyAgICAgICAgZm9yIChrID0gMTsgayA8IHN1Yl9ibG9ja3M7IGsrKykKKyAgICAgICAgICAgIHNba10gPSBzW2sgLSAxXSArIGRlY29kZV9yaWNlKGdiLCAwKTsKKyAgICB9CisgICAgZm9yIChrID0gMTsgayA8IHN1Yl9ibG9ja3M7IGsrKykKKyAgICAgICAgaWYgKHNba10gPiAzMikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJrIGludmFsaWQgZm9yIHJpY2UgY29kZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgIGlmIChnZXRfYml0czEoZ2IpKQorICAgICAgICAqYmQtPnNoaWZ0X2xzYnMgPSBnZXRfYml0cyhnYiwgNCkgKyAxOworCisgICAgKmJkLT5zdG9yZV9wcmV2X3NhbXBsZXMgPSAoYmQtPmpzX2Jsb2NrcyAmJiBiZC0+cmF3X290aGVyKSB8fCAqYmQtPnNoaWZ0X2xzYnM7CisKKworICAgIGlmICghc2NvbmYtPnJsc2xtcykgeworICAgICAgICBpZiAoc2NvbmYtPmFkYXB0X29yZGVyKSB7CisgICAgICAgICAgICBpbnQgb3B0X29yZGVyX2xlbmd0aCA9IGF2X2NlaWxfbG9nMihhdl9jbGlwKChiZC0+YmxvY2tfbGVuZ3RoID4+IDMpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIHNjb25mLT5tYXhfb3JkZXIgKyAxKSk7CisgICAgICAgICAgICAqYmQtPm9wdF9vcmRlciAgICAgICA9IGdldF9iaXRzKGdiLCBvcHRfb3JkZXJfbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICgqYmQtPm9wdF9vcmRlciA+IHNjb25mLT5tYXhfb3JkZXIpIHsKKyAgICAgICAgICAgICAgICAqYmQtPm9wdF9vcmRlciA9IHNjb25mLT5tYXhfb3JkZXI7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcmVkaWN0b3Igb3JkZXIgdG9vIGxhcmdlLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYmQtPm9wdF9vcmRlciA9IHNjb25mLT5tYXhfb3JkZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpiZC0+b3B0X29yZGVyID4gYmQtPmJsb2NrX2xlbmd0aCkgeworICAgICAgICAgICAgKmJkLT5vcHRfb3JkZXIgPSBiZC0+YmxvY2tfbGVuZ3RoOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcmVkaWN0b3Igb3JkZXIgdG9vIGxhcmdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBvcHRfb3JkZXIgPSAqYmQtPm9wdF9vcmRlcjsKKworICAgICAgICBpZiAob3B0X29yZGVyKSB7CisgICAgICAgICAgICBpbnQgYWRkX2Jhc2U7CisKKyAgICAgICAgICAgIGlmIChzY29uZi0+Y29lZl90YWJsZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgYWRkX2Jhc2UgPSAweDdGOworCisgICAgICAgICAgICAgICAgLy8gcmVhZCBjb2VmZmljaWVudCAwCisgICAgICAgICAgICAgICAgcXVhbnRfY29mWzBdID0gMzIgKiBwYXJjb3Jfc2NhbGVkX3ZhbHVlc1tnZXRfYml0cyhnYiwgNyldOworCisgICAgICAgICAgICAgICAgLy8gcmVhZCBjb2VmZmljaWVudCAxCisgICAgICAgICAgICAgICAgaWYgKG9wdF9vcmRlciA+IDEpCisgICAgICAgICAgICAgICAgICAgIHF1YW50X2NvZlsxXSA9IC0zMiAqIHBhcmNvcl9zY2FsZWRfdmFsdWVzW2dldF9iaXRzKGdiLCA3KV07CisKKyAgICAgICAgICAgICAgICAvLyByZWFkIGNvZWZmaWNpZW50cyAyIHRvIG9wdF9vcmRlcgorICAgICAgICAgICAgICAgIGZvciAoayA9IDI7IGsgPCBvcHRfb3JkZXI7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgcXVhbnRfY29mW2tdID0gZ2V0X2JpdHMoZ2IsIDcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQga19tYXg7CisgICAgICAgICAgICAgICAgYWRkX2Jhc2UgPSAxOworCisgICAgICAgICAgICAgICAgLy8gcmVhZCBjb2VmZmljaWVudCAwIHRvIDE5CisgICAgICAgICAgICAgICAga19tYXggPSBGRk1JTihvcHRfb3JkZXIsIDIwKTsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwga19tYXg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmljZV9wYXJhbSA9IHBhcmNvcl9yaWNlX3RhYmxlW3Njb25mLT5jb2VmX3RhYmxlXVtrXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCAgICAgPSBwYXJjb3JfcmljZV90YWJsZVtzY29uZi0+Y29lZl90YWJsZV1ba11bMF07CisgICAgICAgICAgICAgICAgICAgIHF1YW50X2NvZltrXSA9IGRlY29kZV9yaWNlKGdiLCByaWNlX3BhcmFtKSArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHF1YW50X2NvZltrXSA8IC02NCB8fCBxdWFudF9jb2Zba10gPiA2MykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInF1YW50X2NvZiAlIlBSSXUzMiIgaXMgb3V0IG9mIHJhbmdlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudF9jb2Zba10pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyByZWFkIGNvZWZmaWNpZW50cyAyMCB0byAxMjYKKyAgICAgICAgICAgICAgICBrX21heCA9IEZGTUlOKG9wdF9vcmRlciwgMTI3KTsKKyAgICAgICAgICAgICAgICBmb3IgKDsgayA8IGtfbWF4OyBrKyspCisgICAgICAgICAgICAgICAgICAgIHF1YW50X2NvZltrXSA9IGRlY29kZV9yaWNlKGdiLCAyKSArIChrICYgMSk7CisKKyAgICAgICAgICAgICAgICAvLyByZWFkIGNvZWZmaWNpZW50cyAxMjcgdG8gb3B0X29yZGVyCisgICAgICAgICAgICAgICAgZm9yICg7IGsgPCBvcHRfb3JkZXI7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgcXVhbnRfY29mW2tdID0gZGVjb2RlX3JpY2UoZ2IsIDEpOworCisgICAgICAgICAgICAgICAgcXVhbnRfY29mWzBdID0gMzIgKiBwYXJjb3Jfc2NhbGVkX3ZhbHVlc1txdWFudF9jb2ZbMF0gKyA2NF07CisKKyAgICAgICAgICAgICAgICBpZiAob3B0X29yZGVyID4gMSkKKyAgICAgICAgICAgICAgICAgICAgcXVhbnRfY29mWzFdID0gLTMyICogcGFyY29yX3NjYWxlZF92YWx1ZXNbcXVhbnRfY29mWzFdICsgNjRdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGsgPSAyOyBrIDwgb3B0X29yZGVyOyBrKyspCisgICAgICAgICAgICAgICAgcXVhbnRfY29mW2tdID0gKHF1YW50X2NvZltrXSA8PCAxNCkgKyAoYWRkX2Jhc2UgPDwgMTMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcmVhZCBMVFAgZ2FpbiBhbmQgbGFnIHZhbHVlcworICAgIGlmIChzY29uZi0+bG9uZ190ZXJtX3ByZWRpY3Rpb24pIHsKKyAgICAgICAgKmJkLT51c2VfbHRwID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICBpZiAoKmJkLT51c2VfbHRwKSB7CisgICAgICAgICAgICBpbnQgciwgYzsKKworICAgICAgICAgICAgYmQtPmx0cF9nYWluWzBdICAgPSBkZWNvZGVfcmljZShnYiwgMSkgPDwgMzsKKyAgICAgICAgICAgIGJkLT5sdHBfZ2FpblsxXSAgID0gZGVjb2RlX3JpY2UoZ2IsIDIpIDw8IDM7CisKKyAgICAgICAgICAgIHIgICAgICAgICAgICAgICAgID0gZ2V0X3VuYXJ5KGdiLCAwLCAzKTsKKyAgICAgICAgICAgIGMgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgYmQtPmx0cF9nYWluWzJdICAgPSBsdHBfZ2Fpbl92YWx1ZXNbcl1bY107CisKKyAgICAgICAgICAgIGJkLT5sdHBfZ2FpblszXSAgID0gZGVjb2RlX3JpY2UoZ2IsIDIpIDw8IDM7CisgICAgICAgICAgICBiZC0+bHRwX2dhaW5bNF0gICA9IGRlY29kZV9yaWNlKGdiLCAxKSA8PCAzOworCisgICAgICAgICAgICAqYmQtPmx0cF9sYWcgICAgICA9IGdldF9iaXRzKGdiLCBjdHgtPmx0cF9sYWdfbGVuZ3RoKTsKKyAgICAgICAgICAgICpiZC0+bHRwX2xhZyAgICAgKz0gRkZNQVgoNCwgb3B0X29yZGVyICsgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZWFkIGZpcnN0IHZhbHVlIGFuZCByZXNpZHVhbHMgaW4gY2FzZSBvZiBhIHJhbmRvbSBhY2Nlc3MgYmxvY2sKKyAgICBpZiAoYmQtPnJhX2Jsb2NrKSB7CisgICAgICAgIGlmIChvcHRfb3JkZXIpCisgICAgICAgICAgICBiZC0+cmF3X3NhbXBsZXNbMF0gPSBkZWNvZGVfcmljZShnYiwgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgLSA0KTsKKyAgICAgICAgaWYgKG9wdF9vcmRlciA+IDEpCisgICAgICAgICAgICBiZC0+cmF3X3NhbXBsZXNbMV0gPSBkZWNvZGVfcmljZShnYiwgRkZNSU4oc1swXSArIDMsIGN0eC0+c19tYXgpKTsKKyAgICAgICAgaWYgKG9wdF9vcmRlciA+IDIpCisgICAgICAgICAgICBiZC0+cmF3X3NhbXBsZXNbMl0gPSBkZWNvZGVfcmljZShnYiwgRkZNSU4oc1swXSArIDEsIGN0eC0+c19tYXgpKTsKKworICAgICAgICBzdGFydCA9IEZGTUlOKG9wdF9vcmRlciwgMyk7CisgICAgfQorCisgICAgLy8gcmVhZCBhbGwgcmVzaWR1YWxzCisgICAgaWYgKHNjb25mLT5iZ21jKSB7CisgICAgICAgIGludCAgICAgICAgICBkZWx0YVs4XTsKKyAgICAgICAgdW5zaWduZWQgaW50IGsgICAgWzhdOworICAgICAgICB1bnNpZ25lZCBpbnQgYiA9IGF2X2NsaXAoKGF2X2NlaWxfbG9nMihiZC0+YmxvY2tfbGVuZ3RoKSAtIDMpID4+IDEsIDAsIDUpOworCisgICAgICAgIC8vIHJlYWQgbW9zdCBzaWduaWZpY2FudCBiaXRzCisgICAgICAgIHVuc2lnbmVkIGludCBoaWdoOworICAgICAgICB1bnNpZ25lZCBpbnQgbG93OworICAgICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7CisKKyAgICAgICAgZmZfYmdtY19kZWNvZGVfaW5pdChnYiwgJmhpZ2gsICZsb3csICZ2YWx1ZSk7CisKKyAgICAgICAgY3VycmVudF9yZXMgPSBiZC0+cmF3X3NhbXBsZXMgKyBzdGFydDsKKworICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBzdWJfYmxvY2tzOyBzYisrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2JfbGVuICA9IHNiX2xlbmd0aCAtIChzYiA/IDAgOiBzdGFydCk7CisKKyAgICAgICAgICAgIGsgICAgW3NiXSA9IHNbc2JdID4gYiA/IHNbc2JdIC0gYiA6IDA7CisgICAgICAgICAgICBkZWx0YVtzYl0gPSA1IC0gc1tzYl0gKyBrW3NiXTsKKworICAgICAgICAgICAgZmZfYmdtY19kZWNvZGUoZ2IsIHNiX2xlbiwgY3VycmVudF9yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVtzYl0sIHN4W3NiXSwgJmhpZ2gsICZsb3csICZ2YWx1ZSwgY3R4LT5iZ21jX2x1dCwgY3R4LT5iZ21jX2x1dF9zdGF0dXMpOworCisgICAgICAgICAgICBjdXJyZW50X3JlcyArPSBzYl9sZW47CisgICAgICAgIH0KKworICAgICAgICBmZl9iZ21jX2RlY29kZV9lbmQoZ2IpOworCisKKyAgICAgICAgLy8gcmVhZCBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFuZCB0YWlscworICAgICAgICBjdXJyZW50X3JlcyA9IGJkLT5yYXdfc2FtcGxlcyArIHN0YXJ0OworCisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IHN1Yl9ibG9ja3M7IHNiKyssIHN0YXJ0ID0gMCkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGN1cl90YWlsX2NvZGUgPSB0YWlsX2NvZGVbc3hbc2JdXVtkZWx0YVtzYl1dOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGN1cl9rICAgICAgICAgPSBrW3NiXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBjdXJfcyAgICAgICAgID0gc1tzYl07CisKKyAgICAgICAgICAgIGZvciAoOyBzdGFydCA8IHNiX2xlbmd0aDsgc3RhcnQrKykgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVzID0gKmN1cnJlbnRfcmVzOworCisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBjdXJfdGFpbF9jb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfbXNiID0gICAoMiArIChzeFtzYl0gPiAyKSArIChzeFtzYl0gPiAxMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoNSAtIGRlbHRhW3NiXSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gZGVjb2RlX3JpY2UoZ2IsIGN1cl9zKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyArPSAobWF4X21zYiAgICApIDw8IGN1cl9rOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzIC09IChtYXhfbXNiIC0gMSkgPDwgY3VyX2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID4gY3VyX3RhaWxfY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0tOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gLXJlczsKKworICAgICAgICAgICAgICAgICAgICByZXMgPj49IDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cl9rKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPDw9IGN1cl9rOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzICB8PSBnZXRfYml0c19sb25nKGdiLCBjdXJfayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqY3VycmVudF9yZXMrKyA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGN1cnJlbnRfcmVzID0gYmQtPnJhd19zYW1wbGVzICsgc3RhcnQ7CisKKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgc3ViX2Jsb2Nrczsgc2IrKywgc3RhcnQgPSAwKQorICAgICAgICAgICAgZm9yICg7IHN0YXJ0IDwgc2JfbGVuZ3RoOyBzdGFydCsrKQorICAgICAgICAgICAgICAgICpjdXJyZW50X3JlcysrID0gZGVjb2RlX3JpY2UoZ2IsIHNbc2JdKTsKKyAgICAgfQorCisgICAgaWYgKCFzY29uZi0+bWNfY29kaW5nIHx8IGN0eC0+anNfc3dpdGNoKQorICAgICAgICBhbGlnbl9nZXRfYml0cyhnYik7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKiogRGVjb2RlIHRoZSBibG9jayBkYXRhIGZvciBhIG5vbi1jb25zdGFudCBibG9jaworICovCitzdGF0aWMgaW50IGRlY29kZV92YXJfYmxvY2tfZGF0YShBTFNEZWNDb250ZXh0ICpjdHgsIEFMU0Jsb2NrRGF0YSAqYmQpCit7CisgICAgQUxTU3BlY2lmaWNDb25maWcgKnNjb25mID0gJmN0eC0+c2NvbmY7CisgICAgdW5zaWduZWQgaW50IGJsb2NrX2xlbmd0aCA9IGJkLT5ibG9ja19sZW5ndGg7CisgICAgdW5zaWduZWQgaW50IHNtcCA9IDA7CisgICAgdW5zaWduZWQgaW50IGs7CisgICAgaW50IG9wdF9vcmRlciAgICAgICAgICAgICA9ICpiZC0+b3B0X29yZGVyOworICAgIGludCBzYjsKKyAgICBpbnQ2NF90IHk7CisgICAgaW50MzJfdCAqcXVhbnRfY29mICAgICAgICA9IGJkLT5xdWFudF9jb2Y7CisgICAgaW50MzJfdCAqbHBjX2NvZiAgICAgICAgICA9IGJkLT5scGNfY29mOworICAgIGludDMyX3QgKnJhd19zYW1wbGVzICAgICAgPSBiZC0+cmF3X3NhbXBsZXM7CisgICAgaW50MzJfdCAqcmF3X3NhbXBsZXNfZW5kICA9IGJkLT5yYXdfc2FtcGxlcyArIGJkLT5ibG9ja19sZW5ndGg7CisgICAgaW50MzJfdCAqbHBjX2NvZl9yZXZlcnNlZCA9IGN0eC0+bHBjX2NvZl9yZXZlcnNlZF9idWZmZXI7CisKKyAgICAvLyByZXZlcnNlIGxvbmctdGVybSBwcmVkaWN0aW9uCisgICAgaWYgKCpiZC0+dXNlX2x0cCkgeworICAgICAgICBpbnQgbHRwX3NtcDsKKworICAgICAgICBmb3IgKGx0cF9zbXAgPSBGRk1BWCgqYmQtPmx0cF9sYWcgLSAyLCAwKTsgbHRwX3NtcCA8IGJsb2NrX2xlbmd0aDsgbHRwX3NtcCsrKSB7CisgICAgICAgICAgICBpbnQgY2VudGVyID0gbHRwX3NtcCAtICpiZC0+bHRwX2xhZzsKKyAgICAgICAgICAgIGludCBiZWdpbiAgPSBGRk1BWCgwLCBjZW50ZXIgLSAyKTsKKyAgICAgICAgICAgIGludCBlbmQgICAgPSBjZW50ZXIgKyAzOworICAgICAgICAgICAgaW50IHRhYiAgICA9IDUgLSAoZW5kIC0gYmVnaW4pOworICAgICAgICAgICAgaW50IGJhc2U7CisKKyAgICAgICAgICAgIHkgPSAxIDw8IDY7CisKKyAgICAgICAgICAgIGZvciAoYmFzZSA9IGJlZ2luOyBiYXNlIDwgZW5kOyBiYXNlKyssIHRhYisrKQorICAgICAgICAgICAgICAgIHkgKz0gTVVMNjQoYmQtPmx0cF9nYWluW3RhYl0sIHJhd19zYW1wbGVzW2Jhc2VdKTsKKworICAgICAgICAgICAgcmF3X3NhbXBsZXNbbHRwX3NtcF0gKz0geSA+PiA3OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcmVjb25zdHJ1Y3QgYWxsIHNhbXBsZXMgZnJvbSByZXNpZHVhbHMKKyAgICBpZiAoYmQtPnJhX2Jsb2NrKSB7CisgICAgICAgIGZvciAoc21wID0gMDsgc21wIDwgb3B0X29yZGVyOyBzbXArKykgeworICAgICAgICAgICAgeSA9IDEgPDwgMTk7CisKKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IHNtcDsgc2IrKykKKyAgICAgICAgICAgICAgICB5ICs9IE1VTDY0KGxwY19jb2Zbc2JdLCByYXdfc2FtcGxlc1stKHNiICsgMSldKTsKKworICAgICAgICAgICAgKnJhd19zYW1wbGVzKysgLT0geSA+PiAyMDsKKyAgICAgICAgICAgIHBhcmNvcl90b19scGMoc21wLCBxdWFudF9jb2YsIGxwY19jb2YpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG9wdF9vcmRlcjsgaysrKQorICAgICAgICAgICAgcGFyY29yX3RvX2xwYyhrLCBxdWFudF9jb2YsIGxwY19jb2YpOworCisgICAgICAgIC8vIHN0b3JlIHByZXZpb3VzIHNhbXBsZXMgaW4gY2FzZSB0aGF0IHRoZXkgaGF2ZSB0byBiZSBhbHRlcmVkCisgICAgICAgIGlmICgqYmQtPnN0b3JlX3ByZXZfc2FtcGxlcykKKyAgICAgICAgICAgIG1lbWNweShiZC0+cHJldl9yYXdfc2FtcGxlcywgcmF3X3NhbXBsZXMgLSBzY29uZi0+bWF4X29yZGVyLAorICAgICAgICAgICAgICAgICAgIHNpemVvZigqYmQtPnByZXZfcmF3X3NhbXBsZXMpICogc2NvbmYtPm1heF9vcmRlcik7CisKKyAgICAgICAgLy8gcmVjb25zdHJ1Y3QgZGlmZmVyZW5jZSBzaWduYWwgZm9yIHByZWRpY3Rpb24gKGpvaW50LXN0ZXJlbykKKyAgICAgICAgaWYgKGJkLT5qc19ibG9ja3MgJiYgYmQtPnJhd19vdGhlcikgeworICAgICAgICAgICAgaW50MzJfdCAqbGVmdCwgKnJpZ2h0OworCisgICAgICAgICAgICBpZiAoYmQtPnJhd19vdGhlciA+IHJhd19zYW1wbGVzKSB7ICAvLyBEID0gUiAtIEwKKyAgICAgICAgICAgICAgICBsZWZ0ICA9IHJhd19zYW1wbGVzOworICAgICAgICAgICAgICAgIHJpZ2h0ID0gYmQtPnJhd19vdGhlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEID0gUiAtIEwKKyAgICAgICAgICAgICAgICBsZWZ0ICA9IGJkLT5yYXdfb3RoZXI7CisgICAgICAgICAgICAgICAgcmlnaHQgPSByYXdfc2FtcGxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChzYiA9IC0xOyBzYiA+PSAtc2NvbmYtPm1heF9vcmRlcjsgc2ItLSkKKyAgICAgICAgICAgICAgICByYXdfc2FtcGxlc1tzYl0gPSByaWdodFtzYl0gLSBsZWZ0W3NiXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlY29uc3RydWN0IHNoaWZ0ZWQgc2lnbmFsCisgICAgICAgIGlmICgqYmQtPnNoaWZ0X2xzYnMpCisgICAgICAgICAgICBmb3IgKHNiID0gLTE7IHNiID49IC1zY29uZi0+bWF4X29yZGVyOyBzYi0tKQorICAgICAgICAgICAgICAgIHJhd19zYW1wbGVzW3NiXSA+Pj0gKmJkLT5zaGlmdF9sc2JzOworICAgIH0KKworICAgIC8vIHJldmVyc2UgbGluZWFyIHByZWRpY3Rpb24gY29lZmZpY2llbnRzIGZvciBlZmZpY2llbmN5CisgICAgbHBjX2NvZiA9IGxwY19jb2YgKyBvcHRfb3JkZXI7CisKKyAgICBmb3IgKHNiID0gMDsgc2IgPCBvcHRfb3JkZXI7IHNiKyspCisgICAgICAgIGxwY19jb2ZfcmV2ZXJzZWRbc2JdID0gbHBjX2NvZlstKHNiICsgMSldOworCisgICAgLy8gcmVjb25zdHJ1Y3QgcmF3IHNhbXBsZXMKKyAgICByYXdfc2FtcGxlcyA9IGJkLT5yYXdfc2FtcGxlcyArIHNtcDsKKyAgICBscGNfY29mICAgICA9IGxwY19jb2ZfcmV2ZXJzZWQgKyBvcHRfb3JkZXI7CisKKyAgICBmb3IgKDsgcmF3X3NhbXBsZXMgPCByYXdfc2FtcGxlc19lbmQ7IHJhd19zYW1wbGVzKyspIHsKKyAgICAgICAgeSA9IDEgPDwgMTk7CisKKyAgICAgICAgZm9yIChzYiA9IC1vcHRfb3JkZXI7IHNiIDwgMDsgc2IrKykKKyAgICAgICAgICAgIHkgKz0gTVVMNjQobHBjX2NvZltzYl0sIHJhd19zYW1wbGVzW3NiXSk7CisKKyAgICAgICAgKnJhd19zYW1wbGVzIC09IHkgPj4gMjA7CisgICAgfQorCisgICAgcmF3X3NhbXBsZXMgPSBiZC0+cmF3X3NhbXBsZXM7CisKKyAgICAvLyByZXN0b3JlIHByZXZpb3VzIHNhbXBsZXMgaW4gY2FzZSB0aGF0IHRoZXkgaGF2ZSBiZWVuIGFsdGVyZWQKKyAgICBpZiAoKmJkLT5zdG9yZV9wcmV2X3NhbXBsZXMpCisgICAgICAgIG1lbWNweShyYXdfc2FtcGxlcyAtIHNjb25mLT5tYXhfb3JkZXIsIGJkLT5wcmV2X3Jhd19zYW1wbGVzLAorICAgICAgICAgICAgICAgc2l6ZW9mKCpyYXdfc2FtcGxlcykgKiBzY29uZi0+bWF4X29yZGVyKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKiBSZWFkIHRoZSBibG9jayBkYXRhLgorICovCitzdGF0aWMgaW50IHJlYWRfYmxvY2soQUxTRGVjQ29udGV4dCAqY3R4LCBBTFNCbG9ja0RhdGEgKmJkKQoreworICAgIGludCByZXQ7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgICAgICAgID0gJmN0eC0+Z2I7CisKKyAgICAqYmQtPnNoaWZ0X2xzYnMgPSAwOworICAgIC8vIHJlYWQgYmxvY2sgdHlwZSBmbGFnIGFuZCByZWFkIHRoZSBzYW1wbGVzIGFjY29yZGluZ2x5CisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgcmV0ID0gcmVhZF92YXJfYmxvY2tfZGF0YShjdHgsIGJkKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSByZWFkX2NvbnN0X2Jsb2NrX2RhdGEoY3R4LCBiZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworCisvKiogRGVjb2RlIHRoZSBibG9jayBkYXRhLgorICovCitzdGF0aWMgaW50IGRlY29kZV9ibG9jayhBTFNEZWNDb250ZXh0ICpjdHgsIEFMU0Jsb2NrRGF0YSAqYmQpCit7CisgICAgdW5zaWduZWQgaW50IHNtcDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIC8vIHJlYWQgYmxvY2sgdHlwZSBmbGFnIGFuZCByZWFkIHRoZSBzYW1wbGVzIGFjY29yZGluZ2x5CisgICAgaWYgKCpiZC0+Y29uc3RfYmxvY2spCisgICAgICAgIGRlY29kZV9jb25zdF9ibG9ja19kYXRhKGN0eCwgYmQpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gZGVjb2RlX3Zhcl9ibG9ja19kYXRhKGN0eCwgYmQpOyAvLyBhbHdheXMgcmV0dXJuIDAKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLy8gVE9ETzogcmVhZCBSTFNMTVMgZXh0ZW5zaW9uIGRhdGEKKworICAgIGlmICgqYmQtPnNoaWZ0X2xzYnMpCisgICAgICAgIGZvciAoc21wID0gMDsgc21wIDwgYmQtPmJsb2NrX2xlbmd0aDsgc21wKyspCisgICAgICAgICAgICBiZC0+cmF3X3NhbXBsZXNbc21wXSA8PD0gKmJkLT5zaGlmdF9sc2JzOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqIFJlYWQgYW5kIGRlY29kZSBibG9jayBkYXRhIHN1Y2Nlc3NpdmVseS4KKyAqLworc3RhdGljIGludCByZWFkX2RlY29kZV9ibG9jayhBTFNEZWNDb250ZXh0ICpjdHgsIEFMU0Jsb2NrRGF0YSAqYmQpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gcmVhZF9ibG9jayhjdHgsIGJkKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIGRlY29kZV9ibG9jayhjdHgsIGJkKTsKK30KKworCisvKiogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgbGVmdCB0byBkZWNvZGUgZm9yIHRoZSBjdXJyZW50IGZyYW1lIGFuZAorICogIHNldHMgdGhlc2Ugc2FtcGxlcyB0byB6ZXJvLgorICovCitzdGF0aWMgdm9pZCB6ZXJvX3JlbWFpbmluZyh1bnNpZ25lZCBpbnQgYiwgdW5zaWduZWQgaW50IGJfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpkaXZfYmxvY2tzLCBpbnQzMl90ICpidWYpCit7CisgICAgdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKworICAgIHdoaWxlIChiIDwgYl9tYXgpCisgICAgICAgIGNvdW50ICs9IGRpdl9ibG9ja3NbYisrXTsKKworICAgIGlmIChjb3VudCkKKyAgICAgICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpICogY291bnQpOworfQorCisKKy8qKiBEZWNvZGUgYmxvY2tzIGluZGVwZW5kZW50bHkuCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2Jsb2Nrc19pbmQoQUxTRGVjQ29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgcmFfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjLCBjb25zdCB1bnNpZ25lZCBpbnQgKmRpdl9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqanNfYmxvY2tzKQoreworICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgaW50IGI7CisgICAgQUxTQmxvY2tEYXRhIGJkID0geyAwIH07CisKKyAgICBiZC5yYV9ibG9jayAgICAgICAgID0gcmFfZnJhbWU7CisgICAgYmQuY29uc3RfYmxvY2sgICAgICA9IGN0eC0+Y29uc3RfYmxvY2s7CisgICAgYmQuc2hpZnRfbHNicyAgICAgICA9IGN0eC0+c2hpZnRfbHNiczsKKyAgICBiZC5vcHRfb3JkZXIgICAgICAgID0gY3R4LT5vcHRfb3JkZXI7CisgICAgYmQuc3RvcmVfcHJldl9zYW1wbGVzID0gY3R4LT5zdG9yZV9wcmV2X3NhbXBsZXM7CisgICAgYmQudXNlX2x0cCAgICAgICAgICA9IGN0eC0+dXNlX2x0cDsKKyAgICBiZC5sdHBfbGFnICAgICAgICAgID0gY3R4LT5sdHBfbGFnOworICAgIGJkLmx0cF9nYWluICAgICAgICAgPSBjdHgtPmx0cF9nYWluWzBdOworICAgIGJkLnF1YW50X2NvZiAgICAgICAgPSBjdHgtPnF1YW50X2NvZlswXTsKKyAgICBiZC5scGNfY29mICAgICAgICAgID0gY3R4LT5scGNfY29mWzBdOworICAgIGJkLnByZXZfcmF3X3NhbXBsZXMgPSBjdHgtPnByZXZfcmF3X3NhbXBsZXM7CisgICAgYmQucmF3X3NhbXBsZXMgICAgICA9IGN0eC0+cmF3X3NhbXBsZXNbY107CisKKworICAgIGZvciAoYiA9IDA7IGIgPCBjdHgtPm51bV9ibG9ja3M7IGIrKykgeworICAgICAgICBiZC5ibG9ja19sZW5ndGggICAgID0gZGl2X2Jsb2Nrc1tiXTsKKworICAgICAgICBpZiAoKHJldCA9IHJlYWRfZGVjb2RlX2Jsb2NrKGN0eCwgJmJkKSkgPCAwKSB7CisgICAgICAgICAgICAvLyBkYW1hZ2VkIGJsb2NrLCB3cml0ZSB6ZXJvIGZvciB0aGUgcmVzdCBvZiB0aGUgZnJhbWUKKyAgICAgICAgICAgIHplcm9fcmVtYWluaW5nKGIsIGN0eC0+bnVtX2Jsb2NrcywgZGl2X2Jsb2NrcywgYmQucmF3X3NhbXBsZXMpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBiZC5yYXdfc2FtcGxlcyArPSBkaXZfYmxvY2tzW2JdOworICAgICAgICBiZC5yYV9ibG9jayAgICAgPSAwOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKy8qKiBEZWNvZGUgYmxvY2tzIGRlcGVuZGVudGx5LgorICovCitzdGF0aWMgaW50IGRlY29kZV9ibG9ja3MoQUxTRGVjQ29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgcmFfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGMsIGNvbnN0IHVuc2lnbmVkIGludCAqZGl2X2Jsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmpzX2Jsb2NrcykKK3sKKyAgICBBTFNTcGVjaWZpY0NvbmZpZyAqc2NvbmYgPSAmY3R4LT5zY29uZjsKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgYjsKKyAgICBpbnQgcmV0OworICAgIEFMU0Jsb2NrRGF0YSBiZFsyXSA9IHsgeyAwIH0gfTsKKworICAgIGJkWzBdLnJhX2Jsb2NrICAgICAgICAgPSByYV9mcmFtZTsKKyAgICBiZFswXS5jb25zdF9ibG9jayAgICAgID0gY3R4LT5jb25zdF9ibG9jazsKKyAgICBiZFswXS5zaGlmdF9sc2JzICAgICAgID0gY3R4LT5zaGlmdF9sc2JzOworICAgIGJkWzBdLm9wdF9vcmRlciAgICAgICAgPSBjdHgtPm9wdF9vcmRlcjsKKyAgICBiZFswXS5zdG9yZV9wcmV2X3NhbXBsZXMgPSBjdHgtPnN0b3JlX3ByZXZfc2FtcGxlczsKKyAgICBiZFswXS51c2VfbHRwICAgICAgICAgID0gY3R4LT51c2VfbHRwOworICAgIGJkWzBdLmx0cF9sYWcgICAgICAgICAgPSBjdHgtPmx0cF9sYWc7CisgICAgYmRbMF0ubHRwX2dhaW4gICAgICAgICA9IGN0eC0+bHRwX2dhaW5bMF07CisgICAgYmRbMF0ucXVhbnRfY29mICAgICAgICA9IGN0eC0+cXVhbnRfY29mWzBdOworICAgIGJkWzBdLmxwY19jb2YgICAgICAgICAgPSBjdHgtPmxwY19jb2ZbMF07CisgICAgYmRbMF0ucHJldl9yYXdfc2FtcGxlcyA9IGN0eC0+cHJldl9yYXdfc2FtcGxlczsKKyAgICBiZFswXS5qc19ibG9ja3MgICAgICAgID0gKmpzX2Jsb2NrczsKKworICAgIGJkWzFdLnJhX2Jsb2NrICAgICAgICAgPSByYV9mcmFtZTsKKyAgICBiZFsxXS5jb25zdF9ibG9jayAgICAgID0gY3R4LT5jb25zdF9ibG9jazsKKyAgICBiZFsxXS5zaGlmdF9sc2JzICAgICAgID0gY3R4LT5zaGlmdF9sc2JzOworICAgIGJkWzFdLm9wdF9vcmRlciAgICAgICAgPSBjdHgtPm9wdF9vcmRlcjsKKyAgICBiZFsxXS5zdG9yZV9wcmV2X3NhbXBsZXMgPSBjdHgtPnN0b3JlX3ByZXZfc2FtcGxlczsKKyAgICBiZFsxXS51c2VfbHRwICAgICAgICAgID0gY3R4LT51c2VfbHRwOworICAgIGJkWzFdLmx0cF9sYWcgICAgICAgICAgPSBjdHgtPmx0cF9sYWc7CisgICAgYmRbMV0ubHRwX2dhaW4gICAgICAgICA9IGN0eC0+bHRwX2dhaW5bMF07CisgICAgYmRbMV0ucXVhbnRfY29mICAgICAgICA9IGN0eC0+cXVhbnRfY29mWzBdOworICAgIGJkWzFdLmxwY19jb2YgICAgICAgICAgPSBjdHgtPmxwY19jb2ZbMF07CisgICAgYmRbMV0ucHJldl9yYXdfc2FtcGxlcyA9IGN0eC0+cHJldl9yYXdfc2FtcGxlczsKKyAgICBiZFsxXS5qc19ibG9ja3MgICAgICAgID0gKihqc19ibG9ja3MgKyAxKTsKKworICAgIC8vIGRlY29kZSBhbGwgYmxvY2tzCisgICAgZm9yIChiID0gMDsgYiA8IGN0eC0+bnVtX2Jsb2NrczsgYisrKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBzOworCisgICAgICAgIGJkWzBdLmJsb2NrX2xlbmd0aCA9IGRpdl9ibG9ja3NbYl07CisgICAgICAgIGJkWzFdLmJsb2NrX2xlbmd0aCA9IGRpdl9ibG9ja3NbYl07CisKKyAgICAgICAgYmRbMF0ucmF3X3NhbXBsZXMgID0gY3R4LT5yYXdfc2FtcGxlc1tjICAgIF0gKyBvZmZzZXQ7CisgICAgICAgIGJkWzFdLnJhd19zYW1wbGVzICA9IGN0eC0+cmF3X3NhbXBsZXNbYyArIDFdICsgb2Zmc2V0OworCisgICAgICAgIGJkWzBdLnJhd19vdGhlciAgICA9IGJkWzFdLnJhd19zYW1wbGVzOworICAgICAgICBiZFsxXS5yYXdfb3RoZXIgICAgPSBiZFswXS5yYXdfc2FtcGxlczsKKworICAgICAgICBpZiAoKHJldCA9IHJlYWRfZGVjb2RlX2Jsb2NrKGN0eCwgJmJkWzBdKSkgPCAwIHx8CisgICAgICAgICAgICAocmV0ID0gcmVhZF9kZWNvZGVfYmxvY2soY3R4LCAmYmRbMV0pKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgLy8gcmVjb25zdHJ1Y3Qgam9pbnQtc3RlcmVvIGJsb2NrcworICAgICAgICBpZiAoYmRbMF0uanNfYmxvY2tzKSB7CisgICAgICAgICAgICBpZiAoYmRbMV0uanNfYmxvY2tzKQorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgY2hhbm5lbCBwYWlyLlxuIik7CisKKyAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCBkaXZfYmxvY2tzW2JdOyBzKyspCisgICAgICAgICAgICAgICAgYmRbMF0ucmF3X3NhbXBsZXNbc10gPSBiZFsxXS5yYXdfc2FtcGxlc1tzXSAtIGJkWzBdLnJhd19zYW1wbGVzW3NdOworICAgICAgICB9IGVsc2UgaWYgKGJkWzFdLmpzX2Jsb2NrcykgeworICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IGRpdl9ibG9ja3NbYl07IHMrKykKKyAgICAgICAgICAgICAgICBiZFsxXS5yYXdfc2FtcGxlc1tzXSA9IGJkWzFdLnJhd19zYW1wbGVzW3NdICsgYmRbMF0ucmF3X3NhbXBsZXNbc107CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgICs9IGRpdl9ibG9ja3NbYl07CisgICAgICAgIGJkWzBdLnJhX2Jsb2NrID0gMDsKKyAgICAgICAgYmRbMV0ucmFfYmxvY2sgPSAwOworICAgIH0KKworICAgIC8vIHN0b3JlIGNhcnJ5b3ZlciByYXcgc2FtcGxlcywKKyAgICAvLyB0aGUgb3RoZXJzIGNoYW5uZWwgcmF3IHNhbXBsZXMgYXJlIHN0b3JlZCBieSB0aGUgY2FsbGluZyBmdW5jdGlvbi4KKyAgICBtZW1tb3ZlKGN0eC0+cmF3X3NhbXBsZXNbY10gLSBzY29uZi0+bWF4X29yZGVyLAorICAgICAgICAgICAgY3R4LT5yYXdfc2FtcGxlc1tjXSAtIHNjb25mLT5tYXhfb3JkZXIgKyBzY29uZi0+ZnJhbWVfbGVuZ3RoLAorICAgICAgICAgICAgc2l6ZW9mKCpjdHgtPnJhd19zYW1wbGVzW2NdKSAqIHNjb25mLT5tYXhfb3JkZXIpOworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIC8vIGRhbWFnZWQgYmxvY2ssIHdyaXRlIHplcm8gZm9yIHRoZSByZXN0IG9mIHRoZSBmcmFtZQorICAgIHplcm9fcmVtYWluaW5nKGIsIGN0eC0+bnVtX2Jsb2NrcywgZGl2X2Jsb2NrcywgYmRbMF0ucmF3X3NhbXBsZXMpOworICAgIHplcm9fcmVtYWluaW5nKGIsIGN0eC0+bnVtX2Jsb2NrcywgZGl2X2Jsb2NrcywgYmRbMV0ucmF3X3NhbXBsZXMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFsc193ZWlnaHRpbmcoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBrLCBpbnQgb2ZmKQoreworICAgIGludCBpZHggPSBhdl9jbGlwKGRlY29kZV9yaWNlKGdiLCBrKSArIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAwLCBGRl9BUlJBWV9FTEVNUyhtY2Nfd2VpZ2h0aW5ncykgLSAxKTsKKyAgICByZXR1cm4gbWNjX3dlaWdodGluZ3NbaWR4XTsKK30KKworLyoqIFJlYWQgdGhlIGNoYW5uZWwgZGF0YS4KKyAgKi8KK3N0YXRpYyBpbnQgcmVhZF9jaGFubmVsX2RhdGEoQUxTRGVjQ29udGV4dCAqY3R4LCBBTFNDaGFubmVsRGF0YSAqY2QsIGludCBjKQoreworICAgIEdldEJpdENvbnRleHQgKmdiICAgICAgID0gJmN0eC0+Z2I7CisgICAgQUxTQ2hhbm5lbERhdGEgKmN1cnJlbnQgPSBjZDsKKyAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbHMgICA9IGN0eC0+YXZjdHgtPmNoYW5uZWxzOworICAgIGludCBlbnRyaWVzICAgICAgICAgICAgID0gMDsKKworICAgIHdoaWxlIChlbnRyaWVzIDwgY2hhbm5lbHMgJiYgIShjdXJyZW50LT5zdG9wX2ZsYWcgPSBnZXRfYml0czEoZ2IpKSkgeworICAgICAgICBjdXJyZW50LT5tYXN0ZXJfY2hhbm5lbCA9IGdldF9iaXRzX2xvbmcoZ2IsIGF2X2NlaWxfbG9nMihjaGFubmVscykpOworCisgICAgICAgIGlmIChjdXJyZW50LT5tYXN0ZXJfY2hhbm5lbCA+PSBjaGFubmVscykgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbWFzdGVyIGNoYW5uZWwuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJlbnQtPm1hc3Rlcl9jaGFubmVsICE9IGMpIHsKKyAgICAgICAgICAgIGN1cnJlbnQtPnRpbWVfZGlmZl9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGN1cnJlbnQtPndlaWdodGluZ1swXSAgID0gYWxzX3dlaWdodGluZyhnYiwgMSwgMTYpOworICAgICAgICAgICAgY3VycmVudC0+d2VpZ2h0aW5nWzFdICAgPSBhbHNfd2VpZ2h0aW5nKGdiLCAyLCAxNCk7CisgICAgICAgICAgICBjdXJyZW50LT53ZWlnaHRpbmdbMl0gICA9IGFsc193ZWlnaHRpbmcoZ2IsIDEsIDE2KTsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnRpbWVfZGlmZl9mbGFnKSB7CisgICAgICAgICAgICAgICAgY3VycmVudC0+d2VpZ2h0aW5nWzNdID0gYWxzX3dlaWdodGluZyhnYiwgMSwgMTYpOworICAgICAgICAgICAgICAgIGN1cnJlbnQtPndlaWdodGluZ1s0XSA9IGFsc193ZWlnaHRpbmcoZ2IsIDEsIDE2KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50LT53ZWlnaHRpbmdbNV0gPSBhbHNfd2VpZ2h0aW5nKGdiLCAxLCAxNik7CisKKyAgICAgICAgICAgICAgICBjdXJyZW50LT50aW1lX2RpZmZfc2lnbiAgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRpbWVfZGlmZl9pbmRleCA9IGdldF9iaXRzKGdiLCBjdHgtPmx0cF9sYWdfbGVuZ3RoIC0gMykgKyAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY3VycmVudCsrOworICAgICAgICBlbnRyaWVzKys7CisgICAgfQorCisgICAgaWYgKGVudHJpZXMgPT0gY2hhbm5lbHMpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkRhbWFnZWQgY2hhbm5lbCBkYXRhLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGFsaWduX2dldF9iaXRzKGdiKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKiogUmVjdXJzaXZlbHkgcmV2ZXJ0cyB0aGUgaW50ZXItY2hhbm5lbCBjb3JyZWxhdGlvbiBmb3IgYSBibG9jay4KKyAqLworc3RhdGljIGludCByZXZlcnRfY2hhbm5lbF9jb3JyZWxhdGlvbihBTFNEZWNDb250ZXh0ICpjdHgsIEFMU0Jsb2NrRGF0YSAqYmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFNDaGFubmVsRGF0YSAqKmNkLCBpbnQgKnJldmVydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldCwgaW50IGMpCit7CisgICAgQUxTQ2hhbm5lbERhdGEgKmNoID0gY2RbY107CisgICAgdW5zaWduZWQgaW50ICAgZGVwID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbHMgPSBjdHgtPmF2Y3R4LT5jaGFubmVsczsKKworICAgIGlmIChyZXZlcnRlZFtjXSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXZlcnRlZFtjXSA9IDE7CisKKyAgICB3aGlsZSAoZGVwIDwgY2hhbm5lbHMgJiYgIWNoW2RlcF0uc3RvcF9mbGFnKSB7CisgICAgICAgIHJldmVydF9jaGFubmVsX2NvcnJlbGF0aW9uKGN0eCwgYmQsIGNkLCByZXZlcnRlZCwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaFtkZXBdLm1hc3Rlcl9jaGFubmVsKTsKKworICAgICAgICBkZXArKzsKKyAgICB9CisKKyAgICBpZiAoZGVwID09IGNoYW5uZWxzKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgY2hhbm5lbCBjb3JyZWxhdGlvbi5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBiZC0+Y29uc3RfYmxvY2sgPSBjdHgtPmNvbnN0X2Jsb2NrICsgYzsKKyAgICBiZC0+c2hpZnRfbHNicyAgPSBjdHgtPnNoaWZ0X2xzYnMgKyBjOworICAgIGJkLT5vcHRfb3JkZXIgICA9IGN0eC0+b3B0X29yZGVyICsgYzsKKyAgICBiZC0+c3RvcmVfcHJldl9zYW1wbGVzID0gY3R4LT5zdG9yZV9wcmV2X3NhbXBsZXMgKyBjOworICAgIGJkLT51c2VfbHRwICAgICA9IGN0eC0+dXNlX2x0cCArIGM7CisgICAgYmQtPmx0cF9sYWcgICAgID0gY3R4LT5sdHBfbGFnICsgYzsKKyAgICBiZC0+bHRwX2dhaW4gICAgPSBjdHgtPmx0cF9nYWluW2NdOworICAgIGJkLT5scGNfY29mICAgICA9IGN0eC0+bHBjX2NvZltjXTsKKyAgICBiZC0+cXVhbnRfY29mICAgPSBjdHgtPnF1YW50X2NvZltjXTsKKyAgICBiZC0+cmF3X3NhbXBsZXMgPSBjdHgtPnJhd19zYW1wbGVzW2NdICsgb2Zmc2V0OworCisgICAgZm9yIChkZXAgPSAwOyAhY2hbZGVwXS5zdG9wX2ZsYWc7IGRlcCsrKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBzbXA7CisgICAgICAgIHVuc2lnbmVkIGludCBiZWdpbiA9IDE7CisgICAgICAgIHVuc2lnbmVkIGludCBlbmQgICA9IGJkLT5ibG9ja19sZW5ndGggLSAxOworICAgICAgICBpbnQ2NF90IHk7CisgICAgICAgIGludDMyX3QgKm1hc3RlciA9IGN0eC0+cmF3X3NhbXBsZXNbY2hbZGVwXS5tYXN0ZXJfY2hhbm5lbF0gKyBvZmZzZXQ7CisKKyAgICAgICAgaWYgKGNoW2RlcF0ubWFzdGVyX2NoYW5uZWwgPT0gYykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChjaFtkZXBdLnRpbWVfZGlmZl9mbGFnKSB7CisgICAgICAgICAgICBpbnQgdCA9IGNoW2RlcF0udGltZV9kaWZmX2luZGV4OworCisgICAgICAgICAgICBpZiAoY2hbZGVwXS50aW1lX2RpZmZfc2lnbikgeworICAgICAgICAgICAgICAgIHQgICAgICA9IC10OworICAgICAgICAgICAgICAgIGJlZ2luIC09IHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVuZCAgIC09IHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoc21wID0gYmVnaW47IHNtcCA8IGVuZDsgc21wKyspIHsKKyAgICAgICAgICAgICAgICB5ICA9ICgxIDw8IDYpICsKKyAgICAgICAgICAgICAgICAgICAgIE1VTDY0KGNoW2RlcF0ud2VpZ2h0aW5nWzBdLCBtYXN0ZXJbc21wIC0gMSAgICBdKSArCisgICAgICAgICAgICAgICAgICAgICBNVUw2NChjaFtkZXBdLndlaWdodGluZ1sxXSwgbWFzdGVyW3NtcCAgICAgICAgXSkgKworICAgICAgICAgICAgICAgICAgICAgTVVMNjQoY2hbZGVwXS53ZWlnaHRpbmdbMl0sIG1hc3RlcltzbXAgKyAxICAgIF0pICsKKyAgICAgICAgICAgICAgICAgICAgIE1VTDY0KGNoW2RlcF0ud2VpZ2h0aW5nWzNdLCBtYXN0ZXJbc21wIC0gMSArIHRdKSArCisgICAgICAgICAgICAgICAgICAgICBNVUw2NChjaFtkZXBdLndlaWdodGluZ1s0XSwgbWFzdGVyW3NtcCAgICAgKyB0XSkgKworICAgICAgICAgICAgICAgICAgICAgTVVMNjQoY2hbZGVwXS53ZWlnaHRpbmdbNV0sIG1hc3RlcltzbXAgKyAxICsgdF0pOworCisgICAgICAgICAgICAgICAgYmQtPnJhd19zYW1wbGVzW3NtcF0gKz0geSA+PiA3OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChzbXAgPSBiZWdpbjsgc21wIDwgZW5kOyBzbXArKykgeworICAgICAgICAgICAgICAgIHkgID0gKDEgPDwgNikgKworICAgICAgICAgICAgICAgICAgICAgTVVMNjQoY2hbZGVwXS53ZWlnaHRpbmdbMF0sIG1hc3RlcltzbXAgLSAxXSkgKworICAgICAgICAgICAgICAgICAgICAgTVVMNjQoY2hbZGVwXS53ZWlnaHRpbmdbMV0sIG1hc3RlcltzbXAgICAgXSkgKworICAgICAgICAgICAgICAgICAgICAgTVVMNjQoY2hbZGVwXS53ZWlnaHRpbmdbMl0sIG1hc3RlcltzbXAgKyAxXSk7CisKKyAgICAgICAgICAgICAgICBiZC0+cmF3X3NhbXBsZXNbc21wXSArPSB5ID4+IDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKiogUmVhZCB0aGUgZnJhbWUgZGF0YS4KKyAqLworc3RhdGljIGludCByZWFkX2ZyYW1lX2RhdGEoQUxTRGVjQ29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgcmFfZnJhbWUpCit7CisgICAgQUxTU3BlY2lmaWNDb25maWcgKnNjb25mID0gJmN0eC0+c2NvbmY7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ICAgID0gY3R4LT5hdmN0eDsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZjdHgtPmdiOworICAgIHVuc2lnbmVkIGludCBkaXZfYmxvY2tzWzMyXTsgICAgICAgICAgICAgICAgLy8vPCBibG9jayBzaXplcy4KKyAgICB1bnNpZ25lZCBpbnQgYzsKKyAgICB1bnNpZ25lZCBpbnQganNfYmxvY2tzWzJdOworICAgIHVpbnQzMl90IGJzX2luZm8gPSAwOworICAgIGludCByZXQ7CisKKyAgICAvLyBza2lwIHRoZSBzaXplIG9mIHRoZSByYSB1bml0IGlmIHByZXNlbnQgaW4gdGhlIGZyYW1lCisgICAgaWYgKHNjb25mLT5yYV9mbGFnID09IFJBX0ZMQUdfRlJBTUVTICYmIHJhX2ZyYW1lKQorICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgMzIpOworCisgICAgaWYgKHNjb25mLT5tY19jb2RpbmcgJiYgc2NvbmYtPmpvaW50X3N0ZXJlbykgeworICAgICAgICBjdHgtPmpzX3N3aXRjaCA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGFsaWduX2dldF9iaXRzKGdiKTsKKyAgICB9CisKKyAgICBpZiAoIXNjb25mLT5tY19jb2RpbmcgfHwgY3R4LT5qc19zd2l0Y2gpIHsKKyAgICAgICAgaW50IGluZGVwZW5kZW50X2JzID0gIXNjb25mLT5qb2ludF9zdGVyZW87CisKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGF2Y3R4LT5jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICBqc19ibG9ja3NbMF0gPSAwOworICAgICAgICAgICAganNfYmxvY2tzWzFdID0gMDsKKworICAgICAgICAgICAgZ2V0X2Jsb2NrX3NpemVzKGN0eCwgZGl2X2Jsb2NrcywgJmJzX2luZm8pOworCisgICAgICAgICAgICAvLyBpZiBqb2ludF9zdGVyZW8gYW5kIGJsb2NrX3N3aXRjaGluZyBpcyBzZXQsIGluZGVwZW5kZW50IGRlY29kaW5nCisgICAgICAgICAgICAvLyBpcyBzaWduYWxlZCB2aWEgdGhlIGZpcnN0IGJpdCBvZiBic19pbmZvCisgICAgICAgICAgICBpZiAoc2NvbmYtPmpvaW50X3N0ZXJlbyAmJiBzY29uZi0+YmxvY2tfc3dpdGNoaW5nKQorICAgICAgICAgICAgICAgIGlmIChic19pbmZvID4+IDMxKQorICAgICAgICAgICAgICAgICAgICBpbmRlcGVuZGVudF9icyA9IDI7CisKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2hhbm5lbCwgaXQgaGFzIHRvIGJlIGRlY29kZWQgaW5kZXBlbmRlbnRseQorICAgICAgICAgICAgaWYgKGMgPT0gYXZjdHgtPmNoYW5uZWxzIC0gMSkKKyAgICAgICAgICAgICAgICBpbmRlcGVuZGVudF9icyA9IDE7CisKKyAgICAgICAgICAgIGlmIChpbmRlcGVuZGVudF9icykgeworICAgICAgICAgICAgICAgIHJldCA9IGRlY29kZV9ibG9ja3NfaW5kKGN0eCwgcmFfZnJhbWUsIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2X2Jsb2NrcywganNfYmxvY2tzKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBpbmRlcGVuZGVudF9icy0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBkZWNvZGVfYmxvY2tzKGN0eCwgcmFfZnJhbWUsIGMsIGRpdl9ibG9ja3MsIGpzX2Jsb2Nrcyk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgICAgICBjKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHN0b3JlIGNhcnJ5b3ZlciByYXcgc2FtcGxlcworICAgICAgICAgICAgbWVtbW92ZShjdHgtPnJhd19zYW1wbGVzW2NdIC0gc2NvbmYtPm1heF9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5yYXdfc2FtcGxlc1tjXSAtIHNjb25mLT5tYXhfb3JkZXIgKyBzY29uZi0+ZnJhbWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmN0eC0+cmF3X3NhbXBsZXNbY10pICogc2NvbmYtPm1heF9vcmRlcik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBtdWx0aS1jaGFubmVsIGNvZGluZworICAgICAgICBBTFNCbG9ja0RhdGEgICBiZCA9IHsgMCB9OworICAgICAgICBpbnQgICAgICAgICAgICBiLCByZXQ7CisgICAgICAgIGludCAgICAgICAgICAgICpyZXZlcnRlZF9jaGFubmVscyA9IGN0eC0+cmV2ZXJ0ZWRfY2hhbm5lbHM7CisgICAgICAgIHVuc2lnbmVkIGludCAgIG9mZnNldCAgICAgICAgICAgICA9IDA7CisKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGF2Y3R4LT5jaGFubmVsczsgYysrKQorICAgICAgICAgICAgaWYgKGN0eC0+Y2hhbl9kYXRhW2NdIDwgY3R4LT5jaGFuX2RhdGFfYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY2hhbm5lbCBkYXRhLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KHJldmVydGVkX2NoYW5uZWxzLCAwLCBzaXplb2YoKnJldmVydGVkX2NoYW5uZWxzKSAqIGF2Y3R4LT5jaGFubmVscyk7CisKKyAgICAgICAgYmQucmFfYmxvY2sgICAgICAgICA9IHJhX2ZyYW1lOworICAgICAgICBiZC5wcmV2X3Jhd19zYW1wbGVzID0gY3R4LT5wcmV2X3Jhd19zYW1wbGVzOworCisgICAgICAgIGdldF9ibG9ja19zaXplcyhjdHgsIGRpdl9ibG9ja3MsICZic19pbmZvKTsKKworICAgICAgICBmb3IgKGIgPSAwOyBiIDwgY3R4LT5udW1fYmxvY2tzOyBiKyspIHsKKyAgICAgICAgICAgIGJkLmJsb2NrX2xlbmd0aCA9IGRpdl9ibG9ja3NbYl07CisgICAgICAgICAgICBpZiAoYmQuYmxvY2tfbGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJsb2NrIGxlbmd0aCAldSBpbiBjaGFubmVsIGRhdGEhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBiZC5ibG9ja19sZW5ndGgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgYXZjdHgtPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgICAgICBiZC5jb25zdF9ibG9jayA9IGN0eC0+Y29uc3RfYmxvY2sgKyBjOworICAgICAgICAgICAgICAgIGJkLnNoaWZ0X2xzYnMgID0gY3R4LT5zaGlmdF9sc2JzICsgYzsKKyAgICAgICAgICAgICAgICBiZC5vcHRfb3JkZXIgICA9IGN0eC0+b3B0X29yZGVyICsgYzsKKyAgICAgICAgICAgICAgICBiZC5zdG9yZV9wcmV2X3NhbXBsZXMgPSBjdHgtPnN0b3JlX3ByZXZfc2FtcGxlcyArIGM7CisgICAgICAgICAgICAgICAgYmQudXNlX2x0cCAgICAgPSBjdHgtPnVzZV9sdHAgKyBjOworICAgICAgICAgICAgICAgIGJkLmx0cF9sYWcgICAgID0gY3R4LT5sdHBfbGFnICsgYzsKKyAgICAgICAgICAgICAgICBiZC5sdHBfZ2FpbiAgICA9IGN0eC0+bHRwX2dhaW5bY107CisgICAgICAgICAgICAgICAgYmQubHBjX2NvZiAgICAgPSBjdHgtPmxwY19jb2ZbY107CisgICAgICAgICAgICAgICAgYmQucXVhbnRfY29mICAgPSBjdHgtPnF1YW50X2NvZltjXTsKKyAgICAgICAgICAgICAgICBiZC5yYXdfc2FtcGxlcyA9IGN0eC0+cmF3X3NhbXBsZXNbY10gKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgYmQucmF3X290aGVyICAgPSBOVUxMOworCisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSByZWFkX2Jsb2NrKGN0eCwgJmJkKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gcmVhZF9jaGFubmVsX2RhdGEoY3R4LCBjdHgtPmNoYW5fZGF0YVtjXSwgYykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGF2Y3R4LT5jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcmV2ZXJ0X2NoYW5uZWxfY29ycmVsYXRpb24oY3R4LCAmYmQsIGN0eC0+Y2hhbl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVydGVkX2NoYW5uZWxzLCBvZmZzZXQsIGMpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGF2Y3R4LT5jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICAgICAgYmQuY29uc3RfYmxvY2sgPSBjdHgtPmNvbnN0X2Jsb2NrICsgYzsKKyAgICAgICAgICAgICAgICBiZC5zaGlmdF9sc2JzICA9IGN0eC0+c2hpZnRfbHNicyArIGM7CisgICAgICAgICAgICAgICAgYmQub3B0X29yZGVyICAgPSBjdHgtPm9wdF9vcmRlciArIGM7CisgICAgICAgICAgICAgICAgYmQuc3RvcmVfcHJldl9zYW1wbGVzID0gY3R4LT5zdG9yZV9wcmV2X3NhbXBsZXMgKyBjOworICAgICAgICAgICAgICAgIGJkLnVzZV9sdHAgICAgID0gY3R4LT51c2VfbHRwICsgYzsKKyAgICAgICAgICAgICAgICBiZC5sdHBfbGFnICAgICA9IGN0eC0+bHRwX2xhZyArIGM7CisgICAgICAgICAgICAgICAgYmQubHRwX2dhaW4gICAgPSBjdHgtPmx0cF9nYWluW2NdOworICAgICAgICAgICAgICAgIGJkLmxwY19jb2YgICAgID0gY3R4LT5scGNfY29mW2NdOworICAgICAgICAgICAgICAgIGJkLnF1YW50X2NvZiAgID0gY3R4LT5xdWFudF9jb2ZbY107CisgICAgICAgICAgICAgICAgYmQucmF3X3NhbXBsZXMgPSBjdHgtPnJhd19zYW1wbGVzW2NdICsgb2Zmc2V0OworCisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfYmxvY2soY3R4LCAmYmQpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbXNldChyZXZlcnRlZF9jaGFubmVscywgMCwgYXZjdHgtPmNoYW5uZWxzICogc2l6ZW9mKCpyZXZlcnRlZF9jaGFubmVscykpOworICAgICAgICAgICAgb2Zmc2V0ICAgICAgKz0gZGl2X2Jsb2Nrc1tiXTsKKyAgICAgICAgICAgIGJkLnJhX2Jsb2NrICA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBzdG9yZSBjYXJyeW92ZXIgcmF3IHNhbXBsZXMKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGF2Y3R4LT5jaGFubmVsczsgYysrKQorICAgICAgICAgICAgbWVtbW92ZShjdHgtPnJhd19zYW1wbGVzW2NdIC0gc2NvbmYtPm1heF9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5yYXdfc2FtcGxlc1tjXSAtIHNjb25mLT5tYXhfb3JkZXIgKyBzY29uZi0+ZnJhbWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmN0eC0+cmF3X3NhbXBsZXNbY10pICogc2NvbmYtPm1heF9vcmRlcik7CisgICAgfQorCisgICAgLy8gVE9ETzogcmVhZF9kaWZmX2Zsb2F0X2RhdGEKKworICAgIHJldHVybiAwOworfQorCisKKy8qKiBEZWNvZGUgYW4gQUxTIGZyYW1lLgorICovCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBTFNEZWNDb250ZXh0ICpjdHggICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lICAgICAgICAgICA9IGRhdGE7CisgICAgQUxTU3BlY2lmaWNDb25maWcgKnNjb25mID0gJmN0eC0+c2NvbmY7CisgICAgY29uc3QgdWludDhfdCAqYnVmZmVyICAgID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1ZmZlcl9zaXplICAgICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgaW50IGludmFsaWRfZnJhbWUsIHJldDsKKyAgICB1bnNpZ25lZCBpbnQgYywgc2FtcGxlLCByYV9mcmFtZSwgYnl0ZXNfcmVhZCwgc2hpZnQ7CisKKyAgICBpbml0X2dldF9iaXRzKCZjdHgtPmdiLCBidWZmZXIsIGJ1ZmZlcl9zaXplICogOCk7CisKKyAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHJhbmRvbSBhY2Nlc3MgZnJhbWVzIGlzIHNldCB0byB6ZXJvCisgICAgLy8gKHNjb25mLT5yYV9kaXN0YW5jZSA9PSAwKSBubyBmcmFtZSBpcyB0cmVhdGVkIGFzIGEgcmFuZG9tIGFjY2VzcyBmcmFtZS4KKyAgICAvLyBGb3IgdGhlIGZpcnN0IGZyYW1lLCBpZiBwcmVkaWN0aW9uIGlzIHVzZWQsIGFsbCBzYW1wbGVzIHVzZWQgZnJvbSB0aGUKKyAgICAvLyBwcmV2aW91cyBmcmFtZSBhcmUgYXNzdW1lZCB0byBiZSB6ZXJvLgorICAgIHJhX2ZyYW1lID0gc2NvbmYtPnJhX2Rpc3RhbmNlICYmICEoY3R4LT5mcmFtZV9pZCAlIHNjb25mLT5yYV9kaXN0YW5jZSk7CisKKyAgICAvLyB0aGUgbGFzdCBmcmFtZSB0byBkZWNvZGUgbWlnaHQgaGF2ZSBhIGRpZmZlcmVudCBsZW5ndGgKKyAgICBpZiAoc2NvbmYtPnNhbXBsZXMgIT0gMHhGRkZGRkZGRikKKyAgICAgICAgY3R4LT5jdXJfZnJhbWVfbGVuZ3RoID0gRkZNSU4oc2NvbmYtPnNhbXBsZXMgLSBjdHgtPmZyYW1lX2lkICogKHVpbnQ2NF90KSBzY29uZi0+ZnJhbWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29uZi0+ZnJhbWVfbGVuZ3RoKTsKKyAgICBlbHNlCisgICAgICAgIGN0eC0+Y3VyX2ZyYW1lX2xlbmd0aCA9IHNjb25mLT5mcmFtZV9sZW5ndGg7CisKKyAgICAvLyBkZWNvZGUgdGhlIGZyYW1lIGRhdGEKKyAgICBpZiAoKGludmFsaWRfZnJhbWUgPSByZWFkX2ZyYW1lX2RhdGEoY3R4LCByYV9mcmFtZSkpIDwgMCkKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlJlYWRpbmcgZnJhbWUgZGF0YSBmYWlsZWQuIFNraXBwaW5nIFJBIHVuaXQuXG4iKTsKKworICAgIGN0eC0+ZnJhbWVfaWQrKzsKKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBjdHgtPmN1cl9mcmFtZV9sZW5ndGg7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8vIHRyYW5zZm9ybSBkZWNvZGVkIGZyYW1lIGludG8gb3V0cHV0IGZvcm1hdAorICAgICNkZWZpbmUgSU5URVJMRUFWRV9PVVRQVVQoYnBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCMjYnBzIyNfdCAqZGVzdCA9IChpbnQjI2JwcyMjX3QqKWZyYW1lLT5kYXRhWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzaGlmdCA9IGJwcyAtIGN0eC0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFjdHgtPmNzX3N3aXRjaCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGN0eC0+Y3VyX2ZyYW1lX2xlbmd0aDsgc2FtcGxlKyspICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBhdmN0eC0+Y2hhbm5lbHM7IGMrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGN0eC0+cmF3X3NhbXBsZXNbY11bc2FtcGxlXSA8PCBzaGlmdDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBjdHgtPmN1cl9mcmFtZV9sZW5ndGg7IHNhbXBsZSsrKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgYXZjdHgtPmNoYW5uZWxzOyBjKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjdHgtPnJhd19zYW1wbGVzW3Njb25mLT5jaGFuX3Bvc1tjXV1bc2FtcGxlXSA8PCBzaGlmdDsgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyAgICBpZiAoY3R4LT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA8PSAxNikgeworICAgICAgICBJTlRFUkxFQVZFX09VVFBVVCgxNikKKyAgICB9IGVsc2UgeworICAgICAgICBJTlRFUkxFQVZFX09VVFBVVCgzMikKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgQ1JDCisgICAgaWYgKHNjb25mLT5jcmNfZW5hYmxlZCAmJiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9DUkNDSEVDS3xBVl9FRl9DQVJFRlVMKSkpIHsKKyAgICAgICAgaW50IHN3YXAgPSBIQVZFX0JJR0VORElBTiAhPSBzY29uZi0+bXNiX2ZpcnN0OworCisgICAgICAgIGlmIChjdHgtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDI0KSB7CisgICAgICAgICAgICBpbnQzMl90ICpzcmMgPSAoaW50MzJfdCAqKWZyYW1lLT5kYXRhWzBdOworCisgICAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7CisgICAgICAgICAgICAgICAgIHNhbXBsZSA8IGN0eC0+Y3VyX2ZyYW1lX2xlbmd0aCAqIGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgICAgICAgICAgc2FtcGxlKyspIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHY7CisKKyAgICAgICAgICAgICAgICBpZiAoc3dhcCkKKyAgICAgICAgICAgICAgICAgICAgdiA9IGF2X2Jzd2FwMzIoc3JjW3NhbXBsZV0pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdiA9IHNyY1tzYW1wbGVdOworICAgICAgICAgICAgICAgIGlmICghSEFWRV9CSUdFTkRJQU4pCisgICAgICAgICAgICAgICAgICAgIHYgPj49IDg7CisKKyAgICAgICAgICAgICAgICBjdHgtPmNyYyA9IGF2X2NyYyhjdHgtPmNyY190YWJsZSwgY3R4LT5jcmMsICh1aW50OF90KikoJnYpLCAzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmNyY19zb3VyY2U7CisKKyAgICAgICAgICAgIGlmIChzd2FwKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPD0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjICA9IChpbnQxNl90KikgZnJhbWUtPmRhdGFbMF07CisgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3QgPSAoaW50MTZfdCopIGN0eC0+Y3JjX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzYW1wbGUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSA8IGN0eC0+Y3VyX2ZyYW1lX2xlbmd0aCAqIGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBhdl9ic3dhcDE2KHNyY1tzYW1wbGVdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjdHgtPmJkc3AuYnN3YXBfYnVmKCh1aW50MzJfdCAqKSBjdHgtPmNyY19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopIGZyYW1lLT5kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3VyX2ZyYW1lX2xlbmd0aCAqIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNyY19zb3VyY2UgPSBjdHgtPmNyY19idWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNyY19zb3VyY2UgPSBmcmFtZS0+ZGF0YVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3R4LT5jcmMgPSBhdl9jcmMoY3R4LT5jcmNfdGFibGUsIGN0eC0+Y3JjLCBjcmNfc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5jdXJfZnJhbWVfbGVuZ3RoICogYXZjdHgtPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGF2Y3R4LT5zYW1wbGVfZm10KSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIGNoZWNrIENSQyBzdW1zIGlmIHRoaXMgaXMgdGhlIGxhc3QgZnJhbWUKKyAgICAgICAgaWYgKGN0eC0+Y3VyX2ZyYW1lX2xlbmd0aCAhPSBzY29uZi0+ZnJhbWVfbGVuZ3RoICYmCisgICAgICAgICAgICBjdHgtPmNyY19vcmcgIT0gY3R4LT5jcmMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ1JDIGVycm9yLlxuIik7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICBieXRlc19yZWFkID0gaW52YWxpZF9mcmFtZSA/IGJ1ZmZlcl9zaXplIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfYml0c19jb3VudCgmY3R4LT5nYikgKyA3KSA+PiAzOworCisgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKKworLyoqIFVuaW5pdGlhbGl6ZSB0aGUgQUxTIGRlY29kZXIuCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBTFNEZWNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmN0eC0+c2NvbmYuY2hhbl9wb3MpOworCisgICAgZmZfYmdtY19lbmQoJmN0eC0+YmdtY19sdXQsICZjdHgtPmJnbWNfbHV0X3N0YXR1cyk7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5jb25zdF9ibG9jayk7CisgICAgYXZfZnJlZXAoJmN0eC0+c2hpZnRfbHNicyk7CisgICAgYXZfZnJlZXAoJmN0eC0+b3B0X29yZGVyKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5zdG9yZV9wcmV2X3NhbXBsZXMpOworICAgIGF2X2ZyZWVwKCZjdHgtPnVzZV9sdHApOworICAgIGF2X2ZyZWVwKCZjdHgtPmx0cF9sYWcpOworICAgIGF2X2ZyZWVwKCZjdHgtPmx0cF9nYWluKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5sdHBfZ2Fpbl9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZjdHgtPnF1YW50X2NvZik7CisgICAgYXZfZnJlZXAoJmN0eC0+bHBjX2NvZik7CisgICAgYXZfZnJlZXAoJmN0eC0+cXVhbnRfY29mX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJmN0eC0+bHBjX2NvZl9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZjdHgtPmxwY19jb2ZfcmV2ZXJzZWRfYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5wcmV2X3Jhd19zYW1wbGVzKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5yYXdfc2FtcGxlcyk7CisgICAgYXZfZnJlZXAoJmN0eC0+cmF3X2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJmN0eC0+Y2hhbl9kYXRhKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5jaGFuX2RhdGFfYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5yZXZlcnRlZF9jaGFubmVscyk7CisgICAgYXZfZnJlZXAoJmN0eC0+Y3JjX2J1ZmZlcik7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKiogSW5pdGlhbGl6ZSB0aGUgQUxTIGRlY29kZXIuCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgdW5zaWduZWQgaW50IGM7CisgICAgdW5zaWduZWQgaW50IGNoYW5uZWxfc2l6ZTsKKyAgICBpbnQgbnVtX2J1ZmZlcnMsIHJldDsKKyAgICBBTFNEZWNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFMU1NwZWNpZmljQ29uZmlnICpzY29uZiA9ICZjdHgtPnNjb25mOworICAgIGN0eC0+YXZjdHggPSBhdmN0eDsKKworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgcmVxdWlyZWQgQUxTIGV4dHJhZGF0YS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHJlYWRfc3BlY2lmaWNfY29uZmlnKGN0eCkpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlJlYWRpbmcgQUxTU3BlY2lmaWNDb25maWcgZmFpbGVkLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGNoZWNrX3NwZWNpZmljX2NvbmZpZyhjdHgpKSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChzY29uZi0+YmdtYykgeworICAgICAgICByZXQgPSBmZl9iZ21jX2luaXQoYXZjdHgsICZjdHgtPmJnbWNfbHV0LCAmY3R4LT5iZ21jX2x1dF9zdGF0dXMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKHNjb25mLT5mbG9hdGluZykgeworICAgICAgICBhdmN0eC0+c2FtcGxlX2ZtdCAgICAgICAgICA9IEFWX1NBTVBMRV9GTVRfRkxUOworICAgICAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDMyOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ICAgICAgICAgID0gc2NvbmYtPnJlc29sdXRpb24gPiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVl9TQU1QTEVfRk1UX1MzMiA6IEFWX1NBTVBMRV9GTVRfUzE2OworICAgICAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IChzY29uZi0+cmVzb2x1dGlvbiArIDEpICogODsKKyAgICB9CisKKyAgICAvLyBzZXQgbWF4aW11bSBSaWNlIHBhcmFtZXRlciBmb3IgcHJvZ3Jlc3NpdmUgZGVjb2RpbmcgYmFzZWQgb24gcmVzb2x1dGlvbgorICAgIC8vIFRoaXMgaXMgbm90IHNwZWNpZmllZCBpbiAxNDQ5Ni0zIGJ1dCBhY3R1YWxseSBkb25lIGJ5IHRoZSByZWZlcmVuY2UKKyAgICAvLyBjb2RlYyBSTTIyIHJldmlzaW9uIDIuCisgICAgY3R4LT5zX21heCA9IHNjb25mLT5yZXNvbHV0aW9uID4gMSA/IDMxIDogMTU7CisKKyAgICAvLyBzZXQgbGFnIHZhbHVlIGZvciBsb25nLXRlcm0gcHJlZGljdGlvbgorICAgIGN0eC0+bHRwX2xhZ19sZW5ndGggPSA4ICsgKGF2Y3R4LT5zYW1wbGVfcmF0ZSA+PSAgOTYwMDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmN0eC0+c2FtcGxlX3JhdGUgPj0gMTkyMDAwKTsKKworICAgIC8vIGFsbG9jYXRlIHF1YW50aXplZCBwYXJjb3IgY29lZmZpY2llbnQgYnVmZmVyCisgICAgbnVtX2J1ZmZlcnMgPSBzY29uZi0+bWNfY29kaW5nID8gYXZjdHgtPmNoYW5uZWxzIDogMTsKKworICAgIGN0eC0+cXVhbnRfY29mICAgICAgICA9IGF2X21hbGxvYyhzaXplb2YoKmN0eC0+cXVhbnRfY29mKSAqIG51bV9idWZmZXJzKTsKKyAgICBjdHgtPmxwY19jb2YgICAgICAgICAgPSBhdl9tYWxsb2Moc2l6ZW9mKCpjdHgtPmxwY19jb2YpICAgKiBudW1fYnVmZmVycyk7CisgICAgY3R4LT5xdWFudF9jb2ZfYnVmZmVyID0gYXZfbWFsbG9jKHNpemVvZigqY3R4LT5xdWFudF9jb2ZfYnVmZmVyKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9idWZmZXJzICogc2NvbmYtPm1heF9vcmRlcik7CisgICAgY3R4LT5scGNfY29mX2J1ZmZlciAgID0gYXZfbWFsbG9jKHNpemVvZigqY3R4LT5scGNfY29mX2J1ZmZlcikgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYnVmZmVycyAqIHNjb25mLT5tYXhfb3JkZXIpOworICAgIGN0eC0+bHBjX2NvZl9yZXZlcnNlZF9idWZmZXIgPSBhdl9tYWxsb2Moc2l6ZW9mKCpjdHgtPmxwY19jb2ZfYnVmZmVyKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29uZi0+bWF4X29yZGVyKTsKKworICAgIGlmICghY3R4LT5xdWFudF9jb2YgICAgICAgICAgICAgIHx8ICFjdHgtPmxwY19jb2YgICAgICAgIHx8CisgICAgICAgICFjdHgtPnF1YW50X2NvZl9idWZmZXIgICAgICAgfHwgIWN0eC0+bHBjX2NvZl9idWZmZXIgfHwKKyAgICAgICAgIWN0eC0+bHBjX2NvZl9yZXZlcnNlZF9idWZmZXIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBbGxvY2F0aW5nIGJ1ZmZlciBtZW1vcnkgZmFpbGVkLlxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8vIGFzc2lnbiBxdWFudGl6ZWQgcGFyY29yIGNvZWZmaWNpZW50IGJ1ZmZlcnMKKyAgICBmb3IgKGMgPSAwOyBjIDwgbnVtX2J1ZmZlcnM7IGMrKykgeworICAgICAgICBjdHgtPnF1YW50X2NvZltjXSA9IGN0eC0+cXVhbnRfY29mX2J1ZmZlciArIGMgKiBzY29uZi0+bWF4X29yZGVyOworICAgICAgICBjdHgtPmxwY19jb2ZbY10gICA9IGN0eC0+bHBjX2NvZl9idWZmZXIgICArIGMgKiBzY29uZi0+bWF4X29yZGVyOworICAgIH0KKworICAgIC8vIGFsbG9jYXRlIGFuZCBhc3NpZ24gbGFnIGFuZCBnYWluIGRhdGEgYnVmZmVyIGZvciBsdHAgbW9kZQorICAgIGN0eC0+Y29uc3RfYmxvY2sgICAgID0gYXZfbWFsbG9jIChzaXplb2YoKmN0eC0+Y29uc3RfYmxvY2spICogbnVtX2J1ZmZlcnMpOworICAgIGN0eC0+c2hpZnRfbHNicyAgICAgID0gYXZfbWFsbG9jIChzaXplb2YoKmN0eC0+c2hpZnRfbHNicykgICogbnVtX2J1ZmZlcnMpOworICAgIGN0eC0+b3B0X29yZGVyICAgICAgID0gYXZfbWFsbG9jIChzaXplb2YoKmN0eC0+b3B0X29yZGVyKSAgICogbnVtX2J1ZmZlcnMpOworICAgIGN0eC0+c3RvcmVfcHJldl9zYW1wbGVzID0gYXZfbWFsbG9jKHNpemVvZigqY3R4LT5zdG9yZV9wcmV2X3NhbXBsZXMpICogbnVtX2J1ZmZlcnMpOworICAgIGN0eC0+dXNlX2x0cCAgICAgICAgID0gYXZfbWFsbG9jeihzaXplb2YoKmN0eC0+dXNlX2x0cCkgICogbnVtX2J1ZmZlcnMpOworICAgIGN0eC0+bHRwX2xhZyAgICAgICAgID0gYXZfbWFsbG9jIChzaXplb2YoKmN0eC0+bHRwX2xhZykgICogbnVtX2J1ZmZlcnMpOworICAgIGN0eC0+bHRwX2dhaW4gICAgICAgID0gYXZfbWFsbG9jIChzaXplb2YoKmN0eC0+bHRwX2dhaW4pICogbnVtX2J1ZmZlcnMpOworICAgIGN0eC0+bHRwX2dhaW5fYnVmZmVyID0gYXZfbWFsbG9jIChzaXplb2YoKmN0eC0+bHRwX2dhaW5fYnVmZmVyKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9idWZmZXJzICogNSk7CisKKyAgICBpZiAoIWN0eC0+Y29uc3RfYmxvY2sgfHwgIWN0eC0+c2hpZnRfbHNicyB8fAorICAgICAgICAhY3R4LT5vcHRfb3JkZXIgfHwgIWN0eC0+c3RvcmVfcHJldl9zYW1wbGVzIHx8CisgICAgICAgICFjdHgtPnVzZV9sdHAgIHx8ICFjdHgtPmx0cF9sYWcgfHwKKyAgICAgICAgIWN0eC0+bHRwX2dhaW4gfHwgIWN0eC0+bHRwX2dhaW5fYnVmZmVyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQWxsb2NhdGluZyBidWZmZXIgbWVtb3J5IGZhaWxlZC5cbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgbnVtX2J1ZmZlcnM7IGMrKykKKyAgICAgICAgY3R4LT5sdHBfZ2FpbltjXSA9IGN0eC0+bHRwX2dhaW5fYnVmZmVyICsgYyAqIDU7CisKKyAgICAvLyBhbGxvY2F0ZSBhbmQgYXNzaWduIGNoYW5uZWwgZGF0YSBidWZmZXIgZm9yIG1jYyBtb2RlCisgICAgaWYgKHNjb25mLT5tY19jb2RpbmcpIHsKKyAgICAgICAgY3R4LT5jaGFuX2RhdGFfYnVmZmVyICA9IGF2X21hbGxvYyhzaXplb2YoKmN0eC0+Y2hhbl9kYXRhX2J1ZmZlcikgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9idWZmZXJzICogbnVtX2J1ZmZlcnMpOworICAgICAgICBjdHgtPmNoYW5fZGF0YSAgICAgICAgID0gYXZfbWFsbG9jKHNpemVvZigqY3R4LT5jaGFuX2RhdGEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYnVmZmVycyk7CisgICAgICAgIGN0eC0+cmV2ZXJ0ZWRfY2hhbm5lbHMgPSBhdl9tYWxsb2Moc2l6ZW9mKCpjdHgtPnJldmVydGVkX2NoYW5uZWxzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2J1ZmZlcnMpOworCisgICAgICAgIGlmICghY3R4LT5jaGFuX2RhdGFfYnVmZmVyIHx8ICFjdHgtPmNoYW5fZGF0YSB8fCAhY3R4LT5yZXZlcnRlZF9jaGFubmVscykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBbGxvY2F0aW5nIGJ1ZmZlciBtZW1vcnkgZmFpbGVkLlxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgbnVtX2J1ZmZlcnM7IGMrKykKKyAgICAgICAgICAgIGN0eC0+Y2hhbl9kYXRhW2NdID0gY3R4LT5jaGFuX2RhdGFfYnVmZmVyICsgYyAqIG51bV9idWZmZXJzOworICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+Y2hhbl9kYXRhICAgICAgICAgPSBOVUxMOworICAgICAgICBjdHgtPmNoYW5fZGF0YV9idWZmZXIgID0gTlVMTDsKKyAgICAgICAgY3R4LT5yZXZlcnRlZF9jaGFubmVscyA9IE5VTEw7CisgICAgfQorCisgICAgY2hhbm5lbF9zaXplICAgICAgPSBzY29uZi0+ZnJhbWVfbGVuZ3RoICsgc2NvbmYtPm1heF9vcmRlcjsKKworICAgIGN0eC0+cHJldl9yYXdfc2FtcGxlcyA9IGF2X21hbGxvYyAoc2l6ZW9mKCpjdHgtPnByZXZfcmF3X3NhbXBsZXMpICogc2NvbmYtPm1heF9vcmRlcik7CisgICAgY3R4LT5yYXdfYnVmZmVyICAgICAgID0gYXZfbWFsbG9jeihzaXplb2YoKmN0eC0+ICAgICByYXdfYnVmZmVyKSAgKiBhdmN0eC0+Y2hhbm5lbHMgKiBjaGFubmVsX3NpemUpOworICAgIGN0eC0+cmF3X3NhbXBsZXMgICAgICA9IGF2X21hbGxvYyAoc2l6ZW9mKCpjdHgtPiAgICAgcmF3X3NhbXBsZXMpICogYXZjdHgtPmNoYW5uZWxzKTsKKworICAgIC8vIGFsbG9jYXRlIHByZXZpb3VzIHJhdyBzYW1wbGUgYnVmZmVyCisgICAgaWYgKCFjdHgtPnByZXZfcmF3X3NhbXBsZXMgfHwgIWN0eC0+cmF3X2J1ZmZlcnx8ICFjdHgtPnJhd19zYW1wbGVzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQWxsb2NhdGluZyBidWZmZXIgbWVtb3J5IGZhaWxlZC5cbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvLyBhc3NpZ24gcmF3IHNhbXBsZXMgYnVmZmVycworICAgIGN0eC0+cmF3X3NhbXBsZXNbMF0gPSBjdHgtPnJhd19idWZmZXIgKyBzY29uZi0+bWF4X29yZGVyOworICAgIGZvciAoYyA9IDE7IGMgPCBhdmN0eC0+Y2hhbm5lbHM7IGMrKykKKyAgICAgICAgY3R4LT5yYXdfc2FtcGxlc1tjXSA9IGN0eC0+cmF3X3NhbXBsZXNbYyAtIDFdICsgY2hhbm5lbF9zaXplOworCisgICAgLy8gYWxsb2NhdGUgY3JjIGJ1ZmZlcgorICAgIGlmIChIQVZFX0JJR0VORElBTiAhPSBzY29uZi0+bXNiX2ZpcnN0ICYmIHNjb25mLT5jcmNfZW5hYmxlZCAmJgorICAgICAgICAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9DUkNDSEVDS3xBVl9FRl9DQVJFRlVMKSkpIHsKKyAgICAgICAgY3R4LT5jcmNfYnVmZmVyID0gYXZfbWFsbG9jKHNpemVvZigqY3R4LT5jcmNfYnVmZmVyKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmN1cl9mcmFtZV9sZW5ndGggKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGF2Y3R4LT5zYW1wbGVfZm10KSk7CisgICAgICAgIGlmICghY3R4LT5jcmNfYnVmZmVyKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkFsbG9jYXRpbmcgYnVmZmVyIG1lbW9yeSBmYWlsZWQuXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZmX2Jzd2FwZHNwX2luaXQoJmN0eC0+YmRzcCk7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBkZWNvZGVfZW5kKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKiBGbHVzaCAocmVzZXQpIHRoZSBmcmFtZSBJRCBhZnRlciBzZWVraW5nLgorICovCitzdGF0aWMgYXZfY29sZCB2b2lkIGZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBTFNEZWNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgY3R4LT5mcmFtZV9pZCA9IDA7Cit9CisKKworQVZDb2RlYyBmZl9hbHNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYWxzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy00IEF1ZGlvIExvc3NsZXNzIENvZGluZyAoQUxTKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDRBTFMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFMU0RlY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9TVUJGUkFNRVMgfCBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2Ftci5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYW1yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjNzNhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Ftci5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBTaGFyZWQgZnVuY3Rpb25zIGJldHdlZW4gQU1SIGNvZGVjcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYXJjZWxvIEdhbHZhbyBQb3ZvYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQU1SX0gKKyNkZWZpbmUgQVZDT0RFQ19BTVJfSAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKKyNpZmRlZiBBTVJfVVNFXzE2QklUX1RBQkxFUworI2RlZmluZSBSX1RBQkxFX1RZUEUgdWludDE2X3QKKyNlbHNlCisjZGVmaW5lIFJfVEFCTEVfVFlQRSB1aW50OF90CisjZW5kaWYKKworLyoqCisgKiBGaWxsIHRoZSBmcmFtZSBzdHJ1Y3R1cmUgdmFyaWFibGVzIGZyb20gYml0c3RyZWFtIGJ5IHBhcnNpbmcgdGhlCisgKiBnaXZlbiByZW9yZGVyaW5nIHRhYmxlIHRoYXQgdXNlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAqCisgKiBFYWNoIGZpZWxkICgxNiBiaXRzKSBpbiB0aGUgQU1SIEZyYW1lIGlzIHN0b3JlZCBhczoKKyAqIC0gb25lIGJ5dGUgZm9yIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgZmllbGQKKyAqIC0gb25lIGJ5dGUgZm9yIHRoZSBmaWVsZCBpbmRleAorICogLSB0aGVuLCBvbmUgYnl0ZSBmb3IgZWFjaCBiaXQgb2YgdGhlIGZpZWxkIChmcm9tIG1vc3Qtc2lnbmlmaWNhbnQgdG8gbGVhc3QpCisgKiAgICAgICAgIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGF0IGJpdCBpbiB0aGUgQU1SIGZyYW1lLgorICoKKyAqIEBwYXJhbSBvdXQgcG9pbnRlciB0byB0aGUgZnJhbWUgc3RydWN0CisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZnJhbWUgc3RydWN0CisgKiBAcGFyYW0gZGF0YSBpbnB1dCBiaXRzdHJlYW0gYWZ0ZXIgdGhlIGZyYW1lIGhlYWRlcgorICogQHBhcmFtIG9yZF90YWJsZSB0aGUgcmVvcmRlcmluZyB0YWJsZSBhcyBhYm92ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmZfYW1yX2JpdF9yZW9yZGVyKHVpbnQxNl90ICpvdXQsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSX1RBQkxFX1RZUEUgKm9yZF90YWJsZSkKK3sKKyAgICBpbnQgZmllbGRfc2l6ZTsKKworICAgIG1lbXNldChvdXQsIDAsIHNpemUpOworICAgIHdoaWxlICgoZmllbGRfc2l6ZSA9ICpvcmRfdGFibGUrKykpIHsKKyAgICAgICAgaW50IGZpZWxkID0gMDsKKyAgICAgICAgaW50IGZpZWxkX29mZnNldCA9ICpvcmRfdGFibGUrKzsKKyAgICAgICAgd2hpbGUgKGZpZWxkX3NpemUtLSkgeworICAgICAgICAgICBpbnQgYml0ID0gKm9yZF90YWJsZSsrOworICAgICAgICAgICBmaWVsZCA8PD0gMTsKKyAgICAgICAgICAgZmllbGQgfD0gZGF0YVtiaXQgPj4gM10gPj4gKGJpdCAmIDcpICYgMTsKKyAgICAgICAgfQorICAgICAgICBvdXRbZmllbGRfb2Zmc2V0ID4+IDFdID0gZmllbGQ7CisgICAgfQorfQorCisjZW5kaWYgLyogQVZDT0RFQ19BTVJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYW1ybmJkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hbXJuYmRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzVmZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYW1ybmJkYXRhLmgKQEAgLTAsMCArMSwxNjcxIEBACisvKgorICogQU1SIG5hcnJvd2JhbmQgZGF0YSBhbmQgZGVmaW5pdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IFJvYmVydCBTd2FpbgorICogQ29weXJpZ2h0IChjKSAyMDA5IENvbGluIE1jUXVpbGxhbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisKKy8qKgorICogQGZpbGUKKyAqIEFNUiBuYXJyb3diYW5kIGRhdGEgYW5kIGRlZmluaXRpb25zCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FNUk5CREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfQU1STkJEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIiAgICAgIC8qIG9mZnNldG9mICovCisKKyNkZWZpbmUgQU1SX1NVQkZSQU1FX1NJWkUgICAgICAgICAgICA0MCAgIC8vLzwgc2FtcGxlcyBwZXIgc3ViZnJhbWUKKworLyoqIEZyYW1lIHR5cGUgKFRhYmxlIDFhIGluIDNHUFAgVFMgMjYuMTAxKSAqLworZW51bSBNb2RlIHsKKyAgICBNT0RFXzRrNzUgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgNC43NSBrYml0L3MKKyAgICBNT0RFXzVrMTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgNS4xNSBrYml0L3MKKyAgICBNT0RFXzVrOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgNS45MCBrYml0L3MKKyAgICBNT0RFXzZrNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgNi43MCBrYml0L3MKKyAgICBNT0RFXzdrNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgNy40MCBrYml0L3MKKyAgICBNT0RFXzdrOTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgNy45NSBrYml0L3MKKyAgICBNT0RFXzEwazIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMTAuMiBrYml0L3MKKyAgICBNT0RFXzEyazIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMTIuMiBrYml0L3MKKyAgICBNT0RFX0RUWCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc2lsZW50IGZyYW1lCisgICAgTl9NT0RFUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBtb2RlcworICAgIE5PX0RBVEEgPSAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBubyB0cmFuc21pc3Npb24KK307CisKKyNkZWZpbmUgTFBfRklMVEVSX09SREVSIDEwICAgICAgICAvLy88IGxpbmVhciBwcmVkaWN0aXZlIGNvZGluZyBmaWx0ZXIgb3JkZXIKKworLyoqCisgKiBBTVJOQiB1bnBhY2tlZCBkYXRhIHN1YmZyYW1lCisgKi8KK3R5cGVkZWYgc3RydWN0IEFNUk5CU3ViZnJhbWUgeworICAgIHVpbnQxNl90IHBfbGFnOyAgICAgIC8vLzwgaW5kZXggdG8gZGVjb2RlIHRoZSBwaXRjaCBsYWcKKyAgICB1aW50MTZfdCBwX2dhaW47ICAgICAvLy88IGluZGV4IHRvIGRlY29kZSB0aGUgcGl0Y2ggZ2FpbgorICAgIHVpbnQxNl90IGZpeGVkX2dhaW47IC8vLzwgaW5kZXggdG8gZGVjb2RlIHRoZSBmaXhlZCBnYWluIGZhY3RvciwgZm9yIE1PREVfMTJrMiBhbmQgTU9ERV83azk1CisgICAgdWludDE2X3QgcHVsc2VzWzEwXTsgLy8vPCBwdWxzZXM6IDEwIGZvciBNT0RFXzEyazIsIDcgZm9yIE1PREVfMTBrMiwgYW5kIGluZGV4IGFuZCBzaWduIGZvciBvdGhlcnMKK30gQU1STkJTdWJmcmFtZTsKKworLyoqCisgKiBBTVJOQiB1bnBhY2tlZCBkYXRhIGZyYW1lCisgKi8KK3R5cGVkZWYgc3RydWN0IEFNUk5CRnJhbWUgeworICAgIHVpbnQxNl90IGxzZls1XTsgICAgICAgICAgIC8vLzwgbHNmIHBhcmFtZXRlcnM6IDUgcGFyYW1ldGVycyBmb3IgTU9ERV8xMmsyLCBvbmx5IDMgZm9yIG90aGVyIG1vZGVzCisgICAgQU1STkJTdWJmcmFtZSBzdWJmcmFtZVs0XTsgLy8vPCB1bnBhY2tlZCBkYXRhIGZvciBlYWNoIHN1YmZyYW1lCit9IEFNUk5CRnJhbWU7CisKKy8qKiBUaGUgaW5kZXggb2YgYSBmcmFtZSBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgQU1SX0JJVChmaWVsZCkgICAgICAgICAgICAgICAgICAob2Zmc2V0b2YoQU1STkJGcmFtZSwgZmllbGQpKQorLyoqIFRoZSBpbmRleCBvZiBhIHN1YmZyYW1lLXNwZWNpZmljIHBhcmFtZXRlciAqLworI2RlZmluZSBBTVJfT0YoZnJhbWVfbnVtLCB2YXJpYWJsZSkgICAgIEFNUl9CSVQoc3ViZnJhbWVbZnJhbWVfbnVtXS52YXJpYWJsZSkKKworLy8gVGhlIGZvbGxvd2luZyBvcmRlciogdGFibGVzIGFyZSB1c2VkIHRvIGNvbnZlcnQgQU1SIGZyYW1lIHBhcmFtZXRlcnMgdG8gYW5kCisvLyBmcm9tIGEgYml0c3RyZWFtLiBTZWUgM0dQUCBUUyAyNi4xMDEgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisvLyBFYWNoIGZpZWxkIGluIEFNUk5CRnJhbWUgaXMgc3RvcmVkIGFzOgorLy8gKiBvbmUgYnl0ZSBmb3IgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaWVsZAorLy8gKiBvbmUgYnl0ZSBmb3IgdGhlIGZpZWxkIGluZGV4CisvLyAqIHRoZW4sIG9uZSBieXRlIGZvciBlYWNoIGJpdCBvZiB0aGUgZmllbGQgKGZyb20gbW9zdC1zaWduaWZpY2FudCB0byBsZWFzdCkKKy8vICAgICAgICAgb2YgdGhlIHBvc2l0aW9uIG9mIHRoYXQgYml0IGluIHRoZSBBTVIgZnJhbWUuCitzdGF0aWMgY29uc3QgdWludDhfdCBvcmRlcl9NT0RFXzRrNzVbXSA9IHsKKyAgICAgOCwgQU1SX0JJVChsc2ZbMF0pLCAgICAgICAgNywgICA2LCAgIDUsICAgNCwgICAzLCAgIDIsICAgMSwgICAwLAorICAgICA4LCBBTVJfQklUKGxzZlsxXSksICAgICAgIDE1LCAgMTQsICAxMywgIDEyLCAgMTEsICAxMCwgICA5LCAgIDgsCisgICAgIDcsIEFNUl9CSVQobHNmWzJdKSwgICAgICAgNTEsICAzNSwgIDM0LCAgNTAsICAzMywgIDQ5LCAgMzIsCisgICAgIDgsIEFNUl9PRigwLHBfbGFnKSwgICAgICAgMjMsICAyMiwgIDIxLCAgMjAsICAxOSwgIDE4LCAgNDMsICA0MiwKKyAgICAgOCwgQU1SX09GKDAscF9nYWluKSwgICAgICA1NCwgIDU1LCAgNDAsICA0MSwgIDI0LCAgMjUsICAyNiwgIDI3LAorICAgICA3LCBBTVJfT0YoMCxwdWxzZXNbMF0pLCAgIDkyLCAgNjgsICA2NywgIDg0LCAgNjYsICA2NSwgIDgwLAorICAgICAyLCBBTVJfT0YoMCxwdWxzZXNbMV0pLCAgIDUzLCAgNTIsCisgICAgIDQsIEFNUl9PRigxLHBfbGFnKSwgICAgICAgMTcsICAxNiwgIDQ4LCAgNjMsCisgICAgIDcsIEFNUl9PRigxLHB1bHNlc1swXSksICAgOTEsICA2NCwgIDc5LCAgODMsICA3OCwgIDc3LCAgOTUsCisgICAgIDIsIEFNUl9PRigxLHB1bHNlc1sxXSksICAgNjIsICA2MSwKKyAgICAgNCwgQU1SX09GKDIscF9sYWcpLCAgICAgICAzMSwgIDMwLCAgNjAsICA1OSwKKyAgICAgOCwgQU1SX09GKDIscF9nYWluKSwgICAgICA0NCwgIDQ1LCAgNDYsICA0NywgIDM2LCAgMzcsICAzOCwgIDM5LAorICAgICA3LCBBTVJfT0YoMixwdWxzZXNbMF0pLCAgIDkwLCAgNzYsICA3NSwgIDgyLCAgNzQsICA3MywgIDk0LAorICAgICAyLCBBTVJfT0YoMixwdWxzZXNbMV0pLCAgIDU4LCAgNTcsCisgICAgIDQsIEFNUl9PRigzLHBfbGFnKSwgICAgICAgMjksICAyOCwgIDU2LCAgNzEsCisgICAgIDcsIEFNUl9PRigzLHB1bHNlc1swXSksICAgODksICA3MiwgIDg3LCAgODEsICA4NiwgIDg1LCAgOTMsCisgICAgIDIsIEFNUl9PRigzLHB1bHNlc1sxXSksICAgNzAsICA2OSwKKyAgICAgMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb3JkZXJfTU9ERV81azE1W10gPSB7CisgICAgIDgsIEFNUl9CSVQobHNmWzBdKSwgICAgICAgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywKKyAgICAgOCwgQU1SX0JJVChsc2ZbMV0pLCAgICAgICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorICAgICA3LCBBTVJfQklUKGxzZlsyXSksICAgICAgIDcwLCAgNTEsICA0MywgIDcxLCAgNTAsICA2MCwgIDQ5LAorICAgICA4LCBBTVJfT0YoMCxwX2xhZyksICAgICAgIDIzLCAgMjIsICAyMSwgIDIwLCAgMTksICA0NywgIDU0LCAgNTksCisgICAgIDYsIEFNUl9PRigwLHBfZ2FpbiksICAgICAgNDgsICA0MiwgIDM1LCAgMjksICAzMCwgIDMxLAorICAgICA3LCBBTVJfT0YoMCxwdWxzZXNbMF0pLCAgIDkyLCAgODQsICA4MiwgMTAwLCAgNzksICA3MiwgIDg4LAorICAgICAyLCBBTVJfT0YoMCxwdWxzZXNbMV0pLCAgIDY3LCAgNjgsCisgICAgIDQsIEFNUl9PRigxLHBfbGFnKSwgICAgICAgMTgsICA0NiwgIDUzLCAgNTgsCisgICAgIDYsIEFNUl9PRigxLHBfZ2FpbiksICAgICAgNjMsICA0MSwgIDM0LCAgMjYsICAyNywgIDI4LAorICAgICA3LCBBTVJfT0YoMSxwdWxzZXNbMF0pLCAgIDkxLCAgODMsICA4MSwgIDk5LCAgNzgsICA4NywgMTAzLAorICAgICAyLCBBTVJfT0YoMSxwdWxzZXNbMV0pLCAgIDY1LCAgNjYsCisgICAgIDQsIEFNUl9PRigyLHBfbGFnKSwgICAgICAgMTcsICA0NSwgIDUyLCAgNTcsCisgICAgIDYsIEFNUl9PRigyLHBfZ2FpbiksICAgICAgNjIsICA0MCwgIDMzLCAgMzksICAyNCwgIDI1LAorICAgICA3LCBBTVJfT0YoMixwdWxzZXNbMF0pLCAgIDkwLCAgODAsICA5NSwgIDk4LCAgNzcsICA4NiwgMTAyLAorICAgICAyLCBBTVJfT0YoMixwdWxzZXNbMV0pLCAgIDc1LCAgNjQsCisgICAgIDQsIEFNUl9PRigzLHBfbGFnKSwgICAgICAgMTYsICA0NCwgIDU2LCAgNjksCisgICAgIDYsIEFNUl9PRigzLHBfZ2FpbiksICAgICAgNjEsICA1NSwgIDMyLCAgMzYsICAzNywgIDM4LAorICAgICA3LCBBTVJfT0YoMyxwdWxzZXNbMF0pLCAgIDg5LCAgOTQsICA5MywgIDk3LCAgNzYsICA4NSwgMTAxLAorICAgICAyLCBBTVJfT0YoMyxwdWxzZXNbMV0pLCAgIDczLCAgNzQsCisgICAgIDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9yZGVyX01PREVfNWs5W10gPSB7CisgICAgIDgsIEFNUl9CSVQobHNmWzBdKSwgICAgICAgIDcsICAgNiwgICAwLCAgIDMsICAgNSwgICA0LCAgIDIsICAgMSwKKyAgICAgOSwgQU1SX0JJVChsc2ZbMV0pLCAgICAgICAxMywgIDEyLCAgIDgsICAxMSwgIDEwLCAgMTUsICAgOSwgIDE0LCAgMjMsCisgICAgIDksIEFNUl9CSVQobHNmWzJdKSwgICAgICAgNzEsICA1NiwgIDYwLCAgNzAsICA1OSwgIDU3LCAgNTgsICA2OSwgIDc2LAorICAgICA4LCBBTVJfT0YoMCxwX2xhZyksICAgICAgIDE2LCAgMTgsICAyMiwgIDIwLCAgMzAsICAzOCwgIDQ0LCAgNDIsCisgICAgIDYsIEFNUl9PRigwLHBfZ2FpbiksICAgICAgNzUsICA0OCwgIDUyLCAgNDAsICAzNCwgIDI2LAorICAgICA5LCBBTVJfT0YoMCxwdWxzZXNbMF0pLCAgMTAxLCAgODksICA5MywgMTE3LCAxMDUsICA4MSwgIDg1LCAxMDksICA5NywKKyAgICAgMiwgQU1SX09GKDAscHVsc2VzWzFdKSwgICA2NywgIDc4LAorICAgICA0LCBBTVJfT0YoMSxwX2xhZyksICAgICAgIDI4LCAgMzYsICA0NiwgIDg3LAorICAgICA2LCBBTVJfT0YoMSxwX2dhaW4pLCAgICAgIDc0LCAgNjMsICA1MSwgIDU1LCAgMzMsICAyNSwKKyAgICAgOSwgQU1SX09GKDEscHVsc2VzWzBdKSwgIDEwMCwgIDg4LCAgOTIsIDExNiwgMTA0LCAgODAsICA4NCwgMTA4LCAgOTYsCisgICAgIDIsIEFNUl9PRigxLHB1bHNlc1sxXSksICAgNjQsICA3OSwKKyAgICAgOCwgQU1SX09GKDIscF9sYWcpLCAgICAgICAzMSwgIDE3LCAgMjEsICAxOSwgIDI5LCAgMzcsICA0MywgIDQxLAorICAgICA2LCBBTVJfT0YoMixwX2dhaW4pLCAgICAgIDczLCAgNjIsICA1MCwgIDU0LCAgMzIsICAyNCwKKyAgICAgOSwgQU1SX09GKDIscHVsc2VzWzBdKSwgICA5OSwgMTAzLCAgOTEsIDExNSwgMTE5LCAgOTUsICA4MywgMTA3LCAxMTEsCisgICAgIDIsIEFNUl9PRigyLHB1bHNlc1sxXSksICAgNjYsICA3NywKKyAgICAgNCwgQU1SX09GKDMscF9sYWcpLCAgICAgICAyNywgIDM1LCAgNDUsICA4NiwKKyAgICAgNiwgQU1SX09GKDMscF9nYWluKSwgICAgICA3MiwgIDYxLCAgNDksICA1MywgIDQ3LCAgMzksCisgICAgIDksIEFNUl9PRigzLHB1bHNlc1swXSksICAgOTgsIDEwMiwgIDkwLCAxMTQsIDExOCwgIDk0LCAgODIsIDEwNiwgMTEwLAorICAgICAyLCBBTVJfT0YoMyxwdWxzZXNbMV0pLCAgIDY1LCAgNjgsCisgICAgIDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9yZGVyX01PREVfNms3W10gPSB7CisgICAgIDgsIEFNUl9CSVQobHNmWzBdKSwgICAgICAgIDcsICAgNiwgIDE1LCAgIDQsICAgNSwgICAzLCAgIDIsICAgMCwKKyAgICAgOSwgQU1SX0JJVChsc2ZbMV0pLCAgICAgICAxNCwgIDEzLCAgIDgsICAxMiwgIDEwLCAgIDEsICAgOSwgIDExLCAgMjksCisgICAgIDksIEFNUl9CSVQobHNmWzJdKSwgICAgICAgNTcsICA1OCwgIDUwLCAgNTYsICA2MCwgIDU5LCAgNDksICA3MSwgIDcwLAorICAgICA4LCBBTVJfT0YoMCxwX2xhZyksICAgICAgIDE3LCAgMTksICAyMywgIDIxLCAgMzEsICAyNCwgIDMyLCAgNTIsCisgICAgIDcsIEFNUl9PRigwLHBfZ2FpbiksICAgICAgMzYsICA4MiwgIDY5LCAgNDYsICA0MiwgIDQ4LCAgNzcsCisgICAgMTEsIEFNUl9PRigwLHB1bHNlc1swXSksICAxMDksICA5NywgMTMzLCAxMjEsIDEwMSwgIDg5LCAxMjUsIDExMywgIDkzLCAxMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDUsCisgICAgIDMsIEFNUl9PRigwLHB1bHNlc1sxXSksICAgODEsICA3MywgIDY1LAorICAgICA0LCBBTVJfT0YoMSxwX2xhZyksICAgICAgIDI4LCAgMjYsICAzOCwgIDU0LAorICAgICA3LCBBTVJfT0YoMSxwX2dhaW4pLCAgICAgIDM1LCAgODMsICA2OCwgIDQ1LCAgNDEsICA2MywgIDc2LAorICAgIDExLCBBTVJfT0YoMSxwdWxzZXNbMF0pLCAgMTA4LCAgOTYsIDEzMiwgMTIwLCAxMDAsICA4OCwgMTI0LCAxMTIsICA5MiwgMTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0LAorICAgICAzLCBBTVJfT0YoMSxwdWxzZXNbMV0pLCAgIDgwLCAgNzIsICA2NCwKKyAgICAgOCwgQU1SX09GKDIscF9sYWcpLCAgICAgICAxNiwgIDE4LCAgMjIsICAyMCwgIDMwLCAgMzksICA0NywgIDUxLAorICAgICA3LCBBTVJfT0YoMixwX2dhaW4pLCAgICAgIDM0LCAgODQsICA2NywgIDQ0LCAgNDAsICA2MiwgIDc1LAorICAgIDExLCBBTVJfT0YoMixwdWxzZXNbMF0pLCAgMTA3LCAxMTEsIDEzMSwgMTM1LCAgOTksIDEwMywgMTIzLCAxMjcsICA5MSwgMTE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE5LAorICAgICAzLCBBTVJfT0YoMixwdWxzZXNbMV0pLCAgIDk1LCAgODcsICA3OSwKKyAgICAgNCwgQU1SX09GKDMscF9sYWcpLCAgICAgICAyNywgIDI1LCAgMzcsICA1MywKKyAgICAgNywgQU1SX09GKDMscF9nYWluKSwgICAgICAzMywgIDg1LCAgNjYsICA0MywgIDU1LCAgNjEsICA3NCwKKyAgICAxMSwgQU1SX09GKDMscHVsc2VzWzBdKSwgIDEwNiwgMTEwLCAxMzAsIDEzNCwgIDk4LCAxMDIsIDEyMiwgMTI2LCAgOTAsIDExNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOCwKKyAgICAgMywgQU1SX09GKDMscHVsc2VzWzFdKSwgICA5NCwgIDg2LCAgNzgsCisgICAgIDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9yZGVyX01PREVfN2s0W10gPSB7CisgICAgIDgsIEFNUl9CSVQobHNmWzBdKSwgICAgICAgIDcsICAgNiwgICA1LCAgIDQsICAgMywgICAyLCAgIDEsICAgMCwKKyAgICAgOSwgQU1SX0JJVChsc2ZbMV0pLCAgICAgICAxNSwgIDE0LCAgMTMsICAxMiwgIDExLCAgMTAsICAgOSwgICA4LCAgMjMsCisgICAgIDksIEFNUl9CSVQobHNmWzJdKSwgICAgICAgNTMsICA1MiwgIDUxLCAgNTgsICA0MCwgIDU1LCAgNTQsICA1NywgIDU2LAorICAgICA4LCBBTVJfT0YoMCxwX2xhZyksICAgICAgIDIyLCAgMjAsICAxOCwgIDE2LCAgMzAsICA1MCwgIDk1LCAgOTQsCisgICAgIDcsIEFNUl9PRigwLHBfZ2FpbiksICAgICAgMjgsICAyNCwgIDczLCAgMzYsICAzMiwgIDYyLCAgNjcsCisgICAgMTMsIEFNUl9PRigwLHB1bHNlc1swXSksICAxMjcsIDEyMywgMTM1LCAxMzEsIDE0MywgMTM5LCAxNTEsIDEwMywgMTAyLCAxMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsICA5OSwgIDk4LAorICAgICA0LCBBTVJfT0YoMCxwdWxzZXNbMV0pLCAgIDgzLCAgNzUsICA3OSwgIDcxLAorICAgICA1LCBBTVJfT0YoMSxwX2xhZyksICAgICAgIDQ0LCAgNDIsICA0OSwgIDkzLCAgOTIsCisgICAgIDcsIEFNUl9PRigxLHBfZ2FpbiksICAgICAgMjcsICAzOSwgIDcyLCAgMzUsICA0NywgIDYxLCAgNjYsCisgICAgMTMsIEFNUl9PRigxLHB1bHNlc1swXSksICAxMjYsIDEyMiwgMTM0LCAxMzAsIDE0MiwgMTM4LCAxNTAsICA5NywgIDk2LCAxMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAsIDEwOSwgMTA4LAorICAgICA0LCBBTVJfT0YoMSxwdWxzZXNbMV0pLCAgIDgyLCAgNzQsICA3OCwgIDcwLAorICAgICA4LCBBTVJfT0YoMixwX2xhZyksICAgICAgIDIxLCAgMTksICAxNywgIDMxLCAgMjksICA0OCwgIDkxLCAgOTAsCisgICAgIDcsIEFNUl9PRigyLHBfZ2FpbiksICAgICAgMjYsICAzOCwgIDg3LCAgMzQsICA0NiwgIDYwLCAgNjUsCisgICAgMTMsIEFNUl9PRigyLHB1bHNlc1swXSksICAxMjUsIDEyMSwgMTMzLCAxMjksIDE0MSwgMTM3LCAxNDksIDEwNywgMTA2LCAxMDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIDExOSwgMTE4LAorICAgICA0LCBBTVJfT0YoMixwdWxzZXNbMV0pLCAgIDgxLCAgODUsICA3NywgIDY5LAorICAgICA1LCBBTVJfT0YoMyxwX2xhZyksICAgICAgIDQzLCAgNDEsICA2MywgIDg5LCAgODgsCisgICAgIDcsIEFNUl9PRigzLHBfZ2FpbiksICAgICAgMjUsICAzNywgIDg2LCAgMzMsICA0NSwgIDU5LCAgNjQsCisgICAgMTMsIEFNUl9PRigzLHB1bHNlc1swXSksICAxMjQsIDEyMCwgMTMyLCAxMjgsIDE0MCwgMTM2LCAxNDgsIDExNywgMTE2LCAxMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTQsIDExMywgMTEyLAorICAgICA0LCBBTVJfT0YoMyxwdWxzZXNbMV0pLCAgIDgwLCAgODQsICA3NiwgIDY4LAorICAgICAwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBvcmRlcl9NT0RFXzdrOTVbXSA9IHsKKyAgICAgOSwgQU1SX0JJVChsc2ZbMF0pLCAgICAgICA2NywgIDY4LCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsCisgICAgIDksIEFNUl9CSVQobHNmWzFdKSwgICAgICAgMTQsICAxMywgICA5LCAgMTIsICAxMSwgICAwLCAgMTAsICAxNSwgICA4LAorICAgICA5LCBBTVJfQklUKGxzZlsyXSksICAgICAgIDE4LCAgMTksICAyMywgIDE3LCAgMjIsICAyMCwgIDIxLCAgNjYsICA2NSwKKyAgICAgOCwgQU1SX09GKDAscF9sYWcpLCAgICAgICA0NCwgIDQyLCAgNDAsICA1NCwgIDUyLCAgNTYsICA2NCwgIDc4LAorICAgICA0LCBBTVJfT0YoMCxwX2dhaW4pLCAgICAgIDM2LCAgMzIsICA3MiwgIDgwLAorICAgICA1LCBBTVJfT0YoMCxmaXhlZF9nYWluKSwgIDE2LCAgMjgsICAyNCwgIDYwLCAgODQsCisgICAgMTMsIEFNUl9PRigwLHB1bHNlc1swXSksICAxMzUsIDEwOSwgMTQ0LCAxNTYsIDEyMCwgIDk3LCAxNDgsIDEyMSwgMTAxLCAxMjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjMsICA4OSwgMTI0LAorICAgICA0LCBBTVJfT0YoMCxwdWxzZXNbMV0pLCAgMTI1LCAxMjYsIDEyNywgMTEyLAorICAgICA2LCBBTVJfT0YoMSxwX2xhZyksICAgICAgIDUwLCAgNDgsICA2MiwgIDcwLCAgNzYsICA3NCwKKyAgICAgNCwgQU1SX09GKDEscF9nYWluKSwgICAgICAzNSwgIDQ3LCAgODcsICA5NSwKKyAgICAgNSwgQU1SX09GKDEsZml4ZWRfZ2FpbiksICAzMSwgIDI3LCAgMzksICA1OSwgIDgzLAorICAgIDEzLCBBTVJfT0YoMSxwdWxzZXNbMF0pLCAgMTI5LCAxMDgsIDE1OSwgMTU1LCAxMzAsICA5NiwgMTQ3LCAxMzEsIDEwMCwgMTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMzLCAgODgsIDEzNCwKKyAgICAgNCwgQU1SX09GKDEscHVsc2VzWzFdKSwgIDExMywgMTE0LCAxMTUsIDExNiwKKyAgICAgOCwgQU1SX09GKDIscF9sYWcpLCAgICAgICA0MywgIDQxLCAgNTUsICA1MywgIDUxLCAgNzEsICA3OSwgIDc3LAorICAgICA0LCBBTVJfT0YoMixwX2dhaW4pLCAgICAgIDM0LCAgNDYsICA4NiwgIDk0LAorICAgICA1LCBBTVJfT0YoMixmaXhlZF9nYWluKSwgIDMwLCAgMjYsICAzOCwgIDU4LCAgODIsCisgICAgMTMsIEFNUl9PRigyLHB1bHNlc1swXSksICAxMzksIDEwNywgMTU4LCAxNTQsIDE0MCwgMTExLCAxNDYsIDE0MSwgIDk5LCAxNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDMsIDEwMywgMTI4LAorICAgICA0LCBBTVJfT0YoMixwdWxzZXNbMV0pLCAgMTA1LCAgOTAsICA5MSwgIDkyLAorICAgICA2LCBBTVJfT0YoMyxwX2xhZyksICAgICAgIDQ5LCAgNjMsICA2MSwgIDY5LCAgNzUsICA3MywKKyAgICAgNCwgQU1SX09GKDMscF9nYWluKSwgICAgICAzMywgIDQ1LCAgODUsICA5MywKKyAgICAgNSwgQU1SX09GKDMsZml4ZWRfZ2FpbiksICAyOSwgIDI1LCAgMzcsICA1NywgIDgxLAorICAgIDEzLCBBTVJfT0YoMyxwdWxzZXNbMF0pLCAgMTQ5LCAxMDYsIDE1NywgMTUzLCAxNTAsIDExMCwgMTQ1LCAxNTEsICA5OCwgMTM2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM3LCAxMDIsIDEzOCwKKyAgICAgNCwgQU1SX09GKDMscHVsc2VzWzFdKSwgIDExNywgMTE4LCAxMTksIDEwNCwKKyAgICAgMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb3JkZXJfTU9ERV8xMGsyW10gPSB7CisgICAgIDgsIEFNUl9CSVQobHNmWzBdKSwgICAgICAgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywKKyAgICAgOSwgQU1SX0JJVChsc2ZbMV0pLCAgICAgICAyMywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgICAgIDksIEFNUl9CSVQobHNmWzJdKSwgICAgICAgNTcsICA1OCwgIDYyLCAgNTYsICA2MCwgIDU5LCAgNjEsICA3MSwgIDcwLAorICAgICA4LCBBTVJfT0YoMCxwX2xhZyksICAgICAgIDIyLCAgMjEsICAyMCwgIDE5LCAgMTgsICAxNywgIDQyLCAgNDEsCisgICAgIDcsIEFNUl9PRigwLHBfZ2FpbiksICAgICAgMzgsICA1MCwgIDg0LCAgMzcsICAzNiwgIDg1LCAgODMsCisgICAgIDEsIEFNUl9PRigwLHB1bHNlc1swXSksICAgNjYsCisgICAgIDEsIEFNUl9PRigwLHB1bHNlc1sxXSksICAgNjcsCisgICAgIDEsIEFNUl9PRigwLHB1bHNlc1syXSksICAgNjgsCisgICAgIDEsIEFNUl9PRigwLHB1bHNlc1szXSksICAgNjksCisgICAgMTAsIEFNUl9PRigwLHB1bHNlc1s0XSksICAxNDUsIDE0NCwgMTU2LCAxNTMsIDE1NCwgMTYzLCAxNjEsIDE5MiwgMjA2LCAxOTUsCisgICAgMTAsIEFNUl9PRigwLHB1bHNlc1s1XSksICAxNTgsIDE1OSwgMTU3LCAxNTIsIDE1NSwgMTY1LCAxNjAsIDIwNSwgMjA0LCAxOTQsCisgICAgIDcsIEFNUl9PRigwLHB1bHNlc1s2XSksICAxNjcsIDE2NiwgMTYyLCAxNjQsIDE5NiwgMjA3LCAxOTMsCisgICAgIDUsIEFNUl9PRigxLHBfbGFnKSwgICAgICAgMjYsICAyNSwgIDU0LCAgNTMsICA4OSwKKyAgICAgNywgQU1SX09GKDEscF9nYWluKSwgICAgICAzNSwgIDQ5LCAgODEsICAzNCwgIDMzLCAgODIsICA4MCwKKyAgICAgMSwgQU1SX09GKDEscHVsc2VzWzBdKSwgICA3OCwKKyAgICAgMSwgQU1SX09GKDEscHVsc2VzWzFdKSwgICA3OSwKKyAgICAgMSwgQU1SX09GKDEscHVsc2VzWzJdKSwgICA2NCwKKyAgICAgMSwgQU1SX09GKDEscHVsc2VzWzNdKSwgICA2NSwKKyAgICAxMCwgQU1SX09GKDEscHVsc2VzWzRdKSwgIDEwMywgMTAyLCAgOTgsIDExMSwgIDk2LCAxMDUsIDExOSwgMTg1LCAxOTksIDE4OCwKKyAgICAxMCwgQU1SX09GKDEscHVsc2VzWzVdKSwgIDEwMCwgMTAxLCAgOTksIDExMCwgIDk3LCAxMDcsIDExOCwgMTk4LCAxOTcsIDE4NywKKyAgICAgNywgQU1SX09GKDEscHVsc2VzWzZdKSwgIDEwOSwgMTA4LCAxMDQsIDEwNiwgMTg5LCAxODQsIDE4NiwKKyAgICAgOCwgQU1SX09GKDIscF9sYWcpLCAgICAgICAxNiwgIDMxLCAgMzAsICAyOSwgIDI4LCAgMjcsICA0MCwgIDU1LAorICAgICA3LCBBTVJfT0YoMixwX2dhaW4pLCAgICAgIDMyLCAgNDgsICA5NCwgIDQ3LCAgNDYsICA5NSwgIDkzLAorICAgICAxLCBBTVJfT0YoMixwdWxzZXNbMF0pLCAgIDc0LAorICAgICAxLCBBTVJfT0YoMixwdWxzZXNbMV0pLCAgIDc1LAorICAgICAxLCBBTVJfT0YoMixwdWxzZXNbMl0pLCAgIDc2LAorICAgICAxLCBBTVJfT0YoMixwdWxzZXNbM10pLCAgIDc3LAorICAgIDEwLCBBTVJfT0YoMixwdWxzZXNbNF0pLCAgMTE3LCAxMTYsIDExMiwgMTI1LCAxMjYsIDEzNSwgMTMzLCAxNzgsIDE3NiwgMTgxLAorICAgIDEwLCBBTVJfT0YoMixwdWxzZXNbNV0pLCAgMTE0LCAxMTUsIDExMywgMTI0LCAxMjcsIDEyMSwgMTMyLCAxOTEsIDE5MCwgMTgwLAorICAgICA3LCBBTVJfT0YoMixwdWxzZXNbNl0pLCAgMTIzLCAxMjIsIDEzNCwgMTIwLCAxODIsIDE3NywgMTc5LAorICAgICA1LCBBTVJfT0YoMyxwX2xhZyksICAgICAgIDI0LCAgMzksICA1MiwgIDUxLCAgODgsCisgICAgIDcsIEFNUl9PRigzLHBfZ2FpbiksICAgICAgNDUsICA2MywgIDkxLCAgNDQsICA0MywgIDkyLCAgOTAsCisgICAgIDEsIEFNUl9PRigzLHB1bHNlc1swXSksICAgODYsCisgICAgIDEsIEFNUl9PRigzLHB1bHNlc1sxXSksICAgODcsCisgICAgIDEsIEFNUl9PRigzLHB1bHNlc1syXSksICAgNzIsCisgICAgIDEsIEFNUl9PRigzLHB1bHNlc1szXSksICAgNzMsCisgICAgMTAsIEFNUl9PRigzLHB1bHNlc1s0XSksICAxMzEsIDEzMCwgMTQyLCAxMzksIDE0MCwgMTQ5LCAxNDcsIDE3MSwgMTY5LCAxNzQsCisgICAgMTAsIEFNUl9PRigzLHB1bHNlc1s1XSksICAxMjgsIDEyOSwgMTQzLCAxMzgsIDE0MSwgMTUxLCAxNDYsIDE2OCwgMTgzLCAxNzMsCisgICAgIDcsIEFNUl9PRigzLHB1bHNlc1s2XSksICAxMzcsIDEzNiwgMTQ4LCAxNTAsIDE3NSwgMTcwLCAxNzIsCisgICAgIDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9yZGVyX01PREVfMTJrMltdID0geworICAgICA3LCBBTVJfQklUKGxzZlswXSksICAgICAgICA3LCAgIDYsICAgNSwgICA0LCAgIDMsICAgMiwgICAxLAorICAgICA4LCBBTVJfQklUKGxzZlsxXSksICAgICAgICAwLCAgMTUsICAxNCwgIDEzLCAgMTIsICAxMSwgIDEwLCAgIDksCisgICAgIDksIEFNUl9CSVQobHNmWzJdKSwgICAgICAgMjMsICAyMiwgIDIxLCAgMjAsICAxOSwgIDE4LCAgMTcsICAxNiwgICA4LAorICAgICA4LCBBTVJfQklUKGxzZlszXSksICAgICAgIDMxLCAgMzAsICAyOSwgIDI4LCAgMjcsICA4NiwgIDg1LCAgODQsCisgICAgIDYsIEFNUl9CSVQobHNmWzRdKSwgICAgICAgODMsICA4MiwgIDgxLCAgODAsIDEyNywgMTI2LAorICAgICA5LCBBTVJfT0YoMCxwX2xhZyksICAgICAgIDI2LCAgMjQsICAzOCwgIDM2LCAgMzQsICAzMiwgIDQ2LCAgNDQsICA0MiwKKyAgICAgNCwgQU1SX09GKDAscF9nYWluKSwgICAgICA0MCwgIDUyLCAgNDgsICA5NSwKKyAgICAgNSwgQU1SX09GKDAsZml4ZWRfZ2FpbiksICA2MCwgIDU2LCAgNjgsICA5MSwgMTExLAorICAgICAzLCBBTVJfT0YoMCxwdWxzZXNbMF0pLCAgMTkxLCAxNzYsIDE3NywKKyAgICAgNCwgQU1SX09GKDAscHVsc2VzWzFdKSwgIDEwMywgMTIzLCAxMjQsIDEyNSwKKyAgICAgMywgQU1SX09GKDAscHVsc2VzWzJdKSwgIDE4OCwgMTg5LCAxOTAsCisgICAgIDQsIEFNUl9PRigwLHB1bHNlc1szXSksICAgOTksIDEyMCwgMTIxLCAxMjIsCisgICAgIDMsIEFNUl9PRigwLHB1bHNlc1s0XSksICAxODUsIDE4NiwgMTg3LAorICAgICA0LCBBTVJfT0YoMCxwdWxzZXNbNV0pLCAgMTA3LCAxMzMsIDEzNCwgMTM1LAorICAgICAzLCBBTVJfT0YoMCxwdWxzZXNbNl0pLCAgMTk4LCAxOTksIDE4NCwKKyAgICAgNCwgQU1SX09GKDAscHVsc2VzWzddKSwgIDExOSwgMTMwLCAxMzEsIDEzMiwKKyAgICAgMywgQU1SX09GKDAscHVsc2VzWzhdKSwgIDE5NSwgMTk2LCAxOTcsCisgICAgIDQsIEFNUl9PRigwLHB1bHNlc1s5XSksICAxMTUsIDE0MywgMTI4LCAxMjksCisgICAgIDYsIEFNUl9PRigxLHBfbGFnKSwgICAgICAgNjQsICA3OCwgIDc2LCAgNzQsICA3MiwgMjQ1LAorICAgICA0LCBBTVJfT0YoMSxwX2dhaW4pLCAgICAgIDU1LCAgNTEsICA2MywgIDk0LAorICAgICA1LCBBTVJfT0YoMSxmaXhlZF9nYWluKSwgIDU5LCAgNzEsICA2NywgIDkwLCAxMTAsCisgICAgIDMsIEFNUl9PRigxLHB1bHNlc1swXSksICAxOTIsIDE5MywgMTk0LAorICAgICA0LCBBTVJfT0YoMSxwdWxzZXNbMV0pLCAgMTAyLCAxNDAsIDE0MSwgMTQyLAorICAgICAzLCBBTVJfT0YoMSxwdWxzZXNbMl0pLCAgMjA1LCAyMDYsIDIwNywKKyAgICAgNCwgQU1SX09GKDEscHVsc2VzWzNdKSwgICA5OCwgMTM3LCAxMzgsIDEzOSwKKyAgICAgMywgQU1SX09GKDEscHVsc2VzWzRdKSwgIDIwMiwgMjAzLCAyMDQsCisgICAgIDQsIEFNUl9PRigxLHB1bHNlc1s1XSksICAxMDYsIDE1MCwgMTUxLCAxMzYsCisgICAgIDMsIEFNUl9PRigxLHB1bHNlc1s2XSksICAyMTUsIDIwMCwgMjAxLAorICAgICA0LCBBTVJfT0YoMSxwdWxzZXNbN10pLCAgMTE4LCAxNDcsIDE0OCwgMTQ5LAorICAgICAzLCBBTVJfT0YoMSxwdWxzZXNbOF0pLCAgMjEyLCAyMTMsIDIxNCwKKyAgICAgNCwgQU1SX09GKDEscHVsc2VzWzldKSwgIDExNCwgMTQ0LCAxNDUsIDE0NiwKKyAgICAgOSwgQU1SX09GKDIscF9sYWcpLCAgICAgICAyNSwgIDM5LCAgMzcsICAzNSwgIDMzLCAgNDcsICA0NSwgIDQzLCAgNDEsCisgICAgIDQsIEFNUl9PRigyLHBfZ2FpbiksICAgICAgNTQsICA1MCwgIDYyLCAgOTMsCisgICAgIDUsIEFNUl9PRigyLGZpeGVkX2dhaW4pLCAgNTgsICA3MCwgIDY2LCAgODksIDEwOSwKKyAgICAgMywgQU1SX09GKDIscHVsc2VzWzBdKSwgIDIwOSwgMjEwLCAyMTEsCisgICAgIDQsIEFNUl9PRigyLHB1bHNlc1sxXSksICAxMDEsIDE1NywgMTU4LCAxNTksCisgICAgIDMsIEFNUl9PRigyLHB1bHNlc1syXSksICAyMjIsIDIyMywgMjA4LAorICAgICA0LCBBTVJfT0YoMixwdWxzZXNbM10pLCAgIDk3LCAxNTQsIDE1NSwgMTU2LAorICAgICAzLCBBTVJfT0YoMixwdWxzZXNbNF0pLCAgMjE5LCAyMjAsIDIyMSwKKyAgICAgNCwgQU1SX09GKDIscHVsc2VzWzVdKSwgIDEwNSwgMTY3LCAxNTIsIDE1MywKKyAgICAgMywgQU1SX09GKDIscHVsc2VzWzZdKSwgIDIxNiwgMjE3LCAyMTgsCisgICAgIDQsIEFNUl9PRigyLHB1bHNlc1s3XSksICAxMTcsIDE2NCwgMTY1LCAxNjYsCisgICAgIDMsIEFNUl9PRigyLHB1bHNlc1s4XSksICAyMjksIDIzMCwgMjMxLAorICAgICA0LCBBTVJfT0YoMixwdWxzZXNbOV0pLCAgMTEzLCAxNjEsIDE2MiwgMTYzLAorICAgICA2LCBBTVJfT0YoMyxwX2xhZyksICAgICAgIDc5LCAgNzcsICA3NSwgIDczLCAgODcsIDI0NCwKKyAgICAgNCwgQU1SX09GKDMscF9nYWluKSwgICAgICA1MywgIDQ5LCAgNjEsICA5MiwKKyAgICAgNSwgQU1SX09GKDMsZml4ZWRfZ2FpbiksICA1NywgIDY5LCAgNjUsICA4OCwgMTA4LAorICAgICAzLCBBTVJfT0YoMyxwdWxzZXNbMF0pLCAgMjI2LCAyMjcsIDIyOCwKKyAgICAgNCwgQU1SX09GKDMscHVsc2VzWzFdKSwgIDEwMCwgMTc0LCAxNzUsIDE2MCwKKyAgICAgMywgQU1SX09GKDMscHVsc2VzWzJdKSwgIDIzOSwgMjI0LCAyMjUsCisgICAgIDQsIEFNUl9PRigzLHB1bHNlc1szXSksICAgOTYsIDE3MSwgMTcyLCAxNzMsCisgICAgIDMsIEFNUl9PRigzLHB1bHNlc1s0XSksICAyMzYsIDIzNywgMjM4LAorICAgICA0LCBBTVJfT0YoMyxwdWxzZXNbNV0pLCAgMTA0LCAxNjgsIDE2OSwgMTcwLAorICAgICAzLCBBTVJfT0YoMyxwdWxzZXNbNl0pLCAgMjMzLCAyMzQsIDIzNSwKKyAgICAgNCwgQU1SX09GKDMscHVsc2VzWzddKSwgIDExNiwgMTgxLCAxODIsIDE4MywKKyAgICAgMywgQU1SX09GKDMscHVsc2VzWzhdKSwgIDI0NiwgMjQ3LCAyMzIsCisgICAgIDQsIEFNUl9PRigzLHB1bHNlc1s5XSksICAxMTIsIDE3OCwgMTc5LCAxODAsCisgICAgIDAKK307CisKKy8qKgorICogcG9zaXRpb24gb2YgdGhlIGJpdG1hcHBpbmcgZGF0YSBmb3IgZWFjaCBwYWNrZXQgdHlwZSBpbgorICogdGhlIEFNUk5CRnJhbWUKKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCBhbXJfdW5wYWNraW5nX2JpdG1hcHNfcGVyX21vZGVbTl9NT0RFU10gPSB7CisgICAgb3JkZXJfTU9ERV80azc1LAorICAgIG9yZGVyX01PREVfNWsxNSwKKyAgICBvcmRlcl9NT0RFXzVrOSwKKyAgICBvcmRlcl9NT0RFXzZrNywKKyAgICBvcmRlcl9NT0RFXzdrNCwKKyAgICBvcmRlcl9NT0RFXzdrOTUsCisgICAgb3JkZXJfTU9ERV8xMGsyLAorICAgIG9yZGVyX01PREVfMTJrMiwKK307CisKKy8qKiBudW1iZXIgb2YgYnl0ZXMgZm9yIGVhY2ggbW9kZSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZnJhbWVfc2l6ZXNfbmJbTl9NT0RFU10gPSB7CisgICAgMTIsIDEzLCAxNSwgMTcsIDE5LCAyMCwgMjYsIDMxLCA1Cit9OworCisvKioKKyAqIEJhc2UtNSByZXByZXNlbnRhdGlvbiBmb3IgdmFsdWVzIDAtMTI0CisgKgorICogVGhpcyBpcyB1c2VmdWwgZm9yIGRlY29kaW5nIHB1bHNlIHBvc2l0aW9ucyBpbiAxMC4yIGtiaXQvcyBmcmFtZXMuCisgKiBTYWZlIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIG91dCBvZiByYW5nZSBwb3NpdGlvbnMgMTI1LTEyNy4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmFzZV9maXZlX3RhYmxlWzEyOF1bM10gPSB7CisgezAsIDAsIDB9LCB7MCwgMCwgMX0sIHswLCAwLCAyfSwgezAsIDAsIDN9LCB7MCwgMCwgNH0sIHswLCAxLCAwfSwgezAsIDEsIDF9LAorIHswLCAxLCAyfSwgezAsIDEsIDN9LCB7MCwgMSwgNH0sIHswLCAyLCAwfSwgezAsIDIsIDF9LCB7MCwgMiwgMn0sIHswLCAyLCAzfSwKKyB7MCwgMiwgNH0sIHswLCAzLCAwfSwgezAsIDMsIDF9LCB7MCwgMywgMn0sIHswLCAzLCAzfSwgezAsIDMsIDR9LCB7MCwgNCwgMH0sCisgezAsIDQsIDF9LCB7MCwgNCwgMn0sIHswLCA0LCAzfSwgezAsIDQsIDR9LCB7MSwgMCwgMH0sIHsxLCAwLCAxfSwgezEsIDAsIDJ9LAorIHsxLCAwLCAzfSwgezEsIDAsIDR9LCB7MSwgMSwgMH0sIHsxLCAxLCAxfSwgezEsIDEsIDJ9LCB7MSwgMSwgM30sIHsxLCAxLCA0fSwKKyB7MSwgMiwgMH0sIHsxLCAyLCAxfSwgezEsIDIsIDJ9LCB7MSwgMiwgM30sIHsxLCAyLCA0fSwgezEsIDMsIDB9LCB7MSwgMywgMX0sCisgezEsIDMsIDJ9LCB7MSwgMywgM30sIHsxLCAzLCA0fSwgezEsIDQsIDB9LCB7MSwgNCwgMX0sIHsxLCA0LCAyfSwgezEsIDQsIDN9LAorIHsxLCA0LCA0fSwgezIsIDAsIDB9LCB7MiwgMCwgMX0sIHsyLCAwLCAyfSwgezIsIDAsIDN9LCB7MiwgMCwgNH0sIHsyLCAxLCAwfSwKKyB7MiwgMSwgMX0sIHsyLCAxLCAyfSwgezIsIDEsIDN9LCB7MiwgMSwgNH0sIHsyLCAyLCAwfSwgezIsIDIsIDF9LCB7MiwgMiwgMn0sCisgezIsIDIsIDN9LCB7MiwgMiwgNH0sIHsyLCAzLCAwfSwgezIsIDMsIDF9LCB7MiwgMywgMn0sIHsyLCAzLCAzfSwgezIsIDMsIDR9LAorIHsyLCA0LCAwfSwgezIsIDQsIDF9LCB7MiwgNCwgMn0sIHsyLCA0LCAzfSwgezIsIDQsIDR9LCB7MywgMCwgMH0sIHszLCAwLCAxfSwKKyB7MywgMCwgMn0sIHszLCAwLCAzfSwgezMsIDAsIDR9LCB7MywgMSwgMH0sIHszLCAxLCAxfSwgezMsIDEsIDJ9LCB7MywgMSwgM30sCisgezMsIDEsIDR9LCB7MywgMiwgMH0sIHszLCAyLCAxfSwgezMsIDIsIDJ9LCB7MywgMiwgM30sIHszLCAyLCA0fSwgezMsIDMsIDB9LAorIHszLCAzLCAxfSwgezMsIDMsIDJ9LCB7MywgMywgM30sIHszLCAzLCA0fSwgezMsIDQsIDB9LCB7MywgNCwgMX0sIHszLCA0LCAyfSwKKyB7MywgNCwgM30sIHszLCA0LCA0fSwgezQsIDAsIDB9LCB7NCwgMCwgMX0sIHs0LCAwLCAyfSwgezQsIDAsIDN9LCB7NCwgMCwgNH0sCisgezQsIDEsIDB9LCB7NCwgMSwgMX0sIHs0LCAxLCAyfSwgezQsIDEsIDN9LCB7NCwgMSwgNH0sIHs0LCAyLCAwfSwgezQsIDIsIDF9LAorIHs0LCAyLCAyfSwgezQsIDIsIDN9LCB7NCwgMiwgNH0sIHs0LCAzLCAwfSwgezQsIDMsIDF9LCB7NCwgMywgMn0sIHs0LCAzLCAzfSwKKyB7NCwgMywgNH0sIHs0LCA0LCAwfSwgezQsIDQsIDF9LCB7NCwgNCwgMn0sIHs0LCA0LCAzfSwgezQsIDQsIDR9LCB7MCwgMCwgMH0sCisgezAsIDAsIDB9LCB7MCwgMCwgMH0KK307CisKKy8qKgorICogVmFsdWVzIGZvciB0aGUgbHNwIHZlY3RvciBmcm9tIHRoZSA0dGggc3ViZnJhbWUgb2YgdGhlCisgKiBwcmV2aW91cyBzdWJmcmFtZSB2YWx1ZXMuCisgKgorICogQG5vdGU6IFRha2VuIGZyb20gRGVjb2Rlcl9hbXJfcmVzZXQgaW4gUTE1IHVzaW5nIHZhbC8xMDAwCisgKi8KK3N0YXRpYyBjb25zdCBpbnQ4X3QgbHNwX3N1YjRfaW5pdFtMUF9GSUxURVJfT1JERVJdID0geworICAgIDMwLCAyNiwgMjEsIDE1LCA4LCAwLCAtOCwgLTE1LCAtMjEsIC0yNgorfTsKKworLyoqCisgKiBNZWFuIGxzcCB2YWx1ZXMuCisgKgorICogQG5vdGU6IFRha2VuIGZyb20gRGVjb2Rlcl9hbXJfcmVzZXQgaW4gUTE1CisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGxzcF9hdmdfaW5pdFtMUF9GSUxURVJfT1JERVJdID0geworICAgIDEzODQsIDIwNzcsIDM0MjAsIDUxMDgsIDY3NDIsIDgxMjIsIDk4NjMsIDExMDkyLCAxMjcxNCwgMTM3MDEKK307CisKKy8vIExTRiB0YWJsZXMKKworLy8gVGhlc2UgYXJlIHN0b3JlZCBhcyBpbnRlZ2VycyB0byBzYXZlIHNwYWNlLiBUaGUgdmFsdWVzIGFyZSB0YWtlbiBmcm9tCisvLyBxX3Bsc2ZfMy50YWIgYW5kIHFfcGxzZl81LnRhYiBpbiAzR1BQIFRTIDI2LjA5MC4KKworc3RhdGljIGNvbnN0IGludDE2X3QgbHNmXzNfM19NT0RFXzVrMTVbMTI4XVs0XSA9IHsKK3sgIDQxOSwgIDE2MywgIC0zMCwgLTI2Mn0sIHsgLTQ1NSwgLTc4OSwtMTQzMCwgLTcyMX0sIHsgMTAwNiwgIDY2NCwgIDI2OSwgICAyNX0sCit7ICA2MTksICAyNjAsICAxODMsICAgOTZ9LCB7IC05NjgsLTEzNTgsIC0zODgsICAxMzV9LCB7IC02OTMsICA4MzUsICA0NTYsICAxNTR9LAoreyAxMTA1LCAgNzAzLCAgNTY5LCAgMzYzfSwgeyAxNjI1LCAxMzI2LCAgOTg1LCAgNzQ4fSwgeyAtMjIwLCAgMjE5LCAgIDc2LCAtMjA4fSwKK3stMTQ1NSwtMTY2MiwgICA0OSwgIDE0OX0sIHsgLTk2NCwgLTE3MiwgLTc1MiwgLTMzNn0sIHsgIDYyNSwgIDIwOSwgLTI1MCwgIC02Nn0sCit7LTEwMTcsIC04MzgsICAgLTIsICAzMTd9LCB7LTIxNjgsLTE0ODUsIC0xMzgsICAxMjN9LCB7LTE4NzYsLTIwOTksIC01MjEsICAgODV9LAoreyAtOTY3LCAtMzY2LCAtNjk1LCAtODgxfSwgeyAtOTIxLC0xMDExLCAtNzYzLCAtOTQ5fSwgeyAtMTI0LCAtMjU2LCAtMzUyLCAtNjYwfSwKK3sgIDE3OCwgIDQ2MywgIDM1NCwgIDMwNH0sIHstMTc0NCwgLTU5MSwgLTI4MiwgICA3OX0sIHstMjI0OSwgIDE3NSwgIDg2NywgIDQ5OX0sCit7IC0xMzgsIC0xODAsIC0xODEsICAtMjF9LCB7LTIyOTEsLTEyNDEsIC00NjAsIC01MjB9LCB7IC03NzEsICA0NTEsICAtMTAsIC0zMDh9LAoreyAgMjcxLCAgLTY1LCAgICA0LCAgMjE0fSwgeyAtMjc5LCAtNDM1LCAgLTQzLCAtMzQ4fSwgeyAtNjcwLCAgIDM1LCAgLTY1LCAtMjExfSwKK3sgIDgwNiwgIDUzNSwgICA4NSwgIDI5N30sIHsgICA1NywgIDIzOSwgIDcyMiwgIDQ5M30sIHsgIDIyNSwgIDY2MSwgIDg0MCwgIDU0N30sCit7IC01NDAsIC0zNzYsICAgMTQsICAzNDl9LCB7ICA0NjksICA3MjEsICAzMzEsICAxNjJ9LCB7IC01NDQsIC03NTIsICAtNjIsICAtMTB9LAoreyAgMzk4LCAgLTg4LCAgNzI0LCAgNzAxfSwgeyAgLTE5LCAtNTMzLCAgLTk0LCAgNjAxfSwgeyAgMTM2LCAgLTcxLCAtNjgxLCAtNzQ3fSwKK3sgLTE2NiwgLTM0NCwgIDI2MSwgIC01MH0sIHsgIDE2MSwgIC01MiwgIDQ4NSwgIDMzN30sIHstMTY3NSwgICA1MCwgIDE5MCwgIC05M30sCit7LTIyODIsIC0yMzEsIC0xOTQsICAtODJ9LCB7ICAtOTUsIC01OTUsIC0xNTQsICAxMjh9LCB7ICA4OTQsICA1MDEsICA1ODgsICA0NTd9LAoreyAtMzQ1LCAgMjA2LCAgMTIyLCAgMTEwfSwgeyAtNjMxLCAtMjI3LCAtNTY5LCAgICAzfSwgeyAgNDA4LCAgMjM5LCAgMzk3LCAgMjI2fSwKK3sgLTE5NywgICAtMiwgIDEyOCwgIDQ5MX0sIHsgMTI4MSwgIDkwNCwgIDI5MiwgIDIxNX0sIHsgIDUzOCwgIDMwNiwgIDI1OSwgIDUwOX0sCit7IC02NzcsLTEwNDcsICAgMTMsICAzMjF9LCB7IC02NzksIC01ODgsIC0zNTgsIC0yMTJ9LCB7IC01NTgsICAyNDMsICA2NDYsICA0Nzl9LAoreyAgNDg2LCAgMzQyLCAgNjM0LCAgNTMyfSwgeyAgMTA3LCAgODAyLCAgMzMxLCAgMTM2fSwgeyAtMTEyLCAtMzk4LC0xMDMxLCAtMjg2fSwKK3sgLTMyNiwgLTcwNSwgIDI4OCwgIDI3Mn0sIHsgMTI5OSwgMTE0NCwgMTE3OCwgIDg2MH0sIHsgLTQyMywgIDEyMSwgLTM4NSwgLTE0OH0sCit7IC0yOTUsIC0zMDIsIC04MzQsIC04MTl9LCB7ICAgMTYsICAtMjQsIC0yMDEsIC00NzZ9LCB7ICA1NTUsICAgOTEsIC0yNDUsICAyOTR9LAoreyAgLTM4LCAtMzc5LCAtOTYyLC0xMjIxfSwgey0xMTkxLC0xNTE4LCAtMjczLCAtMzk1fSwgeyAtMzkwLC0xMDEzLCAtNjQ1LCAgNTczfSwKK3stMTg0MywtMTAzMCwgIDUwNSwgIDQ2OH0sIHsgIDc0NCwgIDk0NywgIDYwOSwgIDQ5M30sIHsgLTY4OSwtMTE3MiwgLTYyOCwgLTEzNX0sCit7LTEwMjYsICAxOTUsICA0MTEsICAxOTZ9LCB7IDE1ODIsIDExNDcsICA1NzUsICAzMzd9LCB7LTEyMzksIC03NzcsIC02NDgsIC0xNDJ9LAoreyAgNTk1LCAgODI1LCAgOTY3LCAgNzM1fSwgey0xMjA2LCAtOTcwLCAgLTgxLCAtMzQyfSwgeyAtNzQ1LCAgIDEzLCAgLTcyLCAgMzc1fSwKK3sgIDQ1NCwgICAxOSwgMTQwNywgIDkyMX0sIHstMTY0NywgLTE3MiwgIDg2MSwgIDU2Mn0sIHsgIDkyOCwgMTUzNywgMTA2MywgIDc0MH0sCit7LTI0NzIsIC05NTIsICAyNjQsICAgODJ9LCB7IC01MDIsIC05NjUsLTEzMzQsICAxMjN9LCB7ICA4NjcsIDEyMzYsICA1MzQsICAxNzF9LAorey0yMzIwLCAtNDYwLCAgNzgwLCAgMzYzfSwgey0xMTkwLCAtNjE3LCAgMjUyLCAgLTYxfSwgeyAtMTc0LCAgIDM0LCAxMDExLCAgNzg4fSwKK3stMjMzMywgIDI0NywgIDQyMywgIDE1M30sIHsgIC0xNiwgLTM1NSwgIDI2MiwgIDQ0OX0sIHstMTU3NiwtMTA3MywgLTU0NCwgLTM3MX0sCit7IC02MTUsIC0zMDUsIDEwNTEsICA4MDV9LCB7ICA2ODcsICA1MjgsICAgIDYsIC0xODJ9LCB7ICA5MzUsICA4NzUsIDEwMDIsICA4MDl9LAoreyAgMTk5LCAgMjU3LCAgMTI2LCAgIDc2fSwgeyAtNTg0LC0xMTM4LCAgNTk5LCAgNTU2fSwgey0xMTA1LC0xMzkxLC0xNTkxLCAtNTE5fSwKK3sgLTk3NywtMTMyNSwgIDEwOCwgIDM0N30sIHsgLTcyMiwgLTk3NSwgIDM2NSwgIDEwMX0sIHsgLTE0NSwgIDY4MSwgIDI0OSwgLTE1M30sCit7ICAgIDAsIC0zMzQsIC01NzAsICAxNTl9LCB7ICA0MTIsICAyODUsIC0zMzYsIC02MTd9LCB7IC05NTMsIC05NjYsICA4ODcsICA2ODl9LAorey0xMjUxLCAgIDg0LCAtMTg1LCAtMzk4fSwgeyAtNTkyLCAgNDMzLCAxMDQ0LCAgNjUzfSwgeyAgIDg1LCAgMzI5LCAgLTQwLCAgMzYxfSwKK3sgLTQzMywgLTcwNSwgIDQ2NiwgIDU3NH0sIHsgLTE1NCwgIDY1NCwgIDU5MiwgIDI5MH0sIHsgLTE2NywgICA3MiwgIDM0OSwgIDE3NX0sCit7ICA2NzQsICAyOTcsICA5NzcsICA3MjB9LCB7IDEyMzUsIDEyMDQsICA3NTcsICA0ODh9LCB7IC00MDAsIC0yNjksICA1MzgsICAzNzJ9LAorey0xMzUwLC0xMzg3LC0xMTk0LCAgLTkxfSwgeyAxMjYyLCAgODc2LCAgNzc1LCAgNzAwfSwgeyAtNTk5LCAgLTM4LCAtNDMwLCAtNzIyfSwKK3sgMTk3NiwgMTYzMCwgIDk5MSwgIDYwOH0sIHsgIDExMSwgIDI3NiwgLTIyNiwgIC05Nn0sIHsgLTk0NywgLTM4OCwgIC0xMSwgICAtN30sCit7IC0zMDMsIC01MzEsIC04MzksICAzMzh9LCB7IDE3MzQsIDE3MTAsIDE0MDUsIDEwMTN9LCB7IC01MTYsIC04NTUsIC02NDUsICAyMTB9LAoreyAtNjg4LCAtNDE2LCAgNTEzLCAgMjMwfSwgeyAtODIyLCAtNjM3LC0xMTQ2LCAtMzIwfSwgeyAtOTUyLCAtNjU4LCAtNjk0LCAgMTgzfSwKK3sgLTExNCwgLTYyMywgIDgxOCwgIDY3NH0sIHsgLTE5MSwgLTIwNCwgIDczMSwgIDYzNX0sIHsgICA1MSwgMTIyMSwgIDg4MywgIDU3Nn0sCit7IC05NTQsIC00MzEsICA4MjYsICA1OTh9LCB7IC0zNDIsIC03NTUsIC05MDAsIC00MDd9LCB7LTExMjYsIC0zNTQsIC0yMDYsIC01MTJ9LAoreyAtNTQ3LCAtODEwLCAtMzU3LCAtNjIwfSwgeyAgIDY2LCAgNTE1LCAgLTczLCAtNDEwfSwgeyAtODcyLCAtOTQ1LC0xNDQ0LC0xMjI3fSwKK3sgIDE5MSwgIC0xNywgLTU0NCwgLTIzMX0sIHstMTU0MCwgLTU0NCwgLTkwMSwgLTg4Nn0KK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGxzZl8zXzFfTU9ERV83azk1WzUxMl1bM10gPSB7Cit7IC04OTAsLTE1NTAsLTI1NDF9LCB7IC04MTksIC05NzAsICAxNzV9LCB7IC04MjYsLTEyMzQsIC03NjJ9LAoreyAtNTk5LCAgLTIyLCAgNjM0fSwgeyAtODExLCAtOTg3LCAtOTAyfSwgeyAtMzIzLCAgMjAzLCAgIDI2fSwKK3sgLTM4MywgLTIzNSwgLTc4MX0sIHsgLTM5OSwgMTI2MiwgIDkwNn0sIHsgLTkzMiwtMTM5OSwtMTM4MH0sCit7IC02MjQsICAgOTMsICAgODd9LCB7IC00MTQsIC01MzksIC02OTF9LCB7ICAgMzcsICA2MzMsICA1MTB9LAoreyAtMzg3LCAtNDc2LC0xMzMwfSwgeyAgMzk5LCAgIDY2LCAgMjYzfSwgeyAtNDA3LCAgLTQ5LCAtMzM1fSwKK3sgLTQxNywgMTA0MSwgMTg2NX0sIHsgLTc3OSwtMTA4OSwtMTQ0MH0sIHsgLTc0NiwgLTg1OCwgIDgzMn0sCit7IC01ODEsIC03NTksIC0zNzF9LCB7IC02NzMsIC01MDYsIDIwODh9LCB7IC01NjAsIC02MzQsLTExNzl9LAoreyAgMjcxLCAgMjQxLCAgIDE0fSwgeyAtNDM4LCAtMjQ0LCAtMzk3fSwgeyAgNDYzLCAxMjAyLCAxMDQ3fSwKK3sgLTYwNiwgLTc5NywtMTQzOH0sIHsgIC01MSwgLTMyMywgIDQ4MX0sIHsgLTIyNCwgLTU4NCwgLTUyN30sCit7ICA0OTQsICA4ODEsICA2ODJ9LCB7IC00MzMsIC0zMDYsLTEwMDJ9LCB7ICA1NTQsICA2NTksICAyMjJ9LAoreyAgMTcxLCAtMTYwLCAtMzUzfSwgeyAgNjgxLCAxNzk4LCAxNTY1fSwgeyAtODUyLC0xMTgxLC0xNjk1fSwKK3sgLTMzNiwgLTY2NiwgIDExNH0sIHsgLTU4MSwgLTc1NiwgLTc0NH0sIHsgLTE5NSwgIDM3NSwgIDQ5N30sCit7IC00NjUsIC04MDQsLTEwOTh9LCB7ICAxNTQsICAyODIsIC0xMzF9LCB7ICAtNTAsIC0xOTEsIC03MTl9LAoreyAgMzIzLCAgNzMyLCAxNTQyfSwgeyAtNzIyLCAtODE5LC0xNDA0fSwgeyAgMTA1LCAtMjUwLCAgMTg1fSwKK3sgLTE3OCwgLTUwMiwgLTc0Mn0sIHsgIDMyMSwgIDUxMCwgMTExMX0sIHsgLTMyMywgLTU2NywgLTk2Nn0sCit7ICAxMjcsICA0ODQsICAzMzh9LCB7IC0xNjAsICAgNTIsIC0zMzh9LCB7ICA3MzIsIDEzNjcsIDE1NTR9LAoreyAtNjI2LCAtODAyLC0xNjk2fSwgeyAtMjg2LCAtNTg2LCAgNjc2fSwgeyAtNjk1LCAtMzQzLCAtMzcwfSwKK3sgLTQ5MCwgIDI5NSwgMTg5M30sIHsgLTYzMCwgLTU3NCwtMTAxNH0sIHsgIC04MCwgIDY0NSwgIC02OX0sCit7ICAgLTYsIC0zMTgsIC0zNjR9LCB7ICA3ODIsIDE0NTAsIDEwMzh9LCB7IC0zMTMsIC03MzMsLTEzOTV9LAoreyAgMTIwLCAgIDYwLCAgNDc3fSwgeyAtMjY0LCAtNTg1LCAtMTIzfSwgeyAgNzExLCAxMjQ1LCAgNjMzfSwKK3sgIC05MSwgLTM1NSwtMTAxNn0sIHsgIDc3MSwgIDc1OCwgIDI2MX0sIHsgIDI1MywgICA4MSwgLTQ3NH0sCit7ICA5MzAsIDIyMTUsIDE3MjB9LCB7IC04MDgsLTEwOTksLTE5MjV9LCB7IC01NjAsIC03ODIsICAxNjl9LAoreyAtODA0LC0xMDc0LCAtMTg4fSwgeyAtNjI2LCAgLTU1LCAxNDA1fSwgeyAtNjk0LCAtNzE2LC0xMTk0fSwKK3sgLTY2MCwgIDM1NCwgIDMyOX0sIHsgLTUxNCwgIC01NSwgLTU0M30sIHsgIDM2NiwgMTAzMywgMTE4Mn0sCit7IC02NTgsIC05NTksLTEzNTd9LCB7ICAtNTUsIC0xODQsICAgOTN9LCB7IC02MDUsIC0yODYsIC02NjJ9LAoreyAgNDA0LCAgNDQ5LCAgODI3fSwgeyAtMjg2LCAtMzUwLC0xMjYzfSwgeyAgNjI4LCAgMzA2LCAgMjI3fSwKK3sgIC0xNiwgIDE0NywgLTYyM30sIHsgIDE4NiwgIDkyMywgMjE0Nn0sIHsgLTY3NCwgLTg5MCwtMTYwNn0sCit7IC00NDMsIC0yMjgsICAzMzl9LCB7IC0zNjksIC03OTAsIC00MDl9LCB7ICAyMzEsICAgODYsIDE0Njl9LAoreyAtNDQ4LCAtNTgxLC0xMDYxfSwgeyAgNTk0LCAgNDUwLCAtMTc3fSwgeyAtMTI0LCAtMTcwLCAtNDQ3fSwKK3sgIDY3MSwgMTE1OSwgMTQwNH0sIHsgLTQ3NiwgLTY2NywtMTUxMX0sIHsgIC03NywgLTEzOCwgIDcxNn0sCit7IC0xNzcsIC0zNzIsIC0zODF9LCB7ICA0NTEsICA5MzQsICA5MTV9LCB7IC0yNTAsIC00MzIsIC04MjJ9LAoreyAgMjcyLCAgODI4LCAgNDQ2fSwgeyAgIDI2LCAgIDE5LCAgLTMxfSwgeyAgNjk4LCAxNjkyLCAyMTY4fSwKK3sgLTY0NiwgLTk3NywtMTkyNH0sIHsgLTE3OSwgLTQ3MywgIDI2OH0sIHsgLTM3OSwgLTc0NSwgLTY5MX0sCit7ICAgMTEsICAxMjcsIDEwMzN9LCB7IC00ODgsIC05MTcsIC04MjV9LCB7ICAgNjEsICAzMjMsICAxMzV9LAoreyAgMTQ3LCAtMTQ1LCAtNjg2fSwgeyAgNjg1LCAgNzg2LCAxNjgyfSwgeyAtNTA2LCAtODQ4LC0xMjk3fSwKK3sgICAzNSwgICA5MCwgIDIyMn0sIHsgIC0yMywgLTM0NiwgLTY3MH0sIHsgIDQ1NSwgIDU5MSwgMTI4N30sCit7IC0yMDMsIC01OTMsLTEwODZ9LCB7ICA2NTIsICAzNTIsICA0Mzd9LCB7ICAgMzksICAgNjMsIC00NTd9LAoreyAgODQxLCAxMjY1LCAyMTA1fSwgeyAtNTIwLCAtODgyLC0xNTg0fSwgeyAtMzI4LCAtNzExLCAxNDIxfSwKK3sgLTU5NiwgLTM0MiwgIC03MH0sIHsgIDIwOSwgIDE3MywgMTkyOH0sIHsgLTQyMywgLTU5OCwgLTkyMX0sCit7ICA0MjEsICA2MDUsICAtMzh9LCB7ICAgLTIsIC0yNDUsIC0xMjd9LCB7ICA4OTYsIDE5NjksIDExMzV9LAoreyAtMzc5LCAtNTE4LC0xNTc5fSwgeyAgMTczLCAgMTE4LCAgNzUzfSwgeyAgLTU1LCAtMzgxLCAgLTUyfSwKK3sgIDk4NSwgMTAyMSwgIDc1M30sIHsgICAtMiwgLTI5MSwgLTg5MX0sIHsgIDc1MywgIDk5MiwgIDQyM30sCit7ICAyNjQsICAxMzEsIC0xOTZ9LCB7ICA4OTUsIDIyNzQsIDI1NDN9LCB7IC02MzUsLTEwODgsLTI0OTl9LAoreyAtNTI5LCAtOTgyLCAgNTI2fSwgeyAtNzY0LCAtODMwLCAtNTQ4fSwgeyAtNDM2LCAgMzE2LCAgNTk5fSwKK3sgLTY3NSwgLTk0MCwgLTc0Nn0sIHsgIC01NywgIDIzNiwgIC0xMX0sIHsgLTIwMSwgIC04MSwgLTc5OH0sCit7ICAgMTYsICA4NDUsIDE1NTh9LCB7IC03MzcsIC05ODUsLTEyMTJ9LCB7IC00NjgsICAgMTcsICAyOTB9LAoreyAtMjc5LCAtNTg0LCAtNzAwfSwgeyAgMTgzLCAgODIyLCAgNzA1fSwgeyAtMjY1LCAtNDkyLC0xMTg3fSwKK3sgIDQyMSwgIDE1MiwgIDQ2OH0sIHsgLTM5MCwgIDE2NiwgLTI2OH0sIHsgICAzOSwgMTU1MCwgMTg2OH0sCit7IC02MzUsIC05NjYsLTE1NzF9LCB7IC00NTMsIC00OTIsICA5MTB9LCB7IC0yODQsLTEwMjcsICAtNzV9LAoreyAtMTgxLCAtMTMzLCAxODUyfSwgeyAtNDQ1LCAtNjI0LC0xMTc0fSwgeyAgNDIwLCAgMzY3LCAgLTQ5fSwKK3sgLTM4OSwgLTIxMiwgLTE2OX0sIHsgIDcwNywgMTA3MywgMTIwOH0sIHsgLTUzOSwgLTcxMCwtMTQ0OX0sCit7ICAgODMsIC0xNjMsICA0ODR9LCB7IC0yMzYsIC01NDMsIC0zNTV9LCB7ICAzMzgsIDExNzUsICA4MTR9LAoreyAtMjQ2LCAtMzA5LCAtOTU4fSwgeyAgNjA2LCAgNzYwLCAgIDYwfSwgeyAgMTY2LCAgIC04LCAtMTYzfSwKK3sgLTMwNiwgMTg0OSwgMjU2M30sIHsgLTc0NywtMTAyNSwtMTc4M30sIHsgLTQxOSwgLTQ0NiwgIDIwOX0sCit7IC03MTgsIC01NjYsIC01MzR9LCB7IC01MDYsICA2OTMsICA4NTd9LCB7IC00NjMsIC02OTcsLTEwODJ9LAoreyAgMzI1LCAgNDMxLCAtMjA2fSwgeyAgLTE1LCAgIC04LCAtNzYzfSwgeyAgNTQ1LCAgOTE5LCAxNTE4fSwKK3sgLTYxMSwgLTc4MywtMTMxM30sIHsgIDI1NiwgIC01NSwgIDIwOH0sIHsgLTE2NSwgLTM0OCwgLTY2Mn0sCit7ICAzMjEsICA2ODAsICA5MzB9LCB7IC0zMjYsIC00MjksIC05NTF9LCB7ICA0ODQsICA0NDYsICA1NzB9LAoreyAtMTk3LCAgIDcyLCAgLTczfSwgeyAgOTA5LCAxNDU1LCAxNzQxfSwgeyAtNTYzLCAtNzM3LC0xOTc0fSwKK3sgLTEyNCwgLTQxNiwgIDcxOH0sIHsgLTQ3OCwgLTQwNCwgLTMxNH0sIHsgIC0xNiwgIDQ0NiwgMTYzNn0sCit7IC01NTEsIC01MzcsIC03NTB9LCB7ICAtNTgsICA2MzgsICAyMTR9LCB7ICAgNTUsIC0xODUsIC0yNzF9LAoreyAxMTQ4LCAxMzAxLCAxMjEyfSwgeyAtNDgzLCAtNjcxLC0xMjY0fSwgeyAgMTE3LCAgMjg1LCAgNTQzfSwKK3sgLTIwNCwgLTM5MSwgLTExMX0sIHsgIDUxMywgMTUzOCwgIDg1NH0sIHsgLTExNCwgLTE5MCwgLTk3OH0sCit7ICA4NzcsICA1OTUsICA0NjR9LCB7ICAyNjAsICAyNjAsIC0zMTF9LCB7ICA3NDgsIDIyODMsIDIyMTZ9LAoreyAtNTE3LCAtOTQ1LC0yMTcxfSwgeyAtMzI2LCAtNzA4LCAgMzc4fSwgeyAtODEyLCAtNjkxLCAtMjMyfSwKK3sgLTU2MCwgIDY4NywgMTQwOX0sIHsgLTczMiwgLTY5MCwgLTgzNn0sIHsgLTM1OSwgIDY0NSwgIDM4Nn0sCit7IC0yNjUsICAgNjIsIC02Nzh9LCB7ICAxNDUsIDE2NDQsIDEyMDh9LCB7IC01NTUsIC05ODgsLTEyMzN9LAoreyAgLTc4LCAgIDE0LCAgMTE0fSwgeyAtMzI3LCAtMzU4LCAtNDg5fSwgeyAgMzkyLCAgNjc3LCAgNjk3fSwKK3sgLTIwMSwgLTIzNiwtMTE0MH0sIHsgIDY5MywgIDQ0OSwgIDE3OH0sIHsgLTI0MywgIDI1NiwgLTQzM30sCit7ICA2MTEsIDEzODUsIDI0NTZ9LCB7IC02MTIsIC05MDEsLTE0NjR9LCB7IC0zMDcsICAtMTcsICA0OTl9LAoreyAtMzE1LCAtNjY3LCAtMjU0fSwgeyAgMjU2LCAgNDI4LCAxNDYzfSwgeyAtNDg2LCAtNDIyLC0xMDU2fSwKK3sgIDY1NSwgIDM3MCwgICAxOH0sIHsgLTEwMiwgLTE4NSwgLTI3Nn0sIHsgIDc1NSwgMTU3OCwgMTMzNX0sCit7IC00ODgsIC02MDMsLTE0MTh9LCB7ICAxODIsICAtOTMsICA4NzB9LCB7ICAtNzMsIC00NTgsIC0zNDh9LAoreyAgODM1LCAgODYyLCAgOTU3fSwgeyAtMjgyLCAtMzMzLCAtNzQ2fSwgeyAgNTQ3LCAgODM5LCAgNDI4fSwKK3sgIDI3MywgIC04OSwgICAxM30sIHsgIDk0MCwgMTcwOCwgMjU3Nn0sIHsgLTQxOCwtMTA4NCwtMTc1OH0sCit7ICAtNDQsIC0zNTgsICAyNTl9LCB7IC00OTcsIC02NDMsIC01NjB9LCB7ICAgOTksICA1NTcsICA5NjF9LAoreyAtNDIxLCAtNzY2LCAtOTE3fSwgeyAgMjk1LCAgMzI2LCAgMTg0fSwgeyAgMTc1LCAgIDE1LCAtNjI2fSwKK3sgIDUzMiwgIDg3OCwgMTk4MX0sIHsgLTQ0MywgLTc2OCwtMTI3NX0sIHsgIDIyMSwgIDE1NiwgIDI2OH0sCit7ICAgMzksIC0zNjMsIC01MDV9LCB7ICA2OTUsICA3NzIsIDExNDB9LCB7IC0xNjIsIC00NTksIC05MTJ9LAoreyAgNzA5LCAgNDQ0LCAgNjU4fSwgeyAgIDI1LCAgMzAzLCAtMzEyfSwgeyAxMjY4LCAxNDEwLCAxNzE1fSwKK3sgLTI5NywgLTc2NiwtMTgzNn0sIHsgLTI2MywgLTEwOCwgMTA3MH0sIHsgLTQwNiwgIC0xMywgLTEyOX0sCit7ICAgNTcsICA0MzgsIDI3MzR9LCB7IC0zNzQsIC00ODcsIC04MzV9LCB7ICAzMDQsICA2OTYsICAxNjR9LAoreyAgMTA0LCAtMjM1LCAgICA1fSwgeyAxNjExLCAxOTAwLCAxMzk5fSwgeyAtMjI5LCAtNTgyLC0xMzI1fSwKK3sgIDQwNSwgIDE5MiwgIDgxN30sIHsgIC04NywgLTQzOCwgIDExMX0sIHsgMTAyOCwgMTE5OSwgIDk5M30sCit7ICAgNjgsIC0xNzUsIC05MzR9LCB7IDEwMzMsIDExMTcsICA0NTF9LCB7ICA0NzgsICAyMDAsIC0yNDh9LAoreyAyMTI3LCAyNjk2LCAyMDQyfSwgeyAtODM1LC0xMzIzLC0yMTMxfSwgeyAtNzk5LCAtNjkyLCAgNDY2fSwKK3sgLTgxMiwtMTAzMiwgLTQ2OX0sIHsgLTYyMiwgIDI4OCwgIDkyMH0sIHsgLTcwMSwgLTg0MSwtMTA3MH0sCit7IC00MTEsICA1MTIsICAgIDh9LCB7IC0zOTAsICAtOTEsIC03NDR9LCB7ICAtMzAsIDEwNDMsIDExNjF9LAoreyAtODIyLC0xMTQ4LC0xMTU2fSwgeyAtMjk0LCAgLTQ2LCAgMTEwfSwgeyAtNDExLCAtMzc0LCAtNjc4fSwKK3sgIDIxNCwgIDUzMSwgIDY2OH0sIHsgLTQwNiwgLTQyMCwtMTE5NH0sIHsgIDQ4NywgIDIzMiwgIDMwM30sCit7IC0zMTgsICAgOTEsIC00NzJ9LCB7ICAxMjMsIDEyMzIsIDI0NDV9LCB7IC03MjIsIC05NTIsLTE0OTV9LAoreyAtNzM4LCAtNjc1LCAxMzMyfSwgeyAtNTQzLCAtNjA2LCAtMjExfSwgeyAgLTk1LCAgLTk4LCAxNTA4fSwKK3sgLTU0OSwgLTUxNCwtMTE5M30sIHsgIDQ3MywgIDIxMSwgICA3M30sIHsgLTI4OCwgLTExMiwgLTM4OX0sCit7ICA1MzcsIDEzMzIsIDEyNTh9LCB7IC01NjcsIC03NTUsLTE1NDV9LCB7ICAgNzEsIC0yODMsICA2MzJ9LAoreyAtMTcwLCAtNDgxLCAtNDkzfSwgeyAgNjgxLCAxMDAyLCAgODE3fSwgeyAtMzU2LCAtMzMxLCAtODc3fSwKK3sgIDQxOSwgIDcwNiwgIDM0Nn0sIHsgIDI0MSwgIC0zNCwgLTMyNn0sIHsgIDM3NywgMTk1MCwgMTg4M30sCit7IC03MjcsLTEwNzUsLTE2MjV9LCB7IC0yMzMsIC01NDMsICAxMTZ9LCB7IC01MjQsIC04MDYsIC01ODV9LAoreyAgLTczLCAgNDc4LCAgNzI5fSwgeyAtMjg4LCAtOTI1LC0xMTQzfSwgeyAgMTczLCAgNDQ3LCAgLTUyfSwKK3sgICA2OCwgLTIyOSwgLTYwNn0sIHsgIDQ0OSwgIDUyOSwgMTc5N30sIHsgLTU5MSwgLTg3NSwtMTM2M30sCit7ICAxODMsIC0xNDQsICAzMjR9LCB7IC0xMDMsIC00NTIsIC02NjZ9LCB7ICA2MjMsICA0ODgsIDExNzZ9LAoreyAtMjM4LCAtNTExLC0xMDA0fSwgeyAgMzI2LCAgNTUyLCAgNDU4fSwgeyAgMTM2LCAgMTA4LCAtMzE5fSwKK3sgIDYyNiwgMTM0MywgMTg4M30sIHsgLTQ5MCwgLTY0NiwtMTczMH0sIHsgLTE4NiwgLTQ0OSwgIDk4NH0sCit7IC03MzgsICAtNzYsIC0xNzB9LCB7IC01NTAsICA3NTUsIDI1NjB9LCB7IC00OTYsIC01MTAsIC05NDd9LAoreyAgMjEwLCAgNjk0LCAgLTUyfSwgeyAgIDg0LCAtMzIyLCAtMTk5fSwgeyAxMDkwLCAxNjI1LCAxMjI0fSwKK3sgLTM3NiwgLTYwMywtMTM5Nn0sIHsgIDM0MywgICA3NCwgIDYzMn0sIHsgLTE3NSwgLTUwMiwgIC0zMn0sCit7ICA5NzIsIDEzMzIsICA3MzR9LCB7ICAgNTIsIC0yOTUsLTExMTN9LCB7IDEwNjUsICA5MTgsICAxNjB9LAoreyAgMzkzLCAgMTA3LCAtMzk3fSwgeyAxMjE0LCAyNjQ5LCAxNzQxfSwgeyAtNjMyLC0xMjAxLC0xODkxfSwKK3sgLTcxOSwgLTI3NywgIDM1M30sIHsgLTY1MSwgLTg4MCwgLTEyMn0sIHsgLTIxMSwgIDIwOSwgMTMzOH0sCit7IC01NjIsIC03MTQsLTEwNTl9LCB7IC0yMDgsICAzODgsICAxNTl9LCB7IC0zMjAsICAtNjEsIC01NTF9LAoreyAgMjkzLCAxMDkyLCAxNDQzfSwgeyAtNjQ4LCAtODY1LC0xMjUzfSwgeyAgLTQ5LCAtMTQzLCAgMzA1fSwKK3sgLTQwMSwgLTIyNywgLTU4NX0sIHsgIDU2MSwgIDUzMiwgIDkyN30sIHsgLTExNywgLTQ0MywtMTE4OH0sCit7ICA1MDcsICA0MzYsICAyOTJ9LCB7ICAtNzksICAyMzMsIC00NTh9LCB7ICA2NzEsIDEwMjUsIDIzOTZ9LAoreyAtNjMzLCAtODQyLC0xNTI1fSwgeyAtMzA4LCAtMjg2LCAgNjQwfSwgeyAtMzczLCAtNjIxLCAtNDA3fSwKK3sgIDQxOCwgIDI1MywgMTMwNX0sIHsgLTMxNSwgLTU4MSwtMTEzN30sIHsgIDU3MiwgIDY4NSwgLTI4MX0sCit7ICAgNjEsICAtNjgsIC0zNzF9LCB7ICA5OTEsIDExMDEsIDE0OTh9LCB7IC00OTMsIC02ODMsLTEzNjJ9LAoreyAgLTQ3LCAgMTY0LCAgNzA0fSwgeyAtMjU2LCAtMzE0LCAtMjY4fSwgeyAgNjMxLCAgOTQ5LCAxMDUyfSwKK3sgLTExOCwgLTM0OCwgLTgzM30sIHsgICA2OCwgMTE4MCwgIDU2OH0sIHsgIDE1MiwgIDExNywgICAzNH0sCit7IDExMTMsIDE5MDIsIDIyMzl9LCB7IC02MDEsIC05NTksLTE3MDZ9LCB7IC0xNDMsIC00ODksICA0ODB9LAoreyAtMzMyLCAtNjU1LCAtNTc0fSwgeyAgIDU0LCAgMzUzLCAxMTkyfSwgeyAtNDYyLCAtNjUyLCAtNzk2fSwKK3sgIDE1MCwgIDU0OSwgIDExMn0sIHsgIDE5NSwgLTExMSwgLTUxNX0sIHsgIDY3OSwgMTEwOCwgMTY0N30sCit7IC01NTgsIC03NDksLTEyMTd9LCB7ICAgLTksICAyNzIsICAzNDF9LCB7ICAtNTMsIC0yNjUsIC01MzV9LAoreyAgNDg5LCAgODQzLCAxMjk4fSwgeyAtMTIwLCAtNDgyLC0xMDMyfSwgeyAgNjMyLCAgNTQzLCAgNDA4fSwKK3sgIDE3OSwgIDMwNiwgLTUyNn0sIHsgMTEyNCwgMTQ2NCwgMjI0NH0sIHsgLTQxNywgLTc4NiwtMTU2Mn0sCit7IC0yMjQsIC0zODQsIDEzNjR9LCB7IC0zNzcsIC00NTksICAtMjV9LCB7ICAzODUsICA0ODksIDIxNzR9LAoreyAtMzMyLCAtNjUxLCAtODI5fSwgeyAgNTQ0LCAgNTUzLCAgIDYxfSwgeyAgIDIyLCAtMTEzLCAgLTg5fSwKK3sgMTEyOCwgMTcyNSwgMTUyNH0sIHsgLTIxNiwgLTM3MywtMTY1M30sIHsgIDE2MSwgIDMxNiwgIDkwOH0sCit7IC0xNjUsIC0yMjIsICAtNjd9LCB7IDEzNjIsIDExNzUsICA3ODl9LCB7ICAgNzMsIC0yNTIsIC03Njd9LAoreyAgNzM4LCAgOTMyLCAgNjE2fSwgeyAgMzYyLCAgMjQ2LCAtMTI2fSwgeyAgNzg3LCAyNjU0LCAzMDI3fSwKK3sgLTY5MSwtMTEwNiwtMjE5MH0sIHsgLTU2NSwgLTU4OCwgIDUyNH0sIHsgLTU5MCwgLTk3OSwgLTQ5MH0sCit7IC0yNjMsICAzOTcsICA5ODJ9LCB7IC01NzcsIC04MzcsIC05NDV9LCB7ICAtMjIsICA0MzUsICAtNDl9LAoreyAtMTkwLCAtMTE4LCAtNjI5fSwgeyAgLTg4LCAxMjQwLCAxNTEzfSwgeyAtNjM2LC0xMDUxLC0xMDE5fSwKK3sgLTI5MSwgIDE4OSwgIDI1OX0sIHsgLTI1NywgLTQ3MCwgLTYyOX0sIHsgIDE0NSwgIDk0NSwgIDg5NH0sCit7IC0zMjYsIC0zNjQsLTEwOTR9LCB7ICA1NDMsICAyNjAsICA2MzB9LCB7IC0yMDIsICAxODksIC0yMDl9LAoreyAgMzU3LCAxMzc5LCAyMDkxfSwgeyAtNTY5LC0xMDc1LC0xNDQ5fSwgeyAtNzE0LCAtMjM5LCAgOTE5fSwKK3sgLTQyMCwgLTcwNSwgIC04NH0sIHsgLTEwOSwgLTExNCwgMjQwN30sIHsgLTQxMywgLTUyOSwtMTE3N30sCit7ICA0ODIsICAzNjgsICAxMzF9LCB7IC0xODYsICAtNzIsIC0xMzF9LCB7ICA4NjEsIDEyNTUsIDEyMjB9LAoreyAtNjExLCAtNjU4LC0xMzQxfSwgeyAgMjI3LCAtMTIxLCAgNjMxfSwgeyAtMTc2LCAtNDg5LCAtMjE4fSwKK3sgIDc0NSwgMTE3NSwgIDk1N30sIHsgLTMyMSwgLTE0OCwgLTkzNn0sIHsgIDY3MSwgIDk2NiwgIDIxNn0sCit7ICAzNDAsICAgLTMsIC0xNDN9LCB7ICA0NjksIDE4NDgsIDI0Mzd9LCB7IC03MjksIC05NjEsLTE2ODN9LAoreyAtMjEzLCAtMjU0LCAgMzIxfSwgeyAtNTExLCAtNDM4LCAtNTIxfSwgeyAtMTI2LCAgNzI1LCAgOTAzfSwKK3sgLTM0MCwgLTY4NSwtMTAzMn0sIHsgIDMxNiwgIDQ4MCwgICAyMH0sIHsgICAyMywgIC04OSwgLTU1MX0sCit7ICAzNTMsIDEwNTEsIDE3ODl9LCB7IC01NDQsIC03NTcsLTEzNjR9LCB7ICAyOTgsICAtMjUsICA0MzZ9LAoreyAtMTAwLCAtMzkyLCAtNTE5fSwgeyAgNDY3LCAgNzU0LCAxMDc4fSwgeyAtMjEwLCAtMzk4LC0xMDc4fSwKK3sgIDYyMCwgIDY1OCwgIDYzMH0sIHsgICAzMywgIDE0NywgLTE3OH0sIHsgIDkyMSwgMTY4NywgMTkyMX0sCit7IC0zMjUsIC01MjgsLTE5Nzh9LCB7ICAgIDIsIC0yODUsICA5MTB9LCB7IC0zNzEsIC00OTAsIC0yMzB9LAoreyAgICAwLCAgNTk3LCAyMDEwfSwgeyAtNDk2LCAtMzk1LCAtODM0fSwgeyAgIDM3LCAgOTQ1LCAgMjQ1fSwKK3sgIDE4MSwgLTE2MCwgLTE0NH0sIHsgMTQ4MSwgMTM3MywgMTM1N30sIHsgLTM1NSwgLTYwMSwtMTI3MH0sCit7ICAyOTgsICAzMjIsICA2NzJ9LCB7IC0xOTMsIC0zMzYsICAgNzd9LCB7IDEwODksIDE1MzMsICA5MjJ9LAoreyAgMTc3LCAgLTM5LC0xMTI1fSwgeyAgOTk2LCAgNzgxLCAgNTM2fSwgeyAgNDU2LCAgMzY2LCAtNDMyfSwKK3sgMTQxNSwgMjQ0MCwgMjI3OX0sIHsgLTQ2NiwgLTc1OCwtMjMyNX0sIHsgLTMwMywgLTUwOSwgIDM4N30sCit7IC03MjcsIC01NTcsICAgNjZ9LCB7IC0xNDUsICA2NDMsIDEyNDh9LCB7IC01NDQsIC02NzYsIC05MTZ9LAoreyAtMjI1LCAgODYyLCAgNTg4fSwgeyAtMTUyLCAgIDQwLCAtNTMzfSwgeyAgNDIzLCAxNDIzLCAxNTU4fSwKK3sgLTU3MiwgLTg0MywtMTE0NX0sIHsgLTEyOCwgICA4NSwgIDQ2MX0sIHsgLTIzOCwgLTI1NywgLTU4NH0sCit7ICA2MDUsICA3NDgsICA4NjF9LCB7ICAgMjQsIC0yMDIsLTE0MDl9LCB7ICA3OTcsICA0ODcsICAzMDN9LAoreyAtMTgxLCAgMzY0LCAtMTgyfSwgeyAgNjE2LCAxMzc4LCAyOTQyfSwgeyAtNDk0LCAtODUyLC0xNDQxfSwKK3sgLTI5MiwgICA2MSwgIDgxMn0sIHsgIC04NCwgLTcyMywgLTE4Mn0sIHsgIDU1NSwgIDUzMiwgMTUwNn0sCit7IC0zNjUsIC00OTMsLTEwNTd9LCB7ICA4MjIsICA1ODgsICAgMTF9LCB7ICAtMTQsICAtMTgsIC0yMzB9LAoreyAxMDAxLCAxNDAxLCAxNDUxfSwgeyAtNDc0LCAtNTY5LC0xMjkyfSwgeyAgMzAyLCAgIDYyLCAxMDYyfSwKK3sgIC03MCwgLTM3NiwgLTIyMn0sIHsgIDk4MiwgIDk3NCwgMTE0OX0sIHsgLTE5NiwgLTIzNCwgLTc5NX0sCit7ICA0NzksIDEwOTgsICA0OTl9LCB7ICAzNjIsICAgNTgsICAgNzB9LCB7IDExNDcsIDIwNjksIDI4NTd9LAoreyAtNDg3LCAtODc4LC0xODI0fSwgeyAgIDczLCAtMjg4LCAgMzQ4fSwgeyAtMzU4LCAtNTAwLCAtNTA4fSwKK3sgIDE5OSwgIDcyMSwgMTI0Mn0sIHsgIC03OCwgLTY5NywgLTc5NX0sIHsgIDM2MSwgIDUzNiwgIDE5Nn0sCit7ICAzNzQsICAxMTAsIC03MzV9LCB7ICA4NDcsIDEwNTEsIDE4OTZ9LCB7IC0zNjYsIC03MTMsLTExODJ9LAoreyAgMzE1LCAgMzIwLCAgNDI5fSwgeyAgIDcyLCAtMjE1LCAtNDUwfSwgeyAgNzU5LCAgODg2LCAxMzYzfSwKK3sgIC0zMCwgLTQyOCwgLTgzNH0sIHsgIDg2MSwgIDYyNywgIDc5Nn0sIHsgIDExOCwgIDQ2OCwgLTI3OX0sCit7IDEzNTUsIDE4ODMsIDE4OTN9LCB7IC0xODgsIC02NDIsLTE2MTJ9LCB7ICAgNjMsIC0xNzUsIDExOTh9LAoreyAtNDE4LCAtMjExLCAgIDUxfSwgeyAgNDE0LCAgNTg3LCAyNjAxfSwgeyAtMjM0LCAtNTU3LCAtODU4fSwKK3sgIDQyNCwgIDg4OSwgIDIyMn0sIHsgIDEzNiwgLTEwMSwgICA4M30sIHsgMTQxMywgMjI3OCwgMTM4M30sCit7ICAtODQsIC00NDUsLTEzODl9LCB7ICA0MTQsICAzMTMsIDEwNDV9LCB7ICAgMjksIC0zNDMsICAgNjV9LAoreyAxNTUyLCAxNjQ3LCAgOTgwfSwgeyAgMTgzLCAgLTkxLCAtODI5fSwgeyAxMjczLCAxNDEzLCAgMzYwfSwKK3sgIDU1MywgIDI3MiwgLTEwN30sIHsgMTU4NywgMzE0OSwgMjYwM30KK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGxzZl8zXzFbMjU2XVszXSA9IHsKK3sgICAgNiwgICA4MiwgLTEzMX0sIHsgIDE1NCwgIC01NiwgLTczNX0sIHsgIDE4MywgIC02NSwgLTI2NX0sCit7ICAgIDksIC0yMTAsIC0zNjF9LCB7ICAxMTMsICA3MTgsIDE4MTd9LCB7IDEwMTAsIDEyMTQsIDE1NzN9LAoreyAgODU3LCAxMzMzLCAyMjc2fSwgeyAgODI3LCAxNTY4LCAxOTMzfSwgeyAgNzE3LCAxOTg5LCAyMjA2fSwKK3sgIDgzOCwgMTE3MiwgMTgyM30sIHsgIDcyMSwgMTAwMCwgMjE1NH0sIHsgIDI4NiwgIDQ3NiwgMTUwOX0sCit7IC0yNDcsIC01MzEsICAyMzB9LCB7ICAxNDcsICAtODIsICA1Njl9LCB7ICAgMjYsIC0xNzcsIC05NDR9LAoreyAgLTI3LCAtMjczLCAgNjkyfSwgeyAtMTY0LCAtMjY0LCAtMTgzfSwgeyAgMjI0LCAgNzkwLCAxMDM5fSwKK3sgIDg5OSwgIDk0NiwgIDYwMX0sIHsgIDQ4NSwgIDc3MSwgMTE1MH0sIHsgIDUyNCwgIDY3NywgIDkwM30sCit7IC0xNDAsICAzNzUsICA3Nzh9LCB7ICA0MTAsICA2NzYsICA0Mjl9LCB7ICAzMDEsICA1MzAsIDEwMDl9LAoreyAgNzE5LCAgNjQ2LCAgIDM4fSwgeyAgMjI2LCAgMzY3LCAgIDQwfSwgeyAgMTQ1LCAgLTQ1LCAtNTA1fSwKK3sgIDI5MCwgIDEyMSwgLTEyMX0sIHsgIDMwMiwgIDEyNywgIDE2Nn0sIHsgLTEyNCwgLTM4MywgLTk1Nn0sCit7IC0zNTgsIC00NTUsIC05Nzd9LCB7ICA3MTUsICA4NzgsICA4OTR9LCB7ICA5NzgsICA5MjMsICAyMTF9LAoreyAgNDc3LCAgMjcyLCAgIDY0fSwgeyAgMTg4LCAgLTc4LCAgIDE3fSwgeyAtMTQzLCAgLTY1LCAgIDM4fSwKK3sgIDY0MywgIDU4NiwgIDYyMX0sIHsgLTEzNCwgLTQyNiwgLTY1MX0sIHsgIDM0NywgIDU0NSwgMjgyMH0sCit7IDExODgsIDI3MjYsIDI0NDJ9LCB7ICAxNDIsICAtODAsIDE3MzV9LCB7ICAyODMsICAxMzAsICA0NjF9LAoreyAtMjYyLCAtMzk5LC0xMTQ1fSwgeyAtNDExLCAgMTU1LCAgNDMwfSwgeyAgMzI5LCAgMzc1LCAgNzc5fSwKK3sgICA1MywgLTIyNiwgLTEzOX0sIHsgLTEyOSwgLTIzNiwgMTY4Mn0sIHsgIDI4NSwgIDc0NCwgMTMyN30sCit7ICA3MzgsICA2OTcsIDE2NjR9LCB7ICAzMTIsICA0MDksICAyNjZ9LCB7ICAzMjUsICA3MjAsICAxMzV9LAoreyAgICAxLCAgMjIxLCAgNDUzfSwgeyAgICA4LCAgMjAzLCAgMTQ1fSwgeyAgMjk5LCAgNjQwLCAgNzYwfSwKK3sgICAyOSwgIDQ2OCwgIDYzOH0sIHsgIDEwMywgIDQyOSwgIDM3OX0sIHsgIDQyMCwgIDk1NCwgIDkzMn0sCit7IDEzMjYsIDEyMTAsIDEyNTh9LCB7ICA3MDQsIDEwMTIsIDExNTJ9LCB7IC0xNjYsIC00NDQsIC0yNjZ9LAoreyAtMzE2LCAtMTMwLCAtMzc2fSwgeyAgMTkxLCAxMTUxLCAxOTA0fSwgeyAtMjQwLCAtNTQzLC0xMjYwfSwKK3sgLTExMiwgIDI2OCwgMTIwN30sIHsgICA3MCwgMTA2MiwgMTU4M30sIHsgIDI3OCwgMTM2MCwgMTU3NH0sCit7IC0yNTgsIC0yNzIsIC03Njh9LCB7ICAgMTksICA1NjMsIDIyNDB9LCB7ICAgLTMsIC0yNjUsICAxMzV9LAoreyAtMjk1LCAtNTkxLCAtMzg4fSwgeyAgMTQwLCAgMzU0LCAtMjA2fSwgeyAtMjYwLCAtNTA0LCAtNzk1fSwKK3sgLTQzMywgLTcxOCwtMTMxOX0sIHsgIDEwOSwgIDMzMSwgIDk2Mn0sIHsgLTQyOSwgIC04NywgIDY1Mn0sCit7IC0yOTYsICA0MjYsIDEwMTl9LCB7IC0yMzksICA3NzUsICA4NTF9LCB7ICA0ODksIDEzMzQsIDEwNzN9LAoreyAtMzM0LCAtMzMyLCAgIDI1fSwgeyAgNTQzLCAxMjA2LCAxODA3fSwgeyAgMzI2LCAgIDYxLCAgNzI3fSwKK3sgIDU3OCwgIDg0OSwgMTQwNX0sIHsgLTIwOCwgLTI3NywgIDMyOX0sIHsgLTE1MiwgICA2NCwgIDY2OX0sCit7IC00MzQsIC02NzgsIC03Mjd9LCB7IC00NTQsICAtNzEsICAyNTF9LCB7ICA2MDUsICA0ODAsICAyNTR9LAoreyAtNDgyLCAgIDExLCAgOTk2fSwgeyAtMjg5LCAgMzk1LCAgNDg2fSwgeyAgNzIyLCAxMDQ5LCAxNDQwfSwKK3sgIC0zMCwgLTMxNiwgLTc4Nn0sIHsgLTEwNiwgLTExNSwgLTYxOX0sIHsgIDg2MSwgMTQ3NCwgMTQxMn0sCit7IDEwNTUsIDEzNjYsIDExODR9LCB7ICA4MTIsIDEyMzcsICA5MjV9LCB7ICAgNDIsIC0yNTEsIC01NzZ9LAoreyAgMzQyLCAgMTQxLCAtNDU0fSwgeyAtMTY4LCAgLTgwLCAxMzU5fSwgeyAtMzQyLCAtNjU2LC0xNzYzfSwKK3sgIDEwMCwgIDgyMSwgIDcyNX0sIHsgIDk5MCwgIDc0NywgIDgwMH0sIHsgIDMzMiwgIDQ0MCwgIDU2OH0sCit7ICA2NjMsICAzNzksICA4NTJ9LCB7ICAxMTIsICAxNjUsIC0zNjl9LCB7ICA1OTcsICA5MTAsICAyODJ9LAoreyAgIC04LCAgODM0LCAxMjgxfSwgeyAtMzUyLCAgNTcyLCAgNjk1fSwgeyAgNDYyLCAyMjQ2LCAxODA2fSwKK3sgIDM0NSwgIDE5MCwgMTM3NH0sIHsgIDQxNiwgIDkxNSwgMjE2Nn0sIHsgIDE2OCwgIC04MiwgIDI4MH0sCit7IC01MTYsIC00NDYsICA4NDB9LCB7ICAgNDcsICA1MzMsICAgNDR9LCB7IC0zNjIsIC03MTEsLTExNDN9LAoreyAgIDIyLCAgMTkzLCAxNDcyfSwgeyAgLTg1LCAgMjMzLCAxODEzfSwgeyAgLTYyLCAgNTc5LCAxNTA0fSwKK3sgIDU1MCwgIDk0NCwgMTc0OX0sIHsgIDcyMywgIDY1MCwgMTE0OH0sIHsgIDk3MiwgIDg4NCwgMTM5NX0sCit7IC00MjUsICA2NDMsICAgIDB9LCB7IDEwMDAsICA5NTIsIDEwOTh9LCB7ICAyNDksIDE0NDYsICA2NzJ9LAoreyAtMzM0LCAgLTg3LCAyMTcyfSwgeyAtNTU0LCAxODgyLCAyNjcyfSwgeyAgMTQwLCAxODI2LCAxODUzfSwKK3sgIDkyMCwgMTc0OSwgMjU5MH0sIHsgMTA3NiwgMTkzMywgMjAzOH0sIHsgLTEzNywgLTQ0MywtMTU1NX0sCit7IDEyNjksIDExNzQsICA0Njh9LCB7IC00OTMsIC0xMjIsIDE1MjF9LCB7IC00NTEsIDEwMzMsIDEyMTR9LAoreyAgNDgyLCAxNjk1LCAxMTE4fSwgeyAgODE1LCAgNjQ5LCAgMzg0fSwgeyAtNDQ2LCAtNjkyLCAgMTA3fSwKK3sgLTMxOSwgLTYwNSwgLTExOH0sIHsgLTIwNywgLTUwNSwgIDUyNX0sIHsgLTQ2OCwgIC0xMiwgMjczNn0sCit7ICAgNzUsIDE5MzQsIDEzMDV9LCB7ICA4ODAsIDIzNTgsIDIyNjd9LCB7IDEyODUsIDE1NzUsIDIwMDR9LAoreyAgLTQ4LCAtMzA0LC0xMTg2fSwgeyAtNDM1LCAtNDYxLCAtMjUxfSwgeyAtMzY2LCAtNDA0LCAtNTQ3fSwKK3sgLTI4OSwgLTYwNSwgLTU5N30sIHsgLTUzOCwgLTgxMCwgLTE2NX0sIHsgLTEyMCwgICAgMywgIDM1Nn0sCit7ICA2MzksIDEyNDEsIDE1MDJ9LCB7ICAgOTYsICAxNzcsICA3NTB9LCB7IC00MzUsIC01ODUsLTExNzR9LAoreyAtMzU2LCAgMTA5LCAgLTc5fSwgeyAtNDg1LCAgMjg4LCAyMDA1fSwgeyAgICA5LCAxMTE2LCAgNzMxfSwKK3sgIDg4MCwgMjEzNCwgIDk0Nn0sIHsgLTI2NSwgMTU4NSwgMTA2NX0sIHsgMTE1NywgMTIxMCwgIDg0M30sCit7IC00OTgsIC02NjgsICA0MzF9LCB7ICAzNzQsICAzMjEsIC0yMjl9LCB7IDE0NDAsIDIxMDEsIDEzODF9LAoreyAgNDQ5LCAgNDYxLCAxMTU1fSwgeyAtMTA1LCAgIDM5LCAtMzg0fSwgeyAtMjYzLCAgMzY3LCAgMTgyfSwKK3sgLTM3MSwgLTY2MCwgIDc3M30sIHsgLTE4OCwgMTE1MSwgIDk3MX0sIHsgMTMzMywgMTYzMiwgMTQzNX0sCit7ICA3NzQsIDEyNjcsIDEyMjF9LCB7IC00ODIsIC04MzIsLTE0ODl9LCB7IC0yMzcsIC0yMTAsICA4NjB9LAoreyAgODkwLCAxNjE1LCAxMDY0fSwgeyAgNDcyLCAxMDYyLCAxMTkyfSwgeyAgMTg1LCAxMDc3LCAgOTg5fSwKK3sgLTU2OCwgLTk5MiwtMTcwNH0sIHsgLTQ0OSwgLTkwMiwtMjA0M30sIHsgLTE0MiwgLTM3NywgLTQ1OH0sCit7IC0yMTAsIC01NTQsLTEwMjl9LCB7ICAtMTEsIDExMzMsIDIyNjV9LCB7IC0zMjksIC02NzUsIC04OTN9LAoreyAtMjUwLCAgNjU3LCAxMTg3fSwgeyAgNTE5LCAxNTEwLCAxNzc5fSwgeyAgNTIwLCAgNTM5LCAxNDAzfSwKK3sgIDUyNywgMTQyMSwgMTMwMn0sIHsgLTU2MywgLTg3MSwtMTI0OH0sIHsgLTE0NywgLTQ2MywgIDg3OX0sCit7ICAtNzYsIDIzMzQsIDI4NDB9LCB7ICA1NjMsIDI1NzMsIDIzODV9LCB7ICA2MzIsIDE5MjYsIDI5MjB9LAoreyAgNzE5LCAyMDIzLCAxODQwfSwgeyAtNTQ1LCAtNzIzLCAxMTA4fSwgeyAgMTI5LCAtMTI1LCAgODg0fSwKK3sgMTQxNywgMTYzMiwgIDkyNX0sIHsgIC05NCwgMTU2NiwgMTc1MX0sIHsgLTM0MSwgMTUzMywgMTU1MX0sCit7ICA1OTEsICAzOTUsIC0yNzR9LCB7ICAtNzYsICA5ODEsIDI4MzF9LCB7ICAxNTMsIDI5ODUsIDE4NDR9LAoreyAxMDMyLCAyNTY1LCAyNzQ5fSwgeyAxNTA4LCAyODMyLCAxODc5fSwgeyAgNzkxLCAxMTk5LCAgNTM4fSwKK3sgLTE5MCwgLTQ1MywgMTQ4OX0sIHsgLTI3OCwgLTU0OCwgMTE1OH0sIHsgLTI0NSwgMTk0MSwgMjA0NH0sCit7IDEwMjQsIDE1NjAsIDE2NTB9LCB7ICA1MTIsICAyNTMsICA0NjZ9LCB7ICAtNjIsIC0zMjMsIDExNTF9LAoreyAtNDczLCAtMzc2LCAgNTA3fSwgeyAtNDMzLCAxMzgwLCAyMTYyfSwgeyAgODk5LCAxOTQzLCAxNDQ1fSwKK3sgIDEzNCwgIDcwNCwgIDQ0MH0sIHsgIDQ2MCwgIDUyNSwgIC0yOH0sIHsgLTQ1MCwgIDI3OSwgMTMzOH0sCit7ICAgIDAsICA5NzEsICAyNTJ9LCB7IC00NDUsIC02MjcsIC05OTF9LCB7IC0zNDgsIC02MDIsLTE0MjR9LAoreyAgMzk4LCAgNzEyLCAxNjU2fSwgeyAtMTA3LCAgMzE0LCAtMTc4fSwgeyAgIDkzLCAyMjI2LCAyMjM4fSwKK3sgIDUxOCwgIDg0OSwgIDY1Nn0sIHsgLTQ2MiwgLTcxMSwgLTQ0N30sIHsgIDE3NCwgIC0zNCwgMTE5MX0sCit7IC0xMTksICAgNDIsIDEwMDV9LCB7IC0zNzIsICAyNzQsICA3NTh9LCB7IDEwMzYsIDIzNTIsIDE4Mzh9LAoreyAgNjc1LCAxNzI0LCAxNDk4fSwgeyAgNDMwLCAxMjg2LCAyMTMzfSwgeyAtMTI5LCAtNDM5LCAgICAwfSwKK3sgLTM3MywgIDgwMCwgMjE0NH0sIHsgICAgNiwgMTU4NywgMjQ3OH0sIHsgIDQ3OCwgIDU5NiwgMjEyOH0sCit7IC00MjgsIC03MzYsIDE1MDV9LCB7ICAzODUsICAxNzgsICA5ODB9LCB7ICAxMzksICA0NDksIDEyMjV9LAoreyAtNTI2LCAtODQyLCAtOTgyfSwgeyAgMTQ1LCAxNTU0LCAxMjQyfSwgeyAgNjIzLCAxNDQ4LCAgNjU2fSwKK3sgIDM0OSwgMTAxNiwgMTQ4Mn0sIHsgICAzMSwgLTI4MCwgIDQxNX0sIHsgLTMxNiwgIDcyNCwgMTY0MX0sCit7ICAzNjAsIDEwNTgsICA1NTZ9LCB7IC00MzYsIC0zNTgsIDEyMDF9LCB7IC0zNTUsIDExMjMsIDE5Mzl9LAoreyAgNDAxLCAxNTg0LCAyMjQ4fSwgeyAtNTI3LC0xMDEyLCAgMzU1fSwgeyAgMjMzLCAgMjM4LCAyMjMzfSwKK3sgLTU1MCwgLTg5NywgLTYzOX0sIHsgLTM2NSwgLTUwMSwgMTk1N30sIHsgIDM4OSwgMTg2MCwgMTYyMX0sCit7ICAxNjIsIDExMzIsIDEyNjR9LCB7IC0yMzcsIDExNzQsIDEzOTB9LCB7IC02NDAsIC00MTEsICAxMTZ9LAoreyAtMjI4LCAxNjk0LCAyMjk4fSwgeyAxNjM5LCAyMTg2LCAyMjY3fSwgeyAgNTYyLCAxMjczLCAyNjU4fSwKK3sgIDMyMywgIDMzOCwgMTc3NH0sIHsgIDU3OCwgMTEwNywgIDg1Mn0sIHsgICAyMiwgIDU5NCwgIDkzNH0sCit7IC0xNDMsICA3MTgsICA0NDZ9Cit9OworCisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGxzZl8zXzJbNTEyXVszXSA9IHsKK3sgICA1MCwgICA3MSwgICAtOX0sIHsgLTMzOCwgLTY5OCwtMTQwN30sIHsgIDEwMiwgLTEzOCwgLTgyMH0sCit7IC0zMTAsIC00NjksLTExNDd9LCB7ICA0MTQsICAgNjcsIC0yNjd9LCB7IDEwNjAsICA4MTQsIDE0NDF9LAoreyAxNTQ4LCAxMzYwLCAxMjcyfSwgeyAxNzU0LCAxODk1LCAxNjYxfSwgeyAyMDE5LCAyMTMzLCAxODIwfSwKK3sgMTgwOCwgMjMxOCwgMTg0NX0sIHsgIDY0NCwgIC05MywgIDQ1NH0sIHsgIDg1OCwgIDMyOSwgLTEzNn0sCit7ICA0ODksIC0yNTgsIC0xMjh9LCB7IC0xOTgsIC03NDUsICAtNDF9LCB7ICAtNTIsIC0yNjUsIC05ODV9LAoreyAgMzQ2LCAgMTM3LCAgNDc5fSwgey0xNzQxLCAtNzQ4LCAtNjg0fSwgey0xMTYzLC0xNzI1LCAtMzY3fSwKK3sgLTg5NSwtMTE0NSwgLTc4NH0sIHsgLTQ4OCwgLTk0NiwgLTk2OH0sIHsgIC04NSwgLTM5MCwgLTcyNX0sCit7ICAyMTUsIC0zNDAsIC0xNzF9LCB7IDEwMjAsICA5MTYsIDE5Njl9LCB7ICA1NjQsICAxNzksICA3NDZ9LAoreyAgNjYyLCAgOTc3LCAxNzM0fSwgeyAgODg3LCAgNjIyLCAgOTE0fSwgeyAgOTM5LCAgODU2LCAxMTY1fSwKK3sgIDMwOSwgIDY4OCwgIDgwM30sIHsgIDkxNywgIDE2MSwgIDU3MH0sIHsgIDExOCwgIC0yMCwgLTI4M30sCit7IC04MTYsICAtNDIsICAyMDR9LCB7LTEyMjgsIC0zMjUsIC00NjJ9LCB7IC05NjMsIC0yMDIsIC0xNDN9LAoreyAtOTg4LCAtNDg0LCAtMzYxfSwgeyAtNzAyLCAtOTc4LCAtNDc3fSwgeyAtMzAyLCAtNzkwLC0xMTg4fSwKK3sgLTEwMCwgLTc4NiwtMTA4OH0sIHstMTA1NCwgLTk0NywtMTY4NH0sIHsgLTIwMiwgLTg0MywgLTc4Mn0sCit7LTEwMzksLTEzNzgsIC05MDF9LCB7IC02MjQsIC0xMTAsICAtODV9LCB7ICAzNTYsICAyMTMsICAtMTB9LAoreyAtNDkzLCAgMzY0LCAgNzc0fSwgeyAgNDI1LCAgODIyLCAgNDc5fSwgeyAgLTgzLCAgNTU3LCAgNTIwfSwKK3sgLTk5MiwtMTU2MCwgLTU3Mn0sIHsgLTYwMywgLTc0MSwgIC0yNn0sIHsgLTUwMiwgLTYzOCwgLTkwM30sCit7ICAyMDksICAzMDYsICAxNDd9LCB7IC0zMTYsIC01OTMsIC01OTZ9LCB7ICAtODUsIC0yMTEsIC0yMjV9LAoreyAtOTE4LCAtNTI5LCAgMTE3fSwgeyAgMjMzLCAtNDM5LCAtNzM4fSwgeyAxMTAxLCAgNzUxLCAgNjMzfSwKK3sgMTQ1NywgMTcxNiwgMTUxMX0sIHsgMTc2NSwgMTQ1NywgIDkxMH0sIHsgMTEyMiwgMTE1NiwgIDg0OX0sCit7IDEzNTQsICA4NjgsICA0NzB9LCB7IC04NzEsLTExNTAsLTE3OTZ9LCB7IC04NzEsIC04NjEsIC05OTJ9LAoreyAtMTE4LCAgMTU1LCAgMjEyfSwgey0xMDUxLCAtODQ5LCAtNjA2fSwgey0xMTE3LC0xODQ5LC0yNzUwfSwKK3stMTAxOSwtMTQyNywtMTg2OX0sIHsgIDM3MCwgLTE4NCwgLTQxNH0sIHsgIDk1OSwgIDQ5MywgIDEwNH0sCit7ICA5NTgsIDEwMzksICA1NDN9LCB7ICAxNTQsICA2NTMsICAyMDF9LCB7IDEyNDksICA1MDcsICAxNTB9LAoreyAgNjYzLCAgNTAzLCAgMjMwfSwgeyAgNjIzLCAgNzc3LCAgNjc1fSwgeyAgNjU5LCAgIDg4LCAtMTEwfSwKK3sgIDg0MywgIDI0NCwgIDIyNH0sIHsgIDM4MiwgIDU0MSwgIDMwMn0sIHsgIDcyNCwgIDQzMywgIDY2Nn0sCit7IDExNjYsICA3MzQsICAzNDF9LCB7IC0xMzgsICAgMjAsIC0zOTd9LCB7LTExODMsIC00MjQsICAtNDZ9LAoreyAtMzIxLCAtMzUyLCAtMTI0fSwgeyAxMzMzLCAxMDIxLCAxMDgwfSwgeyAgMjYyLCAgMzY2LCAgNzIzfSwKK3sgIDkyMiwgIDI4MywgLTU1MX0sIHsgICAzMSwgLTYzNiwgLTYxMX0sIHsgLTY4OSwgLTY5NywgLTQxNX0sCit7IC05NTIsIC03NzksIC0yMDF9LCB7LTEzMjksIC01OTgsIC0zNTl9LCB7IC05NTMsLTEyODUsICAxNjZ9LAoreyAgNDkzLCAgMzA1LCAgMjIxfSwgeyAgODQ2LCAgNzAzLCAgNjEwfSwgeyAgODQwLCAgOTM2LCAgNzc0fSwKK3sgLTcyMywtMTMyNCwtMTI2MX0sIHsgLTM1NywtMTAyNSwtMTM4OH0sIHstMTA5NiwtMTM3NiwgLTM2NX0sCit7LTE0MTYsLTE4ODEsIC02MDh9LCB7LTE3OTgsLTE3MjcsIC02NzR9LCB7IC01NDUsLTExNzMsIC03MDN9LAoreyAgNjc4LCAgNzg2LCAgMTQ4fSwgeyAtMTIzLCAgNjk2LCAxMjg4fSwgeyAgNjQ0LCAgMzUwLCAgLTEwfSwKK3sgIDQxNCwgIDYxNCwgICAxNX0sIHsgIDEzNywgIDM0NCwgLTIxMX0sIHsgLTgxNCwtMTUxMiwgLTgxOX0sCit7IC0zOTEsIC05MzAsIC01ODh9LCB7ICAgNDcsIC01OTEsIC04OTh9LCB7IC05MDksLTEwOTcsIC0xNjN9LAorey0xMjcyLC0xMTY3LCAtMTU3fSwgey0xNDY0LC0xNTI1LCAtMzg5fSwgey0xMjc0LC0xMTg4LCAtNjI0fSwKK3sgIDY3MSwgIDIxMywgIDQ1NH0sIHsgIDEyNCwgLTI3NCwgLTUyNX0sIHsgLTcyOSwgLTQ5NiwgLTE1Mn0sCit7LTEzNDQsICAxMjIsICAxMzV9LCB7LTI5MDUsIC01ODksIC0zOTR9LCB7LTE3MjgsICA0NDEsICAtNTB9LAoreyAxNDc2LCAgOTA0LCAgNzg3fSwgeyAgMzE2LCAgMjM2LCAtNDQwfSwgeyAtMzQ3LCAgMjE3LCAgNDEzfSwKK3sgLTkxMSwgLTkxNywgIDEyMX0sIHsgLTQ1NSwgLTkzMiwgIDIwMn0sIHsgIC05MiwgLTQ2NSwgLTM3NX0sCit7ICA0ODgsICAzOTAsICA0NzR9LCB7ICA4NzYsICA3MjksICAzMTZ9LCB7LTE4MTUsLTEzMTIsIC02Njl9LAoreyAgIDg3LCAgOTYyLCAgNDMyfSwgeyAgNTYzLCAtMjQ5LC0xMDU4fSwgeyAgMjUwLCAgMjg1LCAxMTA1fSwKK3sgMTE0MSwgIDQyNywgIDY5Nn0sIHstMTAzOCwtMTY2NCwtMTU4Mn0sIHsgLTk0OCwgIDM0NiwgIDE2MH0sCit7IC0zMDksIC0yNzIsIC04NTh9LCB7ICA2NzAsICA2MjQsIDEyNTB9LCB7IC05NDQsIC00MDgsIC02NjZ9LAoreyAtNjA2LCAtMzIwLCAtMzg0fSwgeyAtNDkyLCAgMjMwLCAgIDY1fSwgeyAgMzM0LCAgLTUwLCAgLTE2fSwKK3sgIC0xNiwgLTY5MCwtMTM5N30sIHsgMTc5MSwgMTcxNiwgMTM5OX0sIHsgMjQ3OCwgMjA2MywgMTQwNH0sCit7IDEyNDUsIDE0NzEsIDE0MjZ9LCB7IC0zODIsLTEwMzcsICAgLTJ9LCB7ICAxNzMsIC0zOTgsIDExNDV9LAoreyAxNDkxLCAyMDI0LCAxODAxfSwgeyAgNzcyLCAxMjc0LCAxNTA2fSwgeyAxNDI5LCAxNzM1LCAyMDAxfSwKK3sgMTA3OSwgMTIxOCwgMTI3M30sIHstMTE1NCwtMTg1MSwtMTMyOX0sIHsgLTgwOCwtMTEzMywtMTA5Nn0sCit7IC00NTEsLTEwMzMsLTE3MjJ9LCB7ICAgNjUsICA1NzgsICAtODR9LCB7LTE0NzYsLTI0MzQsLTE3Nzh9LAoreyAtNzY1LC0xMzY2LCAtNDk0fSwgeyAtMjE4LCAtNTk0LCAtOTMxfSwgeyAgMzM3LCAtMjM2LCAgNTYyfSwKK3sgMjM1NywgMjY2MiwgMTkzOH0sIHsgMTQ4OSwgMTI3NiwgIDg3NH0sIHsgIDE4OSwgIDM1OCwgIDM3NH0sCit7LTE1MTksLTIyODEsLTIzNDZ9LCB7IC05NjcsLTEyNzEsLTIwOTV9LCB7IC02MjgsLTExODgsLTE1NDJ9LAoreyAxNjYxLCAxMDQzLCAgNTQ2fSwgeyAgNTY1LCAxMDYxLCAgNzMyfSwgeyAgLTY0LCAtODM2LCAtNDM0fSwKK3sgLTQzNiwgIC05NiwgIDIwM30sIHsgMTA3OCwgMTIxNiwgMTYzNn0sIHsgIDkwNywgMTUzNCwgIDk4Nn0sCit7ICAzMjYsICA5NjUsICA4NDV9LCB7ICAxNDIsICAtODQsICAxOTd9LCB7ICA0NzAsIDIzNzksIDE1NzB9LAoreyAxMTMzLCAgNDcwLCAxMjE0fSwgeyAgMzk1LCAxMzc2LCAxMjAwfSwgeyAxMTI1LCAxMDQyLCAgMzQ4fSwKK3sgLTU0MywtMTIzNCwgLTM3Nn0sIHsgLTIxNSwgLTE4MSwgIDQ4MX0sIHstMTk0NywtMTYyMSwgLTIxMH0sCit7IC03NTAsLTExODUsICAzOTB9LCB7ICAgMjksIC0zOTksICAgMjd9LCB7ICA4MjAsIDEyMzYsICA3NTV9LAoreyAgNjk1LCAgOTc5LCAgNDA5fSwgeyAtMTc0LCAxMTk3LCAxMDM1fSwgeyAgOTEyLCAxMzU2LCAxODQ2fSwKK3sgLTk5MiwtMTQzNywgIDQ4NH0sIHstMTQ4NSwtMTcwMCwgIDIwOH0sIHsgLTQxMiwgMTIwNCwgMTQzMn0sCit7IC0yNzEsICA4OTYsIDExNDR9LCB7IC00MTYsIDE3NzcsIDE0MzR9LCB7LTE2OTYsLTI2NDQsIC0yMDR9LAorey0xNzg5LC0xNTUxLCAxMDMzfSwgey0xNjU2LC0xNTU5LCAxMzAzfSwgey0xMjUzLC0xNTg5LCAxMDgxfSwKK3sgLTY2OSwtMTA5NSwgIC02Nn0sIHsgLTY4MiwgIDMyMCwgLTM0NX0sIHsgIDY1OSwgIDMwNSwgMTA2OX0sCit7LTEyOTIsIC04MDQsICAtMTl9LCB7LTE2MzUsLTEyOTEsICAgMjl9LCB7LTE2ODMsIC00OTcsICAgNzF9LAoreyAtMjg3LCAgIC03LCAtMTAwfSwgeyAtNDk0LCAtOTYyLCAtMjM3fSwgeyAgODUyLCAxODgxLCAxNzQwfSwKK3stMTIxNywtMTM4NywgIDIyN30sIHsgLTY2MCwgIDMwMiwgIDM3M30sIHsgICA5NiwgMTA4NywgMTI1N30sCit7LTEwNzQsLTE2NjksICAxNjB9LCB7ICA0ODUsIDIwNzYsIDE3OTh9LCB7IC05MzQsIC0yMjAsICA1NTJ9LAoreyAtNTk2LCAtNjEyLCAgMjM3fSwgeyAgMzM2LCAxNzIwLCAgODc5fSwgeyAgNjQzLCAgNjI5LCAgNDM0fSwKK3sgMTI2NywgIDUyMiwgMTYzM30sIHsgICAxNSwgIDI0NCwgLTQ0MX0sIHsgMTQ3NSwgIDcxNywgIDE4NH0sCit7IDE4MTksIDE1OTAsIDE3MDl9LCB7ICA5ODgsICAyNjEsICA5Mzd9LCB7IDIwOTMsIDIzNDUsIDE1MjB9LAoreyAyMTM5LCAxODU4LCAxNjA2fSwgeyAtNTc3LCAtNTc5LC0xMjAzfSwgeyAtOTU2LCAgMTM1LCAtNDg4fSwKK3sgLTQ2NCwgICA1MSwgLTMzOH0sIHsgLTYyOSwgLTM0OCwgLTcyM30sIHsgMTE0NiwgMjA3MywgMTQ0Mn0sCit7IDIxOTIsIDE0NjYsICA5MTF9LCB7LTE0NDQsLTE1NzIsLTIyNzh9LCB7IDE0MDAsICA3MTAsIDEyOTd9LAoreyAxMzM1LCAgNjMzLCAgOTI4fSwgeyAxNDM0LCAyMTk0LCAyNTk0fSwgeyAyNDIyLCAyMjA0LCAxODgxfSwKK3sgIDk4MiwgMjI0MiwgMTg1NH0sIHsgIDM4MCwgIDc5MiwgMTE0NX0sIHsgIC02MywgLTUzOSwgIDQxNH0sCit7IC0yNTIsIC05NjQsIC0zMTR9LCB7LTEyNjEsIC02ODMsIC03ODB9LCB7IC04MzEsIC01MjYsLTEwMDV9LAorey0xNjY2LC0xMTM1LCAtNDI0fSwgey0xNjExLCAtNDUyLCAtMjk5fSwgeyAxMjY4LCAxMDQ4LCAgNjQyfSwKK3sgMTE0NywgIDg1MywgIDg1Nn0sIHsgLTY3NSwgLTMzNiwgIDEzOX0sIHsgMjI2OCwgMTM0MywgMTQxOH0sCit7ICAgMjksICA3NjgsICA3OTd9LCB7LTEyMjQsICA0MjMsICA1NjR9LCB7LTEzMTgsLTEwODIsICAyNDV9LAorey0xMzAyLCAtODEyLCAgNTczfSwgey0xMjk4LC0xNjE3LCAgNjQ2fSwgeyAtOTY4LCAgODM0LCAgNzIzfSwKK3sgIDk5MywgMTY1MiwgMjAyN30sIHsgLTE5MSwgLTgxNywgIDQzMn0sIHsgIDY2MiwgICA2MCwgIDE5OH0sCit7ICA2MjYsICA5OTcsIDEzMzB9LCB7IDE2NDgsIDE5NjMsIDEyODl9LCB7LTE1OTcsICAtOTMsICAtNDV9LAorey0xMDg4LCAgIDM3LCAgLTg0fSwgeyAxNjUzLCAyNjA3LCAyMzM3fSwgeyAxMDY1LCAyMDQwLCAyMzc3fSwKK3sgMTEzOSwgMjMyNiwgMjExOH0sIHsgIDg1OSwgIDM1NywgMTUxMH0sIHsgIDY2NCwgMTIyNywgMTA5OX0sCit7ICA0NzksIDEzNjAsICA5MTJ9LCB7IDE4OTcsIDE3NTQsIDIwMTl9LCB7IDExNjgsIDE5MDksIDE3ODR9LAoreyAgMzk5LCAgIDM0LCAgMjU2fSwgeyAtNTkzLCAtMzA0LC0xMDUzfSwgeyAgNTQ3LCAxNjk0LCAxNDA3fSwKK3sgIDY0NywgIC05OSwgLTM0MX0sIHsgMTQ5MiwgMTY0NywgMTE5MH0sIHsgICAzOCwgLTY0NCwgLTIxMn0sCit7ICAzOTUsICA4NDYsICAyMjJ9LCB7IC03MDQsIC03NjUsIC03MTZ9LCB7IC03MjQsLTE5NjQsLTI4MDR9LAoreyAtMTUwLCAgMjkxLCAgLTgyfSwgeyAxMjMzLCAxNDU5LCAxMDA3fSwgeyAtMTQwLCAtMTU1LCAgMTUzfSwKK3sgIDQzOSwgIDI5NywgMTU2OH0sIHstMTUyOSwgLTQxMCwgLTYzNn0sIHsgMTUzNiwgIDQ1NSwgLTIzN30sCit7LTEzMjgsIC0xMzksIC0yNjB9LCB7ICA1MzEsICA1NTQsICA4Njh9LCB7ICAyNjksIDEyNjQsICA2MDZ9LAoreyAtMjMzLCAgODgzLCAgNDYzfSwgeyAgNzQyLCAgNjAwLCAtMTIwfSwgeyAgLTczLCAgNDIxLCAgMjEyfSwKK3sgLTQzOSwgIC01OCwgIDgwNH0sIHstMTI4NiwtMTI0MSwgIDcyOH0sIHsgIDI5NCwgLTQ5MCwgICA1MH0sCit7IC01OTEsIC05MDUsLTEyNTR9LCB7ICAgNDIsIC02ODcsICAxNDd9LCB7ICAtMjUsICAyNzMsICA1OTZ9LAoreyAtMzExLCAxMjEzLCAgNjAxfSwgeyAtNzU0LCAgODQ5LCAgNTg0fSwgeyAgNDI5LCAgNjA3LCAgNTg3fSwKK3sgLTYwMiwgLTE2NiwgIDQ2MX0sIHsgLTc5NiwgLTgyMywgIDc3N30sIHsgMTM4MCwgIDkxMCwgMTc1NX0sCit7ICAxMTksIDE0MTcsICA5NzJ9LCB7IC0yMTksIC04ODAsLTE1OTZ9LCB7LTEwNDksLTEwMTAsICA0Mzh9LAoreyAtNzEzLC0xMzc5LCAgIDc4fSwgeyAgICAwLCAtNDQ3LC0xMTc5fSwgey0xMTM2LC0xMzE5LC0xNTczfSwKK3sgMjI0OCwgMTc2NywgMTMwOX0sIHsgIDk0NiwgMTU4MywgMTQzMn0sIHsgMTE1MCwgIDQ4MiwgIDQzNn0sCit7IC00NjksLTExMDgsICA2MTh9LCB7IC00NDcsIC05NjYsIDEwODh9LCB7LTEyNTIsLTE1MTUsIC0xMTR9LAorey0xMTA0LC0yMDA4LCAtNTc5fSwgeyAgMjEwLCAgNjEzLCAgNDk3fSwgey0xOTc1LC0xNDM3LCAgNjQyfSwKK3stMTI2OSwgLTg1NiwgMTAxMX0sIHstMTY0NiwtMTE4NSwgMTA2M30sIHstMTU1NSwgLTY3MiwgMTIwNH0sCit7LTE2OTIsLTExMTQsICA2MjN9LCB7IC05NzksLTEzMjYsLTEyNzd9LCB7ICA1MzksIC0xNDcsICA4OTR9LAorey0xMzU0LCAtODk3LCAtNDM0fSwgeyAgODg4LCAgNDc1LCAgNDI4fSwgeyAgMTUzLCAtMzg0LCAgMzM4fSwKK3stMTQ5MiwgLTUxMSwgIDM1OX0sIHsgLTk3NCwtMTExNSwgLTQ3MH0sIHsgIDEwNSwgLTU1MCwgIDY3N30sCit7IC05MzcsLTExNDUsICA4Nzd9LCB7ICAzODAsIC0yNjAsICAyMTB9LCB7IDE2ODUsICA5MjQsIDEyNTZ9LAoreyAxNzc1LCAxMTkwLCAxMDk1fSwgeyAxNDE5LCAgNjMxLCAgNTMzfSwgeyAgNjI3LCAgMjk5LCAtMzQ3fSwKK3sgLTQxMSwgLTUzNCwgIDY0N30sIHsgLTY1MCwgICAyOSwgLTU5NX0sIHsgLTM3OCwtMTM2NywgMTU2M30sCit7IDE0MDIsIDExMjEsIDE0NjV9LCB7IDEwODksIDE0MTAsICA2NDh9LCB7LTIwOTYsLTEwOTAsICAgLTZ9LAoreyAgMzExLCAtMTk0LCAtODY5fSwgeyAtNjM5LCAtODMxLCAgNDE2fSwgey0xMTYyLC0xMjI0LCAxMzQ5fSwKK3stMTI0NywgLTk0MSwgMTgxM30sIHstMjE5MywtMTk4NywgIDQ1M30sIHsgLTYxOSwtMTM2NywgLTk1Nn0sCit7LTE2MDYsLTE5NzIsLTE1MDd9LCB7LTExNzUsLTEwNTcsLTExMDR9LCB7IC0zNzcsICA2MDEsICAyMDF9LAoreyAxODc2LCAgODI1LCAgMzc0fSwgeyAtNDMwLC0xMzIzLCAgIDI5fSwgey0xMzk3LC0xMjQ5LC0xMzMxfSwKK3stMTAwNywtMTUwNCwgIDk2MH0sIHstMTQwMSwtMjAwOSwgIDE5N30sIHstMTM3OSwtMTk0OSwgLTIzNn0sCit7LTEwNzcsICAxMjMsICA0MjJ9LCB7ICA2MTUsIDEyNjksICA1NDZ9LCB7IC0zMDYsIDE1MjYsICA5MDR9LAoreyAxMTk0LCAxNzg4LCAxMTc3fSwgeyAtNjI2LCAtODg0LC0xNTI2fSwgeyAgMTk5LCAgNzY2LCAxNTA0fSwKK3stMTA2NSwgIDg2MiwgIDE5N30sIHstMTAzNCwtMTc3MywgLTg4N30sIHsgLTgwMCwgIDE0NSwgIDU5OX0sCit7LTExMzQsIC01MTksICA2MjZ9LCB7LTEyMDUsLTE5MjYsICA1MDB9LCB7IC05MTAsLTEwNDEsLTEzOTV9LAorey0xNDc2LC0xNTY3LCAtOTY5fSwgeyAtNTIzLCAgODQyLCAgIDM0fSwgeyAxNzk0LCAgNjQ2LCAgODYyfSwKK3stMTIwNywtMTg4OCwtMTAwMn0sIHsgIC03OCwgICAtOSwgLTY3Mn0sIHsgMTA0NCwgIDc1OSwgICA4MH0sCit7IC02MDAsIDExMzksIDEwMTl9LCB7ICAgNTcsIDIwMDAsIDE0MjJ9LCB7IC04MzMsIDE0MTQsIDExMjF9LAorey0xMjAyLCAxNjMwLCAxMjYwfSwgeyAtNDYxLCAxNDIwLCAxMjQ0fSwgeyAxNTM3LCAgOTc1LCAgMjUzfSwKK3sgLTI4MywgIDMyNCwgLTM1OX0sIHsgIDU5OSwgLTE5NSwgIDEwNn0sIHsgIDU4OCwgICA2MiwgLTU4N30sCit7IC03NTcsICA2NDUsICAyMDV9LCB7ICAgNTEsIDEyMDEsICA3NTh9LCB7LTEyMDksICA2NzMsIC0zOTB9LAoreyAtNjI0LCAxNTgxLCAgOTQxfSwgeyAtMTUxLCAxMDIzLCAgNzM1fSwgeyAyODIwLCAxMzAxLCAgNjkwfSwKK3sgLTMwMiwgIDUyNCwgIC05OX0sIHsgLTkwMCwtMTU4OCwtMTE4OX0sIHsgMTA4NCwgIDI1MSwgIDIzOH0sCit7IDIwMTQsIDE3OTIsIDEwMTB9LCB7IDEyNDUsIDE2MzMsIDE3NDF9LCB7LTEyMjcsLTE1NDAsLTEyMDh9LAoreyAtNjIxLCAgNDU2LCAtMTA5fSwgeyAgIDQwLCAgLTY1LCAgNzg4fSwgeyAtODA1LCAtNjk5LC0xMzUwfSwKK3sgLTU4MywgIDkwNCwgIDgzMn0sIHsgLTgwMSwgIDUzMiwgIDU5NH0sIHsgMTk3MiwgMTQwOCwgMTM1MX0sCit7LTExNzcsLTE4ODAsLTIxMTR9LCB7IC03NzMsICA1NjgsICA5NDh9LCB7LTEwMTUsIDEwNzksIDEyNjB9LAorey0xMTExLCAgNDgyLCAtMTMwfSwgeyAxNzc4LCAxMDQ0LCAgNzgwfSwgey0xNDkxLCAgMjQ1LCAgOTEyfSwKK3sgLTMxNiwtMTE0MSwgLTkxN30sIHsgLTUzNiwtMTQ0MiwtMjM0Nn0sIHsgLTc4NSwtMTU0NiwtMTk4OH0sCit7LTIwMDMsICAyNTcsICA5MDl9LCB7LTE4NDksIC02MzMsLTEyMDl9LCB7LTE1MzgsLTE5MTgsLTEwNTR9LAoreyAxNjA2LCAyMjM5LCAxNTc2fSwgeyAtNTY3LC0xNTAwLC0xNTQ0fSwgey0xMjc5LCAgMTk1LCAxMzY5fSwKK3sgLTgxNywgIDI5MywgMTIxOX0sIHsgLTUyNSwgIDYzMCwgMTE5N30sIHstMTY5OCwtMjQyNSwtMTg0MH0sCit7IC0zMDMsICA3MzEsICA3NDd9LCB7LTExNjksIC0yNTEsICAyNjl9LCB7IC05NTAsICAtNzUsIDE2ODR9LAorey0xMTgyLCAtNDUzLCAxMDA1fSwgey0xNTk5LCAgNTg1LCAgMzc4fSwgey0yMDc1LCAtNTcxLCAtNDI3fSwKK3sgLTUyOSwtMTE1OSwtMTE3MX0sIHsgLTI4MywgLTIwNSwgLTU2NH0sIHsgLTc5NiwgMTI0NiwgIDcxN30sCit7IDIyNzcsICA5MjcsICA1Mzl9LCB7IC00NTQsICA1NTksICA0NDB9LCB7IC03MTcsIDE0NjAsIDE2MTV9LAorey0xMDMwLCAxMDUyLCAxNjEwfSwgey0xMTY5LCAtMTM4LCAgODQ3fSwgeyAgMjI2LCAgIDM5LCAtNjEyfSwKK3stMTI1MSwgLTEwNiwgLTcyOX0sIHsgLTY1MSwgIDk2OCwgMTMwMn0sIHsgLTcxNCwgLTYzNiwgMTcyN30sCit7ICAzNTMsIDEwNjksICA0MTB9LCB7IC03OTgsIC0xNTYsIDEwOTl9LCB7IC01NzQsICA5MTgsICA0NDZ9LAorey0xMzEwLCAxMDEyLCAgNDY2fSwgeyAxNDA4LCAxNTkxLCAgNzY1fSwgeyAxNDI5LCAxMzgwLCAxNzU3fSwKK3sgMTk0OSwgMTk1NiwgMjM3OH0sIHsgMTU3OCwgMjA0NywgMjE0OH0sIHsgIDkxNiwgICA5OCwgICAtN30sCit7IDE4OTMsIDE0MTgsIDIxNDF9LCB7ICAzNDgsIDE0MDUsIDE1Nzl9LCB7ICAxNTIsIDExMzQsIDE4MDF9LAoreyAtMjY3LCAgMTU0LCAxMzk1fSwgey0xMTY2LCAgNDY5LCAxMDU0fSwgey0xMTQyLCAtNDA1LC0xMDczfSwKK3stMTM0MSwtMjI2NCwtMTU4MX0sIHsgLTM2NCwgIDg2OSwgMTcwNn0sIHstMTE2MiwgIDU0OSwgMTU1MH0sCit7LTEyMjUsLTE5MzIsLTE2NjZ9LCB7LTE0ODUsLTE5NzcsLTIwNTV9LCB7LTE3MjcsIC05MDYsICAtOTh9LAorey0xODk3LCAgMjMzLCAxNDkyfSwgeyAgODkyLCAgMTA4LCAtMzMxfSwgey0xNzI4LC0xMTcwLC0xNzAwfSwKK3stMTA2MCwgMTk4MCwgMTc5MH0sIHstMTA3MCwtMTc0MSwtMTkwOX0sIHsgIC0xMSwgMTUzOSwgMTMxN30sCit7LTE2MDAsICAgOTQsICA0OTd9LCB7ICA0MjEsICA0NDMsIC0xOTd9LCB7LTE1NzgsIC0zNDksIC05OTR9LAoreyAtNTk5LCAtNTM5LCAxMTQwfSwgeyAtOTY1LC0xNDE5LCAtMTI5fSwgey0xMzQxLCAgMTc1LCAtNDQ3fSwKK3sgLTM3NSwgMTMxMSwgMjA1NX0sIHsgLTM3MSwgLTY1MCwgLTMwN30sIHstMTA3MywgIDYwNSwgIDM2NX0sCit7LTIwNTcsIC0xMTMsICA0MzB9LCB7ICA2NTIsICA5MTQsICA5Njd9LCB7LTEwMTIsLTE1ODYsLTIzMjN9LAoreyAxNTA1LCAxMjQ4LCAgNTU5fSwgeyAgMjYyLCAtNDg2LCAtNDAxfSwgey0xNzI3LCAxMzQyLCAxNTQ2fSwKK3sgICA1MCwgICA1NiwgIDQzMn0sIHsgLTMzMCwgIDExOSwgLTYwNH0sIHstMTUxNywtMTA4MCwgLTgxMH0sCit7ICA5NDYsIDExMjcsIDEwNTV9LCB7LTE0MDAsLTE3MDMsLTE3MTJ9LCB7LTEyNzAsIC03MDQsLTEzMTd9LAoreyAgODA3LCAxODIxLCAxMTQzfSwgeyAyNzYwLCAxNjA2LCAyMTcxfSwgeyAxMTIwLCAgNDA5LCAtMTUwfSwKK3sgLTE0NywgIDQwNCwgIDk1OX0sIHsgMjQzOSwgMTkxMSwgMjE4OX0sIHsgLTkwNiwgLTE0MSwgLTg2Nn0sCit7IC05MDQsIC0xNDIsIC00NTh9LCB7IC01NTcsIC03MDgsLTE2Nzl9LCB7IC04MzAsLTE0MzEsLTE1ODN9LAorey0xODQyLC0xMzQ2LC0xMDg2fSwgey0xNjA0LCAtMjcyLCAgOTE1fSwgey0xMTk2LCAgNzcyLCAxMDU2fSwKK3sgLTYzOCwtMTIzNCwtMTg5N30sIHsgLTUwMCwgIC04MSwgLTgyMn0sIHstMTI4OSwtMTYxMywgLTczNX0sCit7IC0xMTcsICA3ODUsICAxNjh9LCB7LTEwOTAsIDExMzMsICA5MjJ9LCB7LTEwOTYsIC03NDYsIDEzODR9LAoreyAgMjg3LCAtNTQ3LC0xMDYzfSwgey0xMzc2LC0yMjAxLC0xMjA0fSwgey0yMTc2LC0xNTcwLC0xNzU3fSwKK3stMTUxMSwtMjI0MSwgLTc3MX0sIHstMTczNywgMTA5OSwgIDgzMH0sIHstMTU4OCwgIDcyNCwgMTI0M30sCit7LTE1NDIsICA2OTMsICA4MDV9LCB7LTE2OTAsIC0yNDAsIDE2NjV9LCB7LTE3MDAsICAgLTQsIC02Njh9LAoreyAyMTQ5LCAgODE2LCAxMDQyfSwgeyAtODE4LC0xODQxLCAgIDIyfSwgeyAtNzY0LCAtNTA3LCAgNDQ5fSwKK3stMTE1MSwgLTYxNywgIDI4OX0sIHsgLTg0MywtMTU5NiwgLTI0MH0sIHsgIDQ5OCwgLTIzNCwgLTY1N30sCit7IC03NTIsICA0ODAsIDE2Nzh9LCB7IC0zMTksIC00ODEsICAxOTN9LCB7IC04MTEsICAxNzEsIC0xMTl9LAorey0yMTI4LCAtMjAyLCAtODQ4fSwgeyAxNzE3LCAxMTQwLCAxNzAwfQorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgbHNmXzNfM1s1MTJdWzRdID0geworeyAgIDY3LCAgLTE3LCAgIDY2LCAgLTEyfSwgey0xNjkwLCAtNTgxLCAtMTA0LCAtMjcyfSwgey0xMDc2LC0xMTg2LC0xODQ1LCAtMzc2fSwKK3stMTE0MCwgLTkyNiwgLTQyMCwgIC01OH0sIHsgLTI1OSwgLTY1NiwtMTEzNCwgLTU1M30sIHsgMTc4OCwgMTIyNywgIDQ1NSwgIDEyOX0sCit7ICA0NjIsICA0NDEsIC0yNDAsIC01Mjh9LCB7ICA4NDAsICA1MTQsICAxMzAsICAtNzV9LCB7IDExMTQsICA2MjMsICAxNTMsICAyMTZ9LAoreyAxMDY4LCAgNTY0LCAgIC02LCAtMjc2fSwgeyAxMTE5LCAgNzI3LCAgMTkwLCAgLTY4fSwgeyAgNzA0LCAgMzA2LCAgMTE5LCAtMjY0fSwKK3sgIDMyOSwgICA2MSwgLTEwMCwgIDE1Nn0sIHsgIDM2NCwgIDEyMywgIDE4MywgLTIwOH0sIHsgLTE3MSwgLTEyMywgIDIyMCwgIC02NX0sCit7IC0zMDYsICAtNjIsICA0MDIsICAgMTd9LCB7IC02NjAsIC05MzgsIC0yNjYsICAgIDB9LCB7ICAzODUsICAyMzUsICAyNzYsICAyODV9LAoreyAgMzIwLCAgMjY4LCAtMzM2LCAtMjAwfSwgeyAtNzI0LCAgIDE3LCAgLTg0LCAgMzgxfSwgeyAtNTQ0LCAgNDI5LCAgNDk0LCAgNTE5fSwKK3sgLTExNywgIDI4OCwgIDMwNCwgIDMyOX0sIHsgIDY0MywgIDE1NywgIDcwMSwgIDUwOH0sIHsgMTIwMCwgIDYyNSwgIDc5NiwgIDYwOH0sCit7ICA5OTgsICA0MjEsICA0OTIsICA2MzJ9LCB7IDEyMDQsICA3ODAsICA0NDYsICAxMzJ9LCB7IDEyNTcsICA4NDQsICA1NDcsICA0NDl9LAoreyAgODI5LCAgNjU4LCAgNTQxLCAgNDcwfSwgeyAxMTMyLCAxMjU4LCAgOTE4LCAgNjM5fSwgeyAgNTQ3LCAgIDUxLCAgNDIzLCAgMjc5fSwKK3sgICAgOSwgIDM5MiwgICA4MywgICA5NH0sIHsgIDU0MiwgIDU0MywgIDIyOSwgLTE0N30sIHsgLTE5OCwgIDEyOSwgIDE5NCwgLTE4NX0sCit7IC04NjMsLTEzMjEsIC0zMDIsICAgMzB9LCB7IC01OTcsIC02MjksICAtMTksICAxMTR9LCB7IC05MDAsLTEwODEsICA0NjYsICAzNTN9LAorey0xNDgzLC0xNTczLCAgIDE1LCAtMTQzfSwgey0xNzA4LC0yMDU5LCAtNzUxLCAgMTk2fSwgey0xODc2LC0yMDY3LCAtNjQyLCAtMjU4fSwKK3stMjMzNSwtMTQ3MCwgLTQ1MCwgLTU2NH0sIHsgLTU4NCwgLTE4NiwgLTg3MiwgLTQxNH0sIHstMTgwNSwgLTk4OCwtMTEyNSwtMTMxMH0sCit7IC03MjYsLTExMjksICAgMjgsICAxNjl9LCB7LTEwMzksIC04NjQsIC03MTgsIC0yNDZ9LCB7ICA0ODQsICAgMzYsIC0yMzMsICAtNDl9LAoreyAgMjY1LCAgIDY3LCAgMjg5LCAgNDY3fSwgeyAgMTc4LCAgNTQzLCAgODEwLCAgNTQwfSwgeyAgIDg0LCAgMjgyLCAgNjcyLCAgNzAzfSwKK3sgLTk3NSwgLTc3NywgIDEyOSwgIDI4N30sIHsgLTkzOCwgLTIyNywgIDk1NSwgIDU5NX0sIHstMTYxNywgLTI4OSwgIDgzNiwgIDY0OX0sCit7LTE4NDcsIC0yMTUsIDExMDYsICA3MTh9LCB7LTIwMzQsLTEwODUsICA2NTAsICA0NDB9LCB7LTIxMDEsIC01MjksICA5MDcsICA1NzV9LAorey0yMDExLCAtMzM2LCAgNjcwLCAgMjA0fSwgey0yMzg5LCAtNjkyLCAgMzYwLCAgMTM3fSwgey0yMTU2LC0yMjA0LCAgIC05LCAgMjgwfSwKK3sgLTI2NiwgIDExOSwgICAzOSwgIDE5M30sIHsgICA3OCwgIC01OSwgLTEyMCwgIDIyNn0sIHsgLTk3NSwgLTg1OCwgLTc4MSwtMTA5NX0sCit7IC02MTksIC00MTMsIC00NTEsIC04NDJ9LCB7LTEyMTYsLTEzMjEsIC04MTMsIC04ODN9LCB7LTEzNzYsLTE2MTUsIC0zOTQsIC00Mjh9LAoreyAtNzM3LC0xMTEzLCAtNTQ5LCAtNzkwfSwgeyAtODgwLCAtOTc1LCAtOTY3LCAtNjQyfSwgeyAtOTg1LCAtODg2LC0xMjczLC0xMzYxfSwKK3sgLTQ3MywgLTgwNCwtMTQwMSwtMTQwN30sIHsgIDE2MCwgLTI2NSwgLTkxOSwgLTI3NX0sIHsgLTI0OCwgLTI1MCwgLTcxOCwgLTM4MH0sCit7ICAgOTcsIC0xMDMsIC0zNzUsIC0yMjl9LCB7IC00MTUsIC0xOTMsIC0xMzUsIC01NTV9LCB7ICA2MjgsICAzNjEsICAxMTksICAyMTZ9LAoreyAgNTc5LCAgMzY0LCAgMzkxLCAgMjA5fSwgeyAgNjM0LCAgNTIyLCAtMTU0LCAtMTQ4fSwgeyAgNTI2LCAgMzg5LCAgMTcwLCAgIDMzfSwKK3sgIDEwNSwgIDI2NywgICA2NCwgIDM4MH0sIHstMTUwMywtMTAwMCwgIC0zMCwgLTM2OX0sIHstMTA3MCwgICA1OCwgIDY0NywgIDIyM30sCit7LTE1MjAsIC0yOTEsICA2MjEsICAzMDd9LCB7LTE1MzEsICAxNTYsICA3NjIsICA0MDR9LCB7LTIwMjksICAxNDEsICA3MzQsICA0OTl9LAorey0xODQ5LCAtNjUwLCAgMzA2LCAgNTEyfSwgeyAtMTg3LCAtMTA0LCAgLTU5LCAgNDM4fSwgeyAgMTM0LCAtMjMwLCAgMTU2LCAtMTg2fSwKK3sgIC02MSwgLTI2MCwgIC0xNiwgICAxMH0sIHsgLTU2OSwgICAtMywgLTQyMSwgLTI5N30sIHstMTcyNSwgLTUyMSwgLTM0NiwgIDE3OH0sCit7LTEzNjIsICAtNTksICAtNDQsICAxNTd9LCB7LTIxNDYsIC00NjEsIC00NzAsIC0zNDl9LCB7LTIxNzAsICAgLTEsIC0zNjksIC0xMjF9LAorey0xNTc5LCAtMzczLCAtOTAwLC0xMDE1fSwgey0xMTE3LCAtNTkxLCAtNjEzLCAtNzg0fSwgeyAtNTYxLCAgMTIyLCAgLTc1LCAtNDQ5fSwKK3sgICAtNCwgLTE3MSwgLTEyMywgLTM3Mn0sIHsgIDE5MiwgIDE2OCwgIC03NiwgLTEzMn0sIHsgIDI1MiwgLTEwNywgIDM0MCwgIDIxMH0sCit7ICAzOTIsICA1MDksICAyNzIsICAxODF9LCB7IC0xMDksICAxNDUsICAyMTgsICAxMTl9LCB7IC00MTYsIC0yNjMsICA0ODUsICAyNjV9LAoreyAtMTgxLCAgIC04LCAtMjg2LCAgMjI2fSwgeyAtMjQ0LCAtMjE4LCAgIDY5LCAtMjkwfSwgeyAtMTU4LCAgMTkxLCAgIC0xLCAgLTY0fSwKK3sgLTU5MiwgIC05MCwgIDIxMywgIC05Nn0sIHsgIDI1NSwgIDQzNSwgIDE3OCwgIC04MH0sIHsgLTM2OSwgIC0xOCwgIC0zMywgIC04MH0sCit7ICAtNDIsICA0MTUsICAxNDAsIC0yMjJ9LCB7IDExNDMsICA2NTEsICA2NDksICAzMjl9LCB7ICA3NjcsICA1NTYsICAyNDksICAyMzV9LAoreyAgOTQ4LCAgNDEzLCAgNDQyLCAgMjc5fSwgeyAgMTQxLCAgMzM5LCAgMzU2LCAgNTU3fSwgeyAtNDcwLCAtMTcwLCAgIDk5LCAgMjM3fSwKK3sgLTU2OSwgLTgwMCwgIDM1MiwgIDU2NX0sIHsgIDI4MiwgIDQ3MywgIDQ3MCwgIDMzMn0sIHsgLTE5OSwgLTY5MCwtMTI4NCwgLTkxN30sCit7IC0xOTMsIC00MjYsIC04MDAsLTExMjJ9LCB7ICAtMjYsIC0zNzEsIC00OTAsIC0xOTN9LCB7ICA2MzcsICA1OTUsICA1MTksICAzMzB9LAoreyAgNDA4LCAtMTE1LCAgIDc5LCAgIDEyfSwgeyAgNDc3LCAgIDg3LCAtMTAzLCAtMzc2fSwgeyAtNjY2LCAtMzQ3LCAtMjc3LCAtMjkxfSwKK3sgLTUxMCwgLTQ4MSwgIDE2OSwgIDI5N30sIHsgLTgyOSwgLTczOCwgLTIwNSwgLTE3MX0sIHsgLTMyMCwgLTU0MCwgIDMyOCwgIDI4M30sCit7IC04NTksIC05NTgsICA0NDIsICAgLTJ9LCB7ICA1NTYsICA2ODYsICAxMzAsICAgNTZ9LCB7IDEzODMsIDEwMTIsICA3NTUsICA0Mjd9LAoreyAgNjEyLCAgNzQxLCAgNjI4LCAgNTUzfSwgeyAtMzM5LCAtNzk2LCAgMTM0LCAgMjc3fSwgeyAtNjMzLC0xMDg1LCAgIC0yLCAtMjQ2fSwKK3sgLTg4MCwtMTAzNSwtMTYwNywtMTA2NH0sIHsgLTk5NCwgLTQ3NCwtMTEzOCwgLTQ4OH0sIHsgLTQxNCwgLTc5NSwgICA3MywgLTIwNn0sCit7ICAgLTgsIC0xMzksICA0MzksICAyMDR9LCB7IC0xNzYsIC01NzgsICAgMjMsICAxMzF9LCB7IC0yNjksIC03NTcsIC0xOTEsICAyNDV9LAoreyAtMTA5LCAtMzM4LCAgMTEyLCAgMzE2fSwgeyAgMTIwLCAtNDA2LCAtMTE4LCAgNjExfSwgeyAtMTgwLCAtMTg2LCAtNjQ1LCAgMTE1fSwKK3sgLTE3MywgICAzNCwgLTUxOCwgLTQ4OX0sIHsgLTE1MSwgICA2MSwgLTU4MywgLTg0NH0sIHsgIDIyMCwgLTEzOCwgLTY4MSwtMTAyMH0sCit7ICAzOTEsICAtMTcsIC01OTgsIC0zMjF9LCB7ICAxNTcsIC0yOTUsICAxMjksICAxNTV9LCB7IC05MjYsIC04NzUsIC05ODcsICAyODV9LAoreyAgMjQxLCAgLTgzLCAtMTI1LCAtMTI1fSwgeyAgNjIwLCAgNTk3LCAgNDMyLCAgIDkyfSwgeyAgMzkzLCAgIDc4LCAgNDA5LCAgIDYxfSwKK3sgLTM5MywgLTczOSwgLTQxMywgLTc0OH0sIHsgICA4MywgICA1NCwgIDM2MSwgICAyN30sIHstMTA4NCwgIDEzMCwgLTMzNywgLTY5NH0sCit7LTE1NjUsICAyOTcsICAzMTgsICAtMTl9LCB7LTE4NzMsICAgMzYsICAgNTEsIC0zMTd9LCB7LTIzMjMsIC0yNDYsICAyMzEsICAtODR9LAorey0yMzA2LCAtNzgzLCAgIDQwLCAtMTc5fSwgey0yMjMzLCAtOTMwLCAtNDc0LCAtNDYyfSwgeyAtNzU0LCAgLTg2LCAtMjg4LCAtNjI2fSwKK3stMjQxMSwgLTQ1NSwgIC02MywgIDE3MX0sIHstMTA5OSwtMTA5NCwgIC0yNiwgLTE0M30sIHstMTE5MywgLTQ1NSwgLTQwNiwgLTM4MX0sCit7IC02MDUsIC0yMTAsICAtOTYsICAtNTF9LCB7IC01ODAsIC00NzYsIC0yNzYsICAtMTV9LCB7LTExOTUsIC02MzQsLTEyMDMsIC04ODF9LAoreyAtMzc4LCAtMjIxLCAtNjY5LCAtOTUyfSwgeyAgNTk0LCAgMTc4LCAtNDAzLCAtNjc2fSwgeyAgNzYzLCAgMzI3LCAgNjAxLCAgMjkwfSwKK3sgIDE3MiwgIDMwMCwgIDIwMywgIDE1N30sIHsgIC01NiwgLTMzNiwgIDM1NiwgICAyNH0sIHsgLTIyOCwgLTI5NiwgLTI1OSwgIC0yOX0sCit7IC0xODYsICAyNjMsICA0MTYsICAgMTR9LCB7IC0zNTMsICAzNzMsICAtMTIsIC0yMTZ9LCB7ICAyNTcsICAgOTYsICAxNzQsICAgNTd9LAorey0xNTI2LCAtNjE2LCAtOTU0LCAtNDk5fSwgeyAtNDk3LCAtMTUyLCAtMzMzLCAgMTI1fSwgeyAgMTA1LCAgMjAwLCAgMTc5LCAgLTk3fSwKK3sgLTMzMSwgLTIyNCwgIDc2NSwgIDY5N30sIHsgIDc2MCwgIDI1NiwgIDMwMSwgICA1OX0sIHsgIDQ1NSwgIC04NSwgIDIwNCwgIDI4OH0sCit7IC01MTQsICAyNDAsICAyNTEsIC0xMDl9LCB7ICAyNTYsICA0MTcsICAtMzQsIC00MTN9LCB7ICAxMDEsICA0MzAsICAzODQsICAxNTZ9LAoreyAgLTMxLCAgLTEwLCAgMjA2LCAgNDI2fSwgeyAgNTg5LCAgMTQ1LCAgMTQzLCAgIDcxfSwgeyAgODA4LCAgOTA2LCAgMzMzLCAgMzQ5fSwKK3sgIDk4NiwgIDkzOCwgIDU4OSwgIDMzMX0sIHsgMTMwMCwgIDgyNCwgIDE4NywgIDUwOX0sIHsgMTA2MiwgIDY1MywgIDM3OSwgIDQ2Nn0sCit7IDE0NjIsICA5MzcsICA0MDEsICAyNzR9LCB7ICA3ODcsICA4NjEsICAyNjUsICAgIDJ9LCB7ICA2MDksICA1NTMsICAgMjgsICAzMDV9LAoreyAgOTI2LCAgMzQwLCAgMTA2LCAgMzg2fSwgeyAgMjQxLCAtMjY3LCAtMTQ3LCAgMjI1fSwgeyAtMTc4LCAtNTM0LCAgMzQ3LCAgNTAyfSwKK3sgLTY0MywgLTM4MSwgIDM5NywgICAzMH0sIHsgLTY1MSwgLTczMywgLTQzNSwgIDM5OH0sIHsgLTQwNywgLTcyNiwgLTQ4NCwgLTI0OH0sCit7IC03ODksIC05MTQsIC00MzgsIC00NzZ9LCB7IC00OTgsIC0zOTAsICAgNzUsIC0yOTV9LCB7IC05NjQsIC01OTAsIC02MDYsICAxNTB9LAoreyAtMTIxLCAgLTQ5LCAtMTU1LCAgLTc4fSwgeyAgOTM1LCAgNTUwLCAgMzg5LCAgIDM4fSwgeyAtMzIxLCAgMTI3LCAgNDI0LCAgMzE1fSwKK3sgLTI4NSwgLTExMywgIDI4MywgIDI1OX0sIHsgIDY1OCwgIDIwMywgIDMyMiwgIDQ4Nn0sIHsgIDkwMywgIDUwNSwgIDc0OCwgIDQxN30sCit7ICA2MTEsICA0MjMsICA1NTUsICA1MTJ9LCB7ICAyMzksICAtODMsIC01NzgsICAtMTl9LCB7IC0zMzksIC03MzEsICAzNDksICAgMTN9LAoreyAtOTM0LC0xMzk5LCAtMTE0LCAtMzYwfSwgeyAgMTA3LCAgNjkyLCAgMTgyLCAgIDkwfSwgey0xMjQzLC0xNTM4LC0xNTUxLCAtNzI1fSwKK3sgLTU2OCwgLTkwMywtMTM2MywgLTUyNX0sIHsgLTUxNywgLTg1MywgLTg2MSwtMTAwNH0sIHsgLTE2OCwgLTY5MCwgLTgzNSwgICA2M30sCit7IC0xMzcsIC01NTYsIC01NDcsICAxNDR9LCB7IC0yODYsIC04MTcsICA0ODUsICAzMTl9LCB7IC0xNDcsIC00MDgsICA1MjYsICAyNDZ9LAoreyAtMzQ3LCAtNDM0LCAgMjk3LCAgLTI4fSwgeyAtMjkwLCAtNDcxLC0xMTEwLC0xMjg1fSwgeyAtNDYwLCAtMzU5LCAtOTg4LCAtNzk0fSwKK3sgMTM0NywgMTI5OSwgIDY5MCwgIDUyM30sIHsgMTIxNiwgMTA2OCwgMTA5NCwgIDc1N30sIHsgIDgyNSwgMTE0MCwgIDc1MiwgIDQ5NH0sCit7IDEyNTIsIDEzNjUsIDExOTUsICA4OTh9LCB7ICA1MjEsIDEwNTMsICA1MzIsICA0MzJ9LCB7IC0zMzQsIC0yMTYsIC0zMTMsIC0yNjN9LAoreyAtMTYwLCAgIDUyLCAtNDcyLCAtMTU1fSwgeyAgMTI3LCAgMTM2LCAtMzgwLCAgIDQ0fSwgeyAgODUxLCAgNDEwLCAtMTYyLCAtNDg5fSwKK3sgIDEyMywgLTI1NSwgLTc5NiwgLTY2N30sIHsgMTA5MCwgIDkxNywgIDc4OSwgIDQ5M30sIHsgMTM5NywgMTE5NywgIDU1OCwgIDIwMn0sCit7ICAtNTEsIC0xMTgsIC0zNDIsIC03MDF9LCB7ICAgODMsICAxMDgsICAtNDIsIC00NDF9LCB7ICAgNjEsICAgOTUsICAyODcsICAyNTZ9LAoreyAgLTI3LCAgIDg5LCAgNTI0LCAgNTMxfSwgeyAgMzUxLCAgMjI3LCAgNTkyLCAgNTQ1fSwgeyAgNjk3LCAgMTU1LCAtMTY0LCAgMzA3fSwKK3sgIDYzOCwgIDI3NCwgLTQ4OSwgIC01MH0sIHsgIDc1NCwgIDI0MCwgLTE2NiwgLTEyNH0sIHsgLTExNiwgLTU3OSwtMTIxMiwgIC02M30sCit7ICAxOTAsIC0yOTUsLTEwNDAsLTEyOTZ9LCB7ICAxNDcsIC0zNzYsIC0xNzcsIC0xMTN9LCB7ICA4NDEsIDEyNDEsIDEwNTEsICA2Njh9LAoreyAgICAyLCAgMjkzLCAgNTUxLCAgMzA0fSwgey0xMDk2LCAtOTUzLCAtMjQ4LCAgMzc2fSwgeyAtNzUwLCAtOTY1LCAgIDg3LCAgNTE2fSwKK3sgLTI3NSwgLTUxNiwgIDY4OSwgIDM5MX0sIHsgLTM3OSwgLTY0MywgIDg3NiwgIDU5NH0sIHsgLTM5MCwtMTAxMywgLTY0NSwgIDU3M30sCit7IC0xMDcsIC01NjgsIC02ODksIC04MjZ9LCB7LTEwMjUsICAtMjcsIC0zMjgsIC0yMDN9LCB7ICA4NjEsICA3NDksICA1NDgsICAyMzN9LAorey0xNjYwLC0xMDQzLCAgNDUxLCAgMTA4fSwgeyAtNjYwLCAtNjIwLCAgNDMwLCAgMjM2fSwgeyAgIDIxLCAtMzk2LC0xMTU4LCAtNjMxfSwKK3sgMTM3MiwgMTI5OCwgIDk2NywgIDU3N30sIHsgMTEyNSwgMTEyNSwgIDU4OSwgIDQ1NH0sIHsgLTMyMywgLTg2NSwgLTQ2NywgIDE1M30sCit7IC00NjgsIC02OTksIC04MDQsIC01MDl9LCB7IC0zOTIsIC03MTgsIC0yMDQsICAtMzV9LCB7IC02MDMsLTEwOTMsIC01NjcsIC0xNjJ9LAoreyAtNTA1LC0xMDA0LCAtMTAyLCAgMzUwfSwgeyAgMjE5LCAgMjI0LCAgNDIzLCAgMjUyfSwgeyAgMzk1LCAgNTkxLCAgNjA4LCAgMzYzfSwKK3sgLTc0NiwgIC05NiwgIDM3MywgIDE3Mn0sIHsgIDE3MSwgIDI5NSwgIDcxNCwgIDMzOX0sIHsgIDIzMywgICA3NywgIDEwNywgIDI3N30sCit7ICAxNTcsICAxNTMsIC00OTksIC0zNTZ9LCB7IDE1NDcsIDEwNzMsICA1NzYsICA0OTR9LCB7IC0yOTIsIC0zMzksIC01MDQsIC01OTJ9LAoreyAtOTAzLCAgLTcyLCAtNjE5LCAtNDgxfSwgey0xNTk0LC0xMTE3LCAtNTY3LCAtMjU0fSwgeyAtNzkzLCAtNTA3LCAtNTY0LCAtMjkxfSwKK3sgLTQ5MiwgLTUzMiwgIDUwMiwgIDU2MH0sIHsgLTM4MiwgIDQyNywgIDYwMCwgIDIzMH0sIHsgLTIyNywgIDQ3NywgIDI1MSwgICA3NX0sCit7ICAyODUsICA4NDIsICA4MTMsICA0NzZ9LCB7LTEzMTAsLTEzMzMsICAxODYsICAzNzd9LCB7IC01ODcsIC05MTcsICA2NDMsICAzODF9LAorey0xMTg2LCAtNTUzLCAgNDExLCAgIDgyfSwgey0xMTI3LCAtODIwLCAtMTc0LCAtNTQwfSwgeyAtNjA0LCAgMTE5LCAgNTQzLCAgMjA1fSwKK3sgLTM4MCwgIDY1NywgIDkwOSwgIDU2N30sIHsgIDExMiwgLTI5OCwgLTM3NCwgIDExNH0sIHsgLTg1NywgLTI1MSwgICA1NiwgIDE1OX0sCit7ICA0MDEsICAzNDUsICAtMzQsIC0xNDB9LCB7IC0xMTEsIC02MDcsICAgNDEsICA2MTR9LCB7ICAzNTUsIC0xMTQsICAtNzcsICA0NzR9LAoreyAgNTc4LCAgIDU2LCAxNDUwLCAgOTI0fSwgeyAxMDk4LCAxNDIwLCAgNzQxLCAgNDAwfSwgeyAgMjQ2LCAgIDIyLCAgNTg4LCAgMzEzfSwKK3sgLTEyMSwgIDMyNywgIDgzMSwgIDQ3Mn0sIHstMTEzOCwgLTYwOCwgIDg1NiwgIDU1Mn0sIHstMTI0MSwtMTA3MiwgIDYzOCwgIDYwMH0sCit7IC0zNTgsICAyNTQsIC0zMzMsIC0zMDN9LCB7IC02NDYsICA3MzksICAzNTgsICAgNzR9LCB7IDEyMjYsIDE2NzEsIDEyMjEsICA4NDl9LAoreyAyMjQxLCAxNjI0LCAgOTgzLCAgNjM2fSwgeyAxODQxLCAxNDc3LCAgNzQ5LCAgMzg0fSwgeyAgMzUwLCAgMjYzLCAgIDg3LCAgMTI4fSwKK3stMTkwMiwgLTk0MSwgLTE0NCwgIC02NH0sIHstMTczNCwgLTI1NSwgIDI4OCwgIC0zMX0sIHstMjY0NCwtMTIzOCwgIDM2NiwgIDIzNX0sCit7LTE2NDMsLTEwOTIsLTEzNDQsIC0zMDR9LCB7IC01NDEsLTEwNzUsLTExMTYsICAxMjN9LCB7LTExNzgsIC0yNTIsIC04MTYsIC0xODB9LAorey0xMDE2LCAgNTMzLCAgNTY1LCAgMjMzfSwgeyAtNDg3LCAtNDMwLCAtMTg4LCAgMzM0fSwgeyAgODY3LCAxMjM2LCAgNTM0LCAgMTcxfSwKK3stMTU5MCwtMTYwNywgIDYzNSwgIDYzMH0sIHstMjE5NiwgIDMxMCwgIDkyNCwgIDQxMn0sIHstMjM1OCwgLTMyOCwgIDk1NiwgIDUyOX0sCit7LTI2MzksIC0zNzcsICA2MzAsICAyNzh9LCB7LTI2MDIsICAzMTcsICA3OTksICAyOTl9LCB7LTI0MDYsICAxMzMsICAzNDAsICAgMzF9LAorey0yMTU2LC0xNDY4LCAgMTMxLCAgMTI1fSwgey0xMTg0LCAtNDkwLCAtMTM5LCAgIDQ2fSwgeyAtNzQ0LCAgNDQ3LCAgODkxLCAgNTY0fSwKK3sgICA2NywgLTQ1MSwgIDY0NiwgIDYwNH0sIHsgLTU1MywgLTQyOSwgLTg3NiwgIDM5Nn0sIHsgIDE2MiwgIC02NiwgMTMwNSwgIDkxNX0sCit7ICA0NzksICA1NzksIDEwODgsICA3OTR9LCB7ICA0NTAsICAyNzgsICA1NjYsICAzMjR9LCB7LTEwNTcsIC0xNTQsICAxNDgsIC0xNzd9LAorey0yNTQ1LCAgMTY4LCAxMDcwLCAgNTkyfSwgey0yMzUxLCAgLTQyLCAgODE5LCAgMzQ1fSwgey0yMzQ0LCAtNzA3LCAgNzIxLCAgMjUwfSwKK3stMjE3NSwtMTQ5NywgLTMwOSwgIDEyMn0sIHsgIC03OCwgIC03MywgIDEyMCwgIDE3M30sIHsgICAtNCwgIDI2MiwgLTI2MywgLTI2MX0sCit7IC00MzEsICAtNjQsIC00MDUsIC03MzJ9LCB7LTI2MDksICAxMTYsICAtODMsIC0xOTN9LCB7LTE1MjUsIC05NDQsIC00NzcsIC03MjV9LAoreyAtNTA4LCAgMzA3LCAgMTcwLCAgMTcyfSwgeyAgODMyLCAgNDE3LCAgODMyLCAgNjg2fSwgeyAtMjI1LCAgMTc3LCAgODk0LCAgODE4fSwKK3sgLTQ4MiwgLTM4OSwgMTI3OSwgMTAzOX0sIHsgLTM4MywgIDIwMSwgLTM1MCwgICA0MH0sIHsgIDczMCwgIDYzNSwgIDIyNiwgIDUyNn0sCit7ICA1MDMsICA0NjIsICAzMzgsICAzOTh9LCB7ICA1MzUsICA3MTQsICAgNDAsIC0yODJ9LCB7IDE0ODIsIDE0NzEsIDEwODUsICA3MzF9LAoreyAxNTYxLCAxMDcyLCAgOTA5LCAgNjkzfSwgeyAxNDE5LCAxMjgyLCAgODg5LCAgODc5fSwgeyAxMTUzLCAgNzI4LCAxMTg2LCAgODQwfSwKK3sgLTIyNiwgMTEzMCwgIDk0OSwgIDY4OX0sIHsgLTQ5NCwgLTk4NiwtMTU1NiwgLTEyOH0sIHsgLTU2OCwgLTcyMSwgLTcxMywgIC0yNn0sCit7ICAzMTcsICA1MjQsICAgNzAsICAxMzV9LCB7IC00MDUsIC04NjUsLTE3NjYsIC02NTJ9LCB7IC0xNzQsIC04MDEsICA4ODUsICA3NzN9LAoreyAtMTUzLCAgLTkxLCAxMDk5LCAgNzUxfSwgeyAtNTA2LC0xMTQ5LCAgODUzLCAgNjQ2fSwgeyAgMjQxLCAgNzgyLCAgNTE5LCAgNTM5fSwKK3sgMTg1MywgMTcwMCwgMTEwMSwgIDY4NH0sIHstMTI0OSwtMTQ4NiwgLTQ2NCwgIDE4OH0sIHsgLTg5MywtMTQwOSwtMTMxMiwgLTM0MX0sCit7IC0xMzUsICA0MzgsIC0xNzUsICAgMTh9LCB7IDExMTEsICA5NzYsICAzMTksICAyMDh9LCB7LTE0MzAsLTE3NjgsICAgODMsICA0NTh9LAoreyAtNTMwLC0xMDAwLCAgMzA3LCAgMTI5fSwgeyAtODQwLCAgLTE1LCAgLTI5LCAtMzU2fSwgeyAtOTExLCAtOTI0LC0xMTQ3LCAtMjQyfSwKK3sgLTExOSwgLTUyOCwgIDEyNywgLTEzM30sIHsgLTc2MSwgLTc2NSwgIDE5MCwgIC04M30sIHsgLTMxNSwgIDg5NSwgIDUyMiwgIDIzMX0sCit7IC0yMjIsICAxMDIsICAtNjMsIC00Mjh9LCB7ICAzMTYsICA2OTksICAzNzksICAgNzB9LCB7ICAgMjUsICA3MTYsICAzMTQsIC0xMDh9LAoreyAgNTA3LCAgODc0LCAgNTY2LCAgMjM4fSwgeyAgMTA4LCAgOTQxLCAgNTE5LCAgMTk1fSwgeyAgNDI1LCAgLTYwLCAtNDI3LCAgMjU3fSwKK3sgIDEzOSwgLTEwMywgLTYzMCwgIDQ0Nn0sIHsgIDMzNCwgIDM3MCwgIDQxMiwgICA0OH0sIHsgLTE3MiwgLTY5MCwgLTI4MywgIDU1N30sCit7ICAxODcsIC0yODYsICAxNTgsICA0ODN9LCB7ICAxNDAsICAyNzAsIC0zNDQsIC02MzF9LCB7ICA5MjQsICA1NzksIC0xMTYsICAxMzJ9LAoreyAgMTQyLCAgNDY2LCAgLTY4LCAgLTY0fSwgeyAgMjMwLCAtMTQ1LCAtMzAyLCAtNTQyfSwgeyAtODAzLCAtOTEyLCAxMDE4LCAgNzM3fSwKK3sgLTc3MywgMTAxNSwgIDYzMCwgIDI5N30sIHstMjU5NiwgICA5NSwgIDQ0NSwgIDMzNn0sIHstMjEyMiwgIDQ5MSwgIDUxMCwgIDE5MX0sCit7LTEyNTMsICAxNjEsICAgLTIsIC0zMjR9LCB7LTE0NTAsIC02MzMsIC03MTIsIC0xMDV9LCB7IC04NDIsIC0yNTQsIC00MTEsICAxMDB9LAoreyAtNjQwLCAtMjkwLCAxMDEwLCAgNzYzfSwgeyAtNjUwLCAgMzEzLCAxMTY5LCAgNzMwfSwgeyAgMTQwLCAgNTA1LCAxMDMwLCAgNzY2fSwKK3sgIDc3MiwgIDI4NywgMTA2NywgIDgyM30sIHsgIDQ5NSwgIDc0OSwgIDMwNSwgIDMyM30sIHsgLTE2NCwgIDQ2MiwgICA3OCwgIDM5OX0sCit7IC0zNDIsIC04NzQsICAgNjksICA1OTd9LCB7ICAtMTYsICA2MjAsICA2MjEsICAzMzd9LCB7IC0xMzgsIC00NDQsIC0yNjUsICAyMTh9LAoreyAgIDg0LCAtNDUwLCAgOTUzLCAgNjY2fSwgeyAtMjIyLCAtODAzLCAgNTQxLCAgNjA0fSwgeyAtOTIxLC0xMzc2LCAgMjQ0LCAgMTE2fSwKK3sgLTg0MSwgLTcyMywgIDYzMCwgIDU4OH0sIHsgIDE0MCwgIDY2MywgIDI5NCwgIDM2OH0sIHsgIDkzNSwgMTA0NiwgIDg4MSwgIDc1OX0sCit7IDE3NDYsIDE0NjQsICA5MTYsICA2Mjh9LCB7ICA0MzYsICA5NjMsICAyODEsICAgIDF9LCB7IC0xMTksICAgNzQsICA1NDIsICAyMTN9LAoreyAgICAxLCAtNTY3LCAgMzAxLCAgMjQxfSwgeyAgMjYwLCAgNDM1LCAgMjIyLCAgMzk2fSwgeyAgOTM2LCAgOTU3LCAxMTA4LCAgNzAzfSwKK3sgIDUxMCwgIDUwNiwgIDgwOCwgIDQ3OH0sIHsgIDYwMSwgIDY5NCwgIDk2MCwgIDYyMH0sIHsgIDk3MiwgIDc0MSwgIDk4MCwgIDYwMH0sCit7ICA4MzQsICA3MTcsICA3NjcsICA2ODR9LCB7ICA2NDMsICA5NzIsICA5MzUsICA2Mzh9LCB7ICA1MDEsICA2NjEsICA3MjAsICA4NTF9LAoreyAtMTA1LCAtNjMyLCAtMzAzLCAtMTE3fSwgeyAtNDI5LCAgMTMwLCAgNzg5LCAgNDQyfSwgeyAtNTIyLCAtMTg4LCAgNzA0LCAgMzczfSwKK3sgLTc1OSwgICA0MiwgIDgxNCwgIDUyM30sIHsgLTUzMSwtMTEzNywgIDM3MywgIDU3OH0sIHsgLTY4MiwtMTIwMywgLTQ1NSwgIDI4NX0sCit7LTExNjMsLTE1NzcsLTEwOTgsICAgNDR9LCB7ICAgODEsICAtODIsICA3MTIsICAzNjN9LCB7ICA0NzcsICAyNDYsICA5NTQsICA2MjJ9LAoreyAxNjA0LCAxNjIyLCAxMjc3LCAgODkxfSwgeyAxNDA5LCAgODU5LCAgOTI0LCAgODkyfSwgeyAgNzc0LCAxMDQxLCAgOTQ3LCAxMTQyfSwKK3sgICA0MCwgLTU0NiwgIC03NSwgIDI4OH0sIHsgLTYxNiwgLTEwNiwgLTY5NywgIC0yNn0sIHsgLTE2OSwgLTE2MCwgLTg5MSwgLTczOX0sCit7IC0yNzksIC0zODQsLTEwMjksIC0zNTB9LCB7IDE3ODEsIDEzMDgsIDEwNDYsICA4MTZ9LCB7IDE1ODAsIDE1MzMsIDE0NzIsIDExNzh9LAoreyAxNTA1LCAxMDc2LCAxMjE2LCAgODk5fSwgeyAgODkwLCAgOTA0LCAgNTY0LCAgNjU0fSwgeyAgOTIwLCAgNjkyLCAxMDIxLCAgODU2fSwKK3sgLTQ5MywgIDEzMiwgIDE3NywgIDUwNX0sIHsgICA3MSwgIDE5NSwgIC0yOCwgICA5N30sIHsgIDQ1NiwgIDM1MSwgLTE2NCwgICA4OH0sCit7ICA0MzksICAyNzgsICAtNDAsICAzNTB9LCB7IDEzOTUsICA5NDksICAyMzQsICAtOTV9LCB7IC04MDUsIC00NzIsICAgMzgsIC0xNjN9LAoreyAgMzY3LCAgLTk4LCAgNDg5LCAgNTIzfSwgeyAxMDI1LCAxMTc4LCAxMjEyLCAgOTA2fSwgeyAgMzE5LCAxMzE0LCAgODE0LCAgNDYxfSwKK3sgLTEyMywgLTU0MywgLTgwNCwgIDQ0N30sIHsgLTc0OCwgLTMyNCwgLTg5NywtMTEyN30sIHsgLTczNywgLTUwMSwgLTc4OSwgLTcxM30sCit7ICA3MTUsICA3NzcsIDEyMzksICA5MjJ9LCB7IDE5NDksIDE5MzksIDEzNjgsICA4NjV9LCB7ICA3MzAsICA4ODAsICA3NTgsICAzODh9LAoreyAtODcxLCAgNDU0LCAgIDE3LCAtMjUxfSwgeyAtMzgxLCAtODEwLC0xNTgzLCAgMjM5fSwgeyAtNTIxLCAtOTY2LCAtNzkyLCAgMjU5fSwKK3sgLTg5MCwtMTM1OCwgLTc3MCwgIC03M30sIHsgIDE2NiwgIDM0OSwgLTIxMiwgIDMyM30sIHsgLTg0MCwgLTMwMSwgIDQ3MywgIDQzNX0sCit7IC02NzksIC00NjQsICA3MjgsICAzNTF9LCB7IC0xNTYsIC0xOTksICA2NjcsICA0MzJ9LCB7ICAgMjksIC0yNTIsICA0MTUsICA0ODB9LAoreyAtNzMxLCAtMzc5LCAgMTQ1LCAgNTU5fSwgeyAtNTI4LCAtNjMxLC0xMTU4LCAtMTU5fSwgeyAgNDQ1LCAgMjczLCAgMTIzLCAgNjM5fSwKK3sgIDM3MywgLTEyNiwgIDgwMCwgIDU2OH0sIHsgICA4NCwgLTE2MiwgIDcyMCwgIDcxMn0sIHsgLTgzMCwgLTUzNiwgLTE4NSwgIDIyMn0sCit7ICA0MDgsICA0NTIsICA1MDEsICA3NzF9LCB7IC04OTcsLTEzNTUsICAtNjcsICA0NDJ9LCB7IC03OTIsLTE0MDYsICA1NjYsICA2MDJ9LAoreyAgMTY3LCAtMzI2LCAgNTA5LCAgMzMwfSwgeyAgLTk1LCAtNjI2LCAtNzMwLCAtMzQ0fSwgeyAxNjY4LCAxMjE3LCAgNzc5LCAgNDU1fSwKK3sgMTMxNiwgIDgyOCwgIDU4NCwgIDcxOX0sIHsgIDQwNCwgIC0zMSwgMTAxMywgIDc4OX0sIHsgICA4OSwgIDEwNywgIDg5MSwgIDU0OX0sCit7ICA4NzEsIDE1ODEsICA5MTcsICA2NzF9LCB7ICA4NjYsIDE0NzksIDEyODksICA4NTR9LCB7ICAzOTEsIDEwNjgsIDExMjIsICA4MTJ9LAoreyAgIDc4LCAtNTYyLCAgMzQ1LCAgNTYzfSwgeyAgNDI5LCAtMTAzLCAgNDE3LCAgNzg3fSwgeyAtMTIyLCAtNDM3LCAgNDExLCAgNzg4fSwKK3sgLTkxMywgLTQxNywgIDYwMiwgIDc1NH0sIHsgLTIyNiwgIC0xNiwgIDE1MSwgIDc2MH0sIHsgLTcwMCwgIDExOCwgLTEwNCwgIC0xNH0sCit7LTExMjgsICAgNDgsICAyODQsICAzOTN9LCB7IC0zOTAsIC00MTksIC02MzksIC0xMTZ9LCB7IC05MTAsICAzMDYsICAzMTYsICAtMTN9LAoreyAxMjA3LCAgOTg0LCAgODIxLCAgNjY5fSwgey0xMTk1LCAtNjkzLCAgMTQwLCAtMjEzfSwgeyAtODg0LCAtNDE2LCAtMTk5LCAtNTU4fSwKK3sgLTYxNiwgIDI0NSwgLTQwNCwgLTY2NH0sIHsgIDI2MiwgICA1NiwgLTYxNywgLTcyNH0sIHsgIC04NSwgLTQ5MSwgLTMyMCwgLTY1Nn0sCit7IC01NzAsIC04MzEsIC0xMjksIC01Mjh9LCB7LTE1MDYsICAtNjMsIC0zNjcsIC0zODV9LCB7IC0zNTgsIC0zMjEsICAgIDQsICAgNTF9LAoreyAtMzY2LCAtMjE0LCAgMzE5LCAgNTExfSwgeyAgMTQ2LCAgNjcxLCAgLTE3LCAtMjkxfSwgeyAtMTEwLCAgNDY0LCAtMTM5LCAtNDk2fSwKK3sgLTIwMiwgIDIyMCwgLTMxMiwgLTYzMX0sIHsgLTY2MCwgIC03MywgLTY1NSwgLTgyMH0sIHsgLTY2MiwgLTY1MywtMTI4OCwgLTg1N30sCit7IC00MzAsIC05NTMsIC05NTksIC0yNjR9LCB7ICAtNDksIC00NjgsICAtNzIsIC0zODF9LCB7IC0zNTAsIC01NjMsIC0xOTMsIC00MDd9LAoreyAgIDU1LCAtNDA4LCAtODAzLCAgIDExfSwgeyAtMzA5LCAgNjQ5LCAgMTg4LCAtMTk4fSwgeyAtNTEyLCAgNDYxLCAgLTc5LCAtNDU4fSwKK3stMTMxOCwgLTI2MywgLTEzNCwgLTUyM30sIHstMTY1NywgLTQzNSwgLTQ5NSwgLTc2NX0sIHsgICA1NywgLTM0NywgLTQxNCwgIDQzNH0sCit7LTExNDEsIC0yNDIsIC02NjQsIC04NTd9LCB7ICAgMzQsICAtNjgsIC03MDcsIC0zMzh9Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBsc2ZfNV8xWzEyOF1bNF0gPSB7Cit7IC00NTEsLTEwNjUsIC01MjksLTEzMDV9LCB7IC00NTAsIC03NTYsIC00OTcsIC04NjN9LCB7IC0zODQsIC02MTksIC00MTMsIC02Njl9LAoreyAtMzE3LCAtNTM4LCAtMzMxLCAtNTU2fSwgeyAtNDE0LCAtNTA4LCAtNDI0LCAtMzc4fSwgeyAtMjc0LCAtMzI0LCAtNDM0LCAtNjE0fSwKK3sgLTIyNiwgLTUwMCwgLTIzMiwgLTUxNH0sIHsgLTI2MywgLTM3NywgLTI5OCwgLTQxMH0sIHsgLTE1MSwgLTcxMCwgLTE3NCwgLTgxOH0sCit7IC0xNDksIC00MTIsIC0xNTYsIC00Mjl9LCB7IC0yODgsIC00NjIsIC0xODYsIC0yMDN9LCB7IC0xNzAsIC0zMDIsIC0xOTEsIC0zMjF9LAoreyAtMTMxLCAtMTQ3LCAtMjk3LCAtMzk1fSwgeyAtMjI4LCAtMjE0LCAtMjQ1LCAtMTkyfSwgeyAgLTY3LCAtMzE2LCAgLTcxLCAtMzI3fSwKK3sgLTEwNCwgLTIwNSwgIC05NCwgLTE4M30sIHsgLTE0MywgIC0zOCwgLTE5MywgIC05NX0sIHsgICAxNiwgIC03NiwgLTEyNCwgLTI0OH0sCit7ICAgMjMsIC0yMzcsICAgMjQsIC0yNDR9LCB7ICAgMTgsIC0xMzYsICAgNDQsIC0xMTF9LCB7ICAtMzMsICAtMjQsICAtMjUsICAgIDB9LAoreyAgMTQ5LCAgIDE5LCAgIDIzLCAtMTQzfSwgeyAgMTU4LCAtMTY5LCAgMTc0LCAtMTgxfSwgeyAgMTMzLCAgLTU1LCAgMTY1LCAgLTI2fSwKK3sgIDExMSwgICA4NCwgICA5OCwgICA3NX0sIHsgICA4NywgIDE4MywgLTExNSwgIC0xMX0sIHsgICAtOCwgIDEzMCwgICAxMSwgIDE3MH0sCit7ICAyNTQsICAgNzcsICAyMDUsICAgMTd9LCB7ICAxODMsICAxMTIsICAyNjIsICAxOTR9LCB7ICAyMDIsICAyODcsICAgOTUsICAxODl9LAoreyAgLTQyLCAtMTA1LCAgMjM0LCAgMTc5fSwgeyAgIDM5LCAgMTg2LCAgMTYzLCAgMzQ1fSwgeyAgMzMyLCAgMTk5LCAgMjk5LCAgMTYxfSwKK3sgIC01NCwgIDI4NSwgIC03OCwgIDI4MX0sIHsgLTEzMywgIDE0MSwgLTE4MiwgIDExMX0sIHsgIDI0OSwgIDM0MSwgIDI3MSwgIDM2NH0sCit7ICAgOTMsICA0MDMsICAgNzUsICAzOTF9LCB7ICAgOTIsICA1MTAsIC0xMzgsICAyMjB9LCB7IC0xODUsICAtMjksICAtMzQsICAzNjF9LAoreyAtMTE1LCAgMzIwLCAgICAzLCAgNTU0fSwgeyAgIDk5LCAgMjg2LCAgMjE4LCAgNTkxfSwgeyAtMjQ1LCAgNDA2LCAtMjY4LCAgNDUzfSwKK3sgICAgMCwgIDU4MCwgICAyNSwgIDYwNn0sIHsgIDI3NSwgIDUzMiwgIDE0OCwgIDQ1MH0sIHsgIC03MywgIDczOSwgLTI4NSwgIDUxOH0sCit7IC0yODgsICAgOTQsIC0yMDMsICA2NzR9LCB7IC0xNDAsICAtNzQsICAyMDUsICA3MTR9LCB7IC0xMTQsICAyOTksICAxNzYsICA5MjN9LAoreyAgMTgyLCAgNTU3LCAgMjQwLCAgNzA1fSwgeyAgLTE2LCAgNTEzLCAgNDg1LCAgNTkzfSwgeyAgMjkzLCAgMzg0LCAgNDUxLCAgNjE3fSwKK3sgIC0zOCwgICA1MCwgIDU2MywgIDUyOX0sIHsgIDMwMywgIDIwOSwgIDQ1OSwgIDM2M30sIHsgIDQzMywgIDQ1MiwgIDQ1MCwgIDQ1NH0sCit7ICAzNjcsICA2MDYsICA0NzcsICA3NDF9LCB7ICA0MzIsICAzNTMsICAzNjgsICAyNjd9LCB7ICAzNjEsICA3MTYsICAyNzMsICA1ODN9LAoreyAgNDUzLCAgMTY2LCAgNTEwLCAgMTcyfSwgeyAgMjAxLCAgNjI5LCAgMjc0LCAgMTkxfSwgeyAgNTY4LCAgNjM5LCAgMzAyLCAgMjk4fSwKK3sgIDYzNCwgIDM4NywgIDY0MywgIDM1MH0sIHsgIDU4NywgIDU2MCwgIDYxMiwgIDU2NX0sIHsgIDYwMCwgIDc4OCwgIDQ4NywgIDY3Mn0sCit7ICA1MTIsIDEwMTUsICAzMjEsICAzMzN9LCB7ICAzNTcsICA4NTQsIC0xMjUsICA0MTN9LCB7ICA0NzQsICA3MTIsICAgMTcsIC0xNTF9LAoreyAgNTY0LCAgMjg1LCAgMjcwLCAtMjQxfSwgeyAgOTcxLCAgODg5LCAgNDg5LCAgMjIwfSwgeyAgNTEwLCAgODk2LCAgNTQ5LCAgOTI0fSwKK3sgIDMyNywgIDgyNSwgIDI5MCwgIDkxMX0sIHsgIDU0MCwgMTEwOCwgIDE1OCwgIDgwNX0sIHsgIDE5OSwgIDk1NywgIDUxMSwgIDczMH0sCit7ICAxMDAsICA4NzQsICAgMTMsICA3OTF9LCB7ICA0MzUsICA2MzIsICA2NzYsICA5NzJ9LCB7ICAyNDksICA5MDAsICA0NjcsIDEyMTh9LAoreyAgNzgxLCAxMDc0LCAgNTg1LCAgNzg1fSwgeyAgLTIzLCAgNjY5LCAgMjY3LCAxMDQzfSwgeyAgNjE5LCAxMDg0LCAgNjE1LCAxMTQ1fSwKK3sgIDYyMiwgIDkwNSwgIDkxNiwgMTA0OX0sIHsgICA4MCwgIDMzMSwgIDU4NCwgMTA3NX0sIHsgICA4OSwgIDYzOSwgIDk4OCwgIDk2MX0sCit7ICA3NzAsICA3MjAsICA3OTgsICA2OTl9LCB7ICA0OTIsICA0NDcsICA4OTksICA2Mjd9LCB7ICAyNzEsIDExODgsICA3MjUsIDEzMzN9LAoreyAgIDg3LCAgNjAzLCAgODMyLCAxNjAzfSwgeyAgNjE2LCAxMTI3LCAgODkwLCAxNTA1fSwgeyAxMDAwLCAxMTU2LCAgODY2LCAxMDA5fSwKK3sgIDk5NSwgIDgyNywgMTE0OSwgIDg1OH0sIHsgIDgxNywgMTQ1MCwgIDc3MywgMTMyMH0sIHsgIDUwMCwgMTM4OSwgIDMxMiwgMTE1M30sCit7ICAtMjAsIDEwODQsICAgNjQsIDEyODN9LCB7ICAgIDIsIDExNzIsICAzOTksIDE4Njl9LCB7ICA1MTQsIDE3MDYsICA1MDIsIDE2MzZ9LAoreyAgODg2LCAxNTIyLCAgNDE2LCAgNjAwfSwgeyAxMTMxLCAxMzUwLCAxMjc1LCAxMzkwfSwgeyAgODg5LCAxNzk1LCAgOTE0LCAxNzY2fSwKK3sgIDIyNywgMTE4MywgMTI1MCwgMTgyNn0sIHsgIDUwNSwgMTg1NCwgIDkxOSwgMjM1M30sIHsgLTE5OSwgIDQzMSwgIDE1MiwgMTczNX0sCit7IC0yMTMsICAtMjgsICAzOTIsIDEzMzR9LCB7IC0xNTMsICAtNTIsICA5NzgsIDExNTF9LCB7IC0zMjMsIC00MDAsICA4MTMsIDE3MDN9LAoreyAtMTM2LCAgIDg0LCAxNDQ5LCAyMDE1fSwgeyAtMzMxLCAtMTQzLCAtMTM3LCAxMTkyfSwgeyAtMjU2LCAgNTM0LCAtMTU3LCAxMDMxfSwKK3sgLTMwNywgLTQzOSwgIDU0MiwgIDczMX0sIHsgLTMyOSwgLTQyMCwgIC05NywgIDYxNn0sIHsgLTM2MiwgLTE2OCwgLTMyMiwgIDM2Nn0sCit7IC0yNDcsIC0xMTAsIC0yMTEsICAgODl9LCB7IC0xOTYsIC0zMDksICAgMjAsICAgNTl9LCB7IC0zNjQsIC00NjMsIC0yODYsICAgODl9LAoreyAtMzM2LCAgMTc1LCAtNDMyLCAgMTQxfSwgeyAtMzc5LCAtMTkwLCAtNDM0LCAtMTk2fSwgeyAgLTc5LCAgMTUwLCAtMjc4LCAtMjI3fSwKK3sgLTI4MCwgIDE2NiwgLTU1NSwgLTQyMn0sIHsgLTE1NSwgIDU0MSwgLTM2NiwgICA1NH0sIHsgIC0yOSwgIC04MywgLTMwMSwgLTc3NH0sCit7ICAxODYsICA2MjgsIC0zOTcsIC0yNjR9LCB7ICAyNDIsICAyOTMsIC0xOTcsIC01ODV9LCB7ICAxMjQsICA0MTAsICAgNTMsIC0xMzN9LAoreyAgIDEwLCAgMzQwLCAtNTcwLC0xMDY1fSwgeyAgIDY1LCAtNDQ2LCAgIDY4LCAtNDkzfSwgeyAgMzgzLCAgOTM3LCAtMzU3LCAtNzExfSwKK3sgLTM1OSwgLTI1MCwgLTY3NywtMTA2OH0sIHsgIDI5MiwgIC0yNiwgIDM2MywgICAgNn0sIHsgIDYwNywgMTMxMywgLTEyNywgIC0xMH0sCit7IDE1MTMsIDE4ODYsICA3MTMsICA5NzJ9LCB7IDE0NjksIDIxODEsIDE0NDMsIDIwMTZ9Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBsc2ZfNV8yWzI1Nl1bNF0gPSB7Cit7LTE2MzEsLTE2MDAsLTE3OTYsLTIyOTB9LCB7LTEwMjcsLTE3NzAsLTExMDAsLTIwMjV9LCB7LTEyNzcsLTEzODgsLTEzNjcsLTE1MzR9LAoreyAtOTQ3LC0xNDYxLCAtOTcyLC0xNTI0fSwgeyAtOTk5LC0xMjIyLC0xMDIwLC0xMTcyfSwgeyAtODE1LCAtOTg3LCAtOTkyLC0xMzcxfSwKK3stMTIxNiwtMTAwNiwtMTI4OSwtMTA5NH0sIHsgLTc0NCwtMTI2OCwgLTc1NSwtMTI5M30sIHsgLTg2MiwgLTkyMywgLTkwNSwgLTk4NH0sCit7IC02NzgsLTEwNTEsIC02ODUsLTEwNTB9LCB7LTEwODcsIC05ODUsLTEwNjIsIC02Nzl9LCB7IC05ODksIC02NDEsLTExMjcsIC05NzZ9LAoreyAtNzYyLCAtNjU0LCAtODkwLCAtODA2fSwgeyAtODMzLC0xMDkxLCAtNzA2LCAtNjI5fSwgeyAtNjIxLCAtODA2LCAtNjQwLCAtODEyfSwKK3sgLTc3NSwgLTYzNCwgLTc3OSwgLTU0M30sIHsgLTk5NiwgLTU2NSwtMTA3NSwgLTU4MH0sIHsgLTU0NiwgLTYxMSwgLTU3MiwgLTYxOX0sCit7IC03NjAsIC0yOTAsIC04NzksIC01MjZ9LCB7IC04MjMsIC00NjIsIC03OTUsIC0yNTN9LCB7IC01NTMsIC00MTUsIC01ODksIC00Mzl9LAoreyAtNTMzLCAtMzQwLCAtNjkyLCAtOTM1fSwgeyAtNTA1LCAtNzcyLCAtNzAyLC0xMTMxfSwgeyAtMjYzLCAtMzA2LCAtOTcxLCAtNDgzfSwKK3sgLTQ0NSwgIC03NCwgLTU1NSwgLTU0OH0sIHsgLTYxNCwgLTEyOSwgLTY5MywgLTIzNH0sIHsgLTM5NiwgLTI0NiwgLTQ3NSwgLTI1MH0sCit7IC0yNjUsIC00MDQsIC0zNzYsIC01MTR9LCB7IC00MTcsIC01MTAsIC0zMDAsIC0zMTN9LCB7IC0zMzQsIC02NjQsIC00NjMsIC04MTR9LAoreyAtMzg2LCAtNzA0LCAtMzM3LCAtNjE1fSwgeyAtMjM0LCAtMjAxLCAtMjMzLCAtMjM5fSwgeyAtMTY3LCAtNTY3LCAtMjAzLCAtNjE5fSwKK3sgLTE0NywgLTQxNSwgLTExNSwgLTM1Mn0sIHsgLTE2NiwgLTc1MCwgLTE3MSwgLTc2MX0sIHsgLTI3MCwgLTg3OSwgLTI2NCwgLTkwM30sCit7IC0zNjcsIC03NDQsICAgNDMsIC00NzV9LCB7ICAgMTQsIC02NTMsICAgNDMsIC02NzB9LCB7ICAgMTEsIC00NDgsICAtNTksIC01MjF9LAoreyAtMTI2LCAtMTE5LCAtMTU1LCAtNjEzfSwgeyAgLTQyLCAtODYzLCAgLTI3LCAtOTMxfSwgeyAgMTM2LCAtNDgzLCAgMTgzLCAtNDY4fSwKK3sgICA1NSwgLTI5OCwgICA1NSwgLTMwNH0sIHsgIDMxMywgLTYwOSwgIDMxMywgLTcyMH0sIHsgIDMyMiwgLTE2NywgIDEwMCwgLTU0MX0sCit7ICAgLTMsIC0xMTksIC0xMTEsIC0xODd9LCB7ICAyMzMsIC0yMzYsICAyNjAsIC0yMzR9LCB7ICAgMjYsIC0xNjUsICAxMzQsICAtNDV9LAoreyAgLTQwLCAtNTQ5LCAgMzYwLCAtMjAzfSwgeyAgMzc4LCAtMzg4LCAgNDUwLCAtMzgzfSwgeyAgMjc1LCAgIDIwLCAgMTgyLCAtMTAzfSwKK3sgIDI0NiwgLTExMSwgIDQzMSwgICAzN30sIHsgIDQ2MiwgLTE0NiwgIDQ4NywgLTE1N30sIHsgLTI4NCwgIC01OSwgIDUwMywgLTE4NH0sCit7ICAgMjQsICAgNTMsICAgLTMsICAgNTR9LCB7ICAxMjIsICAyNTksICAzMzMsICAgNjZ9LCB7ICA0ODQsICAxMDQsICA0MzYsICAgNjh9LAoreyAgMTk1LCAgMTE2LCAgMTkwLCAgMjA2fSwgeyAgMjY5LCAgIC05LCAgNDgyLCAgMzUyfSwgeyAgMzgyLCAgMjg1LCAgMzk5LCAgMjc3fSwKK3sgIDQ1MiwgIDI1NiwgICA2OSwgIDE4Nn0sIHsgICAxMywgIDI5NywgIC0xMywgIDI1OX0sIHsgIC05NSwgICAzMCwgICA1NiwgIDM5NH0sCit7ICAxOTYsICA0MjUsICAyMDUsICA0NTZ9LCB7ICAyODEsICA1NzcsICAgMTUsICAxOTF9LCB7ICAzNzUsICAyOTAsICA0MDcsICA1NzZ9LAoreyAgLTU2LCAgMjI3LCAgNTQ0LCAgNDA1fSwgeyAgICAwLCAgNTQ5LCAgLTkyLCAgNTI4fSwgeyAtMjI5LCAgMzUxLCAtMjQ1LCAgMzM4fSwKK3sgLTM2MiwgIDQzNSwgIDE2NywgIDUyN30sIHsgIC03NSwgIDMwMiwgICA5MSwgIDgyNH0sIHsgIDEyOSwgIDU5OSwgIDQ5NiwgIDY3OX0sCit7ICAxODYsICA3NDksICAxNTMsICA3Mzd9LCB7IC0yODEsICA2MDAsIC0zNDgsICA2MTV9LCB7IC0yMzYsICA3NjksICAgNDEsICA4ODF9LAoreyAgIDM4LCAgODkwLCAtMjIwLCAgODQxfSwgeyAtMzU3LCAgODgzLCAtMzkzLCAgOTAzfSwgeyAtNjM0LCAgNDc0LCAtNDQ0LCAgODUwfSwKK3sgLTE3NSwgIDY3OCwgLTQ5MywgIDI0Mn0sIHsgLTUxOSwgIDc4NSwgLTcxNCwgIDU4Mn0sIHsgLTU0MSwgIDM2NiwgLTU0MywgIDQzNH0sCit7IC01OTcsICA1MDAsIC03NjUsICAyMjJ9LCB7IC03MDIsICA5MTcsIC03NDMsICA5NjJ9LCB7IC04NjksICA1MDEsIC04OTksICA1NDh9LAoreyAtMzc5LCAgMjAwLCAtNDM1LCAgMTU3fSwgeyAtODE5LCAgMjE0LCAtODYxLCAgMTU3fSwgeyAtNjE0LCAgIDQwLCAtNjMyLCAgIDk0fSwKK3sgLTg4MywgIC01NCwgLTc0MSwgIDUxNn0sIHsgLTUwMSwgIDI5OCwgLTYxNCwgLTE3MX0sIHsgLTg3MCwgLTE2MSwgLTg2NSwgIC0yM30sCit7IC04MTgsICAgOTMsLTEwMTUsIC0yNjd9LCB7IC02NjIsIC0zNTksIC01NDksICAgIDJ9LCB7IC00NDIsIC0xMjEsIC0zNzcsICAgIDB9LAoreyAtMjI3LCAgIDMzLCAtNDE0LCAtMTI2fSwgeyAtMTI5LCAgMjEyLCAtOTM0LCAgIDM0fSwgey0xMDgyLCAtMjgyLC0xMTE5LCAtMjY4fSwKK3sgLTcxMCwgLTgyNSwgLTQyMCwgLTE5MX0sIHstMTA3NiwgLTkyOCwgLTkxNywgIC05M30sIHsgLTYyOCwgLTM1OCwgICA5NywgICAgN30sCit7IC0yMDYsIC0zOTMsIC0xMDEsICAgMjR9LCB7IC0yMDMsICAgMzgsIC0xNjgsICAgODN9LCB7IC01OTksIC00MjMsIC0yNzksICA0MjZ9LAoreyAtNzAwLCAgMTE4LCAgLTc1LCAgMjA2fSwgeyAtOTgxLCAtNjczLCAtNjgwLCAgNDE3fSwgeyAtMzY3LCAgIDM3LCAtMjc5LCAgNDc0fSwKK3sgLTEyOSwgLTMxOCwgIDMxOSwgIDI5Nn0sIHsgLTYyNiwgIC0zOSwgIDM0MywgIDYwMn0sIHsgLTY5NiwgIC0zOSwgLTMwMywgIDk0MH0sCit7ICAxMDQsICAyMzMsIC0zODAsICAxMzd9LCB7ICAtMzYsICAyNjksICAtNzUsIC0yMTR9LCB7ICAxMjAsICAgNDMsIC01MjksIC00Nzd9LAoreyAgNDU5LCAgMTY0LCAtMjAyLCAtMjI5fSwgeyAgLTQ5LCAtMTY3LCAgNjA5LCAgNzkyfSwgeyAgIDk4LCAtMjIwLCAgOTE1LCAgMTQ4fSwKK3sgIDI5MywgIDI4MywgIDg2OSwgICA5MX0sIHsgIDU3NSwgIDM5NCwgIDMyNiwgIC03OH0sIHsgIDcxNywgICA2NywgIDM2NSwgLTMyM30sCit7ICA2MTYsICAtMzYsICA3MzEsICAgMjd9LCB7ICA2MTksICAyMzgsICA2MzIsICAyNzN9LCB7ICA0NDgsICAgOTksICA4MDEsICA0NzZ9LAoreyAgODY5LCAgMjczLCAgNjg1LCAgIDY0fSwgeyAgNzg5LCAgIDcyLCAxMDIxLCAgMjE3fSwgeyAgNzkzLCAgNDU5LCAgNzM0LCAgMzYwfSwKK3sgIDY0NiwgIDQ4MCwgIDM2MCwgIDMyMn0sIHsgIDQyOSwgIDQ2NCwgIDYzOCwgIDQzMH0sIHsgIDc1NiwgIDM2MywgMTAwMCwgIDQwNH0sCit7ICA2ODMsICA1MjgsICA2MDIsICA2MTV9LCB7ICA2NTUsICA0MTMsICA5NDYsICA2ODd9LCB7ICA5MzcsICA2MDIsICA5MDQsICA2MDR9LAoreyAgNTU1LCAgNzM3LCAgNzg2LCAgNjYyfSwgeyAgNDY3LCAgNjU0LCAgMzYyLCAgNTg5fSwgeyAgOTI5LCAgNzEwLCAgNDk4LCAgNDc4fSwKK3sgIDQxNSwgIDQyMCwgIDY5MywgIDg4M30sIHsgIDgxMywgIDY4MywgIDc4MSwgIDkyNX0sIHsgIDkxMywgIDkzOSwgIDcyNiwgIDczMn0sCit7ICA0OTEsICA4NTMsICA1MzEsICA5NDh9LCB7ICA3MzQsICA5NjMsICAzMTUsICA4MDh9LCB7ICA3NjEsICA3NTUsIDExNDQsICA3NjB9LAoreyAgNjU1LCAxMDc2LCAgODI2LCAxMDU3fSwgeyAxMDkxLCAgODM4LCAxMDAzLCAgODA4fSwgeyAxMDQ3LCAxMTMzLCAgNjU5LCAxMTAxfSwKK3sgIDk5MiwgMTA1MCwgMTA3NCwgMTA3NX0sIHsgIDk3MSwgIDY5NCwgMTIyNiwgMTA1NH0sIHsgIDU3MSwgIDg0MSwgIDg4NCwgMTQwNH0sCit7IDEzNzksIDEwOTYsIDEwODAsICA4NjF9LCB7IDEyMzEsICA3MzUsIDEyODQsICA3NjB9LCB7IDEyNzIsICA5OTEsIDEzNjcsIDEwNTN9LAoreyAxMjU3LCAgNzAwLCAxMDUwLCAgNTM0fSwgeyAgOTg4LCAgNDUzLCAxMjY0LCAgNTk5fSwgeyAxMTQwLCAgNjc5LCAxNjIxLCAgODE1fSwKK3sgMTM4NCwgIDUyMSwgMTMxNywgIDM5M30sIHsgMTU2NCwgIDgwNSwgMTQ0OCwgIDY4Nn0sIHsgMTA2OCwgIDY0OCwgIDg3NSwgIDMwN30sCit7IDEwODMsICAzNjEsIDEwNDcsICAzMTd9LCB7IDE0MTcsICA5NjQsICA2NzUsICA1NzF9LCB7IDExNTIsICAgNzksIDExMTQsICAtNDd9LAoreyAxNTMwLCAgMzExLCAxNzIxLCAgMzE0fSwgeyAxMTY2LCAgNjg5LCAgNTE0LCAgLTk0fSwgeyAgMzQ5LCAgMjgyLCAxNDEyLCAgMzI4fSwKK3sgMTAyNSwgIDQ4NywgIC02NSwgICA1N30sIHsgIDgwNSwgIDk3MCwgICAzNiwgICA2Mn0sIHsgIDc2OSwgLTI2MywgIDc5MSwgLTM0Nn0sCit7ICA2MzcsICA2OTksIC0xMzcsICA2MjB9LCB7ICA1MzQsICA1NDEsIC03MzUsICAxOTR9LCB7ICA3MTEsICAzMDAsIC0yNjgsIC04NjN9LAoreyAgOTI2LCAgNzY5LCAtNzA4LCAtNDI4fSwgeyAgNTA2LCAgMTc0LCAtODkyLCAtNjMwfSwgeyAgNDM1LCAgNTQ3LC0xNDM1LCAtMjU4fSwKK3sgIDYyMSwgIDQ3MSwtMTAxOCwtMTM2OH0sIHsgLTM5MywgIDUyMSwgLTkyMCwgLTY4Nn0sIHsgIC0yNSwgICAyMCwgLTk4MiwtMTE1Nn0sCit7ICAzNDAsICAgIDksLTE1NTgsLTExMzV9LCB7IC0zNTIsICAgNDgsLTE1NzksIC00MDJ9LCB7IC04ODcsICAgIDYsLTExNTYsIC04ODh9LAoreyAtNTQ4LCAtMzUyLC0xNjQzLC0xMTY4fSwgeyAtMTU5LCAgNjEwLC0yMDI0LCAtOTYzfSwgeyAtMjI1LCAgMTkzLC0xNjU2LC0xOTYwfSwKK3sgLTI0NSwgLTQ5MywgLTk2NCwtMTY4MH0sIHsgLTkzNiwgLTYzNSwtMTI5OSwtMTc0NH0sIHstMTM4OCwgLTYwNCwtMTU0MCwgLTgzNX0sCit7LTEzOTcsIC0xMzUsLTE1ODgsIC0yOTB9LCB7LTE2NzAsIC03MTIsLTIwMTEsLTE2MzJ9LCB7LTE2NjMsICAtMjcsLTIyNTgsIC04MTF9LAorey0xMTU3LCAgMTg0LC0xMjY1LCAgMTg5fSwgey0xMzY3LCAgNTg2LC0yMDExLCAgMjAxfSwgeyAtNzkwLCAgNzEyLC0xMjEwLCAgICAzfSwKK3stMTAzMywgIDgwOCwtMTI1MSwgIDgzMH0sIHsgLTExMSwgIDYzNSwtMTYzNiwgIDQ0N30sIHsgLTQ2MywgLTk0OSwgLTQ0NSwgLTkyOH0sCit7IC01MDQsLTExNjIsIC01MDEsLTEyMTF9LCB7ICAxNDQsIC0zNTEsIC0zNzIsLTEwNTJ9LCB7IC0yODMsLTEwNTksIC0yNzksLTExMjN9LAoreyAtNTc1LC0xNDM4LCAtNTg3LC0xNjE0fSwgeyAtOTM1LCAtOTg0LCAgMjI5LCAgNjkwfSwgeyAtOTIxLCAtNzE5LCAtNDAzLCAxMzYyfSwKK3sgLTY4NSwgLTQ2NSwgIDg3NCwgIDM5N30sIHsgLTUwOSwgIC00NiwgIDMxNywgMTMzNH0sIHsgLTQ4NSwgIDQ1NiwgIDgxMywgIDQzOX0sCit7IC00MTEsICAzMzksICA4OTgsIDEwNjd9LCB7IC00MjUsICAgNDYsIDE0NDEsICA0OTd9LCB7IC05MDksIC04MDAsIDE0NjUsIDEwNDZ9LAoreyAtMjU0LCAtMzIxLCAxNDMwLCAxMTY1fSwgeyAgIDY4LCAgMzUwLCAxMDM0LCAgNjY2fSwgeyAgMzcwLCAgIDExLCAxMzExLCAgNzkwfSwKK3sgIDE0MywgIDIzMiwgMTA0MSwgMTU2Mn0sIHsgLTExNCwgIDY2MywgMTYxNiwgMTA3OH0sIHsgIDQ1NCwgIDU3OSwgMTI3NSwgMTA0MH0sCit7ICAtNzYsICA5MDksICA3NTIsIDEwNjd9LCB7ICAxNTMsICA1MTIsICAzNDgsIDEyMTR9LCB7ICA2MTQsICAzODUsIDE4NDMsICA4MDh9LAoreyAgMjY5LCAxMDM0LCAgMjAzLCAxMDg2fSwgeyAgNjUyLCAxMDE3LCAxNzgzLCAxMTMwfSwgeyAgNDI5LCAxMzI3LCAgMzg3LCAxMzg0fSwKK3sgIC00OSwgMTE4MywgIC03MiwgMTIxNX0sIHsgLTQxNiwgMTAwMSwgIDU0NCwgMTc0OX0sIHsgLTM1MiwgMTIyMywgLTUwMiwgMTE5OX0sCit7IC01ODksICA1NjksIC0yMjcsIDE2MzB9LCB7IC0xNDIsIDE1NzgsIC0yMzAsIDE3MTV9LCB7IC03MTQsIDEyODgsIC04MzgsIDEzOTh9LAoreyAxMTMxLCAxMzU3LCAtMjA4LCAxMjMyfSwgeyAgNDM3LCAgOTY1LCAtOTI5LCAgODE4fSwgeyAgODExLCAxNDEwLCAgODU5LCAxNTA3fSwKK3sgIDE2NCwgMTIxMiwgMTM4NywgMTc5M30sIHsgIDQ4NCwgMTg3NCwgIDQ1NiwgMjA2M30sIHsgIDk5NiwgMTE3MCwgMTMyNiwgMTQwMn0sCit7IDEzMTYsIDEzNjAsIDExMzUsIDEyNjJ9LCB7IDEyMzQsIDE2MTgsIDEzNjEsIDE3Njh9LCB7IDE0MjEsIDEyMjcsIDE1ODQsIDEzNDd9LAoreyAgODU0LCAgNjcyLCAxNjg1LCAxNTY2fSwgeyAxMTM5LCAxMjcwLCAyMDE2LCAxODI1fSwgeyAxNzczLCAxNTgxLCAxNTMyLCAxNDYwfSwKK3sgMTQ4NywgIDk0NiwgMTY1OSwgMTAyMX0sIHsgMTc0NCwgMTIxMiwgMTM5MiwgIDk3N30sIHsgMTc3MiwgMTE2MSwgMTgyNiwgMTE2NH0sCit7IDE3MTgsIDE0MjksIDE5NzMsIDE1OTF9LCB7IDExODUsICA4NjQsIDIxMzIsIDEwNjF9LCB7IDE3OTksICA4MTQsIDE4MzgsICA3NTd9LAoreyAyMTA0LCAxMzE1LCAyMDU0LCAxMjU4fSwgeyAyMTEzLCAgOTE1LCAyMzMxLCAgOTMwfSwgeyAxNDY3LCAxMTQ3LCAyNTkwLCAxNDM5fSwKK3sgMjI0NSwgMTc0NCwgMjA5MCwgMTYyMH0sIHsgMjM1OCwgMTQ1NCwgMjY2NiwgMTUwNn0sIHsgMTg3NiwgMTgzNywgMjA3MCwgMTk3NX0sCit7IDE3MzksIDE1NzcsICA2ODIsIDEyODl9LCB7IDE1ODQsIDIwNDUsIDE0NTQsIDIwOTh9LCB7IDI0OTgsIDIwMDQsIDI3MTEsIDIwNjZ9LAoreyAgNzI2LCAxNTg4LCAyNzU2LCAyMzM2fSwgeyAgMjI4LCAgODQ3LCAyNDU2LCAxNjU5fSwgeyAgIDM2LCAgMzAxLCAxOTQyLCAxOTU3fSwKK3sgLTQ0NiwgIC05NiwgMjE1NCwgMTM5Nn0sIHsgMTUzMywgMTEwMSwgICAxNCwgIDYwOH0sIHsgLTkyMywgLTczMiwgMTM4MywgMTk4Mn0sCit7IDEzNDUsICA5NTIsIC02ODAsICAzMjF9LCB7IDEyODEsIDEyNjgsLTE1OTQsICAzNjV9LCB7ICA5NDEsICA5NDYsLTE3MzcsIC04MjJ9LAoreyAyMzc0LCAyNzg3LCAxODIxLCAyNzg4fQorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgbHNmXzVfM1syNTZdWzRdID0geworey0xODEyLC0yMjc1LC0xODc5LC0yNTM3fSwgey0xNjQwLC0xODQ4LC0xNjk1LC0yMDA0fSwgey0xMjIwLC0xOTEyLC0xMjIxLC0yMTA2fSwKK3stMTU1OSwtMTU4OCwtMTU3MywtMTU1Nn0sIHstMTE5NSwtMTYxNSwtMTIyNCwtMTcyN30sIHstMTM1OSwtMTE1MSwtMTYxNiwtMTk0OH0sCit7LTEyNzQsLTEzOTEsLTEzMDUsLTE0MDN9LCB7LTE2MDcsLTExNzksLTE2NzYsLTEzMTF9LCB7LTE0NDMsLTE0NzgsLTEzNjcsIC04OTh9LAorey0xMjU2LC0xMDU5LC0xMzMxLC0xMTM0fSwgeyAtOTgyLC0xMTMzLC0xMTQ5LC0xNTA0fSwgey0xMDgwLC0xMzA4LC0xMDIwLC0xMTgzfSwKK3sgLTk4MCwtMTQ4NiwgLTk2NywtMTQ5NX0sIHsgLTk4OCwgLTkyMiwtMTA0NywtMTA3N30sIHsgLTgzOCwtMTE3OSwgLTg1OCwtMTIyMn0sCit7LTExMzEsLTEwNDEsLTEwNjQsIC03Njd9LCB7IC04NzIsLTExNTcsIC03MDEsIC04ODB9LCB7IC03MDYsIC05MDYsIC03NzQsLTEwMTZ9LAoreyAtNTc4LC0xMDgwLCAtODAxLC0xNDc4fSwgeyAtNTkxLC0xMTExLCAtNTkyLC0xMTQ2fSwgeyAtNzEzLC0xMzg4LCAtNjQwLC0xMzc2fSwKK3sgLTU5NywtMTA1OSwgLTQxNiwgLTkwM30sIHsgLTY4NiwgLTgzMiwgLTY2MSwgLTcwOH0sIHsgLTQ0NCwgLTg2OCwgLTQ5MCwgLTkyMX0sCit7IC0zNzQsIC03NzYsIC02MTksLTExNzB9LCB7IC01ODUsIC01NDksIC03NjksIC03OTV9LCB7IC00MzUsIC02NTksIC01MzAsIC03NDF9LAoreyAtNDk4LCAtODM3LCAtMzU3LCAtNTk3fSwgeyAtMjc5LCAtODcxLCAtMjQzLCAtODg3fSwgeyAtMjgyLCAtNjY1LCAtMjgwLCAtNjY3fSwKK3sgLTE2NSwgLTU2MCwgLTM5NCwgLTkwM30sIHsgLTM2MiwgLTQxMCwgLTQ0OCwgLTU4M30sIHsgLTQwOSwgLTU3NCwgLTMxMywgLTM1N30sCit7IC02MzcsIC01NDgsIC01NzAsIC00MzZ9LCB7IC04OTYsIC01MDQsIC0zODIsIC03NTd9LCB7ICAtNTgsIC00ODEsIC0xNjUsIC02MTh9LAoreyAtMTkxLCAtMzc0LCAtMjM0LCAtMzgyfSwgeyAtMjIyLCAtNjgzLCAgLTI1LCAtNDgwfSwgeyAtNDE4LCAtMzU5LCAtNzMwLCAtMzUzfSwKK3sgLTMyNCwgLTE1NywgLTQzMiwgLTMyMn0sIHsgLTM5NCwgLTMwMywgLTI4NCwgLTEwNH0sIHsgLTYwMSwgLTI4OSwgLTU1NiwgLTE5Nn0sCit7IC01ODgsIC0xNTAsIC02NTksIC02MDh9LCB7IC00NzMsICAtMjQsICAtNjgsIC00NDh9LCB7IC00NzQsICAgLTgsIC01MDYsICAtNDV9LAoreyAtNzQ4LCAtMTg0LCAtODQ0LCAtMjUyfSwgeyAtOTAxLCAgLTkxLCAtNTg0LCAgLTk3fSwgeyAtNjUyLCAgMTM4LCAtNzY0LCAtMTMxfSwKK3sgLTY3OCwgIC0xMiwgLTY3MCwgIDE2NX0sIHsgLTI1OSwgICAtMywgLTg0MCwgLTEwN30sIHsgLTkwOSwgICAzNywgLTk5MiwgICA0NH0sCit7IC04NTQsIC00MTUsIC04MzksICAgMTN9LCB7LTEwMDEsIC0yNzEsLTEwMjYsIC0zMDl9LCB7IC03OTgsIC00NzgsIC04MzIsIC00ODh9LAoreyAtOTQzLCAgMTY4LC0xMTEyLCAtMzg3fSwgey0xMTg1LCAtMTAxLC0xMTgzLCAgLTQwfSwgeyAtOTQxLCAtMzE2LC0xMDMwLCAtNzcwfSwKK3stMTA0NCwgLTYyNSwtMTA4MSwgLTUzOH0sIHstMTIyNCwgLTI5OSwtMTMxMiwgLTQzNn0sIHstMTE5NywgLTY2MywtMTE2NywgLTE2MX0sCit7LTEyMTYsIC02OTAsLTEyMzcsIC04MzF9LCB7LTE0MzIsIC03MjAsLTE0MDMsIC00OTN9LCB7IC04OTgsIC03NDAsIC05MjIsIC04MDF9LAorey0xMTAyLCAtNDAyLC0xNTc5LCAtOTY0fSwgey0xMDYxLCAtNjM4LC0xMjY5LC0xNDM4fSwgey0xNDk5LCAtOTM0LC0xNTAyLCAtODk1fSwKK3stMTU5OCwgLTU2NCwtMTcyMywgLTcxN30sIHsgLTYwNiwgLTU5NywtMTE2NiwtMTA4NX0sIHstMTM2OSwgLTQ2OCwtMTk0NiwtMTQ5M30sCit7LTE4MzgsIC05NTMsLTE5MzIsIC05MzF9LCB7LTE0OTksIC0xODgsLTE2MzUsIC00MjF9LCB7LTE0NTcsIC0zMzgsLTE0NDgsICAtMjJ9LAorey0xOTQyLCAtNDIyLC0yMDA2LCAtMjQ5fSwgeyAtNDk2LCAtMTE0LC0xOTEwLCAtNzU1fSwgey0xMjg5LCAgMTc0LC0xNDUxLCAtMTA5fSwKK3sgLTQ4MiwgLTI1NywtMTIyMSwgLTUwOH0sIHstMTYxNywgIDE1MSwtMTY5NCwgIDIwOH0sIHsgLTY1NCwgIDEwNywtMTY1MSwgICAyOX0sCit7LTExNDEsICAyNzksLTEyMTUsICAzMDZ9LCB7LTEyMjgsIC01MDYsIC03MzAsIC0xNzV9LCB7LTEyMzYsIC0xMDEsIC05NjksICA1NTF9LAoreyAtODcwLCAgMjc4LCAtODIzLCAgMzE1fSwgeyAtNTYzLCAgMzc2LC0xMDUxLCAgMjI4fSwgeyAtNTA3LCAgMjgwLCAtNTk5LCAgMjgxfSwKK3sgLTc1OCwgIDI1MywgLTMwNSwgIDM3OX0sIHsgLTc1NSwgLTEzNCwgLTYxMSwgIDY2MH0sIHsgLTgyNCwgIDUzNiwgLTgxNywgIDY0Nn0sCit7IC00MTMsICAgNDksIC0zNDEsICAxNzd9LCB7IC00NTMsICA1MjYsIC00ODIsICA1ODl9LCB7ICAtNzEsICAzMzksIC02NTcsICAyNjR9LAoreyAtMjQ0LCAgMjk1LCAtMjM3LCAgMzE1fSwgeyAtMzg3LCAgNTY5LCAtNTA2LCAgIC05fSwgeyAtMzc3LCAgIDE0LCAtMTYwLCAgNjYxfSwKK3sgLTIxNiwgICA0MCwgLTMwOCwgIC00Nn0sIHsgICA5NSwgIDIxNCwgLTI0MiwgIDE2N30sIHsgIC04NiwgIDE5MiwgIC01NiwgICAyN30sCit7ICAtNzYsICAgMzEsICAgMzYsICAzMDl9LCB7IC0xMDYsIC0xODIsIC0xMTMsICAgNzR9LCB7IC00NDEsICAtMjIsICAgMjMsICAxMzl9LAoreyAgIDgxLCAgLTExLCAgIDQ0LCAgIDE1fSwgeyAgLTg3LCAtMTM3LCAtMTE4LCAtMjA3fSwgeyAtMTU4LCAgLTU4LCAgMjcyLCAgLTkyfSwKK3sgLTE1NiwgLTQ0MSwgICAgOCwgLTEzNn0sIHsgIDEyOCwgLTIyMSwgIDEwMSwgLTIxOH0sIHsgICA0MCwgLTE5NywgIC03NiwgLTQ1Nn0sCit7ICAgIDksIC00NDUsICAgMzMsIC00MjN9LCB7ICAyMjYsICAgNjAsICAgNzMsIC0yMjJ9LCB7ICAxNTYsIC0zOTksICAyODAsIC0zMTh9LAoreyAgMjQ1LCAtMzQxLCAgMTY2LCAtNDk5fSwgeyAgMzM5LCAtMTkwLCAgMzI3LCAtMjE5fSwgeyAgMzI1LCAtMTM3LCAgLTg5LCAtNTk2fSwKK3sgIDEwMCwgLTYyNywgIDE0NCwgLTY3N30sIHsgIDQ4NywgICAyOCwgIDI1MiwgLTM5MX0sIHsgIDIxNCwgIC00MSwgIDI4MiwgIC0yOH0sCit7ICAgOTksIC0yODYsICAzMzEsICAgNDl9LCB7ICA0NTksIC0zODgsICA1NjUsIC0zNjl9LCB7ICA0MzYsICAgMjgsICAzMzYsICAgLTl9LAoreyAgMzk3LCAtMTY3LCAgNjE4LCAgIDM0fSwgeyAgNTk2LCAgLTE3LCAgNTYxLCAtMTQwfSwgeyAgMjk5LCAgIDc5LCAgNTIyLCAgMTI1fSwKK3sgIDIwMywgICAgMiwgIDI0NCwgIDI4OH0sIHsgIDI1NSwgIDIxMSwgIDE3NSwgICA4Mn0sIHsgIDU5NiwgIDE4NywgIDUxNywgIDEwOH0sCit7ICAzODEsICAyNTUsICAzNjUsICAyOTd9LCB7ICA0OTcsICAzNTIsICAzMjcsICAtODJ9LCB7ICAgMjUsICAyMTAsICAzNzEsICAyNDV9LAoreyAgMjYxLCAgICAzLCAgNTQ1LCAgNDQ5fSwgeyAgMTQwLCAgMjk0LCAgIDQ0LCAgMjk1fSwgeyAgMjEyLCAgMzQ3LCAgMjQ0LCAgNDk0fSwKK3sgIDMzMSwgIDUyOCwgIDIwMSwgIDMwN30sIHsgIDM0OSwgIDQxMSwgIDYxMywgIDI4NH0sIHsgIDYxNCwgIDQxMywgIDQ2NCwgIDMyMn0sCit7ICA2MjQsICAzOTcsICAgOTcsICAyMDB9LCB7IC0xNjAsICAzODQsICAxNDksICAzNjJ9LCB7ICA0OTUsICA1MjUsICAyNjksICA1ODV9LAoreyAgIDMzLCAgNDkxLCAtMTIxLCAgNDMzfSwgeyAgNDI3LCAgNjExLCAgNDk4LCAgNTE2fSwgeyAgMTcxLCAgNDQzLCAgNDk3LCAgNjY2fSwKK3sgIDQ0MCwgIDI3NSwgIDU2NiwgIDU3NX0sIHsgIDE0NiwgIDYzOSwgIDE1NSwgIDY3MH0sIHsgIC0zMywgIDE3MywgIDIxMiwgIDY5Nn0sCit7IC0xNjYsICA2MDEsIC0xOTEsICA2OTV9LCB7IC00ODksICA1MDMsICAxNzUsICA3NDJ9LCB7ICAyMTQsICA0NzYsICAzNzIsIDEwODN9LAoreyAgNTc4LCAgNTMwLCAgNTg2LCAgNzc3fSwgeyAgNDI1LCAgODc0LCAgMzE1LCAgODQxfSwgeyAgMzc0LCAgODQ4LCAtMTY1LCAgNTY1fSwKK3sgICAzNSwgIDk5MSwgIC0zOSwgMTA2Mn0sIHsgIDMyOSwgIDcxMiwgIDc4NiwgIDg0MH0sIHsgIDY0NSwgIDc5NSwgIDY2MSwgIDY3Nn0sCit7ICA1NzEsICA5MTgsICA2MzIsIDEwNzl9LCB7ICA2NzMsICA4MTcsICAzMTgsICAzODh9LCB7ICA4NzQsIDEwMTIsICA1NjQsICA4NDh9LAoreyAgODgwLCAgNjIwLCAgNTU3LCAgNDc5fSwgeyAgNjcxLCAgNDUzLCAgNjkyLCAgNDY4fSwgeyAgODQwLCAgNjQyLCAgODQ0LCAgNjQ1fSwKK3sgIDUwNiwgIDQyOCwgIDg5NywgIDU2N30sIHsgIDgzNywgIDM4NywgIDk2MiwgIDQ5OX0sIHsgIDY5MSwgIDU2MSwgIDkzOSwgIDkyNn0sCit7ICA3ODMsICAyOTYsICA3OTAsICAyNjh9LCB7IDEwMjgsICA1MzAsICA4NzQsICAzMjl9LCB7ICA1NDgsICAxNDMsICA2NzUsICAyOTF9LAoreyAgNTAzLCAgIDY2LCAxMDQxLCAgMzU5fSwgeyAgNzg2LCAgIDk3LCAgODA1LCAgIDMzfSwgeyAgODM3LCAgNDcwLCAgNTExLCAgIDQ5fSwKK3sgMTA5MiwgIDMyNywgMTE3NCwgIDMyM30sIHsgICAgMywgIDI0MiwgIDg3MiwgIDQ3NH0sIHsgIDY4OSwgIDQyOSwgMTMyOSwgIDY3OH0sCit7IDEwNDIsICA2MjAsIDExMDksICA2NjR9LCB7ICAzMjEsICAxOTMsICA4ODksICA5NTB9LCB7IDExNTMsICA4NzQsICA4OTMsICA2MzV9LAoreyAgODc3LCAgODYyLCAgOTQ4LCAgOTEzfSwgeyAxMjkzLCAgNjY1LCAxMzIwLCAgNjM5fSwgeyAgOTk3LCAgNzkzLCAxNDAyLCAxMDMwfSwKK3sgMTE3NiwgMTAxMiwgMTExMCwgIDk1OX0sIHsgMTQxMCwgIDkyNSwgMTQwMywgIDkxNX0sIHsgIDU0MywgIDg2MiwgMTExNiwgMTIyMn0sCit7ICA4MzUsIDExOTAsICA4MzUsIDExOTB9LCB7ICA5NTksIDExNDgsIDExNDcsIDEzNzZ9LCB7IDEzMDAsIDExOTMsIDE0MTUsIDEyMzF9LAoreyAxMzM1LCAxMzQxLCAgNzQ2LCAxMDkyfSwgeyAxNzExLCAxMjgzLCAxMzg5LCAxMDczfSwgeyAxMzM0LCAxNTY2LCAxMTUzLCAxNDc1fSwKK3sgMTY0NSwgMTEzNywgMTgyNSwgMTIyMH0sIHsgMTA1NiwgMTM4MiwgMTUyMSwgMTczMH0sIHsgMTYzMiwgMTU0NSwgMTYyMCwgMTU0Mn0sCit7ICA4NTUsIDE1OTYsICA4NjUsIDE2Njd9LCB7ICA2OTMsICA4ODUsIDE3MTYsIDE1MTl9LCB7IDExNjcsIDEyOTYsIDIyMDksIDE3NjB9LAoreyAxOTUyLCAxNDkzLCAyMDIwLCAxNDgyfSwgeyAxNTM0LCAxODY2LCAxNjk0LCAyMDA4fSwgeyAxNTY2LCAgNzQ4LCAxNzYxLCAgODI1fSwKK3sgIDI5NCwgMTM5MiwgMTA4NCwgMjA1OH0sIHsgIDYyMSwgMTMxNSwgIDM2NSwgMTI4N30sIHsgIDE5OCwgMTAyOCwgIDQ4OCwgMTQwOH0sCit7ICAyNDksICA0MDMsIDEwMTQsIDE1NjF9LCB7ICAzMjQsICAzNjMsIDE2NDUsIDEwNDR9LCB7ICAxOTMsICAzNjcsIDIwMzQsIDE4NTl9LAoreyAtMjUxLCAgNTc5LCAgNzUwLCAgOTk0fSwgeyAtMjQzLCAgIDMwLCAxMzI1LCAgODc5fSwgeyAgLTI4LCAtMTY5LCAgNjI0LCAgOTE3fSwKK3sgLTQ1MywgIDE1OSwgIDE4NiwgMTM3MH0sIHsgLTYxNCwgICAgNiwgIDUzNywgIDM5Mn0sIHsgIC05NCwgLTI5MSwgIDc4MSwgIDIyOX0sCit7IC0xMjgsIC0yOTgsICAyNDUsICA0OTF9LCB7IC03MDEsIC02NDgsICA5NzIsICA3ODl9LCB7IC01MDEsIC02NDAsICAxNzgsICAyNTV9LAoreyAtMzY1LCAtMzkwLCAtMjU1LCAgMzE3fSwgeyAtOTU4LCAtMjk0LCAtMTkxLCAgMjI4fSwgeyAtNzc1LCAtNDQ3LCAgMTU3LCAtMjM3fSwKK3sgLTY1NywgLTcyMCwgLTQwNywgICA5Mn0sIHsgLTExNywgLTYxMSwgIDMzNCwgLTIzMH0sIHsgLTY3OSwtMTA4NCwgLTE0NCwgLTMxN30sCit7IC05MDEsIC04NjEsIC03MzgsIC0zNjB9LCB7ICAtODUsIC03MjcsICAtOTAsIC03ODd9LCB7ICAxMDAsICAtMjIsIC0zOTEsIC0yNjN9LAoreyAgLTU2LCAgLTczLCAtMzM3LCAtNzU0fSwgeyAgICA1LCAtMTg5LCAtNzA2LCAtNjI0fSwgeyAgIDg5LCAtMzQ0LCAtMTM1LC0xMTEzfSwKK3sgLTM1MywgLTIzNywgLTY4NCwtMTEzNX0sIHsgLTI3NSwtMTEwMiwgLTI2OSwtMTIwM30sIHsgIDE1MiwgIDE0NSwgLTcyMiwtMTIzMn0sCit7ICAgNDksICAgODAsLTEyNDgsIC03NzZ9LCB7IC0yNDgsICAzOTEsIC03MzIsIC01NDd9LCB7ICA0NjksICAyMTgsIC0yNTUsIC04NjR9LAoreyAgIDY5LCAgMzY2LCAtMTY2LCAtNDg1fSwgeyAtNjg4LCAgMTkxLC0xMjEyLC0xMTk2fSwgeyAtMTcwLCAtMTY5LC0xMzA4LC0xNjMxfSwKK3sgIDMyMSwgIDQ3MCwtMTQxOSwtMTI0M30sIHsgIC02NCwgIDI3MiwtMTM2MSwgLTI0OH0sIHsgIDQ5MiwgIDU2NSwgLTcyMSwgLTYwOX0sCit7ICAxOTUsICA0ODUsIC01NzMsIC0xMzN9LCB7ICA0MjcsICAyMDIsIC0xNzEsIC0xMTh9LCB7ICAxOTksICA1NzUsICAgIDIsICAtMzF9LAoreyAgNjk0LCAgNzU1LC0xMzY2LCAgLTM5fSwgeyAgNTUyLCAgNTU3LCAtNDg5LCAgMjcxfSwgeyAgNjgwLCAgNTM3LCAgIDEzLCAtNDUzfSwKK3sgIDg1NSwgIDk1NCwgLTEzMywgIC01Mn0sIHsgIC04MSwgIDczOCwtMTE2OSwgIDYzN30sIHsgMTA1NSwgMTA1OSwgIC05NSwgIDY3Nn0sCit7IDEyNTksIDEwODEsICA0ODksICAzMDV9LCB7IC00NDksICA5NTQsIC01MzQsICA5OTZ9LCB7IC05NjksICA4NjYsLTEwNTgsIDEwNTl9LAorey0xMjk0LCAgNjE4LC0xNDE2LCAgNjE3fSwgeyAtNDU4LCAxMzY2LCAtMTU5LCAxODIxfSwgeyAtNzc0LCAtNTI4LCAgLTE0LCAxMTEwfSwKK3stMTIwMiwgLTkwMSwgLTc3MiwgIDQzM30sIHstMTI1NiwtMTI1NSwtMTAxMSwgLTMwMn0sIHsgLTYwMiwgLTU4NSwgLTc1OSwtMTYxOH0sCit7IC03NjAsLTE1NDksIC04NDAsLTE5MjF9LCB7IC04MTYsIC01MzksLTE3NjksLTIyMzV9LCB7IC0yMjcsICAtMzYsLTIwMzQsLTE4MzF9LAorey0yMTA3LC0xMTI2LC0yNDcxLC0xODE2fSwgey0xNDcwLCAgMjUyLC0yNzAxLCAtNDE1fSwgeyAtNTcxLCAtNDY3LCAxNTA5LCAxNTU0fSwKK3sgMjE4MCwgMTk3NSwgMjMyNiwgMjAyMH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGxzZl81XzRbMjU2XVs0XSA9IHsKK3stMTg1NywtMTY4MSwtMTg1NywtMTc1NX0sIHstMjA1NiwtMTE1MCwtMjEzNCwtMTY1NH0sIHstMTYxOSwtMTA5OSwtMTcwNCwtMTEzMX0sCit7LTEzNDUsLTE2MDgsLTEzNTksLTE2Mzh9LCB7LTEzMzgsLTEyOTMsLTEzMjUsLTEyNjV9LCB7LTE2NjQsLTE2NDksLTE0ODcsIC04NTF9LAorey0xMzQ2LC0xODMyLC0xNDEzLC0yMTg4fSwgey0xMjgyLCAtNjgxLC0xNzg1LC0xNjQ5fSwgeyAtOTY2LC0xMDgyLC0xMTgzLC0xNjc2fSwKK3stMTA1NCwtMTA3MywtMTE0MiwtMTE1OH0sIHstMTIwNywgLTc0NCwtMTI3NCwgLTk5N30sIHsgLTkzNCwtMTM4MywgLTkyNywtMTQxNn0sCit7LTEwMTAsLTEzMDUsIC03ODMsIC05NTV9LCB7LTEwNDksIC05MDAsIC05OTMsIC04MTd9LCB7IC03MzcsIC04MjMsIC05NzIsLTExODl9LAoreyAtNzM4LC0xMDk0LCAtNzM4LC0xMTU0fSwgeyAtNzg0LCAtODAxLCAtODEwLCAtNzg2fSwgeyAtODkyLCAtNTIwLC0xMDAwLCAtODE4fSwKK3sgLTY0NCwgLTk2NSwgLTU3NywgLTg4Mn0sIHsgLTU0MSwgLTY5NCwgLTY3MSwgLTkxN30sIHsgLTU5NSwgLTY0MiwgLTY0NiwgLTYxNX0sCit7IC05NTYsIC02MjEsIC05MjUsIC01MTV9LCB7IC03MjcsIC00ODMsIC04MTUsIC00ODV9LCB7IC04NDAsIC01NzgsIC00NDAsIC03MTN9LAoreyAtNTc4LCAtMzI1LCAtNjU3LCAtNjcwfSwgeyAtMzg2LCAtNTcwLCAtNDQxLCAtNjY2fSwgeyAtNTE0LCAtNzg3LCAtMzkyLCAtNTI5fSwKK3sgLTUyMiwgLTQ1MywgLTQ4NywgLTQyM30sIHsgLTYxNiwgLTU4NSwgLTYxNywgLTE1N30sIHsgLTY2MiwgLTI2OCwgLTY4MCwgLTM0OH0sCit7IC0zMjIsIC0zMjMsIC02MzIsIC00NDR9LCB7IC0zMDQsIC00MzAsIC0zMzIsIC00NTh9LCB7IC0yNzcsIC00NjgsIC02NTksIC03OTN9LAoreyAtMzE5LCAtNjM2LCAtMjI3LCAtNTU0fSwgeyAtMzczLCAtMzQ3LCAtMzM0LCAtMjEwfSwgeyAtNDU2LCAtMTkyLCAtNTMwLCAtMjQyfSwKK3sgLTIxNiwgLTE5OCwgLTM2NiwgLTM3MH0sIHsgLTMzOCwgLTE2MSwgLTQwOSwgLTc0OH0sIHsgLTEwNywgLTM4MCwgLTI5NCwgLTY0M30sCit7IC0yMjMsIC02NjUsIC0yMzQsIC03NDF9LCB7IC0xNDEsIC00OTYsIC0xMzAsIC01MTB9LCB7IC0xMzksIC0zMjcsIC0xNzIsIC0zMDV9LAoreyAtMzA2LCAtNTgwLCAtMTY0LCAtMjYzfSwgeyAtMjYyLCAtMTcyLCAgLTY3LCAtNDAyfSwgeyAgIDMxLCAtMzY2LCAgLTEwLCAtNDM2fSwKK3sgIC04NiwgLTUyNywgICA3MSwgLTM3N30sIHsgIC0yMiwgLTYwOSwgIC0xMiwgLTY3OH0sIHsgIC02NywgLTMxOSwgICA2MywgLTE5MX0sCit7ICAgMzUsIC0xODEsICAtMzksIC0yNDJ9LCB7ICAxMjYsIC0xNjcsIC0xNDAsIC01NDR9LCB7ICAxNTUsIC0yOTcsICAxNzQsIC0yOTd9LAoreyAgIDM4LCAgIC04LCAgMTE3LCAtMzgwfSwgeyAgMTk3LCAtNDUyLCAgMjQwLCAtNTIyfSwgeyAgMjIzLCAtMTAzLCAgMTEwLCAtMTg3fSwKK3sgICA4NywgLTE1NSwgIDE2OSwgIC00N30sIHsgIDE1NywgICAyNiwgIC04MywgLTEwMH0sIHsgIDEyOCwgICA4MCwgIDIwOSwgIC02Mn0sCit7ICAgIDYsICAgIDcsICAgMjIsICAgIDV9LCB7ICAzMTgsICAtMjAsICAyNDgsICAtNDV9LCB7IC0yMDAsICAtNjMsICAxNTYsICAtNjl9LAoreyAgMjUwLCAtMTgzLCAgMzY5LCAtMTI2fSwgeyAtMTEzLCAgLTc2LCAtMTQyLCAtMTIyfSwgeyAgLTY0LCAtMjU0LCAgLTMxLCAgIDM1fSwKK3sgLTE3NywgIC03MSwgICAtNywgIDE3MX0sIHsgICA5MywgICAyNywgIDEwOCwgIDIxMn0sIHsgLTMzMCwgLTIwOSwgLTEyMywgIC03MH0sCit7IC0yNzksICAgOTUsICAtOTYsICAgMjB9LCB7IC0xODgsICAtNjEsIC0zMTQsICAgODd9LCB7IC0zMDAsICAtNzgsIC0zNTQsIC0xMzR9LAoreyAgIDExLCAgMTIyLCAtMTQwLCAgMTIyfSwgeyAtMjc1LCAgMTUyLCAtMjkzLCAgMTQwfSwgeyAgLTgyLCAgMTM4LCAtMzIxLCAtMTExfSwKK3sgLTQ4MCwgLTE1NiwgLTM1OSwgICA3Nn0sIHsgLTI1NCwgIC00MCwgLTYzNSwgIC05Nn0sIHsgLTUyMiwgICA3OSwgLTUwNywgICAgOH0sCit7IC0yNjgsICAzMDMsIC01MzksICAgNjh9LCB7IC00NDYsICAgNjEsIC01MjIsICAzMDZ9LCB7ICAxMTEsICAxODksIC00MzUsICAxMjJ9LAoreyAtMzc5LCAgMTY2LCAtNTcxLCAtMzk4fSwgeyAtNjMyLCAgLTc0LCAtNzQ3LCAgLTk1fSwgeyAtNDU1LCAgMTk0LCAtOTUyLCAgIDgzfSwKK3sgLTc5OCwgIDE5MiwgLTc1NSwgIDE5Mn0sIHsgLTc4MSwgLTE2MiwgLTYxOSwgIDIzNH0sIHsgLTY2MywgLTI5NywgLTQ4OCwgLTEwOX0sCit7IC05NjQsIC0xMzIsIC04MzgsICAtNjh9LCB7IC04NDMsICAgNTgsLTExMTIsICAtODZ9LCB7IC04MDUsIC0yOTksIC05NDQsIC0yNTN9LAoreyAtNzc4LCAgLTUwLCAtOTY1LCAtNTQ5fSwgeyAtMzUyLCAgLTk4LCAtOTkyLCAtMzQzfSwgey0xMTE3LCAtMzE1LC0xMTE3LCAtMzA3fSwKK3stMTE1NSwgLTM3NCwgLTYzNywgLTIzMH0sIHstMTE2NiwgIC00MywtMTI5OSwgLTEwMH0sIHsgLTkyNSwgLTM5MywtMTI3NCwgLTYwMH0sCit7IC02ODksIC0xMzAsLTE0NzksIC0zMTJ9LCB7LTEzMjEsIC0yNTQsLTE0NjQsIC00NDJ9LCB7LTEyOTIsIC02MTMsLTEyNjEsIC01MDN9LAorey0xNTAxLCAtMzY4LC0xMzIyLCAgIDI2fSwgey0xNDMyLCAgLTY2LC0xNzQzLCAtMTYxfSwgey0xNjQ0LCAtNDY3LC0xNzYwLCAtNTQ4fSwKK3stMTM5MywgLTU2OCwtMTU1NiwgLTg3MX0sIHstMTQ5NSwtMTAzNCwtMTM4NywgLTU3MX0sIHstMTkxNywgLTUyOCwtMTc4MywgLTEyM30sCit7LTE4OTcsIC0yMzEsLTIwNTQsIC0zMjN9LCB7LTIwNTIsIC05MDYsLTE5NzYsIC01Njd9LCB7LTE5MTcsIC02MjAsLTIwNDcsIC05ODl9LAorey0xMDc3LCAtMzcwLC0yMDMxLCAtNzA0fSwgey0yMzU1LCAtNzQ5LC0yNzQwLC0xMDg5fSwgey0xOTA5LCAgMTU5LC0yMDEyLCAgMjQ4fSwKK3sgLTYyNiwgLTEyMywtMjMzOSwgLTk2Mn0sIHsgLTY2OSwgLTQwOCwtMTM3OSwtMTE3NH0sIHsgLTQ1MiwgLTM2NCwtMTA0NCwgLTczNX0sCit7IC0xMzIsICAxODMsLTE2MjAsIC03NTJ9LCB7IC01NDcsIC0zMDcsIC03NzcsLTEyNjF9LCB7ICAtOTgsICAgNDEsIC04ODAsLTEwOTF9LAoreyAtMjU3LCAgIDk3LC0xNjAyLC0xODMzfSwgeyAgIDMxLCAgLTI2LCAtNjQ0LCAtNTYxfSwgeyAtMTgwLCAtNTQ2LCAtMzg1LC0xMDk1fSwKK3sgLTQxMCwgLTgwMiwgLTQxNCwgLTgyN30sIHsgLTQ1NywgLTk3MCwgLTQ5MCwtMTEwOX0sIHsgLTIxNSwgLTkxNiwgLTE0NCwgLTkzN30sCit7IC00OTMsLTEyNjksIC01MTcsLTE1MDd9LCB7ICAxODEsICAxMDEsIC0zMzIsIC04ODl9LCB7IC04MzYsIC05MzcsIC01NTksIC00Mjl9LAoreyAtNjI5LCAtNTQ3LCAtMTgzLCAtMzM3fSwgeyAtNTQ1LCAgLTgyLCAtMjUwLCAtMjg2fSwgeyAgICA1LCAtMTMyLCAtMzQ4LCAtMjUyfSwKK3sgLTI5MywgLTQ3MiwgLTE1OCwgIDEwMH0sIHsgIC0yOSwgIDE5NywgLTIzNiwgLTQyNH0sIHsgLTg2MSwgLTIxMywgLTE0MCwgICAtN30sCit7IC00MjcsIC00NDMsICAxODcsICAtOTd9LCB7IC02ODQsIC03MzYsIC0yOTMsICAyNTh9LCB7IC0zNjgsIC0xNTIsIC0xNTAsICAzOTJ9LAoreyAtNjA5LCAgMTc1LCAtMTQyLCAgMjk5fSwgeyAtMTM4LCAgMTUyLCAtMTE5LCAgMzI5fSwgeyAtNDg2LCAgLTUyLCAgMjkzLCAgMTk4fSwKK3sgLTE4MywgIDExNywgIDE3NSwgIDMzMX0sIHsgIC01OCwgLTI3NCwgIDIzMSwgIDMwMH0sIHsgLTI4OCwgIDMzMCwgLTMwNSwgIDM3Mn0sCit7IC0xMTEsICA0MDksICAgLTksICA0MjN9LCB7ICAgODMsICAyNTYsICAgNjcsICAzNjd9LCB7ICAtMTksICAyNDgsICAgOTEsICAxMTN9LAoreyAgLTM1LCAgNDA2LCAtMTkxLCAgMTU0fSwgeyAgMjM4LCAgMjk2LCAgICA1LCAgMTk3fSwgeyAgMTQxLCAgMjIxLCAgMzEzLCAgMTk4fSwKK3sgIDIxMSwgIDQyMSwgIDI0NCwgIDMzNH0sIHsgICA4OCwgIDQyNiwgLTI0MywgIDQ1NH0sIHsgIDIwMiwgIDU1MiwgICAtNSwgIDQwM30sCit7ICAyOTEsICAxODUsICAyMTksICAzMDF9LCB7ICAyNTEsICAxMzgsICAxMjgsICAgNjl9LCB7ICAxOTcsICAyODgsIC0xNDAsICAtNjF9LAoreyAgMTg4LCAgMzYxLCAgMTk3LCAgNTk4fSwgeyAgNDQyLCAgMjczLCAgMjkwLCAgMTQzfSwgeyAgNDcyLCAgNDgyLCAgMTU3LCAgMzcwfSwKK3sgIDQxNSwgIDMyMSwgIDM3MiwgIDM4NX0sIHsgIDQwMiwgIDU1MiwgIDE1NSwgICAyNH0sIHsgIDU1MCwgIDI2MywgIC0xMSwgICAyMX0sCit7ICAzNjAsICAyMjcsICAxNDcsIC0yNTR9LCB7ICA0MjQsICAgOTcsICAzNjYsICAtMTN9LCB7ICAzNzUsICAxNDEsICA0NDksICAyMzJ9LAoreyAgMzk2LCAgNTA3LCAgNDc0LCAgMjcyfSwgeyAgNzAxLCAgMzI0LCAgMzYyLCAgLTQ3fSwgeyAgNTg3LCAgMTQ4LCAgNTQzLCAgIDY5fSwKK3sgIDQwMCwgIC01MSwgIDU2MSwgICA1OX0sIHsgIDIyMCwgIC0xMCwgIDM1MiwgIDE0N30sIHsgIDIwNiwgIDIxMSwgIDY1MywgIDE4NX0sCit7ICA1NjMsICAyOTcsICA1NjUsICAyODR9LCB7ICA1OTQsICAxMjEsICA3NjYsICAxOTJ9LCB7ICAzOTgsICAxMTgsICA2NDIsICA0MzR9LAoreyAgMjMzLCAgMjY0LCAgNDgxLCAgNDY3fSwgeyAgMTI5LCAtMTY1LCAgNjk5LCAgMjM5fSwgeyAgIDkwLCAgIDI2LCAgMzQyLCAgNDc0fSwKK3sgIC01NSwgICAyNywgIDM4OCwgICA5NH0sIHsgLTE3MiwgICAgMCwgIDcyNSwgIDM3OX0sIHsgIC02MCwgIDMzNywgIDM3MCwgIDQ2NX0sCit7ICAgOTUsICAzMTksICA4MDYsICA1OTV9LCB7ICAgNzgsICAyNjAsICA0OTcsICA4NTF9LCB7ICAyMTAsICA1NjAsICA0NTgsICA1NzR9LAoreyAtNDY0LCAgMjAyLCAgNDk3LCAgNjI1fSwgeyAtMjAyLCAgMTUyLCAgIDQ4LCAgNzEyfSwgeyAgLTIwLCAgNTY2LCAgMTAwLCAgNzE1fSwKK3sgIDQ1NSwgIDQ2OCwgIDQxMSwgIDYwNX0sIHsgIDMxOSwgIDY0NiwgIDE5NSwgIDYxNX0sIHsgIDQwMSwgIDUzOCwgIDY4MCwgIDczOX0sCit7ICAyMDEsICA2NjcsICA0MzQsICA5NTR9LCB7ICA0NTQsICA0MjUsICA2NDYsICA0OTF9LCB7ICA2MDYsICA2ODEsICA0MTYsICA1MDh9LAoreyAgNDk3LCAgODIyLCAgNDI2LCAgODE1fSwgeyAgNjYwLCAgNjQ3LCAgNjI4LCAgNzE2fSwgeyAgNjk3LCAgNDY2LCAgNjE4LCAgNDU3fSwKK3sgIDY4NSwgIDQ2MCwgIDM2NSwgIDMwOX0sIHsgIDcyMSwgIDU2NywgIDgzNiwgIDYwMX0sIHsgIDYwOSwgIDMwMCwgIDgyNSwgIDQ1OX0sCit7ICA5NDMsICA2ODcsICA2ODEsICA1MzN9LCB7ICA5MTUsICA1OTgsICA1OTEsICAyNDN9LCB7ICA4NzYsICA0NTEsICA4NzQsICA0MjB9LAoreyAgNzg2LCAgMzE3LCAgNzMyLCAgMjIwfSwgeyAgOTIyLCAgMzE3LCAxMTA4LCAgMzY3fSwgeyAgNTMxLCAgNDY2LCAxMDI4LCAgNjQ5fSwKK3sgMTA1MywgIDYxNSwgMTAzNCwgIDU1M30sIHsgIDgyOSwgIDYwMiwgMTAyMSwgIDc5OX0sIHsgIDkyNywgIDgwMywgIDg3OCwgIDc2M30sCit7ICA3OTksICA0OTYsIDEzNzMsICA3NzN9LCB7ICA1ODUsICA3NzAsICA4MDMsICA5MzB9LCB7IDEwOTksICA3OTMsIDEyMjIsICA4NjJ9LAoreyAxMjA5LCAgODk1LCAxMDI1LCAgNzI3fSwgeyAgNzcyLCAgODQ1LCAxMTcyLCAxMTE1fSwgeyAgODY3LCAxMDIxLCAgODMwLCAxMDEzfSwKK3sgIDg0MSwgIDkxMCwgIDUwNiwgIDcwM30sIHsgMTIzOSwgMTA3NywgIDYyMCwgIDgxOX0sIHsgMTE5NiwgMTA4MywgMTE1NSwgMTA4MX0sCit7IDExNDIsICA5MDcsIDE1NDcsIDExMjF9LCB7IDEzMDksICA2NDgsIDEzNDMsICA2MTJ9LCB7IDE0ODQsICA5ODgsIDE0NzksICA5Mzd9LAoreyAgOTg1LCAxMzI4LCAgOTU1LCAxMzQxfSwgeyAgNDI5LCAgOTEwLCAgODQxLCAxMzM4fSwgeyAgNTY0LCAxMTc5LCAgNDEyLCAxMTU2fSwKK3sgMTQyNywgMTMyMCwgMTQzNCwgMTMzMH0sIHsgIDY0MCwgIDc2MCwgMTcyNiwgMTQxMH0sIHsgIDE5MCwgIDU1NSwgMTA3MywgMTAwNX0sCit7ICA0MjYsICAyNTcsICA4MzksICA5ODB9LCB7ICAyMzUsICAyMzEsIDE1MjAsIDExNjd9LCB7ICAxMDksICAyOTMsIDEwMTQsIDE1Njl9LAoreyAgMzA1LCAgMTQyLCAxMTQ4LCAgNTM5fSwgeyAtMjkxLCAtMTA4LCAxMjEzLCAgOTcyfSwgeyAgIDIyLCAtMjE2LCAgNjY3LCAgODI4fSwKK3sgLTQ4MiwgIDQzOCwgIDQ1MywgMTQzMX0sIHsgLTU4MSwgLTQyMiwgIDc4OSwgIDM4N30sIHsgLTM1OCwgLTQ1NCwgIDE3NCwgIDc4MH0sCit7ICAtMzYsIC0zNzIsICAzOTAsIC0xMzR9LCB7IC02MjksICAxNjAsIC0zMDYsICA3NTF9LCB7LTEyNTgsIC0zMzEsICAxNzcsICA1MjJ9LAoreyAtMjQ4LCAgNTc0LCAtMjUxLCAgNjM5fSwgeyAtNTMxLCAgNDA3LCAtNTk2LCAgMzk0fSwgeyAtNDE5LCAgNzg5LCAtNjE3LCAgODAxfSwKK3sgLTk4NiwgIDM5OSwgLTg1NywgIDcyN30sIHsgICAtNywgIDUxOCwgLTcwMywgIDMxMH0sIHstMTE0MywgIC0yNCwtMTAwMiwgIDI4N30sCit7IC05NjAsICAzNjMsLTEyOTksICAzMTJ9LCB7LTE1MzQsICAyNDUsLTE1NTcsICAzMDV9LCB7ICAgMjgsICAxNTMsIC04NTksIC0xNzV9LAoreyAgLTMzLCAgMzMyLC0xMzk4LCAtMTU0fSwgeyAgMjEyLCAgNDEwLCAtNTkzLCAtMTk3fSwgey0xMDkyLCAtNzA0LCAtOTA0LCAgLTY1fSwKK3sgIDI4MiwgIDM2NywgLTkxOCwgLTY4Nn0sIHsgIDM0NSwgICA5MywgLTI1OCwgLTM1N30sIHsgIDY5NiwgIDY0NCwgLTY5MywgIC0yOH0sCit7ICA0NDgsICA0OTMsIC0yNzMsICAxOTN9LCB7ICA1MjcsICA1NDYsIC0yNDMsIC01MTN9LCB7ICAzODQsIC0xMzYsICAyNzMsIC0zNTN9LAoreyAgNTEyLCAtMTQyLCAgNTM3LCAtMTk4fSwgeyAgOTQxLCAgNzUwLCAgIDgzLCAgMjQ4fSwgeyAgNTc4LCAgODYxLCAgLTU2LCAgNTkyfSwKK3sgIDg0MiwgICA0NCwgIDg5MiwgICAyNH0sIHsgICAzMywgIDg5MCwgIC0xNiwgIDk4Mn0sIHsgIDgzMSwgMTM5OCwgMTUzNSwgMTg5OH0sCit7IDE3MTYsIDEzNzYsIDE5NDgsIDE0NjV9Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBsc2ZfNV81WzY0XVs0XSA9IHsKK3stMTAwMiwgLTkyOSwtMTA5NiwtMTIwM30sIHsgLTY0MSwgLTkzMSwgLTYwNCwgLTk2MX0sIHsgLTc3OSwgLTY3MywgLTgzNSwgLTc4OH0sCit7IC00MTYsIC02NjQsIC00NTgsIC03NjZ9LCB7IC02NTIsIC01MjEsIC02NjIsIC00OTV9LCB7LTEwMjMsIC01MDksLTEwMjMsIC00Mjh9LAoreyAtNDQ0LCAtNTUyLCAtMzY4LCAtNDQ5fSwgeyAtNDc5LCAtMjExLC0xMDU0LCAtOTAzfSwgeyAtMzE2LCAtMjQ5LCAtNTY5LCAtNTkxfSwKK3sgLTU2OSwgLTI3NSwgLTU0MSwgLTE5MX0sIHsgLTcxNiwgLTE4OCwgLTg0MiwgLTI2NH0sIHsgLTMzMywgLTI0OCwgLTMxOCwgLTIyOH0sCit7IC0yNzUsICAgIDEsIC01NjcsIC0yMjh9LCB7IC0xMTUsIC0yMjEsIC0yMzgsIC0zNzR9LCB7IC0xOTcsIC01MDcsIC0yMjIsIC01Nzl9LAoreyAtMjU4LCAtNDMyLCAgLTYxLCAtMjQ0fSwgeyAtMzQ1LCAgICAyLCAtMzM4LCAgIDM5fSwgeyAtMjE1LCAtMTY5LCAgLTU4LCAgICAwfSwKK3sgIC01NiwgICAtNiwgLTIwMywgLTEzMX0sIHsgICAgMSwgLTE4NiwgICAtNSwgLTIxMX0sIHsgICAgNiwgLTM4MCwgICAxMSwgLTQxOH0sCit7IC0xMTYsICAxMzEsIC0xMzQsICAxMTN9LCB7ICAgODksICAgLTQsICAgNzEsICAgLTJ9LCB7ICAtMTksIC0xOTIsICAyNjIsICAgMjR9LAoreyAgMTg5LCAgMTUxLCAtMTMzLCAtMTA5fSwgeyAgMTg2LCAtMTUzLCAgMTY2LCAtMjE5fSwgeyAgIDM3LCAgMTM5LCAgMTkzLCAgMTcxfSwKK3sgIDMzNywgIDEyNCwgIDE1OCwgIC02MX0sIHsgIDE0MSwgIDIyNiwgIC0xMywgIDE5MH0sIHsgIDIzMSwgICAzNCwgIDM1NCwgIDEwOX0sCit7ICAzMTYsICAyMDEsICAyNDQsICAxNjR9LCB7ICAzMzAsICAtODUsICAzOTAsICAtODR9LCB7ICAyNTQsICAzMjcsICAyNTcsICAzMzV9LAoreyAgNDkxLCAgMTQ3LCAgNDc2LCAgMTA1fSwgeyAgIDU0LCAgIDc3LCAgNDM3LCAgMzcwfSwgeyAgNDIxLCAgMzE0LCAgNDQ5LCAgMzQyfSwKK3sgIDMyOSwgIDEyNiwgIDY3MywgIDI5Mn0sIHsgIDU3MSwgIDM4OCwgIDI0MywgIDE5M30sIHsgIDY1MywgIDMyMCwgIDYyMSwgIDI4MH0sCit7ICAxOTQsICAzODAsICA1MTcsICA1ODF9LCB7ICAgNDUsICAzMjMsICAxMTEsICA0MjJ9LCB7ICA0ODksICAzOTUsICA3MzQsICA1MzR9LAoreyAgNjIyLCAgNTQ2LCAgNDg2LCAgNTAyfSwgeyAgMzE4LCAgNTcyLCAgMTg5LCAgNTUwfSwgeyAgMzg1LCAgNDIyLCAtMTU3LCAgMTUzfSwKK3sgLTEyNSwgIDM4MiwgLTE5NywgIDM4Nn0sIHsgLTI2MywgIDMzNCwgIDIyOCwgIDY5N30sIHsgLTE4OCwgICAgMSwgICA1MSwgIDI5N30sCit7IC01MDcsICAyMTMsIC0zNzYsICAzOTd9LCB7ICAtMjQsICAyNTUsIC01NDcsICAgODl9LCB7IC01MDIsICAtOTQsICAzODcsICAxNzl9LAoreyAtNjIwLCAgIDY4LCAtNjg0LCAgMTEyfSwgeyAtNjQyLCAtMzUwLCAtMjYwLCAgMTcyfSwgeyAtNDM4LCAtMzI0LCAgMjY0LCAgNjQ4fSwKK3sgLTk2NCwgICAtNCwtMTEyMSwgICAgN30sIHsgLTEzNCwgIDEzNCwtMTEzMywgLTMwNn0sIHsgIDE0MywgICA5NiwgLTQyMCwgLTQ5N30sCit7LTEyMjEsIC0zNTAsLTE1MjcsIC02ODV9LCB7IC0xNjEsICAgNzIsICA4NzMsICA2OTF9LCB7ICA3MzIsICAyODMsICA5MjEsICAzNTN9LAoreyAgMzM0LCAgNDc1LCAxMDk1LCAgODIxfSwgeyAgODY0LCAgNTI0LCAgODQzLCAgNDk3fSwgeyAgNzE0LCAgNzExLCAgNzg4LCAgNzUwfSwKK3sgMTA3NiwgIDcxNCwgMTIwNCwgIDc1M30KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBsc2ZfM19tZWFuW0xQX0ZJTFRFUl9PUkRFUl0gPSB7CisgICAgIDM3Ny40NDEsICA1NTQuNjg4LCAgOTIyLjM2MywgMTMzOS44NCwgMTcwMi4xNSwKKyAgICAyMDQ2LjM5MCwgMjQ1Mi44ODAsIDI3NDEuNDYwLCAzMTE2LjcwLCAzMzQ4LjE0Cit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgbHNmXzVfbWVhbltMUF9GSUxURVJfT1JERVJdID0geworICAgICAzMzcuODkxLCAgNTA3LjA4MCwgIDgzNC45NjEsIDEyNDcuMDcsIDE2NDYuMDAsCisgICAgMTk4Mi45MTAsIDI0MDcuOTYwLCAyNzA4LjAxMCwgMzEwNC4wMCwgMzM0NC45NworfTsKKworLyoqIFByZWRpY3Rpb24gZmFjdG9yIHRhYmxlIGZvciBtb2RlcyBvdGhlciB0aGFuIDEyLjJrYml0L3MgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBwcmVkX2ZhY1tMUF9GSUxURVJfT1JERVJdID0geworICAgIDAuMjkxNjI2LCAwLjMyODY0NCwgMC4zODM2MzYsIDAuNDA1NjQwLCAwLjQzODg3MywKKyAgICAwLjM1NTU2MCwgMC4zMjMxMjAsIDAuMjk4MDY1LCAwLjI2MjIzOCwgMC4xOTc4NzYsCit9OworCisvLyBmaXhlZCB0YWJsZXMKKworLyoqCisgKiBudW1iZXIgb2YgcHVsc2VzIHBlciBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHB1bHNlc19uYl9wZXJfbW9kZVtdID0gezIsIDIsIDIsIDMsIDQsIDQsIDgsIDEwfTsKKworLyoqIHRyYWNrIHN0YXJ0IHBvc2l0aW9ucyBmb3IgYWxnZWJyYWljIGNvZGUgYm9vayByb3V0aW5lcyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdHJhY2tfcG9zaXRpb25bMTZdID0geworICAgIDAsIDIsIDAsIDMsIDAsIDIsIDAsIDMsIDEsIDMsIDIsIDQsIDEsIDQsIDEsIDQKK307CisKKy8qKiAzLWJpdCBHcmF5IGNvZGUgdG8gYmluYXJ5IGxvb2t1cCB0YWJsZSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ3JheV9kZWNvZGVbOF0gPSB7IDAsIDUsIDE1LCAxMCwgMjUsIDMwLCAyMCwgMzUgfTsKKworCisvLyBnYWluIHRhYmxlcworCisvKiogc2NhbGFyIHF1YW50aXplZCBwaXRjaCBnYWluIHRhYmxlIGZvciA3Ljk1IGFuZCAxMi4yIGticHMgbW9kZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBxdWFfZ2Fpbl9waXRbMTZdID0geworICAgICAwLCAgMzI3NywgIDY1NTYsICA4MTkyLCAgOTgzMCwgMTE0NjksIDEyMjg4LCAxMzEwNywKKyAxMzkyNiwgMTQ3NDYsIDE1NTY1LCAxNjM4NCwgMTcyMDMsIDE4MDIyLCAxODg0MiwgMTk2NjEKK307CisKKy8qKiBzY2FsYXIgcXVhbnRpemVkIGZpeGVkIGdhaW4gdGFibGUgZm9yIDcuOTUgYW5kIDEyLjIga2JwcyBtb2RlcyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IHF1YV9nYWluX2NvZGVbMzJdID0geworICAgMTU5LCAgIDIwNiwgICAyNjgsICAgMzQ5LCAgIDQxOSwgICA0ODIsICAgNTU0LCAgIDYzNywKKyAgIDczMywgICA4NDIsICAgOTY5LCAgMTExNCwgIDEyODEsICAxNDczLCAgMTY5NCwgIDE5NDgsCisgIDIyNDEsICAyNTc3LCAgMjk2MywgIDM0MDgsICAzOTE5LCAgNDUwNywgIDUxODMsICA1OTYwLAorICA2ODU1LCAgNzg4MywgIDkwNjUsIDEwNDI1LCAxMjUxMCwgMTYyNjMsIDIxMTQyLCAyNzQ4NQorfTsKKworLyoqIGRlc2lyZWQgbWVhbiBpbm5vdmF0aW9uIGVuZXJneSwgaW5kZXhlZCBieSBhY3RpdmUgbW9kZSAqLworc3RhdGljIGNvbnN0IGZsb2F0IGVuZXJneV9tZWFuWzhdID0geworICAgIDMzLjAsIDMzLjAsIDMzLjAsIDI4Ljc1LCAzMC4wLCAzNi4wLCAzMy4wLCAzNi4wCit9OworCisvKiogNC10YXAgbW92aW5nIGF2ZXJhZ2UgcHJlZGljdGlvbiBjb2VmZmljaWVudHMgaW4gcmV2ZXJzZSBvcmRlciAqLworc3RhdGljIGNvbnN0IGZsb2F0IGVuZXJneV9wcmVkX2ZhY1s0XSA9IHsgMC4xOSwgMC4zNCwgMC41OCwgMC42OCB9OworCisvKiogZ2FpbiB0YWJsZSBmb3IgNC43NSBrYnBzIG1vZGUKKyAqCisgKiBmaXJzdCBpbmRleCBoYXMgZXZlbi9vZGQgaW5kZXhlcyBmb3Igc3ViZnJhbWVzIDAsMi8xLDMKKyAqIHNlY29uZCBpbmRleCBpcyB7cGl0Y2hfZ2FpbiwgZml4ZWRfZ2Fpbl9mYWN0b3J9ICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgZ2FpbnNfTU9ERV80azc1WzUxMl1bMl0gPSB7Cit7ICA4MTIsICAxMjh9LCB7ICA1NDIsICAxNDB9LCB7IDI4NzMsIDExMzV9LCB7IDIyNjYsIDM0MDJ9LCB7IDIwNjcsICA1NjN9LAorezEyNjc3LCAgNjQ3fSwgeyA0MTMyLCAxNzk4fSwgeyA1NjAxLCA1Mjg1fSwgeyA3Njg5LCAgMzc0fSwgeyAzNzM1LCAgNDQxfSwKK3sxMDkxMiwgMjYzOH0sIHsxMTgwNywgMjQ5NH0sIHsyMDQ5MCwgIDc5N30sIHsgNTIxOCwgIDY3NX0sIHsgNjcyNCwgODM1NH0sCit7IDUyODIsIDE2OTZ9LCB7IDE0ODgsICA0Mjh9LCB7IDU4ODIsICA0NTJ9LCB7IDUzMzIsIDQwNzJ9LCB7IDM1ODMsIDEyNjh9LAoreyAyNDY5LCAgOTAxfSwgezE1ODk0LCAxMDA1fSwgezE0OTgyLCAzMjcxfSwgezEwMzMxLCA0ODU4fSwgeyAzNjM1LCAyMDIxfSwKK3sgMjU5NiwgIDgzNX0sIHsxMjM2MCwgNDg5Mn0sIHsxMjIwNiwgMTcwNH0sIHsxMzQzMiwgMTYwNH0sIHsgOTExOCwgMjM0MX0sCit7IDM5NjgsIDE1Mzh9LCB7IDU0NzksIDk5MzZ9LCB7IDM3OTUsICA0MTd9LCB7IDEzNTksICA0MTR9LCB7IDM2NDAsIDE1Njl9LAoreyA3OTk1LCAzNTQxfSwgezExNDA1LCAgNjQ1fSwgeyA4NTUyLCAgNjM1fSwgeyA0MDU2LCAxMzc3fSwgezE2NjA4LCA2MTI0fSwKK3sxMTQyMCwgIDcwMH0sIHsgMjAwNywgIDYwN30sIHsxMjQxNSwgMTU3OH0sIHsxMTExOSwgNDY1NH0sIHsxMzY4MCwgMTcwOH0sCit7MTE5OTAsIDEyMjl9LCB7IDc5OTYsIDcyOTd9LCB7MTMyMzEsIDU3MTV9LCB7IDI0MjgsIDExNTl9LCB7IDIwNzMsIDE5NDF9LAoreyA2MjE4LCA2MTIxfSwgeyAzNTQ2LCAxODA0fSwgeyA4OTI1LCAxODAyfSwgeyA4Njc5LCAxNTgwfSwgezEzOTM1LCAzNTc2fSwKK3sxMzMxMywgNjIzN30sIHsgNjE0MiwgMTEzMH0sIHsgNTk5NCwgMTczNH0sIHsxNDE0MSwgNDY2Mn0sIHsxMTI3MSwgMzMyMX0sCit7MTIyMjYsIDE1NTF9LCB7MTM5MzEsIDMwMTV9LCB7IDUwODEsMTA0NjR9LCB7IDk0NDQsIDY3MDZ9LCB7IDE2ODksICA2ODN9LAoreyAxNDM2LCAxMzA2fSwgeyA3MjEyLCAzOTMzfSwgeyA0MDgyLCAyNzEzfSwgeyA3NzkzLCAgNzA0fSwgezE1MDcwLCAgODAyfSwKK3sgNjI5OSwgNTIxMn0sIHsgNDMzNywgNTM1N30sIHsgNjY3NiwgIDU0MX0sIHsgNjA2MiwgIDYyNn0sIHsxMzY1MSwgMzcwMH0sCit7MTE0OTgsIDI0MDh9LCB7MTYxNTYsICA3MTZ9LCB7MTIxNzcsICA3NTF9LCB7IDgwNjUsMTE0ODl9LCB7IDYzMTQsIDIyNTZ9LAoreyA0NDY2LCAgNDk2fSwgeyA3MjkzLCAgNTIzfSwgezEwMjEzLCAzODMzfSwgeyA4Mzk0LCAzMDM3fSwgeyA4NDAzLCAgOTY2fSwKK3sxNDIyOCwgMTg4MH0sIHsgODcwMywgNTQwOX0sIHsxNjM5NSwgNDg2M30sIHsgNzQyMCwgMTk3OX0sIHsgNjA4OSwgMTIzMH0sCit7IDkzNzEsIDQzOTh9LCB7MTQ1NTgsIDMzNjN9LCB7MTM1NTksIDI4NzN9LCB7MTMxNjMsIDE0NjV9LCB7IDU1MzQsIDE2Nzh9LAorezEzMTM4LDE0NzcxfSwgeyA3MzM4LCAgNjAwfSwgeyAxMzE4LCAgNTQ4fSwgeyA0MjUyLCAzNTM5fSwgezEwMDQ0LCAyMzY0fSwKK3sxMDU4NywgIDYyMn0sIHsxMzA4OCwgIDY2OX0sIHsxNDEyNiwgMzUyNn0sIHsgNTAzOSwgOTc4NH0sIHsxNTMzOCwgIDYxOX0sCit7IDMxMTUsICA1OTB9LCB7MTY0NDIsIDMwMTN9LCB7MTU1NDIsIDQxNjh9LCB7MTU1MzcsIDE2MTF9LCB7MTU0MDUsIDEyMjh9LAorezE2MDIzLCA5Mjk5fSwgeyA3NTM0LCA0OTc2fSwgeyAxOTkwLCAxMjEzfSwgezExNDQ3LCAxMTU3fSwgezEyNTEyLCA1NTE5fSwKK3sgOTQ3NSwgMjY0NH0sIHsgNzcxNiwgMjAzNH0sIHsxMzI4MCwgMjIzOX0sIHsxNjAxMSwgNTA5M30sIHsgODA2NiwgNjc2MX0sCit7MTAwODMsIDE0MTN9LCB7IDUwMDIsIDIzNDd9LCB7MTI1MjMsIDU5NzV9LCB7MTUxMjYsIDI4OTl9LCB7MTgyNjQsIDIyODl9LAorezE1ODI3LCAyNTI3fSwgezE2MjY1LDEwMjU0fSwgezE0NjUxLDExMzE5fSwgeyAxNzk3LCAgMzM3fSwgeyAzMTE1LCAgMzk3fSwKK3sgMzUxMCwgMjkyOH0sIHsgNDU5MiwgMjY3MH0sIHsgNzUxOSwgIDYyOH0sIHsxMTQxNSwgIDY1Nn0sIHsgNTk0NiwgMjQzNX0sCit7IDY1NDQsIDczNjd9LCB7IDgyMzgsICA4Mjl9LCB7IDQwMDAsICA4NjN9LCB7MTAwMzIsIDI0OTJ9LCB7MTYwNTcsIDM1NTF9LAorezE4MjA0LCAxMDU0fSwgeyA2MTAzLCAxNDU0fSwgeyA1ODg0LCA3OTAwfSwgezE4NzUyLCAzNDY4fSwgeyAxODY0LCAgNTQ0fSwKK3sgOTE5OCwgIDY4M30sIHsxMTYyMywgNDE2MH0sIHsgNDU5NCwgMTY0NH0sIHsgMzE1OCwgMTE1N30sIHsxNTk1MywgMjU2MH0sCit7MTIzNDksIDM3MzN9LCB7MTc0MjAsIDUyNjB9LCB7IDYxMDYsIDIwMDR9LCB7IDI5MTcsIDE3NDJ9LCB7MTY0NjcsIDUyNTd9LAorezE2Nzg3LCAxNjgwfSwgezE3MjA1LCAxNzU5fSwgeyA0NzczLCAzMjMxfSwgeyA3Mzg2LCA2MDM1fSwgezE0MzQyLDEwMDEyfSwKK3sgNDAzNSwgIDQ0Mn0sIHsgNDE5NCwgIDQ1OH0sIHsgOTIxNCwgMjI0Mn0sIHsgNzQyNywgNDIxN30sIHsxMjg2MCwgIDgwMX0sCit7MTExODYsICA4MjV9LCB7MTI2NDgsIDIwODR9LCB7MTI5NTYsIDY1NTR9LCB7IDk1MDUsICA5OTZ9LCB7IDY2MjksICA5ODV9LAorezEwNTM3LCAyNTAyfSwgezE1Mjg5LCA1MDA2fSwgezEyNjAyLCAyMDU1fSwgezE1NDg0LCAxNjUzfSwgezE2MTk0LCA2OTIxfSwKK3sxNDIzMSwgNTc5MH0sIHsgMjYyNiwgIDgyOH0sIHsgNTYxNSwgMTY4Nn0sIHsxMzY2MywgNTc3OH0sIHsgMzY2OCwgMTU1NH0sCit7MTEzMTMsIDI2MzN9LCB7IDk3NzAsIDE0NTl9LCB7MTQwMDMsIDQ3MzN9LCB7MTU4OTcsIDYyOTF9LCB7IDYyNzgsIDE4NzB9LAoreyA3OTEwLCAyMjg1fSwgezE2OTc4LCA0NTcxfSwgezE2NTc2LCAzODQ5fSwgezE1MjQ4LCAyMzExfSwgezE2MDIzLCAzMjQ0fSwKK3sxNDQ1OSwxNzgwOH0sIHsxMTg0NywgMjc2M30sIHsgMTk4MSwgMTQwN30sIHsgMTQwMCwgIDg3Nn0sIHsgNDMzNSwgMzU0N30sCit7IDQzOTEsIDQyMTB9LCB7IDU0MDUsICA2ODB9LCB7MTc0NjEsICA3ODF9LCB7IDY1MDEsIDUxMTh9LCB7IDgwOTEsIDc2Nzd9LAoreyA3MzU1LCAgNzk0fSwgeyA4MzMzLCAxMTgyfSwgezE1MDQxLCAzMTYwfSwgezE0OTI4LCAzMDM5fSwgezIwNDIxLCAgODgwfSwKK3sxNDU0NSwgIDg1Mn0sIHsxMjMzNywxNDcwOH0sIHsgNjkwNCwgMTkyMH0sIHsgNDIyNSwgIDkzM30sIHsgODIxOCwgMTA4N30sCit7MTA2NTksIDQwODR9LCB7MTAwODIsIDQ1MzN9LCB7IDI3MzUsICA4NDB9LCB7MjA2NTcsIDEwODF9LCB7MTY3MTEsIDU5NjZ9LAorezE1ODczLCA0NTc4fSwgezEwODcxLCAyNTc0fSwgeyAzNzczLCAxMTY2fSwgezE0NTE5LCA0MDQ0fSwgezIwNjk5LCAyNjI3fSwKK3sxNTIxOSwgMjczNH0sIHsxNTI3NCwgMjE4Nn0sIHsgNjI1NywgMzIyNn0sIHsxMzEyNSwxOTQ4MH0sIHsgNzE5NiwgIDkzMH0sCit7IDI0NjIsIDE2MTh9LCB7IDQ1MTUsIDMwOTJ9LCB7MTM4NTIsIDQyNzd9LCB7MTA0NjAsICA4MzN9LCB7MTczMzksICA4MTB9LAorezE2ODkxLCAyMjg5fSwgezE1NTQ2LCA4MjE3fSwgezEzNjAzLCAxNjg0fSwgeyAzMTk3LCAxODM0fSwgezE1OTQ4LCAyODIwfSwKK3sxNTgxMiwgNTMyN30sIHsxNzAwNiwgMjQzOH0sIHsxNjc4OCwgMTMyNn0sIHsxNTY3MSwgODE1Nn0sIHsxMTcyNiwgODU1Nn0sCit7IDM3NjIsIDIwNTN9LCB7IDk1NjMsIDEzMTd9LCB7MTM1NjEsIDY3OTB9LCB7MTIyMjcsIDE5MzZ9LCB7IDgxODAsIDM1NTB9LAorezEzMjg3LCAxNzc4fSwgezE2Mjk5LCA2NTk5fSwgezE2MjkxLCA3NzU4fSwgeyA4NTIxLCAyNTUxfSwgeyA3MjI1LCAyNjQ1fSwKK3sxODI2OSwgNzQ4OX0sIHsxNjg4NSwgMjI0OH0sIHsxNzg4MiwgMjg4NH0sIHsxNzI2NSwgMzMyOH0sIHsgOTQxNywyMDE2Mn0sCit7MTEwNDIsIDgzMjB9LCB7IDEyODYsICA2MjB9LCB7IDE0MzEsICA1ODN9LCB7IDU5OTMsIDIyODl9LCB7IDM5NzgsIDM2MjZ9LAoreyA1MTQ0LCAgNzUyfSwgezEzNDA5LCAgODMwfSwgeyA1NTUzLCAyODYwfSwgezExNzY0LCA1OTA4fSwgezEwNzM3LCAgNTYwfSwKK3sgNTQ0NiwgIDU2NH0sIHsxMzMyMSwgMzAwOH0sIHsxMTk0NiwgMzY4M30sIHsxOTg4NywgIDc5OH0sIHsgOTgyNSwgIDcyOH0sCit7MTM2NjMsIDg3NDh9LCB7IDczOTEsIDMwNTN9LCB7IDI1MTUsICA3Nzh9LCB7IDYwNTAsICA4MzN9LCB7IDY0NjksIDUwNzR9LAoreyA4MzA1LCAyNDYzfSwgeyA2MTQxLCAxODY1fSwgezE1MzA4LCAxMjYyfSwgezE0NDA4LCA0NTQ3fSwgezEzNjYzLCA0NTE1fSwKK3sgMzEzNywgMjk4M30sIHsgMjQ3OSwgMTI1OX0sIHsxNTA4OCwgNDY0N30sIHsxNTM4MiwgMjYwN30sIHsxNDQ5MiwgMjM5Mn0sCit7MTI0NjIsIDI1Mzd9LCB7IDc1MzksIDI5NDl9LCB7MTI5MDksMTIwNjB9LCB7IDU0NjgsICA2ODR9LCB7IDMxNDEsICA3MjJ9LAoreyA1MDgxLCAxMjc0fSwgezEyNzMyLCA0MjAwfSwgezE1MzAyLCAgNjgxfSwgeyA3ODE5LCAgNTkyfSwgeyA2NTM0LCAyMDIxfSwKK3sxNjQ3OCwgODczN30sIHsxMzM2NCwgIDg4Mn0sIHsgNTM5NywgIDg5OX0sIHsxNDY1NiwgMjE3OH0sIHsxNDc0MSwgNDIyN30sCit7MTQyNzAsIDEyOTh9LCB7MTM5MjksIDIwMjl9LCB7MTU0NzcsIDc0ODJ9LCB7MTU4MTUsIDQ1NzJ9LCB7IDI1MjEsIDIwMTN9LAoreyA1MDYyLCAxODA0fSwgeyA1MTU5LCA2NTgyfSwgeyA3MTMwLCAzNTk3fSwgezEwOTIwLCAxNjExfSwgezExNzI5LCAxNzA4fSwKK3sxNjkwMywgMzQ1NX0sIHsxNjI2OCwgNjY0MH0sIHsgOTMwNiwgMTAwN30sIHsgOTM2OSwgMjEwNn0sIHsxOTE4MiwgNTAzN30sCit7MTI0NDEsIDQyNjl9LCB7MTU5MTksIDEzMzJ9LCB7MTUzNTcsIDM1MTJ9LCB7MTE4OTgsMTQxNDF9LCB7MTYxMDEsIDY4NTR9LAoreyAyMDEwLCAgNzM3fSwgeyAzNzc5LCAgODYxfSwgezExNDU0LCAyODgwfSwgeyAzNTY0LCAzNTQwfSwgeyA5MDU3LCAxMjQxfSwKK3sxMjM5MSwgIDg5Nn0sIHsgODU0NiwgNDYyOX0sIHsxMTU2MSwgNTc3Nn0sIHsgODEyOSwgIDU4OX0sIHsgODIxOCwgIDU4OH0sCit7MTg3MjgsIDM3NTV9LCB7MTI5NzMsIDMxNDl9LCB7MTU3MjksICA3NTh9LCB7MTY2MzQsICA3NTR9LCB7MTUyMjIsMTExMzh9LAorezE1ODcxLCAyMjA4fSwgeyA0NjczLCAgNjEwfSwgezEwMjE4LCAgNjc4fSwgezE1MjU3LCA0MTQ2fSwgeyA1NzI5LCAzMzI3fSwKK3sgODM3NywgMTY3MH0sIHsxOTg2MiwgMjMyMX0sIHsxNTQ1MCwgNTUxMX0sIHsxNDA1NCwgNTQ4MX0sIHsgNTcyOCwgMjg4OH0sCit7IDc1ODAsIDEzNDZ9LCB7MTQzODQsIDUzMjV9LCB7MTYyMzYsIDM5NTB9LCB7MTUxMTgsIDM3NDR9LCB7MTUzMDYsIDE0MzV9LAorezE0NTk3LCA0MDcwfSwgezEyMzAxLDE1Njk2fSwgeyA3NjE3LCAxNjk5fSwgeyAyMTcwLCAgODg0fSwgeyA0NDU5LCA0NTY3fSwKK3sxODA5NCwgMzMwNn0sIHsxMjc0MiwgIDgxNX0sIHsxNDkyNiwgIDkwN30sIHsxNTAxNiwgNDI4MX0sIHsxNTUxOCwgODM2OH0sCit7MTc5OTQsIDEwODd9LCB7IDIzNTgsICA4NjV9LCB7MTYyODEsIDM3ODd9LCB7MTU2NzksIDQ1OTZ9LCB7MTYzNTYsIDE1MzR9LAorezE2NTg0LCAyMjEwfSwgezE2ODMzLCA5Njk3fSwgezE1OTI5LCA0NTEzfSwgeyAzMjc3LCAxMDg1fSwgeyA5NjQzLCAyMTg3fSwKK3sxMTk3MywgNjA2OH0sIHsgOTE5OSwgNDQ2Mn0sIHsgODk1NSwgMTYyOX0sIHsxMDI4OSwgMzA2Mn0sIHsxNjQ4MSwgNTE1NX0sCit7MTU0NjYsIDcwNjZ9LCB7MTM2NzgsIDI1NDN9LCB7IDUyNzMsIDIyNzd9LCB7MTY3NDYsIDYyMTN9LCB7MTY2NTUsIDM0MDh9LAorezIwMzA0LCAzMzYzfSwgezE4Njg4LCAxOTg1fSwgezE0MTcyLDEyODY3fSwgezE1MTU0LDE1NzAzfSwgeyA0NDczLCAxMDIwfSwKK3sgMTY4MSwgIDg4Nn0sIHsgNDMxMSwgNDMwMX0sIHsgODk1MiwgMzY1N30sIHsgNTg5MywgMTE0N30sIHsxMTY0NywgMTQ1Mn0sCit7MTU4ODYsIDIyMjd9LCB7IDQ1ODIsIDY2NDR9LCB7IDY5MjksIDEyMDV9LCB7IDYyMjAsICA3OTl9LCB7MTI0MTUsIDM0MDl9LAorezE1OTY4LCAzODc3fSwgezE5ODU5LCAyMTA5fSwgeyA5Njg5LCAyMTQxfSwgezE0NzQyLCA4ODMwfSwgezE0NDgwLCAyNTk5fSwKK3sgMTgxNywgMTIzOH0sIHsgNzc3MSwgIDgxM30sIHsxOTA3OSwgNDQxMH0sIHsgNTU1NCwgMjA2NH0sIHsgMzY4NywgMjg0NH0sCit7MTc0MzUsIDIyNTZ9LCB7MTY2OTcsIDQ0ODZ9LCB7MTYxOTksIDUzODh9LCB7IDgwMjgsIDI3NjN9LCB7IDM0MDUsIDIxMTl9LAorezE3NDI2LCA1NDc3fSwgezEzNjk4LCAyNzg2fSwgezE5ODc5LCAyNzIwfSwgeyA5MDk4LCAzODgwfSwgezE4MTcyLCA0ODMzfSwKK3sxNzMzNiwxMjIwN30sIHsgNTExNiwgIDk5Nn0sIHsgNDkzNSwgIDk4OH0sIHsgOTg4OCwgMzA4MX0sIHsgNjAxNCwgNTM3MX0sCit7MTU4ODEsIDE2Njd9LCB7IDg0MDUsIDExODN9LCB7MTUwODcsIDIzNjZ9LCB7MTk3NzcsIDcwMDJ9LCB7MTE5NjMsIDE1NjJ9LAoreyA3Mjc5LCAxMTI4fSwgezE2ODU5LCAxNTMyfSwgezE1NzYyLCA1MzgxfSwgezE0NzA4LCAyMDY1fSwgezIwMTA1LCAyMTU1fSwKK3sxNzE1OCwgODI0NX0sIHsxNzkxMSwgNjMxOH0sIHsgNTQ2NywgMTUwNH0sIHsgNDEwMCwgMjU3NH0sIHsxNzQyMSwgNjgxMH0sCit7IDU2NzMsIDI4ODh9LCB7MTY2MzYsIDMzODJ9LCB7IDg5NzUsIDE4MzF9LCB7MjAxNTksIDQ3Mzd9LCB7MTk1NTAsIDcyOTR9LAoreyA2NjU4LCAyNzgxfSwgezExNDcyLCAzMzIxfSwgezE5Mzk3LCA1MDU0fSwgezE4ODc4LCA0NzIyfSwgezE2NDM5LCAyMzczfSwKK3syMDQzMCwgNDM4Nn0sIHsxMTM1MywyNjUyNn0sIHsxMTU5MywgMzA2OH0sIHsgMjg2NiwgMTU2Nn0sIHsgNTEwOCwgMTA3MH0sCit7IDk2MTQsIDQ5MTV9LCB7IDQ5MzksIDM1MzZ9LCB7IDc1NDEsICA4Nzh9LCB7MjA3MTcsICA4NTF9LCB7IDY5MzgsIDQzOTV9LAorezE2Nzk5LCA3NzMzfSwgezEwMTM3LCAxMDE5fSwgeyA5ODQ1LCAgOTY0fSwgezE1NDk0LCAzOTU1fSwgezE1NDU5LCAzNDMwfSwKK3sxODg2MywgIDk4Mn0sIHsyMDEyMCwgIDk2M30sIHsxNjg3NiwxMjg4N30sIHsxNDMzNCwgNDIwMH0sIHsgNjU5OSwgMTIyMH0sCit7IDkyMjIsICA4MTR9LCB7MTY5NDIsIDUxMzR9LCB7IDU2NjEsIDQ4OTh9LCB7IDU0ODgsIDE3OTh9LCB7MjAyNTgsIDM5NjJ9LAorezE3MDA1LCA2MTc4fSwgezE3OTI5LCA1OTI5fSwgeyA5MzY1LCAzNDIwfSwgeyA3NDc0LCAxOTcxfSwgezE5NTM3LCA1MTc3fSwKK3sxOTAwMywgMzAwNn0sIHsxNjQ1NCwgMzc4OH0sIHsxNjA3MCwgMjM2N30sIHsgODY2NCwgMjc0M30sIHsgOTQ0NSwyNjM1OH0sCit7MTA4NTYsIDEyODd9LCB7IDM1NTUsIDEwMDl9LCB7IDU2MDYsIDM2MjJ9LCB7MTk0NTMsIDU1MTJ9LCB7MTI0NTMsICA3OTd9LAorezIwNjM0LCAgOTExfSwgezE1NDI3LCAzMDY2fSwgezE3MDM3LDEwMjc1fSwgezE4ODgzLCAyNjMzfSwgeyAzOTEzLCAxMjY4fSwKK3sxOTUxOSwgMzM3MX0sIHsxODA1MiwgNTIzMH0sIHsxOTI5MSwgMTY3OH0sIHsxOTUwOCwgMzE3Mn0sIHsxODA3MiwxMDc1NH0sCit7MTY2MjUsIDY4NDV9LCB7IDMxMzQsIDIyOTh9LCB7MTA4NjksIDI0Mzd9LCB7MTU1ODAsIDY5MTN9LCB7MTI1OTcsIDMzODF9LAorezExMTE2LCAzMjk3fSwgezE2NzYyLCAyNDI0fSwgezE4ODUzLCA2NzE1fSwgezE3MTcxLCA5ODg3fSwgezEyNzQzLCAyNjA1fSwKK3sgODkzNywgMzE0MH0sIHsxOTAzMywgNzc2NH0sIHsxODM0NywgMzg4MH0sIHsyMDQ3NSwgMzY4Mn0sIHsxOTYwMiwgMzM4MH0sCit7MTMwNDQsMTkzNzN9LCB7MTA1MjYsMjMxMjR9Cit9OworCisvKiogZ2FpbiB0YWJsZSBmb3IgNi43MCwgNy40MCBhbmQgMTAuMiBrYnBzIG1vZGVzCisgKgorICogc2Vjb25kIGluZGV4IGlzIHtwaXRjaF9nYWluLCBmaXhlZF9nYWluX2ZhY3Rvcn0gKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBnYWluc19oaWdoWzEyOF1bMl0gPSB7Cit7ICA1NzcsICA2NjJ9LCB7ICA4MDYsIDE4MzZ9LCB7IDMxMDksIDEwNTJ9LCB7IDQxODEsIDEzODd9LCB7IDIzNzMsIDE0MjV9LAoreyAzMjQ4LCAxOTg1fSwgeyAxODI3LCAyMzIwfSwgeyAgOTQxLCAzMzE0fSwgeyAyMzUxLCAyOTc3fSwgeyAzNjE2LCAyNDIwfSwKK3sgMzQ1MSwgMzA5Nn0sIHsgMjk1NSwgNDMwMX0sIHsgMTg0OCwgNDUwMH0sIHsgMzg4NCwgNTQxNn0sIHsgMTE4NywgNzIxMH0sCit7IDMwODMsIDkwMDB9LCB7IDczODQsICA4ODN9LCB7IDU5NjIsIDE1MDZ9LCB7IDUxNTUsIDIxMzR9LCB7IDc5NDQsIDIwMDl9LAoreyA2NTA3LCAyMjUwfSwgeyA3NjcwLCAyNzUyfSwgeyA1OTUyLCAzMDE2fSwgeyA0ODk4LCAzNzY0fSwgeyA2OTg5LCAzNTg4fSwKK3sgODE3NCwgMzk3OH0sIHsgNjA2NCwgNDQwNH0sIHsgNzcwOSwgNTA4N30sIHsgNTUyMywgNjAyMX0sIHsgNzc2OSwgNzEyNn0sCit7IDYwNjAsIDc5Mzh9LCB7IDU1OTQsMTE0ODd9LCB7MTA1ODEsIDEzNTZ9LCB7IDkwNDksIDE1OTd9LCB7IDk3OTQsIDIwMzV9LAoreyA4OTQ2LCAyNDE1fSwgezEwMjk2LCAyNTg0fSwgeyA5NDA3LCAyNzM0fSwgeyA4NzAwLCAzMjE4fSwgeyA5NzU3LCAzMzk1fSwKK3sxMDE3NywgMzg5Mn0sIHsgOTE3MCwgNDUyOH0sIHsxMDE1MiwgNTAwNH0sIHsgOTExNCwgNTczNX0sIHsxMDUwMCwgNjI2Nn0sCit7MTAxMTAsIDc2MzF9LCB7IDg4NDQsIDg3Mjd9LCB7IDg5NTYsMTI0OTZ9LCB7MTI5MjQsICA5NzZ9LCB7MTE0MzUsIDE3NTV9LAorezEyMTM4LCAyMzI4fSwgezExMzg4LCAyMzY4fSwgezEwNzAwLCAzMDY0fSwgezEyMzMyLCAyODYxfSwgezExNzIyLCAzMzI3fSwKK3sxMTI3MCwgMzcwMH0sIHsxMDg2MSwgNDQxM30sIHsxMjA4MiwgNDUzM30sIHsxMTI4MywgNTIwNX0sIHsxMTk2MCwgNjMwNX0sCit7MTExNjcsIDc1MzR9LCB7MTIxMjgsIDgzMjl9LCB7MTA5NjksMTA3Nzd9LCB7MTAzMDAsMTczNzZ9LCB7MTM4OTksIDE2ODF9LAorezEyNTgwLCAyMDQ1fSwgezEzMjY1LCAyNDM5fSwgezE0MDMzLCAyOTg5fSwgezEzNDUyLCAzMDk4fSwgezEyMzk2LCAzNjU4fSwKK3sxMzUxMCwgMzc4MH0sIHsxMjg4MCwgNDI3Mn0sIHsxMzUzMywgNDg2MX0sIHsxMjY2NywgNTQ1N30sIHsxMzg1NCwgNjEwNn0sCit7MTMwMzEsIDY0ODN9LCB7MTM1NTcsIDc3MjF9LCB7MTI5NTcsIDkzMTF9LCB7MTM3MTQsMTE1NTF9LCB7MTI1OTEsMTUyMDZ9LAorezE1MTEzLCAxNTQwfSwgezE1MDcyLCAyMzMzfSwgezE0NTI3LCAyNTExfSwgezE0NjkyLCAzMTk5fSwgezE1MzgyLCAzNTYwfSwKK3sxNDEzMywgMzk2MH0sIHsxNTEwMiwgNDIzNn0sIHsxNDMzMiwgNDgyNH0sIHsxNDg0NiwgNTQ1MX0sIHsxNTMwNiwgNjA4M30sCit7MTQzMjksIDY4ODh9LCB7MTUwNjAsIDc2ODl9LCB7MTQ0MDYsIDk0MjZ9LCB7MTUzODcsIDk3NDF9LCB7MTQ4MjQsMTQyNzF9LAorezEzNjAwLDI0OTM5fSwgezE2Mzk2LCAxOTY5fSwgezE2ODE3LCAyODMyfSwgezE1NzEzLCAyODQzfSwgezE2MTA0LCAzMzM2fSwKK3sxNjM4NCwgMzk2M30sIHsxNjk0MCwgNDU3OX0sIHsxNTcxMSwgNDU5OX0sIHsxNjIyMiwgNTQ0OH0sIHsxNjgzMiwgNjM4Mn0sCit7MTU3NDUsIDcxNDF9LCB7MTYzMjYsIDc0Njl9LCB7MTY2MTEsIDg2MjR9LCB7MTcwMjgsMTA0MTh9LCB7MTU5MDUsMTE4MTd9LAorezE2ODc4LDE0NjkwfSwgezE2NTE1LDIwODcwfSwgezE4MTQyLCAyMDgzfSwgezE5NDAxLCAzMTc4fSwgezE3NTA4LCAzNDI2fSwKK3syMDA1NCwgNDAyN30sIHsxODA2OSwgNDI0OX0sIHsxODk1MiwgNTA2Nn0sIHsxNzcxMSwgNTQwMn0sIHsxOTgzNSwgNjE5Mn0sCit7MTc5NTAsIDcwMTR9LCB7MjEzMTgsIDc4Nzd9LCB7MTc5MTAsIDkyODl9LCB7MTkxNDQsIDkyOTB9LCB7MjA1MTcsMTEzODF9LAorezE4MDc1LDE0NDg1fSwgezE5OTk5LDE3ODgyfSwgezE4ODQyLDMyNzY0fQorfTsKKworLyoqIGdhaW4gdGFibGUgZm9yIDUuMTUgYW5kIDUuOTAga2JwcyBtb2RlcworICoKKyAqIHNlY29uZCBpbmRleCBpcyB7cGl0Y2hfZ2FpbiwgZml4ZWRfZ2Fpbl9mYWN0b3J9ICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgZ2FpbnNfbG93WzY0XVsyXSA9IHsKK3sxMDgxMywyODc1M30sIHsyMDQ4MCwgMjc4NX0sIHsxODg0MSwgNjU5NH0sIHsgNjIyNSwgNzQxM30sIHsxNzIwMywxMDQ0NH0sCit7MjE2MjYsIDEyNjl9LCB7MjExMzUsIDQ0MjN9LCB7MTEzMDQsIDE1NTZ9LCB7MTkwMDUsMTI4MjB9LCB7MTczNjcsIDI0OTh9LAorezE3ODU4LCA0ODMzfSwgeyA5OTk0LCAyNDk4fSwgezE3NTMwLCA3ODY0fSwgezE0MjU0LCAxODg0fSwgezE1ODkyLCAzMTUzfSwKK3sgNjcxNywgMTgwMn0sIHsxODE4NiwyMDE5M30sIHsxODAyMiwgMzAzMX0sIHsxNjcxMSwgNTg1N30sIHsgODg0NywgNDAxNH0sCit7MTU4OTIsIDg5NzB9LCB7MTgwMjIsIDEzOTJ9LCB7MTY3MTEsIDQwOTZ9LCB7IDgxOTIsICA2NTV9LCB7MTUyMzcsMTM5MjZ9LAorezE0MjU0LCAzMTEyfSwgezE0MDkwLCA0NjY5fSwgeyA1NDA2LCAyNzAzfSwgezEzNDM0LCA2NTUzfSwgezEyNDUxLCAgOTAxfSwKK3sxMjQ1MSwgMjY2Mn0sIHsgMzc2OCwgIDY1NX0sIHsxNDc0NSwyMzUxMX0sIHsxOTE2OSwgMjQ1N30sIHsyMDE1MiwgNTA3OX0sCit7IDY4ODEsIDQwOTZ9LCB7MjA0ODAsIDg1NjB9LCB7MTk2NjAsICA3Mzd9LCB7MTkwMDUsIDQyNTl9LCB7IDc4NjQsIDIwODh9LAorezExNDY4LDEyMjg4fSwgezE1ODkyLCAxNDc0fSwgezE1NzI4LCA0NjI4fSwgeyA5MTc1LCAxNDMzfSwgezE2MDU2LCA3MDA0fSwKK3sxNDgyNywgIDczN30sIHsxNTA3MywgMjI1Mn0sIHsgNTA3OSwgMTIyOH0sIHsxMzI3MSwxNzMyNn0sIHsxNjU0NywgMjMzNH0sCit7MTUwNzMsIDU4MTZ9LCB7IDM5MzIsIDM2ODZ9LCB7MTQyNTQsIDg2MDF9LCB7MTY4NzUsICA3Nzh9LCB7MTUwNzMsIDM4MDl9LAoreyA2MDYyLCAgNjE0fSwgeyA5MzM4LCA5MjU2fSwgezEzMjcxLCAxNzYxfSwgezEzMjcxLCAzNTIyfSwgeyAyNDU3LCAxOTY2fSwKK3sxMTQ2OCwgNTUyOX0sIHsxMDQ4NSwgIDczN30sIHsxMTYzMiwgMzE5NH0sIHsgMTQ3NCwgIDc3OH0KK307CisKKworLy8gcHJlLXByb2Nlc3NpbmcgdGFibGVzCisKKy8qKiBpbXB1bHNlIHJlc3BvbnNlIGZpbHRlciB0YWJsZXMgY29udmVydGVkIHRvIGZsb2F0IGZyb20gUTE1IGludDMyX3QKKyAqIHVzZWQgZm9yIGFudGktc3BhcnNlbmVzcyBwcm9jZXNzaW5nICovCitzdGF0aWMgY29uc3QgZmxvYXQgaXJfZmlsdGVyX3N0cm9uZ19NT0RFXzdrOTVbQU1SX1NVQkZSQU1FX1NJWkVdID0geworIDAuODE3MTY5LCAgMC4wMjQ0NDUsICAwLjA3NjQ0NywgLTAuMDIwODQ0LCAtMC4wNDIxNzUsICAwLjAxNzc2MSwgIDAuMDE4NDMzLAorLTAuMDM4ODc5LCAgMC4xMDcxNDcsIC0wLjE3OTg3MSwgIDAuMTM4MzY3LCAtMC4wMTUyMjgsIC0wLjA1OTIwNCwgIDAuMDkxODg4LAorLTAuMTU0MzU4LCAgMC4xNzEzMjYsIC0wLjA2MDczMCwgLTAuMDMyMzc5LCAtMC4wNDQ1MjUsICAwLjEzNTU1OSwgLTAuMDIxMzYyLAorLTAuMTYyODExLCAgMC4xNDA2NTYsICAwLjAxMzc5NCwgLTAuMDE3OTc1LCAtMC4xMDIyOTUsICAwLjA5MDExOCwgIDAuMDM4NjY2LAorLTAuMDM2OTg3LCAtMC4wNzkwNDEsICAwLjA1MjgyNiwgIDAuMTEyMDAwLCAtMC4xMzY1NjYsIC0wLjAyOTc1NSwgIDAuMTM0MDAzLAorLTAuMDc3NDIzLCAgMC4wMjg5NjEsIC0wLjA0MTU5NSwgLTAuMDI5ODc3LCAgMC4xNzQ5ODgsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgaXJfZmlsdGVyX3N0cm9uZ1tBTVJfU1VCRlJBTUVfU0laRV0gPSB7CisgMC40NDgzMDMsICAwLjM1MTUwMSwgIDAuMDM4Njk2LCAtMC4wODQyNTksIC0wLjE3MzA2NSwgIDAuMjI5MzA5LCAtMC4wMDEwNjgsCistMC4wODU2NjMsIC0wLjA5Mjc3MywgIDAuMTQ3MTg2LCAgMC4wOTAwODgsIC0wLjI1NzA4MCwgIDAuMTE1NTA5LCAgMC4wNDQ0MDMsCisgMC4wNjY0OTgsIC0wLjI2MzU4MCwgIDAuMjQ1Njk3LCAtMC4wNjQxNzgsIC0wLjA0NDM3MywgIDAuMDIzNzEyLCAgMC4wMzM4MTMsCistMC4wNzI3ODQsICAwLjA2ODc4NywgLTAuMDExMDc4LCAtMC4wMjA1NjksIC0wLjA2NDE3OCwgIDAuMTg0NTA5LCAtMC4xNzMzNzAsCisgMC4wMzI3MTUsICAwLjA5NTMwNiwgLTAuMTU0MzU4LCAgMC4xNjIxMDksIC0wLjA3MTA3NSwgLTAuMTEzNzcwLCAgMC4yMTEzMDQsCistMC4xMTg2ODMsICAwLjAyMDU5OSwgLTAuMDU0MTY5LCAgMC4wMDA4ODUsICAwLjMwOTYwMSwKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBpcl9maWx0ZXJfbWVkaXVtW0FNUl9TVUJGUkFNRV9TSVpFXSA9IHsKKyAwLjkyMzg4OSwgIDAuMTE2OTEzLCAtMC4xMjMxNjksICAwLjA5MDY5OCwgLTAuMDMxOTgyLCAtMC4wMzA1NzksICAwLjA3NTU5MiwKKy0wLjA5Mjg2NSwgIDAuMDg1OTA3LCAtMC4wNjgwODUsICAwLjA1MzQ5NywgLTAuMDQ5MTY0LCAgMC4wNTIzMDcsIC0wLjA1NDE2OSwKKyAwLjA0NzA4OSwgLTAuMDMwNzYyLCAgMC4wMTMwOTIsIC0wLjAwNTE1NywgIDAuMDE0NDA0LCAtMC4wMzg1NzQsICAwLjA2NjQwNiwKKy0wLjA4MjU4MSwgIDAuMDc2OTk2LCAtMC4wNDk0NjksICAwLjAxMDQ5OCwgIDAuMDI1MjA4LCAtMC4wNDY2NjEsICAwLjA1MjYxMiwKKy0wLjA1MDU2OCwgIDAuMDUxOTEwLCAtMC4wNjI5NTgsICAwLjA4MDY4OCwgLTAuMDkzMzg0LCAgMC4wODg0MDksIC0wLjA2MDM2NCwKKyAwLjAxNjk5OCwgIDAuMDIzODA0LCAtMC4wNDE3NzksICAwLjAyNTY5NiwgIDAuMDE5OTg5LAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0ICogY29uc3QgaXJfZmlsdGVyc19sb29rdXBbMl0gICAgICAgICAgID0geworICAgIGlyX2ZpbHRlcl9zdHJvbmcsICAgICAgICAgICBpcl9maWx0ZXJfbWVkaXVtCit9Oworc3RhdGljIGNvbnN0IGZsb2F0ICogY29uc3QgaXJfZmlsdGVyc19sb29rdXBfTU9ERV83azk1WzJdID0geworICAgIGlyX2ZpbHRlcl9zdHJvbmdfTU9ERV83azk1LCBpcl9maWx0ZXJfbWVkaXVtCit9OworCisvLyBIaWdoLXBhc3MgY29lZmZpY2llbnRzCisKK3N0YXRpYyBjb25zdCBmbG9hdCBoaWdocGFzc196ZXJvc1syXSA9IHsgLTIuMCwgMS4wIH07CitzdGF0aWMgY29uc3QgZmxvYXQgaGlnaHBhc3NfcG9sZXNbMl0gPSB7IC0xLjkzMzEwNTQ2OSwgMC45MzU5MTMwODUgfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBoaWdocGFzc19nYWluICAgICA9IDAuOTM5ODE5MzM1OworCisjZW5kaWYgLyogQVZDT0RFQ19BTVJOQkRBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYW1ybmJkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Ftcm5iZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkZGI2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Ftcm5iZGVjLmMKQEAgLTAsMCArMSwxMDk0IEBACisvKgorICogQU1SIG5hcnJvd2JhbmQgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgUm9iZXJ0IFN3YWluCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQ29saW4gTWNRdWlsbGFuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKworLyoqCisgKiBAZmlsZQorICogQU1SIG5hcnJvd2JhbmQgZGVjb2RlcgorICoKKyAqIFRoaXMgZGVjb2RlciB1c2VzIGZsb2F0cyBmb3Igc2ltcGxpY2l0eSBhbmQgc28gaXMgbm90IGJpdC1leGFjdC4gT25lCisgKiBkaWZmZXJlbmNlIGlzIHRoYXQgZGlmZmVyZW5jZXMgaW4gcGhhc2UgY2FuIGFjY3VtdWxhdGUuIFRoZSB0ZXN0IHNlcXVlbmNlcworICogaW4gM0dQUCBUUyAyNi4wNzQgY2FuIHN0aWxsIGJlIHVzZWZ1bC4KKyAqCisgKiAtIENvbXBhcmluZyB0aGlzIGZpbGUncyBvdXRwdXQgdG8gdGhlIG91dHB1dCBvZiB0aGUgcmVmIGRlY29kZXIgZ2l2ZXMgYQorICogICBQU05SIG9mIDMwIHRvIDgwLiBQbG90dGluZyB0aGUgb3V0cHV0IHNhbXBsZXMgc2hvd3MgYSBkaWZmZXJlbmNlIGluCisgKiAgIHBoYXNlIGluIHNvbWUgYXJlYXMuCisgKgorICogLSBDb21wYXJpbmcgYm90aCBkZWNvZGVycyBhZ2FpbnN0IHRoZWlyIGlucHV0LCB0aGlzIGRlY29kZXIgZ2l2ZXMgYSBzaW1pbGFyCisgKiAgIFBTTlIuIElmIHRoZSB0ZXN0IHNlcXVlbmNlIGhvbWluZyBmcmFtZXMgYXJlIHJlbW92ZWQgKHRoaXMgZGVjb2RlciBkb2VzCisgKiAgIG5vdCBkZXRlY3QgdGhlbSksIHRoZSBQU05SIGlzIGF0IGxlYXN0IGFzIGdvb2QgYXMgdGhlIHJlZmVyZW5jZSBvbiAxNDAKKyAqICAgb3V0IG9mIDE2OSB0ZXN0cy4KKyAqLworCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJjZWxwX21hdGguaCIKKyNpbmNsdWRlICJjZWxwX2ZpbHRlcnMuaCIKKyNpbmNsdWRlICJhY2VscF9maWx0ZXJzLmgiCisjaW5jbHVkZSAiYWNlbHBfdmVjdG9ycy5oIgorI2luY2x1ZGUgImFjZWxwX3BpdGNoX2RlbGF5LmgiCisjaW5jbHVkZSAibHNwLmgiCisjaW5jbHVkZSAiYW1yLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgImFtcm5iZGF0YS5oIgorCisjZGVmaW5lIEFNUl9CTE9DS19TSVpFICAgICAgICAgICAgICAxNjAgICAvLy88IHNhbXBsZXMgcGVyIGZyYW1lCisjZGVmaW5lIEFNUl9TQU1QTEVfQk9VTkQgICAgICAgIDMyNzY4LjAgICAvLy88IHRocmVzaG9sZCBmb3Igc3ludGhlc2lzIG92ZXJmbG93CisKKy8qKgorICogU2NhbGUgZnJvbSBjb25zdHJ1Y3RlZCBzcGVlY2ggdG8gWy0xLDFdCisgKgorICogQU1SIGlzIGRlc2lnbmVkIHRvIHByb2R1Y2UgMTYtYml0IFBDTSBzYW1wbGVzICgzR1BQIFRTIDI2LjA5MCA0LjIpIGJ1dAorICogdXBzY2FsZXMgYnkgdHdvIChzZWN0aW9uIDYuMi4yKS4KKyAqCisgKiBGdW5kYW1lbnRhbGx5LCB0aGlzIHNjYWxlIGlzIGRldGVybWluZWQgYnkgZW5lcmd5X21lYW4gdGhyb3VnaAorICogdGhlIGZpeGVkIHZlY3RvciBjb250cmlidXRpb24gdG8gdGhlIGV4Y2l0YXRpb24gdmVjdG9yLgorICovCisjZGVmaW5lIEFNUl9TQU1QTEVfU0NBTEUgICgyLjAgLyAzMjc2OC4wKQorCisvKiogUHJlZGljdGlvbiBmYWN0b3IgZm9yIDEyLjJrYml0L3MgbW9kZSAqLworI2RlZmluZSBQUkVEX0ZBQ19NT0RFXzEyazIgICAgICAgICAgICAgMC42NQorCisjZGVmaW5lIExTRl9SX0ZBQyAgICAgICAgICAoODAwMC4wIC8gMzI3NjguMCkgLy8vPCBMU0YgcmVzaWR1YWwgdGFibGVzIHRvIEhlcnR6CisjZGVmaW5lIE1JTl9MU0ZfU1BBQ0lORyAgICAoNTAuMDQ4OCAvIDgwMDAuMCkgLy8vPCBFbnN1cmVzIHN0YWJpbGl0eSBvZiBMUEMgZmlsdGVyCisjZGVmaW5lIFBJVENIX0xBR19NSU5fTU9ERV8xMmsyICAgICAgICAgIDE4ICAgLy8vPCBMb3dlciBib3VuZCBvbiBkZWNvZGVkIGxhZyBzZWFyY2ggaW4gMTIuMmtiaXQvcyBtb2RlCisKKy8qKiBJbml0aWFsIGVuZXJneSBpbiBkQi4gQWxzbyB1c2VkIGZvciBiYWQgZnJhbWVzICh1bmltcGxlbWVudGVkKS4gKi8KKyNkZWZpbmUgTUlOX0VORVJHWSAtMTQuMAorCisvKiogTWF4aW11bSBzaGFycGVuaW5nIGZhY3RvcgorICoKKyAqIFRoZSBzcGVjaWZpY2F0aW9uIHNheXMgMC44LCB3aGljaCBzaG91bGQgYmUgMTMxMDcsIGJ1dCB0aGUgcmVmZXJlbmNlIEMgY29kZQorICogdXNlcyAxMzAxNyBpbnN0ZWFkLiAoQW11c2luZ2x5IHRoZSBzYW1lIGFwcGxpZXMgdG8gU0hBUlBfTUFYIGluIGc3MjlkZWMuYy4pCisgKi8KKyNkZWZpbmUgU0hBUlBfTUFYIDAuNzk0NDk0NjI4OTA2MjUKKworLyoqIE51bWJlciBvZiBpbXB1bHNlIHJlc3BvbnNlIGNvZWZmaWNpZW50cyB1c2VkIGZvciB0aWx0IGZhY3RvciAqLworI2RlZmluZSBBTVJfVElMVF9SRVNQT05TRSAgIDIyCisvKiogVGlsdCBmYWN0b3IgPSAxc3QgcmVmbGVjdGlvbiBjb2VmZmljaWVudCAqIGdhbW1hX3QgKi8KKyNkZWZpbmUgQU1SX1RJTFRfR0FNTUFfVCAgIDAuOAorLyoqIEFkYXB0aXZlIGdhaW4gY29udHJvbCBmYWN0b3IgdXNlZCBpbiBwb3N0LWZpbHRlciAqLworI2RlZmluZSBBTVJfQUdDX0FMUEhBICAgICAgMC45CisKK3R5cGVkZWYgc3RydWN0IEFNUkNvbnRleHQgeworICAgIEFNUk5CRnJhbWUgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZTsgLy8vPCBkZWNvZGVkIEFNUiBwYXJhbWV0ZXJzIChsc2YgY29lZmZpY2llbnRzLCBjb2RlYm9vayBpbmRleGVzLCBldGMpCisgICAgdWludDhfdCAgICAgICAgICAgICBiYWRfZnJhbWVfaW5kaWNhdG9yOyAvLy88IGJhZCBmcmFtZSA/IDEgOiAwCisgICAgZW51bSBNb2RlICAgICAgICAgICAgICAgIGN1cl9mcmFtZV9tb2RlOworCisgICAgaW50MTZfdCAgICAgcHJldl9sc2ZfcltMUF9GSUxURVJfT1JERVJdOyAvLy88IHJlc2lkdWFsIExTRiB2ZWN0b3IgZnJvbSBwcmV2aW91cyBzdWJmcmFtZQorICAgIGRvdWJsZSAgICAgICAgICBsc3BbNF1bTFBfRklMVEVSX09SREVSXTsgLy8vPCBsc3AgdmVjdG9ycyBmcm9tIGN1cnJlbnQgZnJhbWUKKyAgICBkb3VibGUgICBwcmV2X2xzcF9zdWI0W0xQX0ZJTFRFUl9PUkRFUl07IC8vLzwgbHNwIHZlY3RvciBmb3IgdGhlIDR0aCBzdWJmcmFtZSBvZiB0aGUgcHJldmlvdXMgZnJhbWUKKworICAgIGZsb2F0ICAgICAgICAgbHNmX3FbNF1bTFBfRklMVEVSX09SREVSXTsgLy8vPCBJbnRlcnBvbGF0ZWQgTFNGIHZlY3RvciBmb3IgZml4ZWQgZ2FpbiBzbW9vdGhpbmcKKyAgICBmbG9hdCAgICAgICAgICBsc2ZfYXZnW0xQX0ZJTFRFUl9PUkRFUl07IC8vLzwgdmVjdG9yIG9mIGF2ZXJhZ2VkIGxzZiB2ZWN0b3IKKworICAgIGZsb2F0ICAgICAgICAgICBscGNbNF1bTFBfRklMVEVSX09SREVSXTsgLy8vPCBscGMgY29lZmZpY2llbnQgdmVjdG9ycyBmb3IgNCBzdWJmcmFtZXMKKworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgcGl0Y2hfbGFnX2ludDsgLy8vPCBpbnRlZ2VyIHBhcnQgb2YgcGl0Y2ggbGFnIGZyb20gY3VycmVudCBzdWJmcmFtZQorCisgICAgZmxvYXQgZXhjaXRhdGlvbl9idWZbUElUQ0hfREVMQVlfTUFYICsgTFBfRklMVEVSX09SREVSICsgMSArIEFNUl9TVUJGUkFNRV9TSVpFXTsgLy8vPCBjdXJyZW50IGV4Y2l0YXRpb24gYW5kIGFsbCBuZWNlc3NhcnkgZXhjaXRhdGlvbiBoaXN0b3J5CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICpleGNpdGF0aW9uOyAvLy88IHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZXhjaXRhdGlvbiB2ZWN0b3IgaW4gZXhjaXRhdGlvbl9idWYKKworICAgIGZsb2F0ICAgcGl0Y2hfdmVjdG9yW0FNUl9TVUJGUkFNRV9TSVpFXTsgLy8vPCBhZGFwdGl2ZSBjb2RlIGJvb2sgKHBpdGNoKSB2ZWN0b3IKKyAgICBmbG9hdCAgIGZpeGVkX3ZlY3RvcltBTVJfU1VCRlJBTUVfU0laRV07IC8vLzwgYWxnZWJyYWljIGNvZGVib29rIChmaXhlZCkgdmVjdG9yIChtdXN0IGJlIGtlcHQgemVybyBiZXR3ZWVuIGZyYW1lcykKKworICAgIGZsb2F0ICAgICAgICAgICAgICAgcHJlZGljdGlvbl9lcnJvcls0XTsgLy8vPCBxdWFudGlmaWVkIHByZWRpY3Rpb24gZXJyb3JzIHsyMGxvZzEwKF5nYW1tYV9nYyl9IGZvciBwcmV2aW91cyBmb3VyIHN1YmZyYW1lcworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgcGl0Y2hfZ2Fpbls1XTsgLy8vPCBxdWFudGlmaWVkIHBpdGNoIGdhaW5zIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgZm91ciBzdWJmcmFtZXMKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgIGZpeGVkX2dhaW5bNV07IC8vLzwgcXVhbnRpZmllZCBmaXhlZCBnYWlucyBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIGZvdXIgc3ViZnJhbWVzCisKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldGE7IC8vLzwgcHJldmlvdXMgcGl0Y2hfZ2FpbiwgYm91bmRlZCBieSBbMC4wLFNIQVJQX01BWF0KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgIGRpZmZfY291bnQ7IC8vLzwgdGhlIG51bWJlciBvZiBzdWJmcmFtZXMgZm9yIHdoaWNoIGRpZmYgaGFzIGJlZW4gYWJvdmUgMC42NQorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgaGFuZ19jb3VudDsgLy8vPCB0aGUgbnVtYmVyIG9mIHN1YmZyYW1lcyBzaW5jZSBhIGhhbmdvdmVyIHBlcmlvZCBzdGFydGVkCisKKyAgICBmbG9hdCAgICAgICAgICAgIHByZXZfc3BhcnNlX2ZpeGVkX2dhaW47IC8vLzwgcHJldmlvdXMgZml4ZWQgZ2FpbjsgdXNlZCBieSBhbnRpLXNwYXJzZW5lc3MgcHJvY2Vzc2luZyB0byBkZXRlcm1pbmUgIm9uc2V0IgorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBwcmV2X2lyX2ZpbHRlcl9ucjsgLy8vPCBwcmV2aW91cyBpbXB1bHNlIHJlc3BvbnNlIGZpbHRlciAiaW1wTnIiOiAwIC0gc3Ryb25nLCAxIC0gbWVkaXVtLCAyIC0gbm9uZQorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIGlyX2ZpbHRlcl9vbnNldDsgLy8vPCBmbGFnIGZvciBpbXB1bHNlIHJlc3BvbnNlIGZpbHRlciBzdHJlbmd0aAorCisgICAgZmxvYXQgICAgICAgICAgICAgICAgcG9zdGZpbHRlcl9tZW1bMTBdOyAvLy88IHByZXZpb3VzIGludGVybWVkaWF0ZSB2YWx1ZXMgaW4gdGhlIGZvcm1hbnQgZmlsdGVyCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbHRfbWVtOyAvLy88IHByZXZpb3VzIGlucHV0IHRvIHRpbHQgY29tcGVuc2F0aW9uIGZpbHRlcgorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICBwb3N0ZmlsdGVyX2FnYzsgLy8vPCBwcmV2aW91cyBmYWN0b3IgdXNlZCBmb3IgYWRhcHRpdmUgZ2FpbiBjb250cm9sCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICBoaWdoX3Bhc3NfbWVtWzJdOyAvLy88IHByZXZpb3VzIGludGVybWVkaWF0ZSB2YWx1ZXMgaW4gdGhlIGhpZ2gtcGFzcyBmaWx0ZXIKKworICAgIGZsb2F0IHNhbXBsZXNfaW5bTFBfRklMVEVSX09SREVSICsgQU1SX1NVQkZSQU1FX1NJWkVdOyAvLy88IGZsb2F0aW5nIHBvaW50IHNhbXBsZXMKKworICAgIEFDRUxQRkNvbnRleHQgICAgICAgICAgICAgICAgICAgICBhY2VscGZfY3R4OyAvLy88IGNvbnRleHQgZm9yIGZpbHRlcnMgZm9yIEFDRUxQLWJhc2VkIGNvZGVjcworICAgIEFDRUxQVkNvbnRleHQgICAgICAgICAgICAgICAgICAgICBhY2VscHZfY3R4OyAvLy88IGNvbnRleHQgZm9yIHZlY3RvciBvcGVyYXRpb25zIGZvciBBQ0VMUC1iYXNlZCBjb2RlY3MKKyAgICBDRUxQRkNvbnRleHQgICAgICAgICAgICAgICAgICAgICAgIGNlbHBmX2N0eDsgLy8vPCBjb250ZXh0IGZvciBmaWx0ZXJzIGZvciBDRUxQLWJhc2VkIGNvZGVjcworICAgIENFTFBNQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgY2VscG1fY3R4OyAvLy88IGNvbnRleHQgZm9yIGZpeGVkIHBvaW50IG1hdGggb3BlcmF0aW9ucworCit9IEFNUkNvbnRleHQ7CisKKy8qKiBEb3VibGUgdmVyc2lvbiBvZiBmZl93ZWlnaHRlZF92ZWN0b3Jfc3VtZigpICovCitzdGF0aWMgdm9pZCB3ZWlnaHRlZF92ZWN0b3Jfc3VtZChkb3VibGUgKm91dCwgY29uc3QgZG91YmxlICppbl9hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlICppbl9iLCBkb3VibGUgd2VpZ2h0X2NvZWZmX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2VpZ2h0X2NvZWZmX2IsIGludCBsZW5ndGgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIG91dFtpXSA9IHdlaWdodF9jb2VmZl9hICogaW5fYVtpXQorICAgICAgICAgICAgICAgKyB3ZWlnaHRfY29lZmZfYiAqIGluX2JbaV07Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhbXJuYl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQU1SQ29udGV4dCAqcCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID4gMSkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIm11bHRpLWNoYW5uZWwgQU1SIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIGlmICghYXZjdHgtPnNhbXBsZV9yYXRlKQorICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSA4MDAwOworICAgIGF2Y3R4LT5zYW1wbGVfZm10ICAgICA9IEFWX1NBTVBMRV9GTVRfRkxUOworCisgICAgLy8gcC0+ZXhjaXRhdGlvbiBhbHdheXMgcG9pbnRzIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGluIHAtPmV4Y2l0YXRpb25fYnVmCisgICAgcC0+ZXhjaXRhdGlvbiA9ICZwLT5leGNpdGF0aW9uX2J1ZltQSVRDSF9ERUxBWV9NQVggKyBMUF9GSUxURVJfT1JERVIgKyAxXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgICAgICBwLT5wcmV2X2xzcF9zdWI0W2ldID0gICAgbHNwX3N1YjRfaW5pdFtpXSAqIDEwMDAgLyAoZmxvYXQpKDEgPDwgMTUpOworICAgICAgICBwLT5sc2ZfYXZnW2ldID0gcC0+bHNmX3FbM11baV0gPSBsc3BfYXZnX2luaXRbaV0gLyAoZmxvYXQpKDEgPDwgMTUpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHAtPnByZWRpY3Rpb25fZXJyb3JbaV0gPSBNSU5fRU5FUkdZOworCisgICAgZmZfYWNlbHBfZmlsdGVyX2luaXQoJnAtPmFjZWxwZl9jdHgpOworICAgIGZmX2FjZWxwX3ZlY3RvcnNfaW5pdCgmcC0+YWNlbHB2X2N0eCk7CisgICAgZmZfY2VscF9maWx0ZXJfaW5pdCgmcC0+Y2VscGZfY3R4KTsKKyAgICBmZl9jZWxwX21hdGhfaW5pdCgmcC0+Y2VscG1fY3R4KTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogVW5wYWNrIGFuIFJGQzQ4Njcgc3BlZWNoIGZyYW1lIGludG8gdGhlIEFNUiBmcmFtZSBtb2RlIGFuZCBwYXJhbWV0ZXJzLgorICoKKyAqIFRoZSBvcmRlciBvZiBzcGVlY2ggYml0cyBpcyBzcGVjaWZpZWQgYnkgM0dQUCBUUyAyNi4xMDEuCisgKgorICogQHBhcmFtIHAgdGhlIGNvbnRleHQKKyAqIEBwYXJhbSBidWYgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIKKyAqIEBwYXJhbSBidWZfc2l6ZSAgICAgICAgICBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIKKyAqCisgKiBAcmV0dXJuIHRoZSBmcmFtZSBtb2RlCisgKi8KK3N0YXRpYyBlbnVtIE1vZGUgdW5wYWNrX2JpdHN0cmVhbShBTVJDb250ZXh0ICpwLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKQoreworICAgIGVudW0gTW9kZSBtb2RlOworCisgICAgLy8gRGVjb2RlIHRoZSBmaXJzdCBvY3RldC4KKyAgICBtb2RlID0gYnVmWzBdID4+IDMgJiAweDBGOyAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZSB0eXBlCisgICAgcC0+YmFkX2ZyYW1lX2luZGljYXRvciA9IChidWZbMF0gJiAweDQpICE9IDB4NDsgLy8gcXVhbGl0eSBiaXQKKworICAgIGlmIChtb2RlID49IE5fTU9ERVMgfHwgYnVmX3NpemUgPCBmcmFtZV9zaXplc19uYlttb2RlXSArIDEpIHsKKyAgICAgICAgcmV0dXJuIE5PX0RBVEE7CisgICAgfQorCisgICAgaWYgKG1vZGUgPCBNT0RFX0RUWCkKKyAgICAgICAgZmZfYW1yX2JpdF9yZW9yZGVyKCh1aW50MTZfdCAqKSAmcC0+ZnJhbWUsIHNpemVvZihBTVJOQkZyYW1lKSwgYnVmICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtcl91bnBhY2tpbmdfYml0bWFwc19wZXJfbW9kZVttb2RlXSk7CisKKyAgICByZXR1cm4gbW9kZTsKK30KKworCisvLy8gQG5hbWUgQU1SIHBpdGNoIExQQyBjb2VmZmljaWVudCBkZWNvZGluZyBmdW5jdGlvbnMKKy8vLyBAeworCisvKioKKyAqIEludGVycG9sYXRlIHRoZSBMU0YgdmVjdG9yICh1c2VkIGZvciBmaXhlZCBnYWluIHNtb290aGluZykuCisgKiBUaGUgaW50ZXJwb2xhdGlvbiBpcyBkb25lIG92ZXIgYWxsIGZvdXIgc3ViZnJhbWVzIGV2ZW4gaW4gTU9ERV8xMmsyLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGN0eCAgICAgICBUaGUgQ29udGV4dAorICogQHBhcmFtW2luLG91dF0gbHNmX3EgICAgIExTRnMgaW4gWzAsMV0gZm9yIGVhY2ggc3ViZnJhbWUKKyAqIEBwYXJhbVtpbl0gICAgIGxzZl9uZXcgICBOZXcgTFNGcyBpbiBbMCwxXSBmb3Igc3ViZnJhbWUgNAorICovCitzdGF0aWMgdm9pZCBpbnRlcnBvbGF0ZV9sc2YoQUNFTFBWQ29udGV4dCAqY3R4LCBmbG9hdCBsc2ZfcVs0XVtMUF9GSUxURVJfT1JERVJdLCBmbG9hdCAqbHNmX25ldykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGN0eC0+d2VpZ2h0ZWRfdmVjdG9yX3N1bWYobHNmX3FbaV0sIGxzZl9xWzNdLCBsc2ZfbmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1ICogKDMgLSBpKSwgMC4yNSAqIChpICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQX0ZJTFRFUl9PUkRFUik7Cit9CisKKy8qKgorICogRGVjb2RlIGEgc2V0IG9mIDUgc3BsaXQtbWF0cml4IHF1YW50aXplZCBsc2YgaW5kZXhlcyBpbnRvIGFuIGxzcCB2ZWN0b3IuCisgKgorICogQHBhcmFtIHAgdGhlIGNvbnRleHQKKyAqIEBwYXJhbSBsc3Agb3V0cHV0IExTUCB2ZWN0b3IKKyAqIEBwYXJhbSBsc2Zfbm9fciBMU0YgdmVjdG9yIHdpdGhvdXQgdGhlIHJlc2lkdWFsIHZlY3RvciBhZGRlZAorICogQHBhcmFtIGxzZl9xdWFudGl6ZXIgcG9pbnRlcnMgdG8gTFNGIGRpY3Rpb25hcnkgdGFibGVzCisgKiBAcGFyYW0gcXVhbnRpemVyX29mZnNldCBvZmZzZXQgaW4gdGFibGVzCisgKiBAcGFyYW0gc2lnbiBmb3IgdGhlIDMgZGljdGlvbmFyeSB0YWJsZQorICogQHBhcmFtIHVwZGF0ZSBzdG9yZSBkYXRhIGZvciBjb21wdXRpbmcgdGhlIG5leHQgZnJhbWUncyBMU0ZzCisgKi8KK3N0YXRpYyB2b2lkIGxzZjJsc3BfZm9yX21vZGUxMmsyKEFNUkNvbnRleHQgKnAsIGRvdWJsZSBsc3BbTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGxzZl9ub19yW0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpsc2ZfcXVhbnRpemVyWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHF1YW50aXplcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2lnbiwgY29uc3QgaW50IHVwZGF0ZSkKK3sKKyAgICBpbnQxNl90IGxzZl9yW0xQX0ZJTFRFUl9PUkRFUl07IC8vIHJlc2lkdWFsIExTRiB2ZWN0b3IKKyAgICBmbG9hdCBsc2ZfcVtMUF9GSUxURVJfT1JERVJdOyAvLyBxdWFudGlmaWVkIExTRiB2ZWN0b3IKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMUF9GSUxURVJfT1JERVIgPj4gMTsgaSsrKQorICAgICAgICBtZW1jcHkoJmxzZl9yW2kgPDwgMV0sICZsc2ZfcXVhbnRpemVyW2ldW3F1YW50aXplcl9vZmZzZXRdLAorICAgICAgICAgICAgICAgMiAqIHNpemVvZigqbHNmX3IpKTsKKworICAgIGlmIChzaWduKSB7CisgICAgICAgIGxzZl9yWzRdICo9IC0xOworICAgICAgICBsc2Zfcls1XSAqPSAtMTsKKyAgICB9CisKKyAgICBpZiAodXBkYXRlKQorICAgICAgICBtZW1jcHkocC0+cHJldl9sc2ZfciwgbHNmX3IsIExQX0ZJTFRFUl9PUkRFUiAqIHNpemVvZigqbHNmX3IpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMUF9GSUxURVJfT1JERVI7IGkrKykKKyAgICAgICAgbHNmX3FbaV0gPSBsc2ZfcltpXSAqIChMU0ZfUl9GQUMgLyA4MDAwLjApICsgbHNmX25vX3JbaV0gKiAoMS4wIC8gODAwMC4wKTsKKworICAgIGZmX3NldF9taW5fZGlzdF9sc2YobHNmX3EsIE1JTl9MU0ZfU1BBQ0lORywgTFBfRklMVEVSX09SREVSKTsKKworICAgIGlmICh1cGRhdGUpCisgICAgICAgIGludGVycG9sYXRlX2xzZigmcC0+YWNlbHB2X2N0eCwgcC0+bHNmX3EsIGxzZl9xKTsKKworICAgIGZmX2FjZWxwX2xzZjJsc3BkKGxzcCwgbHNmX3EsIExQX0ZJTFRFUl9PUkRFUik7Cit9CisKKy8qKgorICogRGVjb2RlIGEgc2V0IG9mIDUgc3BsaXQtbWF0cml4IHF1YW50aXplZCBsc2YgaW5kZXhlcyBpbnRvIDIgbHNwIHZlY3RvcnMuCisgKgorICogQHBhcmFtIHAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEFNUkNvbnRleHQKKyAqLworc3RhdGljIHZvaWQgbHNmMmxzcF81KEFNUkNvbnRleHQgKnApCit7CisgICAgY29uc3QgdWludDE2X3QgKmxzZl9wYXJhbSA9IHAtPmZyYW1lLmxzZjsKKyAgICBmbG9hdCBsc2Zfbm9fcltMUF9GSUxURVJfT1JERVJdOyAvLyBMU0ZzIHdpdGhvdXQgdGhlIHJlc2lkdWFsIHZlY3RvcgorICAgIGNvbnN0IGludDE2X3QgKmxzZl9xdWFudGl6ZXJbNV07CisgICAgaW50IGk7CisKKyAgICBsc2ZfcXVhbnRpemVyWzBdID0gbHNmXzVfMVtsc2ZfcGFyYW1bMF1dOworICAgIGxzZl9xdWFudGl6ZXJbMV0gPSBsc2ZfNV8yW2xzZl9wYXJhbVsxXV07CisgICAgbHNmX3F1YW50aXplclsyXSA9IGxzZl81XzNbbHNmX3BhcmFtWzJdID4+IDFdOworICAgIGxzZl9xdWFudGl6ZXJbM10gPSBsc2ZfNV80W2xzZl9wYXJhbVszXV07CisgICAgbHNmX3F1YW50aXplcls0XSA9IGxzZl81XzVbbHNmX3BhcmFtWzRdXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMUF9GSUxURVJfT1JERVI7IGkrKykKKyAgICAgICAgbHNmX25vX3JbaV0gPSBwLT5wcmV2X2xzZl9yW2ldICogTFNGX1JfRkFDICogUFJFRF9GQUNfTU9ERV8xMmsyICsgbHNmXzVfbWVhbltpXTsKKworICAgIGxzZjJsc3BfZm9yX21vZGUxMmsyKHAsIHAtPmxzcFsxXSwgbHNmX25vX3IsIGxzZl9xdWFudGl6ZXIsIDAsIGxzZl9wYXJhbVsyXSAmIDEsIDApOworICAgIGxzZjJsc3BfZm9yX21vZGUxMmsyKHAsIHAtPmxzcFszXSwgbHNmX25vX3IsIGxzZl9xdWFudGl6ZXIsIDIsIGxzZl9wYXJhbVsyXSAmIDEsIDEpOworCisgICAgLy8gaW50ZXJwb2xhdGUgTFNQIHZlY3RvcnMgYXQgc3ViZnJhbWVzIDEgYW5kIDMKKyAgICB3ZWlnaHRlZF92ZWN0b3Jfc3VtZChwLT5sc3BbMF0sIHAtPnByZXZfbHNwX3N1YjQsIHAtPmxzcFsxXSwgMC41LCAwLjUsIExQX0ZJTFRFUl9PUkRFUik7CisgICAgd2VpZ2h0ZWRfdmVjdG9yX3N1bWQocC0+bHNwWzJdLCBwLT5sc3BbMV0gICAgICAgLCBwLT5sc3BbM10sIDAuNSwgMC41LCBMUF9GSUxURVJfT1JERVIpOworfQorCisvKioKKyAqIERlY29kZSBhIHNldCBvZiAzIHNwbGl0LW1hdHJpeCBxdWFudGl6ZWQgbHNmIGluZGV4ZXMgaW50byBhbiBsc3AgdmVjdG9yLgorICoKKyAqIEBwYXJhbSBwICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBBTVJDb250ZXh0CisgKi8KK3N0YXRpYyB2b2lkIGxzZjJsc3BfMyhBTVJDb250ZXh0ICpwKQoreworICAgIGNvbnN0IHVpbnQxNl90ICpsc2ZfcGFyYW0gPSBwLT5mcmFtZS5sc2Y7CisgICAgaW50MTZfdCBsc2ZfcltMUF9GSUxURVJfT1JERVJdOyAvLyByZXNpZHVhbCBMU0YgdmVjdG9yCisgICAgZmxvYXQgbHNmX3FbTFBfRklMVEVSX09SREVSXTsgLy8gcXVhbnRpZmllZCBMU0YgdmVjdG9yCisgICAgY29uc3QgaW50MTZfdCAqbHNmX3F1YW50aXplcjsKKyAgICBpbnQgaSwgajsKKworICAgIGxzZl9xdWFudGl6ZXIgPSAocC0+Y3VyX2ZyYW1lX21vZGUgPT0gTU9ERV83azk1ID8gbHNmXzNfMV9NT0RFXzdrOTUgOiBsc2ZfM18xKVtsc2ZfcGFyYW1bMF1dOworICAgIG1lbWNweShsc2ZfciwgbHNmX3F1YW50aXplciwgMyAqIHNpemVvZigqbHNmX3IpKTsKKworICAgIGxzZl9xdWFudGl6ZXIgPSBsc2ZfM18yW2xzZl9wYXJhbVsxXSA8PCAocC0+Y3VyX2ZyYW1lX21vZGUgPD0gTU9ERV81azE1KV07CisgICAgbWVtY3B5KGxzZl9yICsgMywgbHNmX3F1YW50aXplciwgMyAqIHNpemVvZigqbHNmX3IpKTsKKworICAgIGxzZl9xdWFudGl6ZXIgPSAocC0+Y3VyX2ZyYW1lX21vZGUgPD0gTU9ERV81azE1ID8gbHNmXzNfM19NT0RFXzVrMTUgOiBsc2ZfM18zKVtsc2ZfcGFyYW1bMl1dOworICAgIG1lbWNweShsc2ZfciArIDYsIGxzZl9xdWFudGl6ZXIsIDQgKiBzaXplb2YoKmxzZl9yKSk7CisKKyAgICAvLyBjYWxjdWxhdGUgbWVhbi1yZW1vdmVkIExTRiB2ZWN0b3IgYW5kIGFkZCBtZWFuCisgICAgZm9yIChpID0gMDsgaSA8IExQX0ZJTFRFUl9PUkRFUjsgaSsrKQorICAgICAgICBsc2ZfcVtpXSA9IChsc2ZfcltpXSArIHAtPnByZXZfbHNmX3JbaV0gKiBwcmVkX2ZhY1tpXSkgKiAoTFNGX1JfRkFDIC8gODAwMC4wKSArIGxzZl8zX21lYW5baV0gKiAoMS4wIC8gODAwMC4wKTsKKworICAgIGZmX3NldF9taW5fZGlzdF9sc2YobHNmX3EsIE1JTl9MU0ZfU1BBQ0lORywgTFBfRklMVEVSX09SREVSKTsKKworICAgIC8vIHN0b3JlIGRhdGEgZm9yIGNvbXB1dGluZyB0aGUgbmV4dCBmcmFtZSdzIExTRnMKKyAgICBpbnRlcnBvbGF0ZV9sc2YoJnAtPmFjZWxwdl9jdHgsIHAtPmxzZl9xLCBsc2ZfcSk7CisgICAgbWVtY3B5KHAtPnByZXZfbHNmX3IsIGxzZl9yLCBMUF9GSUxURVJfT1JERVIgKiBzaXplb2YoKmxzZl9yKSk7CisKKyAgICBmZl9hY2VscF9sc2YybHNwZChwLT5sc3BbM10sIGxzZl9xLCBMUF9GSUxURVJfT1JERVIpOworCisgICAgLy8gaW50ZXJwb2xhdGUgTFNQIHZlY3RvcnMgYXQgc3ViZnJhbWVzIDEsIDIgYW5kIDMKKyAgICBmb3IgKGkgPSAxOyBpIDw9IDM7IGkrKykKKyAgICAgICAgZm9yKGogPSAwOyBqIDwgTFBfRklMVEVSX09SREVSOyBqKyspCisgICAgICAgICAgICBwLT5sc3BbaS0xXVtqXSA9IHAtPnByZXZfbHNwX3N1YjRbal0gKworICAgICAgICAgICAgICAgIChwLT5sc3BbM11bal0gLSBwLT5wcmV2X2xzcF9zdWI0W2pdKSAqIDAuMjUgKiBpOworfQorCisvLy8gQH0KKworCisvLy8gQG5hbWUgQU1SIHBpdGNoIHZlY3RvciBkZWNvZGluZyBmdW5jdGlvbnMKKy8vLyBAeworCisvKioKKyAqIExpa2UgZmZfZGVjb2RlX3BpdGNoX2xhZygpLCBidXQgd2l0aCAxLzYgcmVzb2x1dGlvbgorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfcGl0Y2hfbGFnXzFfNihpbnQgKmxhZ19pbnQsIGludCAqbGFnX2ZyYWMsIGludCBwaXRjaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwcmV2X2xhZ19pbnQsIGNvbnN0IGludCBzdWJmcmFtZSkKK3sKKyAgICBpZiAoc3ViZnJhbWUgPT0gMCB8fCBzdWJmcmFtZSA9PSAyKSB7CisgICAgICAgIGlmIChwaXRjaF9pbmRleCA8IDQ2MykgeworICAgICAgICAgICAgKmxhZ19pbnQgID0gKHBpdGNoX2luZGV4ICsgMTA3KSAqIDEwOTIzID4+IDE2OworICAgICAgICAgICAgKmxhZ19mcmFjID0gcGl0Y2hfaW5kZXggLSAqbGFnX2ludCAqIDYgKyAxMDU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqbGFnX2ludCAgPSBwaXRjaF9pbmRleCAtIDM2ODsKKyAgICAgICAgICAgICpsYWdfZnJhYyA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqbGFnX2ludCAgPSAoKHBpdGNoX2luZGV4ICsgNSkgKiAxMDkyMyA+PiAxNikgLSAxOworICAgICAgICAqbGFnX2ZyYWMgPSBwaXRjaF9pbmRleCAtICpsYWdfaW50ICogNiAtIDM7CisgICAgICAgICpsYWdfaW50ICs9IGF2X2NsaXAocHJldl9sYWdfaW50IC0gNSwgUElUQ0hfTEFHX01JTl9NT0RFXzEyazIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElUQ0hfREVMQVlfTUFYIC0gOSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfcGl0Y2hfdmVjdG9yKEFNUkNvbnRleHQgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFNUk5CU3ViZnJhbWUgKmFtcl9zdWJmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN1YmZyYW1lKQoreworICAgIGludCBwaXRjaF9sYWdfaW50LCBwaXRjaF9sYWdfZnJhYzsKKyAgICBlbnVtIE1vZGUgbW9kZSA9IHAtPmN1cl9mcmFtZV9tb2RlOworCisgICAgaWYgKHAtPmN1cl9mcmFtZV9tb2RlID09IE1PREVfMTJrMikgeworICAgICAgICBkZWNvZGVfcGl0Y2hfbGFnXzFfNigmcGl0Y2hfbGFnX2ludCwgJnBpdGNoX2xhZ19mcmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXJfc3ViZnJhbWUtPnBfbGFnLCBwLT5waXRjaF9sYWdfaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJmcmFtZSk7CisgICAgfSBlbHNlCisgICAgICAgIGZmX2RlY29kZV9waXRjaF9sYWcoJnBpdGNoX2xhZ19pbnQsICZwaXRjaF9sYWdfZnJhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXJfc3ViZnJhbWUtPnBfbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBpdGNoX2xhZ19pbnQsIHN1YmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgIT0gTU9ERV80azc1ICYmIG1vZGUgIT0gTU9ERV81azE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPD0gTU9ERV82azcgPyA0IDogKG1vZGUgPT0gTU9ERV83azk1ID8gNSA6IDYpKTsKKworICAgIHAtPnBpdGNoX2xhZ19pbnQgPSBwaXRjaF9sYWdfaW50OyAvLyBzdG9yZSBwcmV2aW91cyBsYWcgaW4gYSB1aW50OF90CisKKyAgICBwaXRjaF9sYWdfZnJhYyA8PD0gKHAtPmN1cl9mcmFtZV9tb2RlICE9IE1PREVfMTJrMik7CisKKyAgICBwaXRjaF9sYWdfaW50ICs9IHBpdGNoX2xhZ19mcmFjID4gMDsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgcGl0Y2ggdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIHBhc3QgZXhjaXRhdGlvbiBhdCB0aGUKKyAgICAgICBwaXRjaCBsYWcgdXNpbmcgYSBiNjAgaGFtbWluZyB3aW5kb3dlZCBzaW5jIGZ1bmN0aW9uLiAgICovCisgICAgcC0+YWNlbHBmX2N0eC5hY2VscF9pbnRlcnBvbGF0ZWYocC0+ZXhjaXRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZXhjaXRhdGlvbiArIDEgLSBwaXRjaF9sYWdfaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9iNjBfc2luYywgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hfbGFnX2ZyYWMgKyA2IC0gNioocGl0Y2hfbGFnX2ZyYWMgPiAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIEFNUl9TVUJGUkFNRV9TSVpFKTsKKworICAgIG1lbWNweShwLT5waXRjaF92ZWN0b3IsIHAtPmV4Y2l0YXRpb24sIEFNUl9TVUJGUkFNRV9TSVpFICogc2l6ZW9mKGZsb2F0KSk7Cit9CisKKy8vLyBAfQorCisKKy8vLyBAbmFtZSBBTVIgYWxnZWJyYWljIGNvZGUgYm9vayAoZml4ZWQpIHZlY3RvciBkZWNvZGluZyBmdW5jdGlvbnMKKy8vLyBAeworCisvKioKKyAqIERlY29kZSBhIDEwLWJpdCBhbGdlYnJhaWMgY29kZWJvb2sgaW5kZXggZnJvbSBhIDEwLjIga2JpdC9zIGZyYW1lLgorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfMTBiaXRfcHVsc2UoaW50IGNvZGUsIGludCBwdWxzZV9wb3NpdGlvbls4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTEsIGludCBpMiwgaW50IGkzKQoreworICAgIC8vIGNvZGVkIHVzaW5nIDcrMyBiaXRzIHdpdGggdGhlIDMgTFNCcyBiZWluZywgaW5kaXZpZHVhbGx5LCB0aGUgTFNCIG9mIDEgb2YKKyAgICAvLyB0aGUgMyBwdWxzZXMgYW5kIHRoZSB1cHBlciA3IGJpdHMgYmVpbmcgY29kZWQgaW4gYmFzZSA1CisgICAgY29uc3QgdWludDhfdCAqcG9zaXRpb25zID0gYmFzZV9maXZlX3RhYmxlW2NvZGUgPj4gM107CisgICAgcHVsc2VfcG9zaXRpb25baTFdID0gKHBvc2l0aW9uc1syXSA8PCAxKSArICggY29kZSAgICAgICAmIDEpOworICAgIHB1bHNlX3Bvc2l0aW9uW2kyXSA9IChwb3NpdGlvbnNbMV0gPDwgMSkgKyAoKGNvZGUgPj4gMSkgJiAxKTsKKyAgICBwdWxzZV9wb3NpdGlvbltpM10gPSAocG9zaXRpb25zWzBdIDw8IDEpICsgKChjb2RlID4+IDIpICYgMSk7Cit9CisKKy8qKgorICogRGVjb2RlIHRoZSBhbGdlYnJhaWMgY29kZWJvb2sgaW5kZXggdG8gcHVsc2UgcG9zaXRpb25zIGFuZCBzaWducyBhbmQKKyAqIGNvbnN0cnVjdCB0aGUgYWxnZWJyYWljIGNvZGVib29rIHZlY3RvciBmb3IgTU9ERV8xMGsyLgorICoKKyAqIEBwYXJhbSBmaXhlZF9pbmRleCAgICAgICAgICBwb3NpdGlvbnMgb2YgdGhlIGVpZ2h0IHB1bHNlcworICogQHBhcmFtIGZpeGVkX3NwYXJzZSAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGFsZ2VicmFpYyBjb2RlYm9vayB2ZWN0b3IKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlXzhfcHVsc2VzXzMxYml0cyhjb25zdCBpbnQxNl90ICpmaXhlZF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SRml4ZWQgKmZpeGVkX3NwYXJzZSkKK3sKKyAgICBpbnQgcHVsc2VfcG9zaXRpb25bOF07CisgICAgaW50IGksIHRlbXA7CisKKyAgICBkZWNvZGVfMTBiaXRfcHVsc2UoZml4ZWRfaW5kZXhbNF0sIHB1bHNlX3Bvc2l0aW9uLCAwLCA0LCAxKTsKKyAgICBkZWNvZGVfMTBiaXRfcHVsc2UoZml4ZWRfaW5kZXhbNV0sIHB1bHNlX3Bvc2l0aW9uLCAyLCA2LCA1KTsKKworICAgIC8vIGNvZGVkIHVzaW5nIDUrMiBiaXRzIHdpdGggdGhlIDIgTFNCcyBiZWluZywgaW5kaXZpZHVhbGx5LCB0aGUgTFNCIG9mIDEgb2YKKyAgICAvLyB0aGUgMiBwdWxzZXMgYW5kIHRoZSB1cHBlciA1IGJpdHMgYmVpbmcgY29kZWQgaW4gYmFzZSA1CisgICAgdGVtcCA9ICgoZml4ZWRfaW5kZXhbNl0gPj4gMikgKiAyNSArIDEyKSA+PiA1OworICAgIHB1bHNlX3Bvc2l0aW9uWzNdID0gdGVtcCAlIDU7CisgICAgcHVsc2VfcG9zaXRpb25bN10gPSB0ZW1wIC8gNTsKKyAgICBpZiAocHVsc2VfcG9zaXRpb25bN10gJiAxKQorICAgICAgICBwdWxzZV9wb3NpdGlvblszXSA9IDQgLSBwdWxzZV9wb3NpdGlvblszXTsKKyAgICBwdWxzZV9wb3NpdGlvblszXSA9IChwdWxzZV9wb3NpdGlvblszXSA8PCAxKSArICggZml4ZWRfaW5kZXhbNl0gICAgICAgJiAxKTsKKyAgICBwdWxzZV9wb3NpdGlvbls3XSA9IChwdWxzZV9wb3NpdGlvbls3XSA8PCAxKSArICgoZml4ZWRfaW5kZXhbNl0gPj4gMSkgJiAxKTsKKworICAgIGZpeGVkX3NwYXJzZS0+biA9IDg7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBjb25zdCBpbnQgcG9zMSAgID0gKHB1bHNlX3Bvc2l0aW9uW2ldICAgICA8PCAyKSArIGk7CisgICAgICAgIGNvbnN0IGludCBwb3MyICAgPSAocHVsc2VfcG9zaXRpb25baSArIDRdIDw8IDIpICsgaTsKKyAgICAgICAgY29uc3QgZmxvYXQgc2lnbiA9IGZpeGVkX2luZGV4W2ldID8gLTEuMCA6IDEuMDsKKyAgICAgICAgZml4ZWRfc3BhcnNlLT54W2kgICAgXSA9IHBvczE7CisgICAgICAgIGZpeGVkX3NwYXJzZS0+eFtpICsgNF0gPSBwb3MyOworICAgICAgICBmaXhlZF9zcGFyc2UtPnlbaSAgICBdID0gc2lnbjsKKyAgICAgICAgZml4ZWRfc3BhcnNlLT55W2kgKyA0XSA9IHBvczIgPCBwb3MxID8gLXNpZ24gOiBzaWduOworICAgIH0KK30KKworLyoqCisgKiBEZWNvZGUgdGhlIGFsZ2VicmFpYyBjb2RlYm9vayBpbmRleCB0byBwdWxzZSBwb3NpdGlvbnMgYW5kIHNpZ25zLAorICogdGhlbiBjb25zdHJ1Y3QgdGhlIGFsZ2VicmFpYyBjb2RlYm9vayB2ZWN0b3IuCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYiBvZiBwdWxzZXMgfCBiaXRzIGVuY29kaW5nIHB1bHNlcworICogRm9yIE1PREVfNGs3NSBvciBNT0RFXzVrMTUsICAgICAgICAgICAgIDIgfCAxLTMsIDQtNiwgNworICogICAgICAgICAgICAgICAgICBNT0RFXzVrOSwgICAgICAgICAgICAgIDIgfCAxLCAgIDItNCwgNS02LCA3LTkKKyAqICAgICAgICAgICAgICAgICAgTU9ERV82azcsICAgICAgICAgICAgICAzIHwgMS0zLCA0LCAgIDUtNywgOCwgIDktMTEKKyAqICAgICAgTU9ERV83azQgb3IgTU9ERV83azk1LCAgICAgICAgICAgICA0IHwgMS0zLCA0LTYsIDctOSwgMTAsIDExLTEzCisgKgorICogQHBhcmFtIGZpeGVkX3NwYXJzZSBwb2ludGVyIHRvIHRoZSBhbGdlYnJhaWMgY29kZWJvb2sgdmVjdG9yCisgKiBAcGFyYW0gcHVsc2VzICAgICAgIGFsZ2VicmFpYyBjb2RlYm9vayBpbmRleGVzCisgKiBAcGFyYW0gbW9kZSAgICAgICAgIG1vZGUgb2YgdGhlIGN1cnJlbnQgZnJhbWUKKyAqIEBwYXJhbSBzdWJmcmFtZSAgICAgY3VycmVudCBzdWJmcmFtZSBudW1iZXIKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX2ZpeGVkX3NwYXJzZShBTVJGaXhlZCAqZml4ZWRfc3BhcnNlLCBjb25zdCB1aW50MTZfdCAqcHVsc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnVtIE1vZGUgbW9kZSwgY29uc3QgaW50IHN1YmZyYW1lKQoreworICAgIGF2X2Fzc2VydDEoTU9ERV80azc1IDw9IChzaWduZWQpbW9kZSAmJiBtb2RlIDw9IE1PREVfMTJrMik7CisKKyAgICBpZiAobW9kZSA9PSBNT0RFXzEyazIpIHsKKyAgICAgICAgZmZfZGVjb2RlXzEwX3B1bHNlc18zNWJpdHMocHVsc2VzLCBmaXhlZF9zcGFyc2UsIGdyYXlfZGVjb2RlLCA1LCAzKTsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTU9ERV8xMGsyKSB7CisgICAgICAgIGRlY29kZV84X3B1bHNlc18zMWJpdHMocHVsc2VzLCBmaXhlZF9zcGFyc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCAqcHVsc2VfcG9zaXRpb24gPSBmaXhlZF9zcGFyc2UtPng7CisgICAgICAgIGludCBpLCBwdWxzZV9zdWJzZXQ7CisgICAgICAgIGNvbnN0IGludCBmaXhlZF9pbmRleCA9IHB1bHNlc1swXTsKKworICAgICAgICBpZiAobW9kZSA8PSBNT0RFXzVrMTUpIHsKKyAgICAgICAgICAgIHB1bHNlX3N1YnNldCAgICAgID0gKChmaXhlZF9pbmRleCA+PiAzKSAmIDgpICAgICArIChzdWJmcmFtZSA8PCAxKTsKKyAgICAgICAgICAgIHB1bHNlX3Bvc2l0aW9uWzBdID0gKCBmaXhlZF9pbmRleCAgICAgICAmIDcpICogNSArIHRyYWNrX3Bvc2l0aW9uW3B1bHNlX3N1YnNldF07CisgICAgICAgICAgICBwdWxzZV9wb3NpdGlvblsxXSA9ICgoZml4ZWRfaW5kZXggPj4gMykgJiA3KSAqIDUgKyB0cmFja19wb3NpdGlvbltwdWxzZV9zdWJzZXQgKyAxXTsKKyAgICAgICAgICAgIGZpeGVkX3NwYXJzZS0+biA9IDI7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBNT0RFXzVrOSkgeworICAgICAgICAgICAgcHVsc2Vfc3Vic2V0ICAgICAgPSAoKGZpeGVkX2luZGV4ICYgMSkgPDwgMSkgKyAxOworICAgICAgICAgICAgcHVsc2VfcG9zaXRpb25bMF0gPSAoKGZpeGVkX2luZGV4ID4+IDEpICYgNykgKiA1ICsgcHVsc2Vfc3Vic2V0OworICAgICAgICAgICAgcHVsc2Vfc3Vic2V0ICAgICAgPSAoZml4ZWRfaW5kZXggID4+IDQpICYgMzsKKyAgICAgICAgICAgIHB1bHNlX3Bvc2l0aW9uWzFdID0gKChmaXhlZF9pbmRleCA+PiA2KSAmIDcpICogNSArIHB1bHNlX3N1YnNldCArIChwdWxzZV9zdWJzZXQgPT0gMyA/IDEgOiAwKTsKKyAgICAgICAgICAgIGZpeGVkX3NwYXJzZS0+biA9IHB1bHNlX3Bvc2l0aW9uWzBdID09IHB1bHNlX3Bvc2l0aW9uWzFdID8gMSA6IDI7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBNT0RFXzZrNykgeworICAgICAgICAgICAgcHVsc2VfcG9zaXRpb25bMF0gPSAoZml4ZWRfaW5kZXggICAgICAgICYgNykgKiA1OworICAgICAgICAgICAgcHVsc2Vfc3Vic2V0ICAgICAgPSAoZml4ZWRfaW5kZXggID4+IDIpICYgMjsKKyAgICAgICAgICAgIHB1bHNlX3Bvc2l0aW9uWzFdID0gKChmaXhlZF9pbmRleCA+PiA0KSAmIDcpICogNSArIHB1bHNlX3N1YnNldCArIDE7CisgICAgICAgICAgICBwdWxzZV9zdWJzZXQgICAgICA9IChmaXhlZF9pbmRleCAgPj4gNikgJiAyOworICAgICAgICAgICAgcHVsc2VfcG9zaXRpb25bMl0gPSAoKGZpeGVkX2luZGV4ID4+IDgpICYgNykgKiA1ICsgcHVsc2Vfc3Vic2V0ICsgMjsKKyAgICAgICAgICAgIGZpeGVkX3NwYXJzZS0+biA9IDM7CisgICAgICAgIH0gZWxzZSB7IC8vIG1vZGUgPD0gTU9ERV83azk1CisgICAgICAgICAgICBwdWxzZV9wb3NpdGlvblswXSA9IGdyYXlfZGVjb2RlWyBmaXhlZF9pbmRleCAgICAgICAgJiA3XTsKKyAgICAgICAgICAgIHB1bHNlX3Bvc2l0aW9uWzFdID0gZ3JheV9kZWNvZGVbKGZpeGVkX2luZGV4ID4+IDMpICAmIDddICsgMTsKKyAgICAgICAgICAgIHB1bHNlX3Bvc2l0aW9uWzJdID0gZ3JheV9kZWNvZGVbKGZpeGVkX2luZGV4ID4+IDYpICAmIDddICsgMjsKKyAgICAgICAgICAgIHB1bHNlX3N1YnNldCAgICAgID0gKGZpeGVkX2luZGV4ID4+IDkpICYgMTsKKyAgICAgICAgICAgIHB1bHNlX3Bvc2l0aW9uWzNdID0gZ3JheV9kZWNvZGVbKGZpeGVkX2luZGV4ID4+IDEwKSAmIDddICsgcHVsc2Vfc3Vic2V0ICsgMzsKKyAgICAgICAgICAgIGZpeGVkX3NwYXJzZS0+biA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpeGVkX3NwYXJzZS0+bjsgaSsrKQorICAgICAgICAgICAgZml4ZWRfc3BhcnNlLT55W2ldID0gKHB1bHNlc1sxXSA+PiBpKSAmIDEgPyAxLjAgOiAtMS4wOworICAgIH0KK30KKworLyoqCisgKiBBcHBseSBwaXRjaCBsYWcgdG8gb2J0YWluIHRoZSBzaGFycGVuZWQgZml4ZWQgdmVjdG9yIChzZWN0aW9uIDYuMS4yKQorICoKKyAqIEBwYXJhbSBwIHRoZSBjb250ZXh0CisgKiBAcGFyYW0gc3ViZnJhbWUgdW5wYWNrZWQgYW1yIHN1YmZyYW1lCisgKiBAcGFyYW0gbW9kZSBtb2RlIG9mIHRoZSBjdXJyZW50IGZyYW1lCisgKiBAcGFyYW0gZml4ZWRfc3BhcnNlIHNwYXJzZSByZXNwcmVzZW50YXRpb24gb2YgdGhlIGZpeGVkIHZlY3RvcgorICovCitzdGF0aWMgdm9pZCBwaXRjaF9zaGFycGVuaW5nKEFNUkNvbnRleHQgKnAsIGludCBzdWJmcmFtZSwgZW51bSBNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUkZpeGVkICpmaXhlZF9zcGFyc2UpCit7CisgICAgLy8gVGhlIHNwZWMgc3VnZ2VzdHMgdGhlIGN1cnJlbnQgcGl0Y2ggZ2FpbiBpcyBhbHdheXMgdXNlZCwgYnV0IGluIG90aGVyCisgICAgLy8gbW9kZXMgdGhlIHBpdGNoIGFuZCBjb2RlYm9vayBnYWlucyBhcmUgam9pbmx5IHF1YW50aXplZCAoc2VjIDUuOC4yKQorICAgIC8vIHNvIHRoZSBjb2RlYm9vayBnYWluIGNhbm5vdCBkZXBlbmQgb24gdGhlIHF1YW50aXplZCBwaXRjaCBnYWluLgorICAgIGlmIChtb2RlID09IE1PREVfMTJrMikKKyAgICAgICAgcC0+YmV0YSA9IEZGTUlOKHAtPnBpdGNoX2dhaW5bNF0sIDEuMCk7CisKKyAgICBmaXhlZF9zcGFyc2UtPnBpdGNoX2xhZyAgPSBwLT5waXRjaF9sYWdfaW50OworICAgIGZpeGVkX3NwYXJzZS0+cGl0Y2hfZmFjICA9IHAtPmJldGE7CisKKyAgICAvLyBTYXZlIHBpdGNoIHNoYXJwZW5pbmcgZmFjdG9yIGZvciB0aGUgbmV4dCBzdWJmcmFtZQorICAgIC8vIE1PREVfNGs3NSBvbmx5IHVwZGF0ZXMgb24gdGhlIDJuZCBhbmQgNHRoIHN1YmZyYW1lcyAtIHRoaXMgZm9sbG93cyBmcm9tCisgICAgLy8gdGhlIGZhY3QgdGhhdCB0aGUgZ2FpbnMgZm9yIHR3byBzdWJmcmFtZXMgYXJlIGpvaW50bHkgcXVhbnRpemVkLgorICAgIGlmIChtb2RlICE9IE1PREVfNGs3NSB8fCBzdWJmcmFtZSAmIDEpCisgICAgICAgIHAtPmJldGEgPSBhdl9jbGlwZihwLT5waXRjaF9nYWluWzRdLCAwLjAsIFNIQVJQX01BWCk7Cit9CisvLy8gQH0KKworCisvLy8gQG5hbWUgQU1SIGdhaW4gZGVjb2RpbmcgZnVuY3Rpb25zCisvLy8gQHsKKworLyoqCisgKiBmaXhlZCBnYWluIHNtb290aGluZworICogTm90ZSB0aGF0IHdoZXJlIHRoZSBzcGVjIHNwZWNpZmllcyB0aGUgInNwZWN0cnVtIGluIHRoZSBxIGRvbWFpbiIKKyAqIGluIHNlY3Rpb24gNi4xLjQsIGluIGZhY3QgZnJlcXVlbmNpZXMgc2hvdWxkIGJlIHVzZWQuCisgKgorICogQHBhcmFtIHAgdGhlIGNvbnRleHQKKyAqIEBwYXJhbSBsc2YgTFNGcyBmb3IgdGhlIGN1cnJlbnQgc3ViZnJhbWUsIGluIHRoZSByYW5nZSBbMCwxXQorICogQHBhcmFtIGxzZl9hdmcgYXZlcmFnZWQgTFNGcworICogQHBhcmFtIG1vZGUgbW9kZSBvZiB0aGUgY3VycmVudCBmcmFtZQorICoKKyAqIEByZXR1cm4gZml4ZWQgZ2FpbiBzbW9vdGhlZAorICovCitzdGF0aWMgZmxvYXQgZml4ZWRfZ2Fpbl9zbW9vdGgoQU1SQ29udGV4dCAqcCAsIGNvbnN0IGZsb2F0ICpsc2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmxzZl9hdmcsIGNvbnN0IGVudW0gTW9kZSBtb2RlKQoreworICAgIGZsb2F0IGRpZmYgPSAwLjA7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBfRklMVEVSX09SREVSOyBpKyspCisgICAgICAgIGRpZmYgKz0gZmFicyhsc2ZfYXZnW2ldIC0gbHNmW2ldKSAvIGxzZl9hdmdbaV07CisKKyAgICAvLyBJZiBkaWZmIGlzIGxhcmdlIGZvciB0ZW4gc3ViZnJhbWVzLCBkaXNhYmxlIHNtb290aGluZyBmb3IgYSA0MC1zdWJmcmFtZQorICAgIC8vIGhhbmdvdmVyIHBlcmlvZC4KKyAgICBwLT5kaWZmX2NvdW50Kys7CisgICAgaWYgKGRpZmYgPD0gMC42NSkKKyAgICAgICAgcC0+ZGlmZl9jb3VudCA9IDA7CisKKyAgICBpZiAocC0+ZGlmZl9jb3VudCA+IDEwKSB7CisgICAgICAgIHAtPmhhbmdfY291bnQgPSAwOworICAgICAgICBwLT5kaWZmX2NvdW50LS07IC8vIGRvbid0IGxldCBkaWZmX2NvdW50IG92ZXJmbG93CisgICAgfQorCisgICAgaWYgKHAtPmhhbmdfY291bnQgPCA0MCkgeworICAgICAgICBwLT5oYW5nX2NvdW50Kys7CisgICAgfSBlbHNlIGlmIChtb2RlIDwgTU9ERV83azQgfHwgbW9kZSA9PSBNT0RFXzEwazIpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgc21vb3RoaW5nX2ZhY3RvciA9IGF2X2NsaXBmKDQuMCAqIGRpZmYgLSAxLjYsIDAuMCwgMS4wKTsKKyAgICAgICAgY29uc3QgZmxvYXQgZml4ZWRfZ2Fpbl9tZWFuID0gKHAtPmZpeGVkX2dhaW5bMF0gKyBwLT5maXhlZF9nYWluWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmZpeGVkX2dhaW5bMl0gKyBwLT5maXhlZF9nYWluWzNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmZpeGVkX2dhaW5bNF0pICogMC4yOworICAgICAgICByZXR1cm4gc21vb3RoaW5nX2ZhY3RvciAqIHAtPmZpeGVkX2dhaW5bNF0gKworICAgICAgICAgICAgICAgKDEuMCAtIHNtb290aGluZ19mYWN0b3IpICogZml4ZWRfZ2Fpbl9tZWFuOworICAgIH0KKyAgICByZXR1cm4gcC0+Zml4ZWRfZ2Fpbls0XTsKK30KKworLyoqCisgKiBEZWNvZGUgcGl0Y2ggZ2FpbiBhbmQgZml4ZWQgZ2FpbiBmYWN0b3IgKHBhcnQgb2Ygc2VjdGlvbiA2LjEuMykuCisgKgorICogQHBhcmFtIHAgdGhlIGNvbnRleHQKKyAqIEBwYXJhbSBhbXJfc3ViZnJhbWUgdW5wYWNrZWQgYW1yIHN1YmZyYW1lCisgKiBAcGFyYW0gbW9kZSBtb2RlIG9mIHRoZSBjdXJyZW50IGZyYW1lCisgKiBAcGFyYW0gc3ViZnJhbWUgY3VycmVudCBzdWJmcmFtZSBudW1iZXIKKyAqIEBwYXJhbSBmaXhlZF9nYWluX2ZhY3RvciBkZWNvZGVkIGdhaW4gY29ycmVjdGlvbiBmYWN0b3IKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX2dhaW5zKEFNUkNvbnRleHQgKnAsIGNvbnN0IEFNUk5CU3ViZnJhbWUgKmFtcl9zdWJmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnVtIE1vZGUgbW9kZSwgY29uc3QgaW50IHN1YmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpmaXhlZF9nYWluX2ZhY3RvcikKK3sKKyAgICBpZiAobW9kZSA9PSBNT0RFXzEyazIgfHwgbW9kZSA9PSBNT0RFXzdrOTUpIHsKKyAgICAgICAgcC0+cGl0Y2hfZ2Fpbls0XSAgID0gcXVhX2dhaW5fcGl0IFthbXJfc3ViZnJhbWUtPnBfZ2FpbiAgICBdCisgICAgICAgICAgICAqICgxLjAgLyAxNjM4NC4wKTsKKyAgICAgICAgKmZpeGVkX2dhaW5fZmFjdG9yID0gcXVhX2dhaW5fY29kZVthbXJfc3ViZnJhbWUtPmZpeGVkX2dhaW5dCisgICAgICAgICAgICAqICgxLjAgLyAgMjA0OC4wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50MTZfdCAqZ2FpbnM7CisKKyAgICAgICAgaWYgKG1vZGUgPj0gTU9ERV82azcpIHsKKyAgICAgICAgICAgIGdhaW5zID0gZ2FpbnNfaGlnaFthbXJfc3ViZnJhbWUtPnBfZ2Fpbl07CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA+PSBNT0RFXzVrMTUpIHsKKyAgICAgICAgICAgIGdhaW5zID0gZ2FpbnNfbG93IFthbXJfc3ViZnJhbWUtPnBfZ2Fpbl07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBnYWluIGluZGV4IGlzIG9ubHkgY29kZWQgaW4gc3ViZnJhbWVzIDAsMiBmb3IgTU9ERV80azc1CisgICAgICAgICAgICBnYWlucyA9IGdhaW5zX01PREVfNGs3NVsocC0+ZnJhbWUuc3ViZnJhbWVbc3ViZnJhbWUgJiAyXS5wX2dhaW4gPDwgMSkgKyAoc3ViZnJhbWUgJiAxKV07CisgICAgICAgIH0KKworICAgICAgICBwLT5waXRjaF9nYWluWzRdICAgPSBnYWluc1swXSAqICgxLjAgLyAxNjM4NC4wKTsKKyAgICAgICAgKmZpeGVkX2dhaW5fZmFjdG9yID0gZ2FpbnNbMV0gKiAoMS4wIC8gIDQwOTYuMCk7CisgICAgfQorfQorCisvLy8gQH0KKworCisvLy8gQG5hbWUgQU1SIHByZXByb2Nlc3NpbmcgZnVuY3Rpb25zCisvLy8gQHsKKworLyoqCisgKiBDaXJjdWxhcmx5IGNvbnZvbHZlIGEgc3BhcnNlIGZpeGVkIHZlY3RvciB3aXRoIGEgcGhhc2UgZGlzcGVyc2lvbiBpbXB1bHNlCisgKiByZXNwb25zZSBmaWx0ZXIgKEQuNi4yIG9mIEcuNzI5IGFuZCA2LjEuNSBvZiBBTVIpLgorICoKKyAqIEBwYXJhbSBvdXQgdmVjdG9yIHdpdGggZmlsdGVyIGFwcGxpZWQKKyAqIEBwYXJhbSBpbiBzb3VyY2UgdmVjdG9yCisgKiBAcGFyYW0gZmlsdGVyIHBoYXNlIGZpbHRlciBjb2VmZmljaWVudHMKKyAqCisgKiAgb3V0W25dID0gc3VtKGksMCxsZW4tMSl7IGluW2ldICogZmlsdGVyWyhsZW4gKyBuIC0gaSklbGVuXSB9CisgKi8KK3N0YXRpYyB2b2lkIGFwcGx5X2lyX2ZpbHRlcihmbG9hdCAqb3V0LCBjb25zdCBBTVJGaXhlZCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmZpbHRlcikKK3sKKyAgICBmbG9hdCBmaWx0ZXIxW0FNUl9TVUJGUkFNRV9TSVpFXSwgICAgIC8vLzwgZmlsdGVycyBhdCBwaXRjaCBsYWcqMSBhbmQgKjIKKyAgICAgICAgICBmaWx0ZXIyW0FNUl9TVUJGUkFNRV9TSVpFXTsKKyAgICBpbnQgICBsYWcgPSBpbi0+cGl0Y2hfbGFnOworICAgIGZsb2F0IGZhYyA9IGluLT5waXRjaF9mYWM7CisgICAgaW50IGk7CisKKyAgICBpZiAobGFnIDwgQU1SX1NVQkZSQU1FX1NJWkUpIHsKKyAgICAgICAgZmZfY2VscF9jaXJjX2FkZGYoZmlsdGVyMSwgZmlsdGVyLCBmaWx0ZXIsIGxhZywgZmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJfU1VCRlJBTUVfU0laRSk7CisKKyAgICAgICAgaWYgKGxhZyA8IEFNUl9TVUJGUkFNRV9TSVpFID4+IDEpCisgICAgICAgICAgICBmZl9jZWxwX2NpcmNfYWRkZihmaWx0ZXIyLCBmaWx0ZXIsIGZpbHRlcjEsIGxhZywgZmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SX1NVQkZSQU1FX1NJWkUpOworICAgIH0KKworICAgIG1lbXNldChvdXQsIDAsIHNpemVvZihmbG9hdCkgKiBBTVJfU1VCRlJBTUVfU0laRSk7CisgICAgZm9yIChpID0gMDsgaSA8IGluLT5uOyBpKyspIHsKKyAgICAgICAgaW50ICAgeCA9IGluLT54W2ldOworICAgICAgICBmbG9hdCB5ID0gaW4tPnlbaV07CisgICAgICAgIGNvbnN0IGZsb2F0ICpmaWx0ZXJwOworCisgICAgICAgIGlmICh4ID49IEFNUl9TVUJGUkFNRV9TSVpFIC0gbGFnKSB7CisgICAgICAgICAgICBmaWx0ZXJwID0gZmlsdGVyOworICAgICAgICB9IGVsc2UgaWYgKHggPj0gQU1SX1NVQkZSQU1FX1NJWkUgLSAobGFnIDw8IDEpKSB7CisgICAgICAgICAgICBmaWx0ZXJwID0gZmlsdGVyMTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBmaWx0ZXJwID0gZmlsdGVyMjsKKworICAgICAgICBmZl9jZWxwX2NpcmNfYWRkZihvdXQsIG91dCwgZmlsdGVycCwgeCwgeSwgQU1SX1NVQkZSQU1FX1NJWkUpOworICAgIH0KK30KKworLyoqCisgKiBSZWR1Y2UgZml4ZWQgdmVjdG9yIHNwYXJzZW5lc3MgYnkgc21vb3RoaW5nIHdpdGggb25lIG9mIHRocmVlIElSIGZpbHRlcnMuCisgKiBBbHNvIGtub3cgYXMgImFkYXB0aXZlIHBoYXNlIGRpc3BlcnNpb24iLgorICoKKyAqIFRoaXMgaW1wbGVtZW50cyAzR1BQIFRTIDI2LjA5MCBzZWN0aW9uIDYuMSg1KS4KKyAqCisgKiBAcGFyYW0gcCB0aGUgY29udGV4dAorICogQHBhcmFtIGZpeGVkX3NwYXJzZSBhbGdlYnJhaWMgY29kZWJvb2sgdmVjdG9yCisgKiBAcGFyYW0gZml4ZWRfdmVjdG9yIHVuZmlsdGVyZWQgZml4ZWQgdmVjdG9yCisgKiBAcGFyYW0gZml4ZWRfZ2FpbiBzbW9vdGhlZCBnYWluCisgKiBAcGFyYW0gb3V0IHNwYWNlIGZvciBtb2RpZmllZCB2ZWN0b3IgaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCAqYW50aV9zcGFyc2VuZXNzKEFNUkNvbnRleHQgKnAsIEFNUkZpeGVkICpmaXhlZF9zcGFyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZml4ZWRfdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZml4ZWRfZ2FpbiwgZmxvYXQgKm91dCkKK3sKKyAgICBpbnQgaXJfZmlsdGVyX25yOworCisgICAgaWYgKHAtPnBpdGNoX2dhaW5bNF0gPCAwLjYpIHsKKyAgICAgICAgaXJfZmlsdGVyX25yID0gMDsgICAgICAvLyBzdHJvbmcgZmlsdGVyaW5nCisgICAgfSBlbHNlIGlmIChwLT5waXRjaF9nYWluWzRdIDwgMC45KSB7CisgICAgICAgIGlyX2ZpbHRlcl9uciA9IDE7ICAgICAgLy8gbWVkaXVtIGZpbHRlcmluZworICAgIH0gZWxzZQorICAgICAgICBpcl9maWx0ZXJfbnIgPSAyOyAgICAgIC8vIG5vIGZpbHRlcmluZworCisgICAgLy8gZGV0ZWN0ICdvbnNldCcKKyAgICBpZiAoZml4ZWRfZ2FpbiA+IDIuMCAqIHAtPnByZXZfc3BhcnNlX2ZpeGVkX2dhaW4pIHsKKyAgICAgICAgcC0+aXJfZmlsdGVyX29uc2V0ID0gMjsKKyAgICB9IGVsc2UgaWYgKHAtPmlyX2ZpbHRlcl9vbnNldCkKKyAgICAgICAgcC0+aXJfZmlsdGVyX29uc2V0LS07CisKKyAgICBpZiAoIXAtPmlyX2ZpbHRlcl9vbnNldCkgeworICAgICAgICBpbnQgaSwgY291bnQgPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgICAgICAgICBpZiAocC0+cGl0Y2hfZ2FpbltpXSA8IDAuNikKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICBpZiAoY291bnQgPiAyKQorICAgICAgICAgICAgaXJfZmlsdGVyX25yID0gMDsKKworICAgICAgICBpZiAoaXJfZmlsdGVyX25yID4gcC0+cHJldl9pcl9maWx0ZXJfbnIgKyAxKQorICAgICAgICAgICAgaXJfZmlsdGVyX25yLS07CisgICAgfSBlbHNlIGlmIChpcl9maWx0ZXJfbnIgPCAyKQorICAgICAgICBpcl9maWx0ZXJfbnIrKzsKKworICAgIC8vIERpc2FibGUgZmlsdGVyaW5nIGZvciB2ZXJ5IGxvdyBsZXZlbCBvZiBmaXhlZF9nYWluLgorICAgIC8vIE5vdGUgdGhpcyBzdGVwIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHRlY2huaWNhbCBkZXNjcmlwdGlvbiBidXQgaXMgaW4KKyAgICAvLyB0aGUgcmVmZXJlbmNlIHNvdXJjZSBpbiB0aGUgZnVuY3Rpb24gUGhfZGlzcC4KKyAgICBpZiAoZml4ZWRfZ2FpbiA8IDUuMCkKKyAgICAgICAgaXJfZmlsdGVyX25yID0gMjsKKworICAgIGlmIChwLT5jdXJfZnJhbWVfbW9kZSAhPSBNT0RFXzdrNCAmJiBwLT5jdXJfZnJhbWVfbW9kZSA8IE1PREVfMTBrMgorICAgICAgICAgJiYgaXJfZmlsdGVyX25yIDwgMikgeworICAgICAgICBhcHBseV9pcl9maWx0ZXIob3V0LCBmaXhlZF9zcGFyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAocC0+Y3VyX2ZyYW1lX21vZGUgPT0gTU9ERV83azk1ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfZmlsdGVyc19sb29rdXBfTU9ERV83azk1IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfZmlsdGVyc19sb29rdXApW2lyX2ZpbHRlcl9ucl0pOworICAgICAgICBmaXhlZF92ZWN0b3IgPSBvdXQ7CisgICAgfQorCisgICAgLy8gdXBkYXRlIGlyIGZpbHRlciBzdHJlbmd0aCBoaXN0b3J5CisgICAgcC0+cHJldl9pcl9maWx0ZXJfbnIgICAgICAgPSBpcl9maWx0ZXJfbnI7CisgICAgcC0+cHJldl9zcGFyc2VfZml4ZWRfZ2FpbiAgPSBmaXhlZF9nYWluOworCisgICAgcmV0dXJuIGZpeGVkX3ZlY3RvcjsKK30KKworLy8vIEB9CisKKworLy8vIEBuYW1lIEFNUiBzeW50aGVzaXMgZnVuY3Rpb25zCisvLy8gQHsKKworLyoqCisgKiBDb25kdWN0IDEwdGggb3JkZXIgbGluZWFyIHByZWRpY3RpdmUgY29kaW5nIHN5bnRoZXNpcy4KKyAqCisgKiBAcGFyYW0gcCAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBBTVJDb250ZXh0CisgKiBAcGFyYW0gbHBjICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBMUEMgY29lZmZpY2llbnRzCisgKiBAcGFyYW0gZml4ZWRfZ2FpbiAgICBmaXhlZCBjb2RlYm9vayBnYWluIGZvciBzeW50aGVzaXMKKyAqIEBwYXJhbSBmaXhlZF92ZWN0b3IgIGFsZ2VicmFpYyBjb2RlYm9vayB2ZWN0b3IKKyAqIEBwYXJhbSBzYW1wbGVzICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBzcGVlY2ggc2FtcGxlcworICogQHBhcmFtIG92ZXJmbG93ICAgICAgMTYtYml0IG92ZXJmbG93IGZsYWcKKyAqLworc3RhdGljIGludCBzeW50aGVzaXMoQU1SQ29udGV4dCAqcCwgZmxvYXQgKmxwYywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZpeGVkX2dhaW4sIGNvbnN0IGZsb2F0ICpmaXhlZF92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqc2FtcGxlcywgdWludDhfdCBvdmVyZmxvdykKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCBleGNpdGF0aW9uW0FNUl9TVUJGUkFNRV9TSVpFXTsKKworICAgIC8vIGlmIGFuIG92ZXJmbG93IGhhcyBiZWVuIGRldGVjdGVkLCB0aGUgcGl0Y2ggdmVjdG9yIGlzIHNjYWxlZCBkb3duIGJ5IGEKKyAgICAvLyBmYWN0b3Igb2YgNAorICAgIGlmIChvdmVyZmxvdykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEFNUl9TVUJGUkFNRV9TSVpFOyBpKyspCisgICAgICAgICAgICBwLT5waXRjaF92ZWN0b3JbaV0gKj0gMC4yNTsKKworICAgIHAtPmFjZWxwdl9jdHgud2VpZ2h0ZWRfdmVjdG9yX3N1bWYoZXhjaXRhdGlvbiwgcC0+cGl0Y2hfdmVjdG9yLCBmaXhlZF92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cGl0Y2hfZ2Fpbls0XSwgZml4ZWRfZ2FpbiwgQU1SX1NVQkZSQU1FX1NJWkUpOworCisgICAgLy8gZW1waGFzaXplIHBpdGNoIHZlY3RvciBjb250cmlidXRpb24KKyAgICBpZiAocC0+cGl0Y2hfZ2Fpbls0XSA+IDAuNSAmJiAhb3ZlcmZsb3cpIHsKKyAgICAgICAgZmxvYXQgZW5lcmd5ID0gcC0+Y2VscG1fY3R4LmRvdF9wcm9kdWN0ZihleGNpdGF0aW9uLCBleGNpdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUl9TVUJGUkFNRV9TSVpFKTsKKyAgICAgICAgZmxvYXQgcGl0Y2hfZmFjdG9yID0KKyAgICAgICAgICAgIHAtPnBpdGNoX2dhaW5bNF0gKgorICAgICAgICAgICAgKHAtPmN1cl9mcmFtZV9tb2RlID09IE1PREVfMTJrMiA/CisgICAgICAgICAgICAgICAgMC4yNSAqIEZGTUlOKHAtPnBpdGNoX2dhaW5bNF0sIDEuMCkgOgorICAgICAgICAgICAgICAgIDAuNSAgKiBGRk1JTihwLT5waXRjaF9nYWluWzRdLCBTSEFSUF9NQVgpKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQU1SX1NVQkZSQU1FX1NJWkU7IGkrKykKKyAgICAgICAgICAgIGV4Y2l0YXRpb25baV0gKz0gcGl0Y2hfZmFjdG9yICogcC0+cGl0Y2hfdmVjdG9yW2ldOworCisgICAgICAgIGZmX3NjYWxlX3ZlY3Rvcl90b19naXZlbl9zdW1fb2Zfc3F1YXJlcyhleGNpdGF0aW9uLCBleGNpdGF0aW9uLCBlbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJfU1VCRlJBTUVfU0laRSk7CisgICAgfQorCisgICAgcC0+Y2VscGZfY3R4LmNlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYoc2FtcGxlcywgbHBjLCBleGNpdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SX1NVQkZSQU1FX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUF9GSUxURVJfT1JERVIpOworCisgICAgLy8gZGV0ZWN0IG92ZXJmbG93CisgICAgZm9yIChpID0gMDsgaSA8IEFNUl9TVUJGUkFNRV9TSVpFOyBpKyspCisgICAgICAgIGlmIChmYWJzZihzYW1wbGVzW2ldKSA+IEFNUl9TQU1QTEVfQk9VTkQpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLy8vIEB9CisKKworLy8vIEBuYW1lIEFNUiB1cGRhdGUgZnVuY3Rpb25zCisvLy8gQHsKKworLyoqCisgKiBVcGRhdGUgYnVmZmVycyBhbmQgaGlzdG9yeSBhdCB0aGUgZW5kIG9mIGRlY29kaW5nIGEgc3ViZnJhbWUuCisgKgorICogQHBhcmFtIHAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQU1SQ29udGV4dAorICovCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdGUoQU1SQ29udGV4dCAqcCkKK3sKKyAgICBtZW1jcHkocC0+cHJldl9sc3Bfc3ViNCwgcC0+bHNwWzNdLCBMUF9GSUxURVJfT1JERVIgKiBzaXplb2YocC0+bHNwWzNdWzBdKSk7CisKKyAgICBtZW1tb3ZlKCZwLT5leGNpdGF0aW9uX2J1ZlswXSwgJnAtPmV4Y2l0YXRpb25fYnVmW0FNUl9TVUJGUkFNRV9TSVpFXSwKKyAgICAgICAgICAgIChQSVRDSF9ERUxBWV9NQVggKyBMUF9GSUxURVJfT1JERVIgKyAxKSAqIHNpemVvZihmbG9hdCkpOworCisgICAgbWVtbW92ZSgmcC0+cGl0Y2hfZ2FpblswXSwgJnAtPnBpdGNoX2dhaW5bMV0sIDQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtZW1tb3ZlKCZwLT5maXhlZF9nYWluWzBdLCAmcC0+Zml4ZWRfZ2FpblsxXSwgNCAqIHNpemVvZihmbG9hdCkpOworCisgICAgbWVtbW92ZSgmcC0+c2FtcGxlc19pblswXSwgJnAtPnNhbXBsZXNfaW5bQU1SX1NVQkZSQU1FX1NJWkVdLAorICAgICAgICAgICAgTFBfRklMVEVSX09SREVSICogc2l6ZW9mKGZsb2F0KSk7Cit9CisKKy8vLyBAfQorCisKKy8vLyBAbmFtZSBBTVIgUG9zdHByb2Nlc3NpbmcgZnVuY3Rpb25zCisvLy8gQHsKKworLyoqCisgKiBHZXQgdGhlIHRpbHQgZmFjdG9yIG9mIGEgZm9ybWFudCBmaWx0ZXIgZnJvbSBpdHMgdHJhbnNmZXIgZnVuY3Rpb24KKyAqCisgKiBAcGFyYW0gcCAgICAgVGhlIENvbnRleHQKKyAqIEBwYXJhbSBscGNfbiBMUF9GSUxURVJfT1JERVIgY29lZmZpY2llbnRzIG9mIHRoZSBudW1lcmF0b3IKKyAqIEBwYXJhbSBscGNfZCBMUF9GSUxURVJfT1JERVIgY29lZmZpY2llbnRzIG9mIHRoZSBkZW5vbWluYXRvcgorICovCitzdGF0aWMgZmxvYXQgdGlsdF9mYWN0b3IoQU1SQ29udGV4dCAqcCwgZmxvYXQgKmxwY19uLCBmbG9hdCAqbHBjX2QpCit7CisgICAgZmxvYXQgcmgwLCByaDE7IC8vIGF1dG9jb3JyZWxhdGlvbiBhdCBsYWcgMCBhbmQgMQorCisgICAgLy8gTFBfRklMVEVSX09SREVSIHByaW9yIHplcm9zIGFyZSBuZWVkZWQgZm9yIGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYKKyAgICBmbG9hdCBpbXB1bHNlX2J1ZmZlcltMUF9GSUxURVJfT1JERVIgKyBBTVJfVElMVF9SRVNQT05TRV0gPSB7IDAgfTsKKyAgICBmbG9hdCAqaGYgPSBpbXB1bHNlX2J1ZmZlciArIExQX0ZJTFRFUl9PUkRFUjsgLy8gc3RhcnQgb2YgaW1wdWxzZSByZXNwb25zZQorCisgICAgaGZbMF0gPSAxLjA7CisgICAgbWVtY3B5KGhmICsgMSwgbHBjX24sIHNpemVvZihmbG9hdCkgKiBMUF9GSUxURVJfT1JERVIpOworICAgIHAtPmNlbHBmX2N0eC5jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXJmKGhmLCBscGNfZCwgaGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJfVElMVF9SRVNQT05TRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQX0ZJTFRFUl9PUkRFUik7CisKKyAgICByaDAgPSBwLT5jZWxwbV9jdHguZG90X3Byb2R1Y3RmKGhmLCBoZiwgICAgIEFNUl9USUxUX1JFU1BPTlNFKTsKKyAgICByaDEgPSBwLT5jZWxwbV9jdHguZG90X3Byb2R1Y3RmKGhmLCBoZiArIDEsIEFNUl9USUxUX1JFU1BPTlNFIC0gMSk7CisKKyAgICAvLyBUaGUgc3BlYyBvbmx5IHNwZWNpZmllcyB0aGlzIGNoZWNrIGZvciAxMi4yIGFuZCAxMC4yIGtiaXQvcworICAgIC8vIG1vZGVzLiBCdXQgaW4gdGhlIHJlZiBzb3VyY2UgdGhlIHRpbHQgaXMgYWx3YXlzIG5vbi1uZWdhdGl2ZS4KKyAgICByZXR1cm4gcmgxID49IDAuMCA/IHJoMSAvIHJoMCAqIEFNUl9USUxUX0dBTU1BX1QgOiAwLjA7Cit9CisKKy8qKgorICogUGVyZm9ybSBhZGFwdGl2ZSBwb3N0LWZpbHRlcmluZyB0byBlbmhhbmNlIHRoZSBxdWFsaXR5IG9mIHRoZSBzcGVlY2guCisgKiBTZWUgc2VjdGlvbiA2LjIuMS4KKyAqCisgKiBAcGFyYW0gcCAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBBTVJDb250ZXh0CisgKiBAcGFyYW0gbHBjICAgICAgICAgICBpbnRlcnBvbGF0ZWQgTFAgY29lZmZpY2llbnRzIGZvciB0aGlzIHN1YmZyYW1lCisgKiBAcGFyYW0gYnVmX291dCAgICAgICBvdXRwdXQgb2YgdGhlIGZpbHRlcgorICovCitzdGF0aWMgdm9pZCBwb3N0ZmlsdGVyKEFNUkNvbnRleHQgKnAsIGZsb2F0ICpscGMsIGZsb2F0ICpidWZfb3V0KQoreworICAgIGludCBpOworICAgIGZsb2F0ICpzYW1wbGVzICAgICAgICAgID0gcC0+c2FtcGxlc19pbiArIExQX0ZJTFRFUl9PUkRFUjsgLy8gU3RhcnQgb2YgaW5wdXQKKworICAgIGZsb2F0IHNwZWVjaF9nYWluICAgICAgID0gcC0+Y2VscG1fY3R4LmRvdF9wcm9kdWN0ZihzYW1wbGVzLCBzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJfU1VCRlJBTUVfU0laRSk7CisKKyAgICBmbG9hdCBwb2xlX291dFtBTVJfU1VCRlJBTUVfU0laRSArIExQX0ZJTFRFUl9PUkRFUl07ICAvLyBPdXRwdXQgb2YgcG9sZSBmaWx0ZXIKKyAgICBjb25zdCBmbG9hdCAqZ2FtbWFfbiwgKmdhbW1hX2Q7ICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JtYW50IGZpbHRlciBmYWN0b3IgdGFibGUKKyAgICBmbG9hdCBscGNfbltMUF9GSUxURVJfT1JERVJdLCBscGNfZFtMUF9GSUxURVJfT1JERVJdOyAvLyBUcmFuc2ZlciBmdW5jdGlvbiBjb2VmZmljaWVudHMKKworICAgIGlmIChwLT5jdXJfZnJhbWVfbW9kZSA9PSBNT0RFXzEyazIgfHwgcC0+Y3VyX2ZyYW1lX21vZGUgPT0gTU9ERV8xMGsyKSB7CisgICAgICAgIGdhbW1hX24gPSBmZl9wb3dfMF83OworICAgICAgICBnYW1tYV9kID0gZmZfcG93XzBfNzU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2FtbWFfbiA9IGZmX3Bvd18wXzU1OworICAgICAgICBnYW1tYV9kID0gZmZfcG93XzBfNzsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgICAgIGxwY19uW2ldID0gbHBjW2ldICogZ2FtbWFfbltpXTsKKyAgICAgICAgIGxwY19kW2ldID0gbHBjW2ldICogZ2FtbWFfZFtpXTsKKyAgICB9CisKKyAgICBtZW1jcHkocG9sZV9vdXQsIHAtPnBvc3RmaWx0ZXJfbWVtLCBzaXplb2YoZmxvYXQpICogTFBfRklMVEVSX09SREVSKTsKKyAgICBwLT5jZWxwZl9jdHguY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZihwb2xlX291dCArIExQX0ZJTFRFUl9PUkRFUiwgbHBjX2QsIHNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJfU1VCRlJBTUVfU0laRSwgTFBfRklMVEVSX09SREVSKTsKKyAgICBtZW1jcHkocC0+cG9zdGZpbHRlcl9tZW0sIHBvbGVfb3V0ICsgQU1SX1NVQkZSQU1FX1NJWkUsCisgICAgICAgICAgIHNpemVvZihmbG9hdCkgKiBMUF9GSUxURVJfT1JERVIpOworCisgICAgcC0+Y2VscGZfY3R4LmNlbHBfbHBfemVyb19zeW50aGVzaXNfZmlsdGVyZihidWZfb3V0LCBscGNfbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sZV9vdXQgKyBMUF9GSUxURVJfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUl9TVUJGUkFNRV9TSVpFLCBMUF9GSUxURVJfT1JERVIpOworCisgICAgZmZfdGlsdF9jb21wZW5zYXRpb24oJnAtPnRpbHRfbWVtLCB0aWx0X2ZhY3RvcihwLCBscGNfbiwgbHBjX2QpLCBidWZfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEFNUl9TVUJGUkFNRV9TSVpFKTsKKworICAgIGZmX2FkYXB0aXZlX2dhaW5fY29udHJvbChidWZfb3V0LCBidWZfb3V0LCBzcGVlY2hfZ2FpbiwgQU1SX1NVQkZSQU1FX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUl9BR0NfQUxQSEEsICZwLT5wb3N0ZmlsdGVyX2FnYyk7Cit9CisKKy8vLyBAfQorCitzdGF0aWMgaW50IGFtcm5iX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKworICAgIEFNUkNvbnRleHQgKnAgPSBhdmN0eC0+cHJpdl9kYXRhOyAgICAgICAgLy8gcG9pbnRlciB0byBwcml2YXRlIGRhdGEKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIGZsb2F0ICpidWZfb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgYnVmZmVyCisgICAgaW50IGksIHN1YmZyYW1lLCByZXQ7CisgICAgZmxvYXQgZml4ZWRfZ2Fpbl9mYWN0b3I7CisgICAgQU1SRml4ZWQgZml4ZWRfc3BhcnNlID0gezB9OyAgICAgICAgICAgICAvLyBmaXhlZCB2ZWN0b3IgdXAgdG8gYW50aS1zcGFyc2VuZXNzIHByb2Nlc3NpbmcKKyAgICBmbG9hdCBzcGFyZV92ZWN0b3JbQU1SX1NVQkZSQU1FX1NJWkVdOyAgIC8vIGV4dHJhIHN0YWNrIHNwYWNlIHRvIGhvbGQgcmVzdWx0IGZyb20gYW50aS1zcGFyc2VuZXNzIHByb2Nlc3NpbmcKKyAgICBmbG9hdCBzeW50aF9maXhlZF9nYWluOyAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXhlZCBnYWluIHRoYXQgc3ludGhlc2lzIHNob3VsZCB1c2UKKyAgICBjb25zdCBmbG9hdCAqc3ludGhfZml4ZWRfdmVjdG9yOyAgICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGZpeGVkIHZlY3RvciB0aGF0IHN5bnRoZXNpcyBzaG91bGQgdXNlCisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gQU1SX0JMT0NLX1NJWkU7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBidWZfb3V0ID0gKGZsb2F0ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICBwLT5jdXJfZnJhbWVfbW9kZSA9IHVucGFja19iaXRzdHJlYW0ocCwgYnVmLCBidWZfc2l6ZSk7CisgICAgaWYgKHAtPmN1cl9mcmFtZV9tb2RlID09IE5PX0RBVEEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3JydXB0IGJpdHN0cmVhbVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAocC0+Y3VyX2ZyYW1lX21vZGUgPT0gTU9ERV9EVFgpIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJkdHggbW9kZSIpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiTm90ZTogbGlib3BlbmNvcmVfYW1ybmIgc3VwcG9ydHMgZHR4XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGlmIChwLT5jdXJfZnJhbWVfbW9kZSA9PSBNT0RFXzEyazIpIHsKKyAgICAgICAgbHNmMmxzcF81KHApOworICAgIH0gZWxzZQorICAgICAgICBsc2YybHNwXzMocCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBmZl9hY2VscF9sc3BkMmxwYyhwLT5sc3BbaV0sIHAtPmxwY1tpXSwgNSk7CisKKyAgICBmb3IgKHN1YmZyYW1lID0gMDsgc3ViZnJhbWUgPCA0OyBzdWJmcmFtZSsrKSB7CisgICAgICAgIGNvbnN0IEFNUk5CU3ViZnJhbWUgKmFtcl9zdWJmcmFtZSA9ICZwLT5mcmFtZS5zdWJmcmFtZVtzdWJmcmFtZV07CisKKyAgICAgICAgZGVjb2RlX3BpdGNoX3ZlY3RvcihwLCBhbXJfc3ViZnJhbWUsIHN1YmZyYW1lKTsKKworICAgICAgICBkZWNvZGVfZml4ZWRfc3BhcnNlKCZmaXhlZF9zcGFyc2UsIGFtcl9zdWJmcmFtZS0+cHVsc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmN1cl9mcmFtZV9tb2RlLCBzdWJmcmFtZSk7CisKKyAgICAgICAgLy8gVGhlIGZpeGVkIGdhaW4gKHNlY3Rpb24gNi4xLjMpIGRlcGVuZHMgb24gdGhlIGZpeGVkIHZlY3RvcgorICAgICAgICAvLyAoc2VjdGlvbiA2LjEuMiksIGJ1dCB0aGUgZml4ZWQgdmVjdG9yIGNhbGN1bGF0aW9uIHVzZXMKKyAgICAgICAgLy8gcGl0Y2ggc2hhcnBlbmluZyBiYXNlZCBvbiB0aGUgb24gdGhlIHBpdGNoIGdhaW4gKHNlY3Rpb24gNi4xLjMpLgorICAgICAgICAvLyBTbyB0aGUgY29ycmVjdCBvcmRlciBpczogcGl0Y2ggZ2FpbiwgcGl0Y2ggc2hhcnBlbmluZywgZml4ZWQgZ2Fpbi4KKyAgICAgICAgZGVjb2RlX2dhaW5zKHAsIGFtcl9zdWJmcmFtZSwgcC0+Y3VyX2ZyYW1lX21vZGUsIHN1YmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgJmZpeGVkX2dhaW5fZmFjdG9yKTsKKworICAgICAgICBwaXRjaF9zaGFycGVuaW5nKHAsIHN1YmZyYW1lLCBwLT5jdXJfZnJhbWVfbW9kZSwgJmZpeGVkX3NwYXJzZSk7CisKKyAgICAgICAgaWYgKGZpeGVkX3NwYXJzZS5waXRjaF9sYWcgPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGUgZmlsZSBpcyBjb3JydXB0ZWQsIHBpdGNoX2xhZyA9IDAgaXMgbm90IGFsbG93ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgZmZfc2V0X2ZpeGVkX3ZlY3RvcihwLT5maXhlZF92ZWN0b3IsICZmaXhlZF9zcGFyc2UsIDEuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJfU1VCRlJBTUVfU0laRSk7CisKKyAgICAgICAgcC0+Zml4ZWRfZ2Fpbls0XSA9CisgICAgICAgICAgICBmZl9hbXJfc2V0X2ZpeGVkX2dhaW4oZml4ZWRfZ2Fpbl9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIHAtPmNlbHBtX2N0eC5kb3RfcHJvZHVjdGYocC0+Zml4ZWRfdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Zml4ZWRfdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SX1NVQkZSQU1FX1NJWkUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJfU1VCRlJBTUVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgcC0+cHJlZGljdGlvbl9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgZW5lcmd5X21lYW5bcC0+Y3VyX2ZyYW1lX21vZGVdLCBlbmVyZ3lfcHJlZF9mYWMpOworCisgICAgICAgIC8vIFRoZSBleGNpdGF0aW9uIGZlZWRiYWNrIGlzIGNhbGN1bGF0ZWQgd2l0aG91dCBhbnkgcHJvY2Vzc2luZyBzdWNoCisgICAgICAgIC8vIGFzIGZpeGVkIGdhaW4gc21vb3RoaW5nLiBUaGlzIGlzbid0IG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEFNUl9TVUJGUkFNRV9TSVpFOyBpKyspCisgICAgICAgICAgICBwLT5leGNpdGF0aW9uW2ldICo9IHAtPnBpdGNoX2dhaW5bNF07CisgICAgICAgIGZmX3NldF9maXhlZF92ZWN0b3IocC0+ZXhjaXRhdGlvbiwgJmZpeGVkX3NwYXJzZSwgcC0+Zml4ZWRfZ2Fpbls0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJfU1VCRlJBTUVfU0laRSk7CisKKyAgICAgICAgLy8gSW4gdGhlIHJlZiBkZWNvZGVyLCBleGNpdGF0aW9uIGlzIHN0b3JlZCB3aXRoIG5vIGZyYWN0aW9uYWwgYml0cy4KKyAgICAgICAgLy8gVGhpcyBzdGVwIHByZXZlbnRzIGJ1enogaW4gc2lsZW50IHBlcmlvZHMuIFRoZSByZWYgZW5jb2RlciBjYW4KKyAgICAgICAgLy8gZW1pdCBsb25nIHNlcXVlbmNlcyB3aXRoIHBpdGNoIGZhY3RvciBncmVhdGVyIHRoYW4gb25lLiBUaGlzCisgICAgICAgIC8vIGNyZWF0ZXMgdW53YW50ZWQgZmVlZGJhY2sgaWYgdGhlIGV4Y2l0YXRpb24gdmVjdG9yIGlzIG5vbnplcm8uCisgICAgICAgIC8vIChlLmcuIHRlc3Qgc2VxdWVuY2UgVDE5Xzc5NS5DT0QgaW4gM0dQUCBUUyAyNi4wNzQpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBTVJfU1VCRlJBTUVfU0laRTsgaSsrKQorICAgICAgICAgICAgcC0+ZXhjaXRhdGlvbltpXSA9IHRydW5jZihwLT5leGNpdGF0aW9uW2ldKTsKKworICAgICAgICAvLyBTbW9vdGggZml4ZWQgZ2Fpbi4KKyAgICAgICAgLy8gVGhlIHNwZWNpZmljYXRpb24gaXMgYW1iaWd1b3VzLCBidXQgaW4gdGhlIHJlZmVyZW5jZSBzb3VyY2UsIHRoZQorICAgICAgICAvLyBzbW9vdGhlZCB2YWx1ZSBpcyBOT1QgZmVkIGJhY2sgaW50byBsYXRlciBmaXhlZCBnYWluIHNtb290aGluZy4KKyAgICAgICAgc3ludGhfZml4ZWRfZ2FpbiA9IGZpeGVkX2dhaW5fc21vb3RoKHAsIHAtPmxzZl9xW3N1YmZyYW1lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmxzZl9hdmcsIHAtPmN1cl9mcmFtZV9tb2RlKTsKKworICAgICAgICBzeW50aF9maXhlZF92ZWN0b3IgPSBhbnRpX3NwYXJzZW5lc3MocCwgJmZpeGVkX3NwYXJzZSwgcC0+Zml4ZWRfdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGhfZml4ZWRfZ2Fpbiwgc3BhcmVfdmVjdG9yKTsKKworICAgICAgICBpZiAoc3ludGhlc2lzKHAsIHAtPmxwY1tzdWJmcmFtZV0sIHN5bnRoX2ZpeGVkX2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgc3ludGhfZml4ZWRfdmVjdG9yLCAmcC0+c2FtcGxlc19pbltMUF9GSUxURVJfT1JERVJdLCAwKSkKKyAgICAgICAgICAgIC8vIG92ZXJmbG93IGRldGVjdGVkIC0+IHJlcnVuIHN5bnRoZXNpcyBzY2FsaW5nIHBpdGNoIHZlY3RvciBkb3duCisgICAgICAgICAgICAvLyBieSBhIGZhY3RvciBvZiA0LCBza2lwcGluZyBwaXRjaCB2ZWN0b3IgY29udHJpYnV0aW9uIGVtcGhhc2lzCisgICAgICAgICAgICAvLyBhbmQgYWRhcHRpdmUgZ2FpbiBjb250cm9sCisgICAgICAgICAgICBzeW50aGVzaXMocCwgcC0+bHBjW3N1YmZyYW1lXSwgc3ludGhfZml4ZWRfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICBzeW50aF9maXhlZF92ZWN0b3IsICZwLT5zYW1wbGVzX2luW0xQX0ZJTFRFUl9PUkRFUl0sIDEpOworCisgICAgICAgIHBvc3RmaWx0ZXIocCwgcC0+bHBjW3N1YmZyYW1lXSwgYnVmX291dCArIHN1YmZyYW1lICogQU1SX1NVQkZSQU1FX1NJWkUpOworCisgICAgICAgIC8vIHVwZGF0ZSBidWZmZXJzIGFuZCBoaXN0b3J5CisgICAgICAgIGZmX2NsZWFyX2ZpeGVkX3ZlY3RvcihwLT5maXhlZF92ZWN0b3IsICZmaXhlZF9zcGFyc2UsIEFNUl9TVUJGUkFNRV9TSVpFKTsKKyAgICAgICAgdXBkYXRlX3N0YXRlKHApOworICAgIH0KKworICAgIHAtPmFjZWxwZl9jdHguYWNlbHBfYXBwbHlfb3JkZXJfMl90cmFuc2Zlcl9mdW5jdGlvbihidWZfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX291dCwgaGlnaHBhc3NfemVyb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdocGFzc19wb2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hwYXNzX2dhaW4gKiBBTVJfU0FNUExFX1NDQUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+aGlnaF9wYXNzX21lbSwgQU1SX0JMT0NLX1NJWkUpOworCisgICAgLyogVXBkYXRlIGF2ZXJhZ2VkIGxzZiB2ZWN0b3IgKHVzZWQgZm9yIGZpeGVkIGdhaW4gc21vb3RoaW5nKS4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCBsc2ZfYXZnIHNob3VsZCBub3QgaW5jb3Jwb3JhdGUgdGhlIGN1cnJlbnQgZnJhbWUncyBMU0ZzCisgICAgICogZm9yIGZpeGVkX2dhaW5fc21vb3RoLgorICAgICAqIFRoZSBzcGVjaWZpY2F0aW9uIGhhcyBhbiBpbmNvcnJlY3QgZm9ybXVsYTogdGhlIHJlZmVyZW5jZSBkZWNvZGVyIHVzZXMKKyAgICAgKiBxYmFyKG4tMSkgcmF0aGVyIHRoYW4gcWJhcihuKSBpbiBzZWN0aW9uIDYuMSg0KSBlcXVhdGlvbiA3MS4gKi8KKyAgICBwLT5hY2VscHZfY3R4LndlaWdodGVkX3ZlY3Rvcl9zdW1mKHAtPmxzZl9hdmcsIHAtPmxzZl9hdmcsIHAtPmxzZl9xWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODQsIDAuMTYsIExQX0ZJTFRFUl9PUkRFUik7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICAvKiByZXR1cm4gdGhlIGFtb3VudCBvZiBieXRlcyBjb25zdW1lZCBpZiBldmVyeXRoaW5nIHdhcyBPSyAqLworICAgIHJldHVybiBmcmFtZV9zaXplc19uYltwLT5jdXJfZnJhbWVfbW9kZV0gKyAxOyAvLyArNyBmb3Igcm91bmRpbmcgYW5kICs4IGZvciBUT0MKK30KKworCitBVkNvZGVjIGZmX2Ftcm5iX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFtcm5iIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQU1SLU5CIChBZGFwdGl2ZSBNdWx0aS1SYXRlIE5hcnJvd0JhbmQpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FNUl9OQiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQU1SQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gYW1ybmJfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gYW1ybmJfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbXJ3YmRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FtcndiZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTA1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hbXJ3YmRhdGEuaApAQCAtMCwwICsxLDE4OTAgQEAKKy8qCisgKiBBTVIgd2lkZWJhbmQgZGF0YSBhbmQgZGVmaW5pdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYXJjZWxvIEdhbHZhbyBQb3ZvYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBTVIgd2lkZWJhbmQgZGF0YSBhbmQgZGVmaW5pdGlvbnMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQU1SV0JEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19BTVJXQkRBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNkZWZpbmUgTFBfT1JERVIgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAvLy88IGxpbmVhciBwcmVkaWN0aXZlIGNvZGluZyBmaWx0ZXIgb3JkZXIKKyNkZWZpbmUgTFBfT1JERVJfMTZrICAgICAgICAyMCAgICAgICAgICAgICAgICAvLy88IGxwYyBmaWx0ZXIgb3JkZXIgYXQgMTZrSHoKKyNkZWZpbmUgSEJfRklSX1NJWkUgICAgICAgICAzMCAgICAgICAgICAgICAgICAvLy88IGFtb3VudCBvZiBwYXN0IGRhdGEgbmVlZGVkIGJ5IEhCIGZpbHRlcnMKKyNkZWZpbmUgVVBTX0ZJUl9TSVpFICAgICAgICAxMiAgICAgICAgICAgICAgICAvLy88IHVwc2FtcGxpbmcgZmlsdGVyIHNpemUKKyNkZWZpbmUgVVBTX01FTV9TSVpFICAgICAgICAoMiAqIFVQU19GSVJfU0laRSkKKworI2RlZmluZSBNSU5fSVNGX1NQQUNJTkcgICAgICgxMjguMCAvIDMyNzY4LjApIC8vLzwgbWluaW11bSBpc2YgZ2FwCisjZGVmaW5lIFBSRURfRkFDVE9SICAgICAgICAgKDEuMCAvIDMuMCkKKyNkZWZpbmUgTUlOX0VORVJHWSAgICAgICAgIC0xNC4wICAgICAgICAgICAgICAvLy88IGluaXRpYWwgaW5ubm92YXRpb24gZW5lcmd5IChkQikKKyNkZWZpbmUgRU5FUkdZX01FQU4gICAgICAgICAzMC4wICAgICAgICAgICAgICAvLy88IG1lYW4gaW5ub3ZhdGlvbiBlbmVyZ3kgKGRCKSBpbiBhbGwgbW9kZXMKKyNkZWZpbmUgUFJFRU1QSF9GQUMgICAgICAgICAwLjY4ICAgICAgICAgICAgICAvLy88IGZhY3RvciB1c2VkIHRvIGRlLWVtcGhhc2l6ZSBzeW50aGVzaXMKKworI2RlZmluZSBBTVJXQl9TRlJfU0laRSAgICAgIDY0ICAgICAgICAgICAgICAgIC8vLzwgc2FtcGxlcyBwZXIgc3ViZnJhbWUgYXQgMTIuOCBrSHoKKyNkZWZpbmUgQU1SV0JfU0ZSX1NJWkVfMTZrICA4MCAgICAgICAgICAgICAgICAvLy88IHNhbXBsZXMgcGVyIHN1YmZyYW1lIGF0IDE2IGtIegorI2RlZmluZSBBTVJXQl9QX0RFTEFZX01BWCAgIDIzMSAgICAgICAgICAgICAgIC8vLzwgbWF4aW11bSBwaXRjaCBkZWxheSB2YWx1ZQorI2RlZmluZSBBTVJXQl9QX0RFTEFZX01JTiAgIDM0CisKKy8qIFJlbGF0aXZlIG1vZGUgb3JkZXJpbmcgaXMgc2Vuc2l0aXZlICovCitlbnVtIE1vZGUgeworICAgIE1PREVfNms2MCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgNi42MCBrYml0L3MKKyAgICBNT0RFXzhrODUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IDguODUga2JpdC9zCisgICAgTU9ERV8xMms2NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCAxMi42NSBrYml0L3MKKyAgICBNT0RFXzE0azI1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IDE0LjI1IGtiaXQvcworICAgIE1PREVfMTVrODUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMTUuODUga2JpdC9zCisgICAgTU9ERV8xOGsyNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCAxOC4yNSBrYml0L3MKKyAgICBNT0RFXzE5azg1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IDE5Ljg1IGtiaXQvcworICAgIE1PREVfMjNrMDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMjMuMDUga2JpdC9zCisgICAgTU9ERV8yM2s4NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCAyMy44NSBrYml0L3MKKyAgICBNT0RFX1NJRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNvbWZvcnQgbm9pc2UgZnJhbWUKKyAgICAvKiAxMC0xMzogIEZ1dHVyZSB1c2UgKi8KKyAgICBTUF9MT1NUID0gMTQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHNwZWVjaCBsb3N0CisgICAgTk9fREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBubyB0cmFuc21pc3Npb24KK307CisKKy8qIEFsbCBkZWNvZGVkIHBhcmFtZXRlcnMgaW4gdGhlc2Ugc3RydWN0cyBtdXN0IGJlIDIgYnl0ZXMgbG9uZworICogYmVjYXVzZSBvZiB0aGUgZGlyZWN0IGluZGV4aW5nIGF0IHRoZSBmcmFtZSBwYXJzaW5nICovCit0eXBlZGVmIHN0cnVjdCBBTVJXQlN1YkZyYW1lIHsKKyAgICB1aW50MTZfdCBhZGFwOyAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGFkYXB0aXZlIGNvZGVib29rIGluZGV4CisgICAgdWludDE2X3QgbHRwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsdHAtZmlsdGVyaW5nIGZsYWcKKyAgICB1aW50MTZfdCB2cV9nYWluOyAgICAgICAgICAgICAgICAgICAgICAvLy88IFZRIGFkYXB0aXZlIGFuZCBpbm5vdmF0aXZlIGdhaW5zCisgICAgdWludDE2X3QgaGJfZ2FpbjsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBoaWdoLWJhbmQgZW5lcmd5IGluZGV4IChtb2RlIDIzazg1IG9ubHkpCisgICAgdWludDE2X3QgcHVsX2loWzRdOyAgICAgICAgICAgICAgICAgICAgLy8vPCBNU0JzIHBhcnQgb2YgY29kZWJvb2sgaW5kZXggKGhpZ2ggbW9kZXMgb25seSkKKyAgICB1aW50MTZfdCBwdWxfaWxbNF07ICAgICAgICAgICAgICAgICAgICAvLy88IExTQnMgcGFydCBvZiBjb2RlYm9vayBpbmRleAorfSBBTVJXQlN1YkZyYW1lOworCit0eXBlZGVmIHN0cnVjdCBBTVJXQkZyYW1lIHsKKyAgICB1aW50MTZfdCB2YWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHZvaWNlIGFjdGl2aXR5IGRldGVjdGlvbiBmbGFnCisgICAgdWludDE2X3QgaXNwX2lkWzddOyAgICAgICAgICAgICAgICAgICAgLy8vPCBpbmRleCBvZiBJU1Agc3VidmVjdG9ycworICAgIEFNUldCU3ViRnJhbWUgc3ViZnJhbWVbNF07ICAgICAgICAgICAgIC8vLzwgZGF0YSBmb3Igc3ViZnJhbWVzCit9IEFNUldCRnJhbWU7CisKKy8qKiBUaGUgaW5kZXggb2YgYSBmcmFtZSBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgQU1SX0JJVChmaWVsZCkgICAgICAgICAgICAgICAgICAob2Zmc2V0b2YoQU1SV0JGcmFtZSwgZmllbGQpKQorLyoqIFRoZSBpbmRleCBvZiBhIHN1YmZyYW1lLXNwZWNpZmljIHBhcmFtZXRlciAqLworI2RlZmluZSBBTVJfT0YoZnJhbWVfbnVtLCB2YXJpYWJsZSkgICAgIEFNUl9CSVQoc3ViZnJhbWVbZnJhbWVfbnVtXS52YXJpYWJsZSkKKworLy9BcyBkZWZpbmVkIGluIDNHUFAgVFMgMjYuMjAxIFY5LjAuMAorLy9UYWJsZXMgZm9yIGJpdCBwYXJzaW5nIGluIENvcmUgRnJhbWUgc3BlZWNoIGZyYW1lcworLy9UaGUgcmVvcmRlcmVkIGJpdHMgYXJlIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgaW1wb3J0YW5jZSBhbmQKKy8vbWF5IGJlIGNvbnRpZ3VvdXNseSBzZXBhcmF0ZWQgaW4gQ2xhc3MgQSwgQiBhbmQgQyBiaXRzLgorCisvLyBFYWNoIGZpZWxkIGluIEFNUldCRnJhbWUgaXMgc3RvcmVkIGFzOgorLy8gKiBvbmUgYnl0ZSBmb3IgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaWVsZAorLy8gKiBvbmUgYnl0ZSBmb3IgdGhlIGZpZWxkIGluZGV4CisvLyAqIHRoZW4sIG9uZSBieXRlIGZvciBlYWNoIGJpdCBvZiB0aGUgZmllbGQgKGZyb20gbW9zdC1zaWduaWZpY2FudCB0byBsZWFzdCkKKy8vICAgICAgICAgb2YgdGhlIHBvc2l0aW9uIG9mIHRoYXQgYml0IGluIHRoZSBBTVIgZnJhbWUuCitzdGF0aWMgY29uc3QgdWludDE2X3Qgb3JkZXJfTU9ERV82azYwW10gPSB7CisgICAgIDEsICAgICAgICAgQU1SX0JJVCh2YWQpLCAgIDcsCisgICAgIDgsICAgQU1SX0JJVChpc3BfaWRbMF0pLCAgMjQsICAzMywgIDM5LCAgMTIsICAgNiwgICA1LCAgIDQsICAxMywKKyAgICAgOCwgICBBTVJfQklUKGlzcF9pZFsxXSksICA2NSwgIDc5LCAgNjQsICA3OCwgIDUxLCAgNjEsICA3MSwgIDcwLAorICAgICA3LCAgIEFNUl9CSVQoaXNwX2lkWzJdKSwgIDUyLCAgNTUsICA0NCwgIDU0LCAgNTMsICA0MywgIDQyLAorICAgICA3LCAgIEFNUl9CSVQoaXNwX2lkWzNdKSwgIDYwLCAgNTksICA1OCwgIDU3LCAgNTYsICA3NSwgIDc0LAorICAgICA2LCAgIEFNUl9CSVQoaXNwX2lkWzRdKSwgIDczLCAgNzIsICA4NiwgIDg3LCAgODUsICA4NCwKKyAgICAgOCwgICAgICBBTVJfT0YoMCwgYWRhcCksICAxMSwgIDEwLCAgIDksICAgOCwgIDI4LCAgMjcsICA0OSwgIDY5LAorICAgICA2LCBBTVJfT0YoMCwgcHVsX2lsWzBdKSwgIDgzLCAgOTEsICA5OSwgMTA3LCAxMTUsIDEyMywKKyAgICAgNiwgQU1SX09GKDAsIHB1bF9pbFsxXSksICA4MiwgMTAzLCAxMTEsIDExOSwgMTI3LCAxMzUsCisgICAgIDYsICAgQU1SX09GKDAsIHZxX2dhaW4pLCAgMzgsICAyMywgIDM0LCAgMTksICAgMywgIDE1LAorICAgICA1LCAgICAgIEFNUl9PRigxLCBhZGFwKSwgIDMyLCAgNDEsICA2MywgIDY3LCAgNzcsCisgICAgIDYsIEFNUl9PRigxLCBwdWxfaWxbMF0pLCAgODEsICA5MCwgIDk4LCAxMDYsIDExNCwgMTIyLAorICAgICA2LCBBTVJfT0YoMSwgcHVsX2lsWzFdKSwgIDgwLCAxMDIsIDExMCwgMTE4LCAxMjYsIDEzNCwKKyAgICAgNiwgICBBTVJfT0YoMSwgdnFfZ2FpbiksICAyNiwgIDIyLCAgMzYsICAxOCwgICAyLCAgMTQsCisgICAgIDUsICAgICAgQU1SX09GKDIsIGFkYXApLCAgNDUsICA0MCwgIDUwLCAgNDgsICA2OCwKKyAgICAgNiwgQU1SX09GKDIsIHB1bF9pbFswXSksICA5NSwgIDg5LCAgOTcsIDEwNSwgMTEzLCAxMjEsCisgICAgIDYsIEFNUl9PRigyLCBwdWxfaWxbMV0pLCAgOTQsIDEwMSwgMTA5LCAxMTcsIDEyNSwgMTMzLAorICAgICA2LCAgIEFNUl9PRigyLCB2cV9nYWluKSwgIDM3LCAgMjEsICAzNSwgIDE3LCAgIDEsICAzMSwKKyAgICAgNSwgICAgICBBTVJfT0YoMywgYWRhcCksICA0NywgIDQ2LCAgNjIsICA2NiwgIDc2LAorICAgICA2LCBBTVJfT0YoMywgcHVsX2lsWzBdKSwgIDkzLCAgODgsICA5NiwgMTA0LCAxMTIsIDEyMCwKKyAgICAgNiwgQU1SX09GKDMsIHB1bF9pbFsxXSksICA5MiwgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzIsCisgICAgIDYsICAgQU1SX09GKDMsIHZxX2dhaW4pLCAgMjUsICAyMCwgIDI5LCAgMTYsICAgMCwgIDMwLAorICAgICAwCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgb3JkZXJfTU9ERV84azg1W10gPSB7CisgICAgIDEsICAgICAgICAgQU1SX0JJVCh2YWQpLCAgIDcsCisgICAgIDgsICAgQU1SX0JJVChpc3BfaWRbMF0pLCAgNDcsICAzMiwgICAyLCAgIDYsICAgMywgICA1LCAgIDQsICA2MCwKKyAgICAgOCwgICBBTVJfQklUKGlzcF9pZFsxXSksICA2OSwgIDUwLCAgNjcsICA0MSwgIDUxLCAgNDksICA1OSwgIDUzLAorICAgICA2LCAgIEFNUl9CSVQoaXNwX2lkWzJdKSwgIDQwLCAgNTUsICA0MywgIDU0LCAgNDIsICA2MiwKKyAgICAgNywgICBBTVJfQklUKGlzcF9pZFszXSksICA2MywgIDQ4LCAgNTIsICA2MSwgIDc3LCAgNzgsICA3MiwKKyAgICAgNywgICBBTVJfQklUKGlzcF9pZFs0XSksICA4NSwgIDU2LCAgODYsICA2OCwgIDc0LCAgNzMsICA4MSwKKyAgICAgNSwgICBBTVJfQklUKGlzcF9pZFs1XSksICA4MiwgIDk1LCAgODAsICA5NCwgIDkxLAorICAgICA1LCAgIEFNUl9CSVQoaXNwX2lkWzZdKSwgIDkwLCAgODksICA4OCwgMTAzLCAgODcsCisgICAgIDgsICAgICAgQU1SX09GKDAsIGFkYXApLCAgIDEsICAgMCwgIDE1LCAgMzUsICAzMywgIDU4LCAgNjQsICA4NCwKKyAgICAgNSwgQU1SX09GKDAsIHB1bF9pbFswXSksIDEwMiwgMTE4LCAxMzQsIDE1MCwgMTY2LAorICAgICA1LCBBTVJfT0YoMCwgcHVsX2lsWzFdKSwgMTAxLCAxMTQsIDEzMCwgMTQ2LCAxNjIsCisgICAgIDUsIEFNUl9PRigwLCBwdWxfaWxbMl0pLCAxMDAsIDEyNiwgMTQyLCAxNTgsIDE3NCwKKyAgICAgNSwgQU1SX09GKDAsIHB1bF9pbFszXSksICA5OSwgMTIyLCAxMzgsIDE1NCwgMTcwLAorICAgICA2LCAgIEFNUl9PRigwLCB2cV9nYWluKSwgIDExLCAgMzksICAxOSwgIDMxLCAgMjcsICAyMywKKyAgICAgNSwgICAgICBBTVJfT0YoMSwgYWRhcCksICA0NiwgIDcxLCAgNjYsICA3NiwgIDkzLAorICAgICA1LCBBTVJfT0YoMSwgcHVsX2lsWzBdKSwgIDk4LCAxMTcsIDEzMywgMTQ5LCAxNjUsCisgICAgIDUsIEFNUl9PRigxLCBwdWxfaWxbMV0pLCAgOTcsIDExMywgMTI5LCAxNDUsIDE2MSwKKyAgICAgNSwgQU1SX09GKDEsIHB1bF9pbFsyXSksICA5NiwgMTI1LCAxNDEsIDE1NywgMTczLAorICAgICA1LCBBTVJfT0YoMSwgcHVsX2lsWzNdKSwgMTExLCAxMjEsIDEzNywgMTUzLCAxNjksCisgICAgIDYsICAgQU1SX09GKDEsIHZxX2dhaW4pLCAgMTAsICAzOCwgIDE4LCAgMzAsICAyNiwgIDIyLAorICAgICA4LCAgICAgIEFNUl9PRigyLCBhZGFwKSwgIDE0LCAgMTMsICAxMiwgIDM0LCAgNDUsICA1NywgIDc5LCAgODMsCisgICAgIDUsIEFNUl9PRigyLCBwdWxfaWxbMF0pLCAxMTAsIDExNiwgMTMyLCAxNDgsIDE2NCwKKyAgICAgNSwgQU1SX09GKDIsIHB1bF9pbFsxXSksIDEwOSwgMTEyLCAxMjgsIDE0NCwgMTYwLAorICAgICA1LCBBTVJfT0YoMiwgcHVsX2lsWzJdKSwgMTA4LCAxMjQsIDE0MCwgMTU2LCAxNzIsCisgICAgIDUsIEFNUl9PRigyLCBwdWxfaWxbM10pLCAxMDcsIDEyMCwgMTM2LCAxNTIsIDE2OCwKKyAgICAgNiwgICBBTVJfT0YoMiwgdnFfZ2FpbiksICAgOSwgIDM3LCAgMTcsICAyOSwgIDI1LCAgMjEsCisgICAgIDUsICAgICAgQU1SX09GKDMsIGFkYXApLCAgNDQsICA3MCwgIDY1LCAgNzUsICA5MiwKKyAgICAgNSwgQU1SX09GKDMsIHB1bF9pbFswXSksIDEwNiwgMTE1LCAxMzEsIDE0NywgMTYzLAorICAgICA1LCBBTVJfT0YoMywgcHVsX2lsWzFdKSwgMTA1LCAxMjcsIDE0MywgMTU5LCAxNzUsCisgICAgIDUsIEFNUl9PRigzLCBwdWxfaWxbMl0pLCAxMDQsIDEyMywgMTM5LCAxNTUsIDE3MSwKKyAgICAgNSwgQU1SX09GKDMsIHB1bF9pbFszXSksIDExOSwgMTM1LCAxNTEsIDE2NywgMTgzLAorICAgICA2LCAgIEFNUl9PRigzLCB2cV9nYWluKSwgICA4LCAgMzYsICAxNiwgIDI4LCAgMjQsICAyMCwKKyAgICAgMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG9yZGVyX01PREVfMTJrNjVbXSA9IHsKKyAgICAgMSwgICAgICAgICBBTVJfQklUKHZhZCksICAgNywKKyAgICAgOCwgICBBTVJfQklUKGlzcF9pZFswXSksICA1NSwgIDQwLCAgMTQsICAgNiwgIDE1LCAgIDUsICAgMCwgIDY4LAorICAgICA4LCAgIEFNUl9CSVQoaXNwX2lkWzFdKSwgIDc3LCAgNTgsICA3NSwgIDQ5LCAgNTksICA1NywgIDY3LCAgNjEsCisgICAgIDYsICAgQU1SX0JJVChpc3BfaWRbMl0pLCAgNDgsICA2MywgIDUxLCAgNjIsICA1MCwgIDcwLAorICAgICA3LCAgIEFNUl9CSVQoaXNwX2lkWzNdKSwgIDcxLCAgNTYsICA2MCwgIDY5LCAgODUsICA4NiwgIDgwLAorICAgICA3LCAgIEFNUl9CSVQoaXNwX2lkWzRdKSwgIDkzLCAgNjQsICA5NCwgIDc2LCAgODIsICA4MSwgIDg5LAorICAgICA1LCAgIEFNUl9CSVQoaXNwX2lkWzVdKSwgIDkwLCAxMDMsICA4OCwgMTAyLCAgOTksCisgICAgIDUsICAgQU1SX0JJVChpc3BfaWRbNl0pLCAgOTgsICA5NywgIDk2LCAxMTEsICA5NSwKKyAgICAgOSwgICAgICBBTVJfT0YoMCwgYWRhcCksICAxMywgIDEyLCAgMTEsICAxMCwgICA5LCAgNDEsICA2NiwgIDcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkyLAorICAgICAxLCAgICAgICBBTVJfT0YoMCwgbHRwKSwgMTEwLAorICAgICA5LCBBTVJfT0YoMCwgcHVsX2lsWzBdKSwgMTA2LCAxMjIsIDE1NCwgMTg2LCAyMTgsIDEzNCwgMTY2LCAxOTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzAsCisgICAgIDksIEFNUl9PRigwLCBwdWxfaWxbMV0pLCAxMDUsIDEzMCwgMTYyLCAxOTQsIDIyNiwgMTQyLCAxNzQsIDIwNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzOCwKKyAgICAgOSwgQU1SX09GKDAsIHB1bF9pbFsyXSksIDEwNCwgMTM4LCAxNzAsIDIwMiwgMjM0LCAxNTAsIDE4MiwgMjE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ2LAorICAgICA5LCBBTVJfT0YoMCwgcHVsX2lsWzNdKSwgMTE5LCAxNDYsIDE3OCwgMjEwLCAyNDIsIDE1OCwgMTkwLCAyMjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTQsCisgICAgIDcsICAgQU1SX09GKDAsIHZxX2dhaW4pLCAgIDQsICAxOSwgIDQ1LCAgMjcsICAzOSwgIDMzLCAgMzEsCisgICAgIDYsICAgICAgQU1SX09GKDEsIGFkYXApLCAgMzUsICA1NCwgIDc5LCAgNzQsICA4NCwgMTAxLAorICAgICAxLCAgICAgICBBTVJfT0YoMSwgbHRwKSwgMTA5LAorICAgICA5LCBBTVJfT0YoMSwgcHVsX2lsWzBdKSwgMTE4LCAxMjEsIDE1MywgMTg1LCAyMTcsIDEzMywgMTY1LCAxOTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjksCisgICAgIDksIEFNUl9PRigxLCBwdWxfaWxbMV0pLCAxMTcsIDEyOSwgMTYxLCAxOTMsIDIyNSwgMTQxLCAxNzMsIDIwNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNywKKyAgICAgOSwgQU1SX09GKDEsIHB1bF9pbFsyXSksIDExNiwgMTM3LCAxNjksIDIwMSwgMjMzLCAxNDksIDE4MSwgMjEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ1LAorICAgICA5LCBBTVJfT0YoMSwgcHVsX2lsWzNdKSwgMTE1LCAxNDUsIDE3NywgMjA5LCAyNDEsIDE1NywgMTg5LCAyMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTMsCisgICAgIDcsICAgQU1SX09GKDEsIHZxX2dhaW4pLCAgIDMsICAxOCwgIDQ0LCAgMjYsICAzOCwgIDMyLCAgMzAsCisgICAgIDksICAgICAgQU1SX09GKDIsIGFkYXApLCAgIDgsICAyMywgIDIyLCAgMjEsICAyMCwgIDUyLCAgNjUsICA4NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MSwKKyAgICAgMSwgICAgICAgQU1SX09GKDIsIGx0cCksIDEwOCwKKyAgICAgOSwgQU1SX09GKDIsIHB1bF9pbFswXSksIDExNCwgMTIwLCAxNTIsIDE4NCwgMjE2LCAxMzIsIDE2NCwgMTk2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI4LAorICAgICA5LCBBTVJfT0YoMiwgcHVsX2lsWzFdKSwgMTEzLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDE0MCwgMTcyLCAyMDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzYsCisgICAgIDksIEFNUl9PRigyLCBwdWxfaWxbMl0pLCAxMTIsIDEzNiwgMTY4LCAyMDAsIDIzMiwgMTQ4LCAxODAsIDIxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0NCwKKyAgICAgOSwgQU1SX09GKDIsIHB1bF9pbFszXSksIDEyNywgMTQ0LCAxNzYsIDIwOCwgMjQwLCAxNTYsIDE4OCwgMjIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUyLAorICAgICA3LCAgIEFNUl9PRigyLCB2cV9nYWluKSwgICAyLCAgMTcsICA0MywgIDI1LCAgMzcsICA0NywgIDI5LAorICAgICA2LCAgICAgIEFNUl9PRigzLCBhZGFwKSwgIDM0LCAgNTMsICA3OCwgIDczLCAgODMsIDEwMCwKKyAgICAgMSwgICAgICAgQU1SX09GKDMsIGx0cCksIDEwNywKKyAgICAgOSwgQU1SX09GKDMsIHB1bF9pbFswXSksIDEyNiwgMTM1LCAxNjcsIDE5OSwgMjMxLCAxMzEsIDE2MywgMTk1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI3LAorICAgICA5LCBBTVJfT0YoMywgcHVsX2lsWzFdKSwgMTI1LCAxNDMsIDE3NSwgMjA3LCAyMzksIDEzOSwgMTcxLCAyMDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzUsCisgICAgIDksIEFNUl9PRigzLCBwdWxfaWxbMl0pLCAxMjQsIDE1MSwgMTgzLCAyMTUsIDI0NywgMTQ3LCAxNzksIDIxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MywKKyAgICAgOSwgQU1SX09GKDMsIHB1bF9pbFszXSksIDEyMywgMTU5LCAxOTEsIDIyMywgMjU1LCAxNTUsIDE4NywgMjE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUxLAorICAgICA3LCAgIEFNUl9PRigzLCB2cV9nYWluKSwgICAxLCAgMTYsICA0MiwgIDI0LCAgMzYsICA0NiwgIDI4LAorICAgICAwCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgb3JkZXJfTU9ERV8xNGsyNVtdID0geworICAgICAxLCAgICAgICAgIEFNUl9CSVQodmFkKSwgICA3LAorICAgICA4LCAgIEFNUl9CSVQoaXNwX2lkWzBdKSwgIDU1LCAgNDAsICAxNCwgICA2LCAgMTUsICAgNSwgICAwLCAgNjgsCisgICAgIDgsICAgQU1SX0JJVChpc3BfaWRbMV0pLCAgNzcsICA1OCwgIDc1LCAgNDksICA1OSwgIDU3LCAgNjcsICA2MSwKKyAgICAgNiwgICBBTVJfQklUKGlzcF9pZFsyXSksICA0OCwgIDYzLCAgNTEsICA2MiwgIDUwLCAgNzAsCisgICAgIDcsICAgQU1SX0JJVChpc3BfaWRbM10pLCAgNzEsICA1NiwgIDYwLCAgNjksICA4NSwgIDg2LCAgODAsCisgICAgIDcsICAgQU1SX0JJVChpc3BfaWRbNF0pLCAgOTMsICA2NCwgIDk0LCAgNzYsICA4MiwgIDgxLCAgODksCisgICAgIDUsICAgQU1SX0JJVChpc3BfaWRbNV0pLCAgOTAsIDEwMywgIDg4LCAxMDIsICA5OSwKKyAgICAgNSwgICBBTVJfQklUKGlzcF9pZFs2XSksICA5OCwgIDk3LCAgOTYsIDExMSwgIDk1LAorICAgICA5LCAgICAgIEFNUl9PRigwLCBhZGFwKSwgIDEzLCAgMTIsICAxMSwgIDEwLCAgIDksICA0MSwgIDY2LCAgNzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTIsCisgICAgIDEsICAgICAgIEFNUl9PRigwLCBsdHApLCAxMTAsCisgICAgMTMsIEFNUl9PRigwLCBwdWxfaWxbMF0pLCAxMTQsIDE4NiwgMjEwLCAyMzQsIDI1OCwgMTA2LCAxMjYsIDE2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3MCwgMTk4LCAyMjIsIDI0NiwgMjcwLAorICAgIDEzLCBBTVJfT0YoMCwgcHVsX2lsWzFdKSwgMTIyLCAxOTQsIDIxOCwgMjQyLCAyNjYsIDExOCwgMTM0LCAxNzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODIsIDIwNiwgMjMwLCAyNTQsIDI3OCwKKyAgICAgOSwgQU1SX09GKDAsIHB1bF9pbFsyXSksIDEzMCwgMTM4LCAxNDYsIDE1NCwgMTc4LCAyMDIsIDIyNiwgMjUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc0LAorICAgICA5LCBBTVJfT0YoMCwgcHVsX2lsWzNdKSwgMTQyLCAxNTAsIDE1OCwgMTY2LCAxOTAsIDIxNCwgMjM4LCAyNjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODYsCisgICAgIDcsICAgQU1SX09GKDAsIHZxX2dhaW4pLCAgIDQsICAxOSwgIDQ1LCAgMjcsICAzOSwgIDMzLCAgMzEsCisgICAgIDYsICAgICAgQU1SX09GKDEsIGFkYXApLCAgMzUsICA1NCwgIDc5LCAgNzQsICA4NCwgMTAxLAorICAgICAxLCAgICAgICBBTVJfT0YoMSwgbHRwKSwgMTA5LAorICAgIDEzLCBBTVJfT0YoMSwgcHVsX2lsWzBdKSwgMTEzLCAxODUsIDIwOSwgMjMzLCAyNTcsIDEwNSwgMTI1LCAxNjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjksIDE5NywgMjIxLCAyNDUsIDI2OSwKKyAgICAxMywgQU1SX09GKDEsIHB1bF9pbFsxXSksIDEyMSwgMTkzLCAyMTcsIDI0MSwgMjY1LCAxMTcsIDEzMywgMTczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgxLCAyMDUsIDIyOSwgMjUzLCAyNzcsCisgICAgIDksIEFNUl9PRigxLCBwdWxfaWxbMl0pLCAxMjksIDEzNywgMTQ1LCAxNTMsIDE3NywgMjAxLCAyMjUsIDI0OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3MywKKyAgICAgOSwgQU1SX09GKDEsIHB1bF9pbFszXSksIDE0MSwgMTQ5LCAxNTcsIDE2NSwgMTg5LCAyMTMsIDIzNywgMjYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg1LAorICAgICA3LCAgIEFNUl9PRigxLCB2cV9nYWluKSwgICAzLCAgMTgsICA0NCwgIDI2LCAgMzgsICAzMiwgIDMwLAorICAgICA5LCAgICAgIEFNUl9PRigyLCBhZGFwKSwgICA4LCAgMjMsICAyMiwgIDIxLCAgMjAsICA1MiwgIDY1LCAgODcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTEsCisgICAgIDEsICAgICAgIEFNUl9PRigyLCBsdHApLCAxMDgsCisgICAgMTMsIEFNUl9PRigyLCBwdWxfaWxbMF0pLCAxMTIsIDE4NCwgMjA4LCAyMzIsIDI1NiwgMTA0LCAxMjQsIDE2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OCwgMTk2LCAyMjAsIDI0NCwgMjY4LAorICAgIDEzLCBBTVJfT0YoMiwgcHVsX2lsWzFdKSwgMTIwLCAxOTIsIDIxNiwgMjQwLCAyNjQsIDExNiwgMTMyLCAxNzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODAsIDIwNCwgMjI4LCAyNTIsIDI3NiwKKyAgICAgOSwgQU1SX09GKDIsIHB1bF9pbFsyXSksIDEyOCwgMTM2LCAxNDQsIDE1MiwgMTc2LCAyMDAsIDIyNCwgMjQ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjcyLAorICAgICA5LCBBTVJfT0YoMiwgcHVsX2lsWzNdKSwgMTQwLCAxNDgsIDE1NiwgMTY0LCAxODgsIDIxMiwgMjM2LCAyNjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODQsCisgICAgIDcsICAgQU1SX09GKDIsIHZxX2dhaW4pLCAgIDIsICAxNywgIDQzLCAgMjUsICAzNywgIDQ3LCAgMjksCisgICAgIDYsICAgICAgQU1SX09GKDMsIGFkYXApLCAgMzQsICA1MywgIDc4LCAgNzMsICA4MywgMTAwLAorICAgICAxLCAgICAgICBBTVJfT0YoMywgbHRwKSwgMTA3LAorICAgIDEzLCBBTVJfT0YoMywgcHVsX2lsWzBdKSwgMTI3LCAxOTksIDIyMywgMjQ3LCAyNzEsIDExOSwgMTIzLCAxNzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODMsIDE5NSwgMjE5LCAyNDMsIDI2NywKKyAgICAxMywgQU1SX09GKDMsIHB1bF9pbFsxXSksIDEzNSwgMjA3LCAyMzEsIDI1NSwgMjc5LCAxMTUsIDEzMSwgMTcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc5LCAyMDMsIDIyNywgMjUxLCAyNzUsCisgICAgIDksIEFNUl9PRigzLCBwdWxfaWxbMl0pLCAxNDMsIDE1MSwgMTU5LCAxNjcsIDE5MSwgMjE1LCAyMzksIDI2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4NywKKyAgICAgOSwgQU1SX09GKDMsIHB1bF9pbFszXSksIDEzOSwgMTQ3LCAxNTUsIDE2MywgMTg3LCAyMTEsIDIzNSwgMjU5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgzLAorICAgICA3LCAgIEFNUl9PRigzLCB2cV9nYWluKSwgICAxLCAgMTYsICA0MiwgIDI0LCAgMzYsICA0NiwgIDI4LAorICAgICAwCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgb3JkZXJfTU9ERV8xNWs4NVtdID0geworICAgICAxLCAgICAgICAgIEFNUl9CSVQodmFkKSwgICA3LAorICAgICA4LCAgIEFNUl9CSVQoaXNwX2lkWzBdKSwgIDU1LCAgNDAsICAxNCwgICA2LCAgMTUsICAgNSwgICAwLCAgNjgsCisgICAgIDgsICAgQU1SX0JJVChpc3BfaWRbMV0pLCAgNzcsICA1OCwgIDc1LCAgNDksICA1OSwgIDU3LCAgNjcsICA2MSwKKyAgICAgNiwgICBBTVJfQklUKGlzcF9pZFsyXSksICA0OCwgIDYzLCAgNTEsICA2MiwgIDUwLCAgNzAsCisgICAgIDcsICAgQU1SX0JJVChpc3BfaWRbM10pLCAgNzEsICA1NiwgIDYwLCAgNjksICA4NSwgIDg2LCAgODAsCisgICAgIDcsICAgQU1SX0JJVChpc3BfaWRbNF0pLCAgOTMsICA2NCwgIDk0LCAgNzYsICA4MiwgIDgxLCAgODksCisgICAgIDUsICAgQU1SX0JJVChpc3BfaWRbNV0pLCAgOTAsIDEwMywgIDg4LCAxMDIsICA5OSwKKyAgICAgNSwgICBBTVJfQklUKGlzcF9pZFs2XSksICA5OCwgIDk3LCAgOTYsIDExMSwgIDk1LAorICAgICA5LCAgICAgIEFNUl9PRigwLCBhZGFwKSwgIDEzLCAgMTIsICAxMSwgIDEwLCAgIDksICA0MSwgIDY2LCAgNzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTIsCisgICAgIDEsICAgICAgIEFNUl9PRigwLCBsdHApLCAxMTAsCisgICAgMTMsIEFNUl9PRigwLCBwdWxfaWxbMF0pLCAxMjIsIDE1NCwgMTcwLCAyMTgsIDI2NiwgMTM4LCAxMDYsIDE4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzMCwgMjc4LCAxNzgsIDIyNiwgMjc0LAorICAgIDEzLCBBTVJfT0YoMCwgcHVsX2lsWzFdKSwgMTM0LCAxNjYsIDE5MCwgMjM4LCAyODYsIDE1MCwgMTE4LCAxODYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzQsIDI4MiwgMTk4LCAyNDYsIDI5NCwKKyAgICAxMywgQU1SX09GKDAsIHB1bF9pbFsyXSksIDEzMCwgMTYyLCAxOTQsIDI0MiwgMjkwLCAxNDYsIDExNCwgMjA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU0LCAzMDIsIDIwMiwgMjUwLCAyOTgsCisgICAgMTMsIEFNUl9PRigwLCBwdWxfaWxbM10pLCAxNDIsIDE3NCwgMjE0LCAyNjIsIDMxMCwgMTU4LCAxMjYsIDIxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1OCwgMzA2LCAyMjIsIDI3MCwgMzE4LAorICAgICA3LCAgIEFNUl9PRigwLCB2cV9nYWluKSwgICA0LCAgMTksICA0NSwgIDI3LCAgMzksICAzMywgIDMxLAorICAgICA2LCAgICAgIEFNUl9PRigxLCBhZGFwKSwgIDM1LCAgNTQsICA3OSwgIDc0LCAgODQsIDEwMSwKKyAgICAgMSwgICAgICAgQU1SX09GKDEsIGx0cCksIDEwOSwKKyAgICAxMywgQU1SX09GKDEsIHB1bF9pbFswXSksIDEyMSwgMTUzLCAxNjksIDIxNywgMjY1LCAxMzcsIDEwNSwgMTgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI5LCAyNzcsIDE3NywgMjI1LCAyNzMsCisgICAgMTMsIEFNUl9PRigxLCBwdWxfaWxbMV0pLCAxMzMsIDE2NSwgMTg5LCAyMzcsIDI4NSwgMTQ5LCAxMTcsIDE4NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzMywgMjgxLCAxOTcsIDI0NSwgMjkzLAorICAgIDEzLCBBTVJfT0YoMSwgcHVsX2lsWzJdKSwgMTI5LCAxNjEsIDE5MywgMjQxLCAyODksIDE0NSwgMTEzLCAyMDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTMsIDMwMSwgMjAxLCAyNDksIDI5NywKKyAgICAxMywgQU1SX09GKDEsIHB1bF9pbFszXSksIDE0MSwgMTczLCAyMTMsIDI2MSwgMzA5LCAxNTcsIDEyNSwgMjA5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU3LCAzMDUsIDIyMSwgMjY5LCAzMTcsCisgICAgIDcsICAgQU1SX09GKDEsIHZxX2dhaW4pLCAgIDMsICAxOCwgIDQ0LCAgMjYsICAzOCwgIDMyLCAgMzAsCisgICAgIDksICAgICAgQU1SX09GKDIsIGFkYXApLCAgIDgsICAyMywgIDIyLCAgMjEsICAyMCwgIDUyLCAgNjUsICA4NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MSwKKyAgICAgMSwgICAgICAgQU1SX09GKDIsIGx0cCksIDEwOCwKKyAgICAxMywgQU1SX09GKDIsIHB1bF9pbFswXSksIDEyMCwgMTUyLCAxNjgsIDIxNiwgMjY0LCAxMzYsIDEwNCwgMTgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI4LCAyNzYsIDE3NiwgMjI0LCAyNzIsCisgICAgMTMsIEFNUl9PRigyLCBwdWxfaWxbMV0pLCAxMzIsIDE2NCwgMTg4LCAyMzYsIDI4NCwgMTQ4LCAxMTYsIDE4NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzMiwgMjgwLCAxOTYsIDI0NCwgMjkyLAorICAgIDEzLCBBTVJfT0YoMiwgcHVsX2lsWzJdKSwgMTI4LCAxNjAsIDE5MiwgMjQwLCAyODgsIDE0NCwgMTEyLCAyMDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTIsIDMwMCwgMjAwLCAyNDgsIDI5NiwKKyAgICAxMywgQU1SX09GKDIsIHB1bF9pbFszXSksIDE0MCwgMTcyLCAyMTIsIDI2MCwgMzA4LCAxNTYsIDEyNCwgMjA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2LCAzMDQsIDIyMCwgMjY4LCAzMTYsCisgICAgIDcsICAgQU1SX09GKDIsIHZxX2dhaW4pLCAgIDIsICAxNywgIDQzLCAgMjUsICAzNywgIDQ3LCAgMjksCisgICAgIDYsICAgICAgQU1SX09GKDMsIGFkYXApLCAgMzQsICA1MywgIDc4LCAgNzMsICA4MywgMTAwLAorICAgICAxLCAgICAgICBBTVJfT0YoMywgbHRwKSwgMTA3LAorICAgIDEzLCBBTVJfT0YoMywgcHVsX2lsWzBdKSwgMTM1LCAxNjcsIDE4MywgMjMxLCAyNzksIDE1MSwgMTE5LCAxNzksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjcsIDI3NSwgMTkxLCAyMzksIDI4NywKKyAgICAxMywgQU1SX09GKDMsIHB1bF9pbFsxXSksIDEzMSwgMTYzLCAxODcsIDIzNSwgMjgzLCAxNDcsIDExNSwgMTk5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ3LCAyOTUsIDE5NSwgMjQzLCAyOTEsCisgICAgMTMsIEFNUl9PRigzLCBwdWxfaWxbMl0pLCAxNDMsIDE3NSwgMjA3LCAyNTUsIDMwMywgMTU5LCAxMjcsIDIwMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1MSwgMjk5LCAyMTUsIDI2MywgMzExLAorICAgIDEzLCBBTVJfT0YoMywgcHVsX2lsWzNdKSwgMTM5LCAxNzEsIDIxMSwgMjU5LCAzMDcsIDE1NSwgMTIzLCAyMjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzEsIDMxOSwgMjE5LCAyNjcsIDMxNSwKKyAgICAgNywgICBBTVJfT0YoMywgdnFfZ2FpbiksICAgMSwgIDE2LCAgNDIsICAyNCwgIDM2LCAgNDYsICAyOCwKKyAgICAgMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG9yZGVyX01PREVfMThrMjVbXSA9IHsKKyAgICAgMSwgICAgICAgICBBTVJfQklUKHZhZCksICAgNywKKyAgICAgOCwgICBBTVJfQklUKGlzcF9pZFswXSksICA1NSwgIDQwLCAgMTQsICAgNiwgIDE1LCAgIDUsICAgMCwgIDY4LAorICAgICA4LCAgIEFNUl9CSVQoaXNwX2lkWzFdKSwgIDc3LCAgNTgsICA3NSwgIDQ5LCAgNTksICA1NywgIDY3LCAgNjEsCisgICAgIDYsICAgQU1SX0JJVChpc3BfaWRbMl0pLCAgNDgsICA2MywgIDUxLCAgNjIsICA1MCwgIDcwLAorICAgICA3LCAgIEFNUl9CSVQoaXNwX2lkWzNdKSwgIDcxLCAgNTYsICA2MCwgIDY5LCAgODUsICA4NiwgIDgwLAorICAgICA3LCAgIEFNUl9CSVQoaXNwX2lkWzRdKSwgIDkzLCAgNjQsICA5NCwgIDc2LCAgODIsICA4MSwgIDg5LAorICAgICA1LCAgIEFNUl9CSVQoaXNwX2lkWzVdKSwgIDkwLCAxMDMsICA4OCwgMTAyLCAgOTksCisgICAgIDUsICAgQU1SX0JJVChpc3BfaWRbNl0pLCAgOTgsICA5NywgIDk2LCAxMTEsICA5NSwKKyAgICAgOSwgICAgICBBTVJfT0YoMCwgYWRhcCksICAxMywgIDEyLCAgMTEsICAxMCwgICA5LCAgNDEsICA2NiwgIDcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkyLAorICAgICAxLCAgICAgICBBTVJfT0YoMCwgbHRwKSwgMTEwLAorICAgICAyLCBBTVJfT0YoMCwgcHVsX2loWzBdKSwgMTI0LCAxMTUsCisgICAgIDIsIEFNUl9PRigwLCBwdWxfaWhbMV0pLCAxNTAsIDExNywKKyAgICAgMiwgQU1SX09GKDAsIHB1bF9paFsyXSksIDEyOSwgMTE0LAorICAgICAyLCBBTVJfT0YoMCwgcHVsX2loWzNdKSwgMTIxLCAxMzEsCisgICAgMTQsIEFNUl9PRigwLCBwdWxfaWxbMF0pLCAxNjEsIDI1NywgMzQzLCAxOTksIDE3NywgMzAzLCAyMDQsIDE3MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OCwgMjYwLCAyNzcsIDMwNywgMzM4LCAxMjgsCisgICAgMTQsIEFNUl9PRigwLCBwdWxfaWxbMV0pLCAxOTQsIDI4NiwgMzQ3LCAyMjIsIDIxNCwgMzE2LCAyMzYsIDE1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NiwgMjQyLCAyODQsIDMwOCwgMzQ0LCAxNDIsCisgICAgMTQsIEFNUl9PRigwLCBwdWxfaWxbMl0pLCAxNjksIDI3MywgMzUzLCAyMDIsIDE4OSwgMzExLCAyNDAsIDIwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3MSwgMjYxLCAzMDksIDI5NiwgMzQ1LCAxMzAsCisgICAgMTQsIEFNUl9PRigwLCBwdWxfaWxbM10pLCAxOTgsIDI3NSwgMzQ5LCAxODcsIDE2MywgMjgyLCAxOTMsIDE5NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NSwgMjM0LCAyNjUsIDI4OSwgMzI4LCAxMTksCisgICAgIDcsICAgQU1SX09GKDAsIHZxX2dhaW4pLCAgIDQsICAxOSwgIDQ1LCAgMjcsICAzOSwgIDMzLCAgMzEsCisgICAgIDYsICAgICAgQU1SX09GKDEsIGFkYXApLCAgMzUsICA1NCwgIDc5LCAgNzQsICA4NCwgMTAxLAorICAgICAxLCAgICAgICBBTVJfT0YoMSwgbHRwKSwgMTA5LAorICAgICAyLCBBTVJfT0YoMSwgcHVsX2loWzBdKSwgMTM5LCAxMDQsCisgICAgIDIsIEFNUl9PRigxLCBwdWxfaWhbMV0pLCAxMzUsIDExOCwKKyAgICAgMiwgQU1SX09GKDEsIHB1bF9paFsyXSksIDExMiwgMTI3LAorICAgICAyLCBBTVJfT0YoMSwgcHVsX2loWzNdKSwgMTQwLCAxNDEsCisgICAgMTQsIEFNUl9PRigxLCBwdWxfaWxbMF0pLCAxNzksIDI3NiwgMzQwLCAyMjUsIDIyMywgMzIxLCAyMzUsIDE5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MiwgMjcxLCAzMTAsIDMxNSwgMzUyLCAxMjUsCisgICAgMTQsIEFNUl9PRigxLCBwdWxfaWxbMV0pLCAxNTMsIDI2NCwgMzI5LCAyMzIsIDIwOSwgMzIzLCAyMzEsIDE2NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MSwgMjc5LCAyOTAsIDMxMiwgMzY3LCAxMzQsCisgICAgMTQsIEFNUl9PRigxLCBwdWxfaWxbMl0pLCAxNjcsIDI2OSwgMzQxLCAyMDUsIDE5NywgMjk4LCAyMjQsIDE2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3MCwgMjU5LCAyODAsIDMxNywgMzU3LCAxNDgsCisgICAgMTQsIEFNUl9PRigxLCBwdWxfaWxbM10pLCAyMDMsIDI3MiwgMzQyLCAyMjcsIDE5MiwgMjk5LCAyMzMsIDE3MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MywgMjU2LCAyODMsIDMyNiwgMzU1LCAxMDYsCisgICAgIDcsICAgQU1SX09GKDEsIHZxX2dhaW4pLCAgIDMsICAxOCwgIDQ0LCAgMjYsICAzOCwgIDMyLCAgMzAsCisgICAgIDksICAgICAgQU1SX09GKDIsIGFkYXApLCAgIDgsICAyMywgIDIyLCAgMjEsICAyMCwgIDUyLCAgNjUsICA4NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MSwKKyAgICAgMSwgICAgICAgQU1SX09GKDIsIGx0cCksIDEwOCwKKyAgICAgMiwgQU1SX09GKDIsIHB1bF9paFswXSksIDE0NCwgMTIwLAorICAgICAyLCBBTVJfT0YoMiwgcHVsX2loWzFdKSwgMTU3LCAxMjMsCisgICAgIDIsIEFNUl9PRigyLCBwdWxfaWhbMl0pLCAxNDUsIDEzOCwKKyAgICAgMiwgQU1SX09GKDIsIHB1bF9paFszXSksIDEzMiwgMTU0LAorICAgIDE0LCBBTVJfT0YoMiwgcHVsX2lsWzBdKSwgMjQxLCAzMTksIDM2NSwgMjUyLCAyNTMsIDMzMSwgMjU0LCAyMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjAsIDI2MywgMjg1LCAzMTQsIDM2NCwgMTU2LAorICAgIDE0LCBBTVJfT0YoMiwgcHVsX2lsWzFdKSwgMjQ3LCAyOTEsIDMzOSwgMjQ5LCAyNTAsIDMzMiwgMjY3LCAxOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDcsIDI2OCwgMzA0LCAzMjQsIDM1NiwgMTU4LAorICAgIDE0LCBBTVJfT0YoMiwgcHVsX2lsWzJdKSwgMjEwLCAzMDAsIDM0OCwgMjQzLCAyMzcsIDMzMywgMjQ2LCAyMDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTksIDI2NiwgMzE4LCAzMzUsIDM2MywgMTU5LAorICAgIDE0LCBBTVJfT0YoMiwgcHVsX2lsWzNdKSwgMjM5LCAzMDYsIDM2NiwgMjIxLCAyMjYsIDI5NywgMjUxLCAxODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzgsIDI1OCwgMjkyLCAzMDUsIDM0NiwgMTE2LAorICAgICA3LCAgIEFNUl9PRigyLCB2cV9nYWluKSwgICAyLCAgMTcsICA0MywgIDI1LCAgMzcsICA0NywgIDI5LAorICAgICA2LCAgICAgIEFNUl9PRigzLCBhZGFwKSwgIDM0LCAgNTMsICA3OCwgIDczLCAgODMsIDEwMCwKKyAgICAgMSwgICAgICAgQU1SX09GKDMsIGx0cCksIDEwNywKKyAgICAgMiwgQU1SX09GKDMsIHB1bF9paFswXSksIDE0MywgMTI2LAorICAgICAyLCBBTVJfT0YoMywgcHVsX2loWzFdKSwgMTM3LCAxMjIsCisgICAgIDIsIEFNUl9PRigzLCBwdWxfaWhbMl0pLCAxNDksIDEwNSwKKyAgICAgMiwgQU1SX09GKDMsIHB1bF9paFszXSksIDEzMywgMTM2LAorICAgIDE0LCBBTVJfT0YoMywgcHVsX2lsWzBdKSwgMTYyLCAyODcsIDMzNywgMjQ0LCAyMjksIDMyMiwgMjE4LCAxODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODYsIDI2MiwgMjc0LCAyODgsIDM1MSwgMTQ2LAorICAgIDE0LCBBTVJfT0YoMywgcHVsX2lsWzFdKSwgMjEyLCAyOTQsIDM1OCwgMjQ4LCAyMjgsIDMzNCwgMjE1LCAxNzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzYsIDI3MCwgMjkzLCAzMDEsIDM1NCwgMTQ3LAorICAgIDE0LCBBTVJfT0YoMywgcHVsX2lsWzJdKSwgMTg1LCAzMjcsIDMzNiwgMjExLCAyMTMsIDMxMywgMjQ1LCAxODEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODgsIDI1NSwgMjgxLCAzMjUsIDM1MCwgMTUxLAorICAgIDE0LCBBTVJfT0YoMywgcHVsX2lsWzNdKSwgMjAxLCAyOTUsIDM1OSwgMjE2LCAyMDgsIDMyMCwgMjM4LCAxNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTUsIDIxNywgMjc4LCAzMDIsIDMzMCwgMTEzLAorICAgICA3LCAgIEFNUl9PRigzLCB2cV9nYWluKSwgICAxLCAgMTYsICA0MiwgIDI0LCAgMzYsICA0NiwgIDI4LAorICAgICAwCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgb3JkZXJfTU9ERV8xOWs4NVtdID0geworICAgICAxLCAgICAgICAgIEFNUl9CSVQodmFkKSwgICA3LAorICAgICA4LCAgIEFNUl9CSVQoaXNwX2lkWzBdKSwgIDU1LCAgNDAsICAxNCwgICA2LCAgMTUsICAgNSwgICAwLCAgNjgsCisgICAgIDgsICAgQU1SX0JJVChpc3BfaWRbMV0pLCAgNzcsICA1OCwgIDc1LCAgNDksICA1OSwgIDU3LCAgNjcsICA2MSwKKyAgICAgNiwgICBBTVJfQklUKGlzcF9pZFsyXSksICA0OCwgIDYzLCAgNTEsICA2MiwgIDUwLCAgNzAsCisgICAgIDcsICAgQU1SX0JJVChpc3BfaWRbM10pLCAgNzEsICA1NiwgIDYwLCAgNjksICA4NSwgIDg2LCAgODAsCisgICAgIDcsICAgQU1SX0JJVChpc3BfaWRbNF0pLCAgOTMsICA2NCwgIDk0LCAgNzYsICA4MiwgIDgxLCAgODksCisgICAgIDUsICAgQU1SX0JJVChpc3BfaWRbNV0pLCAgOTAsIDEwMywgIDg4LCAxMDIsICA5OSwKKyAgICAgNSwgICBBTVJfQklUKGlzcF9pZFs2XSksICA5OCwgIDk3LCAgOTYsIDExMSwgIDk1LAorICAgICA5LCAgICAgIEFNUl9PRigwLCBhZGFwKSwgIDEzLCAgMTIsICAxMSwgIDEwLCAgIDksICA0MSwgIDY2LCAgNzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTIsCisgICAgIDEsICAgICAgIEFNUl9PRigwLCBsdHApLCAxMTAsCisgICAgMTAsIEFNUl9PRigwLCBwdWxfaWhbMF0pLCAxMzQsIDE1MywgMjYzLCAzNDIsIDM5OSwgMTU0LCAxMDYsIDE3NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNywgMjY1LAorICAgIDEwLCBBTVJfT0YoMCwgcHVsX2loWzFdKSwgMTI4LCAxNjcsIDI3MCwgMzUxLCAzODUsIDE2MCwgMTA1LCAyMTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjksIDI1OSwKKyAgICAgMiwgQU1SX09GKDAsIHB1bF9paFsyXSksIDEyMywgMTQ3LAorICAgICAyLCBBTVJfT0YoMCwgcHVsX2loWzNdKSwgMTMxLCAxNDMsCisgICAgMTAsIEFNUl9PRigwLCBwdWxfaWxbMF0pLCAzNDYsIDExOCwgMTcwLCAyMDEsIDI5NiwgMzY4LCAyNTAsIDI4NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0MSwgMzkxLAorICAgIDEwLCBBTVJfT0YoMCwgcHVsX2lsWzFdKSwgMzQ1LCAxMDQsIDE2NiwgMTk2LCAyODEsIDM3NCwgMjQyLCAyNjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjcsIDM5MCwKKyAgICAxNCwgQU1SX09GKDAsIHB1bF9pbFsyXSksIDE0MSwgMTcxLCAyOTEsIDM2NCwgMjI5LCAyMTAsIDMwOCwgMjI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA2LCAyMDAsIDI1OCwgMjk1LCAzMTMsIDM2MSwKKyAgICAxNCwgQU1SX09GKDAsIHB1bF9pbFszXSksIDE0NCwgMTg4LCAyODIsIDM2NiwgMjE3LCAyMTYsIDMwOSwgMjE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkzLCAxODIsIDI0NSwgMjg3LCAzMDAsIDM2NywKKyAgICAgNywgICBBTVJfT0YoMCwgdnFfZ2FpbiksICAgNCwgIDE5LCAgNDUsICAyNywgIDM5LCAgMzMsICAzMSwKKyAgICAgNiwgICAgICBBTVJfT0YoMSwgYWRhcCksICAzNSwgIDU0LCAgNzksICA3NCwgIDg0LCAxMDEsCisgICAgIDEsICAgICAgIEFNUl9PRigxLCBsdHApLCAxMDksCisgICAgMTAsIEFNUl9PRigxLCBwdWxfaWhbMF0pLCAxMzksIDE2OSwgMjY3LCAzNDgsIDM4OSwgMTYzLCAxMTYsIDE4OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0MywgMjY4LAorICAgIDEwLCBBTVJfT0YoMSwgcHVsX2loWzFdKSwgMTIwLCAxNjEsIDI0OSwgMzM5LCAzOTcsIDE1MiwgMTE0LCAyMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzQsIDMwMywKKyAgICAgMiwgQU1SX09GKDEsIHB1bF9paFsyXSksIDEyNSwgMTM4LAorICAgICAyLCBBTVJfT0YoMSwgcHVsX2loWzNdKSwgMTEyLCAxMjksCisgICAgMTAsIEFNUl9PRigxLCBwdWxfaWxbMF0pLCAzNDksIDEyMiwgMTYyLCAyMDMsIDI4OCwgMzcyLCAyNzgsIDI3NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxMiwgMzc3LAorICAgIDEwLCBBTVJfT0YoMSwgcHVsX2lsWzFdKSwgMzU3LCAxMjYsIDE2NSwgMjE0LCAyOTgsIDM2MiwgMjUyLCAyNjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjEsIDM3OCwKKyAgICAxNCwgQU1SX09GKDEsIHB1bF9pbFsyXSksIDE1MCwgMTk5LCAyNjYsIDM1NSwgMjExLCAxODAsIDI4NSwgMjQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk1LCAxOTgsIDI0MywgMjc1LCAzMjMsIDM3NSwKKyAgICAxNCwgQU1SX09GKDEsIHB1bF9pbFszXSksIDE0MiwgMTkxLCAyNTYsIDM1MywgMjA4LCAyMjAsIDMxNCwgMjM3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkwLCAyMTIsIDI1NSwgMzA0LCAzMTgsIDM3MSwKKyAgICAgNywgICBBTVJfT0YoMSwgdnFfZ2FpbiksICAgMywgIDE4LCAgNDQsICAyNiwgIDM4LCAgMzIsICAzMCwKKyAgICAgOSwgICAgICBBTVJfT0YoMiwgYWRhcCksICAgOCwgIDIzLCAgMjIsICAyMSwgIDIwLCAgNTIsICA2NSwgIDg3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxLAorICAgICAxLCAgICAgICBBTVJfT0YoMiwgbHRwKSwgMTA4LAorICAgIDEwLCBBTVJfT0YoMiwgcHVsX2loWzBdKSwgMTU5LCAxNjgsIDMwMiwgMzU2LCAzOTUsIDE3OCwgMTMyLCAxODUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzAsIDI4NiwKKyAgICAxMCwgQU1SX09GKDIsIHB1bF9paFsxXSksIDE1OCwgMTgxLCAyOTIsIDM1OCwgMzk2LCAxNzYsIDEzMywgMjM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMxLCAyNzYsCisgICAgIDIsIEFNUl9PRigyLCBwdWxfaWhbMl0pLCAxMzAsIDE1NywKKyAgICAgMiwgQU1SX09GKDIsIHB1bF9paFszXSksIDEyNCwgMTM2LAorICAgIDEwLCBBTVJfT0YoMiwgcHVsX2lsWzBdKSwgMzU0LCAxMjEsIDE5NCwgMjQ2LCAzMjIsIDM3OSwgMjcyLCAyNzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzIsIDM5OCwKKyAgICAxMCwgQU1SX09GKDIsIHB1bF9pbFsxXSksIDM1OSwgMTQwLCAxODYsIDIzNiwgMzMzLCAzNzYsIDI5MCwgMzAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzM4LCAzODcsCisgICAgMTQsIEFNUl9PRigyLCBwdWxfaWxbMl0pLCAxNTUsIDIyNywgMzE5LCAzNjksIDI1MywgMjU0LCAzNTAsIDI0OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNCwgMjM5LCAyNDAsIDI5MywgMzE1LCAzODMsCisgICAgMTQsIEFNUl9PRigyLCBwdWxfaWxbM10pLCAxNTYsIDIwOSwgMjk3LCAzNzMsIDIyNSwgMjE1LCAzMjYsIDI0NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NywgMTg0LCAyMzIsIDI4OSwgMzEwLCAzNjUsCisgICAgIDcsICAgQU1SX09GKDIsIHZxX2dhaW4pLCAgIDIsICAxNywgIDQzLCAgMjUsICAzNywgIDQ3LCAgMjksCisgICAgIDYsICAgICAgQU1SX09GKDMsIGFkYXApLCAgMzQsICA1MywgIDc4LCAgNzMsICA4MywgMTAwLAorICAgICAxLCAgICAgICBBTVJfT0YoMywgbHRwKSwgMTA3LAorICAgIDEwLCBBTVJfT0YoMywgcHVsX2loWzBdKSwgMTQ4LCAxNjQsIDI2NCwgMzQwLCAzODgsIDE4MywgMTE3LCAyMDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzYsIDI2MSwKKyAgICAxMCwgQU1SX09GKDMsIHB1bF9paFsxXSksIDE0NiwgMTc0LCAyNTcsIDMzNSwgMzg0LCAxNzMsIDExMywgMTg3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwLCAyNzksCisgICAgIDIsIEFNUl9PRigzLCBwdWxfaWhbMl0pLCAxMjcsIDE1MSwKKyAgICAgMiwgQU1SX09GKDMsIHB1bF9paFszXSksIDExOSwgMTM3LAorICAgIDEwLCBBTVJfT0YoMywgcHVsX2lsWzBdKSwgMzUyLCAxMzUsIDE3MiwgMjM4LCAzMDYsIDM4MSwgMjYyLCAyNzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjgsIDM4MiwKKyAgICAxMCwgQU1SX09GKDMsIHB1bF9pbFsxXSksIDM0NywgMTE1LCAxNzksIDIxOSwgMzA1LCAzODAsIDI3NywgMjk0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzM3LCAzODYsCisgICAgMTQsIEFNUl9PRigzLCBwdWxfaWxbMl0pLCAxNDUsIDE5MiwgMzA3LCAzNzAsIDIzNCwgMjIzLCAzMjQsIDI0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMiwgMjA0LCAyNTEsIDI5OSwgMzI1LCAzNjAsCisgICAgMTQsIEFNUl9PRigzLCBwdWxfaWxbM10pLCAxNDksIDIyMSwgMzExLCAzNjMsIDIyNiwgMjIyLCAzMTYsIDIzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNywgMTc1LCAyMzMsIDI4MCwgMjgzLCAzNDQsCisgICAgIDcsICAgQU1SX09GKDMsIHZxX2dhaW4pLCAgIDEsICAxNiwgIDQyLCAgMjQsICAzNiwgIDQ2LCAgMjgsCisgICAgIDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBvcmRlcl9NT0RFXzIzazA1W10gPSB7CisgICAgIDEsICAgICAgICAgQU1SX0JJVCh2YWQpLCAgIDcsCisgICAgIDgsICAgQU1SX0JJVChpc3BfaWRbMF0pLCAgNTUsICA0MCwgIDE0LCAgIDYsICAxNSwgICA1LCAgIDAsICA2OCwKKyAgICAgOCwgICBBTVJfQklUKGlzcF9pZFsxXSksICA3NywgIDU4LCAgNzUsICA0OSwgIDU5LCAgNTcsICA2NywgIDYxLAorICAgICA2LCAgIEFNUl9CSVQoaXNwX2lkWzJdKSwgIDQ4LCAgNjMsICA1MSwgIDYyLCAgNTAsICA3MCwKKyAgICAgNywgICBBTVJfQklUKGlzcF9pZFszXSksICA3MSwgIDU2LCAgNjAsICA2OSwgIDg1LCAgODYsICA4MCwKKyAgICAgNywgICBBTVJfQklUKGlzcF9pZFs0XSksICA5MywgIDY0LCAgOTQsICA3NiwgIDgyLCAgODEsICA4OSwKKyAgICAgNSwgICBBTVJfQklUKGlzcF9pZFs1XSksICA5MCwgMTAzLCAgODgsIDEwMiwgIDk5LAorICAgICA1LCAgIEFNUl9CSVQoaXNwX2lkWzZdKSwgIDk4LCAgOTcsICA5NiwgMTExLCAgOTUsCisgICAgIDksICAgICAgQU1SX09GKDAsIGFkYXApLCAgMTMsICAxMiwgIDExLCAgMTAsICAgOSwgIDQxLCAgNjYsICA3MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MiwKKyAgICAgMSwgICAgICAgQU1SX09GKDAsIGx0cCksIDExMCwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9paFswXSksIDExOCwgMTI5LCAxMzEsIDE1MywgMTcwLCAyODIsIDI5OCwgMjEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkxLCAzNTcsIDMxNywKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9paFsxXSksIDEyNiwgMTQ2LCAxMzUsIDE2NSwgMTg3LCAyNzMsIDM0NSwgMjk1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcyLCAzMzgsIDM0MCwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9paFsyXSksIDExOSwgMTM3LCAxNDEsIDE2NywgMjA4LCAzMDQsIDM2NiwgMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc3LCAzMzksIDMyOCwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9paFszXSksIDExNiwgMTMwLCAxMjAsIDE2NiwgMTkwLCAyNTIsIDMxMSwgMjM5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTczLCAzNDMsIDMxOCwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9pbFswXSksIDI0NSwgMTgwLCAzNDIsIDQyNCwgMjU5LCAyNzcsIDI2NiwgMzgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzk4LCA0MjMsIDQ0MCwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9pbFsxXSksIDIxOCwgMjA3LCAzNjcsIDQzNCwgMjAxLCAyNDAsIDI3NSwgMzYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzk5LCA0MTksIDQ1MiwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9pbFsyXSksIDI3NCwgMTg4LCAzNDgsIDQyNSwgMjQyLCAyMDQsIDI2MiwgMzY1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAyLCA0MzEsIDQ2MywKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9pbFszXSksIDIyMSwgMTgzLCAzMzcsIDQzOSwgMjQzLCAyMTYsIDI1MSwgMzU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzkwLCA0MTEsIDQ2MiwKKyAgICAgNywgICBBTVJfT0YoMCwgdnFfZ2FpbiksICAgNCwgIDE5LCAgNDUsICAyNywgIDM5LCAgMzMsICAzMSwKKyAgICAgNiwgICAgICBBTVJfT0YoMSwgYWRhcCksICAzNSwgIDU0LCAgNzksICA3NCwgIDg0LCAxMDEsCisgICAgIDEsICAgICAgIEFNUl9PRigxLCBsdHApLCAxMDksCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWhbMF0pLCAxMTUsIDE0MCwgMTQyLCAxNjEsIDIzMCwgMjkxLCAzNTEsIDIzNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MSwgMjkzLCAzMTAsCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWhbMV0pLCAxMDQsIDEzOCwgMTMyLCAxNjIsIDIxMSwgMzE1LCAzNDcsIDIzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NiwgMzIwLCAzMjksCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWhbMl0pLCAxMDYsIDEzNCwgMTI1LCAxNTQsIDIwNSwgMjY3LCAzMDYsIDIyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4NSwgMzMwLCAyOTcsCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWhbM10pLCAxMDUsIDE0OCwgMTIyLCAxNTIsIDIxNSwgMzAyLCAzNTAsIDI1NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OCwgMzE5LCAzMTMsCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWxbMF0pLCAyNjksIDE4OSwgMzgyLCA0MzIsIDI3MiwgMjI4LCAyNjMsIDM4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwNiwgNDIyLCA0NTMsCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWxbMV0pLCAyODYsIDIwNiwgMzc3LCA0NDYsIDIyNiwgMjIyLCAyNjUsIDM2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwNCwgNDE2LCA0NTQsCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWxbMl0pLCAyNDcsIDE5NSwgMzU4LCA0NDUsIDIyNCwgMjM2LCAzMDksIDM0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3NSwgNDA4LCA0NDksCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWxbM10pLCAyMjUsIDE5MiwgMzU5LCA0MzYsIDI1MCwgMjU4LCAyOTAsIDM4OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMCwgNDIwLCA0NDgsCisgICAgIDcsICAgQU1SX09GKDEsIHZxX2dhaW4pLCAgIDMsICAxOCwgIDQ0LCAgMjYsICAzOCwgIDMyLCAgMzAsCisgICAgIDksICAgICAgQU1SX09GKDIsIGFkYXApLCAgIDgsICAyMywgIDIyLCAgMjEsICAyMCwgIDUyLCAgNjUsICA4NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MSwKKyAgICAgMSwgICAgICAgQU1SX09GKDIsIGx0cCksIDEwOCwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9paFswXSksIDEzOSwgMTQ0LCAxNDUsIDE2OSwgMjM0LCAzMjcsIDM5NSwgMjk5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ0LCAzNTYsIDM3OSwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9paFsxXSksIDEyNywgMTU2LCAxNTgsIDE3MSwgMjMxLCAzMDgsIDM5NywgMzU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYxLCAzNzEsIDMzNSwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9paFsyXSksIDEyMywgMTU1LCAxNTcsIDE5MywgMjQxLCAzNjIsIDM4NCwgMzIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM4LCAzOTIsIDM2MSwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9paFszXSksIDExNCwgMTQ3LCAxMjEsIDE3NSwgMTk2LCAzMzMsIDM3MywgMzAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg0LCAzNTMsIDMyMiwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9pbFswXSksIDI3MSwgMjAzLCAzODUsIDQ0MiwgMzA3LCAyNzYsIDMzNCwgNDA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEyLCA0MjcsIDQ1OSwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9pbFsxXSksIDI3OCwgMjAwLCAzODgsIDQ0NywgMjkyLCAyODgsIDI5NiwgNDAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE1LCA0MjksIDQ2MCwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9pbFsyXSksIDMxMiwgMjE0LCAzOTMsIDQzMywgMjc5LCAzMDEsIDMxNCwgMzkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEwLCA0MjYsIDQ1MCwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9pbFszXSksIDI4MCwgMTg2LCAzNzYsIDQzNywgMjY4LCAyNjAsIDI1NSwgMzY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE0LCA0MTcsIDQ0MSwKKyAgICAgNywgICBBTVJfT0YoMiwgdnFfZ2FpbiksICAgMiwgIDE3LCAgNDMsICAyNSwgIDM3LCAgNDcsICAyOSwKKyAgICAgNiwgICAgICBBTVJfT0YoMywgYWRhcCksICAzNCwgIDUzLCAgNzgsICA3MywgIDgzLCAxMDAsCisgICAgIDEsICAgICAgIEFNUl9PRigzLCBsdHApLCAxMDcsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWhbMF0pLCAxMTIsIDE1OSwgMTQzLCAxNjQsIDIxMywgMjgxLCAzMzIsIDI4NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OCwgMzQ0LCAzMjUsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWhbMV0pLCAxMTMsIDE1MCwgMTQ5LCAxNzksIDE5OSwgMzE2LCAzMjQsIDI4NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNywgMzYwLCAzMzYsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWhbMl0pLCAxMjQsIDEzNiwgMTUxLCAxNzQsIDIwOSwgMzI2LCAzNDksIDI0OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5OCwgMzc0LCAzMzEsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWhbM10pLCAxMTcsIDEyOCwgMTMzLCAxNjMsIDIwMiwgMzAwLCAzNzIsIDMwNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NCwgMzg3LCAzMjEsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWxbMF0pLCAyNDksIDE4MiwgMzUyLCA0MjgsIDI1MywgMjY0LCAyODksIDQxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwNywgNDE4LCA0NjEsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWxbMV0pLCAyODcsIDIxMiwgMzY5LCA0NDQsIDIyMywgMjQ2LCAyMTcsIDM0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5NCwgNDAxLCA0NTEsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWxbMl0pLCAyMTksIDE5NywgMzc4LCA0MzUsIDIyOSwgMjU3LCAyODMsIDM5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOSwgNDMwLCA0NTUsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWxbM10pLCAyMzIsIDE2MCwgMzcwLCA0MzgsIDIyNywgMjcwLCAyOTQsIDM4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4NiwgNDIxLCA0NDMsCisgICAgIDcsICAgQU1SX09GKDMsIHZxX2dhaW4pLCAgIDEsICAxNiwgIDQyLCAgMjQsICAzNiwgIDQ2LCAgMjgsCisgICAgIDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBvcmRlcl9NT0RFXzIzazg1W10gPSB7CisgICAgIDEsICAgICAgICAgQU1SX0JJVCh2YWQpLCAgIDcsCisgICAgIDgsICAgQU1SX0JJVChpc3BfaWRbMF0pLCAgNTUsICA0MCwgIDE0LCAgIDYsICAxNSwgICA1LCAgIDAsICA2OCwKKyAgICAgOCwgICBBTVJfQklUKGlzcF9pZFsxXSksICA5MywgIDU4LCAgOTEsICA0OSwgIDU5LCAgNTcsICA2NywgIDYxLAorICAgICA2LCAgIEFNUl9CSVQoaXNwX2lkWzJdKSwgIDQ4LCAgNjMsICA1MSwgIDYyLCAgNTAsICA3MCwKKyAgICAgNywgICBBTVJfQklUKGlzcF9pZFszXSksICA3MSwgIDU2LCAgNjAsICA2OSwgMTAxLCAxMDIsICA5NiwKKyAgICAgNywgICBBTVJfQklUKGlzcF9pZFs0XSksIDEwOSwgIDY0LCAxMTAsICA5MiwgIDk4LCAgOTcsIDEwNSwKKyAgICAgNSwgICBBTVJfQklUKGlzcF9pZFs1XSksIDEwNiwgMTE5LCAxMDQsIDExOCwgMTE1LAorICAgICA1LCAgIEFNUl9CSVQoaXNwX2lkWzZdKSwgMTE0LCAxMTMsIDExMiwgMTI3LCAxMTEsCisgICAgIDksICAgICAgQU1SX09GKDAsIGFkYXApLCAgMTMsICAxMiwgIDExLCAgMTAsICAgOSwgIDQxLCAgNjYsICA4OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOCwKKyAgICAgMSwgICAgICAgQU1SX09GKDAsIGx0cCksIDEyNiwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9paFswXSksIDEzNCwgMTQ1LCAxNDcsIDE2OSwgMTg2LCAyOTgsIDMxNCwgMjI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA3LCAzNzMsIDMzMywKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9paFsxXSksIDE0MiwgMTYyLCAxNTEsIDE4MSwgMjAzLCAyODksIDM2MSwgMzExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg4LCAzNTQsIDM1NiwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9paFsyXSksIDEzNSwgMTUzLCAxNTcsIDE4MywgMjI0LCAzMjAsIDM4MiwgMjcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkzLCAzNTUsIDM0NCwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9paFszXSksIDEzMiwgMTQ2LCAxMzYsIDE4MiwgMjA2LCAyNjgsIDMyNywgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg5LCAzNTksIDMzNCwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9pbFswXSksIDI2MSwgMTk2LCAzNTgsIDQ0MCwgMjc1LCAyOTMsIDI4MiwgMzk2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE0LCA0MzksIDQ1NiwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9pbFsxXSksIDIzNCwgMjIzLCAzODMsIDQ1MCwgMjE3LCAyNTYsIDI5MSwgMzc5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE1LCA0MzUsIDQ2OCwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9pbFsyXSksIDI5MCwgMjA0LCAzNjQsIDQ0MSwgMjU4LCAyMjAsIDI3OCwgMzgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE4LCA0NDcsIDQ3OSwKKyAgICAxMSwgQU1SX09GKDAsIHB1bF9pbFszXSksIDIzNywgMTk5LCAzNTMsIDQ1NSwgMjU5LCAyMzIsIDI2NywgMzcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA2LCA0MjcsIDQ3OCwKKyAgICAgNywgICBBTVJfT0YoMCwgdnFfZ2FpbiksICAgNCwgIDE5LCAgNDUsICAyNywgIDM5LCAgMzMsICAzMSwKKyAgICAgNCwgICBBTVJfT0YoMCwgaGJfZ2FpbiksICA3OSwgIDc4LCAgNzcsICA3NiwKKyAgICAgNiwgICAgICBBTVJfT0YoMSwgYWRhcCksICAzNSwgIDU0LCAgOTUsICA5MCwgMTAwLCAxMTcsCisgICAgIDEsICAgICAgIEFNUl9PRigxLCBsdHApLCAxMjUsCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWhbMF0pLCAxMzEsIDE1NiwgMTU4LCAxNzcsIDI0NiwgMzA3LCAzNjcsIDI1MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NywgMzA5LCAzMjYsCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWhbMV0pLCAxMjAsIDE1NCwgMTQ4LCAxNzgsIDIyNywgMzMxLCAzNjMsIDI0OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MiwgMzM2LCAzNDUsCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWhbMl0pLCAxMjIsIDE1MCwgMTQxLCAxNzAsIDIyMSwgMjgzLCAzMjIsIDIzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMSwgMzQ2LCAzMTMsCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWhbM10pLCAxMjEsIDE2NCwgMTM4LCAxNjgsIDIzMSwgMzE4LCAzNjYsIDI3MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NCwgMzM1LCAzMjksCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWxbMF0pLCAyODUsIDIwNSwgMzk4LCA0NDgsIDI4OCwgMjQ0LCAyNzksIDM5OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyMiwgNDM4LCA0NjksCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWxbMV0pLCAzMDIsIDIyMiwgMzkzLCA0NjIsIDI0MiwgMjM4LCAyODEsIDM4NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyMCwgNDMyLCA0NzAsCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWxbMl0pLCAyNjMsIDIxMSwgMzc0LCA0NjEsIDI0MCwgMjUyLCAzMjUsIDM1NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5MSwgNDI0LCA0NjUsCisgICAgMTEsIEFNUl9PRigxLCBwdWxfaWxbM10pLCAyNDEsIDIwOCwgMzc1LCA0NTIsIDI2NiwgMjc0LCAzMDYsIDQwNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxNiwgNDM2LCA0NjQsCisgICAgIDcsICAgQU1SX09GKDEsIHZxX2dhaW4pLCAgIDMsICAxOCwgIDQ0LCAgMjYsICAzOCwgIDMyLCAgMzAsCisgICAgIDQsICAgQU1SX09GKDEsIGhiX2dhaW4pLCAgNzUsICA3NCwgIDczLCAgNzIsCisgICAgIDksICAgICAgQU1SX09GKDIsIGFkYXApLCAgIDgsICAyMywgIDIyLCAgMjEsICAyMCwgIDUyLCAgNjUsIDEwMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNywKKyAgICAgMSwgICAgICAgQU1SX09GKDIsIGx0cCksIDEyNCwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9paFswXSksIDE1NSwgMTYwLCAxNjEsIDE4NSwgMjUwLCAzNDMsIDQxMSwgMzE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYwLCAzNzIsIDM5NSwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9paFsxXSksIDE0MywgMTcyLCAxNzQsIDE4NywgMjQ3LCAzMjQsIDQxMywgMzcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc3LCAzODcsIDM1MSwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9paFsyXSksIDEzOSwgMTcxLCAxNzMsIDIwOSwgMjU3LCAzNzgsIDQwMCwgMzM5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU0LCA0MDgsIDM3NywKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9paFszXSksIDEzMCwgMTYzLCAxMzcsIDE5MSwgMjEyLCAzNDksIDM4OSwgMzE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLCAzNjksIDMzOCwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9pbFswXSksIDI4NywgMjE5LCA0MDEsIDQ1OCwgMzIzLCAyOTIsIDM1MCwgNDIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI4LCA0NDMsIDQ3NSwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9pbFsxXSksIDI5NCwgMjE2LCA0MDQsIDQ2MywgMzA4LCAzMDQsIDMxMiwgNDE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMxLCA0NDUsIDQ3NiwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9pbFsyXSksIDMyOCwgMjMwLCA0MDksIDQ0OSwgMjk1LCAzMTcsIDMzMCwgNDA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI2LCA0NDIsIDQ2NiwKKyAgICAxMSwgQU1SX09GKDIsIHB1bF9pbFszXSksIDI5NiwgMjAyLCAzOTIsIDQ1MywgMjg0LCAyNzYsIDI3MSwgMzgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMwLCA0MzMsIDQ1NywKKyAgICAgNywgICBBTVJfT0YoMiwgdnFfZ2FpbiksICAgMiwgIDE3LCAgNDMsICAyNSwgIDM3LCAgNDcsICAyOSwKKyAgICAgNCwgICBBTVJfT0YoMiwgaGJfZ2FpbiksICA4NywgIDg2LCAgODUsICA4NCwKKyAgICAgNiwgICAgICBBTVJfT0YoMywgYWRhcCksICAzNCwgIDUzLCAgOTQsICA4OSwgIDk5LCAxMTYsCisgICAgIDEsICAgICAgIEFNUl9PRigzLCBsdHApLCAxMjMsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWhbMF0pLCAxMjgsIDE3NSwgMTU5LCAxODAsIDIyOSwgMjk3LCAzNDgsIDMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4NCwgMzYwLCAzNDEsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWhbMV0pLCAxMjksIDE2NiwgMTY1LCAxOTUsIDIxNSwgMzMyLCAzNDAsIDMwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1MywgMzc2LCAzNTIsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWhbMl0pLCAxNDAsIDE1MiwgMTY3LCAxOTAsIDIyNSwgMzQyLCAzNjUsIDI2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNCwgMzkwLCAzNDcsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWhbM10pLCAxMzMsIDE0NCwgMTQ5LCAxNzksIDIxOCwgMzE2LCAzODgsIDMyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMCwgNDAzLCAzMzcsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWxbMF0pLCAyNjUsIDE5OCwgMzY4LCA0NDQsIDI2OSwgMjgwLCAzMDUsIDQyOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyMywgNDM0LCA0NzcsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWxbMV0pLCAzMDMsIDIyOCwgMzg1LCA0NjAsIDIzOSwgMjYyLCAyMzMsIDM2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxMCwgNDE3LCA0NjcsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWxbMl0pLCAyMzUsIDIxMywgMzk0LCA0NTEsIDI0NSwgMjczLCAyOTksIDQxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyNSwgNDQ2LCA0NzEsCisgICAgMTEsIEFNUl9PRigzLCBwdWxfaWxbM10pLCAyNDgsIDE3NiwgMzg2LCA0NTQsIDI0MywgMjg2LCAzMTAsIDM5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMiwgNDM3LCA0NTksCisgICAgIDcsICAgQU1SX09GKDMsIHZxX2dhaW4pLCAgIDEsICAxNiwgIDQyLCAgMjQsICAzNiwgIDQ2LCAgMjgsCisgICAgIDQsICAgQU1SX09GKDMsIGhiX2dhaW4pLCAgODMsICA4MiwgIDgxLCAgODAsCisgICAgIDAKK307CisKKy8qKiBSZW9yZGVyaW5nIGFycmF5IGFkZHJlc3NlcyBmb3IgZWFjaCBtb2RlICovCitzdGF0aWMgY29uc3QgdWludDE2X3QqIGFtcl9iaXRfb3JkZXJpbmdzX2J5X21vZGVbXSA9IHsKKyAgICBvcmRlcl9NT0RFXzZrNjAsCisgICAgb3JkZXJfTU9ERV84azg1LAorICAgIG9yZGVyX01PREVfMTJrNjUsCisgICAgb3JkZXJfTU9ERV8xNGsyNSwKKyAgICBvcmRlcl9NT0RFXzE1azg1LAorICAgIG9yZGVyX01PREVfMThrMjUsCisgICAgb3JkZXJfTU9ERV8xOWs4NSwKKyAgICBvcmRlcl9NT0RFXzIzazA1LAorICAgIG9yZGVyX01PREVfMjNrODUKK307CisKKy8vIEV4dHJhY3RlZCBmcm9tIDNHUFAgVFMgMjYuMTczIFY5LjAuMCAocXBpc2ZfMnMudGFiKQorLy8gVGhlICpfMzZiIHRhYmxlcyBhcmUgdXNlZCBpbiA2azYwIG1vZGUKKy8vIFN0b3JlZCBpbiBmaXhlZC1wb2ludCB0byBzYXZlIHNvbWUgc3BhY2UKKy8qKiBJbmRleGVkIHRhYmxlcyBmb3IgcmV0cmlldmFsIG9mIHF1YW50aXplZCBJU0YgdmVjdG9ycyBpbiBRMTUgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGRpY28xX2lzZlsyNTZdWzldID0geworIHsgIDU3OSwgIDEwODEsICAxMDM1LCAgIDM5MCwgICAgIDMsICAtMjYzLCAgLTE5OCwgICAtODIsICAgIDM4fSwKKyB7ICAgMTgsICAgLTY4LCAgIC0xMiwgICAzMTMsICAgNzYxLCAgIDQwNSwgICAyNDksICAgMTExLCAgIC03Nn0sCisgeyAgNzQwLCAgMTI2MywgIDEyOTIsICAxMDA2LCAgIDk5NywgIDEwMTksICAxMDE3LCAgIDk3NiwgICA5MjN9LAorIHsgIC05MSwgICA4MjcsICAgOTQ4LCAgIDY0OCwgICA2MTMsICAgNTM1LCAgIDUyMiwgICA0OTAsICAgNDIxfSwKKyB7ICAgNDEsICAgLTQ0LCAgLTI4MSwgIC00NzIsICAgNjUyLCAgIDUzNCwgICAxOTMsICAgMTM1LCAgIC05MH0sCisgeyAgIDQxLCAgLTEyMSwgIC0zNTYsICAgLTYwLCAgIDY2MywgICAzMDcsICAgIDYxLCAgIC00OCwgIC0zNDR9LAorIHsgIDU1NywgICA5NDYsICAxMDQ5LCAgIDg2NywgICA4NDYsICAgOTkwLCAgMTExMiwgIDEyNjIsICAxMjQxfSwKKyB7IC0xMTgsICAtMjA0LCAgIDMyOCwgICA1MTIsICAgODcwLCAgIDc5MywgICA2MTAsICAgNDAyLCAgIDE4Nn0sCisgeyAgMTU2LCAgIDI5MywgICAgNzQsICAtMzM4LCAgLTQ3NSwgIC04OTcsICAtNTk0LCAgLTE2MSwgIC00OTd9LAorIHsgIDIyNiwgICAxMzEsICAtMTM4LCAgIDMwNywgICAxNjksICAtMjcxLCAgLTE2NCwgIC0zODcsICAtNjI0fSwKKyB7ICAgNjIsICAgLTMyLCAgIC02MSwgIC0yNTIsICAtNTQxLCAgLTgyOCwgLTEwMjcsICAtNTIzLCAgLTY2Mn0sCisgeyAgMTAyLCAgIC02MSwgICAxNDEsICAgMTEyLCAgLTI3MCwgIC0yNTEsICAtNTQxLCAgICAyNSwgIC0xNTB9LAorIHsgICAgNiwgIC0xMzIsICAtMzU2LCAgLTY4NiwgICAtOTYsICAtMzIyLCAgLTUyMiwgICAtMzEsICAtMzI2fSwKKyB7ICAtMzYsICAtMjA5LCAgLTUyMSwgIC0yMjksICAgMzA3LCAgLTEzMiwgICAgLTUsICAgLTk5LCAgLTM4NH0sCisgeyAgIDYwLCAgIC01MSwgIC0yMzcsICAtNjY4LCAgLTk3MywgIC00MDcsICAtNzA4LCAgIC03NSwgIC0xNzJ9LAorIHsgICAyNiwgIC0xMzgsICAtMjY2LCAgIDExMSwgIC0zMDIsICAgIDQzLCAgLTI3OCwgIC0zNTYsICAtMzU5fSwKKyB7ICA1NzAsICAgODIyLCAgIDQ5NiwgIC0xNTQsICAtMzEyLCAgIC05MiwgICAxMzcsICAgMjc5LCAgIDM3MX0sCisgeyAtMTQ2LCAgIDM2OCwgICA0MDksICAgIDY4LCAgICAgNiwgICAgNzcsICAgMTY3LCAgIDIwMiwgICAxNjJ9LAorIHsgIDYzMywgICA4OTgsICAgOTk2LCAgIDc1NiwgICA2NjIsICAgNjgzLCAgIDc4MywgICA5MDksICAgOTk2fSwKKyB7IC0xMDMsICAgMjk0LCAgIDYwNywgICA0MTUsICAgNDgzLCAgIDQ2MiwgICA0ODAsICAgNDMxLCAgIDQwOH0sCisgeyAtMTIwLCAgLTMzOCwgIC02MTIsICAtNTI0LCAgIDU4NCwgICAzMzEsICAgIDkyLCAgIDQzMywgICAyNzZ9LAorIHsgLTE3OCwgIC0yOTMsICAtMTU0LCAgIC00MSwgICAyNjksICAgMTAwLCAgICAtOSwgICAyMTMsICAgMTYwfSwKKyB7ICA4MzAsICAgNzM2LCAgIDI3OCwgICA4MjAsICAxMjU0LCAgIDY4NiwgICA3MTIsICAxMDM5LCAgIDQ3M30sCisgeyAtMjE4LCAgLTMwNCwgICA0NjMsICAgNDU0LCAgIDM5NywgICAyNzMsICAgMjAyLCAgIDI4NiwgICAyNzN9LAorIHsgLTIzMiwgICAgIDcsICAgICA2LCAgLTM4OCwgIC00NzIsICAtNDI3LCAgLTM3OCwgIC0xNjcsICAtMTAwfSwKKyB7IC0yOTQsICAtMTgzLCAgIDEzNCwgICAtNDcsICAgMTAxLCAgIC04OCwgICAtODQsICAtMTE3LCAgICAtM30sCisgeyAgIDU3LCAgICAxNywgIC0yMDIsICAtNjM0LCAgLTk4OSwgLTExMTksICAtNTMzLCAgIDE3NiwgICAtMzZ9LAorIHsgIDEyMCwgICAtMjgsICAgIDIzLCAgIDExMSwgIC0zMTksICAgMzE4LCAgIC0yMiwgICAtNzcsICAgMjY2fSwKKyB7IC0yNzEsICAtNDY0LCAgLTQzNCwgIC02NTgsICAtNjQwLCAgLTM4NSwgIC0zODUsICAgLTk5LCAgIC02OX0sCisgeyAtMTk4LCAgLTI1OSwgIC0yNjYsICAgLTQ0LCAgIC0zOSwgIC0xMzksICAtMTM3LCAgIDE3MSwgICAgNjZ9LAorIHsgICAgOSwgIC0xNDUsICAtMzc3LCAgLTg0NiwgLTEwMDAsICAtMTExLCAgLTMyNSwgICAzNDIsICAgMTM1fSwKKyB7ICAtODEsICAtMjg2LCAgLTM4MCwgICAxOTIsICAgLTU3LCAgIDMwNywgICAgNzYsICAgLTI0LCAgLTE0MH0sCisgeyAgNjc3LCAgIDcwMiwgICAyNDcsICAgIDU2LCAgIDI0OSwgICAxNDEsICAtMTA1LCAgLTIzNiwgICAtOTl9LAorIHsgICAzNiwgICAtMzksICAgLTY5LCAgIDM0OCwgICAxOTgsICAgLTkzLCAgIDMyMiwgICAgOTEsICAgLTcyfSwKKyB7ICA1MDMsICAgODg1LCAgMTUwOCwgIDEzMDcsICAxMjgyLCAgMTE3MiwgIDExMTksICAxMjA5LCAgMTA2MX0sCisgeyAgNDE2LCAgIDcxOSwgICA5ODksICAxMjI3LCAgMTAwMSwgIDEwNTIsICAgOTU0LCAgIDc0MSwgIDEwNDR9LAorIHsgLTEyNywgIC0zNzYsICAtNjU3LCAgIDEzOSwgICA2MjMsICAgMjIzLCAgIDUwMSwgICAzMDYsICAgMjIwfSwKKyB7IC0xMTMsICAtMzg0LCAgLTc5NiwgICA1MDQsICAgNDM4LCAgICA4NSwgICAyMTMsICAgLTgzLCAgLTE5NH0sCisgeyAgNTg1LCAgMTEzMiwgIDEyMzMsICAxMDkxLCAgMTI0NywgIDE0MzMsICAxNTEyLCAgMTQ0OCwgIDEzMTR9LAorIHsgLTE3NCwgIC00MjIsICAgICA3LCAgMTE1NSwgIDEwODksICAxMTgyLCAgMTAwMywgICA5NDUsICAgODA2fSwKKyB7ICAgIDgsICAtMTI2LCAgLTMxNywgIC0xMDMsICAtMzUxLCAgLTY5NSwgICAtOTgsICAtMjY4LCAgLTUzN30sCisgeyAgIDMzLCAgLTEwMywgIC0yOTAsICAgMTY3LCAgIC0zOSwgIC00MDcsICAgIDQ0LCAgLTIwOCwgIC0zNzV9LAorIHsgIDEwNCwgICAtMjMsICAgLTY0LCAgLTI5MSwgIC02MzcsICAtODUxLCAtMTA4NCwgICAtNjEsICAtMTEyfSwKKyB7ICAtNzUsICAtMzA2LCAgLTQzNCwgICAyMTgsICAtMTQ4LCAgLTM1NCwgIC02ODAsICAtMTMzLCAgLTIxNn0sCisgeyAtMTIxLCAgLTM3NywgIC03MTgsICAgLTk3LCAgLTEzMCwgIC0zNjEsICAtMTU2LCAgLTM3OSwgIC01OTl9LAorIHsgIC01NiwgIC0yNTQsICAtNTg2LCAgIDIzNSwgICAxNTcsICAtMjE0LCAgICAxMSwgIC0yNjAsICAtMTQ5fSwKKyB7IC0xMjQsICAtMjY3LCAgLTM5NywgIC01ODAsICAtNTkzLCAgLTUyNywgIC04MDUsICAtMzg1LCAgIDM0Nn0sCisgeyAtMTkzLCAgLTQ0MCwgIC03MDgsICAtMzUxLCAgLTE0MSwgIC0yNTUsICAtNDk5LCAgLTE0NywgIC0xODV9LAorIHsgIDQ0OCwgICA2NjAsICAgNDk0LCAgIDIwOCwgICA1MDksICAgNDYxLCAgIDMzOCwgICAyOTEsICAgMTQ5fSwKKyB7IC0yMjMsICAgIDg4LCAgIDMzNSwgICAxNTksICAgMjEyLCAgIDE5MSwgICAyODYsICAgMzA4LCAgIDIwNX0sCisgeyAgLTMxLCAgIDQ2OSwgICA4MDMsICAgNjU5LCAgIDYxOSwgICA2NTgsICAgODQzLCAgIDk4NywgIDExMTN9LAorIHsgLTE3MSwgIC0yNDIsICAgNTE0LCAgIDM2MiwgICAyOTUsICAgNTI0LCAgIDU1MiwgICA2OTQsICAgNTg1fSwKKyB7ICAtNjQsICAtMzA4LCAgLTQ0OCwgICAtMjEsICAgMjg0LCAgIDc4NiwgICA0NDYsICAgMjg5LCAgICA5Mn0sCisgeyAtMjE4LCAgLTM5MCwgICAgLTcsICAgMTY5LCAgIDIwNiwgICAzMzAsICAgMzUyLCAgIDQwOCwgICAzNTh9LAorIHsgIC0zNiwgICA3MDIsICAgOTU5LCAgIDg1OSwgICA4NjEsICAxMTE1LCAgMTI2OSwgIDEzNTcsICAxMzA1fSwKKyB7IC0xMzMsICAtMzQxLCAgIC02NSwgICA2NzgsICAgNDE3LCAgIDQ0MCwgICA0ODYsICAgNTE4LCAgIDc4MH0sCisgeyAgIDMzLCAgIC00NCwgIC0xOTEsICAtMzQ0LCAgLTQ2MSwgIC03NTUsICAtMjAxLCAgIDIxNywgICAtMzF9LAorIHsgLTM1MywgIC01NDcsICAgLTQ0LCAgIDEyMywgICAtNjEsICAgLTY4LCAgIC03OSwgICAgMjksICAgIDYwfSwKKyB7ICAgNzMsICAgLTU3LCAgLTQwNiwgIC03NjYsIC0xMjQzLCAtMTIwMywgICAyNDAsICAgNDAwLCAgIDE2NX0sCisgeyAgLTczLCAgLTI4MiwgIC02MDEsICAtMjEzLCAgLTE3MSwgIC0zNzUsICAgMzMyLCAgICAzNSwgIC0xMDN9LAorIHsgIC0yOSwgIC0yMDcsICAtNTUzLCAgLTQ3NiwgIC02MzgsICAtOTA4LCAgIDE3MiwgICAtMjIsICAtMTM1fSwKKyB7IC0xOTIsICAtMjM5LCAgLTE2NCwgIC0xMDMsICAtMTExLCAgIC00NywgICAxNTMsICAgMTI1LCAgIDExMH0sCisgeyAgIC0xLCAgLTIwMywgIC01NzAsIC0xMDMwLCAtMTQyNCwgIC01MzUsICAgMTU1LCAgICAgMSwgICAxNDd9LAorIHsgLTMzMywgIC02NTMsICAtODY1LCAgLTE5NywgIC0xNTgsICAgLTIxLCAgIC00NCwgICAgOTUsICAgMTA4fSwKKyB7ICAzODksICAgNTg4LCAgIDQ5MCwgICAgMzMsICAtMjM3LCAgLTUyNCwgIC02MjgsICAtMTM2LCAgLTI2MH0sCisgeyAgIDQwLCAgLTE3NywgIC00NjIsICAgNDUzLCAgIDg2MiwgICAzODAsICAgMTMxLCAgLTEzMCwgIC00MDV9LAorIHsgIDg0MiwgIDE2NzgsICAxODQxLCAgMTU0OSwgIDE0NzQsICAxMjU2LCAgMTA4MiwgICA5MDUsICAgNzQyfSwKKyB7ICAzNzAsICAxMjE2LCAgMTc2OCwgIDE2MzMsICAxMjEyLCAgIDYzNiwgICAgMjIsICAtMzMwLCAgICA3MX0sCisgeyAgLTc2LCAgLTI4MSwgIC03NDEsICAtNzQyLCAgIDg5OCwgICA2MTksICAgMjc3LCAgICA3MSwgIC0yMjJ9LAorIHsgIC0zMiwgIC0yNjUsICAtNTU2LCAgIC0yNSwgICA5OTQsICAgNjgyLCAgIDMwNSwgICAxMjYsICAtMTY1fSwKKyB7ICAgNzMsICAgNzM4LCAgIDg5MywgICA5NjgsICAgOTkzLCAgMTc2OCwgIDIyNzMsICAxODQwLCAgMTM5MX0sCisgeyAgLTY5LCAgLTM0OSwgIC01ODUsICAgMjM0LCAgMTE1OCwgICA5MDMsICAgNjI2LCAgIDUxMCwgICAyNTF9LAorIHsgICAtMSwgICAtOTksICAtMjcyLCAgLTIxMCwgIC02MDMsICAtMzUxLCAgLTU0MCwgIC04MTEsICAtMzgzfSwKKyB7ICAtMTYsICAtMjMwLCAgLTUwNCwgICA0MTAsICAgMTQ5LCAgLTIwNSwgIC0zNDMsICAtNjUxLCAgLTYzOX0sCisgeyAgMTAzLCAgICAtOSwgIC0yMjcsICAtMjA1LCAgLTU2MiwgIC03ODEsIC0xMDc5LCAtMTIwOCwgIC0xNTZ9LAorIHsgIDE0MywgICAgNjMsICAtMTM1LCAgIC02NywgIC0zMTcsICAtNjAyLCAgLTc4NCwgLTExNTQsICAtNjQwfSwKKyB7IC0xNDQsICAtMzkxLCAgLTY3NCwgIC02MjIsICAtMjAwLCAgLTI1NCwgIC02NjAsICAtOTQ3LCAgLTM5NX0sCisgeyAgLTQwLCAgLTI1MCwgIC02MjUsICAgIDI3LCAgIDU0MywgICAgOTQsICAtMTMxLCAgLTM4NiwgIC02NzN9LAorIHsgLTEyMywgIC0zNzEsICAtNzU3LCAgLTQ1MSwgIC01NjQsICAtNjE0LCAgLTQxNSwgIC03MTEsICAgLTM1fSwKKyB7IC0xMTYsICAtMzA5LCAgLTU5MywgIC0yNjgsICAgMjM5LCAgIC0zMywgIC0zMzgsICAtNjUwLCAgLTEzNX0sCisgeyAgIDk0LCAgIDI1MSwgICA1NTQsICAgIDU3LCAgLTMxMiwgIC00MjMsICAtMTU0LCAgIC01NywgICAyMzV9LAorIHsgLTI2OCwgICAtNzEsICAgMzgxLCAgIDExNCwgICAtNDQsICAgLTg3LCAgIDEyNSwgICAxNzMsICAgMTMzfSwKKyB7IDE1MTMsICAxNzE0LCAgMTIzOCwgICA1MzQsICAgMjc2LCAgIDMxNSwgICA0NjEsICAgNDU5LCAgIDUwOH0sCisgeyAtMTMxLCAgIC0xOSwgIDExNDksICAgNjcwLCAgIDQ4NiwgICAzNTYsICAgMzA5LCAgIDM2OSwgICAyOTZ9LAorIHsgLTIyMywgIC01MDEsICAtODk5LCAgLTcyMiwgICAtNzAsICAgICA2LCAgIDEzMSwgICAzMTAsICAgMzk0fSwKKyB7ICAtOTksICAtMzAzLCAgLTUxNywgICAyNDksICAgIDY0LCAgIC01MywgICAxMzUsICAgLTExLCAgIDQ1M30sCisgeyAtMTQ3LCAgLTM5OSwgIC03MzAsICAtNDAxLCAgIDgxNywgICA3MzgsICAgODAyLCAgIDc0OSwgICA1NzV9LAorIHsgLTE1NCwgIC00MzUsICAtNzM5LCAgIDgwMCwgICA1OTMsICAgMzY2LCAgIDUyOSwgICAzMTgsICAgMzI2fSwKKyB7IC0yMjQsICAgIDQ1LCAgIC0zOSwgIC0zODcsICAtNTE1LCAgLTUxOCwgIC02MDgsICAtMzg0LCAgLTMyMX0sCisgeyAtMzE1LCAgLTM3NywgICAxNDMsICAtMTAxLCAgLTExMywgIC0zNzcsICAtMTc3LCAgLTE0NCwgICAtMTJ9LAorIHsgIDExNywgICAgNDAsICAtMjM5LCAgLTY1MSwgLTEwNTEsICAtNTgxLCAgLTczNywgIC05OTAsICAtMzI4fSwKKyB7ICAgMjYsICAgLTUwLCAgLTE1NywgICAtMjMsICAtNDUzLCAgLTI4MywgIC01MzEsICAtNTQ2LCAgIDE5Mn0sCisgeyAtMjUyLCAgLTUwMSwgIC03NDMsICAtNTg5LCAgLTYyNywgIC00OTksICAtMzI4LCAgLTExOCwgICAtNzJ9LAorIHsgLTMyNCwgIC00OTQsICAtMjQ0LCAgLTMwNiwgIC0xNDQsICAtMTc3LCAgLTI2MiwgIC0xMzUsICAgLTc4fSwKKyB7ICAtMzYsICAtMjM0LCAgLTUxOSwgIC05NjEsIC0xMjkwLCAgLTMxNCwgIC00NzksICAtMzcxLCAgIC00NX0sCisgeyAgLTk1LCAgLTI5MiwgIC01MzUsICAgIC04LCAgLTMwMCwgICAxMTIsICAtMTY0LCAgLTI3NywgICAxOTh9LAorIHsgIC05OSwgIC0xMjgsICAgODgwLCAgIDgzNiwgICA1NzksICAgMzUxLCAgICAyMywgICAtOTUsICAtMjE3fSwKKyB7ICAtMjcsICAtMjU4LCAgIDEyNCwgIDEwMTEsICAgNTk3LCAgIDQyNSwgICAxNDQsICAgICA3LCAgIC03M30sCisgeyAgNDIxLCAgMTI5MywgIDE2NDAsICAxNjIzLCAgMTc0MiwgIDE2MTcsICAxNDk5LCAgMTI4NCwgIDEwMDZ9LAorIHsgIC05NSwgICA3NTIsICAxNjgwLCAgMTU2OSwgIDE2MTgsICAxNDM2LCAgMTIwMCwgICA5ODAsICAgNzEyfSwKKyB7ICAtNjksICAtMzAwLCAgLTY4MywgIC00MzUsICAxMTMyLCAgIDg5OSwgICA1MDQsICAgMzMyLCAgIDEwOX0sCisgeyAgLTc0LCAgLTMyMywgIC02MzcsICAgNTYzLCAgMTA3NCwgICA2MDgsICAgMzcxLCAgIDEwNSwgICAtNDl9LAorIHsgIC03OCwgICA4MzEsICAxMTk0LCAgMTExMCwgIDEzNzgsICAxNDgxLCAgMTQ5MiwgIDEzNjUsICAxMjE3fSwKKyB7IC0yNTksICAtMTIxLCAgMTQ0MCwgIDEzMzQsICAxNjI4LCAgMTQ5MCwgIDE0MzgsICAxMjIzLCAgIDkzM30sCisgeyAgLTgyLCAgLTMwNiwgIC02MTMsICAtMjIyLCAgLTM3OCwgIC02NzUsICAtNTQ1LCAgLTY3MSwgIC04NDV9LAorIHsgICA1MywgIC0xMjQsICAtMzQ3LCAgIDQyMiwgICAgNTIsICAtMTI1LCAgLTI3MCwgIC01MjksICAgICA5fSwKKyB7ICAgNzksICAgLTg5LCAgLTMyMCwgIC02NjIsICAtOTk5LCAtMTE5OSwgLTEyNDMsICAtNjc2LCAgLTI5N30sCisgeyAgLTY4LCAgLTI3MywgIC02MTEsICAgMTM3LCAgLTE0NiwgIC0zOTcsICAtNjI3LCAgLTg0NSwgIC0yMjB9LAorIHsgLTExMiwgIC0zNDYsICAtNzk3LCAgLTgyNiwgICAyMzQsICAtMTMyLCAgLTE4OCwgIC0yNzgsICAtNTIyfSwKKyB7IC0xNTksICAtNDA1LCAgLTczNCwgIC00MTksICAgMjkzLCAgICA3NCwgIC0xNjcsICAtMTY3LCAgIDE4NH0sCisgeyAtMTUzLCAgLTQzNywgIC04MzMsIC0xMDgwLCAgLTMzNiwgIC00NzIsICAtNTYxLCAgLTM0MCwgIC0yNTN9LAorIHsgLTE2OSwgIC00MjMsICAtODIwLCAgLTkwNCwgIC0xMzEsICAgLTE5LCAgLTM0NiwgIC02MDQsICAgIDMxfSwKKyB7ICAgMzMsICAgLTMxLCAgIDMxMiwgICAgNjIsICAtMTQ4LCAgICA0OSwgICAtNTksICAgNTY0LCAgIDQ4Nn0sCisgeyAtMzA2LCAgLTMzMywgICAxOTQsICAgLTQ0LCAgICA2NywgICAgNzIsICAgMTQ3LCAgIDIwNSwgICAyNDN9LAorIHsgLTIwNywgICAtNDksICAxMzYwLCAgIDk4MywgICA5NjksICAgOTkxLCAgMTAxNCwgIDExMTAsICAgOTczfSwKKyB7IC0yMTEsICAtMTcyLCAgIDg4MywgICA2MjcsICAgNzExLCAgIDY3NCwgICA3MDUsICAgNzk4LCAgIDc0Nn0sCisgeyAgLTg4LCAgLTMyNSwgIC03NjMsICAtOTc0LCAgIDY4NywgICA5MDgsICAgNTE0LCAgIDM4MiwgICAxNzJ9LAorIHsgLTI5MiwgIC02MTIsICAtODA1LCAgICA2MywgICAxMzEsICAgMjcwLCAgIDI1OSwgICAzNTIsICAgMzQ4fSwKKyB7IC0yMzUsICAgLTg0LCAgIDk1NSwgICA4MTgsICAxMTIwLCAgMTI4OSwgIDE1NTksICAxNDgwLCAgMTI4NX0sCisgeyAtMTgwLCAgLTQ2MSwgIC02MTQsICAgNjU3LCAgIDY5MSwgICA3NDUsICAgODU0LCAgIDc4MywgICA3MTN9LAorIHsgIC05NywgIC0zMDksICAtNDc3LCAgLTYxNCwgIC03NzcsICAtNzM0LCAgLTc2OCwgIC01MjYsICAtNDcyfSwKKyB7IC0zNDQsICAtNDc2LCAgIC0zNSwgIC0xNjksICAgIDQ5LCAgIC03NywgIC0xNTAsICAtMjQwLCAgLTE0MX0sCisgeyAgLTUyLCAgLTI2OCwgIC02MzksICAtOTE5LCAtMTI3OCwgLTExMTMsICAtMzQyLCAgLTMzMywgIC0xNTF9LAorIHsgIC02OCwgIC0yNDIsICAtNTg1LCAgIC03MywgIC0yMDksICAtNDc4LCAgLTE1OSwgIC00MjksICAgMTMzfSwKKyB7IC0xOTcsICAtNDk5LCAtMTAwNSwgLTEyNjgsICAtMjcyLCAgLTIyNCwgIC0xMDUsICAgLTY3LCAgICAxN30sCisgeyAtMzYzLCAgLTYxOCwgIC00MTQsICAtMTE2LCAgIC02MiwgICAgMjAsICAgIDEwLCAgIDExNiwgICAxMDh9LAorIHsgLTE5NSwgIC00NzUsICAtOTA2LCAtMTI2MCwgIC04OTEsICAtNDQxLCAgLTI3NywgIC0xNDIsICAgLTI4fSwKKyB7IC0yMjYsICAtNTE5LCAgLTk1MCwgIC03MDAsICAtMjc1LCAgLTI2NiwgIC0xMTYsICAtMTA1LCAgICA4Mn0sCisgeyAgNDA0LCAgIDUxMSwgICA1MjAsICAgMzI3LCAgICAxNywgIC0xOTQsICAtMzMzLCAgLTUzNiwgIC01ODZ9LAorIHsgLTExNCwgIC0xMzAsICAgMjc2LCAgIDIzNywgICAyMDQsICAgMzQyLCAgIDEzNSwgICAtMTYsICAtMTExfSwKKyB7ICA2NzAsICAxMjA4LCAgMTE2OCwgICA4NjAsICAgNzQyLCAgIDYwMSwgICA1MjgsICAgNDAzLCAgIDMwOX0sCisgeyAgMzk3LCAgIDYyMSwgICA5NjYsICAgNzUyLCAgIDU3OSwgICAzOTgsICAgNDAwLCAgIDMyOSwgICAyNTJ9LAorIHsgIDE5MSwgICAxODAsICAtMTM3LCAgLTQ2NywgICAyNzIsICAgMTA2LCAgIC05NSwgICAgMTcsICAtMTkyfSwKKyB7ICAtODAsICAtMjkwLCAgLTYyNiwgICAxOTQsICAgNTk4LCAgIDE5NiwgICAgMjEsICAtMjgxLCAgICA3N30sCisgeyAgNTEwLCAgIDg2NCwgIDExMDgsICAgODA3LCAgIDkzOSwgICA5MDIsICAgOTI1LCAgIDcxNywgICA0ODF9LAorIHsgIDEzNywgICAzNjcsICAgNTM0LCAgIDc2NCwgICA2NzAsICAgMzgyLCAgIDI5NiwgICAxNTMsICAgIDg0fSwKKyB7ICAzMDMsICAgNDk3LCAgIDE0NCwgICAtODUsICAtMTI1LCAgLTUzOSwgIC00ODIsICAtNDY0LCAgLTc2NH0sCisgeyAgMjMzLCAgIDM0NywgICAgNjgsICAtMTQ3LCAgIDE2OSwgIC0yMTAsICAtMjQyLCAgLTIyNiwgIC00ODJ9LAorIHsgIDMwNywgICA0MjIsICAgMTU0LCAgLTE3NSwgIC0zODYsICAtNzIyLCAgLTcyNCwgIC05MDQsIC0xMDE1fSwKKyB7ICAzMDksICAgMzA4LCAgIDE2MCwgICAtNjAsICAtNDcwLCAgLTQyMCwgIC01OTgsICAtNzkxLCAgLTIxOX0sCisgeyAgIDY4LCAgIDEyMSwgIC0xMzcsICAtNTYwLCAgLTE0NiwgIC00NDYsICAtNTE1LCAgLTQ5NCwgIC03Mjl9LAorIHsgIDEzMCwgICAgNTMsICAtMjI3LCAgICA0NiwgICA0NzQsICAgIDMyLCAgLTE2MSwgIC0xOTIsICAtNDkwfSwKKyB7ICAyMTMsICAgMTY0LCAgIC03MSwgIC00NjUsICAtODc2LCAgLTE2MSwgIC00NTYsICAtNTg3LCAgIC00OH0sCisgeyAgMjE4LCAgIDExNywgICAgMzksICAgMTc3LCAgLTE5NCwgICAtODgsICAtMjI2LCAgLTQxOCwgICAgNTB9LAorIHsgIDIxMCwgICA1NDcsICAgNTY5LCAgIDI3OSwgICAxMjEsICAgLTQ0LCAgIC01MCwgICAgMTAsICAgLTg0fSwKKyB7ICAgNTgsICAgMTQwLCAgIDE4MiwgICAgLTUsICAgMjY3LCAgIDExNywgICAxMDYsICAgMjExLCAgIDE5OH0sCisgeyAgNTM5LCAgIDgzNSwgICA5MTMsICAgNzE5LCAgIDYxNywgICA1NDQsICAgNTkxLCAgIDU2NSwgICA2NDJ9LAorIHsgIDE1MywgICA1NTksICAgODcyLCAgIDQ2MCwgICAyMjIsICAgMTA4LCAgIDE4OCwgICAxODAsICAgMTgzfSwKKyB7ICAxNTgsICAgMTE5LCAgIDI4NCwgIC0xNTMsICAtMjcxLCAgIDIyOSwgICAgODcsICAgMTEwLCAgIC01N30sCisgeyAtMTgzLCAgICA4MiwgICAxMTgsICAgIDIxLCAgICAxMywgICAgNDAsICAgMTE4LCAgIDE5MSwgICAxODV9LAorIHsgIDE2MiwgICA4ODksICAgNjU0LCAgIDEwOCwgICAtMzQsICAgMjQ0LCAgIDQ4OCwgICA1NjEsICAgNTMyfSwKKyB7ICAxNjMsICAgIDU2LCAgIDYwOSwgICAzNDEsICAgIDUwLCAgIDMyOSwgICAgNjgsICAgMjY2LCAgIDIxOH0sCisgeyAgMTAwLCAgIDIwNiwgICAgMTgsICAtMzA0LCAgLTEwNywgIC00MzYsICAtNDg3LCAgIC02NSwgIC0zMDZ9LAorIHsgIC04NiwgICAxNTQsICAgMTM0LCAgIC0zMCwgICAtNDUsICAgLTczLCAgLTEwNCwgICAtODAsICAgLTk2fSwKKyB7ICAyNDUsICAgMzMwLCAgICAxMCwgIC00NDAsICAtODQ5LCAtMTA4MiwgICAgNzksICAgIDQwLCAgLTI2NX0sCisgeyAgMTk2LCAgIDM3MiwgICAyNzIsICAtMTgxLCAgLTQ5MywgIC0zODksICAgMjc1LCAgICA4MCwgICAtNTl9LAorIHsgICAgMiwgICAtMTIsICAtMjQ2LCAgLTUwNSwgIC0xMDAsICAtNDM2LCAgICAyMSwgIC0xODcsICAtNDMxfSwKKyB7IC0yMjEsICAgLTQ4LCAgICAzNiwgIC0yNzEsICAtMTg2LCAgLTE0NywgIC0xMDksICAgIDI2LCAgICA3MX0sCisgeyAgMjEzLCAgIDE0MCwgICAgNzIsICAtMzUxLCAgLTYyMCwgICAtODQsICAtMzYzLCAgICA2OSwgICAgNDZ9LAorIHsgICA5MSwgICAxNjcsICAgIC0zLCAgIC05NSwgICAtOTksICAtMTA1LCAgIC00OCwgICAxMTQsICAgMTQ3fSwKKyB7ICAyNTksICAgMjQ5LCAgIDE3MiwgICA2MDcsICAgNDA2LCAgICA1MiwgICAgNTksICAtMTg5LCAgLTMyMH0sCisgeyAgMTE1LCAgIC04NSwgICAtNTQsICAgNTc0LCAgIDEyOCwgICAyMjYsICAgLTU5LCAgLTI1MywgICAxMzB9LAorIHsgIC02MiwgIDEwMzMsICAxMzA4LCAgMTAzNSwgIDExMjcsICAxMDk4LCAgMTAyOSwgICA5NjEsICAgODIzfSwKKyB7ICAgMzksICAgMzY0LCAgIDc1NywgICA5NDAsICAgNzI4LCAgIDY2MCwgICA2NTksICAgNTgzLCAgIDc3MH0sCisgeyAtMTE1LCAgLTMzOCwgIC03NjAsICAtNDcxLCAgIDM5NCwgICAgMzcsICAgNDQxLCAgIDE3OCwgICAgIDZ9LAorIHsgIC01NywgIC0zMDUsICAtNTI1LCAgIDc5NiwgICA0NTMsICAgMTg4LCAgICAtNCwgIC0xMTQsICAgMjQ4fSwKKyB7ICAgNzEsICAgNDQ0LCAgIDc5NywgICA3MzEsICAxMDk2LCAgMTE1NywgIDEyMjIsICAxMDI5LCAgIDgxMX0sCisgeyAgMTM1LCAgIDM1OSwgICA1NTEsICAgNDI1LCAgIDc0OSwgICA4MTUsICAgODc0LCAgIDcwNCwgICA1MDJ9LAorIHsgIDEzMiwgICAyNDcsICAgICAwLCAgLTIwNiwgIC00NDksICAtNzUwLCAgLTI1OCwgIC01MTQsICAtNjMzfSwKKyB7ICAyNDgsICAgMjQ5LCAgICA5MSwgICAxMjEsICAtMTk1LCAgLTQ5OSwgICAtOTAsICAtMjgyLCAgLTQzNX0sCisgeyAgIDc4LCAgICAyMCwgIC0yNzcsICAtNjIzLCAgLTk4MywgLTEyMjQsICAtNDE1LCAgLTQ1OCwgIC02Mzl9LAorIHsgIDM0NywgICA1MDksICAgMjA4LCAgLTE3OSwgIC00NjQsICAtNzI4LCAgIC03NiwgIC0yMzcsICAtNDg2fSwKKyB7IC0xMDMsICAtMzQzLCAgLTc1NiwgIC03MTMsICAtMjY1LCAgLTYwOSwgIC0xOTEsICAtMzk4LCAgLTYzNn0sCisgeyAtMTIxLCAgLTM4MywgIC03NDksICAgNTY3LCAgIDI1MiwgICAtMzYsICAtMzU0LCAgLTQxNywgICAtNTB9LAorIHsgIDIwNCwgICAxMDAsICAtMTQ5LCAgLTY1MCwgLTEwODEsICAgLTQ3LCAgICAtNywgIC0yNjMsICAgMTExfSwKKyB7ICAtNDYsICAtMTgwLCAgLTI2NywgIC0zMjQsICAtNTYyLCAgLTM5NCwgIC02OTIsICAgMzk4LCAgIDI5Mn0sCisgeyAgNDgyLCAgIDY3MCwgICA2ODMsICAgNjI0LCAgIDQ0MiwgICAxNjUsICAgMTE2LCAgICAzNiwgIC0xNDl9LAorIHsgIDEwOCwgICAyNDcsICAgMjkxLCAgIDI0NywgICAzNTUsICAgMTIyLCAgIDEwOSwgICAyMjQsICAgMjk2fSwKKyB7ICAtMTQsICAgOTQ1LCAgIDk5MCwgICA4MDEsICAgNzU1LCAgIDgxNSwgICA4NDcsICAgOTEzLCAgIDg5Mn0sCisgeyAgMjkyLCAgIDM0OSwgICA3MjUsICAgNDgyLCAgIDM4OCwgICAzMjksICAgNDI5LCAgIDYyMCwgICA2Njd9LAorIHsgIC0zNCwgICAxOTcsICAgMjEzLCAgLTEyNywgICAgODQsICAgNDk0LCAgIDYyMCwgICA1NzUsICAgMzc1fSwKKyB7ICAxMjYsICAgMjA3LCAgIDE3MiwgICAxNjcsICAgMzYyLCAgIDIwMiwgICAyOTYsICAgMzk1LCAgIDQ1NX0sCisgeyAgIC02LCAgIDI1MCwgICA1MzksICAgNDY3LCAgIDYzNiwgICA4MDEsICAxMTQ5LCAgMTI4NywgIDExMTh9LAorIHsgICAyNywgICAyNDAsICAgMzY5LCAgIDI4MCwgICA0NDAsICAgNDExLCAgIDYzNCwgICA4OTIsICAgOTUzfSwKKyB7ICAxNTksICAgMTcwLCAgIC01OCwgIC0zOTUsICAtNzk3LCAgLTY5MCwgICAgNzcsICAtMjExLCAgLTMzNH0sCisgeyAgIC01LCAgIC0yOCwgICAtMTMsICAgLTc0LCAgLTMzNSwgIC02MDMsICAgMzAwLCAgICA4OCwgIC0yMDV9LAorIHsgICA4MiwgICAtMzMsICAtMzY0LCAgLTY5OCwgLTEyMDMsIC0xMTUzLCAgIDExMCwgIC0xNDYsICAtMjg5fSwKKyB7ICAxMTMsICAgICAxLCAgLTI0MywgIC01ODgsICAtOTk0LCAgLTQ5NiwgICA0MTQsICAgMTYwLCAgICA0Mn0sCisgeyAgLTU2LCAgLTI0NywgIC00NDAsICAtNjkzLCAgLTk5NiwgIC00NzksICAgIDExLCAgLTE3OCwgIC0zNTd9LAorIHsgLTE1MSwgIC0zNTMsICAtMzI3LCAgLTIxMSwgIC0zNDAsICAgMTQxLCAgICA2NSwgICA0MjUsICAgNDUzfSwKKyB7ICAgMzQsICAtMTY5LCAgLTQ1NSwgIC05MzIsIC0xMjE1LCAgIDEzOCwgICA0OTksICAgMjU2LCAgIDMyNH0sCisgeyAgIDY4LCAgIDEzOSwgICAtMTUsICAtNTQ3LCAgLTQ3OCwgICAgMTcsICAgMzA2LCAgIDUwMiwgICA0ODF9LAorIHsgIC0zMiwgIC0xMzQsICAgNDQ1LCAgIDEyOSwgIC0xNDMsICAtMjQ0LCAgLTUwMywgIC01MDcsICAtNTk5fSwKKyB7ICAgNjEsICAtMTQwLCAgLTM0NSwgICA0OTYsICAgNDU4LCAgICAtMiwgICAgMjAsICAtMjI3LCAgLTUxNH0sCisgeyAgMzk0LCAgMTc2NSwgIDE2NjYsICAxMzM5LCAgMTExNywgICA4MDYsICAgNjQyLCAgIDQ3OSwgICAzODB9LAorIHsgIDIxNSwgICA1MTksICAgOTIwLCAgMTA1MywgIDEwOTAsICAgNzkxLCAgIDUyOCwgICAyOTAsICAgMTU1fSwKKyB7ICAtNTQsICAtMjMzLCAgLTY0NywgIC02MDIsICAgNjM5LCAgIDI5NCwgICAgLTIsICAtMTY3LCAgLTQ0Mn0sCisgeyAgLTc4LCAgLTMxNSwgIC03OTEsICAtMTEzLCAgIDgyMCwgICA0MDMsICAgMTU4LCAgLTExNiwgIC0zNTZ9LAorIHsgIDUyOSwgIDE4NTEsICAyMDAzLCAgMTIyOCwgICA2MjIsICAgLTQxLCAgLTQxNiwgICAzNDQsICAgODE5fSwKKyB7IC0xMDUsICAtMzc5LCAgLTIzNiwgIDEyMjQsICAgODkzLCAgIDc0OSwgICA1NjgsICAgMzU2LCAgIDIxNH0sCisgeyAgLTE3LCAgLTE5OSwgIC0xNDQsICAgIDUwLCAgLTI4MywgIC0yNDcsICAtNTc4LCAgLTg0NiwgLTEwODd9LAorIHsgICA2OSwgICAtMTEsICAtMzgxLCAgLTIwNiwgICAyMDksICAtMjg0LCAgLTM4NywgIC00MTYsICAtNzE2fSwKKyB7ICAgMzksICAgIC01LCAgLTE0NSwgIC0zNzQsICAtNjgyLCAgLTkwOSwgLTEwNzQsIC0xMTY5LCAtMTA2Nn0sCisgeyAgMjg3LCAgIDIyNiwgICAgNjcsICAtMjIxLCAgLTY2MiwgIC0xNzEsICAtNDIxLCAgLTY0MiwgIC03MDd9LAorIHsgLTEzMiwgIC0zNDgsICAtNTM4LCAgLTQ0OCwgICAtMjAsICAgIC00LCAgLTM1NCwgIC03NDgsICAtOTMzfSwKKyB7ICAgIDQsICAgLTc1LCAgLTI4OSwgIC01OTgsICAgMzE3LCAgICA1MiwgIC0yMDgsICAtMjk3LCAgLTU1OX0sCisgeyAgLTg4LCAgLTI2NCwgIC0zNTgsICAtNTg5LCAgLTYzMSwgIC0yNDgsICAtNTIzLCAgLTgyMiwgLTEwNzF9LAorIHsgICA3MCwgICAgLTgsICAgIDU0LCAgLTMxNCwgIC01MTUsICAgIDkyLCAgLTE0NiwgIC0yNzQsICAtNDkzfSwKKyB7ICAxOTksICAgIDYyLCAgIDM5MSwgICAxNTgsICAtMTQxLCAgICA3MSwgIC0yMTksICAtMjAzLCAgLTIwN30sCisgeyAgMTUyLCAgICA0MCwgICAzMjksICAgMTYyLCAgIC0yOSwgICAgNDgsICAtMTQ5LCAgIDEwOCwgICAxMjd9LAorIHsgIDYzNSwgIDEwNTgsICAgODgzLCAgIDQ5MiwgICAzNzIsICAgMzEyLCAgIDMxNywgICAyNzQsICAgMjQxfSwKKyB7ICAyNjcsICAgNzIyLCAgMTI1NiwgICA4ODIsICAgNjI1LCAgIDI0OCwgICAgIDgsICAgLTgxLCAgIC02MH0sCisgeyAgLTU4LCAgLTEzOCwgIC0yOTEsICAtNjAwLCAgIC0xMiwgICAgLTIsICAgLTM5LCAgIDE0NywgICAxMTd9LAorIHsgLTEwNywgIC0zNDUsICAtNTEzLCAgIDQ1OSwgICAgNzYsICAgIDkyLCAgLTI3MiwgICAzODgsICAgMjYyfSwKKyB7ICAzNjIsICAgNTE2LCAgIDIwMywgIC00MDksICAtNzE2LCAgLTgzMSwgIC0zMzEsICAgMTg1LCAgIDIwOX0sCisgeyAtMTE3LCAgLTM5MSwgIC0yOTgsICAgNjcxLCAgIDI5MiwgICA1MzgsICAgMjU3LCAgIDE2NiwgICAtMzh9LAorIHsgLTEwMiwgIC0zMTksICAtMTk0LCAgLTI4MywgIC01NzMsICAtMjYyLCAgLTU3OSwgIC0yMTksICAtNDQ0fSwKKyB7IC0yMzUsICAgIDc4LCAgICAxMSwgIC0xNjgsICAtMTAxLCAgLTIyOSwgIC0yNjMsICAtMzIxLCAgLTEyM30sCisgeyAgIDcwLCAgICA1MCwgIC0xNzAsICAtNTk5LCAgLTk5NiwgIC01ODgsICAtMjYzLCAgLTUxNiwgIC00NTV9LAorIHsgIDM5NCwgICAzNjMsICAgMjI5LCAgLTEzNiwgIC01MzgsICAgIDIxLCAgLTE4MywgIC0zNDgsICAtMjAxfSwKKyB7IC0xMjQsICAtMzY4LCAgLTY0MCwgIC04NzksICAtODQ3LCAgLTIwOSwgIC00MDksICAtNDk0LCAgLTUxNX0sCisgeyAtMTI3LCAgLTM0MSwgIC01NDEsICAtNDI1LCAgLTUxMCwgICAtMTAsICAtMjUyLCAgLTQ3MywgIC0yOTF9LAorIHsgICA4NCwgICAtNjksICAtMjAxLCAgLTY3NiwgIC04NjgsICAgMTAzLCAgLTMxMSwgIC0xMzIsICAtMzIwfSwKKyB7ICAgIDUsICAtMTczLCAgLTE4OCwgIC0yOTcsICAtNjI4LCAgIDE5NywgICAtNTcsICAgICA3LCAgIC0xMX0sCisgeyAgIDQ5LCAgLTE2MCwgICAgNTYsICAgNTU4LCAgIDExMSwgICAgMzMsICAtMzExLCAgLTQ0MCwgIC00NjN9LAorIHsgICAtMSwgIC0yNDYsICAtMzA3LCAgIDg2MiwgICA0NTMsICAgMTM5LCAgLTE3MCwgIC0zNTUsICAtMjMyfSwKKyB7ICAyNzksICAgOTY2LCAgMTY0MiwgIDE0NzgsICAxNDYzLCAgMTEyMywgICA3OTUsICAgNTI1LCAgIDMzOX0sCisgeyAtMTk3LCAgIC0zOCwgIDE3MDIsICAxMzMxLCAgMTI1MiwgICA5NTAsICAgNjkyLCAgIDUwNCwgICA0MjZ9LAorIHsgLTEwOCwgIC0zNDQsICAtODYxLCAtMTE3MiwgICA0NDQsICAgMzU0LCAgICA4OCwgICAtNDYsICAtMjIwfSwKKyB7ICAtNTMsICAtMzIxLCAgLTQ5NCwgIDExMTMsICAgNzQ0LCAgIDM2NCwgICAxOTgsICAgLTM0LCAgIC03NX0sCisgeyAgNDU3LCAgIDk1NSwgIDExNzcsICAxMjE0LCAgMTQyNywgIDE0NTcsICAxMzQ1LCAgIDkxNywgICA1Mzl9LAorIHsgIC02OSwgICAxOTksICAgODk3LCAgMTE0MCwgIDEzNDMsICAxMTgzLCAgIDk3NywgICA3NDIsICAgNTIyfSwKKyB7ICAxMjIsICAgIDQ0LCAgLTI2OSwgICAgMjcsICAtMTU1LCAgLTU2MiwgIC0zMDcsICAtNTkwLCAgLTc3M30sCisgeyAgMTU0LCAgICA0MiwgIC0xNjAsICAgMjUyLCAgLTEyOSwgIC0zMDUsICAtNDcxLCAgLTczMywgIC0zNzF9LAorIHsgIDEzNSwgICAxODUsICAgLTgyLCAgLTQxNiwgIC03MjIsICAtOTEzLCAgLTUwNCwgIC03NDMsICAtODgwfSwKKyB7ICAxNDksICAgMjE0LCAgIC04NCwgIC0zMjksICAtNjgwLCAgLTgzNSwgIC00MjYsICAtNjYxLCAgIC04MX0sCisgeyAtMTI4LCAgLTM4MCwgIC03MzUsICAtOTk4LCAgLTMzNywgICAgMTcsICAtMTgyLCAgLTQ2NywgIC02OTd9LAorIHsgIC04NCwgIC0yOTAsICAtNTEwLCAgLTU5MiwgICAgMTMsICAgNDQwLCAgIDE1NCwgICAtMzgsICAtMjc5fSwKKyB7ICAgNzAsICAgLTYxLCAgLTI0NiwgIC03MjcsIC0xMDQ3LCAgIC04MCwgIC0zODEsICAtNTM1LCAgLTcwNH0sCisgeyAgMTc4LCAgICAtMiwgIC0xNDYsICAtNjcwLCAgLTkzOCwgICA0ODIsICAgMTM4LCAgICA2MywgICAgNjV9LAorIHsgIC0xMSwgICAgMTUsICAgNzcyLCAgIDQ0MywgICAxNDIsICAgLTIwLCAgLTIwOSwgIC0xMjYsICAtMTYxfSwKKyB7ICAtMzIsICAtMjQ5LCAgICA5NSwgICA1NTIsICAgMTI0LCAgICAzMCwgIC0zNDMsICAgIDgyLCAgIC04Nn0sCisgeyAgMTQ4LCAgIDc1MSwgIDE1MTUsICAxMTA1LCAgIDg2NywgICA2MDYsICAgNDc0LCAgIDQ0OCwgICAzOTl9LAorIHsgLTE2MywgIC0yNTcsICAgODk5LCAgMTA5NywgICA5MDYsICAgNzUxLCAgIDUwMiwgICAzOTAsICAgMjk0fSwKKyB7ICAtNTEsICAtMjU4LCAgLTQ0NywgIC04MDYsICAtMzY4LCAgIDc2MywgICA0NjQsICAgMzY0LCAgIDE4M30sCisgeyAtMTY2LCAgLTM3NCwgIC0zNjcsICAgIDg3LCAgICAzNSwgICAzOTksICAgNDE4LCAgIDg1NiwgICA4MzN9LAorIHsgLTIwNSwgIC0zMTAsICAgNTg4LCAgIDc3OCwgICA3ODUsICAxMDY1LCAgMTExOCwgIDEyNDUsICAxMTU3fSwKKyB7IC0xNzMsICAtMzEyLCAgIDEwNywgICAzNDUsICAgNDAwLCAgIDc5MCwgICA4NzAsICAxMTEzLCAgMTAwMX0sCisgeyAgIC03LCAgLTEyMCwgIC0zODcsICAtNDEwLCAgLTYxNCwgIC05NDMsICAtMjI2LCAgLTM4NCwgIC00OTF9LAorIHsgLTIwMywgIC0yODgsICAgLTUxLCAgLTMzMSwgICAtOTAsICAtMTc4LCAgLTQwOCwgIC01NzMsICAtMzM4fSwKKyB7ICAgNTYsICAgLTI5LCAgLTI3MywgIC02MjcsIC0xMDQxLCAgLTc5OCwgIC0yNDcsICAtNDY3LCAgIDE0OH0sCisgeyAgIDY2LCAgICAtMiwgIC0yMDUsICAtMjA1LCAgLTU3NSwgIC0zNDksICAgLTU3LCAgLTM1MiwgICAtNTh9LAorIHsgIC00NSwgIC0yMjUsICAtNDcxLCAgLTkyNCwgIC00OTcsICAgIDc3LCAgIC0zMiwgICAgNDQsICAtMTM1fSwKKyB7IC0yNzcsICAtNDkxLCAgLTQ5NywgIC01MDIsICAtNDI0LCAgLTIwMiwgIC0xMzcsICAgIDc3LCAgICA5Nn0sCisgeyAgIDI2LCAgLTE3OSwgIC00NjksIC0xMDA4LCAtMTI2MCwgICAyNjIsICAgLTM1LCAgLTEzMiwgIC0yNTl9LAorIHsgIC02NiwgIC0yMzIsICAtNDQ3LCAgLTUzMywgIC03ODksICAtMTkxLCAgLTEwMCwgIC0yNjcsICAgMzY0fQorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZGljbzJfaXNmWzI1Nl1bN10gPSB7CisgeyAgMTM1NywgIDEzMTMsICAxMTM2LCAgIDc4NCwgICA0MzgsICAgMTgxLCAgIDE0NX0sCisgeyAgIDYzNiwgICA2NDgsICAgNjY3LCAgIDU2OCwgICA0NDIsICAgMjE3LCAgIDM2Mn0sCisgeyAgIDQyNywgICA0NDAsICAgNjc0LCAgIDUyNCwgICAzMzIsICAgMTE3LCAgLTQxN30sCisgeyAgIDEyMSwgICAyOTUsICAgNDY4LCAgIDQ2NSwgICAyMzAsICAgIDQ0LCAgLTIyMX0sCisgeyAgLTE0NywgIC0yNDAsICAgMTQ5LCAgICA4MCwgICAzOTAsICAgMjc4LCAgIDEwNn0sCisgeyAgLTQxOCwgIC01NTYsICAgNTUyLCAgIDUxMSwgICAyMzUsICAgMTQ0LCAgIC05NX0sCisgeyAgICA0MywgICAxOTMsICAgMjc0LCAgIDE1MCwgICAgNjcsICAgIDM0LCAgLTI3M30sCisgeyAgIC00MywgIC0xMjYsICAgMTcxLCAgIDQxNiwgICAyODIsICAgIDYzLCAgLTM1NH0sCisgeyAgLTM3MiwgICAtODYsICAtMzQ0LCAgLTEwOCwgICAtOTQsICAtMTgyLCAgIC04OX0sCisgeyAgLTYwMCwgIC04NDAsICAtMjAwLCAgIDQ2NSwgICAyNTgsICAgLTExLCAgLTI1M30sCisgeyAgIC00OCwgICAzMjksICAgIDk3LCAgLTI5MCwgIC01NDMsICAtNzk1LCAgLTM1NH0sCisgeyAgLTU3MCwgIC0xMTcsICAgMTg3LCAgICAxMCwgIC0xMzMsICAtNDE2LCAgIC03Nn0sCisgeyAgLTYxOCwgIC0xMjksICAtMjQ3LCAgLTM3MSwgICAgNDUsICAgLTc2LCAgIDI3N30sCisgeyAtMTAyMiwgLTEwNzksICAgMTI2LCAgIDQ3NCwgICAyNTQsICAgMTI3LCAgICA1Mn0sCisgeyAgLTI4MSwgICAgNzYsICAtMTY3LCAgLTM2MSwgIC0yODMsICAtNTUxLCAgLTI4M30sCisgeyAgLTExOSwgICAtNTIsICAgIC0xLCAgIDEzNCwgICAtMzIsICAtMjA0LCAgLTQxNX0sCisgeyAgMTA2NCwgICA4MjcsICAgNjM3LCAgIDY4NCwgICA0NjQsICAgMjA5LCAgICAxMn0sCisgeyAgIDQ4MiwgICA0MTYsICAgNDQ5LCAgIDM3MSwgICAzMzUsICAgMjk0LCAgIDE5NH0sCisgeyAgIDcxOSwgICA1NzYsICAgMzY1LCAgIDEzNSwgICAxMTMsICAgIDkxLCAgLTE5OX0sCisgeyAgIDI5OCwgICAxNzYsICAgNDkzLCAgIDM2NiwgICAxOTQsICAgMTYzLCAgICAzNn0sCisgeyAgIC0zNSwgIC0yMzYsICAtMjU5LCAgIC0zNiwgICAgLTQsICAgIDk5LCAgIDE1Mn0sCisgeyAgIC05OCwgIC0zMDYsICAgLTI3LCAgIDIyOCwgICAgOTAsICAgMTExLCAgIC04Nn0sCisgeyAgICA5MSwgICAgMTMsICAtMjExLCAgLTI1OCwgIC0xMDYsICAgIDg2LCAgIC02NH0sCisgeyAgICA3MywgICAtMzUsICAgLTU3LCAgIC0zMSwgICAxNjIsICAgIDM1LCAgLTE5Mn0sCisgeyAgLTEwOSwgIC0zMzUsICAtNjI5LCAgIC02NiwgICAtNjEsICAtMTI4LCAgIDMyMn0sCisgeyAgLTQ5NSwgIC02NjksICAtNzI4LCAgIDE5MywgICAgMzEsICAtMjIwLCAgIDEyMn0sCisgeyAgIDMyNCwgICAgOTUsICAgLTg5LCAgIC05MSwgIC00MDksICAtNzEwLCAgLTE1NH0sCisgeyAgICAgMCwgIC0yMzQsICAgIDkyLCAgICAzMywgIC0zNDMsICAtNjA5LCAgLTIyMH0sCisgeyAgLTM0MywgIC00MDgsICAtNDc2LCAgLTY1NSwgIC0xNTMsICAgIDgyLCAgIDIyMn0sCisgeyAgLTQ5MCwgIC03NDUsICAtMjU1LCAgICA0OSwgICAtNDgsICAgMTM1LCAgLTEyN30sCisgeyAgIDExOSwgICAtNjcsICAtMzI4LCAgLTM5MCwgIC0yNzIsICAtNTQ1LCAgIC01Nn0sCisgeyAgIC01NywgIC0xMzAsICAgLTEwLCAgICAtNywgIC0xNjQsICAgLTQ3LCAgIC0yMn0sCisgeyAgIDk4NCwgIDEwNjQsICAgOTYxLCAgIDU2OCwgICAyMTAsICAgLTI3LCAgICAxNn0sCisgeyAgIDgxMSwgICA2OTEsICAgNzU0LCAgIDUxNCwgICAyMjQsICAgLTM1LCAgIDE2Nn0sCisgeyAgIDY2MiwgICA3MDQsICAgNjE4LCAgIDM4NiwgICAgNTcsICAtMjExLCAgLTI1N30sCisgeyAgIDUxMCwgICAzNTksICAgNDE4LCAgIDM5MywgICAgOTEsICAtMTQ0LCAgIC0xOH0sCisgeyAgLTE5MywgICAtMzEsICAgLTI3LCAgIDIyMywgICAgODksICAtMTQzLCAgICAyNH0sCisgeyAgLTExMiwgICAtOTgsICAgNDcxLCAgIDMxOSwgICAxODUsICAgICAzLCAgIDE3NX0sCisgeyAgIDI1MiwgICAxNDYsICAgLTQ3LCAgIDI3MiwgICAgNDgsICAtMjExLCAgLTIzNH0sCisgeyAgIDE0NiwgICAgNjksICAgMjAzLCAgIDM2NCwgICAgNjgsICAgLTUyLCAgICA1MX0sCisgeyAgLTI1OSwgIC00NzgsICAtNjk3LCAgLTM0OSwgIC03NTgsICAtNTAxLCAgICA2M30sCisgeyAgLTUwMSwgIC03NjksICAtMjg5LCAgICA3OSwgIC0zMTEsICAtNDk3LCAgLTEwNn0sCisgeyAgIDI1MSwgICAgNTMsICAtMjM1LCAgLTQ2OSwgIC04OTUsICAtODg0LCAgIDE0NX0sCisgeyAgLTQxNiwgIC01NTEsICAgMTQwLCAgLTEzMywgIC01MjMsICAtNzc1LCAgICA0NH0sCisgeyAgLTMyNiwgIC00MjMsICAtNzEzLCAgLTQ5NywgICAtODYsICAtNDMxLCAgICA5OX0sCisgeyAgLTc1NywgIC03NzIsICAtMTYwLCAgIC03NiwgICAtNDYsICAgLTMyLCAgIDM3OX0sCisgeyAgICA4NSwgICAtMzUsICAtMjAwLCAgLTQwMSwgIC02NjMsIC0xMDQwLCAgLTI0N30sCisgeyAgLTE4MCwgIC0zMzAsICAgLTkyLCAgLTM3NiwgICAgMjcsICAtMTgzLCAgLTExMH0sCisgeyAgMTI3OSwgIDEwODYsICAgNzgxLCAgIDUwMiwgICAzMjQsICAgMTY0LCAgIDE1N30sCisgeyAgIDY4MiwgICA0NjYsICAgNDQ5LCAgIDI3NywgICAxNDYsICAgIDI4LCAgIDQwOX0sCisgeyAgIDYzNSwgICA0NzIsICAgMzkwLCAgIDEwNywgIC0yMzIsICAtNTM4LCAgLTEzOX0sCisgeyAgIDE5NiwgICAzOTYsICAgMzMyLCAgIDIxMywgICAyMDksICAgLTI5LCAgIC04MX0sCisgeyAgIDE1MCwgICAtOTUsICAtMzEyLCAgICA3NiwgICAtNzcsICAtMzIwLCAgIC01MH0sCisgeyAgICA0NiwgICAgIDksICAgIDQ3LCAgIDE3NSwgICAxMzksICAgIDMwLCAgIDM4NH0sCisgeyAgIDIxOCwgICAyMDYsICAgLTI0LCAgLTI1MCwgICAtOTYsICAtMjc2LCAgLTE4M30sCisgeyAgICAyNiwgICAxMTksICAgIDM4LCAgICAxNCwgICAgLTQsICAtMTMzLCAgIC01Mn0sCisgeyAgLTQ3NywgIC02MTQsICAtOTg3LCAgLTcxNSwgIC02MzEsICAtODEzLCAgIDIwMH0sCisgeyAgLTc0NCwgLTEwMDksIC0xMDY1LCAgLTc0NSwgIC02MzEsICAtMTcxLCAgICAxOH0sCisgeyAgLTEzNywgIC0yNTEsICAtNDgzLCAgLTYxMywgIC05ODAsIC0xMjAzLCAgICAxMn0sCisgeyAgLTYwNSwgIC03NjcsICAtNTYyLCAgLTY4NiwgLTEwODgsICAtNTE1LCAgICA1OH0sCisgeyAgLTIwMiwgIC00MjgsICAtNzgyLCAtMTA3MiwgICAtOTYsICAtMjM0LCAgLTE3OX0sCisgeyAgLTQ4MCwgIC03MDksIC0xMDcwLCAgLTg5NywgIC0xMzEsICAgLTkyLCAgIDMyMX0sCisgeyAgLTE0NSwgIC0xOTMsICAtNTEyLCAgLTcyOSwgIC01NzIsICAtNzY1LCAgLTIxMH0sCisgeyAgLTMzMSwgIC01ODUsICAtNTI1LCAgLTYzMSwgIC0yODEsICAtMjA4LCAgLTMwM30sCisgeyAgMTE2NSwgIDExMDQsICAgOTM5LCAgIDgyOCwgICA3MTYsICAgNDI2LCAgIDE1NX0sCisgeyAgICAgNiwgIC0xMDksICAgODIwLCAgIDc3OCwgICA0MTUsICAgMTEzLCAgIC0yN30sCisgeyAgIDM4MSwgICAzMzksICAgMzE0LCAgIDI2NSwgICAxMjEsICAgIC05LCAgLTQ3NH0sCisgeyAgLTM3MywgICAgNDcsICAgNTg0LCAgIDQ0MiwgICAgOTksICAtMjMxLCAgLTExM30sCisgeyAgLTQ5NiwgICAtMzgsICAtMjg1LCAgIDI2MiwgICAzMDUsICAgMTcwLCAgICAgNH0sCisgeyAgLTU4NywgIC01NTYsICAgIDY5LCAgICA2NiwgICA0NzEsICAgMzU0LCAgICAxM30sCisgeyAgLTEzOCwgICAgNzAsICAgLTE4LCAgIDEwNiwgICAgNjcsICAgMTY3LCAgLTMwMn0sCisgeyAgLTQ0NSwgIC0xNDEsICAgMTg1LCAgIDE5MSwgICAxNTEsICAgIDgzLCAgLTEzM30sCisgeyAgLTI1NywgIC01MjEsICAtNzIwLCAgLTE5OCwgICAxMzQsICAgLTQ2LCAgLTE4Mn0sCisgeyAgLTgxOSwgLTExNjgsICAtNzc3LCAgIDUxMiwgICAzNTksICAgIDk1LCAgLTExM30sCisgeyAgIDEzNywgICAgLTIsICAgLTc0LCAgLTEzOCwgIC00MDEsICAtMTE0LCAgLTM3MX0sCisgeyAgLTI0MiwgIC00NjYsICAgMjA0LCAgIDIyMywgICAtMzEsICAtMjEyLCAgLTE5Mn0sCisgeyAgLTUzMiwgIC02MzcsICAtNDY2LCAgLTY4NiwgICAyNTYsICAgMjc3LCAgLTEzOX0sCisgeyAtMTE0MSwgLTEyNDQsICAtMzgxLCAgIC03NSwgICAtNTQsICAgIDE0LCAgICA4OH0sCisgeyAgLTMxMSwgICAxMTUsICAtMTQzLCAgLTQ5OSwgIC0zNDMsICAgMTI0LCAgLTQxNn0sCisgeyAgLTYxNiwgIC0xNDcsICAtMTM1LCAgICA0MywgICAgLTQsICAgMTIxLCAgLTM2OX0sCisgeyAgIDgzNSwgICA3ODMsICAgNjQxLCAgIDM5MCwgICAzNTUsICAgMzUwLCAgICA2NH0sCisgeyAgICA3MiwgICAxOTQsICAgNDQzLCAgIDQ2NywgICA0MzYsICAgMjE5LCAgIDM3Mn0sCisgeyAgIDQ2NCwgICAzNjksICAgMTkyLCAgICAgNCwgIC0xNTYsICAgLTcyLCAgLTIyNn0sCisgeyAgICA1NywgICAyMDYsICAgMzAzLCAgIDIwNSwgICAxODgsICAgMTAxLCAgIDI2NX0sCisgeyAgIC00MCwgIC0yMDUsICAtNDg4LCAgLTE4NCwgICAyNzYsICAgIDY0LCAgIC0yNn0sCisgeyAgLTIxNywgIC00MzMsICAtMjk3LCAgIDEzNywgICAzMjgsICAgMzA4LCAgLTI4OX0sCisgeyAgIDM3OCwgICAgODEsICAtMzA4LCAgLTQ2NSwgICAgNTcsICAgLTM3LCAgIDIyN30sCisgeyAgLTEwMCwgICAgMjQsICAgLTM2LCAgLTE1MSwgICAxOTksICAgICA4LCAgIDE0M30sCisgeyAgLTQyNiwgIC02OTcsIC0xMDU5LCAgLTEzMywgICAzODgsICAgMTYxLCAgIDMyMX0sCisgeyAgLTY0NCwgLTEwMjMsIC0xMjcxLCAgICAzOSwgICAgNjYsICAtMTIzLCAgICA3MH0sCisgeyAgIDM3MiwgICAxNzcsICAtMTczLCAgLTU1NiwgIC01NTMsICAtMzA0LCAgLTE4OX0sCisgeyAgLTExNywgIC0zNjksICAtNDI1LCAgLTEyMiwgIC00NjIsICAtMTUyLCAgIC03M30sCisgeyAgLTY0OSwgIC04NTAsIC0xMTg5LCAgLTc2NywgICA0OTcsICAgMzYwLCAgIDIyMn0sCisgeyAgLTc5OCwgLTExMzksIC0xNDU1LCAgLTE5MCwgICA0MzAsICAgMjM0LCAgIDE3OX0sCisgeyAgICA0MiwgICAtOTQsICAtNDA1LCAgLTY5MiwgICAgMzgsICAtMjAyLCAgLTI0Nn0sCisgeyAgLTE2OSwgIC0zNjYsICAtMjkwLCAgIC04OCwgICAtNjQsICAgIDMyLCAgLTI5Mn0sCisgeyAgMTAxMCwgICA5MjMsICAgOTM4LCAgIDcxMCwgICA0NjUsICAgMjMwLCAgIDM0Mn0sCisgeyAgIDIxNywgICAzMDAsICAxMDU0LCAgIDY3NSwgICAgNjgsICAtNDU4LCAgLTE3OX0sCisgeyAgICA3OCwgICA0NTMsICAgMzE2LCAgICAxOCwgIC0yMzcsICAtNDk2LCAgLTI0M30sCisgeyAgIDE2NywgICAgMjEsICAgNDI0LCAgIDIxNSwgICAtOTEsICAtMzAzLCAgLTE3MH0sCisgeyAgLTI5MCwgICAtODEsICAgLTcwLCAgIC02NywgICAgNDAsICAgIDU0LCAgIC01OX0sCisgeyAgLTM1MywgIC00MjcsICAgLTkwLCAgICA1MywgICAgOTQsICAgICA5LCAgICA1NH0sCisgeyAgIC0yOCwgICAzMTgsICAgMjgzLCAgICAxNSwgIC0yNDAsICAgLTU4LCAgICA3OX0sCisgeyAgIC03NSwgIC0xMjEsICAgMjI5LCAgICAzNSwgICAgNTgsICAgICA2LCAgLTEzM30sCisgeyAgLTM1MSwgIC01MTQsICAtNzQ0LCAgLTgzNCwgIC03MDUsICAtMTM3LCAgIDE2NH0sCisgeyAtMTEyNCwgLTEzODgsIC0xMDU1LCAgLTIzMCwgICAtNzMsICAgIDQwLCAgICAzNn0sCisgeyAgLTE2MywgIC0yMzMsICAtNTMyLCAgLTc4NSwgLTExNzAsICAtNjk3LCAgICA5Nn0sCisgeyAgLTc4OCwgIC05NTksICAtMjQ2LCAgLTQzMCwgIC02MjQsICAtMTY1LCAgICAtOH0sCisgeyAgLTg1NiwgIC01NDAsICAtNjMwLCAgLTkwNywgIC0zMzcsICAgLTcwLCAgICA3Nn0sCisgeyAgLTkzNywgLTEwNDIsICAtNjU5LCAgLTczMywgIC0yMDgsICAgMTk5LCAgIC0yNn0sCisgeyAgLTUyMywgICAgNzgsICAgLTk4LCAgLTUwMSwgIC04NjksICAtODkwLCAgIC04MX0sCisgeyAgLTYyNCwgIC03MDMsICAgLTQ1LCAgLTM0OCwgICAtMjUsICAgIDg3LCAgLTE4Nn0sCisgeyAgMTAwNSwgICA4MjMsICAgNTQ2LCAgIDI0OSwgICAgOTAsICAgLTIyLCAgIDIwN30sCisgeyAgIDI5OCwgICAzOTcsICAgMzgxLCAgIDMxOSwgICAyMDAsICAgIDYyLCAgIDMwM30sCisgeyAgIDQ3MywgICAzNzksICAgMTMzLCAgLTI0NywgIC02MzIsICAtNDQxLCAgICA3NX0sCisgeyAgIDI4NCwgICAyMDgsICAgMzkxLCAgIDExNSwgICAtMjUsICAgIDQ0LCAgICA5NX0sCisgeyAgIC03MiwgICAgNzksICAgLTk1LCAgIC02MywgIC0xMjksICAtMjkzLCAgIDIwM30sCisgeyAgLTE2NCwgIC0zNDksICAgMTE1LCAgIDEyMiwgICAgNjksICAgIC0xLCAgIDM3OH0sCisgeyAgIDM0OCwgICAxNzAsICAgIDk5LCAgICA1OCwgIC0xNzksICAtMzAyLCAgIDE4OH0sCisgeyAgLTE5MCwgICAgLTIsICAgMTUwLCAgICAyMywgICAtNTEsICAgLTExLCAgIDIxNn0sCisgeyAgLTYxNSwgIC04NjMsIC0xMDkwLCAtMTQyNywgIC04MDIsICAgLTQ4LCAgICAtNn0sCisgeyAgLTk2MSwgLTEyNzYsIC0xNTQ4LCAgLTcyNywgICAtNTgsICAgIDU2LCAgIDIyM30sCisgeyAgLTEyNCwgIC0yNTUsICAtNTYxLCAgLTk4OCwgLTEyNzcsICAtMTQ4LCAgIC04Mn0sCisgeyAgLTQ4MCwgIC02NjAsICAtODkxLCAtMTE5MSwgLTEzMzksICAtMzI1LCAgICAyMH0sCisgeyAgLTYyMSwgIC05MTcsIC0xMjk2LCAtMTM1MCwgICAyNjQsICAgMjg5LCAgICA1MH0sCisgeyAgLTg0NCwgLTEwMjIsIC0xMzQ1LCAtMTMyOSwgIC0yOTMsICAgIDQ2LCAgIDI3OH0sCisgeyAgLTI2MCwgIC00NjgsICAtODI5LCAtMTE3NiwgIC01MzMsICAtNTYwLCAgIC03OH0sCisgeyAgLTIxNSwgIC00ODQsICAtODIyLCAtMTIzMywgIC03OTEsICAgIDE1LCAgLTEzOH0sCisgeyAgMTMwMSwgIDEzMTcsICAxMjYyLCAgMTA0OCwgICA3MTYsICAgMzU3LCAgIC02NH0sCisgeyAgIDU3OCwgICA4MjQsICAgOTI1LCAgIDgwMiwgICA2MzAsICAgMzYyLCAgIDEwMn0sCisgeyAgIDQ3MCwgICA5MjUsICAgNzY3LCAgIDUxNCwgICAzMjcsICAgMTkwLCAgLTExMn0sCisgeyAgIDIyNSwgICA0OTIsICAgNDk1LCAgIDQzNywgICA1OTgsICAgMzg0LCAgIC00NX0sCisgeyAgICA0MywgICAgODIsICAgLTQyLCAgIDE3NSwgICA1MTksICAgMzQyLCAgIC02NH0sCisgeyAgLTMwNCwgIC0xNTQsICAgMTU5LCAgIDU3NiwgICA0MDMsICAgMjIxLCAgIDMyN30sCisgeyAgIDIxNCwgICAyNDQsICAgMTIyLCAgIC02MiwgICAzMTIsICAgIDkyLCAgLTE2MH0sCisgeyAgIDIxOCwgICAyMDgsICAgMzEwLCAgIDI2OCwgICAzMDYsICAgMzIzLCAgLTE5OX0sCisgeyAgLTI4NSwgIC0yNjksICAgLTc5LCAgLTEyNCwgIC0xNDMsICAtMTUzLCAgIDIzNn0sCisgeyAgLTIwNSwgIC0zODQsICAtNDI2LCAgIDM0NCwgICAgNTksICAtMTg1LCAgLTE4NH0sCisgeyAgLTI3MiwgICAyNDcsICAgMTI2LCAgLTIxMCwgIC01MTgsICAtNDY4LCAgICA3OH0sCisgeyAgIC05OSwgIC0xMjAsICAgNTAyLCAgIDE2MCwgIC0yODAsICAtNTU3LCAgIDMwNH0sCisgeyAgLTQyMywgICAtMTcsICAtMjgzLCAgLTQ0MywgICAyMTUsICAgMjEyLCAgLTE0MH0sCisgeyAgLTU2NCwgIC02ODQsICAtMjI4LCAgIDUxMCwgICAzNjEsICAgMTMwLCAgIDMyM30sCisgeyAgLTQyOCwgICAzMzUsICAgIDk4LCAgIC02NSwgICAgMzYsICAtMjE1LCAgLTI0Nn0sCisgeyAgLTM2MiwgICAgNTEsICAgMzY0LCAgIC0xNiwgIC0yMzQsICAgMTUwLCAgLTE2NX0sCisgeyAgIDkxNCwgICA4ODMsICAgNzUxLCAgIDY1MywgICA2NzYsICAgNDY0LCAgLTE1M30sCisgeyAgIDYzMSwgICA1NDUsICAgNTM1LCAgIDcyMCwgICA1OTYsICAgMzYwLCAgIC04MX0sCisgeyAgIDc4MywgICA3MTIsICAgNTEyLCAgIDQzOSwgICAzNDEsICAgMjUxLCAgLTM5MX0sCisgeyAgIDQ5NywgICA0MTcsICAgMjQ5LCAgIDM3MiwgICAyOTUsICAgMTczLCAgLTE5M30sCisgeyAgIDEyOCwgIC0xMTAsICAtMzg1LCAgICA5MywgICAgMzksICAgMTczLCAgLTIzMX0sCisgeyAgIDIxNiwgICAtNTksICAtMjUzLCAgIDQ2MiwgICAzODksICAgMTU0LCAgICA2OX0sCisgeyAgIDQ1NSwgICAyNzAsICAgIC00LCAgLTMzNywgICAtNDksICAgMjMzLCAgLTMyMn0sCisgeyAgIDMwNywgICAxNDMsICAgIDUzLCAgIDIxOCwgICAxMjgsICAgMjM2LCAgLTE1Nn0sCisgeyAgIC0zNywgIC0xODYsICAtMjQwLCAgLTQxMSwgIC0xMTAsICAgICA5LCAgIDM5OX0sCisgeyAgLTE0MCwgIC0zNjUsICAtNjI4LCAgIDI1OCwgICAzODAsICAgMjE0LCAgIDI3N30sCisgeyAgIDEzMSwgICA0NTQsICAgMTc3LCAgLTI4NSwgIC01MjAsICAgMTA4LCAgLTIxNH0sCisgeyAgICA3NywgIC0xNDEsICAgMjAxLCAgLTEyMywgIC00OTAsICAtMTMxLCAgICA2MH0sCisgeyAgIC0xNCwgIC0xOTQsICAtNTIxLCAgLTc0MSwgICAyNzMsICAgMzYyLCAgIC0zM30sCisgeyAgLTM2MiwgIC01NjYsICAtMjg3LCAgLTIyOCwgICAxNjEsICAgMjM3LCAgIDMxN30sCisgeyAgLTI2OSwgICAxOTUsICAgLTc1LCAgLTM3NSwgIC0yMDQsICAgIDExLCAgICA3N30sCisgeyAgLTEyOCwgIC0yNjQsICAtMTU2LCAgLTIyMywgIC00NzUsICAgMjY1LCAgICAyN30sCisgeyAgMTIzOCwgIDExNDcsICAgOTE2LCAgIDY4OSwgICA0MzIsICAgMjEwLCAgLTI4MH0sCisgeyAgIDgwMCwgICA2NjQsICAgODc5LCAgIDcyNiwgICA0MTEsICAgMTYwLCAgLTE2NH0sCisgeyAgIDQ1NCwgICA2ODYsICAgNTM2LCAgIDI3NSwgICAxNDcsICAgIDQ2LCAgIDExMX0sCisgeyAgIDMwMywgICA0ODYsICAgNTEyLCAgIDM1NSwgICAyNDEsICAgMTgxLCAgIC02OX0sCisgeyAgICA3OSwgICAgOTIsICAgIDI5LCAgIDE0NywgICAyMzMsICAgIDUyLCAgICAxN30sCisgeyAgLTE3MSwgICAyODksICAgMTMxLCAgIDQzOSwgICAyNzEsICAgICAzLCAgIC0xMH0sCisgeyAgIDQxMywgICAyNDEsICAgMTQ0LCAgIDE3NCwgICAxNTUsICAgIC0yLCAgICAxNH0sCisgeyAgICA1OCwgICAyMTcsICAgMjQ3LCAgIDIxOSwgICAxNDksICAgMTc1LCAgIC0xOH0sCisgeyAgIDIyOCwgICAgLTgsICAtMjQwLCAgLTIwNiwgIC01MTMsICAtMTkxLCAgIDIwMn0sCisgeyAgIC05NiwgIC0yNzIsICAtNDU0LCAgICAzMywgIC0zMDAsICAtNTc1LCAgICA0Nn0sCisgeyAgIC0xMCwgIC0xMDgsICAtMjQ2LCAgLTM0NywgIC03NzAsICAtNTM1LCAgICAgOX0sCisgeyAgLTMyNiwgIC00MzAsICAgLTYxLCAgLTMyMSwgIC03MDQsICAtMjk5LCAgIDIwMX0sCisgeyAgICAtMSwgIC0yODAsICAtNjAzLCAgLTQxOSwgIC0xODUsICAgIDE4LCAgIC0zNn0sCisgeyAgLTUxNiwgIC01MjIsICAtMzc5LCAgLTI5MSwgIC0xODEsICAgLTk3LCAgICAyN30sCisgeyAgLTE1OSwgIC0zMTMsICAtNTI1LCAgLTIyNCwgIC01MTAsICAtODMxLCAgLTE5N30sCisgeyAgLTI5MiwgIC00NTksICAgLTU5LCAgLTMxMCwgIC01NjIsICAtMTQzLCAgLTM1MX0sCisgeyAgMTA2NiwgICA5MTIsICAgNjMxLCAgIDM4OSwgICAyMDcsICAgIDg2LCAgLTIyNH0sCisgeyAgIDU5NiwgICA1MTIsICAgNTk2LCAgIDUwNSwgICAzMTQsICAgMTIyLCAgIC00OH0sCisgeyAgIDc4NywgICA4NjEsICAgNDQxLCAgIC05MywgIC0zMDMsICAgIDMzLCAgLTE5MH0sCisgeyAgIDI1NywgICA0NjksICAgMzM3LCAgICA1MSwgICAgMTUsICAgMjk4LCAgIC05M30sCisgeyAgIDI5NSwgICAgNzMsICAtMTE5LCAgICAyNSwgICAgMzYsICAgIDIzLCAgIDEwOH0sCisgeyAgIC0yOCwgICAgLTMsICAgLTMyLCAgIDExNCwgICAgMjEsICAgMTg1LCAgIDEwN30sCisgeyAgIDQ4MiwgICAzMDUsICAgIDE1LCAgLTI3OSwgIC0zMTksICAgIDUyLCAgICA5Nn0sCisgeyAgIDIyNiwgICAgNDYsICAgMTE1LCAgICA3MiwgIC0xMzYsICAgMTMzLCAgLTEyNX0sCisgeyAgICAxOCwgIC0yMDcsICAtNTU5LCAgLTU5MCwgIC01MDMsICAtNDgyLCAgIDMyMX0sCisgeyAgLTU3MSwgIC03ODksICAtOTUxLCAgLTE3MiwgIC00NDEsICAtNTM4LCAgIDExM30sCisgeyAgIDE4MSwgICAgMTQsICAtMzEwLCAgLTY0MSwgLTEwMDEsICAtMjAyLCAgIDE1OX0sCisgeyAgLTEzNiwgIC0zOTMsICAtNDMzLCAgLTUxMywgIC05MTEsICAtMTQ0LCAgIC0yMn0sCisgeyAgICA3MiwgIC0yNjUsICAtNzA2LCAgLTk1NCwgIC0xNTksICAgIDUzLCAgIDMzMn0sCisgeyAgLTMzOCwgIC01OTEsICAtODUyLCAgLTM4MywgIC0zOTUsICAgIDU2LCAgICA0NH0sCisgeyAgICA0MywgIC0xNTgsICAtNDY0LCAgLTg5NywgIC02MzEsICAtMTU3LCAgLTI5NH0sCisgeyAgLTE2MSwgIC0xMjgsICAtMzI4LCAgLTU3MywgIC00ODMsICAtMTI1LCAgICAxMX0sCisgeyAgMTAxNywgICA5MDYsICAxMDUxLCAgMTAwNSwgICA2NzksICAgMzQxLCAgLTEwMn0sCisgeyAgIDM1OSwgICAzMzQsICAxNTY3LCAgMTMxNCwgICA3MjMsICAgMTA1LCAgICAxMH0sCisgeyAgIC02NSwgICA3MjYsICAgNTI5LCAgIDMwMSwgICAyMjAsICAgIDQzLCAgLTI3M30sCisgeyAgLTUxMCwgICA0MzYsICAgNzE5LCAgIDU2NiwgICAzNTgsICAgMTc5LCAgIDExNH0sCisgeyAgLTU2MCwgICAyOTgsICAgMTMzLCAgLTEyMCwgICAzNDIsICAgMjI1LCAgICAxNH0sCisgeyAgLTg5OSwgIC0xMDEsICAgMjE3LCAgIDYxNywgICA0MDAsICAgMTQ2LCAgIC01OH0sCisgeyAgIC00MSwgICAzNTIsICAgIDgyLCAgLTE5NiwgICAgMzksICAgMTIxLCAgLTE2N30sCisgeyAgLTIxMiwgICAgNTksICAgNDQ3LCAgIDI4NCwgICA0MjMsICAgMjUwLCAgLTE2OX0sCisgeyAgLTM3MSwgIC00ODQsICAtNTk2LCAgICAzMCwgICAtNDEsICAgMjQ5LCAgICAyMn0sCisgeyAgLTM3MiwgIC02NTAsICAtNzk0LCAgIDQ3NywgICA0NDUsICAgMjE2LCAgIC03OX0sCisgeyAgLTM1MiwgICAyNzUsICAgIDE3LCAgLTQ0MywgIC05MjksICAgIDkyLCAgICAxOX0sCisgeyAgLTY5OSwgIC02OTYsICAgNDMxLCAgIDI2NCwgICAtNDksICAtMzEwLCAgIDE4Mn0sCisgeyAgLTk3OCwgIC0yMTcsICAtNDMwLCAgLTQwMCwgICAxMDEsICAgMjYxLCAgICA3Mn0sCisgeyAgLTkyOSwgIC04ODksICAtMzU3LCAgIC0xMywgICA0NjMsICAgMzc4LCAgIDIzNn0sCisgeyAgLTgyNiwgICAgNTYsICAgIDMwLCAgLTI5OSwgIC0zNjAsICAtMTI4LCAgIC01MX0sCisgeyAgLTg3OCwgIC0yOTksICAtMTExLCAgICA3NSwgICAgNjUsICAgIDM2LCAgICAgM30sCisgeyAgIDgxNywgICAzNjgsICAgLTI1LCAgIDM1NCwgICA2OTcsICAgNTkxLCAgLTE3M30sCisgeyAgIDMwOSwgICAyMTIsICAgMjIyLCAgIDc1MSwgICA0ODQsICAgMTQwLCAgIC01Nn0sCisgeyAgIDU5MywgICAzNzksICAgIDcwLCAgICAtOCwgICAyNTgsICAgMTgwLCAgIDExMH0sCisgeyAgIDE2NSwgICAtNDYsICAgMjU1LCAgIDI5NywgICAyMTksICAgMjczLCAgIDEwNX0sCisgeyAgIDE2MCwgICAtNzAsICAtMzU4LCAgLTE4MSwgICAzNzksICAgMzMwLCAgIDMxOX0sCisgeyAgLTIzOCwgIC0zNjksICAtMTk4LCAgIDc0MCwgICA1ODAsICAgMzE5LCAgLTE0M30sCisgeyAgIDIwMSwgICAxMDksICAtMjAyLCAgLTQ1NiwgICAzMjgsICAgMjc2LCAgLTE0MX0sCisgeyAgIDIwMywgICAxNzAsICAgMTExLCAgICA0MiwgICAyMDcsICAgMzYwLCAgIDE4OH0sCisgeyAgLTM0NSwgIC0zOTksICAtNTEzLCAgLTIzMywgICA2NTAsICAgNDIyLCAgICA4MX0sCisgeyAgLTYzNSwgIC05NjEsIC0xMjIwLCAgIDQ2MywgICA1MzksICAgMjA0LCAgIDIwOX0sCisgeyAgIDIwMiwgICAtMjUsICAtMTk0LCAgLTQ5OCwgIC03ODcsICAgMTkzLCAgLTE0M30sCisgeyAgLTQ0OSwgIC01MzgsICAgMTk1LCAgLTEwNiwgIC0zMzEsICAgIDY4LCAgICA2Mn0sCisgeyAgLTIyOCwgIC00NzcsICAtODQwLCAgLTU3NiwgICAzMTcsICAgMTI4LCAgIDI4M30sCisgeyAgLTY3MSwgIC05MzcsICAtODA3LCAgLTExNCwgICAzOTEsICAgMzM1LCAgIC02Mn0sCisgeyAgIDI0NiwgICAgIDIsICAtMzE0LCAgLTY3OSwgIC0zMDMsICAgMTgwLCAgIC04OH0sCisgeyAgLTEwNywgIC0yNzIsICAgIDkwLCAgLTE5OCwgICAtMjgsICAgMjkwLCAgLTExMn0sCisgeyAgIDg4NSwgIDExNDksICAxMDIxLCAgIDcxMiwgICA0OTYsICAgMjgxLCAgIC04M30sCisgeyAgIDI2OSwgICA0OTIsICAgNzg3LCAgIDY0MywgICAzNDcsICAgIDcwLCAgIDEyNH0sCisgeyAgIDMzNiwgICA2MzYsICAgNDk5LCAgICA5MiwgIC0yMjksICAtMTc5LCAgIDE5MX0sCisgeyAgICAyNiwgICA0MDIsICAgNTY0LCAgIDM0MCwgICAxNDksICAgLTExLCAgIDEzNX0sCisgeyAgLTQ0MCwgICA1NjEsICAgNDcwLCAgIDIwNCwgICAtNzIsICAtMTg2LCAgIDE0MH0sCisgeyAgLTcyMCwgICAgMTQsICAgMzU1LCAgIDIyOSwgICAgNjgsICAtMTMzLCAgIDQ2NX0sCisgeyAgIDExMCwgICAzMTAsICAgMTAzLCAgICAxMiwgICAxMDYsICAgIDI5LCAgIDE1OH0sCisgeyAgLTE3OCwgICAxMTMsICAgMTYxLCAgIDE0MiwgICAxMjEsICAgMTE1LCAgICAyN30sCisgeyAgLTY1MSwgIC00MTQsICAtNjQ1LCAgLTE1MiwgIC0xNjQsICAgLTEzLCAgLTQyOX0sCisgeyAgLTYzOSwgIC05NDQsICAtNjgxLCAgLTEwNCwgICAtODEsICAgIDUyLCAgLTE4OX0sCisgeyAgLTY2MywgIC0xNjQsICAtMzE2LCAgLTY4MywgIC05NTQsICAtMjA1LCAgIC04M30sCisgeyAgLTYwOSwgIC02NjksICAtMTcyLCAgLTUxNywgIC02OTQsICAgMjgzLCAgIC04MH0sCisgeyAgLTY0NiwgIC0xNTIsICAtMzgzLCAgLTY3OCwgIC0yNDYsICAgLTQwLCAgLTE0M30sCisgeyAgLTc0NywgIC03OTYsICAtNzQ1LCAgLTM5MCwgICAtOTgsICAgIDQzLCAgIDI3NX0sCisgeyAgLTU5OSwgIC0xOTksICAtMzk4LCAgLTQzMywgIC00MzYsICAtNTM4LCAgICAzMX0sCisgeyAtMTEwNywgIC01NjgsICAtMzc2LCAgLTI2NSwgIC0xMjYsICAgLTIxLCAgICAgMX0sCisgeyAgIDg0NywgICA1NzMsICAgMzA4LCAgIDM5MiwgICAzMDUsICAgMTAxLCAgICA1NX0sCisgeyAgIDI3MywgICAyOTMsICAgMjAxLCAgIDI2NywgICAzNDYsICAgMjAxLCAgIDEyM30sCisgeyAgIDcyNywgICA0ODAsICAgMjI2LCAgICAgMiwgICAtNjUsICAtMTM4LCAgIDE2NH0sCisgeyAgIDI3MywgICAyMDgsICAgMTczLCAgIDI5MiwgICAgMTIsICAgMjUzLCAgIDE3NH0sCisgeyAgIDM0MCwgICAyMDcsICAgMTgwLCAgICA4OCwgICAxMTYsICAgIDQ2LCAgIDQ3NX0sCisgeyAgLTQ2MCwgIC0xNjYsICAgLTMwLCAgICAxMywgICAxMTAsICAgMTczLCAgIDM5Nn0sCisgeyAgIDEzNywgICAgODgsICAgIDQzLCAgLTEzNywgICAtOTQsICAgIDM0LCAgIDI4NH0sCisgeyAgICA5NiwgICAtMTQsICAgMjI2LCAgICA0MCwgICAgNjMsICAgIDcwLCAgIDEzMH0sCisgeyAgLTQ2NywgIC03MzUsIC0xMDEyLCAtMTE3NCwgIC0zMDcsICAgMzA1LCAgIC02N30sCisgeyAgLTYxMiwgIC05MjAsIC0xMTQ2LCAgLTU2NywgICAgLTgsICAgIDkyLCAgIC0yNX0sCisgeyAgLTE4MiwgIC0yNzEsICAtNDkyLCAgLTc1NCwgIC04NTcsICAgMjg3LCAgIC03NX0sCisgeyAgLTQ5NCwgIC03ODcsICAtNjg5LCAgLTY4MywgIC03MDksICAgMTM3LCAgLTMyNn0sCisgeyAgLTI4OCwgIC01NTAsICAtOTAzLCAtMTEwNSwgICAzMzQsICAgMzIxLCAgIC02Mn0sCisgeyAgLTM1NCwgIC02NTMsICAtODM0LCAgLTQ0NSwgICAgIDEsICAgMzc3LCAgLTE1Mn0sCisgeyAgLTE2MiwgIC0zMDYsICAtNjA4LCAgLTkzNywgIC0yOTcsICAgMjQ3LCAgLTE5Mn0sCisgeyAgLTIzNCwgIC00NzcsICAtMjQ0LCAgLTQ4OCwgIC0yNjYsICAgMzQyLCAgLTMzMn0KK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRpY28yMV9pc2ZbNjRdWzNdID0geworIHsgICAzMjksICAgNDA5LCAgIDI0OX0sIHsgICAtMzMsICAgNTA1LCAgIDE2MH0sCisgeyAgIC0yOSwgICAtMTQsICAgNTgyfSwgeyAgLTI2MiwgICAxMjcsICAgMzU0fSwKKyB7ICAgMTQ1LCAgIDIzNywgICAxNzV9LCB7ICAtMTUyLCAgIDI0NSwgICAxMjJ9LAorIHsgICAgMjcsICAgIDQyLCAgIDM0MH0sIHsgICAtODQsICAgLTkzLCAgIDMxMX0sCisgeyAgIDI4NSwgICAyMjIsICAtMTU2fSwgeyAgICA0NywgICAtNDMsICAtNTA0fSwKKyB7ICAgMjM0LCAgIDEyMSwgICAzODV9LCB7ICAgMTA0LCAgLTMxNywgICAgNDV9LAorIHsgICAxNzYsICAgMTk1LCAgICAgOH0sIHsgICAxMDQsICAgLTU5LCAgIC05NH0sCisgeyAgIDE3NywgICAgNTMsICAgMTkyfSwgeyAgIC0zNCwgIC0xMjcsICAgMTUyfSwKKyB7ICAgNTcwLCAgIDI3NywgICAtMzR9LCB7ICAgLTY3LCAgLTMyOSwgIC02Mzl9LAorIHsgIC0xNTcsICAtMjcyLCAgIDQ2Mn0sIHsgIC0xNzcsICAtNDYyLCAgIDE5OH0sCisgeyAgIDMyMiwgICAxNzksICAgMTE1fSwgeyAgLTM4NiwgICAxNzEsICAgIDE5fSwKKyB7ICAgIDE5LCAgIC0xMiwgICAxOTV9LCB7ICAtMTIwLCAgLTI1MiwgICAyMDF9LAorIHsgICAzMDQsICAgIDM2LCAgLTMzNn0sIHsgIC0xMjgsICAtMjIxLCAgLTM4MH0sCisgeyAgIDE3MSwgIC0xODUsICAgMjk2fSwgeyAgLTI0MiwgIC0zMTIsICAgIDIzfSwKKyB7ICAgMTk4LCAgICAzOSwgICAgMTZ9LCB7ICAgIC0zLCAgLTE3NywgIC0xMTF9LAorIHsgICAxMTEsICAgLTkzLCAgICA3Nn0sIHsgICAtOTIsICAtMjIzLCAgICAgNH0sCisgeyAgIDE3NywgICA0MDYsICAgLTQ0fSwgeyAgLTE2OCwgICAzODAsICAtMTQ5fSwKKyB7ICAgIC00LCAgIDI3MywgICAzMzF9LCB7ICAtNDIwLCAgIDUxMywgICAyNzd9LAorIHsgICAgMjEsICAgMjQ3LCAgICA0N30sIHsgICAtNTgsICAgMTMxLCAgICAtMn0sCisgeyAgICAtMywgICAxMzQsICAgMTgwfSwgeyAgLTE0NSwgICAgNDAsICAgMTc1fSwKKyB7ICAgMTg5LCAgICA3NCwgIC0xNDV9LCB7ICAgLTI3LCAgIC00NSwgIC0zMjV9LAorIHsgICAzNzAsICAtMTE0LCAgIC0yMX0sIHsgICAtODMsICAtNDE1LCAgLTE3M30sCisgeyAgICA3NywgICAgOTUsICAgLTUxfSwgeyAgIC00MCwgICAtMzAsICAgLTY3fSwKKyB7ICAgIDcxLCAgICA4OCwgICAgODZ9LCB7ICAgLTM1LCAgIC05OCwgICAgMTR9LAorIHsgICAgNjksICAgMTk3LCAgLTMzNH0sIHsgIC0xOTYsICAgIDc5LCAgLTIzMX0sCisgeyAgLTM0OCwgIC0xMzcsICAgMjE4fSwgeyAgLTM1MiwgICAtODksICAgLTg1fSwKKyB7ICAgIDQ3LCAgIDIwMSwgIC0xMzB9LCB7ICAtMTY1LCAgICAzNywgICAtMTV9LAorIHsgICAtNDMsICAgICAzLCAgICA4Nn0sIHsgIC0xNjEsICAtMTA4LCAgICA3OX0sCisgeyAgICA4MywgICAgMjEsICAtMjM3fSwgeyAgIC04MSwgIC0xNDksICAtMjM4fSwKKyB7ICAgMTUwLCAgLTE4NiwgIC0yNTF9LCB7ICAtMTg2LCAgLTI0OSwgIC0xNjJ9LAorIHsgICAtMTksICAgIDY2LCAgLTEzOX0sIHsgICAtMjYsICAgLTUwLCAgLTE4MX0sCisgeyAgICAyNCwgICAgMTEsICAgICAwfSwgeyAgLTEzMCwgIC0xMDUsICAgLTk4fQorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZGljbzIyX2lzZlsxMjhdWzNdID0geworIHsgIC0xMjcsICAgMzEwLCAgICA0Mn0sIHsgIC0yNDIsICAgMTk3LCAgICAgNX0sCisgeyAgLTE1MSwgICAgODQsICAgLTE3fSwgeyAgLTIxNCwgICAxMjcsICAtMTQ5fSwKKyB7ICAtMjQ3LCAgLTEzMSwgICAxNTl9LCB7ICAtMjY4LCAgLTI2NywgICAtOTV9LAorIHsgIC0yMTcsICAgICAxLCAgIC03OX0sIHsgIC0yNzEsICAgLTgwLCAgLTE4NX0sCisgeyAgIC00NSwgICA0MzYsICAgMTU5fSwgeyAgIDE2NSwgICAxOTksICAgMzkxfSwKKyB7ICAgLTMzLCAgICA4MSwgICAxODd9LCB7ICAgLTY2LCAgIC00MiwgICAzNTV9LAorIHsgIC0yOTgsICAgLTU3LCAgIDM0M30sIHsgIC0xMDgsICAtNTM3LCAgIDIyNn0sCisgeyAgLTE0NCwgICAtMjMsICAgMTkzfSwgeyAgIDE3NiwgIC00MDIsICAgIDg3fSwKKyB7ICAgIDUzLCAgIDI5NiwgICAgMjV9LCB7ICAgLTg0LCAgIDI1MywgIC0xMDR9LAorIHsgICAtNTgsICAgMTA1LCAgLTEyNn0sIHsgIC0xNjksICAgMTc0LCAgLTMxNH0sCisgeyAgIC00OCwgICAgNDQsICAtMjk0fSwgeyAgLTE2NCwgIC00MTcsICAtMjQyfSwKKyB7ICAtMTM5LCAgICAgMywgIC0xOTR9LCB7ICAtMTU1LCAgLTIwNywgIC0yMTF9LAorIHsgICAxMTksICAgMzIyLCAgIDIxM30sIHsgICAzMzMsICAgIDUwLCAgIDM4MH0sCisgeyAgIDIzNywgICAyNDcsICAgIC0yfSwgeyAgIDQ2NiwgICAtMTYsICAgMjAxfSwKKyB7ICAgMjM4LCAgLTI1NSwgIC0xMDd9LCB7ICAgIDY3LCAgLTQ0MCwgIC0xNDl9LAorIHsgICAxMjIsICAgLTg4LCAgLTEzOX0sIHsgICAgODgsICAtMjQ3LCAgIC03M30sCisgeyAgIC00MSwgICAyMzEsICAgMTY3fSwgeyAgIC02MiwgICAxNTUsICAgIDE2fSwKKyB7ICAgLTY1LCAgICAxNiwgICAgNzd9LCB7ICAgLTY4LCAgICAtMiwgICAtNjN9LAorIHsgIC0xNTEsICAtMzAwLCAgIDE2MH0sIHsgICAtMTgsICAtMzMzLCAgICA1NH0sCisgeyAgIC01NiwgICAtOTQsICAgICA1fSwgeyAgICAgMiwgIC0xOTAsICAgIDE0fSwKKyB7ICAgIDkyLCAgIDE0OCwgICAyMDl9LCB7ICAgMTA4LCAgICAgOSwgICAyNzJ9LAorIHsgICAxMDgsICAgIDM1LCAgIDExMH0sIHsgICAxNDIsICAgLTg1LCAgIDE0NX0sCisgeyAgICA0NywgIC0xNTcsICAgMjc5fSwgeyAgICAgMywgIC0zMjAsICAgMjQ2fSwKKyB7ICAgIDQzLCAgIC03MiwgICAgNjh9LCB7ICAgIDg2LCAgLTIxNywgICAxMzV9LAorIHsgICAgMzYsICAgMTQwLCAgICA3OX0sIHsgICAgNTYsICAgMTc1LCAgIC00OX0sCisgeyAgICAyNiwgICAgNDUsICAgICAzfSwgeyAgICA3MywgICAgNTUsICAtMTAxfSwKKyB7ICAgMTA5LCAgLTE4MywgIC0yNDJ9LCB7ICAgIC00LCAgLTI4MywgIC0yNDJ9LAorIHsgICAgNDgsICAgLTY4LCAgIC00OH0sIHsgICAgLTYsICAtMTUzLCAgLTEyMn0sCisgeyAgIDE2MSwgICAxOTYsICAgIDk2fSwgeyAgIDIzMiwgICAgODAsICAgMTkwfSwKKyB7ICAgMTY1LCAgICA5NywgICAgMTF9LCB7ICAgMjU4LCAgIC0zMSwgICAgNzF9LAorIHsgICAyNjcsICAgLTc3LCAgIC05MX0sIHsgICAzMTEsICAtMjA5LCAgICA4N30sCisgeyAgIDE1MiwgICAtMTQsICAgLTIyfSwgeyAgIDE1MCwgIC0xNDksICAgICA5fSwKKyB7ICAtMzI0LCAgIDU1NywgICAxODd9LCB7ICAtMzg0LCAgIDMwNywgICAgNDZ9LAorIHsgIC0yNTEsICAgIDI3LCAgICA3N30sIHsgIC0zNjUsICAgIDc3LCAgIC01Mn0sCisgeyAgLTQ4MiwgICAtODQsICAgMTYwfSwgeyAgLTQyNCwgIC01MTUsICAgLTY0fSwKKyB7ICAtMjk0LCAgLTEyMCwgICAgLTR9LCB7ICAtNDc2LCAgLTExNiwgIC0xMDl9LAorIHsgICAtOTcsICAgMzE4LCAgIDM2NX0sIHsgICAxMDYsICAgNjI3LCAgIDQ0NX0sCisgeyAgLTE5MCwgICAxMjAsICAgMjg3fSwgeyAgLTE0NiwgICAgNjUsICAgNjE5fSwKKyB7ICAtNDI3LCAgIDI0MiwgICAzNjN9LCB7ICAtMzYxLCAgLTM3MSwgICA0MzJ9LAorIHsgIC0zNDcsICAgMTAyLCAgIDE2OH0sIHsgIC02MjksICAgMTk1LCAgIC0xNH0sCisgeyAgIC02NSwgICA0NzYsICAgLTQ3fSwgeyAgLTI5NywgICAzMjAsICAtMTY4fSwKKyB7ICAgLTU1LCAgIDM1NiwgIC0yNjR9LCB7ICAtMzkxLCAgICA4MiwgIC0yODZ9LAorIHsgICAtNTEsICAgLTMxLCAgLTU1Nn0sIHsgIC0xNzgsICAtMzk5LCAgLTU4Nn0sCisgeyAgLTIwNSwgICAtNDksICAtMzYwfSwgeyAgLTM0MywgIC0yMzgsICAtMzM3fSwKKyB7ICAgMjIwLCAgIDQ1NywgICAgNTh9LCB7ICAgNTYxLCAgIDQ2NywgICAyNTl9LAorIHsgICAzNDAsICAgMjcwLCAgLTE2OH0sIHsgICA0NTAsICAgIDc3LCAgLTI4MH0sCisgeyAgICA2MCwgICAxNjcsICAtNDEzfSwgeyAgIDEzMywgIC0yNTIsICAtNDkyfSwKKyB7ICAgMjE2LCAgIDE1NywgIC0yOTB9LCB7ICAgMjgyLCAgICAgMCwgIC00OTV9LAorIHsgIC0yMjYsICAgMjkzLCAgIDE4M30sIHsgIC0xNTcsICAgMTM1LCAgIDEyMn0sCisgeyAgLTE1OCwgICAtNTksICAgIDM5fSwgeyAgLTEzMywgIC0xMTgsICAgLTk3fSwKKyB7ICAtMzMyLCAgLTMwOSwgICAxMTN9LCB7ICAtMTYwLCAgLTQyNSwgICAgLTZ9LAorIHsgIC0xNDksICAtMjExLCAgICAyNH0sIHsgICAtODAsICAtMjc3LCAgIC05MH0sCisgeyAgIC0xMSwgICAxMjUsICAgMzM4fSwgeyAgIDEzMCwgICAtNzEsICAgNDY1fSwKKyB7ICAgICA1LCAgIC00NSwgICAxODR9LCB7ICAgMjM3LCAgIC05NSwgICAyNTN9LAorIHsgIC0xMzksICAtMTk3LCAgIDI5N30sIHsgICAtMTksICAtMzAwLCAgIDUxMX0sCisgeyAgIC02MywgIC0xNTIsICAgMTM5fSwgeyAgIDI1MCwgIC0yODksICAgMzM2fSwKKyB7ICAgMTI0LCAgIDMzOSwgIC0xNTB9LCB7ICAgIDM0LCAgIDE3NiwgIC0yMDh9LAorIHsgICAxNzEsICAgMTY2LCAgLTExNn0sIHsgICAgOTQsICAgIDM4LCAgLTIyOX0sCisgeyAgICA3NSwgICAtNjUsICAtMzM5fSwgeyAgIC03OCwgIC0yMDUsICAtMzg1fSwKKyB7ICAgICAwLCAgIC0zMCwgIC0xNjN9LCB7ICAgLTU2LCAgLTExMCwgIC0yNDJ9LAorIHsgICAzMjEsICAgMjQ0LCAgIDE5NH0sIHsgICA1MDUsICAgMjM4LCAgICAtMX0sCisgeyAgIDMxNywgICAxMTYsICAgIDY1fSwgeyAgIDMwOSwgICAgODgsICAgLTc0fSwKKyB7ICAgNDUyLCAgIC01MSwgICAtNTB9LCB7ICAgMzM0LCAgLTIxNywgIC0yOTB9LAorIHsgICAyMTEsICAgIDQxLCAgLTE1Mn0sIHsgICAyMzgsICAgLTU1LCAgLTI2MH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRpY28yM19pc2ZbMTI4XVszXSA9IHsKKyB7ICAgLTEwLCAgIDE1MSwgICAzNTl9LCB7ICAgMTM2LCAgIDI5OCwgICAyMjN9LAorIHsgICAyNTUsICAtMTA0LCAgIDI5MH0sIHsgICA0MjMsICAgICA2LCAgIDE4M30sCisgeyAgLTI3MCwgIC0yNjksICAgLTk4fSwgeyAgIC01MiwgICAtODIsICAgIDEzfSwKKyB7ICAgLTgyLCAgLTI3NCwgICAtOTd9LCB7ICAgIDkwLCAgLTI0NiwgICAtNzJ9LAorIHsgIC0yOTksICAgLTcwLCAgIDQyMX0sIHsgICAtODgsICAgMzY1LCAgIDQzMH0sCisgeyAgIDE4NywgIC0zMTgsICAgMzgxfSwgeyAgIDM4MCwgICAgMzcsICAgNDg4fSwKKyB7ICAtMzczLCAgLTMxNiwgICAgNzl9LCB7ICAtMzA4LCAgLTEwMSwgICAgIDV9LAorIHsgIC0xMzUsICAtNDUxLCAgICAgOH0sIHsgICAgNzIsICAtNDIxLCAgLTE1NH0sCisgeyAgIDE4MCwgICAxNzAsICAtMTIxfSwgeyAgICA2MiwgICAxNzcsICAgLTQwfSwKKyB7ICAgMzI2LCAgICA4MCwgIC0xMDV9LCB7ICAgMjQ4LCAgIDI2MywgICAgLTV9LAorIHsgIC0xNjgsICAtMTgxLCAgLTIyMX0sIHsgICAgLTIsICAgLTIzLCAgLTE1OH0sCisgeyAgIC0xNCwgIC0xNDksICAtMTIxfSwgeyAgIDExOSwgICAtOTEsICAtMTQ3fSwKKyB7ICAgMTE5LCAgIDMzMiwgIC0xNTN9LCB7ICAgIDQ5LCAgIDMwMywgICAgMzR9LAorIHsgICA0NDIsICAgLTU1LCAgIC02OX0sIHsgICAyMTcsICAgNDU0LCAgICA1OH0sCisgeyAgLTM1OSwgIC0xODcsICAtMzc1fSwgeyAgIC00MiwgICAgNTAsICAtMjc0fSwKKyB7ICAgIC04LCAgLTI2NywgIC0yNDl9LCB7ICAgIDg1LCAgIC04NiwgIC0zNDZ9LAorIHsgICAtNzcsICAgLTQwLCAgIDM0NX0sIHsgICAgODksICAgMTM0LCAgIDIxOX0sCisgeyAgIDE1NiwgICAtODAsICAgMTYwfSwgeyAgIDEwOCwgICAgNDAsICAgMTE2fSwKKyB7ICAtMTU4LCAgLTIwNiwgICAgMjl9LCB7ICAgICA1LCAgIC0zMiwgICAxNzV9LAorIHsgICAtNjUsICAtMTU4LCAgIDE0Nn0sIHsgICAgNTUsICAgLTc4LCAgICA3M30sCisgeyAgLTExNCwgIC0yMjIsICAgMzUzfSwgeyAgIC00NywgICAgODEsICAgMjExfSwKKyB7ICAgIDQ5LCAgLTE1MSwgICAyNjh9LCB7ICAgMTA1LCAgICAgNCwgICAzMDJ9LAorIHsgIC0yNjMsICAtMTMyLCAgIDE4M30sIHsgIC0xNTEsICAgLTI4LCAgIDIwMX0sCisgeyAgLTE3NywgIC0zMDcsICAgMTY2fSwgeyAgIDEwMSwgIC0yMjEsICAgMTMwfSwKKyB7ICAgIDc0LCAgICA1OCwgICAtOTh9LCB7ICAgIDMyLCAgICA0NCwgICAgMTN9LAorIHsgICAxOTQsICAgIDMwLCAgLTE0Mn0sIHsgICAxNzAsICAgIDk2LCAgICAgOH0sCisgeyAgLTEzNiwgIC0xMTksICAgLTkxfSwgeyAgIC02NSwgICAgIDgsICAgLTU1fSwKKyB7ICAgICAzLCAgLTE4OCwgICAgMTJ9LCB7ICAgIDQ1LCAgIC02MywgICAtNDl9LAorIHsgICAxNDksICAgLTIxLCAgIC0xOX0sIHsgICAgMjQsICAgMTQ0LCAgICA5NX0sCisgeyAgIDI1NCwgICAtMjIsICAgIDYwfSwgeyAgIDE2MSwgICAxOTYsICAgIDk2fSwKKyB7ICAtMTU4LCAgIC02MSwgICAgNDh9LCB7ICAgLTcwLCAgICAzMywgICAgODJ9LAorIHsgICAtMjMsICAtMzIxLCAgICA1OH0sIHsgICAxNTUsICAtMTQ3LCAgICAgNX0sCisgeyAgLTM2NCwgICAzMjgsICAgIDc3fSwgeyAgIC0yMSwgICA0NTMsICAgMTczfSwKKyB7ICAtMTA4LCAgICA4MiwgICA2MzB9LCB7ICAgMzY3LCAgIDI2MywgICAyMDh9LAorIHsgIC0zMDAsICAgLTYyLCAgLTE3Nn0sIHsgIC0yMDUsICAgMTQzLCAgLTE1OH0sCisgeyAgLTE2OSwgIC00MTAsICAtMjY0fSwgeyAgIDI1NywgIC0yNjksICAtMTAwfSwKKyB7ICAtNjM2LCAgIDI4OSwgICAgLTJ9LCB7ICAtMjkyLCAgIDYyNywgICAxNzN9LAorIHsgIC0zODIsICAtMzYzLCAgIDM4N30sIHsgICAyNDgsICAgNTI0LCAgIDQ0N30sCisgeyAgLTUyMSwgIC0xMTEsICAtMTA3fSwgeyAgLTM5NSwgICAxMTgsICAtMjc0fSwKKyB7ICAtMzQzLCAgLTY4MCwgIC0xMjV9LCB7ICAtMTcyLCAgLTQ0NywgIC02NjN9LAorIHsgICAgNzUsICAgMTQ4LCAgLTM2N30sIHsgICAtNzksICAgMjYzLCAgIC05NH0sCisgeyAgIDI0OSwgICAxNDgsICAtMjg2fSwgeyAgIDM4MCwgICAyNzEsICAtMTYyfSwKKyB7ICAtMTQyLCAgICAtNCwgIC0xODZ9LCB7ICAgLTU3LCAgIDExMSwgIC0xMjV9LAorIHsgICAtMzUsICAtMTA4LCAgLTI1NH0sIHsgICAxMDAsICAgIDI5LCAgLTI0Mn0sCisgeyAgIC04MCwgICAzMDMsICAtMjY0fSwgeyAgIC03OCwgICA0NjQsICAgLTU3fSwKKyB7ICAgMjQ4LCAgIC0yMiwgIC00OTR9LCB7ICAgNjYxLCAgIDY2MiwgICAgNDR9LAorIHsgIC0xOTMsICAgLTQwLCAgLTMzMH0sIHsgIC0xNzgsICAgMTQ1LCAgLTMzN30sCisgeyAgIC05MCwgIC0xOTksICAtNDAwfSwgeyAgIC00MCwgICAtMjMsICAtNDk4fSwKKyB7ICAtMTkyLCAgIDExNCwgICAzMTV9LCB7ICAgLTQxLCAgIDI0NCwgICAxOTB9LAorIHsgICAgODgsICAgLTk3LCAgIDQ4NX0sIHsgICAyNDEsICAgIDgwLCAgIDIxMn0sCisgeyAgLTI0NiwgICAgNDAsICAgIDg3fSwgeyAgLTE1NiwgICAxNDcsICAgMTM0fSwKKyB7ICAgIC0yLCAgLTMzNCwgICAyMzl9LCB7ICAgMzA4LCAgLTIwMywgICAxMTB9LAorIHsgIC00NTksICAgMjUxLCAgIDQyMn0sIHsgIC0yMTgsICAgMzEwLCAgIDIyOH0sCisgeyAgIC04NiwgIC0zNDYsICAgNjU0fSwgeyAgIDE4NCwgICAxNzUsICAgNDI1fSwKKyB7ICAtNDgxLCAgIC02MywgICAxNjl9LCB7ICAtMzQ5LCAgIDExNywgICAxODh9LAorIHsgIC0xMjUsICAtNTYwLCAgIDMxMH0sIHsgICAxNTgsICAtNDE2LCAgICA5NH0sCisgeyAgICA0NiwgICAxNzEsICAtMTkyfSwgeyAgIC02MywgICAxNTcsICAgIDE0fSwKKyB7ICAgMjU2LCAgIC0zNSwgIC0yNzF9LCB7ICAgMzIyLCAgIDEyMywgICAgNTN9LAorIHsgIC0yMTQsICAgICA0LCAgIC03Nn0sIHsgIC0xNTYsICAgIDg2LCAgIC0xOH0sCisgeyAgIDEyOCwgIC0xOTcsICAtMjMyfSwgeyAgIDI2NSwgICAtOTAsICAgLTk4fSwKKyB7ICAtMzA4LCAgIDMzMiwgIC0xNDV9LCB7ICAtMTMxLCAgIDMwOCwgICAgNTh9LAorIHsgICA1MDksICAgIDU5LCAgLTMzOX0sIHsgICA1NjIsICAgMTk2LCAgIC0xNH0sCisgeyAgLTM3OCwgICAxMDAsICAgLTQ3fSwgeyAgLTIzNCwgICAyMDIsICAgICAxfSwKKyB7ICAgMTA0LCAgLTI3MCwgIC00OTN9LCB7ICAgMzE5LCAgLTIxMCwgIC0zMjV9Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBkaWNvMjRfaXNmWzMyXVszXSA9IHsKKyB7ICAgLTc5LCAgIC04OSwgICAgLTR9LCB7ICAtMTcxLCAgICA3NywgIC0yMTF9LAorIHsgICAxNjAsICAtMTkzLCAgICA5OH0sIHsgICAxMjAsICAtMTAzLCAgIDMyM30sCisgeyAgICAzMiwgICAtMjIsICAtMTI5fSwgeyAgICA3MiwgICAgNzgsICAtMjY4fSwKKyB7ICAgMTgyLCAgIC03NiwgICAtNjZ9LCB7ICAgMzA5LCAgICA5OSwgIC0xNDV9LAorIHsgIC0yMjksICAtMTU3LCAgIC04NH0sIHsgIC0zODMsICAgIDk4LCAgIC03MX0sCisgeyAgIC05MCwgIC0zNTIsICAgIDEyfSwgeyAgLTI4NCwgIC0xNzgsICAgMTc4fSwKKyB7ICAgLTY1LCAgLTEyNSwgIC0xNjZ9LCB7ICAgLTg3LCAgLTE3NSwgIC0zNTF9LAorIHsgICAgNDIsICAtMTk4LCAgIC00OH0sIHsgICAxNTQsICAtMTQwLCAgLTI0M30sCisgeyAgIC03NywgICAgMTgsICAgMTA4fSwgeyAgIC0zOSwgICAzNTUsICAgIDkxfSwKKyB7ICAgIDg3LCAgICAgOCwgICAxNTV9LCB7ICAgIC00LCAgIDE1OCwgICAyMzl9LAorIHsgICAxMjgsICAgIDk1LCAgIC01NH0sIHsgICAgIDcsICAgMjQ2LCAgLTEyNH0sCisgeyAgIDI1OCwgICAgMTUsICAgIDg5fSwgeyAgIDIwNiwgICAyMTYsICAgIDk4fSwKKyB7ICAtMjAxLCAgICAgOSwgICAgMTh9LCB7ICAtMzEyLCAgIDIzMywgICAyMDR9LAorIHsgICAtMzksICAtMTc0LCAgIDE1NX0sIHsgIC0xNDQsICAgIC05LCAgIDI4NH0sCisgeyAgIC01NywgICAgNzAsICAgLTY5fSwgeyAgLTE1NywgICAxODcsICAgIDE4fSwKKyB7ICAgIDU0LCAgIC0zMCwgICAgMjN9LCB7ICAgIDI0LCAgIDEzNSwgICAgNTV9Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBkaWNvMjVfaXNmWzMyXVs0XSA9IHsKKyB7ICAgMTY5LCAgIDE0MiwgIC0xMTksICAgMTE1fSwgeyAgIDIwNiwgICAtMjAsICAgIDk0LCAgIDIyNn0sCisgeyAgLTEwNiwgICAzMTMsICAgLTIxLCAgICAxNn0sIHsgICAtNjIsICAgMTYxLCAgICA3MSwgICAyNTV9LAorIHsgICAtODksICAgMTAxLCAgLTE4NSwgICAxMjV9LCB7ICAgIDcyLCAgIC0zMCwgIC0yMDEsICAgMzQ0fSwKKyB7ICAtMjU4LCAgICAzMywgICAgLTgsICAgIDgxfSwgeyAgLTEwNCwgIC0xNTQsICAgIDcyLCAgIDI5Nn0sCisgeyAgIDE0NCwgICAtNjgsICAtMjY4LCAgIC0yNX0sIHsgICAgODEsICAgLTc4LCAgIC04NywgICAxMDZ9LAorIHsgICAgMjIsICAgMTU1LCAgLTE4NiwgIC0xMTl9LCB7ICAgLTQ2LCAgIC0yOCwgICAgMjcsICAgIDkxfSwKKyB7ICAtMTE0LCAgIC0zNywgIC0xNzUsICAgLTMzfSwgeyAgIC05NCwgIC0yMjIsICAtMTg5LCAgIDEyMn0sCisgeyAgLTEzMiwgIC0xMTksICAtMTkxLCAgLTI3MH0sIHsgIC0xNzIsICAtMTczLCAgICAxOCwgICAtNDN9LAorIHsgICAyNzksICAgMTM1LCAgIC00MiwgIC0xMjh9LCB7ICAgMTg3LCAgIC04NiwgICAyMjksICAtMTM4fSwKKyB7ICAgMTU5LCAgIDI0MCwgICAxNDAsICAgIDQ2fSwgeyAgICA2OSwgICAgMjUsICAgMjI3LCAgICA3N30sCisgeyAgICAyMSwgICAxMTUsICAgIDEzLCAgICAgOH0sIHsgICAgNjgsICAtMjQ4LCAgIDEyNiwgICAgODF9LAorIHsgIC0xNTAsICAgMTM3LCAgIDIwNywgICAgLTl9LCB7ICAtMTU0LCAgLTEzMywgICAyODksICAgIDY3fSwKKyB7ICAgMTQzLCAgIC0zNywgICAtODYsICAtMzI2fSwgeyAgIDE4MCwgICAtMzIsICAgIDE5LCAgIC0yM30sCisgeyAgICAyNiwgICAxNjgsICAgMTE2LCAgLTIzM30sIHsgICAtMzIsICAgLTI2LCAgIDExOCwgICAtNzh9LAorIHsgICAgIDMsICAgIC04LCAgIC00NSwgIC0xMTV9LCB7ICAgIDU3LCAgLTIxNSwgICAtNTQsICAgLTgzfSwKKyB7ICAtMjA5LCAgIDExMiwgICAtMjIsICAtMTY3fSwgeyAgIC05MSwgIC0xNTEsICAgMTY4LCAgLTI2Mn0KK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRpY28yMV9pc2ZfMzZiWzEyOF1bNV0gPSB7CisgeyAgIC01MiwgICAtOTYsICAgMjEyLCAgIDMxNSwgICAtNzN9LCB7ICAgIDgyLCAgLTIwNCwgICAzNjMsICAgMTM2LCAgLTE5N30sCisgeyAgLTEyNiwgIC0zMzEsICAgMTgzLCAgIDIxOCwgICAxNDN9LCB7ICAgLTQ5LCAgIC00MSwgICA1NTcsICAgMjMwLCAgICA3Mn0sCisgeyAgICAgMiwgICAtNzMsICAgMTYzLCAgIDM3NywgICAyMjF9LCB7ICAgMTMzLCAgIDExMSwgICAyNzgsICAgMjE1LCAgLTExMH0sCisgeyAgLTEwMiwgICAtMjAsICAgMjg0LCAgIDExMywgICAyNzN9LCB7ICAgIDg0LCAgIDMxOSwgICAyOTAsICAgIDE4LCAgICA4NX0sCisgeyAgIC0yNSwgICAgLTUsICAgMTI1LCAgIDEzMiwgIC0yMDR9LCB7ICAgLTM4LCAgICAtNSwgICAyODYsICAgIC05LCAgLTM1Nn0sCisgeyAgLTE0MCwgIC0yNTYsICAgIDkyLCAgIDExNywgIC0xODl9LCB7ICAtMTQ0LCAgIDE5MSwgICAzMTMsICAgIDUxLCAgIC05OH0sCisgeyAgIDE2NywgICAtMTAsICAgIDQ0LCAgIDI0NywgICAgMzZ9LCB7ICAgMzgxLCAgIDE5NywgICAyMzgsICAgIDc0LCAgICAgNn0sCisgeyAgICAzOCwgIC00MDgsICAgIDI5LCAgICAtMywgICAtODV9LCB7ICAgIDkyLCAgIDI2NiwgICAxNTcsICAgLTI1LCAgLTIwMH0sCisgeyAgIDE2MSwgIC0xMjEsICAgIDcwLCAgICA4NCwgIC0xNDB9LCB7ICAgLTE2LCAgIC04NiwgICAxMTIsICAgLTk0LCAgLTE4OX0sCisgeyAgLTI2OSwgIC0yNzAsICAgMzUxLCAgIDEwNywgICAtMjR9LCB7ICAgLTY4LCAgIC02NywgICA0OTIsICAtMTAzLCAgLTE1NX0sCisgeyAgIC01MywgIC0xMzEsICAgIDYyLCAgIDEyMiwgICAgMTB9LCB7ICAgMTM1LCAgICA4NCwgICAyODMsICAgLTU1LCAgLTEyMH0sCisgeyAgIC0xMiwgIC0yMTksICAgMzMxLCAgIC04MSwgICAxNjd9LCB7ICAgMjIwLCAgLTEzNiwgICAxNDcsICAtMTcyLCAgIC00Mn0sCisgeyAgIDE0MCwgICAtOTUsICAtMTA5LCAgIC04OCwgIC0xOTR9LCB7ICAgICAwLCAgICAtMiwgICAgLTQsICAgLTMzLCAgLTM4MX0sCisgeyAgIC02NiwgIC0yMTcsICAgMTUyLCAgLTE4NiwgIC00MDJ9LCB7ICAgMjQ0LCAgIDEwOCwgICAxNTYsICAtMTQwLCAgLTM5NX0sCisgeyAgIDExMywgIC0xMzYsICAtMTk2LCAgIDExMCwgICAtMjR9LCB7ICAgMjE0LCAgIDExOCwgICAgMTEsICAgLTY0LCAgLTEzMX0sCisgeyAgLTExMCwgIC0yODYsICAgIC02LCAgLTMzMiwgICAgMTZ9LCB7ICAgIDk0LCAgICA5NywgICAgNzksICAtMjkxLCAgLTIwNX0sCisgeyAgICAtNSwgICAtMzksICAgLTIwLCAgIDI1MiwgICAtOTZ9LCB7ICAgIDc2LCAgIDE3NCwgICAxMDEsICAgMTYzLCAgICA2MX0sCisgeyAgIC02OSwgIC0yMzksICAgLTU1LCAgIDM5OSwgICAgIDZ9LCB7ICAtMTE1LCAgIDMxOSwgICAxNjQsICAgMjc1LCAgIDE5Nn0sCisgeyAgIC0xNSwgICAgMzYsICAgLTQ3LCAgIDMzMSwgICAxMjF9LCB7ICAgMjI2LCAgIDIwOSwgICAyNzEsICAgMzI1LCAgIDE4NH0sCisgeyAgICAxMywgICAtODAsICAtMjE4LCAgIDQ3MSwgICAzNTN9LCB7ICAgMjg4LCAgIDM3OCwgICAgMTYsICAgLTUxLCAgIDI1MX0sCisgeyAgIDE3NCwgICAxMTYsICAgIDUyLCAgIDE0OSwgIC0yNzl9LCB7ICAgMjM1LCAgIDI3NiwgICAgMzksICAgMTIwLCAgIC00OH0sCisgeyAgICAgMCwgIC0xMDgsICAtMTA4LCAgIDI0MSwgIC0zMzl9LCB7ICAgLTkzLCAgIDUzNCwgICAgNDUsICAgIDMzLCAgIC04N30sCisgeyAgIDE5NCwgICAxNDksICAgLTcxLCAgIDQwNSwgICAtNDR9LCB7ICAgNDA5LCAgIDM3MCwgICAgODEsICAtMTg2LCAgLTE1NH0sCisgeyAgICAyNSwgIC0xMDIsICAtNDQ4LCAgIDEyNCwgIC0xNzN9LCB7ICAgIDIyLCAgIDQwOCwgIC0xMTAsICAtMzEwLCAgLTIxNH0sCisgeyAgIC0yNiwgICAgMjMsICAgLTgzLCAgIDExNCwgICAgMTR9LCB7ICAtMTEwLCAgIDE2NCwgICAgNTIsICAgMjIzLCAgIC04Mn0sCisgeyAgICAzNywgICAtMjUsICAtMjYzLCAgIDMwNiwgICAtMTV9LCB7ICAtNDY2LCAgIDQxNSwgICAyOTIsICAgMTY1LCAgIC0xOH0sCisgeyAgICAyOSwgICAtMTksICAtMTcxLCAgIDE1NSwgICAxODJ9LCB7ICAgMTc5LCAgIDE0NCwgICAtMjcsICAgMjMxLCAgIDI1OH0sCisgeyAgLTEwMywgIC0yNDcsICAtMzk2LCAgIDIzOCwgICAxMTN9LCB7ICAgMzc1LCAgLTE1NCwgIC0xMDksICAgIC00LCAgIDE1Nn0sCisgeyAgICA5OCwgICAgODUsICAtMjkyLCAgICAtNSwgIC0xMjR9LCB7ICAgMTE2LCAgIDEzOSwgIC0xMTYsICAgLTk4LCAgLTI5NH0sCisgeyAgIC0xNCwgICAtODMsICAtMjc4LCAgLTExNywgIC0zNzh9LCB7ICAgMTA2LCAgICAzMywgIC0xMDYsICAtMzQ0LCAgLTQ4NH0sCisgeyAgIDExOSwgICAgMTcsICAtNDEyLCAgIDEzOCwgICAxNjZ9LCB7ICAgMzg0LCAgIDEwMSwgIC0yMDQsICAgIDg4LCAgLTE1Nn0sCisgeyAgLTEyMSwgIC0yODQsICAtMzAwLCAgICAtMSwgIC0xNjZ9LCB7ICAgMjgwLCAgICAzMywgIC0xNTIsICAtMzEzLCAgIC04MX0sCisgeyAgIC0zNywgICAgMjIsICAgMjI5LCAgIDE1MywgICAgMzd9LCB7ICAgLTYwLCAgIC04MywgICAyMzYsICAgIC04LCAgIC00MX0sCisgeyAgLTE2OSwgIC0yMjgsICAgMTI2LCAgIC0yMCwgICAzNjN9LCB7ICAtMjM1LCAgICAxNywgICAzNjQsICAtMTU2LCAgIDE1Nn0sCisgeyAgIC0yNSwgICAtMzAsICAgIDcyLCAgIDE0NCwgICAxNTZ9LCB7ICAgMTUzLCAgIC0yNiwgICAyNTYsICAgIDk3LCAgIDE0NH0sCisgeyAgIC0yMSwgICAtMzcsICAgIDQ4LCAgIC02NSwgICAyNTB9LCB7ICAgIDYzLCAgICA3NywgICAyNzMsICAtMTI4LCAgIDEyNH0sCisgeyAgLTEyOSwgICAtMjYsICAgIDQwLCAgICAgOSwgIC0xMTV9LCB7ICAgIC02LCAgICA4MiwgICAgMzgsICAgLTkwLCAgLTE4Mn0sCisgeyAgLTMzNiwgICAtMTMsICAgIDI4LCAgIDE1OCwgICAgOTF9LCB7ICAgLTMwLCAgIDI0MSwgICAxMzcsICAtMTcwLCAgIC0xN30sCisgeyAgIDE0NiwgICAgMTQsICAgLTExLCAgICAzMywgICAgNjF9LCB7ICAgMTkyLCAgIDE5NywgICAgNTQsICAgLTg0LCAgICA4NX0sCisgeyAgICAyMywgIC0yMDAsICAgLTc4LCAgIC0yOSwgICAxNDB9LCB7ICAgMTIyLCAgIDIzNywgICAxMDYsICAtMzQxLCAgIDEzNn0sCisgeyAgIC01NywgIC0xNDIsICAgLTg1LCAgIC0xNiwgICAtNzR9LCB7ICAgLTU5LCAgIC05MCwgICAgLTgsICAtMTg3LCAgIC0yMH0sCisgeyAgLTIxMSwgIC0yNjcsICAgMjE2LCAgLTE3OSwgIC0xMTB9LCB7ICAgLTUwLCAgICAtNywgICAyMjAsICAtMjY3LCAgIC03MH0sCisgeyAgIC01NywgICAtNDIsICAgLTE3LCAgIC0xNSwgICAgNzF9LCB7ICAgIDMyLCAgICAyMSwgICAgNjMsICAtMTM3LCAgICAzM30sCisgeyAgLTEzNywgIC0xNzUsICAgMTA0LCAgIC02OCwgICAgOTd9LCB7ICAgLTY3LCAgIC00MywgICAxMzMsICAtMzAxLCAgIDIyMX0sCisgeyAgLTExNiwgIC0yMDAsICAgLTgxLCAgIC05MiwgIC0yNzJ9LCB7ICAgLTY0LCAgIC00MSwgICAtNTQsICAtMjQ0LCAgLTIyMH0sCisgeyAgLTI4NywgIC0yNDIsICAgLTUwLCAgIC04NywgICAtODl9LCB7ICAtMjQ1LCAgIDIzNiwgICAxMDIsICAtMTY2LCAgLTI5NX0sCisgeyAgICA2NiwgICAgMjQsICAtMTYyLCAgIC03MSwgICAgOTV9LCB7ICAgIDY2LCAgIDEzNiwgICAtOTAsICAtMjIwLCAgIC0zNn0sCisgeyAgIC05OCwgIC0xNjEsICAtMjIyLCAgLTE4OCwgICAgMjl9LCB7ICAgLTE4LCAgICAxOCwgICAtMTksICAtNDE1LCAgICAgOX0sCisgeyAgICA0OSwgICAgNjEsICAgMTAwLCAgICAzOSwgICAtNTZ9LCB7ICAtMTExLCAgICA4MiwgICAxMzUsICAgLTMxLCAgICA1Mn0sCisgeyAgIC05MCwgIC0xNTMsICAgLTkzLCAgIDE4OSwgICAxODJ9LCB7ICAtMjE0LCAgIDI5NSwgICAxMTksICAgLTc0LCAgIDI4NH0sCisgeyAgICAgMiwgICAxMzcsICAgIDM3LCAgICA0NywgICAxODJ9LCB7ICAgIDkyLCAgIDExNywgICAxODQsICAgLTUzLCAgIDM3M30sCisgeyAgIC0yMSwgICAtMTQsICAgLTM1LCAgIDEzNiwgICAzOTF9LCB7ICAgMTQ2LCAgIDEyOSwgIC0xNjQsICAgLTI4LCAgIDMzM30sCisgeyAgICA5MiwgICAgODAsICAgLTg0LCAgIDEwMCwgIC0xMzR9LCB7ICAgIC04LCAgIDIxNywgICAtMzIsICAgICAzLCAgIC00N30sCisgeyAgLTE1MSwgICAyNTEsICAtMjE1LCAgIDE0MiwgICAgOTJ9LCB7ICAtMjI0LCAgIDMxMCwgIC0xNzIsICAtMjc1LCAgICA5OH0sCisgeyAgIDE1OSwgICAxNTUsICAtMTc3LCAgIDExMiwgICAgNTN9LCB7ICAgMjA1LCAgICAyNywgICAgIDgsICAtMjQwLCAgIDE5Mn0sCisgeyAgIDE2OSwgICAxMjAsICAtMzE5LCAgLTIwMSwgICAxMDZ9LCB7ICAgIDExLCAgICAzNiwgICAtODYsICAtMjM3LCAgIDQ1NX0sCisgeyAgLTEwOSwgIC0xNTQsICAtMTYzLCAgIDE3NCwgICAtNTV9LCB7ICAgLTM4LCAgICAzMiwgIC0xMDEsICAgLTc4LCAgIC01OX0sCisgeyAgLTIwNSwgIC0zMjEsICAgLTk3LCAgICA2OSwgICAgNzl9LCB7ICAtMzEwLCAgICA0NCwgICAgMTgsICAtMTg1LCAgICAzNH0sCisgeyAgLTExNSwgICAtMjAsICAtMTQ4LCAgIC0zOSwgICAyMDN9LCB7ICAgLTI5LCAgIDE1NCwgICAtMzAsICAtMTU4LCAgIDE2Nn0sCisgeyAgIC00NSwgIC0xMzEsICAtMzE3LCAgIC0yNCwgICAzNjN9LCB7ICAtMTY1LCAgLTIwNSwgIC0xMTIsICAtMjIyLCAgIDI2NX0sCisgeyAgIC0zMiwgICAtNDQsICAtMTUwLCAgICA1NCwgIC0xOTN9LCB7ICAgIC02LCAgIC0zOCwgIC0yNTUsICAtMTY5LCAgLTExNX0sCisgeyAgLTI2NiwgICAgODcsICAtMTg5LCAgIC0zNiwgIC0xNjl9LCB7ICAgLTYwLCAgIC04NywgIC0yNjYsICAtNDM2LCAgLTE3MH0sCisgeyAgIC02OCwgICAtODEsICAtMjc4LCAgICAyNCwgICAgMzh9LCB7ICAgLTIzLCAgIC0xOSwgIC0xNTUsICAtMjU2LCAgIDE0MX0sCisgeyAgIC02MSwgIC0yMjYsICAtNTY1LCAgLTE3NSwgICAgNzF9LCB7ICAgICA5LCAgIC0yOSwgIC0yMzcsICAtNTE1LCAgIDI2M30KK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRpY28yMl9pc2ZfMzZiWzEyOF1bNF0gPSB7CisgeyAgLTI5OCwgICAgLTYsICAgIDk1LCAgICAzMX0sIHsgIC0yMTMsICAgLTg3LCAgLTEyMiwgICAyNjF9LAorIHsgICAgIDQsICAgLTQ5LCAgIDIwOCwgICAgMTR9LCB7ICAtMTI5LCAgLTExMCwgICAgMzAsICAgMTE4fSwKKyB7ICAtMjE0LCAgIDI1OCwgICAxMTAsICAtMjM1fSwgeyAgIC00MSwgICAtMTgsICAtMTI2LCAgIDEyMH0sCisgeyAgIDEwMywgICAgNjUsICAgMTI3LCAgIC0zN30sIHsgICAxMjYsICAgLTM2LCAgIC0yNCwgICAgMjV9LAorIHsgIC0xMzgsICAgLTY3LCAgLTI3OCwgIC0xODZ9LCB7ICAtMTY0LCAgLTE5NCwgIC0yMDEsICAgIDc4fSwKKyB7ICAtMjExLCAgIC04NywgICAtNTEsICAtMjIxfSwgeyAgLTE3NCwgICAtNzksICAgLTk0LCAgIC0zOX0sCisgeyAgICAyMywgICAgLTYsICAtMTU3LCAgLTI0MH0sIHsgICAgMjIsICAtMTEwLCAgLTE1MywgICAtNjh9LAorIHsgICAxNDgsICAgIC01LCAgICAtMiwgIC0xNDl9LCB7ICAgIC0xLCAgLTEzNSwgICAtMzksICAtMTc5fSwKKyB7ICAgIDY4LCAgIDM2MCwgIC0xMTcsICAgLTE1fSwgeyAgIDEzNywgICAgNDcsICAtMjc4LCAgIDE0Nn0sCisgeyAgIDEzNiwgICAyNjAsICAgMTM1LCAgICA2NX0sIHsgICAgNjEsICAgMTE2LCAgIC00NSwgICAgOTd9LAorIHsgICAyMzEsICAgMzc5LCAgICA4NywgIC0xMjB9LCB7ICAgMzM4LCAgIDE3NywgIC0yNzIsICAgICAzfSwKKyB7ICAgMjY2LCAgIDE1NiwgICAgMjgsICAgLTY5fSwgeyAgIDI2MCwgICAgODQsICAgLTg1LCAgICA4Nn0sCisgeyAgLTI2NiwgICAxNTQsICAtMjU2LCAgLTE4Mn0sIHsgICAtMTcsICAgLTY1LCAgLTMwNCwgICAgLTZ9LAorIHsgICAtNDAsICAgMTc1LCAgLTE1MSwgIC0xODB9LCB7ICAgLTI3LCAgICAyNywgICAtODcsICAgLTYzfSwKKyB7ICAgMTIxLCAgIDExNCwgIC0xNjYsICAtNDY5fSwgeyAgIDE1OSwgICAtNjYsICAtMzIzLCAgLTIzMX0sCisgeyAgIDIxNCwgICAxNTIsICAtMTQxLCAgLTIxMn0sIHsgICAxMzcsICAgIDM2LCAgLTE4NCwgICAtNTF9LAorIHsgIC0yODIsICAtMjM3LCAgICA0MCwgICAgMTB9LCB7ICAgLTQ4LCAgLTIzNSwgICAtMzcsICAgMjUxfSwKKyB7ICAgLTU0LCAgLTMyMywgICAxMzYsICAgIDI5fSwgeyAgIC04OCwgIC0xNzQsICAgMjEzLCAgIDE5OH0sCisgeyAgLTM5MCwgICAgOTksICAgLTYzLCAgLTM3NX0sIHsgICAxMDcsICAtMTY5LCAgLTE2NCwgICA0MjR9LAorIHsgICAgNjksICAtMTExLCAgIDE0MSwgIC0xNjd9LCB7ICAgIDc0LCAgLTEyOSwgICAgNjUsICAgMTQ0fSwKKyB7ICAtMzUzLCAgLTIwNywgIC0yMDUsICAtMTA5fSwgeyAgLTE2MCwgIC0zODYsICAtMzU1LCAgICA5OH0sCisgeyAgLTE3NiwgIC00OTMsICAgLTIwLCAgLTE0M30sIHsgIC0yNTIsICAtNDMyLCAgICAtMiwgICAyMTZ9LAorIHsgICAtOTAsICAtMTc0LCAgLTE2OCwgIC00MTF9LCB7ICAgIDEzLCAgLTI4NCwgIC0yMjksICAtMTYwfSwKKyB7ICAgLTg3LCAgLTI3OSwgICAgMzQsICAtMjUxfSwgeyAgIC03NSwgIC0yNjMsICAgLTU4LCAgIC00Mn0sCisgeyAgIDQyMCwgICAgNTMsICAtMjExLCAgLTM1OH0sIHsgICAzODQsICAgLTM1LCAgLTM3NCwgICAzOTZ9LAorIHsgICAgNjgsICAtMjI4LCAgIDMyMywgICAgLTJ9LCB7ICAgMTY3LCAgLTMwNywgICAxOTIsICAgMTk0fSwKKyB7ICAgNDU5LCAgIDMyOSwgICAgLTUsICAtMzMyfSwgeyAgIDM3NSwgICAgNzksICAgIC03LCAgIDMxM30sCisgeyAgIDI4MiwgIC0xMjQsICAgMjAwLCAgIC05Mn0sIHsgICAyNzEsICAtMTYyLCAgIC03MCwgICAxODB9LAorIHsgIC0xNTcsICAtMjk4LCAgLTUxNCwgIC0zMDl9LCB7ICAgIDU4LCAgLTE2MywgIC01NDYsICAgIDE4fSwKKyB7ICAgMTI0LCAgLTM2NCwgICAxNjcsICAtMjM4fSwgeyAgICA4MywgIC00MTEsICAtMTE3LCAgICA5Nn0sCisgeyAgIDE0MCwgIC0xMTIsICAtMzg4LCAgLTYyNH0sIHsgICAyNTksICAtMTMzLCAgLTMxNywgICAgNDF9LAorIHsgICAxNjMsICAtMTMwLCAgIC02NCwgIC0zMzR9LCB7ICAgMjI2LCAgLTE2NSwgIC0xMjQsICAtMTEwfSwKKyB7ICAtNDY2LCAgIC02MSwgICAgIDYsICAgMjI5fSwgeyAgLTE1MywgICAyMDUsICAtMTQ1LCAgIDI0Mn0sCisgeyAgLTE1OSwgICAgNDgsICAgMTk1LCAgIDE0OH0sIHsgICAtNTgsICAgIDI4LCAgICAzMSwgICAyNzl9LAorIHsgIC0zMDMsICAgMTg1LCAgIDI3OSwgICAgLTR9LCB7ICAgLTYxLCAgIDE5NywgICAgNTksICAgIDg2fSwKKyB7ICAtMTE0LCAgIDEyMywgICAxNjgsICAgLTUyfSwgeyAgICAzNSwgICAgMzYsICAgMTAwLCAgIDEyNn0sCisgeyAgLTQwNywgICAxMDIsICAgLTc3LCAgIC00MH0sIHsgIC0zMzgsICAgIC0xLCAgLTM0MiwgICAxNTZ9LAorIHsgIC0xNzksICAgMTA1LCAgIC0zNCwgICAtOTd9LCB7ICAtMTg1LCAgICA4NCwgICAtMzUsICAgMTA4fSwKKyB7ICAtMTMzLCAgIDEwNywgICAtOTEsICAtMzU3fSwgeyAgLTE4MCwgICAgNTQsICAtMjI5LCAgICAyNH0sCisgeyAgIC00NCwgICAgNDcsICAgIDQ3LCAgLTE4Mn0sIHsgICAtNjYsICAgIDEzLCAgICA0NSwgICAgIDR9LAorIHsgIC0zMzksICAgMjUxLCAgICA2NCwgICAyMjZ9LCB7ICAgLTQyLCAgIDEwMSwgIC0zNTAsICAgMjc1fSwKKyB7ICAgLTk5LCAgIDM5OCwgICAxNDIsICAgMTIxfSwgeyAgIDExMSwgICAgMTIsICAtMTAyLCAgIDI2MH0sCisgeyAgICAgMCwgICA1MDUsICAgMjYwLCAgIC05NH0sIHsgICAxNjEsICAgMjg1LCAgIC05NiwgICAyMjR9LAorIHsgICAgLTQsICAgMjA2LCAgIDMxNCwgICAgMzN9LCB7ICAgMTY3LCAgIDEzOSwgICAgODgsICAgMjA0fSwKKyB7ICAtMjM1LCAgIDMxNiwgICAtNjAsICAgLTI1fSwgeyAgICAtOCwgIC0xNTAsICAtMzEyLCAgIDIwMX0sCisgeyAgIC0zNiwgICAyOTIsICAgIDYxLCAgLTEwNH0sIHsgICAtNDAsICAgMTc0LCAgLTE2MiwgICAgNDJ9LAorIHsgICAtMjEsICAgNDAyLCAgIC0yOSwgIC0zNTF9LCB7ICAgIDIxLCAgIDE1MiwgIC0zNjAsICAgLTkzfSwKKyB7ICAgIDU3LCAgIDE5MSwgICAyMTIsICAtMTk2fSwgeyAgICA3NiwgICAxNTgsICAgLTIxLCAgIC02OX0sCisgeyAgLTMyOCwgIC0xODUsICAgMzMxLCAgIDExOX0sIHsgICAtNTMsICAgMjg1LCAgICA1NiwgICAzMzd9LAorIHsgIC0xMDcsICAgLTI0LCAgIDQwNSwgICAgMjl9LCB7ICAgLTE4LCAgIDEzNywgICAyNzIsICAgMjc3fSwKKyB7ICAtMjU1LCAgICAyMiwgICAxNzMsICAtMTkxfSwgeyAgIDI5NSwgICAzMjIsICAgMzI1LCAgIDMwMn0sCisgeyAgICAyMSwgICAtMjcsICAgMzMyLCAgLTE3OH0sIHsgICAxMTksICAgIDEzLCAgIDI3MSwgICAxMjl9LAorIHsgIC00NTUsICAtMTgwLCAgIDExNiwgIC0xOTF9LCB7ICAtMjI3LCAgICA2MiwgIC0xNDgsICAgNTI0fSwKKyB7ICAtMTc2LCAgLTI4NywgICAyODIsICAtMTU3fSwgeyAgLTI0MywgICAgMTMsICAgMTk5LCAgIDQzMH0sCisgeyAgIC01OSwgICAtNDksICAgMTE1LCAgLTM2NX0sIHsgICAgNzIsICAtMTcyLCAgLTEzNywgICAgOTN9LAorIHsgIC0xMzgsICAtMTI2LCAgIDE0MSwgICAtODR9LCB7ICAgICA1LCAgLTEyNCwgICAgMzgsICAgLTIwfSwKKyB7ICAtMjU4LCAgIDMxMSwgICA2MDEsICAgMjEzfSwgeyAgICA5NCwgICAxMzAsICAgLTYxLCAgIDUwMn0sCisgeyAgICAtMSwgIC0xNTcsICAgNDg1LCAgIDMxM30sIHsgICAxNDYsICAgLTc0LCAgIDE1OCwgICAzNDV9LAorIHsgICAyNzYsICAgMTM1LCAgIDI4MCwgICAtNTd9LCB7ICAgNDkwLCAgIDI1MiwgICAgOTksICAgIDQzfSwKKyB7ICAgMjY3LCAgIC03NCwgICA0MjksICAgMTA1fSwgeyAgIDI3OCwgICAtMjMsICAgMTE5LCAgICA5NH0sCisgeyAgLTU0MiwgICA0ODgsICAgMjU3LCAgLTExNX0sIHsgICAtODQsICAtMjQ0LCAgLTQzOCwgICA0Nzh9LAorIHsgIC0xMTMsICAtNTQ1LCAgIDM4NywgICAxMDF9LCB7ICAgLTk1LCAgLTMwNiwgICAxMTEsICAgNDk4fSwKKyB7ICAgIDk1LCAgIDE2NiwgICAgMjIsICAtMzAxfSwgeyAgIDQyMCwgICAtMTUsICAgLTU4LCAgIC03OH0sCisgeyAgIDI3MCwgICAgMjksICAgMTIyLCAgLTI4Mn0sIHsgICAxNjAsICAtMjQwLCAgICA1MCwgICAtMzh9Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBkaWNvMjNfaXNmXzM2Yls2NF1bN10gPSB7CisgeyAgICA4MSwgICAtMTgsICAgIDY4LCAgIC0yNywgIC0xMjIsICAtMjgwLCAgICAtNH0sCisgeyAgICA0NSwgIC0xNzcsICAgMjA5LCAgIC0zMCwgIC0xMzYsICAgLTc0LCAgIDEzMX0sCisgeyAgIC00NCwgICAxMDEsICAgLTc1LCAgIC04OCwgICAtNDgsICAtMTM3LCAgIC01NH0sCisgeyAgLTI0NSwgICAtMjgsICAgIDYzLCAgIC0xOCwgIC0xMTIsICAtMTAzLCAgICA1OH0sCisgeyAgIC03OSwgICAgLTYsICAgMjIwLCAgIC02NSwgICAxMTQsICAgLTM1LCAgIC01MH0sCisgeyAgIDEwOSwgICAtNjUsICAgMTQzLCAgLTExNCwgICAxMjksICAgIDc2LCAgIDEyNX0sCisgeyAgIDE2NiwgICAgOTAsICAgLTYxLCAgLTI0MiwgICAxODYsICAgLTc0LCAgIC00M30sCisgeyAgIC00NiwgICAtOTIsICAgIDQ5LCAgLTIyNywgICAgMjQsICAtMTU1LCAgICAzOX0sCisgeyAgICA2NywgICAgODUsICAgIDk5LCAgIC00MiwgICAgNTMsICAtMTg0LCAgLTI4MX0sCisgeyAgIDE0MiwgIC0xMjIsICAgICAwLCAgICAyMSwgIC0xNDIsICAgLTE1LCAgIC0xN30sCisgeyAgIDIyMywgICAgOTIsICAgLTIxLCAgIC00OCwgICAtODIsICAgLTE0LCAgLTE2N30sCisgeyAgICA1MSwgICAtMzcsICAtMjQzLCAgIC0zMCwgICAtOTAsICAgIDE4LCAgIC01Nn0sCisgeyAgICA1NCwgICAxMDUsICAgIDc0LCAgICA4NiwgICAgNjksICAgIDEzLCAgLTEwMX0sCisgeyAgIDE5NiwgICAgNzIsICAgLTg5LCAgICA0MywgICAgNjUsICAgIDE5LCAgICAzOX0sCisgeyAgIDEyMSwgICAgMzQsICAgMTMxLCAgIC04MiwgICAgMjUsICAgMjEzLCAgLTE1Nn0sCisgeyAgIDEwMSwgIC0xMDIsICAtMTM2LCAgIC0yMSwgICAgNTcsICAgMjE0LCAgICAyMn0sCisgeyAgICAzNiwgIC0xMjQsICAgMjA1LCAgIDIwNCwgICAgNTgsICAtMTU2LCAgIC04M30sCisgeyAgICA4MywgIC0xMTcsICAgMTM3LCAgIDEzNywgICAgODUsICAgMTE2LCAgICA0NH0sCisgeyAgIC05MiwgIC0xNDgsICAgLTY4LCAgICAxMSwgIC0xMDIsICAtMTk3LCAgLTIyMH0sCisgeyAgIC03NiwgIC0xODUsICAgLTU4LCAgIDEzMiwgICAtMjYsICAtMTgzLCAgICA4NX0sCisgeyAgICAtNywgICAtMzEsICAgIC0yLCAgICAyMywgICAyMDUsICAtMTUxLCAgICAxMH0sCisgeyAgIC0yNywgICAtMzcsICAgIC01LCAgIC0xOCwgICAyOTIsICAgMTMxLCAgICAgMX0sCisgeyAgIDExNywgIC0xNjgsICAgICA5LCAgIC05MywgICAgODAsICAgLTU5LCAgLTEyNX0sCisgeyAgLTE4MiwgIC0yNDQsICAgIDk4LCAgIC0yNCwgICAxMzUsICAgLTIyLCAgICA5NH0sCisgeyAgIDIyMSwgICAgOTcsICAgMTA2LCAgICA0MiwgICAgNDMsICAtMTYwLCAgICA4M30sCisgeyAgICAyNSwgICAtNjQsICAgLTIxLCAgICAgNiwgICAgMTQsICAgLTE1LCAgIDE1NH0sCisgeyAgIDEyNiwgICAgMTUsICAtMTQwLCAgIDE1MCwgICAtMTAsICAtMjA3LCAgLTExNH0sCisgeyAgICA3OSwgICAtNjMsICAtMjExLCAgIC03MCwgICAtMjgsICAtMjE3LCAgIDE2NX0sCisgeyAgICA0NiwgICAgMzgsICAgLTIyLCAgIDI4MSwgICAxMzIsICAgLTYyLCAgIDEwOX0sCisgeyAgIDExMiwgICAgNTQsICAtMTEyLCAgIC05MywgICAyMDgsICAgIDI3LCAgIDI5Nn0sCisgeyAgIDExNSwgICAgMTAsICAtMTQ3LCAgICA0MSwgICAyMTYsICAgIDQyLCAgLTI3Nn0sCisgeyAgICA1MCwgIC0xMTUsICAtMjU0LCAgIDE2NywgICAxMTcsICAgIC0yLCAgICA2MX0sCisgeyAgICAxNywgICAxNDQsICAgIDM0LCAgIC03MiwgIC0xODYsICAtMTUwLCAgIDI3Mn0sCisgeyAgIC0yOSwgICAtNjYsICAgLTg5LCAgIC05NSwgIC0xNDksICAgMTI5LCAgIDI1MX0sCisgeyAgIDEyMiwgICAgIDAsICAgLTUwLCAgLTIzNCwgICAtOTEsICAgIDM2LCAgICAyNn0sCisgeyAgLTEwNSwgIC0xMDIsICAgLTg4LCAgLTEyMSwgIC0yMzYsICAgIC03LCAgIC0xMX0sCisgeyAgLTIwNCwgICAxMDksICAgICA1LCAgLTE5MSwgICAxMDUsICAgLTE1LCAgIDE2M30sCisgeyAgIC04MCwgICAgMzIsICAgLTI0LCAgLTIwOSwgICAgNDEsICAgMjk0LCAgICA3MH0sCisgeyAgLTEwNiwgICAtOTQsICAtMjA0LCAgLTExOCwgICAxMjAsICAgLTUwLCAgIC0zN30sCisgeyAgIC04MiwgIC0yNDEsICAgIDQ2LCAgLTEzMSwgICAtMjksICAgMTUwLCAgIC01NX0sCisgeyAgICAzMywgICAxNTUsICAgMTIwLCAgIC04OSwgICAgLTgsICAgICA3LCAgICA2Mn0sCisgeyAgIDIxMywgICAgODIsICAgIDYxLCAgICAxOCwgIC0xNjEsICAgMTQ0LCAgIDE1Mn0sCisgeyAgICAzMCwgICAxMzEsICAgIDY1LCAgIC04NywgIC0yNTUsICAgLTE3LCAgLTEwN30sCisgeyAgICAtOCwgICAgODUsICAgLTY0LCAgICA1MSwgIC0xNjIsICAgMjIzLCAgIC01M30sCisgeyAgLTEzNCwgICAyNjEsICAgIDY5LCAgIC01NiwgICAyMTgsICAgIDcyLCAgLTExMX0sCisgeyAgICAgMiwgICAxNTUsICAtMTEzLCAgIC04NywgICAgNDksICAgIDg1LCAgIC0yOH0sCisgeyAgLTE2MywgICAgNDIsICAgIC0xLCAgLTE5NiwgICAgIDcsICAgIDM5LCAgLTI0NX0sCisgeyAgICAxNCwgIC0xMzcsICAgLTc5LCAgICAxMSwgIC0xNjAsICAgMjAyLCAgLTI5M30sCisgeyAgIC05NCwgICAgMzMsICAgMjA4LCAgIDEwMCwgICAgNTYsICAgLTQ0LCAgIDMyNn0sCisgeyAgIC03OCwgICAtNDEsICAgMjMyLCAgICAxMywgIC0xNDIsICAgMjI3LCAgICA4MH0sCisgeyAgIC0xNiwgICAtODcsICAgMjAxLCAgICAzMywgIC0xMzMsICAgIDE1LCAgLTE4M30sCisgeyAgIC01OCwgIC0xOTIsICAgLTQ3LCAgIDE4NCwgIC0xMjgsICAgMTMzLCAgICA5OX0sCisgeyAgLTIwNSwgICAgMTEsICAtMTU1LCAgICA3OCwgICAgNTIsICAgIDcyLCAgIDE0MX0sCisgeyAgLTI0NiwgICAgMjYsICAgIDk5LCAgIDE1MSwgICAgNTksICAgMTE1LCAgIC02NH0sCisgeyAgIC03OSwgICAtNDcsICAgLTE2LCAgIC0xNCwgICAgIDYsICAgIDQ3LCAgIC00M30sCisgeyAgIC03MiwgIC0xNzgsICAgLTI3LCAgIDE2MiwgICAxMTIsICAgIDQzLCAgLTE3NH0sCisgeyAgLTE3NSwgICAyMzgsICAgMTg2LCAgICA3MSwgICAtNTQsICAtMTg4LCAgIC03Nn0sCisgeyAgLTIyNSwgICAyMzMsICAgIDM5LCAgIC0zOSwgIC0xNTgsICAgMTIyLCAgICA0NH0sCisgeyAgIC0yNiwgICAgNDMsICAgIDg0LCAgIDEzMCwgICAtOTMsICAgLTUxLCAgICAyMn0sCisgeyAgICAgMywgICAgOTIsICAtMTUwLCAgIDEzNiwgIC0xODIsICAgLTU3LCAgICA5N30sCisgeyAgLTEzMSwgICAxNzksICAgLTc4LCAgICA4MCwgICAgOTEsICAtMTY1LCAgICA5MH0sCisgeyAgICAtMiwgICAxNDgsICAgIDE1LCAgIDEzMCwgICAgNjUsICAgMTc1LCAgIDExN30sCisgeyAgLTEzOCwgICAxMTQsICAtMTM3LCAgIDEzMiwgICAgIDMsICAgLTEwLCAgLTE4Nn0sCisgeyAgIDE0MCwgICAgLTQsICAgLTM3LCAgIDI1NCwgICAtNjIsICAgIDkyLCAgLTEwOX0KK307CisKKy8qKiBNZWFucyBvZiBJU0YgdmVjdG9ycyBpbiBRMTUgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGlzZl9tZWFuW0xQX09SREVSXSA9IHsKKyAgIDczOCwgIDEzMjYsICAyMzM2LCAgMzU3OCwgIDQ1OTYsICA1NjYyLCAgNjcxMSwgIDc3MzAsCisgIDg3NTAsICA5NzUzLCAxMDcwNSwgMTE3MjgsIDEyODMzLCAxMzk3MSwgMTUwNDMsICA0MDM3Cit9OworCisvKiogSW5pdGlhbGl6YXRpb24gdGFibGVzIGZvciB0aGUgcHJvY2Vzc2VkIElTRiB2ZWN0b3IgaW4gUTE1ICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBpc2ZfaW5pdFtMUF9PUkRFUl0gPSB7CisgIDEwMjQsICAyMDQ4LCAgMzA3MiwgIDQwOTYsICA1MTIwLCAgNjE0NCwgIDcxNjgsIDgxOTIsCisgIDkyMTYsIDEwMjQwLCAxMTI2NCwgMTIyODgsIDEzMzEyLCAxNDMzNiwgMTUzNjAsIDM4NDAKK307CisKKy8qKiBJU0YvSVNQIGludGVycG9sYXRpb24gY29lZmZpY2llbnRzIGZvciBlYWNoIHN1YmZyYW1lICovCitzdGF0aWMgY29uc3QgZmxvYXQgaXNmcF9pbnRlcls0XSA9IHsgMC40NSwgMC44LCAwLjk2LCAxLjAgfTsKKworLyoqIENvZWZmaWNpZW50cyBmb3IgRklSIGludGVycG9sYXRpb24gb2YgZXhjaXRhdGlvbiB2ZWN0b3IKKyAqIGF0IHBpdGNoIGxhZyByZXN1bHRpbmcgdGhlIGFkYXB0aXZlIGNvZGVib29rIHZlY3RvciAqLworc3RhdGljIGNvbnN0IGZsb2F0IGFjX2ludGVyWzY1XSA9IHsKKyAgICAgOS40MDAwMjRlLTAxLAorICAgICA4LjU2Mzg0M2UtMDEsICA2LjMyMjYzMmUtMDEsICAzLjM3NTg1NGUtMDEsICA1LjkwODIwM2UtMDIsCisgICAgLTEuMzEwNDI1ZS0wMSwgLTEuOTk0MDE5ZS0wMSwgLTEuNTg1NjkzZS0wMSwgLTUuNjMzNTQ1ZS0wMiwKKyAgICAgNC43NjA3NDJlLTAyLCAgMS4wNjc1MDVlLTAxLCAgMS4wMzY5ODdlLTAxLCAgNS4yMDYyOTllLTAyLAorICAgIC0xLjUxOTc3NWUtMDIsIC02LjM3MjA3MGUtMDIsIC03LjM2Njk0M2UtMDIsIC00LjY1MDg3OWUtMDIsCisgICAgLTkuNzY1NjI1ZS0wNCwgIDMuODIwODAxZS0wMiwgIDUuMzE2MTYyZS0wMiwgIDQuMDAzOTA2ZS0wMiwKKyAgICAgOS4zMzgzNzllLTAzLCAtMi4xNjY3NDhlLTAyLCAtMy43NzgwNzZlLTAyLCAtMy4zMjAzMTJlLTAyLAorICAgIC0xLjMwMDA0OWUtMDIsICAxLjA2ODExNWUtMDIsICAyLjU4Nzg5MWUtMDIsICAyLjYzMDYxNWUtMDIsCisgICAgIDEuMzc5Mzk1ZS0wMiwgLTMuNjYyMTA5ZS0wMywgLTEuNjc4NDY3ZS0wMiwgLTEuOTgzNjQzZS0wMiwKKyAgICAtMS4yNzU2MzVlLTAyLCAtNS40OTMxNjRlLTA0LCAgMS4wMDcwODBlLTAyLCAgMS40MDk5MTJlLTAyLAorICAgICAxLjA2ODExNWUtMDIsICAyLjYyNDUxMmUtMDMsIC01LjM3MTA5NGUtMDMsIC05LjMzODM3OWUtMDMsCisgICAgLTguMTE3Njc2ZS0wMywgLTMuMTczODI4ZS0wMywgIDIuMzE5MzM2ZS0wMywgIDUuNjE1MjM0ZS0wMywKKyAgICAgNS41NTQxOTllLTAzLCAgMi44Njg2NTJlLTAzLCAtNi4xMDM1MTZlLTA0LCAtMi45OTA3MjNlLTAzLAorICAgIC0zLjM1NjkzNGUtMDMsIC0yLjAxNDE2MGUtMDMsIC0xLjIyMDcwM2UtMDQsICAxLjM0Mjc3M2UtMDMsCisgICAgIDEuNzA4OTg0ZS0wMywgIDEuMTU5NjY4ZS0wMywgIDIuNDQxNDA2ZS0wNCwgLTQuMjcyNDYxZS0wNCwKKyAgICAtNi4xMDM1MTZlLTA0LCAtNC4yNzI0NjFlLTA0LCAtMS4yMjA3MDNlLTA0LCAgNi4xMDM1MTZlLTA1LAorICAgICAxLjIyMDcwM2UtMDQsICA2LjEwMzUxNmUtMDUsICAwLjAwMDAwMGUrMDAsICAwLjAwMDAwMGUrMDAKK307CisKKy8qKiBbaV1bal0gaXMgdGhlIG51bWJlciBvZiBwdWxzZXMgcHJlc2VudCBpbiB0cmFjayBqIGF0IG1vZGUgaSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcHVsc2VzX25iX3Blcl9tb2RlX3RyW11bNF0gPSB7CisgICAgezEsIDEsIDAsIDB9LCB7MSwgMSwgMSwgMX0sIHsyLCAyLCAyLCAyfSwKKyAgICB7MywgMywgMiwgMn0sIHszLCAzLCAzLCAzfSwgezQsIDQsIDQsIDR9LAorICAgIHs1LCA1LCA0LCA0fSwgezYsIDYsIDYsIDZ9LCB7NiwgNiwgNiwgNn0KK307CisKKy8qKiBUYWJsZXMgZm9yIGRlY29kaW5nIHF1YW50aXplZCBnYWlucyB7IHBpdGNoIChRMTQpLCBmaXhlZCBmYWN0b3IgKFExMSkgfSAqLworc3RhdGljIGNvbnN0IGludDE2X3QgcXVhX2dhaW5fNmJbNjRdWzJdID0geworICAgIHsgIDE1NjYsICAxMzMyfSwgICAgeyAgMTU3NywgIDM1NTd9LAorICAgIHsgIDMwNzEsICA2NDkwfSwgICAgeyAgNDE5MywgMTAxNjN9LAorICAgIHsgIDQ0OTYsICAyNTM0fSwgICAgeyAgNTAxOSwgIDQ0ODh9LAorICAgIHsgIDU1ODYsIDE1NjE0fSwgICAgeyAgNTcyNSwgIDE0MjJ9LAorICAgIHsgIDY0NTMsICAgNTgwfSwgICAgeyAgNjcyNCwgIDY4MzF9LAorICAgIHsgIDc2NTcsICAzNTI3fSwgICAgeyAgODA3MiwgIDIwOTl9LAorICAgIHsgIDgyMzIsICA1MzE5fSwgICAgeyAgODgyNywgIDg3NzV9LAorICAgIHsgIDk3NDAsICAyODY4fSwgICAgeyAgOTg1NiwgIDE0NjV9LAorICAgIHsgMTAwODcsIDEyNDg4fSwgICAgeyAxMDI0MSwgIDQ0NTN9LAorICAgIHsgMTA4NTksICA2NjE4fSwgICAgeyAxMTMyMSwgIDM1ODd9LAorICAgIHsgMTE0MTcsICAxODAwfSwgICAgeyAxMTY0MywgIDI0Mjh9LAorICAgIHsgMTE3MTgsICAgOTg4fSwgICAgeyAxMjMxMiwgIDUwOTN9LAorICAgIHsgMTI1MjMsICA4NDEzfSwgICAgeyAxMjU3NCwgMjYyMTR9LAorICAgIHsgMTI2MDEsICAzMzk2fSwgICAgeyAxMzE3MiwgIDE2MjN9LAorICAgIHsgMTMyODUsICAyNDIzfSwgICAgeyAxMzQxOCwgIDYwODd9LAorICAgIHsgMTM0NTksIDEyODEwfSwgICAgeyAxMzY1NiwgIDM2MDd9LAorICAgIHsgMTQxMTEsICA0NTIxfSwgICAgeyAxNDE0NCwgIDEyMjl9LAorICAgIHsgMTQ0MjUsICAxODcxfSwgICAgeyAxNDQzMSwgIDcyMzR9LAorICAgIHsgMTQ0NDUsICAyODM0fSwgICAgeyAxNDYyOCwgMTAwMzZ9LAorICAgIHsgMTQ4NjAsIDE3NDk2fSwgICAgeyAxNTE2MSwgIDM2Mjl9LAorICAgIHsgMTUyMDksICA1ODE5fSwgICAgeyAxNTI5OSwgIDIyNTZ9LAorICAgIHsgMTU1MTgsICA0NzIyfSwgICAgeyAxNTY2MywgIDEwNjB9LAorICAgIHsgMTU3NTksICA3OTcyfSwgICAgeyAxNTkzOSwgMTE5NjR9LAorICAgIHsgMTYwMjAsICAyOTk2fSwgICAgeyAxNjA4NiwgIDE3MDd9LAorICAgIHsgMTY1MjEsICA0MjU0fSwgICAgeyAxNjU3NiwgIDYyMjR9LAorICAgIHsgMTY4OTQsICAyMzgwfSwgICAgeyAxNjkwNiwgICA2ODF9LAorICAgIHsgMTcyMTMsICA4NDA2fSwgICAgeyAxNzYxMCwgIDM0MTh9LAorICAgIHsgMTc4OTUsICA1MjY5fSwgICAgeyAxODE2OCwgMTE3NDh9LAorICAgIHsgMTgyMzAsICAxNTc1fSwgICAgeyAxODYwNywgMzI3Njd9LAorICAgIHsgMTg3MjgsIDIxNjg0fSwgICAgeyAxOTEzNywgIDI1NDN9LAorICAgIHsgMTk0MjIsICA2NTc3fSwgICAgeyAxOTQ0NiwgIDQwOTd9LAorICAgIHsgMTk0NTAsICA5MDU2fSwgICAgeyAyMDM3MSwgMTQ4ODV9Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBxdWFfZ2Fpbl83YlsxMjhdWzJdID0geworICAgIHsgICAyMDQsICAgNDQxfSwgICAgeyAgIDQ2NCwgIDE5Nzd9LAorICAgIHsgICA4NjksICAxMDc3fSwgICAgeyAgMTA3MiwgIDMwNjJ9LAorICAgIHsgIDEyODEsICA0NzU5fSwgICAgeyAgMTY0NywgIDE1Mzl9LAorICAgIHsgIDE4NDUsICA3MDIwfSwgICAgeyAgMTg1MywgICA2MzR9LAorICAgIHsgIDE5OTUsICAyMzM2fSwgICAgeyAgMjM1MSwgMTU0MDB9LAorICAgIHsgIDI2NjEsICAxMTY1fSwgICAgeyAgMjcwMiwgIDM5MDB9LAorICAgIHsgIDI3MTAsIDEwMTMzfSwgICAgeyAgMzE5NSwgIDE3NTJ9LAorICAgIHsgIDM0OTgsICAyNjI0fSwgICAgeyAgMzY2MywgICA4NDl9LAorICAgIHsgIDM5ODQsICA1Njk3fSwgICAgeyAgNDIxNCwgIDMzOTl9LAorICAgIHsgIDQ0MTUsICAxMzA0fSwgICAgeyAgNDY5NSwgIDIwNTZ9LAorICAgIHsgIDUzNzYsICA0NTU4fSwgICAgeyAgNTM4NiwgICA2NzZ9LAorICAgIHsgIDU1MTgsIDIzNTU0fSwgICAgeyAgNTU2NywgIDc3OTR9LAorICAgIHsgIDU2NDQsICAzMDYxfSwgICAgeyAgNTY3MiwgIDE1MTN9LAorICAgIHsgIDU5NTcsICAyMzM4fSwgICAgeyAgNjUzMywgIDEwNjB9LAorICAgIHsgIDY4MDQsICA1OTk4fSwgICAgeyAgNjgyMCwgIDE3Njd9LAorICAgIHsgIDY5MzcsICAzODM3fSwgICAgeyAgNzI3NywgICA0MTR9LAorICAgIHsgIDczMDUsICAyNjY1fSwgICAgeyAgNzQ2NiwgMTEzMDR9LAorICAgIHsgIDc5NDIsICAgNzk0fSwgICAgeyAgODAwNywgIDE5ODJ9LAorICAgIHsgIDgwMDcsICAxMzY2fSwgICAgeyAgODMyNiwgIDMxMDV9LAorICAgIHsgIDgzMzYsICA0ODEwfSwgICAgeyAgODcwOCwgIDc5NTR9LAorICAgIHsgIDg5ODksICAyMjc5fSwgICAgeyAgOTAzMSwgIDEwNTV9LAorICAgIHsgIDkyNDcsICAzNTY4fSwgICAgeyAgOTI4MywgIDE2MzF9LAorICAgIHsgIDk2NTQsICA2MzExfSwgICAgeyAgOTgxMSwgIDI2MDV9LAorICAgIHsgMTAxMjAsICAgNjgzfSwgICAgeyAxMDE0MywgIDQxNzl9LAorICAgIHsgMTAyNDUsICAxOTQ2fSwgICAgeyAxMDMzNSwgIDEyMTh9LAorICAgIHsgMTA0NjgsICA5OTYwfSwgICAgeyAxMDY1MSwgIDMwMDB9LAorICAgIHsgMTA5NTEsICAxNTMwfSwgICAgeyAxMDk2OSwgIDUyOTB9LAorICAgIHsgMTEyMDMsICAyMzA1fSwgICAgeyAxMTMyNSwgIDM1NjJ9LAorICAgIHsgMTE3NzEsICA2NzU0fSwgICAgeyAxMTgzOSwgIDE4NDl9LAorICAgIHsgMTE5NDEsICA0NDk1fSwgICAgeyAxMTk1NCwgIDEyOTh9LAorICAgIHsgMTE5NzUsIDE1MjIzfSwgICAgeyAxMTk3NywgICA4ODN9LAorICAgIHsgMTE5ODYsICAyODQyfSwgICAgeyAxMjQzOCwgIDIxNDF9LAorICAgIHsgMTI1OTMsICAzNjY1fSwgICAgeyAxMjYzNiwgIDgzNjd9LAorICAgIHsgMTI2NTgsICAxNTk0fSwgICAgeyAxMjg4NiwgIDI2Mjh9LAorICAgIHsgMTI5ODQsICA0OTQyfSwgICAgeyAxMzE0NiwgIDExMTV9LAorICAgIHsgMTMyMjQsICAgNTI0fSwgICAgeyAxMzM0MSwgIDMxNjN9LAorICAgIHsgMTMzOTksICAxOTIzfSwgICAgeyAxMzU0OSwgIDU5NjF9LAorICAgIHsgMTM2MDYsICAxNDAxfSwgICAgeyAxMzY1NSwgIDIzOTl9LAorICAgIHsgMTM3ODIsICAzOTA5fSwgICAgeyAxMzg2OCwgMTA5MjN9LAorICAgIHsgMTQyMjYsICAxNzIzfSwgICAgeyAxNDIzMiwgIDI5Mzl9LAorICAgIHsgMTQyNzgsICA3NTI4fSwgICAgeyAxNDQzOSwgIDQ1OTh9LAorICAgIHsgMTQ0NTEsICAgOTg0fSwgICAgeyAxNDQ1OCwgIDIyNjV9LAorICAgIHsgMTQ3OTIsICAxNDAzfSwgICAgeyAxNDgxOCwgIDM0NDV9LAorICAgIHsgMTQ4OTksICA1NzA5fSwgICAgeyAxNTAxNywgMTUzNjJ9LAorICAgIHsgMTUwNDgsICAxOTQ2fSwgICAgeyAxNTA2OSwgIDI2NTV9LAorICAgIHsgMTU0MDUsICA5NTkxfSwgICAgeyAxNTQwNSwgIDQwNzl9LAorICAgIHsgMTU1NzAsICA3MTgzfSwgICAgeyAxNTY4NywgIDIyODZ9LAorICAgIHsgMTU2OTEsICAxNjI0fSwgICAgeyAxNTY5OSwgIDMwNjh9LAorICAgIHsgMTU3NzIsICA1MTQ5fSwgICAgeyAxNTg2OCwgIDEyMDV9LAorICAgIHsgMTU5NzAsICAgNjk2fSwgICAgeyAxNjI0OSwgIDM1ODR9LAorICAgIHsgMTYzMzgsICAxOTE3fSwgICAgeyAxNjQyNCwgIDI1NjB9LAorICAgIHsgMTY0ODMsICA0NDM4fSwgICAgeyAxNjUyOSwgIDY0MTB9LAorICAgIHsgMTY2MjAsIDExOTY2fSwgICAgeyAxNjgzOSwgIDg3ODB9LAorICAgIHsgMTcwMzAsICAzMDUwfSwgICAgeyAxNzAzMywgMTgzMjV9LAorICAgIHsgMTcwOTIsICAxNTY4fSwgICAgeyAxNzEyMywgIDUxOTd9LAorICAgIHsgMTczNTEsICAyMTEzfSwgICAgeyAxNzM3NCwgICA5ODB9LAorICAgIHsgMTc1NjYsIDI2MjE0fSwgICAgeyAxNzYwOSwgIDM5MTJ9LAorICAgIHsgMTc2MzksIDMyNzY3fSwgICAgeyAxODE1MSwgIDc4NzF9LAorICAgIHsgMTgxOTcsICAyNTE2fSwgICAgeyAxODIwMiwgIDU2NDl9LAorICAgIHsgMTg2NzksICAzMjgzfSwgICAgeyAxODkzMCwgIDEzNzB9LAorICAgIHsgMTkyNzEsIDEzNzU3fSwgICAgeyAxOTMxNywgIDQxMjB9LAorICAgIHsgMTk0NjAsICAxOTczfSwgICAgeyAxOTY1NCwgMTAwMTh9LAorICAgIHsgMTk3NjQsICA2NzkyfSwgICAgeyAxOTkxMiwgIDUxMzV9LAorICAgIHsgMjAwNDAsICAyODQxfSwgICAgeyAyMTIzNCwgMTk4MzN9Cit9OworCisvKiogNC10YXAgbW92aW5nIGF2ZXJhZ2UgcHJlZGljdGlvbiBjb2VmZmljaWVudHMgaW4gcmV2ZXJzZSBvcmRlciAqLworc3RhdGljIGNvbnN0IGZsb2F0IGVuZXJneV9wcmVkX2ZhY1s0XSA9IHsgMC4yLCAwLjMsIDAuNCwgMC41IH07CisKKy8qKiBpbXB1bHNlIHJlc3BvbnNlIGZpbHRlciB0YWJsZXMgY29udmVydGVkIHRvIGZsb2F0IGZyb20gUTE1CisgKiB1c2VkIGZvciBhbnRpLXNwYXJzZW5lc3MgcHJvY2Vzc2luZyAqLworc3RhdGljIGNvbnN0IGZsb2F0IGlyX2ZpbHRlcl9zdHJbNjRdID0geworICAgICA2LjE1OTA1OGUtMDEsICAyLjk1ODA2OWUtMDEsICA5Ljk3OTI0OGUtMDIsIC0xLjA0ODg4OWUtMDEsCisgICAgIDguNzQwMjM0ZS0wMiwgLTEuNTk5MTIxZS0wMSwgIDQuODQ5MjQzZS0wMiwgLTQuMTQxMjM1ZS0wMiwKKyAgICAgMS44MzEwNTVlLTAyLCAgMS4xODgwNDllLTAxLCAtNC41Njg0ODFlLTAyLCAtMi4xMzAxMjdlLTAyLAorICAgICAzLjY3MTI2NWUtMDIsIC0xLjYwMTg2OGUtMDEsICAzLjY1OTA1OGUtMDIsICAxLjYzOTA5OWUtMDEsCisgICAgLTQuNTQxMDE2ZS0wMiwgLTIuMTUxNDg5ZS0wMiwgLTguODEwNDI1ZS0wMiwgIDYuMDMwMjczZS0wMiwKKyAgICAgMi43NDA0NzllLTAyLCAgMi4yMDAzMTdlLTAyLCAtMS4xODI4NjFlLTAxLCAgMS4yODk5NzhlLTAxLAorICAgIC0xLjU2MDA1OWUtMDEsICAxLjk1MzEyNWUtMDEsIC0zLjE0OTQxNGUtMDIsIC0xLjQ0MTk1NmUtMDEsCisgICAgIDEuMjQ5MDg0ZS0wMSwgLTEuMzI4MTI1ZS0wMSwgIDkuNzgwODg0ZS0wMiwgIDYuNTAwMjQ0ZS0wMiwKKyAgICAtNi4wOTEzMDllLTAyLCAtNS41OTk5NzZlLTAyLCAgOC4wODEwNTVlLTAyLCAtNS40NTA0MzllLTAyLAorICAgIC0xLjIzOTAxNGUtMDIsICAxLjc0ODY1N2UtMDIsICA3LjU4MDU2NmUtMDIsIC0xLjEwMTA3NGUtMDEsCisgICAgIDkuNTc5NDY4ZS0wMiwgLTQuMTU5NTQ2ZS0wMiwgLTcuODMwODExZS0wMiwgIDEuMTYyMTA5ZS0wMSwKKyAgICAtMS45NTAwNzNlLTAyLCAtNi4yNTkxNTVlLTAyLCAtMS42NTEwMDFlLTAyLCAgNy4yNTA5NzdlLTAyLAorICAgICAxLjE5OTk1MWUtMDEsIC0xLjkxMTAxMWUtMDEsICA0LjM3MDExN2UtMDIsIC0xLjA5ODkzOGUtMDEsCisgICAgIDEuNDkyMDA0ZS0wMSwgIDEuMTI5MTUwZS0wMiwgIDEuNzMwMzQ3ZS0wMiwgLTMuNTQ5MTk0ZS0wMiwKKyAgICAtOC43MDk3MTdlLTAyLCAgNS44NDEwNjRlLTAyLCAgMS4xOTAxODZlLTAzLCAtNy4zNzkxNTBlLTAyLAorICAgICAxLjA1NDA3N2UtMDEsICA5LjA3ODk3OWUtMDIsIC0xLjIyNzExMmUtMDEsICAxLjA0NzA1OGUtMDEKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBpcl9maWx0ZXJfbWlkWzY0XSA9IHsKKyAgICAgNy4zNTQxMjZlLTAxLCAgMy4xOTIxMzllLTAxLCAtMS42MDYxNDBlLTAxLCAtMi4zMjg0OTFlLTAyLAorICAgICA2LjI1MDAwMGUtMDIsIC0yLjgyODk3OWUtMDIsICA1LjM0OTczMWUtMDIsIC0xLjAxNDA5OWUtMDEsCisgICAgIDYuNzUwNDg4ZS0wMiwgIDEuOTg5NzQ2ZS0wMiwgLTYuNTQ5MDcyZS0wMiwgIDcuNTg5NzIyZS0wMiwKKyAgICAtMS4wODAwMTdlLTAxLCAgMS4yNTM5NjdlLTAxLCAtNi40MzAwNTRlLTAyLCAtMS4xNDEzNTdlLTAyLAorICAgIC0xLjkxMDQwMGUtMDIsICAxLjMwMzEwMWUtMDEsIC0xLjY3Mzg4OWUtMDEsICA2LjgyMDY3OWUtMDIsCisgICAgIDUuNjcwMTY2ZS0wMiwgLTguNDUwMzE3ZS0wMiwgIDIuMjcwNTA4ZS0wMiwgIDMuNDc5MDA0ZS0wMiwKKyAgICAtMi4zMjg0OTFlLTAyLCAtNC45Mjg1ODllLTAyLCAgMS4yMzkwMTRlLTAxLCAtMS4zOTU4NzRlLTAxLAorICAgICA5LjEwMDM0MmUtMDIsIC0zLjU0OTE5NGUtMDIsICAyLjIzMDgzNWUtMDIsIC0zLjM1MDgzMGUtMDIsCisgICAgIDIuNDUwNTYyZS0wMiwgIDUuMDk2NDM2ZS0wMywgLTIuMTc4OTU1ZS0wMiwgIDEuODQ5MzY1ZS0wMiwKKyAgICAtMS43MDg5ODRlLTAyLCAgMS45NTAwNzNlLTAyLCAgMS4zMTIyNTZlLTAzLCAtNS4zODk0MDRlLTAyLAorICAgICA5Ljg1MTA3NGUtMDIsIC04LjQ4OTk5MGUtMDIsICAyLjAyOTQxOWUtMDIsICAyLjMyODQ5MWUtMDIsCisgICAgIDcuMTEwNTk2ZS0wMywgLTYuMTA5NjE5ZS0wMiwgIDMuOTM5ODE5ZS0wMiwgIDUuNzA5ODM5ZS0wMiwKKyAgICAtMS4wNTg5NjBlLTAxLCAgMy4xNDk0MTRlLTAyLCAgOC4yNzAyNjRlLTAyLCAtMS4yMzI5MTBlLTAxLAorICAgICAxLjEwNTk1N2UtMDEsIC0xLjI4NjAxMWUtMDEsICAxLjYxNDk5MGUtMDEsIC0xLjMwMzEwMWUtMDEsCisgICAgIDQuNzY5ODk3ZS0wMiwgIDMuMjk1ODk4ZS0wMywgLTEuNzcwMDIwZS0wMiwgIDUuMDEwOTg2ZS0wMiwKKyAgICAtNy41MDEyMjFlLTAyLCAgMi45MjA1MzJlLTAyLCAgMS42NjAxNTZlLTAyLCAgNy43NTE0NjVlLTAyCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgKiBjb25zdCBpcl9maWx0ZXJzX2xvb2t1cFsyXSA9IHsKKyAgICBpcl9maWx0ZXJfc3RyLCBpcl9maWx0ZXJfbWlkCit9OworCisvKiogSGlnaC1wYXNzIGZpbHRlcnMgY29lZmZpY2llbnRzIGZvciAzMSBIeiBhbmQgNDAwIEh6IGN1dG9mZiAqLworc3RhdGljIGNvbnN0IGZsb2F0IGhwZl96ZXJvc1syXSAgICAgPSB7IC0yLjAsIDEuMCB9Oworc3RhdGljIGNvbnN0IGZsb2F0IGhwZl8zMV9wb2xlc1syXSAgPSB7IC0xLjk3ODg4MTgzNiwgMC45NzkxMjU5NzcgfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBocGZfMzFfZ2FpbiAgICAgID0gMC45ODk1MDE5NTM7CisKK3N0YXRpYyBjb25zdCBmbG9hdCBocGZfNDAwX3BvbGVzWzJdID0geyAtMS43ODcxMDkzNzUsIDAuODY0MjU3ODEyIH07CitzdGF0aWMgY29uc3QgZmxvYXQgaHBmXzQwMF9nYWluICAgICA9IDAuODkzNTU0Njg3OworCisvKiogSW50ZXJwb2xhdGlvbiBjb2VmZmljaWVudHMgZm9yIDUvNCBzaWduYWwgdXBzYW1wbGluZworICogVGFibGUgZnJvbSB0aGUgcmVmZXJlbmNlIHNvdXJjZSB3YXMgcmVvcmRlcmVkIGZvciBlZmZpY2llbmN5ICovCitzdGF0aWMgY29uc3QgZmxvYXQgdXBzYW1wbGVfZmlyWzRdWzI0XSA9IHsKKyAgICB7IC02LjEwMzUxNmUtMDUsICA3LjMyNDIxOWUtMDQsIC0yLjAxNDE2MGUtMDMsICA0LjE1MDM5MWUtMDMsCisgICAgICAtNy4yNjMxODRlLTAzLCAgMS4xNjU3NzFlLTAyLCAtMS43NzYxMjNlLTAyLCAgMi42MjQ1MTJlLTAyLAorICAgICAgLTMuODY5NjI5ZS0wMiwgIDUuODc3Njg2ZS0wMiwgLTkuODYzMjgxZS0wMiwgIDIuMzE0NDUzZS0wMSwKKyAgICAgICA5LjM0ODc1NWUtMDEsIC0xLjUyMzQzOGUtMDEsICA3Ljg2MTMyOGUtMDIsIC00LjkzNzc0NGUtMDIsCisgICAgICAgMy4zMDgxMDVlLTAyLCAtMi4yNTIxOTdlLTAyLCAgMS41MDc1NjhlLTAyLCAtOS43NjU2MjVlLTAzLAorICAgICAgIDUuODU5Mzc1ZS0wMywgLTMuMTczODI4ZS0wMywgIDEuNDAzODA5ZS0wMywgLTMuNjYyMTA5ZS0wNCAgfSwKKyAgICB7IC0yLjQ0MTQwNmUtMDQsICAxLjQ2NDg0NGUtMDMsIC0zLjc4NDE4MGUtMDMsICA3LjU2ODM1OWUtMDMsCisgICAgICAtMS4zMDAwNDllLTAyLCAgMi4wNjI5ODhlLTAyLCAtMy4xMTI3OTNlLTAyLCAgNC41ODk4NDRlLTAyLAorICAgICAgLTYuNzgxMDA2ZS0wMiwgIDEuMDQyNDgwZS0wMSwgLTEuODE1MTg2ZS0wMSwgIDUuMDE2NDc5ZS0wMSwKKyAgICAgICA3LjU0ODgyOGUtMDEsIC0yLjA5NDcyN2UtMDEsICAxLjE0ODA3MWUtMDEsIC03LjM0ODYzM2UtMDIsCisgICAgICAgNC45NTYwNTVlLTAyLCAtMy4zNjkxNDFlLTAyLCAgMi4yNDYwOTRlLTAyLCAtMS40MzQzMjZlLTAyLAorICAgICAgIDguNDgzODg3ZS0wMywgLTQuNDU1NTY2ZS0wMywgIDEuODMxMDU1ZS0wMywgLTQuMjcyNDYxZS0wNCAgfSwKKyAgICB7IC00LjI3MjQ2MWUtMDQsICAxLjgzMTA1NWUtMDMsIC00LjQ1NTU2NmUtMDMsICA4LjQ4Mzg4N2UtMDMsCisgICAgICAtMS40MzQzMjZlLTAyLCAgMi4yNDYwOTRlLTAyLCAtMy4zNjkxNDFlLTAyLCAgNC45NTYwNTVlLTAyLAorICAgICAgLTcuMzQ4NjMzZS0wMiwgIDEuMTQ4MDcxZS0wMSwgLTIuMDk0NzI3ZS0wMSwgIDcuNTQ4ODI4ZS0wMSwKKyAgICAgICA1LjAxNjQ3OWUtMDEsIC0xLjgxNTE4NmUtMDEsICAxLjA0MjQ4MGUtMDEsIC02Ljc4MTAwNmUtMDIsCisgICAgICAgNC41ODk4NDRlLTAyLCAtMy4xMTI3OTNlLTAyLCAgMi4wNjI5ODhlLTAyLCAtMS4zMDAwNDllLTAyLAorICAgICAgIDcuNTY4MzU5ZS0wMywgLTMuNzg0MTgwZS0wMywgIDEuNDY0ODQ0ZS0wMywgLTIuNDQxNDA2ZS0wNCAgfSwKKyAgICB7IC0zLjY2MjEwOWUtMDQsICAxLjQwMzgwOWUtMDMsIC0zLjE3MzgyOGUtMDMsICA1Ljg1OTM3NWUtMDMsCisgICAgICAtOS43NjU2MjVlLTAzLCAgMS41MDc1NjhlLTAyLCAtMi4yNTIxOTdlLTAyLCAgMy4zMDgxMDVlLTAyLAorICAgICAgLTQuOTM3NzQ0ZS0wMiwgIDcuODYxMzI4ZS0wMiwgLTEuNTIzNDM4ZS0wMSwgIDkuMzQ4NzU1ZS0wMSwKKyAgICAgICAyLjMxNDQ1M2UtMDEsIC05Ljg2MzI4MWUtMDIsICA1Ljg3NzY4NmUtMDIsIC0zLjg2OTYyOWUtMDIsCisgICAgICAgMi42MjQ1MTJlLTAyLCAtMS43NzYxMjNlLTAyLCAgMS4xNjU3NzFlLTAyLCAtNy4yNjMxODRlLTAzLAorICAgICAgIDQuMTUwMzkxZS0wMywgLTIuMDE0MTYwZS0wMywgIDcuMzI0MjE5ZS0wNCwgLTYuMTAzNTE2ZS0wNSAgfQorfTsKKworLyoqIEhpZ2ggYmFuZCBxdWFudGl6ZWQgZ2FpbnMgZm9yIDIzazg1IGluIFExNCAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IHF1YV9oYl9nYWluWzE2XSA9IHsKKyAgIDM2MjQsIDQ2NzMsIDU1OTcsIDY0NzksIDc0MjUsIDgzNzgsIDkzMjQsIDEwMjY0LAorICAgMTEyMTAsIDEyMjA2LCAxMzM5MSwgMTQ4NDQsIDE2NzcwLCAxOTY1NSwgMjQyODksIDMyNzI4Cit9OworCisvKiogSGlnaC1iYW5kIHBvc3QtcHJvY2Vzc2luZyBGSVIgZmlsdGVycyBjb2VmZmljaWVudHMgZnJvbSBRMTUgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBicGZfNl83X2NvZWZbMzFdID0geyAvLyBiYW5kIHBhc3MsIDZrSHogYW5kIDdrSHogY3V0b2ZmcworICAgIC0yLjQ0MTQwNmUtMDQsICAzLjU4NTgxNWUtMDQsICAyLjQ0MTQwNmUtMDQsCisgICAgLTIuMDU5OTM3ZS0wNCwgLTIuODE1MjQ4ZS0wMywgIDguNTYwMTgwZS0wMywKKyAgICAtMS4wODQxMzdlLTAyLCAgMC4wMDAwMDBlKzAwLCAgMi44OTc2NDVlLTAyLAorICAgIC02Ljc3NDkwMmUtMDIsICA5LjQyMTU0MGUtMDIsIC04LjM4MDEyOGUtMDIsCisgICAgIDIuNzA2OTEwZS0wMiwgIDUuOTI0OTg3ZS0wMiwgLTEuMzczMzY3ZS0wMSwKKyAgICAgMS42ODc0NjllLTAxLAorICAgIC0xLjM3MzM2N2UtMDEsICA1LjkyNDk4N2UtMDIsICAyLjcwNjkxMGUtMDIsCisgICAgLTguMzgwMTI4ZS0wMiwgIDkuNDIxNTQwZS0wMiwgLTYuNzc0OTAyZS0wMiwKKyAgICAgMi44OTc2NDVlLTAyLCAgMC4wMDAwMDBlKzAwLCAtMS4wODQxMzdlLTAyLAorICAgICA4LjU2MDE4MGUtMDMsIC0yLjgxNTI0OGUtMDMsIC0yLjA1OTkzN2UtMDQsCisgICAgIDIuNDQxNDA2ZS0wNCwgIDMuNTg1ODE1ZS0wNCwgLTIuNDQxNDA2ZS0wNAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGxwZl83X2NvZWZbMzFdID0geyAvLyBsb3cgcGFzcywgN2tIeiBjdXRvZmYKKyAgICAtNi40MDg2OTFlLTA0LCAgMS40MzQzMjZlLTAzLCAtMi43MTYwNjRlLTAzLAorICAgICA0LjQ1NTU2NmUtMDMsIC02LjE5NTA2OGUtMDMsICA2Ljk4ODUyNWUtMDMsCisgICAgLTUuNDAxNjExZS0wMywgIDAuMDAwMDAwZSswMCwgIDEuMDIyMzM5ZS0wMiwKKyAgICAtMi41NjA0MjVlLTAyLCAgNC41MzE4NjBlLTAyLCAtNi43NDc0MzdlLTAyLAorICAgICA4Ljk0NDcwMmUtMDIsIC0xLjA4MDkzM2UtMDEsICAxLjIwNjM2MGUtMDEsCisgICAgIDguNzUzMDUyZS0wMSwKKyAgICAgMS4yMDYzNjBlLTAxLCAtMS4wODA5MzNlLTAxLCAgOC45NDQ3MDJlLTAyLAorICAgIC02Ljc0NzQzN2UtMDIsICA0LjUzMTg2MGUtMDIsIC0yLjU2MDQyNWUtMDIsCisgICAgIDEuMDIyMzM5ZS0wMiwgIDAuMDAwMDAwZSswMCwgLTUuNDAxNjExZS0wMywKKyAgICAgNi45ODg1MjVlLTAzLCAtNi4xOTUwNjhlLTAzLCAgNC40NTU1NjZlLTAzLAorICAgIC0yLjcxNjA2NGUtMDMsICAxLjQzNDMyNmUtMDMsIC02LjQwODY5MWUtMDQKK307CisKKy8qKiBDb3JlIGZyYW1lIHNpemVzIGluIGVhY2ggbW9kZSAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNmX3NpemVzX3diW10gPSB7CisgICAgMTMyLCAxNzcsIDI1MywgMjg1LCAzMTcsIDM2NSwgMzk3LCA0NjEsIDQ3NywKKyAgICA0MCAvLy8gU0lEL2NvbWZvcnQgbm9pc2UgZnJhbWUKK307CisKKyNlbmRpZiAvKiBBVkNPREVDX0FNUldCREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbXJ3YmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYW1yd2JkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjY2OGJiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYW1yd2JkZWMuYwpAQCAtMCwwICsxLDEyNzkgQEAKKy8qCisgKiBBTVIgd2lkZWJhbmQgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcmNlbG8gR2FsdmFvIFBvdm9hCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgcGFydGljdWxhciBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFNUiB3aWRlYmFuZCBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxzcC5oIgorI2luY2x1ZGUgImNlbHBfZmlsdGVycy5oIgorI2luY2x1ZGUgImNlbHBfbWF0aC5oIgorI2luY2x1ZGUgImFjZWxwX2ZpbHRlcnMuaCIKKyNpbmNsdWRlICJhY2VscF92ZWN0b3JzLmgiCisjaW5jbHVkZSAiYWNlbHBfcGl0Y2hfZGVsYXkuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIEFNUl9VU0VfMTZCSVRfVEFCTEVTCisjaW5jbHVkZSAiYW1yLmgiCisKKyNpbmNsdWRlICJhbXJ3YmRhdGEuaCIKKyNpbmNsdWRlICJtaXBzL2FtcndiZGVjX21pcHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFNUldCRnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lOyAvLy88IEFNUldCIHBhcmFtZXRlcnMgZGVjb2RlZCBmcm9tIGJpdHN0cmVhbQorICAgIGVudW0gTW9kZSAgICAgICAgICAgICAgICAgICAgICAgIGZyX2N1cl9tb2RlOyAvLy88IG1vZGUgaW5kZXggb2YgY3VycmVudCBmcmFtZQorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBmcl9xdWFsaXR5OyAvLy88IGZyYW1lIHF1YWxpdHkgaW5kZXggKEZRSSkKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICBpc2ZfY3VyW0xQX09SREVSXTsgLy8vPCB3b3JraW5nIElTRiB2ZWN0b3IgZnJvbSBjdXJyZW50IGZyYW1lCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgaXNmX3FfcGFzdFtMUF9PUkRFUl07IC8vLzwgcXVhbnRpemVkIElTRiB2ZWN0b3Igb2YgdGhlIHByZXZpb3VzIGZyYW1lCisgICAgZmxvYXQgICAgICAgICAgICAgICBpc2ZfcGFzdF9maW5hbFtMUF9PUkRFUl07IC8vLzwgZmluYWwgcHJvY2Vzc2VkIElTRiB2ZWN0b3Igb2YgdGhlIHByZXZpb3VzIGZyYW1lCisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgIGlzcFs0XVtMUF9PUkRFUl07IC8vLzwgSVNQIHZlY3RvcnMgZnJvbSBjdXJyZW50IGZyYW1lCisgICAgZG91YmxlICAgICAgICAgICAgICAgaXNwX3N1YjRfcGFzdFtMUF9PUkRFUl07IC8vLzwgSVNQIHZlY3RvciBmb3IgdGhlIDR0aCBzdWJmcmFtZSBvZiB0aGUgcHJldmlvdXMgZnJhbWUKKworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIGxwX2NvZWZbNF1bTFBfT1JERVJdOyAvLy88IExpbmVhciBQcmVkaWN0aW9uIENvZWZmaWNpZW50cyBmcm9tIElTUCB2ZWN0b3IKKworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfcGl0Y2hfbGFnOyAvLy88IGludGVnZXIgcGFydCBvZiBwaXRjaCBsYWcgZm9yIHRoZSBuZXh0IHJlbGF0aXZlIHN1YmZyYW1lCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoX2xhZ19pbnQ7IC8vLzwgaW50ZWdlciBwYXJ0IG9mIHBpdGNoIGxhZyBvZiB0aGUgcHJldmlvdXMgc3ViZnJhbWUKKworICAgIGZsb2F0IGV4Y2l0YXRpb25fYnVmW0FNUldCX1BfREVMQVlfTUFYICsgTFBfT1JERVIgKyAyICsgQU1SV0JfU0ZSX1NJWkVdOyAvLy88IGN1cnJlbnQgZXhjaXRhdGlvbiBhbmQgYWxsIG5lY2Vzc2FyeSBleGNpdGF0aW9uIGhpc3RvcnkKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXhjaXRhdGlvbjsgLy8vPCBwb2ludHMgdG8gY3VycmVudCBleGNpdGF0aW9uIGluIGV4Y2l0YXRpb25fYnVmW10KKworICAgIGZsb2F0ICAgICAgICAgICBwaXRjaF92ZWN0b3JbQU1SV0JfU0ZSX1NJWkVdOyAvLy88IGFkYXB0aXZlIGNvZGVib29rIChwaXRjaCkgdmVjdG9yIGZvciBjdXJyZW50IHN1YmZyYW1lCisgICAgZmxvYXQgICAgICAgICAgIGZpeGVkX3ZlY3RvcltBTVJXQl9TRlJfU0laRV07IC8vLzwgYWxnZWJyYWljIGNvZGVib29rIChmaXhlZCkgdmVjdG9yIGZvciBjdXJyZW50IHN1YmZyYW1lCisKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbl9lcnJvcls0XTsgLy8vPCBxdWFudGlmaWVkIHByZWRpY3Rpb24gZXJyb3JzIHsyMGxvZzEwKF5nYW1tYV9nYyl9IGZvciBwcmV2aW91cyBmb3VyIHN1YmZyYW1lcworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaF9nYWluWzZdOyAvLy88IHF1YW50aWZpZWQgcGl0Y2ggZ2FpbnMgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBmaXZlIHN1YmZyYW1lcworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9nYWluWzJdOyAvLy88IHF1YW50aWZpZWQgZml4ZWQgZ2FpbnMgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdWJmcmFtZXMKKworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsdF9jb2VmOyAvLy88IHtiZXRhXzF9IHJlbGF0ZWQgdG8gdGhlIHZvaWNpbmcgb2YgdGhlIHByZXZpb3VzIHN1YmZyYW1lCisKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgcHJldl9zcGFyc2VfZml4ZWRfZ2FpbjsgLy8vPCBwcmV2aW91cyBmaXhlZCBnYWluOyB1c2VkIGJ5IGFudGktc3BhcnNlbmVzcyB0byBkZXRlcm1pbmUgIm9uc2V0IgorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgIHByZXZfaXJfZmlsdGVyX25yOyAvLy88IHByZXZpb3VzIGltcHVsc2UgcmVzcG9uc2UgZmlsdGVyICJpbXBOciI6IDAgLSBzdHJvbmcsIDEgLSBtZWRpdW0sIDIgLSBub25lCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3RyX2dhaW47IC8vLzwgcHJldmlvdXMgaW5pdGlhbCBnYWluIHVzZWQgYnkgbm9pc2UgZW5oYW5jZXIgZm9yIHRocmVzaG9sZAorCisgICAgZmxvYXQgc2FtcGxlc19heltMUF9PUkRFUiArIEFNUldCX1NGUl9TSVpFXTsgICAgICAgICAvLy88IGxvdy1iYW5kIHNhbXBsZXMgYW5kIG1lbW9yeSBmcm9tIHN5bnRoZXNpcyBhdCAxMi44a0h6CisgICAgZmxvYXQgc2FtcGxlc191cFtVUFNfTUVNX1NJWkUgKyBBTVJXQl9TRlJfU0laRV07ICAgICAvLy88IGxvdy1iYW5kIHNhbXBsZXMgYW5kIG1lbW9yeSBwcm9jZXNzZWQgZm9yIHVwc2FtcGxpbmcKKyAgICBmbG9hdCBzYW1wbGVzX2hiW0xQX09SREVSXzE2ayArIEFNUldCX1NGUl9TSVpFXzE2a107IC8vLzwgaGlnaC1iYW5kIHNhbXBsZXMgYW5kIG1lbW9yeSBmcm9tIHN5bnRoZXNpcyBhdCAxNmtIegorCisgICAgZmxvYXQgICAgICAgICAgaHBmXzMxX21lbVsyXSwgaHBmXzQwMF9tZW1bMl07IC8vLzwgcHJldmlvdXMgdmFsdWVzIGluIHRoZSBoaWdoIHBhc3MgZmlsdGVycworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtcGhfbWVtWzFdOyAvLy88IHByZXZpb3VzIHZhbHVlIGluIHRoZSBkZS1lbXBoYXNpcyBmaWx0ZXIKKyAgICBmbG9hdCAgICAgICAgICAgICAgIGJwZl82XzdfbWVtW0hCX0ZJUl9TSVpFXTsgLy8vPCBwcmV2aW91cyB2YWx1ZXMgaW4gdGhlIGhpZ2gtYmFuZCBiYW5kIHBhc3MgZmlsdGVyCisgICAgZmxvYXQgICAgICAgICAgICAgICAgIGxwZl83X21lbVtIQl9GSVJfU0laRV07IC8vLzwgcHJldmlvdXMgdmFsdWVzIGluIHRoZSBoaWdoLWJhbmQgbG93IHBhc3MgZmlsdGVyCisKKyAgICBBVkxGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuZzsgLy8vPCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBmb3Igd2hpdGUgbm9pc2UgZXhjaXRhdGlvbgorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2ZyYW1lOyAvLy88IGZsYWcgYWN0aXZlIGR1cmluZyBkZWNvZGluZyBvZiB0aGUgZmlyc3QgZnJhbWUKKyAgICBBQ0VMUEZDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgYWNlbHBmX2N0eDsgLy8vPCBjb250ZXh0IGZvciBmaWx0ZXJzIGZvciBBQ0VMUC1iYXNlZCBjb2RlY3MKKyAgICBBQ0VMUFZDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgYWNlbHB2X2N0eDsgLy8vPCBjb250ZXh0IGZvciB2ZWN0b3Igb3BlcmF0aW9ucyBmb3IgQUNFTFAtYmFzZWQgY29kZWNzCisgICAgQ0VMUEZDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICBjZWxwZl9jdHg7IC8vLzwgY29udGV4dCBmb3IgZmlsdGVycyBmb3IgQ0VMUC1iYXNlZCBjb2RlY3MKKyAgICBDRUxQTUNvbnRleHQgICAgICAgICAgICAgICAgICAgICAgIGNlbHBtX2N0eDsgLy8vPCBjb250ZXh0IGZvciBmaXhlZCBwb2ludCBtYXRoIG9wZXJhdGlvbnMKKworfSBBTVJXQkNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBhbXJ3Yl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQU1SV0JDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IDEpIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJtdWx0aS1jaGFubmVsIEFNUiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBpZiAoIWF2Y3R4LT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gMTYwMDA7CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgICAgID0gQVZfU0FNUExFX0ZNVF9GTFQ7CisKKyAgICBhdl9sZmdfaW5pdCgmY3R4LT5wcm5nLCAxKTsKKworICAgIGN0eC0+ZXhjaXRhdGlvbiAgPSAmY3R4LT5leGNpdGF0aW9uX2J1ZltBTVJXQl9QX0RFTEFZX01BWCArIExQX09SREVSICsgMV07CisgICAgY3R4LT5maXJzdF9mcmFtZSA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBfT1JERVI7IGkrKykKKyAgICAgICAgY3R4LT5pc2ZfcGFzdF9maW5hbFtpXSA9IGlzZl9pbml0W2ldICogKDEuMGYgLyAoMSA8PCAxNSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgY3R4LT5wcmVkaWN0aW9uX2Vycm9yW2ldID0gTUlOX0VORVJHWTsKKworICAgIGZmX2FjZWxwX2ZpbHRlcl9pbml0KCZjdHgtPmFjZWxwZl9jdHgpOworICAgIGZmX2FjZWxwX3ZlY3RvcnNfaW5pdCgmY3R4LT5hY2VscHZfY3R4KTsKKyAgICBmZl9jZWxwX2ZpbHRlcl9pbml0KCZjdHgtPmNlbHBmX2N0eCk7CisgICAgZmZfY2VscF9tYXRoX2luaXQoJmN0eC0+Y2VscG1fY3R4KTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSB0aGUgZnJhbWUgaGVhZGVyIGluIHRoZSAiTUlNRS9zdG9yYWdlIiBmb3JtYXQuIFRoaXMgZm9ybWF0CisgKiBpcyBzaW1wbGVyIGFuZCBkb2VzIG5vdCBjYXJyeSB0aGUgYXV4aWxpYXJ5IGZyYW1lIGluZm9ybWF0aW9uLgorICoKKyAqIEBwYXJhbVtpbl0gY3R4ICAgICAgICAgICAgICAgICAgVGhlIENvbnRleHQKKyAqIEBwYXJhbVtpbl0gYnVmICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyCisgKgorICogQHJldHVybiBUaGUgZGVjb2RlZCBoZWFkZXIgbGVuZ3RoIGluIGJ5dGVzCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX21pbWVfaGVhZGVyKEFNUldCQ29udGV4dCAqY3R4LCBjb25zdCB1aW50OF90ICpidWYpCit7CisgICAgLyogRGVjb2RlIGZyYW1lIGhlYWRlciAoMXN0IG9jdGV0KSAqLworICAgIGN0eC0+ZnJfY3VyX21vZGUgID0gYnVmWzBdID4+IDMgJiAweDBGOworICAgIGN0eC0+ZnJfcXVhbGl0eSAgID0gKGJ1ZlswXSAmIDB4NCkgPT0gMHg0OworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogRGVjb2RlIHF1YW50aXplZCBJU0YgdmVjdG9ycyB1c2luZyAzNi1iaXQgaW5kZXhlcyAoNks2MCBtb2RlIG9ubHkpLgorICoKKyAqIEBwYXJhbVtpbl0gIGluZCAgICAgICAgICAgICAgICAgQXJyYXkgb2YgNSBpbmRleGVzCisgKiBAcGFyYW1bb3V0XSBpc2ZfcSAgICAgICAgICAgICAgIEJ1ZmZlciBmb3IgaXNmX3FbTFBfT1JERVJdCisgKgorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfaXNmX2luZGljZXNfMzZiKHVpbnQxNl90ICppbmQsIGZsb2F0ICppc2ZfcSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisgICAgICAgIGlzZl9xW2ldICAgICAgPSBkaWNvMV9pc2ZbaW5kWzBdXVtpXSAgICAgICogKDEuMGYgLyAoMSA8PCAxNSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgICAgICAgaXNmX3FbaSArIDldICA9IGRpY28yX2lzZltpbmRbMV1dW2ldICAgICAgKiAoMS4wZiAvICgxIDw8IDE1KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICBpc2ZfcVtpXSAgICAgKz0gZGljbzIxX2lzZl8zNmJbaW5kWzJdXVtpXSAqICgxLjBmIC8gKDEgPDwgMTUpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGlzZl9xW2kgKyA1XSArPSBkaWNvMjJfaXNmXzM2YltpbmRbM11dW2ldICogKDEuMGYgLyAoMSA8PCAxNSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgICAgICAgaXNmX3FbaSArIDldICs9IGRpY28yM19pc2ZfMzZiW2luZFs0XV1baV0gKiAoMS4wZiAvICgxIDw8IDE1KSk7Cit9CisKKy8qKgorICogRGVjb2RlIHF1YW50aXplZCBJU0YgdmVjdG9ycyB1c2luZyA0Ni1iaXQgaW5kZXhlcyAoZXhjZXB0IDZLNjAgbW9kZSkuCisgKgorICogQHBhcmFtW2luXSAgaW5kICAgICAgICAgICAgICAgICBBcnJheSBvZiA3IGluZGV4ZXMKKyAqIEBwYXJhbVtvdXRdIGlzZl9xICAgICAgICAgICAgICAgQnVmZmVyIGZvciBpc2ZfcVtMUF9PUkRFUl0KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9pc2ZfaW5kaWNlc180NmIodWludDE2X3QgKmluZCwgZmxvYXQgKmlzZl9xKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKyAgICAgICAgaXNmX3FbaV0gICAgICAgPSBkaWNvMV9pc2ZbaW5kWzBdXVtpXSAgKiAoMS4wZiAvICgxIDw8IDE1KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICAgICAgICBpc2ZfcVtpICsgOV0gICA9IGRpY28yX2lzZltpbmRbMV1dW2ldICAqICgxLjBmIC8gKDEgPDwgMTUpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGlzZl9xW2ldICAgICAgKz0gZGljbzIxX2lzZltpbmRbMl1dW2ldICogKDEuMGYgLyAoMSA8PCAxNSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgaXNmX3FbaSArIDNdICArPSBkaWNvMjJfaXNmW2luZFszXV1baV0gKiAoMS4wZiAvICgxIDw8IDE1KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICBpc2ZfcVtpICsgNl0gICs9IGRpY28yM19pc2ZbaW5kWzRdXVtpXSAqICgxLjBmIC8gKDEgPDwgMTUpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGlzZl9xW2kgKyA5XSAgKz0gZGljbzI0X2lzZltpbmRbNV1dW2ldICogKDEuMGYgLyAoMSA8PCAxNSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgaXNmX3FbaSArIDEyXSArPSBkaWNvMjVfaXNmW2luZFs2XV1baV0gKiAoMS4wZiAvICgxIDw8IDE1KSk7Cit9CisKKy8qKgorICogQXBwbHkgbWVhbiBhbmQgcGFzdCBJU0YgdmFsdWVzIHVzaW5nIHRoZSBwcmVkaWN0aW9uIGZhY3Rvci4KKyAqIFVwZGF0ZXMgcGFzdCBJU0YgdmVjdG9yLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIGlzZl9xICAgICAgICAgICAgQ3VycmVudCBxdWFudGl6ZWQgSVNGCisgKiBAcGFyYW1baW4sb3V0XSBpc2ZfcGFzdCAgICAgICAgIFBhc3QgcXVhbnRpemVkIElTRgorICoKKyAqLworc3RhdGljIHZvaWQgaXNmX2FkZF9tZWFuX2FuZF9wYXN0KGZsb2F0ICppc2ZfcSwgZmxvYXQgKmlzZl9wYXN0KQoreworICAgIGludCBpOworICAgIGZsb2F0IHRtcDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMUF9PUkRFUjsgaSsrKSB7CisgICAgICAgIHRtcCA9IGlzZl9xW2ldOworICAgICAgICBpc2ZfcVtpXSArPSBpc2ZfbWVhbltpXSAqICgxLjBmIC8gKDEgPDwgMTUpKTsKKyAgICAgICAgaXNmX3FbaV0gKz0gUFJFRF9GQUNUT1IgKiBpc2ZfcGFzdFtpXTsKKyAgICAgICAgaXNmX3Bhc3RbaV0gPSB0bXA7CisgICAgfQorfQorCisvKioKKyAqIEludGVycG9sYXRlIHRoZSBmb3VydGggSVNQIHZlY3RvciBmcm9tIGN1cnJlbnQgYW5kIHBhc3QgZnJhbWVzCisgKiB0byBvYnRhaW4gYW4gSVNQIHZlY3RvciBmb3IgZWFjaCBzdWJmcmFtZS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBpc3BfcSAgICAgICAgICAgIElTUHMgZm9yIGVhY2ggc3ViZnJhbWUKKyAqIEBwYXJhbVtpbl0gICAgIGlzcDRfcGFzdCAgICAgICAgUGFzdCBJU1AgZm9yIHN1YmZyYW1lIDQKKyAqLworc3RhdGljIHZvaWQgaW50ZXJwb2xhdGVfaXNwKGRvdWJsZSBpc3BfcVs0XVtMUF9PUkRFUl0sIGNvbnN0IGRvdWJsZSAqaXNwNF9wYXN0KQoreworICAgIGludCBpLCBrOworCisgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykgeworICAgICAgICBmbG9hdCBjID0gaXNmcF9pbnRlcltrXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IExQX09SREVSOyBpKyspCisgICAgICAgICAgICBpc3BfcVtrXVtpXSA9ICgxLjAgLSBjKSAqIGlzcDRfcGFzdFtpXSArIGMgKiBpc3BfcVszXVtpXTsKKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIGFuIGFkYXB0aXZlIGNvZGVib29rIGluZGV4IGludG8gcGl0Y2ggbGFnIChleGNlcHQgNms2MCwgOGs4NSBtb2RlcykuCisgKiBDYWxjdWxhdGUgaW50ZWdlciBsYWcgYW5kIGZyYWN0aW9uYWwgbGFnIGFsd2F5cyB1c2luZyAxLzQgcmVzb2x1dGlvbi4KKyAqIEluIDFzdCBhbmQgM3JkIHN1YmZyYW1lcyB0aGUgaW5kZXggaXMgcmVsYXRpdmUgdG8gbGFzdCBzdWJmcmFtZSBpbnRlZ2VyIGxhZy4KKyAqCisgKiBAcGFyYW1bb3V0XSAgICBsYWdfaW50ICAgICAgICAgIERlY29kZWQgaW50ZWdlciBwaXRjaCBsYWcKKyAqIEBwYXJhbVtvdXRdICAgIGxhZ19mcmFjICAgICAgICAgRGVjb2RlZCBmcmFjdGlvbmFsIHBpdGNoIGxhZworICogQHBhcmFtW2luXSAgICAgcGl0Y2hfaW5kZXggICAgICBBZGFwdGl2ZSBjb2RlYm9vayBwaXRjaCBpbmRleAorICogQHBhcmFtW2luLG91dF0gYmFzZV9sYWdfaW50ICAgICBCYXNlIGludGVnZXIgbGFnIHVzZWQgaW4gcmVsYXRpdmUgc3ViZnJhbWVzCisgKiBAcGFyYW1baW5dICAgICBzdWJmcmFtZSAgICAgICAgIEN1cnJlbnQgc3ViZnJhbWUgaW5kZXggKDAgdG8gMykKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX3BpdGNoX2xhZ19oaWdoKGludCAqbGFnX2ludCwgaW50ICpsYWdfZnJhYywgaW50IHBpdGNoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJhc2VfbGFnX2ludCwgaW50IHN1YmZyYW1lKQoreworICAgIGlmIChzdWJmcmFtZSA9PSAwIHx8IHN1YmZyYW1lID09IDIpIHsKKyAgICAgICAgaWYgKHBpdGNoX2luZGV4IDwgMzc2KSB7CisgICAgICAgICAgICAqbGFnX2ludCAgPSAocGl0Y2hfaW5kZXggKyAxMzcpID4+IDI7CisgICAgICAgICAgICAqbGFnX2ZyYWMgPSBwaXRjaF9pbmRleCAtICgqbGFnX2ludCA8PCAyKSArIDEzNjsKKyAgICAgICAgfSBlbHNlIGlmIChwaXRjaF9pbmRleCA8IDQ0MCkgeworICAgICAgICAgICAgKmxhZ19pbnQgID0gKHBpdGNoX2luZGV4ICsgMjU3IC0gMzc2KSA+PiAxOworICAgICAgICAgICAgKmxhZ19mcmFjID0gKHBpdGNoX2luZGV4IC0gKCpsYWdfaW50IDw8IDEpICsgMjU2IC0gMzc2KSA8PCAxOworICAgICAgICAgICAgLyogdGhlIGFjdHVhbCByZXNvbHV0aW9uIGlzIDEvMiBidXQgZXhwcmVzc2VkIGFzIDEvNCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmxhZ19pbnQgID0gcGl0Y2hfaW5kZXggLSAyODA7CisgICAgICAgICAgICAqbGFnX2ZyYWMgPSAwOworICAgICAgICB9CisgICAgICAgIC8qIG1pbmltdW0gbGFnIGZvciBuZXh0IHN1YmZyYW1lICovCisgICAgICAgICpiYXNlX2xhZ19pbnQgPSBhdl9jbGlwKCpsYWdfaW50IC0gOCAtICgqbGFnX2ZyYWMgPCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SV0JfUF9ERUxBWV9NSU4sIEFNUldCX1BfREVMQVlfTUFYIC0gMTUpOworICAgICAgICAvLyBYWFg6IHRoZSBzcGVjIHN0YXRlcyBjbGVhcmx5IHRoYXQgKmJhc2VfbGFnX2ludCBzaG91bGQgYmUKKyAgICAgICAgLy8gdGhlIG5lYXJlc3QgaW50ZWdlciB0byAqbGFnX2ludCAobWludXMgOCksIGJ1dCB0aGUgcmVmIGNvZGUKKyAgICAgICAgLy8gYWN0dWFsbHkgYWx3YXlzIHVzZXMgaXRzIGZsb29yLCBJJ20gZm9sbG93aW5nIHRoZSBsYXR0ZXIKKyAgICB9IGVsc2UgeworICAgICAgICAqbGFnX2ludCAgPSAocGl0Y2hfaW5kZXggKyAxKSA+PiAyOworICAgICAgICAqbGFnX2ZyYWMgPSBwaXRjaF9pbmRleCAtICgqbGFnX2ludCA8PCAyKTsKKyAgICAgICAgKmxhZ19pbnQgKz0gKmJhc2VfbGFnX2ludDsKKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIGFuIGFkYXB0aXZlIGNvZGVib29rIGluZGV4IGludG8gcGl0Y2ggbGFnIGZvciA4azg1IGFuZCA2azYwIG1vZGVzLgorICogVGhlIGRlc2NyaXB0aW9uIGlzIGFuYWxvZ291cyB0byBkZWNvZGVfcGl0Y2hfbGFnX2hpZ2gsIGJ1dCBpbiA2azYwIHRoZQorICogcmVsYXRpdmUgaW5kZXggaXMgdXNlZCBmb3IgYWxsIHN1YmZyYW1lcyBleGNlcHQgdGhlIGZpcnN0LgorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfcGl0Y2hfbGFnX2xvdyhpbnQgKmxhZ19pbnQsIGludCAqbGFnX2ZyYWMsIGludCBwaXRjaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJhc2VfbGFnX2ludCwgaW50IHN1YmZyYW1lLCBlbnVtIE1vZGUgbW9kZSkKK3sKKyAgICBpZiAoc3ViZnJhbWUgPT0gMCB8fCAoc3ViZnJhbWUgPT0gMiAmJiBtb2RlICE9IE1PREVfNms2MCkpIHsKKyAgICAgICAgaWYgKHBpdGNoX2luZGV4IDwgMTE2KSB7CisgICAgICAgICAgICAqbGFnX2ludCAgPSAocGl0Y2hfaW5kZXggKyA2OSkgPj4gMTsKKyAgICAgICAgICAgICpsYWdfZnJhYyA9IChwaXRjaF9pbmRleCAtICgqbGFnX2ludCA8PCAxKSArIDY4KSA8PCAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmxhZ19pbnQgID0gcGl0Y2hfaW5kZXggLSAyNDsKKyAgICAgICAgICAgICpsYWdfZnJhYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gWFhYOiBzYW1lIHByb2JsZW0gYXMgYmVmb3JlCisgICAgICAgICpiYXNlX2xhZ19pbnQgPSBhdl9jbGlwKCpsYWdfaW50IC0gOCAtICgqbGFnX2ZyYWMgPCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SV0JfUF9ERUxBWV9NSU4sIEFNUldCX1BfREVMQVlfTUFYIC0gMTUpOworICAgIH0gZWxzZSB7CisgICAgICAgICpsYWdfaW50ICA9IChwaXRjaF9pbmRleCArIDEpID4+IDE7CisgICAgICAgICpsYWdfZnJhYyA9IChwaXRjaF9pbmRleCAtICgqbGFnX2ludCA8PCAxKSkgPDwgMTsKKyAgICAgICAgKmxhZ19pbnQgKz0gKmJhc2VfbGFnX2ludDsKKyAgICB9Cit9CisKKy8qKgorICogRmluZCB0aGUgcGl0Y2ggdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIHBhc3QgZXhjaXRhdGlvbiBhdCB0aGUKKyAqIHBpdGNoIGRlbGF5LCB3aGljaCBpcyBvYnRhaW5lZCBpbiB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIGN0eCAgICAgICAgICAgICAgVGhlIGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIGFtcl9zdWJmcmFtZSAgICAgQ3VycmVudCBzdWJmcmFtZSBkYXRhCisgKiBAcGFyYW1baW5dICAgICBzdWJmcmFtZSAgICAgICAgIEN1cnJlbnQgc3ViZnJhbWUgaW5kZXggKDAgdG8gMykKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX3BpdGNoX3ZlY3RvcihBTVJXQkNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQU1SV0JTdWJGcmFtZSAqYW1yX3N1YmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3ViZnJhbWUpCit7CisgICAgaW50IHBpdGNoX2xhZ19pbnQsIHBpdGNoX2xhZ19mcmFjOworICAgIGludCBpOworICAgIGZsb2F0ICpleGMgICAgID0gY3R4LT5leGNpdGF0aW9uOworICAgIGVudW0gTW9kZSBtb2RlID0gY3R4LT5mcl9jdXJfbW9kZTsKKworICAgIGlmIChtb2RlIDw9IE1PREVfOGs4NSkgeworICAgICAgICBkZWNvZGVfcGl0Y2hfbGFnX2xvdygmcGl0Y2hfbGFnX2ludCwgJnBpdGNoX2xhZ19mcmFjLCBhbXJfc3ViZnJhbWUtPmFkYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5iYXNlX3BpdGNoX2xhZywgc3ViZnJhbWUsIG1vZGUpOworICAgIH0gZWxzZQorICAgICAgICBkZWNvZGVfcGl0Y2hfbGFnX2hpZ2goJnBpdGNoX2xhZ19pbnQsICZwaXRjaF9sYWdfZnJhYywgYW1yX3N1YmZyYW1lLT5hZGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+YmFzZV9waXRjaF9sYWcsIHN1YmZyYW1lKTsKKworICAgIGN0eC0+cGl0Y2hfbGFnX2ludCA9IHBpdGNoX2xhZ19pbnQ7CisgICAgcGl0Y2hfbGFnX2ludCArPSBwaXRjaF9sYWdfZnJhYyA+IDA7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHBpdGNoIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBwYXN0IGV4Y2l0YXRpb24gYXQgdGhlCisgICAgICAgcGl0Y2ggbGFnIHVzaW5nIGEgaGFtbWluZyB3aW5kb3dlZCBzaW5jIGZ1bmN0aW9uICovCisgICAgY3R4LT5hY2VscGZfY3R4LmFjZWxwX2ludGVycG9sYXRlZihleGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YyArIDEgLSBwaXRjaF9sYWdfaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhY19pbnRlciwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hfbGFnX2ZyYWMgKyAocGl0Y2hfbGFnX2ZyYWMgPiAwID8gMCA6IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMUF9PUkRFUiwgQU1SV0JfU0ZSX1NJWkUgKyAxKTsKKworICAgIC8qIENoZWNrIHdoaWNoIHBpdGNoIHNpZ25hbCBwYXRoIHNob3VsZCBiZSB1c2VkCisgICAgICogNms2MCBhbmQgOGs4NSBtb2RlcyBoYXZlIHRoZSBsdHAgZmxhZyBzZXQgdG8gMCAqLworICAgIGlmIChhbXJfc3ViZnJhbWUtPmx0cCkgeworICAgICAgICBtZW1jcHkoY3R4LT5waXRjaF92ZWN0b3IsIGV4YywgQU1SV0JfU0ZSX1NJWkUgKiBzaXplb2YoZmxvYXQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQU1SV0JfU0ZSX1NJWkU7IGkrKykKKyAgICAgICAgICAgIGN0eC0+cGl0Y2hfdmVjdG9yW2ldID0gMC4xOCAqIGV4Y1tpIC0gMV0gKyAwLjY0ICogZXhjW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xOCAqIGV4Y1tpICsgMV07CisgICAgICAgIG1lbWNweShleGMsIGN0eC0+cGl0Y2hfdmVjdG9yLCBBTVJXQl9TRlJfU0laRSAqIHNpemVvZihmbG9hdCkpOworICAgIH0KK30KKworLyoqIEdldCB4IGJpdHMgaW4gdGhlIGluZGV4IGludGVydmFsIFtsc2IsbHNiK2xlbi0xXSBpbmNsdXNpdmUgKi8KKyNkZWZpbmUgQklUX1NUUih4LGxzYixsZW4pICgoKHgpID4+IChsc2IpKSAmICgoMSA8PCAobGVuKSkgLSAxKSkKKworLyoqIEdldCB0aGUgYml0IGF0IHNwZWNpZmllZCBwb3NpdGlvbiAqLworI2RlZmluZSBCSVRfUE9TKHgsIHApICgoKHgpID4+IChwKSkgJiAxKQorCisvKioKKyAqIFRoZSBuZXh0IHNpeCBmdW5jdGlvbnMgZGVjb2RlX1tpXXBfdHJhY2sgZGVjb2RlIGV4YWN0bHkgaSBwdWxzZXMKKyAqIHBvc2l0aW9ucyBhbmQgYW1wbGl0dWRlcyAoLTEgb3IgMSkgaW4gYSBzdWJmcmFtZSB0cmFjayB1c2luZworICogYW4gZW5jb2RlZCBwdWxzZSBpbmRleGluZyAoVFMgMjYuMTkwIHNlY3Rpb24gNS44LjIpLgorICoKKyAqIFRoZSByZXN1bHRzIGFyZSBnaXZlbiBpbiBvdXRbXSwgaW4gd2hpY2ggYSBuZWdhdGl2ZSBudW1iZXIgbWVhbnMKKyAqIGFtcGxpdHVkZSAtMSBhbmQgdmljZSB2ZXJzYSAoaS5lLiwgYW1wbCh4KSA9IHggLyBhYnMoeCkgKS4KKyAqCisgKiBAcGFyYW1bb3V0XSBvdXQgICAgICAgICAgICAgICAgIE91dHB1dCBidWZmZXIgKHdyaXRlcyBpIGVsZW1lbnRzKQorICogQHBhcmFtW2luXSAgY29kZSAgICAgICAgICAgICAgICBQdWxzZSBpbmRleCAobm8uIG9mIGJpdHMgdmFyaWVzLCBzZWUgYmVsb3cpCisgKiBAcGFyYW1baW5dICBtICAgICAgICAgICAgICAgICAgIChsb2cyKSBOdW1iZXIgb2YgcG90ZW50aWFsIHBvc2l0aW9ucworICogQHBhcmFtW2luXSAgb2ZmICAgICAgICAgICAgICAgICBPZmZzZXQgZm9yIGRlY29kZWQgcG9zaXRpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNvZGVfMXBfdHJhY2soaW50ICpvdXQsIGludCBjb2RlLCBpbnQgbSwgaW50IG9mZikKK3sKKyAgICBpbnQgcG9zID0gQklUX1NUUihjb2RlLCAwLCBtKSArIG9mZjsgLy8vY29kZTogbSsxIGJpdHMKKworICAgIG91dFswXSA9IEJJVF9QT1MoY29kZSwgbSkgPyAtcG9zIDogcG9zOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb2RlXzJwX3RyYWNrKGludCAqb3V0LCBpbnQgY29kZSwgaW50IG0sIGludCBvZmYpIC8vL2NvZGU6IDJtKzEgYml0cworeworICAgIGludCBwb3MwID0gQklUX1NUUihjb2RlLCBtLCBtKSArIG9mZjsKKyAgICBpbnQgcG9zMSA9IEJJVF9TVFIoY29kZSwgMCwgbSkgKyBvZmY7CisKKyAgICBvdXRbMF0gPSBCSVRfUE9TKGNvZGUsIDIqbSkgPyAtcG9zMCA6IHBvczA7CisgICAgb3V0WzFdID0gQklUX1BPUyhjb2RlLCAyKm0pID8gLXBvczEgOiBwb3MxOworICAgIG91dFsxXSA9IHBvczAgPiBwb3MxID8gLW91dFsxXSA6IG91dFsxXTsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlXzNwX3RyYWNrKGludCAqb3V0LCBpbnQgY29kZSwgaW50IG0sIGludCBvZmYpIC8vL2NvZGU6IDNtKzEgYml0cworeworICAgIGludCBoYWxmXzJwID0gQklUX1BPUyhjb2RlLCAyKm0gLSAxKSA8PCAobSAtIDEpOworCisgICAgZGVjb2RlXzJwX3RyYWNrKG91dCwgQklUX1NUUihjb2RlLCAwLCAyKm0gLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgbSAtIDEsIG9mZiArIGhhbGZfMnApOworICAgIGRlY29kZV8xcF90cmFjayhvdXQgKyAyLCBCSVRfU1RSKGNvZGUsIDIqbSwgbSArIDEpLCBtLCBvZmYpOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfNHBfdHJhY2soaW50ICpvdXQsIGludCBjb2RlLCBpbnQgbSwgaW50IG9mZikgLy8vY29kZTogNG0gYml0cworeworICAgIGludCBoYWxmXzRwLCBzdWJoYWxmXzJwOworICAgIGludCBiX29mZnNldCA9IDEgPDwgKG0gLSAxKTsKKworICAgIHN3aXRjaCAoQklUX1NUUihjb2RlLCA0Km0gLSAyLCAyKSkgeyAvKiBjYXNlIElEICgyIGJpdHMpICovCisgICAgY2FzZSAwOiAvKiAwIHB1bHNlcyBpbiBBLCA0IHB1bHNlcyBpbiBCIG9yIHZpY2UgdmVyc2EgKi8KKyAgICAgICAgaGFsZl80cCA9IEJJVF9QT1MoY29kZSwgNCptIC0gMykgPDwgKG0gLSAxKTsgLy8gd2hpY2ggaGFzIDQgcHVsc2VzCisgICAgICAgIHN1YmhhbGZfMnAgPSBCSVRfUE9TKGNvZGUsIDIqbSAtIDMpIDw8IChtIC0gMik7CisKKyAgICAgICAgZGVjb2RlXzJwX3RyYWNrKG91dCwgQklUX1NUUihjb2RlLCAwLCAyKm0gLSAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gLSAyLCBvZmYgKyBoYWxmXzRwICsgc3ViaGFsZl8ycCk7CisgICAgICAgIGRlY29kZV8ycF90cmFjayhvdXQgKyAyLCBCSVRfU1RSKGNvZGUsIDIqbSAtIDIsIDIqbSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgbSAtIDEsIG9mZiArIGhhbGZfNHApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIDEgcHVsc2UgaW4gQSwgMyBwdWxzZXMgaW4gQiAqLworICAgICAgICBkZWNvZGVfMXBfdHJhY2sob3V0LCBCSVRfU1RSKGNvZGUsICAzKm0gLSAyLCBtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gLSAxLCBvZmYpOworICAgICAgICBkZWNvZGVfM3BfdHJhY2sob3V0ICsgMSwgQklUX1NUUihjb2RlLCAwLCAzKm0gLSAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gLSAxLCBvZmYgKyBiX29mZnNldCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjogLyogMiBwdWxzZXMgaW4gZWFjaCBoYWxmICovCisgICAgICAgIGRlY29kZV8ycF90cmFjayhvdXQsIEJJVF9TVFIoY29kZSwgMiptIC0gMSwgMiptIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICBtIC0gMSwgb2ZmKTsKKyAgICAgICAgZGVjb2RlXzJwX3RyYWNrKG91dCArIDIsIEJJVF9TVFIoY29kZSwgMCwgMiptIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICBtIC0gMSwgb2ZmICsgYl9vZmZzZXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6IC8qIDMgcHVsc2VzIGluIEEsIDEgcHVsc2UgaW4gQiAqLworICAgICAgICBkZWNvZGVfM3BfdHJhY2sob3V0LCBCSVRfU1RSKGNvZGUsIG0sIDMqbSAtIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbSAtIDEsIG9mZik7CisgICAgICAgIGRlY29kZV8xcF90cmFjayhvdXQgKyAzLCBCSVRfU1RSKGNvZGUsIDAsIG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgbSAtIDEsIG9mZiArIGJfb2Zmc2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfNXBfdHJhY2soaW50ICpvdXQsIGludCBjb2RlLCBpbnQgbSwgaW50IG9mZikgLy8vY29kZTogNW0gYml0cworeworICAgIGludCBoYWxmXzNwID0gQklUX1BPUyhjb2RlLCA1Km0gLSAxKSA8PCAobSAtIDEpOworCisgICAgZGVjb2RlXzNwX3RyYWNrKG91dCwgQklUX1NUUihjb2RlLCAyKm0gKyAxLCAzKm0gLSAyKSwKKyAgICAgICAgICAgICAgICAgICAgbSAtIDEsIG9mZiArIGhhbGZfM3ApOworCisgICAgZGVjb2RlXzJwX3RyYWNrKG91dCArIDMsIEJJVF9TVFIoY29kZSwgMCwgMiptICsgMSksIG0sIG9mZik7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV82cF90cmFjayhpbnQgKm91dCwgaW50IGNvZGUsIGludCBtLCBpbnQgb2ZmKSAvLy9jb2RlOiA2bS0yIGJpdHMKK3sKKyAgICBpbnQgYl9vZmZzZXQgPSAxIDw8IChtIC0gMSk7CisgICAgLyogd2hpY2ggaGFsZiBoYXMgbW9yZSBwdWxzZXMgaW4gY2FzZXMgMCB0byAyICovCisgICAgaW50IGhhbGZfbW9yZSAgPSBCSVRfUE9TKGNvZGUsIDYqbSAtIDUpIDw8IChtIC0gMSk7CisgICAgaW50IGhhbGZfb3RoZXIgPSBiX29mZnNldCAtIGhhbGZfbW9yZTsKKworICAgIHN3aXRjaCAoQklUX1NUUihjb2RlLCA2Km0gLSA0LCAyKSkgeyAvKiBjYXNlIElEICgyIGJpdHMpICovCisgICAgY2FzZSAwOiAvKiAwIHB1bHNlcyBpbiBBLCA2IHB1bHNlcyBpbiBCIG9yIHZpY2UgdmVyc2EgKi8KKyAgICAgICAgZGVjb2RlXzFwX3RyYWNrKG91dCwgQklUX1NUUihjb2RlLCAwLCBtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gLSAxLCBvZmYgKyBoYWxmX21vcmUpOworICAgICAgICBkZWNvZGVfNXBfdHJhY2sob3V0ICsgMSwgQklUX1NUUihjb2RlLCBtLCA1Km0gLSA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gLSAxLCBvZmYgKyBoYWxmX21vcmUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIDEgcHVsc2UgaW4gQSwgNSBwdWxzZXMgaW4gQiBvciB2aWNlIHZlcnNhICovCisgICAgICAgIGRlY29kZV8xcF90cmFjayhvdXQsIEJJVF9TVFIoY29kZSwgMCwgbSksCisgICAgICAgICAgICAgICAgICAgICAgICBtIC0gMSwgb2ZmICsgaGFsZl9vdGhlcik7CisgICAgICAgIGRlY29kZV81cF90cmFjayhvdXQgKyAxLCBCSVRfU1RSKGNvZGUsIG0sIDUqbSAtIDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbSAtIDEsIG9mZiArIGhhbGZfbW9yZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjogLyogMiBwdWxzZXMgaW4gQSwgNCBwdWxzZXMgaW4gQiBvciB2aWNlIHZlcnNhICovCisgICAgICAgIGRlY29kZV8ycF90cmFjayhvdXQsIEJJVF9TVFIoY29kZSwgMCwgMiptIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICBtIC0gMSwgb2ZmICsgaGFsZl9vdGhlcik7CisgICAgICAgIGRlY29kZV80cF90cmFjayhvdXQgKyAyLCBCSVRfU1RSKGNvZGUsIDIqbSAtIDEsIDQqbSAtIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbSAtIDEsIG9mZiArIGhhbGZfbW9yZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLyogMyBwdWxzZXMgaW4gQSwgMyBwdWxzZXMgaW4gQiAqLworICAgICAgICBkZWNvZGVfM3BfdHJhY2sob3V0LCBCSVRfU1RSKGNvZGUsIDMqbSAtIDIsIDMqbSAtIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbSAtIDEsIG9mZik7CisgICAgICAgIGRlY29kZV8zcF90cmFjayhvdXQgKyAzLCBCSVRfU1RSKGNvZGUsIDAsIDMqbSAtIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbSAtIDEsIG9mZiArIGJfb2Zmc2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioKKyAqIERlY29kZSB0aGUgYWxnZWJyYWljIGNvZGVib29rIGluZGV4IHRvIHB1bHNlIHBvc2l0aW9ucyBhbmQgc2lnbnMsCisgKiB0aGVuIGNvbnN0cnVjdCB0aGUgYWxnZWJyYWljIGNvZGVib29rIHZlY3Rvci4KKyAqCisgKiBAcGFyYW1bb3V0XSBmaXhlZF92ZWN0b3IgICAgICAgIEJ1ZmZlciBmb3IgdGhlIGZpeGVkIGNvZGVib29rIGV4Y2l0YXRpb24KKyAqIEBwYXJhbVtpbl0gIHB1bHNlX2hpICAgICAgICAgICAgTVNCcyBwYXJ0IG9mIHRoZSBwdWxzZSBpbmRleCBhcnJheSAoaGlnaGVyIG1vZGVzIG9ubHkpCisgKiBAcGFyYW1baW5dICBwdWxzZV9sbyAgICAgICAgICAgIExTQnMgcGFydCBvZiB0aGUgcHVsc2UgaW5kZXggYXJyYXkKKyAqIEBwYXJhbVtpbl0gIG1vZGUgICAgICAgICAgICAgICAgTW9kZSBvZiB0aGUgY3VycmVudCBmcmFtZQorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfZml4ZWRfdmVjdG9yKGZsb2F0ICpmaXhlZF92ZWN0b3IsIGNvbnN0IHVpbnQxNl90ICpwdWxzZV9oaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnB1bHNlX2xvLCBjb25zdCBlbnVtIE1vZGUgbW9kZSkKK3sKKyAgICAvKiBzaWdfcG9zIHN0b3JlcyBmb3IgZWFjaCB0cmFjayB0aGUgZGVjb2RlZCBwdWxzZSBwb3NpdGlvbiBpbmRleGVzCisgICAgICogKDEtYmFzZWQpIG11bHRpcGxpZWQgYnkgaXRzIGNvcnJlc3BvbmRpbmcgYW1wbGl0dWRlICgrMSBvciAtMSkgKi8KKyAgICBpbnQgc2lnX3Bvc1s0XVs2XTsKKyAgICBpbnQgc3BhY2luZyA9IChtb2RlID09IE1PREVfNms2MCkgPyAyIDogNDsKKyAgICBpbnQgaSwgajsKKworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgTU9ERV82azYwOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgZGVjb2RlXzFwX3RyYWNrKHNpZ19wb3NbaV0sIHB1bHNlX2xvW2ldLCA1LCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzhrODU6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBkZWNvZGVfMXBfdHJhY2soc2lnX3Bvc1tpXSwgcHVsc2VfbG9baV0sIDQsIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfMTJrNjU6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBkZWNvZGVfMnBfdHJhY2soc2lnX3Bvc1tpXSwgcHVsc2VfbG9baV0sIDQsIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfMTRrMjU6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICBkZWNvZGVfM3BfdHJhY2soc2lnX3Bvc1tpXSwgcHVsc2VfbG9baV0sIDQsIDEpOworICAgICAgICBmb3IgKGkgPSAyOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgZGVjb2RlXzJwX3RyYWNrKHNpZ19wb3NbaV0sIHB1bHNlX2xvW2ldLCA0LCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzE1azg1OgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgZGVjb2RlXzNwX3RyYWNrKHNpZ19wb3NbaV0sIHB1bHNlX2xvW2ldLCA0LCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzE4azI1OgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgZGVjb2RlXzRwX3RyYWNrKHNpZ19wb3NbaV0sIChpbnQpIHB1bHNlX2xvW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KSBwdWxzZV9oaVtpXSA8PCAxNCksIDQsIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfMTlrODU6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICBkZWNvZGVfNXBfdHJhY2soc2lnX3Bvc1tpXSwgKGludCkgcHVsc2VfbG9baV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpIHB1bHNlX2hpW2ldIDw8IDEwKSwgNCwgMSk7CisgICAgICAgIGZvciAoaSA9IDI7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBkZWNvZGVfNHBfdHJhY2soc2lnX3Bvc1tpXSwgKGludCkgcHVsc2VfbG9baV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpIHB1bHNlX2hpW2ldIDw8IDE0KSwgNCwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV8yM2swNToKKyAgICBjYXNlIE1PREVfMjNrODU6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBkZWNvZGVfNnBfdHJhY2soc2lnX3Bvc1tpXSwgKGludCkgcHVsc2VfbG9baV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpIHB1bHNlX2hpW2ldIDw8IDExKSwgNCwgMSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG1lbXNldChmaXhlZF92ZWN0b3IsIDAsIHNpemVvZihmbG9hdCkgKiBBTVJXQl9TRlJfU0laRSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgcHVsc2VzX25iX3Blcl9tb2RlX3RyW21vZGVdW2ldOyBqKyspIHsKKyAgICAgICAgICAgIGludCBwb3MgPSAoRkZBQlMoc2lnX3Bvc1tpXVtqXSkgLSAxKSAqIHNwYWNpbmcgKyBpOworCisgICAgICAgICAgICBmaXhlZF92ZWN0b3JbcG9zXSArPSBzaWdfcG9zW2ldW2pdIDwgMCA/IC0xLjAgOiAxLjA7CisgICAgICAgIH0KK30KKworLyoqCisgKiBEZWNvZGUgcGl0Y2ggZ2FpbiBhbmQgZml4ZWQgZ2FpbiBjb3JyZWN0aW9uIGZhY3Rvci4KKyAqCisgKiBAcGFyYW1baW5dICB2cV9nYWluICAgICAgICAgICAgIFZlY3Rvci1xdWFudGl6ZWQgaW5kZXggZm9yIGdhaW5zCisgKiBAcGFyYW1baW5dICBtb2RlICAgICAgICAgICAgICAgIE1vZGUgb2YgdGhlIGN1cnJlbnQgZnJhbWUKKyAqIEBwYXJhbVtvdXRdIGZpeGVkX2dhaW5fZmFjdG9yICAgRGVjb2RlZCBmaXhlZCBnYWluIGNvcnJlY3Rpb24gZmFjdG9yCisgKiBAcGFyYW1bb3V0XSBwaXRjaF9nYWluICAgICAgICAgIERlY29kZWQgcGl0Y2ggZ2FpbgorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfZ2FpbnMoY29uc3QgdWludDhfdCB2cV9nYWluLCBjb25zdCBlbnVtIE1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZml4ZWRfZ2Fpbl9mYWN0b3IsIGZsb2F0ICpwaXRjaF9nYWluKQoreworICAgIGNvbnN0IGludDE2X3QgKmdhaW5zID0gKG1vZGUgPD0gTU9ERV84azg1ID8gcXVhX2dhaW5fNmJbdnFfZ2Fpbl0gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhX2dhaW5fN2JbdnFfZ2Fpbl0pOworCisgICAgKnBpdGNoX2dhaW4gICAgICAgID0gZ2FpbnNbMF0gKiAoMS4wZiAvICgxIDw8IDE0KSk7CisgICAgKmZpeGVkX2dhaW5fZmFjdG9yID0gZ2FpbnNbMV0gKiAoMS4wZiAvICgxIDw8IDExKSk7Cit9CisKKy8qKgorICogQXBwbHkgcGl0Y2ggc2hhcnBlbmluZyBmaWx0ZXJzIHRvIHRoZSBmaXhlZCBjb2RlYm9vayB2ZWN0b3IuCisgKgorICogQHBhcmFtW2luXSAgICAgY3R4ICAgICAgICAgICAgICBUaGUgY29udGV4dAorICogQHBhcmFtW2luLG91dF0gZml4ZWRfdmVjdG9yICAgICBGaXhlZCBjb2RlYm9vayBleGNpdGF0aW9uCisgKi8KKy8vIFhYWDogU3BlYyBzdGF0ZXMgdGhpcyBwcm9jZWR1cmUgc2hvdWxkIGJlIGFwcGxpZWQgd2hlbiB0aGUgcGl0Y2gKKy8vIGxhZyBpcyBsZXNzIHRoYW4gNjQsIGJ1dCB0aGlzIGNoZWNraW5nIHNlZW1zIGFic2VudCBpbiByZWZlcmVuY2UgYW5kIEFNUi1OQgorc3RhdGljIHZvaWQgcGl0Y2hfc2hhcnBlbmluZyhBTVJXQkNvbnRleHQgKmN0eCwgZmxvYXQgKmZpeGVkX3ZlY3RvcikKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIFRpbHQgcGFydCAqLworICAgIGZvciAoaSA9IEFNUldCX1NGUl9TSVpFIC0gMTsgaSAhPSAwOyBpLS0pCisgICAgICAgIGZpeGVkX3ZlY3RvcltpXSAtPSBmaXhlZF92ZWN0b3JbaSAtIDFdICogY3R4LT50aWx0X2NvZWY7CisKKyAgICAvKiBQZXJpb2RpY2l0eSBlbmhhbmNlbWVudCBwYXJ0ICovCisgICAgZm9yIChpID0gY3R4LT5waXRjaF9sYWdfaW50OyBpIDwgQU1SV0JfU0ZSX1NJWkU7IGkrKykKKyAgICAgICAgZml4ZWRfdmVjdG9yW2ldICs9IGZpeGVkX3ZlY3RvcltpIC0gY3R4LT5waXRjaF9sYWdfaW50XSAqIDAuODU7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSB2b2ljaW5nIGZhY3RvciAoLTEuMCA9IHVudm9pY2VkIHRvIDEuMCA9IHZvaWNlZCkuCisgKgorICogQHBhcmFtW2luXSBwX3ZlY3RvciwgZl92ZWN0b3IgICBQaXRjaCBhbmQgZml4ZWQgZXhjaXRhdGlvbiB2ZWN0b3JzCisgKiBAcGFyYW1baW5dIHBfZ2FpbiwgZl9nYWluICAgICAgIFBpdGNoIGFuZCBmaXhlZCBnYWlucworICogQHBhcmFtW2luXSBjdHggICAgICAgICAgICAgICAgICBUaGUgY29udGV4dAorICovCisvLyBYWFg6IFRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBwcmVjaXNpb24gaGVyZSEgVGhlIG1hZ25pdHVkZXMKKy8vIG9mIHRoZSBlbmVyZ2llcyBhcmUgbm90IGNvcnJlY3QuIFBsZWFzZSBjaGVjayB0aGUgcmVmZXJlbmNlIGNvZGUgY2FyZWZ1bGx5CitzdGF0aWMgZmxvYXQgdm9pY2VfZmFjdG9yKGZsb2F0ICpwX3ZlY3RvciwgZmxvYXQgcF9nYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZl92ZWN0b3IsIGZsb2F0IGZfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMUE1Db250ZXh0ICpjdHgpCit7CisgICAgZG91YmxlIHBfZW5lciA9IChkb3VibGUpIGN0eC0+ZG90X3Byb2R1Y3RmKHBfdmVjdG9yLCBwX3ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJXQl9TRlJfU0laRSkgKgorICAgICAgICAgICAgICAgICAgICBwX2dhaW4gKiBwX2dhaW47CisgICAgZG91YmxlIGZfZW5lciA9IChkb3VibGUpIGN0eC0+ZG90X3Byb2R1Y3RmKGZfdmVjdG9yLCBmX3ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJXQl9TRlJfU0laRSkgKgorICAgICAgICAgICAgICAgICAgICBmX2dhaW4gKiBmX2dhaW47CisKKyAgICByZXR1cm4gKHBfZW5lciAtIGZfZW5lcikgLyAocF9lbmVyICsgZl9lbmVyKTsKK30KKworLyoqCisgKiBSZWR1Y2UgZml4ZWQgdmVjdG9yIHNwYXJzZW5lc3MgYnkgc21vb3RoaW5nIHdpdGggb25lIG9mIHRocmVlIElSIGZpbHRlcnMsCisgKiBhbHNvIGtub3duIGFzICJhZGFwdGl2ZSBwaGFzZSBkaXNwZXJzaW9uIi4KKyAqCisgKiBAcGFyYW1baW5dICAgICBjdHggICAgICAgICAgICAgIFRoZSBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBmaXhlZF92ZWN0b3IgICAgIFVuZmlsdGVyZWQgZml4ZWQgdmVjdG9yCisgKiBAcGFyYW1bb3V0XSAgICBidWYgICAgICAgICAgICAgIFNwYWNlIGZvciBtb2RpZmllZCB2ZWN0b3IgaWYgbmVjZXNzYXJ5CisgKgorICogQHJldHVybiBUaGUgcG90ZW50aWFsbHkgb3ZlcndyaXR0ZW4gZmlsdGVyZWQgZml4ZWQgdmVjdG9yIGFkZHJlc3MKKyAqLworc3RhdGljIGZsb2F0ICphbnRpX3NwYXJzZW5lc3MoQU1SV0JDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZml4ZWRfdmVjdG9yLCBmbG9hdCAqYnVmKQoreworICAgIGludCBpcl9maWx0ZXJfbnI7CisKKyAgICBpZiAoY3R4LT5mcl9jdXJfbW9kZSA+IE1PREVfOGs4NSkgLy8gbm8gZmlsdGVyaW5nIGluIGhpZ2hlciBtb2RlcworICAgICAgICByZXR1cm4gZml4ZWRfdmVjdG9yOworCisgICAgaWYgKGN0eC0+cGl0Y2hfZ2FpblswXSA8IDAuNikgeworICAgICAgICBpcl9maWx0ZXJfbnIgPSAwOyAgICAgIC8vIHN0cm9uZyBmaWx0ZXJpbmcKKyAgICB9IGVsc2UgaWYgKGN0eC0+cGl0Y2hfZ2FpblswXSA8IDAuOSkgeworICAgICAgICBpcl9maWx0ZXJfbnIgPSAxOyAgICAgIC8vIG1lZGl1bSBmaWx0ZXJpbmcKKyAgICB9IGVsc2UKKyAgICAgICAgaXJfZmlsdGVyX25yID0gMjsgICAgICAvLyBubyBmaWx0ZXJpbmcKKworICAgIC8qIGRldGVjdCAnb25zZXQnICovCisgICAgaWYgKGN0eC0+Zml4ZWRfZ2FpblswXSA+IDMuMCAqIGN0eC0+Zml4ZWRfZ2FpblsxXSkgeworICAgICAgICBpZiAoaXJfZmlsdGVyX25yIDwgMikKKyAgICAgICAgICAgIGlyX2ZpbHRlcl9ucisrOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpLCBjb3VudCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIGlmIChjdHgtPnBpdGNoX2dhaW5baV0gPCAwLjYpCisgICAgICAgICAgICAgICAgY291bnQrKzsKKworICAgICAgICBpZiAoY291bnQgPiAyKQorICAgICAgICAgICAgaXJfZmlsdGVyX25yID0gMDsKKworICAgICAgICBpZiAoaXJfZmlsdGVyX25yID4gY3R4LT5wcmV2X2lyX2ZpbHRlcl9uciArIDEpCisgICAgICAgICAgICBpcl9maWx0ZXJfbnItLTsKKyAgICB9CisKKyAgICAvKiB1cGRhdGUgaXIgZmlsdGVyIHN0cmVuZ3RoIGhpc3RvcnkgKi8KKyAgICBjdHgtPnByZXZfaXJfZmlsdGVyX25yID0gaXJfZmlsdGVyX25yOworCisgICAgaXJfZmlsdGVyX25yICs9IChjdHgtPmZyX2N1cl9tb2RlID09IE1PREVfOGs4NSk7CisKKyAgICBpZiAoaXJfZmlsdGVyX25yIDwgMikgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY29uc3QgZmxvYXQgKmNvZWYgPSBpcl9maWx0ZXJzX2xvb2t1cFtpcl9maWx0ZXJfbnJdOworCisgICAgICAgIC8qIENpcmN1bGFyIGNvbnZvbHV0aW9uIGNvZGUgaW4gdGhlIHJlZmVyZW5jZQorICAgICAgICAgKiBkZWNvZGVyIHdhcyBtb2RpZmllZCB0byBhdm9pZCB1c2luZyBvbmUKKyAgICAgICAgICogZXh0cmEgYXJyYXkuIFRoZSBmaWx0ZXJlZCB2ZWN0b3IgaXMgZ2l2ZW4gYnk6CisgICAgICAgICAqCisgICAgICAgICAqIGMyKG4pID0gc3VtKGksMCxsZW4tMSl7IGMoaSkgKiBjb2VmKCAobiAtIGkgKyBsZW4pICUgbGVuICkgfQorICAgICAgICAgKi8KKworICAgICAgICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoZmxvYXQpICogQU1SV0JfU0ZSX1NJWkUpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQU1SV0JfU0ZSX1NJWkU7IGkrKykKKyAgICAgICAgICAgIGlmIChmaXhlZF92ZWN0b3JbaV0pCisgICAgICAgICAgICAgICAgZmZfY2VscF9jaXJjX2FkZGYoYnVmLCBidWYsIGNvZWYsIGksIGZpeGVkX3ZlY3RvcltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJXQl9TRlJfU0laRSk7CisgICAgICAgIGZpeGVkX3ZlY3RvciA9IGJ1ZjsKKyAgICB9CisKKyAgICByZXR1cm4gZml4ZWRfdmVjdG9yOworfQorCisvKioKKyAqIENhbGN1bGF0ZSBhIHN0YWJpbGl0eSBmYWN0b3Ige3RldGF9IGJhc2VkIG9uIGRpc3RhbmNlIGJldHdlZW4KKyAqIGN1cnJlbnQgYW5kIHBhc3QgaXNmLiBBIHZhbHVlIG9mIDEgc2hvd3MgbWF4aW11bSBzaWduYWwgc3RhYmlsaXR5LgorICovCitzdGF0aWMgZmxvYXQgc3RhYmlsaXR5X2ZhY3Rvcihjb25zdCBmbG9hdCAqaXNmLCBjb25zdCBmbG9hdCAqaXNmX3Bhc3QpCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgYWNjID0gMC4wOworCisgICAgZm9yIChpID0gMDsgaSA8IExQX09SREVSIC0gMTsgaSsrKQorICAgICAgICBhY2MgKz0gKGlzZltpXSAtIGlzZl9wYXN0W2ldKSAqIChpc2ZbaV0gLSBpc2ZfcGFzdFtpXSk7CisKKyAgICAvLyBYWFg6IFRoaXMgcGFydCBpcyBub3Qgc28gY2xlYXIgZnJvbSB0aGUgcmVmZXJlbmNlIGNvZGUKKyAgICAvLyB0aGUgcmVzdWx0IGlzIG1vcmUgYWNjdXJhdGUgY2hhbmdpbmcgdGhlICIvIDI1NiIgdG8gIiogNTEyIgorICAgIHJldHVybiBGRk1BWCgwLjAsIDEuMjUgLSBhY2MgKiAwLjggKiA1MTIpOworfQorCisvKioKKyAqIEFwcGx5IGEgbm9uLWxpbmVhciBmaXhlZCBnYWluIHNtb290aGluZyBpbiBvcmRlciB0byByZWR1Y2UKKyAqIGZsdWN0dWF0aW9uIGluIHRoZSBlbmVyZ3kgb2YgZXhjaXRhdGlvbi4KKyAqCisgKiBAcGFyYW1baW5dICAgICBmaXhlZF9nYWluICAgICAgIFVuc21vb3RoZWQgZml4ZWQgZ2FpbgorICogQHBhcmFtW2luLG91dF0gcHJldl90cl9nYWluICAgICBQcmV2aW91cyB0aHJlc2hvbGQgZ2FpbiAodXBkYXRlZCkKKyAqIEBwYXJhbVtpbl0gICAgIHZvaWNlX2ZhYyAgICAgICAgRnJhbWUgdm9pY2luZyBmYWN0b3IKKyAqIEBwYXJhbVtpbl0gICAgIHN0YWJfZmFjICAgICAgICAgRnJhbWUgc3RhYmlsaXR5IGZhY3RvcgorICoKKyAqIEByZXR1cm4gVGhlIHNtb290aGVkIGdhaW4KKyAqLworc3RhdGljIGZsb2F0IG5vaXNlX2VuaGFuY2VyKGZsb2F0IGZpeGVkX2dhaW4sIGZsb2F0ICpwcmV2X3RyX2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9pY2VfZmFjLCAgZmxvYXQgc3RhYl9mYWMpCit7CisgICAgZmxvYXQgc21fZmFjID0gMC41ICogKDEgLSB2b2ljZV9mYWMpICogc3RhYl9mYWM7CisgICAgZmxvYXQgZzA7CisKKyAgICAvLyBYWFg6IHRoZSBmb2xsb3dpbmcgZml4ZWQtcG9pbnQgY29uc3RhbnRzIHVzZWQgdG8gaW4oZGUpY3JlbWVudAorICAgIC8vIGdhaW4gYnkgMS41ZEIgd2VyZSB0YWtlbiBmcm9tIHRoZSByZWZlcmVuY2UgY29kZSwgbWF5YmUgaXQgY291bGQKKyAgICAvLyBiZSBzaW1wbGVyCisgICAgaWYgKGZpeGVkX2dhaW4gPCAqcHJldl90cl9nYWluKSB7CisgICAgICAgIGcwID0gRkZNSU4oKnByZXZfdHJfZ2FpbiwgZml4ZWRfZ2FpbiArIGZpeGVkX2dhaW4gKgorICAgICAgICAgICAgICAgICAgICAgKDYyMjYgKiAoMS4wZiAvICgxIDw8IDE1KSkpKTsgLy8gKzEuNSBkQgorICAgIH0gZWxzZQorICAgICAgICBnMCA9IEZGTUFYKCpwcmV2X3RyX2dhaW4sIGZpeGVkX2dhaW4gKgorICAgICAgICAgICAgICAgICAgICAoMjc1MzYgKiAoMS4wZiAvICgxIDw8IDE1KSkpKTsgLy8gLTEuNSBkQgorCisgICAgKnByZXZfdHJfZ2FpbiA9IGcwOyAvLyB1cGRhdGUgbmV4dCBmcmFtZSB0aHJlc2hvbGQKKworICAgIHJldHVybiBzbV9mYWMgKiBnMCArICgxIC0gc21fZmFjKSAqIGZpeGVkX2dhaW47Cit9CisKKy8qKgorICogRmlsdGVyIHRoZSBmaXhlZF92ZWN0b3IgdG8gZW1waGFzaXplIHRoZSBoaWdoZXIgZnJlcXVlbmNpZXMuCisgKgorICogQHBhcmFtW2luLG91dF0gZml4ZWRfdmVjdG9yICAgICBGaXhlZCBjb2RlYm9vayB2ZWN0b3IKKyAqIEBwYXJhbVtpbl0gICAgIHZvaWNlX2ZhYyAgICAgICAgRnJhbWUgdm9pY2luZyBmYWN0b3IKKyAqLworc3RhdGljIHZvaWQgcGl0Y2hfZW5oYW5jZXIoZmxvYXQgKmZpeGVkX3ZlY3RvciwgZmxvYXQgdm9pY2VfZmFjKQoreworICAgIGludCBpOworICAgIGZsb2F0IGNwZSAgPSAwLjEyNSAqICgxICsgdm9pY2VfZmFjKTsKKyAgICBmbG9hdCBsYXN0ID0gZml4ZWRfdmVjdG9yWzBdOyAvLyBob2xkcyBjKGkgLSAxKQorCisgICAgZml4ZWRfdmVjdG9yWzBdIC09IGNwZSAqIGZpeGVkX3ZlY3RvclsxXTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBBTVJXQl9TRlJfU0laRSAtIDE7IGkrKykgeworICAgICAgICBmbG9hdCBjdXIgPSBmaXhlZF92ZWN0b3JbaV07CisKKyAgICAgICAgZml4ZWRfdmVjdG9yW2ldIC09IGNwZSAqIChsYXN0ICsgZml4ZWRfdmVjdG9yW2kgKyAxXSk7CisgICAgICAgIGxhc3QgPSBjdXI7CisgICAgfQorCisgICAgZml4ZWRfdmVjdG9yW0FNUldCX1NGUl9TSVpFIC0gMV0gLT0gY3BlICogbGFzdDsKK30KKworLyoqCisgKiBDb25kdWN0IDE2dGggb3JkZXIgbGluZWFyIHByZWRpY3RpdmUgY29kaW5nIHN5bnRoZXNpcyBmcm9tIGV4Y2l0YXRpb24uCisgKgorICogQHBhcmFtW2luXSAgICAgY3R4ICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBBTVJXQkNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIGxwYyAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTFBDIGNvZWZmaWNpZW50cworICogQHBhcmFtW291dF0gICAgZXhjaXRhdGlvbiAgICAgICBCdWZmZXIgZm9yIHN5bnRoZXNpcyBmaW5hbCBleGNpdGF0aW9uCisgKiBAcGFyYW1baW5dICAgICBmaXhlZF9nYWluICAgICAgIEZpeGVkIGNvZGVib29rIGdhaW4gZm9yIHN5bnRoZXNpcworICogQHBhcmFtW2luXSAgICAgZml4ZWRfdmVjdG9yICAgICBBbGdlYnJhaWMgY29kZWJvb2sgdmVjdG9yCisgKiBAcGFyYW1baW4sb3V0XSBzYW1wbGVzICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBzYW1wbGVzIGFuZCBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgc3ludGhlc2lzKEFNUldCQ29udGV4dCAqY3R4LCBmbG9hdCAqbHBjLCBmbG9hdCAqZXhjaXRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmaXhlZF9nYWluLCBjb25zdCBmbG9hdCAqZml4ZWRfdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpzYW1wbGVzKQoreworICAgIGN0eC0+YWNlbHB2X2N0eC53ZWlnaHRlZF92ZWN0b3Jfc3VtZihleGNpdGF0aW9uLCBjdHgtPnBpdGNoX3ZlY3RvciwgZml4ZWRfdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cGl0Y2hfZ2FpblswXSwgZml4ZWRfZ2FpbiwgQU1SV0JfU0ZSX1NJWkUpOworCisgICAgLyogZW1waGFzaXplIHBpdGNoIHZlY3RvciBjb250cmlidXRpb24gaW4gbG93IGJpdHJhdGUgbW9kZXMgKi8KKyAgICBpZiAoY3R4LT5waXRjaF9nYWluWzBdID4gMC41ICYmIGN0eC0+ZnJfY3VyX21vZGUgPD0gTU9ERV84azg1KSB7CisgICAgICAgIGludCBpOworICAgICAgICBmbG9hdCBlbmVyZ3kgPSBjdHgtPmNlbHBtX2N0eC5kb3RfcHJvZHVjdGYoZXhjaXRhdGlvbiwgZXhjaXRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJXQl9TRlJfU0laRSk7CisKKyAgICAgICAgLy8gWFhYOiBXZWlyZCBwYXJ0IGluIGJvdGggcmVmIGNvZGUgYW5kIHNwZWMuIEEgdW5rbm93biBwYXJhbWV0ZXIKKyAgICAgICAgLy8ge2JldGF9IHNlZW1zIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgY3VycmVudCBwaXRjaCBnYWluCisgICAgICAgIGZsb2F0IHBpdGNoX2ZhY3RvciA9IDAuMjUgKiBjdHgtPnBpdGNoX2dhaW5bMF0gKiBjdHgtPnBpdGNoX2dhaW5bMF07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEFNUldCX1NGUl9TSVpFOyBpKyspCisgICAgICAgICAgICBleGNpdGF0aW9uW2ldICs9IHBpdGNoX2ZhY3RvciAqIGN0eC0+cGl0Y2hfdmVjdG9yW2ldOworCisgICAgICAgIGZmX3NjYWxlX3ZlY3Rvcl90b19naXZlbl9zdW1fb2Zfc3F1YXJlcyhleGNpdGF0aW9uLCBleGNpdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5lcmd5LCBBTVJXQl9TRlJfU0laRSk7CisgICAgfQorCisgICAgY3R4LT5jZWxwZl9jdHguY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZihzYW1wbGVzLCBscGMsIGV4Y2l0YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJXQl9TRlJfU0laRSwgTFBfT1JERVIpOworfQorCisvKioKKyAqIEFwcGx5IHRvIHN5bnRoZXNpcyBhIGRlLWVtcGhhc2lzIGZpbHRlciBvZiB0aGUgZm9ybToKKyAqIEgoeikgPSAxIC8gKDEgLSBtICogel4tMSkKKyAqCisgKiBAcGFyYW1bb3V0XSAgICBvdXQgICAgICAgICAgICAgIE91dHB1dCBidWZmZXIKKyAqIEBwYXJhbVtpbl0gICAgIGluICAgICAgICAgICAgICAgSW5wdXQgc2FtcGxlcyBhcnJheSB3aXRoIGluWy0xXQorICogQHBhcmFtW2luXSAgICAgbSAgICAgICAgICAgICAgICBGaWx0ZXIgY29lZmZpY2llbnQKKyAqIEBwYXJhbVtpbixvdXRdIG1lbSAgICAgICAgICAgICAgU3RhdGUgZnJvbSBsYXN0IGZpbHRlcmluZworICovCitzdGF0aWMgdm9pZCBkZV9lbXBoYXNpcyhmbG9hdCAqb3V0LCBmbG9hdCAqaW4sIGZsb2F0IG0sIGZsb2F0IG1lbVsxXSkKK3sKKyAgICBpbnQgaTsKKworICAgIG91dFswXSA9IGluWzBdICsgbSAqIG1lbVswXTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBBTVJXQl9TRlJfU0laRTsgaSsrKQorICAgICAgICAgb3V0W2ldID0gaW5baV0gKyBvdXRbaSAtIDFdICogbTsKKworICAgIG1lbVswXSA9IG91dFtBTVJXQl9TRlJfU0laRSAtIDFdOworfQorCisvKioKKyAqIFVwc2FtcGxlIGEgc2lnbmFsIGJ5IDUvNCByYXRpbyAoZnJvbSAxMi44a0h6IHRvIDE2a0h6KSB1c2luZworICogYSBGSVIgaW50ZXJwb2xhdGlvbiBmaWx0ZXIuIFVzZXMgcGFzdCBkYXRhIGZyb20gYmVmb3JlICppbiBhZGRyZXNzLgorICoKKyAqIEBwYXJhbVtvdXRdIG91dCAgICAgICAgICAgICAgICAgQnVmZmVyIGZvciBpbnRlcnBvbGF0ZWQgc2lnbmFsCisgKiBAcGFyYW1baW5dICBpbiAgICAgICAgICAgICAgICAgIEN1cnJlbnQgc2lnbmFsIGRhdGEgKGxlbmd0aCAwLjgqb19zaXplKQorICogQHBhcmFtW2luXSAgb19zaXplICAgICAgICAgICAgICBPdXRwdXQgc2lnbmFsIGxlbmd0aAorICogQHBhcmFtW2luXSBjdHggICAgICAgICAgICAgICAgICBUaGUgY29udGV4dAorICovCitzdGF0aWMgdm9pZCB1cHNhbXBsZV81XzQoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLCBpbnQgb19zaXplLCBDRUxQTUNvbnRleHQgKmN0eCkKK3sKKyAgICBjb25zdCBmbG9hdCAqaW4wID0gaW4gLSBVUFNfRklSX1NJWkUgKyAxOworICAgIGludCBpLCBqLCBrOworICAgIGludCBpbnRfcGFydCA9IDAsIGZyYWNfcGFydDsKKworICAgIGkgPSAwOworICAgIGZvciAoaiA9IDA7IGogPCBvX3NpemUgLyA1OyBqKyspIHsKKyAgICAgICAgb3V0W2ldID0gaW5baW50X3BhcnRdOworICAgICAgICBmcmFjX3BhcnQgPSA0OworICAgICAgICBpKys7CisKKyAgICAgICAgZm9yIChrID0gMTsgayA8IDU7IGsrKykgeworICAgICAgICAgICAgb3V0W2ldID0gY3R4LT5kb3RfcHJvZHVjdGYoaW4wICsgaW50X3BhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwc2FtcGxlX2Zpcls0IC0gZnJhY19wYXJ0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBTX01FTV9TSVpFKTsKKyAgICAgICAgICAgIGludF9wYXJ0Kys7CisgICAgICAgICAgICBmcmFjX3BhcnQtLTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIGhpZ2gtYmFuZCBnYWluIGJhc2VkIG9uIGVuY29kZWQgaW5kZXggKDIzazg1IG1vZGUpIG9yCisgKiBvbiB0aGUgbG93LWJhbmQgc3BlZWNoIHNpZ25hbCBhbmQgdGhlIFZvaWNlIEFjdGl2aXR5IERldGVjdGlvbiBmbGFnLgorICoKKyAqIEBwYXJhbVtpbl0gY3R4ICAgICAgICAgICAgICAgICAgVGhlIGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gc3ludGggICAgICAgICAgICAgICAgTEIgc3BlZWNoIHN5bnRoZXNpcyBhdCAxMi44aworICogQHBhcmFtW2luXSBoYl9pZHggICAgICAgICAgICAgICBHYWluIGluZGV4IGZvciBtb2RlIDIzazg1IG9ubHkKKyAqIEBwYXJhbVtpbl0gdmFkICAgICAgICAgICAgICAgICAgVkFEIGZsYWcgZm9yIHRoZSBmcmFtZQorICovCitzdGF0aWMgZmxvYXQgZmluZF9oYl9nYWluKEFNUldCQ29udGV4dCAqY3R4LCBjb25zdCBmbG9hdCAqc3ludGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhiX2lkeCwgdWludDhfdCB2YWQpCit7CisgICAgaW50IHdzcCA9ICh2YWQgPiAwKTsKKyAgICBmbG9hdCB0aWx0OworCisgICAgaWYgKGN0eC0+ZnJfY3VyX21vZGUgPT0gTU9ERV8yM2s4NSkKKyAgICAgICAgcmV0dXJuIHF1YV9oYl9nYWluW2hiX2lkeF0gKiAoMS4wZiAvICgxIDw8IDE0KSk7CisKKyAgICB0aWx0ID0gY3R4LT5jZWxwbV9jdHguZG90X3Byb2R1Y3RmKHN5bnRoLCBzeW50aCArIDEsIEFNUldCX1NGUl9TSVpFIC0gMSkgLworICAgICAgICAgICBjdHgtPmNlbHBtX2N0eC5kb3RfcHJvZHVjdGYoc3ludGgsIHN5bnRoLCBBTVJXQl9TRlJfU0laRSk7CisKKyAgICAvKiByZXR1cm4gZ2FpbiBib3VuZGVkIGJ5IFswLjEsIDEuMF0gKi8KKyAgICByZXR1cm4gYXZfY2xpcGYoKDEuMCAtIEZGTUFYKDAuMCwgdGlsdCkpICogKDEuMjUgLSAwLjI1ICogd3NwKSwgMC4xLCAxLjApOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBoaWdoLWJhbmQgZXhjaXRhdGlvbiB3aXRoIHRoZSBzYW1lIGVuZXJneSBmcm9tIHRoZSBsb3dlcgorICogb25lIGFuZCBzY2FsZWQgYnkgdGhlIGdpdmVuIGdhaW4uCisgKgorICogQHBhcmFtW2luXSAgY3R4ICAgICAgICAgICAgICAgICBUaGUgY29udGV4dAorICogQHBhcmFtW291dF0gaGJfZXhjICAgICAgICAgICAgICBCdWZmZXIgZm9yIHRoZSBleGNpdGF0aW9uCisgKiBAcGFyYW1baW5dICBzeW50aF9leGMgICAgICAgICAgIExvdy1iYW5kIGV4Y2l0YXRpb24gdXNlZCBmb3Igc3ludGhlc2lzCisgKiBAcGFyYW1baW5dICBoYl9nYWluICAgICAgICAgICAgIFdhbnRlZCBleGNpdGF0aW9uIGdhaW4KKyAqLworc3RhdGljIHZvaWQgc2NhbGVkX2hiX2V4Y2l0YXRpb24oQU1SV0JDb250ZXh0ICpjdHgsIGZsb2F0ICpoYl9leGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3ludGhfZXhjLCBmbG9hdCBoYl9nYWluKQoreworICAgIGludCBpOworICAgIGZsb2F0IGVuZXJneSA9IGN0eC0+Y2VscG1fY3R4LmRvdF9wcm9kdWN0ZihzeW50aF9leGMsIHN5bnRoX2V4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUldCX1NGUl9TSVpFKTsKKworICAgIC8qIEdlbmVyYXRlIGEgd2hpdGUtbm9pc2UgZXhjaXRhdGlvbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBBTVJXQl9TRlJfU0laRV8xNms7IGkrKykKKyAgICAgICAgaGJfZXhjW2ldID0gMzI3NjguMCAtICh1aW50MTZfdCkgYXZfbGZnX2dldCgmY3R4LT5wcm5nKTsKKworICAgIGZmX3NjYWxlX3ZlY3Rvcl90b19naXZlbl9zdW1fb2Zfc3F1YXJlcyhoYl9leGMsIGhiX2V4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5lcmd5ICogaGJfZ2FpbiAqIGhiX2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUldCX1NGUl9TSVpFXzE2ayk7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSBhdXRvLWNvcnJlbGF0aW9uIGZvciB0aGUgSVNGIGRpZmZlcmVuY2UgdmVjdG9yLgorICovCitzdGF0aWMgZmxvYXQgYXV0b19jb3JyZWxhdGlvbihmbG9hdCAqZGlmZl9pc2YsIGZsb2F0IG1lYW4sIGludCBsYWcpCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgc3VtID0gMC4wOworCisgICAgZm9yIChpID0gNzsgaSA8IExQX09SREVSIC0gMjsgaSsrKSB7CisgICAgICAgIGZsb2F0IHByb2QgPSAoZGlmZl9pc2ZbaV0gLSBtZWFuKSAqIChkaWZmX2lzZltpIC0gbGFnXSAtIG1lYW4pOworICAgICAgICBzdW0gKz0gcHJvZCAqIHByb2Q7CisgICAgfQorICAgIHJldHVybiBzdW07Cit9CisKKy8qKgorICogRXh0cmFwb2xhdGUgYSBJU0YgdmVjdG9yIHRvIHRoZSAxNmtIeiByYW5nZSAoMjB0aCBvcmRlciBMUCkKKyAqIHVzZWQgYXQgbW9kZSA2azYwIExQIGZpbHRlciBmb3IgdGhlIGhpZ2ggZnJlcXVlbmN5IGJhbmQuCisgKgorICogQHBhcmFtW291dF0gaXNmIEJ1ZmZlciBmb3IgZXh0cmFwb2xhdGVkIGlzZjsgY29udGFpbnMgTFBfT1JERVIKKyAqICAgICAgICAgICAgICAgICB2YWx1ZXMgb24gaW5wdXQKKyAqLworc3RhdGljIHZvaWQgZXh0cmFwb2xhdGVfaXNmKGZsb2F0IGlzZltMUF9PUkRFUl8xNmtdKQoreworICAgIGZsb2F0IGRpZmZfaXNmW0xQX09SREVSIC0gMl0sIGRpZmZfbWVhbjsKKyAgICBmbG9hdCBjb3JyX2xhZ1szXTsKKyAgICBmbG9hdCBlc3QsIHNjYWxlOworICAgIGludCBpLCBqLCBpX21heF9jb3JyOworCisgICAgaXNmW0xQX09SREVSXzE2ayAtIDFdID0gaXNmW0xQX09SREVSIC0gMV07CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgdmVjdG9yICovCisgICAgZm9yIChpID0gMDsgaSA8IExQX09SREVSIC0gMjsgaSsrKQorICAgICAgICBkaWZmX2lzZltpXSA9IGlzZltpICsgMV0gLSBpc2ZbaV07CisKKyAgICBkaWZmX21lYW4gPSAwLjA7CisgICAgZm9yIChpID0gMjsgaSA8IExQX09SREVSIC0gMjsgaSsrKQorICAgICAgICBkaWZmX21lYW4gKz0gZGlmZl9pc2ZbaV0gKiAoMS4wZiAvIChMUF9PUkRFUiAtIDQpKTsKKworICAgIC8qIEZpbmQgd2hpY2ggaXMgdGhlIG1heGltdW0gYXV0b2NvcnJlbGF0aW9uICovCisgICAgaV9tYXhfY29yciA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBjb3JyX2xhZ1tpXSA9IGF1dG9fY29ycmVsYXRpb24oZGlmZl9pc2YsIGRpZmZfbWVhbiwgaSArIDIpOworCisgICAgICAgIGlmIChjb3JyX2xhZ1tpXSA+IGNvcnJfbGFnW2lfbWF4X2NvcnJdKQorICAgICAgICAgICAgaV9tYXhfY29yciA9IGk7CisgICAgfQorICAgIGlfbWF4X2NvcnIrKzsKKworICAgIGZvciAoaSA9IExQX09SREVSIC0gMTsgaSA8IExQX09SREVSXzE2ayAtIDE7IGkrKykKKyAgICAgICAgaXNmW2ldID0gaXNmW2kgLSAxXSArIGlzZltpIC0gMSAtIGlfbWF4X2NvcnJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBpc2ZbaSAtIDIgLSBpX21heF9jb3JyXTsKKworICAgIC8qIENhbGN1bGF0ZSBhbiBlc3RpbWF0ZSBmb3IgSVNGKDE4KSBhbmQgc2NhbGUgSVNGIGJhc2VkIG9uIHRoZSBlcnJvciAqLworICAgIGVzdCAgID0gNzk2NSArIChpc2ZbMl0gLSBpc2ZbM10gLSBpc2ZbNF0pIC8gNi4wOworICAgIHNjYWxlID0gMC41ICogKEZGTUlOKGVzdCwgNzYwMCkgLSBpc2ZbTFBfT1JERVIgLSAyXSkgLworICAgICAgICAgICAgKGlzZltMUF9PUkRFUl8xNmsgLSAyXSAtIGlzZltMUF9PUkRFUiAtIDJdKTsKKworICAgIGZvciAoaSA9IExQX09SREVSIC0gMSwgaiA9IDA7IGkgPCBMUF9PUkRFUl8xNmsgLSAxOyBpKyssIGorKykKKyAgICAgICAgZGlmZl9pc2Zbal0gPSBzY2FsZSAqIChpc2ZbaV0gLSBpc2ZbaSAtIDFdKTsKKworICAgIC8qIFN0YWJpbGl0eSBpbnN1cmFuY2UgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgTFBfT1JERVJfMTZrIC0gTFBfT1JERVI7IGkrKykKKyAgICAgICAgaWYgKGRpZmZfaXNmW2ldICsgZGlmZl9pc2ZbaSAtIDFdIDwgNS4wKSB7CisgICAgICAgICAgICBpZiAoZGlmZl9pc2ZbaV0gPiBkaWZmX2lzZltpIC0gMV0pIHsKKyAgICAgICAgICAgICAgICBkaWZmX2lzZltpIC0gMV0gPSA1LjAgLSBkaWZmX2lzZltpXTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGRpZmZfaXNmW2ldID0gNS4wIC0gZGlmZl9pc2ZbaSAtIDFdOworICAgICAgICB9CisKKyAgICBmb3IgKGkgPSBMUF9PUkRFUiAtIDEsIGogPSAwOyBpIDwgTFBfT1JERVJfMTZrIC0gMTsgaSsrLCBqKyspCisgICAgICAgIGlzZltpXSA9IGlzZltpIC0gMV0gKyBkaWZmX2lzZltqXSAqICgxLjBmIC8gKDEgPDwgMTUpKTsKKworICAgIC8qIFNjYWxlIHRoZSBJU0YgdmVjdG9yIGZvciAxNjAwMCBIeiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMUF9PUkRFUl8xNmsgLSAxOyBpKyspCisgICAgICAgIGlzZltpXSAqPSAwLjg7Cit9CisKKy8qKgorICogU3BlY3RyYWwgZXhwYW5kIHRoZSBMUCBjb2VmZmljaWVudHMgdXNpbmcgdGhlIGVxdWF0aW9uOgorICogICB5W2ldID0geFtpXSAqIChnYW1tYSAqKiBpKQorICoKKyAqIEBwYXJhbVtvdXRdIG91dCAgICAgICAgICAgICAgICAgT3V0cHV0IGJ1ZmZlciAobWF5IHVzZSBpbnB1dCBhcnJheSkKKyAqIEBwYXJhbVtpbl0gIGxwYyAgICAgICAgICAgICAgICAgTFAgY29lZmZpY2llbnRzIGFycmF5CisgKiBAcGFyYW1baW5dICBnYW1tYSAgICAgICAgICAgICAgIFdlaWdodGluZyBmYWN0b3IKKyAqIEBwYXJhbVtpbl0gIHNpemUgICAgICAgICAgICAgICAgTFAgYXJyYXkgc2l6ZQorICovCitzdGF0aWMgdm9pZCBscGNfd2VpZ2h0aW5nKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICpscGMsIGZsb2F0IGdhbW1hLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCBmYWMgPSBnYW1tYTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgb3V0W2ldID0gbHBjW2ldICogZmFjOworICAgICAgICBmYWMgICAqPSBnYW1tYTsKKyAgICB9Cit9CisKKy8qKgorICogQ29uZHVjdCAyMHRoIG9yZGVyIGxpbmVhciBwcmVkaWN0aXZlIGNvZGluZyBzeW50aGVzaXMgZm9yIHRoZSBoaWdoCisgKiBmcmVxdWVuY3kgYmFuZCBleGNpdGF0aW9uIGF0IDE2a0h6LgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGN0eCAgICAgICAgICAgICAgVGhlIGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIHN1YmZyYW1lICAgICAgICAgQ3VycmVudCBzdWJmcmFtZSBpbmRleCAoMCB0byAzKQorICogQHBhcmFtW2luLG91dF0gc2FtcGxlcyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgc3BlZWNoIHNhbXBsZXMKKyAqIEBwYXJhbVtpbl0gICAgIGV4YyAgICAgICAgICAgICAgR2VuZXJhdGVkIHdoaXRlLW5vaXNlIHNjYWxlZCBleGNpdGF0aW9uCisgKiBAcGFyYW1baW5dICAgICBpc2YgICAgICAgICAgICAgIEN1cnJlbnQgZnJhbWUgaXNmIHZlY3RvcgorICogQHBhcmFtW2luXSAgICAgaXNmX3Bhc3QgICAgICAgICBQYXN0IGZyYW1lIGZpbmFsIGlzZiB2ZWN0b3IKKyAqLworc3RhdGljIHZvaWQgaGJfc3ludGhlc2lzKEFNUldCQ29udGV4dCAqY3R4LCBpbnQgc3ViZnJhbWUsIGZsb2F0ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpleGMsIGNvbnN0IGZsb2F0ICppc2YsIGNvbnN0IGZsb2F0ICppc2ZfcGFzdCkKK3sKKyAgICBmbG9hdCBoYl9scGNbTFBfT1JERVJfMTZrXTsKKyAgICBlbnVtIE1vZGUgbW9kZSA9IGN0eC0+ZnJfY3VyX21vZGU7CisKKyAgICBpZiAobW9kZSA9PSBNT0RFXzZrNjApIHsKKyAgICAgICAgZmxvYXQgZV9pc2ZbTFBfT1JERVJfMTZrXTsgLy8gSVNGIHZlY3RvciBmb3IgZXh0cmFwb2xhdGlvbgorICAgICAgICBkb3VibGUgZV9pc3BbTFBfT1JERVJfMTZrXTsKKworICAgICAgICBjdHgtPmFjZWxwdl9jdHgud2VpZ2h0ZWRfdmVjdG9yX3N1bWYoZV9pc2YsIGlzZl9wYXN0LCBpc2YsIGlzZnBfaW50ZXJbc3ViZnJhbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAgLSBpc2ZwX2ludGVyW3N1YmZyYW1lXSwgTFBfT1JERVIpOworCisgICAgICAgIGV4dHJhcG9sYXRlX2lzZihlX2lzZik7CisKKyAgICAgICAgZV9pc2ZbTFBfT1JERVJfMTZrIC0gMV0gKj0gMi4wOworICAgICAgICBmZl9hY2VscF9sc2YybHNwZChlX2lzcCwgZV9pc2YsIExQX09SREVSXzE2ayk7CisgICAgICAgIGZmX2FtcndiX2xzcDJscGMoZV9pc3AsIGhiX2xwYywgTFBfT1JERVJfMTZrKTsKKworICAgICAgICBscGNfd2VpZ2h0aW5nKGhiX2xwYywgaGJfbHBjLCAwLjksIExQX09SREVSXzE2ayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbHBjX3dlaWdodGluZyhoYl9scGMsIGN0eC0+bHBfY29lZltzdWJmcmFtZV0sIDAuNiwgTFBfT1JERVIpOworICAgIH0KKworICAgIGN0eC0+Y2VscGZfY3R4LmNlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYoc2FtcGxlcywgaGJfbHBjLCBleGMsIEFNUldCX1NGUl9TSVpFXzE2aywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2RlID09IE1PREVfNms2MCkgPyBMUF9PUkRFUl8xNmsgOiBMUF9PUkRFUik7Cit9CisKKy8qKgorICogQXBwbHkgYSAxNXRoIG9yZGVyIGZpbHRlciB0byBoaWdoLWJhbmQgc2FtcGxlcy4KKyAqIFRoZSBmaWx0ZXIgY2hhcmFjdGVyaXN0aWMgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gY29lZmZpY2llbnRzLgorICoKKyAqIEBwYXJhbVtvdXRdICAgIG91dCAgICAgICAgICAgICAgQnVmZmVyIGZvciBmaWx0ZXJlZCBvdXRwdXQKKyAqIEBwYXJhbVtpbl0gICAgIGZpcl9jb2VmICAgICAgICAgRmlsdGVyIGNvZWZmaWNpZW50cworICogQHBhcmFtW2luLG91dF0gbWVtICAgICAgICAgICAgICBTdGF0ZSBmcm9tIGxhc3QgZmlsdGVyaW5nICh1cGRhdGVkKQorICogQHBhcmFtW2luXSAgICAgaW4gICAgICAgICAgICAgICBJbnB1dCBzcGVlY2ggZGF0YSAoaGlnaC1iYW5kKQorICoKKyAqIEByZW1hcmsgSXQgaXMgc2FmZSB0byBwYXNzIHRoZSBzYW1lIGFycmF5IGluIGluIGFuZCBvdXQgcGFyYW1ldGVycworICovCisKKyNpZm5kZWYgaGJfZmlyX2ZpbHRlcgorc3RhdGljIHZvaWQgaGJfZmlyX2ZpbHRlcihmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCBmaXJfY29lZltIQl9GSVJfU0laRSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtZW1bSEJfRklSX1NJWkVdLCBjb25zdCBmbG9hdCAqaW4pCit7CisgICAgaW50IGksIGo7CisgICAgZmxvYXQgZGF0YVtBTVJXQl9TRlJfU0laRV8xNmsgKyBIQl9GSVJfU0laRV07IC8vIHBhc3QgYW5kIGN1cnJlbnQgc2FtcGxlcworCisgICAgbWVtY3B5KGRhdGEsIG1lbSwgSEJfRklSX1NJWkUgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtZW1jcHkoZGF0YSArIEhCX0ZJUl9TSVpFLCBpbiwgQU1SV0JfU0ZSX1NJWkVfMTZrICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQU1SV0JfU0ZSX1NJWkVfMTZrOyBpKyspIHsKKyAgICAgICAgb3V0W2ldID0gMC4wOworICAgICAgICBmb3IgKGogPSAwOyBqIDw9IEhCX0ZJUl9TSVpFOyBqKyspCisgICAgICAgICAgICBvdXRbaV0gKz0gZGF0YVtpICsgal0gKiBmaXJfY29lZltqXTsKKyAgICB9CisKKyAgICBtZW1jcHkobWVtLCBkYXRhICsgQU1SV0JfU0ZSX1NJWkVfMTZrLCBIQl9GSVJfU0laRSAqIHNpemVvZihmbG9hdCkpOworfQorI2VuZGlmIC8qIGhiX2Zpcl9maWx0ZXIgKi8KKworLyoqCisgKiBVcGRhdGUgY29udGV4dCBzdGF0ZSBiZWZvcmUgdGhlIG5leHQgc3ViZnJhbWUuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdWJfc3RhdGUoQU1SV0JDb250ZXh0ICpjdHgpCit7CisgICAgbWVtbW92ZSgmY3R4LT5leGNpdGF0aW9uX2J1ZlswXSwgJmN0eC0+ZXhjaXRhdGlvbl9idWZbQU1SV0JfU0ZSX1NJWkVdLAorICAgICAgICAgICAgKEFNUldCX1BfREVMQVlfTUFYICsgTFBfT1JERVIgKyAxKSAqIHNpemVvZihmbG9hdCkpOworCisgICAgbWVtbW92ZSgmY3R4LT5waXRjaF9nYWluWzFdLCAmY3R4LT5waXRjaF9nYWluWzBdLCA1ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgbWVtbW92ZSgmY3R4LT5maXhlZF9nYWluWzFdLCAmY3R4LT5maXhlZF9nYWluWzBdLCAxICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICBtZW1tb3ZlKCZjdHgtPnNhbXBsZXNfYXpbMF0sICZjdHgtPnNhbXBsZXNfYXpbQU1SV0JfU0ZSX1NJWkVdLAorICAgICAgICAgICAgTFBfT1JERVIgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtZW1tb3ZlKCZjdHgtPnNhbXBsZXNfdXBbMF0sICZjdHgtPnNhbXBsZXNfdXBbQU1SV0JfU0ZSX1NJWkVdLAorICAgICAgICAgICAgVVBTX01FTV9TSVpFICogc2l6ZW9mKGZsb2F0KSk7CisgICAgbWVtbW92ZSgmY3R4LT5zYW1wbGVzX2hiWzBdLCAmY3R4LT5zYW1wbGVzX2hiW0FNUldCX1NGUl9TSVpFXzE2a10sCisgICAgICAgICAgICBMUF9PUkRFUl8xNmsgKiBzaXplb2YoZmxvYXQpKTsKK30KKworc3RhdGljIGludCBhbXJ3Yl9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQU1SV0JDb250ZXh0ICpjdHggID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIEFNUldCRnJhbWUgICAqY2YgICA9ICZjdHgtPmZyYW1lOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIGludCBleHBlY3RlZF9mcl9zaXplLCBoZWFkZXJfc2l6ZTsKKyAgICBmbG9hdCAqYnVmX291dDsKKyAgICBmbG9hdCBzcGFyZV92ZWN0b3JbQU1SV0JfU0ZSX1NJWkVdOyAgICAgIC8vIGV4dHJhIHN0YWNrIHNwYWNlIHRvIGhvbGQgcmVzdWx0IGZyb20gYW50aS1zcGFyc2VuZXNzIHByb2Nlc3NpbmcKKyAgICBmbG9hdCBmaXhlZF9nYWluX2ZhY3RvcjsgICAgICAgICAgICAgICAgIC8vIGZpeGVkIGdhaW4gY29ycmVjdGlvbiBmYWN0b3IgKGdhbW1hKQorICAgIGZsb2F0ICpzeW50aF9maXhlZF92ZWN0b3I7ICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byB0aGUgZml4ZWQgdmVjdG9yIHRoYXQgc3ludGhlc2lzIHNob3VsZCB1c2UKKyAgICBmbG9hdCBzeW50aF9maXhlZF9nYWluOyAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXhlZCBnYWluIHRoYXQgc3ludGhlc2lzIHNob3VsZCB1c2UKKyAgICBmbG9hdCB2b2ljZV9mYWMsIHN0YWJfZmFjOyAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMgdXNlZCBmb3IgZ2FpbiBzbW9vdGhpbmcKKyAgICBmbG9hdCBzeW50aF9leGNbQU1SV0JfU0ZSX1NJWkVdOyAgICAgICAgIC8vIHBvc3QtcHJvY2Vzc2VkIGV4Y2l0YXRpb24gZm9yIHN5bnRoZXNpcworICAgIGZsb2F0IGhiX2V4Y1tBTVJXQl9TRlJfU0laRV8xNmtdOyAgICAgICAgLy8gZXhjaXRhdGlvbiBmb3IgdGhlIGhpZ2ggZnJlcXVlbmN5IGJhbmQKKyAgICBmbG9hdCBoYl9zYW1wbGVzW0FNUldCX1NGUl9TSVpFXzE2a107ICAgIC8vIGZpbHRlcmVkIGhpZ2gtYmFuZCBzYW1wbGVzIGZyb20gc3ludGhlc2lzCisgICAgZmxvYXQgaGJfZ2FpbjsKKyAgICBpbnQgc3ViLCBpLCByZXQ7CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gNCAqIEFNUldCX1NGUl9TSVpFXzE2azsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGJ1Zl9vdXQgPSAoZmxvYXQgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIGhlYWRlcl9zaXplICAgICAgPSBkZWNvZGVfbWltZV9oZWFkZXIoY3R4LCBidWYpOworICAgIGlmIChjdHgtPmZyX2N1cl9tb2RlID4gTU9ERV9TSUQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBtb2RlICVkXG4iLCBjdHgtPmZyX2N1cl9tb2RlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGV4cGVjdGVkX2ZyX3NpemUgPSAoKGNmX3NpemVzX3diW2N0eC0+ZnJfY3VyX21vZGVdICsgNykgPj4gMykgKyAxOworCisgICAgaWYgKGJ1Zl9zaXplIDwgZXhwZWN0ZWRfZnJfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICJGcmFtZSB0b28gc21hbGwgKCVkIGJ5dGVzKS4gVHJ1bmNhdGVkIGZpbGU/XG4iLCBidWZfc2l6ZSk7CisgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCFjdHgtPmZyX3F1YWxpdHkgfHwgY3R4LT5mcl9jdXJfbW9kZSA+IE1PREVfU0lEKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVuY291bnRlcmVkIGEgYmFkIG9yIGNvcnJ1cHRlZCBmcmFtZVxuIik7CisKKyAgICBpZiAoY3R4LT5mcl9jdXJfbW9kZSA9PSBNT0RFX1NJRCkgeyAvKiBDb21mb3J0IG5vaXNlIGZyYW1lICovCisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIlNJRCBtb2RlIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBmZl9hbXJfYml0X3Jlb3JkZXIoKHVpbnQxNl90ICopICZjdHgtPmZyYW1lLCBzaXplb2YoQU1SV0JGcmFtZSksCisgICAgICAgIGJ1ZiArIGhlYWRlcl9zaXplLCBhbXJfYml0X29yZGVyaW5nc19ieV9tb2RlW2N0eC0+ZnJfY3VyX21vZGVdKTsKKworICAgIC8qIERlY29kZSB0aGUgcXVhbnRpemVkIElTRiB2ZWN0b3IgKi8KKyAgICBpZiAoY3R4LT5mcl9jdXJfbW9kZSA9PSBNT0RFXzZrNjApIHsKKyAgICAgICAgZGVjb2RlX2lzZl9pbmRpY2VzXzM2YihjZi0+aXNwX2lkLCBjdHgtPmlzZl9jdXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlY29kZV9pc2ZfaW5kaWNlc180NmIoY2YtPmlzcF9pZCwgY3R4LT5pc2ZfY3VyKTsKKyAgICB9CisKKyAgICBpc2ZfYWRkX21lYW5fYW5kX3Bhc3QoY3R4LT5pc2ZfY3VyLCBjdHgtPmlzZl9xX3Bhc3QpOworICAgIGZmX3NldF9taW5fZGlzdF9sc2YoY3R4LT5pc2ZfY3VyLCBNSU5fSVNGX1NQQUNJTkcsIExQX09SREVSIC0gMSk7CisKKyAgICBzdGFiX2ZhYyA9IHN0YWJpbGl0eV9mYWN0b3IoY3R4LT5pc2ZfY3VyLCBjdHgtPmlzZl9wYXN0X2ZpbmFsKTsKKworICAgIGN0eC0+aXNmX2N1cltMUF9PUkRFUiAtIDFdICo9IDIuMDsKKyAgICBmZl9hY2VscF9sc2YybHNwZChjdHgtPmlzcFszXSwgY3R4LT5pc2ZfY3VyLCBMUF9PUkRFUik7CisKKyAgICAvKiBHZW5lcmF0ZSBhIElTUCB2ZWN0b3IgZm9yIGVhY2ggc3ViZnJhbWUgKi8KKyAgICBpZiAoY3R4LT5maXJzdF9mcmFtZSkgeworICAgICAgICBjdHgtPmZpcnN0X2ZyYW1lID0gMDsKKyAgICAgICAgbWVtY3B5KGN0eC0+aXNwX3N1YjRfcGFzdCwgY3R4LT5pc3BbM10sIExQX09SREVSICogc2l6ZW9mKGRvdWJsZSkpOworICAgIH0KKyAgICBpbnRlcnBvbGF0ZV9pc3AoY3R4LT5pc3AsIGN0eC0+aXNwX3N1YjRfcGFzdCk7CisKKyAgICBmb3IgKHN1YiA9IDA7IHN1YiA8IDQ7IHN1YisrKQorICAgICAgICBmZl9hbXJ3Yl9sc3AybHBjKGN0eC0+aXNwW3N1Yl0sIGN0eC0+bHBfY29lZltzdWJdLCBMUF9PUkRFUik7CisKKyAgICBmb3IgKHN1YiA9IDA7IHN1YiA8IDQ7IHN1YisrKSB7CisgICAgICAgIGNvbnN0IEFNUldCU3ViRnJhbWUgKmN1cl9zdWJmcmFtZSA9ICZjZi0+c3ViZnJhbWVbc3ViXTsKKyAgICAgICAgZmxvYXQgKnN1Yl9idWYgPSBidWZfb3V0ICsgc3ViICogQU1SV0JfU0ZSX1NJWkVfMTZrOworCisgICAgICAgIC8qIERlY29kZSBhZGFwdGl2ZSBjb2RlYm9vayAocGl0Y2ggdmVjdG9yKSAqLworICAgICAgICBkZWNvZGVfcGl0Y2hfdmVjdG9yKGN0eCwgY3VyX3N1YmZyYW1lLCBzdWIpOworICAgICAgICAvKiBEZWNvZGUgaW5ub3ZhdGl2ZSBjb2RlYm9vayAoZml4ZWQgdmVjdG9yKSAqLworICAgICAgICBkZWNvZGVfZml4ZWRfdmVjdG9yKGN0eC0+Zml4ZWRfdmVjdG9yLCBjdXJfc3ViZnJhbWUtPnB1bF9paCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfc3ViZnJhbWUtPnB1bF9pbCwgY3R4LT5mcl9jdXJfbW9kZSk7CisKKyAgICAgICAgcGl0Y2hfc2hhcnBlbmluZyhjdHgsIGN0eC0+Zml4ZWRfdmVjdG9yKTsKKworICAgICAgICBkZWNvZGVfZ2FpbnMoY3VyX3N1YmZyYW1lLT52cV9nYWluLCBjdHgtPmZyX2N1cl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgJmZpeGVkX2dhaW5fZmFjdG9yLCAmY3R4LT5waXRjaF9nYWluWzBdKTsKKworICAgICAgICBjdHgtPmZpeGVkX2dhaW5bMF0gPQorICAgICAgICAgICAgZmZfYW1yX3NldF9maXhlZF9nYWluKGZpeGVkX2dhaW5fZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y2VscG1fY3R4LmRvdF9wcm9kdWN0ZihjdHgtPmZpeGVkX3ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Zml4ZWRfdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SV0JfU0ZSX1NJWkUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJXQl9TRlJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wcmVkaWN0aW9uX2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICBFTkVSR1lfTUVBTiwgZW5lcmd5X3ByZWRfZmFjKTsKKworICAgICAgICAvKiBDYWxjdWxhdGUgdm9pY2UgZmFjdG9yIGFuZCBzdG9yZSB0aWx0IGZvciBuZXh0IHN1YmZyYW1lICovCisgICAgICAgIHZvaWNlX2ZhYyAgICAgID0gdm9pY2VfZmFjdG9yKGN0eC0+cGl0Y2hfdmVjdG9yLCBjdHgtPnBpdGNoX2dhaW5bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Zml4ZWRfdmVjdG9yLCBjdHgtPmZpeGVkX2dhaW5bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPmNlbHBtX2N0eCk7CisgICAgICAgIGN0eC0+dGlsdF9jb2VmID0gdm9pY2VfZmFjICogMC4yNSArIDAuMjU7CisKKyAgICAgICAgLyogQ29uc3RydWN0IGN1cnJlbnQgZXhjaXRhdGlvbiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQU1SV0JfU0ZSX1NJWkU7IGkrKykgeworICAgICAgICAgICAgY3R4LT5leGNpdGF0aW9uW2ldICo9IGN0eC0+cGl0Y2hfZ2FpblswXTsKKyAgICAgICAgICAgIGN0eC0+ZXhjaXRhdGlvbltpXSArPSBjdHgtPmZpeGVkX2dhaW5bMF0gKiBjdHgtPmZpeGVkX3ZlY3RvcltpXTsKKyAgICAgICAgICAgIGN0eC0+ZXhjaXRhdGlvbltpXSA9IHRydW5jZihjdHgtPmV4Y2l0YXRpb25baV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogUG9zdC1wcm9jZXNzaW5nIG9mIGV4Y2l0YXRpb24gZWxlbWVudHMgKi8KKyAgICAgICAgc3ludGhfZml4ZWRfZ2FpbiA9IG5vaXNlX2VuaGFuY2VyKGN0eC0+Zml4ZWRfZ2FpblswXSwgJmN0eC0+cHJldl90cl9nYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2VfZmFjLCBzdGFiX2ZhYyk7CisKKyAgICAgICAgc3ludGhfZml4ZWRfdmVjdG9yID0gYW50aV9zcGFyc2VuZXNzKGN0eCwgY3R4LT5maXhlZF92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFyZV92ZWN0b3IpOworCisgICAgICAgIHBpdGNoX2VuaGFuY2VyKHN5bnRoX2ZpeGVkX3ZlY3Rvciwgdm9pY2VfZmFjKTsKKworICAgICAgICBzeW50aGVzaXMoY3R4LCBjdHgtPmxwX2NvZWZbc3ViXSwgc3ludGhfZXhjLCBzeW50aF9maXhlZF9nYWluLAorICAgICAgICAgICAgICAgICAgc3ludGhfZml4ZWRfdmVjdG9yLCAmY3R4LT5zYW1wbGVzX2F6W0xQX09SREVSXSk7CisKKyAgICAgICAgLyogU3ludGhlc2lzIHNwZWVjaCBwb3N0LXByb2Nlc3NpbmcgKi8KKyAgICAgICAgZGVfZW1waGFzaXMoJmN0eC0+c2FtcGxlc191cFtVUFNfTUVNX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAmY3R4LT5zYW1wbGVzX2F6W0xQX09SREVSXSwgUFJFRU1QSF9GQUMsIGN0eC0+ZGVtcGhfbWVtKTsKKworICAgICAgICBjdHgtPmFjZWxwZl9jdHguYWNlbHBfYXBwbHlfb3JkZXJfMl90cmFuc2Zlcl9mdW5jdGlvbigmY3R4LT5zYW1wbGVzX3VwW1VQU19NRU1fU0laRV0sCisgICAgICAgICAgICAmY3R4LT5zYW1wbGVzX3VwW1VQU19NRU1fU0laRV0sIGhwZl96ZXJvcywgaHBmXzMxX3BvbGVzLAorICAgICAgICAgICAgaHBmXzMxX2dhaW4sIGN0eC0+aHBmXzMxX21lbSwgQU1SV0JfU0ZSX1NJWkUpOworCisgICAgICAgIHVwc2FtcGxlXzVfNChzdWJfYnVmLCAmY3R4LT5zYW1wbGVzX3VwW1VQU19GSVJfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICBBTVJXQl9TRlJfU0laRV8xNmssICZjdHgtPmNlbHBtX2N0eCk7CisKKyAgICAgICAgLyogSGlnaCBmcmVxdWVuY3kgYmFuZCAoNi40IC0gNy4wIGtIeikgZ2VuZXJhdGlvbiBwYXJ0ICovCisgICAgICAgIGN0eC0+YWNlbHBmX2N0eC5hY2VscF9hcHBseV9vcmRlcl8yX3RyYW5zZmVyX2Z1bmN0aW9uKGhiX3NhbXBsZXMsCisgICAgICAgICAgICAmY3R4LT5zYW1wbGVzX3VwW1VQU19NRU1fU0laRV0sIGhwZl96ZXJvcywgaHBmXzQwMF9wb2xlcywKKyAgICAgICAgICAgIGhwZl80MDBfZ2FpbiwgY3R4LT5ocGZfNDAwX21lbSwgQU1SV0JfU0ZSX1NJWkUpOworCisgICAgICAgIGhiX2dhaW4gPSBmaW5kX2hiX2dhaW4oY3R4LCBoYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9zdWJmcmFtZS0+aGJfZ2FpbiwgY2YtPnZhZCk7CisKKyAgICAgICAgc2NhbGVkX2hiX2V4Y2l0YXRpb24oY3R4LCBoYl9leGMsIHN5bnRoX2V4YywgaGJfZ2Fpbik7CisKKyAgICAgICAgaGJfc3ludGhlc2lzKGN0eCwgc3ViLCAmY3R4LT5zYW1wbGVzX2hiW0xQX09SREVSXzE2a10sCisgICAgICAgICAgICAgICAgICAgICBoYl9leGMsIGN0eC0+aXNmX2N1ciwgY3R4LT5pc2ZfcGFzdF9maW5hbCk7CisKKyAgICAgICAgLyogSGlnaC1iYW5kIHBvc3QtcHJvY2Vzc2luZyBmaWx0ZXJzICovCisgICAgICAgIGhiX2Zpcl9maWx0ZXIoaGJfc2FtcGxlcywgYnBmXzZfN19jb2VmLCBjdHgtPmJwZl82XzdfbWVtLAorICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnNhbXBsZXNfaGJbTFBfT1JERVJfMTZrXSk7CisKKyAgICAgICAgaWYgKGN0eC0+ZnJfY3VyX21vZGUgPT0gTU9ERV8yM2s4NSkKKyAgICAgICAgICAgIGhiX2Zpcl9maWx0ZXIoaGJfc2FtcGxlcywgbHBmXzdfY29lZiwgY3R4LT5scGZfN19tZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhiX3NhbXBsZXMpOworCisgICAgICAgIC8qIEFkZCB0aGUgbG93IGFuZCBoaWdoIGZyZXF1ZW5jeSBiYW5kcyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQU1SV0JfU0ZSX1NJWkVfMTZrOyBpKyspCisgICAgICAgICAgICBzdWJfYnVmW2ldID0gKHN1Yl9idWZbaV0gKyBoYl9zYW1wbGVzW2ldKSAqICgxLjBmIC8gKDEgPDwgMTUpKTsKKworICAgICAgICAvKiBVcGRhdGUgYnVmZmVycyBhbmQgaGlzdG9yeSAqLworICAgICAgICB1cGRhdGVfc3ViX3N0YXRlKGN0eCk7CisgICAgfQorCisgICAgLyogdXBkYXRlIHN0YXRlIGZvciBuZXh0IGZyYW1lICovCisgICAgbWVtY3B5KGN0eC0+aXNwX3N1YjRfcGFzdCwgY3R4LT5pc3BbM10sIExQX09SREVSICogc2l6ZW9mKGN0eC0+aXNwWzNdWzBdKSk7CisgICAgbWVtY3B5KGN0eC0+aXNmX3Bhc3RfZmluYWwsIGN0eC0+aXNmX2N1ciwgTFBfT1JERVIgKiBzaXplb2YoZmxvYXQpKTsKKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBleHBlY3RlZF9mcl9zaXplOworfQorCitBVkNvZGVjIGZmX2FtcndiX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFtcndiIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQU1SLVdCIChBZGFwdGl2ZSBNdWx0aS1SYXRlIFdpZGVCYW5kKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BTVJfV0IsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFNUldCQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gYW1yd2JfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gYW1yd2JfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbm0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FubS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Mjc1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hbm0uYwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIERlbHV4ZSBQYWludCBBbmltYXRpb24gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRGVsdXhlIFBhaW50IEFuaW1hdGlvbiBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQW5tQ29udGV4dCB7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgaW50IHBhbGV0dGVbQVZQQUxFVFRFX0NPVU5UXTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBpbnQgeDsgIC8vLzwgeCBjb29yZGluYXRlIHBvc2l0aW9uCit9IEFubUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQW5tQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+Z2IsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCAxNiAqIDggKyA0ICogMjU2KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJnMtPmdiLCAxNiAqIDgpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgcy0+cGFsZXR0ZVtpXSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMydSgmcy0+Z2IpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGVyZm9ybSBkZWNvZGUgb3BlcmF0aW9uCisgKiBAcGFyYW0gZHN0ICAgICBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGltYWdlIGJ1ZmZlcgorICogQHBhcmFtIGRzdF9lbmQgcG9pbnRlciB0byBlbmQgb2YgZGVzdGluYXRpb24gaW1hZ2UgYnVmZmVyCisgKiBAcGFyYW0gZ2IgR2V0Qnl0ZUNvbnRleHQgKG9wdGlvbmFsLCBzZWUgYmVsb3cpCisgKiBAcGFyYW0gcGl4ZWwgRmlsbCBjb2xvciAob3B0aW9uYWwsIHNlZSBiZWxvdykKKyAqIEBwYXJhbSBjb3VudCBQaXhlbCBjb3VudAorICogQHBhcmFtIHggUG9pbnRlciB0byB4LWF4aXMgY291bnRlcgorICogQHBhcmFtIHdpZHRoIEltYWdlIHdpZHRoCisgKiBAcGFyYW0gbGluZXNpemUgRGVzdGluYXRpb24gaW1hZ2UgYnVmZmVyIGxpbmVzaXplCisgKiBAcmV0dXJuIG5vbi16ZXJvIGlmIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyBleGhhdXN0ZWQKKyAqCisgKiBhIGNvcHkgb3BlcmF0aW9uIGlzIGFjaGlldmVkIHdoZW4gJ2diJyBpcyBzZXQKKyAqIGEgZmlsbCBvcGVyYXRpb24gaXMgYWNoaWV2ZWQgd2hlbiAnZ2InIGlzIG51bGwgYW5kIHBpeGVsIGlzID49IDAKKyAqIGEgc2tpcCBvcGVyYXRpb24gaXMgYWNoaWV2ZWQgd2hlbiAnZ2InIGlzIG51bGwgYW5kIHBpeGVsIGlzIDwgMAorICovCitzdGF0aWMgaW5saW5lIGludCBvcCh1aW50OF90ICoqZHN0LCBjb25zdCB1aW50OF90ICpkc3RfZW5kLAorICAgICAgICAgICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsLCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgKngsIGludCB3aWR0aCwgaW50IGxpbmVzaXplKQoreworICAgIGludCByZW1haW5pbmcgPSB3aWR0aCAtICp4OworICAgIHdoaWxlKGNvdW50ID4gMCkgeworICAgICAgICBpbnQgc3RyaXBsZW4gPSBGRk1JTihjb3VudCwgcmVtYWluaW5nKTsKKyAgICAgICAgaWYgKGdiKSB7CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIDwgc3RyaXBsZW4pCisgICAgICAgICAgICAgICAgZ290byBleGhhdXN0ZWQ7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVydShnYiwgKmRzdCwgc3RyaXBsZW4pOworICAgICAgICB9IGVsc2UgaWYgKHBpeGVsID49IDApCisgICAgICAgICAgICBtZW1zZXQoKmRzdCwgcGl4ZWwsIHN0cmlwbGVuKTsKKyAgICAgICAgKmRzdCAgICAgICs9IHN0cmlwbGVuOworICAgICAgICByZW1haW5pbmcgLT0gc3RyaXBsZW47CisgICAgICAgIGNvdW50ICAgICAtPSBzdHJpcGxlbjsKKyAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSB7CisgICAgICAgICAgICAqZHN0ICAgICAgKz0gbGluZXNpemUgLSB3aWR0aDsKKyAgICAgICAgICAgIHJlbWFpbmluZyAgPSB3aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAobGluZXNpemUgPiAwKSB7CisgICAgICAgICAgICBpZiAoKmRzdCA+PSBkc3RfZW5kKSBnb3RvIGV4aGF1c3RlZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgqZHN0IDw9IGRzdF9lbmQpIGdvdG8gZXhoYXVzdGVkOworICAgICAgICB9CisgICAgfQorICAgICp4ID0gd2lkdGggLSByZW1haW5pbmc7CisgICAgcmV0dXJuIDA7CisKK2V4aGF1c3RlZDoKKyAgICAqeCA9IHdpZHRoIC0gcmVtYWluaW5nOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBbm1Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICB1aW50OF90ICpkc3QsICpkc3RfZW5kOworICAgIGludCBjb3VudCwgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGRzdCAgICAgPSBzLT5mcmFtZS0+ZGF0YVswXTsKKyAgICBkc3RfZW5kID0gcy0+ZnJhbWUtPmRhdGFbMF0gKyBzLT5mcmFtZS0+bGluZXNpemVbMF0qYXZjdHgtPmhlaWdodDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmdiLCBhdnBrdC0+ZGF0YSwgYnVmX3NpemUpOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYikgIT0gMHg0MikgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJVbmtub3duIHJlY29yZCB0eXBlIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJQYWRkaW5nIGJ5dGVzIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIDIpOworCisgICAgcy0+eCA9IDA7CisgICAgZG8geworICAgICAgICAvKiBpZiBzdGF0ZW1lbnRzIGFyZSBvcmRlcmVkIGJ5IHByb2JhYmlsaXR5ICovCisjZGVmaW5lIE9QKGdiLCBwaXhlbCwgY291bnQpIFwKKyAgICBvcCgmZHN0LCBkc3RfZW5kLCAoZ2IpLCAocGl4ZWwpLCAoY291bnQpLCAmcy0+eCwgYXZjdHgtPndpZHRoLCBzLT5mcmFtZS0+bGluZXNpemVbMF0pCisKKyAgICAgICAgaW50IHR5cGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICBjb3VudCA9IHR5cGUgJiAweDdGOworICAgICAgICB0eXBlID4+PSA3OworICAgICAgICBpZiAoY291bnQpIHsKKyAgICAgICAgICAgIGlmIChPUCh0eXBlID8gTlVMTCA6ICZzLT5nYiwgLTEsIGNvdW50KSkgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoIXR5cGUpIHsKKyAgICAgICAgICAgIGludCBwaXhlbDsKKyAgICAgICAgICAgIGNvdW50ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsgIC8qIGNvdW50PT0wIGdpdmVzIG5vcCAqLworICAgICAgICAgICAgcGl4ZWwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICAgICAgaWYgKE9QKE5VTEwsIHBpeGVsLCBjb3VudCkpIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHBpeGVsOworICAgICAgICAgICAgdHlwZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5nYik7CisgICAgICAgICAgICBjb3VudCA9IHR5cGUgJiAweDNGRkY7CisgICAgICAgICAgICB0eXBlID4+PSAxNDsKKyAgICAgICAgICAgIGlmICghY291bnQpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gc3RvcAorICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiVW5rbm93biBvcGNvZGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpeGVsID0gdHlwZSA9PSAzID8gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKSA6IC0xOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gMSkgY291bnQgKz0gMHg0MDAwOworICAgICAgICAgICAgaWYgKE9QKHR5cGUgPT0gMiA/ICZzLT5nYiA6IE5VTEwsIHBpeGVsLCBjb3VudCkpIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA+IDApOworCisgICAgbWVtY3B5KHMtPmZyYW1lLT5kYXRhWzFdLCBzLT5wYWxldHRlLCBBVlBBTEVUVEVfU0laRSk7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFubUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2FubV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhbm0iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEZWx1eGUgUGFpbnQgQW5pbWF0aW9uIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FOTSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQW5tQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hbnNpLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hbnNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5ODFjYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Fuc2kuYwpAQCAtMCwwICsxLDQ4MiBAQAorLyoKKyAqIEFTQ0lJL0FOU0kgYXJ0IGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQVNDSUkvQU5TSSBhcnQgZGVjb2RlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZyYW1lLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94Z2FfZm9udF9kYXRhLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImNnYV9kYXRhLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBBVFRSX0JPTEQgICAgICAgICAweDAxICAvKio8IEJvbGQvQnJpZ2h0LWZvcmVncm91bmQgKG1vZGUgMSkgKi8KKyNkZWZpbmUgQVRUUl9GQUlOVCAgICAgICAgMHgwMiAgLyoqPCBGYWludCAobW9kZSAyKSAqLworI2RlZmluZSBBVFRSX1VOREVSTElORSAgICAweDA4ICAvKio8IFVuZGVybGluZSAobW9kZSA0KSAqLworI2RlZmluZSBBVFRSX0JMSU5LICAgICAgICAweDEwICAvKio8IEJsaW5rL0JyaWdodC1iYWNrZ3JvdW5kIChtb2RlIDUpICovCisjZGVmaW5lIEFUVFJfUkVWRVJTRSAgICAgIDB4NDAgIC8qKjwgUmV2ZXJzZSAobW9kZSA3KSAqLworI2RlZmluZSBBVFRSX0NPTkNFQUxFRCAgICAweDgwICAvKio8IENvbmNlYWxlZCAobW9kZSA4KSAqLworCisjZGVmaW5lIERFRkFVTFRfRkdfQ09MT1IgICAgIDcgIC8qKjwgQ0dBIGNvbG9yIGluZGV4ICovCisjZGVmaW5lIERFRkFVTFRfQkdfQ09MT1IgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TQ1JFRU5fTU9ERSAgMyAgLyoqPCA4MHgyNSAqLworCisjZGVmaW5lIEZPTlRfV0lEVEggICAgICAgICAgIDggIC8qKjwgRm9udCB3aWR0aCAqLworCisvKiogbWFwIGFuc2kgY29sb3IgaW5kZXggdG8gY2dhIHBhbGV0dGUgaW5kZXggKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGFuc2lfdG9fY2dhWzE2XSA9IHsKKyAgICAwLCAgNCwgIDIsICA2LCAgMSwgIDUsICAzLCA3LCA4LCAxMiwgMTAsIDE0LCAgOSwgMTMsIDExLCAxNQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIGludCB4OyAgICAgICAgICAgICAgICAvKio8IHggY3Vyc29yIHBvc2l0aW9uIChwaXhlbHMpICovCisgICAgaW50IHk7ICAgICAgICAgICAgICAgIC8qKjwgeSBjdXJzb3IgcG9zaXRpb24gKHBpeGVscykgKi8KKyAgICBpbnQgc3g7ICAgICAgICAgICAgICAgLyoqPCBzYXZlZCB4IGN1cnNvciBwb3NpdGlvbiAocGl4ZWxzKSAqLworICAgIGludCBzeTsgICAgICAgICAgICAgICAvKio8IHNhdmVkIHkgY3Vyc29yIHBvc2l0aW9uIChwaXhlbHMpICovCisgICAgY29uc3QgdWludDhfdCogZm9udDsgIC8qKjwgZm9udCAqLworICAgIGludCBmb250X2hlaWdodDsgICAgICAvKio8IGZvbnQgaGVpZ2h0ICovCisgICAgaW50IGF0dHJpYnV0ZXM7ICAgICAgIC8qKjwgYXR0cmlidXRlIGZsYWdzICovCisgICAgaW50IGZnOyAgICAgICAgICAgICAgIC8qKjwgZm9yZWdyb3VuZCBjb2xvciAqLworICAgIGludCBiZzsgICAgICAgICAgICAgICAvKio8IGJhY2tncm91bmQgY29sb3IgKi8KKyAgICBpbnQgZmlyc3RfZnJhbWU7CisKKyAgICAvKiBhbnNpIHBhcnNlciBzdGF0ZSBtYWNoaW5lICovCisgICAgZW51bSB7CisgICAgICAgIFNUQVRFX05PUk1BTCA9IDAsCisgICAgICAgIFNUQVRFX0VTQ0FQRSwKKyAgICAgICAgU1RBVEVfQ09ERSwKKyAgICAgICAgU1RBVEVfTVVTSUNfUFJFQU1CTEUKKyAgICB9IHN0YXRlOworI2RlZmluZSBNQVhfTkJfQVJHUyA0CisgICAgaW50IGFyZ3NbTUFYX05CX0FSR1NdOworICAgIGludCBuYl9hcmdzOyAgICAgICAgICAvKio8IG51bWJlciBvZiBhcmd1bWVudHMgKG1heSBleGNlZWQgTUFYX05CX0FSR1MpICovCit9IEFuc2lDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFuc2lDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogZGVmYXVsdHMgKi8KKyAgICBzLT5mb250ICAgICAgICA9IGF2cHJpdl92Z2ExNl9mb250OworICAgIHMtPmZvbnRfaGVpZ2h0ID0gMTY7CisgICAgcy0+ZmcgICAgICAgICAgPSBERUZBVUxUX0ZHX0NPTE9SOworICAgIHMtPmJnICAgICAgICAgID0gREVGQVVMVF9CR19DT0xPUjsKKworICAgIGlmICghYXZjdHgtPndpZHRoIHx8ICFhdmN0eC0+aGVpZ2h0KSB7CisgICAgICAgIGludCByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgODAgPDwgMywgMjUgPDwgNCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wYWxldHRlKHVpbnQzMl90ICpwYWwpCit7CisgICAgaW50IHIsIGcsIGI7CisgICAgbWVtY3B5KHBhbCwgZmZfY2dhX3BhbGV0dGUsIDE2ICogNCk7CisgICAgcGFsICs9IDE2OworI2RlZmluZSBDT0xPUih4KSAoKHgpICogNDAgKyA1NSkKKyAgICBmb3IgKHIgPSAwOyByIDwgNjsgcisrKQorICAgICAgICBmb3IgKGcgPSAwOyBnIDwgNjsgZysrKQorICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IDY7IGIrKykKKyAgICAgICAgICAgICAgICAqcGFsKysgPSAweEZGMDAwMDAwIHwgKENPTE9SKHIpIDw8IDE2KSB8IChDT0xPUihnKSA8PCA4KSB8IENPTE9SKGIpOworI2RlZmluZSBHUkFZKHgpICgoeCkgKiAxMCArIDgpCisgICAgZm9yIChnID0gMDsgZyA8IDI0OyBnKyspCisgICAgICAgICpwYWwrKyA9IDB4RkYwMDAwMDAgfCAoR1JBWShnKSA8PCAxNikgfCAoR1JBWShnKSA8PCA4KSB8IEdSQVkoZyk7Cit9CisKK3N0YXRpYyB2b2lkIGhzY3JvbGwoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFuc2lDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGlmIChzLT55IDw9IGF2Y3R4LT5oZWlnaHQgLSAyKnMtPmZvbnRfaGVpZ2h0KSB7CisgICAgICAgIHMtPnkgKz0gcy0+Zm9udF9oZWlnaHQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpID0gMDsKKyAgICBmb3IgKDsgaSA8IGF2Y3R4LT5oZWlnaHQgLSBzLT5mb250X2hlaWdodDsgaSsrKQorICAgICAgICBtZW1jcHkocy0+ZnJhbWUtPmRhdGFbMF0gKyBpICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgcy0+ZnJhbWUtPmRhdGFbMF0gKyAoaSArIHMtPmZvbnRfaGVpZ2h0KSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCk7CisgICAgZm9yICg7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspCisgICAgICAgIG1lbXNldChzLT5mcmFtZS0+ZGF0YVswXSArIGkgKiBzLT5mcmFtZS0+bGluZXNpemVbMF0sCisgICAgICAgICAgICBERUZBVUxUX0JHX0NPTE9SLCBhdmN0eC0+d2lkdGgpOworfQorCitzdGF0aWMgdm9pZCBlcmFzZV9saW5lKEFWQ29kZWNDb250ZXh0ICogYXZjdHgsIGludCB4b2Zmc2V0LCBpbnQgeGxlbmd0aCkKK3sKKyAgICBBbnNpQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPmZvbnRfaGVpZ2h0OyBpKyspCisgICAgICAgIG1lbXNldChzLT5mcmFtZS0+ZGF0YVswXSArIChzLT55ICsgaSkqcy0+ZnJhbWUtPmxpbmVzaXplWzBdICsgeG9mZnNldCwKKyAgICAgICAgICAgIERFRkFVTFRfQkdfQ09MT1IsIHhsZW5ndGgpOworfQorCitzdGF0aWMgdm9pZCBlcmFzZV9zY3JlZW4oQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFuc2lDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKQorICAgICAgICBtZW1zZXQocy0+ZnJhbWUtPmRhdGFbMF0gKyBpICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdLCBERUZBVUxUX0JHX0NPTE9SLCBhdmN0eC0+d2lkdGgpOworICAgIHMtPnggPSBzLT55ID0gMDsKK30KKworLyoqCisgKiBEcmF3IGNoYXJhY3RlciB0byBzY3JlZW4KKyAqLworc3RhdGljIHZvaWQgZHJhd19jaGFyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGMpCit7CisgICAgQW5zaUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBmZyA9IHMtPmZnOworICAgIGludCBiZyA9IHMtPmJnOworCisgICAgaWYgKChzLT5hdHRyaWJ1dGVzICYgQVRUUl9CT0xEKSkKKyAgICAgICAgZmcgKz0gODsKKyAgICBpZiAoKHMtPmF0dHJpYnV0ZXMgJiBBVFRSX0JMSU5LKSkKKyAgICAgICAgYmcgKz0gODsKKyAgICBpZiAoKHMtPmF0dHJpYnV0ZXMgJiBBVFRSX1JFVkVSU0UpKQorICAgICAgICBGRlNXQVAoaW50LCBmZywgYmcpOworICAgIGlmICgocy0+YXR0cmlidXRlcyAmIEFUVFJfQ09OQ0VBTEVEKSkKKyAgICAgICAgZmcgPSBiZzsKKyAgICBmZl9kcmF3X3BjX2ZvbnQocy0+ZnJhbWUtPmRhdGFbMF0gKyBzLT55ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdICsgcy0+eCwKKyAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWUtPmxpbmVzaXplWzBdLCBzLT5mb250LCBzLT5mb250X2hlaWdodCwgYywgZmcsIGJnKTsKKyAgICBzLT54ICs9IEZPTlRfV0lEVEg7CisgICAgaWYgKHMtPnggPiBhdmN0eC0+d2lkdGggLSBGT05UX1dJRFRIKSB7CisgICAgICAgIHMtPnggPSAwOworICAgICAgICBoc2Nyb2xsKGF2Y3R4KTsKKyAgICB9Cit9CisKKy8qKgorICogRXhlY3V0ZSBBTlNJIGVzY2FwZSBjb2RlCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBleGVjdXRlX2NvZGUoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCwgaW50IGMpCit7CisgICAgQW5zaUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQsIGk7CisgICAgaW50IHdpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKworICAgIHN3aXRjaChjKSB7CisgICAgY2FzZSAnQSc6IC8vQ3Vyc29yIFVwCisgICAgICAgIHMtPnkgPSBGRk1BWChzLT55IC0gKHMtPm5iX2FyZ3MgPiAwID8gcy0+YXJnc1swXSpzLT5mb250X2hlaWdodCA6IHMtPmZvbnRfaGVpZ2h0KSwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ0InOiAvL0N1cnNvciBEb3duCisgICAgICAgIHMtPnkgPSBGRk1JTihzLT55ICsgKHMtPm5iX2FyZ3MgPiAwID8gcy0+YXJnc1swXSpzLT5mb250X2hlaWdodCA6IHMtPmZvbnRfaGVpZ2h0KSwgYXZjdHgtPmhlaWdodCAtIHMtPmZvbnRfaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnQyc6IC8vQ3Vyc29yIFJpZ2h0CisgICAgICAgIHMtPnggPSBGRk1JTihzLT54ICsgKHMtPm5iX2FyZ3MgPiAwID8gcy0+YXJnc1swXSpGT05UX1dJRFRIIDogRk9OVF9XSURUSCksIGF2Y3R4LT53aWR0aCAgLSBGT05UX1dJRFRIKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnRCc6IC8vQ3Vyc29yIExlZnQKKyAgICAgICAgcy0+eCA9IEZGTUFYKHMtPnggLSAocy0+bmJfYXJncyA+IDAgPyBzLT5hcmdzWzBdKkZPTlRfV0lEVEggOiBGT05UX1dJRFRIKSwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ0gnOiAvL0N1cnNvciBQb3NpdGlvbgorICAgIGNhc2UgJ2YnOiAvL0hvcml6b250YWwgYW5kIFZlcnRpY2FsIFBvc2l0aW9uCisgICAgICAgIHMtPnkgPSBzLT5uYl9hcmdzID4gMCA/IGF2X2NsaXAoKHMtPmFyZ3NbMF0gLSAxKSpzLT5mb250X2hlaWdodCwgMCwgYXZjdHgtPmhlaWdodCAtIHMtPmZvbnRfaGVpZ2h0KSA6IDA7CisgICAgICAgIHMtPnggPSBzLT5uYl9hcmdzID4gMSA/IGF2X2NsaXAoKHMtPmFyZ3NbMV0gLSAxKSpGT05UX1dJRFRILCAgICAgMCwgYXZjdHgtPndpZHRoICAtIEZPTlRfV0lEVEgpIDogMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6IC8vc2V0IGNyZWVuIG1vZGUKKyAgICBjYXNlICdsJzogLy9yZXNldCBzY3JlZW4gbW9kZQorICAgICAgICBpZiAocy0+bmJfYXJncyA8IDIpCisgICAgICAgICAgICBzLT5hcmdzWzBdID0gREVGQVVMVF9TQ1JFRU5fTU9ERTsKKyAgICAgICAgc3dpdGNoKHMtPmFyZ3NbMF0pIHsKKyAgICAgICAgY2FzZSAwOiBjYXNlIDE6IGNhc2UgNDogY2FzZSA1OiBjYXNlIDEzOiBjYXNlIDE5OiAvLzMyMHgyMDAgKDI1IHJvd3MpCisgICAgICAgICAgICBzLT5mb250ID0gYXZwcml2X2NnYV9mb250OworICAgICAgICAgICAgcy0+Zm9udF9oZWlnaHQgPSA4OworICAgICAgICAgICAgd2lkdGggID0gNDA8PDM7CisgICAgICAgICAgICBoZWlnaHQgPSAyNTw8MzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IGNhc2UgMzogLy82NDB4NDAwICgyNSByb3dzKQorICAgICAgICAgICAgcy0+Zm9udCA9IGF2cHJpdl92Z2ExNl9mb250OworICAgICAgICAgICAgcy0+Zm9udF9oZWlnaHQgPSAxNjsKKyAgICAgICAgICAgIHdpZHRoICA9IDgwPDwzOworICAgICAgICAgICAgaGVpZ2h0ID0gMjU8PDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OiBjYXNlIDE0OiAvLzY0MHgyMDAgKDI1IHJvd3MpCisgICAgICAgICAgICBzLT5mb250ID0gYXZwcml2X2NnYV9mb250OworICAgICAgICAgICAgcy0+Zm9udF9oZWlnaHQgPSA4OworICAgICAgICAgICAgd2lkdGggID0gODA8PDM7CisgICAgICAgICAgICBoZWlnaHQgPSAyNTw8MzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6IC8vc2V0IGxpbmUgd3JhcHBpbmcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE1OiBjYXNlIDE2OiAvLzY0MHgzNTAgKDQzIHJvd3MpCisgICAgICAgICAgICBzLT5mb250ID0gYXZwcml2X2NnYV9mb250OworICAgICAgICAgICAgcy0+Zm9udF9oZWlnaHQgPSA4OworICAgICAgICAgICAgd2lkdGggID0gODA8PDM7CisgICAgICAgICAgICBoZWlnaHQgPSA0Mzw8MzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3OiBjYXNlIDE4OiAvLzY0MHg0ODAgKDYwIHJvd3MpCisgICAgICAgICAgICBzLT5mb250ID0gYXZwcml2X2NnYV9mb250OworICAgICAgICAgICAgcy0+Zm9udF9oZWlnaHQgPSA4OworICAgICAgICAgICAgd2lkdGggID0gODA8PDM7CisgICAgICAgICAgICBoZWlnaHQgPSA2MDw8NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiVW5zdXBwb3J0ZWQgc2NyZWVuIG1vZGUiKTsKKyAgICAgICAgfQorICAgICAgICBzLT54ID0gYXZfY2xpcChzLT54LCAwLCB3aWR0aCAgLSBGT05UX1dJRFRIKTsKKyAgICAgICAgcy0+eSA9IGF2X2NsaXAocy0+eSwgMCwgaGVpZ2h0IC0gcy0+Zm9udF9oZWlnaHQpOworICAgICAgICBpZiAod2lkdGggIT0gYXZjdHgtPndpZHRoIHx8IGhlaWdodCAhPSBhdmN0eC0+aGVpZ2h0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5mcmFtZSk7CisgICAgICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBzLT5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBzLT5mcmFtZS0+cGljdF90eXBlICAgICAgICAgICA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICAgICAgcy0+ZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgICAgICAgICAgc2V0X3BhbGV0dGUoKHVpbnQzMl90ICopcy0+ZnJhbWUtPmRhdGFbMV0pOworICAgICAgICAgICAgZXJhc2Vfc2NyZWVuKGF2Y3R4KTsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICdsJykgeworICAgICAgICAgICAgZXJhc2Vfc2NyZWVuKGF2Y3R4KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICdKJzogLy9FcmFzZSBpbiBQYWdlCisgICAgICAgIHN3aXRjaCAocy0+YXJnc1swXSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBlcmFzZV9saW5lKGF2Y3R4LCBzLT54LCBhdmN0eC0+d2lkdGggLSBzLT54KTsKKyAgICAgICAgICAgIGlmIChzLT55IDwgYXZjdHgtPmhlaWdodCAtIHMtPmZvbnRfaGVpZ2h0KQorICAgICAgICAgICAgICAgIG1lbXNldChzLT5mcmFtZS0+ZGF0YVswXSArIChzLT55ICsgcy0+Zm9udF9oZWlnaHQpKnMtPmZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9CR19DT0xPUiwgKGF2Y3R4LT5oZWlnaHQgLSBzLT55IC0gcy0+Zm9udF9oZWlnaHQpKnMtPmZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZXJhc2VfbGluZShhdmN0eCwgMCwgcy0+eCk7CisgICAgICAgICAgICBpZiAocy0+eSA+IDApCisgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmZyYW1lLT5kYXRhWzBdLCBERUZBVUxUX0JHX0NPTE9SLCBzLT55ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBlcmFzZV9zY3JlZW4oYXZjdHgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ0snOiAvL0VyYXNlIGluIExpbmUKKyAgICAgICAgc3dpdGNoKHMtPmFyZ3NbMF0pIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZXJhc2VfbGluZShhdmN0eCwgcy0+eCwgYXZjdHgtPndpZHRoIC0gcy0+eCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZXJhc2VfbGluZShhdmN0eCwgMCwgcy0+eCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZXJhc2VfbGluZShhdmN0eCwgMCwgYXZjdHgtPndpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzogLy9TZWxlY3QgR3JhcGhpY3MgUmVuZGl0aW9uCisgICAgICAgIGlmIChzLT5uYl9hcmdzID09IDApIHsKKyAgICAgICAgICAgIHMtPm5iX2FyZ3MgPSAxOworICAgICAgICAgICAgcy0+YXJnc1swXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGTUlOKHMtPm5iX2FyZ3MsIE1BWF9OQl9BUkdTKTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbSA9IHMtPmFyZ3NbaV07CisgICAgICAgICAgICBpZiAobSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcy0+YXR0cmlidXRlcyA9IDA7CisgICAgICAgICAgICAgICAgcy0+ZmcgPSBERUZBVUxUX0ZHX0NPTE9SOworICAgICAgICAgICAgICAgIHMtPmJnID0gREVGQVVMVF9CR19DT0xPUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobSA9PSAxIHx8IG0gPT0gMiB8fCBtID09IDQgfHwgbSA9PSA1IHx8IG0gPT0gNyB8fCBtID09IDgpIHsKKyAgICAgICAgICAgICAgICBzLT5hdHRyaWJ1dGVzIHw9IDEgPDwgKG0gLSAxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobSA+PSAzMCAmJiBtIDw9IDM3KSB7CisgICAgICAgICAgICAgICAgcy0+ZmcgPSBhbnNpX3RvX2NnYVttIC0gMzBdOworICAgICAgICAgICAgfSBlbHNlIGlmIChtID09IDM4ICYmIGkgKyAyIDwgRkZNSU4ocy0+bmJfYXJncywgTUFYX05CX0FSR1MpICYmIHMtPmFyZ3NbaSArIDFdID09IDUgJiYgcy0+YXJnc1tpICsgMl0gPCAyNTYpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBzLT5hcmdzW2kgKyAyXTsKKyAgICAgICAgICAgICAgICBzLT5mZyA9IGluZGV4IDwgMTYgPyBhbnNpX3RvX2NnYVtpbmRleF0gOiBpbmRleDsKKyAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG0gPT0gMzkpIHsKKyAgICAgICAgICAgICAgICBzLT5mZyA9IGFuc2lfdG9fY2dhW0RFRkFVTFRfRkdfQ09MT1JdOworICAgICAgICAgICAgfSBlbHNlIGlmIChtID49IDQwICYmIG0gPD0gNDcpIHsKKyAgICAgICAgICAgICAgICBzLT5iZyA9IGFuc2lfdG9fY2dhW20gLSA0MF07CisgICAgICAgICAgICB9IGVsc2UgaWYgKG0gPT0gNDggJiYgaSArIDIgPCBGRk1JTihzLT5uYl9hcmdzLCBNQVhfTkJfQVJHUykgJiYgcy0+YXJnc1tpICsgMV0gPT0gNSAmJiBzLT5hcmdzW2kgKyAyXSA8IDI1NikgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHMtPmFyZ3NbaSArIDJdOworICAgICAgICAgICAgICAgIHMtPmJnID0gaW5kZXggPCAxNiA/IGFuc2lfdG9fY2dhW2luZGV4XSA6IGluZGV4OworICAgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobSA9PSA0OSkgeworICAgICAgICAgICAgICAgIHMtPmZnID0gYW5zaV90b19jZ2FbREVGQVVMVF9CR19DT0xPUl07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIlVuc3VwcG9ydGVkIHJlbmRpdGlvbiBwYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICduJzogLy9EZXZpY2UgU3RhdHVzIFJlcG9ydAorICAgIGNhc2UgJ1InOiAvL3JlcG9ydCBjdXJyZW50IGxpbmUgYW5kIGNvbHVtbgorICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6IC8vU2F2ZSBDdXJzb3IgUG9zaXRpb24KKyAgICAgICAgcy0+c3ggPSBzLT54OworICAgICAgICBzLT5zeSA9IHMtPnk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3UnOiAvL1Jlc3RvcmUgQ3Vyc29yIFBvc2l0aW9uCisgICAgICAgIHMtPnggPSBhdl9jbGlwKHMtPnN4LCAwLCBhdmN0eC0+d2lkdGggIC0gRk9OVF9XSURUSCk7CisgICAgICAgIHMtPnkgPSBhdl9jbGlwKHMtPnN5LCAwLCBhdmN0eC0+aGVpZ2h0IC0gcy0+Zm9udF9oZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJVbmtub3duIGVzY2FwZSBjb2RlIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzLT54ID0gYXZfY2xpcChzLT54LCAwLCBhdmN0eC0+d2lkdGggIC0gRk9OVF9XSURUSCk7CisgICAgcy0+eSA9IGF2X2NsaXAocy0+eSwgMCwgYXZjdHgtPmhlaWdodCAtIHMtPmZvbnRfaGVpZ2h0KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBbnNpQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgY29uc3QgdWludDhfdCAqYnVmX2VuZCAgID0gYnVmK2J1Zl9zaXplOworICAgIGludCByZXQsIGksIGNvdW50OworCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICghYXZjdHgtPmZyYW1lX251bWJlcikgeworICAgICAgICBmb3IgKGk9MDsgaTxhdmN0eC0+aGVpZ2h0OyBpKyspCisgICAgICAgICAgICBtZW1zZXQocy0+ZnJhbWUtPmRhdGFbMF0rIGkqcy0+ZnJhbWUtPmxpbmVzaXplWzBdLCAwLCBhdmN0eC0+d2lkdGgpOworICAgICAgICBtZW1zZXQocy0+ZnJhbWUtPmRhdGFbMV0sIDAsIEFWUEFMRVRURV9TSVpFKTsKKyAgICB9CisKKyAgICBzLT5mcmFtZS0+cGljdF90eXBlICAgICAgICAgICA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIHMtPmZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKKyAgICBzZXRfcGFsZXR0ZSgodWludDMyX3QgKilzLT5mcmFtZS0+ZGF0YVsxXSk7CisgICAgaWYgKCFzLT5maXJzdF9mcmFtZSkgeworICAgICAgICBlcmFzZV9zY3JlZW4oYXZjdHgpOworICAgICAgICBzLT5maXJzdF9mcmFtZSA9IDE7CisgICAgfQorCisgICAgd2hpbGUoYnVmIDwgYnVmX2VuZCkgeworICAgICAgICBzd2l0Y2gocy0+c3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9OT1JNQUw6CisgICAgICAgICAgICBzd2l0Y2ggKGJ1ZlswXSkgeworICAgICAgICAgICAgY2FzZSAweDAwOiAvL05VTAorICAgICAgICAgICAgY2FzZSAweDA3OiAvL0JFTAorICAgICAgICAgICAgY2FzZSAweDFBOiAvL1NVQgorICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDA4OiAvL0JTCisgICAgICAgICAgICAgICAgcy0+eCA9IEZGTUFYKHMtPnggLSAxLCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwOTogLy9IVAorICAgICAgICAgICAgICAgIGkgPSBzLT54IC8gRk9OVF9XSURUSDsKKyAgICAgICAgICAgICAgICBjb3VudCA9ICgoaSArIDgpICYgfjcpIC0gaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZHJhd19jaGFyKGF2Y3R4LCAnICcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDBBOiAvL0xGCisgICAgICAgICAgICAgICAgaHNjcm9sbChhdmN0eCk7CisgICAgICAgICAgICBjYXNlIDB4MEQ6IC8vQ1IKKyAgICAgICAgICAgICAgICBzLT54ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwQzogLy9GRgorICAgICAgICAgICAgICAgIGVyYXNlX3NjcmVlbihhdmN0eCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MUI6IC8vRVNDCisgICAgICAgICAgICAgICAgcy0+c3RhdGUgPSBTVEFURV9FU0NBUEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGRyYXdfY2hhcihhdmN0eCwgYnVmWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX0VTQ0FQRToKKyAgICAgICAgICAgIGlmIChidWZbMF0gPT0gJ1snKSB7CisgICAgICAgICAgICAgICAgcy0+c3RhdGUgICA9IFNUQVRFX0NPREU7CisgICAgICAgICAgICAgICAgcy0+bmJfYXJncyA9IDA7CisgICAgICAgICAgICAgICAgcy0+YXJnc1swXSA9IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IFNUQVRFX05PUk1BTDsKKyAgICAgICAgICAgICAgICBkcmF3X2NoYXIoYXZjdHgsIDB4MUIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfQ09ERToKKyAgICAgICAgICAgIHN3aXRjaChidWZbMF0pIHsKKyAgICAgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKyAgICAgICAgICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKyAgICAgICAgICAgICAgICBpZiAocy0+bmJfYXJncyA8IE1BWF9OQl9BUkdTICYmIHMtPmFyZ3Nbcy0+bmJfYXJnc10gPCA2NTUzKQorICAgICAgICAgICAgICAgICAgICBzLT5hcmdzW3MtPm5iX2FyZ3NdID0gRkZNQVgocy0+YXJnc1tzLT5uYl9hcmdzXSwgMCkgKiAxMCArIGJ1ZlswXSAtICcwJzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJzsnOgorICAgICAgICAgICAgICAgIHMtPm5iX2FyZ3MrKzsKKyAgICAgICAgICAgICAgICBpZiAocy0+bmJfYXJncyA8IE1BWF9OQl9BUkdTKQorICAgICAgICAgICAgICAgICAgICBzLT5hcmdzW3MtPm5iX2FyZ3NdID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gU1RBVEVfTVVTSUNfUFJFQU1CTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc9JzogY2FzZSAnPyc6CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzLT5uYl9hcmdzID4gTUFYX05CX0FSR1MpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJhcmdzIG92ZXJmbG93ICglaSlcbiIsIHMtPm5iX2FyZ3MpOworICAgICAgICAgICAgICAgIGlmIChzLT5uYl9hcmdzIDwgTUFYX05CX0FSR1MgJiYgcy0+YXJnc1tzLT5uYl9hcmdzXSA+PSAwKQorICAgICAgICAgICAgICAgICAgICBzLT5uYl9hcmdzKys7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBleGVjdXRlX2NvZGUoYXZjdHgsIGJ1ZlswXSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IFNUQVRFX05PUk1BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX01VU0lDX1BSRUFNQkxFOgorICAgICAgICAgICAgaWYgKGJ1ZlswXSA9PSAweDBFIHx8IGJ1ZlswXSA9PSAweDFCKQorICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gU1RBVEVfTk9STUFMOworICAgICAgICAgICAgLyogaWdub3JlIG11c2ljIGRhdGEgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJ1ZisrOworICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQW5zaUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2Fuc2lfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYW5zaSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTQ0lJL0FOU0kgYXJ0IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FOU0ksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFuc2lDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXBlZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcGVkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODNiN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXBlZGVjLmMKQEAgLTAsMCArMSwxNTk1IEBACisvKgorICogTW9ua2V5J3MgQXVkaW8gbG9zc2xlc3MgYXVkaW8gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IEJlbmphbWluIFpvcmVzIDxiZW5AZ2VleGJveC5vcmc+CisgKiAgYmFzZWQgdXBvbiBsaWJkZW1hYyBmcm9tIERhdmUgQ2hhcG1hbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibG9zc2xlc3NfYXVkaW9kc3AuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnN3YXBkc3AuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInVuYXJ5LmgiCisKKy8qKgorICogQGZpbGUKKyAqIE1vbmtleSdzIEF1ZGlvIGxvc3NsZXNzIGF1ZGlvIGRlY29kZXIKKyAqLworCisjZGVmaW5lIE1BWF9DSEFOTkVMUyAgICAgICAgMgorI2RlZmluZSBNQVhfQllURVNQRVJTQU1QTEUgIDMKKworI2RlZmluZSBBUEVfRlJBTUVDT0RFX01PTk9fU0lMRU5DRSAgICAxCisjZGVmaW5lIEFQRV9GUkFNRUNPREVfU1RFUkVPX1NJTEVOQ0UgIDMKKyNkZWZpbmUgQVBFX0ZSQU1FQ09ERV9QU0VVRE9fU1RFUkVPICAgNAorCisjZGVmaW5lIEhJU1RPUllfU0laRSA1MTIKKyNkZWZpbmUgUFJFRElDVE9SX09SREVSIDgKKy8qKiBUb3RhbCBzaXplIG9mIGFsbCBwcmVkaWN0b3IgaGlzdG9yaWVzICovCisjZGVmaW5lIFBSRURJQ1RPUl9TSVpFIDUwCisKKyNkZWZpbmUgWURFTEFZQSAoMTggKyBQUkVESUNUT1JfT1JERVIqNCkKKyNkZWZpbmUgWURFTEFZQiAoMTggKyBQUkVESUNUT1JfT1JERVIqMykKKyNkZWZpbmUgWERFTEFZQSAoMTggKyBQUkVESUNUT1JfT1JERVIqMikKKyNkZWZpbmUgWERFTEFZQiAoMTggKyBQUkVESUNUT1JfT1JERVIpCisKKyNkZWZpbmUgWUFEQVBUQ09FRkZTQSAxOAorI2RlZmluZSBYQURBUFRDT0VGRlNBIDE0CisjZGVmaW5lIFlBREFQVENPRUZGU0IgMTAKKyNkZWZpbmUgWEFEQVBUQ09FRkZTQiA1CisKKy8qKgorICogUG9zc2libGUgY29tcHJlc3Npb24gbGV2ZWxzCisgKiBAeworICovCitlbnVtIEFQRUNvbXByZXNzaW9uTGV2ZWwgeworICAgIENPTVBSRVNTSU9OX0xFVkVMX0ZBU1QgICAgICAgPSAxMDAwLAorICAgIENPTVBSRVNTSU9OX0xFVkVMX05PUk1BTCAgICAgPSAyMDAwLAorICAgIENPTVBSRVNTSU9OX0xFVkVMX0hJR0ggICAgICAgPSAzMDAwLAorICAgIENPTVBSRVNTSU9OX0xFVkVMX0VYVFJBX0hJR0ggPSA0MDAwLAorICAgIENPTVBSRVNTSU9OX0xFVkVMX0lOU0FORSAgICAgPSA1MDAwCit9OworLyoqIEB9ICovCisKKyNkZWZpbmUgQVBFX0ZJTFRFUl9MRVZFTFMgMworCisvKiogRmlsdGVyIG9yZGVycyBkZXBlbmRpbmcgb24gY29tcHJlc3Npb24gbGV2ZWwgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhcGVfZmlsdGVyX29yZGVyc1s1XVtBUEVfRklMVEVSX0xFVkVMU10gPSB7CisgICAgeyAgMCwgICAwLCAgICAwIH0sCisgICAgeyAxNiwgICAwLCAgICAwIH0sCisgICAgeyA2NCwgICAwLCAgICAwIH0sCisgICAgeyAzMiwgMjU2LCAgICAwIH0sCisgICAgeyAxNiwgMjU2LCAxMjgwIH0KK307CisKKy8qKiBGaWx0ZXIgZnJhY3Rpb24gYml0cyBkZXBlbmRpbmcgb24gY29tcHJlc3Npb24gbGV2ZWwgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGFwZV9maWx0ZXJfZnJhY2JpdHNbNV1bQVBFX0ZJTFRFUl9MRVZFTFNdID0geworICAgIHsgIDAsICAwLCAgMCB9LAorICAgIHsgMTEsICAwLCAgMCB9LAorICAgIHsgMTEsICAwLCAgMCB9LAorICAgIHsgMTAsIDEzLCAgMCB9LAorICAgIHsgMTEsIDEzLCAxNSB9Cit9OworCisKKy8qKiBGaWx0ZXJzIGFwcGxpZWQgdG8gdGhlIGRlY29kZWQgZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgQVBFRmlsdGVyIHsKKyAgICBpbnQxNl90ICpjb2VmZnM7ICAgICAgICAvLy88IGFjdHVhbCBjb2VmZmljaWVudHMgdXNlZCBpbiBmaWx0ZXJpbmcKKyAgICBpbnQxNl90ICphZGFwdGNvZWZmczsgICAvLy88IGFkYXB0aXZlIGZpbHRlciBjb2VmZmljaWVudHMgdXNlZCBmb3IgY29ycmVjdGluZyBvZiBhY3R1YWwgZmlsdGVyIGNvZWZmaWNpZW50cworICAgIGludDE2X3QgKmhpc3RvcnlidWZmZXI7IC8vLzwgZmlsdGVyIG1lbW9yeQorICAgIGludDE2X3QgKmRlbGF5OyAgICAgICAgIC8vLzwgZmlsdGVyZWQgdmFsdWVzCisKKyAgICBpbnQgYXZnOworfSBBUEVGaWx0ZXI7CisKK3R5cGVkZWYgc3RydWN0IEFQRVJpY2UgeworICAgIHVpbnQzMl90IGs7CisgICAgdWludDMyX3Qga3N1bTsKK30gQVBFUmljZTsKKwordHlwZWRlZiBzdHJ1Y3QgQVBFUmFuZ2Vjb2RlciB7CisgICAgdWludDMyX3QgbG93OyAgICAgICAgICAgLy8vPCBsb3cgZW5kIG9mIGludGVydmFsCisgICAgdWludDMyX3QgcmFuZ2U7ICAgICAgICAgLy8vPCBsZW5ndGggb2YgaW50ZXJ2YWwKKyAgICB1aW50MzJfdCBoZWxwOyAgICAgICAgICAvLy88IGJ5dGVzX3RvX2ZvbGxvdyByZXNwLiBpbnRlcm1lZGlhdGUgdmFsdWUKKyAgICB1bnNpZ25lZCBpbnQgYnVmZmVyOyAgICAvLy88IGJ1ZmZlciBmb3IgaW5wdXQvb3V0cHV0Cit9IEFQRVJhbmdlY29kZXI7CisKKy8qKiBGaWx0ZXIgaGlzdG9yaWVzICovCit0eXBlZGVmIHN0cnVjdCBBUEVQcmVkaWN0b3IgeworICAgIGludDMyX3QgKmJ1ZjsKKworICAgIGludDMyX3QgbGFzdEFbMl07CisKKyAgICBpbnQzMl90IGZpbHRlckFbMl07CisgICAgaW50MzJfdCBmaWx0ZXJCWzJdOworCisgICAgaW50MzJfdCBjb2VmZnNBWzJdWzRdOyAgLy8vPCBhZGFwdGlvbiBjb2VmZmljaWVudHMKKyAgICBpbnQzMl90IGNvZWZmc0JbMl1bNV07ICAvLy88IGFkYXB0aW9uIGNvZWZmaWNpZW50cworICAgIGludDMyX3QgaGlzdG9yeWJ1ZmZlcltISVNUT1JZX1NJWkUgKyBQUkVESUNUT1JfU0laRV07CisKKyAgICB1bnNpZ25lZCBpbnQgc2FtcGxlX3BvczsKK30gQVBFUHJlZGljdG9yOworCisvKiogRGVjb2RlciBjb250ZXh0ICovCit0eXBlZGVmIHN0cnVjdCBBUEVDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2xhc3MgZm9yIEFWT3B0aW9ucworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBCc3dhcERTUENvbnRleHQgYmRzcDsKKyAgICBMTEF1ZERTUENvbnRleHQgYWRzcDsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IHNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHNhbXBsZXMgbGVmdCB0byBkZWNvZGUgaW4gY3VycmVudCBmcmFtZQorICAgIGludCBicHM7CisKKyAgICBpbnQgZmlsZXZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY29kZWMgdmVyc2lvbiwgdmVyeSBpbXBvcnRhbnQgaW4gZGVjb2RpbmcgcHJvY2VzcworICAgIGludCBjb21wcmVzc2lvbl9sZXZlbDsgICAgICAgICAgICAgICAgICAgLy8vPCBjb21wcmVzc2lvbiBsZXZlbHMKKyAgICBpbnQgZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgd2hpY2ggZmlsdGVyIHNldCB0byB1c2UgKGNhbGN1bGF0ZWQgZnJvbSBjb21wcmVzc2lvbiBsZXZlbCkKKyAgICBpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZ2xvYmFsIGRlY29kZXIgZmxhZ3MKKworICAgIHVpbnQzMl90IENSQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmcmFtZSBDUkMKKyAgICBpbnQgZnJhbWVmbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZnJhbWUgZmxhZ3MKKyAgICBBUEVQcmVkaWN0b3IgcHJlZGljdG9yOyAgICAgICAgICAgICAgICAgIC8vLzwgcHJlZGljdG9yIHVzZWQgZm9yIGZpbmFsIHJlY29uc3RydWN0aW9uCisKKyAgICBpbnQzMl90ICpkZWNvZGVkX2J1ZmZlcjsKKyAgICBpbnQgZGVjb2RlZF9zaXplOworICAgIGludDMyX3QgKmRlY29kZWRbTUFYX0NIQU5ORUxTXTsgICAgICAgICAgLy8vPCBkZWNvZGVkIGRhdGEgZm9yIGVhY2ggY2hhbm5lbAorICAgIGludCBibG9ja3NfcGVyX2xvb3A7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXhpbXVtIG51bWJlciBvZiBzYW1wbGVzIHRvIGRlY29kZSBmb3IgZWFjaCBjYWxsCisKKyAgICBpbnQxNl90KiBmaWx0ZXJidWZbQVBFX0ZJTFRFUl9MRVZFTFNdOyAgIC8vLzwgZmlsdGVyIG1lbW9yeQorCisgICAgQVBFUmFuZ2Vjb2RlciByYzsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHJhbmdlY29kZXIgdXNlZCB0byBkZWNvZGUgYWN0dWFsIHZhbHVlcworICAgIEFQRVJpY2UgcmljZVg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCByaWNlIGNvZGUgcGFyYW1ldGVycyBmb3IgdGhlIHNlY29uZCBjaGFubmVsCisgICAgQVBFUmljZSByaWNlWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHJpY2UgY29kZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmlyc3QgY2hhbm5lbAorICAgIEFQRUZpbHRlciBmaWx0ZXJzW0FQRV9GSUxURVJfTEVWRUxTXVsyXTsgLy8vPCBmaWx0ZXJzIHVzZWQgZm9yIHJlY29uc3RydWN0aW9uCisgICAgR2V0Qml0Q29udGV4dCBnYjsKKworICAgIHVpbnQ4X3QgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGZyYW1lIGRhdGEKKyAgICB1aW50OF90ICpkYXRhX2VuZDsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZnJhbWUgZGF0YSBlbmQKKyAgICBpbnQgZGF0YV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZnJhbWUgZGF0YSBhbGxvY2F0ZWQgc2l6ZQorICAgIGNvbnN0IHVpbnQ4X3QgKnB0cjsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IHBvc2l0aW9uIGluIGZyYW1lIGRhdGEKKworICAgIGludCBlcnJvcjsKKworICAgIHZvaWQgKCplbnRyb3B5X2RlY29kZV9tb25vKShzdHJ1Y3QgQVBFQ29udGV4dCAqY3R4LCBpbnQgYmxvY2tzdG9kZWNvZGUpOworICAgIHZvaWQgKCplbnRyb3B5X2RlY29kZV9zdGVyZW8pKHN0cnVjdCBBUEVDb250ZXh0ICpjdHgsIGludCBibG9ja3N0b2RlY29kZSk7CisgICAgdm9pZCAoKnByZWRpY3Rvcl9kZWNvZGVfbW9ubykoc3RydWN0IEFQRUNvbnRleHQgKmN0eCwgaW50IGNvdW50KTsKKyAgICB2b2lkICgqcHJlZGljdG9yX2RlY29kZV9zdGVyZW8pKHN0cnVjdCBBUEVDb250ZXh0ICpjdHgsIGludCBjb3VudCk7Cit9IEFQRUNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIGFwZV9hcHBseV9maWx0ZXJzKEFQRUNvbnRleHQgKmN0eCwgaW50MzJfdCAqZGVjb2RlZDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpkZWNvZGVkMSwgaW50IGNvdW50KTsKKworc3RhdGljIHZvaWQgZW50cm9weV9kZWNvZGVfbW9ub18wMDAwKEFQRUNvbnRleHQgKmN0eCwgaW50IGJsb2Nrc3RvZGVjb2RlKTsKK3N0YXRpYyB2b2lkIGVudHJvcHlfZGVjb2RlX3N0ZXJlb18wMDAwKEFQRUNvbnRleHQgKmN0eCwgaW50IGJsb2Nrc3RvZGVjb2RlKTsKK3N0YXRpYyB2b2lkIGVudHJvcHlfZGVjb2RlX21vbm9fMzg2MChBUEVDb250ZXh0ICpjdHgsIGludCBibG9ja3N0b2RlY29kZSk7CitzdGF0aWMgdm9pZCBlbnRyb3B5X2RlY29kZV9zdGVyZW9fMzg2MChBUEVDb250ZXh0ICpjdHgsIGludCBibG9ja3N0b2RlY29kZSk7CitzdGF0aWMgdm9pZCBlbnRyb3B5X2RlY29kZV9tb25vXzM5MDAoQVBFQ29udGV4dCAqY3R4LCBpbnQgYmxvY2tzdG9kZWNvZGUpOworc3RhdGljIHZvaWQgZW50cm9weV9kZWNvZGVfc3RlcmVvXzM5MDAoQVBFQ29udGV4dCAqY3R4LCBpbnQgYmxvY2tzdG9kZWNvZGUpOworc3RhdGljIHZvaWQgZW50cm9weV9kZWNvZGVfc3RlcmVvXzM5MzAoQVBFQ29udGV4dCAqY3R4LCBpbnQgYmxvY2tzdG9kZWNvZGUpOworc3RhdGljIHZvaWQgZW50cm9weV9kZWNvZGVfbW9ub18zOTkwKEFQRUNvbnRleHQgKmN0eCwgaW50IGJsb2Nrc3RvZGVjb2RlKTsKK3N0YXRpYyB2b2lkIGVudHJvcHlfZGVjb2RlX3N0ZXJlb18zOTkwKEFQRUNvbnRleHQgKmN0eCwgaW50IGJsb2Nrc3RvZGVjb2RlKTsKKworc3RhdGljIHZvaWQgcHJlZGljdG9yX2RlY29kZV9tb25vXzM4MDAoQVBFQ29udGV4dCAqY3R4LCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgcHJlZGljdG9yX2RlY29kZV9zdGVyZW9fMzgwMChBUEVDb250ZXh0ICpjdHgsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCBwcmVkaWN0b3JfZGVjb2RlX21vbm9fMzkzMChBUEVDb250ZXh0ICpjdHgsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCBwcmVkaWN0b3JfZGVjb2RlX3N0ZXJlb18zOTMwKEFQRUNvbnRleHQgKmN0eCwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIHByZWRpY3Rvcl9kZWNvZGVfbW9ub18zOTUwKEFQRUNvbnRleHQgKmN0eCwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIHByZWRpY3Rvcl9kZWNvZGVfc3RlcmVvXzM5NTAoQVBFQ29udGV4dCAqY3R4LCBpbnQgY291bnQpOworCitzdGF0aWMgYXZfY29sZCBpbnQgYXBlX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQVBFQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVBFX0ZJTFRFUl9MRVZFTFM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJnMtPmZpbHRlcmJ1ZltpXSk7CisKKyAgICBhdl9mcmVlcCgmcy0+ZGVjb2RlZF9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5kYXRhKTsKKyAgICBzLT5kZWNvZGVkX3NpemUgPSBzLT5kYXRhX3NpemUgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhcGVfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFQRUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAhPSA2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IGV4dHJhZGF0YVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBtb25vIGFuZCBzdGVyZW8gaXMgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcy0+YnBzID0gYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICBzd2l0Y2ggKHMtPmJwcykgeworICAgIGNhc2UgODoKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1U4UDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNlA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMzJQOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgYml0cyBwZXIgY29kZWQgc2FtcGxlIiwgcy0+YnBzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBzLT5hdmN0eCAgICAgICAgICAgICA9IGF2Y3R4OworICAgIHMtPmNoYW5uZWxzICAgICAgICAgID0gYXZjdHgtPmNoYW5uZWxzOworICAgIHMtPmZpbGV2ZXJzaW9uICAgICAgID0gQVZfUkwxNihhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBzLT5jb21wcmVzc2lvbl9sZXZlbCA9IEFWX1JMMTYoYXZjdHgtPmV4dHJhZGF0YSArIDIpOworICAgIHMtPmZsYWdzICAgICAgICAgICAgID0gQVZfUkwxNihhdmN0eC0+ZXh0cmFkYXRhICsgNCk7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkNvbXByZXNzaW9uIExldmVsOiAlZCAtIEZsYWdzOiAlZFxuIiwKKyAgICAgICAgICAgcy0+Y29tcHJlc3Npb25fbGV2ZWwsIHMtPmZsYWdzKTsKKyAgICBpZiAocy0+Y29tcHJlc3Npb25fbGV2ZWwgJSAxMDAwIHx8IHMtPmNvbXByZXNzaW9uX2xldmVsID4gQ09NUFJFU1NJT05fTEVWRUxfSU5TQU5FIHx8CisgICAgICAgICFzLT5jb21wcmVzc2lvbl9sZXZlbCB8fAorICAgICAgICAocy0+ZmlsZXZlcnNpb24gPCAzOTMwICYmIHMtPmNvbXByZXNzaW9uX2xldmVsID09IENPTVBSRVNTSU9OX0xFVkVMX0lOU0FORSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgY29tcHJlc3Npb24gbGV2ZWwgJWRcbiIsCisgICAgICAgICAgICAgICBzLT5jb21wcmVzc2lvbl9sZXZlbCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzLT5mc2V0ID0gcy0+Y29tcHJlc3Npb25fbGV2ZWwgLyAxMDAwIC0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVBFX0ZJTFRFUl9MRVZFTFM7IGkrKykgeworICAgICAgICBpZiAoIWFwZV9maWx0ZXJfb3JkZXJzW3MtPmZzZXRdW2ldKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIEZGX0FMTE9DX09SX0dPVE8oYXZjdHgsIHMtPmZpbHRlcmJ1ZltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYXBlX2ZpbHRlcl9vcmRlcnNbcy0+ZnNldF1baV0gKiAzICsgSElTVE9SWV9TSVpFKSAqIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2FsbG9jX2ZhaWwpOworICAgIH0KKworICAgIGlmIChzLT5maWxldmVyc2lvbiA8IDM4NjApIHsKKyAgICAgICAgcy0+ZW50cm9weV9kZWNvZGVfbW9ubyAgID0gZW50cm9weV9kZWNvZGVfbW9ub18wMDAwOworICAgICAgICBzLT5lbnRyb3B5X2RlY29kZV9zdGVyZW8gPSBlbnRyb3B5X2RlY29kZV9zdGVyZW9fMDAwMDsKKyAgICB9IGVsc2UgaWYgKHMtPmZpbGV2ZXJzaW9uIDwgMzkwMCkgeworICAgICAgICBzLT5lbnRyb3B5X2RlY29kZV9tb25vICAgPSBlbnRyb3B5X2RlY29kZV9tb25vXzM4NjA7CisgICAgICAgIHMtPmVudHJvcHlfZGVjb2RlX3N0ZXJlbyA9IGVudHJvcHlfZGVjb2RlX3N0ZXJlb18zODYwOworICAgIH0gZWxzZSBpZiAocy0+ZmlsZXZlcnNpb24gPCAzOTMwKSB7CisgICAgICAgIHMtPmVudHJvcHlfZGVjb2RlX21vbm8gICA9IGVudHJvcHlfZGVjb2RlX21vbm9fMzkwMDsKKyAgICAgICAgcy0+ZW50cm9weV9kZWNvZGVfc3RlcmVvID0gZW50cm9weV9kZWNvZGVfc3RlcmVvXzM5MDA7CisgICAgfSBlbHNlIGlmIChzLT5maWxldmVyc2lvbiA8IDM5OTApIHsKKyAgICAgICAgcy0+ZW50cm9weV9kZWNvZGVfbW9ubyAgID0gZW50cm9weV9kZWNvZGVfbW9ub18zOTAwOworICAgICAgICBzLT5lbnRyb3B5X2RlY29kZV9zdGVyZW8gPSBlbnRyb3B5X2RlY29kZV9zdGVyZW9fMzkzMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5lbnRyb3B5X2RlY29kZV9tb25vICAgPSBlbnRyb3B5X2RlY29kZV9tb25vXzM5OTA7CisgICAgICAgIHMtPmVudHJvcHlfZGVjb2RlX3N0ZXJlbyA9IGVudHJvcHlfZGVjb2RlX3N0ZXJlb18zOTkwOworICAgIH0KKworICAgIGlmIChzLT5maWxldmVyc2lvbiA8IDM5MzApIHsKKyAgICAgICAgcy0+cHJlZGljdG9yX2RlY29kZV9tb25vICAgPSBwcmVkaWN0b3JfZGVjb2RlX21vbm9fMzgwMDsKKyAgICAgICAgcy0+cHJlZGljdG9yX2RlY29kZV9zdGVyZW8gPSBwcmVkaWN0b3JfZGVjb2RlX3N0ZXJlb18zODAwOworICAgIH0gZWxzZSBpZiAocy0+ZmlsZXZlcnNpb24gPCAzOTUwKSB7CisgICAgICAgIHMtPnByZWRpY3Rvcl9kZWNvZGVfbW9ubyAgID0gcHJlZGljdG9yX2RlY29kZV9tb25vXzM5MzA7CisgICAgICAgIHMtPnByZWRpY3Rvcl9kZWNvZGVfc3RlcmVvID0gcHJlZGljdG9yX2RlY29kZV9zdGVyZW9fMzkzMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5wcmVkaWN0b3JfZGVjb2RlX21vbm8gICA9IHByZWRpY3Rvcl9kZWNvZGVfbW9ub18zOTUwOworICAgICAgICBzLT5wcmVkaWN0b3JfZGVjb2RlX3N0ZXJlbyA9IHByZWRpY3Rvcl9kZWNvZGVfc3RlcmVvXzM5NTA7CisgICAgfQorCisgICAgZmZfYnN3YXBkc3BfaW5pdCgmcy0+YmRzcCk7CisgICAgZmZfbGxhdWRkc3BfaW5pdCgmcy0+YWRzcCk7CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gKGF2Y3R4LT5jaGFubmVscz09MikgPyBBVl9DSF9MQVlPVVRfU1RFUkVPIDogQVZfQ0hfTEFZT1VUX01PTk87CisKKyAgICByZXR1cm4gMDsKK2ZpbHRlcl9hbGxvY19mYWlsOgorICAgIGFwZV9kZWNvZGVfY2xvc2UoYXZjdHgpOworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKKy8qKgorICogQG5hbWUgQVBFIHJhbmdlIGRlY29kaW5nIGZ1bmN0aW9ucworICogQHsKKyAqLworCisjZGVmaW5lIENPREVfQklUUyAgICAzMgorI2RlZmluZSBUT1BfVkFMVUUgICAgKCh1bnNpZ25lZCBpbnQpMSA8PCAoQ09ERV9CSVRTLTEpKQorI2RlZmluZSBTSElGVF9CSVRTICAgKENPREVfQklUUyAtIDkpCisjZGVmaW5lIEVYVFJBX0JJVFMgICAoKENPREVfQklUUy0yKSAlIDggKyAxKQorI2RlZmluZSBCT1RUT01fVkFMVUUgKFRPUF9WQUxVRSA+PiA4KQorCisvKiogU3RhcnQgdGhlIGRlY29kZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByYW5nZV9zdGFydF9kZWNvZGluZyhBUEVDb250ZXh0ICpjdHgpCit7CisgICAgY3R4LT5yYy5idWZmZXIgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZjdHgtPnB0cik7CisgICAgY3R4LT5yYy5sb3cgICAgPSBjdHgtPnJjLmJ1ZmZlciA+PiAoOCAtIEVYVFJBX0JJVFMpOworICAgIGN0eC0+cmMucmFuZ2UgID0gKHVpbnQzMl90KSAxIDw8IEVYVFJBX0JJVFM7Cit9CisKKy8qKiBQZXJmb3JtIG5vcm1hbGl6YXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByYW5nZV9kZWNfbm9ybWFsaXplKEFQRUNvbnRleHQgKmN0eCkKK3sKKyAgICB3aGlsZSAoY3R4LT5yYy5yYW5nZSA8PSBCT1RUT01fVkFMVUUpIHsKKyAgICAgICAgY3R4LT5yYy5idWZmZXIgPDw9IDg7CisgICAgICAgIGlmKGN0eC0+cHRyIDwgY3R4LT5kYXRhX2VuZCkgeworICAgICAgICAgICAgY3R4LT5yYy5idWZmZXIgKz0gKmN0eC0+cHRyOworICAgICAgICAgICAgY3R4LT5wdHIrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN0eC0+ZXJyb3IgPSAxOworICAgICAgICB9CisgICAgICAgIGN0eC0+cmMubG93ICAgID0gKGN0eC0+cmMubG93IDw8IDgpICAgIHwgKChjdHgtPnJjLmJ1ZmZlciA+PiAxKSAmIDB4RkYpOworICAgICAgICBjdHgtPnJjLnJhbmdlICA8PD0gODsKKyAgICB9Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIGN1bG11bGF0aXZlIGZyZXF1ZW5jeSBmb3IgbmV4dCBzeW1ib2wuIERvZXMgTk8gdXBkYXRlIQorICogQHBhcmFtIGN0eCBkZWNvZGVyIGNvbnRleHQKKyAqIEBwYXJhbSB0b3RfZiBpcyB0aGUgdG90YWwgZnJlcXVlbmN5IG9yIChjb2RlX3ZhbHVlKTE8PHNoaWZ0CisgKiBAcmV0dXJuIHRoZSBjdWxtdWxhdGl2ZSBmcmVxdWVuY3kKKyAqLworc3RhdGljIGlubGluZSBpbnQgcmFuZ2VfZGVjb2RlX2N1bGZyZXEoQVBFQ29udGV4dCAqY3R4LCBpbnQgdG90X2YpCit7CisgICAgcmFuZ2VfZGVjX25vcm1hbGl6ZShjdHgpOworICAgIGN0eC0+cmMuaGVscCA9IGN0eC0+cmMucmFuZ2UgLyB0b3RfZjsKKyAgICByZXR1cm4gY3R4LT5yYy5sb3cgLyBjdHgtPnJjLmhlbHA7Cit9CisKKy8qKgorICogRGVjb2RlIHZhbHVlIHdpdGggZ2l2ZW4gc2l6ZSBpbiBiaXRzCisgKiBAcGFyYW0gY3R4IGRlY29kZXIgY29udGV4dAorICogQHBhcmFtIHNoaWZ0IG51bWJlciBvZiBiaXRzIHRvIGRlY29kZQorICovCitzdGF0aWMgaW5saW5lIGludCByYW5nZV9kZWNvZGVfY3Vsc2hpZnQoQVBFQ29udGV4dCAqY3R4LCBpbnQgc2hpZnQpCit7CisgICAgcmFuZ2VfZGVjX25vcm1hbGl6ZShjdHgpOworICAgIGN0eC0+cmMuaGVscCA9IGN0eC0+cmMucmFuZ2UgPj4gc2hpZnQ7CisgICAgcmV0dXJuIGN0eC0+cmMubG93IC8gY3R4LT5yYy5oZWxwOworfQorCisKKy8qKgorICogVXBkYXRlIGRlY29kaW5nIHN0YXRlCisgKiBAcGFyYW0gY3R4IGRlY29kZXIgY29udGV4dAorICogQHBhcmFtIHN5X2YgdGhlIGludGVydmFsIGxlbmd0aCAoZnJlcXVlbmN5IG9mIHRoZSBzeW1ib2wpCisgKiBAcGFyYW0gbHRfZiB0aGUgbG93ZXIgZW5kIChmcmVxdWVuY3kgc3VtIG9mIDwgc3ltYm9scykKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJhbmdlX2RlY29kZV91cGRhdGUoQVBFQ29udGV4dCAqY3R4LCBpbnQgc3lfZiwgaW50IGx0X2YpCit7CisgICAgY3R4LT5yYy5sb3cgIC09IGN0eC0+cmMuaGVscCAqIGx0X2Y7CisgICAgY3R4LT5yYy5yYW5nZSA9IGN0eC0+cmMuaGVscCAqIHN5X2Y7Cit9CisKKy8qKiBEZWNvZGUgbiBiaXRzIChuIDw9IDE2KSB3aXRob3V0IG1vZGVsbGluZyAqLworc3RhdGljIGlubGluZSBpbnQgcmFuZ2VfZGVjb2RlX2JpdHMoQVBFQ29udGV4dCAqY3R4LCBpbnQgbikKK3sKKyAgICBpbnQgc3ltID0gcmFuZ2VfZGVjb2RlX2N1bHNoaWZ0KGN0eCwgbik7CisgICAgcmFuZ2VfZGVjb2RlX3VwZGF0ZShjdHgsIDEsIHN5bSk7CisgICAgcmV0dXJuIHN5bTsKK30KKworCisjZGVmaW5lIE1PREVMX0VMRU1FTlRTIDY0CisKKy8qKgorICogRml4ZWQgcHJvYmFiaWxpdGllcyBmb3Igc3ltYm9scyBpbiBNb25rZXkgQXVkaW8gdmVyc2lvbiAzLjk3CisgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjb3VudHNfMzk3MFsyMl0gPSB7CisgICAgICAgIDAsIDE0ODI0LCAyODIyNCwgMzkzNDgsIDQ3ODU1LCA1Mzk5NCwgNTgxNzEsIDYwOTI2LAorICAgIDYyNjgyLCA2Mzc4NiwgNjQ0NjMsIDY0ODc4LCA2NTEyNiwgNjUyNzYsIDY1MzY1LCA2NTQxOSwKKyAgICA2NTQ1MCwgNjU0NjksIDY1NDgwLCA2NTQ4NywgNjU0OTEsIDY1NDkzLAorfTsKKworLyoqCisgKiBQcm9iYWJpbGl0eSByYW5nZXMgZm9yIHN5bWJvbHMgaW4gTW9ua2V5IEF1ZGlvIHZlcnNpb24gMy45NworICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgY291bnRzX2RpZmZfMzk3MFsyMV0gPSB7CisgICAgMTQ4MjQsIDEzNDAwLCAxMTEyNCwgODUwNywgNjEzOSwgNDE3NywgMjc1NSwgMTc1NiwKKyAgICAxMTA0LCA2NzcsIDQxNSwgMjQ4LCAxNTAsIDg5LCA1NCwgMzEsCisgICAgMTksIDExLCA3LCA0LCAyLAorfTsKKworLyoqCisgKiBGaXhlZCBwcm9iYWJpbGl0aWVzIGZvciBzeW1ib2xzIGluIE1vbmtleSBBdWRpbyB2ZXJzaW9uIDMuOTgKKyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNvdW50c18zOTgwWzIyXSA9IHsKKyAgICAgICAgMCwgMTk1NzgsIDM2MTYwLCA0ODQxNywgNTYzMjMsIDYwODk5LCA2MzI2NSwgNjQ0MzUsCisgICAgNjQ5NzEsIDY1MjMyLCA2NTM1MSwgNjU0MTYsIDY1NDQ3LCA2NTQ2NiwgNjU0NzYsIDY1NDgyLAorICAgIDY1NDg1LCA2NTQ4OCwgNjU0OTAsIDY1NDkxLCA2NTQ5MiwgNjU0OTMsCit9OworCisvKioKKyAqIFByb2JhYmlsaXR5IHJhbmdlcyBmb3Igc3ltYm9scyBpbiBNb25rZXkgQXVkaW8gdmVyc2lvbiAzLjk4CisgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjb3VudHNfZGlmZl8zOTgwWzIxXSA9IHsKKyAgICAxOTU3OCwgMTY1ODIsIDEyMjU3LCA3OTA2LCA0NTc2LCAyMzY2LCAxMTcwLCA1MzYsCisgICAgMjYxLCAxMTksIDY1LCAzMSwgMTksIDEwLCA2LCAzLAorICAgIDMsIDIsIDEsIDEsIDEsCit9OworCisvKioKKyAqIERlY29kZSBzeW1ib2wKKyAqIEBwYXJhbSBjdHggZGVjb2RlciBjb250ZXh0CisgKiBAcGFyYW0gY291bnRzIHByb2JhYmlsaXR5IHJhbmdlIHN0YXJ0IHBvc2l0aW9uCisgKiBAcGFyYW0gY291bnRzX2RpZmYgcHJvYmFiaWxpdHkgcmFuZ2Ugd2lkdGhzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJhbmdlX2dldF9zeW1ib2woQVBFQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBjb3VudHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgY291bnRzX2RpZmZbXSkKK3sKKyAgICBpbnQgc3ltYm9sLCBjZjsKKworICAgIGNmID0gcmFuZ2VfZGVjb2RlX2N1bHNoaWZ0KGN0eCwgMTYpOworCisgICAgaWYoY2YgPiA2NTQ5Mil7CisgICAgICAgIHN5bWJvbD0gY2YgLSA2NTUzNSArIDYzOworICAgICAgICByYW5nZV9kZWNvZGVfdXBkYXRlKGN0eCwgMSwgY2YpOworICAgICAgICBpZihjZiA+IDY1NTM1KQorICAgICAgICAgICAgY3R4LT5lcnJvcj0xOworICAgICAgICByZXR1cm4gc3ltYm9sOworICAgIH0KKyAgICAvKiBmaWd1cmUgb3V0IHRoZSBzeW1ib2wgaW5lZmZpY2llbnRseTsgYSBiaW5hcnkgc2VhcmNoIHdvdWxkIGJlIG11Y2ggYmV0dGVyICovCisgICAgZm9yIChzeW1ib2wgPSAwOyBjb3VudHNbc3ltYm9sICsgMV0gPD0gY2Y7IHN5bWJvbCsrKTsKKworICAgIHJhbmdlX2RlY29kZV91cGRhdGUoY3R4LCBjb3VudHNfZGlmZltzeW1ib2xdLCBjb3VudHNbc3ltYm9sXSk7CisKKyAgICByZXR1cm4gc3ltYm9sOworfQorLyoqIEB9ICovIC8vIGdyb3VwIHJhbmdlY29kZXIKKworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9yaWNlKEFQRVJpY2UgKnJpY2UsIHVuc2lnbmVkIGludCB4KQoreworICAgIGludCBsaW0gPSByaWNlLT5rID8gKDEgPDwgKHJpY2UtPmsgKyA0KSkgOiAwOworICAgIHJpY2UtPmtzdW0gKz0gKCh4ICsgMSkgLyAyKSAtICgocmljZS0+a3N1bSArIDE2KSA+PiA1KTsKKworICAgIGlmIChyaWNlLT5rc3VtIDwgbGltKQorICAgICAgICByaWNlLT5rLS07CisgICAgZWxzZSBpZiAocmljZS0+a3N1bSA+PSAoMSA8PCAocmljZS0+ayArIDUpKSkKKyAgICAgICAgcmljZS0+aysrOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfcmljZV9vb2soR2V0Qml0Q29udGV4dCAqZ2IsIGludCBrKQoreworICAgIHVuc2lnbmVkIGludCB4OworCisgICAgeCA9IGdldF91bmFyeShnYiwgMSwgZ2V0X2JpdHNfbGVmdChnYikpOworCisgICAgaWYgKGspCisgICAgICAgIHggPSAoeCA8PCBrKSB8IGdldF9iaXRzKGdiLCBrKTsKKworICAgIHJldHVybiB4OworfQorCitzdGF0aWMgaW5saW5lIGludCBhcGVfZGVjb2RlX3ZhbHVlXzM4NjAoQVBFQ29udGV4dCAqY3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEVSaWNlICpyaWNlKQoreworICAgIHVuc2lnbmVkIGludCB4LCBvdmVyZmxvdzsKKworICAgIG92ZXJmbG93ID0gZ2V0X3VuYXJ5KGdiLCAxLCBnZXRfYml0c19sZWZ0KGdiKSk7CisKKyAgICBpZiAoY3R4LT5maWxldmVyc2lvbiA+IDM4ODApIHsKKyAgICAgICAgd2hpbGUgKG92ZXJmbG93ID49IDE2KSB7CisgICAgICAgICAgICBvdmVyZmxvdyAtPSAxNjsKKyAgICAgICAgICAgIHJpY2UtPmsgICs9IDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXJpY2UtPmspCisgICAgICAgIHggPSBvdmVyZmxvdzsKKyAgICBlbHNlIGlmKHJpY2UtPmsgPD0gTUlOX0NBQ0hFX0JJVFMpIHsKKyAgICAgICAgeCA9IChvdmVyZmxvdyA8PCByaWNlLT5rKSArIGdldF9iaXRzKGdiLCByaWNlLT5rKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgYml0czogJWRcbiIsIHJpY2UtPmspOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcmljZS0+a3N1bSArPSB4IC0gKHJpY2UtPmtzdW0gKyA4ID4+IDQpOworICAgIGlmIChyaWNlLT5rc3VtIDwgKHJpY2UtPmsgPyAxIDw8IChyaWNlLT5rICsgNCkgOiAwKSkKKyAgICAgICAgcmljZS0+ay0tOworICAgIGVsc2UgaWYgKHJpY2UtPmtzdW0gPj0gKDEgPDwgKHJpY2UtPmsgKyA1KSkgJiYgcmljZS0+ayA8IDI0KQorICAgICAgICByaWNlLT5rKys7CisKKyAgICAvKiBDb252ZXJ0IHRvIHNpZ25lZCAqLworICAgIGlmICh4ICYgMSkKKyAgICAgICAgcmV0dXJuICh4ID4+IDEpICsgMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtKHggPj4gMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFwZV9kZWNvZGVfdmFsdWVfMzkwMChBUEVDb250ZXh0ICpjdHgsIEFQRVJpY2UgKnJpY2UpCit7CisgICAgdW5zaWduZWQgaW50IHgsIG92ZXJmbG93OworICAgIGludCB0bXBrOworCisgICAgb3ZlcmZsb3cgPSByYW5nZV9nZXRfc3ltYm9sKGN0eCwgY291bnRzXzM5NzAsIGNvdW50c19kaWZmXzM5NzApOworCisgICAgaWYgKG92ZXJmbG93ID09IChNT0RFTF9FTEVNRU5UUyAtIDEpKSB7CisgICAgICAgIHRtcGsgPSByYW5nZV9kZWNvZGVfYml0cyhjdHgsIDUpOworICAgICAgICBvdmVyZmxvdyA9IDA7CisgICAgfSBlbHNlCisgICAgICAgIHRtcGsgPSAocmljZS0+ayA8IDEpID8gMCA6IHJpY2UtPmsgLSAxOworCisgICAgaWYgKHRtcGsgPD0gMTYgfHwgY3R4LT5maWxldmVyc2lvbiA8IDM5MTApIHsKKyAgICAgICAgaWYgKHRtcGsgPiAyMykgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IGJpdHM6ICVkXG4iLCB0bXBrKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHggPSByYW5nZV9kZWNvZGVfYml0cyhjdHgsIHRtcGspOworICAgIH0gZWxzZSBpZiAodG1wayA8PSAzMSkgeworICAgICAgICB4ID0gcmFuZ2VfZGVjb2RlX2JpdHMoY3R4LCAxNik7CisgICAgICAgIHggfD0gKHJhbmdlX2RlY29kZV9iaXRzKGN0eCwgdG1wayAtIDE2KSA8PCAxNik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IGJpdHM6ICVkXG4iLCB0bXBrKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHggKz0gb3ZlcmZsb3cgPDwgdG1wazsKKworICAgIHVwZGF0ZV9yaWNlKHJpY2UsIHgpOworCisgICAgLyogQ29udmVydCB0byBzaWduZWQgKi8KKyAgICBpZiAoeCAmIDEpCisgICAgICAgIHJldHVybiAoeCA+PiAxKSArIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLSh4ID4+IDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhcGVfZGVjb2RlX3ZhbHVlXzM5OTAoQVBFQ29udGV4dCAqY3R4LCBBUEVSaWNlICpyaWNlKQoreworICAgIHVuc2lnbmVkIGludCB4LCBvdmVyZmxvdzsKKyAgICBpbnQgYmFzZSwgcGl2b3Q7CisKKyAgICBwaXZvdCA9IHJpY2UtPmtzdW0gPj4gNTsKKyAgICBpZiAocGl2b3QgPT0gMCkKKyAgICAgICAgcGl2b3QgPSAxOworCisgICAgb3ZlcmZsb3cgPSByYW5nZV9nZXRfc3ltYm9sKGN0eCwgY291bnRzXzM5ODAsIGNvdW50c19kaWZmXzM5ODApOworCisgICAgaWYgKG92ZXJmbG93ID09IChNT0RFTF9FTEVNRU5UUyAtIDEpKSB7CisgICAgICAgIG92ZXJmbG93ICA9IHJhbmdlX2RlY29kZV9iaXRzKGN0eCwgMTYpIDw8IDE2OworICAgICAgICBvdmVyZmxvdyB8PSByYW5nZV9kZWNvZGVfYml0cyhjdHgsIDE2KTsKKyAgICB9CisKKyAgICBpZiAocGl2b3QgPCAweDEwMDAwKSB7CisgICAgICAgIGJhc2UgPSByYW5nZV9kZWNvZGVfY3VsZnJlcShjdHgsIHBpdm90KTsKKyAgICAgICAgcmFuZ2VfZGVjb2RlX3VwZGF0ZShjdHgsIDEsIGJhc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBiYXNlX2hpID0gcGl2b3QsIGJhc2VfbG87CisgICAgICAgIGludCBiYml0cyA9IDA7CisKKyAgICAgICAgd2hpbGUgKGJhc2VfaGkgJiB+MHhGRkZGKSB7CisgICAgICAgICAgICBiYXNlX2hpID4+PSAxOworICAgICAgICAgICAgYmJpdHMrKzsKKyAgICAgICAgfQorICAgICAgICBiYXNlX2hpID0gcmFuZ2VfZGVjb2RlX2N1bGZyZXEoY3R4LCBiYXNlX2hpICsgMSk7CisgICAgICAgIHJhbmdlX2RlY29kZV91cGRhdGUoY3R4LCAxLCBiYXNlX2hpKTsKKyAgICAgICAgYmFzZV9sbyA9IHJhbmdlX2RlY29kZV9jdWxmcmVxKGN0eCwgMSA8PCBiYml0cyk7CisgICAgICAgIHJhbmdlX2RlY29kZV91cGRhdGUoY3R4LCAxLCBiYXNlX2xvKTsKKworICAgICAgICBiYXNlID0gKGJhc2VfaGkgPDwgYmJpdHMpICsgYmFzZV9sbzsKKyAgICB9CisKKyAgICB4ID0gYmFzZSArIG92ZXJmbG93ICogcGl2b3Q7CisKKyAgICB1cGRhdGVfcmljZShyaWNlLCB4KTsKKworICAgIC8qIENvbnZlcnQgdG8gc2lnbmVkICovCisgICAgaWYgKHggJiAxKQorICAgICAgICByZXR1cm4gKHggPj4gMSkgKyAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0oeCA+PiAxKTsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2FycmF5XzAwMDAoQVBFQ29udGV4dCAqY3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKm91dCwgQVBFUmljZSAqcmljZSwgaW50IGJsb2Nrc3RvZGVjb2RlKQoreworICAgIGludCBpOworICAgIGludCBrc3VtbWF4LCBrc3VtbWluOworCisgICAgcmljZS0+a3N1bSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICBvdXRbaV0gPSBnZXRfcmljZV9vb2soJmN0eC0+Z2IsIDEwKTsKKyAgICAgICAgcmljZS0+a3N1bSArPSBvdXRbaV07CisgICAgfQorICAgIHJpY2UtPmsgPSBhdl9sb2cyKHJpY2UtPmtzdW0gLyAxMCkgKyAxOworICAgIGlmIChyaWNlLT5rID49IDI0KQorICAgICAgICByZXR1cm47CisgICAgZm9yICg7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIG91dFtpXSA9IGdldF9yaWNlX29vaygmY3R4LT5nYiwgcmljZS0+ayk7CisgICAgICAgIHJpY2UtPmtzdW0gKz0gb3V0W2ldOworICAgICAgICByaWNlLT5rID0gYXZfbG9nMihyaWNlLT5rc3VtIC8gKChpICsgMSkgKiAyKSkgKyAxOworICAgICAgICBpZiAocmljZS0+ayA+PSAyNCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAga3N1bW1heCA9IDEgPDwgcmljZS0+ayArIDc7CisgICAga3N1bW1pbiA9IHJpY2UtPmsgPyAoMSA8PCByaWNlLT5rICsgNikgOiAwOworICAgIGZvciAoOyBpIDwgYmxvY2tzdG9kZWNvZGU7IGkrKykgeworICAgICAgICBvdXRbaV0gPSBnZXRfcmljZV9vb2soJmN0eC0+Z2IsIHJpY2UtPmspOworICAgICAgICByaWNlLT5rc3VtICs9IG91dFtpXSAtIG91dFtpIC0gNjRdOworICAgICAgICB3aGlsZSAocmljZS0+a3N1bSA8IGtzdW1taW4pIHsKKyAgICAgICAgICAgIHJpY2UtPmstLTsKKyAgICAgICAgICAgIGtzdW1taW4gPSByaWNlLT5rID8ga3N1bW1pbiA+PiAxIDogMDsKKyAgICAgICAgICAgIGtzdW1tYXggPj49IDE7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHJpY2UtPmtzdW0gPj0ga3N1bW1heCkgeworICAgICAgICAgICAgcmljZS0+aysrOworICAgICAgICAgICAgaWYgKHJpY2UtPmsgPiAyNCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBrc3VtbWF4IDw8PSAxOworICAgICAgICAgICAga3N1bW1pbiA9IGtzdW1taW4gPyBrc3VtbWluIDw8IDEgOiAxMjg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzdG9kZWNvZGU7IGkrKykgeworICAgICAgICBpZiAob3V0W2ldICYgMSkKKyAgICAgICAgICAgIG91dFtpXSA9IChvdXRbaV0gPj4gMSkgKyAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXRbaV0gPSAtKG91dFtpXSA+PiAxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVudHJvcHlfZGVjb2RlX21vbm9fMDAwMChBUEVDb250ZXh0ICpjdHgsIGludCBibG9ja3N0b2RlY29kZSkKK3sKKyAgICBkZWNvZGVfYXJyYXlfMDAwMChjdHgsICZjdHgtPmdiLCBjdHgtPmRlY29kZWRbMF0sICZjdHgtPnJpY2VZLAorICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc3RvZGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQgZW50cm9weV9kZWNvZGVfc3RlcmVvXzAwMDAoQVBFQ29udGV4dCAqY3R4LCBpbnQgYmxvY2tzdG9kZWNvZGUpCit7CisgICAgZGVjb2RlX2FycmF5XzAwMDAoY3R4LCAmY3R4LT5nYiwgY3R4LT5kZWNvZGVkWzBdLCAmY3R4LT5yaWNlWSwKKyAgICAgICAgICAgICAgICAgICAgICBibG9ja3N0b2RlY29kZSk7CisgICAgZGVjb2RlX2FycmF5XzAwMDAoY3R4LCAmY3R4LT5nYiwgY3R4LT5kZWNvZGVkWzFdLCAmY3R4LT5yaWNlWCwKKyAgICAgICAgICAgICAgICAgICAgICBibG9ja3N0b2RlY29kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGVudHJvcHlfZGVjb2RlX21vbm9fMzg2MChBUEVDb250ZXh0ICpjdHgsIGludCBibG9ja3N0b2RlY29kZSkKK3sKKyAgICBpbnQzMl90ICpkZWNvZGVkMCA9IGN0eC0+ZGVjb2RlZFswXTsKKworICAgIHdoaWxlIChibG9ja3N0b2RlY29kZS0tKQorICAgICAgICAqZGVjb2RlZDArKyA9IGFwZV9kZWNvZGVfdmFsdWVfMzg2MChjdHgsICZjdHgtPmdiLCAmY3R4LT5yaWNlWSk7Cit9CisKK3N0YXRpYyB2b2lkIGVudHJvcHlfZGVjb2RlX3N0ZXJlb18zODYwKEFQRUNvbnRleHQgKmN0eCwgaW50IGJsb2Nrc3RvZGVjb2RlKQoreworICAgIGludDMyX3QgKmRlY29kZWQwID0gY3R4LT5kZWNvZGVkWzBdOworICAgIGludDMyX3QgKmRlY29kZWQxID0gY3R4LT5kZWNvZGVkWzFdOworICAgIGludCBibG9ja3MgPSBibG9ja3N0b2RlY29kZTsKKworICAgIHdoaWxlIChibG9ja3N0b2RlY29kZS0tKQorICAgICAgICAqZGVjb2RlZDArKyA9IGFwZV9kZWNvZGVfdmFsdWVfMzg2MChjdHgsICZjdHgtPmdiLCAmY3R4LT5yaWNlWSk7CisgICAgd2hpbGUgKGJsb2Nrcy0tKQorICAgICAgICAqZGVjb2RlZDErKyA9IGFwZV9kZWNvZGVfdmFsdWVfMzg2MChjdHgsICZjdHgtPmdiLCAmY3R4LT5yaWNlWCk7Cit9CisKK3N0YXRpYyB2b2lkIGVudHJvcHlfZGVjb2RlX21vbm9fMzkwMChBUEVDb250ZXh0ICpjdHgsIGludCBibG9ja3N0b2RlY29kZSkKK3sKKyAgICBpbnQzMl90ICpkZWNvZGVkMCA9IGN0eC0+ZGVjb2RlZFswXTsKKworICAgIHdoaWxlIChibG9ja3N0b2RlY29kZS0tKQorICAgICAgICAqZGVjb2RlZDArKyA9IGFwZV9kZWNvZGVfdmFsdWVfMzkwMChjdHgsICZjdHgtPnJpY2VZKTsKK30KKworc3RhdGljIHZvaWQgZW50cm9weV9kZWNvZGVfc3RlcmVvXzM5MDAoQVBFQ29udGV4dCAqY3R4LCBpbnQgYmxvY2tzdG9kZWNvZGUpCit7CisgICAgaW50MzJfdCAqZGVjb2RlZDAgPSBjdHgtPmRlY29kZWRbMF07CisgICAgaW50MzJfdCAqZGVjb2RlZDEgPSBjdHgtPmRlY29kZWRbMV07CisgICAgaW50IGJsb2NrcyA9IGJsb2Nrc3RvZGVjb2RlOworCisgICAgd2hpbGUgKGJsb2Nrc3RvZGVjb2RlLS0pCisgICAgICAgICpkZWNvZGVkMCsrID0gYXBlX2RlY29kZV92YWx1ZV8zOTAwKGN0eCwgJmN0eC0+cmljZVkpOworICAgIHJhbmdlX2RlY19ub3JtYWxpemUoY3R4KTsKKyAgICAvLyBiZWNhdXNlIG9mIHNvbWUgaW1wbGVtZW50YXRpb24gcGVjdWxpYXJpdGllcyB3ZSBuZWVkIHRvIGJhY2twZWRhbCBoZXJlCisgICAgY3R4LT5wdHIgLT0gMTsKKyAgICByYW5nZV9zdGFydF9kZWNvZGluZyhjdHgpOworICAgIHdoaWxlIChibG9ja3MtLSkKKyAgICAgICAgKmRlY29kZWQxKysgPSBhcGVfZGVjb2RlX3ZhbHVlXzM5MDAoY3R4LCAmY3R4LT5yaWNlWCk7Cit9CisKK3N0YXRpYyB2b2lkIGVudHJvcHlfZGVjb2RlX3N0ZXJlb18zOTMwKEFQRUNvbnRleHQgKmN0eCwgaW50IGJsb2Nrc3RvZGVjb2RlKQoreworICAgIGludDMyX3QgKmRlY29kZWQwID0gY3R4LT5kZWNvZGVkWzBdOworICAgIGludDMyX3QgKmRlY29kZWQxID0gY3R4LT5kZWNvZGVkWzFdOworCisgICAgd2hpbGUgKGJsb2Nrc3RvZGVjb2RlLS0pIHsKKyAgICAgICAgKmRlY29kZWQwKysgPSBhcGVfZGVjb2RlX3ZhbHVlXzM5MDAoY3R4LCAmY3R4LT5yaWNlWSk7CisgICAgICAgICpkZWNvZGVkMSsrID0gYXBlX2RlY29kZV92YWx1ZV8zOTAwKGN0eCwgJmN0eC0+cmljZVgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZW50cm9weV9kZWNvZGVfbW9ub18zOTkwKEFQRUNvbnRleHQgKmN0eCwgaW50IGJsb2Nrc3RvZGVjb2RlKQoreworICAgIGludDMyX3QgKmRlY29kZWQwID0gY3R4LT5kZWNvZGVkWzBdOworCisgICAgd2hpbGUgKGJsb2Nrc3RvZGVjb2RlLS0pCisgICAgICAgICpkZWNvZGVkMCsrID0gYXBlX2RlY29kZV92YWx1ZV8zOTkwKGN0eCwgJmN0eC0+cmljZVkpOworfQorCitzdGF0aWMgdm9pZCBlbnRyb3B5X2RlY29kZV9zdGVyZW9fMzk5MChBUEVDb250ZXh0ICpjdHgsIGludCBibG9ja3N0b2RlY29kZSkKK3sKKyAgICBpbnQzMl90ICpkZWNvZGVkMCA9IGN0eC0+ZGVjb2RlZFswXTsKKyAgICBpbnQzMl90ICpkZWNvZGVkMSA9IGN0eC0+ZGVjb2RlZFsxXTsKKworICAgIHdoaWxlIChibG9ja3N0b2RlY29kZS0tKSB7CisgICAgICAgICpkZWNvZGVkMCsrID0gYXBlX2RlY29kZV92YWx1ZV8zOTkwKGN0eCwgJmN0eC0+cmljZVkpOworICAgICAgICAqZGVjb2RlZDErKyA9IGFwZV9kZWNvZGVfdmFsdWVfMzk5MChjdHgsICZjdHgtPnJpY2VYKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9lbnRyb3B5X2RlY29kZXIoQVBFQ29udGV4dCAqY3R4KQoreworICAgIC8qIFJlYWQgdGhlIENSQyAqLworICAgIGlmIChjdHgtPmZpbGV2ZXJzaW9uID49IDM5MDApIHsKKyAgICAgICAgaWYgKGN0eC0+ZGF0YV9lbmQgLSBjdHgtPnB0ciA8IDYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgY3R4LT5DUkMgPSBieXRlc3RyZWFtX2dldF9iZTMyKCZjdHgtPnB0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5DUkMgPSBnZXRfYml0c19sb25nKCZjdHgtPmdiLCAzMik7CisgICAgfQorCisgICAgLyogUmVhZCB0aGUgZnJhbWUgZmxhZ3MgaWYgdGhleSBleGlzdCAqLworICAgIGN0eC0+ZnJhbWVmbGFncyA9IDA7CisgICAgaWYgKChjdHgtPmZpbGV2ZXJzaW9uID4gMzgyMCkgJiYgKGN0eC0+Q1JDICYgMHg4MDAwMDAwMCkpIHsKKyAgICAgICAgY3R4LT5DUkMgJj0gfjB4ODAwMDAwMDA7CisKKyAgICAgICAgaWYgKGN0eC0+ZGF0YV9lbmQgLSBjdHgtPnB0ciA8IDYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgY3R4LT5mcmFtZWZsYWdzID0gYnl0ZXN0cmVhbV9nZXRfYmUzMigmY3R4LT5wdHIpOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIHJpY2Ugc3RydWN0cyAqLworICAgIGN0eC0+cmljZVguayA9IDEwOworICAgIGN0eC0+cmljZVgua3N1bSA9ICgxIDw8IGN0eC0+cmljZVguaykgKiAxNjsKKyAgICBjdHgtPnJpY2VZLmsgPSAxMDsKKyAgICBjdHgtPnJpY2VZLmtzdW0gPSAoMSA8PCBjdHgtPnJpY2VZLmspICogMTY7CisKKyAgICBpZiAoY3R4LT5maWxldmVyc2lvbiA+PSAzOTAwKSB7CisgICAgICAgIC8qIFRoZSBmaXJzdCA4IGJpdHMgb2YgaW5wdXQgYXJlIGlnbm9yZWQuICovCisgICAgICAgIGN0eC0+cHRyKys7CisKKyAgICAgICAgcmFuZ2Vfc3RhcnRfZGVjb2RpbmcoY3R4KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGludDMyX3QgaW5pdGlhbF9jb2VmZnNfZmFzdF8zMzIwWzFdID0geworICAgIDM3NSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGluaXRpYWxfY29lZmZzX2FfMzgwMFszXSA9IHsKKyAgICA2NCwgMTE1LCA2NCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGluaXRpYWxfY29lZmZzX2JfMzgwMFsyXSA9IHsKKyAgICA3NDAsIDAKK307CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGluaXRpYWxfY29lZmZzXzM5MzBbNF0gPSB7CisgICAgMzYwLCAzMTcsIC0xMDksIDk4Cit9OworCitzdGF0aWMgdm9pZCBpbml0X3ByZWRpY3Rvcl9kZWNvZGVyKEFQRUNvbnRleHQgKmN0eCkKK3sKKyAgICBBUEVQcmVkaWN0b3IgKnAgPSAmY3R4LT5wcmVkaWN0b3I7CisKKyAgICAvKiBaZXJvIHRoZSBoaXN0b3J5IGJ1ZmZlcnMgKi8KKyAgICBtZW1zZXQocC0+aGlzdG9yeWJ1ZmZlciwgMCwgUFJFRElDVE9SX1NJWkUgKiBzaXplb2YoKnAtPmhpc3RvcnlidWZmZXIpKTsKKyAgICBwLT5idWYgPSBwLT5oaXN0b3J5YnVmZmVyOworCisgICAgLyogSW5pdGlhbGl6ZSBhbmQgemVybyB0aGUgY29lZmZpY2llbnRzICovCisgICAgaWYgKGN0eC0+ZmlsZXZlcnNpb24gPCAzOTMwKSB7CisgICAgICAgIGlmIChjdHgtPmNvbXByZXNzaW9uX2xldmVsID09IENPTVBSRVNTSU9OX0xFVkVMX0ZBU1QpIHsKKyAgICAgICAgICAgIG1lbWNweShwLT5jb2VmZnNBWzBdLCBpbml0aWFsX2NvZWZmc19mYXN0XzMzMjAsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGluaXRpYWxfY29lZmZzX2Zhc3RfMzMyMCkpOworICAgICAgICAgICAgbWVtY3B5KHAtPmNvZWZmc0FbMV0sIGluaXRpYWxfY29lZmZzX2Zhc3RfMzMyMCwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5pdGlhbF9jb2VmZnNfZmFzdF8zMzIwKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkocC0+Y29lZmZzQVswXSwgaW5pdGlhbF9jb2VmZnNfYV8zODAwLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihpbml0aWFsX2NvZWZmc19hXzM4MDApKTsKKyAgICAgICAgICAgIG1lbWNweShwLT5jb2VmZnNBWzFdLCBpbml0aWFsX2NvZWZmc19hXzM4MDAsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGluaXRpYWxfY29lZmZzX2FfMzgwMCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KHAtPmNvZWZmc0FbMF0sIGluaXRpYWxfY29lZmZzXzM5MzAsIHNpemVvZihpbml0aWFsX2NvZWZmc18zOTMwKSk7CisgICAgICAgIG1lbWNweShwLT5jb2VmZnNBWzFdLCBpbml0aWFsX2NvZWZmc18zOTMwLCBzaXplb2YoaW5pdGlhbF9jb2VmZnNfMzkzMCkpOworICAgIH0KKyAgICBtZW1zZXQocC0+Y29lZmZzQiwgMCwgc2l6ZW9mKHAtPmNvZWZmc0IpKTsKKyAgICBpZiAoY3R4LT5maWxldmVyc2lvbiA8IDM5MzApIHsKKyAgICAgICAgbWVtY3B5KHAtPmNvZWZmc0JbMF0sIGluaXRpYWxfY29lZmZzX2JfMzgwMCwKKyAgICAgICAgICAgICAgIHNpemVvZihpbml0aWFsX2NvZWZmc19iXzM4MDApKTsKKyAgICAgICAgbWVtY3B5KHAtPmNvZWZmc0JbMV0sIGluaXRpYWxfY29lZmZzX2JfMzgwMCwKKyAgICAgICAgICAgICAgIHNpemVvZihpbml0aWFsX2NvZWZmc19iXzM4MDApKTsKKyAgICB9CisKKyAgICBwLT5maWx0ZXJBWzBdID0gcC0+ZmlsdGVyQVsxXSA9IDA7CisgICAgcC0+ZmlsdGVyQlswXSA9IHAtPmZpbHRlckJbMV0gPSAwOworICAgIHAtPmxhc3RBWzBdICAgPSBwLT5sYXN0QVsxXSAgID0gMDsKKworICAgIHAtPnNhbXBsZV9wb3MgPSAwOworfQorCisvKiogR2V0IGludmVyc2Ugc2lnbiBvZiBpbnRlZ2VyICgtMSBmb3IgcG9zaXRpdmUsIDEgZm9yIG5lZ2F0aXZlIGFuZCAwIGZvciB6ZXJvKSAqLworc3RhdGljIGlubGluZSBpbnQgQVBFU0lHTihpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKHggPCAwKSAtICh4ID4gMCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBmaWx0ZXJfZmFzdF8zMzIwKEFQRVByZWRpY3RvciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWNvZGVkLCBjb25zdCBpbnQgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRlbGF5QSkKK3sKKyAgICBpbnQzMl90IHByZWRpY3Rpb25BOworCisgICAgcC0+YnVmW2RlbGF5QV0gPSBwLT5sYXN0QVtmaWx0ZXJdOworICAgIGlmIChwLT5zYW1wbGVfcG9zIDwgMykgeworICAgICAgICBwLT5sYXN0QVtmaWx0ZXJdICAgPSBkZWNvZGVkOworICAgICAgICBwLT5maWx0ZXJBW2ZpbHRlcl0gPSBkZWNvZGVkOworICAgICAgICByZXR1cm4gZGVjb2RlZDsKKyAgICB9CisKKyAgICBwcmVkaWN0aW9uQSA9IHAtPmJ1ZltkZWxheUFdICogMiAtIHAtPmJ1ZltkZWxheUEgLSAxXTsKKyAgICBwLT5sYXN0QVtmaWx0ZXJdID0gZGVjb2RlZCArIChwcmVkaWN0aW9uQSAgKiBwLT5jb2VmZnNBW2ZpbHRlcl1bMF0gPj4gOSk7CisKKyAgICBpZiAoKGRlY29kZWQgXiBwcmVkaWN0aW9uQSkgPiAwKQorICAgICAgICBwLT5jb2VmZnNBW2ZpbHRlcl1bMF0rKzsKKyAgICBlbHNlCisgICAgICAgIHAtPmNvZWZmc0FbZmlsdGVyXVswXS0tOworCisgICAgcC0+ZmlsdGVyQVtmaWx0ZXJdICs9IHAtPmxhc3RBW2ZpbHRlcl07CisKKyAgICByZXR1cm4gcC0+ZmlsdGVyQVtmaWx0ZXJdOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZmlsdGVyXzM4MDAoQVBFUHJlZGljdG9yICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWNvZGVkLCBjb25zdCBpbnQgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWxheUEsICBjb25zdCBpbnQgZGVsYXlCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdGFydCwgICBjb25zdCBpbnQgc2hpZnQpCit7CisgICAgaW50MzJfdCBwcmVkaWN0aW9uQSwgcHJlZGljdGlvbkIsIHNpZ247CisgICAgaW50MzJfdCBkMCwgZDEsIGQyLCBkMywgZDQ7CisKKyAgICBwLT5idWZbZGVsYXlBXSA9IHAtPmxhc3RBW2ZpbHRlcl07CisgICAgcC0+YnVmW2RlbGF5Ql0gPSBwLT5maWx0ZXJCW2ZpbHRlcl07CisgICAgaWYgKHAtPnNhbXBsZV9wb3MgPCBzdGFydCkgeworICAgICAgICBwcmVkaWN0aW9uQSA9IGRlY29kZWQgKyBwLT5maWx0ZXJBW2ZpbHRlcl07CisgICAgICAgIHAtPmxhc3RBW2ZpbHRlcl0gICA9IGRlY29kZWQ7CisgICAgICAgIHAtPmZpbHRlckJbZmlsdGVyXSA9IGRlY29kZWQ7CisgICAgICAgIHAtPmZpbHRlckFbZmlsdGVyXSA9IHByZWRpY3Rpb25BOworICAgICAgICByZXR1cm4gcHJlZGljdGlvbkE7CisgICAgfQorICAgIGQyID0gIHAtPmJ1ZltkZWxheUFdOworICAgIGQxID0gKHAtPmJ1ZltkZWxheUFdIC0gcC0+YnVmW2RlbGF5QSAtIDFdKSA8PCAxOworICAgIGQwID0gIHAtPmJ1ZltkZWxheUFdICsgKChwLT5idWZbZGVsYXlBIC0gMl0gLSBwLT5idWZbZGVsYXlBIC0gMV0pIDw8IDMpOworICAgIGQzID0gIHAtPmJ1ZltkZWxheUJdICogMiAtIHAtPmJ1ZltkZWxheUIgLSAxXTsKKyAgICBkNCA9ICBwLT5idWZbZGVsYXlCXTsKKworICAgIHByZWRpY3Rpb25BID0gZDAgKiBwLT5jb2VmZnNBW2ZpbHRlcl1bMF0gKworICAgICAgICAgICAgICAgICAgZDEgKiBwLT5jb2VmZnNBW2ZpbHRlcl1bMV0gKworICAgICAgICAgICAgICAgICAgZDIgKiBwLT5jb2VmZnNBW2ZpbHRlcl1bMl07CisKKyAgICBzaWduID0gQVBFU0lHTihkZWNvZGVkKTsKKyAgICBwLT5jb2VmZnNBW2ZpbHRlcl1bMF0gKz0gKCgoZDAgPj4gMzApICYgMikgLSAxKSAqIHNpZ247CisgICAgcC0+Y29lZmZzQVtmaWx0ZXJdWzFdICs9ICgoKGQxID4+IDI4KSAmIDgpIC0gNCkgKiBzaWduOworICAgIHAtPmNvZWZmc0FbZmlsdGVyXVsyXSArPSAoKChkMiA+PiAyOCkgJiA4KSAtIDQpICogc2lnbjsKKworICAgIHByZWRpY3Rpb25CID0gZDMgKiBwLT5jb2VmZnNCW2ZpbHRlcl1bMF0gLQorICAgICAgICAgICAgICAgICAgZDQgKiBwLT5jb2VmZnNCW2ZpbHRlcl1bMV07CisgICAgcC0+bGFzdEFbZmlsdGVyXSA9IGRlY29kZWQgKyAocHJlZGljdGlvbkEgPj4gMTEpOworICAgIHNpZ24gPSBBUEVTSUdOKHAtPmxhc3RBW2ZpbHRlcl0pOworICAgIHAtPmNvZWZmc0JbZmlsdGVyXVswXSArPSAoKChkMyA+PiAyOSkgJiA0KSAtIDIpICogc2lnbjsKKyAgICBwLT5jb2VmZnNCW2ZpbHRlcl1bMV0gLT0gKCgoZDQgPj4gMzApICYgMikgLSAxKSAqIHNpZ247CisKKyAgICBwLT5maWx0ZXJCW2ZpbHRlcl0gPSBwLT5sYXN0QVtmaWx0ZXJdICsgKHByZWRpY3Rpb25CID4+IHNoaWZ0KTsKKyAgICBwLT5maWx0ZXJBW2ZpbHRlcl0gPSBwLT5maWx0ZXJCW2ZpbHRlcl0gKyAoKHAtPmZpbHRlckFbZmlsdGVyXSAqIDMxKSA+PiA1KTsKKworICAgIHJldHVybiBwLT5maWx0ZXJBW2ZpbHRlcl07Cit9CisKK3N0YXRpYyB2b2lkIGxvbmdfZmlsdGVyX2hpZ2hfMzgwMChpbnQzMl90ICpidWZmZXIsIGludCBvcmRlciwgaW50IHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmNvZWZmcywgaW50MzJfdCAqZGVsYXksIGludCBsZW5ndGgpCit7CisgICAgaW50IGksIGo7CisgICAgaW50MzJfdCBkb3Rwcm9kLCBzaWduOworCisgICAgbWVtc2V0KGNvZWZmcywgMCwgb3JkZXIgKiBzaXplb2YoKmNvZWZmcykpOworICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlcjsgaSsrKQorICAgICAgICBkZWxheVtpXSA9IGJ1ZmZlcltpXTsKKyAgICBmb3IgKGkgPSBvcmRlcjsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIGRvdHByb2QgPSAwOworICAgICAgICBzaWduID0gQVBFU0lHTihidWZmZXJbaV0pOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3JkZXI7IGorKykgeworICAgICAgICAgICAgZG90cHJvZCArPSBkZWxheVtqXSAqIGNvZWZmc1tqXTsKKyAgICAgICAgICAgIGNvZWZmc1tqXSArPSAoKGRlbGF5W2pdID4+IDMxKSB8IDEpICogc2lnbjsKKyAgICAgICAgfQorICAgICAgICBidWZmZXJbaV0gLT0gZG90cHJvZCA+PiBzaGlmdDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG9yZGVyIC0gMTsgaisrKQorICAgICAgICAgICAgZGVsYXlbal0gPSBkZWxheVtqICsgMV07CisgICAgICAgIGRlbGF5W29yZGVyIC0gMV0gPSBidWZmZXJbaV07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBsb25nX2ZpbHRlcl9laGlnaF8zODMwKGludDMyX3QgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQzMl90IGRvdHByb2QsIHNpZ247CisgICAgaW50MzJfdCBjb2VmZnNbOF0gPSB7IDAgfSwgZGVsYXlbOF0gPSB7IDAgfTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBkb3Rwcm9kID0gMDsKKyAgICAgICAgc2lnbiA9IEFQRVNJR04oYnVmZmVyW2ldKTsKKyAgICAgICAgZm9yIChqID0gNzsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgIGRvdHByb2QgKz0gZGVsYXlbal0gKiBjb2VmZnNbal07CisgICAgICAgICAgICBjb2VmZnNbal0gKz0gKChkZWxheVtqXSA+PiAzMSkgfCAxKSAqIHNpZ247CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gNzsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgIGRlbGF5W2pdID0gZGVsYXlbaiAtIDFdOworICAgICAgICBkZWxheVswXSA9IGJ1ZmZlcltpXTsKKyAgICAgICAgYnVmZmVyW2ldIC09IGRvdHByb2QgPj4gOTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHByZWRpY3Rvcl9kZWNvZGVfc3RlcmVvXzM4MDAoQVBFQ29udGV4dCAqY3R4LCBpbnQgY291bnQpCit7CisgICAgQVBFUHJlZGljdG9yICpwID0gJmN0eC0+cHJlZGljdG9yOworICAgIGludDMyX3QgKmRlY29kZWQwID0gY3R4LT5kZWNvZGVkWzBdOworICAgIGludDMyX3QgKmRlY29kZWQxID0gY3R4LT5kZWNvZGVkWzFdOworICAgIGludDMyX3QgY29lZmZzWzI1Nl0sIGRlbGF5WzI1Nl07CisgICAgaW50IHN0YXJ0ID0gNCwgc2hpZnQgPSAxMDsKKworICAgIGlmIChjdHgtPmNvbXByZXNzaW9uX2xldmVsID09IENPTVBSRVNTSU9OX0xFVkVMX0hJR0gpIHsKKyAgICAgICAgc3RhcnQgPSAxNjsKKyAgICAgICAgbG9uZ19maWx0ZXJfaGlnaF8zODAwKGRlY29kZWQwLCAxNiwgOSwgY29lZmZzLCBkZWxheSwgY291bnQpOworICAgICAgICBsb25nX2ZpbHRlcl9oaWdoXzM4MDAoZGVjb2RlZDEsIDE2LCA5LCBjb2VmZnMsIGRlbGF5LCBjb3VudCk7CisgICAgfSBlbHNlIGlmIChjdHgtPmNvbXByZXNzaW9uX2xldmVsID09IENPTVBSRVNTSU9OX0xFVkVMX0VYVFJBX0hJR0gpIHsKKyAgICAgICAgaW50IG9yZGVyID0gMTI4LCBzaGlmdDIgPSAxMTsKKworICAgICAgICBpZiAoY3R4LT5maWxldmVyc2lvbiA+PSAzODMwKSB7CisgICAgICAgICAgICBvcmRlciA8PD0gMTsKKyAgICAgICAgICAgIHNoaWZ0Kys7CisgICAgICAgICAgICBzaGlmdDIrKzsKKyAgICAgICAgICAgIGxvbmdfZmlsdGVyX2VoaWdoXzM4MzAoZGVjb2RlZDAgKyBvcmRlciwgY291bnQgLSBvcmRlcik7CisgICAgICAgICAgICBsb25nX2ZpbHRlcl9laGlnaF8zODMwKGRlY29kZWQxICsgb3JkZXIsIGNvdW50IC0gb3JkZXIpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gb3JkZXI7CisgICAgICAgIGxvbmdfZmlsdGVyX2hpZ2hfMzgwMChkZWNvZGVkMCwgb3JkZXIsIHNoaWZ0MiwgY29lZmZzLCBkZWxheSwgY291bnQpOworICAgICAgICBsb25nX2ZpbHRlcl9oaWdoXzM4MDAoZGVjb2RlZDEsIG9yZGVyLCBzaGlmdDIsIGNvZWZmcywgZGVsYXksIGNvdW50KTsKKyAgICB9CisKKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICBpbnQgWCA9ICpkZWNvZGVkMCwgWSA9ICpkZWNvZGVkMTsKKyAgICAgICAgaWYgKGN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPT0gQ09NUFJFU1NJT05fTEVWRUxfRkFTVCkgeworICAgICAgICAgICAgKmRlY29kZWQwID0gZmlsdGVyX2Zhc3RfMzMyMChwLCBZLCAwLCBZREVMQVlBKTsKKyAgICAgICAgICAgIGRlY29kZWQwKys7CisgICAgICAgICAgICAqZGVjb2RlZDEgPSBmaWx0ZXJfZmFzdF8zMzIwKHAsIFgsIDEsIFhERUxBWUEpOworICAgICAgICAgICAgZGVjb2RlZDErKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZWNvZGVkMCA9IGZpbHRlcl8zODAwKHAsIFksIDAsIFlERUxBWUEsIFlERUxBWUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgc2hpZnQpOworICAgICAgICAgICAgZGVjb2RlZDArKzsKKyAgICAgICAgICAgICpkZWNvZGVkMSA9IGZpbHRlcl8zODAwKHAsIFgsIDEsIFhERUxBWUEsIFhERUxBWUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgc2hpZnQpOworICAgICAgICAgICAgZGVjb2RlZDErKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbWJpbmVkICovCisgICAgICAgIHAtPmJ1ZisrOworICAgICAgICBwLT5zYW1wbGVfcG9zKys7CisKKyAgICAgICAgLyogSGF2ZSB3ZSBmaWxsZWQgdGhlIGhpc3RvcnkgYnVmZmVyPyAqLworICAgICAgICBpZiAocC0+YnVmID09IHAtPmhpc3RvcnlidWZmZXIgKyBISVNUT1JZX1NJWkUpIHsKKyAgICAgICAgICAgIG1lbW1vdmUocC0+aGlzdG9yeWJ1ZmZlciwgcC0+YnVmLAorICAgICAgICAgICAgICAgICAgICBQUkVESUNUT1JfU0laRSAqIHNpemVvZigqcC0+aGlzdG9yeWJ1ZmZlcikpOworICAgICAgICAgICAgcC0+YnVmID0gcC0+aGlzdG9yeWJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcHJlZGljdG9yX2RlY29kZV9tb25vXzM4MDAoQVBFQ29udGV4dCAqY3R4LCBpbnQgY291bnQpCit7CisgICAgQVBFUHJlZGljdG9yICpwID0gJmN0eC0+cHJlZGljdG9yOworICAgIGludDMyX3QgKmRlY29kZWQwID0gY3R4LT5kZWNvZGVkWzBdOworICAgIGludDMyX3QgY29lZmZzWzI1Nl0sIGRlbGF5WzI1Nl07CisgICAgaW50IHN0YXJ0ID0gNCwgc2hpZnQgPSAxMDsKKworICAgIGlmIChjdHgtPmNvbXByZXNzaW9uX2xldmVsID09IENPTVBSRVNTSU9OX0xFVkVMX0hJR0gpIHsKKyAgICAgICAgc3RhcnQgPSAxNjsKKyAgICAgICAgbG9uZ19maWx0ZXJfaGlnaF8zODAwKGRlY29kZWQwLCAxNiwgOSwgY29lZmZzLCBkZWxheSwgY291bnQpOworICAgIH0gZWxzZSBpZiAoY3R4LT5jb21wcmVzc2lvbl9sZXZlbCA9PSBDT01QUkVTU0lPTl9MRVZFTF9FWFRSQV9ISUdIKSB7CisgICAgICAgIGludCBvcmRlciA9IDEyOCwgc2hpZnQyID0gMTE7CisKKyAgICAgICAgaWYgKGN0eC0+ZmlsZXZlcnNpb24gPj0gMzgzMCkgeworICAgICAgICAgICAgb3JkZXIgPDw9IDE7CisgICAgICAgICAgICBzaGlmdCsrOworICAgICAgICAgICAgc2hpZnQyKys7CisgICAgICAgICAgICBsb25nX2ZpbHRlcl9laGlnaF8zODMwKGRlY29kZWQwICsgb3JkZXIsIGNvdW50IC0gb3JkZXIpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gb3JkZXI7CisgICAgICAgIGxvbmdfZmlsdGVyX2hpZ2hfMzgwMChkZWNvZGVkMCwgb3JkZXIsIHNoaWZ0MiwgY29lZmZzLCBkZWxheSwgY291bnQpOworICAgIH0KKworICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgIGlmIChjdHgtPmNvbXByZXNzaW9uX2xldmVsID09IENPTVBSRVNTSU9OX0xFVkVMX0ZBU1QpIHsKKyAgICAgICAgICAgICpkZWNvZGVkMCA9IGZpbHRlcl9mYXN0XzMzMjAocCwgKmRlY29kZWQwLCAwLCBZREVMQVlBKTsKKyAgICAgICAgICAgIGRlY29kZWQwKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVjb2RlZDAgPSBmaWx0ZXJfMzgwMChwLCAqZGVjb2RlZDAsIDAsIFlERUxBWUEsIFlERUxBWUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgc2hpZnQpOworICAgICAgICAgICAgZGVjb2RlZDArKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbWJpbmVkICovCisgICAgICAgIHAtPmJ1ZisrOworICAgICAgICBwLT5zYW1wbGVfcG9zKys7CisKKyAgICAgICAgLyogSGF2ZSB3ZSBmaWxsZWQgdGhlIGhpc3RvcnkgYnVmZmVyPyAqLworICAgICAgICBpZiAocC0+YnVmID09IHAtPmhpc3RvcnlidWZmZXIgKyBISVNUT1JZX1NJWkUpIHsKKyAgICAgICAgICAgIG1lbW1vdmUocC0+aGlzdG9yeWJ1ZmZlciwgcC0+YnVmLAorICAgICAgICAgICAgICAgICAgICBQUkVESUNUT1JfU0laRSAqIHNpemVvZigqcC0+aGlzdG9yeWJ1ZmZlcikpOworICAgICAgICAgICAgcC0+YnVmID0gcC0+aGlzdG9yeWJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHByZWRpY3Rvcl91cGRhdGVfMzkzMChBUEVQcmVkaWN0b3IgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWNvZGVkLCBjb25zdCBpbnQgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGVsYXlBKQoreworICAgIGludDMyX3QgcHJlZGljdGlvbkEsIHNpZ247CisgICAgaW50MzJfdCBkMCwgZDEsIGQyLCBkMzsKKworICAgIHAtPmJ1ZltkZWxheUFdICAgICA9IHAtPmxhc3RBW2ZpbHRlcl07CisgICAgZDAgPSBwLT5idWZbZGVsYXlBICAgIF07CisgICAgZDEgPSBwLT5idWZbZGVsYXlBICAgIF0gLSBwLT5idWZbZGVsYXlBIC0gMV07CisgICAgZDIgPSBwLT5idWZbZGVsYXlBIC0gMV0gLSBwLT5idWZbZGVsYXlBIC0gMl07CisgICAgZDMgPSBwLT5idWZbZGVsYXlBIC0gMl0gLSBwLT5idWZbZGVsYXlBIC0gM107CisKKyAgICBwcmVkaWN0aW9uQSA9IGQwICogcC0+Y29lZmZzQVtmaWx0ZXJdWzBdICsKKyAgICAgICAgICAgICAgICAgIGQxICogcC0+Y29lZmZzQVtmaWx0ZXJdWzFdICsKKyAgICAgICAgICAgICAgICAgIGQyICogcC0+Y29lZmZzQVtmaWx0ZXJdWzJdICsKKyAgICAgICAgICAgICAgICAgIGQzICogcC0+Y29lZmZzQVtmaWx0ZXJdWzNdOworCisgICAgcC0+bGFzdEFbZmlsdGVyXSA9IGRlY29kZWQgKyAocHJlZGljdGlvbkEgPj4gOSk7CisgICAgcC0+ZmlsdGVyQVtmaWx0ZXJdID0gcC0+bGFzdEFbZmlsdGVyXSArICgocC0+ZmlsdGVyQVtmaWx0ZXJdICogMzEpID4+IDUpOworCisgICAgc2lnbiA9IEFQRVNJR04oZGVjb2RlZCk7CisgICAgcC0+Y29lZmZzQVtmaWx0ZXJdWzBdICs9ICgoZDAgPCAwKSAqIDIgLSAxKSAqIHNpZ247CisgICAgcC0+Y29lZmZzQVtmaWx0ZXJdWzFdICs9ICgoZDEgPCAwKSAqIDIgLSAxKSAqIHNpZ247CisgICAgcC0+Y29lZmZzQVtmaWx0ZXJdWzJdICs9ICgoZDIgPCAwKSAqIDIgLSAxKSAqIHNpZ247CisgICAgcC0+Y29lZmZzQVtmaWx0ZXJdWzNdICs9ICgoZDMgPCAwKSAqIDIgLSAxKSAqIHNpZ247CisKKyAgICByZXR1cm4gcC0+ZmlsdGVyQVtmaWx0ZXJdOworfQorCitzdGF0aWMgdm9pZCBwcmVkaWN0b3JfZGVjb2RlX3N0ZXJlb18zOTMwKEFQRUNvbnRleHQgKmN0eCwgaW50IGNvdW50KQoreworICAgIEFQRVByZWRpY3RvciAqcCA9ICZjdHgtPnByZWRpY3RvcjsKKyAgICBpbnQzMl90ICpkZWNvZGVkMCA9IGN0eC0+ZGVjb2RlZFswXTsKKyAgICBpbnQzMl90ICpkZWNvZGVkMSA9IGN0eC0+ZGVjb2RlZFsxXTsKKworICAgIGFwZV9hcHBseV9maWx0ZXJzKGN0eCwgY3R4LT5kZWNvZGVkWzBdLCBjdHgtPmRlY29kZWRbMV0sIGNvdW50KTsKKworICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgIC8qIFByZWRpY3RvciBZICovCisgICAgICAgIGludCBZID0gKmRlY29kZWQxLCBYID0gKmRlY29kZWQwOworICAgICAgICAqZGVjb2RlZDAgPSBwcmVkaWN0b3JfdXBkYXRlXzM5MzAocCwgWSwgMCwgWURFTEFZQSk7CisgICAgICAgIGRlY29kZWQwKys7CisgICAgICAgICpkZWNvZGVkMSA9IHByZWRpY3Rvcl91cGRhdGVfMzkzMChwLCBYLCAxLCBYREVMQVlBKTsKKyAgICAgICAgZGVjb2RlZDErKzsKKworICAgICAgICAvKiBDb21iaW5lZCAqLworICAgICAgICBwLT5idWYrKzsKKworICAgICAgICAvKiBIYXZlIHdlIGZpbGxlZCB0aGUgaGlzdG9yeSBidWZmZXI/ICovCisgICAgICAgIGlmIChwLT5idWYgPT0gcC0+aGlzdG9yeWJ1ZmZlciArIEhJU1RPUllfU0laRSkgeworICAgICAgICAgICAgbWVtbW92ZShwLT5oaXN0b3J5YnVmZmVyLCBwLT5idWYsCisgICAgICAgICAgICAgICAgICAgIFBSRURJQ1RPUl9TSVpFICogc2l6ZW9mKCpwLT5oaXN0b3J5YnVmZmVyKSk7CisgICAgICAgICAgICBwLT5idWYgPSBwLT5oaXN0b3J5YnVmZmVyOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVkaWN0b3JfZGVjb2RlX21vbm9fMzkzMChBUEVDb250ZXh0ICpjdHgsIGludCBjb3VudCkKK3sKKyAgICBBUEVQcmVkaWN0b3IgKnAgPSAmY3R4LT5wcmVkaWN0b3I7CisgICAgaW50MzJfdCAqZGVjb2RlZDAgPSBjdHgtPmRlY29kZWRbMF07CisKKyAgICBhcGVfYXBwbHlfZmlsdGVycyhjdHgsIGN0eC0+ZGVjb2RlZFswXSwgTlVMTCwgY291bnQpOworCisgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgKmRlY29kZWQwID0gcHJlZGljdG9yX3VwZGF0ZV8zOTMwKHAsICpkZWNvZGVkMCwgMCwgWURFTEFZQSk7CisgICAgICAgIGRlY29kZWQwKys7CisKKyAgICAgICAgcC0+YnVmKys7CisKKyAgICAgICAgLyogSGF2ZSB3ZSBmaWxsZWQgdGhlIGhpc3RvcnkgYnVmZmVyPyAqLworICAgICAgICBpZiAocC0+YnVmID09IHAtPmhpc3RvcnlidWZmZXIgKyBISVNUT1JZX1NJWkUpIHsKKyAgICAgICAgICAgIG1lbW1vdmUocC0+aGlzdG9yeWJ1ZmZlciwgcC0+YnVmLAorICAgICAgICAgICAgICAgICAgICBQUkVESUNUT1JfU0laRSAqIHNpemVvZigqcC0+aGlzdG9yeWJ1ZmZlcikpOworICAgICAgICAgICAgcC0+YnVmID0gcC0+aGlzdG9yeWJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHByZWRpY3Rvcl91cGRhdGVfZmlsdGVyKEFQRVByZWRpY3RvciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGVjb2RlZCwgY29uc3QgaW50IGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGVsYXlBLCAgY29uc3QgaW50IGRlbGF5QiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYWRhcHRBLCAgY29uc3QgaW50IGFkYXB0QikKK3sKKyAgICBpbnQzMl90IHByZWRpY3Rpb25BLCBwcmVkaWN0aW9uQiwgc2lnbjsKKworICAgIHAtPmJ1ZltkZWxheUFdICAgICA9IHAtPmxhc3RBW2ZpbHRlcl07CisgICAgcC0+YnVmW2FkYXB0QV0gICAgID0gQVBFU0lHTihwLT5idWZbZGVsYXlBXSk7CisgICAgcC0+YnVmW2RlbGF5QSAtIDFdID0gcC0+YnVmW2RlbGF5QV0gLSBwLT5idWZbZGVsYXlBIC0gMV07CisgICAgcC0+YnVmW2FkYXB0QSAtIDFdID0gQVBFU0lHTihwLT5idWZbZGVsYXlBIC0gMV0pOworCisgICAgcHJlZGljdGlvbkEgPSBwLT5idWZbZGVsYXlBICAgIF0gKiBwLT5jb2VmZnNBW2ZpbHRlcl1bMF0gKworICAgICAgICAgICAgICAgICAgcC0+YnVmW2RlbGF5QSAtIDFdICogcC0+Y29lZmZzQVtmaWx0ZXJdWzFdICsKKyAgICAgICAgICAgICAgICAgIHAtPmJ1ZltkZWxheUEgLSAyXSAqIHAtPmNvZWZmc0FbZmlsdGVyXVsyXSArCisgICAgICAgICAgICAgICAgICBwLT5idWZbZGVsYXlBIC0gM10gKiBwLT5jb2VmZnNBW2ZpbHRlcl1bM107CisKKyAgICAvKiAgQXBwbHkgYSBzY2FsZWQgZmlyc3Qtb3JkZXIgZmlsdGVyIGNvbXByZXNzaW9uICovCisgICAgcC0+YnVmW2RlbGF5Ql0gICAgID0gcC0+ZmlsdGVyQVtmaWx0ZXIgXiAxXSAtICgocC0+ZmlsdGVyQltmaWx0ZXJdICogMzEpID4+IDUpOworICAgIHAtPmJ1ZlthZGFwdEJdICAgICA9IEFQRVNJR04ocC0+YnVmW2RlbGF5Ql0pOworICAgIHAtPmJ1ZltkZWxheUIgLSAxXSA9IHAtPmJ1ZltkZWxheUJdIC0gcC0+YnVmW2RlbGF5QiAtIDFdOworICAgIHAtPmJ1ZlthZGFwdEIgLSAxXSA9IEFQRVNJR04ocC0+YnVmW2RlbGF5QiAtIDFdKTsKKyAgICBwLT5maWx0ZXJCW2ZpbHRlcl0gPSBwLT5maWx0ZXJBW2ZpbHRlciBeIDFdOworCisgICAgcHJlZGljdGlvbkIgPSBwLT5idWZbZGVsYXlCICAgIF0gKiBwLT5jb2VmZnNCW2ZpbHRlcl1bMF0gKworICAgICAgICAgICAgICAgICAgcC0+YnVmW2RlbGF5QiAtIDFdICogcC0+Y29lZmZzQltmaWx0ZXJdWzFdICsKKyAgICAgICAgICAgICAgICAgIHAtPmJ1ZltkZWxheUIgLSAyXSAqIHAtPmNvZWZmc0JbZmlsdGVyXVsyXSArCisgICAgICAgICAgICAgICAgICBwLT5idWZbZGVsYXlCIC0gM10gKiBwLT5jb2VmZnNCW2ZpbHRlcl1bM10gKworICAgICAgICAgICAgICAgICAgcC0+YnVmW2RlbGF5QiAtIDRdICogcC0+Y29lZmZzQltmaWx0ZXJdWzRdOworCisgICAgcC0+bGFzdEFbZmlsdGVyXSA9IGRlY29kZWQgKyAoKHByZWRpY3Rpb25BICsgKHByZWRpY3Rpb25CID4+IDEpKSA+PiAxMCk7CisgICAgcC0+ZmlsdGVyQVtmaWx0ZXJdID0gcC0+bGFzdEFbZmlsdGVyXSArICgocC0+ZmlsdGVyQVtmaWx0ZXJdICogMzEpID4+IDUpOworCisgICAgc2lnbiA9IEFQRVNJR04oZGVjb2RlZCk7CisgICAgcC0+Y29lZmZzQVtmaWx0ZXJdWzBdICs9IHAtPmJ1ZlthZGFwdEEgICAgXSAqIHNpZ247CisgICAgcC0+Y29lZmZzQVtmaWx0ZXJdWzFdICs9IHAtPmJ1ZlthZGFwdEEgLSAxXSAqIHNpZ247CisgICAgcC0+Y29lZmZzQVtmaWx0ZXJdWzJdICs9IHAtPmJ1ZlthZGFwdEEgLSAyXSAqIHNpZ247CisgICAgcC0+Y29lZmZzQVtmaWx0ZXJdWzNdICs9IHAtPmJ1ZlthZGFwdEEgLSAzXSAqIHNpZ247CisgICAgcC0+Y29lZmZzQltmaWx0ZXJdWzBdICs9IHAtPmJ1ZlthZGFwdEIgICAgXSAqIHNpZ247CisgICAgcC0+Y29lZmZzQltmaWx0ZXJdWzFdICs9IHAtPmJ1ZlthZGFwdEIgLSAxXSAqIHNpZ247CisgICAgcC0+Y29lZmZzQltmaWx0ZXJdWzJdICs9IHAtPmJ1ZlthZGFwdEIgLSAyXSAqIHNpZ247CisgICAgcC0+Y29lZmZzQltmaWx0ZXJdWzNdICs9IHAtPmJ1ZlthZGFwdEIgLSAzXSAqIHNpZ247CisgICAgcC0+Y29lZmZzQltmaWx0ZXJdWzRdICs9IHAtPmJ1ZlthZGFwdEIgLSA0XSAqIHNpZ247CisKKyAgICByZXR1cm4gcC0+ZmlsdGVyQVtmaWx0ZXJdOworfQorCitzdGF0aWMgdm9pZCBwcmVkaWN0b3JfZGVjb2RlX3N0ZXJlb18zOTUwKEFQRUNvbnRleHQgKmN0eCwgaW50IGNvdW50KQoreworICAgIEFQRVByZWRpY3RvciAqcCA9ICZjdHgtPnByZWRpY3RvcjsKKyAgICBpbnQzMl90ICpkZWNvZGVkMCA9IGN0eC0+ZGVjb2RlZFswXTsKKyAgICBpbnQzMl90ICpkZWNvZGVkMSA9IGN0eC0+ZGVjb2RlZFsxXTsKKworICAgIGFwZV9hcHBseV9maWx0ZXJzKGN0eCwgY3R4LT5kZWNvZGVkWzBdLCBjdHgtPmRlY29kZWRbMV0sIGNvdW50KTsKKworICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgIC8qIFByZWRpY3RvciBZICovCisgICAgICAgICpkZWNvZGVkMCA9IHByZWRpY3Rvcl91cGRhdGVfZmlsdGVyKHAsICpkZWNvZGVkMCwgMCwgWURFTEFZQSwgWURFTEFZQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUFEQVBUQ09FRkZTQSwgWUFEQVBUQ09FRkZTQik7CisgICAgICAgIGRlY29kZWQwKys7CisgICAgICAgICpkZWNvZGVkMSA9IHByZWRpY3Rvcl91cGRhdGVfZmlsdGVyKHAsICpkZWNvZGVkMSwgMSwgWERFTEFZQSwgWERFTEFZQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEFEQVBUQ09FRkZTQSwgWEFEQVBUQ09FRkZTQik7CisgICAgICAgIGRlY29kZWQxKys7CisKKyAgICAgICAgLyogQ29tYmluZWQgKi8KKyAgICAgICAgcC0+YnVmKys7CisKKyAgICAgICAgLyogSGF2ZSB3ZSBmaWxsZWQgdGhlIGhpc3RvcnkgYnVmZmVyPyAqLworICAgICAgICBpZiAocC0+YnVmID09IHAtPmhpc3RvcnlidWZmZXIgKyBISVNUT1JZX1NJWkUpIHsKKyAgICAgICAgICAgIG1lbW1vdmUocC0+aGlzdG9yeWJ1ZmZlciwgcC0+YnVmLAorICAgICAgICAgICAgICAgICAgICBQUkVESUNUT1JfU0laRSAqIHNpemVvZigqcC0+aGlzdG9yeWJ1ZmZlcikpOworICAgICAgICAgICAgcC0+YnVmID0gcC0+aGlzdG9yeWJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcHJlZGljdG9yX2RlY29kZV9tb25vXzM5NTAoQVBFQ29udGV4dCAqY3R4LCBpbnQgY291bnQpCit7CisgICAgQVBFUHJlZGljdG9yICpwID0gJmN0eC0+cHJlZGljdG9yOworICAgIGludDMyX3QgKmRlY29kZWQwID0gY3R4LT5kZWNvZGVkWzBdOworICAgIGludDMyX3QgcHJlZGljdGlvbkEsIGN1cnJlbnRBLCBBLCBzaWduOworCisgICAgYXBlX2FwcGx5X2ZpbHRlcnMoY3R4LCBjdHgtPmRlY29kZWRbMF0sIE5VTEwsIGNvdW50KTsKKworICAgIGN1cnJlbnRBID0gcC0+bGFzdEFbMF07CisKKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICBBID0gKmRlY29kZWQwOworCisgICAgICAgIHAtPmJ1ZltZREVMQVlBXSA9IGN1cnJlbnRBOworICAgICAgICBwLT5idWZbWURFTEFZQSAtIDFdID0gcC0+YnVmW1lERUxBWUFdIC0gcC0+YnVmW1lERUxBWUEgLSAxXTsKKworICAgICAgICBwcmVkaWN0aW9uQSA9IHAtPmJ1ZltZREVMQVlBICAgIF0gKiBwLT5jb2VmZnNBWzBdWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICBwLT5idWZbWURFTEFZQSAtIDFdICogcC0+Y29lZmZzQVswXVsxXSArCisgICAgICAgICAgICAgICAgICAgICAgcC0+YnVmW1lERUxBWUEgLSAyXSAqIHAtPmNvZWZmc0FbMF1bMl0gKworICAgICAgICAgICAgICAgICAgICAgIHAtPmJ1ZltZREVMQVlBIC0gM10gKiBwLT5jb2VmZnNBWzBdWzNdOworCisgICAgICAgIGN1cnJlbnRBID0gQSArIChwcmVkaWN0aW9uQSA+PiAxMCk7CisKKyAgICAgICAgcC0+YnVmW1lBREFQVENPRUZGU0FdICAgICA9IEFQRVNJR04ocC0+YnVmW1lERUxBWUEgICAgXSk7CisgICAgICAgIHAtPmJ1ZltZQURBUFRDT0VGRlNBIC0gMV0gPSBBUEVTSUdOKHAtPmJ1ZltZREVMQVlBIC0gMV0pOworCisgICAgICAgIHNpZ24gPSBBUEVTSUdOKEEpOworICAgICAgICBwLT5jb2VmZnNBWzBdWzBdICs9IHAtPmJ1ZltZQURBUFRDT0VGRlNBICAgIF0gKiBzaWduOworICAgICAgICBwLT5jb2VmZnNBWzBdWzFdICs9IHAtPmJ1ZltZQURBUFRDT0VGRlNBIC0gMV0gKiBzaWduOworICAgICAgICBwLT5jb2VmZnNBWzBdWzJdICs9IHAtPmJ1ZltZQURBUFRDT0VGRlNBIC0gMl0gKiBzaWduOworICAgICAgICBwLT5jb2VmZnNBWzBdWzNdICs9IHAtPmJ1ZltZQURBUFRDT0VGRlNBIC0gM10gKiBzaWduOworCisgICAgICAgIHAtPmJ1ZisrOworCisgICAgICAgIC8qIEhhdmUgd2UgZmlsbGVkIHRoZSBoaXN0b3J5IGJ1ZmZlcj8gKi8KKyAgICAgICAgaWYgKHAtPmJ1ZiA9PSBwLT5oaXN0b3J5YnVmZmVyICsgSElTVE9SWV9TSVpFKSB7CisgICAgICAgICAgICBtZW1tb3ZlKHAtPmhpc3RvcnlidWZmZXIsIHAtPmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgUFJFRElDVE9SX1NJWkUgKiBzaXplb2YoKnAtPmhpc3RvcnlidWZmZXIpKTsKKyAgICAgICAgICAgIHAtPmJ1ZiA9IHAtPmhpc3RvcnlidWZmZXI7CisgICAgICAgIH0KKworICAgICAgICBwLT5maWx0ZXJBWzBdID0gY3VycmVudEEgKyAoKHAtPmZpbHRlckFbMF0gKiAzMSkgPj4gNSk7CisgICAgICAgICooZGVjb2RlZDArKykgPSBwLT5maWx0ZXJBWzBdOworICAgIH0KKworICAgIHAtPmxhc3RBWzBdID0gY3VycmVudEE7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2luaXRfZmlsdGVyKEFQRUZpbHRlciAqZiwgaW50MTZfdCAqYnVmLCBpbnQgb3JkZXIpCit7CisgICAgZi0+Y29lZmZzID0gYnVmOworICAgIGYtPmhpc3RvcnlidWZmZXIgPSBidWYgKyBvcmRlcjsKKyAgICBmLT5kZWxheSAgICAgICA9IGYtPmhpc3RvcnlidWZmZXIgKyBvcmRlciAqIDI7CisgICAgZi0+YWRhcHRjb2VmZnMgPSBmLT5oaXN0b3J5YnVmZmVyICsgb3JkZXI7CisKKyAgICBtZW1zZXQoZi0+aGlzdG9yeWJ1ZmZlciwgMCwgKG9yZGVyICogMikgKiBzaXplb2YoKmYtPmhpc3RvcnlidWZmZXIpKTsKKyAgICBtZW1zZXQoZi0+Y29lZmZzLCAwLCBvcmRlciAqIHNpemVvZigqZi0+Y29lZmZzKSk7CisgICAgZi0+YXZnID0gMDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9maWx0ZXIoQVBFQ29udGV4dCAqY3R4LCBBUEVGaWx0ZXIgKmYsIGludDE2X3QgKmJ1ZiwgaW50IG9yZGVyKQoreworICAgIGRvX2luaXRfZmlsdGVyKCZmWzBdLCBidWYsIG9yZGVyKTsKKyAgICBkb19pbml0X2ZpbHRlcigmZlsxXSwgYnVmICsgb3JkZXIgKiAzICsgSElTVE9SWV9TSVpFLCBvcmRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2FwcGx5X2ZpbHRlcihBUEVDb250ZXh0ICpjdHgsIGludCB2ZXJzaW9uLCBBUEVGaWx0ZXIgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqZGF0YSwgaW50IGNvdW50LCBpbnQgb3JkZXIsIGludCBmcmFjYml0cykKK3sKKyAgICBpbnQgcmVzOworICAgIGludCBhYnNyZXM7CisKKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICAvKiByb3VuZCBmaXhlZHBvaW50IHNjYWxhciBwcm9kdWN0ICovCisgICAgICAgIHJlcyA9IGN0eC0+YWRzcC5zY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2KGYtPmNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+ZGVsYXkgLSBvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+YWRhcHRjb2VmZnMgLSBvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIsIEFQRVNJR04oKmRhdGEpKTsKKyAgICAgICAgcmVzID0gKHJlcyArICgxIDw8IChmcmFjYml0cyAtIDEpKSkgPj4gZnJhY2JpdHM7CisgICAgICAgIHJlcyArPSAqZGF0YTsKKyAgICAgICAgKmRhdGErKyA9IHJlczsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIG91dHB1dCBoaXN0b3J5ICovCisgICAgICAgICpmLT5kZWxheSsrID0gYXZfY2xpcF9pbnQxNihyZXMpOworCisgICAgICAgIGlmICh2ZXJzaW9uIDwgMzk4MCkgeworICAgICAgICAgICAgLyogVmVyc2lvbiA/Pz8gdG8gPCAzLjk4IGZpbGVzICh1bnRlc3RlZCkgKi8KKyAgICAgICAgICAgIGYtPmFkYXB0Y29lZmZzWzBdICA9IChyZXMgPT0gMCkgPyAwIDogKChyZXMgPj4gMjgpICYgOCkgLSA0OworICAgICAgICAgICAgZi0+YWRhcHRjb2VmZnNbLTRdID4+PSAxOworICAgICAgICAgICAgZi0+YWRhcHRjb2VmZnNbLThdID4+PSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogVmVyc2lvbiAzLjk4IGFuZCBsYXRlciBmaWxlcyAqLworCisgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGFkYXB0aW9uIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgICAgYWJzcmVzID0gRkZBQlMocmVzKTsKKyAgICAgICAgICAgIGlmIChhYnNyZXMpCisgICAgICAgICAgICAgICAgKmYtPmFkYXB0Y29lZmZzID0gKChyZXMgJiAoLTE8PDMxKSkgXiAoLTE8PDMwKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjUgKyAoYWJzcmVzIDw9IGYtPmF2ZyozKSArIChhYnNyZXMgPD0gZi0+YXZnKjQvMykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpmLT5hZGFwdGNvZWZmcyA9IDA7CisKKyAgICAgICAgICAgIGYtPmF2ZyArPSAoYWJzcmVzIC0gZi0+YXZnKSAvIDE2OworCisgICAgICAgICAgICBmLT5hZGFwdGNvZWZmc1stMV0gPj49IDE7CisgICAgICAgICAgICBmLT5hZGFwdGNvZWZmc1stMl0gPj49IDE7CisgICAgICAgICAgICBmLT5hZGFwdGNvZWZmc1stOF0gPj49IDE7CisgICAgICAgIH0KKworICAgICAgICBmLT5hZGFwdGNvZWZmcysrOworCisgICAgICAgIC8qIEhhdmUgd2UgZmlsbGVkIHRoZSBoaXN0b3J5IGJ1ZmZlcj8gKi8KKyAgICAgICAgaWYgKGYtPmRlbGF5ID09IGYtPmhpc3RvcnlidWZmZXIgKyBISVNUT1JZX1NJWkUgKyAob3JkZXIgKiAyKSkgeworICAgICAgICAgICAgbWVtbW92ZShmLT5oaXN0b3J5YnVmZmVyLCBmLT5kZWxheSAtIChvcmRlciAqIDIpLAorICAgICAgICAgICAgICAgICAgICAob3JkZXIgKiAyKSAqIHNpemVvZigqZi0+aGlzdG9yeWJ1ZmZlcikpOworICAgICAgICAgICAgZi0+ZGVsYXkgPSBmLT5oaXN0b3J5YnVmZmVyICsgb3JkZXIgKiAyOworICAgICAgICAgICAgZi0+YWRhcHRjb2VmZnMgPSBmLT5oaXN0b3J5YnVmZmVyICsgb3JkZXI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X2ZpbHRlcihBUEVDb250ZXh0ICpjdHgsIEFQRUZpbHRlciAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpkYXRhMCwgaW50MzJfdCAqZGF0YTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgb3JkZXIsIGludCBmcmFjYml0cykKK3sKKyAgICBkb19hcHBseV9maWx0ZXIoY3R4LCBjdHgtPmZpbGV2ZXJzaW9uLCAmZlswXSwgZGF0YTAsIGNvdW50LCBvcmRlciwgZnJhY2JpdHMpOworICAgIGlmIChkYXRhMSkKKyAgICAgICAgZG9fYXBwbHlfZmlsdGVyKGN0eCwgY3R4LT5maWxldmVyc2lvbiwgJmZbMV0sIGRhdGExLCBjb3VudCwgb3JkZXIsIGZyYWNiaXRzKTsKK30KKworc3RhdGljIHZvaWQgYXBlX2FwcGx5X2ZpbHRlcnMoQVBFQ29udGV4dCAqY3R4LCBpbnQzMl90ICpkZWNvZGVkMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmRlY29kZWQxLCBpbnQgY291bnQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVBFX0ZJTFRFUl9MRVZFTFM7IGkrKykgeworICAgICAgICBpZiAoIWFwZV9maWx0ZXJfb3JkZXJzW2N0eC0+ZnNldF1baV0pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXBwbHlfZmlsdGVyKGN0eCwgY3R4LT5maWx0ZXJzW2ldLCBkZWNvZGVkMCwgZGVjb2RlZDEsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgYXBlX2ZpbHRlcl9vcmRlcnNbY3R4LT5mc2V0XVtpXSwKKyAgICAgICAgICAgICAgICAgICAgIGFwZV9maWx0ZXJfZnJhY2JpdHNbY3R4LT5mc2V0XVtpXSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGluaXRfZnJhbWVfZGVjb2RlcihBUEVDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGksIHJldDsKKyAgICBpZiAoKHJldCA9IGluaXRfZW50cm9weV9kZWNvZGVyKGN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpbml0X3ByZWRpY3Rvcl9kZWNvZGVyKGN0eCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVBFX0ZJTFRFUl9MRVZFTFM7IGkrKykgeworICAgICAgICBpZiAoIWFwZV9maWx0ZXJfb3JkZXJzW2N0eC0+ZnNldF1baV0pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaW5pdF9maWx0ZXIoY3R4LCBjdHgtPmZpbHRlcnNbaV0sIGN0eC0+ZmlsdGVyYnVmW2ldLAorICAgICAgICAgICAgICAgICAgICBhcGVfZmlsdGVyX29yZGVyc1tjdHgtPmZzZXRdW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFwZV91bnBhY2tfbW9ubyhBUEVDb250ZXh0ICpjdHgsIGludCBjb3VudCkKK3sKKyAgICBpZiAoY3R4LT5mcmFtZWZsYWdzICYgQVBFX0ZSQU1FQ09ERV9TVEVSRU9fU0lMRU5DRSkgeworICAgICAgICAvKiBXZSBhcmUgcHVyZSBzaWxlbmNlLCBzbyB3ZSdyZSBkb25lLiAqLworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicHVyZSBzaWxlbmNlIG1vbm9cbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY3R4LT5lbnRyb3B5X2RlY29kZV9tb25vKGN0eCwgY291bnQpOworCisgICAgLyogTm93IGFwcGx5IHRoZSBwcmVkaWN0b3IgZGVjb2RpbmcgKi8KKyAgICBjdHgtPnByZWRpY3Rvcl9kZWNvZGVfbW9ubyhjdHgsIGNvdW50KTsKKworICAgIC8qIFBzZXVkby1zdGVyZW8gLSBqdXN0IGNvcHkgbGVmdCBjaGFubmVsIHRvIHJpZ2h0IGNoYW5uZWwgKi8KKyAgICBpZiAoY3R4LT5jaGFubmVscyA9PSAyKSB7CisgICAgICAgIG1lbWNweShjdHgtPmRlY29kZWRbMV0sIGN0eC0+ZGVjb2RlZFswXSwgY291bnQgKiBzaXplb2YoKmN0eC0+ZGVjb2RlZFsxXSkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYXBlX3VucGFja19zdGVyZW8oQVBFQ29udGV4dCAqY3R4LCBpbnQgY291bnQpCit7CisgICAgaW50MzJfdCBsZWZ0LCByaWdodDsKKyAgICBpbnQzMl90ICpkZWNvZGVkMCA9IGN0eC0+ZGVjb2RlZFswXTsKKyAgICBpbnQzMl90ICpkZWNvZGVkMSA9IGN0eC0+ZGVjb2RlZFsxXTsKKworICAgIGlmIChjdHgtPmZyYW1lZmxhZ3MgJiBBUEVfRlJBTUVDT0RFX1NURVJFT19TSUxFTkNFKSB7CisgICAgICAgIC8qIFdlIGFyZSBwdXJlIHNpbGVuY2UsIHNvIHdlJ3JlIGRvbmUuICovCisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJwdXJlIHNpbGVuY2Ugc3RlcmVvXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGN0eC0+ZW50cm9weV9kZWNvZGVfc3RlcmVvKGN0eCwgY291bnQpOworCisgICAgLyogTm93IGFwcGx5IHRoZSBwcmVkaWN0b3IgZGVjb2RpbmcgKi8KKyAgICBjdHgtPnByZWRpY3Rvcl9kZWNvZGVfc3RlcmVvKGN0eCwgY291bnQpOworCisgICAgLyogRGVjb3JyZWxhdGUgYW5kIHNjYWxlIHRvIG91dHB1dCBkZXB0aCAqLworICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgIGxlZnQgPSAqZGVjb2RlZDEgLSAoKmRlY29kZWQwIC8gMik7CisgICAgICAgIHJpZ2h0ID0gbGVmdCArICpkZWNvZGVkMDsKKworICAgICAgICAqKGRlY29kZWQwKyspID0gbGVmdDsKKyAgICAgICAgKihkZWNvZGVkMSsrKSA9IHJpZ2h0OworICAgIH0KK30KKworc3RhdGljIGludCBhcGVfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIEFQRUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKnNhbXBsZTg7CisgICAgaW50MTZfdCAqc2FtcGxlMTY7CisgICAgaW50MzJfdCAqc2FtcGxlMjQ7CisgICAgaW50IGksIGNoLCByZXQ7CisgICAgaW50IGJsb2Nrc3RvZGVjb2RlOworCisgICAgLyogdGhpcyBzaG91bGQgbmV2ZXIgYmUgbmVnYXRpdmUsIGJ1dCBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuIGlmIGl0IGlzLCBzbworICAgICAgIGNoZWNrIGl0IGp1c3QgdG8gbWFrZSBzdXJlLiAqLworICAgIGF2X2Fzc2VydDAocy0+c2FtcGxlcyA+PSAwKTsKKworICAgIGlmKCFzLT5zYW1wbGVzKXsKKyAgICAgICAgdWludDMyX3QgbmJsb2Nrcywgb2Zmc2V0OworICAgICAgICBpbnQgYnVmX3NpemU7CisKKyAgICAgICAgaWYgKCFhdnBrdC0+c2l6ZSkgeworICAgICAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2cGt0LT5zaXplIDwgOCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWNrZXQgaXMgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGJ1Zl9zaXplID0gYXZwa3QtPnNpemUgJiB+MzsKKyAgICAgICAgaWYgKGJ1Zl9zaXplICE9IGF2cGt0LT5zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAicGFja2V0IHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gIgorICAgICAgICAgICAgICAgICAgICJleHRyYSBieXRlcyBhdCB0aGUgZW5kIHdpbGwgYmUgc2tpcHBlZC5cbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5maWxldmVyc2lvbiA8IDM5NTApIC8vIHByZXZpb3VzIHZlcnNpb25zIG92ZXJyZWFkIHR3byBieXRlcworICAgICAgICAgICAgYnVmX3NpemUgKz0gMjsKKyAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZzLT5kYXRhLCAmcy0+ZGF0YV9zaXplLCBidWZfc2l6ZSk7CisgICAgICAgIGlmICghcy0+ZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHMtPmJkc3AuYnN3YXBfYnVmKCh1aW50MzJfdCAqKSBzLT5kYXRhLCAoY29uc3QgdWludDMyX3QgKikgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSA+PiAyKTsKKyAgICAgICAgbWVtc2V0KHMtPmRhdGEgKyAoYnVmX3NpemUgJiB+MyksIDAsIGJ1Zl9zaXplICYgMyk7CisgICAgICAgIHMtPnB0ciA9IHMtPmRhdGE7CisgICAgICAgIHMtPmRhdGFfZW5kID0gcy0+ZGF0YSArIGJ1Zl9zaXplOworCisgICAgICAgIG5ibG9ja3MgPSBieXRlc3RyZWFtX2dldF9iZTMyKCZzLT5wdHIpOworICAgICAgICBvZmZzZXQgID0gYnl0ZXN0cmVhbV9nZXRfYmUzMigmcy0+cHRyKTsKKyAgICAgICAgaWYgKHMtPmZpbGV2ZXJzaW9uID49IDM5MDApIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3Qgb2Zmc2V0IHBhc3NlZFxuIik7CisgICAgICAgICAgICAgICAgcy0+ZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+ZGF0YV9lbmQgLSBzLT5wdHIgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCBpcyB0b28gc21hbGxcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+cHRyICs9IG9mZnNldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJnMtPmdiLCBzLT5wdHIsIHMtPmRhdGFfZW5kIC0gcy0+cHRyKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAocy0+ZmlsZXZlcnNpb24gPiAzODAwKQorICAgICAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgb2Zmc2V0ICogOCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCBvZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFuYmxvY2tzIHx8IG5ibG9ja3MgPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2FtcGxlIGNvdW50OiAlIlBSSXUzMiIuXG4iLAorICAgICAgICAgICAgICAgICAgIG5ibG9ja3MpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgcy0+c2FtcGxlcyA9IG5ibG9ja3M7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgZnJhbWUgZGVjb2RlciAqLworICAgICAgICBpZiAoaW5pdF9mcmFtZV9kZWNvZGVyKHMpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciByZWFkaW5nIGZyYW1lIGhlYWRlclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcy0+ZGF0YSkgeworICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKKyAgICB9CisKKyAgICBibG9ja3N0b2RlY29kZSA9IEZGTUlOKHMtPmJsb2Nrc19wZXJfbG9vcCwgcy0+c2FtcGxlcyk7CisgICAgLy8gZm9yIG9sZCBmaWxlcyBjb2VmZmljaWVudHMgd2VyZSBub3QgaW50ZXJsZWF2ZWQsCisgICAgLy8gc28gd2UgbmVlZCB0byBkZWNvZGUgYWxsIG9mIHRoZW0gYXQgb25jZQorICAgIGlmIChzLT5maWxldmVyc2lvbiA8IDM5MzApCisgICAgICAgIGJsb2Nrc3RvZGVjb2RlID0gcy0+c2FtcGxlczsKKworICAgIC8qIHJlYWxsb2NhdGUgZGVjb2RlZCBzYW1wbGUgYnVmZmVyIGlmIG5lZWRlZCAqLworICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT5kZWNvZGVkX2J1ZmZlciwgJnMtPmRlY29kZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAyICogRkZBTElHTihibG9ja3N0b2RlY29kZSwgOCkgKiBzaXplb2YoKnMtPmRlY29kZWRfYnVmZmVyKSk7CisgICAgaWYgKCFzLT5kZWNvZGVkX2J1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtZW1zZXQocy0+ZGVjb2RlZF9idWZmZXIsIDAsIHMtPmRlY29kZWRfc2l6ZSk7CisgICAgcy0+ZGVjb2RlZFswXSA9IHMtPmRlY29kZWRfYnVmZmVyOworICAgIHMtPmRlY29kZWRbMV0gPSBzLT5kZWNvZGVkX2J1ZmZlciArIEZGQUxJR04oYmxvY2tzdG9kZWNvZGUsIDgpOworCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IGJsb2Nrc3RvZGVjb2RlOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5lcnJvcj0wOworCisgICAgaWYgKChzLT5jaGFubmVscyA9PSAxKSB8fCAocy0+ZnJhbWVmbGFncyAmIEFQRV9GUkFNRUNPREVfUFNFVURPX1NURVJFTykpCisgICAgICAgIGFwZV91bnBhY2tfbW9ubyhzLCBibG9ja3N0b2RlY29kZSk7CisgICAgZWxzZQorICAgICAgICBhcGVfdW5wYWNrX3N0ZXJlbyhzLCBibG9ja3N0b2RlY29kZSk7CisgICAgZW1tc19jKCk7CisKKyAgICBpZiAocy0+ZXJyb3IpIHsKKyAgICAgICAgcy0+c2FtcGxlcz0wOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGRlY29kaW5nIGZyYW1lXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3dpdGNoIChzLT5icHMpIHsKKyAgICBjYXNlIDg6CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBzYW1wbGU4ID0gKHVpbnQ4X3QgKilmcmFtZS0+ZGF0YVtjaF07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzdG9kZWNvZGU7IGkrKykKKyAgICAgICAgICAgICAgICAqc2FtcGxlOCsrID0gKHMtPmRlY29kZWRbY2hdW2ldICsgMHg4MCkgJiAweGZmOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBzYW1wbGUxNiA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbY2hdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2Nrc3RvZGVjb2RlOyBpKyspCisgICAgICAgICAgICAgICAgKnNhbXBsZTE2KysgPSBzLT5kZWNvZGVkW2NoXVtpXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0OgorICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgc2FtcGxlMjQgPSAoaW50MzJfdCAqKWZyYW1lLT5kYXRhW2NoXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3N0b2RlY29kZTsgaSsrKQorICAgICAgICAgICAgICAgICpzYW1wbGUyNCsrID0gcy0+ZGVjb2RlZFtjaF1baV0gPDwgODsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzLT5zYW1wbGVzIC09IGJsb2Nrc3RvZGVjb2RlOworCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuICFzLT5zYW1wbGVzID8gYXZwa3QtPnNpemUgOiAwOworfQorCitzdGF0aWMgdm9pZCBhcGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFQRUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHMtPnNhbXBsZXM9IDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFQRUNvbnRleHQsIHgpCisjZGVmaW5lIFBBUiAoQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAibWF4X3NhbXBsZXMiLCAibWF4aW11bSBudW1iZXIgb2Ygc2FtcGxlcyBkZWNvZGVkIHBlciBjYWxsIiwgICAgICAgICAgICAgT0ZGU0VUKGJsb2Nrc19wZXJfbG9vcCksIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSA0NjA4IH0sICAgIDEsICAgICAgIElOVF9NQVgsIFBBUiwgIm1heF9zYW1wbGVzIiB9LAorICAgIHsgImFsbCIsICAgICAgICAgIm5vIG1heGltdW0uIGRlY29kZSBhbGwgc2FtcGxlcyBmb3IgZWFjaCBwYWNrZXQgYXQgb25jZSIsIDAsICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gSU5UX01BWCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBQQVIsICJtYXhfc2FtcGxlcyIgfSwKKyAgICB7IE5VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYXBlX2RlY29kZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiQVBFIGRlY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9hcGVfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXBlIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTW9ua2V5J3MgQXVkaW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQVBFLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBUEVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBhcGVfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gYXBlX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBhcGVfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9TVUJGUkFNRVMgfCBDT0RFQ19DQVBfREVMQVkgfCBDT0RFQ19DQVBfRFIxLAorICAgIC5mbHVzaCAgICAgICAgICA9IGFwZV9mbHVzaCwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfVThQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzJQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJmFwZV9kZWNvZGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FwbmcuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FwbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTI0OWUwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXBuZy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBBUE5HIGNvbW1vbiBoZWFkZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBCZW5vaXQgRm91ZXQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQVBORyBjb21tb24gaGVhZGVyCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FQTkdfSAorI2RlZmluZSBBVkNPREVDX0FQTkdfSAorCitlbnVtIHsKKyAgIEFQTkdfRElTUE9TRV9PUF9OT05FICAgICAgID0gMCwKKyAgIEFQTkdfRElTUE9TRV9PUF9CQUNLR1JPVU5EID0gMSwKKyAgIEFQTkdfRElTUE9TRV9PUF9QUkVWSU9VUyAgID0gMiwKK307CisKK2VudW0geworICAgIEFQTkdfQkxFTkRfT1BfU09VUkNFID0gMCwKKyAgICBBUE5HX0JMRU5EX09QX09WRVIgICA9IDEsCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19BUE5HX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9NYWtlZmlsZSBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGFmNmJjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQ1IEBACitBUkNIX0hFQURFUlMgPSBtYXRob3BzLmgKKworT0JKUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gYXJtL2ZtdGNvbnZlcnRfaW5pdF9hcm0ubworCisjIHN1YnN5c3RlbXMKK09CSlMtJChDT05GSUdfQUMzRFNQKSAgICAgICAgICAgICAgICAgICs9IGFybS9hYzNkc3BfaW5pdF9hcm0ubyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9hYzNkc3BfYXJtLm8KK09CSlMtJChDT05GSUdfQVVESU9EU1ApICAgICAgICAgICAgICAgICs9IGFybS9hdWRpb2RzcF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX0JMT0NLRFNQKSAgICAgICAgICAgICAgICArPSBhcm0vYmxvY2tkc3BfaW5pdF9hcm0ubworT0JKUy0kKENPTkZJR19GRlQpICAgICAgICAgICAgICAgICAgICAgKz0gYXJtL2ZmdF9pbml0X2FybS5vICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL2ZmdF9maXhlZF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX0gyNjRDSFJPTUEpICAgICAgICAgICAgICArPSBhcm0vaDI2NGNocm9tYV9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX0gyNjREU1ApICAgICAgICAgICAgICAgICArPSBhcm0vaDI2NGRzcF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX0gyNjRQUkVEKSAgICAgICAgICAgICAgICArPSBhcm0vaDI2NHByZWRfaW5pdF9hcm0ubworT0JKUy0kKENPTkZJR19IMjY0UVBFTCkgICAgICAgICAgICAgICAgKz0gYXJtL2gyNjRxcGVsX2luaXRfYXJtLm8KK09CSlMtJChDT05GSUdfSFBFTERTUCkgICAgICAgICAgICAgICAgICs9IGFybS9ocGVsZHNwX2luaXRfYXJtLm8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9ocGVsZHNwX2FybS5vCitPQkpTLSQoQ09ORklHX0lEQ1REU1ApICAgICAgICAgICAgICAgICArPSBhcm0vaWRjdGRzcF9pbml0X2FybS5vICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vaWRjdGRzcF9hcm0ubyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vanJldmRjdF9hcm0ubyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vc2ltcGxlX2lkY3RfYXJtLm8KK09CSlMtJChDT05GSUdfTExBVUREU1ApICAgICAgICAgICAgICAgICs9IGFybS9sb3NzbGVzc19hdWRpb2RzcF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX01FX0NNUCkgICAgICAgICAgICAgICAgICArPSBhcm0vbWVfY21wX2luaXRfYXJtLm8KK09CSlMtJChDT05GSUdfTVBFR0FVRElPRFNQKSAgICAgICAgICAgICs9IGFybS9tcGVnYXVkaW9kc3BfaW5pdF9hcm0ubworT0JKUy0kKENPTkZJR19NUEVHVklERU8pICAgICAgICAgICAgICAgKz0gYXJtL21wZWd2aWRlb19hcm0ubworT0JKUy0kKENPTkZJR19NUEVHVklERU9FTkMpICAgICAgICAgICAgKz0gYXJtL21wZWd2aWRlb2VuY2RzcF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX05FT05fQ0xPQkJFUl9URVNUKSAgICAgICArPSBhcm0vbmVvbnRlc3QubworT0JKUy0kKENPTkZJR19QSVhCTE9DS0RTUCkgICAgICAgICAgICAgKz0gYXJtL3BpeGJsb2NrZHNwX2luaXRfYXJtLm8KK09CSlMtJChDT05GSUdfVklERU9EU1ApICAgICAgICAgICAgICAgICs9IGFybS92aWRlb2RzcF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX1ZQM0RTUCkgICAgICAgICAgICAgICAgICArPSBhcm0vdnAzZHNwX2luaXRfYXJtLm8KKworIyBkZWNvZGVycy9lbmNvZGVycworT0JKUy0kKENPTkZJR19BQUNfREVDT0RFUikgICAgICAgICAgICAgKz0gYXJtL2FhY3BzZHNwX2luaXRfYXJtLm8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL3NicmRzcF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX0RDQV9ERUNPREVSKSAgICAgICAgICAgICArPSBhcm0vZGNhZHNwX2luaXRfYXJtLm8KK09CSlMtJChDT05GSUdfRkxBQ19ERUNPREVSKSAgICAgICAgICAgICs9IGFybS9mbGFjZHNwX2luaXRfYXJtLm8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9mbGFjZHNwX2FybS5vCitPQkpTLSQoQ09ORklHX0ZMQUNfRU5DT0RFUikgICAgICAgICAgICArPSBhcm0vZmxhY2RzcF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX01MUF9ERUNPREVSKSAgICAgICAgICAgICArPSBhcm0vbWxwZHNwX2luaXRfYXJtLm8KK09CSlMtJChDT05GSUdfVkMxX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFybS92YzFkc3BfaW5pdF9hcm0ubworT0JKUy0kKENPTkZJR19WT1JCSVNfREVDT0RFUikgICAgICAgICAgKz0gYXJtL3ZvcmJpc2RzcF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX1ZQNl9ERUNPREVSKSAgICAgICAgICAgICArPSBhcm0vdnA2ZHNwX2luaXRfYXJtLm8KK09CSlMtJChDT05GSUdfVlA3X0RFQ09ERVIpICAgICAgICAgICAgICs9IGFybS92cDhkc3BfaW5pdF9hcm0ubworT0JKUy0kKENPTkZJR19WUDhfREVDT0RFUikgICAgICAgICAgICAgKz0gYXJtL3ZwOGRzcF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX1JWMzBfREVDT0RFUikgICAgICAgICAgICArPSBhcm0vcnYzNGRzcF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX1JWNDBfREVDT0RFUikgICAgICAgICAgICArPSBhcm0vcnYzNGRzcF9pbml0X2FybS5vICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vcnY0MGRzcF9pbml0X2FybS5vCisKKworIyBBUk12NSBvcHRpbWl6YXRpb25zCisjIHN1YnN5c3RlbXMKK0FSTVY1VEUtT0JKUy0kKENPTkZJR19JRENURFNQKSAgICAgICAgICs9IGFybS9pZGN0ZHNwX2luaXRfYXJtdjV0ZS5vICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9zaW1wbGVfaWRjdF9hcm12NXRlLm8KK0FSTVY1VEUtT0JKUy0kKENPTkZJR19NUEVHVklERU8pICAgICAgICs9IGFybS9tcGVndmlkZW9fYXJtdjV0ZS5vICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9tcGVndmlkZW9fYXJtdjV0ZV9zLm8KK0FSTVY1VEUtT0JKUy0kKENPTkZJR19WSURFT0RTUCkgICAgICAgICs9IGFybS92aWRlb2RzcF9pbml0X2FybXY1dGUubyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92aWRlb2RzcF9hcm12NXRlLm8KKworIyBkZWNvZGVycy9lbmNvZGVycworQVJNVjVURS1PQkpTLSQoQ09ORklHX01MUF9ERUNPREVSKSAgICAgKz0gYXJtL21scGRzcF9hcm12NXRlLm8KKworCisjIEFSTXY2IG9wdGltaXphdGlvbnMKKyMgc3Vic3lzdGVtcworQVJNVjYtT0JKUy0kKENPTkZJR19BQzNEU1ApICAgICAgICAgICAgKz0gYXJtL2FjM2RzcF9hcm12Ni5vCitBUk1WNi1PQkpTLSQoQ09ORklHX0hQRUxEU1ApICAgICAgICAgICArPSBhcm0vaHBlbGRzcF9pbml0X2FybXY2Lm8gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vaHBlbGRzcF9hcm12Ni5vCitBUk1WNi1PQkpTLSQoQ09ORklHX0lEQ1REU1ApICAgICAgICAgICArPSBhcm0vaWRjdGRzcF9pbml0X2FybXY2Lm8gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vaWRjdGRzcF9hcm12Ni5vICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vc2ltcGxlX2lkY3RfYXJtdjYubworQVJNVjYtT0JKUy0kKENPTkZJR19NRV9DTVApICAgICAgICAgICAgKz0gYXJtL21lX2NtcF9hcm12Ni5vCitBUk1WNi1PQkpTLSQoQ09ORklHX01QRUdBVURJT0RTUCkgICAgICArPSBhcm0vbXBlZ2F1ZGlvZHNwX2ZpeGVkX2FybXY2Lm8KK0FSTVY2LU9CSlMtJChDT05GSUdfTVBFR1ZJREVPRU5DKSAgICAgICs9IGFybS9tcGVndmlkZW9lbmNkc3BfYXJtdjYubworQVJNVjYtT0JKUy0kKENPTkZJR19QSVhCTE9DS0RTUCkgICAgICAgKz0gYXJtL3BpeGJsb2NrZHNwX2FybXY2Lm8KKworIyBkZWNvZGVycy9lbmNvZGVycworQVJNVjYtT0JKUy0kKENPTkZJR19NTFBfREVDT0RFUikgICAgICAgKz0gYXJtL21scGRzcF9hcm12Ni5vCitBUk1WNi1PQkpTLSQoQ09ORklHX1NUQVJUQ09ERSkgICAgICAgICArPSBhcm0vc3RhcnRjb2RlX2FybXY2Lm8KK0FSTVY2LU9CSlMtJChDT05GSUdfVlA3X0RFQ09ERVIpICAgICAgICs9IGFybS92cDhfYXJtdjYubyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92cDhkc3BfaW5pdF9hcm12Ni5vICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92cDhkc3BfYXJtdjYubworQVJNVjYtT0JKUy0kKENPTkZJR19WUDhfREVDT0RFUikgICAgICAgKz0gYXJtL3ZwOF9hcm12Ni5vICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL3ZwOGRzcF9pbml0X2FybXY2Lm8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL3ZwOGRzcF9hcm12Ni5vCisKKworIyBWRlAgb3B0aW1pemF0aW9ucworVkZQLU9CSlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gYXJtL2ZtdGNvbnZlcnRfdmZwLm8KKworIyBzdWJzeXN0ZW1zCitWRlAtT0JKUy0kKENPTkZJR19GRlQpICAgICAgICAgICAgICAgICArPSBhcm0vZmZ0X3ZmcC5vCitWRlAtT0JKUy0kKENPTkZJR19NRENUKSAgICAgICAgICAgICAgICArPSBhcm0vbWRjdF92ZnAubworVkZQLU9CSlMtJChIQVZFX0FSTVY2KSAgICAgICAgICAgICAgICAgKz0gYXJtL2ZtdGNvbnZlcnRfdmZwX2FybXY2Lm8KKworIyBkZWNvZGVycy9lbmNvZGVycworVkZQLU9CSlMtJChDT05GSUdfRENBX0RFQ09ERVIpICAgICAgICAgKz0gYXJtL2RjYWRzcF92ZnAubyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL3N5bnRoX2ZpbHRlcl92ZnAubworCisKKyMgTkVPTiBvcHRpbWl6YXRpb25zCitORU9OLU9CSlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSBhcm0vZm10Y29udmVydF9uZW9uLm8KKworIyBzdWJzeXN0ZW1zCitORU9OLU9CSlMtJChDT05GSUdfQUMzRFNQKSAgICAgICAgICAgICArPSBhcm0vYWMzZHNwX25lb24ubworTkVPTi1PQkpTLSQoQ09ORklHX0FVRElPRFNQKSAgICAgICAgICAgKz0gYXJtL2F1ZGlvZHNwX2luaXRfbmVvbi5vICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL2F1ZGlvZHNwX25lb24ubyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL2ludF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19CTE9DS0RTUCkgICAgICAgICAgICs9IGFybS9ibG9ja2RzcF9pbml0X25lb24ubyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9ibG9ja2RzcF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19GRlQpICAgICAgICAgICAgICAgICs9IGFybS9mZnRfbmVvbi5vICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9mZnRfZml4ZWRfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfSDI2NENIUk9NQSkgICAgICAgICArPSBhcm0vaDI2NGNtY19uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19IMjY0RFNQKSAgICAgICAgICAgICs9IGFybS9oMjY0ZHNwX25lb24ubyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9oMjY0aWRjdF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19IMjY0UFJFRCkgICAgICAgICAgICs9IGFybS9oMjY0cHJlZF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19IMjY0UVBFTCkgICAgICAgICAgICs9IGFybS9oMjY0cXBlbF9uZW9uLm8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9ocGVsZHNwX25lb24ubworTkVPTi1PQkpTLSQoQ09ORklHX0hQRUxEU1ApICAgICAgICAgICAgKz0gYXJtL2hwZWxkc3BfaW5pdF9uZW9uLm8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL2hwZWxkc3BfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfSURDVERTUCkgICAgICAgICAgICArPSBhcm0vaWRjdGRzcF9pbml0X25lb24ubyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vaWRjdGRzcF9uZW9uLm8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vc2ltcGxlX2lkY3RfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfTURDVCkgICAgICAgICAgICAgICArPSBhcm0vbWRjdF9uZW9uLm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vbWRjdF9maXhlZF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19NUEVHVklERU8pICAgICAgICAgICs9IGFybS9tcGVndmlkZW9fbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfUkRGVCkgICAgICAgICAgICAgICArPSBhcm0vcmRmdF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19WUDNEU1ApICAgICAgICAgICAgICs9IGFybS92cDNkc3BfbmVvbi5vCisKKyMgZGVjb2RlcnMvZW5jb2RlcnMKK05FT04tT0JKUy0kKENPTkZJR19BQUNfREVDT0RFUikgICAgICAgICs9IGFybS9hYWNwc2RzcF9uZW9uLm8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9zYnJkc3BfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfTExBVUREU1ApICAgICAgICAgICArPSBhcm0vbG9zc2xlc3NfYXVkaW9kc3BfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfRENBX0RFQ09ERVIpICAgICAgICArPSBhcm0vZGNhZHNwX25lb24ubyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vc3ludGhfZmlsdGVyX25lb24ubworTkVPTi1PQkpTLSQoQ09ORklHX1JWMzBfREVDT0RFUikgICAgICAgKz0gYXJtL3J2MzRkc3BfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfUlY0MF9ERUNPREVSKSAgICAgICArPSBhcm0vcnYzNGRzcF9uZW9uLm8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vcnY0MGRzcF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19WQzFfREVDT0RFUikgICAgICAgICs9IGFybS92YzFkc3BfaW5pdF9uZW9uLm8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92YzFkc3BfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfVk9SQklTX0RFQ09ERVIpICAgICArPSBhcm0vdm9yYmlzZHNwX25lb24ubworTkVPTi1PQkpTLSQoQ09ORklHX1ZQNl9ERUNPREVSKSAgICAgICAgKz0gYXJtL3ZwNmRzcF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19WUDdfREVDT0RFUikgICAgICAgICs9IGFybS92cDhkc3BfaW5pdF9uZW9uLm8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92cDhkc3BfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfVlA4X0RFQ09ERVIpICAgICAgICArPSBhcm0vdnA4ZHNwX2luaXRfbmVvbi5vICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vdnA4ZHNwX25lb24ubwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FhYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FhYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZmE4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYWFjLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BUk1fQUFDX0gKKyNkZWZpbmUgQVZDT0RFQ19BUk1fQUFDX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgSEFWRV9ORU9OX0lOTElORQorCisjZGVmaW5lIFZNVUwyIFZNVUwyCitzdGF0aWMgaW5saW5lIGZsb2F0ICpWTVVMMihmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqdiwgdW5zaWduZWQgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlKQoreworICAgIHVuc2lnbmVkIHYwLCB2MTsKKyAgICBfX2FzbV9fICgidWJmeCAgICAgJTAsICAlNiwgICMwLCAjNCAgICAgIFxuXHQiCisgICAgICAgICAgICAgInViZnggICAgICUxLCAgJTYsICAjNCwgIzQgICAgICBcblx0IgorICAgICAgICAgICAgICJsZHIgICAgICAlMCwgIFslNSwgJTAsIGxzbCAjMl0gXG5cdCIKKyAgICAgICAgICAgICAibGRyICAgICAgJTEsICBbJTUsICUxLCBsc2wgIzJdIFxuXHQiCisgICAgICAgICAgICAgInZsZDEuMzIgIHtkMVtdfSwgICBbJTcsOjMyXSAgICBcblx0IgorICAgICAgICAgICAgICJ2bW92ICAgICBkMCwgICUwLCAgJTEgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAidm11bC5mMzIgZDAsICBkMCwgIGQxICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInZzdDEuMzIgIHtkMH0sICAgICBbJTIsOjY0XSEgICBcblx0IgorICAgICAgICAgICAgIDogIj0mciIodjApLCAiPSZyIih2MSksICIrciIoZHN0KSwgIj1tIihkc3RbMF0pLCAiPW0iKGRzdFsxXSkKKyAgICAgICAgICAgICA6ICJyIih2KSwgInIiKGlkeCksICJyIihzY2FsZSkKKyAgICAgICAgICAgICA6ICJkMCIsICJkMSIpOworICAgIHJldHVybiBkc3Q7Cit9CisKKyNkZWZpbmUgVk1VTDQgVk1VTDQKK3N0YXRpYyBpbmxpbmUgZmxvYXQgKlZNVUw0KGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICp2LCB1bnNpZ25lZCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGUpCit7CisgICAgdW5zaWduZWQgdjAsIHYxLCB2MiwgdjM7CisgICAgX19hc21fXyAoInViZnggICAgICUwLCAgJTEwLCAjMCwgIzIgICAgICBcblx0IgorICAgICAgICAgICAgICJ1YmZ4ICAgICAlMSwgICUxMCwgIzIsICMyICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibGRyICAgICAgJTAsICBbJTksICUwLCBsc2wgIzJdIFxuXHQiCisgICAgICAgICAgICAgInViZnggICAgICUyLCAgJTEwLCAjNCwgIzIgICAgICBcblx0IgorICAgICAgICAgICAgICJsZHIgICAgICAlMSwgIFslOSwgJTEsIGxzbCAjMl0gXG5cdCIKKyAgICAgICAgICAgICAidWJmeCAgICAgJTMsICAlMTAsICM2LCAjMiAgICAgIFxuXHQiCisgICAgICAgICAgICAgImxkciAgICAgICUyLCAgWyU5LCAlMiwgbHNsICMyXSBcblx0IgorICAgICAgICAgICAgICJ2bW92ICAgICBkMCwgICUwLCAgJTEgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibGRyICAgICAgJTMsICBbJTksICUzLCBsc2wgIzJdIFxuXHQiCisgICAgICAgICAgICAgInZsZDEuMzIgIHtkMltdLGQzW119LFslMTEsOjMyXSBcblx0IgorICAgICAgICAgICAgICJ2bW92ICAgICBkMSwgICUyLCAgJTMgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAidm11bC5mMzIgcTAsICBxMCwgIHExICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInZzdDEuMzIgIHtxMH0sICAgICBbJTQsOjEyOF0hICBcblx0IgorICAgICAgICAgICAgIDogIj0mciIodjApLCAiPSZyIih2MSksICI9JnIiKHYyKSwgIj0mciIodjMpLCAiK3IiKGRzdCksCisgICAgICAgICAgICAgICAiPW0iKGRzdFswXSksICI9bSIoZHN0WzFdKSwgIj1tIihkc3RbMl0pLCAiPW0iKGRzdFszXSkKKyAgICAgICAgICAgICA6ICJyIih2KSwgInIiKGlkeCksICJyIihzY2FsZSkKKyAgICAgICAgICAgICA6ICJkMCIsICJkMSIsICJkMiIsICJkMyIpOworICAgIHJldHVybiBkc3Q7Cit9CisKKyNkZWZpbmUgVk1VTDJTIFZNVUwyUworc3RhdGljIGlubGluZSBmbG9hdCAqVk1VTDJTKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICp2LCB1bnNpZ25lZCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2lnbiwgY29uc3QgZmxvYXQgKnNjYWxlKQoreworICAgIHVuc2lnbmVkIHYwLCB2MSwgdjIsIHYzOworICAgIF9fYXNtX18gKCJ1YmZ4ICAgICAlMCwgICU4LCAgIzAsICM0ICAgICAgXG5cdCIKKyAgICAgICAgICAgICAidWJmeCAgICAgJTEsICAlOCwgICM0LCAjNCAgICAgIFxuXHQiCisgICAgICAgICAgICAgImxkciAgICAgICUwLCAgWyU3LCAlMCwgbHNsICMyXSBcblx0IgorICAgICAgICAgICAgICJsc2wgICAgICAlMiwgICUxMCwgIzMwICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibGRyICAgICAgJTEsICBbJTcsICUxLCBsc2wgIzJdIFxuXHQiCisgICAgICAgICAgICAgImxzbCAgICAgICUzLCAgJTEwLCAjMzEgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJ2bW92ICAgICBkMCwgICUwLCAgJTEgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAiYmljICAgICAgJTIsICAlMiwgICMxPDwzMCAgICAgIFxuXHQiCisgICAgICAgICAgICAgInZsZDEuMzIgIHtkMVtdfSwgICBbJTksOjMyXSAgICBcblx0IgorICAgICAgICAgICAgICJ2bW92ICAgICBkMiwgICUyLCAgJTMgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAidmVvciAgICAgZDAsICBkMCwgIGQyICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInZtdWwuZjMyIGQwLCAgZDAsICBkMSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJ2c3QxLjMyICB7ZDB9LCAgICAgWyU0LDo2NF0hICAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9JnIiKHYwKSwgIj0mciIodjEpLCAiPSZyIih2MiksICI9JnIiKHYzKSwgIityIihkc3QpLAorICAgICAgICAgICAgICAgIj1tIihkc3RbMF0pLCAiPW0iKGRzdFsxXSkKKyAgICAgICAgICAgICA6ICJyIih2KSwgInIiKGlkeCksICJyIihzY2FsZSksICJyIihzaWduKQorICAgICAgICAgICAgIDogImQwIiwgImQxIiwgImQyIik7CisgICAgcmV0dXJuIGRzdDsKK30KKworI2RlZmluZSBWTVVMNFMgVk1VTDRTCitzdGF0aWMgaW5saW5lIGZsb2F0ICpWTVVMNFMoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnYsIHVuc2lnbmVkIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaWduLCBjb25zdCBmbG9hdCAqc2NhbGUpCit7CisgICAgdW5zaWduZWQgdjAsIHYxLCB2MiwgdjMsIG56OworICAgIF9fYXNtX18gKCJ2bGQxLjMyICB7ZDJbXSxkM1tdfSxbJTEzLDozMl0gXG5cdCIKKyAgICAgICAgICAgICAidWJmeCAgICAgJTAsICAlMTIsICMwLCAjMiAgICAgIFxuXHQiCisgICAgICAgICAgICAgInViZnggICAgICUxLCAgJTEyLCAjMiwgIzIgICAgICBcblx0IgorICAgICAgICAgICAgICJsZHIgICAgICAlMCwgIFslMTEsJTAsIGxzbCAjMl0gXG5cdCIKKyAgICAgICAgICAgICAidWJmeCAgICAgJTIsICAlMTIsICM0LCAjMiAgICAgIFxuXHQiCisgICAgICAgICAgICAgImxkciAgICAgICUxLCAgWyUxMSwlMSwgbHNsICMyXSBcblx0IgorICAgICAgICAgICAgICJ1YmZ4ICAgICAlMywgICUxMiwgIzYsICMyICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibGRyICAgICAgJTIsICBbJTExLCUyLCBsc2wgIzJdIFxuXHQiCisgICAgICAgICAgICAgInZtb3YgICAgIGQwLCAgJTAsICAlMSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsZHIgICAgICAlMywgIFslMTEsJTMsIGxzbCAjMl0gXG5cdCIKKyAgICAgICAgICAgICAibHNyICAgICAgJTYsICAlMTIsICMxMiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInJiaXQgICAgICU2LCAgJTYgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJ2bW92ICAgICBkMSwgICUyLCAgJTMgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHNscyAgICAgJTYsICAlNiwgICMxICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImFuZCAgICAgICUwLCAgJTUsICAjMTw8MzEgICAgICBcblx0IgorICAgICAgICAgICAgICJpdCAgICAgICBjcyAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHNsY3MgICAgJTUsICAlNSwgICMxICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImxzbHMgICAgICU2LCAgJTYsICAjMSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJhbmQgICAgICAlMSwgICU1LCAgIzE8PDMxICAgICAgXG5cdCIKKyAgICAgICAgICAgICAiaXQgICAgICAgY3MgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImxzbGNzICAgICU1LCAgJTUsICAjMSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsc2xzICAgICAlNiwgICU2LCAgIzEgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAiYW5kICAgICAgJTIsICAlNSwgICMxPDwzMSAgICAgIFxuXHQiCisgICAgICAgICAgICAgIml0ICAgICAgIGNzICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsc2xjcyAgICAlNSwgICU1LCAgIzEgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAidm1vdiAgICAgZDQsICAlMCwgICUxICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImFuZCAgICAgICUzLCAgJTUsICAjMTw8MzEgICAgICBcblx0IgorICAgICAgICAgICAgICJ2bW92ICAgICBkNSwgICUyLCAgJTMgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAidmVvciAgICAgcTAsICBxMCwgIHEyICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInZtdWwuZjMyIHEwLCAgcTAsICBxMSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJ2c3QxLjMyICB7cTB9LCAgICAgWyU0LDoxMjhdISAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9JnIiKHYwKSwgIj0mciIodjEpLCAiPSZyIih2MiksICI9JnIiKHYzKSwgIityIihkc3QpLAorICAgICAgICAgICAgICAgIityIihzaWduKSwgIj1yIihueiksCisgICAgICAgICAgICAgICAiPW0iKGRzdFswXSksICI9bSIoZHN0WzFdKSwgIj1tIihkc3RbMl0pLCAiPW0iKGRzdFszXSkKKyAgICAgICAgICAgICA6ICJyIih2KSwgInIiKGlkeCksICJyIihzY2FsZSkKKyAgICAgICAgICAgICA6ICJjYyIsICJkMCIsICJkMSIsICJkMiIsICJkMyIsICJkNCIsICJkNSIpOworICAgIHJldHVybiBkc3Q7Cit9CisKKyNlbmRpZiAvKiBIQVZFX05FT05fSU5MSU5FICovCisKKyNlbmRpZiAvKiBBVkNPREVDX0FSTV9BQUNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FhY3BzZHNwX2luaXRfYXJtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYWFjcHNkc3BfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQ3ODdjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FhY3BzZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNYW5zIFJ1bGxnYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2FhY3BzZHNwLmgiCisKK3ZvaWQgZmZfcHNfYWRkX3NxdWFyZXNfbmVvbihmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAoKnNyYylbMl0sIGludCBuKTsKK3ZvaWQgZmZfcHNfbXVsX3BhaXJfc2luZ2xlX25lb24oZmxvYXQgKCpkc3QpWzJdLCBmbG9hdCAoKnNyYzApWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqc3JjMSwgaW50IG4pOwordm9pZCBmZl9wc19oeWJyaWRfYW5hbHlzaXNfbmVvbihmbG9hdCAoKm91dClbMl0sIGZsb2F0ICgqaW4pWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAoKmZpbHRlcilbOF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBuKTsKK3ZvaWQgZmZfcHNfaHlicmlkX2FuYWx5c2lzX2lsZWF2ZV9uZW9uKGZsb2F0ICgqb3V0KVszMl1bMl0sIGZsb2F0IExbMl1bMzhdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgbGVuKTsKK3ZvaWQgZmZfcHNfaHlicmlkX3N5bnRoZXNpc19kZWludF9uZW9uKGZsb2F0IG91dFsyXVszOF1bNjRdLCBmbG9hdCAoKmluKVszMl1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGxlbik7Cit2b2lkIGZmX3BzX2RlY29ycmVsYXRlX25lb24oZmxvYXQgKCpvdXQpWzJdLCBmbG9hdCAoKmRlbGF5KVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAoKmFwX2RlbGF5KVtQU19RTUZfVElNRV9TTE9UUytQU19NQVhfQVBfREVMQVldWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHBoaV9mcmFjdFsyXSwgZmxvYXQgKCpRX2ZyYWN0KVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqdHJhbnNpZW50X2dhaW4sIGZsb2F0IGdfZGVjYXlfc2xvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7Cit2b2lkIGZmX3BzX3N0ZXJlb19pbnRlcnBvbGF0ZV9uZW9uKGZsb2F0ICgqbClbMl0sIGZsb2F0ICgqcilbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhbMl1bNF0sIGZsb2F0IGhfc3RlcFsyXVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7CisKK2F2X2NvbGQgdm9pZCBmZl9wc2RzcF9pbml0X2FybShQU0RTUENvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5hZGRfc3F1YXJlcyAgICAgICAgICAgID0gZmZfcHNfYWRkX3NxdWFyZXNfbmVvbjsKKyAgICAgICAgcy0+bXVsX3BhaXJfc2luZ2xlICAgICAgICA9IGZmX3BzX211bF9wYWlyX3NpbmdsZV9uZW9uOworICAgICAgICBzLT5oeWJyaWRfc3ludGhlc2lzX2RlaW50ID0gZmZfcHNfaHlicmlkX3N5bnRoZXNpc19kZWludF9uZW9uOworICAgICAgICBzLT5oeWJyaWRfYW5hbHlzaXMgICAgICAgID0gZmZfcHNfaHlicmlkX2FuYWx5c2lzX25lb247CisgICAgICAgIHMtPnN0ZXJlb19pbnRlcnBvbGF0ZVswXSAgPSBmZl9wc19zdGVyZW9faW50ZXJwb2xhdGVfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYWFjcHNkc3BfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FhY3BzZHNwX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTNiYmZlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FhY3BzZHNwX25lb24uUwpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNYW5zIFJ1bGxnYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9wc19hZGRfc3F1YXJlc19uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMAorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICM0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTAsICBxMCwgIHEwCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTJ9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTIsICBxMiwgIHEyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTF9LCAgICAgW3IwLDoxMjhdIQorMToKKyAgICAgICAgdnBhZGQuZjMyICAgICAgIGQ2LCAgZDAsICBkMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdnBhZGQuZjMyICAgICAgIGQ3LCAgZDQsICBkNQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTAsICBxMCwgIHEwCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTJ9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTMsICBxMSwgIHEzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTF9LCAgICAgW3IwLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTIsICBxMiwgIHEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTN9LCAgICAgW3IzLDoxMjhdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjIsICByMiwgICM0CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICB2cGFkZC5mMzIgICAgICAgZDYsICBkMCwgIGQxCisgICAgICAgIHZwYWRkLmYzMiAgICAgICBkNywgIGQ0LCAgZDUKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIHExLCAgcTEsICBxMworICAgICAgICB2c3QxLjMyICAgICAgICAge3ExfSwgICAgIFtyMyw6MTI4XSEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3BzX211bF9wYWlyX3NpbmdsZV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgICM0CisgICAgICAgIHRzdCAgICAgICAgICAgICByMSwgICM4CisgICAgICAgIGJuZSAgICAgICAgICAgICAyZgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKKzE6CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTN9LCAgICAgW3IyLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDQsICBkMCwgIGQ2WzBdCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNSwgIGQxLCAgZDZbMV0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNiwgIGQyLCAgZDdbMF0KKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQ3LCAgZDMsICBkN1sxXQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxMixxM30sICBbcjAsOjEyOF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzQKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTN9LCAgICAgW3IyLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDQsICBkMCwgIGQ2WzBdCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNSwgIGQxLCAgZDZbMV0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNiwgIGQyLCAgZDdbMF0KKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQ3LCAgZDMsICBkN1sxXQorICAgICAgICB2c3QxLjMyICAgICAgICAge3EyLHEzfSwgIFtyMCw6MTI4XSEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCisyOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwfSwgICAgIFtyMSw6NjRdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxLGQyfSwgIFtyMSw6MTI4XSEKKzE6CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTN9LCAgICAgW3IyLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDQsICBkMCwgIGQ2WzBdCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNSwgIGQxLCAgZDZbMV0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMCxkMX0sICBbcjEsOjEyOF0hCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNiwgIGQyLCAgZDdbMF0KKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQ3LCAgZDAsICBkN1sxXQorICAgICAgICB2bW92ICAgICAgICAgICAgZDAsICBkMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxLGQyfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxMixxM30sICBbcjAsOjEyOF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzQKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTN9LCAgICAgW3IyLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDQsICBkMCwgIGQ2WzBdCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNSwgIGQxLCAgZDZbMV0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMH0sICAgICBbcjEsOjY0XSEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQ2LCAgZDIsICBkN1swXQorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDcsICBkMCwgIGQ3WzFdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTIscTN9LCAgW3IwLDoxMjhdIQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHNfaHlicmlkX3N5bnRoZXNpc19kZWludF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI4LGxyfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyLCAgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIsICBsc2wgIzUrMSsyCisgICAgICAgIHJzYiAgICAgICAgICAgICByMiwgIHIyLCAgIzY0CisgICAgICAgIG1vdiAgICAgICAgICAgICByNSwgICM2NCo0CisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHIwCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIHIwLCAgIzM4KjY0KjQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgcjMKKzI6CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDAsZDF9LCAgW3IxLDoxMjhdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwWzBdfSwgIFtsciw6MzJdLCByNQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwWzFdfSwgIFtyNCw6MzJdLCByNQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxWzBdfSwgIFtsciw6MzJdLCByNQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxWzFdfSwgIFtyNCw6MzJdLCByNQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGJndCAgICAgICAgICAgICAyYgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzEKKyAgICAgICAgdHN0ICAgICAgICAgICAgIHIyLCAgIzIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDZmCisxOgorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICByMCwgICMzOCo2NCo0CisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHIxLCAgIyAgMzIqMio0CisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHIxLCAgIzIqMzIqMio0CisgICAgICAgIGFkZCAgICAgICAgICAgICByOCwgIHIxLCAgIzMqMzIqMio0CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsIHIzCisyOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwLGQxfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMixkM30sICBbcjYsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDQsZDV9LCAgW3I3LDoxMjhdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q2LGQ3fSwgIFtyOCw6MTI4XSEKKyAgICAgICAgdnN0NC4zMiAgICAgICAgIHtkMFswXSxkMlswXSxkNFswXSxkNlswXX0sIFtsciw6MTI4XSwgcjUKKyAgICAgICAgdnN0NC4zMiAgICAgICAgIHtkMFsxXSxkMlsxXSxkNFsxXSxkNlsxXX0sIFtyNCw6MTI4XSwgcjUKKyAgICAgICAgdnN0NC4zMiAgICAgICAgIHtkMVswXSxkM1swXSxkNVswXSxkN1swXX0sIFtsciw6MTI4XSwgcjUKKyAgICAgICAgdnN0NC4zMiAgICAgICAgIHtkMVsxXSxkM1sxXSxkNVsxXSxkN1sxXX0sIFtyNCw6MTI4XSwgcjUKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMmIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjMTYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICAjMyozMioyKjQKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjNAorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOCxwY30KKzY6CisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHIwCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIHIwLCAgIzM4KjY0KjQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjEsICAjMzIqMio0CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsIHIzCisyOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwLGQxfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMixkM30sICBbcjYsOjEyOF0hCisgICAgICAgIHZzdDIuMzIgICAgICAgICB7ZDBbMF0sZDJbMF19LCBbbHIsOjY0XSwgcjUKKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkMFsxXSxkMlsxXX0sIFtyNCw6NjRdLCByNQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QxWzBdLGQzWzBdfSwgW2xyLDo2NF0sIHI1CisgICAgICAgIHZzdDIuMzIgICAgICAgICB7ZDFbMV0sZDNbMV19LCBbcjQsOjY0XSwgcjUKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMmIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgICMzMioyKjQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICAjMgorICAgICAgICBiICAgICAgICAgICAgICAgMWIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHNfaHlicmlkX2FuYWx5c2lzX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZsZG0gICAgICAgICAgICByMSwgIHtkMTktZDMxfQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdCisgICAgICAgIGxzbCAgICAgICAgICAgICByMywgIHIzLCAgIzMKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQxNiwgZDE5LCBkMzEKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQxNywgZDIwLCBkMzAKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQxOCwgZDE5LCBkMzEKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQxOSwgZDIwLCBkMzAKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQwLCAgZDIxLCBkMjkKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQxLCAgZDIyLCBkMjgKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQyLCAgZDIxLCBkMjkKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQzLCAgZDIyLCBkMjgKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQyMCwgZDIzLCBkMjcKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQyMSwgZDI0LCBkMjYKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQyMiwgZDIzLCBkMjcKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQyMywgZDI0LCBkMjYKKyAgICAgICAgdm1vdi5pMzIgICAgICAgIGQ2LCAgIzE8PDMxCisgICAgICAgIHZtb3YuaTMyICAgICAgICBkNywgICMwCisgICAgICAgIHZtb3YuZjMyICAgICAgICBxMTQsICMwLjAKKyAgICAgICAgdm1vdi5mMzIgICAgICAgIHExNSwgIzAuMAorICAgICAgICB2dHJuLjMyICAgICAgICAgZDYsICBkNworICAgICAgICB2cmV2NjQuMzIgICAgICAgcTksICBxOQorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTAsICBxMAorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTExLCBxMTEKKyAgICAgICAgdmVvciAgICAgICAgICAgIHE5LCAgcTksICBxMworICAgICAgICB2ZW9yICAgICAgICAgICAgcTAsICBxMCwgIHEzCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMTEsIHExMSwgcTMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTN9LCAgICBbcjIsOjEyOF0hCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBxOCwgIHE5CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBxMSwgIHEwCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBxMTAsIHExMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgICAgIHZtbGEuZjMyICAgICAgICBxMTQsIHE4LCAgcTEzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTJ9LCAgICAgW3IyLDoxMjhdIQorICAgICAgICB2bWxhLmYzMiAgICAgICAgcTE1LCBxOSwgIHExMworMToKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIHExNCwgcTEsICBxMgorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExM30sICAgIFtyMiw6MTI4XSEKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIHExNSwgcTAsICBxMgorICAgICAgICB2bWxhLmYzMiAgICAgICAgcTE0LCBxMTAsIHExMworICAgICAgICB2bGQxLjMyICAgICAgICAge3EyfSwgICAgIFtyMiw6MTI4XSEKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIHExNSwgcTExLCBxMTMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTN9LCAgICBbcjIsOjEyOF0hCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkNiwgIGQyOCwgZDI5CisgICAgICAgIHZhZGQuZjMyICAgICAgICBkNywgIGQzMCwgZDMxCisgICAgICAgIHZtb3YuZjMyICAgICAgICBxMTQsICMwLjAKKyAgICAgICAgdm1vdi5mMzIgICAgICAgIHExNSwgIzAuMAorICAgICAgICB2bWxhLmYzMiAgICAgICAgcTE0LCBxOCwgIHExMworICAgICAgICB2cGFkZC5mMzIgICAgICAgZDYsICBkNiwgIGQ3CisgICAgICAgIHZtbGEuZjMyICAgICAgICBxMTUsIHE5LCAgcTEzCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkNiwgIGQyNSwgZDRbMF0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMn0sICAgICBbcjIsOjEyOF0hCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDZ9LCAgICAgW3IwLDo2NF0sIHIzCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIHZtbGEuZjMyICAgICAgICBxMTQsIHExLCAgcTIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTN9LCAgICBbcjIsOjEyOF0hCisgICAgICAgIHZtbGEuZjMyICAgICAgICBxMTUsIHEwLCAgcTIKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIHExNCwgcTEwLCBxMTMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMn0sICAgICBbcjIsOjEyOF0hCisgICAgICAgIHZtbGEuZjMyICAgICAgICBxMTUsIHExMSwgcTEzCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkNiwgIGQyOCwgZDI5CisgICAgICAgIHZhZGQuZjMyICAgICAgICBkNywgIGQzMCwgZDMxCisgICAgICAgIHZwYWRkLmYzMiAgICAgICBkNiwgIGQ2LCAgZDcKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQ2LCAgZDI1LCBkNFswXQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q2fSwgICAgIFtyMCw6NjRdLCByMworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHNfc3RlcmVvX2ludGVycG9sYXRlX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IyXQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExNH0sICAgIFtyM10KKyAgICAgICAgdmFkZC5mMzIgICAgICAgIHExNSwgcTE0LCBxMTQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIyLCAgcjAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgcjEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTEsICBxMCwgIHExNAorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTAsICBxMCwgIHExNQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EyfSwgICAgIFtyMCw6NjRdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EzfSwgICAgIFtyMSw6NjRdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgICAgIGJlcSAgICAgICAgICAgICAyZgorMToKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQxNiwgZDQsICBkMlswXQorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDE3LCBkNSwgIGQwWzBdCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMTgsIGQ0LCAgZDJbMV0KKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQxOSwgZDUsICBkMFsxXQorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDE2LCBkNiwgIGQzWzBdCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMTcsIGQ3LCAgZDFbMF0KKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQxOCwgZDYsICBkM1sxXQorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDE5LCBkNywgIGQxWzFdCisgICAgICAgIHZhZGQuZjMyICAgICAgICBxMSwgIHExLCAgcTE1CisgICAgICAgIHZhZGQuZjMyICAgICAgICBxMCwgIHEwLCAgcTE1CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTJ9LCAgICAgW3IwLDo2NF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTN9LCAgICAgW3IxLDo2NF0hCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTh9LCAgICAgW3IyLDo2NF0hCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTl9LCAgICAgW3IzLDo2NF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIGl0ICAgICAgICAgICAgICBsdAorICAgICAgICBieGx0ICAgICAgICAgICAgbHIKKzI6CisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMTYsIGQ0LCAgZDJbMF0KKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQxOCwgZDQsICBkMlsxXQorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDE2LCBkNiwgIGQzWzBdCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMTgsIGQ2LCAgZDNbMV0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTZ9LCAgICBbcjIsOjY0XSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTh9LCAgICBbcjMsOjY0XSEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYWMzZHNwX2FybS5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FjM2RzcF9hcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWVhMTkwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FjM2RzcF9hcm0uUwpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworZnVuY3Rpb24gZmZfYWMzX3VwZGF0ZV9iYXBfY291bnRzX2FybSwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtscn0KKyAgICAgICAgbGRyYiAgICAgICAgICAgIGxyLCAgW3IxXSwgIzEKKzE6CisgICAgICAgIGxzbCAgICAgICAgICAgICByMywgIGxyLCAgIzEKKyAgICAgICAgbGRyaCAgICAgICAgICAgIHIxMiwgW3IwLCByM10KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjMQorICAgICAgICBpdCAgICAgICAgICAgICAgZ3QKKyAgICAgICAgbGRyYmd0ICAgICAgICAgIGxyLCAgW3IxXSwgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICBzdHJoICAgICAgICAgICAgcjEyLCBbcjAsIHIzXQorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtwY30KK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9hYzNkc3BfYXJtdjYuUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9hYzNkc3BfYXJtdjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI1NjNkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FjM2RzcF9hcm12Ni5TCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9hYzNfYml0X2FsbG9jX2NhbGNfYmFwX2FybXY2LCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdCisgICAgICAgIGNtcCAgICAgICAgICAgICByMTIsICMtOTYwCisgICAgICAgIGJlcSAgICAgICAgICAgICA0ZgorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMSxscn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCAgc3AsICAjNDAKKyAgICAgICAgbW92cmVseCAgICAgICAgIHI0LCAgWChmZl9hYzNfYmluX3RvX2JhbmRfdGFiKSwgcjExCisgICAgICAgIG1vdnJlbHggICAgICAgICBsciwgIFgoZmZfYWMzX2JhbmRfc3RhcnRfdGFiKQorICAgICAgICBsZG0gICAgICAgICAgICAgcjUsICB7cjUtcjd9CisgICAgICAgIGxkcmIgICAgICAgICAgICByNCwgIFtyNCwgcjJdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIsICBsc2wgIzEgICAgICAgICAgIEAgcHNkICsgc3RhcnQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByNCwgIGxzbCAjMSAgICAgICAgICAgQCBtYXNrICsgYmFuZAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICByNCwgIGxyCisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHI3LCAgcjIgICAgICAgICAgICAgICAgICAgIEAgYmFwICsgc3RhcnQKKzE6CisgICAgICAgIGxkcnNoICAgICAgICAgICByOSwgIFtyMF0sICMyICAgICAgICAgICAgICAgICAgIEAgbWFza1tiYW5kXQorICAgICAgICBtb3YgICAgICAgICAgICAgcjgsICAjMHhmZjAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHI5LCAgcjksICByMTIgICAgICAgICAgICAgICAgICAgQCAgIC0gc25yX29mZnNldAorICAgICAgICBsZHJiICAgICAgICAgICAgcjEwLCBbcjQsICMxXSEgICAgICAgICAgICAgICAgICBAIGJhbmRfc3RhcnRfdGFiWysrYmFuZF0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHI5LCAgcjksICByNSAgICAgICAgICAgICAgICAgICAgQCAgIC0gZmxvb3IKKyAgICAgICAgaXQgICAgICAgICAgICAgIGx0CisgICAgICAgIG1vdmx0ICAgICAgICAgICByOSwgICMwCisgICAgICAgIGNtcCAgICAgICAgICAgICByMTAsIHIzICAgICAgICAgICAgICAgICAgICAgICAgIEAgICAtIGVuZAorICAgICAgICBhbmQgICAgICAgICAgICAgcjksICByOSwgIHI4LCBsc2wgIzEgICAgICAgICAgICBAICAgJiAweDFmZTAKKyAgICAgICAgaXRlICAgICAgICAgICAgIGd0CisgICAgICAgIHN1Ymd0ICAgICAgICAgICByOCwgIHIzLCAgcjIKKyAgICAgICAgc3VibGUgICAgICAgICAgIHI4LCAgcjEwLCByMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjIsICByMTAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI5LCAgcjksICByNSAgICAgICAgICAgICAgICAgICAgQCAgICsgZmxvb3IgPT4gbQorICAgICAgICB0c3QgICAgICAgICAgICAgcjgsICAjMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjExLCByNywgIHI4CisgICAgICAgIGJuZSAgICAgICAgICAgICAzZgorICAgICAgICBiICAgICAgICAgICAgICAgNWYKKzI6CisgICAgICAgIGxkcnNoICAgICAgICAgICByOCwgIFtyMV0sICMyCisgICAgICAgIGxkcnNoICAgICAgICAgICBsciwgIFtyMV0sICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByOCwgIHI4LCAgcjkKKyAgICAgICAgc3ViICAgICAgICAgICAgIGxyLCAgbHIsICByOQorICAgICAgICB1c2F0ICAgICAgICAgICAgcjgsICAjNiwgIHI4LCAgYXNyICM1ICAgICAgICAgICBAIGFkZHJlc3MKKyAgICAgICAgdXNhdCAgICAgICAgICAgIGxyLCAgIzYsICBsciwgIGFzciAjNQorICAgICAgICBsZHJiICAgICAgICAgICAgcjgsICBbcjYsIHI4XSAgICAgICAgICAgICAgICAgICBAIGJhcF90YWJbYWRkcmVzc10KKyAgICAgICAgbGRyYiAgICAgICAgICAgIGxyLCAgW3I2LCBscl0KKyAgICAgICAgc3RyYiAgICAgICAgICAgIHI4LCAgW3I3XSwgIzEgICAgICAgICAgICAgICAgICAgQCBiYXBbYmluXQorICAgICAgICBzdHJiICAgICAgICAgICAgbHIsICBbcjddLCAjMQorNTogICAgICBjbXAgICAgICAgICAgICAgcjcsICByMTEKKyAgICAgICAgYmxvICAgICAgICAgICAgIDJiCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgIHIxMAorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTEscGN9CiszOgorICAgICAgICBsZHJzaCAgICAgICAgICAgcjgsICBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICBAIHBzZFtiaW5dCisgICAgICAgIHN1YiAgICAgICAgICAgICByOCwgIHI4LCAgcjkgICAgICAgICAgICAgICAgICAgIEAgICAtIG0KKyAgICAgICAgdXNhdCAgICAgICAgICAgIHI4LCAgIzYsICByOCwgIGFzciAjNSAgICAgICAgICAgQCBhZGRyZXNzCisgICAgICAgIGxkcmIgICAgICAgICAgICByOCwgIFtyNiwgcjhdICAgICAgICAgICAgICAgICAgIEAgYmFwX3RhYlthZGRyZXNzXQorICAgICAgICBzdHJiICAgICAgICAgICAgcjgsICBbcjddLCAjMSAgICAgICAgICAgICAgICAgICBAIGJhcFtiaW5dCisgICAgICAgIGIgICAgICAgICAgICAgICA1YgorNDoKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIwLCAgW3NwLCAjMTJdCisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgICMwCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgICMyNTYKKyAgICAgICAgYiAgICAgICAgICAgICAgIFgobWVtc2V0KQorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FjM2RzcF9pbml0X2FybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FjM2RzcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzMyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYWMzZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYWMzZHNwLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKK3ZvaWQgZmZfYWMzX2V4cG9uZW50X21pbl9uZW9uKHVpbnQ4X3QgKmV4cCwgaW50IG51bV9yZXVzZV9ibG9ja3MsIGludCBuYl9jb2Vmcyk7CitpbnQgZmZfYWMzX21heF9tc2JfYWJzX2ludDE2X25lb24oY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgbGVuKTsKK3ZvaWQgZmZfYWMzX2xzaGlmdF9pbnQxNl9uZW9uKGludDE2X3QgKnNyYywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBzaGlmdCk7Cit2b2lkIGZmX2FjM19yc2hpZnRfaW50MzJfbmVvbihpbnQzMl90ICpzcmMsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgc2hpZnQpOwordm9pZCBmZl9mbG9hdF90b19maXhlZDI0X25lb24oaW50MzJfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKTsKK3ZvaWQgZmZfYWMzX2V4dHJhY3RfZXhwb25lbnRzX25lb24odWludDhfdCAqZXhwLCBpbnQzMl90ICpjb2VmLCBpbnQgbmJfY29lZnMpOwordm9pZCBmZl9hcHBseV93aW5kb3dfaW50MTZfbmVvbihpbnQxNl90ICpkc3QsIGNvbnN0IGludDE2X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqd2luZG93LCB1bnNpZ25lZCBuKTsKK3ZvaWQgZmZfYWMzX3N1bV9zcXVhcmVfYnV0dGVyZmx5X2ludDMyX25lb24oaW50NjRfdCBzdW1bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmNvZWYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpjb2VmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7Cit2b2lkIGZmX2FjM19zdW1fc3F1YXJlX2J1dHRlcmZseV9mbG9hdF9uZW9uKGZsb2F0IHN1bVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmNvZWYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqY29lZjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCit2b2lkIGZmX2FjM19iaXRfYWxsb2NfY2FsY19iYXBfYXJtdjYoaW50MTZfdCAqbWFzaywgaW50MTZfdCAqcHNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc25yX29mZnNldCwgaW50IGZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJhcF90YWIsIHVpbnQ4X3QgKmJhcCk7CisKK3ZvaWQgZmZfYWMzX3VwZGF0ZV9iYXBfY291bnRzX2FybSh1aW50MTZfdCBtYW50X2NudFsxNl0sIHVpbnQ4X3QgKmJhcCwgaW50IGxlbik7CisKK2F2X2NvbGQgdm9pZCBmZl9hYzNkc3BfaW5pdF9hcm0oQUMzRFNQQ29udGV4dCAqYywgaW50IGJpdF9leGFjdCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgYy0+dXBkYXRlX2JhcF9jb3VudHMgICAgICAgICA9IGZmX2FjM191cGRhdGVfYmFwX2NvdW50c19hcm07CisKKyAgICBpZiAoaGF2ZV9hcm12NihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmJpdF9hbGxvY19jYWxjX2JhcCAgICA9IGZmX2FjM19iaXRfYWxsb2NfY2FsY19iYXBfYXJtdjY7CisgICAgfQorCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmFjM19leHBvbmVudF9taW4gICAgICA9IGZmX2FjM19leHBvbmVudF9taW5fbmVvbjsKKyAgICAgICAgYy0+YWMzX21heF9tc2JfYWJzX2ludDE2ID0gZmZfYWMzX21heF9tc2JfYWJzX2ludDE2X25lb247CisgICAgICAgIGMtPmFjM19sc2hpZnRfaW50MTYgICAgICA9IGZmX2FjM19sc2hpZnRfaW50MTZfbmVvbjsKKyAgICAgICAgYy0+YWMzX3JzaGlmdF9pbnQzMiAgICAgID0gZmZfYWMzX3JzaGlmdF9pbnQzMl9uZW9uOworICAgICAgICBjLT5mbG9hdF90b19maXhlZDI0ICAgICAgPSBmZl9mbG9hdF90b19maXhlZDI0X25lb247CisgICAgICAgIGMtPmV4dHJhY3RfZXhwb25lbnRzICAgICA9IGZmX2FjM19leHRyYWN0X2V4cG9uZW50c19uZW9uOworICAgICAgICBjLT5hcHBseV93aW5kb3dfaW50MTYgICAgPSBmZl9hcHBseV93aW5kb3dfaW50MTZfbmVvbjsKKyAgICAgICAgYy0+c3VtX3NxdWFyZV9idXR0ZXJmbHlfaW50MzIgPSBmZl9hYzNfc3VtX3NxdWFyZV9idXR0ZXJmbHlfaW50MzJfbmVvbjsKKyAgICAgICAgYy0+c3VtX3NxdWFyZV9idXR0ZXJmbHlfZmxvYXQgPSBmZl9hYzNfc3VtX3NxdWFyZV9idXR0ZXJmbHlfZmxvYXRfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYWMzZHNwX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9hYzNkc3BfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDBhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYWMzZHNwX25lb24uUwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKK2Z1bmN0aW9uIGZmX2FjM19tYXhfbXNiX2Fic19pbnQxNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2bW92LmkxNiAgICAgICAgcTAsICAjMAorICAgICAgICB2bW92LmkxNiAgICAgICAgcTIsICAjMAorMTogICAgICB2bGQxLjE2ICAgICAgICAge3ExfSwgICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdmFicy5zMTYgICAgICAgIHExLCAgcTEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxM30sICAgICBbcjAsOjEyOF0hCisgICAgICAgIHZhYnMuczE2ICAgICAgICBxMywgIHEzCisgICAgICAgIHZvcnIgICAgICAgICAgICBxMCwgIHEwLCAgcTEKKyAgICAgICAgdm9yciAgICAgICAgICAgIHEyLCAgcTIsICBxMworICAgICAgICBzdWJzICAgICAgICAgICAgcjEsICByMSwgICMxNgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgdm9yciAgICAgICAgICAgIHEwLCAgcTAsICBxMgorICAgICAgICB2b3JyICAgICAgICAgICAgZDAsICBkMCwgIGQxCisgICAgICAgIHZwbWF4LnUxNiAgICAgICBkMCwgIGQwLCAgZDAKKyAgICAgICAgdnBtYXgudTE2ICAgICAgIGQwLCAgZDAsICBkMAorICAgICAgICB2bW92LnUxNiAgICAgICAgcjAsICBkMFswXQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfYWMzX2V4cG9uZW50X21pbl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBjbXAgICAgICAgICAgICAgcjEsICAjMAorICAgICAgICBpdCAgICAgICAgICAgICAgZXEKKyAgICAgICAgYnhlcSAgICAgICAgICAgIGxyCisgICAgICAgIHB1c2ggICAgICAgICAgICB7bHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMyNTYKKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IwLDoxMjhdCisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHIxCisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIwLCAgIzI1NgorMjogICAgICB2bGQxLjggICAgICAgICAge3ExfSwgICAgIFtyMyw6MTI4XSwgcjEyCisgICAgICAgIHN1YnMgICAgICAgICAgICBsciwgIGxyLCAgIzEKKyAgICAgICAgdm1pbi51OCAgICAgICAgIHEwLCAgcTAsICBxMQorICAgICAgICBiZ3QgICAgICAgICAgICAgMmIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjMTYKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMH0sICAgICBbcjAsOjEyOF0hCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3BjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9hYzNfbHNoaWZ0X2ludDE2X25lb24sIGV4cG9ydD0xCisgICAgICAgIHZkdXAuMTYgICAgICAgICBxMCwgIHIyCisxOiAgICAgIHZsZDEuMTYgICAgICAgICB7cTF9LCAgICAgW3IwLDoxMjhdCisgICAgICAgIHZzaGwuczE2ICAgICAgICBxMSwgIHExLCAgcTAKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMX0sICAgICBbcjAsOjEyOF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMSwgIHIxLCAgIzgKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9hYzNfcnNoaWZ0X2ludDMyX25lb24sIGV4cG9ydD0xCisgICAgICAgIHJzYiAgICAgICAgICAgICByMiwgIHIyLCAgIzAKKyAgICAgICAgdmR1cC4zMiAgICAgICAgIHEwLCAgcjIKKzE6ICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjAsOjEyOF0KKyAgICAgICAgdnNobC5zMzIgICAgICAgIHExLCAgcTEsICBxMAorICAgICAgICB2c3QxLjMyICAgICAgICAge3ExfSwgICAgIFtyMCw6MTI4XSEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxLCAgcjEsICAjNAorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2Zsb2F0X3RvX2ZpeGVkMjRfbmVvbiwgZXhwb3J0PTEKKzE6ICAgICAgdmxkMS4zMiAgICAgICAgIHtxMC1xMX0sICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMCwgIHEwLCAgIzI0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTItcTN9LCAgW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEsICBxMSwgICMyNAorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTIsICBxMiwgICMyNAorICAgICAgICB2c3QxLjMyICAgICAgICAge3EwLXExfSwgIFtyMCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEzLCAgcTMsICAjMjQKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxMi1xM30sICBbcjAsOjEyOF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMiwgIHIyLCAgIzE2CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfYWMzX2V4dHJhY3RfZXhwb25lbnRzX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZtb3YuaTMyICAgICAgICBxMTUsICM4CisxOgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmFicy5zMzIgICAgICAgIHExLCAgcTAKKyAgICAgICAgdmNsei5pMzIgICAgICAgIHEzLCAgcTEKKyAgICAgICAgdnN1Yi5pMzIgICAgICAgIHEzLCAgcTMsICBxMTUKKyAgICAgICAgdm1vdm4uaTMyICAgICAgIGQ2LCAgcTMKKyAgICAgICAgdm1vdm4uaTE2ICAgICAgIGQ2LCAgcTMKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNlswXX0sICBbcjAsOjMyXSEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjNAorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2FwcGx5X3dpbmRvd19pbnQxNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LGxyfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICByMSwgIHIzLCAgbHNsICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHIwLCAgcjMsICBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHI0LCAgcjQsICAjMTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIGxyLCAgbHIsICAjMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIy0xNgorMToKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTJ9LCAgICAgW3IyLDoxMjhdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExfSwgICAgIFtyNCw6MTI4XSwgcjEyCisgICAgICAgIHZyZXY2NC4xNiAgICAgICBxMywgIHEyCisgICAgICAgIHZxcmRtdWxoLnMxNiAgICBxMCwgIHEwLCAgcTIKKyAgICAgICAgdnFyZG11bGguczE2ICAgIGQyLCAgZDIsICBkNworICAgICAgICB2cXJkbXVsaC5zMTYgICAgZDMsICBkMywgIGQ2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTB9LCAgICAgW3IwLDoxMjhdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExfSwgICAgIFtsciw6MTI4XSwgcjEyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzE2CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQscGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2FjM19zdW1fc3F1YXJlX2J1dHRlcmZseV9pbnQzMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2bW92Lmk2NCAgICAgICAgcTAsICAjMAorICAgICAgICB2bW92Lmk2NCAgICAgICAgcTEsICAjMAorICAgICAgICB2bW92Lmk2NCAgICAgICAgcTIsICAjMAorICAgICAgICB2bW92Lmk2NCAgICAgICAgcTMsICAjMAorMToKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTZ9LCAgICBbcjFdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxN30sICAgIFtyMl0hCisgICAgICAgIHZhZGQuczMyICAgICAgICBkMTgsIGQxNiwgZDE3CisgICAgICAgIHZzdWIuczMyICAgICAgICBkMTksIGQxNiwgZDE3CisgICAgICAgIHZtbGFsLnMzMiAgICAgICBxMCwgIGQxNiwgZDE2CisgICAgICAgIHZtbGFsLnMzMiAgICAgICBxMSwgIGQxNywgZDE3CisgICAgICAgIHZtbGFsLnMzMiAgICAgICBxMiwgIGQxOCwgZDE4CisgICAgICAgIHZtbGFsLnMzMiAgICAgICBxMywgIGQxOSwgZDE5CisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIHZhZGQuczY0ICAgICAgICBkMCwgIGQwLCAgZDEKKyAgICAgICAgdmFkZC5zNjQgICAgICAgIGQxLCAgZDIsICBkMworICAgICAgICB2YWRkLnM2NCAgICAgICAgZDIsICBkNCwgIGQ1CisgICAgICAgIHZhZGQuczY0ICAgICAgICBkMywgIGQ2LCAgZDcKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtxMC1xMX0sICBbcjBdCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9hYzNfc3VtX3NxdWFyZV9idXR0ZXJmbHlfZmxvYXRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgdm1vdi5mMzIgICAgICAgIHEwLCAgIzAuMAorICAgICAgICB2bW92LmYzMiAgICAgICAgcTEsICAjMC4wCisxOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxNn0sICAgIFtyMV0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE3fSwgICAgW3IyXSEKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQxOCwgZDE2LCBkMTcKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQxOSwgZDE2LCBkMTcKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQwLCAgZDE2LCBkMTYKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQxLCAgZDE3LCBkMTcKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQyLCAgZDE4LCBkMTgKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQzLCAgZDE5LCBkMTkKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgdnBhZGQuZjMyICAgICAgIGQwLCAgZDAsICBkMQorICAgICAgICB2cGFkZC5mMzIgICAgICAgZDEsICBkMiwgIGQzCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IwXQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9hc20tb2Zmc2V0cy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2FzbS1vZmZzZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxNzRiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9hc20tb2Zmc2V0cy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFucyBSdWxsZ2FyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVJNX0FTTV9PRkZTRVRTX0gKKyNkZWZpbmUgQVZDT0RFQ19BUk1fQVNNX09GRlNFVFNfSAorCisvKiBNcGVnRW5jQ29udGV4dCAqLworI2RlZmluZSBZX0RDX1NDQUxFICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBDX0RDX1NDQUxFICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBBQ19QUkVEICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBCTE9DS19MQVNUX0lOREVYICAgICAgICAgMHgxMAorI2RlZmluZSBIMjYzX0FJQyAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBJTlRFUl9TQ0FOVEFCX1JBU1RFUl9FTkQgMHg4OAorCisjZW5kaWYgLyogQVZDT0RFQ19BUk1fQVNNX09GRlNFVFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2F1ZGlvZHNwX2FybS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2F1ZGlvZHNwX2FybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzY2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYXVkaW9kc3BfYXJtLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVJNX0FVRElPRFNQX0FSTV9ICisjZGVmaW5lIEFWQ09ERUNfQVJNX0FVRElPRFNQX0FSTV9ICisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F1ZGlvZHNwLmgiCisKK3ZvaWQgZmZfYXVkaW9kc3BfaW5pdF9uZW9uKEF1ZGlvRFNQQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FSTV9BVURJT0RTUF9BUk1fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2F1ZGlvZHNwX2luaXRfYXJtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYXVkaW9kc3BfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGFhNTJhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2F1ZGlvZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIEFSTSBvcHRpbWl6ZWQgYXVkaW8gZnVuY3Rpb25zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXVkaW9kc3AuaCIKKyNpbmNsdWRlICJhdWRpb2RzcF9hcm0uaCIKKworYXZfY29sZCB2b2lkIGZmX2F1ZGlvZHNwX2luaXRfYXJtKEF1ZGlvRFNQQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKQorICAgICAgICBmZl9hdWRpb2RzcF9pbml0X25lb24oYyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYXVkaW9kc3BfaW5pdF9uZW9uLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYXVkaW9kc3BfaW5pdF9uZW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiZDE2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9hdWRpb2RzcF9pbml0X25lb24uYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogQVJNIE5FT04gb3B0aW1pc2VkIGF1ZGlvIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXVkaW9kc3AuaCIKKyNpbmNsdWRlICJhdWRpb2RzcF9hcm0uaCIKKwordm9pZCBmZl92ZWN0b3JfY2xpcGZfbmVvbihmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCBtaW4sIGZsb2F0IG1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7Cit2b2lkIGZmX3ZlY3Rvcl9jbGlwX2ludDMyX25lb24oaW50MzJfdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsIGludDMyX3QgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4LCB1bnNpZ25lZCBpbnQgbGVuKTsKKworaW50MzJfdCBmZl9zY2FsYXJwcm9kdWN0X2ludDE2X25lb24oY29uc3QgaW50MTZfdCAqdjEsIGNvbnN0IGludDE2X3QgKnYyLCBpbnQgbGVuKTsKKworYXZfY29sZCB2b2lkIGZmX2F1ZGlvZHNwX2luaXRfbmVvbihBdWRpb0RTUENvbnRleHQgKmMpCit7CisgICAgYy0+dmVjdG9yX2NsaXBfaW50MzIgPSBmZl92ZWN0b3JfY2xpcF9pbnQzMl9uZW9uOworICAgIGMtPnZlY3Rvcl9jbGlwZiAgICAgID0gZmZfdmVjdG9yX2NsaXBmX25lb247CisKKyAgICBjLT5zY2FsYXJwcm9kdWN0X2ludDE2ID0gZmZfc2NhbGFycHJvZHVjdF9pbnQxNl9uZW9uOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2F1ZGlvZHNwX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9hdWRpb2RzcF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzMmNlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9hdWRpb2RzcF9uZW9uLlMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIEFSTSBORU9OIG9wdGltaXNlZCBhdWRpbyBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKK2Z1bmN0aW9uIGZmX3ZlY3Rvcl9jbGlwZl9uZW9uLCBleHBvcnQ9MQorVkZQICAgICB2ZHVwLjMyICAgICAgICAgcTEsICBkMFsxXQorVkZQICAgICB2ZHVwLjMyICAgICAgICAgcTAsICBkMFswXQorTk9WRlAgICB2ZHVwLjMyICAgICAgICAgcTAsICByMgorTk9WRlAgICB2ZHVwLjMyICAgICAgICAgcTEsICByMworTk9WRlAgICBsZHIgICAgICAgICAgICAgcjIsICBbc3BdCisgICAgICAgIHZsZDEuZjMyICAgICAgICB7cTJ9LFtyMSw6MTI4XSEKKyAgICAgICAgdm1pbi5mMzIgICAgICAgIHExMCwgcTIsICBxMQorICAgICAgICB2bGQxLmYzMiAgICAgICAge3EzfSxbcjEsOjEyOF0hCisgICAgICAgIHZtaW4uZjMyICAgICAgICBxMTEsIHEzLCAgcTEKKzE6ICAgICAgdm1heC5mMzIgICAgICAgIHE4LCAgcTEwLCBxMAorICAgICAgICB2bWF4LmYzMiAgICAgICAgcTksICBxMTEsIHEwCisgICAgICAgIHN1YnMgICAgICAgICAgICByMiwgIHIyLCAgIzgKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisgICAgICAgIHZsZDEuZjMyICAgICAgICB7cTJ9LFtyMSw6MTI4XSEKKyAgICAgICAgdm1pbi5mMzIgICAgICAgIHExMCwgcTIsICBxMQorICAgICAgICB2bGQxLmYzMiAgICAgICAge3EzfSxbcjEsOjEyOF0hCisgICAgICAgIHZtaW4uZjMyICAgICAgICBxMTEsIHEzLCAgcTEKKyAgICAgICAgdnN0MS5mMzIgICAgICAgIHtxOH0sW3IwLDoxMjhdIQorICAgICAgICB2c3QxLmYzMiAgICAgICAge3E5fSxbcjAsOjEyOF0hCisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorMjogICAgICB2c3QxLmYzMiAgICAgICAge3E4fSxbcjAsOjEyOF0hCisgICAgICAgIHZzdDEuZjMyICAgICAgICB7cTl9LFtyMCw6MTI4XSEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZlY3Rvcl9jbGlwX2ludDMyX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZkdXAuMzIgICAgICAgICBxMCwgIHIyCisgICAgICAgIHZkdXAuMzIgICAgICAgICBxMSwgIHIzCisgICAgICAgIGxkciAgICAgICAgICAgICByMiwgIFtzcF0KKzE6CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTItcTN9LCAgW3IxLDoxMjhdIQorICAgICAgICB2bWluLnMzMiAgICAgICAgcTIsICBxMiwgIHExCisgICAgICAgIHZtaW4uczMyICAgICAgICBxMywgIHEzLCAgcTEKKyAgICAgICAgdm1heC5zMzIgICAgICAgIHEyLCAgcTIsICBxMAorICAgICAgICB2bWF4LnMzMiAgICAgICAgcTMsICBxMywgIHEwCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTItcTN9LCAgW3IwLDoxMjhdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjIsICByMiwgICM4CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ibG9ja2RzcF9hcm0uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ibG9ja2RzcF9hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjg4ZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2Jsb2NrZHNwX2FybS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FSTV9CTE9DS0RTUF9BUk1fSAorI2RlZmluZSBBVkNPREVDX0FSTV9CTE9DS0RTUF9BUk1fSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy9ibG9ja2RzcC5oIgorCit2b2lkIGZmX2Jsb2NrZHNwX2luaXRfbmVvbihCbG9ja0RTUENvbnRleHQgKmMsIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQVJNX0JMT0NLRFNQX0FSTV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYmxvY2tkc3BfaW5pdF9hcm0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ibG9ja2RzcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODZhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vYmxvY2tkc3BfaW5pdF9hcm0uYwpAQCAtMCwwICsxLDMzIEBACisvKgorICogQVJNIG9wdGltaXplZCBibG9jayBvcGVyYXRpb25zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJibG9ja2RzcF9hcm0uaCIKKworYXZfY29sZCB2b2lkIGZmX2Jsb2NrZHNwX2luaXRfYXJtKEJsb2NrRFNQQ29udGV4dCAqYywgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkKKyAgICAgICAgZmZfYmxvY2tkc3BfaW5pdF9uZW9uKGMsIGhpZ2hfYml0X2RlcHRoKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ibG9ja2RzcF9pbml0X25lb24uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ibG9ja2RzcF9pbml0X25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmI1MWZjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2Jsb2NrZHNwX2luaXRfbmVvbi5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBBUk0gTkVPTiBvcHRpbWlzZWQgYmxvY2sgb3BlcmF0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJibG9ja2RzcF9hcm0uaCIKKwordm9pZCBmZl9jbGVhcl9ibG9ja19uZW9uKGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfY2xlYXJfYmxvY2tzX25lb24oaW50MTZfdCAqYmxvY2tzKTsKKworYXZfY29sZCB2b2lkIGZmX2Jsb2NrZHNwX2luaXRfbmVvbihCbG9ja0RTUENvbnRleHQgKmMsIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKQoreworICAgIGlmICghaGlnaF9iaXRfZGVwdGgpIHsKKyAgICAgICAgYy0+Y2xlYXJfYmxvY2sgID0gZmZfY2xlYXJfYmxvY2tfbmVvbjsKKyAgICAgICAgYy0+Y2xlYXJfYmxvY2tzID0gZmZfY2xlYXJfYmxvY2tzX25lb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2Jsb2NrZHNwX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ibG9ja2RzcF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjNjNjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ibG9ja2RzcF9uZW9uLlMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIEFSTSBORU9OIG9wdGltaXNlZCBibG9jayBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKK2Z1bmN0aW9uIGZmX2NsZWFyX2Jsb2NrX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMCwgICMwCisgICAgICAgIC5yZXB0ICAgICAgICAgICA4CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTB9LCBbcjAsOjEyOF0hCisgICAgICAgIC5lbmRyCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9jbGVhcl9ibG9ja3NfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgdm1vdi5pMTYgICAgICAgIHEwLCAgIzAKKyAgICAgICAgLnJlcHQgICAgICAgICAgIDgqNgorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EwfSwgW3IwLDoxMjhdIQorICAgICAgICAuZW5kcgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9jYWJhYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2NhYmFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiZjg2YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9jYWJhYy5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BUk1fQ0FCQUNfSAorI2RlZmluZSBBVkNPREVDX0FSTV9DQUJBQ19ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBIQVZFX0FSTVY2VDJfSU5MSU5FCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvY2FiYWMuaCIKKworI2RlZmluZSBnZXRfY2FiYWNfaW5saW5lIGdldF9jYWJhY19pbmxpbmVfYXJtCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X2NhYmFjX2lubGluZV9hcm0oQ0FCQUNDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNvbnN0IHN0YXRlKQoreworICAgIGludCBiaXQ7CisgICAgdm9pZCAqcmVnX2IsICpyZWdfYywgKnRtcDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJsZHJiICAgICAgICVbYml0XSAgICAgICAgLCBbJVtzdGF0ZV1dICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAgICAgJVtyX2JdICAgICAgICAsICVbdGFibGVzXSAgICwgJVtscHNfb2ZmXSAgICBcblx0IgorICAgICAgICAibW92ICAgICAgICAlW3RtcF0gICAgICAgICwgJVtyYW5nZV0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbcmFuZ2VdICAgICAgLCAlW3JhbmdlXSAgICAsICMweEMwICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAgICAgJVtyX2JdICAgICAgICAsICVbcl9iXSAgICAgICwgJVtiaXRdICAgICAgICBcblx0IgorICAgICAgICAibGRyYiAgICAgICAlW3JhbmdlXSAgICAgICwgWyVbcl9iXSwgJVtyYW5nZV0sIGxzbCAjMV0gIFxuXHQiCisgICAgICAgICJhZGQgICAgICAgICVbcl9iXSAgICAgICAgLCAlW3RhYmxlc10gICAsICVbbm9ybV9vZmZdICAgXG5cdCIKKyAgICAgICAgInN1YiAgICAgICAgJVtyX2NdICAgICAgICAsICVbdG1wXSAgICAgICwgJVtyYW5nZV0gICAgICBcblx0IgorICAgICAgICAibHNsICAgICAgICAlW3RtcF0gICAgICAgICwgJVtyX2NdICAgICAgLCAjMTcgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjbXAgICAgICAgICVbdG1wXSAgICAgICAgLCAlW2xvd10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIml0ICAgICAgICAgZ3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92Z3QgICAgICAlW3JhbmdlXSAgICAgICwgJVtyX2NdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJpdHQgICAgICAgIGNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm12bmNjICAgICAgJVtiaXRdICAgICAgICAsICVbYml0XSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViY2MgICAgICAlW2xvd10gICAgICAgICwgJVtsb3ddICAgICAgLCAlW3RtcF0gICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgICAgICVbcl9jXSAgICAgICAgLCAlW3RhYmxlc10gICAsICVbbWxwc19vZmZdICAgXG5cdCIKKyAgICAgICAgImxkcmIgICAgICAgJVt0bXBdICAgICAgICAsIFslW3JfYl0sICVbcmFuZ2VdXSAgICAgICAgICBcblx0IgorICAgICAgICAibGRyYiAgICAgICAlW3JfYl0gICAgICAgICwgWyVbcl9jXSwgJVtiaXRdXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsc2wgICAgICAgICVbbG93XSAgICAgICAgLCAlW2xvd10gICAgICAsICVbdG1wXSAgICAgICAgXG5cdCIKKyAgICAgICAgImxzbCAgICAgICAgJVtyYW5nZV0gICAgICAsICVbcmFuZ2VdICAgICwgJVt0bXBdICAgICAgICBcblx0IgorICAgICAgICAidXh0aCAgICAgICAlW3JfY10gICAgICAgICwgJVtsb3ddICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdHJiICAgICAgICVbcl9iXSAgICAgICAgLCBbJVtzdGF0ZV1dICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInRzdCAgICAgICAgJVtyX2NdICAgICAgICAsICVbcl9jXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICAgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZHIgICAgICAgICVbcl9jXSAgICAgICAgLCBbJVtjXSwgJVtieXRlXV0gICAgICAgICAgICAgXG5cdCIKKyNpZiBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUgorICAgICAgICAibGRyaCAgICAgICAlW3RtcF0gICAgICAgICwgWyVbcl9jXV0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgICAgICVbcl9jXSAgICAgICAgLCAlW3JfY10gICAgICAsICMyICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN0ciAgICAgICAgJVtyX2NdICAgICAgICAsIFslW2NdLCAlW2J5dGVdXSAgICAgICAgICAgICBcblx0IgorI2Vsc2UKKyAgICAgICAgImxkciAgICAgICAgJVtyX2JdICAgICAgICAsIFslW2NdLCAlW2VuZF1dICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGRyaCAgICAgICAlW3RtcF0gICAgICAgICwgWyVbcl9jXV0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjbXAgICAgICAgICVbcl9jXSAgICAgICAgLCAlW3JfYl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIml0dCAgICAgICAgbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkbHQgICAgICAlW3JfY10gICAgICAgICwgJVtyX2NdICAgICAgLCAjMiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdHJsdCAgICAgICVbcl9jXSAgICAgICAgLCBbJVtjXSwgJVtieXRlXV0gICAgICAgICAgICAgXG5cdCIKKyNlbmRpZgorICAgICAgICAic3ViICAgICAgICAlW3JfY10gICAgICAgICwgJVtsb3ddICAgICAgLCAjMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgICAgICVbcl9iXSAgICAgICAgLCAlW3RhYmxlc10gICAsICVbbm9ybV9vZmZdICAgXG5cdCIKKyAgICAgICAgImVvciAgICAgICAgJVtyX2NdICAgICAgICAsICVbbG93XSAgICAgICwgJVtyX2NdICAgICAgICBcblx0IgorICAgICAgICAicmV2ICAgICAgICAlW3RtcF0gICAgICAgICwgJVt0bXBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsc3IgICAgICAgICVbcl9jXSAgICAgICAgLCAlW3JfY10gICAgICAsICMxNSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxzciAgICAgICAgJVt0bXBdICAgICAgICAsICVbdG1wXSAgICAgICwgIzE1ICAgICAgICAgICBcblx0IgorICAgICAgICAibGRyYiAgICAgICAlW3JfY10gICAgICAgICwgWyVbcl9iXSwgJVtyX2NdXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3Z3ICAgICAgICVbcl9iXSAgICAgICAgLCAjMHhGRkZGICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YiAgICAgICAgJVt0bXBdICAgICAgICAsICVbdG1wXSAgICAgICwgJVtyX2JdICAgICAgICBcblx0IgorICAgICAgICAicnNiICAgICAgICAlW3JfY10gICAgICAgICwgJVtyX2NdICAgICAgLCAjNyAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsc2wgICAgICAgICVbdG1wXSAgICAgICAgLCAlW3RtcF0gICAgICAsICVbcl9jXSAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAgICAgJVtsb3ddICAgICAgICAsICVbbG93XSAgICAgICwgJVt0bXBdICAgICAgICBcblx0IgorICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogICAgW2JpdF0iPSZyIihiaXQpLAorICAgICAgICAgICAgIFtsb3ddIismciIoYy0+bG93KSwKKyAgICAgICAgICAgW3JhbmdlXSIrJnIiKGMtPnJhbmdlKSwKKyAgICAgICAgICAgICBbcl9iXSI9JnIiKHJlZ19iKSwKKyAgICAgICAgICAgICBbcl9jXSI9JnIiKHJlZ19jKSwKKyAgICAgICAgICAgICBbdG1wXSI9JnIiKHRtcCkKKyAgICAgICAgOiAgICAgICAgW2NdInIiKGMpLAorICAgICAgICAgICAgIFtzdGF0ZV0iciIoc3RhdGUpLAorICAgICAgICAgICAgW3RhYmxlc10iciIoZmZfaDI2NF9jYWJhY190YWJsZXMpLAorICAgICAgICAgICAgICBbYnl0ZV0iTSIob2Zmc2V0b2YoQ0FCQUNDb250ZXh0LCBieXRlc3RyZWFtKSksCisgICAgICAgICAgICAgICBbZW5kXSJNIihvZmZzZXRvZihDQUJBQ0NvbnRleHQsIGJ5dGVzdHJlYW1fZW5kKSksCisgICAgICAgICAgW25vcm1fb2ZmXSJJIihIMjY0X05PUk1fU0hJRlRfT0ZGU0VUKSwKKyAgICAgICAgICAgW2xwc19vZmZdIkkiKEgyNjRfTFBTX1JBTkdFX09GRlNFVCksCisgICAgICAgICAgW21scHNfb2ZmXSJJIihIMjY0X01MUFNfU1RBVEVfT0ZGU0VUICsgMTI4KQorICAgICAgICA6ICJtZW1vcnkiLCAiY2MiCisgICAgICAgICk7CisKKyAgICByZXR1cm4gYml0ICYgMTsKK30KKyNlbmRpZiAvKiBIQVZFX0FSTVY2VDJfSU5MSU5FICovCisKKyNlbmRpZiAvKiBBVkNPREVDX0FSTV9DQUJBQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZGNhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZGNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4NzExMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9kY2EuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVJNX0RDQV9ICisjZGVmaW5lIEFWQ09ERUNfQVJNX0RDQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZGNhZHNwLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tYXRob3BzLmgiCisKKyNpZiBIQVZFX0FSTVY2X0lOTElORSAmJiBBVl9HQ0NfVkVSU0lPTl9BVF9MRUFTVCg0LDQpICYmICFDT05GSUdfVEhVTUIKKworI2RlZmluZSBkZWNvZGVfYmxvY2tjb2RlcyBkZWNvZGVfYmxvY2tjb2Rlcworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX2Jsb2NrY29kZXMoaW50IGNvZGUxLCBpbnQgY29kZTIsIGludCBsZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICp2YWx1ZXMpCit7CisgICAgaW50MzJfdCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1OworCisgICAgX19hc21fXyAoInNtbXVsICAgJTAsICAlNiwgICUxMCAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbXVsICAgJTMsICAlNywgICUxMCAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbGFiYiAgJTYsICAlMCwgICU5LCAgJTYgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbGFiYiAgJTcsICAlMywgICU5LCAgJTcgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbXVsICAgJTEsICAlMCwgICUxMCAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbXVsICAgJTQsICAlMywgICUxMCAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgInN1YiAgICAgJTYsICAlNiwgICU4LCAgbHNyICMxICAgXG4iCisgICAgICAgICAgICAgInN1YiAgICAgJTcsICAlNywgICU4LCAgbHNyICMxICAgXG4iCisgICAgICAgICAgICAgInNtbGFiYiAgJTAsICAlMSwgICU5LCAgJTAgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbGFiYiAgJTMsICAlNCwgICU5LCAgJTMgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbXVsICAgJTIsICAlMSwgICUxMCAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbXVsICAgJTUsICAlNCwgICUxMCAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgInN0ciAgICAgJTYsICBbJTExLCAjMF0gICAgICAgICAgXG4iCisgICAgICAgICAgICAgInN0ciAgICAgJTcsICBbJTExLCAjMTZdICAgICAgICAgXG4iCisgICAgICAgICAgICAgInN1YiAgICAgJTAsICAlMCwgICU4LCAgbHNyICMxICAgXG4iCisgICAgICAgICAgICAgInN1YiAgICAgJTMsICAlMywgICU4LCAgbHNyICMxICAgXG4iCisgICAgICAgICAgICAgInNtbGFiYiAgJTEsICAlMiwgICU5LCAgJTEgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbGFiYiAgJTQsICAlNSwgICU5LCAgJTQgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbXVsICAgJTYsICAlMiwgICUxMCAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbXVsICAgJTcsICAlNSwgICUxMCAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgInN0ciAgICAgJTAsICBbJTExLCAjNF0gICAgICAgICAgXG4iCisgICAgICAgICAgICAgInN0ciAgICAgJTMsICBbJTExLCAjMjBdICAgICAgICAgXG4iCisgICAgICAgICAgICAgInN1YiAgICAgJTEsICAlMSwgICU4LCAgbHNyICMxICAgXG4iCisgICAgICAgICAgICAgInN1YiAgICAgJTQsICAlNCwgICU4LCAgbHNyICMxICAgXG4iCisgICAgICAgICAgICAgInNtbGFiYiAgJTIsICAlNiwgICU5LCAgJTIgICAgICAgXG4iCisgICAgICAgICAgICAgInNtbGFiYiAgJTUsICAlNywgICU5LCAgJTUgICAgICAgXG4iCisgICAgICAgICAgICAgInN0ciAgICAgJTEsICBbJTExLCAjOF0gICAgICAgICAgXG4iCisgICAgICAgICAgICAgInN0ciAgICAgJTQsICBbJTExLCAjMjRdICAgICAgICAgXG4iCisgICAgICAgICAgICAgInN1YiAgICAgJTIsICAlMiwgICU4LCAgbHNyICMxICAgXG4iCisgICAgICAgICAgICAgInN1YiAgICAgJTUsICAlNSwgICU4LCAgbHNyICMxICAgXG4iCisgICAgICAgICAgICAgInN0ciAgICAgJTIsICBbJTExLCAjMTJdICAgICAgICAgXG4iCisgICAgICAgICAgICAgInN0ciAgICAgJTUsICBbJTExLCAjMjhdICAgICAgICAgXG4iCisgICAgICAgICAgICAgOiAiPSZyIih2MCksICI9JnIiKHYxKSwgIj0mciIodjIpLAorICAgICAgICAgICAgICAgIj0mciIodjMpLCAiPSZyIih2NCksICI9JnIiKHY1KSwKKyAgICAgICAgICAgICAgICIrJnIiKGNvZGUxKSwgIismciIoY29kZTIpCisgICAgICAgICAgICAgOiAiciIobGV2ZWxzIC0gMSksICJyIigtbGV2ZWxzKSwKKyAgICAgICAgICAgICAgICJyIihmZl9pbnZlcnNlW2xldmVsc10pLCAiciIodmFsdWVzKQorICAgICAgICAgICAgIDogIm1lbW9yeSIpOworCisgICAgcmV0dXJuIGNvZGUxIHwgY29kZTI7Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLyogQVZDT0RFQ19BUk1fRENBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9kY2Fkc3BfaW5pdF9hcm0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9kY2Fkc3BfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQ5NTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2RjYWRzcF9pbml0X2FybS5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2RjYWRzcC5oIgorCit2b2lkIGZmX2RjYV9sZmVfZmlyMF9uZW9uKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgY29uc3QgZmxvYXQgKmNvZWZzKTsKK3ZvaWQgZmZfZGNhX2xmZV9maXIxX25lb24oZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLCBjb25zdCBmbG9hdCAqY29lZnMpOworCit2b2lkIGZmX2RjYV9sZmVfZmlyMzJfdmZwKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgY29uc3QgZmxvYXQgKmNvZWZzKTsKK3ZvaWQgZmZfZGNhX2xmZV9maXI2NF92ZnAoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLCBjb25zdCBmbG9hdCAqY29lZnMpOworCit2b2lkIGZmX2RjYV9xbWZfMzJfc3ViYmFuZHNfdmZwKGZsb2F0IHNhbXBsZXNfaW5bMzJdWzhdLCBpbnQgc2JfYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50aEZpbHRlckNvbnRleHQgKnN5bnRoLCBGRlRDb250ZXh0ICppbWRjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3ludGhfYnVmX3B0cls1MTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnN5bnRoX2J1Zl9vZmZzZXQsIGZsb2F0IHN5bnRoX2J1ZjJbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB3aW5kb3dbNTEyXSwgZmxvYXQgKnNhbXBsZXNfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByYVhpblszMl0sIGZsb2F0IHNjYWxlKTsKKwordm9pZCBmZl9zeW50aF9maWx0ZXJfZmxvYXRfdmZwKEZGVENvbnRleHQgKmltZGN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpzeW50aF9idWZfcHRyLCBpbnQgKnN5bnRoX2J1Zl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3ludGhfYnVmMlszMl0sIGNvbnN0IGZsb2F0IHdpbmRvd1s1MTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG91dFszMl0sIGNvbnN0IGZsb2F0IGluWzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSk7CisKK3ZvaWQgZmZfc3ludGhfZmlsdGVyX2Zsb2F0X25lb24oRkZUQ29udGV4dCAqaW1kY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpzeW50aF9idWZfcHRyLCBpbnQgKnN5bnRoX2J1Zl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHN5bnRoX2J1ZjJbMzJdLCBjb25zdCBmbG9hdCB3aW5kb3dbNTEyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3V0WzMyXSwgY29uc3QgZmxvYXQgaW5bMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSk7CisKK3ZvaWQgZmZfZGVjb2RlX2hmX25lb24oZmxvYXQgZHN0W0RDQV9TVUJCQU5EU11bOF0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnFfbnVtW0RDQV9TVUJCQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCBoZl92cVsxMDI0XVszMl0sIGludHB0cl90IHZxX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzY2FsZVtEQ0FfU1VCQkFORFNdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBzdGFydCwgaW50cHRyX3QgZW5kKTsKKworYXZfY29sZCB2b2lkIGZmX2RjYWRzcF9pbml0X2FybShEQ0FEU1BDb250ZXh0ICpzKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV92ZnAoY3B1X2ZsYWdzKSAmJiAhaGF2ZV92ZnB2MyhjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPmxmZV9maXJbMF0gICAgICA9IGZmX2RjYV9sZmVfZmlyMzJfdmZwOworICAgICAgICBzLT5sZmVfZmlyWzFdICAgICAgPSBmZl9kY2FfbGZlX2ZpcjY0X3ZmcDsKKyAgICAgICAgcy0+cW1mXzMyX3N1YmJhbmRzID0gZmZfZGNhX3FtZl8zMl9zdWJiYW5kc192ZnA7CisgICAgfQorICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5sZmVfZmlyWzBdID0gZmZfZGNhX2xmZV9maXIwX25lb247CisgICAgICAgIHMtPmxmZV9maXJbMV0gPSBmZl9kY2FfbGZlX2ZpcjFfbmVvbjsKKyAgICAgICAgcy0+ZGVjb2RlX2hmICA9IGZmX2RlY29kZV9oZl9uZW9uOworICAgIH0KK30KKworYXZfY29sZCB2b2lkIGZmX3N5bnRoX2ZpbHRlcl9pbml0X2FybShTeW50aEZpbHRlckNvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX3ZmcChjcHVfZmxhZ3MpICYmICFoYXZlX3ZmcHYzKGNwdV9mbGFncykpCisgICAgICAgIHMtPnN5bnRoX2ZpbHRlcl9mbG9hdCA9IGZmX3N5bnRoX2ZpbHRlcl9mbG9hdF92ZnA7CisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKQorICAgICAgICBzLT5zeW50aF9maWx0ZXJfZmxvYXQgPSBmZl9zeW50aF9maWx0ZXJfZmxvYXRfbmVvbjsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9kY2Fkc3BfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2RjYWRzcF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjNDEzNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9kY2Fkc3BfbmVvbi5TCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9kZWNvZGVfaGZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yNSxscn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICByMworICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICAgICAgIFtzcCwgIzEyXQorICAgICAgICBsZHJkICAgICAgICAgICAgcjQsICByNSwgIFtzcCwgIzE2XQorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsICByMywgIHI0LCBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByNCwgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjQsIGxzbCAjNQorCisxOiAgICAgIGxkcl9wb3N0ICAgICAgICBsciwgIHIxLCAgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgcjQsICAjMQorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICByMiwgIGxyLCBsc2wgIzUKKyAgICAgICAgY21wICAgICAgICAgICAgIHI0LCAgcjUKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkN30sICAgICBbcjNdIQorICAgICAgICB2bGQxLjggICAgICAgICAge2QwfSwgICAgIFtsciw6NjRdCisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBkNywgIGQ3LCAgIzQKKyAgICAgICAgdm1vdmwuczggICAgICAgIHExLCAgZDAKKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHEwLCAgZDIKKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHExLCAgZDMKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHEwLCAgcTAKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHExLCAgcTEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHEwLCAgcTAsICBkN1swXQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTEsICBxMSwgIGQ3WzBdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTAtcTF9LCAgW3IwLDoxMjhdIQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI1LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9kY2FfbGZlX2ZpcjBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yNixscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzMyICAgICAgICAgICAgICAgIEAgZGVjaWZhY3RvcgorICAgICAgICBtb3YgICAgICAgICAgICAgcjYsICAjMjU2LzMyCisgICAgICAgIGIgICAgICAgICAgICAgICBkY2FfbGZlX2ZpcgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9kY2FfbGZlX2ZpcjFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yNixscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzY0ICAgICAgICAgICAgICAgIEAgZGVjaWZhY3RvcgorICAgICAgICBtb3YgICAgICAgICAgICAgcjYsICAjMjU2LzY0CitkY2FfbGZlX2ZpcjoKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgcjAsICByMywgIGxzbCAjMiAgIEAgb3V0MgorICAgICAgICBhZGQgICAgICAgICAgICAgcjUsICByMiwgICMyNTYqNC0xNiAgICAgQCBjZjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMTIKKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgIy0xNgorMToKKyAgICAgICAgdm1vdi5mMzIgICAgICAgIHEyLCAgIzAuMCAgICAgICAgICAgICAgIEAgdjAKKyAgICAgICAgdm1vdi5mMzIgICAgICAgIHEzLCAgIzAuMCAgICAgICAgICAgICAgIEAgdjEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgcjYKKzI6CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTh9LCAgICAgW3IyLDoxMjhdISAgICBAIGNmMAorICAgICAgICB2bGQxLjMyICAgICAgICAge3E5fSwgICAgIFtyNSw6MTI4XSwgbHIgQCBjZjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjFdLCBsciAgICAgIEAgaW4KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTEwLCBxOAorICAgICAgICB2bWxhLmYzMiAgICAgICAgcTMsICBxMSwgIHE5CisgICAgICAgIHZtbGEuZjMyICAgICAgICBkNCwgIGQyLCAgZDIxCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkNSwgIGQzLCAgZDIwCisgICAgICAgIGJuZSAgICAgICAgICAgICAyYgorCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjYsICBsc2wgIzIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDQsICBkNCwgIGQ1CisgICAgICAgIHZhZGQuZjMyICAgICAgICBkNiwgIGQ2LCAgZDcKKyAgICAgICAgdnBhZGQuZjMyICAgICAgIGQ1LCAgZDQsICBkNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q1WzBdfSwgIFtyMCw6MzJdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q1WzFdfSwgIFtyNCw6MzJdIQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI2LHBjfQorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2RjYWRzcF92ZnAuUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9kY2Fkc3BfdmZwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwOWYwZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9kY2Fkc3BfdmZwLlMKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUklTQyBPUyBPcGVuIEx0ZAorICogQXV0aG9yOiBCZW4gQXZpc29uIDxiYXZpc29uQHJpc2Nvc29wZW4ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworUE9VVCAgICAgICAgICAucmVxICAgIGExCitQSU4gICAgICAgICAgIC5yZXEgICAgYTIKK1BDT0VGICAgICAgICAgLnJlcSAgICBhMworT0xERlBTQ1IgICAgICAucmVxICAgIGE0CitDT1VOVEVSICAgICAgIC5yZXEgICAgaXAKKworSU4wICAgICAgICAgICAucmVxICAgIHM0CitJTjEgICAgICAgICAgIC5yZXEgICAgczUKK0lOMiAgICAgICAgICAgLnJlcSAgICBzNgorSU4zICAgICAgICAgICAucmVxICAgIHM3CitJTjQgICAgICAgICAgIC5yZXEgICAgczAKK0lONSAgICAgICAgICAgLnJlcSAgICBzMQorSU42ICAgICAgICAgICAucmVxICAgIHMyCitJTjcgICAgICAgICAgIC5yZXEgICAgczMKK0NPRUYwICAgICAgICAgLnJlcSAgICBzOCAgIEAgY29lZmZpY2llbnQgZWxlbWVudHMKK0NPRUYxICAgICAgICAgLnJlcSAgICBzOQorQ09FRjIgICAgICAgICAucmVxICAgIHMxMAorQ09FRjMgICAgICAgICAucmVxICAgIHMxMQorQ09FRjQgICAgICAgICAucmVxICAgIHMxMgorQ09FRjUgICAgICAgICAucmVxICAgIHMxMworQ09FRjYgICAgICAgICAucmVxICAgIHMxNAorQ09FRjcgICAgICAgICAucmVxICAgIHMxNQorQUNDVU0wICAgICAgICAucmVxICAgIHMxNiAgQCBkb3VibGUtYnVmZmVyZWQgbXVsdGlwbHktYWNjdW11bGF0ZSByZXN1bHRzCitBQ0NVTTQgICAgICAgIC5yZXEgICAgczIwCitQT1NUMCAgICAgICAgIC5yZXEgICAgczI0ICBAIGRvIGxvbmctbGF0ZW5jeSBwb3N0LW11bHRpcGx5IGluIHRoaXMgdmVjdG9yIGluIHBhcmFsbGVsCitQT1NUMSAgICAgICAgIC5yZXEgICAgczI1CitQT1NUMiAgICAgICAgIC5yZXEgICAgczI2CitQT1NUMyAgICAgICAgIC5yZXEgICAgczI3CisKKworLm1hY3JvIGlubmVyX2xvb3AgIGRlY2lmYWN0b3IsIGRpciwgdGFpbCwgaGVhZAorIC5pZmMgIlxkaXIiLCJ1cCIKKyAgLnNldCBYLCAwCisgIC5zZXQgWSwgNAorIC5lbHNlCisgIC5zZXQgWCwgNCpKTUFYKjQgLSA0CisgIC5zZXQgWSwgLTQKKyAuZW5kaWYKKyAuaWZuYyAiXGhlYWQiLCIiCisgICAgICAgIHZsZHIgICAgQ09FRjAsIFtQQ09FRiwgI1ggKyAoMCpKTUFYICsgMCkgKiBZXQorICAgICAgICB2bGRyICAgIENPRUYxLCBbUENPRUYsICNYICsgKDEqSk1BWCArIDApICogWV0KKyAgICAgICAgdmxkciAgICBDT0VGMiwgW1BDT0VGLCAjWCArICgyKkpNQVggKyAwKSAqIFldCisgICAgICAgIHZsZHIgICAgQ09FRjMsIFtQQ09FRiwgI1ggKyAoMypKTUFYICsgMCkgKiBZXQorIC5lbmRpZgorIC5pZm5jICJcdGFpbCIsIiIKKyAgICAgICAgdmFkZC5mICBQT1NUMCwgQUNDVU0wLCBBQ0NVTTQgICBAIHZlY3RvciBvcGVyYXRpb24KKyAuZW5kaWYKKyAuaWZuYyAiXGhlYWQiLCIiCisgICAgICAgIHZtdWwuZiAgQUNDVU0wLCBDT0VGMCwgSU4wICAgICAgQCB2ZWN0b3IgPSB2ZWN0b3IgKiBzY2FsYXIKKyAgICAgICAgdmxkciAgICBDT0VGNCwgW1BDT0VGLCAjWCArICgwKkpNQVggKyAxKSAqIFldCisgICAgICAgIHZsZHIgICAgQ09FRjUsIFtQQ09FRiwgI1ggKyAoMSpKTUFYICsgMSkgKiBZXQorICAgICAgICB2bGRyICAgIENPRUY2LCBbUENPRUYsICNYICsgKDIqSk1BWCArIDEpICogWV0KKyAuZW5kaWYKKyAuaWZuYyAiXGhlYWQiLCIiCisgICAgICAgIHZsZHIgICAgQ09FRjcsIFtQQ09FRiwgI1ggKyAoMypKTUFYICsgMSkgKiBZXQorICAgLmlmYyAiXHRhaWwiLCIiCisgICAgICAgIHZtdWwuZiAgQUNDVU00LCBDT0VGNCwgSU4xICAgICAgQCB2ZWN0b3Igb3BlcmF0aW9uCisgICAuZW5kaWYKKyAgICAgICAgdmxkciAgICBDT0VGMCwgW1BDT0VGLCAjWCArICgwKkpNQVggKyAyKSAqIFldCisgICAgICAgIHZsZHIgICAgQ09FRjEsIFtQQ09FRiwgI1ggKyAoMSpKTUFYICsgMikgKiBZXQorICAgLmlmbmMgIlx0YWlsIiwiIgorICAgICAgICB2bXVsLmYgIEFDQ1VNNCwgQ09FRjQsIElOMSAgICAgIEAgdmVjdG9yIG9wZXJhdGlvbgorICAgLmVuZGlmCisgICAgICAgIHZsZHIgICAgQ09FRjIsIFtQQ09FRiwgI1ggKyAoMipKTUFYICsgMikgKiBZXQorICAgICAgICB2bGRyICAgIENPRUYzLCBbUENPRUYsICNYICsgKDMqSk1BWCArIDIpICogWV0KKyAuZW5kaWYKKyAuaWZuYyAiXHRhaWwiLCIiCisgICAgICAgIHZzdG1pYSAgUE9VVCEsIHtQT1NUMC1QT1NUM30KKyAuZW5kaWYKKyAuaWZuYyAiXGhlYWQiLCIiCisgICAgICAgIHZtbGEuZiAgQUNDVU0wLCBDT0VGMCwgSU4yICAgICAgQCB2ZWN0b3IgPSB2ZWN0b3IgKiBzY2FsYXIKKyAgICAgICAgdmxkciAgICBDT0VGNCwgW1BDT0VGLCAjWCArICgwKkpNQVggKyAzKSAqIFldCisgICAgICAgIHZsZHIgICAgQ09FRjUsIFtQQ09FRiwgI1ggKyAoMSpKTUFYICsgMykgKiBZXQorICAgICAgICB2bGRyICAgIENPRUY2LCBbUENPRUYsICNYICsgKDIqSk1BWCArIDMpICogWV0KKyAgICAgICAgdmxkciAgICBDT0VGNywgW1BDT0VGLCAjWCArICgzKkpNQVggKyAzKSAqIFldCisgICAgICAgIHZtbGEuZiAgQUNDVU00LCBDT0VGNCwgSU4zICAgICAgQCB2ZWN0b3IgPSB2ZWN0b3IgKiBzY2FsYXIKKyAgLmlmIFxkZWNpZmFjdG9yID09IDMyCisgICAgICAgIHZsZHIgICAgQ09FRjAsIFtQQ09FRiwgI1ggKyAoMCpKTUFYICsgNCkgKiBZXQorICAgICAgICB2bGRyICAgIENPRUYxLCBbUENPRUYsICNYICsgKDEqSk1BWCArIDQpICogWV0KKyAgICAgICAgdmxkciAgICBDT0VGMiwgW1BDT0VGLCAjWCArICgyKkpNQVggKyA0KSAqIFldCisgICAgICAgIHZsZHIgICAgQ09FRjMsIFtQQ09FRiwgI1ggKyAoMypKTUFYICsgNCkgKiBZXQorICAgICAgICB2bWxhLmYgIEFDQ1VNMCwgQ09FRjAsIElONCAgICAgIEAgdmVjdG9yID0gdmVjdG9yICogc2NhbGFyCisgICAgICAgIHZsZHIgICAgQ09FRjQsIFtQQ09FRiwgI1ggKyAoMCpKTUFYICsgNSkgKiBZXQorICAgICAgICB2bGRyICAgIENPRUY1LCBbUENPRUYsICNYICsgKDEqSk1BWCArIDUpICogWV0KKyAgICAgICAgdmxkciAgICBDT0VGNiwgW1BDT0VGLCAjWCArICgyKkpNQVggKyA1KSAqIFldCisgICAgICAgIHZsZHIgICAgQ09FRjcsIFtQQ09FRiwgI1ggKyAoMypKTUFYICsgNSkgKiBZXQorICAgICAgICB2bWxhLmYgIEFDQ1VNNCwgQ09FRjQsIElONSAgICAgIEAgdmVjdG9yID0gdmVjdG9yICogc2NhbGFyCisgICAgICAgIHZsZHIgICAgQ09FRjAsIFtQQ09FRiwgI1ggKyAoMCpKTUFYICsgNikgKiBZXQorICAgICAgICB2bGRyICAgIENPRUYxLCBbUENPRUYsICNYICsgKDEqSk1BWCArIDYpICogWV0KKyAgICAgICAgdmxkciAgICBDT0VGMiwgW1BDT0VGLCAjWCArICgyKkpNQVggKyA2KSAqIFldCisgICAgICAgIHZsZHIgICAgQ09FRjMsIFtQQ09FRiwgI1ggKyAoMypKTUFYICsgNikgKiBZXQorICAgICAgICB2bWxhLmYgIEFDQ1VNMCwgQ09FRjAsIElONiAgICAgIEAgdmVjdG9yID0gdmVjdG9yICogc2NhbGFyCisgICAgICAgIHZsZHIgICAgQ09FRjQsIFtQQ09FRiwgI1ggKyAoMCpKTUFYICsgNykgKiBZXQorICAgICAgICB2bGRyICAgIENPRUY1LCBbUENPRUYsICNYICsgKDEqSk1BWCArIDcpICogWV0KKyAgICAgICAgdmxkciAgICBDT0VGNiwgW1BDT0VGLCAjWCArICgyKkpNQVggKyA3KSAqIFldCisgICAgICAgIHZsZHIgICAgQ09FRjcsIFtQQ09FRiwgI1ggKyAoMypKTUFYICsgNykgKiBZXQorICAgICAgICB2bWxhLmYgIEFDQ1VNNCwgQ09FRjQsIElONyAgICAgIEAgdmVjdG9yID0gdmVjdG9yICogc2NhbGFyCisgIC5lbmRpZgorIC5lbmRpZgorLmVuZG0KKworLm1hY3JvIGRjYV9sZmVfZmlyICBkZWNpZmFjdG9yCitmdW5jdGlvbiBmZl9kY2FfbGZlX2ZpclxkZWNpZmFjdG9yXCgpX3ZmcCwgZXhwb3J0PTEKKyAgICAgICAgZm1yeCAgICBPTERGUFNDUiwgRlBTQ1IKKyAgICAgICAgbGRyICAgICBpcCwgPTB4MDMwMzAwMDAgICAgICAgICBAIFJ1bkZhc3QgbW9kZSwgc2hvcnQgdmVjdG9ycyBvZiBsZW5ndGggNCwgc3RyaWRlIDEKKyAgICAgICAgZm14ciAgICBGUFNDUiwgaXAKKyAgICAgICAgdmxkciAgICBJTjAsIFtQSU4sICMtMCo0XQorICAgICAgICB2bGRyICAgIElOMSwgW1BJTiwgIy0xKjRdCisgICAgICAgIHZsZHIgICAgSU4yLCBbUElOLCAjLTIqNF0KKyAgICAgICAgdmxkciAgICBJTjMsIFtQSU4sICMtMyo0XQorIC5pZiBcZGVjaWZhY3RvciA9PSAzMgorICAuc2V0IEpNQVgsIDgKKyAgICAgICAgdnB1c2ggICB7czE2LXMzMX0KKyAgICAgICAgdmxkciAgICBJTjQsIFtQSU4sICMtNCo0XQorICAgICAgICB2bGRyICAgIElONSwgW1BJTiwgIy01KjRdCisgICAgICAgIHZsZHIgICAgSU42LCBbUElOLCAjLTYqNF0KKyAgICAgICAgdmxkciAgICBJTjcsIFtQSU4sICMtNyo0XQorIC5lbHNlCisgIC5zZXQgSk1BWCwgNAorICAgICAgICB2cHVzaCAgIHtzMTYtczI3fQorIC5lbmRpZgorCisgICAgICAgIG1vdiAgICAgQ09VTlRFUiwgI1xkZWNpZmFjdG9yLzQgLSAxCisgICAgICAgIGlubmVyX2xvb3AgIFxkZWNpZmFjdG9yLCB1cCwsIGhlYWQKKzE6ICAgICAgYWRkICAgICBQQ09FRiwgUENPRUYsICM0KkpNQVgqNAorICAgICAgICBzdWJzICAgIENPVU5URVIsIENPVU5URVIsICMxCisgICAgICAgIGlubmVyX2xvb3AgIFxkZWNpZmFjdG9yLCB1cCwgdGFpbCwgaGVhZAorICAgICAgICBibmUgICAgIDFiCisgICAgICAgIGlubmVyX2xvb3AgIFxkZWNpZmFjdG9yLCB1cCwgdGFpbAorCisgICAgICAgIG1vdiAgICAgQ09VTlRFUiwgI1xkZWNpZmFjdG9yLzQgLSAxCisgICAgICAgIGlubmVyX2xvb3AgIFxkZWNpZmFjdG9yLCBkb3duLCwgaGVhZAorMTogICAgICBzdWIgICAgIFBDT0VGLCBQQ09FRiwgIzQqSk1BWCo0CisgICAgICAgIHN1YnMgICAgQ09VTlRFUiwgQ09VTlRFUiwgIzEKKyAgICAgICAgaW5uZXJfbG9vcCAgXGRlY2lmYWN0b3IsIGRvd24sIHRhaWwsIGhlYWQKKyAgICAgICAgYm5lICAgICAxYgorICAgICAgICBpbm5lcl9sb29wICBcZGVjaWZhY3RvciwgZG93biwgdGFpbAorCisgLmlmIFxkZWNpZmFjdG9yID09IDMyCisgICAgICAgIHZwb3AgICAge3MxNi1zMzF9CisgLmVsc2UKKyAgICAgICAgdnBvcCAgICB7czE2LXMyN30KKyAuZW5kaWYKKyAgICAgICAgZm14ciAgICBGUFNDUiwgT0xERlBTQ1IKKyAgICAgICAgYnggICAgICBscgorZW5kZnVuYworLmVuZG0KKworICAgICAgICBkY2FfbGZlX2ZpciAgNjQKKyAubHRvcmcKKyAgICAgICAgZGNhX2xmZV9maXIgIDMyCisKKyAgICAgICAgLnVucmVxICBQT1VUCisgICAgICAgIC51bnJlcSAgUElOCisgICAgICAgIC51bnJlcSAgUENPRUYKKyAgICAgICAgLnVucmVxICBPTERGUFNDUgorICAgICAgICAudW5yZXEgIENPVU5URVIKKworICAgICAgICAudW5yZXEgIElOMAorICAgICAgICAudW5yZXEgIElOMQorICAgICAgICAudW5yZXEgIElOMgorICAgICAgICAudW5yZXEgIElOMworICAgICAgICAudW5yZXEgIElONAorICAgICAgICAudW5yZXEgIElONQorICAgICAgICAudW5yZXEgIElONgorICAgICAgICAudW5yZXEgIElONworICAgICAgICAudW5yZXEgIENPRUYwCisgICAgICAgIC51bnJlcSAgQ09FRjEKKyAgICAgICAgLnVucmVxICBDT0VGMgorICAgICAgICAudW5yZXEgIENPRUYzCisgICAgICAgIC51bnJlcSAgQ09FRjQKKyAgICAgICAgLnVucmVxICBDT0VGNQorICAgICAgICAudW5yZXEgIENPRUY2CisgICAgICAgIC51bnJlcSAgQ09FRjcKKyAgICAgICAgLnVucmVxICBBQ0NVTTAKKyAgICAgICAgLnVucmVxICBBQ0NVTTQKKyAgICAgICAgLnVucmVxICBQT1NUMAorICAgICAgICAudW5yZXEgIFBPU1QxCisgICAgICAgIC51bnJlcSAgUE9TVDIKKyAgICAgICAgLnVucmVxICBQT1NUMworCisKK0lOICAgICAgLnJlcSAgICBhMQorU0JBQ1QgICAucmVxICAgIGEyCitPTERGUFNDUiAucmVxICAgYTMKK0lNRENUICAgLnJlcSAgICBhNAorV0lORE9XICAucmVxICAgIHYxCitPVVQgICAgIC5yZXEgICAgdjIKK0JVRiAgICAgLnJlcSAgICB2MworU0NBTEVJTlQgLnJlcSAgIHY0IEAgb25seSB1c2VkIGluIHNvZnRmcCBjYXNlCitDT1VOVCAgIC5yZXEgICAgdjUKKworU0NBTEUgICAucmVxICAgIHMwCisKKy8qIFN0YWNrIGxheW91dCBkaWZmZXJzIGluIHNvZnRmcCBhbmQgaGFyZGZwIGNhc2VzOgorICoKKyAqIGhhcmRmcAorICogICAgICBmcCAtPiA2IGFyZyB3b3JkcyBzYXZlZCBieSBjYWxsZXIKKyAqICAgICAgICAgICAgYTMsYTQsdjEtdjMsdjUsZnAsbHIgb24gZW50cnkgKGEzIGp1c3QgdG8gcGFkIHRvIDggYnl0ZXMpCisgKiAgICAgICAgICAgIHMxNi1zMjMgb24gZW50cnkKKyAqICAgICAgICAgICAgYWxpZ24gMTYKKyAqICAgICBidWYgLT4gOCozMio0IGJ5dGVzIGJ1ZmZlcgorICogICAgICAgICAgICBzMCBvbiBlbnRyeQorICogICAgICBzcCAtPiAzIGFyZyB3b3JkcyBmb3IgY2FsbGVlCisgKgorICogc29mdGZwCisgKiAgICAgIGZwIC0+IDcgYXJnIHdvcmRzIHNhdmVkIGJ5IGNhbGxlcgorICogICAgICAgICAgICBhNCx2MS12NSxmcCxsciBvbiBlbnRyeQorICogICAgICAgICAgICBzMTYtczIzIG9uIGVudHJ5CisgKiAgICAgICAgICAgIGFsaWduIDE2CisgKiAgICAgYnVmIC0+IDgqMzIqNCBieXRlcyBidWZmZXIKKyAqICAgICAgc3AgLT4gNCBhcmcgd29yZHMgZm9yIGNhbGxlZQorICovCisKKy8qIHZvaWQgZmZfZGNhX3FtZl8zMl9zdWJiYW5kc192ZnAoZmxvYXQgc2FtcGxlc19pblszMl1bOF0sIGludCBzYl9hY3QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRoRmlsdGVyQ29udGV4dCAqc3ludGgsIEZGVENvbnRleHQgKmltZGN0LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAoKnN5bnRoX2J1Zl9wdHIpWzUxMl0sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc3ludGhfYnVmX29mZnNldCwgZmxvYXQgKCpzeW50aF9idWYyKVszMl0sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICgqd2luZG93KVs1MTJdLCBmbG9hdCAqc2FtcGxlc19vdXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICgqcmFYaW4pWzMyXSwgZmxvYXQgc2NhbGUpOworICovCitmdW5jdGlvbiBmZl9kY2FfcW1mXzMyX3N1YmJhbmRzX3ZmcCwgZXhwb3J0PTEKK1ZGUCAgICAgcHVzaCAgICB7YTMtYTQsdjEtdjMsdjUsZnAsbHJ9CitOT1ZGUCAgIHB1c2ggICAge2E0LHYxLXY1LGZwLGxyfQorICAgICAgICBhZGQgICAgIGZwLCBzcCwgIzgqNAorICAgICAgICB2cHVzaCAgIHtzMTYtczIzfQorICAgICAgICBAIFRoZSBidWZmZXIgcG9pbnRlZCBhdCBieSByYVhpbiBpc24ndCBiaWcgZW5vdWdoIGZvciB1cyB0byBkbyBhCisgICAgICAgIEAgY29tcGxldGUgbWF0cml4IHRyYW5zcG9zaXRpb24gYXMgd2Ugd2FudCB0bywgc28gYWxsb2NhdGUgYW4KKyAgICAgICAgQCBhbHRlcm5hdGl2ZSBidWZmZXIgZnJvbSB0aGUgc3RhY2suIEFsaWduIHRvIDQgd29yZHMgZm9yIHNwZWVkLgorICAgICAgICBzdWIgICAgIEJVRiwgc3AsICM4KjMyKjQKKyAgICAgICAgYmljICAgICBCVUYsIEJVRiwgIzE1CisgICAgICAgIG1vdiAgICAgc3AsIEJVRgorICAgICAgICBsZHIgICAgIGxyLCA9MHgwMzMzMDAwMCAgICAgQCBSdW5GYXN0IG1vZGUsIHNob3J0IHZlY3RvcnMgb2YgbGVuZ3RoIDQsIHN0cmlkZSAyCisgICAgICAgIGZtcnggICAgT0xERlBTQ1IsIEZQU0NSCisgICAgICAgIGZteHIgICAgRlBTQ1IsIGxyCisgICAgICAgIEAgQ09VTlQgaXMgdXNlZCB0byBjb3VudCBkb3duIDIgdGhpbmdzIGF0IG9uY2U6CisgICAgICAgIEAgYml0cyAwLTQgYXJlIHRoZSBudW1iZXIgb2Ygd29yZCBwYWlycyByZW1haW5pbmcgaW4gdGhlIG91dHB1dCByb3cKKyAgICAgICAgQCBiaXRzIDUtMzEgYXJlIHRoZSBudW1iZXIgb2Ygd29yZHMgdG8gY29weSAod2l0aCBwb3NzaWJsZSBuZWdhdGlvbikKKyAgICAgICAgQCAgIGZyb20gdGhlIHNvdXJjZSBtYXRyaXggYmVmb3JlIHdlIHN0YXJ0IHplcm9pbmcgdGhlIHJlbWFpbmRlcgorICAgICAgICBtb3YgICAgIENPVU5ULCAjKC00IDw8IDUpICsgMTYKKyAgICAgICAgYWRkcyAgICBDT1VOVCwgQ09VTlQsIFNCQUNULCBsc2wgIzUKKyAgICAgICAgYm1pICAgICAyZgorMToKKyAgICAgICAgdmxkciAgICBzOCwgIFtJTiwgIygwKjgrMCkqNF0KKyAgICAgICAgdmxkciAgICBzMTAsIFtJTiwgIygwKjgrMSkqNF0KKyAgICAgICAgdmxkciAgICBzMTIsIFtJTiwgIygwKjgrMikqNF0KKyAgICAgICAgdmxkciAgICBzMTQsIFtJTiwgIygwKjgrMykqNF0KKyAgICAgICAgdmxkciAgICBzMTYsIFtJTiwgIygwKjgrNCkqNF0KKyAgICAgICAgdmxkciAgICBzMTgsIFtJTiwgIygwKjgrNSkqNF0KKyAgICAgICAgdmxkciAgICBzMjAsIFtJTiwgIygwKjgrNikqNF0KKyAgICAgICAgdmxkciAgICBzMjIsIFtJTiwgIygwKjgrNykqNF0KKyAgICAgICAgdm5lZy5mICBzOCwgczgKKyAgICAgICAgdmxkciAgICBzOSwgIFtJTiwgIygxKjgrMCkqNF0KKyAgICAgICAgdmxkciAgICBzMTEsIFtJTiwgIygxKjgrMSkqNF0KKyAgICAgICAgdmxkciAgICBzMTMsIFtJTiwgIygxKjgrMikqNF0KKyAgICAgICAgdmxkciAgICBzMTUsIFtJTiwgIygxKjgrMykqNF0KKyAgICAgICAgdm5lZy5mICBzMTYsIHMxNgorICAgICAgICB2bGRyICAgIHMxNywgW0lOLCAjKDEqOCs0KSo0XQorICAgICAgICB2bGRyICAgIHMxOSwgW0lOLCAjKDEqOCs1KSo0XQorICAgICAgICB2bGRyICAgIHMyMSwgW0lOLCAjKDEqOCs2KSo0XQorICAgICAgICB2bGRyICAgIHMyMywgW0lOLCAjKDEqOCs3KSo0XQorICAgICAgICB2c3RyICAgIGQ0LCAgW0JVRiwgIygwKjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDUsICBbQlVGLCAjKDEqMzIrMCkqNF0KKyAgICAgICAgdnN0ciAgICBkNiwgIFtCVUYsICMoMiozMiswKSo0XQorICAgICAgICB2c3RyICAgIGQ3LCAgW0JVRiwgIygzKjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDgsICBbQlVGLCAjKDQqMzIrMCkqNF0KKyAgICAgICAgdnN0ciAgICBkOSwgIFtCVUYsICMoNSozMiswKSo0XQorICAgICAgICB2c3RyICAgIGQxMCwgW0JVRiwgIyg2KjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDExLCBbQlVGLCAjKDcqMzIrMCkqNF0KKyAgICAgICAgdmxkciAgICBzOSwgIFtJTiwgIygzKjgrMCkqNF0KKyAgICAgICAgdmxkciAgICBzMTEsIFtJTiwgIygzKjgrMSkqNF0KKyAgICAgICAgdmxkciAgICBzMTMsIFtJTiwgIygzKjgrMikqNF0KKyAgICAgICAgdmxkciAgICBzMTUsIFtJTiwgIygzKjgrMykqNF0KKyAgICAgICAgdmxkciAgICBzMTcsIFtJTiwgIygzKjgrNCkqNF0KKyAgICAgICAgdmxkciAgICBzMTksIFtJTiwgIygzKjgrNSkqNF0KKyAgICAgICAgdmxkciAgICBzMjEsIFtJTiwgIygzKjgrNikqNF0KKyAgICAgICAgdmxkciAgICBzMjMsIFtJTiwgIygzKjgrNykqNF0KKyAgICAgICAgdm5lZy5mICBzOSwgczkKKyAgICAgICAgdmxkciAgICBzOCwgIFtJTiwgIygyKjgrMCkqNF0KKyAgICAgICAgdmxkciAgICBzMTAsIFtJTiwgIygyKjgrMSkqNF0KKyAgICAgICAgdmxkciAgICBzMTIsIFtJTiwgIygyKjgrMikqNF0KKyAgICAgICAgdmxkciAgICBzMTQsIFtJTiwgIygyKjgrMykqNF0KKyAgICAgICAgdm5lZy5mICBzMTcsIHMxNworICAgICAgICB2bGRyICAgIHMxNiwgW0lOLCAjKDIqOCs0KSo0XQorICAgICAgICB2bGRyICAgIHMxOCwgW0lOLCAjKDIqOCs1KSo0XQorICAgICAgICB2bGRyICAgIHMyMCwgW0lOLCAjKDIqOCs2KSo0XQorICAgICAgICB2bGRyICAgIHMyMiwgW0lOLCAjKDIqOCs3KSo0XQorICAgICAgICB2c3RyICAgIGQ0LCAgW0JVRiwgIygwKjMyKzIpKjRdCisgICAgICAgIHZzdHIgICAgZDUsICBbQlVGLCAjKDEqMzIrMikqNF0KKyAgICAgICAgdnN0ciAgICBkNiwgIFtCVUYsICMoMiozMisyKSo0XQorICAgICAgICB2c3RyICAgIGQ3LCAgW0JVRiwgIygzKjMyKzIpKjRdCisgICAgICAgIHZzdHIgICAgZDgsICBbQlVGLCAjKDQqMzIrMikqNF0KKyAgICAgICAgdnN0ciAgICBkOSwgIFtCVUYsICMoNSozMisyKSo0XQorICAgICAgICB2c3RyICAgIGQxMCwgW0JVRiwgIyg2KjMyKzIpKjRdCisgICAgICAgIHZzdHIgICAgZDExLCBbQlVGLCAjKDcqMzIrMikqNF0KKyAgICAgICAgYWRkICAgICBJTiwgSU4sICM0KjgqNAorICAgICAgICBhZGQgICAgIEJVRiwgQlVGLCAjNCo0CisgICAgICAgIHN1YnMgICAgQ09VTlQsIENPVU5ULCAjKDQgPDwgNSkgKyAyCisgICAgICAgIGJwbCAgICAgMWIKKzI6ICAgICAgQCBOb3cgZGVhbCB3aXRoIHRyYWlsaW5nIDwgNCBzYW1wbGVzCisgICAgICAgIGFkZHMgICAgQ09VTlQsIENPVU5ULCAjMyA8PCA1CisgICAgICAgIGJtaSAgICAgNGYgIEAgc2JfYWN0IHdhcyBhIG11bHRpcGxlIG9mIDQKKyAgICAgICAgYmljcyAgICBsciwgQ09VTlQsICMweDFGCisgICAgICAgIGJuZSAgICAgM2YKKyAgICAgICAgQCBzYl9hY3Qgd2FzIG4qNCsxCisgICAgICAgIHZsZHIgICAgczgsICBbSU4sICMoMCo4KzApKjRdCisgICAgICAgIHZsZHIgICAgczEwLCBbSU4sICMoMCo4KzEpKjRdCisgICAgICAgIHZsZHIgICAgczEyLCBbSU4sICMoMCo4KzIpKjRdCisgICAgICAgIHZsZHIgICAgczE0LCBbSU4sICMoMCo4KzMpKjRdCisgICAgICAgIHZsZHIgICAgczE2LCBbSU4sICMoMCo4KzQpKjRdCisgICAgICAgIHZsZHIgICAgczE4LCBbSU4sICMoMCo4KzUpKjRdCisgICAgICAgIHZsZHIgICAgczIwLCBbSU4sICMoMCo4KzYpKjRdCisgICAgICAgIHZsZHIgICAgczIyLCBbSU4sICMoMCo4KzcpKjRdCisgICAgICAgIHZuZWcuZiAgczgsIHM4CisgICAgICAgIHZsZHIgICAgczksICB6ZXJvCisgICAgICAgIHZsZHIgICAgczExLCB6ZXJvCisgICAgICAgIHZsZHIgICAgczEzLCB6ZXJvCisgICAgICAgIHZsZHIgICAgczE1LCB6ZXJvCisgICAgICAgIHZuZWcuZiAgczE2LCBzMTYKKyAgICAgICAgdmxkciAgICBzMTcsIHplcm8KKyAgICAgICAgdmxkciAgICBzMTksIHplcm8KKyAgICAgICAgdmxkciAgICBzMjEsIHplcm8KKyAgICAgICAgdmxkciAgICBzMjMsIHplcm8KKyAgICAgICAgdnN0ciAgICBkNCwgIFtCVUYsICMoMCozMiswKSo0XQorICAgICAgICB2c3RyICAgIGQ1LCAgW0JVRiwgIygxKjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDYsICBbQlVGLCAjKDIqMzIrMCkqNF0KKyAgICAgICAgdnN0ciAgICBkNywgIFtCVUYsICMoMyozMiswKSo0XQorICAgICAgICB2c3RyICAgIGQ4LCAgW0JVRiwgIyg0KjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDksICBbQlVGLCAjKDUqMzIrMCkqNF0KKyAgICAgICAgdnN0ciAgICBkMTAsIFtCVUYsICMoNiozMiswKSo0XQorICAgICAgICB2c3RyICAgIGQxMSwgW0JVRiwgIyg3KjMyKzApKjRdCisgICAgICAgIGFkZCAgICAgQlVGLCBCVUYsICMyKjQKKyAgICAgICAgc3ViICAgICBDT1VOVCwgQ09VTlQsICMxCisgICAgICAgIGIgICAgICAgNGYKKzM6ICAgICAgQCBzYl9hY3Qgd2FzIG4qNCsyIG9yIG4qNCszLCBzbyBkbyB0aGUgZmlyc3QgMgorICAgICAgICB2bGRyICAgIHM4LCAgW0lOLCAjKDAqOCswKSo0XQorICAgICAgICB2bGRyICAgIHMxMCwgW0lOLCAjKDAqOCsxKSo0XQorICAgICAgICB2bGRyICAgIHMxMiwgW0lOLCAjKDAqOCsyKSo0XQorICAgICAgICB2bGRyICAgIHMxNCwgW0lOLCAjKDAqOCszKSo0XQorICAgICAgICB2bGRyICAgIHMxNiwgW0lOLCAjKDAqOCs0KSo0XQorICAgICAgICB2bGRyICAgIHMxOCwgW0lOLCAjKDAqOCs1KSo0XQorICAgICAgICB2bGRyICAgIHMyMCwgW0lOLCAjKDAqOCs2KSo0XQorICAgICAgICB2bGRyICAgIHMyMiwgW0lOLCAjKDAqOCs3KSo0XQorICAgICAgICB2bmVnLmYgIHM4LCBzOAorICAgICAgICB2bGRyICAgIHM5LCAgW0lOLCAjKDEqOCswKSo0XQorICAgICAgICB2bGRyICAgIHMxMSwgW0lOLCAjKDEqOCsxKSo0XQorICAgICAgICB2bGRyICAgIHMxMywgW0lOLCAjKDEqOCsyKSo0XQorICAgICAgICB2bGRyICAgIHMxNSwgW0lOLCAjKDEqOCszKSo0XQorICAgICAgICB2bmVnLmYgIHMxNiwgczE2CisgICAgICAgIHZsZHIgICAgczE3LCBbSU4sICMoMSo4KzQpKjRdCisgICAgICAgIHZsZHIgICAgczE5LCBbSU4sICMoMSo4KzUpKjRdCisgICAgICAgIHZsZHIgICAgczIxLCBbSU4sICMoMSo4KzYpKjRdCisgICAgICAgIHZsZHIgICAgczIzLCBbSU4sICMoMSo4KzcpKjRdCisgICAgICAgIHZzdHIgICAgZDQsICBbQlVGLCAjKDAqMzIrMCkqNF0KKyAgICAgICAgdnN0ciAgICBkNSwgIFtCVUYsICMoMSozMiswKSo0XQorICAgICAgICB2c3RyICAgIGQ2LCAgW0JVRiwgIygyKjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDcsICBbQlVGLCAjKDMqMzIrMCkqNF0KKyAgICAgICAgdnN0ciAgICBkOCwgIFtCVUYsICMoNCozMiswKSo0XQorICAgICAgICB2c3RyICAgIGQ5LCAgW0JVRiwgIyg1KjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDEwLCBbQlVGLCAjKDYqMzIrMCkqNF0KKyAgICAgICAgdnN0ciAgICBkMTEsIFtCVUYsICMoNyozMiswKSo0XQorICAgICAgICBhZGQgICAgIEJVRiwgQlVGLCAjMio0CisgICAgICAgIHN1YiAgICAgQ09VTlQsIENPVU5ULCAjKDIgPDwgNSkgKyAxCisgICAgICAgIGJpY3MgICAgbHIsIENPVU5ULCAjMHgxRgorICAgICAgICBibmUgICAgIDRmCisgICAgICAgIEAgc2JfYWN0IHdhcyBuKjQrMworICAgICAgICB2bGRyICAgIHM4LCAgW0lOLCAjKDIqOCswKSo0XQorICAgICAgICB2bGRyICAgIHMxMCwgW0lOLCAjKDIqOCsxKSo0XQorICAgICAgICB2bGRyICAgIHMxMiwgW0lOLCAjKDIqOCsyKSo0XQorICAgICAgICB2bGRyICAgIHMxNCwgW0lOLCAjKDIqOCszKSo0XQorICAgICAgICB2bGRyICAgIHMxNiwgW0lOLCAjKDIqOCs0KSo0XQorICAgICAgICB2bGRyICAgIHMxOCwgW0lOLCAjKDIqOCs1KSo0XQorICAgICAgICB2bGRyICAgIHMyMCwgW0lOLCAjKDIqOCs2KSo0XQorICAgICAgICB2bGRyICAgIHMyMiwgW0lOLCAjKDIqOCs3KSo0XQorICAgICAgICB2bGRyICAgIHM5LCAgemVybworICAgICAgICB2bGRyICAgIHMxMSwgemVybworICAgICAgICB2bGRyICAgIHMxMywgemVybworICAgICAgICB2bGRyICAgIHMxNSwgemVybworICAgICAgICB2bGRyICAgIHMxNywgemVybworICAgICAgICB2bGRyICAgIHMxOSwgemVybworICAgICAgICB2bGRyICAgIHMyMSwgemVybworICAgICAgICB2bGRyICAgIHMyMywgemVybworICAgICAgICB2c3RyICAgIGQ0LCAgW0JVRiwgIygwKjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDUsICBbQlVGLCAjKDEqMzIrMCkqNF0KKyAgICAgICAgdnN0ciAgICBkNiwgIFtCVUYsICMoMiozMiswKSo0XQorICAgICAgICB2c3RyICAgIGQ3LCAgW0JVRiwgIygzKjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDgsICBbQlVGLCAjKDQqMzIrMCkqNF0KKyAgICAgICAgdnN0ciAgICBkOSwgIFtCVUYsICMoNSozMiswKSo0XQorICAgICAgICB2c3RyICAgIGQxMCwgW0JVRiwgIyg2KjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDExLCBbQlVGLCAjKDcqMzIrMCkqNF0KKyAgICAgICAgYWRkICAgICBCVUYsIEJVRiwgIzIqNAorICAgICAgICBzdWIgICAgIENPVU5ULCBDT1VOVCwgIzEKKzQ6ICAgICAgQCBOb3cgZmlsbCB0aGUgcmVtYWluZGVyIHdpdGggMAorICAgICAgICB2bGRyICAgIHM4LCB6ZXJvCisgICAgICAgIHZsZHIgICAgczksIHplcm8KKyAgICAgICAgYW5kcyAgICBDT1VOVCwgQ09VTlQsICMweDFGCisgICAgICAgIGJlcSAgICAgNmYKKzU6ICAgICAgdnN0ciAgICBkNCwgW0JVRiwgIygwKjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDQsIFtCVUYsICMoMSozMiswKSo0XQorICAgICAgICB2c3RyICAgIGQ0LCBbQlVGLCAjKDIqMzIrMCkqNF0KKyAgICAgICAgdnN0ciAgICBkNCwgW0JVRiwgIygzKjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDQsIFtCVUYsICMoNCozMiswKSo0XQorICAgICAgICB2c3RyICAgIGQ0LCBbQlVGLCAjKDUqMzIrMCkqNF0KKyAgICAgICAgdnN0ciAgICBkNCwgW0JVRiwgIyg2KjMyKzApKjRdCisgICAgICAgIHZzdHIgICAgZDQsIFtCVUYsICMoNyozMiswKSo0XQorICAgICAgICBhZGQgICAgIEJVRiwgQlVGLCAjMio0CisgICAgICAgIHN1YnMgICAgQ09VTlQsIENPVU5ULCAjMQorICAgICAgICBibmUgICAgIDViCis2OgorICAgICAgICBmbXhyICAgIEZQU0NSLCBPTERGUFNDUgorICAgICAgICBsZHIgICAgIFdJTkRPVywgW2ZwLCAjMyo0XQorICAgICAgICBsZHIgICAgIE9VVCwgW2ZwLCAjNCo0XQorICAgICAgICBzdWIgICAgIEJVRiwgQlVGLCAjMzIqNAorTk9WRlAgICBsZHIgICAgIFNDQUxFSU5ULCBbZnAsICM2KjRdCisgICAgICAgIG1vdiAgICAgQ09VTlQsICM4CitWRlAgICAgIHZwdXNoICAge1NDQUxFfQorVkZQICAgICBzdWIgICAgIHNwLCBzcCwgIzMqNAorTk9WRlAgICBzdWIgICAgIHNwLCBzcCwgIzQqNAorNzoKK1ZGUCAgICAgbGRyICAgICBhMSwgW2ZwLCAjLTcqNF0gICAgIEAgaW1kY3QKK05PVkZQICAgbGRyICAgICBhMSwgW2ZwLCAjLTgqNF0KKyAgICAgICAgbGRtaWEgICBmcCwge2EyLWE0fQorVkZQICAgICBzdG1pYSAgIHNwLCB7V0lORE9XLCBPVVQsIEJVRn0KK05PVkZQICAgc3RtaWEgICBzcCwge1dJTkRPVywgT1VULCBCVUYsIFNDQUxFSU5UfQorVkZQICAgICB2bGRyICAgIFNDQUxFLCBbc3AsICMzKjRdCisgICAgICAgIGJsICAgICAgWChmZl9zeW50aF9maWx0ZXJfZmxvYXRfdmZwKQorICAgICAgICBhZGQgICAgIE9VVCwgT1VULCAjMzIqNAorICAgICAgICBhZGQgICAgIEJVRiwgQlVGLCAjMzIqNAorICAgICAgICBzdWJzICAgIENPVU5ULCBDT1VOVCwgIzEKKyAgICAgICAgYm5lICAgICA3YgorCitBICAgICAgIHN1YiAgICAgc3AsIGZwLCAjKDgrOCkqNAorVCAgICAgICBzdWIgICAgIGZwLCBmcCwgIyg4KzgpKjQKK1QgICAgICAgbW92ICAgICBzcCwgZnAKKyAgICAgICAgdnBvcCAgICB7czE2LXMyM30KK1ZGUCAgICAgcG9wICAgICB7YTMtYTQsdjEtdjMsdjUsZnAscGN9CitOT1ZGUCAgIHBvcCAgICAge2E0LHYxLXY1LGZwLHBjfQorZW5kZnVuYworCisgICAgICAgIC51bnJlcSAgSU4KKyAgICAgICAgLnVucmVxICBTQkFDVAorICAgICAgICAudW5yZXEgIE9MREZQU0NSCisgICAgICAgIC51bnJlcSAgSU1EQ1QKKyAgICAgICAgLnVucmVxICBXSU5ET1cKKyAgICAgICAgLnVucmVxICBPVVQKKyAgICAgICAgLnVucmVxICBCVUYKKyAgICAgICAgLnVucmVxICBTQ0FMRUlOVAorICAgICAgICAudW5yZXEgIENPVU5UCisKKyAgICAgICAgLnVucmVxICBTQ0FMRQorCisgICAgICAgIC5hbGlnbiAyCit6ZXJvOiAgIC53b3JkICAgMApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2RjdC10ZXN0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZGN0LXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTA3NmIzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2RjdC10ZXN0LmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJpZGN0LmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnbyBmZGN0X3RhYl9hcmNoW10gPSB7CisgICAgeyAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnbyBpZGN0X3RhYl9hcmNoW10gPSB7CisgICAgeyAiU0lNUExFLUFSTSIsICAgICBmZl9zaW1wbGVfaWRjdF9hcm0sICAgICBGRl9JRENUX1BFUk1fTk9ORSB9LAorICAgIHsgIklOVC1BUk0iLCAgICAgICAgZmZfal9yZXZfZGN0X2FybSwgICAgICAgRkZfSURDVF9QRVJNX0xJQk1QRUcyIH0sCisjaWYgSEFWRV9BUk1WNVRFCisgICAgeyAiU0lNUExFLUFSTVY1VEUiLCBmZl9zaW1wbGVfaWRjdF9hcm12NXRlLCBGRl9JRENUX1BFUk1fTk9ORSwgICAgICBBVl9DUFVfRkxBR19BUk1WNVRFIH0sCisjZW5kaWYKKyNpZiBIQVZFX0FSTVY2CisgICAgeyAiU0lNUExFLUFSTVY2IiwgICBmZl9zaW1wbGVfaWRjdF9hcm12NiwgICBGRl9JRENUX1BFUk1fTElCTVBFRzIsICBBVl9DUFVfRkxBR19BUk1WNiB9LAorI2VuZGlmCisjaWYgSEFWRV9ORU9OCisgICAgeyAiU0lNUExFLU5FT04iLCAgICBmZl9zaW1wbGVfaWRjdF9uZW9uLCAgICBGRl9JRENUX1BFUk1fUEFSVFRSQU5TLCBBVl9DUFVfRkxBR19ORU9OIH0sCisjZW5kaWYKKyAgICB7IDAgfQorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9mZnRfZml4ZWRfaW5pdF9hcm0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9mZnRfZml4ZWRfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjBiYjlmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2ZmdF9maXhlZF9pbml0X2FybS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorCisjZGVmaW5lIEZGVF9GTE9BVCAwCisjaW5jbHVkZSAibGliYXZjb2RlYy9mZnQuaCIKKwordm9pZCBmZl9mZnRfZml4ZWRfY2FsY19uZW9uKEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopOwordm9pZCBmZl9tZGN0X2ZpeGVkX2NhbGNfbmVvbihGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm8sIGNvbnN0IEZGVFNhbXBsZSAqaSk7Cit2b2lkIGZmX21kY3RfZml4ZWRfY2FsY3dfbmVvbihGRlRDb250ZXh0ICpzLCBGRlREb3VibGUgKm8sIGNvbnN0IEZGVFNhbXBsZSAqaSk7CisKK2F2X2NvbGQgdm9pZCBmZl9mZnRfZml4ZWRfaW5pdF9hcm0oRkZUQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPmZmdF9wZXJtdXRhdGlvbiA9IEZGX0ZGVF9QRVJNX1NXQVBfTFNCUzsKKyNpZiBDT05GSUdfRkZUCisgICAgICAgIHMtPmZmdF9jYWxjICAgICAgICA9IGZmX2ZmdF9maXhlZF9jYWxjX25lb247CisjZW5kaWYKKworI2lmIENPTkZJR19NRENUCisgICAgICAgIGlmICghcy0+aW52ZXJzZSAmJiBzLT5uYml0cyA+PSAzKSB7CisgICAgICAgICAgICBzLT5tZGN0X3Blcm11dGF0aW9uID0gRkZfTURDVF9QRVJNX0lOVEVSTEVBVkU7CisgICAgICAgICAgICBzLT5tZGN0X2NhbGMgICAgICAgID0gZmZfbWRjdF9maXhlZF9jYWxjX25lb247CisgICAgICAgICAgICBzLT5tZGN0X2NhbGN3ICAgICAgID0gZmZfbWRjdF9maXhlZF9jYWxjd19uZW9uOworICAgICAgICB9CisjZW5kaWYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZmZ0X2ZpeGVkX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9mZnRfZml4ZWRfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YThjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZmZ0X2ZpeGVkX25lb24uUwpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKKy5tYWNybyAgYmZsaWVzICAgICAgICAgIGQwLCAgZDEsICByMCwgIHIxCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBccjAsIFxkMSAgICAgICAgICAgICAgICBAIHQ1LCB0NiwgdDEsIHQyCisgICAgICAgIHZoc3ViLnMxNiAgICAgICBccjEsIFxkMSwgXHIwICAgICAgICAgICBAIHQxLXQ1LCB0Mi10NiwgdDUtdDEsIHQ2LXQyCisgICAgICAgIHZoYWRkLnMxNiAgICAgICBccjAsIFxkMSwgXHIwICAgICAgICAgICBAIHQxK3Q1LCB0Mit0NiwgdDUrdDEsIHQ2K3QyCisgICAgICAgIHZleHQuMTYgICAgICAgICBccjEsIFxyMSwgXHIxLCAjMSAgICAgICBAIHQyLXQ2LCB0NS10MSwgdDYtdDIsIHQxLXQ1CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBccjAsIFxyMSAgICAgICAgICAgICAgICBAIHQxK3Q1LCB0Mit0NiwgdDItdDYsIHQ1LXQxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHQ1LCAgICB0NiwgICAgdDQsICAgIHQzCisgICAgICAgIHZoc3ViLnMxNiAgICAgICBcZDEsIFxkMCwgXHIwCisgICAgICAgIHZoYWRkLnMxNiAgICAgICBcZDAsIFxkMCwgXHIwCisuZW5kbQorCisubWFjcm8gIHRyYW5zZm9ybTAxICAgICBxMCwgIHExLCAgZDMsICBjMCwgIGMxLCAgcjAsICB3MCwgIHcxCisgICAgICAgIHZyZXYzMi4xNiAgICAgICBccjAsIFxkMworICAgICAgICB2bXVsbC5zMTYgICAgICAgXHcwLCBcZDMsIFxjMAorICAgICAgICB2bWxhbC5zMTYgICAgICAgXHcwLCBccjAsIFxjMQorICAgICAgICB2c2hybi5zMzIgICAgICAgXGQzLCBcdzAsICMxNQorICAgICAgICBiZmxpZXMgICAgICAgICAgXHEwLCBccTEsIFx3MCwgXHcxCisuZW5kbQorCisubWFjcm8gIHRyYW5zZm9ybTIgICAgICBkMCwgIGQxLCAgZDIsICBkMywgIHEwLCAgcTEsICBjMCwgIGMxLCAgYzIsICBjMywgXAorICAgICAgICAgICAgICAgICAgICAgICAgcjAsICByMSwgIHcwLCAgdzEKKyAgICAgICAgdnJldjMyLjE2ICAgICAgIFxyMCwgXGQxCisgICAgICAgIHZyZXYzMi4xNiAgICAgICBccjEsIFxkMworICAgICAgICB2bXVsbC5zMTYgICAgICAgXHcwLCBcZDEsIFxjMAorICAgICAgICB2bWxhbC5zMTYgICAgICAgXHcwLCBccjAsIFxjMQorICAgICAgICB2bXVsbC5zMTYgICAgICAgXHcxLCBcZDMsIFxjMgorICAgICAgICB2bWxhbC5zMTYgICAgICAgXHcxLCBccjEsIFxjMworICAgICAgICB2c2hybi5zMzIgICAgICAgXGQxLCBcdzAsICMxNQorICAgICAgICB2c2hybi5zMzIgICAgICAgXGQzLCBcdzEsICMxNQorICAgICAgICBiZmxpZXMgICAgICAgICAgXHEwLCBccTEsIFx3MCwgXHcxCisuZW5kbQorCisubWFjcm8gIGZmdDQgICAgICAgICAgICBkMCwgIGQxLCAgcjAsICByMQorICAgICAgICB2aHN1Yi5zMTYgICAgICAgXHIwLCBcZDAsIFxkMSAgICAgICAgICAgQCB0MywgdDQsIHQ4LCB0NworICAgICAgICB2aHN1Yi5zMTYgICAgICAgXHIxLCBcZDEsIFxkMAorICAgICAgICB2aGFkZC5zMTYgICAgICAgXGQwLCBcZDAsIFxkMSAgICAgICAgICAgQCB0MSwgdDIsIHQ2LCB0NQorICAgICAgICB2bW92Lmk2NCAgICAgICAgXGQxLCAjMHhmZmZmMDAwMDAwMDAKKyAgICAgICAgdmJpdCAgICAgICAgICAgIFxyMCwgXHIxLCBcZDEKKyAgICAgICAgdnJldjY0LjE2ICAgICAgIFxyMSwgXHIwICAgICAgICAgICAgICAgIEAgdDcsIHQ4LCB0NCwgdDMKKyAgICAgICAgdnRybi4zMiAgICAgICAgIFxyMCwgXHIxICAgICAgICAgICAgICAgIEAgdDMsIHQ0LCB0NywgdDgKKyAgICAgICAgdnRybi4zMiAgICAgICAgIFxkMCwgXHIwICAgICAgICAgICAgICAgIEAgdDEsIHQyLCB0MywgdDQsIHQ2LCB0NSwgdDgsIHQ3CisgICAgICAgIHZoc3ViLnMxNiAgICAgICBcZDEsIFxkMCwgXHIwICAgICAgICAgICBAIHIyLCBpMiwgcjMsIGkxCisgICAgICAgIHZoYWRkLnMxNiAgICAgICBcZDAsIFxkMCwgXHIwICAgICAgICAgICBAIHIwLCBpMCwgcjEsIGkzCisuZW5kbQorCisubWFjcm8gIGZmdDggICAgICAgICAgICBkMCwgIGQxLCAgZDIsICBkMywgIHEwLCAgcTEsICBjMCwgIGMxLCAgcjAsICByMSwgdzAsIHcxCisgICAgICAgIGZmdDQgICAgICAgICAgICBcZDAsIFxkMSwgXHIwLCBccjEKKyAgICAgICAgdnRybi4zMiAgICAgICAgIFxkMCwgXGQxICAgICAgICAgICAgICAgIEAgejAsIHoyLCB6MSwgejMKKyAgICAgICAgdmhhZGQuczE2ICAgICAgIFxyMCwgXGQyLCBcZDMgICAgICAgICAgIEAgdDEsIHQyLCB0MywgdDQKKyAgICAgICAgdmhzdWIuczE2ICAgICAgIFxkMywgXGQyLCBcZDMgICAgICAgICAgIEAgejUsIHo3CisgICAgICAgIHZtb3YgICAgICAgICAgICBcZDIsIFxyMAorICAgICAgICB0cmFuc2Zvcm0wMSAgICAgXHEwLCBccTEsIFxkMywgXGMwLCBcYzEsIFxyMCwgXHcwLCBcdzEKKy5lbmRtCisKK2Z1bmN0aW9uIGZmdDRfbmVvbgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QwLWQxfSwgIFtyMF0KKyAgICAgICAgZmZ0NCAgICAgICAgICAgIGQwLCAgZDEsICBkMiwgIGQzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDAtZDF9LCAgW3IwXQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZ0OF9uZW9uCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDAtZDN9LCAgW3IwLDoxMjhdCisgICAgICAgIG1vdnJlbCAgICAgICAgICByMSwgIGNvZWZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDMwfSwgICAgW3IxLDo2NF0KKyAgICAgICAgdmR1cC4xNiAgICAgICAgIGQzMSwgZDMwWzBdCisgICAgICAgIGZmdDggICAgICAgICAgICBkMCwgIGQxLCAgZDIsICBkMywgIHEwLCAgcTEsICBkMzEsIGQzMCwgZDIwLCBkMjEsIHE4LCBxOQorICAgICAgICB2dHJuLjMyICAgICAgICAgZDAsICBkMQorICAgICAgICB2dHJuLjMyICAgICAgICAgZDIsICBkMworICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwLWQzfSwgIFtyMCw6MTI4XQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZ0MTZfbmVvbgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QwLWQzfSwgIFtyMCw6MTI4XSEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkNC1kN30sICBbcjAsOjEyOF0KKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxLCAgY29lZnMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjMzIKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMjgtZDMxfSxbcjEsOjEyOF0KKyAgICAgICAgdmR1cC4xNiAgICAgICAgIGQzMSwgZDI4WzBdCisgICAgICAgIGZmdDggICAgICAgICAgICBkMCwgIGQxLCAgZDIsICBkMywgIHEwLCAgcTEsICBkMzEsIGQyOCwgZDIwLCBkMjEsIHE4LCBxOQorICAgICAgICB2c3dwICAgICAgICAgICAgZDUsICBkNgorICAgICAgICBmZnQ0ICAgICAgICAgICAgcTIsICBxMywgIHE4LCAgcTkKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQ1LCAgZDYKKyAgICAgICAgdnRybi4zMiAgICAgICAgIHEwLCAgcTEgICAgICAgICAgICAgQCB6MCwgejQsIHoyLCB6NiwgejEsIHo1LCB6MywgejcKKyAgICAgICAgdnRybi4zMiAgICAgICAgIHEyLCAgcTMgICAgICAgICAgICAgQCB6OCwgejEyLHoxMCx6MTQsejksIHoxMyx6MTEsejE1CisgICAgICAgIHZzd3AgICAgICAgICAgICBkMSwgIGQyCisgICAgICAgIHZkdXAuMTYgICAgICAgICBkMzEsIGQyOFswXQorICAgICAgICB0cmFuc2Zvcm0wMSAgICAgcTAsICBxMiwgIGQ1LCAgZDMxLCBkMjgsIGQyMCwgcTgsIHE5CisgICAgICAgIHZkdXAuMTYgICAgICAgICBkMjYsIGQyOVswXQorICAgICAgICB2ZHVwLjE2ICAgICAgICAgZDI3LCBkMzBbMF0KKyAgICAgICAgdHJhbnNmb3JtMiAgICAgIGQyLCAgZDYsICBkMywgIGQ3LCAgcTEsICBxMywgIGQyNiwgZDMwLCBkMjcsIGQyOSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgZDIwLCBkMjEsIHE4LCAgcTkKKyAgICAgICAgdnRybi4zMiAgICAgICAgIHEwLCAgcTEKKyAgICAgICAgdnRybi4zMiAgICAgICAgIHEyLCAgcTMKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMC1kM30sICBbcjAsOjEyOF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDQtZDd9LCAgW3IwLDoxMjhdCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZnRfcGFzc19uZW9uCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsbHJ9CisgICAgICAgIG1vdnJlbCAgICAgICAgICBsciwgIGNvZWZzICsgMjQKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMzB9LCAgICBbbHIsOjY0XQorICAgICAgICBsc2wgICAgICAgICAgICAgcjEyLCByMiwgICMzCisgICAgICAgIHZtb3YgICAgICAgICAgICBkMzEsIGQzMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsICByMSwgIHIyLCAgbHNsICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgICMtOAorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIHIwCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI3W119LCAgW3IzLDoxNl0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIzLCAgcjMsICAjNgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XSwgcjEyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTF9LCAgICAgW3I0LDoxMjhdLCByMTIKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMn0sICAgICBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EzfSwgICAgIFtyNCw6MTI4XSwgcjEyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI4fSwgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI5fSwgICAgW3IzLDo2NF0sIGxyCisgICAgICAgIHZzd3AgICAgICAgICAgICBkMSwgIGQyCisgICAgICAgIHZzd3AgICAgICAgICAgICBkNSwgIGQ2CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkMCwgIGQxCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkNCwgIGQ1CisgICAgICAgIHZkdXAuMTYgICAgICAgICBkMjUsIGQyOFsxXQorICAgICAgICB2bXVsLnMxNiAgICAgICAgZDI3LCBkMjcsIGQzMQorICAgICAgICB0cmFuc2Zvcm0wMSAgICAgcTAsICBxMiwgIGQ1LCAgZDI1LCBkMjcsIGQyMCwgcTgsICBxOQorICAgICAgICBiICAgICAgICAgICAgICAgMmYKKzE6CisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIHIwCisgICAgICAgIHZkdXAuMTYgICAgICAgICBkMjYsIGQyOVswXQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XSwgcjEyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTF9LCAgICAgW3I0LDoxMjhdLCByMTIKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMn0sICAgICBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EzfSwgICAgIFtyNCw6MTI4XSwgcjEyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI4fSwgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI5fSwgICAgW3IzLDo2NF0sIGxyCisgICAgICAgIHZzd3AgICAgICAgICAgICBkMSwgIGQyCisgICAgICAgIHZzd3AgICAgICAgICAgICBkNSwgIGQ2CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkMCwgIGQxCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkNCwgIGQ1CisgICAgICAgIHZkdXAuMTYgICAgICAgICBkMjQsIGQyOFswXQorICAgICAgICB2ZHVwLjE2ICAgICAgICAgZDI1LCBkMjhbMV0KKyAgICAgICAgdmR1cC4xNiAgICAgICAgIGQyNywgZDI5WzNdCisgICAgICAgIHZtdWwuczE2ICAgICAgICBxMTMsIHExMywgcTE1CisgICAgICAgIHRyYW5zZm9ybTIgICAgICBkMCwgIGQ0LCAgZDEsICBkNSwgIHEwLCAgcTIsICBkMjQsIGQyNiwgZDI1LCBkMjcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGQxNiwgZDE3LCBxOSwgIHExMAorMjoKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQyLCAgZDMKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQ2LCAgZDcKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIGQyNCwgZDI4WzJdCisgICAgICAgIHZkdXAuMTYgICAgICAgICBkMjYsIGQyOVsyXQorICAgICAgICB2ZHVwLjE2ICAgICAgICAgZDI1LCBkMjhbM10KKyAgICAgICAgdmR1cC4xNiAgICAgICAgIGQyNywgZDI5WzFdCisgICAgICAgIHZtdWwuczE2ICAgICAgICBxMTMsIHExMywgcTE1CisgICAgICAgIHRyYW5zZm9ybTIgICAgICBkMiwgIGQ2LCAgZDMsICBkNywgIHExLCAgcTMsICBkMjQsIGQyNiwgZDI1LCBkMjcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGQxNiwgZDE3LCBxOSwgIHExMAorICAgICAgICB2dHJuLjMyICAgICAgICAgZDAsICBkMQorICAgICAgICB2dHJuLjMyICAgICAgICAgZDIsICBkMworICAgICAgICB2dHJuLjMyICAgICAgICAgZDQsICBkNQorICAgICAgICB2dHJuLjMyICAgICAgICAgZDYsICBkNworICAgICAgICB2c3dwICAgICAgICAgICAgZDEsICBkMgorICAgICAgICB2c3dwICAgICAgICAgICAgZDUsICBkNgorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICByMAorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTF9LCAgICAgW3I0LDoxMjhdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMn0sICAgICBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EzfSwgICAgIFtyNCw6MTI4XSwgcjEyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzE2CisgICAgICAgIHN1YnMgICAgICAgICAgICByMiwgIHIyLCAgIzIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQscGN9CitlbmRmdW5jCisKKyNkZWZpbmUgRl9TUVJUMV8yICAgMjMxNzAKKyNkZWZpbmUgRl9DT1NfMTZfMSAgMzAyNzQKKyNkZWZpbmUgRl9DT1NfMTZfMyAgMTI1NDAKKworY29uc3QgICBjb2VmcywgYWxpZ249NAorICAgICAgICAuc2hvcnQgICAgICAgICAgRl9TUVJUMV8yLCAtRl9TUVJUMV8yLCAtRl9TUVJUMV8yLCAgRl9TUVJUMV8yCisgICAgICAgIC5zaG9ydCAgICAgICAgICBGX0NPU18xNl8xLC1GX0NPU18xNl8xLC1GX0NPU18xNl8xLCBGX0NPU18xNl8xCisgICAgICAgIC5zaG9ydCAgICAgICAgICBGX0NPU18xNl8zLC1GX0NPU18xNl8zLC1GX0NPU18xNl8zLCBGX0NPU18xNl8zCisgICAgICAgIC5zaG9ydCAgICAgICAgICAxLCAgICAgICAgIC0xLCAgICAgICAgIC0xLCAgICAgICAgICAxCitlbmRjb25zdAorCisubWFjcm8gIGRlZl9mZnQgbiwgbjIsIG40CitmdW5jdGlvbiBmZnRcblwoKV9uZW9uCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsIGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICByMAorICAgICAgICBibCAgICAgICAgICAgICAgZmZ0XG4yXCgpX25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjQsICAjXG40KjIqNAorICAgICAgICBibCAgICAgICAgICAgICAgZmZ0XG40XCgpX25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjQsICAjXG40KjMqNAorICAgICAgICBibCAgICAgICAgICAgICAgZmZ0XG40XCgpX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgcjQKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCwgbHJ9CisgICAgICAgIG1vdnJlbHggICAgICAgICByMSwgIFgoZmZfY29zX1xuXCgpX2ZpeGVkKQorICAgICAgICBtb3YgICAgICAgICAgICAgcjIsICAjXG40LzIKKyAgICAgICAgYiAgICAgICAgICAgICAgIGZmdF9wYXNzX25lb24KK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgZGVmX2ZmdCAgICAzMiwgICAgMTYsICAgICA4CisgICAgICAgIGRlZl9mZnQgICAgNjQsICAgIDMyLCAgICAxNgorICAgICAgICBkZWZfZmZ0ICAgMTI4LCAgICA2NCwgICAgMzIKKyAgICAgICAgZGVmX2ZmdCAgIDI1NiwgICAxMjgsICAgIDY0CisgICAgICAgIGRlZl9mZnQgICA1MTIsICAgMjU2LCAgIDEyOAorICAgICAgICBkZWZfZmZ0ICAxMDI0LCAgIDUxMiwgICAyNTYKKyAgICAgICAgZGVmX2ZmdCAgMjA0OCwgIDEwMjQsICAgNTEyCisgICAgICAgIGRlZl9mZnQgIDQwOTYsICAyMDQ4LCAgMTAyNAorICAgICAgICBkZWZfZmZ0ICA4MTkyLCAgNDA5NiwgIDIwNDgKKyAgICAgICAgZGVmX2ZmdCAxNjM4NCwgIDgxOTIsICA0MDk2CisgICAgICAgIGRlZl9mZnQgMzI3NjgsIDE2Mzg0LCAgODE5MgorICAgICAgICBkZWZfZmZ0IDY1NTM2LCAzMjc2OCwgMTYzODQKKworZnVuY3Rpb24gZmZfZmZ0X2ZpeGVkX2NhbGNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIyLCAgW3IwXQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICMyCisgICAgICAgIG1vdnJlbCAgICAgICAgICByMywgIGZmdF9maXhlZF90YWJfbmVvbgorICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbcjMsIHIyLCBsc2wgIzJdCisgICAgICAgIG1vdiAgICAgICAgICAgICByMCwgIHIxCisgICAgICAgIGJ4ICAgICAgICAgICAgICByMworZW5kZnVuYworCitjb25zdCAgIGZmdF9maXhlZF90YWJfbmVvbgorICAgICAgICAud29yZCBmZnQ0X25lb24KKyAgICAgICAgLndvcmQgZmZ0OF9uZW9uCisgICAgICAgIC53b3JkIGZmdDE2X25lb24KKyAgICAgICAgLndvcmQgZmZ0MzJfbmVvbgorICAgICAgICAud29yZCBmZnQ2NF9uZW9uCisgICAgICAgIC53b3JkIGZmdDEyOF9uZW9uCisgICAgICAgIC53b3JkIGZmdDI1Nl9uZW9uCisgICAgICAgIC53b3JkIGZmdDUxMl9uZW9uCisgICAgICAgIC53b3JkIGZmdDEwMjRfbmVvbgorICAgICAgICAud29yZCBmZnQyMDQ4X25lb24KKyAgICAgICAgLndvcmQgZmZ0NDA5Nl9uZW9uCisgICAgICAgIC53b3JkIGZmdDgxOTJfbmVvbgorICAgICAgICAud29yZCBmZnQxNjM4NF9uZW9uCisgICAgICAgIC53b3JkIGZmdDMyNzY4X25lb24KKyAgICAgICAgLndvcmQgZmZ0NjU1MzZfbmVvbgorZW5kY29uc3QKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9mZnRfaW5pdF9hcm0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9mZnRfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDg3ZjVmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2ZmdF9pbml0X2FybS5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZmZ0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9yZGZ0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9zeW50aF9maWx0ZXIuaCIKKwordm9pZCBmZl9mZnRfY2FsY192ZnAoRkZUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqeik7CisKK3ZvaWQgZmZfZmZ0X3Blcm11dGVfbmVvbihGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KTsKK3ZvaWQgZmZfZmZ0X2NhbGNfbmVvbihGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KTsKKwordm9pZCBmZl9pbWRjdF9oYWxmX3ZmcChGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm91dHB1dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dCk7CisKK3ZvaWQgZmZfaW1kY3RfY2FsY19uZW9uKEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKK3ZvaWQgZmZfaW1kY3RfaGFsZl9uZW9uKEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKK3ZvaWQgZmZfbWRjdF9jYWxjX25lb24oRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpOworCit2b2lkIGZmX3JkZnRfY2FsY19uZW9uKHN0cnVjdCBSREZUQ29udGV4dCAqcywgRkZUU2FtcGxlICp6KTsKKworYXZfY29sZCB2b2lkIGZmX2ZmdF9pbml0X2FybShGRlRDb250ZXh0ICpzKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV92ZnAoY3B1X2ZsYWdzKSAmJiAhaGF2ZV92ZnB2MyhjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPmZmdF9jYWxjICAgICA9IGZmX2ZmdF9jYWxjX3ZmcDsKKyNpZiBDT05GSUdfTURDVAorICAgICAgICBzLT5pbWRjdF9oYWxmICAgPSBmZl9pbWRjdF9oYWxmX3ZmcDsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworI2lmIENPTkZJR19GRlQKKyAgICAgICAgcy0+ZmZ0X3Blcm11dGUgID0gZmZfZmZ0X3Blcm11dGVfbmVvbjsKKyAgICAgICAgcy0+ZmZ0X2NhbGMgICAgID0gZmZfZmZ0X2NhbGNfbmVvbjsKKyNlbmRpZgorI2lmIENPTkZJR19NRENUCisgICAgICAgIHMtPmltZGN0X2NhbGMgICA9IGZmX2ltZGN0X2NhbGNfbmVvbjsKKyAgICAgICAgcy0+aW1kY3RfaGFsZiAgID0gZmZfaW1kY3RfaGFsZl9uZW9uOworICAgICAgICBzLT5tZGN0X2NhbGMgICAgPSBmZl9tZGN0X2NhbGNfbmVvbjsKKyAgICAgICAgcy0+bWRjdF9wZXJtdXRhdGlvbiA9IEZGX01EQ1RfUEVSTV9JTlRFUkxFQVZFOworI2VuZGlmCisgICAgfQorfQorCisjaWYgQ09ORklHX1JERlQKK2F2X2NvbGQgdm9pZCBmZl9yZGZ0X2luaXRfYXJtKFJERlRDb250ZXh0ICpzKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpCisgICAgICAgIHMtPnJkZnRfY2FsYyAgICA9IGZmX3JkZnRfY2FsY19uZW9uOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZmZ0X25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9mZnRfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOWFlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZmZ0X25lb24uUwpAQCAtMCwwICsxLDM3NSBAQAorLyoKKyAqIEFSTSBORU9OIG9wdGltaXNlZCBGRlQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTmFvdG9zaGkgTm9qaXJpCisgKgorICogVGhpcyBhbGdvcml0aG0gKHRob3VnaCBub3QgYW55IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzKSBpcworICogYmFzZWQgb24gbGliZGpiZmZ0IGJ5IEQuIEouIEJlcm5zdGVpbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKKyNkZWZpbmUgTV9TUVJUMV8yIDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAKKworCitmdW5jdGlvbiBmZnQ0X25lb24KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMC1kM30sIFtyMCw6MTI4XQorCisgICAgICAgIHZleHQuMzIgICAgICAgICBxOCwgIHExLCAgcTEsICAjMSAgICAgICBAIGkyLHIzIGQzPWkzLHIyCisgICAgICAgIHZzdWIuZjMyICAgICAgICBkNiwgIGQwLCAgZDEgICAgICAgICAgICBAIHIwLXIxLGkwLWkxCisgICAgICAgIHZzdWIuZjMyICAgICAgICBkNywgIGQxNiwgZDE3ICAgICAgICAgICBAIHIzLXIyLGkyLWkzCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkNCwgIGQwLCAgZDEgICAgICAgICAgICBAIHIwK3IxLGkwK2kxCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkNSwgIGQyLCAgZDMgICAgICAgICAgICBAIGkyK2kzLHIyK3IzCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMSwgIGQ2LCAgZDcKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQzLCAgZDYsICBkNworICAgICAgICB2YWRkLmYzMiAgICAgICAgZDAsICBkNCwgIGQ1CisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMiwgIGQ0LCAgZDUKKworICAgICAgICB2c3QxLjMyICAgICAgICAge2QwLWQzfSwgW3IwLDoxMjhdCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmdDhfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByMAorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwLWQzfSwgICBbcjEsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE2LWQxOX0sIFtyMSw6MTI4XQorCisgICAgICAgIG1vdncgICAgICAgICAgICByMiwgICMweDA0ZjMgICAgICAgICAgICBAIHNxcnQoMS8yKQorICAgICAgICBtb3Z0ICAgICAgICAgICAgcjIsICAjMHgzZjM1CisgICAgICAgIGVvciAgICAgICAgICAgICByMywgIHIyLCAgIzE8PDMxCisgICAgICAgIHZkdXAuMzIgICAgICAgICBkMzEsIHIyCisKKyAgICAgICAgdmV4dC4zMiAgICAgICAgIHExMSwgcTEsICBxMSwgICMxICAgICAgIEAgaTIscjMsaTMscjIKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQ0LCAgZDE2LCBkMTcgICAgICAgICAgIEAgcjQrcjUsaTQraTUKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQyOCwgcjMsICByMgorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDUsICBkMTgsIGQxOSAgICAgICAgICAgQCByNityNyxpNitpNworICAgICAgICB2c3ViLmYzMiAgICAgICAgZDE3LCBkMTYsIGQxNyAgICAgICAgICAgQCByNC1yNSxpNC1pNQorICAgICAgICB2c3ViLmYzMiAgICAgICAgZDE5LCBkMTgsIGQxOSAgICAgICAgICAgQCByNi1yNyxpNi1pNworICAgICAgICB2cmV2NjQuMzIgICAgICAgZDI5LCBkMjgKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQyMCwgZDAsICBkMSAgICAgICAgICAgIEAgcjArcjEsaTAraTEKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQyMSwgZDIsICBkMyAgICAgICAgICAgIEAgcjIrcjMsaTIraTMKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQyNiwgZDE3LCBkMjggICAgICAgICAgIEAgLWEycip3LGEyaSp3CisgICAgICAgIHZleHQuMzIgICAgICAgICBxMywgIHEyLCAgcTIsICAjMQorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDI3LCBkMTksIGQyOSAgICAgICAgICAgQCBhM3IqdywtYTNpKncKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQyMywgZDIyLCBkMjMgICAgICAgICAgIEAgaTItaTMscjMtcjIKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQyMiwgZDAsICBkMSAgICAgICAgICAgIEAgcjAtcjEsaTAtaTEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQyNCwgZDE3LCBkMzEgICAgICAgICAgIEAgYTJyKncsYTJpKncKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQyNSwgZDE5LCBkMzEgICAgICAgICAgIEAgYTNyKncsYTNpKncKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQwLCAgZDIwLCBkMjEKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQyLCAgZDIwLCBkMjEKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQxLCAgZDIyLCBkMjMKKyAgICAgICAgdnJldjY0LjMyICAgICAgIHExMywgcTEzCisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMywgIGQyMiwgZDIzCisgICAgICAgIHZzdWIuZjMyICAgICAgICBkNiwgIGQ2LCAgZDcKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQyNCwgZDI0LCBkMjYgICAgICAgICAgIEAgYTJyK2EyaSxhMmktYTJyICAgdDEsdDIKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQyNSwgZDI1LCBkMjcgICAgICAgICAgIEAgYTNyLWEzaSxhM2krYTNyICAgdDUsdDYKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQ3LCAgZDQsICBkNQorICAgICAgICB2c3ViLmYzMiAgICAgICAgZDE4LCBkMiwgIGQ2CisgICAgICAgIHZleHQuMzIgICAgICAgICBxMTMsIHExMiwgcTEyLCAjMQorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDIsICBkMiwgIGQ2CisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMTYsIGQwLCAgZDcKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQ1LCAgZDI1LCBkMjQKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQ0LCAgZDI2LCBkMjcKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQwLCAgZDAsICBkNworICAgICAgICB2c3ViLmYzMiAgICAgICAgZDE3LCBkMSwgIGQ1CisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMTksIGQzLCAgZDQKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQzLCAgZDMsICBkNAorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDEsICBkMSwgIGQ1CisKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTYtZDE5fSwgW3IxLDoxMjhdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDAtZDN9LCAgIFtyMCw6MTI4XQorCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZnQxNl9uZW9uCisgICAgICAgIG1vdnJlbCAgICAgICAgICByMSwgbXBwbQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxNi1kMTl9LCBbcjAsOjEyOF0hICAgQCBxOHtyMCxpMCxyMSxpMX0gcTl7cjIsaTIscjMsaTN9CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjAsICMzMl0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMi1kM30sIFtyMSw6MTI4XQorICAgICAgICB2ZXh0LjMyICAgICAgICAgcTEzLCBxOSwgIHE5LCAgIzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjItZDI1fSwgW3IwLDoxMjhdISAgIEAgcTExe3I0LGk0LHI1LGk1fSBxMTJ7cjYsaTUscjcsaTd9CisgICAgICAgIHZhZGQuZjMyICAgICAgICBkNCwgIGQxNiwgZDE3CisgICAgICAgIHZzdWIuZjMyICAgICAgICBkNSwgIGQxNiwgZDE3CisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMTgsIGQxOCwgZDE5CisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMTksIGQyNiwgZDI3CisKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQyMCwgZDIyLCBkMjMKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQyMiwgZDIyLCBkMjMKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQyMywgZDI0LCBkMjUKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIHE4LCAgcTIsICBxOSAgICAgICAgICAgIEAge3IwLGkwLHIxLGkxfQorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDIxLCBkMjQsIGQyNQorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDI0LCBkMjIsIGQyCisgICAgICAgIHZzdWIuZjMyICAgICAgICBxOSwgIHEyLCAgcTkgICAgICAgICAgICBAIHtyMixpMixyMyxpM30KKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQyNSwgZDIzLCBkMworICAgICAgICB2dXpwLjMyICAgICAgICAgZDE2LCBkMTcgICAgICAgICAgICAgICAgQCB7cjAscjEsaTAsaTF9CisgICAgICAgIHZtdWwuZjMyICAgICAgICBxMSwgIHExMSwgZDJbMV0KKyAgICAgICAgdnV6cC4zMiAgICAgICAgIGQxOCwgZDE5ICAgICAgICAgICAgICAgIEAge3IyLHIzLGkyLGkzfQorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTEyLCBxMTIKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIHExMSwgcTEyLCBxMSAgICAgICAgICAgIEAge3QxYSx0MmEsdDUsdDZ9CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI0LWQyN30sIFtyMCw6MTI4XSEgICBAIHExMntyOCxpOCxyOSxpOX0gcTEze3IxMCxpMTAscjExLGkxMX0KKyAgICAgICAgdnppcC4zMiAgICAgICAgIHExMCwgcTExCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI4LWQzMX0sIFtyMCw6MTI4XSAgICBAIHExNHtyMTIsaTEyLHIxMyxpMTN9IHExNXtyMTQsaTE0LHIxNSxpMTV9CisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMCwgIGQyMiwgZDIwCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMSwgIGQyMSwgZDIzCisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMiwgIGQyMSwgZDIzCisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMywgIGQyMiwgZDIwCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgIzk2CisgICAgICAgIHZleHQuMzIgICAgICAgICBxMTMsIHExMywgcTEzLCAjMQorICAgICAgICB2c3ViLmYzMiAgICAgICAgcTEwLCBxOCwgIHEwICAgICAgICAgICAgQCB7cjQscjUsaTQsaTV9CisgICAgICAgIHZhZGQuZjMyICAgICAgICBxOCwgIHE4LCAgcTAgICAgICAgICAgICBAIHtyMCxyMSxpMCxpMX0KKyAgICAgICAgdmV4dC4zMiAgICAgICAgIHExNSwgcTE1LCBxMTUsICMxCisgICAgICAgIHZzdWIuZjMyICAgICAgICBxMTEsIHE5LCAgcTEgICAgICAgICAgICBAIHtyNixyNyxpNixpN30KKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQyNSwgZDI2ICAgICAgICAgICAgICAgIEAgcTEye3I4LGk4LGkxMCxyMTF9IHExM3tyOSxpOSxpMTEscjEwfQorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTksICBxOSwgIHExICAgICAgICAgICAgQCB7cjIscjMsaTIsaTN9CisgICAgICAgIHZzd3AgICAgICAgICAgICBkMjksIGQzMCAgICAgICAgICAgICAgICBAIHExNHtyMTIsaTEyLGkxNCxyMTV9IHExNXtyMTMsaTEzLGkxNSxyMTR9CisgICAgICAgIHZhZGQuZjMyICAgICAgICBxMCwgIHExMiwgcTEzICAgICAgICAgICBAIHt0MSx0Mix0NSx0Nn0KKyAgICAgICAgdmFkZC5mMzIgICAgICAgIHExLCAgcTE0LCBxMTUgICAgICAgICAgIEAge3QxYSx0MmEsdDVhLHQ2YX0KKyAgICAgICAgbW92cmVseCAgICAgICAgIHIyLCAgWChmZl9jb3NfMTYpCisgICAgICAgIHZzdWIuZjMyICAgICAgICBxMTMsIHExMiwgcTEzICAgICAgICAgICBAIHt0Myx0NCx0Nyx0OH0KKyAgICAgICAgdnJldjY0LjMyICAgICAgIGQxLCAgZDEKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIHExNSwgcTE0LCBxMTUgICAgICAgICAgIEAge3QzYSx0NGEsdDdhLHQ4YX0KKyAgICAgICAgdnJldjY0LjMyICAgICAgIGQzLCAgZDMKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIzLCAgcG1tcAorICAgICAgICB2c3dwICAgICAgICAgICAgZDEsICBkMjYgICAgICAgICAgICAgICAgQCBxMHt0MSx0Mix0Myx0NH0gcTEze3Q2LHQ1LHQ3LHQ4fQorICAgICAgICB2c3dwICAgICAgICAgICAgZDMsICBkMzAgICAgICAgICAgICAgICAgQCBxMXt0MWEsdDJhLHQzYSx0NGF9IHExNXt0NmEsdDVhLHQ3YSx0OGF9CisgICAgICAgIHZhZGQuZjMyICAgICAgICBxMTIsIHEwLCAgcTEzICAgICAgICAgICBAIHtyOCxpOCxyOSxpOX0KKyAgICAgICAgdmFkZC5mMzIgICAgICAgIHExNCwgcTEsICBxMTUgICAgICAgICAgIEAge3IxMixpMTIscjEzLGkxM30KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNC1kNX0sICBbcjIsOjY0XQorICAgICAgICB2c3ViLmYzMiAgICAgICAgcTEzLCBxMCwgIHExMyAgICAgICAgICAgQCB7cjEwLGkxMCxyMTEsaTExfQorICAgICAgICB2c3ViLmYzMiAgICAgICAgcTE1LCBxMSwgIHExNSAgICAgICAgICAgQCB7cjE0LGkxNCxyMTUsaTE1fQorICAgICAgICB2c3dwICAgICAgICAgICAgZDI1LCBkMjggICAgICAgICAgICAgICAgQCBxMTJ7cjgsaTgscjEyLGkxMn0gcTE0e3I5LGk5LHIxMyxpMTN9CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDYtZDd9LCAgW3IzLDoxMjhdCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxMSwgIHExNAorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTE0LCBxMTQsIGQ0WzFdCisgICAgICAgIHZtdWwuZjMyICAgICAgICBxMSwgIHExLCAgcTMKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIHExNCwgcTEsICBkNVsxXSAgICAgICAgIEAge3QxYSx0MmEsdDVhLHQ2YX0KKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQyNywgZDMwICAgICAgICAgICAgICAgIEAgcTEze3IxMCxpMTAscjE0LGkxNH0gcTE1e3IxMSxpMTEscjE1LGkxNX0KKyAgICAgICAgdnppcC4zMiAgICAgICAgIHExMiwgcTE0CisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMCwgIGQyOCwgZDI0CisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMSwgIGQyNSwgZDI5CisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMiwgIGQyNSwgZDI5CisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMywgIGQyOCwgZDI0CisgICAgICAgIHZzdWIuZjMyICAgICAgICBxMTIsIHE4LCAgcTAgICAgICAgICAgICBAIHtyOCxyOSxpOCxpOX0KKyAgICAgICAgdmFkZC5mMzIgICAgICAgIHE4LCAgcTgsICBxMCAgICAgICAgICAgIEAge3IwLHIxLGkwLGkxfQorICAgICAgICB2c3ViLmYzMiAgICAgICAgcTE0LCBxMTAsIHExICAgICAgICAgICAgQCB7cjEyLHIxMyxpMTIsaTEzfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICAjMzIKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIHExMCwgcTEwLCBxMSAgICAgICAgICAgIEAge3I0LHI1LGk0LGk1fQorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTAsICBxMTMKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHExMywgcTEzLCBkNVswXQorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTEsICBxMTUKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHExNSwgcTE1LCBkNVsxXQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QxNi1kMTd9LFtyMCw6MTI4XSwgcjEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHEwLCAgcTAsICBxMworICAgICAgICB2c3QyLjMyICAgICAgICAge2QyMC1kMjF9LFtyMCw6MTI4XSwgcjEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHExLCAgcTEsICBxMworICAgICAgICB2bWxhLmYzMiAgICAgICAgcTEzLCBxMCwgIGQ1WzBdICAgICAgICAgQCB7dDEsdDIsdDUsdDZ9CisgICAgICAgIHZtbGEuZjMyICAgICAgICBxMTUsIHExLCAgZDRbMV0gICAgICAgICBAIHt0MWEsdDJhLHQ1YSx0NmF9CisgICAgICAgIHZzdDIuMzIgICAgICAgICB7ZDI0LWQyNX0sW3IwLDoxMjhdLCByMQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QyOC1kMjl9LFtyMCw6MTI4XQorICAgICAgICB2emlwLjMyICAgICAgICAgcTEzLCBxMTUKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCByMCwgIzgwCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMCwgIGQzMCwgZDI2CisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMSwgIGQyNywgZDMxCisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMiwgIGQyNywgZDMxCisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMywgIGQzMCwgZDI2CisgICAgICAgIHZzdWIuZjMyICAgICAgICBxMTMsIHE5LCAgcTAgICAgICAgICAgICBAIHtyMTAscjExLGkxMCxpMTF9CisgICAgICAgIHZhZGQuZjMyICAgICAgICBxOSwgIHE5LCAgcTAgICAgICAgICAgICBAIHtyMixyMyxpMixpM30KKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIHExNSwgcTExLCBxMSAgICAgICAgICAgIEAge3IxNCxyMTUsaTE0LGkxNX0KKyAgICAgICAgdmFkZC5mMzIgICAgICAgIHExMSwgcTExLCBxMSAgICAgICAgICAgIEAge3I2LHI3LGk2LGk3fQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QxOC1kMTl9LFtyMCw6MTI4XSwgcjEKKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkMjItZDIzfSxbcjAsOjEyOF0sIHIxCisgICAgICAgIHZzdDIuMzIgICAgICAgICB7ZDI2LWQyN30sW3IwLDoxMjhdLCByMQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QzMC1kMzF9LFtyMCw6MTI4XQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZ0X3Bhc3NfbmVvbgorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI2LGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjYsICByMiAgICAgICAgICAgICAgICAgQCBuCisgICAgICAgIGxzbCAgICAgICAgICAgICByNSwgIHIyLCAgIzMgICAgICAgICAgICBAIDIgKiBuICogc2l6ZW9mIEZGVFNhbXBsZQorICAgICAgICBsc2wgICAgICAgICAgICAgcjQsICByMiwgICM0ICAgICAgICAgICAgQCAyICogbiAqIHNpemVvZiBGRlRDb21wbGV4CisgICAgICAgIGxzbCAgICAgICAgICAgICByMiwgIHIyLCAgIzUgICAgICAgICAgICBAIDQgKiBuICogc2l6ZW9mIEZGVENvbXBsZXgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjIsICByNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICByNCwgIHIwICAgICAgICAgICAgQCAmeltvMV0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICByMCAgICAgICAgICAgIEAgJnpbbzJdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIzLCAgcjAgICAgICAgICAgICBAICZ6W28zXQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyMC1kMjF9LFtyMiw6MTI4XSAgICAgQCB7eltvMl0seltvMisxXX0KKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxMiwgcG1tcAorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyMi1kMjN9LFtyMyw6MTI4XSAgICAgQCB7eltvM10seltvMysxXX0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCAgcjUsICByMSAgICAgICAgICAgIEAgd2ltCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDYtZDd9LCAgW3IxMiw6MTI4XSAgICBAIHBtbXAKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQyMSwgZDIyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDR9LCAgICAgW3IxLDo2NF0hICAgICBAIHt3cmVbMF0sd3JlWzFdfQorICAgICAgICBzdWIgICAgICAgICAgICAgcjUsICByNSwgICM0ICAgICAgICAgICAgQCB3aW0tLQorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTEsICBxMTEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHExMSwgcTExLCBkNFsxXQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTEsICBxMSwgIHEzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDVbMF19LCAgW3I1LDozMl0gICAgICBAIGQ1WzBdID0gd2ltWy0xXQorICAgICAgICB2bWxhLmYzMiAgICAgICAgcTExLCBxMSwgIGQ1WzBdICAgICAgICAgQCB7dDFhLHQyYSx0NWEsdDZhfQorICAgICAgICB2bGQyLjMyICAgICAgICAge2QxNi1kMTd9LFtyMCw6MTI4XSAgICAgQCB7elswXSx6WzFdfQorICAgICAgICBzdWIgICAgICAgICAgICAgcjYsIHI2LCAjMSAgICAgICAgICAgICAgQCBuLS0KKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtkMTgtZDE5fSxbcjQsOjEyOF0gICAgIEAge3pbbzFdLHpbbzErMV19CisgICAgICAgIHZ6aXAuMzIgICAgICAgICBxMTAsIHExMQorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDAsICBkMjIsIGQyMAorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDEsICBkMjEsIGQyMworICAgICAgICB2c3ViLmYzMiAgICAgICAgZDIsICBkMjEsIGQyMworICAgICAgICB2c3ViLmYzMiAgICAgICAgZDMsICBkMjIsIGQyMAorICAgICAgICB2c3ViLmYzMiAgICAgICAgcTEwLCBxOCwgIHEwCisgICAgICAgIHZhZGQuZjMyICAgICAgICBxOCwgIHE4LCAgcTAKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIHExMSwgcTksICBxMQorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTksICBxOSwgIHExCisgICAgICAgIHZzdDIuMzIgICAgICAgICB7ZDIwLWQyMX0sW3IyLDoxMjhdISAgICBAIHt6W28yXSx6W28yKzFdfQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QxNi1kMTd9LFtyMCw6MTI4XSEgICAgQCB7elswXSx6WzFdfQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QyMi1kMjN9LFtyMyw6MTI4XSEgICAgQCB7eltvM10seltvMysxXX0KKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkMTgtZDE5fSxbcjQsOjEyOF0hICAgIEAge3pbbzFdLHpbbzErMV19CisgICAgICAgIHN1YiAgICAgICAgICAgICByNSwgIHI1LCAgIzggICAgICAgICAgICBAIHdpbSAtPSAyCisxOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyMC1kMjF9LFtyMiw6MTI4XSAgICAgQCB7eltvMl0seltvMisxXX0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjItZDIzfSxbcjMsOjEyOF0gICAgIEAge3pbbzNdLHpbbzMrMV19CisgICAgICAgIHZzd3AgICAgICAgICAgICBkMjEsIGQyMgorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0fSwgW3IxXSEgICAgICAgICAgICAgQCB7d3JlWzBdLHdyZVsxXX0KKyAgICAgICAgdnJldjY0LjMyICAgICAgIHEwLCAgcTEwCisgICAgICAgIHZtdWwuZjMyICAgICAgICBxMTAsIHExMCwgZDRbMF0KKyAgICAgICAgdnJldjY0LjMyICAgICAgIHExLCAgcTExCisgICAgICAgIHZtdWwuZjMyICAgICAgICBxMTEsIHExMSwgZDRbMV0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNX0sIFtyNV0gICAgICAgICAgICAgIEAge3dpbVstMV0sd2ltWzBdfQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTAsICBxMCwgIHEzCisgICAgICAgIHN1YiAgICAgICAgICAgICByNSwgIHI1LCAgIzggICAgICAgICAgICBAIHdpbSAtPSAyCisgICAgICAgIHZtdWwuZjMyICAgICAgICBxMSwgIHExLCAgcTMKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIHExMCwgcTAsICBkNVsxXSAgICAgICAgIEAge3QxLHQyLHQ1LHQ2fQorICAgICAgICB2bWxhLmYzMiAgICAgICAgcTExLCBxMSwgIGQ1WzBdICAgICAgICAgQCB7dDFhLHQyYSx0NWEsdDZhfQorICAgICAgICB2bGQyLjMyICAgICAgICAge2QxNi1kMTd9LFtyMCw6MTI4XSAgICAgQCB7elswXSx6WzFdfQorICAgICAgICBzdWJzICAgICAgICAgICAgcjYsICByNiwgICMxICAgICAgICAgICAgQCBuLS0KKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtkMTgtZDE5fSxbcjQsOjEyOF0gICAgIEAge3pbbzFdLHpbbzErMV19CisgICAgICAgIHZ6aXAuMzIgICAgICAgICBxMTAsIHExMQorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDAsICBkMjIsIGQyMAorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDEsICBkMjEsIGQyMworICAgICAgICB2c3ViLmYzMiAgICAgICAgZDIsICBkMjEsIGQyMworICAgICAgICB2c3ViLmYzMiAgICAgICAgZDMsICBkMjIsIGQyMAorICAgICAgICB2c3ViLmYzMiAgICAgICAgcTEwLCBxOCwgIHEwCisgICAgICAgIHZhZGQuZjMyICAgICAgICBxOCwgIHE4LCAgcTAKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIHExMSwgcTksICBxMQorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTksICBxOSwgIHExCisgICAgICAgIHZzdDIuMzIgICAgICAgICB7ZDIwLWQyMX0sIFtyMiw6MTI4XSEgICBAIHt6W28yXSx6W28yKzFdfQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QxNi1kMTd9LCBbcjAsOjEyOF0hICAgQCB7elswXSx6WzFdfQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QyMi1kMjN9LCBbcjMsOjEyOF0hICAgQCB7eltvM10seltvMysxXX0KKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkMTgtZDE5fSwgW3I0LDoxMjhdISAgIEAge3pbbzFdLHpbbzErMV19CisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjYscGN9CitlbmRmdW5jCisKKy5tYWNybyAgZGVmX2ZmdCBuLCBuMiwgbjQKKyAgICAgICAgLmFsaWduIDYKK2Z1bmN0aW9uIGZmdFxuXCgpX25lb24KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCwgbHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIHIwCisgICAgICAgIGJsICAgICAgICAgICAgICBmZnRcbjJcKClfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICNcbjQqMio4CisgICAgICAgIGJsICAgICAgICAgICAgICBmZnRcbjRcKClfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICNcbjQqMyo4CisgICAgICAgIGJsICAgICAgICAgICAgICBmZnRcbjRcKClfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgcjAsICByNAorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LCBscn0KKyAgICAgICAgbW92cmVseCAgICAgICAgIHIxLCAgWChmZl9jb3NfXG4pCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgICNcbjQvMgorICAgICAgICBiICAgICAgICAgICAgICAgZmZ0X3Bhc3NfbmVvbgorZW5kZnVuYworLmVuZG0KKworICAgICAgICBkZWZfZmZ0ICAgIDMyLCAgICAxNiwgICAgIDgKKyAgICAgICAgZGVmX2ZmdCAgICA2NCwgICAgMzIsICAgIDE2CisgICAgICAgIGRlZl9mZnQgICAxMjgsICAgIDY0LCAgICAzMgorICAgICAgICBkZWZfZmZ0ICAgMjU2LCAgIDEyOCwgICAgNjQKKyAgICAgICAgZGVmX2ZmdCAgIDUxMiwgICAyNTYsICAgMTI4CisgICAgICAgIGRlZl9mZnQgIDEwMjQsICAgNTEyLCAgIDI1NgorICAgICAgICBkZWZfZmZ0ICAyMDQ4LCAgMTAyNCwgICA1MTIKKyAgICAgICAgZGVmX2ZmdCAgNDA5NiwgIDIwNDgsICAxMDI0CisgICAgICAgIGRlZl9mZnQgIDgxOTIsICA0MDk2LCAgMjA0OAorICAgICAgICBkZWZfZmZ0IDE2Mzg0LCAgODE5MiwgIDQwOTYKKyAgICAgICAgZGVmX2ZmdCAzMjc2OCwgMTYzODQsICA4MTkyCisgICAgICAgIGRlZl9mZnQgNjU1MzYsIDMyNzY4LCAxNjM4NAorCitmdW5jdGlvbiBmZl9mZnRfY2FsY19uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjIsICBbcjBdCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzIKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIzLCAgZmZ0X3RhYl9uZW9uCisgICAgICAgIGxkciAgICAgICAgICAgICByMywgIFtyMywgcjIsIGxzbCAjMl0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgcjEKKyAgICAgICAgYnggICAgICAgICAgICAgIHIzCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2ZmdF9wZXJtdXRlX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsbHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMxCisgICAgICAgIGxkciAgICAgICAgICAgICByMiwgIFtyMF0gICAgICAgQCBuYml0cworICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbcjAsICMxMl0gIEAgdG1wX2J1ZgorICAgICAgICBsZHIgICAgICAgICAgICAgcjAsICBbcjAsICM4XSAgIEAgcmV2dGFiCisgICAgICAgIGxzbCAgICAgICAgICAgICByMTIsIHIxMiwgcjIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIyLCAgcjEyCisxOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwLWQxfSwgW3IxLDoxMjhdIQorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbcjBdLCAjNAorICAgICAgICB1eHRoICAgICAgICAgICAgbHIsICByNAorICAgICAgICB1eHRoICAgICAgICAgICAgcjQsICByNCwgIHJvciAjMTYKKyAgICAgICAgYWRkICAgICAgICAgICAgIGxyLCAgcjMsICBsciwgIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICByMywgIHI0LCAgbHNsICMzCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDB9LCBbbHIsOjY0XQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxfSwgW3I0LDo2NF0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIyLCAgbHNsICMzCisxOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwLWQzfSwgW3IzLDoxMjhdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwLWQzfSwgW3IxLDoxMjhdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjIsICByMiwgICM0CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQscGN9CitlbmRmdW5jCisKK2NvbnN0ICAgZmZ0X3RhYl9uZW9uCisgICAgICAgIC53b3JkIGZmdDRfbmVvbgorICAgICAgICAud29yZCBmZnQ4X25lb24KKyAgICAgICAgLndvcmQgZmZ0MTZfbmVvbgorICAgICAgICAud29yZCBmZnQzMl9uZW9uCisgICAgICAgIC53b3JkIGZmdDY0X25lb24KKyAgICAgICAgLndvcmQgZmZ0MTI4X25lb24KKyAgICAgICAgLndvcmQgZmZ0MjU2X25lb24KKyAgICAgICAgLndvcmQgZmZ0NTEyX25lb24KKyAgICAgICAgLndvcmQgZmZ0MTAyNF9uZW9uCisgICAgICAgIC53b3JkIGZmdDIwNDhfbmVvbgorICAgICAgICAud29yZCBmZnQ0MDk2X25lb24KKyAgICAgICAgLndvcmQgZmZ0ODE5Ml9uZW9uCisgICAgICAgIC53b3JkIGZmdDE2Mzg0X25lb24KKyAgICAgICAgLndvcmQgZmZ0MzI3NjhfbmVvbgorICAgICAgICAud29yZCBmZnQ2NTUzNl9uZW9uCitlbmRjb25zdAorCitjb25zdCAgIHBtbXAsIGFsaWduPTQKKyAgICAgICAgLmZsb2F0ICAgICAgICAgICsxLjAsIC0xLjAsIC0xLjAsICsxLjAKK2VuZGNvbnN0CisKK2NvbnN0ICAgbXBwbSwgYWxpZ249NAorICAgICAgICAuZmxvYXQgICAgICAgICAgLU1fU1FSVDFfMiwgTV9TUVJUMV8yLCBNX1NRUlQxXzIsIC1NX1NRUlQxXzIKK2VuZGNvbnN0CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZmZ0X3ZmcC5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2ZmdF92ZnAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWJlNDVhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2ZmdF92ZnAuUwpAQCAtMCwwICsxLDUzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBSSVNDIE9TIE9wZW4gTHRkCisgKiBBdXRob3I6IEJlbiBBdmlzb24gPGJhdmlzb25AcmlzY29zb3Blbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitAIFRoZSBmZnR4X2ludGVybmFsX3ZmcCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIG9iZXkgYSBtb2RpZmllZCBBQVBDUzoKK0AgVkZQIGlzIGluIFJ1bkZhc3QgbW9kZSwgdmVjdG9yIGxlbmd0aCA0LCBzdHJpZGUgMSB0aG9yb3VnaG91dCwgYW5kCitAIGFsbCBzaW5nbGUtcHJlY2lzaW9uIFZGUCByZWdpc3RlcnMgbWF5IGJlIGNvcnJ1cHRlZCBvbiBleGl0LiBUaGUgYTIKK0AgcmVnaXN0ZXIgbWF5IG5vdCBiZSBjbG9iYmVyZWQgaW4gdGhlc2UgZnVuY3Rpb25zLCBhcyBpdCBob2xkcyB0aGUKK0Agc3RvcmVkIG9yaWdpbmFsIEZQU0NSLgorCitmdW5jdGlvbiBmZl9mZnRfY2FsY192ZnAsIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgaXAsIFthMSwgIzBdICAgIEAgbmJpdHMKKyAgICAgICAgbW92ICAgICBhMSwgYTIKK0EgICAgICAgbGRyICAgICBwYywgW3BjLCBpcCwgbHNsICMyXQorQSAgICAgICAud29yZCAgIDAKK0EgICAgICAgLndvcmQgICAwCitBICAgICAgIC53b3JkICAgMAorVCAgICAgICBtb3ZyZWwgIGEyLCAoZmZ0X3RhYl92ZnAgLSA4KQorVCAgICAgICBsZHIgICAgIHBjLCBbYTIsIGlwLCBsc2wgIzJdCitUIGVuZGZ1bmMKK1QgY29uc3QgZmZ0X3RhYl92ZnAKKyAgICAgICAgLndvcmQgICBmZnQ0X3ZmcAorICAgICAgICAud29yZCAgIGZmdDhfdmZwCisgICAgICAgIC53b3JkICAgWChmZl9mZnQxNl92ZnApICAgICBAIHRoaXMgb25lIGFsb25lIGlzIGV4cG9ydGVkCisgICAgICAgIC53b3JkICAgZmZ0MzJfdmZwCisgICAgICAgIC53b3JkICAgZmZ0NjRfdmZwCisgICAgICAgIC53b3JkICAgZmZ0MTI4X3ZmcAorICAgICAgICAud29yZCAgIGZmdDI1Nl92ZnAKKyAgICAgICAgLndvcmQgICBmZnQ1MTJfdmZwCisgICAgICAgIC53b3JkICAgZmZ0MTAyNF92ZnAKKyAgICAgICAgLndvcmQgICBmZnQyMDQ4X3ZmcAorICAgICAgICAud29yZCAgIGZmdDQwOTZfdmZwCisgICAgICAgIC53b3JkICAgZmZ0ODE5Ml92ZnAKKyAgICAgICAgLndvcmQgICBmZnQxNjM4NF92ZnAKKyAgICAgICAgLndvcmQgICBmZnQzMjc2OF92ZnAKKyAgICAgICAgLndvcmQgICBmZnQ2NTUzNl92ZnAKK0EgZW5kZnVuYworCitmdW5jdGlvbiBmZnQ0X3ZmcAorICAgICAgICB2bGRyICAgIGQwLCBbYTEsICMwKjIqNF0gICBAIHMwLHMxICAgPSB6WzBdCisgICAgICAgIHZsZHIgICAgZDQsIFthMSwgIzEqMio0XSAgIEAgczgsczkgICA9IHpbMV0KKyAgICAgICAgdmxkciAgICBkMSwgW2ExLCAjMioyKjRdICAgQCBzMixzMyAgID0gelsyXQorICAgICAgICB2bGRyICAgIGQ1LCBbYTEsICMzKjIqNF0gICBAIHMxMCxzMTEgPSB6WzNdCisgICAgICAgIEAgc3RhbGwKKyAgICAgICAgdmFkZC5mICBzMTIsIHMwLCBzOCAgICAgICAgQCBpMAorICAgICAgICB2YWRkLmYgIHMxMywgczEsIHM5ICAgICAgICBAIGkxCisgICAgICAgIHZhZGQuZiAgczE0LCBzMiwgczEwICAgICAgIEAgaTIKKyAgICAgICAgdmFkZC5mICBzMTUsIHMzLCBzMTEgICAgICAgQCBpMworICAgICAgICB2c3ViLmYgIHM4LCBzMCwgczggICAgICAgICBAIGk0CisgICAgICAgIHZzdWIuZiAgczksIHMxLCBzOSAgICAgICAgIEAgaTUKKyAgICAgICAgdnN1Yi5mICBzMTAsIHMyLCBzMTAgICAgICAgQCBpNgorICAgICAgICB2c3ViLmYgIHMxMSwgczMsIHMxMSAgICAgICBAIGk3CisgICAgICAgIEAgc3RhbGwKKyAgICAgICAgQCBzdGFsbAorICAgICAgICB2YWRkLmYgIHMwLCBzMTIsIHMxNCAgICAgICBAIHpbMF0ucmUKKyAgICAgICAgdnN1Yi5mICBzNCwgczEyLCBzMTQgICAgICAgQCB6WzJdLnJlCisgICAgICAgIHZhZGQuZiAgczEsIHMxMywgczE1ICAgICAgIEAgelswXS5pbQorICAgICAgICB2c3ViLmYgIHM1LCBzMTMsIHMxNSAgICAgICBAIHpbMl0uaW0KKyAgICAgICAgdmFkZC5mICBzNywgczksIHMxMCAgICAgICAgQCB6WzNdLmltCisgICAgICAgIHZzdWIuZiAgczMsIHM5LCBzMTAgICAgICAgIEAgelsxXS5pbQorICAgICAgICB2YWRkLmYgIHMyLCBzOCwgczExICAgICAgICBAIHpbMV0ucmUKKyAgICAgICAgdnN1Yi5mICBzNiwgczgsIHMxMSAgICAgICAgQCB6WzNdLnJlCisgICAgICAgIEAgc3RhbGwKKyAgICAgICAgQCBzdGFsbAorICAgICAgICB2c3RyICAgIGQwLCBbYTEsICMwKjIqNF0KKyAgICAgICAgdnN0ciAgICBkMiwgW2ExLCAjMioyKjRdCisgICAgICAgIEAgc3RhbGwKKyAgICAgICAgQCBzdGFsbAorICAgICAgICB2c3RyICAgIGQxLCBbYTEsICMxKjIqNF0KKyAgICAgICAgdnN0ciAgICBkMywgW2ExLCAjMyoyKjRdCisKKyAgICAgICAgYnggICAgICBscgorZW5kZnVuYworCisubWFjcm8gbWFjcm9fZmZ0OF9oZWFkCisgICAgICAgIEAgRkZUNAorICAgICAgICB2bGRyICAgIGQ0LCBbYTEsICMwICogMio0XQorICAgICAgICB2bGRyICAgIGQ2LCBbYTEsICMxICogMio0XQorICAgICAgICB2bGRyICAgIGQ1LCBbYTEsICMyICogMio0XQorICAgICAgICB2bGRyICAgIGQ3LCBbYTEsICMzICogMio0XQorICAgICAgICAgICAgQCBCRgorICAgICAgICAgICAgdmxkciAgICBkMTIsIFthMSwgIzQgKiAyKjRdCisgICAgICAgIHZhZGQuZiAgczE2LCBzOCwgczEyICAgIEAgdmVjdG9yIG9wCisgICAgICAgICAgICB2bGRyICAgIGQxNCwgW2ExLCAjNSAqIDIqNF0KKyAgICAgICAgICAgIHZsZHIgICAgZDEzLCBbYTEsICM2ICogMio0XQorICAgICAgICAgICAgdmxkciAgICBkMTUsIFthMSwgIzcgKiAyKjRdCisgICAgICAgIHZzdWIuZiAgczIwLCBzOCwgczEyICAgIEAgdmVjdG9yIG9wCisgICAgICAgIHZhZGQuZiAgczAsIHMxNiwgczE4CisgICAgICAgIHZzdWIuZiAgczIsIHMxNiwgczE4CisgICAgICAgIHZhZGQuZiAgczEsIHMxNywgczE5CisgICAgICAgIHZzdWIuZiAgczMsIHMxNywgczE5CisgICAgICAgIHZhZGQuZiAgczcsIHMyMSwgczIyCisgICAgICAgIHZzdWIuZiAgczUsIHMyMSwgczIyCisgICAgICAgIHZhZGQuZiAgczQsIHMyMCwgczIzCisgICAgICAgIHZzdWIuZiAgczYsIHMyMCwgczIzCisgICAgICAgICAgICB2c3ViLmYgIHMyMCwgczI0LCBzMjggICBAIHZlY3RvciBvcAorICAgICAgICB2c3RyICAgIGQwLCBbYTEsICMwICogMio0XSAgQCB0cmFuc2ZlciBzMC1zNyB0byBzMjQtczMxIHZpYSBtZW1vcnkKKyAgICAgICAgdnN0ciAgICBkMSwgW2ExLCAjMSAqIDIqNF0KKyAgICAgICAgdmxkciAgICBzMCwgY29zMXBpNAorICAgICAgICAgICAgdmFkZC5mICBzMTYsIHMyNCwgczI4ICAgQCB2ZWN0b3Igb3AKKyAgICAgICAgdnN0ciAgICBkMiwgW2ExLCAjMiAqIDIqNF0KKyAgICAgICAgdnN0ciAgICBkMywgW2ExLCAjMyAqIDIqNF0KKyAgICAgICAgdmxkciAgICBkMTIsIFthMSwgIzAgKiAyKjRdCisgICAgICAgICAgICBAIFRSQU5TRk9STQorICAgICAgICAgICAgdm11bC5mICBzMjAsIHMyMCwgczAgICAgQCB2ZWN0b3IgeCBzY2FsYXIgb3AKKyAgICAgICAgdmxkciAgICBkMTMsIFthMSwgIzEgKiAyKjRdCisgICAgICAgIHZsZHIgICAgZDE0LCBbYTEsICMyICogMio0XQorICAgICAgICB2bGRyICAgIGQxNSwgW2ExLCAjMyAqIDIqNF0KKyAgICAgICAgQCBCVVRURVJGTElFUworICAgICAgICB2YWRkLmYgIHMwLCBzMTgsIHMxNgorICAgICAgICB2YWRkLmYgIHMxLCBzMTcsIHMxOQorICAgICAgICB2c3ViLmYgIHMyLCBzMTcsIHMxOQorICAgICAgICB2c3ViLmYgIHMzLCBzMTgsIHMxNgorICAgICAgICAgICAgdmFkZC5mICBzNCwgczIxLCBzMjAKKyAgICAgICAgICAgIHZzdWIuZiAgczUsIHMyMSwgczIwCisgICAgICAgICAgICB2YWRkLmYgIHM2LCBzMjIsIHMyMworICAgICAgICAgICAgdnN1Yi5mICBzNywgczIyLCBzMjMKKyAgICAgICAgdmFkZC5mICBzOCwgczAsIHMyNCAgICAgICAgIEAgdmVjdG9yIG9wCisgICAgICAgIHZzdHIgICAgZDAsIFthMSwgIzAgKiAyKjRdICBAIHRyYW5zZmVyIHMwLXMzIHRvIHMxMi1zMTUgdmlhIG1lbW9yeQorICAgICAgICB2c3RyICAgIGQxLCBbYTEsICMxICogMio0XQorICAgICAgICB2bGRyICAgIGQ2LCBbYTEsICMwICogMio0XQorICAgICAgICB2bGRyICAgIGQ3LCBbYTEsICMxICogMio0XQorICAgICAgICAgICAgdmFkZC5mICBzMSwgczUsIHM2CisgICAgICAgICAgICB2YWRkLmYgIHMwLCBzNywgczQKKyAgICAgICAgICAgIHZzdWIuZiAgczIsIHM1LCBzNgorICAgICAgICAgICAgdnN1Yi5mICBzMywgczcsIHM0CisgICAgICAgIHZzdWIuZiAgczEyLCBzMjQsIHMxMiAgICAgICBAIHZlY3RvciBvcAorICAgICAgICAgICAgdnN1Yi5mICBzNSwgczI5LCBzMQorICAgICAgICAgICAgdnN1Yi5mICBzNCwgczI4LCBzMAorICAgICAgICAgICAgdnN1Yi5mICBzNiwgczMwLCBzMgorICAgICAgICAgICAgdnN1Yi5mICBzNywgczMxLCBzMworICAgICAgICAgICAgdmFkZC5mICBzMTYsIHMwLCBzMjggICAgQCB2ZWN0b3Igb3AKKyAgICAgICAgdnN0ciAgICBkNiwgW2ExLCAjNCAqIDIqNF0KKyAgICAgICAgdnN0ciAgICBkNywgW2ExLCAjNiAqIDIqNF0KKyAgICAgICAgdnN0ciAgICBkNCwgW2ExLCAjMCAqIDIqNF0KKyAgICAgICAgdnN0ciAgICBkNSwgW2ExLCAjMiAqIDIqNF0KKyAgICAgICAgICAgICB2c3RyICAgIGQyLCBbYTEsICM1ICogMio0XQorICAgICAgICAgICAgIHZzdHIgICAgZDMsIFthMSwgIzcgKiAyKjRdCisuZW5kbQorCisubWFjcm8gbWFjcm9fZmZ0OF90YWlsCisgICAgICAgICAgICAgdnN0ciAgICBkOCwgW2ExLCAjMSAqIDIqNF0KKyAgICAgICAgICAgICB2c3RyICAgIGQ5LCBbYTEsICMzICogMio0XQorLmVuZG0KKworZnVuY3Rpb24gLkxmZnQ4X2ludGVybmFsX3ZmcAorICAgICAgICBtYWNyb19mZnQ4X2hlYWQKKyAgICAgICAgbWFjcm9fZmZ0OF90YWlsCisgICAgICAgIGJ4ICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZ0OF92ZnAKKyAgICAgICAgbGRyICAgICBhMywgPTB4MDMwMzAwMDAgICAgIEAgUnVuRmFzdCBtb2RlLCB2ZWN0b3IgbGVuZ3RoIDQsIHN0cmlkZSAxCisgICAgICAgIGZtcnggICAgYTIsIEZQU0NSCisgICAgICAgIGZteHIgICAgRlBTQ1IsIGEzCisgICAgICAgIHZwdXNoICAge3MxNi1zMzF9CisgICAgICAgIG1vdiAgICAgaXAsIGxyCisgICAgICAgIGJsICAgICAgLkxmZnQ4X2ludGVybmFsX3ZmcAorICAgICAgICB2cG9wICAgIHtzMTYtczMxfQorICAgICAgICBmbXhyICAgIEZQU0NSLCBhMgorICAgICAgICBieCAgICAgIGlwCitlbmRmdW5jCisKKy5hbGlnbiAzCitjb3MxcGk0OiAgICBAIGNvcygxKnBpLzQpID0gc3FydCgyKQorICAgICAgICAuZmxvYXQgIDAuNzA3MTA2NzY5MDg0OTMwNDE5OTIxODc1Citjb3MxcGk4OiAgICBAIGNvcygxKnBpLzgpID0gc3FydCgyK3NxcnQoMikpLzIKKyAgICAgICAgLmZsb2F0ICAwLjkyMzg3OTUwNDIwMzc5NjM4NjcxODc1Citjb3MzcGk4OiAgICBAIGNvcygyKnBpLzgpID0gc3FydCgyLXNxcnQoMikpLzIKKyAgICAgICAgLmZsb2F0ICAwLjM4MjY4MzQyNjE0MTczODg5MTYwMTU2MjUKKworZnVuY3Rpb24gLkxmZnQxNl9pbnRlcm5hbF92ZnAKKyAgICAgICAgbWFjcm9fZmZ0OF9oZWFkCisgICAgICAgIEAgRkZUNCh6KzgpCisgICAgICAgIHZsZHIgICAgZDEwLCBbYTEsICM4ICogMio0XQorICAgICAgICB2bGRyICAgIGQxMiwgW2ExLCAjOSAqIDIqNF0KKyAgICAgICAgdmxkciAgICBkMTEsIFthMSwgIzEwICogMio0XQorICAgICAgICB2bGRyICAgIGQxMywgW2ExLCAjMTEgKiAyKjRdCisgICAgICAgIG1hY3JvX2ZmdDhfdGFpbAorICAgICAgICB2YWRkLmYgIHMxNiwgczIwLCBzMjQgICBAIHZlY3RvciBvcAorICAgICAgICAgICAgQCBGRlQ0KHorMTIpCisgICAgICAgICAgICB2bGRyICAgIGQ0LCBbYTEsICMxMiAqIDIqNF0KKyAgICAgICAgICAgIHZsZHIgICAgZDYsIFthMSwgIzEzICogMio0XQorICAgICAgICAgICAgdmxkciAgICBkNSwgW2ExLCAjMTQgKiAyKjRdCisgICAgICAgIHZzdWIuZiAgczIwLCBzMjAsIHMyNCAgIEAgdmVjdG9yIG9wCisgICAgICAgICAgICB2bGRyICAgIGQ3LCBbYTEsICMxNSAqIDIqNF0KKyAgICAgICAgdmFkZC5mICBzMCwgczE2LCBzMTgKKyAgICAgICAgdnN1Yi5mICBzNCwgczE2LCBzMTgKKyAgICAgICAgdmFkZC5mICBzMSwgczE3LCBzMTkKKyAgICAgICAgdnN1Yi5mICBzNSwgczE3LCBzMTkKKyAgICAgICAgdmFkZC5mICBzNywgczIxLCBzMjIKKyAgICAgICAgdnN1Yi5mICBzMywgczIxLCBzMjIKKyAgICAgICAgdmFkZC5mICBzMiwgczIwLCBzMjMKKyAgICAgICAgdnN1Yi5mICBzNiwgczIwLCBzMjMKKyAgICAgICAgICAgIHZhZGQuZiAgczE2LCBzOCwgczEyICAgIEAgdmVjdG9yIG9wCisgICAgICAgIHZzdHIgICAgZDAsIFthMSwgIzggKiAyKjRdCisgICAgICAgIHZzdHIgICAgZDIsIFthMSwgIzEwICogMio0XQorICAgICAgICB2c3RyICAgIGQxLCBbYTEsICM5ICogMio0XQorICAgICAgICAgICAgdnN1Yi5mICBzMjAsIHM4LCBzMTIKKyAgICAgICAgdnN0ciAgICBkMywgW2ExLCAjMTEgKiAyKjRdCisgICAgICAgIEAgVFJBTlNGT1JNKHpbMl0sels2XSx6WzEwXSx6WzE0XSxjb3MxcGk0LGNvczFwaTQpCisgICAgICAgIHZsZHIgICAgZDEyLCBbYTEsICMxMCAqIDIqNF0KKyAgICAgICAgICAgIHZhZGQuZiAgczAsIHMxNiwgczE4CisgICAgICAgICAgICB2YWRkLmYgIHMxLCBzMTcsIHMxOQorICAgICAgICAgICAgdnN1Yi5mICBzNiwgczE2LCBzMTgKKyAgICAgICAgICAgIHZzdWIuZiAgczcsIHMxNywgczE5CisgICAgICAgICAgICB2c3ViLmYgIHMzLCBzMjEsIHMyMgorICAgICAgICAgICAgdmFkZC5mICBzMiwgczIwLCBzMjMKKyAgICAgICAgICAgIHZhZGQuZiAgczUsIHMyMSwgczIyCisgICAgICAgICAgICB2c3ViLmYgIHM0LCBzMjAsIHMyMworICAgICAgICAgICAgdnN0ciAgICBkMCwgW2ExLCAjMTIgKiAyKjRdCisgICAgICAgIHZtb3YgICAgczAsIHM2CisgICAgICAgICAgQCBUUkFOU0ZPUk0oelsxXSx6WzVdLHpbOV0selsxM10sY29zMXBpOCxjb3MzcGk4KQorICAgICAgICAgIHZsZHIgICAgZDYsIFthMSwgIzkgKiAyKjRdCisgICAgICAgICAgICB2c3RyICAgIGQxLCBbYTEsICMxMyAqIDIqNF0KKyAgICAgICAgdmxkciAgICBkMSwgY29zMXBpNCBAIHMyID0gY29zMXBpNCwgczMgPSBjb3MxcGk4CisgICAgICAgICAgICB2c3RyICAgIGQyLCBbYTEsICMxNSAqIDIqNF0KKyAgICAgICAgICB2bGRyICAgIGQ3LCBbYTEsICMxMyAqIDIqNF0KKyAgICAgICAgdmFkZC5mICBzNCwgczI1LCBzMjQKKyAgICAgICAgdnN1Yi5mICBzNSwgczI1LCBzMjQKKyAgICAgICAgdnN1Yi5mICBzNiwgczAsIHM3CisgICAgICAgIHZhZGQuZiAgczcsIHMwLCBzNworICAgICAgICAgIHZtdWwuZiAgczIwLCBzMTIsIHMzICBAIHZlY3RvciBvcAorICAgICAgICAgICAgQCBUUkFOU0ZPUk0oelszXSx6WzddLHpbMTFdLHpbMTVdLGNvczNwaTgsY29zMXBpOCkKKyAgICAgICAgICAgIHZsZHIgICAgZDQsIFthMSwgIzExICogMio0XQorICAgICAgICAgICAgdmxkciAgICBkNSwgW2ExLCAjMTUgKiAyKjRdCisgICAgICAgICAgICB2bGRyICAgIHMxLCBjb3MzcGk4CisgICAgICAgIHZtdWwuZiAgczI0LCBzNCwgczIgICAgIEAgdmVjdG9yICogc2NhbGFyIG9wCisgICAgICAgICAgdm11bC5mICBzMjgsIHMxMiwgczEgIEAgdmVjdG9yICogc2NhbGFyIG9wCisgICAgICAgICAgICB2bXVsLmYgIHMxMiwgczgsIHMxIEAgdmVjdG9yICogc2NhbGFyIG9wCisgICAgICAgICAgdmFkZC5mICBzNCwgczIwLCBzMjkKKyAgICAgICAgICB2c3ViLmYgIHM1LCBzMjEsIHMyOAorICAgICAgICAgIHZzdWIuZiAgczYsIHMyMiwgczMxCisgICAgICAgICAgdmFkZC5mICBzNywgczIzLCBzMzAKKyAgICAgICAgICAgIHZtdWwuZiAgczgsIHM4LCBzMyAgQCB2ZWN0b3IgKiBzY2FsYXIgb3AKKyAgICAgICAgICB2bGRyICAgIGQ4LCBbYTEsICMxICogMio0XQorICAgICAgICAgIHZsZHIgICAgZDksIFthMSwgIzUgKiAyKjRdCisgICAgICAgICAgICB2bGRyICAgIGQxMCwgW2ExLCAjMyAqIDIqNF0KKyAgICAgICAgICAgIHZsZHIgICAgZDExLCBbYTEsICM3ICogMio0XQorICAgICAgICB2bGRyICAgIGQxNCwgW2ExLCAjMiAqIDIqNF0KKyAgICAgICAgICB2YWRkLmYgIHMwLCBzNiwgczQKKyAgICAgICAgICB2YWRkLmYgIHMxLCBzNSwgczcKKyAgICAgICAgICB2c3ViLmYgIHMyLCBzNSwgczcKKyAgICAgICAgICB2c3ViLmYgIHMzLCBzNiwgczQKKyAgICAgICAgICAgIHZhZGQuZiAgczQsIHMxMiwgczkKKyAgICAgICAgICAgIHZzdWIuZiAgczUsIHMxMywgczgKKyAgICAgICAgICAgIHZzdWIuZiAgczYsIHMxNCwgczExCisgICAgICAgICAgICB2YWRkLmYgIHM3LCBzMTUsIHMxMAorICAgICAgICAgIHZhZGQuZiAgczEyLCBzMCwgczE2ICBAIHZlY3RvciBvcAorICAgICAgICAgIHZzdHIgICAgZDAsIFthMSwgIzEgKiAyKjRdCisgICAgICAgICAgdnN0ciAgICBkMSwgW2ExLCAjNSAqIDIqNF0KKyAgICAgICAgICB2bGRyICAgIGQ0LCBbYTEsICMxICogMio0XQorICAgICAgICAgIHZsZHIgICAgZDUsIFthMSwgIzUgKiAyKjRdCisgICAgICAgICAgICB2YWRkLmYgIHMwLCBzNiwgczQKKyAgICAgICAgICAgIHZhZGQuZiAgczEsIHM1LCBzNworICAgICAgICAgICAgdnN1Yi5mICBzMiwgczUsIHM3CisgICAgICAgICAgICB2c3ViLmYgIHMzLCBzNiwgczQKKyAgICAgICAgICB2c3ViLmYgIHM4LCBzMTYsIHM4ICAgQCB2ZWN0b3Igb3AKKyAgICAgICAgICB2c3RyICAgIGQ2LCBbYTEsICMxICogMio0XQorICAgICAgICAgIHZzdHIgICAgZDcsIFthMSwgIzUgKiAyKjRdCisgICAgICAgIHZsZHIgICAgZDE1LCBbYTEsICM2ICogMio0XQorICAgICAgICAgICAgdnN1Yi5mICBzNCwgczIwLCBzMAorICAgICAgICAgICAgdnN1Yi5mICBzNSwgczIxLCBzMQorICAgICAgICAgICAgdnN1Yi5mICBzNiwgczIyLCBzMgorICAgICAgICAgICAgdnN1Yi5mICBzNywgczIzLCBzMworICAgICAgICAgICAgdmFkZC5mICBzMjAsIHMwLCBzMjAgICAgQCB2ZWN0b3Igb3AKKyAgICAgICAgICB2c3RyICAgIGQ0LCBbYTEsICM5ICogMio0XQorICAgICAgICAgICAgICBAIFRSQU5TRk9STV9aRVJPKHpbMF0sels0XSx6WzhdLHpbMTJdKQorICAgICAgICAgICAgICB2bGRyICAgIGQ2LCBbYTEsICM4ICogMio0XQorICAgICAgICAgIHZzdHIgICAgZDUsIFthMSwgIzEzICogMio0XQorICAgICAgICAgICAgICB2bGRyICAgIGQ3LCBbYTEsICMxMiAqIDIqNF0KKyAgICAgICAgICB2c3RyICAgIGQyLCBbYTEsICMxMSAqIDIqNF0KKyAgICAgICAgICAgICAgdmxkciAgICBkOCwgW2ExLCAjMCAqIDIqNF0KKyAgICAgICAgICB2c3RyICAgIGQzLCBbYTEsICMxNSAqIDIqNF0KKyAgICAgICAgICAgICAgdmxkciAgICBkOSwgW2ExLCAjNCAqIDIqNF0KKyAgICAgICAgdmFkZC5mICBzMCwgczI2LCBzMjQKKyAgICAgICAgdmFkZC5mICBzMSwgczI1LCBzMjcKKyAgICAgICAgdnN1Yi5mICBzMiwgczI1LCBzMjcKKyAgICAgICAgdnN1Yi5mICBzMywgczI2LCBzMjQKKyAgICAgICAgICAgICAgdmFkZC5mICBzNCwgczE0LCBzMTIKKyAgICAgICAgICAgICAgdmFkZC5mICBzNSwgczEzLCBzMTUKKyAgICAgICAgICAgICAgdnN1Yi5mICBzNiwgczEzLCBzMTUKKyAgICAgICAgICAgICAgdnN1Yi5mICBzNywgczE0LCBzMTIKKyAgICAgICAgdmFkZC5mICBzOCwgczAsIHMyOCBAIHZlY3RvciBvcAorICAgICAgICB2c3RyICAgIGQwLCBbYTEsICMzICogMio0XQorICAgICAgICB2c3RyICAgIGQxLCBbYTEsICM3ICogMio0XQorICAgICAgICB2bGRyICAgIGQ2LCBbYTEsICMzICogMio0XQorICAgICAgICB2bGRyICAgIGQ3LCBbYTEsICM3ICogMio0XQorICAgICAgICAgICAgICB2c3ViLmYgIHMwLCBzMTYsIHM0CisgICAgICAgICAgICAgIHZzdWIuZiAgczEsIHMxNywgczUKKyAgICAgICAgICAgICAgdnN1Yi5mICBzMiwgczE4LCBzNgorICAgICAgICAgICAgICB2c3ViLmYgIHMzLCBzMTksIHM3CisgICAgICAgIHZzdWIuZiAgczEyLCBzMjgsIHMxMiAgICAgICBAIHZlY3RvciBvcAorICAgICAgICAgICAgICB2YWRkLmYgIHMxNiwgczQsIHMxNiAgQCB2ZWN0b3Igb3AKKyAgICAgICAgICAgIHZzdHIgICAgZDEwLCBbYTEsICMzICogMio0XQorICAgICAgICAgICAgdnN0ciAgICBkMTEsIFthMSwgIzcgKiAyKjRdCisgICAgICAgIHZzdHIgICAgZDQsIFthMSwgIzIgKiAyKjRdCisgICAgICAgIHZzdHIgICAgZDUsIFthMSwgIzYgKiAyKjRdCisgICAgICAgICAgICAgIHZzdHIgICAgZDAsIFthMSwgIzggKiAyKjRdCisgICAgICAgICAgICAgIHZzdHIgICAgZDEsIFthMSwgIzEyICogMio0XQorICAgICAgICB2c3RyICAgIGQ2LCBbYTEsICMxMCAqIDIqNF0KKyAgICAgICAgdnN0ciAgICBkNywgW2ExLCAjMTQgKiAyKjRdCisgICAgICAgICAgICAgIHZzdHIgICAgZDgsIFthMSwgIzAgKiAyKjRdCisgICAgICAgICAgICAgIHZzdHIgICAgZDksIFthMSwgIzQgKiAyKjRdCisKKyAgICAgICAgYnggICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9mZnQxNl92ZnAsIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgYTMsID0weDAzMDMwMDAwICAgICBAIFJ1bkZhc3QgbW9kZSwgdmVjdG9yIGxlbmd0aCA0LCBzdHJpZGUgMQorICAgICAgICBmbXJ4ICAgIGEyLCBGUFNDUgorICAgICAgICBmbXhyICAgIEZQU0NSLCBhMworICAgICAgICB2cHVzaCAgIHtzMTYtczMxfQorICAgICAgICBtb3YgICAgIGlwLCBscgorICAgICAgICBibCAgICAgIC5MZmZ0MTZfaW50ZXJuYWxfdmZwCisgICAgICAgIHZwb3AgICAge3MxNi1zMzF9CisgICAgICAgIGZteHIgICAgRlBTQ1IsIGEyCisgICAgICAgIGJ4ICAgICAgaXAKK2VuZGZ1bmMKKworLm1hY3JvIHBhc3MgbiwgejAsIHoxLCB6MiwgejMKKyAgICAgICAgYWRkICAgICB2NiwgdjUsICM0KjIqXG4KKyAgICAgICAgQCBUUkFOU0ZPUk1fWkVSTyh6WzBdLHpbbzFdLHpbbzJdLHpbbzNdKQorICAgICAgICAgICAgQCBUUkFOU0ZPUk0oelsxXSx6W28xKzFdLHpbbzIrMV0seltvMysxXSx3cmVbMV0sd2ltWy0xXSkKKyAgICAgICAgICAgICAgICBAIFRSQU5TRk9STSh6WzBdLHpbbzFdLHpbbzJdLHpbbzNdLHdyZVswXSx3aW1bMF0pCisgICAgICAgICAgICAgICAgICAgIEAgVFJBTlNGT1JNKHpbMV0seltvMSsxXSx6W28yKzFdLHpbbzMrMV0sd3JlWzFdLHdpbVstMV0pCisgICAgICAgICAgICB2bGRyICAgIGQ4LCBbXHoyLCAjOCoobzIrMSldICAgICAgICBAIHMxNixzMTcKKyAgICAgICAgICAgIHZsZG1kYiAgdjYhLCB7czJ9CisgICAgICAgICAgICB2bGRyICAgIGQ5LCBbXHozLCAjOCoobzMrMSldICAgICAgICBAIHMxOCxzMTkKKyAgICAgICAgICAgIHZsZG1pYSAgdjUhLCB7czAsczF9ICAgICAgICAgICAgICAgIEAgczAgaXMgdW51c2VkCisgICAgICAgIHZsZHIgICAgczcsIFtcejIsICM4Km8yXSAgICAgICAgICAgIEAgdDEKKyAgICAgICAgICAgIHZtdWwuZiAgczIwLCBzMTYsIHMyICAgICAgICAgICAgICAgIEAgdmVjdG9yICogc2NhbGFyCisgICAgICAgIHZsZHIgICAgczAsIFtcejMsICM4Km8zXSAgICAgICAgICAgIEAgdDUKKyAgICAgICAgdmxkciAgICBzNiwgW1x6MiwgIzgqbzIrNF0gICAgICAgICAgQCB0MgorICAgICAgICB2bGRyICAgIHMzLCBbXHozLCAjOCpvMys0XSAgICAgICAgICBAIHQ2CisgICAgICAgICAgICB2bXVsLmYgIHMxNiwgczE2LCBzMSAgICAgICAgICAgICAgICBAIHZlY3RvciAqIHNjYWxhcgorICAgICAgICBsZHIgICAgIGE0LCA9XG4tMQorMTogICAgICBhZGQgICAgIFx6MCwgXHowLCAjOCoyCisgLmlmIFxuKjQqMiA+PSA1MTIKKyAgICAgICAgYWRkICAgICBcejEsIFx6MSwgIzgqMgorIC5lbmRpZgorIC5pZiBcbio0KjIgPj0gMjU2CisgICAgICAgIGFkZCAgICAgXHoyLCBcejIsICM4KjIKKyAuZW5kaWYKKyAuaWYgXG4qNCoyID49IDUxMgorICAgICAgICBhZGQgICAgIFx6MywgXHozLCAjOCoyCisgLmVuZGlmCisgICAgICAgIEAgdXAgdG8gMiBzdGFsbHMgKFZGUCB2ZWN0b3IgaXNzdWluZyAvIHdhaXRpbmcgZm9yIHMwKQorICAgICAgICBAIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFuZAorICAgICAgICBAIGhvdyBtYW55IGFkZCBpbnN0cnVjdGlvbnMgYXJlIGluc2VydGVkIGFib3ZlCisgICAgICAgIHZhZGQuZiAgczQsIHMwLCBzNyAgICAgICAgICAgICAgICAgIEAgdDUKKyAgICAgICAgdmFkZC5mICBzNSwgczYsIHMzICAgICAgICAgICAgICAgICAgQCB0NgorICAgICAgICB2c3ViLmYgIHM2LCBzNiwgczMgICAgICAgICAgICAgICAgICBAIHQ0CisgICAgICAgIHZzdWIuZiAgczcsIHMwLCBzNyAgICAgICAgICAgICAgICAgIEAgdDMKKyAgICAgICAgdmxkciAgICBkNiwgW1x6MCwgIzgqMC04KjJdICAgICAgICAgQCBzMTIsczEzCisgICAgICAgICAgICB2YWRkLmYgIHMwLCBzMTYsIHMyMSAgICAgICAgICAgICAgICBAIHQxCisgICAgICAgIHZsZHIgICAgZDcsIFtcejEsICM4Km8xLTgqMl0gICAgICAgIEAgczE0LHMxNQorICAgICAgICAgICAgdnN1Yi5mICBzMSwgczE4LCBzMjMgICAgICAgICAgICAgICAgQCB0NQorICAgICAgICB2YWRkLmYgIHM4LCBzNCwgczEyICAgICAgICAgICAgICAgICBAIHZlY3RvciArIHZlY3RvcgorICAgICAgICBAIHN0YWxsIChWRlAgdmVjdG9yIGlzc3VpbmcpCisgICAgICAgIEAgc3RhbGwgKFZGUCB2ZWN0b3IgaXNzdWluZykKKyAgICAgICAgQCBzdGFsbCAoVkZQIHZlY3RvciBpc3N1aW5nKQorICAgICAgICB2c3ViLmYgIHM0LCBzMTIsIHM0CisgICAgICAgIHZzdWIuZiAgczUsIHMxMywgczUKKyAgICAgICAgdnN1Yi5mICBzNiwgczE0LCBzNgorICAgICAgICB2c3ViLmYgIHM3LCBzMTUsIHM3CisgICAgICAgICAgICB2c3ViLmYgIHMyLCBzMTcsIHMyMCAgICAgICAgICAgICAgICBAIHQyCisgICAgICAgICAgICB2YWRkLmYgIHMzLCBzMTksIHMyMiAgICAgICAgICAgICAgICBAIHQ2CisgICAgICAgIHZzdHIgICAgZDQsIFtcejAsICM4KjAtOCoyXSAgICAgICAgIEAgczgsczkKKyAgICAgICAgdnN0ciAgICBkNSwgW1x6MSwgIzgqbzEtOCoyXSAgICAgICAgQCBzMTAsczExCisgICAgICAgIEAgc3RhbGwgKHdhaXRpbmcgZm9yIHM1KQorICAgICAgICB2c3RyICAgIGQyLCBbXHoyLCAjOCpvMi04KjJdICAgICAgICBAIHM0LHM1CisgICAgICAgICAgICB2YWRkLmYgIHM0LCBzMSwgczAgICAgICAgICAgICAgICAgICBAIHQ1CisgICAgICAgIHZzdHIgICAgZDMsIFtcejMsICM4Km8zLTgqMl0gICAgICAgIEAgczYsczcKKyAgICAgICAgICAgIHZzdWIuZiAgczcsIHMxLCBzMCAgICAgICAgICAgICAgICAgIEAgdDMKKyAgICAgICAgICAgIHZhZGQuZiAgczUsIHMyLCBzMyAgICAgICAgICAgICAgICAgIEAgdDYKKyAgICAgICAgICAgIHZzdWIuZiAgczYsIHMyLCBzMyAgICAgICAgICAgICAgICAgIEAgdDQKKyAgICAgICAgICAgIHZsZHIgICAgZDYsIFtcejAsICM4KjEtOCoyXSAgICAgICAgIEAgczEyLHMxMworICAgICAgICAgICAgdmxkciAgICBkNywgW1x6MSwgIzgqKG8xKzEpLTgqMl0gICAgQCBzMTQsczE1CisgICAgICAgICAgICAgICAgdmxkciAgICBkNCwgW1x6MiwgIzgqbzJdICAgICAgICAgICAgQCBzOCxzOQorICAgICAgICAgICAgICAgIHZsZG1kYiAgdjYhLCB7czIsczN9CisgICAgICAgICAgICAgICAgdmxkciAgICBkNSwgW1x6MywgIzgqbzNdICAgICAgICAgICAgQCBzMTAsczExCisgICAgICAgICAgICB2YWRkLmYgIHMyMCwgczQsIHMxMiAgICAgICAgICAgICAgICBAIHZlY3RvciArIHZlY3RvcgorICAgICAgICAgICAgICAgIHZsZG1pYSAgdjUhLCB7czAsczF9CisgICAgICAgICAgICAgICAgICAgIHZsZHIgICAgZDgsIFtcejIsICM4KihvMisxKV0gICAgICAgIEAgczE2LHMxNworICAgICAgICAgICAgQCBzdGFsbCAoVkZQIHZlY3RvciBpc3N1aW5nKQorICAgICAgICAgICAgdnN1Yi5mICBzNCwgczEyLCBzNAorICAgICAgICAgICAgdnN1Yi5mICBzNSwgczEzLCBzNQorICAgICAgICAgICAgdnN1Yi5mICBzNiwgczE0LCBzNgorICAgICAgICAgICAgdnN1Yi5mICBzNywgczE1LCBzNworICAgICAgICAgICAgICAgIHZtdWwuZiAgczEyLCBzOCwgczMgICAgICAgICAgICAgICAgIEAgdmVjdG9yICogc2NhbGFyCisgICAgICAgICAgICB2c3RyICAgIGQxMCwgW1x6MCwgIzgqMS04KjJdICAgICAgICBAIHMyMCxzMjEKKyAgICAgICAgICAgICAgICAgICAgdmxkciAgICBkOSwgW1x6MywgIzgqKG8zKzEpXSAgICAgICAgQCBzMTgsczE5CisgICAgICAgICAgICB2c3RyICAgIGQxMSwgW1x6MSwgIzgqKG8xKzEpLTgqMl0gICBAIHMyMixzMjMKKyAgICAgICAgICAgICAgICB2bXVsLmYgIHM4LCBzOCwgczAgICAgICAgICAgICAgICAgICBAIHZlY3RvciAqIHNjYWxhcgorICAgICAgICAgICAgdnN0ciAgICBkMiwgW1x6MiwgIzgqKG8yKzEpLTgqMl0gICAgQCBzNCxzNQorICAgICAgICAgICAgQCBzdGFsbCAod2FpdGluZyBmb3IgczcpCisgICAgICAgICAgICB2c3RyICAgIGQzLCBbXHozLCAjOCoobzMrMSktOCoyXSAgICBAIHM2LHM3CisgICAgICAgICAgICAgICAgICAgIHZtdWwuZiAgczIwLCBzMTYsIHMyICAgICAgICAgICAgICAgIEAgdmVjdG9yICogc2NhbGFyCisgICAgICAgICAgICAgICAgQCBzdGFsbCAoVkZQIHZlY3RvciBpc3N1aW5nKQorICAgICAgICAgICAgICAgIEAgc3RhbGwgKFZGUCB2ZWN0b3IgaXNzdWluZykKKyAgICAgICAgICAgICAgICBAIHN0YWxsIChWRlAgdmVjdG9yIGlzc3VpbmcpCisgICAgICAgICAgICAgICAgdmFkZC5mICBzNywgczgsIHMxMyAgICAgICAgICAgICAgICAgQCB0MQorICAgICAgICAgICAgICAgIHZzdWIuZiAgczYsIHM5LCBzMTIgICAgICAgICAgICAgICAgIEAgdDIKKyAgICAgICAgICAgICAgICB2c3ViLmYgIHMwLCBzMTAsIHMxNSAgICAgICAgICAgICAgICBAIHQ1CisgICAgICAgICAgICAgICAgdmFkZC5mICBzMywgczExLCBzMTQgICAgICAgICAgICAgICAgQCB0NgorICAgICAgICAgICAgICAgICAgICB2bXVsLmYgIHMxNiwgczE2LCBzMSAgICAgICAgICAgICAgICBAIHZlY3RvciAqIHNjYWxhcgorICAgICAgICBzdWJzICAgIGE0LCBhNCwgIzEKKyAgICAgICAgYm5lICAgICAxYgorICAgICAgICBAIFdoYXQgcmVtYWlucyBpcyBpZGVudGljYWwgdG8gdGhlIGZpcnN0IHR3byBpbmRlbnRhdGlvbnMgb2YKKyAgICAgICAgQCB0aGUgYWJvdmUsIGJ1dCB3aXRob3V0IHRoZSBpbmNyZW1lbnQgb2YgegorICAgICAgICB2YWRkLmYgIHM0LCBzMCwgczcgICAgICAgICAgICAgICAgICBAIHQ1CisgICAgICAgIHZhZGQuZiAgczUsIHM2LCBzMyAgICAgICAgICAgICAgICAgIEAgdDYKKyAgICAgICAgdnN1Yi5mICBzNiwgczYsIHMzICAgICAgICAgICAgICAgICAgQCB0NAorICAgICAgICB2c3ViLmYgIHM3LCBzMCwgczcgICAgICAgICAgICAgICAgICBAIHQzCisgICAgICAgIHZsZHIgICAgZDYsIFtcejAsICM4KjBdICAgICAgICAgICAgIEAgczEyLHMxMworICAgICAgICAgICAgdmFkZC5mICBzMCwgczE2LCBzMjEgICAgICAgICAgICAgICAgQCB0MQorICAgICAgICB2bGRyICAgIGQ3LCBbXHoxLCAjOCpvMV0gICAgICAgICAgICBAIHMxNCxzMTUKKyAgICAgICAgICAgIHZzdWIuZiAgczEsIHMxOCwgczIzICAgICAgICAgICAgICAgIEAgdDUKKyAgICAgICAgdmFkZC5mICBzOCwgczQsIHMxMiAgICAgICAgICAgICAgICAgQCB2ZWN0b3IgKyB2ZWN0b3IKKyAgICAgICAgdnN1Yi5mICBzNCwgczEyLCBzNAorICAgICAgICB2c3ViLmYgIHM1LCBzMTMsIHM1CisgICAgICAgIHZzdWIuZiAgczYsIHMxNCwgczYKKyAgICAgICAgdnN1Yi5mICBzNywgczE1LCBzNworICAgICAgICAgICAgdnN1Yi5mICBzMiwgczE3LCBzMjAgICAgICAgICAgICAgICAgQCB0MgorICAgICAgICAgICAgdmFkZC5mICBzMywgczE5LCBzMjIgICAgICAgICAgICAgICAgQCB0NgorICAgICAgICB2c3RyICAgIGQ0LCBbXHowLCAjOCowXSAgICAgICAgICAgICBAIHM4LHM5CisgICAgICAgIHZzdHIgICAgZDUsIFtcejEsICM4Km8xXSAgICAgICAgICAgIEAgczEwLHMxMQorICAgICAgICB2c3RyICAgIGQyLCBbXHoyLCAjOCpvMl0gICAgICAgICAgICBAIHM0LHM1CisgICAgICAgICAgICB2YWRkLmYgIHM0LCBzMSwgczAgICAgICAgICAgICAgICAgICBAIHQ1CisgICAgICAgIHZzdHIgICAgZDMsIFtcejMsICM4Km8zXSAgICAgICAgICAgIEAgczYsczcKKyAgICAgICAgICAgIHZzdWIuZiAgczcsIHMxLCBzMCAgICAgICAgICAgICAgICAgIEAgdDMKKyAgICAgICAgICAgIHZhZGQuZiAgczUsIHMyLCBzMyAgICAgICAgICAgICAgICAgIEAgdDYKKyAgICAgICAgICAgIHZzdWIuZiAgczYsIHMyLCBzMyAgICAgICAgICAgICAgICAgIEAgdDQKKyAgICAgICAgICAgIHZsZHIgICAgZDYsIFtcejAsICM4KjFdICAgICAgICAgICAgIEAgczEyLHMxMworICAgICAgICAgICAgdmxkciAgICBkNywgW1x6MSwgIzgqKG8xKzEpXSAgICAgICAgQCBzMTQsczE1CisgICAgICAgICAgICB2YWRkLmYgIHMyMCwgczQsIHMxMiAgICAgICAgICAgICAgICBAIHZlY3RvciArIHZlY3RvcgorICAgICAgICAgICAgdnN1Yi5mICBzNCwgczEyLCBzNAorICAgICAgICAgICAgdnN1Yi5mICBzNSwgczEzLCBzNQorICAgICAgICAgICAgdnN1Yi5mICBzNiwgczE0LCBzNgorICAgICAgICAgICAgdnN1Yi5mICBzNywgczE1LCBzNworICAgICAgICAgICAgdnN0ciAgICBkMTAsIFtcejAsICM4KjFdICAgICAgICAgICAgQCBzMjAsczIxCisgICAgICAgICAgICB2c3RyICAgIGQxMSwgW1x6MSwgIzgqKG8xKzEpXSAgICAgICBAIHMyMixzMjMKKyAgICAgICAgICAgIHZzdHIgICAgZDIsIFtcejIsICM4KihvMisxKV0gICAgICAgIEAgczQsczUKKyAgICAgICAgICAgIHZzdHIgICAgZDMsIFtcejMsICM4KihvMysxKV0gICAgICAgIEAgczYsczcKKy5lbmRtCisKKy5tYWNybyAgZGVmX2ZmdCBuLCBuMiwgbjQKK2Z1bmN0aW9uIC5MZmZ0XG5cKClfaW50ZXJuYWxfdmZwCisgLmlmIFxuID49IDUxMgorICAgICAgICBwdXNoICAgIHt2MS12Nixscn0KKyAuZWxzZWlmIFxuID49IDI1NgorICAgICAgICBwdXNoICAgIHt2MS12Mix2NS12Nixscn0KKyAuZWxzZQorICAgICAgICBwdXNoICAgIHt2MSx2NS12Nixscn0KKyAuZW5kaWYKKyAgICAgICAgbW92ICAgICB2MSwgYTEKKyAgICAgICAgYmwgICAgICAuTGZmdFxuMlwoKV9pbnRlcm5hbF92ZnAKKyAgICAgICAgYWRkICAgICBhMSwgdjEsICM4Kihcbi80KSoyCisgICAgICAgIGJsICAgICAgLkxmZnRcbjRcKClfaW50ZXJuYWxfdmZwCisgICAgICAgIG1vdnJlbHggdjUsIFgoZmZfY29zX1xuKSwgYTEKKyAgICAgICAgYWRkICAgICBhMSwgdjEsICM4Kihcbi80KSozCisgICAgICAgIGJsICAgICAgLkxmZnRcbjRcKClfaW50ZXJuYWxfdmZwCisgLmlmIFxuID49IDUxMgorICAuc2V0IG8xLCAwKihcbi80LzIpCisgIC5zZXQgbzIsIDAqKFxuLzQvMikKKyAgLnNldCBvMywgMCooXG4vNC8yKQorICAgICAgICBhZGQgICAgIHYyLCB2MSwgIzgqMiooXG4vNC8yKQorICAgICAgICBhZGQgICAgIHYzLCB2MSwgIzgqNCooXG4vNC8yKQorICAgICAgICBhZGQgICAgIHY0LCB2MSwgIzgqNiooXG4vNC8yKQorICAgICAgICBwYXNzICAgIChcbi80LzIpLCB2MSwgdjIsIHYzLCB2NAorICAgICAgICBwb3AgICAgIHt2MS12NixwY30KKyAuZWxzZWlmIFxuID49IDI1NgorICAuc2V0IG8xLCAyKihcbi80LzIpCisgIC5zZXQgbzIsIDAqKFxuLzQvMikKKyAgLnNldCBvMywgMiooXG4vNC8yKQorICAgICAgICBhZGQgICAgIHYyLCB2MSwgIzgqNCooXG4vNC8yKQorICAgICAgICBwYXNzICAgIChcbi80LzIpLCB2MSwgdjEsIHYyLCB2MgorICAgICAgICBwb3AgICAgIHt2MS12Mix2NS12NixwY30KKyAuZWxzZQorICAuc2V0IG8xLCAyKihcbi80LzIpCisgIC5zZXQgbzIsIDQqKFxuLzQvMikKKyAgLnNldCBvMywgNiooXG4vNC8yKQorICAgICAgICBwYXNzICAgIChcbi80LzIpLCB2MSwgdjEsIHYxLCB2MQorICAgICAgICBwb3AgICAgIHt2MSx2NS12NixwY30KKyAuZW5kaWYKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZ0XG5cKClfdmZwCisgICAgICAgIGxkciAgICAgYTMsID0weDAzMDMwMDAwIC8qIFJ1bkZhc3QgbW9kZSwgdmVjdG9yIGxlbmd0aCA0LCBzdHJpZGUgMSAqLworICAgICAgICBmbXJ4ICAgIGEyLCBGUFNDUgorICAgICAgICBmbXhyICAgIEZQU0NSLCBhMworICAgICAgICB2cHVzaCAgIHtzMTYtczMxfQorICAgICAgICBtb3YgICAgIGlwLCBscgorICAgICAgICBibCAgICAgIC5MZmZ0XG5cKClfaW50ZXJuYWxfdmZwCisgICAgICAgIHZwb3AgICAge3MxNi1zMzF9CisgICAgICAgIGZteHIgICAgRlBTQ1IsIGEyCisgICAgICAgIGJ4ICAgICAgaXAKK2VuZGZ1bmMKKworLmx0b3JnCisuZW5kbQorCisgICAgICAgIGRlZl9mZnQgICAgMzIsICAgIDE2LCAgICAgOAorICAgICAgICBkZWZfZmZ0ICAgIDY0LCAgICAzMiwgICAgMTYKKyAgICAgICAgZGVmX2ZmdCAgIDEyOCwgICAgNjQsICAgIDMyCisgICAgICAgIGRlZl9mZnQgICAyNTYsICAgMTI4LCAgICA2NAorICAgICAgICBkZWZfZmZ0ICAgNTEyLCAgIDI1NiwgICAxMjgKKyAgICAgICAgZGVmX2ZmdCAgMTAyNCwgICA1MTIsICAgMjU2CisgICAgICAgIGRlZl9mZnQgIDIwNDgsICAxMDI0LCAgIDUxMgorICAgICAgICBkZWZfZmZ0ICA0MDk2LCAgMjA0OCwgIDEwMjQKKyAgICAgICAgZGVmX2ZmdCAgODE5MiwgIDQwOTYsICAyMDQ4CisgICAgICAgIGRlZl9mZnQgMTYzODQsICA4MTkyLCAgNDA5NgorICAgICAgICBkZWZfZmZ0IDMyNzY4LCAxNjM4NCwgIDgxOTIKKyAgICAgICAgZGVmX2ZmdCA2NTUzNiwgMzI3NjgsIDE2Mzg0CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZmxhY2RzcF9hcm0uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9mbGFjZHNwX2FybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ODYxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZmxhY2RzcF9hcm0uUwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcKKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworZnVuY3Rpb24gZmxhY19scGNfMTZfMV9hcm0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LCBscn0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxLCAgW3IxXQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGxkciAgICAgICAgICAgICBsciwgIFtyMF0sICM0CisgICAgICAgIGJlcSAgICAgICAgICAgICAyZgorICAgICAgICBpdCAgICAgICAgICAgICAgbHQKKyAgICAgICAgcG9wbHQgICAgICAgICAgIHtyNCwgcGN9CisxOgorICAgICAgICBtdWwgICAgICAgICAgICAgcjQsICBsciwgIHIxCisgICAgICAgIGxkbSAgICAgICAgICAgICByMCwgIHtyMiwgbHJ9CisgICAgICAgIGFkZF9zaCAgICAgICAgICByMiwgIHIyLCAgcjQsICBhc3IgcjMKKyAgICAgICAgbXVsICAgICAgICAgICAgIHI0LCAgcjIsICByMQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGFkZF9zaCAgICAgICAgICBsciwgIGxyLCAgcjQsICBhc3IgcjMKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwISwge3IyLCBscn0KKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIGl0ICAgICAgICAgICAgICBsdAorICAgICAgICBwb3BsdCAgICAgICAgICAge3I0LCBwY30KKzI6CisgICAgICAgIG11bCAgICAgICAgICAgICByNCwgIGxyLCAgcjEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIyLCAgW3IwXQorICAgICAgICBhZGRfc2ggICAgICAgICAgcjIsICByMiwgIHI0LCAgYXNyIHIzCisgICAgICAgIHN0ciAgICAgICAgICAgICByMiwgIFtyMF0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZsYWNfbHBjXzE2XzJfYXJtCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCByMgorICAgICAgICBpdCAgICAgICAgICAgICAgbGUKKyAgICAgICAgYnhsZSAgICAgICAgICAgIGxyCisKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOSwgbHJ9CisgICAgICAgIGxkbSAgICAgICAgICAgICByMCEsIHtyNiwgcjd9CisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyOCwgcjl9CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisxOgorICAgICAgICBtdWwgICAgICAgICAgICAgcjQsICByNiwgIHI4CisgICAgICAgIG11bCAgICAgICAgICAgICByNSwgIHI3LCAgcjgKKyAgICAgICAgbWxhICAgICAgICAgICAgIHI0LCAgcjcsICByOSwgIHI0CisgICAgICAgIGxkbSAgICAgICAgICAgICByMCwgIHtyNiwgcjd9CisgICAgICAgIGFkZF9zaCAgICAgICAgICByNiwgIHI2LCAgcjQsICBhc3IgcjMKKyAgICAgICAgbWxhICAgICAgICAgICAgIHI1LCAgcjYsICByOSwgIHI1CisgICAgICAgIGFkZF9zaCAgICAgICAgICByNywgIHI3LCAgcjUsICBhc3IgcjMKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwISwge3I2LCByN30KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgaXQgICAgICAgICAgICAgIGx0CisgICAgICAgIHBvcGx0ICAgICAgICAgICB7cjQtcjksIHBjfQorMjoKKyAgICAgICAgbXVsICAgICAgICAgICAgIHI0LCAgcjYsICByOAorICAgICAgICBtbGEgICAgICAgICAgICAgcjQsICByNywgIHI5LCAgcjQKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI1LCAgW3IwXQorICAgICAgICBhZGRfc2ggICAgICAgICAgcjUsICByNSwgIHI0LCAgYXNyIHIzCisgICAgICAgIHN0ciAgICAgICAgICAgICByNSwgIFtyMF0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2ZsYWNfbHBjXzE2X2FybSwgZXhwb3J0PTEKKyAgICAgICAgY21wICAgICAgICAgICAgIHIyLCAgIzIKKyAgICAgICAgYmx0ICAgICAgICAgICAgIGZsYWNfbHBjXzE2XzFfYXJtCisgICAgICAgIGJlcSAgICAgICAgICAgICBmbGFjX2xwY18xNl8yX2FybQorCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCByMgorICAgICAgICBpdCAgICAgICAgICAgICAgbGUKKyAgICAgICAgYnhsZSAgICAgICAgICAgIGxyCisKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOSwgbHJ9CisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICBiZXEgICAgICAgICAgICAgM2YKKzE6CisgICAgICAgIHN1YiAgICAgICAgICAgICBsciwgIHIyLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI0LCAgIzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI1LCAgIzAKKworICAgICAgICBsZHIgICAgICAgICAgICAgcjcsICBbcjBdLCAjNAorICAgICAgICBsZHIgICAgICAgICAgICAgcjksICBbcjFdLCAjNAorMjoKKyAgICAgICAgbWxhICAgICAgICAgICAgIHI0LCAgcjcsICByOSwgIHI0CisgICAgICAgIGxkbSAgICAgICAgICAgICByMCEsIHtyNiwgcjd9CisgICAgICAgIG1sYSAgICAgICAgICAgICByNSwgIHI2LCAgcjksICByNQorICAgICAgICBsZG0gICAgICAgICAgICAgcjEhLCB7cjgsIHI5fQorICAgICAgICBtbGEgICAgICAgICAgICAgcjQsICByNiwgIHI4LCAgcjQKKyAgICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjMgorICAgICAgICBtbGEgICAgICAgICAgICAgcjUsICByNywgIHI4LCAgcjUKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDJiCisgICAgICAgIGJsdCAgICAgICAgICAgICA2ZgorCisgICAgICAgIG1sYSAgICAgICAgICAgICByNCwgIHI3LCAgcjksICByNAorICAgICAgICBsZHIgICAgICAgICAgICAgcjcsICBbcjBdLCAjNAorICAgICAgICBtbGEgICAgICAgICAgICAgcjUsICByNywgIHI5LCAgcjUKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3IxXSwgIzQKKzY6CisgICAgICAgIG1sYSAgICAgICAgICAgICByNCwgIHI3LCAgcjksICByNAorICAgICAgICBsZG0gICAgICAgICAgICAgcjAsICB7cjYsIHI3fQorICAgICAgICBhZGRfc2ggICAgICAgICAgcjYsICByNiwgIHI0LCAgYXNyIHIzCisgICAgICAgIG1sYSAgICAgICAgICAgICByNSwgIHI2LCAgcjksICByNQorICAgICAgICBhZGRfc2ggICAgICAgICAgcjcsICByNywgIHI1LCAgYXNyIHIzCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCEsIHtyNiwgcjd9CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIsICBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMgorCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIGl0ICAgICAgICAgICAgICBsdAorICAgICAgICBwb3BsdCAgICAgICAgICAge3I0LXI5LCBwY30KKzM6CisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgICMwCis0OgorICAgICAgICBsZHIgICAgICAgICAgICAgcjUsICBbcjFdLCAjNAorICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbcjBdLCAjNAorICAgICAgICBtbGEgICAgICAgICAgICAgcjQsICByNSwgIHI2LCAgcjQKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjMQorICAgICAgICBiZ3QgICAgICAgICAgICAgNGIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI1LCAgW3IwXQorICAgICAgICBhZGRfc2ggICAgICAgICAgcjUsICByNSwgIHI0LCAgYXNyIHIzCisgICAgICAgIHN0ciAgICAgICAgICAgICByNSwgIFtyMF0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSwgcGN9CitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZmxhY2RzcF9pbml0X2FybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2ZsYWNkc3BfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjFiMTljCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2ZsYWNkc3BfaW5pdF9hcm0uYwpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9mbGFjZHNwLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKK3ZvaWQgZmZfZmxhY19scGNfMTZfYXJtKGludDMyX3QgKnNhbXBsZXMsIGNvbnN0IGludCBjb2VmZnNbMzJdLCBpbnQgb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcWxldmVsLCBpbnQgbGVuKTsKKworYXZfY29sZCB2b2lkIGZmX2ZsYWNkc3BfaW5pdF9hcm0oRkxBQ0RTUENvbnRleHQgKmMsIGVudW0gQVZTYW1wbGVGb3JtYXQgZm10LCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBzKQoreworICAgIGlmIChicHMgPD0gMTYgJiYgQ09ORklHX0ZMQUNfREVDT0RFUikKKyAgICAgICAgYy0+bHBjID0gZmZfZmxhY19scGNfMTZfYXJtOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2ZtdGNvbnZlcnRfaW5pdF9hcm0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9mbXRjb252ZXJ0X2luaXRfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczMTllZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9mbXRjb252ZXJ0X2luaXRfYXJtLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIEFSTSBvcHRpbWl6ZWQgRm9ybWF0IENvbnZlcnNpb24gVXRpbHMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZm10Y29udmVydC5oIgorCit2b2lkIGZmX2ludDMyX3RvX2Zsb2F0X2ZtdWxfc2NhbGFyX25lb24oZmxvYXQgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG11bCwgaW50IGxlbik7CisKK3ZvaWQgZmZfaW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXJfdmZwKGZsb2F0ICpkc3QsIGNvbnN0IGludDMyX3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG11bCwgaW50IGxlbik7Cit2b2lkIGZmX2ludDMyX3RvX2Zsb2F0X2ZtdWxfYXJyYXk4X3ZmcChGbXRDb252ZXJ0Q29udGV4dCAqYywgZmxvYXQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKnNyYywgY29uc3QgZmxvYXQgKm11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCit2b2lkIGZmX2Zsb2F0X3RvX2ludDE2X25lb24oaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBsb25nIGxlbik7Cit2b2lkIGZmX2Zsb2F0X3RvX2ludDE2X2ludGVybGVhdmVfbmVvbihpbnQxNl90ICosIGNvbnN0IGZsb2F0ICoqLCBsb25nLCBpbnQpOworCit2b2lkIGZmX2Zsb2F0X3RvX2ludDE2X3ZmcChpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGxvbmcgbGVuKTsKKworYXZfY29sZCB2b2lkIGZmX2ZtdF9jb252ZXJ0X2luaXRfYXJtKEZtdENvbnZlcnRDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX3ZmcChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlmICghaGF2ZV92ZnB2MyhjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICBjLT5pbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhciA9IGZmX2ludDMyX3RvX2Zsb2F0X2ZtdWxfc2NhbGFyX3ZmcDsKKyAgICAgICAgICAgIGMtPmludDMyX3RvX2Zsb2F0X2ZtdWxfYXJyYXk4ID0gZmZfaW50MzJfdG9fZmxvYXRfZm11bF9hcnJheThfdmZwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhdmVfYXJtdjYoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgYy0+ZmxvYXRfdG9faW50MTYgPSBmZl9mbG9hdF90b19pbnQxNl92ZnA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+aW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXIgPSBmZl9pbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhcl9uZW9uOworCisgICAgICAgIGlmICghKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKSB7CisgICAgICAgICAgICBjLT5mbG9hdF90b19pbnQxNiAgICAgICAgICAgID0gZmZfZmxvYXRfdG9faW50MTZfbmVvbjsKKyAgICAgICAgICAgIGMtPmZsb2F0X3RvX2ludDE2X2ludGVybGVhdmUgPSBmZl9mbG9hdF90b19pbnQxNl9pbnRlcmxlYXZlX25lb247CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZm10Y29udmVydF9uZW9uLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZm10Y29udmVydF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2MmUyOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9mbXRjb252ZXJ0X25lb24uUwpAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAqIEFSTSBORU9OIG9wdGltaXNlZCBGb3JtYXQgQ29udmVyc2lvbiBVdGlscworICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworZnVuY3Rpb24gZmZfZmxvYXRfdG9faW50MTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjOAorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QwLWQxfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTAsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMi1kM30sICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHExLCAgIzE2CisgICAgICAgIGJlcSAgICAgICAgICAgICAzZgorICAgICAgICBiaWNzICAgICAgICAgICAgaXAsICByMiwgICMxNQorICAgICAgICBiZXEgICAgICAgICAgICAgMmYKKzE6ICAgICAgc3VicyAgICAgICAgICAgIGlwLCAgaXAsICAjMTYKKyAgICAgICAgdnNocm4uczMyICAgICAgIGQ0LCAgcTgsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMC1kMX0sICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMCwgIHEwLCAgIzE2CisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkNSwgIHE5LCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDItZDN9LCAgW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEsICBxMSwgICMxNgorICAgICAgICB2c2hybi5zMzIgICAgICAgZDYsICBxMCwgICMxNgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2Q0LWQ1fSwgIFtyMCw6MTI4XSEKKyAgICAgICAgdnNocm4uczMyICAgICAgIGQ3LCAgcTEsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMTYtZDE3fSxbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOCwgIHE4LCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDE4LWQxOX0sW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTksICBxOSwgICMxNgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2Q2LWQ3fSwgIFtyMCw6MTI4XSEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGFuZHMgICAgICAgICAgICByMiwgIHIyLCAgIzE1CisgICAgICAgIGJlcSAgICAgICAgICAgICAzZgorMjogICAgICB2bGQxLjY0ICAgICAgICAge2QwLWQxfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdnNocm4uczMyICAgICAgIGQ0LCAgcTgsICAjMTYKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEwLCAgcTAsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMi1kM30sICBbcjEsOjEyOF0hCisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkNSwgIHE5LCAgIzE2CisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMSwgIHExLCAgIzE2CisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkNiwgIHEwLCAgIzE2CisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDQtZDV9LCAgW3IwLDoxMjhdIQorICAgICAgICB2c2hybi5zMzIgICAgICAgZDcsICBxMSwgICMxNgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2Q2LWQ3fSwgIFtyMCw6MTI4XSEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCiszOiAgICAgIHZzaHJuLnMzMiAgICAgICBkNCwgIHE4LCAgIzE2CisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkNSwgIHE5LCAgIzE2CisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDQtZDV9LCAgW3IwLDoxMjhdIQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICMyCisgICAgICAgIGl0dCAgICAgICAgICAgICBsdAorICAgICAgICBsZHJsdCAgICAgICAgICAgcjEsIFtyMV0KKyAgICAgICAgYmx0ICAgICAgICAgICAgIFgoZmZfZmxvYXRfdG9faW50MTZfbmVvbikKKyAgICAgICAgYm5lICAgICAgICAgICAgIDRmCisKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIzLCBbcjFdCisgICAgICAgIGxkciAgICAgICAgICAgICByMSwgW3IxLCAjNF0KKworICAgICAgICBzdWJzICAgICAgICAgICAgcjIsICByMiwgICM4CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDAtZDF9LCAgW3IzLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTgsICBxMCwgICMxNgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyLWQzfSwgIFtyMyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE5LCAgcTEsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMjAtZDIxfSxbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTAsIHExMCwgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDIyLWQyM30sW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTExLCBxMTEsICMxNgorICAgICAgICBiZXEgICAgICAgICAgICAgM2YKKyAgICAgICAgYmljcyAgICAgICAgICAgIGlwLCAgcjIsICAjMTUKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisxOiAgICAgIHN1YnMgICAgICAgICAgICBpcCwgIGlwLCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDAtZDF9LCAgW3IzLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTAsICBxMCwgICMxNgorICAgICAgICB2c3JpLjMyICAgICAgICAgcTEwLCBxOCwgICMxNgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyLWQzfSwgIFtyMyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExLCAgcTEsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMjQtZDI1fSxbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTIsIHExMiwgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDI2LWQyN30sW3IxLDoxMjhdIQorICAgICAgICB2c3JpLjMyICAgICAgICAgcTExLCBxOSwgICMxNgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2QyMC1kMjF9LFtyMCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMywgcTEzLCAjMTYKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMjItZDIzfSxbcjAsOjEyOF0hCisgICAgICAgIHZzcmkuMzIgICAgICAgICBxMTIsIHEwLCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDE2LWQxN30sW3IzLDoxMjhdIQorICAgICAgICB2c3JpLjMyICAgICAgICAgcTEzLCBxMSwgICMxNgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2QyNC1kMjV9LFtyMCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTgsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMTgtZDE5fSxbcjMsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHE5LCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDIwLWQyMX0sW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEwLCBxMTAsICMxNgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyMi1kMjN9LFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMSwgcTExLCAjMTYKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMjYtZDI3fSxbcjAsOjEyOF0hCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBhbmRzICAgICAgICAgICAgcjIsICByMiwgICMxNQorICAgICAgICBiZXEgICAgICAgICAgICAgM2YKKzI6ICAgICAgdnNyaS4zMiAgICAgICAgIHExMCwgcTgsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMC1kMX0sICBbcjMsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMCwgIHEwLCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDItZDN9LCAgW3IzLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEsICBxMSwgICMxNgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyNC1kMjV9LFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMiwgcTEyLCAjMTYKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHExMSwgcTksICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMjYtZDI3fSxbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTMsIHExMywgIzE2CisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDIwLWQyMX0sW3IwLDoxMjhdIQorICAgICAgICB2c3JpLjMyICAgICAgICAgcTEyLCBxMCwgICMxNgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2QyMi1kMjN9LFtyMCw6MTI4XSEKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHExMywgcTEsICAjMTYKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMjQtZDI3fSxbcjAsOjEyOF0hCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorMzogICAgICB2c3JpLjMyICAgICAgICAgcTEwLCBxOCwgICMxNgorICAgICAgICB2c3JpLjMyICAgICAgICAgcTExLCBxOSwgICMxNgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2QyMC1kMjN9LFtyMCw6MTI4XSEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCisKKzQ6ICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOCxscn0KKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzQKKyAgICAgICAgbHNsICAgICAgICAgICAgIGlwLCAgcjMsICAjMQorICAgICAgICBibHQgICAgICAgICAgICAgNGYKKworICAgICAgICBAIDQgY2hhbm5lbHMKKzU6ICAgICAgbGRtaWEgICAgICAgICAgIHIxISwge3I0LXI3fQorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjgsICByMAorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxNi1kMTd9LFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTgsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMTgtZDE5fSxbcjUsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHE5LCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDIwLWQyMX0sW3I2LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEwLCBxMTAsICMxNgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyMi1kMjN9LFtyNyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMSwgcTExLCAjMTYKKzY6ICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjOAorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QwLWQxfSwgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEwLCAgcTAsICAjMTYKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHE5LCAgcTgsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMi1kM30sICBbcjUsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMSwgIHExLCAgIzE2CisgICAgICAgIHZzcmkuMzIgICAgICAgICBxMTEsIHExMCwgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDQtZDV9LCAgW3I2LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTIsICBxMiwgICMxNgorICAgICAgICB2emlwLjMyICAgICAgICAgZDE4LCBkMjIKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkNi1kN30sICBbcjcsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMywgIHEzLCAgIzE2CisgICAgICAgIHZ6aXAuMzIgICAgICAgICBkMTksIGQyMworICAgICAgICB2c3QxLjY0ICAgICAgICAge2QxOH0sICAgIFtyOF0sIGlwCisgICAgICAgIHZzcmkuMzIgICAgICAgICBxMSwgIHEwLCAgIzE2CisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDIyfSwgICAgW3I4XSwgaXAKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHEzLCAgcTIsICAjMTYKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMTl9LCAgICBbcjhdLCBpcAorICAgICAgICB2emlwLjMyICAgICAgICAgZDIsICBkNgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2QyM30sICAgIFtyOF0sIGlwCisgICAgICAgIHZ6aXAuMzIgICAgICAgICBkMywgIGQ3CisgICAgICAgIGJlcSAgICAgICAgICAgICA3ZgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxNi1kMTd9LFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTgsICAjMTYKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMn0sICAgICBbcjhdLCBpcAorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxOC1kMTl9LFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE5LCAgcTksICAjMTYKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkNn0sICAgICBbcjhdLCBpcAorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyMC1kMjF9LFtyNiw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMCwgcTEwLCAjMTYKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkM30sICAgICBbcjhdLCBpcAorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyMi1kMjN9LFtyNyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMSwgcTExLCAjMTYKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkN30sICAgICBbcjhdLCBpcAorICAgICAgICBiICAgICAgICAgICAgICAgNmIKKzc6ICAgICAgdnN0MS42NCAgICAgICAgIHtkMn0sICAgICBbcjhdLCBpcAorICAgICAgICB2c3QxLjY0ICAgICAgICAge2Q2fSwgICAgIFtyOF0sIGlwCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDN9LCAgICAgW3I4XSwgaXAKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkN30sICAgICBbcjhdLCBpcAorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICM0CisgICAgICAgIGl0ICAgICAgICAgICAgICBlcQorICAgICAgICBwb3BlcSAgICAgICAgICAge3I0LXI4LHBjfQorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIGJnZSAgICAgICAgICAgICA1YgorCisgICAgICAgIEAgMiBjaGFubmVscworNDogICAgICBjbXAgICAgICAgICAgICAgcjMsICAjMgorICAgICAgICBibHQgICAgICAgICAgICAgNGYKKyAgICAgICAgbGRtaWEgICAgICAgICAgIHIxISwge3I0LXI1fQorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjgsICByMAorICAgICAgICB0c3QgICAgICAgICAgICAgbHIsICAjOAorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxNi1kMTd9LFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTgsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMTgtZDE5fSxbcjUsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHE5LCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDIwLWQyMX0sW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEwLCBxMTAsICMxNgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyMi1kMjN9LFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMSwgcTExLCAjMTYKKyAgICAgICAgYmVxICAgICAgICAgICAgIDZmCisgICAgICAgIHN1YnMgICAgICAgICAgICBsciwgIGxyLCAgIzgKKyAgICAgICAgYmVxICAgICAgICAgICAgIDdmCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMTgsIGQxNiwgIzE2CisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMTksIGQxNywgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDE2LWQxN30sW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTgsICBxOCwgICMxNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOFswXX0sIFtyOF0sIGlwCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMjIsIGQyMCwgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE4WzFdfSwgW3I4XSwgaXAKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQyMywgZDIxLCAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTlbMF19LCBbcjhdLCBpcAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOVsxXX0sIFtyOF0sIGlwCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDE4LWQxOX0sW3I1LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTksICBxOSwgICMxNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyMlswXX0sIFtyOF0sIGlwCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyWzFdfSwgW3I4XSwgaXAKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMjAtZDIxfSxbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTAsIHExMCwgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzBdfSwgW3I4XSwgaXAKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMV19LCBbcjhdLCBpcAorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyMi1kMjN9LFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMSwgcTExLCAjMTYKKzY6ICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMC1kMX0sICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMCwgIHEwLCAgIzE2CisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMTgsIGQxNiwgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDItZDN9LCAgW3I1LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEsICBxMSwgICMxNgorICAgICAgICB2c3JpLjMyICAgICAgICAgZDE5LCBkMTcsICMxNgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2Q0LWQ1fSwgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEyLCAgcTIsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkNi1kN30sICBbcjUsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMywgIHEzLCAgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE4WzBdfSwgW3I4XSwgaXAKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQyMiwgZDIwLCAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMThbMV19LCBbcjhdLCBpcAorICAgICAgICB2c3JpLjMyICAgICAgICAgZDIzLCBkMjEsICMxNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOVswXX0sIFtyOF0sIGlwCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMiwgIGQwLCAgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE5WzFdfSwgW3I4XSwgaXAKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQzLCAgZDEsICAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMF19LCBbcjhdLCBpcAorICAgICAgICB2c3JpLjMyICAgICAgICAgZDYsICBkNCwgICMxNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyMlsxXX0sIFtyOF0sIGlwCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkNywgIGQ1LCAgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzBdfSwgW3I4XSwgaXAKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMV19LCBbcjhdLCBpcAorICAgICAgICBiZXEgICAgICAgICAgICAgNmYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMTYtZDE3fSxbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOCwgIHE4LCAgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCAgW3I4XSwgaXAKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlsxXX0sICBbcjhdLCBpcAorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxOC1kMTl9LFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE5LCAgcTksICAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sICBbcjhdLCBpcAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QzWzFdfSwgIFtyOF0sIGlwCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDIwLWQyMX0sW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEwLCBxMTAsICMxNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q2WzBdfSwgIFtyOF0sIGlwCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDZbMV19LCAgW3I4XSwgaXAKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMjItZDIzfSxbcjUsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTEsIHExMSwgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDdbMF19LCAgW3I4XSwgaXAKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkN1sxXX0sICBbcjhdLCBpcAorICAgICAgICBiZ3QgICAgICAgICAgICAgNmIKKzY6ICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sICBbcjhdLCBpcAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzFdfSwgIFtyOF0sIGlwCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMF19LCAgW3I4XSwgaXAKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1sxXX0sICBbcjhdLCBpcAorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q2WzBdfSwgIFtyOF0sIGlwCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDZbMV19LCAgW3I4XSwgaXAKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkN1swXX0sICBbcjhdLCBpcAorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q3WzFdfSwgIFtyOF0sIGlwCisgICAgICAgIGIgICAgICAgICAgICAgICA4ZgorNzogICAgICB2c3JpLjMyICAgICAgICAgZDE4LCBkMTYsICMxNgorICAgICAgICB2c3JpLjMyICAgICAgICAgZDE5LCBkMTcsICMxNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOFswXX0sIFtyOF0sIGlwCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMjIsIGQyMCwgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE4WzFdfSwgW3I4XSwgaXAKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQyMywgZDIxLCAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTlbMF19LCBbcjhdLCBpcAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOVsxXX0sIFtyOF0sIGlwCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyWzBdfSwgW3I4XSwgaXAKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMV19LCBbcjhdLCBpcAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyM1swXX0sIFtyOF0sIGlwCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzFdfSwgW3I4XSwgaXAKKzg6ICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM0CisgICAgICAgIGl0ICAgICAgICAgICAgICBlcQorICAgICAgICBwb3BlcSAgICAgICAgICAge3I0LXI4LHBjfQorCisgICAgICAgIEAgMSBjaGFubmVsCis0OiAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtyMV0sIzQKKyAgICAgICAgdHN0ICAgICAgICAgICAgIHIyLCAgIzgKKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgcjIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI1LCAgcjAKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMC1kMX0sICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMCwgIHEwLCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDItZDN9LCAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEsICBxMSwgICMxNgorICAgICAgICBibmUgICAgICAgICAgICAgOGYKKzY6ICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkNC1kNX0sICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMiwgIHEyLCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDYtZDd9LCAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTMsICBxMywgICMxNgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwWzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwWzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxWzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxWzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyWzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyWzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzWzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzWzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICBiZXEgICAgICAgICAgICAgN2YKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMC1kMX0sICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMCwgIHEwLCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDItZDN9LCAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEsICBxMSwgICMxNgorNzogICAgICB2c3QxLjE2ICAgICAgICAge2Q0WzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q0WzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q1WzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q1WzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q2WzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q2WzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q3WzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q3WzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICBiZ3QgICAgICAgICAgICAgNmIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOCxwY30KKzg6ICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjOAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwWzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwWzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxWzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxWzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyWzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyWzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzWzFdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzWzNdfSwgIFtyNSw6MTZdLCBpcAorICAgICAgICBpdCAgICAgICAgICAgICAgZXEKKyAgICAgICAgcG9wZXEgICAgICAgICAgIHtyNC1yOCxwY30KKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMC1kMX0sICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMCwgIHEwLCAgIzE2CisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDItZDN9LCAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEsICBxMSwgICMxNgorICAgICAgICBiICAgICAgICAgICAgICAgNmIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfaW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXJfbmVvbiwgZXhwb3J0PTEKK1ZGUCAgICAgdmR1cC4zMiAgICAgICAgIHEwLCAgZDBbMF0KK1ZGUCAgICAgbGVuICAgICAucmVxICAgIHIyCitOT1ZGUCAgIHZkdXAuMzIgICAgICAgICBxMCwgIHIyCitOT1ZGUCAgIGxlbiAgICAgLnJlcSAgICByMworCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTF9LFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHEzLCAgcTEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMn0sW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgcTgsICBxMgorMTogICAgICBzdWJzICAgICAgICAgICAgbGVuLCBsZW4sICM4CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjEsICMxNl0KKyAgICAgICAgdm11bC5mMzIgICAgICAgIHE5LCAgcTMsICBxMAorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTEwLCBxOCwgIHEwCisgICAgICAgIGJlcSAgICAgICAgICAgICAyZgorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSxbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBxMywgIHExCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTJ9LFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHE4LCAgcTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxOX0sIFtyMCw6MTI4XSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxMTB9LFtyMCw6MTI4XSEKKyAgICAgICAgYiAgICAgICAgICAgICAgIDFiCisyOiAgICAgIHZzdDEuMzIgICAgICAgICB7cTl9LCBbcjAsOjEyOF0hCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTEwfSxbcjAsOjEyOF0hCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorICAgICAgICAudW5yZXEgIGxlbgorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2ZtdGNvbnZlcnRfdmZwLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZm10Y29udmVydF92ZnAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTRhZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2ZtdGNvbnZlcnRfdmZwLlMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUklTQyBPUyBPcGVuIEx0ZCA8YmF2aXNvbkByaXNjb3NvcGVuLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKKy8qKgorICogQVJNIFZGUCBvcHRpbWlzZWQgaW50MzIgdG8gZmxvYXQgY29udmVyc2lvbi4KKyAqIEFzc3VtZSBsZW4gaXMgYSBtdWx0aXBsZSBvZiA4LCBkZXN0aW5hdGlvbiBidWZmZXIgaXMgYXQgbGVhc3QgNCBieXRlcyBhbGlnbmVkCisgKiAoMTYgYnl0ZXMgYWxpZ25tZW50IGlzIGJlc3QgZm9yIEJDTTI4MzUpLCBsaXR0bGUtZW5kaWFuLgorICovCitAIHZvaWQgZmZfaW50MzJfdG9fZmxvYXRfZm11bF9hcnJheThfdmZwKEZtdENvbnZlcnRDb250ZXh0ICpjLCBmbG9hdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsIGNvbnN0IGZsb2F0ICptdWwsIGludCBsZW4pCitmdW5jdGlvbiBmZl9pbnQzMl90b19mbG9hdF9mbXVsX2FycmF5OF92ZnAsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAge2xyfQorICAgICAgICBsZHIgICAgIGExLCBbc3AsICM0XQorICAgICAgICBzdWJzICAgIGxyLCBhMSwgIzMqOAorICAgICAgICBiY2MgICAgIDUwZiAgICAgICAgICAgICAgICAgICAgICAgIEAgdG9vIHNob3J0IHRvIHBpcGVsaW5lCisgICAgICAgIEAgTm93IG5lZWQgdG8gZmluZCAobGVuIC8gOCkgJSAzLiBUaGUgYXBwcm94aW1hdGlvbgorICAgICAgICBAIHggLyAyNCA9ICh4ICogMHhBQikgPj4gMTIKKyAgICAgICAgQCBpcyBnb29kIGZvciB4IDwgNDA5Niwgd2hpY2ggaXMgdHJ1ZSBmb3IgYm90aCBBQzMgYW5kIERDQS4KKyAgICAgICAgbW92ICAgICBhMSwgIzB4QUIKKyAgICAgICAgbGRyICAgICBpcCwgPTB4MDMwNzAwMDAgICAgICAgICAgICBAIFJ1bkZhc3QgbW9kZSwgc2hvcnQgdmVjdG9ycyBvZiBsZW5ndGggOCwgc3RyaWRlIDEKKyAgICAgICAgbXVsICAgICBhMSwgbHIsIGExCisgICAgICAgIHZwdXNoICAge3MxNi1zMzF9CisgICAgICAgIG1vdiAgICAgYTEsIGExLCBsc3IgIzEyCisgICAgICAgIGFkZCAgICAgYTEsIGExLCBhMSwgbHNsICMxCisgICAgICAgIHJzYiAgICAgYTEsIGExLCBsciwgbHNyICMzCisgICAgICAgIGNtcCAgICAgYTEsICMxCisgICAgICAgIGZtcnggICAgYTEsIEZQU0NSCisgICAgICAgIGZteHIgICAgRlBTQ1IsIGlwCisgICAgICAgIGJlcSAgICAgMTFmCisgICAgICAgIGJsbyAgICAgMTBmCisgICAgICAgIEAgQXJyYXkgaXMgKDIgKyBtdWx0aXBsZSBvZiAzKSB4IDggZmxvYXRzIGxvbmcKKyAgICAgICAgQCBkcm9wIHRocm91Z2guLi4KKyAgICAgICAgdmxkbWlhICAgICAgICAgIGEzISwge3MxNi1zMjN9CisgICAgICAgIHZsZG1pYSAgICAgICAgICBhNCEsIHtzMixzM30KKyAgICAgICAgdmxkbWlhICAgICAgICAgIGEzISwge3MyNC1zMzF9CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTYsIHMxNgorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczE3LCBzMTcKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMxOCwgczE4CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTksIHMxOQorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczIwLCBzMjAKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMyMSwgczIxCisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMjIsIHMyMgorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczIzLCBzMjMKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHMxNiwgczE2LCBzMgorICAgICAgICBAIGRyb3AgdGhyb3VnaC4uLgorMzoKKyAgICAgICAgdmxkbWlhICAgICAgICAgIGEzISwge3M4LXMxNX0KKyAgICAgICAgdmxkbWlhICAgICAgICAgIGE0ISwge3MxfQorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczI0LCBzMjQKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMyNSwgczI1CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMjYsIHMyNgorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczI3LCBzMjcKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMyOCwgczI4CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMjksIHMyOQorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczMwLCBzMzAKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMzMSwgczMxCisgICAgICAgIHZtdWwuZjMyICAgICAgICBzMjQsIHMyNCwgczMKKyAgICAgICAgdnN0bWlhICAgICAgICAgIGEyISwge3MxNi1zMTl9CisgICAgICAgIHZzdG1pYSAgICAgICAgICBhMiEsIHtzMjAtczIzfQorMjoKKyAgICAgICAgdmxkbWlhICAgICAgICAgIGEzISwge3MxNi1zMjN9CisgICAgICAgIHZsZG1pYSAgICAgICAgICBhNCEsIHtzMn0KKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHM4LCBzOAorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczksIHM5CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTAsIHMxMAorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczExLCBzMTEKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMxMiwgczEyCisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTMsIHMxMworICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczE0LCBzMTQKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMxNSwgczE1CisgICAgICAgIHZtdWwuZjMyICAgICAgICBzOCwgczgsIHMxCisgICAgICAgIHZzdG1pYSAgICAgICAgICBhMiEsIHtzMjQtczI3fQorICAgICAgICB2c3RtaWEgICAgICAgICAgYTIhLCB7czI4LXMzMX0KKzE6CisgICAgICAgIHZsZG1pYSAgICAgICAgICBhMyEsIHtzMjQtczMxfQorICAgICAgICB2bGRtaWEgICAgICAgICAgYTQhLCB7czN9CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTYsIHMxNgorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczE3LCBzMTcKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMxOCwgczE4CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTksIHMxOQorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczIwLCBzMjAKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMyMSwgczIxCisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMjIsIHMyMgorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczIzLCBzMjMKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHMxNiwgczE2LCBzMgorICAgICAgICB2c3RtaWEgICAgICAgICAgYTIhLCB7czgtczExfQorICAgICAgICB2c3RtaWEgICAgICAgICAgYTIhLCB7czEyLXMxNX0KKworICAgICAgICBzdWJzICAgICAgICAgICAgbHIsIGxyLCAjOCozCisgICAgICAgIGJwbCAgICAgICAgICAgICAzYgorCisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMjQsIHMyNAorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczI1LCBzMjUKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMyNiwgczI2CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMjcsIHMyNworICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczI4LCBzMjgKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMyOSwgczI5CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMzAsIHMzMAorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczMxLCBzMzEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHMyNCwgczI0LCBzMworICAgICAgICB2c3RtaWEgICAgICAgICAgYTIhLCB7czE2LXMxOX0KKyAgICAgICAgdnN0bWlhICAgICAgICAgIGEyISwge3MyMC1zMjN9CisgICAgICAgIHZzdG1pYSAgICAgICAgICBhMiEsIHtzMjQtczI3fQorICAgICAgICB2c3RtaWEgICAgICAgICAgYTIhLCB7czI4LXMzMX0KKworICAgICAgICBmbXhyICAgIEZQU0NSLCBhMQorICAgICAgICB2cG9wICAgIHtzMTYtczMxfQorICAgICAgICBwb3AgICAgIHtwY30KKworMTA6ICAgICBAIEFycmF5IGlzIChtdWx0aXBsZSBvZiAzKSB4IDggZmxvYXRzIGxvbmcKKyAgICAgICAgdmxkbWlhICAgICAgICAgIGEzISwge3M4LXMxNX0KKyAgICAgICAgdmxkbWlhICAgICAgICAgIGE0ISwge3MxLHMyfQorICAgICAgICB2bGRtaWEgICAgICAgICAgYTMhLCB7czE2LXMyM30KKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHM4LCBzOAorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczksIHM5CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTAsIHMxMAorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczExLCBzMTEKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMxMiwgczEyCisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTMsIHMxMworICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczE0LCBzMTQKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMxNSwgczE1CisgICAgICAgIHZtdWwuZjMyICAgICAgICBzOCwgczgsIHMxCisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorCisxMTogICAgIEAgQXJyYXkgaXMgKDEgKyBtdWx0aXBsZSBvZiAzKSB4IDggZmxvYXRzIGxvbmcKKyAgICAgICAgdmxkbWlhICAgICAgICAgIGEzISwge3MyNC1zMzF9CisgICAgICAgIHZsZG1pYSAgICAgICAgICBhNCEsIHtzM30KKyAgICAgICAgdmxkbWlhICAgICAgICAgIGEzISwge3M4LXMxNX0KKyAgICAgICAgdmxkbWlhICAgICAgICAgIGE0ISwge3MxfQorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczI0LCBzMjQKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMyNSwgczI1CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMjYsIHMyNgorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczI3LCBzMjcKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMyOCwgczI4CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMjksIHMyOQorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczMwLCBzMzAKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMzMSwgczMxCisgICAgICAgIHZtdWwuZjMyICAgICAgICBzMjQsIHMyNCwgczMKKyAgICAgICAgYiAgICAgICAgICAgICAgIDJiCisKKzUwOgorICAgICAgICBsZHIgICAgIGxyLCA9MHgwMzA3MDAwMCAgICAgICAgIEAgUnVuRmFzdCBtb2RlLCBzaG9ydCB2ZWN0b3JzIG9mIGxlbmd0aCA4LCBzdHJpZGUgMQorICAgICAgICBmbXJ4ICAgIGlwLCBGUFNDUgorICAgICAgICBmbXhyICAgIEZQU0NSLCBscgorNTE6CisgICAgICAgIHZsZG1pYSAgICAgICAgICBhMyEsIHtzOC1zMTV9CisgICAgICAgIHZsZG1pYSAgICAgICAgICBhNCEsIHtzMH0KKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHM4LCBzOAorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczksIHM5CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTAsIHMxMAorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczExLCBzMTEKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMxMiwgczEyCisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTMsIHMxMworICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczE0LCBzMTQKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMxNSwgczE1CisgICAgICAgIHZtdWwuZjMyICAgICAgICBzOCwgczgsIHMwCisgICAgICAgIHN1YnMgICAgICAgICAgICBhMSwgYTEsICM4CisgICAgICAgIHZzdG1pYSAgICAgICAgICBhMiEsIHtzOC1zMTF9CisgICAgICAgIHZzdG1pYSAgICAgICAgICBhMiEsIHtzMTItczE1fQorICAgICAgICBibmUgICAgICAgICAgICAgNTFiCisKKyAgICAgICAgZm14ciAgICBGUFNDUiwgaXAKKyAgICAgICAgcG9wICAgICB7cGN9CitlbmRmdW5jCisKKy8qKgorICogQVJNIFZGUCBvcHRpbWlzZWQgaW50MzIgdG8gZmxvYXQgY29udmVyc2lvbi4KKyAqIEFzc3VtZSBsZW4gaXMgYSBtdWx0aXBsZSBvZiA4LCBkZXN0aW5hdGlvbiBidWZmZXIgaXMgYXQgbGVhc3QgNCBieXRlcyBhbGlnbmVkCisgKiAoMTYgYnl0ZXMgYWxpZ25tZW50IGlzIGJlc3QgZm9yIEJDTTI4MzUpLCBsaXR0bGUtZW5kaWFuLgorICogVE9ETzogY291bGQgYmUgZnVydGhlciBvcHRpbWlzZWQgYnkgdW5yb2xsaW5nIGFuZCBpbnRlcmxlYXZpbmcsIGFzIGFib3ZlCisgKi8KK0Agdm9pZCBmZl9pbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhcl92ZnAoZmxvYXQgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLCBmbG9hdCBtdWwsIGludCBsZW4pCitmdW5jdGlvbiBmZl9pbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhcl92ZnAsIGV4cG9ydD0xCitWRlAgICAgIHRtcCAgICAgLnJlcSAgICBhNAorVkZQICAgICBsZW4gICAgIC5yZXEgICAgYTMKK05PVkZQICAgdG1wICAgICAucmVxICAgIGEzCitOT1ZGUCAgIGxlbiAgICAgLnJlcSAgICBhNAorTk9WRlAgICB2bW92ICAgIHMwLCBhMworICAgICAgICBsZHIgICAgIHRtcCwgPTB4MDMwNzAwMDAgICAgICAgICAgIEAgUnVuRmFzdCBtb2RlLCBzaG9ydCB2ZWN0b3JzIG9mIGxlbmd0aCA4LCBzdHJpZGUgMQorICAgICAgICBmbXJ4ICAgIGlwLCBGUFNDUgorICAgICAgICBmbXhyICAgIEZQU0NSLCB0bXAKKzE6CisgICAgICAgIHZsZG1pYSAgICAgICAgICBhMiEsIHtzOC1zMTV9CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzOCwgczgKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHM5LCBzOQorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczEwLCBzMTAKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMxMSwgczExCisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTIsIHMxMgorICAgICAgICB2Y3Z0LmYzMi5zMzIgICAgczEzLCBzMTMKKyAgICAgICAgdmN2dC5mMzIuczMyICAgIHMxNCwgczE0CisgICAgICAgIHZjdnQuZjMyLnMzMiAgICBzMTUsIHMxNQorICAgICAgICB2bXVsLmYzMiAgICAgICAgczgsIHM4LCBzMAorICAgICAgICBzdWJzICAgICAgICAgICAgbGVuLCBsZW4sICM4CisgICAgICAgIHZzdG1pYSAgICAgICAgICBhMSEsIHtzOC1zMTF9CisgICAgICAgIHZzdG1pYSAgICAgICAgICBhMSEsIHtzMTItczE1fQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBmbXhyICAgIEZQU0NSLCBpcAorICAgICAgICBieCAgICAgIGxyCitlbmRmdW5jCisgICAgICAgIC51bnJlcSAgdG1wCisgICAgICAgIC51bnJlcSAgbGVuCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZm10Y29udmVydF92ZnBfYXJtdjYuUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9mbXRjb252ZXJ0X3ZmcF9hcm12Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDEyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vZm10Y29udmVydF92ZnBfYXJtdjYuUwpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNpYXJoZWkgU2lhbWFzaGthIDxzc3ZiQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKKy8qKgorICogQVJNIFZGUCBvcHRpbWl6ZWQgZmxvYXQgdG8gaW50MTYgY29udmVyc2lvbi4KKyAqIEFzc3VtZSB0aGF0IGxlbiBpcyBhIHBvc2l0aXZlIG51bWJlciBhbmQgaXMgbXVsdGlwbGUgb2YgOCwgZGVzdGluYXRpb24KKyAqIGJ1ZmZlciBpcyBhdCBsZWFzdCA0IGJ5dGVzIGFsaWduZWQgKDggYnl0ZXMgYWxpZ25tZW50IGlzIGJldHRlciBmb3IKKyAqIHBlcmZvcm1hbmNlKSwgbGl0dGxlLWVuZGlhbiBieXRlIHNleC4KKyAqLworQCB2b2lkIGZmX2Zsb2F0X3RvX2ludDE2X3ZmcChpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGludCBsZW4pCitmdW5jdGlvbiBmZl9mbG9hdF90b19pbnQxNl92ZnAsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjgsbHJ9CisgICAgICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDExfQorICAgICAgICB2bGRtaWEgICAgICAgICAgcjEhLCB7czE2LXMyM30KKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHMwLCAgczE2CisgICAgICAgIHZjdnQuczMyLmYzMiAgICBzMSwgIHMxNworICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgczIsICBzMTgKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHMzLCAgczE5CisgICAgICAgIHZjdnQuczMyLmYzMiAgICBzNCwgIHMyMAorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgczUsICBzMjEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHM2LCAgczIyCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBzNywgIHMyMworMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjOAorICAgICAgICB2bW92ICAgICAgICAgICAgcjMsICByNCwgIHMwLCBzMQorICAgICAgICB2bW92ICAgICAgICAgICAgcjUsICByNiwgIHMyLCBzMworICAgICAgICB2bW92ICAgICAgICAgICAgcjcsICByOCwgIHM0LCBzNQorICAgICAgICB2bW92ICAgICAgICAgICAgaXAsICBsciwgIHM2LCBzNworICAgICAgICBpdCAgICAgICAgICAgICAgZ3QKKyAgICAgICAgdmxkbWlhZ3QgICAgICAgIHIxISwge3MxNi1zMjN9CisgICAgICAgIHNzYXQgICAgICAgICAgICByNCwgICMxNiwgcjQKKyAgICAgICAgc3NhdCAgICAgICAgICAgIHIzLCAgIzE2LCByMworICAgICAgICBzc2F0ICAgICAgICAgICAgcjYsICAjMTYsIHI2CisgICAgICAgIHNzYXQgICAgICAgICAgICByNSwgICMxNiwgcjUKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHIzLCAgcjMsICByNCwgbHNsICMxNgorICAgICAgICBwa2hidCAgICAgICAgICAgcjQsICByNSwgIHI2LCBsc2wgIzE2CisgICAgICAgIGl0dHR0ICAgICAgICAgICBndAorICAgICAgICB2Y3Z0Z3QuczMyLmYzMiAgczAsICBzMTYKKyAgICAgICAgdmN2dGd0LnMzMi5mMzIgIHMxLCAgczE3CisgICAgICAgIHZjdnRndC5zMzIuZjMyICBzMiwgIHMxOAorICAgICAgICB2Y3Z0Z3QuczMyLmYzMiAgczMsICBzMTkKKyAgICAgICAgaXR0dHQgICAgICAgICAgIGd0CisgICAgICAgIHZjdnRndC5zMzIuZjMyICBzNCwgIHMyMAorICAgICAgICB2Y3Z0Z3QuczMyLmYzMiAgczUsICBzMjEKKyAgICAgICAgdmN2dGd0LnMzMi5mMzIgIHM2LCAgczIyCisgICAgICAgIHZjdnRndC5zMzIuZjMyICBzNywgIHMyMworICAgICAgICBzc2F0ICAgICAgICAgICAgcjgsICAjMTYsIHI4CisgICAgICAgIHNzYXQgICAgICAgICAgICByNywgICMxNiwgcjcKKyAgICAgICAgc3NhdCAgICAgICAgICAgIGxyLCAgIzE2LCBscgorICAgICAgICBzc2F0ICAgICAgICAgICAgaXAsICAjMTYsIGlwCisgICAgICAgIHBraGJ0ICAgICAgICAgICByNSwgIHI3LCAgcjgsIGxzbCAjMTYKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI2LCAgaXAsICBsciwgbHNsICMxNgorICAgICAgICBzdG1pYSAgICAgICAgICAgcjAhLCB7cjMtcjZ9CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorCisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDExfQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI4LHBjfQorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2gyNjRjaHJvbWFfaW5pdF9hcm0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0Y2hyb21hX2luaXRfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmN2UwZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0Y2hyb21hX2luaXRfYXJtLmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIEFSTSBORU9OIG9wdGltaXNlZCBILjI2NCBjaHJvbWEgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9oMjY0Y2hyb21hLmgiCisKK3ZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jOF9uZW9uKHVpbnQ4X3QgKiwgdWludDhfdCAqLCBpbnQsIGludCwgaW50LCBpbnQpOwordm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM0X25lb24odWludDhfdCAqLCB1aW50OF90ICosIGludCwgaW50LCBpbnQsIGludCk7Cit2b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzJfbmVvbih1aW50OF90ICosIHVpbnQ4X3QgKiwgaW50LCBpbnQsIGludCwgaW50KTsKKwordm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM4X25lb24odWludDhfdCAqLCB1aW50OF90ICosIGludCwgaW50LCBpbnQsIGludCk7Cit2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzRfbmVvbih1aW50OF90ICosIHVpbnQ4X3QgKiwgaW50LCBpbnQsIGludCwgaW50KTsKK3ZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jMl9uZW9uKHVpbnQ4X3QgKiwgdWludDhfdCAqLCBpbnQsIGludCwgaW50LCBpbnQpOworCithdl9jb2xkIHZvaWQgZmZfaDI2NGNocm9tYV9pbml0X2FybShIMjY0Q2hyb21hQ29udGV4dCAqYywgaW50IGJpdF9kZXB0aCkKK3sKKyAgICBjb25zdCBpbnQgaGlnaF9iaXRfZGVwdGggPSBiaXRfZGVwdGggPiA4OworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykgJiYgIWhpZ2hfYml0X2RlcHRoKSB7CisgICAgICAgIGMtPnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfcHV0X2gyNjRfY2hyb21hX21jOF9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsxXSA9IGZmX3B1dF9oMjY0X2Nocm9tYV9tYzRfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWJbMl0gPSBmZl9wdXRfaDI2NF9jaHJvbWFfbWMyX25lb247CisKKyAgICAgICAgYy0+YXZnX2gyNjRfY2hyb21hX3BpeGVsc190YWJbMF0gPSBmZl9hdmdfaDI2NF9jaHJvbWFfbWM4X25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdID0gZmZfYXZnX2gyNjRfY2hyb21hX21jNF9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsyXSA9IGZmX2F2Z19oMjY0X2Nocm9tYV9tYzJfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaDI2NGNtY19uZW9uLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaDI2NGNtY19uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZDNjMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0Y21jX25lb24uUwpAQCAtMCwwICsxLDQ2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKKy8qIGNocm9tYV9tYzgodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpICovCisubWFjcm8gIGgyNjRfY2hyb21hX21jOCB0eXBlLCBjb2RlYz1oMjY0CitmdW5jdGlvbiBmZl9cdHlwZVwoKV9cY29kZWNcKClfY2hyb21hX21jOF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI3LCBscn0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI0LCAgcjUsICBbc3AsICMyMF0KKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgcjAKKyAgLmVuZGlmCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjEsIHIyXQorCisgIC5pZmMgXGNvZGVjLHJ2NDAKKyAgICAgICAgbW92cmVsICAgICAgICAgIHI2LCAgcnY0MGJpYXMKKyAgICAgICAgbHNyICAgICAgICAgICAgIHI3LCAgcjUsICAjMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjYsICByNiwgIHI3LCAgbHNsICMzCisgICAgICAgIGxzciAgICAgICAgICAgICByNywgIHI0LCAgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjYsICByNywgIGxzbCAjMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyMltdLGQyM1tdfSwgW3I2LDoxNl0KKyAgLmVuZGlmCisgIC5pZmMgXGNvZGVjLHZjMQorICAgICAgICB2bW92LnUxNiAgICAgICAgcTExLCAjMjgKKyAgLmVuZGlmCisKK0EgICAgICAgbXVscyAgICAgICAgICAgIHI3LCAgcjQsICByNQorVCAgICAgICBtdWwgICAgICAgICAgICAgcjcsICByNCwgIHI1CitUICAgICAgIGNtcCAgICAgICAgICAgICByNywgICMwCisgICAgICAgIHJzYiAgICAgICAgICAgICByNiwgIHI3LCAgcjUsICBsc2wgIzMKKyAgICAgICAgcnNiICAgICAgICAgICAgIHIxMiwgcjcsICByNCwgIGxzbCAjMworICAgICAgICBzdWIgICAgICAgICAgICAgcjQsICByNywgIHI0LCAgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICByNCwgIHI0LCAgcjUsICBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgcjQsICAjNjQKKworICAgICAgICBiZXEgICAgICAgICAgICAgMmYKKworICAgICAgICB2ZHVwLjggICAgICAgICAgZDAsICByNAorICAgICAgICB2ZHVwLjggICAgICAgICAgZDEsICByMTIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNCwgZDV9LCBbcjFdLCByMgorICAgICAgICB2ZHVwLjggICAgICAgICAgZDIsICByNgorICAgICAgICB2ZHVwLjggICAgICAgICAgZDMsICByNworICAgICAgICB2ZXh0LjggICAgICAgICAgZDUsICBkNCwgIGQ1LCAgIzEKKworMTogICAgICB2bGQxLjggICAgICAgICAge2Q2LCBkN30sIFtyMV0sIHIyCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOCwgIGQ0LCAgZDAKKyAgICAgICAgdm1sYWwudTggICAgICAgIHE4LCAgZDUsICBkMQorICAgICAgICB2ZXh0LjggICAgICAgICAgZDcsICBkNiwgIGQ3LCAgIzEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNCwgZDV9LCBbcjFdLCByMgorICAgICAgICB2bWxhbC51OCAgICAgICAgcTgsICBkNiwgIGQyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHZleHQuOCAgICAgICAgICBkNSwgIGQ0LCAgZDUsICAjMQorICAgICAgICB2bWxhbC51OCAgICAgICAgcTgsICBkNywgIGQzCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOSwgIGQ2LCAgZDAKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICB2bWxhbC51OCAgICAgICAgcTksICBkNywgIGQxCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxOSwgIGQ0LCAgZDIKKyAgICAgICAgdm1sYWwudTggICAgICAgIHE5LCAgZDUsICBkMworICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KKyAgLmlmYyBcY29kZWMsaDI2NAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDE2LCBxOCwgICM2CisgICAgICAgIHZyc2hybi51MTYgICAgICBkMTcsIHE5LCAgIzYKKyAgLmVsc2UKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHE4LCAgcTgsICBxMTEKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHE5LCAgcTksICBxMTEKKyAgICAgICAgdnNocm4udTE2ICAgICAgIGQxNiwgcTgsICAjNgorICAgICAgICB2c2hybi51MTYgICAgICAgZDE3LCBxOSwgICM2CisgIC5lbmRpZgorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICB2bGQxLjggICAgICAgICAge2QyMH0sIFtsciw6NjRdLCByMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMX0sIFtsciw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgcTgsICBxOCwgIHExMAorICAuZW5kaWYKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTZ9LCBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTd9LCBbcjAsOjY0XSwgcjIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNywgcGN9CisKKzI6ICAgICAgYWRkcyAgICAgICAgICAgIHIxMiwgcjEyLCByNgorICAgICAgICB2ZHVwLjggICAgICAgICAgZDAsICByNAorICAgICAgICBiZXEgICAgICAgICAgICAgNWYKKyAgICAgICAgdHN0ICAgICAgICAgICAgIHI2LCAgcjYKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQxLCAgcjEyCisKKyAgICAgICAgYmVxICAgICAgICAgICAgIDRmCisKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNH0sIFtyMV0sIHIyCisKKzM6ICAgICAgdmxkMS44ICAgICAgICAgIHtkNn0sIFtyMV0sIHIyCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOCwgIGQ0LCAgZDAKKyAgICAgICAgdm1sYWwudTggICAgICAgIHE4LCAgZDYsICBkMQorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0fSwgW3IxXSwgcjIKKyAgICAgICAgdm11bGwudTggICAgICAgIHE5LCAgZDYsICBkMAorICAgICAgICB2bWxhbC51OCAgICAgICAgcTksICBkNCwgIGQxCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgIC5pZmMgXGNvZGVjLGgyNjQKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQxNiwgcTgsICAjNgorICAgICAgICB2cnNocm4udTE2ICAgICAgZDE3LCBxOSwgICM2CisgIC5lbHNlCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxOCwgIHE4LCAgcTExCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxOSwgIHE5LCAgcTExCisgICAgICAgIHZzaHJuLnUxNiAgICAgICBkMTYsIHE4LCAgIzYKKyAgICAgICAgdnNocm4udTE2ICAgICAgIGQxNywgcTksICAjNgorICAuZW5kaWYKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMSwgcjJdCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIwfSwgW2xyLDo2NF0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIxfSwgW2xyLDo2NF0sIHIyCisgICAgICAgIHZyaGFkZC51OCAgICAgICBxOCwgIHE4LCAgcTEwCisgIC5lbmRpZgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDE2fSwgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDE3fSwgW3IwLDo2NF0sIHIyCisgICAgICAgIGJndCAgICAgICAgICAgICAzYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjcsIHBjfQorCis0OiAgICAgIHZsZDEuOCAgICAgICAgICB7ZDQsIGQ1fSwgW3IxXSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNiwgZDd9LCBbcjFdLCByMgorICAgICAgICB2ZXh0LjggICAgICAgICAgZDUsICBkNCwgIGQ1LCAgIzEKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ3LCAgZDYsICBkNywgICMxCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgdm11bGwudTggICAgICAgIHE4LCAgZDQsICBkMAorICAgICAgICB2bWxhbC51OCAgICAgICAgcTgsICBkNSwgIGQxCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOSwgIGQ2LCAgZDAKKyAgICAgICAgdm1sYWwudTggICAgICAgIHE5LCAgZDcsICBkMQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KKyAgLmlmYyBcY29kZWMsaDI2NAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDE2LCBxOCwgICM2CisgICAgICAgIHZyc2hybi51MTYgICAgICBkMTcsIHE5LCAgIzYKKyAgLmVsc2UKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHE4LCAgcTgsICBxMTEKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHE5LCAgcTksICBxMTEKKyAgICAgICAgdnNocm4udTE2ICAgICAgIGQxNiwgcTgsICAjNgorICAgICAgICB2c2hybi51MTYgICAgICAgZDE3LCBxOSwgICM2CisgIC5lbmRpZgorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICB2bGQxLjggICAgICAgICAge2QyMH0sIFtsciw6NjRdLCByMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMX0sIFtsciw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgcTgsICBxOCwgIHExMAorICAuZW5kaWYKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTZ9LCBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTd9LCBbcjAsOjY0XSwgcjIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDRiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNywgcGN9CisKKzU6ICAgICAgdmxkMS44ICAgICAgICAgIHtkNH0sIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCBbcjFdLCByMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOCwgIGQ0LCAgZDAKKyAgICAgICAgdm11bGwudTggICAgICAgIHE5LCAgZDUsICBkMAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KKyAgLmlmYyBcY29kZWMsaDI2NAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDE2LCBxOCwgICM2CisgICAgICAgIHZyc2hybi51MTYgICAgICBkMTcsIHE5LCAgIzYKKyAgLmVsc2UKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHE4LCAgcTgsICBxMTEKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHE5LCAgcTksICBxMTEKKyAgICAgICAgdnNocm4udTE2ICAgICAgIGQxNiwgcTgsICAjNgorICAgICAgICB2c2hybi51MTYgICAgICAgZDE3LCBxOSwgICM2CisgIC5lbmRpZgorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICB2bGQxLjggICAgICAgICAge2QyMH0sIFtsciw6NjRdLCByMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMX0sIFtsciw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgcTgsICBxOCwgIHExMAorICAuZW5kaWYKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTZ9LCBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTd9LCBbcjAsOjY0XSwgcjIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDViCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNywgcGN9CitlbmRmdW5jCisuZW5kbQorCisvKiBjaHJvbWFfbWM0KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KSAqLworLm1hY3JvICBoMjY0X2Nocm9tYV9tYzQgdHlwZSwgY29kZWM9aDI2NAorZnVuY3Rpb24gZmZfXHR5cGVcKClfXGNvZGVjXCgpX2Nocm9tYV9tYzRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yNywgbHJ9CisgICAgICAgIGxkcmQgICAgICAgICAgICByNCwgIHI1LCAgW3NwLCAjMjBdCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHIwCisgIC5lbmRpZgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KKworICAuaWZjIFxjb2RlYyxydjQwCisgICAgICAgIG1vdnJlbCAgICAgICAgICByNiwgIHJ2NDBiaWFzCisgICAgICAgIGxzciAgICAgICAgICAgICByNywgIHI1LCAgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjYsICByNywgIGxzbCAjMworICAgICAgICBsc3IgICAgICAgICAgICAgcjcsICByNCwgICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHI2LCAgcjcsICBsc2wgIzEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMjJbXSxkMjNbXX0sIFtyNiw6MTZdCisgIC5lbmRpZgorICAuaWZjIFxjb2RlYyx2YzEKKyAgICAgICAgdm1vdi51MTYgICAgICAgIHExMSwgIzI4CisgIC5lbmRpZgorCitBICAgICAgIG11bHMgICAgICAgICAgICByNywgIHI0LCAgcjUKK1QgICAgICAgbXVsICAgICAgICAgICAgIHI3LCAgcjQsICByNQorVCAgICAgICBjbXAgICAgICAgICAgICAgcjcsICAjMAorICAgICAgICByc2IgICAgICAgICAgICAgcjYsICByNywgIHI1LCAgbHNsICMzCisgICAgICAgIHJzYiAgICAgICAgICAgICByMTIsIHI3LCAgcjQsICBsc2wgIzMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHI0LCAgcjcsICByNCwgIGxzbCAjMworICAgICAgICBzdWIgICAgICAgICAgICAgcjQsICByNCwgIHI1LCAgbHNsICMzCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIHI0LCAgIzY0CisKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQwLCAgcjQKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQxLCAgcjEyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDR9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQyLCAgcjYKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQzLCAgcjcKKworICAgICAgICB2ZXh0LjggICAgICAgICAgZDUsICBkNCwgIGQ1LCAgIzEKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQ0LCAgZDUKKworICAgICAgICB2dHJuLjMyICAgICAgICAgZDAsICBkMQorICAgICAgICB2dHJuLjMyICAgICAgICAgZDIsICBkMworCisxOiAgICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ3LCAgZDYsICBkNywgICMxCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkNiwgIGQ3CisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOCwgIGQ0LCAgZDAKKyAgICAgICAgdm1sYWwudTggICAgICAgIHE4LCAgZDYsICBkMgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0fSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZleHQuOCAgICAgICAgICBkNSwgIGQ0LCAgZDUsICAjMQorICAgICAgICB2dHJuLjMyICAgICAgICAgZDQsICBkNQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICB2bXVsbC51OCAgICAgICAgcTksICBkNiwgIGQwCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxOSwgIGQ0LCAgZDIKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQxNiwgZDE2LCBkMTcKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQxNywgZDE4LCBkMTkKKyAgLmlmYyBcY29kZWMsaDI2NAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDE2LCBxOCwgICM2CisgIC5lbHNlCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxOCwgIHE4LCAgcTExCisgICAgICAgIHZzaHJuLnUxNiAgICAgICBkMTYsIHE4LCAgIzYKKyAgLmVuZGlmCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMSwgcjJdCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDIwWzBdfSwgW2xyLDozMl0sIHIyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDIwWzFdfSwgW2xyLDozMl0sIHIyCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMTYsIGQxNiwgZDIwCisgIC5lbmRpZgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxNlswXX0sIFtyMCw6MzJdLCByMgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxNlsxXX0sIFtyMCw6MzJdLCByMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI3LCBwY30KKworMjogICAgICBhZGRzICAgICAgICAgICAgcjEyLCByMTIsIHI2CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMCwgIHI0CisgICAgICAgIGJlcSAgICAgICAgICAgICA1ZgorICAgICAgICB0c3QgICAgICAgICAgICAgcjYsICByNgorICAgICAgICB2ZHVwLjggICAgICAgICAgZDEsICByMTIKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQwLCAgZDEKKworICAgICAgICBiZXEgICAgICAgICAgICAgNGYKKworICAgICAgICB2ZXh0LjMyICAgICAgICAgZDEsICBkMCwgIGQxLCAgIzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNFswXX0sICBbcjFdLCByMgorCiszOiAgICAgIHZsZDEuMzIgICAgICAgICB7ZDRbMV19LCAgW3IxXSwgcjIKKyAgICAgICAgdm11bGwudTggICAgICAgIHE4LCAgZDQsICBkMAorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0WzBdfSwgIFtyMV0sIHIyCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOSwgIGQ0LCAgZDEKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQxNiwgZDE2LCBkMTcKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQxNywgZDE4LCBkMTkKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgLmlmYyBcY29kZWMsaDI2NAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDE2LCBxOCwgICM2CisgIC5lbHNlCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxOCwgIHE4LCAgcTExCisgICAgICAgIHZzaHJuLnUxNiAgICAgICBkMTYsIHE4LCAgIzYKKyAgLmVuZGlmCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDIwWzBdfSwgW2xyLDozMl0sIHIyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDIwWzFdfSwgW2xyLDozMl0sIHIyCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMTYsIGQxNiwgZDIwCisgIC5lbmRpZgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjEsIHIyXQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxNlswXX0sIFtyMCw6MzJdLCByMgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxNlsxXX0sIFtyMCw6MzJdLCByMgorICAgICAgICBiZ3QgICAgICAgICAgICAgM2IKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI3LCBwY30KKworNDogICAgICB2bGQxLjggICAgICAgICAge2Q0fSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ1LCAgZDQsICBkNSwgICMxCisgICAgICAgIHZleHQuOCAgICAgICAgICBkNywgIGQ2LCAgZDcsICAjMQorICAgICAgICB2dHJuLjMyICAgICAgICAgZDQsICBkNQorICAgICAgICB2dHJuLjMyICAgICAgICAgZDYsICBkNworICAgICAgICB2bXVsbC51OCAgICAgICAgcTgsICBkNCwgIGQwCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOSwgIGQ2LCAgZDAKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICB2YWRkLmkxNiAgICAgICAgZDE2LCBkMTYsIGQxNworICAgICAgICB2YWRkLmkxNiAgICAgICAgZDE3LCBkMTgsIGQxOQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAuaWZjIFxjb2RlYyxoMjY0CisgICAgICAgIHZyc2hybi51MTYgICAgICBkMTYsIHE4LCAgIzYKKyAgLmVsc2UKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHE4LCAgcTgsICBxMTEKKyAgICAgICAgdnNocm4udTE2ICAgICAgIGQxNiwgcTgsICAjNgorICAuZW5kaWYKKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjBbMF19LCBbbHIsOjMyXSwgcjIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjBbMV19LCBbbHIsOjMyXSwgcjIKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQxNiwgZDE2LCBkMjAKKyAgLmVuZGlmCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE2WzBdfSwgW3IwLDozMl0sIHIyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE2WzFdfSwgW3IwLDozMl0sIHIyCisgICAgICAgIGJndCAgICAgICAgICAgICA0YgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjcsIHBjfQorCis1OiAgICAgIHZsZDEuMzIgICAgICAgICB7ZDRbMF19LCAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNFsxXX0sICBbcjFdLCByMgorICAgICAgICB2bXVsbC51OCAgICAgICAgcTgsICBkNCwgIGQwCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgLmlmYyBcY29kZWMsaDI2NAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDE2LCBxOCwgICM2CisgIC5lbHNlCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxOCwgIHE4LCAgcTExCisgICAgICAgIHZzaHJuLnUxNiAgICAgICBkMTYsIHE4LCAgIzYKKyAgLmVuZGlmCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDIwWzBdfSwgW2xyLDozMl0sIHIyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDIwWzFdfSwgW2xyLDozMl0sIHIyCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMTYsIGQxNiwgZDIwCisgIC5lbmRpZgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxNlswXX0sIFtyMCw6MzJdLCByMgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxNlsxXX0sIFtyMCw6MzJdLCByMgorICAgICAgICBiZ3QgICAgICAgICAgICAgNWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI3LCBwY30KK2VuZGZ1bmMKKy5lbmRtCisKKy5tYWNybyAgaDI2NF9jaHJvbWFfbWMyIHR5cGUKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfY2hyb21hX21jMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI2LCBscn0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMTZdCisgICAgICAgIGxkciAgICAgICAgICAgICBsciwgIFtzcCwgIzIwXQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KKyAgICAgICAgb3JycyAgICAgICAgICAgIHI1LCAgcjQsICBscgorICAgICAgICBiZXEgICAgICAgICAgICAgMmYKKworICAgICAgICBtdWwgICAgICAgICAgICAgcjUsICByNCwgIGxyCisgICAgICAgIHJzYiAgICAgICAgICAgICByNiwgIHI1LCAgbHIsICBsc2wgIzMKKyAgICAgICAgcnNiICAgICAgICAgICAgIHIxMiwgcjUsICByNCwgIGxzbCAjMworICAgICAgICBzdWIgICAgICAgICAgICAgcjQsICByNSwgIHI0LCAgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICByNCwgIHI0LCAgbHIsICBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgcjQsICAjNjQKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQwLCAgcjQKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQyLCAgcjEyCisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMSwgIHI2CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMywgIHI1CisgICAgICAgIHZ0cm4uMTYgICAgICAgICBxMCwgIHExCisxOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0WzBdfSwgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDRbMV19LCAgW3IxXSwgcjIKKyAgICAgICAgdnJldjY0LjMyICAgICAgIGQ1LCAgZDQKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNVsxXX0sICBbcjFdCisgICAgICAgIHZleHQuOCAgICAgICAgICBxMywgIHEyLCAgcTIsICAjMQorICAgICAgICB2dHJuLjE2ICAgICAgICAgcTIsICBxMworICAgICAgICB2bXVsbC51OCAgICAgICAgcTgsICBkNCwgIGQwCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxOCwgIGQ1LCAgZDEKKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMThbMF19LCBbcjAsOjE2XSwgcjIKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMThbMV19LCBbcjAsOjE2XQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgIC5lbmRpZgorICAgICAgICB2dHJuLjMyICAgICAgICAgZDE2LCBkMTcKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQxNiwgZDE2LCBkMTcKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQxNiwgcTgsICAjNgorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICB2cmhhZGQudTggICAgICAgZDE2LCBkMTYsIGQxOAorICAuZW5kaWYKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTZbMF19LCBbcjAsOjE2XSwgcjIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTZbMV19LCBbcjAsOjE2XSwgcjIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNiwgcGN9CisyOgorICAuaWZjIFx0eXBlLHB1dAorICAgICAgICBsZHJoX3Bvc3QgICAgICAgcjUsICByMSwgIHIyCisgICAgICAgIHN0cmhfcG9zdCAgICAgICByNSwgIHIwLCAgcjIKKyAgICAgICAgbGRyaF9wb3N0ICAgICAgIHI2LCAgcjEsICByMgorICAgICAgICBzdHJoX3Bvc3QgICAgICAgcjYsICByMCwgIHIyCisgIC5lbHNlCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE2WzBdfSwgW3IxXSwgcjIKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTZbMV19LCBbcjFdLCByMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxOFswXX0sIFtyMCw6MTZdLCByMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxOFsxXX0sIFtyMCw6MTZdCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQxNiwgZDE2LCBkMTgKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTZbMF19LCBbcjAsOjE2XSwgcjIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTZbMV19LCBbcjAsOjE2XSwgcjIKKyAgLmVuZGlmCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDJiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjYsIHBjfQorZW5kZnVuYworLmVuZG0KKworICAgICAgICBoMjY0X2Nocm9tYV9tYzggcHV0CisgICAgICAgIGgyNjRfY2hyb21hX21jOCBhdmcKKyAgICAgICAgaDI2NF9jaHJvbWFfbWM0IHB1dAorICAgICAgICBoMjY0X2Nocm9tYV9tYzQgYXZnCisgICAgICAgIGgyNjRfY2hyb21hX21jMiBwdXQKKyAgICAgICAgaDI2NF9jaHJvbWFfbWMyIGF2ZworCisjaWYgQ09ORklHX1JWNDBfREVDT0RFUgorY29uc3QgICBydjQwYmlhcworICAgICAgICAuc2hvcnQgICAgICAgICAgIDAsIDE2LCAzMiwgMTYKKyAgICAgICAgLnNob3J0ICAgICAgICAgIDMyLCAyOCwgMzIsIDI4CisgICAgICAgIC5zaG9ydCAgICAgICAgICAgMCwgMzIsIDE2LCAzMgorICAgICAgICAuc2hvcnQgICAgICAgICAgMzIsIDI4LCAzMiwgMjgKK2VuZGNvbnN0CisKKyAgICAgICAgaDI2NF9jaHJvbWFfbWM4IHB1dCwgcnY0MAorICAgICAgICBoMjY0X2Nocm9tYV9tYzggYXZnLCBydjQwCisgICAgICAgIGgyNjRfY2hyb21hX21jNCBwdXQsIHJ2NDAKKyAgICAgICAgaDI2NF9jaHJvbWFfbWM0IGF2ZywgcnY0MAorI2VuZGlmCisKKyNpZiBDT05GSUdfVkMxX0RFQ09ERVIKKyAgICAgICAgaDI2NF9jaHJvbWFfbWM4IHB1dCwgdmMxCisgICAgICAgIGgyNjRfY2hyb21hX21jOCBhdmcsIHZjMQorICAgICAgICBoMjY0X2Nocm9tYV9tYzQgcHV0LCB2YzEKKyAgICAgICAgaDI2NF9jaHJvbWFfbWM0IGF2ZywgdmMxCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0ZHNwX2luaXRfYXJtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaDI2NGRzcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZGZkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaDI2NGRzcF9pbml0X2FybS5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9oMjY0ZHNwLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hcm0vc3RhcnRjb2RlLmgiCisKK3ZvaWQgZmZfaDI2NF92X2xvb3BfZmlsdGVyX2x1bWFfbmVvbih1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmV0YSwgaW50OF90ICp0YzApOwordm9pZCBmZl9oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9uZW9uKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXRhLCBpbnQ4X3QgKnRjMCk7Cit2b2lkIGZmX2gyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWFfbmVvbih1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXRhLCBpbnQ4X3QgKnRjMCk7Cit2b2lkIGZmX2gyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfbmVvbih1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXRhLCBpbnQ4X3QgKnRjMCk7CisKK3ZvaWQgZmZfd2VpZ2h0X2gyNjRfcGl4ZWxzXzE2X25lb24odWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW4sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpOwordm9pZCBmZl93ZWlnaHRfaDI2NF9waXhlbHNfOF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW4sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpOwordm9pZCBmZl93ZWlnaHRfaDI2NF9waXhlbHNfNF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW4sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpOworCit2b2lkIGZmX2Jpd2VpZ2h0X2gyNjRfcGl4ZWxzXzE2X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGxvZzJfZGVuLCBpbnQgd2VpZ2h0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0cywgaW50IG9mZnNldCk7Cit2b2lkIGZmX2Jpd2VpZ2h0X2gyNjRfcGl4ZWxzXzhfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBsb2cyX2RlbiwgaW50IHdlaWdodGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0cywgaW50IG9mZnNldCk7Cit2b2lkIGZmX2Jpd2VpZ2h0X2gyNjRfcGl4ZWxzXzRfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBsb2cyX2RlbiwgaW50IHdlaWdodGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0cywgaW50IG9mZnNldCk7CisKK3ZvaWQgZmZfaDI2NF9pZGN0X2FkZF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpOwordm9pZCBmZl9oMjY0X2lkY3RfZGNfYWRkX25lb24odWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSk7Cit2b2lkIGZmX2gyNjRfaWRjdF9hZGQxNl9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgaW50ICpibG9ja19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5uemNbNio4XSk7Cit2b2lkIGZmX2gyNjRfaWRjdF9hZGQxNmludHJhX25lb24odWludDhfdCAqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5uemNbNio4XSk7Cit2b2lkIGZmX2gyNjRfaWRjdF9hZGQ4X25lb24odWludDhfdCAqKmRlc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2KjhdKTsKKwordm9pZCBmZl9oMjY0X2lkY3Q4X2FkZF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpOwordm9pZCBmZl9oMjY0X2lkY3Q4X2RjX2FkZF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpOwordm9pZCBmZl9oMjY0X2lkY3Q4X2FkZDRfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYqOF0pOworCitzdGF0aWMgYXZfY29sZCB2b2lkIGgyNjRkc3BfaW5pdF9uZW9uKEgyNjREU1BDb250ZXh0ICpjLCBjb25zdCBpbnQgYml0X2RlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hyb21hX2Zvcm1hdF9pZGMpCit7CisjaWYgSEFWRV9ORU9OCisgICAgaWYgKGJpdF9kZXB0aCA9PSA4KSB7CisgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hICAgPSBmZl9oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYV9uZW9uOworICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYSAgID0gZmZfaDI2NF9oX2xvb3BfZmlsdGVyX2x1bWFfbmVvbjsKKyAgICAgICAgaWYoY2hyb21hX2Zvcm1hdF9pZGMgPT0gMSl7CisgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWEgPSBmZl9oMjY0X3ZfbG9vcF9maWx0ZXJfY2hyb21hX25lb247CisgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWEgPSBmZl9oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hX25lb247CisgICAgICAgIH0KKworICAgICAgICBjLT53ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzBdID0gZmZfd2VpZ2h0X2gyNjRfcGl4ZWxzXzE2X25lb247CisgICAgICAgIGMtPndlaWdodF9oMjY0X3BpeGVsc190YWJbMV0gPSBmZl93ZWlnaHRfaDI2NF9waXhlbHNfOF9uZW9uOworICAgICAgICBjLT53ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzJdID0gZmZfd2VpZ2h0X2gyNjRfcGl4ZWxzXzRfbmVvbjsKKworICAgICAgICBjLT5iaXdlaWdodF9oMjY0X3BpeGVsc190YWJbMF0gPSBmZl9iaXdlaWdodF9oMjY0X3BpeGVsc18xNl9uZW9uOworICAgICAgICBjLT5iaXdlaWdodF9oMjY0X3BpeGVsc190YWJbMV0gPSBmZl9iaXdlaWdodF9oMjY0X3BpeGVsc184X25lb247CisgICAgICAgIGMtPmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlsyXSA9IGZmX2Jpd2VpZ2h0X2gyNjRfcGl4ZWxzXzRfbmVvbjsKKworICAgICAgICBjLT5oMjY0X2lkY3RfYWRkICAgICAgICA9IGZmX2gyNjRfaWRjdF9hZGRfbmVvbjsKKyAgICAgICAgYy0+aDI2NF9pZGN0X2RjX2FkZCAgICAgPSBmZl9oMjY0X2lkY3RfZGNfYWRkX25lb247CisgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQxNiAgICAgID0gZmZfaDI2NF9pZGN0X2FkZDE2X25lb247CisgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQxNmludHJhID0gZmZfaDI2NF9pZGN0X2FkZDE2aW50cmFfbmVvbjsKKyAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpCisgICAgICAgICAgICBjLT5oMjY0X2lkY3RfYWRkOCAgID0gZmZfaDI2NF9pZGN0X2FkZDhfbmVvbjsKKyAgICAgICAgYy0+aDI2NF9pZGN0OF9hZGQgICAgICAgPSBmZl9oMjY0X2lkY3Q4X2FkZF9uZW9uOworICAgICAgICBjLT5oMjY0X2lkY3Q4X2RjX2FkZCAgICA9IGZmX2gyNjRfaWRjdDhfZGNfYWRkX25lb247CisgICAgICAgIGMtPmgyNjRfaWRjdDhfYWRkNCAgICAgID0gZmZfaDI2NF9pZGN0OF9hZGQ0X25lb247CisgICAgfQorI2VuZGlmIC8vIEhBVkVfTkVPTgorfQorCithdl9jb2xkIHZvaWQgZmZfaDI2NGRzcF9pbml0X2FybShIMjY0RFNQQ29udGV4dCAqYywgY29uc3QgaW50IGJpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaHJvbWFfZm9ybWF0X2lkYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisjaWYgSEFWRV9BUk1WNgorICAgIGlmIChoYXZlX3NldGVuZChjcHVfZmxhZ3MpKQorICAgICAgICBjLT5zdGFydGNvZGVfZmluZF9jYW5kaWRhdGUgPSBmZl9zdGFydGNvZGVfZmluZF9jYW5kaWRhdGVfYXJtdjY7CisjZW5kaWYKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpCisgICAgICAgIGgyNjRkc3BfaW5pdF9uZW9uKGMsIGJpdF9kZXB0aCwgY2hyb21hX2Zvcm1hdF9pZGMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2gyNjRkc3BfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2gyNjRkc3BfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NGE1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaDI2NGRzcF9uZW9uLlMKQEAgLTAsMCArMSw1NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorI2luY2x1ZGUgIm5lb24uUyIKKworICAgICAgICAvKiBILjI2NCBsb29wIGZpbHRlciAqLworCisubWFjcm8gIGgyNjRfbG9vcF9maWx0ZXJfc3RhcnQKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorICAgICAgICB0c3QgICAgICAgICAgICAgcjIsICByMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbcjEyXQorICAgICAgICBpdCAgICAgICAgICAgICAgbmUKKyAgICAgICAgdHN0bmUgICAgICAgICAgIHIzLCAgcjMKKyAgICAgICAgdm1vdi4zMiAgICAgICAgIGQyNFswXSwgcjEyCisgICAgICAgIGFuZCAgICAgICAgICAgICByMTIsIHIxMiwgcjEyLCBsc2wgIzE2CisgICAgICAgIGl0ICAgICAgICAgICAgICBlcQorICAgICAgICBieGVxICAgICAgICAgICAgbHIKKyAgICAgICAgYW5kcyAgICAgICAgICAgIHIxMiwgcjEyLCByMTIsIGxzbCAjOAorICAgICAgICBpdCAgICAgICAgICAgICAgbHQKKyAgICAgICAgYnhsdCAgICAgICAgICAgIGxyCisuZW5kbQorCisubWFjcm8gIGgyNjRfbG9vcF9maWx0ZXJfbHVtYQorICAgICAgICB2ZHVwLjggICAgICAgICAgcTExLCByMiAgICAgICAgIEAgYWxwaGEKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMiwgZDI0CisgICAgICAgIHZhYmQudTggICAgICAgICBxNiwgIHE4LCAgcTAgICAgQCBhYnMocDAgLSBxMCkKKyAgICAgICAgdm1vdmwudTE2ICAgICAgIHExMiwgZDI0CisgICAgICAgIHZhYmQudTggICAgICAgICBxMTQsIHE5LCAgcTggICAgQCBhYnMocDEgLSBwMCkKKyAgICAgICAgdnNsaS4xNiAgICAgICAgIHExMiwgcTEyLCAjOAorICAgICAgICB2YWJkLnU4ICAgICAgICAgcTE1LCBxMSwgIHEwICAgIEAgYWJzKHExIC0gcTApCisgICAgICAgIHZzbGkuMzIgICAgICAgICBxMTIsIHExMiwgIzE2CisgICAgICAgIHZjbHQudTggICAgICAgICBxNiwgIHE2LCAgcTExICAgQCA8IGFscGhhCisgICAgICAgIHZkdXAuOCAgICAgICAgICBxMTEsIHIzICAgICAgICAgQCBiZXRhCisgICAgICAgIHZjbHQuczggICAgICAgICBxNywgIHExMiwgIzAKKyAgICAgICAgdmNsdC51OCAgICAgICAgIHExNCwgcTE0LCBxMTEgICBAIDwgYmV0YQorICAgICAgICB2Y2x0LnU4ICAgICAgICAgcTE1LCBxMTUsIHExMSAgIEAgPCBiZXRhCisgICAgICAgIHZiaWMgICAgICAgICAgICBxNiwgIHE2LCAgcTcKKyAgICAgICAgdmFiZC51OCAgICAgICAgIHE0LCAgcTEwLCBxOCAgICBAIGFicyhwMiAtIHAwKQorICAgICAgICB2YW5kICAgICAgICAgICAgcTYsICBxNiwgIHExNAorICAgICAgICB2YWJkLnU4ICAgICAgICAgcTUsICBxMiwgIHEwICAgIEAgYWJzKHEyIC0gcTApCisgICAgICAgIHZjbHQudTggICAgICAgICBxNCwgIHE0LCAgcTExICAgQCA8IGJldGEKKyAgICAgICAgdmFuZCAgICAgICAgICAgIHE2LCAgcTYsICBxMTUKKyAgICAgICAgdmNsdC51OCAgICAgICAgIHE1LCAgcTUsICBxMTEgICBAIDwgYmV0YQorICAgICAgICB2YW5kICAgICAgICAgICAgcTQsICBxNCwgIHE2CisgICAgICAgIHZhbmQgICAgICAgICAgICBxNSwgIHE1LCAgcTYKKyAgICAgICAgdmFuZCAgICAgICAgICAgIHExMiwgcTEyLCBxNgorICAgICAgICB2cmhhZGQudTggICAgICAgcTE0LCBxOCwgIHEwCisgICAgICAgIHZzdWIuaTggICAgICAgICBxNiwgIHExMiwgcTQKKyAgICAgICAgdnFhZGQudTggICAgICAgIHE3LCAgcTksICBxMTIKKyAgICAgICAgdmhhZGQudTggICAgICAgIHExMCwgcTEwLCBxMTQKKyAgICAgICAgdnN1Yi5pOCAgICAgICAgIHE2LCAgcTYsICBxNQorICAgICAgICB2aGFkZC51OCAgICAgICAgcTE0LCBxMiwgIHExNAorICAgICAgICB2bWluLnU4ICAgICAgICAgcTcsICBxNywgIHExMAorICAgICAgICB2cXN1Yi51OCAgICAgICAgcTExLCBxOSwgIHExMgorICAgICAgICB2cWFkZC51OCAgICAgICAgcTIsICBxMSwgIHExMgorICAgICAgICB2bWF4LnU4ICAgICAgICAgcTcsICBxNywgIHExMQorICAgICAgICB2cXN1Yi51OCAgICAgICAgcTExLCBxMSwgIHExMgorICAgICAgICB2bWluLnU4ICAgICAgICAgcTE0LCBxMiwgIHExNAorICAgICAgICB2bW92bC51OCAgICAgICAgcTIsICBkMAorICAgICAgICB2bWF4LnU4ICAgICAgICAgcTE0LCBxMTQsIHExMQorICAgICAgICB2bW92bC51OCAgICAgICAgcTEwLCBkMQorICAgICAgICB2c3Vidy51OCAgICAgICAgcTIsICBxMiwgIGQxNgorICAgICAgICB2c3Vidy51OCAgICAgICAgcTEwLCBxMTAsIGQxNworICAgICAgICB2c2hsLmkxNiAgICAgICAgcTIsICBxMiwgICMyCisgICAgICAgIHZzaGwuaTE2ICAgICAgICBxMTAsIHExMCwgIzIKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEyLCAgcTIsICBkMTgKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExMCwgcTEwLCBkMTkKKyAgICAgICAgdnN1YncudTggICAgICAgIHEyLCAgcTIsICBkMgorICAgICAgICB2c3Vidy51OCAgICAgICAgcTEwLCBxMTAsIGQzCisgICAgICAgIHZyc2hybi5pMTYgICAgICBkNCwgIHEyLCAgIzMKKyAgICAgICAgdnJzaHJuLmkxNiAgICAgIGQ1LCAgcTEwLCAjMworICAgICAgICB2YnNsICAgICAgICAgICAgcTQsICBxNywgIHE5CisgICAgICAgIHZic2wgICAgICAgICAgICBxNSwgIHExNCwgcTEKKyAgICAgICAgdm5lZy5zOCAgICAgICAgIHE3LCAgcTYKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExNCwgZDE2CisgICAgICAgIHZtaW4uczggICAgICAgICBxMiwgIHEyLCAgcTYKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE2LCAgZDE3CisgICAgICAgIHZtYXguczggICAgICAgICBxMiwgIHEyLCAgcTcKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMSwgZDAKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMiwgZDEKKyAgICAgICAgdmFkZHcuczggICAgICAgIHExNCwgcTE0LCBkNAorICAgICAgICB2YWRkdy5zOCAgICAgICAgcTYsICBxNiwgIGQ1CisgICAgICAgIHZzdWJ3LnM4ICAgICAgICBxMTEsIHExMSwgZDQKKyAgICAgICAgdnN1YncuczggICAgICAgIHExMiwgcTEyLCBkNQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDE2LCBxMTQKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQxNywgcTYKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQwLCAgcTExCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMSwgIHExMgorLmVuZG0KKworZnVuY3Rpb24gZmZfaDI2NF92X2xvb3BfZmlsdGVyX2x1bWFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgaDI2NF9sb29wX2ZpbHRlcl9zdGFydAorCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDAsIGQxfSwgIFtyMCw6MTI4XSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMiwgZDN9LCAgW3IwLDoxMjhdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0LCBkNX0sICBbcjAsOjEyOF0sIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjAsZDIxfSwgW3IwLDoxMjhdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxOCxkMTl9LCBbcjAsOjEyOF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2LGQxN30sIFtyMCw6MTI4XSwgcjEKKworICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKworICAgICAgICBoMjY0X2xvb3BfZmlsdGVyX2x1bWEKKworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkOCwgZDl9LCAgW3IwLDoxMjhdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxNixkMTd9LCBbcjAsOjEyOF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDAsIGQxfSwgIFtyMCw6MTI4XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTAsZDExfSwgW3IwLDoxMjhdCisKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBoMjY0X2xvb3BfZmlsdGVyX3N0YXJ0CisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjNAorICAgICAgICB2bGQxLjggICAgICAgICAge2Q2fSwgIFtyMF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIwfSwgW3IwXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTh9LCBbcjBdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxNn0sIFtyMF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCAgW3IwXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMn0sICBbcjBdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0fSwgIFtyMF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI2fSwgW3IwXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkN30sICBbcjBdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMX0sIFtyMF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE5fSwgW3IwXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTd9LCBbcjBdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxfSwgIFtyMF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCAgW3IwXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNX0sICBbcjBdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyN30sIFtyMF0sIHIxCisKKyAgICAgICAgdHJhbnNwb3NlXzh4OCAgIHEzLCBxMTAsIHE5LCBxOCwgcTAsIHExLCBxMiwgcTEzCisKKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisKKyAgICAgICAgaDI2NF9sb29wX2ZpbHRlcl9sdW1hCisKKyAgICAgICAgdHJhbnNwb3NlXzR4NCAgIHE0LCBxOCwgcTAsIHE1CisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkOFswXX0sICBbcjBdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxNlswXX0sIFtyMF0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCAgW3IwXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTBbMF19LCBbcjBdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q4WzFdfSwgIFtyMF0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE2WzFdfSwgW3IwXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMFsxXX0sICBbcjBdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxMFsxXX0sIFtyMF0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDlbMF19LCAgW3IwXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTdbMF19LCBbcjBdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxWzBdfSwgIFtyMF0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDExWzBdfSwgW3IwXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkOVsxXX0sICBbcjBdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxN1sxXX0sIFtyMF0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMV19LCAgW3IwXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTFbMV19LCBbcjBdLCByMQorCisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworLm1hY3JvICBoMjY0X2xvb3BfZmlsdGVyX2Nocm9tYQorICAgICAgICB2ZHVwLjggICAgICAgICAgZDIyLCByMiAgICAgICAgIEAgYWxwaGEKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMiwgZDI0CisgICAgICAgIHZhYmQudTggICAgICAgICBkMjYsIGQxNiwgZDAgICAgQCBhYnMocDAgLSBxMCkKKyAgICAgICAgdm1vdmwudTggICAgICAgIHEyLCAgZDAKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQyOCwgZDE4LCBkMTYgICBAIGFicyhwMSAtIHAwKQorICAgICAgICB2c3Vidy51OCAgICAgICAgcTIsICBxMiwgIGQxNgorICAgICAgICB2c2xpLjE2ICAgICAgICAgZDI0LCBkMjQsICM4CisgICAgICAgIHZzaGwuaTE2ICAgICAgICBxMiwgIHEyLCAgIzIKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQzMCwgZDIsICBkMCAgICBAIGFicyhxMSAtIHEwKQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTIsICBxMiwgIGQxOAorICAgICAgICB2Y2x0LnU4ICAgICAgICAgZDI2LCBkMjYsIGQyMiAgIEAgPCBhbHBoYQorICAgICAgICB2c3Vidy51OCAgICAgICAgcTIsICBxMiwgIGQyCisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMjIsIHIzICAgICAgICAgQCBiZXRhCisgICAgICAgIHZyc2hybi5pMTYgICAgICBkNCwgIHEyLCAgIzMKKyAgICAgICAgdmNsdC51OCAgICAgICAgIGQyOCwgZDI4LCBkMjIgICBAIDwgYmV0YQorICAgICAgICB2Y2x0LnU4ICAgICAgICAgZDMwLCBkMzAsIGQyMiAgIEAgPCBiZXRhCisgICAgICAgIHZtaW4uczggICAgICAgICBkNCwgIGQ0LCAgZDI0CisgICAgICAgIHZuZWcuczggICAgICAgICBkMjUsIGQyNAorICAgICAgICB2YW5kICAgICAgICAgICAgZDI2LCBkMjYsIGQyOAorICAgICAgICB2bWF4LnM4ICAgICAgICAgZDQsICBkNCwgIGQyNQorICAgICAgICB2YW5kICAgICAgICAgICAgZDI2LCBkMjYsIGQzMAorICAgICAgICB2bW92bC51OCAgICAgICAgcTExLCBkMAorICAgICAgICB2YW5kICAgICAgICAgICAgZDQsICBkNCwgIGQyNgorICAgICAgICB2bW92bC51OCAgICAgICAgcTE0LCBkMTYKKyAgICAgICAgdmFkZHcuczggICAgICAgIHExNCwgcTE0LCBkNAorICAgICAgICB2c3Vidy5zOCAgICAgICAgcTExLCBxMTEsIGQ0CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMTYsIHExNAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxMTEKKy5lbmRtCisKK2Z1bmN0aW9uIGZmX2gyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgaDI2NF9sb29wX2ZpbHRlcl9zdGFydAorCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxOH0sIFtyMCw6NjRdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxNn0sIFtyMCw6NjRdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QwfSwgIFtyMCw6NjRdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyfSwgIFtyMCw6NjRdCisKKyAgICAgICAgaDI2NF9sb29wX2ZpbHRlcl9jaHJvbWEKKworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTZ9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICBbcjAsOjY0XSwgcjEKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfaDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBoMjY0X2xvb3BfZmlsdGVyX3N0YXJ0CisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjMgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxOFswXX0sIFtyMF0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE2WzBdfSwgW3IwXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMFswXX0sICBbcjBdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyWzBdfSwgIFtyMF0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE4WzFdfSwgW3IwXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTZbMV19LCBbcjBdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwWzFdfSwgIFtyMF0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDJbMV19LCAgW3IwXSwgcjEKKworICAgICAgICB2dHJuLjE2ICAgICAgICAgZDE4LCBkMAorICAgICAgICB2dHJuLjE2ICAgICAgICAgZDE2LCBkMgorICAgICAgICB2dHJuLjggICAgICAgICAgZDE4LCBkMTYKKyAgICAgICAgdnRybi44ICAgICAgICAgIGQwLCAgZDIKKworICAgICAgICBoMjY0X2xvb3BfZmlsdGVyX2Nocm9tYQorCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBkMTgsIGQwCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBkMTYsIGQyCisgICAgICAgIHZ0cm4uOCAgICAgICAgICBkMTgsIGQxNgorICAgICAgICB2dHJuLjggICAgICAgICAgZDAsICBkMgorCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMworICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOFswXX0sIFtyMF0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE2WzBdfSwgW3IwXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMFswXX0sICBbcjBdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSwgIFtyMF0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE4WzFdfSwgW3IwXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTZbMV19LCBbcjBdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwWzFdfSwgIFtyMF0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMV19LCAgW3IwXSwgcjEKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworQCBCaXdlaWdodGVkIHByZWRpY3Rpb24KKworLm1hY3JvICBiaXdlaWdodF8xNiAgICAgbWFjcywgbWFjZAorICAgICAgICB2ZHVwLjggICAgICAgICAgZDAsICByNAorICAgICAgICB2ZHVwLjggICAgICAgICAgZDEsICByNQorICAgICAgICB2bW92ICAgICAgICAgICAgcTIsICBxOAorICAgICAgICB2bW92ICAgICAgICAgICAgcTMsICBxOAorMTogICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIwLWQyMX0sW3IwLDoxMjhdLCByMgorICAgICAgICBcbWFjZCAgICAgICAgICAgcTIsICBkMCwgIGQyMAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IwXQorICAgICAgICBcbWFjZCAgICAgICAgICAgcTMsICBkMCwgIGQyMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMi1kMjN9LFtyMSw6MTI4XSwgcjIKKyAgICAgICAgXG1hY3MgICAgICAgICAgIHEyLCAgZDEsICBkMjIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgXG1hY3MgICAgICAgICAgIHEzLCAgZDEsICBkMjMKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHExMiwgcTgKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjgtZDI5fSxbcjAsOjEyOF0sIHIyCisgICAgICAgIHZtb3YgICAgICAgICAgICBxMTMsIHE4CisgICAgICAgIFxtYWNkICAgICAgICAgICBxMTIsIGQwLCAgZDI4CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjBdCisgICAgICAgIFxtYWNkICAgICAgICAgICBxMTMsIGQwLCAgZDI5CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDMwLWQzMX0sW3IxLDoxMjhdLCByMgorICAgICAgICBcbWFjcyAgICAgICAgICAgcTEyLCBkMSwgIGQzMAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBcbWFjcyAgICAgICAgICAgcTEzLCBkMSwgIGQzMQorICAgICAgICB2c2hsLnMxNiAgICAgICAgcTIsICBxMiwgIHE5CisgICAgICAgIHZzaGwuczE2ICAgICAgICBxMywgIHEzLCAgcTkKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ0LCAgcTIKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ1LCAgcTMKKyAgICAgICAgdnNobC5zMTYgICAgICAgIHExMiwgcTEyLCBxOQorICAgICAgICB2c2hsLnMxNiAgICAgICAgcTEzLCBxMTMsIHE5CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMjQsIHExMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDI1LCBxMTMKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHEzLCAgcTgKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNC0gZDV9LCBbcjYsOjEyOF0sIHIyCisgICAgICAgIHZtb3YgICAgICAgICAgICBxMiwgIHE4CisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI0LWQyNX0sW3I2LDoxMjhdLCByMgorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNiwgcGN9CisuZW5kbQorCisubWFjcm8gIGJpd2VpZ2h0XzggICAgICBtYWNzLCBtYWNkCisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMCwgIHI0CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMSwgIHI1CisgICAgICAgIHZtb3YgICAgICAgICAgICBxMSwgIHE4CisgICAgICAgIHZtb3YgICAgICAgICAgICBxMTAsIHE4CisxOiAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNH0sW3IwLDo2NF0sIHIyCisgICAgICAgIFxtYWNkICAgICAgICAgICBxMSwgIGQwLCAgZDQKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMF0KKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNX0sW3IxLDo2NF0sIHIyCisgICAgICAgIFxtYWNzICAgICAgICAgICBxMSwgIGQxLCAgZDUKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNn0sW3IwLDo2NF0sIHIyCisgICAgICAgIFxtYWNkICAgICAgICAgICBxMTAsIGQwLCAgZDYKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMF0KKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkN30sW3IxLDo2NF0sIHIyCisgICAgICAgIFxtYWNzICAgICAgICAgICBxMTAsIGQxLCAgZDcKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgdnNobC5zMTYgICAgICAgIHExLCAgcTEsICBxOQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIsICBxMQorICAgICAgICB2c2hsLnMxNiAgICAgICAgcTEwLCBxMTAsIHE5CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNCwgIHExMAorICAgICAgICB2bW92ICAgICAgICAgICAgcTEwLCBxOAorICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSxbcjYsOjY0XSwgcjIKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHExLCAgcTgKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNH0sW3I2LDo2NF0sIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI2LCBwY30KKy5lbmRtCisKKy5tYWNybyAgYml3ZWlnaHRfNCAgICAgIG1hY3MsIG1hY2QKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQwLCAgcjQKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQxLCAgcjUKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHExLCAgcTgKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHExMCwgcTgKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjNAorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0WzBdfSxbcjAsOjMyXSwgcjIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNFsxXX0sW3IwLDozMl0sIHIyCisgICAgICAgIFxtYWNkICAgICAgICAgICBxMSwgIGQwLCAgZDQKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMF0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNVswXX0sW3IxLDozMl0sIHIyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDVbMV19LFtyMSw6MzJdLCByMgorICAgICAgICBcbWFjcyAgICAgICAgICAgcTEsICBkMSwgIGQ1CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIGJsdCAgICAgICAgICAgICAyZgorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q2WzBdfSxbcjAsOjMyXSwgcjIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNlsxXX0sW3IwLDozMl0sIHIyCisgICAgICAgIFxtYWNkICAgICAgICAgICBxMTAsIGQwLCAgZDYKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMF0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkN1swXX0sW3IxLDozMl0sIHIyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDdbMV19LFtyMSw6MzJdLCByMgorICAgICAgICBcbWFjcyAgICAgICAgICAgcTEwLCBkMSwgIGQ3CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHZzaGwuczE2ICAgICAgICBxMSwgIHExLCAgcTkKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyLCAgcTEKKyAgICAgICAgdnNobC5zMTYgICAgICAgIHExMCwgcTEwLCBxOQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDQsICBxMTAKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHExMCwgcTgKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sW3I2LDozMl0sIHIyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMV19LFtyNiw6MzJdLCByMgorICAgICAgICB2bW92ICAgICAgICAgICAgcTEsICBxOAorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q0WzBdfSxbcjYsOjMyXSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNFsxXX0sW3I2LDozMl0sIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI2LCBwY30KKzI6ICAgICAgdnNobC5zMTYgICAgICAgIHExLCAgcTEsICBxOQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIsICBxMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSxbcjYsOjMyXSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlsxXX0sW3I2LDozMl0sIHIyCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjYsIHBjfQorLmVuZG0KKworLm1hY3JvICBiaXdlaWdodF9mdW5jICAgdworZnVuY3Rpb24gZmZfYml3ZWlnaHRfaDI2NF9waXhlbHNfXHdcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yNiwgbHJ9CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzE2XQorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICBzcCwgICMyMAorICAgICAgICBsZG0gICAgICAgICAgICAgcjQsICB7cjQtcjZ9CisgICAgICAgIGxzciAgICAgICAgICAgICBsciwgIHI0LCAgIzMxCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHI2LCAgIzEKKyAgICAgICAgZW9ycyAgICAgICAgICAgIGxyLCAgbHIsICByNSwgIGxzciAjMzAKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI2LCAgcjYsICAjMQorICAgICAgICB2ZHVwLjE2ICAgICAgICAgcTksICByMTIKKyAgICAgICAgbHNsICAgICAgICAgICAgIHI2LCAgcjYsICByMTIKKyAgICAgICAgdm12biAgICAgICAgICAgIHE5LCAgcTkKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHE4LCAgcjYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI2LCAgcjAKKyAgICAgICAgYmVxICAgICAgICAgICAgIDEwZgorICAgICAgICBzdWJzICAgICAgICAgICAgbHIsICBsciwgICMxCisgICAgICAgIGJlcSAgICAgICAgICAgICAyMGYKKyAgICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjMQorICAgICAgICBiZXEgICAgICAgICAgICAgMzBmCisgICAgICAgIGIgICAgICAgICAgICAgICA0MGYKKzEwOiAgICAgYml3ZWlnaHRfXHcgICAgIHZtbGFsLnU4LCB2bWxhbC51OAorMjA6ICAgICByc2IgICAgICAgICAgICAgcjQsICByNCwgICMwCisgICAgICAgIGJpd2VpZ2h0X1x3ICAgICB2bWxhbC51OCwgdm1sc2wudTgKKzMwOiAgICAgcnNiICAgICAgICAgICAgIHI0LCAgcjQsICAjMAorICAgICAgICByc2IgICAgICAgICAgICAgcjUsICByNSwgICMwCisgICAgICAgIGJpd2VpZ2h0X1x3ICAgICB2bWxzbC51OCwgdm1sc2wudTgKKzQwOiAgICAgcnNiICAgICAgICAgICAgIHI1LCAgcjUsICAjMAorICAgICAgICBiaXdlaWdodF9cdyAgICAgdm1sc2wudTgsIHZtbGFsLnU4CitlbmRmdW5jCisuZW5kbQorCisgICAgICAgIGJpd2VpZ2h0X2Z1bmMgICAxNgorICAgICAgICBiaXdlaWdodF9mdW5jICAgOAorICAgICAgICBiaXdlaWdodF9mdW5jICAgNAorCitAIFdlaWdodGVkIHByZWRpY3Rpb24KKworLm1hY3JvICB3ZWlnaHRfMTYgICAgICAgYWRkCisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMCwgIHIxMgorMTogICAgICBzdWJzICAgICAgICAgICAgcjIsICByMiwgICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIwLWQyMX0sW3IwLDoxMjhdLCByMQorICAgICAgICB2bXVsbC51OCAgICAgICAgcTIsICBkMCwgIGQyMAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IwXQorICAgICAgICB2bXVsbC51OCAgICAgICAgcTMsICBkMCwgIGQyMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyOC1kMjl9LFtyMCw6MTI4XSwgcjEKKyAgICAgICAgdm11bGwudTggICAgICAgIHExMiwgZDAsICBkMjgKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMF0KKyAgICAgICAgdm11bGwudTggICAgICAgIHExMywgZDAsICBkMjkKKyAgICAgICAgXGFkZCAgICAgICAgICAgIHEyLCAgcTgsICBxMgorICAgICAgICB2cnNobC5zMTYgICAgICAgcTIsICBxMiwgIHE5CisgICAgICAgIFxhZGQgICAgICAgICAgICBxMywgIHE4LCAgcTMKKyAgICAgICAgdnJzaGwuczE2ICAgICAgIHEzLCAgcTMsICBxOQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDQsICBxMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDUsICBxMworICAgICAgICBcYWRkICAgICAgICAgICAgcTEyLCBxOCwgIHExMgorICAgICAgICB2cnNobC5zMTYgICAgICAgcTEyLCBxMTIsIHE5CisgICAgICAgIFxhZGQgICAgICAgICAgICBxMTMsIHE4LCAgcTEzCisgICAgICAgIHZyc2hsLnMxNiAgICAgICBxMTMsIHExMywgcTkKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyNCwgcTEyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMjUsIHExMworICAgICAgICB2c3QxLjggICAgICAgICAge2Q0LSBkNX0sIFtyNCw6MTI4XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjQtZDI1fSxbcjQsOjEyOF0sIHIxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LCBwY30KKy5lbmRtCisKKy5tYWNybyAgd2VpZ2h0XzggICAgICAgIGFkZAorICAgICAgICB2ZHVwLjggICAgICAgICAgZDAsICByMTIKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjMgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0fSxbcjAsOjY0XSwgcjEKKyAgICAgICAgdm11bGwudTggICAgICAgIHExLCAgZDAsICBkNAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IwXQorICAgICAgICB2bGQxLjggICAgICAgICAge2Q2fSxbcjAsOjY0XSwgcjEKKyAgICAgICAgdm11bGwudTggICAgICAgIHExMCwgZDAsICBkNgorICAgICAgICBcYWRkICAgICAgICAgICAgcTEsICBxOCwgIHExCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjBdCisgICAgICAgIHZyc2hsLnMxNiAgICAgICBxMSwgIHExLCAgcTkKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyLCAgcTEKKyAgICAgICAgXGFkZCAgICAgICAgICAgIHExMCwgcTgsICBxMTAKKyAgICAgICAgdnJzaGwuczE2ICAgICAgIHExMCwgcTEwLCBxOQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDQsICBxMTAKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMn0sW3I0LDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDR9LFtyNCw6NjRdLCByMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9CisuZW5kbQorCisubWFjcm8gIHdlaWdodF80ICAgICAgICBhZGQKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQwLCAgcjEyCisgICAgICAgIHZtb3YgICAgICAgICAgICBxMSwgIHE4CisgICAgICAgIHZtb3YgICAgICAgICAgICBxMTAsIHE4CisxOiAgICAgIHN1YnMgICAgICAgICAgICByMiwgIHIyLCAgIzQKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNFswXX0sW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDRbMV19LFtyMCw6MzJdLCByMQorICAgICAgICB2bXVsbC51OCAgICAgICAgcTEsICBkMCwgIGQ0CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjBdCisgICAgICAgIGJsdCAgICAgICAgICAgICAyZgorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q2WzBdfSxbcjAsOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNlsxXX0sW3IwLDozMl0sIHIxCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQwLCAgZDYKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMF0KKyAgICAgICAgXGFkZCAgICAgICAgICAgIHExLCAgcTgsICBxMQorICAgICAgICB2cnNobC5zMTYgICAgICAgcTEsICBxMSwgIHE5CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMiwgIHExCisgICAgICAgIFxhZGQgICAgICAgICAgICBxMTAsIHE4LCAgcTEwCisgICAgICAgIHZyc2hsLnMxNiAgICAgICBxMTAsIHExMCwgcTkKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ0LCAgcTEwCisgICAgICAgIHZtb3YgICAgICAgICAgICBxMTAsIHE4CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LFtyNCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzFdfSxbcjQsOjMyXSwgcjEKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHExLCAgcTgKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNFswXX0sW3I0LDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMV19LFtyNCw6MzJdLCByMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9CisyOiAgICAgIFxhZGQgICAgICAgICAgICBxMSwgIHE4LCAgcTEKKyAgICAgICAgdnJzaGwuczE2ICAgICAgIHExLCAgcTEsICBxOQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIsICBxMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSxbcjQsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlsxXX0sW3I0LDozMl0sIHIxCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQsIHBjfQorLmVuZG0KKworLm1hY3JvICB3ZWlnaHRfZnVuYyAgICAgdworZnVuY3Rpb24gZmZfd2VpZ2h0X2gyNjRfcGl4ZWxzX1x3XCgpX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsIGxyfQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM4XQorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMxMl0KKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzEKKyAgICAgICAgbHNsICAgICAgICAgICAgIHI0LCAgcjQsICByMworICAgICAgICB2ZHVwLjE2ICAgICAgICAgcTgsICByNAorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICByMAorICAgICAgICBibGUgICAgICAgICAgICAgMjBmCisgICAgICAgIHJzYiAgICAgICAgICAgICBsciwgIHIzLCAgIzEKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHE5LCAgbHIKKyAgICAgICAgY21wICAgICAgICAgICAgIHIxMiwgIzAKKyAgICAgICAgYmx0ICAgICAgICAgICAgIDEwZgorICAgICAgICB3ZWlnaHRfXHcgICAgICAgdmhhZGQuczE2CisxMDogICAgIHJzYiAgICAgICAgICAgICByMTIsIHIxMiwgIzAKKyAgICAgICAgd2VpZ2h0X1x3ICAgICAgIHZoc3ViLnMxNgorMjA6ICAgICByc2IgICAgICAgICAgICAgbHIsICByMywgICMwCisgICAgICAgIHZkdXAuMTYgICAgICAgICBxOSwgIGxyCisgICAgICAgIGNtcCAgICAgICAgICAgICByMTIsICMwCisgICAgICAgIGJsdCAgICAgICAgICAgICAxMGYKKyAgICAgICAgd2VpZ2h0X1x3ICAgICAgIHZhZGQuczE2CisxMDogICAgIHJzYiAgICAgICAgICAgICByMTIsIHIxMiwgIzAKKyAgICAgICAgd2VpZ2h0X1x3ICAgICAgIHZzdWIuczE2CitlbmRmdW5jCisuZW5kbQorCisgICAgICAgIHdlaWdodF9mdW5jICAgICAxNgorICAgICAgICB3ZWlnaHRfZnVuYyAgICAgOAorICAgICAgICB3ZWlnaHRfZnVuYyAgICAgNApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2gyNjRpZGN0X25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0aWRjdF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2OGJkYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0aWRjdF9uZW9uLlMKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9oMjY0X2lkY3RfYWRkX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDAtZDN9LCAgW3IxLDoxMjhdCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMTUsICMwCisKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQxLCAgZDIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTV9LCAgICBbcjEsOjEyOF0hCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBkNCwgIGQwLCAgZDEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTV9LCAgICBbcjEsOjEyOF0hCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxOCwgIHExLCAgIzEKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIGQ1LCAgZDAsICBkMQorICAgICAgICB2YWRkLmkxNiAgICAgICAgZDYsICBkMiwgIGQxNworICAgICAgICB2c3ViLmkxNiAgICAgICAgZDcsICBkMTYsIGQzCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxMCwgIHEyLCAgcTMKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExLCAgcTIsICBxMworCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBkMCwgIGQxCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBkMywgIGQyCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkMCwgIGQzCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkMSwgIGQyCisKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQ0LCAgZDAsICBkMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QxOFswXX0sIFtyMCw6MzJdLCByMgorICAgICAgICB2c3dwICAgICAgICAgICAgZDEsICBkMworICAgICAgICB2c2hyLnMxNiAgICAgICAgcTgsICBxMSwgICMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE5WzFdfSwgW3IwLDozMl0sIHIyCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBkNSwgIGQwLCAgZDEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMThbMV19LCBbcjAsOjMyXSwgcjIKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQ2LCAgZDE2LCBkMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QxOVswXX0sIFtyMCw6MzJdLCByMgorICAgICAgICB2c3ViLmkxNiAgICAgICAgZDcsICBkMiwgIGQxNworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIyLCBsc2wgIzIKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHEwLCAgcTIsICBxMworICAgICAgICB2c3ViLmkxNiAgICAgICAgcTEsICBxMiwgIHEzCisKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHEwLCAgcTAsICAjNgorICAgICAgICB2cnNoci5zMTYgICAgICAgcTEsICBxMSwgICM2CisKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEwLCAgcTAsICBkMTgKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExLCAgcTEsICBkMTkKKworICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxMAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxMQorCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCAgW3IwLDozMl0sIHIyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMV19LCAgW3IwLDozMl0sIHIyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMV19LCAgW3IwLDozMl0sIHIyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCAgW3IwLDozMl0sIHIyCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMzIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2gyNjRfaWRjdF9kY19hZGRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgICAgICAjMAorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyW10sZDNbXX0sIFtyMSw6MTZdCisgICAgICAgIHN0cmggICAgICAgICAgICByMywgICAgICAgW3IxXQorICAgICAgICB2cnNoci5zMTYgICAgICAgcTEsICBxMSwgICM2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDBbMF19LCAgW3IwLDozMl0sIHIyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDBbMV19LCAgW3IwLDozMl0sIHIyCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMiwgIHExLCAgZDAKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMVswXX0sICBbcjAsOjMyXSwgcjIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMVsxXX0sICBbcjAsOjMyXSwgcjIKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExLCAgcTEsICBkMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIyLCBsc2wgIzIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMFswXX0sICBbcjAsOjMyXSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMFsxXX0sICBbcjAsOjMyXSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sICBbcjAsOjMyXSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMVsxXX0sICBbcjAsOjMyXSwgcjIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2gyNjRfaWRjdF9hZGQxNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI4LGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICByMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICByMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjIsICByMworICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbc3AsICMyNF0KKyAgICAgICAgbW92cmVsICAgICAgICAgIHI3LCAgc2NhbjgKKyAgICAgICAgbW92ICAgICAgICAgICAgIGlwLCAgIzE2CisxOiAgICAgIGxkcmIgICAgICAgICAgICByOCwgIFtyN10sICMxCisgICAgICAgIGxkciAgICAgICAgICAgICByMCwgIFtyNV0sICM0CisgICAgICAgIGxkcmIgICAgICAgICAgICByOCwgIFtyNiwgcjhdCisgICAgICAgIHN1YnMgICAgICAgICAgICByOCwgIHI4LCAgIzEKKyAgICAgICAgYmx0ICAgICAgICAgICAgIDJmCisgICAgICAgIGxkcnNoICAgICAgICAgICBsciwgIFtyMV0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByNAorICAgICAgICBpdCAgICAgICAgICAgICAgbmUKKyAgICAgICAgbW92bmUgICAgICAgICAgIGxyLCAgIzAKKyAgICAgICAgY21wICAgICAgICAgICAgIGxyLCAgIzAKKyAgICAgICAgaXRlICAgICAgICAgICAgIG5lCisgICAgICAgIGFkcm5lICAgICAgICAgICBsciwgIFgoZmZfaDI2NF9pZGN0X2RjX2FkZF9uZW9uKSArIENPTkZJR19USFVNQgorICAgICAgICBhZHJlcSAgICAgICAgICAgbHIsICBYKGZmX2gyNjRfaWRjdF9hZGRfbmVvbikgICAgKyBDT05GSUdfVEhVTUIKKyAgICAgICAgYmx4ICAgICAgICAgICAgIGxyCisyOiAgICAgIHN1YnMgICAgICAgICAgICBpcCwgIGlwLCAgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICAjMzIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjgscGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2gyNjRfaWRjdF9hZGQxNmludHJhX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjgsbHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIHIwCisgICAgICAgIG1vdiAgICAgICAgICAgICByNSwgIHIxCisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgIHIyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgIHIzCisgICAgICAgIGxkciAgICAgICAgICAgICByNiwgIFtzcCwgIzI0XQorICAgICAgICBtb3ZyZWwgICAgICAgICAgcjcsICBzY2FuOAorICAgICAgICBtb3YgICAgICAgICAgICAgaXAsICAjMTYKKzE6ICAgICAgbGRyYiAgICAgICAgICAgIHI4LCAgW3I3XSwgIzEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIwLCAgW3I1XSwgIzQKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI4LCAgW3I2LCByOF0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByNAorICAgICAgICBjbXAgICAgICAgICAgICAgcjgsICAjMAorICAgICAgICBsZHJzaCAgICAgICAgICAgcjgsICBbcjFdCisgICAgICAgIGl0ZWV0ICAgICAgICAgICBuZQorICAgICAgICBhZHJuZSAgICAgICAgICAgbHIsICBYKGZmX2gyNjRfaWRjdF9hZGRfbmVvbikgICAgKyBDT05GSUdfVEhVTUIKKyAgICAgICAgYWRyZXEgICAgICAgICAgIGxyLCAgWChmZl9oMjY0X2lkY3RfZGNfYWRkX25lb24pICsgQ09ORklHX1RIVU1CCisgICAgICAgIGNtcGVxICAgICAgICAgICByOCwgICMwCisgICAgICAgIGJseG5lICAgICAgICAgICBscgorICAgICAgICBzdWJzICAgICAgICAgICAgaXAsICBpcCwgICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzMyCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI4LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9oMjY0X2lkY3RfYWRkOF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMCxscn0KKyAgICAgICAgbGRtICAgICAgICAgICAgIHIwLCAge3I0LHI5fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjUsICByMSwgICMxNio0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIyLCAgIzE2KjMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgIHIzCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTAsIHIxCisgICAgICAgIGxkciAgICAgICAgICAgICByNiwgIFtzcCwgIzMyXQorICAgICAgICBtb3ZyZWwgICAgICAgICAgcjcsICBzY2FuOCsxNgorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMAorMTogICAgICBsZHJiICAgICAgICAgICAgcjgsICBbcjcsIHIxMl0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIwLCAgW3I1LCByMTIsIGxzbCAjMl0KKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI4LCAgW3I2LCByOF0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMTAsIHIxMiwgbHNsICM1CisgICAgICAgIGNtcCAgICAgICAgICAgICByOCwgICMwCisgICAgICAgIGxkcnNoICAgICAgICAgICByOCwgIFtyMV0KKyAgICAgICAgaXRlZXQgICAgICAgICAgIG5lCisgICAgICAgIGFkcm5lICAgICAgICAgICBsciwgIFgoZmZfaDI2NF9pZGN0X2FkZF9uZW9uKSAgICArIENPTkZJR19USFVNQgorICAgICAgICBhZHJlcSAgICAgICAgICAgbHIsICBYKGZmX2gyNjRfaWRjdF9kY19hZGRfbmVvbikgKyBDT05GSUdfVEhVTUIKKyAgICAgICAgY21wZXEgICAgICAgICAgIHI4LCAgIzAKKyAgICAgICAgYmx4bmUgICAgICAgICAgIGxyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgY21wICAgICAgICAgICAgIHIxMiwgIzQKKyAgICAgICAgaXR0ICAgICAgICAgICAgIGVxCisgICAgICAgIG1vdmVxICAgICAgICAgICByMTIsICMxNgorICAgICAgICBtb3ZlcSAgICAgICAgICAgcjQsICByOQorICAgICAgICBjbXAgICAgICAgICAgICAgcjEyLCAjMjAKKyAgICAgICAgYmx0ICAgICAgICAgICAgIDFiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjEwLHBjfQorZW5kZnVuYworCisubWFjcm8gIGlkY3Q4eDhfY29scyAgICBwYXNzCisgIC5pZiBccGFzcyA9PSAwCisgICAgICAgIHFhICAgICAgLnJlcSAgICBxMgorICAgICAgICBxYiAgICAgIC5yZXEgICAgcTE0CisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMiwgIHExMCwgIzEKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHEwLCAgcTgsICBxMTIKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTQtcTE1fSxbcjEsOjEyOF0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxM30sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTN9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2c3ViLmkxNiAgICAgICAgcTEsICBxOCwgIHExMgorICAgICAgICB2c2hyLnMxNiAgICAgICAgcTMsICBxMTQsICMxCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMiwgIHEyLCAgcTE0CisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxMywgIHEzLCAgcTEwCisgIC5lbHNlCisgICAgICAgIHFhICAgICAgLnJlcSAgICBxMTQKKyAgICAgICAgcWIgICAgICAucmVxICAgIHEyCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBxOCwgIHExMAorICAgICAgICB2dHJuLjE2ICAgICAgICAgcTEyLCBxMTMKKyAgICAgICAgdnRybi4zMiAgICAgICAgIHE5LCAgcTExCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBxMTIsIHEyCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBxMTMsIHExNQorICAgICAgICB2c3dwICAgICAgICAgICAgZDIxLCBkNAorICAgICAgICB2c2hyLnMxNiAgICAgICAgcTE0LCBxMTAsICMxCisgICAgICAgIHZzd3AgICAgICAgICAgICBkMTcsIGQyNAorICAgICAgICB2c2hyLnMxNiAgICAgICAgcTMsICBxMiwgICMxCisgICAgICAgIHZzd3AgICAgICAgICAgICBkMTksIGQyNgorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTAsICBxOCwgIHExMgorICAgICAgICB2c3dwICAgICAgICAgICAgZDIzLCBkMzAKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExLCAgcTgsICBxMTIKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExNCwgcTE0LCBxMgorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTMsICBxMywgIHExMAorICAuZW5kaWYKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHExMCwgcTEsICBxYQorICAgICAgICB2c3ViLmkxNiAgICAgICAgcTEyLCBxMSwgIHFhCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxOCwgIHEwLCAgcTMKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHFiLCAgcTAsICBxMworICAgICAgICB2c3ViLmkxNiAgICAgICAgcTAsICBxMTMsIHExMQorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTEsICBxMTUsIHE5CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxYSwgIHExNSwgcTkKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHEzLCAgcTEzLCBxMTEKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHEwLCAgcTAsICBxMTUKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExLCAgcTEsICBxMTEKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHFhLCAgcWEsICBxMTMKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHEzLCAgcTMsICBxOQorICAgICAgICB2c2hyLnMxNiAgICAgICAgcTksICBxOSwgICMxCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMTEsIHExMSwgIzEKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHExMywgcTEzLCAjMQorICAgICAgICB2c2hyLnMxNiAgICAgICAgcTE1LCBxMTUsICMxCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMCwgIHEwLCAgcTE1CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMSwgIHExLCAgcTExCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxYSwgIHFhLCAgcTEzCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxMywgIHEzLCAgcTkKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHE5LCAgcTAsICAjMgorICAgICAgICB2c2hyLnMxNiAgICAgICAgcTExLCBxMSwgICMyCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMTMsIHFhLCAgIzIKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHExNSwgcTMsICAjMgorICAgICAgICB2c3ViLmkxNiAgICAgICAgcTMsICBxMywgIHE5CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxYSwgIHExMSwgcWEKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHExLCAgcTEsICBxMTMKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHEwLCAgcTAsICBxMTUKKyAgLmlmIFxwYXNzID09IDAKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExNSwgcTgsICBxMworICAgICAgICB2YWRkLmkxNiAgICAgICAgcTgsICBxOCwgIHEzCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxOSwgIHExMCwgcTIKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHEyLCAgcTEwLCBxMgorICAgICAgICB2dHJuLjE2ICAgICAgICAgcTgsICBxOQorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTEwLCBxMTIsIHExCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBxMiwgIHExNQorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTExLCBxMTQsIHEwCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMTMsIHExMiwgcTEKKyAgICAgICAgdnRybi4xNiAgICAgICAgIHExMCwgcTExCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMTIsIHExNCwgcTAKKyAgLmVsc2UKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExNSwgcTgsICBxMworICAgICAgICB2YWRkLmkxNiAgICAgICAgcTgsICBxOCwgIHEzCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxOSwgIHExMCwgcTE0CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMTQsIHExMCwgcTE0CisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxMTAsIHExMiwgcTEKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExMywgcTEyLCBxMQorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTExLCBxMiwgcTAKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExMiwgcTIsIHEwCisgIC5lbmRpZgorICAgICAgICAudW5yZXEgICAgICAgICAgcWEKKyAgICAgICAgLnVucmVxICAgICAgICAgIHFiCisuZW5kbQorCitmdW5jdGlvbiBmZl9oMjY0X2lkY3Q4X2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2bW92LmkxNiAgICAgICAgcTMsICAgICAgICMwCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTgtcTl9LCAgW3IxLDoxMjhdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTN9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EzfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTAtcTExfSxbcjEsOjEyOF0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxM30sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTN9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMi1xMTN9LFtyMSw6MTI4XQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EzfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxM30sICAgICBbcjEsOjEyOF0hCisKKyAgICAgICAgaWRjdDh4OF9jb2xzICAgIDAKKyAgICAgICAgaWRjdDh4OF9jb2xzICAgIDEKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMAorICAgICAgICB2cnNoci5zMTYgICAgICAgcTgsICBxOCwgICM2CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZyc2hyLnMxNiAgICAgICBxOSwgIHE5LCAgIzYKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMX0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHExMCwgcTEwLCAjNgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyfSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cnNoci5zMTYgICAgICAgcTExLCBxMTEsICM2CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZyc2hyLnMxNiAgICAgICBxMTIsIHExMiwgIzYKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNH0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHExMywgcTEzLCAjNgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q1fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cnNoci5zMTYgICAgICAgcTE0LCBxMTQsICM2CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZyc2hyLnMxNiAgICAgICBxMTUsIHExNSwgIzYKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkN30sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdmFkZHcudTggICAgICAgIHE4LCAgcTgsICBkMAorICAgICAgICB2YWRkdy51OCAgICAgICAgcTksICBxOSwgIGQxCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMTAsIHExMCwgZDIKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQwLCAgcTgKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExMSwgcTExLCBkMworICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxOQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEyLCBxMTIsIGQ0CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMiwgIHExMAorICAgICAgICB2c3QxLjggICAgICAgICAge2QwfSwgICAgIFtyMyw6NjRdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEzLCBxMTMsIGQ1CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMywgIHExMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxfSwgICAgIFtyMyw6NjRdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTE0LCBxMTQsIGQ2CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNCwgIHExMgorICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgICAgIFtyMyw6NjRdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTE1LCBxMTUsIGQ3CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNSwgIHExMworICAgICAgICB2c3QxLjggICAgICAgICAge2QzfSwgICAgIFtyMyw6NjRdLCByMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDYsICBxMTQKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ3LCAgcTE1CisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDR9LCAgICAgW3IzLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDV9LCAgICAgW3IzLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDZ9LCAgICAgW3IzLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDd9LCAgICAgW3IzLDo2NF0sIHIyCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMTI4CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9oMjY0X2lkY3Q4X2RjX2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAgICAgICMwCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDMwW10sZDMxW119LFtyMSw6MTZdCisgICAgICAgIHN0cmggICAgICAgICAgICByMywgICAgICAgW3IxXQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwfSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cnNoci5zMTYgICAgICAgcTE1LCBxMTUsICM2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDF9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDJ9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxOCwgIHExNSwgZDAKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkM30sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdmFkZHcudTggICAgICAgIHE5LCAgcTE1LCBkMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEwLCBxMTUsIGQyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDV9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMTEsIHExNSwgZDMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNn0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExMiwgcTE1LCBkNAorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q3fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEzLCBxMTUsIGQ1CisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMTQsIHExNSwgZDYKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExNSwgcTE1LCBkNworICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxOAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxOQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIsICBxMTAKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQzLCAgcTExCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIsIGxzbCAjMworICAgICAgICB2c3QxLjMyICAgICAgICAge2QwfSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDQsICBxMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMX0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ1LCAgcTEzCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJ9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNiwgIHExNAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QzfSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDcsICBxMTUKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNH0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNX0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNn0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkN30sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2gyNjRfaWRjdDhfYWRkNF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI4LGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICByMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICByMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjIsICByMworICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbc3AsICMyNF0KKyAgICAgICAgbW92cmVsICAgICAgICAgIHI3LCAgc2NhbjgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzE2CisxOiAgICAgIGxkcmIgICAgICAgICAgICByOCwgIFtyN10sICM0CisgICAgICAgIGxkciAgICAgICAgICAgICByMCwgIFtyNV0sICMxNgorICAgICAgICBsZHJiICAgICAgICAgICAgcjgsICBbcjYsIHI4XQorICAgICAgICBzdWJzICAgICAgICAgICAgcjgsICByOCwgICMxCisgICAgICAgIGJsdCAgICAgICAgICAgICAyZgorICAgICAgICBsZHJzaCAgICAgICAgICAgbHIsICBbcjFdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjQKKyAgICAgICAgaXQgICAgICAgICAgICAgIG5lCisgICAgICAgIG1vdm5lICAgICAgICAgICBsciwgICMwCisgICAgICAgIGNtcCAgICAgICAgICAgICBsciwgICMwCisgICAgICAgIGl0ZSAgICAgICAgICAgICBuZQorICAgICAgICBhZHJuZSAgICAgICAgICAgbHIsICBYKGZmX2gyNjRfaWRjdDhfZGNfYWRkX25lb24pICsgQ09ORklHX1RIVU1CCisgICAgICAgIGFkcmVxICAgICAgICAgICBsciwgIFgoZmZfaDI2NF9pZGN0OF9hZGRfbmVvbikgICAgKyBDT05GSUdfVEhVTUIKKyAgICAgICAgYmx4ICAgICAgICAgICAgIGxyCisyOiAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICAjMTI4CisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI4LHBjfQorZW5kZnVuYworCitjb25zdCAgIHNjYW44CisgICAgICAgIC5ieXRlICAgICAgICAgICA0KyAxKjgsIDUrIDEqOCwgNCsgMio4LCA1KyAyKjgKKyAgICAgICAgLmJ5dGUgICAgICAgICAgIDYrIDEqOCwgNysgMSo4LCA2KyAyKjgsIDcrIDIqOAorICAgICAgICAuYnl0ZSAgICAgICAgICAgNCsgMyo4LCA1KyAzKjgsIDQrIDQqOCwgNSsgNCo4CisgICAgICAgIC5ieXRlICAgICAgICAgICA2KyAzKjgsIDcrIDMqOCwgNisgNCo4LCA3KyA0KjgKKyAgICAgICAgLmJ5dGUgICAgICAgICAgIDQrIDYqOCwgNSsgNio4LCA0KyA3KjgsIDUrIDcqOAorICAgICAgICAuYnl0ZSAgICAgICAgICAgNisgNio4LCA3KyA2KjgsIDYrIDcqOCwgNysgNyo4CisgICAgICAgIC5ieXRlICAgICAgICAgICA0KyA4KjgsIDUrIDgqOCwgNCsgOSo4LCA1KyA5KjgKKyAgICAgICAgLmJ5dGUgICAgICAgICAgIDYrIDgqOCwgNysgOCo4LCA2KyA5KjgsIDcrIDkqOAorICAgICAgICAuYnl0ZSAgICAgICAgICAgNCsxMSo4LCA1KzExKjgsIDQrMTIqOCwgNSsxMio4CisgICAgICAgIC5ieXRlICAgICAgICAgICA2KzExKjgsIDcrMTEqOCwgNisxMio4LCA3KzEyKjgKKyAgICAgICAgLmJ5dGUgICAgICAgICAgIDQrMTMqOCwgNSsxMyo4LCA0KzE0KjgsIDUrMTQqOAorICAgICAgICAuYnl0ZSAgICAgICAgICAgNisxMyo4LCA3KzEzKjgsIDYrMTQqOCwgNysxNCo4CitlbmRjb25zdApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2gyNjRwcmVkX2luaXRfYXJtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaDI2NHByZWRfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmE3NTkyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2gyNjRwcmVkX2luaXRfYXJtLmMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaDI2NHByZWQuaCIKKwordm9pZCBmZl9wcmVkMTZ4MTZfdmVydF9uZW9uKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3ByZWQxNngxNl9ob3JfbmVvbih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wcmVkMTZ4MTZfcGxhbmVfbmVvbih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wcmVkMTZ4MTZfZGNfbmVvbih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wcmVkMTZ4MTZfMTI4X2RjX25lb24odWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHJlZDE2eDE2X2xlZnRfZGNfbmVvbih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wcmVkMTZ4MTZfdG9wX2RjX25lb24odWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKwordm9pZCBmZl9wcmVkOHg4X3ZlcnRfbmVvbih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wcmVkOHg4X2hvcl9uZW9uKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3ByZWQ4eDhfcGxhbmVfbmVvbih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wcmVkOHg4X2RjX25lb24odWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHJlZDh4OF8xMjhfZGNfbmVvbih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wcmVkOHg4X2xlZnRfZGNfbmVvbih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wcmVkOHg4X3RvcF9kY19uZW9uKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3ByZWQ4eDhfbDB0X2RjX25lb24odWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHJlZDh4OF8wbHRfZGNfbmVvbih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wcmVkOHg4X2wwMF9kY19uZW9uKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3ByZWQ4eDhfMGwwX2RjX25lb24odWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKworc3RhdGljIGF2X2NvbGQgdm9pZCBoMjY0X3ByZWRfaW5pdF9uZW9uKEgyNjRQcmVkQ29udGV4dCAqaCwgaW50IGNvZGVjX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNocm9tYV9mb3JtYXRfaWRjKQoreworI2lmIEhBVkVfTkVPTgorICAgIGNvbnN0IGludCBoaWdoX2RlcHRoID0gYml0X2RlcHRoID4gODsKKworICAgIGlmIChoaWdoX2RlcHRoKQorICAgICAgICByZXR1cm47CisgICAgaWYoY2hyb21hX2Zvcm1hdF9pZGMgPT0gMSl7CisgICAgaC0+cHJlZDh4OFtWRVJUX1BSRUQ4eDggICAgIF0gPSBmZl9wcmVkOHg4X3ZlcnRfbmVvbjsKKyAgICBoLT5wcmVkOHg4W0hPUl9QUkVEOHg4ICAgICAgXSA9IGZmX3ByZWQ4eDhfaG9yX25lb247CisgICAgaWYgKGNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1ZQNyAmJiBjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WUDgpCisgICAgICAgIGgtPnByZWQ4eDhbUExBTkVfUFJFRDh4OF0gPSBmZl9wcmVkOHg4X3BsYW5lX25lb247CisgICAgaC0+cHJlZDh4OFtEQ18xMjhfUFJFRDh4OCAgIF0gPSBmZl9wcmVkOHg4XzEyOF9kY19uZW9uOworICAgIGlmIChjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9SVjQwICYmIGNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1ZQNyAmJgorICAgICAgICBjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WUDgpIHsKKyAgICAgICAgaC0+cHJlZDh4OFtEQ19QUkVEOHg4ICAgICBdID0gZmZfcHJlZDh4OF9kY19uZW9uOworICAgICAgICBoLT5wcmVkOHg4W0xFRlRfRENfUFJFRDh4OF0gPSBmZl9wcmVkOHg4X2xlZnRfZGNfbmVvbjsKKyAgICAgICAgaC0+cHJlZDh4OFtUT1BfRENfUFJFRDh4OCBdID0gZmZfcHJlZDh4OF90b3BfZGNfbmVvbjsKKyAgICAgICAgaC0+cHJlZDh4OFtBTFpIRUlNRVJfRENfTDBUX1BSRUQ4eDhdID0gZmZfcHJlZDh4OF9sMHRfZGNfbmVvbjsKKyAgICAgICAgaC0+cHJlZDh4OFtBTFpIRUlNRVJfRENfMExUX1BSRUQ4eDhdID0gZmZfcHJlZDh4OF8wbHRfZGNfbmVvbjsKKyAgICAgICAgaC0+cHJlZDh4OFtBTFpIRUlNRVJfRENfTDAwX1BSRUQ4eDhdID0gZmZfcHJlZDh4OF9sMDBfZGNfbmVvbjsKKyAgICAgICAgaC0+cHJlZDh4OFtBTFpIRUlNRVJfRENfMEwwX1BSRUQ4eDhdID0gZmZfcHJlZDh4OF8wbDBfZGNfbmVvbjsKKyAgICB9CisgICAgfQorCisgICAgaC0+cHJlZDE2eDE2W0RDX1BSRUQ4eDggICAgIF0gPSBmZl9wcmVkMTZ4MTZfZGNfbmVvbjsKKyAgICBoLT5wcmVkMTZ4MTZbVkVSVF9QUkVEOHg4ICAgXSA9IGZmX3ByZWQxNngxNl92ZXJ0X25lb247CisgICAgaC0+cHJlZDE2eDE2W0hPUl9QUkVEOHg4ICAgIF0gPSBmZl9wcmVkMTZ4MTZfaG9yX25lb247CisgICAgaC0+cHJlZDE2eDE2W0xFRlRfRENfUFJFRDh4OF0gPSBmZl9wcmVkMTZ4MTZfbGVmdF9kY19uZW9uOworICAgIGgtPnByZWQxNngxNltUT1BfRENfUFJFRDh4OCBdID0gZmZfcHJlZDE2eDE2X3RvcF9kY19uZW9uOworICAgIGgtPnByZWQxNngxNltEQ18xMjhfUFJFRDh4OCBdID0gZmZfcHJlZDE2eDE2XzEyOF9kY19uZW9uOworICAgIGlmIChjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9TVlEzICYmIGNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1JWNDAgJiYKKyAgICAgICAgY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVlA3ICYmIGNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1ZQOCkKKyAgICAgICAgaC0+cHJlZDE2eDE2W1BMQU5FX1BSRUQ4eDggIF0gPSBmZl9wcmVkMTZ4MTZfcGxhbmVfbmVvbjsKKyNlbmRpZiAvLyBIQVZFX05FT04KK30KKworYXZfY29sZCB2b2lkIGZmX2gyNjRfcHJlZF9pbml0X2FybShIMjY0UHJlZENvbnRleHQgKmgsIGludCBjb2RlY19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdF9kZXB0aCwgY29uc3QgaW50IGNocm9tYV9mb3JtYXRfaWRjKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpCisgICAgICAgIGgyNjRfcHJlZF9pbml0X25lb24oaCwgY29kZWNfaWQsIGJpdF9kZXB0aCwgY2hyb21hX2Zvcm1hdF9pZGMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2gyNjRwcmVkX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0cHJlZF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjNDdiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0cHJlZF9uZW9uLlMKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCisgICAgICAgIC5tYWNybyBsZGNvbC44ICByZCwgIHJzLCAgcnQsICBuPTgsICBoaT0wCisuaWYgXG4gPT0gOCB8fCBcaGkgPT0gMAorICAgICAgICB2bGQxLjggICAgICAgICAge1xyZFswXX0sIFtccnNdLCBccnQKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtccmRbMV19LCBbXHJzXSwgXHJ0CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7XHJkWzJdfSwgW1xyc10sIFxydAorICAgICAgICB2bGQxLjggICAgICAgICAge1xyZFszXX0sIFtccnNdLCBccnQKKy5lbmRpZgorLmlmIFxuID09IDggfHwgXGhpID09IDEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtccmRbNF19LCBbXHJzXSwgXHJ0CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7XHJkWzVdfSwgW1xyc10sIFxydAorICAgICAgICB2bGQxLjggICAgICAgICAge1xyZFs2XX0sIFtccnNdLCBccnQKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtccmRbN119LCBbXHJzXSwgXHJ0CisuZW5kaWYKKyAgICAgICAgLmVuZG0KKworICAgICAgICAubWFjcm8gYWRkMTZ4OCAgZHEsICBkbCwgIGRoLCAgcmwsICByaAorICAgICAgICB2YWRkbC51OCAgICAgICAgXGRxLCBccmwsIFxyaAorICAgICAgICB2YWRkLnUxNiAgICAgICAgXGRsLCBcZGwsIFxkaAorICAgICAgICB2cGFkZC51MTYgICAgICAgXGRsLCBcZGwsIFxkbAorICAgICAgICB2cGFkZC51MTYgICAgICAgXGRsLCBcZGwsIFxkbAorICAgICAgICAuZW5kbQorCitmdW5jdGlvbiBmZl9wcmVkMTZ4MTZfMTI4X2RjX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZtb3YuaTggICAgICAgICBxMCwgICMxMjgKKyAgICAgICAgYiAgICAgICAgICAgICAgIC5MX3ByZWQxNngxNl9kY19lbmQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHJlZDE2eDE2X3RvcF9kY19uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMCwgIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IyLDoxMjhdCisgICAgICAgIGFkZDE2eDggICAgICAgICBxMCwgIGQwLCAgZDEsICBkMCwgIGQxCisgICAgICAgIHZyc2hybi51MTYgICAgICBkMCwgIHEwLCAgIzQKKyAgICAgICAgdmR1cC44ICAgICAgICAgIHEwLCAgZDBbMF0KKyAgICAgICAgYiAgICAgICAgICAgICAgIC5MX3ByZWQxNngxNl9kY19lbmQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHJlZDE2eDE2X2xlZnRfZGNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjAsICAjMQorICAgICAgICBsZGNvbC44ICAgICAgICAgZDAsICByMiwgIHIxCisgICAgICAgIGxkY29sLjggICAgICAgICBkMSwgIHIyLCAgcjEKKyAgICAgICAgYWRkMTZ4OCAgICAgICAgIHEwLCAgZDAsICBkMSwgIGQwLCAgZDEKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQwLCAgcTAsICAjNAorICAgICAgICB2ZHVwLjggICAgICAgICAgcTAsICBkMFswXQorICAgICAgICBiICAgICAgICAgICAgICAgLkxfcHJlZDE2eDE2X2RjX2VuZAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wcmVkMTZ4MTZfZGNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjAsICByMQorICAgICAgICB2bGQxLjggICAgICAgICAge3EwfSwgICAgIFtyMiw6MTI4XQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMCwgICMxCisgICAgICAgIGxkY29sLjggICAgICAgICBkMiwgIHIyLCAgcjEKKyAgICAgICAgbGRjb2wuOCAgICAgICAgIGQzLCAgcjIsICByMQorICAgICAgICB2YWRkbC51OCAgICAgICAgcTAsICBkMCwgIGQxCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxMSwgIGQyLCAgZDMKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHEwLCAgcTAsICBxMQorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDAsICBkMCwgIGQxCisgICAgICAgIHZwYWRkLnUxNiAgICAgICBkMCwgIGQwLCAgZDAKKyAgICAgICAgdnBhZGQudTE2ICAgICAgIGQwLCAgZDAsICBkMAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDAsICBxMCwgICM1CisgICAgICAgIHZkdXAuOCAgICAgICAgICBxMCwgIGQwWzBdCisuTF9wcmVkMTZ4MTZfZGNfZW5kOgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjOAorNjogICAgICB2c3QxLjggICAgICAgICAge3EwfSwgICAgIFtyMCw6MTI4XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMH0sICAgICBbcjAsOjEyOF0sIHIxCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDZiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wcmVkMTZ4MTZfaG9yX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIwLCAgIzEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzE2CisxOiAgICAgIHZsZDEuOCAgICAgICAgICB7ZDBbXSxkMVtdfSxbcjJdLCAgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCAgICAgICBbcjAsOjEyOF0sIHIxCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wcmVkMTZ4MTZfdmVydF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IwLDoxMjhdLCByMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjOAorMTogICAgICB2c3QxLjggICAgICAgICAge3EwfSwgICAgIFtyMCw6MTI4XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMH0sICAgICBbcjAsOjEyOF0sIHIxCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wcmVkMTZ4MTZfcGxhbmVfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIzLCAgcjAsICByMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMywgICM4CisgICAgICAgIHN1YiAgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICAgICBbcjNdCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCAgICAgW3IyLDo2NF0sIHIxCisgICAgICAgIGxkY29sLjggICAgICAgICBkMSwgIHIzLCAgcjEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjMsICByMQorICAgICAgICBsZGNvbC44ICAgICAgICAgZDMsICByMywgIHIxCisgICAgICAgIHZyZXY2NC44ICAgICAgICBxMCwgIHEwCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxOCwgIGQyLCAgZDMKKyAgICAgICAgdnN1YmwudTggICAgICAgIHEyLCAgZDIsICBkMAorICAgICAgICB2c3VibC51OCAgICAgICAgcTMsICBkMywgIGQxCisgICAgICAgIG1vdnJlbCAgICAgICAgICByMywgIHAxNndlaWdodAorICAgICAgICB2bGQxLjggICAgICAgICAge3EwfSwgICAgIFtyMyw6MTI4XQorICAgICAgICB2bXVsLnMxNiAgICAgICAgcTIsICBxMiwgIHEwCisgICAgICAgIHZtdWwuczE2ICAgICAgICBxMywgIHEzLCAgcTAKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQ0LCAgZDQsICBkNQorICAgICAgICB2YWRkLmkxNiAgICAgICAgZDUsICBkNiwgIGQ3CisgICAgICAgIHZwYWRkLmkxNiAgICAgICBkNCwgIGQ0LCAgZDUKKyAgICAgICAgdnBhZGQuaTE2ICAgICAgIGQ0LCAgZDQsICBkNAorICAgICAgICB2c2hsbC5zMTYgICAgICAgcTMsICBkNCwgICMyCisgICAgICAgIHZhZGR3LnMxNiAgICAgICBxMiwgIHEzLCAgZDQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQ0LCAgcTIsICAjNgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMAorICAgICAgICB2dHJuLjE2ICAgICAgICAgZDQsICBkNQorICAgICAgICB2YWRkLmkxNiAgICAgICAgZDIsICBkNCwgIGQ1CisgICAgICAgIHZzaGwuaTE2ICAgICAgICBkMywgIGQyLCAgIzMKKyAgICAgICAgdnJldjY0LjE2ICAgICAgIGQxNiwgZDE3CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBkMywgIGQzLCAgZDIKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQxNiwgZDE2LCBkMAorICAgICAgICB2c2hsLmkxNiAgICAgICAgZDIsICBkMTYsICM0CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBkMiwgIGQyLCAgZDMKKyAgICAgICAgdnNobC5pMTYgICAgICAgIGQzLCAgZDQsICAjNAorICAgICAgICB2ZXh0LjE2ICAgICAgICAgcTAsICBxMCwgIHEwLCAgIzcKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIGQ2LCAgZDUsICBkMworICAgICAgICB2bW92LjE2ICAgICAgICAgZDBbMF0sIHIzCisgICAgICAgIHZtdWwuaTE2ICAgICAgICBxMCwgIHEwLCAgZDRbMF0KKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHExLCAgZDJbMF0KKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHEyLCAgZDRbMF0KKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHEzLCAgZDZbMF0KKyAgICAgICAgdnNobC5pMTYgICAgICAgIHEyLCAgcTIsICAjMworICAgICAgICB2YWRkLmkxNiAgICAgICAgcTEsICBxMSwgIHEwCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxMywgIHEzLCAgcTIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzE2CisxOgorICAgICAgICB2cXNocnVuLnMxNiAgICAgZDAsICBxMSwgICM1CisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxMSwgIHExLCAgcTIKKyAgICAgICAgdnFzaHJ1bi5zMTYgICAgIGQxLCAgcTEsICAjNQorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTEsICBxMSwgIHEzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IwLDoxMjhdLCByMQorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworY29uc3QgICBwMTZ3ZWlnaHQsIGFsaWduPTQKKyAgICAgICAgLnNob3J0ICAgICAgICAgIDEsMiwzLDQsNSw2LDcsOAorZW5kY29uc3QKKworZnVuY3Rpb24gZmZfcHJlZDh4OF9ob3JfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjAsICAjMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjOAorMTogICAgICB2bGQxLjggICAgICAgICAge2QwW119LCAgIFtyMl0sICAgICByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QwfSwgICAgIFtyMCw6NjRdLCByMQorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHJlZDh4OF92ZXJ0X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XSwgcjEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzQKKzE6ICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ByZWQ4eDhfcGxhbmVfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIzLCAgcjAsICByMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMywgICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMFswXX0sICBbcjNdCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDJbMF19LCAgW3IyLDozMl0sIHIxCisgICAgICAgIGxkY29sLjggICAgICAgICBkMCwgIHIzLCAgcjEsICA0LCAgaGk9MQorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsICByMywgIHIxCisgICAgICAgIGxkY29sLjggICAgICAgICBkMywgIHIzLCAgcjEsICA0CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxOCwgIGQyLCAgZDMKKyAgICAgICAgdnJldjMyLjggICAgICAgIGQwLCAgZDAKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQyLCAgZDMKKyAgICAgICAgdnN1YmwudTggICAgICAgIHEyLCAgZDIsICBkMAorICAgICAgICBtb3ZyZWwgICAgICAgICAgcjMsICBwMTZ3ZWlnaHQKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sICAgICBbcjMsOjEyOF0KKyAgICAgICAgdm11bC5zMTYgICAgICAgIGQ0LCAgZDQsICBkMAorICAgICAgICB2bXVsLnMxNiAgICAgICAgZDUsICBkNSwgIGQwCisgICAgICAgIHZwYWRkLmkxNiAgICAgICBkNCwgIGQ0LCAgZDUKKyAgICAgICAgdnBhZGRsLnMxNiAgICAgIGQ0LCAgZDQKKyAgICAgICAgdnNobC5pMzIgICAgICAgIGQ1LCAgZDQsICAjNAorICAgICAgICB2YWRkLnMzMiAgICAgICAgZDQsICBkNCwgIGQ1CisgICAgICAgIHZyc2hybi5zMzIgICAgICBkNCwgIHEyLCAgIzUKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzAKKyAgICAgICAgdnRybi4xNiAgICAgICAgIGQ0LCAgZDUKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQyLCAgZDQsICBkNQorICAgICAgICB2c2hsLmkxNiAgICAgICAgZDMsICBkMiwgICMyCisgICAgICAgIHZyZXY2NC4xNiAgICAgICBkMTYsIGQxNgorICAgICAgICB2c3ViLmkxNiAgICAgICAgZDMsICBkMywgIGQyCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBkMTYsIGQxNiwgZDAKKyAgICAgICAgdnNobC5pMTYgICAgICAgIGQyLCAgZDE2LCAjNAorICAgICAgICB2c3ViLmkxNiAgICAgICAgZDIsICBkMiwgIGQzCisgICAgICAgIHZzaGwuaTE2ICAgICAgICBkMywgIGQ0LCAgIzMKKyAgICAgICAgdmV4dC4xNiAgICAgICAgIHEwLCAgcTAsICBxMCwgICM3CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBkNiwgIGQ1LCAgZDMKKyAgICAgICAgdm1vdi4xNiAgICAgICAgIGQwWzBdLCByMworICAgICAgICB2bXVsLmkxNiAgICAgICAgcTAsICBxMCwgIGQ0WzBdCisgICAgICAgIHZkdXAuMTYgICAgICAgICBxMSwgIGQyWzBdCisgICAgICAgIHZkdXAuMTYgICAgICAgICBxMiwgIGQ0WzBdCisgICAgICAgIHZkdXAuMTYgICAgICAgICBxMywgIGQ2WzBdCisgICAgICAgIHZzaGwuaTE2ICAgICAgICBxMiwgIHEyLCAgIzMKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHExLCAgcTEsICBxMAorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTMsICBxMywgIHEyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICM4CisxOgorICAgICAgICB2cXNocnVuLnMxNiAgICAgZDAsICBxMSwgICM1CisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxMSwgIHExLCAgcTMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ByZWQ4eDhfMTI4X2RjX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZtb3YuaTggICAgICAgICBxMCwgICMxMjgKKyAgICAgICAgYiAgICAgICAgICAgICAgIC5MX3ByZWQ4eDhfZGNfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ByZWQ4eDhfdG9wX2RjX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIwLCAgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICAgICBbcjIsOjY0XQorICAgICAgICB2cGFkZGwudTggICAgICAgZDAsICBkMAorICAgICAgICB2cGFkZC51MTYgICAgICAgZDAsICBkMCwgIGQwCisgICAgICAgIHZyc2hybi51MTYgICAgICBkMCwgIHEwLCAgIzIKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQxLCAgZDBbMV0KKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQwLCAgZDBbMF0KKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQwLCAgZDEKKyAgICAgICAgYiAgICAgICAgICAgICAgIC5MX3ByZWQ4eDhfZGNfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ByZWQ4eDhfbGVmdF9kY19uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMCwgICMxCisgICAgICAgIGxkY29sLjggICAgICAgICBkMCwgIHIyLCAgcjEKKyAgICAgICAgdnBhZGRsLnU4ICAgICAgIGQwLCAgZDAKKyAgICAgICAgdnBhZGQudTE2ICAgICAgIGQwLCAgZDAsICBkMAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDAsICBxMCwgICMyCisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMSwgIGQwWzFdCisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMCwgIGQwWzBdCisgICAgICAgIGIgICAgICAgICAgICAgICAuTF9wcmVkOHg4X2RjX2VuZAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wcmVkOHg4X2RjX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIwLCAgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICAgICBbcjIsOjY0XQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMCwgICMxCisgICAgICAgIGxkY29sLjggICAgICAgICBkMSwgIHIyLCAgcjEKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQwLCAgZDEKKyAgICAgICAgdnBhZGRsLnU4ICAgICAgIHEwLCAgcTAKKyAgICAgICAgdnBhZGQudTE2ICAgICAgIGQwLCAgZDAsICBkMQorICAgICAgICB2cGFkZC51MTYgICAgICAgZDEsICBkMCwgIGQwCisgICAgICAgIHZyc2hybi51MTYgICAgICBkMiwgIHEwLCAgIzMKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQzLCAgcTAsICAjMgorICAgICAgICB2ZHVwLjggICAgICAgICAgZDAsICBkMls0XQorICAgICAgICB2ZHVwLjggICAgICAgICAgZDEsICBkM1szXQorICAgICAgICB2ZHVwLjggICAgICAgICAgZDQsICBkM1syXQorICAgICAgICB2ZHVwLjggICAgICAgICAgZDUsICBkMls1XQorICAgICAgICB2dHJuLjMyICAgICAgICAgcTAsICBxMgorLkxfcHJlZDh4OF9kY19lbmQ6CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIwLCAgcjEsICBsc2wgIzIKKzY6ICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMX0sICAgICBbcjIsOjY0XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBibmUgICAgICAgICAgICAgNmIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ByZWQ4eDhfbDB0X2RjX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIwLCAgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICAgICBbcjIsOjY0XQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMCwgICMxCisgICAgICAgIGxkY29sLjggICAgICAgICBkMSwgIHIyLCAgcjEsICA0CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkMCwgIGQxCisgICAgICAgIHZwYWRkbC51OCAgICAgICBxMCwgIHEwCisgICAgICAgIHZwYWRkLnUxNiAgICAgICBkMCwgIGQwLCAgZDEKKyAgICAgICAgdnBhZGQudTE2ICAgICAgIGQxLCAgZDAsICBkMAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDIsICBxMCwgICMzCisgICAgICAgIHZyc2hybi51MTYgICAgICBkMywgIHEwLCAgIzIKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQwLCAgZDJbNF0KKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQxLCAgZDNbMF0KKyAgICAgICAgdmR1cC44ICAgICAgICAgIHEyLCAgZDNbMl0KKyAgICAgICAgdnRybi4zMiAgICAgICAgIHEwLCAgcTIKKyAgICAgICAgYiAgICAgICAgICAgICAgIC5MX3ByZWQ4eDhfZGNfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ByZWQ4eDhfbDAwX2RjX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIwLCAgIzEKKyAgICAgICAgbGRjb2wuOCAgICAgICAgIGQwLCAgcjIsICByMSwgIDQKKyAgICAgICAgdnBhZGRsLnU4ICAgICAgIGQwLCAgZDAKKyAgICAgICAgdnBhZGQudTE2ICAgICAgIGQwLCAgZDAsICBkMAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDAsICBxMCwgICMyCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMSwgICMxMjgKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQwLCAgZDBbMF0KKyAgICAgICAgYiAgICAgICAgICAgICAgIC5MX3ByZWQ4eDhfZGNfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ByZWQ4eDhfMGx0X2RjX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIwLCAgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICAgICBbcjIsOjY0XQorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMCwgIHIxLCAgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzEKKyAgICAgICAgbGRjb2wuOCAgICAgICAgIGQxLCAgcjIsICByMSwgIDQsICBoaT0xCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkMCwgIGQxCisgICAgICAgIHZwYWRkbC51OCAgICAgICBxMCwgIHEwCisgICAgICAgIHZwYWRkLnUxNiAgICAgICBkMCwgIGQwLCAgZDEKKyAgICAgICAgdnBhZGQudTE2ICAgICAgIGQxLCAgZDAsICBkMAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDMsICBxMCwgICMyCisgICAgICAgIHZyc2hybi51MTYgICAgICBkMiwgIHEwLCAgIzMKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQwLCAgZDNbMF0KKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQxLCAgZDNbM10KKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQ0LCAgZDNbMl0KKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQ1LCAgZDJbNV0KKyAgICAgICAgdnRybi4zMiAgICAgICAgIHEwLCAgcTIKKyAgICAgICAgYiAgICAgICAgICAgICAgIC5MX3ByZWQ4eDhfZGNfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ByZWQ4eDhfMGwwX2RjX25lb24sIGV4cG9ydD0xCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIwLCAgcjEsICBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICAjMQorICAgICAgICBsZGNvbC44ICAgICAgICAgZDEsICByMiwgIHIxLCAgNAorICAgICAgICB2cGFkZGwudTggICAgICAgZDIsICBkMQorICAgICAgICB2cGFkZC51MTYgICAgICAgZDIsICBkMiwgIGQyCisgICAgICAgIHZyc2hybi51MTYgICAgICBkMSwgIHExLCAgIzIKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQwLCAgIzEyOAorICAgICAgICB2ZHVwLjggICAgICAgICAgZDEsICBkMVswXQorICAgICAgICBiICAgICAgICAgICAgICAgLkxfcHJlZDh4OF9kY19lbmQKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0cXBlbF9pbml0X2FybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2gyNjRxcGVsX2luaXRfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyMzdiZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0cXBlbF9pbml0X2FybS5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQVJNIE5FT04gb3B0aW1pc2VkIERTUCBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaDI2NHFwZWwuaCIKKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMwMF9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMTBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzIwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMzMF9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMDFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzExX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMyMV9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMzFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzAyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMxMl9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMjJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzMyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMwM19uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMTNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzIzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMzM19uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzEwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAxX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzExX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIxX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMxX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzEyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzEzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOworCit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxMF9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMjBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzMwX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMwMV9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMTFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzIxX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMzMV9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMDJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzEyX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMyMl9uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMzJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxM19uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMjNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzMzX25lb24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOworCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzBfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzFfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzJfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzNfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7CisKK2F2X2NvbGQgdm9pZCBmZl9oMjY0cXBlbF9pbml0X2FybShIMjY0UXBlbENvbnRleHQgKmMsIGludCBiaXRfZGVwdGgpCit7CisgICAgY29uc3QgaW50IGhpZ2hfYml0X2RlcHRoID0gYml0X2RlcHRoID4gODsKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpICYmICFoaWdoX2JpdF9kZXB0aCkgeworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDBdID0gZmZfcHV0X2gyNjRfcXBlbDE2X21jMDBfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyAxXSA9IGZmX3B1dF9oMjY0X3FwZWwxNl9tYzEwX25lb247CisgICAgICAgIGMtPnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgMl0gPSBmZl9wdXRfaDI2NF9xcGVsMTZfbWMyMF9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDNdID0gZmZfcHV0X2gyNjRfcXBlbDE2X21jMzBfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyA0XSA9IGZmX3B1dF9oMjY0X3FwZWwxNl9tYzAxX25lb247CisgICAgICAgIGMtPnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgNV0gPSBmZl9wdXRfaDI2NF9xcGVsMTZfbWMxMV9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDZdID0gZmZfcHV0X2gyNjRfcXBlbDE2X21jMjFfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyA3XSA9IGZmX3B1dF9oMjY0X3FwZWwxNl9tYzMxX25lb247CisgICAgICAgIGMtPnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgOF0gPSBmZl9wdXRfaDI2NF9xcGVsMTZfbWMwMl9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDldID0gZmZfcHV0X2gyNjRfcXBlbDE2X21jMTJfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWzEwXSA9IGZmX3B1dF9oMjY0X3FwZWwxNl9tYzIyX25lb247CisgICAgICAgIGMtPnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsxMV0gPSBmZl9wdXRfaDI2NF9xcGVsMTZfbWMzMl9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bMTJdID0gZmZfcHV0X2gyNjRfcXBlbDE2X21jMDNfbmVvbjsKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWzEzXSA9IGZmX3B1dF9oMjY0X3FwZWwxNl9tYzEzX25lb247CisgICAgICAgIGMtPnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsxNF0gPSBmZl9wdXRfaDI2NF9xcGVsMTZfbWMyM19uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bMTVdID0gZmZfcHV0X2gyNjRfcXBlbDE2X21jMzNfbmVvbjsKKworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDBdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMwMF9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDFdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMxMF9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDJdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMyMF9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDNdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMzMF9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDRdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMwMV9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDVdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMxMV9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDZdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMyMV9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDddID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMzMV9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDhdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMwMl9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bIDldID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMxMl9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTBdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMyMl9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTFdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMzMl9uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTJdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMwM19uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTNdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMxM19uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTRdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMyM19uZW9uOworICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMTVdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMzM19uZW9uOworCisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgMF0gPSBmZl9hdmdfaDI2NF9xcGVsMTZfbWMwMF9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDFdID0gZmZfYXZnX2gyNjRfcXBlbDE2X21jMTBfbmVvbjsKKyAgICAgICAgYy0+YXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyAyXSA9IGZmX2F2Z19oMjY0X3FwZWwxNl9tYzIwX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgM10gPSBmZl9hdmdfaDI2NF9xcGVsMTZfbWMzMF9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDRdID0gZmZfYXZnX2gyNjRfcXBlbDE2X21jMDFfbmVvbjsKKyAgICAgICAgYy0+YXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyA1XSA9IGZmX2F2Z19oMjY0X3FwZWwxNl9tYzExX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgNl0gPSBmZl9hdmdfaDI2NF9xcGVsMTZfbWMyMV9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bIDddID0gZmZfYXZnX2gyNjRfcXBlbDE2X21jMzFfbmVvbjsKKyAgICAgICAgYy0+YXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWyA4XSA9IGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAyX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsgOV0gPSBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxMl9uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bMTBdID0gZmZfYXZnX2gyNjRfcXBlbDE2X21jMjJfbmVvbjsKKyAgICAgICAgYy0+YXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWzExXSA9IGZmX2F2Z19oMjY0X3FwZWwxNl9tYzMyX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsxMl0gPSBmZl9hdmdfaDI2NF9xcGVsMTZfbWMwM19uZW9uOworICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bMTNdID0gZmZfYXZnX2gyNjRfcXBlbDE2X21jMTNfbmVvbjsKKyAgICAgICAgYy0+YXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWzE0XSA9IGZmX2F2Z19oMjY0X3FwZWwxNl9tYzIzX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsxNV0gPSBmZl9hdmdfaDI2NF9xcGVsMTZfbWMzM19uZW9uOworCisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsgMF0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzAwX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsgMV0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzEwX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsgMl0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzIwX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsgM10gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzMwX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsgNF0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzAxX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsgNV0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzExX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsgNl0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzIxX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsgN10gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzMxX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsgOF0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzAyX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsgOV0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzEyX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsxMF0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzIyX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsxMV0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzMyX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsxMl0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzAzX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsxM10gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzEzX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsxNF0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzIzX25lb247CisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVsxNV0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYzMzX25lb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2gyNjRxcGVsX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0cXBlbF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzMzZjNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9oMjY0cXBlbF9uZW9uLlMKQEAgLTAsMCArMSw5NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorI2luY2x1ZGUgIm5lb24uUyIKKworICAgICAgICAvKiBILjI2NCBxcGVsIE1DICovCisKKy5tYWNybyAgbG93cGFzc19jb25zdCAgIHIKKyAgICAgICAgbW92dyAgICAgICAgICAgIFxyLCAgIzUKKyAgICAgICAgbW92dCAgICAgICAgICAgIFxyLCAgIzIwCisgICAgICAgIHZtb3YuMzIgICAgICAgICBkNlswXSwgXHIKKy5lbmRtCisKKy5tYWNybyAgbG93cGFzc184ICAgICAgIHIwLCAgcjEsICByMiwgIHIzLCAgZDAsICBkMSwgIG5hcnJvdz0xCisgIC5pZiBcbmFycm93CisgICAgICAgIHQwIC5yZXEgcTAKKyAgICAgICAgdDEgLnJlcSBxOAorICAuZWxzZQorICAgICAgICB0MCAucmVxIFxkMAorICAgICAgICB0MSAucmVxIFxkMQorICAuZW5kaWYKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQyLCAgXHIwLCBccjEsICMyCisgICAgICAgIHZleHQuOCAgICAgICAgICBkMywgIFxyMCwgXHIxLCAjMworICAgICAgICB2YWRkbC51OCAgICAgICAgcTEsICBkMiwgIGQzCisgICAgICAgIHZleHQuOCAgICAgICAgICBkNCwgIFxyMCwgXHIxLCAjMQorICAgICAgICB2ZXh0LjggICAgICAgICAgZDUsICBccjAsIFxyMSwgIzQKKyAgICAgICAgdmFkZGwudTggICAgICAgIHEyLCAgZDQsICBkNQorICAgICAgICB2ZXh0LjggICAgICAgICAgZDMwLCBccjAsIFxyMSwgIzUKKyAgICAgICAgdmFkZGwudTggICAgICAgIHQwLCAgXHIwLCBkMzAKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQxOCwgXHIyLCBccjMsICMyCisgICAgICAgIHZtbGEuaTE2ICAgICAgICB0MCwgIHExLCAgZDZbMV0KKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQxOSwgXHIyLCBccjMsICMzCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxOSwgIGQxOCwgZDE5CisgICAgICAgIHZleHQuOCAgICAgICAgICBkMjAsIFxyMiwgXHIzLCAjMQorICAgICAgICB2bWxzLmkxNiAgICAgICAgdDAsICBxMiwgIGQ2WzBdCisgICAgICAgIHZleHQuOCAgICAgICAgICBkMjEsIFxyMiwgXHIzLCAjNAorICAgICAgICB2YWRkbC51OCAgICAgICAgcTEwLCBkMjAsIGQyMQorICAgICAgICB2ZXh0LjggICAgICAgICAgZDMxLCBccjIsIFxyMywgIzUKKyAgICAgICAgdmFkZGwudTggICAgICAgIHQxLCAgXHIyLCBkMzEKKyAgICAgICAgdm1sYS5pMTYgICAgICAgIHQxLCAgcTksICBkNlsxXQorICAgICAgICB2bWxzLmkxNiAgICAgICAgdDEsICBxMTAsIGQ2WzBdCisgIC5pZiBcbmFycm93CisgICAgICAgIHZxcnNocnVuLnMxNiAgICBcZDAsIHQwLCAgIzUKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIFxkMSwgdDEsICAjNQorICAuZW5kaWYKKyAgICAgICAgLnVucmVxICB0MAorICAgICAgICAudW5yZXEgIHQxCisuZW5kbQorCisubWFjcm8gIGxvd3Bhc3NfOF8xICAgICByMCwgIHIxLCAgZDAsICBuYXJyb3c9MQorICAuaWYgXG5hcnJvdworICAgICAgICB0MCAucmVxIHEwCisgIC5lbHNlCisgICAgICAgIHQwIC5yZXEgXGQwCisgIC5lbmRpZgorICAgICAgICB2ZXh0LjggICAgICAgICAgZDIsICBccjAsIFxyMSwgIzIKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQzLCAgXHIwLCBccjEsICMzCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxMSwgIGQyLCAgZDMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ0LCAgXHIwLCBccjEsICMxCisgICAgICAgIHZleHQuOCAgICAgICAgICBkNSwgIFxyMCwgXHIxLCAjNAorICAgICAgICB2YWRkbC51OCAgICAgICAgcTIsICBkNCwgIGQ1CisgICAgICAgIHZleHQuOCAgICAgICAgICBkMzAsIFxyMCwgXHIxLCAjNQorICAgICAgICB2YWRkbC51OCAgICAgICAgdDAsICBccjAsIGQzMAorICAgICAgICB2bWxhLmkxNiAgICAgICAgdDAsICBxMSwgIGQ2WzFdCisgICAgICAgIHZtbHMuaTE2ICAgICAgICB0MCwgIHEyLCAgZDZbMF0KKyAgLmlmIFxuYXJyb3cKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIFxkMCwgdDAsICAjNQorICAuZW5kaWYKKyAgICAgICAgLnVucmVxICB0MAorLmVuZG0KKworLm1hY3JvICBsb3dwYXNzXzguMTYgICAgcjAsICByMSwgIGwwLCAgaDAsICBsMSwgIGgxLCAgZAorICAgICAgICB2ZXh0LjE2ICAgICAgICAgcTEsICBccjAsIFxyMSwgIzIKKyAgICAgICAgdmV4dC4xNiAgICAgICAgIHEwLCAgXHIwLCBccjEsICMzCisgICAgICAgIHZhZGRsLnMxNiAgICAgICBxOSwgIGQyLCAgZDAKKyAgICAgICAgdmV4dC4xNiAgICAgICAgIHEyLCAgXHIwLCBccjEsICMxCisgICAgICAgIHZhZGRsLnMxNiAgICAgICBxMSwgIGQzLCAgZDEKKyAgICAgICAgdmV4dC4xNiAgICAgICAgIHEzLCAgXHIwLCBccjEsICM0CisgICAgICAgIHZhZGRsLnMxNiAgICAgICBxMTAsIGQ0LCAgZDYKKyAgICAgICAgdmV4dC4xNiAgICAgICAgIFxyMSwgXHIwLCBccjEsICM1CisgICAgICAgIHZhZGRsLnMxNiAgICAgICBxMiwgIGQ1LCAgZDcKKyAgICAgICAgdmFkZGwuczE2ICAgICAgIHEwLCAgXGgwLCBcaDEKKyAgICAgICAgdmFkZGwuczE2ICAgICAgIHE4LCAgXGwwLCBcbDEKKworICAgICAgICB2c2hsLmkzMiAgICAgICAgcTMsICBxOSwgICM0CisgICAgICAgIHZzaGwuaTMyICAgICAgICBxOSwgIHE5LCAgIzIKKyAgICAgICAgdnNobC5pMzIgICAgICAgIHExNSwgcTEwLCAjMgorICAgICAgICB2YWRkLmkzMiAgICAgICAgcTksICBxOSwgIHEzCisgICAgICAgIHZhZGQuaTMyICAgICAgICBxMTAsIHExMCwgcTE1CisKKyAgICAgICAgdnNobC5pMzIgICAgICAgIHEzLCAgcTEsICAjNAorICAgICAgICB2c2hsLmkzMiAgICAgICAgcTEsICBxMSwgICMyCisgICAgICAgIHZzaGwuaTMyICAgICAgICBxMTUsIHEyLCAgIzIKKyAgICAgICAgdmFkZC5pMzIgICAgICAgIHExLCAgcTEsICBxMworICAgICAgICB2YWRkLmkzMiAgICAgICAgcTIsICBxMiwgIHExNQorCisgICAgICAgIHZhZGQuaTMyICAgICAgICBxOSwgIHE5LCAgcTgKKyAgICAgICAgdnN1Yi5pMzIgICAgICAgIHE5LCAgcTksICBxMTAKKworICAgICAgICB2YWRkLmkzMiAgICAgICAgcTEsICBxMSwgIHEwCisgICAgICAgIHZzdWIuaTMyICAgICAgICBxMSwgIHExLCAgcTIKKworICAgICAgICB2cnNocm4uczMyICAgICAgZDE4LCBxOSwgICMxMAorICAgICAgICB2cnNocm4uczMyICAgICAgZDE5LCBxMSwgICMxMAorCisgICAgICAgIHZxbW92dW4uczE2ICAgICBcZCwgIHE5CisuZW5kbQorCitmdW5jdGlvbiBwdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX25lb25fcGFja2VkCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIGxyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMxNgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjOAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgbHNsICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzE2CisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHI0CisgICAgICAgIGIgICAgICAgICAgICAgICBwdXRfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbmVvbgorZW5kZnVuYworCisubWFjcm8gIGgyNjRfcXBlbF9oX2xvd3Bhc3MgdHlwZQorZnVuY3Rpb24gXHR5cGVcKClfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX25lb24KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzE2CisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2hfbG93cGFzc19uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjMsIGxzbCAjNAorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIyLCBsc2wgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgICM4CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMxNgorICAgICAgICBwb3AgICAgICAgICAgICAge2xyfQorZW5kZnVuYworCitmdW5jdGlvbiBcdHlwZVwoKV9oMjY0X3FwZWw4X2hfbG93cGFzc19uZW9uCisxOiAgICAgIHZsZDEuOCAgICAgICAgICB7ZDAsIGQxfSwgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2LGQxN30sIFtyMV0sIHIyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgbG93cGFzc184ICAgICAgIGQwLCAgZDEsICBkMTYsIGQxNywgZDAsICBkMTYKKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMn0sICAgICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQwLCAgZDAsICBkMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QzfSwgICAgIFtyMCw6NjRdCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMTYsIGQxNiwgZDMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMworICAuZW5kaWYKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTZ9LCAgICBbcjAsOjY0XSwgcjMKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKworICAgICAgICBoMjY0X3FwZWxfaF9sb3dwYXNzIHB1dAorICAgICAgICBoMjY0X3FwZWxfaF9sb3dwYXNzIGF2ZworCisubWFjcm8gIGgyNjRfcXBlbF9oX2xvd3Bhc3NfbDIgdHlwZQorZnVuY3Rpb24gXHR5cGVcKClfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX2wyX25lb24KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzE2CisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2hfbG93cGFzc19sMl9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIsIGxzbCAjNAorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIyLCBsc2wgIzQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIzLCAgcjMsICByMiwgbHNsICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICAjOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsICByMywgICM4CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMxNgorICAgICAgICBwb3AgICAgICAgICAgICAge2xyfQorZW5kZnVuYworCitmdW5jdGlvbiBcdHlwZVwoKV9oMjY0X3FwZWw4X2hfbG93cGFzc19sMl9uZW9uCisxOiAgICAgIHZsZDEuOCAgICAgICAgICB7ZDAsIGQxfSwgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2LGQxN30sIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI4fSwgICAgIFtyM10sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI5fSwgICAgIFtyM10sIHIyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgbG93cGFzc184ICAgICAgIGQwLCAgZDEsICBkMTYsIGQxNywgZDAsICBkMQorICAgICAgICB2cmhhZGQudTggICAgICAgcTAsICBxMCwgIHExNAorICAuaWZjIFx0eXBlLGF2ZworICAgICAgICB2bGQxLjggICAgICAgICAge2QyfSwgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQwLCAgZDAsICBkMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QzfSwgICAgICBbcjAsOjY0XQorICAgICAgICB2cmhhZGQudTggICAgICAgZDEsICBkMSwgIGQzCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgLmVuZGlmCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDB9LCAgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge2QxfSwgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKworICAgICAgICBoMjY0X3FwZWxfaF9sb3dwYXNzX2wyIHB1dAorICAgICAgICBoMjY0X3FwZWxfaF9sb3dwYXNzX2wyIGF2ZworCitmdW5jdGlvbiBwdXRfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX25lb25fcGFja2VkCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIGxyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgICM4CisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIzLCBsc2wgIzIKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjMsIGxzbCAjNAorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIzLCBsc2wgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICAjOAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X2gyNjRfcXBlbDhfdl9sb3dwYXNzX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMywgbHNsICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHI0CisgICAgICAgIGIgICAgICAgICAgICAgICBwdXRfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbmVvbgorZW5kZnVuYworCisubWFjcm8gIGgyNjRfcXBlbF92X2xvd3Bhc3MgdHlwZQorZnVuY3Rpb24gXHR5cGVcKClfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHI0LCAgbHIKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfdl9sb3dwYXNzX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMywgbHNsICMyCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X3ZfbG93cGFzc19uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjMsIGxzbCAjNAorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIzLCBsc2wgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICAjOAorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIzLCBsc2wgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgcjQKK2VuZGZ1bmMKKworZnVuY3Rpb24gXHR5cGVcKClfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbmVvbgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q4fSwgIFtyMV0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDEwfSwgW3IxXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTJ9LCBbcjFdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QxNH0sIFtyMV0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIyfSwgW3IxXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjR9LCBbcjFdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QyNn0sIFtyMV0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI4fSwgW3IxXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkOX0sICBbcjFdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QxMX0sIFtyMV0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDEzfSwgW3IxXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTV9LCBbcjFdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QyM30sIFtyMV0KKworICAgICAgICB0cmFuc3Bvc2VfOHg4ICAgcTQsICBxNSwgIHE2LCAgcTcsICBxMTEsIHExMiwgcTEzLCBxMTQKKyAgICAgICAgbG93cGFzc184ICAgICAgIGQ4LCAgZDksICBkMTAsIGQxMSwgZDgsICBkMTAKKyAgICAgICAgbG93cGFzc184ICAgICAgIGQxMiwgZDEzLCBkMTQsIGQxNSwgZDEyLCBkMTQKKyAgICAgICAgbG93cGFzc184ICAgICAgIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDIyLCBkMjQKKyAgICAgICAgbG93cGFzc184ICAgICAgIGQyNiwgZDI3LCBkMjgsIGQyOSwgZDI2LCBkMjgKKyAgICAgICAgdHJhbnNwb3NlXzh4OCAgIGQ4LCAgZDEwLCBkMTIsIGQxNCwgZDIyLCBkMjQsIGQyNiwgZDI4CisKKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkOX0sICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQ4LCAgZDgsICBkOQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxMX0sIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDEwLCBkMTAsIGQxMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxM30sIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDEyLCBkMTIsIGQxMworICAgICAgICB2bGQxLjggICAgICAgICAge2QxNX0sIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDE0LCBkMTQsIGQxNQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyM30sIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDIyLCBkMjIsIGQyMworICAgICAgICB2bGQxLjggICAgICAgICAge2QyNX0sIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDI0LCBkMjQsIGQyNQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyN30sIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDI2LCBkMjYsIGQyNworICAgICAgICB2bGQxLjggICAgICAgICAge2QyOX0sIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDI4LCBkMjgsIGQyOQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIyLCAgbHNsICMzCisgIC5lbmRpZgorCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDh9LCAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDEwfSwgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDEyfSwgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDE0fSwgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIyfSwgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI0fSwgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI2fSwgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI4fSwgW3IwLDo2NF0sIHIyCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisuZW5kbQorCisgICAgICAgIGgyNjRfcXBlbF92X2xvd3Bhc3MgcHV0CisgICAgICAgIGgyNjRfcXBlbF92X2xvd3Bhc3MgYXZnCisKKy5tYWNybyAgaDI2NF9xcGVsX3ZfbG93cGFzc19sMiB0eXBlCitmdW5jdGlvbiBcdHlwZVwoKV9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICBscgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIzLCBsc2wgIzIKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfdl9sb3dwYXNzX2wyX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMywgbHNsICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIxMiwgcjIsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMywgbHNsICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjMsIGxzbCAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgICM4CisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X3ZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjMsIGxzbCAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByNAorZW5kZnVuYworCitmdW5jdGlvbiBcdHlwZVwoKV9oMjY0X3FwZWw4X3ZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDh9LCAgW3IxXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTB9LCBbcjFdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QxMn0sIFtyMV0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE0fSwgW3IxXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjJ9LCBbcjFdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QyNH0sIFtyMV0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI2fSwgW3IxXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjh9LCBbcjFdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2Q5fSwgIFtyMV0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDExfSwgW3IxXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTN9LCBbcjFdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QxNX0sIFtyMV0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIzfSwgW3IxXQorCisgICAgICAgIHRyYW5zcG9zZV84eDggICBxNCwgIHE1LCAgcTYsICBxNywgIHExMSwgcTEyLCBxMTMsIHExNAorICAgICAgICBsb3dwYXNzXzggICAgICAgZDgsICBkOSwgIGQxMCwgZDExLCBkOCwgIGQ5CisgICAgICAgIGxvd3Bhc3NfOCAgICAgICBkMTIsIGQxMywgZDE0LCBkMTUsIGQxMiwgZDEzCisgICAgICAgIGxvd3Bhc3NfOCAgICAgICBkMjIsIGQyMywgZDI0LCBkMjUsIGQyMiwgZDIzCisgICAgICAgIGxvd3Bhc3NfOCAgICAgICBkMjYsIGQyNywgZDI4LCBkMjksIGQyNiwgZDI3CisgICAgICAgIHRyYW5zcG9zZV84eDggICBkOCwgIGQ5LCAgZDEyLCBkMTMsIGQyMiwgZDIzLCBkMjYsIGQyNworCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCAgW3IxMl0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDF9LCAgW3IxMl0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCAgW3IxMl0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCAgW3IxMl0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDR9LCAgW3IxMl0sIHIyCisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMCwgIHEwLCAgcTQKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNX0sICBbcjEyXSwgcjIKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHExLCAgcTEsICBxNgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxMH0sIFtyMTJdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgcTIsICBxMiwgIHExMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxMX0sIFtyMTJdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgcTUsICBxNSwgIHExMworCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2fSwgW3IwLDo2NF0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMCwgIGQwLCAgZDE2CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE3fSwgW3IwLDo2NF0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMSwgIGQxLCAgZDE3CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2fSwgW3IwLDo2NF0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMiwgIGQyLCAgZDE2CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE3fSwgW3IwLDo2NF0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMywgIGQzLCAgZDE3CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2fSwgW3IwLDo2NF0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkNCwgIGQ0LCAgZDE2CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE3fSwgW3IwLDo2NF0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkNSwgIGQ1LCAgZDE3CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2fSwgW3IwLDo2NF0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMTAsIGQxMCwgZDE2CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE3fSwgW3IwLDo2NF0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMTEsIGQxMSwgZDE3CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjMsICBsc2wgIzMKKyAgLmVuZGlmCisKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMX0sICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMn0sICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkM30sICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNH0sICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNX0sICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTB9LCBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTF9LCBbcjAsOjY0XSwgcjMKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgaDI2NF9xcGVsX3ZfbG93cGFzc19sMiBwdXQKKyAgICAgICAgaDI2NF9xcGVsX3ZfbG93cGFzc19sMiBhdmcKKworZnVuY3Rpb24gcHV0X2gyNjRfcXBlbDhfaHZfbG93cGFzc19uZW9uX3RvcAorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgcjEyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMxMgorMTogICAgICB2bGQxLjggICAgICAgICAge2QwLCBkMX0sICBbcjFdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QxNixkMTd9LCBbcjFdLCByMworICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGxvd3Bhc3NfOCAgICAgICBkMCwgIGQxLCAgZDE2LCBkMTcsIHExMSwgcTEyLCBuYXJyb3c9MAorICAgICAgICB2c3QxLjggICAgICAgICAge2QyMi1kMjV9LCBbcjQsOjEyOF0hCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDAsIGQxfSwgIFtyMV0KKyAgICAgICAgbG93cGFzc184XzEgICAgIGQwLCAgZDEsICBxMTIsIG5hcnJvdz0wCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIy0xNgorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICByNCwgIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QzMCxkMzF9LCBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMCxkMjF9LCBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxOCxkMTl9LCBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxNixkMTd9LCBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxNCxkMTV9LCBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxMixkMTN9LCBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxMCxkMTF9LCBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q4LCBkOX0sICBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q2LCBkN30sICBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0LCBkNX0sICBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyLCBkM30sICBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QwLCBkMX0sICBbcjQsOjEyOF0KKworICAgICAgICBzd2FwNCAgICAgICAgICAgZDEsICBkMywgIGQ1LCAgZDcsICBkOCwgIGQxMCwgZDEyLCBkMTQKKyAgICAgICAgdHJhbnNwb3NlMTZfNHg0IHEwLCAgcTEsICBxMiwgIHEzLCAgcTQsICBxNSwgIHE2LCAgcTcKKworICAgICAgICBzd2FwNCAgICAgICAgICAgZDE3LCBkMTksIGQyMSwgZDMxLCBkMjQsIGQyNiwgZDI4LCBkMjIKKyAgICAgICAgdHJhbnNwb3NlMTZfNHg0IHE4LCAgcTksICBxMTAsIHExNSwgcTEyLCBxMTMsIHExNCwgcTExCisKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMzAsZDMxfSwgW3I0LDoxMjhdIQorICAgICAgICB2c3QxLjggICAgICAgICAge2Q2LCBkN30sICBbcjQsOjEyOF0hCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIwLGQyMX0sIFtyNCw6MTI4XSEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNCwgZDV9LCAgW3I0LDoxMjhdIQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxOCxkMTl9LCBbcjQsOjEyOF0hCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIsIGQzfSwgIFtyNCw6MTI4XSEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTYsZDE3fSwgW3I0LDoxMjhdIQorICAgICAgICB2c3QxLjggICAgICAgICAge2QwLCBkMX0sICBbcjQsOjEyOF0KKworICAgICAgICBsb3dwYXNzXzguMTYgICAgcTQsICBxMTIsIGQ4LCAgZDksICBkMjQsIGQyNSwgZDgKKyAgICAgICAgbG93cGFzc184LjE2ICAgIHE1LCAgcTEzLCBkMTAsIGQxMSwgZDI2LCBkMjcsIGQ5CisgICAgICAgIGxvd3Bhc3NfOC4xNiAgICBxNiwgIHExNCwgZDEyLCBkMTMsIGQyOCwgZDI5LCBkMTAKKyAgICAgICAgbG93cGFzc184LjE2ICAgIHE3LCAgcTExLCBkMTQsIGQxNSwgZDIyLCBkMjMsIGQxMQorCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2LGQxN30sIFtyNCw6MTI4XSwgcjEyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDMwLGQzMX0sIFtyNCw6MTI4XSwgcjEyCisgICAgICAgIGxvd3Bhc3NfOC4xNiAgICBxOCwgIHExNSwgZDE2LCBkMTcsIGQzMCwgZDMxLCBkMTIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTYsZDE3fSwgW3I0LDoxMjhdLCByMTIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMzAsZDMxfSwgW3I0LDoxMjhdLCByMTIKKyAgICAgICAgbG93cGFzc184LjE2ICAgIHE4LCAgcTE1LCBkMTYsIGQxNywgZDMwLCBkMzEsIGQxMworICAgICAgICB2bGQxLjggICAgICAgICAge2QxNixkMTd9LCBbcjQsOjEyOF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QzMCxkMzF9LCBbcjQsOjEyOF0sIHIxMgorICAgICAgICBsb3dwYXNzXzguMTYgICAgcTgsICBxMTUsIGQxNiwgZDE3LCBkMzAsIGQzMSwgZDE0CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2LGQxN30sIFtyNCw6MTI4XSwgcjEyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDMwLGQzMX0sIFtyNCw6MTI4XQorICAgICAgICBsb3dwYXNzXzguMTYgICAgcTgsICBxMTUsIGQxNiwgZDE3LCBkMzAsIGQzMSwgZDE1CisKKyAgICAgICAgdHJhbnNwb3NlXzh4OCAgIGQxMiwgZDEzLCBkMTQsIGQxNSwgZDgsICBkOSwgIGQxMCwgZDExCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKy5tYWNybyAgaDI2NF9xcGVsOF9odl9sb3dwYXNzIHR5cGUKK2Z1bmN0aW9uIFx0eXBlXCgpX2gyNjRfcXBlbDhfaHZfbG93cGFzc19uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTAsIGxyCisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfaDI2NF9xcGVsOF9odl9sb3dwYXNzX25lb25fdG9wCisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCAgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDEyLCBkMTIsIGQwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDF9LCAgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDEzLCBkMTMsIGQxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCAgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDE0LCBkMTQsIGQyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCAgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDE1LCBkMTUsIGQzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDR9LCAgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDgsICBkOCwgIGQ0CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCAgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDksICBkOSwgIGQ1CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCAgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDEwLCBkMTAsIGQ2CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDd9LCAgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDExLCBkMTEsIGQ3CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIsICBsc2wgIzMKKyAgLmVuZGlmCisKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTJ9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDEzfSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge2QxNH0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTV9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDh9LCAgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge2Q5fSwgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTB9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDExfSwgICAgIFtyMCw6NjRdLCByMgorCisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHIxMAorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgaDI2NF9xcGVsOF9odl9sb3dwYXNzIHB1dAorICAgICAgICBoMjY0X3FwZWw4X2h2X2xvd3Bhc3MgYXZnCisKKy5tYWNybyAgaDI2NF9xcGVsOF9odl9sb3dwYXNzX2wyIHR5cGUKK2Z1bmN0aW9uIFx0eXBlXCgpX2gyNjRfcXBlbDhfaHZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTAsIGxyCisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfaDI2NF9xcGVsOF9odl9sb3dwYXNzX25lb25fdG9wCisKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMCwgZDF9LCAgW3IyLDoxMjhdIQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyLCBkM30sICBbcjIsOjEyOF0hCisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMCwgIHEwLCAgcTYKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNCwgZDV9LCAgW3IyLDoxMjhdIQorICAgICAgICB2cmhhZGQudTggICAgICAgcTEsICBxMSwgIHE3CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDYsIGQ3fSwgIFtyMiw6MTI4XSEKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHEyLCAgcTIsICBxNAorICAgICAgICB2cmhhZGQudTggICAgICAgcTMsICBxMywgIHE1CisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2fSwgICAgIFtyMCw6NjRdLCByMworICAgICAgICB2cmhhZGQudTggICAgICAgZDAsICBkMCwgIGQxNgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxN30sICAgICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQxLCAgZDEsICBkMTcKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTh9LCAgICAgW3IwLDo2NF0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMiwgIGQyLCAgZDE4CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE5fSwgICAgIFtyMCw6NjRdLCByMworICAgICAgICB2cmhhZGQudTggICAgICAgZDMsICBkMywgIGQxOQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMH0sICAgICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQ0LCAgZDQsICBkMjAKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjF9LCAgICAgW3IwLDo2NF0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkNSwgIGQ1LCAgZDIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIyfSwgICAgIFtyMCw6NjRdLCByMworICAgICAgICB2cmhhZGQudTggICAgICAgZDYsICBkNiwgIGQyMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyM30sICAgICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQ3LCAgZDcsICBkMjMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMywgIGxzbCAjMworICAuZW5kaWYKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICAgICAgW3IwLDo2NF0sIHIzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDF9LCAgICAgIFtyMCw6NjRdLCByMworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgICAgICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkM30sICAgICAgW3IwLDo2NF0sIHIzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDR9LCAgICAgIFtyMCw6NjRdLCByMworICAgICAgICB2c3QxLjggICAgICAgICAge2Q1fSwgICAgICBbcjAsOjY0XSwgcjMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNn0sICAgICAgW3IwLDo2NF0sIHIzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDd9LCAgICAgIFtyMCw6NjRdLCByMworCisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHIxMAorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgaDI2NF9xcGVsOF9odl9sb3dwYXNzX2wyIHB1dAorICAgICAgICBoMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbDIgYXZnCisKKy5tYWNybyAgaDI2NF9xcGVsMTZfaHYgIHR5cGUKK2Z1bmN0aW9uIFx0eXBlXCgpX2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgcjksICBscgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9odl9sb3dwYXNzX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMywgbHNsICMyCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIzLCBsc2wgIzQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMywgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMiwgbHNsICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfaHZfbG93cGFzc19uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjMsIGxzbCAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByOQorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9odl9sb3dwYXNzX25lb24KK2VuZGZ1bmMKKworZnVuY3Rpb24gXHR5cGVcKClfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICByOSwgIGxyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHI0LCAgIzI1NgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9odl9sb3dwYXNzX2wyX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMywgbHNsICMyCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIzLCBsc2wgIzQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMywgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMywgbHNsICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfaHZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjMsIGxzbCAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByOQorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9odl9sb3dwYXNzX2wyX25lb24KK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgaDI2NF9xcGVsMTZfaHYgcHV0CisgICAgICAgIGgyNjRfcXBlbDE2X2h2IGF2ZworCisubWFjcm8gIGgyNjRfcXBlbDggICAgICB0eXBlCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWw4X21jMTBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbG93cGFzc19jb25zdCAgIHIzCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzgKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfaF9sb3dwYXNzX2wyX25lb24KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsOF9tYzIwX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxvd3Bhc3NfY29uc3QgICByMworICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgIHIyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICM4CisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2hfbG93cGFzc19uZW9uCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMzMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgcjMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjEsICAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICM4CisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2hfbG93cGFzc19sMl9uZW9uCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMwMV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge2xyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCByMQorXHR5cGVcKClfaDI2NF9xcGVsOF9tYzAxOgorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgcjMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgcjIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgbHNsICMxCisgICAgICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsOF9tYzExX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjAsIHIxLCByMTEsIGxyfQorXHR5cGVcKClfaDI2NF9xcGVsOF9tYzExOgorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgcjMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMSwgc3AKK0EgICAgICAgYmljICAgICAgICAgICAgIHNwLCAgc3AsICAjMTUKK1QgICAgICAgYmljICAgICAgICAgICAgIHIwLCAgcjExLCAjMTUKK1QgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgcjAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjNjQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgc3AKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjOAorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19uZW9uCisgICAgICAgIGxkcmQgICAgICAgICAgICByMCwgIHIxLCAgW3IxMV0sICM4CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgIHIyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHNwLCAgIzY0CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIsIGxzbCAjMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjIsICAjOAorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgcjExCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjExLCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsOF9tYzIxX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjAsIHIxLCByNCwgcjEwLCByMTEsIGxyfQorXHR5cGVcKClfaDI2NF9xcGVsOF9tYzIxOgorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgcjMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMSwgc3AKK0EgICAgICAgYmljICAgICAgICAgICAgIHNwLCAgc3AsICAjMTUKK1QgICAgICAgYmljICAgICAgICAgICAgIHIwLCAgcjExLCAjMTUKK1QgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgcjAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjKDgqOCsxNioxMikKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgcjAsICBzcAorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjOAorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIHIwCisgICAgICAgIGxkcmQgICAgICAgICAgICByMCwgIHIxLCAgW3IxMV0sICM4CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIsIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgIHIyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHI0LCAgIzY0CisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgcjExCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQsIHIxMCwgcjExLCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsOF9tYzMxX25lb24sIGV4cG9ydD0xCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMCwgcjEsIHIxMSwgbHJ9CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzEKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfbWMxMQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWw4X21jMDJfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtscn0KKyAgICAgICAgbG93cGFzc19jb25zdCAgIHIzCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIsIGxzbCAjMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMgorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfdl9sb3dwYXNzX25lb24KKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMxMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3IwLCByMSwgcjQsIHIxMCwgcjExLCBscn0KK1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMxMjoKKyAgICAgICAgbG93cGFzc19jb25zdCAgIHIzCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTEsIHNwCitBICAgICAgIGJpYyAgICAgICAgICAgICBzcCwgIHNwLCAgIzE1CitUICAgICAgIGJpYyAgICAgICAgICAgICByMCwgIHIxMSwgIzE1CitUICAgICAgIG1vdiAgICAgICAgICAgICBzcCwgIHIwCisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIyg4KjgrMTYqMTIpCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIsIGxzbCAjMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjIsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgcjAsICBzcAorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIHIwCisgICAgICAgIGxkcmQgICAgICAgICAgICByMCwgIHIxLCAgW3IxMV0sICM4CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjMsIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHI0LCAgIzY0CisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbDJfbmVvbgorICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgcjExCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQsIHIxMCwgcjExLCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsOF9tYzIyX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsIHIxMCwgcjExLCBscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMSwgc3AKK0EgICAgICAgYmljICAgICAgICAgICAgIHNwLCAgc3AsICAjMTUKK1QgICAgICAgYmljICAgICAgICAgICAgIHI0LCAgcjExLCAjMTUKK1QgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgcjQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgcjIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjKDE2KjEyKQorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICBzcAorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfaHZfbG93cGFzc19uZW9uCisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBtb3YgICAgICAgICAgICAgc3AsICByMTEKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCwgcjEwLCByMTEsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWw4X21jMzJfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMCwgcjEsIHI0LCByMTAsIHIxMSwgbHJ9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzEKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfbWMxMgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWw4X21jMDNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtscn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjEsICByMgorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9tYzAxCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMxM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3IwLCByMSwgcjExLCBscn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9tYzExCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMyM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3IwLCByMSwgcjQsIHIxMCwgcjExLCBscn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsOF9tYzIxCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDhfbWMzM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjAsIHIxLCByMTEsIGxyfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzEKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDhfbWMxMQorZW5kZnVuYworLmVuZG0KKworICAgICAgICBoMjY0X3FwZWw4IHB1dAorICAgICAgICBoMjY0X3FwZWw4IGF2ZworCisubWFjcm8gIGgyNjRfcXBlbDE2ICAgICB0eXBlCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzEwX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxvd3Bhc3NfY29uc3QgICByMworICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbDJfbmVvbgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzIwX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxvd3Bhc3NfY29uc3QgICByMworICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgIHIyCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbmVvbgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzMwX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxvd3Bhc3NfY29uc3QgICByMworICAgICAgICBhZGQgICAgICAgICAgICAgcjMsICByMSwgICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzIKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDE2X2hfbG93cGFzc19sMl9uZW9uCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMDFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCwgbHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsIHIxCitcdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzAxOgorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgcjMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgcjIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgbHNsICMxCisgICAgICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX2wyX25lb24KKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzExX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjAsIHIxLCByNCwgcjExLCBscn0KK1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMTE6CisgICAgICAgIGxvd3Bhc3NfY29uc3QgICByMworICAgICAgICBtb3YgICAgICAgICAgICAgcjExLCBzcAorQSAgICAgICBiaWMgICAgICAgICAgICAgc3AsICBzcCwgICMxNQorVCAgICAgICBiaWMgICAgICAgICAgICAgcjAsICByMTEsICMxNQorVCAgICAgICBtb3YgICAgICAgICAgICAgc3AsICByMAorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMyNTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgc3AKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMTYKKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX25lb24KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHIwLCAgcjEsICBbcjExXSwgIzgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgcjIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgc3AsICAjNjQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgbHNsICMxCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgICMxNgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX2wyX25lb24KKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIG1vdiAgICAgICAgICAgICBzcCwgIHIxMQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LCByMTEsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzIxX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjAsIHIxLCByNC1yNSwgcjktcjExLCBscn0KK1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMjE6CisgICAgICAgIGxvd3Bhc3NfY29uc3QgICByMworICAgICAgICBtb3YgICAgICAgICAgICAgcjExLCBzcAorQSAgICAgICBiaWMgICAgICAgICAgICAgc3AsICBzcCwgICMxNQorVCAgICAgICBiaWMgICAgICAgICAgICAgcjAsICByMTEsICMxNQorVCAgICAgICBtb3YgICAgICAgICAgICAgc3AsICByMAorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMoMTYqMTYrMTYqMTIpCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgc3AKKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX25lb25fcGFja2VkCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIHIwCisgICAgICAgIGxkcmQgICAgICAgICAgICByMCwgIHIxLCAgW3IxMV0sICM4CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIsIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgIHIyCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX2wyX25lb24KKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIG1vdiAgICAgICAgICAgICBzcCwgIHIxMQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI1LCByOS1yMTEsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzMxX25lb24sIGV4cG9ydD0xCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMCwgcjEsIHI0LCByMTEsIGxyfQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzExCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMDJfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCwgbHJ9CisgICAgICAgIGxvd3Bhc3NfY29uc3QgICByMworICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIyLCBsc2wgIzEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgcjIKKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbmVvbgorICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMTJfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMCwgcjEsIHI0LXI1LCByOS1yMTEsIGxyfQorXHR5cGVcKClfaDI2NF9xcGVsMTZfbWMxMjoKKyAgICAgICAgbG93cGFzc19jb25zdCAgIHIzCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTEsIHNwCitBICAgICAgIGJpYyAgICAgICAgICAgICBzcCwgIHNwLCAgIzE1CitUICAgICAgIGJpYyAgICAgICAgICAgICByMCwgIHIxMSwgIzE1CitUICAgICAgIG1vdiAgICAgICAgICAgICBzcCwgIHIwCisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIygxNioxNisxNioxMikKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgbHNsICMxCisgICAgICAgIG1vdiAgICAgICAgICAgICByMCwgIHNwCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgIHIyCisgICAgICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X2gyNjRfcXBlbDE2X3ZfbG93cGFzc19uZW9uX3BhY2tlZAorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICByMAorICAgICAgICBsZHJkICAgICAgICAgICAgcjAsICByMSwgIFtyMTFdLCAjOAorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIzLCBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjIsICByMworICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19sMl9uZW9uCisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBtb3YgICAgICAgICAgICAgc3AsICByMTEKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNSwgcjktcjExLCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsMTZfbWMyMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LCByOS1yMTEsIGxyfQorICAgICAgICBsb3dwYXNzX2NvbnN0ICAgcjMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMSwgc3AKK0EgICAgICAgYmljICAgICAgICAgICAgIHNwLCAgc3AsICAjMTUKK1QgICAgICAgYmljICAgICAgICAgICAgIHI0LCAgcjExLCAjMTUKK1QgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgcjQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgcjIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjKDE2KjEyKQorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICBzcAorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbmVvbgorICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgcjExCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQsIHI5LXIxMSwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMzJfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMCwgcjEsIHI0LXI1LCByOS1yMTEsIGxyfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzEyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX2gyNjRfcXBlbDE2X21jMDNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCwgbHJ9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxLCAgcjIKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDE2X21jMDEKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsMTZfbWMxM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3IwLCByMSwgcjQsIHIxMSwgbHJ9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDE2X21jMTEKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsMTZfbWMyM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3IwLCByMSwgcjQtcjUsIHI5LXIxMSwgbHJ9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX2gyNjRfcXBlbDE2X21jMjEKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfaDI2NF9xcGVsMTZfbWMzM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjAsIHIxLCByNCwgcjExLCBscn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9oMjY0X3FwZWwxNl9tYzExCitlbmRmdW5jCisuZW5kbQorCisgICAgICAgIGgyNjRfcXBlbDE2IHB1dAorICAgICAgICBoMjY0X3FwZWwxNiBhdmcKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ocGVsZHNwX2FybS5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2hwZWxkc3BfYXJtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5Zjc5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ocGVsZHNwX2FybS5TCkBAIC0wLDAgKzEsNjAzIEBACitACitAIEFSTXY0LW9wdGltaXplZCBoYWxmcGVsIGZ1bmN0aW9ucworQCBDb3B5cmlnaHQgKGMpIDIwMDQgQUdBV0EgS29qaSA8aSAoQVQpIGF0dHkgKERPVCkganA+CitACitAIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KK0AKK0AgRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorQCBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCitAIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorQCB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK0AKK0AgRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitAIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitAIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitAIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCitACitAIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0AgTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorQCBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCitACisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCisjaWYgIUhBVkVfQVJNVjVURV9FWFRFUk5BTAorI2RlZmluZSBwbGQgQAorI2VuZGlmCisKKy5tYWNybyAgQUxJR05fUVdPUkRfRCBzaGlmdCwgUmQwLCBSZDEsIFJkMiwgUmQzLCBSbjAsIFJuMSwgUm4yLCBSbjMsIFJuNAorICAgICAgICBtb3YgICAgICAgICAgICAgXFJkMCwgXFJuMCwgbHNyICMoXHNoaWZ0ICogOCkKKyAgICAgICAgbW92ICAgICAgICAgICAgIFxSZDEsIFxSbjEsIGxzciAjKFxzaGlmdCAqIDgpCisgICAgICAgIG1vdiAgICAgICAgICAgICBcUmQyLCBcUm4yLCBsc3IgIyhcc2hpZnQgKiA4KQorICAgICAgICBtb3YgICAgICAgICAgICAgXFJkMywgXFJuMywgbHNyICMoXHNoaWZ0ICogOCkKKyAgICAgICAgb3JyICAgICAgICAgICAgIFxSZDAsIFxSZDAsIFxSbjEsIGxzbCAjKDMyIC0gXHNoaWZ0ICogOCkKKyAgICAgICAgb3JyICAgICAgICAgICAgIFxSZDEsIFxSZDEsIFxSbjIsIGxzbCAjKDMyIC0gXHNoaWZ0ICogOCkKKyAgICAgICAgb3JyICAgICAgICAgICAgIFxSZDIsIFxSZDIsIFxSbjMsIGxzbCAjKDMyIC0gXHNoaWZ0ICogOCkKKyAgICAgICAgb3JyICAgICAgICAgICAgIFxSZDMsIFxSZDMsIFxSbjQsIGxzbCAjKDMyIC0gXHNoaWZ0ICogOCkKKy5lbmRtCisubWFjcm8gIEFMSUdOX0RXT1JEIHNoaWZ0LCBSMCwgUjEsIFIyCisgICAgICAgIG1vdiAgICAgICAgICAgICBcUjAsIFxSMCwgbHNyICMoXHNoaWZ0ICogOCkKKyAgICAgICAgb3JyICAgICAgICAgICAgIFxSMCwgXFIwLCBcUjEsIGxzbCAjKDMyIC0gXHNoaWZ0ICogOCkKKyAgICAgICAgbW92ICAgICAgICAgICAgIFxSMSwgXFIxLCBsc3IgIyhcc2hpZnQgKiA4KQorICAgICAgICBvcnIgICAgICAgICAgICAgXFIxLCBcUjEsIFxSMiwgbHNsICMoMzIgLSBcc2hpZnQgKiA4KQorLmVuZG0KKy5tYWNybyAgQUxJR05fRFdPUkRfRCBzaGlmdCwgUmRzdDAsIFJkc3QxLCBSc3JjMCwgUnNyYzEsIFJzcmMyCisgICAgICAgIG1vdiAgICAgICAgICAgICBcUmRzdDAsIFxSc3JjMCwgbHNyICMoXHNoaWZ0ICogOCkKKyAgICAgICAgbW92ICAgICAgICAgICAgIFxSZHN0MSwgXFJzcmMxLCBsc3IgIyhcc2hpZnQgKiA4KQorICAgICAgICBvcnIgICAgICAgICAgICAgXFJkc3QwLCBcUmRzdDAsIFxSc3JjMSwgbHNsICMoMzIgLSAoXHNoaWZ0ICogOCkpCisgICAgICAgIG9yciAgICAgICAgICAgICBcUmRzdDEsIFxSZHN0MSwgXFJzcmMyLCBsc2wgIygzMiAtIChcc2hpZnQgKiA4KSkKKy5lbmRtCisKKy5tYWNybyAgUk5EX0FWRzMyIFJkMCwgUmQxLCBSbjAsIFJuMSwgUm0wLCBSbTEsIFJtYXNrCisgICAgICAgIEAgUmQgPSAoUm4gfCBSbSkgLSAoKChSbiBeIFJtKSAmIH4weDAxMDEwMTAxKSA+PiAxKQorICAgICAgICBAIFJtYXNrID0gMHhGRUZFRkVGRQorICAgICAgICBAIFJuID0gZGVzdHJveQorICAgICAgICBlb3IgICAgICAgICAgICAgXFJkMCwgXFJuMCwgXFJtMAorICAgICAgICBlb3IgICAgICAgICAgICAgXFJkMSwgXFJuMSwgXFJtMQorICAgICAgICBvcnIgICAgICAgICAgICAgXFJuMCwgXFJuMCwgXFJtMAorICAgICAgICBvcnIgICAgICAgICAgICAgXFJuMSwgXFJuMSwgXFJtMQorICAgICAgICBhbmQgICAgICAgICAgICAgXFJkMCwgXFJkMCwgXFJtYXNrCisgICAgICAgIGFuZCAgICAgICAgICAgICBcUmQxLCBcUmQxLCBcUm1hc2sKKyAgICAgICAgc3ViICAgICAgICAgICAgIFxSZDAsIFxSbjAsIFxSZDAsIGxzciAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgXFJkMSwgXFJuMSwgXFJkMSwgbHNyICMxCisuZW5kbQorCisubWFjcm8gIE5PX1JORF9BVkczMiBSZDAsIFJkMSwgUm4wLCBSbjEsIFJtMCwgUm0xLCBSbWFzaworICAgICAgICBAIFJkID0gKFJuICYgUm0pIC0gKCgoUm4gXiBSbSkgJiB+MHgwMTAxMDEwMSkgPj4gMSkKKyAgICAgICAgQCBSbWFzayA9IDB4RkVGRUZFRkUKKyAgICAgICAgQCBSbiA9IGRlc3Ryb3kKKyAgICAgICAgZW9yICAgICAgICAgICAgIFxSZDAsIFxSbjAsIFxSbTAKKyAgICAgICAgZW9yICAgICAgICAgICAgIFxSZDEsIFxSbjEsIFxSbTEKKyAgICAgICAgYW5kICAgICAgICAgICAgIFxSbjAsIFxSbjAsIFxSbTAKKyAgICAgICAgYW5kICAgICAgICAgICAgIFxSbjEsIFxSbjEsIFxSbTEKKyAgICAgICAgYW5kICAgICAgICAgICAgIFxSZDAsIFxSZDAsIFxSbWFzaworICAgICAgICBhbmQgICAgICAgICAgICAgXFJkMSwgXFJkMSwgXFJtYXNrCisgICAgICAgIGFkZCAgICAgICAgICAgICBcUmQwLCBcUm4wLCBcUmQwLCBsc3IgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxSZDEsIFxSbjEsIFxSZDEsIGxzciAjMQorLmVuZG0KKworLm1hY3JvICBKTVBfQUxJR04gdG1wLCByZWcKKyAgICAgICAgYW5kcyAgICAgICAgICAgIFx0bXAsIFxyZWcsICMzCisgICAgICAgIGJpYyAgICAgICAgICAgICBccmVnLCBccmVnLCAjMworICAgICAgICBiZXEgICAgICAgICAgICAgMWYKKyAgICAgICAgc3VicyAgICAgICAgICAgIFx0bXAsIFx0bXAsICMxCisgICAgICAgIGJlcSAgICAgICAgICAgICAyZgorICAgICAgICBzdWJzICAgICAgICAgICAgXHRtcCwgXHRtcCwgIzEKKyAgICAgICAgYmVxICAgICAgICAgICAgIDNmCisgICAgICAgIGIgICAgNGYKKy5lbmRtCisKK0AgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb24gZmZfcHV0X3BpeGVsczE2X2FybSwgZXhwb3J0PTEsIGFsaWduPTUKKyAgICAgICAgQCB2b2lkIGZ1bmModWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgaW50IGxpbmVfc2l6ZSwgaW50IGgpCisgICAgICAgIEAgYmxvY2sgPSB3b3JkIGFsaWduZWQsIHBpeGxlcyA9IHVuYWxpZ25lZAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMSwgbHJ9CisgICAgICAgIEpNUF9BTElHTiAgICAgICByNSwgIHIxCisxOgorICAgICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjQtcjd9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3I0LXI3fQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjExLCBwY30KKyAgICAgICAgLmFsaWduIDUKKzI6CisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yOH0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBBTElHTl9RV09SRF9EICAgMSwgICByOSwgIHIxMCwgcjExLCByMTIsIHI0LCAgcjUsICByNiwgIHI3LCAgcjgKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBzdG0gICAgICAgICAgICAgcjAsICB7cjktcjEyfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAyYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXIxMSwgcGN9CisgICAgICAgIC5hbGlnbiA1CiszOgorICAgICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjQtcjh9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgQUxJR05fUVdPUkRfRCAgIDIsICAgcjksICByMTAsIHIxMSwgcjEyLCByNCwgIHI1LCAgcjYsICByNywgIHI4CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3I5LXIxMn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMgorICAgICAgICBibmUgICAgICAgICAgICAgM2IKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTEsIHBjfQorICAgICAgICAuYWxpZ24gNQorNDoKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI4fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIEFMSUdOX1FXT1JEX0QgICAzLCAgIHI5LCAgcjEwLCByMTEsIHIxMiwgcjQsICByNSwgIHI2LCAgcjcsICByOAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyOS1yMTJ9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDRiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjExLHBjfQorZW5kZnVuYworCitAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9uIGZmX3B1dF9waXhlbHM4X2FybSwgZXhwb3J0PTEsIGFsaWduPTUKKyAgICAgICAgQCB2b2lkIGZ1bmModWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgaW50IGxpbmVfc2l6ZSwgaW50IGgpCisgICAgICAgIEAgYmxvY2sgPSB3b3JkIGFsaWduZWQsIHBpeGxlcyA9IHVuYWxpZ25lZAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI1LGxyfQorICAgICAgICBKTVBfQUxJR04gICAgICAgcjUsICByMQorMToKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI1fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3I0LXI1fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI1LHBjfQorICAgICAgICAuYWxpZ24gNQorMjoKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI1LCByMTJ9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgQUxJR05fRFdPUkQgICAgIDEsICAgcjQsICByNSwgIHIxMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyNC1yNX0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMgorICAgICAgICBibmUgICAgICAgICAgICAgMmIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNSxwY30KKyAgICAgICAgLmFsaWduIDUKKzM6CisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yNSwgcjEyfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIEFMSUdOX0RXT1JEICAgICAyLCAgIHI0LCAgcjUsICByMTIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBzdG0gICAgICAgICAgICAgcjAsICB7cjQtcjV9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDNiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjUscGN9CisgICAgICAgIC5hbGlnbiA1Cis0OgorICAgICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjQtcjUsIHIxMn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBBTElHTl9EV09SRCAgICAgMywgICByNCwgIHI1LCAgcjEyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3I0LXI1fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICA0YgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI1LHBjfQorZW5kZnVuYworCitAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9uIGZmX3B1dF9waXhlbHM4X3gyX2FybSwgZXhwb3J0PTEsIGFsaWduPTUKKyAgICAgICAgQCB2b2lkIGZ1bmModWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgaW50IGxpbmVfc2l6ZSwgaW50IGgpCisgICAgICAgIEAgYmxvY2sgPSB3b3JkIGFsaWduZWQsIHBpeGxlcyA9IHVuYWxpZ25lZAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMCxscn0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgPTB4ZmVmZWZlZmUKKyAgICAgICAgSk1QX0FMSUdOICAgICAgIHI1LCAgcjEKKzE6CisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yNSwgcjEwfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIEFMSUdOX0RXT1JEX0QgICAxLCAgIHI2LCAgcjcsICByNCwgIHI1LCAgcjEwCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIFJORF9BVkczMiAgICAgICByOCwgIHI5LCAgcjQsICByNSwgIHI2LCAgcjcsICByMTIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBzdG0gICAgICAgICAgICAgcjAsICB7cjgtcjl9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjEwLHBjfQorICAgICAgICAuYWxpZ24gNQorMjoKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI1LCByMTB9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgQUxJR05fRFdPUkRfRCAgIDEsICAgcjYsICByNywgIHI0LCAgcjUsICByMTAKKyAgICAgICAgQUxJR05fRFdPUkRfRCAgIDIsICAgcjgsICByOSwgIHI0LCAgcjUsICByMTAKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgUk5EX0FWRzMyICAgICAgIHI0LCAgcjUsICByNiwgIHI3LCAgcjgsICByOSwgIHIxMgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyNC1yNX0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMgorICAgICAgICBibmUgICAgICAgICAgICAgMmIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTAscGN9CisgICAgICAgIC5hbGlnbiA1CiszOgorICAgICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjQtcjUsIHIxMH0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBBTElHTl9EV09SRF9EICAgMiwgICByNiwgIHI3LCAgcjQsICByNSwgIHIxMAorICAgICAgICBBTElHTl9EV09SRF9EICAgMywgICByOCwgIHI5LCAgcjQsICByNSwgIHIxMAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBSTkRfQVZHMzIgICAgICAgcjQsICByNSwgIHI2LCAgcjcsICByOCwgIHI5LCAgcjEyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3I0LXI1fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAzYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXIxMCxwY30KKyAgICAgICAgLmFsaWduIDUKKzQ6CisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yNSwgcjEwfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIEFMSUdOX0RXT1JEX0QgICAzLCAgIHI2LCAgcjcsICByNCwgIHI1LCAgcjEwCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIFJORF9BVkczMiAgICAgICByOCwgIHI5LCAgcjYsICByNywgIHI1LCAgcjEwLCByMTIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBzdG0gICAgICAgICAgICAgcjAsICB7cjgtcjl9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDRiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjEwLHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeDJfYXJtLCBleHBvcnQ9MSwgYWxpZ249NQorICAgICAgICBAIHZvaWQgZnVuYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBpbnQgbGluZV9zaXplLCBpbnQgaCkKKyAgICAgICAgQCBibG9jayA9IHdvcmQgYWxpZ25lZCwgcGl4bGVzID0gdW5hbGlnbmVkCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjEwLGxyfQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCA9MHhmZWZlZmVmZQorICAgICAgICBKTVBfQUxJR04gICAgICAgcjUsICByMQorMToKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI1LCByMTB9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgQUxJR05fRFdPUkRfRCAgIDEsICAgcjYsICByNywgIHI0LCAgcjUsICByMTAKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgTk9fUk5EX0FWRzMyICAgIHI4LCAgcjksICByNCwgIHI1LCAgcjYsICByNywgIHIxMgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyOC1yOX0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMgorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTAscGN9CisgICAgICAgIC5hbGlnbiA1CisyOgorICAgICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjQtcjUsIHIxMH0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBBTElHTl9EV09SRF9EICAgMSwgICByNiwgIHI3LCAgcjQsICByNSwgIHIxMAorICAgICAgICBBTElHTl9EV09SRF9EICAgMiwgICByOCwgIHI5LCAgcjQsICByNSwgIHIxMAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBOT19STkRfQVZHMzIgICAgcjQsICByNSwgIHI2LCAgcjcsICByOCwgIHI5LCAgcjEyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3I0LXI1fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAyYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXIxMCxwY30KKyAgICAgICAgLmFsaWduIDUKKzM6CisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yNSwgcjEwfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIEFMSUdOX0RXT1JEX0QgICAyLCAgIHI2LCAgcjcsICByNCwgIHI1LCAgcjEwCisgICAgICAgIEFMSUdOX0RXT1JEX0QgICAzLCAgIHI4LCAgcjksICByNCwgIHI1LCAgcjEwCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIE5PX1JORF9BVkczMiAgICByNCwgIHI1LCAgcjYsICByNywgIHI4LCAgcjksICByMTIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBzdG0gICAgICAgICAgICAgcjAsICB7cjQtcjV9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDNiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjEwLHBjfQorICAgICAgICAuYWxpZ24gNQorNDoKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI1LCByMTB9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgQUxJR05fRFdPUkRfRCAgIDMsICAgcjYsICByNywgIHI0LCAgcjUsICByMTAKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgTk9fUk5EX0FWRzMyICAgIHI4LCAgcjksICByNiwgIHI3LCAgcjUsICByMTAsIHIxMgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyOC1yOX0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMgorICAgICAgICBibmUgICAgICAgICAgICAgNGIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTAscGN9CitlbmRmdW5jCisKKworQCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiBmZl9wdXRfcGl4ZWxzOF95Ml9hcm0sIGV4cG9ydD0xLCBhbGlnbj01CisgICAgICAgIEAgdm9pZCBmdW5jKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIGludCBsaW5lX3NpemUsIGludCBoKQorICAgICAgICBAIGJsb2NrID0gd29yZCBhbGlnbmVkLCBwaXhsZXMgPSB1bmFsaWduZWQKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTEsbHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgIHIzLCAgbHNyICMxCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsID0weGZlZmVmZWZlCisgICAgICAgIEpNUF9BTElHTiAgICAgICByNSwgIHIxCisxOgorICAgICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjQtcjV9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKzY6ICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I2LXI3fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIFJORF9BVkczMiAgICAgICByOCwgIHI5LCAgcjQsICByNSwgIHI2LCAgcjcsICByMTIKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI1fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyOC1yOX0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBSTkRfQVZHMzIgICAgICAgcjgsICByOSwgIHI2LCAgcjcsICByNCwgIHI1LCAgcjEyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3I4LXI5fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICA2YgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXIxMSxwY30KKyAgICAgICAgLmFsaWduIDUKKzI6CisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yNn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBBTElHTl9EV09SRCAgICAgMSwgICByNCwgIHI1LCAgcjYKKzY6ICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I3LXI5fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIEFMSUdOX0RXT1JEICAgICAxLCAgIHI3LCAgcjgsICByOQorICAgICAgICBSTkRfQVZHMzIgICAgICAgcjEwLCByMTEsIHI0LCAgcjUsICByNywgIHI4LCAgcjEyCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyMTAtcjExfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yNn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBBTElHTl9EV09SRCAgICAgMSwgICByNCwgIHI1LCAgcjYKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBSTkRfQVZHMzIgICAgICAgcjEwLCByMTEsIHI3LCAgcjgsICByNCwgIHI1LCAgcjEyCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyMTAtcjExfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICA2YgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXIxMSxwY30KKyAgICAgICAgLmFsaWduIDUKKzM6CisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yNn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBBTElHTl9EV09SRCAgICAgMiwgICByNCwgIHI1LCAgcjYKKzY6ICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I3LXI5fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIEFMSUdOX0RXT1JEICAgICAyLCAgIHI3LCAgcjgsICByOQorICAgICAgICBSTkRfQVZHMzIgICAgICAgcjEwLCByMTEsIHI0LCAgcjUsICByNywgIHI4LCAgcjEyCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyMTAtcjExfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yNn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBBTElHTl9EV09SRCAgICAgMiwgICByNCwgIHI1LCAgcjYKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBSTkRfQVZHMzIgICAgICAgcjEwLCByMTEsIHI3LCAgcjgsICByNCwgIHI1LCAgcjEyCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyMTAtcjExfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICA2YgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXIxMSxwY30KKyAgICAgICAgLmFsaWduIDUKKzQ6CisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yNn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBBTElHTl9EV09SRCAgICAgMywgICByNCwgIHI1LCAgcjYKKzY6ICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I3LXI5fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIEFMSUdOX0RXT1JEICAgICAzLCAgIHI3LCAgcjgsICByOQorICAgICAgICBSTkRfQVZHMzIgICAgICAgcjEwLCByMTEsIHI0LCAgcjUsICByNywgIHI4LCAgcjEyCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyMTAtcjExfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yNn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBBTElHTl9EV09SRCAgICAgMywgICByNCwgIHI1LCAgcjYKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBSTkRfQVZHMzIgICAgICAgcjEwLCByMTEsIHI3LCAgcjgsICByNCwgIHI1LCAgcjEyCisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyMTAtcjExfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICA2YgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXIxMSxwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyX2FybSwgZXhwb3J0PTEsIGFsaWduPTUKKyAgICAgICAgQCB2b2lkIGZ1bmModWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgaW50IGxpbmVfc2l6ZSwgaW50IGgpCisgICAgICAgIEAgYmxvY2sgPSB3b3JkIGFsaWduZWQsIHBpeGxlcyA9IHVuYWxpZ25lZAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMSxscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgcjMsICBsc3IgIzEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgPTB4ZmVmZWZlZmUKKyAgICAgICAgSk1QX0FMSUdOICAgICAgIHI1LCAgcjEKKzE6CisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNC1yNX0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorNjogICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjYtcjd9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgTk9fUk5EX0FWRzMyICAgIHI4LCAgcjksICByNCwgIHI1LCAgcjYsICByNywgIHIxMgorICAgICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjQtcjV9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3I4LXI5fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIE5PX1JORF9BVkczMiAgICByOCwgIHI5LCAgcjYsICByNywgIHI0LCAgcjUsICByMTIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMQorICAgICAgICBzdG0gICAgICAgICAgICAgcjAsICB7cjgtcjl9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDZiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjExLHBjfQorICAgICAgICAuYWxpZ24gNQorMjoKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI2fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIEFMSUdOX0RXT1JEICAgICAxLCAgIHI0LCAgcjUsICByNgorNjogICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjctcjl9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgQUxJR05fRFdPUkQgICAgIDEsICAgcjcsICByOCwgIHI5CisgICAgICAgIE5PX1JORF9BVkczMiAgICByMTAsIHIxMSwgcjQsICByNSwgIHI3LCAgcjgsICByMTIKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3IxMC1yMTF9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI2fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIEFMSUdOX0RXT1JEICAgICAxLCAgIHI0LCAgcjUsICByNgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIE5PX1JORF9BVkczMiAgICByMTAsIHIxMSwgcjcsICByOCwgIHI0LCAgcjUsICByMTIKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3IxMC1yMTF9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDZiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjExLHBjfQorICAgICAgICAuYWxpZ24gNQorMzoKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI2fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIEFMSUdOX0RXT1JEICAgICAyLCAgIHI0LCAgcjUsICByNgorNjogICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjctcjl9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgQUxJR05fRFdPUkQgICAgIDIsICAgcjcsICByOCwgIHI5CisgICAgICAgIE5PX1JORF9BVkczMiAgICByMTAsIHIxMSwgcjQsICByNSwgIHI3LCAgcjgsICByMTIKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3IxMC1yMTF9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI2fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIEFMSUdOX0RXT1JEICAgICAyLCAgIHI0LCAgcjUsICByNgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIE5PX1JORF9BVkczMiAgICByMTAsIHIxMSwgcjcsICByOCwgIHI0LCAgcjUsICByMTIKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3IxMC1yMTF9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDZiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjExLHBjfQorICAgICAgICAuYWxpZ24gNQorNDoKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI2fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIEFMSUdOX0RXT1JEICAgICAzLCAgIHI0LCAgcjUsICByNgorNjogICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjctcjl9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgQUxJR05fRFdPUkQgICAgIDMsICAgcjcsICByOCwgIHI5CisgICAgICAgIE5PX1JORF9BVkczMiAgICByMTAsIHIxMSwgcjQsICByNSwgIHI3LCAgcjgsICByMTIKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3IxMC1yMTF9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI2fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIEFMSUdOX0RXT1JEICAgICAzLCAgIHI0LCAgcjUsICByNgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIE5PX1JORF9BVkczMiAgICByMTAsIHIxMSwgcjcsICByOCwgIHI0LCAgcjUsICByMTIKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3IxMC1yMTF9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDZiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjExLHBjfQorZW5kZnVuYworCisgICAgICAgIC5sdG9yZworCitAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5tYWNybyAgUk5EX1hZMl9JVCBhbGlnbiwgcm5kCisgICAgICAgIEAgbDE9ICAoYSAmIDB4MDMwMzAzMDMpICsgKGIgJiAweDAzMDMwMzAzKSA/KCsgMHgwMjAyMDIwMikKKyAgICAgICAgQCBoMT0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikKKy5pZiBcYWxpZ24gPT0gMAorICAgICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjYtcjh9CisuZWxzZWlmIFxhbGlnbiA9PSAzCisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyNS1yN30KKy5lbHNlCisgICAgICAgIGxkbSAgICAgICAgICAgICByMSwgIHtyOC1yMTB9CisuZW5kaWYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorLmlmIFxhbGlnbiA9PSAwCisgICAgICAgIEFMSUdOX0RXT1JEX0QgICAxLCAgIHI0LCAgcjUsICByNiwgIHI3LCAgcjgKKy5lbHNlaWYgXGFsaWduID09IDEKKyAgICAgICAgQUxJR05fRFdPUkRfRCAgIDEsICAgcjQsICByNSwgIHI4LCAgcjksICByMTAKKyAgICAgICAgQUxJR05fRFdPUkRfRCAgIDIsICAgcjYsICByNywgIHI4LCAgcjksICByMTAKKy5lbHNlaWYgXGFsaWduID09IDIKKyAgICAgICAgQUxJR05fRFdPUkRfRCAgIDIsICAgcjQsICByNSwgIHI4LCAgcjksICByMTAKKyAgICAgICAgQUxJR05fRFdPUkRfRCAgIDMsICAgcjYsICByNywgIHI4LCAgcjksICByMTAKKy5lbHNlaWYgXGFsaWduID09IDMKKyAgICAgICAgQUxJR05fRFdPUkRfRCAgIDMsICAgcjQsICByNSwgIHI1LCAgcjYsICByNworLmVuZGlmCisgICAgICAgIGxkciAgICAgICAgICAgICByMTQsID0weDAzMDMwMzAzCisgICAgICAgIHRzdCAgICAgICAgICAgICByMywgICMxCisgICAgICAgIGFuZCAgICAgICAgICAgICByOCwgIHI0LCAgcjE0CisgICAgICAgIGFuZCAgICAgICAgICAgICByOSwgIHI1LCAgcjE0CisgICAgICAgIGFuZCAgICAgICAgICAgICByMTAsIHI2LCAgcjE0CisgICAgICAgIGFuZCAgICAgICAgICAgICByMTEsIHI3LCAgcjE0CisgICAgICAgIGl0ICAgICAgICAgICAgICBlcQorICAgICAgICBhbmRlcSAgICAgICAgICAgcjE0LCByMTQsIHIxNCwgXHJuZCAjMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjgsICByOCwgIHIxMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjksICByOSwgIHIxMQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCA9MHhmY2ZjZmNmYyA+PiAyCisgICAgICAgIGl0dCAgICAgICAgICAgICBlcQorICAgICAgICBhZGRlcSAgICAgICAgICAgcjgsICByOCwgIHIxNAorICAgICAgICBhZGRlcSAgICAgICAgICAgcjksICByOSwgIHIxNAorICAgICAgICBhbmQgICAgICAgICAgICAgcjQsICByMTIsIHI0LCAgbHNyICMyCisgICAgICAgIGFuZCAgICAgICAgICAgICByNSwgIHIxMiwgcjUsICBsc3IgIzIKKyAgICAgICAgYW5kICAgICAgICAgICAgIHI2LCAgcjEyLCByNiwgIGxzciAjMgorICAgICAgICBhbmQgICAgICAgICAgICAgcjcsICByMTIsIHI3LCAgbHNyICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMTAsIHI0LCAgcjYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMSwgcjUsICByNworICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxCisuZW5kbQorCisubWFjcm8gUk5EX1hZMl9FWFBBTkQgYWxpZ24sIHJuZAorICAgICAgICBSTkRfWFkyX0lUICAgICAgXGFsaWduLCBccm5kCis2OiAgICAgIHB1c2ggICAgICAgICAgICB7cjgtcjExfQorICAgICAgICBSTkRfWFkyX0lUICAgICAgXGFsaWduLCBccm5kCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjd9CisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIHI0LCAgcjgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCAgcjUsICByOQorICAgICAgICBsZHIgICAgICAgICAgICAgcjE0LCA9MHgwZjBmMGYwZgorICAgICAgICBhZGQgICAgICAgICAgICAgcjYsICByNiwgIHIxMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjcsICByNywgIHIxMQorICAgICAgICBhbmQgICAgICAgICAgICAgcjQsICByMTQsIHI0LCAgbHNyICMyCisgICAgICAgIGFuZCAgICAgICAgICAgICByNSwgIHIxNCwgcjUsICBsc3IgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgcjQsICByNgorICAgICAgICBhZGQgICAgICAgICAgICAgcjUsICByNSwgIHI3CisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyNC1yNX0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMgorICAgICAgICBiZ2UgICAgICAgICAgICAgNmIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTEscGN9CisuZW5kbQorCitmdW5jdGlvbiBmZl9wdXRfcGl4ZWxzOF94eTJfYXJtLCBleHBvcnQ9MSwgYWxpZ249NQorICAgICAgICBAIHZvaWQgZnVuYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBpbnQgbGluZV9zaXplLCBpbnQgaCkKKyAgICAgICAgQCBibG9jayA9IHdvcmQgYWxpZ25lZCwgcGl4bGVzID0gdW5hbGlnbmVkCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjExLGxyfSBAIFIxNCBpcyBhbHNvIGNhbGxlZCBMUgorICAgICAgICBKTVBfQUxJR04gICAgICAgcjUsICByMQorMTogICAgICBSTkRfWFkyX0VYUEFORCAgMCwgbHNsCisgICAgICAgIC5hbGlnbiA1CisyOiAgICAgIFJORF9YWTJfRVhQQU5EICAxLCBsc2wKKyAgICAgICAgLmFsaWduIDUKKzM6ICAgICAgUk5EX1hZMl9FWFBBTkQgIDIsIGxzbAorICAgICAgICAuYWxpZ24gNQorNDogICAgICBSTkRfWFkyX0VYUEFORCAgMywgbHNsCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94eTJfYXJtLCBleHBvcnQ9MSwgYWxpZ249NQorICAgICAgICBAIHZvaWQgZnVuYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBpbnQgbGluZV9zaXplLCBpbnQgaCkKKyAgICAgICAgQCBibG9jayA9IHdvcmQgYWxpZ25lZCwgcGl4bGVzID0gdW5hbGlnbmVkCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjExLGxyfQorICAgICAgICBKTVBfQUxJR04gICAgICAgcjUsICByMQorMTogICAgICBSTkRfWFkyX0VYUEFORCAgMCwgbHNyCisgICAgICAgIC5hbGlnbiA1CisyOiAgICAgIFJORF9YWTJfRVhQQU5EICAxLCBsc3IKKyAgICAgICAgLmFsaWduIDUKKzM6ICAgICAgUk5EX1hZMl9FWFBBTkQgIDIsIGxzcgorICAgICAgICAuYWxpZ24gNQorNDogICAgICBSTkRfWFkyX0VYUEFORCAgMywgbHNyCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaHBlbGRzcF9hcm0uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ocGVsZHNwX2FybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmM2M3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaHBlbGRzcF9hcm0uaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVJNX0hQRUxEU1BfQVJNX0gKKyNkZWZpbmUgQVZDT0RFQ19BUk1fSFBFTERTUF9BUk1fSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy9ocGVsZHNwLmgiCisKK3ZvaWQgZmZfaHBlbGRzcF9pbml0X2FybXY2KEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MpOwordm9pZCBmZl9ocGVsZHNwX2luaXRfbmVvbihIcGVsRFNQQ29udGV4dCAqYywgaW50IGZsYWdzKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQVJNX0hQRUxEU1BfQVJNX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ocGVsZHNwX2FybXY2LlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaHBlbGRzcF9hcm12Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YmQ0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaHBlbGRzcF9hcm12Ni5TCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworLm1hY3JvICBjYWxsXzJ4X3BpeGVscyAgdHlwZSwgc3VicAorZnVuY3Rpb24gZmZfXHR5cGVcKClfcGl4ZWxzMTZcc3VicFwoKV9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMC1yMywgbHJ9CisgICAgICAgIGJsICAgICAgICAgICAgICBYKGZmX1x0eXBlXCgpX3BpeGVsczhcc3VicFwoKV9hcm12NikKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyMC1yMywgbHJ9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICAjOAorICAgICAgICBiICAgICAgICAgICAgICAgWChmZl9cdHlwZVwoKV9waXhlbHM4XHN1YnBcKClfYXJtdjYpCitlbmRmdW5jCisuZW5kbQorCitjYWxsXzJ4X3BpeGVscyAgICAgICAgICBhdmcKK2NhbGxfMnhfcGl4ZWxzICAgICAgICAgIHB1dCwgX3gyCitjYWxsXzJ4X3BpeGVscyAgICAgICAgICBwdXQsIF95MgorY2FsbF8yeF9waXhlbHMgICAgICAgICAgcHV0LCBfeDJfbm9fcm5kCitjYWxsXzJ4X3BpeGVscyAgICAgICAgICBwdXQsIF95Ml9ub19ybmQKKworZnVuY3Rpb24gZmZfcHV0X3BpeGVsczE2X2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMX0KKzE6CisgICAgICAgIGxkciAgICAgICAgICAgICByNSwgIFtyMSwgIzRdCisgICAgICAgIGxkciAgICAgICAgICAgICByNiwgIFtyMSwgIzhdCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMSwgIzEyXQorICAgICAgICBsZHJfcG9zdCAgICAgICAgcjQsICByMSwgIHIyCisgICAgICAgIHN0cmQgICAgICAgICAgICByNiwgIHI3LCAgW3IwLCAjOF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3IxLCAjNF0KKyAgICAgICAgc3RyZF9wb3N0ICAgICAgIHI0LCAgcjUsICByMCwgIHIyCisgICAgICAgIGxkciAgICAgICAgICAgICByMTAsIFtyMSwgIzhdCisgICAgICAgIGxkciAgICAgICAgICAgICByMTEsIFtyMSwgIzEyXQorICAgICAgICBsZHJfcG9zdCAgICAgICAgcjgsICByMSwgIHIyCisgICAgICAgIHN0cmQgICAgICAgICAgICByMTAsIHIxMSwgW3IwLCAjOF0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICBzdHJkX3Bvc3QgICAgICAgcjgsICByOSwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTF9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfcGl4ZWxzOF9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yN30KKzE6CisgICAgICAgIGxkciAgICAgICAgICAgICByNSwgIFtyMSwgIzRdCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByNCwgIHIxLCAgcjIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI3LCAgW3IxLCAjNF0KKyAgICAgICAgc3RyZF9wb3N0ICAgICAgIHI0LCAgcjUsICByMCwgIHIyCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByNiwgIHIxLCAgcjIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICBzdHJkX3Bvc3QgICAgICAgcjYsICByNywgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yN30KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3B1dF9waXhlbHM4X3gyX2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMSwgbHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMxCisgICAgICAgIG9yciAgICAgICAgICAgICByMTIsIHIxMiwgcjEyLCBsc2wgIzgKKyAgICAgICAgb3JyICAgICAgICAgICAgIHIxMiwgcjEyLCByMTIsIGxzbCAjMTYKKzE6CisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtyMV0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjUsICBbcjEsICM0XQorICAgICAgICBsZHIgICAgICAgICAgICAgcjcsICBbcjEsICM1XQorICAgICAgICBsc3IgICAgICAgICAgICAgcjYsICByNCwgICM4CisgICAgICAgIGxkcl9wcmUgICAgICAgICByOCwgIHIxLCAgcjIKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI2LCAgcjYsICByNSwgIGxzbCAjMjQKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3IxLCAjNF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMSwgW3IxLCAjNV0KKyAgICAgICAgbHNyICAgICAgICAgICAgIHIxMCwgcjgsICAjOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIG9yciAgICAgICAgICAgICByMTAsIHIxMCwgcjksICBsc2wgIzI0CisgICAgICAgIGVvciAgICAgICAgICAgICByMTQsIHI0LCAgcjYKKyAgICAgICAgdWhhZGQ4ICAgICAgICAgIHI0LCAgcjQsICByNgorICAgICAgICBlb3IgICAgICAgICAgICAgcjYsICByNSwgIHI3CisgICAgICAgIHVoYWRkOCAgICAgICAgICByNSwgIHI1LCAgcjcKKyAgICAgICAgYW5kICAgICAgICAgICAgIHIxNCwgcjE0LCByMTIKKyAgICAgICAgYW5kICAgICAgICAgICAgIHI2LCAgcjYsICByMTIKKyAgICAgICAgdWFkZDggICAgICAgICAgIHI0LCAgcjQsICByMTQKKyAgICAgICAgZW9yICAgICAgICAgICAgIHIxNCwgcjgsICByMTAKKyAgICAgICAgdWFkZDggICAgICAgICAgIHI1LCAgcjUsICByNgorICAgICAgICBlb3IgICAgICAgICAgICAgcjYsICByOSwgIHIxMQorICAgICAgICB1aGFkZDggICAgICAgICAgcjgsICByOCwgIHIxMAorICAgICAgICBhbmQgICAgICAgICAgICAgcjE0LCByMTQsIHIxMgorICAgICAgICB1aGFkZDggICAgICAgICAgcjksICByOSwgIHIxMQorICAgICAgICBhbmQgICAgICAgICAgICAgcjYsICByNiwgIHIxMgorICAgICAgICB1YWRkOCAgICAgICAgICAgcjgsICByOCwgIHIxNAorICAgICAgICBzdHJkX3Bvc3QgICAgICAgcjQsICByNSwgIHIwLCAgcjIKKyAgICAgICAgdWFkZDggICAgICAgICAgIHI5LCAgcjksICByNgorICAgICAgICBzdHJkX3Bvc3QgICAgICAgcjgsICByOSwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTEsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfcGl4ZWxzOF95Ml9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTF9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMxCisgICAgICAgIG9yciAgICAgICAgICAgICByMTIsIHIxMiwgcjEyLCBsc2wgIzgKKyAgICAgICAgb3JyICAgICAgICAgICAgIHIxMiwgcjEyLCByMTIsIGxzbCAjMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3IxXQorICAgICAgICBsZHIgICAgICAgICAgICAgcjUsICBbcjEsICM0XQorICAgICAgICBsZHJfcHJlICAgICAgICAgcjYsICByMSwgIHIyCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMSwgIzRdCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIHVoYWRkOCAgICAgICAgICByOCwgIHI0LCAgcjYKKyAgICAgICAgZW9yICAgICAgICAgICAgIHIxMCwgcjQsICByNgorICAgICAgICB1aGFkZDggICAgICAgICAgcjksICByNSwgIHI3CisgICAgICAgIGVvciAgICAgICAgICAgICByMTEsIHI1LCAgcjcKKyAgICAgICAgYW5kICAgICAgICAgICAgIHIxMCwgcjEwLCByMTIKKyAgICAgICAgbGRyX3ByZSAgICAgICAgIHI0LCAgcjEsICByMgorICAgICAgICB1YWRkOCAgICAgICAgICAgcjgsICByOCwgIHIxMAorICAgICAgICBhbmQgICAgICAgICAgICAgcjExLCByMTEsIHIxMgorICAgICAgICB1YWRkOCAgICAgICAgICAgcjksICByOSwgIHIxMQorICAgICAgICBsZHIgICAgICAgICAgICAgcjUsICBbcjEsICM0XQorICAgICAgICB1aGFkZDggICAgICAgICAgcjEwLCByNCwgIHI2CisgICAgICAgIGVvciAgICAgICAgICAgICByNiwgIHI0LCAgcjYKKyAgICAgICAgdWhhZGQ4ICAgICAgICAgIHIxMSwgcjUsICByNworICAgICAgICBhbmQgICAgICAgICAgICAgcjYsICByNiwgIHIxMgorICAgICAgICBlb3IgICAgICAgICAgICAgcjcsICByNSwgIHI3CisgICAgICAgIHVhZGQ4ICAgICAgICAgICByMTAsIHIxMCwgcjYKKyAgICAgICAgYW5kICAgICAgICAgICAgIHI3LCAgcjcsICByMTIKKyAgICAgICAgbGRyY19wcmUgICAgICAgIG5lLCAgcjYsICByMSwgIHIyCisgICAgICAgIHVhZGQ4ICAgICAgICAgICByMTEsIHIxMSwgcjcKKyAgICAgICAgc3RyZF9wb3N0ICAgICAgIHI4LCAgcjksICByMCwgIHIyCisgICAgICAgIGl0ICAgICAgICAgICAgICBuZQorICAgICAgICBsZHJuZSAgICAgICAgICAgcjcsICBbcjEsICM0XQorICAgICAgICBzdHJkX3Bvc3QgICAgICAgcjEwLCByMTEsIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTF9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfcGl4ZWxzOF94Ml9ub19ybmRfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjksIGxyfQorMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbcjFdCisgICAgICAgIGxkciAgICAgICAgICAgICByNSwgIFtyMSwgIzRdCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMSwgIzVdCisgICAgICAgIGxkcl9wcmUgICAgICAgICByOCwgIHIxLCAgcjIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3IxLCAjNF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxNCwgW3IxLCAjNV0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMgorICAgICAgICBsc3IgICAgICAgICAgICAgcjYsICByNCwgICM4CisgICAgICAgIG9yciAgICAgICAgICAgICByNiwgIHI2LCAgcjUsICBsc2wgIzI0CisgICAgICAgIGxzciAgICAgICAgICAgICByMTIsIHI4LCAgIzgKKyAgICAgICAgb3JyICAgICAgICAgICAgIHIxMiwgcjEyLCByOSwgIGxzbCAjMjQKKyAgICAgICAgdWhhZGQ4ICAgICAgICAgIHI0LCAgcjQsICByNgorICAgICAgICB1aGFkZDggICAgICAgICAgcjUsICByNSwgIHI3CisgICAgICAgIHVoYWRkOCAgICAgICAgICByOCwgIHI4LCAgcjEyCisgICAgICAgIHVoYWRkOCAgICAgICAgICByOSwgIHI5LCAgcjE0CisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyNCxyNX0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMgorICAgICAgICBzdG0gICAgICAgICAgICAgcjAsICB7cjgscjl9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3B1dF9waXhlbHM4X3kyX25vX3JuZF9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOSwgbHJ9CisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtyMV0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI1LCAgW3IxLCAjNF0KKyAgICAgICAgbGRyX3ByZSAgICAgICAgIHI2LCAgcjEsICByMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjcsICBbcjEsICM0XQorMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICB1aGFkZDggICAgICAgICAgcjgsICByNCwgIHI2CisgICAgICAgIGxkcl9wcmUgICAgICAgICByNCwgIHIxLCAgcjIKKyAgICAgICAgdWhhZGQ4ICAgICAgICAgIHI5LCAgcjUsICByNworICAgICAgICBsZHIgICAgICAgICAgICAgcjUsICBbcjEsICM0XQorICAgICAgICB1aGFkZDggICAgICAgICAgcjEyLCByNCwgIHI2CisgICAgICAgIGxkcmNfcHJlICAgICAgICBuZSwgIHI2LCAgcjEsICByMgorICAgICAgICB1aGFkZDggICAgICAgICAgcjE0LCByNSwgIHI3CisgICAgICAgIGl0ICAgICAgICAgICAgICBuZQorICAgICAgICBsZHJuZSAgICAgICAgICAgcjcsICBbcjEsICM0XQorICAgICAgICBzdG0gICAgICAgICAgICAgcjAsICB7cjgscjl9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwLCAge3IxMixyMTR9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2F2Z19waXhlbHM4X2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTAsIGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICAjMQorICAgICAgICBvcnIgICAgICAgICAgICAgbHIsICBsciwgIGxyLCAgbHNsICM4CisgICAgICAgIG9yciAgICAgICAgICAgICBsciwgIGxyLCAgbHIsICBsc2wgIzE2CisgICAgICAgIGxkcmQgICAgICAgICAgICByNCwgIHI1LCAgW3IwXQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEwLCBbcjEsICM0XQorICAgICAgICBsZHJfcG9zdCAgICAgICAgcjksICByMSwgIHIyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKzE6CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjEsIHIyXQorICAgICAgICBlb3IgICAgICAgICAgICAgcjgsICByNCwgIHI5CisgICAgICAgIHVoYWRkOCAgICAgICAgICByNCwgIHI0LCAgcjkKKyAgICAgICAgZW9yICAgICAgICAgICAgIHIxMiwgcjUsICByMTAKKyAgICAgICAgbGRyZF9yZWcgICAgICAgIHI2LCAgcjcsICByMCwgIHIyCisgICAgICAgIHVoYWRkOCAgICAgICAgICByNSwgIHI1LCAgcjEwCisgICAgICAgIGFuZCAgICAgICAgICAgICByOCwgIHI4LCAgbHIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMCwgW3IxLCAjNF0KKyAgICAgICAgYW5kICAgICAgICAgICAgIHIxMiwgcjEyLCBscgorICAgICAgICB1YWRkOCAgICAgICAgICAgcjQsICByNCwgIHI4CisgICAgICAgIGxkcl9wb3N0ICAgICAgICByOSwgIHIxLCAgcjIKKyAgICAgICAgZW9yICAgICAgICAgICAgIHI4LCAgcjYsICByOQorICAgICAgICB1YWRkOCAgICAgICAgICAgcjUsICByNSwgIHIxMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMiwgIGxzbCAjMV0KKyAgICAgICAgZW9yICAgICAgICAgICAgIHIxMiwgcjcsICByMTAKKyAgICAgICAgdWhhZGQ4ICAgICAgICAgIHI2LCAgcjYsICByOQorICAgICAgICBzdHJkX3Bvc3QgICAgICAgcjQsICByNSwgIHIwLCAgcjIKKyAgICAgICAgdWhhZGQ4ICAgICAgICAgIHI3LCAgcjcsICByMTAKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisgICAgICAgIGFuZCAgICAgICAgICAgICByOCwgIHI4LCAgbHIKKyAgICAgICAgbGRyZF9yZWcgICAgICAgIHI0LCAgcjUsICByMCwgIHIyCisgICAgICAgIHVhZGQ4ICAgICAgICAgICByNiwgIHI2LCAgcjgKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMCwgW3IxLCAjNF0KKyAgICAgICAgYW5kICAgICAgICAgICAgIHIxMiwgcjEyLCBscgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIHVhZGQ4ICAgICAgICAgICByNywgIHI3LCAgcjEyCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByOSwgIHIxLCAgcjIKKyAgICAgICAgc3RyZF9wb3N0ICAgICAgIHI2LCAgcjcsICByMCwgIHIyCisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorMjoKKyAgICAgICAgYW5kICAgICAgICAgICAgIHI4LCAgcjgsICBscgorICAgICAgICBhbmQgICAgICAgICAgICAgcjEyLCByMTIsIGxyCisgICAgICAgIHVhZGQ4ICAgICAgICAgICByNiwgIHI2LCAgcjgKKyAgICAgICAgdWFkZDggICAgICAgICAgIHI3LCAgcjcsICByMTIKKyAgICAgICAgc3RyZF9wb3N0ICAgICAgIHI2LCAgcjcsICByMCwgIHIyCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTAsIHBjfQorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2hwZWxkc3BfaW5pdF9hcm0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ocGVsZHNwX2luaXRfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3N2IxMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ocGVsZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIEFSTS1vcHRpbWl6ZWQgaGFsZnBlbCBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMSBMaW9uZWwgVWxtZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3BpeGVscy5oIgorI2luY2x1ZGUgImhwZWxkc3BfYXJtLmgiCisKK3ZvaWQgZmZfcHV0X3BpeGVsczhfYXJtKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfeDJfYXJtKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfeTJfYXJtKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfeHkyX2FybSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CisKK3ZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX2FybSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF95Ml9hcm0odWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeHkyX2FybSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CisKK3ZvaWQgZmZfcHV0X3BpeGVsczE2X2FybSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CisKK0NBTExfMlhfUElYRUxTKGZmX3B1dF9waXhlbHMxNl94Ml9hcm0sICAgICAgICAgZmZfcHV0X3BpeGVsczhfeDJfYXJtLCAgICAgICAgOCkKK0NBTExfMlhfUElYRUxTKGZmX3B1dF9waXhlbHMxNl95Ml9hcm0sICAgICAgICAgZmZfcHV0X3BpeGVsczhfeTJfYXJtLCAgICAgICAgOCkKK0NBTExfMlhfUElYRUxTKGZmX3B1dF9waXhlbHMxNl94eTJfYXJtLCAgICAgICAgZmZfcHV0X3BpeGVsczhfeHkyX2FybSwgICAgICAgOCkKK0NBTExfMlhfUElYRUxTKGZmX3B1dF9ub19ybmRfcGl4ZWxzMTZfeDJfYXJtLCAgZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX2FybSwgOCkKK0NBTExfMlhfUElYRUxTKGZmX3B1dF9ub19ybmRfcGl4ZWxzMTZfeTJfYXJtLCAgZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyX2FybSwgOCkKK0NBTExfMlhfUElYRUxTKGZmX3B1dF9ub19ybmRfcGl4ZWxzMTZfeHkyX2FybSwgZmZfcHV0X25vX3JuZF9waXhlbHM4X3h5Ml9hcm0sOCkKKworYXZfY29sZCB2b2lkIGZmX2hwZWxkc3BfaW5pdF9hcm0oSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMF0gPSBmZl9wdXRfcGl4ZWxzMTZfYXJtOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzFdID0gZmZfcHV0X3BpeGVsczE2X3gyX2FybTsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsyXSA9IGZmX3B1dF9waXhlbHMxNl95Ml9hcm07CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bM10gPSBmZl9wdXRfcGl4ZWxzMTZfeHkyX2FybTsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVswXSA9IGZmX3B1dF9waXhlbHM4X2FybTsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsxXSA9IGZmX3B1dF9waXhlbHM4X3gyX2FybTsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsyXSA9IGZmX3B1dF9waXhlbHM4X3kyX2FybTsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVszXSA9IGZmX3B1dF9waXhlbHM4X3h5Ml9hcm07CisKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMF1bMF0gPSBmZl9wdXRfcGl4ZWxzMTZfYXJtOworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlswXVsxXSA9IGZmX3B1dF9ub19ybmRfcGl4ZWxzMTZfeDJfYXJtOworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlswXVsyXSA9IGZmX3B1dF9ub19ybmRfcGl4ZWxzMTZfeTJfYXJtOworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlswXVszXSA9IGZmX3B1dF9ub19ybmRfcGl4ZWxzMTZfeHkyX2FybTsKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bMF0gPSBmZl9wdXRfcGl4ZWxzOF9hcm07CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzFdID0gZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX2FybTsKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bMl0gPSBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeTJfYXJtOworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVszXSA9IGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94eTJfYXJtOworCisgICAgaWYgKGhhdmVfYXJtdjYoY3B1X2ZsYWdzKSkKKyAgICAgICAgZmZfaHBlbGRzcF9pbml0X2FybXY2KGMsIGZsYWdzKTsKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpCisgICAgICAgIGZmX2hwZWxkc3BfaW5pdF9uZW9uKGMsIGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ocGVsZHNwX2luaXRfYXJtdjYuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ocGVsZHNwX2luaXRfYXJtdjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjdhOGUwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2hwZWxkc3BfaW5pdF9hcm12Ni5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiaHBlbGRzcF9hcm0uaCIKKwordm9pZCBmZl9wdXRfcGl4ZWxzMTZfYXJtdjYodWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfcHV0X3BpeGVsczE2X3gyX2FybXY2KHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX3B1dF9waXhlbHMxNl95Ml9hcm12Nih1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQpOworCit2b2lkIGZmX3B1dF9waXhlbHMxNl94Ml9ub19ybmRfYXJtdjYodWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfcHV0X3BpeGVsczE2X3kyX25vX3JuZF9hcm12Nih1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQpOworCit2b2lkIGZmX2F2Z19waXhlbHMxNl9hcm12Nih1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQpOworCit2b2lkIGZmX3B1dF9waXhlbHM4X2FybXY2KHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX3B1dF9waXhlbHM4X3gyX2FybXY2KHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX3B1dF9waXhlbHM4X3kyX2FybXY2KHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7CisKK3ZvaWQgZmZfcHV0X3BpeGVsczhfeDJfbm9fcm5kX2FybXY2KHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX3B1dF9waXhlbHM4X3kyX25vX3JuZF9hcm12Nih1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQpOworCit2b2lkIGZmX2F2Z19waXhlbHM4X2FybXY2KHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7CisKK2F2X2NvbGQgdm9pZCBmZl9ocGVsZHNwX2luaXRfYXJtdjYoSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncykKK3sKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVswXSA9IGZmX3B1dF9waXhlbHMxNl9hcm12NjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsxXSA9IGZmX3B1dF9waXhlbHMxNl94Ml9hcm12NjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsyXSA9IGZmX3B1dF9waXhlbHMxNl95Ml9hcm12NjsKKy8qICAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVszXSA9IGZmX3B1dF9waXhlbHMxNl94eTJfYXJtdjY7ICovCisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bMF0gPSBmZl9wdXRfcGl4ZWxzOF9hcm12NjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsxXSA9IGZmX3B1dF9waXhlbHM4X3gyX2FybXY2OworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzJdID0gZmZfcHV0X3BpeGVsczhfeTJfYXJtdjY7CisvKiAgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bM10gPSBmZl9wdXRfcGl4ZWxzOF94eTJfYXJtdjY7ICovCisKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMF1bMF0gPSBmZl9wdXRfcGl4ZWxzMTZfYXJtdjY7CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzFdID0gZmZfcHV0X3BpeGVsczE2X3gyX25vX3JuZF9hcm12NjsKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMF1bMl0gPSBmZl9wdXRfcGl4ZWxzMTZfeTJfbm9fcm5kX2FybXY2OworLyogICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlswXVszXSA9IGZmX3B1dF9waXhlbHMxNl94eTJfbm9fcm5kX2FybXY2OyAqLworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVswXSA9IGZmX3B1dF9waXhlbHM4X2FybXY2OworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVsxXSA9IGZmX3B1dF9waXhlbHM4X3gyX25vX3JuZF9hcm12NjsKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bMl0gPSBmZl9wdXRfcGl4ZWxzOF95Ml9ub19ybmRfYXJtdjY7CisvKiAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzNdID0gZmZfcHV0X3BpeGVsczhfeHkyX25vX3JuZF9hcm12NjsgKi8KKworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzBdID0gZmZfYXZnX3BpeGVsczE2X2FybXY2OworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzBdID0gZmZfYXZnX3BpeGVsczhfYXJtdjY7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaHBlbGRzcF9pbml0X25lb24uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ocGVsZHNwX2luaXRfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZmVhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaHBlbGRzcF9pbml0X25lb24uYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogQVJNIE5FT04gb3B0aW1pc2VkIERTUCBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJocGVsZHNwX2FybS5oIgorCit2b2lkIGZmX3B1dF9waXhlbHMxNl9uZW9uKHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX3B1dF9waXhlbHMxNl94Ml9uZW9uKHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX3B1dF9waXhlbHMxNl95Ml9uZW9uKHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX3B1dF9waXhlbHMxNl94eTJfbmVvbih1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQpOwordm9pZCBmZl9wdXRfcGl4ZWxzOF9uZW9uKHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX3B1dF9waXhlbHM4X3gyX25lb24odWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfeTJfbmVvbih1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQpOwordm9pZCBmZl9wdXRfcGl4ZWxzOF94eTJfbmVvbih1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQpOwordm9pZCBmZl9wdXRfcGl4ZWxzMTZfeDJfbm9fcm5kX25lb24odWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfcHV0X3BpeGVsczE2X3kyX25vX3JuZF9uZW9uKHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX3B1dF9waXhlbHMxNl94eTJfbm9fcm5kX25lb24odWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfeDJfbm9fcm5kX25lb24odWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfeTJfbm9fcm5kX25lb24odWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfeHkyX25vX3JuZF9uZW9uKHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7CisKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X25lb24odWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X3gyX25lb24odWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X3kyX25lb24odWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X3h5Ml9uZW9uKHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX2F2Z19waXhlbHM4X25lb24odWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfYXZnX3BpeGVsczhfeDJfbmVvbih1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQpOwordm9pZCBmZl9hdmdfcGl4ZWxzOF95Ml9uZW9uKHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX2F2Z19waXhlbHM4X3h5Ml9uZW9uKHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7Cit2b2lkIGZmX2F2Z19waXhlbHMxNl94Ml9ub19ybmRfbmVvbih1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQpOwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfeTJfbm9fcm5kX25lb24odWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50KTsKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X3h5Ml9ub19ybmRfbmVvbih1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQpOworCithdl9jb2xkIHZvaWQgZmZfaHBlbGRzcF9pbml0X25lb24oSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncykKK3sKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVswXSA9IGZmX3B1dF9waXhlbHMxNl9uZW9uOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzFdID0gZmZfcHV0X3BpeGVsczE2X3gyX25lb247CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMl0gPSBmZl9wdXRfcGl4ZWxzMTZfeTJfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVszXSA9IGZmX3B1dF9waXhlbHMxNl94eTJfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVswXSA9IGZmX3B1dF9waXhlbHM4X25lb247CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bMV0gPSBmZl9wdXRfcGl4ZWxzOF94Ml9uZW9uOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzJdID0gZmZfcHV0X3BpeGVsczhfeTJfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVszXSA9IGZmX3B1dF9waXhlbHM4X3h5Ml9uZW9uOworCisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzBdID0gZmZfcHV0X3BpeGVsczE2X25lb247CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzFdID0gZmZfcHV0X3BpeGVsczE2X3gyX25vX3JuZF9uZW9uOworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlswXVsyXSA9IGZmX3B1dF9waXhlbHMxNl95Ml9ub19ybmRfbmVvbjsKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMF1bM10gPSBmZl9wdXRfcGl4ZWxzMTZfeHkyX25vX3JuZF9uZW9uOworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVswXSA9IGZmX3B1dF9waXhlbHM4X25lb247CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzFdID0gZmZfcHV0X3BpeGVsczhfeDJfbm9fcm5kX25lb247CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzJdID0gZmZfcHV0X3BpeGVsczhfeTJfbm9fcm5kX25lb247CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzNdID0gZmZfcHV0X3BpeGVsczhfeHkyX25vX3JuZF9uZW9uOworCisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMF0gPSBmZl9hdmdfcGl4ZWxzMTZfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsxXSA9IGZmX2F2Z19waXhlbHMxNl94Ml9uZW9uOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzJdID0gZmZfYXZnX3BpeGVsczE2X3kyX25lb247CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bM10gPSBmZl9hdmdfcGl4ZWxzMTZfeHkyX25lb247CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMF0gPSBmZl9hdmdfcGl4ZWxzOF9uZW9uOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzFdID0gZmZfYXZnX3BpeGVsczhfeDJfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsyXSA9IGZmX2F2Z19waXhlbHM4X3kyX25lb247CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bM10gPSBmZl9hdmdfcGl4ZWxzOF94eTJfbmVvbjsKKworICAgIGMtPmF2Z19ub19ybmRfcGl4ZWxzX3RhYlswXSA9IGZmX2F2Z19waXhlbHMxNl9uZW9uOworICAgIGMtPmF2Z19ub19ybmRfcGl4ZWxzX3RhYlsxXSA9IGZmX2F2Z19waXhlbHMxNl94Ml9ub19ybmRfbmVvbjsKKyAgICBjLT5hdmdfbm9fcm5kX3BpeGVsc190YWJbMl0gPSBmZl9hdmdfcGl4ZWxzMTZfeTJfbm9fcm5kX25lb247CisgICAgYy0+YXZnX25vX3JuZF9waXhlbHNfdGFiWzNdID0gZmZfYXZnX3BpeGVsczE2X3h5Ml9ub19ybmRfbmVvbjsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ocGVsZHNwX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ocGVsZHNwX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjRhNmNmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2hwZWxkc3BfbmVvbi5TCkBAIC0wLDAgKzEsNDEwIEBACisvKgorICogQVJNIE5FT04gb3B0aW1pc2VkIERTUCBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKKy5tYWNybyAgcGl4ZWxzMTYgICAgICAgIHJuZD0xLCBhdmc9MAorICAuaWYgXGF2ZworICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCByMAorICAuZW5kaWYKKzE6ICAgICAgdmxkMS44ICAgICAgICAgIHtxMH0sICAgICBbcjFdLCByMgorICAgICAgICB2bGQxLjggICAgICAgICAge3ExfSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMSwgcjIsIGxzbCAjMl0KKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxM30sICAgICBbcjFdLCByMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMSwgcjIsIGxzbCAjMV0KKyAgLmlmIFxhdmcKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxOH0sICAgICBbcjEyLDoxMjhdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgcTAsICBxMCwgIHE4CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTl9LCAgICAgW3IxMiw6MTI4XSwgcjIKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHExLCAgcTEsICBxOQorICAgICAgICB2bGQxLjggICAgICAgICAge3ExMH0sICAgIFtyMTIsOjEyOF0sIHIyCisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMiwgIHEyLCAgcTEwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTExfSwgICAgW3IxMiw6MTI4XSwgcjIKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHEzLCAgcTMsICBxMTEKKyAgLmVuZGlmCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzQKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtxMH0sICAgICBbcjAsOjEyOF0sIHIyCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7cTF9LCAgICAgW3IwLDoxMjhdLCByMgorICAgICAgICB2c3QxLjY0ICAgICAgICAge3EyfSwgICAgIFtyMCw6MTI4XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtxM30sICAgICBbcjAsOjEyOF0sIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKKy5lbmRtCisKKy5tYWNybyAgcGl4ZWxzMTZfeDIgICAgIHJuZD0xLCBhdmc9MAorMTogICAgICB2bGQxLjggICAgICAgICAge2QwLWQyfSwgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDQtZDZ9LCAgW3IxXSwgcjIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMSwgcjJdCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHExLCAgcTAsICBxMSwgICMxCisgICAgICAgIGF2ZyAgICAgICAgICAgICBxMCwgIHEwLCAgcTEKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHEzLCAgcTIsICBxMywgICMxCisgICAgICAgIGF2ZyAgICAgICAgICAgICBxMiwgIHEyLCAgcTMKKyAgLmlmIFxhdmcKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMX0sICAgICBbcjAsOjEyOF0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCAgICAgW3IwLDoxMjhdCisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMCwgIHEwLCAgcTEKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHEyLCAgcTIsICBxMworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgIC5lbmRpZgorICAgICAgICB2c3QxLjggICAgICAgICAge3EwfSwgICAgIFtyMCw6MTI4XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMn0sICAgICBbcjAsOjEyOF0sIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKKy5lbmRtCisKKy5tYWNybyAgcGl4ZWxzMTZfeTIgICAgIHJuZD0xLCBhdmc9MAorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMX0sICAgICBbcjFdLCByMgorMTogICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIGF2ZyAgICAgICAgICAgICBxMiwgIHEwLCAgcTEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMH0sICAgICBbcjFdLCByMgorICAgICAgICBhdmcgICAgICAgICAgICAgcTMsICBxMCwgIHExCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMSwgcjJdCisgIC5pZiBcYXZnCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTh9LCAgICAgW3IwLDoxMjhdLCByMgorICAgICAgICB2bGQxLjggICAgICAgICAge3E5fSwgICAgIFtyMCw6MTI4XQorICAgICAgICB2cmhhZGQudTggICAgICAgcTIsICBxMiwgIHE4CisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMywgIHEzLCAgcTkKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMgorICAuZW5kaWYKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMn0sICAgICBbcjAsOjEyOF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTN9LCAgICAgW3IwLDoxMjhdLCByMgorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBhdmcgICAgICAgICAgICAgcTIsICBxMCwgIHExCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgYXZnICAgICAgICAgICAgIHEzLCAgcTAsICBxMQorICAuaWYgXGF2ZworICAgICAgICB2bGQxLjggICAgICAgICAge3E4fSwgICAgIFtyMCw6MTI4XSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxOX0sICAgICBbcjAsOjEyOF0KKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHEyLCAgcTIsICBxOAorICAgICAgICB2cmhhZGQudTggICAgICAgcTMsICBxMywgIHE5CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgLmVuZGlmCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCAgICAgW3IwLDoxMjhdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge3EzfSwgICAgIFtyMCw6MTI4XSwgcjIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKKy5lbmRtCisKKy5tYWNybyAgcGl4ZWxzMTZfeHkyICAgIHJuZD0xLCBhdmc9MAorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDAtZDJ9LCAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNC1kNn0sICBbcjFdLCByMgorTlJORCAgICB2bW92LmkxNiAgICAgICAgcTEzLCAjMQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KKyAgICAgICAgdmV4dC44ICAgICAgICAgIHExLCAgcTAsICBxMSwgICMxCisgICAgICAgIHZleHQuOCAgICAgICAgICBxMywgIHEyLCAgcTMsICAjMQorICAgICAgICB2YWRkbC51OCAgICAgICAgcTgsICBkMCwgIGQyCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxMTAsIGQxLCAgZDMKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE5LCAgZDQsICBkNgorICAgICAgICB2YWRkbC51OCAgICAgICAgcTExLCBkNSwgIGQ3CisxOiAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMC1kMn0sICBbcjFdLCByMgorICAgICAgICB2YWRkLnUxNiAgICAgICAgcTEyLCBxOCwgIHE5CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCitOUk5EICAgIHZhZGQudTE2ICAgICAgICBxMTIsIHExMiwgcTEzCisgICAgICAgIHZleHQuOCAgICAgICAgICBxMTUsIHEwLCAgcTEsICAjMQorICAgICAgICB2YWRkLnUxNiAgICAgICAgcTEgLCBxMTAsIHExMQorICAgICAgICBzaHJuICAgICAgICAgICAgZDI4LCBxMTIsICMyCitOUk5EICAgIHZhZGQudTE2ICAgICAgICBxMSwgIHExLCAgcTEzCisgICAgICAgIHNocm4gICAgICAgICAgICBkMjksIHExLCAgIzIKKyAgLmlmIFxhdmcKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxOH0sICAgICBbcjAsOjEyOF0KKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHExNCwgcTE0LCBxOAorICAuZW5kaWYKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE4LCAgZDAsICBkMzAKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMi1kNH0sICBbcjFdLCByMgorICAgICAgICB2YWRkbC51OCAgICAgICAgcTEwLCBkMSwgIGQzMQorICAgICAgICB2c3QxLjggICAgICAgICAge3ExNH0sICAgIFtyMCw6MTI4XSwgcjIKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHExMiwgcTgsICBxOQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KK05STkQgICAgdmFkZC51MTYgICAgICAgIHExMiwgcTEyLCBxMTMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHEyLCAgcTEsICBxMiwgICMxCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIHExMCwgcTExCisgICAgICAgIHNocm4gICAgICAgICAgICBkMzAsIHExMiwgIzIKK05STkQgICAgdmFkZC51MTYgICAgICAgIHEwLCAgcTAsICBxMTMKKyAgICAgICAgc2hybiAgICAgICAgICAgIGQzMSwgcTAsICAjMgorICAuaWYgXGF2ZworICAgICAgICB2bGQxLjggICAgICAgICAge3E5fSwgICAgIFtyMCw6MTI4XQorICAgICAgICB2cmhhZGQudTggICAgICAgcTE1LCBxMTUsIHE5CisgIC5lbmRpZgorICAgICAgICB2YWRkbC51OCAgICAgICAgcTksICBkMiwgIGQ0CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxMTEsIGQzLCAgZDUKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMTV9LCAgICBbcjAsOjEyOF0sIHIyCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDAtZDJ9LCAgW3IxXSwgcjIKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHExMiwgcTgsICBxOQorTlJORCAgICB2YWRkLnUxNiAgICAgICAgcTEyLCBxMTIsIHExMworICAgICAgICB2ZXh0LjggICAgICAgICAgcTE1LCBxMCwgIHExLCAgIzEKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHExICwgcTEwLCBxMTEKKyAgICAgICAgc2hybiAgICAgICAgICAgIGQyOCwgcTEyLCAjMgorTlJORCAgICB2YWRkLnUxNiAgICAgICAgcTEsICBxMSwgIHExMworICAgICAgICBzaHJuICAgICAgICAgICAgZDI5LCBxMSwgICMyCisgIC5pZiBcYXZnCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTh9LCAgICAgW3IwLDoxMjhdCisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMTQsIHExNCwgcTgKKyAgLmVuZGlmCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxOCwgIGQwLCAgZDMwCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxMTAsIGQxLCAgZDMxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTE0fSwgICAgW3IwLDoxMjhdLCByMgorICAgICAgICB2YWRkLnUxNiAgICAgICAgcTEyLCBxOCwgIHE5CitOUk5EICAgIHZhZGQudTE2ICAgICAgICBxMTIsIHExMiwgcTEzCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIHExMCwgcTExCisgICAgICAgIHNocm4gICAgICAgICAgICBkMzAsIHExMiwgIzIKK05STkQgICAgdmFkZC51MTYgICAgICAgIHEwLCAgcTAsICBxMTMKKyAgICAgICAgc2hybiAgICAgICAgICAgIGQzMSwgcTAsICAjMgorICAuaWYgXGF2ZworICAgICAgICB2bGQxLjggICAgICAgICAge3E5fSwgICAgIFtyMCw6MTI4XQorICAgICAgICB2cmhhZGQudTggICAgICAgcTE1LCBxMTUsIHE5CisgIC5lbmRpZgorICAgICAgICB2c3QxLjggICAgICAgICAge3ExNX0sICAgIFtyMCw6MTI4XSwgcjIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKKy5lbmRtCisKKy5tYWNybyAgcGl4ZWxzOCAgICAgICAgIHJuZD0xLCBhdmc9MAorMTogICAgICB2bGQxLjggICAgICAgICAge2QwfSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDF9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMn0sICAgICBbcjFdLCByMgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMiwgbHNsICMyXQorICAgICAgICB2bGQxLjggICAgICAgICAge2QzfSwgICAgIFtyMV0sIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjEsIHIyXQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMiwgbHNsICMxXQorICAuaWYgXGF2ZworICAgICAgICB2bGQxLjggICAgICAgICAge2Q0fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDAsICBkMCwgIGQ0CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMSwgIGQxLCAgZDUKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNn0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQyLCAgZDIsICBkNgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q3fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDMsICBkMywgIGQ3CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIsICBsc2wgIzIKKyAgLmVuZGlmCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzQKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMX0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMn0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkM30sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorLmVuZG0KKworLm1hY3JvICBwaXhlbHM4X3gyICAgICAgcm5kPTEsIGF2Zz0wCisxOiAgICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQxLCAgZDAsICBkMSwgICMxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQzLCAgZDIsICBkMywgICMxCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjEsIHIyXQorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIHZzd3AgICAgICAgICAgICBkMSwgIGQyCisgICAgICAgIGF2ZyAgICAgICAgICAgICBxMCwgIHEwLCAgcTEKKyAgLmlmIFxhdmcKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNH0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNX0sICAgICBbcjAsOjY0XQorICAgICAgICB2cmhhZGQudTggICAgICAgcTAsICBxMCwgIHEyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIKKyAgLmVuZGlmCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDB9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDF9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKKy5lbmRtCisKKy5tYWNybyAgcGl4ZWxzOF95MiAgICAgIHJuZD0xLCBhdmc9MAorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMX0sICAgICBbcjFdLCByMgorMTogICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIGF2ZyAgICAgICAgICAgICBkNCwgIGQwLCAgZDEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICAgICBbcjFdLCByMgorICAgICAgICBhdmcgICAgICAgICAgICAgZDUsICBkMCwgIGQxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDF9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMSwgcjJdCisgIC5pZiBcYXZnCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCAgICAgW3IwLDo2NF0KKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHEyLCAgcTIsICBxMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIyCisgIC5lbmRpZgorICAgICAgICB2c3QxLjggICAgICAgICAge2Q0fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge2Q1fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBhdmcgICAgICAgICAgICAgZDQsICBkMCwgIGQxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDB9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgYXZnICAgICAgICAgICAgIGQ1LCAgZDAsICBkMQorICAuaWYgXGF2ZworICAgICAgICB2bGQxLjggICAgICAgICAge2QyfSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QzfSwgICAgIFtyMCw6NjRdCisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMiwgIHEyLCAgcTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMgorICAuZW5kaWYKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNH0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNX0sICAgICBbcjAsOjY0XSwgcjIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKKy5lbmRtCisKKy5tYWNybyAgcGl4ZWxzOF94eTIgICAgIHJuZD0xLCBhdmc9MAorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMX0sICAgICBbcjFdLCByMgorTlJORCAgICB2bW92LmkxNiAgICAgICAgcTExLCAjMQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ0LCAgZDAsICBkMSwgICMxCisgICAgICAgIHZleHQuOCAgICAgICAgICBkNiwgIGQyLCAgZDMsICAjMQorICAgICAgICB2YWRkbC51OCAgICAgICAgcTgsICBkMCwgIGQ0CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxOSwgIGQyLCAgZDYKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICB2bGQxLjggICAgICAgICAge3EwfSwgICAgIFtyMV0sIHIyCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMTAsIHE4LCAgcTkKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ0LCAgZDAsICBkMSwgICMxCitOUk5EICAgIHZhZGQudTE2ICAgICAgICBxMTAsIHExMCwgcTExCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxOCwgIGQwLCAgZDQKKyAgICAgICAgc2hybiAgICAgICAgICAgIGQ1LCAgcTEwLCAjMgorICAgICAgICB2bGQxLjggICAgICAgICAge3ExfSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMTAsIHE4LCAgcTkKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMSwgcjJdCisgIC5pZiBcYXZnCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDd9LCAgICAgW3IwLDo2NF0KKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQ1LCAgZDUsICBkNworICAuZW5kaWYKK05STkQgICAgdmFkZC51MTYgICAgICAgIHExMCwgcTEwLCBxMTEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNX0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgc2hybiAgICAgICAgICAgIGQ3LCAgcTEwLCAjMgorICAuaWYgXGF2ZworICAgICAgICB2bGQxLjggICAgICAgICAge2Q1fSwgICAgIFtyMCw6NjRdCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkNywgIGQ3LCAgZDUKKyAgLmVuZGlmCisgICAgICAgIHZleHQuOCAgICAgICAgICBkNiwgIGQyLCAgZDMsICAjMQorICAgICAgICB2YWRkbC51OCAgICAgICAgcTksICBkMiwgIGQ2CisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDd9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHExMCwgcTgsICBxOQorICAgICAgICB2ZXh0LjggICAgICAgICAgZDQsICBkMCwgIGQxLCAgIzEKK05STkQgICAgdmFkZC51MTYgICAgICAgIHExMCwgcTEwLCBxMTEKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE4LCAgZDAsICBkNAorICAgICAgICBzaHJuICAgICAgICAgICAgZDUsICBxMTAsICMyCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMTAsIHE4LCAgcTkKKyAgLmlmIFxhdmcKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkN30sICAgICBbcjAsOjY0XQorICAgICAgICB2cmhhZGQudTggICAgICAgZDUsICBkNSwgIGQ3CisgIC5lbmRpZgorTlJORCAgICB2YWRkLnUxNiAgICAgICAgcTEwLCBxMTAsIHExMQorICAgICAgICB2c3QxLjggICAgICAgICAge2Q1fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICBzaHJuICAgICAgICAgICAgZDcsICBxMTAsICMyCisgIC5pZiBcYXZnCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCAgICAgW3IwLDo2NF0KKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQ3LCAgZDcsICBkNQorICAuZW5kaWYKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkN30sICAgICBbcjAsOjY0XSwgcjIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKKy5lbmRtCisKKy5tYWNybyAgcGl4ZnVuYyAgICAgICAgIHBmeCwgbmFtZSwgc3VmLCBybmQ9MSwgYXZnPTAKKyAgLmlmIFxybmQKKyAgICAubWFjcm8gYXZnICByZCwgcm4sIHJtCisgICAgICAgIHZyaGFkZC51OCAgICAgICBccmQsIFxybiwgXHJtCisgICAgLmVuZG0KKyAgICAubWFjcm8gc2hybiByZCwgcm4sIHJtCisgICAgICAgIHZyc2hybi51MTYgICAgICBccmQsIFxybiwgXHJtCisgICAgLmVuZG0KKyAgICAubWFjcm8gTlJORCBpbnNuOnZhcmFyZworICAgIC5lbmRtCisgIC5lbHNlCisgICAgLm1hY3JvIGF2ZyAgcmQsIHJuLCBybQorICAgICAgICB2aGFkZC51OCAgICAgICAgXHJkLCBccm4sIFxybQorICAgIC5lbmRtCisgICAgLm1hY3JvIHNocm4gcmQsIHJuLCBybQorICAgICAgICB2c2hybi51MTYgICAgICAgXHJkLCBccm4sIFxybQorICAgIC5lbmRtCisgICAgLm1hY3JvIE5STkQgaW5zbjp2YXJhcmcKKyAgICAgICAgXGluc24KKyAgICAuZW5kbQorICAuZW5kaWYKK2Z1bmN0aW9uIGZmX1xwZnhcbmFtZVxzdWZcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgXG5hbWUgICAgICAgICAgIFxybmQsIFxhdmcKK2VuZGZ1bmMKKyAgICAgICAgLnB1cmdlbSAgICAgICAgIGF2ZworICAgICAgICAucHVyZ2VtICAgICAgICAgc2hybgorICAgICAgICAucHVyZ2VtICAgICAgICAgTlJORAorLmVuZG0KKworLm1hY3JvICBwaXhmdW5jMiAgICAgICAgcGZ4LCBuYW1lLCBhdmc9MAorICAgICAgICBwaXhmdW5jICAgICAgICAgXHBmeCwgXG5hbWUsICAgICAgICAgIHJuZD0xLCBhdmc9XGF2ZworICAgICAgICBwaXhmdW5jICAgICAgICAgXHBmeCwgXG5hbWUsIF9ub19ybmQsIHJuZD0wLCBhdmc9XGF2ZworLmVuZG0KKworZnVuY3Rpb24gZmZfcHV0X2gyNjRfcXBlbDE2X21jMDBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzE2CitlbmRmdW5jCisKKyAgICAgICAgcGl4ZnVuYyAgICAgICAgIHB1dF8sIHBpeGVsczE2LCAgICAgYXZnPTAKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIHB1dF8sIHBpeGVsczE2X3gyLCAgYXZnPTAKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIHB1dF8sIHBpeGVsczE2X3kyLCAgYXZnPTAKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIHB1dF8sIHBpeGVsczE2X3h5MiwgYXZnPTAKKworZnVuY3Rpb24gZmZfYXZnX2gyNjRfcXBlbDE2X21jMDBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzE2CitlbmRmdW5jCisKKyAgICAgICAgcGl4ZnVuYyAgICAgICAgIGF2Z18sIHBpeGVsczE2LCAgICAgYXZnPTEKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIGF2Z18sIHBpeGVsczE2X3gyLCAgYXZnPTEKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIGF2Z18sIHBpeGVsczE2X3kyLCAgYXZnPTEKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIGF2Z18sIHBpeGVsczE2X3h5MiwgYXZnPTEKKworZnVuY3Rpb24gZmZfcHV0X2gyNjRfcXBlbDhfbWMwMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjOAorZW5kZnVuYworCisgICAgICAgIHBpeGZ1bmMgICAgICAgICBwdXRfLCBwaXhlbHM4LCAgICAgYXZnPTAKKyAgICAgICAgcGl4ZnVuYzIgICAgICAgIHB1dF8sIHBpeGVsczhfeDIsICBhdmc9MAorICAgICAgICBwaXhmdW5jMiAgICAgICAgcHV0XywgcGl4ZWxzOF95MiwgIGF2Zz0wCisgICAgICAgIHBpeGZ1bmMyICAgICAgICBwdXRfLCBwaXhlbHM4X3h5MiwgYXZnPTAKKworZnVuY3Rpb24gZmZfYXZnX2gyNjRfcXBlbDhfbWMwMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjOAorZW5kZnVuYworCisgICAgICAgIHBpeGZ1bmMgICAgICAgICBhdmdfLCBwaXhlbHM4LCAgICAgYXZnPTEKKyAgICAgICAgcGl4ZnVuYyAgICAgICAgIGF2Z18sIHBpeGVsczhfeDIsICBhdmc9MQorICAgICAgICBwaXhmdW5jICAgICAgICAgYXZnXywgcGl4ZWxzOF95MiwgIGF2Zz0xCisgICAgICAgIHBpeGZ1bmMgICAgICAgICBhdmdfLCBwaXhlbHM4X3h5MiwgYXZnPTEKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pZGN0LmggYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaWRjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Y2VmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaWRjdC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FSTV9JRENUX0gKKyNkZWZpbmUgQVZDT0RFQ19BUk1fSURDVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordm9pZCBmZl9qX3Jldl9kY3RfYXJtKGludDE2X3QgKmRhdGEpOworCit2b2lkIGZmX3NpbXBsZV9pZGN0X2FybShpbnQxNl90ICpkYXRhKTsKKwordm9pZCBmZl9zaW1wbGVfaWRjdF9hcm12NXRlKGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfYXJtdjV0ZSh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX2FybXY1dGUodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqZGF0YSk7CisKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfYXJtdjYoaW50MTZfdCAqZGF0YSk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9hcm12Nih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX2FybXY2KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmRhdGEpOworCit2b2lkIGZmX3NpbXBsZV9pZGN0X25lb24oaW50MTZfdCAqZGF0YSk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9uZW9uKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9zaW1wbGVfaWRjdF9hZGRfbmVvbih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQVJNX0lEQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2lkY3Rkc3BfYXJtLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaWRjdGRzcF9hcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTdlZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2lkY3Rkc3BfYXJtLlMKQEAgLTAsMCArMSwxMjAgQEAKK0AKK0AgQVJNdjQtb3B0aW1pemVkIElEQ1QgZnVuY3Rpb25zCitAIENvcHlyaWdodCAoYykgMjAwNCBBR0FXQSBLb2ppIDxpIChBVCkgYXR0eSAoRE9UKSBqcD4KK0AKK0AgVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorQAorQCBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCitAIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0AgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCitAIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorQAorQCBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK0AgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK0AgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0AgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KK0AKK0AgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworQCBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitAIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKK0AKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKK0Agdm9pZCBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfYXJtKGludDE2X3QgKmJsb2NrLCB1aW50OF90ICpkZXN0LCBwdHJkaWZmX3Qgc3RyaWRlKQorZnVuY3Rpb24gZmZfYWRkX3BpeGVsc19jbGFtcGVkX2FybSwgZXhwb3J0PTEsIGFsaWduPTUKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTB9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTAsICM4CisxOgorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbcjFdICAgICAgICAgICAgICAgLyogbG9hZCBkZXN0ICovCisgICAgICAgIC8qIGJsb2NrWzBdIGFuZCBibG9ja1sxXSovCisgICAgICAgIGxkcnNoICAgICAgICAgICByNSwgIFtyMF0KKyAgICAgICAgbGRyc2ggICAgICAgICAgIHI3LCAgW3IwLCAjMl0KKyAgICAgICAgYW5kICAgICAgICAgICAgIHI2LCAgcjQsICAjMHhGRgorICAgICAgICBhbmQgICAgICAgICAgICAgcjgsICByNCwgICMweEZGMDAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjYsICByNQorICAgICAgICBhZGQgICAgICAgICAgICAgcjgsICByNywgIHI4LCAgbHNyICM4CisgICAgICAgIG12biAgICAgICAgICAgICByNSwgIHI1CisgICAgICAgIG12biAgICAgICAgICAgICByNywgIHI3CisgICAgICAgIHRzdCAgICAgICAgICAgICByNiwgICMweDEwMAorICAgICAgICBpdCAgICAgICAgICAgICAgbmUKKyAgICAgICAgbW92bmUgICAgICAgICAgIHI2LCAgcjUsICBsc3IgIzI0CisgICAgICAgIHRzdCAgICAgICAgICAgICByOCwgICMweDEwMAorICAgICAgICBpdCAgICAgICAgICAgICAgbmUKKyAgICAgICAgbW92bmUgICAgICAgICAgIHI4LCAgcjcsICBsc3IgIzI0CisgICAgICAgIG1vdiAgICAgICAgICAgICByOSwgIHI2CisgICAgICAgIGxkcnNoICAgICAgICAgICByNSwgIFtyMCwgIzRdICAgICAgICAgICAvKiBtb3ZlZCBmb3JtIFtBXSAqLworICAgICAgICBvcnIgICAgICAgICAgICAgcjksICByOSwgIHI4LCAgbHNsICM4CisgICAgICAgIC8qIGJsb2NrWzJdIGFuZCBibG9ja1szXSAqLworICAgICAgICAvKiBbQV0gKi8KKyAgICAgICAgbGRyc2ggICAgICAgICAgIHI3LCAgW3IwLCAjNl0KKyAgICAgICAgYW5kICAgICAgICAgICAgIHI2LCAgcjQsICAjMHhGRjAwMDAKKyAgICAgICAgYW5kICAgICAgICAgICAgIHI4LCAgcjQsICAjMHhGRjAwMDAwMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjYsICByNSwgIHI2LCAgbHNyICMxNgorICAgICAgICBhZGQgICAgICAgICAgICAgcjgsICByNywgIHI4LCAgbHNyICMyNAorICAgICAgICBtdm4gICAgICAgICAgICAgcjUsICByNQorICAgICAgICBtdm4gICAgICAgICAgICAgcjcsICByNworICAgICAgICB0c3QgICAgICAgICAgICAgcjYsICAjMHgxMDAKKyAgICAgICAgaXQgICAgICAgICAgICAgIG5lCisgICAgICAgIG1vdm5lICAgICAgICAgICByNiwgIHI1LCAgbHNyICMyNAorICAgICAgICB0c3QgICAgICAgICAgICAgcjgsICAjMHgxMDAKKyAgICAgICAgaXQgICAgICAgICAgICAgIG5lCisgICAgICAgIG1vdm5lICAgICAgICAgICByOCwgIHI3LCAgbHNyICMyNAorICAgICAgICBvcnIgICAgICAgICAgICAgcjksICByOSwgIHI2LCAgbHNsICMxNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbcjEsICM0XSAgICAgICAgICAgLyogbW92ZWQgZm9ybSBbQl0gKi8KKyAgICAgICAgb3JyICAgICAgICAgICAgIHI5LCAgcjksICByOCwgIGxzbCAjMjQKKyAgICAgICAgLyogc3RvcmUgZGVzdCAqLworICAgICAgICBsZHJzaCAgICAgICAgICAgcjUsICBbcjAsICM4XSAgICAgICAgICAgLyogbW92ZWQgZm9ybSBbQ10gKi8KKyAgICAgICAgc3RyICAgICAgICAgICAgIHI5LCAgW3IxXQorCisgICAgICAgIC8qIGxvYWQgZGVzdCAqLworICAgICAgICAvKiBbQl0gKi8KKyAgICAgICAgLyogYmxvY2tbNF0gYW5kIGJsb2NrWzVdICovCisgICAgICAgIC8qIFtDXSAqLworICAgICAgICBsZHJzaCAgICAgICAgICAgcjcsICBbcjAsICMxMF0KKyAgICAgICAgYW5kICAgICAgICAgICAgIHI2LCAgcjQsICAjMHhGRgorICAgICAgICBhbmQgICAgICAgICAgICAgcjgsICByNCwgICMweEZGMDAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjYsICByNQorICAgICAgICBhZGQgICAgICAgICAgICAgcjgsICByNywgIHI4LCAgbHNyICM4CisgICAgICAgIG12biAgICAgICAgICAgICByNSwgIHI1CisgICAgICAgIG12biAgICAgICAgICAgICByNywgIHI3CisgICAgICAgIHRzdCAgICAgICAgICAgICByNiwgICMweDEwMAorICAgICAgICBpdCAgICAgICAgICAgICAgbmUKKyAgICAgICAgbW92bmUgICAgICAgICAgIHI2LCAgcjUsICBsc3IgIzI0CisgICAgICAgIHRzdCAgICAgICAgICAgICByOCwgICMweDEwMAorICAgICAgICBpdCAgICAgICAgICAgICAgbmUKKyAgICAgICAgbW92bmUgICAgICAgICAgIHI4LCAgcjcsICBsc3IgIzI0CisgICAgICAgIG1vdiAgICAgICAgICAgICByOSwgIHI2CisgICAgICAgIGxkcnNoICAgICAgICAgICByNSwgIFtyMCwgIzEyXSAgICAgICAgICAvKiBtb3ZlZCBmcm9tIFtEXSAqLworICAgICAgICBvcnIgICAgICAgICAgICAgcjksICByOSwgIHI4LCAgbHNsICM4CisgICAgICAgIC8qIGJsb2NrWzZdIGFuZCBibG9ja1s3XSAqLworICAgICAgICAvKiBbRF0gKi8KKyAgICAgICAgbGRyc2ggICAgICAgICAgIHI3LCAgW3IwLCAjMTRdCisgICAgICAgIGFuZCAgICAgICAgICAgICByNiwgIHI0LCAgIzB4RkYwMDAwCisgICAgICAgIGFuZCAgICAgICAgICAgICByOCwgIHI0LCAgIzB4RkYwMDAwMDAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjUsICByNiwgIGxzciAjMTYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI4LCAgcjcsICByOCwgIGxzciAjMjQKKyAgICAgICAgbXZuICAgICAgICAgICAgIHI1LCAgcjUKKyAgICAgICAgbXZuICAgICAgICAgICAgIHI3LCAgcjcKKyAgICAgICAgdHN0ICAgICAgICAgICAgIHI2LCAgIzB4MTAwCisgICAgICAgIGl0ICAgICAgICAgICAgICBuZQorICAgICAgICBtb3ZuZSAgICAgICAgICAgcjYsICByNSwgIGxzciAjMjQKKyAgICAgICAgdHN0ICAgICAgICAgICAgIHI4LCAgIzB4MTAwCisgICAgICAgIGl0ICAgICAgICAgICAgICBuZQorICAgICAgICBtb3ZuZSAgICAgICAgICAgcjgsICByNywgIGxzciAjMjQKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI5LCAgcjksICByNiwgIGxzbCAjMTYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjMTYgICAgICAgICAgIC8qIG1vdmVkIGZyb20gW0VdICovCisgICAgICAgIG9yciAgICAgICAgICAgICByOSwgIHI5LCAgcjgsICBsc2wgIzI0CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTAsIHIxMCwgIzEgICAgICAgICAgICAvKiBtb3ZlZCBmcm9tIFtGXSAqLworICAgICAgICAvKiBzdG9yZSBkZXN0ICovCisgICAgICAgIHN0ciAgICAgICAgICAgICByOSwgIFtyMSwgIzRdCisKKyAgICAgICAgLyogW0VdICovCisgICAgICAgIC8qIFtGXSAqLworICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjEwfQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pZGN0ZHNwX2FybS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2lkY3Rkc3BfYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiYzVjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pZGN0ZHNwX2FybS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BUk1fSURDVERTUF9BUk1fSAorI2RlZmluZSBBVkNPREVDX0FSTV9JRENURFNQX0FSTV9ICisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2lkY3Rkc3AuaCIKKwordm9pZCBmZl9pZGN0ZHNwX2luaXRfYXJtdjV0ZShJRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoaWdoX2JpdF9kZXB0aCk7Cit2b2lkIGZmX2lkY3Rkc3BfaW5pdF9hcm12NihJRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpOwordm9pZCBmZl9pZGN0ZHNwX2luaXRfbmVvbihJRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoaWdoX2JpdF9kZXB0aCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FSTV9JRENURFNQX0FSTV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaWRjdGRzcF9hcm12Ni5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2lkY3Rkc3BfYXJtdjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmU3N2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2lkY3Rkc3BfYXJtdjYuUwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworZnVuY3Rpb24gZmZfYWRkX3BpeGVsc19jbGFtcGVkX2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI4LGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjOAorMToKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIwISwge3I0LHI1LHIxMixscn0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI2LCAgcjcsICBbcjFdCisgICAgICAgIHBraGJ0ICAgICAgICAgICByOCwgIHI0LCAgcjUsICBsc2wgIzE2CisgICAgICAgIHBraHRiICAgICAgICAgICByNSwgIHI1LCAgcjQsICBhc3IgIzE2CisgICAgICAgIHBraGJ0ICAgICAgICAgICByNCwgIHIxMiwgbHIsICBsc2wgIzE2CisgICAgICAgIHBraHRiICAgICAgICAgICBsciwgIGxyLCAgcjEyLCBhc3IgIzE2CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjEsIHIyXQorICAgICAgICB1eHRhYjE2ICAgICAgICAgcjgsICByOCwgIHI2CisgICAgICAgIHV4dGFiMTYgICAgICAgICByNSwgIHI1LCAgcjYsICByb3IgIzgKKyAgICAgICAgdXh0YWIxNiAgICAgICAgIHI0LCAgcjQsICByNworICAgICAgICB1eHRhYjE2ICAgICAgICAgbHIsICBsciwgIHI3LCAgcm9yICM4CisgICAgICAgIHVzYXQxNiAgICAgICAgICByOCwgICM4LCAgcjgKKyAgICAgICAgdXNhdDE2ICAgICAgICAgIHI1LCAgIzgsICByNQorICAgICAgICB1c2F0MTYgICAgICAgICAgcjQsICAjOCwgIHI0CisgICAgICAgIHVzYXQxNiAgICAgICAgICBsciwgICM4LCAgbHIKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI2LCAgcjgsICByNSwgIGxzbCAjOAorICAgICAgICBvcnIgICAgICAgICAgICAgcjcsICByNCwgIGxyLCAgbHNsICM4CisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgc3RyZF9wb3N0ICAgICAgIHI2LCAgcjcsICByMSwgIHIyCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI4LHBjfQorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2lkY3Rkc3BfaW5pdF9hcm0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pZGN0ZHNwX2luaXRfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1ZGEwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pZGN0ZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIEFSTS1vcHRpbWl6ZWQgSURDVCBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMSBMaW9uZWwgVWxtZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2lkY3Rkc3AuaCIKKyNpbmNsdWRlICJpZGN0LmgiCisjaW5jbHVkZSAiaWRjdGRzcF9hcm0uaCIKKwordm9pZCBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfYXJtKGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpOworCisvKiBYWFg6IHRob3NlIGZ1bmN0aW9ucyBzaG91bGQgYmUgc3VwcHJlc3NlZCBBU0FQIHdoZW4gYWxsIElEQ1RzIGFyZQorICogY29udmVydGVkICovCitzdGF0aWMgdm9pZCBqX3Jldl9kY3RfYXJtX3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBmZl9qX3Jldl9kY3RfYXJtKGJsb2NrKTsKKyAgICBmZl9wdXRfcGl4ZWxzX2NsYW1wZWQoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGpfcmV2X2RjdF9hcm1fYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGZmX2pfcmV2X2RjdF9hcm0oYmxvY2spOworICAgIGZmX2FkZF9waXhlbHNfY2xhbXBlZChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKK30KKworc3RhdGljIHZvaWQgc2ltcGxlX2lkY3RfYXJtX3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBmZl9zaW1wbGVfaWRjdF9hcm0oYmxvY2spOworICAgIGZmX3B1dF9waXhlbHNfY2xhbXBlZChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKK30KKworc3RhdGljIHZvaWQgc2ltcGxlX2lkY3RfYXJtX2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBmZl9zaW1wbGVfaWRjdF9hcm0oYmxvY2spOworICAgIGZmX2FkZF9waXhlbHNfY2xhbXBlZChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKK30KKworYXZfY29sZCB2b2lkIGZmX2lkY3Rkc3BfaW5pdF9hcm0oSURDVERTUENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoIWF2Y3R4LT5sb3dyZXMgJiYgIWhpZ2hfYml0X2RlcHRoKSB7CisgICAgICAgIGlmICgoYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX0FVVE8gJiYgIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKSkgfHwKKyAgICAgICAgICAgIGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9BUk0pIHsKKyAgICAgICAgICAgIGMtPmlkY3RfcHV0ICA9IGpfcmV2X2RjdF9hcm1fcHV0OworICAgICAgICAgICAgYy0+aWRjdF9hZGQgID0gal9yZXZfZGN0X2FybV9hZGQ7CisgICAgICAgICAgICBjLT5pZGN0ICAgICAgPSBmZl9qX3Jldl9kY3RfYXJtOworICAgICAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX0xJQk1QRUcyOworICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9TSU1QTEVBUk0pIHsKKyAgICAgICAgICAgIGMtPmlkY3RfcHV0ICA9IHNpbXBsZV9pZGN0X2FybV9wdXQ7CisgICAgICAgICAgICBjLT5pZGN0X2FkZCAgPSBzaW1wbGVfaWRjdF9hcm1fYWRkOworICAgICAgICAgICAgYy0+aWRjdCAgICAgID0gZmZfc2ltcGxlX2lkY3RfYXJtOworICAgICAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX05PTkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjLT5hZGRfcGl4ZWxzX2NsYW1wZWQgPSBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfYXJtOworCisgICAgaWYgKGhhdmVfYXJtdjV0ZShjcHVfZmxhZ3MpKQorICAgICAgICBmZl9pZGN0ZHNwX2luaXRfYXJtdjV0ZShjLCBhdmN0eCwgaGlnaF9iaXRfZGVwdGgpOworICAgIGlmIChoYXZlX2FybXY2KGNwdV9mbGFncykpCisgICAgICAgIGZmX2lkY3Rkc3BfaW5pdF9hcm12NihjLCBhdmN0eCwgaGlnaF9iaXRfZGVwdGgpOworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkKKyAgICAgICAgZmZfaWRjdGRzcF9pbml0X25lb24oYywgYXZjdHgsIGhpZ2hfYml0X2RlcHRoKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pZGN0ZHNwX2luaXRfYXJtdjV0ZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2lkY3Rkc3BfaW5pdF9hcm12NXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4ODFlMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pZGN0ZHNwX2luaXRfYXJtdjV0ZS5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pZGN0ZHNwLmgiCisjaW5jbHVkZSAiaWRjdC5oIgorI2luY2x1ZGUgImlkY3Rkc3BfYXJtLmgiCisKK2F2X2NvbGQgdm9pZCBmZl9pZGN0ZHNwX2luaXRfYXJtdjV0ZShJRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKQoreworICAgIGlmICghYXZjdHgtPmxvd3JlcyAmJiAhaGlnaF9iaXRfZGVwdGggJiYKKyAgICAgICAgKGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9BVVRPIHx8CisgICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfU0lNUExFQVVUTyB8fAorICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX1NJTVBMRUFSTVY1VEUpKSB7CisgICAgICAgIGMtPmlkY3RfcHV0ICA9IGZmX3NpbXBsZV9pZGN0X3B1dF9hcm12NXRlOworICAgICAgICBjLT5pZGN0X2FkZCAgPSBmZl9zaW1wbGVfaWRjdF9hZGRfYXJtdjV0ZTsKKyAgICAgICAgYy0+aWRjdCAgICAgID0gZmZfc2ltcGxlX2lkY3RfYXJtdjV0ZTsKKyAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX05PTkU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2lkY3Rkc3BfaW5pdF9hcm12Ni5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2lkY3Rkc3BfaW5pdF9hcm12Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDcwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaWRjdGRzcF9pbml0X2FybXY2LmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2lkY3Rkc3AuaCIKKyNpbmNsdWRlICJpZGN0LmgiCisjaW5jbHVkZSAiaWRjdGRzcF9hcm0uaCIKKwordm9pZCBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfYXJtdjYoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpOworCithdl9jb2xkIHZvaWQgZmZfaWRjdGRzcF9pbml0X2FybXY2KElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKQoreworICAgIGlmICghYXZjdHgtPmxvd3JlcyAmJiAhaGlnaF9iaXRfZGVwdGgpIHsKKyAgICAgICAgaWYgKChhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfQVVUTyAmJiAhKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKSB8fAorICAgICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX1NJTVBMRUFSTVY2KSB7CisgICAgICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl9zaW1wbGVfaWRjdF9wdXRfYXJtdjY7CisgICAgICAgICAgICBjLT5pZGN0X2FkZCAgPSBmZl9zaW1wbGVfaWRjdF9hZGRfYXJtdjY7CisgICAgICAgICAgICBjLT5pZGN0ICAgICAgPSBmZl9zaW1wbGVfaWRjdF9hcm12NjsKKyAgICAgICAgICAgIGMtPnBlcm1fdHlwZSA9IEZGX0lEQ1RfUEVSTV9MSUJNUEVHMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBjLT5hZGRfcGl4ZWxzX2NsYW1wZWQgPSBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfYXJtdjY7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaWRjdGRzcF9pbml0X25lb24uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pZGN0ZHNwX2luaXRfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MGM1YjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vaWRjdGRzcF9pbml0X25lb24uYwpAQCAtMCwwICsxLDUxIEBACisvKgorICogQVJNLU5FT04tb3B0aW1pemVkIElEQ1QgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pZGN0ZHNwLmgiCisjaW5jbHVkZSAiaWRjdC5oIgorI2luY2x1ZGUgImlkY3Rkc3BfYXJtLmgiCisKK3ZvaWQgZmZfYWRkX3BpeGVsc19jbGFtcGVkX25lb24oY29uc3QgaW50MTZfdCAqLCB1aW50OF90ICosIHB0cmRpZmZfdCk7Cit2b2lkIGZmX3B1dF9waXhlbHNfY2xhbXBlZF9uZW9uKGNvbnN0IGludDE2X3QgKiwgdWludDhfdCAqLCBwdHJkaWZmX3QpOwordm9pZCBmZl9wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkX25lb24oY29uc3QgaW50MTZfdCAqLCB1aW50OF90ICosIHB0cmRpZmZfdCk7CisKK2F2X2NvbGQgdm9pZCBmZl9pZGN0ZHNwX2luaXRfbmVvbihJRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKQoreworICAgIGlmICghYXZjdHgtPmxvd3JlcyAmJiAhaGlnaF9iaXRfZGVwdGgpIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9BVVRPIHx8CisgICAgICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfU0lNUExFQVVUTyB8fAorICAgICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX1NJTVBMRU5FT04pIHsKKyAgICAgICAgICAgIGMtPmlkY3RfcHV0ICA9IGZmX3NpbXBsZV9pZGN0X3B1dF9uZW9uOworICAgICAgICAgICAgYy0+aWRjdF9hZGQgID0gZmZfc2ltcGxlX2lkY3RfYWRkX25lb247CisgICAgICAgICAgICBjLT5pZGN0ICAgICAgPSBmZl9zaW1wbGVfaWRjdF9uZW9uOworICAgICAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX1BBUlRUUkFOUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMtPmFkZF9waXhlbHNfY2xhbXBlZCAgICAgICAgPSBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX2NsYW1wZWQgICAgICAgID0gZmZfcHV0X3BpeGVsc19jbGFtcGVkX25lb247CisgICAgYy0+cHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZCA9IGZmX3B1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWRfbmVvbjsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pZGN0ZHNwX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pZGN0ZHNwX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTExYTMzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2lkY3Rkc3BfbmVvbi5TCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQVJNLU5FT04tb3B0aW1pemVkIElEQ1QgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9wdXRfcGl4ZWxzX2NsYW1wZWRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTYtZDE5fSwgW3IwLDoxMjhdIQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsIHE4CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDIwLWQyM30sIFtyMCw6MTI4XSEKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQxLCBxOQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyNC1kMjd9LCBbcjAsOjEyOF0hCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMiwgcTEwCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI4LWQzMX0sIFtyMCw6MTI4XSEKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQzLCBxMTEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICAgICAgW3IxLDo2NF0sIHIyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNCwgcTEyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDF9LCAgICAgIFtyMSw6NjRdLCByMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDUsIHExMworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgICAgICBbcjEsOjY0XSwgcjIKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ2LCBxMTQKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkM30sICAgICAgW3IxLDo2NF0sIHIyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNywgcTE1CisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDR9LCAgICAgIFtyMSw6NjRdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge2Q1fSwgICAgICBbcjEsOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNn0sICAgICAgW3IxLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDd9LCAgICAgIFtyMSw6NjRdLCByMgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2bW92LnU4ICAgICAgICAgZDMxLCAjMTI4CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE2LWQxN30sIFtyMCw6MTI4XSEKKyAgICAgICAgdnFtb3ZuLnMxNiAgICAgIGQwLCBxOAorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxOC1kMTl9LCBbcjAsOjEyOF0hCisgICAgICAgIHZxbW92bi5zMTYgICAgICBkMSwgcTkKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTYtZDE3fSwgW3IwLDoxMjhdIQorICAgICAgICB2cW1vdm4uczE2ICAgICAgZDIsIHE4CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE4LWQxOX0sIFtyMCw6MTI4XSEKKyAgICAgICAgdmFkZC51OCAgICAgICAgIGQwLCBkMCwgZDMxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDIwLWQyMX0sIFtyMCw6MTI4XSEKKyAgICAgICAgdmFkZC51OCAgICAgICAgIGQxLCBkMSwgZDMxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDIyLWQyM30sIFtyMCw6MTI4XSEKKyAgICAgICAgdmFkZC51OCAgICAgICAgIGQyLCBkMiwgZDMxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDB9LCAgICAgIFtyMSw6NjRdLCByMgorICAgICAgICB2cW1vdm4uczE2ICAgICAgZDMsIHE5CisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDF9LCAgICAgIFtyMSw6NjRdLCByMgorICAgICAgICB2cW1vdm4uczE2ICAgICAgZDQsIHExMAorICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgICAgICBbcjEsOjY0XSwgcjIKKyAgICAgICAgdnFtb3ZuLnMxNiAgICAgIGQ1LCBxMTEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMjQtZDI1fSwgW3IwLDoxMjhdIQorICAgICAgICB2YWRkLnU4ICAgICAgICAgZDMsIGQzLCBkMzEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMjYtZDI3fSwgW3IwLDoxMjhdIQorICAgICAgICB2YWRkLnU4ICAgICAgICAgZDQsIGQ0LCBkMzEKKyAgICAgICAgdmFkZC51OCAgICAgICAgIGQ1LCBkNSwgZDMxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDN9LCAgICAgIFtyMSw6NjRdLCByMgorICAgICAgICB2cW1vdm4uczE2ICAgICAgZDYsIHExMgorICAgICAgICB2c3QxLjggICAgICAgICAge2Q0fSwgICAgICBbcjEsOjY0XSwgcjIKKyAgICAgICAgdnFtb3ZuLnMxNiAgICAgIGQ3LCBxMTMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNX0sICAgICAgW3IxLDo2NF0sIHIyCisgICAgICAgIHZhZGQudTggICAgICAgICBkNiwgZDYsIGQzMQorICAgICAgICB2YWRkLnU4ICAgICAgICAgZDcsIGQ3LCBkMzEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNn0sICAgICAgW3IxLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDd9LCAgICAgIFtyMSw6NjRdLCByMgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfYWRkX3BpeGVsc19jbGFtcGVkX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTZ9LCAgIFtyMSw6NjRdLCByMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QwLWQxfSwgW3IwLDoxMjhdIQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTAsIHEwLCBkMTYKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTd9LCAgIFtyMSw6NjRdLCByMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyLWQzfSwgW3IwLDoxMjhdIQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsIHEwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE4fSwgICBbcjEsOjY0XSwgcjIKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExLCBxMSwgZDE3CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDQtZDV9LCBbcjAsOjEyOF0hCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMiwgcTIsIGQxOAorICAgICAgICB2c3QxLjggICAgICAgICAge2QwfSwgICAgW3IzLDo2NF0sIHIyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMiwgcTEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTl9LCAgIFtyMSw6NjRdLCByMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q2LWQ3fSwgW3IwLDoxMjhdIQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTMsIHEzLCBkMTkKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ0LCBxMgorICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgICAgW3IzLDo2NF0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2fSwgICBbcjEsOjY0XSwgcjIKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ2LCBxMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QwLWQxfSwgW3IwLDoxMjhdIQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTAsIHEwLCBkMTYKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNH0sICAgIFtyMyw6NjRdLCByMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxN30sICAgW3IxLDo2NF0sIHIyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDItZDN9LCBbcjAsOjEyOF0hCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMSwgcTEsIGQxNworICAgICAgICB2c3QxLjggICAgICAgICAge2Q2fSwgICAgW3IzLDo2NF0sIHIyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMCwgcTAKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTh9LCAgIFtyMSw6NjRdLCByMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q0LWQ1fSwgW3IwLDoxMjhdIQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTIsIHEyLCBkMTgKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICAgIFtyMyw6NjRdLCByMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIsIHExCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE5fSwgICBbcjEsOjY0XSwgcjIKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ0LCBxMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q2LWQ3fSwgW3IwLDoxMjhdIQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTMsIHEzLCBkMTkKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMn0sICAgIFtyMyw6NjRdLCByMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDYsIHEzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDR9LCAgICBbcjMsOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNn0sICAgIFtyMyw6NjRdLCByMgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pbnRfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2ludF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjNGM3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9pbnRfbmVvbi5TCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBBUk0gTkVPTiBvcHRpbWlzZWQgaW50ZWdlciBvcGVyYXRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworZnVuY3Rpb24gZmZfc2NhbGFycHJvZHVjdF9pbnQxNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2bW92LmkxNiAgICAgICAgcTAsICAjMAorICAgICAgICB2bW92LmkxNiAgICAgICAgcTEsICAjMAorICAgICAgICB2bW92LmkxNiAgICAgICAgcTIsICAjMAorICAgICAgICB2bW92LmkxNiAgICAgICAgcTMsICAjMAorMTogICAgICB2bGQxLjE2ICAgICAgICAge2QxNi1kMTd9LCBbcjBdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyMC1kMjF9LCBbcjEsOjEyOF0hCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxMCwgIGQxNiwgIGQyMAorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxOC1kMTl9LCBbcjBdIQorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTEsICBkMTcsICBkMjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMjItZDIzfSwgW3IxLDoxMjhdIQorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTIsICBkMTgsICBkMjIKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHEzLCAgZDE5LCAgZDIzCisgICAgICAgIHN1YnMgICAgICAgICAgICByMiwgIHIyLCAgICMxNgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICB2cGFkZC5zMzIgICAgICAgZDE2LCBkMCwgICBkMQorICAgICAgICB2cGFkZC5zMzIgICAgICAgZDE3LCBkMiwgICBkMworICAgICAgICB2cGFkZC5zMzIgICAgICAgZDE4LCBkNCwgICBkNQorICAgICAgICB2cGFkZC5zMzIgICAgICAgZDE5LCBkNiwgICBkNworICAgICAgICB2cGFkZC5zMzIgICAgICAgZDAsICBkMTYsICBkMTcKKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQxLCAgZDE4LCAgZDE5CisgICAgICAgIHZwYWRkLnMzMiAgICAgICBkMiwgIGQwLCAgIGQxCisgICAgICAgIHZwYWRkbC5zMzIgICAgICBkMywgIGQyCisgICAgICAgIHZtb3YuMzIgICAgICAgICByMCwgIGQzWzBdCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vanJldmRjdF9hcm0uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9qcmV2ZGN0X2FybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NTFlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vanJldmRjdF9hcm0uUwpAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAgIEMtbGlrZSBwcm90b3R5cGUgOgorICAgICAgICB2b2lkIGpfcmV2X2RjdF9hcm0oRENUQkxPQ0sgZGF0YSkKKworICAgV2l0aCBEQ1RCTE9DSyBiZWluZyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgNjQgJ3NpZ25lZCBzaG9ydHMnCisKKyAgIENvcHlyaWdodCAoYykgMjAwMSBMaW9uZWwgVWxtZXIgKGxpb25lbC51bG1lckBmcmVlLmZyIC8gYmJyb3hAYmJyb3gub3JnKQorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICAgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAgIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCisjZGVmaW5lIEZJWF8wXzI5ODYzMTMzNiAyNDQ2CisjZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCA0NDMzCisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSA2MjcwCisjZGVmaW5lIEZJWF8xXzE3NTg3NTYwMiA5NjMzCisjZGVmaW5lIEZJWF8xXzUwMTMyMTExMCAxMjI5OQorI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgMTY4MTkKKyNkZWZpbmUgRklYXzNfMDcyNzExMDI2IDI1MTcyCisjZGVmaW5lIEZJWF9NXzBfMzkwMTgwNjQ0IC0zMTk2CisjZGVmaW5lIEZJWF9NXzBfODk5OTc2MjIzIC03MzczCisjZGVmaW5lIEZJWF9NXzFfODQ3NzU5MDY1IC0xNTEzNworI2RlZmluZSBGSVhfTV8xXzk2MTU3MDU2MCAtMTYwNjkKKyNkZWZpbmUgRklYX01fMl81NjI5MTU0NDcgLTIwOTk1CisjZGVmaW5lIEZJWF8weEZGRkYgMHhGRkZGCisKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2X0lEICAgICAgMAorI2RlZmluZSBGSVhfMF81NDExOTYxMDBfSUQgICAgICA0CisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NV9JRCAgICAgIDgKKyNkZWZpbmUgRklYXzFfMTc1ODc1NjAyX0lEICAgICAxMgorI2RlZmluZSBGSVhfMV81MDEzMjExMTBfSUQgICAgIDE2CisjZGVmaW5lIEZJWF8yXzA1MzExOTg2OV9JRCAgICAgMjAKKyNkZWZpbmUgRklYXzNfMDcyNzExMDI2X0lEICAgICAyNAorI2RlZmluZSBGSVhfTV8wXzM5MDE4MDY0NF9JRCAgIDI4CisjZGVmaW5lIEZJWF9NXzBfODk5OTc2MjIzX0lEICAgMzIKKyNkZWZpbmUgRklYX01fMV84NDc3NTkwNjVfSUQgICAzNgorI2RlZmluZSBGSVhfTV8xXzk2MTU3MDU2MF9JRCAgIDQwCisjZGVmaW5lIEZJWF9NXzJfNTYyOTE1NDQ3X0lEICAgNDQKKyNkZWZpbmUgRklYXzB4RkZGRl9JRCAgICAgICAgICA0OAorCitmdW5jdGlvbiBmZl9qX3Jldl9kY3RfYXJtLCBleHBvcnQ9MQorICAgICAgICBwdXNoIHtyMCwgcjQgLSByMTEsIGxyfQorCisgICAgICAgIG1vdiBsciwgcjAgICAgICAgICAgICAgICAgICAgICAgQCBsciA9IHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcm93CisgICAgICAgIG1vdiByMTIsICM4ICAgICAgICAgICAgICAgICAgICAgQCByMTIgPSByb3ctY291bnRlcgorICAgICAgICBtb3ZyZWwgcjExLCBjb25zdF9hcnJheSAgICAgICAgIEAgcjExID0gYmFzZSBwb2ludGVyIHRvIHRoZSBjb25zdGFudHMgYXJyYXkKK3Jvd19sb29wOgorICAgICAgICBsZHJzaCByMCwgW2xyLCAjIDBdICAgICAgICAgICAgIEAgcjAgPSAnZDAnCisgICAgICAgIGxkcnNoIHIyLCBbbHIsICMgMl0gICAgICAgICAgICAgQCByMiA9ICdkMicKKworICAgICAgICBAIE9wdGltaXphdGlvbiBmb3Igcm93IHRoYXQgaGF2ZSBhbGwgaXRlbXMgZXhjZXB0IHRoZSBmaXJzdCBzZXQgdG8gMAorICAgICAgICBAICh0aGlzIHdvcmtzIGFzIHRoZSBpbnQxNl90IGFyZSBhbHdheXMgNC1ieXRlIGFsaWduZWQpCisgICAgICAgIGxkciByNSwgW2xyLCAjIDBdCisgICAgICAgIGxkciByNiwgW2xyLCAjIDRdCisgICAgICAgIGxkciByMywgW2xyLCAjIDhdCisgICAgICAgIGxkciByNCwgW2xyLCAjMTJdCisgICAgICAgIG9yciByMywgcjMsIHI0CisgICAgICAgIG9yciByMywgcjMsIHI2CisgICAgICAgIG9ycnMgcjUsIHIzLCByNQorICAgICAgICBiZXEgZW5kX29mX3Jvd19sb29wICAgICAgICAgICAgIEAgbm90aGluZyB0byBiZSBkb25lIGFzIEFMTCBvZiB0aGVtIGFyZSAnMCcKKyAgICAgICAgb3JycyByMywgcjMsIHIyCisgICAgICAgIGJlcSBlbXB0eV9yb3cKKworICAgICAgICBsZHJzaCByMSwgW2xyLCAjIDhdICAgICAgICAgICAgIEAgcjEgPSAnZDEnCisgICAgICAgIGxkcnNoIHI0LCBbbHIsICMgNF0gICAgICAgICAgICAgQCByNCA9ICdkNCcKKyAgICAgICAgbGRyc2ggcjYsIFtsciwgIyA2XSAgICAgICAgICAgICBAIHI2ID0gJ2Q2JworCisgICAgICAgIGxkciByMywgW3IxMSwgI0ZJWF8wXzU0MTE5NjEwMF9JRF0KKyAgICAgICAgYWRkIHI3LCByMiwgcjYKKyAgICAgICAgbGRyIHI1LCBbcjExLCAjRklYX01fMV84NDc3NTkwNjVfSURdCisgICAgICAgIG11bCByNywgcjMsIHI3ICAgICAgICAgICAgICAgICAgICAgIEAgcjcgPSB6MQorICAgICAgICBsZHIgcjMsIFtyMTEsICNGSVhfMF83NjUzNjY4NjVfSURdCisgICAgICAgIG1sYSByNiwgcjUsIHI2LCByNyAgICAgICAgICAgICAgICAgIEAgcjYgPSB0bXAyCisgICAgICAgIGFkZCByNSwgcjAsIHI0ICAgICAgICAgICAgICAgICAgICAgIEAgcjUgPSB0bXAwCisgICAgICAgIG1sYSByMiwgcjMsIHIyLCByNyAgICAgICAgICAgICAgICAgIEAgcjIgPSB0bXAzCisgICAgICAgIHN1YiByMywgcjAsIHI0ICAgICAgICAgICAgICAgICAgICAgIEAgcjMgPSB0bXAxCisKKyAgICAgICAgYWRkIHIwLCByMiwgcjUsIGxzbCAjMTMgICAgICAgICAgICAgQCByMCA9IHRtcDEwCisgICAgICAgIHJzYiByMiwgcjIsIHI1LCBsc2wgIzEzICAgICAgICAgICAgIEAgcjIgPSB0bXAxMworICAgICAgICBhZGQgcjQsIHI2LCByMywgbHNsICMxMyAgICAgICAgICAgICBAIHI0ID0gdG1wMTEKKyAgICAgICAgcnNiIHIzLCByNiwgcjMsIGxzbCAjMTMgICAgICAgICAgICAgQCByMyA9IHRtcDEyCisKKyAgICAgICAgcHVzaCB7cjAsIHIyLCByMywgcjR9IEAgc2F2ZSBvbiB0aGUgc3RhY2sgdG1wMTAsIHRtcDEzLCB0bXAxMiwgdG1wMTEKKworICAgICAgICBsZHJzaCByMywgW2xyLCAjMTBdICAgICAgICAgICAgIEAgcjMgPSAnZDMnCisgICAgICAgIGxkcnNoIHI1LCBbbHIsICMxMl0gICAgICAgICAgICAgQCByNSA9ICdkNScKKyAgICAgICAgbGRyc2ggcjcsIFtsciwgIzE0XSAgICAgICAgICAgICBAIHI3ID0gJ2Q3JworCisgICAgICAgIGFkZCByMCwgcjMsIHI1ICAgICAgICAgICAgICAgICAgICAgICAgQCByMCA9ICd6MicKKyAgICAgICAgYWRkIHIyLCByMSwgcjcgICAgICAgICAgICAgICAgICBAIHIyID0gJ3oxJworICAgICAgICBhZGQgcjQsIHIzLCByNyAgICAgICAgICAgICAgICAgIEAgcjQgPSAnejMnCisgICAgICAgIGFkZCByNiwgcjEsIHI1ICAgICAgICAgICAgICAgICAgQCByNiA9ICd6NCcKKyAgICAgICAgbGRyIHI5LCBbcjExLCAjRklYXzFfMTc1ODc1NjAyX0lEXQorICAgICAgICBhZGQgcjgsIHI0LCByNiAgICAgICAgICAgICAgICAgIEAgcjggPSB6MyArIHo0CisgICAgICAgIGxkciByMTAsIFtyMTEsICNGSVhfTV8wXzg5OTk3NjIyM19JRF0KKyAgICAgICAgbXVsIHI4LCByOSwgcjggICAgICAgICAgICAgICAgICBAIHI4ID0gJ3o1JworICAgICAgICBsZHIgcjksIFtyMTEsICNGSVhfTV8yXzU2MjkxNTQ0N19JRF0KKyAgICAgICAgbXVsIHIyLCByMTAsIHIyICAgICAgICAgICAgICAgICBAIHIyID0gJ3oxJworICAgICAgICBsZHIgcjEwLCBbcjExLCAjRklYX01fMV85NjE1NzA1NjBfSURdCisgICAgICAgIG11bCByMCwgcjksIHIwICAgICAgICAgICAgICAgICAgQCByMCA9ICd6MicKKyAgICAgICAgbGRyIHI5LCBbcjExLCAjRklYX01fMF8zOTAxODA2NDRfSURdCisgICAgICAgIG1sYSByNCwgcjEwLCByNCwgcjggICAgICAgICAgICAgQCByNCA9ICd6MycKKyAgICAgICAgbGRyIHIxMCwgW3IxMSwgI0ZJWF8wXzI5ODYzMTMzNl9JRF0KKyAgICAgICAgbWxhIHI2LCByOSwgcjYsIHI4ICAgICAgICAgICAgICBAIHI2ID0gJ3o0JworICAgICAgICBsZHIgcjksIFtyMTEsICNGSVhfMl8wNTMxMTk4NjlfSURdCisgICAgICAgIG1sYSByNywgcjEwLCByNywgcjIgICAgICAgICAgICAgQCByNyA9IHRtcDAgKyB6MQorICAgICAgICBsZHIgcjEwLCBbcjExLCAjRklYXzNfMDcyNzExMDI2X0lEXQorICAgICAgICBtbGEgcjUsIHI5LCByNSwgcjAgICAgICAgICAgICAgIEAgcjUgPSB0bXAxICsgejIKKyAgICAgICAgbGRyIHI5LCBbcjExLCAjRklYXzFfNTAxMzIxMTEwX0lEXQorICAgICAgICBtbGEgcjMsIHIxMCwgcjMsIHIwICAgICAgICAgICAgIEAgcjMgPSB0bXAyICsgejIKKyAgICAgICAgYWRkIHI3LCByNywgcjQgICAgICAgICAgICAgICAgICBAIHI3ID0gdG1wMAorICAgICAgICBtbGEgcjEsIHI5LCByMSwgcjIgICAgICAgICAgICAgIEAgcjEgPSB0bXAzICsgejEKKyAgICAgICAgYWRkIHI1LCAgICAgICAgcjUsIHI2ICAgICAgICAgICAgICAgICAgQCByNSA9IHRtcDEKKyAgICAgICAgYWRkIHIzLCByMywgcjQgICAgICAgICAgICAgICAgICBAIHIzID0gdG1wMgorICAgICAgICBhZGQgcjEsIHIxLCByNiAgICAgICAgICAgICAgICAgIEAgcjEgPSB0bXAzCisKKyAgICAgICAgcG9wIHtyMCwgcjIsIHI0LCByNn0gQCByMCA9IHRtcDEwIC8gcjIgPSB0bXAxMyAvIHI0ID0gdG1wMTIgLyByNiA9IHRtcDExCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjEgPSB0bXAzICAvIHIzID0gdG1wMiAgLyByNSA9IHRtcDEgIC8gcjcgPSB0bXAwCisKKyAgICAgICAgQCBDb21wdXRlIERFU0NBTEUodG1wMTAgKyB0bXAzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpCisgICAgICAgIGFkZCByOCwgcjAsIHIxCisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTApCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTEKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjIDBdCisKKyAgICAgICAgQCBDb21wdXRlIERFU0NBTEUodG1wMTAgLSB0bXAzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpCisgICAgICAgIHN1YiByOCwgcjAsIHIxCisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTApCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTEKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjMTRdCisKKyAgICAgICAgQCBDb21wdXRlIERFU0NBTEUodG1wMTEgKyB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpCisgICAgICAgIGFkZCByOCwgcjYsIHIzCisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTApCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTEKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjIDJdCisKKyAgICAgICAgQCBDb21wdXRlIERFU0NBTEUodG1wMTEgLSB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpCisgICAgICAgIHN1YiByOCwgcjYsIHIzCisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTApCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTEKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjMTJdCisKKyAgICAgICAgQCBDb21wdXRlIERFU0NBTEUodG1wMTIgKyB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpCisgICAgICAgIGFkZCByOCwgcjQsIHI1CisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTApCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTEKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjIDRdCisKKyAgICAgICAgQCBDb21wdXRlIERFU0NBTEUodG1wMTIgLSB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpCisgICAgICAgIHN1YiByOCwgcjQsIHI1CisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTApCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTEKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjMTBdCisKKyAgICAgICAgQCBDb21wdXRlIERFU0NBTEUodG1wMTMgKyB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpCisgICAgICAgIGFkZCByOCwgcjIsIHI3CisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTApCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTEKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjIDZdCisKKyAgICAgICAgQCBDb21wdXRlIERFU0NBTEUodG1wMTMgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpCisgICAgICAgIHN1YiByOCwgcjIsIHI3CisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTApCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTEKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjIDhdCisKKyAgICAgICAgQCBFbmQgb2Ygcm93IGxvb3AKKyAgICAgICAgYWRkIGxyLCBsciwgIzE2CisgICAgICAgIHN1YnMgcjEyLCByMTIsICMxCisgICAgICAgIGJuZSByb3dfbG9vcAorICAgICAgICBiZXEgc3RhcnRfY29sdW1uX2xvb3AKKworZW1wdHlfcm93OgorICAgICAgICBsZHIgcjEsIFtyMTEsICNGSVhfMHhGRkZGX0lEXQorICAgICAgICBtb3YgcjAsIHIwLCBsc2wgIzIKKyAgICAgICAgYW5kIHIwLCByMCwgcjEKKyAgICAgICAgYWRkIHIwLCByMCwgcjAsIGxzbCAjMTYKKyAgICAgICAgc3RyIHIwLCBbbHIsICMgMF0KKyAgICAgICAgc3RyIHIwLCBbbHIsICMgNF0KKyAgICAgICAgc3RyIHIwLCBbbHIsICMgOF0KKyAgICAgICAgc3RyIHIwLCBbbHIsICMxMl0KKworZW5kX29mX3Jvd19sb29wOgorICAgICAgICBAIEVuZCBvZiBsb29wCisgICAgICAgIGFkZCBsciwgbHIsICMxNgorICAgICAgICBzdWJzIHIxMiwgcjEyLCAjMQorICAgICAgICBibmUgcm93X2xvb3AKKworc3RhcnRfY29sdW1uX2xvb3A6CisgICAgICAgIEAgU3RhcnQgb2YgY29sdW1uIGxvb3AKKyAgICAgICAgcG9wIHtscn0KKyAgICAgICAgbW92IHIxMiwgIzgKK2NvbHVtbl9sb29wOgorICAgICAgICBsZHJzaCByMCwgW2xyLCAjKCAwKjgpXSAgICAgICAgICAgICBAIHIwID0gJ2QwJworICAgICAgICBsZHJzaCByMiwgW2xyLCAjKCA0KjgpXSAgICAgICAgICAgICBAIHIyID0gJ2QyJworICAgICAgICBsZHJzaCByNCwgW2xyLCAjKCA4KjgpXSAgICAgICAgICAgICBAIHI0ID0gJ2Q0JworICAgICAgICBsZHJzaCByNiwgW2xyLCAjKDEyKjgpXSAgICAgICAgICAgICBAIHI2ID0gJ2Q2JworCisgICAgICAgIGxkciByMywgW3IxMSwgI0ZJWF8wXzU0MTE5NjEwMF9JRF0KKyAgICAgICAgYWRkIHIxLCByMiwgcjYKKyAgICAgICAgbGRyIHI1LCBbcjExLCAjRklYX01fMV84NDc3NTkwNjVfSURdCisgICAgICAgIG11bCByMSwgcjMsIHIxICAgICAgICAgICAgICAgICAgICAgIEAgcjEgPSB6MQorICAgICAgICBsZHIgcjMsIFtyMTEsICNGSVhfMF83NjUzNjY4NjVfSURdCisgICAgICAgIG1sYSByNiwgcjUsIHI2LCByMSAgICAgICAgICAgICAgICAgIEAgcjYgPSB0bXAyCisgICAgICAgIGFkZCByNSwgcjAsIHI0ICAgICAgICAgICAgICAgICAgICAgIEAgcjUgPSB0bXAwCisgICAgICAgIG1sYSByMiwgcjMsIHIyLCByMSAgICAgICAgICAgICAgICAgIEAgcjIgPSB0bXAzCisgICAgICAgIHN1YiByMywgcjAsIHI0ICAgICAgICAgICAgICAgICAgICAgIEAgcjMgPSB0bXAxCisKKyAgICAgICAgYWRkIHIwLCByMiwgcjUsIGxzbCAjMTMgICAgICAgICAgICAgQCByMCA9IHRtcDEwCisgICAgICAgIHJzYiByMiwgcjIsIHI1LCBsc2wgIzEzICAgICAgICAgICAgIEAgcjIgPSB0bXAxMworICAgICAgICBhZGQgcjQsIHI2LCByMywgbHNsICMxMyAgICAgICAgICAgICBAIHI0ID0gdG1wMTEKKyAgICAgICAgcnNiIHI2LCByNiwgcjMsIGxzbCAjMTMgICAgICAgICAgICAgQCByNiA9IHRtcDEyCisKKyAgICAgICAgbGRyc2ggcjEsIFtsciwgIyggMio4KV0gICAgICAgICAgICAgQCByMSA9ICdkMScKKyAgICAgICAgbGRyc2ggcjMsIFtsciwgIyggNio4KV0gICAgICAgICAgICAgQCByMyA9ICdkMycKKyAgICAgICAgbGRyc2ggcjUsIFtsciwgIygxMCo4KV0gICAgICAgICAgICAgQCByNSA9ICdkNScKKyAgICAgICAgbGRyc2ggcjcsIFtsciwgIygxNCo4KV0gICAgICAgICAgICAgQCByNyA9ICdkNycKKworICAgICAgICBAIENoZWNrIGZvciBlbXB0eSBvZGQgY29sdW1uIChoYXBwZW5zIGFib3V0IDIwIHRvIDI1ICUgb2YgdGhlIHRpbWUgYWNjb3JkaW5nIHRvIG15IHN0YXRzKQorICAgICAgICBvcnIgcjksIHIxLCByMworICAgICAgICBvcnIgcjEwLCByNSwgcjcKKyAgICAgICAgb3JycyByMTAsIHI5LCByMTAKKyAgICAgICAgYmVxIGVtcHR5X29kZF9jb2x1bW4KKworICAgICAgICBwdXNoIHtyMCwgcjIsIHI0LCByNn0gQCBzYXZlIG9uIHRoZSBzdGFjayB0bXAxMCwgdG1wMTMsIHRtcDEyLCB0bXAxMQorCisgICAgICAgIGFkZCByMCwgcjMsIHI1ICAgICAgICAgICAgICAgICAgQCByMCA9ICd6MicKKyAgICAgICAgYWRkIHIyLCByMSwgcjcgICAgICAgICAgICAgICAgICBAIHIyID0gJ3oxJworICAgICAgICBhZGQgcjQsIHIzLCByNyAgICAgICAgICAgICAgICAgIEAgcjQgPSAnejMnCisgICAgICAgIGFkZCByNiwgcjEsIHI1ICAgICAgICAgICAgICAgICAgQCByNiA9ICd6NCcKKyAgICAgICAgbGRyIHI5LCBbcjExLCAjRklYXzFfMTc1ODc1NjAyX0lEXQorICAgICAgICBhZGQgcjgsIHI0LCByNgorICAgICAgICBsZHIgcjEwLCBbcjExLCAjRklYX01fMF84OTk5NzYyMjNfSURdCisgICAgICAgIG11bCByOCwgcjksIHI4ICAgICAgICAgICAgICAgICAgQCByOCA9ICd6NScKKyAgICAgICAgbGRyIHI5LCBbcjExLCAjRklYX01fMl81NjI5MTU0NDdfSURdCisgICAgICAgIG11bCByMiwgcjEwLCByMiAgICAgICAgICAgICAgICAgQCByMiA9ICd6MScKKyAgICAgICAgbGRyIHIxMCwgW3IxMSwgI0ZJWF9NXzFfOTYxNTcwNTYwX0lEXQorICAgICAgICBtdWwgcjAsIHI5LCByMCAgICAgICAgICAgICAgICAgIEAgcjAgPSAnejInCisgICAgICAgIGxkciByOSwgW3IxMSwgI0ZJWF9NXzBfMzkwMTgwNjQ0X0lEXQorICAgICAgICBtbGEgcjQsIHIxMCwgcjQsIHI4ICAgICAgICAgICAgIEAgcjQgPSAnejMnCisgICAgICAgIGxkciByMTAsIFtyMTEsICNGSVhfMF8yOTg2MzEzMzZfSURdCisgICAgICAgIG1sYSByNiwgcjksIHI2LCByOCAgICAgICAgICAgICAgQCByNiA9ICd6NCcKKyAgICAgICAgbGRyIHI5LCBbcjExLCAjRklYXzJfMDUzMTE5ODY5X0lEXQorICAgICAgICBtbGEgcjcsIHIxMCwgcjcsIHIyICAgICAgICAgICAgIEAgcjcgPSB0bXAwICsgejEKKyAgICAgICAgbGRyIHIxMCwgW3IxMSwgI0ZJWF8zXzA3MjcxMTAyNl9JRF0KKyAgICAgICAgbWxhIHI1LCByOSwgcjUsIHIwICAgICAgICAgICAgICBAIHI1ID0gdG1wMSArIHoyCisgICAgICAgIGxkciByOSwgW3IxMSwgI0ZJWF8xXzUwMTMyMTExMF9JRF0KKyAgICAgICAgbWxhIHIzLCByMTAsIHIzLCByMCAgICAgICAgICAgICBAIHIzID0gdG1wMiArIHoyCisgICAgICAgIGFkZCByNywgcjcsIHI0ICAgICAgICAgICAgICAgICAgQCByNyA9IHRtcDAKKyAgICAgICAgbWxhIHIxLCByOSwgcjEsIHIyICAgICAgICAgICAgICBAIHIxID0gdG1wMyArIHoxCisgICAgICAgIGFkZCByNSwgICAgICAgIHI1LCByNiAgICAgICAgICAgICAgICAgIEAgcjUgPSB0bXAxCisgICAgICAgIGFkZCByMywgcjMsIHI0ICAgICAgICAgICAgICAgICAgQCByMyA9IHRtcDIKKyAgICAgICAgYWRkIHIxLCByMSwgcjYgICAgICAgICAgICAgICAgICBAIHIxID0gdG1wMworCisgICAgICAgIHBvcCB7cjAsIHIyLCByNCwgcjZ9IEAgcjAgPSB0bXAxMCAvIHIyID0gdG1wMTMgLyByNCA9IHRtcDExIC8gcjYgPSB0bXAxMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHIxID0gdG1wMyAgLyByMyA9IHRtcDIgIC8gcjUgPSB0bXAxICAvIHI3ID0gdG1wMAorCisgICAgICAgIEAgQ29tcHV0ZSBERVNDQUxFKHRtcDEwICsgdG1wMywgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgICAgIGFkZCByOCwgcjAsIHIxCisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTcpCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTgKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjKCAwKjgpXQorCisgICAgICAgIEAgQ29tcHV0ZSBERVNDQUxFKHRtcDEwIC0gdG1wMywgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgICAgIHN1YiByOCwgcjAsIHIxCisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTcpCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTgKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjKDE0KjgpXQorCisgICAgICAgIEAgQ29tcHV0ZSBERVNDQUxFKHRtcDExICsgdG1wMiwgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgICAgIGFkZCByOCwgcjQsIHIzCisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTcpCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTgKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjKCAyKjgpXQorCisgICAgICAgIEAgQ29tcHV0ZSBERVNDQUxFKHRtcDExIC0gdG1wMiwgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgICAgIHN1YiByOCwgcjQsIHIzCisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTcpCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTgKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjKDEyKjgpXQorCisgICAgICAgIEAgQ29tcHV0ZSBERVNDQUxFKHRtcDEyICsgdG1wMSwgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgICAgIGFkZCByOCwgcjYsIHI1CisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTcpCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTgKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjKCA0KjgpXQorCisgICAgICAgIEAgQ29tcHV0ZSBERVNDQUxFKHRtcDEyIC0gdG1wMSwgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgICAgIHN1YiByOCwgcjYsIHI1CisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTcpCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTgKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjKDEwKjgpXQorCisgICAgICAgIEAgQ29tcHV0ZSBERVNDQUxFKHRtcDEzICsgdG1wMCwgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgICAgIGFkZCByOCwgcjIsIHI3CisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTcpCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTgKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjKCA2KjgpXQorCisgICAgICAgIEAgQ29tcHV0ZSBERVNDQUxFKHRtcDEzIC0gdG1wMCwgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgICAgIHN1YiByOCwgcjIsIHI3CisgICAgICAgIGFkZCByOCwgcjgsICMoMTw8MTcpCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjMTgKKyAgICAgICAgc3RyaCByOCwgW2xyLCAjKCA4KjgpXQorCisgICAgICAgIEAgRW5kIG9mIHJvdyBsb29wCisgICAgICAgIGFkZCBsciwgbHIsICMyCisgICAgICAgIHN1YnMgcjEyLCByMTIsICMxCisgICAgICAgIGJuZSBjb2x1bW5fbG9vcAorICAgICAgICBiZXEgdGhlX2VuZAorCitlbXB0eV9vZGRfY29sdW1uOgorICAgICAgICBAIENvbXB1dGUgREVTQ0FMRSh0bXAxMCArIHRtcDMsIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorICAgICAgICBAIENvbXB1dGUgREVTQ0FMRSh0bXAxMCAtIHRtcDMsIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorICAgICAgICBhZGQgcjAsIHIwLCAjKDE8PDE3KQorICAgICAgICBtb3YgcjAsIHIwLCBhc3IgIzE4CisgICAgICAgIHN0cmggcjAsIFtsciwgIyggMCo4KV0KKyAgICAgICAgc3RyaCByMCwgW2xyLCAjKDE0KjgpXQorCisgICAgICAgIEAgQ29tcHV0ZSBERVNDQUxFKHRtcDExICsgdG1wMiwgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgICAgIEAgQ29tcHV0ZSBERVNDQUxFKHRtcDExIC0gdG1wMiwgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgICAgIGFkZCByNCwgcjQsICMoMTw8MTcpCisgICAgICAgIG1vdiByNCwgcjQsIGFzciAjMTgKKyAgICAgICAgc3RyaCByNCwgW2xyLCAjKCAyKjgpXQorICAgICAgICBzdHJoIHI0LCBbbHIsICMoMTIqOCldCisKKyAgICAgICAgQCBDb21wdXRlIERFU0NBTEUodG1wMTIgKyB0bXAxLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKyAgICAgICAgQCBDb21wdXRlIERFU0NBTEUodG1wMTIgLSB0bXAxLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKyAgICAgICAgYWRkIHI2LCByNiwgIygxPDwxNykKKyAgICAgICAgbW92IHI2LCByNiwgYXNyICMxOAorICAgICAgICBzdHJoIHI2LCBbbHIsICMoIDQqOCldCisgICAgICAgIHN0cmggcjYsIFtsciwgIygxMCo4KV0KKworICAgICAgICBAIENvbXB1dGUgREVTQ0FMRSh0bXAxMyArIHRtcDAsIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorICAgICAgICBAIENvbXB1dGUgREVTQ0FMRSh0bXAxMyAtIHRtcDAsIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorICAgICAgICBhZGQgcjIsIHIyLCAjKDE8PDE3KQorICAgICAgICBtb3YgcjIsIHIyLCBhc3IgIzE4CisgICAgICAgIHN0cmggcjIsIFtsciwgIyggNio4KV0KKyAgICAgICAgc3RyaCByMiwgW2xyLCAjKCA4KjgpXQorCisgICAgICAgIEAgRW5kIG9mIHJvdyBsb29wCisgICAgICAgIGFkZCBsciwgbHIsICMyCisgICAgICAgIHN1YnMgcjEyLCByMTIsICMxCisgICAgICAgIGJuZSBjb2x1bW5fbG9vcAorCit0aGVfZW5kOgorICAgICAgICBAIFRoZSBlbmQuLi4uCisgICAgICAgIHBvcCB7cjQgLSByMTEsIHBjfQorZW5kZnVuYworCitjb25zdCBjb25zdF9hcnJheQorICAgICAgICAud29yZCBGSVhfMF8yOTg2MzEzMzYKKyAgICAgICAgLndvcmQgRklYXzBfNTQxMTk2MTAwCisgICAgICAgIC53b3JkIEZJWF8wXzc2NTM2Njg2NQorICAgICAgICAud29yZCBGSVhfMV8xNzU4NzU2MDIKKyAgICAgICAgLndvcmQgRklYXzFfNTAxMzIxMTEwCisgICAgICAgIC53b3JkIEZJWF8yXzA1MzExOTg2OQorICAgICAgICAud29yZCBGSVhfM18wNzI3MTEwMjYKKyAgICAgICAgLndvcmQgRklYX01fMF8zOTAxODA2NDQKKyAgICAgICAgLndvcmQgRklYX01fMF84OTk5NzYyMjMKKyAgICAgICAgLndvcmQgRklYX01fMV84NDc3NTkwNjUKKyAgICAgICAgLndvcmQgRklYX01fMV85NjE1NzA1NjAKKyAgICAgICAgLndvcmQgRklYX01fMl81NjI5MTU0NDcKKyAgICAgICAgLndvcmQgRklYXzB4RkZGRgorZW5kY29uc3QKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9sb3NzbGVzc19hdWRpb2RzcF9pbml0X2FybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL2xvc3NsZXNzX2F1ZGlvZHNwX2luaXRfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxYTM5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9sb3NzbGVzc19hdWRpb2RzcF9pbml0X2FybS5jCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9sb3NzbGVzc19hdWRpb2RzcC5oIgorCitpbnQzMl90IGZmX3NjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MTZfbmVvbihpbnQxNl90ICp2MSwgY29uc3QgaW50MTZfdCAqdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp2MywgaW50IGxlbiwgaW50IG11bCk7CisKK2F2X2NvbGQgdm9pZCBmZl9sbGF1ZGRzcF9pbml0X2FybShMTEF1ZERTUENvbnRleHQgKmMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5zY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2ID0gZmZfc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNl9uZW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9sb3NzbGVzc19hdWRpb2RzcF9uZW9uLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbG9zc2xlc3NfYXVkaW9kc3BfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhN2M0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbG9zc2xlc3NfYXVkaW9kc3BfbmVvbi5TCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBBUk0gTkVPTiBvcHRpbWlzZWQgaW50ZWdlciBvcGVyYXRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgS29zdHlhIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitAIHNjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MTYoLyphbGlnbmVkKi92MCx2MSx2MixvcmRlcixtdWwpCitmdW5jdGlvbiBmZl9zY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2X25lb24sIGV4cG9ydD0xCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI4W10sZDI5W119LCBbc3BdCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMCwgICMwCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMSwgICMwCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMiwgICMwCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMywgICMwCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsIHIwCisKKzE6ICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTYtZDE3fSwgW3IwLDoxMjhdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxOC1kMTl9LCBbcjFdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyMC1kMjF9LCBbcjJdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyMi1kMjN9LCBbcjAsOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI0LWQyNX0sIFtyMV0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI2LWQyN30sIFtyMl0hCisgICAgICAgIHZtdWwuczE2ICAgICAgICBxMTAsIHExMCwgIHExNAorICAgICAgICB2bXVsLnMxNiAgICAgICAgcTEzLCBxMTMsICBxMTQKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHEwLCAgZDE2LCAgZDE4CisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxMSwgIGQxNywgIGQxOQorICAgICAgICB2YWRkLnMxNiAgICAgICAgcTEwLCBxOCwgICBxMTAKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIHExMywgcTExLCAgcTEzCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxMiwgIGQyMiwgIGQyNAorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTMsICBkMjMsICBkMjUKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTB9LCAgICAgW3IxMiw6MTI4XSEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAgIzE2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEzfSwgICAgIFtyMTIsOjEyOF0hCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorCisgICAgICAgIHZwYWRkLnMzMiAgICAgICBkMTYsIGQwLCAgIGQxCisgICAgICAgIHZwYWRkLnMzMiAgICAgICBkMTcsIGQyLCAgIGQzCisgICAgICAgIHZwYWRkLnMzMiAgICAgICBkMTgsIGQ0LCAgIGQ1CisgICAgICAgIHZwYWRkLnMzMiAgICAgICBkMTksIGQ2LCAgIGQ3CisgICAgICAgIHZwYWRkLnMzMiAgICAgICBkMCwgIGQxNiwgIGQxNworICAgICAgICB2cGFkZC5zMzIgICAgICAgZDEsICBkMTgsICBkMTkKKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQyLCAgZDAsICAgZDEKKyAgICAgICAgdnBhZGRsLnMzMiAgICAgIGQzLCAgZDIKKyAgICAgICAgdm1vdi4zMiAgICAgICAgIHIwLCAgZDNbMF0KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbWF0aG9wcy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21hdGhvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzU3YzU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21hdGhvcHMuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIHNpbXBsZSBtYXRoIG9wZXJhdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PiBldCBhbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVJNX01BVEhPUFNfSAorI2RlZmluZSBBVkNPREVDX0FSTV9NQVRIT1BTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworI2lmIEhBVkVfSU5MSU5FX0FTTQorCisjaWYgSEFWRV9BUk1WNl9JTkxJTkUKKyNkZWZpbmUgTVVMSCBNVUxICitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IGludCBNVUxIKGludCBhLCBpbnQgYikKK3sKKyAgICBpbnQgcjsKKyAgICBfX2FzbV9fICgic21tdWwgJTAsICUxLCAlMiIgOiAiPXIiKHIpIDogInIiKGEpLCAiciIoYikpOworICAgIHJldHVybiByOworfQorCisjZGVmaW5lIEZBU1RESVYgRkFTVERJVgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IEZBU1RESVYoaW50IGEsIGludCBiKQoreworICAgIGludCByOworICAgIF9fYXNtX18gKCJjbXAgICAgICUyLCAjMiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImxkciAgICAgJTAsIFslMywgJTIsIGxzbCAjMl0gXG5cdCIKKyAgICAgICAgICAgICAiaXRlICAgICBsZSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsc3JsZSAgICUwLCAlMSwgIzEgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInNtbXVsZ3QgJTAsICUwLCAlMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9JnIiKHIpIDogInIiKGEpLCAiciIoYiksICJyIihmZl9pbnZlcnNlKSA6ICJjYyIpOworICAgIHJldHVybiByOworfQorCisjZWxzZSAvKiBIQVZFX0FSTVY2X0lOTElORSAqLworCisjZGVmaW5lIEZBU1RESVYgRkFTVERJVgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IEZBU1RESVYoaW50IGEsIGludCBiKQoreworICAgIGludCByLCB0OworICAgIF9fYXNtX18gKCJ1bXVsbCAlMSwgJTAsICUyLCAlMyIKKyAgICAgICAgICAgICA6ICI9JnIiKHIpLCAiPSZyIih0KSA6ICJyIihhKSwgInIiKGZmX2ludmVyc2VbYl0pKTsKKyAgICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisjZGVmaW5lIE1MUzY0KGQsIGEsIGIpIE1BQzY0KGQsIC0oYSksIGIpCisKKyNpZiBIQVZFX0FSTVY1VEVfSU5MSU5FCisKKy8qIHNpZ25lZCAxNngxNiAtPiAzMiBtdWx0aXBseSBhZGQgYWNjdW11bGF0ZSAqLworIyAgIGRlZmluZSBNQUMxNihydCwgcmEsIHJiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gKCJzbWxhYmIgJTAsICUxLCAlMiwgJTAiIDogIityIihydCkgOiAiciIocmEpLCAiciIocmIpKTsKKworLyogc2lnbmVkIDE2eDE2IC0+IDMyIG11bHRpcGx5ICovCisjICAgZGVmaW5lIE1VTDE2IE1VTDE2CitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IGludCBNVUwxNihpbnQgcmEsIGludCByYikKK3sKKyAgICBpbnQgcnQ7CisgICAgX19hc21fXyAoInNtdWxiYiAlMCwgJTEsICUyIiA6ICI9ciIocnQpIDogInIiKHJhKSwgInIiKHJiKSk7CisgICAgcmV0dXJuIHJ0OworfQorCisjZW5kaWYKKworI2RlZmluZSBtaWRfcHJlZCBtaWRfcHJlZAorc3RhdGljIGlubGluZSBhdl9jb25zdCBpbnQgbWlkX3ByZWQoaW50IGEsIGludCBiLCBpbnQgYykKK3sKKyAgICBpbnQgbTsKKyAgICBfX2FzbV9fICgKKyAgICAgICAgIm1vdiAgICUwLCAlMiAgXG5cdCIKKyAgICAgICAgImNtcCAgICUxLCAlMiAgXG5cdCIKKyAgICAgICAgIml0dCAgIGd0ICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmd0ICUwLCAlMSAgXG5cdCIKKyAgICAgICAgIm1vdmd0ICUxLCAlMiAgXG5cdCIKKyAgICAgICAgImNtcCAgICUxLCAlMyAgXG5cdCIKKyAgICAgICAgIml0ICAgIGxlICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmxlICUxLCAlMyAgXG5cdCIKKyAgICAgICAgImNtcCAgICUwLCAlMSAgXG5cdCIKKyAgICAgICAgIml0ICAgIGd0ICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmd0ICUwLCAlMSAgXG5cdCIKKyAgICAgICAgOiAiPSZyIihtKSwgIityIihhKQorICAgICAgICA6ICJyIihiKSwgInIiKGMpCisgICAgICAgIDogImNjIik7CisgICAgcmV0dXJuIG07Cit9CisKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworI2VuZGlmIC8qIEFWQ09ERUNfQVJNX01BVEhPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21kY3RfZml4ZWRfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21kY3RfZml4ZWRfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NWM1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbWRjdF9maXhlZF9uZW9uLlMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCisubWFjcm8gIHByZXJvdCAgICAgICAgICBkc3QsIHJ0CisgICAgICAgIGxzciAgICAgICAgICAgICByMywgIHI2LCAgIzIgICAgICAgICAgICBAIG40CisgICAgICAgIGFkZCAgICAgICAgICAgICBccnQsIHI0LCAgcjYsICBsc3IgIzEgICBAIHJldnRhYiArIG40CisgICAgICAgIGFkZCAgICAgICAgICAgICByOSwgIHIzLCAgcjMsICBsc2wgIzEgICBAIG4zCisgICAgICAgIGFkZCAgICAgICAgICAgICByOCwgIHI3LCAgcjYgICAgICAgICAgICBAIHRjb3MgKyBuNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsICByMiwgIHI2LCAgbHNyICMxICAgQCBpbiArIG40CisgICAgICAgIGFkZCAgICAgICAgICAgICByOSwgIHIyLCAgcjksICBsc2wgIzEgICBAIGluICsgbjMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHI4LCAgcjgsICAjMTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMCwgcjMsICAjMTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMSwgcjksICAjMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIy0xNgorMToKKyAgICAgICAgdmxkMi4xNiAgICAgICAgIHtkMCxkMX0sICBbcjksIDoxMjhdIQorICAgICAgICB2bGQyLjE2ICAgICAgICAge2QyLGQzfSwgIFtyMTEsOjEyOF0sIHIxMgorICAgICAgICB2bGQyLjE2ICAgICAgICAge2Q0LGQ1fSwgIFtyMywgOjEyOF0hCisgICAgICAgIHZsZDIuMTYgICAgICAgICB7ZDYsZDd9LCAgW3IxMCw6MTI4XSwgcjEyCisgICAgICAgIHZsZDIuMTYgICAgICAgICB7ZDE2LGQxN30sW3I3LCA6MTI4XSEgICBAIGNvcywgc2luCisgICAgICAgIHZsZDIuMTYgICAgICAgICB7ZDE4LGQxOX0sW3I4LCA6MTI4XSwgcjEyCisgICAgICAgIHZyZXY2NC4xNiAgICAgICBxMSwgIHExCisgICAgICAgIHZyZXY2NC4xNiAgICAgICBxMywgIHEzCisgICAgICAgIHZyZXY2NC4xNiAgICAgICBxOSwgIHE5CisgICAgICAgIHZuZWcuczE2ICAgICAgICBkMCwgIGQwCisgICAgICAgIHZuZWcuczE2ICAgICAgICBkMiwgIGQyCisgICAgICAgIHZuZWcuczE2ICAgICAgICBkMTYsIGQxNgorICAgICAgICB2bmVnLnMxNiAgICAgICAgZDE4LCBkMTgKKyAgICAgICAgdmhzdWIuczE2ICAgICAgIGQwLCAgZDAsICBkMyAgICAgICAgICAgIEAgcmUKKyAgICAgICAgdmhzdWIuczE2ICAgICAgIGQ0LCAgZDcsICBkNCAgICAgICAgICAgIEAgaW0KKyAgICAgICAgdmhzdWIuczE2ICAgICAgIGQ2LCAgZDYsICBkNQorICAgICAgICB2aHN1Yi5zMTYgICAgICAgZDIsICBkMiwgIGQxCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTAsIGQwLCAgZDE2CisgICAgICAgIHZtbHNsLnMxNiAgICAgICBxMTAsIGQ0LCAgZDE3CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTEsIGQwLCAgZDE3CisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxMTEsIGQ0LCAgZDE2CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTIsIGQ2LCAgZDE4CisgICAgICAgIHZtbHNsLnMxNiAgICAgICBxMTIsIGQyLCAgZDE5CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTMsIGQ2LCAgZDE5CisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxMTMsIGQyLCAgZDE4CisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkMCwgIHExMCwgIzE1CisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkMSwgIHExMSwgIzE1CisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkMiwgIHExMiwgIzE1CisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkMywgIHExMywgIzE1CisgICAgICAgIHZ6aXAuMTYgICAgICAgICBkMCwgIGQxCisgICAgICAgIHZ6aXAuMTYgICAgICAgICBkMiwgIGQzCisgICAgICAgIGxkcmggICAgICAgICAgICBsciwgIFtyNF0sICMyCisgICAgICAgIGxkcmggICAgICAgICAgICByMiwgIFtccnQsICMtMl0hCisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIFxkc3QsIGxyLCAgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIFxkc3QsIHIyLCAgbHNsICMyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCAgW2xyLDozMl0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sICBbcjIsOjMyXQorICAgICAgICBsZHJoICAgICAgICAgICAgbHIsICBbcjRdLCAjMgorICAgICAgICBsZHJoICAgICAgICAgICAgcjIsICBbXHJ0LCAjLTJdIQorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICBcZHN0LCBsciwgIGxzbCAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICBcZHN0LCByMiwgIGxzbCAjMgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwWzFdfSwgIFtsciw6MzJdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMV19LCAgW3IyLDozMl0KKyAgICAgICAgbGRyaCAgICAgICAgICAgIGxyLCAgW3I0XSwgIzIKKyAgICAgICAgbGRyaCAgICAgICAgICAgIHIyLCAgW1xydCwgIy0yXSEKKyAgICAgICAgYWRkICAgICAgICAgICAgIGxyLCAgXGRzdCwgbHIsICBsc2wgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgXGRzdCwgcjIsICBsc2wgIzIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sICBbbHIsOjMyXQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QzWzBdfSwgIFtyMiw6MzJdCisgICAgICAgIGxkcmggICAgICAgICAgICBsciwgIFtyNF0sICMyCisgICAgICAgIGxkcmggICAgICAgICAgICByMiwgIFtccnQsICMtMl0hCisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIFxkc3QsIGxyLCAgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIFxkc3QsIHIyLCAgbHNsICMyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMV19LCAgW2xyLDozMl0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1sxXX0sICBbcjIsOjMyXQorICAgICAgICBzdWJzICAgICAgICAgICAgcjYsICByNiwgICMzMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKy5lbmRtCisKK2Z1bmN0aW9uIGZmX21kY3RfZml4ZWRfY2FsY19uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3IxLHI0LXIxMSxscn0KKworICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbcjAsICM4XSAgICAgICAgICAgQCByZXZ0YWIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3IwLCAjMTZdICAgICAgICAgIEAgbWRjdF9zaXplOyBuCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMCwgIzI0XSAgICAgICAgICBAIHRjb3MKKworICAgICAgICBwcmVyb3QgICAgICAgICAgcjEsICByNQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIHIwCisgICAgICAgIGJsICAgICAgICAgICAgICBYKGZmX2ZmdF9maXhlZF9jYWxjX25lb24pCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNX0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbcjQsICMxNl0gICAgICAgICAgQCBtZGN0X3NpemU7IG4KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI3LCAgW3I0LCAjMjRdICAgICAgICAgIEAgdGNvcworICAgICAgICBhZGQgICAgICAgICAgICAgcjUsICByNSwgIHI2LCAgbHNyICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHI3LCAgcjYsICBsc3IgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjUsICAjMTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjcsICAjMTYKKzE6CisgICAgICAgIHZsZDIuMTYgICAgICAgICB7ZDQsZDV9LCAgW3I3LDoxMjhdIQorICAgICAgICB2bGQyLjE2ICAgICAgICAge2Q2LGQ3fSwgIFtyMiw6MTI4XSwgcjEyCisgICAgICAgIHZsZDIuMTYgICAgICAgICB7ZDAsZDF9LCAgW3I1LDoxMjhdCisgICAgICAgIHZsZDIuMTYgICAgICAgICB7ZDIsZDN9LCAgW3IxLDoxMjhdCisgICAgICAgIHZyZXY2NC4xNiAgICAgICBxMywgIHEzCisgICAgICAgIHZyZXY2NC4xNiAgICAgICBxMSwgIHExCisgICAgICAgIHZuZWcuczE2ICAgICAgICBxMywgIHEzCisgICAgICAgIHZuZWcuczE2ICAgICAgICBxMiwgIHEyCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTEsIGQyLCAgZDYKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHExMSwgZDMsICBkNworICAgICAgICB2bXVsbC5zMTYgICAgICAgcTgsICBkMCwgIGQ1CisgICAgICAgIHZtbHNsLnMxNiAgICAgICBxOCwgIGQxLCAgZDQKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE5LCAgZDAsICBkNAorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTksICBkMSwgIGQ1CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTAsIGQyLCAgZDcKKyAgICAgICAgdm1sc2wuczE2ICAgICAgIHExMCwgZDMsICBkNgorICAgICAgICB2c2hybi5zMzIgICAgICAgZDAsICBxMTEsICMxNQorICAgICAgICB2c2hybi5zMzIgICAgICAgZDEsICBxOCwgICMxNQorICAgICAgICB2c2hybi5zMzIgICAgICAgZDIsICBxOSwgICMxNQorICAgICAgICB2c2hybi5zMzIgICAgICAgZDMsICBxMTAsICMxNQorICAgICAgICB2cmV2NjQuMTYgICAgICAgcTAsICBxMAorICAgICAgICB2c3QyLjE2ICAgICAgICAge2QyLGQzfSwgIFtyNSw6MTI4XSEKKyAgICAgICAgdnN0Mi4xNiAgICAgICAgIHtkMCxkMX0sICBbcjEsOjEyOF0sIHIxMgorICAgICAgICBzdWJzICAgICAgICAgICAgcjYsICByNiwgICMzMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXIxMSxwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfbWRjdF9maXhlZF9jYWxjd19uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3IxLHI0LXIxMSxscn0KKworICAgICAgICBsZHJkICAgICAgICAgICAgcjQsICByNSwgIFtyMCwgIzhdICAgICAgQCByZXZ0YWIsIHRtcF9idWYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3IwLCAjMTZdICAgICAgICAgIEAgbWRjdF9zaXplOyBuCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMCwgIzI0XSAgICAgICAgICBAIHRjb3MKKworICAgICAgICBwcmVyb3QgICAgICAgICAgcjUsICByMQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIHIwCisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgIHI1CisgICAgICAgIGJsICAgICAgICAgICAgICBYKGZmX2ZmdF9maXhlZF9jYWxjX25lb24pCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyN30KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbcjQsICMxNl0gICAgICAgICAgQCBtZGN0X3NpemU7IG4KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3I0LCAjMjRdICAgICAgICAgIEAgdGNvcworICAgICAgICBhZGQgICAgICAgICAgICAgcjUsICByNSwgIHI2LCAgbHNyICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHI3LCAgcjYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI5LCAgcjksICByNiwgIGxzciAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByNSwgICMxNgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByNywgICMxNgorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByOSwgICMxNgorMToKKyAgICAgICAgdmxkMi4xNiAgICAgICAgIHtkNCxkNX0sICBbcjksOjEyOF0hCisgICAgICAgIHZsZDIuMTYgICAgICAgICB7ZDYsZDd9LCAgW3IyLDoxMjhdLCByMTIKKyAgICAgICAgdmxkMi4xNiAgICAgICAgIHtkMCxkMX0sICBbcjUsOjEyOF0hCisgICAgICAgIHZsZDIuMTYgICAgICAgICB7ZDIsZDN9LCAgW3IzLDoxMjhdLCByMTIKKyAgICAgICAgdnJldjY0LjE2ICAgICAgIHEzLCAgcTMKKyAgICAgICAgdnJldjY0LjE2ICAgICAgIHExLCAgcTEKKyAgICAgICAgdm5lZy5zMTYgICAgICAgIHEzLCAgcTMKKyAgICAgICAgdm5lZy5zMTYgICAgICAgIHEyLCAgcTIKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE4LCAgZDIsICBkNgorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTgsICBkMywgIGQ3CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxOSwgIGQwLCAgZDUKKyAgICAgICAgdm1sc2wuczE2ICAgICAgIHE5LCAgZDEsICBkNAorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTEwLCBkMCwgIGQ0CisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxMTAsIGQxLCAgZDUKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExMSwgZDIsICBkNworICAgICAgICB2bWxzbC5zMTYgICAgICAgcTExLCBkMywgIGQ2CisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxOCwgIHE4CisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxOSwgIHE5CisgICAgICAgIHZzdDIuMzIgICAgICAgICB7cTEwLHExMX0sW3I3LDoxMjhdIQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QxNixkMTh9LFtyMSw6MTI4XSwgcjEyCisgICAgICAgIHZzdDIuMzIgICAgICAgICB7ZDE3LGQxOX0sW3IxLDoxMjhdLCByMTIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHI2LCAgcjYsICAjMzIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTEscGN9CitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbWRjdF9uZW9uLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbWRjdF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5NTJmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tZGN0X25lb24uUwpAQCAtMCwwICsxLDMwMSBAQAorLyoKKyAqIEFSTSBORU9OIG9wdGltaXNlZCBNRENUCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCisjZGVmaW5lIGZmX2ZmdF9jYWxjX25lb24gWChmZl9mZnRfY2FsY19uZW9uKQorCitmdW5jdGlvbiBmZl9pbWRjdF9oYWxmX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjgsbHJ9CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzEKKyAgICAgICAgbGRyICAgICAgICAgICAgIGxyLCAgW3IwLCAjMjBdICAgICAgICAgIEAgbWRjdF9iaXRzCisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtyMCwgIzI0XSAgICAgICAgICBAIHRjb3MKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIzLCAgW3IwLCAjOF0gICAgICAgICAgIEAgcmV2dGFiCisgICAgICAgIGxzbCAgICAgICAgICAgICByMTIsIHIxMiwgbHIgICAgICAgICAgICBAIG4gID0gMSA8PCBuYml0cworICAgICAgICBsc3IgICAgICAgICAgICAgbHIsICByMTIsICMyICAgICAgICAgICAgQCBuNCA9IG4gPj4gMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjcsICByMiwgIHIxMiwgIGxzbCAjMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjLTE2CisgICAgICAgIHN1YiAgICAgICAgICAgICByNywgIHI3LCAgIzE2CisKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtkMTYtZDE3fSxbcjcsOjEyOF0scjEyIEAgZDE2PXgsbjEgZDE3PXgsbjAKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtkMC1kMX0sICBbcjIsOjEyOF0hICAgIEAgZDAgPW0wLHggZDEgPW0xLHgKKyAgICAgICAgdnJldjY0LjMyICAgICAgIGQxNywgZDE3CisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDIsZDN9LCAgW3I0LDoxMjhdISAgICBAIGQyPWMwLGMxIGQzPXMwLHMyCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNiwgIGQxNywgZDIKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQ3LCAgZDAsICBkMgorMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbcjNdLCAjNAorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDQsICBkMCwgIGQzCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNSwgIGQxNywgZDMKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQ0LCAgZDYsICBkNAorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDUsICBkNSwgIGQ3CisgICAgICAgIHV4dGggICAgICAgICAgICByOCwgIHI2LCAgcm9yICMxNgorICAgICAgICB1eHRoICAgICAgICAgICAgcjYsICByNgorICAgICAgICBhZGQgICAgICAgICAgICAgcjgsICByMSwgIHI4LCAgbHNsICMzCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHIxLCAgcjYsICBsc2wgIzMKKyAgICAgICAgYmVxICAgICAgICAgICAgIDFmCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDE2LWQxN30sW3I3LDoxMjhdLHIxMgorICAgICAgICB2bGQyLjMyICAgICAgICAge2QwLWQxfSwgIFtyMiw6MTI4XSEKKyAgICAgICAgdnJldjY0LjMyICAgICAgIGQxNywgZDE3CisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDIsZDN9LCAgW3I0LDoxMjhdISAgICBAIGQyPWMwLGMxIGQzPXMwLHMyCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNiwgIGQxNywgZDIKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQ3LCAgZDAsICBkMgorICAgICAgICB2c3QyLjMyICAgICAgICAge2Q0WzBdLGQ1WzBdfSwgW3I2LDo2NF0KKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkNFsxXSxkNVsxXX0sIFtyOCw6NjRdCisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorMToKKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkNFswXSxkNVswXX0sIFtyNiw6NjRdCisgICAgICAgIHZzdDIuMzIgICAgICAgICB7ZDRbMV0sZDVbMV19LCBbcjgsOjY0XQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIHIwCisgICAgICAgIG1vdiAgICAgICAgICAgICByNiwgIHIxCisgICAgICAgIGJsICAgICAgICAgICAgICBmZl9mZnRfY2FsY19uZW9uCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzEKKyAgICAgICAgbGRyICAgICAgICAgICAgIGxyLCAgW3I0LCAjMjBdICAgICAgICAgIEAgbWRjdF9iaXRzCisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtyNCwgIzI0XSAgICAgICAgICBAIHRjb3MKKyAgICAgICAgbHNsICAgICAgICAgICAgIHIxMiwgcjEyLCBsciAgICAgICAgICAgIEAgbiAgPSAxIDw8IG5iaXRzCisgICAgICAgIGxzciAgICAgICAgICAgICBsciwgIHIxMiwgIzMgICAgICAgICAgICBAIG44ID0gbiA+PiAzCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgcjQsICBsciwgIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgcjYsICByNiwgIGxyLCAgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHI0LCAgIzE2CisgICAgICAgIHN1YiAgICAgICAgICAgICByMywgIHI2LCAgIzE2CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI3LCAgIy0xNgorICAgICAgICBtb3YgICAgICAgICAgICAgcjgsICByNgorICAgICAgICBtb3YgICAgICAgICAgICAgcjAsICByMworCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDAtZDF9LCAgW3IzLDoxMjhdLCByNyBAIGQwID1pMSxyMSBkMSA9aTAscjAKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtkMjAtZDIxfSxbcjYsOjEyOF0hICAgIEAgZDIwPWkyLHIyIGQyMT1pMyxyMworICAgICAgICB2bGQyLjMyICAgICAgICAge2QxNixkMTh9LFtyMSw6MTI4XSwgcjcgQCBkMTY9YzEsYzAgZDE4PXMxLHMwCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgbHIsICBsciwgICMyCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNywgIGQwLCAgZDE4CisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDE3LGQxOX0sW3I0LDoxMjhdISAgICBAIGQxNz1jMixjMyBkMTk9czIsczMKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQ0LCAgZDEsICBkMTgKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQ1LCAgZDIxLCBkMTkKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQ2LCAgZDIwLCBkMTkKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQyMiwgZDEsICBkMTYKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQyMywgZDIxLCBkMTcKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQyNCwgZDAsICBkMTYKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQyNSwgZDIwLCBkMTcKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQ3LCAgZDcsICBkMjIKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQ2LCAgZDYsICBkMjMKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQ0LCAgZDQsICBkMjQKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQ1LCAgZDUsICBkMjUKKyAgICAgICAgYmVxICAgICAgICAgICAgIDFmCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDAtZDF9LCAgW3IzLDoxMjhdLCByNworICAgICAgICB2bGQyLjMyICAgICAgICAge2QyMC1kMjF9LFtyNiw6MTI4XSEKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtkMTYsZDE4fSxbcjEsOjEyOF0sIHI3IEAgZDE2PWMxLGMwIGQxOD1zMSxzMAorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTMsICBxMworICAgICAgICB2c3QyLjMyICAgICAgICAge2Q0LGQ2fSwgIFtyMCw6MTI4XSwgcjcKKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkNSxkN30sICBbcjgsOjEyOF0hCisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorMToKKyAgICAgICAgdnJldjY0LjMyICAgICAgIHEzLCAgcTMKKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkNCxkNn0sICBbcjAsOjEyOF0KKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkNSxkN30sICBbcjgsOjEyOF0KKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI4LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9pbWRjdF9jYWxjX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjYsbHJ9CisKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIzLCAgW3IwLCAjMjBdCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgICMxCisgICAgICAgIG1vdiAgICAgICAgICAgICByNSwgIHIxCisgICAgICAgIGxzbCAgICAgICAgICAgICByNCwgIHI0LCAgcjMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByNAorCisgICAgICAgIGJsICAgICAgICAgICAgICBYKGZmX2ltZGN0X2hhbGZfbmVvbikKKworICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNSwgIHI0LCAgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHI1LCAgcjQsICBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjOAorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMSwgICMxNgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjLTE2CisgICAgICAgIG1vdiAgICAgICAgICAgICByNiwgICMtOAorICAgICAgICB2bW92LmkzMiAgICAgICAgZDMwLCAjMTw8MzEKKzE6CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDAtZDF9LCAgW3IyLDoxMjhdLCByMworICAgICAgICBwbGQgICAgICAgICAgICAgW3IwLCAjLTE2XQorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTAsICBxMAorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyLWQzfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmVvciAgICAgICAgICAgIGQ0LCAgZDEsICBkMzAKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMiwgIy0xNl0KKyAgICAgICAgdnJldjY0LjMyICAgICAgIHExLCAgcTEKKyAgICAgICAgdmVvciAgICAgICAgICAgIGQ1LCAgZDAsICBkMzAKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMn0sICAgICBbcjAsOjY0XSwgcjYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM30sICAgICBbcjAsOjY0XSwgcjYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNC1kNX0sICBbcjUsOjEyOF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByNCwgIHI0LCAgIzE2CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjYscGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX21kY3RfY2FsY19uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMCxscn0KKworICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMQorICAgICAgICBsZHIgICAgICAgICAgICAgbHIsICBbcjAsICMyMF0gICAgICAgICAgQCBtZGN0X2JpdHMKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3IwLCAjMjRdICAgICAgICAgIEAgdGNvcworICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbcjAsICM4XSAgICAgICAgICAgQCByZXZ0YWIKKyAgICAgICAgbHNsICAgICAgICAgICAgIGxyLCAgcjEyLCBsciAgICAgICAgICAgIEAgbiAgPSAxIDw8IG5iaXRzCisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHIyLCAgbHIgICAgICAgICAgICBAIGluNHUKKyAgICAgICAgc3ViICAgICAgICAgICAgIHI5LCAgcjcsICAjMTYgICAgICAgICAgIEAgaW40ZAorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByNywgIGxyLCAgbHNsICMxICAgQCBpbjN1CisgICAgICAgIGFkZCAgICAgICAgICAgICByOCwgIHI5LCAgbHIsICBsc2wgIzEgICBAIGluM2QKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCAgcjQsICBsciwgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjUsICByNSwgICMxNgorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgICM0CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMtMTYKKworICAgICAgICB2bGQyLjMyICAgICAgICAge2QxNixkMTh9LFtyOSw6MTI4XSxyMTIgQCBpbjB1MCxpbjB1MSBpbjRkMSxpbjRkMAorICAgICAgICB2bGQyLjMyICAgICAgICAge2QxNyxkMTl9LFtyOCw6MTI4XSxyMTIgQCBpbjJ1MCxpbjJ1MSBpbjNkMSxpbjNkMAorICAgICAgICB2bGQyLjMyICAgICAgICAge2QwLCBkMn0sIFtyNyw6MTI4XSEgICAgQCBpbjR1MCxpbjR1MSBpbjJkMSxpbjJkMAorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTksICBxOSAgICAgICAgICAgICAgICAgQCBpbjRkMCxpbjRkMSBpbjNkMCxpbjNkMQorICAgICAgICB2bGQyLjMyICAgICAgICAge2QxLCBkM30sIFtyMiw6MTI4XSEgICAgQCBpbjN1MCxpbjN1MSBpbjFkMSxpbjFkMAorICAgICAgICB2c3ViLmYzMiAgICAgICAgZDAsICBkMTgsIGQwICAgICAgICAgICAgQCBpbjRkLWluNHUgICAgICBJCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDIwLGQyMX0sW3I0LDoxMjhdISAgICBAIGMwLGMxIHMwLHMxCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxMSwgIHExICAgICAgICAgICAgICAgICBAIGluMmQwLGluMmQxIGluMWQwLGluMWQxCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDMwLGQzMX0sW3I1LDoxMjhdLHIxMiBAIGMyLGMzIHMyLHMzCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMSwgIGQxLCAgZDE5ICAgICAgICAgICBAIGluM3UraW4zZCAgICAgLVIKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQxNiwgZDE2LCBkMiAgICAgICAgICAgIEAgaW4wdS1pbjJkICAgICAgUgorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDE3LCBkMTcsIGQzICAgICAgICAgICAgQCBpbjJ1K2luMWQgICAgIC1JCisxOgorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDcsICBkMCwgIGQyMSAgICAgICAgICAgQCAgSSpzCitBICAgICAgIGxkciAgICAgICAgICAgICByMTAsIFtyMywgbHIsIGxzciAjMV0KK1QgICAgICAgbHNyICAgICAgICAgICAgIHIxMCwgbHIsICAjMQorVCAgICAgICBsZHIgICAgICAgICAgICAgcjEwLCBbcjMsIHIxMF0KKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQ2LCAgZDEsICBkMjAgICAgICAgICAgIEAgLVIqYworICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbcjMsICM0XSEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQ0LCAgZDEsICBkMjEgICAgICAgICAgIEAgLVIqcworICAgICAgICB2bXVsLmYzMiAgICAgICAgZDUsICBkMCwgIGQyMCAgICAgICAgICAgQCAgSSpjCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMjQsIGQxNiwgZDMwICAgICAgICAgICBAICBSKmMKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQyNSwgZDE3LCBkMzEgICAgICAgICAgIEAgLUkqcworICAgICAgICB2bXVsLmYzMiAgICAgICAgZDIyLCBkMTYsIGQzMSAgICAgICAgICAgQCAgUipzCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMjMsIGQxNywgZDMwICAgICAgICAgICBAICBJKmMKKyAgICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjMTYKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQ2LCAgZDYsICBkNyAgICAgICAgICAgIEAgLVIqYy1JKnMKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQ3LCAgZDQsICBkNSAgICAgICAgICAgIEAgLVIqcytJKmMKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQyNCwgZDI1LCBkMjQgICAgICAgICAgIEAgSSpzLVIqYworICAgICAgICB2YWRkLmYzMiAgICAgICAgZDI1LCBkMjIsIGQyMyAgICAgICAgICAgQCBSKnMtSSpjCisgICAgICAgIGJlcSAgICAgICAgICAgICAxZgorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjLTE2CisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDE2LGQxOH0sW3I5LDoxMjhdLHIxMiBAIGluMHUwLGluMHUxIGluNGQxLGluNGQwCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDE3LGQxOX0sW3I4LDoxMjhdLHIxMiBAIGluMnUwLGluMnUxIGluM2QxLGluM2QwCisgICAgICAgIHZuZWcuZjMyICAgICAgICBkNywgIGQ3ICAgICAgICAgICAgICAgICBAICBSKnMtSSpjCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDAsIGQyfSwgW3I3LDoxMjhdISAgICBAIGluNHUwLGluNHUxIGluMmQxLGluMmQwCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxOSwgIHE5ICAgICAgICAgICAgICAgICBAIGluNGQwLGluNGQxIGluM2QwLGluM2QxCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDEsIGQzfSwgW3IyLDoxMjhdISAgICBAIGluM3UwLGluM3UxIGluMWQxLGluMWQwCisgICAgICAgIHZzdWIuZjMyICAgICAgICBkMCwgIGQxOCwgZDAgICAgICAgICAgICBAIGluNGQtaW40dSAgICAgIEkKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtkMjAsZDIxfSxbcjQsOjEyOF0hICAgIEAgYzAsYzEgczAsczEKKyAgICAgICAgdnJldjY0LjMyICAgICAgIHExLCAgcTEgICAgICAgICAgICAgICAgIEAgaW4yZDAsaW4yZDEgaW4xZDAsaW4xZDEKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtkMzAsZDMxfSxbcjUsOjEyOF0scjEyIEAgYzIsYzMgczIsczMKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQxLCAgZDEsICBkMTkgICAgICAgICAgIEAgaW4zdStpbjNkICAgICAtUgorICAgICAgICB2c3ViLmYzMiAgICAgICAgZDE2LCBkMTYsIGQyICAgICAgICAgICAgQCBpbjB1LWluMmQgICAgICBSCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMTcsIGQxNywgZDMgICAgICAgICAgICBAIGluMnUraW4xZCAgICAgLUkKKyAgICAgICAgdXh0aCAgICAgICAgICAgIHIxMiwgcjYsICByb3IgIzE2CisgICAgICAgIHV4dGggICAgICAgICAgICByNiwgIHI2CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxLCAgcjEyLCBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjEsICByNiwgIGxzbCAjMworICAgICAgICB2c3QyLjMyICAgICAgICAge2Q2WzBdLGQ3WzBdfSwgW3I2LDo2NF0KKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkNlsxXSxkN1sxXX0sIFtyMTIsOjY0XQorICAgICAgICB1eHRoICAgICAgICAgICAgcjYsICByMTAsIHJvciAjMTYKKyAgICAgICAgdXh0aCAgICAgICAgICAgIHIxMCwgcjEwCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiAsIHIxLCAgcjYsICBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMCwgcjEsICByMTAsIGxzbCAjMworICAgICAgICB2c3QyLjMyICAgICAgICAge2QyNFswXSxkMjVbMF19LFtyMTAsOjY0XQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QyNFsxXSxkMjVbMV19LFtyNiw6NjRdCisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorMToKKyAgICAgICAgdm5lZy5mMzIgICAgICAgIGQ3LCAgZDcgICAgICAgICAgICAgICAgIEAgIFIqcy1JKmMKKyAgICAgICAgdXh0aCAgICAgICAgICAgIHIxMiwgcjYsICByb3IgIzE2CisgICAgICAgIHV4dGggICAgICAgICAgICByNiwgIHI2CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxLCAgcjEyLCBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjEsICByNiwgIGxzbCAjMworICAgICAgICB2c3QyLjMyICAgICAgICAge2Q2WzBdLGQ3WzBdfSwgW3I2LDo2NF0KKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkNlsxXSxkN1sxXX0sIFtyMTIsOjY0XQorICAgICAgICB1eHRoICAgICAgICAgICAgcjYsICByMTAsIHJvciAjMTYKKyAgICAgICAgdXh0aCAgICAgICAgICAgIHIxMCwgcjEwCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiAsIHIxLCAgcjYsICBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMCwgcjEsICByMTAsIGxzbCAjMworICAgICAgICB2c3QyLjMyICAgICAgICAge2QyNFswXSxkMjVbMF19LFtyMTAsOjY0XQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QyNFsxXSxkMjVbMV19LFtyNiw6NjRdCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI0LCAgcjAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI2LCAgcjEKKyAgICAgICAgYmwgICAgICAgICAgICAgIGZmX2ZmdF9jYWxjX25lb24KKworICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMQorICAgICAgICBsZHIgICAgICAgICAgICAgbHIsICBbcjQsICMyMF0gICAgICAgICAgQCBtZGN0X2JpdHMKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3I0LCAjMjRdICAgICAgICAgIEAgdGNvcworICAgICAgICBsc2wgICAgICAgICAgICAgcjEyLCByMTIsIGxyICAgICAgICAgICAgQCBuICA9IDEgPDwgbmJpdHMKKyAgICAgICAgbHNyICAgICAgICAgICAgIGxyLCAgcjEyLCAjMyAgICAgICAgICAgIEAgbjggPSBuID4+IDMKKworICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICByNCwgIGxyLCAgbHNsICMzCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHI2LCAgbHIsICBsc2wgIzMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjQsICAjMTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIzLCAgcjYsICAjMTYKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjcsICAjLTE2CisgICAgICAgIG1vdiAgICAgICAgICAgICByOCwgIHI2CisgICAgICAgIG1vdiAgICAgICAgICAgICByMCwgIHIzCisKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtkMC1kMX0sICBbcjMsOjEyOF0sIHI3IEAgZDAgPXIxLGkxIGQxID1yMCxpMAorICAgICAgICB2bGQyLjMyICAgICAgICAge2QyMC1kMjF9LFtyNiw6MTI4XSEgICAgQCBkMjA9cjIsaTIgZDIxPXIzLGkzCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDE2LGQxOH0sW3IxLDoxMjhdLCByNyBAIGMxLGMwIHMxLHMwCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgbHIsICBsciwgICMyCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNywgIGQwLCAgZDE4ICAgICAgICAgICBAIHIxKnMxLHIwKnMwCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDE3LGQxOX0sW3I0LDoxMjhdISAgICBAIGMyLGMzIHMyLHMzCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNCwgIGQxLCAgZDE4ICAgICAgICAgICBAIGkxKnMxLGkwKnMwCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNSwgIGQyMSwgZDE5ICAgICAgICAgICBAIGkyKnMyLGkzKnMzCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkNiwgIGQyMCwgZDE5ICAgICAgICAgICBAIHIyKnMyLHIzKnMzCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMjQsIGQwLCAgZDE2ICAgICAgICAgICBAIHIxKmMxLHIwKmMwCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMjUsIGQyMCwgZDE3ICAgICAgICAgICBAIHIyKmMyLHIzKmMzCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMjIsIGQyMSwgZDE3ICAgICAgICAgICBAIGkyKmMyLGkzKmMzCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMjMsIGQxLCAgZDE2ICAgICAgICAgICBAIGkxKmMxLGkwKmMwCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkNCwgIGQ0LCAgZDI0ICAgICAgICAgICBAIGkxKnMxK3IxKmMxLGkwKnMwK3IwKmMwCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkNSwgIGQ1LCAgZDI1ICAgICAgICAgICBAIGkyKnMyK3IyKmMyLGkzKnMzK3IzKmMzCisgICAgICAgIHZzdWIuZjMyICAgICAgICBkNiwgIGQyMiwgZDYgICAgICAgICAgICBAIGkyKmMyLXIyKnMyLGkzKmMzLXIzKnMzCisgICAgICAgIHZzdWIuZjMyICAgICAgICBkNywgIGQyMywgZDcgICAgICAgICAgICBAIGkxKmMxLXIxKnMxLGkwKmMwLXIwKnMwCisgICAgICAgIHZuZWcuZjMyICAgICAgICBxMiwgIHEyCisgICAgICAgIGJlcSAgICAgICAgICAgICAxZgorICAgICAgICB2bGQyLjMyICAgICAgICAge2QwLWQxfSwgIFtyMyw6MTI4XSwgcjcKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtkMjAtZDIxfSxbcjYsOjEyOF0hCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDE2LGQxOH0sW3IxLDoxMjhdLCByNyBAIGMxLGMwIHMxLHMwCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxMywgIHEzCisgICAgICAgIHZzdDIuMzIgICAgICAgICB7ZDQsZDZ9LCAgW3IwLDoxMjhdLCByNworICAgICAgICB2c3QyLjMyICAgICAgICAge2Q1LGQ3fSwgIFtyOCw6MTI4XSEKKyAgICAgICAgYiAgICAgICAgICAgICAgIDFiCisxOgorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTMsICBxMworICAgICAgICB2c3QyLjMyICAgICAgICAge2Q0LGQ2fSwgIFtyMCw6MTI4XQorICAgICAgICB2c3QyLjMyICAgICAgICAge2Q1LGQ3fSwgIFtyOCw6MTI4XQorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjEwLHBjfQorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21kY3RfdmZwLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbWRjdF92ZnAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Y2ZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21kY3RfdmZwLlMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUklTQyBPUyBPcGVuIEx0ZAorICogQXV0aG9yOiBCZW4gQXZpc29uIDxiYXZpc29uQHJpc2Nvc29wZW4ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworQ09OVEVYVCAucmVxICAgIGExCitPUklHT1VUIC5yZXEgICAgYTIKK0lOICAgICAgLnJlcSAgICBhMworT1VUICAgICAucmVxICAgIHYxCitSRVZUQUIgIC5yZXEgICAgdjIKK1RDT1MgICAgLnJlcSAgICB2MworVFNJTiAgICAucmVxICAgIHY0CitPTERGUFNDUiAucmVxICAgdjUKK0owICAgICAgLnJlcSAgICBhMgorSjEgICAgICAucmVxICAgIGE0CitKMiAgICAgIC5yZXEgICAgaXAKK0ozICAgICAgLnJlcSAgICBscgorUkVWVEFCX0hJIC5yZXEgIHY1CitJTl9ISSAgIC5yZXEgICAgdjYKK09VVF9ISSAgLnJlcSAgICB2NgorVENPU19ISSAucmVxICAgIHNsCitUU0lOX0hJIC5yZXEgICAgZnAKKworLm1hY3JvIHByZXJvdGF0aW9uX2lubmVybG9vcAorIC5zZXQgdHJpZ19sbywgaworIC5zZXQgdHJpZ19oaSwgbjQgLSBrIC0gMgorIC5zZXQgaW5fbG8sIHRyaWdfbG8gKiAyCisgLnNldCBpbl9oaSwgdHJpZ19oaSAqIDIKKyAgICAgICAgdmxkciAgICBkOCwgW1RDT1MsICN0cmlnX2xvKjRdICAgICAgICAgIEAgczE2LHMxNworICAgICAgICB2bGRyICAgIGQ5LCBbVENPUywgI3RyaWdfaGkqNF0gICAgICAgICAgQCBzMTgsczE5CisgICAgICAgIHZsZHIgICAgczAsIFtJTiwgI2luX2hpKjQgKyAxMl0KKyAgICAgICAgdmxkciAgICBzMSwgW0lOLCAjaW5faGkqNCArIDRdCisgICAgICAgIHZsZHIgICAgczIsIFtJTiwgI2luX2xvKjQgKyAxMl0KKyAgICAgICAgdmxkciAgICBzMywgW0lOLCAjaW5fbG8qNCArIDRdCisgICAgICAgIHZtdWwuZiAgczgsIHMwLCBzMTYgICAgICAgICAgICAgICAgICAgICBAIHZlY3RvciBvcGVyYXRpb24KKyAgICAgICAgdmxkciAgICBkMTAsIFtUU0lOLCAjdHJpZ19sbyo0XSAgICAgICAgIEAgczIwLHMyMQorICAgICAgICB2bGRyICAgIGQxMSwgW1RTSU4sICN0cmlnX2hpKjRdICAgICAgICAgQCBzMjIsczIzCisgICAgICAgIHZsZHIgICAgczQsIFtJTiwgI2luX2xvKjRdCisgICAgICAgIHZsZHIgICAgczUsIFtJTiwgI2luX2xvKjQgKyA4XQorICAgICAgICB2bGRyICAgIHM2LCBbSU4sICNpbl9oaSo0XQorICAgICAgICB2bGRyICAgIHM3LCBbSU4sICNpbl9oaSo0ICsgOF0KKyAgICAgICAgbGRyICAgICBKMCwgW1JFVlRBQiwgI3RyaWdfbG8qMl0KKyAgICAgICAgdm11bC5mICBzMTIsIHMwLCBzMjAgICAgICAgICAgICAgICAgICAgIEAgdmVjdG9yIG9wZXJhdGlvbgorICAgICAgICBsZHIgICAgIEoyLCBbUkVWVEFCLCAjdHJpZ19oaSoyXQorICAgICAgICBtb3YgICAgIEoxLCBKMCwgbHNyICMxNgorICAgICAgICBhbmQgICAgIEowLCBKMCwgIzI1NSAgICAgICAgICAgICAgICAgICAgQCBoYWxmd29yZCB2YWx1ZSB3aWxsIGJlIDwgbjQKKyAgICAgICAgdm1scy5mICBzOCwgczQsIHMyMCAgICAgICAgICAgICAgICAgICAgIEAgdmVjdG9yIG9wZXJhdGlvbgorICAgICAgICBtb3YgICAgIEozLCBKMiwgbHNyICMxNgorICAgICAgICBhbmQgICAgIEoyLCBKMiwgIzI1NSAgICAgICAgICAgICAgICAgICAgQCBoYWxmd29yZCB2YWx1ZSB3aWxsIGJlIDwgbjQKKyAgICAgICAgYWRkICAgICBKMCwgT1VULCBKMCwgbHNsICMzCisgICAgICAgIHZtbGEuZiAgczEyLCBzNCwgczE2ICAgICAgICAgICAgICAgICAgICBAIHZlY3RvciBvcGVyYXRpb24KKyAgICAgICAgYWRkICAgICBKMSwgT1VULCBKMSwgbHNsICMzCisgICAgICAgIGFkZCAgICAgSjIsIE9VVCwgSjIsIGxzbCAjMworICAgICAgICBhZGQgICAgIEozLCBPVVQsIEozLCBsc2wgIzMKKyAgICAgICAgdnN0ciAgICBzOCwgW0owXQorICAgICAgICB2c3RyICAgIHM5LCBbSjFdCisgICAgICAgIHZzdHIgICAgczEwLCBbSjJdCisgICAgICAgIHZzdHIgICAgczExLCBbSjNdCisgICAgICAgIHZzdHIgICAgczEyLCBbSjAsICM0XQorICAgICAgICB2c3RyICAgIHMxMywgW0oxLCAjNF0KKyAgICAgICAgdnN0ciAgICBzMTQsIFtKMiwgIzRdCisgICAgICAgIHZzdHIgICAgczE1LCBbSjMsICM0XQorIC5zZXQgaywgayArIDIKKy5lbmRtCisKKy5tYWNybyBwcmVyb3RhdGlvbl9pbm5lcmxvb3Bfcm9sbGVkCisgICAgICAgIHZsZG1pYSAgVENPUyEsIHtzMTYsczE3fQorICAgICAgICB2bGRtZGIgIFRDT1NfSEkhLCB7czE4LHMxOX0KKyAgICAgICAgdmxkciAgICBzMCwgW0lOX0hJLCAjLTRdCisgICAgICAgIHZsZHIgICAgczEsIFtJTl9ISSwgIy0xMl0KKyAgICAgICAgdmxkciAgICBzMiwgW0lOLCAjMTJdCisgICAgICAgIHZsZHIgICAgczMsIFtJTiwgIzRdCisgICAgICAgIHZtdWwuZiAgczgsIHMwLCBzMTYgICAgICAgICAgICAgICAgICAgICBAIHZlY3RvciBvcGVyYXRpb24KKyAgICAgICAgdmxkbWlhICBUU0lOISwge3MyMCxzMjF9CisgICAgICAgIHZsZG1kYiAgVFNJTl9ISSEsIHtzMjIsczIzfQorICAgICAgICB2bGRyICAgIHM0LCBbSU5dCisgICAgICAgIHZsZHIgICAgczUsIFtJTiwgIzhdCisgICAgICAgIHZsZHIgICAgczYsIFtJTl9ISSwgIy0xNl0KKyAgICAgICAgdmxkciAgICBzNywgW0lOX0hJLCAjLThdCisgICAgICAgIHZtdWwuZiAgczEyLCBzMCwgczIwICAgICAgICAgICAgICAgICAgICBAIHZlY3RvciBvcGVyYXRpb24KKyAgICAgICAgYWRkICAgICBJTiwgSU4sICMxNgorICAgICAgICBzdWIgICAgIElOX0hJLCBJTl9ISSwgIzE2CisgICAgICAgIGxkcmggICAgSjAsIFtSRVZUQUJdLCAjMgorICAgICAgICBsZHJoICAgIEoxLCBbUkVWVEFCXSwgIzIKKyAgICAgICAgdm1scy5mICBzOCwgczQsIHMyMCAgICAgICAgICAgICAgICAgICAgIEAgdmVjdG9yIG9wZXJhdGlvbgorICAgICAgICBsZHJoICAgIEozLCBbUkVWVEFCX0hJLCAjLTJdIQorICAgICAgICBsZHJoICAgIEoyLCBbUkVWVEFCX0hJLCAjLTJdIQorICAgICAgICBhZGQgICAgIEowLCBPVVQsIEowLCBsc2wgIzMKKyAgICAgICAgdm1sYS5mICBzMTIsIHM0LCBzMTYgICAgICAgICAgICAgICAgICAgIEAgdmVjdG9yIG9wZXJhdGlvbgorICAgICAgICBhZGQgICAgIEoxLCBPVVQsIEoxLCBsc2wgIzMKKyAgICAgICAgYWRkICAgICBKMiwgT1VULCBKMiwgbHNsICMzCisgICAgICAgIGFkZCAgICAgSjMsIE9VVCwgSjMsIGxzbCAjMworICAgICAgICB2c3RyICAgIHM4LCBbSjBdCisgICAgICAgIHZzdHIgICAgczksIFtKMV0KKyAgICAgICAgdnN0ciAgICBzMTAsIFtKMl0KKyAgICAgICAgdnN0ciAgICBzMTEsIFtKM10KKyAgICAgICAgdnN0ciAgICBzMTIsIFtKMCwgIzRdCisgICAgICAgIHZzdHIgICAgczEzLCBbSjEsICM0XQorICAgICAgICB2c3RyICAgIHMxNCwgW0oyLCAjNF0KKyAgICAgICAgdnN0ciAgICBzMTUsIFtKMywgIzRdCisuZW5kbQorCisubWFjcm8gcG9zdHJvdGF0aW9uX2lubmVybG9vcCB0YWlsLCBoZWFkCisgLnNldCB0cmlnX2xvX2hlYWQsIG44IC0gayAtIDIKKyAuc2V0IHRyaWdfaGlfaGVhZCwgbjggKyBrCisgLnNldCBvdXRfbG9faGVhZCwgdHJpZ19sb19oZWFkICogMgorIC5zZXQgb3V0X2hpX2hlYWQsIHRyaWdfaGlfaGVhZCAqIDIKKyAuc2V0IHRyaWdfbG9fdGFpbCwgbjggLSAoayAtIDIpIC0gMgorIC5zZXQgdHJpZ19oaV90YWlsLCBuOCArIChrIC0gMikKKyAuc2V0IG91dF9sb190YWlsLCB0cmlnX2xvX3RhaWwgKiAyCisgLnNldCBvdXRfaGlfdGFpbCwgdHJpZ19oaV90YWlsICogMgorIC5pZiAoayAmIDIpID09IDAKKyAgVENPU19EMF9IRUFEIC5yZXEgZDEwIEAgczIwLHMyMQorICBUQ09TX0QxX0hFQUQgLnJlcSBkMTEgQCBzMjIsczIzCisgIFRDT1NfUzBfVEFJTCAucmVxIHMyNAorIC5lbHNlCisgIFRDT1NfRDBfSEVBRCAucmVxIGQxMiBAIHMyNCxzMjUKKyAgVENPU19EMV9IRUFEIC5yZXEgZDEzIEAgczI2LHMyNworICBUQ09TX1MwX1RBSUwgLnJlcSBzMjAKKyAuZW5kaWYKKyAuaWZuYyAiXHRhaWwiLCIiCisgICAgICAgIHZtbHMuZiAgczgsIHMwLCBUQ09TX1MwX1RBSUwgICAgICAgIEAgdmVjdG9yIG9wZXJhdGlvbgorIC5lbmRpZgorIC5pZm5jICJcaGVhZCIsIiIKKyAgICAgICAgdmxkciAgICBkOCwgW1RTSU4sICN0cmlnX2xvX2hlYWQqNF0gQCBzMTYsczE3CisgICAgICAgIHZsZHIgICAgZDksIFtUU0lOLCAjdHJpZ19oaV9oZWFkKjRdIEAgczE4LHMxOQorICAgICAgICB2bGRyICAgIFRDT1NfRDBfSEVBRCwgW1RDT1MsICN0cmlnX2xvX2hlYWQqNF0KKyAuZW5kaWYKKyAuaWZuYyAiXHRhaWwiLCIiCisgICAgICAgIHZtbGEuZiAgczEyLCBzNCwgVENPU19TMF9UQUlMICAgICAgIEAgdmVjdG9yIG9wZXJhdGlvbgorIC5lbmRpZgorIC5pZm5jICJcaGVhZCIsIiIKKyAgICAgICAgdmxkciAgICBzMCwgW09VVCwgI291dF9sb19oZWFkKjRdCisgICAgICAgIHZsZHIgICAgczEsIFtPVVQsICNvdXRfbG9faGVhZCo0ICsgOF0KKyAgICAgICAgdmxkciAgICBzMiwgW09VVCwgI291dF9oaV9oZWFkKjRdCisgICAgICAgIHZsZHIgICAgczMsIFtPVVQsICNvdXRfaGlfaGVhZCo0ICsgOF0KKyAgICAgICAgdmxkciAgICBzNCwgW09VVCwgI291dF9sb19oZWFkKjQgKyA0XQorICAgICAgICB2bGRyICAgIHM1LCBbT1VULCAjb3V0X2xvX2hlYWQqNCArIDEyXQorICAgICAgICB2bGRyICAgIHM2LCBbT1VULCAjb3V0X2hpX2hlYWQqNCArIDRdCisgICAgICAgIHZsZHIgICAgczcsIFtPVVQsICNvdXRfaGlfaGVhZCo0ICsgMTJdCisgLmVuZGlmCisgLmlmbmMgIlx0YWlsIiwiIgorICAgICAgICB2c3RyICAgIHM4LCBbT1VULCAjb3V0X2xvX3RhaWwqNF0KKyAgICAgICAgdnN0ciAgICBzOSwgW09VVCwgI291dF9sb190YWlsKjQgKyA4XQorICAgICAgICB2c3RyICAgIHMxMCwgW09VVCwgI291dF9oaV90YWlsKjRdCisgICAgICAgIHZzdHIgICAgczExLCBbT1VULCAjb3V0X2hpX3RhaWwqNCArIDhdCisgLmVuZGlmCisgLmlmbmMgIlxoZWFkIiwiIgorICAgICAgICB2bXVsLmYgIHM4LCBzNCwgczE2ICAgICAgICAgICAgICAgICBAIHZlY3RvciBvcGVyYXRpb24KKyAuZW5kaWYKKyAuaWZuYyAiXHRhaWwiLCIiCisgICAgICAgIHZzdHIgICAgczEyLCBbT1VULCAjb3V0X2hpX3RhaWwqNCArIDEyXQorICAgICAgICB2c3RyICAgIHMxMywgW09VVCwgI291dF9oaV90YWlsKjQgKyA0XQorICAgICAgICB2c3RyICAgIHMxNCwgW09VVCwgI291dF9sb190YWlsKjQgKyAxMl0KKyAgICAgICAgdnN0ciAgICBzMTUsIFtPVVQsICNvdXRfbG9fdGFpbCo0ICsgNF0KKyAuZW5kaWYKKyAuaWZuYyAiXGhlYWQiLCIiCisgICAgICAgIHZtdWwuZiAgczEyLCBzMCwgczE2ICAgICAgICAgICAgICAgIEAgdmVjdG9yIG9wZXJhdGlvbgorICAgICAgICB2bGRyICAgIFRDT1NfRDFfSEVBRCwgW1RDT1MsICN0cmlnX2hpX2hlYWQqNF0KKyAuZW5kaWYKKyAudW5yZXEgVENPU19EMF9IRUFECisgLnVucmVxIFRDT1NfRDFfSEVBRAorIC51bnJlcSBUQ09TX1MwX1RBSUwKKyAuaWZuYyAiXGhlYWQiLCIiCisgIC5zZXQgaywgayArIDIKKyAuZW5kaWYKKy5lbmRtCisKKy5tYWNybyBwb3N0cm90YXRpb25faW5uZXJsb29wX3JvbGxlZCB0YWlsLCBoZWFkLCB0Y29zX3MwX2hlYWQsIHRjb3NfczFfaGVhZCwgdGNvc19zMl9oZWFkLCB0Y29zX3MzX2hlYWQsIHRjb3NfczBfdGFpbCwgb3V0X29mZnNldF9oZWFkLCBvdXRfb2Zmc2V0X3RhaWwKKyAuaWZuYyAiXHRhaWwiLCIiCisgICAgICAgIHZtbHMuZiAgczgsIHMwLCBcdGNvc19zMF90YWlsICAgICAgIEAgdmVjdG9yIG9wZXJhdGlvbgorIC5lbmRpZgorIC5pZm5jICJcaGVhZCIsIiIKKyAgICAgICAgdmxkbWlhICBUU0lOISwge3MxNixzMTd9CisgICAgICAgIHZsZG1kYiAgVFNJTl9ISSEsIHtzMTgsczE5fQorICAgICAgICB2bGRtaWEgIFRDT1MhLCB7XHRjb3NfczBfaGVhZCxcdGNvc19zMV9oZWFkfQorIC5lbmRpZgorIC5pZm5jICJcdGFpbCIsIiIKKyAgICAgICAgdm1sYS5mICBzMTIsIHM0LCBcdGNvc19zMF90YWlsICAgICAgQCB2ZWN0b3Igb3BlcmF0aW9uCisgLmVuZGlmCisgLmlmbmMgIlxoZWFkIiwiIgorICAgICAgICB2bGRyICAgIHMwLCBbT1VULCAjK1xvdXRfb2Zmc2V0X2hlYWQrMF0KKyAgICAgICAgdmxkciAgICBzMSwgW09VVCwgIytcb3V0X29mZnNldF9oZWFkKzhdCisgICAgICAgIHZsZHIgICAgczIsIFtPVVRfSEksICMtXG91dF9vZmZzZXRfaGVhZC0xNl0KKyAgICAgICAgdmxkciAgICBzMywgW09VVF9ISSwgIy1cb3V0X29mZnNldF9oZWFkLThdCisgICAgICAgIHZsZHIgICAgczQsIFtPVVQsICMrXG91dF9vZmZzZXRfaGVhZCs0XQorICAgICAgICB2bGRyICAgIHM1LCBbT1VULCAjK1xvdXRfb2Zmc2V0X2hlYWQrMTJdCisgICAgICAgIHZsZHIgICAgczYsIFtPVVRfSEksICMtXG91dF9vZmZzZXRfaGVhZC0xMl0KKyAgICAgICAgdmxkciAgICBzNywgW09VVF9ISSwgIy1cb3V0X29mZnNldF9oZWFkLTRdCisgLmVuZGlmCisgLmlmbmMgIlx0YWlsIiwiIgorICAgICAgICB2c3RyICAgIHM4LCBbT1VULCAjK1xvdXRfb2Zmc2V0X3RhaWwrMF0KKyAgICAgICAgdnN0ciAgICBzOSwgW09VVCwgIytcb3V0X29mZnNldF90YWlsKzhdCisgICAgICAgIHZzdHIgICAgczEwLCBbT1VUX0hJLCAjLVxvdXRfb2Zmc2V0X3RhaWwtMTZdCisgICAgICAgIHZzdHIgICAgczExLCBbT1VUX0hJLCAjLVxvdXRfb2Zmc2V0X3RhaWwtOF0KKyAuZW5kaWYKKyAuaWZuYyAiXGhlYWQiLCIiCisgICAgICAgIHZtdWwuZiAgczgsIHM0LCBzMTYgICAgICAgICAgICAgICAgIEAgdmVjdG9yIG9wZXJhdGlvbgorIC5lbmRpZgorIC5pZm5jICJcdGFpbCIsIiIKKyAgICAgICAgdnN0ciAgICBzMTIsIFtPVVRfSEksICMtXG91dF9vZmZzZXRfdGFpbC00XQorICAgICAgICB2c3RyICAgIHMxMywgW09VVF9ISSwgIy1cb3V0X29mZnNldF90YWlsLTEyXQorICAgICAgICB2c3RyICAgIHMxNCwgW09VVCwgIytcb3V0X29mZnNldF90YWlsKzEyXQorICAgICAgICB2c3RyICAgIHMxNSwgW09VVCwgIytcb3V0X29mZnNldF90YWlsKzRdCisgLmVuZGlmCisgLmlmbmMgIlxoZWFkIiwiIgorICAgICAgICB2bXVsLmYgIHMxMiwgczAsIHMxNiAgICAgICAgICAgICAgICBAIHZlY3RvciBvcGVyYXRpb24KKyAgICAgICAgdmxkbWRiICBUQ09TX0hJISwge1x0Y29zX3MyX2hlYWQsXHRjb3NfczNfaGVhZH0KKyAuZW5kaWYKKy5lbmRtCisKKworLyogdm9pZCBmZl9pbWRjdF9oYWxmX3ZmcChGRlRDb250ZXh0ICpzLAorICogICAgICAgICAgICAgICAgICAgICAgICBGRlRTYW1wbGUgKm91dHB1dCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkZUU2FtcGxlICppbnB1dCkKKyAqLworZnVuY3Rpb24gZmZfaW1kY3RfaGFsZl92ZnAsIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgaXAsIFtDT05URVhULCAjNSo0XSAgICAgICAgIEAgbWRjdF9iaXRzCisgICAgICAgIHRlcSAgICAgaXAsICM2CisgICAgICAgIGJuZSAgICAgMTBmCisKKyAuc2V0IG4sIDE8PDYKKyAuc2V0IG4yLCBuLzIKKyAuc2V0IG40LCBuLzQKKyAuc2V0IG44LCBuLzgKKworICAgICAgICBwdXNoICAgIHt2MS12NSxscn0KKyAgICAgICAgdnB1c2ggICB7czE2LXMyN30KKyAgICAgICAgZm1yeCAgICBPTERGUFNDUiwgRlBTQ1IKKyAgICAgICAgbGRyICAgICBsciwgPTB4MDMwMzAwMDAgICAgICAgICAgICAgQCBSdW5GYXN0IG1vZGUsIHNob3J0IHZlY3RvcnMgb2YgbGVuZ3RoIDQsIHN0cmlkZSAxCisgICAgICAgIGZteHIgICAgRlBTQ1IsIGxyCisgICAgICAgIG1vdiAgICAgT1VULCBPUklHT1VUCisgICAgICAgIGxkciAgICAgUkVWVEFCLCBbQ09OVEVYVCwgIzIqNF0KKyAgICAgICAgbGRyICAgICBUQ09TLCBbQ09OVEVYVCwgIzYqNF0KKyAgICAgICAgbGRyICAgICBUU0lOLCBbQ09OVEVYVCwgIzcqNF0KKworIC5zZXQgaywgMAorIC5yZXB0IG44LzIKKyAgICAgICAgcHJlcm90YXRpb25faW5uZXJsb29wCisgLmVuZHIKKworICAgICAgICBmbXhyICAgIEZQU0NSLCBPTERGUFNDUgorICAgICAgICBtb3YgICAgIGExLCBPVVQKKyAgICAgICAgYmwgICAgICBYKGZmX2ZmdDE2X3ZmcCkKKyAgICAgICAgbGRyICAgICBsciwgPTB4MDMwMzAwMDAgICAgICAgICAgICAgQCBSdW5GYXN0IG1vZGUsIHNob3J0IHZlY3RvcnMgb2YgbGVuZ3RoIDQsIHN0cmlkZSAxCisgICAgICAgIGZteHIgICAgRlBTQ1IsIGxyCisKKyAuc2V0IGssIDAKKyAgICAgICAgcG9zdHJvdGF0aW9uX2lubmVybG9vcCAsIGhlYWQKKyAucmVwdCBuOC8yIC0gMQorICAgICAgICBwb3N0cm90YXRpb25faW5uZXJsb29wIHRhaWwsIGhlYWQKKyAuZW5kcgorICAgICAgICBwb3N0cm90YXRpb25faW5uZXJsb29wIHRhaWwKKworICAgICAgICBmbXhyICAgIEZQU0NSLCBPTERGUFNDUgorICAgICAgICB2cG9wICAgIHtzMTYtczI3fQorICAgICAgICBwb3AgICAgIHt2MS12NSxwY30KKworMTA6CisgICAgICAgIHB1c2ggICAge3YxLXY2LHNsLGZwLGxyfQorICAgICAgICB2cHVzaCAgIHtzMTYtczI3fQorICAgICAgICBmbXJ4ICAgIE9MREZQU0NSLCBGUFNDUgorICAgICAgICBsZHIgICAgIGxyLCA9MHgwMzAzMDAwMCAgICAgICAgICAgICBAIFJ1bkZhc3QgbW9kZSwgc2hvcnQgdmVjdG9ycyBvZiBsZW5ndGggNCwgc3RyaWRlIDEKKyAgICAgICAgZm14ciAgICBGUFNDUiwgbHIKKyAgICAgICAgbW92ICAgICBsciwgIzEKKyAgICAgICAgbW92ICAgICBPVVQsIE9SSUdPVVQKKyAgICAgICAgbGRyICAgICBSRVZUQUIsIFtDT05URVhULCAjMio0XQorICAgICAgICBsZHIgICAgIFRDT1MsIFtDT05URVhULCAjNio0XQorICAgICAgICBsZHIgICAgIFRTSU4sIFtDT05URVhULCAjNyo0XQorICAgICAgICBtb3YgICAgIGxyLCBsciwgbHNsIGlwCisKKyAgICAgICAgcHVzaCAgICB7Q09OVEVYVCxPTERGUFNDUn0KKyAgICAgICAgYWRkICAgICBJTl9ISSwgSU4sIGxyLCBsc2wgIzEKKyAgICAgICAgYWRkICAgICBSRVZUQUJfSEksIFJFVlRBQiwgbHIsIGxzciAjMQorICAgICAgICBhZGQgICAgIFRDT1NfSEksIFRDT1MsIGxyCisgICAgICAgIGFkZCAgICAgVFNJTl9ISSwgVFNJTiwgbHIKKzA6ICAgICAgcHJlcm90YXRpb25faW5uZXJsb29wX3JvbGxlZAorICAgICAgICB0ZXEgICAgIElOLCBJTl9ISQorICAgICAgICBibmUgICAgIDBiCisgICAgICAgIGxkbWlhICAgc3AsIHtDT05URVhULE9MREZQU0NSfQorCisgICAgICAgIG1vdiAgICAgT1JJR09VVCwgT1VUCisgICAgICAgIGZteHIgICAgRlBTQ1IsIE9MREZQU0NSCisgICAgICAgIGxkciAgICAgaXAsIFtDT05URVhULCAjOSo0XQorICAgICAgICBibHggICAgIGlwICAgICAgICAgICAgICAgICAgICAgICAgICBAIHMtPmZmdF9jYWxjKHMsIG91dHB1dCkKKworICAgICAgICBwb3AgICAgIHtDT05URVhULE9MREZQU0NSfQorICAgICAgICBsZHIgICAgIGxyLCA9MHgwMzAzMDAwMCAgICAgICAgICAgICBAIFJ1bkZhc3QgbW9kZSwgc2hvcnQgdmVjdG9ycyBvZiBsZW5ndGggNCwgc3RyaWRlIDEKKyAgICAgICAgbGRyICAgICBpcCwgW0NPTlRFWFQsICM1KjRdICAgICAgICAgQCBtZGN0X2JpdHMKKyAgICAgICAgZm14ciAgICBGUFNDUiwgbHIKKyAgICAgICAgbW92ICAgICBsciwgIzEKKyAgICAgICAgbW92ICAgICBsciwgbHIsIGxzbCBpcAorICAgICAgICBzdWIgICAgIFRDT1MsIFRDT1MsIGxyLCBsc3IgIzEKKyAgICAgICAgc3ViICAgICBUU0lOLCBUU0lOLCBsciwgbHNyICMxCisgICAgICAgIGFkZCAgICAgT1VUX0hJLCBPVVQsIGxyLCBsc2wgIzEKKyAgICAgICAgYWRkICAgICBUQ09TX0hJLCBUQ09TLCBscgorICAgICAgICBhZGQgICAgIFRTSU5fSEksIFRTSU4sIGxyCisgICAgICAgIHBvc3Ryb3RhdGlvbl9pbm5lcmxvb3Bfcm9sbGVkICwgaGVhZCwgczIwLCBzMjEsIHMyMiwgczIzLCwgMAorICAgICAgICBiICAgICAgIDFmCiswOiAgICAgIGFkZCAgICAgT1VULCBPVVQsICMzMgorICAgICAgICBzdWIgICAgIE9VVF9ISSwgT1VUX0hJLCAjMzIKKyAgICAgICAgcG9zdHJvdGF0aW9uX2lubmVybG9vcF9yb2xsZWQgdGFpbCwgaGVhZCwgczIwLCBzMjEsIHMyMiwgczIzLCBzMjQsIDAsIC0xNgorMTogICAgICBwb3N0cm90YXRpb25faW5uZXJsb29wX3JvbGxlZCB0YWlsLCBoZWFkLCBzMjQsIHMyNSwgczI2LCBzMjcsIHMyMCwgMTYsIDAKKyAgICAgICAgdGVxICAgICBUU0lOLCBUU0lOX0hJCisgICAgICAgIGJuZSAgICAgMGIKKyAgICAgICAgcG9zdHJvdGF0aW9uX2lubmVybG9vcF9yb2xsZWQgdGFpbCwsLCwsLCBzMjQsLCAxNgorCisgICAgICAgIGZteHIgICAgRlBTQ1IsIE9MREZQU0NSCisgICAgICAgIHZwb3AgICAge3MxNi1zMjd9CisgICAgICAgIHBvcCAgICAge3YxLXY2LHNsLGZwLHBjfQorZW5kZnVuYworCisgICAgICAgIC51bnJlcSAgQ09OVEVYVAorICAgICAgICAudW5yZXEgIE9SSUdPVVQKKyAgICAgICAgLnVucmVxICBJTgorICAgICAgICAudW5yZXEgIE9VVAorICAgICAgICAudW5yZXEgIFJFVlRBQgorICAgICAgICAudW5yZXEgIFRDT1MKKyAgICAgICAgLnVucmVxICBUU0lOCisgICAgICAgIC51bnJlcSAgT0xERlBTQ1IKKyAgICAgICAgLnVucmVxICBKMAorICAgICAgICAudW5yZXEgIEoxCisgICAgICAgIC51bnJlcSAgSjIKKyAgICAgICAgLnVucmVxICBKMworICAgICAgICAudW5yZXEgIFJFVlRBQl9ISQorICAgICAgICAudW5yZXEgIElOX0hJCisgICAgICAgIC51bnJlcSAgT1VUX0hJCisgICAgICAgIC51bnJlcSAgVENPU19ISQorICAgICAgICAudW5yZXEgIFRTSU5fSEkKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tZV9jbXBfYXJtdjYuUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tZV9jbXBfYXJtdjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTVhODIzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21lX2NtcF9hcm12Ni5TCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworZnVuY3Rpb24gZmZfcGl4X2FiczE2X2FybXY2LCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjAsICBbc3BdCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjksIGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMAorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICAjMAorICAgICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjQtcjd9CisgICAgICAgIGxkciAgICAgICAgICAgICByOCwgIFtyMl0KKzE6CisgICAgICAgIGxkciAgICAgICAgICAgICByOSwgIFtyMiwgIzRdCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjEsIHIzXQorICAgICAgICB1c2FkYTggICAgICAgICAgcjEyLCByNCwgIHI4LCAgcjEyCisgICAgICAgIGxkciAgICAgICAgICAgICByOCwgIFtyMiwgIzhdCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjIsIHIzXQorICAgICAgICB1c2FkYTggICAgICAgICAgbHIsICByNSwgIHI5LCAgbHIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3IyLCAjMTJdCisgICAgICAgIHVzYWRhOCAgICAgICAgICByMTIsIHI2LCAgcjgsICByMTIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIwLCAgcjAsICAjMQorICAgICAgICB1c2FkYTggICAgICAgICAgbHIsICByNywgIHI5LCAgbHIKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjMKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3I0LXI3fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgIHIzCisgICAgICAgIGxkciAgICAgICAgICAgICByOCwgIFtyMl0KKyAgICAgICAgYiAgICAgICAgICAgICAgIDFiCisyOgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMTIsIGxyCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjksIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9waXhfYWJzMTZfeDJfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTEsIGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjAsICAjMAorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICAjMQorICAgICAgICBvcnIgICAgICAgICAgICAgbHIsICBsciwgIGxyLCAgbHNsICM4CisgICAgICAgIG9yciAgICAgICAgICAgICBsciwgIGxyLCAgbHIsICBsc2wgIzE2CisxOgorICAgICAgICBsZHIgICAgICAgICAgICAgcjgsICBbcjJdCisgICAgICAgIGxkciAgICAgICAgICAgICByOSwgIFtyMiwgIzRdCisgICAgICAgIGxzciAgICAgICAgICAgICByMTAsIHI4LCAgIzgKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3IxXQorICAgICAgICBsc3IgICAgICAgICAgICAgcjYsICByOSwgICM4CisgICAgICAgIG9yciAgICAgICAgICAgICByMTAsIHIxMCwgcjksICBsc2wgIzI0CisgICAgICAgIGxkciAgICAgICAgICAgICByNSwgIFtyMiwgIzhdCisgICAgICAgIGVvciAgICAgICAgICAgICByMTEsIHI4LCAgcjEwCisgICAgICAgIHVoYWRkOCAgICAgICAgICByNywgIHI4LCAgcjEwCisgICAgICAgIG9yciAgICAgICAgICAgICByNiwgIHI2LCAgcjUsICBsc2wgIzI0CisgICAgICAgIGFuZCAgICAgICAgICAgICByMTEsIHIxMSwgbHIKKyAgICAgICAgdWFkZDggICAgICAgICAgIHI3LCAgcjcsICByMTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI4LCAgW3IxLCAjNF0KKyAgICAgICAgdXNhZGE4ICAgICAgICAgIHIwLCAgcjQsICByNywgIHIwCisgICAgICAgIGVvciAgICAgICAgICAgICByNywgIHI5LCAgcjYKKyAgICAgICAgbHNyICAgICAgICAgICAgIHIxMCwgcjUsICAjOAorICAgICAgICBhbmQgICAgICAgICAgICAgcjcsICByNywgIGxyCisgICAgICAgIHVoYWRkOCAgICAgICAgICByNCwgIHI5LCAgcjYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3IyLCAjMTJdCisgICAgICAgIHVhZGQ4ICAgICAgICAgICByNCwgIHI0LCAgcjcKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMSwgcjNdCisgICAgICAgIG9yciAgICAgICAgICAgICByMTAsIHIxMCwgcjYsICBsc2wgIzI0CisgICAgICAgIHVzYWRhOCAgICAgICAgICByMCwgIHI4LCAgcjQsICByMAorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbcjEsICM4XQorICAgICAgICBlb3IgICAgICAgICAgICAgcjExLCByNSwgIHIxMAorICAgICAgICBsZHJiICAgICAgICAgICAgcjcsICBbcjIsICMxNl0KKyAgICAgICAgYW5kICAgICAgICAgICAgIHIxMSwgcjExLCBscgorICAgICAgICB1aGFkZDggICAgICAgICAgcjgsICByNSwgIHIxMAorICAgICAgICBsZHIgICAgICAgICAgICAgcjUsICBbcjEsICMxMl0KKyAgICAgICAgdWFkZDggICAgICAgICAgIHI4LCAgcjgsICByMTEKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMiwgcjNdCisgICAgICAgIGxzciAgICAgICAgICAgICByMTAsIHI2LCAgIzgKKyAgICAgICAgdXNhZGE4ICAgICAgICAgIHIwLCAgcjQsICByOCwgIHIwCisgICAgICAgIG9yciAgICAgICAgICAgICByMTAsIHIxMCwgcjcsICBsc2wgIzI0CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsICByMTIsICAjMQorICAgICAgICBlb3IgICAgICAgICAgICAgcjExLCByNiwgIHIxMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIzCisgICAgICAgIHVoYWRkOCAgICAgICAgICByOSwgIHI2LCAgcjEwCisgICAgICAgIGFuZCAgICAgICAgICAgICByMTEsIHIxMSwgbHIKKyAgICAgICAgdWFkZDggICAgICAgICAgIHI5LCAgcjksICByMTEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICByMworICAgICAgICB1c2FkYTggICAgICAgICAgcjAsICByNSwgIHI5LCAgcjAKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTEsIHBjfQorZW5kZnVuYworCisubWFjcm8gIHVzYWRfeTIgICAgICAgICBwMCwgIHAxLCAgcDIsICBwMywgIG4wLCAgbjEsICBuMiwgIG4zCisgICAgICAgIGxkciAgICAgICAgICAgICBcbjAsIFtyMl0KKyAgICAgICAgZW9yICAgICAgICAgICAgIFxuMSwgXHAwLCBcbjAKKyAgICAgICAgdWhhZGQ4ICAgICAgICAgIFxwMCwgXHAwLCBcbjAKKyAgICAgICAgYW5kICAgICAgICAgICAgIFxuMSwgXG4xLCBscgorICAgICAgICBsZHIgICAgICAgICAgICAgXG4yLCBbcjFdCisgICAgICAgIHVhZGQ4ICAgICAgICAgICBccDAsIFxwMCwgXG4xCisgICAgICAgIGxkciAgICAgICAgICAgICBcbjEsIFtyMiwgIzRdCisgICAgICAgIHVzYWRhOCAgICAgICAgICByMCwgIFxwMCwgXG4yLCByMAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCAgcjNdCisgICAgICAgIGVvciAgICAgICAgICAgICBcbjMsIFxwMSwgXG4xCisgICAgICAgIHVoYWRkOCAgICAgICAgICBccDEsIFxwMSwgXG4xCisgICAgICAgIGFuZCAgICAgICAgICAgICBcbjMsIFxuMywgbHIKKyAgICAgICAgbGRyICAgICAgICAgICAgIFxwMCwgW3IxLCAjNF0KKyAgICAgICAgdWFkZDggICAgICAgICAgIFxwMSwgXHAxLCBcbjMKKyAgICAgICAgbGRyICAgICAgICAgICAgIFxuMiwgW3IyLCAjOF0KKyAgICAgICAgdXNhZGE4ICAgICAgICAgIHIwLCAgXHAxLCBccDAsIHIwCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjIsICByM10KKyAgICAgICAgZW9yICAgICAgICAgICAgIFxwMCwgXHAyLCBcbjIKKyAgICAgICAgdWhhZGQ4ICAgICAgICAgIFxwMiwgXHAyLCBcbjIKKyAgICAgICAgYW5kICAgICAgICAgICAgIFxwMCwgXHAwLCBscgorICAgICAgICBsZHIgICAgICAgICAgICAgXHAxLCBbcjEsICM4XQorICAgICAgICB1YWRkOCAgICAgICAgICAgXHAyLCBccDIsIFxwMAorICAgICAgICBsZHIgICAgICAgICAgICAgXG4zLCBbcjIsICMxMl0KKyAgICAgICAgdXNhZGE4ICAgICAgICAgIHIwLCAgXHAyLCBccDEsIHIwCisgICAgICAgIGVvciAgICAgICAgICAgICBccDEsIFxwMywgXG4zCisgICAgICAgIHVoYWRkOCAgICAgICAgICBccDMsIFxwMywgXG4zCisgICAgICAgIGFuZCAgICAgICAgICAgICBccDEsIFxwMSwgbHIKKyAgICAgICAgbGRyICAgICAgICAgICAgIFxwMCwgIFtyMSwgIzEyXQorICAgICAgICB1YWRkOCAgICAgICAgICAgXHAzLCBccDMsIFxwMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIzCisgICAgICAgIHVzYWRhOCAgICAgICAgICByMCwgIFxwMywgXHAwLCAgcjAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICByMworLmVuZG0KKworZnVuY3Rpb24gZmZfcGl4X2FiczE2X3kyX2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IyXQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjExLCBscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgIzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgIzEKKyAgICAgICAgb3JyICAgICAgICAgICAgIGxyLCAgbHIsICBsciwgIGxzbCAjOAorICAgICAgICBvcnIgICAgICAgICAgICAgbHIsICBsciwgIGxyLCAgbHNsICMxNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbcjJdCisgICAgICAgIGxkciAgICAgICAgICAgICByNSwgIFtyMiwgIzRdCisgICAgICAgIGxkciAgICAgICAgICAgICByNiwgIFtyMiwgIzhdCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMiwgIzEyXQorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgIHIzCisxOgorICAgICAgICB1c2FkX3kyICAgICAgICAgcjQsICByNSwgIHI2LCAgcjcsICByOCwgIHI5LCAgcjEwLCByMTEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICB1c2FkX3kyICAgICAgICAgcjgsICByOSwgIHIxMCwgcjExLCByNCwgIHI1LCAgcjYsICByNworICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXIxMSwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3BpeF9hYnM4X2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IyLCByM10KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI5LCBscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgIzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgIzAKKyAgICAgICAgbGRyZF9wb3N0ICAgICAgIHI0LCAgcjUsICByMSwgIHIzCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMiwgIzRdCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByNiwgIHIyLCAgcjMKKyAgICAgICAgbGRyZF9wb3N0ICAgICAgIHI4LCAgcjksICByMSwgIHIzCisgICAgICAgIHVzYWRhOCAgICAgICAgICByMCwgIHI0LCAgcjYsICByMAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IyLCByM10KKyAgICAgICAgdXNhZGE4ICAgICAgICAgIGxyLCAgcjUsICByNywgIGxyCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMiwgIzRdCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByNiwgIHIyLCAgcjMKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisgICAgICAgIGxkcmRfcG9zdCAgICAgICByNCwgIHI1LCAgcjEsICByMworICAgICAgICB1c2FkYTggICAgICAgICAgcjAsICByOCwgIHI2LCAgcjAKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMiwgcjNdCisgICAgICAgIHVzYWRhOCAgICAgICAgICBsciwgIHI5LCAgcjcsICBscgorICAgICAgICBiICAgICAgICAgICAgICAgMWIKKzI6CisgICAgICAgIHVzYWRhOCAgICAgICAgICByMCwgIHI4LCAgcjYsICByMAorICAgICAgICB1c2FkYTggICAgICAgICAgbHIsICByOSwgIHI3LCAgbHIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICBscgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI5LCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfc3NlMTZfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOSwgbHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMCwgICMwCisxOgorICAgICAgICBsZHJkICAgICAgICAgICAgcjQsICByNSwgIFtyMV0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI4LCAgW3IyXQorICAgICAgICB1eHRiMTYgICAgICAgICAgbHIsICByNAorICAgICAgICB1eHRiMTYgICAgICAgICAgcjQsICByNCwgIHJvciAjOAorICAgICAgICB1eHRiMTYgICAgICAgICAgcjksICByOAorICAgICAgICB1eHRiMTYgICAgICAgICAgcjgsICByOCwgIHJvciAjOAorICAgICAgICBsZHIgICAgICAgICAgICAgcjcsICBbcjIsICM0XQorICAgICAgICB1c3ViMTYgICAgICAgICAgbHIsICBsciwgIHI5CisgICAgICAgIHVzdWIxNiAgICAgICAgICByNCwgIHI0LCAgcjgKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIwLCAgbHIsICBsciwgIHIwCisgICAgICAgIHV4dGIxNiAgICAgICAgICByNiwgIHI1CisgICAgICAgIHV4dGIxNiAgICAgICAgICBsciwgIHI1LCAgcm9yICM4CisgICAgICAgIHV4dGIxNiAgICAgICAgICByOCwgIHI3CisgICAgICAgIHV4dGIxNiAgICAgICAgICByOSwgIHI3LCAgcm9yICM4CisgICAgICAgIHNtbGFkICAgICAgICAgICByMCwgIHI0LCAgcjQsICByMAorICAgICAgICBsZHJkICAgICAgICAgICAgcjQsICByNSwgIFtyMSwgIzhdCisgICAgICAgIHVzdWIxNiAgICAgICAgICByNiwgIHI2LCAgcjgKKyAgICAgICAgdXN1YjE2ICAgICAgICAgIHI4LCAgbHIsICByOQorICAgICAgICBsZHIgICAgICAgICAgICAgcjcsICBbcjIsICM4XQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjAsICByNiwgIHI2LCAgcjAKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIGxyLCAgcjQKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI0LCAgcjQsICByb3IgIzgKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI5LCAgcjcKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI3LCAgcjcsIHJvciAjOAorICAgICAgICBzbWxhZCAgICAgICAgICAgcjAsICByOCwgIHI4LCAgcjAKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI4LCAgW3IyLCAjMTJdCisgICAgICAgIHVzdWIxNiAgICAgICAgICBsciwgIGxyLCAgcjkKKyAgICAgICAgdXN1YjE2ICAgICAgICAgIHI0LCAgcjQsICByNworICAgICAgICBzbWxhZCAgICAgICAgICAgcjAsICBsciwgIGxyLCAgcjAKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI2LCAgcjUKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI1LCAgcjUsICByb3IgIzgKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI5LCAgcjgKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI4LCAgcjgsICByb3IgIzgKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIwLCAgcjQsICByNCwgIHIwCisgICAgICAgIHVzdWIxNiAgICAgICAgICByNiwgIHI2LCAgcjkKKyAgICAgICAgdXN1YjE2ICAgICAgICAgIHI1LCAgcjUsICByOAorICAgICAgICBzbWxhZCAgICAgICAgICAgcjAsICByNiwgIHI2LCAgcjAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICByMworICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgIHIzCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIwLCAgcjUsICByNSwgIHIwCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjksIHBjfQorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21lX2NtcF9pbml0X2FybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21lX2NtcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODcwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbWVfY21wX2luaXRfYXJtLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWVfY21wLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW8uaCIKKworaW50IGZmX3BpeF9hYnMxNl9hcm12NihNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqYmxrMSwgdWludDhfdCAqYmxrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3BpeF9hYnMxNl94Ml9hcm12NihNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqYmxrMSwgdWludDhfdCAqYmxrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3BpeF9hYnMxNl95Ml9hcm12NihNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqYmxrMSwgdWludDhfdCAqYmxrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworCitpbnQgZmZfcGl4X2FiczhfYXJtdjYoTXBlZ0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKmJsazEsIHVpbnQ4X3QgKmJsazIsCisgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworCitpbnQgZmZfc3NlMTZfYXJtdjYoTXBlZ0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKmJsazEsIHVpbnQ4X3QgKmJsazIsCisgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworCithdl9jb2xkIHZvaWQgZmZfbWVfY21wX2luaXRfYXJtKE1FQ21wQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9hcm12NihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnBpeF9hYnNbMF1bMF0gPSBmZl9waXhfYWJzMTZfYXJtdjY7CisgICAgICAgIGMtPnBpeF9hYnNbMF1bMV0gPSBmZl9waXhfYWJzMTZfeDJfYXJtdjY7CisgICAgICAgIGMtPnBpeF9hYnNbMF1bMl0gPSBmZl9waXhfYWJzMTZfeTJfYXJtdjY7CisKKyAgICAgICAgYy0+cGl4X2Fic1sxXVswXSA9IGZmX3BpeF9hYnM4X2FybXY2OworCisgICAgICAgIGMtPnNhZFswXSA9IGZmX3BpeF9hYnMxNl9hcm12NjsKKyAgICAgICAgYy0+c2FkWzFdID0gZmZfcGl4X2FiczhfYXJtdjY7CisKKyAgICAgICAgYy0+c3NlWzBdID0gZmZfc3NlMTZfYXJtdjY7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21scGRzcF9hcm12NXRlLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbWxwZHNwX2FybXY1dGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjllNzZhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21scGRzcF9hcm12NXRlLlMKQEAgLTAsMCArMSw2NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUklTQyBPUyBPcGVuIEx0ZAorICogQXV0aG9yOiBCZW4gQXZpc29uIDxiYXZpc29uQHJpc2Nvc29wZW4ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworI2RlZmluZSBNQVhfQ0hBTk5FTFMgICAgICAgIDgKKyNkZWZpbmUgTUFYX0ZJUl9PUkRFUiAgICAgICA4CisjZGVmaW5lIE1BWF9JSVJfT1JERVIgICAgICAgNAorI2RlZmluZSBNQVhfUkFURUZBQ1RPUiAgICAgIDQKKyNkZWZpbmUgTUFYX0JMT0NLU0laRSAgICAgICAoNDAgKiBNQVhfUkFURUZBQ1RPUikKKworUFNUICAgICAucmVxICAgIGExCitQQ08gICAgIC5yZXEgICAgYTIKK0FDMCAgICAgLnJlcSAgICBhMworQUMxICAgICAucmVxICAgIGE0CitDTzAgICAgIC5yZXEgICAgdjEKK0NPMSAgICAgLnJlcSAgICB2MgorQ08yICAgICAucmVxICAgIHYzCitDTzMgICAgIC5yZXEgICAgdjQKK1NUMCAgICAgLnJlcSAgICB2NQorU1QxICAgICAucmVxICAgIHY2CitTVDIgICAgIC5yZXEgICAgc2wKK1NUMyAgICAgLnJlcSAgICBmcAorSSAgICAgICAucmVxICAgIGlwCitQU0FNUCAgIC5yZXEgICAgbHIKKworCisvLyBTb21lIG1hY3JvcyB0aGF0IGRvIGxvYWRzL211bHRpcGxpZXMgd2hlcmUgdGhlIHJlZ2lzdGVyIG51bWJlciBpcyBkZXRlcm1pbmVkCisvLyBmcm9tIGFuIGFzc2VtYmx5LXRpbWUgZXhwcmVzc2lvbi4gQm95IGlzIEdOVSBhc3NlbWJsZXIncyBzeW50YXggdWdseS4uLgorCisubWFjcm8gbG9hZCAgZ3JvdXAsIGluZGV4LCBiYXNlLCBvZmZzZXQKKyAgICAgICAuYWx0bWFjcm8KKyAgICAgICBsb2FkXyBcZ3JvdXAsICUoXGluZGV4KSwgXGJhc2UsIFxvZmZzZXQKKyAgICAgICAubm9hbHRtYWNybworLmVuZG0KKworLm1hY3JvIGxvYWRfIGdyb3VwLCBpbmRleCwgYmFzZSwgb2Zmc2V0CisgICAgICAgIGxkciAgICAgXGdyb3VwXGluZGV4LCBbXGJhc2UsICNcb2Zmc2V0XQorLmVuZG0KKworLm1hY3JvIGxvYWRkICBncm91cCwgaW5kZXgsIGJhc2UsIG9mZnNldAorICAgICAgIC5hbHRtYWNybworICAgICAgIGxvYWRkXyBcZ3JvdXAsICUoXGluZGV4KSwgJShcaW5kZXgrMSksIFxiYXNlLCBcb2Zmc2V0CisgICAgICAgLm5vYWx0bWFjcm8KKy5lbmRtCisKKy5tYWNybyBsb2FkZF8gZ3JvdXAsIGluZGV4MCwgaW5kZXgxLCBiYXNlLCBvZmZzZXQKK0EgLmlmIFxvZmZzZXQgPj0gMjU2CitBICAgICAgIGxkciAgICAgXGdyb3VwXGluZGV4MCwgW1xiYXNlLCAjXG9mZnNldF0KK0EgICAgICAgbGRyICAgICBcZ3JvdXBcaW5kZXgxLCBbXGJhc2UsICMoXG9mZnNldCkgKyA0XQorQSAuZWxzZQorICAgICAgICBsZHJkICAgIFxncm91cFxpbmRleDAsIFxncm91cFxpbmRleDEsIFtcYmFzZSwgI1xvZmZzZXRdCitBIC5lbmRpZgorLmVuZG0KKworLm1hY3JvIG11bHRpcGx5ICBpbmRleCwgYWNjdW11bGF0ZSwgbG9uZworICAgICAgICAuYWx0bWFjcm8KKyAgICAgICAgbXVsdGlwbHlfICUoXGluZGV4KSwgXGFjY3VtdWxhdGUsIFxsb25nCisgICAgICAgIC5ub2FsdG1hY3JvCisuZW5kbQorCisubWFjcm8gbXVsdGlwbHlfICBpbmRleCwgYWNjdW11bGF0ZSwgbG9uZworIC5pZiBcbG9uZworICAuaWYgXGFjY3VtdWxhdGUKKyAgICAgICAgc21sYWwgICBBQzAsIEFDMSwgQ09caW5kZXgsIFNUXGluZGV4CisgIC5lbHNlCisgICAgICAgIHNtdWxsICAgQUMwLCBBQzEsIENPXGluZGV4LCBTVFxpbmRleAorICAuZW5kaWYKKyAuZWxzZQorICAuaWYgXGFjY3VtdWxhdGUKKyAgICAgICAgbWxhICAgICBBQzAsIENPXGluZGV4LCBTVFxpbmRleCwgQUMwCisgIC5lbHNlCisgICAgICAgIG11bCAgICAgQUMwLCBDT1xpbmRleCwgU1RcaW5kZXgKKyAgLmVuZGlmCisgLmVuZGlmCisuZW5kbQorCisvLyBBIG1hY3JvIHRvIHVwZGF0ZSB0aGUgbG9hZCByZWdpc3RlciBudW1iZXIgYW5kIGxvYWQgb2Zmc2V0cworCisubWFjcm8gaW5jICBob3dtYW55CisgIC5zZXQgTE9BRF9SRUcsIChMT0FEX1JFRyArIFxob3dtYW55KSAmIDMKKyAgLnNldCBPRkZTRVRfQ08sIE9GRlNFVF9DTyArIDQgKiBcaG93bWFueQorICAuc2V0IE9GRlNFVF9TVCwgT0ZGU0VUX1NUICsgNCAqIFxob3dtYW55CisgIC5pZiBGSVJfUkVNQUlOID4gMAorICAgIC5zZXQgRklSX1JFTUFJTiwgRklSX1JFTUFJTiAtIFxob3dtYW55CisgICAgLmlmIEZJUl9SRU1BSU4gPT0gMAorICAgICAgLnNldCBPRkZTRVRfQ08sIDQgKiBNQVhfRklSX09SREVSCisgICAgICAuc2V0IE9GRlNFVF9TVCwgNCAqIChNQVhfQkxPQ0tTSVpFICsgTUFYX0ZJUl9PUkRFUikKKyAgICAuZW5kaWYKKyAgLmVsc2VpZiBJSVJfUkVNQUlOID4gMAorICAgIC5zZXQgSUlSX1JFTUFJTiwgSUlSX1JFTUFJTiAtIFxob3dtYW55CisgIC5lbmRpZgorLmVuZG0KKworLy8gTWFjcm8gdG8gaW1wbGVtZW50IHRoZSBpbm5lciBsb29wIGZvciBvbmUgc3BlY2lmaWMgY29tYmluYXRpb24gb2YgcGFyYW1ldGVycworCisubWFjcm8gaW1wbGVtZW50X2ZpbHRlciAgbWFza19taW51czEsIHNoaWZ0XzAsIHNoaWZ0XzgsIGlpcl90YXBzLCBmaXJfdGFwcworICAuc2V0IFRPVEFMX1RBUFMsIFxpaXJfdGFwcyArIFxmaXJfdGFwcworCisgIC8vIERlYWwgd2l0aCByZWdpc3RlciBhbGxvY2F0aW9uLi4uCisgIC5zZXQgREVGSU5FRF9TSElGVCwgMAorICAuc2V0IERFRklORURfTUFTSywgMAorICAuc2V0IFNIVUZGTEVfU0hJRlQsIDAKKyAgLnNldCBTSFVGRkxFX01BU0ssIDAKKyAgLnNldCBTUElMTF9TSElGVCwgMAorICAuc2V0IFNQSUxMX01BU0ssIDAKKyAgLmlmIFRPVEFMX1RBUFMgPT0gMAorICAgIC8vIExpdHRsZSByZWdpc3RlciBwcmVzc3VyZSBpbiB0aGlzIGNhc2UgLSBqdXN0IGtlZXAgTUFTSyB3aGVyZSBpdCB3YXMKKyAgICAuaWYgIVxtYXNrX21pbnVzMQorICAgICAgTUFTSyAucmVxIFNUMQorICAgICAgLnNldCBERUZJTkVEX01BU0ssIDEKKyAgICAuZW5kaWYKKyAgLmVsc2UKKyAgICAuaWYgXHNoaWZ0XzAKKyAgICAgIC5pZiAhXG1hc2tfbWludXMxCisgICAgICAgIC8vIEFDMSBpcyB1bnVzZWQgd2l0aCBzaGlmdCAwCisgICAgICAgIE1BU0sgLnJlcSBBQzEKKyAgICAgICAgLnNldCBERUZJTkVEX01BU0ssIDEKKyAgICAgICAgLnNldCBTSFVGRkxFX01BU0ssIDEKKyAgICAgIC5lbmRpZgorICAgIC5lbHNlaWYgXHNoaWZ0XzgKKyAgICAgIC5pZiAhXG1hc2tfbWludXMxCisgICAgICAgIC5pZiBUT1RBTF9UQVBTIDw9IDQKKyAgICAgICAgLy8gQWxsIGNvZWZmaWNpZW50cyBhcmUgcHJlbG9hZGVkIChzbyBwb2ludGVyIG5vdCBuZWVkZWQpCisgICAgICAgICAgTUFTSyAucmVxIFBDTworICAgICAgICAgIC5zZXQgREVGSU5FRF9NQVNLLCAxCisgICAgICAgICAgLnNldCBTSFVGRkxFX01BU0ssIDEKKyAgICAgICAgLmVsc2UKKyAgICAgICAgICAuc2V0IFNQSUxMX01BU0ssIDEKKyAgICAgICAgLmVuZGlmCisgICAgICAuZW5kaWYKKyAgICAuZWxzZSAvLyBzaGlmdCBub3QgMCBvciA4CisgICAgICAuaWYgVE9UQUxfVEFQUyA8PSAzCisgICAgICAgIC8vIEFsbCBjb2VmZmljaWVudHMgYXJlIHByZWxvYWRlZCwgYW5kIGF0IGxlYXN0IG9uZSBDTyByZWdpc3RlciBpcyB1bnVzZWQKKyAgICAgICAgLmlmIFxmaXJfdGFwcyAmIDEKKyAgICAgICAgICBTSElGVCAucmVxIENPMAorICAgICAgICAgIC5zZXQgREVGSU5FRF9TSElGVCwgMQorICAgICAgICAgIC5zZXQgU0hVRkZMRV9TSElGVCwgMQorICAgICAgICAuZWxzZQorICAgICAgICAgIFNISUZUIC5yZXEgQ08zCisgICAgICAgICAgLnNldCBERUZJTkVEX1NISUZULCAxCisgICAgICAgICAgLnNldCBTSFVGRkxFX1NISUZULCAxCisgICAgICAgIC5lbmRpZgorICAgICAgICAuaWYgIVxtYXNrX21pbnVzMQorICAgICAgICAgIE1BU0sgLnJlcSBQQ08KKyAgICAgICAgICAuc2V0IERFRklORURfTUFTSywgMQorICAgICAgICAgIC5zZXQgU0hVRkZMRV9NQVNLLCAxCisgICAgICAgIC5lbmRpZgorICAgICAgLmVsc2VpZiBUT1RBTF9UQVBTID09IDQKKyAgICAgICAgLy8gQWxsIGNvZWZmaWNpZW50cyBhcmUgcHJlbG9hZGVkCisgICAgICAgIFNISUZUIC5yZXEgUENPCisgICAgICAgIC5zZXQgREVGSU5FRF9TSElGVCwgMQorICAgICAgICAuc2V0IFNIVUZGTEVfU0hJRlQsIDEKKyAgICAgICAgLmlmICFcbWFza19taW51czEKKyAgICAgICAgICAuc2V0IFNQSUxMX01BU0ssIDEKKyAgICAgICAgLmVuZGlmCisgICAgICAuZWxzZQorICAgICAgICAuc2V0IFNQSUxMX1NISUZULCAxCisgICAgICAgIC5pZiAhXG1hc2tfbWludXMxCisgICAgICAgICAgLnNldCBTUElMTF9NQVNLLCAxCisgICAgICAgIC5lbmRpZgorICAgICAgLmVuZGlmCisgICAgLmVuZGlmCisgIC5lbmRpZgorICAuaWYgU1BJTExfU0hJRlQKKyAgICBTSElGVCAucmVxIFNUMAorICAgIC5zZXQgREVGSU5FRF9TSElGVCwgMQorICAuZW5kaWYKKyAgLmlmIFNQSUxMX01BU0sKKyAgICBNQVNLIC5yZXEgU1QxCisgICAgLnNldCBERUZJTkVEX01BU0ssIDEKKyAgLmVuZGlmCisKKyAgICAgICAgLy8gUHJlbG9hZCBjb2VmZmljaWVudHMgaWYgcG9zc2libGUKKyAgLmlmIFRPVEFMX1RBUFMgPD0gNAorICAgIC5zZXQgT0ZGU0VUX0NPLCAwCisgICAgLmlmIFxmaXJfdGFwcyAmIDEKKyAgICAgIC5zZXQgTE9BRF9SRUcsIDEKKyAgICAuZWxzZQorICAgICAgLnNldCBMT0FEX1JFRywgMAorICAgIC5lbmRpZgorICAgIC5yZXB0IFxmaXJfdGFwcworICAgICAgICBsb2FkICAgIENPLCBMT0FEX1JFRywgUENPLCBPRkZTRVRfQ08KKyAgICAgIC5zZXQgTE9BRF9SRUcsIChMT0FEX1JFRyArIDEpICYgMworICAgICAgLnNldCBPRkZTRVRfQ08sIE9GRlNFVF9DTyArIDQKKyAgICAuZW5kcgorICAgIC5zZXQgT0ZGU0VUX0NPLCA0ICogTUFYX0ZJUl9PUkRFUgorICAgIC5yZXB0IFxpaXJfdGFwcworICAgICAgICBsb2FkICAgIENPLCBMT0FEX1JFRywgUENPLCBPRkZTRVRfQ08KKyAgICAgIC5zZXQgTE9BRF9SRUcsIChMT0FEX1JFRyArIDEpICYgMworICAgICAgLnNldCBPRkZTRVRfQ08sIE9GRlNFVF9DTyArIDQKKyAgICAuZW5kcgorICAuZW5kaWYKKworICAgICAgICAvLyBNb3ZlIG1hc2svc2hpZnQgdG8gZmluYWwgcG9zaXRpb25zIGlmIG5lY2Vzc2FyeQorICAgICAgICAvLyBOZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgcHJlbG9hZGluZywgYmVjYXVzZSBpbiBzb21lIGNhc2VzIHdlCisgICAgICAgIC8vIHJldXNlIHRoZSBjb2VmZmljaWVudCBwb2ludGVyIHJlZ2lzdGVyCisgIC5pZiBTSFVGRkxFX1NISUZUCisgICAgICAgIG1vdiAgICAgU0hJRlQsIFNUMAorICAuZW5kaWYKKyAgLmlmIFNIVUZGTEVfTUFTSworICAgICAgICBtb3YgICAgIE1BU0ssIFNUMQorICAuZW5kaWYKKworICAgICAgICAvLyBCZWdpbiBsb29wCiswMToKKyAgLmlmIFRPVEFMX1RBUFMgPT0gMAorICAgICAgICAvLyBUaGluZ3Mgc2ltcGxpZnkgYSBsb3QgaW4gdGhpcyBjYXNlCisgICAgICAgIC8vIEluIGZhY3QgdGhpcyBjb3VsZCBiZSBwaXBlbGluZWQgZnVydGhlciBpZiBpdCdzIHdvcnRoIGl0Li4uCisgICAgICAgIGxkciAgICAgU1QwLCBbUFNBTVBdCisgICAgICAgIHN1YnMgICAgSSwgSSwgIzEKKyAgICAuaWYgIVxtYXNrX21pbnVzMQorICAgICAgICBhbmQgICAgIFNUMCwgU1QwLCBNQVNLCisgICAgLmVuZGlmCisgICAgICAgIHN0ciAgICAgU1QwLCBbUFNULCAjLTRdIQorICAgICAgICBzdHIgICAgIFNUMCwgW1BTVCwgIzQgKiAoTUFYX0JMT0NLU0laRSArIE1BWF9GSVJfT1JERVIpXQorICAgICAgICBzdHIgICAgIFNUMCwgW1BTQU1QXSwgIzQgKiBNQVhfQ0hBTk5FTFMKKyAgICAgICAgYm5lICAgICAwMWIKKyAgLmVsc2UKKyAgICAuaWYgXGZpcl90YXBzICYgMQorICAgICAgLnNldCBMT0FEX1JFRywgMQorICAgIC5lbHNlCisgICAgICAuc2V0IExPQURfUkVHLCAwCisgICAgLmVuZGlmCisgICAgLnNldCBMT0FEX0JBTkssIDAKKyAgICAuc2V0IEZJUl9SRU1BSU4sIFxmaXJfdGFwcworICAgIC5zZXQgSUlSX1JFTUFJTiwgXGlpcl90YXBzCisgICAgLmlmIEZJUl9SRU1BSU4gPT0gMCAvLyBvbmx5IElJUiB0ZXJtcworICAgICAgLnNldCBPRkZTRVRfQ08sIDQgKiBNQVhfRklSX09SREVSCisgICAgICAuc2V0IE9GRlNFVF9TVCwgNCAqIChNQVhfQkxPQ0tTSVpFICsgTUFYX0ZJUl9PUkRFUikKKyAgICAuZWxzZQorICAgICAgLnNldCBPRkZTRVRfQ08sIDAKKyAgICAgIC5zZXQgT0ZGU0VUX1NULCAwCisgICAgLmVuZGlmCisgICAgLnNldCBNVUxfUkVHLCBMT0FEX1JFRworICAgIC5zZXQgQ09VTlRFUiwgMAorICAgIC5yZXB0IFRPVEFMX1RBUFMgKyAyCisgICAgICAgIC8vIERvIGxvYWQocykKKyAgICAgLmlmIEZJUl9SRU1BSU4gIT0gMCB8fCBJSVJfUkVNQUlOICE9IDAKKyAgICAgIC5pZiBDT1VOVEVSID09IDAKKyAgICAgICAuaWYgVE9UQUxfVEFQUyA+IDQKKyAgICAgICAgbG9hZCAgICBDTywgTE9BRF9SRUcsIFBDTywgT0ZGU0VUX0NPCisgICAgICAgLmVuZGlmCisgICAgICAgIGxvYWQgICAgU1QsIExPQURfUkVHLCBQU1QsIE9GRlNFVF9TVAorICAgICAgICBpbmMgICAgIDEKKyAgICAgIC5lbHNlaWYgQ09VTlRFUiA9PSAxICYmIChcZmlyX3RhcHMgJiAxKSA9PSAwCisgICAgICAgLmlmIFRPVEFMX1RBUFMgPiA0CisgICAgICAgIGxvYWQgICAgQ08sIExPQURfUkVHLCBQQ08sIE9GRlNFVF9DTworICAgICAgIC5lbmRpZgorICAgICAgICBsb2FkICAgIFNULCBMT0FEX1JFRywgUFNULCBPRkZTRVRfU1QKKyAgICAgICAgaW5jICAgICAxCisgICAgICAuZWxzZWlmIExPQURfQkFOSyA9PSAwCisgICAgICAgLmlmIFRPVEFMX1RBUFMgPiA0CisgICAgICAgIC5pZiBGSVJfUkVNQUlOID09IDAgJiYgSUlSX1JFTUFJTiA9PSAxCisgICAgICAgIGxvYWQgICAgQ08sIExPQURfUkVHLCBQQ08sIE9GRlNFVF9DTworICAgICAgICAuZWxzZQorICAgICAgICBsb2FkZCAgIENPLCBMT0FEX1JFRywgUENPLCBPRkZTRVRfQ08KKyAgICAgICAgLmVuZGlmCisgICAgICAgLmVuZGlmCisgICAgICAgLnNldCBMT0FEX0JBTkssIDEKKyAgICAgIC5lbHNlCisgICAgICAgLmlmIEZJUl9SRU1BSU4gPT0gMCAmJiBJSVJfUkVNQUlOID09IDEKKyAgICAgICAgbG9hZCAgICBTVCwgTE9BRF9SRUcsIFBTVCwgT0ZGU0VUX1NUCisgICAgICAgIGluYyAgICAgMQorICAgICAgIC5lbHNlCisgICAgICAgIGxvYWRkICAgU1QsIExPQURfUkVHLCBQU1QsIE9GRlNFVF9TVAorICAgICAgICBpbmMgICAgIDIKKyAgICAgICAuZW5kaWYKKyAgICAgICAuc2V0IExPQURfQkFOSywgMAorICAgICAgLmVuZGlmCisgICAgIC5lbmRpZgorCisgICAgICAgIC8vIERvIGludGVybGVhdmVkIG11bHRpcGxpZXMsIHNsaWdodGx5IGRlbGF5ZWQKKyAgICAgLmlmIENPVU5URVIgPj0gMgorICAgICAgICBtdWx0aXBseSBNVUxfUkVHLCBDT1VOVEVSID4gMiwgIVxzaGlmdF8wCisgICAgICAuc2V0IE1VTF9SRUcsIChNVUxfUkVHICsgMSkgJiAzCisgICAgIC5lbmRpZgorICAgICAuc2V0IENPVU5URVIsIENPVU5URVIgKyAxCisgICAgLmVuZHIKKworICAgICAgICAvLyBQb3N0LXByb2Nlc3MgdGhlIHJlc3VsdCBvZiB0aGUgbXVsdGlwbGllcworICAgIC5pZiBTUElMTF9TSElGVAorICAgICAgICBsZHIgICAgIFNISUZULCBbc3AsICM5KjQgKyAwKjRdCisgICAgLmVuZGlmCisgICAgLmlmIFNQSUxMX01BU0sKKyAgICAgICAgbGRyICAgICBNQVNLLCBbc3AsICM5KjQgKyAxKjRdCisgICAgLmVuZGlmCisgICAgICAgIGxkciAgICAgU1QyLCBbUFNBTVBdCisgICAgICAgIHN1YnMgICAgSSwgSSwgIzEKKyAgICAuaWYgXHNoaWZ0XzgKKyAgICAgICAgbW92ICAgICBBQzAsIEFDMCwgbHNyICM4CisgICAgICAgIG9yciAgICAgQUMwLCBBQzAsIEFDMSwgbHNsICMyNAorICAgIC5lbHNlaWYgIVxzaGlmdF8wCisgICAgICAgIHJzYiAgICAgU1QzLCBTSElGVCwgIzMyCisgICAgICAgIG1vdiAgICAgQUMwLCBBQzAsIGxzciBTSElGVAorQSAgICAgICBvcnIgICAgIEFDMCwgQUMwLCBBQzEsIGxzbCBTVDMKK1QgICAgICAgbW92ICAgICBBQzEsIEFDMSwgbHNsIFNUMworVCAgICAgICBvcnIgICAgIEFDMCwgQUMwLCBBQzEKKyAgICAuZW5kaWYKKyAgICAuaWYgXG1hc2tfbWludXMxCisgICAgICAgIGFkZCAgICAgU1QzLCBTVDIsIEFDMAorICAgIC5lbHNlCisgICAgICAgIGFkZCAgICAgU1QyLCBTVDIsIEFDMAorICAgICAgICBhbmQgICAgIFNUMywgU1QyLCBNQVNLCisgICAgICAgIHN1YiAgICAgU1QyLCBTVDMsIEFDMAorICAgIC5lbmRpZgorICAgICAgICBzdHIgICAgIFNUMywgW1BTVCwgIy00XSEKKyAgICAgICAgc3RyICAgICBTVDIsIFtQU1QsICM0ICogKE1BWF9CTE9DS1NJWkUgKyBNQVhfRklSX09SREVSKV0KKyAgICAgICAgc3RyICAgICBTVDMsIFtQU0FNUF0sICM0ICogTUFYX0NIQU5ORUxTCisgICAgICAgIGJuZSAgICAgMDFiCisgIC5lbmRpZgorICAgICAgICBiICAgICAgIDk5ZgorCisgIC5pZiBERUZJTkVEX1NISUZUCisgICAgLnVucmVxIFNISUZUCisgIC5lbmRpZgorICAuaWYgREVGSU5FRF9NQVNLCisgICAgLnVucmVxIE1BU0sKKyAgLmVuZGlmCisuZW5kbQorCisubWFjcm8gc3dpdGNoX29uX2Zpcl90YXBzICBtYXNrX21pbnVzMSwgc2hpZnRfMCwgc2hpZnRfOCwgaWlyX3RhcHMKK0EgICAgICAgbGRyICAgICBwYywgW3BjLCBhMywgbHNsICMyXSAvLyBmaXJvcmRlciBpcyBpbiByYW5nZSAwLSg4LWlpcl90YXBzKQorVCAgICAgICB0YmggICAgIFtwYywgYTMsIGxzbCAjMV0KKzA6CitBICAgICAgIC53b3JkICAgMCwgNzBmLCA3MWYsIDcyZiwgNzNmLCA3NGYKK1QgICAgICAgLmh3b3JkICAoNzBmIC0gMGIpIC8gMiwgKDcxZiAtIDBiKSAvIDIsICg3MmYgLSAwYikgLyAyLCAoNzNmIC0gMGIpIC8gMiwgKDc0ZiAtIDBiKSAvIDIKKyAuaWYgXGlpcl90YXBzIDw9IDMKK0EgICAgICAgLndvcmQgICA3NWYKK1QgICAgICAgLmh3b3JkICAoNzVmIC0gMGIpIC8gMgorICAuaWYgXGlpcl90YXBzIDw9IDIKK0EgICAgICAgLndvcmQgICA3NmYKK1QgICAgICAgLmh3b3JkICAoNzZmIC0gMGIpIC8gMgorICAgLmlmIFxpaXJfdGFwcyA8PSAxCitBICAgICAgIC53b3JkICAgNzdmCitUICAgICAgIC5od29yZCAgKDc3ZiAtIDBiKSAvIDIKKyAgICAuaWYgXGlpcl90YXBzID09IDAKK0EgICAgICAgLndvcmQgICA3OGYKK1QgICAgICAgLmh3b3JkICAoNzhmIC0gMGIpIC8gMgorICAgIC5lbmRpZgorICAgLmVuZGlmCisgIC5lbmRpZgorIC5lbmRpZgorNzA6ICAgICBpbXBsZW1lbnRfZmlsdGVyICBcbWFza19taW51czEsIFxzaGlmdF8wLCBcc2hpZnRfOCwgXGlpcl90YXBzLCAwCis3MTogICAgIGltcGxlbWVudF9maWx0ZXIgIFxtYXNrX21pbnVzMSwgXHNoaWZ0XzAsIFxzaGlmdF84LCBcaWlyX3RhcHMsIDEKKzcyOiAgICAgaW1wbGVtZW50X2ZpbHRlciAgXG1hc2tfbWludXMxLCBcc2hpZnRfMCwgXHNoaWZ0XzgsIFxpaXJfdGFwcywgMgorNzM6ICAgICBpbXBsZW1lbnRfZmlsdGVyICBcbWFza19taW51czEsIFxzaGlmdF8wLCBcc2hpZnRfOCwgXGlpcl90YXBzLCAzCis3NDogICAgIGltcGxlbWVudF9maWx0ZXIgIFxtYXNrX21pbnVzMSwgXHNoaWZ0XzAsIFxzaGlmdF84LCBcaWlyX3RhcHMsIDQKKyAuaWYgXGlpcl90YXBzIDw9IDMKKzc1OiAgICAgaW1wbGVtZW50X2ZpbHRlciAgXG1hc2tfbWludXMxLCBcc2hpZnRfMCwgXHNoaWZ0XzgsIFxpaXJfdGFwcywgNQorICAuaWYgXGlpcl90YXBzIDw9IDIKKzc2OiAgICAgaW1wbGVtZW50X2ZpbHRlciAgXG1hc2tfbWludXMxLCBcc2hpZnRfMCwgXHNoaWZ0XzgsIFxpaXJfdGFwcywgNgorICAgLmlmIFxpaXJfdGFwcyA8PSAxCis3NzogICAgIGltcGxlbWVudF9maWx0ZXIgIFxtYXNrX21pbnVzMSwgXHNoaWZ0XzAsIFxzaGlmdF84LCBcaWlyX3RhcHMsIDcKKyAgICAuaWYgXGlpcl90YXBzID09IDAKKzc4OiAgICAgaW1wbGVtZW50X2ZpbHRlciAgXG1hc2tfbWludXMxLCBcc2hpZnRfMCwgXHNoaWZ0XzgsIFxpaXJfdGFwcywgOAorICAgIC5lbmRpZgorICAgLmVuZGlmCisgIC5lbmRpZgorIC5lbmRpZgorLmVuZG0KKworLm1hY3JvIHN3aXRjaF9vbl9paXJfdGFwcyAgbWFza19taW51czEsIHNoaWZ0XzAsIHNoaWZ0XzgKK0EgICAgICAgbGRyICAgICBwYywgW3BjLCBhNCwgbHNsICMyXSAvLyBpcm9yZGVyIGlzIGluIHJhbmdlIDAtNAorVCAgICAgICB0YmggICAgIFtwYywgYTQsIGxzbCAjMV0KKzA6CitBICAgICAgIC53b3JkICAgMCwgNjBmLCA2MWYsIDYyZiwgNjNmLCA2NGYKK1QgICAgICAgLmh3b3JkICAoNjBmIC0gMGIpIC8gMiwgKDYxZiAtIDBiKSAvIDIsICg2MmYgLSAwYikgLyAyLCAoNjNmIC0gMGIpIC8gMiwgKDY0ZiAtIDBiKSAvIDIKKzYwOiAgICAgc3dpdGNoX29uX2Zpcl90YXBzICBcbWFza19taW51czEsIFxzaGlmdF8wLCBcc2hpZnRfOCwgMAorNjE6ICAgICBzd2l0Y2hfb25fZmlyX3RhcHMgIFxtYXNrX21pbnVzMSwgXHNoaWZ0XzAsIFxzaGlmdF84LCAxCis2MjogICAgIHN3aXRjaF9vbl9maXJfdGFwcyAgXG1hc2tfbWludXMxLCBcc2hpZnRfMCwgXHNoaWZ0XzgsIDIKKzYzOiAgICAgc3dpdGNoX29uX2Zpcl90YXBzICBcbWFza19taW51czEsIFxzaGlmdF8wLCBcc2hpZnRfOCwgMworNjQ6ICAgICBzd2l0Y2hfb25fZmlyX3RhcHMgIFxtYXNrX21pbnVzMSwgXHNoaWZ0XzAsIFxzaGlmdF84LCA0CisuZW5kbQorCisvKiB2b2lkIGZmX21scF9maWx0ZXJfY2hhbm5lbF9hcm0oaW50MzJfdCAqc3RhdGUsIGNvbnN0IGludDMyX3QgKmNvZWZmLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJvcmRlciwgaW50IGlpcm9yZGVyLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmaWx0ZXJfc2hpZnQsIGludDMyX3QgbWFzaywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzaXplLCBpbnQzMl90ICpzYW1wbGVfYnVmZmVyKTsKKyAqLworZnVuY3Rpb24gZmZfbWxwX2ZpbHRlcl9jaGFubmVsX2FybSwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICB7djEtZnAsbHJ9CisgICAgICAgIGFkZCAgICAgdjEsIHNwLCAjOSo0IC8vIHBvaW50IGF0IGFyZ3VtZW50cyBvbiBzdGFjaworICAgICAgICBsZG0gICAgIHYxLCB7U1QwLFNUMSxJLFBTQU1QfQorICAgICAgICBjbXAgICAgIFNUMSwgIy0xCisgICAgICAgIGJuZSAgICAgMzBmCisgICAgICAgIG1vdnMgICAgU1QyLCBTVDAsIGxzbCAjMjkgLy8gc2hpZnQgaXMgaW4gcmFuZ2UgMC0xNTsgd2Ugd2FudCB0byBzcGVjaWFsLWNhc2UgMCBhbmQgOAorICAgICAgICBibmUgICAgIDIwZgorICAgICAgICBiY3MgICAgIDEwZgorICAgICAgICBzd2l0Y2hfb25faWlyX3RhcHMgMSwgMSwgMAorMTA6ICAgICBzd2l0Y2hfb25faWlyX3RhcHMgMSwgMCwgMQorMjA6ICAgICBzd2l0Y2hfb25faWlyX3RhcHMgMSwgMCwgMAorMzA6ICAgICBtb3ZzICAgIFNUMiwgU1QwLCBsc2wgIzI5IC8vIHNoaWZ0IGlzIGluIHJhbmdlIDAtMTU7IHdlIHdhbnQgdG8gc3BlY2lhbC1jYXNlIDAgYW5kIDgKKyAgICAgICAgYm5lICAgICA1MGYKKyAgICAgICAgYmNzICAgICA0MGYKKyAgICAgICAgc3dpdGNoX29uX2lpcl90YXBzIDAsIDEsIDAKKzQwOiAgICAgc3dpdGNoX29uX2lpcl90YXBzIDAsIDAsIDEKKzUwOiAgICAgc3dpdGNoX29uX2lpcl90YXBzIDAsIDAsIDAKKzk5OiAgICAgcG9wICAgICB7djEtZnAscGN9CitlbmRmdW5jCisKKyAgICAgICAgLnVucmVxICBQU1QKKyAgICAgICAgLnVucmVxICBQQ08KKyAgICAgICAgLnVucmVxICBBQzAKKyAgICAgICAgLnVucmVxICBBQzEKKyAgICAgICAgLnVucmVxICBDTzAKKyAgICAgICAgLnVucmVxICBDTzEKKyAgICAgICAgLnVucmVxICBDTzIKKyAgICAgICAgLnVucmVxICBDTzMKKyAgICAgICAgLnVucmVxICBTVDAKKyAgICAgICAgLnVucmVxICBTVDEKKyAgICAgICAgLnVucmVxICBTVDIKKyAgICAgICAgLnVucmVxICBTVDMKKyAgICAgICAgLnVucmVxICBJCisgICAgICAgIC51bnJlcSAgUFNBTVAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitQU0EgICAgIC5yZXEgICAgYTEgLy8gc2FtcGxlcworUENPICAgICAucmVxICAgIGEyIC8vIGNvZWZmcworUEJMICAgICAucmVxICAgIGEzIC8vIGJ5cGFzc2VkX2xzYnMKK0lOREVYICAgLnJlcSAgICBhNAorQ08wICAgICAucmVxICAgIHYxCitDTzEgICAgIC5yZXEgICAgdjIKK0NPMiAgICAgLnJlcSAgICB2MworQ08zICAgICAucmVxICAgIHY0CitTQTAgICAgIC5yZXEgICAgdjUKK1NBMSAgICAgLnJlcSAgICB2NgorU0EyICAgICAucmVxICAgIHNsCitTQTMgICAgIC5yZXEgICAgZnAKK0FDMCAgICAgLnJlcSAgICBpcAorQUMxICAgICAucmVxICAgIGxyCitOT0lTRSAgIC5yZXEgICAgU0EwCitMU0IgICAgIC5yZXEgICAgU0ExCitEQ0ggICAgIC5yZXEgICAgU0EyIC8vIGRlc3RfY2gKK01BU0sgICAgLnJlcSAgICBTQTMKKworICAgIC8vIElOREVYIGlzIHVzZWQgYXMgZm9sbG93czoKKyAgICAvLyBiaXRzIDAuLjYgICBpbmRleDIgKHZhbHVlcyB1cCB0byAxNywgYnV0IHdpZGVyIHNvIHRoYXQgd2UgY2FuCisgICAgLy8gICAgICAgICAgICAgICBhZGQgdG8gaW5kZXggZmllbGQgd2l0aG91dCBuZWVkaW5nIHRvIG1hc2spCisgICAgLy8gYml0cyA3Li4xNCAgaSAodmFsdWVzIHVwIHRvIDE2MCkKKyAgICAvLyBiaXQgMTUgICAgICB1bmRlcmZsb3cgZGV0ZWN0IGZvciBpCisgICAgLy8gYml0cyAyNS4uMzEgKGlmIGFjY2Vzc191bml0X3NpemVfcG93MiA9PSAxMjgpICBcIGluZGV4CisgICAgLy8gYml0cyAyNi4uMzEgKGlmIGFjY2Vzc191bml0X3NpemVfcG93MiA9PSA2NCkgICAvCisKKy5tYWNybyBpbXBsZW1lbnRfcmVtYXRyaXggIHNoaWZ0LCBpbmRleF9tYXNrLCBtYXNrX21pbnVzMSwgbWF4Y2hhbgorICAgIC5pZiBcbWF4Y2hhbiA9PSAxCisgICAgICAgIC8vIFdlIGNhbiBqdXN0IGxlYXZlIHRoZSBjb2VmZmljaWVudHMgaW4gcmVnaXN0ZXJzIGluIHRoaXMgY2FzZQorICAgICAgICBsZHJkICAgIENPMCwgQ08xLCBbUENPXQorICAgIC5lbmRpZgorMToKKyAgICAuaWYgXG1heGNoYW4gPT0gMQorICAgICAgICBsZHJkICAgIFNBMCwgU0ExLCBbUFNBXQorICAgICAgICBzbXVsbCAgIEFDMCwgQUMxLCBDTzAsIFNBMAorICAgIC5lbHNlaWYgXG1heGNoYW4gPT0gNQorICAgICAgICBsZHIgICAgIENPMCwgW1BDTywgIzBdCisgICAgICAgIGxkciAgICAgU0EwLCBbUFNBLCAjMF0KKyAgICAgICAgbGRyICAgICBDTzEsIFtQQ08sICM0XQorICAgICAgICBsZHIgICAgIFNBMSwgW1BTQSwgIzRdCisgICAgICAgIGxkcmQgICAgQ08yLCBDTzMsIFtQQ08sICM4XQorICAgICAgICBzbXVsbCAgIEFDMCwgQUMxLCBDTzAsIFNBMAorICAgICAgICBsZHJkICAgIFNBMiwgU0EzLCBbUFNBLCAjOF0KKyAgICAgICAgc21sYWwgICBBQzAsIEFDMSwgQ08xLCBTQTEKKyAgICAgICAgbGRyZCAgICBDTzAsIENPMSwgW1BDTywgIzE2XQorICAgICAgICBzbWxhbCAgIEFDMCwgQUMxLCBDTzIsIFNBMgorICAgICAgICBsZHJkICAgIFNBMCwgU0ExLCBbUFNBLCAjMTZdCisgICAgICAgIHNtbGFsICAgQUMwLCBBQzEsIENPMywgU0EzCisgICAgICAgIHNtbGFsICAgQUMwLCBBQzEsIENPMCwgU0EwCisgICAgLmVsc2UgLy8gXG1heGNoYW4gPT0gNworICAgICAgICBsZHIgICAgIENPMiwgW1BDTywgIzBdCisgICAgICAgIGxkciAgICAgU0EyLCBbUFNBLCAjMF0KKyAgICAgICAgbGRyICAgICBDTzMsIFtQQ08sICM0XQorICAgICAgICBsZHIgICAgIFNBMywgW1BTQSwgIzRdCisgICAgICAgIGxkcmQgICAgQ08wLCBDTzEsIFtQQ08sICM4XQorICAgICAgICBzbXVsbCAgIEFDMCwgQUMxLCBDTzIsIFNBMgorICAgICAgICBsZHJkICAgIFNBMCwgU0ExLCBbUFNBLCAjOF0KKyAgICAgICAgc21sYWwgICBBQzAsIEFDMSwgQ08zLCBTQTMKKyAgICAgICAgbGRyZCAgICBDTzIsIENPMywgW1BDTywgIzE2XQorICAgICAgICBzbWxhbCAgIEFDMCwgQUMxLCBDTzAsIFNBMAorICAgICAgICBsZHJkICAgIFNBMiwgU0EzLCBbUFNBLCAjMTZdCisgICAgICAgIHNtbGFsICAgQUMwLCBBQzEsIENPMSwgU0ExCisgICAgICAgIGxkcmQgICAgQ08wLCBDTzEsIFtQQ08sICMyNF0KKyAgICAgICAgc21sYWwgICBBQzAsIEFDMSwgQ08yLCBTQTIKKyAgICAgICAgbGRyZCAgICBTQTAsIFNBMSwgW1BTQSwgIzI0XQorICAgICAgICBzbWxhbCAgIEFDMCwgQUMxLCBDTzMsIFNBMworICAgICAgICBzbWxhbCAgIEFDMCwgQUMxLCBDTzAsIFNBMAorICAgIC5lbmRpZgorICAgICAgICBsZG0gICAgIHNwLCB7Tk9JU0UsIERDSCwgTUFTS30KKyAgICAgICAgc21sYWwgICBBQzAsIEFDMSwgQ08xLCBTQTEKKyAgICAuaWYgXHNoaWZ0ICE9IDAKKyAgICAgIC5pZiBcaW5kZXhfbWFzayA9PSA2MworICAgICAgICBhZGQgICAgIE5PSVNFLCBOT0lTRSwgSU5ERVgsIGxzciAjMzItNgorICAgICAgICBsZHJiICAgIExTQiwgW1BCTF0sICNNQVhfQ0hBTk5FTFMKKyAgICAgICAgbGRyc2IgICBOT0lTRSwgW05PSVNFXQorICAgICAgICBhZGQgICAgIElOREVYLCBJTkRFWCwgSU5ERVgsIGxzbCAjMzItNgorICAgICAgLmVsc2UgLy8gXGluZGV4X21hc2sgPT0gMTI3CisgICAgICAgIGFkZCAgICAgTk9JU0UsIE5PSVNFLCBJTkRFWCwgbHNyICMzMi03CisgICAgICAgIGxkcmIgICAgTFNCLCBbUEJMXSwgI01BWF9DSEFOTkVMUworICAgICAgICBsZHJzYiAgIE5PSVNFLCBbTk9JU0VdCisgICAgICAgIGFkZCAgICAgSU5ERVgsIElOREVYLCBJTkRFWCwgbHNsICMzMi03CisgICAgICAuZW5kaWYKKyAgICAgICAgc3ViICAgICBJTkRFWCwgSU5ERVgsICMxPDw3CisgICAgICAgIGFkZHMgICAgQUMwLCBBQzAsIE5PSVNFLCBsc2wgI1xzaGlmdCArIDcKKyAgICAgICAgYWRjICAgICBBQzEsIEFDMSwgTk9JU0UsIGFzciAjMzEKKyAgICAuZWxzZQorICAgICAgICBsZHJiICAgIExTQiwgW1BCTF0sICNNQVhfQ0hBTk5FTFMKKyAgICAgICAgc3ViICAgICBJTkRFWCwgSU5ERVgsICMxPDw3CisgICAgLmVuZGlmCisgICAgICAgIGFkZCAgICAgUFNBLCBQU0EsICNNQVhfQ0hBTk5FTFMqNAorICAgICAgICBtb3YgICAgIEFDMCwgQUMwLCBsc3IgIzE0CisgICAgICAgIG9yciAgICAgQUMwLCBBQzAsIEFDMSwgbHNsICMxOAorICAgIC5pZiAhXG1hc2tfbWludXMxCisgICAgICAgIGFuZCAgICAgQUMwLCBBQzAsIE1BU0sKKyAgICAuZW5kaWYKKyAgICAgICAgYWRkICAgICBBQzAsIEFDMCwgTFNCCisgICAgICAgIHRzdCAgICAgSU5ERVgsICMxPDwxNQorICAgICAgICBzdHIgICAgIEFDMCwgW1BTQSwgRENILCBsc2wgIzJdICAvLyBEQ0ggaXMgcHJlY29tcGVuc2F0ZWQgZm9yIHRoZSBlYXJseSBpbmNyZW1lbnQgb2YgUFNBCisgICAgICAgIGJlcSAgICAgMWIKKyAgICAgICAgYiAgICAgICA5OGYKKy5lbmRtCisKKy5tYWNybyBzd2l0Y2hfb25fbWF4Y2hhbiAgc2hpZnQsIGluZGV4X21hc2ssIG1hc2tfbWludXMxCisgICAgICAgIGNtcCAgICAgdjQsICM1CisgICAgICAgIGJsbyAgICAgNTFmCisgICAgICAgIGJlcSAgICAgNTBmCisgICAgICAgIGltcGxlbWVudF9yZW1hdHJpeCAgXHNoaWZ0LCBcaW5kZXhfbWFzaywgXG1hc2tfbWludXMxLCA3Cis1MDogICAgIGltcGxlbWVudF9yZW1hdHJpeCAgXHNoaWZ0LCBcaW5kZXhfbWFzaywgXG1hc2tfbWludXMxLCA1Cis1MTogICAgIGltcGxlbWVudF9yZW1hdHJpeCAgXHNoaWZ0LCBcaW5kZXhfbWFzaywgXG1hc2tfbWludXMxLCAxCisuZW5kbQorCisubWFjcm8gc3dpdGNoX29uX21hc2sgIHNoaWZ0LCBpbmRleF9tYXNrCisgICAgICAgIGNtcCAgICAgc2wsICMtMQorICAgICAgICBibmUgICAgIDQwZgorICAgICAgICBzd2l0Y2hfb25fbWF4Y2hhbiAgXHNoaWZ0LCBcaW5kZXhfbWFzaywgMQorNDA6ICAgICBzd2l0Y2hfb25fbWF4Y2hhbiAgXHNoaWZ0LCBcaW5kZXhfbWFzaywgMAorLmVuZG0KKworLm1hY3JvIHN3aXRjaF9vbl9hdV9zaXplICBzaGlmdAorICAuaWYgXHNoaWZ0ID09IDAKKyAgICAgICAgc3dpdGNoX29uX21hc2sgIFxzaGlmdCwgdW5kZWZpbmVkCisgIC5lbHNlCisgICAgICAgIHRlcSAgICAgdjYsICM2NAorICAgICAgICBibmUgICAgIDMwZgorICAgICAgICBvcnIgICAgIElOREVYLCBJTkRFWCwgdjEsIGxzbCAjMzItNgorICAgICAgICBzd2l0Y2hfb25fbWFzayAgXHNoaWZ0LCA2MworMzA6ICAgICBvcnIgICAgIElOREVYLCBJTkRFWCwgdjEsIGxzbCAjMzItNworICAgICAgICBzd2l0Y2hfb25fbWFzayAgXHNoaWZ0LCAxMjcKKyAgLmVuZGlmCisuZW5kbQorCisvKiB2b2lkIGZmX21scF9yZW1hdHJpeF9jaGFubmVsX2FybShpbnQzMl90ICpzYW1wbGVzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqY29lZmZzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnlwYXNzZWRfbHNicywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqbm9pc2VfYnVmZmVyLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfY2gsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBibG9ja3BvcywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhjaGFuLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeF9ub2lzZV9zaGlmdCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2Nlc3NfdW5pdF9zaXplX3BvdzIsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1hc2spOworICovCitmdW5jdGlvbiBmZl9tbHBfcmVtYXRyaXhfY2hhbm5lbF9hcm0sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAge3YxLWZwLGxyfQorICAgICAgICBhZGQgICAgIHYxLCBzcCwgIzkqNCAvLyBwb2ludCBhdCBhcmd1bWVudHMgb24gc3RhY2sKKyAgICAgICAgbGRtICAgICB2MSwge3YxLXNsfQorICAgICAgICB0ZXEgICAgIHY0LCAjMQorICAgICAgICBpdHQgICAgIG5lCisgICAgICAgIHRlcW5lICAgdjQsICM1CisgICAgICAgIHRlcW5lICAgdjQsICM3CisgICAgICAgIGJuZSAgICAgOTlmCisgICAgICAgIHRlcSAgICAgdjYsICM2NAorICAgICAgICBpdCAgICAgIG5lCisgICAgICAgIHRlcW5lICAgdjYsICMxMjgKKyAgICAgICAgYm5lICAgICA5OWYKKyAgICAgICAgc3ViICAgICB2MiwgdjIsICNNQVhfQ0hBTk5FTFMKKyAgICAgICAgcHVzaCAgICB7YTQsdjIsc2x9ICAgICAgICAgIC8vIGluaXRpYWxpc2UgTk9JU0UsRENILE1BU0s7IG1ha2Ugc3AgZHdvcmQtYWxpZ25lZAorICAgICAgICBtb3ZzICAgIElOREVYLCB2MywgbHNsICM3CisgICAgICAgIGJlcSAgICAgOThmICAgICAgICAgICAgICAgICAvLyBqdXN0IGluIGNhc2UsIGRvIG5vdGhpbmcgaWYgYmxvY2twb3MgPSAwCisgICAgICAgIHN1YnMgICAgSU5ERVgsIElOREVYLCAjMTw8NyAvLyBvZmZzZXQgYnkgMSBzbyB3ZSBib3Jyb3cgYXQgdGhlIHJpZ2h0IHRpbWUKKyAgICAgICAgYWRjICAgICBsciwgdjEsIHYxICAgICAgICAgIC8vIGNhbGN1bGF0ZSBpbmRleDIgKEMgd2FzIHNldCBieSBwcmVjZWRpbmcgc3VicykKKyAgICAgICAgb3JyICAgICBJTkRFWCwgSU5ERVgsIGxyCisgICAgICAgIC8vIFN3aXRjaCBvbiBtYXRyaXhfbm9pc2Vfc2hpZnQ6IHZhbHVlcyAwIGFuZCAxIGFyZQorICAgICAgICAvLyBkaXNwcm9wb3J0aW9uYXRlbHkgY29tbW9uIHNvIGRvIHRob3NlIGluIGEgZm9ybSB0aGUgYnJhbmNoCisgICAgICAgIC8vIHByZWRpY3RvciBjYW4gYWNjZWxlcmF0ZS4gVmFsdWVzIGNhbiBvbmx5IGdvIHVwIHRvIDE1LgorICAgICAgICBjbXAgICAgIHY1LCAjMQorICAgICAgICBiZXEgICAgIDExZgorICAgICAgICBibG8gICAgIDEwZgorQSAgICAgICBsZHIgICAgIHBjLCBbcGMsIHY1LCBsc2wgIzJdCitUICAgICAgIHRiaCAgICAgW3BjLCB2NSwgbHNsICMxXQorMDoKK0EgICAgICAgLndvcmQgICAwLCAwLCAwLCAxMmYsIDEzZiwgMTRmLCAxNWYsIDE2ZiwgMTdmLCAxOGYsIDE5ZiwgMjBmLCAyMWYsIDIyZiwgMjNmLCAyNGYsIDI1ZgorVCAgICAgICAuaHdvcmQgIDAsIDAsICgxMmYgLSAwYikgLyAyLCAoMTNmIC0gMGIpIC8gMiwgKDE0ZiAtIDBiKSAvIDIsICgxNWYgLSAwYikgLyAyCitUICAgICAgIC5od29yZCAgKDE2ZiAtIDBiKSAvIDIsICgxN2YgLSAwYikgLyAyLCAoMThmIC0gMGIpIC8gMiwgKDE5ZiAtIDBiKSAvIDIKK1QgICAgICAgLmh3b3JkICAoMjBmIC0gMGIpIC8gMiwgKDIxZiAtIDBiKSAvIDIsICgyMmYgLSAwYikgLyAyLCAoMjNmIC0gMGIpIC8gMiwgKDI0ZiAtIDBiKSAvIDIsICgyNWYgLSAwYikgLyAyCisxMDogICAgIHN3aXRjaF9vbl9hdV9zaXplICAwCisxMTogICAgIHN3aXRjaF9vbl9hdV9zaXplICAxCisxMjogICAgIHN3aXRjaF9vbl9hdV9zaXplICAyCisxMzogICAgIHN3aXRjaF9vbl9hdV9zaXplICAzCisxNDogICAgIHN3aXRjaF9vbl9hdV9zaXplICA0CisxNTogICAgIHN3aXRjaF9vbl9hdV9zaXplICA1CisxNjogICAgIHN3aXRjaF9vbl9hdV9zaXplICA2CisxNzogICAgIHN3aXRjaF9vbl9hdV9zaXplICA3CisxODogICAgIHN3aXRjaF9vbl9hdV9zaXplICA4CisxOTogICAgIHN3aXRjaF9vbl9hdV9zaXplICA5CisyMDogICAgIHN3aXRjaF9vbl9hdV9zaXplICAxMAorMjE6ICAgICBzd2l0Y2hfb25fYXVfc2l6ZSAgMTEKKzIyOiAgICAgc3dpdGNoX29uX2F1X3NpemUgIDEyCisyMzogICAgIHN3aXRjaF9vbl9hdV9zaXplICAxMworMjQ6ICAgICBzd2l0Y2hfb25fYXVfc2l6ZSAgMTQKKzI1OiAgICAgc3dpdGNoX29uX2F1X3NpemUgIDE1CisKKzk4OiAgICAgYWRkICAgICBzcCwgc3AsICMzKjQKKyAgICAgICAgcG9wICAgICB7djEtZnAscGN9Cis5OTogICAgIC8vIENhbid0IGhhbmRsZSB0aGVzZSBwYXJhbWV0ZXJzLCBkcm9wIGJhY2sgdG8gQworICAgICAgICBwb3AgICAgIHt2MS1mcCxscn0KKyAgICAgICAgYiAgICAgICBYKGZmX21scF9yZW1hdHJpeF9jaGFubmVsKQorZW5kZnVuYworCisgICAgICAgIC51bnJlcSAgUFNBCisgICAgICAgIC51bnJlcSAgUENPCisgICAgICAgIC51bnJlcSAgUEJMCisgICAgICAgIC51bnJlcSAgSU5ERVgKKyAgICAgICAgLnVucmVxICBDTzAKKyAgICAgICAgLnVucmVxICBDTzEKKyAgICAgICAgLnVucmVxICBDTzIKKyAgICAgICAgLnVucmVxICBDTzMKKyAgICAgICAgLnVucmVxICBTQTAKKyAgICAgICAgLnVucmVxICBTQTEKKyAgICAgICAgLnVucmVxICBTQTIKKyAgICAgICAgLnVucmVxICBTQTMKKyAgICAgICAgLnVucmVxICBBQzAKKyAgICAgICAgLnVucmVxICBBQzEKKyAgICAgICAgLnVucmVxICBOT0lTRQorICAgICAgICAudW5yZXEgIExTQgorICAgICAgICAudW5yZXEgIERDSAorICAgICAgICAudW5yZXEgIE1BU0sKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tbHBkc3BfYXJtdjYuUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tbHBkc3BfYXJtdjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOThmODA3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21scGRzcF9hcm12Ni5TCkBAIC0wLDAgKzEsNTMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFJJU0MgT1MgT3BlbiBMdGQKKyAqIEF1dGhvcjogQmVuIEF2aXNvbiA8YmF2aXNvbkByaXNjb3NvcGVuLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKKy5tYWNybyBsb2FkcmVnb2Zmc2gyICBncm91cCwgaW5kZXgsIGJhc2UsIG9mZmdyb3VwLCBvZmZpbmRleAorICAgICAgIC5hbHRtYWNybworICAgICAgIGxvYWRyZWdvZmZzaDJfIFxncm91cCwgJShcaW5kZXgpLCBcYmFzZSwgXG9mZmdyb3VwLCAlKFxvZmZpbmRleCkKKyAgICAgICAubm9hbHRtYWNybworLmVuZG0KKworLm1hY3JvIGxvYWRyZWdvZmZzaDJfIGdyb3VwLCBpbmRleCwgYmFzZSwgb2ZmZ3JvdXAsIG9mZmluZGV4CisgICAgICAgIGxkciAgICAgXGdyb3VwXGluZGV4LCBbXGJhc2UsIFxvZmZncm91cFxvZmZpbmRleCwgbHNsICMyXQorLmVuZG0KKworLm1hY3JvIGVvcmxzbHJlZyAgY2hlY2ssIGRhdGEsIGdyb3VwLCBpbmRleAorICAgICAgICAuYWx0bWFjcm8KKyAgICAgICAgZW9ybHNscmVnXyBcY2hlY2ssIFxkYXRhLCBcZ3JvdXAsICUoXGluZGV4KQorICAgICAgICAubm9hbHRtYWNybworLmVuZG0KKworLm1hY3JvIGVvcmxzbHJlZ18gY2hlY2ssIGRhdGEsIGdyb3VwLCBpbmRleAorICAgICAgICBlb3IgICAgIFxjaGVjaywgXGNoZWNrLCBcZGF0YSwgbHNsIFxncm91cFxpbmRleAorLmVuZG0KKworLm1hY3JvIGRlY3JfbW9kdWxvIHZhciwgYnksIG1vZHVsdXMKKyAuc2V0IFx2YXIsIFx2YXIgLSBcYnkKKyAuaWYgXHZhciA9PSAwCisgIC5zZXQgXHZhciwgXG1vZHVsdXMKKyAuZW5kaWYKKy5lbmRtCisKKyAubWFjcm8gbG9hZF9ncm91cDEgIHNpemUsIGNoYW5uZWxzLCByMCwgcjEsIHIyLCByMywgcG9pbnRlcl9kZWFkPTAKKyAgLmlmIFxzaXplID09IDIKKyAgICAgICAgbGRyZCAgICBccjAsIFxyMSwgW0lOXSwgIyhcc2l6ZSArIDggLSBcY2hhbm5lbHMpICogNAorICAuZWxzZSAvLyBzaXplID09IDQKKyAgIC5pZiBJRFgxID4gNCB8fCBcY2hhbm5lbHM9PTgKKyAgICAgICAgbGRtICAgICBJTiEsIHtccjAsIFxyMSwgXHIyLCBccjN9CisgICAuZWxzZQorICAgICAgICBsZG0gICAgIElOLCB7XHIwLCBccjEsIFxyMiwgXHIzfQorICAgIC5pZiAhXHBvaW50ZXJfZGVhZAorICAgICAgICBhZGQgICAgIElOLCBJTiwgIyg0ICsgOCAtIFxjaGFubmVscykgKiA0CisgICAgIC5lbmRpZgorICAgLmVuZGlmCisgIC5lbmRpZgorICAgICAgICBkZWNyX21vZHVsbyBJRFgxLCBcc2l6ZSwgXGNoYW5uZWxzCisgLmVuZG0KKworIC5tYWNybyBsb2FkX2dyb3VwMiAgc2l6ZSwgY2hhbm5lbHMsIHIwLCByMSwgcjIsIHIzLCBwb2ludGVyX2RlYWQ9MAorICAuaWYgXHNpemUgPT0gMgorICAgLmlmIElEWDEgPiAyCisgICAgICAgIGxkbSAgICAgSU4hLCB7XHIyLCBccjN9CisgICAuZWxzZQorLy9BICAgLmlmYyBccjIsIGlwCisvL0EgICAgLmlmIFxwb2ludGVyX2RlYWQKKy8vQSAgICAgICBsZG0gICAgIElOLCB7XHIyLCBccjN9CisvL0EgICAgLmVsc2UKKy8vQSAgICAgICBsZHIgICAgIFxyMiwgW0lOXSwgIzQKKy8vQSAgICAgICBsZHIgICAgIFxyMywgW0lOXSwgIyhcc2l6ZSAtIDEgKyA4IC0gXGNoYW5uZWxzKSAqIDQKKy8vQSAgICAuZW5kaWYKKy8vQSAgIC5lbHNlCisgICAgICAgIGxkcmQgICAgXHIyLCBccjMsIFtJTl0sICMoXHNpemUgKyA4IC0gXGNoYW5uZWxzKSAqIDQKKy8vQSAgIC5lbmRpZgorICAgLmVuZGlmCisgIC5lbmRpZgorICAgICAgICBkZWNyX21vZHVsbyBJRFgxLCBcc2l6ZSwgXGNoYW5uZWxzCisgLmVuZG0KKworLm1hY3JvIGltcGxlbWVudF9wYWNrICBpbm9yZGVyLCBjaGFubmVscywgc2hpZnQKKy5pZiBcaW5vcmRlcgorLmlmYyBcc2hpZnQsIG1peGVkCisKK0NIRUNLICAgLnJlcSAgICBhMQorQ09VTlQgICAucmVxICAgIGEyCitJTiAgICAgIC5yZXEgICAgYTMKK09VVCAgICAgLnJlcSAgICBhNAorREFUMCAgICAucmVxICAgIHYxCitEQVQxICAgIC5yZXEgICAgdjIKK0RBVDIgICAgLnJlcSAgICB2MworREFUMyAgICAucmVxICAgIHY0CitTSElGVDAgIC5yZXEgICAgdjUKK1NISUZUMSAgLnJlcSAgICB2NgorU0hJRlQyICAucmVxICAgIHNsCitTSElGVDMgIC5yZXEgICAgZnAKK1NISUZUNCAgLnJlcSAgICBpcAorU0hJRlQ1ICAucmVxICAgIGxyCisKKyAubWFjcm8gb3V0cHV0NHdvcmRzCisgIC5zZXQgU0laRV9HUk9VUDEsIElEWDEKKyAgLmlmIFNJWkVfR1JPVVAxID4gNAorICAgLnNldCBTSVpFX0dST1VQMSwgNAorICAuZW5kaWYKKyAgLnNldCBTSVpFX0dST1VQMiwgNCAtIFNJWkVfR1JPVVAxCisgICAgICAgIGxvYWRfZ3JvdXAxICBTSVpFX0dST1VQMSwgXGNoYW5uZWxzLCBEQVQwLCBEQVQxLCBEQVQyLCBEQVQzCisgICAgICAgIGxvYWRfZ3JvdXAyICBTSVpFX0dST1VQMiwgXGNoYW5uZWxzLCBEQVQwLCBEQVQxLCBEQVQyLCBEQVQzCisgICAuaWYgXGNoYW5uZWxzID09IDIKKyAgICAgICAgbHNsICAgICBEQVQwLCBTSElGVDAKKyAgICAgICAgbHNsICAgICBEQVQxLCBTSElGVDEKKyAgICAgICAgbHNsICAgICBEQVQyLCBTSElGVDAKKyAgICAgICAgbHNsICAgICBEQVQzLCBTSElGVDEKKyAgIC5lbHNlaWYgXGNoYW5uZWxzID09IDYKKyAgICAuaWYgSURYMiA9PSA2CisgICAgICAgIGxzbCAgICAgREFUMCwgU0hJRlQwCisgICAgICAgIGxzbCAgICAgREFUMSwgU0hJRlQxCisgICAgICAgIGxzbCAgICAgREFUMiwgU0hJRlQyCisgICAgICAgIGxzbCAgICAgREFUMywgU0hJRlQzCisgICAgLmVsc2VpZiBJRFgyID09IDIKKyAgICAgICAgbHNsICAgICBEQVQwLCBTSElGVDQKKyAgICAgICAgbHNsICAgICBEQVQxLCBTSElGVDUKKyAgICAgICAgbHNsICAgICBEQVQyLCBTSElGVDAKKyAgICAgICAgbHNsICAgICBEQVQzLCBTSElGVDEKKyAgICAuZWxzZSAvLyBJRFgyID09IDQKKyAgICAgICAgbHNsICAgICBEQVQwLCBTSElGVDIKKyAgICAgICAgbHNsICAgICBEQVQxLCBTSElGVDMKKyAgICAgICAgbHNsICAgICBEQVQyLCBTSElGVDQKKyAgICAgICAgbHNsICAgICBEQVQzLCBTSElGVDUKKyAgICAuZW5kaWYKKyAgIC5lbHNlaWYgXGNoYW5uZWxzID09IDgKKyAgICAuaWYgSURYMiA9PSA4CisgICAgICAgIHV4dGIgICAgU0hJRlQwLCBTSElGVDQsIHJvciAjMAorICAgICAgICB1eHRiICAgIFNISUZUMSwgU0hJRlQ0LCByb3IgIzgKKyAgICAgICAgdXh0YiAgICBTSElGVDIsIFNISUZUNCwgcm9yICMxNgorICAgICAgICB1eHRiICAgIFNISUZUMywgU0hJRlQ0LCByb3IgIzI0CisgICAgLmVsc2UKKyAgICAgICAgdXh0YiAgICBTSElGVDAsIFNISUZUNSwgcm9yICMwCisgICAgICAgIHV4dGIgICAgU0hJRlQxLCBTSElGVDUsIHJvciAjOAorICAgICAgICB1eHRiICAgIFNISUZUMiwgU0hJRlQ1LCByb3IgIzE2CisgICAgICAgIHV4dGIgICAgU0hJRlQzLCBTSElGVDUsIHJvciAjMjQKKyAgICAuZW5kaWYKKyAgICAgICAgbHNsICAgICBEQVQwLCBTSElGVDAKKyAgICAgICAgbHNsICAgICBEQVQxLCBTSElGVDEKKyAgICAgICAgbHNsICAgICBEQVQyLCBTSElGVDIKKyAgICAgICAgbHNsICAgICBEQVQzLCBTSElGVDMKKyAgIC5lbmRpZgorICAgICAgICBlb3IgICAgIENIRUNLLCBDSEVDSywgREFUMCwgbHNyICM4IC0gKFxjaGFubmVscyAtIElEWDIpCisgICAgICAgIGVvciAgICAgQ0hFQ0ssIENIRUNLLCBEQVQxLCBsc3IgIzcgLSAoXGNoYW5uZWxzIC0gSURYMikKKyAgIGRlY3JfbW9kdWxvIElEWDIsIDIsIFxjaGFubmVscworICAgICAgICBlb3IgICAgIENIRUNLLCBDSEVDSywgREFUMiwgbHNyICM4IC0gKFxjaGFubmVscyAtIElEWDIpCisgICAgICAgIGVvciAgICAgQ0hFQ0ssIENIRUNLLCBEQVQzLCBsc3IgIzcgLSAoXGNoYW5uZWxzIC0gSURYMikKKyAgIGRlY3JfbW9kdWxvIElEWDIsIDIsIFxjaGFubmVscworICAgICAgICBzdG0gICAgIE9VVCEsIHtEQVQwIC0gREFUM30KKyAuZW5kbQorCisgLnNldCBXT1JEU19QRVJfTE9PUCwgXGNoYW5uZWxzICAvLyBjYWxjdWxhdGUgTENNIChjaGFubmVscywgNCkKKyAuaWYgKFdPUkRTX1BFUl9MT09QICUgMikgPT0gMAorICAuc2V0IFdPUkRTX1BFUl9MT09QLCBXT1JEU19QRVJfTE9PUCAvIDIKKyAuZW5kaWYKKyAuaWYgKFdPUkRTX1BFUl9MT09QICUgMikgPT0gMAorICAuc2V0IFdPUkRTX1BFUl9MT09QLCBXT1JEU19QRVJfTE9PUCAvIDIKKyAuZW5kaWYKKyAuc2V0IFdPUkRTX1BFUl9MT09QLCBXT1JEU19QRVJfTE9PUCAqIDQKKyAuc2V0IFNBTVBMRVNfUEVSX0xPT1AsIFdPUkRTX1BFUl9MT09QIC8gXGNoYW5uZWxzCisKK2Z1bmN0aW9uIGZmX21scF9wYWNrX291dHB1dF9pbm9yZGVyX1xjaGFubmVsc1woKWNoX21peGVkc2hpZnRfYXJtdjYsIGV4cG9ydD0xCisgLmlmIFNBTVBMRVNfUEVSX0xPT1AgPiAxCisgICAgICAgIHRzdCAgICAgQ09VTlQsICNTQU1QTEVTX1BFUl9MT09QIC0gMSAgLy8gYWx3YXlzIHNlZW1zIHRvIGJlIGluIHByYWN0aWNlCisgICAgICAgIGl0ICAgICAgbmUKKyAgICAgICAgYm5lICAgICBYKGZmX21scF9wYWNrX291dHB1dCkgICAgICAgICAvLyBidXQganVzdCBpbiBjYXNlLCBicmFuY2ggdG8gQyBpbXBsZW1lbnRhdGlvbiBpZiBub3QKKyAuZW5kaWYKKyAgICAgICAgdGVxICAgICBDT1VOVCwgIzAKKyAgICAgICAgaXQgICAgICBlcQorICAgICAgICBieGVxICAgIGxyCisgICAgICAgIHB1c2ggICAge3YxLXY2LHNsLGZwLGxyfQorICAgICAgICBsZHIgICAgIFNISUZUMCwgW3NwLCAjKDkrMSkqNF0gIC8vIGdldCBvdXRwdXRfc2hpZnQgZnJvbSBzdGFjaworICAgICAgICBsZHIgICAgIFNISUZUMSwgPTB4MDgwODA4MDgKKyAgICAgICAgbGRyICAgICBTSElGVDQsIFtTSElGVDBdCisgLmlmIFxjaGFubmVscyA9PSAyCisgICAgICAgIHVhZGQ4ICAgU0hJRlQ0LCBTSElGVDQsIFNISUZUMSAvLyBpbmNyZWFzZSBhbGwgc2hpZnRzIGJ5IDgKKyAgICAgICAgdXh0YiAgICBTSElGVDAsIFNISUZUNCwgcm9yICMwCisgICAgICAgIHV4dGIgICAgU0hJRlQxLCBTSElGVDQsIHJvciAjOAorIC5lbHNlCisgICAgICAgIGxkciAgICAgU0hJRlQ1LCBbU0hJRlQwLCAjNF0KKyAgICAgICAgdWFkZDggICBTSElGVDQsIFNISUZUNCwgU0hJRlQxIC8vIGluY3JlYXNlIGFsbCBzaGlmdHMgYnkgOAorICAgICAgICB1YWRkOCAgIFNISUZUNSwgU0hJRlQ1LCBTSElGVDEKKyAgLmlmIFxjaGFubmVscyA9PSA2CisgICAgICAgIHV4dGIgICAgU0hJRlQwLCBTSElGVDQsIHJvciAjMAorICAgICAgICB1eHRiICAgIFNISUZUMSwgU0hJRlQ0LCByb3IgIzgKKyAgICAgICAgdXh0YiAgICBTSElGVDIsIFNISUZUNCwgcm9yICMxNgorICAgICAgICB1eHRiICAgIFNISUZUMywgU0hJRlQ0LCByb3IgIzI0CisgICAgICAgIHV4dGIgICAgU0hJRlQ0LCBTSElGVDUsIHJvciAjMAorICAgICAgICB1eHRiICAgIFNISUZUNSwgU0hJRlQ1LCByb3IgIzgKKyAgLmVuZGlmCisgLmVuZGlmCisgLnNldCBJRFgxLCBcY2hhbm5lbHMKKyAuc2V0IElEWDIsIFxjaGFubmVscworMDoKKyAucmVwdCBXT1JEU19QRVJfTE9PUCAvIDQKKyAgICAgICAgb3V0cHV0NHdvcmRzCisgLmVuZHIKKyAgICAgICAgc3VicyAgICBDT1VOVCwgQ09VTlQsICNTQU1QTEVTX1BFUl9MT09QCisgICAgICAgIGJuZSAgICAgMGIKKyAgICAgICAgcG9wICAgICB7djEtdjYsc2wsZnAscGN9CisgICAgICAgIC5sdG9yZworZW5kZnVuYworIC5wdXJnZW0gb3V0cHV0NHdvcmRzCisKKyAgICAgICAgLnVucmVxICBDSEVDSworICAgICAgICAudW5yZXEgIENPVU5UCisgICAgICAgIC51bnJlcSAgSU4KKyAgICAgICAgLnVucmVxICBPVVQKKyAgICAgICAgLnVucmVxICBEQVQwCisgICAgICAgIC51bnJlcSAgREFUMQorICAgICAgICAudW5yZXEgIERBVDIKKyAgICAgICAgLnVucmVxICBEQVQzCisgICAgICAgIC51bnJlcSAgU0hJRlQwCisgICAgICAgIC51bnJlcSAgU0hJRlQxCisgICAgICAgIC51bnJlcSAgU0hJRlQyCisgICAgICAgIC51bnJlcSAgU0hJRlQzCisgICAgICAgIC51bnJlcSAgU0hJRlQ0CisgICAgICAgIC51bnJlcSAgU0hJRlQ1CisKKy5lbHNlIC8vIG5vdCBtaXhlZAorCitDSEVDSyAgIC5yZXEgICAgYTEKK0NPVU5UICAgLnJlcSAgICBhMgorSU4gICAgICAucmVxICAgIGEzCitPVVQgICAgIC5yZXEgICAgYTQKK0RBVDAgICAgLnJlcSAgICB2MQorREFUMSAgICAucmVxICAgIHYyCitEQVQyICAgIC5yZXEgICAgdjMKK0RBVDMgICAgLnJlcSAgICB2NAorREFUNCAgICAucmVxICAgIHY1CitEQVQ1ICAgIC5yZXEgICAgdjYKK0RBVDYgICAgLnJlcSAgICBzbCAvLyB1c2UgdGhlc2UgcmF0aGVyIHRoYW4gdGhlIG90aGVyd2lzZSB1bnVzZWQKK0RBVDcgICAgLnJlcSAgICBmcCAvLyBpcCBhbmQgbHIgc28gdGhhdCB3ZSBjYW4gbG9hZCB0aGVtIHVzaW5mIExEUkQKKworIC5tYWNybyBvdXRwdXQ0d29yZHMgIHRhaWwsIGhlYWQsIHIwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcG9pbnRlcl9kZWFkPTAKKyAgLmlmIFxoZWFkCisgICAuc2V0IFNJWkVfR1JPVVAxLCBJRFgxCisgICAuaWYgU0laRV9HUk9VUDEgPiA0CisgICAgLnNldCBTSVpFX0dST1VQMSwgNAorICAgLmVuZGlmCisgICAuc2V0IFNJWkVfR1JPVVAyLCA0IC0gU0laRV9HUk9VUDEKKyAgICAgICAgbG9hZF9ncm91cDEgIFNJWkVfR1JPVVAxLCBcY2hhbm5lbHMsIFxyMCwgXHIxLCBccjIsIFxyMywgXHBvaW50ZXJfZGVhZAorICAuZW5kaWYKKyAgLmlmIFx0YWlsCisgICAgICAgIGVvciAgICAgQ0hFQ0ssIENIRUNLLCBccjQsIGxzciAjOCAtIChcY2hhbm5lbHMgLSBJRFgyKQorICAgICAgICBlb3IgICAgIENIRUNLLCBDSEVDSywgXHI1LCBsc3IgIzcgLSAoXGNoYW5uZWxzIC0gSURYMikKKyAgIGRlY3JfbW9kdWxvIElEWDIsIDIsIFxjaGFubmVscworICAuZW5kaWYKKyAgLmlmIFxoZWFkCisgICAgICAgIGxvYWRfZ3JvdXAyICBTSVpFX0dST1VQMiwgXGNoYW5uZWxzLCBccjAsIFxyMSwgXHIyLCBccjMsIFxwb2ludGVyX2RlYWQKKyAgLmVuZGlmCisgIC5pZiBcdGFpbAorICAgICAgICBlb3IgICAgIENIRUNLLCBDSEVDSywgXHI2LCBsc3IgIzggLSAoXGNoYW5uZWxzIC0gSURYMikKKyAgICAgICAgZW9yICAgICBDSEVDSywgQ0hFQ0ssIFxyNywgbHNyICM3IC0gKFxjaGFubmVscyAtIElEWDIpCisgICBkZWNyX21vZHVsbyBJRFgyLCAyLCBcY2hhbm5lbHMKKyAgICAgICAgc3RtICAgICBPVVQhLCB7XHI0LCBccjUsIFxyNiwgXHI3fQorICAuZW5kaWYKKyAgLmlmIFxoZWFkCisgICAgICAgIGxzbCAgICAgXHIwLCAjOCArIFxzaGlmdAorICAgICAgICBsc2wgICAgIFxyMSwgIzggKyBcc2hpZnQKKyAgICAgICAgbHNsICAgICBccjIsICM4ICsgXHNoaWZ0CisgICAgICAgIGxzbCAgICAgXHIzLCAjOCArIFxzaGlmdAorICAuZW5kaWYKKyAuZW5kbQorCisgLnNldCBXT1JEU19QRVJfTE9PUCwgXGNoYW5uZWxzICAvLyBjYWxjdWxhdGUgTENNIChjaGFubmVscywgOCkKKyAuaWYgKFdPUkRTX1BFUl9MT09QICUgMikgPT0gMAorICAuc2V0IFdPUkRTX1BFUl9MT09QLCBXT1JEU19QRVJfTE9PUCAvIDIKKyAuZW5kaWYKKyAuaWYgKFdPUkRTX1BFUl9MT09QICUgMikgPT0gMAorICAuc2V0IFdPUkRTX1BFUl9MT09QLCBXT1JEU19QRVJfTE9PUCAvIDIKKyAuZW5kaWYKKyAuaWYgKFdPUkRTX1BFUl9MT09QICUgMikgPT0gMAorICAuc2V0IFdPUkRTX1BFUl9MT09QLCBXT1JEU19QRVJfTE9PUCAvIDIKKyAuZW5kaWYKKyAuc2V0IFdPUkRTX1BFUl9MT09QLCBXT1JEU19QRVJfTE9PUCAqIDgKKyAuc2V0IFNBTVBMRVNfUEVSX0xPT1AsIFdPUkRTX1BFUl9MT09QIC8gXGNoYW5uZWxzCisKK2Z1bmN0aW9uIGZmX21scF9wYWNrX291dHB1dF9pbm9yZGVyX1xjaGFubmVsc1woKWNoX1xzaGlmdFwoKXNoaWZ0X2FybXY2LCBleHBvcnQ9MQorIC5pZiBTQU1QTEVTX1BFUl9MT09QID4gMQorICAgICAgICB0c3QgICAgIENPVU5ULCAjU0FNUExFU19QRVJfTE9PUCAtIDEgIC8vIGFsd2F5cyBzZWVtcyB0byBiZSBpbiBwcmFjdGljZQorICAgICAgICBpdCAgICAgIG5lCisgICAgICAgIGJuZSAgICAgWChmZl9tbHBfcGFja19vdXRwdXQpICAgICAgICAgLy8gYnV0IGp1c3QgaW4gY2FzZSwgYnJhbmNoIHRvIEMgaW1wbGVtZW50YXRpb24gaWYgbm90CisgLmVuZGlmCisgICAgICAgIHN1YnMgICAgQ09VTlQsIENPVU5ULCAjU0FNUExFU19QRVJfTE9PUAorICAgICAgICBpdCAgICAgIGxvCisgICAgICAgIGJ4bG8gICAgbHIKKyAgICAgICAgcHVzaCAgICB7djEtdjYsc2wsZnAsbHJ9CisgLnNldCBJRFgxLCBcY2hhbm5lbHMKKyAuc2V0IElEWDIsIFxjaGFubmVscworICAgICAgICBvdXRwdXQ0d29yZHMgIDAsIDEsIERBVDAsIERBVDEsIERBVDIsIERBVDMsIERBVDQsIERBVDUsIERBVDYsIERBVDcKKzA6ICAgICAgYmVxICAgICAxZgorIC5yZXB0IFdPUkRTX1BFUl9MT09QIC8gOAorICAgICAgICBvdXRwdXQ0d29yZHMgIDEsIDEsIERBVDQsIERBVDUsIERBVDYsIERBVDcsIERBVDAsIERBVDEsIERBVDIsIERBVDMKKyAgICAgICAgb3V0cHV0NHdvcmRzICAxLCAxLCBEQVQwLCBEQVQxLCBEQVQyLCBEQVQzLCBEQVQ0LCBEQVQ1LCBEQVQ2LCBEQVQ3CisgLmVuZHIKKyAgICAgICAgc3VicyAgICBDT1VOVCwgQ09VTlQsICNTQU1QTEVTX1BFUl9MT09QCisgICAgICAgIGJuZSAgICAgMGIKKzE6CisgLnJlcHQgV09SRFNfUEVSX0xPT1AgLyA4IC0gMQorICAgICAgICBvdXRwdXQ0d29yZHMgIDEsIDEsIERBVDQsIERBVDUsIERBVDYsIERBVDcsIERBVDAsIERBVDEsIERBVDIsIERBVDMKKyAgICAgICAgb3V0cHV0NHdvcmRzICAxLCAxLCBEQVQwLCBEQVQxLCBEQVQyLCBEQVQzLCBEQVQ0LCBEQVQ1LCBEQVQ2LCBEQVQ3CisgLmVuZHIKKyAgICAgICAgb3V0cHV0NHdvcmRzICAxLCAxLCBEQVQ0LCBEQVQ1LCBEQVQ2LCBEQVQ3LCBEQVQwLCBEQVQxLCBEQVQyLCBEQVQzLCBwb2ludGVyX2RlYWQ9MQorICAgICAgICBvdXRwdXQ0d29yZHMgIDEsIDAsIERBVDAsIERBVDEsIERBVDIsIERBVDMsIERBVDQsIERBVDUsIERBVDYsIERBVDcKKyAgICAgICAgcG9wICAgICB7djEtdjYsc2wsZnAscGN9CitlbmRmdW5jCisgLnB1cmdlbSBvdXRwdXQ0d29yZHMKKworICAgICAgICAudW5yZXEgIENIRUNLCisgICAgICAgIC51bnJlcSAgQ09VTlQKKyAgICAgICAgLnVucmVxICBJTgorICAgICAgICAudW5yZXEgIE9VVAorICAgICAgICAudW5yZXEgIERBVDAKKyAgICAgICAgLnVucmVxICBEQVQxCisgICAgICAgIC51bnJlcSAgREFUMgorICAgICAgICAudW5yZXEgIERBVDMKKyAgICAgICAgLnVucmVxICBEQVQ0CisgICAgICAgIC51bnJlcSAgREFUNQorICAgICAgICAudW5yZXEgIERBVDYKKyAgICAgICAgLnVucmVxICBEQVQ3CisKKy5lbmRpZiAvLyBtaXhlZAorLmVsc2UgLy8gbm90IGlub3JkZXIKKy5pZmMgXHNoaWZ0LCBtaXhlZAorCisvLyBUaGlzIGNhc2Ugbm90IGN1cnJlbnRseSBoYW5kbGVkCisKKy5lbHNlIC8vIG5vdCBtaXhlZAorCisjaWYgIUNPTkZJR19USFVNQgorCitDSEVDSyAgIC5yZXEgICAgYTEKK0NPVU5UICAgLnJlcSAgICBhMgorSU4gICAgICAucmVxICAgIGEzCitPVVQgICAgIC5yZXEgICAgYTQKK0RBVDAgICAgLnJlcSAgICB2MQorREFUMSAgICAucmVxICAgIHYyCitEQVQyICAgIC5yZXEgICAgdjMKK0RBVDMgICAgLnJlcSAgICB2NAorQ0hBTjAgICAucmVxICAgIHY1CitDSEFOMSAgIC5yZXEgICAgdjYKK0NIQU4yICAgLnJlcSAgICBzbAorQ0hBTjMgICAucmVxICAgIGZwCitDSEFONCAgIC5yZXEgICAgaXAKK0NIQU41ICAgLnJlcSAgICBscgorCisgLm1hY3JvIG91dHB1dDR3b3JkcworICAuaWYgXGNoYW5uZWxzID09IDgKKyAgIC5pZiBJRFgxID09IDgKKyAgICAgICAgdXh0YiAgICBDSEFOMCwgQ0hBTjQsIHJvciAjMAorICAgICAgICB1eHRiICAgIENIQU4xLCBDSEFONCwgcm9yICM4CisgICAgICAgIHV4dGIgICAgQ0hBTjIsIENIQU40LCByb3IgIzE2CisgICAgICAgIHV4dGIgICAgQ0hBTjMsIENIQU40LCByb3IgIzI0CisgICAuZWxzZQorICAgICAgICB1eHRiICAgIENIQU4wLCBDSEFONSwgcm9yICMwCisgICAgICAgIHV4dGIgICAgQ0hBTjEsIENIQU41LCByb3IgIzgKKyAgICAgICAgdXh0YiAgICBDSEFOMiwgQ0hBTjUsIHJvciAjMTYKKyAgICAgICAgdXh0YiAgICBDSEFOMywgQ0hBTjUsIHJvciAjMjQKKyAgIC5lbmRpZgorICAgICAgICBsZHIgICAgIERBVDAsIFtJTiwgQ0hBTjAsIGxzbCAjMl0KKyAgICAgICAgbGRyICAgICBEQVQxLCBbSU4sIENIQU4xLCBsc2wgIzJdCisgICAgICAgIGxkciAgICAgREFUMiwgW0lOLCBDSEFOMiwgbHNsICMyXQorICAgICAgICBsZHIgICAgIERBVDMsIFtJTiwgQ0hBTjMsIGxzbCAjMl0KKyAgIC5pZiBJRFgxID09IDQKKyAgICAgICAgYWRkICAgICBJTiwgSU4sICM4KjQKKyAgIC5lbmRpZgorICAgICAgICBkZWNyX21vZHVsbyBJRFgxLCA0LCBcY2hhbm5lbHMKKyAgLmVsc2UKKyAgIC5zZXQgU0laRV9HUk9VUDEsIElEWDEKKyAgIC5pZiBTSVpFX0dST1VQMSA+IDQKKyAgICAuc2V0IFNJWkVfR1JPVVAxLCA0CisgICAuZW5kaWYKKyAgIC5zZXQgU0laRV9HUk9VUDIsIDQgLSBTSVpFX0dST1VQMQorICAgLmlmIFNJWkVfR1JPVVAxID09IDIKKyAgICAgICAgbG9hZHJlZ29mZnNoMiAgREFULCAwLCBJTiwgQ0hBTiwgMCArIChcY2hhbm5lbHMgLSBJRFgxKQorICAgICAgICBsb2FkcmVnb2Zmc2gyICBEQVQsIDEsIElOLCBDSEFOLCAxICsgKFxjaGFubmVscyAtIElEWDEpCisgICAgICAgIGFkZCAgICAgSU4sIElOLCAjOCo0CisgICAuZWxzZSAvLyBTSVpFX0dST1VQMSA9PSA0CisgICAgICAgIGxvYWRyZWdvZmZzaDIgIERBVCwgMCwgSU4sIENIQU4sIDAgKyAoXGNoYW5uZWxzIC0gSURYMSkKKyAgICAgICAgbG9hZHJlZ29mZnNoMiAgREFULCAxLCBJTiwgQ0hBTiwgMSArIChcY2hhbm5lbHMgLSBJRFgxKQorICAgICAgICBsb2FkcmVnb2Zmc2gyICBEQVQsIDIsIElOLCBDSEFOLCAyICsgKFxjaGFubmVscyAtIElEWDEpCisgICAgICAgIGxvYWRyZWdvZmZzaDIgIERBVCwgMywgSU4sIENIQU4sIDMgKyAoXGNoYW5uZWxzIC0gSURYMSkKKyAgICAuaWYgSURYMSA9PSA0CisgICAgICAgIGFkZCAgICAgSU4sIElOLCAjOCo0CisgICAgLmVuZGlmCisgICAuZW5kaWYKKyAgICAgICAgZGVjcl9tb2R1bG8gSURYMSwgU0laRV9HUk9VUDEsIFxjaGFubmVscworICAgLmlmIFNJWkVfR1JPVVAyID09IDIKKyAgICAgICAgbG9hZHJlZ29mZnNoMiAgREFULCAyLCBJTiwgQ0hBTiwgMCArIChcY2hhbm5lbHMgLSBJRFgxKQorICAgICAgICBsb2FkcmVnb2Zmc2gyICBEQVQsIDMsIElOLCBDSEFOLCAxICsgKFxjaGFubmVscyAtIElEWDEpCisgICAgLmlmIElEWDEgPT0gMgorICAgICAgICBhZGQgICAgIElOLCBJTiwgIzgqNAorICAgIC5lbmRpZgorICAgLmVuZGlmCisgICAgICAgIGRlY3JfbW9kdWxvIElEWDEsIFNJWkVfR1JPVVAyLCBcY2hhbm5lbHMKKyAgLmVuZGlmCisgIC5pZiBcY2hhbm5lbHMgPT0gOCAvLyBpbiB0aGlzIGNhc2Ugd2UgY2FuIGNvcnJ1cHQgQ0hBTjAtMworICAgICAgICByc2IgICAgIENIQU4wLCBDSEFOMCwgIzgKKyAgICAgICAgcnNiICAgICBDSEFOMSwgQ0hBTjEsICM4CisgICAgICAgIHJzYiAgICAgQ0hBTjIsIENIQU4yLCAjOAorICAgICAgICByc2IgICAgIENIQU4zLCBDSEFOMywgIzgKKyAgICAgICAgbHNsICAgICBEQVQwLCAjOCArIFxzaGlmdAorICAgICAgICBsc2wgICAgIERBVDEsICM4ICsgXHNoaWZ0CisgICAgICAgIGxzbCAgICAgREFUMiwgIzggKyBcc2hpZnQKKyAgICAgICAgbHNsICAgICBEQVQzLCAjOCArIFxzaGlmdAorICAgICAgICBlb3IgICAgIENIRUNLLCBDSEVDSywgREFUMCwgbHNyIENIQU4wCisgICAgICAgIGVvciAgICAgQ0hFQ0ssIENIRUNLLCBEQVQxLCBsc3IgQ0hBTjEKKyAgICAgICAgZW9yICAgICBDSEVDSywgQ0hFQ0ssIERBVDIsIGxzciBDSEFOMgorICAgICAgICBlb3IgICAgIENIRUNLLCBDSEVDSywgREFUMywgbHNyIENIQU4zCisgIC5lbHNlCisgICAuaWYgXHNoaWZ0ICE9IDAKKyAgICAgICAgbHNsICAgICBEQVQwLCAjXHNoaWZ0CisgICAgICAgIGxzbCAgICAgREFUMSwgI1xzaGlmdAorICAgICAgICBsc2wgICAgIERBVDIsICNcc2hpZnQKKyAgICAgICAgbHNsICAgICBEQVQzLCAjXHNoaWZ0CisgICAuZW5kaWYKKyAgICAgICAgYmljICAgICBEQVQwLCBEQVQwLCAjMHhmZjAwMDAwMAorICAgICAgICBiaWMgICAgIERBVDEsIERBVDEsICMweGZmMDAwMDAwCisgICAgICAgIGJpYyAgICAgREFUMiwgREFUMiwgIzB4ZmYwMDAwMDAKKyAgICAgICAgYmljICAgICBEQVQzLCBEQVQzLCAjMHhmZjAwMDAwMAorICAgICAgICBlb3Jsc2xyZWcgQ0hFQ0ssIERBVDAsIENIQU4sIDAgKyAoXGNoYW5uZWxzIC0gSURYMikKKyAgICAgICAgZW9ybHNscmVnIENIRUNLLCBEQVQxLCBDSEFOLCAxICsgKFxjaGFubmVscyAtIElEWDIpCisgICBkZWNyX21vZHVsbyBJRFgyLCAyLCBcY2hhbm5lbHMKKyAgICAgICAgZW9ybHNscmVnIENIRUNLLCBEQVQyLCBDSEFOLCAwICsgKFxjaGFubmVscyAtIElEWDIpCisgICAgICAgIGVvcmxzbHJlZyBDSEVDSywgREFUMywgQ0hBTiwgMSArIChcY2hhbm5lbHMgLSBJRFgyKQorICAgZGVjcl9tb2R1bG8gSURYMiwgMiwgXGNoYW5uZWxzCisgICAgICAgIGxzbCAgICAgREFUMCwgIzgKKyAgICAgICAgbHNsICAgICBEQVQxLCAjOAorICAgICAgICBsc2wgICAgIERBVDIsICM4CisgICAgICAgIGxzbCAgICAgREFUMywgIzgKKyAgLmVuZGlmCisgICAgICAgIHN0bSAgICAgT1VUISwge0RBVDAgLSBEQVQzfQorIC5lbmRtCisKKyAuc2V0IFdPUkRTX1BFUl9MT09QLCBcY2hhbm5lbHMgIC8vIGNhbGN1bGF0ZSBMQ00gKGNoYW5uZWxzLCA0KQorIC5pZiAoV09SRFNfUEVSX0xPT1AgJSAyKSA9PSAwCisgIC5zZXQgV09SRFNfUEVSX0xPT1AsIFdPUkRTX1BFUl9MT09QIC8gMgorIC5lbmRpZgorIC5pZiAoV09SRFNfUEVSX0xPT1AgJSAyKSA9PSAwCisgIC5zZXQgV09SRFNfUEVSX0xPT1AsIFdPUkRTX1BFUl9MT09QIC8gMgorIC5lbmRpZgorIC5zZXQgV09SRFNfUEVSX0xPT1AsIFdPUkRTX1BFUl9MT09QICogNAorIC5zZXQgU0FNUExFU19QRVJfTE9PUCwgV09SRFNfUEVSX0xPT1AgLyBcY2hhbm5lbHMKKworZnVuY3Rpb24gZmZfbWxwX3BhY2tfb3V0cHV0X291dG9mb3JkZXJfXGNoYW5uZWxzXCgpY2hfXHNoaWZ0XCgpc2hpZnRfYXJtdjYsIGV4cG9ydD0xCisgLmlmIFNBTVBMRVNfUEVSX0xPT1AgPiAxCisgICAgICAgIHRzdCAgICAgQ09VTlQsICNTQU1QTEVTX1BFUl9MT09QIC0gMSAgLy8gYWx3YXlzIHNlZW1zIHRvIGJlIGluIHByYWN0aWNlCisgICAgICAgIGl0ICAgICAgbmUKKyAgICAgICAgYm5lICAgICBYKGZmX21scF9wYWNrX291dHB1dCkgICAgICAgICAvLyBidXQganVzdCBpbiBjYXNlLCBicmFuY2ggdG8gQyBpbXBsZW1lbnRhdGlvbiBpZiBub3QKKyAuZW5kaWYKKyAgICAgICAgdGVxICAgICBDT1VOVCwgIzAKKyAgICAgICAgaXQgICAgICBlcQorICAgICAgICBieGVxICAgIGxyCisgICAgICAgIHB1c2ggICAge3YxLXY2LHNsLGZwLGxyfQorICAgICAgICBsZHIgICAgIENIQU4wLCBbc3AsICMoOSswKSo0XSAgLy8gZ2V0IGNoX2Fzc2lnbiBmcm9tIHN0YWNrCisgICAgICAgIGxkciAgICAgQ0hBTjQsIFtDSEFOMF0KKyAuaWYgXGNoYW5uZWxzID09IDIKKyAgICAgICAgdXh0YiAgICBDSEFOMCwgQ0hBTjQsIHJvciAjMAorICAgICAgICB1eHRiICAgIENIQU4xLCBDSEFONCwgcm9yICM4CisgLmVsc2UKKyAgICAgICAgbGRyICAgICBDSEFONSwgW0NIQU4wLCAjNF0KKyAgLmlmIFxjaGFubmVscyA9PSA2CisgICAgICAgIHV4dGIgICAgQ0hBTjAsIENIQU40LCByb3IgIzAKKyAgICAgICAgdXh0YiAgICBDSEFOMSwgQ0hBTjQsIHJvciAjOAorICAgICAgICB1eHRiICAgIENIQU4yLCBDSEFONCwgcm9yICMxNgorICAgICAgICB1eHRiICAgIENIQU4zLCBDSEFONCwgcm9yICMyNAorICAgICAgICB1eHRiICAgIENIQU40LCBDSEFONSwgcm9yICMwCisgICAgICAgIHV4dGIgICAgQ0hBTjUsIENIQU41LCByb3IgIzgKKyAgLmVuZGlmCisgLmVuZGlmCisgLnNldCBJRFgxLCBcY2hhbm5lbHMKKyAuc2V0IElEWDIsIFxjaGFubmVscworMDoKKyAucmVwdCBXT1JEU19QRVJfTE9PUCAvIDQKKyAgICAgICAgb3V0cHV0NHdvcmRzCisgLmVuZHIKKyAgICAgICAgc3VicyAgICBDT1VOVCwgQ09VTlQsICNTQU1QTEVTX1BFUl9MT09QCisgICAgICAgIGJuZSAgICAgMGIKKyAgICAgICAgcG9wICAgICB7djEtdjYsc2wsZnAscGN9CisgICAgICAgIC5sdG9yZworZW5kZnVuYworIC5wdXJnZW0gb3V0cHV0NHdvcmRzCisKKyAgICAgICAgLnVucmVxICBDSEVDSworICAgICAgICAudW5yZXEgIENPVU5UCisgICAgICAgIC51bnJlcSAgSU4KKyAgICAgICAgLnVucmVxICBPVVQKKyAgICAgICAgLnVucmVxICBEQVQwCisgICAgICAgIC51bnJlcSAgREFUMQorICAgICAgICAudW5yZXEgIERBVDIKKyAgICAgICAgLnVucmVxICBEQVQzCisgICAgICAgIC51bnJlcSAgQ0hBTjAKKyAgICAgICAgLnVucmVxICBDSEFOMQorICAgICAgICAudW5yZXEgIENIQU4yCisgICAgICAgIC51bnJlcSAgQ0hBTjMKKyAgICAgICAgLnVucmVxICBDSEFONAorICAgICAgICAudW5yZXEgIENIQU41CisKKyNlbmRpZiAvLyAhQ09ORklHX1RIVU1CCisKKy5lbmRpZiAvLyBtaXhlZAorLmVuZGlmIC8vIGlub3JkZXIKKy5lbmRtIC8vIGltcGxlbWVudF9wYWNrCisKKy5tYWNybyBwYWNrX2NoYW5uZWxzICBpbm9yZGVyLCBjaGFubmVscworICAgICAgICBpbXBsZW1lbnRfcGFjayAgXGlub3JkZXIsIFxjaGFubmVscywgMAorICAgICAgICBpbXBsZW1lbnRfcGFjayAgXGlub3JkZXIsIFxjaGFubmVscywgMQorICAgICAgICBpbXBsZW1lbnRfcGFjayAgXGlub3JkZXIsIFxjaGFubmVscywgMgorICAgICAgICBpbXBsZW1lbnRfcGFjayAgXGlub3JkZXIsIFxjaGFubmVscywgMworICAgICAgICBpbXBsZW1lbnRfcGFjayAgXGlub3JkZXIsIFxjaGFubmVscywgNAorICAgICAgICBpbXBsZW1lbnRfcGFjayAgXGlub3JkZXIsIFxjaGFubmVscywgNQorICAgICAgICBpbXBsZW1lbnRfcGFjayAgXGlub3JkZXIsIFxjaGFubmVscywgbWl4ZWQKKy5lbmRtCisKKy5tYWNybyBwYWNrX29yZGVyICBpbm9yZGVyCisgICAgICAgIHBhY2tfY2hhbm5lbHMgIFxpbm9yZGVyLCAyCisgICAgICAgIHBhY2tfY2hhbm5lbHMgIFxpbm9yZGVyLCA2CisgICAgICAgIHBhY2tfY2hhbm5lbHMgIFxpbm9yZGVyLCA4CisuZW5kbQorCisgICAgICAgIHBhY2tfb3JkZXIgIDAKKyAgICAgICAgcGFja19vcmRlciAgMQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21scGRzcF9pbml0X2FybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21scGRzcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTVmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbWxwZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUklTQyBPUyBPcGVuIEx0ZAorICogQXV0aG9yOiBCZW4gQXZpc29uIDxiYXZpc29uQHJpc2Nvc29wZW4ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tbHBkc3AuaCIKKwordm9pZCBmZl9tbHBfZmlsdGVyX2NoYW5uZWxfYXJtKGludDMyX3QgKnN0YXRlLCBjb25zdCBpbnQzMl90ICpjb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyb3JkZXIsIGludCBpaXJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmlsdGVyX3NoaWZ0LCBpbnQzMl90IG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2Nrc2l6ZSwgaW50MzJfdCAqc2FtcGxlX2J1ZmZlcik7Cit2b2lkIGZmX21scF9yZW1hdHJpeF9jaGFubmVsX2FybShpbnQzMl90ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnlwYXNzZWRfbHNicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqbm9pc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBibG9ja3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeF9ub2lzZV9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2Nlc3NfdW5pdF9zaXplX3BvdzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1hc2spOworCisjZGVmaW5lIERFQ0xBUkVfUEFDSyhvcmRlcixjaGFubmVscyxzaGlmdCkgXAorICAgIGludDMyX3QgZmZfbWxwX3BhY2tfb3V0cHV0XyMjb3JkZXIjI29yZGVyXyMjY2hhbm5lbHMjI2NoXyMjc2hpZnQjI3NoaWZ0X2FybXY2KGludDMyX3QsIHVpbnQxNl90LCBpbnQzMl90ICgqKVtdLCB2b2lkICosIHVpbnQ4X3QqLCBpbnQ4X3QgKiwgdWludDhfdCwgaW50KTsKKyNkZWZpbmUgRU5VTUVSQVRFX1BBQ0sob3JkZXIsY2hhbm5lbHMsc2hpZnQpIFwKKyAgICBmZl9tbHBfcGFja19vdXRwdXRfIyNvcmRlciMjb3JkZXJfIyNjaGFubmVscyMjY2hfIyNzaGlmdCMjc2hpZnRfYXJtdjYsCisjZGVmaW5lIFBBQ0tfQ0hBTk5FTFMobWFjcm8sb3JkZXIsY2hhbm5lbHMpIFwKKyAgICAgICAgbWFjcm8ob3JkZXIsY2hhbm5lbHMsMCkgXAorICAgICAgICBtYWNybyhvcmRlcixjaGFubmVscywxKSBcCisgICAgICAgIG1hY3JvKG9yZGVyLGNoYW5uZWxzLDIpIFwKKyAgICAgICAgbWFjcm8ob3JkZXIsY2hhbm5lbHMsMykgXAorICAgICAgICBtYWNybyhvcmRlcixjaGFubmVscyw0KSBcCisgICAgICAgIG1hY3JvKG9yZGVyLGNoYW5uZWxzLDUpIFwKKyAgICAgICAgbWFjcm8ob3JkZXIsY2hhbm5lbHMsbWl4ZWQpCisjZGVmaW5lIFBBQ0tfT1JERVIobWFjcm8sb3JkZXIpIFwKKyAgICAgICAgUEFDS19DSEFOTkVMUyhtYWNybyxvcmRlciwyKSBcCisgICAgICAgIFBBQ0tfQ0hBTk5FTFMobWFjcm8sb3JkZXIsNikgXAorICAgICAgICBQQUNLX0NIQU5ORUxTKG1hY3JvLG9yZGVyLDgpCisjZGVmaW5lIFBBQ0tfQUxMKG1hY3JvKSBcCisgICAgICAgIFBBQ0tfT1JERVIobWFjcm8sb3V0b2YpIFwKKyAgICAgICAgUEFDS19PUkRFUihtYWNybyxpbikKK1BBQ0tfQUxMKERFQ0xBUkVfUEFDSykKKworI2RlZmluZSBmZl9tbHBfcGFja19vdXRwdXRfb3V0b2ZvcmRlcl8yY2hfbWl4ZWRzaGlmdF9hcm12NiAwCisjZGVmaW5lIGZmX21scF9wYWNrX291dHB1dF9vdXRvZm9yZGVyXzZjaF9taXhlZHNoaWZ0X2FybXY2IDAKKyNkZWZpbmUgZmZfbWxwX3BhY2tfb3V0cHV0X291dG9mb3JkZXJfOGNoX21peGVkc2hpZnRfYXJtdjYgMAorI2lmIENPTkZJR19USFVNQgorI2RlZmluZSBmZl9tbHBfcGFja19vdXRwdXRfb3V0b2ZvcmRlcl8yY2hfMHNoaWZ0X2FybXY2IDAKKyNkZWZpbmUgZmZfbWxwX3BhY2tfb3V0cHV0X291dG9mb3JkZXJfMmNoXzFzaGlmdF9hcm12NiAwCisjZGVmaW5lIGZmX21scF9wYWNrX291dHB1dF9vdXRvZm9yZGVyXzJjaF8yc2hpZnRfYXJtdjYgMAorI2RlZmluZSBmZl9tbHBfcGFja19vdXRwdXRfb3V0b2ZvcmRlcl8yY2hfM3NoaWZ0X2FybXY2IDAKKyNkZWZpbmUgZmZfbWxwX3BhY2tfb3V0cHV0X291dG9mb3JkZXJfMmNoXzRzaGlmdF9hcm12NiAwCisjZGVmaW5lIGZmX21scF9wYWNrX291dHB1dF9vdXRvZm9yZGVyXzJjaF81c2hpZnRfYXJtdjYgMAorI2RlZmluZSBmZl9tbHBfcGFja19vdXRwdXRfb3V0b2ZvcmRlcl82Y2hfMHNoaWZ0X2FybXY2IDAKKyNkZWZpbmUgZmZfbWxwX3BhY2tfb3V0cHV0X291dG9mb3JkZXJfNmNoXzFzaGlmdF9hcm12NiAwCisjZGVmaW5lIGZmX21scF9wYWNrX291dHB1dF9vdXRvZm9yZGVyXzZjaF8yc2hpZnRfYXJtdjYgMAorI2RlZmluZSBmZl9tbHBfcGFja19vdXRwdXRfb3V0b2ZvcmRlcl82Y2hfM3NoaWZ0X2FybXY2IDAKKyNkZWZpbmUgZmZfbWxwX3BhY2tfb3V0cHV0X291dG9mb3JkZXJfNmNoXzRzaGlmdF9hcm12NiAwCisjZGVmaW5lIGZmX21scF9wYWNrX291dHB1dF9vdXRvZm9yZGVyXzZjaF81c2hpZnRfYXJtdjYgMAorI2RlZmluZSBmZl9tbHBfcGFja19vdXRwdXRfb3V0b2ZvcmRlcl84Y2hfMHNoaWZ0X2FybXY2IDAKKyNkZWZpbmUgZmZfbWxwX3BhY2tfb3V0cHV0X291dG9mb3JkZXJfOGNoXzFzaGlmdF9hcm12NiAwCisjZGVmaW5lIGZmX21scF9wYWNrX291dHB1dF9vdXRvZm9yZGVyXzhjaF8yc2hpZnRfYXJtdjYgMAorI2RlZmluZSBmZl9tbHBfcGFja19vdXRwdXRfb3V0b2ZvcmRlcl84Y2hfM3NoaWZ0X2FybXY2IDAKKyNkZWZpbmUgZmZfbWxwX3BhY2tfb3V0cHV0X291dG9mb3JkZXJfOGNoXzRzaGlmdF9hcm12NiAwCisjZGVmaW5lIGZmX21scF9wYWNrX291dHB1dF9vdXRvZm9yZGVyXzhjaF81c2hpZnRfYXJtdjYgMAorI2VuZGlmCisKK3N0YXRpYyBpbnQzMl90ICgqbWxwX3NlbGVjdF9wYWNrX291dHB1dF9hcm12Nih1aW50OF90ICpjaF9hc3NpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICpvdXRwdXRfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXhfbWF0cml4X2NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzMzIpKShpbnQzMl90LCB1aW50MTZfdCwgaW50MzJfdCAoKilbXSwgdm9pZCAqLCB1aW50OF90KiwgaW50OF90ICosIHVpbnQ4X3QsIGludCkKK3sKKyAgICBpbnQgY2hfaW5kZXg7CisgICAgaW50IHNoaWZ0ID0gb3V0cHV0X3NoaWZ0WzBdIDwgMCB8fCBvdXRwdXRfc2hpZnRbMF0gPiA1ID8gNiA6IG91dHB1dF9zaGlmdFswXTsKKyAgICBpbnQgaW5vcmRlciA9IDE7CisgICAgc3RhdGljIGludDMyX3QgKCpjb25zdCByb3V0aW5lWzIqMyo3XSkoaW50MzJfdCwgdWludDE2X3QsIGludDMyX3QgKCopW10sIHZvaWQgKiwgdWludDhfdCosIGludDhfdCAqLCB1aW50OF90LCBpbnQpID0geworICAgICAgICAgICAgUEFDS19BTEwoRU5VTUVSQVRFX1BBQ0spCisgICAgfTsKKyAgICBpbnQgaTsKKworICAgIGlmICghaXMzMikgLy8gZG9uJ3Qgc3VwcG9ydCAxNi1iaXQgb3V0cHV0IChpdCdzIG5vdCB1c2VkIGJ5IFRydWVIRCkKKyAgICAgICAgcmV0dXJuIGZmX21scF9wYWNrX291dHB1dDsKKworICAgIHN3aXRjaCAobWF4X21hdHJpeF9jaGFubmVsKSB7CisgICAgY2FzZSAxOgorICAgICAgICBjaF9pbmRleCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgY2hfaW5kZXggPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIGNoX2luZGV4ID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZmX21scF9wYWNrX291dHB1dDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IG1heF9tYXRyaXhfY2hhbm5lbDsgaSsrKSB7CisgICAgICAgIGlmIChzaGlmdCAhPSA2ICYmIG91dHB1dF9zaGlmdFtpXSAhPSBzaGlmdCkKKyAgICAgICAgICAgIHNoaWZ0ID0gNjsgLy8gaW5kaWNhdGUgbWl4ZWQgc2hpZnRzCisgICAgICAgIGlmIChjaF9hc3NpZ25baV0gIT0gaSkKKyAgICAgICAgICAgIGlub3JkZXIgPSAwOworICAgIH0KKyNpZiBDT05GSUdfVEhVTUIKKyAgICBpZiAoIWlub3JkZXIpCisgICAgICAgIHJldHVybiBmZl9tbHBfcGFja19vdXRwdXQ7IC8vIGNhbid0IGN1cnJlbnRseSBoYW5kbGUgYW4gb3JkZXIgYXJyYXkgZXhjZXB0IGluIEFSTSBtb2RlCisjZWxzZQorICAgIGlmIChzaGlmdCA9PSA2ICYmICFpbm9yZGVyKQorICAgICAgICByZXR1cm4gZmZfbWxwX3BhY2tfb3V0cHV0OyAvLyBjYW4ndCBjdXJyZW50bHkgaGFuZGxlIGJvdGggYW4gb3JkZXIgYXJyYXkgYW5kIGEgc2hpZnQgYXJyYXkKKyNlbmRpZgorCisgICAgcmV0dXJuIHJvdXRpbmVbKGlub3JkZXIqMytjaF9pbmRleCkqNytzaGlmdF07Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9tbHBkc3BfaW5pdF9hcm0oTUxQRFNQQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfYXJtdjV0ZShjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPm1scF9maWx0ZXJfY2hhbm5lbCA9IGZmX21scF9maWx0ZXJfY2hhbm5lbF9hcm07CisgICAgICAgIGMtPm1scF9yZW1hdHJpeF9jaGFubmVsID0gZmZfbWxwX3JlbWF0cml4X2NoYW5uZWxfYXJtOworICAgIH0KKyAgICBpZiAoaGF2ZV9hcm12NihjcHVfZmxhZ3MpKQorICAgICAgICBjLT5tbHBfc2VsZWN0X3BhY2tfb3V0cHV0ID0gbWxwX3NlbGVjdF9wYWNrX291dHB1dF9hcm12NjsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tcGVnYXVkaW9kc3BfZml4ZWRfYXJtdjYuUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tcGVnYXVkaW9kc3BfZml4ZWRfYXJtdjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzdhYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWdhdWRpb2RzcF9maXhlZF9hcm12Ni5TCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworLm1hY3JvICBza2lwICAgICAgICAgICAgYXJnczp2YXJhcmcKKy5lbmRtCisKKy5tYWNybyAgc3VtOCAgICAgICAgICAgIGxvLCAgaGksICB3LCBwLCB0MSwgdDIsIHQzLCB0NCwgcnNiPXNraXAsIG9mZnM9MAorICAgICAgICBsZHIgICAgICAgICAgICAgXHQxLCBbXHcsICM0KlxvZmZzXQorICAgICAgICBsZHIgICAgICAgICAgICAgXHQyLCBbXHAsICM0XSEKKyAgICAgICAgXHJzYiAgICAgICAgICAgIFx0MSwgXHQxLCAjMAorICAuaXJwYyBpLCAxMzUKKyAgICAgICAgbGRyICAgICAgICAgICAgIFx0MywgW1x3LCAjNCo2NCpcaSs0KlxvZmZzXQorICAgICAgICBsZHIgICAgICAgICAgICAgXHQ0LCBbXHAsICM0KjY0KlxpXQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGxvLCBcaGksIFx0MSwgXHQyCisgICAgICAgIFxyc2IgICAgICAgICAgICBcdDMsIFx0MywgIzAKKyAgICAgICAgbGRyICAgICAgICAgICAgIFx0MSwgW1x3LCAjNCo2NCooXGkrMSkrNCpcb2Zmc10KKyAgICAgICAgbGRyICAgICAgICAgICAgIFx0MiwgW1xwLCAjNCo2NCooXGkrMSldCisgICAgICAgIHNtbGFsICAgICAgICAgICBcbG8sIFxoaSwgXHQzLCBcdDQKKyAgICAgICAgXHJzYiAgICAgICAgICAgIFx0MSwgXHQxLCAjMAorICAuZW5kcgorICAgICAgICBsZHIgICAgICAgICAgICAgXHQzLCBbXHcsICM0KjY0KjcrNCpcb2Zmc10KKyAgICAgICAgbGRyICAgICAgICAgICAgIFx0NCwgW1xwLCAjNCo2NCo3XQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGxvLCBcaGksIFx0MSwgXHQyCisgICAgICAgIFxyc2IgICAgICAgICAgICBcdDMsIFx0MywgIzAKKyAgICAgICAgc21sYWwgICAgICAgICAgIFxsbywgXGhpLCBcdDMsIFx0NAorLmVuZG0KKworLm1hY3JvICByb3VuZCAgICAgICAgICAgcmQsICBsbywgIGhpCisgICAgICAgIGxzciAgICAgICAgICAgICBccmQsIFxsbywgIzI0CisgICAgICAgIGJpYyAgICAgICAgICAgICBcbG8sIFxsbywgIzB4ZmYwMDAwMDAKKyAgICAgICAgb3JyICAgICAgICAgICAgIFxyZCwgXHJkLCBcaGksIGxzbCAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgXGhpLCAjMAorICAgICAgICBzc2F0ICAgICAgICAgICAgXHJkLCAjMTYsIFxyZAorLmVuZG0KKworZnVuY3Rpb24gZmZfbXBhZHNwX2FwcGx5X3dpbmRvd19maXhlZF9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMixyNC1yMTEsbHJ9CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgcjAsICAjNCo1MTIgICAgICAgIEAgc3ludGhfYnVmICsgNTEyCisgICAgLnJlcHQgNAorICAgICAgICBsZG0gICAgICAgICAgICAgcjAhLCB7cjUtcjEyfQorICAgICAgICBzdG0gICAgICAgICAgICAgcjQhLCB7cjUtcjEyfQorICAgIC5lbmRyCisKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjNDBdICAgICAgICAgIEAgaW5jcgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgICM0KjE3ICAgICAgICAgQCBzeW50aF9idWYgKyAxNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjgsICBbcjJdICAgICAgICAgICAgICAgQCBzdW06bG93CisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIwLCAgIzQqMzIgICAgICAgICBAIHN5bnRoX2J1ZiArIDQ4CisgICAgICAgIHJzYiAgICAgICAgICAgICByNSwgIHI0LCAgcjQsICBsc2wgIzUgICBAIDMxICogaW5jcgorICAgICAgICBsc2wgICAgICAgICAgICAgcjQsICByNCwgICMxCisgICAgICAgIGFzciAgICAgICAgICAgICByOSwgIHI4LCAgIzMxICAgICAgICAgICBAIHN1bTpoaWdoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNSwgIHIzLCAgcjUsICBsc2wgIzEgICBAIHNhbXBsZXMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHIxLCAgIzQqMzIgICAgICAgICBAIHcyCisgICAgICAgIHN0ciAgICAgICAgICAgICByNCwgIFtzcCwgIzQwXQorCisgICAgICAgIHN1bTggICAgICAgICAgICByOCwgIHI5LCAgcjEsICByMCwgIHIxMCwgcjExLCByMTIsIGxyCisgICAgICAgIHN1bTggICAgICAgICAgICByOCwgIHI5LCAgcjEsICByMiwgIHIxMCwgcjExLCByMTIsIGxyLCByc2IsIDMyCisgICAgICAgIHJvdW5kICAgICAgICAgICByMTAsIHI4LCAgcjkKKyAgICAgICAgc3RyaF9wb3N0ICAgICAgIHIxMCwgcjMsICByNAorCisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgICMxNQorMToKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3IwLCAjNF0hCisgICAgICAgIGxkciAgICAgICAgICAgICByMTEsIFtyNiwgIy00XSEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMCwgW3IxLCAjNF0hCisgIC5pcnBjIGksIDAyNDYKKyAgICAuaWYgXGkKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMSwgW3I2LCAjNCo2NCpcaV0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMCwgW3IxLCAjNCo2NCpcaV0KKyAgICAuZW5kaWYKKyAgICAgICAgcnNiICAgICAgICAgICAgIHIxMSwgcjExLCAjMAorICAgICAgICBzbWxhbCAgICAgICAgICAgcjgsICByOSwgIHIxMCwgcjEyCisgICAgICAgIGxkciAgICAgICAgICAgICByMTAsIFtyMCwgIzQqNjQqKFxpKzEpXQorICAgIC5pZmVxIFxpCisgICAgICAgIHNtdWxsICAgICAgICAgICByNCwgcjcsIHIxMSwgcjEyCisgICAgLmVsc2UKKyAgICAgICAgc21sYWwgICAgICAgICAgIHI0LCByNywgcjExLCByMTIKKyAgICAuZW5kaWYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMSwgW3I2LCAjNCo2NCooXGkrMSldCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtyMSwgIzQqNjQqKFxpKzEpXQorICAgICAgICByc2IgICAgICAgICAgICAgcjExLCByMTEsICMwCisgICAgICAgIHNtbGFsICAgICAgICAgICByOCwgIHI5LCAgcjEyLCByMTAKKyAgICAuaWZsdCBcaS02CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtyMCwgIzQqNjQqKFxpKzIpXQorICAgIC5lbHNlCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtyMiwgIy00XSEKKyAgICAuZW5kaWYKKyAgICAgICAgc21sYWwgICAgICAgICAgIHI0LCAgcjcsICByMTEsIHIxMAorICAuZW5kcgorICAuaXJwYyBpLCAwMjQ2CisgICAgICAgIGxkciAgICAgICAgICAgICByMTAsIFtyMSwgIzQqNjQqXGkrNCozMl0KKyAgICAgICAgcnNiICAgICAgICAgICAgIHIxMiwgcjEyLCAjMAorICAgICAgICBsZHIgICAgICAgICAgICAgcjExLCBbcjYsICM0KjY0KlxpKzQqMzJdCisgICAgICAgIHNtbGFsICAgICAgICAgICByOCwgIHI5LCAgcjEwLCByMTIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMCwgW3IyLCAjNCo2NCooXGkrMSldCisgICAgICAgIHNtbGFsICAgICAgICAgICByNCwgIHI3LCAgcjExLCByMTIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3IxLCAjNCo2NCooXGkrMSkrNCozMl0KKyAgICAgICAgcnNiICAgICAgICAgICAgIHIxMCwgcjEwLCAjMAorICAgICAgICBsZHIgICAgICAgICAgICAgcjExLCBbcjYsICM0KjY0KihcaSsxKSs0KjMyXQorICAgICAgICBzbWxhbCAgICAgICAgICAgcjgsICByOSwgIHIxMiwgcjEwCisgICAgLmlmbHQgXGktNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbcjIsICM0KjY0KihcaSsyKV0KKyAgICAuZWxzZQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM0MF0KKyAgICAuZW5kaWYKKyAgICAgICAgc21sYWwgICAgICAgICAgIHI0LCAgcjcsICByMTEsIHIxMAorICAuZW5kcgorICAgICAgICByb3VuZCAgICAgICAgICAgcjEwLCByOCwgIHI5CisgICAgICAgIGFkZHMgICAgICAgICAgICByOCwgIHI4LCAgcjQKKyAgICAgICAgYWRjICAgICAgICAgICAgIHI5LCAgcjksICByNworICAgICAgICBzdHJoX3Bvc3QgICAgICAgcjEwLCByMywgIHIxMgorICAgICAgICByb3VuZCAgICAgICAgICAgcjExLCByOCwgIHI5CisgICAgICAgIHN1YnMgICAgICAgICAgICBsciwgIGxyLCAgIzEKKyAgICAgICAgc3RyaF9kcG9zdCAgICAgIHIxMSwgcjUsIHIxMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICBzdW04ICAgICAgICAgICAgcjgsICByOSwgIHIxLCAgcjAsICByMTAsIHIxMSwgcjEyLCBsciwgcnNiLCAzMworICAgICAgICBwb3AgICAgICAgICAgICAge3I0fQorICAgICAgICByb3VuZCAgICAgICAgICAgcjEwLCByOCwgIHI5CisgICAgICAgIHN0ciAgICAgICAgICAgICByOCwgIFtyNF0KKyAgICAgICAgc3RyaCAgICAgICAgICAgIHIxMCwgW3IzXQorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjExLHBjfQorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWdhdWRpb2RzcF9pbml0X2FybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWdhdWRpb2RzcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZTBjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbXBlZ2F1ZGlvZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYW5zIFJ1bGxnYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWdhdWRpb2RzcC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCit2b2lkIGZmX21wYWRzcF9hcHBseV93aW5kb3dfZml4ZWRfYXJtdjYoaW50MzJfdCAqc3ludGhfYnVmLCBpbnQzMl90ICp3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXRoZXIsIGludDE2X3QgKm91dCwgaW50IGluY3IpOworCithdl9jb2xkIHZvaWQgZmZfbXBhZHNwX2luaXRfYXJtKE1QQURTUENvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX2FybXY2KGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+YXBwbHlfd2luZG93X2ZpeGVkID0gZmZfbXBhZHNwX2FwcGx5X3dpbmRvd19maXhlZF9hcm12NjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbXBlZ3ZpZGVvX2FybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWd2aWRlb19hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MThiZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWd2aWRlb19hcm0uYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW8uaCIKKyNpbmNsdWRlICJtcGVndmlkZW9fYXJtLmgiCisjaW5jbHVkZSAiYXNtLW9mZnNldHMuaCIKKworI2lmIEhBVkVfTkVPTgorQVZfQ0hFQ0tfT0ZGU0VUKE1wZWdFbmNDb250ZXh0LCB5X2RjX3NjYWxlLCAgICAgICBZX0RDX1NDQUxFKTsKK0FWX0NIRUNLX09GRlNFVChNcGVnRW5jQ29udGV4dCwgY19kY19zY2FsZSwgICAgICAgQ19EQ19TQ0FMRSk7CitBVl9DSEVDS19PRkZTRVQoTXBlZ0VuY0NvbnRleHQsIGFjX3ByZWQsICAgICAgICAgIEFDX1BSRUQpOworQVZfQ0hFQ0tfT0ZGU0VUKE1wZWdFbmNDb250ZXh0LCBibG9ja19sYXN0X2luZGV4LCBCTE9DS19MQVNUX0lOREVYKTsKK0FWX0NIRUNLX09GRlNFVChNcGVnRW5jQ29udGV4dCwgaW50ZXJfc2NhbnRhYmxlLnJhc3Rlcl9lbmQsCisgICAgICAgICAgICAgICAgSU5URVJfU0NBTlRBQl9SQVNURVJfRU5EKTsKK0FWX0NIRUNLX09GRlNFVChNcGVnRW5jQ29udGV4dCwgaDI2M19haWMsICAgICAgICAgSDI2M19BSUMpOworI2VuZGlmCisKK3ZvaWQgZmZfZGN0X3VucXVhbnRpemVfaDI2M19pbnRlcl9uZW9uKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgcXNjYWxlKTsKK3ZvaWQgZmZfZGN0X3VucXVhbnRpemVfaDI2M19pbnRyYV9uZW9uKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgcXNjYWxlKTsKKworYXZfY29sZCB2b2lkIGZmX21wdl9jb21tb25faW5pdF9hcm0oTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX2FybXY1dGUoY3B1X2ZsYWdzKSkKKyAgICAgICAgZmZfbXB2X2NvbW1vbl9pbml0X2FybXY1dGUocyk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+ZGN0X3VucXVhbnRpemVfaDI2M19pbnRyYSA9IGZmX2RjdF91bnF1YW50aXplX2gyNjNfaW50cmFfbmVvbjsKKyAgICAgICAgcy0+ZGN0X3VucXVhbnRpemVfaDI2M19pbnRlciA9IGZmX2RjdF91bnF1YW50aXplX2gyNjNfaW50ZXJfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbXBlZ3ZpZGVvX2FybS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWd2aWRlb19hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDlhZTZiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWd2aWRlb19hcm0uaApAQCAtMCwwICsxLDI2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BUk1fTVBFR1ZJREVPX0FSTV9ICisjZGVmaW5lIEFWQ09ERUNfQVJNX01QRUdWSURFT19BUk1fSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW8uaCIKKwordm9pZCBmZl9tcHZfY29tbW9uX2luaXRfYXJtdjV0ZShNcGVnRW5jQ29udGV4dCAqcyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FSTV9NUEVHVklERU9fQVJNX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tcGVndmlkZW9fYXJtdjV0ZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWd2aWRlb19hcm12NXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjNWY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tcGVndmlkZW9fYXJtdjV0ZS5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogT3B0aW1pemF0aW9uIG9mIHNvbWUgZnVuY3Rpb25zIGZyb20gbXBlZ3ZpZGVvLmMgZm9yIGFybXY1dGUKKyAqIENvcHlyaWdodCAoYykgMjAwNyBTaWFyaGVpIFNpYW1hc2hrYSA8c3N2YkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvX2FybS5oIgorCit2b2lkIGZmX2RjdF91bnF1YW50aXplX2gyNjNfYXJtdjV0ZShpbnQxNl90ICpibG9jaywgaW50IHFtdWwsIGludCBxYWRkLCBpbnQgY291bnQpOworCisjaWZkZWYgRU5BQkxFX0FSTV9URVNUUworLyoqCisgKiBoMjYzIGRlcXVhbnRpemVyIHN1cHBsZW1lbnRhcnkgZnVuY3Rpb24sIGl0IGlzIHBlcmZvcm1hbmNlIGNyaXRpY2FsIGFuZCBuZWVkcyB0bworICogaGF2ZSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb25zIGZvciBlYWNoIGFyY2hpdGVjdHVyZS4gSXMgYWxzbyB1c2VkIGFzIGEgcmVmZXJlbmNlCisgKiBpbXBsZW1lbnRhdGlvbiBpbiByZWdyZXNzaW9uIHRlc3RzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkY3RfdW5xdWFudGl6ZV9oMjYzX2hlbHBlcl9jKGludDE2X3QgKmJsb2NrLCBpbnQgcW11bCwgaW50IHFhZGQsIGludCBjb3VudCkKK3sKKyAgICBpbnQgaSwgbGV2ZWw7CisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgbGV2ZWwgPSBibG9ja1tpXTsKKyAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbCAqIHFtdWwgLSBxYWRkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsICogcW11bCArIHFhZGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibG9ja1tpXSA9IGxldmVsOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRjdF91bnF1YW50aXplX2gyNjNfaW50cmFfYXJtdjV0ZShNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IG4sIGludCBxc2NhbGUpCit7CisgICAgaW50IGxldmVsLCBxbXVsLCBxYWRkOworICAgIGludCBuQ29lZmZzOworCisgICAgYXZfYXNzZXJ0MihzLT5ibG9ja19sYXN0X2luZGV4W25dPj0wKTsKKworICAgIHFtdWwgPSBxc2NhbGUgPDwgMTsKKworICAgIGlmICghcy0+aDI2M19haWMpIHsKKyAgICAgICAgaWYgKG4gPCA0KQorICAgICAgICAgICAgbGV2ZWwgPSBibG9ja1swXSAqIHMtPnlfZGNfc2NhbGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxldmVsID0gYmxvY2tbMF0gKiBzLT5jX2RjX3NjYWxlOworICAgICAgICBxYWRkID0gKHFzY2FsZSAtIDEpIHwgMTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcWFkZCA9IDA7CisgICAgICAgIGxldmVsID0gYmxvY2tbMF07CisgICAgfQorICAgIGlmKHMtPmFjX3ByZWQpCisgICAgICAgIG5Db2VmZnM9NjM7CisgICAgZWxzZQorICAgICAgICBuQ29lZmZzPSBzLT5pbnRlcl9zY2FudGFibGUucmFzdGVyX2VuZFsgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSBdOworCisgICAgZmZfZGN0X3VucXVhbnRpemVfaDI2M19hcm12NXRlKGJsb2NrLCBxbXVsLCBxYWRkLCBuQ29lZmZzICsgMSk7CisgICAgYmxvY2tbMF0gPSBsZXZlbDsKK30KKworc3RhdGljIHZvaWQgZGN0X3VucXVhbnRpemVfaDI2M19pbnRlcl9hcm12NXRlKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgbiwgaW50IHFzY2FsZSkKK3sKKyAgICBpbnQgcW11bCwgcWFkZDsKKyAgICBpbnQgbkNvZWZmczsKKworICAgIGF2X2Fzc2VydDIocy0+YmxvY2tfbGFzdF9pbmRleFtuXT49MCk7CisKKyAgICBxYWRkID0gKHFzY2FsZSAtIDEpIHwgMTsKKyAgICBxbXVsID0gcXNjYWxlIDw8IDE7CisKKyAgICBuQ29lZmZzPSBzLT5pbnRlcl9zY2FudGFibGUucmFzdGVyX2VuZFsgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSBdOworCisgICAgZmZfZGN0X3VucXVhbnRpemVfaDI2M19hcm12NXRlKGJsb2NrLCBxbXVsLCBxYWRkLCBuQ29lZmZzICsgMSk7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9tcHZfY29tbW9uX2luaXRfYXJtdjV0ZShNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBzLT5kY3RfdW5xdWFudGl6ZV9oMjYzX2ludHJhID0gZGN0X3VucXVhbnRpemVfaDI2M19pbnRyYV9hcm12NXRlOworICAgIHMtPmRjdF91bnF1YW50aXplX2gyNjNfaW50ZXIgPSBkY3RfdW5xdWFudGl6ZV9oMjYzX2ludGVyX2FybXY1dGU7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbXBlZ3ZpZGVvX2FybXY1dGVfcy5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWd2aWRlb19hcm12NXRlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njg3ZDZiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWd2aWRlb19hcm12NXRlX3MuUwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIE9wdGltaXphdGlvbiBvZiBzb21lIGZ1bmN0aW9ucyBmcm9tIG1wZWd2aWRlby5jIGZvciBhcm12NXRlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgU2lhcmhlaSBTaWFtYXNoa2EgPHNzdmJAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworLyoKKyAqIFNwZWNpYWwgb3B0aW1pemVkIHZlcnNpb24gb2YgZGN0X3VucXVhbnRpemVfaDI2M19oZWxwZXJfYywgaXQKKyAqIHJlcXVpcmVzIHRoZSBibG9jayB0byBiZSBhdCBsZWFzdCA4IGJ5dGVzIGFsaWduZWQsIGFuZCBtYXkgcHJvY2VzcworICogbW9yZSBlbGVtZW50cyB0aGFuIHJlcXVlc3RlZC4gIEJ1dCBpdCBpcyBndWFyYW50ZWVkIHRvIG5ldmVyCisgKiBwcm9jZXNzIG1vcmUgdGhhbiA2NCBlbGVtZW50cyBwcm92aWRlZCB0aGF0IGNvdW50IGFyZ3VtZW50IGlzIDw9IDY0LAorICogc28gaXQgaXMgc2FmZS4gVGhpcyBmdW5jdGlvbiBpcyBvcHRpbWl6ZWQgZm9yIGEgY29tbW9uIGRpc3RyaWJ1dGlvbgorICogb2YgdmFsdWVzIGZvciBuQ29lZmZzICh0aGV5IGFyZSBtb3N0bHkgbXVsdGlwbGUgb2YgOCBwbHVzIG9uZSBvcgorICogdHdvIGV4dHJhIGVsZW1lbnRzKS4gU28gdGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgZGF0YSBhcyA4IGVsZW1lbnRzCisgKiBwZXIgbG9vcCBpdGVyYXRpb24gYW5kIGNvbnRhaW5zIG9wdGlvbmFsIDIgZWxlbWVudHMgcHJvY2Vzc2luZyBpbgorICogdGhlIGVuZC4KKyAqCisgKiBJbm5lciBsb29wIHNob3VsZCB0YWtlIDYgY3ljbGVzIHBlciBlbGVtZW50IG9uIGFybTkyNmVqLXMgKE5va2lhIDc3MCkKKyAqLworCisubWFjcm8gIGRlcXVhbnRfdCAgICAgICBkc3QsIHNyYywgbXVsLCBhZGQsIHRtcAorICAgICAgICByc2JzICAgICAgICAgICAgXHRtcCwgaXAsIFxzcmMsIGFzciAjMTYKKyAgICAgICAgaXQgICAgICAgICAgICAgIGd0CisgICAgICAgIGFkZGd0ICAgICAgICAgICBcdG1wLCBcYWRkLCAjMAorICAgICAgICBpdCAgICAgICAgICAgICAgbHQKKyAgICAgICAgcnNibHQgICAgICAgICAgIFx0bXAsIFxhZGQsICMwCisgICAgICAgIGl0ICAgICAgICAgICAgICBuZQorICAgICAgICBzbWxhdGJuZSAgICAgICAgXGRzdCwgXHNyYywgXG11bCwgXHRtcAorLmVuZG0KKworLm1hY3JvICBkZXF1YW50X2IgICAgICAgZHN0LCBzcmMsIG11bCwgYWRkLCB0bXAKKyAgICAgICAgcnNicyAgICAgICAgICAgIFx0bXAsIGlwLCBcc3JjLCBsc2wgIzE2CisgICAgICAgIGl0ICAgICAgICAgICAgICBndAorICAgICAgICBhZGRndCAgICAgICAgICAgXHRtcCwgXGFkZCwgIzAKKyAgICAgICAgaXQgICAgICAgICAgICAgIGx0CisgICAgICAgIHJzYmx0ICAgICAgICAgICBcdG1wLCBcYWRkLCAjMAorICAgICAgICBpdCAgICAgICAgICAgICAgbmUKKyAgICAgICAgc21sYWJibmUgICAgICAgIFxkc3QsIFxzcmMsIFxtdWwsIFx0bXAKKy5lbmRtCisKK2Z1bmN0aW9uIGZmX2RjdF91bnF1YW50aXplX2gyNjNfYXJtdjV0ZSwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOSxscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIGlwLCAjMAorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsIHIzLCAjMgorICAgICAgICBibGUgICAgICAgICAgICAgMmYKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI0LCByNSwgW3IwLCAjMF0KKzE6CisgICAgICAgIGxkcmQgICAgICAgICAgICByNiwgcjcsIFtyMCwgIzhdCisKKyAgICAgICAgZGVxdWFudF90ICAgICAgIHI5LCByNCwgcjEsIHIyLCByOQorICAgICAgICBkZXF1YW50X3QgICAgICAgbHIsIHI1LCByMSwgcjIsIGxyCisgICAgICAgIGRlcXVhbnRfYiAgICAgICByNCwgcjQsIHIxLCByMiwgcjgKKyAgICAgICAgZGVxdWFudF9iICAgICAgIHI1LCByNSwgcjEsIHIyLCByOAorCisgICAgICAgIHN0cmggICAgICAgICAgICByNCwgW3IwXSwgIzIKKyAgICAgICAgc3RyaCAgICAgICAgICAgIHI5LCBbcjBdLCAjMgorICAgICAgICBzdHJoICAgICAgICAgICAgcjUsIFtyMF0sICMyCisgICAgICAgIHN0cmggICAgICAgICAgICBsciwgW3IwXSwgIzIKKworICAgICAgICBkZXF1YW50X3QgICAgICAgcjksIHI2LCByMSwgcjIsIHI5CisgICAgICAgIGRlcXVhbnRfdCAgICAgICBsciwgcjcsIHIxLCByMiwgbHIKKyAgICAgICAgZGVxdWFudF9iICAgICAgIHI2LCByNiwgcjEsIHIyLCByOAorICAgICAgICBkZXF1YW50X2IgICAgICAgcjcsIHI3LCByMSwgcjIsIHI4CisKKyAgICAgICAgc3RyaCAgICAgICAgICAgIHI2LCBbcjBdLCAjMgorICAgICAgICBzdHJoICAgICAgICAgICAgcjksIFtyMF0sICMyCisgICAgICAgIHN0cmggICAgICAgICAgICByNywgW3IwXSwgIzIKKyAgICAgICAgc3RyaCAgICAgICAgICAgIGxyLCBbcjBdLCAjMgorCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgcjMsICM4CisgICAgICAgIGl0ICAgICAgICAgICAgICBndAorICAgICAgICBsZHJkZ3QgICAgICAgICAgcjQsIHI1LCBbcjAsICMwXSAvKiBsb2FkIGRhdGEgZWFybHkgdG8gYXZvaWQgbG9hZC91c2UgcGlwZWxpbmUgc3RhbGwgKi8KKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgYWRkcyAgICAgICAgICAgIHIzLCByMywgIzIKKyAgICAgICAgaXQgICAgICAgICAgICAgIGxlCisgICAgICAgIHBvcGxlICAgICAgICAgICB7cjQtcjkscGN9CisyOgorICAgICAgICBsZHJzaCAgICAgICAgICAgcjksIFtyMCwgIzBdCisgICAgICAgIGxkcnNoICAgICAgICAgICBsciwgW3IwLCAjMl0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHI4LCByMgorICAgICAgICBjbXAgICAgICAgICAgICAgcjksICMwCisgICAgICAgIGl0ICAgICAgICAgICAgICBsdAorICAgICAgICByc2JsdCAgICAgICAgICAgcjgsIHIyLCAjMAorICAgICAgICBpdCAgICAgICAgICAgICAgbmUKKyAgICAgICAgc21sYWJibmUgICAgICAgIHI5LCByOSwgcjEsIHI4CisgICAgICAgIG1vdiAgICAgICAgICAgICByOCwgcjIKKyAgICAgICAgY21wICAgICAgICAgICAgIGxyLCAjMAorICAgICAgICBpdCAgICAgICAgICAgICAgbHQKKyAgICAgICAgcnNibHQgICAgICAgICAgIHI4LCByMiwgIzAKKyAgICAgICAgaXQgICAgICAgICAgICAgIG5lCisgICAgICAgIHNtbGFiYm5lICAgICAgICBsciwgbHIsIHIxLCByOAorICAgICAgICBzdHJoICAgICAgICAgICAgcjksIFtyMF0sICMyCisgICAgICAgIHN0cmggICAgICAgICAgICBsciwgW3IwXSwgIzIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSxwY30KK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tcGVndmlkZW9fbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWd2aWRlb19uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4OWQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tcGVndmlkZW9fbmVvbi5TCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hbnMgUnVsbGdhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisjaW5jbHVkZSAiYXNtLW9mZnNldHMuaCIKKworZnVuY3Rpb24gZmZfZGN0X3VucXVhbnRpemVfaDI2M19pbnRlcl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMCwgICNCTE9DS19MQVNUX0lOREVYCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtyMTIsIHIyLCBsc2wgIzJdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgI0lOVEVSX1NDQU5UQUJfUkFTVEVSX0VORAorICAgICAgICBsZHJiICAgICAgICAgICAgcjEyLCBbcjAsIHIxMl0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjMsICAjMQorICAgICAgICBsc2wgICAgICAgICAgICAgcjAsICByMywgICMxCisgICAgICAgIG9yciAgICAgICAgICAgICByMiwgIHIyLCAgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjEyLCAjMQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9kY3RfdW5xdWFudGl6ZV9oMjYzX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZkdXAuMTYgICAgICAgICBxMTUsIHIwICAgICAgICAgICAgICAgICBAIHFtdWwKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHExNCwgcjIgICAgICAgICAgICAgICAgIEAgcWFkZAorICAgICAgICB2bmVnLnMxNiAgICAgICAgcTEzLCBxMTQKKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgcjEKKyAgICAgICAgYmxlICAgICAgICAgICAgIDJmCisxOgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdmNsdC5zMTYgICAgICAgIHEzLCAgcTAsICAjMAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3E4fSwgICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdmNlcS5zMTYgICAgICAgIHExLCAgcTAsICAjMAorICAgICAgICB2bXVsLnMxNiAgICAgICAgcTIsICBxMCwgIHExNQorICAgICAgICB2Y2x0LnMxNiAgICAgICAgcTExLCBxOCwgICMwCisgICAgICAgIHZtdWwuczE2ICAgICAgICBxMTAsIHE4LCAgcTE1CisgICAgICAgIHZic2wgICAgICAgICAgICBxMywgIHExMywgcTE0CisgICAgICAgIHZic2wgICAgICAgICAgICBxMTEsIHExMywgcTE0CisgICAgICAgIHZhZGQuczE2ICAgICAgICBxMiwgIHEyLCAgcTMKKyAgICAgICAgdmNlcS5zMTYgICAgICAgIHE5LCAgcTgsICAjMAorICAgICAgICB2YWRkLnMxNiAgICAgICAgcTEwLCBxMTAsIHExMQorICAgICAgICB2YmlmICAgICAgICAgICAgcTAsICBxMiwgIHExCisgICAgICAgIHZiaWYgICAgICAgICAgICBxOCwgIHExMCwgcTkKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMTYKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMH0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTh9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICBpdCAgICAgICAgICAgICAgbGUKKyAgICAgICAgYnhsZSAgICAgICAgICAgIGxyCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICM4CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorMjoKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XQorICAgICAgICB2Y2x0LnMxNiAgICAgICAgZDMsICBkMCwgICMwCisgICAgICAgIHZjZXEuczE2ICAgICAgICBkMSwgIGQwLCAgIzAKKyAgICAgICAgdm11bC5zMTYgICAgICAgIGQyLCAgZDAsICBkMzAKKyAgICAgICAgdmJzbCAgICAgICAgICAgIGQzLCAgZDI2LCBkMjgKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIGQyLCAgZDIsICBkMworICAgICAgICB2YmlmICAgICAgICAgICAgZDAsICBkMiwgIGQxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDB9LCAgICAgW3IxLDo2NF0KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2RjdF91bnF1YW50aXplX2gyNjNfaW50cmFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yNixscn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjAsICAjQkxPQ0tfTEFTVF9JTkRFWAorICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbcjAsICNBQ19QUkVEXQorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICByMCwgICNJTlRFUl9TQ0FOVEFCX1JBU1RFUl9FTkQKKyAgICAgICAgY21wICAgICAgICAgICAgIHI2LCAgIzAKKyAgICAgICAgaXQgICAgICAgICAgICAgIG5lCisgICAgICAgIG1vdm5lICAgICAgICAgICByMTIsICM2MworICAgICAgICBibmUgICAgICAgICAgICAgMWYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3IxMiwgcjIsIGxzbCAjMl0KKyAgICAgICAgbGRyYiAgICAgICAgICAgIHIxMiwgW2xyLCByMTJdCisxOiAgICAgIGxkciAgICAgICAgICAgICByNSwgIFtyMCwgI0gyNjNfQUlDXQorICAgICAgICBsZHJzaCAgICAgICAgICAgcjQsICBbcjFdCisgICAgICAgIGNtcCAgICAgICAgICAgICByNSwgICMwCisgICAgICAgIG1vdiAgICAgICAgICAgICByNSwgIHIxCisgICAgICAgIGl0ICAgICAgICAgICAgICBuZQorICAgICAgICBtb3ZuZSAgICAgICAgICAgcjIsICAjMAorICAgICAgICBibmUgICAgICAgICAgICAgMmYKKyAgICAgICAgY21wICAgICAgICAgICAgIHIyLCAgIzQKKyAgICAgICAgaXQgICAgICAgICAgICAgIGdlCisgICAgICAgIGFkZGdlICAgICAgICAgICByMCwgIHIwLCAgIzQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjMsICAjMQorICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbcjAsICNZX0RDX1NDQUxFXQorICAgICAgICBvcnIgICAgICAgICAgICAgcjIsICByMiwgICMxCisgICAgICAgIHNtdWxiYiAgICAgICAgICByNCwgIHI0LCAgcjYKKzI6ICAgICAgbHNsICAgICAgICAgICAgIHIwLCAgcjMsICAjMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsICByMTIsICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBYKGZmX2RjdF91bnF1YW50aXplX2gyNjNfbmVvbikKKyAgICAgICAgdm1vdi4xNiAgICAgICAgIGQwWzBdLCByNAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwWzBdfSwgIFtyNV0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNixwY30KK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tcGVndmlkZW9lbmNkc3BfYXJtdjYuUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tcGVndmlkZW9lbmNkc3BfYXJtdjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjBkYWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL21wZWd2aWRlb2VuY2RzcF9hcm12Ni5TCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9waXhfbm9ybTFfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjYsIGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgIzAKKzE6CisgICAgICAgIGxkbSAgICAgICAgICAgICByMCwgIHtyMi1yNX0KKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI2LCAgcjIKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHIyLCAgcjIsICByb3IgIzgKKyAgICAgICAgc21sYWQgICAgICAgICAgIGxyLCAgcjYsICByNiwgIGxyCisgICAgICAgIHV4dGIxNiAgICAgICAgICByNiwgIHIzCisgICAgICAgIHNtbGFkICAgICAgICAgICBsciwgIHIyLCAgcjIsICBscgorICAgICAgICB1eHRiMTYgICAgICAgICAgcjMsICByMywgIHJvciAjOAorICAgICAgICBzbWxhZCAgICAgICAgICAgbHIsICByNiwgIHI2LCAgbHIKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI2LCAgcjQKKyAgICAgICAgc21sYWQgICAgICAgICAgIGxyLCAgcjMsICByMywgIGxyCisgICAgICAgIHV4dGIxNiAgICAgICAgICByNCwgIHI0LCAgcm9yICM4CisgICAgICAgIHNtbGFkICAgICAgICAgICBsciwgIHI2LCAgcjYsICBscgorICAgICAgICB1eHRiMTYgICAgICAgICAgcjYsICByNQorICAgICAgICBzbWxhZCAgICAgICAgICAgbHIsICByNCwgIHI0LCAgbHIKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI1LCAgcjUsICByb3IgIzgKKyAgICAgICAgc21sYWQgICAgICAgICAgIGxyLCAgcjYsICByNiwgIGxyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMQorICAgICAgICBzbWxhZCAgICAgICAgICAgbHIsICByNSwgIHI1LCAgbHIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgbHIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNiwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3BpeF9zdW1fYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjcsIGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIyLCAgIzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgIzAKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3IwXQorMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICBsZHIgICAgICAgICAgICAgcjUsICBbcjAsICM0XQorICAgICAgICB1c2FkYTggICAgICAgICAgcjIsICByNCwgIGxyLCAgcjIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3IwLCAjOF0KKyAgICAgICAgdXNhZGE4ICAgICAgICAgIHIzLCAgcjUsICBsciwgIHIzCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMCwgIzEyXQorICAgICAgICB1c2FkYTggICAgICAgICAgcjIsICByNiwgIGxyLCAgcjIKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisgICAgICAgIGxkcl9wcmUgICAgICAgICByNCwgIHIwLCAgcjEKKyAgICAgICAgdXNhZGE4ICAgICAgICAgIHIzLCAgcjcsICBsciwgIHIzCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorMjoKKyAgICAgICAgdXNhZGE4ICAgICAgICAgIHIzLCAgcjcsICBsciwgIHIzCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIyLCAgcjMKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNywgcGN9CitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbXBlZ3ZpZGVvZW5jZHNwX2luaXRfYXJtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbXBlZ3ZpZGVvZW5jZHNwX2luaXRfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmZTgzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9tcGVndmlkZW9lbmNkc3BfaW5pdF9hcm0uYwpAQCAtMCwwICsxLDM4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZ3ZpZGVvZW5jZHNwLmgiCisKK2ludCBmZl9waXhfbm9ybTFfYXJtdjYodWludDhfdCAqcGl4LCBpbnQgbGluZV9zaXplKTsKK2ludCBmZl9waXhfc3VtX2FybXY2KHVpbnQ4X3QgKnBpeCwgaW50IGxpbmVfc2l6ZSk7CisKK2F2X2NvbGQgdm9pZCBmZl9tcGVndmlkZW9lbmNkc3BfaW5pdF9hcm0oTXBlZ3ZpZGVvRW5jRFNQQ29udGV4dCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9hcm12NihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnBpeF9ub3JtMSA9IGZmX3BpeF9ub3JtMV9hcm12NjsKKyAgICAgICAgYy0+cGl4X3N1bSAgID0gZmZfcGl4X3N1bV9hcm12NjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODdiYzRiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL25lb24uUwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisubWFjcm8gIHRyYW5zcG9zZV84eDggICByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcKKyAgICAgICAgdnRybi4zMiAgICAgICAgIFxyMCwgXHI0CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBccjEsIFxyNQorICAgICAgICB2dHJuLjMyICAgICAgICAgXHIyLCBccjYKKyAgICAgICAgdnRybi4zMiAgICAgICAgIFxyMywgXHI3CisgICAgICAgIHZ0cm4uMTYgICAgICAgICBccjAsIFxyMgorICAgICAgICB2dHJuLjE2ICAgICAgICAgXHIxLCBccjMKKyAgICAgICAgdnRybi4xNiAgICAgICAgIFxyNCwgXHI2CisgICAgICAgIHZ0cm4uMTYgICAgICAgICBccjUsIFxyNworICAgICAgICB2dHJuLjggICAgICAgICAgXHIwLCBccjEKKyAgICAgICAgdnRybi44ICAgICAgICAgIFxyMiwgXHIzCisgICAgICAgIHZ0cm4uOCAgICAgICAgICBccjQsIFxyNQorICAgICAgICB2dHJuLjggICAgICAgICAgXHI2LCBccjcKKy5lbmRtCisKKy5tYWNybyAgdHJhbnNwb3NlXzR4NCAgIHIwLCByMSwgcjIsIHIzCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBccjAsIFxyMgorICAgICAgICB2dHJuLjE2ICAgICAgICAgXHIxLCBccjMKKyAgICAgICAgdnRybi44ICAgICAgICAgIFxyMCwgXHIxCisgICAgICAgIHZ0cm4uOCAgICAgICAgICBccjIsIFxyMworLmVuZG0KKworLm1hY3JvICBzd2FwNCAgICAgICAgICAgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3CisgICAgICAgIHZzd3AgICAgICAgICAgICBccjAsIFxyNAorICAgICAgICB2c3dwICAgICAgICAgICAgXHIxLCBccjUKKyAgICAgICAgdnN3cCAgICAgICAgICAgIFxyMiwgXHI2CisgICAgICAgIHZzd3AgICAgICAgICAgICBccjMsIFxyNworLmVuZG0KKworLm1hY3JvICB0cmFuc3Bvc2UxNl80eDQgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBccjAsIFxyMgorICAgICAgICB2dHJuLjMyICAgICAgICAgXHIxLCBccjMKKyAgICAgICAgdnRybi4zMiAgICAgICAgIFxyNCwgXHI2CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBccjUsIFxyNworICAgICAgICB2dHJuLjE2ICAgICAgICAgXHIwLCBccjEKKyAgICAgICAgdnRybi4xNiAgICAgICAgIFxyMiwgXHIzCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBccjQsIFxyNQorICAgICAgICB2dHJuLjE2ICAgICAgICAgXHI2LCBccjcKKy5lbmRtCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbmVvbnRlc3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9uZW9udGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjViOGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vbmVvbnRlc3QuYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogY2hlY2sgTkVPTiByZWdpc3RlcnMgZm9yIGNsb2JiZXJzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vbmVvbnRlc3QuaCIKKword3JhcChhdmNvZGVjX29wZW4yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICBBVkNvZGVjICpjb2RlYywKKyAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKipvcHRpb25zKSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfb3BlbjIsIGF2Y3R4LCBjb2RlYywgb3B0aW9ucyk7Cit9CisKK3dyYXAoYXZjb2RlY19kZWNvZGVfYXVkaW80KEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfZGVjb2RlX2F1ZGlvNCwgYXZjdHgsIGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgZ290X2ZyYW1lX3B0ciwgYXZwa3QpOworfQorCit3cmFwKGF2Y29kZWNfZGVjb2RlX3ZpZGVvMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfcGljdHVyZV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpKQoreworICAgIHRlc3RuZW9uY2xvYmJlcnMoYXZjb2RlY19kZWNvZGVfdmlkZW8yLCBhdmN0eCwgcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgIGdvdF9waWN0dXJlX3B0ciwgYXZwa3QpOworfQorCit3cmFwKGF2Y29kZWNfZGVjb2RlX3N1YnRpdGxlMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN1YnRpdGxlICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9zdWJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfZGVjb2RlX3N1YnRpdGxlMiwgYXZjdHgsIHN1YiwKKyAgICAgICAgICAgICAgICAgICAgIGdvdF9zdWJfcHRyLCBhdnBrdCk7Cit9CisKK3dyYXAoYXZjb2RlY19lbmNvZGVfYXVkaW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfcGFja2V0X3B0cikpCit7CisgICAgdGVzdG5lb25jbG9iYmVycyhhdmNvZGVjX2VuY29kZV9hdWRpbzIsIGF2Y3R4LCBhdnBrdCwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICBnb3RfcGFja2V0X3B0cik7Cit9CisKK3dyYXAoYXZjb2RlY19lbmNvZGVfc3VidGl0bGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZTdWJ0aXRsZSAqc3ViKSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfZW5jb2RlX3N1YnRpdGxlLCBhdmN0eCwgYnVmLCBidWZfc2l6ZSwgc3ViKTsKK30KKword3JhcChhdmNvZGVjX2VuY29kZV92aWRlbzIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikpCit7CisgICAgdGVzdG5lb25jbG9iYmVycyhhdmNvZGVjX2VuY29kZV92aWRlbzIsIGF2Y3R4LCBhdnBrdCwgZnJhbWUsIGdvdF9wYWNrZXRfcHRyKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9waXhibG9ja2RzcF9hcm12Ni5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3BpeGJsb2NrZHNwX2FybXY2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEwZWE3OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9waXhibG9ja2RzcF9hcm12Ni5TCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9nZXRfcGl4ZWxzX2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOCwgbHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgICM4CisxOgorICAgICAgICBsZHJkX3Bvc3QgICAgICAgcjQsICByNSwgIHIxLCAgcjIKKyAgICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjMQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjYsICByNAorICAgICAgICB1eHRiMTYgICAgICAgICAgcjQsICByNCwgIHJvciAjOAorICAgICAgICB1eHRiMTYgICAgICAgICAgcjEyLCByNQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjgsICByNSwgIHJvciAjOAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByMl0KKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI1LCAgcjYsICByNCwgIGxzbCAjMTYKKyAgICAgICAgcGtodGIgICAgICAgICAgIHI2LCAgcjQsICByNiwgIGFzciAjMTYKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI3LCAgcjEyLCByOCwgIGxzbCAjMTYKKyAgICAgICAgcGtodGIgICAgICAgICAgIHIxMiwgcjgsICByMTIsIGFzciAjMTYKKyAgICAgICAgc3RtICAgICAgICAgICAgIHIwISwge3I1LHI2LHI3LHIxMn0KKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOCwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2RpZmZfcGl4ZWxzX2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByM10KKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMiwgcjNdCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjksIGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICAjOAorMToKKyAgICAgICAgbGRyZF9wb3N0ICAgICAgIHI0LCAgcjUsICByMSwgIHIzCisgICAgICAgIGxkcmRfcG9zdCAgICAgICByNiwgIHI3LCAgcjIsICByMworICAgICAgICB1eHRiMTYgICAgICAgICAgcjgsICByNAorICAgICAgICB1eHRiMTYgICAgICAgICAgcjQsICByNCwgIHJvciAjOAorICAgICAgICB1eHRiMTYgICAgICAgICAgcjksICByNgorICAgICAgICB1eHRiMTYgICAgICAgICAgcjYsICByNiwgIHJvciAjOAorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCByM10KKyAgICAgICAgc3N1YjE2ICAgICAgICAgIHI5LCAgcjgsICByOQorICAgICAgICBzc3ViMTYgICAgICAgICAgcjYsICByNCwgIHI2CisgICAgICAgIHV4dGIxNiAgICAgICAgICByOCwgIHI1CisgICAgICAgIHV4dGIxNiAgICAgICAgICByNSwgIHI1LCAgcm9yICM4CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjIsIHIzXQorICAgICAgICBwa2hidCAgICAgICAgICAgcjQsICByOSwgIHI2LCAgbHNsICMxNgorICAgICAgICBwa2h0YiAgICAgICAgICAgcjYsICByNiwgIHI5LCAgYXNyICMxNgorICAgICAgICB1eHRiMTYgICAgICAgICAgcjksICByNworICAgICAgICB1eHRiMTYgICAgICAgICAgcjcsICByNywgIHJvciAjOAorICAgICAgICBzc3ViMTYgICAgICAgICAgcjksICByOCwgIHI5CisgICAgICAgIHNzdWIxNiAgICAgICAgICByNSwgIHI1LCAgcjcKKyAgICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjMQorICAgICAgICBwa2hidCAgICAgICAgICAgcjgsICByOSwgIHI1LCAgbHNsICMxNgorICAgICAgICBwa2h0YiAgICAgICAgICAgcjksICByNSwgIHI5LCAgYXNyICMxNgorICAgICAgICBzdG0gICAgICAgICAgICAgcjAhLCB7cjQscjYscjgscjl9CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjksIHBjfQorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3BpeGJsb2NrZHNwX2luaXRfYXJtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vcGl4YmxvY2tkc3BfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmQ3NTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3BpeGJsb2NrZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvcGl4YmxvY2tkc3AuaCIKKwordm9pZCBmZl9nZXRfcGl4ZWxzX2FybXY2KGludDE2X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9kaWZmX3BpeGVsc19hcm12NihpbnQxNl90ICpibG9jaywgY29uc3QgdWludDhfdCAqczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnMyLCBpbnQgc3RyaWRlKTsKKworYXZfY29sZCB2b2lkIGZmX3BpeGJsb2NrZHNwX2luaXRfYXJtKFBpeGJsb2NrRFNQQ29udGV4dCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX2FybXY2KGNwdV9mbGFncykpIHsKKyAgICAgICAgaWYgKCFoaWdoX2JpdF9kZXB0aCkKKyAgICAgICAgICAgIGMtPmdldF9waXhlbHMgPSBmZl9nZXRfcGl4ZWxzX2FybXY2OworICAgICAgICBjLT5kaWZmX3BpeGVscyA9IGZmX2RpZmZfcGl4ZWxzX2FybXY2OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9yZGZ0X25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9yZGZ0X25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODFkOTc2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3JkZnRfbmVvbi5TCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQVJNIE5FT04gb3B0aW1pc2VkIFJERlQKKyAqIENvcHlyaWdodCAoYykgMjAwOSBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKK2Z1bmN0aW9uIGZmX3JkZnRfY2FsY19uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI4LGxyfQorCisgICAgICAgIGxkciAgICAgICAgICAgICByNiwgIFtyMCwgIzRdICAgICAgICAgICBAIGludmVyc2UKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI0LCAgcjAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI1LCAgcjEKKworICAgICAgICBsc2xzICAgICAgICAgICAgcjYsICByNiwgICMzMQorICAgICAgICBibmUgICAgICAgICAgICAgMWYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjQsICAjMjAKKyAgICAgICAgYmwgICAgICAgICAgICAgIFgoZmZfZmZ0X3Blcm11dGVfbmVvbikKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjQsICAjMjAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgcjUKKyAgICAgICAgYmwgICAgICAgICAgICAgIFgoZmZfZmZ0X2NhbGNfbmVvbikKKzE6CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtyNCwgIzBdICAgICAgICAgICBAIG5iaXRzCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgICMxCisgICAgICAgIGxzbCAgICAgICAgICAgICByMTIsIHIyLCAgcjEyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHI1LCAgIzgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjUsICByMTIsIGxzbCAjMgorICAgICAgICBsc3IgICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGxkciAgICAgICAgICAgICByMiwgIFtyNCwgIzEyXSAgICAgICAgICBAIHRjb3MKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbcjQsICMxNl0gICAgICAgICAgQCB0c2luCisgICAgICAgIG1vdiAgICAgICAgICAgICByNywgIHIwCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzgKKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgcjEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI4LCAgIy04CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDB9LCAgICAgW3IwLDo2NF0hICAgICBAIGQxWzAsMV0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMX0sICAgICBbcjEsOjY0XSwgcjggIEAgZDJbMCwxXQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0fSwgICAgIFtyMiw6NjRdISAgICAgQCB0Y29zW2ldCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDV9LCAgICAgW3IzLDo2NF0hICAgICBAIHRzaW5baV0KKyAgICAgICAgdm1vdi5mMzIgICAgICAgIGQxOCwgIzAuNSAgICAgICAgICAgICAgIEAgazEKKyAgICAgICAgdmR1cC4zMiAgICAgICAgIGQxOSwgcjYKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMCwgIzMyXQorICAgICAgICB2ZW9yICAgICAgICAgICAgZDE5LCBkMTgsIGQxOSAgICAgICAgICAgQCBrMgorICAgICAgICB2bW92LmkzMiAgICAgICAgZDE2LCAjMAorICAgICAgICB2bW92LmkzMiAgICAgICAgZDE3LCAjMTw8MzEKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMSwgIy0zMl0KKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQxNiwgZDE3CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjIsICMzMl0KKyAgICAgICAgdnJldjY0LjMyICAgICAgIGQxNiwgZDE2ICAgICAgICAgICAgICAgIEAgZDE2PTEsMCBkMTc9MCwxCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjMsICMzMl0KKzI6CisgICAgICAgIHZlb3IgICAgICAgICAgICBxMSwgIHEwLCAgcTggICAgICAgICAgICBAIC1kMVswXSxkMVsxXSwgZDJbMF0sLWQyWzFdCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI0fSwgICAgW3IwLDo2NF0hICAgICBAICBkMVswLDFdCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMCwgIGQwLCAgZDMgICAgICAgICAgICBAICBkMVswXStkMlswXSwgZDFbMV0tZDJbMV0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjV9LCAgICBbcjEsOjY0XSwgcjggIEAgIGQyWzAsMV0KKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQxLCAgZDIsICBkMSAgICAgICAgICAgIEAgLWQxWzBdK2QyWzBdLCBkMVsxXStkMlsxXQorICAgICAgICB2ZW9yICAgICAgICAgICAgcTMsICBxMTIsIHE4ICAgICAgICAgICAgQCAtZDFbMF0sZDFbMV0sIGQyWzBdLC1kMlsxXQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IwLCAjMzJdCisgICAgICAgIHZtdWwuZjMyICAgICAgICBxMTAsIHEwLCAgcTkgICAgICAgICAgICBAICBldi5yZSwgZXYuaW0sIG9kLmltLCBvZC5yZQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IxLCAjLTMyXQorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDAsICBkMjQsIGQ3ICAgICAgICAgICAgQCAgZDFbMF0rZDJbMF0sIGQxWzFdLWQyWzFdCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMSwgIGQ2LCAgZDI1ICAgICAgICAgICBAIC1kMVswXStkMlswXSwgZDFbMV0rZDJbMV0KKyAgICAgICAgdm11bC5mMzIgICAgICAgIHExMSwgcTAsICBxOSAgICAgICAgICAgIEAgIGV2LnJlLCBldi5pbSwgb2QuaW0sIG9kLnJlCisgICAgICAgIHZlb3IgICAgICAgICAgICBkNywgIGQyMSwgZDE2ICAgICAgICAgICBAIC1vZC5pbSwgb2QucmUKKyAgICAgICAgdnJldjY0LjMyICAgICAgIGQzLCAgZDIxICAgICAgICAgICAgICAgIEAgIG9kLnJlLCBvZC5pbQorICAgICAgICB2ZW9yICAgICAgICAgICAgZDYsICBkMjAsIGQxNyAgICAgICAgICAgQCAgZXYucmUsLWV2LmltCisgICAgICAgIHZlb3IgICAgICAgICAgICBkMiwgIGQzLCAgZDE2ICAgICAgICAgICBAIC1vZC5yZSwgb2QuaW0KKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQyMCwgZDMsICBkNFsxXQorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDIwLCBkNywgIGQ1WzFdCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkNiwgIGQyLCAgZDRbMV0KKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQ2LCAgZDIxLCBkNVsxXQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0fSwgICAgIFtyMiw6NjRdISAgICAgQCAgdGNvc1tpXQorICAgICAgICB2ZW9yICAgICAgICAgICAgZDcsICBkMjMsIGQxNiAgICAgICAgICAgQCAtb2QuaW0sIG9kLnJlCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDV9LCAgICAgW3IzLDo2NF0hICAgICBAICB0c2luW2ldCisgICAgICAgIHZlb3IgICAgICAgICAgICBkMjQsIGQyMiwgZDE3ICAgICAgICAgICBAICBldi5yZSwtZXYuaW0KKyAgICAgICAgdnJldjY0LjMyICAgICAgIGQzLCAgZDIzICAgICAgICAgICAgICAgIEAgIG9kLnJlLCBvZC5pbQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IyLCAjMzJdCisgICAgICAgIHZlb3IgICAgICAgICAgICBkMiwgIGQzLCAgZDE2ICAgICAgICAgICBAIC1vZC5yZSwgb2QuaW0KKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMywgIzMyXQorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDIyLCBkMywgIGQ0WzBdCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMjIsIGQ3LCAgZDVbMF0KKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQyNCwgZDIsICBkNFswXQorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDI0LCBkMjMsIGQ1WzBdCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDB9LCAgICAgW3IwLDo2NF0hICAgICBAICBkMVswLDFdCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDF9LCAgICAgW3IxLDo2NF0sIHI4ICBAICBkMlswLDFdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIwfSwgICAgW3I3LDo2NF0hCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDZ9LCAgICAgW2xyLDo2NF0sIHI4CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyfSwgICAgW3I3LDo2NF0hCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDI0fSwgICAgW2xyLDo2NF0sIHI4CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDJiCisKKyAgICAgICAgdmVvciAgICAgICAgICAgIHExLCAgcTAsICBxOCAgICAgICAgICAgIEAgLWQxWzBdLGQxWzFdLCBkMlswXSwtZDJbMV0KKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQwLCAgZDAsICBkMyAgICAgICAgICAgIEAgIGQxWzBdK2QyWzBdLCBkMVsxXS1kMlsxXQorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDEsICBkMiwgIGQxICAgICAgICAgICAgQCAtZDFbMF0rZDJbMF0sIGQxWzFdK2QyWzFdCisgICAgICAgIGxkciAgICAgICAgICAgICByMiwgIFtyNCwgIzhdICAgICAgICAgICBAICBzaWduX2NvbnZlbnRpb24KKyAgICAgICAgdm11bC5mMzIgICAgICAgIHExMCwgcTAsICBxOSAgICAgICAgICAgIEAgIGV2LnJlLCBldi5pbSwgb2QuaW0sIG9kLnJlCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzQKKyAgICAgICAgYmZjICAgICAgICAgICAgIHIyLCAgIzAsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMFswXX0sICBbcjAsOjMyXQorICAgICAgICB2ZW9yICAgICAgICAgICAgZDcsICBkMjEsIGQxNiAgICAgICAgICAgQCAtb2QuaW0sIG9kLnJlCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBkMywgIGQyMSAgICAgICAgICAgICAgICBAICBvZC5yZSwgb2QuaW0KKyAgICAgICAgdmVvciAgICAgICAgICAgIGQ2LCAgZDIwLCBkMTcgICAgICAgICAgIEAgIGV2LnJlLC1ldi5pbQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyMn0sICAgIFtyNSw6NjRdCisgICAgICAgIHZkdXAuMzIgICAgICAgICBkMSwgIHIyCisgICAgICAgIHZtb3YgICAgICAgICAgICBkMjMsIGQyMgorICAgICAgICB2ZW9yICAgICAgICAgICAgZDIsICBkMywgIGQxNiAgICAgICAgICAgQCAtb2QucmUsIG9kLmltCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkMjIsIGQyMworICAgICAgICB2ZW9yICAgICAgICAgICAgZDAsICBkMCwgIGQxCisgICAgICAgIHZlb3IgICAgICAgICAgICBkMjMsIGQyMywgZDE3CisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMjAsIGQzLCAgZDRbMV0KKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQyMCwgZDcsICBkNVsxXQorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDYsICBkMiwgIGQ0WzFdCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkNiwgIGQyMSwgZDVbMV0KKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQyMiwgZDIyLCBkMjMKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjB9LCAgICBbcjcsOjY0XQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q2fSwgICAgIFtsciw6NjRdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCAgW3IwLDozMl0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJ9LCAgICBbcjUsOjY0XQorCisgICAgICAgIGNtcCAgICAgICAgICAgICByNiwgICMwCisgICAgICAgIGl0ICAgICAgICAgICAgICBlcQorICAgICAgICBwb3BlcSAgICAgICAgICAge3I0LXI4LHBjfQorCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMjIsIGQyMiwgZDE4CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyfSwgICAgW3I1LDo2NF0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjQsICAjMjAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgcjUKKyAgICAgICAgYmwgICAgICAgICAgICAgIFgoZmZfZmZ0X3Blcm11dGVfbmVvbikKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjQsICAjMjAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgcjUKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOCxscn0KKyAgICAgICAgYiAgICAgICAgICAgICAgIFgoZmZfZmZ0X2NhbGNfbmVvbikKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ydjM0ZHNwX2luaXRfYXJtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vcnYzNGRzcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZmU5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vcnYzNGRzcF9pbml0X2FybS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmFubmUgR3J1bmF1IDxqYW5uZS1saWJhdkBqYW5uYXUubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvcnYzNGRzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisKK3ZvaWQgZmZfcnYzNF9pbnZfdHJhbnNmb3JtX25vcm91bmRfbmVvbihpbnQxNl90ICpibG9jayk7CisKK3ZvaWQgZmZfcnYzNF9pbnZfdHJhbnNmb3JtX25vcm91bmRfZGNfbmVvbihpbnQxNl90ICpibG9jayk7CisKK3ZvaWQgZmZfcnYzNF9pZGN0X2FkZF9uZW9uKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9ydjM0X2lkY3RfZGNfYWRkX25lb24odWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgZGMpOworCithdl9jb2xkIHZvaWQgZmZfcnYzNGRzcF9pbml0X2FybShSVjM0RFNQQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnJ2MzRfaW52X3RyYW5zZm9ybSAgICA9IGZmX3J2MzRfaW52X3RyYW5zZm9ybV9ub3JvdW5kX25lb247CisgICAgICAgIGMtPnJ2MzRfaW52X3RyYW5zZm9ybV9kYyA9IGZmX3J2MzRfaW52X3RyYW5zZm9ybV9ub3JvdW5kX2RjX25lb247CisKKyAgICAgICAgYy0+cnYzNF9pZGN0X2FkZCAgICA9IGZmX3J2MzRfaWRjdF9hZGRfbmVvbjsKKyAgICAgICAgYy0+cnYzNF9pZGN0X2RjX2FkZCA9IGZmX3J2MzRfaWRjdF9kY19hZGRfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vcnYzNGRzcF9uZW9uLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vcnYzNGRzcF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0YTgzZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ydjM0ZHNwX25lb24uUwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBKYW5uZSBHcnVuYXUgPGphbm5lLWxpYmF2QGphbm5hdS5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorI2luY2x1ZGUgIm5lb24uUyIKKworLm1hY3JvIHJ2MzRfaW52X3RyYW5zZm9ybSAgICByMAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExNC1xMTV9LCBbXHIwLDoxMjhdCisgICAgICAgIHZtb3YuczE2ICAgICAgICBkMCwgICMxMworICAgICAgICB2c2hsbC5zMTYgICAgICAgcTEyLCBkMjksICMzCisgICAgICAgIHZzaGxsLnMxNiAgICAgICBxMTMsIGQyOSwgIzQKKyAgICAgICAgdnNobGwuczE2ICAgICAgIHE5LCAgZDMxLCAjMworICAgICAgICB2c2hsbC5zMTYgICAgICAgcTEsICBkMzEsICM0CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTAsIGQyOCwgZDAKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHExMCwgZDMwLCBkMAorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTExLCBkMjgsIGQwCisgICAgICAgIHZtbHNsLnMxNiAgICAgICBxMTEsIGQzMCwgZDAKKyAgICAgICAgdnN1YncuczE2ICAgICAgIHExMiwgcTEyLCBkMjkgICBAIHoyID0gYmxvY2tbaSs0KjFdKjcKKyAgICAgICAgdmFkZHcuczE2ICAgICAgIHExMywgcTEzLCBkMjkgICBAIHozID0gYmxvY2tbaSs0KjFdKjE3CisgICAgICAgIHZzdWJ3LnMxNiAgICAgICBxOSwgIHE5LCAgZDMxCisgICAgICAgIHZhZGR3LnMxNiAgICAgICBxMSwgIHExLCAgZDMxCisgICAgICAgIHZhZGQuczMyICAgICAgICBxMTMsIHExMywgcTkgICAgQCB6MyA9IDE3KmJsb2NrW2krNCoxXSArICA3KmJsb2NrW2krNCozXQorICAgICAgICB2c3ViLnMzMiAgICAgICAgcTEyLCBxMTIsIHExICAgIEAgejIgPSA3KmJsb2NrW2krNCoxXSAgLSAxNypibG9ja1tpKzQqM10KKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHExLCAgcTEwLCBxMTMgICBAIHowICsgejMKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHEyLCAgcTExLCBxMTIgICBAIHoxICsgejIKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIHE4LCAgcTEwLCBxMTMgICBAIHowIC0gejMKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIHEzLCAgcTExLCBxMTIgICBAIHoxIC0gejIKKyAgICAgICAgdnRybi4zMiAgICAgICAgIHExLCAgcTIKKyAgICAgICAgdnRybi4zMiAgICAgICAgIHEzLCAgcTgKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQzLCAgZDYKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQ1LCAgZDE2CisgICAgICAgIHZtb3YuczMyICAgICAgICBkMCwgICMxMworICAgICAgICB2YWRkLnMzMiAgICAgICAgcTEwLCBxMSwgIHEzCisgICAgICAgIHZzdWIuczMyICAgICAgICBxMTEsIHExLCAgcTMKKyAgICAgICAgdnNobC5zMzIgICAgICAgIHExMiwgcTIsICAjMworICAgICAgICB2c2hsLnMzMiAgICAgICAgcTksICBxMiwgICM0CisgICAgICAgIHZtdWwuczMyICAgICAgICBxMTMsIHExMSwgZDBbMF0KKyAgICAgICAgdnNobC5zMzIgICAgICAgIHExMSwgcTgsICAjNAorICAgICAgICB2YWRkLnMzMiAgICAgICAgcTksICBxOSwgIHEyCisgICAgICAgIHZzaGwuczMyICAgICAgICBxMTUsIHE4LCAgIzMKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIHExMiwgcTEyLCBxMgorICAgICAgICB2YWRkLnMzMiAgICAgICAgcTExLCBxMTEsIHE4CisgICAgICAgIHZtdWwuczMyICAgICAgICBxMTQsIHExMCwgZDBbMF0KKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIHE4LCAgcTE1LCBxOAorICAgICAgICB2c3ViLnMzMiAgICAgICAgcTEyLCBxMTIsIHExMQorICAgICAgICB2YWRkLnMzMiAgICAgICAgcTksICBxOSwgIHE4CisgICAgICAgIHZhZGQuczMyICAgICAgICBxMiwgIHExMywgcTEyICAgQCB6MSArIHoyCisgICAgICAgIHZhZGQuczMyICAgICAgICBxMSwgIHExNCwgcTkgICAgQCB6MCArIHozCisgICAgICAgIHZzdWIuczMyICAgICAgICBxMywgIHExMywgcTEyICAgQCB6MSAtIHoyCisgICAgICAgIHZzdWIuczMyICAgICAgICBxMTUsIHExNCwgcTkgICAgQCB6MCAtIHozCisuZW5kbQorCisvKiB2b2lkIHJ2MzRfaWRjdF9hZGRfYyh1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKSAqLworZnVuY3Rpb24gZmZfcnYzNF9pZGN0X2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMAorICAgICAgICBydjM0X2ludl90cmFuc2Zvcm0gICByMgorICAgICAgICB2bW92LmkxNiAgICAgICAgcTEyLCAjMAorICAgICAgICB2cnNocm4uczMyICAgICAgZDE2LCBxMSwgICMxMCAgIEAgKHowICsgejMpID4+IDEwCisgICAgICAgIHZyc2hybi5zMzIgICAgICBkMTcsIHEyLCAgIzEwICAgQCAoejEgKyB6MikgPj4gMTAKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQxOCwgcTMsICAjMTAgICBAICh6MSAtIHoyKSA+PiAxMAorICAgICAgICB2cnNocm4uczMyICAgICAgZDE5LCBxMTUsICMxMCAgIEAgKHowIC0gejMpID4+IDEwCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI4W119LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI5W119LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBxOCwgIHE5CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI4WzFdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI5WzFdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEyfSwgW3IyLDoxMjhdISAgICAgICBAIG1lbXNldChibG9jaywgICAgMCwgMTYpCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEyfSwgW3IyLDoxMjhdICAgICAgICBAIG1lbXNldChibG9jaysxNiwgMCwgMTYpCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBkMTYsIGQxNworICAgICAgICB2dHJuLjMyICAgICAgICAgZDI4LCBkMjkKKyAgICAgICAgdnRybi4xNiAgICAgICAgIGQxOCwgZDE5CisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMCwgICBxOCwgIGQyOAorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEsICAgcTksICBkMjkKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyOCwgIHEwCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMjksICBxMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyOFswXX0sIFtyMyw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyOFsxXX0sIFtyMyw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyOVswXX0sIFtyMyw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyOVsxXX0sIFtyMyw6MzJdLCByMQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworLyogdm9pZCBydjM0X2ludl90cmFuc2Zvcm1fbm9yb3VuZF9uZW9uKGludDE2X3QgKmJsb2NrKTsgKi8KK2Z1bmN0aW9uIGZmX3J2MzRfaW52X3RyYW5zZm9ybV9ub3JvdW5kX25lb24sIGV4cG9ydD0xCisgICAgICAgIHJ2MzRfaW52X3RyYW5zZm9ybSAgIHIwCisgICAgICAgIHZzaGwuczMyICAgICAgICBxMTEsIHEyLCAgIzEKKyAgICAgICAgdnNobC5zMzIgICAgICAgIHExMCwgcTEsICAjMQorICAgICAgICB2c2hsLnMzMiAgICAgICAgcTEyLCBxMywgICMxCisgICAgICAgIHZzaGwuczMyICAgICAgICBxMTMsIHExNSwgIzEKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHExMSwgcTExLCBxMgorICAgICAgICB2YWRkLnMzMiAgICAgICAgcTEwLCBxMTAsIHExCisgICAgICAgIHZhZGQuczMyICAgICAgICBxMTIsIHExMiwgcTMKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHExMywgcTEzLCBxMTUKKyAgICAgICAgdnNocm4uczMyICAgICAgIGQwLCAgcTEwLCAjMTEgICBAICh6MCArIHozKSozID4+IDExCisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkMSwgIHExMSwgIzExICAgQCAoejEgKyB6MikqMyA+PiAxMQorICAgICAgICB2c2hybi5zMzIgICAgICAgZDIsICBxMTIsICMxMSAgIEAgKHoxIC0gejIpKjMgPj4gMTEKKyAgICAgICAgdnNocm4uczMyICAgICAgIGQzLCAgcTEzLCAjMTEgICBAICh6MCAtIHozKSozID4+IDExCisgICAgICAgIHZzdDQuMTYgICAgICAgICB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjAsOjY0XSEKKyAgICAgICAgdnN0NC4xNiAgICAgICAgIHtkMFsxXSwgZDFbMV0sIGQyWzFdLCBkM1sxXX0sIFtyMCw6NjRdIQorICAgICAgICB2c3Q0LjE2ICAgICAgICAge2QwWzJdLCBkMVsyXSwgZDJbMl0sIGQzWzJdfSwgW3IwLDo2NF0hCisgICAgICAgIHZzdDQuMTYgICAgICAgICB7ZDBbM10sIGQxWzNdLCBkMlszXSwgZDNbM119LCBbcjAsOjY0XSEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKy8qIHZvaWQgZmZfcnYzNF9pZGN0X2RjX2FkZF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGRjKSAqLworZnVuY3Rpb24gZmZfcnYzNF9pZGN0X2RjX2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMAorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyOFtdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyOVtdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2ZHVwLjE2ICAgICAgICAgZDAsICByMgorICAgICAgICB2bW92LnMxNiAgICAgICAgZDEsICAjMTY5CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI4WzFdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMSwgIGQwLCAgZDEgICAgQCBkYyAqIDEzICogMTMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjlbMV19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQwLCAgcTEsICAjMTAgICBAIChkYyAqIDEzICogMTMgKyAweDIwMCkgPj4gMTAKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQxLCAgZDAKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEyLCAgcTAsICBkMjgKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEzLCAgcTAsICBkMjkKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyOCwgcTIKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyOSwgcTMKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjhbMF19LCBbcjMsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjlbMF19LCBbcjMsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjhbMV19LCBbcjMsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjlbMV19LCBbcjMsOjMyXSwgcjEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKy8qIHZvaWQgcnYzNF9pbnZfdHJhbnNmb3JtX2RjX25vcm91bmRfYyhpbnQxNl90ICpibG9jaykgKi8KK2Z1bmN0aW9uIGZmX3J2MzRfaW52X3RyYW5zZm9ybV9ub3JvdW5kX2RjX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI4W119LCBbcjAsOjE2XSAgICAgICBAIGJsb2NrWzBdCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBkNCwgICMyNTEKKyAgICAgICAgdm9yci5zMTYgICAgICAgIGQ0LCAgIzI1NiAgICAgICAgICAgICAgIEAgMTNeMiAqIDMKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHEzLCAgZDI4LCBkNAorICAgICAgICB2c2hybi5zMzIgICAgICAgZDAsICBxMywgICMxMQorICAgICAgICB2bW92LmkxNiAgICAgICAgZDEsICBkMAorICAgICAgICB2c3QxLjY0ICAgICAgICAge3EwfSwgW3IwLDoxMjhdIQorICAgICAgICB2c3QxLjY0ICAgICAgICAge3EwfSwgW3IwLDoxMjhdIQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9ydjQwZHNwX2luaXRfYXJtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vcnY0MGRzcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNDg1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vcnY0MGRzcF9pbml0X2FybS5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEphbm5lIEdydW5hdSA8amFubmUtbGliYXZAamFubmF1Lm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3J2MzRkc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorCisjZGVmaW5lIERFQ0xfUVBFTDModHlwZSwgdywgcG9zKSBcCit2b2lkIGZmXyAjIyB0eXBlICMjIF9ydjQwX3FwZWwgIyMgdyAjIyBfbWMgIyMgcG9zICMjIF9uZW9uKHVpbnQ4X3QgKmRzdCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKKworI2RlZmluZSBERUNMX1FQRUwyKHcsIHBvcykgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFQ0xfUVBFTDMocHV0LCB3LCBwb3MpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIERFQ0xfUVBFTDMoYXZnLCB3LCBwb3MpCisKKyNkZWZpbmUgREVDTF9RUEVMX1hZKHgsIHkpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUNMX1FQRUwyKDE2LCB4ICMjIHkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUNMX1FQRUwyKDgsICB4ICMjIHkpCisKKyNkZWZpbmUgREVDTF9RUEVMX1koeSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUNMX1FQRUxfWFkoMCwgeSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUNMX1FQRUxfWFkoMSwgeSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUNMX1FQRUxfWFkoMiwgeSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUNMX1FQRUxfWFkoMywgeSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworREVDTF9RUEVMX1koMCk7CitERUNMX1FQRUxfWSgxKTsKK0RFQ0xfUVBFTF9ZKDIpOworREVDTF9RUEVMX1koMyk7CisKK3ZvaWQgZmZfcHV0X3J2NDBfY2hyb21hX21jOF9uZW9uKHVpbnQ4X3QgKiwgdWludDhfdCAqLCBpbnQsIGludCwgaW50LCBpbnQpOwordm9pZCBmZl9wdXRfcnY0MF9jaHJvbWFfbWM0X25lb24odWludDhfdCAqLCB1aW50OF90ICosIGludCwgaW50LCBpbnQsIGludCk7CisKK3ZvaWQgZmZfYXZnX3J2NDBfY2hyb21hX21jOF9uZW9uKHVpbnQ4X3QgKiwgdWludDhfdCAqLCBpbnQsIGludCwgaW50LCBpbnQpOwordm9pZCBmZl9hdmdfcnY0MF9jaHJvbWFfbWM0X25lb24odWludDhfdCAqLCB1aW50OF90ICosIGludCwgaW50LCBpbnQsIGludCk7CisKK3ZvaWQgZmZfcnY0MF93ZWlnaHRfZnVuY18xNl9uZW9uKHVpbnQ4X3QgKiwgdWludDhfdCAqLCB1aW50OF90ICosIGludCwgaW50LCBwdHJkaWZmX3QpOwordm9pZCBmZl9ydjQwX3dlaWdodF9mdW5jXzhfbmVvbih1aW50OF90ICosIHVpbnQ4X3QgKiwgdWludDhfdCAqLCBpbnQsIGludCwgcHRyZGlmZl90KTsKKworaW50IGZmX3J2NDBfaF9sb29wX2ZpbHRlcl9zdHJlbmd0aF9uZW9uKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmV0YSwgaW50IGJldGEyLCBpbnQgZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnAxLCBpbnQgKnExKTsKK2ludCBmZl9ydjQwX3ZfbG9vcF9maWx0ZXJfc3RyZW5ndGhfbmVvbih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEsIGludCBiZXRhMiwgaW50IGVkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwMSwgaW50ICpxMSk7CisKK3ZvaWQgZmZfcnY0MF9oX3dlYWtfbG9vcF9maWx0ZXJfbmVvbih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBmaWx0ZXJfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbHRlcl9xMSwgaW50IGFscGhhLCBpbnQgYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGltX3AwcTAsIGludCBsaW1fcTEsIGludCBsaW1fcDEpOwordm9pZCBmZl9ydjQwX3Zfd2Vha19sb29wX2ZpbHRlcl9uZW9uKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZpbHRlcl9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsdGVyX3ExLCBpbnQgYWxwaGEsIGludCBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW1fcDBxMCwgaW50IGxpbV9xMSwgaW50IGxpbV9wMSk7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgcnY0MGRzcF9pbml0X25lb24oUlYzNERTUENvbnRleHQgKmMpCit7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bIDFdID0gZmZfcHV0X3J2NDBfcXBlbDE2X21jMTBfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsgM10gPSBmZl9wdXRfcnY0MF9xcGVsMTZfbWMzMF9uZW9uOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWyA0XSA9IGZmX3B1dF9ydjQwX3FwZWwxNl9tYzAxX25lb247CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bIDVdID0gZmZfcHV0X3J2NDBfcXBlbDE2X21jMTFfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsgNl0gPSBmZl9wdXRfcnY0MF9xcGVsMTZfbWMyMV9uZW9uOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWyA3XSA9IGZmX3B1dF9ydjQwX3FwZWwxNl9tYzMxX25lb247CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bIDldID0gZmZfcHV0X3J2NDBfcXBlbDE2X21jMTJfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsxMF0gPSBmZl9wdXRfcnY0MF9xcGVsMTZfbWMyMl9uZW9uOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzExXSA9IGZmX3B1dF9ydjQwX3FwZWwxNl9tYzMyX25lb247CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMTJdID0gZmZfcHV0X3J2NDBfcXBlbDE2X21jMDNfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsxM10gPSBmZl9wdXRfcnY0MF9xcGVsMTZfbWMxM19uZW9uOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzE0XSA9IGZmX3B1dF9ydjQwX3FwZWwxNl9tYzIzX25lb247CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMTVdID0gZmZfcHV0X3J2NDBfcXBlbDE2X21jMzNfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsgMV0gPSBmZl9hdmdfcnY0MF9xcGVsMTZfbWMxMF9uZW9uOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWyAzXSA9IGZmX2F2Z19ydjQwX3FwZWwxNl9tYzMwX25lb247CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bIDRdID0gZmZfYXZnX3J2NDBfcXBlbDE2X21jMDFfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsgNV0gPSBmZl9hdmdfcnY0MF9xcGVsMTZfbWMxMV9uZW9uOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWyA2XSA9IGZmX2F2Z19ydjQwX3FwZWwxNl9tYzIxX25lb247CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bIDddID0gZmZfYXZnX3J2NDBfcXBlbDE2X21jMzFfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsgOV0gPSBmZl9hdmdfcnY0MF9xcGVsMTZfbWMxMl9uZW9uOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzEwXSA9IGZmX2F2Z19ydjQwX3FwZWwxNl9tYzIyX25lb247CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMTFdID0gZmZfYXZnX3J2NDBfcXBlbDE2X21jMzJfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsxMl0gPSBmZl9hdmdfcnY0MF9xcGVsMTZfbWMwM19uZW9uOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzEzXSA9IGZmX2F2Z19ydjQwX3FwZWwxNl9tYzEzX25lb247CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMTRdID0gZmZfYXZnX3J2NDBfcXBlbDE2X21jMjNfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsxNV0gPSBmZl9hdmdfcnY0MF9xcGVsMTZfbWMzM19uZW9uOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWyAxXSA9IGZmX3B1dF9ydjQwX3FwZWw4X21jMTBfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsgM10gPSBmZl9wdXRfcnY0MF9xcGVsOF9tYzMwX25lb247CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bIDRdID0gZmZfcHV0X3J2NDBfcXBlbDhfbWMwMV9uZW9uOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWyA1XSA9IGZmX3B1dF9ydjQwX3FwZWw4X21jMTFfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsgNl0gPSBmZl9wdXRfcnY0MF9xcGVsOF9tYzIxX25lb247CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bIDddID0gZmZfcHV0X3J2NDBfcXBlbDhfbWMzMV9uZW9uOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWyA5XSA9IGZmX3B1dF9ydjQwX3FwZWw4X21jMTJfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsxMF0gPSBmZl9wdXRfcnY0MF9xcGVsOF9tYzIyX25lb247CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bMTFdID0gZmZfcHV0X3J2NDBfcXBlbDhfbWMzMl9uZW9uOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzEyXSA9IGZmX3B1dF9ydjQwX3FwZWw4X21jMDNfbmVvbjsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsxM10gPSBmZl9wdXRfcnY0MF9xcGVsOF9tYzEzX25lb247CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bMTRdID0gZmZfcHV0X3J2NDBfcXBlbDhfbWMyM19uZW9uOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzE1XSA9IGZmX3B1dF9ydjQwX3FwZWw4X21jMzNfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsgMV0gPSBmZl9hdmdfcnY0MF9xcGVsOF9tYzEwX25lb247CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bIDNdID0gZmZfYXZnX3J2NDBfcXBlbDhfbWMzMF9uZW9uOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWyA0XSA9IGZmX2F2Z19ydjQwX3FwZWw4X21jMDFfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsgNV0gPSBmZl9hdmdfcnY0MF9xcGVsOF9tYzExX25lb247CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bIDZdID0gZmZfYXZnX3J2NDBfcXBlbDhfbWMyMV9uZW9uOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWyA3XSA9IGZmX2F2Z19ydjQwX3FwZWw4X21jMzFfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsgOV0gPSBmZl9hdmdfcnY0MF9xcGVsOF9tYzEyX25lb247CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMTBdID0gZmZfYXZnX3J2NDBfcXBlbDhfbWMyMl9uZW9uOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzExXSA9IGZmX2F2Z19ydjQwX3FwZWw4X21jMzJfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsxMl0gPSBmZl9hdmdfcnY0MF9xcGVsOF9tYzAzX25lb247CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMTNdID0gZmZfYXZnX3J2NDBfcXBlbDhfbWMxM19uZW9uOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzE0XSA9IGZmX2F2Z19ydjQwX3FwZWw4X21jMjNfbmVvbjsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsxNV0gPSBmZl9hdmdfcnY0MF9xcGVsOF9tYzMzX25lb247CisKKyAgICBjLT5wdXRfY2hyb21hX3BpeGVsc190YWJbMF0gPSBmZl9wdXRfcnY0MF9jaHJvbWFfbWM4X25lb247CisgICAgYy0+cHV0X2Nocm9tYV9waXhlbHNfdGFiWzFdID0gZmZfcHV0X3J2NDBfY2hyb21hX21jNF9uZW9uOworICAgIGMtPmF2Z19jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGZmX2F2Z19ydjQwX2Nocm9tYV9tYzhfbmVvbjsKKyAgICBjLT5hdmdfY2hyb21hX3BpeGVsc190YWJbMV0gPSBmZl9hdmdfcnY0MF9jaHJvbWFfbWM0X25lb247CisKKyAgICBjLT5ydjQwX3dlaWdodF9waXhlbHNfdGFiWzBdWzBdID0gZmZfcnY0MF93ZWlnaHRfZnVuY18xNl9uZW9uOworICAgIGMtPnJ2NDBfd2VpZ2h0X3BpeGVsc190YWJbMF1bMV0gPSBmZl9ydjQwX3dlaWdodF9mdW5jXzhfbmVvbjsKKworICAgIGMtPnJ2NDBfbG9vcF9maWx0ZXJfc3RyZW5ndGhbMF0gPSBmZl9ydjQwX2hfbG9vcF9maWx0ZXJfc3RyZW5ndGhfbmVvbjsKKyAgICBjLT5ydjQwX2xvb3BfZmlsdGVyX3N0cmVuZ3RoWzFdID0gZmZfcnY0MF92X2xvb3BfZmlsdGVyX3N0cmVuZ3RoX25lb247CisgICAgYy0+cnY0MF93ZWFrX2xvb3BfZmlsdGVyWzBdICAgICA9IGZmX3J2NDBfaF93ZWFrX2xvb3BfZmlsdGVyX25lb247CisgICAgYy0+cnY0MF93ZWFrX2xvb3BfZmlsdGVyWzFdICAgICA9IGZmX3J2NDBfdl93ZWFrX2xvb3BfZmlsdGVyX25lb247Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9ydjQwZHNwX2luaXRfYXJtKFJWMzREU1BDb250ZXh0ICpjKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpCisgICAgICAgIHJ2NDBkc3BfaW5pdF9uZW9uKGMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3J2NDBkc3BfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3J2NDBkc3BfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OWY4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vcnY0MGRzcF9uZW9uLlMKQEAgLTAsMCArMSw5MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmFubmUgR3J1bmF1IDxqYW5uZS1saWJhdkBqYW5uYXUubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDExIE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKyNpbmNsdWRlICJuZW9uLlMiCisKKy5tYWNybyAgcXBlbF9sb3dwYXNzICAgIHIwLCAgcjEsICByYzEsIHJjMiwgc2hpZnQKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQyNSwgXHIwLCBccjEsICMxICAgICAgIEAgc3JjWy0xXQorICAgICAgICB2ZXh0LjggICAgICAgICAgZDI2LCBccjAsIFxyMSwgIzQgICAgICAgQCBzcmNbIDJdCisgICAgICAgIHZleHQuOCAgICAgICAgICBkMjQsIFxyMCwgXHIxLCAjNSAgICAgICBAIHNyY1sgM10KKyAgICAgICAgdmFkZGwudTggICAgICAgIHE5LCAgZDI1LCBkMjYKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE4LCAgXHIwLCBkMjQKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQyNywgXHIwLCBccjEsICMyICAgICAgIEAgc3JjWyAwXQorICAgICAgICB2c2hsLnMxNiAgICAgICAgcTEyLCBxOSwgICMyCisgICAgICAgIHZzdWIuczE2ICAgICAgICBxOCwgIHE4LCAgcTkKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQyOCwgXHIwLCBccjEsICMzICAgICAgIEAgc3JjWyAxXQorICAgICAgICB2c3ViLnMxNiAgICAgICAgcTgsICBxOCwgIHExMgorICAgICAgICB2bWxhbC51OCAgICAgICAgcTgsICBkMjcsIFxyYzEKKyAgICAgICAgdm1sYWwudTggICAgICAgIHE4LCAgZDI4LCBccmMyCisgICAgICAgIHZxcnNocnVuLnMxNiAgICBccjAsIHE4LCAgI1xzaGlmdAorLmVuZG0KKworLm1hY3JvICBxcGVsX2xvd3Bhc3NfeDIgcjAsICByMSwgIHIyLCAgcjMsICByYzEsIHJjMiwgc2hpZnQKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQyNSwgXHIwLCBccjEsICMxICAgICAgIEAgc3JjWy0xXQorICAgICAgICB2ZXh0LjggICAgICAgICAgZDI2LCBccjAsIFxyMSwgIzQgICAgICAgQCBzcmNbIDJdCisgICAgICAgIHZleHQuOCAgICAgICAgICBkMjQsIFxyMCwgXHIxLCAjNSAgICAgICBAIHNyY1sgM10KKyAgICAgICAgdmFkZGwudTggICAgICAgIHE5LCAgZDI1LCBkMjYKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE4LCAgXHIwLCBkMjQKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQyOSwgXHIwLCBccjEsICMyICAgICAgIEAgc3JjWyAwXQorICAgICAgICB2ZXh0LjggICAgICAgICAgZDI4LCBccjAsIFxyMSwgIzMgICAgICAgQCBzcmNbIDFdCisgICAgICAgIHZzaGwuczE2ICAgICAgICBxMTAsIHE5LCAgIzIKKyAgICAgICAgdmV4dC44ICAgICAgICAgIFxyMSwgXHIyLCBccjMsICMxICAgICAgIEAgc3JjWy0xXQorICAgICAgICB2c3ViLnMxNiAgICAgICAgcTgsICBxOCwgIHE5CisgICAgICAgIHZleHQuOCAgICAgICAgICBkMjIsIFxyMiwgXHIzLCAjNCAgICAgICBAIHNyY1sgMl0KKyAgICAgICAgdmV4dC44ICAgICAgICAgIFxyMCwgXHIyLCBccjMsICM1ICAgICAgIEAgc3JjWyAzXQorICAgICAgICB2YWRkbC51OCAgICAgICAgcTEzLCBccjEsIGQyMgorICAgICAgICB2YWRkbC51OCAgICAgICAgcTEyLCBccjIsIFxyMAorICAgICAgICB2c3ViLnMxNiAgICAgICAgcTgsICBxOCwgIHExMAorICAgICAgICB2c2hsLnMxNiAgICAgICAgcTksICBxMTMsICMyCisgICAgICAgIHZzdWIuczE2ICAgICAgICBxMTIsIHExMiwgcTEzCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxOCwgIGQyOSwgXHJjMQorICAgICAgICB2bWxhbC51OCAgICAgICAgcTgsICBkMjgsIFxyYzIKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIHExMiwgcTEyLCBxOQorICAgICAgICB2ZXh0LjggICAgICAgICAgZDI2LCBccjIsIFxyMywgIzIgICAgICAgQCBzcmNbIDBdCisgICAgICAgIHZleHQuOCAgICAgICAgICBkMjcsIFxyMiwgXHIzLCAjMyAgICAgICBAIHNyY1sgMV0KKyAgICAgICAgdm1sYWwudTggICAgICAgIHExMiwgZDI2LCBccmMxCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxMTIsIGQyNywgXHJjMgorICAgICAgICB2cXJzaHJ1bi5zMTYgICAgXHIwLCBxOCwgICNcc2hpZnQKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIFxyMiwgcTEyLCAjXHNoaWZ0CisuZW5kbQorCisubWFjcm8gIHJ2NDBfcXBlbDhfaCAgICBzaGlmdAorZnVuY3Rpb24gcHV0X3J2NDBfcXBlbDhfaF9scF9wYWNrZWRfc1xzaGlmdFwoKV9uZW9uCisxOgorICAgICAgICB2bGQxLjggICAgICAgICAge3EyfSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgcXBlbF9sb3dwYXNzX3gyIGQ0LCAgZDUsICBkNiwgIGQ3LCAgZDAsICBkMSwgIFxzaGlmdAorICAgICAgICB2c3QxLjggICAgICAgICAge2Q0fSwgICAgIFtyMTIsOjY0XSEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNn0sICAgICBbcjEyLDo2NF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCAgICAgW3IxXQorICAgICAgICBxcGVsX2xvd3Bhc3MgICAgZDQsICBkNSwgIGQwLCAgZDEsICBcc2hpZnQKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNH0sICAgICBbcjEyLDo2NF0hCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKworLm1hY3JvICBydjQwX3FwZWw4X3YgICAgc2hpZnQsIHR5cGUKK2Z1bmN0aW9uIFx0eXBlXCgpX3J2NDBfcXBlbDhfdl9scF9wYWNrZWRfc1xzaGlmdFwoKV9uZW9uCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDJ9LCAgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDN9LCAgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDR9LCAgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDV9LCAgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDZ9LCAgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDd9LCAgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDh9LCAgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDl9LCAgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDEwfSwgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDExfSwgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDEyfSwgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDEzfSwgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDE0fSwgICAgW3IxLDo2NF0hCisgICAgICAgIHRyYW5zcG9zZV84eDggICBkMiwgIGQzLCAgZDQsICBkNSwgIGQ2LCAgZDcsICBkOCwgIGQ5CisgICAgICAgIHRyYW5zcG9zZV84eDggICBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCwgZDE1LCBkMzAsIGQzMQorICAgICAgICBxcGVsX2xvd3Bhc3NfeDIgZDIsICBkMTAsIGQzLCAgZDExLCBkMCwgIGQxLCAgXHNoaWZ0CisgICAgICAgIHFwZWxfbG93cGFzc194MiBkNCwgIGQxMiwgZDUsICBkMTMsIGQwLCAgZDEsICBcc2hpZnQKKyAgICAgICAgcXBlbF9sb3dwYXNzX3gyIGQ2LCAgZDE0LCBkNywgIGQxNSwgZDAsICBkMSwgIFxzaGlmdAorICAgICAgICBxcGVsX2xvd3Bhc3NfeDIgZDgsICBkMzAsIGQ5LCAgZDMxLCBkMCwgIGQxLCAgXHNoaWZ0CisgICAgICAgIHRyYW5zcG9zZV84eDggICBkMiwgIGQzLCAgZDQsICBkNSwgIGQ2LCAgZDcsICBkOCwgIGQ5CisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTIsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTMsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTQsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTUsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTYsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTcsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTgsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTksICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIsICBsc2wgIzMKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHExLCAgcTEsICBxNgorICAgICAgICB2cmhhZGQudTggICAgICAgcTIsICBxMiwgIHE3CisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMywgIHEzLCAgcTgKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHE0LCAgcTQsICBxOQorICAuZW5kaWYKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQyLCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQzLCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ0LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ1LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ2LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ3LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ4LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ5LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisuZW5kbQorCisgICAgICAgIHJ2NDBfcXBlbDhfaCAgICA1CisgICAgICAgIHJ2NDBfcXBlbDhfaCAgICA2CisKKy5tYWNybyAgcnY0MF9xcGVsICAgICAgIHR5cGUKK2Z1bmN0aW9uIFx0eXBlXCgpX3J2NDBfcXBlbDhfaF9sb3dwYXNzX25lb24KKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgcjAKKyAgLmVuZGlmCisxOgorICAgICAgICB2bGQxLjggICAgICAgICAge3EyfSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgcXBlbF9sb3dwYXNzX3gyIGQ0LCAgZDUsICBkNiwgIGQ3LCAgZDAsICBkMSwgIDYKKyAgLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkM30sICAgICBbcjEyLDo2NF0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2fSwgICAgW3IxMiw6NjRdLCByMgorICAgICAgICB2cmhhZGQudTggICAgICAgZDQsICBkNCwgIGQzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkNiwgIGQ2LCAgZDE2CisgIC5lbmRpZgorICAgICAgICB2c3QxLjggICAgICAgICAge2Q0fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge2Q2fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gXHR5cGVcKClfcnY0MF9xcGVsOF92X2xvd3Bhc3NfbmVvbgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyfSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDN9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkNH0sICAgICBbcjFdLCByMgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2Q1fSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDZ9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkN30sICAgICBbcjFdLCByMgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2Q4fSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDl9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMTB9LCAgICBbcjFdLCByMgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxMX0sICAgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDEyfSwgICAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMTN9LCAgICBbcjFdLCByMgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxNH0sICAgIFtyMV0KKyAgICAgICAgdHJhbnNwb3NlXzh4OCAgIGQyLCAgZDMsICBkNCwgIGQ1LCAgZDYsICBkNywgIGQ4LCAgZDkKKyAgICAgICAgdHJhbnNwb3NlXzh4OCAgIGQxMCwgZDExLCBkMTIsIGQxMywgZDE0LCBkMTUsIGQzMCwgZDMxCisgICAgICAgIHFwZWxfbG93cGFzc194MiBkMiwgIGQxMCwgZDMsICBkMTEsIGQwLCAgZDEsICA2CisgICAgICAgIHFwZWxfbG93cGFzc194MiBkNCwgIGQxMiwgZDUsICBkMTMsIGQwLCAgZDEsICA2CisgICAgICAgIHFwZWxfbG93cGFzc194MiBkNiwgIGQxNCwgZDcsICBkMTUsIGQwLCAgZDEsICA2CisgICAgICAgIHFwZWxfbG93cGFzc194MiBkOCwgIGQzMCwgZDksICBkMzEsIGQwLCAgZDEsICA2CisgICAgICAgIHRyYW5zcG9zZV84eDggICBkMiwgIGQzLCAgZDQsICBkNSwgIGQ2LCAgZDcsICBkOCwgIGQ5CisgIC5pZmMgXHR5cGUsYXZnCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTIsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTMsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTQsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTUsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTYsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTcsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTgsICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICBkMTksICAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIsICBsc2wgIzMKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHExLCAgcTEsICBxNgorICAgICAgICB2cmhhZGQudTggICAgICAgcTIsICBxMiwgIHE3CisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMywgIHEzLCAgcTgKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHE0LCAgcTQsICBxOQorICAuZW5kaWYKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQyLCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQzLCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ0LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ1LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ2LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ3LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ4LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIGQ5LCAgICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKyAgICAgICAgcnY0MF9xcGVsOF92ICAgIDUsIFx0eXBlCisgICAgICAgIHJ2NDBfcXBlbDhfdiAgICA2LCBcdHlwZQorCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9ydjQwX3FwZWw4X21jMTBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjOAorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDAsICAjNTIKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQxLCAgIzIwCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9ydjQwX3FwZWw4X2hfbG93cGFzc19uZW9uCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX3J2NDBfcXBlbDhfbWMzMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICM4CisgICAgICAgIHZtb3YuaTggICAgICAgICBkMCwgICMyMAorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDEsICAjNTIKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpX3J2NDBfcXBlbDhfaF9sb3dwYXNzX25lb24KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfcnY0MF9xcGVsOF9tYzAxX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMQorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDAsICAjNTIKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQxLCAgIzIwCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9ydjQwX3FwZWw4X3ZfbG93cGFzc19uZW9uCisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfcnY0MF9xcGVsOF9tYzExX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMTQqOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCBzcCwgICM3CisgICAgICAgIGJpYyAgICAgICAgICAgICByMTIsIHIxMiwgIzcKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMxMgorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDAsICAjNTIKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQxLCAgIzIwCisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfcnY0MF9xcGVsOF9oX2xwX3BhY2tlZF9zNl9uZW9uCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHNwLCAgIzcKKyAgICAgICAgYmljICAgICAgICAgICAgIHIxLCAgcjEsICAjNworICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfcnY0MF9xcGVsOF92X2xwX3BhY2tlZF9zNl9uZW9uCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzE0KjgKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9ydjQwX3FwZWw4X21jMjFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCwgbHJ9CisgICAgICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMxNCo4CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHNwLCAgIzcKKyAgICAgICAgYmljICAgICAgICAgICAgIHIxMiwgcjEyLCAjNworICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIyLCAgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzEyCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMCwgICMyMAorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDEsICAjMjAKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9ydjQwX3FwZWw4X2hfbHBfcGFja2VkX3M1X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgc3AsICAjNworICAgICAgICBiaWMgICAgICAgICAgICAgcjEsICByMSwgICM3CisgICAgICAgIHZtb3YuaTggICAgICAgICBkMCwgICM1MgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfcnY0MF9xcGVsOF92X2xwX3BhY2tlZF9zNl9uZW9uCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzE0KjgKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9ydjQwX3FwZWw4X21jMzFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCwgbHJ9CisgICAgICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMxNCo4CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHNwLCAgIzcKKyAgICAgICAgYmljICAgICAgICAgICAgIHIxMiwgcjEyLCAjNworICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIyLCAgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzEyCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMCwgICMyMAorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDEsICAjNTIKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9ydjQwX3FwZWw4X2hfbHBfcGFja2VkX3M2X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgc3AsICAjNworICAgICAgICBiaWMgICAgICAgICAgICAgcjEsICByMSwgICM3CisgICAgICAgIHZzd3AgICAgICAgICAgICBkMCwgIGQxCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9ydjQwX3FwZWw4X3ZfbHBfcGFja2VkX3M2X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjMTQqOAorICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX3J2NDBfcXBlbDhfbWMxMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LCBscn0KKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzE0KjgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgc3AsICAjNworICAgICAgICBiaWMgICAgICAgICAgICAgcjEyLCByMTIsICM3CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIsICBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMTIKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQwLCAgIzUyCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMSwgICMyMAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X3J2NDBfcXBlbDhfaF9scF9wYWNrZWRfczZfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICBzcCwgICM3CisgICAgICAgIGJpYyAgICAgICAgICAgICByMSwgIHIxLCAgIzcKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQwLCAgIzIwCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9ydjQwX3FwZWw4X3ZfbHBfcGFja2VkX3M1X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjMTQqOAorICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX3J2NDBfcXBlbDhfbWMyMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LCBscn0KKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzE0KjgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgc3AsICAjNworICAgICAgICBiaWMgICAgICAgICAgICAgcjEyLCByMTIsICM3CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIsICBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMTIKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQwLCAgIzIwCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMSwgICMyMAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X3J2NDBfcXBlbDhfaF9scF9wYWNrZWRfczVfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICBzcCwgICM3CisgICAgICAgIGJpYyAgICAgICAgICAgICByMSwgIHIxLCAgIzcKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX3J2NDBfcXBlbDhfdl9scF9wYWNrZWRfczVfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMxNCo4CisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfcnY0MF9xcGVsOF9tYzMyX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMTQqOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCBzcCwgICM3CisgICAgICAgIGJpYyAgICAgICAgICAgICByMTIsIHIxMiwgIzcKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMxMgorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDAsICAjMjAKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQxLCAgIzUyCisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfcnY0MF9xcGVsOF9oX2xwX3BhY2tlZF9zNl9uZW9uCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHNwLCAgIzcKKyAgICAgICAgYmljICAgICAgICAgICAgIHIxLCAgcjEsICAjNworICAgICAgICB2bW92Lmk4ICAgICAgICAgZDEsICAjMjAKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX3J2NDBfcXBlbDhfdl9scF9wYWNrZWRfczVfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMxNCo4CisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfcnY0MF9xcGVsOF9tYzAzX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMQorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDAsICAjMjAKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQxLCAgIzUyCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9ydjQwX3FwZWw4X3ZfbG93cGFzc19uZW9uCisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfcnY0MF9xcGVsOF9tYzMzX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICM4CisgICAgICAgIGIgICAgICAgICAgICAgICBYKGZmX1x0eXBlXCgpX3BpeGVsczhfeHkyX25lb24pCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX3J2NDBfcXBlbDhfbWMxM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LCBscn0KKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzE0KjgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgc3AsICAjNworICAgICAgICBiaWMgICAgICAgICAgICAgcjEyLCByMTIsICM3CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIsICBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMTIKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQwLCAgIzUyCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMSwgICMyMAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X3J2NDBfcXBlbDhfaF9scF9wYWNrZWRfczZfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICBzcCwgICM3CisgICAgICAgIGJpYyAgICAgICAgICAgICByMSwgIHIxLCAgIzcKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQwLCAgZDEKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX3J2NDBfcXBlbDhfdl9scF9wYWNrZWRfczZfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMxNCo4CisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfcnY0MF9xcGVsOF9tYzIzX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMTQqOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCBzcCwgICM3CisgICAgICAgIGJpYyAgICAgICAgICAgICByMTIsIHIxMiwgIzcKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMxMgorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDAsICAjMjAKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQxLCAgIzIwCisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfcnY0MF9xcGVsOF9oX2xwX3BhY2tlZF9zNV9uZW9uCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHNwLCAgIzcKKyAgICAgICAgYmljICAgICAgICAgICAgIHIxLCAgcjEsICAjNworICAgICAgICB2bW92Lmk4ICAgICAgICAgZDEsICAjNTIKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX3J2NDBfcXBlbDhfdl9scF9wYWNrZWRfczZfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMxNCo4CisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfcnY0MF9xcGVsMTZfbWMxMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDAsICAjNTIKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQxLCAgIzIwCisuTFx0eXBlXCgpX3J2NDBfcXBlbDE2X2g6CisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIGxyfQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMxNgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfcnY0MF9xcGVsOF9oX2xvd3Bhc3NfbmVvbgorICAgICAgICBwb3AgICAgICAgICAgICAge3IxLCBscn0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMiwgIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzE2CisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV9ydjQwX3FwZWw4X2hfbG93cGFzc19uZW9uCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX3J2NDBfcXBlbDE2X21jMzBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQwLCAgIzIwCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMSwgICM1MgorICAgICAgICBiICAgICAgICAgICAgICAgLkxcdHlwZVwoKV9ydjQwX3FwZWwxNl9oCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX3J2NDBfcXBlbDE2X21jMDFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQwLCAgIzUyCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMSwgICMyMAorLkxcdHlwZVwoKV9ydjQwX3FwZWwxNl92OgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIyLCAgbHNsICMxCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX3J2NDBfcXBlbDhfdl9sb3dwYXNzX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfcnY0MF9xcGVsOF92X2xvd3Bhc3NfbmVvbgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEsICBbc3AsICM2NF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMiwgIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzgKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX3J2NDBfcXBlbDhfdl9sb3dwYXNzX25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMgorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfcnY0MF9xcGVsOF92X2xvd3Bhc3NfbmVvbgorICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyMSwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX3J2NDBfcXBlbDE2X21jMTFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjNDQqOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCBzcCwgICM3CisgICAgICAgIGJpYyAgICAgICAgICAgICByMTIsIHIxMiwgIzcKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzIwCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMCwgICM1MgorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDEsICAjMjAKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9ydjQwX3FwZWw4X2hfbHBfcGFja2VkX3M2X25lb24KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxLCAgW3NwLCAjNDE2XQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgICM4CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMyMAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X3J2NDBfcXBlbDhfaF9scF9wYWNrZWRfczZfbmVvbgorLkxcdHlwZVwoKV9ydjQwX3FwZWwxNl92X3M2OgorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICBzcCwgICM3CisgICAgICAgIGJpYyAgICAgICAgICAgICByMSwgIHIxLCAgIzcKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX3J2NDBfcXBlbDhfdl9scF9wYWNrZWRfczZfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICM0MAorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfcnY0MF9xcGVsOF92X2xwX3BhY2tlZF9zNl9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIsICBsc2wgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjOAorICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfcnY0MF9xcGVsOF92X2xwX3BhY2tlZF9zNl9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzQwCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9ydjQwX3FwZWw4X3ZfbHBfcGFja2VkX3M2X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjNDQqOAorICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyMSwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX3J2NDBfcXBlbDE2X21jMjFfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjNDQqOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCBzcCwgICM3CisgICAgICAgIGJpYyAgICAgICAgICAgICByMTIsIHIxMiwgIzcKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzIwCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMCwgICMyMAorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDEsICAjMjAKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9ydjQwX3FwZWw4X2hfbHBfcGFja2VkX3M1X25lb24KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxLCAgW3NwLCAjNDE2XQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgICM4CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMyMAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X3J2NDBfcXBlbDhfaF9scF9wYWNrZWRfczVfbmVvbgorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDAsICAjNTIKKyAgICAgICAgYiAgICAgICAgICAgICAgIC5MXHR5cGVcKClfcnY0MF9xcGVsMTZfdl9zNgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9ydjQwX3FwZWwxNl9tYzMxX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIsICBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMgorICAgICAgICBwdXNoICAgICAgICAgICAge3IxLCBscn0KKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzQ0KjgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgc3AsICAjNworICAgICAgICBiaWMgICAgICAgICAgICAgcjEyLCByMTIsICM3CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMyMAorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDAsICAjMjAKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQxLCAgIzUyCisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfcnY0MF9xcGVsOF9oX2xwX3BhY2tlZF9zNl9uZW9uCisgICAgICAgIGxkciAgICAgICAgICAgICByMSwgIFtzcCwgIzQxNl0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMjAKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9ydjQwX3FwZWw4X2hfbHBfcGFja2VkX3M2X25lb24KKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQwLCAgZDEKKyAgICAgICAgYiAgICAgICAgICAgICAgIC5MXHR5cGVcKClfcnY0MF9xcGVsMTZfdl9zNgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9ydjQwX3FwZWwxNl9tYzEyX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIsICBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMgorICAgICAgICBwdXNoICAgICAgICAgICAge3IxLCBscn0KKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzQ0KjgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgc3AsICAjNworICAgICAgICBiaWMgICAgICAgICAgICAgcjEyLCByMTIsICM3CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMyMAorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDAsICAjNTIKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQxLCAgIzIwCisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfcnY0MF9xcGVsOF9oX2xwX3BhY2tlZF9zNl9uZW9uCisgICAgICAgIGxkciAgICAgICAgICAgICByMSwgIFtzcCwgIzQxNl0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMjAKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9ydjQwX3FwZWw4X2hfbHBfcGFja2VkX3M2X25lb24KKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQwLCAgIzIwCisuTFx0eXBlXCgpX3J2NDBfcXBlbDE2X3ZfczU6CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHNwLCAgIzcKKyAgICAgICAgYmljICAgICAgICAgICAgIHIxLCAgcjEsICAjNworICAgICAgICBibCAgICAgICAgICAgICAgXHR5cGVcKClfcnY0MF9xcGVsOF92X2xwX3BhY2tlZF9zNV9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzQwCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9ydjQwX3FwZWw4X3ZfbHBfcGFja2VkX3M1X25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMiwgIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIGJsICAgICAgICAgICAgICBcdHlwZVwoKV9ydjQwX3FwZWw4X3ZfbHBfcGFja2VkX3M1X25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjNDAKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eXBlXCgpX3J2NDBfcXBlbDhfdl9scF9wYWNrZWRfczVfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICM0NCo4CisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBwb3AgICAgICAgICAgICAge3IxLCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfcnY0MF9xcGVsMTZfbWMyMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIyLCAgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzIKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMSwgbHJ9CisgICAgICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICM0NCo4CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHNwLCAgIzcKKyAgICAgICAgYmljICAgICAgICAgICAgIHIxMiwgcjEyLCAjNworICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMjAKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQwLCAgIzIwCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMSwgICMyMAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X3J2NDBfcXBlbDhfaF9scF9wYWNrZWRfczVfbmVvbgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEsICBbc3AsICM0MTZdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzIwCisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfcnY0MF9xcGVsOF9oX2xwX3BhY2tlZF9zNV9uZW9uCisgICAgICAgIGIgICAgICAgICAgICAgICAuTFx0eXBlXCgpX3J2NDBfcXBlbDE2X3ZfczUKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfXHR5cGVcKClfcnY0MF9xcGVsMTZfbWMzMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIyLCAgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzIKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMSwgbHJ9CisgICAgICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICM0NCo4CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHNwLCAgIzcKKyAgICAgICAgYmljICAgICAgICAgICAgIHIxMiwgcjEyLCAjNworICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMjAKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQwLCAgIzIwCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMSwgICM1MgorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X3J2NDBfcXBlbDhfaF9scF9wYWNrZWRfczZfbmVvbgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEsICBbc3AsICM0MTZdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzIwCisgICAgICAgIGJsICAgICAgICAgICAgICBwdXRfcnY0MF9xcGVsOF9oX2xwX3BhY2tlZF9zNl9uZW9uCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMSwgICMyMAorICAgICAgICBiICAgICAgICAgICAgICAgLkxcdHlwZVwoKV9ydjQwX3FwZWwxNl92X3M1CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX3J2NDBfcXBlbDE2X21jMDNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQwLCAgIzIwCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMSwgICM1MgorICAgICAgICBiICAgICAgICAgICAgICAgLkxcdHlwZVwoKV9ydjQwX3FwZWwxNl92CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX3J2NDBfcXBlbDE2X21jMTNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjNDQqOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCBzcCwgICM3CisgICAgICAgIGJpYyAgICAgICAgICAgICByMTIsIHIxMiwgIzcKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzIwCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMCwgICM1MgorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDEsICAjMjAKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9ydjQwX3FwZWw4X2hfbHBfcGFja2VkX3M2X25lb24KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxLCAgW3NwLCAjNDE2XQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgICM4CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMyMAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X3J2NDBfcXBlbDhfaF9scF9wYWNrZWRfczZfbmVvbgorICAgICAgICB2c3dwICAgICAgICAgICAgZDAsICBkMQorICAgICAgICBiICAgICAgICAgICAgICAgLkxcdHlwZVwoKV9ydjQwX3FwZWwxNl92X3M2CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX1x0eXBlXCgpX3J2NDBfcXBlbDE2X21jMjNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMyCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjNDQqOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCBzcCwgICM3CisgICAgICAgIGJpYyAgICAgICAgICAgICByMTIsIHIxMiwgIzcKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzIwCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMCwgICMyMAorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDEsICAjMjAKKyAgICAgICAgYmwgICAgICAgICAgICAgIHB1dF9ydjQwX3FwZWw4X2hfbHBfcGFja2VkX3M1X25lb24KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxLCAgW3NwLCAjNDE2XQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgICM4CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMyMAorICAgICAgICBibCAgICAgICAgICAgICAgcHV0X3J2NDBfcXBlbDhfaF9scF9wYWNrZWRfczVfbmVvbgorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDEsICAjNTIKKyAgICAgICAgYiAgICAgICAgICAgICAgIC5MXHR5cGVcKClfcnY0MF9xcGVsMTZfdl9zNgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9cdHlwZVwoKV9ydjQwX3FwZWwxNl9tYzMzX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMxNgorICAgICAgICBiICAgICAgICAgICAgICAgWChmZl9cdHlwZVwoKV9waXhlbHMxNl94eTJfbmVvbikKK2VuZGZ1bmMKKy5lbmRtCisKKyAgICAgICAgcnY0MF9xcGVsICAgICAgIHB1dAorICAgICAgICBydjQwX3FwZWwgICAgICAgYXZnCisKKy5tYWNybyAgcnY0MF93ZWlnaHQKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE4LCAgZDIKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE5LCAgZDMKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMCwgZDQKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMSwgZDUKKyAgICAgICAgdm11bGwudTE2ICAgICAgIHEyLCAgZDE2LCBkMFsyXQorICAgICAgICB2bXVsbC51MTYgICAgICAgcTMsICBkMTcsIGQwWzJdCisgICAgICAgIHZtdWxsLnUxNiAgICAgICBxOCwgIGQxOCwgZDBbMl0KKyAgICAgICAgdm11bGwudTE2ICAgICAgIHE5LCAgZDE5LCBkMFsyXQorICAgICAgICB2bXVsbC51MTYgICAgICAgcTEyLCBkMjAsIGQwWzBdCisgICAgICAgIHZtdWxsLnUxNiAgICAgICBxMTMsIGQyMSwgZDBbMF0KKyAgICAgICAgdm11bGwudTE2ICAgICAgIHExNCwgZDIyLCBkMFswXQorICAgICAgICB2bXVsbC51MTYgICAgICAgcTE1LCBkMjMsIGQwWzBdCisgICAgICAgIHZzaHJuLmkzMiAgICAgICBkNCwgIHEyLCAgIzkKKyAgICAgICAgdnNocm4uaTMyICAgICAgIGQ1LCAgcTMsICAjOQorICAgICAgICB2c2hybi5pMzIgICAgICAgZDYsICBxOCwgICM5CisgICAgICAgIHZzaHJuLmkzMiAgICAgICBkNywgIHE5LCAgIzkKKyAgICAgICAgdnNocm4uaTMyICAgICAgIGQxNiwgcTEyLCAjOQorICAgICAgICB2c2hybi5pMzIgICAgICAgZDE3LCBxMTMsICM5CisgICAgICAgIHZzaHJuLmkzMiAgICAgICBkMTgsIHExNCwgIzkKKyAgICAgICAgdnNocm4uaTMyICAgICAgIGQxOSwgcTE1LCAjOQorICAgICAgICB2YWRkLnUxNiAgICAgICAgcTIsICBxMiwgIHE4CisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMywgIHEzLCAgcTkKKyAgICAgICAgdnJzaHJuLmkxNiAgICAgIGQyLCAgcTIsICAjNQorICAgICAgICB2cnNocm4uaTE2ICAgICAgZDMsICBxMywgICM1CisuZW5kbQorCisvKiB2b2lkIGZmX3J2NDBfd2VpZ2h0X2Z1bmNfMTZfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYzEsIHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdzEsIGludCB3MiwgaW50IHN0cmlkZSkgKi8KK2Z1bmN0aW9uIGZmX3J2NDBfd2VpZ2h0X2Z1bmNfMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorICAgICAgICB2bW92ICAgICAgICAgICAgZDAsICByMywgIHIxMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM0XQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMTYKKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCAgICAgW3IxLDoxMjhdLCByMTIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMn0sICAgICBbcjIsOjEyOF0sIHIxMgorICAgICAgICBydjQwX3dlaWdodAorICAgICAgICB2c3QxLjggICAgICAgICAge3ExfSwgICAgIFtyMCw6MTI4XSwgcjEyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCisvKiB2b2lkIGZmX3J2NDBfd2VpZ2h0X2Z1bmNfOF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjMSwgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcxLCBpbnQgdzIsIGludCBzdHJpZGUpICovCitmdW5jdGlvbiBmZl9ydjQwX3dlaWdodF9mdW5jXzhfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorICAgICAgICB2bW92ICAgICAgICAgICAgZDAsICByMywgIHIxMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM0XQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjOAorMToKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMn0sICAgICBbcjEsOjY0XSwgcjEyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCAgICAgW3IxLDo2NF0sIHIxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0fSwgICAgIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNX0sICAgICBbcjIsOjY0XSwgcjEyCisgICAgICAgIHJ2NDBfd2VpZ2h0CisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDJ9LCAgICAgW3IwLDo2NF0sIHIxMgorICAgICAgICB2c3QxLjggICAgICAgICAge2QzfSwgICAgIFtyMCw6NjRdLCByMTIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3J2NDBfaF9sb29wX2ZpbHRlcl9zdHJlbmd0aF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwa2hidCAgICAgICAgICAgcjIsICByMywgIHIyLCAgbHNsICMxOAorCisgICAgICAgIGxkciAgICAgICAgICAgICByMywgIFtyMF0KKyAgICAgICAgbGRyX2RwcmUgICAgICAgIHIxMiwgcjAsICByMQorICAgICAgICB0ZXEgICAgICAgICAgICAgcjMsICByMTIKKyAgICAgICAgYmVxICAgICAgICAgICAgIDFmCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgIGxzbCAjMQorCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDRbXX0sICAgW3IwLDozMl0sIHIxICBAIC0zCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDBbXX0sICAgW3IwLDozMl0sIHIxICBAIC0yCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDRbMV19LCAgW3IwLDozMl0sIHIxICBAIC0xCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDVbXX0sICAgW3IwLDozMl0sIHIxICBAICAwCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDFbXX0sICAgW3IwLDozMl0sIHIxICBAICAxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDVbMF19LCAgW3IwLDozMl0sIHIxICBAICAyCisKKyAgICAgICAgdnBhZGRsLnU4ICAgICAgIHE4LCAgcTAgICAgICAgICAgICAgICAgIEAgLTIsIC0yLCAtMiwgLTIsICAxLCAgMSwgIDEsICAxCisgICAgICAgIHZwYWRkbC51OCAgICAgICBxOSwgIHEyICAgICAgICAgICAgICAgICBAIC0zLCAtMywgLTEsIC0xLCAgMiwgIDIsICAwLCAgMAorICAgICAgICB2ZHVwLjMyICAgICAgICAgZDMwLCByMiAgICAgICAgICAgICAgICAgQCBiZXRhMiwgYmV0YSA8PCAyCisgICAgICAgIHZwYWRkLnUxNiAgICAgICBkMTYsIGQxNiwgZDE3ICAgICAgICAgICBAIC0yLCAtMiwgIDEsICAxCisgICAgICAgIHZwYWRkLnUxNiAgICAgICBkMTgsIGQxOCwgZDE5ICAgICAgICAgICBAIC0zLCAtMSwgIDIsICAwCisgICAgICAgIHZhYmQudTE2ICAgICAgICBkMTYsIGQxOCwgZDE2CisgICAgICAgIHZjbHQudTE2ICAgICAgICBkMTYsIGQxNiwgZDMwCisKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHIyLCAgcjMsICBbc3AsICM0XQorICAgICAgICB2bW92bC51MTYgICAgICAgcTEyLCBkMTYKKyAgICAgICAgdnRybi4xNiAgICAgICAgIGQxNiwgZDE3CisgICAgICAgIHZzaHIudTMyICAgICAgICBxMTIsIHExMiwgIzE1CisgICAgICAgIGxkciAgICAgICAgICAgICByMCwgIFtzcF0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjRbMV19LCBbcjIsOjMyXQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyNVsxXX0sIFtyMyw6MzJdCisKKyAgICAgICAgY21wICAgICAgICAgICAgIHIwLCAgIzAKKyAgICAgICAgaXQgICAgICAgICAgICAgIGVxCisgICAgICAgIGJ4ZXEgICAgICAgICAgICBscgorCisgICAgICAgIHZhbmQgICAgICAgICAgICBkMTgsIGQxNiwgZDE3CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkMTgsIGQxOQorICAgICAgICB2YW5kICAgICAgICAgICAgZDE4LCBkMTgsIGQxOQorICAgICAgICB2bW92LnUxNiAgICAgICAgcjAsICBkMThbMF0KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCisxOgorICAgICAgICBsZHJkICAgICAgICAgICAgcjIsICByMywgIFtzcCwgIzRdCisgICAgICAgIG1vdiAgICAgICAgICAgICByMCwgICMwCisgICAgICAgIHN0ciAgICAgICAgICAgICByMCwgIFtyMl0KKyAgICAgICAgc3RyICAgICAgICAgICAgIHIwLCAgW3IzXQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcnY0MF92X2xvb3BfZmlsdGVyX3N0cmVuZ3RoX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgIzMKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHIyLCAgcjMsICByMiwgIGxzbCAjMTgKKworICAgICAgICB2bGQxLjggICAgICAgICAge2QwfSwgICAgIFtyMF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDF9LCAgICAgW3IwXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMn0sICAgICBbcjBdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QzfSwgICAgIFtyMF0sIHIxCisKKyAgICAgICAgdmFkZGwudTggICAgICAgIHEwLCAgZDAsICBkMQorICAgICAgICB2YWRkbC51OCAgICAgICAgcTEsICBkMiwgIGQzCisgICAgICAgIHZkdXAuMzIgICAgICAgICBxMTUsIHIyCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIHEwLCAgcTEgICAgICAgICAgICBAIC0zLCAtMiwgLTEsICAwLCAgMSwgIDIKKyAgICAgICAgdmV4dC4xNiAgICAgICAgIHExLCAgcTAsICBxMCwgICMxICAgICAgIEAgLTIsIC0xLCAgMCwgIDEsICAyCisgICAgICAgIHZhYmQudTE2ICAgICAgICBxMCwgIHExLCAgcTAKKyAgICAgICAgdmNsdC51MTYgICAgICAgIHEwLCAgcTAsICBxMTUKKworICAgICAgICBsZHJkICAgICAgICAgICAgcjIsICByMywgIFtzcCwgIzRdCisgICAgICAgIHZtb3ZsLnUxNiAgICAgICBxMSwgIGQwCisgICAgICAgIHZleHQuMTYgICAgICAgICBkMSwgIGQwLCAgZDEsICAjMworICAgICAgICB2c2hyLnUzMiAgICAgICAgcTEsICBxMSwgICMxNQorICAgICAgICBsZHIgICAgICAgICAgICAgcjAsICBbc3BdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMV19LCAgW3IyLDozMl0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1sxXX0sICBbcjMsOjMyXQorCisgICAgICAgIGNtcCAgICAgICAgICAgICByMCwgICMwCisgICAgICAgIGl0ICAgICAgICAgICAgICBlcQorICAgICAgICBieGVxICAgICAgICAgICAgbHIKKworICAgICAgICB2YW5kICAgICAgICAgICAgZDAsICBkMCwgIGQxCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBkMCwgIGQxCisgICAgICAgIHZhbmQgICAgICAgICAgICBkMCwgIGQwLCAgZDEKKyAgICAgICAgdm1vdi51MTYgICAgICAgIHIwLCAgZDBbMF0KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKy5tYWNybyAgcnY0MF93ZWFrX2xvb3BfZmlsdGVyCisgICAgICAgIHZkdXAuMTYgICAgICAgICBkMzAsIHIyICAgICAgICAgICAgICAgICBAIGZpbHRlcl9wMQorICAgICAgICB2ZHVwLjE2ICAgICAgICAgZDMxLCByMyAgICAgICAgICAgICAgICAgQCBmaWx0ZXJfcTEKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHIyLCAgcjMsICBbc3BdCisgICAgICAgIHZkdXAuMTYgICAgICAgICBkMjgsIHIyICAgICAgICAgICAgICAgICBAIGFscGhhCisgICAgICAgIHZkdXAuMTYgICAgICAgICBkMjksIHIzICAgICAgICAgICAgICAgICBAIGJldGEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjOF0KKyAgICAgICAgdmR1cC4xNiAgICAgICAgIGQyNSwgcjEyICAgICAgICAgICAgICAgIEAgbGltX3AwcTAKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHIyLCAgcjMsICBbc3AsICMxMl0KKyAgICAgICAgdnN1YmwudTggICAgICAgIHE5LCAgZDUsICBkNCAgICAgICAgICAgIEAgeCwgdAorICAgICAgICB2YWJkbC51OCAgICAgICAgcTgsICBkNSwgIGQ0ICAgICAgICAgICAgQCB4LCBhYnModCkKKyAgICAgICAgdm5lZy5zMTYgICAgICAgIHExNSwgcTE1CisgICAgICAgIHZjZXEuaTE2ICAgICAgICBkMTYsIGQxOSwgIzAgICAgICAgICAgICBAICF0CisgICAgICAgIHZzaGwuczE2ICAgICAgICBkMTksIGQxOSwgIzIgICAgICAgICAgICBAIHQgPDwgMgorICAgICAgICB2bXVsLnUxNiAgICAgICAgZDE4LCBkMTcsIGQyOCAgICAgICAgICAgQCBhbHBoYSAqIGFicyh0KQorICAgICAgICB2YW5kICAgICAgICAgICAgZDI0LCBkMzAsIGQzMSAgICAgICAgICAgQCBmaWx0ZXJfcDEgJiBmaWx0ZXJfcTEKKyAgICAgICAgdnN1YmwudTggICAgICAgIHExLCAgZDAsICBkNCAgICAgICAgICAgIEAgcDFwMiwgcDFwMAorICAgICAgICB2c3VibC51OCAgICAgICAgcTMsICBkMSwgIGQ1ICAgICAgICAgICAgQCBxMXEyLCBxMXEwCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBkMjIsICMzCisgICAgICAgIHZzaHIudTE2ICAgICAgICBkMTgsIGQxOCwgIzcKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQyMiwgZDIyLCBkMjQgICAgICAgICAgIEAgMyAtIChmaWx0ZXJfcDEgJiBmaWx0ZXJfcTEpCisgICAgICAgIHZzdWJsLnU4ICAgICAgICBxMTAsIGQwLCAgZDEgICAgICAgICAgICBAIHNyY1stMl0gLSBzcmNbMV0KKyAgICAgICAgdmNsZS51MTYgICAgICAgIGQxOCwgZDE4LCBkMjIKKyAgICAgICAgdmFuZCAgICAgICAgICAgIGQyMCwgZDIwLCBkMjQKKyAgICAgICAgdm5lZy5zMTYgICAgICAgIGQyMywgZDI1ICAgICAgICAgICAgICAgIEAgLWxpbV9wMHEwCisgICAgICAgIHZhZGQuczE2ICAgICAgICBkMTksIGQxOSwgZDIwCisgICAgICAgIHZiaWMgICAgICAgICAgICBkMTYsIGQxOCwgZDE2ICAgICAgICAgICBAIHQgJiYgdSA8PSAzIC0gKGZwMSAmIGZxMSkKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQ0LCAgZDUgICAgICAgICAgICAgICAgIEAgLTMsICAyLCAtMSwgIDAKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIGQxOSwgZDE5LCAjMworICAgICAgICB2bW92ICAgICAgICAgICAgZDI4LCBkMjkgICAgICAgICAgICAgICAgQCBiZXRhCisgICAgICAgIHZzd3AgICAgICAgICAgICBkMywgIGQ2ICAgICAgICAgICAgICAgICBAIHExcTIsIHAxcDAKKyAgICAgICAgdm1pbi5zMTYgICAgICAgIGQxOSwgZDE5LCBkMjUKKyAgICAgICAgdmFuZCAgICAgICAgICAgIGQzMCwgZDMwLCBkMTYKKyAgICAgICAgdmFuZCAgICAgICAgICAgIGQzMSwgZDMxLCBkMTYKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIHExMCwgcTEsICBxMyAgICAgICAgICAgIEAgcDFwMiArIHAxcDAsIHExcTIgKyBxMXEwCisgICAgICAgIHZtYXguczE2ICAgICAgICBkMTksIGQxOSwgZDIzICAgICAgICAgICBAIGRpZmYKKyAgICAgICAgdmFicy5zMTYgICAgICAgIHExLCAgcTEgICAgICAgICAgICAgICAgIEAgYWJzKHAxcDIpLCBhYnMocTFxMikKKyAgICAgICAgdmFuZCAgICAgICAgICAgIGQxOCwgZDE5LCBkMTYgICAgICAgICAgIEAgZGlmZgorICAgICAgICB2Y2xlLnUxNiAgICAgICAgcTEsICBxMSwgIHExNAorICAgICAgICB2bmVnLnMxNiAgICAgICAgZDE5LCBkMTggICAgICAgICAgICAgICAgQCAtZGlmZgorICAgICAgICB2ZHVwLjE2ICAgICAgICAgZDI2LCByMyAgICAgICAgICAgICAgICAgQCBsaW1fcDEKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEyLCAgcTksICBkNSAgICAgICAgICAgIEAgc3JjWy0xXStkaWZmLCBzcmNbMF0tZGlmZgorICAgICAgICB2aHN1Yi5zMTYgICAgICAgcTExLCBxMTAsIHE5CisgICAgICAgIHZhbmQgICAgICAgICAgICBxMSwgIHExLCAgcTE1CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNCwgIHEyICAgICAgICAgICAgICAgICBAIC0xLCAgMAorICAgICAgICB2YW5kICAgICAgICAgICAgcTksICBxMTEsIHExCisgICAgICAgIHZkdXAuMTYgICAgICAgICBkMjcsIHIyICAgICAgICAgICAgICAgICBAIGxpbV9xMQorICAgICAgICB2bmVnLnMxNiAgICAgICAgcTksICBxOQorICAgICAgICB2bmVnLnMxNiAgICAgICAgcTE0LCBxMTMKKyAgICAgICAgdm1pbi5zMTYgICAgICAgIHE5LCAgcTksICBxMTMKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQwLCAgZDEgICAgICAgICAgICAgICAgIEAgLTIsICAxLCAgLTIsICAxCisgICAgICAgIHZtYXguczE2ICAgICAgICBxOSwgIHE5LCAgcTE0CisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMywgIHE5LCAgZDAKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ1LCAgcTMgICAgICAgICAgICAgICAgIEAgLTIsICAxCisuZW5kbQorCitmdW5jdGlvbiBmZl9ydjQwX2hfd2Vha19sb29wX2ZpbHRlcl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCAgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEKKworICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0W119LCAgIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwW119LCAgIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0WzFdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q1W119LCAgIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxW119LCAgIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q1WzBdfSwgIFtyMCw6MzJdCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgIGxzbCAjMgorCisgICAgICAgIHJ2NDBfd2Vha19sb29wX2ZpbHRlcgorCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDVbMF19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMF19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDVbMV19LCAgW3IwLDozMl0sIHIxCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3J2NDBfdl93ZWFrX2xvb3BfZmlsdGVyX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIwLCAgIzMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjMgorCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDR9LCAgICAgW3IxMl0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCAgICAgW3IxMl0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCAgICAgW3IxMl0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCAgICAgW3IxMl0sIHIxCisKKyAgICAgICAgdnRybi4xNiAgICAgICAgIHEyLCAgcTEKKyAgICAgICAgdnRybi44ICAgICAgICAgIGQ0LCAgZDUKKyAgICAgICAgdnRybi44ICAgICAgICAgIGQyLCAgZDMKKworICAgICAgICB2cmV2NjQuMzIgICAgICAgZDUsICBkNQorICAgICAgICB2dHJuLjMyICAgICAgICAgcTIsICBxMQorICAgICAgICB2ZHVwLjMyICAgICAgICAgZDAsICBkM1swXQorICAgICAgICB2ZHVwLjMyICAgICAgICAgZDEsICBkMlswXQorCisgICAgICAgIHJ2NDBfd2Vha19sb29wX2ZpbHRlcgorCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBxMiwgIHEzCisgICAgICAgIHZzd3AgICAgICAgICAgICBkNCwgIGQ1CisKKyAgICAgICAgdnN0NC44ICAgICAgICAgIHtkNFswXSxkNVswXSxkNlswXSxkN1swXX0sIFtyMF0sIHIxCisgICAgICAgIHZzdDQuOCAgICAgICAgICB7ZDRbMV0sZDVbMV0sZDZbMV0sZDdbMV19LCBbcjBdLCByMQorICAgICAgICB2c3Q0LjggICAgICAgICAge2Q0WzJdLGQ1WzJdLGQ2WzJdLGQ3WzJdfSwgW3IwXSwgcjEKKyAgICAgICAgdnN0NC44ICAgICAgICAgIHtkNFszXSxkNVszXSxkNlszXSxkN1szXX0sIFtyMF0sIHIxCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vc2JyZHNwX2luaXRfYXJtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vc2JyZHNwX2luaXRfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiNjlmOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9zYnJkc3BfaW5pdF9hcm0uYwpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hbnMgUnVsbGdhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3NicmRzcC5oIgorCit2b2lkIGZmX3Nicl9zdW02NHg1X25lb24oZmxvYXQgKnopOworZmxvYXQgZmZfc2JyX3N1bV9zcXVhcmVfbmVvbihmbG9hdCAoKngpWzJdLCBpbnQgbik7Cit2b2lkIGZmX3Nicl9uZWdfb2RkXzY0X25lb24oZmxvYXQgKngpOwordm9pZCBmZl9zYnJfcW1mX3ByZV9zaHVmZmxlX25lb24oZmxvYXQgKnopOwordm9pZCBmZl9zYnJfcW1mX3Bvc3Rfc2h1ZmZsZV9uZW9uKGZsb2F0IFdbMzJdWzJdLCBjb25zdCBmbG9hdCAqeik7Cit2b2lkIGZmX3Nicl9xbWZfZGVpbnRfbmVnX25lb24oZmxvYXQgKnYsIGNvbnN0IGZsb2F0ICpzcmMpOwordm9pZCBmZl9zYnJfcW1mX2RlaW50X2JmbHlfbmVvbihmbG9hdCAqdiwgY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxKTsKK3ZvaWQgZmZfc2JyX2hmX2dfZmlsdF9uZW9uKGZsb2F0ICgqWSlbMl0sIGNvbnN0IGZsb2F0ICgqWF9oaWdoKVs0MF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZ19maWx0LCBpbnQgbV9tYXgsIGludHB0cl90IGl4aCk7Cit2b2lkIGZmX3Nicl9oZl9nZW5fbmVvbihmbG9hdCAoKlhfaGlnaClbMl0sIGNvbnN0IGZsb2F0ICgqWF9sb3cpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgYWxwaGEwWzJdLCBjb25zdCBmbG9hdCBhbHBoYTFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBidywgaW50IHN0YXJ0LCBpbnQgZW5kKTsKK3ZvaWQgZmZfc2JyX2F1dG9jb3JyZWxhdGVfbmVvbihjb25zdCBmbG9hdCB4WzQwXVsyXSwgZmxvYXQgcGhpWzNdWzJdWzJdKTsKKwordm9pZCBmZl9zYnJfaGZfYXBwbHlfbm9pc2VfMF9uZW9uKGZsb2F0IFlbNjRdWzJdLCBjb25zdCBmbG9hdCAqc19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpxX2ZpbHQsIGludCBub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga3gsIGludCBtX21heCk7Cit2b2lkIGZmX3Nicl9oZl9hcHBseV9ub2lzZV8xX25lb24oZmxvYXQgWVs2NF1bMl0sIGNvbnN0IGZsb2F0ICpzX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdCwgaW50IG5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBreCwgaW50IG1fbWF4KTsKK3ZvaWQgZmZfc2JyX2hmX2FwcGx5X25vaXNlXzJfbmVvbihmbG9hdCBZWzY0XVsyXSwgY29uc3QgZmxvYXQgKnNfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqcV9maWx0LCBpbnQgbm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGt4LCBpbnQgbV9tYXgpOwordm9pZCBmZl9zYnJfaGZfYXBwbHlfbm9pc2VfM19uZW9uKGZsb2F0IFlbNjRdWzJdLCBjb25zdCBmbG9hdCAqc19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpxX2ZpbHQsIGludCBub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga3gsIGludCBtX21heCk7CisKK2F2X2NvbGQgdm9pZCBmZl9zYnJkc3BfaW5pdF9hcm0oU0JSRFNQQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPnN1bTY0eDUgPSBmZl9zYnJfc3VtNjR4NV9uZW9uOworICAgICAgICBzLT5zdW1fc3F1YXJlID0gZmZfc2JyX3N1bV9zcXVhcmVfbmVvbjsKKyAgICAgICAgcy0+bmVnX29kZF82NCA9IGZmX3Nicl9uZWdfb2RkXzY0X25lb247CisgICAgICAgIHMtPnFtZl9wcmVfc2h1ZmZsZSA9IGZmX3Nicl9xbWZfcHJlX3NodWZmbGVfbmVvbjsKKyAgICAgICAgcy0+cW1mX3Bvc3Rfc2h1ZmZsZSA9IGZmX3Nicl9xbWZfcG9zdF9zaHVmZmxlX25lb247CisgICAgICAgIHMtPnFtZl9kZWludF9uZWcgPSBmZl9zYnJfcW1mX2RlaW50X25lZ19uZW9uOworICAgICAgICBzLT5xbWZfZGVpbnRfYmZseSA9IGZmX3Nicl9xbWZfZGVpbnRfYmZseV9uZW9uOworICAgICAgICBzLT5oZl9nX2ZpbHQgPSBmZl9zYnJfaGZfZ19maWx0X25lb247CisgICAgICAgIHMtPmhmX2dlbiA9IGZmX3Nicl9oZl9nZW5fbmVvbjsKKyAgICAgICAgcy0+YXV0b2NvcnJlbGF0ZSA9IGZmX3Nicl9hdXRvY29ycmVsYXRlX25lb247CisgICAgICAgIHMtPmhmX2FwcGx5X25vaXNlWzBdID0gZmZfc2JyX2hmX2FwcGx5X25vaXNlXzBfbmVvbjsKKyAgICAgICAgcy0+aGZfYXBwbHlfbm9pc2VbMV0gPSBmZl9zYnJfaGZfYXBwbHlfbm9pc2VfMV9uZW9uOworICAgICAgICBzLT5oZl9hcHBseV9ub2lzZVsyXSA9IGZmX3Nicl9oZl9hcHBseV9ub2lzZV8yX25lb247CisgICAgICAgIHMtPmhmX2FwcGx5X25vaXNlWzNdID0gZmZfc2JyX2hmX2FwcGx5X25vaXNlXzNfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vc2JyZHNwX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9zYnJkc3BfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmFiZDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vc2JyZHNwX25lb24uUwpAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNYW5zIFJ1bGxnYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9zYnJfc3VtNjR4NV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge2xyfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMCwgICMgNjQqNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMCwgICMxMjgqNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsICByMCwgICMxOTIqNAorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICByMCwgICMyNTYqNAorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjNjQKKzE6CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IwLDoxMjhdCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTF9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTAsICBxMCwgIHExCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTJ9LCAgICAgW3IyLDoxMjhdIQorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTAsICBxMCwgIHEyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTN9LCAgICAgW3IzLDoxMjhdIQorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTAsICBxMCwgIHEzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTh9LCAgICAgW2xyLDoxMjhdIQorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTAsICBxMCwgIHE4CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IwLDoxMjhdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCAjNAorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfc2JyX3N1bV9zcXVhcmVfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgdm1vdi5mMzIgICAgICAgIHEwLCAgIzAuMAorMToKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjAsOjEyOF0hCisgICAgICAgIHZtbGEuZjMyICAgICAgICBxMCwgIHExLCAgcTEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxLCAgcjEsICAjMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQwLCAgZDAsICBkMQorICAgICAgICB2cGFkZC5mMzIgICAgICAgZDAsICBkMCwgIGQwCitOT1ZGUCAgIHZtb3YuMzIgICAgICAgICByMCwgIGQwWzBdCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfbmVnX29kZF82NF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByMAorICAgICAgICB2bW92LmkzMiAgICAgICAgcTgsICAjMTw8MzEKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtxMCxxMX0sICBbcjAsOjEyOF0hCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMSwgIHExLCAgcTgKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtxMixxM30sICBbcjAsOjEyOF0hCisgICAgLnJlcHQgMworICAgICAgICB2c3QyLjMyICAgICAgICAge3EwLHExfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmVvciAgICAgICAgICAgIHEzLCAgcTMsICBxOAorICAgICAgICB2bGQyLjMyICAgICAgICAge3EwLHExfSwgIFtyMCw6MTI4XSEKKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtxMixxM30sICBbcjEsOjEyOF0hCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMSwgIHExLCAgcTgKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtxMixxM30sICBbcjAsOjEyOF0hCisgICAgLmVuZHIKKyAgICAgICAgdmVvciAgICAgICAgICAgIHEzLCAgcTMsICBxOAorICAgICAgICB2c3QyLjMyICAgICAgICAge3EwLHExfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtxMixxM30sICBbcjEsOjEyOF0hCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfcW1mX3ByZV9zaHVmZmxlX25lb24sIGV4cG9ydD0xCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIwLCAgIzYwKjQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjAsICAjNjQqNAorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwfSwgICAgIFtyMCw6NjRdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwfSwgICAgIFtyMiw6NjRdIQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjLTE2CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMyNAorICAgICAgICB2bW92LmkzMiAgICAgICAgcTgsICAjMTw8MzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMH0sICAgICBbcjEsOjEyOF0sIHIzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDJ9LCAgICAgW3IwLDo2NF0hCisxOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QzLGQ0fSwgIFtyMCw6MTI4XSEKKyAgICAgICAgdnJldjY0LjMyICAgICAgIHEwLCAgcTAKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOX0sICAgICBbcjEsOjEyOF0sIHIzCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMCwgIHEwLCAgcTgKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNSxkNn0sICBbcjAsOjEyOF0hCisgICAgICAgIHZzd3AgICAgICAgICAgICBkMCwgIGQxCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxOSwgIHE5CisgICAgICAgIHZzdDIuMzIgICAgICAgICB7cTAscTF9LCAgW3IyLDo2NF0hCisgICAgICAgIHZtb3YgICAgICAgICAgICBxMTAsIHEyCisgICAgICAgIHZlb3IgICAgICAgICAgICBxOSwgIHE5LCAgcTgKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQyLCAgZDYKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQxOCwgZDE5CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IxLDoxMjhdLCByMworICAgICAgICB2c3QyLjMyICAgICAgICAge3E5LHExMH0sIFtyMiw6NjRdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICM4CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QzLGQ0fSwgIFtyMCw6MTI4XSEKKyAgICAgICAgdnJldjY0LjMyICAgICAgIHEwLCAgcTAKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOX0sICAgICBbcjEsOjEyOF0sIHIzCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMCwgIHEwLCAgcTgKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNX0sICAgICBbcjAsOjY0XSEKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQwLCAgZDEKKyAgICAgICAgdnJldjY0LjMyICAgICAgIHE5LCAgcTkKKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtxMCxxMX0sICBbcjIsOjY0XSEKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQ0LCAgZDUKKyAgICAgICAgdmVvciAgICAgICAgICAgIHExLCAgcTksICBxOAorICAgICAgICB2c3QyLjMyICAgICAgICAge2QzLGQ1fSwgIFtyMiw6NjRdIQorICAgICAgICB2c3QyLjMyICAgICAgICAge2QyWzBdLGQ0WzBdfSwgW3IyLDo2NF0hCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfcW1mX3Bvc3Rfc2h1ZmZsZV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMSwgICM2MCo0CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMtMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzMyCisgICAgICAgIHZtb3YuaTMyICAgICAgICBxOCwgICMxPDwzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMiw6MTI4XSwgcjMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjEsOjEyOF0hCisxOgorICAgICAgICBwbGQgICAgICAgICAgICAgW3IyLCAjLTMyXQorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTAsICBxMAorICAgICAgICB2c3dwICAgICAgICAgICAgZDIsICBkMworICAgICAgICB2ZW9yICAgICAgICAgICAgcTAsICBxMCwgIHE4CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTJ9LCAgICAgW3IyLDoxMjhdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge3EzfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkMSxkM30sICBbcjAsOjEyOF0hCisgICAgICAgIHZzdDIuMzIgICAgICAgICB7ZDAsZDJ9LCAgW3IwLDoxMjhdIQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IyLCAjLTMyXQorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTIsICBxMgorICAgICAgICB2c3dwICAgICAgICAgICAgZDYsICBkNworICAgICAgICB2ZW9yICAgICAgICAgICAgcTIsICBxMiwgIHE4CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IyLDoxMjhdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtkNSxkN30sICBbcjAsOjEyOF0hCisgICAgICAgIHZzdDIuMzIgICAgICAgICB7ZDQsZDZ9LCAgW3IwLDoxMjhdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICM4CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfc2JyX3FtZl9kZWludF9uZWdfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICAjNjAqNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMCwgICM2Mio0CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMtMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzMyCisgICAgICAgIHZtb3YuaTMyICAgICAgICBkMiwgICMxPDwzMQorMToKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtkMCxkMX0sICBbcjEsOjEyOF0sIHIzCisgICAgICAgIHZlb3IgICAgICAgICAgICBkMCwgIGQwLCAgZDIKKyAgICAgICAgdnJldjY0LjMyICAgICAgIGQxLCAgZDEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMH0sICAgICBbcjIsOjY0XQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxfSwgICAgIFtyMCw6NjRdIQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICM4CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfcW1mX2RlaW50X2JmbHlfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtscn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICAjNjAqNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsICByMCwgICMxMjQqNAorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjNjQKKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgIy0xNgorMToKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMH0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTF9LCAgICAgW3IyLDoxMjhdLCBscgorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTIsICBxMAorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTMsICBxMQorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDMsICBkNCwgIGQzCisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMiwgIGQ1LCAgZDIKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQwLCAgZDAsICBkNworICAgICAgICB2c3ViLmYzMiAgICAgICAgZDEsICBkMSwgIGQ2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTF9LCAgICAgW3IzLDoxMjhdLCBscgorICAgICAgICB2c3QxLjMyICAgICAgICAge3EwfSwgICAgIFtyMCw6MTI4XSEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfc2JyX2hmX2dfZmlsdF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjEyLCBsc2wgIzMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzQwKjIqNAorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7ZDJbXSxkM1tdfSxbcjIsOjY0XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMH0sICAgICBbcjEsOjY0XSwgcjEyCisxOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxfSwgICAgIFtyMSw6NjRdLCByMTIKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHEzLCAgcTAsICBxMQorICAgICAgICB2bGQyLjMyICAgICAgICAge2QyW10sZDNbXX0sW3IyLDo2NF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDB9LCAgICAgW3IxLDo2NF0sIHIxMgorICAgICAgICB2c3QxLjMyICAgICAgICAge3EzfSwgICAgIFtyMCw6NjRdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMyCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICBpdCAgICAgICAgICAgICAgbHQKKyAgICAgICAgYnhsdCAgICAgICAgICAgIGxyCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMCwgIGQwLCAgZDIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XSEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3Nicl9oZl9nZW5fbmVvbiwgZXhwb3J0PTEKK05PVkZQICAgdmxkMS4zMiAgICAgICAgIHtkMVtdfSwgICBbc3AsOjMyXQorVkZQICAgICB2ZHVwLjMyICAgICAgICAgZDEsICBkMFswXQorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDAsICBkMSwgIGQxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDN9LCAgICAgW3IyLDo2NF0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMn0sICAgICBbcjMsOjY0XQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTAsICBxMCwgIHExCisgICAgICAgIGxkcmQgICAgICAgICAgICByMiwgIHIzLCAgW3NwLCAjNCohSEFWRV9WRlBfQVJHU10KKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQwLCAgZDEKKyAgICAgICAgdm5lZy5mMzIgICAgICAgIGQxOCwgZDEKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQxOCwgZDEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMiwgIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIyLCAgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzIqOAorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgIHIyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTF9LCAgICAgW3IxLDoxMjhdIQorMToKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxM30sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxMiwgIHExCisgICAgICAgIHZtb3YgICAgICAgICAgICBxOCwgIHEzCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBkMjAsIGQzCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBkMjEsIGQ2CisgICAgICAgIHZtbGEuZjMyICAgICAgICBxMywgIHExLCAgZDBbMF0KKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQ2LCAgZDQsICBkMTgKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQ3LCAgZDIwLCBkMTgKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQ2LCAgZDMsICBkMFsxXQorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDcsICBkMTYsIGQwWzFdCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkNiwgIGQ1LCAgZDEKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQ3LCAgZDIxLCBkMQorICAgICAgICB2bW92ICAgICAgICAgICAgcTEsICBxOAorICAgICAgICB2c3QxLjMyICAgICAgICAge3EzfSwgICAgIFtyMCw6MTI4XSEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3Nicl9hdXRvY29ycmVsYXRlX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IwLDoxMjhdIQorICAgICAgICB2bW92LmYzMiAgICAgICAgcTEsICAjMC4wCisgICAgICAgIHZtb3YuZjMyICAgICAgICBxMywgICMwLjAKKyAgICAgICAgdm1vdi5mMzIgICAgICAgIGQyMCwgIzAuMAorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDIxLCBkMSwgIGQxCisgICAgICAgIHZtb3YgICAgICAgICAgICBxOCwgIHEwCisgICAgICAgIHZtb3YgICAgICAgICAgICBxMTEsIHEwCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMzNgorMToKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMn0sICAgICBbcjAsOjEyOF0hCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxMTIsIHEyCisgICAgICAgIHZtbGEuZjMyICAgICAgICBxMTAsIHEyLCAgcTIKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQyLCAgZDEsICBkNAorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDMsICBkMSwgIGQyNAorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDYsICBkMCwgIGQ0CisgICAgICAgIHZtbGEuZjMyICAgICAgICBkNywgIGQwLCAgZDI0CisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMiwgIGQ0LCAgZDUKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQzLCAgZDQsICBkMjUKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQ2LCAgZDEsICBkNQorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDcsICBkMSwgIGQyNQorICAgICAgICB2bW92ICAgICAgICAgICAgcTAsICBxMgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EyfSwgICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdnJldjY0LjMyICAgICAgIHExMiwgcTIKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQyLCAgZDEsICBkNAorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDMsICBkMSwgIGQyNAorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDYsICBkMCwgIGQ0CisgICAgICAgIHZtbGEuZjMyICAgICAgICBkNywgIGQwLCAgZDI0CisgICAgICAgIHZhZGQuZjMyICAgICAgICBkMjAsIGQyMCwgZDIxCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBkMTgsIGQxNworICAgICAgICB2bWxhLmYzMiAgICAgICAgZDYsICBkMSwgIGQ1CisgICAgICAgIHZtbGEuZjMyICAgICAgICBkNywgIGQxLCAgZDI1CisgICAgICAgIHZtb3YgICAgICAgICAgICBxMCwgIHExCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMCwgIGQxNiwgZDE3CisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMSwgIGQxNiwgZDE4CisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMiwgIGQ0LCAgZDUKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQzLCAgZDQsICBkMjUKKyAgICAgICAgdm5lZy5mMzIgICAgICAgIHMxNSwgczE1CisgICAgICAgIHZtb3YgICAgICAgICAgICBkMjEsIGQyMAorICAgICAgICB2cGFkZC5mMzIgICAgICAgZDAsICBkMCwgIGQyCisgICAgICAgIHZwYWRkLmYzMiAgICAgICBkNywgIGQ2LCAgZDcKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQxLCAgZDMKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIGQ2LCAgZDEsICBkMworICAgICAgICB2bWxhLmYzMiAgICAgICAgZDIwLCBkMjIsIGQyMgorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDIxLCBkNCwgIGQ0CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkMCwgIGQ2CisgICAgICAgIHZwYWRkLmYzMiAgICAgICBkMjAsIGQyMCwgZDIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTN9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyMFsxXX0sIFtyMSw6MzJdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzIqNAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwfSwgICAgIFtyMSw6NjRdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzQqNAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyMFswXX0sIFtyMSw6MzJdCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfaGZfYXBwbHlfbm9pc2VfMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2bW92LmkzMiAgICAgICAgZDMsICAjMAorLkxoZl9hcHBseV9ub2lzZV8wOgorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LGxyfQorICAgICAgICBtb3ZyZWx4ICAgICAgICAgcjQsICBYKGZmX3Nicl9ub2lzZV90YWJsZSkKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjMTJdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgYmZjICAgICAgICAgICAgIHIzLCAgIzksICAjMjMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorMToKKyAgICAgICAgYWRkICAgICAgICAgICAgIGxyLCAgcjQsICByMywgIGxzbCAjMworICAgICAgICB2bGQyLjMyICAgICAgICAge3EwfSwgICAgIFtyMCw6NjRdCisgICAgICAgIHZsZDIuMzIgICAgICAgICB7cTN9LCAgICAgW2xyLDo2NF0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMn0sICAgICBbcjEsOjY0XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTh9LCAgICBbcjIsOjY0XSEKKyAgICAgICAgdmNlcS5mMzIgICAgICAgIGQxNiwgZDIsICAjMAorICAgICAgICB2ZW9yICAgICAgICAgICAgZDIsICBkMiwgIGQzCisgICAgICAgIHZtb3YgICAgICAgICAgICBxMiwgIHEwCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMCwgIGQ2LCAgZDE4CisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMSwgIGQ3LCAgZDE4CisgICAgICAgIHZhZGQuZjMyICAgICAgICBkNCwgIGQ0LCAgZDIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICBiZmMgICAgICAgICAgICAgcjMsICAjOSwgICMyMworICAgICAgICB2YmlmICAgICAgICAgICAgZDAsICBkNCwgIGQxNgorICAgICAgICB2YmlmICAgICAgICAgICAgZDEsICBkNSwgIGQxNgorICAgICAgICB2c3QyLjMyICAgICAgICAge3EwfSwgICAgIFtyMCw6NjRdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICBibHQgICAgICAgICAgICAgMmYKKyAgICAgICAgYWRkICAgICAgICAgICAgIGxyLCAgcjQsICByMywgIGxzbCAjMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QwfSwgICAgIFtyMCw6NjRdCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDZ9LCAgICAgW2xyLDo2NF0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMltdfSwgICBbcjEsOjMyXSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkM1tdfSwgICBbcjIsOjMyXSEKKyAgICAgICAgdmNlcS5mMzIgICAgICAgIGQ0LCAgZDIsICAjMAorICAgICAgICB2ZW9yICAgICAgICAgICAgZDIsICBkMiwgIGQzCisgICAgICAgIHZtb3YgICAgICAgICAgICBkMSwgIGQwCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMCwgIGQ2LCAgZDMKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIHMyLCAgczIsICBzNAorICAgICAgICB2YmlmICAgICAgICAgICAgZDAsICBkMSwgIGQ0CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDB9LCAgICAgW3IwLDo2NF0hCisyOgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfaGZfYXBwbHlfbm9pc2VfMV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsbHJ9CisgICAgICAgIGxzbCAgICAgICAgICAgICByMTIsIHIxMiwgIzMxCisgICAgICAgIGVvciAgICAgICAgICAgICBsciwgIHIxMiwgIzE8PDMxCisgICAgICAgIHZtb3YgICAgICAgICAgICBkMywgIHIxMiwgbHIKKy5MaGZfYXBwbHlfbm9pc2VfMToKKyAgICAgICAgbW92cmVseCAgICAgICAgIHI0LCAgWChmZl9zYnJfbm9pc2VfdGFibGUpCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzEyXQorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsICByMywgICMxCisgICAgICAgIGJmYyAgICAgICAgICAgICByMywgICM5LCAgIzIzCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIxMiwgIzEKKzE6CisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHI0LCAgcjMsICBsc2wgIzMKKyAgICAgICAgdmxkMi4zMiAgICAgICAgIHtxMH0sICAgICBbcjAsOjY0XQorICAgICAgICB2bGQyLjMyICAgICAgICAge3EzfSwgICAgIFtsciw6NjRdCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDJ9LCAgICAgW3IxLDo2NF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE4fSwgICAgW3IyLDo2NF0hCisgICAgICAgIHZjZXEuZjMyICAgICAgICBkMTYsIGQyLCAgIzAKKyAgICAgICAgdmVvciAgICAgICAgICAgIGQyLCAgZDIsICBkMworICAgICAgICB2bW92ICAgICAgICAgICAgcTIsICBxMAorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDAsICBkNiwgIGQxOAorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDEsICBkNywgIGQxOAorICAgICAgICB2YWRkLmYzMiAgICAgICAgZDUsICBkNSwgIGQyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgYmZjICAgICAgICAgICAgIHIzLCAgIzksICAjMjMKKyAgICAgICAgdmJpZiAgICAgICAgICAgIGQwLCAgZDQsICBkMTYKKyAgICAgICAgdmJpZiAgICAgICAgICAgIGQxLCAgZDUsICBkMTYKKyAgICAgICAgdnN0Mi4zMiAgICAgICAgIHtxMH0sICAgICBbcjAsOjY0XSEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgYmx0ICAgICAgICAgICAgIDJmCisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHI0LCAgcjMsICBsc2wgIzMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q2fSwgICAgIFtsciw6NjRdCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDJbXX0sICAgW3IxLDozMl0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE4W119LCAgW3IyLDozMl0hCisgICAgICAgIHZjZXEuZjMyICAgICAgICBkNCwgIGQyLCAgIzAKKyAgICAgICAgdmVvciAgICAgICAgICAgIGQyLCAgZDIsICBkMworICAgICAgICB2bW92ICAgICAgICAgICAgZDEsICBkMAorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDAsICBkNiwgIGQxOAorICAgICAgICB2YWRkLmYzMiAgICAgICAgczMsICBzMywgIHM1CisgICAgICAgIHZiaWYgICAgICAgICAgICBkMCwgIGQxLCAgZDQKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XSEKKzI6CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQscGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3Nicl9oZl9hcHBseV9ub2lzZV8yX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZtb3YuaTMyICAgICAgICBkMywgICMxPDwzMQorICAgICAgICBiICAgICAgICAgICAgICAgLkxoZl9hcHBseV9ub2lzZV8wCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3Nicl9oZl9hcHBseV9ub2lzZV8zX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCxscn0KKyAgICAgICAgbHNsICAgICAgICAgICAgIHIxMiwgcjEyLCAjMzEKKyAgICAgICAgZW9yICAgICAgICAgICAgIGxyLCAgcjEyLCAjMTw8MzEKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQzLCAgbHIsIHIxMgorICAgICAgICBiICAgICAgICAgICAgICAgLkxoZl9hcHBseV9ub2lzZV8xCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vc2ltcGxlX2lkY3RfYXJtLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vc2ltcGxlX2lkY3RfYXJtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzMDA3MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9zaW1wbGVfaWRjdF9hcm0uUwpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBGcmVkZXJpYyAnZGlsYicgQm91bGF5CisgKgorICogQXV0aG9yOiBGcmVkZXJpYyBCb3VsYXkgPGRpbGJAaGFuZGhlbGRzLm9yZz4KKyAqCisgKiBUaGUgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBzaW1wbGVfaWRjdCBmdW5jdGlvbgorICogZnJvbSB0aGUgbGliYXZjb2RlYyBsaWJyYXJ5IHBhcnQgb2YgdGhlIEZGbXBlZyBwcm9qZWN0LgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworLyogdXNlZnVsIGNvbnN0YW50cyBmb3IgdGhlIGFsZ29yaXRobSAqLworI2RlZmluZSBXMSAgMjI3MjUKKyNkZWZpbmUgVzIgIDIxNDA3CisjZGVmaW5lIFczICAxOTI2NgorI2RlZmluZSBXNCAgMTYzODMKKyNkZWZpbmUgVzUgIDEyODczCisjZGVmaW5lIFc2ICA4ODY3CisjZGVmaW5lIFc3ICA0NTIwCisjZGVmaW5lIE1BU0tfTVNIVyAweEZGRkYwMDAwCisKKyNkZWZpbmUgUk9XX1NISUZUIDExCisjZGVmaW5lIFJPV19TSElGVDJNU0hXICgxNi0xMSkKKyNkZWZpbmUgQ09MX1NISUZUIDIwCisjZGVmaW5lIFJPV19TSElGVEVEXzEgMTAyNCAvKiAxPDwgKFJPV19TSElGVC0xKSAqLworI2RlZmluZSBDT0xfU0hJRlRFRF8xIDUyNDI4OCAvKiAxPDwgKENPTF9TSElGVC0xKSAqLworCisKK2Z1bmN0aW9uIGZmX3NpbXBsZV9pZGN0X2FybSwgZXhwb3J0PTEKKyAgICAgICAgQEAgdm9pZCBzaW1wbGVfaWRjdF9hcm0oaW50MTZfdCAqYmxvY2spCisgICAgICAgIEBAIHNhdmUgc3RhY2sgZm9yIHJlZyBuZWVkZWQgKHRha2UgYWxsIG9mIHRoZW0pLAorICAgICAgICBAQCBSMC1SMyBhcmUgc2NyYXRjaCByZWdzLCBzbyBubyBuZWVkIHRvIHNhdmUgdGhlbSwgYnV0IFIwIGNvbnRhaW5zIHRoZSBwb2ludGVyIHRvIGJsb2NrCisgICAgICAgIEBAIHNvIGl0IG11c3Qgbm90IGJlIG92ZXJ3cml0dGVuLCBpZiBpdCBpcyBub3Qgc2F2ZWQhIQorICAgICAgICBAQCBSMTIgaXMgYW5vdGhlciBzY3JhdGNoIHJlZ2lzdGVyLCBzbyBpdCBzaG91bGQgbm90IGJlIHNhdmVkIHRvbworICAgICAgICBAQCBzYXZlIGFsbCByZWdpc3RlcnMKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjExLCByMTR9IEAgUjE0IGlzIGFsc28gY2FsbGVkIExSCisgICAgICAgIEBAIGF0IHRoaXMgcG9pbnQsIFIwPWJsb2NrLCBvdGhlciByZWdpc3RlcnMgYXJlIGZyZWUuCisgICAgICAgIGFkZCByMTQsIHIwLCAjMTEyICAgICAgICBAIFIxND0mYmxvY2tbOCo3XSwgYmV0dGVyIHN0YXJ0IGZyb20gdGhlIGxhc3Qgcm93LCBhbmQgZGVjcmVhc2UgdGhlIHZhbHVlIHVudGlsIHJvdz0wLCBpLmUuIFIxMj1ibG9jay4KKyAgICAgICAgQEAgYWRkIDIgdGVtcG9yYXJ5IHZhcmlhYmxlcyBpbiB0aGUgc3RhY2s6IFIwIGFuZCBSMTQKKyAgICAgICAgc3ViIHNwLCBzcCwgIzggICAgICAgICAgQCBhbGxvdyAyIGxvY2FsIHZhcmlhYmxlcworICAgICAgICBzdHIgcjAsIFtzcCwgIzBdICAgICAgICBAIHNhdmUgYmxvY2sgaW4gc3BbMF0KKyAgICAgICAgQEAgc3RhY2sgc3RhdHVzCisgICAgICAgIEBAIHNwKzQgICBmcmVlCisgICAgICAgIEBAIHNwKzAgICBSMCAgKGJsb2NrKQorCisKKyAgICAgICAgQEAgYXQgdGhpcyBwb2ludCwgUjA9YmxvY2ssIFIxND0mYmxvY2tbNTZdLCBSMTI9X19jb25zdF9wdHJfLCBSMS1SMTEgZnJlZQorCisKK19fcm93X2xvb3A6CisgICAgICAgIEBAIHJlYWQgdGhlIHJvdyBhbmQgY2hlY2sgaWYgaXQgaXMgbnVsbCwgYWxtb3N0IG51bGwsIG9yIG5vdCwgYWNjb3JkaW5nIHRvIHN0cm9uZ2FybSBzcGVjcywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBvcHRpbWl6ZSBsZHIgYWNjZXNzZXMgKGkuZS4gc3BsaXQgMzJiaXRzIGluIDIgMTZiaXRzIHdvcmRzKSwgYXQgbGVhc3QgaXQgZ2l2ZXMgbW9yZSB1c2FibGUgcmVnaXN0ZXJzIDopCisgICAgICAgIGxkciByMSwgW3IxNCwgIzBdICAgICAgICBAIFIxPShpbnQzMikoUjEyKVswXT1ST1dyMzJbMF0gKHJlbGF0aXZlIHJvdyBjYXN0IHRvIGEgMzJiIHBvaW50ZXIpCisgICAgICAgIGxkciByMiwgW3IxNCwgIzRdICAgICAgICBAIFIyPShpbnQzMikoUjEyKVsxXT1ST1dyMzJbMV0KKyAgICAgICAgbGRyIHIzLCBbcjE0LCAjOF0gICAgICAgIEAgUjM9Uk9XcjMyWzJdCisgICAgICAgIGxkciByNCwgW3IxNCwgIzEyXSAgICAgICBAIFI0PVJPV3IzMlszXQorICAgICAgICBAQCBjaGVjayBpZiB0aGUgd29yZHMgYXJlIG51bGwsIGlmIGFsbCBvZiB0aGVtIGFyZSBudWxsLCB0aGVuIHByb2NlZWQgd2l0aCBuZXh0IHJvdyAoYnJhbmNoIF9fZW5kX3Jvd19sb29wKSwKKyAgICAgICAgQEAgaWYgUk9XcjE2WzBdIGlzIHRoZSBvbmx5IG9uZSBub3QgbnVsbCwgdGhlbiBwcm9jZWVkIHdpdGggdGhpcyBzcGVjaWFsIGNhc2UgKGJyYW5jaCBfX2FsbW9zdF9lbXB0eV9yb3cpCisgICAgICAgIEBAIGVsc2UgZm9sbG93IHRoZSBjb21wbGV0ZSBhbGdvcml0aG0uCisgICAgICAgIEBAIGF0IHRoaXMgcG9pbnQsIFIwPWJsb2NrLCBSMTQ9JmJsb2NrW25dLCBSMTI9X19jb25zdF9wdHJfLCBSMT1ST1dyMzJbMF0sIFIyPVJPV3IzMlsxXSwKKyAgICAgICAgQEAgICAgICAgICAgICAgICAgUjM9Uk9XcjMyWzJdLCBSND1ST1dyMzJbM10sIFI1LVIxMSBmcmVlCisgICAgICAgIG9yciByNSwgcjQsIHIzICAgICAgICAgICBAIFI1PVI0IHwgUjMKKyAgICAgICAgb3JyIHI1LCByNSwgcjIgICAgICAgICAgIEAgUjU9UjQgfCBSMyB8IFIyCisgICAgICAgIG9ycnMgcjYsIHI1LCByMSAgICAgICAgICBAIFRlc3QgUjUgfCBSMSAodGhlIGFpbSBpcyB0byBjaGVjayBpZiBldmVyeXRoaW5nIGlzIG51bGwpCisgICAgICAgIGJlcSBfX2VuZF9yb3dfbG9vcAorICAgICAgICBtb3YgcjcsIHIxLCBhc3IgIzE2ICAgICAgQCBSNz1SMT4+MTY9Uk9XcjE2WzFdIChldmFsdWF0ZSBpdCBub3csIGFzIGl0IGNvdWxkIGJlIHVzZWZ1bCBsYXRlcikKKyAgICAgICAgbGRyc2ggcjYsIFtyMTQsICMwXSAgICAgIEAgUjY9Uk9XcjE2WzBdCisgICAgICAgIG9ycnMgcjUsIHI1LCByNyAgICAgICAgICBAIFI1PVI0IHwgUjMgfCBSMiB8IFI3CisgICAgICAgIGJlcSBfX2FsbW9zdF9lbXB0eV9yb3cKKworQEAgX19iX2V2YWx1YXRpb246CisgICAgICAgIEBAIGF0IHRoaXMgcG9pbnQsIFIwPWJsb2NrICh0ZW1wKSwgIFIxKGZyZWUpLCBSMj1ST1dyMzJbMV0sIFIzPVJPV3IzMlsyXSwgUjQ9Uk9XcjMyWzNdLAorICAgICAgICBAQCAgICAgUjU9KHRlbXApLCBSNj1ST1dyMTZbMF0sIFI3PVJPV3IxNlsxXSwgUjgtUjExIGZyZWUsCisgICAgICAgIEBAICAgICBSMTI9X19jb25zdF9wdHJfLCBSMTQ9JmJsb2NrW25dCisgICAgICAgIEBAIHRvIHNhdmUgc29tZSByZWdpc3RlcnMvY2FsbHMsIHByb2NlZWQgd2l0aCBiMC1iMyBmaXJzdCwgZm9sbG93ZWQgYnkgYTAtYTMKKworICAgICAgICBAQCBNVUwxNihiMCwgVzEsIHJvd1sxXSk7CisgICAgICAgIEBAIE1VTDE2KGIxLCBXMywgcm93WzFdKTsKKyAgICAgICAgQEAgTVVMMTYoYjIsIFc1LCByb3dbMV0pOworICAgICAgICBAQCBNVUwxNihiMywgVzcsIHJvd1sxXSk7CisgICAgICAgIEBAIE1BQzE2KGIwLCBXMywgcm93WzNdKTsKKyAgICAgICAgQEAgTUFDMTYoYjEsIC1XNywgcm93WzNdKTsKKyAgICAgICAgQEAgTUFDMTYoYjIsIC1XMSwgcm93WzNdKTsKKyAgICAgICAgQEAgTUFDMTYoYjMsIC1XNSwgcm93WzNdKTsKKyAgICAgICAgbGRyIHI4LCA9VzEgICAgICAgICAgICAgIEAgUjg9VzEKKyAgICAgICAgbW92IHIyLCByMiwgYXNyICMxNiAgICAgIEAgUjI9Uk9XcjE2WzNdCisgICAgICAgIG11bCByMCwgcjgsIHI3ICAgICAgICAgICBAIFIwPVcxKlJPV3IxNlsxXT1iMCAoUk9XcjE2WzFdIG11c3QgYmUgdGhlIHNlY29uZCBhcmcsIHRvIGhhdmUgdGhlIHBvc3NpYmlsaXR5IHRvIHNhdmUgMSBjeWNsZSkKKyAgICAgICAgbGRyIHI5LCA9VzMgICAgICAgICAgICAgIEAgUjk9VzMKKyAgICAgICAgbGRyIHIxMCwgPVc1ICAgICAgICAgICAgIEAgUjEwPVc1CisgICAgICAgIG11bCByMSwgcjksIHI3ICAgICAgICAgICBAIFIxPVczKlJPV3IxNlsxXT1iMSAoUk9XcjE2WzFdIG11c3QgYmUgdGhlIHNlY29uZCBhcmcsIHRvIGhhdmUgdGhlIHBvc3NpYmlsaXR5IHRvIHNhdmUgMSBjeWNsZSkKKyAgICAgICAgbGRyIHIxMSwgPVc3ICAgICAgICAgICAgIEAgUjExPVc3CisgICAgICAgIG11bCByNSwgcjEwLCByNyAgICAgICAgICBAIFI1PVc1KlJPV3IxNlsxXT1iMiAoUk9XcjE2WzFdIG11c3QgYmUgdGhlIHNlY29uZCBhcmcsIHRvIGhhdmUgdGhlIHBvc3NpYmlsaXR5IHRvIHNhdmUgMSBjeWNsZSkKKyAgICAgICAgbXVsIHI3LCByMTEsIHI3ICAgICAgICAgIEAgUjc9VzcqUk9XcjE2WzFdPWIzIChST1dyMTZbMV0gbXVzdCBiZSB0aGUgc2Vjb25kIGFyZywgdG8gaGF2ZSB0aGUgcG9zc2liaWxpdHkgdG8gc2F2ZSAxIGN5Y2xlKQorICAgICAgICB0ZXEgcjIsICMwICAgICAgICAgICAgICAgQCBpZiBudWxsIGF2b2lkIG11bHMKKyAgICAgICAgaXR0dHQgbmUKKyAgICAgICAgbWxhbmUgcjAsIHI5LCByMiwgcjAgICAgIEAgUjArPVczKlJPV3IxNlszXT1iMCAoUk9XcjE2WzNdIG11c3QgYmUgdGhlIHNlY29uZCBhcmcsIHRvIGhhdmUgdGhlIHBvc3NpYmlsaXR5IHRvIHNhdmUgMSBjeWNsZSkKKyAgICAgICAgcnNibmUgcjIsIHIyLCAjMCAgICAgICAgIEAgUjI9LVJPV3IxNlszXQorICAgICAgICBtbGFuZSByMSwgcjExLCByMiwgcjEgICAgQCBSMS09VzcqUk9XcjE2WzNdPWIxIChST1dyMTZbM10gbXVzdCBiZSB0aGUgc2Vjb25kIGFyZywgdG8gaGF2ZSB0aGUgcG9zc2liaWxpdHkgdG8gc2F2ZSAxIGN5Y2xlKQorICAgICAgICBtbGFuZSByNSwgcjgsIHIyLCByNSAgICAgQCBSNS09VzEqUk9XcjE2WzNdPWIyIChST1dyMTZbM10gbXVzdCBiZSB0aGUgc2Vjb25kIGFyZywgdG8gaGF2ZSB0aGUgcG9zc2liaWxpdHkgdG8gc2F2ZSAxIGN5Y2xlKQorICAgICAgICBpdCAgICBuZQorICAgICAgICBtbGFuZSByNywgcjEwLCByMiwgcjcgICAgQCBSNy09VzUqUk9XcjE2WzNdPWIzIChST1dyMTZbM10gbXVzdCBiZSB0aGUgc2Vjb25kIGFyZywgdG8gaGF2ZSB0aGUgcG9zc2liaWxpdHkgdG8gc2F2ZSAxIGN5Y2xlKQorCisgICAgICAgIEBAIGF0IHRoaXMgcG9pbnQsIFIwPWIwLCAgUjE9YjEsIFIyIChmcmVlKSwgUjM9Uk9XcjMyWzJdLCBSND1ST1dyMzJbM10sCisgICAgICAgIEBAICAgICBSNT1iMiwgUjY9Uk9XcjE2WzBdLCBSNz1iMywgUjg9VzEsIFI5PVczLCBSMTA9VzUsIFIxMT1XNywKKyAgICAgICAgQEAgICAgIFIxMj1fX2NvbnN0X3B0cl8sIFIxND0mYmxvY2tbbl0KKyAgICAgICAgQEAgdGVtcCA9ICgodWludDMyX3QqKXJvdylbMl0gfCAoKHVpbnQzMl90Kilyb3cpWzNdOworICAgICAgICBAQCBpZiAodGVtcCAhPSAwKSB7fQorICAgICAgICBvcnJzIHIyLCByMywgcjQgICAgICAgICAgQCBSMj1ST1dyMzJbMl0gfCBST1dyMzJbM10KKyAgICAgICAgYmVxIF9fZW5kX2JfZXZhbHVhdGlvbgorCisgICAgICAgIEBAIGF0IHRoaXMgcG9pbnQsIFIwPWIwLCAgUjE9YjEsIFIyIChmcmVlKSwgUjM9Uk9XcjMyWzJdLCBSND1ST1dyMzJbM10sCisgICAgICAgIEBAICAgICBSNT1iMiwgUjY9Uk9XcjE2WzBdLCBSNz1iMywgUjg9VzEsIFI5PVczLCBSMTA9VzUsIFIxMT1XNywKKyAgICAgICAgQEAgICAgIFIxMj1fX2NvbnN0X3B0cl8sIFIxND0mYmxvY2tbbl0KKyAgICAgICAgQEAgTUFDMTYoYjAsIFc1LCByb3dbNV0pOworICAgICAgICBAQCBNQUMxNihiMiwgVzcsIHJvd1s1XSk7CisgICAgICAgIEBAIE1BQzE2KGIzLCBXMywgcm93WzVdKTsKKyAgICAgICAgQEAgTUFDMTYoYjEsIC1XMSwgcm93WzVdKTsKKyAgICAgICAgQEAgTUFDMTYoYjAsIFc3LCByb3dbN10pOworICAgICAgICBAQCBNQUMxNihiMiwgVzMsIHJvd1s3XSk7CisgICAgICAgIEBAIE1BQzE2KGIzLCAtVzEsIHJvd1s3XSk7CisgICAgICAgIEBAIE1BQzE2KGIxLCAtVzUsIHJvd1s3XSk7CisgICAgICAgIG1vdiByMywgcjMsIGFzciAjMTYgICAgICBAIFIzPVJPV3IxNls1XQorICAgICAgICB0ZXEgcjMsICMwICAgICAgICAgICAgICAgQCBpZiBudWxsIGF2b2lkIG11bHMKKyAgICAgICAgaXQgICAgbmUKKyAgICAgICAgbWxhbmUgcjAsIHIxMCwgcjMsIHIwICAgIEAgUjArPVc1KlJPV3IxNls1XT1iMAorICAgICAgICBtb3YgcjQsIHI0LCBhc3IgIzE2ICAgICAgQCBSND1ST1dyMTZbN10KKyAgICAgICAgaXR0dHQgbmUKKyAgICAgICAgbWxhbmUgcjUsIHIxMSwgcjMsIHI1ICAgIEAgUjUrPVc3KlJPV3IxNls1XT1iMgorICAgICAgICBtbGFuZSByNywgcjksIHIzLCByNyAgICAgQCBSNys9VzMqUk9XcjE2WzVdPWIzCisgICAgICAgIHJzYm5lIHIzLCByMywgIzAgICAgICAgICBAIFIzPS1ST1dyMTZbNV0KKyAgICAgICAgbWxhbmUgcjEsIHI4LCByMywgcjEgICAgIEAgUjctPVcxKlJPV3IxNls1XT1iMQorICAgICAgICBAQCBSMyBpcyBmcmVlIG5vdworICAgICAgICB0ZXEgcjQsICMwICAgICAgICAgICAgICAgQCBpZiBudWxsIGF2b2lkIG11bHMKKyAgICAgICAgaXR0dHQgbmUKKyAgICAgICAgbWxhbmUgcjAsIHIxMSwgcjQsIHIwICAgIEAgUjArPVc3KlJPV3IxNls3XT1iMAorICAgICAgICBtbGFuZSByNSwgcjksIHI0LCByNSAgICAgQCBSNSs9VzMqUk9XcjE2WzddPWIyCisgICAgICAgIHJzYm5lIHI0LCByNCwgIzAgICAgICAgICBAIFI0PS1ST1dyMTZbN10KKyAgICAgICAgbWxhbmUgcjcsIHI4LCByNCwgcjcgICAgIEAgUjctPVcxKlJPV3IxNls3XT1iMworICAgICAgICBpdCAgICBuZQorICAgICAgICBtbGFuZSByMSwgcjEwLCByNCwgcjEgICAgQCBSMS09VzUqUk9XcjE2WzddPWIxCisgICAgICAgIEBAIFI0IGlzIGZyZWUgbm93CitfX2VuZF9iX2V2YWx1YXRpb246CisgICAgICAgIEBAIGF0IHRoaXMgcG9pbnQsIFIwPWIwLCAgUjE9YjEsIFIyPVJPV3IzMlsyXSB8IFJPV3IzMlszXSAodG1wKSwgUjMgKGZyZWUpLCBSNCAoZnJlZSksCisgICAgICAgIEBAICAgICBSNT1iMiwgUjY9Uk9XcjE2WzBdLCBSNz1iMywgUjggKGZyZWUpLCBSOSAoZnJlZSksIFIxMCAoZnJlZSksIFIxMSAoZnJlZSksCisgICAgICAgIEBAICAgICBSMTI9X19jb25zdF9wdHJfLCBSMTQ9JmJsb2NrW25dCisKK0BAIF9fYV9ldmFsdWF0aW9uOgorICAgICAgICBAQCBhMCA9IChXNCAqIHJvd1swXSkgKyAoMSA8PCAoUk9XX1NISUZUIC0gMSkpOworICAgICAgICBAQCBhMSA9IGEwICsgVzYgKiByb3dbMl07CisgICAgICAgIEBAIGEyID0gYTAgLSBXNiAqIHJvd1syXTsKKyAgICAgICAgQEAgYTMgPSBhMCAtIFcyICogcm93WzJdOworICAgICAgICBAQCBhMCA9IGEwICsgVzIgKiByb3dbMl07CisgICAgICAgIGxkciByOSwgPVc0ICAgICAgICAgICAgICBAIFI5PVc0CisgICAgICAgIG11bCByNiwgcjksIHI2ICAgICAgICAgICBAIFI2PVc0KlJPV3IxNlswXQorICAgICAgICBsZHIgcjEwLCA9VzYgICAgICAgICAgICAgQCBSMTA9VzYKKyAgICAgICAgbGRyc2ggcjQsIFtyMTQsICM0XSAgICAgIEAgUjQ9Uk9XcjE2WzJdIChhMyBub3QgZGVmaW5lZCB5ZXQpCisgICAgICAgIGFkZCByNiwgcjYsICNST1dfU0hJRlRFRF8xIEAgUjY9VzQqUk9XcjE2WzBdICsgMTw8KFJPV19TSElGVC0xKSAoYTApCisKKyAgICAgICAgbXVsIHIxMSwgcjEwLCByNCAgICAgICAgIEAgUjExPVc2KlJPV3IxNlsyXQorICAgICAgICBsZHIgcjgsID1XMiAgICAgICAgICAgICAgQCBSOD1XMgorICAgICAgICBzdWIgcjMsIHI2LCByMTEgICAgICAgICAgQCBSMz1hMC1XNipST1dyMTZbMl0gKGEyKQorICAgICAgICBAQCB0ZW1wID0gKCh1aW50MzJfdCopcm93KVsyXSB8ICgodWludDMyX3QqKXJvdylbM107CisgICAgICAgIEBAIGlmICh0ZW1wICE9IDApIHt9CisgICAgICAgIHRlcSByMiwgIzAKKyAgICAgICAgYmVxIF9fZW5kX2JlZl9hX2V2YWx1YXRpb24KKworICAgICAgICBhZGQgcjIsIHI2LCByMTEgICAgICAgICAgQCBSMj1hMCtXNipST1dyMTZbMl0gKGExKQorICAgICAgICBtdWwgcjExLCByOCwgcjQgICAgICAgICAgQCBSMTE9VzIqUk9XcjE2WzJdCisgICAgICAgIHN1YiByNCwgcjYsIHIxMSAgICAgICAgICBAIFI0PWEwLVcyKlJPV3IxNlsyXSAoYTMpCisgICAgICAgIGFkZCByNiwgcjYsIHIxMSAgICAgICAgICBAIFI2PWEwK1cyKlJPV3IxNlsyXSAoYTApCisKKworICAgICAgICBAQCBhdCB0aGlzIHBvaW50LCBSMD1iMCwgIFIxPWIxLCBSMj1hMSwgUjM9YTIsIFI0PWEzLAorICAgICAgICBAQCAgICAgUjU9YjIsIFI2PWEwLCBSNz1iMywgUjg9VzIsIFI5PVc0LCBSMTA9VzYsIFIxMSAoZnJlZSksCisgICAgICAgIEBAICAgICBSMTI9X19jb25zdF9wdHJfLCBSMTQ9JmJsb2NrW25dCisKKworICAgICAgICBAQCBhMCArPSBXNCpyb3dbNF0KKyAgICAgICAgQEAgYTEgLT0gVzQqcm93WzRdCisgICAgICAgIEBAIGEyIC09IFc0KnJvd1s0XQorICAgICAgICBAQCBhMyArPSBXNCpyb3dbNF0KKyAgICAgICAgbGRyc2ggcjExLCBbcjE0LCAjOF0gICAgIEAgUjExPVJPV3IxNls0XQorICAgICAgICB0ZXEgcjExLCAjMCAgICAgICAgICAgICAgQCBpZiBudWxsIGF2b2lkIG11bHMKKyAgICAgICAgaXQgICAgbmUKKyAgICAgICAgbXVsbmUgcjExLCByOSwgcjExICAgICAgIEAgUjExPVc0KlJPV3IxNls0XQorICAgICAgICBAQCBSOSBpcyBmcmVlIG5vdworICAgICAgICBsZHJzaCByOSwgW3IxNCwgIzEyXSAgICAgQCBSOT1ST1dyMTZbNl0KKyAgICAgICAgaXR0dHQgbmUKKyAgICAgICAgYWRkbmUgcjYsIHI2LCByMTEgICAgICAgIEAgUjYrPVc0KlJPV3IxNls0XSAoYTApCisgICAgICAgIHN1Ym5lIHIyLCByMiwgcjExICAgICAgICBAIFIyLT1XNCpST1dyMTZbNF0gKGExKQorICAgICAgICBzdWJuZSByMywgcjMsIHIxMSAgICAgICAgQCBSMy09VzQqUk9XcjE2WzRdIChhMikKKyAgICAgICAgYWRkbmUgcjQsIHI0LCByMTEgICAgICAgIEAgUjQrPVc0KlJPV3IxNls0XSAoYTMpCisgICAgICAgIEBAIFc2IGFsb25lIGlzIG5vIG1vcmUgdXNlZnVsLCBzYXZlIFcyKlJPV3IxNls2XSBpbiBpdCBpbnN0ZWFkCisgICAgICAgIHRlcSByOSwgIzAgICAgICAgICAgICAgICBAIGlmIG51bGwgYXZvaWQgbXVscworICAgICAgICBpdHR0dCBuZQorICAgICAgICBtdWxuZSByMTEsIHIxMCwgcjkgICAgICAgQCBSMTE9VzYqUk9XcjE2WzZdCisgICAgICAgIGFkZG5lIHI2LCByNiwgcjExICAgICAgICBAIFI2Kz1XNipST1dyMTZbNl0gKGEwKQorICAgICAgICBtdWxuZSByMTAsIHI4LCByOSAgICAgICAgQCBSMTA9VzIqUk9XcjE2WzZdCisgICAgICAgIEBAIGEwICs9IFc2KnJvd1s2XTsKKyAgICAgICAgQEAgYTMgLT0gVzYqcm93WzZdOworICAgICAgICBAQCBhMSAtPSBXMipyb3dbNl07CisgICAgICAgIEBAIGEyICs9IFcyKnJvd1s2XTsKKyAgICAgICAgc3VibmUgcjQsIHI0LCByMTEgICAgICAgIEAgUjQtPVc2KlJPV3IxNls2XSAoYTMpCisgICAgICAgIGl0dCAgIG5lCisgICAgICAgIHN1Ym5lIHIyLCByMiwgcjEwICAgICAgICBAIFIyLT1XMipST1dyMTZbNl0gKGExKQorICAgICAgICBhZGRuZSByMywgcjMsIHIxMCAgICAgICAgQCBSMys9VzIqUk9XcjE2WzZdIChhMikKKworX19lbmRfYV9ldmFsdWF0aW9uOgorICAgICAgICBAQCBhdCB0aGlzIHBvaW50LCBSMD1iMCwgIFIxPWIxLCBSMj1hMSwgUjM9YTIsIFI0PWEzLAorICAgICAgICBAQCAgICAgUjU9YjIsIFI2PWEwLCBSNz1iMywgUjggKGZyZWUpLCBSOSAoZnJlZSksIFIxMCAoZnJlZSksIFIxMSAoZnJlZSksCisgICAgICAgIEBAICAgICBSMTI9X19jb25zdF9wdHJfLCBSMTQ9JmJsb2NrW25dCisgICAgICAgIEBAIHJvd1swXSA9IChhMCArIGIwKSA+PiBST1dfU0hJRlQ7CisgICAgICAgIEBAIHJvd1sxXSA9IChhMSArIGIxKSA+PiBST1dfU0hJRlQ7CisgICAgICAgIEBAIHJvd1syXSA9IChhMiArIGIyKSA+PiBST1dfU0hJRlQ7CisgICAgICAgIEBAIHJvd1szXSA9IChhMyArIGIzKSA+PiBST1dfU0hJRlQ7CisgICAgICAgIEBAIHJvd1s0XSA9IChhMyAtIGIzKSA+PiBST1dfU0hJRlQ7CisgICAgICAgIEBAIHJvd1s1XSA9IChhMiAtIGIyKSA+PiBST1dfU0hJRlQ7CisgICAgICAgIEBAIHJvd1s2XSA9IChhMSAtIGIxKSA+PiBST1dfU0hJRlQ7CisgICAgICAgIEBAIHJvd1s3XSA9IChhMCAtIGIwKSA+PiBST1dfU0hJRlQ7CisgICAgICAgIGFkZCByOCwgcjYsIHIwICAgICAgICAgICBAIFI4PWEwK2IwCisgICAgICAgIGFkZCByOSwgcjIsIHIxICAgICAgICAgICBAIFI5PWExK2IxCisgICAgICAgIEBAIHB1dCAyIDE2IGJpdHMgaGFsZi13b3JkcyBpbiBhIDMyYml0cyB3b3JkCisgICAgICAgIEBAIFJPV3IzMlswXT1ST1dyMTZbMF0gfCAoUk9XcjE2WzFdPDwxNikgKG9ubHkgTGl0dGxlIEVuZGlhbiBjb21wbGlhbnQgdGhlbiEhISkKKyAgICAgICAgbGRyIHIxMCwgPU1BU0tfTVNIVyAgICAgIEAgUjEwPTB4RkZGRjAwMDAKKyAgICAgICAgYW5kIHI5LCByMTAsIHI5LCBsc2wgI1JPV19TSElGVDJNU0hXIEAgUjk9MHhGRkZGMDAwMCAmICgoYTErYjEpPDw1KQorICAgICAgICBtdm4gcjExLCByMTAgICAgICAgICAgICAgQCBSMTE9IE5PVCBSMTA9IDB4MDAwMEZGRkYKKyAgICAgICAgYW5kIHI4LCByMTEsIHI4LCBhc3IgI1JPV19TSElGVCBAIFI4PTB4MDAwMEZGRkYgJiAoKGEwK2IwKT4+MTEpCisgICAgICAgIG9yciByOCwgcjgsIHI5CisgICAgICAgIHN0ciByOCwgW3IxNCwgIzBdCisKKyAgICAgICAgYWRkIHI4LCByMywgcjUgICAgICAgICAgIEAgUjg9YTIrYjIKKyAgICAgICAgYWRkIHI5LCByNCwgcjcgICAgICAgICAgIEAgUjk9YTMrYjMKKyAgICAgICAgYW5kIHI5LCByMTAsIHI5LCBsc2wgI1JPV19TSElGVDJNU0hXIEAgUjk9MHhGRkZGMDAwMCAmICgoYTMrYjMpPDw1KQorICAgICAgICBhbmQgcjgsIHIxMSwgcjgsIGFzciAjUk9XX1NISUZUIEAgUjg9MHgwMDAwRkZGRiAmICgoYTIrYjIpPj4xMSkKKyAgICAgICAgb3JyIHI4LCByOCwgcjkKKyAgICAgICAgc3RyIHI4LCBbcjE0LCAjNF0KKworICAgICAgICBzdWIgcjgsIHI0LCByNyAgICAgICAgICAgQCBSOD1hMy1iMworICAgICAgICBzdWIgcjksIHIzLCByNSAgICAgICAgICAgQCBSOT1hMi1iMgorICAgICAgICBhbmQgcjksIHIxMCwgcjksIGxzbCAjUk9XX1NISUZUMk1TSFcgQCBSOT0weEZGRkYwMDAwICYgKChhMi1iMik8PDUpCisgICAgICAgIGFuZCByOCwgcjExLCByOCwgYXNyICNST1dfU0hJRlQgQCBSOD0weDAwMDBGRkZGICYgKChhMy1iMyk+PjExKQorICAgICAgICBvcnIgcjgsIHI4LCByOQorICAgICAgICBzdHIgcjgsIFtyMTQsICM4XQorCisgICAgICAgIHN1YiByOCwgcjIsIHIxICAgICAgICAgICBAIFI4PWExLWIxCisgICAgICAgIHN1YiByOSwgcjYsIHIwICAgICAgICAgICBAIFI5PWEwLWIwCisgICAgICAgIGFuZCByOSwgcjEwLCByOSwgbHNsICNST1dfU0hJRlQyTVNIVyBAIFI5PTB4RkZGRjAwMDAgJiAoKGEwLWIwKTw8NSkKKyAgICAgICAgYW5kIHI4LCByMTEsIHI4LCBhc3IgI1JPV19TSElGVCBAIFI4PTB4MDAwMEZGRkYgJiAoKGExLWIxKT4+MTEpCisgICAgICAgIG9yciByOCwgcjgsIHI5CisgICAgICAgIHN0ciByOCwgW3IxNCwgIzEyXQorCisgICAgICAgIGJhbCBfX2VuZF9yb3dfbG9vcAorCitfX2FsbW9zdF9lbXB0eV9yb3c6CisgICAgICAgIEBAIHRoZSByb3cgd2FzIGVtcHR5LCBleGNlcHQgUk9XcjE2WzBdLCBub3csIG1hbmFnZW1lbnQgb2YgdGhpcyBzcGVjaWFsIGNhc2UKKyAgICAgICAgQEAgYXQgdGhpcyBwb2ludCwgUjA9YmxvY2ssIFIxND0mYmxvY2tbbl0sIFIxMj1fX2NvbnN0X3B0cl8sIFIxPVJPV3IzMlswXSwgUjI9Uk9XcjMyWzFdLAorICAgICAgICBAQCAgICAgICAgICAgICAgICBSMz1ST1dyMzJbMl0sIFI0PVJPV3IzMlszXSwgUjU9KHRlbXApLCBSNj1ST1dyMTZbMF0sIFI3PVJPV3IxNlsxXSwKKyAgICAgICAgQEAgICAgICAgICAgICAgICAgUjg9MHhGRkZGICh0ZW1wKSwgUjktUjExIGZyZWUKKyAgICAgICAgbW92IHI4LCAjMHgxMDAwMCAgICAgICAgIEAgUjg9MHhGRkZGICgyIHN0ZXBzIG5lZWRlZCEpIGl0IHNhdmVzIGEgbGRyIGNhbGwgKGJlY2F1c2Ugb2YgZGVsYXkgcnVuKS4KKyAgICAgICAgc3ViIHI4LCByOCwgIzEgICAgICAgICAgIEAgUjggaXMgbm93IHJlYWR5LgorICAgICAgICBhbmQgcjUsIHI4LCByNiwgbHNsICMzICAgQCBSNT1SOCAmIChSNjw8Myk9IChST1dyMTZbMF08PDMpICYgMHhGRkZGCisgICAgICAgIG9yciByNSwgcjUsIHI1LCBsc2wgIzE2ICBAIFI1PVI1IHwgKFI1PDwxNikKKyAgICAgICAgc3RyIHI1LCBbcjE0LCAjMF0gICAgICAgIEAgUjE0WzBdPVJPV3IzMlswXT1SNQorICAgICAgICBzdHIgcjUsIFtyMTQsICM0XSAgICAgICAgQCBSMTRbNF09Uk9XcjMyWzFdPVI1CisgICAgICAgIHN0ciByNSwgW3IxNCwgIzhdICAgICAgICBAIFIxNFs4XT1ST1dyMzJbMl09UjUKKyAgICAgICAgc3RyIHI1LCBbcjE0LCAjMTJdICAgICAgIEAgUjE0WzEyXT1ST1dyMzJbM109UjUKKworX19lbmRfcm93X2xvb3A6CisgICAgICAgIEBAIGF0IHRoaXMgcG9pbnQsIFIwLVIxMSAoZnJlZSkKKyAgICAgICAgQEAgICAgIFIxMj1fX2NvbnN0X3B0cl8sIFIxND0mYmxvY2tbbl0KKyAgICAgICAgbGRyIHIwLCBbc3AsICMwXSAgICAgICAgIEAgUjA9YmxvY2sKKyAgICAgICAgdGVxIHIwLCByMTQgICAgICAgICAgICAgIEAgY29tcGFyZSBjdXJyZW50ICZibG9ja1s4Km5dIHRvIGJsb2NrLCB3aGVuIGJsb2NrIGlzIHJlYWNoZWQsIHRoZSBsb29wIGlzIGZpbmlzaGVkLgorICAgICAgICBzdWIgcjE0LCByMTQsICMxNgorICAgICAgICBibmUgX19yb3dfbG9vcAorCisKKworICAgICAgICBAQCBhdCB0aGlzIHBvaW50LCBSMD1ibG9jaywgUjEtUjExIChmcmVlKQorICAgICAgICBAQCAgICAgUjEyPV9fY29uc3RfcHRyXywgUjE0PSZibG9ja1tuXQorICAgICAgICBhZGQgcjE0LCByMCwgIzE0ICAgICAgICBAIFIxND0mYmxvY2tbN10sIGJldHRlciBzdGFydCBmcm9tIHRoZSBsYXN0IGNvbCwgYW5kIGRlY3JlYXNlIHRoZSB2YWx1ZSB1bnRpbCBjb2w9MCwgaS5lLiBSMTQ9YmxvY2suCitfX2NvbF9sb29wOgorCitAQCBfX2JfZXZhbHVhdGlvbjI6CisgICAgICAgIEBAIGF0IHRoaXMgcG9pbnQsIFIwPWJsb2NrICh0ZW1wKSwgIFIxLVIxMSAoZnJlZSkKKyAgICAgICAgQEAgICAgIFIxMj1fX2NvbnN0X3B0cl8sIFIxND0mYmxvY2tbbl0KKyAgICAgICAgQEAgcHJvY2VlZCB3aXRoIGIwLWIzIGZpcnN0LCBmb2xsb3dlZCBieSBhMC1hMworICAgICAgICBAQCBNVUwxNihiMCwgVzEsIGNvbFs4eDFdKTsKKyAgICAgICAgQEAgTVVMMTYoYjEsIFczLCBjb2xbOHgxXSk7CisgICAgICAgIEBAIE1VTDE2KGIyLCBXNSwgY29sWzh4MV0pOworICAgICAgICBAQCBNVUwxNihiMywgVzcsIGNvbFs4eDFdKTsKKyAgICAgICAgQEAgTUFDMTYoYjAsIFczLCBjb2xbOHgzXSk7CisgICAgICAgIEBAIE1BQzE2KGIxLCAtVzcsIGNvbFs4eDNdKTsKKyAgICAgICAgQEAgTUFDMTYoYjIsIC1XMSwgY29sWzh4M10pOworICAgICAgICBAQCBNQUMxNihiMywgLVc1LCBjb2xbOHgzXSk7CisgICAgICAgIGxkciByOCwgPVcxICAgICAgICAgICAgICBAIFI4PVcxCisgICAgICAgIGxkcnNoIHI3LCBbcjE0LCAjMTZdCisgICAgICAgIG11bCByMCwgcjgsIHI3ICAgICAgICAgICBAIFIwPVcxKlJPV3IxNlsxXT1iMCAoUk9XcjE2WzFdIG11c3QgYmUgdGhlIHNlY29uZCBhcmcsIHRvIGhhdmUgdGhlIHBvc3NpYmlsaXR5IHRvIHNhdmUgMSBjeWNsZSkKKyAgICAgICAgbGRyIHI5LCA9VzMgICAgICAgICAgICAgIEAgUjk9VzMKKyAgICAgICAgbGRyIHIxMCwgPVc1ICAgICAgICAgICAgIEAgUjEwPVc1CisgICAgICAgIG11bCByMSwgcjksIHI3ICAgICAgICAgICBAIFIxPVczKlJPV3IxNlsxXT1iMSAoUk9XcjE2WzFdIG11c3QgYmUgdGhlIHNlY29uZCBhcmcsIHRvIGhhdmUgdGhlIHBvc3NpYmlsaXR5IHRvIHNhdmUgMSBjeWNsZSkKKyAgICAgICAgbGRyIHIxMSwgPVc3ICAgICAgICAgICAgIEAgUjExPVc3CisgICAgICAgIG11bCByNSwgcjEwLCByNyAgICAgICAgICBAIFI1PVc1KlJPV3IxNlsxXT1iMiAoUk9XcjE2WzFdIG11c3QgYmUgdGhlIHNlY29uZCBhcmcsIHRvIGhhdmUgdGhlIHBvc3NpYmlsaXR5IHRvIHNhdmUgMSBjeWNsZSkKKyAgICAgICAgbGRyc2ggcjIsIFtyMTQsICM0OF0KKyAgICAgICAgbXVsIHI3LCByMTEsIHI3ICAgICAgICAgIEAgUjc9VzcqUk9XcjE2WzFdPWIzIChST1dyMTZbMV0gbXVzdCBiZSB0aGUgc2Vjb25kIGFyZywgdG8gaGF2ZSB0aGUgcG9zc2liaWxpdHkgdG8gc2F2ZSAxIGN5Y2xlKQorICAgICAgICB0ZXEgcjIsICMwICAgICAgICAgICAgICAgQCBpZiAwLCB0aGVuIGF2b2lkIG11bHMKKyAgICAgICAgaXR0dHQgbmUKKyAgICAgICAgbWxhbmUgcjAsIHI5LCByMiwgcjAgICAgIEAgUjArPVczKlJPV3IxNlszXT1iMCAoUk9XcjE2WzNdIG11c3QgYmUgdGhlIHNlY29uZCBhcmcsIHRvIGhhdmUgdGhlIHBvc3NpYmlsaXR5IHRvIHNhdmUgMSBjeWNsZSkKKyAgICAgICAgcnNibmUgcjIsIHIyLCAjMCAgICAgICAgIEAgUjI9LVJPV3IxNlszXQorICAgICAgICBtbGFuZSByMSwgcjExLCByMiwgcjEgICAgQCBSMS09VzcqUk9XcjE2WzNdPWIxIChST1dyMTZbM10gbXVzdCBiZSB0aGUgc2Vjb25kIGFyZywgdG8gaGF2ZSB0aGUgcG9zc2liaWxpdHkgdG8gc2F2ZSAxIGN5Y2xlKQorICAgICAgICBtbGFuZSByNSwgcjgsIHIyLCByNSAgICAgQCBSNS09VzEqUk9XcjE2WzNdPWIyIChST1dyMTZbM10gbXVzdCBiZSB0aGUgc2Vjb25kIGFyZywgdG8gaGF2ZSB0aGUgcG9zc2liaWxpdHkgdG8gc2F2ZSAxIGN5Y2xlKQorICAgICAgICBpdCAgICBuZQorICAgICAgICBtbGFuZSByNywgcjEwLCByMiwgcjcgICAgQCBSNy09VzUqUk9XcjE2WzNdPWIzIChST1dyMTZbM10gbXVzdCBiZSB0aGUgc2Vjb25kIGFyZywgdG8gaGF2ZSB0aGUgcG9zc2liaWxpdHkgdG8gc2F2ZSAxIGN5Y2xlKQorCisgICAgICAgIEBAIGF0IHRoaXMgcG9pbnQsIFIwPWIwLCAgUjE9YjEsIFIyIChmcmVlKSwgUjMgKGZyZWUpLCBSNCAoZnJlZSksCisgICAgICAgIEBAICAgICBSNT1iMiwgUjYgKGZyZWUpLCBSNz1iMywgUjg9VzEsIFI5PVczLCBSMTA9VzUsIFIxMT1XNywKKyAgICAgICAgQEAgICAgIFIxMj1fX2NvbnN0X3B0cl8sIFIxND0mYmxvY2tbbl0KKyAgICAgICAgQEAgTUFDMTYoYjAsIFc1LCBjb2xbNXg4XSk7CisgICAgICAgIEBAIE1BQzE2KGIyLCBXNywgY29sWzV4OF0pOworICAgICAgICBAQCBNQUMxNihiMywgVzMsIGNvbFs1eDhdKTsKKyAgICAgICAgQEAgTUFDMTYoYjEsIC1XMSwgY29sWzV4OF0pOworICAgICAgICBAQCBNQUMxNihiMCwgVzcsIGNvbFs3eDhdKTsKKyAgICAgICAgQEAgTUFDMTYoYjIsIFczLCBjb2xbN3g4XSk7CisgICAgICAgIEBAIE1BQzE2KGIzLCAtVzEsIGNvbFs3eDhdKTsKKyAgICAgICAgQEAgTUFDMTYoYjEsIC1XNSwgY29sWzd4OF0pOworICAgICAgICBsZHJzaCByMywgW3IxNCwgIzgwXSAgICAgQCBSMz1DT0xyMTZbNXg4XQorICAgICAgICB0ZXEgcjMsICMwICAgICAgICAgICAgICAgQCBpZiAwIHRoZW4gYXZvaWQgbXVscworICAgICAgICBpdHR0dCBuZQorICAgICAgICBtbGFuZSByMCwgcjEwLCByMywgcjAgICAgQCBSMCs9VzUqUk9XcjE2WzV4OF09YjAKKyAgICAgICAgbWxhbmUgcjUsIHIxMSwgcjMsIHI1ICAgIEAgUjUrPVc3KlJPV3IxNls1eDhdPWIyCisgICAgICAgIG1sYW5lIHI3LCByOSwgcjMsIHI3ICAgICBAIFI3Kz1XMypST1dyMTZbNXg4XT1iMworICAgICAgICByc2JuZSByMywgcjMsICMwICAgICAgICAgQCBSMz0tUk9XcjE2WzV4OF0KKyAgICAgICAgbGRyc2ggcjQsIFtyMTQsICMxMTJdICAgIEAgUjQ9Q09McjE2Wzd4OF0KKyAgICAgICAgaXQgICAgbmUKKyAgICAgICAgbWxhbmUgcjEsIHI4LCByMywgcjEgICAgIEAgUjctPVcxKlJPV3IxNls1eDhdPWIxCisgICAgICAgIEBAIFIzIGlzIGZyZWUgbm93CisgICAgICAgIHRlcSByNCwgIzAgICAgICAgICAgICAgICBAIGlmIDAgdGhlbiBhdm9pZCBtdWxzCisgICAgICAgIGl0dHR0IG5lCisgICAgICAgIG1sYW5lIHIwLCByMTEsIHI0LCByMCAgICBAIFIwKz1XNypST1dyMTZbN3g4XT1iMAorICAgICAgICBtbGFuZSByNSwgcjksIHI0LCByNSAgICAgQCBSNSs9VzMqUk9XcjE2Wzd4OF09YjIKKyAgICAgICAgcnNibmUgcjQsIHI0LCAjMCAgICAgICAgIEAgUjQ9LVJPV3IxNls3eDhdCisgICAgICAgIG1sYW5lIHI3LCByOCwgcjQsIHI3ICAgICBAIFI3LT1XMSpST1dyMTZbN3g4XT1iMworICAgICAgICBpdCAgICBuZQorICAgICAgICBtbGFuZSByMSwgcjEwLCByNCwgcjEgICAgQCBSMS09VzUqUk9XcjE2Wzd4OF09YjEKKyAgICAgICAgQEAgUjQgaXMgZnJlZSBub3cKK0BAIF9fZW5kX2JfZXZhbHVhdGlvbjI6CisgICAgICAgIEBAIGF0IHRoaXMgcG9pbnQsIFIwPWIwLCAgUjE9YjEsIFIyIChmcmVlKSwgUjMgKGZyZWUpLCBSNCAoZnJlZSksCisgICAgICAgIEBAICAgICBSNT1iMiwgUjYgKGZyZWUpLCBSNz1iMywgUjggKGZyZWUpLCBSOSAoZnJlZSksIFIxMCAoZnJlZSksIFIxMSAoZnJlZSksCisgICAgICAgIEBAICAgICBSMTI9X19jb25zdF9wdHJfLCBSMTQ9JmJsb2NrW25dCisKK0BAIF9fYV9ldmFsdWF0aW9uMjoKKyAgICAgICAgQEAgYTAgPSAoVzQgKiBjb2xbOHgwXSkgKyAoMSA8PCAoQ09MX1NISUZUIC0gMSkpOworICAgICAgICBAQCBhMSA9IGEwICsgVzYgKiByb3dbMl07CisgICAgICAgIEBAIGEyID0gYTAgLSBXNiAqIHJvd1syXTsKKyAgICAgICAgQEAgYTMgPSBhMCAtIFcyICogcm93WzJdOworICAgICAgICBAQCBhMCA9IGEwICsgVzIgKiByb3dbMl07CisgICAgICAgIGxkcnNoIHI2LCBbcjE0LCAjMF0KKyAgICAgICAgbGRyIHI5LCA9VzQgICAgICAgICAgICAgIEAgUjk9VzQKKyAgICAgICAgbXVsIHI2LCByOSwgcjYgICAgICAgICAgIEAgUjY9VzQqUk9XcjE2WzBdCisgICAgICAgIGxkciByMTAsID1XNiAgICAgICAgICAgICBAIFIxMD1XNgorICAgICAgICBsZHJzaCByNCwgW3IxNCwgIzMyXSAgICAgQCBSND1ST1dyMTZbMl0gKGEzIG5vdCBkZWZpbmVkIHlldCkKKyAgICAgICAgYWRkIHI2LCByNiwgI0NPTF9TSElGVEVEXzEgQCBSNj1XNCpST1dyMTZbMF0gKyAxPDwoQ09MX1NISUZULTEpIChhMCkKKyAgICAgICAgbXVsIHIxMSwgcjEwLCByNCAgICAgICAgIEAgUjExPVc2KlJPV3IxNlsyXQorICAgICAgICBsZHIgcjgsID1XMiAgICAgICAgICAgICAgQCBSOD1XMgorICAgICAgICBhZGQgcjIsIHI2LCByMTEgICAgICAgICAgQCBSMj1hMCtXNipST1dyMTZbMl0gKGExKQorICAgICAgICBzdWIgcjMsIHI2LCByMTEgICAgICAgICAgQCBSMz1hMC1XNipST1dyMTZbMl0gKGEyKQorICAgICAgICBtdWwgcjExLCByOCwgcjQgICAgICAgICAgQCBSMTE9VzIqUk9XcjE2WzJdCisgICAgICAgIHN1YiByNCwgcjYsIHIxMSAgICAgICAgICBAIFI0PWEwLVcyKlJPV3IxNlsyXSAoYTMpCisgICAgICAgIGFkZCByNiwgcjYsIHIxMSAgICAgICAgICBAIFI2PWEwK1cyKlJPV3IxNlsyXSAoYTApCisKKyAgICAgICAgQEAgYXQgdGhpcyBwb2ludCwgUjA9YjAsICBSMT1iMSwgUjI9YTEsIFIzPWEyLCBSND1hMywKKyAgICAgICAgQEAgICAgIFI1PWIyLCBSNj1hMCwgUjc9YjMsIFI4PVcyLCBSOT1XNCwgUjEwPVc2LCBSMTEgKGZyZWUpLAorICAgICAgICBAQCAgICAgUjEyPV9fY29uc3RfcHRyXywgUjE0PSZibG9ja1tuXQorICAgICAgICBAQCBhMCArPSBXNCpyb3dbNF0KKyAgICAgICAgQEAgYTEgLT0gVzQqcm93WzRdCisgICAgICAgIEBAIGEyIC09IFc0KnJvd1s0XQorICAgICAgICBAQCBhMyArPSBXNCpyb3dbNF0KKyAgICAgICAgbGRyc2ggcjExLCBbcjE0LCAjNjRdICAgIEAgUjExPVJPV3IxNls0XQorICAgICAgICB0ZXEgcjExLCAjMCAgICAgICAgICAgICAgQCBpZiBudWxsIGF2b2lkIG11bHMKKyAgICAgICAgaXR0dHQgbmUKKyAgICAgICAgbXVsbmUgcjExLCByOSwgcjExICAgICAgIEAgUjExPVc0KlJPV3IxNls0XQorICAgICAgICBAQCBSOSBpcyBmcmVlIG5vdworICAgICAgICBhZGRuZSByNiwgcjYsIHIxMSAgICAgICAgQCBSNis9VzQqUk9XcjE2WzRdIChhMCkKKyAgICAgICAgc3VibmUgcjIsIHIyLCByMTEgICAgICAgIEAgUjItPVc0KlJPV3IxNls0XSAoYTEpCisgICAgICAgIHN1Ym5lIHIzLCByMywgcjExICAgICAgICBAIFIzLT1XNCpST1dyMTZbNF0gKGEyKQorICAgICAgICBsZHJzaCByOSwgW3IxNCwgIzk2XSAgICAgQCBSOT1ST1dyMTZbNl0KKyAgICAgICAgaXQgICAgbmUKKyAgICAgICAgYWRkbmUgcjQsIHI0LCByMTEgICAgICAgIEAgUjQrPVc0KlJPV3IxNls0XSAoYTMpCisgICAgICAgIEBAIFc2IGFsb25lIGlzIG5vIG1vcmUgdXNlZnVsLCBzYXZlIFcyKlJPV3IxNls2XSBpbiBpdCBpbnN0ZWFkCisgICAgICAgIHRlcSByOSwgIzAgICAgICAgICAgICAgICBAIGlmIG51bGwgYXZvaWQgbXVscworICAgICAgICBpdHR0dCBuZQorICAgICAgICBtdWxuZSByMTEsIHIxMCwgcjkgICAgICAgQCBSMTE9VzYqUk9XcjE2WzZdCisgICAgICAgIGFkZG5lIHI2LCByNiwgcjExICAgICAgICBAIFI2Kz1XNipST1dyMTZbNl0gKGEwKQorICAgICAgICBtdWxuZSByMTAsIHI4LCByOSAgICAgICAgQCBSMTA9VzIqUk9XcjE2WzZdCisgICAgICAgIEBAIGEwICs9IFc2KnJvd1s2XTsKKyAgICAgICAgQEAgYTMgLT0gVzYqcm93WzZdOworICAgICAgICBAQCBhMSAtPSBXMipyb3dbNl07CisgICAgICAgIEBAIGEyICs9IFcyKnJvd1s2XTsKKyAgICAgICAgc3VibmUgcjQsIHI0LCByMTEgICAgICAgIEAgUjQtPVc2KlJPV3IxNls2XSAoYTMpCisgICAgICAgIGl0dCAgIG5lCisgICAgICAgIHN1Ym5lIHIyLCByMiwgcjEwICAgICAgICBAIFIyLT1XMipST1dyMTZbNl0gKGExKQorICAgICAgICBhZGRuZSByMywgcjMsIHIxMCAgICAgICAgQCBSMys9VzIqUk9XcjE2WzZdIChhMikKK0BAIF9fZW5kX2FfZXZhbHVhdGlvbjI6CisgICAgICAgIEBAIGF0IHRoaXMgcG9pbnQsIFIwPWIwLCAgUjE9YjEsIFIyPWExLCBSMz1hMiwgUjQ9YTMsCisgICAgICAgIEBAICAgICBSNT1iMiwgUjY9YTAsIFI3PWIzLCBSOCAoZnJlZSksIFI5IChmcmVlKSwgUjEwIChmcmVlKSwgUjExIChmcmVlKSwKKyAgICAgICAgQEAgICAgIFIxMj1fX2NvbnN0X3B0cl8sIFIxND0mYmxvY2tbbl0KKyAgICAgICAgQEAgY29sWzAgXSA9ICgoYTAgKyBiMCkgPj4gQ09MX1NISUZUKTsKKyAgICAgICAgQEAgY29sWzggXSA9ICgoYTEgKyBiMSkgPj4gQ09MX1NISUZUKTsKKyAgICAgICAgQEAgY29sWzE2XSA9ICgoYTIgKyBiMikgPj4gQ09MX1NISUZUKTsKKyAgICAgICAgQEAgY29sWzI0XSA9ICgoYTMgKyBiMykgPj4gQ09MX1NISUZUKTsKKyAgICAgICAgQEAgY29sWzMyXSA9ICgoYTMgLSBiMykgPj4gQ09MX1NISUZUKTsKKyAgICAgICAgQEAgY29sWzQwXSA9ICgoYTIgLSBiMikgPj4gQ09MX1NISUZUKTsKKyAgICAgICAgQEAgY29sWzQ4XSA9ICgoYTEgLSBiMSkgPj4gQ09MX1NISUZUKTsKKyAgICAgICAgQEAgY29sWzU2XSA9ICgoYTAgLSBiMCkgPj4gQ09MX1NISUZUKTsKKyAgICAgICAgQEBAQEAgbm8gb3B0aW1pemF0aW9uIGhlcmUgQEBAQEAKKyAgICAgICAgYWRkIHI4LCByNiwgcjAgICAgICAgICAgIEAgUjg9YTArYjAKKyAgICAgICAgYWRkIHI5LCByMiwgcjEgICAgICAgICAgIEAgUjk9YTErYjEKKyAgICAgICAgbW92IHI4LCByOCwgYXNyICNDT0xfU0hJRlQKKyAgICAgICAgbW92IHI5LCByOSwgYXNyICNDT0xfU0hJRlQKKyAgICAgICAgc3RyaCByOCwgW3IxNCwgIzBdCisgICAgICAgIHN0cmggcjksIFtyMTQsICMxNl0KKyAgICAgICAgYWRkIHI4LCByMywgcjUgICAgICAgICAgIEAgUjg9YTIrYjIKKyAgICAgICAgYWRkIHI5LCByNCwgcjcgICAgICAgICAgIEAgUjk9YTMrYjMKKyAgICAgICAgbW92IHI4LCByOCwgYXNyICNDT0xfU0hJRlQKKyAgICAgICAgbW92IHI5LCByOSwgYXNyICNDT0xfU0hJRlQKKyAgICAgICAgc3RyaCByOCwgW3IxNCwgIzMyXQorICAgICAgICBzdHJoIHI5LCBbcjE0LCAjNDhdCisgICAgICAgIHN1YiByOCwgcjQsIHI3ICAgICAgICAgICBAIFI4PWEzLWIzCisgICAgICAgIHN1YiByOSwgcjMsIHI1ICAgICAgICAgICBAIFI5PWEyLWIyCisgICAgICAgIG1vdiByOCwgcjgsIGFzciAjQ09MX1NISUZUCisgICAgICAgIG1vdiByOSwgcjksIGFzciAjQ09MX1NISUZUCisgICAgICAgIHN0cmggcjgsIFtyMTQsICM2NF0KKyAgICAgICAgc3RyaCByOSwgW3IxNCwgIzgwXQorICAgICAgICBzdWIgcjgsIHIyLCByMSAgICAgICAgICAgQCBSOD1hMS1iMQorICAgICAgICBzdWIgcjksIHI2LCByMCAgICAgICAgICAgQCBSOT1hMC1iMAorICAgICAgICBtb3YgcjgsIHI4LCBhc3IgI0NPTF9TSElGVAorICAgICAgICBtb3YgcjksIHI5LCBhc3IgI0NPTF9TSElGVAorICAgICAgICBzdHJoIHI4LCBbcjE0LCAjOTZdCisgICAgICAgIHN0cmggcjksIFtyMTQsICMxMTJdCisKK0BAIF9fZW5kX2NvbF9sb29wOgorICAgICAgICBAQCBhdCB0aGlzIHBvaW50LCBSMC1SMTEgKGZyZWUpCisgICAgICAgIEBAICAgICBSMTI9X19jb25zdF9wdHJfLCBSMTQ9JmJsb2NrW25dCisgICAgICAgIGxkciByMCwgW3NwLCAjMF0gICAgICAgICBAIFIwPWJsb2NrCisgICAgICAgIHRlcSByMCwgcjE0ICAgICAgICAgICAgICBAIGNvbXBhcmUgY3VycmVudCAmYmxvY2tbbl0gdG8gYmxvY2ssIHdoZW4gYmxvY2sgaXMgcmVhY2hlZCwgdGhlIGxvb3AgaXMgZmluaXNoZWQuCisgICAgICAgIHN1YiByMTQsIHIxNCwgIzIKKyAgICAgICAgYm5lIF9fY29sX2xvb3AKKworCisKKworQEAgX19lbmRfc2ltcGxlX2lkY3RfYXJtOgorICAgICAgICBAQCByZXN0b3JlIHJlZ2lzdGVycyB0byBwcmV2aW91cyBzdGF0dXMhCisgICAgICAgIGFkZCBzcCwgc3AsICM4IEBAIHRoZSBsb2NhbCB2YXJpYWJsZXMhCisgICAgICAgIGxkbWZkIHNwISwge3I0LXIxMSwgcjE1fSBAQCB1cGRhdGUgUEMgd2l0aCBMUiBjb250ZW50LgorCisKKworQEAga2luZCBvZiBzdWItZnVuY3Rpb24sIGhlcmUgbm90IHRvIG92ZXJsb2FkIHRoZSBjb21tb24gY2FzZS4KK19fZW5kX2JlZl9hX2V2YWx1YXRpb246CisgICAgICAgIGFkZCByMiwgcjYsIHIxMSAgICAgICAgICBAIFIyPWEwK1c2KlJPV3IxNlsyXSAoYTEpCisgICAgICAgIG11bCByMTEsIHI4LCByNCAgICAgICAgICBAIFIxMT1XMipST1dyMTZbMl0KKyAgICAgICAgc3ViIHI0LCByNiwgcjExICAgICAgICAgIEAgUjQ9YTAtVzIqUk9XcjE2WzJdIChhMykKKyAgICAgICAgYWRkIHI2LCByNiwgcjExICAgICAgICAgIEAgUjY9YTArVzIqUk9XcjE2WzJdIChhMCkKKyAgICAgICAgYmFsIF9fZW5kX2FfZXZhbHVhdGlvbgorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X2FybXY1dGUuUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9zaW1wbGVfaWRjdF9hcm12NXRlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmMTBiNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9zaW1wbGVfaWRjdF9hcm12NXRlLlMKQEAgLTAsMCArMSw2MjAgQEAKKy8qCisgKiBTaW1wbGUgSURDVAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDA2IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworI2RlZmluZSBXMSAgMjI3MjUgICAvKiBjb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUgKi8KKyNkZWZpbmUgVzIgIDIxNDA3ICAgLyogY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41ICovCisjZGVmaW5lIFczICAxOTI2NiAgIC8qIGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNSAqLworI2RlZmluZSBXNCAgMTYzODMgICAvKiBjb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUgKi8KKyNkZWZpbmUgVzUgIDEyODczICAgLyogY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41ICovCisjZGVmaW5lIFc2ICA4ODY3ICAgIC8qIGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNSAqLworI2RlZmluZSBXNyAgNDUyMCAgICAvKiBjb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUgKi8KKyNkZWZpbmUgUk9XX1NISUZUIDExCisjZGVmaW5lIENPTF9TSElGVCAyMAorCisjZGVmaW5lIFcxMyAoVzEgfCAoVzMgPDwgMTYpKQorI2RlZmluZSBXMjYgKFcyIHwgKFc2IDw8IDE2KSkKKyNkZWZpbmUgVzU3IChXNSB8IChXNyA8PCAxNikpCisKK2Z1bmN0aW9uIGlkY3Rfcm93X2FybXY1dGUKKyAgICAgICAgc3RyICAgIGxyLCBbc3AsICMtNF0hCisKKyAgICAgICAgbGRyZCAgIHYxLCB2MiwgW2ExLCAjOF0KKyAgICAgICAgbGRyZCAgIGEzLCBhNCwgW2ExXSAgICAgICAgICAvKiBhMyA9IHJvd1sxOjBdLCBhNCA9IHJvd1szOjJdICovCisgICAgICAgIG9ycnMgICB2MSwgdjEsIHYyCisgICAgICAgIGl0dCAgICBlcQorICAgICAgICBjbXBlcSAgdjEsIGE0CisgICAgICAgIGNtcGVxICB2MSwgYTMsIGxzciAjMTYKKyAgICAgICAgYmVxICAgIHJvd19kY19vbmx5CisKKyAgICAgICAgbW92ICAgIHYxLCAjKDE8PChST1dfU0hJRlQtMSkpCisgICAgICAgIG1vdiAgICBpcCwgIzE2Mzg0CisgICAgICAgIHN1YiAgICBpcCwgaXAsICMxICAgICAgICAgICAgLyogaXAgPSBXNCAqLworICAgICAgICBzbWxhYmIgdjEsIGlwLCBhMywgdjEgICAgICAgIC8qIHYxID0gVzQqcm93WzBdKygxPDwoUlMtMSkpICovCisgICAgICAgIGxkciAgICBpcCwgPVcyNiAgICAgICAgICAgICAgLyogaXAgPSBXMiB8IChXNiA8PCAxNikgKi8KKyAgICAgICAgc211bHRiIGEyLCBpcCwgYTQKKyAgICAgICAgc211bGJiIGxyLCBpcCwgYTQKKyAgICAgICAgYWRkICAgIHYyLCB2MSwgYTIKKyAgICAgICAgc3ViICAgIHYzLCB2MSwgYTIKKyAgICAgICAgc3ViICAgIHY0LCB2MSwgbHIKKyAgICAgICAgYWRkICAgIHYxLCB2MSwgbHIKKworICAgICAgICBsZHIgICAgaXAsID1XMTMgICAgICAgICAgICAgIC8qIGlwID0gVzEgfCAoVzMgPDwgMTYpICovCisgICAgICAgIGxkciAgICBsciwgPVc1NyAgICAgICAgICAgICAgLyogbHIgPSBXNSB8IChXNyA8PCAxNikgKi8KKyAgICAgICAgc211bGJ0IHY1LCBpcCwgYTMKKyAgICAgICAgc211bHR0IHY2LCBsciwgYTQKKyAgICAgICAgc21sYXR0IHY1LCBpcCwgYTQsIHY1CisgICAgICAgIHNtdWx0dCBhMiwgaXAsIGEzCisgICAgICAgIHNtdWxidCB2NywgbHIsIGEzCisgICAgICAgIHN1YiAgICB2NiwgdjYsIGEyCisgICAgICAgIHNtdWxidCBhMiwgaXAsIGE0CisgICAgICAgIHNtdWx0dCBmcCwgbHIsIGEzCisgICAgICAgIHN1YiAgICB2NywgdjcsIGEyCisgICAgICAgIHNtdWxidCBhMiwgbHIsIGE0CisgICAgICAgIGxkcmQgICBhMywgYTQsIFthMSwgIzhdICAgICAvKiBhMz1yb3dbNTo0XSBhND1yb3dbNzo2XSAqLworICAgICAgICBzdWIgICAgZnAsIGZwLCBhMgorCisgICAgICAgIG9ycnMgICBhMiwgYTMsIGE0CisgICAgICAgIGJlcSAgICAxZgorCisgICAgICAgIHNtbGFidCB2NSwgbHIsIGEzLCB2NQorICAgICAgICBzbWxhYnQgdjYsIGlwLCBhMywgdjYKKyAgICAgICAgc21sYXR0IHY1LCBsciwgYTQsIHY1CisgICAgICAgIHNtbGFidCB2NiwgbHIsIGE0LCB2NgorICAgICAgICBzbWxhdHQgdjcsIGxyLCBhMywgdjcKKyAgICAgICAgc21sYXR0IGZwLCBpcCwgYTMsIGZwCisgICAgICAgIHNtdWxidCBhMiwgaXAsIGE0CisgICAgICAgIHNtbGF0dCB2NywgaXAsIGE0LCB2NworICAgICAgICBzdWIgICAgZnAsIGZwLCBhMgorCisgICAgICAgIGxkciAgICBpcCwgPVcyNiAgICAgICAgICAgICAgLyogaXAgPSBXMiB8IChXNiA8PCAxNikgKi8KKyAgICAgICAgbW92ICAgIGEyLCAjMTYzODQKKyAgICAgICAgc3ViICAgIGEyLCBhMiwgIzEgICAgICAgICAgICAvKiBhMiA9ICBXNCAqLworICAgICAgICBzbXVsYmIgYTIsIGEyLCBhMyAgICAgICAgICAgIC8qIGEyID0gIFc0KnJvd1s0XSAqLworICAgICAgICBzbXVsdGIgbHIsIGlwLCBhNCAgICAgICAgICAgIC8qIGxyID0gIFc2KnJvd1s2XSAqLworICAgICAgICBhZGQgICAgdjEsIHYxLCBhMiAgICAgICAgICAgIC8qIHYxICs9IFc0KnJvd1s0XSAqLworICAgICAgICBhZGQgICAgdjEsIHYxLCBsciAgICAgICAgICAgIC8qIHYxICs9IFc2KnJvd1s2XSAqLworICAgICAgICBhZGQgICAgdjQsIHY0LCBhMiAgICAgICAgICAgIC8qIHY0ICs9IFc0KnJvd1s0XSAqLworICAgICAgICBzdWIgICAgdjQsIHY0LCBsciAgICAgICAgICAgIC8qIHY0IC09IFc2KnJvd1s2XSAqLworICAgICAgICBzbXVsYmIgbHIsIGlwLCBhNCAgICAgICAgICAgIC8qIGxyID0gIFcyKnJvd1s2XSAqLworICAgICAgICBzdWIgICAgdjIsIHYyLCBhMiAgICAgICAgICAgIC8qIHYyIC09IFc0KnJvd1s0XSAqLworICAgICAgICBzdWIgICAgdjIsIHYyLCBsciAgICAgICAgICAgIC8qIHYyIC09IFcyKnJvd1s2XSAqLworICAgICAgICBzdWIgICAgdjMsIHYzLCBhMiAgICAgICAgICAgIC8qIHYzIC09IFc0KnJvd1s0XSAqLworICAgICAgICBhZGQgICAgdjMsIHYzLCBsciAgICAgICAgICAgIC8qIHYzICs9IFcyKnJvd1s2XSAqLworCisxOiAgICAgIGFkZCAgICBhMiwgdjEsIHY1CisgICAgICAgIG1vdiAgICBhMywgYTIsIGxzciAjMTEKKyAgICAgICAgYmljICAgIGEzLCBhMywgIzB4MWYwMDAwCisgICAgICAgIHN1YiAgICBhMiwgdjIsIHY2CisgICAgICAgIG1vdiAgICBhMiwgYTIsIGxzciAjMTEKKyAgICAgICAgYWRkICAgIGEzLCBhMywgYTIsIGxzbCAjMTYKKyAgICAgICAgYWRkICAgIGEyLCB2MywgdjcKKyAgICAgICAgbW92ICAgIGE0LCBhMiwgbHNyICMxMQorICAgICAgICBiaWMgICAgYTQsIGE0LCAjMHgxZjAwMDAKKyAgICAgICAgYWRkICAgIGEyLCB2NCwgZnAKKyAgICAgICAgbW92ICAgIGEyLCBhMiwgbHNyICMxMQorICAgICAgICBhZGQgICAgYTQsIGE0LCBhMiwgbHNsICMxNgorICAgICAgICBzdHJkICAgYTMsIGE0LCBbYTFdCisKKyAgICAgICAgc3ViICAgIGEyLCB2NCwgZnAKKyAgICAgICAgbW92ICAgIGEzLCBhMiwgbHNyICMxMQorICAgICAgICBiaWMgICAgYTMsIGEzLCAjMHgxZjAwMDAKKyAgICAgICAgc3ViICAgIGEyLCB2MywgdjcKKyAgICAgICAgbW92ICAgIGEyLCBhMiwgbHNyICMxMQorICAgICAgICBhZGQgICAgYTMsIGEzLCBhMiwgbHNsICMxNgorICAgICAgICBhZGQgICAgYTIsIHYyLCB2NgorICAgICAgICBtb3YgICAgYTQsIGEyLCBsc3IgIzExCisgICAgICAgIGJpYyAgICBhNCwgYTQsICMweDFmMDAwMAorICAgICAgICBzdWIgICAgYTIsIHYxLCB2NQorICAgICAgICBtb3YgICAgYTIsIGEyLCBsc3IgIzExCisgICAgICAgIGFkZCAgICBhNCwgYTQsIGEyLCBsc2wgIzE2CisgICAgICAgIHN0cmQgICBhMywgYTQsIFthMSwgIzhdCisKKyAgICAgICAgbGRyICAgIHBjLCBbc3BdLCAjNAorCityb3dfZGNfb25seToKKyAgICAgICAgb3JyICAgIGEzLCBhMywgYTMsIGxzbCAjMTYKKyAgICAgICAgYmljICAgIGEzLCBhMywgIzB4ZTAwMAorICAgICAgICBtb3YgICAgYTMsIGEzLCBsc2wgIzMKKyAgICAgICAgbW92ICAgIGE0LCBhMworICAgICAgICBzdHJkICAgYTMsIGE0LCBbYTFdCisgICAgICAgIHN0cmQgICBhMywgYTQsIFthMSwgIzhdCisKKyAgICAgICAgbGRyICAgIHBjLCBbc3BdLCAjNAorZW5kZnVuYworCisgICAgICAgIC5tYWNybyBpZGN0X2NvbAorICAgICAgICBsZHIgICAgYTQsIFthMV0gICAgICAgICAgICAgIC8qIGE0ID0gY29sWzE6MF0gKi8KKyAgICAgICAgbW92ICAgIGlwLCAjMTYzODQKKyAgICAgICAgc3ViICAgIGlwLCBpcCwgIzEgICAgICAgICAgICAvKiBpcCA9IFc0ICovCisjaWYgMAorICAgICAgICBtb3YgICAgdjEsICMoMTw8KENPTF9TSElGVC0xKSkKKyAgICAgICAgc21sYWJ0IHYyLCBpcCwgYTQsIHYxICAgICAgICAvKiB2MiA9IFc0KmNvbFsxXSArICgxPDwoQ09MX1NISUZULTEpKSAqLworICAgICAgICBzbWxhYmIgdjEsIGlwLCBhNCwgdjEgICAgICAgIC8qIHYxID0gVzQqY29sWzBdICsgKDE8PChDT0xfU0hJRlQtMSkpICovCisgICAgICAgIGxkciAgICBhNCwgW2ExLCAjKDE2KjQpXQorI2Vsc2UKKyAgICAgICAgbW92ICAgIHYxLCAjKCgxPDwoQ09MX1NISUZULTEpKS9XNCkgLyogdGhpcyBtYXRjaGVzIHRoZSBDIHZlcnNpb24gKi8KKyAgICAgICAgYWRkICAgIHYyLCB2MSwgYTQsIGFzciAjMTYKKyAgICAgICAgcnNiICAgIHYyLCB2MiwgdjIsIGxzbCAjMTQKKyAgICAgICAgbW92ICAgIGE0LCBhNCwgbHNsICMxNgorICAgICAgICBhZGQgICAgdjEsIHYxLCBhNCwgYXNyICMxNgorICAgICAgICBsZHIgICAgYTQsIFthMSwgIygxNio0KV0KKyAgICAgICAgcnNiICAgIHYxLCB2MSwgdjEsIGxzbCAjMTQKKyNlbmRpZgorCisgICAgICAgIHNtdWxiYiBsciwgaXAsIGE0CisgICAgICAgIHNtdWxidCBhMywgaXAsIGE0CisgICAgICAgIHN1YiAgICB2MywgdjEsIGxyCisgICAgICAgIHN1YiAgICB2NSwgdjEsIGxyCisgICAgICAgIGFkZCAgICB2NywgdjEsIGxyCisgICAgICAgIGFkZCAgICB2MSwgdjEsIGxyCisgICAgICAgIHN1YiAgICB2NCwgdjIsIGEzCisgICAgICAgIHN1YiAgICB2NiwgdjIsIGEzCisgICAgICAgIGFkZCAgICBmcCwgdjIsIGEzCisgICAgICAgIGxkciAgICBpcCwgPVcyNgorICAgICAgICBsZHIgICAgYTQsIFthMSwgIygxNioyKV0KKyAgICAgICAgYWRkICAgIHYyLCB2MiwgYTMKKworICAgICAgICBzbXVsYmIgbHIsIGlwLCBhNAorICAgICAgICBzbXVsdGIgYTMsIGlwLCBhNAorICAgICAgICBhZGQgICAgdjEsIHYxLCBscgorICAgICAgICBzdWIgICAgdjcsIHY3LCBscgorICAgICAgICBhZGQgICAgdjMsIHYzLCBhMworICAgICAgICBzdWIgICAgdjUsIHY1LCBhMworICAgICAgICBzbXVsYnQgbHIsIGlwLCBhNAorICAgICAgICBzbXVsdHQgYTMsIGlwLCBhNAorICAgICAgICBhZGQgICAgdjIsIHYyLCBscgorICAgICAgICBzdWIgICAgZnAsIGZwLCBscgorICAgICAgICBhZGQgICAgdjQsIHY0LCBhMworICAgICAgICBsZHIgICAgYTQsIFthMSwgIygxNio2KV0KKyAgICAgICAgc3ViICAgIHY2LCB2NiwgYTMKKworICAgICAgICBzbXVsdGIgbHIsIGlwLCBhNAorICAgICAgICBzbXVsYmIgYTMsIGlwLCBhNAorICAgICAgICBhZGQgICAgdjEsIHYxLCBscgorICAgICAgICBzdWIgICAgdjcsIHY3LCBscgorICAgICAgICBzdWIgICAgdjMsIHYzLCBhMworICAgICAgICBhZGQgICAgdjUsIHY1LCBhMworICAgICAgICBzbXVsdHQgbHIsIGlwLCBhNAorICAgICAgICBzbXVsYnQgYTMsIGlwLCBhNAorICAgICAgICBhZGQgICAgdjIsIHYyLCBscgorICAgICAgICBzdWIgICAgZnAsIGZwLCBscgorICAgICAgICBzdWIgICAgdjQsIHY0LCBhMworICAgICAgICBhZGQgICAgdjYsIHY2LCBhMworCisgICAgICAgIHN0bWZkICBzcCEsIHt2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgZnB9CisKKyAgICAgICAgbGRyICAgIGlwLCA9VzEzCisgICAgICAgIGxkciAgICBhNCwgW2ExLCAjKDE2KjEpXQorICAgICAgICBsZHIgICAgbHIsID1XNTcKKyAgICAgICAgc211bGJiIHYxLCBpcCwgYTQKKyAgICAgICAgc211bHRiIHYzLCBpcCwgYTQKKyAgICAgICAgc211bGJiIHY1LCBsciwgYTQKKyAgICAgICAgc211bHRiIHY3LCBsciwgYTQKKyAgICAgICAgc211bGJ0IHYyLCBpcCwgYTQKKyAgICAgICAgc211bHR0IHY0LCBpcCwgYTQKKyAgICAgICAgc211bGJ0IHY2LCBsciwgYTQKKyAgICAgICAgc211bHR0IGZwLCBsciwgYTQKKyAgICAgICAgcnNiICAgIHY0LCB2NCwgIzAKKyAgICAgICAgbGRyICAgIGE0LCBbYTEsICMoMTYqMyldCisgICAgICAgIHJzYiAgICB2MywgdjMsICMwCisKKyAgICAgICAgc21sYXRiIHYxLCBpcCwgYTQsIHYxCisgICAgICAgIHNtbGF0YiB2MywgbHIsIGE0LCB2MworICAgICAgICBzbXVsYmIgYTMsIGlwLCBhNAorICAgICAgICBzbXVsYmIgYTIsIGxyLCBhNAorICAgICAgICBzdWIgICAgdjUsIHY1LCBhMworICAgICAgICBzdWIgICAgdjcsIHY3LCBhMgorICAgICAgICBzbWxhdHQgdjIsIGlwLCBhNCwgdjIKKyAgICAgICAgc21sYXR0IHY0LCBsciwgYTQsIHY0CisgICAgICAgIHNtdWxidCBhMywgaXAsIGE0CisgICAgICAgIHNtdWxidCBhMiwgbHIsIGE0CisgICAgICAgIHN1YiAgICB2NiwgdjYsIGEzCisgICAgICAgIGxkciAgICBhNCwgW2ExLCAjKDE2KjUpXQorICAgICAgICBzdWIgICAgZnAsIGZwLCBhMgorCisgICAgICAgIHNtbGFiYiB2MSwgbHIsIGE0LCB2MQorICAgICAgICBzbWxhYmIgdjMsIGlwLCBhNCwgdjMKKyAgICAgICAgc21sYXRiIHY1LCBsciwgYTQsIHY1CisgICAgICAgIHNtbGF0YiB2NywgaXAsIGE0LCB2NworICAgICAgICBzbWxhYnQgdjIsIGxyLCBhNCwgdjIKKyAgICAgICAgc21sYWJ0IHY0LCBpcCwgYTQsIHY0CisgICAgICAgIHNtbGF0dCB2NiwgbHIsIGE0LCB2NgorICAgICAgICBsZHIgICAgYTMsIFthMSwgIygxNio3KV0KKyAgICAgICAgc21sYXR0IGZwLCBpcCwgYTQsIGZwCisKKyAgICAgICAgc21sYXRiIHYxLCBsciwgYTMsIHYxCisgICAgICAgIHNtbGFiYiB2MywgbHIsIGEzLCB2MworICAgICAgICBzbWxhdGIgdjUsIGlwLCBhMywgdjUKKyAgICAgICAgc211bGJiIGE0LCBpcCwgYTMKKyAgICAgICAgc21sYXR0IHYyLCBsciwgYTMsIHYyCisgICAgICAgIHN1YiAgICB2NywgdjcsIGE0CisgICAgICAgIHNtbGFidCB2NCwgbHIsIGEzLCB2NAorICAgICAgICBzbXVsYnQgYTQsIGlwLCBhMworICAgICAgICBzbWxhdHQgdjYsIGlwLCBhMywgdjYKKyAgICAgICAgc3ViICAgIGZwLCBmcCwgYTQKKyAgICAgICAgLmVuZG0KKworZnVuY3Rpb24gaWRjdF9jb2xfYXJtdjV0ZQorICAgICAgICBzdHIgICAgbHIsIFtzcCwgIy00XSEKKworICAgICAgICBpZGN0X2NvbAorCisgICAgICAgIGxkbWZkICBzcCEsIHthMywgYTR9CisgICAgICAgIGFkZHMgICBhMiwgYTMsIHYxCisgICAgICAgIG1vdiAgICBhMiwgYTIsIGxzciAjMjAKKyAgICAgICAgaXQgICAgIG1pCisgICAgICAgIG9ycm1pICBhMiwgYTIsICMweGYwMDAKKyAgICAgICAgYWRkICAgIGlwLCBhNCwgdjIKKyAgICAgICAgbW92ICAgIGlwLCBpcCwgYXNyICMyMAorICAgICAgICBvcnIgICAgYTIsIGEyLCBpcCwgbHNsICMxNgorICAgICAgICBzdHIgICAgYTIsIFthMV0KKyAgICAgICAgc3VicyAgIGEzLCBhMywgdjEKKyAgICAgICAgbW92ICAgIGEyLCBhMywgbHNyICMyMAorICAgICAgICBpdCAgICAgbWkKKyAgICAgICAgb3JybWkgIGEyLCBhMiwgIzB4ZjAwMAorICAgICAgICBzdWIgICAgYTQsIGE0LCB2MgorICAgICAgICBtb3YgICAgYTQsIGE0LCBhc3IgIzIwCisgICAgICAgIG9yciAgICBhMiwgYTIsIGE0LCBsc2wgIzE2CisgICAgICAgIGxkbWZkICBzcCEsIHthMywgYTR9CisgICAgICAgIHN0ciAgICBhMiwgW2ExLCAjKDE2KjcpXQorCisgICAgICAgIHN1YnMgICBhMiwgYTMsIHYzCisgICAgICAgIG1vdiAgICBhMiwgYTIsIGxzciAjMjAKKyAgICAgICAgaXQgICAgIG1pCisgICAgICAgIG9ycm1pICBhMiwgYTIsICMweGYwMDAKKyAgICAgICAgc3ViICAgIGlwLCBhNCwgdjQKKyAgICAgICAgbW92ICAgIGlwLCBpcCwgYXNyICMyMAorICAgICAgICBvcnIgICAgYTIsIGEyLCBpcCwgbHNsICMxNgorICAgICAgICBzdHIgICAgYTIsIFthMSwgIygxNioxKV0KKyAgICAgICAgYWRkcyAgIGEzLCBhMywgdjMKKyAgICAgICAgbW92ICAgIGEyLCBhMywgbHNyICMyMAorICAgICAgICBpdCAgICAgbWkKKyAgICAgICAgb3JybWkgIGEyLCBhMiwgIzB4ZjAwMAorICAgICAgICBhZGQgICAgYTQsIGE0LCB2NAorICAgICAgICBtb3YgICAgYTQsIGE0LCBhc3IgIzIwCisgICAgICAgIG9yciAgICBhMiwgYTIsIGE0LCBsc2wgIzE2CisgICAgICAgIGxkbWZkICBzcCEsIHthMywgYTR9CisgICAgICAgIHN0ciAgICBhMiwgW2ExLCAjKDE2KjYpXQorCisgICAgICAgIGFkZHMgICBhMiwgYTMsIHY1CisgICAgICAgIG1vdiAgICBhMiwgYTIsIGxzciAjMjAKKyAgICAgICAgaXQgICAgIG1pCisgICAgICAgIG9ycm1pICBhMiwgYTIsICMweGYwMDAKKyAgICAgICAgYWRkICAgIGlwLCBhNCwgdjYKKyAgICAgICAgbW92ICAgIGlwLCBpcCwgYXNyICMyMAorICAgICAgICBvcnIgICAgYTIsIGEyLCBpcCwgbHNsICMxNgorICAgICAgICBzdHIgICAgYTIsIFthMSwgIygxNioyKV0KKyAgICAgICAgc3VicyAgIGEzLCBhMywgdjUKKyAgICAgICAgbW92ICAgIGEyLCBhMywgbHNyICMyMAorICAgICAgICBpdCAgICAgbWkKKyAgICAgICAgb3JybWkgIGEyLCBhMiwgIzB4ZjAwMAorICAgICAgICBzdWIgICAgYTQsIGE0LCB2NgorICAgICAgICBtb3YgICAgYTQsIGE0LCBhc3IgIzIwCisgICAgICAgIG9yciAgICBhMiwgYTIsIGE0LCBsc2wgIzE2CisgICAgICAgIGxkbWZkICBzcCEsIHthMywgYTR9CisgICAgICAgIHN0ciAgICBhMiwgW2ExLCAjKDE2KjUpXQorCisgICAgICAgIGFkZHMgICBhMiwgYTMsIHY3CisgICAgICAgIG1vdiAgICBhMiwgYTIsIGxzciAjMjAKKyAgICAgICAgaXQgICAgIG1pCisgICAgICAgIG9ycm1pICBhMiwgYTIsICMweGYwMDAKKyAgICAgICAgYWRkICAgIGlwLCBhNCwgZnAKKyAgICAgICAgbW92ICAgIGlwLCBpcCwgYXNyICMyMAorICAgICAgICBvcnIgICAgYTIsIGEyLCBpcCwgbHNsICMxNgorICAgICAgICBzdHIgICAgYTIsIFthMSwgIygxNiozKV0KKyAgICAgICAgc3VicyAgIGEzLCBhMywgdjcKKyAgICAgICAgbW92ICAgIGEyLCBhMywgbHNyICMyMAorICAgICAgICBpdCAgICAgbWkKKyAgICAgICAgb3JybWkgIGEyLCBhMiwgIzB4ZjAwMAorICAgICAgICBzdWIgICAgYTQsIGE0LCBmcAorICAgICAgICBtb3YgICAgYTQsIGE0LCBhc3IgIzIwCisgICAgICAgIG9yciAgICBhMiwgYTIsIGE0LCBsc2wgIzE2CisgICAgICAgIHN0ciAgICBhMiwgW2ExLCAjKDE2KjQpXQorCisgICAgICAgIGxkciAgICBwYywgW3NwXSwgIzQKK2VuZGZ1bmMKKworLm1hY3JvICBjbGlwICAgZHN0LCBzcmM6dmFyYXJnCisgICAgICAgIG1vdnMgICBcZHN0LCBcc3JjCisgICAgICAgIGl0ICAgICBtaQorICAgICAgICBtb3ZtaSAgXGRzdCwgIzAKKyAgICAgICAgY21wICAgIFxkc3QsICMyNTUKKyAgICAgICAgaXQgICAgIGd0CisgICAgICAgIG1vdmd0ICBcZHN0LCAjMjU1CisuZW5kbQorCisubWFjcm8gIGFjbGlwICBkc3QsIHNyYzp2YXJhcmcKKyAgICAgICAgYWRkcyAgIFxkc3QsIFxzcmMKKyAgICAgICAgaXQgICAgIG1pCisgICAgICAgIG1vdm1pICBcZHN0LCAjMAorICAgICAgICBjbXAgICAgXGRzdCwgIzI1NQorICAgICAgICBpdCAgICAgZ3QKKyAgICAgICAgbW92Z3QgIFxkc3QsICMyNTUKKy5lbmRtCisKK2Z1bmN0aW9uIGlkY3RfY29sX3B1dF9hcm12NXRlCisgICAgICAgIHN0ciAgICBsciwgW3NwLCAjLTRdIQorCisgICAgICAgIGlkY3RfY29sCisKKyAgICAgICAgbGRtZmQgIHNwISwge2EzLCBhNH0KKyAgICAgICAgbGRyICAgIGxyLCBbc3AsICMzMl0KKyAgICAgICAgYWRkICAgIGEyLCBhMywgdjEKKyAgICAgICAgY2xpcCAgIGEyLCBhMiwgYXNyICMyMAorICAgICAgICBhZGQgICAgaXAsIGE0LCB2MgorICAgICAgICBjbGlwICAgaXAsIGlwLCBhc3IgIzIwCisgICAgICAgIG9yciAgICBhMiwgYTIsIGlwLCBsc2wgIzgKKyAgICAgICAgc3ViICAgIGEzLCBhMywgdjEKKyAgICAgICAgY2xpcCAgIGEzLCBhMywgYXNyICMyMAorICAgICAgICBzdWIgICAgYTQsIGE0LCB2MgorICAgICAgICBjbGlwICAgYTQsIGE0LCBhc3IgIzIwCisgICAgICAgIGxkciAgICB2MSwgW3NwLCAjMjhdCisgICAgICAgIHN0cmggICBhMiwgW3YxXQorICAgICAgICBhZGQgICAgYTIsIHYxLCAjMgorICAgICAgICBzdHIgICAgYTIsIFtzcCwgIzI4XQorICAgICAgICBvcnIgICAgYTIsIGEzLCBhNCwgbHNsICM4CisgICAgICAgIHJzYiAgICB2MiwgbHIsIGxyLCBsc2wgIzMKKyAgICAgICAgbGRtZmQgIHNwISwge2EzLCBhNH0KKyAgICAgICAgc3RyaF9wcmUgYTIsIHYyLCB2MQorCisgICAgICAgIHN1YiAgICBhMiwgYTMsIHYzCisgICAgICAgIGNsaXAgICBhMiwgYTIsIGFzciAjMjAKKyAgICAgICAgc3ViICAgIGlwLCBhNCwgdjQKKyAgICAgICAgY2xpcCAgIGlwLCBpcCwgYXNyICMyMAorICAgICAgICBvcnIgICAgYTIsIGEyLCBpcCwgbHNsICM4CisgICAgICAgIHN0cmhfcHJlIGEyLCB2MSwgbHIKKyAgICAgICAgYWRkICAgIGEzLCBhMywgdjMKKyAgICAgICAgY2xpcCAgIGEyLCBhMywgYXNyICMyMAorICAgICAgICBhZGQgICAgYTQsIGE0LCB2NAorICAgICAgICBjbGlwICAgYTQsIGE0LCBhc3IgIzIwCisgICAgICAgIG9yciAgICBhMiwgYTIsIGE0LCBsc2wgIzgKKyAgICAgICAgbGRtZmQgIHNwISwge2EzLCBhNH0KKyAgICAgICAgc3RyaF9kcHJlIGEyLCB2MiwgbHIKKworICAgICAgICBhZGQgICAgYTIsIGEzLCB2NQorICAgICAgICBjbGlwICAgYTIsIGEyLCBhc3IgIzIwCisgICAgICAgIGFkZCAgICBpcCwgYTQsIHY2CisgICAgICAgIGNsaXAgICBpcCwgaXAsIGFzciAjMjAKKyAgICAgICAgb3JyICAgIGEyLCBhMiwgaXAsIGxzbCAjOAorICAgICAgICBzdHJoX3ByZSBhMiwgdjEsIGxyCisgICAgICAgIHN1YiAgICBhMywgYTMsIHY1CisgICAgICAgIGNsaXAgICBhMiwgYTMsIGFzciAjMjAKKyAgICAgICAgc3ViICAgIGE0LCBhNCwgdjYKKyAgICAgICAgY2xpcCAgIGE0LCBhNCwgYXNyICMyMAorICAgICAgICBvcnIgICAgYTIsIGEyLCBhNCwgbHNsICM4CisgICAgICAgIGxkbWZkICBzcCEsIHthMywgYTR9CisgICAgICAgIHN0cmhfZHByZSBhMiwgdjIsIGxyCisKKyAgICAgICAgYWRkICAgIGEyLCBhMywgdjcKKyAgICAgICAgY2xpcCAgIGEyLCBhMiwgYXNyICMyMAorICAgICAgICBhZGQgICAgaXAsIGE0LCBmcAorICAgICAgICBjbGlwICAgaXAsIGlwLCBhc3IgIzIwCisgICAgICAgIG9yciAgICBhMiwgYTIsIGlwLCBsc2wgIzgKKyAgICAgICAgc3RyaCAgIGEyLCBbdjEsIGxyXQorICAgICAgICBzdWIgICAgYTMsIGEzLCB2NworICAgICAgICBjbGlwICAgYTIsIGEzLCBhc3IgIzIwCisgICAgICAgIHN1YiAgICBhNCwgYTQsIGZwCisgICAgICAgIGNsaXAgICBhNCwgYTQsIGFzciAjMjAKKyAgICAgICAgb3JyICAgIGEyLCBhMiwgYTQsIGxzbCAjOAorICAgICAgICBzdHJoX2RwcmUgYTIsIHYyLCBscgorCisgICAgICAgIGxkciAgICBwYywgW3NwXSwgIzQKK2VuZGZ1bmMKKworZnVuY3Rpb24gaWRjdF9jb2xfYWRkX2FybXY1dGUKKyAgICAgICAgc3RyICAgIGxyLCBbc3AsICMtNF0hCisKKyAgICAgICAgaWRjdF9jb2wKKworICAgICAgICBsZHIgICAgbHIsIFtzcCwgIzM2XQorCisgICAgICAgIGxkbWZkICBzcCEsIHthMywgYTR9CisgICAgICAgIGxkcmggICBpcCwgW2xyXQorICAgICAgICBhZGQgICAgYTIsIGEzLCB2MQorICAgICAgICBzdWIgICAgYTMsIGEzLCB2MQorICAgICAgICBhbmQgICAgdjEsIGlwLCAjMjU1CisgICAgICAgIGFjbGlwICBhMiwgdjEsIGEyLCBhc3IgIzIwCisgICAgICAgIGFkZCAgICB2MSwgYTQsIHYyCisgICAgICAgIG1vdiAgICB2MSwgdjEsIGFzciAjMjAKKyAgICAgICAgYWNsaXAgIHYxLCB2MSwgaXAsIGxzciAjOAorICAgICAgICBvcnIgICAgYTIsIGEyLCB2MSwgbHNsICM4CisgICAgICAgIGxkciAgICB2MSwgW3NwLCAjMzJdCisgICAgICAgIHN1YiAgICBhNCwgYTQsIHYyCisgICAgICAgIHJzYiAgICB2MiwgdjEsIHYxLCBsc2wgIzMKKyAgICAgICAgbGRyaF9wcmUgaXAsIHYyLCBscgorICAgICAgICBzdHJoICAgYTIsIFtscl0KKyAgICAgICAgYW5kICAgIGEyLCBpcCwgIzI1NQorICAgICAgICBhY2xpcCAgYTMsIGEyLCBhMywgYXNyICMyMAorICAgICAgICBtb3YgICAgYTQsIGE0LCBhc3IgIzIwCisgICAgICAgIGFjbGlwICBhNCwgYTQsIGlwLCBsc3IgIzgKKyAgICAgICAgYWRkICAgIGEyLCBsciwgIzIKKyAgICAgICAgc3RyICAgIGEyLCBbc3AsICMyOF0KKyAgICAgICAgb3JyICAgIGEyLCBhMywgYTQsIGxzbCAjOAorICAgICAgICBzdHJoICAgYTIsIFt2Ml0KKworICAgICAgICBsZG1mZCAgc3AhLCB7YTMsIGE0fQorICAgICAgICBsZHJoX3ByZSBpcCwgbHIsIHYxCisgICAgICAgIHN1YiAgICBhMiwgYTMsIHYzCisgICAgICAgIGFkZCAgICBhMywgYTMsIHYzCisgICAgICAgIGFuZCAgICB2MywgaXAsICMyNTUKKyAgICAgICAgYWNsaXAgIGEyLCB2MywgYTIsIGFzciAjMjAKKyAgICAgICAgc3ViICAgIHYzLCBhNCwgdjQKKyAgICAgICAgbW92ICAgIHYzLCB2MywgYXNyICMyMAorICAgICAgICBhY2xpcCAgdjMsIHYzLCBpcCwgbHNyICM4CisgICAgICAgIG9yciAgICBhMiwgYTIsIHYzLCBsc2wgIzgKKyAgICAgICAgYWRkICAgIGE0LCBhNCwgdjQKKyAgICAgICAgbGRyaF9kcHJlIGlwLCB2MiwgdjEKKyAgICAgICAgc3RyaCAgIGEyLCBbbHJdCisgICAgICAgIGFuZCAgICBhMiwgaXAsICMyNTUKKyAgICAgICAgYWNsaXAgIGEzLCBhMiwgYTMsIGFzciAjMjAKKyAgICAgICAgbW92ICAgIGE0LCBhNCwgYXNyICMyMAorICAgICAgICBhY2xpcCAgYTQsIGE0LCBpcCwgbHNyICM4CisgICAgICAgIG9yciAgICBhMiwgYTMsIGE0LCBsc2wgIzgKKyAgICAgICAgc3RyaCAgIGEyLCBbdjJdCisKKyAgICAgICAgbGRtZmQgIHNwISwge2EzLCBhNH0KKyAgICAgICAgbGRyaF9wcmUgaXAsIGxyLCB2MQorICAgICAgICBhZGQgICAgYTIsIGEzLCB2NQorICAgICAgICBzdWIgICAgYTMsIGEzLCB2NQorICAgICAgICBhbmQgICAgdjMsIGlwLCAjMjU1CisgICAgICAgIGFjbGlwICBhMiwgdjMsIGEyLCBhc3IgIzIwCisgICAgICAgIGFkZCAgICB2MywgYTQsIHY2CisgICAgICAgIG1vdiAgICB2MywgdjMsIGFzciAjMjAKKyAgICAgICAgYWNsaXAgIHYzLCB2MywgaXAsIGxzciAjOAorICAgICAgICBvcnIgICAgYTIsIGEyLCB2MywgbHNsICM4CisgICAgICAgIHN1YiAgICBhNCwgYTQsIHY2CisgICAgICAgIGxkcmhfZHByZSBpcCwgdjIsIHYxCisgICAgICAgIHN0cmggICBhMiwgW2xyXQorICAgICAgICBhbmQgICAgYTIsIGlwLCAjMjU1CisgICAgICAgIGFjbGlwICBhMywgYTIsIGEzLCBhc3IgIzIwCisgICAgICAgIG1vdiAgICBhNCwgYTQsIGFzciAjMjAKKyAgICAgICAgYWNsaXAgIGE0LCBhNCwgaXAsIGxzciAjOAorICAgICAgICBvcnIgICAgYTIsIGEzLCBhNCwgbHNsICM4CisgICAgICAgIHN0cmggICBhMiwgW3YyXQorCisgICAgICAgIGxkbWZkICBzcCEsIHthMywgYTR9CisgICAgICAgIGxkcmhfcHJlIGlwLCBsciwgdjEKKyAgICAgICAgYWRkICAgIGEyLCBhMywgdjcKKyAgICAgICAgc3ViICAgIGEzLCBhMywgdjcKKyAgICAgICAgYW5kICAgIHYzLCBpcCwgIzI1NQorICAgICAgICBhY2xpcCAgYTIsIHYzLCBhMiwgYXNyICMyMAorICAgICAgICBhZGQgICAgdjMsIGE0LCBmcAorICAgICAgICBtb3YgICAgdjMsIHYzLCBhc3IgIzIwCisgICAgICAgIGFjbGlwICB2MywgdjMsIGlwLCBsc3IgIzgKKyAgICAgICAgb3JyICAgIGEyLCBhMiwgdjMsIGxzbCAjOAorICAgICAgICBzdWIgICAgYTQsIGE0LCBmcAorICAgICAgICBsZHJoX2RwcmUgaXAsIHYyLCB2MQorICAgICAgICBzdHJoICAgYTIsIFtscl0KKyAgICAgICAgYW5kICAgIGEyLCBpcCwgIzI1NQorICAgICAgICBhY2xpcCAgYTMsIGEyLCBhMywgYXNyICMyMAorICAgICAgICBtb3YgICAgYTQsIGE0LCBhc3IgIzIwCisgICAgICAgIGFjbGlwICBhNCwgYTQsIGlwLCBsc3IgIzgKKyAgICAgICAgb3JyICAgIGEyLCBhMywgYTQsIGxzbCAjOAorICAgICAgICBzdHJoICAgYTIsIFt2Ml0KKworICAgICAgICBsZHIgICAgcGMsIFtzcF0sICM0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3NpbXBsZV9pZGN0X2FybXY1dGUsIGV4cG9ydD0xCisgICAgICAgIHN0bWZkICBzcCEsIHt2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgZnAsIGxyfQorCisgICAgICAgIGJsICAgICBpZGN0X3Jvd19hcm12NXRlCisgICAgICAgIGFkZCAgICBhMSwgYTEsICMxNgorICAgICAgICBibCAgICAgaWRjdF9yb3dfYXJtdjV0ZQorICAgICAgICBhZGQgICAgYTEsIGExLCAjMTYKKyAgICAgICAgYmwgICAgIGlkY3Rfcm93X2FybXY1dGUKKyAgICAgICAgYWRkICAgIGExLCBhMSwgIzE2CisgICAgICAgIGJsICAgICBpZGN0X3Jvd19hcm12NXRlCisgICAgICAgIGFkZCAgICBhMSwgYTEsICMxNgorICAgICAgICBibCAgICAgaWRjdF9yb3dfYXJtdjV0ZQorICAgICAgICBhZGQgICAgYTEsIGExLCAjMTYKKyAgICAgICAgYmwgICAgIGlkY3Rfcm93X2FybXY1dGUKKyAgICAgICAgYWRkICAgIGExLCBhMSwgIzE2CisgICAgICAgIGJsICAgICBpZGN0X3Jvd19hcm12NXRlCisgICAgICAgIGFkZCAgICBhMSwgYTEsICMxNgorICAgICAgICBibCAgICAgaWRjdF9yb3dfYXJtdjV0ZQorCisgICAgICAgIHN1YiAgICBhMSwgYTEsICMoMTYqNykKKworICAgICAgICBibCAgICAgaWRjdF9jb2xfYXJtdjV0ZQorICAgICAgICBhZGQgICAgYTEsIGExLCAjNAorICAgICAgICBibCAgICAgaWRjdF9jb2xfYXJtdjV0ZQorICAgICAgICBhZGQgICAgYTEsIGExLCAjNAorICAgICAgICBibCAgICAgaWRjdF9jb2xfYXJtdjV0ZQorICAgICAgICBhZGQgICAgYTEsIGExLCAjNAorICAgICAgICBibCAgICAgaWRjdF9jb2xfYXJtdjV0ZQorCisgICAgICAgIGxkbWZkICBzcCEsIHt2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgZnAsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zaW1wbGVfaWRjdF9hZGRfYXJtdjV0ZSwgZXhwb3J0PTEKKyAgICAgICAgc3RtZmQgIHNwISwge2ExLCBhMiwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIGZwLCBscn0KKworICAgICAgICBtb3YgICAgYTEsIGEzCisKKyAgICAgICAgYmwgICAgIGlkY3Rfcm93X2FybXY1dGUKKyAgICAgICAgYWRkICAgIGExLCBhMSwgIzE2CisgICAgICAgIGJsICAgICBpZGN0X3Jvd19hcm12NXRlCisgICAgICAgIGFkZCAgICBhMSwgYTEsICMxNgorICAgICAgICBibCAgICAgaWRjdF9yb3dfYXJtdjV0ZQorICAgICAgICBhZGQgICAgYTEsIGExLCAjMTYKKyAgICAgICAgYmwgICAgIGlkY3Rfcm93X2FybXY1dGUKKyAgICAgICAgYWRkICAgIGExLCBhMSwgIzE2CisgICAgICAgIGJsICAgICBpZGN0X3Jvd19hcm12NXRlCisgICAgICAgIGFkZCAgICBhMSwgYTEsICMxNgorICAgICAgICBibCAgICAgaWRjdF9yb3dfYXJtdjV0ZQorICAgICAgICBhZGQgICAgYTEsIGExLCAjMTYKKyAgICAgICAgYmwgICAgIGlkY3Rfcm93X2FybXY1dGUKKyAgICAgICAgYWRkICAgIGExLCBhMSwgIzE2CisgICAgICAgIGJsICAgICBpZGN0X3Jvd19hcm12NXRlCisKKyAgICAgICAgc3ViICAgIGExLCBhMSwgIygxNio3KQorCisgICAgICAgIGJsICAgICBpZGN0X2NvbF9hZGRfYXJtdjV0ZQorICAgICAgICBhZGQgICAgYTEsIGExLCAjNAorICAgICAgICBibCAgICAgaWRjdF9jb2xfYWRkX2FybXY1dGUKKyAgICAgICAgYWRkICAgIGExLCBhMSwgIzQKKyAgICAgICAgYmwgICAgIGlkY3RfY29sX2FkZF9hcm12NXRlCisgICAgICAgIGFkZCAgICBhMSwgYTEsICM0CisgICAgICAgIGJsICAgICBpZGN0X2NvbF9hZGRfYXJtdjV0ZQorCisgICAgICAgIGFkZCAgICBzcCwgc3AsICM4CisgICAgICAgIGxkbWZkICBzcCEsIHt2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgZnAsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zaW1wbGVfaWRjdF9wdXRfYXJtdjV0ZSwgZXhwb3J0PTEKKyAgICAgICAgc3RtZmQgIHNwISwge2ExLCBhMiwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIGZwLCBscn0KKworICAgICAgICBtb3YgICAgYTEsIGEzCisKKyAgICAgICAgYmwgICAgIGlkY3Rfcm93X2FybXY1dGUKKyAgICAgICAgYWRkICAgIGExLCBhMSwgIzE2CisgICAgICAgIGJsICAgICBpZGN0X3Jvd19hcm12NXRlCisgICAgICAgIGFkZCAgICBhMSwgYTEsICMxNgorICAgICAgICBibCAgICAgaWRjdF9yb3dfYXJtdjV0ZQorICAgICAgICBhZGQgICAgYTEsIGExLCAjMTYKKyAgICAgICAgYmwgICAgIGlkY3Rfcm93X2FybXY1dGUKKyAgICAgICAgYWRkICAgIGExLCBhMSwgIzE2CisgICAgICAgIGJsICAgICBpZGN0X3Jvd19hcm12NXRlCisgICAgICAgIGFkZCAgICBhMSwgYTEsICMxNgorICAgICAgICBibCAgICAgaWRjdF9yb3dfYXJtdjV0ZQorICAgICAgICBhZGQgICAgYTEsIGExLCAjMTYKKyAgICAgICAgYmwgICAgIGlkY3Rfcm93X2FybXY1dGUKKyAgICAgICAgYWRkICAgIGExLCBhMSwgIzE2CisgICAgICAgIGJsICAgICBpZGN0X3Jvd19hcm12NXRlCisKKyAgICAgICAgc3ViICAgIGExLCBhMSwgIygxNio3KQorCisgICAgICAgIGJsICAgICBpZGN0X2NvbF9wdXRfYXJtdjV0ZQorICAgICAgICBhZGQgICAgYTEsIGExLCAjNAorICAgICAgICBibCAgICAgaWRjdF9jb2xfcHV0X2FybXY1dGUKKyAgICAgICAgYWRkICAgIGExLCBhMSwgIzQKKyAgICAgICAgYmwgICAgIGlkY3RfY29sX3B1dF9hcm12NXRlCisgICAgICAgIGFkZCAgICBhMSwgYTEsICM0CisgICAgICAgIGJsICAgICBpZGN0X2NvbF9wdXRfYXJtdjV0ZQorCisgICAgICAgIGFkZCAgICBzcCwgc3AsICM4CisgICAgICAgIGxkbWZkICBzcCEsIHt2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgZnAsIHBjfQorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X2FybXY2LlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vc2ltcGxlX2lkY3RfYXJtdjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWNmNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X2FybXY2LlMKQEAgLTAsMCArMSw0MjUgQEAKKy8qCisgKiBTaW1wbGUgSURDVAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDA3IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworI2RlZmluZSBXMSAgMjI3MjUgICAvKiBjb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUgKi8KKyNkZWZpbmUgVzIgIDIxNDA3ICAgLyogY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41ICovCisjZGVmaW5lIFczICAxOTI2NiAgIC8qIGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNSAqLworI2RlZmluZSBXNCAgMTYzODMgICAvKiBjb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUgKi8KKyNkZWZpbmUgVzUgIDEyODczICAgLyogY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41ICovCisjZGVmaW5lIFc2ICA4ODY3ICAgIC8qIGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNSAqLworI2RlZmluZSBXNyAgNDUyMCAgICAvKiBjb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUgKi8KKyNkZWZpbmUgUk9XX1NISUZUIDExCisjZGVmaW5lIENPTF9TSElGVCAyMAorCisjZGVmaW5lIFcxMyAoVzEgfCAoVzMgPDwgMTYpKQorI2RlZmluZSBXMjYgKFcyIHwgKFc2IDw8IDE2KSkKKyNkZWZpbmUgVzQyIChXNCB8IChXMiA8PCAxNikpCisjZGVmaW5lIFc0Mm4gKC1XNCYweGZmZmYgfCAoLVcyIDw8IDE2KSkKKyNkZWZpbmUgVzQ2IChXNCB8IChXNiA8PCAxNikpCisjZGVmaW5lIFc1NyAoVzUgfCAoVzcgPDwgMTYpKQorCisvKgorICBDb21wdXRlIHBhcnRpYWwgSURDVCBvZiBzaW5nbGUgcm93LgorICBzaGlmdCA9IGxlZnQtc2hpZnQgYW1vdW50CisgIHIwID0gc291cmNlIGFkZHJlc3MKKyAgcjIgPSByb3dbMiwwXSA8PSAyIGN5Y2xlcworICByMyA9IHJvd1szLDFdCisgIGlwID0gdzQyICAgICAgPD0gMiBjeWNsZXMKKworICBPdXRwdXQgaW4gcmVnaXN0ZXJzIHI0LS1yMTEKKyovCisgICAgICAgIC5tYWNybyBpZGN0X3JvdyBzaGlmdAorICAgICAgICBsZHIgICAgbHIsID1XNDYgICAgICAgICAgICAgIC8qIGxyICA9IFc0IHwgKFc2IDw8IDE2KSAqLworICAgICAgICBtb3YgICAgcjEsICMoMTw8KFxzaGlmdC0xKSkKKyAgICAgICAgc21sYWQgIHI0LCByMiwgaXAsIHIxCisgICAgICAgIHNtbHNkICByNywgcjIsIGlwLCByMQorICAgICAgICBsZHIgICAgaXAsID1XMTMgICAgICAgICAgICAgIC8qIGlwICA9IFcxIHwgKFczIDw8IDE2KSAqLworICAgICAgICBsZHIgICAgcjEwLD1XNTcgICAgICAgICAgICAgIC8qIHIxMCA9IFc1IHwgKFc3IDw8IDE2KSAqLworICAgICAgICBzbWxhZCAgcjUsIHIyLCBsciwgcjEKKyAgICAgICAgc21sc2QgIHI2LCByMiwgbHIsIHIxCisKKyAgICAgICAgc211YWQgIHI4LCByMywgaXAgICAgICAgICAgICAvKiByOCAgPSAgQjAgPSBXMSpyb3dbMV0gKyBXMypyb3dbM10gKi8KKyAgICAgICAgc211c2R4IHIxMSxyMywgcjEwICAgICAgICAgICAvKiByMTEgPSAgQjMgPSBXNypyb3dbMV0gLSBXNSpyb3dbM10gKi8KKyAgICAgICAgbGRyICAgIGxyLCBbcjAsICMxMl0gICAgICAgICAvKiBsciAgPSAgcm93WzcsNV0gKi8KKyAgICAgICAgcGtodGIgIHIyLCBpcCwgcjEwLGFzciAjMTYgICAvKiByMyAgPSAgVzcgfCAoVzMgPDwgMTYpICovCisgICAgICAgIHBraGJ0ICByMSwgaXAsIHIxMCxsc2wgIzE2ICAgLyogcjEgID0gIFcxIHwgKFc1IDw8IDE2KSAqLworICAgICAgICBzbXVzZHggcjksIHIyLCByMyAgICAgICAgICAgIC8qIHI5ICA9IC1CMSA9IFc3KnJvd1szXSAtIFczKnJvd1sxXSAqLworICAgICAgICBzbWxhZCAgcjgsIGxyLCByMTAscjggICAgICAgIC8qIEIwICArPSAgICAgIFc1KnJvd1s1XSArIFc3KnJvd1s3XSAqLworICAgICAgICBzbXVzZHggcjEwLHIzLCByMSAgICAgICAgICAgIC8qIHIxMCA9ICBCMiA9IFc1KnJvd1sxXSAtIFcxKnJvd1szXSAqLworCisgICAgICAgIGxkciAgICByMywgPVc0Mm4gICAgICAgICAgICAgLyogcjMgPSAgLVc0IHwgKC1XMiA8PCAxNikgKi8KKyAgICAgICAgc21sYWQgIHIxMCxsciwgcjIsIHIxMCAgICAgICAvKiBCMiArPSAgVzcqcm93WzVdICsgVzMqcm93WzddICovCisgICAgICAgIGxkciAgICByMiwgW3IwLCAjNF0gICAgICAgICAgLyogcjIgPSAgIHJvd1s2LDRdICovCisgICAgICAgIHNtbHNkeCByMTEsbHIsIGlwLCByMTEgICAgICAgLyogQjMgKz0gIFczKnJvd1s1XSAtIFcxKnJvd1s3XSAqLworICAgICAgICBsZHIgICAgaXAsID1XNDYgICAgICAgICAgICAgIC8qIGlwID0gICBXNCB8IChXNiA8PCAxNikgKi8KKyAgICAgICAgc21sYWQgIHI5LCBsciwgcjEsIHI5ICAgICAgICAvKiBCMSAtPSAgVzEqcm93WzVdICsgVzUqcm93WzddICovCisKKyAgICAgICAgc21sYWQgIHI1LCByMiwgcjMsIHI1ICAgICAgICAvKiBBMSArPSAtVzQqcm93WzRdIC0gVzIqcm93WzZdICovCisgICAgICAgIHNtbHNkICByNiwgcjIsIHIzLCByNiAgICAgICAgLyogQTIgKz0gLVc0KnJvd1s0XSArIFcyKnJvd1s2XSAqLworICAgICAgICBzbWxhZCAgcjQsIHIyLCBpcCwgcjQgICAgICAgIC8qIEEwICs9ICBXNCpyb3dbNF0gKyBXNipyb3dbNl0gKi8KKyAgICAgICAgc21sc2QgIHI3LCByMiwgaXAsIHI3ICAgICAgICAvKiBBMyArPSAgVzQqcm93WzRdIC0gVzYqcm93WzZdICovCisgICAgICAgIC5lbmRtCisKKy8qCisgIENvbXB1dGUgcGFydGlhbCBJRENUIG9mIGhhbGYgcm93LgorICBzaGlmdCA9IGxlZnQtc2hpZnQgYW1vdW50CisgIHIyID0gcm93WzIsMF0KKyAgcjMgPSByb3dbMywxXQorICBpcCA9IHc0MgorCisgIE91dHB1dCBpbiByZWdpc3RlcnMgcjQtLXIxMQorKi8KKyAgICAgICAgLm1hY3JvIGlkY3Rfcm93NCBzaGlmdAorICAgICAgICBsZHIgICAgbHIsID1XNDYgICAgICAgICAgICAgIC8qIGxyID0gIFc0IHwgKFc2IDw8IDE2KSAqLworICAgICAgICBsZHIgICAgcjEwLD1XNTcgICAgICAgICAgICAgIC8qIHIxMCA9IFc1IHwgKFc3IDw8IDE2KSAqLworICAgICAgICBtb3YgICAgcjEsICMoMTw8KFxzaGlmdC0xKSkKKyAgICAgICAgc21sYWQgIHI0LCByMiwgaXAsIHIxCisgICAgICAgIHNtbHNkICByNywgcjIsIGlwLCByMQorICAgICAgICBsZHIgICAgaXAsID1XMTMgICAgICAgICAgICAgIC8qIGlwID0gIFcxIHwgKFczIDw8IDE2KSAqLworICAgICAgICBzbWxhZCAgcjUsIHIyLCBsciwgcjEKKyAgICAgICAgc21sc2QgIHI2LCByMiwgbHIsIHIxCisgICAgICAgIHNtdXNkeCByMTEscjMsIHIxMCAgICAgICAgICAgLyogcjExID0gIEIzID0gVzcqcm93WzFdIC0gVzUqcm93WzNdICovCisgICAgICAgIHNtdWFkICByOCwgcjMsIGlwICAgICAgICAgICAgLyogcjggID0gIEIwID0gVzEqcm93WzFdICsgVzMqcm93WzNdICovCisgICAgICAgIHBraHRiICByMiwgaXAsIHIxMCxhc3IgIzE2ICAgLyogcjMgID0gIFc3IHwgKFczIDw8IDE2KSAqLworICAgICAgICBwa2hidCAgcjEsIGlwLCByMTAsbHNsICMxNiAgIC8qIHIxICA9ICBXMSB8IChXNSA8PCAxNikgKi8KKyAgICAgICAgc211c2R4IHI5LCByMiwgcjMgICAgICAgICAgICAvKiByOSAgPSAtQjEgPSBXNypyb3dbM10gLSBXMypyb3dbMV0gKi8KKyAgICAgICAgc211c2R4IHIxMCxyMywgcjEgICAgICAgICAgICAvKiByMTAgPSAgQjIgPSBXNSpyb3dbMV0gLSBXMSpyb3dbM10gKi8KKyAgICAgICAgLmVuZG0KKworLyoKKyAgQ29tcHV0ZSBmaW5hbCBwYXJ0IG9mIElEQ1Qgc2luZ2xlIHJvdyB3aXRob3V0IHNoaWZ0LgorICBJbnB1dCBpbiByZWdpc3RlcnMgcjQtLXIxMQorICBPdXRwdXQgaW4gcmVnaXN0ZXJzIGlwLCByNC0tcjYsIGxyLCByOC0tcjEwCisqLworICAgICAgICAubWFjcm8gaWRjdF9maW5pc2gKKyAgICAgICAgYWRkICAgIGlwLCByNCwgcjggICAgICAgICAgICAvKiByMSA9IEEwICsgQjAgKi8KKyAgICAgICAgc3ViICAgIGxyLCByNCwgcjggICAgICAgICAgICAvKiByMiA9IEEwIC0gQjAgKi8KKyAgICAgICAgc3ViICAgIHI0LCByNSwgcjkgICAgICAgICAgICAvKiByMiA9IEExICsgQjEgKi8KKyAgICAgICAgYWRkICAgIHI4LCByNSwgcjkgICAgICAgICAgICAvKiByMiA9IEExIC0gQjEgKi8KKyAgICAgICAgYWRkICAgIHI1LCByNiwgcjEwICAgICAgICAgICAvKiByMSA9IEEyICsgQjIgKi8KKyAgICAgICAgc3ViICAgIHI5LCByNiwgcjEwICAgICAgICAgICAvKiByMSA9IEEyIC0gQjIgKi8KKyAgICAgICAgYWRkICAgIHI2LCByNywgcjExICAgICAgICAgICAvKiByMiA9IEEzICsgQjMgKi8KKyAgICAgICAgc3ViICAgIHIxMCxyNywgcjExICAgICAgICAgICAvKiByMiA9IEEzIC0gQjMgKi8KKyAgICAgICAgLmVuZG0KKworLyoKKyAgQ29tcHV0ZSBmaW5hbCBwYXJ0IG9mIElEQ1Qgc2luZ2xlIHJvdy4KKyAgc2hpZnQgPSByaWdodC1zaGlmdCBhbW91bnQKKyAgSW5wdXQvb3V0cHV0IGluIHJlZ2lzdGVycyByNC0tcjExCisqLworICAgICAgICAubWFjcm8gaWRjdF9maW5pc2hfc2hpZnQgc2hpZnQKKyAgICAgICAgYWRkICAgIHIzLCByNCwgcjggICAgICAgICAgICAvKiByMyA9IEEwICsgQjAgKi8KKyAgICAgICAgc3ViICAgIHIyLCByNCwgcjggICAgICAgICAgICAvKiByMiA9IEEwIC0gQjAgKi8KKyAgICAgICAgbW92ICAgIHI0LCByMywgYXNyICNcc2hpZnQKKyAgICAgICAgbW92ICAgIHI4LCByMiwgYXNyICNcc2hpZnQKKworICAgICAgICBzdWIgICAgcjMsIHI1LCByOSAgICAgICAgICAgIC8qIHIzID0gQTEgKyBCMSAqLworICAgICAgICBhZGQgICAgcjIsIHI1LCByOSAgICAgICAgICAgIC8qIHIyID0gQTEgLSBCMSAqLworICAgICAgICBtb3YgICAgcjUsIHIzLCBhc3IgI1xzaGlmdAorICAgICAgICBtb3YgICAgcjksIHIyLCBhc3IgI1xzaGlmdAorCisgICAgICAgIGFkZCAgICByMywgcjYsIHIxMCAgICAgICAgICAgLyogcjMgPSBBMiArIEIyICovCisgICAgICAgIHN1YiAgICByMiwgcjYsIHIxMCAgICAgICAgICAgLyogcjIgPSBBMiAtIEIyICovCisgICAgICAgIG1vdiAgICByNiwgcjMsIGFzciAjXHNoaWZ0CisgICAgICAgIG1vdiAgICByMTAscjIsIGFzciAjXHNoaWZ0CisKKyAgICAgICAgYWRkICAgIHIzLCByNywgcjExICAgICAgICAgICAvKiByMyA9IEEzICsgQjMgKi8KKyAgICAgICAgc3ViICAgIHIyLCByNywgcjExICAgICAgICAgICAvKiByMiA9IEEzIC0gQjMgKi8KKyAgICAgICAgbW92ICAgIHI3LCByMywgYXNyICNcc2hpZnQKKyAgICAgICAgbW92ICAgIHIxMSxyMiwgYXNyICNcc2hpZnQKKyAgICAgICAgLmVuZG0KKworLyoKKyAgQ29tcHV0ZSBmaW5hbCBwYXJ0IG9mIElEQ1Qgc2luZ2xlIHJvdywgc2F0dXJhdGluZyByZXN1bHRzIGF0IDggYml0cy4KKyAgc2hpZnQgPSByaWdodC1zaGlmdCBhbW91bnQKKyAgSW5wdXQvb3V0cHV0IGluIHJlZ2lzdGVycyByNC0tcjExCisqLworICAgICAgICAubWFjcm8gaWRjdF9maW5pc2hfc2hpZnRfc2F0IHNoaWZ0CisgICAgICAgIGFkZCAgICByMywgcjQsIHI4ICAgICAgICAgICAgLyogcjMgPSBBMCArIEIwICovCisgICAgICAgIHN1YiAgICBpcCwgcjQsIHI4ICAgICAgICAgICAgLyogaXAgPSBBMCAtIEIwICovCisgICAgICAgIHVzYXQgICByNCwgIzgsIHIzLCBhc3IgI1xzaGlmdAorICAgICAgICB1c2F0ICAgcjgsICM4LCBpcCwgYXNyICNcc2hpZnQKKworICAgICAgICBzdWIgICAgcjMsIHI1LCByOSAgICAgICAgICAgIC8qIHIzID0gQTEgKyBCMSAqLworICAgICAgICBhZGQgICAgaXAsIHI1LCByOSAgICAgICAgICAgIC8qIGlwID0gQTEgLSBCMSAqLworICAgICAgICB1c2F0ICAgcjUsICM4LCByMywgYXNyICNcc2hpZnQKKyAgICAgICAgdXNhdCAgIHI5LCAjOCwgaXAsIGFzciAjXHNoaWZ0CisKKyAgICAgICAgYWRkICAgIHIzLCByNiwgcjEwICAgICAgICAgICAvKiByMyA9IEEyICsgQjIgKi8KKyAgICAgICAgc3ViICAgIGlwLCByNiwgcjEwICAgICAgICAgICAvKiBpcCA9IEEyIC0gQjIgKi8KKyAgICAgICAgdXNhdCAgIHI2LCAjOCwgcjMsIGFzciAjXHNoaWZ0CisgICAgICAgIHVzYXQgICByMTAsIzgsIGlwLCBhc3IgI1xzaGlmdAorCisgICAgICAgIGFkZCAgICByMywgcjcsIHIxMSAgICAgICAgICAgLyogcjMgPSBBMyArIEIzICovCisgICAgICAgIHN1YiAgICBpcCwgcjcsIHIxMSAgICAgICAgICAgLyogaXAgPSBBMyAtIEIzICovCisgICAgICAgIHVzYXQgICByNywgIzgsIHIzLCBhc3IgI1xzaGlmdAorICAgICAgICB1c2F0ICAgcjExLCM4LCBpcCwgYXNyICNcc2hpZnQKKyAgICAgICAgLmVuZG0KKworLyoKKyAgQ29tcHV0ZSBJRENUIG9mIHNpbmdsZSByb3csIHN0b3JpbmcgYXMgY29sdW1uLgorICByMCA9IHNvdXJjZQorICByMSA9IGRlc3QKKyovCitmdW5jdGlvbiBpZGN0X3Jvd19hcm12NgorICAgICAgICBwdXNoICAge2xyfQorCisgICAgICAgIGxkciAgICBsciwgW3IwLCAjMTJdICAgICAgICAgLyogbHIgPSByb3dbNyw1XSAqLworICAgICAgICBsZHIgICAgaXAsIFtyMCwgIzRdICAgICAgICAgIC8qIGlwID0gcm93WzYsNF0gKi8KKyAgICAgICAgbGRyICAgIHIzLCBbcjAsICM4XSAgICAgICAgICAvKiByMyA9IHJvd1szLDFdICovCisgICAgICAgIGxkciAgICByMiwgW3IwXSAgICAgICAgICAgICAgLyogcjIgPSByb3dbMiwwXSAqLworICAgICAgICBvcnJzICAgbHIsIGxyLCBpcAorICAgICAgICBpdHQgICAgZXEKKyAgICAgICAgY21wZXEgIGxyLCByMworICAgICAgICBjbXBlcSAgbHIsIHIyLCBsc3IgIzE2CisgICAgICAgIGJlcSAgICAxZgorICAgICAgICBwdXNoICAge3IxfQorICAgICAgICBsZHIgICAgaXAsID1XNDIgICAgICAgICAgICAgIC8qIGlwID0gVzQgfCAoVzIgPDwgMTYpICovCisgICAgICAgIGNtcCAgICBsciwgIzAKKyAgICAgICAgYmVxICAgIDJmCisKKyAgICAgICAgaWRjdF9yb3cgICBST1dfU0hJRlQKKyAgICAgICAgYiAgICAgIDNmCisKKzI6ICAgICAgaWRjdF9yb3c0ICBST1dfU0hJRlQKKworMzogICAgICBwb3AgICAge3IxfQorICAgICAgICBpZGN0X2ZpbmlzaF9zaGlmdCBST1dfU0hJRlQKKworICAgICAgICBzdHJoICAgcjQsIFtyMV0KKyAgICAgICAgc3RyaCAgIHI1LCBbcjEsICMoMTYqMildCisgICAgICAgIHN0cmggICByNiwgW3IxLCAjKDE2KjQpXQorICAgICAgICBzdHJoICAgcjcsIFtyMSwgIygxNio2KV0KKyAgICAgICAgc3RyaCAgIHIxMSxbcjEsICMoMTYqMSldCisgICAgICAgIHN0cmggICByMTAsW3IxLCAjKDE2KjMpXQorICAgICAgICBzdHJoICAgcjksIFtyMSwgIygxNio1KV0KKyAgICAgICAgc3RyaCAgIHI4LCBbcjEsICMoMTYqNyldCisKKyAgICAgICAgcG9wICAgIHtwY30KKworMTogICAgICBtb3YgICAgcjIsIHIyLCBsc2wgIzMKKyAgICAgICAgc3RyaCAgIHIyLCBbcjFdCisgICAgICAgIHN0cmggICByMiwgW3IxLCAjKDE2KjIpXQorICAgICAgICBzdHJoICAgcjIsIFtyMSwgIygxNio0KV0KKyAgICAgICAgc3RyaCAgIHIyLCBbcjEsICMoMTYqNildCisgICAgICAgIHN0cmggICByMiwgW3IxLCAjKDE2KjEpXQorICAgICAgICBzdHJoICAgcjIsIFtyMSwgIygxNiozKV0KKyAgICAgICAgc3RyaCAgIHIyLCBbcjEsICMoMTYqNSldCisgICAgICAgIHN0cmggICByMiwgW3IxLCAjKDE2KjcpXQorICAgICAgICBwb3AgICAge3BjfQorZW5kZnVuYworCisvKgorICBDb21wdXRlIElEQ1Qgb2Ygc2luZ2xlIGNvbHVtbiwgcmVhZCBhcyByb3cuCisgIHIwID0gc291cmNlCisgIHIxID0gZGVzdAorKi8KK2Z1bmN0aW9uIGlkY3RfY29sX2FybXY2CisgICAgICAgIHB1c2ggICB7cjEsIGxyfQorCisgICAgICAgIGxkciAgICByMiwgW3IwXSAgICAgICAgICAgICAgLyogcjIgPSByb3dbMiwwXSAqLworICAgICAgICBsZHIgICAgaXAsID1XNDIgICAgICAgICAgICAgIC8qIGlwID0gVzQgfCAoVzIgPDwgMTYpICovCisgICAgICAgIGxkciAgICByMywgW3IwLCAjOF0gICAgICAgICAgLyogcjMgPSByb3dbMywxXSAqLworICAgICAgICBpZGN0X3JvdyBDT0xfU0hJRlQKKyAgICAgICAgcG9wICAgIHtyMX0KKyAgICAgICAgaWRjdF9maW5pc2hfc2hpZnQgQ09MX1NISUZUCisKKyAgICAgICAgc3RyaCAgIHI0LCBbcjFdCisgICAgICAgIHN0cmggICByNSwgW3IxLCAjKDE2KjEpXQorICAgICAgICBzdHJoICAgcjYsIFtyMSwgIygxNioyKV0KKyAgICAgICAgc3RyaCAgIHI3LCBbcjEsICMoMTYqMyldCisgICAgICAgIHN0cmggICByMTEsW3IxLCAjKDE2KjQpXQorICAgICAgICBzdHJoICAgcjEwLFtyMSwgIygxNio1KV0KKyAgICAgICAgc3RyaCAgIHI5LCBbcjEsICMoMTYqNildCisgICAgICAgIHN0cmggICByOCwgW3IxLCAjKDE2KjcpXQorCisgICAgICAgIHBvcCAgICB7cGN9CitlbmRmdW5jCisKKy8qCisgIENvbXB1dGUgSURDVCBvZiBzaW5nbGUgY29sdW1uLCByZWFkIGFzIHJvdywgc3RvcmUgc2F0dXJhdGVkIDgtYml0LgorICByMCA9IHNvdXJjZQorICByMSA9IGRlc3QKKyAgcjIgPSBsaW5lIHNpemUKKyovCitmdW5jdGlvbiBpZGN0X2NvbF9wdXRfYXJtdjYKKyAgICAgICAgcHVzaCAgIHtyMSwgcjIsIGxyfQorCisgICAgICAgIGxkciAgICByMiwgW3IwXSAgICAgICAgICAgICAgLyogcjIgPSByb3dbMiwwXSAqLworICAgICAgICBsZHIgICAgaXAsID1XNDIgICAgICAgICAgICAgIC8qIGlwID0gVzQgfCAoVzIgPDwgMTYpICovCisgICAgICAgIGxkciAgICByMywgW3IwLCAjOF0gICAgICAgICAgLyogcjMgPSByb3dbMywxXSAqLworICAgICAgICBpZGN0X3JvdyBDT0xfU0hJRlQKKyAgICAgICAgcG9wICAgIHtyMSwgcjJ9CisgICAgICAgIGlkY3RfZmluaXNoX3NoaWZ0X3NhdCBDT0xfU0hJRlQKKworICAgICAgICBzdHJiX3Bvc3QgcjQsIHIxLCByMgorICAgICAgICBzdHJiX3Bvc3QgcjUsIHIxLCByMgorICAgICAgICBzdHJiX3Bvc3QgcjYsIHIxLCByMgorICAgICAgICBzdHJiX3Bvc3QgcjcsIHIxLCByMgorICAgICAgICBzdHJiX3Bvc3QgcjExLHIxLCByMgorICAgICAgICBzdHJiX3Bvc3QgcjEwLHIxLCByMgorICAgICAgICBzdHJiX3Bvc3QgcjksIHIxLCByMgorICAgICAgICBzdHJiX3Bvc3QgcjgsIHIxLCByMgorCisgICAgICAgIHN1YiAgICByMSwgcjEsIHIyLCBsc2wgIzMKKworICAgICAgICBwb3AgICAge3BjfQorZW5kZnVuYworCisvKgorICBDb21wdXRlIElEQ1Qgb2Ygc2luZ2xlIGNvbHVtbiwgcmVhZCBhcyByb3csIGFkZC9zdG9yZSBzYXR1cmF0ZWQgOC1iaXQuCisgIHIwID0gc291cmNlCisgIHIxID0gZGVzdAorICByMiA9IGxpbmUgc2l6ZQorKi8KK2Z1bmN0aW9uIGlkY3RfY29sX2FkZF9hcm12NgorICAgICAgICBwdXNoICAge3IxLCByMiwgbHJ9CisKKyAgICAgICAgbGRyICAgIHIyLCBbcjBdICAgICAgICAgICAgICAvKiByMiA9IHJvd1syLDBdICovCisgICAgICAgIGxkciAgICBpcCwgPVc0MiAgICAgICAgICAgICAgLyogaXAgPSBXNCB8IChXMiA8PCAxNikgKi8KKyAgICAgICAgbGRyICAgIHIzLCBbcjAsICM4XSAgICAgICAgICAvKiByMyA9IHJvd1szLDFdICovCisgICAgICAgIGlkY3Rfcm93IENPTF9TSElGVAorICAgICAgICBwb3AgICAge3IxLCByMn0KKyAgICAgICAgaWRjdF9maW5pc2gKKworICAgICAgICBsZHJiICAgcjMsIFtyMV0KKyAgICAgICAgbGRyYiAgIHI3LCBbcjEsIHIyXQorICAgICAgICBsZHJiICAgcjExLFtyMSwgcjIsIGxzbCAjMl0KKyAgICAgICAgYWRkICAgIGlwLCByMywgaXAsIGFzciAjQ09MX1NISUZUCisgICAgICAgIHVzYXQgICBpcCwgIzgsIGlwCisgICAgICAgIGFkZCAgICByNCwgcjcsIHI0LCBhc3IgI0NPTF9TSElGVAorICAgICAgICBzdHJiX3Bvc3QgaXAsIHIxLCByMgorICAgICAgICBsZHJiICAgaXAsIFtyMSwgcjJdCisgICAgICAgIHVzYXQgICByNCwgIzgsIHI0CisgICAgICAgIGxkcmIgICByMTEsW3IxLCByMiwgbHNsICMyXQorICAgICAgICBhZGQgICAgcjUsIGlwLCByNSwgYXNyICNDT0xfU0hJRlQKKyAgICAgICAgdXNhdCAgIHI1LCAjOCwgcjUKKyAgICAgICAgc3RyYl9wb3N0IHI0LCByMSwgcjIKKyAgICAgICAgbGRyYiAgIHIzLCBbcjEsIHIyXQorICAgICAgICBsZHJiICAgaXAsIFtyMSwgcjIsIGxzbCAjMl0KKyAgICAgICAgc3RyYl9wb3N0IHI1LCByMSwgcjIKKyAgICAgICAgbGRyYiAgIHI3LCBbcjEsIHIyXQorICAgICAgICBsZHJiICAgcjQsIFtyMSwgcjIsIGxzbCAjMl0KKyAgICAgICAgYWRkICAgIHI2LCByMywgcjYsIGFzciAjQ09MX1NISUZUCisgICAgICAgIHVzYXQgICByNiwgIzgsIHI2CisgICAgICAgIGFkZCAgICByMTAscjcsIHIxMCxhc3IgI0NPTF9TSElGVAorICAgICAgICB1c2F0ICAgcjEwLCM4LCByMTAKKyAgICAgICAgYWRkICAgIHI5LCByMTEscjksIGFzciAjQ09MX1NISUZUCisgICAgICAgIHVzYXQgICByOSwgIzgsIHI5CisgICAgICAgIGFkZCAgICByOCwgaXAsIHI4LCBhc3IgI0NPTF9TSElGVAorICAgICAgICB1c2F0ICAgcjgsICM4LCByOAorICAgICAgICBhZGQgICAgbHIsIHI0LCBsciwgYXNyICNDT0xfU0hJRlQKKyAgICAgICAgdXNhdCAgIGxyLCAjOCwgbHIKKyAgICAgICAgc3RyYl9wb3N0IHI2LCByMSwgcjIKKyAgICAgICAgc3RyYl9wb3N0IHIxMCxyMSwgcjIKKyAgICAgICAgc3RyYl9wb3N0IHI5LCByMSwgcjIKKyAgICAgICAgc3RyYl9wb3N0IHI4LCByMSwgcjIKKyAgICAgICAgc3RyYl9wb3N0IGxyLCByMSwgcjIKKworICAgICAgICBzdWIgICAgcjEsIHIxLCByMiwgbHNsICMzCisKKyAgICAgICAgcG9wICAgIHtwY30KK2VuZGZ1bmMKKworLyoKKyAgQ29tcHV0ZSA4IElEQ1Qgcm93IHRyYW5zZm9ybXMuCisgIGZ1bmMgPSBJRENUIHJvdy0+Y29sIGZ1bmN0aW9uCisgIHdpZHRoID0gd2lkdGggb2YgY29sdW1ucyBpbiBieXRlcworKi8KKyAgICAgICAgLm1hY3JvIGlkY3Rfcm93cyBmdW5jIHdpZHRoCisgICAgICAgIGJsICAgICBcZnVuYworICAgICAgICBhZGQgICAgcjAsIHIwLCAjKDE2KjIpCisgICAgICAgIGFkZCAgICByMSwgcjEsICNcd2lkdGgKKyAgICAgICAgYmwgICAgIFxmdW5jCisgICAgICAgIGFkZCAgICByMCwgcjAsICMoMTYqMikKKyAgICAgICAgYWRkICAgIHIxLCByMSwgI1x3aWR0aAorICAgICAgICBibCAgICAgXGZ1bmMKKyAgICAgICAgYWRkICAgIHIwLCByMCwgIygxNioyKQorICAgICAgICBhZGQgICAgcjEsIHIxLCAjXHdpZHRoCisgICAgICAgIGJsICAgICBcZnVuYworICAgICAgICBzdWIgICAgcjAsIHIwLCAjKDE2KjUpCisgICAgICAgIGFkZCAgICByMSwgcjEsICNcd2lkdGgKKyAgICAgICAgYmwgICAgIFxmdW5jCisgICAgICAgIGFkZCAgICByMCwgcjAsICMoMTYqMikKKyAgICAgICAgYWRkICAgIHIxLCByMSwgI1x3aWR0aAorICAgICAgICBibCAgICAgXGZ1bmMKKyAgICAgICAgYWRkICAgIHIwLCByMCwgIygxNioyKQorICAgICAgICBhZGQgICAgcjEsIHIxLCAjXHdpZHRoCisgICAgICAgIGJsICAgICBcZnVuYworICAgICAgICBhZGQgICAgcjAsIHIwLCAjKDE2KjIpCisgICAgICAgIGFkZCAgICByMSwgcjEsICNcd2lkdGgKKyAgICAgICAgYmwgICAgIFxmdW5jCisKKyAgICAgICAgc3ViICAgIHIwLCByMCwgIygxNio3KQorICAgICAgICAuZW5kbQorCisvKiB2b2lkIGZmX3NpbXBsZV9pZGN0X2FybXY2KGludDE2X3QgKmRhdGEpOyAqLworZnVuY3Rpb24gZmZfc2ltcGxlX2lkY3RfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICB7cjQtcjExLCBscn0KKyAgICAgICAgc3ViICAgIHNwLCBzcCwgIzEyOAorCisgICAgICAgIG1vdiAgICByMSwgc3AKKyAgICAgICAgaWRjdF9yb3dzIGlkY3Rfcm93X2FybXY2LCAyCisgICAgICAgIG1vdiAgICByMSwgcjAKKyAgICAgICAgbW92ICAgIHIwLCBzcAorICAgICAgICBpZGN0X3Jvd3MgaWRjdF9jb2xfYXJtdjYsIDIKKworICAgICAgICBhZGQgICAgc3AsIHNwLCAjMTI4CisgICAgICAgIHBvcCAgICB7cjQtcjExLCBwY30KK2VuZGZ1bmMKKworLyogZmZfc2ltcGxlX2lkY3RfYWRkX2FybXY2KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmRhdGEpOyAqLworZnVuY3Rpb24gZmZfc2ltcGxlX2lkY3RfYWRkX2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwdXNoICAge3IwLCByMSwgcjQtcjExLCBscn0KKyAgICAgICAgc3ViICAgIHNwLCBzcCwgIzEyOAorCisgICAgICAgIG1vdiAgICByMCwgcjIKKyAgICAgICAgbW92ICAgIHIxLCBzcAorICAgICAgICBpZGN0X3Jvd3MgaWRjdF9yb3dfYXJtdjYsIDIKKyAgICAgICAgbW92ICAgIHIwLCBzcAorICAgICAgICBsZHIgICAgcjEsIFtzcCwgIzEyOF0KKyAgICAgICAgbGRyICAgIHIyLCBbc3AsICMoMTI4KzQpXQorICAgICAgICBpZGN0X3Jvd3MgaWRjdF9jb2xfYWRkX2FybXY2LCAxCisKKyAgICAgICAgYWRkICAgIHNwLCBzcCwgIygxMjgrOCkKKyAgICAgICAgcG9wICAgIHtyNC1yMTEsIHBjfQorZW5kZnVuYworCisvKiBmZl9zaW1wbGVfaWRjdF9wdXRfYXJtdjYodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqZGF0YSk7ICovCitmdW5jdGlvbiBmZl9zaW1wbGVfaWRjdF9wdXRfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICB7cjAsIHIxLCByNC1yMTEsIGxyfQorICAgICAgICBzdWIgICAgc3AsIHNwLCAjMTI4CisKKyAgICAgICAgbW92ICAgIHIwLCByMgorICAgICAgICBtb3YgICAgcjEsIHNwCisgICAgICAgIGlkY3Rfcm93cyBpZGN0X3Jvd19hcm12NiwgMgorICAgICAgICBtb3YgICAgcjAsIHNwCisgICAgICAgIGxkciAgICByMSwgW3NwLCAjMTI4XQorICAgICAgICBsZHIgICAgcjIsIFtzcCwgIygxMjgrNCldCisgICAgICAgIGlkY3Rfcm93cyBpZGN0X2NvbF9wdXRfYXJtdjYsIDEKKworICAgICAgICBhZGQgICAgc3AsIHNwLCAjKDEyOCs4KQorICAgICAgICBwb3AgICAge3I0LXIxMSwgcGN9CitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vc2ltcGxlX2lkY3RfbmVvbi5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2U1NzNjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X25lb24uUwpAQCAtMCwwICsxLDM3NSBAQAorLyoKKyAqIEFSTSBORU9OIElEQ1QKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogQmFzZWQgb24gU2ltcGxlIElEQ1QKKyAqIENvcHlyaWdodCAoYykgMjAwMSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworI2RlZmluZSBXMSAgMjI3MjUgIC8vY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41CisjZGVmaW5lIFcyICAyMTQwNyAgLy9jb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUKKyNkZWZpbmUgVzMgIDE5MjY2ICAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBXNCAgMTYzODMgIC8vY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41CisjZGVmaW5lIFc1ICAxMjg3MyAgLy9jb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUKKyNkZWZpbmUgVzYgIDg4NjcgICAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBXNyAgNDUyMCAgIC8vY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41CisjZGVmaW5lIFc0YyAoKDE8PChDT0xfU0hJRlQtMSkpL1c0KQorI2RlZmluZSBST1dfU0hJRlQgMTEKKyNkZWZpbmUgQ09MX1NISUZUIDIwCisKKyNkZWZpbmUgdzEgZDBbMF0KKyNkZWZpbmUgdzIgZDBbMV0KKyNkZWZpbmUgdzMgZDBbMl0KKyNkZWZpbmUgdzQgZDBbM10KKyNkZWZpbmUgdzUgZDFbMF0KKyNkZWZpbmUgdzYgZDFbMV0KKyNkZWZpbmUgdzcgZDFbMl0KKyNkZWZpbmUgdzRjIGQxWzNdCisKKyAgICAgICAgLm1hY3JvIGlkY3RfY29sNF90b3AKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE3LCAgZDYsICB3MiAgICAvKiBxOSAgID0gVzIgKiBjb2xbMl0gKi8KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE4LCAgZDYsICB3NiAgICAvKiBxMTAgID0gVzYgKiBjb2xbMl0gKi8KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE5LCAgZDQsICB3MSAgICAvKiBxOSAgID0gVzEgKiBjb2xbMV0gKi8KKyAgICAgICAgdmFkZC5pMzIgICAgICAgIHExMSwgcTE1LCBxNworICAgICAgICB2bXVsbC5zMTYgICAgICAgcTEwLCBkNCwgIHczICAgIC8qIHExMCAgPSBXMyAqIGNvbFsxXSAqLworICAgICAgICB2YWRkLmkzMiAgICAgICAgcTEyLCBxMTUsIHE4CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxNSwgIGQ0LCAgdzUgICAgLyogcTUgICA9IFc1ICogY29sWzFdICovCisgICAgICAgIHZzdWIuaTMyICAgICAgICBxMTMsIHExNSwgcTgKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE2LCAgZDQsICB3NyAgICAvKiBxNiAgID0gVzcgKiBjb2xbMV0gKi8KKyAgICAgICAgdnN1Yi5pMzIgICAgICAgIHExNCwgcTE1LCBxNworCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxOSwgIGQ4LCAgdzMgICAgLyogcTkgICs9IFczICogY29sWzNdICovCisgICAgICAgIHZtbHNsLnMxNiAgICAgICBxMTAsIGQ4LCAgdzcgICAgLyogcTEwIC09IFc3ICogY29sWzNdICovCisgICAgICAgIHZtbHNsLnMxNiAgICAgICBxNSwgIGQ4LCAgdzEgICAgLyogcTUgIC09IFcxICogY29sWzNdICovCisgICAgICAgIHZtbHNsLnMxNiAgICAgICBxNiwgIGQ4LCAgdzUgICAgLyogcTYgIC09IFc1ICogY29sWzNdICovCisgICAgICAgIC5lbmRtCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgLmFsaWduIDYKKworZnVuY3Rpb24gaWRjdF9yb3c0X3BsZF9uZW9uCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjBdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIwLCAgcjEsICBsc2wgIzIKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMCwgcjFdCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjAsIHIxLCBsc2wgIzFdCitBICAgICAgIHBsZCAgICAgICAgICAgICBbcjMsIC1yMV0KKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyM10KKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMywgcjFdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIzLCAgcjEsICBsc2wgIzEKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyM10KKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMywgcjFdCitlbmRmdW5jCisKK2Z1bmN0aW9uIGlkY3Rfcm93NF9uZW9uCisgICAgICAgIHZtb3YuaTMyICAgICAgICBxMTUsICMoMTw8KFJPV19TSElGVC0xKSkKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMi1kNX0sICBbcjIsOjEyOF0hCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxMTUsIGQyLCAgdzQgICAgLyogcTE1ICArPSBXNCAqIGNvbFswXSAqLworICAgICAgICB2bGQxLjY0ICAgICAgICAge2Q2LGQ3fSwgIFtyMiw6MTI4XSEKKyAgICAgICAgdm9yciAgICAgICAgICAgIGQxMCwgZDMsICBkNQorICAgICAgICB2bGQxLjY0ICAgICAgICAge2Q4LGQ5fSwgIFtyMiw6MTI4XSEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICAjLTY0CisKKyAgICAgICAgdm9yciAgICAgICAgICAgIGQxMSwgZDcsICBkOQorICAgICAgICB2b3JyICAgICAgICAgICAgZDEwLCBkMTAsIGQxMQorICAgICAgICB2bW92ICAgICAgICAgICAgcjMsICByNCwgIGQxMAorCisgICAgICAgIGlkY3RfY29sNF90b3AKKworICAgICAgICBvcnJzICAgICAgICAgICAgcjMsICByMywgIHI0CisgICAgICAgIGJlcSAgICAgICAgICAgICAxZgorCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxNywgIGQzLCAgdzQgICAgLyogcTcgICA9IFc0ICogY29sWzRdICovCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxOSwgIGQ1LCAgdzUgICAgLyogcTkgICs9IFc1ICogY29sWzVdICovCisgICAgICAgIHZtbHNsLnMxNiAgICAgICBxMTAsIGQ1LCAgdzEgICAgLyogcTEwIC09IFcxICogY29sWzVdICovCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxOCwgIGQ3LCAgdzIgICAgLyogcTggICA9IFcyICogY29sWzZdICovCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxNSwgIGQ1LCAgdzcgICAgLyogcTUgICs9IFc3ICogY29sWzVdICovCisgICAgICAgIHZhZGQuaTMyICAgICAgICBxMTEsIHExMSwgcTcKKyAgICAgICAgdnN1Yi5pMzIgICAgICAgIHExMiwgcTEyLCBxNworICAgICAgICB2c3ViLmkzMiAgICAgICAgcTEzLCBxMTMsIHE3CisgICAgICAgIHZhZGQuaTMyICAgICAgICBxMTQsIHExNCwgcTcKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHE2LCAgZDUsICB3MyAgICAvKiBxNiAgKz0gVzMgKiBjb2xbNV0gKi8KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE3LCAgZDcsICB3NiAgICAvKiBxNyAgID0gVzYgKiBjb2xbNl0gKi8KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHE5LCAgZDksICB3NworICAgICAgICB2bWxzbC5zMTYgICAgICAgcTEwLCBkOSwgIHc1CisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxNSwgIGQ5LCAgdzMKKyAgICAgICAgdm1sc2wuczE2ICAgICAgIHE2LCAgZDksICB3MQorICAgICAgICB2YWRkLmkzMiAgICAgICAgcTExLCBxMTEsIHE3CisgICAgICAgIHZzdWIuaTMyICAgICAgICBxMTIsIHExMiwgcTgKKyAgICAgICAgdmFkZC5pMzIgICAgICAgIHExMywgcTEzLCBxOAorICAgICAgICB2c3ViLmkzMiAgICAgICAgcTE0LCBxMTQsIHE3CisKKzE6ICAgICAgdmFkZC5pMzIgICAgICAgIHEzLCAgcTExLCBxOQorICAgICAgICB2YWRkLmkzMiAgICAgICAgcTQsICBxMTIsIHExMAorICAgICAgICB2c2hybi5pMzIgICAgICAgZDIsICBxMywgICNST1dfU0hJRlQKKyAgICAgICAgdnNocm4uaTMyICAgICAgIGQ0LCAgcTQsICAjUk9XX1NISUZUCisgICAgICAgIHZhZGQuaTMyICAgICAgICBxNywgIHExMywgcTUKKyAgICAgICAgdmFkZC5pMzIgICAgICAgIHE4LCAgcTE0LCBxNgorICAgICAgICB2dHJuLjE2ICAgICAgICAgZDIsICBkNAorICAgICAgICB2c2hybi5pMzIgICAgICAgZDYsICBxNywgICNST1dfU0hJRlQKKyAgICAgICAgdnNocm4uaTMyICAgICAgIGQ4LCAgcTgsICAjUk9XX1NISUZUCisgICAgICAgIHZzdWIuaTMyICAgICAgICBxMTQsIHExNCwgcTYKKyAgICAgICAgdnN1Yi5pMzIgICAgICAgIHExMSwgcTExLCBxOQorICAgICAgICB2dHJuLjE2ICAgICAgICAgZDYsICBkOAorICAgICAgICB2c3ViLmkzMiAgICAgICAgcTEzLCBxMTMsIHE1CisgICAgICAgIHZzaHJuLmkzMiAgICAgICBkMywgIHExNCwgI1JPV19TSElGVAorICAgICAgICB2dHJuLjMyICAgICAgICAgZDIsICBkNgorICAgICAgICB2c3ViLmkzMiAgICAgICAgcTEyLCBxMTIsIHExMAorICAgICAgICB2dHJuLjMyICAgICAgICAgZDQsICBkOAorICAgICAgICB2c2hybi5pMzIgICAgICAgZDUsICBxMTMsICNST1dfU0hJRlQKKyAgICAgICAgdnNocm4uaTMyICAgICAgIGQ3LCAgcTEyLCAjUk9XX1NISUZUCisgICAgICAgIHZzaHJuLmkzMiAgICAgICBkOSwgIHExMSwgI1JPV19TSElGVAorCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBkMywgIGQ1CisgICAgICAgIHZ0cm4uMTYgICAgICAgICBkNywgIGQ5CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkMywgIGQ3CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBkNSwgIGQ5CisKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMi1kNX0sICBbcjIsOjEyOF0hCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDYtZDl9LCAgW3IyLDoxMjhdIQorCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0X2NvbDRfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgaXAsICAjMTYKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMn0sIFtyMiw6NjRdLCBpcCAvKiBkMiA9IGNvbFswXSAqLworICAgICAgICB2ZHVwLjE2ICAgICAgICAgZDMwLCB3NGMKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkNH0sIFtyMiw6NjRdLCBpcCAvKiBkMyA9IGNvbFsxXSAqLworICAgICAgICB2YWRkLmkxNiAgICAgICAgZDMwLCBkMzAsIGQyCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDZ9LCBbcjIsOjY0XSwgaXAgLyogZDQgPSBjb2xbMl0gKi8KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExNSwgZDMwLCB3NCAvKiBxMTUgPSBXNCooY29sWzBdKygxPDxDT0xfU0hJRlQtMSkvVzQpKi8KKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkOH0sIFtyMiw6NjRdLCBpcCAvKiBkNSA9IGNvbFszXSAqLworCisgICAgICAgIGxkcmQgICAgICAgICAgICByNCwgIHI1LCAgW3IyXQorICAgICAgICBsZHJkICAgICAgICAgICAgcjYsICByNywgIFtyMiwgIzE2XQorICAgICAgICBvcnJzICAgICAgICAgICAgcjQsICByNCwgIHI1CisKKyAgICAgICAgaWRjdF9jb2w0X3RvcAorICAgICAgICBpdCAgICAgICAgICAgICAgZXEKKyAgICAgICAgYWRkZXEgICAgICAgICAgIHIyLCAgcjIsICAjMTYKKyAgICAgICAgYmVxICAgICAgICAgICAgIDFmCisKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkM30sIFtyMiw6NjRdLCBpcCAvKiBkNiA9IGNvbFs0XSAqLworICAgICAgICB2bXVsbC5zMTYgICAgICAgcTcsICBkMywgIHc0ICAgIC8qIHE3ICAgPSBXNCAqIGNvbFs0XSAqLworICAgICAgICB2YWRkLmkzMiAgICAgICAgcTExLCBxMTEsIHE3CisgICAgICAgIHZzdWIuaTMyICAgICAgICBxMTIsIHExMiwgcTcKKyAgICAgICAgdnN1Yi5pMzIgICAgICAgIHExMywgcTEzLCBxNworICAgICAgICB2YWRkLmkzMiAgICAgICAgcTE0LCBxMTQsIHE3CisKKzE6ICAgICAgb3JycyAgICAgICAgICAgIHI2LCAgcjYsICByNworICAgICAgICBsZHJkICAgICAgICAgICAgcjQsICByNSwgIFtyMiwgIzE2XQorICAgICAgICBpdCAgICAgICAgICAgICAgZXEKKyAgICAgICAgYWRkZXEgICAgICAgICAgIHIyLCAgcjIsICAjMTYKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkNX0sIFtyMiw6NjRdLCBpcCAvKiBkNyA9IGNvbFs1XSAqLworICAgICAgICB2bWxhbC5zMTYgICAgICAgcTksICBkNSwgIHc1ICAgIC8qIHE5ICArPSBXNSAqIGNvbFs1XSAqLworICAgICAgICB2bWxzbC5zMTYgICAgICAgcTEwLCBkNSwgIHcxICAgIC8qIHExMCAtPSBXMSAqIGNvbFs1XSAqLworICAgICAgICB2bWxhbC5zMTYgICAgICAgcTUsICBkNSwgIHc3ICAgIC8qIHE1ICArPSBXNyAqIGNvbFs1XSAqLworICAgICAgICB2bWxhbC5zMTYgICAgICAgcTYsICBkNSwgIHczICAgIC8qIHE2ICArPSBXMyAqIGNvbFs1XSAqLworCisyOiAgICAgIG9ycnMgICAgICAgICAgICByNCwgIHI0LCAgcjUKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI0LCAgcjUsICBbcjIsICMxNl0KKyAgICAgICAgaXQgICAgICAgICAgICAgIGVxCisgICAgICAgIGFkZGVxICAgICAgICAgICByMiwgIHIyLCAgIzE2CisgICAgICAgIGJlcSAgICAgICAgICAgICAzZgorCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDd9LCBbcjIsOjY0XSwgaXAgLyogZDggPSBjb2xbNl0gKi8KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE3LCAgZDcsICB3NiAgICAvKiBxNyAgID0gVzYgKiBjb2xbNl0gKi8KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE4LCAgZDcsICB3MiAgICAvKiBxOCAgID0gVzIgKiBjb2xbNl0gKi8KKyAgICAgICAgdmFkZC5pMzIgICAgICAgIHExMSwgcTExLCBxNworICAgICAgICB2c3ViLmkzMiAgICAgICAgcTE0LCBxMTQsIHE3CisgICAgICAgIHZzdWIuaTMyICAgICAgICBxMTIsIHExMiwgcTgKKyAgICAgICAgdmFkZC5pMzIgICAgICAgIHExMywgcTEzLCBxOAorCiszOiAgICAgIG9ycnMgICAgICAgICAgICByNCwgIHI0LCAgcjUKKyAgICAgICAgaXQgICAgICAgICAgICAgIGVxCisgICAgICAgIGFkZGVxICAgICAgICAgICByMiwgIHIyLCAgIzE2CisgICAgICAgIGJlcSAgICAgICAgICAgICA0ZgorCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDl9LCBbcjIsOjY0XSwgaXAgLyogZDkgPSBjb2xbN10gKi8KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHE5LCAgZDksICB3NworICAgICAgICB2bWxzbC5zMTYgICAgICAgcTEwLCBkOSwgIHc1CisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxNSwgIGQ5LCAgdzMKKyAgICAgICAgdm1sc2wuczE2ICAgICAgIHE2LCAgZDksICB3MQorCis0OiAgICAgIHZhZGRobi5pMzIgICAgICBkMiwgIHExMSwgcTkKKyAgICAgICAgdmFkZGhuLmkzMiAgICAgIGQzLCAgcTEyLCBxMTAKKyAgICAgICAgdmFkZGhuLmkzMiAgICAgIGQ0LCAgcTEzLCBxNQorICAgICAgICB2YWRkaG4uaTMyICAgICAgZDUsICBxMTQsIHE2CisgICAgICAgIHZzdWJobi5pMzIgICAgICBkOSwgIHExMSwgcTkKKyAgICAgICAgdnN1YmhuLmkzMiAgICAgIGQ4LCAgcTEyLCBxMTAKKyAgICAgICAgdnN1YmhuLmkzMiAgICAgIGQ3LCAgcTEzLCBxNQorICAgICAgICB2c3ViaG4uaTMyICAgICAgZDYsICBxMTQsIHE2CisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKyAgICAgICAgLmFsaWduIDYKKworZnVuY3Rpb24gaWRjdF9jb2w0X3N0OF9uZW9uCisgICAgICAgIHZxc2hydW4uczE2ICAgICBkMiwgIHExLCAgI0NPTF9TSElGVC0xNgorICAgICAgICB2cXNocnVuLnMxNiAgICAgZDMsICBxMiwgICNDT0xfU0hJRlQtMTYKKyAgICAgICAgdnFzaHJ1bi5zMTYgICAgIGQ0LCAgcTMsICAjQ09MX1NISUZULTE2CisgICAgICAgIHZxc2hydW4uczE2ICAgICBkNSwgIHE0LCAgI0NPTF9TSElGVC0xNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMV19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QzWzFdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMF19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNFsxXX0sIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q1WzBdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDVbMV19LCBbcjAsOjMyXSwgcjEKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworY29uc3QgICBpZGN0X2NvZWZmX25lb24sIGFsaWduPTQKKyAgICAgICAgLnNob3J0IFcxLCBXMiwgVzMsIFc0LCBXNSwgVzYsIFc3LCBXNGMKK2VuZGNvbnN0CisKKyAgICAgICAgLm1hY3JvIGlkY3Rfc3RhcnQgZGF0YQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI3LCBscn0KKyAgICAgICAgcGxkICAgICAgICAgICAgIFtcZGF0YV0KKyAgICAgICAgcGxkICAgICAgICAgICAgIFtcZGF0YSwgIzY0XQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgbW92cmVsICAgICAgICAgIHIzLCAgaWRjdF9jb2VmZl9uZW9uCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDAsZDF9LCBbcjMsOjEyOF0KKyAgICAgICAgLmVuZG0KKworICAgICAgICAubWFjcm8gaWRjdF9lbmQKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjcsIHBjfQorICAgICAgICAuZW5kbQorCisvKiB2b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqZGF0YSk7ICovCitmdW5jdGlvbiBmZl9zaW1wbGVfaWRjdF9wdXRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgaWRjdF9zdGFydCAgICAgIHIyCisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3Rfcm93NF9wbGRfbmVvbgorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9yb3c0X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICAjLTEyOAorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9jb2w0X25lb24KKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3RfY29sNF9zdDhfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgICMtMTIwCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0X2NvbDRfbmVvbgorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9jb2w0X3N0OF9uZW9uCisKKyAgICAgICAgaWRjdF9lbmQKK2VuZGZ1bmMKKworICAgICAgICAuYWxpZ24gNgorCitmdW5jdGlvbiBpZGN0X2NvbDRfYWRkOF9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICBpcCwgIHIwCisKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTBbMF19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHExLCAgcTEsICAjQ09MX1NISUZULTE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDEwWzFdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMiwgIHEyLCAgI0NPTF9TSElGVC0xNgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxMVswXX0sIFtyMCw6MzJdLCByMQorICAgICAgICB2c2hyLnMxNiAgICAgICAgcTMsICBxMywgICNDT0xfU0hJRlQtMTYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTFbMV19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHE0LCAgcTQsICAjQ09MX1NISUZULTE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDEyWzBdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMSwgIHExLCAgZDEwCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDEyWzFdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMiwgIHEyLCAgZDExCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDEzWzBdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMiwgIHExCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDEzWzFdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMywgIHEzLCAgZDEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCAgW2lwLDozMl0sIHIxCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMywgIHEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMV19LCAgW2lwLDozMl0sIHIxCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxNCwgIHE0LCAgZDEzCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMF19LCAgW2lwLDozMl0sIHIxCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNCwgIHEzCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMV19LCAgW2lwLDozMl0sIHIxCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNSwgIHE0CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMF19LCAgW2lwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMV19LCAgW2lwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDVbMF19LCAgW2lwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDVbMV19LCAgW2lwLDozMl0sIHIxCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKy8qIHZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX25lb24odWludDhfdCAqZHN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsgKi8KK2Z1bmN0aW9uIGZmX3NpbXBsZV9pZGN0X2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBpZGN0X3N0YXJ0ICAgICAgcjIKKworICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9yb3c0X3BsZF9uZW9uCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0X3JvdzRfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgICMtMTI4CisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0X2NvbDRfbmVvbgorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9jb2w0X2FkZDhfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgICMtMTIwCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0X2NvbDRfbmVvbgorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9jb2w0X2FkZDhfbmVvbgorCisgICAgICAgIGlkY3RfZW5kCitlbmRmdW5jCisKKyAgICAgICAgLmFsaWduIDYKKworZnVuY3Rpb24gaWRjdF9jb2w0X3N0MTZfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgaXAsICAjMTYKKworICAgICAgICB2c2hyLnMxNiAgICAgICAgcTEsICBxMSwgICNDT0xfU0hJRlQtMTYKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHEyLCAgcTIsICAjQ09MX1NISUZULTE2CisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDJ9LCBbcjIsOjY0XSwgaXAKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHEzLCAgcTMsICAjQ09MX1NISUZULTE2CisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDN9LCBbcjIsOjY0XSwgaXAKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHE0LCAgcTQsICAjQ09MX1NISUZULTE2CisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDR9LCBbcjIsOjY0XSwgaXAKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkNX0sIFtyMiw6NjRdLCBpcAorICAgICAgICB2c3QxLjY0ICAgICAgICAge2Q2fSwgW3IyLDo2NF0sIGlwCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDd9LCBbcjIsOjY0XSwgaXAKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkOH0sIFtyMiw6NjRdLCBpcAorICAgICAgICB2c3QxLjY0ICAgICAgICAge2Q5fSwgW3IyLDo2NF0sIGlwCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKy8qIHZvaWQgZmZfc2ltcGxlX2lkY3RfbmVvbihpbnQxNl90ICpkYXRhKTsgKi8KK2Z1bmN0aW9uIGZmX3NpbXBsZV9pZGN0X25lb24sIGV4cG9ydD0xCisgICAgICAgIGlkY3Rfc3RhcnQgICAgICByMAorCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgIHIwCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0X3JvdzRfbmVvbgorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9yb3c0X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICAjLTEyOAorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9jb2w0X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICAjLTEyOAorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9jb2w0X3N0MTZfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgICMtMTIwCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0X2NvbDRfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgICMtMTI4CisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0X2NvbDRfc3QxNl9uZW9uCisKKyAgICAgICAgaWRjdF9lbmQKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9zdGFydGNvZGUuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS9zdGFydGNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI1ZDlkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3N0YXJ0Y29kZS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FSTV9TVEFSVENPREVfSAorI2RlZmluZSBBVkNPREVDX0FSTV9TVEFSVENPREVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2ludCBmZl9zdGFydGNvZGVfZmluZF9jYW5kaWRhdGVfYXJtdjYoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FSTV9TVEFSVENPREVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3N0YXJ0Y29kZV9hcm12Ni5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3N0YXJ0Y29kZV9hcm12Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NmYwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vc3RhcnRjb2RlX2FybXY2LlMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUklTQyBPUyBPcGVuIEx0ZAorICogQXV0aG9yOiBCZW4gQXZpc29uIDxiYXZpc29uQHJpc2Nvc29wZW4ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworUkVTVUxUICAucmVxICAgIGExCitCVUYgICAgIC5yZXEgICAgYTEKK1NJWkUgICAgLnJlcSAgICBhMgorUEFUVEVSTiAucmVxICAgIGEzCitQVFIgICAgIC5yZXEgICAgYTQKK0RBVDAgICAgLnJlcSAgICB2MQorREFUMSAgICAucmVxICAgIHYyCitEQVQyICAgIC5yZXEgICAgdjMKK0RBVDMgICAgLnJlcSAgICB2NAorVE1QMCAgICAucmVxICAgIHY1CitUTVAxICAgIC5yZXEgICAgdjYKK1RNUDIgICAgLnJlcSAgICBpcAorVE1QMyAgICAucmVxICAgIGxyCisKKyNkZWZpbmUgUFJFTE9BRF9ESVNUQU5DRSA0CisKKy5tYWNybyBpbm5lcmxvb3A0CisgICAgICAgIGxkciAgICAgREFUMCwgW1BUUl0sICM0CisgICAgICAgIHN1YnMgICAgU0laRSwgU0laRSwgIzQgQCBDIGZsYWcgc3Vydml2ZXMgcmVzdCBvZiBtYWNybworICAgICAgICBzdWIgICAgIFRNUDAsIERBVDAsIFBBVFRFUk4sIGxzciAjMTQKKyAgICAgICAgYmljICAgICBUTVAwLCBUTVAwLCBEQVQwCisgICAgICAgIGFuZHMgICAgVE1QMCwgVE1QMCwgUEFUVEVSTgorLmVuZG0KKworLm1hY3JvIGlubmVybG9vcDE2ICBkZWNyZW1lbnQsIGRvX3ByZWxvYWQKKyAgICAgICAgbGRtaWEgICBQVFIhLCB7REFUMCxEQVQxLERBVDIsREFUM30KKyAuaWZuYyAiXGRvX3ByZWxvYWQiLCIiCisgICAgICAgIHBsZCAgICAgW1BUUiwgI1BSRUxPQURfRElTVEFOQ0UqMzJdCisgLmVuZGlmCisgLmlmbmMgIlxkZWNyZW1lbnQiLCIiCisgICAgICAgIHN1YnMgICAgU0laRSwgU0laRSwgI1xkZWNyZW1lbnQgQCBDIGZsYWcgc3Vydml2ZXMgcmVzdCBvZiBtYWNybworIC5lbmRpZgorICAgICAgICBzdWIgICAgIFRNUDAsIERBVDAsIFBBVFRFUk4sIGxzciAjMTQKKyAgICAgICAgc3ViICAgICBUTVAxLCBEQVQxLCBQQVRURVJOLCBsc3IgIzE0CisgICAgICAgIGJpYyAgICAgVE1QMCwgVE1QMCwgREFUMAorICAgICAgICBiaWMgICAgIFRNUDEsIFRNUDEsIERBVDEKKyAgICAgICAgc3ViICAgICBUTVAyLCBEQVQyLCBQQVRURVJOLCBsc3IgIzE0CisgICAgICAgIHN1YiAgICAgVE1QMywgREFUMywgUEFUVEVSTiwgbHNyICMxNAorICAgICAgICBhbmRzICAgIFRNUDAsIFRNUDAsIFBBVFRFUk4KKyAgICAgICAgYmljICAgICBUTVAyLCBUTVAyLCBEQVQyCisgICAgICAgIGl0ICAgICAgZXEKKyAgICAgICAgYW5kc2VxICBUTVAxLCBUTVAxLCBQQVRURVJOCisgICAgICAgIGJpYyAgICAgVE1QMywgVE1QMywgREFUMworICAgICAgICBpdHQgICAgIGVxCisgICAgICAgIGFuZHNlcSAgVE1QMiwgVE1QMiwgUEFUVEVSTgorICAgICAgICBhbmRzZXEgIFRNUDMsIFRNUDMsIFBBVFRFUk4KKy5lbmRtCisKKy8qIGludCBmZl9zdGFydGNvZGVfZmluZF9jYW5kaWRhdGVfYXJtdjYoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkgKi8KK2Z1bmN0aW9uIGZmX3N0YXJ0Y29kZV9maW5kX2NhbmRpZGF0ZV9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICB7djEtdjYsbHJ9CisgICAgICAgIG1vdiAgICAgUFRSLCBCVUYKKyAgICAgICAgQCBFbnN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IChQUkVMT0FEX0RJU1RBTkNFKzIpIGNvbXBsZXRlIGNhY2hlbGluZXMgdG8gZ28KKyAgICAgICAgQCBiZWZvcmUgdXNpbmcgY29kZSB0aGF0IGRvZXMgcHJlbG9hZHMKKyAgICAgICAgY21wICAgICBTSVpFLCAjKFBSRUxPQURfRElTVEFOQ0UrMykqMzIgLSAxCisgICAgICAgIGJsbyAgICAgNjBmCisKKyAgICAgICAgQCBHZXQgdG8gd29yZC1hbGlnbm1lbnQsIDEgYnl0ZSBhdCBhIHRpbWUKKyAgICAgICAgdHN0ICAgICBQVFIsICMzCisgICAgICAgIGJlcSAgICAgMmYKKzE6ICAgICAgbGRyYiAgICBEQVQwLCBbUFRSXSwgIzEKKyAgICAgICAgc3ViICAgICBTSVpFLCBTSVpFLCAjMQorICAgICAgICB0ZXEgICAgIERBVDAsICMwCisgICAgICAgIGJlcSAgICAgOTBmCisgICAgICAgIHRzdCAgICAgUFRSLCAjMworICAgICAgICBibmUgICAgIDFiCisyOiAgICAgIEAgR2V0IHRvIDQtd29yZCBhbGlnbm1lbnQsIDEgd29yZCBhdCBhIHRpbWUKKyAgICAgICAgbGRyICAgICBQQVRURVJOLCA9MHg4MDAwODAwMAorICAgICAgICBzZXRlbmQgIGJlCisgICAgICAgIHRzdCAgICAgUFRSLCAjMTIKKyAgICAgICAgYmVxICAgICA0ZgorMzogICAgICBpbm5lcmxvb3A0CisgICAgICAgIGJuZSAgICAgOTFmCisgICAgICAgIHRzdCAgICAgUFRSLCAjMTIKKyAgICAgICAgYm5lICAgICAzYgorNDogICAgICBAIEdldCB0byBjYWNoZWxpbmUgKDgtd29yZCkgYWxpZ25tZW50CisgICAgICAgIHRzdCAgICAgUFRSLCAjMTYKKyAgICAgICAgYmVxICAgICA1ZgorICAgICAgICBpbm5lcmxvb3AxNiAgMTYKKyAgICAgICAgYm5lICAgICA5M2YKKzU6ICAgICAgQCBDaGVjayBjb21wbGV0ZSBjYWNoZWxpbmVzLCB3aXRoIHByZWxvYWRpbmcKKyAgICAgICAgQCBXZSBuZWVkIHRvIHN0b3Agd2hlbiB0aGVyZSBhcmUgc3RpbGwgKFBSRUxPQURfRElTVEFOQ0UrMSkKKyAgICAgICAgQCBjb21wbGV0ZSBjYWNoZWxpbmVzIHRvIGdvCisgICAgICAgIHN1YiAgICAgU0laRSwgU0laRSwgIyhQUkVMT0FEX0RJU1RBTkNFKzIpKjMyCis2OiAgICAgIGlubmVybG9vcDE2ICAsIGRvX3ByZWxvYWQKKyAgICAgICAgYm5lICAgICA5M2YKKyAgICAgICAgaW5uZXJsb29wMTYgIDMyCisgICAgICAgIGJuZSAgICAgOTNmCisgICAgICAgIGJjcyAgICAgNmIKKyAgICAgICAgQCBQcmVsb2FkIHRyYWlsaW5nIHBhcnQtY2FjaGVsaW5lLCBpZiBhbnkKKyAgICAgICAgdHN0ICAgICBTSVpFLCAjMzEKKyAgICAgICAgYmVxICAgICA3ZgorICAgICAgICBwbGQgICAgIFtQVFIsICMoUFJFTE9BRF9ESVNUQU5DRSsxKSozMl0KKyAgICAgICAgQCBDaGVjayByZW1haW5pbmcgZGF0YSB3aXRob3V0IGRvaW5nIGFueSBtb3JlIHByZWxvYWRzLiBGaXJzdAorICAgICAgICBAIGRvIGluIGNodW5rcyBvZiA0IHdvcmRzOgorNzogICAgICBhZGRzICAgIFNJWkUsIFNJWkUsICMoUFJFTE9BRF9ESVNUQU5DRSsyKSozMiAtIDE2CisgICAgICAgIGJtaSAgICAgOWYKKzg6ICAgICAgaW5uZXJsb29wMTYgIDE2CisgICAgICAgIGJuZSAgICAgOTNmCisgICAgICAgIGJjcyAgICAgOGIKKyAgICAgICAgQCBUaGVuIGluIHdvcmRzOgorOTogICAgICBhZGRzICAgIFNJWkUsIFNJWkUsICMxNiAtIDQKKyAgICAgICAgYm1pICAgICAxMWYKKzEwOiAgICAgaW5uZXJsb29wNAorICAgICAgICBibmUgICAgIDkxZgorICAgICAgICBiY3MgICAgIDEwYgorMTE6ICAgICBzZXRlbmQgIGxlCisgICAgICAgIEAgQ2hlY2sgc2Vjb25kIGJ5dGUgb2YgZmluYWwgaGFsZndvcmQKKyAgICAgICAgbGRyYiAgICBEQVQwLCBbUFRSLCAjLTFdCisgICAgICAgIHRlcSAgICAgREFUMCwgIzAKKyAgICAgICAgYmVxICAgICA5MGYKKyAgICAgICAgQCBDaGVjayBhbnkgcmVtYWluaW5nIGJ5dGVzCisgICAgICAgIHRzdCAgICAgU0laRSwgIzMKKyAgICAgICAgYmVxICAgICAxM2YKKzEyOiAgICAgbGRyYiAgICBEQVQwLCBbUFRSXSwgIzEKKyAgICAgICAgc3ViICAgICBTSVpFLCBTSVpFLCAjMQorICAgICAgICB0ZXEgICAgIERBVDAsICMwCisgICAgICAgIGJlcSAgICAgOTBmCisgICAgICAgIHRzdCAgICAgU0laRSwgIzMKKyAgICAgICAgYm5lICAgICAxMmIKKyAgICAgICAgQCBObyBjYW5kaWRhdGUgZm91bmQKKzEzOiAgICAgc3ViICAgICBSRVNVTFQsIFBUUiwgQlVGCisgICAgICAgIGIgICAgICAgOTlmCisKKzYwOiAgICAgQCBTbWFsbCBidWZmZXIgLSBzaW1wbHkgY2hlY2sgYnkgbG9vcGluZyBvdmVyIGJ5dGVzCisgICAgICAgIHN1YnMgICAgU0laRSwgU0laRSwgIzEKKyAgICAgICAgYmNjICAgICA5OWYKKzYxOiAgICAgbGRyYiAgICBEQVQwLCBbUFRSXSwgIzEKKyAgICAgICAgc3VicyAgICBTSVpFLCBTSVpFLCAjMQorICAgICAgICB0ZXEgICAgIERBVDAsICMwCisgICAgICAgIGJlcSAgICAgOTBmCisgICAgICAgIGJjcyAgICAgNjFiCisgICAgICAgIEAgTm8gY2FuZGlkYXRlIGZvdW5kCisgICAgICAgIHN1YiAgICAgUkVTVUxULCBQVFIsIEJVRgorICAgICAgICBiICAgICAgIDk5ZgorCis5MDogICAgIEAgRm91bmQgYSBjYW5kaWRhdGUgYXQgdGhlIHByZWNlZGluZyBieXRlCisgICAgICAgIHN1YiAgICAgUkVTVUxULCBQVFIsIEJVRgorICAgICAgICBzdWIgICAgIFJFU1VMVCwgUkVTVUxULCAjMQorICAgICAgICBiICAgICAgIDk5ZgorCis5MTogICAgIEAgRm91bmQgYSBjYW5kaWRhdGUgc29tZXdoZXJlIGluIHRoZSBwcmVjZWRpbmcgNCBieXRlcworICAgICAgICBzdWIgICAgIFJFU1VMVCwgUFRSLCBCVUYKKyAgICAgICAgc3ViICAgICBSRVNVTFQsIFJFU1VMVCwgIzQKKyAgICAgICAgc3ViICAgICBUTVAwLCBEQVQwLCAjMHgyMDAwMAorICAgICAgICBiaWNzICAgIFRNUDAsIFRNUDAsIERBVDAKKyAgICAgICAgaXR0ICAgICBwbAorICAgICAgICBsZHJicGwgIERBVDAsIFtQVFIsICMtM10KKyAgICAgICAgYWRkcGwgICBSRVNVTFQsIFJFU1VMVCwgIzIKKyAgICAgICAgYnBsICAgICA5MmYKKyAgICAgICAgdGVxICAgICBSRVNVTFQsICMwCisgICAgICAgIGJlcSAgICAgOThmIEAgZG9uJ3QgbG9vayBiYWNrIGEgYnl0ZSBpZiBmb3VuZCBhdCBmaXJzdCBieXRlIGluIGJ1ZmZlcgorICAgICAgICBsZHJiICAgIERBVDAsIFtQVFIsICMtNV0KKzkyOiAgICAgdGVxICAgICBEQVQwLCAjMAorICAgICAgICBpdCAgICAgIGVxCisgICAgICAgIHN1YmVxICAgUkVTVUxULCBSRVNVTFQsICMxCisgICAgICAgIGIgICAgICAgOThmCisKKzkzOiAgICAgQCBGb3VuZCBhIGNhbmRpZGF0ZSBzb21ld2hlcmUgaW4gdGhlIHByZWNlZGluZyAxNiBieXRlcworICAgICAgICBzdWIgICAgIFJFU1VMVCwgUFRSLCBCVUYKKyAgICAgICAgc3ViICAgICBSRVNVTFQsIFJFU1VMVCwgIzE2CisgICAgICAgIHRlcSAgICAgVE1QMCwgIzAKKyAgICAgICAgYmVxICAgICA5NWYgQCBub3QgaW4gZmlyc3QgNCBieXRlcworICAgICAgICBzdWIgICAgIFRNUDAsIERBVDAsICMweDIwMDAwCisgICAgICAgIGJpY3MgICAgVE1QMCwgVE1QMCwgREFUMAorICAgICAgICBpdHQgICAgIHBsCisgICAgICAgIGxkcmJwbCAgREFUMCwgW1BUUiwgIy0xNV0KKyAgICAgICAgYWRkcGwgICBSRVNVTFQsIFJFU1VMVCwgIzIKKyAgICAgICAgYnBsICAgICA5NGYKKyAgICAgICAgdGVxICAgICBSRVNVTFQsICMwCisgICAgICAgIGJlcSAgICAgOThmIEAgZG9uJ3QgbG9vayBiYWNrIGEgYnl0ZSBpZiBmb3VuZCBhdCBmaXJzdCBieXRlIGluIGJ1ZmZlcgorICAgICAgICBsZHJiICAgIERBVDAsIFtQVFIsICMtMTddCis5NDogICAgIHRlcSAgICAgREFUMCwgIzAKKyAgICAgICAgaXQgICAgICBlcQorICAgICAgICBzdWJlcSAgIFJFU1VMVCwgUkVTVUxULCAjMQorICAgICAgICBiICAgICAgIDk4ZgorOTU6ICAgICBhZGQgICAgIFJFU1VMVCwgUkVTVUxULCAjNAorICAgICAgICB0ZXEgICAgIFRNUDEsICMwCisgICAgICAgIGJlcSAgICAgOTZmIEAgbm90IGluIG5leHQgNCBieXRlcworICAgICAgICBzdWIgICAgIFRNUDEsIERBVDEsICMweDIwMDAwCisgICAgICAgIGJpY3MgICAgVE1QMSwgVE1QMSwgREFUMQorICAgICAgICBpdGVlICAgIG1pCisgICAgICAgIGxkcmJtaSAgREFUMCwgW1BUUiwgIy0xM10KKyAgICAgICAgbGRyYnBsICBEQVQwLCBbUFRSLCAjLTExXQorICAgICAgICBhZGRwbCAgIFJFU1VMVCwgUkVTVUxULCAjMgorICAgICAgICB0ZXEgICAgIERBVDAsICMwCisgICAgICAgIGl0ICAgICAgZXEKKyAgICAgICAgc3ViZXEgICBSRVNVTFQsIFJFU1VMVCwgIzEKKyAgICAgICAgYiAgICAgICA5OGYKKzk2OiAgICAgYWRkICAgICBSRVNVTFQsIFJFU1VMVCwgIzQKKyAgICAgICAgdGVxICAgICBUTVAyLCAjMAorICAgICAgICBiZXEgICAgIDk3ZiBAIG5vdCBpbiBuZXh0IDQgYnl0ZXMKKyAgICAgICAgc3ViICAgICBUTVAyLCBEQVQyLCAjMHgyMDAwMAorICAgICAgICBiaWNzICAgIFRNUDIsIFRNUDIsIERBVDIKKyAgICAgICAgaXRlZSAgICBtaQorICAgICAgICBsZHJibWkgIERBVDAsIFtQVFIsICMtOV0KKyAgICAgICAgbGRyYnBsICBEQVQwLCBbUFRSLCAjLTddCisgICAgICAgIGFkZHBsICAgUkVTVUxULCBSRVNVTFQsICMyCisgICAgICAgIHRlcSAgICAgREFUMCwgIzAKKyAgICAgICAgaXQgICAgICBlcQorICAgICAgICBzdWJlcSAgIFJFU1VMVCwgUkVTVUxULCAjMQorICAgICAgICBiICAgICAgIDk4ZgorOTc6ICAgICBhZGQgICAgIFJFU1VMVCwgUkVTVUxULCAjNAorICAgICAgICBzdWIgICAgIFRNUDMsIERBVDMsICMweDIwMDAwCisgICAgICAgIGJpY3MgICAgVE1QMywgVE1QMywgREFUMworICAgICAgICBpdGVlICAgIG1pCisgICAgICAgIGxkcmJtaSAgREFUMCwgW1BUUiwgIy01XQorICAgICAgICBsZHJicGwgIERBVDAsIFtQVFIsICMtM10KKyAgICAgICAgYWRkcGwgICBSRVNVTFQsIFJFU1VMVCwgIzIKKyAgICAgICAgdGVxICAgICBEQVQwLCAjMAorICAgICAgICBpdCAgICAgIGVxCisgICAgICAgIHN1YmVxICAgUkVTVUxULCBSRVNVTFQsICMxCisgICAgICAgIEAgZHJvcCB0aHJvdWdoIHRvIDk4ZgorOTg6ICAgICBzZXRlbmQgIGxlCis5OTogICAgIHBvcCAgICAge3YxLXY2LHBjfQorZW5kZnVuYworCisgICAgICAgIC51bnJlcSAgUkVTVUxUCisgICAgICAgIC51bnJlcSAgQlVGCisgICAgICAgIC51bnJlcSAgU0laRQorICAgICAgICAudW5yZXEgIFBBVFRFUk4KKyAgICAgICAgLnVucmVxICBQVFIKKyAgICAgICAgLnVucmVxICBEQVQwCisgICAgICAgIC51bnJlcSAgREFUMQorICAgICAgICAudW5yZXEgIERBVDIKKyAgICAgICAgLnVucmVxICBEQVQzCisgICAgICAgIC51bnJlcSAgVE1QMAorICAgICAgICAudW5yZXEgIFRNUDEKKyAgICAgICAgLnVucmVxICBUTVAyCisgICAgICAgIC51bnJlcSAgVE1QMwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3N5bnRoX2ZpbHRlcl9uZW9uLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vc3ludGhfZmlsdGVyX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDE3YmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3N5bnRoX2ZpbHRlcl9uZW9uLlMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9zeW50aF9maWx0ZXJfZmxvYXRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMy1yMTEsbHJ9CisKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3IyXSAgICAgICAgICAgICAgIEAgc3ludGhfYnVmX29mZnNldAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHI0LCAgbHNsICMyICAgQCBzeW50aF9idWYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjQsICAjMzIKKyAgICAgICAgYmZjICAgICAgICAgICAgIHIxMiwgIzksICAjMjMKKyAgICAgICAgYmljICAgICAgICAgICAgIHI0LCAgcjQsICAjNjMKKyAgICAgICAgc3RyICAgICAgICAgICAgIHIxMiwgW3IyXQorCisgICAgICAgIGxkciAgICAgICAgICAgICByMiwgIFtzcCwgIzEyKjRdICAgICAgICBAIGluCisgICAgICAgIG1vdiAgICAgICAgICAgICByOSwgIHIxICAgICAgICAgICAgICAgICBAIHN5bnRoX2J1ZgorCitWRlAgICAgIHZwdXNoICAgICAgICAgICB7ZDB9CisgICAgICAgIGJsICAgICAgICAgICAgICBYKGZmX2ltZGN0X2hhbGZfbmVvbikKK1ZGUCAgICAgdnBvcCAgICAgICAgICAgIHtkMH0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyM30KKworICAgICAgICBsZHIgICAgICAgICAgICAgcjUsICBbc3AsICM5KjRdICAgICAgICAgQCB3aW5kb3cKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIyLCAgW3NwLCAjMTAqNF0gICAgICAgIEAgb3V0CitOT1ZGUCAgIHZsZHIgICAgICAgICAgICBzMCwgIFtzcCwgIzEyKjRdICAgICAgICBAIHNjYWxlCisgICAgICAgIGFkZCAgICAgICAgICAgICByOCwgIHI5LCAgIzEyKjQKKworICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICAjNjQqNAorICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICAjNAorMToKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMCwgcjksICAjMTYqNCAgICAgICAgIEAgc3ludGhfYnVmCisgICAgICAgIGFkZCAgICAgICAgICAgICByMTEsIHI4LCAgIzE2KjQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjUsICAjMTYqNCAgICAgICAgIEAgd2luZG93CisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHI1LCAgIzMyKjQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI3LCAgcjUsICAjNDgqNAorCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEwfSwgICAgW3IzLDoxMjhdICAgICBAIGEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjMsICAjMTYqNAorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyMyw6MTI4XSAgICAgQCBiCisgICAgICAgIHZtb3YuZjMyICAgICAgICBxMiwgICMwLjAgICAgICAgICAgICAgICBAIGMKKyAgICAgICAgdm1vdi5mMzIgICAgICAgIHEzLCAgIzAuMCAgICAgICAgICAgICAgIEAgZAorCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICM1MTIKKzI6CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTl9LCAgICAgW3I4LCA6MTI4XSwgbHIKKyAgICAgICAgdnJldjY0LjMyICAgICAgIHE5LCAgcTkKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOH0sICAgICBbcjUsIDoxMjhdLCBscgorICAgICAgICB2bWxzLmYzMiAgICAgICAgZDIwLCBkMTYsIGQxOQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExMX0sICAgIFtyMCwgOjEyOF0sIGxyCisgICAgICAgIHZtbHMuZjMyICAgICAgICBkMjEsIGQxNywgZDE4CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEyfSwgICAgW3I5LCA6MTI4XSwgbHIKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQyLCAgZDIyLCBkMjQKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOH0sICAgICBbcjYsIDoxMjhdLCBscgorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDMsICBkMjMsIGQyNQorICAgICAgICB2bGQxLjMyICAgICAgICAge3E5fSwgICAgIFtyMTAsOjEyOF0sIGxyCisgICAgICAgIHZtbGEuZjMyICAgICAgICBkNCwgIGQxNiwgZDE4CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEyfSwgICAgW3IxMSw6MTI4XSwgbHIKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQ1LCAgZDE3LCBkMTkKKyAgICAgICAgdnJldjY0LjMyICAgICAgIHExMiwgcTEyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTExfSwgICAgW3I3LCA6MTI4XSwgbHIKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQ2LCAgZDIyLCBkMjUKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQ3LCAgZDIzLCBkMjQKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNjQKKyAgICAgICAgYmVxICAgICAgICAgICAgIDNmCisgICAgICAgIGNtcCAgICAgICAgICAgICByMTIsIHI0CisgICAgICAgIGJuZSAgICAgICAgICAgICAyYgorICAgICAgICBzdWIgICAgICAgICAgICAgcjgsICByOCwgICM1MTIqNAorICAgICAgICBzdWIgICAgICAgICAgICAgcjksICByOSwgICM1MTIqNAorICAgICAgICBzdWIgICAgICAgICAgICAgcjEwLCByMTAsICM1MTIqNAorICAgICAgICBzdWIgICAgICAgICAgICAgcjExLCByMTEsICM1MTIqNAorICAgICAgICBiICAgICAgICAgICAgICAgMmIKKzM6CisgICAgICAgIHZtdWwuZjMyICAgICAgICBxOCwgIHExMCwgZDBbMF0KKyAgICAgICAgdm11bC5mMzIgICAgICAgIHE5LCAgcTEsICBkMFswXQorICAgICAgICB2c3QxLjMyICAgICAgICAge3EzfSwgICAgIFtyMyw6MTI4XQorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgICMxNio0CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTJ9LCAgICAgW3IzLDoxMjhdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTh9LCAgICAgW3IyLDoxMjhdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIyLCAgIzE2KjQKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxOX0sICAgICBbcjIsOjEyOF0KKworICAgICAgICBzdWJzICAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIGl0ICAgICAgICAgICAgICBlcQorICAgICAgICBwb3BlcSAgICAgICAgICAge3I0LXIxMSxwY30KKworICAgICAgICBjbXAgICAgICAgICAgICAgcjQsICAjMAorICAgICAgICBpdHQgICAgICAgICAgICAgZXEKKyAgICAgICAgc3ViZXEgICAgICAgICAgIHI4LCAgcjgsICAjNTEyKjQKKyAgICAgICAgc3ViZXEgICAgICAgICAgIHI5LCAgcjksICAjNTEyKjQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHI1LCAgcjUsICAjNTEyKjQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICAjMTIqNCAgICAgICAgIEAgb3V0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIzLCAgIzQqNCAgICAgICAgICBAIHN5bnRoX2J1ZjIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCAgcjUsICAjNCo0ICAgICAgICAgIEAgd2luZG93CisgICAgICAgIGFkZCAgICAgICAgICAgICByOSwgIHI5LCAgIzQqNCAgICAgICAgICBAIHN5bnRoX2J1ZgorICAgICAgICBzdWIgICAgICAgICAgICAgcjgsICByOCwgICM0KjQgICAgICAgICAgQCBzeW50aF9idWYKKyAgICAgICAgYiAgICAgICAgICAgICAgIDFiCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vc3ludGhfZmlsdGVyX3ZmcC5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3N5bnRoX2ZpbHRlcl92ZnAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY3MzRjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3N5bnRoX2ZpbHRlcl92ZnAuUwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBSSVNDIE9TIE9wZW4gTHRkCisgKiBBdXRob3I6IEJlbiBBdmlzb24gPGJhdmlzb25AcmlzY29zb3Blbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitJTURDVCAgICAgICAgIC5yZXEgICAgcjAKK09SSUdfUF9TQiAgICAgLnJlcSAgICByMQorUF9TQl9PRkYgICAgICAucmVxICAgIHIyCitJICAgICAgICAgICAgIC5yZXEgICAgcjAKK1BfU0IyX1VQICAgICAgLnJlcSAgICByMQorT0xERlBTQ1IgICAgICAucmVxICAgIHIyCitQX1NCMl9ETiAgICAgIC5yZXEgICAgcjMKK1BfV0lOX0ROICAgICAgLnJlcSAgICByNAorUF9PVVRfRE4gICAgICAucmVxICAgIHI1CitQX1NCICAgICAgICAgIC5yZXEgICAgcjYKK0pfV1JBUCAgICAgICAgLnJlcSAgICByNworUF9XSU5fVVAgICAgICAucmVxICAgIHIxMgorUF9PVVRfVVAgICAgICAucmVxICAgIHIxNAorCitTQ0FMRSAgICAgICAgIC5yZXEgICAgczAKK1NCVUZfREFUX1JFVjAgLnJlcSAgICBzNAorU0JVRl9EQVRfUkVWMSAucmVxICAgIHM1CitTQlVGX0RBVF9SRVYyIC5yZXEgICAgczYKK1NCVUZfREFUX1JFVjMgLnJlcSAgICBzNworVkEwICAgICAgICAgICAucmVxICAgIHM4CitWQTMgICAgICAgICAgIC5yZXEgICAgczExCitWQjAgICAgICAgICAgIC5yZXEgICAgczEyCitWQjMgICAgICAgICAgIC5yZXEgICAgczE1CitWQzAgICAgICAgICAgIC5yZXEgICAgczgKK1ZDMyAgICAgICAgICAgLnJlcSAgICBzMTEKK1ZEMCAgICAgICAgICAgLnJlcSAgICBzMTIKK1ZEMyAgICAgICAgICAgLnJlcSAgICBzMTUKK1NCVUZfREFUMCAgICAgLnJlcSAgICBzMTYKK1NCVUZfREFUMSAgICAgLnJlcSAgICBzMTcKK1NCVUZfREFUMiAgICAgLnJlcSAgICBzMTgKK1NCVUZfREFUMyAgICAgLnJlcSAgICBzMTkKK1NCVUZfREFUX0FMVDAgLnJlcSAgICBzMjAKK1NCVUZfREFUX0FMVDEgLnJlcSAgICBzMjEKK1NCVUZfREFUX0FMVDIgLnJlcSAgICBzMjIKK1NCVUZfREFUX0FMVDMgLnJlcSAgICBzMjMKK1dJTl9ETl9EQVQwICAgLnJlcSAgICBzMjQKK1dJTl9VUF9EQVQwICAgLnJlcSAgICBzMjgKKworCisubWFjcm8gaW5uZXJfbG9vcCAgaGFsZiwgdGFpbCwgaGVhZAorIC5pZiAoT0ZGU0VUICYgKDY0KjQpKSA9PSAwICAgICAgICAgICAgICAgIEAgZXZlbiBudW1iZXJlZCBjYWxsCisgICAgICAgIFNCVUZfREFUX1RISVMwIC5yZXEgU0JVRl9EQVQwCisgICAgICAgIFNCVUZfREFUX1RISVMxIC5yZXEgU0JVRl9EQVQxCisgICAgICAgIFNCVUZfREFUX1RISVMyIC5yZXEgU0JVRl9EQVQyCisgICAgICAgIFNCVUZfREFUX1RISVMzIC5yZXEgU0JVRl9EQVQzCisgIC5pZm5jICJcaGVhZCIsIiIKKyAgICAgICAgdmxkciAgICBkOCwgW1BfU0IsICNPRkZTRVRdICAgICAgICBAIGQ4ID0gU0JVRl9EQVQKKyAgICAgICAgdmxkciAgICBkOSwgW1BfU0IsICNPRkZTRVQrOF0KKyAgLmVuZGlmCisgLmVsc2UKKyAgICAgICAgU0JVRl9EQVRfVEhJUzAgLnJlcSBTQlVGX0RBVF9BTFQwCisgICAgICAgIFNCVUZfREFUX1RISVMxIC5yZXEgU0JVRl9EQVRfQUxUMQorICAgICAgICBTQlVGX0RBVF9USElTMiAucmVxIFNCVUZfREFUX0FMVDIKKyAgICAgICAgU0JVRl9EQVRfVEhJUzMgLnJlcSBTQlVGX0RBVF9BTFQzCisgIC5pZm5jICJcaGVhZCIsIiIKKyAgICAgICAgdmxkciAgICBkMTAsIFtQX1NCLCAjT0ZGU0VUXSAgICAgICBAIGQxMCA9IFNCVUZfREFUX0FMVAorICAgICAgICB2bGRyICAgIGQxMSwgW1BfU0IsICNPRkZTRVQrOF0KKyAgLmVuZGlmCisgLmVuZGlmCisgLmlmbmMgIlx0YWlsIiwiIgorICAuaWZjICJcaGFsZiIsImFiIgorICAgICAgICB2bWxzLmYgIFZBMCwgU0JVRl9EQVRfUkVWMCwgV0lOX0ROX0RBVDAgIEAgYWxsIG9wZXJhbmRzIHRyZWF0ZWQgYXMgdmVjdG9ycworICAuZWxzZQorICAgICAgICB2bWxhLmYgIFZEMCwgU0JVRl9EQVRfUkVWMCwgV0lOX0ROX0RBVDAgIEAgYWxsIG9wZXJhbmRzIHRyZWF0ZWQgYXMgdmVjdG9ycworICAuZW5kaWYKKyAuZW5kaWYKKyAuaWZuYyAiXGhlYWQiLCIiCisgICAgICAgIHZsZHIgICAgZDE0LCBbUF9XSU5fVVAsICNPRkZTRVRdICAgQCBkMTQgPSBXSU5fVVBfREFUCisgICAgICAgIHZsZHIgICAgZDE1LCBbUF9XSU5fVVAsICNPRkZTRVQrOF0KKyAgICAgICAgdmxkciAgICBkMTIsIFtQX1dJTl9ETiwgI09GRlNFVF0gICBAIGQxMiA9IFdJTl9ETl9EQVQKKyAgICAgICAgdmxkciAgICBkMTMsIFtQX1dJTl9ETiwgI09GRlNFVCs4XQorICAgICAgICB2bW92ICAgIFNCVUZfREFUX1JFVjMsIFNCVUZfREFUX1RISVMwCisgICAgICAgIHZtb3YgICAgU0JVRl9EQVRfUkVWMiwgU0JVRl9EQVRfVEhJUzEKKyAgICAgICAgdm1vdiAgICBTQlVGX0RBVF9SRVYxLCBTQlVGX0RBVF9USElTMgorICAgICAgICB2bW92ICAgIFNCVUZfREFUX1JFVjAsIFNCVUZfREFUX1RISVMzCisgIC5pZmMgIlxoYWxmIiwiYWIiCisgICAgICAgIHZtbGEuZiAgVkIwLCBTQlVGX0RBVF9USElTMCwgV0lOX1VQX0RBVDAKKyAgLmVsc2UKKyAgICAgICAgdm1sYS5mICBWQzAsIFNCVUZfREFUX1RISVMwLCBXSU5fVVBfREFUMAorICAuZW5kaWYKKyAgICAgICAgdGVxICAgICBKX1dSQVAsICNKCisgICAgICAgIGJuZSAgICAgMmYgICAgICAgICAgICAgQCBzdHJvbmdseSBwcmVkaWN0YWJsZSwgc28gYmV0dGVyIHRoYW4gY29uZCBleGVjIGluIHRoaXMgY2FzZQorICAgICAgICBzdWIgICAgIFBfU0IsIFBfU0IsICM1MTIqNAorMjoKKyAgLnNldCBKLCBKIC0gNjQKKyAgLnNldCBPRkZTRVQsIE9GRlNFVCArIDY0KjQKKyAuZW5kaWYKKyAgICAgICAgLnVucmVxICBTQlVGX0RBVF9USElTMAorICAgICAgICAudW5yZXEgIFNCVUZfREFUX1RISVMxCisgICAgICAgIC51bnJlcSAgU0JVRl9EQVRfVEhJUzIKKyAgICAgICAgLnVucmVxICBTQlVGX0RBVF9USElTMworLmVuZG0KKworCisvKiB2b2lkIGZmX3N5bnRoX2ZpbHRlcl9mbG9hdF92ZnAoRkZUQ29udGV4dCAqaW1kY3QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnN5bnRoX2J1Zl9wdHIsIGludCAqc3ludGhfYnVmX29mZnNldCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzeW50aF9idWYyWzMyXSwgY29uc3QgZmxvYXQgd2luZG93WzUxMl0sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3V0WzMyXSwgY29uc3QgZmxvYXQgaW5bMzJdLCBmbG9hdCBzY2FsZSkKKyAqLworZnVuY3Rpb24gZmZfc3ludGhfZmlsdGVyX2Zsb2F0X3ZmcCwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICB7cjMtcjcsbHJ9CisgICAgICAgIHZwdXNoICAge3MxNi1zMzF9CisgICAgICAgIGxkciAgICAgbHIsIFtQX1NCX09GRl0KKyAgICAgICAgYWRkICAgICBhMiwgT1JJR19QX1NCLCBsciwgbHNsICMyIEAgY2FsY3VsYXRlIHN5bnRoX2J1ZiB0byBwYXNzIHRvIGltZGN0X2hhbGYKKyAgICAgICAgbW92ICAgICBQX1NCLCBhMiAgICAgICAgICAgICAgICAgIEAgYW5kIGtlZXAgYSBjb3B5IGZvciBvdXJzZWx2ZXMKKyAgICAgICAgYmljICAgICBKX1dSQVAsIGxyLCAjNjMgICAgICAgICAgIEAgbWFuZ2xlZCB0byBtYWtlIHRlc3RpbmcgZm9yIHdyYXAgZWFzaWVyIGluIGlubmVyIGxvb3AKKyAgICAgICAgc3ViICAgICBsciwgbHIsICMzMgorICAgICAgICBhbmQgICAgIGxyLCBsciwgIzUxMi0zMgorICAgICAgICBzdHIgICAgIGxyLCBbUF9TQl9PRkZdICAgICAgICAgICAgQCByb3RhdGUgb2Zmc2V0LCBtb2R1bG8gYnVmZmVyIHNpemUsIHJlYWR5IGZvciBuZXh0IGNhbGwKKyAgICAgICAgbGRyICAgICBhMywgW3NwLCAjKDE2KzYrMikqNF0gICAgIEAgZmV0Y2ggaW4gZnJvbSBzdGFjaywgdG8gcGFzcyB0byBpbWRjdF9oYWxmCitWRlAgICAgIHZtb3YgICAgczE2LCBTQ0FMRSAgICAgICAgICAgICAgICBAIGltZGN0X2hhbGYgaXMgZnJlZSB0byBjb3JydXB0IHMwLCBidXQgaXQgY29udGFpbnMgb25lIG9mIG91ciBhcmd1bWVudHMgaW4gaGFyZGZwIGNhc2UKKyAgICAgICAgYmwgICAgICBYKGZmX2ltZGN0X2hhbGZfdmZwKQorVkZQICAgICB2bW92ICAgIFNDQUxFLCBzMTYKKworICAgICAgICBmbXJ4ICAgIE9MREZQU0NSLCBGUFNDUgorICAgICAgICBsZHIgICAgIGxyLCA9MHgwMzAzMDAwMCAgICAgICAgICAgQCBSdW5GYXN0IG1vZGUsIHNob3J0IHZlY3RvcnMgb2YgbGVuZ3RoIDQsIHN0cmlkZSAxCisgICAgICAgIGZteHIgICAgRlBTQ1IsIGxyCisgICAgICAgIGxkciAgICAgUF9TQjJfRE4sIFtzcCwgIzE2KjRdCisgICAgICAgIGxkciAgICAgUF9XSU5fRE4sIFtzcCwgIygxNis2KzApKjRdCisgICAgICAgIGxkciAgICAgUF9PVVRfRE4sIFtzcCwgIygxNis2KzEpKjRdCitOT1ZGUCAgIHZsZHIgICAgU0NBTEUsIFtzcCwgIygxNis2KzMpKjRdCisKKyNkZWZpbmUgSU1NX09GRl9TS0VXIDk1NiAgICAgICAgICAgICAgICAgICAvKiBhbHNvIHZhbGlkIGltbWVkaWF0ZSBjb25zdGFudCB3aGVuIHlvdSBhZGQgMTYqNCAqLworICAgICAgICBhZGQgICAgIFBfU0IsIFBfU0IsICNJTU1fT0ZGX1NLRVcgIEAgc28gd2UgY2FuIHVzZSAtdmUgb2Zmc2V0cyB0byB1c2UgZnVsbCBpbW1lZGlhdGUgb2Zmc2V0IHJhbmdlCisgICAgICAgIGFkZCAgICAgUF9TQjJfVVAsIFBfU0IyX0ROLCAjMTYqNAorICAgICAgICBhZGQgICAgIFBfV0lOX1VQLCBQX1dJTl9ETiwgIzE2KjQrSU1NX09GRl9TS0VXCisgICAgICAgIGFkZCAgICAgUF9PVVRfVVAsIFBfT1VUX0ROLCAjMTYqNAorICAgICAgICBhZGQgICAgIFBfU0IyX0ROLCBQX1NCMl9ETiwgIzE2KjQKKyAgICAgICAgYWRkICAgICBQX1dJTl9ETiwgUF9XSU5fRE4sICMxMio0K0lNTV9PRkZfU0tFVworICAgICAgICBhZGQgICAgIFBfT1VUX0ROLCBQX09VVF9ETiwgIzE2KjQKKyAgICAgICAgbW92ICAgICBJLCAjNAorMToKKyAgICAgICAgdmxkbWlhICBQX1NCMl9VUCEsIHtWQjAtVkIzfQorICAgICAgICB2bGRtZGIgIFBfU0IyX0ROISwge1ZBMC1WQTN9CisgLnNldCBKLCA1MTIgLSA2NAorIC5zZXQgT0ZGU0VULCAtSU1NX09GRl9TS0VXCisgICAgICAgIGlubmVyX2xvb3AgIGFiLCwgaGVhZAorIC5yZXB0IDcKKyAgICAgICAgaW5uZXJfbG9vcCAgYWIsIHRhaWwsIGhlYWQKKyAuZW5kcgorICAgICAgICBpbm5lcl9sb29wICBhYiwgdGFpbAorICAgICAgICBhZGQgICAgIFBfV0lOX1VQLCBQX1dJTl9VUCwgIzQqNAorICAgICAgICBzdWIgICAgIFBfV0lOX0ROLCBQX1dJTl9ETiwgIzQqNAorICAgICAgICB2bXVsLmYgIFZCMCwgVkIwLCBTQ0FMRSAgICAgIEAgU0NBTEUgdHJlYXRlZCBhcyBzY2FsYXIKKyAgICAgICAgYWRkICAgICBQX1NCLCBQX1NCLCAjKDUxMis0KSo0CisgICAgICAgIHN1YnMgICAgSSwgSSwgIzEKKyAgICAgICAgdm11bC5mICBWQTAsIFZBMCwgU0NBTEUKKyAgICAgICAgdnN0bWlhICBQX09VVF9VUCEsIHtWQjAtVkIzfQorICAgICAgICB2c3RtZGIgIFBfT1VUX0ROISwge1ZBMC1WQTN9CisgICAgICAgIGJuZSAgICAgMWIKKworICAgICAgICBhZGQgICAgIFBfU0IyX0ROLCBQX1NCMl9ETiwgIygxNisyOC0xMikqNAorICAgICAgICBzdWIgICAgIFBfU0IyX1VQLCBQX1NCMl9VUCwgIygxNisxNikqNAorICAgICAgICBhZGQgICAgIFBfV0lOX0ROLCBQX1dJTl9ETiwgIygzMisxNisyOC0xMikqNAorICAgICAgICBtb3YgICAgIEksICM0CisxOgorICAgICAgICB2bGRyLmQgIGQ0LCB6ZXJvICAgICAgICAgICAgIEAgZDQgPSBWQzAKKyAgICAgICAgdmxkci5kICBkNSwgemVybworICAgICAgICB2bGRyLmQgIGQ2LCB6ZXJvICAgICAgICAgICAgIEAgZDYgPSBWRDAKKyAgICAgICAgdmxkci5kICBkNywgemVybworIC5zZXQgSiwgNTEyIC0gNjQKKyAuc2V0IE9GRlNFVCwgLUlNTV9PRkZfU0tFVworICAgICAgICBpbm5lcl9sb29wICBjZCwsIGhlYWQKKyAucmVwdCA3CisgICAgICAgIGlubmVyX2xvb3AgIGNkLCB0YWlsLCBoZWFkCisgLmVuZHIKKyAgICAgICAgaW5uZXJfbG9vcCAgY2QsIHRhaWwKKyAgICAgICAgYWRkICAgICBQX1dJTl9VUCwgUF9XSU5fVVAsICM0KjQKKyAgICAgICAgc3ViICAgICBQX1dJTl9ETiwgUF9XSU5fRE4sICM0KjQKKyAgICAgICAgYWRkICAgICBQX1NCLCBQX1NCLCAjKDUxMis0KSo0CisgICAgICAgIHN1YnMgICAgSSwgSSwgIzEKKyAgICAgICAgdnN0bWlhICBQX1NCMl9VUCEsIHtWQzAtVkMzfQorICAgICAgICB2c3RtZGIgIFBfU0IyX0ROISwge1ZEMC1WRDN9CisgICAgICAgIGJuZSAgICAgMWIKKworICAgICAgICBmbXhyICAgIEZQU0NSLCBPTERGUFNDUgorICAgICAgICB2cG9wICAgIHtzMTYtczMxfQorICAgICAgICBwb3AgICAgIHtyMy1yNyxwY30KK2VuZGZ1bmMKKworICAgICAgICAudW5yZXEgIElNRENUCisgICAgICAgIC51bnJlcSAgT1JJR19QX1NCCisgICAgICAgIC51bnJlcSAgUF9TQl9PRkYKKyAgICAgICAgLnVucmVxICBJCisgICAgICAgIC51bnJlcSAgUF9TQjJfVVAKKyAgICAgICAgLnVucmVxICBPTERGUFNDUgorICAgICAgICAudW5yZXEgIFBfU0IyX0ROCisgICAgICAgIC51bnJlcSAgUF9XSU5fRE4KKyAgICAgICAgLnVucmVxICBQX09VVF9ETgorICAgICAgICAudW5yZXEgIFBfU0IKKyAgICAgICAgLnVucmVxICBKX1dSQVAKKyAgICAgICAgLnVucmVxICBQX1dJTl9VUAorICAgICAgICAudW5yZXEgIFBfT1VUX1VQCisKKyAgICAgICAgLnVucmVxICBTQ0FMRQorICAgICAgICAudW5yZXEgIFNCVUZfREFUX1JFVjAKKyAgICAgICAgLnVucmVxICBTQlVGX0RBVF9SRVYxCisgICAgICAgIC51bnJlcSAgU0JVRl9EQVRfUkVWMgorICAgICAgICAudW5yZXEgIFNCVUZfREFUX1JFVjMKKyAgICAgICAgLnVucmVxICBWQTAKKyAgICAgICAgLnVucmVxICBWQTMKKyAgICAgICAgLnVucmVxICBWQjAKKyAgICAgICAgLnVucmVxICBWQjMKKyAgICAgICAgLnVucmVxICBWQzAKKyAgICAgICAgLnVucmVxICBWQzMKKyAgICAgICAgLnVucmVxICBWRDAKKyAgICAgICAgLnVucmVxICBWRDMKKyAgICAgICAgLnVucmVxICBTQlVGX0RBVDAKKyAgICAgICAgLnVucmVxICBTQlVGX0RBVDEKKyAgICAgICAgLnVucmVxICBTQlVGX0RBVDIKKyAgICAgICAgLnVucmVxICBTQlVGX0RBVDMKKyAgICAgICAgLnVucmVxICBTQlVGX0RBVF9BTFQwCisgICAgICAgIC51bnJlcSAgU0JVRl9EQVRfQUxUMQorICAgICAgICAudW5yZXEgIFNCVUZfREFUX0FMVDIKKyAgICAgICAgLnVucmVxICBTQlVGX0RBVF9BTFQzCisgICAgICAgIC51bnJlcSAgV0lOX0ROX0RBVDAKKyAgICAgICAgLnVucmVxICBXSU5fVVBfREFUMAorCisgICAgICAgIC5hbGlnbiAgMworemVybzogICAud29yZCAgIDAsIDAKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92YzFkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92YzFkc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDAxYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZjMWRzcC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FSTV9WQzFEU1BfSAorI2RlZmluZSBBVkNPREVDX0FSTV9WQzFEU1BfSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy92YzFkc3AuaCIKKwordm9pZCBmZl92YzFkc3BfaW5pdF9uZW9uKFZDMURTUENvbnRleHQgKmRzcCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FSTV9WQzFEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZjMWRzcF9pbml0X2FybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZjMWRzcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMmM3NTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdmMxZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hcm0vc3RhcnRjb2RlLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92YzFkc3AuaCIKKyNpbmNsdWRlICJ2YzFkc3AuaCIKKworYXZfY29sZCB2b2lkIGZmX3ZjMWRzcF9pbml0X2FybShWQzFEU1BDb250ZXh0ICpkc3ApCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworI2lmIEhBVkVfQVJNVjYKKyAgICBpZiAoaGF2ZV9zZXRlbmQoY3B1X2ZsYWdzKSkKKyAgICAgICAgZHNwLT5zdGFydGNvZGVfZmluZF9jYW5kaWRhdGUgPSBmZl9zdGFydGNvZGVfZmluZF9jYW5kaWRhdGVfYXJtdjY7CisjZW5kaWYKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpCisgICAgICAgIGZmX3ZjMWRzcF9pbml0X25lb24oZHNwKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92YzFkc3BfaW5pdF9uZW9uLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdmMxZHNwX2luaXRfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODczZTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdmMxZHNwX2luaXRfbmVvbi5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92YzFkc3AuaCIKKyNpbmNsdWRlICJ2YzFkc3AuaCIKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfOHg4X25lb24oaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl92YzFfaW52X3RyYW5zXzR4OF9uZW9uKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl92YzFfaW52X3RyYW5zXzh4NF9uZW9uKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl92YzFfaW52X3RyYW5zXzR4NF9uZW9uKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spOworCit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfOHg4X2RjX25lb24odWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfNHg4X2RjX25lb24odWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfOHg0X2RjX25lb24odWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfNHg0X2RjX25lb24odWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jayk7CisKK3ZvaWQgZmZfcHV0X3BpeGVsczh4OF9uZW9uKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgcm5kKTsKKworI2RlZmluZSBERUNMX1BVVChYLCBZKSBcCit2b2lkIGZmX3B1dF92YzFfbXNwZWxfbWMjI1gjI1kjI19uZW9uKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOyBcCitzdGF0aWMgdm9pZCBmZl9wdXRfdmMxX21zcGVsX21jIyNYIyNZIyNfMTZfbmVvbih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKSBcCit7IFwKKyAgZmZfcHV0X3ZjMV9tc3BlbF9tYyMjWCMjWSMjX25lb24oZHN0KzAsIHNyYyswLCBzdHJpZGUsIHJuZCk7IFwKKyAgZmZfcHV0X3ZjMV9tc3BlbF9tYyMjWCMjWSMjX25lb24oZHN0KzgsIHNyYys4LCBzdHJpZGUsIHJuZCk7IFwKKyAgZHN0ICs9IDgqc3RyaWRlOyBzcmMgKz0gOCpzdHJpZGU7IFwKKyAgZmZfcHV0X3ZjMV9tc3BlbF9tYyMjWCMjWSMjX25lb24oZHN0KzAsIHNyYyswLCBzdHJpZGUsIHJuZCk7IFwKKyAgZmZfcHV0X3ZjMV9tc3BlbF9tYyMjWCMjWSMjX25lb24oZHN0KzgsIHNyYys4LCBzdHJpZGUsIHJuZCk7IFwKK30KKworREVDTF9QVVQoMSwgMCkKK0RFQ0xfUFVUKDIsIDApCitERUNMX1BVVCgzLCAwKQorCitERUNMX1BVVCgwLCAxKQorREVDTF9QVVQoMCwgMikKK0RFQ0xfUFVUKDAsIDMpCisKK0RFQ0xfUFVUKDEsIDEpCitERUNMX1BVVCgxLCAyKQorREVDTF9QVVQoMSwgMykKKworREVDTF9QVVQoMiwgMSkKK0RFQ0xfUFVUKDIsIDIpCitERUNMX1BVVCgyLCAzKQorCitERUNMX1BVVCgzLCAxKQorREVDTF9QVVQoMywgMikKK0RFQ0xfUFVUKDMsIDMpCisKK3ZvaWQgZmZfcHV0X3ZjMV9jaHJvbWFfbWM4X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfdmMxX2Nocm9tYV9tYzhfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSk7Cit2b2lkIGZmX3B1dF92YzFfY2hyb21hX21jNF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX3ZjMV9jaHJvbWFfbWM0X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpOworCisjZGVmaW5lIEZOX0FTU0lHTihYLCBZKSBcCisgICAgZHNwLT5wdXRfdmMxX21zcGVsX3BpeGVsc190YWJbMF1bWCs0KlldID0gZmZfcHV0X3ZjMV9tc3BlbF9tYyMjWCMjWSMjXzE2X25lb247IFwKKyAgICBkc3AtPnB1dF92YzFfbXNwZWxfcGl4ZWxzX3RhYlsxXVtYKzQqWV0gPSBmZl9wdXRfdmMxX21zcGVsX21jIyNYIyNZIyNfbmVvbgorCithdl9jb2xkIHZvaWQgZmZfdmMxZHNwX2luaXRfbmVvbihWQzFEU1BDb250ZXh0ICpkc3ApCit7CisgICAgZHNwLT52YzFfaW52X3RyYW5zXzh4OCA9IGZmX3ZjMV9pbnZfdHJhbnNfOHg4X25lb247CisgICAgZHNwLT52YzFfaW52X3RyYW5zXzR4OCA9IGZmX3ZjMV9pbnZfdHJhbnNfNHg4X25lb247CisgICAgZHNwLT52YzFfaW52X3RyYW5zXzh4NCA9IGZmX3ZjMV9pbnZfdHJhbnNfOHg0X25lb247CisgICAgZHNwLT52YzFfaW52X3RyYW5zXzR4NCA9IGZmX3ZjMV9pbnZfdHJhbnNfNHg0X25lb247CisgICAgZHNwLT52YzFfaW52X3RyYW5zXzh4OF9kYyA9IGZmX3ZjMV9pbnZfdHJhbnNfOHg4X2RjX25lb247CisgICAgZHNwLT52YzFfaW52X3RyYW5zXzR4OF9kYyA9IGZmX3ZjMV9pbnZfdHJhbnNfNHg4X2RjX25lb247CisgICAgZHNwLT52YzFfaW52X3RyYW5zXzh4NF9kYyA9IGZmX3ZjMV9pbnZfdHJhbnNfOHg0X2RjX25lb247CisgICAgZHNwLT52YzFfaW52X3RyYW5zXzR4NF9kYyA9IGZmX3ZjMV9pbnZfdHJhbnNfNHg0X2RjX25lb247CisKKyAgICBkc3AtPnB1dF92YzFfbXNwZWxfcGl4ZWxzX3RhYlsxXVsgMF0gPSBmZl9wdXRfcGl4ZWxzOHg4X25lb247CisgICAgaWYgKEhBVkVfQVNfRE5fRElSRUNUSVZFKSB7CisgICAgRk5fQVNTSUdOKDEsIDApOworICAgIEZOX0FTU0lHTigyLCAwKTsKKyAgICBGTl9BU1NJR04oMywgMCk7CisKKyAgICBGTl9BU1NJR04oMCwgMSk7CisgICAgRk5fQVNTSUdOKDEsIDEpOworICAgIEZOX0FTU0lHTigyLCAxKTsKKyAgICBGTl9BU1NJR04oMywgMSk7CisKKyAgICBGTl9BU1NJR04oMCwgMik7CisgICAgRk5fQVNTSUdOKDEsIDIpOworICAgIEZOX0FTU0lHTigyLCAyKTsKKyAgICBGTl9BU1NJR04oMywgMik7CisKKyAgICBGTl9BU1NJR04oMCwgMyk7CisgICAgRk5fQVNTSUdOKDEsIDMpOworICAgIEZOX0FTU0lHTigyLCAzKTsKKyAgICBGTl9BU1NJR04oMywgMyk7CisgICAgfQorCisgICAgZHNwLT5wdXRfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGZmX3B1dF92YzFfY2hyb21hX21jOF9uZW9uOworICAgIGRzcC0+YXZnX25vX3JuZF92YzFfY2hyb21hX3BpeGVsc190YWJbMF0gPSBmZl9hdmdfdmMxX2Nocm9tYV9tYzhfbmVvbjsKKyAgICBkc3AtPnB1dF9ub19ybmRfdmMxX2Nocm9tYV9waXhlbHNfdGFiWzFdID0gZmZfcHV0X3ZjMV9jaHJvbWFfbWM0X25lb247CisgICAgZHNwLT5hdmdfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlsxXSA9IGZmX2F2Z192YzFfY2hyb21hX21jNF9uZW9uOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZjMWRzcF9uZW9uLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdmMxZHNwX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGY0ZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZjMWRzcF9uZW9uLlMKQEAgLTAsMCArMSwxMTc0IEBACisvKgorICogVkMxIE5FT04gb3B0aW1pc2F0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorI2luY2x1ZGUgIm5lb24uUyIKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCitAIFRyYW5zcG9zZSByb3dzIGludG8gY29sdW1ucyBvZiBhIG1hdHJpeCBvZiAxNi1iaXQgZWxlbWVudHMuIEZvciA0eDQsIHBhc3MKK0AgZG91YmxlLXdvcmQgcmVnaXN0ZXJzLCBmb3IgOHg0LCBwYXNzIHF1YWQtd29yZCByZWdpc3RlcnMuCisubWFjcm8gdHJhbnNwb3NlMTYgcjAsIHIxLCByMiwgcjMKKyAgICAgICAgQCBBdCB0aGlzIHBvaW50OgorICAgICAgICBAICAgcm93WzBdICByMAorICAgICAgICBAICAgcm93WzFdICByMQorICAgICAgICBAICAgcm93WzJdICByMgorICAgICAgICBAICAgcm93WzNdICByMworCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBccjAsICBccjEgICAgICAgICBAIGZpcnN0IGFuZCBzZWNvbmQgcm93CisgICAgICAgIHZ0cm4uMTYgICAgICAgICBccjIsICBccjMgICAgICAgICBAIHRoaXJkIGFuZCBmb3VydGggcm93CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBccjAsICBccjIgICAgICAgICBAIGZpcnN0IGFuZCB0aGlyZCByb3cKKyAgICAgICAgdnRybi4zMiAgICAgICAgIFxyMSwgIFxyMyAgICAgICAgIEAgc2Vjb25kIGFuZCBmb3VydGggcm93CisKKyAgICAgICAgQCBBdCB0aGlzIHBvaW50LCBpZiByZWdpc3RlcnMgYXJlIHF1YWQtd29yZDoKKyAgICAgICAgQCAgIGNvbHVtblswXSAgIGQwCisgICAgICAgIEAgICBjb2x1bW5bMV0gICBkMgorICAgICAgICBAICAgY29sdW1uWzJdICAgZDQKKyAgICAgICAgQCAgIGNvbHVtblszXSAgIGQ2CisgICAgICAgIEAgICBjb2x1bW5bNF0gICBkMQorICAgICAgICBAICAgY29sdW1uWzVdICAgZDMKKyAgICAgICAgQCAgIGNvbHVtbls2XSAgIGQ1CisgICAgICAgIEAgICBjb2x1bW5bN10gICBkNworCisgICAgICAgIEAgQXQgdGhpcyBwb2ludCwgaWYgcmVnaXN0ZXJzIGFyZSBkb3VibGUtd29yZDoKKyAgICAgICAgQCAgIGNvbHVtblswXSAgIGQwCisgICAgICAgIEAgICBjb2x1bW5bMV0gICBkMQorICAgICAgICBAICAgY29sdW1uWzJdICAgZDIKKyAgICAgICAgQCAgIGNvbHVtblszXSAgIGQzCisuZW5kbQorCitAIGZmX3ZjMV9pbnZfdHJhbnNfezQsOH14ezQsOH1fbmVvbiBhbmQgb3ZlcmZsb3c6IFRoZSBpbnB1dCB2YWx1ZXMgaW4gdGhlIGZpbGUKK0AgYXJlIHN1cHBvc2VkIHRvIGJlIGluIGEgc3BlY2lmaWMgcmFuZ2UgYXMgdG8gYWxsb3cgZm9yIDE2LWJpdCBtYXRoIHdpdGhvdXQKK0AgY2F1c2luZyBvdmVyZmxvd3MsIGJ1dCBzb21ldGltZXMgdGhlIGlucHV0IHZhbHVlcyBhcmUganVzdCBiaWcgZW5vdWdoIHRvCitAIGJhcmVseSBjYXVzZSBvdmVyZmxvdyBpbiB2YWRkIGluc3RydWN0aW9ucyBsaWtlOgorQAorQCAgIHZhZGQuaTE2ICBxMCwgcTgsIHExMAorQCAgIHZzaHIuczE2ICBxMCwgcTAsICNccnNoaWZ0CitACitAIFRvIHByZXZlbnQgdGhlc2UgYm9yZGVybGluZSBjYXNlcyBmcm9tIG92ZXJmbG93aW5nLCB3ZSBqdXN0IG5lZWQgb25lIG1vcmUKK0AgYml0IG9mIHByZWNpc2lvbiwgd2hpY2ggaXMgYWNjb21wbGlzaGVkIGJ5IHJlcGxhY2luZyB0aGUgc2VxdWVuY2UgYWJvdmUgd2l0aDoKK0AKK0AgICB2aGFkZC5zMTYgcTAsIHE4LCBxMTAKK0AgICB2c2hyLnMxNiAgcTAsIHEwLCAjKFxyc2hpZnQgLTEpCitACitAIFRoaXMgd29ya3MgYmVjYXVzZSB2aGFkZCBpcyBhIHNpbmdsZSBpbnN0cnVjdGlvbiB0aGF0IGFkZHMsIHRoZW4gc2hpZnRzIHRvCitAIHRoZSByaWdodCBvbmNlLCBhbGwgYmVmb3JlIHdyaXRpbmcgdGhlIHJlc3VsdCB0byB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIuCitACitAIEV2ZW4gd2l0aCB0aGlzIHdvcmthcm91bmQsIHRoZXJlIHdlcmUgc3RpbGwgc29tZSBmaWxlcyB0aGF0IGNhdXNlZCBvdmVyZmxvd3MKK0AgaW4gZmZfdmMxX2ludl90cmFuc184eDhfbmVvbi4gU2VlIHRoZSBjb21tZW50cyBpbiBmZl92YzFfaW52X3RyYW5zXzh4OF9uZW9uCitAIGZvciB0aGUgYWRkaXRpb25hbCB3b3JrYXJvdW5kLgorCitAIFRha2VzIDQgY29sdW1ucyBvZiA4IHZhbHVlcyBlYWNoIGFuZCBvcGVyYXRlcyBvbiBpdC4gTW9kZWxlZCBhZnRlciB0aGUgZmlyc3QKK0AgZm9yIGxvb3AgaW4gdmMxX2ludl90cmFuc180eDhfYy4KK0AgSW5wdXQgY29sdW1uczogcTAgcTEgcTIgcTMKK0AgT3V0cHV0IGNvbHVtbnM6IHEwIHExIHEyIHEzCitAIFRyYXNoZXM6IHIxMiBxOCBxOSBxMTAgcTExIHExMiBxMTMKKy5tYWNybyB2YzFfaW52X3RyYW5zXzR4OF9oZWxwZXIgYWRkIHJzaGlmdAorICAgICAgICBAIENvbXB1dGUgdGVtcDEsIHRlbXAyIGFuZCBzZXR1cCBzY2FsYXIgIzE3LCAjMjIsICMxMAorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTEyLCAgIHEwLCAgcTIgICAgICAgICAgICAgIEAgdGVtcDEgPSBzcmNbMF0gKyBzcmNbMl0KKyAgICAgICAgbW92dyAgICAgICAgICAgIHIxMiwgICAjMTcKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExMywgICBxMCwgIHEyICAgICAgICAgICAgICBAIHRlbXAyID0gc3JjWzBdIC0gc3JjWzJdCisgICAgICAgIG1vdnQgICAgICAgICAgICByMTIsICAgIzIyCisgICAgICAgIHZtb3YuMzIgICAgICAgICBkMFswXSwgcjEyCisgICAgICAgIG1vdncgICAgICAgICAgICByMTIsICAgIzEwCisgICAgICAgIHZtb3YuMTYgICAgICAgICBkMVswXSwgcjEyCisKKyAgICAgICAgdm1vdi5pMTYgICAgICAgIHE4LCAgI1xhZGQgICAgICAgICAgICAgICAgICBAIHQxIHdpbGwgYWNjdW11bGF0ZSBoZXJlCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxOSwgICNcYWRkICAgICAgICAgICAgICAgICAgQCB0MiB3aWxsIGFjY3VtdWxhdGUgaGVyZQorCisgICAgICAgIHZtdWwuaTE2ICAgICAgICBxMTAsIHExLCAgZDBbMV0gICAgICAgICAgICAgQCB0MyA9IDIyICogKHNyY1sxXSkKKyAgICAgICAgdm11bC5pMTYgICAgICAgIHExMSwgcTMsICBkMFsxXSAgICAgICAgICAgICBAIHQ0ID0gMjIgKiAoc3JjWzNdKQorCisgICAgICAgIHZtbGEuaTE2ICAgICAgICBxOCwgIHExMiwgZDBbMF0gICAgICAgICAgICAgQCB0MSA9IDE3ICogKHRlbXAxKSArIDQKKyAgICAgICAgdm1sYS5pMTYgICAgICAgIHE5LCAgcTEzLCBkMFswXSAgICAgICAgICAgICBAIHQyID0gMTcgKiAodGVtcDIpICsgNAorCisgICAgICAgIHZtbGEuaTE2ICAgICAgICBxMTAsIHEzLCAgZDFbMF0gICAgICAgICAgICAgQCB0MyArPSAxMCAqIHNyY1szXQorICAgICAgICB2bWxzLmkxNiAgICAgICAgcTExLCBxMSwgIGQxWzBdICAgICAgICAgICAgIEAgdDQgLT0gMTAgKiBzcmNbMV0KKworICAgICAgICB2aGFkZC5zMTYgICAgICAgcTAsICBxOCwgIHExMCAgICAgICAgICAgICAgIEAgZHN0WzBdID0gKHQxICsgdDMpID4+IDEKKyAgICAgICAgdmhzdWIuczE2ICAgICAgIHEzLCAgcTgsICBxMTAgICAgICAgICAgICAgICBAIGRzdFszXSA9ICh0MSAtIHQzKSA+PiAxCisgICAgICAgIHZoc3ViLnMxNiAgICAgICBxMSwgIHE5LCAgcTExICAgICAgICAgICAgICAgQCBkc3RbMV0gPSAodDIgLSB0NCkgPj4gMQorICAgICAgICB2aGFkZC5zMTYgICAgICAgcTIsICBxOSwgIHExMSAgICAgICAgICAgICAgIEAgZHN0WzJdID0gKHQyICsgdDQpID4+IDEKKworICAgICAgICBAIEhhbHZpbmcgYWRkL3N1YiBhYm92ZSBhbHJlYWR5IGRpZCBvbmUgc2hpZnQKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHEwLCAgcTAsICAjKFxyc2hpZnQgLSAxKSAgICBAIGRzdFswXSA+Pj0gKHJzaGlmdCAtIDEpCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMywgIHEzLCAgIyhccnNoaWZ0IC0gMSkgICAgQCBkc3RbM10gPj49IChyc2hpZnQgLSAxKQorICAgICAgICB2c2hyLnMxNiAgICAgICAgcTEsICBxMSwgICMoXHJzaGlmdCAtIDEpICAgIEAgZHN0WzFdID4+PSAocnNoaWZ0IC0gMSkKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHEyLCAgcTIsICAjKFxyc2hpZnQgLSAxKSAgICBAIGRzdFsyXSA+Pj0gKHJzaGlmdCAtIDEpCisuZW5kbQorCitAIFRha2VzIDggY29sdW1ucyBvZiA0IHZhbHVlcyBlYWNoIGFuZCBvcGVyYXRlcyBvbiBpdC4gTW9kZWxlZCBhZnRlciB0aGUgc2Vjb25kCitAIGZvciBsb29wIGluIHZjMV9pbnZfdHJhbnNfNHg4X2MuCitAIElucHV0IGNvbHVtbnM6IGQwIGQyIGQ0IGQ2IGQxIGQzIGQ1IGQ3CitAIE91dHB1dCBjb2x1bW5zOiBkMTYgZDE3IGQxOCBkMTkgZDIxIGQyMCBkMjMgZDIyCitAIFRyYXNoZXMgYWxsIE5FT04gcmVnaXN0ZXJzIChhbmQgcjEyKSBleGNlcHQgZm9yOiBxNCBxNSBxNiBxNworLm1hY3JvIHZjMV9pbnZfdHJhbnNfOHg0X2hlbHBlciBhZGQgYWRkMWJlZm9yZXNoaWZ0IHJzaGlmdAorICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICBzcmNbMF0gICAgICBkMCBvdmVyd3JpdHRlbiBsYXRlcgorICAgICAgICBAICAgc3JjWzhdICAgICAgZDIKKyAgICAgICAgQCAgIHNyY1sxNl0gICAgIGQ0IG92ZXJ3cml0dGVuIGxhdGVyCisgICAgICAgIEAgICBzcmNbMjRdICAgICBkNgorICAgICAgICBAICAgc3JjWzMyXSAgICAgZDEgb3ZlcndyaXR0ZW4gbGF0ZXIKKyAgICAgICAgQCAgIHNyY1s0MF0gICAgIGQzCisgICAgICAgIEAgICBzcmNbNDhdICAgICBkNSBvdmVyd3JpdHRlbiBsYXRlcgorICAgICAgICBAICAgc3JjWzU2XSAgICAgZDcKKworICAgICAgICBtb3Z3ICAgICAgICAgICAgcjEyLCAgICMxMgorICAgICAgICB2bW92LmkxNiAgICAgICAgcTE0LCAgICNcYWRkICAgICAgICAgICAgQCB0MXx0MiB3aWxsIGFjY3VtdWxhdGUgaGVyZQorICAgICAgICBtb3Z0ICAgICAgICAgICAgcjEyLCAgICM2CisKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQyMCwgICBkMCwgIGQxICAgICAgICAgIEAgdGVtcDEgPSBzcmNbMF0gKyBzcmNbMzJdCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBkMjEsICAgZDAsICBkMSAgICAgICAgICBAIHRlbXAyID0gc3JjWzBdIC0gc3JjWzMyXQorICAgICAgICB2bW92LmkzMiAgICAgICAgZDBbMF0sIHIxMiAgICAgICAgICAgICAgQCAxNi1iaXQ6IGQwWzBdID0gIzEyLCBkMFsxXSA9ICM2CisKKyAgICAgICAgdnNobC5pMTYgICAgICAgIHExNSwgICBxMiwgICM0ICAgICAgICAgIEAgdDN8dDQgPSAxNiAqIChzcmNbMTZdfHNyY1s0OF0pCisgICAgICAgIHZzd3AgICAgICAgICAgICBkNCwgICAgZDUgICAgICAgICAgICAgICBAIHEyID0gc3JjWzQ4XXxzcmNbMTZdCisgICAgICAgIHZtbGEuaTE2ICAgICAgICBxMTQsICAgcTEwLCBkMFswXSAgICAgICBAIHQxfHQyID0gMTIgKiAodGVtcDF8dGVtcDIpICsgNjQKKyAgICAgICAgbW92dyAgICAgICAgICAgIHIxMiwgICAjMTUKKyAgICAgICAgbW92dCAgICAgICAgICAgIHIxMiwgICAjOQorICAgICAgICB2bW92LmkzMiAgICAgICAgZDBbMV0sIHIxMiAgICAgICAgICAgICAgQCAxNi1iaXQ6IGQwWzJdID0gIzE1LCBkMFszXSA9ICM5CisgICAgICAgIHZuZWcuczE2ICAgICAgICBkMzEsICAgZDMxICAgICAgICAgICAgICBAIHQ0ID0gLXQ0CisgICAgICAgIHZtbGEuaTE2ICAgICAgICBxMTUsICAgcTIsICBkMFsxXSAgICAgICBAIHQzfHQ0ICs9IDYgKiAoc3JjWzQ4XXxzcmNbMTZdKQorCisgICAgICAgIEAgQXQgdGhpcyBwb2ludDoKKyAgICAgICAgQCAgIGQwWzJdICAgIzE1CisgICAgICAgIEAgICBkMFszXSAgICM5CisgICAgICAgIEAgICBxMSAgICAgIHNyY1s4XXxzcmNbNDBdCisgICAgICAgIEAgICBxMyAgICAgIHNyY1syNF18c3JjWzU2XQorICAgICAgICBAICAgcTE0ICAgICBvbGQgdDF8dDIKKyAgICAgICAgQCAgIHExNSAgICAgb2xkIHQzfHQ0CisKKyAgICAgICAgdnNobC5pMTYgICAgICAgIHE4LCAgcTEsICAjNCAgICAgICAgICAgIEAgdDF8dDIgPSAxNiAqIChzcmNbOF18c3JjWzQwXSkKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQyLCAgZDMgICAgICAgICAgICAgICAgIEAgcTEgPSBzcmNbNDBdfHNyY1s4XQorICAgICAgICB2c2hsLmkxNiAgICAgICAgcTEyLCBxMywgICM0ICAgICAgICAgICAgQCB0ZW1wM2F8dGVtcDRhID0gMTYgKiBzcmNbMjRdfHNyY1s1Nl0KKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQ2LCAgZDcgICAgICAgICAgICAgICAgIEAgcTMgPSBzcmNbNTZdfHNyY1syNF0KKyAgICAgICAgdnNobC5pMTYgICAgICAgIHExMywgcTEsICAjMiAgICAgICAgICAgIEAgdGVtcDNifHRlbXA0YiA9IDQgKiAoc3JjWzQwXXxzcmNbOF0pCisgICAgICAgIHZzaGwuaTE2ICAgICAgICBxMiwgIHEzLCAgIzIgICAgICAgICAgICBAIHRlbXAxfHRlbXAyID0gNCAqIChzcmNbNTZdfHNyY1syNF0pCisgICAgICAgIHZzd3AgICAgICAgICAgICBkMywgIGQ2ICAgICAgICAgICAgICAgICBAIHExID0gc3JjWzQwXXxzcmNbNTZdLCBxMyA9IHNyY1s4XXxzcmNbMjRdCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxOSwgIHExMywgcTEyICAgICAgICAgICBAIHQzfHQ0ID0gLSAodGVtcDNhfHRlbXA0YSkgKyAodGVtcDNifHRlbXA0YikKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHE4LCAgcTgsICBxMiAgICAgICAgICAgIEAgdDF8dDIgKz0gdGVtcDF8dGVtcDIKKyAgICAgICAgdm11bC5pMTYgICAgICAgIHExMiwgcTMsICBkMFszXSAgICAgICAgIEAgdGVtcDN8dGVtcDQgPSA5ICogc3JjWzhdfHNyY1syNF0KKyAgICAgICAgdm1sYS5pMTYgICAgICAgIHE4LCAgcTEsICBkMFszXSAgICAgICAgIEAgdDF8dDIgKz0gOSAqIChzcmNbNDBdfHNyY1s1Nl0pCisgICAgICAgIHZzd3AgICAgICAgICAgICBkNiwgIGQ3ICAgICAgICAgICAgICAgICBAIHEzID0gc3JjWzI0XXxzcmNbOF0KKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQyLCAgZDMgICAgICAgICAgICAgICAgIEAgcTEgPSBzcmNbNTZdfHNyY1s0MF0KKworICAgICAgICB2c3ViLmkxNiAgICAgICAgcTExLCBxMTQsIHExNSAgICAgICAgICAgQCB0OHx0NyA9IG9sZCB0MXx0MiAtIG9sZCB0M3x0NAorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTEwLCBxMTQsIHExNSAgICAgICAgICAgQCB0NXx0NiA9IG9sZCB0MXx0MiArIG9sZCB0M3x0NAorICAuaWYgXGFkZDFiZWZvcmVzaGlmdAorICAgICAgICB2bW92LmkxNiAgICAgICAgcTE1LCAjMQorICAuZW5kaWYKKworICAgICAgICB2YWRkLmkxNiAgICAgICAgZDE4LCBkMTgsIGQyNCAgICAgICAgICAgQCB0MyArPSB0ZW1wMworICAgICAgICB2c3ViLmkxNiAgICAgICAgZDE5LCBkMTksIGQyNSAgICAgICAgICAgQCB0NCAtPSB0ZW1wNAorCisgICAgICAgIHZzd3AgICAgICAgICAgICBkMjIsIGQyMyAgICAgICAgICAgICAgICBAIHExMSA9IHQ3fHQ4CisKKyAgICAgICAgdm5lZy5zMTYgICAgICAgIGQxNywgZDE3ICAgICAgICAgICAgICAgIEAgdDIgPSAtdDIKKyAgICAgICAgdm1sYS5pMTYgICAgICAgIHE5LCAgcTEsICBkMFsyXSAgICAgICAgIEAgdDN8dDQgKz0gMTUgKiBzcmNbNTZdfHNyY1s0MF0KKyAgICAgICAgdm1sYS5pMTYgICAgICAgIHE4LCAgcTMsICBkMFsyXSAgICAgICAgIEAgdDF8dDIgKz0gMTUgKiBzcmNbMjRdfHNyY1s4XQorCisgICAgICAgIEAgQXQgdGhpcyBwb2ludDoKKyAgICAgICAgQCAgIHQxICBkMTYKKyAgICAgICAgQCAgIHQyICBkMTcKKyAgICAgICAgQCAgIHQzICBkMTgKKyAgICAgICAgQCAgIHQ0ICBkMTkKKyAgICAgICAgQCAgIHQ1ICBkMjAKKyAgICAgICAgQCAgIHQ2ICBkMjEKKyAgICAgICAgQCAgIHQ3ICBkMjIKKyAgICAgICAgQCAgIHQ4ICBkMjMKKyAgICAgICAgQCAgICMxICBxMTUKKworICAuaWYgXGFkZDFiZWZvcmVzaGlmdAorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTMsICBxMTUsIHExMCAgICAgICAgICAgQCBsaW5lWzcsNl0gPSB0NXx0NiArIDEKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHEyLCAgcTE1LCBxMTEgICAgICAgICAgIEAgbGluZVs1LDRdID0gdDd8dDggKyAxCisgIC5lbmRpZgorCisgICAgICAgIEAgU29tZXRpbWVzIHRoaXMgb3ZlcmZsb3dzLCBzbyB0byBnZXQgb25lIGFkZGl0aW9uYWwgYml0IG9mIHByZWNpc2lvbiwgdXNlCisgICAgICAgIEAgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gdGhhdCBib3RoIGFkZHMgYW5kIHNoaWZ0cyByaWdodCAoaGFsdmluZykuCisgICAgICAgIHZoYWRkLnMxNiAgICAgICBxMSwgIHE5LCAgcTExICAgICAgICAgICBAIGxpbmVbMiwzXSA9ICh0M3x0NCArIHQ3fHQ4KSA+PiAxCisgICAgICAgIHZoYWRkLnMxNiAgICAgICBxMCwgIHE4LCAgcTEwICAgICAgICAgICBAIGxpbmVbMCwxXSA9ICh0MXx0MiArIHQ1fHQ2KSA+PiAxCisgIC5pZiBcYWRkMWJlZm9yZXNoaWZ0CisgICAgICAgIHZoc3ViLnMxNiAgICAgICBxMiwgIHEyLCAgcTkgICAgICAgICAgICBAIGxpbmVbNSw0XSA9ICh0N3x0OCAtIHQzfHQ0ICsgMSkgPj4gMQorICAgICAgICB2aHN1Yi5zMTYgICAgICAgcTMsICBxMywgIHE4ICAgICAgICAgICAgQCBsaW5lWzcsNl0gPSAodDV8dDYgLSB0MXx0MiArIDEpID4+IDEKKyAgLmVsc2UKKyAgICAgICAgdmhzdWIuczE2ICAgICAgIHEyLCAgcTExLCBxOSAgICAgICAgICAgIEAgbGluZVs1LDRdID0gKHQ3fHQ4IC0gdDN8dDQpID4+IDEKKyAgICAgICAgdmhzdWIuczE2ICAgICAgIHEzLCAgcTEwLCBxOCAgICAgICAgICAgIEAgbGluZVs3LDZdID0gKHQ1fHQ2IC0gdDF8dDIpID4+IDEKKyAgLmVuZGlmCisKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHE5LCAgcTEsICAjKFxyc2hpZnQgLSAxKSAgICBAIG9uZSBzaGlmdCBpcyBhbHJlYWR5IGRvbmUgYnkgdmhhZGQvdmhzdWIgYWJvdmUKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHE4LCAgcTAsICAjKFxyc2hpZnQgLSAxKQorICAgICAgICB2c2hyLnMxNiAgICAgICAgcTEwLCBxMiwgICMoXHJzaGlmdCAtIDEpCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMTEsIHEzLCAgIyhccnNoaWZ0IC0gMSkKKworICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICBkc3RbMF0gICBkMTYKKyAgICAgICAgQCAgIGRzdFsxXSAgIGQxNworICAgICAgICBAICAgZHN0WzJdICAgZDE4CisgICAgICAgIEAgICBkc3RbM10gICBkMTkKKyAgICAgICAgQCAgIGRzdFs0XSAgIGQyMQorICAgICAgICBAICAgZHN0WzVdICAgZDIwCisgICAgICAgIEAgICBkc3RbNl0gICBkMjMKKyAgICAgICAgQCAgIGRzdFs3XSAgIGQyMgorLmVuZG0KKworQCBUaGlzIGlzIG1vZGVsZWQgYWZ0ZXIgdGhlIGZpcnN0IGFuZCBzZWNvbmQgZm9yIGxvb3AgaW4gdmMxX2ludl90cmFuc184eDhfYy4KK0AgSW5wdXQgY29sdW1uczogIHE4LCBxOSwgcTEwLCBxMTEsIHExMiwgcTEzLCBxMTQsIHExNQorQCBPdXRwdXQgY29sdW1uczogcTgsIHE5LCBxMTAsIHExMSwgcTEyLCBxMTMsIHExNCwgcTE1CitAIFRyYXNoZXMgYWxsIE5FT04gcmVnaXN0ZXJzIChhbmQgcjEyKSBleGNlcHQgZm9yOiBxNCBxNSBxNiBxNworLm1hY3JvIHZjMV9pbnZfdHJhbnNfOHg4X2hlbHBlciBhZGQgYWRkMWJlZm9yZXNoaWZ0IHJzaGlmdAorICAgICAgICBAIFRoaXMgYWN0dWFsbHkgY29tcHV0ZXMgaGFsZiBvZiB0MSwgdDIsIHQzLCB0NCwgYXMgZXhwbGFpbmVkIGJlbG93CisgICAgICAgIEAgbmVhciBgdE5oYWxmYC4KKyAgICAgICAgdm1vdi5pMTYgICAgICAgIHEwLCAgICAjKDYgLyAyKSAgICAgICAgIEAgcTAgPSAjNi8yCisgICAgICAgIHZzaGwuaTE2ICAgICAgICBxMSwgICAgcTEwLCAjMyAgICAgICAgICBAIHQzID0gMTYvMiAqIHNyY1sxNl0KKyAgICAgICAgdnNobC5pMTYgICAgICAgIHEzLCAgICBxMTQsICMzICAgICAgICAgIEAgdGVtcDQgPSAxNi8yICogc3JjWzQ4XQorICAgICAgICB2bXVsLmkxNiAgICAgICAgcTIsICAgIHExMCwgcTAgICAgICAgICAgQCB0NCA9IDYvMiAqIHNyY1sxNl0KKyAgICAgICAgdm1sYS5pMTYgICAgICAgIHExLCAgICBxMTQsIHEwICAgICAgICAgIEAgdDMgKz0gNi8yICogc3JjWzQ4XQorICAgICAgICBAIHVudXNlZDogcTAsIHExMCwgcTE0CisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMCwgICAgIygxMiAvIDIpICAgICAgICBAIHEwID0gIzEyLzIKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHExMCwgICBxOCwgIHExMiAgICAgICAgIEAgdGVtcDEgPSBzcmNbMF0gKyBzcmNbMzJdCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMTQsICAgcTgsICBxMTIgICAgICAgICBAIHRlbXAyID0gc3JjWzBdIC0gc3JjWzMyXQorICAgICAgICBAIHVudXNlZDogcTgsIHExMgorICAgICAgICB2bW92LmkxNiAgICAgICAgcTgsICAgICMoXGFkZCAvIDIpICAgICAgQCB0MSB3aWxsIGFjY3VtdWxhdGUgaGVyZQorICAgICAgICB2bW92LmkxNiAgICAgICAgcTEyLCAgICMoXGFkZCAvIDIpICAgICAgQCB0MiB3aWxsIGFjY3VtdWxhdGUgaGVyZQorICAgICAgICBtb3Z3ICAgICAgICAgICAgcjEyLCAgICMxNQorICAgICAgICB2c3ViLmkxNiAgICAgICAgcTIsICAgIHEyLCAgcTMgICAgICAgICAgQCB0NCA9IDYvMiAqIHNyY1sxNl0gLSAxNi8yICogc3JjWzQ4XQorICAgICAgICBtb3Z0ICAgICAgICAgICAgcjEyLCAgICM5CisgICAgICAgIEAgdW51c2VkOiBxMworICAgICAgICB2bWxhLmkxNiAgICAgICAgcTgsICAgIHExMCwgcTAgICAgICAgICAgQCB0MSA9IDEyLzIgKiB0ZW1wMSArIGFkZAorICAgICAgICB2bWxhLmkxNiAgICAgICAgcTEyLCAgIHExNCwgcTAgICAgICAgICAgQCB0MiA9IDEyLzIgKiB0ZW1wMiArIGFkZAorICAgICAgICB2bW92LmkzMiAgICAgICAgZDBbMF0sIHIxMgorICAgICAgICBAIHVudXNlZDogcTMsIHExMCwgcTE0CisKKyAgICAgICAgQCBBdCB0aGlzIHBvaW50OgorICAgICAgICBAICAgcTAgICAgICAgICAgZDA9IzE1fCM5CisgICAgICAgIEAgICBxMSAgb2xkIHQzCisgICAgICAgIEAgICBxMiAgb2xkIHQ0CisgICAgICAgIEAgICBxMworICAgICAgICBAICAgcTggIG9sZCB0MQorICAgICAgICBAICAgcTkgICAgICAgICAgc3JjWzhdCisgICAgICAgIEAgICBxMTAKKyAgICAgICAgQCAgIHExMSAgICAgICAgIHNyY1syNF0KKyAgICAgICAgQCAgIHExMiBvbGQgdDIKKyAgICAgICAgQCAgIHExMyAgICAgICAgIHNyY1s0MF0KKyAgICAgICAgQCAgIHExNAorICAgICAgICBAICAgcTE1ICAgICAgICAgc3JjWzU2XQorCisgICAgICAgIEAgdW51c2VkOiBxMywgcTEwLCBxMTQKKyAgICAgICAgbW92dyAgICAgICAgICAgIHIxMiwgICAjMTYKKyAgICAgICAgdnNobC5pMTYgICAgICAgIHEzLCAgICBxOSwgICM0ICAgICAgICAgIEAgdDEgPSAxNiAqIHNyY1s4XQorICAgICAgICBtb3Z0ICAgICAgICAgICAgcjEyLCAgICM0CisgICAgICAgIHZzaGwuaTE2ICAgICAgICBxMTAsICAgcTksICAjMiAgICAgICAgICBAIHQ0ID0gNCAqIHNyY1s4XQorICAgICAgICB2bW92LmkzMiAgICAgICAgZDFbMF0sIHIxMgorICAgICAgICB2bXVsLmkxNiAgICAgICAgcTE0LCAgIHE5LCAgZDBbMF0gICAgICAgQCB0MiA9IDE1ICogc3JjWzhdCisgICAgICAgIHZtdWwuaTE2ICAgICAgICBxOSwgICAgcTksICBkMFsxXSAgICAgICBAIHQzID0gOSAqIHNyY1s4XQorICAgICAgICBAIHVudXNlZDogbm9uZQorICAgICAgICB2bWxhLmkxNiAgICAgICAgcTMsICAgIHExMSwgZDBbMF0gICAgICAgQCB0MSArPSAxNSAqIHNyY1syNF0KKyAgICAgICAgdm1scy5pMTYgICAgICAgIHExMCwgICBxMTEsIGQwWzFdICAgICAgIEAgdDQgLT0gOSAqIHNyY1syNF0KKyAgICAgICAgdm1scy5pMTYgICAgICAgIHExNCwgICBxMTEsIGQxWzFdICAgICAgIEAgdDIgLT0gNCAqIHNyY1syNF0KKyAgICAgICAgdm1scy5pMTYgICAgICAgIHE5LCAgICBxMTEsIGQxWzBdICAgICAgIEAgdDMgLT0gMTYgKiBzcmNbMjRdCisgICAgICAgIEAgdW51c2VkOiBxMTEKKyAgICAgICAgdm1sYS5pMTYgICAgICAgIHEzLCAgICBxMTMsIGQwWzFdICAgICAgIEAgdDEgKz0gOSAqIHNyY1s0MF0KKyAgICAgICAgdm1sYS5pMTYgICAgICAgIHExMCwgICBxMTMsIGQwWzBdICAgICAgIEAgdDQgKz0gMTUgKiBzcmNbNDBdCisgICAgICAgIHZtbHMuaTE2ICAgICAgICBxMTQsICAgcTEzLCBkMVswXSAgICAgICBAIHQyIC09IDE2ICogc3JjWzQwXQorICAgICAgICB2bWxhLmkxNiAgICAgICAgcTksICAgIHExMywgZDFbMV0gICAgICAgQCB0MyArPSA0ICogc3JjWzQwXQorICAgICAgICBAIHVudXNlZDogcTExLCBxMTMKKworICAgICAgICBAIENvbXB1dGUgdDUsIHQ2LCB0NywgdDggZnJvbSBvbGQgdDEsIHQyLCB0MywgdDQuIEFjdHVhbGx5LCBpdCBjb21wdXRlcworICAgICAgICBAIGhhbGYgb2YgdDUsIHQ2LCB0NywgdDggc2luY2UgdDEsIHQyLCB0MywgdDQgYXJlIGhhbHZlZC4KKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHExMSwgICBxOCwgIHExICAgICAgICAgIEAgdDUgPSB0MSArIHQzCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMSwgICAgcTgsICBxMSAgICAgICAgICBAIHQ4ID0gdDEgLSB0MworICAgICAgICB2YWRkLmkxNiAgICAgICAgcTEzLCAgIHExMiwgcTIgICAgICAgICAgQCB0NiA9IHQyICsgdDQKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHEyLCAgICBxMTIsIHEyICAgICAgICAgIEAgdDcgPSB0MiAtIHQ0CisgICAgICAgIEAgdW51c2VkOiBxOCwgcTEyCisKKyAgLmlmIFxhZGQxYmVmb3Jlc2hpZnQKKyAgICAgICAgdm1vdi5pMTYgICAgICAgIHExMiwgICAjMQorICAuZW5kaWYKKworICAgICAgICBAIHVudXNlZDogcTgKKyAgICAgICAgdm1sYS5pMTYgICAgICAgIHEzLCAgICBxMTUsIGQxWzFdICAgICAgIEAgdDEgKz0gNCAqIHNyY1s1Nl0KKyAgICAgICAgdm1scy5pMTYgICAgICAgIHExNCwgICBxMTUsIGQwWzFdICAgICAgIEAgdDIgLT0gOSAqIHNyY1s1Nl0KKyAgICAgICAgdm1sYS5pMTYgICAgICAgIHE5LCAgICBxMTUsIGQwWzBdICAgICAgIEAgdDMgKz0gMTUgKiBzcmNbNTZdCisgICAgICAgIHZtbHMuaTE2ICAgICAgICBxMTAsICAgcTE1LCBkMVswXSAgICAgICBAIHQ0IC09IDE2ICogc3JjWzU2XQorICAgICAgICBAIHVudXNlZDogcTAsIHE4LCBxMTUKKworICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICB0MSAgICAgIHEzCisgICAgICAgIEAgICB0MiAgICAgIHExNAorICAgICAgICBAICAgdDMgICAgICBxOQorICAgICAgICBAICAgdDQgICAgICBxMTAKKyAgICAgICAgQCAgIHQ1aGFsZiAgcTExCisgICAgICAgIEAgICB0NmhhbGYgIHExMworICAgICAgICBAICAgdDdoYWxmICBxMgorICAgICAgICBAICAgdDhoYWxmICBxMQorICAgICAgICBAICAgIzEgICAgICBxMTIKKyAgICAgICAgQAorICAgICAgICBAIHROaGFsZiBpcyBoYWxmIG9mIHRoZSB2YWx1ZSBvZiB0TiAoYXMgZGVzY3JpYmVkIGluIHZjMV9pbnZfdHJhbnNfOHg4X2MpLgorICAgICAgICBAIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHNvbWV0aW1lcyBmaWxlcyBoYXZlIGlucHV0IHRoYXQgY2F1c2VzIHROICsgdE0gdG8KKyAgICAgICAgQCBvdmVyZmxvdy4gVG8gYXZvaWQgdGhpcyBvdmVyZmxvdywgd2UgY29tcHV0ZSB0TmhhbGYsIHRoZW4gY29tcHV0ZQorICAgICAgICBAIHROaGFsZiArIHRNICh3aGljaCBkb2Vzbid0IG92ZXJmbG93KSwgYW5kIHRoZW4gd2UgdXNlIHZoYWRkIHRvIGNvbXB1dGUKKyAgICAgICAgQCAodE5oYWxmICsgKHROaGFsZiArIHRNKSkgPj4gMSB3aGljaCBkb2VzIG5vdCBvdmVyZmxvdyBiZWNhdXNlIGl0IGlzCisgICAgICAgIEAgb25lIGluc3RydWN0aW9uLgorCisgICAgICAgIEAgRm9yIGVhY2ggcGFpciBvZiB0TiBhbmQgdE0sIGRvOgorICAgICAgICBAICAgbGluZUEgPSB0NWhhbGYgKyB0MQorICAgICAgICBAICAgaWYgYWRkMWJlZm9yZXNoaWZ0OiAgdDEgLT0gMQorICAgICAgICBAICAgbGluZUEgPSAodDVoYWxmICsgbGluZUEpID4+IDEKKyAgICAgICAgQCAgIGxpbmVCID0gdDVoYWxmIC0gdDEKKyAgICAgICAgQCAgIGxpbmVCID0gKHQ1aGFsZiArIGxpbmVCKSA+PiAxCisgICAgICAgIEAgICBsaW5lQSA+Pj0gcnNoaWZ0IC0gMQorICAgICAgICBAICAgbGluZUIgPj49IHJzaGlmdCAtIDEKKworICAgICAgICB2YWRkLmkxNiAgICAgICAgcTgsICBxMTEsIHEzICAgICAgICAgICAgICAgIEAgcTggPSB0NWhhbGYgKyB0MQorICAuaWYgXGFkZDFiZWZvcmVzaGlmdAorICAgICAgICB2c3ViLmkxNiAgICAgICAgcTMsICBxMywgIHExMiAgICAgICAgICAgICAgIEAgcTMgPSB0MSAtIDEKKyAgLmVuZGlmCisKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHEwLCAgcTEzLCBxMTQgICAgICAgICAgICAgICBAIHEwICA9IHQ2aGFsZiArIHQyCisgIC5pZiBcYWRkMWJlZm9yZXNoaWZ0CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMTQsIHExNCwgcTEyICAgICAgICAgICAgICAgQCBxMTQgPSB0MiAtIDEKKyAgLmVuZGlmCisKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHExNSwgcTIsICBxOSAgICAgICAgICAgICAgICBAIHExNSA9IHQ3aGFsZiArIHQzCisgIC5pZiBcYWRkMWJlZm9yZXNoaWZ0CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxOSwgIHE5LCAgcTEyICAgICAgICAgICAgICAgQCBxOSAgPSB0MyAtIDEKKyAgLmVuZGlmCisgICAgICAgIEAgdW51c2VkOiBub25lCisKKyAgICAgICAgdmhhZGQuczE2ICAgICAgIHE4LCAgcTExLCBxOCAgICAgICAgICAgICAgICBAIHE4ICA9ICh0NWhhbGYgKyB0NWhhbGYgKyB0MSkgPj4gMQorICAgICAgICB2c3ViLmkxNiAgICAgICAgcTMsICBxMTEsIHEzICAgICAgICAgICAgICAgIEAgcTMgID0gdDVoYWxmIC0gdDEgKyAxCisKKyAgICAgICAgdmhhZGQuczE2ICAgICAgIHEwLCAgcTEzLCBxMCAgICAgICAgICAgICAgICBAIHEwICA9ICh0NmhhbGYgKyB0NmhhbGYgKyB0MikgPj4gMQorICAgICAgICB2c3ViLmkxNiAgICAgICAgcTE0LCBxMTMsIHExNCAgICAgICAgICAgICAgIEAgcTE0ID0gdDZoYWxmIC0gdDIgKyAxCisKKyAgICAgICAgdmhhZGQuczE2ICAgICAgIHExNSwgcTIsICBxMTUgICAgICAgICAgICAgICBAIHExNSA9ICh0N2hhbGYgKyB0N2hhbGYgKyB0MykgPj4gMQorICAgICAgICB2c3ViLmkxNiAgICAgICAgcTksICBxMiwgIHE5ICAgICAgICAgICAgICAgIEAgcTkgID0gdDdoYWxmIC0gdDMgKyAxCisKKyAgICAgICAgdmhhZGQuczE2ICAgICAgIHEzLCAgcTExLCBxMyAgICAgICAgICAgICAgICBAIHEzICA9ICh0NWhhbGYgKyB0NWhhbGYgLSB0MSArIDEpID4+IDEKKyAgICAgICAgQCB1bnVzZWQ6IHExMQorCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxMTEsIHExLCAgcTEwICAgICAgICAgICAgICAgQCBxMTEgPSB0OGhhbGYgKyB0NAorICAuaWYgXGFkZDFiZWZvcmVzaGlmdAorICAgICAgICB2c3ViLmkxNiAgICAgICAgcTEwLCBxMTAsIHExMiAgICAgICAgICAgICAgIEAgcTEwID0gdDQgLSAxCisgIC5lbmRpZgorICAgICAgICBAIHVudXNlZDogcTEyCisKKyAgICAgICAgdmhhZGQuczE2ICAgICAgIHExNCwgcTEzLCBxMTQgICAgICAgICAgICAgICBAIHExNCA9ICh0NmhhbGYgKyB0NmhhbGYgLSB0MiArIDEpID4+IDEKKyAgICAgICAgQCB1bnVzZWQ6IHExMiwgcTEzCisgICAgICAgIHZoYWRkLnMxNiAgICAgICBxMTMsIHEyLCAgcTkgICAgICAgICAgICAgICAgQCBxOSAgPSAodDdoYWxmICsgdDdoYWxmIC0gdDMgKyAxKSA+PiAxCisgICAgICAgIEAgdW51c2VkOiBxMTIsIHEyLCBxOQorCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMTAsIHExLCAgcTEwICAgICAgICAgICAgICAgQCBxMTAgPSB0OGhhbGYgLSB0NCArIDEKKyAgICAgICAgdmhhZGQuczE2ICAgICAgIHExMSwgcTEsICBxMTEgICAgICAgICAgICAgICBAIHExMSA9ICh0OGhhbGYgKyB0OGhhbGYgKyB0NCkgPj4gMQorCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxOCwgIHE4LCAgIyhccnNoaWZ0IC0gMSkgICAgQCBxOCAgPSBsaW5lWzBdCisgICAgICAgIHZoYWRkLnMxNiAgICAgICBxMTIsIHExLCAgcTEwICAgICAgICAgICAgICAgQCBxMTIgPSAodDhoYWxmICsgdDhoYWxmIC0gdDQgKyAxKSA+PiAxCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxOSwgIHEwLCAgIyhccnNoaWZ0IC0gMSkgICAgQCBxOSAgPSBsaW5lWzFdCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMTAsIHExNSwgIyhccnNoaWZ0IC0gMSkgICAgQCBxMTAgPSBsaW5lWzJdCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMTEsIHExMSwgIyhccnNoaWZ0IC0gMSkgICAgQCBxMTEgPSBsaW5lWzNdCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMTIsIHExMiwgIyhccnNoaWZ0IC0gMSkgICAgQCBxMTIgPSBsaW5lWzRdCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMTMsIHExMywgIyhccnNoaWZ0IC0gMSkgICAgQCBxMTMgPSBsaW5lWzVdCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMTQsIHExNCwgIyhccnNoaWZ0IC0gMSkgICAgQCBxMTQgPSBsaW5lWzZdCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMTUsIHEzLCAgIyhccnNoaWZ0IC0gMSkgICAgQCBxMTUgPSBsaW5lWzddCisuZW5kbQorCitAIChpbnQxNl90ICpibG9jayBbcjBdKQorZnVuY3Rpb24gZmZfdmMxX2ludl90cmFuc184eDhfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtxOC1xOX0sICAgW3IwLDoxMjhdIQorICAgICAgICB2bGQxLjY0ICAgICAgICAge3ExMC1xMTF9LCBbcjAsOjEyOF0hCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7cTEyLXExM30sIFtyMCw6MTI4XSEKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtxMTQtcTE1fSwgW3IwLDoxMjhdCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsICMoMTYgKiAyICogMykgICBAIHJlc3RvcmUgcjAKKworICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICBzcmNbMF0gIHE4CisgICAgICAgIEAgICBzcmNbOF0gIHE5CisgICAgICAgIEAgICBzcmNbMTZdIHExMAorICAgICAgICBAICAgc3JjWzI0XSBxMTEKKyAgICAgICAgQCAgIHNyY1szMl0gcTEyCisgICAgICAgIEAgICBzcmNbNDBdIHExMworICAgICAgICBAICAgc3JjWzQ4XSBxMTQKKyAgICAgICAgQCAgIHNyY1s1Nl0gcTE1CisKKyAgICAgICAgdmMxX2ludl90cmFuc184eDhfaGVscGVyIGFkZD00IGFkZDFiZWZvcmVzaGlmdD0wIHJzaGlmdD0zCisKKyAgICAgICAgQCBUcmFuc3Bvc2UgcmVzdWx0IG1hdHJpeCBvZiA4eDgKKyAgICAgICAgc3dhcDQgICAgICAgICAgIGQxNywgZDE5LCBkMjEsIGQyMywgZDI0LCBkMjYsIGQyOCwgZDMwCisgICAgICAgIHRyYW5zcG9zZTE2XzR4NCBxOCwgIHE5LCAgcTEwLCBxMTEsIHExMiwgcTEzLCBxMTQsIHExNQorCisgICAgICAgIHZjMV9pbnZfdHJhbnNfOHg4X2hlbHBlciBhZGQ9NjQgYWRkMWJlZm9yZXNoaWZ0PTEgcnNoaWZ0PTcKKworICAgICAgICB2c3QxLjY0ICAgICAgICAge3E4LXE5fSwgICBbcjAsOjEyOF0hCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7cTEwLXExMX0sIFtyMCw6MTI4XSEKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtxMTItcTEzfSwgW3IwLDoxMjhdIQorICAgICAgICB2c3QxLjY0ICAgICAgICAge3ExNC1xMTV9LCBbcjAsOjEyOF0KKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworQCAodWludDhfdCAqZGVzdCBbcjBdLCBpbnQgbGluZXNpemUgW3IxXSwgaW50MTZfdCAqYmxvY2sgW3IyXSkKK2Z1bmN0aW9uIGZmX3ZjMV9pbnZfdHJhbnNfOHg0X25lb24sIGV4cG9ydD0xCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7cTAtcTF9LCBbcjIsOjEyOF0hICAgICBAIGxvYWQgOCAqIDQgKiAyID0gNjQgYnl0ZXMgLyAxNiBieXRlcyBwZXIgcXVhZCA9IDQgcXVhZCByZWdpc3RlcnMKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtxMi1xM30sIFtyMiw6MTI4XQorCisgICAgICAgIHRyYW5zcG9zZTE2ICAgICBxMCBxMSBxMiBxMyAgICAgICAgICAgICBAIHRyYW5zcG9zZSByb3dzIHRvIGNvbHVtbnMKKworICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICBzcmNbMF0gICBkMAorICAgICAgICBAICAgc3JjWzFdICAgZDIKKyAgICAgICAgQCAgIHNyY1syXSAgIGQ0CisgICAgICAgIEAgICBzcmNbM10gICBkNgorICAgICAgICBAICAgc3JjWzRdICAgZDEKKyAgICAgICAgQCAgIHNyY1s1XSAgIGQzCisgICAgICAgIEAgICBzcmNbNl0gICBkNQorICAgICAgICBAICAgc3JjWzddICAgZDcKKworICAgICAgICB2YzFfaW52X3RyYW5zXzh4NF9oZWxwZXIgICAgYWRkPTQgYWRkMWJlZm9yZXNoaWZ0PTAgcnNoaWZ0PTMKKworICAgICAgICBAIE1vdmUgb3V0cHV0IHRvIG1vcmUgc3RhbmRhcmRpemVkIHJlZ2lzdGVycworICAgICAgICB2bW92ICAgICAgICBkMCwgZDE2CisgICAgICAgIHZtb3YgICAgICAgIGQyLCBkMTcKKyAgICAgICAgdm1vdiAgICAgICAgZDQsIGQxOAorICAgICAgICB2bW92ICAgICAgICBkNiwgZDE5CisgICAgICAgIHZtb3YgICAgICAgIGQxLCBkMjEKKyAgICAgICAgdm1vdiAgICAgICAgZDMsIGQyMAorICAgICAgICB2bW92ICAgICAgICBkNSwgZDIzCisgICAgICAgIHZtb3YgICAgICAgIGQ3LCBkMjIKKworICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICBkc3RbMF0gICBkMAorICAgICAgICBAICAgZHN0WzFdICAgZDIKKyAgICAgICAgQCAgIGRzdFsyXSAgIGQ0CisgICAgICAgIEAgICBkc3RbM10gICBkNgorICAgICAgICBAICAgZHN0WzRdICAgZDEKKyAgICAgICAgQCAgIGRzdFs1XSAgIGQzCisgICAgICAgIEAgICBkc3RbNl0gICBkNQorICAgICAgICBAICAgZHN0WzddICAgZDcKKworICAgICAgICB0cmFuc3Bvc2UxNiAgICAgcTAgcTEgcTIgcTMgICBAIHR1cm4gY29sdW1ucyBpbnRvIHJvd3MKKworICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICByb3dbMF0gcTAKKyAgICAgICAgQCAgIHJvd1sxXSBxMQorICAgICAgICBAICAgcm93WzJdIHEyCisgICAgICAgIEAgICByb3dbM10gcTMKKworICAgICAgICB2YzFfaW52X3RyYW5zXzR4OF9oZWxwZXIgICAgYWRkPTY0IHJzaGlmdD03CisKKyAgICAgICAgQCBBdCB0aGlzIHBvaW50OgorICAgICAgICBAICAgbGluZVswXS5sICAgZDAKKyAgICAgICAgQCAgIGxpbmVbMF0uaCAgIGQxCisgICAgICAgIEAgICBsaW5lWzFdLmwgICBkMgorICAgICAgICBAICAgbGluZVsxXS5oICAgZDMKKyAgICAgICAgQCAgIGxpbmVbMl0ubCAgIGQ0CisgICAgICAgIEAgICBsaW5lWzJdLmggICBkNQorICAgICAgICBAICAgbGluZVszXS5sICAgZDYKKyAgICAgICAgQCAgIGxpbmVbM10uaCAgIGQ3CisKKyAgICAgICAgQCB1bnVzZWQgcmVnaXN0ZXJzOiBxMTIsIHExMywgcTE0LCBxMTUKKworICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyOH0sIFtyMCw6NjRdLCByMSAgICAgQCByZWFkIGRlc3QKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMjl9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMzB9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMzF9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyICAgIEAgcmVzdG9yZSBvcmlnaW5hbCByMCB2YWx1ZQorCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMCwgIHEwLCAgZDI4ICAgICAgICAgICBAIGxpbmVbMF0gKz0gZGVzdFswXQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEsICBxMSwgIGQyOSAgICAgICAgICAgQCBsaW5lWzFdICs9IGRlc3RbMV0KKyAgICAgICAgdmFkZHcudTggICAgICAgIHEyLCAgcTIsICBkMzAgICAgICAgICAgIEAgbGluZVsyXSArPSBkZXN0WzJdCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMywgIHEzLCAgZDMxICAgICAgICAgICBAIGxpbmVbM10gKz0gZGVzdFszXQorCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMCwgIHEwICAgICAgICAgICAgICAgICBAIGxpbmVbMF0KKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQxLCAgcTEgICAgICAgICAgICAgICAgIEAgbGluZVsxXQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIsICBxMiAgICAgICAgICAgICAgICAgQCBsaW5lWzJdCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMywgIHEzICAgICAgICAgICAgICAgICBAIGxpbmVbM10KKworICAgICAgICB2c3QxLjY0ICAgICAgICAge2QwfSwgIFtyMCw6NjRdLCByMSAgICAgQCB3cml0ZSBkZXN0CisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDF9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDJ9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDN9LCAgW3IwLDo2NF0KKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworQCAodWludDhfdCAqZGVzdCBbcjBdLCBpbnQgbGluZXNpemUgW3IxXSwgaW50MTZfdCAqYmxvY2sgW3IyXSkKK2Z1bmN0aW9uIGZmX3ZjMV9pbnZfdHJhbnNfNHg4X25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMoOCAqIDIpICBAIDggZWxlbWVudHMgcGVyIGxpbmUsIGVhY2ggZWxlbWVudCAyIGJ5dGVzCisgICAgICAgIHZsZDQuMTYgICAgICAgICB7ZDBbXSwgIGQyW10sICBkNFtdLCAgZDZbXX0sICBbcjIsOjY0XSwgcjEyICAgICBAIHJlYWQgZWFjaCBjb2x1bW4gaW50byBhIHEgcmVnaXN0ZXIKKyAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMFsxXSwgZDJbMV0sIGQ0WzFdLCBkNlsxXX0sIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMFsyXSwgZDJbMl0sIGQ0WzJdLCBkNlsyXX0sIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMFszXSwgZDJbM10sIGQ0WzNdLCBkNlszXX0sIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMVtdLCAgZDNbXSwgIGQ1W10sICBkN1tdfSwgIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMVsxXSwgZDNbMV0sIGQ1WzFdLCBkN1sxXX0sIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMVsyXSwgZDNbMl0sIGQ1WzJdLCBkN1syXX0sIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMVszXSwgZDNbM10sIGQ1WzNdLCBkN1szXX0sIFtyMiw6NjRdCisKKyAgICAgICAgdmMxX2ludl90cmFuc180eDhfaGVscGVyICAgIGFkZD00IHJzaGlmdD0zCisKKyAgICAgICAgQCBBdCB0aGlzIHBvaW50OgorICAgICAgICBAICAgZHN0WzBdID0gcTAKKyAgICAgICAgQCAgIGRzdFsxXSA9IHExCisgICAgICAgIEAgICBkc3RbMl0gPSBxMgorICAgICAgICBAICAgZHN0WzNdID0gcTMKKworICAgICAgICB0cmFuc3Bvc2UxNiAgICAgcTAgcTEgcTIgcTMgICAgIEAgVHJhbnNwb3NlIHJvd3MgKHJlZ2lzdGVycykgaW50byBjb2x1bW5zCisKKyAgICAgICAgdmMxX2ludl90cmFuc184eDRfaGVscGVyICAgIGFkZD02NCBhZGQxYmVmb3Jlc2hpZnQ9MSByc2hpZnQ9NworCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI4W119LCAgW3IwLDozMl0sIHIxICBAIHJlYWQgZGVzdAorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyOFsxXX0sIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyOVtdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyOVsxXX0sIFtyMCw6MzJdLCByMQorCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDMwW119LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDMwWzBdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDMxW119LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDMxWzBdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMyAgICBAIHJlc3RvcmUgb3JpZ2luYWwgcjAgdmFsdWUKKworICAgICAgICB2YWRkdy51OCAgICAgICAgcTgsICBxOCwgIGQyOCAgICAgICAgICAgQCBsaW5lWzAsMV0gKz0gZGVzdFswLDFdCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxOSwgIHE5LCAgZDI5ICAgICAgICAgICBAIGxpbmVbMiwzXSArPSBkZXN0WzIsM10KKyAgICAgICAgdmFkZHcudTggICAgICAgIHExMCwgcTEwLCBkMzAgICAgICAgICAgIEAgbGluZVs1LDRdICs9IGRlc3RbNSw0XQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTExLCBxMTEsIGQzMSAgICAgICAgICAgQCBsaW5lWzcsNl0gKz0gZGVzdFs3LDZdCisKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQxNiwgcTggICAgICAgICAgICAgICAgIEAgY2xpcChsaW5lWzAsMV0pCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMTgsIHE5ICAgICAgICAgICAgICAgICBAIGNsaXAobGluZVsyLDNdKQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIwLCBxMTAgICAgICAgICAgICAgICAgQCBjbGlwKGxpbmVbNSw0XSkKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyMiwgcTExICAgICAgICAgICAgICAgIEAgY2xpcChsaW5lWzcsNl0pCisKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTZbMF19LCBbcjAsOjMyXSwgcjEgIEAgd3JpdGUgZGVzdAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxNlsxXX0sIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOFswXX0sIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOFsxXX0sIFtyMCw6MzJdLCByMQorCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIwWzFdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIwWzBdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyWzFdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyWzBdfSwgW3IwLDozMl0KKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworQCBTZXR1cCBjb25zdGFudHMgaW4gcmVnaXN0ZXJzIHdoaWNoIGFyZSB1c2VkIGJ5IHZjMV9pbnZfdHJhbnNfNHg0X2hlbHBlcgorLm1hY3JvIHZjMV9pbnZfdHJhbnNfNHg0X2hlbHBlcl9zZXR1cAorICAgICAgICB2bW92LmkxNiAgICAgICAgcTEzLCAjMTcKKyAgICAgICAgdm1vdi5pMTYgICAgICAgIHExNCwgIzIyCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBkMzAsICMxMCAgICAgICAgICAgICAgICBAIG9ubHkgbmVlZCBkb3VibGUtd29yZCwgbm90IHF1YWQtd29yZAorLmVuZG0KKworQCBUaGlzIGlzIG1vZGVsZWQgYWZ0ZXIgdGhlIGZpcnN0IGZvciBsb29wIGluIHZjMV9pbnZfdHJhbnNfNHg0X2MuCisubWFjcm8gdmMxX2ludl90cmFuc180eDRfaGVscGVyIGFkZCByc2hpZnQKKyAgICAgICAgdm1vdi5pMTYgICAgICAgIHEyLCAgI1xhZGQgICAgICAgICAgICAgIEAgdDF8dDIgd2lsbCBhY2N1bXVsYXRlIGhlcmUKKworICAgICAgICB2YWRkLmkxNiAgICAgICAgZDE2LCBkMCwgIGQxICAgICAgICAgICAgQCB0ZW1wMSA9IHNyY1swXSArIHNyY1syXQorICAgICAgICB2c3ViLmkxNiAgICAgICAgZDE3LCBkMCwgIGQxICAgICAgICAgICAgQCB0ZW1wMiA9IHNyY1swXSAtIHNyY1syXQorICAgICAgICB2bXVsLmkxNiAgICAgICAgcTMsICBxMTQsIHExICAgICAgICAgICAgQCB0M3x0NCA9IDIyICogKHNyY1sxXXxzcmNbM10pCisgICAgICAgIHZtbGEuaTE2ICAgICAgICBxMiwgIHExMywgcTggICAgICAgICAgICBAIHQxfHQyID0gMTcgKiAodGVtcDF8dGVtcDIpICsgYWRkCisgICAgICAgIHZtbGEuaTE2ICAgICAgICBkNiwgIGQzMCwgZDMgICAgICAgICAgICBAIHQzICs9IDEwICogc3JjWzNdCisgICAgICAgIHZtbHMuaTE2ICAgICAgICBkNywgIGQzMCwgZDIgICAgICAgICAgICBAIHQ0IC09IDEwICogc3JjWzFdCisKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHEwLCAgcTIsICBxMyAgICAgICAgICAgIEAgZHN0WzAsMl0gPSAodDF8dDIgKyB0M3x0NCkKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExLCAgcTIsICBxMyAgICAgICAgICAgIEAgZHN0WzMsMV0gPSAodDF8dDIgLSB0M3x0NCkKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHEwLCAgcTAsICAjXHJzaGlmdCAgICAgIEAgZHN0WzAsMl0gPj49IHJzaGlmdAorICAgICAgICB2c2hyLnMxNiAgICAgICAgcTEsICBxMSwgICNccnNoaWZ0ICAgICAgQCBkc3RbMywxXSA+Pj0gcnNoaWZ0CisuZW5kbQorCitAICh1aW50OF90ICpkZXN0IFtyMF0sIGludCBsaW5lc2l6ZSBbcjFdLCBpbnQxNl90ICpibG9jayBbcjJdKQorZnVuY3Rpb24gZmZfdmMxX2ludl90cmFuc180eDRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIyg4ICogMikgIEAgOCBlbGVtZW50cyBwZXIgbGluZSwgZWFjaCBlbGVtZW50IDIgYnl0ZXMKKyAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMFtdLCAgZDFbXSwgIGQyW10sICBkM1tdfSwgIFtyMiw6NjRdLCByMTIgICAgIEAgcmVhZCBlYWNoIGNvbHVtbiBpbnRvIGEgcmVnaXN0ZXIKKyAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMFsxXSwgZDFbMV0sIGQyWzFdLCBkM1sxXX0sIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMFsyXSwgZDFbMl0sIGQyWzJdLCBkM1syXX0sIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMFszXSwgZDFbM10sIGQyWzNdLCBkM1szXX0sIFtyMiw6NjRdCisKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQxLCAgZDIgICAgICAgICBAIHNvIHRoYXQgd2UgY2FuIGxhdGVyIGFjY2VzcyBjb2x1bW4gMSBhbmQgY29sdW1uIDMgYXMgYSBzaW5nbGUgcTEgcmVnaXN0ZXIKKworICAgICAgICB2YzFfaW52X3RyYW5zXzR4NF9oZWxwZXJfc2V0dXAKKworICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICBzcmNbMF0gPSBkMAorICAgICAgICBAICAgc3JjWzFdID0gZDIKKyAgICAgICAgQCAgIHNyY1syXSA9IGQxCisgICAgICAgIEAgICBzcmNbM10gPSBkMworCisgICAgICAgIHZjMV9pbnZfdHJhbnNfNHg0X2hlbHBlciBhZGQ9NCByc2hpZnQ9MyAgICAgIEAgY29tcHV0ZSB0MSwgdDIsIHQzLCB0NCBhbmQgY29tYmluZSB0aGVtIGludG8gZHN0WzAtM10KKworICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICBkc3RbMF0gPSBkMAorICAgICAgICBAICAgZHN0WzFdID0gZDMKKyAgICAgICAgQCAgIGRzdFsyXSA9IGQxCisgICAgICAgIEAgICBkc3RbM10gPSBkMgorCisgICAgICAgIHRyYW5zcG9zZTE2ICAgICBkMCBkMyBkMSBkMiAgICAgQCBUcmFuc3Bvc2Ugcm93cyAocmVnaXN0ZXJzKSBpbnRvIGNvbHVtbnMKKworICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICBzcmNbMF0gID0gZDAKKyAgICAgICAgQCAgIHNyY1s4XSAgPSBkMworICAgICAgICBAICAgc3JjWzE2XSA9IGQxCisgICAgICAgIEAgICBzcmNbMjRdID0gZDIKKworICAgICAgICB2c3dwICAgICAgICAgICAgZDIsICBkMyAgICAgICAgIEAgc28gdGhhdCB3ZSBjYW4gbGF0ZXIgYWNjZXNzIGNvbHVtbiAxIGFuZCBjb2x1bW4gMyBpbiBvcmRlciBhcyBhIHNpbmdsZSBxMSByZWdpc3RlcgorCisgICAgICAgIEAgQXQgdGhpcyBwb2ludDoKKyAgICAgICAgQCAgIHNyY1swXSAgPSBkMAorICAgICAgICBAICAgc3JjWzhdICA9IGQyCisgICAgICAgIEAgICBzcmNbMTZdID0gZDEKKyAgICAgICAgQCAgIHNyY1syNF0gPSBkMworCisgICAgICAgIHZjMV9pbnZfdHJhbnNfNHg0X2hlbHBlciBhZGQ9NjQgcnNoaWZ0PTcgICAgICAgICAgICAgIEAgY29tcHV0ZSB0MSwgdDIsIHQzLCB0NCBhbmQgY29tYmluZSB0aGVtIGludG8gZHN0WzAtM10KKworICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICBsaW5lWzBdID0gZDAKKyAgICAgICAgQCAgIGxpbmVbMV0gPSBkMworICAgICAgICBAICAgbGluZVsyXSA9IGQxCisgICAgICAgIEAgICBsaW5lWzNdID0gZDIKKworICAgICAgICB2bGQxLjMyICAgICAgICAge2QxOFtdfSwgIFtyMCw6MzJdLCByMSAgQCByZWFkIGRlc3QKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTlbXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMThbMV19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTlbMF19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyICAgIEAgcmVzdG9yZSBvcmlnaW5hbCByMCB2YWx1ZQorCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMCwgIHEwLCAgZDE4ICAgICAgICAgICBAIGxpbmVbMCwyXSArPSBkZXN0WzAsMl0KKyAgICAgICAgdmFkZHcudTggICAgICAgIHExLCAgcTEsICBkMTkgICAgICAgICAgIEAgbGluZVszLDFdICs9IGRlc3RbMywxXQorCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMCwgIHEwICAgICAgICAgICAgICAgICBAIGNsaXAobGluZVswLDJdKQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxMSAgICAgICAgICAgICAgICAgQCBjbGlwKGxpbmVbMywxXSkKKworICAgICAgICB2c3QxLjMyICAgICAgICAge2QwWzBdfSwgIFtyMCw6MzJdLCByMSAgQCB3cml0ZSBkZXN0CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCAgW3IwLDozMl0KKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworI2lmIEhBVkVfQVNfRE5fRElSRUNUSVZFCitAIFRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBtdWx0aXBsaWNhdGlvbiBjb25zdGFudHMgZnJvbSB2YzFfbXNwZWxfZmlsdGVyIGFuZCB2YzFfbXNwZWxfe3Zlcixob3J9X2ZpbHRlcl8xNmJpdHMuCitAIFRoZSBzaWduIGlzIGVtYmVkZGVkIGluIHRoZSBjb2RlIGJlbG93IHRoYXQgY2FycmllcyBvdXQgdGhlIG11bHRpcGxpY2F0aW9uIChtc3BlbF9maWx0ZXJ7LC4xNn0pLgorI2RlZmluZSBNU1BFTF9NT0RFXzFfTVVMX0NPTlNUQU5UUyAgNCA1MyAxOCAzCisjZGVmaW5lIE1TUEVMX01PREVfMl9NVUxfQ09OU1RBTlRTICAxIDkgIDkgIDEKKyNkZWZpbmUgTVNQRUxfTU9ERV8zX01VTF9DT05TVEFOVFMgIDMgMTggNTMgNAorCitAIFRoZXNlIGNvbnN0YW50cyBhcmUgZnJvbSByZWFkaW5nIHRoZSBzb3VyY2UgY29kZSBvZiB2YzFfbXNwZWxfbWMgYW5kIGRldGVybWluaW5nIHRoZSB2YWx1ZSB0aGF0CitAIGlzIGFkZGVkIHRvIGBybmRgIHRvIHJlc3VsdCBpbiB0aGUgdmFyaWFibGUgYHJgLCBhbmQgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBgc2hpZnRgLgorI2RlZmluZSBNU1BFTF9NT0RFU18xMV9BRERTSElGVF9DT05TVEFOVFMgICAxNSA1CisjZGVmaW5lIE1TUEVMX01PREVTXzEyX0FERFNISUZUX0NPTlNUQU5UUyAgIDMgIDMKKyNkZWZpbmUgTVNQRUxfTU9ERVNfMTNfQUREU0hJRlRfQ09OU1RBTlRTICAgMTUgNQorI2RlZmluZSBNU1BFTF9NT0RFU18yMV9BRERTSElGVF9DT05TVEFOVFMgICBNU1BFTF9NT0RFU18xMl9BRERTSElGVF9DT05TVEFOVFMKKyNkZWZpbmUgTVNQRUxfTU9ERVNfMjJfQUREU0hJRlRfQ09OU1RBTlRTICAgMCAgMQorI2RlZmluZSBNU1BFTF9NT0RFU18yM19BRERTSElGVF9DT05TVEFOVFMgICAzICAzCisjZGVmaW5lIE1TUEVMX01PREVTXzMxX0FERFNISUZUX0NPTlNUQU5UUyAgIE1TUEVMX01PREVTXzEzX0FERFNISUZUX0NPTlNUQU5UUworI2RlZmluZSBNU1BFTF9NT0RFU18zMl9BRERTSElGVF9DT05TVEFOVFMgICBNU1BFTF9NT0RFU18yM19BRERTSElGVF9DT05TVEFOVFMKKyNkZWZpbmUgTVNQRUxfTU9ERVNfMzNfQUREU0hJRlRfQ09OU1RBTlRTICAgMTUgNQorCitAIFRoZSBhZGRpdGlvbiBhbmQgc2hpZnQgY29uc3RhbnRzIGZyb20gdmMxX21zcGVsX2ZpbHRlci4KKyNkZWZpbmUgTVNQRUxfTU9ERV8xX0FERFNISUZUX0NPTlNUQU5UUyAgICAgMzIgNgorI2RlZmluZSBNU1BFTF9NT0RFXzJfQUREU0hJRlRfQ09OU1RBTlRTICAgICA4ICA0CisjZGVmaW5lIE1TUEVMX01PREVfM19BRERTSElGVF9DT05TVEFOVFMgICAgIDMyIDYKKworQCBTZXR1cCBjb25zdGFudHMgaW4gcmVnaXN0ZXJzIGZvciBhIHN1YnNlcXVlbnQgdXNlIG9mIG1zcGVsX2ZpbHRlcnssLjE2fS4KKy5tYWNybyBtc3BlbF9jb25zdGFudHMgdHlwZXNpemUgcmVnX2EgcmVnX2IgcmVnX2MgcmVnX2QgZmlsdGVyX2EgZmlsdGVyX2IgZmlsdGVyX2MgZmlsdGVyX2QgcmVnX2FkZCBmaWx0ZXJfYWRkX3JlZ2lzdGVyCisgIEAgRGVmaW5lIGRvdWJsZS13b3JkIHJlZ2lzdGVyIGFsaWFzZXMuIFR5cGVzaXplIHNob3VsZCBiZSBpOCBvciBpMTYuCisgIHJhIC5kbiBccmVnX2FcKCkuXHR5cGVzaXplCisgIHJiIC5kbiBccmVnX2JcKCkuXHR5cGVzaXplCisgIHJjIC5kbiBccmVnX2NcKCkuXHR5cGVzaXplCisgIHJkIC5kbiBccmVnX2RcKCkuXHR5cGVzaXplCisKKyAgQCBPbmx5IHNldCB0aGUgcmVnaXN0ZXIgaWYgdGhlIHZhbHVlIGlzIG5vdCAxIGFuZCB1bmlxdWUKKyAgLmlmIFxmaWx0ZXJfYSAhPSAxCisgICAgICAgIHZtb3YgICAgICAgICAgICByYSwgICNcZmlsdGVyX2EgICAgICAgICAgICAgIEAgcmEgPSBmaWx0ZXJfYQorICAuZW5kaWYKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHJiLCAgI1xmaWx0ZXJfYiAgICAgICAgICAgICAgQCByYiA9IGZpbHRlcl9iCisgIC5pZiBcZmlsdGVyX2IgIT0gXGZpbHRlcl9jCisgICAgICAgIHZtb3YgICAgICAgICAgICByYywgICNcZmlsdGVyX2MgICAgICAgICAgICAgIEAgcmMgPSBmaWx0ZXJfYworICAuZW5kaWYKKyAgLmlmIFxmaWx0ZXJfZCAhPSAxCisgICAgICAgIHZtb3YgICAgICAgICAgICByZCwgICNcZmlsdGVyX2QgICAgICAgICAgICAgIEAgcmQgPSBmaWx0ZXJfZAorICAuZW5kaWYKKyAgQCB2ZHVwIHRvIGRvdWJsZSB0aGUgc2l6ZSBvZiB0eXBlc2l6ZQorICAuaWZjIFx0eXBlc2l6ZSxpOAorICAgICAgICB2ZHVwLjE2ICAgICAgICAgXHJlZ19hZGQsICBcZmlsdGVyX2FkZF9yZWdpc3RlciAgICAgQCByZWdfYWRkID0gZmlsdGVyX2FkZF9yZWdpc3RlcgorICAuZWxzZQorICAgICAgICB2ZHVwLjMyICAgICAgICAgXHJlZ19hZGQsICBcZmlsdGVyX2FkZF9yZWdpc3RlciAgICAgQCByZWdfYWRkID0gZmlsdGVyX2FkZF9yZWdpc3RlcgorICAuZW5kaWYKKworICAudW5yZXEgcmEKKyAgLnVucmVxIHJiCisgIC51bnJlcSByYworICAudW5yZXEgcmQKKy5lbmRtCisKK0AgQWZ0ZXIgbXNwZWxfY29uc3RhbnRzIGhhcyBiZWVuIHVzZWQsIGRvIHRoZSBmaWx0ZXJpbmcuCisubWFjcm8gbXNwZWxfZmlsdGVyIGFjYyBkZXN0IHNyYzAgc3JjMSBzcmMyIHNyYzMgZmlsdGVyX2EgZmlsdGVyX2IgZmlsdGVyX2MgZmlsdGVyX2QgcmVnX2EgcmVnX2IgcmVnX2MgcmVnX2QgcmVnX2FkZCBmaWx0ZXJfc2hpZnQgbmFycm93PTEKKyAgLmlmIFxmaWx0ZXJfYSAhPSAxCisgICAgICAgIEAgSWYgZmlsdGVyX2EgIT0gMSwgdGhlbiB3ZSBuZWVkIGEgbW92ZSBhbmQgc3VidHJhY3QgaW5zdHJ1Y3Rpb24KKyAgICAgICAgdm1vdiAgICAgICAgICAgIFxhY2MsICBccmVnX2FkZCAgICAgICAgICAgICAgICAgICAgIEAgYWNjID0gcmVnX2FkZAorICAgICAgICB2bWxzbC51OCAgICAgICAgXGFjYywgIFxyZWdfYSwgIFxzcmMwICAgICAgICAgICAgICAgQCBhY2MgLT0gZmlsdGVyX2EgKiBzcmNbLXN0cmlkZV0KKyAgLmVsc2UKKyAgICAgICAgQCBJZiBmaWx0ZXJfYSBpcyAxLCB0aGVuIGp1c3Qgc3VidHJhY3Qgd2l0aG91dCBhbiBleHRyYSBtb3ZlCisgICAgICAgIHZzdWJ3LnU4ICAgICAgICBcYWNjLCAgXHJlZ19hZGQsICBcc3JjMCAgICAgICAgICAgICBAIGFjYyA9IHJlZ19hZGQgLSBzcmNbLXN0cmlkZV0gICAgICBAIHNpbmNlIGZpbHRlcl9hID09IDEKKyAgLmVuZGlmCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBcYWNjLCAgXHJlZ19iLCAgXHNyYzEgICAgICAgICAgICAgICBAIGFjYyArPSBmaWx0ZXJfYiAqIHNyY1swXQorICAuaWYgXGZpbHRlcl9iICE9IFxmaWx0ZXJfYworICAgICAgICB2bWxhbC51OCAgICAgICAgXGFjYywgIFxyZWdfYywgIFxzcmMyICAgICAgICAgICAgICAgQCBhY2MgKz0gZmlsdGVyX2MgKiBzcmNbc3RyaWRlXQorICAuZWxzZQorICAgICAgICBAIElmIGZpbHRlcl9iIGlzIHRoZSBzYW1lIGFzIGZpbHRlcl9jLCB1c2UgdGhlIHNhbWUgcmVnX2IgcmVnaXN0ZXIKKyAgICAgICAgdm1sYWwudTggICAgICAgIFxhY2MsICBccmVnX2IsICBcc3JjMiAgICAgICAgICAgICAgIEAgYWNjICs9IGZpbHRlcl9jICogc3JjW3N0cmlkZV0gICAgIEAgd2hlcmUgZmlsdGVyX2MgPT0gZmlsdGVyX2IKKyAgLmVuZGlmCisgIC5pZiBcZmlsdGVyX2QgIT0gMQorICAgICAgICBAIElmIGZpbHRlcl9kICE9IDEsIHRoZW4gZG8gYSBtdWx0aXBseSBhY2N1bXVsYXRlCisgICAgICAgIHZtbHNsLnU4ICAgICAgICBcYWNjLCAgXHJlZ19kLCAgXHNyYzMgICAgICAgICAgICAgICBAIGFjYyAtPSBmaWx0ZXJfZCAqIHNyY1tzdHJpZGUgKiAyXQorICAuZWxzZQorICAgICAgICBAIElmIGZpbHRlcl9kIGlzIDEsIHRoZW4ganVzdCBkbyBhIHN1YnRyYWN0CisgICAgICAgIHZzdWJ3LnU4ICAgICAgICBcYWNjLCAgXGFjYywgICAgXHNyYzMgICAgICAgICAgICAgICBAIGFjYyAtPSBzcmNbc3RyaWRlICogMl0gICAgICAgICAgICBAIHNpbmNlIGZpbHRlcl9kID09IDEKKyAgLmVuZGlmCisgIC5pZiBcbmFycm93CisgICAgICAgIHZxc2hydW4uczE2ICAgICBcZGVzdCwgXGFjYywgICAgI1xmaWx0ZXJfc2hpZnQgICAgICBAIGRlc3QgPSBjbGlwX3VpbnQ4KGFjYyA+PiBmaWx0ZXJfc2hpZnQpCisgIC5lbHNlCisgICAgICAgIHZzaHIuczE2ICAgICAgICBcZGVzdCwgXGFjYywgICAgI1xmaWx0ZXJfc2hpZnQgICAgICBAIGRlc3QgPSBhY2MgPj4gZmlsdGVyX3NoaWZ0CisgIC5lbmRpZgorLmVuZG0KKworQCBUaGlzIGlzIHNpbWlsYXIgdG8gbXNwZWxfZmlsdGVyLCBidXQgdGhlIGlucHV0IGlzIDE2LWJpdCBpbnN0ZWFkIG9mIDgtYml0IGFuZCBuYXJyb3c9MCBpcyBub3Qgc3VwcG9ydGVkLgorLm1hY3JvIG1zcGVsX2ZpbHRlci4xNiBhY2MwIGFjYzEgYWNjMF8wIGFjYzBfMSBkZXN0IHNyYzAgc3JjMSBzcmMyIHNyYzMgc3JjNCBzcmM1IHNyYzYgc3JjNyBmaWx0ZXJfYSBmaWx0ZXJfYiBmaWx0ZXJfYyBmaWx0ZXJfZCByZWdfYSByZWdfYiByZWdfYyByZWdfZCByZWdfYWRkIGZpbHRlcl9zaGlmdAorICAuaWYgXGZpbHRlcl9hICE9IDEKKyAgICAgICAgdm1vdiAgICAgICAgICAgIFxhY2MwLCAgXHJlZ19hZGQKKyAgICAgICAgdm1vdiAgICAgICAgICAgIFxhY2MxLCAgXHJlZ19hZGQKKyAgICAgICAgdm1sc2wuczE2ICAgICAgIFxhY2MwLCAgXHJlZ19hLCAgXHNyYzAKKyAgICAgICAgdm1sc2wuczE2ICAgICAgIFxhY2MxLCAgXHJlZ19hLCAgXHNyYzEKKyAgLmVsc2UKKyAgICAgICAgdnN1YncuczE2ICAgICAgIFxhY2MwLCAgXHJlZ19hZGQsICBcc3JjMAorICAgICAgICB2c3Vidy5zMTYgICAgICAgXGFjYzEsICBccmVnX2FkZCwgIFxzcmMxCisgIC5lbmRpZgorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGFjYzAsICBccmVnX2IsICBcc3JjMgorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGFjYzEsICBccmVnX2IsICBcc3JjMworICAuaWYgXGZpbHRlcl9iICE9IFxmaWx0ZXJfYworICAgICAgICB2bWxhbC5zMTYgICAgICAgXGFjYzAsICBccmVnX2MsICBcc3JjNAorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGFjYzEsICBccmVnX2MsICBcc3JjNQorICAuZWxzZQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGFjYzAsICBccmVnX2IsICBcc3JjNAorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGFjYzEsICBccmVnX2IsICBcc3JjNQorICAuZW5kaWYKKyAgLmlmIFxmaWx0ZXJfZCAhPSAxCisgICAgICAgIHZtbHNsLnMxNiAgICAgICBcYWNjMCwgIFxyZWdfZCwgIFxzcmM2CisgICAgICAgIHZtbHNsLnMxNiAgICAgICBcYWNjMSwgIFxyZWdfZCwgIFxzcmM3CisgIC5lbHNlCisgICAgICAgIHZzdWJ3LnMxNiAgICAgICBcYWNjMCwgIFxhY2MwLCAgIFxzcmM2CisgICAgICAgIHZzdWJ3LnMxNiAgICAgICBcYWNjMSwgIFxhY2MxLCAgIFxzcmM3CisgIC5lbmRpZgorICAgICAgICBAIFVzZSBhY2MwXzAgYW5kIGFjYzBfMSBhcyB0ZW1wIHNwYWNlCisgICAgICAgIHZxc2hydW4uczMyICAgICBcYWNjMF8wLCBcYWNjMCwgICNcZmlsdGVyX3NoaWZ0ICAgICBAIFNoaWZ0IGFuZCBuYXJyb3cgd2l0aCBzYXR1cmF0aW9uIGZyb20gczMyIHRvIHUxNgorICAgICAgICB2cXNocnVuLnMzMiAgICAgXGFjYzBfMSwgXGFjYzEsICAjXGZpbHRlcl9zaGlmdAorICAgICAgICB2cW1vdm4udTE2ICAgICAgXGRlc3QsICBcYWNjMCAgICAgICAgICAgICAgICAgICAgICAgQCBOYXJyb3cgd2l0aCBzYXR1cmF0aW9uIGZyb20gdTE2IHRvIHU4CisuZW5kbQorCitAIFJlZ2lzdGVyIHVzYWdlIGZvciBwdXRfdmMxX21zcGVsX21jIGZ1bmN0aW9ucy4gUmVnaXN0ZXJzIG1hcmtlZCAnaHYnIGFyZSBvbmx5IHVzZWQgaW4gcHV0X3ZjMV9tc3BlbF9tY19odi4KK0AKK0AgICByMCAgICAgICAgYWRqdXN0ZWQgZHN0CitAICAgcjEgICAgICAgIGFkanVzdGVkIHNyYworQCAgIHIyICAgICAgICBzdHJpZGUKK0AgICByMyAgICAgICAgYWRqdXN0ZWQgcm5kCitAICAgcjQgW2h2XSAgIHRtcAorQCAgIHIxMSBbaHZdICBzcCBzYXZlZAorQCAgIHIxMiAgICAgICBsb29wIGNvdW50ZXIKK0AgICBkMCAgICAgICAgc3JjWy1zdHJpZGVdCitAICAgZDEgICAgICAgIHNyY1swXQorQCAgIGQyICAgICAgICBzcmNbc3RyaWRlXQorQCAgIGQzICAgICAgICBzcmNbc3RyaWRlICogMl0KK0AgICBxMCBbaHZdICAgc3JjWy1zdHJpZGVdCitAICAgcTEgW2h2XSAgIHNyY1swXQorQCAgIHEyIFtodl0gICBzcmNbc3RyaWRlXQorQCAgIHEzIFtodl0gICBzcmNbc3RyaWRlICogMl0KK0AgICBkMjEgICAgICAgb2Z0ZW4gcmVzdWx0IGZyb20gbXNwZWxfZmlsdGVyCitAICAgcTExICAgICAgIGFjY3VtdWxhdG9yIDAKK0AgICBxMTIgW2h2XSAgYWNjdW11bGF0b3IgMQorQCAgIHExMyAgICAgICBhY2N1bXVsYXRvciBpbml0aWFsIHZhbHVlCitAICAgZDI4ICAgICAgIGZpbHRlcl9hCitAICAgZDI5ICAgICAgIGZpbHRlcl9iCitAICAgZDMwICAgICAgIGZpbHRlcl9jCitAICAgZDMxICAgICAgIGZpbHRlcl9kCisKK0AgKHVpbnQ4X3QgKmRzdCBbcjBdLCBjb25zdCB1aW50OF90ICpzcmMgW3IxXSwgcHRyZGlmZl90IHN0cmlkZSBbcjJdLCBpbnQgcm5kIFtyM10pCisubWFjcm8gcHV0X3ZjMV9tc3BlbF9tY19odiBobW9kZSB2bW9kZSBmaWx0ZXJfaF9hIGZpbHRlcl9oX2IgZmlsdGVyX2hfYyBmaWx0ZXJfaF9kIGZpbHRlcl92X2EgZmlsdGVyX3ZfYiBmaWx0ZXJfdl9jIGZpbHRlcl92X2QgZmlsdGVyX2FkZCBmaWx0ZXJfc2hpZnQKK2Z1bmN0aW9uIGZmX3B1dF92YzFfbXNwZWxfbWNcaG1vZGVcKClcdm1vZGVcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCwgcjExLCBscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMSwgc3AgICAgICAgICAgICAgICAgIEAgcjExID0gc3RhY2sgcG9pbnRlciBiZWZvcmUgcmVhbGlnbm1uZXQKK0EgICAgICAgYmljICAgICAgICAgICAgIHNwLCAgc3AsICAjMTUgICAgICAgICAgIEAgc3AgPSByb3VuZCBkb3duIHRvIG11bHRpcGxlIG9mIDE2IGJ5dGVzCitUICAgICAgIGJpYyAgICAgICAgICAgICByNCwgIHIxMSwgIzE1CitUICAgICAgIG1vdiAgICAgICAgICAgICBzcCwgIHI0CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIyg4KjIqMTYpICAgICBAIG1ha2Ugc3BhY2UgZm9yIDggcm93cyAqIDIgYnl0ZSBwZXIgZWxlbWVudCAqIDE2IGVsZW1lbnRzIHBlciByb3cgKHRvIGZpdCAxMSBhY3R1YWwgZWxlbWVudHMgcGVyIHJvdykKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI0LCAgc3AgICAgICAgICAgICAgICAgIEAgcjQgPSBpbnQxNl90IHRtcFs4ICogMTZdCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMSAgICAgICAgICAgIEAgc3JjIC09IDEKKyAgLmlmIFxmaWx0ZXJfYWRkICE9IDAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjMsICAjXGZpbHRlcl9hZGQgIEAgcjMgPSBmaWx0ZXJfYWRkICsgcm5kCisgIC5lbmRpZgorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjOCAgICAgICAgICAgICAgICAgQCBsb29wIGNvdW50ZXIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiAgICAgICAgICAgIEAgcjEgPSAmc3JjWy1zdHJpZGVdICAgICAgQCBzbGlkZSBiYWNrCisKKyAgICAgICAgQCBEbyB2ZXJ0aWNhbCBmaWx0ZXJpbmcgZnJvbSBzcmMgaW50byB0bXAKKyAgICAgICAgbXNwZWxfY29uc3RhbnRzIGk4IGQyOCBkMjkgZDMwIGQzMSBcZmlsdGVyX3ZfYSBcZmlsdGVyX3ZfYiBcZmlsdGVyX3ZfYyBcZmlsdGVyX3ZfZCBxMTMgcjMKKworICAgICAgICB2bGQxLjY0ICAgICAgICAge2QwLGQxfSwgW3IxXSwgcjIKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMixkM30sIFtyMV0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDQsZDV9LCBbcjFdLCByMgorCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCAgcjEyLCAgIzQKKworICAgICAgICB2bGQxLjY0ICAgICAgICAge2Q2LGQ3fSwgW3IxXSwgcjIKKyAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMSBxMTEgZDAgZDIgZDQgZDYgXGZpbHRlcl92X2EgXGZpbHRlcl92X2IgXGZpbHRlcl92X2MgXGZpbHRlcl92X2QgZDI4IGQyOSBkMzAgZDMxIHExMyBcZmlsdGVyX3NoaWZ0IG5hcnJvdz0wCisgICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTIgcTEyIGQxIGQzIGQ1IGQ3IFxmaWx0ZXJfdl9hIFxmaWx0ZXJfdl9iIFxmaWx0ZXJfdl9jIFxmaWx0ZXJfdl9kIGQyOCBkMjkgZDMwIGQzMSBxMTMgXGZpbHRlcl9zaGlmdCBuYXJyb3c9MAorICAgICAgICB2c3QxLjY0ICAgICAgICAge3ExMSxxMTJ9LCBbcjQsOjEyOF0hICAgQCBzdG9yZSBhbmQgaW5jcmVtZW50CisKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMCxkMX0sIFtyMV0sIHIyCisgICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTEgcTExIGQyIGQ0IGQ2IGQwIFxmaWx0ZXJfdl9hIFxmaWx0ZXJfdl9iIFxmaWx0ZXJfdl9jIFxmaWx0ZXJfdl9kIGQyOCBkMjkgZDMwIGQzMSBxMTMgXGZpbHRlcl9zaGlmdCBuYXJyb3c9MAorICAgICAgICBtc3BlbF9maWx0ZXIgICAgcTEyIHExMiBkMyBkNSBkNyBkMSBcZmlsdGVyX3ZfYSBcZmlsdGVyX3ZfYiBcZmlsdGVyX3ZfYyBcZmlsdGVyX3ZfZCBkMjggZDI5IGQzMCBkMzEgcTEzIFxmaWx0ZXJfc2hpZnQgbmFycm93PTAKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtxMTEscTEyfSwgW3I0LDoxMjhdISAgIEAgc3RvcmUgYW5kIGluY3JlbWVudAorCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDIsZDN9LCBbcjFdLCByMgorICAgICAgICBtc3BlbF9maWx0ZXIgICAgcTExIHExMSBkNCBkNiBkMCBkMiBcZmlsdGVyX3ZfYSBcZmlsdGVyX3ZfYiBcZmlsdGVyX3ZfYyBcZmlsdGVyX3ZfZCBkMjggZDI5IGQzMCBkMzEgcTEzIFxmaWx0ZXJfc2hpZnQgbmFycm93PTAKKyAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMiBxMTIgZDUgZDcgZDEgZDMgXGZpbHRlcl92X2EgXGZpbHRlcl92X2IgXGZpbHRlcl92X2MgXGZpbHRlcl92X2QgZDI4IGQyOSBkMzAgZDMxIHExMyBcZmlsdGVyX3NoaWZ0IG5hcnJvdz0wCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7cTExLHExMn0sIFtyNCw6MTI4XSEgICBAIHN0b3JlIGFuZCBpbmNyZW1lbnQKKworICAgICAgICB2bGQxLjY0ICAgICAgICAge2Q0LGQ1fSwgW3IxXSwgcjIKKyAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMSBxMTEgZDYgZDAgZDIgZDQgXGZpbHRlcl92X2EgXGZpbHRlcl92X2IgXGZpbHRlcl92X2MgXGZpbHRlcl92X2QgZDI4IGQyOSBkMzAgZDMxIHExMyBcZmlsdGVyX3NoaWZ0IG5hcnJvdz0wCisgICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTIgcTEyIGQ3IGQxIGQzIGQ1IFxmaWx0ZXJfdl9hIFxmaWx0ZXJfdl9iIFxmaWx0ZXJfdl9jIFxmaWx0ZXJfdl9kIGQyOCBkMjkgZDMwIGQzMSBxMTMgXGZpbHRlcl9zaGlmdCBuYXJyb3c9MAorICAgICAgICB2c3QxLjY0ICAgICAgICAge3ExMSxxMTJ9LCBbcjQsOjEyOF0hICAgQCBzdG9yZSBhbmQgaW5jcmVtZW50CisKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcnNiICAgICAgICAgICAgIHIzLCAgIHIzLCAgIyg2NCArIFxmaWx0ZXJfYWRkKSAgICAgIEAgcjMgPSAoNjQgKyBmaWx0ZXJfYWRkKSAtIHIzCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICAjOCAgICAgICAgICAgICAgICBAIGxvb3AgY291bnRlcgorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICAgc3AgICAgICAgICAgICAgICAgQCByNCA9IHRtcAorCisgICAgICAgIEAgRG8gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgZnJvbSB0ZW1wIHRvIGRzdAorICAgICAgICBtc3BlbF9jb25zdGFudHMgaTE2IGQyOCBkMjkgZDMwIGQzMSBcZmlsdGVyX2hfYSBcZmlsdGVyX2hfYiBcZmlsdGVyX2hfYyBcZmlsdGVyX2hfZCBxMTMgcjMKKworMjoKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgIHIxMiwgICMxCisKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtxMCxxMX0sIFtyNCw6MTI4XSEgICAgIEAgcmVhZCBvbmUgbGluZSBvZiB0bXAKKyAgICAgICAgdmV4dC4xNiAgICAgICAgIHEyLCAgIHEwLCAgIHExLCAgIzIKKyAgICAgICAgdmV4dC4xNiAgICAgICAgIHEzLCAgIHEwLCAgIHExLCAgIzMKKyAgICAgICAgdmV4dC4xNiAgICAgICAgIHExLCAgIHEwLCAgIHExLCAgIzEgICAgIEAgZG8gbGFzdCBiZWNhdXNlIGl0IHdyaXRlcyB0byBxMSB3aGljaCBpcyByZWFkIGJ5IHRoZSBvdGhlciB2ZXh0IGluc3RydWN0aW9ucworCisgICAgICAgIG1zcGVsX2ZpbHRlci4xNiBxMTEgcTEyIGQyMiBkMjMgZDIxIGQwIGQxIGQyIGQzIGQ0IGQ1IGQ2IGQ3IFxmaWx0ZXJfaF9hIFxmaWx0ZXJfaF9iIFxmaWx0ZXJfaF9jIFxmaWx0ZXJfaF9kIGQyOCBkMjkgZDMwIGQzMSBxMTMgNworCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDIxfSwgW3IwLDo2NF0sIHIyICAgICBAIHN0b3JlIGFuZCBpbmNyZW1lbnQgZHN0CisKKyAgICAgICAgYm5lICAgICAgICAgICAgIDJiCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHNwLCAgcjExCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQsIHIxMSwgcGN9CitlbmRmdW5jCisuZW5kbQorCitAIFVzZSBDIHByZXByb2Nlc3NvciBhbmQgYXNzZW1ibGVyIG1hY3JvcyB0byBleHBhbmQgdG8gZnVuY3Rpb25zIGZvciBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBmaWx0ZXJpbmcuCisjZGVmaW5lIFBVVF9WQzFfTVNQRUxfTUNfSFYoaG1vZGUsIHZtb2RlKSAgIFwKKyAgICBwdXRfdmMxX21zcGVsX21jX2h2IGhtb2RlIHZtb2RlIFwKKyAgICAgICAgTVNQRUxfTU9ERV8gIyMgaG1vZGUgIyMgX01VTF9DT05TVEFOVFMgXAorICAgICAgICBNU1BFTF9NT0RFXyAjIyB2bW9kZSAjIyBfTVVMX0NPTlNUQU5UUyBcCisgICAgICAgIE1TUEVMX01PREVTXyAjIyBobW9kZSAjIyB2bW9kZSAjIyBfQUREU0hJRlRfQ09OU1RBTlRTCisKK1BVVF9WQzFfTVNQRUxfTUNfSFYoMSwgMSkKK1BVVF9WQzFfTVNQRUxfTUNfSFYoMSwgMikKK1BVVF9WQzFfTVNQRUxfTUNfSFYoMSwgMykKK1BVVF9WQzFfTVNQRUxfTUNfSFYoMiwgMSkKK1BVVF9WQzFfTVNQRUxfTUNfSFYoMiwgMikKK1BVVF9WQzFfTVNQRUxfTUNfSFYoMiwgMykKK1BVVF9WQzFfTVNQRUxfTUNfSFYoMywgMSkKK1BVVF9WQzFfTVNQRUxfTUNfSFYoMywgMikKK1BVVF9WQzFfTVNQRUxfTUNfSFYoMywgMykKKworI3VuZGVmIFBVVF9WQzFfTVNQRUxfTUNfSFYKKworLm1hY3JvICBwdXRfdmMxX21zcGVsX21jX2hfb25seSBobW9kZSBmaWx0ZXJfYSBmaWx0ZXJfYiBmaWx0ZXJfYyBmaWx0ZXJfZCBmaWx0ZXJfYWRkIGZpbHRlcl9zaGlmdAorZnVuY3Rpb24gZmZfcHV0X3ZjMV9tc3BlbF9tY1xobW9kZVwoKTBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcnNiICAgICAgICAgICAgIHIzLCAgIHIzLCAgICNcZmlsdGVyX2FkZCAgICAgICAgQCByMyA9IGZpbHRlcl9hZGQgLSByID0gZmlsdGVyX2FkZCAtIHJuZAorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAgIzggICAgICAgICAgICAgICAgICAgICAgICBAIGxvb3AgY291bnRlcgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICAgcjEsICAgIzEgICAgICAgICAgICAgICAgICBAIHNsaWRlIGJhY2ssIHVzaW5nIGltbWVkaWF0ZQorCisgICAgICAgIG1zcGVsX2NvbnN0YW50cyBpOCBkMjggZDI5IGQzMCBkMzEgXGZpbHRlcl9hIFxmaWx0ZXJfYiBcZmlsdGVyX2MgXGZpbHRlcl9kIHExMyByMworCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCAgcjEyLCAgIzEKKworICAgICAgICB2bGQxLjY0ICAgICAgICAge2QwLGQxfSwgW3IxXSwgcjIgICAgICAgICAgICAgICBAIHJlYWQgMTYgYnl0ZXMgZXZlbiB0aG91Z2ggd2Ugb25seSBuZWVkIDExLCBhbHNvIHNyYyArPSBzdHJpZGUKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQyLCAgIGQwLCAgIGQxLCAgIzIKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQzLCAgIGQwLCAgIGQxLCAgIzMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQxLCAgIGQwLCAgIGQxLCAgIzEgICAgICAgICAgICAgQCBkbyBsYXN0IGJlY2F1c2UgaXQgd3JpdGVzIHRvIGQxIHdoaWNoIGlzIHJlYWQgYnkgdGhlIG90aGVyIHZleHQgaW5zdHJ1Y3Rpb25zCisKKyAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMSBkMjEgZDAgZDEgZDIgZDMgXGZpbHRlcl9hIFxmaWx0ZXJfYiBcZmlsdGVyX2MgXGZpbHRlcl9kIGQyOCBkMjkgZDMwIGQzMSBxMTMgXGZpbHRlcl9zaGlmdAorCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDIxfSwgW3IwLDo2NF0sIHIyICAgICAgICAgICAgIEAgc3RvcmUgYW5kIGluY3JlbWVudCBkc3QKKworICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKy5lbmRtCisKK0AgVXNlIEMgcHJlcHJvY2Vzc29yIGFuZCBhc3NlbWJsZXIgbWFjcm9zIHRvIGV4cGFuZCB0byBmdW5jdGlvbnMgZm9yIGhvcml6b250YWwgb25seSBmaWx0ZXJpbmcuCisjZGVmaW5lIFBVVF9WQzFfTVNQRUxfTUNfSF9PTkxZKGhtb2RlKSBcCisgICAgICAgIHB1dF92YzFfbXNwZWxfbWNfaF9vbmx5IGhtb2RlIE1TUEVMX01PREVfICMjIGhtb2RlICMjIF9NVUxfQ09OU1RBTlRTIE1TUEVMX01PREVfICMjIGhtb2RlICMjIF9BRERTSElGVF9DT05TVEFOVFMKKworUFVUX1ZDMV9NU1BFTF9NQ19IX09OTFkoMSkKK1BVVF9WQzFfTVNQRUxfTUNfSF9PTkxZKDIpCitQVVRfVkMxX01TUEVMX01DX0hfT05MWSgzKQorCisjdW5kZWYgUFVUX1ZDMV9NU1BFTF9NQ19IX09OTFkKKworQCAodWludDhfdCAqZHN0IFtyMF0sIGNvbnN0IHVpbnQ4X3QgKnNyYyBbcjFdLCBwdHJkaWZmX3Qgc3RyaWRlIFtyMl0sIGludCBybmQgW3IzXSkKKy5tYWNybyBwdXRfdmMxX21zcGVsX21jX3Zfb25seSB2bW9kZSBmaWx0ZXJfYSBmaWx0ZXJfYiBmaWx0ZXJfYyBmaWx0ZXJfZCBmaWx0ZXJfYWRkIGZpbHRlcl9zaGlmdAorZnVuY3Rpb24gZmZfcHV0X3ZjMV9tc3BlbF9tYzBcdm1vZGVcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgIHIzLCAgICNcZmlsdGVyX2FkZCAtIDEgICAgQCByMyA9IGZpbHRlcl9hZGQgLSByID0gZmlsdGVyX2FkZCAtICgxIC0gcm5kKSA9IGZpbHRlcl9hZGQgLSAxICsgcm5kCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICAjOCAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9vcCBjb3VudGVyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgICByMSwgICByMiAgICAgICAgICAgICAgICAgIEAgcjEgPSAmc3JjWy1zdHJpZGVdICAgICAgQCBzbGlkZSBiYWNrCisKKyAgICAgICAgbXNwZWxfY29uc3RhbnRzIGk4IGQyOCBkMjkgZDMwIGQzMSBcZmlsdGVyX2EgXGZpbHRlcl9iIFxmaWx0ZXJfYyBcZmlsdGVyX2QgcTEzIHIzCisKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMH0sICBbcjFdLCByMiAgICAgICAgICAgICAgICAgQCBkMCA9IHNyY1stc3RyaWRlXQorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxfSwgIFtyMV0sIHIyICAgICAgICAgICAgICAgICBAIGQxID0gc3JjWzBdCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDJ9LCAgW3IxXSwgcjIgICAgICAgICAgICAgICAgIEAgZDIgPSBzcmNbc3RyaWRlXQorCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCAgcjEyLCAgIzQKKworICAgICAgICB2bGQxLjY0ICAgICAgICAge2QzfSwgIFtyMV0sIHIyICAgICAgICAgICAgICAgICBAIGQzID0gc3JjW3N0cmlkZSAqIDJdCisgICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTEgZDIxIGQwIGQxIGQyIGQzIFxmaWx0ZXJfYSBcZmlsdGVyX2IgXGZpbHRlcl9jIFxmaWx0ZXJfZCBkMjggZDI5IGQzMCBkMzEgcTEzIFxmaWx0ZXJfc2hpZnQKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMjF9LCBbcjAsOjY0XSwgcjIgICAgICAgICAgICAgQCBzdG9yZSBhbmQgaW5jcmVtZW50IGRzdAorCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDB9LCAgW3IxXSwgcjIgICAgICAgICAgICAgICAgIEAgZDAgPSBuZXh0IGxpbmUKKyAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMSBkMjEgZDEgZDIgZDMgZDAgXGZpbHRlcl9hIFxmaWx0ZXJfYiBcZmlsdGVyX2MgXGZpbHRlcl9kIGQyOCBkMjkgZDMwIGQzMSBxMTMgXGZpbHRlcl9zaGlmdAorICAgICAgICB2c3QxLjY0ICAgICAgICAge2QyMX0sIFtyMCw6NjRdLCByMiAgICAgICAgICAgICBAIHN0b3JlIGFuZCBpbmNyZW1lbnQgZHN0CisKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMX0sICBbcjFdLCByMiAgICAgICAgICAgICAgICAgQCBkMSA9IG5leHQgbGluZQorICAgICAgICBtc3BlbF9maWx0ZXIgICAgcTExIGQyMSBkMiBkMyBkMCBkMSBcZmlsdGVyX2EgXGZpbHRlcl9iIFxmaWx0ZXJfYyBcZmlsdGVyX2QgZDI4IGQyOSBkMzAgZDMxIHExMyBcZmlsdGVyX3NoaWZ0CisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDIxfSwgW3IwLDo2NF0sIHIyICAgICAgICAgICAgIEAgc3RvcmUgYW5kIGluY3JlbWVudCBkc3QKKworICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyfSwgIFtyMV0sIHIyICAgICAgICAgICAgICAgICBAIGQyID0gbmV4dCBsaW5lCisgICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTEgZDIxIGQzIGQwIGQxIGQyIFxmaWx0ZXJfYSBcZmlsdGVyX2IgXGZpbHRlcl9jIFxmaWx0ZXJfZCBkMjggZDI5IGQzMCBkMzEgcTEzIFxmaWx0ZXJfc2hpZnQKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMjF9LCBbcjAsOjY0XSwgcjIgICAgICAgICAgICAgQCBzdG9yZSBhbmQgaW5jcmVtZW50IGRzdAorCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKworQCBVc2UgQyBwcmVwcm9jZXNzb3IgYW5kIGFzc2VtYmxlciBtYWNyb3MgdG8gZXhwYW5kIHRvIGZ1bmN0aW9ucyBmb3IgdmVydGljYWwgb25seSBmaWx0ZXJpbmcuCisjZGVmaW5lIFBVVF9WQzFfTVNQRUxfTUNfVl9PTkxZKHZtb2RlKSBcCisgICAgICAgIHB1dF92YzFfbXNwZWxfbWNfdl9vbmx5IHZtb2RlIE1TUEVMX01PREVfICMjIHZtb2RlICMjIF9NVUxfQ09OU1RBTlRTIE1TUEVMX01PREVfICMjIHZtb2RlICMjIF9BRERTSElGVF9DT05TVEFOVFMKKworUFVUX1ZDMV9NU1BFTF9NQ19WX09OTFkoMSkKK1BVVF9WQzFfTVNQRUxfTUNfVl9PTkxZKDIpCitQVVRfVkMxX01TUEVMX01DX1ZfT05MWSgzKQorCisjdW5kZWYgUFVUX1ZDMV9NU1BFTF9NQ19WX09OTFkKKyNlbmRpZgorCitmdW5jdGlvbiBmZl9wdXRfcGl4ZWxzOHg4X25lb24sIGV4cG9ydD0xCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDB9LCBbcjFdLCByMgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxfSwgW3IxXSwgcjIKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMn0sIFtyMV0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDN9LCBbcjFdLCByMgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2Q0fSwgW3IxXSwgcjIKKyAgICAgICAgdmxkMS42NCAgICAgICAgIHtkNX0sIFtyMV0sIHIyCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDZ9LCBbcjFdLCByMgorICAgICAgICB2bGQxLjY0ICAgICAgICAge2Q3fSwgW3IxXQorICAgICAgICB2c3QxLjY0ICAgICAgICAge2QwfSwgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDF9LCBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMn0sIFtyMCw6NjRdLCByMgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2QzfSwgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDR9LCBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkNX0sIFtyMCw6NjRdLCByMgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2Q2fSwgW3IwLDo2NF0sIHIyCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDd9LCBbcjAsOjY0XQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdmMxX2ludl90cmFuc184eDhfZGNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyc2ggICAgICAgICAgIHIyLCBbcjJdICAgICAgICAgICAgICBAIGludCBkYyA9IGJsb2NrWzBdOworCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDB9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDF9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDR9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDV9LCAgW3IwLDo2NF0sIHIxCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjIsIGxzbCAjMSAgICBAIGRjID0gKDMgKiBkYyArICAxKSA+PiAxOworICAgICAgICB2bGQxLjY0ICAgICAgICAge2Q2fSwgIFtyMCw6NjRdLCByMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsIHIyLCAjMQorICAgICAgICB2bGQxLjY0ICAgICAgICAge2Q3fSwgIFtyMCw6NjRdLCByMQorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxNn0sIFtyMCw6NjRdLCByMQorICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxN30sIFtyMCw6NjRdLCByMQorICAgICAgICBhc3IgICAgICAgICAgICAgcjIsIHIyLCAjMQorCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMyAgQCByZXN0b3JlIHIwIHRvIG9yaWdpbmFsIHZhbHVlCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjIsIGxzbCAjMSAgICBAIGRjID0gKDMgKiBkYyArIDE2KSA+PiA1OworICAgICAgICBhZGQgICAgICAgICAgICAgcjIsIHIyLCAjMTYKKyAgICAgICAgYXNyICAgICAgICAgICAgIHIyLCByMiwgIzUKKworICAgICAgICB2ZHVwLjE2ICAgICAgICAgcTEsICByMiAgICAgICAgICAgICAgIEAgZGMKKworICAgICAgICB2YWRkdy51OCAgICAgICAgcTksICAgcTEsICBkMAorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEwLCAgcTEsICBkMQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTExLCAgcTEsICBkNAorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEyLCAgcTEsICBkNQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxOQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxMTAKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ0LCAgcTExCisgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDB9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNSwgIHExMgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2QxfSwgIFtyMCw6NjRdLCByMQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEzLCAgcTEsICBkNgorICAgICAgICB2c3QxLjY0ICAgICAgICAge2Q0fSwgIFtyMCw6NjRdLCByMQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTE0LCAgcTEsICBkNworICAgICAgICB2c3QxLjY0ICAgICAgICAge2Q1fSwgIFtyMCw6NjRdLCByMQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTE1LCAgcTEsICBkMTYKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExLCAgIHExLCAgZDE3ICAgICAgICBAIHRoaXMgZGVzdHJveXMgcTEKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ2LCAgcTEzCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNywgIHExNAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDE2LCBxMTUKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQxNywgcTEKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkNn0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkN30sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMTZ9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMTd9LCBbcjAsOjY0XQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdmMxX2ludl90cmFuc184eDRfZGNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyc2ggICAgICAgICAgIHIyLCBbcjJdICAgICAgICAgICAgICBAIGludCBkYyA9IGJsb2NrWzBdOworCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDB9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDF9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDR9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDV9LCAgW3IwLDo2NF0sIHIxCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjIsIGxzbCAjMSAgICBAIGRjID0gKCAzICogZGMgKyAgMSkgPj4gMTsKKworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzIgIEAgcmVzdG9yZSByMCB0byBvcmlnaW5hbCB2YWx1ZQorCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgcjIsICMxCisgICAgICAgIGFzciAgICAgICAgICAgICByMiwgcjIsICMxCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjIsIGxzbCAjNCAgICBAIGRjID0gKDE3ICogZGMgKyA2NCkgPj4gNzsKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgIzY0CisgICAgICAgIGFzciAgICAgICAgICAgICByMiwgcjIsICM3CisKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHExLCAgcjIgICAgICAgICAgICAgICBAIGRjCisKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEzLCAgcTEsICBkMAorICAgICAgICB2YWRkdy51OCAgICAgICAgcTgsICBxMSwgIGQxCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxOSwgIHExLCAgZDQKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExMCwgcTEsICBkNQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxMworICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxOAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDQsICBxOQorICAgICAgICB2c3QxLjY0ICAgICAgICAge2QwfSwgIFtyMCw6NjRdLCByMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDUsICBxMTAKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMX0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkNH0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS42NCAgICAgICAgIHtkNX0sICBbcjAsOjY0XQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdmMxX2ludl90cmFuc180eDhfZGNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyc2ggICAgICAgICAgIHIyLCBbcjJdICAgICAgICAgICAgICBAIGludCBkYyA9IGJsb2NrWzBdOworCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDBbXX0sICAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDFbXX0sICAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDBbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDFbMV19LCAgW3IwLDozMl0sIHIxCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjIsIGxzbCAjNCAgICBAIGRjID0gKDE3ICogZGMgKyAgNCkgPj4gMzsKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNFtdfSwgICBbcjAsOjMyXSwgcjEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgIzQKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNVtdfSwgICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNFsxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgYXNyICAgICAgICAgICAgIHIyLCByMiwgIzMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNVsxXX0sICBbcjAsOjMyXSwgcjEKKworICAgICAgICBhZGQgICAgICAgICAgICAgcjIsIHIyLCByMiwgbHNsICMxICAgIEAgZGMgPSAoMTIgKiBkYyArIDY0KSA+PiA3OworCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMyAgQCByZXN0b3JlIHIwIHRvIG9yaWdpbmFsIHZhbHVlCisKKyAgICAgICAgbHNsICAgICAgICAgICAgIHIyLCByMiwgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgIzY0CisgICAgICAgIGFzciAgICAgICAgICAgICByMiwgcjIsICM3CisKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHExLCAgcjIgICAgICAgICAgICAgICBAIGRjCisKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEzLCAgcTEsICBkMAorICAgICAgICB2YWRkdy51OCAgICAgICAgcTgsICBxMSwgIGQxCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxOSwgIHExLCAgZDQKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExMCwgcTEsICBkNQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxMworICAgICAgICB2c3QxLjMyICAgICAgICAge2QwWzBdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxOAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxWzBdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDQsICBxOQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwWzFdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDUsICBxMTAKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMVsxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNFswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNVswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNFsxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNVsxXX0sICBbcjAsOjMyXQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdmMxX2ludl90cmFuc180eDRfZGNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyc2ggICAgICAgICAgIHIyLCBbcjJdICAgICAgICAgICAgICBAIGludCBkYyA9IGJsb2NrWzBdOworCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDBbXX0sICAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDFbXX0sICAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDBbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDFbMV19LCAgW3IwLDozMl0sIHIxCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjIsIGxzbCAjNCAgICBAIGRjID0gKDE3ICogZGMgKyAgNCkgPj4gMzsKKworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzIgIEAgcmVzdG9yZSByMCB0byBvcmlnaW5hbCB2YWx1ZQorCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgcjIsICM0CisgICAgICAgIGFzciAgICAgICAgICAgICByMiwgcjIsICMzCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgcjIsIGxzbCAjNCAgICBAIGRjID0gKDE3ICogZGMgKyA2NCkgPj4gNzsKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCByMiwgIzY0CisgICAgICAgIGFzciAgICAgICAgICAgICByMiwgcjIsICM3CisKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHExLCAgcjIgICAgICAgICAgICAgICBAIGRjCisKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEyLCAgcTEsICBkMAorICAgICAgICB2YWRkdy51OCAgICAgICAgcTMsICBxMSwgIGQxCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMCwgIHEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMSwgIHEzCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMV19LCAgW3IwLDozMl0KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdmlkZW9kc3BfYXJtLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdmlkZW9kc3BfYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyY2JiOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92aWRlb2RzcF9hcm0uaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVJNX1ZJREVPRFNQX0FSTV9ICisjZGVmaW5lIEFWQ09ERUNfQVJNX1ZJREVPRFNQX0FSTV9ICisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZpZGVvZHNwLmgiCisKK3ZvaWQgZmZfdmlkZW9kc3BfaW5pdF9hcm12NXRlKFZpZGVvRFNQQ29udGV4dCogY3R4LCBpbnQgYnBjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQVJNX1ZJREVPRFNQX0FSTV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdmlkZW9kc3BfYXJtdjV0ZS5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZpZGVvZHNwX2FybXY1dGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWJjY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZpZGVvZHNwX2FybXY1dGUuUwpAQCAtMCwwICsxLDMxIEBACitACitAIEFSTXY1dGUtb3B0aW1pemVkIGNvcmUgdmlkZW8gRFNQIGZ1bmN0aW9ucworQCBDb3B5cmlnaHQgKGMpIDIwMDQgQUdBV0EgS29qaSA8aSAoQVQpIGF0dHkgKERPVCkganA+CitACitAIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZworQAorQCBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCitAIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0AgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCitAIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorQAorQCBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK0AgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK0AgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0AgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KK0AKK0AgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworQCBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitAIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKK0AKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKK2Z1bmN0aW9uIGZmX3ByZWZldGNoX2FybSwgZXhwb3J0PTEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjMQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IwXQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIxCisgICAgICAgIGJuZSAgICAgICAgICAgICBYKGZmX3ByZWZldGNoX2FybSkKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdmlkZW9kc3BfaW5pdF9hcm0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92aWRlb2RzcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OWFiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdmlkZW9kc3BfaW5pdF9hcm0uYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFJvbmFsZCBTLiBCdWx0amUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZpZGVvZHNwLmgiCisjaW5jbHVkZSAidmlkZW9kc3BfYXJtLmgiCisKK2F2X2NvbGQgdm9pZCBmZl92aWRlb2RzcF9pbml0X2FybShWaWRlb0RTUENvbnRleHQgKmN0eCwgaW50IGJwYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgIGlmIChoYXZlX2FybXY1dGUoY3B1X2ZsYWdzKSkgZmZfdmlkZW9kc3BfaW5pdF9hcm12NXRlKGN0eCwgYnBjKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92aWRlb2RzcF9pbml0X2FybXY1dGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92aWRlb2RzcF9pbml0X2FybXY1dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWExZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZpZGVvZHNwX2luaXRfYXJtdjV0ZS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgUm9uYWxkIFMuIEJ1bHRqZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdmlkZW9kc3AuaCIKKyNpbmNsdWRlICJ2aWRlb2RzcF9hcm0uaCIKKwordm9pZCBmZl9wcmVmZXRjaF9hcm0odWludDhfdCAqbWVtLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCk7CisKK2F2X2NvbGQgdm9pZCBmZl92aWRlb2RzcF9pbml0X2FybXY1dGUoVmlkZW9EU1BDb250ZXh0ICpjdHgsIGludCBicGMpCit7CisjaWYgSEFWRV9BUk1WNVRFX0VYVEVSTkFMCisgICAgY3R4LT5wcmVmZXRjaCA9IGZmX3ByZWZldGNoX2FybTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZvcmJpc2RzcF9pbml0X2FybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZvcmJpc2RzcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjNkODAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdm9yYmlzZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIEFSTSBORU9OIG9wdGltaXNlZCBEU1AgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdm9yYmlzZHNwLmgiCisKK3ZvaWQgZmZfdm9yYmlzX2ludmVyc2VfY291cGxpbmdfbmVvbihmbG9hdCAqbWFnLCBmbG9hdCAqYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGJsb2Nrc2l6ZSk7CisKK2F2X2NvbGQgdm9pZCBmZl92b3JiaXNkc3BfaW5pdF9hcm0oVm9yYmlzRFNQQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnZvcmJpc19pbnZlcnNlX2NvdXBsaW5nID0gZmZfdm9yYmlzX2ludmVyc2VfY291cGxpbmdfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdm9yYmlzZHNwX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92b3JiaXNkc3BfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Y2U1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdm9yYmlzZHNwX25lb24uUwpAQCAtMCwwICsxLDgzIEBACisvKgorICogQVJNIE5FT04gb3B0aW1pc2VkIERTUCBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKK2Z1bmN0aW9uIGZmX3ZvcmJpc19pbnZlcnNlX2NvdXBsaW5nX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZtb3YuaTMyICAgICAgICBxMTAsICMxPDwzMQorICAgICAgICBzdWJzICAgICAgICAgICAgcjIsICByMiwgICM0CisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgIHIwCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsIHIxCisgICAgICAgIGJlcSAgICAgICAgICAgICAzZgorCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI0LWQyNX0sW3IxLDoxMjhdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyMi1kMjN9LFtyMCw6MTI4XSEKKyAgICAgICAgdmNsZS5zMzIgICAgICAgIHE4LCAgcTEyLCAjMAorICAgICAgICB2YW5kICAgICAgICAgICAgcTksICBxMTEsIHExMAorICAgICAgICB2ZW9yICAgICAgICAgICAgcTEyLCBxMTIsIHE5CisgICAgICAgIHZhbmQgICAgICAgICAgICBxMiwgIHExMiwgcTgKKyAgICAgICAgdmJpYyAgICAgICAgICAgIHEzLCAgcTEyLCBxOAorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTEyLCBxMTEsIHEyCisgICAgICAgIHZzdWIuZjMyICAgICAgICBxMTEsIHExMSwgcTMKKzE6ICAgICAgdmxkMS4zMiAgICAgICAgIHtkMi1kM30sICBbcjEsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDAtZDF9LCAgW3IwLDoxMjhdIQorICAgICAgICB2Y2xlLnMzMiAgICAgICAgcTgsICBxMSwgICMwCisgICAgICAgIHZhbmQgICAgICAgICAgICBxOSwgIHEwLCAgcTEwCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMSwgIHExLCAgcTkKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjQtZDI1fSxbcjMsIDoxMjhdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyMi1kMjN9LFtyMTIsOjEyOF0hCisgICAgICAgIHZhbmQgICAgICAgICAgICBxMiwgIHExLCAgcTgKKyAgICAgICAgdmJpYyAgICAgICAgICAgIHEzLCAgcTEsICBxOAorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTEsICBxMCwgIHEyCisgICAgICAgIHZzdWIuZjMyICAgICAgICBxMCwgIHEwLCAgcTMKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjOAorICAgICAgICBibGUgICAgICAgICAgICAgMmYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjQtZDI1fSxbcjEsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDIyLWQyM30sW3IwLDoxMjhdIQorICAgICAgICB2Y2xlLnMzMiAgICAgICAgcTgsICBxMTIsICMwCisgICAgICAgIHZhbmQgICAgICAgICAgICBxOSwgIHExMSwgcTEwCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMTIsIHExMiwgcTkKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMi1kM30sICBbcjMsIDoxMjhdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwLWQxfSwgIFtyMTIsOjEyOF0hCisgICAgICAgIHZhbmQgICAgICAgICAgICBxMiwgIHExMiwgcTgKKyAgICAgICAgdmJpYyAgICAgICAgICAgIHEzLCAgcTEyLCBxOAorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTEyLCBxMTEsIHEyCisgICAgICAgIHZzdWIuZjMyICAgICAgICBxMTEsIHExMSwgcTMKKyAgICAgICAgYiAgICAgICAgICAgICAgIDFiCisKKzI6ICAgICAgdnN0MS4zMiAgICAgICAgIHtkMi1kM30sICBbcjMsIDoxMjhdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwLWQxfSwgIFtyMTIsOjEyOF0hCisgICAgICAgIGl0ICAgICAgICAgICAgICBsdAorICAgICAgICBieGx0ICAgICAgICAgICAgbHIKKworMzogICAgICB2bGQxLjMyICAgICAgICAge2QyLWQzfSwgIFtyMSw6MTI4XQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwLWQxfSwgIFtyMCw6MTI4XQorICAgICAgICB2Y2xlLnMzMiAgICAgICAgcTgsICBxMSwgICMwCisgICAgICAgIHZhbmQgICAgICAgICAgICBxOSwgIHEwLCAgcTEwCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMSwgIHExLCAgcTkKKyAgICAgICAgdmFuZCAgICAgICAgICAgIHEyLCAgcTEsICBxOAorICAgICAgICB2YmljICAgICAgICAgICAgcTMsICBxMSwgIHE4CisgICAgICAgIHZhZGQuZjMyICAgICAgICBxMSwgIHEwLCAgcTIKKyAgICAgICAgdnN1Yi5mMzIgICAgICAgIHEwLCAgcTAsICBxMworICAgICAgICB2c3QxLjMyICAgICAgICAge2QyLWQzfSwgIFtyMCw6MTI4XSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMC1kMX0sICBbcjEsOjEyOF0hCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwM2RzcF9pbml0X2FybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwM2RzcF9pbml0X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MjQ2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnAzZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdnAzZHNwLmgiCisKK3ZvaWQgZmZfdnAzX2lkY3RfcHV0X25lb24odWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqZGF0YSk7Cit2b2lkIGZmX3ZwM19pZGN0X2FkZF9uZW9uKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmRhdGEpOwordm9pZCBmZl92cDNfaWRjdF9kY19hZGRfbmVvbih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsKKwordm9pZCBmZl92cDNfdl9sb29wX2ZpbHRlcl9uZW9uKHVpbnQ4X3QgKiwgaW50LCBpbnQgKik7Cit2b2lkIGZmX3ZwM19oX2xvb3BfZmlsdGVyX25lb24odWludDhfdCAqLCBpbnQsIGludCAqKTsKKworYXZfY29sZCB2b2lkIGZmX3ZwM2RzcF9pbml0X2FybShWUDNEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5pZGN0X3B1dCAgICAgID0gZmZfdnAzX2lkY3RfcHV0X25lb247CisgICAgICAgIGMtPmlkY3RfYWRkICAgICAgPSBmZl92cDNfaWRjdF9hZGRfbmVvbjsKKyAgICAgICAgYy0+aWRjdF9kY19hZGQgICA9IGZmX3ZwM19pZGN0X2RjX2FkZF9uZW9uOworICAgICAgICBjLT52X2xvb3BfZmlsdGVyID0gZmZfdnAzX3ZfbG9vcF9maWx0ZXJfbmVvbjsKKyAgICAgICAgYy0+aF9sb29wX2ZpbHRlciA9IGZmX3ZwM19oX2xvb3BfZmlsdGVyX25lb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwM2RzcF9uZW9uLlMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnAzZHNwX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTQyZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwM2RzcF9uZW9uLlMKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRGF2aWQgQ29ucmFkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitjb25zdCAgIHZwM19pZGN0X2NvbnN0YW50cywgYWxpZ249NAorLnNob3J0IDY0Mjc3LCA2MDU0NywgNTQ0OTEsIDQ2MzQxLCAzNjQxMCwgMjUwODAsIDEyNzg1CitlbmRjb25zdAorCisjZGVmaW5lIHhDMVM3IGQwWzBdCisjZGVmaW5lIHhDMlM2IGQwWzFdCisjZGVmaW5lIHhDM1M1IGQwWzJdCisjZGVmaW5lIHhDNFM0IGQwWzNdCisjZGVmaW5lIHhDNVMzIGQxWzBdCisjZGVmaW5lIHhDNlMyIGQxWzFdCisjZGVmaW5lIHhDN1MxIGQxWzJdCisKKy5tYWNybyB2cDNfbG9vcF9maWx0ZXIKKyAgICB2c3VibC51OCAgICAgICAgcTMsICBkMTgsIGQxNworICAgIHZzdWJsLnU4ICAgICAgICBxMiwgIGQxNiwgZDE5CisgICAgdmFkZC5pMTYgICAgICAgIHExLCAgcTMsICBxMworICAgIHZhZGQuaTE2ICAgICAgICBxMiwgIHEyLCAgcTMKKyAgICB2YWRkLmkxNiAgICAgICAgcTAsICBxMSwgIHEyCisgICAgdnJzaHIuczE2ICAgICAgIHEwLCAgcTAsICAjMworICAgIHZtb3ZsLnU4ICAgICAgICBxOSwgIGQxOAorICAgIHZkdXAudTE2ICAgICAgICBxMTUsIHIyCisKKyAgICB2YWJzLnMxNiAgICAgICAgcTEsICBxMAorICAgIHZzaHIuczE2ICAgICAgICBxMCwgIHEwLCAgIzE1CisgICAgdnFzdWIudTE2ICAgICAgIHEyLCAgcTE1LCBxMQorICAgIHZxc3ViLnUxNiAgICAgICBxMywgIHEyLCAgcTEKKyAgICB2c3ViLmkxNiAgICAgICAgcTEsICBxMiwgIHEzCisgICAgdmVvciAgICAgICAgICAgIHExLCAgcTEsICBxMAorICAgIHZzdWIuaTE2ICAgICAgICBxMCwgIHExLCAgcTAKKworICAgIHZhZGR3LnU4ICAgICAgICBxMiwgIHEwLCAgZDE3CisgICAgdnN1Yi5pMTYgICAgICAgIHEzLCAgcTksICBxMAorICAgIHZxbW92dW4uczE2ICAgICBkMCwgIHEyCisgICAgdnFtb3Z1bi5zMTYgICAgIGQxLCAgcTMKKy5lbmRtCisKK2Z1bmN0aW9uIGZmX3ZwM192X2xvb3BfZmlsdGVyX25lb24sIGV4cG9ydD0xCisgICAgc3ViICAgICAgICAgICAgIGlwLCAgcjAsICByMQorICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsICBsc2wgIzEKKyAgICB2bGQxLjY0ICAgICAgICAge2QxNn0sIFtyMCw6NjRdLCByMQorICAgIHZsZDEuNjQgICAgICAgICB7ZDE3fSwgW3IwLDo2NF0sIHIxCisgICAgdmxkMS42NCAgICAgICAgIHtkMTh9LCBbcjAsOjY0XSwgcjEKKyAgICB2bGQxLjY0ICAgICAgICAge2QxOX0sIFtyMCw6NjRdLCByMQorICAgIGxkcmIgICAgICAgICAgICByMiwgICAgW3IyLCAjMTI5KjRdCisKKyAgICB2cDNfbG9vcF9maWx0ZXIKKworICAgIHZzdDEuNjQgICAgICAgICB7ZDB9LCAgW2lwLDo2NF0sIHIxCisgICAgdnN0MS42NCAgICAgICAgIHtkMX0sICBbaXAsOjY0XSwgcjEKKyAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnAzX2hfbG9vcF9maWx0ZXJfbmVvbiwgZXhwb3J0PTEKKyAgICBzdWIgICAgICAgICAgICAgaXAsICByMCwgICMxCisgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjMgorICAgIHZsZDEuMzIgICAgICAgICB7ZDE2W119LCAgW3IwXSwgcjEKKyAgICB2bGQxLjMyICAgICAgICAge2QxN1tdfSwgIFtyMF0sIHIxCisgICAgdmxkMS4zMiAgICAgICAgIHtkMThbXX0sICBbcjBdLCByMQorICAgIHZsZDEuMzIgICAgICAgICB7ZDE5W119LCAgW3IwXSwgcjEKKyAgICB2bGQxLjMyICAgICAgICAge2QxNlsxXX0sIFtyMF0sIHIxCisgICAgdmxkMS4zMiAgICAgICAgIHtkMTdbMV19LCBbcjBdLCByMQorICAgIHZsZDEuMzIgICAgICAgICB7ZDE4WzFdfSwgW3IwXSwgcjEKKyAgICB2bGQxLjMyICAgICAgICAge2QxOVsxXX0sIFtyMF0sIHIxCisgICAgbGRyYiAgICAgICAgICAgIHIyLCAgW3IyLCAjMTI5KjRdCisKKyAgICB2dHJuLjggICAgICAgICAgZDE2LCBkMTcKKyAgICB2dHJuLjggICAgICAgICAgZDE4LCBkMTkKKyAgICB2dHJuLjE2ICAgICAgICAgZDE2LCBkMTgKKyAgICB2dHJuLjE2ICAgICAgICAgZDE3LCBkMTkKKworICAgIHZwM19sb29wX2ZpbHRlcgorCisgICAgdnRybi44ICAgICAgICAgIGQwLCAgZDEKKworICAgIHZzdDEuMTYgICAgICAgICB7ZDBbMF19LCBbaXBdLCByMQorICAgIHZzdDEuMTYgICAgICAgICB7ZDFbMF19LCBbaXBdLCByMQorICAgIHZzdDEuMTYgICAgICAgICB7ZDBbMV19LCBbaXBdLCByMQorICAgIHZzdDEuMTYgICAgICAgICB7ZDFbMV19LCBbaXBdLCByMQorICAgIHZzdDEuMTYgICAgICAgICB7ZDBbMl19LCBbaXBdLCByMQorICAgIHZzdDEuMTYgICAgICAgICB7ZDFbMl19LCBbaXBdLCByMQorICAgIHZzdDEuMTYgICAgICAgICB7ZDBbM119LCBbaXBdLCByMQorICAgIHZzdDEuMTYgICAgICAgICB7ZDFbM119LCBbaXBdLCByMQorICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCisKK2Z1bmN0aW9uIHZwM19pZGN0X3N0YXJ0X25lb24KKyAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKyAgICB2bW92LmkxNiAgICAgICAgcTQsICAjMAorICAgIHZtb3YuaTE2ICAgICAgICBxNSwgICMwCisgICAgbW92cmVsICAgICAgICAgIHIzLCAgdnAzX2lkY3RfY29uc3RhbnRzCisgICAgdmxkMS42NCAgICAgICAgIHtkMC1kMX0sICAgW3IzLDoxMjhdCisgICAgdmxkMS42NCAgICAgICAgIHtkMTYtZDE5fSwgW3IyLDoxMjhdCisgICAgdnN0MS42NCAgICAgICAgIHtxNC1xNX0sICAgW3IyLDoxMjhdIQorICAgIHZsZDEuNjQgICAgICAgICB7ZDIwLWQyM30sIFtyMiw6MTI4XQorICAgIHZzdDEuNjQgICAgICAgICB7cTQtcTV9LCAgIFtyMiw6MTI4XSEKKyAgICB2bGQxLjY0ICAgICAgICAge2QyNC1kMjd9LCBbcjIsOjEyOF0KKyAgICB2c3QxLjY0ICAgICAgICAge3E0LXE1fSwgICBbcjIsOjEyOF0hCisgICAgdmFkZC5zMTYgICAgICAgIHExLCAgcTgsICBxMTIKKyAgICB2c3ViLnMxNiAgICAgICAgcTgsICBxOCwgIHExMgorICAgIHZsZDEuNjQgICAgICAgICB7ZDI4LWQzMX0sIFtyMiw6MTI4XQorICAgIHZzdDEuNjQgICAgICAgICB7cTQtcTV9LCAgIFtyMiw6MTI4XSEKKwordnAzX2lkY3RfY29yZV9uZW9uOgorICAgIHZtdWxsLnMxNiAgICAgICBxMiwgIGQxOCwgeEMxUzcgICAgIC8vIChpcFsxXSAqIEMxKSA8PCAxNgorICAgIHZtdWxsLnMxNiAgICAgICBxMywgIGQxOSwgeEMxUzcKKyAgICB2bXVsbC5zMTYgICAgICAgcTQsICBkMiwgIHhDNFM0ICAgICAvLyAoKGlwWzBdICsgaXBbNF0pICogQzQpIDw8IDE2CisgICAgdm11bGwuczE2ICAgICAgIHE1LCAgZDMsICB4QzRTNAorICAgIHZtdWxsLnMxNiAgICAgICBxNiwgIGQxNiwgeEM0UzQgICAgIC8vICgoaXBbMF0gLSBpcFs0XSkgKiBDNCkgPDwgMTYKKyAgICB2bXVsbC5zMTYgICAgICAgcTcsICBkMTcsIHhDNFM0CisgICAgdnNocm4uczMyICAgICAgIGQ0LCAgcTIsICAjMTYKKyAgICB2c2hybi5zMzIgICAgICAgZDUsICBxMywgICMxNgorICAgIHZzaHJuLnMzMiAgICAgICBkNiwgIHE0LCAgIzE2CisgICAgdnNocm4uczMyICAgICAgIGQ3LCAgcTUsICAjMTYKKyAgICB2c2hybi5zMzIgICAgICAgZDgsICBxNiwgICMxNgorICAgIHZzaHJuLnMzMiAgICAgICBkOSwgIHE3LCAgIzE2CisgICAgdmFkZC5zMTYgICAgICAgIHExMiwgcTEsICBxMyAgICAgICAgLy8gRSA9IChpcFswXSArIGlwWzRdKSAqIEM0CisgICAgdmFkZC5zMTYgICAgICAgIHE4LCAgcTgsICBxNCAgICAgICAgLy8gRiA9IChpcFswXSAtIGlwWzRdKSAqIEM0CisgICAgdmFkZC5zMTYgICAgICAgIHExLCAgcTIsICBxOSAgICAgICAgLy8gaXBbMV0gKiBDMQorCisgICAgdm11bGwuczE2ICAgICAgIHEyLCAgZDMwLCB4QzFTNyAgICAgLy8gKGlwWzddICogQzEpIDw8IDE2CisgICAgdm11bGwuczE2ICAgICAgIHEzLCAgZDMxLCB4QzFTNworICAgIHZtdWxsLnMxNiAgICAgICBxNCwgIGQzMCwgeEM3UzEgICAgIC8vIChpcFs3XSAqIEM3KSA8PCAxNgorICAgIHZtdWxsLnMxNiAgICAgICBxNSwgIGQzMSwgeEM3UzEKKyAgICB2bXVsbC5zMTYgICAgICAgcTYsICBkMTgsIHhDN1MxICAgICAvLyAoaXBbMV0gKiBDNykgPDwgMTYKKyAgICB2bXVsbC5zMTYgICAgICAgcTcsICBkMTksIHhDN1MxCisgICAgdnNocm4uczMyICAgICAgIGQ0LCAgcTIsICAjMTYKKyAgICB2c2hybi5zMzIgICAgICAgZDUsICBxMywgICMxNgorICAgIHZzaHJuLnMzMiAgICAgICBkNiwgIHE0LCAgIzE2ICAgICAgIC8vIGlwWzddICogQzcKKyAgICB2c2hybi5zMzIgICAgICAgZDcsICBxNSwgICMxNgorICAgIHZzaHJuLnMzMiAgICAgICBkOCwgIHE2LCAgIzE2ICAgICAgIC8vIGlwWzFdICogQzcKKyAgICB2c2hybi5zMzIgICAgICAgZDksICBxNywgICMxNgorICAgIHZhZGQuczE2ICAgICAgICBxMiwgIHEyLCAgcTE1ICAgICAgIC8vIGlwWzddICogQzEKKyAgICB2YWRkLnMxNiAgICAgICAgcTksICBxMSwgIHEzICAgICAgICAvLyBBID0gaXBbMV0gKiBDMSArIGlwWzddICogQzcKKyAgICB2c3ViLnMxNiAgICAgICAgcTE1LCBxNCwgIHEyICAgICAgICAvLyBCID0gaXBbMV0gKiBDNyAtIGlwWzddICogQzEKKworICAgIHZtdWxsLnMxNiAgICAgICBxMiwgIGQyMiwgeEM1UzMgICAgIC8vIChpcFszXSAqIEM1KSA8PCAxNgorICAgIHZtdWxsLnMxNiAgICAgICBxMywgIGQyMywgeEM1UzMKKyAgICB2bXVsbC5zMTYgICAgICAgcTQsICBkMjIsIHhDM1M1ICAgICAvLyAoaXBbM10gKiBDMykgPDwgMTYKKyAgICB2bXVsbC5zMTYgICAgICAgcTUsICBkMjMsIHhDM1M1CisgICAgdm11bGwuczE2ICAgICAgIHE2LCAgZDI2LCB4QzVTMyAgICAgLy8gKGlwWzVdICogQzUpIDw8IDE2CisgICAgdm11bGwuczE2ICAgICAgIHE3LCAgZDI3LCB4QzVTMworICAgIHZzaHJuLnMzMiAgICAgICBkNCwgIHEyLCAgIzE2CisgICAgdnNocm4uczMyICAgICAgIGQ1LCAgcTMsICAjMTYKKyAgICB2c2hybi5zMzIgICAgICAgZDYsICBxNCwgICMxNgorICAgIHZzaHJuLnMzMiAgICAgICBkNywgIHE1LCAgIzE2CisgICAgdnNocm4uczMyICAgICAgIGQ4LCAgcTYsICAjMTYKKyAgICB2c2hybi5zMzIgICAgICAgZDksICBxNywgICMxNgorICAgIHZhZGQuczE2ICAgICAgICBxMywgIHEzLCAgcTExICAgICAgIC8vIGlwWzNdICogQzMKKyAgICB2YWRkLnMxNiAgICAgICAgcTQsICBxNCwgIHExMyAgICAgICAvLyBpcFs1XSAqIEM1CisgICAgdmFkZC5zMTYgICAgICAgIHExLCAgcTIsICBxMTEgICAgICAgLy8gaXBbM10gKiBDNQorICAgIHZhZGQuczE2ICAgICAgICBxMTEsIHEzLCAgcTQgICAgICAgIC8vIEMgPSBpcFszXSAqIEMzICsgaXBbNV0gKiBDNQorCisgICAgdm11bGwuczE2ICAgICAgIHEyLCAgZDI2LCB4QzNTNSAgICAgLy8gKGlwWzVdICogQzMpIDw8IDE2CisgICAgdm11bGwuczE2ICAgICAgIHEzLCAgZDI3LCB4QzNTNQorICAgIHZtdWxsLnMxNiAgICAgICBxNCwgIGQyMCwgeEMyUzYgICAgIC8vIChpcFsyXSAqIEMyKSA8PCAxNgorICAgIHZtdWxsLnMxNiAgICAgICBxNSwgIGQyMSwgeEMyUzYKKyAgICB2bXVsbC5zMTYgICAgICAgcTYsICBkMjgsIHhDNlMyICAgICAvLyAoaXBbNl0gKiBDNikgPDwgMTYKKyAgICB2bXVsbC5zMTYgICAgICAgcTcsICBkMjksIHhDNlMyCisgICAgdnNocm4uczMyICAgICAgIGQ0LCAgcTIsICAjMTYKKyAgICB2c2hybi5zMzIgICAgICAgZDUsICBxMywgICMxNgorICAgIHZzaHJuLnMzMiAgICAgICBkNiwgIHE0LCAgIzE2CisgICAgdnNocm4uczMyICAgICAgIGQ3LCAgcTUsICAjMTYKKyAgICB2c2hybi5zMzIgICAgICAgZDgsICBxNiwgICMxNiAgICAgICAvLyBpcFs2XSAqIEM2CisgICAgdnNocm4uczMyICAgICAgIGQ5LCAgcTcsICAjMTYKKyAgICB2YWRkLnMxNiAgICAgICAgcTIsICBxMiwgIHExMyAgICAgICAvLyBpcFs1XSAqIEMzCisgICAgdmFkZC5zMTYgICAgICAgIHEzLCAgcTMsICBxMTAgICAgICAgLy8gaXBbMl0gKiBDMgorICAgIHZzdWIuczE2ICAgICAgICBxMTMsIHEyLCAgcTEgICAgICAgIC8vIEQgPSBpcFs1XSAqIEMzIC0gaXBbM10gKiBDNQorICAgIHZzdWIuczE2ICAgICAgICBxMSwgIHE5LCAgcTExICAgICAgIC8vIChBIC0gQykKKyAgICB2YWRkLnMxNiAgICAgICAgcTExLCBxOSwgIHExMSAgICAgICAvLyBDZCA9IEEgKyBDCisgICAgdnN1Yi5zMTYgICAgICAgIHE5LCAgcTE1LCBxMTMgICAgICAgLy8gKEIgLSBEKQorICAgIHZhZGQuczE2ICAgICAgICBxMTMsIHExNSwgcTEzICAgICAgIC8vIERkID0gQiArIEQKKyAgICB2YWRkLnMxNiAgICAgICAgcTE1LCBxMywgIHE0ICAgICAgICAvLyBHID0gaXBbMl0gKiBDMiArIGlwWzZdICogQzYKKworICAgIHZtdWxsLnMxNiAgICAgICBxMiwgIGQyLCAgeEM0UzQgICAgIC8vICgoQSAtIEMpICogQzQpIDw8IDE2CisgICAgdm11bGwuczE2ICAgICAgIHEzLCAgZDMsICB4QzRTNAorICAgIHZtdWxsLnMxNiAgICAgICBxNCwgIGQyOCwgeEMyUzYgICAgIC8vIChpcFs2XSAqIEMyKSA8PCAxNgorICAgIHZtdWxsLnMxNiAgICAgICBxNSwgIGQyOSwgeEMyUzYKKyAgICB2bXVsbC5zMTYgICAgICAgcTYsICBkMjAsIHhDNlMyICAgICAvLyAoaXBbMl0gKiBDNikgPDwgMTYKKyAgICB2bXVsbC5zMTYgICAgICAgcTcsICBkMjEsIHhDNlMyCisgICAgdnNocm4uczMyICAgICAgIGQ0LCAgcTIsICAjMTYKKyAgICB2c2hybi5zMzIgICAgICAgZDUsICBxMywgICMxNgorICAgIHZzaHJuLnMzMiAgICAgICBkNiwgIHE0LCAgIzE2CisgICAgdnNocm4uczMyICAgICAgIGQ3LCAgcTUsICAjMTYKKyAgICB2c2hybi5zMzIgICAgICAgZDgsICBxNiwgICMxNiAgICAgICAvLyBpcFsyXSAqIEM2CisgICAgdm11bGwuczE2ICAgICAgIHE1LCAgZDE4LCB4QzRTNCAgICAgLy8gKChCIC0gRCkgKiBDNCkgPDwgMTYKKyAgICB2bXVsbC5zMTYgICAgICAgcTYsICBkMTksIHhDNFM0CisgICAgdnNocm4uczMyICAgICAgIGQ5LCAgcTcsICAjMTYKKyAgICB2YWRkLnMxNiAgICAgICAgcTMsICBxMywgIHExNCAgICAgICAvLyBpcFs2XSAqIEMyCisgICAgdmFkZC5zMTYgICAgICAgIHExMCwgcTEsICBxMiAgICAgICAgLy8gQWQgPSAoQSAtIEMpICogQzQKKyAgICB2c3ViLnMxNiAgICAgICAgcTE0LCBxNCwgIHEzICAgICAgICAvLyBIID0gaXBbMl0gKiBDNiAtIGlwWzZdICogQzIKKyAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworLm1hY3JvIFZQM19JRENUX0VORCB0eXBlCitmdW5jdGlvbiB2cDNfaWRjdF9lbmRfXHR5cGVcKClfbmVvbgorLmlmYyBcdHlwZSwgY29sCisgICAgdmR1cC4xNiAgICAgICAgIHEwLCAgcjMKKyAgICB2YWRkLnMxNiAgICAgICAgcTEyLCBxMTIsIHEwCisgICAgdmFkZC5zMTYgICAgICAgIHE4LCAgcTgsICBxMAorLmVuZGlmCisKKyAgICB2c2hybi5zMzIgICAgICAgZDIsICBxNSwgICMxNgorICAgIHZzaHJuLnMzMiAgICAgICBkMywgIHE2LCAgIzE2CisgICAgdmFkZC5zMTYgICAgICAgIHEyLCAgcTEyLCBxMTUgICAgICAgLy8gR2QgID0gRSArIEcKKyAgICB2YWRkLnMxNiAgICAgICAgcTksICBxMSwgIHE5ICAgICAgICAvLyAoQiAtIEQpICogQzQKKyAgICB2c3ViLnMxNiAgICAgICAgcTEyLCBxMTIsIHExNSAgICAgICAvLyBFZCAgPSBFIC0gRworICAgIHZzdWIuczE2ICAgICAgICBxMywgIHE4LCAgcTEwICAgICAgIC8vIEZkICA9IEYgLSBBZAorICAgIHZhZGQuczE2ICAgICAgICBxMTAsIHE4LCAgcTEwICAgICAgIC8vIEFkZCA9IEYgKyBBZAorICAgIHZhZGQuczE2ICAgICAgICBxNCwgIHE5LCAgcTE0ICAgICAgIC8vIEhkICA9IEJkICsgSAorICAgIHZzdWIuczE2ICAgICAgICBxMTQsIHE5LCAgcTE0ICAgICAgIC8vIEJkZCA9IEJkIC0gSAorICAgIHZhZGQuczE2ICAgICAgICBxOCwgIHEyLCAgcTExICAgICAgIC8vIFswXSA9IEdkICsgQ2QKKyAgICB2c3ViLnMxNiAgICAgICAgcTE1LCBxMiwgIHExMSAgICAgICAvLyBbN10gPSBHZCAtIENkCisgICAgdmFkZC5zMTYgICAgICAgIHE5LCAgcTEwLCBxNCAgICAgICAgLy8gWzFdID0gQWRkICsgSGQKKyAgICB2c3ViLnMxNiAgICAgICAgcTEwLCBxMTAsIHE0ICAgICAgICAvLyBbMl0gPSBBZGQgLSBIZAorICAgIHZhZGQuczE2ICAgICAgICBxMTEsIHExMiwgcTEzICAgICAgIC8vIFszXSA9IEVkICsgRGQKKyAgICB2c3ViLnMxNiAgICAgICAgcTEyLCBxMTIsIHExMyAgICAgICAvLyBbNF0gPSBFZCAtIERkCisuaWZjIFx0eXBlLCByb3cKKyAgICB2dHJuLjE2ICAgICAgICAgcTgsICBxOQorLmVuZGlmCisgICAgdmFkZC5zMTYgICAgICAgIHExMywgcTMsICBxMTQgICAgICAgLy8gWzVdID0gRmQgKyBCZGQKKyAgICB2c3ViLnMxNiAgICAgICAgcTE0LCBxMywgIHExNCAgICAgICAvLyBbNl0gPSBGZCAtIEJkZAorCisuaWZjIFx0eXBlLCByb3cKKyAgICAvLyA4eDggdHJhbnNwb3NlCisgICAgdnRybi4xNiAgICAgICAgIHExMCwgcTExCisgICAgdnRybi4xNiAgICAgICAgIHExMiwgcTEzCisgICAgdnRybi4xNiAgICAgICAgIHExNCwgcTE1CisgICAgdnRybi4zMiAgICAgICAgIHE4LCAgcTEwCisgICAgdnRybi4zMiAgICAgICAgIHE5LCAgcTExCisgICAgdnRybi4zMiAgICAgICAgIHExMiwgcTE0CisgICAgdnRybi4zMiAgICAgICAgIHExMywgcTE1CisgICAgdnN3cCAgICAgICAgICAgIGQxNywgZDI0CisgICAgdnN3cCAgICAgICAgICAgIGQxOSwgZDI2CisgICAgdmFkZC5zMTYgICAgICAgIHExLCAgcTgsICBxMTIKKyAgICB2c3dwICAgICAgICAgICAgZDIxLCBkMjgKKyAgICB2c3ViLnMxNiAgICAgICAgcTgsICBxOCwgIHExMgorICAgIHZzd3AgICAgICAgICAgICBkMjMsIGQzMAorLmVuZGlmCisgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisuZW5kbQorCitWUDNfSURDVF9FTkQgcm93CitWUDNfSURDVF9FTkQgY29sCisKK2Z1bmN0aW9uIGZmX3ZwM19pZGN0X3B1dF9uZW9uLCBleHBvcnQ9MQorICAgIG1vdiAgICAgICAgICAgICBpcCwgIGxyCisgICAgYmwgICAgICAgICAgICAgIHZwM19pZGN0X3N0YXJ0X25lb24KKyAgICBibCAgICAgICAgICAgICAgdnAzX2lkY3RfZW5kX3Jvd19uZW9uCisgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzgKKyAgICBhZGQgICAgICAgICAgICAgcjMsICByMywgICMyMDQ4ICAgICAgICAgLy8gY29udmVydCBzaWduZWQgcGl4ZWwgdG8gdW5zaWduZWQKKyAgICBibCAgICAgICAgICAgICAgdnAzX2lkY3RfY29yZV9uZW9uCisgICAgYmwgICAgICAgICAgICAgIHZwM19pZGN0X2VuZF9jb2xfbmVvbgorICAgIG1vdiAgICAgICAgICAgICBsciwgIGlwCisgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisKKyAgICB2cXNocnVuLnMxNiAgICAgZDAsICBxOCwgICM0CisgICAgdnFzaHJ1bi5zMTYgICAgIGQxLCAgcTksICAjNAorICAgIHZxc2hydW4uczE2ICAgICBkMiwgIHExMCwgIzQKKyAgICB2cXNocnVuLnMxNiAgICAgZDMsICBxMTEsICM0CisgICAgdnN0MS42NCAgICAgICAgIHtkMH0sIFtyMCw6NjRdLCByMQorICAgIHZxc2hydW4uczE2ICAgICBkNCwgIHExMiwgIzQKKyAgICB2c3QxLjY0ICAgICAgICAge2QxfSwgW3IwLDo2NF0sIHIxCisgICAgdnFzaHJ1bi5zMTYgICAgIGQ1LCAgcTEzLCAjNAorICAgIHZzdDEuNjQgICAgICAgICB7ZDJ9LCBbcjAsOjY0XSwgcjEKKyAgICB2cXNocnVuLnMxNiAgICAgZDYsICBxMTQsICM0CisgICAgdnN0MS42NCAgICAgICAgIHtkM30sIFtyMCw6NjRdLCByMQorICAgIHZxc2hydW4uczE2ICAgICBkNywgIHExNSwgIzQKKyAgICB2c3QxLjY0ICAgICAgICAge2Q0fSwgW3IwLDo2NF0sIHIxCisgICAgdnN0MS42NCAgICAgICAgIHtkNX0sIFtyMCw6NjRdLCByMQorICAgIHZzdDEuNjQgICAgICAgICB7ZDZ9LCBbcjAsOjY0XSwgcjEKKyAgICB2c3QxLjY0ICAgICAgICAge2Q3fSwgW3IwLDo2NF0sIHIxCisgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwM19pZGN0X2FkZF9uZW9uLCBleHBvcnQ9MQorICAgIG1vdiAgICAgICAgICAgICBpcCwgIGxyCisgICAgYmwgICAgICAgICAgICAgIHZwM19pZGN0X3N0YXJ0X25lb24KKyAgICBibCAgICAgICAgICAgICAgdnAzX2lkY3RfZW5kX3Jvd19uZW9uCisgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzgKKyAgICBibCAgICAgICAgICAgICAgdnAzX2lkY3RfY29yZV9uZW9uCisgICAgYmwgICAgICAgICAgICAgIHZwM19pZGN0X2VuZF9jb2xfbmVvbgorICAgIG1vdiAgICAgICAgICAgICBsciwgIGlwCisgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgbW92ICAgICAgICAgICAgIHIyLCAgcjAKKworICAgIHZsZDEuNjQgICAgICAgICB7ZDB9LCBbcjAsOjY0XSwgcjEKKyAgICB2c2hyLnMxNiAgICAgICAgcTgsICBxOCwgICM0CisgICAgdmxkMS42NCAgICAgICAgIHtkMX0sIFtyMCw6NjRdLCByMQorICAgIHZzaHIuczE2ICAgICAgICBxOSwgIHE5LCAgIzQKKyAgICB2bGQxLjY0ICAgICAgICAge2QyfSwgW3IwLDo2NF0sIHIxCisgICAgdmFkZHcudTggICAgICAgIHE4LCAgcTgsICBkMAorICAgIHZsZDEuNjQgICAgICAgICB7ZDN9LCBbcjAsOjY0XSwgcjEKKyAgICB2YWRkdy51OCAgICAgICAgcTksICBxOSwgIGQxCisgICAgdmxkMS42NCAgICAgICAgIHtkNH0sIFtyMCw6NjRdLCByMQorICAgIHZzaHIuczE2ICAgICAgICBxMTAsIHExMCwgIzQKKyAgICB2bGQxLjY0ICAgICAgICAge2Q1fSwgW3IwLDo2NF0sIHIxCisgICAgdnNoci5zMTYgICAgICAgIHExMSwgcTExLCAjNAorICAgIHZsZDEuNjQgICAgICAgICB7ZDZ9LCBbcjAsOjY0XSwgcjEKKyAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxOAorICAgIHZsZDEuNjQgICAgICAgICB7ZDd9LCBbcjAsOjY0XSwgcjEKKyAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxOQorICAgIHZhZGR3LnU4ICAgICAgICBxMTAsIHExMCwgZDIKKyAgICB2YWRkdy51OCAgICAgICAgcTExLCBxMTEsIGQzCisgICAgdnNoci5zMTYgICAgICAgIHExMiwgcTEyLCAjNAorICAgIHZzaHIuczE2ICAgICAgICBxMTMsIHExMywgIzQKKyAgICB2cW1vdnVuLnMxNiAgICAgZDIsICBxMTAKKyAgICB2cW1vdnVuLnMxNiAgICAgZDMsICBxMTEKKyAgICB2YWRkdy51OCAgICAgICAgcTEyLCBxMTIsIGQ0CisgICAgdmFkZHcudTggICAgICAgIHExMywgcTEzLCBkNQorICAgIHZzaHIuczE2ICAgICAgICBxMTQsIHExNCwgIzQKKyAgICB2c2hyLnMxNiAgICAgICAgcTE1LCBxMTUsICM0CisgICAgdnN0MS42NCAgICAgICAgIHtkMH0sIFtyMiw6NjRdLCByMQorICAgIHZxbW92dW4uczE2ICAgICBkNCwgIHExMgorICAgIHZzdDEuNjQgICAgICAgICB7ZDF9LCBbcjIsOjY0XSwgcjEKKyAgICB2cW1vdnVuLnMxNiAgICAgZDUsICBxMTMKKyAgICB2c3QxLjY0ICAgICAgICAge2QyfSwgW3IyLDo2NF0sIHIxCisgICAgdmFkZHcudTggICAgICAgIHExNCwgcTE0LCBkNgorICAgIHZzdDEuNjQgICAgICAgICB7ZDN9LCBbcjIsOjY0XSwgcjEKKyAgICB2YWRkdy51OCAgICAgICAgcTE1LCBxMTUsIGQ3CisgICAgdnN0MS42NCAgICAgICAgIHtkNH0sIFtyMiw6NjRdLCByMQorICAgIHZxbW92dW4uczE2ICAgICBkNiwgIHExNAorICAgIHZzdDEuNjQgICAgICAgICB7ZDV9LCBbcjIsOjY0XSwgcjEKKyAgICB2cW1vdnVuLnMxNiAgICAgZDcsICBxMTUKKyAgICB2c3QxLjY0ICAgICAgICAge2Q2fSwgW3IyLDo2NF0sIHIxCisgICAgdnN0MS42NCAgICAgICAgIHtkN30sIFtyMiw6NjRdLCByMQorICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDNfaWRjdF9kY19hZGRfbmVvbiwgZXhwb3J0PTEKKyAgICBsZHJzaCAgICAgICAgICAgcjEyLCBbcjJdCisgICAgbW92ICAgICAgICAgICAgIHIzLCAgcjAKKyAgICBhZGQgICAgICAgICAgICAgcjEyLCByMTIsICAjMTUKKyAgICB2ZHVwLjE2ICAgICAgICAgcTE1LCByMTIKKyAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMAorICAgIHN0cmggICAgICAgICAgICByMTIsIFtyMl0KKyAgICB2c2hyLnMxNiAgICAgICAgcTE1LCBxMTUsICM1CisKKyAgICB2bGQxLjggICAgICAgICAge2QwfSwgW3IwLDo2NF0sIHIxCisgICAgdmxkMS44ICAgICAgICAgIHtkMX0sIFtyMCw6NjRdLCByMQorICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCBbcjAsOjY0XSwgcjEKKyAgICB2YWRkdy51OCAgICAgICAgcTgsICBxMTUsIGQwCisgICAgdmxkMS44ICAgICAgICAgIHtkM30sIFtyMCw6NjRdLCByMQorICAgIHZhZGR3LnU4ICAgICAgICBxOSwgIHExNSwgZDEKKyAgICB2bGQxLjggICAgICAgICAge2Q0fSwgW3IwLDo2NF0sIHIxCisgICAgdmFkZHcudTggICAgICAgIHExMCwgcTE1LCBkMgorICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCBbcjAsOjY0XSwgcjEKKyAgICB2YWRkdy51OCAgICAgICAgcTExLCBxMTUsIGQzCisgICAgdmxkMS44ICAgICAgICAgIHtkNn0sIFtyMCw6NjRdLCByMQorICAgIHZhZGR3LnU4ICAgICAgICBxMTIsIHExNSwgZDQKKyAgICB2bGQxLjggICAgICAgICAge2Q3fSwgW3IwLDo2NF0sIHIxCisgICAgdmFkZHcudTggICAgICAgIHExMywgcTE1LCBkNQorICAgIHZxbW92dW4uczE2ICAgICBkMCwgIHE4CisgICAgdmFkZHcudTggICAgICAgIHExNCwgcTE1LCBkNgorICAgIHZxbW92dW4uczE2ICAgICBkMSwgIHE5CisgICAgdmFkZHcudTggICAgICAgIHExNSwgcTE1LCBkNworICAgIHZxbW92dW4uczE2ICAgICBkMiwgIHExMAorICAgIHZzdDEuOCAgICAgICAgICB7ZDB9LCBbcjMsOjY0XSwgcjEKKyAgICB2cW1vdnVuLnMxNiAgICAgZDMsICBxMTEKKyAgICB2c3QxLjggICAgICAgICAge2QxfSwgW3IzLDo2NF0sIHIxCisgICAgdnFtb3Z1bi5zMTYgICAgIGQ0LCAgcTEyCisgICAgdnN0MS44ICAgICAgICAgIHtkMn0sIFtyMyw6NjRdLCByMQorICAgIHZxbW92dW4uczE2ICAgICBkNSwgIHExMworICAgIHZzdDEuOCAgICAgICAgICB7ZDN9LCBbcjMsOjY0XSwgcjEKKyAgICB2cW1vdnVuLnMxNiAgICAgZDYsICBxMTQKKyAgICB2c3QxLjggICAgICAgICAge2Q0fSwgW3IzLDo2NF0sIHIxCisgICAgdnFtb3Z1bi5zMTYgICAgIGQ3LCAgcTE1CisgICAgdnN0MS44ICAgICAgICAgIHtkNX0sIFtyMyw6NjRdLCByMQorICAgIHZzdDEuOCAgICAgICAgICB7ZDZ9LCBbcjMsOjY0XSwgcjEKKyAgICB2c3QxLjggICAgICAgICAge2Q3fSwgW3IzLDo2NF0sIHIxCisgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA1Nl9hcml0aC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwNTZfYXJpdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWIxMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwNTZfYXJpdGguaApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FSTV9WUDU2X0FSSVRIX0gKKyNkZWZpbmUgQVZDT0RFQ19BUk1fVlA1Nl9BUklUSF9ICisKKyNpZiBDT05GSUdfVEhVTUIKKyMgICBkZWZpbmUgQSh4KQorIyAgIGRlZmluZSBUKHgpIHgKKyNlbHNlCisjICAgZGVmaW5lIEEoeCkgeAorIyAgIGRlZmluZSBUKHgpCisjZW5kaWYKKworI2lmIENPTkZJR19USFVNQiB8fCBkZWZpbmVkIF9fY2xhbmdfXworIyAgIGRlZmluZSBMKHgpCisjICAgZGVmaW5lIFUoeCkgeAorI2Vsc2UKKyMgICBkZWZpbmUgTCh4KSB4CisjICAgZGVmaW5lIFUoeCkKKyNlbmRpZgorCisjaWYgSEFWRV9BUk1WNl9JTkxJTkUKKworI2RlZmluZSB2cDU2X3JhY19nZXRfcHJvYiB2cDU2X3JhY19nZXRfcHJvYl9hcm12Ngorc3RhdGljIGlubGluZSBpbnQgdnA1Nl9yYWNfZ2V0X3Byb2JfYXJtdjYoVlA1NlJhbmdlQ29kZXIgKmMsIGludCBwcikKK3sKKyAgICB1bnNpZ25lZCBzaGlmdCAgICAgPSBmZl92cDU2X25vcm1fc2hpZnRbYy0+aGlnaF07CisgICAgdW5zaWduZWQgY29kZV93b3JkID0gYy0+Y29kZV93b3JkIDw8IHNoaWZ0OworICAgIHVuc2lnbmVkIGhpZ2ggICAgICA9IGMtPmhpZ2ggPDwgc2hpZnQ7CisgICAgdW5zaWduZWQgYml0OworCisgICAgX19hc21fXyAoImFkZHMgICAgJTMsICAlMywgICUwICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICAiaXR0ICAgICBjcyAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgICJjbXBjcyAgICU3LCAgJTQgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgIEwoImxkcmNzaCAgJTIsICBbJTRdLCAjMiAgICAgICAgICBcbiIpCisgICAgICAgICAgIFUoImxkcmhjcyAgJTIsICBbJTRdLCAjMiAgICAgICAgICBcbiIpCisgICAgICAgICAgICAgInJzYiAgICAgJTAsICAlNiwgICMyNTYgICAgICAgICBcbiIKKyAgICAgICAgICAgICAic21sYWJiICAlMCwgICU1LCAgJTYsICAlMCAgICAgIFxuIgorICAgICAgICAgICBUKCJpdHR0dCAgIGNzICAgICAgICAgICAgICAgICAgICAgXG4iKQorICAgICAgICAgICAgICJyZXYxNmNzICUyLCAgJTIgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgIFQoImxzbGNzICAgJTIsICAlMiwgICUzICAgICAgICAgICBcbiIpCisgICAgICAgICAgIFQoIm9ycmNzICAgJTEsICAlMSwgICUyICAgICAgICAgICBcbiIpCisgICAgICAgICAgIEEoIm9ycmNzICAgJTEsICAlMSwgICUyLCAgbHNsICUzICBcbiIpCisgICAgICAgICAgICAgInN1YmNzICAgJTMsICAlMywgICMxNiAgICAgICAgICBcbiIKKyAgICAgICAgICAgICAibHNyICAgICAlMCwgICUwLCAgIzggICAgICAgICAgIFxuIgorICAgICAgICAgICAgICJjbXAgICAgICUxLCAgJTAsICBsc2wgIzE2ICAgICAgXG4iCisgICAgICAgICAgICAgIml0dHRlICAgZ2UgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICAic3ViZ2UgICAlMSwgICUxLCAgJTAsICBsc2wgIzE2IFxuIgorICAgICAgICAgICAgICJzdWJnZSAgICUwLCAgJTUsICAlMCAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgIm1vdmdlICAgJTIsICAjMSAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICAibW92bHQgICAlMiwgICMwICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIDogIj0mciIoYy0+aGlnaCksICI9JnIiKGMtPmNvZGVfd29yZCksICI9JnIiKGJpdCksCisgICAgICAgICAgICAgICAiKyZyIihjLT5iaXRzKSwgIismciIoYy0+YnVmZmVyKQorICAgICAgICAgICAgIDogInIiKGhpZ2gpLCAiciIocHIpLCAiciIoYy0+ZW5kIC0gMSksCisgICAgICAgICAgICAgICAiMCIoc2hpZnQpLCAiMSIoY29kZV93b3JkKQorICAgICAgICAgICAgIDogImNjIik7CisKKyAgICByZXR1cm4gYml0OworfQorCisjZGVmaW5lIHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkgdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeV9hcm12Ngorc3RhdGljIGlubGluZSBpbnQgdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeV9hcm12NihWUDU2UmFuZ2VDb2RlciAqYywgaW50IHByKQoreworICAgIHVuc2lnbmVkIHNoaWZ0ICAgICA9IGZmX3ZwNTZfbm9ybV9zaGlmdFtjLT5oaWdoXTsKKyAgICB1bnNpZ25lZCBjb2RlX3dvcmQgPSBjLT5jb2RlX3dvcmQgPDwgc2hpZnQ7CisgICAgdW5zaWduZWQgaGlnaCAgICAgID0gYy0+aGlnaCA8PCBzaGlmdDsKKyAgICB1bnNpZ25lZCBsb3c7CisgICAgdW5zaWduZWQgdG1wOworCisgICAgX19hc21fXyAoImFkZHMgICAgJTMsICAlMywgICUwICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICAiaXR0ICAgICBjcyAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgICJjbXBjcyAgICU3LCAgJTQgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgIEwoImxkcmNzaCAgJTIsICBbJTRdLCAjMiAgICAgICAgICBcbiIpCisgICAgICAgICAgIFUoImxkcmhjcyAgJTIsICBbJTRdLCAjMiAgICAgICAgICBcbiIpCisgICAgICAgICAgICAgInJzYiAgICAgJTAsICAlNiwgICMyNTYgICAgICAgICBcbiIKKyAgICAgICAgICAgICAic21sYWJiICAlMCwgICU1LCAgJTYsICAlMCAgICAgIFxuIgorICAgICAgICAgICBUKCJpdHR0dCAgIGNzICAgICAgICAgICAgICAgICAgICAgXG4iKQorICAgICAgICAgICAgICJyZXYxNmNzICUyLCAgJTIgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgIFQoImxzbGNzICAgJTIsICAlMiwgICUzICAgICAgICAgICBcbiIpCisgICAgICAgICAgIFQoIm9ycmNzICAgJTEsICAlMSwgICUyICAgICAgICAgICBcbiIpCisgICAgICAgICAgIEEoIm9ycmNzICAgJTEsICAlMSwgICUyLCAgbHNsICUzICBcbiIpCisgICAgICAgICAgICAgInN1YmNzICAgJTMsICAlMywgICMxNiAgICAgICAgICBcbiIKKyAgICAgICAgICAgICAibHNyICAgICAlMCwgICUwLCAgIzggICAgICAgICAgIFxuIgorICAgICAgICAgICAgICJsc2wgICAgICUyLCAgJTAsICAjMTYgICAgICAgICAgXG4iCisgICAgICAgICAgICAgOiAiPSZyIihsb3cpLCAiKyZyIihjb2RlX3dvcmQpLCAiPSZyIih0bXApLAorICAgICAgICAgICAgICAgIismciIoYy0+Yml0cyksICIrJnIiKGMtPmJ1ZmZlcikKKyAgICAgICAgICAgICA6ICJyIihoaWdoKSwgInIiKHByKSwgInIiKGMtPmVuZCAtIDEpLCAiMCIoc2hpZnQpCisgICAgICAgICAgICAgOiAiY2MiKTsKKworICAgIGlmIChjb2RlX3dvcmQgPj0gdG1wKSB7CisgICAgICAgIGMtPmhpZ2ggICAgICA9IGhpZ2ggLSBsb3c7CisgICAgICAgIGMtPmNvZGVfd29yZCA9IGNvZGVfd29yZCAtIHRtcDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgYy0+aGlnaCAgICAgID0gbG93OworICAgIGMtPmNvZGVfd29yZCA9IGNvZGVfd29yZDsKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKKyNlbmRpZiAvKiBBVkNPREVDX0FSTV9WUDU2X0FSSVRIX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92cDZkc3BfaW5pdF9hcm0uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92cDZkc3BfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDY4MzIxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwNmRzcF9pbml0X2FybS5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZwNTZkc3AuaCIKKwordm9pZCBmZl92cDZfZWRnZV9maWx0ZXJfaG9yX25lb24odWludDhfdCAqeXV2LCBpbnQgc3RyaWRlLCBpbnQgdCk7Cit2b2lkIGZmX3ZwNl9lZGdlX2ZpbHRlcl92ZXJfbmVvbih1aW50OF90ICp5dXYsIGludCBzdHJpZGUsIGludCB0KTsKKworYXZfY29sZCB2b2lkIGZmX3ZwNmRzcF9pbml0X2FybShWUDU2RFNQQ29udGV4dCAqcywgZW51bSBBVkNvZGVjSUQgY29kZWMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5lZGdlX2ZpbHRlcl9ob3IgPSBmZl92cDZfZWRnZV9maWx0ZXJfaG9yX25lb247CisgICAgICAgIHMtPmVkZ2VfZmlsdGVyX3ZlciA9IGZmX3ZwNl9lZGdlX2ZpbHRlcl92ZXJfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA2ZHNwX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92cDZkc3BfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZGQyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA2ZHNwX25lb24uUwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKKy5tYWNybyAgdnA2X2VkZ2VfZmlsdGVyCisgICAgICAgIHZkdXAuMTYgICAgICAgICBxMywgIHIyICAgICAgICAgICAgICAgICBAIHQKKyAgICAgICAgdm1vdi5pMTYgICAgICAgIHExMywgIzEKKyAgICAgICAgdnN1YmwudTggICAgICAgIHEwLCAgZDIwLCBkMTggICAgICAgICAgIEAgcFsgICAwXSAtIHBbLXNdCisgICAgICAgIHZzdWJsLnU4ICAgICAgICBxMSwgIGQxNiwgZDIyICAgICAgICAgICBAIHBbLTIqc10gLSBwWyBzXQorICAgICAgICB2c3VibC51OCAgICAgICAgcTE0LCBkMjEsIGQxOQorICAgICAgICB2c3VibC51OCAgICAgICAgcTE1LCBkMTcsIGQyMworICAgICAgICB2YWRkLmkxNiAgICAgICAgcTIsICBxMCwgIHEwICAgICAgICAgICAgQCAyKihwWzBdLXBbLXNdKQorICAgICAgICB2YWRkLmkxNiAgICAgICAgZDI5LCBkMjgsIGQyOAorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTAsICBxMCwgIHExICAgICAgICAgICAgQCAgICBwWzBdLXBbLXNdICArIHBbLTIqc10tcFtzXQorICAgICAgICB2YWRkLmkxNiAgICAgICAgZDI4LCBkMjgsIGQzMAorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTAsICBxMCwgIHEyICAgICAgICAgICAgQCAzKihwWzBdLXBbLXNdKSArIHBbLTIqc10tcFtzXQorICAgICAgICB2YWRkLmkxNiAgICAgICAgZDI4LCBkMjgsIGQyOQorICAgICAgICB2cnNoci5zMTYgICAgICAgcTAsICBxMCwgICMzICAgICAgICAgICAgQCB2CisgICAgICAgIHZyc2hyLnMxNiAgICAgICBkMjgsIGQyOCwgIzMKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHE4LCAgcTMsICBxMTMgICAgICAgICAgIEAgdC0xCisgICAgICAgIHZhYnMuczE2ICAgICAgICBxMSwgIHEwICAgICAgICAgICAgICAgICBAIFYKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHEyLCAgcTAsICAjMTUgICAgICAgICAgIEAgcworICAgICAgICB2YWJzLnMxNiAgICAgICAgZDMwLCBkMjgKKyAgICAgICAgdnNoci5zMTYgICAgICAgIGQyOSwgZDI4LCAjMTUKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExMiwgcTEsICBxMyAgICAgICAgICAgIEAgVi10CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBkMzEsIGQzMCwgZDYKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExMiwgcTEyLCBxMTMgICAgICAgICAgIEAgVi10LTEKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIGQzMSwgZDMxLCBkMjYKKyAgICAgICAgdmNnZS51MTYgICAgICAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgIEAgVi10LTEgPj0gdC0xCisgICAgICAgIHZjZ2UudTE2ICAgICAgICBkMzEsIGQzMSwgZDE2CisgICAgICAgIHZhZGQuaTE2ICAgICAgICBxMTMsIHEzLCAgcTMgICAgICAgICAgICBAIDIqdAorICAgICAgICB2YWRkLmkxNiAgICAgICAgZDE2LCBkNiwgIGQ2CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMTMsIHExMywgcTEgICAgICAgICAgICBAIDIqdCAtIFYKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIGQxNiwgZDE2LCBkMzAKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHExMywgcTEzLCBxMiAgICAgICAgICAgIEAgKz0gcworICAgICAgICB2YWRkLmkxNiAgICAgICAgZDE2LCBkMTYsIGQyOQorICAgICAgICB2ZW9yICAgICAgICAgICAgcTEzLCBxMTMsIHEyICAgICAgICAgICAgQCBePSBzCisgICAgICAgIHZlb3IgICAgICAgICAgICBkMTYsIGQxNiwgZDI5CisgICAgICAgIHZiaWYgICAgICAgICAgICBxMCwgIHExMywgcTEyCisgICAgICAgIHZiaWYgICAgICAgICAgICBkMjgsIGQxNiwgZDMxCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMSwgIGQyMAorICAgICAgICB2bW92bC51OCAgICAgICAgcTE1LCBkMjEKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEyLCAgcTAsICBkMTgKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEzLCAgcTE0LCBkMTkKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIHExLCAgcTEsICBxMAorICAgICAgICB2c3ViLmkxNiAgICAgICAgZDMwLCBkMzAsIGQyOAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDE4LCBxMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDE5LCBxMworICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIwLCBxMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIxLCBxMTUKKy5lbmRtCisKK2Z1bmN0aW9uIGZmX3ZwNl9lZGdlX2ZpbHRlcl92ZXJfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgIGxzbCAjMQorICAgICAgICB2bGQxLjggICAgICAgICAge3E4fSwgICAgIFtyMF0sIHIxICAgICAgQCBwWy0yKnNdCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTl9LCAgICAgW3IwXSwgcjEgICAgICBAIHBbLXNdCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTEwfSwgICAgW3IwXSwgcjEgICAgICBAIHBbMF0KKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMTF9LCAgICBbcjBdICAgICAgICAgIEAgcFtzXQorICAgICAgICB2cDZfZWRnZV9maWx0ZXIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICM4CisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDE4fSwgICAgW3IwXSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTlbMF19LCBbcjBdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QyMH0sICAgIFtyMF0hCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIxWzBdfSwgW3IwXQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA2X2VkZ2VfZmlsdGVyX2hvcl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMCwgICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgIzIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTZbMF19LCBbcjBdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxOFswXX0sIFtyMF0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDIwWzBdfSwgW3IwXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjJbMF19LCBbcjBdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxNlsxXX0sIFtyMF0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE4WzFdfSwgW3IwXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjBbMV19LCBbcjBdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyMlsxXX0sIFtyMF0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE3WzBdfSwgW3IwXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTlbMF19LCBbcjBdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyMVswXX0sIFtyMF0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDIzWzBdfSwgW3IwXSwgcjEKKyAgICAgICAgdnRybi44ICAgICAgICAgIHE4LCAgcTkKKyAgICAgICAgdnRybi44ICAgICAgICAgIHExMCwgcTExCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBxOCwgIHExMAorICAgICAgICB2dHJuLjE2ICAgICAgICAgcTksICBxMTEKKyAgICAgICAgdnA2X2VkZ2VfZmlsdGVyCisgICAgICAgIHZ0cm4uOCAgICAgICAgICBxOSwgIHExMAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxOFswXX0sIFtyM10sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIwWzBdfSwgW3IzXSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMThbMV19LCBbcjNdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyMFsxXX0sIFtyM10sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE4WzJdfSwgW3IzXSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjBbMl19LCBbcjNdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxOFszXX0sIFtyM10sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIwWzNdfSwgW3IzXSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTlbMF19LCBbcjNdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyMVswXX0sIFtyM10sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE5WzFdfSwgW3IzXSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjFbMV19LCBbcjNdLCByMQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92cDguaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92cDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjUzNDJkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwOC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FSTV9WUDhfSAorI2RlZmluZSBBVkNPREVDX0FSTV9WUDhfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZwNTYuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZwOC5oIgorCisjaWYgSEFWRV9BUk1WNl9FWFRFUk5BTAorI2RlZmluZSB2cDhfZGVjb2RlX2Jsb2NrX2NvZWZmc19pbnRlcm5hbCBmZl9kZWNvZGVfYmxvY2tfY29lZmZzX2FybXY2CitpbnQgZmZfZGVjb2RlX2Jsb2NrX2NvZWZmc19hcm12NihWUDU2UmFuZ2VDb2RlciAqcmMsIGludDE2X3QgYmxvY2tbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwcm9ic1s4XVszXVtOVU1fRENUX1RPS0VOUy0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCB1aW50OF90ICp0b2tlbl9wcm9iLCBpbnQxNl90IHFtdWxbMl0pOworI2VuZGlmCisKKyNlbmRpZiAvKiBBVkNPREVDX0FSTV9WUDhfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwOF9hcm12Ni5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwOF9hcm12Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDI1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4X2FybXY2LlMKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTWFucyBSdWxsZ2FyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworLm1hY3JvIHJhY19nZXRfcHJvYiAgICAgaCwgYnMsIGJ1ZiwgY3csIHByLCB0MCwgdDEKKyAgICAgICAgYWRkcyAgICAgICAgICAgIFxicywgXGJzLCBcdDAKKyAgICAgICAgbHNsICAgICAgICAgICAgIFxjdywgXGN3LCBcdDAKKyAgICAgICAgbHNsICAgICAgICAgICAgIFx0MCwgXGgsICBcdDAKKyAgICAgICAgcnNiICAgICAgICAgICAgIFxoLCAgXHByLCAjMjU2CisgICAgICAgIGl0ICAgICAgICAgICAgICBjcworICAgICAgICBsZHJoY3MgICAgICAgICAgXHQxLCBbXGJ1Zl0sICMyCisgICAgICAgIHNtbGFiYiAgICAgICAgICBcaCwgIFx0MCwgXHByLCBcaAorVCAgICAgICBpdHR0dCAgICAgICAgICAgY3MKKyAgICAgICAgcmV2MTZjcyAgICAgICAgIFx0MSwgXHQxCitBICAgICAgIG9ycmNzICAgICAgICAgICBcY3csIFxjdywgXHQxLCBsc2wgXGJzCitUICAgICAgIGxzbGNzICAgICAgICAgICBcdDEsIFx0MSwgXGJzCitUICAgICAgIG9ycmNzICAgICAgICAgICBcY3csIFxjdywgXHQxCisgICAgICAgIHN1YmNzICAgICAgICAgICBcYnMsIFxicywgIzE2CisgICAgICAgIGxzciAgICAgICAgICAgICBcaCwgIFxoLCAgIzgKKyAgICAgICAgY21wICAgICAgICAgICAgIFxjdywgXGgsICBsc2wgIzE2CisgICAgICAgIGl0dCAgICAgICAgICAgICBnZQorICAgICAgICBzdWJnZSAgICAgICAgICAgXGN3LCBcY3csIFxoLCAgbHNsICMxNgorICAgICAgICBzdWJnZSAgICAgICAgICAgXGgsICBcdDAsIFxoCisuZW5kbQorCisubWFjcm8gcmFjX2dldF8xMjggICAgICBoLCBicywgYnVmLCBjdywgdDAsIHQxCisgICAgICAgIGFkZHMgICAgICAgICAgICBcYnMsIFxicywgXHQwCisgICAgICAgIGxzbCAgICAgICAgICAgICBcY3csIFxjdywgXHQwCisgICAgICAgIGxzbCAgICAgICAgICAgICBcdDAsIFxoLCAgXHQwCisgICAgICAgIGl0ICAgICAgICAgICAgICBjcworICAgICAgICBsZHJoY3MgICAgICAgICAgXHQxLCBbXGJ1Zl0sICMyCisgICAgICAgIG1vdiAgICAgICAgICAgICBcaCwgICMxMjgKKyAgICAgICAgaXQgICAgICAgICAgICAgIGNzCisgICAgICAgIHJldjE2Y3MgICAgICAgICBcdDEsIFx0MQorICAgICAgICBhZGQgICAgICAgICAgICAgXGgsICBcaCwgIFx0MCwgbHNsICM3CitBICAgICAgIG9ycmNzICAgICAgICAgICBcY3csIFxjdywgXHQxLCBsc2wgXGJzCitUICAgICAgIGl0dHQgICAgICAgICAgICBjcworVCAgICAgICBsc2xjcyAgICAgICAgICAgXHQxLCBcdDEsIFxicworVCAgICAgICBvcnJjcyAgICAgICAgICAgXGN3LCBcY3csIFx0MQorICAgICAgICBzdWJjcyAgICAgICAgICAgXGJzLCBcYnMsICMxNgorICAgICAgICBsc3IgICAgICAgICAgICAgXGgsICBcaCwgICM4CisgICAgICAgIGNtcCAgICAgICAgICAgICBcY3csIFxoLCAgbHNsICMxNgorICAgICAgICBpdHQgICAgICAgICAgICAgZ2UKKyAgICAgICAgc3ViZ2UgICAgICAgICAgIFxjdywgXGN3LCBcaCwgIGxzbCAjMTYKKyAgICAgICAgc3ViZ2UgICAgICAgICAgIFxoLCAgXHQwLCBcaAorLmVuZG0KKworZnVuY3Rpb24gZmZfZGVjb2RlX2Jsb2NrX2NvZWZmc19hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMCxyMSxyNC1yMTEsbHJ9CisgICAgICAgIG1vdnJlbHggICAgICAgICBsciwgIFgoZmZfdnA1Nl9ub3JtX3NoaWZ0KQorICAgICAgICBsZHJkICAgICAgICAgICAgcjQsICByNSwgIFtzcCwgIzQ0XSAgICAgICAgICAgICBAIHRva2VuX3Byb2IsIHFtdWwKKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzAKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMSwgW3I1XQorICAgICAgICBsZG0gICAgICAgICAgICAgcjAsICB7cjUtcjd9ICAgICAgICAgICAgICAgICAgICBAIGhpZ2gsIGJpdHMsIGJ1ZgorICAgICAgICBpdCAgICAgICAgICAgICAgbmUKKyAgICAgICAgcGtodGJuZSAgICAgICAgIHIxMSwgcjExLCByMTEsIGFzciAjMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI4LCAgW3IwLCAjMTZdICAgICAgICAgICAgICAgICAgQCBjb2RlX3dvcmQKKzA6CisgICAgICAgIGxkcmIgICAgICAgICAgICByOSwgIFtsciwgcjVdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHIwLCAgW3I0LCAjMV0KKyAgICAgICAgcmFjX2dldF9wcm9iICAgIHI1LCAgcjYsICByNywgIHI4LCAgcjAsICByOSwgIHIxMAorICAgICAgICBibHQgICAgICAgICAgICAgMmYKKworICAgICAgICBsZHJiICAgICAgICAgICAgcjksICBbbHIsIHI1XQorICAgICAgICBsZHJiICAgICAgICAgICAgcjAsICBbcjQsICMyXQorICAgICAgICByYWNfZ2V0X3Byb2IgICAgcjUsICByNiwgIHI3LCAgcjgsICByMCwgIHI5LCAgcjEwCisgICAgICAgIGxkcmIgICAgICAgICAgICByOSwgIFtsciwgcjVdCisgICAgICAgIGJnZSAgICAgICAgICAgICAzZgorCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIHIzLCAgcjMsICBsc2wgIzUKKyAgICAgICAgc3h0aCAgICAgICAgICAgIHIxMiwgcjExCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIHI0LCAgcjIKKyAgICAgICAgYWRkcyAgICAgICAgICAgIHI2LCAgcjYsICByOQorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICByNCwgICMxMQorICAgICAgICBsc2wgICAgICAgICAgICAgcjgsICByOCwgIHI5CisgICAgICAgIGl0ICAgICAgICAgICAgICBjcworICAgICAgICBsZHJoY3MgICAgICAgICAgcjEwLCBbcjddLCAjMgorICAgICAgICBsc2wgICAgICAgICAgICAgcjksICByNSwgIHI5CisgICAgICAgIG1vdiAgICAgICAgICAgICByNSwgICMxMjgKKyAgICAgICAgaXQgICAgICAgICAgICAgIGNzCisgICAgICAgIHJldjE2Y3MgICAgICAgICByMTAsIHIxMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjUsICByNSwgIHI5LCAgbHNsICM3CitUICAgICAgIGl0dHQgICAgICAgICAgICBjcworVCAgICAgICBsc2xjcyAgICAgICAgICAgcjEwLCByMTAsIHI2CitUICAgICAgIG9ycmNzICAgICAgICAgICByOCwgIHI4LCAgcjEwCitBICAgICAgIG9ycmNzICAgICAgICAgICByOCwgIHI4LCAgcjEwLCBsc2wgcjYKKyAgICAgICAgc3ViY3MgICAgICAgICAgIHI2LCAgcjYsICAjMTYKKyAgICAgICAgbHNyICAgICAgICAgICAgIHI1LCAgcjUsICAjOAorICAgICAgICBjbXAgICAgICAgICAgICAgcjgsICByNSwgIGxzbCAjMTYKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxMCwgemlnemFnX3NjYW4tMQorICAgICAgICBpdHQgICAgICAgICAgICAgZ2UKKyAgICAgICAgc3ViZ2UgICAgICAgICAgIHI4LCAgcjgsICByNSwgIGxzbCAjMTYKKyAgICAgICAgc3ViZ2UgICAgICAgICAgIHI1LCAgcjksICByNQorICAgICAgICBsZHJiICAgICAgICAgICAgcjEwLCBbcjEwLCByM10KKyAgICAgICAgaXQgICAgICAgICAgICAgIGdlCisgICAgICAgIHJzYmdlICAgICAgICAgICByMTIsIHIxMiwgIzAKKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzE2CisgICAgICAgIHN0cmggICAgICAgICAgICByMTIsIFtyMSwgcjEwXQorICAgICAgICBiZ2UgICAgICAgICAgICAgNmYKKzU6CisgICAgICAgIGxkcmIgICAgICAgICAgICByOSwgIFtsciwgcjVdCisgICAgICAgIGxkcmIgICAgICAgICAgICByMCwgIFtyNF0KKyAgICAgICAgcmFjX2dldF9wcm9iICAgIHI1LCAgcjYsICByNywgIHI4LCAgcjAsICByOSwgIHIxMAorICAgICAgICBwa2h0YiAgICAgICAgICAgcjExLCByMTEsIHIxMSwgYXNyICMxNgorICAgICAgICBiZ2UgICAgICAgICAgICAgMGIKKworNjoKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIwLCAgW3NwXQorICAgICAgICBsZHIgICAgICAgICAgICAgcjksICBbcjAsICMxMl0KKyAgICAgICAgY21wICAgICAgICAgICAgIHI3LCAgcjkKKyAgICAgICAgaXQgICAgICAgICAgICAgIGhpCisgICAgICAgIG1vdmhpICAgICAgICAgICByNywgIHI5CisgICAgICAgIHN0bSAgICAgICAgICAgICByMCwgIHtyNS1yN30gICAgICAgICAgICAgICAgICAgIEAgaGlnaCwgYml0cywgYnVmCisgICAgICAgIHN0ciAgICAgICAgICAgICByOCwgIFtyMCwgIzE2XSAgICAgICAgICAgICAgICAgIEAgY29kZV93b3JkCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgcjAsICByMworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXIxMSxwY30KKzI6CisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIHIzLCAgcjMsICBsc2wgIzUKKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzE2CisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIHI0LCAgcjIKKyAgICAgICAgcGtodGIgICAgICAgICAgIHIxMSwgcjExLCByMTEsIGFzciAjMTYKKyAgICAgICAgYm5lICAgICAgICAgICAgIDBiCisgICAgICAgIGIgICAgICAgICAgICAgICA2YgorMzoKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHIwLCAgW3I0LCAjM10KKyAgICAgICAgcmFjX2dldF9wcm9iICAgIHI1LCAgcjYsICByNywgIHI4LCAgcjAsICByOSwgIHIxMAorICAgICAgICBsZHJiICAgICAgICAgICAgcjksICBbbHIsIHI1XQorICAgICAgICBiZ2UgICAgICAgICAgICAgMWYKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMgorICAgICAgICBsZHJiICAgICAgICAgICAgcjAsICBbcjQsICM0XQorICAgICAgICByYWNfZ2V0X3Byb2IgICAgcjUsICByNiwgIHI3LCAgcjgsICByMCwgIHI5LCAgcjEwCisgICAgICAgIGl0ICAgICAgICAgICAgICBnZQorICAgICAgICBhZGRnZSAgICAgICAgICAgcjEyLCAjMQorICAgICAgICBsZHJiICAgICAgICAgICAgcjksICBbbHIsIHI1XQorICAgICAgICBibHQgICAgICAgICAgICAgNGYKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHIwLCAgW3I0LCAjNV0KKyAgICAgICAgcmFjX2dldF9wcm9iICAgIHI1LCAgcjYsICByNywgIHI4LCAgcjAsICByOSwgIHIxMAorICAgICAgICBpdCAgICAgICAgICAgICAgZ2UKKyAgICAgICAgYWRkZ2UgICAgICAgICAgIHIxMiwgIzEKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI5LCAgW2xyLCByNV0KKyAgICAgICAgYiAgICAgICAgICAgICAgIDRmCisxOgorICAgICAgICBsZHJiICAgICAgICAgICAgcjAsICBbcjQsICM2XQorICAgICAgICByYWNfZ2V0X3Byb2IgICAgcjUsICByNiwgIHI3LCAgcjgsICByMCwgIHI5LCAgcjEwCisgICAgICAgIGxkcmIgICAgICAgICAgICByOSwgIFtsciwgcjVdCisgICAgICAgIGJnZSAgICAgICAgICAgICAzZgorCisgICAgICAgIGxkcmIgICAgICAgICAgICByMCwgIFtyNCwgIzddCisgICAgICAgIHJhY19nZXRfcHJvYiAgICByNSwgIHI2LCAgcjcsICByOCwgIHIwLCAgcjksICByMTAKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI5LCAgW2xyLCByNV0KKyAgICAgICAgYmdlICAgICAgICAgICAgIDJmCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzUKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgIzE1OQorICAgICAgICByYWNfZ2V0X3Byb2IgICAgcjUsICByNiwgIHI3LCAgcjgsICByMCwgIHI5LCAgcjEwCisgICAgICAgIGl0ICAgICAgICAgICAgICBnZQorICAgICAgICBhZGRnZSAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgICAgIGxkcmIgICAgICAgICAgICByOSwgIFtsciwgcjVdCisgICAgICAgIGIgICAgICAgICAgICAgICA0ZgorMjoKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzcKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgIzE2NQorICAgICAgICByYWNfZ2V0X3Byb2IgICAgcjUsICByNiwgIHI3LCAgcjgsICByMCwgIHI5LCAgcjEwCisgICAgICAgIGl0ICAgICAgICAgICAgICBnZQorICAgICAgICBhZGRnZSAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGxkcmIgICAgICAgICAgICByOSwgIFtsciwgcjVdCisgICAgICAgIG1vdiAgICAgICAgICAgICByMCwgICMxNDUKKyAgICAgICAgcmFjX2dldF9wcm9iICAgIHI1LCAgcjYsICByNywgIHI4LCAgcjAsICByOSwgIHIxMAorICAgICAgICBpdCAgICAgICAgICAgICAgZ2UKKyAgICAgICAgYWRkZ2UgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICBsZHJiICAgICAgICAgICAgcjksICBbbHIsIHI1XQorICAgICAgICBiICAgICAgICAgICAgICAgNGYKKzM6CisgICAgICAgIGxkcmIgICAgICAgICAgICByMCwgIFtyNCwgIzhdCisgICAgICAgIHJhY19nZXRfcHJvYiAgICByNSwgIHI2LCAgcjcsICByOCwgIHIwLCAgcjksICByMTAKKyAgICAgICAgaXQgICAgICAgICAgICAgIGdlCisgICAgICAgIGFkZGdlICAgICAgICAgICByNCwgIHI0LCAgIzEKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI5LCAgW2xyLCByNV0KKyAgICAgICAgaXRlICAgICAgICAgICAgIGdlCisgICAgICAgIG1vdmdlICAgICAgICAgICByMTIsICMyCisgICAgICAgIG1vdmx0ICAgICAgICAgICByMTIsICMwCisgICAgICAgIGxkcmIgICAgICAgICAgICByMCwgIFtyNCwgIzldCisgICAgICAgIHJhY19nZXRfcHJvYiAgICByNSwgIHI2LCAgcjcsICByOCwgIHIwLCAgcjksICByMTAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI5LCAgIzgKKyAgICAgICAgaXQgICAgICAgICAgICAgIGdlCisgICAgICAgIGFkZGdlICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgbW92cmVseCAgICAgICAgIHI0LCAgWChmZl92cDhfZGN0X2NhdF9wcm9iKSwgcjEKKyAgICAgICAgbHNsICAgICAgICAgICAgIHI5LCAgcjksICByMTIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3I0LCByMTIsIGxzbCAjMl0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjksICAjMworICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICAjMAorICAgICAgICBsZHJiICAgICAgICAgICAgcjAsICBbcjRdLCAjMQorMToKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI5LCAgW2xyLCByNV0KKyAgICAgICAgbHNsICAgICAgICAgICAgIHIxLCAgcjEsICAjMQorICAgICAgICByYWNfZ2V0X3Byb2IgICAgcjUsICByNiwgIHI3LCAgcjgsICByMCwgIHI5LCAgcjEwCisgICAgICAgIGxkcmIgICAgICAgICAgICByMCwgIFtyNF0sICMxCisgICAgICAgIGl0ICAgICAgICAgICAgICBnZQorICAgICAgICBhZGRnZSAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIGNtcCAgICAgICAgICAgICByMCwgICMwCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBsZHJiICAgICAgICAgICAgcjksICBbbHIsIHI1XQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMTIsIHIxCisgICAgICAgIGxkciAgICAgICAgICAgICByMSwgIFtzcCwgIzRdCis0OgorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICByMywgIHIzLCAgbHNsICM1CisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIHI0LCAgcjIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgcjQsICAjMjIKKyAgICAgICAgcmFjX2dldF8xMjggICAgIHI1LCAgcjYsICByNywgIHI4LCAgcjksICByMTAKKyAgICAgICAgaXQgICAgICAgICAgICAgIGdlCisgICAgICAgIHJzYmdlICAgICAgICAgICByMTIsIHIxMiwgIzAKKyAgICAgICAgc211bGJiICAgICAgICAgIHIxMiwgcjEyLCByMTEKKyAgICAgICAgbW92cmVsICAgICAgICAgIHI5LCAgemlnemFnX3NjYW4tMQorICAgICAgICBsZHJiICAgICAgICAgICAgcjksICBbcjksIHIzXQorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjMTYKKyAgICAgICAgc3RyaCAgICAgICAgICAgIHIxMiwgW3IxLCByOV0KKyAgICAgICAgYmdlICAgICAgICAgICAgIDZiCisgICAgICAgIGIgICAgICAgICAgICAgICA1YgorZW5kZnVuYworCitjb25zdCB6aWd6YWdfc2NhbgorICAgICAgICAuYnl0ZSAgICAgICAgICAgIDAsICAyLCAgOCwgMTYKKyAgICAgICAgLmJ5dGUgICAgICAgICAgIDEwLCAgNCwgIDYsIDEyCisgICAgICAgIC5ieXRlICAgICAgICAgICAxOCwgMjQsIDI2LCAyMAorICAgICAgICAuYnl0ZSAgICAgICAgICAgMTQsIDIyLCAyOCwgMzAKK2VuZGNvbnN0CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4ZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4ZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4MWQwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92cDhkc3AuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BUk1fVlA4RFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19BUk1fVlA4RFNQX0gKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvdnA4ZHNwLmgiCisKK3ZvaWQgZmZfdnA3OGRzcF9pbml0X2FybXY2KFZQOERTUENvbnRleHQgKmRzcCk7Cit2b2lkIGZmX3ZwNzhkc3BfaW5pdF9uZW9uKFZQOERTUENvbnRleHQgKmRzcCk7Cit2b2lkIGZmX3ZwOGRzcF9pbml0X2FybXY2KFZQOERTUENvbnRleHQgKmRzcCk7Cit2b2lkIGZmX3ZwOGRzcF9pbml0X25lb24oVlA4RFNQQ29udGV4dCAqZHNwKTsKKworI2RlZmluZSBWUDhfTEZfWShodiwgaW5uZXIsIG9wdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBmZl92cDhfIyNodiMjX2xvb3BfZmlsdGVyMTYjI2lubmVyIyNfIyNvcHQodWludDhfdCAqZHN0LCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGltX0UsIGludCBmbGltX0ksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhldl90aHJlc2gpCisKKyNkZWZpbmUgVlA4X0xGX1VWKGh2LCBpbm5lciwgb3B0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgZmZfdnA4XyMjaHYjI19sb29wX2ZpbHRlcjh1diMjaW5uZXIjI18jI29wdCh1aW50OF90ICpkc3RVLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFYsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxpbV9FLCBpbnQgZmxpbV9JLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZXZfdGhyZXNoKQorCisjZGVmaW5lIFZQOF9MRl9TSU1QTEUoaHYsIG9wdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBmZl92cDhfIyNodiMjX2xvb3BfZmlsdGVyMTZfc2ltcGxlXyMjb3B0KHVpbnQ4X3QgKmRzdCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGltKQorCisjZGVmaW5lIFZQOF9MRl9IVihpbm5lciwgb3B0KSAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4X0xGX1koaCwgIGlubmVyLCBvcHQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4X0xGX1kodiwgIGlubmVyLCBvcHQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4X0xGX1VWKGgsIGlubmVyLCBvcHQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4X0xGX1VWKHYsIGlubmVyLCBvcHQpCisKKyNkZWZpbmUgVlA4X0xGKG9wdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhfTEZfSFYoLCAgICAgICBvcHQpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhfTEZfSFYoX2lubmVyLCBvcHQpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhfTEZfU0lNUExFKGgsIG9wdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhfTEZfU0lNUExFKHYsIG9wdCkKKworI2RlZmluZSBWUDhfTUMobiwgb3B0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgZmZfcHV0X3ZwOF8jI24jI18jI29wdCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KQorCisjZGVmaW5lIFZQOF9FUEVMKHcsIG9wdCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4X01DKHBpeGVscyAjIyB3LCBvcHQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4X01DKGVwZWwgIyMgdyAjIyBfaDQsIG9wdCk7ICAgICAgICAgICAgICBcCisgICAgVlA4X01DKGVwZWwgIyMgdyAjIyBfaDYsIG9wdCk7ICAgICAgICAgICAgICBcCisgICAgVlA4X01DKGVwZWwgIyMgdyAjIyBfdjQsIG9wdCk7ICAgICAgICAgICAgICBcCisgICAgVlA4X01DKGVwZWwgIyMgdyAjIyBfaDR2NCwgb3B0KTsgICAgICAgICAgICBcCisgICAgVlA4X01DKGVwZWwgIyMgdyAjIyBfaDZ2NCwgb3B0KTsgICAgICAgICAgICBcCisgICAgVlA4X01DKGVwZWwgIyMgdyAjIyBfdjYsIG9wdCk7ICAgICAgICAgICAgICBcCisgICAgVlA4X01DKGVwZWwgIyMgdyAjIyBfaDR2Niwgb3B0KTsgICAgICAgICAgICBcCisgICAgVlA4X01DKGVwZWwgIyMgdyAjIyBfaDZ2Niwgb3B0KQorCisjZGVmaW5lIFZQOF9CSUxJTih3LCBvcHQpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4X01DKGJpbGluICMjIHcgIyMgX2gsIG9wdCk7ICAgICAgICAgICAgICBcCisgICAgVlA4X01DKGJpbGluICMjIHcgIyMgX3YsIG9wdCk7ICAgICAgICAgICAgICBcCisgICAgVlA4X01DKGJpbGluICMjIHcgIyMgX2h2LCBvcHQpCisKKyNlbmRpZiAvKiBBVkNPREVDX0FSTV9WUDhEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwOGRzcF9hcm12Ni5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXJtL3ZwOGRzcF9hcm12Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZGNiYmQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4ZHNwX2FybXY2LlMKQEAgLTAsMCArMSwxNjQwIEBACisvKgorICogVlA4IEFSTXY2IG9wdGltaXNhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICoKKyAqIFRoaXMgY29kZSB3YXMgcGFydGlhbGx5IHBvcnRlZCBmcm9tIGxpYnZweCwgd2hpY2ggdXNlcyB0aGlzIGxpY2Vuc2U6CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAqICAgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitAIGlkY3QKKworQCB2b2lkIHZwOF9sdW1hX2RjX3dodChpbnQxNl90IGJsb2NrWzRdWzRdWzE2XSwgaW50MTZfdCBkY1sxNl0pCitmdW5jdGlvbiBmZl92cDhfbHVtYV9kY193aHRfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjEwLCBscn0KKworICAgICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjItcjl9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTAsICMwCisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgICMwCisgICAgICAgIHVhZGQxNiAgICAgICAgICByMTIsIHIyLCAgcjggICAgICAgICAgICBAIHQwWzAsMV0KKyAgICAgICAgdXN1YjE2ICAgICAgICAgIHIyLCAgcjIsICByOCAgICAgICAgICAgIEAgdDNbMCwxXQorICAgICAgICBzdG0gICAgICAgICAgICAgcjEhLCB7cjEwLCBscn0KKyAgICAgICAgdWFkZDE2ICAgICAgICAgIHI4LCAgcjQsICByNiAgICAgICAgICAgIEAgdDFbMCwxXQorICAgICAgICB1c3ViMTYgICAgICAgICAgcjQsICByNCwgIHI2ICAgICAgICAgICAgQCB0MlswLDFdCisgICAgICAgIHN0bSAgICAgICAgICAgICByMSEsIHtyMTAsIGxyfQorICAgICAgICB1YWRkMTYgICAgICAgICAgcjYsICByMTIsIHI4ICAgICAgICAgICAgQCBkYzBbMCwxXQorICAgICAgICB1c3ViMTYgICAgICAgICAgcjEyLCByMTIsIHI4ICAgICAgICAgICAgQCBkYzJbMCwxXQorICAgICAgICBzdG0gICAgICAgICAgICAgcjEhLCB7cjEwLCBscn0KKyAgICAgICAgdWFkZDE2ICAgICAgICAgIHI4LCAgcjIsICByNCAgICAgICAgICAgIEAgZGMxWzAsMV0KKyAgICAgICAgdXN1YjE2ICAgICAgICAgIHIyLCAgcjIsICByNCAgICAgICAgICAgIEAgZGMzWzAsMV0KKyAgICAgICAgc3RtICAgICAgICAgICAgIHIxISwge3IxMCwgbHJ9CisKKyAgICAgICAgdWFkZDE2ICAgICAgICAgIGxyLCAgcjMsICByOSAgICAgICAgICAgIEAgdDBbMiwzXQorICAgICAgICB1c3ViMTYgICAgICAgICAgcjMsICByMywgIHI5ICAgICAgICAgICAgQCB0M1syLDNdCisgICAgICAgIHVhZGQxNiAgICAgICAgICByOSwgIHI1LCAgcjcgICAgICAgICAgICBAIHQxWzIsM10KKyAgICAgICAgdXN1YjE2ICAgICAgICAgIHI1LCAgcjUsICByNyAgICAgICAgICAgIEAgdDJbMiwzXQorCisgICAgICAgIHVhZGQxNiAgICAgICAgICByNywgIGxyLCAgcjkgICAgICAgICAgICBAIGRjMFsyLDNdCisgICAgICAgIHVzdWIxNiAgICAgICAgICBsciwgIGxyLCAgcjkgICAgICAgICAgICBAIGRjMlsyLDNdCisgICAgICAgIHVhZGQxNiAgICAgICAgICByOSwgIHIzLCAgcjUgICAgICAgICAgICBAIGRjMVsyLDNdCisgICAgICAgIHVzdWIxNiAgICAgICAgICByMywgIHIzLCAgcjUgICAgICAgICAgICBAIGRjM1syLDNdCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgIzMKKyAgICAgICAgb3JyICAgICAgICAgICAgIHIxLCAgcjEsICAjMHgzMDAwMCAgICAgIEAgMyB8IDMgKHJvdW5kKQorCisgICAgICAgIHBraGJ0ICAgICAgICAgICByNCwgIHI2LCAgcjgsICBsc2wgIzE2ICBAIGRjezAsMX1bMF0KKyAgICAgICAgcGtodGIgICAgICAgICAgIHI2LCAgcjgsICByNiwgIGFzciAjMTYgIEAgZGN7MCwxfVsxXQorICAgICAgICBwa2hidCAgICAgICAgICAgcjUsICByMTIsIHIyLCAgbHNsICMxNiAgQCBkY3syLDN9WzBdCisgICAgICAgIHBraHRiICAgICAgICAgICByMTIsIHIyLCAgcjEyLCBhc3IgIzE2ICBAIGRjezIsM31bMV0KKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI4LCAgcjcsICByOSwgIGxzbCAjMTYgIEAgZGN7MCwxfVsyXQorICAgICAgICB1YWRkMTYgICAgICAgICAgcjQsICByNCwgIHIxCisgICAgICAgIHVhZGQxNiAgICAgICAgICByNSwgIHI1LCAgcjEKKyAgICAgICAgcGtodGIgICAgICAgICAgIHI3LCAgcjksICByNywgIGFzciAjMTYgIEAgZGN7MCwxfVszXQorICAgICAgICBwa2hidCAgICAgICAgICAgcjIsICBsciwgIHIzLCAgbHNsICMxNiAgQCBkY3syLDN9WzJdCisgICAgICAgIHBraHRiICAgICAgICAgICBsciwgIHIzLCAgbHIsICBhc3IgIzE2ICBAIGRjezIsM31bM10KKworICAgICAgICB1YWRkMTYgICAgICAgICAgcjksICByNCwgIHI3ICAgICAgICAgICAgQCB0MFswLDFdCisgICAgICAgIHVhZGQxNiAgICAgICAgICByMywgIHI1LCAgbHIgICAgICAgICAgICBAIHQwWzIsM10KKyAgICAgICAgdXN1YjE2ICAgICAgICAgIHI0LCAgcjQsICByNyAgICAgICAgICAgIEAgdDNbMCwxXQorICAgICAgICB1c3ViMTYgICAgICAgICAgcjUsICByNSwgIGxyICAgICAgICAgICAgQCB0M1syLDNdCisgICAgICAgIHVhZGQxNiAgICAgICAgICByNywgIHI2LCAgcjggICAgICAgICAgICBAIHQxWzAsMV0KKyAgICAgICAgdWFkZDE2ICAgICAgICAgIGxyLCAgcjEyLCByMiAgICAgICAgICAgIEAgdDFbMiwzXQorICAgICAgICB1c3ViMTYgICAgICAgICAgcjYsICByNiwgIHI4ICAgICAgICAgICAgQCB0MlswLDFdCisgICAgICAgIHVzdWIxNiAgICAgICAgICByMTIsIHIxMiwgcjIgICAgICAgICAgICBAIHQyWzIsM10KKworICAgICAgICB1YWRkMTYgICAgICAgICAgcjgsICByOSwgIHI3ICAgICAgICAgICAgQCBibG9ja1swLDFdWzBdCisgICAgICAgIHVhZGQxNiAgICAgICAgICByMiwgIHIzLCAgbHIgICAgICAgICAgICBAIGJsb2NrWzIsM11bMF0KKyAgICAgICAgdXN1YjE2ICAgICAgICAgIHI5LCAgcjksICByNyAgICAgICAgICAgIEAgYmxvY2tbMCwxXVsyXQorICAgICAgICB1c3ViMTYgICAgICAgICAgcjMsICByMywgIGxyICAgICAgICAgICAgQCBibG9ja1syLDNdWzJdCisgICAgICAgIHVhZGQxNiAgICAgICAgICByNywgIHI0LCAgcjYgICAgICAgICAgICBAIGJsb2NrWzAsMV1bMV0KKyAgICAgICAgdWFkZDE2ICAgICAgICAgIGxyLCAgcjUsICByMTIgICAgICAgICAgIEAgYmxvY2tbMiwzXVsxXQorICAgICAgICB1c3ViMTYgICAgICAgICAgcjQsICByNCwgIHI2ICAgICAgICAgICAgQCBibG9ja1swLDFdWzNdCisgICAgICAgIHVzdWIxNiAgICAgICAgICByNSwgIHI1LCAgcjEyICAgICAgICAgICBAIGJsb2NrWzIsM11bM10KKworI2lmIEhBVkVfQVJNVjZUMl9FWFRFUk5BTAorICAgICAgICBzYmZ4ICAgICAgICAgICAgcjYsICByOCwgICMzLCAgIzEzCisgICAgICAgIHNiZnggICAgICAgICAgICByMTIsIHI3LCAgIzMsICAjMTMKKyAgICAgICAgc2JmeCAgICAgICAgICAgIHIxLCAgcjksICAjMywgICMxMworICAgICAgICBzYmZ4ICAgICAgICAgICAgcjEwLCByNCwgICMzLCAgIzEzCisjZWxzZQorICAgICAgICBzeHRoICAgICAgICAgICAgcjYsICByOAorICAgICAgICBzeHRoICAgICAgICAgICAgcjEyLCByNworICAgICAgICBzeHRoICAgICAgICAgICAgcjEsICByOQorICAgICAgICBzeHRoICAgICAgICAgICAgcjEwLCByNAorICAgICAgICBhc3IgICAgICAgICAgICAgcjYsICAjMyAgICAgICAgICAgICAgICAgQCBibG9ja1swXVswXQorICAgICAgICBhc3IgICAgICAgICAgICAgcjEyLCAjMyAgICAgICAgICAgICAgICAgQCBibG9ja1swXVsxXQorICAgICAgICBhc3IgICAgICAgICAgICAgcjEsICAjMyAgICAgICAgICAgICAgICAgQCBibG9ja1swXVsyXQorICAgICAgICBhc3IgICAgICAgICAgICAgcjEwLCAjMyAgICAgICAgICAgICAgICAgQCBibG9ja1swXVszXQorI2VuZGlmCisKKyAgICAgICAgc3RyaCAgICAgICAgICAgIHI2LCAgW3IwXSwgIzMyCisgICAgICAgIGFzciAgICAgICAgICAgICByOCwgIHI4LCAgIzE5ICAgICAgICAgICBAIGJsb2NrWzFdWzBdCisgICAgICAgIHN0cmggICAgICAgICAgICByMTIsIFtyMF0sICMzMgorICAgICAgICBhc3IgICAgICAgICAgICAgcjcsICByNywgICMxOSAgICAgICAgICAgQCBibG9ja1sxXVsxXQorICAgICAgICBzdHJoICAgICAgICAgICAgcjEsICBbcjBdLCAjMzIKKyAgICAgICAgYXNyICAgICAgICAgICAgIHI5LCAgcjksICAjMTkgICAgICAgICAgIEAgYmxvY2tbMV1bMl0KKyAgICAgICAgc3RyaCAgICAgICAgICAgIHIxMCwgW3IwXSwgIzMyCisgICAgICAgIGFzciAgICAgICAgICAgICByNCwgIHI0LCAgIzE5ICAgICAgICAgICBAIGJsb2NrWzFdWzNdCisgICAgICAgIHN0cmggICAgICAgICAgICByOCwgIFtyMF0sICMzMgorICAgICAgICBhc3IgICAgICAgICAgICAgcjYsICByMiwgICMxOSAgICAgICAgICAgQCBibG9ja1szXVswXQorICAgICAgICBzdHJoICAgICAgICAgICAgcjcsICBbcjBdLCAjMzIKKyAgICAgICAgYXNyICAgICAgICAgICAgIHIxMiwgbHIsICAjMTkgICAgICAgICAgIEAgYmxvY2tbM11bMV0KKyAgICAgICAgc3RyaCAgICAgICAgICAgIHI5LCAgW3IwXSwgIzMyCisgICAgICAgIGFzciAgICAgICAgICAgICByMSwgIHIzLCAgIzE5ICAgICAgICAgICBAIGJsb2NrWzNdWzJdCisgICAgICAgIHN0cmggICAgICAgICAgICByNCwgIFtyMF0sICMzMgorICAgICAgICBhc3IgICAgICAgICAgICAgcjEwLCByNSwgICMxOSAgICAgICAgICAgQCBibG9ja1szXVszXQorCisjaWYgSEFWRV9BUk1WNlQyX0VYVEVSTkFMCisgICAgICAgIHNiZnggICAgICAgICAgICByMiwgIHIyLCAgIzMsICAjMTMKKyAgICAgICAgc2JmeCAgICAgICAgICAgIGxyLCAgbHIsICAjMywgICMxMworICAgICAgICBzYmZ4ICAgICAgICAgICAgcjMsICByMywgICMzLCAgIzEzCisgICAgICAgIHNiZnggICAgICAgICAgICByNSwgIHI1LCAgIzMsICAjMTMKKyNlbHNlCisgICAgICAgIHN4dGggICAgICAgICAgICByMiwgIHIyCisgICAgICAgIHN4dGggICAgICAgICAgICBsciwgIGxyCisgICAgICAgIHN4dGggICAgICAgICAgICByMywgIHIzCisgICAgICAgIHN4dGggICAgICAgICAgICByNSwgIHI1CisgICAgICAgIGFzciAgICAgICAgICAgICByMiwgICMzICAgICAgICAgICAgICAgICBAIGJsb2NrWzJdWzBdCisgICAgICAgIGFzciAgICAgICAgICAgICBsciwgICMzICAgICAgICAgICAgICAgICBAIGJsb2NrWzJdWzFdCisgICAgICAgIGFzciAgICAgICAgICAgICByMywgICMzICAgICAgICAgICAgICAgICBAIGJsb2NrWzJdWzJdCisgICAgICAgIGFzciAgICAgICAgICAgICByNSwgICMzICAgICAgICAgICAgICAgICBAIGJsb2NrWzJdWzNdCisjZW5kaWYKKworICAgICAgICBzdHJoICAgICAgICAgICAgcjIsICBbcjBdLCAjMzIKKyAgICAgICAgc3RyaCAgICAgICAgICAgIGxyLCAgW3IwXSwgIzMyCisgICAgICAgIHN0cmggICAgICAgICAgICByMywgIFtyMF0sICMzMgorICAgICAgICBzdHJoICAgICAgICAgICAgcjUsICBbcjBdLCAjMzIKKyAgICAgICAgc3RyaCAgICAgICAgICAgIHI2LCAgW3IwXSwgIzMyCisgICAgICAgIHN0cmggICAgICAgICAgICByMTIsIFtyMF0sICMzMgorICAgICAgICBzdHJoICAgICAgICAgICAgcjEsICBbcjBdLCAjMzIKKyAgICAgICAgc3RyaCAgICAgICAgICAgIHIxMCwgW3IwXSwgIzMyCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTAsIHBjfQorZW5kZnVuYworCitAIHZvaWQgdnA4X2x1bWFfZGNfd2h0X2RjKGludDE2X3QgYmxvY2tbNF1bNF1bMTZdLCBpbnQxNl90IGRjWzE2XSkKK2Z1bmN0aW9uIGZmX3ZwOF9sdW1hX2RjX3dodF9kY19hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgbGRyc2ggICAgICAgICAgIHIyLCAgW3IxXQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgICMzCisgICAgICAgIHN0cmggICAgICAgICAgICByMywgIFtyMV0KKyAgICAgICAgYXNyICAgICAgICAgICAgIHIyLCAgcjIsICAjMworICAgIC5yZXB0IDE2CisgICAgICAgIHN0cmggICAgICAgICAgICByMiwgIFtyMF0sICMzMgorICAgIC5lbmRyCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitAIHZvaWQgdnA4X2lkY3RfYWRkKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIGludCBzdHJpZGUpCitmdW5jdGlvbiBmZl92cDhfaWRjdF9hZGRfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjEyLCBscn0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMzIKKworICAgICAgICBtb3Z3ICAgICAgICAgICAgcjMsICAjMjAwOTEgICAgICAgICAgICAgQCBjb3NwaThzcXJ0Mm1pbnVzMQorICAgICAgICBtb3Z3ICAgICAgICAgICAgcjQsICAjMzU0NjggICAgICAgICAgICAgQCBzaW5waThzcXJ0MgorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICBzcAorMToKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3IxLCAjOF0gICAgICAgQCAgaTUgfCBpNCAgPSBibG9jazFbMV0gfCBibG9jazFbMF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIGxyLCAgW3IxLCAjMTZdICAgICAgQCAgaTkgfCBpOCAgPSBibG9jazJbMV0gfCBibG9jazJbMF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3IxLCAjMjRdICAgICAgQCBpMTMgfCBpMTIgPSBibG9jazNbMV0gfCBibG9jazNbMF0KKworICAgICAgICBzbXVsd3QgICAgICAgICAgcjksICByMywgIHI2ICAgICAgICAgICAgQCBpcFs1XSAqIGNvc3BpOHNxcnQybWludXMxCisgICAgICAgIHNtdWx3YiAgICAgICAgICByNywgIHIzLCAgcjYgICAgICAgICAgICBAIGlwWzRdICogY29zcGk4c3FydDJtaW51czEKKyAgICAgICAgc211bHd0ICAgICAgICAgIHIxMCwgcjQsICByNiAgICAgICAgICAgIEAgaXBbNV0gKiBzaW5waThzcXJ0MgorICAgICAgICBzbXVsd2IgICAgICAgICAgcjgsICByNCwgIHI2ICAgICAgICAgICAgQCBpcFs0XSAqIHNpbnBpOHNxcnQyCisgICAgICAgIHBraGJ0ICAgICAgICAgICByNywgIHI3LCAgcjksICBsc2wgIzE2ICBAIDVjIHwgNGMKKyAgICAgICAgc211bHd0ICAgICAgICAgIHIxMSwgcjMsICByMTIgICAgICAgICAgIEAgaXBbMTNdICogY29zcGk4c3FydDJtaW51czEKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI4LCAgcjgsICByMTAsIGxzbCAjMTYgIEAgNXMgICB8IDRzICAgPSB0MiBmaXJzdCBoYWxmCisgICAgICAgIHVhZGQxNiAgICAgICAgICByNiwgIHI2LCAgcjcgICAgICAgICAgICBAIDVjKzUgfCA0Yys0ID0gdDMgZmlyc3QgaGFsZgorICAgICAgICBzbXVsd2IgICAgICAgICAgcjksICByMywgIHIxMiAgICAgICAgICAgQCBpcFsxMl0gKiBjb3NwaThzcXJ0Mm1pbnVzMQorICAgICAgICBzbXVsd3QgICAgICAgICAgcjcsICByNCwgIHIxMiAgICAgICAgICAgQCBpcFsxM10gKiBzaW5waThzcXJ0MgorICAgICAgICBzbXVsd2IgICAgICAgICAgcjEwLCByNCwgIHIxMiAgICAgICAgICAgQCBpcFsxMl0gKiBzaW5waThzcXJ0MgorCisgICAgICAgIHBraGJ0ICAgICAgICAgICByOSwgIHI5LCAgcjExLCBsc2wgIzE2ICBAIDEzYyB8IDEyYworICAgICAgICBsZHIgICAgICAgICAgICAgcjExLCBbcjFdICAgICAgICAgICAgICAgQCAgaTEgfCBpMAorICAgICAgICBwa2hidCAgICAgICAgICAgcjEwLCByMTAsICByNywgbHNsICMxNiAgQCAxM3MgfCAxMnMgICAgPSB0MyBzZWNvbmQgaGFsZgorICAgICAgICB1YWRkMTYgICAgICAgICAgcjcsICByMTIsIHI5ICAgICAgICAgICAgQCAxM2MrMTMgIHwgMTJjKzEyID0gdDIgMm5kIGhhbGYKKyAgICAgICAgdWFkZDE2ICAgICAgICAgIHI2LCAgcjYsICByMTAgICAgICAgICAgIEAgZCA9IHQzCisgICAgICAgIHVhZGQxNiAgICAgICAgICByMTAsIHIxMSwgbHIgICAgICAgICAgICBAIGEgPSB0MAorICAgICAgICB1c3ViMTYgICAgICAgICAgcjcsICByOCwgIHI3ICAgICAgICAgICAgQCBjID0gdDIKKyAgICAgICAgdXN1YjE2ICAgICAgICAgIHI4LCAgcjExLCBsciAgICAgICAgICAgIEAgYiA9IHQxCisgICAgICAgIHVhZGQxNiAgICAgICAgICByOSwgIHIxMCwgcjYgICAgICAgICAgICBAIGErZCA9IHRtcHswLDF9WzBdCisgICAgICAgIHVzdWIxNiAgICAgICAgICByMTAsIHIxMCwgcjYgICAgICAgICAgICBAIGEtZCA9IHRtcHswLDF9WzNdCisgICAgICAgIHVhZGQxNiAgICAgICAgICByNiwgIHI4LCAgcjcgICAgICAgICAgICBAIGIrYyA9IHRtcHswLDF9WzFdCisgICAgICAgIHVzdWIxNiAgICAgICAgICByNywgIHI4LCAgcjcgICAgICAgICAgICBAIGItYyA9IHRtcHswLDF9WzJdCisgICAgICAgIG1vdiAgICAgICAgICAgICByOCwgICMwCisgICAgICAgIGNtcCAgICAgICAgICAgICBzcCwgIHI1CisgICAgICAgIHN0ciAgICAgICAgICAgICByNiwgIFtyNSwgIzhdICAgICAgICAgICBAICBvNSB8IG80CisgICAgICAgIHN0ciAgICAgICAgICAgICByNywgIFtyNSwgIzE2XSAgICAgICAgICBAICBvOSB8IG84CisgICAgICAgIHN0ciAgICAgICAgICAgICByMTAsIFtyNSwgIzI0XSAgICAgICAgICBAIG8xMyB8IG8xMgorICAgICAgICBzdHIgICAgICAgICAgICAgcjksICBbcjVdLCAjNCAgICAgICAgICAgQCAgbzEgfCBvMAorICAgICAgICBzdHIgICAgICAgICAgICAgcjgsICBbcjEsICM4XQorICAgICAgICBzdHIgICAgICAgICAgICAgcjgsICBbcjEsICMxNl0KKyAgICAgICAgc3RyICAgICAgICAgICAgIHI4LCAgW3IxLCAjMjRdCisgICAgICAgIHN0ciAgICAgICAgICAgICByOCwgIFtyMV0sICM0CisgICAgICAgIGJlcSAgICAgICAgICAgICAxYgorCisgICAgICAgIG1vdiAgICAgICAgICAgICByNSwgICMyCisyOgorICAgICAgICBwb3AgICAgICAgICAgICAge3IxLCByNiwgcjEyLCBscn0KKyAgICAgICAgc211bHd0ICAgICAgICAgIHI5LCAgcjMsICByMTIgICAgICAgICAgIEAgaXBbNV0gKiBjb3NwaThzcXJ0Mm1pbnVzMQorICAgICAgICBzbXVsd3QgICAgICAgICAgcjcsICByMywgIHIxICAgICAgICAgICAgQCBpcFsxXSAqIGNvc3BpOHNxcnQybWludXMxCisgICAgICAgIHNtdWx3dCAgICAgICAgICByMTAsIHI0LCAgcjEyICAgICAgICAgICBAIGlwWzVdICogc2lucGk4c3FydDIKKyAgICAgICAgc211bHd0ICAgICAgICAgIHI4LCAgcjQsICByMSAgICAgICAgICAgIEAgaXBbMV0gKiBzaW5waThzcXJ0MgorICAgICAgICBwa2hidCAgICAgICAgICAgcjExLCByMSwgIHIxMiwgbHNsICMxNiAgQCBpNCB8IGkwID0gdDAvdDEgZmlyc3QgaGFsZgorICAgICAgICBwa2h0YiAgICAgICAgICAgcjEsICByMTIsIHIxLCAgYXNyICMxNiAgQCBpNSB8IGkxCisgICAgICAgIHBraGJ0ICAgICAgICAgICByNywgIHI3LCAgcjksICBsc2wgIzE2ICBAIDVjIHwgMWMKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI4LCAgcjgsICByMTAsIGxzbCAjMTYgIEAgNXMgfCAxcyA9IHQyIGZpcnN0IGhhbGYKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI5LCAgcjYsICBsciwgIGxzbCAjMTYgIEAgaTYgfCBpMiA9IHQwL3QxIHNlY29uZCBoYWxmCisgICAgICAgIHBraHRiICAgICAgICAgICByMTIsIGxyLCAgcjYsICBhc3IgIzE2ICBAIGk3IHwgaTMKKyAgICAgICAgdWFkZDE2ICAgICAgICAgIHIxLCAgcjcsICByMSAgICAgICAgICAgIEAgNWMrNSB8IDFjKzEgPSB0MyBmaXJzdCBoYWxmCisgICAgICAgIHVhZGQxNiAgICAgICAgICByMTAsIHIxMSwgcjkgICAgICAgICAgICBAIGEgPSB0MAorICAgICAgICB1c3ViMTYgICAgICAgICAgcjksICByMTEsIHI5ICAgICAgICAgICAgQCBiID0gdDEKKyAgICAgICAgc211bHd0ICAgICAgICAgIHI3LCAgcjMsICByMTIgICAgICAgICAgIEAgaXBbN10gKiBjb3NwaThzcXJ0Mm1pbnVzMQorICAgICAgICBzbXVsd2IgICAgICAgICAgbHIsICByMywgIHIxMiAgICAgICAgICAgQCBpcFszXSAqIGNvc3BpOHNxcnQybWludXMxCisgICAgICAgIHNtdWx3dCAgICAgICAgICByMTEsIHI0LCAgcjEyICAgICAgICAgICBAIGlwWzddICogc2lucGk4c3FydDIKKyAgICAgICAgc211bHdiICAgICAgICAgIHI2LCAgcjQsICByMTIgICAgICAgICAgIEAgaXBbM10gKiBzaW5waThzcXJ0MgorICAgICAgICBzdWJzICAgICAgICAgICAgcjUsICByNSwgICMxCisgICAgICAgIHBraGJ0ICAgICAgICAgICByNywgIGxyLCAgcjcsICBsc2wgIzE2ICBAIDdjIHwgM2MKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHIxMSwgcjYsICByMTEsIGxzbCAjMTYgIEAgN3MgfCAzcyA9IHQzIHNlY29uZCBoYWxmCisgICAgICAgIG1vdiAgICAgICAgICAgICByNiwgICMweDQKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI2LCAgcjYsICAjMHg0MDAwMAorICAgICAgICB1YWRkMTYgICAgICAgICAgcjEyLCByNywgIHIxMiAgICAgICAgICAgQCA3Yys3IHwgM2MrMyA9IHQyIHNlY29uZCBoYWxmCisgICAgICAgIHVhZGQxNiAgICAgICAgICByMTAsIHIxMCwgcjYgICAgICAgICAgICBAIHQwICsgNAorICAgICAgICB1YWRkMTYgICAgICAgICAgcjksICByOSwgIHI2ICAgICAgICAgICAgQCB0MSArIDQKKyAgICAgICAgdXN1YjE2ICAgICAgICAgIGxyLCAgcjgsICByMTIgICAgICAgICAgIEAgYyAobzUgfCBvMSkgPSB0MgorICAgICAgICB1YWRkMTYgICAgICAgICAgcjEyLCByMTEsIHIxICAgICAgICAgICAgQCBkIChvNyB8IG8zKSA9IHQzCisgICAgICAgIHVzdWIxNiAgICAgICAgICByMSwgIHI5LCAgbHIgICAgICAgICAgICBAIGItYyA9IGRzdHswLDF9WzJdCisgICAgICAgIHVhZGQxNiAgICAgICAgICByNywgIHIxMCwgcjEyICAgICAgICAgICBAIGErZCA9IGRzdHswLDF9WzBdCisgICAgICAgIHVzdWIxNiAgICAgICAgICByMTIsIHIxMCwgcjEyICAgICAgICAgICBAIGEtZCA9IGRzdHswLDF9WzNdCisgICAgICAgIHVhZGQxNiAgICAgICAgICByMTAsIHI5LCAgbHIgICAgICAgICAgICBAIGIrYyA9IGRzdHswLDF9WzFdCisKKyAgICAgICAgYXNyICAgICAgICAgICAgIGxyLCAgcjEsICAjMyAgICAgICAgICAgIEAgb1sxXVsyXQorICAgICAgICBhc3IgICAgICAgICAgICAgcjksICByMTIsICMzICAgICAgICAgICAgQCBvWzFdWzNdCisgICAgICAgIHBraHRiICAgICAgICAgICByOCwgIGxyLCAgcjcsICBhc3IgIzE5ICBAIG9bMV1bMCwyXQorICAgICAgICBwa2h0YiAgICAgICAgICAgcjExLCByOSwgIHIxMCwgYXNyICMxOSAgQCBvWzFdWzEsM10KKyAgICAgICAgbGRyICAgICAgICAgICAgIGxyLCAgW3IwXQorICAgICAgICBzeHRoICAgICAgICAgICAgcjEyLCByMTIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3IwLCByMl0KKyAgICAgICAgc3h0aCAgICAgICAgICAgIHIxLCAgcjEKKyNpZiBIQVZFX0FSTVY2VDJfRVhURVJOQUwKKyAgICAgICAgc2JmeCAgICAgICAgICAgIHI3LCAgcjcsICAjMywgICMxMworICAgICAgICBzYmZ4ICAgICAgICAgICAgcjEwLCByMTAsICMzLCAgIzEzCisjZWxzZQorICAgICAgICBzeHRoICAgICAgICAgICAgcjcsICByNworICAgICAgICBzeHRoICAgICAgICAgICAgcjEwLCByMTAKKyAgICAgICAgYXNyICAgICAgICAgICAgIHI3LCAgIzMgICAgICAgICAgICAgICAgIEAgb1swXVswXQorICAgICAgICBhc3IgICAgICAgICAgICAgcjEwLCAjMyAgICAgICAgICAgICAgICAgQCBvWzBdWzFdCisjZW5kaWYKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI3LCAgcjcsICByMSwgIGxzbCAjMTMgIEAgb1swXVswLDJdCisgICAgICAgIHBraGJ0ICAgICAgICAgICByMTAsIHIxMCwgcjEyLCBsc2wgIzEzICBAIG9bMF1bMSwzXQorCisgICAgICAgIHV4dGFiMTYgICAgICAgICByNywgIHI3LCAgbHIKKyAgICAgICAgdXh0YWIxNiAgICAgICAgIHIxMCwgcjEwLCBsciwgIHJvciAjOAorICAgICAgICB1eHRhYjE2ICAgICAgICAgcjgsICByOCwgIHI5CisgICAgICAgIHV4dGFiMTYgICAgICAgICByMTEsIHIxMSwgcjksICByb3IgIzgKKyAgICAgICAgdXNhdDE2ICAgICAgICAgIHI3LCAgIzgsICByNworICAgICAgICB1c2F0MTYgICAgICAgICAgcjEwLCAjOCwgIHIxMAorICAgICAgICB1c2F0MTYgICAgICAgICAgcjgsICAjOCwgIHI4CisgICAgICAgIHVzYXQxNiAgICAgICAgICByMTEsICM4LCAgcjExCisgICAgICAgIG9yciAgICAgICAgICAgICByNywgIHI3LCAgcjEwLCBsc2wgIzgKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI4LCAgcjgsICByMTEsIGxzbCAjOAorICAgICAgICBzdHIgICAgICAgICAgICAgcjgsICBbcjAsIHIyXQorICAgICAgICBzdHJfcG9zdCAgICAgICAgcjcsICByMCwgIHIyLCAgbHNsICMxCisKKyAgICAgICAgYm5lICAgICAgICAgICAgIDJiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTIsIHBjfQorZW5kZnVuYworCitAIHZvaWQgdnA4X2lkY3RfZGNfYWRkKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIGludCBzdHJpZGUpCitmdW5jdGlvbiBmZl92cDhfaWRjdF9kY19hZGRfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjYsIGxyfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjYsICByMCwgIHIyLCAgbHNsICMxCisgICAgICAgIGxkcnNoICAgICAgICAgICByMywgIFtyMV0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHI0LCAgIzAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjMsICAjNAorICAgICAgICBzdHJoICAgICAgICAgICAgcjQsICBbcjFdLCAjMzIKKyAgICAgICAgYXNyICAgICAgICAgICAgIHIzLCAgIzMKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI1LCAgW3IwXQorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbcjAsIHIyXQorICAgICAgICBwa2hidCAgICAgICAgICAgcjMsICByMywgIHIzLCAgbHNsICMxNgorICAgICAgICB1eHRhYjE2ICAgICAgICAgbHIsICByMywgIHI1ICAgICAgICAgICAgQCBhMSsyIHwgYTErMAorICAgICAgICB1eHRhYjE2ICAgICAgICAgcjUsICByMywgIHI1LCAgcm9yICM4ICAgQCBhMSszIHwgYTErMQorICAgICAgICB1eHRhYjE2ICAgICAgICAgcjEyLCByMywgIHI0CisgICAgICAgIHV4dGFiMTYgICAgICAgICByNCwgIHIzLCAgcjQsICByb3IgIzgKKyAgICAgICAgdXNhdDE2ICAgICAgICAgIGxyLCAgIzgsICBscgorICAgICAgICB1c2F0MTYgICAgICAgICAgcjUsICAjOCwgIHI1CisgICAgICAgIHVzYXQxNiAgICAgICAgICByMTIsICM4LCAgcjEyCisgICAgICAgIHVzYXQxNiAgICAgICAgICByNCwgICM4LCAgcjQKKyAgICAgICAgb3JyICAgICAgICAgICAgIGxyLCAgbHIsICByNSwgIGxzbCAjOAorICAgICAgICBsZHIgICAgICAgICAgICAgcjUsICBbcjZdCisgICAgICAgIG9yciAgICAgICAgICAgICByMTIsIHIxMiwgcjQsICBsc2wgIzgKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3I2LCByMl0KKyAgICAgICAgc3RyICAgICAgICAgICAgIGxyLCAgW3IwXQorICAgICAgICB1eHRhYjE2ICAgICAgICAgbHIsICByMywgIHI1CisgICAgICAgIHN0ciAgICAgICAgICAgICByMTIsIFtyMCwgcjJdCisgICAgICAgIHV4dGFiMTYgICAgICAgICByNSwgIHIzLCAgcjUsICByb3IgIzgKKyAgICAgICAgdXh0YWIxNiAgICAgICAgIHIxMiwgcjMsICByNAorICAgICAgICB1eHRhYjE2ICAgICAgICAgcjQsICByMywgIHI0LCAgcm9yICM4CisgICAgICAgIHVzYXQxNiAgICAgICAgICBsciwgICM4LCAgbHIKKyAgICAgICAgdXNhdDE2ICAgICAgICAgIHI1LCAgIzgsICByNQorICAgICAgICB1c2F0MTYgICAgICAgICAgcjEyLCAjOCwgIHIxMgorICAgICAgICB1c2F0MTYgICAgICAgICAgcjQsICAjOCwgIHI0CisgICAgICAgIG9yciAgICAgICAgICAgICBsciwgIGxyLCAgcjUsICBsc2wgIzgKKyAgICAgICAgb3JyICAgICAgICAgICAgIHIxMiwgcjEyLCByNCwgIGxzbCAjOAorICAgICAgICBzdHIgICAgICAgICAgICAgbHIsICBbcjZdCisgICAgICAgIHN0ciAgICAgICAgICAgICByMTIsIFtyNiwgcjJdCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjYsIHBjfQorZW5kZnVuYworCitAIHZvaWQgdnA4X2lkY3RfZGNfYWRkNHV2KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1s0XVsxNl0sIGludCBzdHJpZGUpCitmdW5jdGlvbiBmZl92cDhfaWRjdF9kY19hZGQ0dXZfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsIGxyfQorCisgICAgICAgIGJsICAgICAgICAgICAgICBYKGZmX3ZwOF9pZGN0X2RjX2FkZF9hcm12NikKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjNAorICAgICAgICBibCAgICAgICAgICAgICAgWChmZl92cDhfaWRjdF9kY19hZGRfYXJtdjYpCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjIsICBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjNAorICAgICAgICBibCAgICAgICAgICAgICAgWChmZl92cDhfaWRjdF9kY19hZGRfYXJtdjYpCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzQKKyAgICAgICAgYmwgICAgICAgICAgICAgIFgoZmZfdnA4X2lkY3RfZGNfYWRkX2FybXY2KQorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQsIHBjfQorZW5kZnVuYworCitAIHZvaWQgdnA4X2lkY3RfZGNfYWRkNHkodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzRdWzE2XSwgaW50IHN0cmlkZSkKK2Z1bmN0aW9uIGZmX3ZwOF9pZGN0X2RjX2FkZDR5X2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LCBscn0KKworICAgICAgICBibCAgICAgICAgICAgICAgWChmZl92cDhfaWRjdF9kY19hZGRfYXJtdjYpCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzQKKyAgICAgICAgYmwgICAgICAgICAgICAgIFgoZmZfdnA4X2lkY3RfZGNfYWRkX2FybXY2KQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM0CisgICAgICAgIGJsICAgICAgICAgICAgICBYKGZmX3ZwOF9pZGN0X2RjX2FkZF9hcm12NikKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjNAorICAgICAgICBibCAgICAgICAgICAgICAgWChmZl92cDhfaWRjdF9kY19hZGRfYXJtdjYpCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9CitlbmRmdW5jCisKK0AgbG9vcGZpbHRlcgorCisubWFjcm8gIHRyYW5zcG9zZSAgICAgICBvMywgIG8yLCAgbzEsICBvMCwgIGkwLCAgaTEsICBpMiwgIGkzCisgICAgICAgIHV4dGIxNiAgICAgICAgICBcbzEsIFxpMSAgICAgICAgICAgICAgICBAIHh4IDEyIHh4IDEwCisgICAgICAgIHV4dGIxNiAgICAgICAgICBcbzAsIFxpMCAgICAgICAgICAgICAgICBAIHh4IDAyIHh4IDAwCisgICAgICAgIHV4dGIxNiAgICAgICAgICBcbzMsIFxpMyAgICAgICAgICAgICAgICBAIHh4IDMyIHh4IDMwCisgICAgICAgIHV4dGIxNiAgICAgICAgICBcbzIsIFxpMiAgICAgICAgICAgICAgICBAIHh4IDIyIHh4IDIwCisgICAgICAgIG9yciAgICAgICAgICAgICBcbzEsIFxvMCwgXG8xLCBsc2wgIzggICBAIDEyIDAyIDEwIDAwCisgICAgICAgIG9yciAgICAgICAgICAgICBcbzMsIFxvMiwgXG8zLCBsc2wgIzggICBAIDMyIDIyIDMwIDIwCisKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIFxpMSwgXGkxLCByb3IgIzggICAgICAgIEAgeHggMTMgeHggMTEKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIFxpMywgXGkzLCByb3IgIzggICAgICAgIEAgeHggMzMgeHggMzEKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIFxpMCwgXGkwLCByb3IgIzggICAgICAgIEAgeHggMDMgeHggMDEKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIFxpMiwgXGkyLCByb3IgIzggICAgICAgIEAgeHggMjMgeHggMjEKKyAgICAgICAgb3JyICAgICAgICAgICAgIFxpMCwgXGkwLCBcaTEsIGxzbCAjOCAgIEAgMTMgMDMgMTEgMDEKKyAgICAgICAgb3JyICAgICAgICAgICAgIFxpMiwgXGkyLCBcaTMsIGxzbCAjOCAgIEAgMzMgMjMgMzEgMjEKKworICAgICAgICBwa2h0YiAgICAgICAgICAgXG8yLCBcbzMsIFxvMSwgYXNyICMxNiAgQCAzMiAyMiAxMiAwMgorICAgICAgICBwa2hidCAgICAgICAgICAgXG8wLCBcbzEsIFxvMywgbHNsICMxNiAgQCAzMCAyMCAxMCAwMAorICAgICAgICBwa2h0YiAgICAgICAgICAgXG8zLCBcaTIsIFxpMCwgYXNyICMxNiAgQCAzMyAyMyAxMyAwMworICAgICAgICBwa2hidCAgICAgICAgICAgXG8xLCBcaTAsIFxpMiwgbHNsICMxNiAgQCAzMSAyMSAxMSAwMQorLmVuZG0KKworLm1hY3JvICBzaW1wbGVfZmlsdGVyCisgICAgICAgIHVxc3ViOCAgICAgICAgICByNywgIHIzLCAgcjYgICAgICAgICAgICBAIHAxIC0gcTEKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI4LCAgcjYsICByMyAgICAgICAgICAgIEAgcTEgLSBwMQorICAgICAgICB1cXN1YjggICAgICAgICAgcjEwLCByNCwgIHI1ICAgICAgICAgICAgQCBwMCAtIHEwCisgICAgICAgIHVxc3ViOCAgICAgICAgICByOSwgIHI1LCAgcjQgICAgICAgICAgICBAIHEwIC0gcDAKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI3LCAgcjcsICByOCAgICAgICAgICAgIEAgYWJzKHAxIC0gcTEpCisgICAgICAgIG9yciAgICAgICAgICAgICByOSwgIHI5LCAgcjEwICAgICAgICAgICBAIGFicyhwMCAtIHEwKQorICAgICAgICB1aGFkZDggICAgICAgICAgcjcsICByNywgIGxyICAgICAgICAgICAgQCBhYnMocDEgLSBxMikgPj4gMQorICAgICAgICB1cWFkZDggICAgICAgICAgcjksICByOSwgIHI5ICAgICAgICAgICAgQCBhYnMocDAgLSBxMCkgKiAyCisgICAgICAgIHVxYWRkOCAgICAgICAgICByNywgIHI3LCAgcjkgICAgICAgICAgICBAIGFicyhwMCAtIHEwKSoyICsgYWJzKHAxLXExKS8yCisgICAgICAgIG12biAgICAgICAgICAgICByOCwgICMwCisgICAgICAgIHVzdWI4ICAgICAgICAgICByMTAsIHIxMiwgcjcgICAgICAgICAgICBAIGNvbXBhcmUgdG8gZmxpbWl0CisgICAgICAgIHNlbCAgICAgICAgICAgICByMTAsIHI4LCAgbHIgICAgICAgICAgICBAIGZpbHRlciBtYXNrOiBGIG9yIDAKKyAgICAgICAgY21wICAgICAgICAgICAgIHIxMCwgIzAKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisKKyAgICAgICAgZW9yICAgICAgICAgICAgIHIzLCAgcjMsICByMiAgICAgICAgICAgIEAgcHMxCisgICAgICAgIGVvciAgICAgICAgICAgICByNiwgIHI2LCAgcjIgICAgICAgICAgICBAIHFzMQorICAgICAgICBlb3IgICAgICAgICAgICAgcjQsICByNCwgIHIyICAgICAgICAgICAgQCBwczAKKyAgICAgICAgZW9yICAgICAgICAgICAgIHI1LCAgcjUsICByMiAgICAgICAgICAgIEAgcXMwCisKKyAgICAgICAgcXN1YjggICAgICAgICAgIHIzLCAgcjMsICByNiAgICAgICAgICAgIEAgdnA4X2ZpbHRlciA9IHAxIC0gcTEKKyAgICAgICAgcXN1YjggICAgICAgICAgIHI2LCAgcjUsICByNCAgICAgICAgICAgIEAgcTAgLSBwMAorICAgICAgICBxYWRkOCAgICAgICAgICAgcjMsICByMywgIHI2ICAgICAgICAgICAgQCArPSBxMCAtIHAwCisgICAgICAgIGxzciAgICAgICAgICAgICByNywgIHIyLCAgIzUgICAgICAgICAgICBAIDB4MDQwNDA0MDQKKyAgICAgICAgcWFkZDggICAgICAgICAgIHIzLCAgcjMsICByNiAgICAgICAgICAgIEAgKz0gcTAgLSBwMAorICAgICAgICBzdWIgICAgICAgICAgICAgcjksICByNywgIHIyLCAgbHNyICM3ICAgQCAweDAzMDMwMzAzCisgICAgICAgIHFhZGQ4ICAgICAgICAgICByMywgIHIzLCAgcjYgICAgICAgICAgICBAIHZwOF9maWx0ZXIgPSBwMS1xMSArIDMqKHEwLXAwKQorICAgICAgICBhbmQgICAgICAgICAgICAgcjMsICByMywgIHIxMCAgICAgICAgICAgQCB2cDhfZmlsdGVyICY9IG1hc2sKKworICAgICAgICBxYWRkOCAgICAgICAgICAgcjksICByMywgIHI5ICAgICAgICAgICAgQCBGaWx0ZXIyID0gdnA4X2ZpbHRlciArIDMKKyAgICAgICAgcWFkZDggICAgICAgICAgIHIzLCAgcjMsICByNyAgICAgICAgICAgIEAgRmlsdGVyMSA9IHZwOF9maWx0ZXIgKyA0CisKKyAgICAgICAgc2hhZGQ4ICAgICAgICAgIHI5LCAgcjksICBscgorICAgICAgICBzaGFkZDggICAgICAgICAgcjMsICByMywgIGxyCisgICAgICAgIHNoYWRkOCAgICAgICAgICByOSwgIHI5LCAgbHIKKyAgICAgICAgc2hhZGQ4ICAgICAgICAgIHIzLCAgcjMsICBscgorICAgICAgICBzaGFkZDggICAgICAgICAgcjksICByOSwgIGxyICAgICAgICAgICAgQCBGaWx0ZXIyID4+PSAzCisgICAgICAgIHNoYWRkOCAgICAgICAgICByMywgIHIzLCAgbHIgICAgICAgICAgICBAIEZpbHRlcjEgPj49IDMKKworICAgICAgICBxYWRkOCAgICAgICAgICAgcjQsICByNCwgIHI5ICAgICAgICAgICAgQCB1ID0gcDAgKyBGaWx0ZXIyCisgICAgICAgIHFzdWI4ICAgICAgICAgICByNSwgIHI1LCAgcjMgICAgICAgICAgICBAIHUgPSBxMCAtIEZpbHRlcjEKKyAgICAgICAgZW9yICAgICAgICAgICAgIHI0LCAgcjQsICByMiAgICAgICAgICAgIEAgKm9wMCA9IHUgXiAweDgwCisgICAgICAgIGVvciAgICAgICAgICAgICByNSwgIHI1LCAgcjIgICAgICAgICAgICBAICpvcTAgPSB1IF4gMHg4MAorLmVuZG0KKworQCB2b2lkIHZwOF92X2xvb3BfZmlsdGVyMTZfc2ltcGxlKHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGZsaW0pCitmdW5jdGlvbiBmZl92cDhfdl9sb29wX2ZpbHRlcjE2X3NpbXBsZV9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTEsIGxyfQorCisgICAgICAgIG9yciAgICAgICAgICAgICByMiwgIHIyLCAgcjIsICBsc2wgIzE2CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTEsICM0CisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgICMwCisgICAgICAgIG9yciAgICAgICAgICAgICByMTIsIHIyLCAgcjIsICBsc2wgIzgKKyAgICAgICAgbW92MzIgICAgICAgICAgIHIyLCAgMHg4MDgwODA4MAorMToKKyAgICAgICAgbGRyX25yZWcgICAgICAgIHIzLCAgcjAsICByMSwgIGxzbCAjMSAgIEAgcDEKKyAgICAgICAgbGRyX25yZWcgICAgICAgIHI0LCAgcjAsICByMSAgICAgICAgICAgIEAgcDAKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI1LCAgW3IwXSAgICAgICAgICAgICAgIEAgcTAKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3IwLCByMV0gICAgICAgICAgIEAgcTEKKyAgICAgICAgc2ltcGxlX2ZpbHRlcgorVCAgICAgICBzdWIgICAgICAgICAgICAgcjcsICByMCwgIHIxCisgICAgICAgIHN0ciAgICAgICAgICAgICByNSwgIFtyMF0gICAgICAgICAgICAgICBAIG9xMAorQSAgICAgICBzdHIgICAgICAgICAgICAgcjQsICBbcjAsIC1yMV0gICAgICAgICAgQCBvcDAKK1QgICAgICAgc3RyICAgICAgICAgICAgIHI0LCAgW3I3XQorMjoKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMSwgcjExLCAjMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM0CisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjExLCBwY30KK2VuZGZ1bmMKKworLm1hY3JvICBmaWx0ZXJfbWFza19wCisgICAgICAgIHVxc3ViOCAgICAgICAgICByNiwgIHI5LCAgcjEwICAgICAgICAgICBAIHAzIC0gcDIKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI3LCAgcjEwLCByOSAgICAgICAgICAgIEAgcDIgLSBwMworICAgICAgICB1cXN1YjggICAgICAgICAgcjgsICByMTAsIHIxMSAgICAgICAgICAgQCBwMiAtIHAxCisgICAgICAgIHVxc3ViOCAgICAgICAgICByMTAsIHIxMSwgcjEwICAgICAgICAgICBAIHAxIC0gcDIKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI2LCAgcjYsICByNyAgICAgICAgICAgIEAgYWJzKHAzLXAyKQorICAgICAgICBvcnIgICAgICAgICAgICAgcjgsICByOCwgIHIxMCAgICAgICAgICAgQCBhYnMocDItcDEpCisgICAgICAgIHVxc3ViOCAgICAgICAgICBsciwgIHI2LCAgcjIgICAgICAgICAgICBAIGNvbXBhcmUgdG8gbGltaXQKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI4LCAgcjgsICByMiAgICAgICAgICAgIEAgY29tcGFyZSB0byBsaW1pdAorICAgICAgICB1cXN1YjggICAgICAgICAgcjYsICByMTEsIHIxMiAgICAgICAgICAgQCBwMSAtIHAwCisgICAgICAgIG9yciAgICAgICAgICAgICBsciwgIGxyLCAgcjgKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI3LCAgcjEyLCByMTEgICAgICAgICAgIEAgcDAgLSBwMQorICAgICAgICBvcnIgICAgICAgICAgICAgcjYsICByNiwgIHI3ICAgICAgICAgICAgQCBhYnMocDEtcDApCisgICAgICAgIHVxc3ViOCAgICAgICAgICByNywgIHI2LCAgcjIgICAgICAgICAgICBAIGNvbXBhcmUgdG8gbGltaXQKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI4LCAgcjYsICByMyAgICAgICAgICAgIEAgY29tcGFyZSB0byB0aHJlc2gKKyAgICAgICAgb3JyICAgICAgICAgICAgIGxyLCAgbHIsICByNworLmVuZG0KKworLm1hY3JvIGZpbHRlcl9tYXNrX3BxCisgICAgICAgIHVxc3ViOCAgICAgICAgICByNiwgIHIxMSwgcjEwICAgICAgICAgICBAIHAxIC0gcTEKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI3LCAgcjEwLCByMTEgICAgICAgICAgIEAgcTEgLSBwMQorICAgICAgICB1cXN1YjggICAgICAgICAgcjExLCByMTIsIHI5ICAgICAgICAgICAgQCBwMCAtIHEwCisgICAgICAgIHVxc3ViOCAgICAgICAgICByMTIsIHI5LCAgcjEyICAgICAgICAgICBAIHEwIC0gcDAKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI2LCAgcjYsICByNyAgICAgICAgICAgIEAgYWJzKHAxLXExKQorICAgICAgICBvcnIgICAgICAgICAgICAgcjEyLCByMTEsIHIxMiAgICAgICAgICAgQCBhYnMocDAtcTApCisgICAgICAgIG1vdjMyICAgICAgICAgICByNywgIDB4N2Y3ZjdmN2YKKyAgICAgICAgdXFhZGQ4ICAgICAgICAgIHIxMiwgcjEyLCByMTIgICAgICAgICAgIEAgYWJzKHAwLXEwKSAqIDIKKyAgICAgICAgYW5kICAgICAgICAgICAgIHI2LCAgcjcsICByNiwgIGxzciAjMSAgIEAgYWJzKHAxLXExKSAvIDIKKyAgICAgICAgdXFhZGQ4ICAgICAgICAgIHIxMiwgcjEyLCByNiAgICAgICAgICAgIEAgYWJzKHAwLXEwKSAqIDIgKyBhYnMocDEtcTEpLzIKKy5lbmRtCisKKy5tYWNybyAgZmlsdGVyX21hc2tfdgorICAgICAgICBmaWx0ZXJfbWFza19wCisKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMCwgW3IwLCByMV0gICAgICAgICAgIEAgcTEKKyAgICAgICAgbGRyX3Bvc3QgICAgICAgIHI5LCAgcjAsICByMSwgIGxzbCAjMSAgIEAgcTAKKworICAgICAgICBmaWx0ZXJfbWFza19wcQorCisgICAgICAgIGxkciAgICAgICAgICAgICByMTEsIFtyMF0gICAgICAgICAgICAgICBAIHEyCisKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI3LCAgcjksICByMTAgICAgICAgICAgIEAgcTAgLSBxMQorICAgICAgICB1cXN1YjggICAgICAgICAgcjYsICByMTAsIHI5ICAgICAgICAgICAgQCBxMSAtIHEwCisgICAgICAgIHVxc3ViOCAgICAgICAgICByMTIsIHIxMiwgcjQgICAgICAgICAgICBAIGNvbXBhcmUgdG8gZmxpbWl0CisgICAgICAgIHVxc3ViOCAgICAgICAgICByOSwgIHIxMSwgcjEwICAgICAgICAgICBAIHEyIC0gcTEKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHIxMCwgcjEwLCByMTEgICAgICAgICAgIEAgcTEgLSBxMgorICAgICAgICBvcnIgICAgICAgICAgICAgbHIsICBsciwgIHIxMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbcjAsIHIxXSAgICAgICAgICAgQCBxMworICAgICAgICBvcnIgICAgICAgICAgICAgcjYsICByNywgIHI2ICAgICAgICAgICAgQCBhYnMocTEtcTApCisgICAgICAgIG9yciAgICAgICAgICAgICByMTAsIHI5LCAgcjEwICAgICAgICAgICBAIGFicyhxMi1xMSkKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI5LCAgcjEyLCByMTEgICAgICAgICAgIEAgcTMgLSBxMgorICAgICAgICB1cXN1YjggICAgICAgICAgcjExLCByMTEsIHIxMiAgICAgICAgICAgQCBxMiAtIHEzCisgICAgICAgIHVxc3ViOCAgICAgICAgICByNywgIHI2LCAgcjIgICAgICAgICAgICBAIGNvbXBhcmUgdG8gbGltaXQKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHIxMCwgcjEwLCByMiAgICAgICAgICAgIEAgY29tcGFyZSB0byBsaW1pdAorICAgICAgICB1cXN1YjggICAgICAgICAgcjYsICByNiwgIHIzICAgICAgICAgICAgQCBjb21wYXJlIHRvIHRocmVzaAorICAgICAgICBvcnIgICAgICAgICAgICAgcjksICByOSwgIHIxMSAgICAgICAgICAgQCBhYnMocTMtcTIpCisgICAgICAgIG9yciAgICAgICAgICAgICBsciwgIGxyLCAgcjcKKyAgICAgICAgb3JyICAgICAgICAgICAgIGxyLCAgbHIsICByMTAKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI5LCAgcjksICByMiAgICAgICAgICAgIEAgY29tcGFyZSB0byBsaW1pdAorICAgICAgICBvcnIgICAgICAgICAgICAgbHIsICBsciwgIHI5CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzAKKyAgICAgICAgdXN1YjggICAgICAgICAgIGxyLCAgcjEyLCBscgorICAgICAgICBtdm4gICAgICAgICAgICAgcjExLCAjMAorICAgICAgICBzZWwgICAgICAgICAgICAgbHIsICByMTEsIHIxMiAgICAgICAgICAgQCBmaWx0ZXIgbWFzaworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCAgbHNsICMxCisuZW5kbQorCisubWFjcm8gIGZpbHRlcl9tYXNrX2gKKyAgICAgICAgdHJhbnNwb3NlICAgICAgIHIxMiwgcjExLCByMTAsIHI5LCAgcjYsICByNywgIHI4LCAgbHIKKworICAgICAgICBmaWx0ZXJfbWFza19wCisKKyAgICAgICAgc3RtICAgICAgICAgICAgIHNwLCAge3I4LCByMTEsIHIxMiwgbHJ9CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsICBsc2wgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjNAorCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMCwgcjFdCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByNiwgIHIwLCAgcjEsICBsc2wgIzEKKyAgICAgICAgbGRyICAgICAgICAgICAgIGxyLCAgW3IwLCByMV0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI4LCAgW3IwXQorCisgICAgICAgIHRyYW5zcG9zZSAgICAgICByMTIsIHIxMSwgcjEwLCByOSwgIHI2LCAgcjcsICByOCwgIGxyCisKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI4LCAgcjEyLCByMTEgICAgICAgICAgIEAgcTMgLSBxMgorICAgICAgICB1cXN1YjggICAgICAgICAgbHIsICByMTEsIHIxMiAgICAgICAgICAgQCBxMiAtIHEzCisgICAgICAgIHVxc3ViOCAgICAgICAgICByNywgIHI5LCAgcjEwICAgICAgICAgICBAIHEwIC0gcTEKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI2LCAgcjEwLCByOSAgICAgICAgICAgIEAgcTEgLSBxMAorICAgICAgICB1cXN1YjggICAgICAgICAgcjEyLCByMTEsIHIxMCAgICAgICAgICAgQCBxMiAtIHExCisgICAgICAgIHVxc3ViOCAgICAgICAgICByMTEsIHIxMCwgcjExICAgICAgICAgICBAIHExIC0gcTIKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI4LCAgcjgsICBsciAgICAgICAgICAgIEAgYWJzKHEzLXEyKQorICAgICAgICBvcnIgICAgICAgICAgICAgcjYsICByNywgIHI2ICAgICAgICAgICAgQCBhYnMocTEtcTApCisgICAgICAgIG9yciAgICAgICAgICAgICByMTEsIHIxMiwgcjExICAgICAgICAgICBAIGFicyhxMi1xMSkKKyAgICAgICAgbGRyICAgICAgICAgICAgIGxyLCAgW3NwLCAjMTJdICAgICAgICAgIEAgbG9hZCBiYWNrIChmKWxpbWl0IGFjY3VtdWxhdG9yCisgICAgICAgIHVxc3ViOCAgICAgICAgICByOCwgIHI4LCAgcjIgICAgICAgICAgICBAIGNvbXBhcmUgdG8gbGltaXQKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI3LCAgcjYsICByMiAgICAgICAgICAgIEAgY29tcGFyZSB0byBsaW1pdAorICAgICAgICB1cXN1YjggICAgICAgICAgcjExLCByMTEsIHIyICAgICAgICAgICAgQCBjb21wYXJlIHRvIGxpbWl0CisgICAgICAgIG9yciAgICAgICAgICAgICBsciwgIGxyLCAgcjgKKyAgICAgICAgdXFzdWI4ICAgICAgICAgIHI4LCAgcjYsICByMyAgICAgICAgICAgIEAgY29tcGFyZSB0byB0aHJlc2gKKyAgICAgICAgb3JyICAgICAgICAgICAgIGxyLCAgbHIsICByNworICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM4XSAgICAgICAgICAgQCBwMQorICAgICAgICBvcnIgICAgICAgICAgICAgbHIsICBsciwgIHIxMQorCisgICAgICAgIGxkciAgICAgICAgICAgICByMTEsIFtzcCwgIzRdICAgICAgICAgICBAIHAwCisKKyAgICAgICAgZmlsdGVyX21hc2tfcHEKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjEwLCAjMAorICAgICAgICB1cXN1YjggICAgICAgICAgcjEyLCByMTIsIHI0ICAgICAgICAgICAgQCBjb21wYXJlIHRvIGZsaW1pdAorICAgICAgICBtdm4gICAgICAgICAgICAgcjExLCAjMAorICAgICAgICBvcnIgICAgICAgICAgICAgbHIsICBsciwgIHIxMgorICAgICAgICB1c3ViOCAgICAgICAgICAgbHIsICByMTAsIGxyCisgICAgICAgIHNlbCAgICAgICAgICAgICBsciwgIHIxMSwgcjEwICAgICAgICAgICBAIGZpbHRlciBtYXNrCisuZW5kbQorCisubWFjcm8gIGZpbHRlciAgICAgICAgICBpbm5lcgorICAgICAgICBtb3YzMiAgICAgICAgICAgcjEyLCAweDgwODA4MDgwCisgICAgICAgIGVvciAgICAgICAgICAgICByMTEsIHI3LCAgcjEyICAgICAgICAgICBAIHBzMQorICAgICAgICBlb3IgICAgICAgICAgICAgcjgsICByOCwgIHIxMiAgICAgICAgICAgQCBwczAKKyAgICAgICAgZW9yICAgICAgICAgICAgIHI5LCAgcjksICByMTIgICAgICAgICAgIEAgcXMwCisgICAgICAgIGVvciAgICAgICAgICAgICByMTAsIHIxMCwgcjEyICAgICAgICAgICBAIHFzMQorCisgICAgICAgIHN0bSAgICAgICAgICAgICBzcCwgIHtyOC1yMTF9CisKKyAgICAgICAgcXN1YjggICAgICAgICAgIHI3LCAgcjExLCByMTAgICAgICAgICAgIEAgdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHBzMS1xczEpCisgICAgICAgIHFzdWI4ICAgICAgICAgICByOCwgIHI5LCAgcjggICAgICAgICAgICBAIHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyICsgMyAqICggcXMwIC0gcHMwKSkKKyAgICAuaWYgXGlubmVyCisgICAgICAgIGFuZCAgICAgICAgICAgICByNywgIHI3LCAgcjYgICAgICAgICAgICBAIHZwOF9maWx0ZXIgJj0gaGV2CisgICAgLmVuZGlmCisgICAgICAgIHFhZGQ4ICAgICAgICAgICByNywgIHI3LCAgcjgKKyAgICAgICAgbHNyICAgICAgICAgICAgIHIxMCwgcjEyLCAjNSAgICAgICAgICAgIEAgMHgwNDA0MDQwNAorICAgICAgICBxYWRkOCAgICAgICAgICAgcjcsICByNywgIHI4CisgICAgICAgIHN1YiAgICAgICAgICAgICByOSwgIHIxMCwgcjEyLCBsc3IgIzcgICBAIDB4MDMwMzAzMDMKKyAgICAgICAgcWFkZDggICAgICAgICAgIHI3LCAgcjcsICByOAorCisgICAgICAgIGFuZCAgICAgICAgICAgICByNywgIHI3LCAgbHIgICAgICAgICAgICBAIHZwOF9maWx0ZXIgJj0gbWFzaworICAgIC5pZiAhXGlubmVyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsIHI3ICAgICAgICAgICAgICAgICBAIEZpbHRlcjIKKyAgICAgICAgYW5kICAgICAgICAgICAgIHI3LCAgcjcsICByNiAgICAgICAgICAgIEAgRmlsdGVyMiAmPSBoZXYKKyAgICAuZW5kaWYKKyAgICAgICAgcWFkZDggICAgICAgICAgIGxyLCAgcjcsICByOSAgICAgICAgICAgIEAgRmlsdGVyMiA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCh2cDhfZmlsdGVyKzMpCisgICAgICAgIHFhZGQ4ICAgICAgICAgICByNywgIHI3LCAgcjEwICAgICAgICAgICBAIEZpbHRlcjEgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAodnA4X2ZpbHRlcis0KQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByOSwgICMwCisgICAgICAgIHNoYWRkOCAgICAgICAgICBsciwgIGxyLCAgcjkgICAgICAgICAgICBAIEZpbHRlcjIgPj49IDMKKyAgICAgICAgc2hhZGQ4ICAgICAgICAgIHI3LCAgcjcsICByOSAgICAgICAgICAgIEAgRmlsdGVyMSA+Pj0gMworICAgICAgICBzaGFkZDggICAgICAgICAgbHIsICBsciwgIHI5CisgICAgICAgIHNoYWRkOCAgICAgICAgICByNywgIHI3LCAgcjkKKyAgICAgICAgc2hhZGQ4ICAgICAgICAgIGxyLCAgbHIsICByOSAgICAgICAgICAgIEAgRmlsdGVyMgorICAgICAgICBzaGFkZDggICAgICAgICAgcjcsICByNywgIHI5ICAgICAgICAgICAgQCBGaWx0ZXIxCisuZW5kbQorCisubWFjcm8gIGZpbHRlcl92ICAgICAgICBpbm5lcgorICAgICAgICBvcnIgICAgICAgICAgICAgcjEwLCByNiwgIHI4ICAgICAgICAgICAgQCBjYWxjdWxhdGUgdnA4X2hldm1hc2sKKyAgICAgICAgbGRyX25yZWcgICAgICAgIHI3LCAgcjAsICByMSwgIGxzbCAjMSAgIEAgcDEKKyAgICAgICAgdXN1YjggICAgICAgICAgIHIxMCwgcjEyLCByMTAKKyAgICAgICAgbGRyX25yZWcgICAgICAgIHI4LCAgcjAsICByMSAgICAgICAgICAgIEAgcDAKKyAgICAgICAgc2VsICAgICAgICAgICAgIHI2LCAgcjEyLCByMTEgICAgICAgICAgIEAgb2J0YWluIHZwOF9oZXZtYXNrCisgICAgICAgIGxkciAgICAgICAgICAgICByOSwgIFtyMF0gICAgICAgICAgICAgICBAIHEwCisgICAgICAgIGxkciAgICAgICAgICAgICByMTAsIFtyMCwgcjFdICAgICAgICAgICBAIHExCisgICAgICAgIGZpbHRlciAgICAgICAgICBcaW5uZXIKKy5lbmRtCisKKy5tYWNybyAgZmlsdGVyX2ggICAgICAgIGlubmVyCisgICAgICAgIG9yciAgICAgICAgICAgICByOSwgIHI2LCAgcjgKKyAgICAgICAgdXN1YjggICAgICAgICAgIHI5LCAgcjEyLCByOQorICAgICAgICBzZWwgICAgICAgICAgICAgcjYsICByMTIsIHIxMSAgICAgICAgICAgQCBoZXYgbWFzaworCisgICAgICAgIHN0bSAgICAgICAgICAgICBzcCwgIHtyNiwgbHJ9CisKKyAgICAgICAgbGRyX25yZWcgICAgICAgIHIxMiwgcjAsICByMSwgIGxzbCAjMQorICAgICAgICBsZHJfbnJlZyAgICAgICAgcjExLCByMCwgIHIxCisgICAgICAgIGxkciAgICAgICAgICAgICByNiwgIFtyMF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIGxyLCAgW3IwLCByMV0KKworICAgICAgICB0cmFuc3Bvc2UgICAgICAgcjEwLCByOSwgIHI4LCAgcjcsICByMTIsIHIxMSwgcjYsICBscgorCisgICAgICAgIGxkbSAgICAgICAgICAgICBzcCwgIHtyNiwgbHJ9CisgICAgICAgIGZpbHRlciAgICAgICAgICBcaW5uZXIKKy5lbmRtCisKKy5tYWNybyAgZmlsdGVyX2lubmVyCisgICAgICAgIGxkbSAgICAgICAgICAgICBzcCwgIHtyOCwgcjl9CisgICAgICAgIGxzciAgICAgICAgICAgICByMTAsIHIxMCwgIzIgICAgICAgICAgICBAIDB4MDEwMTAxMDEKKyAgICAgICAgcWFkZDggICAgICAgICAgIHI4LCAgcjgsICBsciAgICAgICAgICAgIEAgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcChwczAgKyBGaWx0ZXIyKQorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICAjMAorICAgICAgICBxc3ViOCAgICAgICAgICAgcjksICByOSwgIHI3ICAgICAgICAgICAgQCB1ID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIEZpbHRlcjEpCisgICAgICAgIHNhZGQ4ICAgICAgICAgICByNywgIHI3LCAgcjEwICAgICAgICAgICBAIHZwOF9maWx0ZXIgKz0gMQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEwLCBbc3AsICM4XSAgICAgICAgICAgQCBxczEKKyAgICAgICAgc2hhZGQ4ICAgICAgICAgIHI3LCAgcjcsICBsciAgICAgICAgICAgIEAgdnA4X2ZpbHRlciA+Pj0gMQorICAgICAgICBlb3IgICAgICAgICAgICAgcjgsICByOCwgIHIxMiAgICAgICAgICAgQCAqb3AwID0gdSBeIDB4ODAKKyAgICAgICAgYmljICAgICAgICAgICAgIHI3LCAgcjcsICByNiAgICAgICAgICAgIEAgdnA4X2ZpbHRlciAmPSB+aGV2CisgICAgICAgIHFhZGQ4ICAgICAgICAgICByMTEsIHIxMSwgcjcgICAgICAgICAgICBAIHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMxICsgdnA4X2ZpbHRlcikKKyAgICAgICAgZW9yICAgICAgICAgICAgIHI5LCAgcjksICByMTIgICAgICAgICAgIEAgKm9xMCA9IHUgXiAweDgwCisgICAgICAgIHFzdWI4ICAgICAgICAgICByMTAsIHIxMCwgcjcgICAgICAgICAgICBAIHUgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocXMxIC0gdnA4X2ZpbHRlcikKKyAgICAgICAgZW9yICAgICAgICAgICAgIHIxMSwgcjExLCByMTIgICAgICAgICAgIEAgKm9wMSA9IHUgXiAweDgwCisgICAgICAgIGVvciAgICAgICAgICAgICByMTAsIHIxMCwgcjEyICAgICAgICAgICBAICpvcTEgPSB1IF4gMHg4MAorLmVuZG0KKworLm1hY3JvICBmaWx0ZXJfeCAgICAgICAgYzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgXGMwCisgICAgICAgIG1vdiAgICAgICAgICAgICByNywgICM2MworCisgICAgICAgIHN4dGIxNiAgICAgICAgICByNiwgIHIxMgorICAgICAgICBzeHRiMTYgICAgICAgICAgcjEwLCByMTIsIHJvciAjOAorICAgICAgICBzbWxhYmIgICAgICAgICAgcjgsICByNiwgIGxyLCAgcjcKKyAgICAgICAgc21sYXRiICAgICAgICAgIHI2LCAgcjYsICBsciwgIHI3CisgICAgICAgIHNtbGFiYiAgICAgICAgICByNywgIHIxMCwgbHIsICByNworICAgICAgICBzbXVsdGIgICAgICAgICAgcjEwLCByMTAsIGxyCisgICAgICAgIHNzYXQgICAgICAgICAgICByOCwgICM4LCAgcjgsICBhc3IgIzcKKyAgICAgICAgc3NhdCAgICAgICAgICAgIHI2LCAgIzgsICByNiwgIGFzciAjNworICAgICAgICBhZGQgICAgICAgICAgICAgcjEwLCByMTAsICM2MworICAgICAgICBzc2F0ICAgICAgICAgICAgcjcsICAjOCwgIHI3LCAgYXNyICM3CisgICAgICAgIHNzYXQgICAgICAgICAgICByMTAsICM4LCAgcjEwLCBhc3IgIzcKKworICAgICAgICBwa2hidCAgICAgICAgICAgcjYsICByOCwgIHI2LCAgbHNsICMxNgorICAgICAgICBwa2hidCAgICAgICAgICAgcjEwLCByNywgIHIxMCwgbHNsICMxNgorICAgICAgICB1eHRiMTYgICAgICAgICAgcjYsICByNgorICAgICAgICB1eHRiMTYgICAgICAgICAgcjEwLCByMTAKKworICAgICAgICBtb3YzMiAgICAgICAgICAgbHIsICAweDgwODA4MDgwCisKKyAgICAgICAgb3JyICAgICAgICAgICAgIHIxMCwgcjYsICByMTAsIGxzbCAjOCAgIEAgdSA9IHZwOF9zaWduZWRfY2hhcl9jbGFtcCgoNjMgKyBGaWx0ZXIyICogMjcpPj43KQorICAgICAgICBxc3ViOCAgICAgICAgICAgcjgsICByOSwgIHIxMCAgICAgICAgICAgQCBzID0gdnA4X3NpZ25lZF9jaGFyX2NsYW1wKHFzMCAtIHUpCisgICAgICAgIHFhZGQ4ICAgICAgICAgICByMTAsIHIxMSwgcjEwICAgICAgICAgICBAIHMgPSB2cDhfc2lnbmVkX2NoYXJfY2xhbXAocHMwICsgdSkKKyAgICAgICAgZW9yICAgICAgICAgICAgIHI4LCAgcjgsICBsciAgICAgICAgICAgIEAgKm9xMCA9IHMgXiAweDgwCisgICAgICAgIGVvciAgICAgICAgICAgICByMTAsIHIxMCwgbHIgICAgICAgICAgICBAICpvcDAgPSBzIF4gMHg4MAorLmVuZG0KKworLm1hY3JvICBmaWx0ZXJfMQorICAgICAgICBsZG0gICAgICAgICAgICAgc3AsICB7cjgsIHI5fQorICAgICAgICBxYWRkOCAgICAgICAgICAgcjExLCByOCwgIGxyCisgICAgICAgIHFzdWI4ICAgICAgICAgICByOSwgIHI5LCAgcjcKKyAgICAgICAgYmljICAgICAgICAgICAgIHIxMiwgcjEyLCByNiAgICAgICAgICAgIEAgdnA4X2ZpbHRlciAmPSB+aGV2CisgICAgICAgIGZpbHRlcl94ICAgICAgICAjMjcKKy5lbmRtCisKKy5tYWNybyAgZmlsdGVyXzIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgIFtzcCwgIzhdICAgICAgICAgIEAgcXMxCisgICAgICAgIGxkciAgICAgICAgICAgICByMTEsICBbc3AsICMxMl0gICAgICAgICBAIHBzMQorICAgICAgICBmaWx0ZXJfeCAgICAgICAgIzE4CisuZW5kbQorCisubWFjcm8gIGZpbHRlcl8zCisgICAgICAgIGVvciAgICAgICAgICAgICByOSwgIHI5LCAgbHIKKyAgICAgICAgZW9yICAgICAgICAgICAgIHIxMSwgcjExLCBscgorICAgICAgICBmaWx0ZXJfeCAgICAgICAgIzkKKy5lbmRtCisKK2Z1bmN0aW9uIHZwOF92X2xvb3BfZmlsdGVyX2lubmVyX2FybXY2CisgICAgICAgIG1vdiAgICAgICAgICAgICByNSwgICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzE2CisKKyAgICAgICAgb3JyICAgICAgICAgICAgIHIyLCAgcjIsICByMiwgIGxzbCAjMTYKKyAgICAgICAgb3JyICAgICAgICAgICAgIHIzLCAgcjMsICByMywgIGxzbCAjMTYKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI2LCAgcjYsICByNiwgIGxzbCAjMTYKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI0LCAgcjIsICByMiwgIGxzbCAjOCAgIEAgZmxpbUUKKyAgICAgICAgb3JyICAgICAgICAgICAgIHIyLCAgcjMsICByMywgIGxzbCAjOCAgIEAgZmxpbUkKKyAgICAgICAgb3JyICAgICAgICAgICAgIHIzLCAgcjYsICByNiwgIGxzbCAjOCAgIEAgdGhyZXNoCisxOgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCAgbHNsICMyCisgICAgICAgIGxkciAgICAgICAgICAgICByMTAsIFtyMCwgcjFdICAgICAgICAgICBAIHAyCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByOSwgIHIwLCAgcjEsICBsc2wgIzEgICBAIHAzCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtyMCwgcjFdICAgICAgICAgICBAIHAwCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByMTEsIHIwLCAgcjEsICBsc2wgIzEgICBAIHAxCisKKyAgICAgICAgZmlsdGVyX21hc2tfdgorICAgICAgICBjbXAgICAgICAgICAgICAgbHIsICAjMAorICAgICAgICBiZXEgICAgICAgICAgICAgMmYKKyAgICAgICAgZmlsdGVyX3YgICAgICAgIGlubmVyPTEKKyAgICAgICAgZmlsdGVyX2lubmVyCisKK0EgICAgICAgc3RyICAgICAgICAgICAgIHIxMSwgW3IwLCAtcjEsIGxzbCAjMV0gIEAgb3AxCitBICAgICAgIHN0ciAgICAgICAgICAgICByOCwgIFtyMCwgLXIxXSAgICAgICAgICBAIG9wMAorVCAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCAgbHNsICMxCitUICAgICAgIHN0ciAgICAgICAgICAgICByOCwgIFtyMCwgcjFdCitUICAgICAgIHN0cl9wb3N0ICAgICAgICByMTEsIHIwLCAgcjEsICBsc2wgIzEKKyAgICAgICAgc3RyICAgICAgICAgICAgIHI5LCAgW3IwXSAgICAgICAgICAgICAgIEAgb3EwCisgICAgICAgIHN0ciAgICAgICAgICAgICByMTAsIFtyMCwgcjFdICAgICAgICAgICBAIG9xMQorMjoKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjNAorICAgICAgICBjbXAgICAgICAgICAgICAgcjUsICAjMworICAgICAgICBpdCAgICAgICAgICAgICAgZXEKKyAgICAgICAgbGRyZXEgICAgICAgICAgIHIwLCAgW3NwLCAjMTZdCisgICAgICAgIHN1YnMgICAgICAgICAgICByNSwgIHI1LCAgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjMTYKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyMCwgcjQtcjExLCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA4X3ZfbG9vcF9maWx0ZXIxNl9pbm5lcl9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTEsIGxyfQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMCwgICM4CisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEyfQorICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbc3AsICM0MF0KKyAgICAgICAgb3JyICAgICAgICAgICAgIHIyLCAgcjIsICByMiwgIGxzbCAjMTYKKyAgICAgICAgYiAgICAgICAgICAgICAgIHZwOF92X2xvb3BfZmlsdGVyX2lubmVyX2FybXY2CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOF92X2xvb3BfZmlsdGVyOHV2X2lubmVyX2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3IxLCByNC1yMTEsIGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByMgorICAgICAgICBvcnIgICAgICAgICAgICAgcjIsICByMywgIHIzLCAgbHNsICMxNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbc3AsICM0MF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3NwLCAjNDRdCisgICAgICAgIGIgICAgICAgICAgICAgICB2cDhfdl9sb29wX2ZpbHRlcl9pbm5lcl9hcm12NgorZW5kZnVuYworCitmdW5jdGlvbiB2cDhfdl9sb29wX2ZpbHRlcl9hcm12NgorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICAjNAorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMxNgorCisgICAgICAgIG9yciAgICAgICAgICAgICByMywgIHIzLCAgcjMsICBsc2wgIzE2CisgICAgICAgIG9yciAgICAgICAgICAgICByNiwgIHI2LCAgcjYsICBsc2wgIzE2CisgICAgICAgIG9yciAgICAgICAgICAgICByNCwgIHIyLCAgcjIsICBsc2wgIzggICBAIGZsaW1FCisgICAgICAgIG9yciAgICAgICAgICAgICByMiwgIHIzLCAgcjMsICBsc2wgIzggICBAIGZsaW1JCisgICAgICAgIG9yciAgICAgICAgICAgICByMywgIHI2LCAgcjYsICBsc2wgIzggICBAIHRocmVzaAorMToKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgIGxzbCAjMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEwLCBbcjAsIHIxXSAgICAgICAgICAgQCBwMgorICAgICAgICBsZHJfcG9zdCAgICAgICAgcjksICByMCwgIHIxLCAgbHNsICMxICAgQCBwMworICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbcjAsIHIxXSAgICAgICAgICAgQCBwMAorICAgICAgICBsZHJfcG9zdCAgICAgICAgcjExLCByMCwgIHIxLCAgbHNsICMxICAgQCBwMQorCisgICAgICAgIGZpbHRlcl9tYXNrX3YKKyAgICAgICAgY21wICAgICAgICAgICAgIGxyLCAgIzAKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisKKyAgICAgICAgZmlsdGVyX3YgICAgICAgIGlubmVyPTAKKyAgICAgICAgZmlsdGVyXzEKKworICAgICAgICBzdHIgICAgICAgICAgICAgcjgsICBbcjBdICAgICAgICAgICAgICAgQCAqb3EwCitBICAgICAgIHN0ciAgICAgICAgICAgICByMTAsIFtyMCwgLXIxXSAgICAgICAgICBAICpvcDAKK1QgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgIGxzbCAjMQorVCAgICAgICBzdHIgICAgICAgICAgICAgcjEwLCBbcjAsIHIxXQorCisgICAgICAgIGZpbHRlcl8yCisKK0EgICAgICAgc3RyICAgICAgICAgICAgIHIxMCwgW3IwLCAtcjEsIGxzbCAjMV0gIEAgKm9wMQorVCAgICAgICBzdHJfcG9zdCAgICAgICAgcjEwLCByMCwgIHIxLCAgbHNsICMxCisgICAgICAgIHN0ciAgICAgICAgICAgICByOCwgIFtyMCwgcjFdICAgICAgICAgICBAICpvcTEKKworICAgICAgICBsZHIgICAgICAgICAgICAgcjksICBbcjAsIHIxLCAgbHNsICMxXSAgQCBxMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIxCitBICAgICAgIGxkciAgICAgICAgICAgICByMTEsIFtyMCwgLXIxLCBsc2wgIzJdICBAIHAyCitUICAgICAgIGxkcl9kcHJlICAgICAgICByMTEsIHIwLCAgcjEsICBsc2wgIzIKKworICAgICAgICBmaWx0ZXJfMworCitBICAgICAgIHN0ciAgICAgICAgICAgICByMTAsIFtyMCwgLXIxLCBsc2wgIzJdICBAICpvcDIKK1QgICAgICAgc3RyX3Bvc3QgICAgICAgIHIxMCwgcjAsICByMSwgIGxzbCAjMgorICAgICAgICBzdHIgICAgICAgICAgICAgcjgsICBbcjAsIHIxXSAgICAgICAgICAgQCAqb3EyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEKKzI6CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzQKKyAgICAgICAgY21wICAgICAgICAgICAgIHI1LCAgIzMKKyAgICAgICAgaXQgICAgICAgICAgICAgIGVxCisgICAgICAgIGxkcmVxICAgICAgICAgICByMCwgIFtzcCwgIzE2XQorICAgICAgICBzdWJzICAgICAgICAgICAgcjUsICByNSwgICMxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzE2CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjAsIHI0LXIxMSwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOF92X2xvb3BfZmlsdGVyMTZfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjExLCBscn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjAsICAjOAorICAgICAgICBwdXNoICAgICAgICAgICAge3IxMn0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3NwLCAjNDBdCisgICAgICAgIG9yciAgICAgICAgICAgICByMiwgIHIyLCAgcjIsICBsc2wgIzE2CisgICAgICAgIGIgICAgICAgICAgICAgICB2cDhfdl9sb29wX2ZpbHRlcl9hcm12NgorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDhfdl9sb29wX2ZpbHRlcjh1dl9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMSwgcjQtcjExLCBscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgcjIKKyAgICAgICAgb3JyICAgICAgICAgICAgIHIyLCAgcjMsICByMywgIGxzbCAjMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIzLCAgW3NwLCAjNDBdCisgICAgICAgIGxkciAgICAgICAgICAgICByNiwgIFtzcCwgIzQ0XQorICAgICAgICBiICAgICAgICAgICAgICAgdnA4X3ZfbG9vcF9maWx0ZXJfYXJtdjYKK2VuZGZ1bmMKKworQCB2b2lkIHZwOF9oX2xvb3BfZmlsdGVyMTZfc2ltcGxlKHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGZsaW0pCitmdW5jdGlvbiBmZl92cDhfaF9sb29wX2ZpbHRlcjE2X3NpbXBsZV9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTEsIGxyfQorICAgICAgICBvcnIgICAgICAgICAgICAgcjEyLCByMiwgIHIyLCAgbHNsICMxNgorICAgICAgICBtb3YzMiAgICAgICAgICAgcjIsICAweDgwODA4MDgwCisgICAgICAgIG9yciAgICAgICAgICAgICByMTIsIHIxMiwgcjEyLCBsc2wgIzgKKworICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICAjMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjExLCAjNAorMToKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjgsICBbcjAsIHIxXQorICAgICAgICBsZHJfcG9zdCAgICAgICAgcjcsICByMCwgIHIxLCAgbHNsICMxCisgICAgICAgIGxkciAgICAgICAgICAgICByMTAsIFtyMCwgcjFdCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByOSwgIHIwLCAgcjEsICBsc2wgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjMgorICAgICAgICB0cmFuc3Bvc2UgICAgICAgcjYsICByNSwgIHI0LCAgcjMsICByNywgIHI4LCAgcjksICByMTAKKyAgICAgICAgc2ltcGxlX2ZpbHRlcgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCAgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgIzEKKworICAgICAgICB1eHRiMTYgICAgICAgICAgcjYsICByNAorICAgICAgICB1eHRiMTYgICAgICAgICAgcjgsICByNQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjcsICByNCwgIHJvciAjOAorICAgICAgICB1eHRiMTYgICAgICAgICAgcjksICByNSwgIHJvciAjOAorICAgICAgICBvcnIgICAgICAgICAgICAgcjYsICByNiwgIHI4LCAgbHNsICM4CisgICAgICAgIG9yciAgICAgICAgICAgICByNywgIHI3LCAgcjksICBsc2wgIzgKKyAgICAgICAgbHNyICAgICAgICAgICAgIHI0LCAgcjYsICAjMTYKKyAgICAgICAgbHNyICAgICAgICAgICAgIHI1LCAgcjcsICAjMTYKKworICAgICAgICBzdHJoX3Bvc3QgICAgICAgcjYsICByMCwgIHIxCisgICAgICAgIHN0cmhfcG9zdCAgICAgICByNywgIHIwLCAgcjEKKyAgICAgICAgc3RyaF9wb3N0ICAgICAgIHI0LCAgcjAsICByMQorICAgICAgICBzdHJoX3Bvc3QgICAgICAgcjUsICByMCwgIHIxCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzEKKzI6CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTEsIHIxMSwgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTEsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiB2cDhfaF9sb29wX2ZpbHRlcl9pbm5lcl9hcm12NgorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICAjNAorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMxNgorCisgICAgICAgIG9yciAgICAgICAgICAgICByMywgIHIzLCAgcjMsICBsc2wgIzE2CisgICAgICAgIG9yciAgICAgICAgICAgICByOSwgIHI5LCAgcjksICBsc2wgIzE2CisgICAgICAgIG9yciAgICAgICAgICAgICByNCwgIHIyLCAgcjIsICBsc2wgIzggICBAIGZsaW1FCisgICAgICAgIG9yciAgICAgICAgICAgICByMiwgIHIzLCAgcjMsICBsc2wgIzggICBAIGZsaW1JCisgICAgICAgIG9yciAgICAgICAgICAgICByMywgIHI5LCAgcjksICBsc2wgIzggICBAIHRocmVzaAorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgICM0CisxOgorICAgICAgICBsZHIgICAgICAgICAgICAgcjcsICBbcjAsIHIxXQorICAgICAgICBsZHJfcG9zdCAgICAgICAgcjYsICByMCwgIHIxLCAgbHNsICMxCisgICAgICAgIGxkciAgICAgICAgICAgICBsciwgIFtyMCwgcjFdCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByOCwgIHIwLCAgcjEsICBsc2wgIzEKKworICAgICAgICBmaWx0ZXJfbWFza19oCisKKyAgICAgICAgY21wICAgICAgICAgICAgIGxyLCAgIzAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjMgorICAgICAgICBiZXEgICAgICAgICAgICAgMmYKKworICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbc3BdCisKKyAgICAgICAgZmlsdGVyX2ggICAgICAgIGlubmVyPTEKKyAgICAgICAgZmlsdGVyX2lubmVyCisKKyAgICAgICAgdHJhbnNwb3NlICAgICAgIGxyLCAgcjEyLCByNywgIHI2LCAgcjExLCByOCwgIHI5LCAgcjEwCisKK0EgICAgICAgc3RyICAgICAgICAgICAgIHI2LCAgW3IwLCAtcjEsIGxzbCAjMV0KK0EgICAgICAgc3RyICAgICAgICAgICAgIHI3LCAgW3IwLCAtcjFdCitUICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsICBsc2wgIzEKK1QgICAgICAgc3RyICAgICAgICAgICAgIHI3LCAgW3IwLCByMV0KK1QgICAgICAgc3RyX3Bvc3QgICAgICAgIHI2LCAgcjAsICByMSwgIGxzbCAjMQorICAgICAgICBzdHIgICAgICAgICAgICAgcjEyLCBbcjBdCisgICAgICAgIHN0ciAgICAgICAgICAgICBsciwgIFtyMCwgcjFdCisyOgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjEsICBsc2wgIzEKKyAgICAgICAgY21wICAgICAgICAgICAgIHI1LCAgIzMKKyAgICAgICAgaXQgICAgICAgICAgICAgIGVxCisgICAgICAgIGxkcmVxICAgICAgICAgICByMCwgIFtzcCwgIzE2XQorICAgICAgICBzdWJzICAgICAgICAgICAgcjUsICByNSwgICMxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgc3AsICMxNgorICAgICAgICBwb3AgICAgICAgICAgICAge3IwLCByNC1yMTEsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDhfaF9sb29wX2ZpbHRlcjE2X2lubmVyX2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMSwgbHJ9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIwLCAgcjEsICBsc2wgIzMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBwdXNoICAgICAgICAgICAge3IxMn0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3NwLCAjNDBdCisgICAgICAgIG9yciAgICAgICAgICAgICByMiwgIHIyLCAgcjIsICBsc2wgIzE2CisgICAgICAgIGIgICAgICAgICAgICAgICB2cDhfaF9sb29wX2ZpbHRlcl9pbm5lcl9hcm12NgorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDhfaF9sb29wX2ZpbHRlcjh1dl9pbm5lcl9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjNAorICAgICAgICBwdXNoICAgICAgICAgICAge3IxLCByNC1yMTEsIGxyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByMgorICAgICAgICBvcnIgICAgICAgICAgICAgcjIsICByMywgIHIzLCAgbHNsICMxNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbc3AsICM0MF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3NwLCAjNDRdCisgICAgICAgIGIgICAgICAgICAgICAgICB2cDhfaF9sb29wX2ZpbHRlcl9pbm5lcl9hcm12NgorZW5kZnVuYworCitmdW5jdGlvbiB2cDhfaF9sb29wX2ZpbHRlcl9hcm12NgorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICAjNAorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMxNgorCisgICAgICAgIG9yciAgICAgICAgICAgICByMywgIHIzLCAgcjMsICBsc2wgIzE2CisgICAgICAgIG9yciAgICAgICAgICAgICByOSwgIHI5LCAgcjksICBsc2wgIzE2CisgICAgICAgIG9yciAgICAgICAgICAgICByNCwgIHIyLCAgcjIsICBsc2wgIzggICBAIGZsaW1FCisgICAgICAgIG9yciAgICAgICAgICAgICByMiwgIHIzLCAgcjMsICBsc2wgIzggICBAIGZsaW1JCisgICAgICAgIG9yciAgICAgICAgICAgICByMywgIHI5LCAgcjksICBsc2wgIzggICBAIHRocmVzaAorMToKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjNAorICAgICAgICBsZHIgICAgICAgICAgICAgcjcsICBbcjAsIHIxXQorICAgICAgICBsZHJfcG9zdCAgICAgICAgcjYsICByMCwgIHIxLCAgbHNsICMxCisgICAgICAgIGxkciAgICAgICAgICAgICBsciwgIFtyMCwgcjFdCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByOCwgIHIwLCAgcjEsICBsc2wgIzEKKworICAgICAgICBmaWx0ZXJfbWFza19oCisgICAgICAgIGNtcCAgICAgICAgICAgICBsciwgICMwCisgICAgICAgIGl0ICAgICAgICAgICAgICBlcQorICAgICAgICBhZGRlcSAgICAgICAgICAgcjAsICByMCwgIHIxLCAgbHNsICMxCisgICAgICAgIGJlcSAgICAgICAgICAgICAyZgorCisgICAgICAgIGxkciAgICAgICAgICAgICByNiwgIFtzcF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjMgorCisgICAgICAgIGZpbHRlcl9oICAgICAgICBpbm5lcj0wCisgICAgICAgIGZpbHRlcl8xCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgIGxzbCAjMQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjYsICByMTAKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI3LCAgcjgKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHIxMCwgcjEwLCByb3IgIzgKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI4LCAgcjgsICByb3IgIzgKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI2LCAgcjYsICByNywgIGxzbCAjOAorICAgICAgICBvcnIgICAgICAgICAgICAgcjEwLCByMTAsIHI4LCAgbHNsICM4CisgICAgICAgIGxzciAgICAgICAgICAgICByNywgIHI2LCAgIzE2CisgICAgICAgIGxzciAgICAgICAgICAgICByOCwgIHIxMCwgIzE2CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjMQorICAgICAgICBzdHJoX3Bvc3QgICAgICAgcjYsICByMCwgIHIxCisgICAgICAgIHN0cmhfcG9zdCAgICAgICByMTAsIHIwLCAgcjEKKyAgICAgICAgc3RyaF9wb3N0ICAgICAgIHI3LCAgcjAsICByMQorICAgICAgICBzdHJoX3Bvc3QgICAgICAgcjgsICByMCwgIHIxCisKKyAgICAgICAgZmlsdGVyXzIKKworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCAgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzMKKworICAgICAgICBsZHJiICAgICAgICAgICAgcjExLCBbcjAsICMtNV0gICAgICAgICAgQCBwMiBmb3IgMS83dGggZGlmZmVyZW5jZQorICAgICAgICBzdHJiICAgICAgICAgICAgcjEwLCBbcjAsICMtNF0gICAgICAgICAgQCBvcDEKKyAgICAgICAgc3RyYiAgICAgICAgICAgIHI4LCAgW3IwLCAjLTFdICAgICAgICAgIEAgb3ExCisgICAgICAgIGxkcmJfcG9zdCAgICAgICByOSwgIHIwLCAgcjEgICAgICAgICAgICBAIHEyIGZvciAxLzd0aCBkaWZmZXJlbmNlCisKKyAgICAgICAgbHNyICAgICAgICAgICAgIHIxMCwgcjEwLCAjOAorICAgICAgICBsc3IgICAgICAgICAgICAgcjgsICByOCwgICM4CisKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI2LCAgW3IwLCAjLTVdCisgICAgICAgIHN0cmIgICAgICAgICAgICByMTAsIFtyMCwgIy00XQorICAgICAgICBzdHJiICAgICAgICAgICAgcjgsICBbcjAsICMtMV0KKyAgICAgICAgbGRyYl9wb3N0ICAgICAgIHI3LCAgcjAsICByMQorCisgICAgICAgIGxzciAgICAgICAgICAgICByMTAsIHIxMCwgIzgKKyAgICAgICAgbHNyICAgICAgICAgICAgIHI4LCAgcjgsICAjOAorICAgICAgICBvcnIgICAgICAgICAgICAgcjExLCByMTEsIHI2LCAgbHNsICM4CisgICAgICAgIG9yciAgICAgICAgICAgICByOSwgIHI5LCAgcjcsICBsc2wgIzgKKworICAgICAgICBsZHJiICAgICAgICAgICAgcjYsICBbcjAsICMtNV0KKyAgICAgICAgc3RyYiAgICAgICAgICAgIHIxMCwgW3IwLCAjLTRdCisgICAgICAgIHN0cmIgICAgICAgICAgICByOCwgIFtyMCwgIy0xXQorICAgICAgICBsZHJiX3Bvc3QgICAgICAgcjcsICByMCwgIHIxCisKKyAgICAgICAgbHNyICAgICAgICAgICAgIHIxMCwgcjEwLCAjOAorICAgICAgICBsc3IgICAgICAgICAgICAgcjgsICByOCwgICM4CisgICAgICAgIG9yciAgICAgICAgICAgICByMTEsIHIxMSwgcjYsICBsc2wgIzE2CisgICAgICAgIG9yciAgICAgICAgICAgICByOSwgIHI5LCAgcjcsICBsc2wgIzE2CisKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI2LCAgW3IwLCAjLTVdCisgICAgICAgIHN0cmIgICAgICAgICAgICByMTAsIFtyMCwgIy00XQorICAgICAgICBzdHJiICAgICAgICAgICAgcjgsICBbcjAsICMtMV0KKyAgICAgICAgbGRyYl9wb3N0ICAgICAgIHI3LCAgcjAsICByMQorICAgICAgICBvcnIgICAgICAgICAgICAgcjExLCByMTEsIHI2LCAgbHNsICMyNAorICAgICAgICBvcnIgICAgICAgICAgICAgcjksICByOSwgIHI3LCAgbHNsICMyNAorCisgICAgICAgIGZpbHRlcl8zCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgIGxzbCAjMgorICAgICAgICBzdHJiICAgICAgICAgICAgcjEwLCBbcjAsICMtNV0KKyAgICAgICAgc3RyYl9wb3N0ICAgICAgIHI4LCAgcjAsICByMQorICAgICAgICBsc3IgICAgICAgICAgICAgcjEwLCByMTAsICM4CisgICAgICAgIGxzciAgICAgICAgICAgICByOCwgIHI4LCAgIzgKKyAgICAgICAgc3RyYiAgICAgICAgICAgIHIxMCwgW3IwLCAjLTVdCisgICAgICAgIHN0cmJfcG9zdCAgICAgICByOCwgIHIwLCAgcjEKKyAgICAgICAgbHNyICAgICAgICAgICAgIHIxMCwgcjEwLCAjOAorICAgICAgICBsc3IgICAgICAgICAgICAgcjgsICByOCwgICM4CisgICAgICAgIHN0cmIgICAgICAgICAgICByMTAsIFtyMCwgIy01XQorICAgICAgICBzdHJiX3Bvc3QgICAgICAgcjgsICByMCwgIHIxCisgICAgICAgIGxzciAgICAgICAgICAgICByMTAsIHIxMCwgIzgKKyAgICAgICAgbHNyICAgICAgICAgICAgIHI4LCAgcjgsICAjOAorICAgICAgICBzdHJiICAgICAgICAgICAgcjEwLCBbcjAsICMtNV0KKyAgICAgICAgc3RyYl9wb3N0ICAgICAgIHI4LCAgcjAsICByMQorCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgIzIKKzI6CisgICAgICAgIGNtcCAgICAgICAgICAgICByNSwgICMzCisgICAgICAgIGl0ICAgICAgICAgICAgICBlcQorICAgICAgICBsZHJlcSAgICAgICAgICAgcjAsICBbc3AsICMxNl0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHI1LCAgcjUsICAjMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMxNgorICAgICAgICBwb3AgICAgICAgICAgICAge3IwLCByNC1yMTEsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDhfaF9sb29wX2ZpbHRlcjE2X2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMSwgbHJ9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIwLCAgcjEsICBsc2wgIzMKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMTJ9CisgICAgICAgIGxkciAgICAgICAgICAgICByOSwgIFtzcCwgIzQwXQorICAgICAgICBvcnIgICAgICAgICAgICAgcjIsICByMiwgIHIyLCAgbHNsICMxNgorICAgICAgICBiICAgICAgICAgICAgICAgdnA4X2hfbG9vcF9maWx0ZXJfYXJtdjYKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA4X2hfbG9vcF9maWx0ZXI4dXZfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIHI0LXIxMSwgbHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgIHIyCisgICAgICAgIG9yciAgICAgICAgICAgICByMiwgIHIzLCAgcjMsICBsc2wgIzE2CisgICAgICAgIGxkciAgICAgICAgICAgICByMywgIFtzcCwgIzQwXQorICAgICAgICBsZHIgICAgICAgICAgICAgcjksICBbc3AsICM0NF0KKyAgICAgICAgYiAgICAgICAgICAgICAgIHZwOF9oX2xvb3BfZmlsdGVyX2FybXY2CitlbmRmdW5jCisKKy5sdG9yZworCitAIE1DCisKK0Agdm9pZCBwdXRfdnA4X3BpeGVsczE2KHVpbnQ4X3QgKmRzdCwgaW50IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorQCAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQorZnVuY3Rpb24gZmZfcHV0X3ZwOF9waXhlbHMxNl9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTF9CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzMyXSAgICAgICAgICBAIGgKKzE6CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI1LCAgW3IyLCAjNF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3IyLCAjOF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI3LCAgW3IyLCAjMTJdCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByNCwgIHIyLCAgcjMKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3IyLCAjNF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMCwgW3IyLCAjOF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMSwgW3IyLCAjMTJdCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByOCwgIHIyLCAgcjMKKyAgICAgICAgc3RyZCAgICAgICAgICAgIHI2LCAgcjcsICBbcjAsICM4XQorICAgICAgICBzdHJkX3Bvc3QgICAgICAgcjQsICByNSwgIHIwLCAgcjEKKyAgICAgICAgc3RyZCAgICAgICAgICAgIHIxMCwgcjExLCBbcjAsICM4XQorICAgICAgICBzdHJkX3Bvc3QgICAgICAgcjgsICByOSwgIHIwLCAgcjEKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjExfQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworQCB2b2lkIHB1dF92cDhfcGl4ZWxzOCh1aW50OF90ICpkc3QsIGludCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKK0AgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQorZnVuY3Rpb24gZmZfcHV0X3ZwOF9waXhlbHM4X2FybXY2LCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMX0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjMzJdICAgICAgICAgIEAgaAorMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBsZHIgICAgICAgICAgICAgcjUsICBbcjIsICM0XQorICAgICAgICBsZHJfcG9zdCAgICAgICAgcjQsICByMiwgIHIzCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMiwgIzRdCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByNiwgIHIyLCAgcjMKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3IyLCAjNF0KKyAgICAgICAgbGRyX3Bvc3QgICAgICAgIHI4LCAgcjIsICByMworICAgICAgICBsZHIgICAgICAgICAgICAgcjExLCBbcjIsICM0XQorICAgICAgICBsZHJfcG9zdCAgICAgICAgcjEwLCByMiwgIHIzCisgICAgICAgIHN0cmRfcG9zdCAgICAgICByNCwgIHI1LCAgcjAsICByMQorICAgICAgICBzdHJkX3Bvc3QgICAgICAgcjYsICByNywgIHIwLCAgcjEKKyAgICAgICAgc3RyZF9wb3N0ICAgICAgIHI4LCAgcjksICByMCwgIHIxCisgICAgICAgIHN0cmRfcG9zdCAgICAgICByMTAsIHIxMSwgcjAsICByMQorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yMTF9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitAIHZvaWQgcHV0X3ZwOF9waXhlbHM0KHVpbnQ4X3QgKmRzdCwgaW50IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorQCAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCitmdW5jdGlvbiBmZl9wdXRfdnA4X3BpeGVsczRfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzBdICAgICAgICAgICBAIGgKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yNixscn0KKzE6CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzQKKyAgICAgICAgbGRyX3Bvc3QgICAgICAgIHI0LCAgcjIsICByMworICAgICAgICBsZHJfcG9zdCAgICAgICAgcjUsICByMiwgIHIzCisgICAgICAgIGxkcl9wb3N0ICAgICAgICByNiwgIHIyLCAgcjMKKyAgICAgICAgbGRyX3Bvc3QgICAgICAgIGxyLCAgcjIsICByMworICAgICAgICBzdHJfcG9zdCAgICAgICAgcjQsICByMCwgIHIxCisgICAgICAgIHN0cl9wb3N0ICAgICAgICByNSwgIHIwLCAgcjEKKyAgICAgICAgc3RyX3Bvc3QgICAgICAgIHI2LCAgcjAsICByMQorICAgICAgICBzdHJfcG9zdCAgICAgICAgbHIsICByMCwgIHIxCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI2LHBjfQorZW5kZnVuYworCitAIG5vdGU6IHdvcnN0IGNhc2Ugc3VtIG9mIGFsbCA2LXRhcCBmaWx0ZXIgdmFsdWVzICogMjU1IGlzIDB4N2Y4MCBzbyAxNiBiaXQKK0AgYXJpdGhtYXRpYyBjYW4gYmUgdXNlZCB0byBhcHBseSBmaWx0ZXJzCitjb25zdCAgIHNpeHRhcF9maWx0ZXJzXzEzMjQ1NjAwLCBhbGlnbj00CisgICAgICAgIC5zaG9ydCAgICAgMiwgMTA4LCAtMTEsICAzNiwgIC04LCAxLCAwLCAwCisgICAgICAgIC5zaG9ydCAgICAgMywgIDc3LCAtMTYsICA3NywgLTE2LCAzLCAwLCAwCisgICAgICAgIC5zaG9ydCAgICAgMSwgIDM2LCAgLTgsIDEwOCwgLTExLCAyLCAwLCAwCitlbmRjb25zdAorCitjb25zdCAgIGZvdXJ0YXBfZmlsdGVyc18xMzI0LCBhbGlnbj00CisgICAgICAgIC5zaG9ydCAgICAgLTYsICAxMiwgMTIzLCAtMQorICAgICAgICAuc2hvcnQgICAgIC05LCAgNTAsICA5MywgLTYKKyAgICAgICAgLnNob3J0ICAgICAtNiwgIDkzLCAgNTAsIC05CisgICAgICAgIC5zaG9ydCAgICAgLTEsIDEyMywgIDEyLCAtNgorZW5kY29uc3QKKworLm1hY3JvICB2cDhfbWNfMSAgICAgICAgbmFtZSwgc2l6ZSwgaHYKK2Z1bmN0aW9uIGZmX3B1dF92cDhfXG5hbWVcc2l6ZVwoKV9caHZcKClfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgI1xzaXplCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsIHNwCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIHI0LXIxMSwgbHJ9CisgICAgICAgIGxkbSAgICAgICAgICAgICByMTIsIHtyNS1yN30KKyAgICAgICAgbW92ICAgICAgICAgICAgIHI0LCAgI1xzaXplCisgICAgICAgIHN0bSAgICAgICAgICAgICByMTIsIHtyNCwgcjV9CisgICAgICAgIG9yciAgICAgICAgICAgICByMTIsIHI2LCAgcjcKKyAgICAgICAgYiAgICAgICAgICAgICAgIGJsX3B1dF9cbmFtZVwoKV9caHZcKClfYXJtdjYKK2VuZGZ1bmMKKy5lbmRtCisKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGVwZWwsICAxNiwgaDYKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGVwZWwsICAxNiwgdjYKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGVwZWwsICAgOCwgaDYKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGVwZWwsICAgOCwgdjYKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGVwZWwsICAgOCwgaDQKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGVwZWwsICAgOCwgdjQKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGVwZWwsICAgNCwgaDYKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGVwZWwsICAgNCwgdjYKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGVwZWwsICAgNCwgaDQKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGVwZWwsICAgNCwgdjQKKwordnA4X21jXzEgICAgICAgICAgICAgICAgYmlsaW4sIDE2LCBoCit2cDhfbWNfMSAgICAgICAgICAgICAgICBiaWxpbiwgMTYsIHYKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGJpbGluLCAgOCwgaAordnA4X21jXzEgICAgICAgICAgICAgICAgYmlsaW4sICA4LCB2Cit2cDhfbWNfMSAgICAgICAgICAgICAgICBiaWxpbiwgIDQsIGgKK3ZwOF9tY18xICAgICAgICAgICAgICAgIGJpbGluLCAgNCwgdgorCisvKiBUcnVlIHJlbGF0aW9uYWwgZXhwcmVzc2lvbnMgaGF2ZSB0aGUgdmFsdWUgLTEgaW4gdGhlIEdOVSBhc3NlbWJsZXIsCisgICArMSBpbiBBcHBsZSdzLiAqLworI2lmZGVmIF9fQVBQTEVfXworIyAgIGRlZmluZSBUTVBTSVpFIFxzaXplICogKDggKyA4Kihcc2l6ZSA+IDQpICsgXHl0YXBzIC0gMSkKKyNlbHNlCisjICAgZGVmaW5lIFRNUFNJWkUgXHNpemUgKiAoOCAtIDgqKFxzaXplID4gNCkgKyBceXRhcHMgLSAxKQorI2VuZGlmCisKKy5tYWNybyAgdnA4X21jX2h2ICAgICAgIG5hbWUsIHNpemUsIGgsIHYsIHl0YXBzCitmdW5jdGlvbiBmZl9wdXRfdnA4X1xuYW1lXHNpemVcKClfXGhcdlwoKV9hcm12NiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMCwgcjEsIHI0LCBscn0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgc3AsICAjMTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjVE1QU0laRSsxNgorICAgICAgICBsZG0gICAgICAgICAgICAgcjAsICB7cjAsIHIxMn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHI0LCAgI1xzaXplCisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHIwLCAgI1x5dGFwcy0xCisgICAgLmlmIFx5dGFwcyA+IDIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgIGxzbCAjXHl0YXBzID4+IDEgJiAxCisgICAgLmVuZGlmCisgICAgICAgIHN0bSAgICAgICAgICAgICBzcCwgIHtyNCwgbHJ9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHNwLCAgIzE2CisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgICMwCisgICAgICAgIGJsICAgICAgICAgICAgICB2cDhfcHV0X1xuYW1lXCgpX1xoXCgpX2FybXY2CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHNwLCAgI1RNUFNJWkUrMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIGxyLCAgW3NwLCAjVE1QU0laRSsxNisxNl0KKyAgICAgICAgbGRtICAgICAgICAgICAgIHIwLCAge3IwLCByMX0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgI1xzaXplCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgI1RNUFNJWkUrMTYrMTYrOF0KKyAgICAgICAgc3RyICAgICAgICAgICAgIGxyLCAgW3NwLCAjNF0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgc3AsICAjMTYgKyBcc2l6ZSAqIChceXRhcHMgLyAyIC0gMSkKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjXHNpemUKKyAgICAgICAgYmwgICAgICAgICAgICAgIHZwOF9wdXRfXG5hbWVcKClfXHZcKClfYXJtdjYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjVE1QU0laRSsxNis4CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQsIHBjfQorZW5kZnVuYworLmVuZG0KKwordnA4X21jX2h2ICAgICAgICAgICAgICAgZXBlbCwgIDE2LCBoNiwgdjYsIDYKK3ZwOF9tY19odiAgICAgICAgICAgICAgIGVwZWwsICAgOCwgaDYsIHY2LCA2Cit2cDhfbWNfaHYgICAgICAgICAgICAgICBlcGVsLCAgIDgsIGg0LCB2NiwgNgordnA4X21jX2h2ICAgICAgICAgICAgICAgZXBlbCwgICA4LCBoNiwgdjQsIDQKK3ZwOF9tY19odiAgICAgICAgICAgICAgIGVwZWwsICAgOCwgaDQsIHY0LCA0Cit2cDhfbWNfaHYgICAgICAgICAgICAgICBlcGVsLCAgIDQsIGg2LCB2NiwgNgordnA4X21jX2h2ICAgICAgICAgICAgICAgZXBlbCwgICA0LCBoNCwgdjYsIDYKK3ZwOF9tY19odiAgICAgICAgICAgICAgIGVwZWwsICAgNCwgaDYsIHY0LCA0Cit2cDhfbWNfaHYgICAgICAgICAgICAgICBlcGVsLCAgIDQsIGg0LCB2NCwgNAorCit2cDhfbWNfaHYgICAgICAgICAgICAgICBiaWxpbiwgMTYsIGgsICB2LCAgMgordnA4X21jX2h2ICAgICAgICAgICAgICAgYmlsaW4sICA4LCBoLCAgdiwgIDIKK3ZwOF9tY19odiAgICAgICAgICAgICAgIGJpbGluLCAgNCwgaCwgIHYsICAyCisKKy5tYWNybyAgc2F0NCAgICAgICAgICAgIHIwLCAgcjEsICByMiwgIHIzCisgICAgICAgIGFzciAgICAgICAgICAgICBccjAsIFxyMCwgIzcKKyAgICAgICAgYXNyICAgICAgICAgICAgIFxyMSwgXHIxLCAjNworICAgICAgICBwa2hidCAgICAgICAgICAgXHIwLCBccjAsIFxyMiwgbHNsICM5CisgICAgICAgIHBraGJ0ICAgICAgICAgICBccjEsIFxyMSwgXHIzLCBsc2wgIzkKKyAgICAgICAgdXNhdDE2ICAgICAgICAgIFxyMCwgIzgsICBccjAKKyAgICAgICAgdXNhdDE2ICAgICAgICAgIFxyMSwgIzgsICBccjEKKyAgICAgICAgb3JyICAgICAgICAgICAgIFxyMCwgXHIwLCBccjEsIGxzbCAjOAorLmVuZG0KKworQCBDYWxsaW5nIGNvbnZlbnRpb24gZm9yIHRoZSBpbm5lciBNQyBmdW5jdGlvbnM6CitAICAgICAgIHIwICAgICAgZHN0CitAICAgICAgIHIxICAgICAgZHN0X3N0cmlkZSAtIGJsb2NrX3dpZHRoCitAICAgICAgIHIyICAgICAgc3JjCitAICAgICAgIHIzICAgICAgc3JjX3N0cmlkZQorQCAgICAgICByNCAgICAgIGJsb2NrX3dpZHRoCitAICAgICAgIHIxMiAgICAgZmlsdGVyX2luZGV4CitAICAgICAgIFtzcF0gICAgYmxvY2tfd2lkdGgKK0AgICAgICAgW3NwKzRdICBoZWlnaHQKK0AgICAgICAgW3NwKzhdICBzY3JhdGNoCisKK2Z1bmN0aW9uIHZwOF9wdXRfZXBlbF9oNl9hcm12NgorICAgICAgICBwdXNoICAgICAgICAgICAge3IxLCByNC1yMTEsIGxyfQorYmxfcHV0X2VwZWxfaDZfYXJtdjY6CisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzIKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgc2l4dGFwX2ZpbHRlcnNfMTMyNDU2MDAgLSAxNgorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICBsciwgIHIxMiwgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICByMywgIHIzLCAgcjQKKyAgICAgICAgc3RyICAgICAgICAgICAgIHIzLCAgW3NwLCAjNDhdCisgICAgICAgIGxkbSAgICAgICAgICAgICBsciwgIHtyMSwgcjMsIGxyfQorMToKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI3LCAgW3IyLCAjNV0gICAgICAgICAgIEAgc3JjWzUtOF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3IyLCAjMl0gICAgICAgICAgIEAgc3JjWzItNV0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI1LCAgW3IyXSwgIzQgICAgICAgICAgIEAgc3JjWzAtM10KKworICAgICAgICBwa2h0YiAgICAgICAgICAgcjcsICByNywgIHI3LCAgYXNyICM4ICAgQCBzcmNbOCw3LDcsNl0KKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI5LCAgcjYsICByb3IgIzggICAgICAgIEAgc3JjWzVdIHwgc3JjWzNdCisgICAgICAgIHV4dGIxNiAgICAgICAgICByNiwgIHI2ICAgICAgICAgICAgICAgICBAIHNyY1s0XSB8IHNyY1syXQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjgsICByNSwgIHJvciAjOCAgICAgICAgQCBzcmNbM10gfCBzcmNbMV0KKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHIxMSwgcjcsICByb3IgIzggICAgICAgIEAgc3JjWzhdIHwgc3JjWzddCisgICAgICAgIHV4dGIxNiAgICAgICAgICByNywgIHI3ICAgICAgICAgICAgICAgICBAIHNyY1s3XSB8IHNyY1s2XQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjUsICByNSAgICAgICAgICAgICAgICAgQCBzcmNbMl0gfCBzcmNbMF0KKworICAgICAgICBtb3YgICAgICAgICAgICAgcjEwLCAjMHg0MAorICAgICAgICBzbWxhZCAgICAgICAgICAgcjUsICByNSwgIHIxLCAgcjEwICAgICAgQCBmaWx0ZXJbMF1bMF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMSwgcjExLCBsciwgIHIxMCAgICAgIEAgZmlsdGVyWzNdWzJdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI3LCAgbHIsICByMTAgICAgICBAIGZpbHRlclsyXVsyXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjEwLCByOCwgIHIxLCAgcjEwICAgICAgQCBmaWx0ZXJbMV1bMF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHI1LCAgcjgsICByMywgIHI1ICAgICAgIEAgZmlsdGVyWzBdWzFdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTEsIHI5LCAgcjEsICByMTEgICAgICBAIGZpbHRlclszXVswXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByOSwgIHIzLCAgcjEyICAgICAgQCBmaWx0ZXJbMl1bMV0KKyAgICAgICAgcGtodGIgICAgICAgICAgIHI5LCAgcjksICByNiwgIGFzciAjMTYgIEAgc3JjWzVdIHwgc3JjWzRdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTAsIHI2LCAgcjMsICByMTAgICAgICBAIGZpbHRlclsxXVsxXQorICAgICAgICBwa2hidCAgICAgICAgICAgcjcsICByOSwgIHI3LCAgbHNsICMxNiAgQCBzcmNbNl0gfCBzcmNbNF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHI1LCAgcjksICBsciwgIHI1ICAgICAgIEAgZmlsdGVyWzBdWzJdCisgICAgICAgIHBraHRiICAgICAgICAgICByOCwgIHI3LCAgcjksICBhc3IgIzE2ICBAIHNyY1s2XSB8IHNyY1s1XQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjExLCByNywgIHIzLCAgcjExICAgICAgQCBmaWx0ZXJbM11bMV0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHI5LCAgcjgsICBsciwgIHIxMCAgICAgIEAgZmlsdGVyWzFdWzJdCisgICAgICAgIHNtbGFkICAgICAgICAgICByNywgIHI2LCAgcjEsICByMTIgICAgICBAIGZpbHRlclsyXVswXQorCisgICAgICAgIHN1YnMgICAgICAgICAgICByNCwgIHI0LCAgIzQKKworICAgICAgICBzYXQ0ICAgICAgICAgICAgcjUsICByOSwgIHI3LCAgcjExCisgICAgICAgIHN0ciAgICAgICAgICAgICByNSwgIFtyMF0sICM0CisKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgc3AsICAjNDAKKyAgICAgICAgbGRtICAgICAgICAgICAgIHI0LCAge3I0LCByNSwgcjEyfQorICAgICAgICBsZHIgICAgICAgICAgICAgcjYsICBbc3BdCisgICAgICAgIHN1YnMgICAgICAgICAgICByNSwgIHI1LCAgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICByMTIKKyAgICAgICAgc3RyICAgICAgICAgICAgIHI1LCAgW3NwLCAjNDRdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjYKKworICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3IxLCByNC1yMTEsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiB2cDhfcHV0X2VwZWxfdjZfYXJtdjYKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMSwgcjQtcjExLCBscn0KK2JsX3B1dF9lcGVsX3Y2X2FybXY2OgorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzaXh0YXBfZmlsdGVyc18xMzI0NTYwMCAtIDE2CisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIGxyLCAgcjEyLCBsc2wgIzMKKyAgICAgICAgc3RyICAgICAgICAgICAgIHIzLCAgW3NwLCAjNDhdCisxOgorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMywgIHIzLCAgbHNsICMxICAgQCBzdHJpZGUgKiAzCisgICAgICAgIGxkcl9ucmVnICAgICAgICByNSwgIHIyLCAgcjMgICAgICAgICAgICBAIHNyY1swLDEsMiwzICsgc3RyaWRlICogMV0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3IyLCByM10gICAgICAgICAgIEAgc3JjWzAsMSwyLDMgKyBzdHJpZGUgKiAzXQorICAgICAgICBsZHIgICAgICAgICAgICAgcjcsICBbcjIsIHIzLCAgbHNsICMxXSAgQCBzcmNbMCwxLDIsMyArIHN0cmlkZSAqIDRdCisgICAgICAgIGxkciAgICAgICAgICAgICByOCwgIFtyMiwgcjFdICAgICAgICAgICBAIHNyY1swLDEsMiwzICsgc3RyaWRlICogNV0KKworICAgICAgICB1eHRiMTYgICAgICAgICAgcjksICByNSwgIHJvciAjOCAgICAgICAgQCBzcmNbMyArIHMqMV0gfCBzcmNbMSArIHMqMV0KKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHIxMCwgcjYsICByb3IgIzggICAgICAgIEAgc3JjWzMgKyBzKjNdIHwgc3JjWzEgKyBzKjNdCisgICAgICAgIHV4dGIxNiAgICAgICAgICByMTEsIHI3LCAgcm9yICM4ICAgICAgICBAIHNyY1szICsgcyo0XSB8IHNyY1sxICsgcyo0XQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjEyLCByOCwgIHJvciAjOCAgICAgICAgQCBzcmNbMyArIHMqNV0gfCBzcmNbMSArIHMqNV0KKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI1LCAgcjUgICAgICAgICAgICAgICAgIEAgc3JjWzIgKyBzKjFdIHwgc3JjWzAgKyBzKjFdCisgICAgICAgIHV4dGIxNiAgICAgICAgICByNiwgIHI2ICAgICAgICAgICAgICAgICBAIHNyY1syICsgcyozXSB8IHNyY1swICsgcyozXQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjcsICByNyAgICAgICAgICAgICAgICAgQCBzcmNbMiArIHMqNF0gfCBzcmNbMCArIHMqNF0KKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI4LCAgcjggICAgICAgICAgICAgICAgIEAgc3JjWzIgKyBzKjVdIHwgc3JjWzAgKyBzKjVdCisgICAgICAgIHBraGJ0ICAgICAgICAgICByMSwgIHI5LCAgcjEwLCBsc2wgIzE2ICBAIHNyY1sxICsgcyozXSB8IHNyY1sxICsgcyoxXQorICAgICAgICBwa2h0YiAgICAgICAgICAgcjksICByMTAsIHI5LCAgYXNyICMxNiAgQCBzcmNbMyArIHMqM10gfCBzcmNbMyArIHMqMV0KKyAgICAgICAgcGtoYnQgICAgICAgICAgIHIxMCwgcjExLCByMTIsIGxzbCAjMTYgIEAgc3JjWzEgKyBzKjVdIHwgc3JjWzEgKyBzKjRdCisgICAgICAgIHBraHRiICAgICAgICAgICByMTEsIHIxMiwgcjExLCBhc3IgIzE2ICBAIHNyY1szICsgcyo1XSB8IHNyY1szICsgcyo0XQorICAgICAgICBwa2hidCAgICAgICAgICAgcjEyLCByNSwgIHI2LCAgbHNsICMxNiAgQCBzcmNbMCArIHMqM10gfCBzcmNbMCArIHMqMV0KKyAgICAgICAgcGtodGIgICAgICAgICAgIHI1LCAgcjYsICByNSwgIGFzciAjMTYgIEAgc3JjWzIgKyBzKjNdIHwgc3JjWzIgKyBzKjFdCisgICAgICAgIHBraGJ0ICAgICAgICAgICByNiwgIHI3LCAgcjgsICBsc2wgIzE2ICBAIHNyY1swICsgcyo1XSB8IHNyY1swICsgcyo0XQorICAgICAgICBwa2h0YiAgICAgICAgICAgcjcsICByOCwgIHI3LCAgYXNyICMxNiAgQCBzcmNbMiArIHMqNV0gfCBzcmNbMiArIHMqNF0KKworICAgICAgICBsZHIgICAgICAgICAgICAgcjgsICBbbHIsICM0XQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMHg0MAorICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByMTIsIHI4LCAgcjMgICAgICAgQCBmaWx0ZXJbMF1bMV0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxLCAgcjEsICByOCwgIHIzICAgICAgIEAgZmlsdGVyWzFdWzFdCisgICAgICAgIHNtbGFkICAgICAgICAgICByNSwgIHI1LCAgcjgsICByMyAgICAgICBAIGZpbHRlclsyXVsxXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjksICByOSwgIHI4LCAgcjMgICAgICAgQCBmaWx0ZXJbM11bMV0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI4LCAgW2xyLCAjOF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIzLCAgW3NwLCAjNDhdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI2LCAgcjgsICByMTIgICAgICBAIGZpbHRlclswXVsyXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjEsICByMTAsIHI4LCAgcjEgICAgICAgQCBmaWx0ZXJbMV1bMl0KKyAgICAgICAgbGRyX25yZWcgICAgICAgIHI2LCAgcjIsICByMywgIGxzbCAjMSAgIEAgc3JjWzAsMSwyLDMgKyBzdHJpZGUgKiAwXQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEwLCBbcjJdLCAjNCAgICAgICAgICAgQCBzcmNbMCwxLDIsMyArIHN0cmlkZSAqIDJdCisgICAgICAgIHNtbGFkICAgICAgICAgICByNSwgIHI3LCAgcjgsICByNSAgICAgICBAIGZpbHRlclsyXVsyXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjksICByMTEsIHI4LCAgcjkgICAgICAgQCBmaWx0ZXJbM11bMl0KKworICAgICAgICB1eHRiMTYgICAgICAgICAgcjcsICByNiwgIHJvciAjOCAgICAgICAgQCBzcmNbMyArIHMqMF0gfCBzcmNbMSArIHMqMF0KKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHIxMSwgcjEwLCByb3IgIzggICAgICAgIEAgc3JjWzMgKyBzKjJdIHwgc3JjWzEgKyBzKjJdCisgICAgICAgIHV4dGIxNiAgICAgICAgICByNiwgIHI2ICAgICAgICAgICAgICAgICBAIHNyY1syICsgcyowXSB8IHNyY1swICsgcyowXQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjEwLCByMTAgICAgICAgICAgICAgICAgQCBzcmNbMiArIHMqMl0gfCBzcmNbMCArIHMqMl0KKworICAgICAgICBwa2hidCAgICAgICAgICAgcjgsICByNywgIHIxMSwgbHNsICMxNiAgQCBzcmNbMSArIHMqMl0gfCBzcmNbMSArIHMqMF0KKyAgICAgICAgcGtodGIgICAgICAgICAgIHI3LCAgcjExLCByNywgIGFzciAjMTYgIEAgc3JjWzMgKyBzKjJdIHwgc3JjWzMgKyBzKjBdCisgICAgICAgIHBraGJ0ICAgICAgICAgICByMTEsIHI2LCAgcjEwLCBsc2wgIzE2ICBAIHNyY1swICsgcyoyXSB8IHNyY1swICsgcyowXQorICAgICAgICBwa2h0YiAgICAgICAgICAgcjYsICByMTAsIHI2LCAgYXNyICMxNiAgQCBzcmNbMiArIHMqMl0gfCBzcmNbMiArIHMqMF0KKworICAgICAgICBsZHIgICAgICAgICAgICAgcjEwLCBbbHJdCisgICAgICAgIHN1YnMgICAgICAgICAgICByNCwgIHI0LCAgIzQKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjExLCByMTAsIHIxMiAgICAgIEAgZmlsdGVyWzBdWzBdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMSwgIHI4LCAgcjEwLCByMSAgICAgICBAIGZpbHRlclsxXVswXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjUsICByNiwgIHIxMCwgcjUgICAgICAgQCBmaWx0ZXJbMl1bMF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHI5LCAgcjcsICByMTAsIHI5ICAgICAgIEAgZmlsdGVyWzNdWzBdCisKKyAgICAgICAgc2F0NCAgICAgICAgICAgIHIxMiwgcjEsICByNSwgIHI5CisgICAgICAgIHN0ciAgICAgICAgICAgICByMTIsIFtyMF0sICM0CisKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI0LCAgcjUsICBbc3AsICM0MF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI2LCAgW3NwXQorICAgICAgICBzdWJzICAgICAgICAgICAgcjUsICByNSwgICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjQKKyAgICAgICAgc3RyICAgICAgICAgICAgIHI1LCAgW3NwLCAjNDRdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICByMworCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjEsIHI0LXIxMSwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIHZwOF9wdXRfZXBlbF9oNF9hcm12NgorICAgICAgICBwdXNoICAgICAgICAgICAge3IxLCByNC1yMTEsIGxyfQorYmxfcHV0X2VwZWxfaDRfYXJtdjY6CisgICAgICAgIHN1YnMgICAgICAgICAgICByMiwgIHIyLCAgIzEKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgZm91cnRhcF9maWx0ZXJzXzEzMjQgLSA0CisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIGxyLCAgcjEyLCBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIzLCAgcjMsICByNAorICAgICAgICBsZG0gICAgICAgICAgICAgbHIsICB7cjUsIHI2fQorICAgICAgICBsZHIgICAgICAgICAgICAgbHIsICBbc3AsICM0NF0KKzE6CisgICAgICAgIGxkciAgICAgICAgICAgICByOSwgIFtyMiwgIzNdCisgICAgICAgIGxkciAgICAgICAgICAgICByOCwgIFtyMiwgIzJdCisgICAgICAgIGxkciAgICAgICAgICAgICByNywgIFtyMl0sICM0CisKKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI5LCAgcjksICByb3IgIzggICAgICAgIEAgc3JjWzZdIHwgc3JjWzRdCisgICAgICAgIHV4dGIxNiAgICAgICAgICByMTAsIHI4LCAgcm9yICM4ICAgICAgICBAIHNyY1s1XSB8IHNyY1szXQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjgsICByOCAgICAgICAgICAgICAgICAgQCBzcmNbNF0gfCBzcmNbMl0KKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHIxMSwgcjcsICByb3IgIzggICAgICAgIEAgc3JjWzNdIHwgc3JjWzFdCisgICAgICAgIHV4dGIxNiAgICAgICAgICByNywgIHI3ICAgICAgICAgICAgICAgICBAIHNyY1syXSB8IHNyY1swXQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMweDQwCisgICAgICAgIHNtbGFkICAgICAgICAgICByOSwgIHI5LCAgcjYsICByMTIgICAgICBAIGZpbHRlclszXVsxXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjcsICByNywgIHI1LCAgcjEyICAgICAgQCBmaWx0ZXJbMF1bMF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHI5LCAgcjEwLCByNSwgIHI5ICAgICAgIEAgZmlsdGVyWzNdWzBdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTAsIHIxMCwgcjYsICByMTIgICAgICBAIGZpbHRlclsyXVsxXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByMTEsIHI1LCAgcjEyICAgICAgQCBmaWx0ZXJbMV1bMF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHI3LCAgcjExLCByNiwgIHI3ICAgICAgIEAgZmlsdGVyWzBdWzFdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTAsIHI4LCAgcjUsICByMTAgICAgICBAIGZpbHRlclsyXVswXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByOCwgIHI2LCAgcjEyICAgICAgQCBmaWx0ZXJbMV1bMV0KKworICAgICAgICBzdWJzICAgICAgICAgICAgcjQsICByNCwgICM0CisKKyAgICAgICAgc2F0NCAgICAgICAgICAgIHI3LCAgcjEyLCByMTAsIHI5CisgICAgICAgIHN0ciAgICAgICAgICAgICByNywgIFtyMF0sICM0CisKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjMQorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICM0MF0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICByMworICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIxCisKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyMSwgcjQtcjExLCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gdnA4X3B1dF9lcGVsX3Y0X2FybXY2CisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIHI0LXIxMSwgbHJ9CitibF9wdXRfZXBlbF92NF9hcm12NjoKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgZm91cnRhcF9maWx0ZXJzXzEzMjQgLSA0CisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIGxyLCAgcjEyLCBsc2wgIzIKKyAgICAgICAgbGRtICAgICAgICAgICAgIGxyLCAge3I1LCByNn0KKyAgICAgICAgc3RyICAgICAgICAgICAgIHIzLCAgW3NwLCAjNDhdCisxOgorICAgICAgICBsZHIgICAgICAgICAgICAgbHIsICBbcjIsIHIzLCBsc2wgIzFdCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtyMiwgcjNdCisgICAgICAgIGxkcl9ucmVnICAgICAgICByNywgIHIyLCAgcjMKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMSwgW3IyXSwgIzQKKworICAgICAgICB1eHRiMTYgICAgICAgICAgcjgsICBsciwgIHJvciAjOCAgICAgICAgQCBzcmNbMyArIHMqM10gfCBzcmNbMSArIHMqM10KKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHI5LCAgcjEyLCByb3IgIzggICAgICAgIEAgc3JjWzMgKyBzKjJdIHwgc3JjWzEgKyBzKjJdCisgICAgICAgIHV4dGIxNiAgICAgICAgICByMywgIHI3LCAgcm9yICM4ICAgICAgICBAIHNyY1szICsgcyowXSB8IHNyY1sxICsgcyowXQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjEsICByMTEsIHJvciAjOCAgICAgICAgQCBzcmNbMyArIHMqMV0gfCBzcmNbMSArIHMqMV0KKyAgICAgICAgdXh0YjE2ICAgICAgICAgIGxyLCAgbHIgICAgICAgICAgICAgICAgIEAgc3JjWzIgKyBzKjNdIHwgc3JjWzAgKyBzKjNdCisgICAgICAgIHV4dGIxNiAgICAgICAgICByMTIsIHIxMiAgICAgICAgICAgICAgICBAIHNyY1syICsgcyoyXSB8IHNyY1swICsgcyoyXQorICAgICAgICB1eHRiMTYgICAgICAgICAgcjcsICByNyAgICAgICAgICAgICAgICAgQCBzcmNbMiArIHMqMF0gfCBzcmNbMCArIHMqMF0KKyAgICAgICAgdXh0YjE2ICAgICAgICAgIHIxMSwgcjExICAgICAgICAgICAgICAgIEAgc3JjWzIgKyBzKjFdIHwgc3JjWzAgKyBzKjFdCisgICAgICAgIHBraGJ0ICAgICAgICAgICByMTAsIHIxLCAgcjgsICBsc2wgIzE2ICBAIHNyY1sxICsgcyozXSB8IHNyY1sxICsgcyoxXQorICAgICAgICBwa2h0YiAgICAgICAgICAgcjEsICByOCwgIHIxLCAgYXNyICMxNiAgQCBzcmNbMyArIHMqM10gfCBzcmNbMyArIHMqMV0KKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI4LCAgcjMsICByOSwgIGxzbCAjMTYgIEAgc3JjWzEgKyBzKjJdIHwgc3JjWzEgKyBzKjBdCisgICAgICAgIHBraHRiICAgICAgICAgICByMywgIHI5LCAgcjMsICBhc3IgIzE2ICBAIHNyY1szICsgcyoyXSB8IHNyY1szICsgcyowXQorICAgICAgICBwa2hidCAgICAgICAgICAgcjksICByMTEsIGxyLCAgbHNsICMxNiAgQCBzcmNbMCArIHMqM10gfCBzcmNbMCArIHMqMV0KKyAgICAgICAgcGtodGIgICAgICAgICAgIHIxMSwgbHIsICByMTEsIGFzciAjMTYgIEAgc3JjWzIgKyBzKjNdIHwgc3JjWzIgKyBzKjFdCisgICAgICAgIHBraGJ0ICAgICAgICAgICBsciwgIHI3LCAgcjEyLCBsc2wgIzE2ICBAIHNyY1swICsgcyoyXSB8IHNyY1swICsgcyowXQorICAgICAgICBwa2h0YiAgICAgICAgICAgcjcsICByMTIsIHI3LCAgYXNyICMxNiAgQCBzcmNbMiArIHMqMl0gfCBzcmNbMiArIHMqMF0KKworICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMHg0MAorICAgICAgICBzbWxhZCAgICAgICAgICAgcjksICByOSwgIHI2LCAgcjEyICAgICAgQCBmaWx0ZXJbMF1bMV0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMCwgcjEwLCByNiwgIHIxMiAgICAgIEAgZmlsdGVyWzFdWzFdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTEsIHIxMSwgcjYsICByMTIgICAgICBAIGZpbHRlclsyXVsxXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjEsICByMSwgIHI2LCAgcjEyICAgICAgQCBmaWx0ZXJbM11bMV0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHI5LCAgbHIsICByNSwgIHI5ICAgICAgIEAgZmlsdGVyWzBdWzBdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTAsIHI4LCAgcjUsICByMTAgICAgICBAIGZpbHRlclsxXVswXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjExLCByNywgIHI1LCAgcjExICAgICAgQCBmaWx0ZXJbMl1bMF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxLCAgcjMsICByNSwgIHIxICAgICAgIEAgZmlsdGVyWzNdWzBdCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHI0LCAgcjQsICAjNAorICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbc3AsICM0OF0KKworICAgICAgICBzYXQ0ICAgICAgICAgICAgcjksICByMTAsIHIxMSwgcjEKKyAgICAgICAgc3RyICAgICAgICAgICAgIHI5LCAgW3IwXSwgIzQKKworICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICM0MF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjNDRdCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIyLCAgcjMKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI5LCAgW3NwLCAjMF0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHI0CisgICAgICAgIHN0ciAgICAgICAgICAgICByMTIsIFtzcCwgIzQ0XQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHI5CisKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyMSwgcjQtcjExLCBwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gdnA4X3B1dF9iaWxpbl9oX2FybXY2CisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIHI0LXIxMSwgbHJ9CitibF9wdXRfYmlsaW5faF9hcm12NjoKKyAgICAgICAgcnNiICAgICAgICAgICAgIHI1LCAgcjEyLCByMTIsIGxzbCAjMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjNDRdCisgICAgICAgIHN1YiAgICAgICAgICAgICByMywgIHIzLCAgcjQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCAgcjUsICAjOAorMToKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI2LCAgW3IyXSwgIzEKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI3LCAgW3IyXSwgIzEKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI4LCAgW3IyXSwgIzEKKyAgICAgICAgbGRyYiAgICAgICAgICAgIHI5LCAgW3IyXSwgIzEKKyAgICAgICAgbGRyYiAgICAgICAgICAgIGxyLCAgW3IyXQorCisgICAgICAgIHBraGJ0ICAgICAgICAgICByNiwgIHI2LCAgcjcsICBsc2wgIzE2ICBAIHNyY1sxXSB8IHNyY1swXQorICAgICAgICBwa2hidCAgICAgICAgICAgcjcsICByNywgIHI4LCAgbHNsICMxNiAgQCBzcmNbMl0gfCBzcmNbMV0KKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI4LCAgcjgsICByOSwgIGxzbCAjMTYgIEAgc3JjWzNdIHwgc3JjWzJdCisgICAgICAgIHBraGJ0ICAgICAgICAgICByOSwgIHI5LCAgbHIsICBsc2wgIzE2ICBAIHNyY1s0XSB8IHNyY1szXQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTAsICM0CisgICAgICAgIHNtbGFkICAgICAgICAgICByNiwgIHI2LCAgcjUsICByMTAKKyAgICAgICAgc21sYWQgICAgICAgICAgIHI3LCAgcjcsICByNSwgIHIxMAorICAgICAgICBzbWxhZCAgICAgICAgICAgcjgsICByOCwgIHI1LCAgcjEwCisgICAgICAgIHNtbGFkICAgICAgICAgICByOSwgIHI5LCAgcjUsICByMTAKKworICAgICAgICBzdWJzICAgICAgICAgICAgcjQsICByNCwgICM0CisKKyAgICAgICAgYXNyICAgICAgICAgICAgIHI2LCAgIzMKKyAgICAgICAgYXNyICAgICAgICAgICAgIHI3LCAgIzMKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI2LCAgcjYsICByOCwgIGxzbCAjMTMKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI3LCAgcjcsICByOSwgIGxzbCAjMTMKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI2LCAgcjYsICByNywgIGxzbCAjOAorICAgICAgICBzdHIgICAgICAgICAgICAgcjYsICBbcjBdLCAjNAorCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzQwXQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIyLCAgcjMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMQorCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjEsIHI0LXIxMSwgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIHZwOF9wdXRfYmlsaW5fdl9hcm12NgorICAgICAgICBwdXNoICAgICAgICAgICAge3IxLCByNC1yMTEsIGxyfQorYmxfcHV0X2JpbGluX3ZfYXJtdjY6CisgICAgICAgIHJzYiAgICAgICAgICAgICByNSwgIHIxMiwgcjEyLCBsc2wgIzE2CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzQ0XQorICAgICAgICBhZGQgICAgICAgICAgICAgcjUsICByNSwgICM4CisxOgorICAgICAgICBsZHJiICAgICAgICAgICAgcjEwLCBbcjIsIHIzXQorICAgICAgICBsZHJiICAgICAgICAgICAgcjYsICBbcjJdLCAjMQorICAgICAgICBsZHJiICAgICAgICAgICAgcjExLCBbcjIsIHIzXQorICAgICAgICBsZHJiICAgICAgICAgICAgcjcsICBbcjJdLCAjMQorICAgICAgICBsZHJiICAgICAgICAgICAgbHIsICBbcjIsIHIzXQorICAgICAgICBsZHJiICAgICAgICAgICAgcjgsICBbcjJdLCAjMQorICAgICAgICBsZHJiICAgICAgICAgICAgcjksICBbcjIsIHIzXQorICAgICAgICBwa2hidCAgICAgICAgICAgcjYsICByNiwgIHIxMCwgbHNsICMxNgorICAgICAgICBsZHJiICAgICAgICAgICAgcjEwLCBbcjJdLCAjMQorICAgICAgICBwa2hidCAgICAgICAgICAgcjcsICByNywgIHIxMSwgbHNsICMxNgorICAgICAgICBwa2hidCAgICAgICAgICAgcjgsICByOCwgIGxyLCAgbHNsICMxNgorICAgICAgICBwa2hidCAgICAgICAgICAgcjksICByMTAsIHI5LCAgbHNsICMxNgorCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTAsICM0CisgICAgICAgIHNtbGFkICAgICAgICAgICByNiwgIHI2LCAgcjUsICByMTAKKyAgICAgICAgc21sYWQgICAgICAgICAgIHI3LCAgcjcsICByNSwgIHIxMAorICAgICAgICBzbWxhZCAgICAgICAgICAgcjgsICByOCwgIHI1LCAgcjEwCisgICAgICAgIHNtbGFkICAgICAgICAgICByOSwgIHI5LCAgcjUsICByMTAKKworICAgICAgICBzdWJzICAgICAgICAgICAgcjQsICByNCwgICM0CisKKyAgICAgICAgYXNyICAgICAgICAgICAgIHI2LCAgIzMKKyAgICAgICAgYXNyICAgICAgICAgICAgIHI3LCAgIzMKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI2LCAgcjYsICByOCwgIGxzbCAjMTMKKyAgICAgICAgcGtoYnQgICAgICAgICAgIHI3LCAgcjcsICByOSwgIGxzbCAjMTMKKyAgICAgICAgb3JyICAgICAgICAgICAgIHI2LCAgcjYsICByNywgIGxzbCAjOAorICAgICAgICBzdHIgICAgICAgICAgICAgcjYsICBbcjBdLCAjNAorCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzQwXQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIyLCAgcjMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHI0CisKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjEsIHI0LXIxMSwgcGN9CitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4ZHNwX2luaXRfYXJtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4ZHNwX2luaXRfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4MDE3NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92cDhkc3BfaW5pdF9hcm0uYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZwOGRzcC5oIgorI2luY2x1ZGUgInZwOGRzcC5oIgorCithdl9jb2xkIHZvaWQgZmZfdnA3OGRzcF9pbml0X2FybShWUDhEU1BDb250ZXh0ICpkc3ApCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX2FybXY2KGNwdV9mbGFncykpCisgICAgICAgIGZmX3ZwNzhkc3BfaW5pdF9hcm12Nihkc3ApOworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkKKyAgICAgICAgZmZfdnA3OGRzcF9pbml0X25lb24oZHNwKTsKK30KKworYXZfY29sZCB2b2lkIGZmX3ZwOGRzcF9pbml0X2FybShWUDhEU1BDb250ZXh0ICpkc3ApCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX2FybXY2KGNwdV9mbGFncykpCisgICAgICAgIGZmX3ZwOGRzcF9pbml0X2FybXY2KGRzcCk7CisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKQorICAgICAgICBmZl92cDhkc3BfaW5pdF9uZW9uKGRzcCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4ZHNwX2luaXRfYXJtdjYuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92cDhkc3BfaW5pdF9hcm12Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YmNkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4ZHNwX2luaXRfYXJtdjYuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdnA4ZHNwLmgiCisjaW5jbHVkZSAidnA4ZHNwLmgiCisKK3ZvaWQgZmZfdnA4X2x1bWFfZGNfd2h0X2FybXY2KGludDE2X3QgYmxvY2tbNF1bNF1bMTZdLCBpbnQxNl90IGRjWzE2XSk7Cit2b2lkIGZmX3ZwOF9sdW1hX2RjX3dodF9kY19hcm12NihpbnQxNl90IGJsb2NrWzRdWzRdWzE2XSwgaW50MTZfdCBkY1sxNl0pOworCit2b2lkIGZmX3ZwOF9pZGN0X2FkZF9hcm12Nih1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbMTZdLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkX2FybXY2KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl92cDhfaWRjdF9kY19hZGQ0eV9hcm12Nih1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbNF1bMTZdLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkNHV2X2FybXY2KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1s0XVsxNl0sIHB0cmRpZmZfdCBzdHJpZGUpOworCitWUDhfTEYoYXJtdjYpOworCitWUDhfRVBFTCgxNiwgYXJtdjYpOworVlA4X0VQRUwoOCwgIGFybXY2KTsKK1ZQOF9FUEVMKDQsICBhcm12Nik7CisKK1ZQOF9CSUxJTigxNiwgYXJtdjYpOworVlA4X0JJTElOKDgsICBhcm12Nik7CitWUDhfQklMSU4oNCwgIGFybXY2KTsKKworYXZfY29sZCB2b2lkIGZmX3ZwNzhkc3BfaW5pdF9hcm12NihWUDhEU1BDb250ZXh0ICpkc3ApCit7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlswXVswXVswXSA9IGZmX3B1dF92cDhfcGl4ZWxzMTZfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlswXVswXVsyXSA9IGZmX3B1dF92cDhfZXBlbDE2X2g2X2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMF1bMl1bMF0gPSBmZl9wdXRfdnA4X2VwZWwxNl92Nl9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzBdWzJdWzJdID0gZmZfcHV0X3ZwOF9lcGVsMTZfaDZ2Nl9hcm12NjsKKworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMV1bMF1bMF0gPSBmZl9wdXRfdnA4X3BpeGVsczhfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVswXVsxXSA9IGZmX3B1dF92cDhfZXBlbDhfaDRfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVswXVsyXSA9IGZmX3B1dF92cDhfZXBlbDhfaDZfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVsxXVswXSA9IGZmX3B1dF92cDhfZXBlbDhfdjRfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVsxXVsxXSA9IGZmX3B1dF92cDhfZXBlbDhfaDR2NF9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzFdWzFdWzJdID0gZmZfcHV0X3ZwOF9lcGVsOF9oNnY0X2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMV1bMl1bMF0gPSBmZl9wdXRfdnA4X2VwZWw4X3Y2X2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMV1bMl1bMV0gPSBmZl9wdXRfdnA4X2VwZWw4X2g0djZfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVsyXVsyXSA9IGZmX3B1dF92cDhfZXBlbDhfaDZ2Nl9hcm12NjsKKworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMl1bMF1bMF0gPSBmZl9wdXRfdnA4X3BpeGVsczRfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVswXVsxXSA9IGZmX3B1dF92cDhfZXBlbDRfaDRfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVswXVsyXSA9IGZmX3B1dF92cDhfZXBlbDRfaDZfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVsxXVswXSA9IGZmX3B1dF92cDhfZXBlbDRfdjRfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVsxXVsxXSA9IGZmX3B1dF92cDhfZXBlbDRfaDR2NF9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzJdWzFdWzJdID0gZmZfcHV0X3ZwOF9lcGVsNF9oNnY0X2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMl1bMl1bMF0gPSBmZl9wdXRfdnA4X2VwZWw0X3Y2X2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMl1bMl1bMV0gPSBmZl9wdXRfdnA4X2VwZWw0X2g0djZfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVsyXVsyXSA9IGZmX3B1dF92cDhfZXBlbDRfaDZ2Nl9hcm12NjsKKworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzBdWzBdWzBdID0gZmZfcHV0X3ZwOF9waXhlbHMxNl9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVswXVsxXSA9IGZmX3B1dF92cDhfYmlsaW4xNl9oX2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzBdWzBdWzJdID0gZmZfcHV0X3ZwOF9iaWxpbjE2X2hfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMF1bMV1bMF0gPSBmZl9wdXRfdnA4X2JpbGluMTZfdl9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVsxXVsxXSA9IGZmX3B1dF92cDhfYmlsaW4xNl9odl9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVsxXVsyXSA9IGZmX3B1dF92cDhfYmlsaW4xNl9odl9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVsyXVswXSA9IGZmX3B1dF92cDhfYmlsaW4xNl92X2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzBdWzJdWzFdID0gZmZfcHV0X3ZwOF9iaWxpbjE2X2h2X2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzBdWzJdWzJdID0gZmZfcHV0X3ZwOF9iaWxpbjE2X2h2X2FybXY2OworCisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMV1bMF1bMF0gPSBmZl9wdXRfdnA4X3BpeGVsczhfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMV1bMF1bMV0gPSBmZl9wdXRfdnA4X2JpbGluOF9oX2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzFdWzBdWzJdID0gZmZfcHV0X3ZwOF9iaWxpbjhfaF9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsxXVsxXVswXSA9IGZmX3B1dF92cDhfYmlsaW44X3ZfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMV1bMV1bMV0gPSBmZl9wdXRfdnA4X2JpbGluOF9odl9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsxXVsxXVsyXSA9IGZmX3B1dF92cDhfYmlsaW44X2h2X2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzFdWzJdWzBdID0gZmZfcHV0X3ZwOF9iaWxpbjhfdl9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsxXVsyXVsxXSA9IGZmX3B1dF92cDhfYmlsaW44X2h2X2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzFdWzJdWzJdID0gZmZfcHV0X3ZwOF9iaWxpbjhfaHZfYXJtdjY7CisKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsyXVswXVswXSA9IGZmX3B1dF92cDhfcGl4ZWxzNF9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsyXVswXVsxXSA9IGZmX3B1dF92cDhfYmlsaW40X2hfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMF1bMl0gPSBmZl9wdXRfdnA4X2JpbGluNF9oX2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzJdWzFdWzBdID0gZmZfcHV0X3ZwOF9iaWxpbjRfdl9hcm12NjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsyXVsxXVsxXSA9IGZmX3B1dF92cDhfYmlsaW40X2h2X2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzJdWzFdWzJdID0gZmZfcHV0X3ZwOF9iaWxpbjRfaHZfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMl1bMF0gPSBmZl9wdXRfdnA4X2JpbGluNF92X2FybXY2OworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzJdWzJdWzFdID0gZmZfcHV0X3ZwOF9iaWxpbjRfaHZfYXJtdjY7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMl1bMl0gPSBmZl9wdXRfdnA4X2JpbGluNF9odl9hcm12NjsKK30KKworYXZfY29sZCB2b2lkIGZmX3ZwOGRzcF9pbml0X2FybXY2KFZQOERTUENvbnRleHQgKmRzcCkKK3sKKyAgICBkc3AtPnZwOF9sdW1hX2RjX3dodCAgICA9IGZmX3ZwOF9sdW1hX2RjX3dodF9hcm12NjsKKyAgICBkc3AtPnZwOF9sdW1hX2RjX3dodF9kYyA9IGZmX3ZwOF9sdW1hX2RjX3dodF9kY19hcm12NjsKKworICAgIGRzcC0+dnA4X2lkY3RfYWRkICAgICAgID0gZmZfdnA4X2lkY3RfYWRkX2FybXY2OworICAgIGRzcC0+dnA4X2lkY3RfZGNfYWRkICAgID0gZmZfdnA4X2lkY3RfZGNfYWRkX2FybXY2OworICAgIGRzcC0+dnA4X2lkY3RfZGNfYWRkNHkgID0gZmZfdnA4X2lkY3RfZGNfYWRkNHlfYXJtdjY7CisgICAgZHNwLT52cDhfaWRjdF9kY19hZGQ0dXYgPSBmZl92cDhfaWRjdF9kY19hZGQ0dXZfYXJtdjY7CisKKyAgICBkc3AtPnZwOF92X2xvb3BfZmlsdGVyMTZ5ID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXIxNl9hcm12NjsKKyAgICBkc3AtPnZwOF9oX2xvb3BfZmlsdGVyMTZ5ID0gZmZfdnA4X2hfbG9vcF9maWx0ZXIxNl9hcm12NjsKKyAgICBkc3AtPnZwOF92X2xvb3BfZmlsdGVyOHV2ID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXI4dXZfYXJtdjY7CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcjh1diA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyOHV2X2FybXY2OworCisgICAgZHNwLT52cDhfdl9sb29wX2ZpbHRlcjE2eV9pbm5lciA9IGZmX3ZwOF92X2xvb3BfZmlsdGVyMTZfaW5uZXJfYXJtdjY7CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcjE2eV9pbm5lciA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyMTZfaW5uZXJfYXJtdjY7CisgICAgZHNwLT52cDhfdl9sb29wX2ZpbHRlcjh1dl9pbm5lciA9IGZmX3ZwOF92X2xvb3BfZmlsdGVyOHV2X2lubmVyX2FybXY2OworICAgIGRzcC0+dnA4X2hfbG9vcF9maWx0ZXI4dXZfaW5uZXIgPSBmZl92cDhfaF9sb29wX2ZpbHRlcjh1dl9pbm5lcl9hcm12NjsKKworICAgIGRzcC0+dnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXIxNl9zaW1wbGVfYXJtdjY7CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGUgPSBmZl92cDhfaF9sb29wX2ZpbHRlcjE2X3NpbXBsZV9hcm12NjsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92cDhkc3BfaW5pdF9uZW9uLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4ZHNwX2luaXRfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZjFmMjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4ZHNwX2luaXRfbmVvbi5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92cDhkc3AuaCIKKyNpbmNsdWRlICJ2cDhkc3AuaCIKKwordm9pZCBmZl92cDhfbHVtYV9kY193aHRfbmVvbihpbnQxNl90IGJsb2NrWzRdWzRdWzE2XSwgaW50MTZfdCBkY1sxNl0pOworCit2b2lkIGZmX3ZwOF9pZGN0X2FkZF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl92cDhfaWRjdF9kY19hZGRfbmVvbih1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbMTZdLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkNHlfbmVvbih1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbNF1bMTZdLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkNHV2X25lb24odWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzRdWzE2XSwgcHRyZGlmZl90IHN0cmlkZSk7CisKK1ZQOF9MRihuZW9uKTsKKworVlA4X0VQRUwoMTYsIG5lb24pOworVlA4X0VQRUwoOCwgIG5lb24pOworVlA4X0VQRUwoNCwgIG5lb24pOworCitWUDhfQklMSU4oMTYsIG5lb24pOworVlA4X0JJTElOKDgsICBuZW9uKTsKK1ZQOF9CSUxJTig0LCAgbmVvbik7CisKK2F2X2NvbGQgdm9pZCBmZl92cDc4ZHNwX2luaXRfbmVvbihWUDhEU1BDb250ZXh0ICpkc3ApCit7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlswXVswXVswXSA9IGZmX3B1dF92cDhfcGl4ZWxzMTZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzBdWzBdWzJdID0gZmZfcHV0X3ZwOF9lcGVsMTZfaDZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzBdWzJdWzBdID0gZmZfcHV0X3ZwOF9lcGVsMTZfdjZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzBdWzJdWzJdID0gZmZfcHV0X3ZwOF9lcGVsMTZfaDZ2Nl9uZW9uOworCisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVswXVswXSA9IGZmX3B1dF92cDhfcGl4ZWxzOF9uZW9uOworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMV1bMF1bMV0gPSBmZl9wdXRfdnA4X2VwZWw4X2g0X25lb247CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVswXVsyXSA9IGZmX3B1dF92cDhfZXBlbDhfaDZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzFdWzFdWzBdID0gZmZfcHV0X3ZwOF9lcGVsOF92NF9uZW9uOworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMV1bMV1bMV0gPSBmZl9wdXRfdnA4X2VwZWw4X2g0djRfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzFdWzFdWzJdID0gZmZfcHV0X3ZwOF9lcGVsOF9oNnY0X25lb247CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVsyXVswXSA9IGZmX3B1dF92cDhfZXBlbDhfdjZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzFdWzJdWzFdID0gZmZfcHV0X3ZwOF9lcGVsOF9oNHY2X25lb247CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVsyXVsyXSA9IGZmX3B1dF92cDhfZXBlbDhfaDZ2Nl9uZW9uOworCisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVswXVsxXSA9IGZmX3B1dF92cDhfZXBlbDRfaDRfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzJdWzBdWzJdID0gZmZfcHV0X3ZwOF9lcGVsNF9oNl9uZW9uOworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMl1bMV1bMF0gPSBmZl9wdXRfdnA4X2VwZWw0X3Y0X25lb247CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVsxXVsxXSA9IGZmX3B1dF92cDhfZXBlbDRfaDR2NF9uZW9uOworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMl1bMV1bMl0gPSBmZl9wdXRfdnA4X2VwZWw0X2g2djRfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzJdWzJdWzBdID0gZmZfcHV0X3ZwOF9lcGVsNF92Nl9uZW9uOworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMl1bMl1bMV0gPSBmZl9wdXRfdnA4X2VwZWw0X2g0djZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzJdWzJdWzJdID0gZmZfcHV0X3ZwOF9lcGVsNF9oNnY2X25lb247CisKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVswXVswXSA9IGZmX3B1dF92cDhfcGl4ZWxzMTZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVswXVsxXSA9IGZmX3B1dF92cDhfYmlsaW4xNl9oX25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMF1bMF1bMl0gPSBmZl9wdXRfdnA4X2JpbGluMTZfaF9uZW9uOworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzBdWzFdWzBdID0gZmZfcHV0X3ZwOF9iaWxpbjE2X3ZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVsxXVsxXSA9IGZmX3B1dF92cDhfYmlsaW4xNl9odl9uZW9uOworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzBdWzFdWzJdID0gZmZfcHV0X3ZwOF9iaWxpbjE2X2h2X25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMF1bMl1bMF0gPSBmZl9wdXRfdnA4X2JpbGluMTZfdl9uZW9uOworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzBdWzJdWzFdID0gZmZfcHV0X3ZwOF9iaWxpbjE2X2h2X25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMF1bMl1bMl0gPSBmZl9wdXRfdnA4X2JpbGluMTZfaHZfbmVvbjsKKworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzFdWzBdWzBdID0gZmZfcHV0X3ZwOF9waXhlbHM4X25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMV1bMF1bMV0gPSBmZl9wdXRfdnA4X2JpbGluOF9oX25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMV1bMF1bMl0gPSBmZl9wdXRfdnA4X2JpbGluOF9oX25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMV1bMV1bMF0gPSBmZl9wdXRfdnA4X2JpbGluOF92X25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMV1bMV1bMV0gPSBmZl9wdXRfdnA4X2JpbGluOF9odl9uZW9uOworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzFdWzFdWzJdID0gZmZfcHV0X3ZwOF9iaWxpbjhfaHZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsxXVsyXVswXSA9IGZmX3B1dF92cDhfYmlsaW44X3ZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsxXVsyXVsxXSA9IGZmX3B1dF92cDhfYmlsaW44X2h2X25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMV1bMl1bMl0gPSBmZl9wdXRfdnA4X2JpbGluOF9odl9uZW9uOworCisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMF1bMV0gPSBmZl9wdXRfdnA4X2JpbGluNF9oX25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMF1bMl0gPSBmZl9wdXRfdnA4X2JpbGluNF9oX25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMV1bMF0gPSBmZl9wdXRfdnA4X2JpbGluNF92X25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMV1bMV0gPSBmZl9wdXRfdnA4X2JpbGluNF9odl9uZW9uOworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzJdWzFdWzJdID0gZmZfcHV0X3ZwOF9iaWxpbjRfaHZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsyXVsyXVswXSA9IGZmX3B1dF92cDhfYmlsaW40X3ZfbmVvbjsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsyXVsyXVsxXSA9IGZmX3B1dF92cDhfYmlsaW40X2h2X25lb247CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMl1bMl0gPSBmZl9wdXRfdnA4X2JpbGluNF9odl9uZW9uOworfQorCithdl9jb2xkIHZvaWQgZmZfdnA4ZHNwX2luaXRfbmVvbihWUDhEU1BDb250ZXh0ICpkc3ApCit7CisgICAgZHNwLT52cDhfbHVtYV9kY193aHQgICAgPSBmZl92cDhfbHVtYV9kY193aHRfbmVvbjsKKworICAgIGRzcC0+dnA4X2lkY3RfYWRkICAgICAgID0gZmZfdnA4X2lkY3RfYWRkX25lb247CisgICAgZHNwLT52cDhfaWRjdF9kY19hZGQgICAgPSBmZl92cDhfaWRjdF9kY19hZGRfbmVvbjsKKyAgICBkc3AtPnZwOF9pZGN0X2RjX2FkZDR5ICA9IGZmX3ZwOF9pZGN0X2RjX2FkZDR5X25lb247CisgICAgZHNwLT52cDhfaWRjdF9kY19hZGQ0dXYgPSBmZl92cDhfaWRjdF9kY19hZGQ0dXZfbmVvbjsKKworICAgIGRzcC0+dnA4X3ZfbG9vcF9maWx0ZXIxNnkgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjE2X25lb247CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcjE2eSA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyMTZfbmVvbjsKKyAgICBkc3AtPnZwOF92X2xvb3BfZmlsdGVyOHV2ID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXI4dXZfbmVvbjsKKyAgICBkc3AtPnZwOF9oX2xvb3BfZmlsdGVyOHV2ID0gZmZfdnA4X2hfbG9vcF9maWx0ZXI4dXZfbmVvbjsKKworICAgIGRzcC0+dnA4X3ZfbG9vcF9maWx0ZXIxNnlfaW5uZXIgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjE2X2lubmVyX25lb247CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcjE2eV9pbm5lciA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyMTZfaW5uZXJfbmVvbjsKKyAgICBkc3AtPnZwOF92X2xvb3BfZmlsdGVyOHV2X2lubmVyID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXI4dXZfaW5uZXJfbmVvbjsKKyAgICBkc3AtPnZwOF9oX2xvb3BfZmlsdGVyOHV2X2lubmVyID0gZmZfdnA4X2hfbG9vcF9maWx0ZXI4dXZfaW5uZXJfbmVvbjsKKworICAgIGRzcC0+dnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXIxNl9zaW1wbGVfbmVvbjsKKyAgICBkc3AtPnZwOF9oX2xvb3BfZmlsdGVyX3NpbXBsZSA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyMTZfc2ltcGxlX25lb247Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4ZHNwX25lb24uUyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FybS92cDhkc3BfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMTkzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hcm0vdnA4ZHNwX25lb24uUwpAQCAtMCwwICsxLDE4NjcgQEAKKy8qCisgKiBWUDggTkVPTiBvcHRpbWlzYXRpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisjaW5jbHVkZSAibmVvbi5TIgorCitmdW5jdGlvbiBmZl92cDhfbHVtYV9kY193aHRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMC1xMX0sICBbcjEsOjEyOF0KKyAgICAgICAgdm1vdi5pMTYgICAgICAgIHExNSwgIzAKKworICAgICAgICB2YWRkLmkxNiAgICAgICAgZDQsICBkMCwgIGQzCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBkNiwgIGQxLCAgZDIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTV9LCAgICBbcjEsOjEyOF0hCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBkNywgIGQxLCAgZDIKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIGQ1LCAgZDAsICBkMworICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExNX0sICAgIFtyMSw6MTI4XQorICAgICAgICB2YWRkLmkxNiAgICAgICAgcTAsICBxMiwgIHEzCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBxMSwgIHEyLCAgcTMKKworICAgICAgICB2bW92LmkxNiAgICAgICAgcTgsICMzCisKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQwLCAgZDIKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQxLCAgZDMKKyAgICAgICAgdnRybi4xNiAgICAgICAgIGQwLCAgZDEKKyAgICAgICAgdnRybi4xNiAgICAgICAgIGQyLCAgZDMKKworICAgICAgICB2YWRkLmkxNiAgICAgICAgZDAsICBkMCwgIGQxNgorCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBkNCwgIGQwLCAgZDMKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQ2LCAgZDEsICBkMgorICAgICAgICB2c3ViLmkxNiAgICAgICAgZDcsICBkMSwgIGQyCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBkNSwgIGQwLCAgZDMKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIHEwLCAgcTIsICBxMworICAgICAgICB2c3ViLmkxNiAgICAgICAgcTEsICBxMiwgIHEzCisKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHEwLCAgcTAsICAjMworICAgICAgICB2c2hyLnMxNiAgICAgICAgcTEsICBxMSwgICMzCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzMyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDBbMF19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDFbMF19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDJbMF19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDNbMF19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDBbMV19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDFbMV19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDJbMV19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDNbMV19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDBbMl19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDFbMl19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDJbMl19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDNbMl19LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDBbM119LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDFbM119LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDJbM119LCAgW3IwLDoxNl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDNbM119LCAgW3IwLDoxNl0sIHIzCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOF9pZGN0X2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwLXExfSwgIFtyMSw6MTI4XQorICAgICAgICBtb3Z3ICAgICAgICAgICAgcjMsICAjMjAwOTEKKyAgICAgICAgbW92dCAgICAgICAgICAgIHIzLCAgIzM1NDY4LzIKKyAgICAgICAgdmR1cC4zMiAgICAgICAgIGQ0LCAgcjMKKworICAgICAgICB2bXVsbC5zMTYgICAgICAgcTEyLCBkMSwgIGQ0WzBdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTMsIGQzLCAgZDRbMF0KKyAgICAgICAgdnFkbXVsaC5zMTYgICAgIGQyMCwgZDEsICBkNFsxXQorICAgICAgICB2cWRtdWxoLnMxNiAgICAgZDIzLCBkMywgIGQ0WzFdCisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkMjEsIHExMiwgIzE2CisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkMjIsIHExMywgIzE2CisgICAgICAgIHZhZGQuczE2ICAgICAgICBkMjEsIGQyMSwgZDEKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIGQyMiwgZDIyLCBkMworCisgICAgICAgIHZhZGQuczE2ICAgICAgICBkMTYsIGQwLCAgZDIKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIGQxNywgZDAsICBkMgorICAgICAgICB2YWRkLnMxNiAgICAgICAgZDE4LCBkMjEsIGQyMworICAgICAgICB2c3ViLnMxNiAgICAgICAgZDE5LCBkMjAsIGQyMgorICAgICAgICB2YWRkLnMxNiAgICAgICAgcTAsICBxOCwgIHE5CisgICAgICAgIHZzdWIuczE2ICAgICAgICBxMSwgIHE4LCAgcTkKKworICAgICAgICB2dHJuLjMyICAgICAgICAgZDAsICBkMworICAgICAgICB2dHJuLjMyICAgICAgICAgZDEsICBkMgorICAgICAgICB2dHJuLjE2ICAgICAgICAgZDAsICBkMQorICAgICAgICB2dHJuLjE2ICAgICAgICAgZDMsICBkMgorCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMTUsICMwCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTIsIGQxLCAgZDRbMF0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTV9LCAgICBbcjEsOjEyOF0hCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTMsIGQyLCAgZDRbMF0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTV9LCAgICBbcjEsOjEyOF0KKyAgICAgICAgdnFkbXVsaC5zMTYgICAgIGQyMSwgZDEsICBkNFsxXQorICAgICAgICB2cWRtdWxoLnMxNiAgICAgZDIzLCBkMiwgIGQ0WzFdCisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkMjAsIHExMiwgIzE2CisgICAgICAgIHZzaHJuLnMzMiAgICAgICBkMjIsIHExMywgIzE2CisgICAgICAgIHZhZGQuaTE2ICAgICAgICBkMjAsIGQyMCwgZDEKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIGQyMiwgZDIyLCBkMgorCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBkMTYsIGQwLCAgZDMKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIGQxNywgZDAsICBkMworICAgICAgICB2YWRkLmkxNiAgICAgICAgZDE4LCBkMjAsIGQyMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QyMFtdfSwgIFtyMCw6MzJdLCByMgorICAgICAgICB2c3ViLmkxNiAgICAgICAgZDE5LCBkMjEsIGQyMgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyMltdfSwgIFtyMCw6MzJdLCByMgorICAgICAgICB2YWRkLnMxNiAgICAgICAgcTAsICBxOCwgIHE5CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDIzW119LCAgW3IwLDozMl0sIHIyCisgICAgICAgIHZzdWIuczE2ICAgICAgICBxMSwgIHE4LCAgcTkKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjFbXX0sICBbcjAsOjMyXSwgcjIKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHEwLCAgcTAsICAjMworICAgICAgICB2dHJuLjMyICAgICAgICAgcTEwLCBxMTEKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHExLCAgcTEsICAjMworCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIsICBsc2wgIzIKKworICAgICAgICB2dHJuLjMyICAgICAgICAgZDAsICBkMworICAgICAgICB2dHJuLjMyICAgICAgICAgZDEsICBkMgorICAgICAgICB2dHJuLjE2ICAgICAgICAgZDAsICBkMQorICAgICAgICB2dHJuLjE2ICAgICAgICAgZDMsICBkMgorCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMCwgIHEwLCAgZDIwCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMSwgIHExLCAgZDIxCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMCwgIHEwCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMSwgIHExCisKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMFswXX0sICBbcjAsOjMyXSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMFsxXX0sICBbcjAsOjMyXSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMVsxXX0sICBbcjAsOjMyXSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sICBbcjAsOjMyXSwgcjIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA4X2lkY3RfZGNfYWRkX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMwCisgICAgICAgIGxkcnNoICAgICAgICAgICByMTIsIFtyMV0KKyAgICAgICAgc3RyaCAgICAgICAgICAgIHIzLCAgW3IxXQorICAgICAgICB2ZHVwLjE2ICAgICAgICAgcTEsICByMTIKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHExLCAgcTEsICAjMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QwW119LCAgIFtyMCw6MzJdLCByMgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxW119LCAgIFtyMCw6MzJdLCByMgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwWzFdfSwgIFtyMCw6MzJdLCByMgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxWzFdfSwgIFtyMCw6MzJdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTIsICBxMSwgIGQwCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMywgIHExLCAgZDEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMiwgbHNsICMyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMCwgIHEyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMSwgIHEzCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCAgW3IwLDozMl0sIHIyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCAgW3IwLDozMl0sIHIyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMV19LCAgW3IwLDozMl0sIHIyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMV19LCAgW3IwLDozMl0sIHIyCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDhfaWRjdF9kY19hZGQ0dXZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgdm1vdi5pMTYgICAgICAgIGQwLCAgIzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzMyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE2W119LCAgW3IxLDoxNl0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMFswXX0sICBbcjEsOjE2XSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTdbXX0sICBbcjEsOjE2XQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwWzBdfSwgIFtyMSw6MTZdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxOFtdfSwgIFtyMSw6MTZdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDBbMF19LCAgW3IxLDoxNl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE5W119LCAgW3IxLDoxNl0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMFswXX0sICBbcjEsOjE2XSwgcjMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgcjAKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHE4LCAgcTgsICAjMyAgICAgICAgICAgIEAgZGMgPj49IDMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHE5LCAgcTksICAjMworICAgICAgICB2bGQxLjggICAgICAgICAge2QxfSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEwLCBxOCwgIGQwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMCwgIHE4LCAgZDEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkM30sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExMSwgcTgsICBkMgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEsICBxOCwgIGQzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCAgICAgW3IwLDo2NF0sIHIyCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMTIsIHE5LCAgZDQKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNn0sICAgICBbcjAsOjY0XSwgcjIKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEyLCAgcTksICBkNQorICAgICAgICB2bGQxLjggICAgICAgICAge2Q3fSwgICAgIFtyMCw6NjRdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEzLCBxOSwgIGQ2CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMjAsIHExMAorICAgICAgICB2YWRkdy51OCAgICAgICAgcTMsICBxOSwgIGQ3CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMjEsIHEwCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMjIsIHExMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QyMH0sICAgIFtyMyw6NjRdLCByMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIzLCBxMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QyMX0sICAgIFtyMyw6NjRdLCByMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDI0LCBxMTIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjJ9LCAgICBbcjMsOjY0XSwgcjIKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyNSwgcTIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjN9LCAgICBbcjMsOjY0XSwgcjIKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyNiwgcTEzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI0fSwgICAgW3IzLDo2NF0sIHIyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMjcsIHEzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI1fSwgICAgW3IzLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI2fSwgICAgW3IzLDo2NF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI3fSwgICAgW3IzLDo2NF0sIHIyCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOF9pZGN0X2RjX2FkZDR5X25lb24sIGV4cG9ydD0xCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBkMCwgICMwCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICMzMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxNltdfSwgIFtyMSw6MTZdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDBbMF19LCAgW3IxLDoxNl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE3W119LCAgW3IxLDoxNl0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMFswXX0sICBbcjEsOjE2XSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMThbXX0sICBbcjEsOjE2XQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwWzBdfSwgIFtyMSw6MTZdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxOVtdfSwgIFtyMSw6MTZdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDBbMF19LCAgW3IxLDoxNl0sIHIzCisgICAgICAgIHZyc2hyLnMxNiAgICAgICBxOCwgIHE4LCAgIzMgICAgICAgICAgICBAIGRjID4+PSAzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IwLDoxMjhdLCByMgorICAgICAgICB2cnNoci5zMTYgICAgICAgcTksICBxOSwgICMzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCAgICAgW3IwLDoxMjhdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEwLCBxOCwgIGQwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCAgICAgW3IwLDoxMjhdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTAsICBxOSwgIGQxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCAgICAgW3IwLDoxMjhdLCByMgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTExLCBxOCwgIGQyCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMSwgIHE5LCAgZDMKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExMiwgcTgsICBkNAorICAgICAgICB2YWRkdy51OCAgICAgICAgcTIsICBxOSwgIGQ1CisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMTMsIHE4LCAgZDYKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEzLCAgcTksICBkNworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIyLCAgbHNsICMyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMjAsIHExMAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIxLCBxMAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIyLCBxMTEKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyMywgcTEKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyNCwgcTEyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTEwfSwgICAgW3IwLDoxMjhdLCByMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDI1LCBxMgorICAgICAgICB2c3QxLjggICAgICAgICAge3ExMX0sICAgIFtyMCw6MTI4XSwgcjIKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQyNiwgcTEzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTEyfSwgICAgW3IwLDoxMjhdLCByMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDI3LCBxMworICAgICAgICB2c3QxLjggICAgICAgICAge3ExM30sICAgIFtyMCw6MTI4XSwgcjIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworQCBSZWdpc3RlciBsYXlvdXQ6CitAICAgUDMuLlEzIC0+IHEwLi5xNworQCAgIGZsaW1fRSAtPiBxMTQKK0AgICBmbGltX0kgLT4gcTE1CitAICAgaGV2X3RocmVzaCAtPiByMTIKK0AKKy5tYWNybyAgdnA4X2xvb3BfZmlsdGVyLCBpbm5lcj0wLCBzaW1wbGU9MAorICAgIC5pZiBcc2ltcGxlCisgICAgICAgIHZhYmQudTggICAgICAgICBxOSwgIHEzLCAgcTQgICAgICAgICAgICBAIGFicyhQMC1RMCkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIHExNSwgcTIsICBxNSAgICAgICAgICAgIEAgYWJzKFAxLVExKQorICAgICAgICB2cWFkZC51OCAgICAgICAgcTksICBxOSwgIHE5ICAgICAgICAgICAgQCBhYnMoUDAtUTApICogMgorICAgICAgICB2c2hyLnU4ICAgICAgICAgcTEwLCBxMTUsICMxICAgICAgICAgICAgQCBhYnMoUDEtUTEpIC8gMgorICAgICAgICB2cWFkZC51OCAgICAgICAgcTExLCBxOSwgIHExMCAgICAgICAgICAgQCAoYWJzKFAwLVEwKSoyKSArIChhYnMoUDEtUTEpLzIpCisgICAgICAgIHZtb3YuaTggICAgICAgICBxMTMsICMweDgwCisgICAgICAgIHZjbGUudTggICAgICAgICBxOCwgIHExMSwgcTE0ICAgICAgICAgICBAIChhYnMoUDAtUTApKjIpICsgKGFicyhQMS1RMSkvMikgPD0gZmxpbQorICAgIC5lbHNlCisgICAgICAgIEAgY2FsY3VsYXRlIGhldiBhbmQgbm9ybWFsX2xpbWl0OgorICAgICAgICB2YWJkLnU4ICAgICAgICAgcTEyLCBxMiwgIHEzICAgICAgICAgICAgQCBhYnMoUDEtUDApCisgICAgICAgIHZhYmQudTggICAgICAgICBxMTMsIHE1LCAgcTQgICAgICAgICAgICBAIGFicyhRMS1RMCkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIHExMCwgcTAsICBxMSAgICAgICAgICAgIEAgYWJzKFAzLVAyKQorICAgICAgICB2YWJkLnU4ICAgICAgICAgcTExLCBxMSwgIHEyICAgICAgICAgICAgQCBhYnMoUDItUDEpCisgICAgICAgIHZjbGUudTggICAgICAgICBxOCwgIHExMiwgcTE1ICAgICAgICAgICBAIGFicyhQMS1QMCkgPD0gZmxpbV9JCisgICAgICAgIHZjbGUudTggICAgICAgICBxOSwgIHExMywgcTE1ICAgICAgICAgICBAIGFicyhRMS1RMCkgPD0gZmxpbV9JCisgICAgICAgIHZjbGUudTggICAgICAgICBxMTAsIHExMCwgcTE1ICAgICAgICAgICBAIGFicyhQMy1QMikgPD0gZmxpbV9JCisgICAgICAgIHZjbGUudTggICAgICAgICBxMTEsIHExMSwgcTE1ICAgICAgICAgICBAIGFicyhQMi1QMSkgPD0gZmxpbV9JCisgICAgICAgIHZhbmQgICAgICAgICAgICBxOCwgIHE4LCAgcTkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIHE5LCAgcTcsICBxNiAgICAgICAgICAgIEAgYWJzKFEzLVEyKQorICAgICAgICB2YW5kICAgICAgICAgICAgcTgsICBxOCwgIHExMQorICAgICAgICB2YWJkLnU4ICAgICAgICAgcTExLCBxNiwgIHE1ICAgICAgICAgICAgQCBhYnMoUTItUTEpCisgICAgICAgIHZhbmQgICAgICAgICAgICBxOCwgIHE4LCAgcTEwCisgICAgICAgIHZjbGUudTggICAgICAgICBxMTAsIHE5LCAgcTE1ICAgICAgICAgICBAIGFicyhRMy1RMikgPD0gZmxpbV9JCisgICAgICAgIHZjbGUudTggICAgICAgICBxMTEsIHExMSwgcTE1ICAgICAgICAgICBAIGFicyhRMi1RMSkgPD0gZmxpbV9JCisgICAgICAgIHZhYmQudTggICAgICAgICBxOSwgIHEzLCAgcTQgICAgICAgICAgICBAIGFicyhQMC1RMCkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIHExNSwgcTIsICBxNSAgICAgICAgICAgIEAgYWJzKFAxLVExKQorICAgICAgICB2YW5kICAgICAgICAgICAgcTgsICBxOCwgIHExMAorICAgICAgICB2cWFkZC51OCAgICAgICAgcTksICBxOSwgIHE5ICAgICAgICAgICAgQCBhYnMoUDAtUTApICogMgorICAgICAgICB2YW5kICAgICAgICAgICAgcTgsICBxOCwgIHExMQorICAgICAgICB2c2hyLnU4ICAgICAgICAgcTEwLCBxMTUsICMxICAgICAgICAgICAgQCBhYnMoUDEtUTEpIC8gMgorICAgICAgICB2ZHVwLjggICAgICAgICAgcTE1LCByMTIgICAgICAgICAgICAgICAgQCBoZXZfdGhyZXNoCisgICAgICAgIHZxYWRkLnU4ICAgICAgICBxMTEsIHE5LCAgcTEwICAgICAgICAgICBAIChhYnMoUDAtUTApKjIpICsgKGFicyhQMS1RMSkvMikKKyAgICAgICAgdmNndC51OCAgICAgICAgIHExMiwgcTEyLCBxMTUgICAgICAgICAgIEAgYWJzKFAxLVAwKSA+IGhldl90aHJlc2gKKyAgICAgICAgdmNsZS51OCAgICAgICAgIHExMSwgcTExLCBxMTQgICAgICAgICAgIEAgKGFicyhQMC1RMCkqMikgKyAoYWJzKFAxLVExKS8yKSA8PSBmbGltX0UKKyAgICAgICAgdmNndC51OCAgICAgICAgIHExNCwgcTEzLCBxMTUgICAgICAgICAgIEAgYWJzKFExLVEwKSA+IGhldl90aHJlc2gKKyAgICAgICAgdmFuZCAgICAgICAgICAgIHE4LCAgcTgsICBxMTEKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIHExMywgIzB4ODAKKyAgICAgICAgdm9yciAgICAgICAgICAgIHE5LCAgcTEyLCBxMTQKKyAgICAuZW5kaWYKKworICAgICAgICBAIGF0IHRoaXMgcG9pbnQ6CisgICAgICAgIEAgICBxODogbm9ybWFsX2xpbWl0CisgICAgICAgIEAgICBxOTogaGV2CisKKyAgICAgICAgQCBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZToKKyAgICAgICAgdmVvciAgICAgICAgICAgIHEzLCAgcTMsICBxMTMgICAgICAgICAgIEAgUFMwID0gUDAgXiAweDgwCisgICAgICAgIHZlb3IgICAgICAgICAgICBxNCwgIHE0LCAgcTEzICAgICAgICAgICBAIFFTMCA9IFEwIF4gMHg4MAorCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMTIsICMzCisgICAgICAgIHZzdWJsLnM4ICAgICAgICBxMTAsIGQ4LCAgZDYgICAgICAgICAgICBAIFFTMCAtIFBTMAorICAgICAgICB2c3VibC5zOCAgICAgICAgcTExLCBkOSwgIGQ3ICAgICAgICAgICAgQCAgICh3aWRlbmVkIHRvIDE2Yml0KQorICAgICAgICB2ZW9yICAgICAgICAgICAgcTIsICBxMiwgIHExMyAgICAgICAgICAgQCBQUzEgPSBQMSBeIDB4ODAKKyAgICAgICAgdmVvciAgICAgICAgICAgIHE1LCAgcTUsICBxMTMgICAgICAgICAgIEAgUVMxID0gUTEgXiAweDgwCisgICAgICAgIHZtdWwuaTE2ICAgICAgICBxMTAsIHExMCwgcTEyICAgICAgICAgICBAIHcgPSAzICogKFFTMCAtIFBTMCkKKyAgICAgICAgdm11bC5pMTYgICAgICAgIHExMSwgcTExLCBxMTIKKworICAgICAgICB2cXN1Yi5zOCAgICAgICAgcTEyLCBxMiwgIHE1ICAgICAgICAgICAgQCBjbGFtcChQUzEtUVMxKQorICAgICAgICB2bW92Lmk4ICAgICAgICAgcTE0LCAjNAorICAgICAgICB2bW92Lmk4ICAgICAgICAgcTE1LCAjMworICAgIC5pZiBcaW5uZXIKKyAgICAgICAgdmFuZCAgICAgICAgICAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgIEAgaWYoaGV2KSB3ICs9IGNsYW1wKFBTMS1RUzEpCisgICAgLmVuZGlmCisgICAgICAgIHZhZGR3LnM4ICAgICAgICBxMTAsIHExMCwgZDI0ICAgICAgICAgICBAIHcgKz0gY2xhbXAoUFMxLVFTMSkKKyAgICAgICAgdmFkZHcuczggICAgICAgIHExMSwgcTExLCBkMjUKKyAgICAgICAgdnFtb3ZuLnMxNiAgICAgIGQyMCwgcTEwICAgICAgICAgICAgICAgIEAgbmFycm93IHJlc3VsdCBiYWNrIGludG8gcTEwCisgICAgICAgIHZxbW92bi5zMTYgICAgICBkMjEsIHExMQorICAgIC5pZiAhXGlubmVyICYmICFcc2ltcGxlCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMSwgIHExLCAgcTEzICAgICAgICAgICBAIFBTMiA9IFAyIF4gMHg4MAorICAgICAgICB2ZW9yICAgICAgICAgICAgcTYsICBxNiwgIHExMyAgICAgICAgICAgQCBRUzIgPSBRMiBeIDB4ODAKKyAgICAuZW5kaWYKKyAgICAgICAgdmFuZCAgICAgICAgICAgIHExMCwgcTEwLCBxOCAgICAgICAgICAgIEAgdyAmPSBub3JtYWxfbGltaXQKKworICAgICAgICBAIHJlZ2lzdGVycyB1c2VkIGF0IHRoaXMgcG9pbnQuLgorICAgICAgICBAICAgcTAgLT4gUDMgIChkb24ndCBjb3JydXB0KQorICAgICAgICBAICAgcTEtcTYgLT4gUFMyLVFTMgorICAgICAgICBAICAgcTcgLT4gUTMgIChkb24ndCBjb3JydXB0KQorICAgICAgICBAICAgcTkgLT4gaGV2CisgICAgICAgIEAgICBxMTAgLT4gdworICAgICAgICBAICAgcTEzIC0+ICMweDgwCisgICAgICAgIEAgICBxMTQgLT4gIzQKKyAgICAgICAgQCAgIHExNSAtPiAjMworICAgICAgICBAICAgcTgsIHExMSwgcTEyIC0+IHVudXNlZAorCisgICAgICAgIEAgZmlsdGVyX2NvbW1vbjogICBpczR0YXA9PTEKKyAgICAgICAgQCAgIGMxID0gY2xhbXAodyArIDQpID4+IDM7CisgICAgICAgIEAgICBjMiA9IGNsYW1wKHcgKyAzKSA+PiAzOworICAgICAgICBAICAgUTAgPSBzMnUoUVMwIC0gYzEpOworICAgICAgICBAICAgUDAgPSBzMnUoUFMwICsgYzIpOworCisgICAgLmlmIFxzaW1wbGUKKyAgICAgICAgdnFhZGQuczggICAgICAgIHExMSwgcTEwLCBxMTQgICAgICAgICAgIEAgYzEgPSBjbGFtcCgodyZoZXYpKzQpCisgICAgICAgIHZxYWRkLnM4ICAgICAgICBxMTIsIHExMCwgcTE1ICAgICAgICAgICBAIGMyID0gY2xhbXAoKHcmaGV2KSszKQorICAgICAgICB2c2hyLnM4ICAgICAgICAgcTExLCBxMTEsICMzICAgICAgICAgICAgQCBjMSA+Pj0gMworICAgICAgICB2c2hyLnM4ICAgICAgICAgcTEyLCBxMTIsICMzICAgICAgICAgICAgQCBjMiA+Pj0gMworICAgICAgICB2cXN1Yi5zOCAgICAgICAgcTQsICBxNCwgIHExMSAgICAgICAgICAgQCBRUzAgPSBjbGFtcChRUzAtYzEpCisgICAgICAgIHZxYWRkLnM4ICAgICAgICBxMywgIHEzLCAgcTEyICAgICAgICAgICBAIFBTMCA9IGNsYW1wKFBTMCtjMikKKyAgICAgICAgdmVvciAgICAgICAgICAgIHE0LCAgcTQsICBxMTMgICAgICAgICAgIEAgUTAgPSBRUzAgXiAweDgwCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMywgIHEzLCAgcTEzICAgICAgICAgICBAIFAwID0gUFMwIF4gMHg4MAorICAgICAgICB2ZW9yICAgICAgICAgICAgcTUsICBxNSwgIHExMyAgICAgICAgICAgQCBRMSA9IFFTMSBeIDB4ODAKKyAgICAgICAgdmVvciAgICAgICAgICAgIHEyLCAgcTIsICBxMTMgICAgICAgICAgIEAgUDEgPSBQUzEgXiAweDgwCisgICAgLmVsc2VpZiBcaW5uZXIKKyAgICAgICAgQCB0aGUgIWlzNHRhcCBjYXNlIG9mIGZpbHRlcl9jb21tb24sIG9ubHkgdXNlZCBmb3IgaW5uZXIgYmxvY2tzCisgICAgICAgIEAgICBjMyA9ICgoYzEmfmhldikgKyAxKSA+PiAxOworICAgICAgICBAICAgUTEgPSBzMnUoUVMxIC0gYzMpOworICAgICAgICBAICAgUDEgPSBzMnUoUFMxICsgYzMpOworICAgICAgICB2cWFkZC5zOCAgICAgICAgcTExLCBxMTAsIHExNCAgICAgICAgICAgQCBjMSA9IGNsYW1wKCh3JmhldikrNCkKKyAgICAgICAgdnFhZGQuczggICAgICAgIHExMiwgcTEwLCBxMTUgICAgICAgICAgIEAgYzIgPSBjbGFtcCgodyZoZXYpKzMpCisgICAgICAgIHZzaHIuczggICAgICAgICBxMTEsIHExMSwgIzMgICAgICAgICAgICBAIGMxID4+PSAzCisgICAgICAgIHZzaHIuczggICAgICAgICBxMTIsIHExMiwgIzMgICAgICAgICAgICBAIGMyID4+PSAzCisgICAgICAgIHZxc3ViLnM4ICAgICAgICBxNCwgIHE0LCAgcTExICAgICAgICAgICBAIFFTMCA9IGNsYW1wKFFTMC1jMSkKKyAgICAgICAgdnFhZGQuczggICAgICAgIHEzLCAgcTMsICBxMTIgICAgICAgICAgIEAgUFMwID0gY2xhbXAoUFMwK2MyKQorICAgICAgICB2YmljICAgICAgICAgICAgcTExLCBxMTEsIHE5ICAgICAgICAgICAgQCBjMSAmIH5oZXYKKyAgICAgICAgdmVvciAgICAgICAgICAgIHE0LCAgcTQsICBxMTMgICAgICAgICAgIEAgUTAgPSBRUzAgXiAweDgwCisgICAgICAgIHZyc2hyLnM4ICAgICAgICBxMTEsIHExMSwgIzEgICAgICAgICAgICBAIGMzID4+PSAxCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMywgIHEzLCAgcTEzICAgICAgICAgICBAIFAwID0gUFMwIF4gMHg4MAorICAgICAgICB2cXN1Yi5zOCAgICAgICAgcTUsICBxNSwgIHExMSAgICAgICAgICAgQCBRUzEgPSBjbGFtcChRUzEtYzMpCisgICAgICAgIHZxYWRkLnM4ICAgICAgICBxMiwgIHEyLCAgcTExICAgICAgICAgICBAIFBTMSA9IGNsYW1wKFBTMStjMykKKyAgICAgICAgdmVvciAgICAgICAgICAgIHE1LCAgcTUsICBxMTMgICAgICAgICAgIEAgUTEgPSBRUzEgXiAweDgwCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMiwgIHEyLCAgcTEzICAgICAgICAgICBAIFAxID0gUFMxIF4gMHg4MAorICAgIC5lbHNlCisgICAgICAgIHZhbmQgICAgICAgICAgICBxMTIsIHExMCwgcTkgICAgICAgICAgICBAIHcgJiBoZXYKKyAgICAgICAgdnFhZGQuczggICAgICAgIHExMSwgcTEyLCBxMTQgICAgICAgICAgIEAgYzEgPSBjbGFtcCgodyZoZXYpKzQpCisgICAgICAgIHZxYWRkLnM4ICAgICAgICBxMTIsIHExMiwgcTE1ICAgICAgICAgICBAIGMyID0gY2xhbXAoKHcmaGV2KSszKQorICAgICAgICB2c2hyLnM4ICAgICAgICAgcTExLCBxMTEsICMzICAgICAgICAgICAgQCBjMSA+Pj0gMworICAgICAgICB2c2hyLnM4ICAgICAgICAgcTEyLCBxMTIsICMzICAgICAgICAgICAgQCBjMiA+Pj0gMworICAgICAgICB2YmljICAgICAgICAgICAgcTEwLCBxMTAsIHE5ICAgICAgICAgICAgQCB3ICY9IH5oZXYKKyAgICAgICAgdnFzdWIuczggICAgICAgIHE0LCAgcTQsICBxMTEgICAgICAgICAgIEAgUVMwID0gY2xhbXAoUVMwLWMxKQorICAgICAgICB2cWFkZC5zOCAgICAgICAgcTMsICBxMywgIHExMiAgICAgICAgICAgQCBQUzAgPSBjbGFtcChQUzArYzIpCisKKyAgICAgICAgQCBmaWx0ZXJfbWJlZGdlOgorICAgICAgICBAICAgYSA9IGNsYW1wKCgyNyp3ICsgNjMpID4+IDcpOworICAgICAgICBAICAgUTAgPSBzMnUoUVMwIC0gYSk7CisgICAgICAgIEAgICBQMCA9IHMydShQUzAgKyBhKTsKKyAgICAgICAgQCAgIGEgPSBjbGFtcCgoMTgqdyArIDYzKSA+PiA3KTsKKyAgICAgICAgQCAgIFExID0gczJ1KFFTMSAtIGEpOworICAgICAgICBAICAgUDEgPSBzMnUoUFMxICsgYSk7CisgICAgICAgIEAgICBhID0gY2xhbXAoKDkqdyArIDYzKSA+PiA3KTsKKyAgICAgICAgQCAgIFEyID0gczJ1KFFTMiAtIGEpOworICAgICAgICBAICAgUDIgPSBzMnUoUFMyICsgYSk7CisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxOSwgICM2MworICAgICAgICB2c2hsbC5zOCAgICAgICAgcTE0LCBkMjAsICMzCisgICAgICAgIHZzaGxsLnM4ICAgICAgICBxMTUsIGQyMSwgIzMKKyAgICAgICAgdmFkZHcuczggICAgICAgIHExNCwgcTE0LCBkMjAKKyAgICAgICAgdmFkZHcuczggICAgICAgIHExNSwgcTE1LCBkMjEKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIHE4LCAgcTksICBxMTQKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIHE5LCAgcTksICBxMTUgICAgICAgICAgIEAgIDkqdyArIDYzCisgICAgICAgIHZhZGQuczE2ICAgICAgICBxMTEsIHE4LCAgcTE0CisgICAgICAgIHZhZGQuczE2ICAgICAgICBxMTIsIHE5LCAgcTE1ICAgICAgICAgICBAIDE4KncgKyA2MworICAgICAgICB2YWRkLnMxNiAgICAgICAgcTE0LCBxMTEsIHExNAorICAgICAgICB2YWRkLnMxNiAgICAgICAgcTE1LCBxMTIsIHExNSAgICAgICAgICAgQCAyNyp3ICsgNjMKKyAgICAgICAgdnFzaHJuLnMxNiAgICAgIGQxNiwgcTgsICAjNworICAgICAgICB2cXNocm4uczE2ICAgICAgZDE3LCBxOSwgICM3ICAgICAgICAgICAgQCBjbGFtcCgoIDkqdyArIDYzKT4+NykKKyAgICAgICAgdnFzaHJuLnMxNiAgICAgIGQyMiwgcTExLCAjNworICAgICAgICB2cXNocm4uczE2ICAgICAgZDIzLCBxMTIsICM3ICAgICAgICAgICAgQCBjbGFtcCgoMTgqdyArIDYzKT4+NykKKyAgICAgICAgdnFzaHJuLnMxNiAgICAgIGQyOCwgcTE0LCAjNworICAgICAgICB2cXNocm4uczE2ICAgICAgZDI5LCBxMTUsICM3ICAgICAgICAgICAgQCBjbGFtcCgoMjcqdyArIDYzKT4+NykKKyAgICAgICAgdnFhZGQuczggICAgICAgIHExLCAgcTEsICBxOCAgICAgICAgICAgIEAgUFMyID0gY2xhbXAoUFMyK2EpCisgICAgICAgIHZxc3ViLnM4ICAgICAgICBxNiwgIHE2LCAgcTggICAgICAgICAgICBAIFFTMiA9IGNsYW1wKFFTMi1hKQorICAgICAgICB2cWFkZC5zOCAgICAgICAgcTIsICBxMiwgIHExMSAgICAgICAgICAgQCBQUzEgPSBjbGFtcChQUzErYSkKKyAgICAgICAgdnFzdWIuczggICAgICAgIHE1LCAgcTUsICBxMTEgICAgICAgICAgIEAgUVMxID0gY2xhbXAoUVMxLWEpCisgICAgICAgIHZxYWRkLnM4ICAgICAgICBxMywgIHEzLCAgcTE0ICAgICAgICAgICBAIFBTMCA9IGNsYW1wKFBTMCthKQorICAgICAgICB2cXN1Yi5zOCAgICAgICAgcTQsICBxNCwgIHExNCAgICAgICAgICAgQCBRUzAgPSBjbGFtcChRUzAtYSkKKyAgICAgICAgdmVvciAgICAgICAgICAgIHEzLCAgcTMsICBxMTMgICAgICAgICAgIEAgUDAgPSBQUzAgXiAweDgwCisgICAgICAgIHZlb3IgICAgICAgICAgICBxNCwgIHE0LCAgcTEzICAgICAgICAgICBAIFEwID0gUVMwIF4gMHg4MAorICAgICAgICB2ZW9yICAgICAgICAgICAgcTIsICBxMiwgIHExMyAgICAgICAgICAgQCBQMSA9IFBTMSBeIDB4ODAKKyAgICAgICAgdmVvciAgICAgICAgICAgIHE1LCAgcTUsICBxMTMgICAgICAgICAgIEAgUTEgPSBRUzEgXiAweDgwCisgICAgICAgIHZlb3IgICAgICAgICAgICBxMSwgIHExLCAgcTEzICAgICAgICAgICBAIFAyID0gUFMyIF4gMHg4MAorICAgICAgICB2ZW9yICAgICAgICAgICAgcTYsICBxNiwgIHExMyAgICAgICAgICAgQCBRMiA9IFFTMiBeIDB4ODAKKyAgICAuZW5kaWYKKy5lbmRtCisKKy5tYWNybyAgdnA4X3ZfbG9vcF9maWx0ZXIxNiBuYW1lLCBpbm5lcj0wLCBzaW1wbGU9MAorZnVuY3Rpb24gZmZfdnA4X3ZfbG9vcF9maWx0ZXIxNlxuYW1lXCgpX25lb24sIGV4cG9ydD0xCisgICAgICAgIHZwdXNoICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsICBsc2wgIzErIVxzaW1wbGUKKworICAgICAgICBAIExvYWQgcGl4ZWxzOgorICAgIC5pZiAhXHNpbXBsZQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM2NF0gICAgICAgICAgQCBoZXZfdGhyZXNoCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IwLDoxMjhdLCByMSBAIFAzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCAgICAgW3IwLDoxMjhdLCByMSBAIFAyCisgICAgLmVuZGlmCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCAgICAgW3IwLDoxMjhdLCByMSBAIFAxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCAgICAgW3IwLDoxMjhdLCByMSBAIFAwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTR9LCAgICAgW3IwLDoxMjhdLCByMSBAIFEwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTV9LCAgICAgW3IwLDoxMjhdLCByMSBAIFExCisgICAgLmlmICFcc2ltcGxlCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTZ9LCAgICAgW3IwLDoxMjhdLCByMSBAIFEyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTd9LCAgICAgW3IwLDoxMjhdICAgICBAIFEzCisgICAgICAgIHZkdXAuOCAgICAgICAgICBxMTUsIHIzICAgICAgICAgICAgICAgICBAIGZsaW1fSQorICAgIC5lbmRpZgorICAgICAgICB2ZHVwLjggICAgICAgICAgcTE0LCByMiAgICAgICAgICAgICAgICAgQCBmbGltX0UKKworICAgICAgICB2cDhfbG9vcF9maWx0ZXIgaW5uZXI9XGlubmVyLCBzaW1wbGU9XHNpbXBsZQorCisgICAgICAgIEAgYmFjayB1cCB0byBQMjogIGRzdCAtPSBzdHJpZGUgKiA2CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsICBsc2wgIzIKKyAgICAuaWYgIVxzaW1wbGUKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgIGxzbCAjMQorCisgICAgICAgIEAgU3RvcmUgcGl4ZWxzOgorICAgICAgICB2c3QxLjggICAgICAgICAge3ExfSwgICAgIFtyMCw6MTI4XSwgcjEgQCBQMgorICAgIC5lbmRpZgorICAgICAgICB2c3QxLjggICAgICAgICAge3EyfSwgICAgIFtyMCw6MTI4XSwgcjEgQCBQMQorICAgICAgICB2c3QxLjggICAgICAgICAge3EzfSwgICAgIFtyMCw6MTI4XSwgcjEgQCBQMAorICAgICAgICB2c3QxLjggICAgICAgICAge3E0fSwgICAgIFtyMCw6MTI4XSwgcjEgQCBRMAorICAgICAgICB2c3QxLjggICAgICAgICAge3E1fSwgICAgIFtyMCw6MTI4XSwgcjEgQCBRMQorICAgIC5pZiAhXHNpbXBsZQorICAgICAgICB2c3QxLjggICAgICAgICAge3E2fSwgICAgIFtyMCw6MTI4XSAgICAgQCBRMgorICAgIC5lbmRpZgorCisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKwordnA4X3ZfbG9vcF9maWx0ZXIxNgordnA4X3ZfbG9vcF9maWx0ZXIxNiBfaW5uZXIsICBpbm5lcj0xCit2cDhfdl9sb29wX2ZpbHRlcjE2IF9zaW1wbGUsIHNpbXBsZT0xCisKKy5tYWNybyAgdnA4X3ZfbG9vcF9maWx0ZXI4dXYgbmFtZSwgaW5uZXI9MAorZnVuY3Rpb24gZmZfdnA4X3ZfbG9vcF9maWx0ZXI4dXZcbmFtZVwoKV9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE3fQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIyLCAgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIsICBsc2wgIzIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjNjRdICAgICAgICAgIEAgZmxpbV9JCisKKyAgICAgICAgQCBMb2FkIHBpeGVsczoKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICAgICBbcjAsOjY0XSwgcjIgIEAgUDMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMX0sICAgICBbcjEsOjY0XSwgcjIgIEAgUDMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMn0sICAgICBbcjAsOjY0XSwgcjIgIEAgUDIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkM30sICAgICBbcjEsOjY0XSwgcjIgIEAgUDIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNH0sICAgICBbcjAsOjY0XSwgcjIgIEAgUDEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNX0sICAgICBbcjEsOjY0XSwgcjIgIEAgUDEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNn0sICAgICBbcjAsOjY0XSwgcjIgIEAgUDAKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkN30sICAgICBbcjEsOjY0XSwgcjIgIEAgUDAKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkOH0sICAgICBbcjAsOjY0XSwgcjIgIEAgUTAKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkOX0sICAgICBbcjEsOjY0XSwgcjIgIEAgUTAKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTB9LCAgICBbcjAsOjY0XSwgcjIgIEAgUTEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTF9LCAgICBbcjEsOjY0XSwgcjIgIEAgUTEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTJ9LCAgICBbcjAsOjY0XSwgcjIgIEAgUTIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTN9LCAgICBbcjEsOjY0XSwgcjIgIEAgUTIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTR9LCAgICBbcjAsOjY0XSAgICAgIEAgUTMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTV9LCAgICBbcjEsOjY0XSAgICAgIEAgUTMKKworICAgICAgICB2ZHVwLjggICAgICAgICAgcTE0LCByMyAgICAgICAgICAgICAgICAgQCBmbGltX0UKKyAgICAgICAgdmR1cC44ICAgICAgICAgIHExNSwgcjEyICAgICAgICAgICAgICAgIEAgZmxpbV9JCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzY4XSAgICAgICAgICBAIGhldl90aHJlc2gKKworICAgICAgICB2cDhfbG9vcF9maWx0ZXIgaW5uZXI9XGlubmVyCisKKyAgICAgICAgQCBiYWNrIHVwIHRvIFAyOiAgdSx2IC09IHN0cmlkZSAqIDYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMiwgIGxzbCAjMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHIyLCAgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjIsICBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgIGxzbCAjMQorCisgICAgICAgIEAgU3RvcmUgcGl4ZWxzOgorICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgICAgIFtyMCw6NjRdLCByMiAgQCBQMgorICAgICAgICB2c3QxLjggICAgICAgICAge2QzfSwgICAgIFtyMSw6NjRdLCByMiAgQCBQMgorICAgICAgICB2c3QxLjggICAgICAgICAge2Q0fSwgICAgIFtyMCw6NjRdLCByMiAgQCBQMQorICAgICAgICB2c3QxLjggICAgICAgICAge2Q1fSwgICAgIFtyMSw6NjRdLCByMiAgQCBQMQorICAgICAgICB2c3QxLjggICAgICAgICAge2Q2fSwgICAgIFtyMCw6NjRdLCByMiAgQCBQMAorICAgICAgICB2c3QxLjggICAgICAgICAge2Q3fSwgICAgIFtyMSw6NjRdLCByMiAgQCBQMAorICAgICAgICB2c3QxLjggICAgICAgICAge2Q4fSwgICAgIFtyMCw6NjRdLCByMiAgQCBRMAorICAgICAgICB2c3QxLjggICAgICAgICAge2Q5fSwgICAgIFtyMSw6NjRdLCByMiAgQCBRMAorICAgICAgICB2c3QxLjggICAgICAgICAge2QxMH0sICAgIFtyMCw6NjRdLCByMiAgQCBRMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxMX0sICAgIFtyMSw6NjRdLCByMiAgQCBRMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxMn0sICAgIFtyMCw6NjRdICAgICAgQCBRMgorICAgICAgICB2c3QxLjggICAgICAgICAge2QxM30sICAgIFtyMSw6NjRdICAgICAgQCBRMgorCisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKwordnA4X3ZfbG9vcF9maWx0ZXI4dXYKK3ZwOF92X2xvb3BfZmlsdGVyOHV2IF9pbm5lciwgaW5uZXI9MQorCisubWFjcm8gIHZwOF9oX2xvb3BfZmlsdGVyMTYgbmFtZSwgaW5uZXI9MCwgc2ltcGxlPTAKK2Z1bmN0aW9uIGZmX3ZwOF9oX2xvb3BfZmlsdGVyMTZcbmFtZVwoKV9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE3fQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgICM0CisgICAgLmlmICFcc2ltcGxlCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzY0XSAgICAgICAgICBAIGhldl90aHJlc2gKKyAgICAuZW5kaWYKKworICAgICAgICBAIExvYWQgcGl4ZWxzOgorICAgICAgICB2bGQxLjggICAgICAgICAge2QwfSwgICAgIFtyMF0sIHIxICAgICAgQCBsb2FkIGZpcnN0IDgtbGluZSBzcmMgZGF0YQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyfSwgICAgIFtyMF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDR9LCAgICAgW3IwXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNn0sICAgICBbcjBdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2Q4fSwgICAgIFtyMF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDEwfSwgICAgW3IwXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTJ9LCAgICBbcjBdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxNH0sICAgIFtyMF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDF9LCAgICAgW3IwXSwgcjEgICAgICBAIGxvYWQgc2Vjb25kIDgtbGluZSBzcmMgZGF0YQorICAgICAgICB2bGQxLjggICAgICAgICAge2QzfSwgICAgIFtyMF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCAgICAgW3IwXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkN30sICAgICBbcjBdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2Q5fSwgICAgIFtyMF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDExfSwgICAgW3IwXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTN9LCAgICBbcjBdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxNX0sICAgIFtyMF0sIHIxCisKKyAgICAgICAgdHJhbnNwb3NlXzh4OCAgIHEwLCAgcTEsICBxMiwgIHEzLCAgcTQsICBxNSwgIHE2LCAgcTcKKworICAgICAgICB2ZHVwLjggICAgICAgICAgcTE0LCByMiAgICAgICAgICAgICAgICAgQCBmbGltX0UKKyAgICAuaWYgIVxzaW1wbGUKKyAgICAgICAgdmR1cC44ICAgICAgICAgIHExNSwgcjMgICAgICAgICAgICAgICAgIEAgZmxpbV9JCisgICAgLmVuZGlmCisKKyAgICAgICAgdnA4X2xvb3BfZmlsdGVyIGlubmVyPVxpbm5lciwgc2ltcGxlPVxzaW1wbGUKKworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzQgICAgQCBiYWNrdXAgMTYgcm93cworCisgICAgICAgIHRyYW5zcG9zZV84eDggICBxMCwgIHExLCAgcTIsICBxMywgIHE0LCAgcTUsICBxNiwgIHE3CisKKyAgICAgICAgQCBTdG9yZSBwaXhlbHM6CisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDB9LCAgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDJ9LCAgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDR9LCAgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDZ9LCAgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDh9LCAgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDEwfSwgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDEyfSwgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDE0fSwgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDF9LCAgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDN9LCAgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDV9LCAgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDd9LCAgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDl9LCAgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDExfSwgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDEzfSwgICAgW3IwXSwgICAgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDE1fSwgICAgW3IwXQorCisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKwordnA4X2hfbG9vcF9maWx0ZXIxNgordnA4X2hfbG9vcF9maWx0ZXIxNiBfaW5uZXIsICBpbm5lcj0xCit2cDhfaF9sb29wX2ZpbHRlcjE2IF9zaW1wbGUsIHNpbXBsZT0xCisKKy5tYWNybyAgdnA4X2hfbG9vcF9maWx0ZXI4dXYgbmFtZSwgaW5uZXI9MAorZnVuY3Rpb24gZmZfdnA4X2hfbG9vcF9maWx0ZXI4dXZcbmFtZVwoKV9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE3fQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzQKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjNjRdICAgICAgICAgIEAgZmxpbV9JCisKKyAgICAgICAgQCBMb2FkIHBpeGVsczoKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICAgICBbcjBdLCByMiAgICAgIEAgbG9hZCB1CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDF9LCAgICAgW3IxXSwgcjIgICAgICBAIGxvYWQgdgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyfSwgICAgIFtyMF0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNH0sICAgICBbcjBdLCByMgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q1fSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCAgICAgW3IwXSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkN30sICAgICBbcjFdLCByMgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q4fSwgICAgIFtyMF0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDl9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTB9LCAgICBbcjBdLCByMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxMX0sICAgIFtyMV0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDEyfSwgICAgW3IwXSwgcjIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTN9LCAgICBbcjFdLCByMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxNH0sICAgIFtyMF0sIHIyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE1fSwgICAgW3IxXSwgcjIKKworICAgICAgICB0cmFuc3Bvc2VfOHg4ICAgcTAsICBxMSwgIHEyLCAgcTMsICBxNCwgIHE1LCAgcTYsICBxNworCisgICAgICAgIHZkdXAuOCAgICAgICAgICBxMTQsIHIzICAgICAgICAgICAgICAgICBAIGZsaW1fRQorICAgICAgICB2ZHVwLjggICAgICAgICAgcTE1LCByMTIgICAgICAgICAgICAgICAgQCBmbGltX0kKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjNjhdICAgICAgICAgIEAgaGV2X3RocmVzaAorCisgICAgICAgIHZwOF9sb29wX2ZpbHRlciBpbm5lcj1caW5uZXIKKworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIyLCBsc2wgIzMgICAgQCBiYWNrdXAgdSA4IHJvd3MKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICByMiwgbHNsICMzICAgIEAgYmFja3VwIHYgOCByb3dzCisKKyAgICAgICAgdHJhbnNwb3NlXzh4OCAgIHEwLCAgcTEsICBxMiwgIHEzLCAgcTQsICBxNSwgIHE2LCAgcTcKKworICAgICAgICBAIFN0b3JlIHBpeGVsczoKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICAgICBbcjBdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge2QxfSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDJ9LCAgICAgW3IwXSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkM30sICAgICBbcjFdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge2Q0fSwgICAgIFtyMF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDV9LCAgICAgW3IxXSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNn0sICAgICBbcjBdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge2Q3fSwgICAgIFtyMV0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDh9LCAgICAgW3IwXSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkOX0sICAgICBbcjFdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge2QxMH0sICAgIFtyMF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDExfSwgICAgW3IxXSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTJ9LCAgICBbcjBdLCByMgorICAgICAgICB2c3QxLjggICAgICAgICAge2QxM30sICAgIFtyMV0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDE0fSwgICAgW3IwXQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxNX0sICAgIFtyMV0KKworICAgICAgICB2cG9wICAgICAgICAgICAge3E0LXE3fQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKy5lbmRtCisKK3ZwOF9oX2xvb3BfZmlsdGVyOHV2Cit2cDhfaF9sb29wX2ZpbHRlcjh1diBfaW5uZXIsIGlubmVyPTEKKworZnVuY3Rpb24gZmZfcHV0X3ZwOF9waXhlbHMxNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICMwXSAgICAgICAgICAgQCBoCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICM0CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTB9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMX0sICAgICBbcjJdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge3EyfSwgICAgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMH0sICAgICBbcjAsOjEyOF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTF9LCAgICAgW3IwLDoxMjhdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge3EyfSwgICAgIFtyMCw6MTI4XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxM30sICAgICBbcjAsOjEyOF0sIHIxCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHV0X3ZwOF9waXhlbHM4X25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzBdICAgICAgICAgICBAIGgKKzE6CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzQKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICAgICBbcjJdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QxfSwgICAgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkM30sICAgICBbcjJdLCByMworICAgICAgICB2c3QxLjggICAgICAgICAge2QwfSwgICAgIFtyMCw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxfSwgICAgIFtyMCw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgICAgIFtyMCw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QzfSwgICAgIFtyMCw6NjRdLCByMQorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKy8qIDQvNi10YXAgOHRoLXBlbCBNQyAqLworCisubWFjcm8gIHZwOF9lcGVsOF9oNiAgICBkLCAgIGEsICAgYgorICAgICAgICB2ZXh0LjggICAgICAgICAgZDI3LCBcYSwgIFxiLCAgIzEKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE4LCAgXGEKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQyOCwgXGEsICBcYiwgICMyCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxOSwgIGQyNworICAgICAgICB2ZXh0LjggICAgICAgICAgZDI5LCBcYSwgIFxiLCAgIzMKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMCwgZDI4CisgICAgICAgIHZleHQuOCAgICAgICAgICBkMzAsIFxhLCAgXGIsICAjNAorICAgICAgICB2bW92bC51OCAgICAgICAgcTExLCBkMjkKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQzMSwgXGEsICBcYiwgICM1CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTIsIGQzMAorICAgICAgICB2bXVsLnUxNiAgICAgICAgcTEwLCBxMTAsIGQwWzJdCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTMsIGQzMQorICAgICAgICB2bXVsLnUxNiAgICAgICAgcTExLCBxMTEsIGQwWzNdCisgICAgICAgIHZtbHMudTE2ICAgICAgICBxMTAsIHE5LCAgZDBbMV0KKyAgICAgICAgdm1scy51MTYgICAgICAgIHExMSwgcTEyLCBkMVswXQorICAgICAgICB2bWxhLnUxNiAgICAgICAgcTEwLCBxOCwgIGQwWzBdCisgICAgICAgIHZtbGEudTE2ICAgICAgICBxMTEsIHExMywgZDFbMV0KKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHExMSwgcTEwLCBxMTEKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIFxkLCAgcTExLCAjNworLmVuZG0KKworLm1hY3JvICB2cDhfZXBlbDE2X2g2ICAgZDAsICBkMSwgIHMwLCAgczEsICBzMiwgIHEwLCAgcTEKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHExNCwgXHEwLCBccTEsICMzCisgICAgICAgIHZleHQuOCAgICAgICAgICBxMTUsIFxxMCwgXHExLCAjNAorICAgICAgICB2bW92bC51OCAgICAgICAgcTExLCBkMjgKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExNCwgZDI5CisgICAgICAgIHZleHQuOCAgICAgICAgICBxMywgIFxxMCwgXHExLCAjMgorICAgICAgICB2bW92bC51OCAgICAgICAgcTEyLCBkMzAKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExNSwgZDMxCisgICAgICAgIHZleHQuOCAgICAgICAgICBxOCwgIFxxMCwgXHExLCAjMQorICAgICAgICB2bW92bC51OCAgICAgICAgcTEwLCBkNgorICAgICAgICB2bW92bC51OCAgICAgICAgcTMsICBkNworICAgICAgICB2ZXh0LjggICAgICAgICAgcTIsICBccTAsIFxxMSwgIzUKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMywgZDQKKyAgICAgICAgdm1vdmwudTggICAgICAgIHEyLCAgZDUKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE5LCAgZDE2CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxOCwgIGQxNworICAgICAgICB2bXVsLnUxNiAgICAgICAgcTExLCBxMTEsIGQwWzNdCisgICAgICAgIHZtdWwudTE2ICAgICAgICBxMTAsIHExMCwgZDBbMl0KKyAgICAgICAgdm11bC51MTYgICAgICAgIHEzLCAgcTMsICBkMFsyXQorICAgICAgICB2bXVsLnUxNiAgICAgICAgcTE0LCBxMTQsIGQwWzNdCisgICAgICAgIHZtbHMudTE2ICAgICAgICBxMTEsIHExMiwgZDFbMF0KKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMiwgXHMwCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMSwgIFxzMQorICAgICAgICB2bWxzLnUxNiAgICAgICAgcTEwLCBxOSwgIGQwWzFdCisgICAgICAgIHZtbHMudTE2ICAgICAgICBxMywgIHE4LCAgZDBbMV0KKyAgICAgICAgdm1scy51MTYgICAgICAgIHExNCwgcTE1LCBkMVswXQorICAgICAgICB2bWxhLnUxNiAgICAgICAgcTEwLCBxMTIsIGQwWzBdCisgICAgICAgIHZtbGEudTE2ICAgICAgICBxMTEsIHExMywgZDFbMV0KKyAgICAgICAgdm1sYS51MTYgICAgICAgIHEzLCAgcTEsICBkMFswXQorICAgICAgICB2bWxhLnUxNiAgICAgICAgcTE0LCBxMiwgIGQxWzFdCisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMTEsIHExMCwgcTExCisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMTQsIHEzLCAgcTE0CisgICAgICAgIHZxcnNocnVuLnMxNiAgICBcZDAsIHExMSwgIzcKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIFxkMSwgcTE0LCAjNworLmVuZG0KKworLm1hY3JvICB2cDhfZXBlbDhfdjYgICAgZDAsICBzMCwgIHMxLCAgczIsICBzMywgIHM0LCAgczUKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMCwgXHMyCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTEsIFxzMworICAgICAgICB2bW92bC51OCAgICAgICAgcTksICBcczEKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMiwgXHM0CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxOCwgIFxzMAorICAgICAgICB2bW92bC51OCAgICAgICAgcTEzLCBcczUKKyAgICAgICAgdm11bC51MTYgICAgICAgIHExMCwgcTEwLCBkMFsyXQorICAgICAgICB2bXVsLnUxNiAgICAgICAgcTExLCBxMTEsIGQwWzNdCisgICAgICAgIHZtbHMudTE2ICAgICAgICBxMTAsIHE5LCAgZDBbMV0KKyAgICAgICAgdm1scy51MTYgICAgICAgIHExMSwgcTEyLCBkMVswXQorICAgICAgICB2bWxhLnUxNiAgICAgICAgcTEwLCBxOCwgIGQwWzBdCisgICAgICAgIHZtbGEudTE2ICAgICAgICBxMTEsIHExMywgZDFbMV0KKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHExMSwgcTEwLCBxMTEKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIFxkMCwgcTExLCAjNworLmVuZG0KKworLm1hY3JvICB2cDhfZXBlbDhfdjZfeTIgZDAsIGQxLCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNgorICAgICAgICB2bW92bC51OCAgICAgICAgcTEwLCBcczAKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMSwgXHMzCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTQsIFxzNgorICAgICAgICB2bW92bC51OCAgICAgICAgcTksICBcczEKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMiwgXHM0CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxOCwgIFxzMgorICAgICAgICB2bW92bC51OCAgICAgICAgcTEzLCBcczUKKyAgICAgICAgdm11bC51MTYgICAgICAgIHExMCwgcTEwLCBkMFswXQorICAgICAgICB2bXVsLnUxNiAgICAgICAgcTE1LCBxMTEsIGQwWzNdCisgICAgICAgIHZtdWwudTE2ICAgICAgICBxMTEsIHExMSwgZDBbMl0KKyAgICAgICAgdm11bC51MTYgICAgICAgIHExNCwgcTE0LCBkMVsxXQorICAgICAgICB2bWxzLnUxNiAgICAgICAgcTEwLCBxOSwgIGQwWzFdCisgICAgICAgIHZtbHMudTE2ICAgICAgICBxMTUsIHExMiwgZDFbMF0KKyAgICAgICAgdm1scy51MTYgICAgICAgIHExMSwgcTgsICBkMFsxXQorICAgICAgICB2bWxzLnUxNiAgICAgICAgcTE0LCBxMTMsIGQxWzBdCisgICAgICAgIHZtbGEudTE2ICAgICAgICBxMTAsIHE4LCAgZDBbMl0KKyAgICAgICAgdm1sYS51MTYgICAgICAgIHExNSwgcTEzLCBkMVsxXQorICAgICAgICB2bWxhLnUxNiAgICAgICAgcTExLCBxOSwgIGQwWzBdCisgICAgICAgIHZtbGEudTE2ICAgICAgICBxMTQsIHExMiwgZDBbM10KKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHExNSwgcTEwLCBxMTUKKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHExNCwgcTExLCBxMTQKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIFxkMCwgcTE1LCAjNworICAgICAgICB2cXJzaHJ1bi5zMTYgICAgXGQxLCBxMTQsICM3CisuZW5kbQorCisubWFjcm8gIHZwOF9lcGVsOF9oNCAgICBkLCAgIGEsICAgYgorICAgICAgICB2ZXh0LjggICAgICAgICAgZDI4LCBcYSwgIFxiLCAgIzEKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE5LCAgXGEKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQyOSwgXGEsICBcYiwgICMyCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTAsIGQyOAorICAgICAgICB2ZXh0LjggICAgICAgICAgZDMwLCBcYSwgIFxiLCAgIzMKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMSwgZDI5CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTIsIGQzMAorICAgICAgICB2bXVsLnUxNiAgICAgICAgcTEwLCBxMTAsIGQwWzJdCisgICAgICAgIHZtdWwudTE2ICAgICAgICBxMTEsIHExMSwgZDBbM10KKyAgICAgICAgdm1scy51MTYgICAgICAgIHExMCwgcTksICBkMFsxXQorICAgICAgICB2bWxzLnUxNiAgICAgICAgcTExLCBxMTIsIGQxWzBdCisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMTEsIHExMCwgcTExCisgICAgICAgIHZxcnNocnVuLnMxNiAgICBcZCwgIHExMSwgIzcKKy5lbmRtCisKKy5tYWNybyAgdnA4X2VwZWw4X3Y0X3kyIGQwLCAgZDEsICBzMCwgIHMxLCAgczIsICBzMywgIHM0CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxOSwgIFxzMAorICAgICAgICB2bW92bC51OCAgICAgICAgcTEwLCBcczEKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMSwgXHMyCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTIsIFxzMworICAgICAgICB2bW92bC51OCAgICAgICAgcTEzLCBcczQKKyAgICAgICAgdm11bC51MTYgICAgICAgIHE4LCAgcTEwLCBkMFsyXQorICAgICAgICB2bXVsLnUxNiAgICAgICAgcTE0LCBxMTEsIGQwWzNdCisgICAgICAgIHZtdWwudTE2ICAgICAgICBxMTEsIHExMSwgZDBbMl0KKyAgICAgICAgdm11bC51MTYgICAgICAgIHExNSwgcTEyLCBkMFszXQorICAgICAgICB2bWxzLnUxNiAgICAgICAgcTgsICBxOSwgIGQwWzFdCisgICAgICAgIHZtbHMudTE2ICAgICAgICBxMTQsIHExMiwgZDFbMF0KKyAgICAgICAgdm1scy51MTYgICAgICAgIHExMSwgcTEwLCBkMFsxXQorICAgICAgICB2bWxzLnUxNiAgICAgICAgcTE1LCBxMTMsIGQxWzBdCisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxOCwgIHE4LCAgcTE0CisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMTEsIHExMSwgcTE1CisgICAgICAgIHZxcnNocnVuLnMxNiAgICBcZDAsIHE4LCAgIzcKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIFxkMSwgcTExLCAjNworLmVuZG0KKworZnVuY3Rpb24gZmZfcHV0X3ZwOF9lcGVsMTZfdjZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgIGxzbCAjMQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKworICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICM4MF0gICAgICAgICAgQCBteQorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzdWJwZWxfZmlsdGVycy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM3Ml0gICAgICAgICAgQCBoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIGxyLCAgcjQsIGxzbCAjNAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorMToKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMi1kM30sICBbcjJdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2Q0LWQ1fSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDYtZDd9LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkOC1kOX0sICBbcjJdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QxMC1kMTF9LFtyMl0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDEyLWQxM30sW3IyXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTQtZDE1fSxbcjJdCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjMsICBsc2wgIzIKKworICAgICAgICB2cDhfZXBlbDhfdjZfeTIgZDIsICBkNCwgIGQyLCAgZDQsICBkNiwgIGQ4LCAgZDEwLCBkMTIsIGQxNAorICAgICAgICB2cDhfZXBlbDhfdjZfeTIgZDMsICBkNSwgIGQzLCAgZDUsICBkNywgIGQ5LCAgZDExLCBkMTMsIGQxNQorCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDItZDN9LCAgW3IwLDoxMjhdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2Q0LWQ1fSwgIFtyMCw6MTI4XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCxwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHV0X3ZwOF9lcGVsMTZfaDZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICAjMgorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LGxyfQorCisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzEyXSAgICAgICAgICBAIG14CisgICAgICAgIG1vdnJlbCAgICAgICAgICBsciwgIHN1YnBlbF9maWx0ZXJzLTE2CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzhdICAgICAgICAgICBAIGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgbHIsICByNCwgbHNsICM0CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdCisxOgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyLWQ0fSwgIFtyMl0sIHIzCisKKyAgICAgICAgdnA4X2VwZWwxNl9oNiAgIGQyLCAgZDMsICBkMiwgIGQzLCAgZDQsICBxMSwgIHEyCisKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMi1kM30sIFtyMCw6MTI4XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2VwZWwxNl9oNnY2X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjMsICBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICAjMgorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge2Q4LWQ5fQorCisgICAgICAgIEAgZmlyc3QgcGFzcyAoaG9yaXpvbnRhbCk6CisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzI4XSAgICAgICAgICBAIG14CisgICAgICAgIG1vdnJlbCAgICAgICAgICBsciwgIHN1YnBlbF9maWx0ZXJzLTE2CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzI0XSAgICAgICAgICBAIGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgbHIsICByNCwgbHNsICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzMzNisxNgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICBzcCwgICMxNQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMTIsICM1CisgICAgICAgIGJpYyAgICAgICAgICAgICBsciwgIGxyLCAgIzE1CisxOgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyLGQzLGQ0fSwgW3IyXSwgcjMKKworICAgICAgICB2cDhfZXBlbDE2X2g2ICAgZDIsICBkMywgIGQyLCAgZDMsICBkNCwgIHExLCAgcTIKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyLWQzfSwgW2xyLDoxMjhdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIEAgc2Vjb25kIHBhc3MgKHZlcnRpY2FsKToKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMzM2KzE2KzMyXSAgIEAgbXkKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgc3VicGVsX2ZpbHRlcnMtMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjMzM2KzE2KzI0XSAgIEAgaAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICBsciwgIHI0LCBsc2wgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIGxyLCAgc3AsICAjMTUKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sICAgICBbcjQsOjEyOF0KKyAgICAgICAgYmljICAgICAgICAgICAgIGxyLCAgbHIsICAjMTUKKzI6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDItZDV9LCAgW2xyLDoxMjhdIQorICAgICAgICB2bGQxLjggICAgICAgICAge2Q2LWQ5fSwgIFtsciw6MTI4XSEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjgtZDMxfSxbbHIsOjEyOF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIGxyLCAgbHIsICAjNDgKKworICAgICAgICB2cDhfZXBlbDhfdjYgICAgZDIsIGQyLCBkNCwgZDYsIGQ4LCBkMjgsIGQzMAorICAgICAgICB2cDhfZXBlbDhfdjYgICAgZDMsIGQzLCBkNSwgZDcsIGQ5LCBkMjksIGQzMQorCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDItZDN9LCBbcjAsOjEyOF0sIHIxCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDJiCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjMzM2KzE2CisgICAgICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDl9CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQscGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3B1dF92cDhfZXBlbDhfdjZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgIGxzbCAjMQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LGxyfQorCisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzE2XSAgICAgICAgICBAIG15CisgICAgICAgIG1vdnJlbCAgICAgICAgICBsciwgIHN1YnBlbF9maWx0ZXJzLTE2CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzhdICAgICAgICAgICBAIGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgbHIsICByNCwgbHNsICM0CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdCisxOgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyfSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNH0sICBbcjJdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2Q1fSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkN30sICBbcjJdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QyOH0sIFtyMl0KKworICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIzLCAgbHNsICMyCisKKyAgICAgICAgdnA4X2VwZWw4X3Y2X3kyIGQyLCAgZDMsICBkMiwgIGQzLCAgZDQsICBkNSwgIGQ2LCAgZDcsICBkMjgKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgW3IwLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDN9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2VwZWw4X2g2X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzIKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCxscn0KKworICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMxMl0gICAgICAgICAgQCBteAorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzdWJwZWxfZmlsdGVycy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM4XSAgICAgICAgICAgQCBoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIGxyLCAgcjQsIGxzbCAjNAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorMToKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMixkM30sIFtyMl0sIHIzCisKKyAgICAgICAgdnA4X2VwZWw4X2g2ICAgIGQyLCAgZDIsICBkMworCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDJ9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2VwZWw4X2g2djZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICMyCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsbHJ9CisKKyAgICAgICAgQCBmaXJzdCBwYXNzIChob3Jpem9udGFsKToKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMTJdICAgICAgICAgIEAgbXgKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgc3VicGVsX2ZpbHRlcnMtMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjOF0gICAgICAgICAgIEAgaAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICBsciwgIHI0LCBsc2wgIzQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMTY4KzE2CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdCisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHNwLCAgIzE1CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzUKKyAgICAgICAgYmljICAgICAgICAgICAgIGxyLCAgbHIsICAjMTUKKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIsZDN9LCBbcjJdLCByMworCisgICAgICAgIHZwOF9lcGVsOF9oNiAgICBkMiwgIGQyLCAgZDMKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgW2xyLDo2NF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgQCBzZWNvbmQgcGFzcyAodmVydGljYWwpOgorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMxNjgrMTYrMTZdICAgQCBteQorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzdWJwZWxfZmlsdGVycy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICMxNjgrMTYrOF0gICAgQCBoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIGxyLCAgcjQsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICBzcCwgICMxNQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorICAgICAgICBiaWMgICAgICAgICAgICAgbHIsICBsciwgICMxNQorMjoKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMi1kNX0sICBbbHIsOjEyOF0hCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDYtZDd9LCAgW2xyLDoxMjhdIQorICAgICAgICB2bGQxLjggICAgICAgICAge2QzMH0sICAgIFtsciw6NjRdCisgICAgICAgIHN1YiAgICAgICAgICAgICBsciwgIGxyLCAgIzMyCisKKyAgICAgICAgdnA4X2VwZWw4X3Y2X3kyIGQyLCAgZDMsICBkMiwgIGQzLCAgZDQsICBkNSwgIGQ2LCAgZDcsICBkMzAKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgW3IwLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDN9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICBibmUgICAgICAgICAgICAgMmIKKworICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMxNjgrMTYKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCxwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHV0X3ZwOF9lcGVsOF92NF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIzCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsbHJ9CisKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMTZdICAgICAgICAgIEAgbXkKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgc3VicGVsX2ZpbHRlcnMtMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjOF0gICAgICAgICAgIEAgaAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICBsciwgIHI0LCBsc2wgIzQKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sICAgICBbcjQsOjEyOF0KKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkM30sICAgICBbcjJdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2Q0fSwgICAgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNn0sICAgICBbcjJdCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjMsICBsc2wgIzEKKworICAgICAgICB2cDhfZXBlbDhfdjRfeTIgZDIsICBkMywgIGQyLCAgZDMsICBkNCwgIGQ1LCAgZDYKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgW3IwLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDN9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2VwZWw4X2g0X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCxscn0KKworICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMxMl0gICAgICAgICAgQCBteAorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzdWJwZWxfZmlsdGVycy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM4XSAgICAgICAgICAgQCBoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIGxyLCAgcjQsIGxzbCAjNAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorMToKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMixkM30sIFtyMl0sIHIzCisKKyAgICAgICAgdnA4X2VwZWw4X2g0ICAgIGQyLCAgZDIsICBkMworCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDJ9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2VwZWw4X2g0djRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMworICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICMxCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsbHJ9CisKKyAgICAgICAgQCBmaXJzdCBwYXNzIChob3Jpem9udGFsKToKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMTJdICAgICAgICAgIEAgbXgKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgc3VicGVsX2ZpbHRlcnMtMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjOF0gICAgICAgICAgIEAgaAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICBsciwgIHI0LCBsc2wgIzQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMTY4KzE2CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdCisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHNwLCAgIzE1CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzMKKyAgICAgICAgYmljICAgICAgICAgICAgIGxyLCAgbHIsICAjMTUKKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIsZDN9LCBbcjJdLCByMworCisgICAgICAgIHZwOF9lcGVsOF9oNCAgICBkMiwgIGQyLCAgZDMKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgW2xyLDo2NF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgQCBzZWNvbmQgcGFzcyAodmVydGljYWwpOgorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMxNjgrMTYrMTZdICAgQCBteQorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzdWJwZWxfZmlsdGVycy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICMxNjgrMTYrOF0gICAgQCBoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIGxyLCAgcjQsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICBzcCwgICMxNQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorICAgICAgICBiaWMgICAgICAgICAgICAgbHIsICBsciwgICMxNQorMjoKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMi1kNX0sICBbbHIsOjEyOF0hCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCAgICAgW2xyLDo2NF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIGxyLCAgbHIsICAjMTYKKworICAgICAgICB2cDhfZXBlbDhfdjRfeTIgZDIsICBkMywgIGQyLCAgZDMsICBkNCwgIGQ1LCAgZDYKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgICAgIFtyMCw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QzfSwgICAgIFtyMCw6NjRdLCByMQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGJuZSAgICAgICAgICAgICAyYgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzE2OCsxNgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2VwZWw4X2g2djRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMworICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICMyCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsbHJ9CisKKyAgICAgICAgQCBmaXJzdCBwYXNzIChob3Jpem9udGFsKToKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMTJdICAgICAgICAgIEAgbXgKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgc3VicGVsX2ZpbHRlcnMtMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjOF0gICAgICAgICAgIEAgaAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICBsciwgIHI0LCBsc2wgIzQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMTY4KzE2CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdCisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHNwLCAgIzE1CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzMKKyAgICAgICAgYmljICAgICAgICAgICAgIGxyLCAgbHIsICAjMTUKKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIsZDN9LCBbcjJdLCByMworCisgICAgICAgIHZwOF9lcGVsOF9oNiAgICBkMiwgIGQyLCAgZDMKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgW2xyLDo2NF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgQCBzZWNvbmQgcGFzcyAodmVydGljYWwpOgorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMxNjgrMTYrMTZdICAgQCBteQorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzdWJwZWxfZmlsdGVycy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICMxNjgrMTYrOF0gICAgQCBoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIGxyLCAgcjQsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICBzcCwgICMxNQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorICAgICAgICBiaWMgICAgICAgICAgICAgbHIsICBsciwgICMxNQorMjoKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMi1kNX0sICBbbHIsOjEyOF0hCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCAgICAgW2xyLDo2NF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIGxyLCAgbHIsICAjMTYKKworICAgICAgICB2cDhfZXBlbDhfdjRfeTIgZDIsICBkMywgIGQyLCAgZDMsICBkNCwgIGQ1LCAgZDYKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgICAgIFtyMCw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QzfSwgICAgIFtyMCw6NjRdLCByMQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGJuZSAgICAgICAgICAgICAyYgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzE2OCsxNgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2VwZWw4X2g0djZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICMxCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsbHJ9CisKKyAgICAgICAgQCBmaXJzdCBwYXNzIChob3Jpem9udGFsKToKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMTJdICAgICAgICAgIEAgbXgKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgc3VicGVsX2ZpbHRlcnMtMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjOF0gICAgICAgICAgIEAgaAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICBsciwgIHI0LCBsc2wgIzQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMTY4KzE2CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdCisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHNwLCAgIzE1CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzUKKyAgICAgICAgYmljICAgICAgICAgICAgIGxyLCAgbHIsICAjMTUKKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIsZDN9LCBbcjJdLCByMworCisgICAgICAgIHZwOF9lcGVsOF9oNCAgICBkMiwgIGQyLCAgZDMKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgW2xyLDo2NF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgQCBzZWNvbmQgcGFzcyAodmVydGljYWwpOgorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMxNjgrMTYrMTZdICAgQCBteQorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzdWJwZWxfZmlsdGVycy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICMxNjgrMTYrOF0gICAgQCBoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIGxyLCAgcjQsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICBzcCwgICMxNQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorICAgICAgICBiaWMgICAgICAgICAgICAgbHIsICBsciwgICMxNQorMjoKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMi1kNX0sICBbbHIsOjEyOF0hCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDYtZDd9LCAgW2xyLDoxMjhdIQorICAgICAgICB2bGQxLjggICAgICAgICAge2QzMH0sICAgIFtsciw6NjRdCisgICAgICAgIHN1YiAgICAgICAgICAgICBsciwgIGxyLCAgIzMyCisKKyAgICAgICAgdnA4X2VwZWw4X3Y2X3kyIGQyLCAgZDMsICBkMiwgIGQzLCAgZDQsICBkNSwgIGQ2LCAgZDcsICBkMzAKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgW3IwLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDN9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICBibmUgICAgICAgICAgICAgMmIKKworICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMxNjgrMTYKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCxwY30KK2VuZGZ1bmMKKworLmx0b3JnCisKK2Z1bmN0aW9uIGZmX3B1dF92cDhfZXBlbDRfdjZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgIGxzbCAjMQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LGxyfQorCisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzE2XSAgICAgICAgICBAIG15CisgICAgICAgIG1vdnJlbCAgICAgICAgICBsciwgIHN1YnBlbF9maWx0ZXJzLTE2CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzhdICAgICAgICAgICBAIGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgbHIsICByNCwgbHNsICM0CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdCisxOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyW119LCAgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDNbXX0sICAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNFtdfSwgICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2Q1W119LCAgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDZbXX0sICAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkN1tdfSwgICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QyOFtdfSwgIFtyMl0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgIGxzbCAjMgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyWzFdfSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDNbMV19LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNFsxXX0sICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2Q1WzFdfSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDZbMV19LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkN1sxXX0sICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QyOFsxXX0sIFtyMl0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgIGxzbCAjMgorCisgICAgICAgIHZwOF9lcGVsOF92Nl95MiBkMiwgIGQzLCAgZDIsICBkMywgIGQ0LCAgZDUsICBkNiwgIGQ3LCAgZDI4CisKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlsxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1sxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2VwZWw0X2g2X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzIKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCxscn0KKworICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMxMl0gICAgICAgICAgQCBteAorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzdWJwZWxfZmlsdGVycy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM4XSAgICAgICAgICAgQCBoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIGxyLCAgcjQsIGxzbCAjNAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorMToKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMX0sICAgICBbcjJdLCByMworICAgICAgICB2cDhfZXBlbDhfaDYgICAgZDIsICBkMiwgIGQzCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCxwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHV0X3ZwOF9lcGVsNF9oNnY2X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjMsICBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICAjMgorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LGxyfQorCisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzEyXSAgICAgICAgICBAIG14CisgICAgICAgIG1vdnJlbCAgICAgICAgICBsciwgIHN1YnBlbF9maWx0ZXJzLTE2CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzhdICAgICAgICAgICBAIGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgbHIsICByNCwgbHNsICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzUyKzE2CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdCisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHNwLCAgIzE1CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzUKKyAgICAgICAgYmljICAgICAgICAgICAgIGxyLCAgbHIsICAjMTUKKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdnA4X2VwZWw4X2g2ICAgIGQyLCAgZDIsICBkMworICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSwgIFtsciw6MzJdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzUyKzE2KzE2XSAgICBAIG15CisgICAgICAgIG1vdnJlbCAgICAgICAgICBsciwgIHN1YnBlbF9maWx0ZXJzLTE2CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzUyKzE2KzhdICAgICBAIGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgbHIsICByNCwgbHNsICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHNwLCAgIzE1CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdCisgICAgICAgIGJpYyAgICAgICAgICAgICBsciwgIGxyLCAgIzE1CisyOgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyLWQzfSwgIFtsciw6MTI4XSEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNn0sICAgICBbbHIsOjY0XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjhbXX0sICBbbHIsOjMyXQorICAgICAgICBzdWIgICAgICAgICAgICAgbHIsICBsciwgICMxNgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0LWQ1fSwgIFtscl0hCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDd9LCAgICAgW2xyLDo2NF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI4WzFdfSwgW2xyLDozMl0KKyAgICAgICAgc3ViICAgICAgICAgICAgIGxyLCAgbHIsICAjMTYKKyAgICAgICAgdnRybi4zMiAgICAgICAgIHExLCAgcTIKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQ2LCAgZDcKKyAgICAgICAgdnA4X2VwZWw4X3Y2X3kyIGQyLCAgZDMsICBkMiwgIGQ0LCAgZDMsICBkNSwgIGQ2LCAgZDcsICBkMjgKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlsxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1sxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBibmUgICAgICAgICAgICAgMmIKKworICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICM1MisxNgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2VwZWw0X2g0djZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICMxCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsbHJ9CisKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMTJdICAgICAgICAgIEAgbXgKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgc3VicGVsX2ZpbHRlcnMtMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjOF0gICAgICAgICAgIEAgaAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICBsciwgIHI0LCBsc2wgIzQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjNTIrMTYKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sICAgICBbcjQsOjEyOF0KKyAgICAgICAgYWRkICAgICAgICAgICAgIGxyLCAgc3AsICAjMTUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjEyLCAjNQorICAgICAgICBiaWMgICAgICAgICAgICAgbHIsICBsciwgICMxNQorMToKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMn0sICAgICBbcjJdLCByMworICAgICAgICB2cDhfZXBlbDhfaDQgICAgZDIsICBkMiwgIGQyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCAgW2xyLDozMl0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjNTIrMTYrMTZdICAgIEAgbXkKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgc3VicGVsX2ZpbHRlcnMtMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjNTIrMTYrOF0gICAgIEAgaAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICBsciwgIHI0LCBsc2wgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIGxyLCAgc3AsICAjMTUKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sICAgICBbcjQsOjEyOF0KKyAgICAgICAgYmljICAgICAgICAgICAgIGxyLCAgbHIsICAjMTUKKzI6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDItZDN9LCAgW2xyLDoxMjhdIQorICAgICAgICB2bGQxLjggICAgICAgICAge2Q2fSwgICAgIFtsciw6NjRdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyOFtdfSwgIFtsciw6MzJdCisgICAgICAgIHN1YiAgICAgICAgICAgICBsciwgIGxyLCAgIzE2CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDQtZDV9LCAgW2xyXSEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkN30sICAgICBbbHIsOjY0XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjhbMV19LCBbbHIsOjMyXQorICAgICAgICBzdWIgICAgICAgICAgICAgbHIsICBsciwgICMxNgorICAgICAgICB2dHJuLjMyICAgICAgICAgcTEsICBxMgorICAgICAgICB2dHJuLjMyICAgICAgICAgZDYsICBkNworICAgICAgICB2cDhfZXBlbDhfdjZfeTIgZDIsICBkMywgIGQyLCAgZDQsICBkMywgIGQ1LCAgZDYsICBkNywgIGQyOAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QzWzBdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzFdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QzWzFdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICM0CisgICAgICAgIGJuZSAgICAgICAgICAgICAyYgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzUyKzE2CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQscGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3B1dF92cDhfZXBlbDRfaDZ2NF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIzCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzIKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCxscn0KKworICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMxMl0gICAgICAgICAgQCBteAorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzdWJwZWxfZmlsdGVycy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM4XSAgICAgICAgICAgQCBoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIGxyLCAgcjQsIGxzbCAjNAorICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICM0NCsxNgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICBzcCwgICMxNQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMTIsICMzCisgICAgICAgIGJpYyAgICAgICAgICAgICBsciwgIGxyLCAgIzE1CisxOgorICAgICAgICB2bGQxLjggICAgICAgICAge3ExfSwgICAgIFtyMl0sIHIzCisgICAgICAgIHZwOF9lcGVsOF9oNiAgICBkMiwgIGQyLCAgZDMKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sICBbbHIsOjMyXSEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICM0NCsxNisxNl0gICAgQCBteQorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzdWJwZWxfZmlsdGVycy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM0NCsxNis4XSAgICAgQCBoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIGxyLCAgcjQsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICBzcCwgICMxNQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorICAgICAgICBiaWMgICAgICAgICAgICAgbHIsICBsciwgICMxNQorMjoKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMi1kM30sICBbbHIsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDZbXX0sICAgW2xyLDozMl0KKyAgICAgICAgc3ViICAgICAgICAgICAgIGxyLCAgbHIsICAjOAorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0LWQ1fSwgIFtscl0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDZbMV19LCAgW2xyLDozMl0KKyAgICAgICAgc3ViICAgICAgICAgICAgIGxyLCAgbHIsICAjOAorICAgICAgICB2dHJuLjMyICAgICAgICAgcTEsICBxMgorICAgICAgICB2cDhfZXBlbDhfdjRfeTIgZDIsICBkMywgIGQyLCAgZDQsICBkMywgIGQ1LCAgZDYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlsxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1sxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBibmUgICAgICAgICAgICAgMmIKKworICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICM0NCsxNgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2VwZWw0X2g0X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCxscn0KKworICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMxMl0gICAgICAgICAgQCBteAorICAgICAgICBtb3ZyZWwgICAgICAgICAgbHIsICBzdWJwZWxfZmlsdGVycy0xNgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM4XSAgICAgICAgICAgQCBoCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIGxyLCAgcjQsIGxzbCAjNAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XQorMToKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMn0sICAgICBbcjJdLCByMworICAgICAgICB2cDhfZXBlbDhfaDQgICAgZDIsICBkMiwgIGQyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCxwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHV0X3ZwOF9lcGVsNF92NF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIzCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsbHJ9CisKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMTZdICAgICAgICAgIEAgbXkKKyAgICAgICAgbW92cmVsICAgICAgICAgIGxyLCAgc3VicGVsX2ZpbHRlcnMtMTYKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjOF0gICAgICAgICAgIEAgaAorICAgICAgICBhZGQgICAgICAgICAgICAgcjQsICBsciwgIHI0LCBsc2wgIzQKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sICAgICBbcjQsOjEyOF0KKzE6CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDJbXX0sICAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkM1tdfSwgICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0W119LCAgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDVbXX0sICAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNltdfSwgICBbcjJdCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjMsICBsc2wgIzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMlsxXX0sICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QzWzFdfSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDRbMV19LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNVsxXX0sICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2Q2WzFdfSwgIFtyMl0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgIGxzbCAjMQorCisgICAgICAgIHZwOF9lcGVsOF92NF95MiBkMiwgIGQzLCAgZDIsICBkMywgIGQ0LCAgZDUsICBkNgorCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMF19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzQKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCxwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHV0X3ZwOF9lcGVsNF9oNHY0X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICAjMQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LGxyfQorCisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzEyXSAgICAgICAgICBAIG14CisgICAgICAgIG1vdnJlbCAgICAgICAgICBsciwgIHN1YnBlbF9maWx0ZXJzLTE2CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzhdICAgICAgICAgICBAIGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgbHIsICByNCwgbHNsICM0CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzQ0KzE2CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdCisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHNwLCAgIzE1CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzMKKyAgICAgICAgYmljICAgICAgICAgICAgIGxyLCAgbHIsICAjMTUKKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdnA4X2VwZWw4X2g0ICAgIGQyLCAgZDIsICBkMworICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSwgIFtsciw6MzJdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzQ0KzE2KzE2XSAgICBAIG15CisgICAgICAgIG1vdnJlbCAgICAgICAgICBsciwgIHN1YnBlbF9maWx0ZXJzLTE2CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzQ0KzE2KzhdICAgICBAIGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgbHIsICByNCwgbHNsICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICBsciwgIHNwLCAgIzE1CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdCisgICAgICAgIGJpYyAgICAgICAgICAgICBsciwgIGxyLCAgIzE1CisyOgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyLWQzfSwgIFtsciw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNltdfSwgICBbbHIsOjMyXQorICAgICAgICBzdWIgICAgICAgICAgICAgbHIsICBsciwgICM4CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDQtZDV9LCAgW2xyXSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNlsxXX0sICBbbHIsOjMyXQorICAgICAgICBzdWIgICAgICAgICAgICAgbHIsICBsciwgICM4CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBxMSwgIHEyCisgICAgICAgIHZwOF9lcGVsOF92NF95MiBkMiwgIGQzLCAgZDIsICBkNCwgIGQzLCAgZDUsICBkNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QzWzBdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzFdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QzWzFdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICM0CisgICAgICAgIGJuZSAgICAgICAgICAgICAyYgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzQ0KzE2CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQscGN9CitlbmRmdW5jCisKK0Agbm90ZTogd29yc3QgY2FzZSBzdW0gb2YgYWxsIDYtdGFwIGZpbHRlciB2YWx1ZXMgKiAyNTUgaXMgMHg3ZjgwIHNvIDE2IGJpdAorQCBhcml0aG1hdGljIGNhbiBiZSB1c2VkIHRvIGFwcGx5IGZpbHRlcnMKK2NvbnN0ICAgc3VicGVsX2ZpbHRlcnMsIGFsaWduPTQKKyAgICAgICAgLnNob3J0ICAgICAwLCAgIDYsIDEyMywgIDEyLCAgIDEsICAgMCwgICAwLCAgIDAKKyAgICAgICAgLnNob3J0ICAgICAyLCAgMTEsIDEwOCwgIDM2LCAgIDgsICAgMSwgICAwLCAgIDAKKyAgICAgICAgLnNob3J0ICAgICAwLCAgIDksICA5MywgIDUwLCAgIDYsICAgMCwgICAwLCAgIDAKKyAgICAgICAgLnNob3J0ICAgICAzLCAgMTYsICA3NywgIDc3LCAgMTYsICAgMywgICAwLCAgIDAKKyAgICAgICAgLnNob3J0ICAgICAwLCAgIDYsICA1MCwgIDkzLCAgIDksICAgMCwgICAwLCAgIDAKKyAgICAgICAgLnNob3J0ICAgICAxLCAgIDgsICAzNiwgMTA4LCAgMTEsICAgMiwgICAwLCAgIDAKKyAgICAgICAgLnNob3J0ICAgICAwLCAgIDEsICAxMiwgMTIzLCAgIDYsICAgMCwgICAwLCAgIDAKK2VuZGNvbnN0CisKKy8qIEJpbGluZWFyIE1DICovCisKK2Z1bmN0aW9uIGZmX3B1dF92cDhfYmlsaW4xNl9oX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzRdICAgICAgICAgICBAIG14CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMCwgIHIxMgorICAgICAgICByc2IgICAgICAgICAgICAgcjEyLCByMTIsICM4CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMSwgIHIxMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdICAgICAgICAgICAgICAgQCBoCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDItZDR9LCAgW3IyXSwgcjMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHEyLCAgcTEsICBxMiwgICMxCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOCwgIGQyLCAgZDEKKyAgICAgICAgdm1sYWwudTggICAgICAgIHE4LCAgZDQsICBkMAorICAgICAgICB2bGQxLjggICAgICAgICAge2QxOC1kMjB9LFtyMl0sIHIzCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxMywgIGQzLCAgZDEKKyAgICAgICAgdm1sYWwudTggICAgICAgIHEzLCAgZDUsICBkMAorICAgICAgICB2ZXh0LjggICAgICAgICAgcTEwLCBxOSwgIHExMCwgIzEKKyAgICAgICAgdm11bGwudTggICAgICAgIHExMSwgZDE4LCBkMQorICAgICAgICB2bWxhbC51OCAgICAgICAgcTExLCBkMjAsIGQwCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxMTIsIGQxOSwgZDEKKyAgICAgICAgdm1sYWwudTggICAgICAgIHExMiwgZDIxLCBkMAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDQsICBxOCwgICMzCisgICAgICAgIHZyc2hybi51MTYgICAgICBkNSwgIHEzLCAgIzMKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQ2LCAgcTExLCAjMworICAgICAgICB2cnNocm4udTE2ICAgICAgZDcsICBxMTIsICMzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCAgICAgW3IwLDoxMjhdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge3EzfSwgICAgIFtyMCw6MTI4XSwgcjEKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3B1dF92cDhfYmlsaW4xNl92X25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzhdICAgICAgICAgICBAIG15CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMCwgIHIxMgorICAgICAgICByc2IgICAgICAgICAgICAgcjEyLCByMTIsICM4CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMSwgIHIxMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdICAgICAgICAgICAgICAgQCBoCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCAgICAgW3IyXSwgcjMKKzE6CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMn0sICAgICBbcjJdLCByMworICAgICAgICB2bXVsbC51OCAgICAgICAgcTMsICBkMiwgIGQxCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxMywgIGQ0LCAgZDAKKyAgICAgICAgdm11bGwudTggICAgICAgIHE4LCAgZDMsICBkMQorICAgICAgICB2bWxhbC51OCAgICAgICAgcTgsICBkNSwgIGQwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdm11bGwudTggICAgICAgIHE5LCAgZDQsICBkMQorICAgICAgICB2bWxhbC51OCAgICAgICAgcTksICBkMiwgIGQwCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQ1LCAgZDEKKyAgICAgICAgdm1sYWwudTggICAgICAgIHExMCwgZDMsICBkMAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDQsICBxMywgICMzCisgICAgICAgIHZyc2hybi51MTYgICAgICBkNSwgIHE4LCAgIzMKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQ2LCAgcTksICAjMworICAgICAgICB2cnNocm4udTE2ICAgICAgZDcsICBxMTAsICMzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTJ9LCAgICAgW3IwLDoxMjhdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge3EzfSwgICAgIFtyMCw6MTI4XSwgcjEKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3B1dF92cDhfYmlsaW4xNl9odl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM0XSAgICAgICAgICAgQCBteAorICAgICAgICB2ZHVwLjggICAgICAgICAgZDAsICByMTIKKyAgICAgICAgcnNiICAgICAgICAgICAgIHIxMiwgcjEyLCAjOAorICAgICAgICB2ZHVwLjggICAgICAgICAgZDEsICByMTIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjOF0gICAgICAgICAgIEAgbXkKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQyLCAgcjEyCisgICAgICAgIHJzYiAgICAgICAgICAgICByMTIsIHIxMiwgIzgKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQzLCAgcjEyCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0gICAgICAgICAgICAgICBAIGgKKworICAgICAgICB2bGQxLjggICAgICAgICAge2Q0LWQ2fSwgIFtyMl0sIHIzCisgICAgICAgIHZleHQuOCAgICAgICAgICBxMywgIHEyLCAgcTMsICAjMQorICAgICAgICB2bXVsbC51OCAgICAgICAgcTgsICBkNCwgIGQxCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxOCwgIGQ2LCAgZDAKKyAgICAgICAgdm11bGwudTggICAgICAgIHE5LCAgZDUsICBkMQorICAgICAgICB2bWxhbC51OCAgICAgICAgcTksICBkNywgIGQwCisgICAgICAgIHZyc2hybi51MTYgICAgICBkNCwgIHE4LCAgIzMKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQ1LCAgcTksICAjMworMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxOC1kMjB9LFtyMl0sIHIzCisgICAgICAgIHZleHQuOCAgICAgICAgICBxMTAsIHE5LCAgcTEwLCAjMQorICAgICAgICB2bXVsbC51OCAgICAgICAgcTExLCBkMTgsIGQxCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxMTEsIGQyMCwgZDAKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjYtZDI4fSxbcjJdLCByMworICAgICAgICB2bXVsbC51OCAgICAgICAgcTEyLCBkMTksIGQxCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxMTIsIGQyMSwgZDAKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHExNCwgcTEzLCBxMTQsICMxCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOCwgIGQyNiwgZDEKKyAgICAgICAgdm1sYWwudTggICAgICAgIHE4LCAgZDI4LCBkMAorICAgICAgICB2bXVsbC51OCAgICAgICAgcTksICBkMjcsIGQxCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxOSwgIGQyOSwgZDAKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQ2LCAgcTExLCAjMworICAgICAgICB2cnNocm4udTE2ICAgICAgZDcsICBxMTIsICMzCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxMTIsIGQ0LCAgZDMKKyAgICAgICAgdm1sYWwudTggICAgICAgIHExMiwgZDYsICBkMgorICAgICAgICB2bXVsbC51OCAgICAgICAgcTE1LCBkNSwgIGQzCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxMTUsIGQ3LCAgZDIKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQ0LCAgcTgsICAjMworICAgICAgICB2cnNocm4udTE2ICAgICAgZDUsICBxOSwgICMzCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQ2LCAgZDMKKyAgICAgICAgdm1sYWwudTggICAgICAgIHExMCwgZDQsICBkMgorICAgICAgICB2bXVsbC51OCAgICAgICAgcTExLCBkNywgIGQzCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxMTEsIGQ1LCAgZDIKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQyNCwgcTEyLCAjMworICAgICAgICB2cnNocm4udTE2ICAgICAgZDI1LCBxMTUsICMzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTEyfSwgICAgW3IwLDoxMjhdLCByMQorICAgICAgICB2cnNocm4udTE2ICAgICAgZDIwLCBxMTAsICMzCisgICAgICAgIHZyc2hybi51MTYgICAgICBkMjEsIHExMSwgIzMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMTB9LCAgICBbcjAsOjEyOF0sIHIxCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2JpbGluOF9oX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzRdICAgICAgICAgICBAIG14CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMCwgIHIxMgorICAgICAgICByc2IgICAgICAgICAgICAgcjEyLCByMTIsICM4CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMSwgIHIxMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdICAgICAgICAgICAgICAgQCBoCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQzLCAgZDIsICBkMywgICMxCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxMiwgIGQyLCAgZDEKKyAgICAgICAgdm1sYWwudTggICAgICAgIHEyLCAgZDMsICBkMAorICAgICAgICB2bGQxLjggICAgICAgICAge3EzfSwgICAgIFtyMl0sIHIzCisgICAgICAgIHZleHQuOCAgICAgICAgICBkNywgIGQ2LCAgZDcsICAjMQorICAgICAgICB2bXVsbC51OCAgICAgICAgcTgsICBkNiwgIGQxCisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxOCwgIGQ3LCAgZDAKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQ0LCAgcTIsICAjMworICAgICAgICB2cnNocm4udTE2ICAgICAgZDE2LCBxOCwgICMzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDR9LCAgICAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDE2fSwgICAgW3IwLDo2NF0sIHIxCisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wdXRfdnA4X2JpbGluOF92X25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzhdICAgICAgICAgICBAIG15CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMCwgIHIxMgorICAgICAgICByc2IgICAgICAgICAgICAgcjEyLCByMTIsICAjOAorICAgICAgICB2ZHVwLjggICAgICAgICAgZDEsICByMTIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXSAgICAgICAgICAgICAgIEAgaAorICAgICAgICB2bGQxLjggICAgICAgICAge2QyfSwgICAgIFtyMl0sIHIzCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdm11bGwudTggICAgICAgIHEyLCAgZDIsICBkMQorICAgICAgICB2bWxhbC51OCAgICAgICAgcTIsICBkMywgIGQwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdm11bGwudTggICAgICAgIHEzLCAgZDMsICBkMQorICAgICAgICB2bWxhbC51OCAgICAgICAgcTMsICBkMiwgIGQwCisgICAgICAgIHZyc2hybi51MTYgICAgICBkNCwgIHEyLCAgIzMKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQ2LCAgcTMsICAjMworICAgICAgICB2c3QxLjggICAgICAgICAge2Q0fSwgICAgIFtyMCw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2Q2fSwgICAgIFtyMCw6NjRdLCByMQorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHV0X3ZwOF9iaWxpbjhfaHZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjNF0gICAgICAgICAgIEAgbXgKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQwLCAgcjEyCisgICAgICAgIHJzYiAgICAgICAgICAgICByMTIsIHIxMiwgIzgKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQxLCAgcjEyCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzhdICAgICAgICAgICBAIG15CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMiwgIHIxMgorICAgICAgICByc2IgICAgICAgICAgICAgcjEyLCByMTIsICM4CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMywgIHIxMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdICAgICAgICAgICAgICAgQCBoCisKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMn0sICAgICBbcjJdLCByMworICAgICAgICB2ZXh0LjggICAgICAgICAgZDUsICBkNCwgIGQ1LCAgIzEKKyAgICAgICAgdm11bGwudTggICAgICAgIHE5LCAgZDQsICBkMQorICAgICAgICB2bWxhbC51OCAgICAgICAgcTksICBkNSwgIGQwCisgICAgICAgIHZyc2hybi51MTYgICAgICBkMjIsIHE5LCAgIzMKKzE6CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxM30sICAgICBbcjJdLCByMworICAgICAgICB2ZXh0LjggICAgICAgICAgZDcsICBkNiwgIGQ3LCAgIzEKKyAgICAgICAgdm11bGwudTggICAgICAgIHE4LCAgZDYsICBkMQorICAgICAgICB2bWxhbC51OCAgICAgICAgcTgsICBkNywgIGQwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ1LCAgZDQsICBkNSwgICMxCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOSwgIGQ0LCAgZDEKKyAgICAgICAgdm1sYWwudTggICAgICAgIHE5LCAgZDUsICBkMAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDE2LCBxOCwgICMzCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQyMiwgZDMKKyAgICAgICAgdm1sYWwudTggICAgICAgIHExMCwgZDE2LCBkMgorICAgICAgICB2cnNocm4udTE2ICAgICAgZDIyLCBxOSwgICMzCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxMTIsIGQxNiwgZDMKKyAgICAgICAgdm1sYWwudTggICAgICAgIHExMiwgZDIyLCBkMgorICAgICAgICB2cnNocm4udTE2ICAgICAgZDIwLCBxMTAsICMzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIwfSwgICAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZyc2hybi51MTYgICAgICBkMjMsIHExMiwgIzMKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjN9LCAgICBbcjAsOjY0XSwgcjEKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3B1dF92cDhfYmlsaW40X2hfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjNF0gICAgICAgICAgIEAgbXgKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQwLCAgcjEyCisgICAgICAgIHJzYiAgICAgICAgICAgICByMTIsIHIxMiwgIzgKKyAgICAgICAgdmR1cC44ICAgICAgICAgIGQxLCAgcjEyCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0gICAgICAgICAgICAgICBAIGgKKzE6CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMn0sICAgICBbcjJdLCByMworICAgICAgICB2ZXh0LjggICAgICAgICAgZDMsICBkMiwgIGQzLCAgIzEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNn0sICAgICBbcjJdLCByMworICAgICAgICB2ZXh0LjggICAgICAgICAgZDcsICBkNiwgIGQ3LCAgIzEKKyAgICAgICAgdnRybi4zMiAgICAgICAgIHExLCAgcTMKKyAgICAgICAgdm11bGwudTggICAgICAgIHEyLCAgZDIsICBkMQorICAgICAgICB2bWxhbC51OCAgICAgICAgcTIsICBkMywgIGQwCisgICAgICAgIHZyc2hybi51MTYgICAgICBkNCwgIHEyLCAgIzMKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNFswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNFsxXX0sIFtyMCw6MzJdLCByMQorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHV0X3ZwOF9iaWxpbjRfdl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM4XSAgICAgICAgICAgQCBteQorICAgICAgICB2ZHVwLjggICAgICAgICAgZDAsICByMTIKKyAgICAgICAgcnNiICAgICAgICAgICAgIHIxMiwgcjEyLCAjOAorICAgICAgICB2ZHVwLjggICAgICAgICAgZDEsICByMTIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXSAgICAgICAgICAgICAgIEAgaAorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyW119LCAgIFtyMl0sIHIzCisxOgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QzW119LCAgIFtyMl0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMlsxXX0sICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QzWzFdfSwgIFtyMl0sIHIzCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxMiwgIGQyLCAgZDEKKyAgICAgICAgdm1sYWwudTggICAgICAgIHEyLCAgZDMsICBkMAorICAgICAgICB2dHJuLjMyICAgICAgICAgZDMsICBkMgorICAgICAgICB2cnNocm4udTE2ICAgICAgZDQsICBxMiwgICMzCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMF19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3B1dF92cDhfYmlsaW40X2h2X25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzRdICAgICAgICAgICBAIG14CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMCwgIHIxMgorICAgICAgICByc2IgICAgICAgICAgICAgcjEyLCByMTIsICM4CisgICAgICAgIHZkdXAuOCAgICAgICAgICBkMSwgIHIxMgorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM4XSAgICAgICAgICAgQCBteQorICAgICAgICB2ZHVwLjggICAgICAgICAgZDIsICByMTIKKyAgICAgICAgcnNiICAgICAgICAgICAgIHIxMiwgcjEyLCAjOAorICAgICAgICB2ZHVwLjggICAgICAgICAgZDMsICByMTIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXSAgICAgICAgICAgICAgIEAgaAorCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDR9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ1LCAgZDQsICBkNCwgICMxCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOSwgIGQ0LCAgZDEKKyAgICAgICAgdm1sYWwudTggICAgICAgIHE5LCAgZDUsICBkMAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDIyLCBxOSwgICMzCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDZ9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ3LCAgZDYsICBkNiwgICMxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDR9LCAgICAgW3IyXSwgcjMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ1LCAgZDQsICBkNCwgICMxCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBxMywgIHEyCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxOCwgIGQ2LCAgZDEKKyAgICAgICAgdm1sYWwudTggICAgICAgIHE4LCAgZDcsICBkMAorICAgICAgICB2cnNocm4udTE2ICAgICAgZDE2LCBxOCwgICMzCisgICAgICAgIHZtdWxsLnU4ICAgICAgICBxMTAsIGQxNiwgZDIKKyAgICAgICAgdnRybi4zMiAgICAgICAgIGQyMiwgZDE2CisgICAgICAgIHZtbGFsLnU4ICAgICAgICBxMTAsIGQyMiwgZDMKKyAgICAgICAgdnJldjY0LjMyICAgICAgIGQyMiwgZDE2CisgICAgICAgIHZyc2hybi51MTYgICAgICBkMjAsIHExMCwgIzMKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjBbMF19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjBbMV19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hc3MuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Fzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMzdjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hc3MuYwpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIFNTQS9BU1MgY29tbW9uIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDEwICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYXNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworaW50IGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9udCwgaW50IGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvciwgaW50IGJhY2tfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm9sZCwgaW50IGl0YWxpYywgaW50IHVuZGVybGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGlnbm1lbnQpCit7CisgICAgYXZjdHgtPnN1YnRpdGxlX2hlYWRlciA9IGF2X2FzcHJpbnRmKAorICAgICAgICAgICAgICJbU2NyaXB0IEluZm9dXHJcbiIKKyAgICAgICAgICAgICAiOyBTY3JpcHQgZ2VuZXJhdGVkIGJ5IEZGbXBlZy9MYXZjJXNcclxuIgorICAgICAgICAgICAgICJTY3JpcHRUeXBlOiB2NC4wMCtcclxuIgorICAgICAgICAgICAgICJQbGF5UmVzWDogMzg0XHJcbiIKKyAgICAgICAgICAgICAiUGxheVJlc1k6IDI4OFxyXG4iCisgICAgICAgICAgICAgIlxyXG4iCisgICAgICAgICAgICAgIltWNCsgU3R5bGVzXVxyXG4iCisKKyAgICAgICAgICAgICAvKiBBU1N2NCBoZWFkZXIgKi8KKyAgICAgICAgICAgICAiRm9ybWF0OiBOYW1lLCAiCisgICAgICAgICAgICAgIkZvbnRuYW1lLCBGb250c2l6ZSwgIgorICAgICAgICAgICAgICJQcmltYXJ5Q29sb3VyLCBTZWNvbmRhcnlDb2xvdXIsIE91dGxpbmVDb2xvdXIsIEJhY2tDb2xvdXIsICIKKyAgICAgICAgICAgICAiQm9sZCwgSXRhbGljLCBVbmRlcmxpbmUsIFN0cmlrZU91dCwgIgorICAgICAgICAgICAgICJTY2FsZVgsIFNjYWxlWSwgIgorICAgICAgICAgICAgICJTcGFjaW5nLCBBbmdsZSwgIgorICAgICAgICAgICAgICJCb3JkZXJTdHlsZSwgT3V0bGluZSwgU2hhZG93LCAiCisgICAgICAgICAgICAgIkFsaWdubWVudCwgTWFyZ2luTCwgTWFyZ2luUiwgTWFyZ2luViwgIgorICAgICAgICAgICAgICJFbmNvZGluZ1xyXG4iCisKKyAgICAgICAgICAgICAiU3R5bGU6ICIKKyAgICAgICAgICAgICAiRGVmYXVsdCwiICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAiJXMsJWQsIiAgICAgICAgICAgICAgIC8qIEZvbnR7bmFtZSxzaXplfSAqLworICAgICAgICAgICAgICImSCV4LCZIJXgsJkgleCwmSCV4LCIgLyoge1ByaW1hcnksU2Vjb25kYXJ5LE91dGxpbmUsQmFja31Db2xvdXIgKi8KKyAgICAgICAgICAgICAiJWQsJWQsJWQsMCwiICAgICAgICAgIC8qIEJvbGQsIEl0YWxpYywgVW5kZXJsaW5lLCBTdHJpa2VPdXQgKi8KKyAgICAgICAgICAgICAiMTAwLDEwMCwiICAgICAgICAgICAgIC8qIFNjYWxle1gsWX0gKi8KKyAgICAgICAgICAgICAiMCwwLCIgICAgICAgICAgICAgICAgIC8qIFNwYWNpbmcsIEFuZ2xlICovCisgICAgICAgICAgICAgIjEsMSwwLCIgICAgICAgICAgICAgICAvKiBCb3JkZXJTdHlsZSwgT3V0bGluZSwgU2hhZG93ICovCisgICAgICAgICAgICAgIiVkLDEwLDEwLDEwLCIgICAgICAgICAvKiBBbGlnbm1lbnQsIE1hcmdpbltMUlZdICovCisgICAgICAgICAgICAgIjBcclxuIiAgICAgICAgICAgICAgICAvKiBFbmNvZGluZyAqLworCisgICAgICAgICAgICAgIlxyXG4iCisgICAgICAgICAgICAgIltFdmVudHNdXHJcbiIKKyAgICAgICAgICAgICAiRm9ybWF0OiBMYXllciwgU3RhcnQsIEVuZCwgU3R5bGUsIE5hbWUsIE1hcmdpbkwsIE1hcmdpblIsIE1hcmdpblYsIEVmZmVjdCwgVGV4dFxyXG4iLAorICAgICAgICAgICAgICEoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCkgPyBBVl9TVFJJTkdJRlkoTElCQVZDT0RFQ19WRVJTSU9OKSA6ICIiLAorICAgICAgICAgICAgIGZvbnQsIGZvbnRfc2l6ZSwgY29sb3IsIGNvbG9yLCBiYWNrX2NvbG9yLCBiYWNrX2NvbG9yLAorICAgICAgICAgICAgIC1ib2xkLCAtaXRhbGljLCAtdW5kZXJsaW5lLCBhbGlnbm1lbnQpOworCisgICAgaWYgKCFhdmN0eC0+c3VidGl0bGVfaGVhZGVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2Y3R4LT5zdWJ0aXRsZV9oZWFkZXJfc2l6ZSA9IHN0cmxlbihhdmN0eC0+c3VidGl0bGVfaGVhZGVyKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXJfZGVmYXVsdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgcmV0dXJuIGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXIoYXZjdHgsIEFTU19ERUZBVUxUX0ZPTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTX0RFRkFVTFRfRk9OVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU19ERUZBVUxUX0NPTE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU19ERUZBVUxUX0JBQ0tfQ09MT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTX0RFRkFVTFRfQk9MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NfREVGQVVMVF9JVEFMSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTX0RFRkFVTFRfVU5ERVJMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU19ERUZBVUxUX0FMSUdOTUVOVCk7Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF90cyhBVkJQcmludCAqYnVmLCBpbnQgdHMpCit7CisgICAgaWYgKHRzID09IC0xKSB7CisgICAgICAgIGF2X2JwcmludGYoYnVmLCAiOTo1OTo1OS45OSwiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaCwgbSwgczsKKworICAgICAgICBoID0gdHMvMzYwMDAwOyAgdHMgLT0gMzYwMDAwKmg7CisgICAgICAgIG0gPSB0cy8gIDYwMDA7ICB0cyAtPSAgIDYwMDAqbTsKKyAgICAgICAgcyA9IHRzLyAgIDEwMDsgIHRzIC09ICAgIDEwMCpzOworICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIiVkOiUwMmQ6JTAyZC4lMDJkLCIsIGgsIG0sIHMsIHRzKTsKKyAgICB9Cit9CisKK2ludCBmZl9hc3NfYnByaW50X2RpYWxvZyhBVkJQcmludCAqYnVmLCBjb25zdCBjaGFyICpkaWFsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRzX3N0YXJ0LCBpbnQgZHVyYXRpb24sIGludCByYXcpCit7CisgICAgaW50IGRsZW47CisKKyAgICBpZiAoIXJhdyB8fCByYXcgPT0gMikgeworICAgICAgICBsb25nIGludCBsYXllciA9IDA7CisKKyAgICAgICAgaWYgKHJhdyA9PSAyKSB7CisgICAgICAgICAgICAvKiBza2lwIFJlYWRPcmRlciAqLworICAgICAgICAgICAgZGlhbG9nID0gc3RyY2hyKGRpYWxvZywgJywnKTsKKyAgICAgICAgICAgIGlmICghZGlhbG9nKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZGlhbG9nKys7CisKKyAgICAgICAgICAgIC8qIGV4dHJhY3QgTGF5ZXIgb3IgTWFya2VkICovCisgICAgICAgICAgICBsYXllciA9IHN0cnRvbChkaWFsb2csIChjaGFyKiopJmRpYWxvZywgMTApOworICAgICAgICAgICAgaWYgKCpkaWFsb2cgIT0gJywnKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZGlhbG9nKys7CisgICAgICAgIH0KKyAgICAgICAgYXZfYnByaW50ZihidWYsICJEaWFsb2d1ZTogJWxkLCIsIGxheWVyKTsKKyAgICAgICAgaW5zZXJ0X3RzKGJ1ZiwgdHNfc3RhcnQpOworICAgICAgICBpbnNlcnRfdHMoYnVmLCBkdXJhdGlvbiA9PSAtMSA/IC0xIDogdHNfc3RhcnQgKyBkdXJhdGlvbik7CisgICAgICAgIGlmIChyYXcgIT0gMikKKyAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiRGVmYXVsdCwsMCwwLDAsLCIpOworICAgIH0KKworICAgIGRsZW4gPSBzdHJjc3BuKGRpYWxvZywgIlxuIik7CisgICAgZGxlbiArPSBkaWFsb2dbZGxlbl0gPT0gJ1xuJzsKKworICAgIGF2X2JwcmludGYoYnVmLCAiJS4qcyIsIGRsZW4sIGRpYWxvZyk7CisgICAgaWYgKHJhdyA9PSAyKQorICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIlxyXG4iKTsKKworICAgIHJldHVybiBkbGVuOworfQorCitpbnQgZmZfYXNzX2FkZF9yZWN0KEFWU3VidGl0bGUgKnN1YiwgY29uc3QgY2hhciAqZGlhbG9nLAorICAgICAgICAgICAgICAgICAgICBpbnQgdHNfc3RhcnQsIGludCBkdXJhdGlvbiwgaW50IHJhdykKK3sKKyAgICBBVkJQcmludCBidWY7CisgICAgaW50IHJldCwgZGxlbjsKKyAgICBBVlN1YnRpdGxlUmVjdCAqKnJlY3RzOworCisgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKyAgICBpZiAoKHJldCA9IGZmX2Fzc19icHJpbnRfZGlhbG9nKCZidWYsIGRpYWxvZywgdHNfc3RhcnQsIGR1cmF0aW9uLCByYXcpKSA8IDApCisgICAgICAgIGdvdG8gZXJyOworICAgIGRsZW4gPSByZXQ7CisgICAgaWYgKCFhdl9icHJpbnRfaXNfY29tcGxldGUoJmJ1ZikpCisgICAgICAgIGdvdG8gZXJybm9tZW07CisKKyAgICByZWN0cyA9IGF2X3JlYWxsb2Moc3ViLT5yZWN0cywgKHN1Yi0+bnVtX3JlY3RzKzEpICogc2l6ZW9mKCpzdWItPnJlY3RzKSk7CisgICAgaWYgKCFyZWN0cykKKyAgICAgICAgZ290byBlcnJub21lbTsKKyAgICBzdWItPnJlY3RzID0gcmVjdHM7CisgICAgc3ViLT5lbmRfZGlzcGxheV90aW1lID0gRkZNQVgoc3ViLT5lbmRfZGlzcGxheV90aW1lLCAxMCAqIGR1cmF0aW9uKTsKKyAgICByZWN0c1tzdWItPm51bV9yZWN0c10gICAgICAgPSBhdl9tYWxsb2N6KHNpemVvZigqcmVjdHNbMF0pKTsKKyAgICByZWN0c1tzdWItPm51bV9yZWN0c10tPnR5cGUgPSBTVUJUSVRMRV9BU1M7CisgICAgcmV0ID0gYXZfYnByaW50X2ZpbmFsaXplKCZidWYsICZyZWN0c1tzdWItPm51bV9yZWN0c10tPmFzcyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZXJyOworICAgIHN1Yi0+bnVtX3JlY3RzKys7CisgICAgcmV0dXJuIGRsZW47CisKK2Vycm5vbWVtOgorICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKK2VycjoKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZiwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX2Fzc19hZGRfcmVjdF9icHJpbnQoQVZTdWJ0aXRsZSAqc3ViLCBBVkJQcmludCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRzX3N0YXJ0LCBpbnQgZHVyYXRpb24pCit7CisgICAgYXZfYnByaW50ZihidWYsICJcclxuIik7CisgICAgaWYgKCFhdl9icHJpbnRfaXNfY29tcGxldGUoYnVmKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gZmZfYXNzX2FkZF9yZWN0KHN1YiwgYnVmLT5zdHIsIHRzX3N0YXJ0LCBkdXJhdGlvbiwgMCk7Cit9CisKK3ZvaWQgZmZfYXNzX2JwcmludF90ZXh0X2V2ZW50KEFWQlByaW50ICpidWYsIGNvbnN0IGNoYXIgKnAsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsaW5lYnJlYWtzLCBpbnQga2VlcF9hc3NfbWFya3VwKQoreworICAgIGNvbnN0IGNoYXIgKnBfZW5kID0gcCArIHNpemU7CisKKyAgICBmb3IgKDsgcCA8IHBfZW5kICYmICpwOyBwKyspIHsKKworICAgICAgICAvKiBmb3JjZWQgY3VzdG9tIGxpbmUgYnJlYWtzLCBub3QgYWNjb3VudGVkIGFzICJub3JtYWwiIEVPTCAqLworICAgICAgICBpZiAobGluZWJyZWFrcyAmJiBzdHJjaHIobGluZWJyZWFrcywgKnApKSB7CisgICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIlxcTiIpOworCisgICAgICAgIC8qIHN0YW5kYXJkIEFTUyBlc2NhcGluZyBzbyByYW5kb20gY2hhcmFjdGVycyBkb24ndCBnZXQgbWlzLWludGVycHJldGVkCisgICAgICAgICAqIGFzIEFTUyAqLworICAgICAgICB9IGVsc2UgaWYgKCFrZWVwX2Fzc19tYXJrdXAgJiYgc3RyY2hyKCJ7fVxcIiwgKnApKSB7CisgICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIlxcJWMiLCAqcCk7CisKKyAgICAgICAgLyogc29tZSBwYWNrZXRzIG1pZ2h0IGVuZCBhYnJ1cHRseSAobm8gXDAgYXQgdGhlIGVuZCwgbGlrZSBmb3IgZXhhbXBsZQorICAgICAgICAgKiBpbiBzb21lIGNhc2VzIG9mIGRlbXV4aW5nIGZyb20gYSBjbGFzc2ljIHZpZGVvIGNvbnRhaW5lciksIHNvbWUKKyAgICAgICAgICogbWlnaHQgYmUgdGVybWluYXRlZCB3aXRoIFxuIG9yIFxyXG4gd2hpY2ggd2UgaGF2ZSB0byByZW1vdmUgKGZvcgorICAgICAgICAgKiBjb25zaXN0ZW5jeSB3aXRoIHRob3NlIHdobyBoYXZlbid0KSwgYW5kIHdlIGFsc28gaGF2ZSB0byBkZWFsIHdpdGgKKyAgICAgICAgICogZXZpbCBjYXNlcyBzdWNoIGFzIFxyIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAoYW5kIG5vIFwwIHRlcm1pbmF0ZWQKKyAgICAgICAgICogY2hhcmFjdGVyKSAqLworICAgICAgICB9IGVsc2UgaWYgKHBbMF0gPT0gJ1xuJykgeworICAgICAgICAgICAgLyogc29tZSBzdHVmZiBsZWZ0IHNvIHdlIGNhbiBpbnNlcnQgYSBsaW5lIGJyZWFrICovCisgICAgICAgICAgICBpZiAocCA8IHBfZW5kIC0gMSkKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIlxcTiIpOworICAgICAgICB9IGVsc2UgaWYgKHBbMF0gPT0gJ1xyJyAmJiBwIDwgcF9lbmQgLSAxICYmIHBbMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgLyogXHIgZm9sbG93ZWQgYnkgYSBcbiwgd2UgY2FuIHNraXAgaXQuIFdlIGRvbid0IGluc2VydCB0aGUgXE4geWV0CisgICAgICAgICAgICAgKiBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgaXQgaXMgZm9sbG93ZWQgYnkgbW9yZSB0ZXh0ICovCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBmaW5hbGx5LCBhIHNhbmUgY2hhcmFjdGVyICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnVmLCAqcCwgMSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hc3MuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2Fzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MjE4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hc3MuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIFNTQS9BU1MgY29tbW9uIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDEwICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BU1NfSAorI2RlZmluZSBBVkNPREVDX0FTU19ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorCisvKioKKyAqIEBuYW1lIERlZmF1bHQgdmFsdWVzIGZvciBBU1Mgc3R5bGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgQVNTX0RFRkFVTFRfRk9OVCAgICAgICAgIkFyaWFsIgorI2RlZmluZSBBU1NfREVGQVVMVF9GT05UX1NJWkUgICAxNgorI2RlZmluZSBBU1NfREVGQVVMVF9DT0xPUiAgICAgICAweGZmZmZmZgorI2RlZmluZSBBU1NfREVGQVVMVF9CQUNLX0NPTE9SICAwCisjZGVmaW5lIEFTU19ERUZBVUxUX0JPTEQgICAgICAgIDAKKyNkZWZpbmUgQVNTX0RFRkFVTFRfSVRBTElDICAgICAgMAorI2RlZmluZSBBU1NfREVGQVVMVF9VTkRFUkxJTkUgICAwCisjZGVmaW5lIEFTU19ERUZBVUxUX0FMSUdOTUVOVCAgIDIKKy8qKiBAfSAqLworCisvKioKKyAqIEdlbmVyYXRlIGEgc3VpdGFibGUgQVZDb2RlY0NvbnRleHQuc3VidGl0bGVfaGVhZGVyIGZvciBTVUJUSVRMRV9BU1MuCisgKgorICogQHBhcmFtIGF2Y3R4IHBvaW50ZXIgdG8gdGhlIEFWQ29kZWNDb250ZXh0CisgKiBAcGFyYW0gZm9udCBuYW1lIG9mIHRoZSBkZWZhdWx0IGZvbnQgZmFjZSB0byB1c2UKKyAqIEBwYXJhbSBmb250X3NpemUgZGVmYXVsdCBmb250IHNpemUgdG8gdXNlCisgKiBAcGFyYW0gY29sb3IgZGVmYXVsdCB0ZXh0IGNvbG9yIHRvIHVzZSAoQUJHUikKKyAqIEBwYXJhbSBiYWNrX2NvbG9yIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciB0byB1c2UgKEFCR1IpCisgKiBAcGFyYW0gYm9sZCAxIGZvciBib2xkIHRleHQsIDAgZm9yIG5vcm1hbCB0ZXh0CisgKiBAcGFyYW0gaXRhbGljIDEgZm9yIGl0YWxpYyB0ZXh0LCAwIGZvciBub3JtYWwgdGV4dAorICogQHBhcmFtIHVuZGVybGluZSAxIGZvciB1bmRlcmxpbmUgdGV4dCwgMCBmb3Igbm9ybWFsIHRleHQKKyAqIEBwYXJhbSBhbGlnbm1lbnQgcG9zaXRpb24gb2YgdGhlIHRleHQgKGxlZnQsIGNlbnRlciwgdG9wLi4uKSwgZGVmaW5lZCBhZnRlcgorICogICAgICAgICAgICAgICAgICB0aGUgbGF5b3V0IG9mIHRoZSBudW1wYWQgKDEtMyBzdWIsIDQtNiBtaWQsIDctOSB0b3ApCisgKiBAcmV0dXJuID49IDAgb24gc3VjY2VzcyBvdGhlcndpc2UgYW4gZXJyb3IgY29kZSA8MAorICovCitpbnQgZmZfYXNzX3N1YnRpdGxlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb250LCBpbnQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yLCBpbnQgYmFja19jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib2xkLCBpbnQgaXRhbGljLCBpbnQgdW5kZXJsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsaWdubWVudCk7CisKKy8qKgorICogR2VuZXJhdGUgYSBzdWl0YWJsZSBBVkNvZGVjQ29udGV4dC5zdWJ0aXRsZV9oZWFkZXIgZm9yIFNVQlRJVExFX0FTUworICogd2l0aCBkZWZhdWx0IHN0eWxlLgorICoKKyAqIEBwYXJhbSBhdmN0eCBwb2ludGVyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUgPDAKKyAqLworaW50IGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXJfZGVmYXVsdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisvKioKKyAqIEFkZCBhbiBBU1MgZGlhbG9nIGxpbmUgdG8gYW4gQVZTdWJ0aXRsZSBhcyBhIG5ldyBBVlN1YnRpdGxlUmVjdC4KKyAqCisgKiBAcGFyYW0gc3ViIHBvaW50ZXIgdG8gdGhlIEFWU3VidGl0bGUKKyAqIEBwYXJhbSBkaWFsb2cgQVNTIGRpYWxvZyB0byBhZGQgdG8gc3ViCisgKiBAcGFyYW0gdHNfc3RhcnQgc3RhcnQgdGltZXN0YW1wIGZvciB0aGlzIGRpYWxvZyAoaW4gMS8xMDAgc2Vjb25kIHVuaXQpCisgKiBAcGFyYW0gZHVyYXRpb24gZHVyYXRpb24gZm9yIHRoaXMgZGlhbG9nIChpbiAxLzEwMCBzZWNvbmQgdW5pdCksIGNhbiBiZSAtMQorICogICAgICAgICAgICAgICAgIHRvIGxhc3QgdW50aWwgdGhlIGVuZCBvZiB0aGUgcHJlc2VudGF0aW9uCisgKiBAcGFyYW0gcmF3IHdoZW4gc2V0IHRvIDIsIGl0IGluZGljYXRlcyB0aGF0IGRpYWxvZyBjb250YWlucyBhbiBBU1MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nIGxpbmUgYXMgbXV4ZWQgaW4gTWF0cm9za2EKKyAqICAgICAgICAgICAgd2hlbiBzZXQgdG8gMSwgaXQgaW5kaWNhdGVzIHRoYXQgZGlhbG9nIGNvbnRhaW5zIGEgd2hvbGUgU1NBCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZyBsaW5lIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgYXMgaXMuCisgKiAgICAgICAgICAgIHdoZW4gc2V0IHRvIDAsIGl0IGluZGljYXRlcyB0aGF0IGRpYWxvZyBjb250YWlucyBvbmx5IHRoZSBUZXh0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgb2YgdGhlIEFTUyBkaWFsb2cgbGluZSwgdGhlIHJlc3Qgb2YgdGhlIGxpbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQuCisgKiBAcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgZnJvbSBkaWFsb2cuIEl0IGNhbiBiZSBsZXNzIHRoYW4gdGhlIHdob2xlCisgKiAgICAgICAgIGxlbmd0aCBvZiBkaWFsb2csIGlmIGRpYWxvZyBjb250YWlucyBzZXZlcmFsIGxpbmVzIG9mIHRleHQuCisgKiAgICAgICAgIEEgbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIGFuIGVycm9yLgorICovCitpbnQgZmZfYXNzX2FkZF9yZWN0KEFWU3VidGl0bGUgKnN1YiwgY29uc3QgY2hhciAqZGlhbG9nLAorICAgICAgICAgICAgICAgICAgICBpbnQgdHNfc3RhcnQsIGludCBkdXJhdGlvbiwgaW50IHJhdyk7CisKKy8qKgorICogU2FtZSBhcyBmZl9hc3NfYWRkX3JlY3RfYnByaW50LCBidXQgdGFraW5nIGFuIEFWQlByaW50IGJ1ZmZlciBpbnN0ZWFkIG9mIGEKKyAqIHN0cmluZywgYW5kIGFzc3VtaW5nIHJhdz0wLgorICovCitpbnQgZmZfYXNzX2FkZF9yZWN0X2JwcmludChBVlN1YnRpdGxlICpzdWIsIEFWQlByaW50ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHNfc3RhcnQsIGludCBkdXJhdGlvbik7CisKKy8qKgorICogQWRkIGFuIEFTUyBkaWFsb2cgbGluZSB0byBhbiBBVkJQcmludCBidWZmZXIuCisgKgorICogQHBhcmFtIGJ1ZiBwb2ludGVyIHRvIGFuIGluaXRpYWxpemVkIEFWQlByaW50IGJ1ZmZlcgorICogQHBhcmFtIGRpYWxvZyBBU1MgZGlhbG9nIHRvIGFkZCB0byBzdWIKKyAqIEBwYXJhbSB0c19zdGFydCBzdGFydCB0aW1lc3RhbXAgZm9yIHRoaXMgZGlhbG9nIChpbiAxLzEwMCBzZWNvbmQgdW5pdCkKKyAqIEBwYXJhbSBkdXJhdGlvbiBkdXJhdGlvbiBmb3IgdGhpcyBkaWFsb2cgKGluIDEvMTAwIHNlY29uZCB1bml0KSwgY2FuIGJlIC0xCisgKiAgICAgICAgICAgICAgICAgdG8gbGFzdCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBwcmVzZW50YXRpb24KKyAqIEBwYXJhbSByYXcgd2hlbiBzZXQgdG8gMiwgaXQgaW5kaWNhdGVzIHRoYXQgZGlhbG9nIGNvbnRhaW5zIGFuIEFTUworICogICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cgbGluZSBhcyBtdXhlZCBpbiBNYXRyb3NrYQorICogICAgICAgICAgICB3aGVuIHNldCB0byAxLCBpdCBpbmRpY2F0ZXMgdGhhdCBkaWFsb2cgY29udGFpbnMgYSB3aG9sZSBTU0EKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nIGxpbmUgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCBhcyBpcy4KKyAqICAgICAgICAgICAgd2hlbiBzZXQgdG8gMCwgaXQgaW5kaWNhdGVzIHRoYXQgZGlhbG9nIGNvbnRhaW5zIG9ubHkgdGhlIFRleHQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCBvZiB0aGUgQVNTIGRpYWxvZyBsaW5lLCB0aGUgcmVzdCBvZiB0aGUgbGluZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZC4KKyAqIEByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBmcm9tIGRpYWxvZy4gSXQgY2FuIGJlIGxlc3MgdGhhbiB0aGUgd2hvbGUKKyAqICAgICAgICAgbGVuZ3RoIG9mIGRpYWxvZywgaWYgZGlhbG9nIGNvbnRhaW5zIHNldmVyYWwgbGluZXMgb2YgdGV4dC4KKyAqICAgICAgICAgQSBuZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgYW4gZXJyb3IuCisgKi8KK2ludCBmZl9hc3NfYnByaW50X2RpYWxvZyhBVkJQcmludCAqYnVmLCBjb25zdCBjaGFyICpkaWFsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRzX3N0YXJ0LCBpbnQgZHVyYXRpb24sIGludCByYXcpOworCisvKioKKyAqIEVzY2FwZSBhIHRleHQgc3VidGl0bGUgdXNpbmcgQVNTIHN5bnRheCBpbnRvIGFuIEFWQlByaW50IGJ1ZmZlci4KKyAqIE5ld2xpbmUgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQgdG8gXE4uCisgKgorICogQHBhcmFtIGJ1ZiBwb2ludGVyIHRvIGFuIGluaXRpYWxpemVkIEFWQlByaW50IGJ1ZmZlcgorICogQHBhcmFtIHAgc291cmNlIHRleHQKKyAqIEBwYXJhbSBzaXplIHNpemUgb2YgdGhlIHNvdXJjZSB0ZXh0CisgKiBAcGFyYW0gbGluZWJyZWFrcyBhZGRpdGlvbmFsIG5ld2xpbmUgY2hhcnMsIHdoaWNoIHdpbGwgYmUgZXNjYXBlZCB0byBcTgorICogQHBhcmFtIGtlZXBfYXNzX21hcmt1cCBicmFjZXMgYW5kIGJhY2tzbGFzaCB3aWxsIG5vdCBiZSBlc2NhcGVkIGlmIHNldAorICovCit2b2lkIGZmX2Fzc19icHJpbnRfdGV4dF9ldmVudChBVkJQcmludCAqYnVmLCBjb25zdCBjaGFyICpwLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGluZWJyZWFrcywgaW50IGtlZXBfYXNzX21hcmt1cCk7CisjZW5kaWYgLyogQVZDT0RFQ19BU1NfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXNzX3NwbGl0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hc3Nfc3BsaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzRmOTYxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXNzX3NwbGl0LmMKQEAgLTAsMCArMSw1MjkgQEAKKy8qCisgKiBTU0EvQVNTIHNwbGl0aW5nIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDEwICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYXNzX3NwbGl0LmgiCisKK3R5cGVkZWYgZW51bSB7CisgICAgQVNTX1NUUiwKKyAgICBBU1NfSU5ULAorICAgIEFTU19GTFQsCisgICAgQVNTX0NPTE9SLAorICAgIEFTU19USU1FU1RBTVAsCisgICAgQVNTX0FMR04sCit9IEFTU0ZpZWxkVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50IHR5cGU7CisgICAgaW50IG9mZnNldDsKK30gQVNTRmllbGRzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqc2VjdGlvbjsKKyAgICBjb25zdCBjaGFyICpmb3JtYXRfaGVhZGVyOworICAgIGNvbnN0IGNoYXIgKmZpZWxkc19oZWFkZXI7CisgICAgaW50ICAgICAgICAgc2l6ZTsKKyAgICBpbnQgICAgICAgICBvZmZzZXQ7CisgICAgaW50ICAgICAgICAgb2Zmc2V0X2NvdW50OworICAgIEFTU0ZpZWxkcyAgIGZpZWxkc1syNF07Cit9IEFTU1NlY3Rpb247CisKK3N0YXRpYyBjb25zdCBBU1NTZWN0aW9uIGFzc19zZWN0aW9uc1tdID0geworICAgIHsgLnNlY3Rpb24gICAgICAgPSAiU2NyaXB0IEluZm8iLAorICAgICAgLm9mZnNldCAgICAgICAgPSBvZmZzZXRvZihBU1MsIHNjcmlwdF9pbmZvKSwKKyAgICAgIC5maWVsZHMgPSB7eyJTY3JpcHRUeXBlIiwgQVNTX1NUUiwgb2Zmc2V0b2YoQVNTU2NyaXB0SW5mbywgc2NyaXB0X3R5cGUpfSwKKyAgICAgICAgICAgICAgICAgeyJDb2xsaXNpb25zIiwgQVNTX1NUUiwgb2Zmc2V0b2YoQVNTU2NyaXB0SW5mbywgY29sbGlzaW9ucykgfSwKKyAgICAgICAgICAgICAgICAgeyJQbGF5UmVzWCIsICAgQVNTX0lOVCwgb2Zmc2V0b2YoQVNTU2NyaXB0SW5mbywgcGxheV9yZXNfeCkgfSwKKyAgICAgICAgICAgICAgICAgeyJQbGF5UmVzWSIsICAgQVNTX0lOVCwgb2Zmc2V0b2YoQVNTU2NyaXB0SW5mbywgcGxheV9yZXNfeSkgfSwKKyAgICAgICAgICAgICAgICAgeyJUaW1lciIsICAgICAgQVNTX0ZMVCwgb2Zmc2V0b2YoQVNTU2NyaXB0SW5mbywgdGltZXIpICAgICAgfSwKKyAgICAgICAgICAgICAgICAgezB9LAorICAgICAgICB9CisgICAgfSwKKyAgICB7IC5zZWN0aW9uICAgICAgID0gIlY0KyBTdHlsZXMiLAorICAgICAgLmZvcm1hdF9oZWFkZXIgPSAiRm9ybWF0IiwKKyAgICAgIC5maWVsZHNfaGVhZGVyID0gIlN0eWxlIiwKKyAgICAgIC5zaXplICAgICAgICAgID0gc2l6ZW9mKEFTU1N0eWxlKSwKKyAgICAgIC5vZmZzZXQgICAgICAgID0gb2Zmc2V0b2YoQVNTLCBzdHlsZXMpLAorICAgICAgLm9mZnNldF9jb3VudCAgPSBvZmZzZXRvZihBU1MsIHN0eWxlc19jb3VudCksCisgICAgICAuZmllbGRzID0ge3siTmFtZSIsICAgICAgICAgICAgQVNTX1NUUiwgICBvZmZzZXRvZihBU1NTdHlsZSwgbmFtZSkgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiRm9udG5hbWUiLCAgICAgICAgQVNTX1NUUiwgICBvZmZzZXRvZihBU1NTdHlsZSwgZm9udF9uYW1lKSAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiRm9udHNpemUiLCAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgZm9udF9zaXplKSAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiUHJpbWFyeUNvbG91ciIsICAgQVNTX0NPTE9SLCBvZmZzZXRvZihBU1NTdHlsZSwgcHJpbWFyeV9jb2xvcikgIH0sCisgICAgICAgICAgICAgICAgIHsiU2Vjb25kYXJ5Q29sb3VyIiwgQVNTX0NPTE9SLCBvZmZzZXRvZihBU1NTdHlsZSwgc2Vjb25kYXJ5X2NvbG9yKX0sCisgICAgICAgICAgICAgICAgIHsiT3V0bGluZUNvbG91ciIsICAgQVNTX0NPTE9SLCBvZmZzZXRvZihBU1NTdHlsZSwgb3V0bGluZV9jb2xvcikgIH0sCisgICAgICAgICAgICAgICAgIHsiQmFja0NvbG91ciIsICAgICAgQVNTX0NPTE9SLCBvZmZzZXRvZihBU1NTdHlsZSwgYmFja19jb2xvcikgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiQm9sZCIsICAgICAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgYm9sZCkgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiSXRhbGljIiwgICAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgaXRhbGljKSAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiVW5kZXJsaW5lIiwgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgdW5kZXJsaW5lKSAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiU3RyaWtlT3V0IiwgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgc3RyaWtlb3V0KSAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiU2NhbGVYIiwgICAgICAgICAgQVNTX0ZMVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgc2NhbGV4KSAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiU2NhbGVZIiwgICAgICAgICAgQVNTX0ZMVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgc2NhbGV5KSAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiU3BhY2luZyIsICAgICAgICAgQVNTX0ZMVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgc3BhY2luZykgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiQW5nbGUiLCAgICAgICAgICAgQVNTX0ZMVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgYW5nbGUpICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiQm9yZGVyU3R5bGUiLCAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgYm9yZGVyX3N0eWxlKSAgIH0sCisgICAgICAgICAgICAgICAgIHsiT3V0bGluZSIsICAgICAgICAgQVNTX0ZMVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgb3V0bGluZSkgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiU2hhZG93IiwgICAgICAgICAgQVNTX0ZMVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgc2hhZG93KSAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiQWxpZ25tZW50IiwgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgYWxpZ25tZW50KSAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiTWFyZ2luTCIsICAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgbWFyZ2luX2wpICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiTWFyZ2luUiIsICAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgbWFyZ2luX3IpICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiTWFyZ2luViIsICAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgbWFyZ2luX3YpICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiRW5jb2RpbmciLCAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgZW5jb2RpbmcpICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHswfSwKKyAgICAgICAgfQorICAgIH0sCisgICAgeyAuc2VjdGlvbiAgICAgICA9ICJWNCBTdHlsZXMiLAorICAgICAgLmZvcm1hdF9oZWFkZXIgPSAiRm9ybWF0IiwKKyAgICAgIC5maWVsZHNfaGVhZGVyID0gIlN0eWxlIiwKKyAgICAgIC5zaXplICAgICAgICAgID0gc2l6ZW9mKEFTU1N0eWxlKSwKKyAgICAgIC5vZmZzZXQgICAgICAgID0gb2Zmc2V0b2YoQVNTLCBzdHlsZXMpLAorICAgICAgLm9mZnNldF9jb3VudCAgPSBvZmZzZXRvZihBU1MsIHN0eWxlc19jb3VudCksCisgICAgICAuZmllbGRzID0ge3siTmFtZSIsICAgICAgICAgICAgQVNTX1NUUiwgICBvZmZzZXRvZihBU1NTdHlsZSwgbmFtZSkgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiRm9udG5hbWUiLCAgICAgICAgQVNTX1NUUiwgICBvZmZzZXRvZihBU1NTdHlsZSwgZm9udF9uYW1lKSAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiRm9udHNpemUiLCAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgZm9udF9zaXplKSAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiUHJpbWFyeUNvbG91ciIsICAgQVNTX0NPTE9SLCBvZmZzZXRvZihBU1NTdHlsZSwgcHJpbWFyeV9jb2xvcikgIH0sCisgICAgICAgICAgICAgICAgIHsiU2Vjb25kYXJ5Q29sb3VyIiwgQVNTX0NPTE9SLCBvZmZzZXRvZihBU1NTdHlsZSwgc2Vjb25kYXJ5X2NvbG9yKX0sCisgICAgICAgICAgICAgICAgIHsiVGVydGlhcnlDb2xvdXIiLCAgQVNTX0NPTE9SLCBvZmZzZXRvZihBU1NTdHlsZSwgb3V0bGluZV9jb2xvcikgIH0sCisgICAgICAgICAgICAgICAgIHsiQmFja0NvbG91ciIsICAgICAgQVNTX0NPTE9SLCBvZmZzZXRvZihBU1NTdHlsZSwgYmFja19jb2xvcikgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiQm9sZCIsICAgICAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgYm9sZCkgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiSXRhbGljIiwgICAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgaXRhbGljKSAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiQm9yZGVyU3R5bGUiLCAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgYm9yZGVyX3N0eWxlKSAgIH0sCisgICAgICAgICAgICAgICAgIHsiT3V0bGluZSIsICAgICAgICAgQVNTX0ZMVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgb3V0bGluZSkgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiU2hhZG93IiwgICAgICAgICAgQVNTX0ZMVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgc2hhZG93KSAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiQWxpZ25tZW50IiwgICAgICAgQVNTX0FMR04sICBvZmZzZXRvZihBU1NTdHlsZSwgYWxpZ25tZW50KSAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiTWFyZ2luTCIsICAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgbWFyZ2luX2wpICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiTWFyZ2luUiIsICAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgbWFyZ2luX3IpICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiTWFyZ2luViIsICAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgbWFyZ2luX3YpICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiQWxwaGFMZXZlbCIsICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgYWxwaGFfbGV2ZWwpICAgIH0sCisgICAgICAgICAgICAgICAgIHsiRW5jb2RpbmciLCAgICAgICAgQVNTX0lOVCwgICBvZmZzZXRvZihBU1NTdHlsZSwgZW5jb2RpbmcpICAgICAgIH0sCisgICAgICAgICAgICAgICAgIHswfSwKKyAgICAgICAgfQorICAgIH0sCisgICAgeyAuc2VjdGlvbiAgICAgICA9ICJFdmVudHMiLAorICAgICAgLmZvcm1hdF9oZWFkZXIgPSAiRm9ybWF0IiwKKyAgICAgIC5maWVsZHNfaGVhZGVyID0gIkRpYWxvZ3VlIiwKKyAgICAgIC5zaXplICAgICAgICAgID0gc2l6ZW9mKEFTU0RpYWxvZyksCisgICAgICAub2Zmc2V0ICAgICAgICA9IG9mZnNldG9mKEFTUywgZGlhbG9ncyksCisgICAgICAub2Zmc2V0X2NvdW50ICA9IG9mZnNldG9mKEFTUywgZGlhbG9nc19jb3VudCksCisgICAgICAuZmllbGRzID0ge3siTGF5ZXIiLCAgIEFTU19JTlQsICAgICAgICBvZmZzZXRvZihBU1NEaWFsb2csIGxheWVyKSAgIH0sCisgICAgICAgICAgICAgICAgIHsiU3RhcnQiLCAgIEFTU19USU1FU1RBTVAsICBvZmZzZXRvZihBU1NEaWFsb2csIHN0YXJ0KSAgIH0sCisgICAgICAgICAgICAgICAgIHsiRW5kIiwgICAgIEFTU19USU1FU1RBTVAsICBvZmZzZXRvZihBU1NEaWFsb2csIGVuZCkgICAgIH0sCisgICAgICAgICAgICAgICAgIHsiU3R5bGUiLCAgIEFTU19TVFIsICAgICAgICBvZmZzZXRvZihBU1NEaWFsb2csIHN0eWxlKSAgIH0sCisgICAgICAgICAgICAgICAgIHsiTmFtZSIsICAgIEFTU19TVFIsICAgICAgICBvZmZzZXRvZihBU1NEaWFsb2csIG5hbWUpICAgIH0sCisgICAgICAgICAgICAgICAgIHsiTWFyZ2luTCIsIEFTU19JTlQsICAgICAgICBvZmZzZXRvZihBU1NEaWFsb2csIG1hcmdpbl9sKX0sCisgICAgICAgICAgICAgICAgIHsiTWFyZ2luUiIsIEFTU19JTlQsICAgICAgICBvZmZzZXRvZihBU1NEaWFsb2csIG1hcmdpbl9yKX0sCisgICAgICAgICAgICAgICAgIHsiTWFyZ2luViIsIEFTU19JTlQsICAgICAgICBvZmZzZXRvZihBU1NEaWFsb2csIG1hcmdpbl92KX0sCisgICAgICAgICAgICAgICAgIHsiRWZmZWN0IiwgIEFTU19TVFIsICAgICAgICBvZmZzZXRvZihBU1NEaWFsb2csIGVmZmVjdCkgIH0sCisgICAgICAgICAgICAgICAgIHsiVGV4dCIsICAgIEFTU19TVFIsICAgICAgICBvZmZzZXRvZihBU1NEaWFsb2csIHRleHQpICAgIH0sCisgICAgICAgICAgICAgICAgIHswfSwKKyAgICAgICAgfQorICAgIH0sCit9OworCisKK3R5cGVkZWYgaW50ICgqQVNTQ29udmVydEZ1bmMpKHZvaWQgKmRlc3QsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbik7CisKK3N0YXRpYyBpbnQgY29udmVydF9zdHIodm9pZCAqZGVzdCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICAgIGNoYXIgKnN0ciA9IGF2X21hbGxvYyhsZW4gKyAxKTsKKyAgICBpZiAoc3RyKSB7CisgICAgICAgIG1lbWNweShzdHIsIGJ1ZiwgbGVuKTsKKyAgICAgICAgc3RyW2xlbl0gPSAwOworICAgICAgICBpZiAoKih2b2lkICoqKWRlc3QpCisgICAgICAgICAgICBhdl9mcmVlKCoodm9pZCAqKilkZXN0KTsKKyAgICAgICAgKihjaGFyICoqKWRlc3QgPSBzdHI7CisgICAgfQorICAgIHJldHVybiAhc3RyOworfQorc3RhdGljIGludCBjb252ZXJ0X2ludCh2b2lkICpkZXN0LCBjb25zdCBjaGFyICpidWYsIGludCBsZW4pCit7CisgICAgcmV0dXJuIHNzY2FuZihidWYsICIlZCIsIChpbnQgKilkZXN0KSA9PSAxOworfQorc3RhdGljIGludCBjb252ZXJ0X2ZsdCh2b2lkICpkZXN0LCBjb25zdCBjaGFyICpidWYsIGludCBsZW4pCit7CisgICAgcmV0dXJuIHNzY2FuZihidWYsICIlZiIsIChmbG9hdCAqKWRlc3QpID09IDE7Cit9CitzdGF0aWMgaW50IGNvbnZlcnRfY29sb3Iodm9pZCAqZGVzdCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICAgIHJldHVybiBzc2NhbmYoYnVmLCAiJkglOHgiLCAoaW50ICopZGVzdCkgPT0gMSB8fAorICAgICAgICAgICBzc2NhbmYoYnVmLCAiJWQiLCAgICAoaW50ICopZGVzdCkgPT0gMTsKK30KK3N0YXRpYyBpbnQgY29udmVydF90aW1lc3RhbXAodm9pZCAqZGVzdCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICAgIGludCBjLCBoLCBtLCBzLCBjczsKKyAgICBpZiAoKGMgPSBzc2NhbmYoYnVmLCAiJWQ6JTAyZDolMDJkLiUwMmQiLCAmaCwgJm0sICZzLCAmY3MpKSA9PSA0KQorICAgICAgICAqKGludCAqKWRlc3QgPSAzNjAwMDAqaCArIDYwMDAqbSArIDEwMCpzICsgY3M7CisgICAgcmV0dXJuIGMgPT0gNDsKK30KK3N0YXRpYyBpbnQgY29udmVydF9hbGlnbm1lbnQodm9pZCAqZGVzdCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICAgIGludCBhOworICAgIGlmIChzc2NhbmYoYnVmLCAiJWQiLCAmYSkgPT0gMSkgeworICAgICAgICAvKiBjb252ZXJ0IFY0IFN0eWxlIGFsaWdubWVudCB0byBWNCsgU3R5bGUgKi8KKyAgICAgICAgKihpbnQgKilkZXN0ID0gYSArICgoYSY0KSA+PiAxKSAtIDUqISEoYSY4KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVNTQ29udmVydEZ1bmMgY29udmVydF9mdW5jW10gPSB7CisgICAgW0FTU19TVFJdICAgICAgID0gY29udmVydF9zdHIsCisgICAgW0FTU19JTlRdICAgICAgID0gY29udmVydF9pbnQsCisgICAgW0FTU19GTFRdICAgICAgID0gY29udmVydF9mbHQsCisgICAgW0FTU19DT0xPUl0gICAgID0gY29udmVydF9jb2xvciwKKyAgICBbQVNTX1RJTUVTVEFNUF0gPSBjb252ZXJ0X3RpbWVzdGFtcCwKKyAgICBbQVNTX0FMR05dICAgICAgPSBjb252ZXJ0X2FsaWdubWVudCwKK307CisKKworc3RydWN0IEFTU1NwbGl0Q29udGV4dCB7CisgICAgQVNTIGFzczsKKyAgICBpbnQgY3VycmVudF9zZWN0aW9uOworICAgIGludCBmaWVsZF9udW1iZXJbRkZfQVJSQVlfRUxFTVMoYXNzX3NlY3Rpb25zKV07CisgICAgaW50ICpmaWVsZF9vcmRlcltGRl9BUlJBWV9FTEVNUyhhc3Nfc2VjdGlvbnMpXTsKK307CisKKworc3RhdGljIHVpbnQ4X3QgKnJlYWxsb2Nfc2VjdGlvbl9hcnJheShBU1NTcGxpdENvbnRleHQgKmN0eCkKK3sKKyAgICBjb25zdCBBU1NTZWN0aW9uICpzZWN0aW9uID0gJmFzc19zZWN0aW9uc1tjdHgtPmN1cnJlbnRfc2VjdGlvbl07CisgICAgaW50ICpjb3VudCA9IChpbnQgKikoKHVpbnQ4X3QgKikmY3R4LT5hc3MgKyBzZWN0aW9uLT5vZmZzZXRfY291bnQpOworICAgIHZvaWQgKipzZWN0aW9uX3B0ciA9ICh2b2lkICoqKSgodWludDhfdCAqKSZjdHgtPmFzcyArIHNlY3Rpb24tPm9mZnNldCk7CisgICAgdWludDhfdCAqdG1wID0gYXZfcmVhbGxvYygqc2VjdGlvbl9wdHIsICgqY291bnQrMSkqc2VjdGlvbi0+c2l6ZSk7CisgICAgaWYgKCF0bXApCisgICAgICAgIHJldHVybiBOVUxMOworICAgICpzZWN0aW9uX3B0ciA9IHRtcDsKKyAgICB0bXAgKz0gKmNvdW50ICogc2VjdGlvbi0+c2l6ZTsKKyAgICBtZW1zZXQodG1wLCAwLCBzZWN0aW9uLT5zaXplKTsKKyAgICAoKmNvdW50KSsrOworICAgIHJldHVybiB0bXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2VvbChjaGFyIGJ1ZikKK3sKKyAgICByZXR1cm4gYnVmID09ICdccicgfHwgYnVmID09ICdcbicgfHwgYnVmID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqc2tpcF9zcGFjZShjb25zdCBjaGFyICpidWYpCit7CisgICAgd2hpbGUgKCpidWYgPT0gJyAnKQorICAgICAgICBidWYrKzsKKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW50ICpnZXRfZGVmYXVsdF9maWVsZF9vcmRlcnMoY29uc3QgQVNTU2VjdGlvbiAqc2VjdGlvbikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgKm9yZGVyID0gYXZfbWFsbG9jKEZGX0FSUkFZX0VMRU1TKHNlY3Rpb24tPmZpZWxkcykgKiBzaXplb2YoKm9yZGVyKSk7CisKKyAgICBpZiAoIW9yZGVyKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBzZWN0aW9uLT5maWVsZHNbaV0ubmFtZTsgaSsrKQorICAgICAgICBvcmRlcltpXSA9IGk7CisgICAgd2hpbGUgKGkgPCBGRl9BUlJBWV9FTEVNUyhzZWN0aW9uLT5maWVsZHMpKQorICAgICAgICBvcmRlcltpXSA9IC0xOworICAgIHJldHVybiBvcmRlcjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmFzc19zcGxpdF9zZWN0aW9uKEFTU1NwbGl0Q29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpidWYpCit7CisgICAgY29uc3QgQVNTU2VjdGlvbiAqc2VjdGlvbiA9ICZhc3Nfc2VjdGlvbnNbY3R4LT5jdXJyZW50X3NlY3Rpb25dOworICAgIGludCAqbnVtYmVyID0gJmN0eC0+ZmllbGRfbnVtYmVyW2N0eC0+Y3VycmVudF9zZWN0aW9uXTsKKyAgICBpbnQgKm9yZGVyID0gY3R4LT5maWVsZF9vcmRlcltjdHgtPmN1cnJlbnRfc2VjdGlvbl07CisgICAgaW50ICp0bXAsIGksIGxlbjsKKworICAgIHdoaWxlIChidWYgJiYgKmJ1ZikgeworICAgICAgICBpZiAoYnVmWzBdID09ICdbJykgeworICAgICAgICAgICAgY3R4LT5jdXJyZW50X3NlY3Rpb24gPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChidWZbMF0gPT0gJzsnIHx8IChidWZbMF0gPT0gJyEnICYmIGJ1ZlsxXSA9PSAnOicpKSB7CisgICAgICAgICAgICAvKiBza2lwIGNvbW1lbnRzICovCisgICAgICAgIH0gZWxzZSBpZiAoc2VjdGlvbi0+Zm9ybWF0X2hlYWRlciAmJiAhb3JkZXIpIHsKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzZWN0aW9uLT5mb3JtYXRfaGVhZGVyKTsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGJ1Ziwgc2VjdGlvbi0+Zm9ybWF0X2hlYWRlciwgbGVuKSB8fCBidWZbbGVuXSAhPSAnOicpCisgICAgICAgICAgICAgICAgZ290byBuZXh0X2xpbmU7CisgICAgICAgICAgICBidWYgKz0gbGVuICsgMTsKKyAgICAgICAgICAgIHdoaWxlICghaXNfZW9sKCpidWYpKSB7CisgICAgICAgICAgICAgICAgYnVmID0gc2tpcF9zcGFjZShidWYpOworICAgICAgICAgICAgICAgIGxlbiA9IHN0cmNzcG4oYnVmLCAiLCBcclxuIik7CisgICAgICAgICAgICAgICAgaWYgKCEodG1wID0gYXZfcmVhbGxvYyhvcmRlciwgKCpudW1iZXIgKyAxKSAqIHNpemVvZigqb3JkZXIpKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIG9yZGVyID0gdG1wOworICAgICAgICAgICAgICAgIG9yZGVyWypudW1iZXJdID0gLTE7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IHNlY3Rpb24tPmZpZWxkc1tpXS5uYW1lOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChidWYsIHNlY3Rpb24tPmZpZWxkc1tpXS5uYW1lLCBsZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcmRlclsqbnVtYmVyXSA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICgqbnVtYmVyKSsrOworICAgICAgICAgICAgICAgIGJ1ZiA9IHNraXBfc3BhY2UoYnVmICsgbGVuICsgKGJ1ZltsZW5dID09ICcsJykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3R4LT5maWVsZF9vcmRlcltjdHgtPmN1cnJlbnRfc2VjdGlvbl0gPSBvcmRlcjsKKyAgICAgICAgfSBlbHNlIGlmIChzZWN0aW9uLT5maWVsZHNfaGVhZGVyKSB7CisgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc2VjdGlvbi0+ZmllbGRzX2hlYWRlcik7CisgICAgICAgICAgICBpZiAoIXN0cm5jbXAoYnVmLCBzZWN0aW9uLT5maWVsZHNfaGVhZGVyLCBsZW4pICYmIGJ1ZltsZW5dID09ICc6JykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciwgKnN0cnVjdF9wdHIgPSByZWFsbG9jX3NlY3Rpb25fYXJyYXkoY3R4KTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cnVjdF9wdHIpICByZXR1cm4gTlVMTDsKKworICAgICAgICAgICAgICAgIC8qIE5vIGZvcm1hdCBoZWFkZXIgbGluZSBmb3VuZCBzbyBmYXIsIGFzc3VtZSBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAgaWYgKCFvcmRlcikgeworICAgICAgICAgICAgICAgICAgICBvcmRlciA9IGdldF9kZWZhdWx0X2ZpZWxkX29yZGVycyhzZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICBjdHgtPmZpZWxkX29yZGVyW2N0eC0+Y3VycmVudF9zZWN0aW9uXSA9IG9yZGVyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ1ZiArPSBsZW4gKyAxOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyAhaXNfZW9sKCpidWYpICYmIGkgPCAqbnVtYmVyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxhc3QgPSBpID09ICpudW1iZXIgLSAxOworICAgICAgICAgICAgICAgICAgICBidWYgPSBza2lwX3NwYWNlKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0cmNzcG4oYnVmLCBsYXN0ID8gIlxyXG4iIDogIixcclxuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcmRlcltpXSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NGaWVsZFR5cGUgdHlwZSA9IHNlY3Rpb24tPmZpZWxkc1tvcmRlcltpXV0udHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHN0cnVjdF9wdHIgKyBzZWN0aW9uLT5maWVsZHNbb3JkZXJbaV1dLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRfZnVuY1t0eXBlXShwdHIsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBidWYgKz0gbGVuOworICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3QgJiYgKmJ1ZikgYnVmKys7CisgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHNraXBfc3BhY2UoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZW4gPSBzdHJjc3BuKGJ1ZiwgIjpcclxuIik7CisgICAgICAgICAgICBpZiAoYnVmW2xlbl0gPT0gJzonKSB7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IHNlY3Rpb24tPmZpZWxkc1tpXS5uYW1lOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChidWYsIHNlY3Rpb24tPmZpZWxkc1tpXS5uYW1lLCBsZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NGaWVsZFR5cGUgdHlwZSA9IHNlY3Rpb24tPmZpZWxkc1tpXS50eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKikmY3R4LT5hc3MgKyBzZWN0aW9uLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gc2VjdGlvbi0+ZmllbGRzW2ldLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHNraXBfc3BhY2UoYnVmICsgbGVuICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0X2Z1bmNbdHlwZV0ocHRyLCBidWYsIHN0cmNzcG4oYnVmLCAiXHJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KK25leHRfbGluZToKKyAgICAgICAgYnVmICs9IHN0cmNzcG4oYnVmLCAiXG4iKTsKKyAgICAgICAgYnVmICs9ICEhKmJ1ZjsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBhc3Nfc3BsaXQoQVNTU3BsaXRDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmJ1ZikKK3sKKyAgICBjaGFyIGMsIHNlY3Rpb25bMTZdOworICAgIGludCBpOworCisgICAgaWYgKGN0eC0+Y3VycmVudF9zZWN0aW9uID49IDApCisgICAgICAgIGJ1ZiA9IGFzc19zcGxpdF9zZWN0aW9uKGN0eCwgYnVmKTsKKworICAgIHdoaWxlIChidWYgJiYgKmJ1ZikgeworICAgICAgICBpZiAoc3NjYW5mKGJ1ZiwgIlslMTVbMC05QS1aYS16KyBdXSVjIiwgc2VjdGlvbiwgJmMpID09IDIpIHsKKyAgICAgICAgICAgIGJ1ZiArPSBzdHJjc3BuKGJ1ZiwgIlxuIik7CisgICAgICAgICAgICBidWYgKz0gISEqYnVmOworICAgICAgICAgICAgZm9yIChpPTA7IGk8RkZfQVJSQVlfRUxFTVMoYXNzX3NlY3Rpb25zKTsgaSsrKQorICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHNlY3Rpb24sIGFzc19zZWN0aW9uc1tpXS5zZWN0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBjdHgtPmN1cnJlbnRfc2VjdGlvbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGFzc19zcGxpdF9zZWN0aW9uKGN0eCwgYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYgKz0gc3RyY3NwbihidWYsICJcbiIpOworICAgICAgICAgICAgYnVmICs9ICEhKmJ1ZjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYnVmID8gMCA6IEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKK0FTU1NwbGl0Q29udGV4dCAqZmZfYXNzX3NwbGl0KGNvbnN0IGNoYXIgKmJ1ZikKK3sKKyAgICBBU1NTcGxpdENvbnRleHQgKmN0eCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpjdHgpKTsKKyAgICBjdHgtPmN1cnJlbnRfc2VjdGlvbiA9IC0xOworICAgIGlmIChhc3Nfc3BsaXQoY3R4LCBidWYpIDwgMCkgeworICAgICAgICBmZl9hc3Nfc3BsaXRfZnJlZShjdHgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGN0eDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9zZWN0aW9uKEFTU1NwbGl0Q29udGV4dCAqY3R4LCBjb25zdCBBU1NTZWN0aW9uICpzZWN0aW9uKQoreworICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopJmN0eC0+YXNzICsgc2VjdGlvbi0+b2Zmc2V0OworICAgIGludCBpLCBqLCAqY291bnQsIGMgPSAxOworCisgICAgaWYgKHNlY3Rpb24tPmZvcm1hdF9oZWFkZXIpIHsKKyAgICAgICAgcHRyICAgPSAqKHZvaWQgKiopcHRyOworICAgICAgICBjb3VudCA9IChpbnQgKikoKHVpbnQ4X3QgKikmY3R4LT5hc3MgKyBzZWN0aW9uLT5vZmZzZXRfY291bnQpOworICAgIH0gZWxzZQorICAgICAgICBjb3VudCA9ICZjOworCisgICAgaWYgKHB0cikKKyAgICAgICAgZm9yIChpPTA7IGk8KmNvdW50OyBpKyssIHB0ciArPSBzZWN0aW9uLT5zaXplKQorICAgICAgICAgICAgZm9yIChqPTA7IHNlY3Rpb24tPmZpZWxkc1tqXS5uYW1lOyBqKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBBU1NGaWVsZHMgKmZpZWxkID0gJnNlY3Rpb24tPmZpZWxkc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQtPnR5cGUgPT0gQVNTX1NUUikKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAocHRyICsgZmllbGQtPm9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgKmNvdW50ID0gMDsKKworICAgIGlmIChzZWN0aW9uLT5mb3JtYXRfaGVhZGVyKQorICAgICAgICBhdl9mcmVlcCgodWludDhfdCAqKSZjdHgtPmFzcyArIHNlY3Rpb24tPm9mZnNldCk7Cit9CisKK0FTU0RpYWxvZyAqZmZfYXNzX3NwbGl0X2RpYWxvZyhBU1NTcGxpdENvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZSwgaW50ICpudW1iZXIpCit7CisgICAgQVNTRGlhbG9nICpkaWFsb2cgPSBOVUxMOworICAgIGludCBpLCBjb3VudDsKKyAgICBpZiAoIWNhY2hlKQorICAgICAgICBmb3IgKGk9MDsgaTxGRl9BUlJBWV9FTEVNUyhhc3Nfc2VjdGlvbnMpOyBpKyspCisgICAgICAgICAgICBpZiAoIXN0cmNtcChhc3Nfc2VjdGlvbnNbaV0uc2VjdGlvbiwgIkV2ZW50cyIpKSB7CisgICAgICAgICAgICAgICAgZnJlZV9zZWN0aW9uKGN0eCwgJmFzc19zZWN0aW9uc1tpXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgY291bnQgPSBjdHgtPmFzcy5kaWFsb2dzX2NvdW50OworICAgIGlmIChhc3Nfc3BsaXQoY3R4LCBidWYpID09IDApCisgICAgICAgIGRpYWxvZyA9IGN0eC0+YXNzLmRpYWxvZ3MgKyBjb3VudDsKKyAgICBpZiAobnVtYmVyKQorICAgICAgICAqbnVtYmVyID0gY3R4LT5hc3MuZGlhbG9nc19jb3VudCAtIGNvdW50OworICAgIHJldHVybiBkaWFsb2c7Cit9CisKK3ZvaWQgZmZfYXNzX3NwbGl0X2ZyZWUoQVNTU3BsaXRDb250ZXh0ICpjdHgpCit7CisgICAgaWYgKGN0eCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpPTA7IGk8RkZfQVJSQVlfRUxFTVMoYXNzX3NlY3Rpb25zKTsgaSsrKSB7CisgICAgICAgICAgICBmcmVlX3NlY3Rpb24oY3R4LCAmYXNzX3NlY3Rpb25zW2ldKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCYoY3R4LT5maWVsZF9vcmRlcltpXSkpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWUoY3R4KTsKKyAgICB9Cit9CisKKworaW50IGZmX2Fzc19zcGxpdF9vdmVycmlkZV9jb2Rlcyhjb25zdCBBU1NDb2Rlc0NhbGxiYWNrcyAqY2FsbGJhY2tzLCB2b2lkICpwcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYpCit7CisgICAgY29uc3QgY2hhciAqdGV4dCA9IE5VTEw7CisgICAgY2hhciBuZXdfbGluZVsyXTsKKyAgICBpbnQgdGV4dF9sZW4gPSAwOworCisgICAgd2hpbGUgKGJ1ZiAmJiAqYnVmKSB7CisgICAgICAgIGlmICh0ZXh0ICYmIGNhbGxiYWNrcy0+dGV4dCAmJgorICAgICAgICAgICAgKHNzY2FuZihidWYsICJcXCUxW25OXSIsIG5ld19saW5lKSA9PSAxIHx8CisgICAgICAgICAgICAgIXN0cm5jbXAoYnVmLCAie1xcIiwgMikpKSB7CisgICAgICAgICAgICBjYWxsYmFja3MtPnRleHQocHJpdiwgdGV4dCwgdGV4dF9sZW4pOworICAgICAgICAgICAgdGV4dCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNzY2FuZihidWYsICJcXCUxW25OXSIsIG5ld19saW5lKSA9PSAxKSB7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tzLT5uZXdfbGluZSkKKyAgICAgICAgICAgICAgICBjYWxsYmFja3MtPm5ld19saW5lKHByaXYsIG5ld19saW5lWzBdID09ICdOJyk7CisgICAgICAgICAgICBidWYgKz0gMjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChidWYsICJ7XFwiLCAyKSkgeworICAgICAgICAgICAgYnVmKys7CisgICAgICAgICAgICB3aGlsZSAoKmJ1ZiA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgY2hhciBzdHlsZVsyXSwgY1syXSwgc2VwWzJdLCBjX251bVsyXSA9ICIwIiwgdG1wWzEyOF0gPSB7MH07CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvbG9yID0gMHhGRkZGRkZGRjsKKyAgICAgICAgICAgICAgICBpbnQgbGVuLCBzaXplID0gLTEsIGFuID0gLTEsIGFscGhhID0gLTE7CisgICAgICAgICAgICAgICAgaW50IHgxLCB5MSwgeDIsIHkyLCB0MSA9IC0xLCB0MiA9IC0xOworICAgICAgICAgICAgICAgIGlmIChzc2NhbmYoYnVmLCAiXFwlMVtiaXN1XSUxWzAxXFx9XSVuIiwgc3R5bGUsIGMsICZsZW4pID4gMSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2xvc2UgPSBjWzBdID09ICcwJyA/IDEgOiBjWzBdID09ICcxJyA/IDAgOiAtMTsKKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IGNsb3NlICE9IC0xOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzLT5zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy0+c3R5bGUocHJpdiwgc3R5bGVbMF0sIGNsb3NlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNzY2FuZihidWYsICJcXGMlMVtcXH1dJW4iLCBzZXAsICZsZW4pID4gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mKGJ1ZiwgIlxcYyZIJVgmJTFbXFx9XSVuIiwgJmNvbG9yLCBzZXAsICZsZW4pID4gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mKGJ1ZiwgIlxcJTFbMTIzNF1jJTFbXFx9XSVuIiwgY19udW0sIHNlcCwgJmxlbikgPiAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYoYnVmLCAiXFwlMVsxMjM0XWMmSCVYJiUxW1xcfV0lbiIsIGNfbnVtLCAmY29sb3IsIHNlcCwgJmxlbikgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MtPmNvbG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5jb2xvcihwcml2LCBjb2xvciwgY19udW1bMF0gLSAnMCcpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mKGJ1ZiwgIlxcYWxwaGElMVtcXH1dJW4iLCBzZXAsICZsZW4pID4gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mKGJ1ZiwgIlxcYWxwaGEmSCUyWCYlMVtcXH1dJW4iLCAmYWxwaGEsIHNlcCwgJmxlbikgPiAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYoYnVmLCAiXFwlMVsxMjM0XWElMVtcXH1dJW4iLCBjX251bSwgc2VwLCAmbGVuKSA+IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzY2FuZihidWYsICJcXCUxWzEyMzRdYSZIJTJYJiUxW1xcfV0lbiIsIGNfbnVtLCAmYWxwaGEsIHNlcCwgJmxlbikgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MtPmFscGhhKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5hbHBoYShwcml2LCBhbHBoYSwgY19udW1bMF0gLSAnMCcpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mKGJ1ZiwgIlxcZm4lMVtcXH1dJW4iLCBzZXAsICZsZW4pID4gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mKGJ1ZiwgIlxcZm4lMTI3W15cXH1dJTFbXFx9XSVuIiwgdG1wLCBzZXAsICZsZW4pID4gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzLT5mb250X25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MtPmZvbnRfbmFtZShwcml2LCB0bXBbMF0gPyB0bXAgOiBOVUxMKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNzY2FuZihidWYsICJcXGZzJTFbXFx9XSVuIiwgc2VwLCAmbGVuKSA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzY2FuZihidWYsICJcXGZzJXUlMVtcXH1dJW4iLCAmc2l6ZSwgc2VwLCAmbGVuKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcy0+Zm9udF9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5mb250X3NpemUocHJpdiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzc2NhbmYoYnVmLCAiXFxhJTFbXFx9XSVuIiwgc2VwLCAmbGVuKSA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzY2FuZihidWYsICJcXGElMnUlMVtcXH1dJW4iLCAmYW4sIHNlcCwgJmxlbikgPiAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYoYnVmLCAiXFxhbiUxW1xcfV0lbiIsIHNlcCwgJmxlbikgPiAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYoYnVmLCAiXFxhbiUxdSUxW1xcfV0lbiIsICZhbiwgc2VwLCAmbGVuKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuICE9IC0xICYmIGJ1ZlsyXSAhPSAnbicpCisgICAgICAgICAgICAgICAgICAgICAgICBhbiA9IChhbiYzKSArIChhbiY0ID8gNiA6IGFuJjggPyAzIDogMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MtPmFsaWdubWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy0+YWxpZ25tZW50KHByaXYsIGFuKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNzY2FuZihidWYsICJcXHIlMVtcXH1dJW4iLCBzZXAsICZsZW4pID4gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mKGJ1ZiwgIlxcciUxMjdbXlxcfV0lMVtcXH1dJW4iLCB0bXAsIHNlcCwgJmxlbikgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MtPmNhbmNlbF9vdmVycmlkZXMpCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MtPmNhbmNlbF9vdmVycmlkZXMocHJpdiwgdG1wKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNzY2FuZihidWYsICJcXG1vdmUoJWQsJWQsJWQsJWQpJTFbXFx9XSVuIiwgJngxLCAmeTEsICZ4MiwgJnkyLCBzZXAsICZsZW4pID4gNCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mKGJ1ZiwgIlxcbW92ZSglZCwlZCwlZCwlZCwlZCwlZCklMVtcXH1dJW4iLCAmeDEsICZ5MSwgJngyLCAmeTIsICZ0MSwgJnQyLCBzZXAsICZsZW4pID4gNikgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzLT5tb3ZlKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5tb3ZlKHByaXYsIHgxLCB5MSwgeDIsIHkyLCB0MSwgdDIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mKGJ1ZiwgIlxccG9zKCVkLCVkKSUxW1xcfV0lbiIsICZ4MSwgJnkxLCBzZXAsICZsZW4pID4gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzLT5tb3ZlKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5tb3ZlKHByaXYsIHgxLCB5MSwgeDEsIHkxLCAtMSwgLTEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mKGJ1ZiwgIlxcb3JnKCVkLCVkKSUxW1xcfV0lbiIsICZ4MSwgJnkxLCBzZXAsICZsZW4pID4gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzLT5vcmlnaW4pCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MtPm9yaWdpbihwcml2LCB4MSwgeTEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0cmNzcG4oYnVmKzEsICJcXH0iKSArIDI7ICAvKiBza2lwIHVua25vd24gY29kZSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWYgKz0gbGVuIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqYnVmKysgIT0gJ30nKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCF0ZXh0KSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICB0ZXh0X2xlbiA9IDE7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB0ZXh0X2xlbisrOworICAgICAgICAgICAgYnVmKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRleHQgJiYgY2FsbGJhY2tzLT50ZXh0KQorICAgICAgICBjYWxsYmFja3MtPnRleHQocHJpdiwgdGV4dCwgdGV4dF9sZW4pOworICAgIGlmIChjYWxsYmFja3MtPmVuZCkKKyAgICAgICAgY2FsbGJhY2tzLT5lbmQocHJpdik7CisgICAgcmV0dXJuIDA7Cit9CisKK0FTU1N0eWxlICpmZl9hc3Nfc3R5bGVfZ2V0KEFTU1NwbGl0Q29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpzdHlsZSkKK3sKKyAgICBBU1MgKmFzcyA9ICZjdHgtPmFzczsKKyAgICBpbnQgaTsKKworICAgIGlmICghc3R5bGUgfHwgISpzdHlsZSkKKyAgICAgICAgc3R5bGUgPSAiRGVmYXVsdCI7CisgICAgZm9yIChpPTA7IGk8YXNzLT5zdHlsZXNfY291bnQ7IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAoYXNzLT5zdHlsZXNbaV0ubmFtZSwgc3R5bGUpKQorICAgICAgICAgICAgcmV0dXJuIGFzcy0+c3R5bGVzICsgaTsKKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2Fzc19zcGxpdC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXNzX3NwbGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxMjI1MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Fzc19zcGxpdC5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogU1NBL0FTUyBzcGxpdGluZyBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAxMCAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVNTX1NQTElUX0gKKyNkZWZpbmUgQVZDT0RFQ19BU1NfU1BMSVRfSAorCisvKioKKyAqIGZpZWxkcyBleHRyYWN0ZWQgZnJvbSB0aGUgW1NjcmlwdCBJbmZvXSBzZWN0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICpzY3JpcHRfdHlwZTsgICAgLyoqPCBTU0Egc2NyaXB0IGZvcm1hdCB2ZXJzaW9uIChlZy4gdjQuMDApICovCisgICAgY2hhciAqY29sbGlzaW9uczsgICAgIC8qKjwgaG93IHN1YnRpdGxlcyBhcmUgbW92ZWQgdG8gcHJldmVudCBjb2xsaXNpb25zICovCisgICAgaW50ICAgcGxheV9yZXNfeDsgICAgIC8qKjwgdmlkZW8gd2lkdGggdGhhdCBBU1MgY29vcmRzIGFyZSByZWZlcnJpbmcgdG8gKi8KKyAgICBpbnQgICBwbGF5X3Jlc195OyAgICAgLyoqPCB2aWRlbyBoZWlnaHQgdGhhdCBBU1MgY29vcmRzIGFyZSByZWZlcnJpbmcgdG8gKi8KKyAgICBmbG9hdCB0aW1lcjsgICAgICAgICAgLyoqPCB0aW1lIG11bHRpcGxpZXIgdG8gYXBwbHkgdG8gU1NBIGNsb2NrIChpbiAlKSAqLworfSBBU1NTY3JpcHRJbmZvOworCisvKioKKyAqIGZpZWxkcyBleHRyYWN0ZWQgZnJvbSB0aGUgW1Y0KCspIFN0eWxlc10gc2VjdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAqbmFtZTsgICAgICAgICAgIC8qKjwgbmFtZSBvZiB0aGUgdHlsZSAoY2FzZSBzZW5zaXRpdmUpICovCisgICAgY2hhciAqZm9udF9uYW1lOyAgICAgIC8qKjwgZm9udCBmYWNlIChjYXNlIHNlbnNpdGl2ZSkgKi8KKyAgICBpbnQgICBmb250X3NpemU7ICAgICAgLyoqPCBmb250IGhlaWdodCAqLworICAgIGludCAgIHByaW1hcnlfY29sb3I7ICAvKio8IGNvbG9yIHRoYXQgYSBzdWJ0aXRsZSB3aWxsIG5vcm1hbGx5IGFwcGVhciBpbiAqLworICAgIGludCAgIHNlY29uZGFyeV9jb2xvcjsKKyAgICBpbnQgICBvdXRsaW5lX2NvbG9yOyAgLyoqPCBjb2xvciBmb3Igb3V0bGluZSBpbiBBU1MsIGNhbGxlZCB0ZXJ0aWFyeSBpbiBTU0EgKi8KKyAgICBpbnQgICBiYWNrX2NvbG9yOyAgICAgLyoqPCBjb2xvciBvZiB0aGUgc3VidGl0bGUgb3V0bGluZSBvciBzaGFkb3cgKi8KKyAgICBpbnQgICBib2xkOyAgICAgICAgICAgLyoqPCB3aGV0aGVyIHRleHQgaXMgYm9sZCAoMSkgb3Igbm90ICgwKSAqLworICAgIGludCAgIGl0YWxpYzsgICAgICAgICAvKio8IHdoZXRoZXIgdGV4dCBpcyBpdGFsaWMgKDEpIG9yIG5vdCAoMCkgKi8KKyAgICBpbnQgICB1bmRlcmxpbmU7ICAgICAgLyoqPCB3aGV0aGVyIHRleHQgaXMgdW5kZXJsaW5lZCAoMSkgb3Igbm90ICgwKSAqLworICAgIGludCAgIHN0cmlrZW91dDsKKyAgICBmbG9hdCBzY2FsZXg7CisgICAgZmxvYXQgc2NhbGV5OworICAgIGZsb2F0IHNwYWNpbmc7CisgICAgZmxvYXQgYW5nbGU7CisgICAgaW50ICAgYm9yZGVyX3N0eWxlOworICAgIGZsb2F0IG91dGxpbmU7CisgICAgZmxvYXQgc2hhZG93OworICAgIGludCAgIGFsaWdubWVudDsgICAgICAvKio8IHBvc2l0aW9uIG9mIHRoZSB0ZXh0IChsZWZ0LCBjZW50ZXIsIHRvcC4uLiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBhZnRlciB0aGUgbGF5b3V0IG9mIHRoZSBudW1wYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMS0zIHN1YiwgNC02IG1pZCwgNy05IHRvcCkgKi8KKyAgICBpbnQgICBtYXJnaW5fbDsKKyAgICBpbnQgICBtYXJnaW5fcjsKKyAgICBpbnQgICBtYXJnaW5fdjsKKyAgICBpbnQgICBhbHBoYV9sZXZlbDsKKyAgICBpbnQgICBlbmNvZGluZzsKK30gQVNTU3R5bGU7CisKKy8qKgorICogZmllbGRzIGV4dHJhY3RlZCBmcm9tIHRoZSBbRXZlbnRzXSBzZWN0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICBsYXllcjsgICAgLyoqPCBoaWdoZXIgbnVtYmVyZWQgbGF5ZXJzIGFyZSBkcmF3biBvdmVyIGxvd2VyIG51bWJlcmVkICovCisgICAgaW50ICAgc3RhcnQ7ICAgIC8qKjwgc3RhcnQgdGltZSBvZiB0aGUgZGlhbG9nIGluIGNlbnRpc2Vjb25kcyAqLworICAgIGludCAgIGVuZDsgICAgICAvKio8IGVuZCB0aW1lIG9mIHRoZSBkaWFsb2cgaW4gY2VudGlzZWNvbmRzICovCisgICAgY2hhciAqc3R5bGU7ICAgIC8qKjwgbmFtZSBvZiB0aGUgQVNTU3R5bGUgdG8gdXNlIHdpdGggdGhpcyBkaWFsb2cgKi8KKyAgICBjaGFyICpuYW1lOworICAgIGludCAgIG1hcmdpbl9sOworICAgIGludCAgIG1hcmdpbl9yOworICAgIGludCAgIG1hcmdpbl92OworICAgIGNoYXIgKmVmZmVjdDsKKyAgICBjaGFyICp0ZXh0OyAgICAgLyoqPCBhY3R1YWwgdGV4dCB3aGljaCB3aWxsIGJlIGRpc3BsYXllZCBhcyBhIHN1YnRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBpbmNsdWRlIHN0eWxlIG92ZXJyaWRlIGNvbnRyb2wgY29kZXMgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2Fzc19zcGxpdF9vdmVycmlkZV9jb2RlcygpKSAqLworfSBBU1NEaWFsb2c7CisKKy8qKgorICogc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHdob2xlIHNwbGl0IEFTUyBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBU1NTY3JpcHRJbmZvIHNjcmlwdF9pbmZvOyAgIC8qKjwgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgU1NBIHNjcmlwdCovCisgICAgQVNTU3R5bGUgICAgICpzdHlsZXM7ICAgICAgICAvKio8IGFycmF5IG9mIHNwbGl0IG91dCBzdHlsZXMgKi8KKyAgICBpbnQgICAgICAgICAgIHN0eWxlc19jb3VudDsgIC8qKjwgbnVtYmVyIG9mIEFTU1N0eWxlIGluIHRoZSBzdHlsZXMgYXJyYXkgKi8KKyAgICBBU1NEaWFsb2cgICAgKmRpYWxvZ3M7ICAgICAgIC8qKjwgYXJyYXkgb2Ygc3BsaXQgb3V0IGRpYWxvZ3MgKi8KKyAgICBpbnQgICAgICAgICAgIGRpYWxvZ3NfY291bnQ7IC8qKjwgbnVtYmVyIG9mIEFTU0RpYWxvZyBpbiB0aGUgZGlhbG9ncyBhcnJheSovCit9IEFTUzsKKworLyoqCisgKiBUaGlzIHN0cnVjdCBjYW4gYmUgY2FzdGVkIHRvIEFTUyB0byBhY2Nlc3MgdG8gdGhlIHNwbGl0IGRhdGEuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFTU1NwbGl0Q29udGV4dCBBU1NTcGxpdENvbnRleHQ7CisKKy8qKgorICogU3BsaXQgYSBmdWxsIEFTUyBmaWxlIG9yIGEgQVNTIGhlYWRlciBmcm9tIGEgc3RyaW5nIGJ1ZmZlciBhbmQgc3RvcmUKKyAqIHRoZSBzcGxpdCBzdHJ1Y3R1cmUgaW4gYSBuZXdseSBhbGxvY2F0ZWQgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gYnVmIFN0cmluZyBjb250YWluaW5nIHRoZSBBU1MgZm9ybWF0ZWQgZGF0YS4KKyAqIEByZXR1cm4gTmV3bHkgYWxsb2NhdGVkIHN0cnVjdCBjb250YWluaW5nIHNwbGl0IGRhdGEuCisgKi8KK0FTU1NwbGl0Q29udGV4dCAqZmZfYXNzX3NwbGl0KGNvbnN0IGNoYXIgKmJ1Zik7CisKKy8qKgorICogU3BsaXQgb25lIG9yIHNldmVyYWwgQVNTICJEaWFsb2d1ZSIgbGluZXMgZnJvbSBhIHN0cmluZyBidWZmZXIgYW5kIHN0b3JlCisgKiB0aGVtIGluIGEgYWxyZWFkeSBpbml0aWFsaXplZCBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBjdHggQ29udGV4dCBwcmV2aW91c2x5IGluaXRpYWxpemVkIGJ5IGZmX2Fzc19zcGxpdCgpLgorICogQHBhcmFtIGJ1ZiBTdHJpbmcgY29udGFpbmluZyB0aGUgQVNTICJEaWFsb2d1ZSIgbGluZXMuCisgKiBAcGFyYW0gY2FjaGUgU2V0IHRvIDEgdG8ga2VlcCBhbGwgdGhlIHByZXZpb3VzbHkgc3BsaXQgQVNTRGlhbG9nIGluCisgKiAgICAgICAgICAgICAgdGhlIGNvbnRleHQsIG9yIHNldCB0byAwIHRvIGZyZWUgYWxsIHRoZSBwcmV2aW91c2x5IHNwbGl0CisgKiAgICAgICAgICAgICAgQVNTRGlhbG9nLgorICogQHBhcmFtIG51bWJlciBJZiBub3QgTlVMTCwgdGhlIHBvaW50ZWQgaW50ZWdlciB3aWxsIGJlIHNldCB0byB0aGUgbnVtYmVyCisgKiAgICAgICAgICAgICAgIG9mIHNwbGl0IEFTU0RpYWxvZy4KKyAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgZmlyc3Qgc3BsaXQgQVNTRGlhbG9nLgorICovCitBU1NEaWFsb2cgKmZmX2Fzc19zcGxpdF9kaWFsb2coQVNTU3BsaXRDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGUsIGludCAqbnVtYmVyKTsKKworLyoqCisgKiBGcmVlIGFsbCB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYW4gQVNTU3BsaXRDb250ZXh0LgorICoKKyAqIEBwYXJhbSBjdHggQ29udGV4dCBwcmV2aW91c2x5IGluaXRpYWxpemVkIGJ5IGZmX2Fzc19zcGxpdCgpLgorICovCit2b2lkIGZmX2Fzc19zcGxpdF9mcmVlKEFTU1NwbGl0Q29udGV4dCAqY3R4KTsKKworCisvKioKKyAqIFNldCBvZiBjYWxsYmFjayBmdW5jdGlvbnMgY29ycmVzcG9uZGluZyB0byBlYWNoIG92ZXJyaWRlIGNvZGVzIHRoYXQgY2FuCisgKiBiZSBlbmNvdW50ZXJlZCBpbiBhICJEaWFsb2d1ZSIgVGV4dCBmaWVsZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qKgorICAgICAqIEBkZWZncm91cCBhc3Nfc3R5bGVzICAgIEFTUyBzdHlsZXMKKyAgICAgKiBAeworICAgICAqLworICAgIHZvaWQgKCp0ZXh0KSh2b2lkICpwcml2LCBjb25zdCBjaGFyICp0ZXh0LCBpbnQgbGVuKTsKKyAgICB2b2lkICgqbmV3X2xpbmUpKHZvaWQgKnByaXYsIGludCBmb3JjZWQpOworICAgIHZvaWQgKCpzdHlsZSkodm9pZCAqcHJpdiwgY2hhciBzdHlsZSwgaW50IGNsb3NlKTsKKyAgICB2b2lkICgqY29sb3IpKHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAvKiBjb2xvciAqLywgdW5zaWduZWQgaW50IGNvbG9yX2lkKTsKKyAgICB2b2lkICgqYWxwaGEpKHZvaWQgKnByaXYsIGludCBhbHBoYSwgaW50IGFscGhhX2lkKTsKKyAgICB2b2lkICgqZm9udF9uYW1lKSh2b2lkICpwcml2LCBjb25zdCBjaGFyICpuYW1lKTsKKyAgICB2b2lkICgqZm9udF9zaXplKSh2b2lkICpwcml2LCBpbnQgc2l6ZSk7CisgICAgdm9pZCAoKmFsaWdubWVudCkodm9pZCAqcHJpdiwgaW50IGFsaWdubWVudCk7CisgICAgdm9pZCAoKmNhbmNlbF9vdmVycmlkZXMpKHZvaWQgKnByaXYsIGNvbnN0IGNoYXIgKnN0eWxlKTsKKyAgICAvKiogQH0gKi8KKworICAgIC8qKgorICAgICAqIEBkZWZncm91cCBhc3NfZnVuY3Rpb25zICAgIEFTUyBmdW5jdGlvbnMKKyAgICAgKiBAeworICAgICAqLworICAgIHZvaWQgKCptb3ZlKSh2b2lkICpwcml2LCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCB0MSwgaW50IHQyKTsKKyAgICB2b2lkICgqb3JpZ2luKSh2b2lkICpwcml2LCBpbnQgeCwgaW50IHkpOworICAgIC8qKiBAfSAqLworCisgICAgLyoqCisgICAgICogQGRlZmdyb3VwIGFzc19lbmQgICAgZW5kIG9mIERpYWxvZ3VlIEV2ZW50CisgICAgICogQHsKKyAgICAgKi8KKyAgICB2b2lkICgqZW5kKSh2b2lkICpwcml2KTsKKyAgICAvKiogQH0gKi8KK30gQVNTQ29kZXNDYWxsYmFja3M7CisKKy8qKgorICogU3BsaXQgb3ZlcnJpZGUgY29kZXMgb3V0IG9mIGEgQVNTICJEaWFsb2d1ZSIgVGV4dCBmaWVsZC4KKyAqCisgKiBAcGFyYW0gY2FsbGJhY2tzIFNldCBvZiBjYWxsYmFjayBmdW5jdGlvbnMgY2FsbGVkIGZvciBlYWNoIG92ZXJyaWRlIGNvZGUKKyAqICAgICAgICAgICAgICAgICAgZW5jb3VudGVyZWQuCisgKiBAcGFyYW0gcHJpdiBPcGFxdWUgcG9pbnRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucy4KKyAqIEBwYXJhbSBidWYgVGhlIEFTUyAiRGlhbG9ndWUiIFRleHQgZmllbGQgdG8gc3BsaXQuCisgKiBAcmV0dXJuID49IDAgb24gc3VjY2VzcyBvdGhlcndpc2UgYW4gZXJyb3IgY29kZSA8MAorICovCitpbnQgZmZfYXNzX3NwbGl0X292ZXJyaWRlX2NvZGVzKGNvbnN0IEFTU0NvZGVzQ2FsbGJhY2tzICpjYWxsYmFja3MsIHZvaWQgKnByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Zik7CisKKy8qKgorICogRmluZCBhbiBBU1NTdHlsZSBzdHJ1Y3R1cmUgYnkgaXRzIG5hbWUuCisgKgorICogQHBhcmFtIGN0eCBDb250ZXh0IHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgZmZfYXNzX3NwbGl0KCkuCisgKiBAcGFyYW0gc3R5bGUgbmFtZSBvZiB0aGUgc3R5bGUgdG8gc2VhcmNoIGZvci4KKyAqIEByZXR1cm4gdGhlIEFTU1N0eWxlIGNvcnJlc3BvbmRpbmcgdG8gc3R5bGUsIG9yIE5VTEwgaWYgc3R5bGUgY2FuJ3QgYmUgZm91bmQKKyAqLworQVNTU3R5bGUgKmZmX2Fzc19zdHlsZV9nZXQoQVNTU3BsaXRDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKnN0eWxlKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQVNTX1NQTElUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2Fzc2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXNzZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkYmRlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Fzc2RlYy5jCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogU1NBL0FTUyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImFzcy5oIgorI2luY2x1ZGUgImFzc19zcGxpdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworc3RhdGljIGF2X2NvbGQgaW50IGFzc19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPnN1YnRpdGxlX2hlYWRlciA9IGF2X21hbGxvYyhhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKyAxKTsKKyAgICBpZiAoIWF2Y3R4LT5zdWJ0aXRsZV9oZWFkZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWVtY3B5KGF2Y3R4LT5zdWJ0aXRsZV9oZWFkZXIsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgYXZjdHgtPnN1YnRpdGxlX2hlYWRlclthdmN0eC0+ZXh0cmFkYXRhX3NpemVdID0gMDsKKyAgICBhdmN0eC0+c3VidGl0bGVfaGVhZGVyX3NpemUgPSBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7CisgICAgYXZjdHgtPnByaXZfZGF0YSA9IGZmX2Fzc19zcGxpdChhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBpZighYXZjdHgtPnByaXZfZGF0YSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzc19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGZmX2Fzc19zcGxpdF9mcmVlKGF2Y3R4LT5wcml2X2RhdGEpOworICAgIGF2Y3R4LT5wcml2X2RhdGEgPSBOVUxMOworICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX1NTQV9ERUNPREVSCitzdGF0aWMgaW50IHNzYV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9zdWJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCBjaGFyICpwdHIgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgbGVuLCBzaXplID0gYXZwa3QtPnNpemU7CisKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgaW50IGR1cmF0aW9uOworICAgICAgICBBU1NEaWFsb2cgKmRpYWxvZyA9IGZmX2Fzc19zcGxpdF9kaWFsb2coYXZjdHgtPnByaXZfZGF0YSwgcHRyLCAwLCBOVUxMKTsKKyAgICAgICAgaWYgKCFkaWFsb2cpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZHVyYXRpb24gPSBkaWFsb2ctPmVuZCAtIGRpYWxvZy0+c3RhcnQ7CisgICAgICAgIGxlbiA9IGZmX2Fzc19hZGRfcmVjdChkYXRhLCBwdHIsIDAsIGR1cmF0aW9uLCAxKTsKKyAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICBwdHIgICs9IGxlbjsKKyAgICAgICAgc2l6ZSAtPSBsZW47CisgICAgfQorCisgICAgKmdvdF9zdWJfcHRyID0gYXZwa3QtPnNpemUgPiAwOworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl9zc2FfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gInNzYSIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTU0EgKFN1YlN0YXRpb24gQWxwaGEpIHN1YnRpdGxlIiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfU1NBLAorICAgIC5pbml0ICAgICAgICAgPSBhc3NfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICA9IHNzYV9kZWNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICA9IGFzc19kZWNvZGVfY2xvc2UsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfQVNTX0RFQ09ERVIKK3N0YXRpYyBpbnQgYXNzX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X3N1Yl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGludCByZXQ7CisgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKKyAgICBjb25zdCBjaGFyICpwdHIgPSBhdnBrdC0+ZGF0YTsKKyAgICBzdGF0aWMgY29uc3QgQVZSYXRpb25hbCBhc3NfdGIgPSB7MSwgMTAwfTsKKyAgICBjb25zdCBpbnQgdHNfc3RhcnQgICAgPSBhdl9yZXNjYWxlX3EoYXZwa3QtPnB0cywgICAgICBhdmN0eC0+dGltZV9iYXNlLCBhc3NfdGIpOworICAgIGNvbnN0IGludCB0c19kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShhdnBrdC0+ZHVyYXRpb24sIGF2Y3R4LT50aW1lX2Jhc2UsIGFzc190Yik7CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIGF2cGt0LT5zaXplOworCisgICAgcmV0ID0gZmZfYXNzX2FkZF9yZWN0KHN1YiwgcHRyLCB0c19zdGFydCwgdHNfZHVyYXRpb24sIDIpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9JTlZBTElEREFUQSkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBBU1MgcGFja2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqZ290X3N1Yl9wdHIgPSBhdnBrdC0+c2l6ZSA+IDA7CisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX2Fzc19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAiYXNzIiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTUyAoQWR2YW5jZWQgU3ViU3RhdGlvbiBBbHBoYSkgc3VidGl0bGUiKSwKKyAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BU1MsCisgICAgLmluaXQgICAgICAgICA9IGFzc19kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgID0gYXNzX2RlY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgID0gYXNzX2RlY29kZV9jbG9zZSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2Fzc2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXNzZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjM2IwOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Fzc2VuYy5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogU1NBL0FTUyBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImFzc19zcGxpdC5oIgorI2luY2x1ZGUgImFzcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBpZDsgLy8vPCBjdXJyZW50IGV2ZW50IGlkLCBSZWFkT3JkZXIgZmllbGQKK30gQVNTRW5jb2RlQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGFzc19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvYyhhdmN0eC0+c3VidGl0bGVfaGVhZGVyX3NpemUgKyAxKTsKKyAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWVtY3B5KGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5zdWJ0aXRsZV9oZWFkZXIsIGF2Y3R4LT5zdWJ0aXRsZV9oZWFkZXJfc2l6ZSk7CisgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gYXZjdHgtPnN1YnRpdGxlX2hlYWRlcl9zaXplOworICAgIGF2Y3R4LT5leHRyYWRhdGFbYXZjdHgtPmV4dHJhZGF0YV9zaXplXSA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNzX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlN1YnRpdGxlICpzdWIpCit7CisgICAgQVNTRW5jb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIGxlbiwgdG90YWxfbGVuID0gMDsKKworICAgIGZvciAoaT0wOyBpPHN1Yi0+bnVtX3JlY3RzOyBpKyspIHsKKyAgICAgICAgY2hhciBhc3NfbGluZVsyMDQ4XTsKKyAgICAgICAgY29uc3QgY2hhciAqYXNzID0gc3ViLT5yZWN0c1tpXS0+YXNzOworCisgICAgICAgIGlmIChzdWItPnJlY3RzW2ldLT50eXBlICE9IFNVQlRJVExFX0FTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IFNVQlRJVExFX0FTUyB0eXBlIHN1cHBvcnRlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cm5jbXAoYXNzLCAiRGlhbG9ndWU6ICIsIDEwKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBVlN1YnRpdGxlIHJlY3RhbmdsZSBhc3MgXCIlc1wiIgorICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgbG9vayBsaWtlIGEgU1NBIG1hcmt1cFxuIiwgYXNzKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfQVNTKSB7CisgICAgICAgICAgICBsb25nIGludCBsYXllcjsKKyAgICAgICAgICAgIGNoYXIgKnA7CisKKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQVNTIGVuY29kZXIgc3VwcG9ydHMgb25seSBvbmUgIgorICAgICAgICAgICAgICAgICAgICAgICAiQVNTIHJlY3RhbmdsZSBmaWVsZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3MgKz0gMTA7IC8vIHNraXAgIkRpYWxvZ3VlOiAiCisgICAgICAgICAgICAvKiBwYXJzZSBMYXllciBmaWVsZC4gSWYgaXQncyBhIE1hcmtlZCBmaWVsZCwgdGhlIGNvbnRlbnQKKyAgICAgICAgICAgICAqIHdpbGwgYmUgIk1hcmtlZD1OIiBpbnN0ZWFkIG9mIHRoZSBsYXllciBudW0sIHNvIHdlIHdpbGwKKyAgICAgICAgICAgICAqIGhhdmUgbGF5ZXI9MCwgd2hpY2ggaXMgZmluZS4gKi8KKyAgICAgICAgICAgIGxheWVyID0gc3RydG9sKGFzcywgJnAsIDEwKTsKKworI2RlZmluZSBTS0lQX0VOVFJZKHB0cikgZG8geyAgICAgICAgXAorICAgIGNoYXIgKnNlcCA9IHN0cmNocihwdHIsICcsJyk7ICAgXAorICAgIGlmIChzZXApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwdHIgPSBzZXAgKyAxOyAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworICAgICAgICAgICAgU0tJUF9FTlRSWShwKTsgLy8gc2tpcCBsYXllciBvciBtYXJrZWQKKyAgICAgICAgICAgIFNLSVBfRU5UUlkocCk7IC8vIHNraXAgc3RhcnQgdGltZXN0YW1wCisgICAgICAgICAgICBTS0lQX0VOVFJZKHApOyAvLyBza2lwIGVuZCB0aW1lc3RhbXAKKyAgICAgICAgICAgIHNucHJpbnRmKGFzc19saW5lLCBzaXplb2YoYXNzX2xpbmUpLCAiJWQsJWxkLCVzIiwgKytzLT5pZCwgbGF5ZXIsIHApOworICAgICAgICAgICAgYXNzX2xpbmVbc3RyY3Nwbihhc3NfbGluZSwgIlxyXG4iKV0gPSAwOworICAgICAgICAgICAgYXNzID0gYXNzX2xpbmU7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gYXZfc3RybGNweShidWYrdG90YWxfbGVuLCBhc3MsIGJ1ZnNpemUtdG90YWxfbGVuKTsKKworICAgICAgICBpZiAobGVuID4gYnVmc2l6ZS10b3RhbF9sZW4tMSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCdWZmZXIgdG9vIHNtYWxsIGZvciBBU1MgZXZlbnQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHRvdGFsX2xlbiArPSBsZW47CisgICAgfQorCisgICAgcmV0dXJuIHRvdGFsX2xlbjsKK30KKworI2lmIENPTkZJR19TU0FfRU5DT0RFUgorQVZDb2RlYyBmZl9zc2FfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gInNzYSIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTU0EgKFN1YlN0YXRpb24gQWxwaGEpIHN1YnRpdGxlIiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfU1NBLAorICAgIC5pbml0ICAgICAgICAgPSBhc3NfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZV9zdWIgICA9IGFzc19lbmNvZGVfZnJhbWUsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFTU0VuY29kZUNvbnRleHQpLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0FTU19FTkNPREVSCitBVkNvZGVjIGZmX2Fzc19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAiYXNzIiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTUyAoQWR2YW5jZWQgU3ViU3RhdGlvbiBBbHBoYSkgc3VidGl0bGUiKSwKKyAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BU1MsCisgICAgLmluaXQgICAgICAgICA9IGFzc19lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlX3N1YiAgID0gYXNzX2VuY29kZV9mcmFtZSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVNTRW5jb2RlQ29udGV4dCksCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hc3YuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Fzdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZmRmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hc3YuYwpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQVNVUyBWMS9WMiBlbmNvZGVyL2RlY29kZXIgY29tbW9uIGRhdGEKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhc3YuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnN3YXBkc3AuaCIKKworY29uc3QgdWludDhfdCBmZl9hc3Zfc2NhbnRhYls2NF0gPSB7CisgICAgMHgwMCwgMHgwOCwgMHgwMSwgMHgwOSwgMHgxMCwgMHgxOCwgMHgxMSwgMHgxOSwKKyAgICAweDAyLCAweDBBLCAweDAzLCAweDBCLCAweDEyLCAweDFBLCAweDEzLCAweDFCLAorICAgIDB4MDQsIDB4MEMsIDB4MDUsIDB4MEQsIDB4MjAsIDB4MjgsIDB4MjEsIDB4MjksCisgICAgMHgwNiwgMHgwRSwgMHgwNywgMHgwRiwgMHgxNCwgMHgxQywgMHgxNSwgMHgxRCwKKyAgICAweDIyLCAweDJBLCAweDIzLCAweDJCLCAweDMwLCAweDM4LCAweDMxLCAweDM5LAorICAgIDB4MTYsIDB4MUUsIDB4MTcsIDB4MUYsIDB4MjQsIDB4MkMsIDB4MjUsIDB4MkQsCisgICAgMHgzMiwgMHgzQSwgMHgzMywgMHgzQiwgMHgyNiwgMHgyRSwgMHgyNywgMHgyRiwKKyAgICAweDM0LCAweDNDLCAweDM1LCAweDNELCAweDM2LCAweDNFLCAweDM3LCAweDNGLAorfTsKKworY29uc3QgdWludDhfdCBmZl9hc3ZfY2NwX3RhYlsxN11bMl0gPSB7CisgICAgeyAweDIsIDIgfSwgeyAweDcsIDUgfSwgeyAweEIsIDUgfSwgeyAweDMsIDUgfSwKKyAgICB7IDB4RCwgNSB9LCB7IDB4NSwgNSB9LCB7IDB4OSwgNSB9LCB7IDB4MSwgNSB9LAorICAgIHsgMHhFLCA1IH0sIHsgMHg2LCA1IH0sIHsgMHhBLCA1IH0sIHsgMHgyLCA1IH0sCisgICAgeyAweEMsIDUgfSwgeyAweDQsIDUgfSwgeyAweDgsIDUgfSwgeyAweDMsIDIgfSwKKyAgICB7IDB4RiwgNSB9LCAvLyBFT0IKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfYXN2X2xldmVsX3RhYls3XVsyXSA9IHsKKyAgICB7IDMsIDQgfSwgeyAzLCAzIH0sIHsgMywgMiB9LCB7IDAsIDMgfSwgeyAyLCAyIH0sIHsgMiwgMyB9LCB7IDIsIDQgfQorfTsKKworY29uc3QgdWludDhfdCBmZl9hc3ZfZGNfY2NwX3RhYls4XVsyXSA9IHsKKyAgICB7IDB4MSwgMiB9LCB7IDB4RCwgNCB9LCB7IDB4RiwgNCB9LCB7IDB4QywgNCB9LAorICAgIHsgMHg1LCAzIH0sIHsgMHhFLCA0IH0sIHsgMHg0LCAzIH0sIHsgMHgwLCAyIH0sCit9OworCitjb25zdCB1aW50OF90IGZmX2Fzdl9hY19jY3BfdGFiWzE2XVsyXSA9IHsKKyAgICB7IDB4MDAsIDIgfSwgeyAweDNCLCA2IH0sIHsgMHgwQSwgNCB9LCB7IDB4M0EsIDYgfSwKKyAgICB7IDB4MDIsIDMgfSwgeyAweDM5LCA2IH0sIHsgMHgzQywgNiB9LCB7IDB4MzgsIDYgfSwKKyAgICB7IDB4MDMsIDMgfSwgeyAweDNELCA2IH0sIHsgMHgwOCwgNCB9LCB7IDB4MUYsIDUgfSwKKyAgICB7IDB4MDksIDQgfSwgeyAweDBCLCA0IH0sIHsgMHgwRCwgNCB9LCB7IDB4MEMsIDQgfSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfYXN2Ml9sZXZlbF90YWJbNjNdWzJdID0geworICAgIHsgMHgzRiwgMTAgfSwgeyAweDJGLCAxMCB9LCB7IDB4MzcsIDEwIH0sIHsgMHgyNywgMTAgfSwgeyAweDNCLCAxMCB9LCB7IDB4MkIsIDEwIH0sIHsgMHgzMywgMTAgfSwgeyAweDIzLCAxMCB9LAorICAgIHsgMHgzRCwgMTAgfSwgeyAweDJELCAxMCB9LCB7IDB4MzUsIDEwIH0sIHsgMHgyNSwgMTAgfSwgeyAweDM5LCAxMCB9LCB7IDB4MjksIDEwIH0sIHsgMHgzMSwgMTAgfSwgeyAweDIxLCAxMCB9LAorICAgIHsgMHgxRiwgIDggfSwgeyAweDE3LCAgOCB9LCB7IDB4MUIsICA4IH0sIHsgMHgxMywgIDggfSwgeyAweDFELCAgOCB9LCB7IDB4MTUsICA4IH0sIHsgMHgxOSwgIDggfSwgeyAweDExLCAgOCB9LAorICAgIHsgMHgwRiwgIDYgfSwgeyAweDBCLCAgNiB9LCB7IDB4MEQsICA2IH0sIHsgMHgwOSwgIDYgfSwKKyAgICB7IDB4MDcsICA0IH0sIHsgMHgwNSwgIDQgfSwKKyAgICB7IDB4MDMsICAyIH0sCisgICAgeyAweDAwLCAgNSB9LAorICAgIHsgMHgwMiwgIDIgfSwKKyAgICB7IDB4MDQsICA0IH0sIHsgMHgwNiwgIDQgfSwKKyAgICB7IDB4MDgsICA2IH0sIHsgMHgwQywgIDYgfSwgeyAweDBBLCAgNiB9LCB7IDB4MEUsICA2IH0sCisgICAgeyAweDEwLCAgOCB9LCB7IDB4MTgsICA4IH0sIHsgMHgxNCwgIDggfSwgeyAweDFDLCAgOCB9LCB7IDB4MTIsICA4IH0sIHsgMHgxQSwgIDggfSwgeyAweDE2LCAgOCB9LCB7IDB4MUUsICA4IH0sCisgICAgeyAweDIwLCAxMCB9LCB7IDB4MzAsIDEwIH0sIHsgMHgyOCwgMTAgfSwgeyAweDM4LCAxMCB9LCB7IDB4MjQsIDEwIH0sIHsgMHgzNCwgMTAgfSwgeyAweDJDLCAxMCB9LCB7IDB4M0MsIDEwIH0sCisgICAgeyAweDIyLCAxMCB9LCB7IDB4MzIsIDEwIH0sIHsgMHgyQSwgMTAgfSwgeyAweDNBLCAxMCB9LCB7IDB4MjYsIDEwIH0sIHsgMHgzNiwgMTAgfSwgeyAweDJFLCAxMCB9LCB7IDB4M0UsIDEwIH0sCit9OworCithdl9jb2xkIHZvaWQgZmZfYXN2X2NvbW1vbl9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBU1YxQ29udGV4dCAqY29uc3QgYSA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmZl9ic3dhcGRzcF9pbml0KCZhLT5iYmRzcCk7CisKKyAgICBhLT5tYl93aWR0aCAgID0gKGF2Y3R4LT53aWR0aCAgKyAxNSkgLyAxNjsKKyAgICBhLT5tYl9oZWlnaHQgID0gKGF2Y3R4LT5oZWlnaHQgKyAxNSkgLyAxNjsKKyAgICBhLT5tYl93aWR0aDIgID0gKGF2Y3R4LT53aWR0aCAgKyAgMCkgLyAxNjsKKyAgICBhLT5tYl9oZWlnaHQyID0gKGF2Y3R4LT5oZWlnaHQgKyAgMCkgLyAxNjsKKworICAgIGEtPmF2Y3R4ID0gYXZjdHg7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hc3YuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2Fzdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2RjODEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hc3YuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQVNVUyBWMS9WMiBlbmNvZGVyL2RlY29kZXIgY29tbW9uIGRhdGEuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FTVl9ICisjZGVmaW5lIEFWQ09ERUNfQVNWX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJsb2NrZHNwLmgiCisjaW5jbHVkZSAiYnN3YXBkc3AuaCIKKyNpbmNsdWRlICJmZGN0ZHNwLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAicGl4YmxvY2tkc3AuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCit0eXBlZGVmIHN0cnVjdCBBU1YxQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEJsb2NrRFNQQ29udGV4dCBiZHNwOworICAgIEJzd2FwRFNQQ29udGV4dCBiYmRzcDsKKyAgICBGRENURFNQQ29udGV4dCBmZHNwOworICAgIElEQ1REU1BDb250ZXh0IGlkc3A7CisgICAgUGl4YmxvY2tEU1BDb250ZXh0IHBkc3A7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIFNjYW5UYWJsZSBzY2FudGFibGU7CisgICAgaW50IGludl9xc2NhbGU7CisgICAgaW50IG1iX3dpZHRoOworICAgIGludCBtYl9oZWlnaHQ7CisgICAgaW50IG1iX3dpZHRoMjsKKyAgICBpbnQgbWJfaGVpZ2h0MjsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrKVs2XVs2NF07CisgICAgdWludDE2X3QgaW50cmFfbWF0cml4WzY0XTsKKyAgICBpbnQgcV9pbnRyYV9tYXRyaXhbNjRdOworICAgIHVpbnQ4X3QgKmJpdHN0cmVhbV9idWZmZXI7CisgICAgdW5zaWduZWQgaW50IGJpdHN0cmVhbV9idWZmZXJfc2l6ZTsKK30gQVNWMUNvbnRleHQ7CisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2Fzdl9zY2FudGFiWzY0XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2Fzdl9jY3BfdGFiWzE3XVsyXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2Fzdl9sZXZlbF90YWJbN11bMl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9hc3ZfZGNfY2NwX3RhYls4XVsyXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2Fzdl9hY19jY3BfdGFiWzE2XVsyXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2FzdjJfbGV2ZWxfdGFiWzYzXVsyXTsKKwordm9pZCBmZl9hc3ZfY29tbW9uX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQVNWX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2FzdmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXN2ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMmZhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FzdmRlYy5jCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQVNVUyBWMS9WMiBkZWNvZGVyLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImFzdi5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJibG9ja2RzcC5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtcGVnMTJkYXRhLmgiCisKKyNkZWZpbmUgVkxDX0JJVFMgICAgICAgICAgICAgNgorI2RlZmluZSBBU1YyX0xFVkVMX1ZMQ19CSVRTIDEwCisKK3N0YXRpYyBWTEMgY2NwX3ZsYzsKK3N0YXRpYyBWTEMgbGV2ZWxfdmxjOworc3RhdGljIFZMQyBkY19jY3BfdmxjOworc3RhdGljIFZMQyBhY19jY3BfdmxjOworc3RhdGljIFZMQyBhc3YyX2xldmVsX3ZsYzsKKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X3ZsY3MoQVNWMUNvbnRleHQgKmEpCit7CisgICAgc3RhdGljIGludCBkb25lID0gMDsKKworICAgIGlmICghZG9uZSkgeworICAgICAgICBkb25lID0gMTsKKworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmNjcF92bGMsIFZMQ19CSVRTLCAxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9hc3ZfY2NwX3RhYlswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9hc3ZfY2NwX3RhYlswXVswXSwgMiwgMSwgNjQpOworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmRjX2NjcF92bGMsIFZMQ19CSVRTLCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX2Fzdl9kY19jY3BfdGFiWzBdWzFdLCAyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX2Fzdl9kY19jY3BfdGFiWzBdWzBdLCAyLCAxLCA2NCk7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmYWNfY2NwX3ZsYywgVkxDX0JJVFMsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX2Fzdl9hY19jY3BfdGFiWzBdWzFdLCAyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX2Fzdl9hY19jY3BfdGFiWzBdWzBdLCAyLCAxLCA2NCk7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmbGV2ZWxfdmxjLCAgVkxDX0JJVFMsIDcsCisgICAgICAgICAgICAgICAgICAgICAgICAmZmZfYXN2X2xldmVsX3RhYlswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9hc3ZfbGV2ZWxfdGFiWzBdWzBdLCAyLCAxLCA2NCk7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmYXN2Ml9sZXZlbF92bGMsIEFTVjJfTEVWRUxfVkxDX0JJVFMsIDYzLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX2FzdjJfbGV2ZWxfdGFiWzBdWzFdLCAyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX2FzdjJfbGV2ZWxfdGFiWzBdWzBdLCAyLCAxLCAxMDI0KTsKKyAgICB9Cit9CisKKy8vIEZJWE1FIHdyaXRlIGEgcmV2ZXJzZWQgYml0c3RyZWFtIHJlYWRlciB0byBhdm9pZCB0aGUgZG91YmxlIHJldmVyc2UKK3N0YXRpYyBpbmxpbmUgaW50IGFzdjJfZ2V0X2JpdHMoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBuKQoreworICAgIHJldHVybiBmZl9yZXZlcnNlW2dldF9iaXRzKGdiLCBuKSA8PCAoOCAtIG4pXTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXN2MV9nZXRfbGV2ZWwoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IGNvZGUgPSBnZXRfdmxjMihnYiwgbGV2ZWxfdmxjLnRhYmxlLCBWTENfQklUUywgMSk7CisKKyAgICBpZiAoY29kZSA9PSAzKQorICAgICAgICByZXR1cm4gZ2V0X3NiaXRzKGdiLCA4KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBjb2RlIC0gMzsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXN2Ml9nZXRfbGV2ZWwoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IGNvZGUgPSBnZXRfdmxjMihnYiwgYXN2Ml9sZXZlbF92bGMudGFibGUsIEFTVjJfTEVWRUxfVkxDX0JJVFMsIDEpOworCisgICAgaWYgKGNvZGUgPT0gMzEpCisgICAgICAgIHJldHVybiAoaW50OF90KSBhc3YyX2dldF9iaXRzKGdiLCA4KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBjb2RlIC0gMzE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFzdjFfZGVjb2RlX2Jsb2NrKEFTVjFDb250ZXh0ICphLCBpbnQxNl90IGJsb2NrWzY0XSkKK3sKKyAgICBpbnQgaTsKKworICAgIGJsb2NrWzBdID0gOCAqIGdldF9iaXRzKCZhLT5nYiwgOCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykgeworICAgICAgICBjb25zdCBpbnQgY2NwID0gZ2V0X3ZsYzIoJmEtPmdiLCBjY3BfdmxjLnRhYmxlLCBWTENfQklUUywgMSk7CisKKyAgICAgICAgaWYgKGNjcCkgeworICAgICAgICAgICAgaWYgKGNjcCA9PSAxNikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChjY3AgPCAwIHx8IGkgPj0gMTApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYS0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNvZGVkIGNvZWZmIHBhdHRlcm4gZGFtYWdlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjY3AgJiA4KQorICAgICAgICAgICAgICAgIGJsb2NrW2EtPnNjYW50YWJsZS5wZXJtdXRhdGVkWzQgKiBpICsgMF1dID0gKGFzdjFfZ2V0X2xldmVsKCZhLT5nYikgKiBhLT5pbnRyYV9tYXRyaXhbNCAqIGkgKyAwXSkgPj4gNDsKKyAgICAgICAgICAgIGlmIChjY3AgJiA0KQorICAgICAgICAgICAgICAgIGJsb2NrW2EtPnNjYW50YWJsZS5wZXJtdXRhdGVkWzQgKiBpICsgMV1dID0gKGFzdjFfZ2V0X2xldmVsKCZhLT5nYikgKiBhLT5pbnRyYV9tYXRyaXhbNCAqIGkgKyAxXSkgPj4gNDsKKyAgICAgICAgICAgIGlmIChjY3AgJiAyKQorICAgICAgICAgICAgICAgIGJsb2NrW2EtPnNjYW50YWJsZS5wZXJtdXRhdGVkWzQgKiBpICsgMl1dID0gKGFzdjFfZ2V0X2xldmVsKCZhLT5nYikgKiBhLT5pbnRyYV9tYXRyaXhbNCAqIGkgKyAyXSkgPj4gNDsKKyAgICAgICAgICAgIGlmIChjY3AgJiAxKQorICAgICAgICAgICAgICAgIGJsb2NrW2EtPnNjYW50YWJsZS5wZXJtdXRhdGVkWzQgKiBpICsgM11dID0gKGFzdjFfZ2V0X2xldmVsKCZhLT5nYikgKiBhLT5pbnRyYV9tYXRyaXhbNCAqIGkgKyAzXSkgPj4gNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBhc3YyX2RlY29kZV9ibG9jayhBU1YxQ29udGV4dCAqYSwgaW50MTZfdCBibG9ja1s2NF0pCit7CisgICAgaW50IGksIGNvdW50LCBjY3A7CisKKyAgICBjb3VudCA9IGFzdjJfZ2V0X2JpdHMoJmEtPmdiLCA0KTsKKworICAgIGJsb2NrWzBdID0gOCAqIGFzdjJfZ2V0X2JpdHMoJmEtPmdiLCA4KTsKKworICAgIGNjcCA9IGdldF92bGMyKCZhLT5nYiwgZGNfY2NwX3ZsYy50YWJsZSwgVkxDX0JJVFMsIDEpOworICAgIGlmIChjY3ApIHsKKyAgICAgICAgaWYgKGNjcCAmIDQpCisgICAgICAgICAgICBibG9ja1thLT5zY2FudGFibGUucGVybXV0YXRlZFsxXV0gPSAoYXN2Ml9nZXRfbGV2ZWwoJmEtPmdiKSAqIGEtPmludHJhX21hdHJpeFsxXSkgPj4gNDsKKyAgICAgICAgaWYgKGNjcCAmIDIpCisgICAgICAgICAgICBibG9ja1thLT5zY2FudGFibGUucGVybXV0YXRlZFsyXV0gPSAoYXN2Ml9nZXRfbGV2ZWwoJmEtPmdiKSAqIGEtPmludHJhX21hdHJpeFsyXSkgPj4gNDsKKyAgICAgICAgaWYgKGNjcCAmIDEpCisgICAgICAgICAgICBibG9ja1thLT5zY2FudGFibGUucGVybXV0YXRlZFszXV0gPSAoYXN2Ml9nZXRfbGV2ZWwoJmEtPmdiKSAqIGEtPmludHJhX21hdHJpeFszXSkgPj4gNDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgY291bnQgKyAxOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IGNjcCA9IGdldF92bGMyKCZhLT5nYiwgYWNfY2NwX3ZsYy50YWJsZSwgVkxDX0JJVFMsIDEpOworCisgICAgICAgIGlmIChjY3ApIHsKKyAgICAgICAgICAgIGlmIChjY3AgJiA4KQorICAgICAgICAgICAgICAgIGJsb2NrW2EtPnNjYW50YWJsZS5wZXJtdXRhdGVkWzQgKiBpICsgMF1dID0gKGFzdjJfZ2V0X2xldmVsKCZhLT5nYikgKiBhLT5pbnRyYV9tYXRyaXhbNCAqIGkgKyAwXSkgPj4gNDsKKyAgICAgICAgICAgIGlmIChjY3AgJiA0KQorICAgICAgICAgICAgICAgIGJsb2NrW2EtPnNjYW50YWJsZS5wZXJtdXRhdGVkWzQgKiBpICsgMV1dID0gKGFzdjJfZ2V0X2xldmVsKCZhLT5nYikgKiBhLT5pbnRyYV9tYXRyaXhbNCAqIGkgKyAxXSkgPj4gNDsKKyAgICAgICAgICAgIGlmIChjY3AgJiAyKQorICAgICAgICAgICAgICAgIGJsb2NrW2EtPnNjYW50YWJsZS5wZXJtdXRhdGVkWzQgKiBpICsgMl1dID0gKGFzdjJfZ2V0X2xldmVsKCZhLT5nYikgKiBhLT5pbnRyYV9tYXRyaXhbNCAqIGkgKyAyXSkgPj4gNDsKKyAgICAgICAgICAgIGlmIChjY3AgJiAxKQorICAgICAgICAgICAgICAgIGJsb2NrW2EtPnNjYW50YWJsZS5wZXJtdXRhdGVkWzQgKiBpICsgM11dID0gKGFzdjJfZ2V0X2xldmVsKCZhLT5nYikgKiBhLT5pbnRyYV9tYXRyaXhbNCAqIGkgKyAzXSkgPj4gNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfbWIoQVNWMUNvbnRleHQgKmEsIGludDE2X3QgYmxvY2tbNl1bNjRdKQoreworICAgIGludCBpOworCisgICAgYS0+YmRzcC5jbGVhcl9ibG9ja3MoYmxvY2tbMF0pOworCisgICAgaWYgKGEtPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BU1YxKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhc3YxX2RlY29kZV9ibG9jayhhLCBibG9ja1tpXSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhc3YyX2RlY29kZV9ibG9jayhhLCBibG9ja1tpXSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlkY3RfcHV0KEFTVjFDb250ZXh0ICphLCBBVkZyYW1lICpmcmFtZSwgaW50IG1iX3gsIGludCBtYl95KQoreworICAgIGludDE2X3QoKmJsb2NrKVs2NF0gPSBhLT5ibG9jazsKKyAgICBpbnQgbGluZXNpemUgPSBmcmFtZS0+bGluZXNpemVbMF07CisKKyAgICB1aW50OF90ICpkZXN0X3kgID0gZnJhbWUtPmRhdGFbMF0gKyAobWJfeSAqIDE2ICogbGluZXNpemUpICAgICAgICAgICArIG1iX3ggKiAxNjsKKyAgICB1aW50OF90ICpkZXN0X2NiID0gZnJhbWUtPmRhdGFbMV0gKyAobWJfeSAqICA4ICogZnJhbWUtPmxpbmVzaXplWzFdKSArIG1iX3ggKiAgODsKKyAgICB1aW50OF90ICpkZXN0X2NyID0gZnJhbWUtPmRhdGFbMl0gKyAobWJfeSAqICA4ICogZnJhbWUtPmxpbmVzaXplWzJdKSArIG1iX3ggKiAgODsKKworICAgIGEtPmlkc3AuaWRjdF9wdXQoZGVzdF95LCAgICAgICAgICAgICAgICAgICAgbGluZXNpemUsIGJsb2NrWzBdKTsKKyAgICBhLT5pZHNwLmlkY3RfcHV0KGRlc3RfeSArIDgsICAgICAgICAgICAgICAgIGxpbmVzaXplLCBibG9ja1sxXSk7CisgICAgYS0+aWRzcC5pZGN0X3B1dChkZXN0X3kgKyA4ICogbGluZXNpemUsICAgICBsaW5lc2l6ZSwgYmxvY2tbMl0pOworICAgIGEtPmlkc3AuaWRjdF9wdXQoZGVzdF95ICsgOCAqIGxpbmVzaXplICsgOCwgbGluZXNpemUsIGJsb2NrWzNdKTsKKworICAgIGlmICghKGEtPmF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgYS0+aWRzcC5pZGN0X3B1dChkZXN0X2NiLCBmcmFtZS0+bGluZXNpemVbMV0sIGJsb2NrWzRdKTsKKyAgICAgICAgYS0+aWRzcC5pZGN0X3B1dChkZXN0X2NyLCBmcmFtZS0+bGluZXNpemVbMl0sIGJsb2NrWzVdKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVNWMUNvbnRleHQgKmNvbnN0IGEgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIEFWRnJhbWUgKmNvbnN0IHAgPSBkYXRhOworICAgIGludCBtYl94LCBtYl95LCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHAsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcC0+a2V5X2ZyYW1lID0gMTsKKworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmYS0+Yml0c3RyZWFtX2J1ZmZlciwgJmEtPmJpdHN0cmVhbV9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUpOworICAgIGlmICghYS0+Yml0c3RyZWFtX2J1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVNWMSkgeworICAgICAgICBhLT5iYmRzcC5ic3dhcF9idWYoKHVpbnQzMl90ICopIGEtPmJpdHN0cmVhbV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDMyX3QgKikgYnVmLCBidWZfc2l6ZSAvIDQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykKKyAgICAgICAgICAgIGEtPmJpdHN0cmVhbV9idWZmZXJbaV0gPSBmZl9yZXZlcnNlW2J1ZltpXV07CisgICAgfQorCisgICAgaW5pdF9nZXRfYml0cygmYS0+Z2IsIGEtPmJpdHN0cmVhbV9idWZmZXIsIGJ1Zl9zaXplICogOCk7CisKKyAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgYS0+bWJfaGVpZ2h0MjsgbWJfeSsrKSB7CisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBhLT5tYl93aWR0aDI7IG1iX3grKykgeworICAgICAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfbWIoYSwgYS0+YmxvY2spKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgaWRjdF9wdXQoYSwgcCwgbWJfeCwgbWJfeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYS0+bWJfd2lkdGgyICE9IGEtPm1iX3dpZHRoKSB7CisgICAgICAgIG1iX3ggPSBhLT5tYl93aWR0aDI7CisgICAgICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBhLT5tYl9oZWlnaHQyOyBtYl95KyspIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX21iKGEsIGEtPmJsb2NrKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIGlkY3RfcHV0KGEsIHAsIG1iX3gsIG1iX3kpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGEtPm1iX2hlaWdodDIgIT0gYS0+bWJfaGVpZ2h0KSB7CisgICAgICAgIG1iX3kgPSBhLT5tYl9oZWlnaHQyOworICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgYS0+bWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfbWIoYSwgYS0+YmxvY2spKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgaWRjdF9wdXQoYSwgcCwgbWJfeCwgbWJfeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIGVtbXNfYygpOworCisgICAgcmV0dXJuIChnZXRfYml0c19jb3VudCgmYS0+Z2IpICsgMzEpIC8gMzIgKiA0OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFTVjFDb250ZXh0ICpjb25zdCBhID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBpbnQgc2NhbGUgICAgICA9IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BU1YxID8gMSA6IDI7CisgICAgaW50IGk7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiTm8gZXh0cmFkYXRhIHByb3ZpZGVkXG4iKTsKKyAgICB9CisKKyAgICBmZl9hc3ZfY29tbW9uX2luaXQoYXZjdHgpOworICAgIGZmX2Jsb2NrZHNwX2luaXQoJmEtPmJkc3AsIGF2Y3R4KTsKKyAgICBmZl9pZGN0ZHNwX2luaXQoJmEtPmlkc3AsIGF2Y3R4KTsKKyAgICBpbml0X3ZsY3MoYSk7CisgICAgZmZfaW5pdF9zY2FudGFibGUoYS0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmYS0+c2NhbnRhYmxlLCBmZl9hc3Zfc2NhbnRhYik7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMSB8fCAoYS0+aW52X3FzY2FsZSA9IGF2Y3R4LT5leHRyYWRhdGFbMF0pID09IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIHFzY2FsZSAwXG4iKTsKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BU1YxKQorICAgICAgICAgICAgYS0+aW52X3FzY2FsZSA9IDY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGEtPmludl9xc2NhbGUgPSAxMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBpbnQgaW5kZXggPSBmZl9hc3Zfc2NhbnRhYltpXTsKKworICAgICAgICBhLT5pbnRyYV9tYXRyaXhbaV0gPSA2NCAqIHNjYWxlICogZmZfbXBlZzFfZGVmYXVsdF9pbnRyYV9tYXRyaXhbaW5kZXhdIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+aW52X3FzY2FsZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFTVjFDb250ZXh0ICpjb25zdCBhID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZhLT5iaXRzdHJlYW1fYnVmZmVyKTsKKyAgICBhLT5iaXRzdHJlYW1fYnVmZmVyX3NpemUgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfQVNWMV9ERUNPREVSCitBVkNvZGVjIGZmX2FzdjFfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXN2MSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTVVMgVjEiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQVNWMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVNWMUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfQVNWMl9ERUNPREVSCitBVkNvZGVjIGZmX2FzdjJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXN2MiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTVVMgVjIiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQVNWMiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVNWMUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hc3ZlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2FzdmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjA4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hc3ZlbmMuYwpAQCAtMCwwICsxLDM3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFTVVMgVjEvVjIgZW5jb2Rlci4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNpbmNsdWRlICJhYW5kY3R0YWIuaCIKKyNpbmNsdWRlICJhc3YuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZGN0LmgiCisjaW5jbHVkZSAiZmRjdGRzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgIm1wZWcxMmRhdGEuaCIKKworc3RhdGljIGlubGluZSB2b2lkIGFzdjJfcHV0X2JpdHMoUHV0Qml0Q29udGV4dCAqcGIsIGludCBuLCBpbnQgdikKK3sKKyAgICBwdXRfYml0cyhwYiwgbiwgZmZfcmV2ZXJzZVt2IDw8ICg4IC0gbildKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFzdjFfcHV0X2xldmVsKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgbGV2ZWwpCit7CisgICAgdW5zaWduZWQgaW50IGluZGV4ID0gbGV2ZWwgKyAzOworCisgICAgaWYgKGluZGV4IDw9IDYpIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIGZmX2Fzdl9sZXZlbF90YWJbaW5kZXhdWzFdLCBmZl9hc3ZfbGV2ZWxfdGFiW2luZGV4XVswXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIGZmX2Fzdl9sZXZlbF90YWJbM11bMV0sIGZmX2Fzdl9sZXZlbF90YWJbM11bMF0pOworICAgICAgICBwdXRfc2JpdHMocGIsIDgsIGxldmVsKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3YyX3B1dF9sZXZlbChBU1YxQ29udGV4dCAqYSwgUHV0Qml0Q29udGV4dCAqcGIsIGludCBsZXZlbCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBsZXZlbCArIDMxOworCisgICAgaWYgKGluZGV4IDw9IDYyKSB7CisgICAgICAgIHB1dF9iaXRzKHBiLCBmZl9hc3YyX2xldmVsX3RhYltpbmRleF1bMV0sIGZmX2FzdjJfbGV2ZWxfdGFiW2luZGV4XVswXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIGZmX2FzdjJfbGV2ZWxfdGFiWzMxXVsxXSwgZmZfYXN2Ml9sZXZlbF90YWJbMzFdWzBdKTsKKyAgICAgICAgaWYgKGxldmVsIDwgLTEyOCB8fCBsZXZlbCA+IDEyNykgeworICAgICAgICAgICAgYXZfbG9nKGEtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNsaXBpbmcgbGV2ZWwgJWQsIGluY3JlYXNlIHFzY2FsZVxuIiwgbGV2ZWwpOworICAgICAgICAgICAgbGV2ZWwgPSBhdl9jbGlwX2ludDgobGV2ZWwpOworICAgICAgICB9CisgICAgICAgIGFzdjJfcHV0X2JpdHMocGIsIDgsIGxldmVsICYgMHhGRik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXN2MV9lbmNvZGVfYmxvY2soQVNWMUNvbnRleHQgKmEsIGludDE2X3QgYmxvY2tbNjRdKQoreworICAgIGludCBpOworICAgIGludCBuY19jb3VudCA9IDA7CisKKyAgICBwdXRfYml0cygmYS0+cGIsIDgsIChibG9ja1swXSArIDMyKSA+PiA2KTsKKyAgICBibG9ja1swXSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICBjb25zdCBpbnQgaW5kZXggPSBmZl9hc3Zfc2NhbnRhYls0ICogaV07CisgICAgICAgIGludCBjY3AgICAgICAgICA9IDA7CisKKyAgICAgICAgaWYgKChibG9ja1tpbmRleCArIDBdID0gKGJsb2NrW2luZGV4ICsgMF0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+cV9pbnRyYV9tYXRyaXhbaW5kZXggKyAwXSArICgxIDw8IDE1KSkgPj4gMTYpKQorICAgICAgICAgICAgY2NwIHw9IDg7CisgICAgICAgIGlmICgoYmxvY2tbaW5kZXggKyA4XSA9IChibG9ja1tpbmRleCArIDhdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnFfaW50cmFfbWF0cml4W2luZGV4ICsgOF0gKyAoMSA8PCAxNSkpID4+IDE2KSkKKyAgICAgICAgICAgIGNjcCB8PSA0OworICAgICAgICBpZiAoKGJsb2NrW2luZGV4ICsgMV0gPSAoYmxvY2tbaW5kZXggKyAxXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5xX2ludHJhX21hdHJpeFtpbmRleCArIDFdICsgKDEgPDwgMTUpKSA+PiAxNikpCisgICAgICAgICAgICBjY3AgfD0gMjsKKyAgICAgICAgaWYgKChibG9ja1tpbmRleCArIDldID0gKGJsb2NrW2luZGV4ICsgOV0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+cV9pbnRyYV9tYXRyaXhbaW5kZXggKyA5XSArICgxIDw8IDE1KSkgPj4gMTYpKQorICAgICAgICAgICAgY2NwIHw9IDE7CisKKyAgICAgICAgaWYgKGNjcCkgeworICAgICAgICAgICAgZm9yICg7IG5jX2NvdW50OyBuY19jb3VudC0tKQorICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZhLT5wYiwgZmZfYXN2X2NjcF90YWJbMF1bMV0sIGZmX2Fzdl9jY3BfdGFiWzBdWzBdKTsKKworICAgICAgICAgICAgcHV0X2JpdHMoJmEtPnBiLCBmZl9hc3ZfY2NwX3RhYltjY3BdWzFdLCBmZl9hc3ZfY2NwX3RhYltjY3BdWzBdKTsKKworICAgICAgICAgICAgaWYgKGNjcCAmIDgpCisgICAgICAgICAgICAgICAgYXN2MV9wdXRfbGV2ZWwoJmEtPnBiLCBibG9ja1tpbmRleCArIDBdKTsKKyAgICAgICAgICAgIGlmIChjY3AgJiA0KQorICAgICAgICAgICAgICAgIGFzdjFfcHV0X2xldmVsKCZhLT5wYiwgYmxvY2tbaW5kZXggKyA4XSk7CisgICAgICAgICAgICBpZiAoY2NwICYgMikKKyAgICAgICAgICAgICAgICBhc3YxX3B1dF9sZXZlbCgmYS0+cGIsIGJsb2NrW2luZGV4ICsgMV0pOworICAgICAgICAgICAgaWYgKGNjcCAmIDEpCisgICAgICAgICAgICAgICAgYXN2MV9wdXRfbGV2ZWwoJmEtPnBiLCBibG9ja1tpbmRleCArIDldKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5jX2NvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgcHV0X2JpdHMoJmEtPnBiLCBmZl9hc3ZfY2NwX3RhYlsxNl1bMV0sIGZmX2Fzdl9jY3BfdGFiWzE2XVswXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3YyX2VuY29kZV9ibG9jayhBU1YxQ29udGV4dCAqYSwgaW50MTZfdCBibG9ja1s2NF0pCit7CisgICAgaW50IGk7CisgICAgaW50IGNvdW50ID0gMDsKKworICAgIGZvciAoY291bnQgPSA2MzsgY291bnQgPiAzOyBjb3VudC0tKSB7CisgICAgICAgIGNvbnN0IGludCBpbmRleCA9IGZmX2Fzdl9zY2FudGFiW2NvdW50XTsKKyAgICAgICAgaWYgKChibG9ja1tpbmRleF0gKiBhLT5xX2ludHJhX21hdHJpeFtpbmRleF0gKyAoMSA8PCAxNSkpID4+IDE2KQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY291bnQgPj49IDI7CisKKyAgICBhc3YyX3B1dF9iaXRzKCZhLT5wYiwgNCwgY291bnQpOworICAgIGFzdjJfcHV0X2JpdHMoJmEtPnBiLCA4LCAoYmxvY2tbMF0gKyAzMikgPj4gNik7CisgICAgYmxvY2tbMF0gPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8PSBjb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBpbmRleCA9IGZmX2Fzdl9zY2FudGFiWzQgKiBpXTsKKyAgICAgICAgaW50IGNjcCAgICAgICAgID0gMDsKKworICAgICAgICBpZiAoKGJsb2NrW2luZGV4ICsgMF0gPSAoYmxvY2tbaW5kZXggKyAwXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5xX2ludHJhX21hdHJpeFtpbmRleCArIDBdICsgKDEgPDwgMTUpKSA+PiAxNikpCisgICAgICAgICAgICBjY3AgfD0gODsKKyAgICAgICAgaWYgKChibG9ja1tpbmRleCArIDhdID0gKGJsb2NrW2luZGV4ICsgOF0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+cV9pbnRyYV9tYXRyaXhbaW5kZXggKyA4XSArICgxIDw8IDE1KSkgPj4gMTYpKQorICAgICAgICAgICAgY2NwIHw9IDQ7CisgICAgICAgIGlmICgoYmxvY2tbaW5kZXggKyAxXSA9IChibG9ja1tpbmRleCArIDFdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnFfaW50cmFfbWF0cml4W2luZGV4ICsgMV0gKyAoMSA8PCAxNSkpID4+IDE2KSkKKyAgICAgICAgICAgIGNjcCB8PSAyOworICAgICAgICBpZiAoKGJsb2NrW2luZGV4ICsgOV0gPSAoYmxvY2tbaW5kZXggKyA5XSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5xX2ludHJhX21hdHJpeFtpbmRleCArIDldICsgKDEgPDwgMTUpKSA+PiAxNikpCisgICAgICAgICAgICBjY3AgfD0gMTsKKworICAgICAgICBhdl9hc3NlcnQyKGkgfHwgY2NwIDwgOCk7CisgICAgICAgIGlmIChpKQorICAgICAgICAgICAgcHV0X2JpdHMoJmEtPnBiLCBmZl9hc3ZfYWNfY2NwX3RhYltjY3BdWzFdLCBmZl9hc3ZfYWNfY2NwX3RhYltjY3BdWzBdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHV0X2JpdHMoJmEtPnBiLCBmZl9hc3ZfZGNfY2NwX3RhYltjY3BdWzFdLCBmZl9hc3ZfZGNfY2NwX3RhYltjY3BdWzBdKTsKKworICAgICAgICBpZiAoY2NwKSB7CisgICAgICAgICAgICBpZiAoY2NwICYgOCkKKyAgICAgICAgICAgICAgICBhc3YyX3B1dF9sZXZlbChhLCAmYS0+cGIsIGJsb2NrW2luZGV4ICsgMF0pOworICAgICAgICAgICAgaWYgKGNjcCAmIDQpCisgICAgICAgICAgICAgICAgYXN2Ml9wdXRfbGV2ZWwoYSwgJmEtPnBiLCBibG9ja1tpbmRleCArIDhdKTsKKyAgICAgICAgICAgIGlmIChjY3AgJiAyKQorICAgICAgICAgICAgICAgIGFzdjJfcHV0X2xldmVsKGEsICZhLT5wYiwgYmxvY2tbaW5kZXggKyAxXSk7CisgICAgICAgICAgICBpZiAoY2NwICYgMSkKKyAgICAgICAgICAgICAgICBhc3YyX3B1dF9sZXZlbChhLCAmYS0+cGIsIGJsb2NrW2luZGV4ICsgOV0pOworICAgICAgICB9CisgICAgfQorfQorCisjZGVmaW5lIE1BWF9NQl9TSVpFICgzMCAqIDE2ICogMTYgKiAzIC8gMiAvIDgpCisKK3N0YXRpYyBpbmxpbmUgaW50IGVuY29kZV9tYihBU1YxQ29udGV4dCAqYSwgaW50MTZfdCBibG9ja1s2XVs2NF0pCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoYS0+cGIuYnVmX2VuZCAtIGEtPnBiLmJ1ZiAtIChwdXRfYml0c19jb3VudCgmYS0+cGIpID4+IDMpIDwgTUFYX01CX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGEtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlbmNvZGVkIGZyYW1lIHRvbyBsYXJnZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoYS0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FTVjEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIGFzdjFfZW5jb2RlX2Jsb2NrKGEsIGJsb2NrW2ldKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgYXN2Ml9lbmNvZGVfYmxvY2soYSwgYmxvY2tbaV0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRjdF9nZXQoQVNWMUNvbnRleHQgKmEsIGNvbnN0IEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3gsIGludCBtYl95KQoreworICAgIGludDE2X3QgKCpibG9jaylbNjRdID0gYS0+YmxvY2s7CisgICAgaW50IGxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIGludCBpOworCisgICAgdWludDhfdCAqcHRyX3kgID0gZnJhbWUtPmRhdGFbMF0gKyAobWJfeSAqIDE2ICogbGluZXNpemUpICAgICAgICAgICArIG1iX3ggKiAxNjsKKyAgICB1aW50OF90ICpwdHJfY2IgPSBmcmFtZS0+ZGF0YVsxXSArIChtYl95ICogIDggKiBmcmFtZS0+bGluZXNpemVbMV0pICsgbWJfeCAqICA4OworICAgIHVpbnQ4X3QgKnB0cl9jciA9IGZyYW1lLT5kYXRhWzJdICsgKG1iX3kgKiAgOCAqIGZyYW1lLT5saW5lc2l6ZVsyXSkgKyBtYl94ICogIDg7CisKKyAgICBhLT5wZHNwLmdldF9waXhlbHMoYmxvY2tbMF0sIHB0cl95LCAgICAgICAgICAgICAgICAgICAgbGluZXNpemUpOworICAgIGEtPnBkc3AuZ2V0X3BpeGVscyhibG9ja1sxXSwgcHRyX3kgKyA4LCAgICAgICAgICAgICAgICBsaW5lc2l6ZSk7CisgICAgYS0+cGRzcC5nZXRfcGl4ZWxzKGJsb2NrWzJdLCBwdHJfeSArIDggKiBsaW5lc2l6ZSwgICAgIGxpbmVzaXplKTsKKyAgICBhLT5wZHNwLmdldF9waXhlbHMoYmxvY2tbM10sIHB0cl95ICsgOCAqIGxpbmVzaXplICsgOCwgbGluZXNpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGEtPmZkc3AuZmRjdChibG9ja1tpXSk7CisKKyAgICBpZiAoIShhLT5hdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgIGEtPnBkc3AuZ2V0X3BpeGVscyhibG9ja1s0XSwgcHRyX2NiLCBmcmFtZS0+bGluZXNpemVbMV0pOworICAgICAgICBhLT5wZHNwLmdldF9waXhlbHMoYmxvY2tbNV0sIHB0cl9jciwgZnJhbWUtPmxpbmVzaXplWzJdKTsKKyAgICAgICAgZm9yIChpID0gNDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIGEtPmZkc3AuZmRjdChibG9ja1tpXSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGVuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWN0LCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgQVNWMUNvbnRleHQgKmNvbnN0IGEgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBzaXplLCByZXQ7CisgICAgaW50IG1iX3gsIG1iX3k7CisKKyAgICBpZiAocGljdC0+d2lkdGggJSAxNiB8fCBwaWN0LT5oZWlnaHQgJSAxNikgeworICAgICAgICBBVkZyYW1lICpjbG9uZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmICghY2xvbmUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBjbG9uZS0+Zm9ybWF0ID0gcGljdC0+Zm9ybWF0OworICAgICAgICBjbG9uZS0+d2lkdGggID0gRkZBTElHTihwaWN0LT53aWR0aCwgMTYpOworICAgICAgICBjbG9uZS0+aGVpZ2h0ID0gRkZBTElHTihwaWN0LT5oZWlnaHQsIDE2KTsKKyAgICAgICAgcmV0ID0gYXZfZnJhbWVfZ2V0X2J1ZmZlcihjbG9uZSwgMzIpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmY2xvbmUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGF2X2ZyYW1lX2NvcHkoY2xvbmUsIHBpY3QpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmY2xvbmUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGk8MzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgeCwgeTsKKyAgICAgICAgICAgIGludCB3ICA9IEZGX0NFSUxfUlNISUZUKHBpY3QtPndpZHRoLCAhIWkpOworICAgICAgICAgICAgaW50IGggID0gRkZfQ0VJTF9SU0hJRlQocGljdC0+aGVpZ2h0LCAhIWkpOworICAgICAgICAgICAgaW50IHcyID0gRkZfQ0VJTF9SU0hJRlQoY2xvbmUtPndpZHRoLCAhIWkpOworICAgICAgICAgICAgaW50IGgyID0gRkZfQ0VJTF9SU0hJRlQoY2xvbmUtPmhlaWdodCwgISFpKTsKKyAgICAgICAgICAgIGZvciAoeT0wOyB5PGg7IHkrKykKKyAgICAgICAgICAgICAgICBmb3IgKHg9dzsgeDx3MjsgeCsrKQorICAgICAgICAgICAgICAgICAgICBjbG9uZS0+ZGF0YVtpXVt4ICsgeSpjbG9uZS0+bGluZXNpemVbaV1dID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLT5kYXRhW2ldW3cgLSAxICsgeSpjbG9uZS0+bGluZXNpemVbaV1dOworICAgICAgICAgICAgZm9yICh5PWg7IHk8aDI7IHkrKykKKyAgICAgICAgICAgICAgICBmb3IgKHg9MDsgeDx3MjsgeCsrKQorICAgICAgICAgICAgICAgICAgICBjbG9uZS0+ZGF0YVtpXVt4ICsgeSpjbG9uZS0+bGluZXNpemVbaV1dID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLT5kYXRhW2ldW3ggKyAoaC0xKSpjbG9uZS0+bGluZXNpemVbaV1dOworICAgICAgICB9CisgICAgICAgIHJldCA9IGVuY29kZV9mcmFtZShhdmN0eCwgcGt0LCBjbG9uZSwgZ290X3BhY2tldCk7CisKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmY2xvbmUpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBhLT5tYl9oZWlnaHQgKiBhLT5tYl93aWR0aCAqIE1BWF9NQl9TSVpFICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfTUlOX0JVRkZFUl9TSVpFKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaW5pdF9wdXRfYml0cygmYS0+cGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKworICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBhLT5tYl9oZWlnaHQyOyBtYl95KyspIHsKKyAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IGEtPm1iX3dpZHRoMjsgbWJfeCsrKSB7CisgICAgICAgICAgICBkY3RfZ2V0KGEsIHBpY3QsIG1iX3gsIG1iX3kpOworICAgICAgICAgICAgZW5jb2RlX21iKGEsIGEtPmJsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhLT5tYl93aWR0aDIgIT0gYS0+bWJfd2lkdGgpIHsKKyAgICAgICAgbWJfeCA9IGEtPm1iX3dpZHRoMjsKKyAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IGEtPm1iX2hlaWdodDI7IG1iX3krKykgeworICAgICAgICAgICAgZGN0X2dldChhLCBwaWN0LCBtYl94LCBtYl95KTsKKyAgICAgICAgICAgIGVuY29kZV9tYihhLCBhLT5ibG9jayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYS0+bWJfaGVpZ2h0MiAhPSBhLT5tYl9oZWlnaHQpIHsKKyAgICAgICAgbWJfeSA9IGEtPm1iX2hlaWdodDI7CisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBhLT5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICBkY3RfZ2V0KGEsIHBpY3QsIG1iX3gsIG1iX3kpOworICAgICAgICAgICAgZW5jb2RlX21iKGEsIGEtPmJsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbW1zX2MoKTsKKworICAgIGF2cHJpdl9hbGlnbl9wdXRfYml0cygmYS0+cGIpOworICAgIHdoaWxlIChwdXRfYml0c19jb3VudCgmYS0+cGIpICYgMzEpCisgICAgICAgIHB1dF9iaXRzKCZhLT5wYiwgOCwgMCk7CisKKyAgICBzaXplID0gcHV0X2JpdHNfY291bnQoJmEtPnBiKSAvIDMyOworCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BU1YxKSB7CisgICAgICAgIGEtPmJiZHNwLmJzd2FwX2J1ZigodWludDMyX3QgKikgcGt0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopIHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICogc2l6ZTsgaSsrKQorICAgICAgICAgICAgcGt0LT5kYXRhW2ldID0gZmZfcmV2ZXJzZVtwa3QtPmRhdGFbaV1dOworICAgIH0KKworICAgIHBrdC0+c2l6ZSAgID0gc2l6ZSAqIDQ7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQVNWMUNvbnRleHQgKmNvbnN0IGEgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworICAgIGNvbnN0IGludCBzY2FsZSA9IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BU1YxID8gMSA6IDI7CisKKyAgICBmZl9hc3ZfY29tbW9uX2luaXQoYXZjdHgpOworICAgIGZmX2ZkY3Rkc3BfaW5pdCgmYS0+ZmRzcCwgYXZjdHgpOworICAgIGZmX3BpeGJsb2NrZHNwX2luaXQoJmEtPnBkc3AsIGF2Y3R4KTsKKworICAgIGlmIChhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgPD0gMCkKKyAgICAgICAgYXZjdHgtPmdsb2JhbF9xdWFsaXR5ID0gNCAqIEZGX1FVQUxJVFlfU0NBTEU7CisKKyAgICBhLT5pbnZfcXNjYWxlID0gKDMyICogc2NhbGUgKiBGRl9RVUFMSVRZX1NDQUxFICsKKyAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSAvIDIpIC8gYXZjdHgtPmdsb2JhbF9xdWFsaXR5OworCisgICAgYXZjdHgtPmV4dHJhZGF0YSAgICAgICAgICAgICAgICAgICA9IGF2X21hbGxvY3ooOCk7CisgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplICAgICAgICAgICAgICA9IDg7CisgICAgKCh1aW50MzJfdCAqKSBhdmN0eC0+ZXh0cmFkYXRhKVswXSA9IGF2X2xlMm5lMzIoYS0+aW52X3FzY2FsZSk7CisgICAgKCh1aW50MzJfdCAqKSBhdmN0eC0+ZXh0cmFkYXRhKVsxXSA9IGF2X2xlMm5lMzIoQVZfUkwzMigiQVNVUyIpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIGlmIChhLT5mZHNwLmZkY3QgPT0gZmZfZmRjdF9pZmFzdCkgeworICAgICAgICAgICAgaW50IHEgPSAzMkxMICogc2NhbGUgKiBmZl9tcGVnMV9kZWZhdWx0X2ludHJhX21hdHJpeFtpXSAqIGZmX2FhbnNjYWxlc1tpXTsKKyAgICAgICAgICAgIGEtPnFfaW50cmFfbWF0cml4W2ldID0gKCgoaW50NjRfdClhLT5pbnZfcXNjYWxlIDw8IDMwKSArIHEgLyAyKSAvIHE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcSA9IDMyICogc2NhbGUgKiBmZl9tcGVnMV9kZWZhdWx0X2ludHJhX21hdHJpeFtpXTsKKyAgICAgICAgICAgIGEtPnFfaW50cmFfbWF0cml4W2ldID0gKChhLT5pbnZfcXNjYWxlIDw8IDE2KSArIHEgLyAyKSAvIHE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19BU1YxX0VOQ09ERVIKK0FWQ29kZWMgZmZfYXN2MV9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhc3YxIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVNVUyBWMSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BU1YxLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBU1YxQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX2ZyYW1lLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeyBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0FTVjJfRU5DT0RFUgorQVZDb2RlYyBmZl9hc3YyX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFzdjIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBU1VTIFYyIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FTVjIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFTVjFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBlbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBlbmNvZGVfZnJhbWUsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hdHJhYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmU4OTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIGNvbW1vbiBmdW5jdGlvbnMgZm9yIHRoZSBBVFJBQyBmYW1pbHkgb2YgZGVjb2RlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMyBNYXhpbSBQb2xpYWtvdnNraQorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggQmVuamFtaW4gTGFyc3NvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImF0cmFjLmgiCisKK2Zsb2F0IGZmX2F0cmFjX3NmX3RhYmxlWzY0XTsKK3N0YXRpYyBmbG9hdCBxbWZfd2luZG93WzQ4XTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHFtZl80OHRhcF9oYWxmWzI0XSA9IHsKKyAgIC0wLjAwMDAxNDYxOTA3LCAtMC4wMDAwOTIwNTQ3OSwtMC4wMDAwNTYxNTc1NjksMC4wMDAzMDExNzI2OSwKKyAgICAwLjAwMDI0MjI1MTksICAtMC4wMDA4NTI5Mzg5NywtMC4wMDA1MjA1NTc0LCAgMC4wMDIwMzQwMTY5LAorICAgIDAuMDAwNzgzMzM4OTEsIC0wLjAwNDIxNTM4NjIsIC0wLjAwMDc1NjE0OTg4LCAwLjAwNzg0MDI5NDQsCisgICAtMC4wMDAwNjExNjk5MjIsLTAuMDEzNDQxNjIsICAgIDAuMDAyNDYyNjgyMSwgIDAuMDIxNzM2MDg5LAorICAgLTAuMDA3ODAxNjcxLCAgIC0wLjAzNDA5MDIyMSwgICAwLjAxODgwOTQ5LCAgICAwLjA1NDMyNjAwOSwKKyAgIC0wLjA0MzU5NjM3OSwgICAtMC4wOTkzODQzNjcsICAgMC4xMzIwNzkwOSwgICAgMC40NjQyNDE1OQorfTsKKworYXZfY29sZCB2b2lkIGZmX2F0cmFjX2dlbmVyYXRlX3RhYmxlcyh2b2lkKQoreworICAgIGludCBpOworICAgIGZsb2F0IHM7CisKKyAgICAvKiBHZW5lcmF0ZSBzY2FsZSBmYWN0b3JzICovCisgICAgaWYgKCFmZl9hdHJhY19zZl90YWJsZVs2M10pCisgICAgICAgIGZvciAoaT0wIDsgaTw2NCA7IGkrKykKKyAgICAgICAgICAgIGZmX2F0cmFjX3NmX3RhYmxlW2ldID0gcG93KDIuMCwgKGkgLSAxNSkgLyAzLjApOworCisgICAgLyogR2VuZXJhdGUgdGhlIFFNRiB3aW5kb3cuICovCisgICAgaWYgKCFxbWZfd2luZG93WzQ3XSkKKyAgICAgICAgZm9yIChpPTAgOyBpPDI0OyBpKyspIHsKKyAgICAgICAgICAgIHMgPSBxbWZfNDh0YXBfaGFsZltpXSAqIDIuMDsKKyAgICAgICAgICAgIHFtZl93aW5kb3dbaV0gPSBxbWZfd2luZG93WzQ3IC0gaV0gPSBzOworICAgICAgICB9Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9hdHJhY19pbml0X2dhaW5fY29tcGVuc2F0aW9uKEF0cmFjR0NDb250ZXh0ICpnY3R4LCBpbnQgaWQyZXhwX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2Nfc2NhbGUpCit7CisgICAgaW50IGk7CisKKyAgICBnY3R4LT5sb2Nfc2NhbGUgICAgID0gbG9jX3NjYWxlOworICAgIGdjdHgtPmxvY19zaXplICAgICAgPSAxIDw8IGxvY19zY2FsZTsKKyAgICBnY3R4LT5pZDJleHBfb2Zmc2V0ID0gaWQyZXhwX29mZnNldDsKKworICAgIC8qIEdlbmVyYXRlIGdhaW4gbGV2ZWwgdGFibGUuICovCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGdjdHgtPmdhaW5fdGFiMVtpXSA9IHBvd2YoMi4wLCBpZDJleHBfb2Zmc2V0IC0gaSk7CisKKyAgICAvKiBHZW5lcmF0ZSBnYWluIGludGVycG9sYXRpb24gdGFibGUuICovCisgICAgZm9yIChpID0gLTE1OyBpIDwgMTY7IGkrKykKKyAgICAgICAgZ2N0eC0+Z2Fpbl90YWIyW2kgKyAxNV0gPSBwb3dmKDIuMCwgLTEuMGYgLyBnY3R4LT5sb2Nfc2l6ZSAqIGkpOworfQorCit2b2lkIGZmX2F0cmFjX2dhaW5fY29tcGVuc2F0aW9uKEF0cmFjR0NDb250ZXh0ICpnY3R4LCBmbG9hdCAqaW4sIGZsb2F0ICpwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHJhY0dhaW5JbmZvICpnY19ub3csIEF0cmFjR2FpbkluZm8gKmdjX25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fc2FtcGxlcywgZmxvYXQgKm91dCkKK3sKKyAgICBmbG9hdCBsZXYsIGdjX3NjYWxlLCBnYWluX2luYzsKKyAgICBpbnQgaSwgcG9zLCBsYXN0cG9zOworCisgICAgZ2Nfc2NhbGUgPSBnY19uZXh0LT5udW1fcG9pbnRzID8gZ2N0eC0+Z2Fpbl90YWIxW2djX25leHQtPmxldl9jb2RlWzBdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDEuMGY7CisKKyAgICBpZiAoIWdjX25vdy0+bnVtX3BvaW50cykgeworICAgICAgICBmb3IgKHBvcyA9IDA7IHBvcyA8IG51bV9zYW1wbGVzOyBwb3MrKykKKyAgICAgICAgICAgIG91dFtwb3NdID0gaW5bcG9zXSAqIGdjX3NjYWxlICsgcHJldltwb3NdOworICAgIH0gZWxzZSB7CisgICAgICAgIHBvcyA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGdjX25vdy0+bnVtX3BvaW50czsgaSsrKSB7CisgICAgICAgICAgICBsYXN0cG9zID0gZ2Nfbm93LT5sb2NfY29kZVtpXSA8PCBnY3R4LT5sb2Nfc2NhbGU7CisKKyAgICAgICAgICAgIGxldiA9IGdjdHgtPmdhaW5fdGFiMVtnY19ub3ctPmxldl9jb2RlW2ldXTsKKyAgICAgICAgICAgIGdhaW5faW5jID0gZ2N0eC0+Z2Fpbl90YWIyWyhpICsgMSA8IGdjX25vdy0+bnVtX3BvaW50cyA/IGdjX25vdy0+bGV2X2NvZGVbaSArIDFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnY3R4LT5pZDJleHBfb2Zmc2V0KSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY19ub3ctPmxldl9jb2RlW2ldICsgMTVdOworCisgICAgICAgICAgICAvKiBhcHBseSBjb25zdGFudCBnYWluIGxldmVsIGFuZCBvdmVybGFwICovCisgICAgICAgICAgICBmb3IgKDsgcG9zIDwgbGFzdHBvczsgcG9zKyspCisgICAgICAgICAgICAgICAgb3V0W3Bvc10gPSAoaW5bcG9zXSAqIGdjX3NjYWxlICsgcHJldltwb3NdKSAqIGxldjsKKworICAgICAgICAgICAgLyogaW50ZXJwb2xhdGUgYmV0d2VlbiB0d28gZGlmZmVyZW50IGdhaW4gbGV2ZWxzICovCisgICAgICAgICAgICBmb3IgKDsgcG9zIDwgbGFzdHBvcyArIGdjdHgtPmxvY19zaXplOyBwb3MrKykgeworICAgICAgICAgICAgICAgIG91dFtwb3NdID0gKGluW3Bvc10gKiBnY19zY2FsZSArIHByZXZbcG9zXSkgKiBsZXY7CisgICAgICAgICAgICAgICAgbGV2ICo9IGdhaW5faW5jOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICg7IHBvcyA8IG51bV9zYW1wbGVzOyBwb3MrKykKKyAgICAgICAgICAgIG91dFtwb3NdID0gaW5bcG9zXSAqIGdjX3NjYWxlICsgcHJldltwb3NdOworICAgIH0KKworICAgIC8qIGNvcHkgdGhlIG92ZXJsYXBwaW5nIHBhcnQgaW50byB0aGUgZGVsYXkgYnVmZmVyICovCisgICAgbWVtY3B5KHByZXYsICZpbltudW1fc2FtcGxlc10sIG51bV9zYW1wbGVzICogc2l6ZW9mKGZsb2F0KSk7Cit9CisKK3ZvaWQgZmZfYXRyYWNfaXFtZihmbG9hdCAqaW5sbywgZmxvYXQgKmluaGksIHVuc2lnbmVkIGludCBuSW4sIGZsb2F0ICpwT3V0LAorICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZWxheUJ1ZiwgZmxvYXQgKnRlbXApCit7CisgICAgaW50ICAgaSwgajsKKyAgICBmbG9hdCAgICpwMSwgKnAzOworCisgICAgbWVtY3B5KHRlbXAsIGRlbGF5QnVmLCA0NipzaXplb2YoZmxvYXQpKTsKKworICAgIHAzID0gdGVtcCArIDQ2OworCisgICAgLyogbG9vcDEgKi8KKyAgICBmb3IoaT0wOyBpPG5JbjsgaSs9Mil7CisgICAgICAgIHAzWzIqaSswXSA9IGlubG9baSAgXSArIGluaGlbaSAgXTsKKyAgICAgICAgcDNbMippKzFdID0gaW5sb1tpICBdIC0gaW5oaVtpICBdOworICAgICAgICBwM1syKmkrMl0gPSBpbmxvW2krMV0gKyBpbmhpW2krMV07CisgICAgICAgIHAzWzIqaSszXSA9IGlubG9baSsxXSAtIGluaGlbaSsxXTsKKyAgICB9CisKKyAgICAvKiBsb29wMiAqLworICAgIHAxID0gdGVtcDsKKyAgICBmb3IgKGogPSBuSW47IGogIT0gMDsgai0tKSB7CisgICAgICAgIGZsb2F0IHMxID0gMC4wOworICAgICAgICBmbG9hdCBzMiA9IDAuMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDg7IGkgKz0gMikgeworICAgICAgICAgICAgczEgKz0gcDFbaV0gKiBxbWZfd2luZG93W2ldOworICAgICAgICAgICAgczIgKz0gcDFbaSsxXSAqIHFtZl93aW5kb3dbaSsxXTsKKyAgICAgICAgfQorCisgICAgICAgIHBPdXRbMF0gPSBzMjsKKyAgICAgICAgcE91dFsxXSA9IHMxOworCisgICAgICAgIHAxICs9IDI7CisgICAgICAgIHBPdXQgKz0gMjsKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgdGhlIGRlbGF5IGJ1ZmZlci4gKi8KKyAgICBtZW1jcHkoZGVsYXlCdWYsIHRlbXAgKyBuSW4qMiwgNDYqc2l6ZW9mKGZsb2F0KSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hdHJhYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTIwOGJiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogY29tbW9uIGZ1bmN0aW9ucyBmb3IgdGhlIEFUUkFDIGZhbWlseSBvZiBkZWNvZGVycworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEzIE1heGltIFBvbGlha292c2tpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQmVuamFtaW4gTGFyc3NvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBVFJBQyBjb21tb24gaGVhZGVyCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FUUkFDX0gKKyNkZWZpbmUgQVZDT0RFQ19BVFJBQ19ICisKKy8qKgorICogIEdhaW4gY29udHJvbCBwYXJhbWV0ZXJzIGZvciBvbmUgc3ViYmFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQXRyYWNHYWluSW5mbyB7CisgICAgaW50ICAgbnVtX3BvaW50czsgICAvLy88IG51bWJlciBvZiBnYWluIGNvbnRyb2wgcG9pbnRzCisgICAgaW50ICAgbGV2X2NvZGVbN107ICAvLy88IGxldmVsIGF0IGNvcnJlc3BvbmRpbmcgY29udHJvbCBwb2ludAorICAgIGludCAgIGxvY19jb2RlWzddOyAgLy8vPCBsb2NhdGlvbiBvZiBnYWluIGNvbnRyb2wgcG9pbnRzCit9IEF0cmFjR2FpbkluZm87CisKKy8qKgorICogIEdhaW4gY29tcGVuc2F0aW9uIGNvbnRleHQgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBBdHJhY0dDQ29udGV4dCB7CisgICAgZmxvYXQgICBnYWluX3RhYjFbMTZdOyAgLy8vPCBnYWluIGNvbXBlbnNhdGlvbiBsZXZlbCB0YWJsZQorICAgIGZsb2F0ICAgZ2Fpbl90YWIyWzMxXTsgIC8vLzwgZ2FpbiBjb21wZW5zYXRpb24gaW50ZXJwb2xhdGlvbiB0YWJsZQorICAgIGludCAgICAgaWQyZXhwX29mZnNldDsgIC8vLzwgb2Zmc2V0IGZvciBjb252ZXJ0aW5nIGxldmVsIGluZGV4IGludG8gbGV2ZWwgZXhwb25lbnQKKyAgICBpbnQgICAgIGxvY19zY2FsZTsgICAgICAvLy88IHNjYWxlIG9mIGxvY2F0aW9uIGNvZGUgPSAyXmxvY19zY2FsZSBzYW1wbGVzCisgICAgaW50ICAgICBsb2Nfc2l6ZTsgICAgICAgLy8vPCBzaXplIG9mIGxvY2F0aW9uIGNvZGUgaW4gc2FtcGxlcworfSBBdHJhY0dDQ29udGV4dDsKKworZXh0ZXJuIGZsb2F0IGZmX2F0cmFjX3NmX3RhYmxlWzY0XTsKKworLyoqCisgKiBHZW5lcmF0ZSBjb21tb24gdGFibGVzLgorICovCit2b2lkIGZmX2F0cmFjX2dlbmVyYXRlX3RhYmxlcyh2b2lkKTsKKworLyoqCisgKiAgSW5pdGlhbGl6ZSBnYWluIGNvbXBlbnNhdGlvbiBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBnY3R4ICAgICAgICAgICAgcG9pbnRlciB0byBnYWluIGNvbXBlbnNhdGlvbiBjb250ZXh0IHRvIGluaXRpYWxpemUKKyAqIEBwYXJhbSBpZDJleHBfb2Zmc2V0ICAgb2Zmc2V0IGZvciBjb252ZXJ0aW5nIGxldmVsIGluZGV4IGludG8gbGV2ZWwgZXhwb25lbnQKKyAqIEBwYXJhbSBsb2Nfc2NhbGUgICAgICAgbG9jYXRpb24gc2l6ZSBmYWN0b3IKKyAqLwordm9pZCBmZl9hdHJhY19pbml0X2dhaW5fY29tcGVuc2F0aW9uKEF0cmFjR0NDb250ZXh0ICpnY3R4LCBpbnQgaWQyZXhwX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9jX3NjYWxlKTsKKworLyoqCisgKiBBcHBseSBnYWluIGNvbXBlbnNhdGlvbiBhbmQgcGVyZm9ybSB0aGUgTURDVCBvdmVybGFwcGluZyBwYXJ0LgorICoKKyAqIEBwYXJhbSBnY3R4ICAgICAgICAgcG9pbnRlciB0byBnYWluIGNvbXBlbnNhdGlvbiBjb250ZXh0CisgKiBAcGFyYW0gaW4gICAgICAgICAgIGlucHV0IGJ1ZmZlcgorICogQHBhcmFtIHByZXYgICAgICAgICBwcmV2aW91cyBidWZmZXIgdG8gcGVyZm9ybSBvdmVybGFwIGFnYWluc3QKKyAqIEBwYXJhbSBnY19ub3cgICAgICAgZ2FpbiBjb250cm9sIGluZm9ybWF0aW9uIGZvciBjdXJyZW50IGZyYW1lCisgKiBAcGFyYW0gZ2NfbmV4dCAgICAgIGdhaW4gY29udHJvbCBpbmZvcm1hdGlvbiBmb3IgbmV4dCBmcmFtZQorICogQHBhcmFtIG51bV9zYW1wbGVzICBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzCisgKiBAcGFyYW0gb3V0ICAgICAgICAgIG91dHB1dCBkYXRhIGdvZXMgaGVyZQorICovCit2b2lkIGZmX2F0cmFjX2dhaW5fY29tcGVuc2F0aW9uKEF0cmFjR0NDb250ZXh0ICpnY3R4LCBmbG9hdCAqaW4sIGZsb2F0ICpwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHJhY0dhaW5JbmZvICpnY19ub3csIEF0cmFjR2FpbkluZm8gKmdjX25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fc2FtcGxlcywgZmxvYXQgKm91dCk7CisKKy8qKgorICogUXVhZHJhdHVyZSBtaXJyb3Igc3ludGhlc2lzIGZpbHRlci4KKyAqCisgKiBAcGFyYW0gaW5sbyAgICAgIGxvd2VyIHBhcnQgb2Ygc3BlY3RydW0KKyAqIEBwYXJhbSBpbmhpICAgICAgaGlnaGVyIHBhcnQgb2Ygc3BlY3RydW0KKyAqIEBwYXJhbSBuSW4gICAgICAgc2l6ZSBvZiBzcGVjdHJ1bSBidWZmZXIKKyAqIEBwYXJhbSBwT3V0ICAgICAgb3V0IGJ1ZmZlcgorICogQHBhcmFtIGRlbGF5QnVmICBkZWxheUJ1ZiBidWZmZXIKKyAqIEBwYXJhbSB0ZW1wICAgICAgdGVtcCBidWZmZXIKKyAqLwordm9pZCBmZl9hdHJhY19pcW1mKGZsb2F0ICppbmxvLCBmbG9hdCAqaW5oaSwgdW5zaWduZWQgaW50IG5JbiwgZmxvYXQgKnBPdXQsCisgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlbGF5QnVmLCBmbG9hdCAqdGVtcCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FUUkFDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F0cmFjMS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViMDY4YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F0cmFjMS5jCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogQVRSQUMxIGNvbXBhdGlibGUgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1heGltIFBvbGlha292c2tpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQmVuamFtaW4gTGFyc3NvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBVFJBQzEgY29tcGF0aWJsZSBkZWNvZGVyLgorICogVGhpcyBkZWNvZGVyIGhhbmRsZXMgcmF3IEFUUkFDMSBkYXRhIGFuZCBwcm9iYWJseSBTRERTIGRhdGEuCisgKi8KKworLyogTWFueSB0aGFua3MgdG8gVGltIENyYWlnIGZvciBhbGwgdGhlIGhlbHAhICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInNpbmV3aW4uaCIKKworI2luY2x1ZGUgImF0cmFjLmgiCisjaW5jbHVkZSAiYXRyYWMxZGF0YS5oIgorCisjZGVmaW5lIEFUMV9NQVhfQkZVICAgICAgNTIgICAgICAgICAgICAgICAgIC8vLzwgbWF4IG51bWJlciBvZiBibG9jayBmbG9hdGluZyB1bml0cyBpbiBhIHNvdW5kIHVuaXQKKyNkZWZpbmUgQVQxX1NVX1NJWkUgICAgICAyMTIgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgYnl0ZXMgaW4gYSBzb3VuZCB1bml0CisjZGVmaW5lIEFUMV9TVV9TQU1QTEVTICAgNTEyICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHNhbXBsZXMgaW4gYSBzb3VuZCB1bml0CisjZGVmaW5lIEFUMV9GUkFNRV9TSVpFICAgQVQxX1NVX1NJWkUgKiAyCisjZGVmaW5lIEFUMV9TVV9NQVhfQklUUyAgQVQxX1NVX1NJWkUgKiA4CisjZGVmaW5lIEFUMV9NQVhfQ0hBTk5FTFMgMgorCisjZGVmaW5lIEFUMV9RTUZfQkFORFMgICAgMworI2RlZmluZSBJRFhfTE9XX0JBTkQgICAgIDAKKyNkZWZpbmUgSURYX01JRF9CQU5EICAgICAxCisjZGVmaW5lIElEWF9ISUdIX0JBTkQgICAgMgorCisvKioKKyAqIFNvdW5kIHVuaXQgc3RydWN0LCBvbmUgdW5pdCBpcyB1c2VkIHBlciBjaGFubmVsCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGxvZzJfYmxvY2tfY291bnRbQVQxX1FNRl9CQU5EU107ICAgIC8vLzwgbG9nMiBudW1iZXIgb2YgYmxvY2tzIGluIGEgYmFuZAorICAgIGludCAgICAgICAgICAgICAgICAgbnVtX2JmdXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgQmxvY2sgRmxvYXRpbmcgVW5pdHMKKyAgICBmbG9hdCogICAgICAgICAgICAgIHNwZWN0cnVtWzJdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHNwZWMxKVtBVDFfU1VfU0FNUExFU107ICAgICAvLy88IG1kY3QgYnVmZmVyCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgc3BlYzIpW0FUMV9TVV9TQU1QTEVTXTsgICAgIC8vLzwgbWRjdCBidWZmZXIKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBmc3RfcW1mX2RlbGF5KVs0Nl07ICAgICAgICAgLy8vPCBkZWxheSBsaW5lIGZvciB0aGUgMXN0IHN0YWNrZWQgUU1GIGZpbHRlcgorICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHNuZF9xbWZfZGVsYXkpWzQ2XTsgICAgICAgICAvLy88IGRlbGF5IGxpbmUgZm9yIHRoZSAybmQgc3RhY2tlZCBRTUYgZmlsdGVyCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgbGFzdF9xbWZfZGVsYXkpWzI1NisyM107ICAgIC8vLzwgZGVsYXkgbGluZSBmb3IgdGhlIGxhc3Qgc3RhY2tlZCBRTUYgZmlsdGVyCit9IEFUMVNVQ3R4OworCisvKioKKyAqIFRoZSBhdHJhYzEgY29udGV4dCwgaG9sZHMgYWxsIG5lZWRlZCBwYXJhbWV0ZXJzIGZvciBkZWNvZGluZworICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQVQxU1VDdHggICAgICAgICAgICBTVXNbQVQxX01BWF9DSEFOTkVMU107ICAgICAgICAgICAgICAvLy88IGNoYW5uZWwgc291bmQgdW5pdAorICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHNwZWMpW0FUMV9TVV9TQU1QTEVTXTsgICAgICAvLy88IHRoZSBtZGN0IHNwZWN0cnVtIGJ1ZmZlcgorCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgIGxvdylbMjU2XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCAgbWlkKVsyNTZdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGhpZ2gpWzUxMl07CisgICAgZmxvYXQqICAgICAgICAgICAgICBiYW5kc1szXTsKKyAgICBGRlRDb250ZXh0ICAgICAgICAgIG1kY3RfY3R4WzNdOworICAgIEFWRmxvYXREU1BDb250ZXh0ICAgKmZkc3A7Cit9IEFUMUN0eDsKKworLyoqIHNpemUgb2YgdGhlIHRyYW5zZm9ybSBpbiBzYW1wbGVzIGluIHRoZSBsb25nIG1vZGUgZm9yIGVhY2ggUU1GIGJhbmQgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzYW1wbGVzX3Blcl9iYW5kWzNdID0gezEyOCwgMTI4LCAyNTZ9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgICBtZGN0X2xvbmdfbmJpdHNbM10gPSB7NywgNywgOH07CisKKworc3RhdGljIHZvaWQgYXQxX2ltZGN0KEFUMUN0eCAqcSwgZmxvYXQgKnNwZWMsIGZsb2F0ICpvdXQsIGludCBuYml0cywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV2X3NwZWMpCit7CisgICAgRkZUQ29udGV4dCogbWRjdF9jb250ZXh0ID0gJnEtPm1kY3RfY3R4W25iaXRzIC0gNSAtIChuYml0cyA+IDYpXTsKKyAgICBpbnQgdHJhbnNmX3NpemUgPSAxIDw8IG5iaXRzOworCisgICAgaWYgKHJldl9zcGVjKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHJhbnNmX3NpemUgLyAyOyBpKyspCisgICAgICAgICAgICBGRlNXQVAoZmxvYXQsIHNwZWNbaV0sIHNwZWNbdHJhbnNmX3NpemUgLSAxIC0gaV0pOworICAgIH0KKyAgICBtZGN0X2NvbnRleHQtPmltZGN0X2hhbGYobWRjdF9jb250ZXh0LCBvdXQsIHNwZWMpOworfQorCisKK3N0YXRpYyBpbnQgYXQxX2ltZGN0X2Jsb2NrKEFUMVNVQ3R4KiBzdSwgQVQxQ3R4ICpxKQoreworICAgIGludCAgICAgICAgICBiYW5kX251bSwgYmFuZF9zYW1wbGVzLCBsb2cyX2Jsb2NrX2NvdW50LCBuYml0cywgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgc3RhcnRfcG9zLCByZWZfcG9zID0gMCwgcG9zID0gMDsKKworICAgIGZvciAoYmFuZF9udW0gPSAwOyBiYW5kX251bSA8IEFUMV9RTUZfQkFORFM7IGJhbmRfbnVtKyspIHsKKyAgICAgICAgZmxvYXQgKnByZXZfYnVmOworICAgICAgICBpbnQgajsKKworICAgICAgICBiYW5kX3NhbXBsZXMgPSBzYW1wbGVzX3Blcl9iYW5kW2JhbmRfbnVtXTsKKyAgICAgICAgbG9nMl9ibG9ja19jb3VudCA9IHN1LT5sb2cyX2Jsb2NrX2NvdW50W2JhbmRfbnVtXTsKKworICAgICAgICAvKiBudW1iZXIgb2YgbWRjdCBibG9ja3MgaW4gdGhlIGN1cnJlbnQgUU1GIGJhbmQ6IDEgLSBmb3IgbG9uZyBtb2RlICovCisgICAgICAgIC8qIDQgZm9yIHNob3J0IG1vZGUobG93L21pZGRsZSBiYW5kcykgYW5kIDggZm9yIHNob3J0IG1vZGUoaGlnaCBiYW5kKSovCisgICAgICAgIG51bV9ibG9ja3MgPSAxIDw8IGxvZzJfYmxvY2tfY291bnQ7CisKKyAgICAgICAgaWYgKG51bV9ibG9ja3MgPT0gMSkgeworICAgICAgICAgICAgLyogbWRjdCBibG9jayBzaXplIGluIHNhbXBsZXM6IDEyOCAobG9uZyBtb2RlLCBsb3cgJiBtaWQgYmFuZHMpLCAqLworICAgICAgICAgICAgLyogMjU2IChsb25nIG1vZGUsIGhpZ2ggYmFuZCkgYW5kIDMyIChzaG9ydCBtb2RlLCBhbGwgYmFuZHMpICovCisgICAgICAgICAgICBibG9ja19zaXplID0gYmFuZF9zYW1wbGVzID4+IGxvZzJfYmxvY2tfY291bnQ7CisKKyAgICAgICAgICAgIC8qIGNhbGMgdHJhbnNmb3JtIHNpemUgaW4gYml0cyBhY2NvcmRpbmcgdG8gdGhlIGJsb2NrX3NpemVfbW9kZSAqLworICAgICAgICAgICAgbmJpdHMgPSBtZGN0X2xvbmdfbmJpdHNbYmFuZF9udW1dIC0gbG9nMl9ibG9ja19jb3VudDsKKworICAgICAgICAgICAgaWYgKG5iaXRzICE9IDUgJiYgbmJpdHMgIT0gNyAmJiBuYml0cyAhPSA4KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmxvY2tfc2l6ZSA9IDMyOworICAgICAgICAgICAgbmJpdHMgPSA1OworICAgICAgICB9CisKKyAgICAgICAgc3RhcnRfcG9zID0gMDsKKyAgICAgICAgcHJldl9idWYgPSAmc3UtPnNwZWN0cnVtWzFdW3JlZl9wb3MgKyBiYW5kX3NhbXBsZXMgLSAxNl07CisgICAgICAgIGZvciAoaj0wOyBqIDwgbnVtX2Jsb2NrczsgaisrKSB7CisgICAgICAgICAgICBhdDFfaW1kY3QocSwgJnEtPnNwZWNbcG9zXSwgJnN1LT5zcGVjdHJ1bVswXVtyZWZfcG9zICsgc3RhcnRfcG9zXSwgbmJpdHMsIGJhbmRfbnVtKTsKKworICAgICAgICAgICAgLyogb3ZlcmxhcCBhbmQgd2luZG93ICovCisgICAgICAgICAgICBxLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3coJnEtPmJhbmRzW2JhbmRfbnVtXVtzdGFydF9wb3NdLCBwcmV2X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdS0+c3BlY3RydW1bMF1bcmVmX3BvcyArIHN0YXJ0X3Bvc10sIGZmX3NpbmVfMzIsIDE2KTsKKworICAgICAgICAgICAgcHJldl9idWYgPSAmc3UtPnNwZWN0cnVtWzBdW3JlZl9wb3Mrc3RhcnRfcG9zICsgMTZdOworICAgICAgICAgICAgc3RhcnRfcG9zICs9IGJsb2NrX3NpemU7CisgICAgICAgICAgICBwb3MgKz0gYmxvY2tfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1fYmxvY2tzID09IDEpCisgICAgICAgICAgICBtZW1jcHkocS0+YmFuZHNbYmFuZF9udW1dICsgMzIsICZzdS0+c3BlY3RydW1bMF1bcmVmX3BvcyArIDE2XSwgMjQwICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICAgICAgcmVmX3BvcyArPSBiYW5kX3NhbXBsZXM7CisgICAgfQorCisgICAgLyogU3dhcCBidWZmZXJzIHNvIHRoZSBtZGN0IG92ZXJsYXAgd29ya3MgKi8KKyAgICBGRlNXQVAoZmxvYXQqLCBzdS0+c3BlY3RydW1bMF0sIHN1LT5zcGVjdHJ1bVsxXSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBQYXJzZSB0aGUgYmxvY2sgc2l6ZSBtb2RlIGJ5dGUKKyAqLworCitzdGF0aWMgaW50IGF0MV9wYXJzZV9ic20oR2V0Qml0Q29udGV4dCogZ2IsIGludCBsb2cyX2Jsb2NrX2NudFtBVDFfUU1GX0JBTkRTXSkKK3sKKyAgICBpbnQgbG9nMl9ibG9ja19jb3VudF90bXAsIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIC8qIGxvdyBhbmQgbWlkIGJhbmQgKi8KKyAgICAgICAgbG9nMl9ibG9ja19jb3VudF90bXAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIGlmIChsb2cyX2Jsb2NrX2NvdW50X3RtcCAmIDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgbG9nMl9ibG9ja19jbnRbaV0gPSAyIC0gbG9nMl9ibG9ja19jb3VudF90bXA7CisgICAgfQorCisgICAgLyogaGlnaCBiYW5kICovCisgICAgbG9nMl9ibG9ja19jb3VudF90bXAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgaWYgKGxvZzJfYmxvY2tfY291bnRfdG1wICE9IDAgJiYgbG9nMl9ibG9ja19jb3VudF90bXAgIT0gMykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgbG9nMl9ibG9ja19jbnRbSURYX0hJR0hfQkFORF0gPSAzIC0gbG9nMl9ibG9ja19jb3VudF90bXA7CisKKyAgICBza2lwX2JpdHMoZ2IsIDIpOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXQxX3VucGFja19kZXF1YW50KEdldEJpdENvbnRleHQqIGdiLCBBVDFTVUN0eCogc3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcGVjW0FUMV9TVV9TQU1QTEVTXSkKK3sKKyAgICBpbnQgYml0c191c2VkLCBiYW5kX251bSwgYmZ1X251bSwgaTsKKyAgICB1aW50OF90IGlkd2xzW0FUMV9NQVhfQkZVXTsgICAgICAgICAgICAgICAgIC8vLzwgdGhlIHdvcmQgbGVuZ3RoIGluZGV4ZXMgZm9yIGVhY2ggQkZVCisgICAgdWludDhfdCBpZHNmc1tBVDFfTUFYX0JGVV07ICAgICAgICAgICAgICAgICAvLy88IHRoZSBzY2FsZWZhY3RvciBpbmRleGVzIGZvciBlYWNoIEJGVQorCisgICAgLyogcGFyc2UgdGhlIGluZm8gYnl0ZSAoMm5kIGJ5dGUpIHRlbGxpbmcgaG93IG11Y2ggQkZVcyB3ZXJlIGNvZGVkICovCisgICAgc3UtPm51bV9iZnVzID0gYmZ1X2Ftb3VudF90YWIxW2dldF9iaXRzKGdiLCAzKV07CisKKyAgICAvKiBjYWxjIG51bWJlciBvZiBjb25zdW1lZCBiaXRzOgorICAgICAgICBudW1fQkZVcyAqIChpZHdsKDRiaXRzKSArIGlkc2YoNmJpdHMpKSArIGxvZzJfYmxvY2tfY291bnQoOGJpdHMpICsgaW5mb19ieXRlKDhiaXRzKQorICAgICAgICArIGluZm9fYnl0ZV9jb3B5KDhiaXRzKSArIGxvZzJfYmxvY2tfY291bnRfY29weSg4Yml0cykgKi8KKyAgICBiaXRzX3VzZWQgPSBzdS0+bnVtX2JmdXMgKiAxMCArIDMyICsKKyAgICAgICAgICAgICAgICBiZnVfYW1vdW50X3RhYjJbZ2V0X2JpdHMoZ2IsIDIpXSArCisgICAgICAgICAgICAgICAgKGJmdV9hbW91bnRfdGFiM1tnZXRfYml0cyhnYiwgMyldIDw8IDEpOworCisgICAgLyogZ2V0IHdvcmQgbGVuZ3RoIGluZGV4IChpZHdsKSBmb3IgZWFjaCBCRlUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc3UtPm51bV9iZnVzOyBpKyspCisgICAgICAgIGlkd2xzW2ldID0gZ2V0X2JpdHMoZ2IsIDQpOworCisgICAgLyogZ2V0IHNjYWxlZmFjdG9yIGluZGV4IChpZHNmKSBmb3IgZWFjaCBCRlUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc3UtPm51bV9iZnVzOyBpKyspCisgICAgICAgIGlkc2ZzW2ldID0gZ2V0X2JpdHMoZ2IsIDYpOworCisgICAgLyogemVybyBpZHdsL2lkc2YgZm9yIGVtcHR5IEJGVXMgKi8KKyAgICBmb3IgKGkgPSBzdS0+bnVtX2JmdXM7IGkgPCBBVDFfTUFYX0JGVTsgaSsrKQorICAgICAgICBpZHdsc1tpXSA9IGlkc2ZzW2ldID0gMDsKKworICAgIC8qIHJlYWQgaW4gdGhlIHNwZWN0cmFsIGRhdGEgYW5kIHJlY29uc3RydWN0IE1EQ1Qgc3BlY3RydW0gb2YgdGhpcyBjaGFubmVsICovCisgICAgZm9yIChiYW5kX251bSA9IDA7IGJhbmRfbnVtIDwgQVQxX1FNRl9CQU5EUzsgYmFuZF9udW0rKykgeworICAgICAgICBmb3IgKGJmdV9udW0gPSBiZnVfYmFuZHNfdFtiYW5kX251bV07IGJmdV9udW0gPCBiZnVfYmFuZHNfdFtiYW5kX251bSsxXTsgYmZ1X251bSsrKSB7CisgICAgICAgICAgICBpbnQgcG9zOworCisgICAgICAgICAgICBpbnQgbnVtX3NwZWNzID0gc3BlY3NfcGVyX2JmdVtiZnVfbnVtXTsKKyAgICAgICAgICAgIGludCB3b3JkX2xlbiAgPSAhIWlkd2xzW2JmdV9udW1dICsgaWR3bHNbYmZ1X251bV07CisgICAgICAgICAgICBmbG9hdCBzY2FsZV9mYWN0b3IgPSBmZl9hdHJhY19zZl90YWJsZVtpZHNmc1tiZnVfbnVtXV07CisgICAgICAgICAgICBiaXRzX3VzZWQgKz0gd29yZF9sZW4gKiBudW1fc3BlY3M7IC8qIGFkZCBudW1iZXIgb2YgYml0cyBjb25zdW1lZCBieSBjdXJyZW50IEJGVSAqLworCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgYml0c3RyZWFtIG92ZXJmbG93ICovCisgICAgICAgICAgICBpZiAoYml0c191c2VkID4gQVQxX1NVX01BWF9CSVRTKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAvKiBnZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSAxc3Qgc3BlYyBhY2NvcmRpbmcgdG8gdGhlIGJsb2NrIHNpemUgbW9kZSAqLworICAgICAgICAgICAgcG9zID0gc3UtPmxvZzJfYmxvY2tfY291bnRbYmFuZF9udW1dID8gYmZ1X3N0YXJ0X3Nob3J0W2JmdV9udW1dIDogYmZ1X3N0YXJ0X2xvbmdbYmZ1X251bV07CisKKyAgICAgICAgICAgIGlmICh3b3JkX2xlbikgeworICAgICAgICAgICAgICAgIGZsb2F0ICAgbWF4X3F1YW50ID0gMS4wIC8gKGZsb2F0KSgoMSA8PCAod29yZF9sZW4gLSAxKSkgLSAxKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3BlY3M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvKiByZWFkIGluIGEgcXVhbnRpemVkIHNwZWMgYW5kIGNvbnZlcnQgaXQgdG8KKyAgICAgICAgICAgICAgICAgICAgICogc2lnbmVkIGludCBhbmQgdGhlbiBpbnZlcnNlIHF1YW50aXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgc3BlY1twb3MraV0gPSBnZXRfc2JpdHMoZ2IsIHdvcmRfbGVuKSAqIHNjYWxlX2ZhY3RvciAqIG1heF9xdWFudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvKiB3b3JkX2xlbiA9IDAgLT4gZW1wdHkgQkZVLCB6ZXJvIGFsbCBzcGVjcyBpbiB0aGUgZW1wdHkgQkZVICovCisgICAgICAgICAgICAgICAgbWVtc2V0KCZzcGVjW3Bvc10sIDAsIG51bV9zcGVjcyAqIHNpemVvZihmbG9hdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYXQxX3N1YmJhbmRfc3ludGhlc2lzKEFUMUN0eCAqcSwgQVQxU1VDdHgqIHN1LCBmbG9hdCAqcE91dCkKK3sKKyAgICBmbG9hdCB0ZW1wWzI1Nl07CisgICAgZmxvYXQgaXFtZl90ZW1wWzUxMiArIDQ2XTsKKworICAgIC8qIGNvbWJpbmUgbG93IGFuZCBtaWRkbGUgYmFuZHMgKi8KKyAgICBmZl9hdHJhY19pcW1mKHEtPmJhbmRzWzBdLCBxLT5iYW5kc1sxXSwgMTI4LCB0ZW1wLCBzdS0+ZnN0X3FtZl9kZWxheSwgaXFtZl90ZW1wKTsKKworICAgIC8qIGRlbGF5IHRoZSBzaWduYWwgb2YgdGhlIGhpZ2ggYmFuZCBieSAyMyBzYW1wbGVzICovCisgICAgbWVtY3B5KCBzdS0+bGFzdF9xbWZfZGVsYXksICAgICZzdS0+bGFzdF9xbWZfZGVsYXlbMjU2XSwgc2l6ZW9mKGZsb2F0KSAqICAyMyk7CisgICAgbWVtY3B5KCZzdS0+bGFzdF9xbWZfZGVsYXlbMjNdLCBxLT5iYW5kc1syXSwgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSAqIDI1Nik7CisKKyAgICAvKiBjb21iaW5lIChsb3cgKyBtaWRkbGUpIGFuZCBoaWdoIGJhbmRzICovCisgICAgZmZfYXRyYWNfaXFtZih0ZW1wLCBzdS0+bGFzdF9xbWZfZGVsYXksIDI1NiwgcE91dCwgc3UtPnNuZF9xbWZfZGVsYXksIGlxbWZfdGVtcCk7Cit9CisKKworc3RhdGljIGludCBhdHJhYzFfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIEFUMUN0eCAqcSAgICAgICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGNoLCByZXQ7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKworCisgICAgaWYgKGJ1Zl9zaXplIDwgMjEyICogYXZjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm90IGVub3VnaCBkYXRhIHRvIGRlY29kZSFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gQVQxX1NVX1NBTVBMRVM7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICBBVDFTVUN0eCogc3UgPSAmcS0+U1VzW2NoXTsKKworICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgJmJ1ZlsyMTIgKiBjaF0sIDIxMiAqIDgpOworCisgICAgICAgIC8qIHBhcnNlIGJsb2NrX3NpemVfbW9kZSwgMXN0IGJ5dGUgKi8KKyAgICAgICAgcmV0ID0gYXQxX3BhcnNlX2JzbSgmZ2IsIHN1LT5sb2cyX2Jsb2NrX2NvdW50KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldCA9IGF0MV91bnBhY2tfZGVxdWFudCgmZ2IsIHN1LCBxLT5zcGVjKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldCA9IGF0MV9pbWRjdF9ibG9jayhzdSwgcSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYXQxX3N1YmJhbmRfc3ludGhlc2lzKHEsIHN1LCAoZmxvYXQgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaF0pOworICAgIH0KKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBhdmN0eC0+YmxvY2tfYWxpZ247Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IGF0cmFjMV9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICogYXZjdHgpCit7CisgICAgQVQxQ3R4ICpxID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGZmX21kY3RfZW5kKCZxLT5tZGN0X2N0eFswXSk7CisgICAgZmZfbWRjdF9lbmQoJnEtPm1kY3RfY3R4WzFdKTsKKyAgICBmZl9tZGN0X2VuZCgmcS0+bWRjdF9jdHhbMl0pOworCisgICAgYXZfZnJlZXAoJnEtPmZkc3ApOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IGF0cmFjMV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQVQxQ3R4ICpxID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX0ZMVFA7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDwgMSB8fCBhdmN0eC0+Y2hhbm5lbHMgPiBBVDFfTUFYX0NIQU5ORUxTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAlZFxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5ibG9ja19hbGlnbiA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgYmxvY2sgYWxpZ24uIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBtZGN0IHRyYW5zZm9ybXMgKi8KKyAgICBpZiAoKHJldCA9IGZmX21kY3RfaW5pdCgmcS0+bWRjdF9jdHhbMF0sIDYsIDEsIC0xLjAvICgxIDw8IDE1KSkpIHx8CisgICAgICAgIChyZXQgPSBmZl9tZGN0X2luaXQoJnEtPm1kY3RfY3R4WzFdLCA4LCAxLCAtMS4wLyAoMSA8PCAxNSkpKSB8fAorICAgICAgICAocmV0ID0gZmZfbWRjdF9pbml0KCZxLT5tZGN0X2N0eFsyXSwgOSwgMSwgLTEuMC8gKDEgPDwgMTUpKSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBpbml0aWFsaXppbmcgTURDVFxuIik7CisgICAgICAgIGF0cmFjMV9kZWNvZGVfZW5kKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmZl9pbml0X2ZmX3NpbmVfd2luZG93cyg1KTsKKworICAgIGZmX2F0cmFjX2dlbmVyYXRlX3RhYmxlcygpOworCisgICAgcS0+ZmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCk7CisKKyAgICBxLT5iYW5kc1swXSA9IHEtPmxvdzsKKyAgICBxLT5iYW5kc1sxXSA9IHEtPm1pZDsKKyAgICBxLT5iYW5kc1syXSA9IHEtPmhpZ2g7CisKKyAgICAvKiBQcmVwYXJlIHRoZSBtZGN0IG92ZXJsYXAgYnVmZmVycyAqLworICAgIHEtPlNVc1swXS5zcGVjdHJ1bVswXSA9IHEtPlNVc1swXS5zcGVjMTsKKyAgICBxLT5TVXNbMF0uc3BlY3RydW1bMV0gPSBxLT5TVXNbMF0uc3BlYzI7CisgICAgcS0+U1VzWzFdLnNwZWN0cnVtWzBdID0gcS0+U1VzWzFdLnNwZWMxOworICAgIHEtPlNVc1sxXS5zcGVjdHJ1bVsxXSA9IHEtPlNVc1sxXS5zcGVjMjsKKworICAgIHJldHVybiAwOworfQorCisKK0FWQ29kZWMgZmZfYXRyYWMxX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImF0cmFjMSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFUUkFDMSAoQWRhcHRpdmUgVFJhbnNmb3JtIEFjb3VzdGljIENvZGluZykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQVRSQUMxLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBVDFDdHgpLAorICAgIC5pbml0ICAgICAgICAgICA9IGF0cmFjMV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBhdHJhYzFfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBhdHJhYzFfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hdHJhYzFkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hdHJhYzFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjMjE4YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F0cmFjMWRhdGEuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQVRSQUMgMSBjb21wYXRpYmxlIGRlY29kZXIgZGF0YQorICogQ29weXJpZ2h0IChjKSAyMDA5IE1heGltIFBvbGlha292c2tpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQmVuamFtaW4gTGFyc3NvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBVFJBQzEgY29tcGF0aWJsZSBkZWNvZGVyIGRhdGEKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVRSQUMxREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfQVRSQUMxREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmZ1X2Ftb3VudF90YWIxWzhdID0gezIwLCAgMjgsICAzMiwgIDM2LCA0MCwgNDQsIDQ4LCA1Mn07CitzdGF0aWMgY29uc3QgdWludDhfdCBiZnVfYW1vdW50X3RhYjJbNF0gPSB7IDAsIDExMiwgMTc2LCAyMDh9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmZ1X2Ftb3VudF90YWIzWzhdID0geyAwLCAgMjQsICAzNiwgIDQ4LCA3MiwgMTA4LCAxMzIsIDE1Nn07CisKKy8qKiBudW1iZXIgb2YgQkZVcyBpbiBlYWNoIFFNRiBiYW5kICovCitzdGF0aWMgY29uc3QgdWludDhfdCBiZnVfYmFuZHNfdFs0XSAgPSB7MCwgMjAsIDM2LCA1Mn07CisKKy8qKiBudW1iZXIgb2Ygc3BlY3RyYWwgbGluZXMgaW4gZWFjaCBCRlUKKyAqICBibG9jayBmbG9hdGluZyB1bml0ID0gZ3JvdXAgb2Ygc3BlY3RyYWwgZnJlcXVlbmNpZXMgaGF2aW5nIHRoZQorICogIHNhbWUgcXVhbnRpemF0aW9uIHBhcmFtZXRlcnMgbGlrZSB3b3JkIGxlbmd0aCBhbmQgc2NhbGUgZmFjdG9yCisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHNwZWNzX3Blcl9iZnVbNTJdID0geworICAgICA4LCAgOCwgIDgsICA4LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA2LCAgNiwgIDYsICA2LCA2LCA2LCA2LCA2LCAvLyBsb3cgYmFuZAorICAgICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAgICAgICAgICAgICAvLyBtaWRkbGUgYmFuZAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwICAgICAgICAgICAgICAvLyBoaWdoIGJhbmQKK307CisKKy8qKiBzdGFydCBwb3NpdGlvbiBvZiBlYWNoIEJGVSBpbiB0aGUgTURDVCBzcGVjdHJ1bSBmb3IgdGhlIGxvbmcgbW9kZSAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJmdV9zdGFydF9sb25nWzUyXSA9IHsKKyAgICAgIDAsICAgOCwgIDE2LCAgMjQsICAzMiwgIDM2LCAgNDAsICA0NCwgIDQ4LCAgNTYsICA2NCwgIDcyLCAgODAsICA4NiwgIDkyLCAgOTgsIDEwNCwgMTEwLCAxMTYsIDEyMiwKKyAgICAxMjgsIDEzNCwgMTQwLCAxNDYsIDE1MiwgMTU5LCAxNjYsIDE3MywgMTgwLCAxODksIDE5OCwgMjA3LCAyMTYsIDIyNiwgMjM2LCAyNDYsCisgICAgMjU2LCAyNjgsIDI4MCwgMjkyLCAzMDQsIDMxNiwgMzI4LCAzNDAsIDM1MiwgMzcyLCAzOTIsIDQxMiwgNDMyLCA0NTIsIDQ3MiwgNDkyLAorfTsKKworLyoqIHN0YXJ0IHBvc2l0aW9uIG9mIGVhY2ggQkZVIGluIHRoZSBNRENUIHNwZWN0cnVtIGZvciB0aGUgc2hvcnQgbW9kZSAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJmdV9zdGFydF9zaG9ydFs1Ml0gPSB7CisgICAgICAwLCAgMzIsICA2NCwgIDk2LCAgIDgsICA0MCwgIDcyLCAxMDQsICAxMiwgIDQ0LCAgNzYsIDEwOCwgIDIwLCAgNTIsICA4NCwgMTE2LCAyNiwgNTgsIDkwLCAxMjIsCisgICAgMTI4LCAxNjAsIDE5MiwgMjI0LCAxMzQsIDE2NiwgMTk4LCAyMzAsIDE0MSwgMTczLCAyMDUsIDIzNywgMTUwLCAxODIsIDIxNCwgMjQ2LAorICAgIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCAyNjgsIDMwMCwgMzMyLCAzNjQsIDM5NiwgNDI4LCA0NjAsIDQ5MgorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQVRSQUMxREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hdHJhYzMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F0cmFjMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzA4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdHJhYzMuYwpAQCAtMCwwICsxLDk0MyBAQAorLyoKKyAqIEFUUkFDMyBjb21wYXRpYmxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IE1heGltIFBvbGlha292c2tpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBCZW5qYW1pbiBMYXJzc29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFUUkFDMyBjb21wYXRpYmxlIGRlY29kZXIuCisgKiBUaGlzIGRlY29kZXIgaGFuZGxlcyBTb255J3MgQVRSQUMzIGRhdGEuCisgKgorICogQ29udGFpbmVyIGZvcm1hdHMgdXNlZCB0byBzdG9yZSBBVFJBQzMgZGF0YToKKyAqIFJlYWxNZWRpYSAoLnJtKSwgUklGRiBXQVYgKC53YXYsIC5hdDMpLCBTb255IE9wZW5NRyAoLm9tYSwgLmFhMykuCisgKgorICogVG8gdXNlIHRoaXMgZGVjb2RlciwgYSBjYWxsaW5nIGFwcGxpY2F0aW9uIG11c3Qgc3VwcGx5IHRoZSBleHRyYWRhdGEKKyAqIGJ5dGVzIHByb3ZpZGVkIGluIHRoZSBjb250YWluZXJzIGFib3ZlLgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9saWJtLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJmbXRjb252ZXJ0LmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAiYXRyYWMuaCIKKyNpbmNsdWRlICJhdHJhYzNkYXRhLmgiCisKKyNkZWZpbmUgSk9JTlRfU1RFUkVPICAgIDB4MTIKKyNkZWZpbmUgU1RFUkVPICAgICAgICAgIDB4MgorCisjZGVmaW5lIFNBTVBMRVNfUEVSX0ZSQU1FIDEwMjQKKyNkZWZpbmUgTURDVF9TSVpFICAgICAgICAgIDUxMgorCit0eXBlZGVmIHN0cnVjdCBHYWluQmxvY2sgeworICAgIEF0cmFjR2FpbkluZm8gZ19ibG9ja1s0XTsKK30gR2FpbkJsb2NrOworCit0eXBlZGVmIHN0cnVjdCBUb25hbENvbXBvbmVudCB7CisgICAgaW50IHBvczsKKyAgICBpbnQgbnVtX2NvZWZzOworICAgIGZsb2F0IGNvZWZbOF07Cit9IFRvbmFsQ29tcG9uZW50OworCit0eXBlZGVmIHN0cnVjdCBDaGFubmVsVW5pdCB7CisgICAgaW50ICAgICAgICAgICAgYmFuZHNfY29kZWQ7CisgICAgaW50ICAgICAgICAgICAgbnVtX2NvbXBvbmVudHM7CisgICAgZmxvYXQgICAgICAgICAgcHJldl9mcmFtZVtTQU1QTEVTX1BFUl9GUkFNRV07CisgICAgaW50ICAgICAgICAgICAgZ2NfYmxrX3N3aXRjaDsKKyAgICBUb25hbENvbXBvbmVudCBjb21wb25lbnRzWzY0XTsKKyAgICBHYWluQmxvY2sgICAgICBnYWluX2Jsb2NrWzJdOworCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgc3BlY3RydW0pW1NBTVBMRVNfUEVSX0ZSQU1FXTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBpbWRjdF9idWYpW1NBTVBMRVNfUEVSX0ZSQU1FXTsKKworICAgIGZsb2F0ICAgICAgICAgIGRlbGF5X2J1ZjFbNDZdOyAvLy88cW1mIGRlbGF5IGJ1ZmZlcnMKKyAgICBmbG9hdCAgICAgICAgICBkZWxheV9idWYyWzQ2XTsKKyAgICBmbG9hdCAgICAgICAgICBkZWxheV9idWYzWzQ2XTsKK30gQ2hhbm5lbFVuaXQ7CisKK3R5cGVkZWYgc3RydWN0IEFUUkFDM0NvbnRleHQgeworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgLy9AeworICAgIC8qKiBzdHJlYW0gZGF0YSAqLworICAgIGludCBjb2RpbmdfbW9kZTsKKworICAgIENoYW5uZWxVbml0ICp1bml0czsKKyAgICAvL0B9CisgICAgLy9AeworICAgIC8qKiBqb2ludC1zdGVyZW8gcmVsYXRlZCB2YXJpYWJsZXMgKi8KKyAgICBpbnQgbWF0cml4X2NvZWZmX2luZGV4X3ByZXZbNF07CisgICAgaW50IG1hdHJpeF9jb2VmZl9pbmRleF9ub3dbNF07CisgICAgaW50IG1hdHJpeF9jb2VmZl9pbmRleF9uZXh0WzRdOworICAgIGludCB3ZWlnaHRpbmdfZGVsYXlbNl07CisgICAgLy9AfQorICAgIC8vQHsKKyAgICAvKiogZGF0YSBidWZmZXJzICovCisgICAgdWludDhfdCAqZGVjb2RlZF9ieXRlc19idWZmZXI7CisgICAgZmxvYXQgdGVtcF9idWZbMTA3MF07CisgICAgLy9AfQorICAgIC8vQHsKKyAgICAvKiogZXh0cmFkYXRhICovCisgICAgaW50IHNjcmFtYmxlZF9zdHJlYW07CisgICAgLy9AfQorCisgICAgQXRyYWNHQ0NvbnRleHQgICAgZ2FpbmNfY3R4OworICAgIEZGVENvbnRleHQgICAgICAgIG1kY3RfY3R4OworICAgIEZtdENvbnZlcnRDb250ZXh0IGZtdF9jb252OworICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOworfSBBVFJBQzNDb250ZXh0OworCitzdGF0aWMgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgbWRjdF93aW5kb3cpW01EQ1RfU0laRV07CitzdGF0aWMgVkxDX1RZUEUgYXRyYWMzX3ZsY190YWJsZVs0MDk2XVsyXTsKK3N0YXRpYyBWTEMgICBzcGVjdHJhbF9jb2VmZl90YWJbN107CisKKy8qKgorICogUmVndWxhciA1MTIgcG9pbnRzIElNRENUIHdpdGhvdXQgb3ZlcmxhcHBpbmcsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUKKyAqIHN3YXBwaW5nIG9mIG9kZCBiYW5kcyBjYXVzZWQgYnkgdGhlIHJldmVyc2Ugc3BlY3RyYSBvZiB0aGUgUU1GLgorICoKKyAqIEBwYXJhbSBvZGRfYmFuZCAgMSBpZiB0aGUgYmFuZCBpcyBhbiBvZGQgYmFuZAorICovCitzdGF0aWMgdm9pZCBpbWx0KEFUUkFDM0NvbnRleHQgKnEsIGZsb2F0ICppbnB1dCwgZmxvYXQgKm91dHB1dCwgaW50IG9kZF9iYW5kKQoreworICAgIGludCBpOworCisgICAgaWYgKG9kZF9iYW5kKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXZlcnNlIHRoZSBvZGQgYmFuZHMgYmVmb3JlIElNRENULCB0aGlzIGlzIGFuIGVmZmVjdCBvZiB0aGUgUU1GCisgICAgICAgICAqIHRyYW5zZm9ybSBvciBpdCBnaXZlcyBiZXR0ZXIgY29tcHJlc3Npb24gdG8gZG8gaXQgdGhpcyB3YXkuCisgICAgICAgICAqIEZJWE1FOiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaGFuZGxlIHRoaXMgaW4gaW1kY3RfY2FsYworICAgICAgICAgKiBmb3IgdGhhdCB0byBoYXBwZW4gYSBtb2RpZmljYXRpb24gb2YgdGhlIHByZXJvdGF0aW9uIHN0ZXAgb2YKKyAgICAgICAgICogYWxsIFNJTUQgY29kZSBhbmQgQyBjb2RlIGlzIG5lZWRlZC4KKyAgICAgICAgICogT3IgZml4IHRoZSBmdW5jdGlvbnMgYmVmb3JlIHNvIHRoZXkgZ2VuZXJhdGUgYSBwcmUgcmV2ZXJzZWQgc3BlY3RydW0uCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgICAgICAgICBGRlNXQVAoZmxvYXQsIGlucHV0W2ldLCBpbnB1dFsyNTUgLSBpXSk7CisgICAgfQorCisgICAgcS0+bWRjdF9jdHguaW1kY3RfY2FsYygmcS0+bWRjdF9jdHgsIG91dHB1dCwgaW5wdXQpOworCisgICAgLyogUGVyZm9ybSB3aW5kb3dpbmcgb24gdGhlIG91dHB1dC4gKi8KKyAgICBxLT5mZHNwLT52ZWN0b3JfZm11bChvdXRwdXQsIG91dHB1dCwgbWRjdF93aW5kb3csIE1EQ1RfU0laRSk7Cit9CisKKy8qCisgKiBpbmRhdGEgZGVzY3JhbWJsaW5nLCBvbmx5IHVzZWQgZm9yIGRhdGEgY29taW5nIGZyb20gdGhlIHJtIGNvbnRhaW5lcgorICovCitzdGF0aWMgaW50IGRlY29kZV9ieXRlcyhjb25zdCB1aW50OF90ICppbnB1dCwgdWludDhfdCAqb3V0LCBpbnQgYnl0ZXMpCit7CisgICAgaW50IGksIG9mZjsKKyAgICB1aW50MzJfdCBjOworICAgIGNvbnN0IHVpbnQzMl90ICpidWY7CisgICAgdWludDMyX3QgKm91dHB1dCA9ICh1aW50MzJfdCAqKW91dDsKKworICAgIG9mZiA9IChpbnRwdHJfdClpbnB1dCAmIDM7CisgICAgYnVmID0gKGNvbnN0IHVpbnQzMl90ICopKGlucHV0IC0gb2ZmKTsKKyAgICBpZiAob2ZmKQorICAgICAgICBjID0gYXZfYmUybmUzMigoMHg1MzdGNjEwM1UgPj4gKG9mZiAqIDgpKSB8ICgweDUzN0Y2MTAzVSA8PCAoMzIgLSAob2ZmICogOCkpKSk7CisgICAgZWxzZQorICAgICAgICBjID0gYXZfYmUybmUzMigweDUzN0Y2MTAzVSk7CisgICAgYnl0ZXMgKz0gMyArIG9mZjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnl0ZXMgLyA0OyBpKyspCisgICAgICAgIG91dHB1dFtpXSA9IGMgXiBidWZbaV07CisKKyAgICBpZiAob2ZmKQorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoTlVMTCwgIk9mZnNldCBvZiAlZCIsIG9mZik7CisKKyAgICByZXR1cm4gb2ZmOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGluaXRfaW1kY3Rfd2luZG93KHZvaWQpCit7CisgICAgaW50IGksIGo7CisKKyAgICAvKiBnZW5lcmF0ZSB0aGUgbWRjdCB3aW5kb3csIGZvciBkZXRhaWxzIHNlZQorICAgICAqIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPVJlYWxBdWRpb19hdHJjI1dpbmRvd3MgKi8KKyAgICBmb3IgKGkgPSAwLCBqID0gMjU1OyBpIDwgMTI4OyBpKyssIGotLSkgeworICAgICAgICBmbG9hdCB3aSA9IHNpbigoKGkgKyAwLjUpIC8gMjU2LjAgLSAwLjUpICogTV9QSSkgKyAxLjA7CisgICAgICAgIGZsb2F0IHdqID0gc2luKCgoaiArIDAuNSkgLyAyNTYuMCAtIDAuNSkgKiBNX1BJKSArIDEuMDsKKyAgICAgICAgZmxvYXQgdyAgPSAwLjUgKiAod2kgKiB3aSArIHdqICogd2opOworICAgICAgICBtZGN0X3dpbmRvd1tpXSA9IG1kY3Rfd2luZG93WzUxMSAtIGldID0gd2kgLyB3OworICAgICAgICBtZGN0X3dpbmRvd1tqXSA9IG1kY3Rfd2luZG93WzUxMSAtIGpdID0gd2ogLyB3OworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGF0cmFjM19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFUUkFDM0NvbnRleHQgKnEgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJnEtPnVuaXRzKTsKKyAgICBhdl9mcmVlcCgmcS0+ZGVjb2RlZF9ieXRlc19idWZmZXIpOworICAgIGF2X2ZyZWVwKCZxLT5mZHNwKTsKKworICAgIGZmX21kY3RfZW5kKCZxLT5tZGN0X2N0eCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBNYW50aXNzYSBkZWNvZGluZworICoKKyAqIEBwYXJhbSBzZWxlY3RvciAgICAgd2hpY2ggdGFibGUgdGhlIG91dHB1dCB2YWx1ZXMgYXJlIGNvZGVkIHdpdGgKKyAqIEBwYXJhbSBjb2RpbmdfZmxhZyAgY29uc3RhbnQgbGVuZ3RoIGNvZGluZyBvciB2YXJpYWJsZSBsZW5ndGggY29kaW5nCisgKiBAcGFyYW0gbWFudGlzc2FzICAgIG1hbnRpc3NhIG91dHB1dCB0YWJsZQorICogQHBhcmFtIG51bV9jb2RlcyAgICBudW1iZXIgb2YgdmFsdWVzIHRvIGdldAorICovCitzdGF0aWMgdm9pZCByZWFkX3F1YW50X3NwZWN0cmFsX2NvZWZmcyhHZXRCaXRDb250ZXh0ICpnYiwgaW50IHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGluZ19mbGFnLCBpbnQgKm1hbnRpc3NhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY29kZXMpCit7CisgICAgaW50IGksIGNvZGUsIGh1ZmZfc3ltYjsKKworICAgIGlmIChzZWxlY3RvciA9PSAxKQorICAgICAgICBudW1fY29kZXMgLz0gMjsKKworICAgIGlmIChjb2RpbmdfZmxhZyAhPSAwKSB7CisgICAgICAgIC8qIGNvbnN0YW50IGxlbmd0aCBjb2RpbmcgKENMQykgKi8KKyAgICAgICAgaW50IG51bV9iaXRzID0gY2xjX2xlbmd0aF90YWJbc2VsZWN0b3JdOworCisgICAgICAgIGlmIChzZWxlY3RvciA+IDEpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29kZXM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChudW1fYml0cykKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IGdldF9zYml0cyhnYiwgbnVtX2JpdHMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IDA7CisgICAgICAgICAgICAgICAgbWFudGlzc2FzW2ldID0gY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29kZXM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChudW1fYml0cykKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IGdldF9iaXRzKGdiLCBudW1fYml0cyk7IC8vIG51bV9iaXRzIGlzIGFsd2F5cyA0IGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IDA7CisgICAgICAgICAgICAgICAgbWFudGlzc2FzW2kgKiAyICAgIF0gPSBtYW50aXNzYV9jbGNfdGFiW2NvZGUgPj4gMl07CisgICAgICAgICAgICAgICAgbWFudGlzc2FzW2kgKiAyICsgMV0gPSBtYW50aXNzYV9jbGNfdGFiW2NvZGUgJiAgM107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiB2YXJpYWJsZSBsZW5ndGggY29kaW5nIChWTEMpICovCisgICAgICAgIGlmIChzZWxlY3RvciAhPSAxKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvZGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBodWZmX3N5bWIgPSBnZXRfdmxjMihnYiwgc3BlY3RyYWxfY29lZmZfdGFiW3NlbGVjdG9yLTFdLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWN0cmFsX2NvZWZmX3RhYltzZWxlY3Rvci0xXS5iaXRzLCAzKTsKKyAgICAgICAgICAgICAgICBodWZmX3N5bWIgKz0gMTsKKyAgICAgICAgICAgICAgICBjb2RlID0gaHVmZl9zeW1iID4+IDE7CisgICAgICAgICAgICAgICAgaWYgKGh1ZmZfc3ltYiAmIDEpCisgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAtY29kZTsKKyAgICAgICAgICAgICAgICBtYW50aXNzYXNbaV0gPSBjb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb2RlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaHVmZl9zeW1iID0gZ2V0X3ZsYzIoZ2IsIHNwZWN0cmFsX2NvZWZmX3RhYltzZWxlY3RvciAtIDFdLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWN0cmFsX2NvZWZmX3RhYltzZWxlY3RvciAtIDFdLmJpdHMsIDMpOworICAgICAgICAgICAgICAgIG1hbnRpc3Nhc1tpICogMiAgICBdID0gbWFudGlzc2FfdmxjX3RhYltodWZmX3N5bWIgKiAyICAgIF07CisgICAgICAgICAgICAgICAgbWFudGlzc2FzW2kgKiAyICsgMV0gPSBtYW50aXNzYV92bGNfdGFiW2h1ZmZfc3ltYiAqIDIgKyAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBSZXN0b3JlIHRoZSBxdWFudGl6ZWQgYmFuZCBzcGVjdHJ1bSBjb2VmZmljaWVudHMKKyAqCisgKiBAcmV0dXJuIHN1YmJhbmQgY291bnQsIGZpeCBmb3IgYnJva2VuIHNwZWNpZmljYXRpb24vZmlsZXMKKyAqLworc3RhdGljIGludCBkZWNvZGVfc3BlY3RydW0oR2V0Qml0Q29udGV4dCAqZ2IsIGZsb2F0ICpvdXRwdXQpCit7CisgICAgaW50IG51bV9zdWJiYW5kcywgY29kaW5nX21vZGUsIGksIGosIGZpcnN0LCBsYXN0LCBzdWJiYW5kX3NpemU7CisgICAgaW50IHN1YmJhbmRfdmxjX2luZGV4WzMyXSwgc2ZfaW5kZXhbMzJdOworICAgIGludCBtYW50aXNzYXNbMTI4XTsKKyAgICBmbG9hdCBzY2FsZV9mYWN0b3I7CisKKyAgICBudW1fc3ViYmFuZHMgPSBnZXRfYml0cyhnYiwgNSk7ICAvLyBudW1iZXIgb2YgY29kZWQgc3ViYmFuZHMKKyAgICBjb2RpbmdfbW9kZSAgPSBnZXRfYml0czEoZ2IpOyAgICAvLyBjb2RpbmcgTW9kZTogMCAtIFZMQy8gMS1DTEMKKworICAgIC8qIGdldCB0aGUgVkxDIHNlbGVjdG9yIHRhYmxlIGZvciB0aGUgc3ViYmFuZHMsIDAgbWVhbnMgbm90IGNvZGVkICovCisgICAgZm9yIChpID0gMDsgaSA8PSBudW1fc3ViYmFuZHM7IGkrKykKKyAgICAgICAgc3ViYmFuZF92bGNfaW5kZXhbaV0gPSBnZXRfYml0cyhnYiwgMyk7CisKKyAgICAvKiByZWFkIHRoZSBzY2FsZSBmYWN0b3IgaW5kZXhlcyBmcm9tIHRoZSBzdHJlYW0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IG51bV9zdWJiYW5kczsgaSsrKSB7CisgICAgICAgIGlmIChzdWJiYW5kX3ZsY19pbmRleFtpXSAhPSAwKQorICAgICAgICAgICAgc2ZfaW5kZXhbaV0gPSBnZXRfYml0cyhnYiwgNik7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8PSBudW1fc3ViYmFuZHM7IGkrKykgeworICAgICAgICBmaXJzdCA9IHN1YmJhbmRfdGFiW2kgICAgXTsKKyAgICAgICAgbGFzdCAgPSBzdWJiYW5kX3RhYltpICsgMV07CisKKyAgICAgICAgc3ViYmFuZF9zaXplID0gbGFzdCAtIGZpcnN0OworCisgICAgICAgIGlmIChzdWJiYW5kX3ZsY19pbmRleFtpXSAhPSAwKSB7CisgICAgICAgICAgICAvKiBkZWNvZGUgc3BlY3RyYWwgY29lZmZpY2llbnRzIGZvciB0aGlzIHN1YmJhbmQgKi8KKyAgICAgICAgICAgIC8qIFRPRE86IFRoaXMgY2FuIGJlIGRvbmUgZmFzdGVyIGlzIHNldmVyYWwgYmxvY2tzIHNoYXJlIHRoZQorICAgICAgICAgICAgICogc2FtZSBWTEMgc2VsZWN0b3IgKHN1YmJhbmRfdmxjX2luZGV4KSAqLworICAgICAgICAgICAgcmVhZF9xdWFudF9zcGVjdHJhbF9jb2VmZnMoZ2IsIHN1YmJhbmRfdmxjX2luZGV4W2ldLCBjb2RpbmdfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnRpc3Nhcywgc3ViYmFuZF9zaXplKTsKKworICAgICAgICAgICAgLyogZGVjb2RlIHRoZSBzY2FsZSBmYWN0b3IgZm9yIHRoaXMgc3ViYmFuZCAqLworICAgICAgICAgICAgc2NhbGVfZmFjdG9yID0gZmZfYXRyYWNfc2ZfdGFibGVbc2ZfaW5kZXhbaV1dICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludl9tYXhfcXVhbnRbc3ViYmFuZF92bGNfaW5kZXhbaV1dOworCisgICAgICAgICAgICAvKiBpbnZlcnNlIHF1YW50aXplIHRoZSBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGZpcnN0IDwgbGFzdDsgZmlyc3QrKywgaisrKQorICAgICAgICAgICAgICAgIG91dHB1dFtmaXJzdF0gPSBtYW50aXNzYXNbal0gKiBzY2FsZV9mYWN0b3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiB0aGlzIHN1YmJhbmQgd2FzIG5vdCBjb2RlZCwgc28gemVybyB0aGUgZW50aXJlIHN1YmJhbmQgKi8KKyAgICAgICAgICAgIG1lbXNldChvdXRwdXQgKyBmaXJzdCwgMCwgc3ViYmFuZF9zaXplICogc2l6ZW9mKCpvdXRwdXQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNsZWFyIHRoZSBzdWJiYW5kcyB0aGF0IHdlcmUgbm90IGNvZGVkICovCisgICAgZmlyc3QgPSBzdWJiYW5kX3RhYltpXTsKKyAgICBtZW1zZXQob3V0cHV0ICsgZmlyc3QsIDAsIChTQU1QTEVTX1BFUl9GUkFNRSAtIGZpcnN0KSAqIHNpemVvZigqb3V0cHV0KSk7CisgICAgcmV0dXJuIG51bV9zdWJiYW5kczsKK30KKworLyoqCisgKiBSZXN0b3JlIHRoZSBxdWFudGl6ZWQgdG9uYWwgY29tcG9uZW50cworICoKKyAqIEBwYXJhbSBjb21wb25lbnRzIHRvbmFsIGNvbXBvbmVudHMKKyAqIEBwYXJhbSBudW1fYmFuZHMgIG51bWJlciBvZiBjb2RlZCBiYW5kcworICovCitzdGF0aWMgaW50IGRlY29kZV90b25hbF9jb21wb25lbnRzKEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb25hbENvbXBvbmVudCAqY29tcG9uZW50cywgaW50IG51bV9iYW5kcykKK3sKKyAgICBpbnQgaSwgYiwgYywgbTsKKyAgICBpbnQgbmJfY29tcG9uZW50cywgY29kaW5nX21vZGVfc2VsZWN0b3IsIGNvZGluZ19tb2RlOworICAgIGludCBiYW5kX2ZsYWdzWzRdLCBtYW50aXNzYVs4XTsKKyAgICBpbnQgY29tcG9uZW50X2NvdW50ID0gMDsKKworICAgIG5iX2NvbXBvbmVudHMgPSBnZXRfYml0cyhnYiwgNSk7CisKKyAgICAvKiBubyB0b25hbCBjb21wb25lbnRzICovCisgICAgaWYgKG5iX2NvbXBvbmVudHMgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjb2RpbmdfbW9kZV9zZWxlY3RvciA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICBpZiAoY29kaW5nX21vZGVfc2VsZWN0b3IgPT0gMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBjb2RpbmdfbW9kZSA9IGNvZGluZ19tb2RlX3NlbGVjdG9yICYgMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgaW50IGNvZGVkX3ZhbHVlc19wZXJfY29tcG9uZW50LCBxdWFudF9zdGVwX2luZGV4OworCisgICAgICAgIGZvciAoYiA9IDA7IGIgPD0gbnVtX2JhbmRzOyBiKyspCisgICAgICAgICAgICBiYW5kX2ZsYWdzW2JdID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICBjb2RlZF92YWx1ZXNfcGVyX2NvbXBvbmVudCA9IGdldF9iaXRzKGdiLCAzKTsKKworICAgICAgICBxdWFudF9zdGVwX2luZGV4ID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICBpZiAocXVhbnRfc3RlcF9pbmRleCA8PSAxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKGNvZGluZ19tb2RlX3NlbGVjdG9yID09IDMpCisgICAgICAgICAgICBjb2RpbmdfbW9kZSA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgZm9yIChiID0gMDsgYiA8IChudW1fYmFuZHMgKyAxKSAqIDQ7IGIrKykgeworICAgICAgICAgICAgaW50IGNvZGVkX2NvbXBvbmVudHM7CisKKyAgICAgICAgICAgIGlmIChiYW5kX2ZsYWdzW2IgPj4gMl0gPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgY29kZWRfY29tcG9uZW50cyA9IGdldF9iaXRzKGdiLCAzKTsKKworICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGNvZGVkX2NvbXBvbmVudHM7IGMrKykgeworICAgICAgICAgICAgICAgIFRvbmFsQ29tcG9uZW50ICpjbXAgPSAmY29tcG9uZW50c1tjb21wb25lbnRfY291bnRdOworICAgICAgICAgICAgICAgIGludCBzZl9pbmRleCwgY29kZWRfdmFsdWVzLCBtYXhfY29kZWRfdmFsdWVzOworICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlX2ZhY3RvcjsKKworICAgICAgICAgICAgICAgIHNmX2luZGV4ID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRfY291bnQgPj0gNjQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgY21wLT5wb3MgPSBiICogNjQgKyBnZXRfYml0cyhnYiwgNik7CisKKyAgICAgICAgICAgICAgICBtYXhfY29kZWRfdmFsdWVzID0gU0FNUExFU19QRVJfRlJBTUUgLSBjbXAtPnBvczsKKyAgICAgICAgICAgICAgICBjb2RlZF92YWx1ZXMgICAgID0gY29kZWRfdmFsdWVzX3Blcl9jb21wb25lbnQgKyAxOworICAgICAgICAgICAgICAgIGNvZGVkX3ZhbHVlcyAgICAgPSBGRk1JTihtYXhfY29kZWRfdmFsdWVzLCBjb2RlZF92YWx1ZXMpOworCisgICAgICAgICAgICAgICAgc2NhbGVfZmFjdG9yID0gZmZfYXRyYWNfc2ZfdGFibGVbc2ZfaW5kZXhdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZfbWF4X3F1YW50W3F1YW50X3N0ZXBfaW5kZXhdOworCisgICAgICAgICAgICAgICAgcmVhZF9xdWFudF9zcGVjdHJhbF9jb2VmZnMoZ2IsIHF1YW50X3N0ZXBfaW5kZXgsIGNvZGluZ19tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnRpc3NhLCBjb2RlZF92YWx1ZXMpOworCisgICAgICAgICAgICAgICAgY21wLT5udW1fY29lZnMgPSBjb2RlZF92YWx1ZXM7CisKKyAgICAgICAgICAgICAgICAvKiBpbnZlcnNlIHF1YW50ICovCisgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IGNvZGVkX3ZhbHVlczsgbSsrKQorICAgICAgICAgICAgICAgICAgICBjbXAtPmNvZWZbbV0gPSBtYW50aXNzYVttXSAqIHNjYWxlX2ZhY3RvcjsKKworICAgICAgICAgICAgICAgIGNvbXBvbmVudF9jb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvbXBvbmVudF9jb3VudDsKK30KKworLyoqCisgKiBEZWNvZGUgZ2FpbiBwYXJhbWV0ZXJzIGZvciB0aGUgY29kZWQgYmFuZHMKKyAqCisgKiBAcGFyYW0gYmxvY2sgICAgICB0aGUgZ2FpbmJsb2NrIGZvciB0aGUgY3VycmVudCBiYW5kCisgKiBAcGFyYW0gbnVtX2JhbmRzICBhbW91bnQgb2YgY29kZWQgYmFuZHMKKyAqLworc3RhdGljIGludCBkZWNvZGVfZ2Fpbl9jb250cm9sKEdldEJpdENvbnRleHQgKmdiLCBHYWluQmxvY2sgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fYmFuZHMpCit7CisgICAgaW50IGIsIGo7CisgICAgaW50ICpsZXZlbCwgKmxvYzsKKworICAgIEF0cmFjR2FpbkluZm8gKmdhaW4gPSBibG9jay0+Z19ibG9jazsKKworICAgIGZvciAoYiA9IDA7IGIgPD0gbnVtX2JhbmRzOyBiKyspIHsKKyAgICAgICAgZ2FpbltiXS5udW1fcG9pbnRzID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICBsZXZlbCAgICAgICAgICAgICAgPSBnYWluW2JdLmxldl9jb2RlOworICAgICAgICBsb2MgICAgICAgICAgICAgICAgPSBnYWluW2JdLmxvY19jb2RlOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBnYWluW2JdLm51bV9wb2ludHM7IGorKykgeworICAgICAgICAgICAgbGV2ZWxbal0gPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgICAgICBsb2Nbal0gICA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICAgICAgICAgIGlmIChqICYmIGxvY1tqXSA8PSBsb2NbaiAtIDFdKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2xlYXIgdGhlIHVudXNlZCBibG9ja3MuICovCisgICAgZm9yICg7IGIgPCA0IDsgYisrKQorICAgICAgICBnYWluW2JdLm51bV9wb2ludHMgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29tYmluZSB0aGUgdG9uYWwgYmFuZCBzcGVjdHJ1bSBhbmQgcmVndWxhciBiYW5kIHNwZWN0cnVtCisgKgorICogQHBhcmFtIHNwZWN0cnVtICAgICAgICBvdXRwdXQgc3BlY3RydW0gYnVmZmVyCisgKiBAcGFyYW0gbnVtX2NvbXBvbmVudHMgIG51bWJlciBvZiB0b25hbCBjb21wb25lbnRzCisgKiBAcGFyYW0gY29tcG9uZW50cyAgICAgIHRvbmFsIGNvbXBvbmVudHMgZm9yIHRoaXMgYmFuZAorICogQHJldHVybiAgICAgICAgICAgICAgICBwb3NpdGlvbiBvZiB0aGUgbGFzdCB0b25hbCBjb2VmZmljaWVudAorICovCitzdGF0aWMgaW50IGFkZF90b25hbF9jb21wb25lbnRzKGZsb2F0ICpzcGVjdHJ1bSwgaW50IG51bV9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb25hbENvbXBvbmVudCAqY29tcG9uZW50cykKK3sKKyAgICBpbnQgaSwgaiwgbGFzdF9wb3MgPSAtMTsKKyAgICBmbG9hdCAqaW5wdXQsICpvdXRwdXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICBsYXN0X3BvcyA9IEZGTUFYKGNvbXBvbmVudHNbaV0ucG9zICsgY29tcG9uZW50c1tpXS5udW1fY29lZnMsIGxhc3RfcG9zKTsKKyAgICAgICAgaW5wdXQgICAgPSBjb21wb25lbnRzW2ldLmNvZWY7CisgICAgICAgIG91dHB1dCAgID0gJnNwZWN0cnVtW2NvbXBvbmVudHNbaV0ucG9zXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29tcG9uZW50c1tpXS5udW1fY29lZnM7IGorKykKKyAgICAgICAgICAgIG91dHB1dFtqXSArPSBpbnB1dFtqXTsKKyAgICB9CisKKyAgICByZXR1cm4gbGFzdF9wb3M7Cit9CisKKyNkZWZpbmUgSU5URVJQT0xBVEUob2xkLCBuZXcsIG5zYW1wbGUpIFwKKyAgICAoKG9sZCkgKyAobnNhbXBsZSkgKiAwLjEyNSAqICgobmV3KSAtIChvbGQpKSkKKworc3RhdGljIHZvaWQgcmV2ZXJzZV9tYXRyaXhpbmcoZmxvYXQgKnN1MSwgZmxvYXQgKnN1MiwgaW50ICpwcmV2X2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmN1cnJfY29kZSkKK3sKKyAgICBpbnQgaSwgbnNhbXBsZSwgYmFuZDsKKyAgICBmbG9hdCBtYzFfbCwgbWMxX3IsIG1jMl9sLCBtYzJfcjsKKworICAgIGZvciAoaSA9IDAsIGJhbmQgPSAwOyBiYW5kIDwgNCAqIDI1NjsgYmFuZCArPSAyNTYsIGkrKykgeworICAgICAgICBpbnQgczEgPSBwcmV2X2NvZGVbaV07CisgICAgICAgIGludCBzMiA9IGN1cnJfY29kZVtpXTsKKyAgICAgICAgbnNhbXBsZSA9IGJhbmQ7CisKKyAgICAgICAgaWYgKHMxICE9IHMyKSB7CisgICAgICAgICAgICAvKiBTZWxlY3RvciB2YWx1ZSBjaGFuZ2VkLCBpbnRlcnBvbGF0aW9uIG5lZWRlZC4gKi8KKyAgICAgICAgICAgIG1jMV9sID0gbWF0cml4X2NvZWZmc1tzMSAqIDIgICAgXTsKKyAgICAgICAgICAgIG1jMV9yID0gbWF0cml4X2NvZWZmc1tzMSAqIDIgKyAxXTsKKyAgICAgICAgICAgIG1jMl9sID0gbWF0cml4X2NvZWZmc1tzMiAqIDIgICAgXTsKKyAgICAgICAgICAgIG1jMl9yID0gbWF0cml4X2NvZWZmc1tzMiAqIDIgKyAxXTsKKworICAgICAgICAgICAgLyogSW50ZXJwb2xhdGlvbiBpcyBkb25lIG92ZXIgdGhlIGZpcnN0IGVpZ2h0IHNhbXBsZXMuICovCisgICAgICAgICAgICBmb3IgKDsgbnNhbXBsZSA8IGJhbmQgKyA4OyBuc2FtcGxlKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBjMSA9IHN1MVtuc2FtcGxlXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBjMiA9IHN1Mltuc2FtcGxlXTsKKyAgICAgICAgICAgICAgICBjMiA9IGMxICogSU5URVJQT0xBVEUobWMxX2wsIG1jMl9sLCBuc2FtcGxlIC0gYmFuZCkgKworICAgICAgICAgICAgICAgICAgICAgYzIgKiBJTlRFUlBPTEFURShtYzFfciwgbWMyX3IsIG5zYW1wbGUgLSBiYW5kKTsKKyAgICAgICAgICAgICAgICBzdTFbbnNhbXBsZV0gPSBjMjsKKyAgICAgICAgICAgICAgICBzdTJbbnNhbXBsZV0gPSBjMSAqIDIuMCAtIGMyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQXBwbHkgdGhlIG1hdHJpeCB3aXRob3V0IGludGVycG9sYXRpb24uICovCisgICAgICAgIHN3aXRjaCAoczIpIHsKKyAgICAgICAgY2FzZSAwOiAgICAgLyogTS9TIGRlY29kaW5nICovCisgICAgICAgICAgICBmb3IgKDsgbnNhbXBsZSA8IGJhbmQgKyAyNTY7IG5zYW1wbGUrKykgeworICAgICAgICAgICAgICAgIGZsb2F0IGMxID0gc3UxW25zYW1wbGVdOworICAgICAgICAgICAgICAgIGZsb2F0IGMyID0gc3UyW25zYW1wbGVdOworICAgICAgICAgICAgICAgIHN1MVtuc2FtcGxlXSA9ICBjMiAgICAgICAqIDIuMDsKKyAgICAgICAgICAgICAgICBzdTJbbnNhbXBsZV0gPSAoYzEgLSBjMikgKiAyLjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZm9yICg7IG5zYW1wbGUgPCBiYW5kICsgMjU2OyBuc2FtcGxlKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBjMSA9IHN1MVtuc2FtcGxlXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBjMiA9IHN1Mltuc2FtcGxlXTsKKyAgICAgICAgICAgICAgICBzdTFbbnNhbXBsZV0gPSAoYzEgKyBjMikgKiAgMi4wOworICAgICAgICAgICAgICAgIHN1Mltuc2FtcGxlXSA9ICBjMiAgICAgICAqIC0yLjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBmb3IgKDsgbnNhbXBsZSA8IGJhbmQgKyAyNTY7IG5zYW1wbGUrKykgeworICAgICAgICAgICAgICAgIGZsb2F0IGMxID0gc3UxW25zYW1wbGVdOworICAgICAgICAgICAgICAgIGZsb2F0IGMyID0gc3UyW25zYW1wbGVdOworICAgICAgICAgICAgICAgIHN1MVtuc2FtcGxlXSA9IGMxICsgYzI7CisgICAgICAgICAgICAgICAgc3UyW25zYW1wbGVdID0gYzEgLSBjMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfYXNzZXJ0MSgwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2V0X2NoYW5uZWxfd2VpZ2h0cyhpbnQgaW5kZXgsIGludCBmbGFnLCBmbG9hdCBjaFsyXSkKK3sKKyAgICBpZiAoaW5kZXggPT0gNykgeworICAgICAgICBjaFswXSA9IDEuMDsKKyAgICAgICAgY2hbMV0gPSAxLjA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hbMF0gPSAoaW5kZXggJiA3KSAvIDcuMDsKKyAgICAgICAgY2hbMV0gPSBzcXJ0KDIgLSBjaFswXSAqIGNoWzBdKTsKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgICBGRlNXQVAoZmxvYXQsIGNoWzBdLCBjaFsxXSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGFubmVsX3dlaWdodGluZyhmbG9hdCAqc3UxLCBmbG9hdCAqc3UyLCBpbnQgKnAzKQoreworICAgIGludCBiYW5kLCBuc2FtcGxlOworICAgIC8qIHdbeF1beV0geT0wIGlzIGxlZnQgeT0xIGlzIHJpZ2h0ICovCisgICAgZmxvYXQgd1syXVsyXTsKKworICAgIGlmIChwM1sxXSAhPSA3IHx8IHAzWzNdICE9IDcpIHsKKyAgICAgICAgZ2V0X2NoYW5uZWxfd2VpZ2h0cyhwM1sxXSwgcDNbMF0sIHdbMF0pOworICAgICAgICBnZXRfY2hhbm5lbF93ZWlnaHRzKHAzWzNdLCBwM1syXSwgd1sxXSk7CisKKyAgICAgICAgZm9yIChiYW5kID0gMjU2OyBiYW5kIDwgNCAqIDI1NjsgYmFuZCArPSAyNTYpIHsKKyAgICAgICAgICAgIGZvciAobnNhbXBsZSA9IGJhbmQ7IG5zYW1wbGUgPCBiYW5kICsgODsgbnNhbXBsZSsrKSB7CisgICAgICAgICAgICAgICAgc3UxW25zYW1wbGVdICo9IElOVEVSUE9MQVRFKHdbMF1bMF0sIHdbMF1bMV0sIG5zYW1wbGUgLSBiYW5kKTsKKyAgICAgICAgICAgICAgICBzdTJbbnNhbXBsZV0gKj0gSU5URVJQT0xBVEUod1sxXVswXSwgd1sxXVsxXSwgbnNhbXBsZSAtIGJhbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKDsgbnNhbXBsZSA8IGJhbmQgKyAyNTY7IG5zYW1wbGUrKykgeworICAgICAgICAgICAgICAgIHN1MVtuc2FtcGxlXSAqPSB3WzFdWzBdOworICAgICAgICAgICAgICAgIHN1Mltuc2FtcGxlXSAqPSB3WzFdWzFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIERlY29kZSBhIFNvdW5kIFVuaXQKKyAqCisgKiBAcGFyYW0gc25kICAgICAgICAgICB0aGUgY2hhbm5lbCB1bml0IHRvIGJlIHVzZWQKKyAqIEBwYXJhbSBvdXRwdXQgICAgICAgIHRoZSBkZWNvZGVkIHNhbXBsZXMgYmVmb3JlIElRTUYgaW4gZmxvYXQgcmVwcmVzZW50YXRpb24KKyAqIEBwYXJhbSBjaGFubmVsX251bSAgIGNoYW5uZWwgbnVtYmVyCisgKiBAcGFyYW0gY29kaW5nX21vZGUgICB0aGUgY29kaW5nIG1vZGUgKEpPSU5UX1NURVJFTyBvciByZWd1bGFyIHN0ZXJlby9tb25vKQorICovCitzdGF0aWMgaW50IGRlY29kZV9jaGFubmVsX3NvdW5kX3VuaXQoQVRSQUMzQ29udGV4dCAqcSwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbFVuaXQgKnNuZCwgZmxvYXQgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbF9udW0sIGludCBjb2RpbmdfbW9kZSkKK3sKKyAgICBpbnQgYmFuZCwgcmV0LCBudW1fc3ViYmFuZHMsIGxhc3RfdG9uYWwsIG51bV9iYW5kczsKKyAgICBHYWluQmxvY2sgKmdhaW4xID0gJnNuZC0+Z2Fpbl9ibG9ja1sgICAgc25kLT5nY19ibGtfc3dpdGNoXTsKKyAgICBHYWluQmxvY2sgKmdhaW4yID0gJnNuZC0+Z2Fpbl9ibG9ja1sxIC0gc25kLT5nY19ibGtfc3dpdGNoXTsKKworICAgIGlmIChjb2RpbmdfbW9kZSA9PSBKT0lOVF9TVEVSRU8gJiYgY2hhbm5lbF9udW0gPT0gMSkgeworICAgICAgICBpZiAoZ2V0X2JpdHMoZ2IsIDIpICE9IDMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLEFWX0xPR19FUlJPUiwiSlMgbW9ubyBTb3VuZCBVbml0IGlkICE9IDMuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdldF9iaXRzKGdiLCA2KSAhPSAweDI4KSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCxBVl9MT0dfRVJST1IsIlNvdW5kIFVuaXQgaWQgIT0gMHgyOC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBudW1iZXIgb2YgY29kZWQgUU1GIGJhbmRzICovCisgICAgc25kLT5iYW5kc19jb2RlZCA9IGdldF9iaXRzKGdiLCAyKTsKKworICAgIHJldCA9IGRlY29kZV9nYWluX2NvbnRyb2woZ2IsIGdhaW4yLCBzbmQtPmJhbmRzX2NvZGVkKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc25kLT5udW1fY29tcG9uZW50cyA9IGRlY29kZV90b25hbF9jb21wb25lbnRzKGdiLCBzbmQtPmNvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZC0+YmFuZHNfY29kZWQpOworICAgIGlmIChzbmQtPm51bV9jb21wb25lbnRzIDwgMCkKKyAgICAgICAgcmV0dXJuIHNuZC0+bnVtX2NvbXBvbmVudHM7CisKKyAgICBudW1fc3ViYmFuZHMgPSBkZWNvZGVfc3BlY3RydW0oZ2IsIHNuZC0+c3BlY3RydW0pOworCisgICAgLyogTWVyZ2UgdGhlIGRlY29kZWQgc3BlY3RydW0gYW5kIHRvbmFsIGNvbXBvbmVudHMuICovCisgICAgbGFzdF90b25hbCA9IGFkZF90b25hbF9jb21wb25lbnRzKHNuZC0+c3BlY3RydW0sIHNuZC0+bnVtX2NvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZC0+Y29tcG9uZW50cyk7CisKKworICAgIC8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgdXNlZCBNTFQvUU1GIGJhbmRzIGFjY29yZGluZyB0byB0aGUgYW1vdW50IG9mIGNvZGVkCisgICAgICAgc3BlY3RyYWwgbGluZXMgKi8KKyAgICBudW1fYmFuZHMgPSAoc3ViYmFuZF90YWJbbnVtX3N1YmJhbmRzXSAtIDEpID4+IDg7CisgICAgaWYgKGxhc3RfdG9uYWwgPj0gMCkKKyAgICAgICAgbnVtX2JhbmRzID0gRkZNQVgoKGxhc3RfdG9uYWwgKyAyNTYpID4+IDgsIG51bV9iYW5kcyk7CisKKworICAgIC8qIFJlY29uc3RydWN0IHRpbWUgZG9tYWluIHNhbXBsZXMuICovCisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IDQ7IGJhbmQrKykgeworICAgICAgICAvKiBQZXJmb3JtIHRoZSBJTURDVCBzdGVwIHdpdGhvdXQgb3ZlcmxhcHBpbmcuICovCisgICAgICAgIGlmIChiYW5kIDw9IG51bV9iYW5kcykKKyAgICAgICAgICAgIGltbHQocSwgJnNuZC0+c3BlY3RydW1bYmFuZCAqIDI1Nl0sIHNuZC0+aW1kY3RfYnVmLCBiYW5kICYgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1lbXNldChzbmQtPmltZGN0X2J1ZiwgMCwgNTEyICogc2l6ZW9mKCpzbmQtPmltZGN0X2J1ZikpOworCisgICAgICAgIC8qIGdhaW4gY29tcGVuc2F0aW9uIGFuZCBvdmVybGFwcGluZyAqLworICAgICAgICBmZl9hdHJhY19nYWluX2NvbXBlbnNhdGlvbigmcS0+Z2FpbmNfY3R4LCBzbmQtPmltZGN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNuZC0+cHJldl9mcmFtZVtiYW5kICogMjU2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdhaW4xLT5nX2Jsb2NrW2JhbmRdLCAmZ2FpbjItPmdfYmxvY2tbYmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NiwgJm91dHB1dFtiYW5kICogMjU2XSk7CisgICAgfQorCisgICAgLyogU3dhcCB0aGUgZ2FpbiBjb250cm9sIGJ1ZmZlcnMgZm9yIHRoZSBuZXh0IGZyYW1lLiAqLworICAgIHNuZC0+Z2NfYmxrX3N3aXRjaCBePSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqZGF0YWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqb3V0X3NhbXBsZXMpCit7CisgICAgQVRSQUMzQ29udGV4dCAqcSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldCwgaTsKKyAgICB1aW50OF90ICpwdHIxOworCisgICAgaWYgKHEtPmNvZGluZ19tb2RlID09IEpPSU5UX1NURVJFTykgeworICAgICAgICAvKiBjaGFubmVsIGNvdXBsaW5nIG1vZGUgKi8KKyAgICAgICAgLyogZGVjb2RlIFNvdW5kIFVuaXQgMSAqLworICAgICAgICBpbml0X2dldF9iaXRzKCZxLT5nYiwgZGF0YWJ1ZiwgYXZjdHgtPmJsb2NrX2FsaWduICogOCk7CisKKyAgICAgICAgcmV0ID0gZGVjb2RlX2NoYW5uZWxfc291bmRfdW5pdChxLCAmcS0+Z2IsIHEtPnVuaXRzLCBvdXRfc2FtcGxlc1swXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKT0lOVF9TVEVSRU8pOworICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIC8qIEZyYW1lZGF0YSBvZiB0aGUgc3UyIGluIHRoZSBqb2ludC1zdGVyZW8gbW9kZSBpcyBlbmNvZGVkIGluCisgICAgICAgICAqIHJldmVyc2UgYnl0ZSBvcmRlciBzbyB3ZSBuZWVkIHRvIHN3YXAgaXQgZmlyc3QuICovCisgICAgICAgIGlmIChkYXRhYnVmID09IHEtPmRlY29kZWRfYnl0ZXNfYnVmZmVyKSB7CisgICAgICAgICAgICB1aW50OF90ICpwdHIyID0gcS0+ZGVjb2RlZF9ieXRlc19idWZmZXIgKyBhdmN0eC0+YmxvY2tfYWxpZ24gLSAxOworICAgICAgICAgICAgcHRyMSAgICAgICAgICA9IHEtPmRlY29kZWRfYnl0ZXNfYnVmZmVyOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5ibG9ja19hbGlnbiAvIDI7IGkrKywgcHRyMSsrLCBwdHIyLS0pCisgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QsICpwdHIxLCAqcHRyMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwdHIyID0gZGF0YWJ1ZiArIGF2Y3R4LT5ibG9ja19hbGlnbiAtIDE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmJsb2NrX2FsaWduOyBpKyspCisgICAgICAgICAgICAgICAgcS0+ZGVjb2RlZF9ieXRlc19idWZmZXJbaV0gPSAqcHRyMi0tOworICAgICAgICB9CisKKyAgICAgICAgLyogU2tpcCB0aGUgc3luYyBjb2RlcyAoMHhGOCkuICovCisgICAgICAgIHB0cjEgPSBxLT5kZWNvZGVkX2J5dGVzX2J1ZmZlcjsKKyAgICAgICAgZm9yIChpID0gNDsgKnB0cjEgPT0gMHhGODsgaSsrLCBwdHIxKyspIHsKKyAgICAgICAgICAgIGlmIChpID49IGF2Y3R4LT5ibG9ja19hbGlnbikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyogc2V0IHRoZSBiaXRzdHJlYW0gcmVhZGVyIGF0IHRoZSBzdGFydCBvZiB0aGUgc2Vjb25kIFNvdW5kIFVuaXQqLworICAgICAgICBpbml0X2dldF9iaXRzOCgmcS0+Z2IsIHB0cjEsIHEtPmRlY29kZWRfYnl0ZXNfYnVmZmVyICsgYXZjdHgtPmJsb2NrX2FsaWduIC0gcHRyMSk7CisKKyAgICAgICAgLyogRmlsbCB0aGUgV2VpZ2h0aW5nIGNvZWZmcyBkZWxheSBidWZmZXIgKi8KKyAgICAgICAgbWVtbW92ZShxLT53ZWlnaHRpbmdfZGVsYXksICZxLT53ZWlnaHRpbmdfZGVsYXlbMl0sCisgICAgICAgICAgICAgICAgNCAqIHNpemVvZigqcS0+d2VpZ2h0aW5nX2RlbGF5KSk7CisgICAgICAgIHEtPndlaWdodGluZ19kZWxheVs0XSA9IGdldF9iaXRzMSgmcS0+Z2IpOworICAgICAgICBxLT53ZWlnaHRpbmdfZGVsYXlbNV0gPSBnZXRfYml0cygmcS0+Z2IsIDMpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIHEtPm1hdHJpeF9jb2VmZl9pbmRleF9wcmV2W2ldID0gcS0+bWF0cml4X2NvZWZmX2luZGV4X25vd1tpXTsKKyAgICAgICAgICAgIHEtPm1hdHJpeF9jb2VmZl9pbmRleF9ub3dbaV0gID0gcS0+bWF0cml4X2NvZWZmX2luZGV4X25leHRbaV07CisgICAgICAgICAgICBxLT5tYXRyaXhfY29lZmZfaW5kZXhfbmV4dFtpXSA9IGdldF9iaXRzKCZxLT5nYiwgMik7CisgICAgICAgIH0KKworICAgICAgICAvKiBEZWNvZGUgU291bmQgVW5pdCAyLiAqLworICAgICAgICByZXQgPSBkZWNvZGVfY2hhbm5lbF9zb3VuZF91bml0KHEsICZxLT5nYiwgJnEtPnVuaXRzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9zYW1wbGVzWzFdLCAxLCBKT0lOVF9TVEVSRU8pOworICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIC8qIFJlY29uc3RydWN0IHRoZSBjaGFubmVsIGNvZWZmaWNpZW50cy4gKi8KKyAgICAgICAgcmV2ZXJzZV9tYXRyaXhpbmcob3V0X3NhbXBsZXNbMF0sIG91dF9zYW1wbGVzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5tYXRyaXhfY29lZmZfaW5kZXhfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+bWF0cml4X2NvZWZmX2luZGV4X25vdyk7CisKKyAgICAgICAgY2hhbm5lbF93ZWlnaHRpbmcob3V0X3NhbXBsZXNbMF0sIG91dF9zYW1wbGVzWzFdLCBxLT53ZWlnaHRpbmdfZGVsYXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5vcm1hbCBzdGVyZW8gbW9kZSBvciBtb25vICovCisgICAgICAgIC8qIERlY29kZSB0aGUgY2hhbm5lbCBzb3VuZCB1bml0cy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIGJpdHN0cmVhbSByZWFkZXIgYXQgdGhlIHN0YXJ0IG9mIGEgY2hhbm5lbCBzb3VuZCB1bml0LiAqLworICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmcS0+Z2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFidWYgKyBpICogYXZjdHgtPmJsb2NrX2FsaWduIC8gYXZjdHgtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+YmxvY2tfYWxpZ24gKiA4IC8gYXZjdHgtPmNoYW5uZWxzKTsKKworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX2NoYW5uZWxfc291bmRfdW5pdChxLCAmcS0+Z2IsICZxLT51bml0c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3NhbXBsZXNbaV0sIGksIHEtPmNvZGluZ19tb2RlKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgLyogQXBwbHkgdGhlIGlRTUYgc3ludGhlc2lzIGZpbHRlci4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgZmxvYXQgKnAxID0gb3V0X3NhbXBsZXNbaV07CisgICAgICAgIGZsb2F0ICpwMiA9IHAxICsgMjU2OworICAgICAgICBmbG9hdCAqcDMgPSBwMiArIDI1NjsKKyAgICAgICAgZmxvYXQgKnA0ID0gcDMgKyAyNTY7CisgICAgICAgIGZmX2F0cmFjX2lxbWYocDEsIHAyLCAyNTYsIHAxLCBxLT51bml0c1tpXS5kZWxheV9idWYxLCBxLT50ZW1wX2J1Zik7CisgICAgICAgIGZmX2F0cmFjX2lxbWYocDQsIHAzLCAyNTYsIHAzLCBxLT51bml0c1tpXS5kZWxheV9idWYyLCBxLT50ZW1wX2J1Zik7CisgICAgICAgIGZmX2F0cmFjX2lxbWYocDEsIHAzLCA1MTIsIHAxLCBxLT51bml0c1tpXS5kZWxheV9idWYzLCBxLT50ZW1wX2J1Zik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRyYWMzX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBBVFJBQzNDb250ZXh0ICpxID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGFidWY7CisKKyAgICBpZiAoYnVmX3NpemUgPCBhdmN0eC0+YmxvY2tfYWxpZ24pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRnJhbWUgdG9vIHNtYWxsICglZCBieXRlcykuIFRydW5jYXRlZCBmaWxlP1xuIiwgYnVmX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gU0FNUExFU19QRVJfRlJBTUU7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gZGVzY3JhbWJsZSBhbmQgd2hhdCBidWZmZXIgdG8gcGFzcyBvbi4gKi8KKyAgICBpZiAocS0+c2NyYW1ibGVkX3N0cmVhbSkgeworICAgICAgICBkZWNvZGVfYnl0ZXMoYnVmLCBxLT5kZWNvZGVkX2J5dGVzX2J1ZmZlciwgYXZjdHgtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgZGF0YWJ1ZiA9IHEtPmRlY29kZWRfYnl0ZXNfYnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGFidWYgPSBidWY7CisgICAgfQorCisgICAgcmV0ID0gZGVjb2RlX2ZyYW1lKGF2Y3R4LCBkYXRhYnVmLCAoZmxvYXQgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGEpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkZyYW1lIGRlY29kaW5nIGVycm9yIVxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGF2Y3R4LT5ibG9ja19hbGlnbjsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBhdHJhYzNfaW5pdF9zdGF0aWNfZGF0YSh2b2lkKQoreworICAgIGludCBpOworCisgICAgaW5pdF9pbWRjdF93aW5kb3coKTsKKyAgICBmZl9hdHJhY19nZW5lcmF0ZV90YWJsZXMoKTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIFZMQyB0YWJsZXMuICovCisgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworICAgICAgICBzcGVjdHJhbF9jb2VmZl90YWJbaV0udGFibGUgPSAmYXRyYWMzX3ZsY190YWJsZVthdHJhYzNfdmxjX29mZnNbaV1dOworICAgICAgICBzcGVjdHJhbF9jb2VmZl90YWJbaV0udGFibGVfYWxsb2NhdGVkID0gYXRyYWMzX3ZsY19vZmZzW2kgKyAxXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHJhYzNfdmxjX29mZnNbaSAgICBdOworICAgICAgICBpbml0X3ZsYygmc3BlY3RyYWxfY29lZmZfdGFiW2ldLCA5LCBodWZmX3RhYl9zaXplc1tpXSwKKyAgICAgICAgICAgICAgICAgaHVmZl9iaXRzW2ldLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgaHVmZl9jb2Rlc1tpXSwgMSwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGF0cmFjM19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgc3RhdGljIGludCBzdGF0aWNfaW5pdF9kb25lOworICAgIGludCBpLCByZXQ7CisgICAgaW50IHZlcnNpb24sIGRlbGF5LCBzYW1wbGVzX3Blcl9mcmFtZSwgZnJhbWVfZmFjdG9yOworICAgIGNvbnN0IHVpbnQ4X3QgKmVkYXRhX3B0ciA9IGF2Y3R4LT5leHRyYWRhdGE7CisgICAgQVRSQUMzQ29udGV4dCAqcSA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDw9IDAgfHwgYXZjdHgtPmNoYW5uZWxzID4gMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNoYW5uZWwgY29uZmlndXJhdGlvbiBlcnJvciFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICghc3RhdGljX2luaXRfZG9uZSkKKyAgICAgICAgYXRyYWMzX2luaXRfc3RhdGljX2RhdGEoKTsKKyAgICBzdGF0aWNfaW5pdF9kb25lID0gMTsKKworICAgIC8qIFRha2UgY2FyZSBvZiB0aGUgY29kZWMtc3BlY2lmaWMgZXh0cmFkYXRhLiAqLworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPT0gMTQpIHsKKyAgICAgICAgLyogUGFyc2UgdGhlIGV4dHJhZGF0YSwgV0FWIGZvcm1hdCAqLworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlswLTFdICVkXG4iLAorICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9nZXRfbGUxNigmZWRhdGFfcHRyKSk7ICAvLyBVbmtub3duIHZhbHVlIGFsd2F5cyAxCisgICAgICAgIGVkYXRhX3B0ciArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtcGxlcyBwZXIgY2hhbm5lbAorICAgICAgICBxLT5jb2RpbmdfbW9kZSA9IGJ5dGVzdHJlYW1fZ2V0X2xlMTYoJmVkYXRhX3B0cik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCJbOC05XSAlZFxuIiwKKyAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fZ2V0X2xlMTYoJmVkYXRhX3B0cikpOyAgLy9EdXBlIG9mIGNvZGluZyBtb2RlCisgICAgICAgIGZyYW1lX2ZhY3RvciA9IGJ5dGVzdHJlYW1fZ2V0X2xlMTYoJmVkYXRhX3B0cik7ICAvLyBVbmtub3duIGFsd2F5cyAxCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCJbMTItMTNdICVkXG4iLAorICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9nZXRfbGUxNigmZWRhdGFfcHRyKSk7ICAvLyBVbmtub3duIGFsd2F5cyAwCisKKyAgICAgICAgLyogc2V0dXAgKi8KKyAgICAgICAgc2FtcGxlc19wZXJfZnJhbWUgICAgPSBTQU1QTEVTX1BFUl9GUkFNRSAqIGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgdmVyc2lvbiAgICAgICAgICAgICAgPSA0OworICAgICAgICBkZWxheSAgICAgICAgICAgICAgICA9IDB4ODhFOworICAgICAgICBxLT5jb2RpbmdfbW9kZSAgICAgICA9IHEtPmNvZGluZ19tb2RlID8gSk9JTlRfU1RFUkVPIDogU1RFUkVPOworICAgICAgICBxLT5zY3JhbWJsZWRfc3RyZWFtICA9IDA7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5ibG9ja19hbGlnbiAhPSAgOTYgKiBhdmN0eC0+Y2hhbm5lbHMgKiBmcmFtZV9mYWN0b3IgJiYKKyAgICAgICAgICAgIGF2Y3R4LT5ibG9ja19hbGlnbiAhPSAxNTIgKiBhdmN0eC0+Y2hhbm5lbHMgKiBmcmFtZV9mYWN0b3IgJiYKKyAgICAgICAgICAgIGF2Y3R4LT5ibG9ja19hbGlnbiAhPSAxOTIgKiBhdmN0eC0+Y2hhbm5lbHMgKiBmcmFtZV9mYWN0b3IpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBmcmFtZS9jaGFubmVsL2ZyYW1lX2ZhY3RvciAiCisgICAgICAgICAgICAgICAgICAgImNvbmZpZ3VyYXRpb24gJWQvJWQvJWRcbiIsIGF2Y3R4LT5ibG9ja19hbGlnbiwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMsIGZyYW1lX2ZhY3Rvcik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID09IDEyIHx8IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9PSAxMCkgeworICAgICAgICAvKiBQYXJzZSB0aGUgZXh0cmFkYXRhLCBSTSBmb3JtYXQuICovCisgICAgICAgIHZlcnNpb24gICAgICAgICAgICAgICAgPSBieXRlc3RyZWFtX2dldF9iZTMyKCZlZGF0YV9wdHIpOworICAgICAgICBzYW1wbGVzX3Blcl9mcmFtZSAgICAgID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmZWRhdGFfcHRyKTsKKyAgICAgICAgZGVsYXkgICAgICAgICAgICAgICAgICA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmVkYXRhX3B0cik7CisgICAgICAgIHEtPmNvZGluZ19tb2RlICAgICAgICAgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZlZGF0YV9wdHIpOworICAgICAgICBxLT5zY3JhbWJsZWRfc3RyZWFtICAgID0gMTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmtub3duIGV4dHJhZGF0YSBzaXplICVkLlxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhlIGV4dHJhZGF0YSAqLworCisgICAgaWYgKHZlcnNpb24gIT0gNCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlZlcnNpb24gJWQgIT0gNC5cbiIsIHZlcnNpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoc2FtcGxlc19wZXJfZnJhbWUgIT0gU0FNUExFU19QRVJfRlJBTUUgJiYKKyAgICAgICAgc2FtcGxlc19wZXJfZnJhbWUgIT0gU0FNUExFU19QRVJfRlJBTUUgKiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBhbW91bnQgb2Ygc2FtcGxlcyBwZXIgZnJhbWUgJWQuXG4iLAorICAgICAgICAgICAgICAgc2FtcGxlc19wZXJfZnJhbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoZGVsYXkgIT0gMHg4OEUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGFtb3VudCBvZiBkZWxheSAleCAhPSAweDg4RS5cbiIsCisgICAgICAgICAgICAgICBkZWxheSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChxLT5jb2RpbmdfbW9kZSA9PSBTVEVSRU8pCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiTm9ybWFsIHN0ZXJlbyBkZXRlY3RlZC5cbiIpOworICAgIGVsc2UgaWYgKHEtPmNvZGluZ19tb2RlID09IEpPSU5UX1NURVJFTykgeworICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxzICE9IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjb2RpbmcgbW9kZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkpvaW50IHN0ZXJlbyBkZXRlY3RlZC5cbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjaGFubmVsIGNvZGluZyBtb2RlICV4IVxuIiwKKyAgICAgICAgICAgICAgIHEtPmNvZGluZ19tb2RlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5ibG9ja19hbGlnbiA+PSBVSU5UX01BWCAvIDIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBxLT5kZWNvZGVkX2J5dGVzX2J1ZmZlciA9IGF2X21hbGxvY3ooRkZBTElHTihhdmN0eC0+YmxvY2tfYWxpZ24sIDQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFxLT5kZWNvZGVkX2J5dGVzX2J1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9GTFRQOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgTURDVCB0cmFuc2Zvcm0gKi8KKyAgICBpZiAoKHJldCA9IGZmX21kY3RfaW5pdCgmcS0+bWRjdF9jdHgsIDksIDEsIDEuMCAvIDMyNzY4KSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgaW5pdGlhbGl6aW5nIE1EQ1RcbiIpOworICAgICAgICBhdl9mcmVlcCgmcS0+ZGVjb2RlZF9ieXRlc19idWZmZXIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIGluaXQgdGhlIGpvaW50LXN0ZXJlbyBkZWNvZGluZyBkYXRhICovCisgICAgcS0+d2VpZ2h0aW5nX2RlbGF5WzBdID0gMDsKKyAgICBxLT53ZWlnaHRpbmdfZGVsYXlbMV0gPSA3OworICAgIHEtPndlaWdodGluZ19kZWxheVsyXSA9IDA7CisgICAgcS0+d2VpZ2h0aW5nX2RlbGF5WzNdID0gNzsKKyAgICBxLT53ZWlnaHRpbmdfZGVsYXlbNF0gPSAwOworICAgIHEtPndlaWdodGluZ19kZWxheVs1XSA9IDc7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHEtPm1hdHJpeF9jb2VmZl9pbmRleF9wcmV2W2ldID0gMzsKKyAgICAgICAgcS0+bWF0cml4X2NvZWZmX2luZGV4X25vd1tpXSAgPSAzOworICAgICAgICBxLT5tYXRyaXhfY29lZmZfaW5kZXhfbmV4dFtpXSA9IDM7CisgICAgfQorCisgICAgZmZfYXRyYWNfaW5pdF9nYWluX2NvbXBlbnNhdGlvbigmcS0+Z2FpbmNfY3R4LCA0LCAzKTsKKyAgICBxLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBmZl9mbXRfY29udmVydF9pbml0KCZxLT5mbXRfY29udiwgYXZjdHgpOworCisgICAgcS0+dW5pdHMgPSBhdl9tYWxsb2N6X2FycmF5KGF2Y3R4LT5jaGFubmVscywgc2l6ZW9mKCpxLT51bml0cykpOworICAgIGlmICghcS0+dW5pdHMgfHwgIXEtPmZkc3ApIHsKKyAgICAgICAgYXRyYWMzX2RlY29kZV9jbG9zZShhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfYXRyYWMzX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAiYXRyYWMzIiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVFJBQzMgKEFkYXB0aXZlIFRSYW5zZm9ybSBBY291c3RpYyBDb2RpbmcgMykiKSwKKyAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FUUkFDMywKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihBVFJBQzNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICA9IGF0cmFjM19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IGF0cmFjM19kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgICAgPSBhdHJhYzNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICAgID0gQ09ERUNfQ0FQX1NVQkZSQU1FUyB8IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMzZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMzZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOTEyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdHJhYzNkYXRhLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBBVFJBQzMgY29tcGF0aWJsZSBkZWNvZGVyIGRhdGEKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IE1heGltIFBvbGlha292c2tpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBCZW5qYW1pbiBMYXJzc29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFUUkFDMyBBS0EgUmVhbEF1ZGlvIDggY29tcGF0aWJsZSBkZWNvZGVyIGRhdGEKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVRSQUMzREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfQVRSQUMzREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogVkxDIHRhYmxlcyAqLworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmY29kZTFbOV0gPSB7CisgICAgMHgwLCAweDQsIDB4NSwgMHhDLCAweEQsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZiaXRzMVs5XSA9IHsgMSwgMywgMywgNCwgNCwgNSwgNSwgNSwgNSB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmY29kZTJbNV0gPSB7IDB4MCwgMHg0LCAweDUsIDB4NiwgMHg3IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZiaXRzMls1XSA9IHsgMSwgMywgMywgMywgMyB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmY29kZTNbN10gPSB7IDB4MCwgMHg0LCAweDUsIDB4QywgMHhELCAweEUsIDB4RiB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmYml0czNbN10gPSB7IDEsIDMsIDMsIDQsIDQsIDQsIDQgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZmNvZGU0WzldID0geworICAgIDB4MCwgMHg0LCAweDUsIDB4QywgMHhELCAweDFDLCAweDFELCAweDFFLCAweDFGCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmYml0czRbOV0gPSB7IDEsIDMsIDMsIDQsIDQsIDUsIDUsIDUsIDUgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZmNvZGU1WzE1XSA9IHsKKyAgICAweDAwLCAweDAyLCAweDAzLCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDFDLAorICAgIDB4MUQsIDB4M0MsIDB4M0QsIDB4M0UsIDB4M0YsIDB4MEMsIDB4MEQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZiaXRzNVsxNV0gPSB7CisgICAgMiwgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNiwgNiwgNiwgNiwgNCwgNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZmNvZGU2WzMxXSA9IHsKKyAgICAweDAwLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDE0LAorICAgIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MzQsIDB4MzUsIDB4MzYsCisgICAgMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwgMHgzQiwgMHg3OCwgMHg3OSwgMHg3QSwKKyAgICAweDdCLCAweDdDLCAweDdELCAweDdFLCAweDdGLCAweDA4LCAweDA5Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmYml0czZbMzFdID0geworICAgIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsIDYsIDYsIDYsCisgICAgNiwgNiwgNiwgNiwgNiwgNywgNywgNywgNywgNywgNywgNywgNywgNCwgNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZmNvZGU3WzYzXSA9IHsKKyAgICAweDAwLCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLAorICAgIDB4MEYsIDB4MTAsIDB4MTEsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCisgICAgMHgyOSwgMHgyQSwgMHgyQiwgMHgyQywgMHgyRCwgMHgyRSwgMHgyRiwgMHgzMCwKKyAgICAweDMxLCAweDMyLCAweDMzLCAweDY4LCAweDY5LCAweDZBLCAweDZCLCAweDZDLAorICAgIDB4NkQsIDB4NkUsIDB4NkYsIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsCisgICAgMHg3NSwgMHhFQywgMHhFRCwgMHhFRSwgMHhFRiwgMHhGMCwgMHhGMSwgMHhGMiwKKyAgICAweEYzLCAweEY0LCAweEY1LCAweEY2LCAweEY3LCAweEY4LCAweEY5LCAweEZBLAorICAgIDB4RkIsIDB4RkMsIDB4RkQsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDMKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZiaXRzN1s2M10gPSB7CisgICAgMywgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNiwgNiwgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA3LCA3LCA3LCA3LCA3LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgNCwgNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl90YWJfc2l6ZXNbN10gPSB7CisgICAgOSwgNSwgNywgOSwgMTUsIDMxLCA2MywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90KiBjb25zdCBodWZmX2NvZGVzWzddID0geworICAgIGh1ZmZjb2RlMSwgaHVmZmNvZGUyLCBodWZmY29kZTMsIGh1ZmZjb2RlNCwgaHVmZmNvZGU1LCBodWZmY29kZTYsIGh1ZmZjb2RlNworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGh1ZmZfYml0c1s3XSA9IHsKKyAgICBodWZmYml0czEsIGh1ZmZiaXRzMiwgaHVmZmJpdHMzLCBodWZmYml0czQsIGh1ZmZiaXRzNSwgaHVmZmJpdHM2LCBodWZmYml0czcsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYXRyYWMzX3ZsY19vZmZzWzldID0geworICAgIDAsIDUxMiwgMTAyNCwgMTUzNiwgMjA0OCwgMjU2MCwgMzA3MiwgMzU4NCwgNDA5NgorfTsKKworLyogc2VsZWN0b3IgdGFibGVzICovCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNsY19sZW5ndGhfdGFiWzhdID0geyAwLCA0LCAzLCAzLCA0LCA0LCA1LCA2IH07CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbWFudGlzc2FfY2xjX3RhYls0XSA9IHsgMCwgMSwgLTIsIC0xIH07CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbWFudGlzc2FfdmxjX3RhYlsxOF0gPSB7CisgICAgMCwgMCwgIDAsIDEsICAwLCAtMSwgIDEsIDAsICAtMSwgMCwgIDEsIDEsICAxLCAtMSwgIC0xLCAxLCAgLTEsIC0xCit9OworCisKKy8qIHRhYmxlcyBmb3IgdGhlIHNjYWxlZmFjdG9yIGRlY29kaW5nICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCBpbnZfbWF4X3F1YW50WzhdID0geworICAgICAgMC4wLCAgICAgICAxLjAgLyAxLjUsIDEuMCAvICAyLjUsIDEuMCAvICAzLjUsCisgICAgICAxLjAgLyA0LjUsIDEuMCAvIDcuNSwgMS4wIC8gMTUuNSwgMS4wIC8gMzEuNQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN1YmJhbmRfdGFiWzMzXSA9IHsKKyAgICAgIDAsICAgOCwgIDE2LCAgMjQsICAzMiwgIDQwLCAgNDgsICA1NiwKKyAgICAgNjQsICA4MCwgIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAsIDE3NiwKKyAgICAxOTIsIDIyNCwgMjU2LCAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwKKyAgICA0NDgsIDQ4MCwgNTEyLCA1NzYsIDY0MCwgNzA0LCA3NjgsIDg5NiwKKyAgICAxMDI0Cit9OworCisvKiBqb2ludCBzdGVyZW8gcmVsYXRlZCB0YWJsZXMgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBtYXRyaXhfY29lZmZzWzhdID0geworICAgIDAuMCwgMi4wLCAyLjAsIDIuMCwgMC4wLCAwLjAsIDEuMCwgMS4wCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19BVFJBQzNEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F0cmFjM3BsdXMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F0cmFjM3BsdXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVhNDkzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMzcGx1cy5jCkBAIC0wLDAgKzEsMTgxOCBAQAorLyoKKyAqIEFUUkFDMysgY29tcGF0aWJsZSBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTMgTWF4aW0gUG9saWFrb3Zza2kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQml0c3RyZWFtIHBhcnNlciBmb3IgQVRSQUMzKyBkZWNvZGVyLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJhdHJhYzNwbHVzLmgiCisjaW5jbHVkZSAiYXRyYWMzcGx1c19kYXRhLmgiCisKK3N0YXRpYyBWTENfVFlQRSB0YWJsZXNfZGF0YVsxNTQyNzZdWzJdOworc3RhdGljIFZMQyB3bF92bGNfdGFic1s0XTsKK3N0YXRpYyBWTEMgc2ZfdmxjX3RhYnNbOF07CitzdGF0aWMgVkxDIGN0X3ZsY190YWJzWzRdOworc3RhdGljIFZMQyBzcGVjX3ZsY190YWJzWzExMl07CitzdGF0aWMgVkxDIGdhaW5fdmxjX3RhYnNbMTFdOworc3RhdGljIFZMQyB0b25lX3ZsY190YWJzWzddOworCisjZGVmaW5lIEdFVF9ERUxUQShnYiwgZGVsdGFfYml0cykgXAorICAgICgoZGVsdGFfYml0cykgPyBnZXRfYml0cygoZ2IpLCAoZGVsdGFfYml0cykpIDogMCkKKworLyoqCisgKiBHZW5lcmF0ZSBjYW5vbmljYWwgVkxDIHRhYmxlIGZyb20gZ2l2ZW4gZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW1baW5dICAgICBjYiAgICAgICAgICBwdHIgdG8gY29kZWJvb2sgZGVzY3JpcHRvcgorICogQHBhcmFtW2luXSAgICAgeGxhdCAgICAgICAgcHRyIHRvIHRyYW5zbGF0aW9uIHRhYmxlIG9yIE5VTEwKKyAqIEBwYXJhbVtpbixvdXRdIHRhYl9vZmZzZXQgIHN0YXJ0aW5nIG9mZnNldCB0byB0aGUgZ2VuZXJhdGVkIHZsYyB0YWJsZQorICogQHBhcmFtW291dF0gICAgb3V0X3ZsYyAgICAgcHRyIHRvIHZsYyB0YWJsZSB0byBiZSBnZW5lcmF0ZWQKKyAqLworc3RhdGljIGF2X2NvbGQgdm9pZCBidWlsZF9jYW5vbmljYWxfaHVmZihjb25zdCB1aW50OF90ICpjYiwgY29uc3QgdWludDhfdCAqeGxhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0YWJfb2Zmc2V0LCBWTEMgKm91dF92bGMpCit7CisgICAgaW50IGksIGI7CisgICAgdWludDE2X3QgY29kZXNbMjU2XTsKKyAgICB1aW50OF90IGJpdHNbMjU2XTsKKyAgICB1bnNpZ25lZCBjb2RlID0gMDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGludCBtaW5fbGVuID0gKmNiKys7IC8vIGdldCBzaG9ydGVzdCBjb2Rld29yZCBsZW5ndGgKKyAgICBpbnQgbWF4X2xlbiA9ICpjYisrOyAvLyBnZXQgbG9uZ2VzdCAgY29kZXdvcmQgbGVuZ3RoCisKKyAgICBmb3IgKGIgPSBtaW5fbGVuOyBiIDw9IG1heF9sZW47IGIrKykgeworICAgICAgICBmb3IgKGkgPSAqY2IrKzsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgYXZfYXNzZXJ0MChpbmRleCA8IDI1Nik7CisgICAgICAgICAgICBiaXRzW2luZGV4XSAgPSBiOworICAgICAgICAgICAgY29kZXNbaW5kZXhdID0gY29kZSsrOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorICAgICAgICBjb2RlIDw8PSAxOworICAgIH0KKworICAgIG91dF92bGMtPnRhYmxlID0gJnRhYmxlc19kYXRhWyp0YWJfb2Zmc2V0XTsKKyAgICBvdXRfdmxjLT50YWJsZV9hbGxvY2F0ZWQgPSAxIDw8IG1heF9sZW47CisKKyAgICBmZl9pbml0X3ZsY19zcGFyc2Uob3V0X3ZsYywgbWF4X2xlbiwgaW5kZXgsIGJpdHMsIDEsIDEsIGNvZGVzLCAyLCAyLAorICAgICAgICAgICAgICAgICAgICAgICB4bGF0LCAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisKKyAgICAqdGFiX29mZnNldCArPSAxIDw8IG1heF9sZW47Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9hdHJhYzNwX2luaXRfdmxjcyh2b2lkKQoreworICAgIGludCBpLCB3bF92bGNfb2ZmcywgY3RfdmxjX29mZnMsIHNmX3ZsY19vZmZzLCB0YWJfb2Zmc2V0OworCisgICAgc3RhdGljIGNvbnN0IGludCB3bF9uYl9iaXRzWzRdICA9IHsgMiwgMywgNSwgNSB9OworICAgIHN0YXRpYyBjb25zdCBpbnQgd2xfbmJfY29kZXNbNF0gPSB7IDMsIDUsIDgsIDggfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCAqIGNvbnN0IHdsX2JpdHNbNF0gPSB7CisgICAgICAgIGF0cmFjM3Bfd2xfaHVmZl9iaXRzMSwgYXRyYWMzcF93bF9odWZmX2JpdHMyLAorICAgICAgICBhdHJhYzNwX3dsX2h1ZmZfYml0czMsIGF0cmFjM3Bfd2xfaHVmZl9iaXRzNAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCB3bF9jb2Rlc1s0XSA9IHsKKyAgICAgICAgYXRyYWMzcF93bF9odWZmX2NvZGUxLCBhdHJhYzNwX3dsX2h1ZmZfY29kZTIsCisgICAgICAgIGF0cmFjM3Bfd2xfaHVmZl9jb2RlMywgYXRyYWMzcF93bF9odWZmX2NvZGU0CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCAqIGNvbnN0IHdsX3hsYXRzWzRdID0geworICAgICAgICBhdHJhYzNwX3dsX2h1ZmZfeGxhdDEsIGF0cmFjM3Bfd2xfaHVmZl94bGF0MiwgTlVMTCwgTlVMTAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGN0X25iX2JpdHNbNF0gID0geyAzLCA0LCA0LCA0IH07CisgICAgc3RhdGljIGNvbnN0IGludCBjdF9uYl9jb2Rlc1s0XSA9IHsgNCwgOCwgOCwgOCB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICogY29uc3QgY3RfYml0c1s0XSAgPSB7CisgICAgICAgIGF0cmFjM3BfY3RfaHVmZl9iaXRzMSwgYXRyYWMzcF9jdF9odWZmX2JpdHMyLAorICAgICAgICBhdHJhYzNwX2N0X2h1ZmZfYml0czIsIGF0cmFjM3BfY3RfaHVmZl9iaXRzMworICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCBjdF9jb2Rlc1s0XSA9IHsKKyAgICAgICAgYXRyYWMzcF9jdF9odWZmX2NvZGUxLCBhdHJhYzNwX2N0X2h1ZmZfY29kZTIsCisgICAgICAgIGF0cmFjM3BfY3RfaHVmZl9jb2RlMiwgYXRyYWMzcF9jdF9odWZmX2NvZGUzCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCAqIGNvbnN0IGN0X3hsYXRzWzRdID0geworICAgICAgICBOVUxMLCBOVUxMLCBhdHJhYzNwX2N0X2h1ZmZfeGxhdDEsIE5VTEwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0ICBpbnQgc2ZfbmJfYml0c1s4XSAgPSB7ICA5LCAgOSwgIDksICA5LCAgNiwgIDYsICA3LCAgNyB9OworICAgIHN0YXRpYyBjb25zdCAgaW50IHNmX25iX2NvZGVzWzhdID0geyA2NCwgNjQsIDY0LCA2NCwgMTYsIDE2LCAxNiwgMTYgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCAgKiBjb25zdCBzZl9iaXRzWzhdICA9IHsKKyAgICAgICAgYXRyYWMzcF9zZl9odWZmX2JpdHMxLCBhdHJhYzNwX3NmX2h1ZmZfYml0czEsIGF0cmFjM3Bfc2ZfaHVmZl9iaXRzMiwKKyAgICAgICAgYXRyYWMzcF9zZl9odWZmX2JpdHMzLCBhdHJhYzNwX3NmX2h1ZmZfYml0czQsIGF0cmFjM3Bfc2ZfaHVmZl9iaXRzNCwKKyAgICAgICAgYXRyYWMzcF9zZl9odWZmX2JpdHM1LCBhdHJhYzNwX3NmX2h1ZmZfYml0czYKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCAqIGNvbnN0IHNmX2NvZGVzWzhdID0geworICAgICAgICBhdHJhYzNwX3NmX2h1ZmZfY29kZTEsIGF0cmFjM3Bfc2ZfaHVmZl9jb2RlMSwgYXRyYWMzcF9zZl9odWZmX2NvZGUyLAorICAgICAgICBhdHJhYzNwX3NmX2h1ZmZfY29kZTMsIGF0cmFjM3Bfc2ZfaHVmZl9jb2RlNCwgYXRyYWMzcF9zZl9odWZmX2NvZGU0LAorICAgICAgICBhdHJhYzNwX3NmX2h1ZmZfY29kZTUsIGF0cmFjM3Bfc2ZfaHVmZl9jb2RlNgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgICogY29uc3Qgc2ZfeGxhdHNbOF0gPSB7CisgICAgICAgIGF0cmFjM3Bfc2ZfaHVmZl94bGF0MSwgYXRyYWMzcF9zZl9odWZmX3hsYXQyLCBOVUxMLCBOVUxMLAorICAgICAgICBhdHJhYzNwX3NmX2h1ZmZfeGxhdDQsIGF0cmFjM3Bfc2ZfaHVmZl94bGF0NSwgTlVMTCwgTlVMTAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCAqIGNvbnN0IGdhaW5fY2JzWzExXSA9IHsKKyAgICAgICAgYXRyYWMzcF9odWZmX2dhaW5fbnBvaW50czFfY2IsIGF0cmFjM3BfaHVmZl9nYWluX25wb2ludHMxX2NiLAorICAgICAgICBhdHJhYzNwX2h1ZmZfZ2Fpbl9sZXYxX2NiLCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sZXYyX2NiLAorICAgICAgICBhdHJhYzNwX2h1ZmZfZ2Fpbl9sZXYzX2NiLCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sZXY0X2NiLAorICAgICAgICBhdHJhYzNwX2h1ZmZfZ2Fpbl9sb2MzX2NiLCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sb2MxX2NiLAorICAgICAgICBhdHJhYzNwX2h1ZmZfZ2Fpbl9sb2M0X2NiLCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sb2MyX2NiLAorICAgICAgICBhdHJhYzNwX2h1ZmZfZ2Fpbl9sb2M1X2NiCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCAqIGNvbnN0IGdhaW5feGxhdHNbMTFdID0geworICAgICAgICBOVUxMLCBhdHJhYzNwX2h1ZmZfZ2Fpbl9ucG9pbnRzMl94bGF0LCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sZXYxX3hsYXQsCisgICAgICAgIGF0cmFjM3BfaHVmZl9nYWluX2xldjJfeGxhdCwgYXRyYWMzcF9odWZmX2dhaW5fbGV2M194bGF0LAorICAgICAgICBhdHJhYzNwX2h1ZmZfZ2Fpbl9sZXY0X3hsYXQsIGF0cmFjM3BfaHVmZl9nYWluX2xvYzNfeGxhdCwKKyAgICAgICAgYXRyYWMzcF9odWZmX2dhaW5fbG9jMV94bGF0LCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sb2M0X3hsYXQsCisgICAgICAgIGF0cmFjM3BfaHVmZl9nYWluX2xvYzJfeGxhdCwgYXRyYWMzcF9odWZmX2dhaW5fbG9jNV94bGF0CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICogY29uc3QgdG9uZV9jYnNbN10gPSB7CisgICAgICAgIGF0cmFjM3BfaHVmZl90b25lYmFuZHNfY2IsICBhdHJhYzNwX2h1ZmZfbnVtd2F2czFfY2IsCisgICAgICAgIGF0cmFjM3BfaHVmZl9udW13YXZzMl9jYiwgICBhdHJhYzNwX2h1ZmZfd2F2X2FtcHNmMV9jYiwKKyAgICAgICAgYXRyYWMzcF9odWZmX3dhdl9hbXBzZjJfY2IsIGF0cmFjM3BfaHVmZl93YXZfYW1wc2YzX2NiLAorICAgICAgICBhdHJhYzNwX2h1ZmZfZnJlcV9jYgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCB0b25lX3hsYXRzWzddID0geworICAgICAgICBOVUxMLCBOVUxMLCBhdHJhYzNwX2h1ZmZfbnVtd2F2czJfeGxhdCwgYXRyYWMzcF9odWZmX3dhdl9hbXBzZjFfeGxhdCwKKyAgICAgICAgYXRyYWMzcF9odWZmX3dhdl9hbXBzZjJfeGxhdCwgYXRyYWMzcF9odWZmX3dhdl9hbXBzZjNfeGxhdCwKKyAgICAgICAgYXRyYWMzcF9odWZmX2ZyZXFfeGxhdAorICAgIH07CisKKyAgICBmb3IgKGkgPSAwLCB3bF92bGNfb2ZmcyA9IDAsIGN0X3ZsY19vZmZzID0gMjUwODsgaSA8IDQ7IGkrKykgeworICAgICAgICB3bF92bGNfdGFic1tpXS50YWJsZSA9ICZ0YWJsZXNfZGF0YVt3bF92bGNfb2Zmc107CisgICAgICAgIHdsX3ZsY190YWJzW2ldLnRhYmxlX2FsbG9jYXRlZCA9IDEgPDwgd2xfbmJfYml0c1tpXTsKKyAgICAgICAgY3RfdmxjX3RhYnNbaV0udGFibGUgPSAmdGFibGVzX2RhdGFbY3RfdmxjX29mZnNdOworICAgICAgICBjdF92bGNfdGFic1tpXS50YWJsZV9hbGxvY2F0ZWQgPSAxIDw8IGN0X25iX2JpdHNbaV07CisKKyAgICAgICAgZmZfaW5pdF92bGNfc3BhcnNlKCZ3bF92bGNfdGFic1tpXSwgd2xfbmJfYml0c1tpXSwgd2xfbmJfY29kZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3bF9iaXRzW2ldLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdsX2NvZGVzW2ldLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2xfeGxhdHNbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisKKyAgICAgICAgZmZfaW5pdF92bGNfc3BhcnNlKCZjdF92bGNfdGFic1tpXSwgY3RfbmJfYml0c1tpXSwgY3RfbmJfY29kZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdF9iaXRzW2ldLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0X2NvZGVzW2ldLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RfeGxhdHNbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisKKyAgICAgICAgd2xfdmxjX29mZnMgKz0gd2xfdmxjX3RhYnNbaV0udGFibGVfYWxsb2NhdGVkOworICAgICAgICBjdF92bGNfb2ZmcyArPSBjdF92bGNfdGFic1tpXS50YWJsZV9hbGxvY2F0ZWQ7CisgICAgfQorCisgICAgZm9yIChpID0gMCwgc2ZfdmxjX29mZnMgPSA3NjsgaSA8IDg7IGkrKykgeworICAgICAgICBzZl92bGNfdGFic1tpXS50YWJsZSA9ICZ0YWJsZXNfZGF0YVtzZl92bGNfb2Zmc107CisgICAgICAgIHNmX3ZsY190YWJzW2ldLnRhYmxlX2FsbG9jYXRlZCA9IDEgPDwgc2ZfbmJfYml0c1tpXTsKKworICAgICAgICBmZl9pbml0X3ZsY19zcGFyc2UoJnNmX3ZsY190YWJzW2ldLCBzZl9uYl9iaXRzW2ldLCBzZl9uYl9jb2Rlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmX2JpdHNbaV0sICAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZfY29kZXNbaV0sIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZl94bGF0c1tpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICAgICAgc2ZfdmxjX29mZnMgKz0gc2ZfdmxjX3RhYnNbaV0udGFibGVfYWxsb2NhdGVkOworICAgIH0KKworICAgIHRhYl9vZmZzZXQgPSAyNTY0OworCisgICAgLyogYnVpbGQgaHVmZm1hbiB0YWJsZXMgZm9yIHNwZWN0cnVtIGRlY29kaW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IDExMjsgaSsrKSB7CisgICAgICAgIGlmIChhdHJhYzNwX3NwZWN0cmFfdGFic1tpXS5jYikKKyAgICAgICAgICAgIGJ1aWxkX2Nhbm9uaWNhbF9odWZmKGF0cmFjM3Bfc3BlY3RyYV90YWJzW2ldLmNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRyYWMzcF9zcGVjdHJhX3RhYnNbaV0ueGxhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJfb2Zmc2V0LCAmc3BlY192bGNfdGFic1tpXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNwZWNfdmxjX3RhYnNbaV0udGFibGUgPSAwOworICAgIH0KKworICAgIC8qIGJ1aWxkIGh1ZmZtYW4gdGFibGVzIGZvciBnYWluIGRhdGEgZGVjb2RpbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykKKyAgICAgICAgYnVpbGRfY2Fub25pY2FsX2h1ZmYoZ2Fpbl9jYnNbaV0sIGdhaW5feGxhdHNbaV0sICZ0YWJfb2Zmc2V0LCAmZ2Fpbl92bGNfdGFic1tpXSk7CisKKyAgICAvKiBidWlsZCBodWZmbWFuIHRhYmxlcyBmb3IgdG9uZSBkZWNvZGluZyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisgICAgICAgIGJ1aWxkX2Nhbm9uaWNhbF9odWZmKHRvbmVfY2JzW2ldLCB0b25lX3hsYXRzW2ldLCAmdGFiX29mZnNldCwgJnRvbmVfdmxjX3RhYnNbaV0pOworfQorCisvKioKKyAqIERlY29kZSBudW1iZXIgb2YgY29kZWQgcXVhbnRpemF0aW9uIHVuaXRzLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjaGFuICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCBwYXJhbWV0ZXJzCisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCB1bml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiByZXN1bHQgY29kZTogMCA9IE9LLCBvdGhlcndpc2UgLSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbnVtX2NvZGVkX3VuaXRzKEdldEJpdENvbnRleHQgKmdiLCBBdHJhYzNwQ2hhblBhcmFtcyAqY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgY2hhbi0+ZmlsbF9tb2RlID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgIGlmICghY2hhbi0+ZmlsbF9tb2RlKSB7CisgICAgICAgIGNoYW4tPm51bV9jb2RlZF92YWxzID0gY3R4LT5udW1fcXVhbnRfdW5pdHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhbi0+bnVtX2NvZGVkX3ZhbHMgPSBnZXRfYml0cyhnYiwgNSk7CisgICAgICAgIGlmIChjaGFuLT5udW1fY29kZWRfdmFscyA+IGN0eC0+bnVtX3F1YW50X3VuaXRzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgdW5pdHMhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoYW4tPmZpbGxfbW9kZSA9PSAzKQorICAgICAgICAgICAgY2hhbi0+c3BsaXRfcG9pbnQgPSBnZXRfYml0cyhnYiwgMikgKyAoY2hhbi0+Y2hfbnVtIDw8IDEpICsgMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBBZGQgd2VpZ2h0aW5nIGNvZWZmaWNpZW50cyB0byB0aGUgZGVjb2RlZCB3b3JkLWxlbmd0aCBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCB1bml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbixvdXRdIGNoYW4gICAgICAgICAgcHRyIHRvIHRoZSBjaGFubmVsIHBhcmFtZXRlcnMKKyAqIEBwYXJhbVtpbl0gICAgIHd0YWJfaWR4ICAgICAgaW5kZXggb2YgdGhlIHRhYmxlIG9mIHdlaWdodHMKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiByZXN1bHQgY29kZTogMCA9IE9LLCBvdGhlcndpc2UgLSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYWRkX3dvcmRsZW5fd2VpZ2h0cyhBdHJhYzNwQ2hhblVuaXRDdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHJhYzNwQ2hhblBhcmFtcyAqY2hhbiwgaW50IHd0YWJfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCBpbnQ4X3QgKndlaWdodHNfdGFiID0KKyAgICAgICAgJmF0cmFjM3Bfd2xfd2VpZ2h0c1tjaGFuLT5jaF9udW0gKiAzICsgd3RhYl9pZHggLSAxXVswXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm51bV9xdWFudF91bml0czsgaSsrKSB7CisgICAgICAgIGNoYW4tPnF1X3dvcmRsZW5baV0gKz0gd2VpZ2h0c190YWJbaV07CisgICAgICAgIGlmIChjaGFuLT5xdV93b3JkbGVuW2ldIDwgMCB8fCBjaGFuLT5xdV93b3JkbGVuW2ldID4gNykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIldMIGluZGV4IG91dCBvZiByYW5nZTogcG9zPSVkLCB2YWw9JWQhXG4iLAorICAgICAgICAgICAgICAgICAgIGksIGNoYW4tPnF1X3dvcmRsZW5baV0pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBTdWJ0cmFjdCB3ZWlnaHRpbmcgY29lZmZpY2llbnRzIGZyb20gZGVjb2RlZCBzY2FsZWZhY3RvcnMuCisgKgorICogQHBhcmFtW2luLG91dF0gY3R4ICAgICAgICAgICBwdHIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjaGFuICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCBwYXJhbWV0ZXJzCisgKiBAcGFyYW1baW5dICAgICB3dGFiX2lkeCAgICAgIGluZGV4IG9mIHRhYmxlIG9mIHdlaWdodHMKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiByZXN1bHQgY29kZTogMCA9IE9LLCBvdGhlcndpc2UgLSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc3VidHJhY3Rfc2Zfd2VpZ2h0cyhBdHJhYzNwQ2hhblVuaXRDdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHJhYzNwQ2hhblBhcmFtcyAqY2hhbiwgaW50IHd0YWJfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCBpbnQ4X3QgKndlaWdodHNfdGFiID0gJmF0cmFjM3Bfc2Zfd2VpZ2h0c1t3dGFiX2lkeCAtIDFdWzBdOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+dXNlZF9xdWFudF91bml0czsgaSsrKSB7CisgICAgICAgIGNoYW4tPnF1X3NmX2lkeFtpXSAtPSB3ZWlnaHRzX3RhYltpXTsKKyAgICAgICAgaWYgKGNoYW4tPnF1X3NmX2lkeFtpXSA8IDAgfHwgY2hhbi0+cXVfc2ZfaWR4W2ldID4gNjMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJTRiBpbmRleCBvdXQgb2YgcmFuZ2U6IHBvcz0lZCwgdmFsPSVkIVxuIiwKKyAgICAgICAgICAgICAgICAgICBpLCBjaGFuLT5xdV9zZl9pZHhbaV0pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBVbnBhY2sgdmVjdG9yIHF1YW50aXphdGlvbiB0YWJsZXMuCisgKgorICogQHBhcmFtW2luXSAgICBzdGFydF92YWwgICAgc3RhcnQgdmFsdWUgZm9yIHRoZSB1bnBhY2tlZCB0YWJsZQorICogQHBhcmFtW2luXSAgICBzaGFwZV92ZWMgICAgcHRyIHRvIHRhYmxlIHRvIHVucGFjaworICogQHBhcmFtW291dF0gICBkc3QgICAgICAgICAgcHRyIHRvIG91dHB1dCBhcnJheQorICogQHBhcmFtW2luXSAgICBudW1fdmFsdWVzICAgbnVtYmVyIG9mIHZhbHVlcyB0byB1bnBhY2sKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVucGFja192cV9zaGFwZShpbnQgc3RhcnRfdmFsLCBjb25zdCBpbnQ4X3QgKnNoYXBlX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkc3QsIGludCBudW1fdmFsdWVzKQoreworICAgIGludCBpOworCisgICAgaWYgKG51bV92YWx1ZXMpIHsKKyAgICAgICAgZHN0WzBdID0gZHN0WzFdID0gZHN0WzJdID0gc3RhcnRfdmFsOworICAgICAgICBmb3IgKGkgPSAzOyBpIDwgbnVtX3ZhbHVlczsgaSsrKQorICAgICAgICAgICAgZHN0W2ldID0gc3RhcnRfdmFsIC0gc2hhcGVfdmVjW2F0cmFjM3BfcXVfbnVtX3RvX3NlZ1tpXSAtIDFdOworICAgIH0KK30KKworI2RlZmluZSBVTlBBQ0tfU0ZfVlFfU0hBUEUoZ2IsIGRzdCwgbnVtX3ZhbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGFydF92YWwgPSBnZXRfYml0cygoZ2IpLCA2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5wYWNrX3ZxX3NoYXBlKHN0YXJ0X3ZhbCwgJmF0cmFjM3Bfc2Zfc2hhcGVzW2dldF9iaXRzKChnYiksIDYpXVswXSwgXAorICAgICAgICAgICAgICAgICAgICAoZHN0KSwgKG51bV92YWxzKSkKKworLyoqCisgKiBEZWNvZGUgd29yZCBsZW5ndGggZm9yIGVhY2ggcXVhbnRpemF0aW9uIHVuaXQgb2YgYSBjaGFubmVsLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCB1bml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIGNoX251bSAgICAgICAgY2hhbm5lbCB0byBwcm9jZXNzCisgKiBAcGFyYW1baW5dICAgICBhdmN0eCAgICAgICAgIHB0ciB0byB0aGUgQVZDb2RlY0NvbnRleHQKKyAqIEByZXR1cm4gcmVzdWx0IGNvZGU6IDAgPSBPSywgb3RoZXJ3aXNlIC0gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGRlY29kZV9jaGFubmVsX3dvcmRsZW4oR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaF9udW0sIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgaSwgd2VpZ2h0X2lkeCA9IDAsIGRlbHRhLCBkaWZmLCBwb3MsIGRlbHRhX2JpdHMsIG1pbl92YWwsIGZsYWcsCisgICAgICAgIHJldCwgc3RhcnRfdmFsOworICAgIFZMQyAqdmxjX3RhYjsKKyAgICBBdHJhYzNwQ2hhblBhcmFtcyAqY2hhbiAgICAgPSAmY3R4LT5jaGFubmVsc1tjaF9udW1dOworICAgIEF0cmFjM3BDaGFuUGFyYW1zICpyZWZfY2hhbiA9ICZjdHgtPmNoYW5uZWxzWzBdOworCisgICAgY2hhbi0+ZmlsbF9tb2RlID0gMDsKKworICAgIHN3aXRjaCAoZ2V0X2JpdHMoZ2IsIDIpKSB7IC8qIHN3aXRjaCBhY2NvcmRpbmcgdG8gY29kaW5nIG1vZGUgKi8KKyAgICBjYXNlIDA6IC8qIGNvZGVkIHVzaW5nIGNvbnN0YW50IG51bWJlciBvZiBiaXRzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm51bV9xdWFudF91bml0czsgaSsrKQorICAgICAgICAgICAgY2hhbi0+cXVfd29yZGxlbltpXSA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoY2hfbnVtKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IG51bV9jb2RlZF91bml0cyhnYiwgY2hhbiwgY3R4LCBhdmN0eCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBpZiAoY2hhbi0+bnVtX2NvZGVkX3ZhbHMpIHsKKyAgICAgICAgICAgICAgICB2bGNfdGFiID0gJndsX3ZsY190YWJzW2dldF9iaXRzKGdiLCAyKV07CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbi0+bnVtX2NvZGVkX3ZhbHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGdldF92bGMyKGdiLCB2bGNfdGFiLT50YWJsZSwgdmxjX3RhYi0+Yml0cywgMSk7CisgICAgICAgICAgICAgICAgICAgIGNoYW4tPnF1X3dvcmRsZW5baV0gPSAocmVmX2NoYW4tPnF1X3dvcmRsZW5baV0gKyBkZWx0YSkgJiA3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdlaWdodF9pZHggPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICBpZiAoKHJldCA9IG51bV9jb2RlZF91bml0cyhnYiwgY2hhbiwgY3R4LCBhdmN0eCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBpZiAoY2hhbi0+bnVtX2NvZGVkX3ZhbHMpIHsKKyAgICAgICAgICAgICAgICBwb3MgPSBnZXRfYml0cyhnYiwgNSk7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA+IGNoYW4tPm51bV9jb2RlZF92YWxzKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIldMIG1vZGUgMTogaW52YWxpZCBwb3NpdGlvbiFcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWx0YV9iaXRzID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgICAgIG1pbl92YWwgICAgPSBnZXRfYml0cyhnYiwgMyk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9zOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGNoYW4tPnF1X3dvcmRsZW5baV0gPSBnZXRfYml0cyhnYiwgMyk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBwb3M7IGkgPCBjaGFuLT5udW1fY29kZWRfdmFsczsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjaGFuLT5xdV93b3JkbGVuW2ldID0gKG1pbl92YWwgKyBHRVRfREVMVEEoZ2IsIGRlbHRhX2JpdHMpKSAmIDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoKHJldCA9IG51bV9jb2RlZF91bml0cyhnYiwgY2hhbiwgY3R4LCBhdmN0eCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKGNoX251bSAmJiBjaGFuLT5udW1fY29kZWRfdmFscykgeworICAgICAgICAgICAgdmxjX3RhYiA9ICZ3bF92bGNfdGFic1tnZXRfYml0cyhnYiwgMildOworICAgICAgICAgICAgZGVsdGEgPSBnZXRfdmxjMihnYiwgdmxjX3RhYi0+dGFibGUsIHZsY190YWItPmJpdHMsIDEpOworICAgICAgICAgICAgY2hhbi0+cXVfd29yZGxlblswXSA9IChyZWZfY2hhbi0+cXVfd29yZGxlblswXSArIGRlbHRhKSAmIDc7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBjaGFuLT5udW1fY29kZWRfdmFsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGlmZiA9IHJlZl9jaGFuLT5xdV93b3JkbGVuW2ldIC0gcmVmX2NoYW4tPnF1X3dvcmRsZW5baSAtIDFdOworICAgICAgICAgICAgICAgIGRlbHRhID0gZ2V0X3ZsYzIoZ2IsIHZsY190YWItPnRhYmxlLCB2bGNfdGFiLT5iaXRzLCAxKTsKKyAgICAgICAgICAgICAgICBjaGFuLT5xdV93b3JkbGVuW2ldID0gKGNoYW4tPnF1X3dvcmRsZW5baSAtIDFdICsgZGlmZiArIGRlbHRhKSAmIDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2hhbi0+bnVtX2NvZGVkX3ZhbHMpIHsKKyAgICAgICAgICAgIGZsYWcgICAgPSBnZXRfYml0cyhnYiwgMSk7CisgICAgICAgICAgICB2bGNfdGFiID0gJndsX3ZsY190YWJzW2dldF9iaXRzKGdiLCAxKV07CisKKyAgICAgICAgICAgIHN0YXJ0X3ZhbCA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgICAgIHVucGFja192cV9zaGFwZShzdGFydF92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0cmFjM3Bfd2xfc2hhcGVzW3N0YXJ0X3ZhbF1bZ2V0X2JpdHMoZ2IsIDQpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLT5xdV93b3JkbGVuLCBjaGFuLT5udW1fY29kZWRfdmFscyk7CisKKyAgICAgICAgICAgIGlmICghZmxhZykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFuLT5udW1fY29kZWRfdmFsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gZ2V0X3ZsYzIoZ2IsIHZsY190YWItPnRhYmxlLCB2bGNfdGFiLT5iaXRzLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbi0+cXVfd29yZGxlbltpXSA9IChjaGFuLT5xdV93b3JkbGVuW2ldICsgZGVsdGEpICYgNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoY2hhbi0+bnVtX2NvZGVkX3ZhbHMgJiAtIDIpOyBpICs9IDIpCisgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbi0+cXVfd29yZGxlbltpXSAgICAgPSAoY2hhbi0+cXVfd29yZGxlbltpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmxjMihnYiwgdmxjX3RhYi0+dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bGNfdGFiLT5iaXRzLCAxKSkgJiA3OworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbi0+cXVfd29yZGxlbltpICsgMV0gPSAoY2hhbi0+cXVfd29yZGxlbltpICsgMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3ZsYzIoZ2IsIHZsY190YWItPnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxjX3RhYi0+Yml0cywgMSkpICYgNzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNoYW4tPm51bV9jb2RlZF92YWxzICYgMSkKKyAgICAgICAgICAgICAgICAgICAgY2hhbi0+cXVfd29yZGxlbltpXSA9IChjaGFuLT5xdV93b3JkbGVuW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmxjMihnYiwgdmxjX3RhYi0+dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxjX3RhYi0+Yml0cywgMSkpICYgNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIHdlaWdodF9pZHggPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIGlmICgocmV0ID0gbnVtX2NvZGVkX3VuaXRzKGdiLCBjaGFuLCBjdHgsIGF2Y3R4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAoY2hhbi0+bnVtX2NvZGVkX3ZhbHMpIHsKKyAgICAgICAgICAgIHZsY190YWIgPSAmd2xfdmxjX3RhYnNbZ2V0X2JpdHMoZ2IsIDIpXTsKKworICAgICAgICAgICAgLyogZmlyc3QgY29lZmZpY2llbnQgaXMgY29kZWQgZGlyZWN0bHkgKi8KKyAgICAgICAgICAgIGNoYW4tPnF1X3dvcmRsZW5bMF0gPSBnZXRfYml0cyhnYiwgMyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBjaGFuLT5udW1fY29kZWRfdmFsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBnZXRfdmxjMihnYiwgdmxjX3RhYi0+dGFibGUsIHZsY190YWItPmJpdHMsIDEpOworICAgICAgICAgICAgICAgIGNoYW4tPnF1X3dvcmRsZW5baV0gPSAoY2hhbi0+cXVfd29yZGxlbltpIC0gMV0gKyBkZWx0YSkgJiA3OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChjaGFuLT5maWxsX21vZGUgPT0gMikgeworICAgICAgICBmb3IgKGkgPSBjaGFuLT5udW1fY29kZWRfdmFsczsgaSA8IGN0eC0+bnVtX3F1YW50X3VuaXRzOyBpKyspCisgICAgICAgICAgICBjaGFuLT5xdV93b3JkbGVuW2ldID0gY2hfbnVtID8gZ2V0X2JpdHMxKGdiKSA6IDE7CisgICAgfSBlbHNlIGlmIChjaGFuLT5maWxsX21vZGUgPT0gMykgeworICAgICAgICBwb3MgPSBjaF9udW0gPyBjaGFuLT5udW1fY29kZWRfdmFscyArIGNoYW4tPnNwbGl0X3BvaW50CisgICAgICAgICAgICAgICAgICAgICA6IGN0eC0+bnVtX3F1YW50X3VuaXRzIC0gY2hhbi0+c3BsaXRfcG9pbnQ7CisgICAgICAgIGZvciAoaSA9IGNoYW4tPm51bV9jb2RlZF92YWxzOyBpIDwgcG9zOyBpKyspCisgICAgICAgICAgICBjaGFuLT5xdV93b3JkbGVuW2ldID0gMTsKKyAgICB9CisKKyAgICBpZiAod2VpZ2h0X2lkeCkKKyAgICAgICAgcmV0dXJuIGFkZF93b3JkbGVuX3dlaWdodHMoY3R4LCBjaGFuLCB3ZWlnaHRfaWR4LCBhdmN0eCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgc2NhbGUgZmFjdG9yIGluZGV4ZXMgZm9yIGVhY2ggcXVhbnQgdW5pdCBvZiBhIGNoYW5uZWwuCisgKgorICogQHBhcmFtW2luXSAgICAgZ2IgICAgICAgICAgICB0aGUgR2V0Qml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbixvdXRdIGN0eCAgICAgICAgICAgcHRyIHRvIHRoZSBjaGFubmVsIHVuaXQgY29udGV4dAorICogQHBhcmFtW2luXSAgICAgY2hfbnVtICAgICAgICBjaGFubmVsIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiByZXN1bHQgY29kZTogMCA9IE9LLCBvdGhlcndpc2UgLSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2NoYW5uZWxfc2ZfaWR4KEdldEJpdENvbnRleHQgKmdiLCBBdHJhYzNwQ2hhblVuaXRDdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaF9udW0sIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgaSwgd2VpZ2h0X2lkeCA9IDAsIGRlbHRhLCBkaWZmLCBudW1fbG9uZ192YWxzLAorICAgICAgICBkZWx0YV9iaXRzLCBtaW5fdmFsLCB2bGNfc2VsLCBzdGFydF92YWw7CisgICAgVkxDICp2bGNfdGFiOworICAgIEF0cmFjM3BDaGFuUGFyYW1zICpjaGFuICAgICA9ICZjdHgtPmNoYW5uZWxzW2NoX251bV07CisgICAgQXRyYWMzcENoYW5QYXJhbXMgKnJlZl9jaGFuID0gJmN0eC0+Y2hhbm5lbHNbMF07CisKKyAgICBzd2l0Y2ggKGdldF9iaXRzKGdiLCAyKSkgeyAvKiBzd2l0Y2ggYWNjb3JkaW5nIHRvIGNvZGluZyBtb2RlICovCisgICAgY2FzZSAwOiAvKiBjb2RlZCB1c2luZyBjb25zdGFudCBudW1iZXIgb2YgYml0cyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT51c2VkX3F1YW50X3VuaXRzOyBpKyspCisgICAgICAgICAgICBjaGFuLT5xdV9zZl9pZHhbaV0gPSBnZXRfYml0cyhnYiwgNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGNoX251bSkgeworICAgICAgICAgICAgdmxjX3RhYiA9ICZzZl92bGNfdGFic1tnZXRfYml0cyhnYiwgMildOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT51c2VkX3F1YW50X3VuaXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZWx0YSA9IGdldF92bGMyKGdiLCB2bGNfdGFiLT50YWJsZSwgdmxjX3RhYi0+Yml0cywgMSk7CisgICAgICAgICAgICAgICAgY2hhbi0+cXVfc2ZfaWR4W2ldID0gKHJlZl9jaGFuLT5xdV9zZl9pZHhbaV0gKyBkZWx0YSkgJiAweDNGOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2VpZ2h0X2lkeCA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgIGlmICh3ZWlnaHRfaWR4ID09IDMpIHsKKyAgICAgICAgICAgICAgICBVTlBBQ0tfU0ZfVlFfU0hBUEUoZ2IsIGNoYW4tPnF1X3NmX2lkeCwgY3R4LT51c2VkX3F1YW50X3VuaXRzKTsKKworICAgICAgICAgICAgICAgIG51bV9sb25nX3ZhbHMgPSBnZXRfYml0cyhnYiwgNSk7CisgICAgICAgICAgICAgICAgZGVsdGFfYml0cyAgICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgICAgICBtaW5fdmFsICAgICAgID0gZ2V0X2JpdHMoZ2IsIDQpIC0gNzsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbG9uZ192YWxzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGNoYW4tPnF1X3NmX2lkeFtpXSA9IChjaGFuLT5xdV9zZl9pZHhbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHMoZ2IsIDQpIC0gNykgJiAweDNGOworCisgICAgICAgICAgICAgICAgLyogYWxsIG90aGVycyBhcmU6IG1pbl92YWwgKyBkZWx0YSAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IG51bV9sb25nX3ZhbHM7IGkgPCBjdHgtPnVzZWRfcXVhbnRfdW5pdHM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgY2hhbi0+cXVfc2ZfaWR4W2ldID0gKGNoYW4tPnF1X3NmX2lkeFtpXSArIG1pbl92YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RFTFRBKGdiLCBkZWx0YV9iaXRzKSkgJiAweDNGOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBudW1fbG9uZ192YWxzID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgICAgICAgICAgICAgIGRlbHRhX2JpdHMgICAgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgICAgICAgICAgICAgbWluX3ZhbCAgICAgICA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICAgICAgICAgICAgICBpZiAobnVtX2xvbmdfdmFscyA+IGN0eC0+dXNlZF9xdWFudF91bml0cyB8fCBkZWx0YV9iaXRzID09IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0YgbW9kZSAxOiBpbnZhbGlkIHBhcmFtZXRlcnMhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogcmVhZCBmdWxsLXByZWNpc2lvbiBTRiBpbmRleGVzICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9sb25nX3ZhbHM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgY2hhbi0+cXVfc2ZfaWR4W2ldID0gZ2V0X2JpdHMoZ2IsIDYpOworCisgICAgICAgICAgICAgICAgLyogYWxsIG90aGVycyBhcmU6IG1pbl92YWwgKyBkZWx0YSAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IG51bV9sb25nX3ZhbHM7IGkgPCBjdHgtPnVzZWRfcXVhbnRfdW5pdHM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgY2hhbi0+cXVfc2ZfaWR4W2ldID0gKG1pbl92YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RFTFRBKGdiLCBkZWx0YV9iaXRzKSkgJiAweDNGOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGNoX251bSkgeworICAgICAgICAgICAgdmxjX3RhYiA9ICZzZl92bGNfdGFic1tnZXRfYml0cyhnYiwgMildOworCisgICAgICAgICAgICBkZWx0YSA9IGdldF92bGMyKGdiLCB2bGNfdGFiLT50YWJsZSwgdmxjX3RhYi0+Yml0cywgMSk7CisgICAgICAgICAgICBjaGFuLT5xdV9zZl9pZHhbMF0gPSAocmVmX2NoYW4tPnF1X3NmX2lkeFswXSArIGRlbHRhKSAmIDB4M0Y7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBjdHgtPnVzZWRfcXVhbnRfdW5pdHM7IGkrKykgeworICAgICAgICAgICAgICAgIGRpZmYgID0gcmVmX2NoYW4tPnF1X3NmX2lkeFtpXSAtIHJlZl9jaGFuLT5xdV9zZl9pZHhbaSAtIDFdOworICAgICAgICAgICAgICAgIGRlbHRhID0gZ2V0X3ZsYzIoZ2IsIHZsY190YWItPnRhYmxlLCB2bGNfdGFiLT5iaXRzLCAxKTsKKyAgICAgICAgICAgICAgICBjaGFuLT5xdV9zZl9pZHhbaV0gPSAoY2hhbi0+cXVfc2ZfaWR4W2kgLSAxXSArIGRpZmYgKyBkZWx0YSkgJiAweDNGOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmxjX3RhYiA9ICZzZl92bGNfdGFic1tnZXRfYml0cyhnYiwgMikgKyA0XTsKKworICAgICAgICAgICAgVU5QQUNLX1NGX1ZRX1NIQVBFKGdiLCBjaGFuLT5xdV9zZl9pZHgsIGN0eC0+dXNlZF9xdWFudF91bml0cyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPnVzZWRfcXVhbnRfdW5pdHM7IGkrKykgeworICAgICAgICAgICAgICAgIGRlbHRhID0gZ2V0X3ZsYzIoZ2IsIHZsY190YWItPnRhYmxlLCB2bGNfdGFiLT5iaXRzLCAxKTsKKyAgICAgICAgICAgICAgICBjaGFuLT5xdV9zZl9pZHhbaV0gPSAoY2hhbi0+cXVfc2ZfaWR4W2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbl9leHRlbmQoZGVsdGEsIDQpKSAmIDB4M0Y7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBpZiAoY2hfbnVtKSB7CisgICAgICAgICAgICAvKiBjb3B5IGNvZWZmaWNpZW50cyBmcm9tIHJlZmVyZW5jZSBjaGFubmVsICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT51c2VkX3F1YW50X3VuaXRzOyBpKyspCisgICAgICAgICAgICAgICAgY2hhbi0+cXVfc2ZfaWR4W2ldID0gcmVmX2NoYW4tPnF1X3NmX2lkeFtpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdlaWdodF9pZHggPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICB2bGNfc2VsICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgdmxjX3RhYiAgICA9ICZzZl92bGNfdGFic1t2bGNfc2VsXTsKKworICAgICAgICAgICAgaWYgKHdlaWdodF9pZHggPT0gMykgeworICAgICAgICAgICAgICAgIHZsY190YWIgPSAmc2ZfdmxjX3RhYnNbdmxjX3NlbCArIDRdOworCisgICAgICAgICAgICAgICAgVU5QQUNLX1NGX1ZRX1NIQVBFKGdiLCBjaGFuLT5xdV9zZl9pZHgsIGN0eC0+dXNlZF9xdWFudF91bml0cyk7CisKKyAgICAgICAgICAgICAgICBkaWZmICAgICAgICAgICAgICAgPSAoZ2V0X2JpdHMoZ2IsIDQpICAgICsgNTYpICAgJiAweDNGOworICAgICAgICAgICAgICAgIGNoYW4tPnF1X3NmX2lkeFswXSA9IChjaGFuLT5xdV9zZl9pZHhbMF0gKyBkaWZmKSAmIDB4M0Y7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgY3R4LT51c2VkX3F1YW50X3VuaXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBnZXRfdmxjMihnYiwgdmxjX3RhYi0+dGFibGUsIHZsY190YWItPmJpdHMsIDEpOworICAgICAgICAgICAgICAgICAgICBkaWZmICAgICAgICAgICAgICAgPSAoZGlmZiArIHNpZ25fZXh0ZW5kKGRlbHRhLCA0KSkgJiAweDNGOworICAgICAgICAgICAgICAgICAgICBjaGFuLT5xdV9zZl9pZHhbaV0gPSAoZGlmZiArIGNoYW4tPnF1X3NmX2lkeFtpXSkgICAgJiAweDNGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogMXN0IGNvZWZmaWNpZW50IGlzIGNvZGVkIGRpcmVjdGx5ICovCisgICAgICAgICAgICAgICAgY2hhbi0+cXVfc2ZfaWR4WzBdID0gZ2V0X2JpdHMoZ2IsIDYpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGN0eC0+dXNlZF9xdWFudF91bml0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gZ2V0X3ZsYzIoZ2IsIHZsY190YWItPnRhYmxlLCB2bGNfdGFiLT5iaXRzLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbi0+cXVfc2ZfaWR4W2ldID0gKGNoYW4tPnF1X3NmX2lkeFtpIC0gMV0gKyBkZWx0YSkgJiAweDNGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAod2VpZ2h0X2lkeCAmJiB3ZWlnaHRfaWR4IDwgMykKKyAgICAgICAgcmV0dXJuIHN1YnRyYWN0X3NmX3dlaWdodHMoY3R4LCBjaGFuLCB3ZWlnaHRfaWR4LCBhdmN0eCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgd29yZCBsZW5ndGggaW5mb3JtYXRpb24gZm9yIGVhY2ggY2hhbm5lbC4KKyAqCisgKiBAcGFyYW1baW5dICAgICBnYiAgICAgICAgICAgIHRoZSBHZXRCaXQgY29udGV4dAorICogQHBhcmFtW2luLG91dF0gY3R4ICAgICAgICAgICBwdHIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgICBudW1fY2hhbm5lbHMgIG51bWJlciBvZiBjaGFubmVscyB0byBwcm9jZXNzCisgKiBAcGFyYW1baW5dICAgICBhdmN0eCAgICAgICAgIHB0ciB0byB0aGUgQVZDb2RlY0NvbnRleHQKKyAqIEByZXR1cm4gcmVzdWx0IGNvZGU6IDAgPSBPSywgb3RoZXJ3aXNlIC0gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGRlY29kZV9xdWFudF93b3JkbGVuKEdldEJpdENvbnRleHQgKmdiLCBBdHJhYzNwQ2hhblVuaXRDdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jaGFubmVscywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBjaF9udW0sIGksIHJldDsKKworICAgIGZvciAoY2hfbnVtID0gMDsgY2hfbnVtIDwgbnVtX2NoYW5uZWxzOyBjaF9udW0rKykgeworICAgICAgICBtZW1zZXQoY3R4LT5jaGFubmVsc1tjaF9udW1dLnF1X3dvcmRsZW4sIDAsCisgICAgICAgICAgICAgICBzaXplb2YoY3R4LT5jaGFubmVsc1tjaF9udW1dLnF1X3dvcmRsZW4pKTsKKworICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9jaGFubmVsX3dvcmRsZW4oZ2IsIGN0eCwgY2hfbnVtLCBhdmN0eCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogc2NhbiBmb3IgbGFzdCBub24temVybyBjb2VmZiBpbiBib3RoIGNoYW5uZWxzIGFuZAorICAgICAqIHNldCBudW1iZXIgb2YgcXVhbnQgdW5pdHMgaGF2aW5nIGNvZGVkIHNwZWN0cnVtICovCisgICAgZm9yIChpID0gY3R4LT5udW1fcXVhbnRfdW5pdHMgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgaWYgKGN0eC0+Y2hhbm5lbHNbMF0ucXVfd29yZGxlbltpXSB8fAorICAgICAgICAgICAgKG51bV9jaGFubmVscyA9PSAyICYmIGN0eC0+Y2hhbm5lbHNbMV0ucXVfd29yZGxlbltpXSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBjdHgtPnVzZWRfcXVhbnRfdW5pdHMgPSBpICsgMTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSBzY2FsZSBmYWN0b3IgaW5kZXhlcyBmb3IgZWFjaCBjaGFubmVsLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCB1bml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIG51bV9jaGFubmVscyAgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiByZXN1bHQgY29kZTogMCA9IE9LLCBvdGhlcndpc2UgLSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3NjYWxlX2ZhY3RvcnMoR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGNoX251bSwgcmV0OworCisgICAgaWYgKCFjdHgtPnVzZWRfcXVhbnRfdW5pdHMpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChjaF9udW0gPSAwOyBjaF9udW0gPCBudW1fY2hhbm5lbHM7IGNoX251bSsrKSB7CisgICAgICAgIG1lbXNldChjdHgtPmNoYW5uZWxzW2NoX251bV0ucXVfc2ZfaWR4LCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKGN0eC0+Y2hhbm5lbHNbY2hfbnVtXS5xdV9zZl9pZHgpKTsKKworICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9jaGFubmVsX3NmX2lkeChnYiwgY3R4LCBjaF9udW0sIGF2Y3R4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgbnVtYmVyIG9mIGNvZGUgdGFibGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCB1bml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiByZXN1bHQgY29kZTogMCA9IE9LLCBvdGhlcndpc2UgLSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZ2V0X251bV9jdF92YWx1ZXMoR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IG51bV9jb2RlZF92YWxzOworCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgbnVtX2NvZGVkX3ZhbHMgPSBnZXRfYml0cyhnYiwgNSk7CisgICAgICAgIGlmIChudW1fY29kZWRfdmFscyA+IGN0eC0+dXNlZF9xdWFudF91bml0cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIGNvZGUgdGFibGUgaW5kZXhlczogJWQhXG4iLCBudW1fY29kZWRfdmFscyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVtX2NvZGVkX3ZhbHM7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBjdHgtPnVzZWRfcXVhbnRfdW5pdHM7Cit9CisKKyNkZWZpbmUgREVDX0NUX0lEWF9DT01NT04oT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBudW1fdmFscyA9IGdldF9udW1fY3RfdmFsdWVzKGdiLCBjdHgsIGF2Y3R4KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobnVtX3ZhbHMgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG51bV92YWxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbHM7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGNoYW4tPnF1X3dvcmRsZW5baV0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNoYW4tPnF1X3RhYl9pZHhbaV0gPSBPUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIGlmIChjaF9udW0gJiYgcmVmX2NoYW4tPnF1X3dvcmRsZW5baV0pICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIGdldCBjbG9uZSBtYXN0ZXIgZmxhZyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNoYW4tPnF1X3RhYl9pZHhbaV0gPSBnZXRfYml0czEoZ2IpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgQ09ESU5HX0RJUkVDVCBnZXRfYml0cyhnYiwgbnVtX2JpdHMpCisKKyNkZWZpbmUgQ09ESU5HX1ZMQyBnZXRfdmxjMihnYiwgdmxjX3RhYi0+dGFibGUsIHZsY190YWItPmJpdHMsIDEpCisKKyNkZWZpbmUgQ09ESU5HX1ZMQ19ERUxUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoIWkpID8gQ09ESU5HX1ZMQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIDogKHByZWQgKyBnZXRfdmxjMihnYiwgZGVsdGFfdmxjLT50YWJsZSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YV92bGMtPmJpdHMsIDEpKSAmIG1hc2s7ICAgICAgICAgICAgICAgIFwKKyAgICBwcmVkID0gY2hhbi0+cXVfdGFiX2lkeFtpXQorCisjZGVmaW5lIENPRElOR19WTENfRElGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHJlZl9jaGFuLT5xdV90YWJfaWR4W2ldICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGdldF92bGMyKGdiLCB2bGNfdGFiLT50YWJsZSwgdmxjX3RhYi0+Yml0cywgMSkpICYgbWFzaworCisvKioKKyAqIERlY29kZSBjb2RlIHRhYmxlIGluZGV4ZXMgZm9yIGVhY2ggcXVhbnQgdW5pdCBvZiBhIGNoYW5uZWwuCisgKgorICogQHBhcmFtW2luXSAgICAgZ2IgICAgICAgICAgICB0aGUgR2V0Qml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbixvdXRdIGN0eCAgICAgICAgICAgcHRyIHRvIHRoZSBjaGFubmVsIHVuaXQgY29udGV4dAorICogQHBhcmFtW2luXSAgICAgY2hfbnVtICAgICAgICBjaGFubmVsIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiByZXN1bHQgY29kZTogMCA9IE9LLCBvdGhlcndpc2UgLSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2NoYW5uZWxfY29kZV90YWIoR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hfbnVtLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGksIG51bV92YWxzLCBudW1fYml0cywgcHJlZDsKKyAgICBpbnQgbWFzayA9IGN0eC0+dXNlX2Z1bGxfdGFibGUgPyA3IDogMzsgLyogbWFzayBmb3IgbW9kdWxhciBhcml0aG1ldGljICovCisgICAgVkxDICp2bGNfdGFiLCAqZGVsdGFfdmxjOworICAgIEF0cmFjM3BDaGFuUGFyYW1zICpjaGFuICAgICA9ICZjdHgtPmNoYW5uZWxzW2NoX251bV07CisgICAgQXRyYWMzcENoYW5QYXJhbXMgKnJlZl9jaGFuID0gJmN0eC0+Y2hhbm5lbHNbMF07CisKKyAgICBjaGFuLT50YWJsZV90eXBlID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIHN3aXRjaCAoZ2V0X2JpdHMoZ2IsIDIpKSB7IC8qIHN3aXRjaCBhY2NvcmRpbmcgdG8gY29kaW5nIG1vZGUgKi8KKyAgICBjYXNlIDA6IC8qIGRpcmVjdGx5IGNvZGVkICovCisgICAgICAgIG51bV9iaXRzID0gY3R4LT51c2VfZnVsbF90YWJsZSArIDI7CisgICAgICAgIERFQ19DVF9JRFhfQ09NTU9OKENPRElOR19ESVJFQ1QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIGVudHJvcHktY29kZWQgKi8KKyAgICAgICAgdmxjX3RhYiA9IGN0eC0+dXNlX2Z1bGxfdGFibGUgPyAmY3RfdmxjX3RhYnNbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdF92bGNfdGFiczsKKyAgICAgICAgREVDX0NUX0lEWF9DT01NT04oQ09ESU5HX1ZMQyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjogLyogZW50cm9weS1jb2RlZCBkZWx0YSAqLworICAgICAgICBpZiAoY3R4LT51c2VfZnVsbF90YWJsZSkgeworICAgICAgICAgICAgdmxjX3RhYiAgID0gJmN0X3ZsY190YWJzWzFdOworICAgICAgICAgICAgZGVsdGFfdmxjID0gJmN0X3ZsY190YWJzWzJdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmxjX3RhYiAgID0gY3RfdmxjX3RhYnM7CisgICAgICAgICAgICBkZWx0YV92bGMgPSBjdF92bGNfdGFiczsKKyAgICAgICAgfQorICAgICAgICBwcmVkID0gMDsKKyAgICAgICAgREVDX0NUX0lEWF9DT01NT04oQ09ESU5HX1ZMQ19ERUxUQSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLyogZW50cm9weS1jb2RlZCBkaWZmZXJlbmNlIHRvIG1hc3RlciAqLworICAgICAgICBpZiAoY2hfbnVtKSB7CisgICAgICAgICAgICB2bGNfdGFiID0gY3R4LT51c2VfZnVsbF90YWJsZSA/ICZjdF92bGNfdGFic1szXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdF92bGNfdGFiczsKKyAgICAgICAgICAgIERFQ19DVF9JRFhfQ09NTU9OKENPRElOR19WTENfRElGRik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVjb2RlIGNvZGUgdGFibGUgaW5kZXhlcyBmb3IgZWFjaCBjaGFubmVsLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCB1bml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIG51bV9jaGFubmVscyAgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiByZXN1bHQgY29kZTogMCA9IE9LLCBvdGhlcndpc2UgLSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2NvZGVfdGFibGVfaW5kZXhlcyhHZXRCaXRDb250ZXh0ICpnYiwgQXRyYWMzcENoYW5Vbml0Q3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jaGFubmVscywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBjaF9udW0sIHJldDsKKworICAgIGlmICghY3R4LT51c2VkX3F1YW50X3VuaXRzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGN0eC0+dXNlX2Z1bGxfdGFibGUgPSBnZXRfYml0czEoZ2IpOworCisgICAgZm9yIChjaF9udW0gPSAwOyBjaF9udW0gPCBudW1fY2hhbm5lbHM7IGNoX251bSsrKSB7CisgICAgICAgIG1lbXNldChjdHgtPmNoYW5uZWxzW2NoX251bV0ucXVfdGFiX2lkeCwgMCwKKyAgICAgICAgICAgICAgIHNpemVvZihjdHgtPmNoYW5uZWxzW2NoX251bV0ucXVfdGFiX2lkeCkpOworCisgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2NoYW5uZWxfY29kZV90YWIoZ2IsIGN0eCwgY2hfbnVtLCBhdmN0eCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVjb2RlIGh1ZmZtYW4tY29kZWQgc3BlY3RyYWwgbGluZXMgZm9yIGEgZ2l2ZW4gcXVhbnQgdW5pdC4KKyAqCisgKiBUaGlzIGlzIGEgZ2VuZXJhbGl6ZWQgdmVyc2lvbiBmb3IgYWxsIGtub3duIGNvZGluZyBtb2Rlcy4KKyAqIEl0cyBzcGVlZCBjYW4gYmUgaW1wcm92ZWQgYnkgY3JlYXRpbmcgc2VwYXJhdGUgZnVuY3Rpb25zIGZvciBlYWNoIG1vZGUuCisgKgorICogQHBhcmFtW2luXSAgIGdiICAgICAgICAgIHRoZSBHZXRCaXQgY29udGV4dAorICogQHBhcmFtW2luXSAgIHRhYiAgICAgICAgIGNvZGUgdGFibGUgdGVsbGluZyBob3cgdG8gZGVjb2RlIHNwZWN0cmFsIGxpbmVzCisgKiBAcGFyYW1baW5dICAgdmxjX3RhYiAgICAgcHRyIHRvIHRoZSBodWZmbWFuIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29kZSB0YWJsZQorICogQHBhcmFtW291dF0gIG91dCAgICAgICAgIHBvaW50ZXIgdG8gYnVmZmVyIHdoZXJlIGRlY29kZWQgZGF0YSBzaG91bGQgYmUgc3RvcmVkCisgKiBAcGFyYW1baW5dICAgbnVtX3NwZWNzICAgbnVtYmVyIG9mIHNwZWN0cmFsIGxpbmVzIHRvIGRlY29kZQorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfcXVfc3BlY3RyYShHZXRCaXRDb250ZXh0ICpnYiwgY29uc3QgQXRyYWMzcFNwZWNDb2RlVGFiICp0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEMgKnZsY190YWIsIGludDE2X3QgKm91dCwgY29uc3QgaW50IG51bV9zcGVjcykKK3sKKyAgICBpbnQgaSwgaiwgcG9zLCBjZjsKKyAgICBpbnQgZ3JvdXBfc2l6ZSA9IHRhYi0+Z3JvdXBfc2l6ZTsKKyAgICBpbnQgbnVtX2NvZWZmcyA9IHRhYi0+bnVtX2NvZWZmczsKKyAgICBpbnQgYml0cyAgICAgICA9IHRhYi0+Yml0czsKKyAgICBpbnQgaXNfc2lnbmVkICA9IHRhYi0+aXNfc2lnbmVkOworICAgIHVuc2lnbmVkIHZhbCwgbWFzayA9ICgxIDw8IGJpdHMpIC0gMTsKKworICAgIGZvciAocG9zID0gMDsgcG9zIDwgbnVtX3NwZWNzOykgeworICAgICAgICBpZiAoZ3JvdXBfc2l6ZSA9PSAxIHx8IGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBncm91cF9zaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICB2YWwgPSBnZXRfdmxjMihnYiwgdmxjX3RhYi0+dGFibGUsIHZsY190YWItPmJpdHMsIDEpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb2VmZnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjZiA9IHZhbCAmIG1hc2s7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc19zaWduZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBjZiA9IHNpZ25fZXh0ZW5kKGNmLCBiaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2YgJiYgZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNmID0gLWNmOworCisgICAgICAgICAgICAgICAgICAgIG91dFtwb3MrK10gPSBjZjsKKyAgICAgICAgICAgICAgICAgICAgdmFsICAgICAgPj49IGJpdHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgLyogZ3JvdXAgc2tpcHBlZCAqLworICAgICAgICAgICAgcG9zICs9IGdyb3VwX3NpemUgKiBudW1fY29lZmZzOworICAgIH0KK30KKworLyoqCisgKiBEZWNvZGUgaHVmZm1hbi1jb2RlZCBJTURDVCBzcGVjdHJ1bSBmb3IgYWxsIGNoYW5uZWxzLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCB1bml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIG51bV9jaGFubmVscyAgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfc3BlY3RydW0oR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgaSwgY2hfbnVtLCBxdSwgd29yZGxlbiwgY29kZXRhYiwgdGFiX2luZGV4LCBudW1fc3BlY3M7CisgICAgY29uc3QgQXRyYWMzcFNwZWNDb2RlVGFiICp0YWI7CisgICAgQXRyYWMzcENoYW5QYXJhbXMgKmNoYW47CisKKyAgICBmb3IgKGNoX251bSA9IDA7IGNoX251bSA8IG51bV9jaGFubmVsczsgY2hfbnVtKyspIHsKKyAgICAgICAgY2hhbiA9ICZjdHgtPmNoYW5uZWxzW2NoX251bV07CisKKyAgICAgICAgbWVtc2V0KGNoYW4tPnNwZWN0cnVtLCAwLCBzaXplb2YoY2hhbi0+c3BlY3RydW0pKTsKKworICAgICAgICAvKiBzZXQgcG93ZXIgY29tcGVuc2F0aW9uIGxldmVsIHRvIGRpc2FibGVkICovCisgICAgICAgIG1lbXNldChjaGFuLT5wb3dlcl9sZXZzLCBBVFJBQzNQX1BPV0VSX0NPTVBfT0ZGLCBzaXplb2YoY2hhbi0+cG93ZXJfbGV2cykpOworCisgICAgICAgIGZvciAocXUgPSAwOyBxdSA8IGN0eC0+dXNlZF9xdWFudF91bml0czsgcXUrKykgeworICAgICAgICAgICAgbnVtX3NwZWNzID0gZmZfYXRyYWMzcF9xdV90b19zcGVjX3Bvc1txdSArIDFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX2F0cmFjM3BfcXVfdG9fc3BlY19wb3NbcXVdOworCisgICAgICAgICAgICB3b3JkbGVuID0gY2hhbi0+cXVfd29yZGxlbltxdV07CisgICAgICAgICAgICBjb2RldGFiID0gY2hhbi0+cXVfdGFiX2lkeFtxdV07CisgICAgICAgICAgICBpZiAod29yZGxlbikgeworICAgICAgICAgICAgICAgIGlmICghY3R4LT51c2VfZnVsbF90YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgY29kZXRhYiA9IGF0cmFjM3BfY3RfcmVzdHJpY3RlZF90b19mdWxsW2NoYW4tPnRhYmxlX3R5cGVdW3dvcmRsZW4gLSAxXVtjb2RldGFiXTsKKworICAgICAgICAgICAgICAgIHRhYl9pbmRleCA9IChjaGFuLT50YWJsZV90eXBlICogOCArIGNvZGV0YWIpICogNyArIHdvcmRsZW4gLSAxOworICAgICAgICAgICAgICAgIHRhYiAgICAgICA9ICZhdHJhYzNwX3NwZWN0cmFfdGFic1t0YWJfaW5kZXhdOworCisgICAgICAgICAgICAgICAgLyogdGhpcyBhbGxvd3MgcmV1c2luZyBWTEMgdGFibGVzICovCisgICAgICAgICAgICAgICAgaWYgKHRhYi0+cmVkaXJlY3QgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGFiX2luZGV4ID0gdGFiLT5yZWRpcmVjdDsKKworICAgICAgICAgICAgICAgIGRlY29kZV9xdV9zcGVjdHJhKGdiLCB0YWIsICZzcGVjX3ZsY190YWJzW3RhYl9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW4tPnNwZWN0cnVtW2ZmX2F0cmFjM3BfcXVfdG9fc3BlY19wb3NbcXVdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc3BlY3MpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaF9udW0gJiYgY3R4LT5jaGFubmVsc1swXS5xdV93b3JkbGVuW3F1XSAmJiAhY29kZXRhYikgeworICAgICAgICAgICAgICAgIC8qIGNvcHkgY29lZmZpY2llbnRzIGZyb20gbWFzdGVyICovCisgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFuLT5zcGVjdHJ1bVtmZl9hdHJhYzNwX3F1X3RvX3NwZWNfcG9zW3F1XV0sCisgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPmNoYW5uZWxzWzBdLnNwZWN0cnVtW2ZmX2F0cmFjM3BfcXVfdG9fc3BlY19wb3NbcXVdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnVtX3NwZWNzICoKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYW4tPnNwZWN0cnVtW2ZmX2F0cmFjM3BfcXVfdG9fc3BlY19wb3NbcXVdXSkpOworICAgICAgICAgICAgICAgIGNoYW4tPnF1X3dvcmRsZW5bcXVdID0gY3R4LT5jaGFubmVsc1swXS5xdV93b3JkbGVuW3F1XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFBvd2VyIGNvbXBlbnNhdGlvbiBsZXZlbHMgb25seSBwcmVzZW50IGluIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgICogaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAyIHF1YW50IHVuaXRzLiBUaGUgbG93ZXN0IHR3byB1bml0cworICAgICAgICAgKiBjb3JyZXNwb25kIHRvIHRoZSBmcmVxdWVuY2llcyAwLi4uMzUxIEh6LCB3aG9zZSBzaG91bGRuJ3QKKyAgICAgICAgICogYmUgYWZmZWN0ZWQgYnkgdGhlIHBvd2VyIGNvbXBlbnNhdGlvbi4gKi8KKyAgICAgICAgaWYgKGN0eC0+dXNlZF9xdWFudF91bml0cyA+IDIpIHsKKyAgICAgICAgICAgIG51bV9zcGVjcyA9IGF0cmFjM3Bfc3ViYmFuZF90b19udW1fcG93Z3Jwc1tjdHgtPm51bV9jb2RlZF9zdWJiYW5kcyAtIDFdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9zcGVjczsgaSsrKQorICAgICAgICAgICAgICAgIGNoYW4tPnBvd2VyX2xldnNbaV0gPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogUmV0cmlldmUgc3BlY2lmaWVkIGFtb3VudCBvZiBmbGFnIGJpdHMgZnJvbSB0aGUgaW5wdXQgYml0c3RyZWFtLgorICogVGhlIGRhdGEgY2FuIGJlIHNob3J0ZW5lZCBpbiB0aGUgY2FzZSBvZiB0aGUgZm9sbG93aW5nIHR3byBjb21tb24gY29uZGl0aW9uczoKKyAqIGlmIGFsbCBiaXRzIGFyZSB6ZXJvIHRoZW4gb25seSBvbmUgc2lnbmFsIGJpdCA9IDAgd2lsbCBiZSBzdG9yZWQsCisgKiBpZiBhbGwgYml0cyBhcmUgb25lcyB0aGVuIHR3byBzaWduYWwgYml0cyA9IDEsMCB3aWxsIGJlIHN0b3JlZC4KKyAqIE90aGVyd2lzZSwgYWxsIG5lY2Vzc2FyeSBiaXRzIHdpbGwgYmUgZGlyZWN0bHkgc3RvcmVkCisgKiBwcmVmaXhlZCBieSB0d28gc2lnbmFsIGJpdHMgPSAxLDEuCisgKgorICogQHBhcmFtW2luXSAgIGdiICAgICAgICAgICAgICBwdHIgdG8gdGhlIEdldEJpdENvbnRleHQKKyAqIEBwYXJhbVtvdXRdICBvdXQgICAgICAgICAgICAgd2hlcmUgdG8gcGxhY2UgZGVjb2RlZCBmbGFncworICogQHBhcmFtW2luXSAgIG51bV9mbGFncyAgICAgICBudW1iZXIgb2YgZmxhZ3MgdG8gcHJvY2VzcworICogQHJldHVybjogMCA9IGFsbCBmbGFnIGJpdHMgYXJlIHplcm8sIDEgPSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgbm9uLXplcm8gZmxhZyBiaXQKKyAqLworc3RhdGljIGludCBnZXRfc3ViYmFuZF9mbGFncyhHZXRCaXRDb250ZXh0ICpnYiwgdWludDhfdCAqb3V0LCBpbnQgbnVtX2ZsYWdzKQoreworICAgIGludCBpLCByZXN1bHQ7CisKKyAgICBtZW1zZXQob3V0LCAwLCBudW1fZmxhZ3MpOworCisgICAgcmVzdWx0ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9mbGFnczsgaSsrKQorICAgICAgICAgICAgICAgIG91dFtpXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1lbXNldChvdXQsIDEsIG51bV9mbGFncyk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBEZWNvZGUgbWRjdCB3aW5kb3cgc2hhcGUgZmxhZ3MgZm9yIGFsbCBjaGFubmVscy4KKyAqCisgKiBAcGFyYW1baW5dICAgICBnYiAgICAgICAgICAgIHRoZSBHZXRCaXQgY29udGV4dAorICogQHBhcmFtW2luLG91dF0gY3R4ICAgICAgICAgICBwdHIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgICBudW1fY2hhbm5lbHMgIG51bWJlciBvZiBjaGFubmVscyB0byBwcm9jZXNzCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV93aW5kb3dfc2hhcGUoR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzKQoreworICAgIGludCBjaF9udW07CisKKyAgICBmb3IgKGNoX251bSA9IDA7IGNoX251bSA8IG51bV9jaGFubmVsczsgY2hfbnVtKyspCisgICAgICAgIGdldF9zdWJiYW5kX2ZsYWdzKGdiLCBjdHgtPmNoYW5uZWxzW2NoX251bV0ud25kX3NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm51bV9zdWJiYW5kcyk7Cit9CisKKy8qKgorICogRGVjb2RlIG51bWJlciBvZiBnYWluIGNvbnRyb2wgcG9pbnRzLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgICB0aGUgR2V0Qml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbixvdXRdIGN0eCAgICAgICAgICAgICBwdHIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgICBjaF9udW0gICAgICAgICAgY2hhbm5lbCB0byBwcm9jZXNzCisgKiBAcGFyYW1baW5dICAgICBjb2RlZF9zdWJiYW5kcyAgbnVtYmVyIG9mIHN1YmJhbmRzIHRvIHByb2Nlc3MKKyAqIEByZXR1cm4gcmVzdWx0IGNvZGU6IDAgPSBPSywgb3RoZXJ3aXNlIC0gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGRlY29kZV9nYWluY19ucG9pbnRzKEdldEJpdENvbnRleHQgKmdiLCBBdHJhYzNwQ2hhblVuaXRDdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoX251bSwgaW50IGNvZGVkX3N1YmJhbmRzKQoreworICAgIGludCBpLCBkZWx0YSwgZGVsdGFfYml0cywgbWluX3ZhbDsKKyAgICBBdHJhYzNwQ2hhblBhcmFtcyAqY2hhbiAgICAgPSAmY3R4LT5jaGFubmVsc1tjaF9udW1dOworICAgIEF0cmFjM3BDaGFuUGFyYW1zICpyZWZfY2hhbiA9ICZjdHgtPmNoYW5uZWxzWzBdOworCisgICAgc3dpdGNoIChnZXRfYml0cyhnYiwgMikpIHsgLyogc3dpdGNoIGFjY29yZGluZyB0byBjb2RpbmcgbW9kZSAqLworICAgIGNhc2UgMDogLyogZml4ZWQtbGVuZ3RoIGNvZGluZyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29kZWRfc3ViYmFuZHM7IGkrKykKKyAgICAgICAgICAgIGNoYW4tPmdhaW5fZGF0YVtpXS5udW1fcG9pbnRzID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIHZhcmlhYmxlLWxlbmd0aCBjb2RpbmcgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvZGVkX3N1YmJhbmRzOyBpKyspCisgICAgICAgICAgICBjaGFuLT5nYWluX2RhdGFbaV0ubnVtX3BvaW50cyA9CisgICAgICAgICAgICAgICAgZ2V0X3ZsYzIoZ2IsIGdhaW5fdmxjX3RhYnNbMF0udGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl92bGNfdGFic1swXS5iaXRzLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoY2hfbnVtKSB7IC8qIFZMQyBtb2R1bG8gZGVsdGEgdG8gbWFzdGVyIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2RlZF9zdWJiYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBnZXRfdmxjMihnYiwgZ2Fpbl92bGNfdGFic1sxXS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5fdmxjX3RhYnNbMV0uYml0cywgMSk7CisgICAgICAgICAgICAgICAgY2hhbi0+Z2Fpbl9kYXRhW2ldLm51bV9wb2ludHMgPQorICAgICAgICAgICAgICAgICAgICAocmVmX2NoYW4tPmdhaW5fZGF0YVtpXS5udW1fcG9pbnRzICsgZGVsdGEpICYgNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLyogVkxDIG1vZHVsbyBkZWx0YSB0byBwcmV2aW91cyAqLworICAgICAgICAgICAgY2hhbi0+Z2Fpbl9kYXRhWzBdLm51bV9wb2ludHMgPQorICAgICAgICAgICAgICAgIGdldF92bGMyKGdiLCBnYWluX3ZsY190YWJzWzBdLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5fdmxjX3RhYnNbMF0uYml0cywgMSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBjb2RlZF9zdWJiYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBnZXRfdmxjMihnYiwgZ2Fpbl92bGNfdGFic1sxXS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5fdmxjX3RhYnNbMV0uYml0cywgMSk7CisgICAgICAgICAgICAgICAgY2hhbi0+Z2Fpbl9kYXRhW2ldLm51bV9wb2ludHMgPQorICAgICAgICAgICAgICAgICAgICAoY2hhbi0+Z2Fpbl9kYXRhW2kgLSAxXS5udW1fcG9pbnRzICsgZGVsdGEpICYgNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGlmIChjaF9udW0pIHsgLyogY29weSBkYXRhIGZyb20gbWFzdGVyIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2RlZF9zdWJiYW5kczsgaSsrKQorICAgICAgICAgICAgICAgIGNoYW4tPmdhaW5fZGF0YVtpXS5udW1fcG9pbnRzID0KKyAgICAgICAgICAgICAgICAgICAgcmVmX2NoYW4tPmdhaW5fZGF0YVtpXS5udW1fcG9pbnRzOworICAgICAgICB9IGVsc2UgeyAvKiBzaG9ydGVyIGRlbHRhIHRvIG1pbiAqLworICAgICAgICAgICAgZGVsdGFfYml0cyA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgIG1pbl92YWwgICAgPSBnZXRfYml0cyhnYiwgMyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2RlZF9zdWJiYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2hhbi0+Z2Fpbl9kYXRhW2ldLm51bV9wb2ludHMgPSBtaW5fdmFsICsgR0VUX0RFTFRBKGdiLCBkZWx0YV9iaXRzKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbi0+Z2Fpbl9kYXRhW2ldLm51bV9wb2ludHMgPiA3KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEltcGxlbWVudHMgY29kaW5nIG1vZGUgMyAoc2xhdmUpIGZvciBnYWluIGNvbXBlbnNhdGlvbiBsZXZlbHMuCisgKgorICogQHBhcmFtW291dF0gICBkc3QgICBwdHIgdG8gdGhlIG91dHB1dCBhcnJheQorICogQHBhcmFtW2luXSAgICByZWYgICBwdHIgdG8gdGhlIHJlZmVyZW5jZSBjaGFubmVsCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnYWluY19sZXZlbF9tb2RlM3MoQXRyYWNHYWluSW5mbyAqZHN0LCBBdHJhY0dhaW5JbmZvICpyZWYpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHN0LT5udW1fcG9pbnRzOyBpKyspCisgICAgICAgIGRzdC0+bGV2X2NvZGVbaV0gPSAoaSA+PSByZWYtPm51bV9wb2ludHMpID8gNyA6IHJlZi0+bGV2X2NvZGVbaV07Cit9CisKKy8qKgorICogSW1wbGVtZW50cyBjb2RpbmcgbW9kZSAxIChtYXN0ZXIpIGZvciBnYWluIGNvbXBlbnNhdGlvbiBsZXZlbHMuCisgKgorICogQHBhcmFtW2luXSAgICAgZ2IgICAgIHRoZSBHZXRCaXQgY29udGV4dAorICogQHBhcmFtW2luXSAgICAgY3R4ICAgIHB0ciB0byB0aGUgY2hhbm5lbCB1bml0IGNvbnRleHQKKyAqIEBwYXJhbVtvdXRdICAgIGRzdCAgICBwdHIgdG8gdGhlIG91dHB1dCBhcnJheQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZ2FpbmNfbGV2ZWxfbW9kZTFtKEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHJhYzNwQ2hhblVuaXRDdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRyYWNHYWluSW5mbyAqZHN0KQoreworICAgIGludCBpLCBkZWx0YTsKKworICAgIGlmIChkc3QtPm51bV9wb2ludHMgPiAwKQorICAgICAgICBkc3QtPmxldl9jb2RlWzBdID0gZ2V0X3ZsYzIoZ2IsIGdhaW5fdmxjX3RhYnNbMl0udGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluX3ZsY190YWJzWzJdLmJpdHMsIDEpOworCisgICAgZm9yIChpID0gMTsgaSA8IGRzdC0+bnVtX3BvaW50czsgaSsrKSB7CisgICAgICAgIGRlbHRhID0gZ2V0X3ZsYzIoZ2IsIGdhaW5fdmxjX3RhYnNbM10udGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl92bGNfdGFic1szXS5iaXRzLCAxKTsKKyAgICAgICAgZHN0LT5sZXZfY29kZVtpXSA9IChkc3QtPmxldl9jb2RlW2kgLSAxXSArIGRlbHRhKSAmIDB4RjsKKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIGxldmVsIGNvZGUgZm9yIGVhY2ggZ2FpbiBjb250cm9sIHBvaW50LgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgICB0aGUgR2V0Qml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbixvdXRdIGN0eCAgICAgICAgICAgICBwdHIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgICBjaF9udW0gICAgICAgICAgY2hhbm5lbCB0byBwcm9jZXNzCisgKiBAcGFyYW1baW5dICAgICBjb2RlZF9zdWJiYW5kcyAgbnVtYmVyIG9mIHN1YmJhbmRzIHRvIHByb2Nlc3MKKyAqIEByZXR1cm4gcmVzdWx0IGNvZGU6IDAgPSBPSywgb3RoZXJ3aXNlIC0gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGRlY29kZV9nYWluY19sZXZlbHMoR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaF9udW0sIGludCBjb2RlZF9zdWJiYW5kcykKK3sKKyAgICBpbnQgc2IsIGksIGRlbHRhLCBkZWx0YV9iaXRzLCBtaW5fdmFsLCBwcmVkOworICAgIEF0cmFjM3BDaGFuUGFyYW1zICpjaGFuICAgICA9ICZjdHgtPmNoYW5uZWxzW2NoX251bV07CisgICAgQXRyYWMzcENoYW5QYXJhbXMgKnJlZl9jaGFuID0gJmN0eC0+Y2hhbm5lbHNbMF07CisKKyAgICBzd2l0Y2ggKGdldF9iaXRzKGdiLCAyKSkgeyAvKiBzd2l0Y2ggYWNjb3JkaW5nIHRvIGNvZGluZyBtb2RlICovCisgICAgY2FzZSAwOiAvKiBmaXhlZC1sZW5ndGggY29kaW5nICovCisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGNvZGVkX3N1YmJhbmRzOyBzYisrKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNoYW4tPmdhaW5fZGF0YVtzYl0ubnVtX3BvaW50czsgaSsrKQorICAgICAgICAgICAgICAgIGNoYW4tPmdhaW5fZGF0YVtzYl0ubGV2X2NvZGVbaV0gPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGNoX251bSkgeyAvKiBWTEMgbW9kdWxvIGRlbHRhIHRvIG1hc3RlciBjaGFubmVsICovCisgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBjb2RlZF9zdWJiYW5kczsgc2IrKykKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbi0+Z2Fpbl9kYXRhW3NiXS5udW1fcG9pbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBnZXRfdmxjMihnYiwgZ2Fpbl92bGNfdGFic1s1XS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluX3ZsY190YWJzWzVdLmJpdHMsIDEpOworICAgICAgICAgICAgICAgICAgICBwcmVkID0gKGkgPj0gcmVmX2NoYW4tPmdhaW5fZGF0YVtzYl0ubnVtX3BvaW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gNyA6IHJlZl9jaGFuLT5nYWluX2RhdGFbc2JdLmxldl9jb2RlW2ldOworICAgICAgICAgICAgICAgICAgICBjaGFuLT5nYWluX2RhdGFbc2JdLmxldl9jb2RlW2ldID0gKHByZWQgKyBkZWx0YSkgJiAweEY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvKiBWTEMgbW9kdWxvIGRlbHRhIHRvIHByZXZpb3VzICovCisgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBjb2RlZF9zdWJiYW5kczsgc2IrKykKKyAgICAgICAgICAgICAgICBnYWluY19sZXZlbF9tb2RlMW0oZ2IsIGN0eCwgJmNoYW4tPmdhaW5fZGF0YVtzYl0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGNoX251bSkgeyAvKiBWTEMgbW9kdWxvIGRlbHRhIHRvIHByZXZpb3VzIG9yIGNsb25lIG1hc3RlciAqLworICAgICAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY29kZWRfc3ViYmFuZHM7IHNiKyspCisgICAgICAgICAgICAgICAgaWYgKGNoYW4tPmdhaW5fZGF0YVtzYl0ubnVtX3BvaW50cyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpCisgICAgICAgICAgICAgICAgICAgICAgICBnYWluY19sZXZlbF9tb2RlMW0oZ2IsIGN0eCwgJmNoYW4tPmdhaW5fZGF0YVtzYl0pOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBnYWluY19sZXZlbF9tb2RlM3MoJmNoYW4tPmdhaW5fZGF0YVtzYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZl9jaGFuLT5nYWluX2RhdGFbc2JdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8qIFZMQyBtb2R1bG8gZGVsdGEgdG8gbGV2X2NvZGVzIG9mIHByZXZpb3VzIHN1YmJhbmQgKi8KKyAgICAgICAgICAgIGlmIChjaGFuLT5nYWluX2RhdGFbMF0ubnVtX3BvaW50cyA+IDApCisgICAgICAgICAgICAgICAgZ2FpbmNfbGV2ZWxfbW9kZTFtKGdiLCBjdHgsICZjaGFuLT5nYWluX2RhdGFbMF0pOworCisgICAgICAgICAgICBmb3IgKHNiID0gMTsgc2IgPCBjb2RlZF9zdWJiYW5kczsgc2IrKykKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbi0+Z2Fpbl9kYXRhW3NiXS5udW1fcG9pbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBnZXRfdmxjMihnYiwgZ2Fpbl92bGNfdGFic1s0XS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluX3ZsY190YWJzWzRdLmJpdHMsIDEpOworICAgICAgICAgICAgICAgICAgICBwcmVkID0gKGkgPj0gY2hhbi0+Z2Fpbl9kYXRhW3NiIC0gMV0ubnVtX3BvaW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gNyA6IGNoYW4tPmdhaW5fZGF0YVtzYiAtIDFdLmxldl9jb2RlW2ldOworICAgICAgICAgICAgICAgICAgICBjaGFuLT5nYWluX2RhdGFbc2JdLmxldl9jb2RlW2ldID0gKHByZWQgKyBkZWx0YSkgJiAweEY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKGNoX251bSkgeyAvKiBjbG9uZSBtYXN0ZXIgKi8KKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGNvZGVkX3N1YmJhbmRzOyBzYisrKQorICAgICAgICAgICAgICAgIGdhaW5jX2xldmVsX21vZGUzcygmY2hhbi0+Z2Fpbl9kYXRhW3NiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZl9jaGFuLT5nYWluX2RhdGFbc2JdKTsKKyAgICAgICAgfSBlbHNlIHsgLyogc2hvcnRlciBkZWx0YSB0byBtaW4gKi8KKyAgICAgICAgICAgIGRlbHRhX2JpdHMgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICBtaW5fdmFsICAgID0gZ2V0X2JpdHMoZ2IsIDQpOworCisgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBjb2RlZF9zdWJiYW5kczsgc2IrKykKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbi0+Z2Fpbl9kYXRhW3NiXS5udW1fcG9pbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbi0+Z2Fpbl9kYXRhW3NiXS5sZXZfY29kZVtpXSA9IG1pbl92YWwgKyBHRVRfREVMVEEoZ2IsIGRlbHRhX2JpdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbi0+Z2Fpbl9kYXRhW3NiXS5sZXZfY29kZVtpXSA+IDE1KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEltcGxlbWVudHMgY29kaW5nIG1vZGUgMCBmb3IgZ2FpbiBjb21wZW5zYXRpb24gbG9jYXRpb25zLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICB0aGUgR2V0Qml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIGN0eCAgICBwdHIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1bb3V0XSAgICBkc3QgICAgcHRyIHRvIHRoZSBvdXRwdXQgYXJyYXkKKyAqIEBwYXJhbVtpbl0gICAgIHBvcyAgICBwb3NpdGlvbiBvZiB0aGUgdmFsdWUgdG8gYmUgcHJvY2Vzc2VkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnYWluY19sb2NfbW9kZTAoR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHJhY0dhaW5JbmZvICpkc3QsIGludCBwb3MpCit7CisgICAgaW50IGRlbHRhX2JpdHM7CisKKyAgICBpZiAoIXBvcyB8fCBkc3QtPmxvY19jb2RlW3BvcyAtIDFdIDwgMTUpCisgICAgICAgIGRzdC0+bG9jX2NvZGVbcG9zXSA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICBlbHNlIGlmIChkc3QtPmxvY19jb2RlW3BvcyAtIDFdID49IDMwKQorICAgICAgICBkc3QtPmxvY19jb2RlW3Bvc10gPSAzMTsKKyAgICBlbHNlIHsKKyAgICAgICAgZGVsdGFfYml0cyAgICAgICAgID0gYXZfbG9nMigzMCAtIGRzdC0+bG9jX2NvZGVbcG9zIC0gMV0pICsgMTsKKyAgICAgICAgZHN0LT5sb2NfY29kZVtwb3NdID0gZHN0LT5sb2NfY29kZVtwb3MgLSAxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzKGdiLCBkZWx0YV9iaXRzKSArIDE7CisgICAgfQorfQorCisvKioKKyAqIEltcGxlbWVudHMgY29kaW5nIG1vZGUgMSBmb3IgZ2FpbiBjb21wZW5zYXRpb24gbG9jYXRpb25zLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICB0aGUgR2V0Qml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIGN0eCAgICBwdHIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1bb3V0XSAgICBkc3QgICAgcHRyIHRvIHRoZSBvdXRwdXQgYXJyYXkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGdhaW5jX2xvY19tb2RlMShHZXRCaXRDb250ZXh0ICpnYiwgQXRyYWMzcENoYW5Vbml0Q3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0cmFjR2FpbkluZm8gKmRzdCkKK3sKKyAgICBpbnQgaTsKKyAgICBWTEMgKnRhYjsKKworICAgIGlmIChkc3QtPm51bV9wb2ludHMgPiAwKSB7CisgICAgICAgIC8qIDFzdCBjb2VmZmljaWVudCBpcyBzdG9yZWQgZGlyZWN0bHkgKi8KKyAgICAgICAgZHN0LT5sb2NfY29kZVswXSA9IGdldF9iaXRzKGdiLCA1KTsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZHN0LT5udW1fcG9pbnRzOyBpKyspIHsKKyAgICAgICAgICAgIC8qIHN3aXRjaCBWTEMgYWNjb3JkaW5nIHRvIHRoZSBjdXJ2ZSBkaXJlY3Rpb24KKyAgICAgICAgICAgICAqIChhc2NlbmRpbmcvZGVzY2VuZGluZykgKi8KKyAgICAgICAgICAgIHRhYiAgICAgICAgICAgICAgPSAoZHN0LT5sZXZfY29kZVtpXSA8PSBkc3QtPmxldl9jb2RlW2kgLSAxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZnYWluX3ZsY190YWJzWzddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmZ2Fpbl92bGNfdGFic1s5XTsKKyAgICAgICAgICAgIGRzdC0+bG9jX2NvZGVbaV0gPSBkc3QtPmxvY19jb2RlW2kgLSAxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3ZsYzIoZ2IsIHRhYi0+dGFibGUsIHRhYi0+Yml0cywgMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIGxvY2F0aW9uIGNvZGUgZm9yIGVhY2ggZ2FpbiBjb250cm9sIHBvaW50LgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgICB0aGUgR2V0Qml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbixvdXRdIGN0eCAgICAgICAgICAgICBwdHIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgICBjaF9udW0gICAgICAgICAgY2hhbm5lbCB0byBwcm9jZXNzCisgKiBAcGFyYW1baW5dICAgICBjb2RlZF9zdWJiYW5kcyAgbnVtYmVyIG9mIHN1YmJhbmRzIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgICBwdHIgdG8gdGhlIEFWQ29kZWNDb250ZXh0CisgKiBAcmV0dXJuIHJlc3VsdCBjb2RlOiAwID0gT0ssIG90aGVyd2lzZSAtIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBkZWNvZGVfZ2FpbmNfbG9jX2NvZGVzKEdldEJpdENvbnRleHQgKmdiLCBBdHJhYzNwQ2hhblVuaXRDdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hfbnVtLCBpbnQgY29kZWRfc3ViYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBzYiwgaSwgZGVsdGEsIGRlbHRhX2JpdHMsIG1pbl92YWwsIHByZWQsIG1vcmVfdGhhbl9yZWY7CisgICAgQXRyYWNHYWluSW5mbyAqZHN0LCAqcmVmOworICAgIFZMQyAqdGFiOworICAgIEF0cmFjM3BDaGFuUGFyYW1zICpjaGFuICAgICA9ICZjdHgtPmNoYW5uZWxzW2NoX251bV07CisgICAgQXRyYWMzcENoYW5QYXJhbXMgKnJlZl9jaGFuID0gJmN0eC0+Y2hhbm5lbHNbMF07CisKKyAgICBzd2l0Y2ggKGdldF9iaXRzKGdiLCAyKSkgeyAvKiBzd2l0Y2ggYWNjb3JkaW5nIHRvIGNvZGluZyBtb2RlICovCisgICAgY2FzZSAwOiAvKiBzZXF1ZW5jZSBvZiBudW1iZXJzIGluIGFzY2VuZGluZyBvcmRlciAqLworICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBjb2RlZF9zdWJiYW5kczsgc2IrKykKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFuLT5nYWluX2RhdGFbc2JdLm51bV9wb2ludHM7IGkrKykKKyAgICAgICAgICAgICAgICBnYWluY19sb2NfbW9kZTAoZ2IsIGN0eCwgJmNoYW4tPmdhaW5fZGF0YVtzYl0sIGkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChjaF9udW0pIHsKKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGNvZGVkX3N1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYW4tPmdhaW5fZGF0YVtzYl0ubnVtX3BvaW50cyA8PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBkc3QgPSAmY2hhbi0+Z2Fpbl9kYXRhW3NiXTsKKyAgICAgICAgICAgICAgICByZWYgPSAmcmVmX2NoYW4tPmdhaW5fZGF0YVtzYl07CisKKyAgICAgICAgICAgICAgICAvKiAxc3QgdmFsdWUgaXMgdmxjLWNvZGVkIG1vZHVsbyBkZWx0YSB0byBtYXN0ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWx0YSA9IGdldF92bGMyKGdiLCBnYWluX3ZsY190YWJzWzEwXS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5fdmxjX3RhYnNbMTBdLmJpdHMsIDEpOworICAgICAgICAgICAgICAgIHByZWQgPSByZWYtPm51bV9wb2ludHMgPiAwID8gcmVmLT5sb2NfY29kZVswXSA6IDA7CisgICAgICAgICAgICAgICAgZHN0LT5sb2NfY29kZVswXSA9IChwcmVkICsgZGVsdGEpICYgMHgxRjsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBkc3QtPm51bV9wb2ludHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBtb3JlX3RoYW5fcmVmID0gaSA+PSByZWYtPm51bV9wb2ludHM7CisgICAgICAgICAgICAgICAgICAgIGlmIChkc3QtPmxldl9jb2RlW2ldID4gZHN0LT5sZXZfY29kZVtpIC0gMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzY2VuZGluZyBjdXJ2ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vcmVfdGhhbl9yZWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF92bGMyKGdiLCBnYWluX3ZsY190YWJzWzldLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluX3ZsY190YWJzWzldLmJpdHMsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+bG9jX2NvZGVbaV0gPSBkc3QtPmxvY19jb2RlW2kgLSAxXSArIGRlbHRhOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbmNfbG9jX21vZGUwKGdiLCBjdHgsIGRzdCwgaSk7ICAvLyBkaXJlY3QgY29kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmxvY19jb2RlW2ldID0gcmVmLT5sb2NfY29kZVtpXTsgIC8vIGNsb25lIG1hc3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBkZXNjZW5kaW5nIGN1cnZlICovCisgICAgICAgICAgICAgICAgICAgICAgICB0YWIgICA9IG1vcmVfdGhhbl9yZWYgPyAmZ2Fpbl92bGNfdGFic1s3XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmdhaW5fdmxjX3RhYnNbMTBdOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBnZXRfdmxjMihnYiwgdGFiLT50YWJsZSwgdGFiLT5iaXRzLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3JlX3RoYW5fcmVmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+bG9jX2NvZGVbaV0gPSBkc3QtPmxvY19jb2RlW2kgLSAxXSArIGRlbHRhOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+bG9jX2NvZGVbaV0gPSAocmVmLT5sb2NfY29kZVtpXSArIGRlbHRhKSAmIDB4MUY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSAvKiBWTEMgZGVsdGEgdG8gcHJldmlvdXMgKi8KKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGNvZGVkX3N1YmJhbmRzOyBzYisrKQorICAgICAgICAgICAgICAgIGdhaW5jX2xvY19tb2RlMShnYiwgY3R4LCAmY2hhbi0+Z2Fpbl9kYXRhW3NiXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGNoX251bSkgeworICAgICAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY29kZWRfc3ViYmFuZHM7IHNiKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbi0+Z2Fpbl9kYXRhW3NiXS5udW1fcG9pbnRzIDw9IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGRzdCA9ICZjaGFuLT5nYWluX2RhdGFbc2JdOworICAgICAgICAgICAgICAgIHJlZiA9ICZyZWZfY2hhbi0+Z2Fpbl9kYXRhW3NiXTsKKyAgICAgICAgICAgICAgICBpZiAoZHN0LT5udW1fcG9pbnRzID4gcmVmLT5udW1fcG9pbnRzIHx8IGdldF9iaXRzMShnYikpCisgICAgICAgICAgICAgICAgICAgIGdhaW5jX2xvY19tb2RlMShnYiwgY3R4LCBkc3QpOworICAgICAgICAgICAgICAgIGVsc2UgLyogY2xvbmUgbWFzdGVyIGZvciB0aGUgd2hvbGUgc3ViYmFuZCAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbi0+Z2Fpbl9kYXRhW3NiXS5udW1fcG9pbnRzOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmxvY19jb2RlW2ldID0gcmVmLT5sb2NfY29kZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGRhdGEgZm9yIHRoZSBmaXJzdCBzdWJiYW5kIGlzIGNvZGVkIGRpcmVjdGx5ICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbi0+Z2Fpbl9kYXRhWzBdLm51bV9wb2ludHM7IGkrKykKKyAgICAgICAgICAgICAgICBnYWluY19sb2NfbW9kZTAoZ2IsIGN0eCwgJmNoYW4tPmdhaW5fZGF0YVswXSwgaSk7CisKKyAgICAgICAgICAgIGZvciAoc2IgPSAxOyBzYiA8IGNvZGVkX3N1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYW4tPmdhaW5fZGF0YVtzYl0ubnVtX3BvaW50cyA8PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBkc3QgPSAmY2hhbi0+Z2Fpbl9kYXRhW3NiXTsKKworICAgICAgICAgICAgICAgIC8qIDFzdCB2YWx1ZSBpcyB2bGMtY29kZWQgbW9kdWxvIGRlbHRhIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICAgICogdmFsdWUgb2YgdGhlIHByZXZpb3VzIHN1YmJhbmQgaWYgYW55IG9yIHplcm8gKi8KKyAgICAgICAgICAgICAgICBkZWx0YSA9IGdldF92bGMyKGdiLCBnYWluX3ZsY190YWJzWzZdLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl92bGNfdGFic1s2XS5iaXRzLCAxKTsKKyAgICAgICAgICAgICAgICBwcmVkICAgICAgICAgICAgID0gZHN0Wy0xXS5udW1fcG9pbnRzID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRzdFstMV0ubG9jX2NvZGVbMF0gOiAwOworICAgICAgICAgICAgICAgIGRzdC0+bG9jX2NvZGVbMF0gPSAocHJlZCArIGRlbHRhKSAmIDB4MUY7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZHN0LT5udW1fcG9pbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbW9yZV90aGFuX3JlZiA9IGkgPj0gZHN0Wy0xXS5udW1fcG9pbnRzOworICAgICAgICAgICAgICAgICAgICAvKiBTZWxlY3QgVkxDIHRhYmxlIGFjY29yZGluZyB0byBjdXJ2ZSBkaXJlY3Rpb24gYW5kCisgICAgICAgICAgICAgICAgICAgICAqIHByZXNlbmNlIG9mIHByZWRpY3Rpb24uICovCisgICAgICAgICAgICAgICAgICAgIHRhYiA9ICZnYWluX3ZsY190YWJzWyhkc3QtPmxldl9jb2RlW2ldID4gZHN0LT5sZXZfY29kZVtpIC0gMV0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKyBtb3JlX3RoYW5fcmVmICsgNl07CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gZ2V0X3ZsYzIoZ2IsIHRhYi0+dGFibGUsIHRhYi0+Yml0cywgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb3JlX3RoYW5fcmVmKQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5sb2NfY29kZVtpXSA9IGRzdC0+bG9jX2NvZGVbaSAtIDFdICsgZGVsdGE7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+bG9jX2NvZGVbaV0gPSAoZHN0Wy0xXS5sb2NfY29kZVtpXSArIGRlbHRhKSAmIDB4MUY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKGNoX251bSkgeyAvKiBjbG9uZSBtYXN0ZXIgb3IgZGlyZWN0IG9yIGRpcmVjdCBjb2RpbmcgKi8KKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGNvZGVkX3N1YmJhbmRzOyBzYisrKQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFuLT5nYWluX2RhdGFbc2JdLm51bV9wb2ludHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSByZWZfY2hhbi0+Z2Fpbl9kYXRhW3NiXS5udW1fcG9pbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbmNfbG9jX21vZGUwKGdiLCBjdHgsICZjaGFuLT5nYWluX2RhdGFbc2JdLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbi0+Z2Fpbl9kYXRhW3NiXS5sb2NfY29kZVtpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX2NoYW4tPmdhaW5fZGF0YVtzYl0ubG9jX2NvZGVbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvKiBzaG9ydGVyIGRlbHRhIHRvIG1pbiAqLworICAgICAgICAgICAgZGVsdGFfYml0cyA9IGdldF9iaXRzKGdiLCAyKSArIDE7CisgICAgICAgICAgICBtaW5fdmFsICAgID0gZ2V0X2JpdHMoZ2IsIDUpOworCisgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBjb2RlZF9zdWJiYW5kczsgc2IrKykKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbi0+Z2Fpbl9kYXRhW3NiXS5udW1fcG9pbnRzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGNoYW4tPmdhaW5fZGF0YVtzYl0ubG9jX2NvZGVbaV0gPSBtaW5fdmFsICsgaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0cyhnYiwgZGVsdGFfYml0cyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgZGVjb2RlZCBpbmZvcm1hdGlvbiAqLworICAgIGZvciAoc2IgPSAwOyBzYiA8IGNvZGVkX3N1YmJhbmRzOyBzYisrKSB7CisgICAgICAgIGRzdCA9ICZjaGFuLT5nYWluX2RhdGFbc2JdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbi0+Z2Fpbl9kYXRhW3NiXS5udW1fcG9pbnRzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkc3QtPmxvY19jb2RlW2ldIDwgMCB8fCBkc3QtPmxvY19jb2RlW2ldID4gMzEgfHwKKyAgICAgICAgICAgICAgICAoaSAmJiBkc3QtPmxvY19jb2RlW2ldIDw9IGRzdC0+bG9jX2NvZGVbaSAtIDFdKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBnYWluIGxvY2F0aW9uOiBjaD0lZCwgc2I9JWQsIHBvcz0lZCwgdmFsPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjaF9udW0sIHNiLCBpLCBkc3QtPmxvY19jb2RlW2ldKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSBnYWluIGNvbnRyb2wgZGF0YSBmb3IgYWxsIGNoYW5uZWxzLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCB1bml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIG51bV9jaGFubmVscyAgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiByZXN1bHQgY29kZTogMCA9IE9LLCBvdGhlcndpc2UgLSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2dhaW5jX2RhdGEoR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGNoX251bSwgY29kZWRfc3ViYmFuZHMsIHNiLCByZXQ7CisKKyAgICBmb3IgKGNoX251bSA9IDA7IGNoX251bSA8IG51bV9jaGFubmVsczsgY2hfbnVtKyspIHsKKyAgICAgICAgbWVtc2V0KGN0eC0+Y2hhbm5lbHNbY2hfbnVtXS5nYWluX2RhdGEsIDAsCisgICAgICAgICAgICAgICBzaXplb2YoKmN0eC0+Y2hhbm5lbHNbY2hfbnVtXS5nYWluX2RhdGEpICogQVRSQUMzUF9TVUJCQU5EUyk7CisKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsgLyogZ2FpbiBjb250cm9sIGRhdGEgcHJlc2VudD8gKi8KKyAgICAgICAgICAgIGNvZGVkX3N1YmJhbmRzID0gZ2V0X2JpdHMoZ2IsIDQpICsgMTsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSAvKiBpcyBoaWdoIGJhbmQgZ2FpbiBkYXRhIHJlcGxpY2F0aW9uIG9uPyAqLworICAgICAgICAgICAgICAgIGN0eC0+Y2hhbm5lbHNbY2hfbnVtXS5udW1fZ2Fpbl9zdWJiYW5kcyA9IGdldF9iaXRzKGdiLCA0KSArIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3R4LT5jaGFubmVsc1tjaF9udW1dLm51bV9nYWluX3N1YmJhbmRzID0gY29kZWRfc3ViYmFuZHM7CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2dhaW5jX25wb2ludHMoZ2IsIGN0eCwgY2hfbnVtLCBjb2RlZF9zdWJiYW5kcykpIDwgMCB8fAorICAgICAgICAgICAgICAgIChyZXQgPSBkZWNvZGVfZ2FpbmNfbGV2ZWxzKGdiLCBjdHgsIGNoX251bSwgY29kZWRfc3ViYmFuZHMpKSAgPCAwIHx8CisgICAgICAgICAgICAgICAgKHJldCA9IGRlY29kZV9nYWluY19sb2NfY29kZXMoZ2IsIGN0eCwgY2hfbnVtLCBjb2RlZF9zdWJiYW5kcywgYXZjdHgpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgaWYgKGNvZGVkX3N1YmJhbmRzID4gMCkgeyAvKiBwcm9wYWdhdGUgZ2FpbiBkYXRhIGlmIHJlcXVlc3RlZCAqLworICAgICAgICAgICAgICAgIGZvciAoc2IgPSBjb2RlZF9zdWJiYW5kczsgc2IgPCBjdHgtPmNoYW5uZWxzW2NoX251bV0ubnVtX2dhaW5fc3ViYmFuZHM7IHNiKyspCisgICAgICAgICAgICAgICAgICAgIGN0eC0+Y2hhbm5lbHNbY2hfbnVtXS5nYWluX2RhdGFbc2JdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y2hhbm5lbHNbY2hfbnVtXS5nYWluX2RhdGFbc2IgLSAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN0eC0+Y2hhbm5lbHNbY2hfbnVtXS5udW1fZ2Fpbl9zdWJiYW5kcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgZW52ZWxvcGUgZm9yIGFsbCB0b25lcyBvZiBhIGNoYW5uZWwuCisgKgorICogQHBhcmFtW2luXSAgICAgZ2IgICAgICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgICAgICBwdHIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgICBjaF9udW0gICAgICAgICAgICBjaGFubmVsIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGJhbmRfaGFzX3RvbmVzICAgIHB0ciB0byBhbiBhcnJheSBvZiBwZXItYmFuZC1mbGFnczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSB0b25lIGRhdGEgcHJlc2VudAorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfdG9uZXNfZW52ZWxvcGUoR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaF9udW0sIGludCBiYW5kX2hhc190b25lc1tdKQoreworICAgIGludCBzYjsKKyAgICBBdHJhYzNwV2F2ZXNEYXRhICpkc3QgPSBjdHgtPmNoYW5uZWxzW2NoX251bV0udG9uZXNfaW5mbzsKKyAgICBBdHJhYzNwV2F2ZXNEYXRhICpyZWYgPSBjdHgtPmNoYW5uZWxzWzBdLnRvbmVzX2luZm87CisKKyAgICBpZiAoIWNoX251bSB8fCAhZ2V0X2JpdHMxKGdiKSkgeyAvKiBtb2RlIDA6IGZpeGVkLWxlbmd0aCBjb2RpbmcgKi8KKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY3R4LT53YXZlc19pbmZvLT5udW1fdG9uZV9iYW5kczsgc2IrKykgeworICAgICAgICAgICAgaWYgKCFiYW5kX2hhc190b25lc1tzYl0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBkc3Rbc2JdLnBlbmRfZW52Lmhhc19zdGFydF9wb2ludCA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBkc3Rbc2JdLnBlbmRfZW52LnN0YXJ0X3BvcyAgICAgICA9IGRzdFtzYl0ucGVuZF9lbnYuaGFzX3N0YXJ0X3BvaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0X2JpdHMoZ2IsIDUpIDogLTE7CisgICAgICAgICAgICBkc3Rbc2JdLnBlbmRfZW52Lmhhc19zdG9wX3BvaW50ICA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBkc3Rbc2JdLnBlbmRfZW52LnN0b3BfcG9zICAgICAgICA9IGRzdFtzYl0ucGVuZF9lbnYuaGFzX3N0b3BfcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRfYml0cyhnYiwgNSkgOiAzMjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8qIG1vZGUgMShzbGF2ZSBvbmx5KTogY29weSBtYXN0ZXIgKi8KKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY3R4LT53YXZlc19pbmZvLT5udW1fdG9uZV9iYW5kczsgc2IrKykgeworICAgICAgICAgICAgaWYgKCFiYW5kX2hhc190b25lc1tzYl0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBkc3Rbc2JdLnBlbmRfZW52Lmhhc19zdGFydF9wb2ludCA9IHJlZltzYl0ucGVuZF9lbnYuaGFzX3N0YXJ0X3BvaW50OworICAgICAgICAgICAgZHN0W3NiXS5wZW5kX2Vudi5oYXNfc3RvcF9wb2ludCAgPSByZWZbc2JdLnBlbmRfZW52Lmhhc19zdG9wX3BvaW50OworICAgICAgICAgICAgZHN0W3NiXS5wZW5kX2Vudi5zdGFydF9wb3MgICAgICAgPSByZWZbc2JdLnBlbmRfZW52LnN0YXJ0X3BvczsKKyAgICAgICAgICAgIGRzdFtzYl0ucGVuZF9lbnYuc3RvcF9wb3MgICAgICAgID0gcmVmW3NiXS5wZW5kX2Vudi5zdG9wX3BvczsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBEZWNvZGUgbnVtYmVyIG9mIHRvbmVzIGZvciBlYWNoIHN1YmJhbmQgb2YgYSBjaGFubmVsLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgICAgIHRoZSBHZXRCaXQgY29udGV4dAorICogQHBhcmFtW2luLG91dF0gY3R4ICAgICAgICAgICAgICAgcHRyIHRvIHRoZSBjaGFubmVsIHVuaXQgY29udGV4dAorICogQHBhcmFtW2luXSAgICAgY2hfbnVtICAgICAgICAgICAgY2hhbm5lbCB0byBwcm9jZXNzCisgKiBAcGFyYW1baW5dICAgICBiYW5kX2hhc190b25lcyAgICBwdHIgdG8gYW4gYXJyYXkgb2YgcGVyLWJhbmQtZmxhZ3M6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gdG9uZSBkYXRhIHByZXNlbnQKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgICAgIHB0ciB0byB0aGUgQVZDb2RlY0NvbnRleHQKKyAqIEByZXR1cm4gcmVzdWx0IGNvZGU6IDAgPSBPSywgb3RoZXJ3aXNlIC0gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGRlY29kZV9iYW5kX251bXdhdnMoR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaF9udW0sIGludCBiYW5kX2hhc190b25lc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgbW9kZSwgc2IsIGRlbHRhOworICAgIEF0cmFjM3BXYXZlc0RhdGEgKmRzdCA9IGN0eC0+Y2hhbm5lbHNbY2hfbnVtXS50b25lc19pbmZvOworICAgIEF0cmFjM3BXYXZlc0RhdGEgKnJlZiA9IGN0eC0+Y2hhbm5lbHNbMF0udG9uZXNfaW5mbzsKKworICAgIG1vZGUgPSBnZXRfYml0cyhnYiwgY2hfbnVtICsgMSk7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSAwOiAvKiogZml4ZWQtbGVuZ3RoIGNvZGluZyAqLworICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBjdHgtPndhdmVzX2luZm8tPm51bV90b25lX2JhbmRzOyBzYisrKQorICAgICAgICAgICAgaWYgKGJhbmRfaGFzX3RvbmVzW3NiXSkKKyAgICAgICAgICAgICAgICBkc3Rbc2JdLm51bV93YXZzID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qKiB2YXJpYWJsZS1sZW5ndGggY29kaW5nICovCisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGN0eC0+d2F2ZXNfaW5mby0+bnVtX3RvbmVfYmFuZHM7IHNiKyspCisgICAgICAgICAgICBpZiAoYmFuZF9oYXNfdG9uZXNbc2JdKQorICAgICAgICAgICAgICAgIGRzdFtzYl0ubnVtX3dhdnMgPQorICAgICAgICAgICAgICAgICAgICBnZXRfdmxjMihnYiwgdG9uZV92bGNfdGFic1sxXS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9uZV92bGNfdGFic1sxXS5iaXRzLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvKiogVkxDIG1vZHVsbyBkZWx0YSB0byBtYXN0ZXIgKHNsYXZlIG9ubHkpICovCisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGN0eC0+d2F2ZXNfaW5mby0+bnVtX3RvbmVfYmFuZHM7IHNiKyspCisgICAgICAgICAgICBpZiAoYmFuZF9oYXNfdG9uZXNbc2JdKSB7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBnZXRfdmxjMihnYiwgdG9uZV92bGNfdGFic1syXS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvbmVfdmxjX3RhYnNbMl0uYml0cywgMSk7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBzaWduX2V4dGVuZChkZWx0YSwgMyk7CisgICAgICAgICAgICAgICAgZHN0W3NiXS5udW1fd2F2cyA9IChyZWZbc2JdLm51bV93YXZzICsgZGVsdGEpICYgMHhGOworICAgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6IC8qKiBjb3B5IG1hc3RlciAoc2xhdmUgb25seSkgKi8KKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY3R4LT53YXZlc19pbmZvLT5udW1fdG9uZV9iYW5kczsgc2IrKykKKyAgICAgICAgICAgIGlmIChiYW5kX2hhc190b25lc1tzYl0pCisgICAgICAgICAgICAgICAgZHN0W3NiXS5udW1fd2F2cyA9IHJlZltzYl0ubnVtX3dhdnM7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qKiBpbml0aWFsaXplIHN0YXJ0IHRvbmUgaW5kZXggZm9yIGVhY2ggc3ViYmFuZCAqLworICAgIGZvciAoc2IgPSAwOyBzYiA8IGN0eC0+d2F2ZXNfaW5mby0+bnVtX3RvbmVfYmFuZHM7IHNiKyspCisgICAgICAgIGlmIChiYW5kX2hhc190b25lc1tzYl0pIHsKKyAgICAgICAgICAgIGlmIChjdHgtPndhdmVzX2luZm8tPnRvbmVzX2luZGV4ICsgZHN0W3NiXS5udW1fd2F2cyA+IDQ4KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJUb28gbWFueSB0b25lczogJWQgKG1heC4gNDgpLCBmcmFtZTogJWQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjdHgtPndhdmVzX2luZm8tPnRvbmVzX2luZGV4ICsgZHN0W3NiXS5udW1fd2F2cywKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmZyYW1lX251bWJlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3Rbc2JdLnN0YXJ0X2luZGV4ICAgICAgICAgICA9IGN0eC0+d2F2ZXNfaW5mby0+dG9uZXNfaW5kZXg7CisgICAgICAgICAgICBjdHgtPndhdmVzX2luZm8tPnRvbmVzX2luZGV4ICs9IGRzdFtzYl0ubnVtX3dhdnM7CisgICAgICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSBmcmVxdWVuY3kgaW5mb3JtYXRpb24gZm9yIGVhY2ggc3ViYmFuZCBvZiBhIGNoYW5uZWwuCisgKgorICogQHBhcmFtW2luXSAgICAgZ2IgICAgICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgICAgICBwdHIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgICBjaF9udW0gICAgICAgICAgICBjaGFubmVsIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGJhbmRfaGFzX3RvbmVzICAgIHB0ciB0byBhbiBhcnJheSBvZiBwZXItYmFuZC1mbGFnczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSB0b25lIGRhdGEgcHJlc2VudAorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfdG9uZXNfZnJlcXVlbmN5KEdldEJpdENvbnRleHQgKmdiLCBBdHJhYzNwQ2hhblVuaXRDdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoX251bSwgaW50IGJhbmRfaGFzX3RvbmVzW10pCit7CisgICAgaW50IHNiLCBpLCBkaXJlY3Rpb24sIG5iaXRzLCBwcmVkLCBkZWx0YTsKKyAgICBBdHJhYzNwV2F2ZVBhcmFtICppd2F2LCAqb3dhdjsKKyAgICBBdHJhYzNwV2F2ZXNEYXRhICpkc3QgPSBjdHgtPmNoYW5uZWxzW2NoX251bV0udG9uZXNfaW5mbzsKKyAgICBBdHJhYzNwV2F2ZXNEYXRhICpyZWYgPSBjdHgtPmNoYW5uZWxzWzBdLnRvbmVzX2luZm87CisKKyAgICBpZiAoIWNoX251bSB8fCAhZ2V0X2JpdHMxKGdiKSkgeyAvKiBtb2RlIDA6IGZpeGVkLWxlbmd0aCBjb2RpbmcgKi8KKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY3R4LT53YXZlc19pbmZvLT5udW1fdG9uZV9iYW5kczsgc2IrKykgeworICAgICAgICAgICAgaWYgKCFiYW5kX2hhc190b25lc1tzYl0gfHwgIWRzdFtzYl0ubnVtX3dhdnMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpd2F2ICAgICAgPSAmY3R4LT53YXZlc19pbmZvLT53YXZlc1tkc3Rbc2JdLnN0YXJ0X2luZGV4XTsKKyAgICAgICAgICAgIGRpcmVjdGlvbiA9IChkc3Rbc2JdLm51bV93YXZzID4gMSkgPyBnZXRfYml0czEoZ2IpIDogMDsKKyAgICAgICAgICAgIGlmIChkaXJlY3Rpb24pIHsgLyoqIHBhY2tlZCBudW1iZXJzIGluIGRlc2NlbmRpbmcgb3JkZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAoZHN0W3NiXS5udW1fd2F2cykKKyAgICAgICAgICAgICAgICAgICAgaXdhdltkc3Rbc2JdLm51bV93YXZzIC0gMV0uZnJlcV9pbmRleCA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gZHN0W3NiXS5udW1fd2F2cyAtIDI7IGkgPj0gMCA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBuYml0cyA9IGF2X2xvZzIoaXdhdltpKzFdLmZyZXFfaW5kZXgpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgaXdhdltpXS5mcmVxX2luZGV4ID0gZ2V0X2JpdHMoZ2IsIG5iaXRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvKiogcGFja2VkIG51bWJlcnMgaW4gYXNjZW5kaW5nIG9yZGVyICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdFtzYl0ubnVtX3dhdnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWkgfHwgaXdhdltpIC0gMV0uZnJlcV9pbmRleCA8IDUxMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGl3YXZbaV0uZnJlcV9pbmRleCA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmJpdHMgPSBhdl9sb2cyKDEwMjMgLSBpd2F2W2kgLSAxXS5mcmVxX2luZGV4KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpd2F2W2ldLmZyZXFfaW5kZXggPSBnZXRfYml0cyhnYiwgbmJpdHMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQgLSAoMSA8PCBuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBtb2RlIDE6IFZMQyBtb2R1bG8gZGVsdGEgdG8gbWFzdGVyIChzbGF2ZSBvbmx5KSAqLworICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBjdHgtPndhdmVzX2luZm8tPm51bV90b25lX2JhbmRzOyBzYisrKSB7CisgICAgICAgICAgICBpZiAoIWJhbmRfaGFzX3RvbmVzW3NiXSB8fCAhZHN0W3NiXS5udW1fd2F2cykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGl3YXYgPSAmY3R4LT53YXZlc19pbmZvLT53YXZlc1tyZWZbc2JdLnN0YXJ0X2luZGV4XTsKKyAgICAgICAgICAgIG93YXYgPSAmY3R4LT53YXZlc19pbmZvLT53YXZlc1tkc3Rbc2JdLnN0YXJ0X2luZGV4XTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkc3Rbc2JdLm51bV93YXZzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZWx0YSA9IGdldF92bGMyKGdiLCB0b25lX3ZsY190YWJzWzZdLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9uZV92bGNfdGFic1s2XS5iaXRzLCAxKTsKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHNpZ25fZXh0ZW5kKGRlbHRhLCA4KTsKKyAgICAgICAgICAgICAgICBwcmVkICA9IChpIDwgcmVmW3NiXS5udW1fd2F2cykgPyBpd2F2W2ldLmZyZXFfaW5kZXggOgorICAgICAgICAgICAgICAgICAgICAgICAgKHJlZltzYl0ubnVtX3dhdnMgPyBpd2F2W3JlZltzYl0ubnVtX3dhdnMgLSAxXS5mcmVxX2luZGV4IDogMCk7CisgICAgICAgICAgICAgICAgb3dhdltpXS5mcmVxX2luZGV4ID0gKHByZWQgKyBkZWx0YSkgJiAweDNGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBEZWNvZGUgYW1wbGl0dWRlIGluZm9ybWF0aW9uIGZvciBlYWNoIHN1YmJhbmQgb2YgYSBjaGFubmVsLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgICAgIHRoZSBHZXRCaXQgY29udGV4dAorICogQHBhcmFtW2luLG91dF0gY3R4ICAgICAgICAgICAgICAgcHRyIHRvIHRoZSBjaGFubmVsIHVuaXQgY29udGV4dAorICogQHBhcmFtW2luXSAgICAgY2hfbnVtICAgICAgICAgICAgY2hhbm5lbCB0byBwcm9jZXNzCisgKiBAcGFyYW1baW5dICAgICBiYW5kX2hhc190b25lcyAgICBwdHIgdG8gYW4gYXJyYXkgb2YgcGVyLWJhbmQtZmxhZ3M6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gdG9uZSBkYXRhIHByZXNlbnQKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX3RvbmVzX2FtcGxpdHVkZShHZXRCaXRDb250ZXh0ICpnYiwgQXRyYWMzcENoYW5Vbml0Q3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaF9udW0sIGludCBiYW5kX2hhc190b25lc1tdKQoreworICAgIGludCBtb2RlLCBzYiwgaiwgaSwgZGlmZiwgbWF4ZGlmZiwgZmksIGRlbHRhLCBwcmVkOworICAgIEF0cmFjM3BXYXZlUGFyYW0gKndzcmMsICp3cmVmOworICAgIGludCByZWZ3YXZlc1s0OF0gPSB7IDAgfTsKKyAgICBBdHJhYzNwV2F2ZXNEYXRhICpkc3QgPSBjdHgtPmNoYW5uZWxzW2NoX251bV0udG9uZXNfaW5mbzsKKyAgICBBdHJhYzNwV2F2ZXNEYXRhICpyZWYgPSBjdHgtPmNoYW5uZWxzWzBdLnRvbmVzX2luZm87CisKKyAgICBpZiAoY2hfbnVtKSB7CisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGN0eC0+d2F2ZXNfaW5mby0+bnVtX3RvbmVfYmFuZHM7IHNiKyspIHsKKyAgICAgICAgICAgIGlmICghYmFuZF9oYXNfdG9uZXNbc2JdIHx8ICFkc3Rbc2JdLm51bV93YXZzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgd3NyYyA9ICZjdHgtPndhdmVzX2luZm8tPndhdmVzW2RzdFtzYl0uc3RhcnRfaW5kZXhdOworICAgICAgICAgICAgd3JlZiA9ICZjdHgtPndhdmVzX2luZm8tPndhdmVzW3JlZltzYl0uc3RhcnRfaW5kZXhdOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRzdFtzYl0ubnVtX3dhdnM7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGZpID0gMCwgbWF4ZGlmZiA9IDEwMjQ7IGkgPCByZWZbc2JdLm51bV93YXZzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGlmZiA9IEZGQUJTKHdzcmNbal0uZnJlcV9pbmRleCAtIHdyZWZbaV0uZnJlcV9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmIDwgbWF4ZGlmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZGlmZiA9IGRpZmY7CisgICAgICAgICAgICAgICAgICAgICAgICBmaSAgICAgID0gaTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtYXhkaWZmIDwgOCkKKyAgICAgICAgICAgICAgICAgICAgcmVmd2F2ZXNbZHN0W3NiXS5zdGFydF9pbmRleCArIGpdID0gZmkgKyByZWZbc2JdLnN0YXJ0X2luZGV4OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGogPCByZWZbc2JdLm51bV93YXZzKQorICAgICAgICAgICAgICAgICAgICByZWZ3YXZlc1tkc3Rbc2JdLnN0YXJ0X2luZGV4ICsgal0gPSBqICsgcmVmW3NiXS5zdGFydF9pbmRleDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlZndhdmVzW2RzdFtzYl0uc3RhcnRfaW5kZXggKyBqXSA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbW9kZSA9IGdldF9iaXRzKGdiLCBjaF9udW0gKyAxKTsKKworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgMDogLyoqIGZpeGVkLWxlbmd0aCBjb2RpbmcgKi8KKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY3R4LT53YXZlc19pbmZvLT5udW1fdG9uZV9iYW5kczsgc2IrKykgeworICAgICAgICAgICAgaWYgKCFiYW5kX2hhc190b25lc1tzYl0gfHwgIWRzdFtzYl0ubnVtX3dhdnMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoY3R4LT53YXZlc19pbmZvLT5hbXBsaXR1ZGVfbW9kZSkKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0W3NiXS5udW1fd2F2czsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjdHgtPndhdmVzX2luZm8tPndhdmVzW2RzdFtzYl0uc3RhcnRfaW5kZXggKyBpXS5hbXBfc2YgPSBnZXRfYml0cyhnYiwgNik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3R4LT53YXZlc19pbmZvLT53YXZlc1tkc3Rbc2JdLnN0YXJ0X2luZGV4XS5hbXBfc2YgPSBnZXRfYml0cyhnYiwgNik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOiAvKiogbWluICsgVkxDIGRlbHRhICovCisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGN0eC0+d2F2ZXNfaW5mby0+bnVtX3RvbmVfYmFuZHM7IHNiKyspIHsKKyAgICAgICAgICAgIGlmICghYmFuZF9oYXNfdG9uZXNbc2JdIHx8ICFkc3Rbc2JdLm51bV93YXZzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGN0eC0+d2F2ZXNfaW5mby0+YW1wbGl0dWRlX21vZGUpCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdFtzYl0ubnVtX3dhdnM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgY3R4LT53YXZlc19pbmZvLT53YXZlc1tkc3Rbc2JdLnN0YXJ0X2luZGV4ICsgaV0uYW1wX3NmID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldF92bGMyKGdiLCB0b25lX3ZsY190YWJzWzNdLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9uZV92bGNfdGFic1szXS5iaXRzLCAxKSArIDIwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN0eC0+d2F2ZXNfaW5mby0+d2F2ZXNbZHN0W3NiXS5zdGFydF9pbmRleF0uYW1wX3NmID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0X3ZsYzIoZ2IsIHRvbmVfdmxjX3RhYnNbNF0udGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvbmVfdmxjX3RhYnNbNF0uYml0cywgMSkgKyAyNDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qKiBWTEMgbW9kdWxvIGRlbHRhIHRvIG1hc3RlciAoc2xhdmUgb25seSkgKi8KKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY3R4LT53YXZlc19pbmZvLT5udW1fdG9uZV9iYW5kczsgc2IrKykgeworICAgICAgICAgICAgaWYgKCFiYW5kX2hhc190b25lc1tzYl0gfHwgIWRzdFtzYl0ubnVtX3dhdnMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0W3NiXS5udW1fd2F2czsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBnZXRfdmxjMihnYiwgdG9uZV92bGNfdGFic1s1XS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvbmVfdmxjX3RhYnNbNV0uYml0cywgMSk7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBzaWduX2V4dGVuZChkZWx0YSwgNSk7CisgICAgICAgICAgICAgICAgcHJlZCAgPSByZWZ3YXZlc1tkc3Rbc2JdLnN0YXJ0X2luZGV4ICsgaV0gPj0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPndhdmVzX2luZm8tPndhdmVzW3JlZndhdmVzW2RzdFtzYl0uc3RhcnRfaW5kZXggKyBpXV0uYW1wX3NmIDogMzQ7CisgICAgICAgICAgICAgICAgY3R4LT53YXZlc19pbmZvLT53YXZlc1tkc3Rbc2JdLnN0YXJ0X2luZGV4ICsgaV0uYW1wX3NmID0gKHByZWQgKyBkZWx0YSkgJiAweDNGOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLyoqIGNsb25lIG1hc3RlciAoc2xhdmUgb25seSkgKi8KKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY3R4LT53YXZlc19pbmZvLT5udW1fdG9uZV9iYW5kczsgc2IrKykgeworICAgICAgICAgICAgaWYgKCFiYW5kX2hhc190b25lc1tzYl0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0W3NiXS5udW1fd2F2czsgaSsrKQorICAgICAgICAgICAgICAgIGN0eC0+d2F2ZXNfaW5mby0+d2F2ZXNbZHN0W3NiXS5zdGFydF9pbmRleCArIGldLmFtcF9zZiA9CisgICAgICAgICAgICAgICAgICAgIHJlZndhdmVzW2RzdFtzYl0uc3RhcnRfaW5kZXggKyBpXSA+PSAwCisgICAgICAgICAgICAgICAgICAgID8gY3R4LT53YXZlc19pbmZvLT53YXZlc1tyZWZ3YXZlc1tkc3Rbc2JdLnN0YXJ0X2luZGV4ICsgaV1dLmFtcF9zZgorICAgICAgICAgICAgICAgICAgICA6IDMyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqCisgKiBEZWNvZGUgcGhhc2UgaW5mb3JtYXRpb24gZm9yIGVhY2ggc3ViYmFuZCBvZiBhIGNoYW5uZWwuCisgKgorICogQHBhcmFtW2luXSAgICAgZ2IgICAgICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgICAgICBwdHIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgICBjaF9udW0gICAgICAgICAgICBjaGFubmVsIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGJhbmRfaGFzX3RvbmVzICAgIHB0ciB0byBhbiBhcnJheSBvZiBwZXItYmFuZC1mbGFnczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSB0b25lIGRhdGEgcHJlc2VudAorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfdG9uZXNfcGhhc2UoR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaF9udW0sIGludCBiYW5kX2hhc190b25lc1tdKQoreworICAgIGludCBzYiwgaTsKKyAgICBBdHJhYzNwV2F2ZVBhcmFtICp3cGFyYW07CisgICAgQXRyYWMzcFdhdmVzRGF0YSAqZHN0ID0gY3R4LT5jaGFubmVsc1tjaF9udW1dLnRvbmVzX2luZm87CisKKyAgICBmb3IgKHNiID0gMDsgc2IgPCBjdHgtPndhdmVzX2luZm8tPm51bV90b25lX2JhbmRzOyBzYisrKSB7CisgICAgICAgIGlmICghYmFuZF9oYXNfdG9uZXNbc2JdKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHdwYXJhbSA9ICZjdHgtPndhdmVzX2luZm8tPndhdmVzW2RzdFtzYl0uc3RhcnRfaW5kZXhdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0W3NiXS5udW1fd2F2czsgaSsrKQorICAgICAgICAgICAgd3BhcmFtW2ldLnBoYXNlX2luZGV4ID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgIH0KK30KKworLyoqCisgKiBEZWNvZGUgdG9uZXMgaW5mbyBmb3IgYWxsIGNoYW5uZWxzLgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCB1bml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIG51bV9jaGFubmVscyAgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiByZXN1bHQgY29kZTogMCA9IE9LLCBvdGhlcndpc2UgLSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3RvbmVzX2luZm8oR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGNoX251bSwgaSwgcmV0OworICAgIGludCBiYW5kX2hhc190b25lc1sxNl07CisKKyAgICBmb3IgKGNoX251bSA9IDA7IGNoX251bSA8IG51bV9jaGFubmVsczsgY2hfbnVtKyspCisgICAgICAgIG1lbXNldChjdHgtPmNoYW5uZWxzW2NoX251bV0udG9uZXNfaW5mbywgMCwKKyAgICAgICAgICAgICAgIHNpemVvZigqY3R4LT5jaGFubmVsc1tjaF9udW1dLnRvbmVzX2luZm8pICogQVRSQUMzUF9TVUJCQU5EUyk7CisKKyAgICBjdHgtPndhdmVzX2luZm8tPnRvbmVzX3ByZXNlbnQgPSBnZXRfYml0czEoZ2IpOworICAgIGlmICghY3R4LT53YXZlc19pbmZvLT50b25lc19wcmVzZW50KQorICAgICAgICByZXR1cm4gMDsKKworICAgIG1lbXNldChjdHgtPndhdmVzX2luZm8tPndhdmVzLCAwLCBzaXplb2YoY3R4LT53YXZlc19pbmZvLT53YXZlcykpOworCisgICAgY3R4LT53YXZlc19pbmZvLT5hbXBsaXR1ZGVfbW9kZSA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKCFjdHgtPndhdmVzX2luZm8tPmFtcGxpdHVkZV9tb2RlKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiR0hBIGFtcGxpdHVkZSBtb2RlIDAiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGN0eC0+d2F2ZXNfaW5mby0+bnVtX3RvbmVfYmFuZHMgPQorICAgICAgICBnZXRfdmxjMihnYiwgdG9uZV92bGNfdGFic1swXS50YWJsZSwKKyAgICAgICAgICAgICAgICAgdG9uZV92bGNfdGFic1swXS5iaXRzLCAxKSArIDE7CisKKyAgICBpZiAobnVtX2NoYW5uZWxzID09IDIpIHsKKyAgICAgICAgZ2V0X3N1YmJhbmRfZmxhZ3MoZ2IsIGN0eC0+d2F2ZXNfaW5mby0+dG9uZV9zaGFyaW5nLCBjdHgtPndhdmVzX2luZm8tPm51bV90b25lX2JhbmRzKTsKKyAgICAgICAgZ2V0X3N1YmJhbmRfZmxhZ3MoZ2IsIGN0eC0+d2F2ZXNfaW5mby0+dG9uZV9tYXN0ZXIsICBjdHgtPndhdmVzX2luZm8tPm51bV90b25lX2JhbmRzKTsKKyAgICAgICAgaWYgKGdldF9zdWJiYW5kX2ZsYWdzKGdiLCBjdHgtPndhdmVzX2luZm8tPnBoYXNlX3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT53YXZlc19pbmZvLT5udW1fdG9uZV9iYW5kcykpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiR0hBIFBoYXNlIHNoaWZ0aW5nIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdHgtPndhdmVzX2luZm8tPnRvbmVzX2luZGV4ID0gMDsKKworICAgIGZvciAoY2hfbnVtID0gMDsgY2hfbnVtIDwgbnVtX2NoYW5uZWxzOyBjaF9udW0rKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT53YXZlc19pbmZvLT5udW1fdG9uZV9iYW5kczsgaSsrKQorICAgICAgICAgICAgYmFuZF9oYXNfdG9uZXNbaV0gPSAhY2hfbnVtID8gMSA6ICFjdHgtPndhdmVzX2luZm8tPnRvbmVfc2hhcmluZ1tpXTsKKworICAgICAgICBkZWNvZGVfdG9uZXNfZW52ZWxvcGUoZ2IsIGN0eCwgY2hfbnVtLCBiYW5kX2hhc190b25lcyk7CisgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2JhbmRfbnVtd2F2cyhnYiwgY3R4LCBjaF9udW0sIGJhbmRfaGFzX3RvbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGRlY29kZV90b25lc19mcmVxdWVuY3koZ2IsIGN0eCwgY2hfbnVtLCBiYW5kX2hhc190b25lcyk7CisgICAgICAgIGRlY29kZV90b25lc19hbXBsaXR1ZGUoZ2IsIGN0eCwgY2hfbnVtLCBiYW5kX2hhc190b25lcyk7CisgICAgICAgIGRlY29kZV90b25lc19waGFzZShnYiwgY3R4LCBjaF9udW0sIGJhbmRfaGFzX3RvbmVzKTsKKyAgICB9CisKKyAgICBpZiAobnVtX2NoYW5uZWxzID09IDIpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+d2F2ZXNfaW5mby0+bnVtX3RvbmVfYmFuZHM7IGkrKykgeworICAgICAgICAgICAgaWYgKGN0eC0+d2F2ZXNfaW5mby0+dG9uZV9zaGFyaW5nW2ldKQorICAgICAgICAgICAgICAgIGN0eC0+Y2hhbm5lbHNbMV0udG9uZXNfaW5mb1tpXSA9IGN0eC0+Y2hhbm5lbHNbMF0udG9uZXNfaW5mb1tpXTsKKworICAgICAgICAgICAgaWYgKGN0eC0+d2F2ZXNfaW5mby0+dG9uZV9tYXN0ZXJbaV0pCisgICAgICAgICAgICAgICAgRkZTV0FQKEF0cmFjM3BXYXZlc0RhdGEsIGN0eC0+Y2hhbm5lbHNbMF0udG9uZXNfaW5mb1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5jaGFubmVsc1sxXS50b25lc19pbmZvW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfYXRyYWMzcF9kZWNvZGVfY2hhbm5lbF91bml0KEdldEJpdENvbnRleHQgKmdiLCBBdHJhYzNwQ2hhblVuaXRDdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jaGFubmVscywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCByZXQ7CisKKyAgICAvKiBwYXJzZSBzb3VuZCBoZWFkZXIgKi8KKyAgICBjdHgtPm51bV9xdWFudF91bml0cyA9IGdldF9iaXRzKGdiLCA1KSArIDE7CisgICAgaWYgKGN0eC0+bnVtX3F1YW50X3VuaXRzID4gMjggJiYgY3R4LT5udW1fcXVhbnRfdW5pdHMgPCAzMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiBxdWFudGl6YXRpb24gdW5pdHM6ICVkIVxuIiwKKyAgICAgICAgICAgICAgIGN0eC0+bnVtX3F1YW50X3VuaXRzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3R4LT5tdXRlX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgLyogZGVjb2RlIHZhcmlvdXMgc291bmQgcGFyYW1ldGVycyAqLworICAgIGlmICgocmV0ID0gZGVjb2RlX3F1YW50X3dvcmRsZW4oZ2IsIGN0eCwgbnVtX2NoYW5uZWxzLCBhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGN0eC0+bnVtX3N1YmJhbmRzICAgICAgID0gYXRyYWMzcF9xdV90b19zdWJiYW5kW2N0eC0+bnVtX3F1YW50X3VuaXRzIC0gMV0gKyAxOworICAgIGN0eC0+bnVtX2NvZGVkX3N1YmJhbmRzID0gY3R4LT51c2VkX3F1YW50X3VuaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF0cmFjM3BfcXVfdG9fc3ViYmFuZFtjdHgtPnVzZWRfcXVhbnRfdW5pdHMgLSAxXSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKworICAgIGlmICgocmV0ID0gZGVjb2RlX3NjYWxlX2ZhY3RvcnMoZ2IsIGN0eCwgbnVtX2NoYW5uZWxzLCBhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gZGVjb2RlX2NvZGVfdGFibGVfaW5kZXhlcyhnYiwgY3R4LCBudW1fY2hhbm5lbHMsIGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZGVjb2RlX3NwZWN0cnVtKGdiLCBjdHgsIG51bV9jaGFubmVscywgYXZjdHgpOworCisgICAgaWYgKG51bV9jaGFubmVscyA9PSAyKSB7CisgICAgICAgIGdldF9zdWJiYW5kX2ZsYWdzKGdiLCBjdHgtPnN3YXBfY2hhbm5lbHMsIGN0eC0+bnVtX2NvZGVkX3N1YmJhbmRzKTsKKyAgICAgICAgZ2V0X3N1YmJhbmRfZmxhZ3MoZ2IsIGN0eC0+bmVnYXRlX2NvZWZmcywgY3R4LT5udW1fY29kZWRfc3ViYmFuZHMpOworICAgIH0KKworICAgIGRlY29kZV93aW5kb3dfc2hhcGUoZ2IsIGN0eCwgbnVtX2NoYW5uZWxzKTsKKworICAgIGlmICgocmV0ID0gZGVjb2RlX2dhaW5jX2RhdGEoZ2IsIGN0eCwgbnVtX2NoYW5uZWxzLCBhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gZGVjb2RlX3RvbmVzX2luZm8oZ2IsIGN0eCwgbnVtX2NoYW5uZWxzLCBhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGRlY29kZSBnbG9iYWwgbm9pc2UgaW5mbyAqLworICAgIGN0eC0+bm9pc2VfcHJlc2VudCA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKGN0eC0+bm9pc2VfcHJlc2VudCkgeworICAgICAgICBjdHgtPm5vaXNlX2xldmVsX2luZGV4ID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBjdHgtPm5vaXNlX3RhYmxlX2luZGV4ID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMzcGx1cy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMzcGx1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMDAxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdHJhYzNwbHVzLmgKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBBVFJBQzMrIGNvbXBhdGlibGUgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEzIE1heGltIFBvbGlha292c2tpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEdsb2JhbCBzdHJ1Y3R1cmVzLCBjb25zdGFudHMgYW5kIGRhdGEgZm9yIEFUUkFDMysgZGVjb2Rlci4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVRSQUMzUExVU19ICisjZGVmaW5lIEFWQ09ERUNfQVRSQUMzUExVU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJhdHJhYy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorCisvKiogR2xvYmFsIHVuaXQgc2l6ZXMgKi8KKyNkZWZpbmUgQVRSQUMzUF9TVUJCQU5EUyAgICAgICAgMTYgIC8vLzwgbnVtYmVyIG9mIFBRRiBzdWJiYW5kcworI2RlZmluZSBBVFJBQzNQX1NVQkJBTkRfU0FNUExFUyAxMjggLy8vPCBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgc3ViYmFuZAorI2RlZmluZSBBVFJBQzNQX0ZSQU1FX1NBTVBMRVMgICAoQVRSQUMzUF9TVUJCQU5EX1NBTVBMRVMgKiBBVFJBQzNQX1NVQkJBTkRTKQorCisjZGVmaW5lIEFUUkFDM1BfUFFGX0ZJUl9MRU4gICAgIDEyICAvLy88IGxlbmd0aCBvZiB0aGUgcHJvdG90eXBlIEZJUiBvZiB0aGUgUFFGCisKKy8qKiBHbG9iYWwgY29uc3RhbnRzICovCisjZGVmaW5lIEFUUkFDM1BfUE9XRVJfQ09NUF9PRkYgIDE1ICAvLy88IGRpc2FibGUgcG93ZXIgY29tcGVuc2F0aW9uCisKKy8qKiBBVFJBQzMrIGNoYW5uZWwgdW5pdCB0eXBlcyAqLworZW51bSBBdHJhYzNwQ2hhbm5lbFVuaXRUeXBlcyB7CisgICAgQ0hfVU5JVF9NT05PICAgICAgID0gMCwgLy8vPCB1bml0IGNvbnRhaW5pbmcgb25lIGNvZGVkIGNoYW5uZWwKKyAgICBDSF9VTklUX1NURVJFTyAgICAgPSAxLCAvLy88IHVuaXQgY29udGFpbmluZyB0d28gam9pbnRseS1jb2RlZCBjaGFubmVscworICAgIENIX1VOSVRfRVhURU5TSU9OICA9IDIsIC8vLzwgdW5pdCBjb250YWluaW5nIGV4dGVuc2lvbiBpbmZvcm1hdGlvbgorICAgIENIX1VOSVRfVEVSTUlOQVRPUiA9IDMgIC8vLzwgdW5pdCBzZXF1ZW5jZSB0ZXJtaW5hdG9yCit9OworCisvKiogUGVyLWNoYW5uZWwgSVBRRiBoaXN0b3J5ICovCit0eXBlZGVmIHN0cnVjdCBBdHJhYzNwSVBRRkNoYW5uZWxDdHggeworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGJ1ZjEpW0FUUkFDM1BfUFFGX0ZJUl9MRU4gKiAyXVs4XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBidWYyKVtBVFJBQzNQX1BRRl9GSVJfTEVOICogMl1bOF07CisgICAgaW50IHBvczsKK30gQXRyYWMzcElQUUZDaGFubmVsQ3R4OworCisvKiogQW1wbGl0dWRlIGVudmVsb3BlIG9mIGEgZ3JvdXAgb2Ygc2luZSB3YXZlcyAqLwordHlwZWRlZiBzdHJ1Y3QgQXRyYWMzcFdhdmVFbnZlbG9wZSB7CisgICAgaW50IGhhc19zdGFydF9wb2ludDsgICAgLy8vPCBpbmRpY2F0ZXMgc3RhcnQgcG9pbnQgd2l0aGluIHRoZSBHSEEgd2luZG93CisgICAgaW50IGhhc19zdG9wX3BvaW50OyAgICAgLy8vPCBpbmRpY2F0ZXMgc3RvcCBwb2ludCB3aXRoaW4gdGhlIEdIQSB3aW5kb3cKKyAgICBpbnQgc3RhcnRfcG9zOyAgICAgICAgICAvLy88IHN0YXJ0IHBvc2l0aW9uIGV4cHJlc3NlZCBpbiBuKjQgc2FtcGxlcworICAgIGludCBzdG9wX3BvczsgICAgICAgICAgIC8vLzwgc3RvcCAgcG9zaXRpb24gZXhwcmVzc2VkIGluIG4qNCBzYW1wbGVzCit9IEF0cmFjM3BXYXZlRW52ZWxvcGU7CisKKy8qKiBQYXJhbWV0ZXJzIG9mIGEgZ3JvdXAgb2Ygc2luZSB3YXZlcyAqLwordHlwZWRlZiBzdHJ1Y3QgQXRyYWMzcFdhdmVzRGF0YSB7CisgICAgQXRyYWMzcFdhdmVFbnZlbG9wZSBwZW5kX2VudjsgICAvLy88IHBlbmRpbmcgZW52ZWxvcGUgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUKKyAgICBBdHJhYzNwV2F2ZUVudmVsb3BlIGN1cnJfZW52OyAgIC8vLzwgZ3JvdXAgZW52ZWxvcGUgZnJvbSB0aGUgY3VycmVudCBmcmFtZQorICAgIGludCBudW1fd2F2czsgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHNpbmUgd2F2ZXMgaW4gdGhlIGdyb3VwCisgICAgaW50IHN0YXJ0X2luZGV4OyAgICAgICAgLy8vPCBzdGFydCBpbmRleCBpbnRvIGdsb2JhbCB0b25lcyB0YWJsZSBmb3IgdGhhdCBzdWJiYW5kCit9IEF0cmFjM3BXYXZlc0RhdGE7CisKKy8qKiBQYXJhbWV0ZXJzIG9mIGEgc2luZ2xlIHNpbmUgd2F2ZSAqLwordHlwZWRlZiBzdHJ1Y3QgQXRyYWMzcFdhdmVQYXJhbSB7CisgICAgaW50ICAgZnJlcV9pbmRleDsgICAvLy88IHdhdmUgZnJlcXVlbmN5IGluZGV4CisgICAgaW50ICAgYW1wX3NmOyAgICAgICAvLy88IHF1YW50aXplZCBhbXBsaXR1ZGUgc2NhbGUgZmFjdG9yCisgICAgaW50ICAgYW1wX2luZGV4OyAgICAvLy88IHF1YW50aXplZCBhbXBsaXR1ZGUgaW5kZXgKKyAgICBpbnQgICBwaGFzZV9pbmRleDsgIC8vLzwgcXVhbnRpemVkIHBoYXNlIGluZGV4Cit9IEF0cmFjM3BXYXZlUGFyYW07CisKKy8qKiBTb3VuZCBjaGFubmVsIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IEF0cmFjM3BDaGFuUGFyYW1zIHsKKyAgICBpbnQgY2hfbnVtOworICAgIGludCBudW1fY29kZWRfdmFsczsgICAgICAgICAvLy88IG51bWJlciBvZiB0cmFuc21pdHRlZCBxdWFudCB1bml0IHZhbHVlcworICAgIGludCBmaWxsX21vZGU7CisgICAgaW50IHNwbGl0X3BvaW50OworICAgIGludCB0YWJsZV90eXBlOyAgICAgICAgICAgICAvLy88IHRhYmxlIHR5cGU6IDAgLSB0b25lPywgMS0gbm9pc2U/CisgICAgaW50IHF1X3dvcmRsZW5bMzJdOyAgICAgICAgIC8vLzwgYXJyYXkgb2Ygd29yZCBsZW5ndGhzIGZvciBlYWNoIHF1YW50IHVuaXQKKyAgICBpbnQgcXVfc2ZfaWR4WzMyXTsgICAgICAgICAgLy8vPCBhcnJheSBvZiBzY2FsZSBmYWN0b3IgaW5kZXhlcyBmb3IgZWFjaCBxdWFudCB1bml0CisgICAgaW50IHF1X3RhYl9pZHhbMzJdOyAgICAgICAgIC8vLzwgYXJyYXkgb2YgY29kZSB0YWJsZSBpbmRleGVzIGZvciBlYWNoIHF1YW50IHVuaXQKKyAgICBpbnQxNl90IHNwZWN0cnVtWzIwNDhdOyAgICAgLy8vPCBkZWNvZGVkIElNRENUIHNwZWN0cnVtCisgICAgdWludDhfdCBwb3dlcl9sZXZzWzVdOyAgICAgIC8vLzwgcG93ZXIgY29tcGVuc2F0aW9uIGxldmVscworCisgICAgLyogaW1kY3Qgd2luZG93IHNoYXBlIGhpc3RvcnkgKDIgZnJhbWVzKSBmb3Igb3ZlcmxhcHBpbmcuICovCisgICAgdWludDhfdCB3bmRfc2hhcGVfaGlzdFsyXVtBVFJBQzNQX1NVQkJBTkRTXTsgICAgLy8vPCBJTURDVCB3aW5kb3cgc2hhcGUsIDA9c2luZS8xPXN0ZWVwCisgICAgdWludDhfdCAqd25kX3NoYXBlOyAgICAgICAgIC8vLzwgSU1EQ1Qgd2luZG93IHNoYXBlIGZvciBjdXJyZW50IGZyYW1lCisgICAgdWludDhfdCAqd25kX3NoYXBlX3ByZXY7ICAgIC8vLzwgSU1EQ1Qgd2luZG93IHNoYXBlIGZvciBwcmV2aW91cyBmcmFtZQorCisgICAgLyogZ2FpbiBjb250cm9sIGRhdGEgaGlzdG9yeSAoMiBmcmFtZXMpIGZvciBvdmVybGFwcGluZy4gKi8KKyAgICBBdHJhY0dhaW5JbmZvIGdhaW5fZGF0YV9oaXN0WzJdW0FUUkFDM1BfU1VCQkFORFNdOyAgLy8vPCBnYWluIGNvbnRyb2wgZGF0YSBmb3IgYWxsIHN1YmJhbmRzCisgICAgQXRyYWNHYWluSW5mbyAqZ2Fpbl9kYXRhOyAgICAgICAvLy88IGdhaW4gY29udHJvbCBkYXRhIGZvciBuZXh0IGZyYW1lCisgICAgQXRyYWNHYWluSW5mbyAqZ2Fpbl9kYXRhX3ByZXY7ICAvLy88IGdhaW4gY29udHJvbCBkYXRhIGZvciBwcmV2aW91cyBmcmFtZQorICAgIGludCBudW1fZ2Fpbl9zdWJiYW5kczsgICAgICAvLy88IG51bWJlciBvZiBzdWJiYW5kcyB3aXRoIGdhaW4gY29udHJvbCBkYXRhCisKKyAgICAvKiB0b25lcyBkYXRhIGhpc3RvcnkgKDIgZnJhbWVzKSBmb3Igb3ZlcmxhcHBpbmcuICovCisgICAgQXRyYWMzcFdhdmVzRGF0YSB0b25lc19pbmZvX2hpc3RbMl1bQVRSQUMzUF9TVUJCQU5EU107CisgICAgQXRyYWMzcFdhdmVzRGF0YSAqdG9uZXNfaW5mbzsKKyAgICBBdHJhYzNwV2F2ZXNEYXRhICp0b25lc19pbmZvX3ByZXY7Cit9IEF0cmFjM3BDaGFuUGFyYW1zOworCisvKiBQZXItdW5pdCBzaW5lIHdhdmUgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgQXRyYWMzcFdhdmVTeW50aFBhcmFtcyB7CisgICAgaW50IHRvbmVzX3ByZXNlbnQ7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMSAtIHRvbmVzIGluZm8gcHJlc2VudAorICAgIGludCBhbXBsaXR1ZGVfbW9kZTsgICAgICAgICAgICAgICAgICAgICAvLy88IDEgLSBsb3cgcmFuZ2UsIDAgLSBoaWdoIHJhbmdlCisgICAgaW50IG51bV90b25lX2JhbmRzOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIFBRRiBiYW5kcyB3aXRoIHRvbmVzCisgICAgdWludDhfdCB0b25lX3NoYXJpbmdbQVRSQUMzUF9TVUJCQU5EU107IC8vLzwgMSAtIHN1YmJhbmQtd2lzZSB0b25lIHNoYXJpbmcgZmxhZ3MKKyAgICB1aW50OF90IHRvbmVfbWFzdGVyW0FUUkFDM1BfU1VCQkFORFNdOyAgLy8vPCAxIC0gc3ViYmFuZC13aXNlIHRvbmUgY2hhbm5lbCBzd2FwcGluZworICAgIHVpbnQ4X3QgcGhhc2Vfc2hpZnRbQVRSQUMzUF9TVUJCQU5EU107ICAvLy88IDEgLSBzdWJiYW5kLXdpc2UgMTgwwrAgcGhhc2Ugc2hpZnRpbmcKKyAgICBpbnQgdG9uZXNfaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0b3RhbCBzdW0gb2YgdG9uZXMgaW4gdGhpcyB1bml0CisgICAgQXRyYWMzcFdhdmVQYXJhbSB3YXZlc1s0OF07Cit9IEF0cmFjM3BXYXZlU3ludGhQYXJhbXM7CisKKy8qKiBDaGFubmVsIHVuaXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgQXRyYWMzcENoYW5Vbml0Q3R4IHsKKyAgICAvKiBjaGFubmVsIHVuaXQgdmFyaWFibGVzICovCisgICAgaW50IHVuaXRfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdW5pdCB0eXBlIChtb25vL3N0ZXJlbykKKyAgICBpbnQgbnVtX3F1YW50X3VuaXRzOworICAgIGludCBudW1fc3ViYmFuZHM7CisgICAgaW50IHVzZWRfcXVhbnRfdW5pdHM7ICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHF1YW50IHVuaXRzIHdpdGggY29kZWQgc3BlY3RydW0KKyAgICBpbnQgbnVtX2NvZGVkX3N1YmJhbmRzOyAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2Ygc3ViYmFuZHMgd2l0aCBjb2RlZCBzcGVjdHJ1bQorICAgIGludCBtdXRlX2ZsYWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG11dGUgZmxhZworICAgIGludCB1c2VfZnVsbF90YWJsZTsgICAgICAgICAgICAgICAgICAgICAvLy88IDEgLSBmdWxsIHRhYmxlIGxpc3QsIDAgLSByZXN0cmljdGVkIG9uZQorICAgIGludCBub2lzZV9wcmVzZW50OyAgICAgICAgICAgICAgICAgICAgICAvLy88IDEgLSBnbG9iYWwgbm9pc2UgaW5mbyBwcmVzZW50CisgICAgaW50IG5vaXNlX2xldmVsX2luZGV4OyAgICAgICAgICAgICAgICAgIC8vLzwgZ2xvYmFsIG5vaXNlIGxldmVsIGluZGV4CisgICAgaW50IG5vaXNlX3RhYmxlX2luZGV4OyAgICAgICAgICAgICAgICAgIC8vLzwgZ2xvYmFsIG5vaXNlIFJORyB0YWJsZSBpbmRleAorICAgIHVpbnQ4X3Qgc3dhcF9jaGFubmVsc1tBVFJBQzNQX1NVQkJBTkRTXTsgICAgLy8vPCAxIC0gcGVyZm9ybSBzdWJiYW5kLXdpc2UgY2hhbm5lbCBzd2FwcGluZworICAgIHVpbnQ4X3QgbmVnYXRlX2NvZWZmc1tBVFJBQzNQX1NVQkJBTkRTXTsgICAgLy8vPCAxIC0gc3ViYmFuZC13aXNlIElNRENUIGNvZWZmaWNpZW50cyBuZWdhdGlvbgorICAgIEF0cmFjM3BDaGFuUGFyYW1zIGNoYW5uZWxzWzJdOworCisgICAgLyogVmFyaWFibGVzIHJlbGF0ZWQgdG8gR0hBIHRvbmVzICovCisgICAgQXRyYWMzcFdhdmVTeW50aFBhcmFtcyB3YXZlX3N5bnRoX2hpc3RbMl07ICAgICAvLy88IHdhdmVzIHN5bnRoIGhpc3RvcnkgZm9yIHR3byBmcmFtZXMKKyAgICBBdHJhYzNwV2F2ZVN5bnRoUGFyYW1zICp3YXZlc19pbmZvOworICAgIEF0cmFjM3BXYXZlU3ludGhQYXJhbXMgKndhdmVzX2luZm9fcHJldjsKKworICAgIEF0cmFjM3BJUFFGQ2hhbm5lbEN0eCBpcHFmX2N0eFsyXTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBwcmV2X2J1ZilbMl1bQVRSQUMzUF9GUkFNRV9TQU1QTEVTXTsgLy8vPCBvdmVybGFwcGluZyBidWZmZXIKK30gQXRyYWMzcENoYW5Vbml0Q3R4OworCisvKioKKyAqIEluaXRpYWxpemUgVkxDIHRhYmxlcyBmb3IgYml0c3RyZWFtIHBhcnNpbmcuCisgKi8KK3ZvaWQgZmZfYXRyYWMzcF9pbml0X3ZsY3Modm9pZCk7CisKKy8qKgorICogRGVjb2RlIGJpdHN0cmVhbSBkYXRhIG9mIGEgY2hhbm5lbCB1bml0LgorICoKKyAqIEBwYXJhbVtpbl0gICAgIGdiICAgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCB1bml0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgIG51bV9jaGFubmVscyAgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICAgICAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogQHJldHVybiByZXN1bHQgY29kZTogMCA9IE9LLCBvdGhlcndpc2UgLSBlcnJvciBjb2RlCisgKi8KK2ludCBmZl9hdHJhYzNwX2RlY29kZV9jaGFubmVsX3VuaXQoR2V0Qml0Q29udGV4dCAqZ2IsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisvKioKKyAqIEluaXRpYWxpemUgSU1EQ1QgdHJhbnNmb3JtLgorICoKKyAqIEBwYXJhbVtpbl0gICBhdmN0eCAgICAgIHB0ciB0byB0aGUgQVZDb2RlY0NvbnRleHQKKyAqIEBwYXJhbVtpbl0gICBtZGN0X2N0eCAgIHBvaW50ZXIgdG8gTURDVCB0cmFuc2Zvcm0gY29udGV4dAorICovCit2b2lkIGZmX2F0cmFjM3BfaW5pdF9pbWRjdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEZGVENvbnRleHQgKm1kY3RfY3R4KTsKKworLyoqCisgKiBJbml0aWFsaXplIHNpbmUgd2F2ZXMgc3ludGhlc2l6ZXIuCisgKi8KK3ZvaWQgZmZfYXRyYWMzcF9pbml0X3dhdmVfc3ludGgodm9pZCk7CisKKy8qKgorICogU3ludGhlc2l6ZSBzaW5lIHdhdmVzIGZvciBhIHBhcnRpY3VsYXIgc3ViYmFuZC4KKyAqCisgKiBAcGFyYW1baW5dICAgY2hfdW5pdCAgIHBvaW50ZXIgdG8gdGhlIGNoYW5uZWwgdW5pdCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgZmRzcCAgICAgIHBvaW50ZXIgdG8gZmxvYXQgRFNQIGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICBjaF9udW0gICAgd2hpY2ggY2hhbm5lbCB0byBwcm9jZXNzCisgKiBAcGFyYW1baW5dICAgc2IgICAgICAgIHdoaWNoIHN1YmJhbmQgdG8gcHJvY2VzcworICogQHBhcmFtW291dF0gIG91dCAgICAgICByZWNlaXZlcyBwcm9jZXNzZWQgZGF0YQorICovCit2b2lkIGZmX2F0cmFjM3BfZ2VuZXJhdGVfdG9uZXMoQXRyYWMzcENoYW5Vbml0Q3R4ICpjaF91bml0LCBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hfbnVtLCBpbnQgc2IsIGZsb2F0ICpvdXQpOworCisvKioKKyAqIFBlcmZvcm0gcG93ZXIgY29tcGVuc2F0aW9uIGFrYSBub2lzZSBkaXRoZXJpbmcuCisgKgorICogQHBhcmFtW2luXSAgICAgIGN0eCAgICAgICAgIHB0ciB0byB0aGUgY2hhbm5lbCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgICAgY2hfaW5kZXggICAgd2hpY2ggY2hhbm5lbCB0byBwcm9jZXNzCisgKiBAcGFyYW1baW4sb3V0XSAgc3AgICAgICAgICAgcHRyIHRvIGNoYW5uZWwgc3BlY3RydW0gdG8gcHJvY2VzcworICogQHBhcmFtW2luXSAgICAgIHJuZ19pbmRleCAgIGluZGljYXRlcyB3aGljaCBSTkcgdGFibGUgdG8gdXNlCisgKiBAcGFyYW1baW5dICAgICAgc2JfbnVtICAgICAgd2hpY2ggc3ViYmFuZCB0byBwcm9jZXNzCisgKi8KK3ZvaWQgZmZfYXRyYWMzcF9wb3dlcl9jb21wZW5zYXRpb24oQXRyYWMzcENoYW5Vbml0Q3R4ICpjdHgsIGludCBjaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnNwLCBpbnQgcm5nX2luZGV4LCBpbnQgc2JfbnVtKTsKKworLyoqCisgKiBSZWd1bGFyIElNRENUIGFuZCB3aW5kb3dpbmcgd2l0aG91dCBvdmVybGFwcGluZywKKyAqIHdpdGggc3BlY3RydW0gcmV2ZXJzYWwgaW4gdGhlIG9kZCBzdWJiYW5kcy4KKyAqCisgKiBAcGFyYW1baW5dICAgZmRzcCAgICAgICBwb2ludGVyIHRvIGZsb2F0IERTUCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgbWRjdF9jdHggICBwb2ludGVyIHRvIE1EQ1QgdHJhbnNmb3JtIGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICBwSW4gICAgICAgIGZsb2F0IGlucHV0CisgKiBAcGFyYW1bb3V0XSAgcE91dCAgICAgICBmbG9hdCBvdXRwdXQKKyAqIEBwYXJhbVtpbl0gICB3aW5kX2lkICAgIHdoaWNoIE1EQ1Qgd2luZG93IHRvIGFwcGx5CisgKiBAcGFyYW1baW5dICAgc2IgICAgICAgICBzdWJiYW5kIG51bWJlcgorICovCit2b2lkIGZmX2F0cmFjM3BfaW1kY3QoQVZGbG9hdERTUENvbnRleHQgKmZkc3AsIEZGVENvbnRleHQgKm1kY3RfY3R4LCBmbG9hdCAqcEluLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpwT3V0LCBpbnQgd2luZF9pZCwgaW50IHNiKTsKKworLyoqCisgKiBTdWJiYW5kIHN5bnRoZXNpcyBmaWx0ZXIgYmFzZWQgb24gdGhlIHBvbHlwaGFzZSBxdWFkcmF0dXJlIChwc2V1ZG8tUU1GKQorICogZmlsdGVyIGJhbmsuCisgKgorICogQHBhcmFtW2luXSAgICAgIGRjdF9jdHggICBwdHIgdG8gdGhlIHByZS1pbml0aWFsaXplZCBJRENUIGNvbnRleHQKKyAqIEBwYXJhbVtpbixvdXRdICBoaXN0ICAgICAgcHRyIHRvIHRoZSBmaWx0ZXIgaGlzdG9yeQorICogQHBhcmFtW2luXSAgICAgIGluICAgICAgICBpbnB1dCBkYXRhIHRvIHByb2Nlc3MKKyAqIEBwYXJhbVtvdXRdICAgICBvdXQgICAgICAgcmVjZWl2ZXMgcHJvY2Vzc2VkIGRhdGEKKyAqLwordm9pZCBmZl9hdHJhYzNwX2lwcWYoRkZUQ29udGV4dCAqZGN0X2N0eCwgQXRyYWMzcElQUUZDaGFubmVsQ3R4ICpoaXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluLCBmbG9hdCAqb3V0KTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX2F0cmFjM3BfcXVfdG9fc3BlY19wb3NbMzNdOworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX2F0cmFjM3Bfc2ZfdGFiWzY0XTsKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9hdHJhYzNwX21hbnRfdGFiWzhdOworCisjZW5kaWYgLyogQVZDT0RFQ19BVFJBQzNQTFVTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F0cmFjM3BsdXNfZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMzcGx1c19kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExMDdlZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F0cmFjM3BsdXNfZGF0YS5oCkBAIC0wLDAgKzEsMTkxNCBAQAorLyoKKyAqIEFUUkFDMysgY29tcGF0aWJsZSBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTMgTWF4aW0gUG9saWFrb3Zza2kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FUUkFDM1BMVVNfREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfQVRSQUMzUExVU19EQVRBX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiogVkxDIHRhYmxlcyBmb3Igd29yZGxlbiAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF93bF9odWZmX2NvZGUxWzNdID0geyAwLCAyLCAzIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3Bfd2xfaHVmZl9iaXRzMVszXSA9IHsgMSwgMiwgMiB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX3dsX2h1ZmZfeGxhdDFbM10gPSB7IDAsIDEsIDcgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF93bF9odWZmX2NvZGUyWzVdID0geyAwLCA0LCA1LCA2LCA3IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3Bfd2xfaHVmZl9iaXRzMls1XSA9IHsgMSwgMywgMywgMywgMyB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX3dsX2h1ZmZfeGxhdDJbNV0gPSB7IDAsIDEsIDIsIDYsIDcgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF93bF9odWZmX2NvZGUzWzhdID0geworICAgIDAsIDQsIDB4QywgMHgxRSwgMHgxRiwgMHhELCAweEUsIDUKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3Bfd2xfaHVmZl9iaXRzM1s4XSA9IHsgMSwgMywgNCwgNSwgNSwgNCwgNCwgMyB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX3dsX2h1ZmZfY29kZTRbOF0gPSB7CisgICAgMCwgNCwgMHhDLCAweEQsIDB4MUUsIDB4MUYsIDB4RSwgNQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF93bF9odWZmX2JpdHM0WzhdID0geyAxLCAzLCA0LCA0LCA1LCA1LCA0LCAzIH07CisKKy8qKiBWTEMgdGFibGVzIGZvciBzY2FsZSBmYWN0b3IgaW5kZXhlcyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGF0cmFjM3Bfc2ZfaHVmZl9jb2RlMVs2NF0gPSB7CisgICAgICAgIDAsICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LCAgIDB4QywgICAweEQsICAweEUwLAorICAgICAweEUxLCAgMHhFMiwgIDB4RTMsICAweEU0LCAgMHhFNSwgIDB4RTYsIDB4MUNFLCAweDFDRiwKKyAgICAweDFEMCwgMHgxRDEsIDB4MUQyLCAweDFEMywgMHgxRDQsIDB4MUQ1LCAweDFENiwgMHgxRDcsCisgICAgMHgxRDgsIDB4MUQ5LCAweDFEQSwgMHgxREIsIDB4MURDLCAweDFERCwgMHgxREUsIDB4MURGLAorICAgIDB4MUUwLCAweDFFMSwgMHgxRTIsIDB4MUUzLCAweDFFNCwgMHgxRTUsIDB4MUU2LCAweDFFNywKKyAgICAweDFFOCwgMHgxRTksIDB4MUVBLCAweDFFQiwgMHgxRUMsIDB4MUVELCAweDFFRSwgMHgxRUYsCisgICAgMHgxRjAsIDB4MUYxLCAweDFGMiwgMHgxRjMsIDB4MUY0LCAweDFGNSwgMHgxRjYsIDB4MUY3LAorICAgIDB4MUY4LCAweDFGOSwgMHgxRkEsIDB4MUZCLCAweDFGQywgMHgxRkQsIDB4MUZFLCAweDFGRgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9zZl9odWZmX2JpdHMxWzY0XSA9IHsKKyAgICAyLCAzLCAzLCAzLCAzLCA0LCA0LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA5LCA5LAorICAgIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksCisgICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX3NmX2h1ZmZfeGxhdDFbNjRdID0geworICAgICAwLCAgMSwgNjEsIDYyLCA2MywgIDIsIDYwLCAgMywgIDQsICA1LCAgNiwgNTcsIDU4LCA1OSwgIDcsICA4LAorICAgICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAorICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLAorICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX3NmX2h1ZmZfeGxhdDJbNjRdID0geworICAgIDAsICAgMSwgIDIsIDYyLCA2MywgIDMsIDYxLCAgNCwgIDUsICA2LCA1NywgNTgsIDU5LCA2MCwgIDcsICA4LAorICAgIDksICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAorICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLAorICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYXRyYWMzcF9zZl9odWZmX2NvZGUyWzY0XSA9IHsKKyAgICAgICAgMCwgICAgIDQsICAweDE4LCAgMHgxOSwgIDB4NzAsIDB4MUNBLCAweDFDQiwgMHgxQ0MsCisgICAgMHgxQ0QsIDB4MUNFLCAweDFDRiwgMHgxRDAsIDB4MUQxLCAweDFEMiwgMHgxRDMsIDB4MUQ0LAorICAgIDB4MUQ1LCAweDFENiwgMHgxRDcsIDB4MUQ4LCAweDFEOSwgMHgxREEsIDB4MURCLCAweDFEQywKKyAgICAweDFERCwgMHgxREUsIDB4MURGLCAweDFFMCwgMHgxRTEsIDB4MUUyLCAweDFFMywgMHgxRTQsCisgICAgMHgxRTUsIDB4MUU2LCAweDFFNywgMHgxRTgsIDB4MUU5LCAweDFFQSwgMHgxRUIsIDB4MUVDLAorICAgIDB4MUVELCAweDFFRSwgMHgxRUYsIDB4MUYwLCAweDFGMSwgMHgxRjIsIDB4MUYzLCAweDFGNCwKKyAgICAweDFGNSwgMHgxRjYsIDB4MUY3LCAweDFGOCwgMHgxRjksIDB4MUZBLCAweDFGQiwgMHgxRkMsCisgICAgMHgxRkQsIDB4MUZFLCAweDFGRiwgIDB4RTQsICAweDcxLCAgMHgxQSwgIDB4MUIsICAgICA1Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX3NmX2h1ZmZfYml0czJbNjRdID0geworICAgIDEsIDMsIDUsIDUsIDcsIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksCisgICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorICAgIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDgsIDcsIDUsIDUsIDMKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhdHJhYzNwX3NmX2h1ZmZfY29kZTNbNjRdID0geworICAgICAgICAwLCAgICAgMiwgICAgIDMsICAweDE4LCAgMHgxOSwgIDB4NzAsIDB4MUNDLCAweDFDRCwKKyAgICAweDFDRSwgMHgxQ0YsIDB4MUQwLCAweDFEMSwgMHgxRDIsIDB4MUQzLCAweDFENCwgMHgxRDUsCisgICAgMHgxRDYsIDB4MUQ3LCAweDFEOCwgMHgxRDksIDB4MURBLCAweDFEQiwgMHgxREMsIDB4MURELAorICAgIDB4MURFLCAweDFERiwgMHgxRTAsIDB4MUUxLCAweDFFMiwgMHgxRTMsIDB4MUU0LCAweDFFNSwKKyAgICAweDFFNiwgMHgxRTcsIDB4MUU4LCAweDFFOSwgMHgxRUEsIDB4MUVCLCAweDFFQywgMHgxRUQsCisgICAgMHgxRUUsIDB4MUVGLCAweDFGMCwgMHgxRjEsIDB4MUYyLCAweDFGMywgMHgxRjQsIDB4MUY1LAorICAgIDB4MUY2LCAweDFGNywgMHgxRjgsIDB4MUY5LCAweDFGQSwgMHgxRkIsIDB4MUZDLCAweDFGRCwKKyAgICAweDFGRSwgMHgxRkYsICAweDcxLCAgMHg3MiwgIDB4MUEsICAweDFCLCAgICAgNCwgICAgIDUKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3Bfc2ZfaHVmZl9iaXRzM1s2NF0gPSB7CisgICAgMiwgMywgMywgNSwgNSwgNywgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorICAgIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksCisgICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgNywgNywgNSwgNSwgMywgMworfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGF0cmFjM3Bfc2ZfaHVmZl9jb2RlNFsxNl0gPSB7CisgICAgMCwgMiwgMywgNCwgNSwgMHhDLCAweEQsIDB4MzgsIDB4MzksIDB4M0EsIDB4M0IsIDB4M0MsIDAsIDB4M0QsIDB4M0UsIDB4M0YKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3Bfc2ZfaHVmZl9iaXRzNFsxNl0gPSB7CisgICAgMiwgMywgMywgMywgMywgNCwgNCwgNiwgNiwgNiwgNiwgNiwgMCwgNiwgNiwgNgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9zZl9odWZmX3hsYXQ0WzE2XSA9IHsKKyAgICAwLCAxLCAxMywgMTQsIDE1LCAyLCAxMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX3NmX2h1ZmZfeGxhdDVbMTZdID0geworICAgIDAsIDEsIDIsIDE0LCAxNSwgMywgMTMsIDQsIDUsIDYsIDcsIDksIDgsIDEwLCAxMSwgMTIKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhdHJhYzNwX3NmX2h1ZmZfY29kZTVbMTZdID0geworICAgIDAsICAgIDQsICAweEMsIDB4MUMsIDB4NzgsIDB4NzksIDB4N0EsIDB4N0IsCisgICAgMCwgMHg3QywgMHg3RCwgMHg3RSwgMHg3RiwgMHgxRCwgMHhELCAgICAgNQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9zZl9odWZmX2JpdHM1WzE2XSA9IHsKKyAgICAxLCAzLCA0LCA1LCA3LCA3LCA3LCA3LCAwLCA3LCA3LCA3LCA3LCA1LCA0LCAzCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYXRyYWMzcF9zZl9odWZmX2NvZGU2WzE2XSA9IHsKKyAgICAwLCAyLCAzLCAweEMsIDB4MUMsIDB4M0MsIDB4N0MsIDB4N0QsIDAsIDB4N0UsIDB4N0YsIDB4M0QsIDB4MUQsIDB4RCwgNCwgNQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9zZl9odWZmX2JpdHM2WzE2XSA9IHsKKyAgICAyLCAzLCAzLCA0LCA1LCA2LCA3LCA3LCAwLCA3LCA3LCA2LCA1LCA0LCAzLCAzCit9OworCisvKiogVkxDIHRhYmxlcyBmb3IgY29kZSB0YWJsZSBpbmRleGVzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX2N0X2h1ZmZfY29kZTFbNF0gPSB7IDAsIDIsIDYsIDcgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9jdF9odWZmX2JpdHMxWzRdID0geyAxLCAyLCAzLCAzIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfY3RfaHVmZl9jb2RlMls4XSA9IHsgMCwgMiwgMywgNCwgNSwgNiwgMHhFLCAweEYgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9jdF9odWZmX2JpdHMyWzhdID0geyAyLCAzLCAzLCAzLCAzLCAzLCA0LCA0IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfY3RfaHVmZl94bGF0MVs4XSA9IHsgMCwgMSwgMiwgMywgNiwgNywgNCwgNSB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX2N0X2h1ZmZfY29kZTNbOF0gPSB7CisgICAgMCwgNCwgMHhBLCAweEIsIDB4QywgMHhELCAweEUsIDB4RgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9jdF9odWZmX2JpdHMzWzhdID0geyAxLCAzLCA0LCA0LCA0LCA0LCA0LCA0IH07CisKKy8qIHdlaWdodHMgZm9yIHF1YW50aXplZCB3b3JkIGxlbmd0aHMgKi8KK3N0YXRpYyBjb25zdCBpbnQ4X3QgYXRyYWMzcF93bF93ZWlnaHRzWzZdWzMyXSA9IHsKKyAgICB7IDUsIDUsIDQsIDQsIDMsIDMsIDIsIDIsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgeyA1LCA1LCA1LCA0LCA0LCA0LCAzLCAzLCAzLCAyLCAyLCAyLCAxLCAxLCAxLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgNiwgNSwgNSwgNSwgNCwgNCwgNCwgNCwgMywgMywgMywgMywgMiwgMiwgMSwgMSwKKyAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDUsIDUsIDQsIDQsIDMsIDMsIDIsIDIsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgeyA1LCA1LCA1LCA0LCA0LCA0LCAzLCAzLCAzLCAyLCAyLCAyLCAxLCAxLCAxLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgNiwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgMywgMywgMywgMywgMiwgMiwgMSwgMSwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfQorfTsKKworLyogd2VpZ2h0cyBmb3IgcXVhbnRpemVkIHNjYWxlIGZhY3RvcnMKKyAqIHNmX3dlaWdodHNbaV0gPSBpIC8gKHRhYl9pZHggKyAxKQorICogd2hlcmUgdGFiX2lkeCA9IFsxLDJdICovCitzdGF0aWMgY29uc3QgaW50OF90IGF0cmFjM3Bfc2Zfd2VpZ2h0c1syXVszMl0gPSB7CisgICAgeyAwLCAwLCAxLCAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LAorICAgICAgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSB9LAorICAgIHsgMCwgMCwgMCwgMSwgMSwgMSwgMiwgMiwgMiwgMywgMywgMywgNCwgNCwgIDQsICA1LAorICAgICAgNSwgNSwgNiwgNiwgNiwgNywgNywgNywgOCwgOCwgOCwgOSwgOSwgOSwgMTAsIDEwIH0KK307CisKKy8qKiBVbmdyb3VwIHRhYmxlIGZvciB3b3JkIGxlbmd0aCBzZWdtZW50cy4KKyAqICBOdW1iZXJzIGluIHRoaXMgdGFibGUgdGVsbCB3aGljaCBjb2VmZiBiZWxvbmdzIHRvIHdoaWNoIHNlZ21lbnQuICovCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX3F1X251bV90b19zZWdbMzJdID0geworICAgIDAsIDAsIDAsIDEsIDEsIDEsIDIsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDUsCisgICAgNSwgNSwgNiwgNiwgNiwgNywgNywgNywgOCwgOCwgOCwgOSwgOSwgOSwgOSwgOQorfTsKKworLyoqIE1hcCBxdWFudCB1bml0IG51bWJlciB0byBzdWJiYW5kIG51bWJlciAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9xdV90b19zdWJiYW5kWzMyXSA9IHsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAgMSwgIDEsICAyLCAgMiwgIDIsIDIsCisgICAgMywgMywgNCwgNCwgNSwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorfTsKKworLyoqIE1hcCBzdWJiYW5kIG51bWJlciB0byBudW1iZXIgb2YgcG93ZXIgY29tcGVuc2F0aW9uIGdyb3VwcyAqLworc3RhdGljIGNvbnN0IGludCBhdHJhYzNwX3N1YmJhbmRfdG9fbnVtX3Bvd2dycHNbMTZdID0geworICAgIDEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDUKK307CisKKy8qKiAzRCBiYXNlIHNoYXBlIHRhYmxlcy4gVGhlIHZhbHVlcyBhcmUgZ3JvdXBlZCB0b2dldGhlciBhcyBmb2xsb3dzOgorICogIFtudW1fc3RhcnRfdmFsdWVzID0gOF1bbnVtX3NoYXBlX3RhYmxlcyA9IDE2XVtudW1fc2VnX2NvZWZmcyA9IDldCisgKiAgRm9yIGVhY2ggb2YgdGhlIDggc3RhcnQgdmFsdWVzIHRoZXJlIGFyZSAxNiBkaWZmZXJlbnQgc2hhcGVzIGVhY2gKKyAqICA5IGNvZWZmaWNpZW50cyBsb25nLiAqLworc3RhdGljIGNvbnN0IGludDhfdCBhdHJhYzNwX3dsX3NoYXBlc1s4XVsxNl1bOV0gPSB7CisgICAgeyB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAtMiwgLTEgfSwKKyAgICAgIHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC01LCAtMSB9LAorICAgICAgeyAgMCwgIDAsICAwLCAtNywgIDAsICAwLCAgMCwgIDAsICAwIH0sCisgICAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgLTcsICAwLCAgMCwgIDAgfSwKKyAgICAgIHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTUsICAwLCAgMCB9LAorICAgICAgeyAgMCwgIDAsICAwLCAgMCwgLTUsICAwLCAgMCwgIDAsICAwIH0sCisgICAgICB7IC03LCAtNywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICAgIHsgIDAsIC03LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCB9LAorICAgICAgeyAtMiwgLTIsIC01LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwIH0sCisgICAgICB7ICAwLCAgMCwgIDAsIC0yLCAtNSwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICAgIHsgIDAsICAwLCAgMCwgIDAsICAwLCAtMiwgLTUsICAwLCAgMCB9LAorICAgICAgeyAgMCwgIDAsICAwLCAtNSwgIDAsICAwLCAgMCwgIDAsICAwIH0sCisgICAgICB7ICAwLCAtMiwgLTcsIC0yLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICAgIHsgIDAsICAwLCAgMCwgIDAsIC0yLCAtNSwgIDAsICAwLCAgMCB9LAorICAgICAgeyAgMCwgIDAsICAwLCAtNSwgLTUsICAwLCAgMCwgIDAsICAwIH0sCisgICAgICB7ICAwLCAgMCwgIDAsIC01LCAtMiwgIDAsICAwLCAgMCwgIDAgfSB9LAorICAgIHsgeyAtMSwgLTUsIC0zLCAtMiwgLTEsIC0xLCAgMCwgIDAsICAwIH0sCisgICAgICB7IC0yLCAtNSwgLTMsIC0zLCAtMiwgLTEsIC0xLCAgMCwgIDAgfSwKKyAgICAgIHsgIDAsIC0xLCAtMSwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCB9LAorICAgICAgeyAtMSwgLTMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwIH0sCisgICAgICB7IC0xLCAtMiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICAgIHsgLTEsIC0zLCAtMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSB9LAorICAgICAgeyAtMSwgLTUsIC0zLCAtMywgLTIsIC0xLCAgMCwgIDAsICAwIH0sCisgICAgICB7IC0xLCAtMSwgLTQsIC0yLCAtMiwgLTEsIC0xLCAgMCwgIDAgfSwKKyAgICAgIHsgLTEsIC0xLCAtMywgLTIsIC0zLCAtMSwgLTEsIC0xLCAgMCB9LAorICAgICAgeyAtMSwgLTQsIC0yLCAtMywgLTEsICAwLCAgMCwgIDAsICAwIH0sCisgICAgICB7ICAwLCAtMSwgLTIsIC0yLCAtMSwgLTEsICAwLCAgMCwgIDAgfSwKKyAgICAgIHsgIDAsIC0yLCAtMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCB9LAorICAgICAgeyAtMSwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwIH0sCisgICAgICB7IC0xLCAtMSwgLTMsIC0yLCAtMiwgLTEsIC0xLCAtMSwgIDAgfSwKKyAgICAgIHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCB9LAorICAgICAgeyAgMCwgLTEsIC0zLCAtMiwgLTIsIC0xLCAtMSwgLTEsICAwIH0sIH0sCisgICAgeyB7IC0xLCAtMiwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEgfSwKKyAgICAgIHsgIDAsIC0xLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSB9LAorICAgICAgeyAgMCwgLTIsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxIH0sCisgICAgICB7ICAwLCAtMiwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEgfSwKKyAgICAgIHsgLTEsIC0xLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSB9LAorICAgICAgeyAgMCwgIDAsIC0xLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxIH0sCisgICAgICB7IC0xLCAtMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEgfSwKKyAgICAgIHsgIDAsICAwLCAtMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSB9LAorICAgICAgeyAgMCwgLTEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxIH0sCisgICAgICB7IC0xLCAtMSwgLTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEgfSwKKyAgICAgIHsgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSB9LAorICAgICAgeyAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxIH0sCisgICAgICB7ICAwLCAtMSwgLTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEgfSwKKyAgICAgIHsgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSB9LAorICAgICAgeyAgMCwgLTMsIC0yLCAgMSwgIDEsICAxLCAgMSwgIDIsICAyIH0sCisgICAgICB7IC0zLCAtNSwgLTMsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIgfSwgfSwKKyAgICB7IHsgLTEsIC0yLCAgMCwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiB9LAorICAgICAgeyAtMSwgLTIsICAwLCAgMSwgIDIsICAyLCAgMiwgIDIsICAyIH0sCisgICAgICB7ICAwLCAtMiwgIDAsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIgfSwKKyAgICAgIHsgLTEsICAwLCAgMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiB9LAorICAgICAgeyAgMCwgIDAsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyIH0sCisgICAgICB7ICAwLCAtMiwgIDAsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIgfSwKKyAgICAgIHsgIDAsIC0xLCAgMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiB9LAorICAgICAgeyAtMSwgLTEsICAwLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyIH0sCisgICAgICB7IC0xLCAtMSwgIDAsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIgfSwKKyAgICAgIHsgLTEsIC0yLCAtMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiB9LAorICAgICAgeyAgMCwgLTEsICAwLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyIH0sCisgICAgICB7ICAxLCAgMSwgIDAsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIgfSwKKyAgICAgIHsgIDAsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiB9LAorICAgICAgeyAgMSwgIDAsICAwLCAgMSwgIDIsICAyLCAgMiwgIDIsICAyIH0sCisgICAgICB7ICAwLCAgMCwgIDAsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIgfSwKKyAgICAgIHsgLTEsIC0xLCAtMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMiB9LCB9LAorICAgIHsgeyAgMCwgIDEsICAyLCAgMywgIDMsICAzLCAgMywgIDMsICAzIH0sCisgICAgICB7ICAxLCAgMSwgIDIsICAzLCAgMywgIDMsICAzLCAgMywgIDMgfSwKKyAgICAgIHsgLTEsICAwLCAgMSwgIDIsICAzLCAgMywgIDMsICAzLCAgMyB9LAorICAgICAgeyAgMCwgIDAsICAyLCAgMywgIDMsICAzLCAgMywgIDMsICAzIH0sCisgICAgICB7IC0xLCAgMCwgIDEsICAzLCAgMywgIDMsICAzLCAgMywgIDMgfSwKKyAgICAgIHsgIDAsICAwLCAgMSwgIDMsICAzLCAgMywgIDMsICAzLCAgMyB9LAorICAgICAgeyAgMSwgIDIsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzIH0sCisgICAgICB7ICAxLCAgMiwgIDIsICAzLCAgMywgIDMsICAzLCAgMywgIDMgfSwKKyAgICAgIHsgIDAsICAxLCAgMSwgIDMsICAzLCAgMywgIDMsICAzLCAgMyB9LAorICAgICAgeyAgMCwgIDAsICAxLCAgMiwgIDMsICAzLCAgMywgIDMsICAzIH0sCisgICAgICB7IC0xLCAgMSwgIDIsICAzLCAgMywgIDMsICAzLCAgMywgIDMgfSwKKyAgICAgIHsgLTEsICAwLCAgMiwgIDMsICAzLCAgMywgIDMsICAzLCAgMyB9LAorICAgICAgeyAgMiwgIDIsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzIH0sCisgICAgICB7ICAxLCAgMSwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMgfSwKKyAgICAgIHsgIDAsICAyLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMyB9LAorICAgICAgeyAgMCwgIDEsICAxLCAgMiwgIDMsICAzLCAgMywgIDMsICAzIH0sIH0sCisgICAgeyB7ICAwLCAgMSwgIDIsICAzLCAgNCwgIDQsICA0LCAgNCwgIDQgfSwKKyAgICAgIHsgIDEsICAyLCAgMywgIDQsICA0LCAgNCwgIDQsICA0LCAgNCB9LAorICAgICAgeyAgMCwgIDAsICAyLCAgMywgIDQsICA0LCAgNCwgIDQsICA0IH0sCisgICAgICB7ICAxLCAgMSwgIDIsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQgfSwKKyAgICAgIHsgIDAsICAxLCAgMiwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCB9LAorICAgICAgeyAtMSwgIDAsICAxLCAgMywgIDQsICA0LCAgNCwgIDQsICA0IH0sCisgICAgICB7ICAwLCAgMCwgIDEsICAzLCAgNCwgIDQsICA0LCAgNCwgIDQgfSwKKyAgICAgIHsgIDEsICAxLCAgMiwgIDMsICA0LCAgNCwgIDQsICA0LCAgNCB9LAorICAgICAgeyAgMCwgIDEsICAxLCAgMywgIDQsICA0LCAgNCwgIDQsICA0IH0sCisgICAgICB7ICAyLCAgMiwgIDMsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQgfSwKKyAgICAgIHsgIDEsICAxLCAgMywgIDQsICA0LCAgNCwgIDQsICA0LCAgNCB9LAorICAgICAgeyAgMSwgIDIsICAyLCAgNCwgIDQsICA0LCAgNCwgIDQsICA0IH0sCisgICAgICB7IC0xLCAgMCwgIDIsICAzLCAgNCwgIDQsICA0LCAgNCwgIDQgfSwKKyAgICAgIHsgIDAsICAxLCAgMywgIDQsICA0LCAgNCwgIDQsICA0LCAgNCB9LAorICAgICAgeyAgMSwgIDIsICAyLCAgMywgIDQsICA0LCAgNCwgIDQsICA0IH0sCisgICAgICB7ICAwLCAgMiwgIDMsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQgfSwgfSwKKyAgICB7IHsgIDEsICAyLCAgMywgIDQsICA1LCAgNSwgIDUsICA1LCAgNSB9LAorICAgICAgeyAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNSwgIDUsICA1IH0sCisgICAgICB7ICAwLCAgMSwgIDIsICAzLCAgNSwgIDUsICA1LCAgNSwgIDUgfSwKKyAgICAgIHsgIDEsICAxLCAgMywgIDQsICA1LCAgNSwgIDUsICA1LCAgNSB9LAorICAgICAgeyAgMSwgIDEsICAyLCAgNCwgIDUsICA1LCAgNSwgIDUsICA1IH0sCisgICAgICB7ICAxLCAgMiwgIDIsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUgfSwKKyAgICAgIHsgIDEsICAxLCAgMiwgIDMsICA1LCAgNSwgIDUsICA1LCAgNSB9LAorICAgICAgeyAgMiwgIDIsICAzLCAgNCwgIDUsICA1LCAgNSwgIDUsICA1IH0sCisgICAgICB7ICAwLCAgMSwgIDIsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUgfSwKKyAgICAgIHsgIDIsICAyLCAgMywgIDUsICA1LCAgNSwgIDUsICA1LCAgNSB9LAorICAgICAgeyAgMSwgIDIsICAzLCAgNSwgIDUsICA1LCAgNSwgIDUsICA1IH0sCisgICAgICB7ICAwLCAgMSwgIDMsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUgfSwKKyAgICAgIHsgIDEsICAyLCAgMiwgIDMsICA1LCAgNSwgIDUsICA1LCAgNSB9LAorICAgICAgeyAgMiwgIDMsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1IH0sCisgICAgICB7ICAwLCAgMiwgIDMsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUgfSwKKyAgICAgIHsgIDEsICAxLCAgMSwgIDMsICA0LCAgNSwgIDUsICA1LCAgNSB9LCB9LAorICAgIHsgeyAgMSwgIDIsICAzLCAgNCwgIDUsICA1LCAgNSwgIDYsICA2IH0sCisgICAgICB7ICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA2LCAgNiwgIDYgfSwKKyAgICAgIHsgIDIsICAzLCAgNCwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiB9LAorICAgICAgeyAgMSwgIDIsICAzLCAgNCwgIDYsICA2LCAgNiwgIDYsICA2IH0sCisgICAgICB7ICAyLCAgMiwgIDMsICA0LCAgNSwgIDUsICA1LCAgNiwgIDYgfSwKKyAgICAgIHsgIDEsICAyLCAgMywgIDQsICA1LCAgNSwgIDYsICA2LCAgNiB9LAorICAgICAgeyAgMiwgIDIsICAzLCAgNCwgIDYsICA2LCAgNiwgIDYsICA2IH0sCisgICAgICB7ICAyLCAgMiwgIDMsICA0LCAgNSwgIDYsICA2LCAgNiwgIDYgfSwKKyAgICAgIHsgIDIsICAyLCAgNCwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiB9LAorICAgICAgeyAgMiwgIDIsICAzLCAgNSwgIDYsICA2LCAgNiwgIDYsICA2IH0sCisgICAgICB7ICAxLCAgMiwgIDMsICA1LCAgNiwgIDYsICA2LCAgNiwgIDYgfSwKKyAgICAgIHsgIDIsICAzLCAgMywgIDUsICA2LCAgNiwgIDYsICA2LCAgNiB9LAorICAgICAgeyAgMSwgIDIsICA0LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2IH0sCisgICAgICB7ICAyLCAgMiwgIDMsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYgfSwKKyAgICAgIHsgIDIsICAzLCAgMywgIDQsICA2LCAgNiwgIDYsICA2LCAgNiB9LAorICAgICAgeyAgMSwgIDMsICA0LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2IH0gfQorfTsKKworLyoqIDJEIGJhc2Ugc2hhcGUgdGFibGVzIGZvciBzY2FsZSBmYWN0b3IgY29kaW5nLgorICogIFRoZSB2YWx1ZXMgYXJlIGdyb3VwZWQgdG9nZXRoZXIgYXMgZm9sbG93czoKKyAqICBbbnVtX3NoYXBlX3RhYmxlcyA9IDY0XVtudW1fc2VnX2NvZWZmcyA9IDldICovCitzdGF0aWMgY29uc3QgaW50OF90IGF0cmFjM3Bfc2Zfc2hhcGVzWzY0XVs5XSA9IHsKKyAgICB7IC0zLCAtMiwgLTEsICAwLCAgMywgIDUsICA2LCAgOCwgNDAgfSwKKyAgICB7IC0zLCAtMiwgIDAsICAxLCAgNywgIDksIDExLCAxMywgMjAgfSwKKyAgICB7IC0xLCAgMCwgIDAsICAxLCAgNiwgIDgsIDEwLCAxMywgNDEgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAyLCAgNSwgIDUsICA2LCAgOCwgMTQgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAyLCAgNiwgIDcsICA4LCAxMSwgNDcgfSwKKyAgICB7ICAwLCAgMCwgIDEsICAyLCAgNSwgIDcsICA4LCAxMCwgMzIgfSwKKyAgICB7ICAwLCAgMCwgIDEsICAzLCAgOCwgMTAsIDEyLCAxNCwgNDcgfSwKKyAgICB7ICAwLCAgMCwgIDIsICA0LCAgOSwgMTAsIDEyLCAxNCwgNDAgfSwKKyAgICB7ICAwLCAgMCwgIDMsICA1LCAgOSwgMTAsIDEyLCAxNCwgMjIgfSwKKyAgICB7ICAwLCAgMSwgIDMsICA1LCAxMCwgMTQsIDE4LCAyMiwgMzEgfSwKKyAgICB7ICAwLCAgMiwgIDUsICA2LCAxMCwgMTAsIDEwLCAxMiwgNDYgfSwKKyAgICB7ICAwLCAgMiwgIDUsICA3LCAxMiwgMTQsIDE1LCAxOCwgNDQgfSwKKyAgICB7ICAxLCAgMSwgIDQsICA1LCAgNywgIDcsICA4LCAgOSwgMTUgfSwKKyAgICB7ICAxLCAgMiwgIDIsICAyLCAgNCwgIDUsICA3LCAgOSwgMjYgfSwKKyAgICB7ICAxLCAgMiwgIDIsICAzLCAgNiwgIDcsICA3LCAgOCwgNDcgfSwKKyAgICB7ICAxLCAgMiwgIDIsICAzLCAgNiwgIDgsIDEwLCAxMywgMjIgfSwKKyAgICB7ICAxLCAgMywgIDQsICA3LCAxMywgMTcsIDIxLCAyNCwgNDEgfSwKKyAgICB7ICAxLCAgNCwgIDAsICA0LCAxMCwgMTIsIDEzLCAxNCwgMTcgfSwKKyAgICB7ICAyLCAgMywgIDMsICAzLCAgNiwgIDgsIDEwLCAxMywgNDggfSwKKyAgICB7ICAyLCAgMywgIDMsICA0LCAgOSwgMTIsIDE0LCAxNywgNDcgfSwKKyAgICB7ICAyLCAgMywgIDMsICA1LCAxMCwgMTIsIDE0LCAxNywgMjUgfSwKKyAgICB7ICAyLCAgMywgIDUsICA3LCAgOCwgIDksICA5LCAgOSwgMTMgfSwKKyAgICB7ICAyLCAgMywgIDUsICA5LCAxNiwgMjEsIDI1LCAyOCwgMzMgfSwKKyAgICB7ICAyLCAgNCwgIDUsICA4LCAxMiwgMTQsIDE3LCAxOSwgMjYgfSwKKyAgICB7ICAyLCAgNCwgIDYsICA4LCAxMiwgMTMsIDEzLCAxNSwgMjAgfSwKKyAgICB7ICAyLCAgNCwgIDcsIDEyLCAyMCwgMjYsIDMwLCAzMiwgMzUgfSwKKyAgICB7ICAzLCAgMywgIDUsICA2LCAxMiwgMTQsIDE2LCAxOSwgMzQgfSwKKyAgICB7ICAzLCAgNCwgIDQsICA1LCAgNywgIDksIDEwLCAxMSwgNDggfSwKKyAgICB7ICAzLCAgNCwgIDUsICA2LCAgOCwgIDksIDEwLCAxMSwgMTYgfSwKKyAgICB7ICAzLCAgNSwgIDUsICA1LCAgNywgIDksIDEwLCAxMywgMzUgfSwKKyAgICB7ICAzLCAgNSwgIDUsICA3LCAxMCwgMTIsIDEzLCAxNSwgNDkgfSwKKyAgICB7ICAzLCAgNSwgIDcsICA3LCAgOCwgIDcsICA5LCAxMiwgMjEgfSwKKyAgICB7ICAzLCAgNSwgIDcsICA4LCAxMiwgMTQsIDE1LCAxNSwgMjQgfSwKKyAgICB7ICAzLCAgNSwgIDcsIDEwLCAxNiwgMjEsIDI0LCAyNywgNDQgfSwKKyAgICB7ICAzLCAgNSwgIDgsIDE0LCAyMSwgMjYsIDI4LCAyOSwgNDIgfSwKKyAgICB7ICAzLCAgNiwgMTAsIDEzLCAxOCwgMTksIDIwLCAyMiwgMjcgfSwKKyAgICB7ICAzLCAgNiwgMTEsIDE2LCAyNCwgMjcsIDI4LCAyOSwgMzEgfSwKKyAgICB7ICA0LCAgNSwgIDQsICAzLCAgNCwgIDYsICA4LCAxMSwgMTggfSwKKyAgICB7ICA0LCAgNiwgIDUsICA2LCAgOSwgMTAsIDEyLCAxNCwgMjAgfSwKKyAgICB7ICA0LCAgNiwgIDcsICA2LCAgNiwgIDYsICA3LCAgOCwgNDYgfSwKKyAgICB7ICA0LCAgNiwgIDcsICA5LCAxMywgMTYsIDE4LCAyMCwgNDggfSwKKyAgICB7ICA0LCAgNiwgIDcsICA5LCAxNCwgMTcsIDIwLCAyMywgMzEgfSwKKyAgICB7ICA0LCAgNiwgIDksIDExLCAxNCwgMTUsIDE1LCAxNywgMjEgfSwKKyAgICB7ICA0LCAgOCwgMTMsIDIwLCAyNywgMzIsIDM1LCAzNiwgMzggfSwKKyAgICB7ICA1LCAgNiwgIDYsICA0LCAgNSwgIDYsICA3LCAgNiwgIDYgfSwKKyAgICB7ICA1LCAgNywgIDcsICA4LCAgOSwgIDksIDEwLCAxMiwgNDkgfSwKKyAgICB7ICA1LCAgOCwgIDksICA5LCAxMCwgMTEsIDEyLCAxMywgNDIgfSwKKyAgICB7ICA1LCAgOCwgMTAsIDEyLCAxNSwgMTYsIDE3LCAxOSwgNDIgfSwKKyAgICB7ICA1LCAgOCwgMTIsIDE3LCAyNiwgMzEsIDMyLCAzMywgNDQgfSwKKyAgICB7ICA1LCAgOSwgMTMsIDE2LCAyMCwgMjIsIDIzLCAyMywgMzUgfSwKKyAgICB7ICA2LCAgOCwgIDgsICA3LCAgNiwgIDUsICA2LCAgOCwgMTUgfSwKKyAgICB7ICA2LCAgOCwgIDgsICA4LCAgOSwgMTAsIDEyLCAxNiwgMjQgfSwKKyAgICB7ICA2LCAgOCwgIDgsICA5LCAxMCwgMTAsIDExLCAxMSwgMTMgfSwKKyAgICB7ICA2LCAgOCwgMTAsIDEzLCAxOSwgMjEsIDI0LCAyNiwgMzIgfSwKKyAgICB7ICA2LCAgOSwgMTAsIDExLCAxMywgMTMsIDE0LCAxNiwgNDkgfSwKKyAgICB7ICA3LCAgOSwgIDksIDEwLCAxMywgMTQsIDE2LCAxOSwgMjcgfSwKKyAgICB7ICA3LCAxMCwgMTIsIDEzLCAxNiwgMTYsIDE3LCAxNywgMjcgfSwKKyAgICB7ICA3LCAxMCwgMTIsIDE0LCAxNywgMTksIDIwLCAyMiwgNDggfSwKKyAgICB7ICA4LCAgOSwgMTAsICA5LCAxMCwgMTEsIDExLCAxMSwgMTkgfSwKKyAgICB7ICA4LCAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTcgfSwKKyAgICB7ICA4LCAxMSwgMTMsIDE0LCAxNiwgMTcsIDE5LCAyMCwgMjcgfSwKKyAgICB7ICA4LCAxMiwgMTcsIDIyLCAyNiwgMjgsIDI5LCAzMCwgMzMgfSwKKyAgICB7IDEwLCAxNCwgMTYsIDE5LCAyMSwgMjIsIDIyLCAyNCwgMjggfSwKKyAgICB7IDEwLCAxNSwgMTcsIDE4LCAyMSwgMjIsIDIzLCAyNSwgNDMgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9jdF9yZXN0cmljdGVkX3RvX2Z1bGxbMl1bN11bNF0gPSB7CisgICAgeyB7IDAsIDUsIDQsIDEgfSwKKyAgICAgIHsgMCwgMSwgMiwgMyB9LAorICAgICAgeyAzLCAwLCA0LCAyIH0sCisgICAgICB7IDQsIDAsIDEsIDIgfSwKKyAgICAgIHsgMSwgMCwgNCwgMyB9LAorICAgICAgeyAzLCAwLCAyLCAxIH0sCisgICAgICB7IDAsIDMsIDEsIDIgfSB9LAorICAgIHsgeyA0LCAwLCAxLCAyIH0sCisgICAgICB7IDAsIDMsIDIsIDEgfSwKKyAgICAgIHsgMCwgMSwgMiwgMyB9LAorICAgICAgeyAwLCAxLCAyLCA0IH0sCisgICAgICB7IDAsIDEsIDIsIDMgfSwKKyAgICAgIHsgMSwgNCwgMiwgMCB9LAorICAgICAgeyAwLCAxLCAyLCAzIH0gfQorfTsKKworLyoqIFRhYmxlcyBmb3Igc3BlY3RydW0gY29kaW5nICovCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2EwMV9jYlsxNF0gPSB7CisgICAgMSwgMTIsIDEsIDAsIDAsIDEsIDcsIDAsIDE5LCA1LCAxMywgMjEsIDYsIDgKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTAxX3hsYXRbODFdID0geworICAgIDB4MDAsIDB4MDMsIDB4NDAsIDB4QzAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MEMsIDB4MDEsIDB4NTAsIDB4RDAsIDB4NzAsCisgICAgMHhGMCwgMHhDNCwgMHgxNCwgMHgzNCwgMHg0QywgMHgxQywgMHgzQywgMHg0MSwgMHhDMSwgMHgzMSwgMHgwNSwgMHgwRCwKKyAgICAweEMzLCAweDEzLCAweDA3LCAweDBGLCAweDQ0LCAweENDLCAweDExLCAweDQzLCAweDMzLCAweDU0LCAweDc0LCAweERDLAorICAgIDB4RkMsIDB4NzEsIDB4MTUsIDB4NEQsIDB4Q0QsIDB4MUQsIDB4RDMsIDB4QzcsIDB4MzcsIDB4M0YsIDB4RDQsIDB4RjQsCisgICAgMHg1QywgMHg3QywgMHg1MSwgMHhEMSwgMHhGMSwgMHg0NSwgMHhDNSwgMHgzNSwgMHhERCwgMHgzRCwgMHg1MywgMHg3MywKKyAgICAweEYzLCAweDQ3LCAweDE3LCAweDc3LCAweDRGLCAweENGLCAweDFGLCAweDU1LCAweEY1LCAweDdELCAweEQ3LCAweDVGLAorICAgIDB4RkYsIDB4RDUsIDB4NzUsIDB4NUQsIDB4RkQsIDB4NTcsIDB4RjcsIDB4REYsIDB4N0YKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTAyX2NiWzEzXSA9IHsKKyAgICAyLCAxMiwgMSwgMCwgNCwgMTEsIDAsIDEsIDI5LCA2LCAyMCwgNywgMgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMDJfeGxhdFs4MV0gPSB7CisgICAgMHgwMCwgMHg0MCwgMHgxMCwgMHgwNCwgMHgwMSwgMHg1MCwgMHg0NCwgMHgxNCwgMHg1NCwgMHg0MSwgMHgxMSwgMHg1MSwKKyAgICAweDA1LCAweDQ1LCAweDE1LCAweDU1LCAweDkwLCAweDgwLCAweDIwLCAweDYwLCAweDg0LCAweDk0LCAweDI0LCAweDY0LAorICAgIDB4MDgsIDB4NDgsIDB4MTgsIDB4NTgsIDB4ODEsIDB4OTEsIDB4MjEsIDB4ODUsIDB4OTUsIDB4NjUsIDB4MDksIDB4NDksCisgICAgMHgxOSwgMHg1OSwgMHgwMiwgMHg0MiwgMHgxMiwgMHg1MiwgMHgwNiwgMHg0NiwgMHgxNiwgMHg1NiwgMHg4OCwgMHg2MSwKKyAgICAweDI1LCAweDI5LCAweDY5LCAweDVBLCAweEEwLCAweEE0LCAweDk4LCAweDI4LCAweDY4LCAweEExLCAweEE1LCAweDg5LAorICAgIDB4OTksIDB4QTksIDB4ODIsIDB4OTIsIDB4MjIsIDB4NjIsIDB4OTYsIDB4MjYsIDB4NjYsIDB4MEEsIDB4NEEsIDB4MUEsCisgICAgMHhBOCwgMHg4NiwgMHhBNiwgMHg4QSwgMHg5QSwgMHgyQSwgMHg2QSwgMHhBMiwgMHhBQQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMDNfY2JbOV0gPSB7IDMsIDksIDEsIDgsIDAsIDEzLCAxOCwgNywgMiB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2EwM194bGF0WzQ5XSA9IHsKKyAgICAweDAwLCAweDA4LCAweDM4LCAweDAxLCAweDA5LCAweDM5LCAweDA3LCAweDBGLCAweDNGLCAweDEwLCAweDMwLCAweDExLAorICAgIDB4MzEsIDB4MDIsIDB4MEEsIDB4M0EsIDB4MDUsIDB4MDYsIDB4MEUsIDB4M0UsIDB4MTcsIDB4MzcsIDB4MTgsIDB4MjgsCisgICAgMHgxOSwgMHgyOSwgMHgyQSwgMHgzMiwgMHgwMywgMHgwQiwgMHgzMywgMHgzQiwgMHgwRCwgMHgxNSwgMHgzRCwgMHgxNiwKKyAgICAweDFFLCAweDM2LCAweDFGLCAweDJGLCAweDEyLCAweDFBLCAweDEzLCAweDJCLCAweDFELCAweDM1LCAweDJFLCAweDFCLAorICAgIDB4MkQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTA0X2NiWzRdICAgPSB7IDIsIDMsIDIsIDQgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTA0X3hsYXRbNl0gPSB7IDEsIDIsIDAsIDMsIDQsIDUgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMDVfY2JbMTJdID0geworICAgIDMsIDEyLCAxLCAzLCA1LCA4LCAxMiwgMjMsIDcyLCA2OCwgMzEsIDIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTA1X3hsYXRbMjI1XSA9IHsKKyAgICAweDAwLCAweDEwLCAweEYwLCAweDAxLCAweDExLCAweEYxLCAweDBGLCAweDFGLCAweEZGLCAweDIwLCAweEUwLCAweEUxLAorICAgIDB4MDIsIDB4RjIsIDB4MEUsIDB4MUUsIDB4MkYsIDB4MzAsIDB4RDAsIDB4MjEsIDB4MTIsIDB4MjIsIDB4RTIsIDB4MDMsCisgICAgMHgwRCwgMHgyRSwgMHhFRSwgMHhGRSwgMHhFRiwgMHg0MCwgMHhDMCwgMHgzMSwgMHhDMSwgMHhEMSwgMHgzMiwgMHhEMiwKKyAgICAweDEzLCAweDIzLCAweEUzLCAweEYzLCAweDA0LCAweEY0LCAweDBDLCAweDFDLCAweDFELCAweDJELCAweEVELCAweEZELAorICAgIDB4M0UsIDB4REUsIDB4M0YsIDB4REYsIDB4NTAsIDB4NjAsIDB4NzAsIDB4OTAsIDB4QTAsIDB4QjAsIDB4NDEsIDB4NTEsCisgICAgMHg2MSwgMHg3MSwgMHg5MSwgMHhBMSwgMHhCMSwgMHg0MiwgMHg2MiwgMHg5MiwgMHhBMiwgMHhDMiwgMHgzMywgMHhDMywKKyAgICAweEQzLCAweDE0LCAweDI0LCAweDM0LCAweEQ0LCAweEU0LCAweDA1LCAweDE1LCAweEY1LCAweDA2LCAweDE2LCAweDI2LAorICAgIDB4RTYsIDB4RjYsIDB4MDcsIDB4MTcsIDB4RTcsIDB4RjcsIDB4MDksIDB4MTksIDB4MjksIDB4RjksIDB4MEEsIDB4MUEsCisgICAgMHgyQSwgMHhFQSwgMHhGQSwgMHgwQiwgMHgxQiwgMHhGQiwgMHgyQywgMHgzQywgMHhEQywgMHhFQywgMHhGQywgMHgzRCwKKyAgICAweDRELCAweENELCAweERELCAweDRFLCAweDZFLCAweDdFLCAweEFFLCAweENFLCAweDRGLCAweDVGLCAweDZGLCAweDdGLAorICAgIDB4OUYsIDB4QUYsIDB4QkYsIDB4Q0YsIDB4NTIsIDB4NzIsIDB4QjIsIDB4NDMsIDB4NTMsIDB4NjMsIDB4NzMsIDB4OTMsCisgICAgMHhBMywgMHhCMywgMHg0NCwgMHg2NCwgMHg3NCwgMHg5NCwgMHhBNCwgMHhCNCwgMHhDNCwgMHgyNSwgMHgzNSwgMHhBNSwKKyAgICAweEM1LCAweEQ1LCAweEU1LCAweDM2LCAweDQ2LCAweEI2LCAweEM2LCAweEQ2LCAweDI3LCAweDM3LCAweDQ3LCAweEI3LAorICAgIDB4QzcsIDB4RDcsIDB4MzksIDB4NDksIDB4NTksIDB4QzksIDB4RDksIDB4RTksIDB4M0EsIDB4NEEsIDB4NUEsIDB4Q0EsCisgICAgMHhEQSwgMHgyQiwgMHgzQiwgMHg0QiwgMHg2QiwgMHg3QiwgMHhEQiwgMHhFQiwgMHg0QywgMHg1QywgMHg2QywgMHg3QywKKyAgICAweDlDLCAweEFDLCAweENDLCAweDVELCAweDZELCAweDdELCAweDlELCAweEFELCAweEJELCAweDVFLCAweDlFLCAweEJFLAorICAgIDB4NTQsIDB4NDUsIDB4NTUsIDB4NjUsIDB4NzUsIDB4OTUsIDB4QjUsIDB4NTYsIDB4NjYsIDB4NzYsIDB4OTYsIDB4QTYsCisgICAgMHg1NywgMHg2NywgMHg5NywgMHhBNywgMHg2OSwgMHg3OSwgMHhBOSwgMHhCOSwgMHg2QSwgMHg3QSwgMHg5QSwgMHhBQSwKKyAgICAweEJBLCAweDVCLCAweDlCLCAweEFCLCAweEJCLCAweENCLCAweEJDLCAweDc3LCAweDk5Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2EwNl9jYls3XSA9IHsKKyAgICAyLCA2LCAxLCAzLCAyLCA2LCA0Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2EwNl94bGF0WzE2XSA9IHsKKyAgICAxLCAwLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMywgMTQsIDEwLCAxMSwgMTIsIDE1Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2EwN19jYlsxMV0gPSB7CisgICAgMiwgMTAsIDEsIDIsIDIsIDIsIDYsIDE0LCAyMSwgMTMsIDIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTA3X3hsYXRbNjNdID0geworICAgIDAsICAgMSwgNjMsICAyLCA2MiwgIDMsIDYxLCAgNCwgIDUsICA2LCA1OCwgNTksIDYwLCAgNywgIDgsICA5LAorICAgIDEwLCAyNiwgMjcsIDI4LCAzNiwgMzcsIDM4LCA1NCwgNTUsIDU2LCA1NywgMTEsIDEyLCAxMywgMTQsIDE1LAorICAgIDE2LCAyNSwgMjksIDMwLCAzMSwgMzMsIDM0LCAzNSwgMzksIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLAorICAgIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCAyNCwgNDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTExX2NiWzEzXSA9IHsKKyAgICAxLCAxMSwgMSwgMCwgMCwgMCwgOCwgMSwgMTgsIDksIDIyLCAxMCwgMTIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTExX3hsYXRbODFdID0geworICAgIDB4MDAsIDB4NDAsIDB4QzAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MEMsIDB4MDEsIDB4MDMsIDB4RDAsIDB4NTAsIDB4NzAsCisgICAgMHhGMCwgMHhDNCwgMHgzNCwgMHg0QywgMHhDQywgMHgxQywgMHg0MSwgMHhDMSwgMHgzMSwgMHgwNSwgMHgwRCwgMHg0MywKKyAgICAweEMzLCAweDEzLCAweDA3LCAweDBGLCAweDQ0LCAweDE0LCAweDc0LCAweERDLCAweDNDLCAweDExLCAweDFELCAweDMzLAorICAgIDB4MzcsIDB4NTQsIDB4RDQsIDB4RjQsIDB4NUMsIDB4N0MsIDB4RkMsIDB4RDEsIDB4NzEsIDB4RjEsIDB4MTUsIDB4MzUsCisgICAgMHg0RCwgMHhDRCwgMHhERCwgMHgzRCwgMHhEMywgMHg3MywgMHg0NywgMHhDNywgMHgxNywgMHg3NywgMHgzRiwgMHg1MSwKKyAgICAweDQ1LCAweEM1LCAweDU1LCAweDUzLCAweEYzLCAweDRGLCAweENGLCAweDFGLCAweEZGLCAweEQ1LCAweDc1LCAweEY1LAorICAgIDB4NUQsIDB4N0QsIDB4RkQsIDB4NTcsIDB4RDcsIDB4RjcsIDB4NUYsIDB4REYsIDB4N0YKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTEyX2NiWzhdID0geyA1LCAxMCwgMTYsIDExLCAzMiwgMTksIDEsIDIgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMTJfeGxhdFs4MV0gPSB7CisgICAgMHgwMCwgMHg0MCwgMHgxMCwgMHg1MCwgMHgwNCwgMHg0NCwgMHgxNCwgMHg1NCwgMHgwMSwgMHg0MSwgMHgxMSwgMHg1MSwKKyAgICAweDA1LCAweDQ1LCAweDE1LCAweDU1LCAweDkwLCAweDk0LCAweDU4LCAweDkxLCAweDk1LCAweDE5LCAweDU5LCAweDA2LAorICAgIDB4NDYsIDB4MTYsIDB4NTYsIDB4ODAsIDB4NjAsIDB4ODQsIDB4MjQsIDB4NjQsIDB4QTQsIDB4MDgsIDB4NDgsIDB4MTgsCisgICAgMHg2OCwgMHg4MSwgMHgyMSwgMHg2MSwgMHhBMSwgMHg4NSwgMHgyNSwgMHg2NSwgMHhBNSwgMHgwOSwgMHg0OSwgMHg5OSwKKyAgICAweDY5LCAweEE5LCAweDAyLCAweDQyLCAweDEyLCAweDUyLCAweDk2LCAweDI2LCAweDY2LCAweDFBLCAweDVBLCAweDIwLAorICAgIDB4QTAsIDB4ODgsIDB4OTgsIDB4MjgsIDB4QTgsIDB4ODksIDB4MjksIDB4ODIsIDB4OTIsIDB4MjIsIDB4NjIsIDB4ODYsCisgICAgMHhBNiwgMHgwQSwgMHg0QSwgMHg5QSwgMHg2QSwgMHhBQSwgMHhBMiwgMHg4QSwgMHgyQQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMTNfY2JbMTJdID0geworICAgIDEsIDEwLCAxLCAwLCAwLCA0LCAyLCAyLCA5LCAxNSwgMTIsIDQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTEzX3hsYXRbNDldID0geworICAgIDB4MDAsIDB4MDgsIDB4MzgsIDB4MDEsIDB4MDcsIDB4MzksIDB4MEYsIDB4MDksIDB4M0YsIDB4MTAsIDB4MzAsIDB4MzEsCisgICAgMHgwMiwgMHgzQSwgMHgwNiwgMHgwRSwgMHgzRSwgMHgxNywgMHgxOCwgMHgyOCwgMHgxMSwgMHgyOSwgMHgwQSwgMHgzMiwKKyAgICAweDAzLCAweDBCLCAweDNCLCAweDA1LCAweDBELCAweDNELCAweDE2LCAweDFGLCAweDM3LCAweDE5LCAweDEyLCAweDFBLAorICAgIDB4MkEsIDB4MTMsIDB4MzMsIDB4MTUsIDB4MzUsIDB4MUUsIDB4MkUsIDB4MzYsIDB4MkYsIDB4MUIsIDB4MkIsIDB4MUQsCisgICAgMHgyRAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMTRfY2JbMTJdID0geworICAgIDIsIDExLCAxLCAwLCA0LCAzLCA1LCAxNiwgMjgsIDM0LCAyNiwgNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMTRfeGxhdFsxMjFdID0geworICAgIDB4MDAsIDB4MTAsIDB4RjAsIDB4MDEsIDB4MEYsIDB4RjEsIDB4MUYsIDB4RkYsIDB4MjAsIDB4RTAsIDB4MTEsIDB4MDIsCisgICAgMHgwRSwgMHgzMCwgMHg1MCwgMHhCMCwgMHhEMCwgMHgyMSwgMHhFMSwgMHgxMiwgMHhGMiwgMHgwMywgMHgwNSwgMHgwQiwKKyAgICAweDBELCAweDFFLCAweEZFLCAweDJGLCAweEVGLCAweDQwLCAweEMwLCAweDMxLCAweDUxLCAweEIxLCAweEMxLCAweEQxLAorICAgIDB4MjIsIDB4NTIsIDB4RTIsIDB4MTMsIDB4RjMsIDB4MDQsIDB4MTUsIDB4RjUsIDB4MUIsIDB4RUIsIDB4RkIsIDB4MEMsCisgICAgMHgxRCwgMHhGRCwgMHgyRSwgMHg1RSwgMHhFRSwgMHgzRiwgMHg1RiwgMHhCRiwgMHhERiwgMHg0MSwgMHgzMiwgMHg0MiwKKyAgICAweEIyLCAweEQyLCAweDIzLCAweDUzLCAweEIzLCAweEUzLCAweDE0LCAweDI0LCAweEU0LCAweEY0LCAweDI1LCAweDM1LAorICAgIDB4RDUsIDB4RTUsIDB4MkIsIDB4M0IsIDB4REIsIDB4MUMsIDB4MkMsIDB4QkMsIDB4RUMsIDB4RkMsIDB4MkQsIDB4QkQsCisgICAgMHhFRCwgMHgzRSwgMHg0RSwgMHhCRSwgMHhERSwgMHg0RiwgMHhDRiwgMHhDMiwgMHgzMywgMHg0MywgMHhDMywgMHhEMywKKyAgICAweDM0LCAweDQ0LCAweDU0LCAweEI0LCAweEQ0LCAweDQ1LCAweDU1LCAweEM1LCAweDRCLCAweENCLCAweDNDLCAweDRDLAorICAgIDB4NUMsIDB4Q0MsIDB4REMsIDB4M0QsIDB4NEQsIDB4NUQsIDB4Q0QsIDB4REQsIDB4Q0UsIDB4QzQsIDB4QjUsIDB4NUIsCisgICAgMHhCQgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMTVfY2JbOV0gPSB7IDUsIDExLCA5LCAxMiwgMTYsIDQ0LCA5OCwgNDIsIDQgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMTVfeGxhdFsyMjVdID0geworICAgIDB4MDAsIDB4MTAsIDB4RjAsIDB4MDEsIDB4MTEsIDB4RjEsIDB4MEYsIDB4MUYsIDB4RkYsIDB4MjAsIDB4RTAsIDB4MjEsCisgICAgMHhFMSwgMHgwMiwgMHgxMiwgMHhGMiwgMHgwRSwgMHgxRSwgMHhGRSwgMHgyRiwgMHhFRiwgMHgzMCwgMHhEMCwgMHgzMSwKKyAgICAweEQxLCAweDIyLCAweEUyLCAweDAzLCAweDEzLCAweEYzLCAweDBELCAweDFELCAweEZELCAweDJFLCAweEVFLCAweDNGLAorICAgIDB4REYsIDB4NDAsIDB4NjAsIDB4NzAsIDB4OTAsIDB4QTAsIDB4QzAsIDB4NDEsIDB4QzEsIDB4MzIsIDB4NDIsIDB4QzIsCisgICAgMHhEMiwgMHgyMywgMHgzMywgMHhEMywgMHhFMywgMHgwNCwgMHgxNCwgMHgyNCwgMHhFNCwgMHhGNCwgMHgwNiwgMHgxNiwKKyAgICAweEY2LCAweDA3LCAweDA5LCAweDBBLCAweDFBLCAweEZBLCAweDBDLCAweDFDLCAweDJDLCAweEVDLCAweEZDLCAweDJELAorICAgIDB4M0QsIDB4REQsIDB4RUQsIDB4M0UsIDB4NEUsIDB4Q0UsIDB4REUsIDB4NEYsIDB4Q0YsIDB4NTAsIDB4QjAsIDB4NTEsCisgICAgMHg2MSwgMHg3MSwgMHg5MSwgMHhBMSwgMHhCMSwgMHg1MiwgMHg2MiwgMHg3MiwgMHg5MiwgMHhBMiwgMHhCMiwgMHg0MywKKyAgICAweDUzLCAweDYzLCAweDczLCAweDkzLCAweEEzLCAweEMzLCAweDM0LCAweDQ0LCAweDY0LCAweEE0LCAweEM0LCAweEQ0LAorICAgIDB4MDUsIDB4MTUsIDB4MjUsIDB4MzUsIDB4RDUsIDB4RTUsIDB4RjUsIDB4MjYsIDB4MzYsIDB4NDYsIDB4QzYsIDB4RDYsCisgICAgMHhFNiwgMHgxNywgMHgyNywgMHgzNywgMHhDNywgMHhENywgMHhFNywgMHhGNywgMHgxOSwgMHgyOSwgMHgzOSwgMHhDOSwKKyAgICAweEQ5LCAweEU5LCAweEY5LCAweDJBLCAweDNBLCAweDRBLCAweDVBLCAweENBLCAweERBLCAweEVBLCAweDBCLCAweDFCLAorICAgIDB4MkIsIDB4M0IsIDB4Q0IsIDB4REIsIDB4RUIsIDB4RkIsIDB4M0MsIDB4NEMsIDB4NkMsIDB4N0MsIDB4OUMsIDB4QUMsCisgICAgMHhCQywgMHhDQywgMHhEQywgMHg0RCwgMHg1RCwgMHg2RCwgMHg3RCwgMHg5RCwgMHhBRCwgMHhCRCwgMHhDRCwgMHg1RSwKKyAgICAweDZFLCAweDdFLCAweDlFLCAweEFFLCAweEJFLCAweDVGLCAweDZGLCAweDdGLCAweDlGLCAweEFGLCAweEJGLCAweEIzLAorICAgIDB4NTQsIDB4NzQsIDB4OTQsIDB4QjQsIDB4NDUsIDB4NTUsIDB4NjUsIDB4NzUsIDB4OTUsIDB4QTUsIDB4QjUsIDB4QzUsCisgICAgMHg1NiwgMHg2NiwgMHg3NiwgMHg5NiwgMHhBNiwgMHhCNiwgMHg0NywgMHg1NywgMHg2NywgMHhBNywgMHhCNywgMHg0OSwKKyAgICAweDU5LCAweDY5LCAweEE5LCAweEI5LCAweDZBLCAweDdBLCAweDlBLCAweEFBLCAweEJBLCAweDRCLCAweDVCLCAweDZCLAorICAgIDB4N0IsIDB4OUIsIDB4QUIsIDB4QkIsIDB4NUMsIDB4NzcsIDB4OTcsIDB4NzksIDB4OTkKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTE2X2NiWzEzXSA9IHsKKyAgICAyLCAxMiwgMSwgMSwgMiwgMiwgNSwgNywgMjEsIDU0LCA4NSwgNjIsIDE2Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2ExNl94bGF0WzI1Nl0gPSB7CisgICAgMHgwMCwgMHgwMSwgMHgxMCwgMHgxMSwgMHgyMSwgMHgxMiwgMHgyMCwgMHgzMSwgMHgwMiwgMHgyMiwgMHgxMywgMHgzMCwKKyAgICAweDQxLCAweDMyLCAweDAzLCAweDIzLCAweDE0LCAweDI0LCAweDQwLCAweDUxLCAweDYxLCAweEQxLCAweEUxLCAweDQyLAorICAgIDB4NTIsIDB4RDIsIDB4MzMsIDB4NDMsIDB4RDMsIDB4MDQsIDB4MzQsIDB4MDUsIDB4MTUsIDB4MjUsIDB4MTYsIDB4MUQsCisgICAgMHgyRCwgMHgxRSwgMHgyRSwgMHg1MCwgMHg2MCwgMHhEMCwgMHhFMCwgMHhGMCwgMHg3MSwgMHg4MSwgMHhGMSwgMHg2MiwKKyAgICAweDcyLCAweEUyLCAweEYyLCAweDUzLCAweDYzLCAweEUzLCAweEYzLCAweDQ0LCAweDU0LCAweEQ0LCAweEU0LCAweEY0LAorICAgIDB4MzUsIDB4NDUsIDB4NTUsIDB4RDUsIDB4RTUsIDB4RjUsIDB4MDYsIDB4MjYsIDB4MzYsIDB4RDYsIDB4MDcsIDB4MTcsCisgICAgMHgyNywgMHgzNywgMHhENywgMHgxOCwgMHgyOCwgMHgxQywgMHgwRCwgMHgzRCwgMHg0RCwgMHg1RCwgMHg2RCwgMHg4RCwKKyAgICAweDBFLCAweDNFLCAweDRFLCAweDVFLCAweDBGLCAweDFGLCAweDJGLCAweDNGLCAweDVGLCAweDcwLCAweDgwLCAweDkwLAorICAgIDB4QzAsIDB4OTEsIDB4QTEsIDB4QjEsIDB4QzEsIDB4ODIsIDB4OTIsIDB4QTIsIDB4QzIsIDB4NzMsIDB4ODMsIDB4OTMsCisgICAgMHhBMywgMHhDMywgMHg2NCwgMHg3NCwgMHg4NCwgMHg5NCwgMHhBNCwgMHhDNCwgMHg2NSwgMHg3NSwgMHg4NSwgMHg0NiwKKyAgICAweDU2LCAweDY2LCAweEM2LCAweEU2LCAweEY2LCAweDQ3LCAweDU3LCAweEU3LCAweEY3LCAweDA4LCAweDM4LCAweDQ4LAorICAgIDB4NTgsIDB4NjgsIDB4RDgsIDB4RTgsIDB4RjgsIDB4MDksIDB4MTksIDB4MjksIDB4MzksIDB4NTksIDB4RDksIDB4RTksCisgICAgMHhGOSwgMHgxQSwgMHgyQSwgMHgzQSwgMHhEQSwgMHhFQSwgMHhGQSwgMHgxQiwgMHgyQiwgMHhEQiwgMHhFQiwgMHhGQiwKKyAgICAweDBDLCAweDJDLCAweDNDLCAweERDLCAweEVDLCAweDdELCAweDlELCAweEFELCAweEJELCAweENELCAweDZFLCAweDdFLAorICAgIDB4OEUsIDB4OUUsIDB4QUUsIDB4QkUsIDB4Q0UsIDB4NEYsIDB4NkYsIDB4N0YsIDB4OEYsIDB4QUYsIDB4QTAsIDB4QjIsCisgICAgMHhCMywgMHhCNCwgMHg5NSwgMHhBNSwgMHhCNSwgMHhDNSwgMHg3NiwgMHg4NiwgMHg5NiwgMHhBNiwgMHhCNiwgMHg2NywKKyAgICAweDc3LCAweDg3LCAweDk3LCAweEM3LCAweDc4LCAweDg4LCAweDk4LCAweEM4LCAweDQ5LCAweDY5LCAweDc5LCAweDg5LAorICAgIDB4OTksIDB4QzksIDB4MEEsIDB4NEEsIDB4NUEsIDB4NkEsIDB4N0EsIDB4Q0EsIDB4MEIsIDB4M0IsIDB4NEIsIDB4NUIsCisgICAgMHg2QiwgMHhDQiwgMHg0QywgMHg1QywgMHg2QywgMHg3QywgMHg4QywgMHg5QywgMHhBQywgMHhCQywgMHhDQywgMHhGQywKKyAgICAweERELCAweEVELCAweEZELCAweERFLCAweEVFLCAweEZFLCAweDlGLCAweEJGLCAweENGLCAweERGLCAweEVGLCAweEZGLAorICAgIDB4QjAsIDB4QTcsIDB4QjcsIDB4QTgsIDB4QjgsIDB4QTksIDB4QjksIDB4OEEsIDB4OUEsIDB4QUEsIDB4QkEsIDB4N0IsCisgICAgMHg4QiwgMHg5QiwgMHhBQiwgMHhCQgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMTdfY2JbOV0gPSB7IDMsIDksIDMsIDIsIDUsIDcsIDE3LCAyMywgNiB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2ExN194bGF0WzYzXSA9IHsKKyAgICAwLCAgIDEsIDYzLCAgMiwgNjIsICAzLCAgNCwgNTksIDYwLCA2MSwgIDUsICA2LCAgNywgIDgsIDU2LCA1NywKKyAgICA1OCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMjYsIDI3LCAzNiwgMzcsIDM4LCA1MCwgNTEsIDUyLCA1MywKKyAgICA1NCwgNTUsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyNSwgMjgsIDI5LCAzMCwgMzEsIDMzLCAzNCwKKyAgICAzNSwgMzksIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCAyMiwgMjMsIDI0LCA0MCwgNDEsIDQyCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2EyMV9jYlsxNF0gPSB7CisgICAgMSwgMTIsIDEsIDAsIDAsIDIsIDYsIDAsIDcsIDIxLCAxNSwgMTcsIDgsIDQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTIxX3hsYXRbODFdID0geworICAgIDB4MDAsIDB4NDAsIDB4QzAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MEMsIDB4MDEsIDB4MDMsIDB4RDAsIDB4NzAsIDB4MzQsCisgICAgMHgxQywgMHgwRCwgMHgxMywgMHgwNywgMHg1MCwgMHhGMCwgMHg0NCwgMHhDNCwgMHgxNCwgMHg3NCwgMHg0QywgMHhDQywKKyAgICAweERDLCAweDNDLCAweDQxLCAweEMxLCAweDExLCAweDMxLCAweDA1LCAweDFELCAweDQzLCAweEMzLCAweDMzLCAweDM3LAorICAgIDB4MEYsIDB4NTQsIDB4RjQsIDB4RkMsIDB4RDEsIDB4NzEsIDB4MTUsIDB4NEQsIDB4Q0QsIDB4REQsIDB4RDMsIDB4NzMsCisgICAgMHg0NywgMHhDNywgMHg3NywgMHgzRiwgMHhENCwgMHg1QywgMHg3QywgMHg1MSwgMHhGMSwgMHg0NSwgMHhDNSwgMHg1NSwKKyAgICAweDM1LCAweDNELCAweDUzLCAweEYzLCAweDE3LCAweDRGLCAweENGLCAweDFGLCAweEZGLCAweDc1LCAweEY1LCAweDVELAorICAgIDB4N0QsIDB4RDcsIDB4RjcsIDB4NUYsIDB4REYsIDB4RDUsIDB4RkQsIDB4NTcsIDB4N0YKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTIyX2NiWzEwXSA9IHsgMiwgOSwgMSwgNCwgMCwgNCwgMywgOCwgMywgMiB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2EyMl94bGF0WzI1XSA9IHsKKyAgICAweDAwLCAweDA4LCAweDM4LCAweDAxLCAweDA3LCAweDA5LCAweDM5LCAweDBGLCAweDNGLCAweDEwLCAweDAyLCAweDA2LAorICAgIDB4MzAsIDB4MTEsIDB4MzEsIDB4MEEsIDB4M0EsIDB4MEUsIDB4MTcsIDB4MzcsIDB4MzIsIDB4MTYsIDB4M0UsIDB4MTIsCisgICAgMHgzNgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMjNfY2JbOV0gPSB7IDMsIDksIDUsIDAsIDQsIDYsIDEwLCAxNiwgOCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2EyM194bGF0WzQ5XSA9IHsKKyAgICAweDAwLCAweDA4LCAweDM4LCAweDAxLCAweDA3LCAweDA5LCAweDM5LCAweDBGLCAweDNGLCAweDEwLCAweDMwLCAweDAyLAorICAgIDB4M0EsIDB4MDYsIDB4MEUsIDB4MTgsIDB4MjgsIDB4MTEsIDB4MzEsIDB4MEEsIDB4MDMsIDB4MDUsIDB4M0UsIDB4MTcsCisgICAgMHgzNywgMHgxOSwgMHgyOSwgMHgxMiwgMHgyQSwgMHgzMiwgMHgwQiwgMHgzMywgMHgzQiwgMHgwRCwgMHgxNSwgMHgzRCwKKyAgICAweDE2LCAweDFFLCAweDM2LCAweDFGLCAweDJGLCAweDFBLCAweDEzLCAweDFCLCAweDJCLCAweDFELCAweDJELCAweDM1LAorICAgIDB4MkUKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTI0X2NiWzVdID0geyAyLCA0LCAzLCAxLCAyIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTI1X2NiWzVdID0geyAyLCA0LCAxLCA1LCAyIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTI1X3hsYXRbOF0gPSB7IDEsIDAsIDIsIDMsIDQsIDUsIDYsIDcgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMjZfY2JbMTBdID0geyA0LCAxMSwgMywgNCwgMTIsIDE1LCAzNCwgODMsIDc1LCAzMCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2EyNl94bGF0WzI1Nl0gPSB7CisgICAgMHgwMCwgMHgwMSwgMHgxMSwgMHgxMCwgMHgyMSwgMHgxMiwgMHgyMiwgMHgyMCwgMHgzMCwgMHgzMSwgMHg0MSwgMHgwMiwKKyAgICAweDMyLCAweDAzLCAweDEzLCAweDIzLCAweDMzLCAweDE0LCAweDI0LCAweDQwLCAweDUxLCAweDYxLCAweDQyLCAweDUyLAorICAgIDB4NDMsIDB4NTMsIDB4MDQsIDB4MzQsIDB4NDQsIDB4MTUsIDB4MjUsIDB4MzUsIDB4MTYsIDB4MjYsIDB4NTAsIDB4NjAsCisgICAgMHg3MSwgMHg4MSwgMHhEMSwgMHg2MiwgMHg3MiwgMHg4MiwgMHhEMiwgMHg2MywgMHg3MywgMHhEMywgMHg1NCwgMHg2NCwKKyAgICAweDA1LCAweDQ1LCAweDU1LCAweDY1LCAweDA2LCAweDM2LCAweDQ2LCAweDU2LCAweDE3LCAweDI3LCAweDM3LCAweDQ3LAorICAgIDB4MTgsIDB4MjgsIDB4MzgsIDB4MTksIDB4MUQsIDB4MkQsIDB4M0QsIDB4MUUsIDB4NzAsIDB4ODAsIDB4OTAsIDB4RDAsCisgICAgMHhFMCwgMHg5MSwgMHhBMSwgMHhCMSwgMHhDMSwgMHhFMSwgMHhGMSwgMHg5MiwgMHhBMiwgMHhDMiwgMHhFMiwgMHhGMiwKKyAgICAweDgzLCAweDkzLCAweEEzLCAweEMzLCAweEUzLCAweEYzLCAweDc0LCAweDg0LCAweDk0LCAweEE0LCAweEM0LCAweEQ0LAorICAgIDB4RTQsIDB4RjQsIDB4NzUsIDB4ODUsIDB4OTUsIDB4RDUsIDB4RTUsIDB4NjYsIDB4NzYsIDB4ODYsIDB4RDYsIDB4RTYsCisgICAgMHgwNywgMHg1NywgMHg2NywgMHg3NywgMHhENywgMHgwOCwgMHg0OCwgMHg1OCwgMHg2OCwgMHhEOCwgMHgwOSwgMHgyOSwKKyAgICAweDM5LCAweDQ5LCAweDU5LCAweDY5LCAweDFBLCAweDJBLCAweDNBLCAweDRBLCAweDFCLCAweDJCLCAweDFDLCAweDJDLAorICAgIDB4M0MsIDB4NEMsIDB4MEQsIDB4NEQsIDB4NUQsIDB4NkQsIDB4N0QsIDB4OEQsIDB4MEUsIDB4MkUsIDB4M0UsIDB4NEUsCisgICAgMHg1RSwgMHg2RSwgMHgxRiwgMHgyRiwgMHgzRiwgMHg0RiwgMHg1RiwgMHhBMCwgMHhCMCwgMHhDMCwgMHhGMCwgMHhCMiwKKyAgICAweEIzLCAweEI0LCAweEE1LCAweEI1LCAweEM1LCAweEY1LCAweDk2LCAweEE2LCAweEI2LCAweEM2LCAweEY2LCAweDg3LAorICAgIDB4OTcsIDB4QTcsIDB4QjcsIDB4QzcsIDB4RTcsIDB4RjcsIDB4NzgsIDB4ODgsIDB4OTgsIDB4QTgsIDB4QzgsIDB4RTgsCisgICAgMHhGOCwgMHg3OSwgMHg4OSwgMHg5OSwgMHhDOSwgMHhEOSwgMHhFOSwgMHhGOSwgMHgwQSwgMHg1QSwgMHg2QSwgMHg3QSwKKyAgICAweDhBLCAweERBLCAweEVBLCAweEZBLCAweDBCLCAweDNCLCAweDRCLCAweDVCLCAweDZCLCAweDdCLCAweDhCLCAweERCLAorICAgIDB4MEMsIDB4NUMsIDB4NkMsIDB4N0MsIDB4OEMsIDB4OUMsIDB4REMsIDB4OUQsIDB4QUQsIDB4QkQsIDB4Q0QsIDB4N0UsCisgICAgMHg4RSwgMHg5RSwgMHhBRSwgMHhCRSwgMHgwRiwgMHg2RiwgMHg3RiwgMHg4RiwgMHg5RiwgMHhBRiwgMHhCOCwgMHhBOSwKKyAgICAweEI5LCAweDlBLCAweEFBLCAweEJBLCAweENBLCAweDlCLCAweEFCLCAweEJCLCAweENCLCAweEVCLCAweEZCLCAweEFDLAorICAgIDB4QkMsIDB4Q0MsIDB4RUMsIDB4RkMsIDB4REQsIDB4RUQsIDB4RkQsIDB4Q0UsIDB4REUsIDB4RUUsIDB4RkUsIDB4QkYsCisgICAgMHhDRiwgMHhERiwgMHhFRiwgMHhGRgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMjdfY2JbN10gPSB7IDQsIDgsIDMsIDE0LCAxMCwgMjAsIDE2IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTI3X3hsYXRbNjNdID0geworICAgICAwLCAgMiwgIDMsICAxLCAgNSwgIDYsICA3LCAgOSwgNTQsIDU1LCA1NiwgNTgsIDU5LCA2MCwgNjEsIDYyLAorICAgIDYzLCAgNCwgIDgsIDEwLCAxMSwgMTIsIDE0LCA0OSwgNTIsIDUzLCA1NywgMTMsIDE1LCAxNiwgMTcsIDE4LAorICAgIDE5LCAyMiwgMjMsIDI1LCAyNiwgMzAsIDM5LCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA1MCwgNTEsIDIwLAorICAgIDIxLCAyNCwgMjcsIDI4LCAyOSwgMzEsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDQwLCA0MSwgNDIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTMxX2NiWzhdID0geyAxLCA2LCAxLCAwLCAzLCAxLCAwLCA0IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTMxX3hsYXRbOV0gPSB7CisgICAgMHgwMCwgMHgwNCwgMHgwQywgMHgwMSwgMHgwMywgMHgwNSwgMHgwRCwgMHgwNywgMHgwRgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMzJfY2JbMTNdID0geworICAgIDEsIDExLCAxLCAwLCAwLCAyLCAyLCA2LCAxMiwgMTgsIDE5LCAxNSwgNgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMzJfeGxhdFs4MV0gPSB7CisgICAgMHgwMCwgMHg0MCwgMHgwMSwgMHgxMCwgMHgwNCwgMHg4MCwgMHg1MCwgMHgyMCwgMHgxNCwgMHgwNSwgMHgwMiwgMHg5MCwKKyAgICAweDYwLCAweDQ0LCAweDU0LCAweDI0LCAweDA4LCAweDE4LCAweDQxLCAweDExLCAweDE1LCAweDA5LCAweDA2LCAweEEwLAorICAgIDB4ODQsIDB4OTQsIDB4NjQsIDB4QTQsIDB4NDgsIDB4NTgsIDB4MjgsIDB4NTEsIDB4MjEsIDB4NDUsIDB4NTUsIDB4MjUsCisgICAgMHgxOSwgMHgxMiwgMHgxNiwgMHgwQSwgMHgxQSwgMHg2OCwgMHhBOCwgMHg4MSwgMHg5MSwgMHg2MSwgMHhBMSwgMHg4NSwKKyAgICAweDk1LCAweDY1LCAweEE1LCAweDQ5LCAweDU5LCAweDI5LCAweDY5LCAweDQyLCAweDUyLCAweDQ2LCAweDU2LCAweDJBLAorICAgIDB4ODgsIDB4OTgsIDB4ODksIDB4OTksIDB4QTksIDB4ODIsIDB4OTIsIDB4MjIsIDB4NjIsIDB4ODYsIDB4MjYsIDB4NjYsCisgICAgMHg0QSwgMHg1QSwgMHg2QSwgMHhBMiwgMHg5NiwgMHhBNiwgMHg4QSwgMHg5QSwgMHhBQQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMzNfY2JbMTJdID0geworICAgIDMsIDEyLCAxLCAxLCAxMywgMSwgMTQsIDI4LCAzMywgODEsIDMyLCA1MgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMzNfeGxhdFsyNTZdID0geworICAgIDB4MDAsIDB4MTAsIDB4NDAsIDB4NTAsIDB4MDQsIDB4NDQsIDB4MTQsIDB4NTQsIDB4MDEsIDB4NDEsIDB4MTEsIDB4NTEsCisgICAgMHgwNSwgMHg0NSwgMHgxNSwgMHg1NSwgMHg5MCwgMHgyMCwgMHg5NCwgMHg2NCwgMHgxOCwgMHgyMSwgMHg5NSwgMHgxOSwKKyAgICAweDY5LCAweDAyLCAweDUyLCAweDA2LCAweDQ2LCAweDE2LCAweDgwLCAweDYwLCAweDg0LCAweEQ0LCAweDI0LCAweDA4LAorICAgIDB4NDgsIDB4NTgsIDB4NjgsIDB4ODEsIDB4OTEsIDB4NjEsIDB4ODUsIDB4MjUsIDB4NjUsIDB4QTUsIDB4MDksIDB4NDksCisgICAgMHg1OSwgMHgyOSwgMHg0MiwgMHgxMiwgMHg1NiwgMHg5NiwgMHhBNiwgMHgwQSwgMHgxNywgMHgxQiwgMHhEMCwgMHhDNCwKKyAgICAweDc0LCAweEY0LCAweDg4LCAweEM4LCAweDI4LCAweEExLCAweDcxLCAweEM1LCAweEQ1LCAweDc1LCAweDk5LCAweEI5LAorICAgIDB4NEQsIDB4MUQsIDB4MkQsIDB4NkQsIDB4MjIsIDB4NjIsIDB4NjYsIDB4NEEsIDB4MUEsIDB4OUEsIDB4NkEsIDB4OEUsCisgICAgMHg1RSwgMHg0MywgMHgyMywgMHgwNywgMHg0NywgMHg1NywgMHg2QiwgMHhDMCwgMHhBMCwgMHhFMCwgMHg3MCwgMHhCMCwKKyAgICAweEE0LCAweEU0LCAweDM0LCAweEI0LCAweDk4LCAweEQ4LCAweEE4LCAweDM4LCAweDc4LCAweDBDLCAweDRDLCAweDFDLAorICAgIDB4NUMsIDB4OUMsIDB4NkMsIDB4N0MsIDB4QzEsIDB4RDEsIDB4RTEsIDB4MzEsIDB4RTUsIDB4MzUsIDB4QjUsIDB4RjUsCisgICAgMHg4OSwgMHhBOSwgMHg3OSwgMHhGOSwgMHgwRCwgMHhDRCwgMHg5RCwgMHhERCwgMHhBRCwgMHgzRCwgMHg3RCwgMHg4MiwKKyAgICAweEMyLCAweDkyLCAweEQyLCAweEUyLCAweDcyLCAweEYyLCAweDg2LCAweEQ2LCAweEU2LCAweDc2LCAweEI2LCAweDhBLAorICAgIDB4NUEsIDB4REEsIDB4RUEsIDB4RkEsIDB4NEUsIDB4MUUsIDB4OUUsIDB4RUUsIDB4MDMsIDB4MTMsIDB4NTMsIDB4OTcsCisgICAgMHhCNywgMHgwQiwgMHg0QiwgMHg4QiwgMHg1QiwgMHg5QiwgMHhFQiwgMHg3QiwgMHgwRiwgMHg0RiwgMHgxRiwgMHg1RiwKKyAgICAweDlGLCAweDJGLCAweDNGLCAweEJGLCAweEU4LCAweEI4LCAweEY4LCAweDhDLCAweDJDLCAweDNDLCAweEZDLCAweEIxLAorICAgIDB4QzksIDB4RDksIDB4RTksIDB4MzksIDB4NUQsIDB4RUQsIDB4QkQsIDB4QTIsIDB4MzIsIDB4MjYsIDB4MzYsIDB4MkEsCisgICAgMHhBQSwgMHhCQSwgMHgwRSwgMHgyRSwgMHg2RSwgMHg4MywgMHhDMywgMHg5MywgMHg2MywgMHhCMywgMHhBNywgMHgzNywKKyAgICAweDMwLCAweEYwLCAweENDLCAweERDLCAweEFDLCAweEVDLCAweEJDLCAweEYxLCAweDhELCAweEZELCAweEIyLCAweEM2LAorICAgIDB4RjYsIDB4Q0EsIDB4M0EsIDB4N0EsIDB4Q0UsIDB4REUsIDB4QUUsIDB4M0UsIDB4N0UsIDB4QkUsIDB4RkUsIDB4RDMsCisgICAgMHhBMywgMHhFMywgMHgzMywgMHg3MywgMHhGMywgMHg4NywgMHhDNywgMHhENywgMHgyNywgMHg2NywgMHhFNywgMHg3NywKKyAgICAweEY3LCAweENCLCAweERCLCAweDJCLCAweEFCLCAweDNCLCAweEJCLCAweEZCLCAweDhGLCAweENGLCAweERGLCAweDZGLAorICAgIDB4QUYsIDB4RUYsIDB4N0YsIDB4RkYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTM0X2NiWzddID0geyAxLCA1LCAxLCAxLCAxLCAxLCAyIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTM0X3hsYXRbNl0gPSB7IDEsIDAsIDIsIDMsIDQsIDUgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMzVfY2JbMTFdID0geyAyLCAxMCwgMSwgMCwgMiwgMywgNiwgMTksIDksIDc1LCAxMTAgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMzVfeGxhdFsyMjVdID0geworICAgIDB4MDAsIDB4RjAsIDB4MEYsIDB4MTAsIDB4MDEsIDB4RkYsIDB4MjAsIDB4RTAsIDB4MTEsIDB4RjEsIDB4MEUsIDB4MUYsCisgICAgMHgzMCwgMHg0MCwgMHhEMCwgMHgyMSwgMHhFMSwgMHgwMiwgMHgxMiwgMHgyMiwgMHhFMiwgMHhGMiwgMHgwMywgMHgxMywKKyAgICAweDFFLCAweDJFLCAweDNFLCAweEVFLCAweEZFLCAweDJGLCAweEVGLCAweEQyLCAweDQzLCAweEYzLCAweDA0LCAweDBELAorICAgIDB4MkQsIDB4M0QsIDB4M0YsIDB4REYsIDB4NTAsIDB4NjAsIDB4NzAsIDB4OTAsIDB4QjAsIDB4MzEsIDB4NDEsIDB4OTEsCisgICAgMHhBMSwgMHhDMSwgMHhEMSwgMHg0MiwgMHhBMiwgMHhDMiwgMHgyMywgMHgzMywgMHhFMywgMHgyNCwgMHgzNCwgMHhCNCwKKyAgICAweEQ0LCAweEY0LCAweDA1LCAweDE1LCAweDQ1LCAweEU1LCAweDE2LCAweDM2LCAweDU2LCAweEE2LCAweEM2LCAweEQ2LAorICAgIDB4RjYsIDB4NTcsIDB4QzcsIDB4RjcsIDB4MDksIDB4MjksIDB4NDksIDB4NTksIDB4NjksIDB4RjksIDB4MEEsIDB4MkEsCisgICAgMHgzQSwgMHg0QSwgMHhEQSwgMHhFQSwgMHhGQSwgMHgwQiwgMHgyQiwgMHhBQiwgMHhFQiwgMHhGQiwgMHgwQywgMHgxQywKKyAgICAweDJDLCAweDNDLCAweDRDLCAweDVDLCAweENDLCAweERDLCAweEZDLCAweDFELCAweDRELCAweDZELCAweEJELCAweENELAorICAgIDB4RUQsIDB4RkQsIDB4NEUsIDB4NkUsIDB4Q0UsIDB4REUsIDB4N0YsIDB4QTAsIDB4QzAsIDB4NTEsIDB4NjEsIDB4NzEsCisgICAgMHhCMSwgMHgzMiwgMHg1MiwgMHg2MiwgMHg3MiwgMHg5MiwgMHhCMiwgMHg1MywgMHg2MywgMHg3MywgMHg5MywgMHhBMywKKyAgICAweEIzLCAweEMzLCAweEQzLCAweDE0LCAweDQ0LCAweDU0LCAweDY0LCAweDc0LCAweDk0LCAweEE0LCAweEM0LCAweEU0LAorICAgIDB4MjUsIDB4MzUsIDB4NTUsIDB4NjUsIDB4NzUsIDB4OTUsIDB4QTUsIDB4QjUsIDB4QzUsIDB4RDUsIDB4RjUsIDB4MDYsCisgICAgMHgyNiwgMHg0NiwgMHg2NiwgMHg3NiwgMHg5NiwgMHhCNiwgMHhFNiwgMHgwNywgMHgxNywgMHgyNywgMHgzNywgMHg0NywKKyAgICAweDY3LCAweDc3LCAweDk3LCAweEE3LCAweEI3LCAweEQ3LCAweEU3LCAweDE5LCAweDM5LCAweDc5LCAweDk5LCAweEE5LAorICAgIDB4QjksIDB4QzksIDB4RDksIDB4RTksIDB4MUEsIDB4NUEsIDB4NkEsIDB4N0EsIDB4OUEsIDB4QUEsIDB4QkEsIDB4Q0EsCisgICAgMHgxQiwgMHgzQiwgMHg0QiwgMHg1QiwgMHg2QiwgMHg3QiwgMHg5QiwgMHhCQiwgMHhDQiwgMHhEQiwgMHg2QywgMHg3QywKKyAgICAweDlDLCAweEFDLCAweEJDLCAweEVDLCAweDVELCAweDdELCAweDlELCAweEFELCAweERELCAweDVFLCAweDdFLCAweDlFLAorICAgIDB4QUUsIDB4QkUsIDB4NEYsIDB4NUYsIDB4NkYsIDB4OUYsIDB4QUYsIDB4QkYsIDB4Q0YKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTM2X2NiWzEyXSA9IHsKKyAgICAzLCAxMiwgMSwgMywgNSwgNSwgMTMsIDI3LCA2OSwgOTYsIDM1LCAyCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2EzNl94bGF0WzI1Nl0gPSB7CisgICAgMHgwMCwgMHgxMCwgMHgwMSwgMHgxMSwgMHgyMCwgMHgyMSwgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMSwgMHg0MSwgMHgzMiwKKyAgICAweDEzLCAweDIzLCAweDMwLCAweDQwLCAweDUxLCAweDQyLCAweDAzLCAweDMzLCAweDQzLCAweDA0LCAweDE0LCAweDI0LAorICAgIDB4MzQsIDB4MTUsIDB4MjUsIDB4NTAsIDB4NjEsIDB4NzEsIDB4RDEsIDB4NTIsIDB4NjIsIDB4NzIsIDB4RDIsIDB4NTMsCisgICAgMHg2MywgMHhEMywgMHg0NCwgMHg1NCwgMHg2NCwgMHgwNSwgMHgzNSwgMHg0NSwgMHg1NSwgMHgxNiwgMHgyNiwgMHgzNiwKKyAgICAweDQ2LCAweDE3LCAweDI3LCAweDFELCAweDJELCAweDNELCAweDYwLCAweDcwLCAweEQwLCAweDgxLCAweDkxLCAweEExLAorICAgIDB4QzEsIDB4RTEsIDB4RjEsIDB4ODIsIDB4OTIsIDB4QzIsIDB4RTIsIDB4RjIsIDB4NzMsIDB4ODMsIDB4RTMsIDB4RjMsCisgICAgMHg3NCwgMHg4NCwgMHhDNCwgMHhENCwgMHhFNCwgMHhGNCwgMHg2NSwgMHg3NSwgMHg4NSwgMHhENSwgMHhFNSwgMHgwNiwKKyAgICAweDU2LCAweDY2LCAweEQ2LCAweEU2LCAweDA3LCAweDM3LCAweDQ3LCAweDU3LCAweDY3LCAweEQ3LCAweEU3LCAweDE4LAorICAgIDB4MjgsIDB4MzgsIDB4NDgsIDB4NTgsIDB4RDgsIDB4MTksIDB4MjksIDB4MkEsIDB4MUMsIDB4MkMsIDB4MEQsIDB4NEQsCisgICAgMHg1RCwgMHg2RCwgMHg3RCwgMHg4RCwgMHg5RCwgMHgxRSwgMHgyRSwgMHgzRSwgMHg0RSwgMHg1RSwgMHg2RSwgMHg3RSwKKyAgICAweDFGLCAweDJGLCAweDNGLCAweDgwLCAweDkwLCAweEEwLCAweEMwLCAweEUwLCAweEYwLCAweEIxLCAweEEyLCAweEIyLAorICAgIDB4OTMsIDB4QTMsIDB4QjMsIDB4QzMsIDB4OTQsIDB4QTQsIDB4QjQsIDB4OTUsIDB4QTUsIDB4QjUsIDB4QzUsIDB4RjUsCisgICAgMHg3NiwgMHg4NiwgMHg5NiwgMHhBNiwgMHhDNiwgMHhGNiwgMHg3NywgMHg4NywgMHg5NywgMHhBNywgMHhDNywgMHhGNywKKyAgICAweDA4LCAweDY4LCAweDc4LCAweDg4LCAweDk4LCAweEM4LCAweEU4LCAweEY4LCAweDA5LCAweDM5LCAweDQ5LCAweDU5LAorICAgIDB4NjksIDB4NzksIDB4ODksIDB4RDksIDB4RTksIDB4RjksIDB4MEEsIDB4MUEsIDB4M0EsIDB4NEEsIDB4NUEsIDB4NkEsCisgICAgMHhEQSwgMHhFQSwgMHhGQSwgMHgxQiwgMHgyQiwgMHgzQiwgMHg0QiwgMHg1QiwgMHhEQiwgMHhFQiwgMHhGQiwgMHgwQywKKyAgICAweDNDLCAweDRDLCAweDVDLCAweDZDLCAweDdDLCAweDhDLCAweDlDLCAweERDLCAweEVDLCAweEFELCAweEJELCAweENELAorICAgIDB4REQsIDB4RUQsIDB4MEUsIDB4OEUsIDB4OUUsIDB4QUUsIDB4QkUsIDB4MEYsIDB4NEYsIDB4NUYsIDB4NkYsIDB4N0YsCisgICAgMHg4RiwgMHg5RiwgMHhBRiwgMHhCMCwgMHhCNiwgMHhCNywgMHhBOCwgMHhCOCwgMHg5OSwgMHhBOSwgMHhCOSwgMHhDOSwKKyAgICAweDdBLCAweDhBLCAweDlBLCAweEFBLCAweEJBLCAweENBLCAweDBCLCAweDZCLCAweDdCLCAweDhCLCAweDlCLCAweENCLAorICAgIDB4QUMsIDB4QkMsIDB4Q0MsIDB4RkMsIDB4RkQsIDB4Q0UsIDB4REUsIDB4RUUsIDB4RkUsIDB4QkYsIDB4Q0YsIDB4REYsCisgICAgMHhFRiwgMHhGRiwgMHhBQiwgMHhCQgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hMzdfY2JbN10gPSB7IDQsIDgsIDcsIDYsIDgsIDIyLCAyMCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2EzN194bGF0WzYzXSA9IHsKKyAgICAgMCwgIDEsICAyLCAgMywgNjEsIDYyLCA2MywgIDQsICA1LCAgNiwgNTgsIDU5LCA2MCwgIDcsICA4LCAgOSwKKyAgICAxMCwgNTQsIDU1LCA1NiwgNTcsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDI1LCAyNiwgMjcsIDI4LCAyOSwKKyAgICAzMCwgMzUsIDM2LCAzNywgMzgsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDE3LCAxOCwgMTksIDIwLCAyMSwKKyAgICAyMiwgMjMsIDI0LCAzMSwgMzMsIDM0LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E0MV9jYlsxNF0gPSB7CisgICAgMSwgMTIsIDEsIDAsIDAsIDYsIDIsIDAsIDAsIDAsIDE5LCA5LCAyNCwgMjAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTQxX3hsYXRbODFdID0geworICAgIDB4MDAsIDB4NDAsIDB4QzAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MEMsIDB4MDEsIDB4MDMsIDB4NTAsIDB4RDAsIDB4NzAsCisgICAgMHhGMCwgMHhDNCwgMHgzNCwgMHg0QywgMHhDQywgMHgxQywgMHg0MSwgMHhDMSwgMHgzMSwgMHgwNSwgMHgwRCwgMHg0MywKKyAgICAweEMzLCAweDEzLCAweDA3LCAweDBGLCAweDQ0LCAweDE0LCAweDc0LCAweERDLCAweDNDLCAweDExLCAweDFELCAweDMzLAorICAgIDB4MzcsIDB4NTQsIDB4RDQsIDB4RjQsIDB4NUMsIDB4N0MsIDB4RkMsIDB4RDEsIDB4NzEsIDB4RjEsIDB4QzUsIDB4MTUsCisgICAgMHgzNSwgMHg0RCwgMHhDRCwgMHhERCwgMHgzRCwgMHhEMywgMHg3MywgMHg0NywgMHhDNywgMHgxNywgMHg3NywgMHgxRiwKKyAgICAweDNGLCAweDUxLCAweDQ1LCAweDU1LCAweEQ1LCAweDc1LCAweEY1LCAweDVELCAweDdELCAweEZELCAweDUzLCAweEYzLAorICAgIDB4NTcsIDB4RDcsIDB4RjcsIDB4NEYsIDB4Q0YsIDB4NUYsIDB4REYsIDB4N0YsIDB4RkYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTQyX2NiWzEwXSA9IHsgMywgMTAsIDEsIDIsIDEzLCAxLCAzMSwgMTMsIDE2LCA0IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTQyX3hsYXRbODFdID0geworICAgIDB4MDAsIDB4NDAsIDB4MDEsIDB4MTAsIDB4NTAsIDB4MDQsIDB4NDQsIDB4MTQsIDB4NTQsIDB4NDEsIDB4MTEsIDB4NTEsCisgICAgMHgwNSwgMHg0NSwgMHgxNSwgMHg1NSwgMHg1OSwgMHg4MCwgMHg5MCwgMHgyMCwgMHg2MCwgMHg4NCwgMHg5NCwgMHgyNCwKKyAgICAweDY0LCAweDA4LCAweDQ4LCAweDE4LCAweDU4LCAweDgxLCAweDkxLCAweDIxLCAweDYxLCAweDg1LCAweDk1LCAweDI1LAorICAgIDB4NjUsIDB4MDksIDB4NDksIDB4MTksIDB4MDIsIDB4NDIsIDB4MTIsIDB4NTIsIDB4MDYsIDB4NDYsIDB4MTYsIDB4NTYsCisgICAgMHhBMCwgMHhBNCwgMHg2OCwgMHhBMSwgMHhBNSwgMHg5OSwgMHgyOSwgMHg2OSwgMHg5NiwgMHg2NiwgMHg0QSwgMHgxQSwKKyAgICAweDVBLCAweDg4LCAweDk4LCAweDI4LCAweDg5LCAweEE5LCAweDgyLCAweDkyLCAweDIyLCAweDYyLCAweDg2LCAweDI2LAorICAgIDB4QTYsIDB4MEEsIDB4OUEsIDB4MkEsIDB4NkEsIDB4QTgsIDB4QTIsIDB4OEEsIDB4QUEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTQzX2NiWzVdID0geyAyLCA0LCAyLCAzLCAyIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTQzX3hsYXRbN10gPSB7IDAsIDcsIDEsIDIsIDYsIDMsIDUgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNDRfY2JbOV0gPSB7IDQsIDEwLCA1LCA0LCAxMiwgMTcsIDQ3LCAyNCwgMTIgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNDRfeGxhdFsxMjFdID0geworICAgIDB4MDAsIDB4MTAsIDB4RjAsIDB4MDEsIDB4MEYsIDB4MTEsIDB4RjEsIDB4MUYsIDB4RkYsIDB4MjAsIDB4RTAsIDB4MjEsCisgICAgMHhFMSwgMHgwMiwgMHgxMiwgMHhGMiwgMHgwRSwgMHgxRSwgMHhGRSwgMHgyRiwgMHhFRiwgMHgzMCwgMHg1MCwgMHhEMCwKKyAgICAweEQxLCAweDIyLCAweEUyLCAweDAzLCAweDEzLCAweEYzLCAweDBELCAweDFELCAweDJELCAweEZELCAweDJFLCAweEVFLAorICAgIDB4M0YsIDB4REYsIDB4NDAsIDB4QjAsIDB4QzAsIDB4MzEsIDB4NDEsIDB4NTEsIDB4QjEsIDB4QzEsIDB4MzIsIDB4QjIsCisgICAgMHhDMiwgMHhEMiwgMHgyMywgMHhCMywgMHhEMywgMHhFMywgMHgwNCwgMHgxNCwgMHhFNCwgMHhGNCwgMHgwNSwgMHgxNSwKKyAgICAweEQ1LCAweEU1LCAweEY1LCAweDBCLCAweDFCLCAweDJCLCAweDNCLCAweEVCLCAweEZCLCAweDBDLCAweDFDLCAweDJDLAorICAgIDB4RkMsIDB4M0QsIDB4NUQsIDB4RUQsIDB4M0UsIDB4NEUsIDB4NUUsIDB4QkUsIDB4REUsIDB4NEYsIDB4NUYsIDB4QkYsCisgICAgMHhDRiwgMHg0MiwgMHg1MiwgMHgzMywgMHg1MywgMHhDMywgMHgyNCwgMHhCNCwgMHhENCwgMHgyNSwgMHgzNSwgMHhDNSwKKyAgICAweDRCLCAweENCLCAweERCLCAweDNDLCAweDRDLCAweDVDLCAweERDLCAweEVDLCAweDRELCAweEJELCAweENELCAweERELAorICAgIDB4Q0UsIDB4NDMsIDB4MzQsIDB4NDQsIDB4NTQsIDB4QzQsIDB4NDUsIDB4NTUsIDB4QjUsIDB4NUIsIDB4QkIsIDB4QkMsCisgICAgMHhDQworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNDVfY2JbNV0gPSB7IDIsIDQsIDIsIDIsIDQgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNDVfeGxhdFs4XSA9IHsgMSwgMiwgMCwgMywgNCwgNSwgNiwgNyB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E0Nl9jYls3XSA9IHsgNSwgOSwgMSwgMTYsIDMxLCAzNiwgMTcyIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTQ2X3hsYXRbMjU2XSA9IHsKKyAgICAweDAyLCAweDAwLCAweDMwLCAweDIxLCAweDMxLCAweDQxLCAweDYxLCAweDEyLCAweDIyLCAweDQyLCAweDYyLCAweDQzLAorICAgIDB4NTMsIDB4MjQsIDB4NDUsIDB4MjYsIDB4MjcsIDB4MTAsIDB4NDAsIDB4QjAsIDB4MDEsIDB4MTEsIDB4ODEsIDB4MzIsCisgICAgMHg1MiwgMHg3MiwgMHg5MiwgMHgwMywgMHgxMywgMHgzMywgMHg2MywgMHgxNCwgMHgzNCwgMHg1NCwgMHg2NCwgMHg3NCwKKyAgICAweDA1LCAweDE1LCAweDI1LCAweDM1LCAweDU1LCAweDY1LCAweDA2LCAweDQ2LCAweDU2LCAweDU3LCAweDY3LCAweDg4LAorICAgIDB4MjAsIDB4NTEsIDB4OTEsIDB4RDEsIDB4RjIsIDB4MjMsIDB4ODMsIDB4OTMsIDB4MDQsIDB4NDQsIDB4ODQsIDB4OTQsCisgICAgMHg3NSwgMHg4NSwgMHhDNSwgMHgzNiwgMHg2NiwgMHg5NiwgMHhCNiwgMHgwNywgMHgzNywgMHg5NywgMHgwOCwgMHgyOCwKKyAgICAweDM4LCAweDQ4LCAweDY4LCAweDA5LCAweDY5LCAweDc5LCAweDBBLCAweDJBLCAweDFCLCAweDlCLCAweDJDLCAweDRELAorICAgIDB4NTAsIDB4NjAsIDB4NzAsIDB4ODAsIDB4OTAsIDB4QTAsIDB4QzAsIDB4RDAsIDB4RTAsIDB4RjAsIDB4NzEsIDB4QTEsCisgICAgMHhCMSwgMHhDMSwgMHhFMSwgMHhGMSwgMHg4MiwgMHhBMiwgMHhCMiwgMHhDMiwgMHhEMiwgMHhFMiwgMHg3MywgMHhBMywKKyAgICAweEIzLCAweEMzLCAweEQzLCAweEUzLCAweEYzLCAweEE0LCAweEI0LCAweEM0LCAweEQ0LCAweEU0LCAweEY0LCAweDk1LAorICAgIDB4QTUsIDB4QjUsIDB4RDUsIDB4RTUsIDB4RjUsIDB4MTYsIDB4NzYsIDB4ODYsIDB4QTYsIDB4QzYsIDB4RDYsIDB4RTYsCisgICAgMHhGNiwgMHgxNywgMHg0NywgMHg3NywgMHg4NywgMHhBNywgMHhCNywgMHhDNywgMHhENywgMHhFNywgMHhGNywgMHgxOCwKKyAgICAweDU4LCAweDc4LCAweDk4LCAweEE4LCAweEI4LCAweEM4LCAweEQ4LCAweEU4LCAweEY4LCAweDE5LCAweDI5LCAweDM5LAorICAgIDB4NDksIDB4NTksIDB4ODksIDB4OTksIDB4QTksIDB4QjksIDB4QzksIDB4RDksIDB4RTksIDB4RjksIDB4MUEsIDB4M0EsCisgICAgMHg0QSwgMHg1QSwgMHg2QSwgMHg3QSwgMHg4QSwgMHg5QSwgMHhBQSwgMHhCQSwgMHhDQSwgMHhEQSwgMHhFQSwgMHhGQSwKKyAgICAweDBCLCAweDJCLCAweDNCLCAweDRCLCAweDVCLCAweDZCLCAweDdCLCAweDhCLCAweEFCLCAweEJCLCAweENCLCAweERCLAorICAgIDB4RUIsIDB4RkIsIDB4MEMsIDB4MUMsIDB4M0MsIDB4NEMsIDB4NUMsIDB4NkMsIDB4N0MsIDB4OEMsIDB4OUMsIDB4QUMsCisgICAgMHhCQywgMHhDQywgMHhEQywgMHhFQywgMHhGQywgMHgwRCwgMHgxRCwgMHgyRCwgMHgzRCwgMHg1RCwgMHg2RCwgMHg3RCwKKyAgICAweDhELCAweDlELCAweEFELCAweEJELCAweENELCAweERELCAweEVELCAweEZELCAweDBFLCAweDFFLCAweDJFLCAweDNFLAorICAgIDB4NEUsIDB4NUUsIDB4NkUsIDB4N0UsIDB4OEUsIDB4OUUsIDB4QUUsIDB4QkUsIDB4Q0UsIDB4REUsIDB4RUUsIDB4RkUsCisgICAgMHgwRiwgMHgxRiwgMHgyRiwgMHgzRiwgMHg0RiwgMHg1RiwgMHg2RiwgMHg3RiwgMHg4RiwgMHg5RiwgMHhBRiwgMHhCRiwKKyAgICAweENGLCAweERGLCAweEVGLCAweEZGCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E0N19jYls4XSA9IHsgNCwgOSwgNSwgMTIsIDksIDEyLCAxNSwgMTAgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNDdfeGxhdFs2M10gPSB7CisgICAgIDAsICAxLCAgMiwgNjIsIDYzLCAgMywgIDQsICA1LCAgNiwgIDgsIDU0LCA1NiwgNTcsIDU4LCA1OSwgNjAsCisgICAgNjEsICA3LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCA1MywgNTUsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsCisgICAgMjEsIDM2LCAzNywgMzksIDQyLCA1MiwgMjIsIDI1LCAyOCwgMzUsIDM4LCA0MCwgNDEsIDQzLCA0NSwgNDYsCisgICAgNDcsIDQ4LCA0OSwgNTAsIDUxLCAyMywgMjQsIDI2LCAyNywgMjksIDMwLCAzMSwgMzMsIDM0LCA0NAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNTFfY2JbMTJdID0geworICAgIDIsIDExLCAxLCAwLCA2LCAyLCA2LCAxOCwgNCwgMjYsIDYsIDEyCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E1MV94bGF0WzgxXSA9IHsKKyAgICAweDAwLCAweDQwLCAweEMwLCAweDMwLCAweDA0LCAweDAxLCAweDAzLCAweDEwLCAweDBDLCAweEQwLCAweDcwLCAweDM0LAorICAgIDB4MUMsIDB4MEQsIDB4MDcsIDB4NTAsIDB4RjAsIDB4NDQsIDB4QzQsIDB4MTQsIDB4NEMsIDB4Q0MsIDB4M0MsIDB4NDEsCisgICAgMHhDMSwgMHgxMSwgMHgzMSwgMHgwNSwgMHg0MywgMHhDMywgMHgxMywgMHgzMywgMHgwRiwgMHg3NCwgMHhEQywgMHgxRCwKKyAgICAweDM3LCAweDU0LCAweEQ0LCAweEY0LCAweDVDLCAweDdDLCAweEZDLCAweEQxLCAweDcxLCAweEYxLCAweEM1LCAweDE1LAorICAgIDB4MzUsIDB4NEQsIDB4Q0QsIDB4REQsIDB4M0QsIDB4NTMsIDB4RDMsIDB4NzMsIDB4NDcsIDB4QzcsIDB4MTcsIDB4NzcsCisgICAgMHg0RiwgMHgxRiwgMHgzRiwgMHg1MSwgMHg0NSwgMHg1NSwgMHhGMywgMHhDRiwgMHhGRiwgMHhENSwgMHg3NSwgMHhGNSwKKyAgICAweDVELCAweDdELCAweEZELCAweDU3LCAweEQ3LCAweEY3LCAweDVGLCAweERGLCAweDdGCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E1Ml9jYlsxMl0gPSB7IDEsIDEwLCAxLCAwLCAyLCAyLCAwLCA0LCAzLCA4LCAzLCAyIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTUyX3hsYXRbMjVdID0geworICAgIDB4MDAsIDB4MDgsIDB4MzgsIDB4MDEsIDB4MDcsIDB4MDksIDB4MzksIDB4MEYsIDB4M0YsIDB4MTAsIDB4MDIsIDB4MDYsCisgICAgMHgzMCwgMHgxMSwgMHgzMSwgMHgwQSwgMHgzQSwgMHgwRSwgMHgxNywgMHgzNywgMHgzMiwgMHgxNiwgMHgzRSwgMHgxMiwKKyAgICAweDM2Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E1M194bGF0WzddID0geyAwLCAxLCAyLCA2LCA3LCAzLCA1IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTU0X2NiWzhdID0geyA0LCA5LCA0LCA3LCAxMiwgMTksIDIxLCA1OCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E1NF94bGF0WzEyMV0gPSB7CisgICAgMHgwMCwgMHgwMSwgMHgwRiwgMHgxRiwgMHgxMCwgMHhFMCwgMHhGMCwgMHgxMSwgMHhGMSwgMHgyRiwgMHhGRiwgMHgyMCwKKyAgICAweDIxLCAweEUxLCAweDAyLCAweDEyLCAweEYyLCAweDAzLCAweEYzLCAweDBFLCAweDJFLCAweEZFLCAweDNGLCAweDMwLAorICAgIDB4NDAsIDB4RDAsIDB4QzEsIDB4RDEsIDB4MjIsIDB4QzIsIDB4MzMsIDB4RTMsIDB4MEMsIDB4Q0MsIDB4MEQsIDB4MUQsCisgICAgMHgyRCwgMHhGRCwgMHgxRSwgMHgzRSwgMHg1RSwgMHhFRiwgMHhDMCwgMHg1MiwgMHhCMiwgMHhEMiwgMHg0MywgMHhDMywKKyAgICAweEQzLCAweDI0LCAweDQ1LCAweEY1LCAweDRCLCAweDVCLCAweEZCLCAweDFDLCAweDNELCAweEJELCAweERELCAweEVFLAorICAgIDB4QkYsIDB4Q0YsIDB4REYsIDB4NTAsIDB4QjAsIDB4MzEsIDB4NDEsIDB4NTEsIDB4QjEsIDB4MzIsIDB4NDIsIDB4RTIsCisgICAgMHgxMywgMHgyMywgMHg1MywgMHhCMywgMHgwNCwgMHgxNCwgMHgzNCwgMHg0NCwgMHg1NCwgMHhCNCwgMHhDNCwgMHhENCwKKyAgICAweEU0LCAweEY0LCAweDA1LCAweDE1LCAweDI1LCAweDM1LCAweDU1LCAweEI1LCAweEM1LCAweEQ1LCAweEU1LCAweDBCLAorICAgIDB4MUIsIDB4MkIsIDB4M0IsIDB4QkIsIDB4Q0IsIDB4REIsIDB4RUIsIDB4MkMsIDB4M0MsIDB4NEMsIDB4NUMsIDB4QkMsCisgICAgMHhEQywgMHhFQywgMHhGQywgMHg0RCwgMHg1RCwgMHhDRCwgMHhFRCwgMHg0RSwgMHhCRSwgMHhDRSwgMHhERSwgMHg0RiwKKyAgICAweDVGCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E1NV9jYls4XSA9IHsgMSwgNiwgMSwgMSwgMSwgMCwgMywgMiB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E1NV94bGF0WzhdID0geyAwLCAxLCAyLCAzLCA2LCA3LCA0LCA1IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTU2X2NiWzddID0geyAzLCA3LCAxLCA4LCA2LCA4LCA4IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTU2X3hsYXRbMzFdID0geworICAgIDQsICAwLCAgMSwgIDIsICAzLCAyOCwgMjksIDMwLCAzMSwgIDUsICA2LCAgNywgMjQsIDI1LCAyNywgOCwKKyAgICA5LCAxNCwgMTksIDIxLCAyMiwgMjMsIDI2LCAxMCwgMTEsIDEyLCAxMywgMTUsIDE3LCAxOCwgMjAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTU3X2NiWzldID0geyAzLCA5LCAxLCA1LCA3LCA4LCAxNiwgMjIsIDQgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNTdfeGxhdFs2M10gPSB7CisgICAgIDAsICAxLCAgMiwgNjEsIDYyLCA2MywgIDMsICA0LCAgNSwgIDYsIDU4LCA1OSwKKyAgICA2MCwgIDcsICA4LCAgOSwgMTAsIDU0LCA1NSwgNTYsIDU3LCAxMSwgMTIsIDEzLAorICAgIDE0LCAxNSwgMjYsIDI3LCAyOCwgMzYsIDM3LCAzOCwgNDksIDUwLCA1MSwgNTIsCisgICAgNTMsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIzLCAyNCwgMjUsIDI5LCAzMCwKKyAgICAzMSwgMzMsIDM0LCAzNSwgMzksIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDIyLAorICAgIDQwLCA0MSwgNDIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTYxX2NiWzEyXSA9IHsKKyAgICAyLCAxMSwgMSwgMCwgOCwgMCwgMSwgMTYsIDEwLCAyOSwgMTIsIDQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTYxX3hsYXRbODFdID0geworICAgIDB4MDAsIDB4NDAsIDB4QzAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MEMsIDB4MDEsIDB4MDMsIDB4NzAsIDB4NTAsIDB4RDAsCisgICAgMHhGMCwgMHg0NCwgMHhDNCwgMHgxNCwgMHgzNCwgMHg0QywgMHgxQywgMHgzQywgMHgzMSwgMHgwNSwgMHgwRCwgMHgxMywKKyAgICAweDA3LCAweDBGLCAweDc0LCAweENDLCAweERDLCAweEZDLCAweDQxLCAweEMxLCAweDExLCAweDQzLCAweEMzLCAweDMzLAorICAgIDB4NTQsIDB4RDQsIDB4RjQsIDB4NUMsIDB4N0MsIDB4NTEsIDB4RDEsIDB4NzEsIDB4RjEsIDB4NDUsIDB4QzUsIDB4MTUsCisgICAgMHgzNSwgMHg0RCwgMHhDRCwgMHgxRCwgMHgzRCwgMHg1MywgMHhEMywgMHg3MywgMHhGMywgMHg0NywgMHhDNywgMHgxNywKKyAgICAweDM3LCAweDRGLCAweENGLCAweDFGLCAweDNGLCAweDU1LCAweEQ1LCAweDc1LCAweEY1LCAweDVELCAweERELCAweEZELAorICAgIDB4NTcsIDB4RDcsIDB4NzcsIDB4RjcsIDB4RkYsIDB4N0QsIDB4NUYsIDB4REYsIDB4N0YKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTYyX2NiWzhdID0geyAzLCA4LCA1LCAyLCAyLCA5LCA1LCAyIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTYyX3hsYXRbMjVdID0geworICAgIDB4MDAsIDB4MDgsIDB4MzgsIDB4MDEsIDB4MDcsIDB4MzksIDB4MEYsIDB4MDksIDB4M0YsIDB4MTAsIDB4MzAsIDB4MzEsCisgICAgMHgwMiwgMHgzQSwgMHgwNiwgMHgwRSwgMHgxNywgMHgzNywgMHgxMSwgMHgwQSwgMHgzMiwgMHgxNiwgMHgzRSwgMHgxMiwKKyAgICAweDM2Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E2M19jYlsxMV0gPSB7CisgICAgMywgMTEsIDEsIDEsIDEwLCA0LCAxNiwgMjksIDQ2LCA3NSwgNzQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTYzX3hsYXRbMjU2XSA9IHsKKyAgICAweDAwLCAweDQwLCAweDEwLCAweDUwLCAweDA0LCAweDQ0LCAweDE0LCAweDAxLCAweDQxLCAweDA1LCAweDQ1LCAweDU1LAorICAgIDB4NTQsIDB4MTEsIDB4NTEsIDB4MTUsIDB4ODAsIDB4OTAsIDB4NjAsIDB4MjQsIDB4NjQsIDB4QTQsIDB4NDgsIDB4NjEsCisgICAgMHg5NSwgMHgyNSwgMHhBNSwgMHgwMiwgMHg0MiwgMHg1MiwgMHgxNiwgMHg1NiwgMHgyMCwgMHg4NCwgMHg5NCwgMHgxOCwKKyAgICAweDU4LCAweDgxLCAweDkxLCAweDg1LCAweDY1LCAweDA5LCAweDQ5LCAweDE5LCAweDU5LCAweDk5LCAweDI5LCAweDY5LAorICAgIDB4NzksIDB4NUQsIDB4MTIsIDB4NjIsIDB4MDYsIDB4NDYsIDB4ODYsIDB4NjYsIDB4MUEsIDB4NUEsIDB4NkEsIDB4NDcsCisgICAgMHgxNywgMHhDMCwgMHhBMCwgMHhFMCwgMHhDNCwgMHhENCwgMHg3NCwgMHgwOCwgMHg3OCwgMHgwQywgMHg0QywgMHgxQywKKyAgICAweDVDLCAweEQxLCAweDIxLCAweEUxLCAweDcxLCAweEM1LCAweEU1LCAweDc1LCAweEI1LCAweDg5LCAweEJELCAweDkyLAorICAgIDB4MjIsIDB4OTYsIDB4QTYsIDB4MzYsIDB4MEEsIDB4NEEsIDB4OEEsIDB4OUEsIDB4MkEsIDB4N0EsIDB4REUsIDB4NkUsCisgICAgMHg0MywgMHgxMywgMHg1MywgMHgyMywgMHgwNywgMHg3NywgMHg0QiwgMHgxQiwgMHg5QiwgMHg2QiwgMHgyRiwgMHhEMCwKKyAgICAweDMwLCAweDcwLCAweEU0LCAweDM0LCAweEY0LCAweEM4LCAweDk4LCAweDI4LCAweDY4LCAweEE4LCAweEU4LCAweDM4LAorICAgIDB4QjgsIDB4RjgsIDB4OUMsIDB4MkMsIDB4NkMsIDB4N0MsIDB4QTEsIDB4QjEsIDB4RDUsIDB4MzUsIDB4QzksIDB4RDksCisgICAgMHhBOSwgMHhFOSwgMHgzOSwgMHhCOSwgMHhGOSwgMHhDRCwgMHgxRCwgMHgyRCwgMHhBRCwgMHg3RCwgMHhDMiwgMHhEMiwKKyAgICAweEEyLCAweEIyLCAweEYyLCAweEM2LCAweDI2LCAweDc2LCAweEI2LCAweERBLCAweEFBLCAweEVBLCAweDNBLCAweEZBLAorICAgIDB4MEUsIDB4NEUsIDB4MkUsIDB4N0UsIDB4QkUsIDB4RkUsIDB4MDMsIDB4ODMsIDB4NjMsIDB4QTMsIDB4QjMsIDB4ODcsCisgICAgMHg1NywgMHg5NywgMHhENywgMHgyNywgMHgwQiwgMHg4QiwgMHg1QiwgMHgyQiwgMHhBQiwgMHhDRiwgMHgxRiwgMHg5RiwKKyAgICAweDdGLCAweEJGLCAweEIwLCAweEYwLCAweEI0LCAweDg4LCAweEQ4LCAweDhDLCAweENDLCAweERDLCAweEFDLCAweEVDLAorICAgIDB4M0MsIDB4QkMsIDB4RkMsIDB4QzEsIDB4MzEsIDB4RjEsIDB4RjUsIDB4MEQsIDB4NEQsIDB4OEQsIDB4OUQsIDB4REQsCisgICAgMHg2RCwgMHhFRCwgMHgzRCwgMHhGRCwgMHg4MiwgMHhFMiwgMHgzMiwgMHg3MiwgMHhENiwgMHhFNiwgMHhGNiwgMHhDQSwKKyAgICAweEJBLCAweDhFLCAweENFLCAweDFFLCAweDVFLCAweDlFLCAweEFFLCAweEVFLCAweDNFLCAweEMzLCAweDkzLCAweEQzLAorICAgIDB4RTMsIDB4MzMsIDB4NzMsIDB4RjMsIDB4QzcsIDB4NjcsIDB4QTcsIDB4RTcsIDB4MzcsIDB4QjcsIDB4RjcsIDB4Q0IsCisgICAgMHhEQiwgMHhFQiwgMHgzQiwgMHg3QiwgMHhCQiwgMHhGQiwgMHgwRiwgMHg0RiwgMHg4RiwgMHg1RiwgMHhERiwgMHg2RiwKKyAgICAweEFGLCAweEVGLCAweDNGLCAweEZGCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E2NF9jYls4XSA9IHsgNCwgOSwgMSwgNywgMTIsIDM2LCA2MywgMiB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E2NF94bGF0WzEyMV0gPSB7CisgICAgMHgwMCwgMHgxMCwgMHgyMCwgMHhFMCwgMHhGMCwgMHgwMiwgMHgwRSwgMHhFRiwgMHgzMCwgMHgwMSwgMHgxMSwgMHgyMSwKKyAgICAweDMxLCAweEYxLCAweDEyLCAweEYyLCAweDFFLCAweEVFLCAweERGLCAweEZGLCAweDQwLCAweEMwLCAweEQwLCAweEQxLAorICAgIDB4RTEsIDB4MjIsIDB4MzIsIDB4NDIsIDB4RDIsIDB4RTIsIDB4MDMsIDB4MTMsIDB4MjMsIDB4QjMsIDB4QzMsIDB4RTMsCisgICAgMHhGMywgMHhFNCwgMHgwNSwgMHhGNSwgMHgyQiwgMHgwQywgMHhGQywgMHgxRCwgMHgyRCwgMHhCRCwgMHhERCwgMHhGRCwKKyAgICAweDJFLCAweDRFLCAweERFLCAweEZFLCAweDBGLCAweDFGLCAweDJGLCAweDNGLCAweDUwLCAweEIwLCAweDQxLCAweDUxLAorICAgIDB4QjEsIDB4QzEsIDB4NTIsIDB4QjIsIDB4QzIsIDB4MzMsIDB4NDMsIDB4NTMsIDB4RDMsIDB4MDQsIDB4MTQsIDB4MjQsCisgICAgMHgzNCwgMHg0NCwgMHg1NCwgMHhCNCwgMHhDNCwgMHhENCwgMHhGNCwgMHgxNSwgMHgyNSwgMHgzNSwgMHg0NSwgMHg1NSwKKyAgICAweEI1LCAweEM1LCAweEQ1LCAweEU1LCAweDBCLCAweDFCLCAweDNCLCAweDRCLCAweDVCLCAweEJCLCAweENCLCAweERCLAorICAgIDB4RUIsIDB4RkIsIDB4MUMsIDB4MkMsIDB4M0MsIDB4NEMsIDB4NUMsIDB4QkMsIDB4Q0MsIDB4REMsIDB4RUMsIDB4MEQsCisgICAgMHgzRCwgMHg0RCwgMHg1RCwgMHhDRCwgMHhFRCwgMHgzRSwgMHg1RSwgMHhCRSwgMHhDRSwgMHg0RiwgMHhDRiwgMHg1RiwKKyAgICAweEJGCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E2NV9jYls4XSA9IHsgMiwgNywgMywgMCwgMSwgMywgNCwgNCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E2NV94bGF0WzE1XSA9IHsKKyAgICAwLCAxLCAxNSwgMTQsIDIsIDMsIDEzLCA0LCA2LCAxMCwgMTIsIDUsIDcsIDksIDExCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E2Nl9jYlsxMV0gPSB7IDIsIDEwLCAxLCAyLCAyLCA2LCA4LCA2LCAzLCAxLCAyIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTY2X3hsYXRbMzFdID0geworICAgICAwLCAgMSwgMzEsIDIsIDMwLCAgMywgIDQsIDE1LCAxNywgMjgsIDI5LCAgNSwgIDYsICA3LCAgOCwgMjQsCisgICAgMjUsIDI2LCAyNywgOSwgMTAsIDExLCAyMSwgMjIsIDIzLCAxMiwgMTksIDIwLCAxMywgMTQsIDE4Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E2N19jYlsxMF0gPSB7IDIsIDksIDEsIDEsIDMsIDQsIDYsIDEzLCAyNSwgMTAgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNjdfeGxhdFs2M10gPSB7CisgICAgIDAsICAxLCAgMiwgNjIsIDYzLCAgMywgIDQsIDYwLCA2MSwgIDUsICA2LCAgNywgNTcsIDU4LCA1OSwgIDgsCisgICAgIDksIDEwLCAxMSwgMTIsIDEzLCAyNiwgMzgsIDUyLCA1MywgNTQsIDU1LCA1NiwgMTQsIDE1LCAxNiwgMTcsCisgICAgMTgsIDE5LCAyNSwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM5LCA0NSwgNDYsCisgICAgNDcsIDQ4LCA0OSwgNTAsIDUxLCAyMCwgMjEsIDIyLCAyMywgMjQsIDQwLCA0MSwgNDIsIDQzLCA0NAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNzFfY2JbNV0gPSB7IDEsIDMsIDEsIDEsIDIgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNzJfY2JbMTJdID0geworICAgIDIsIDExLCAxLCAwLCA0LCA4LCAzLCA4LCAyNCwgMTcsIDEyLCA0Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E3Ml94bGF0WzgxXSA9IHsKKyAgICAweDAwLCAweDQwLCAweDEwLCAweDA0LCAweDAxLCAweDUwLCAweDQ0LCAweDE0LCAweDU0LCAweDQxLCAweDExLCAweDA1LAorICAgIDB4MTUsIDB4NTEsIDB4NDUsIDB4NTUsIDB4ODAsIDB4OTAsIDB4MjAsIDB4NjQsIDB4MDgsIDB4MTksIDB4MDIsIDB4MDYsCisgICAgMHg2MCwgMHg4NCwgMHg5NCwgMHgyNCwgMHg0OCwgMHgxOCwgMHg1OCwgMHg4MSwgMHg5MSwgMHgyMSwgMHg2MSwgMHg4NSwKKyAgICAweDk1LCAweDI1LCAweDY1LCAweDA5LCAweDQ5LCAweDU5LCAweDQyLCAweDEyLCAweDUyLCAweDQ2LCAweDE2LCAweDU2LAorICAgIDB4QTAsIDB4QTQsIDB4OTgsIDB4MjgsIDB4NjgsIDB4QTEsIDB4QTUsIDB4OTksIDB4MjksIDB4NjksIDB4OTYsIDB4MjYsCisgICAgMHg2NiwgMHgwQSwgMHg0QSwgMHgxQSwgMHg1QSwgMHg4OCwgMHhBOCwgMHg4OSwgMHhBOSwgMHg4MiwgMHg5MiwgMHgyMiwKKyAgICAweDYyLCAweDg2LCAweEE2LCAweDJBLCAweDZBLCAweEEyLCAweDhBLCAweDlBLCAweEFBCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E3M19jYlsxMV0gPSB7IDIsIDEwLCAxLCAxLCA1LCAyLCA4LCA3LCAxMywgOCwgNCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2E3M194bGF0WzQ5XSA9IHsKKyAgICAweDAwLCAweDA4LCAweDM4LCAweDAxLCAweDM5LCAweDA3LCAweDBGLCAweDA5LCAweDNGLCAweDEwLCAweDMwLCAweDMxLAorICAgIDB4MDIsIDB4M0EsIDB4MDYsIDB4MEUsIDB4MTcsIDB4MTEsIDB4MEEsIDB4MzIsIDB4MEQsIDB4MTYsIDB4M0UsIDB4MzcsCisgICAgMHgxOCwgMHgyOCwgMHgxOSwgMHgyOSwgMHgxMiwgMHgyQSwgMHgwMywgMHgzQiwgMHgwNSwgMHgxNSwgMHgxRSwgMHgxRiwKKyAgICAweDJGLCAweDFBLCAweDBCLCAweDJCLCAweDMzLCAweDM1LCAweDNELCAweDJFLCAweDM2LCAweDEzLCAweDFCLCAweDFELAorICAgIDB4MkQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTc0X2NiWzE0XSA9IHsKKyAgICAxLCAxMiwgMSwgMCwgMCwgNCwgMCwgNCwgNSwgOSwgMzAsIDQ1LCAyMSwgMgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNzRfeGxhdFsxMjFdID0geworICAgIDB4MDAsIDB4MTAsIDB4RjAsIDB4MDEsIDB4MEYsIDB4MTEsIDB4RjEsIDB4MUYsIDB4RkYsIDB4MjAsIDB4RTAsIDB4MDIsCisgICAgMHhGMiwgMHgwRSwgMHgyMSwgMHhFMSwgMHgxMiwgMHhFMiwgMHgxRSwgMHgyRSwgMHhGRSwgMHgyRiwgMHhFRiwgMHgzMCwKKyAgICAweDUwLCAweEIwLCAweEMwLCAweEQwLCAweDMxLCAweEIxLCAweEQxLCAweDIyLCAweEQyLCAweDAzLCAweDEzLCAweEUzLAorICAgIDB4RjMsIDB4RjQsIDB4MDUsIDB4RTUsIDB4RjUsIDB4MEIsIDB4MUIsIDB4MEMsIDB4MEQsIDB4MUQsIDB4MkQsIDB4RkQsCisgICAgMHgzRSwgMHhFRSwgMHgzRiwgMHg1RiwgMHhERiwgMHg0MCwgMHg0MSwgMHg1MSwgMHhDMSwgMHgzMiwgMHg0MiwgMHg1MiwKKyAgICAweEIyLCAweEMyLCAweDIzLCAweDMzLCAweEIzLCAweEMzLCAweEQzLCAweDA0LCAweDE0LCAweDI0LCAweEQ0LCAweEU0LAorICAgIDB4MTUsIDB4MjUsIDB4QzUsIDB4RDUsIDB4MkIsIDB4M0IsIDB4RUIsIDB4RkIsIDB4MUMsIDB4MkMsIDB4M0MsIDB4NUMsCisgICAgMHhFQywgMHhGQywgMHgzRCwgMHg1RCwgMHhERCwgMHhFRCwgMHg0RSwgMHg1RSwgMHhCRSwgMHhDRSwgMHhERSwgMHg0RiwKKyAgICAweEJGLCAweENGLCAweDQzLCAweDUzLCAweDM0LCAweDU0LCAweEI0LCAweEM0LCAweDM1LCAweDQ1LCAweDU1LCAweEI1LAorICAgIDB4NEIsIDB4NUIsIDB4Q0IsIDB4REIsIDB4NEMsIDB4QkMsIDB4Q0MsIDB4REMsIDB4NEQsIDB4QkQsIDB4Q0QsIDB4NDQsCisgICAgMHhCQgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNzVfY2JbN10gPSB7IDIsIDYsIDEsIDMsIDMsIDQsIDQgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNzVfeGxhdFsxNV0gPSB7CisgICAgMCwgMSwgMTQsIDE1LCAyLCAzLCAxMywgNCwgNiwgMTAsIDEyLCA1LCA3LCA5LCAxMQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9hNzZfY2JbMTJdID0geworICAgIDMsIDEyLCAxLCAzLCA0LCA4LCAxMCwgMzYsIDYwLCA3OCwgNDgsIDgKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYTc2X3hsYXRbMjU2XSA9IHsKKyAgICAweDAwLCAweDEwLCAweDAxLCAweDExLCAweDIwLCAweDIxLCAweDAyLCAweDEyLCAweDMwLCAweDMxLCAweDQxLCAweDIyLAorICAgIDB4MDMsIDB4MTMsIDB4MjMsIDB4MTQsIDB4NDAsIDB4NTEsIDB4NjEsIDB4MzIsIDB4NDIsIDB4MzMsIDB4MDQsIDB4MjQsCisgICAgMHgxNSwgMHgxNiwgMHg1MCwgMHg2MCwgMHhEMCwgMHg3MSwgMHg4MSwgMHhEMSwgMHhFMSwgMHhGMSwgMHg1MiwgMHg2MiwKKyAgICAweDcyLCAweEQyLCAweDQzLCAweDUzLCAweDYzLCAweEQzLCAweDM0LCAweDQ0LCAweDU0LCAweDA1LCAweDI1LCAweDM1LAorICAgIDB4NDUsIDB4MDYsIDB4MjYsIDB4MzYsIDB4MTcsIDB4MjcsIDB4MTgsIDB4MEQsIDB4MUQsIDB4MkQsIDB4M0QsIDB4MUUsCisgICAgMHgyRSwgMHgxRiwgMHg3MCwgMHg4MCwgMHhFMCwgMHhGMCwgMHg5MSwgMHhBMSwgMHhDMSwgMHg4MiwgMHg5MiwgMHhDMiwKKyAgICAweEUyLCAweEYyLCAweDczLCAweDgzLCAweDkzLCAweEUzLCAweEYzLCAweDY0LCAweDc0LCAweDg0LCAweEQ0LCAweEU0LAorICAgIDB4RjQsIDB4NTUsIDB4NjUsIDB4RDUsIDB4RTUsIDB4RjUsIDB4NDYsIDB4NTYsIDB4NjYsIDB4RDYsIDB4MDcsIDB4MzcsCisgICAgMHg0NywgMHg1NywgMHgwOCwgMHgyOCwgMHgzOCwgMHg0OCwgMHgxOSwgMHgyOSwgMHgzOSwgMHgxQSwgMHgyQSwgMHgxQiwKKyAgICAweDFDLCAweDJDLCAweDNDLCAweDRELCAweDVELCAweDZELCAweDBFLCAweDNFLCAweDRFLCAweDVFLCAweDBGLCAweDJGLAorICAgIDB4M0YsIDB4NEYsIDB4OTAsIDB4QTAsIDB4QjAsIDB4QzAsIDB4QjEsIDB4QTIsIDB4QjIsIDB4QTMsIDB4QjMsIDB4QzMsCisgICAgMHg5NCwgMHhBNCwgMHhCNCwgMHhDNCwgMHg3NSwgMHg4NSwgMHg5NSwgMHhBNSwgMHhDNSwgMHg3NiwgMHg4NiwgMHg5NiwKKyAgICAweEU2LCAweEY2LCAweDY3LCAweDc3LCAweDg3LCAweEQ3LCAweEU3LCAweEY3LCAweDU4LCAweDY4LCAweDc4LCAweDg4LAorICAgIDB4RDgsIDB4RTgsIDB4RjgsIDB4MDksIDB4NDksIDB4NTksIDB4NjksIDB4RDksIDB4RTksIDB4RjksIDB4MEEsIDB4M0EsCisgICAgMHg0QSwgMHg1QSwgMHhEQSwgMHhFQSwgMHgwQiwgMHgyQiwgMHgzQiwgMHg0QiwgMHhEQiwgMHgwQywgMHg0QywgMHg1QywKKyAgICAweDZDLCAweERDLCAweDdELCAweDhELCAweDlELCAweEFELCAweEJELCAweENELCAweDZFLCAweDdFLCAweDhFLCAweDlFLAorICAgIDB4QUUsIDB4QkUsIDB4NUYsIDB4NkYsIDB4N0YsIDB4OEYsIDB4OUYsIDB4QUYsIDB4QjUsIDB4QTYsIDB4QjYsIDB4QzYsCisgICAgMHg5NywgMHhBNywgMHhDNywgMHg5OCwgMHhBOCwgMHhCOCwgMHhDOCwgMHg3OSwgMHg4OSwgMHg5OSwgMHhBOSwgMHhCOSwKKyAgICAweEM5LCAweDZBLCAweDdBLCAweDhBLCAweDlBLCAweEFBLCAweENBLCAweEZBLCAweDVCLCAweDZCLCAweDdCLCAweDhCLAorICAgIDB4Q0IsIDB4RUIsIDB4RkIsIDB4N0MsIDB4OEMsIDB4OUMsIDB4QUMsIDB4QkMsIDB4RUMsIDB4RkMsIDB4REQsIDB4RUQsCisgICAgMHhGRCwgMHhDRSwgMHhERSwgMHhFRSwgMHhGRSwgMHhCRiwgMHhDRiwgMHhERiwgMHhCNywgMHhCQSwgMHg5QiwgMHhBQiwKKyAgICAweEJCLCAweENDLCAweEVGLCAweEZGCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IwMV9jYlsxNF0gPSB7CisgICAgMSwgMTIsIDEsIDAsIDAsIDIsIDYsIDAsIDExLCAxMywgMTIsIDI0LCA0LCA4Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IwMV94bGF0WzgxXSA9IHsKKyAgICAweDAwLCAweDAxLCAweDAzLCAweDQwLCAweEMwLCAweDEwLCAweDMwLCAweDA0LCAweDBDLCAweDUwLCAweEQwLCAweDcwLAorICAgIDB4RjAsIDB4MzQsIDB4MUMsIDB4MDUsIDB4MEQsIDB4MTMsIDB4MDcsIDB4MEYsIDB4NDQsIDB4QzQsIDB4MTQsIDB4NEMsCisgICAgMHhDQywgMHgzQywgMHg0MSwgMHhDMSwgMHgxMSwgMHgzMSwgMHg0MywgMHhDMywgMHgzMywgMHg1NCwgMHg3NCwgMHhEQywKKyAgICAweEZDLCAweDcxLCAweDE1LCAweDRELCAweDFELCAweEQzLCAweEM3LCAweDM3LCAweDNGLCAweEQ0LCAweEY0LCAweDVDLAorICAgIDB4N0MsIDB4NTEsIDB4RDEsIDB4RjEsIDB4NDUsIDB4QzUsIDB4NTUsIDB4MzUsIDB4Q0QsIDB4REQsIDB4M0QsIDB4NTMsCisgICAgMHg3MywgMHhGMywgMHg0NywgMHgxNywgMHg3NywgMHg0RiwgMHhDRiwgMHgxRiwgMHhGRiwgMHhGNSwgMHg3RCwgMHhENywKKyAgICAweDVGLCAweEQ1LCAweDc1LCAweDVELCAweEZELCAweDU3LCAweEY3LCAweERGLCAweDdGCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IwMl9jYlsxNF0gPSB7CisgICAgMSwgMTIsIDEsIDAsIDAsIDQsIDAsIDgsIDQsIDksIDE5LCAxMywgMTMsIDEwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IwMl94bGF0WzgxXSA9IHsKKyAgICAweDAwLCAweDQwLCAweDEwLCAweDA0LCAweDAxLCAweDUwLCAweDQ0LCAweDE0LCAweDU0LCAweDQxLCAweDExLCAweDA1LAorICAgIDB4MTUsIDB4ODAsIDB4NTEsIDB4NDUsIDB4NTUsIDB4OTAsIDB4MjAsIDB4NjAsIDB4MjQsIDB4MDgsIDB4MTgsIDB4MDksCisgICAgMHgwMiwgMHgwNiwgMHg4NCwgMHg5NCwgMHg2NCwgMHg0OCwgMHg1OCwgMHg4MSwgMHg5MSwgMHgyMSwgMHg2MSwgMHg5NSwKKyAgICAweDI1LCAweDY1LCAweDE5LCAweDU5LCAweDQyLCAweDEyLCAweDQ2LCAweDE2LCAweDU2LCAweEEwLCAweEE0LCAweDI4LAorICAgIDB4NjgsIDB4ODUsIDB4QTUsIDB4NDksIDB4MjksIDB4NjksIDB4NTIsIDB4MEEsIDB4MUEsIDB4NUEsIDB4ODgsIDB4OTgsCisgICAgMHhBMSwgMHg4OSwgMHg5OSwgMHhBOSwgMHgyMiwgMHg2MiwgMHg5NiwgMHgyNiwgMHg2NiwgMHg0QSwgMHg2QSwgMHhBOCwKKyAgICAweDgyLCAweDkyLCAweEEyLCAweDg2LCAweEE2LCAweDhBLCAweDlBLCAweDJBLCAweEFBCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IwM19jYlsxMV0gPSB7IDEsIDksIDEsIDAsIDAsIDQsIDAsIDUsIDEyLCAxMywgMTQgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iMDNfeGxhdFs0OV0gPSB7CisgICAgMHgwMCwgMHgwOCwgMHgzOCwgMHgwMSwgMHgwNywgMHgzMCwgMHgwOSwgMHgzOSwgMHgwRiwgMHgzRiwgMHgxMCwgMHgxOCwKKyAgICAweDI4LCAweDMxLCAweDAyLCAweDNBLCAweDAzLCAweDA1LCAweDA2LCAweDBFLCAweDE3LCAweDM3LCAweDExLCAweDE5LAorICAgIDB4MjksIDB4MEEsIDB4MzIsIDB4MEIsIDB4M0IsIDB4MEQsIDB4MTUsIDB4M0QsIDB4M0UsIDB4MUYsIDB4MkYsIDB4MTIsCisgICAgMHgxQSwgMHgyQSwgMHgxMywgMHgxQiwgMHgyQiwgMHgzMywgMHgxRCwgMHgyRCwgMHgzNSwgMHgxNiwgMHgxRSwgMHgyRSwKKyAgICAweDM2Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IwNF9jYlsxMl0gPSB7CisgICAgMiwgMTEsIDEsIDAsIDQsIDQsIDUsIDksIDMwLCA0NSwgMjEsIDIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjA0X3hsYXRbMTIxXSA9IHsKKyAgICAweDAwLCAweDEwLCAweEYwLCAweDAxLCAweDBGLCAweDExLCAweEYxLCAweDFGLCAweEZGLCAweDIwLCAweEUwLCAweDAyLAorICAgIDB4RjIsIDB4MEUsIDB4MjEsIDB4RTEsIDB4MTIsIDB4RTIsIDB4MUUsIDB4MkUsIDB4RkUsIDB4MkYsIDB4RUYsIDB4MzAsCisgICAgMHg1MCwgMHhCMCwgMHhDMCwgMHhEMCwgMHgzMSwgMHhCMSwgMHhEMSwgMHgyMiwgMHhEMiwgMHgwMywgMHgxMywgMHhFMywKKyAgICAweEYzLCAweEY0LCAweDA1LCAweEU1LCAweEY1LCAweDBCLCAweDFCLCAweDBDLCAweDBELCAweDFELCAweDJELCAweEZELAorICAgIDB4M0UsIDB4RUUsIDB4M0YsIDB4NUYsIDB4REYsIDB4NDAsIDB4NDEsIDB4NTEsIDB4QzEsIDB4MzIsIDB4NDIsIDB4NTIsCisgICAgMHhCMiwgMHhDMiwgMHgyMywgMHgzMywgMHhCMywgMHhDMywgMHhEMywgMHgwNCwgMHgxNCwgMHgyNCwgMHhENCwgMHhFNCwKKyAgICAweDE1LCAweDI1LCAweEM1LCAweEQ1LCAweDJCLCAweDNCLCAweEVCLCAweEZCLCAweDFDLCAweDJDLCAweDNDLCAweDVDLAorICAgIDB4RUMsIDB4RkMsIDB4M0QsIDB4NUQsIDB4REQsIDB4RUQsIDB4NEUsIDB4NUUsIDB4QkUsIDB4Q0UsIDB4REUsIDB4NEYsCisgICAgMHhCRiwgMHhDRiwgMHg0MywgMHg1MywgMHgzNCwgMHg1NCwgMHhCNCwgMHhDNCwgMHgzNSwgMHg0NSwgMHg1NSwgMHhCNSwKKyAgICAweDRCLCAweDVCLCAweENCLCAweERCLCAweDRDLCAweEJDLCAweENDLCAweERDLCAweDRELCAweEJELCAweENELCAweDQ0LAorICAgIDB4QkIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjA1X2NiWzExXSA9IHsKKyAgICAzLCAxMSwgMSwgNCwgNCwgNCwgMTIsIDMwLCA3MywgNzUsIDIyCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IwNV94bGF0WzIyNV0gPSB7CisgICAgMHgwMCwgMHgxMCwgMHhGMCwgMHgwMSwgMHgwRiwgMHgxMSwgMHhGMSwgMHgxRiwgMHhGRiwgMHgyMCwgMHhFMCwgMHgwMiwKKyAgICAweDBFLCAweDMwLCAweEQwLCAweDIxLCAweEUxLCAweDEyLCAweEYyLCAweDAzLCAweDBELCAweDFFLCAweEZFLCAweDJGLAorICAgIDB4RUYsIDB4NDAsIDB4NjAsIDB4NzAsIDB4OTAsIDB4QTAsIDB4QzAsIDB4MzEsIDB4RDEsIDB4MjIsIDB4MzIsIDB4RDIsCisgICAgMHhFMiwgMHgxMywgMHgyMywgMHhFMywgMHhGMywgMHgwNCwgMHgwNiwgMHgwNywgMHgwOSwgMHgwQSwgMHgwQywgMHgxRCwKKyAgICAweDJELCAweEZELCAweDJFLCAweDNFLCAweEVFLCAweDNGLCAweERGLCAweDUwLCAweEIwLCAweDQxLCAweDUxLCAweDYxLAorICAgIDB4NzEsIDB4OTEsIDB4QTEsIDB4QjEsIDB4QzEsIDB4NDIsIDB4NjIsIDB4NzIsIDB4OTIsIDB4QTIsIDB4QzIsIDB4MzMsCisgICAgMHg5MywgMHhBMywgMHhEMywgMHgxNCwgMHgyNCwgMHhFNCwgMHhGNCwgMHgwNSwgMHgxNSwgMHhGNSwgMHgxNiwgMHgyNiwKKyAgICAweEQ2LCAweEU2LCAweEY2LCAweDE3LCAweDI3LCAweEQ3LCAweEU3LCAweEY3LCAweDE5LCAweDI5LCAweDM5LCAweEU5LAorICAgIDB4RjksIDB4MUEsIDB4MkEsIDB4RUEsIDB4RkEsIDB4MEIsIDB4MUIsIDB4RkIsIDB4MUMsIDB4MkMsIDB4RUMsIDB4RkMsCisgICAgMHgzRCwgMHg3RCwgMHg5RCwgMHhERCwgMHhFRCwgMHg0RSwgMHg2RSwgMHg3RSwgMHg5RSwgMHhBRSwgMHhDRSwgMHhERSwKKyAgICAweDRGLCAweDVGLCAweDZGLCAweDdGLCAweDlGLCAweEFGLCAweEJGLCAweENGLCAweDUyLCAweEIyLCAweDQzLCAweDUzLAorICAgIDB4NjMsIDB4NzMsIDB4QjMsIDB4QzMsIDB4MzQsIDB4NDQsIDB4NjQsIDB4NzQsIDB4OTQsIDB4QTQsIDB4QjQsIDB4QzQsCisgICAgMHhENCwgMHgyNSwgMHgzNSwgMHg2NSwgMHg3NSwgMHg5NSwgMHhBNSwgMHhENSwgMHhFNSwgMHgzNiwgMHg0NiwgMHg1NiwKKyAgICAweDY2LCAweEE2LCAweEI2LCAweEM2LCAweDM3LCAweDQ3LCAweDU3LCAweEI3LCAweEM3LCAweDQ5LCAweDU5LCAweDY5LAorICAgIDB4QjksIDB4QzksIDB4RDksIDB4M0EsIDB4NEEsIDB4NUEsIDB4NkEsIDB4QUEsIDB4QkEsIDB4Q0EsIDB4REEsIDB4MkIsCisgICAgMHgzQiwgMHg2QiwgMHg3QiwgMHg5QiwgMHhBQiwgMHhEQiwgMHhFQiwgMHgzQywgMHg0QywgMHg2QywgMHg3QywgMHg5QywKKyAgICAweEFDLCAweENDLCAweERDLCAweDRELCAweDVELCAweDZELCAweEFELCAweEJELCAweENELCAweDVFLCAweEJFLCAweDU0LAorICAgIDB4NDUsIDB4NTUsIDB4QjUsIDB4QzUsIDB4NzYsIDB4OTYsIDB4NjcsIDB4NzcsIDB4OTcsIDB4QTcsIDB4NzksIDB4OTksCisgICAgMHhBOSwgMHg3QSwgMHg5QSwgMHg0QiwgMHg1QiwgMHhCQiwgMHhDQiwgMHg1QywgMHhCQworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iMDdfY2JbOV0gPSB7IDMsIDksIDMsIDIsIDQsIDgsIDIzLCAxMywgMTAgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iMDdfeGxhdFs2M10gPSB7CisgICAgIDAsICAxLCA2MywgIDIsIDYyLCAgMywgIDQsIDYwLCA2MSwgIDUsICA2LCAgNywgIDgsIDU2LCA1NywgNTgsCisgICAgNTksICA5LCAxMCwgMTEsIDEyLCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzMsIDM0LCAzNSwgMzYsCisgICAgMzcsIDM4LCAzOSwgNTEsIDUyLCA1MywgNTQsIDU1LCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgNDUsCisgICAgNDYsIDQ3LCA0OCwgNDksIDUwLCAyMCwgMjEsIDIyLCAyMywgMjQsIDQwLCA0MSwgNDIsIDQzLCA0NAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iMTJfY2JbMTBdID0geyAzLCAxMCwgMSwgMywgMTIsIDAsIDMwLCA5LCAxOCwgOCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IxMl94bGF0WzgxXSA9IHsKKyAgICAweDAwLCAweDQwLCAweDA0LCAweDAxLCAweDEwLCAweDUwLCAweDQ0LCAweDE0LCAweDU0LCAweDQxLCAweDExLCAweDUxLAorICAgIDB4MDUsIDB4NDUsIDB4MTUsIDB4NTUsIDB4ODAsIDB4OTAsIDB4MjAsIDB4NjAsIDB4ODQsIDB4OTQsIDB4MjQsIDB4NjQsCisgICAgMHgwOCwgMHg0OCwgMHgxOCwgMHg4MSwgMHg5MSwgMHg2MSwgMHg4NSwgMHg5NSwgMHgyNSwgMHg2NSwgMHgwOSwgMHg0OSwKKyAgICAweDE5LCAweDU5LCAweDAyLCAweDQyLCAweDEyLCAweDUyLCAweDA2LCAweDQ2LCAweDE2LCAweDU2LCAweEE0LCAweDU4LAorICAgIDB4NjgsIDB4MjEsIDB4QTUsIDB4MjksIDB4NjksIDB4MUEsIDB4NUEsIDB4QTAsIDB4ODgsIDB4OTgsIDB4MjgsIDB4QTEsCisgICAgMHg4OSwgMHg5OSwgMHhBOSwgMHg5MiwgMHgyMiwgMHg2MiwgMHg4NiwgMHg5NiwgMHgyNiwgMHg2NiwgMHgwQSwgMHg0QSwKKyAgICAweDZBLCAweEE4LCAweDgyLCAweEEyLCAweEE2LCAweDhBLCAweDlBLCAweDJBLCAweEFBCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IxNF9jYlsxNF0gPSB7CisgICAgMSwgMTIsIDEsIDAsIDAsIDQsIDAsIDMsIDUsIDE2LCAyOCwgMzQsIDI2LCA0Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IxNF94bGF0WzEyMV0gPSB7CisgICAgMHgwMCwgMHgxMCwgMHhGMCwgMHgwMSwgMHgwRiwgMHhGMSwgMHgxRiwgMHhGRiwgMHgyMCwgMHhFMCwgMHgxMSwgMHgwMiwKKyAgICAweDBFLCAweDMwLCAweDUwLCAweEIwLCAweEQwLCAweDIxLCAweEUxLCAweDEyLCAweEYyLCAweDAzLCAweDA1LCAweDBCLAorICAgIDB4MEQsIDB4MUUsIDB4RkUsIDB4MkYsIDB4RUYsIDB4NDAsIDB4QzAsIDB4MzEsIDB4NTEsIDB4QjEsIDB4QzEsIDB4RDEsCisgICAgMHgyMiwgMHg1MiwgMHhFMiwgMHgxMywgMHhGMywgMHgwNCwgMHgxNSwgMHhGNSwgMHgxQiwgMHhFQiwgMHhGQiwgMHgwQywKKyAgICAweDFELCAweEZELCAweDJFLCAweDVFLCAweEVFLCAweDNGLCAweDVGLCAweEJGLCAweERGLCAweDQxLCAweDMyLCAweDQyLAorICAgIDB4QjIsIDB4RDIsIDB4MjMsIDB4NTMsIDB4QjMsIDB4RTMsIDB4MTQsIDB4MjQsIDB4RTQsIDB4RjQsIDB4MjUsIDB4MzUsCisgICAgMHhENSwgMHhFNSwgMHgyQiwgMHgzQiwgMHhEQiwgMHgxQywgMHgyQywgMHhCQywgMHhFQywgMHhGQywgMHgyRCwgMHhCRCwKKyAgICAweEVELCAweDNFLCAweDRFLCAweEJFLCAweERFLCAweDRGLCAweENGLCAweEMyLCAweDMzLCAweDQzLCAweEMzLCAweEQzLAorICAgIDB4MzQsIDB4NDQsIDB4NTQsIDB4QjQsIDB4RDQsIDB4NDUsIDB4NTUsIDB4QzUsIDB4NEIsIDB4Q0IsIDB4M0MsIDB4NEMsCisgICAgMHg1QywgMHhDQywgMHhEQywgMHgzRCwgMHg0RCwgMHg1RCwgMHhDRCwgMHhERCwgMHhDRSwgMHhDNCwgMHhCNSwgMHg1QiwKKyAgICAweEJCCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IxNl9jYlsxMV0gPSB7CisgICAgNCwgMTIsIDQsIDQsIDksIDEzLCAzNywgNzYsIDcyLCAzOSwgMgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iMTZfeGxhdFsyNTZdID0geworICAgIDB4MDAsIDB4MTAsIDB4MDEsIDB4MTEsIDB4MjAsIDB4MjEsIDB4MDIsIDB4MTIsIDB4MzAsIDB4MzEsIDB4NDEsIDB4MjIsCisgICAgMHgzMiwgMHgwMywgMHgxMywgMHgyMywgMHgxNCwgMHg0MCwgMHg1MSwgMHg2MSwgMHg0MiwgMHg1MiwgMHgzMywgMHg0MywKKyAgICAweDA0LCAweDI0LCAweDM0LCAweDE1LCAweDI1LCAweDE2LCAweDUwLCAweDYwLCAweDcwLCAweDcxLCAweDgxLCAweEQxLAorICAgIDB4RTEsIDB4NjIsIDB4NzIsIDB4ODIsIDB4RDIsIDB4NTMsIDB4NjMsIDB4NzMsIDB4RDMsIDB4NDQsIDB4NTQsIDB4MDUsCisgICAgMHgzNSwgMHg0NSwgMHg1NSwgMHgwNiwgMHgyNiwgMHgzNiwgMHgwNywgMHgxNywgMHgyNywgMHgzNywgMHgxOCwgMHgyOCwKKyAgICAweDE5LCAweDFELCAweDJELCAweDNELCAweDFFLCAweDJFLCAweDFGLCAweDgwLCAweDkwLCAweEQwLCAweEUwLCAweEYwLAorICAgIDB4OTEsIDB4QTEsIDB4QjEsIDB4QzEsIDB4RjEsIDB4OTIsIDB4QTIsIDB4QjIsIDB4QzIsIDB4RTIsIDB4RjIsIDB4ODMsCisgICAgMHg5MywgMHhBMywgMHhDMywgMHhFMywgMHhGMywgMHg2NCwgMHg3NCwgMHg4NCwgMHg5NCwgMHhENCwgMHhFNCwgMHhGNCwKKyAgICAweDY1LCAweDc1LCAweDg1LCAweEQ1LCAweEU1LCAweDQ2LCAweDU2LCAweDY2LCAweDc2LCAweEQ2LCAweEU2LCAweDQ3LAorICAgIDB4NTcsIDB4NjcsIDB4RDcsIDB4MDgsIDB4MzgsIDB4NDgsIDB4NTgsIDB4MDksIDB4MjksIDB4MzksIDB4NDksIDB4MEEsCisgICAgMHgxQSwgMHgyQSwgMHgzQSwgMHgxQiwgMHgyQiwgMHgwQywgMHgxQywgMHgyQywgMHgzQywgMHgwRCwgMHg0RCwgMHg1RCwKKyAgICAweDZELCAweDdELCAweDBFLCAweDNFLCAweDRFLCAweDVFLCAweDZFLCAweDBGLCAweDJGLCAweDNGLCAweDRGLCAweEEwLAorICAgIDB4QjAsIDB4QzAsIDB4QjMsIDB4QTQsIDB4QjQsIDB4QzQsIDB4OTUsIDB4QTUsIDB4QjUsIDB4QzUsIDB4RjUsIDB4ODYsCisgICAgMHg5NiwgMHhBNiwgMHhCNiwgMHhDNiwgMHhGNiwgMHg3NywgMHg4NywgMHg5NywgMHhBNywgMHhDNywgMHhFNywgMHhGNywKKyAgICAweDY4LCAweDc4LCAweDg4LCAweDk4LCAweEQ4LCAweEU4LCAweEY4LCAweDU5LCAweDY5LCAweDc5LCAweDg5LCAweEQ5LAorICAgIDB4RTksIDB4RjksIDB4NEEsIDB4NUEsIDB4NkEsIDB4N0EsIDB4REEsIDB4RUEsIDB4MEIsIDB4M0IsIDB4NEIsIDB4NUIsCisgICAgMHhEQiwgMHhFQiwgMHg0QywgMHg1QywgMHg2QywgMHg3QywgMHg4QywgMHhEQywgMHg4RCwgMHg5RCwgMHhBRCwgMHhCRCwKKyAgICAweENELCAweDdFLCAweDhFLCAweDlFLCAweEFFLCAweEJFLCAweDVGLCAweDZGLCAweDdGLCAweDhGLCAweDlGLCAweEI3LAorICAgIDB4QTgsIDB4QjgsIDB4QzgsIDB4OTksIDB4QTksIDB4QjksIDB4QzksIDB4OEEsIDB4OUEsIDB4QUEsIDB4QkEsIDB4Q0EsCisgICAgMHhGQSwgMHg2QiwgMHg3QiwgMHg4QiwgMHg5QiwgMHhBQiwgMHhCQiwgMHhDQiwgMHhGQiwgMHg5QywgMHhBQywgMHhCQywKKyAgICAweENDLCAweEVDLCAweEZDLCAweERELCAweEVELCAweEZELCAweENFLCAweERFLCAweEVFLCAweEZFLCAweEFGLCAweEJGLAorICAgIDB4Q0YsIDB4REYsIDB4RUYsIDB4RkYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjI2X2NiWzEyXSA9IHsKKyAgICAzLCAxMiwgMiwgMiwgNCwgNSwgMTEsIDI2LCA2NywgNzgsIDUxLCAxMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iMjZfeGxhdFsyNTZdID0geworICAgIDB4MDAsIDB4MDEsIDB4MTAsIDB4MTEsIDB4MjAsIDB4MjEsIDB4MDIsIDB4MTIsIDB4MzAsIDB4MzEsIDB4MjIsIDB4MDMsCisgICAgMHgxMywgMHg0MCwgMHg0MSwgMHg1MSwgMHgzMiwgMHg0MiwgMHgyMywgMHgzMywgMHgwNCwgMHgxNCwgMHgyNCwgMHgxNSwKKyAgICAweDUwLCAweDYxLCAweDcxLCAweEQxLCAweEUxLCAweDUyLCAweDYyLCAweEQyLCAweDQzLCAweDUzLCAweEQzLCAweDM0LAorICAgIDB4NDQsIDB4MDUsIDB4MjUsIDB4MzUsIDB4MDYsIDB4MTYsIDB4MjYsIDB4MTcsIDB4MTgsIDB4MUQsIDB4MkQsIDB4M0QsCisgICAgMHgxRSwgMHgyRSwgMHg2MCwgMHg3MCwgMHg4MCwgMHhEMCwgMHhFMCwgMHhGMCwgMHg4MSwgMHg5MSwgMHhBMSwgMHhDMSwKKyAgICAweEYxLCAweDcyLCAweDgyLCAweDkyLCAweEMyLCAweEUyLCAweEYyLCAweDYzLCAweDczLCAweEUzLCAweEYzLCAweDU0LAorICAgIDB4NjQsIDB4NzQsIDB4RDQsIDB4RTQsIDB4RjQsIDB4NDUsIDB4NTUsIDB4NjUsIDB4RDUsIDB4RTUsIDB4RjUsIDB4MzYsCisgICAgMHg0NiwgMHg1NiwgMHhENiwgMHhFNiwgMHgwNywgMHgyNywgMHgzNywgMHg0NywgMHhENywgMHgwOCwgMHgyOCwgMHgzOCwKKyAgICAweDE5LCAweDI5LCAweDFBLCAweDFCLCAweDFDLCAweDJDLCAweDBELCAweDRELCAweDVELCAweDZELCAweDdELCAweDBFLAorICAgIDB4M0UsIDB4NEUsIDB4NUUsIDB4NkUsIDB4MEYsIDB4MUYsIDB4MkYsIDB4M0YsIDB4NEYsIDB4OTAsIDB4QTAsIDB4QzAsCisgICAgMHhCMSwgMHhBMiwgMHhCMiwgMHg4MywgMHg5MywgMHhBMywgMHhCMywgMHhDMywgMHg4NCwgMHg5NCwgMHhBNCwgMHhDNCwKKyAgICAweDc1LCAweDg1LCAweDk1LCAweEM1LCAweDY2LCAweDc2LCAweDg2LCAweDk2LCAweEM2LCAweEY2LCAweDU3LCAweDY3LAorICAgIDB4NzcsIDB4RTcsIDB4RjcsIDB4NDgsIDB4NTgsIDB4NjgsIDB4NzgsIDB4RDgsIDB4RTgsIDB4RjgsIDB4MDksIDB4MzksCisgICAgMHg0OSwgMHg1OSwgMHhEOSwgMHhFOSwgMHhGOSwgMHgwQSwgMHgyQSwgMHgzQSwgMHg0QSwgMHhEQSwgMHhFQSwgMHgwQiwKKyAgICAweDJCLCAweDNCLCAweERCLCAweEVCLCAweDBDLCAweDNDLCAweDRDLCAweDVDLCAweDZDLCAweERDLCAweDhELCAweDlELAorICAgIDB4QUQsIDB4QkQsIDB4Q0QsIDB4N0UsIDB4OEUsIDB4OUUsIDB4QUUsIDB4QkUsIDB4Q0UsIDB4NUYsIDB4NkYsIDB4N0YsCisgICAgMHg4RiwgMHg5RiwgMHhBRiwgMHhCMCwgMHhCNCwgMHhBNSwgMHhCNSwgMHhBNiwgMHhCNiwgMHg4NywgMHg5NywgMHhBNywKKyAgICAweEI3LCAweEM3LCAweDg4LCAweDk4LCAweEE4LCAweEM4LCAweDY5LCAweDc5LCAweDg5LCAweDk5LCAweEE5LCAweEM5LAorICAgIDB4NUEsIDB4NkEsIDB4N0EsIDB4OUEsIDB4Q0EsIDB4RkEsIDB4NEIsIDB4NUIsIDB4NkIsIDB4N0IsIDB4Q0IsIDB4RkIsCisgICAgMHg3QywgMHg4QywgMHg5QywgMHhBQywgMHhCQywgMHhDQywgMHhFQywgMHhGQywgMHhERCwgMHhFRCwgMHhGRCwgMHhERSwKKyAgICAweEVFLCAweEZFLCAweEJGLCAweENGLCAweERGLCAweEVGLCAweEI4LCAweEI5LCAweDhBLCAweEFBLCAweEJBLCAweDhCLAorICAgIDB4OUIsIDB4QUIsIDB4QkIsIDB4RkYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjMyX2NiWzEyXSA9IHsKKyAgICAyLCAxMSwgMSwgMCwgNCwgNiwgNywgMTAsIDIyLCAxMSwgMTYsIDQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjMyX3hsYXRbODFdID0geworICAgIDB4MDAsIDB4NDAsIDB4MTAsIDB4MDQsIDB4MDEsIDB4NTAsIDB4NDQsIDB4MTQsIDB4NDEsIDB4MTEsIDB4MDUsIDB4ODAsCisgICAgMHg1NCwgMHg1MSwgMHg0NSwgMHgxNSwgMHg1NSwgMHgwMiwgMHg5MCwgMHgyMCwgMHg2MCwgMHg4NCwgMHgyNCwgMHgwOCwKKyAgICAweDE4LCAweDA5LCAweDEyLCAweDA2LCAweEEwLCAweDk0LCAweDY0LCAweDQ4LCAweDU4LCAweDgxLCAweDkxLCAweDIxLAorICAgIDB4NjEsIDB4ODUsIDB4OTUsIDB4MjUsIDB4NjUsIDB4NDksIDB4MTksIDB4NTksIDB4NDIsIDB4NTIsIDB4NDYsIDB4MTYsCisgICAgMHg1NiwgMHgwQSwgMHhBNCwgMHgyOCwgMHg2OCwgMHhBMSwgMHhBNSwgMHgyOSwgMHg2OSwgMHgyNiwgMHg0QSwgMHgxQSwKKyAgICAweDVBLCAweDg4LCAweDk4LCAweEE4LCAweDg5LCAweDk5LCAweEE5LCAweDgyLCAweDkyLCAweDIyLCAweDYyLCAweDg2LAorICAgIDB4OTYsIDB4NjYsIDB4OUEsIDB4MkEsIDB4NkEsIDB4QTIsIDB4QTYsIDB4OEEsIDB4QUEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjMzX2NiWzEzXSA9IHsKKyAgICAyLCAxMiwgMSwgMCwgMCwgNCwgMTEsIDgsIDI4LCA5MiwgOTcsIDEzLCAyCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IzM194bGF0WzI1Nl0gPSB7CisgICAgMHgwMCwgMHg0MCwgMHgxMCwgMHgwNCwgMHgwMSwgMHg1MCwgMHg0NCwgMHgxNCwgMHg1NCwgMHg0MSwgMHgxMSwgMHg1MSwKKyAgICAweDA1LCAweDQ1LCAweDE1LCAweDU1LCAweDIwLCAweDk1LCAweDY1LCAweDQ5LCAweDU5LCAweDUyLCAweDQ2LCAweDE2LAorICAgIDB4ODAsIDB4OTAsIDB4NjAsIDB4ODQsIDB4OTQsIDB4MjQsIDB4NjQsIDB4QTQsIDB4MDgsIDB4NDgsIDB4MTgsIDB4NTgsCisgICAgMHg4MSwgMHg5MSwgMHgyMSwgMHg2MSwgMHg4NSwgMHgyNSwgMHgwOSwgMHgxOSwgMHg2OSwgMHgwMiwgMHg0MiwgMHgxMiwKKyAgICAweDA2LCAweDU2LCAweDVBLCAweDU3LCAweEQwLCAweDc0LCAweDY4LCAweDVDLCAweEMxLCAweEQ1LCAweEE1LCAweEU1LAorICAgIDB4NzUsIDB4QjUsIDB4RjUsIDB4OTksIDB4RDksIDB4QTksIDB4RTksIDB4NzksIDB4QjksIDB4RjksIDB4MUQsIDB4NUQsCisgICAgMHg5RCwgMHhERCwgMHg2RCwgMHhBRCwgMHhFRCwgMHg3RCwgMHhCRCwgMHhGRCwgMHg4MiwgMHg5MiwgMHhEMiwgMHg2MiwKKyAgICAweDk2LCAweEQ2LCAweDI2LCAweDY2LCAweEE2LCAweEU2LCAweDc2LCAweEI2LCAweEY2LCAweDBBLCAweDRBLCAweDFBLAorICAgIDB4OUEsIDB4REEsIDB4MkEsIDB4NkEsIDB4QUEsIDB4RUEsIDB4N0EsIDB4QkEsIDB4RkEsIDB4NUUsIDB4OUUsIDB4REUsCisgICAgMHg2RSwgMHhBRSwgMHhFRSwgMHg3RSwgMHhCRSwgMHhGRSwgMHgwMywgMHgxMywgMHg1MywgMHgxNywgMHg5NywgMHhENywKKyAgICAweDY3LCAweEE3LCAweEU3LCAweDc3LCAweEI3LCAweEY3LCAweDVCLCAweDlCLCAweERCLCAweDZCLCAweEFCLCAweEVCLAorICAgIDB4N0IsIDB4QkIsIDB4RkIsIDB4NUYsIDB4OUYsIDB4REYsIDB4NkYsIDB4QUYsIDB4RUYsIDB4N0YsIDB4QkYsIDB4RkYsCisgICAgMHhDMCwgMHhBMCwgMHhFMCwgMHgzMCwgMHhDNCwgMHhENCwgMHhFNCwgMHgzNCwgMHhCNCwgMHhGNCwgMHg4OCwgMHhDOCwKKyAgICAweDk4LCAweEQ4LCAweDI4LCAweEE4LCAweEU4LCAweDM4LCAweDc4LCAweEI4LCAweEY4LCAweDBDLCAweDRDLCAweDFDLAorICAgIDB4OUMsIDB4REMsIDB4NkMsIDB4QUMsIDB4RUMsIDB4N0MsIDB4QkMsIDB4RkMsIDB4RDEsIDB4QTEsIDB4RTEsIDB4MzEsCisgICAgMHg3MSwgMHhCMSwgMHhGMSwgMHhDNSwgMHgzNSwgMHg4OSwgMHhDOSwgMHgyOSwgMHgzOSwgMHgwRCwgMHg0RCwgMHg4RCwKKyAgICAweENELCAweDJELCAweDNELCAweDIyLCAweEEyLCAweEUyLCAweDcyLCAweEIyLCAweEYyLCAweDg2LCAweEM2LCAweDM2LAorICAgIDB4OEEsIDB4Q0EsIDB4M0EsIDB4MEUsIDB4NEUsIDB4OEUsIDB4Q0UsIDB4MUUsIDB4MkUsIDB4M0UsIDB4NDMsIDB4ODMsCisgICAgMHg5MywgMHhEMywgMHgyMywgMHg2MywgMHhBMywgMHhFMywgMHg3MywgMHhCMywgMHhGMywgMHgwNywgMHg0NywgMHg4NywKKyAgICAweEM3LCAweDI3LCAweDM3LCAweDRCLCAweDhCLCAweENCLCAweDFCLCAweDJCLCAweDNCLCAweDRGLCAweDhGLCAweENGLAorICAgIDB4MUYsIDB4NzAsIDB4QjAsIDB4RjAsIDB4OEMsIDB4Q0MsIDB4MkMsIDB4M0MsIDB4QzIsIDB4MzIsIDB4QzMsIDB4MEYsCisgICAgMHgyRiwgMHgzRiwgMHgzMywgMHgwQgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iMzVfY2JbMTRdID0geworICAgIDEsIDEyLCAxLCAwLCAwLCAwLCA0LCA2LCA2LCAxNCwgNDIsIDYzLCA1OSwgMzAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjM1X3hsYXRbMjI1XSA9IHsKKyAgICAweDAwLCAweDEwLCAweEYwLCAweDAxLCAweDBGLCAweDExLCAweEYxLCAweDAyLCAweDBFLCAweDFGLCAweEZGLCAweDIwLAorICAgIDB4RTAsIDB4MjEsIDB4RjIsIDB4RkUsIDB4RUYsIDB4MzAsIDB4RDAsIDB4RTEsIDB4MTIsIDB4MjIsIDB4RTIsIDB4MDMsCisgICAgMHgwRCwgMHgxRCwgMHgxRSwgMHgyRSwgMHhFRSwgMHgyRiwgMHhERiwgMHg0MCwgMHg2MCwgMHg3MCwgMHg5MCwgMHhBMCwKKyAgICAweEIwLCAweEMwLCAweDMxLCAweDcxLCAweDkxLCAweEMxLCAweEQxLCAweDMyLCAweEQyLCAweDEzLCAweEUzLCAweEYzLAorICAgIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MTcsIDB4RjcsIDB4MDksIDB4MTksIDB4MEEsIDB4MUEsIDB4RkEsIDB4MEMsCisgICAgMHgxQywgMHgyRCwgMHhFRCwgMHhGRCwgMHgzRSwgMHg3RSwgMHhERSwgMHgzRiwgMHg2RiwgMHg3RiwgMHg5RiwgMHhBRiwKKyAgICAweENGLCAweDUwLCAweDQxLCAweDUxLCAweDYxLCAweEExLCAweEIxLCAweDYyLCAweDcyLCAweDkyLCAweEEyLCAweEMyLAorICAgIDB4MjMsIDB4MzMsIDB4NjMsIDB4NzMsIDB4OTMsIDB4QTMsIDB4RDMsIDB4MTQsIDB4MjQsIDB4MzQsIDB4RDQsIDB4RTQsCisgICAgMHhGNCwgMHgxNSwgMHhGNSwgMHgxNiwgMHgyNiwgMHhENiwgMHhFNiwgMHhGNiwgMHgyNywgMHgzNywgMHg0NywgMHhFNywKKyAgICAweDI5LCAweDM5LCAweEM5LCAweEQ5LCAweEU5LCAweEY5LCAweDJBLCAweEVBLCAweDBCLCAweDFCLCAweEZCLCAweDJDLAorICAgIDB4N0MsIDB4RUMsIDB4RkMsIDB4M0QsIDB4NEQsIDB4NkQsIDB4N0QsIDB4REQsIDB4NEUsIDB4NUUsIDB4NkUsIDB4OUUsCisgICAgMHhBRSwgMHhDRSwgMHg0RiwgMHg1RiwgMHg0MiwgMHg1MiwgMHhCMiwgMHg0MywgMHhCMywgMHhDMywgMHg0NCwgMHg2NCwKKyAgICAweDc0LCAweDk0LCAweEE0LCAweDI1LCAweDM1LCAweDY1LCAweDc1LCAweDk1LCAweEE1LCAweEU1LCAweDM2LCAweDQ2LAorICAgIDB4NjYsIDB4NzYsIDB4OTYsIDB4QTYsIDB4QjYsIDB4QzYsIDB4NTcsIDB4QTcsIDB4QjcsIDB4QzcsIDB4RDcsIDB4NTksCisgICAgMHhBOSwgMHhCOSwgMHgzQSwgMHg0QSwgMHg2QSwgMHhDQSwgMHhEQSwgMHgyQiwgMHgzQiwgMHg2QiwgMHg5QiwgMHhBQiwKKyAgICAweERCLCAweEVCLCAweDNDLCAweDZDLCAweDlDLCAweEFDLCAweENDLCAweERDLCAweDVELCAweDlELCAweEFELCAweEJELAorICAgIDB4Q0QsIDB4QkUsIDB4QkYsIDB4NTMsIDB4NTQsIDB4QjQsIDB4QzQsIDB4NDUsIDB4NTUsIDB4QjUsIDB4QzUsIDB4RDUsCisgICAgMHg1NiwgMHg2NywgMHg3NywgMHg5NywgMHg0OSwgMHg2OSwgMHg3OSwgMHg5OSwgMHg1QSwgMHg3QSwgMHg5QSwgMHhBQSwKKyAgICAweEJBLCAweDRCLCAweDVCLCAweDdCLCAweEJCLCAweENCLCAweDRDLCAweDVDLCAweEJDCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2IzN19jYlsxM10gPSB7CisgICAgMSwgMTEsIDEsIDAsIDIsIDAsIDIsIDIsIDYsIDE3LCAxNCwgMTMsIDYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjM3X3hsYXRbNjNdID0geworICAgICAwLCAgMSwgNjMsICAyLCA2MiwgIDMsIDYxLCAgNCwgIDUsICA2LCA1OCwgNTksIDYwLCAgNywgIDgsICA5LAorICAgIDEwLCAyNSwgMjYsIDI3LCAyOCwgMjksIDM0LCAzNSwgMzcsIDM4LCAzOSwgNTUsIDU2LCA1NywgMTEsIDEzLAorICAgIDE0LCAxNSwgMzAsIDMxLCAzMywgMzYsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDEyLCAxNiwgMTcsIDE4LAorICAgIDE5LCAyMSwgNDEsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDIwLCAyMiwgMjMsIDI0LCA0MCwgNDIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjQxX2NiWzE0XSA9IHsKKyAgICAxLCAxMiwgMSwgMCwgMCwgMSwgNywgMCwgMjAsIDQsIDEwLCAyNCwgMiwgMTIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjQxX3hsYXRbODFdID0geworICAgIDB4MDAsIDB4MDEsIDB4NDAsIDB4QzAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MEMsIDB4MDMsIDB4NTAsIDB4RDAsIDB4NzAsCisgICAgMHhGMCwgMHhDNCwgMHgxNCwgMHgzNCwgMHg0QywgMHgxQywgMHgzQywgMHhDMSwgMHgxMSwgMHgzMSwgMHgwNSwgMHgwRCwKKyAgICAweEMzLCAweDEzLCAweDMzLCAweDA3LCAweDBGLCAweDQ0LCAweENDLCAweDQxLCAweDQzLCAweDU0LCAweDc0LCAweERDLAorICAgIDB4RkMsIDB4NzEsIDB4MTUsIDB4NEQsIDB4MUQsIDB4MzcsIDB4M0YsIDB4RDQsIDB4RjQsIDB4NUMsIDB4N0MsIDB4NTEsCisgICAgMHhEMSwgMHhGMSwgMHg0NSwgMHhDNSwgMHgzNSwgMHhDRCwgMHhERCwgMHgzRCwgMHg1MywgMHhEMywgMHg3MywgMHhGMywKKyAgICAweDQ3LCAweEM3LCAweDE3LCAweDc3LCAweDRGLCAweENGLCAweDFGLCAweDU1LCAweEZGLCAweEQ1LCAweDc1LCAweEY1LAorICAgIDB4NUQsIDB4N0QsIDB4RkQsIDB4NTcsIDB4RDcsIDB4RjcsIDB4NUYsIDB4REYsIDB4N0YKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjQyX2NiWzExXSA9IHsgMSwgOSwgMSwgMCwgMSwgMywgMiwgMywgNywgNCwgNCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2I0Ml94bGF0WzI1XSA9IHsKKyAgICAweDAwLCAweDA3LCAweDA4LCAweDM4LCAweDAxLCAweDM5LCAweDBGLCAweDEwLCAweDA5LCAweDNGLCAweDMwLCAweDMxLAorICAgIDB4MDIsIDB4M0EsIDB4MDYsIDB4MEUsIDB4MTcsIDB4MTEsIDB4MEEsIDB4M0UsIDB4MzcsIDB4MTIsIDB4MzIsIDB4MTYsCisgICAgMHgzNgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNDNfY2JbMTBdID0geyAyLCA5LCAxLCAxLCAzLCA0LCA5LCAxNSwgMTIsIDQgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNDNfeGxhdFs0OV0gPSB7CisgICAgMHgwMCwgMHgwNywgMHgwOCwgMHgzOCwgMHgwMSwgMHgwOSwgMHgzOSwgMHgwRiwgMHgzRiwgMHgxMCwgMHgzMCwgMHgzMSwKKyAgICAweDAyLCAweDNBLCAweDA2LCAweDBFLCAweDE3LCAweDM3LCAweDE4LCAweDI4LCAweDExLCAweDE5LCAweDI5LCAweDBBLAorICAgIDB4MDMsIDB4MEIsIDB4M0IsIDB4MDUsIDB4MEQsIDB4M0QsIDB4M0UsIDB4MUYsIDB4MkYsIDB4MTIsIDB4MUEsIDB4MkEsCisgICAgMHgzMiwgMHgxMywgMHgzMywgMHgxNSwgMHgzNSwgMHgxNiwgMHgxRSwgMHgyRSwgMHgzNiwgMHgxQiwgMHgyQiwgMHgxRCwKKyAgICAweDJECit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2I0N19jYlsxMF0gPSB7IDIsIDksIDEsIDEsIDMsIDQsIDYsIDE0LCAyMiwgMTIgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNDdfeGxhdFs2M10gPSB7CisgICAgIDAsICAxLCAgMiwgNjIsIDYzLCAgMywgIDQsIDYwLCA2MSwgIDUsICA2LCAgNywgNTcsIDU4LCA1OSwgIDgsCisgICAgIDksIDEwLCAxMSwgMTIsIDI2LCAyNywgMzcsIDM4LCA1MiwgNTMsIDU0LCA1NSwgNTYsIDEzLCAxNCwgMTUsCisgICAgMTYsIDE3LCAxOCwgMjUsIDI4LCAyOSwgMzAsIDMxLCAzMywgMzQsIDM1LCAzNiwgMzksIDQ2LCA0NywgNDgsCisgICAgNDksIDUwLCA1MSwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNTJfY2JbMTFdID0geyAxLCA5LCAxLCAwLCAxLCAzLCAyLCAzLCA3LCA0LCA0IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjUyX3hsYXRbMjVdID0geworICAgIDB4MDAsIDB4MDEsIDB4MDgsIDB4MzgsIDB4MDcsIDB4MzksIDB4MEYsIDB4MzAsIDB4MDksIDB4M0YsIDB4MTAsIDB4MzEsCisgICAgMHgwMiwgMHgzQSwgMHgwNiwgMHgwRSwgMHgxNywgMHgxMSwgMHgwQSwgMHgzRSwgMHgzNywgMHgxMiwgMHgzMiwgMHgxNiwKKyAgICAweDM2Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2I1M19jYls3XSA9IHsgMSwgNSwgMSwgMSwgMSwgMCwgNCB9OyAvLyBzYW1lIGFzIGI2MyEhIQorCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2I1M194bGF0WzddID0geyAwLCA3LCAxLCAyLCAzLCA1LCA2IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjU2X2NiWzExXSA9IHsgMSwgOSwgMSwgMCwgMiwgMCwgMiwgNCwgMTEsIDksIDIgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNTZfeGxhdFszMV0gPSB7CisgICAgIDAsICAxLCAzMSwgIDIsIDMwLCAzLCAgNCwgMTMsIDI5LCAgNSwgIDYsICA3LCAxNCwgMTUsIDE3LCAxOCwKKyAgICAxOSwgMjYsIDI3LCAyOCwgIDgsIDksIDEyLCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAxMCwgMTEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjYyX2NiWzE0XSA9IHsKKyAgICAxLCAxMiwgMSwgMCwgMCwgMiwgMywgNSwgMTIsIDE0LCAxOCwgMTUsIDksIDIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjYyX3hsYXRbODFdID0geworICAgIDB4MDAsIDB4NDAsIDB4MDEsIDB4MTAsIDB4MDQsIDB4MDIsIDB4ODAsIDB4NTAsIDB4OTAsIDB4MDUsIDB4MDYsIDB4MjAsCisgICAgMHg2MCwgMHg0NCwgMHgxNCwgMHg1NCwgMHgyNCwgMHgwOCwgMHgxOCwgMHg0MSwgMHgxMSwgMHgxNSwgMHgwOSwgMHhBMCwKKyAgICAweDg0LCAweDk0LCAweDY0LCAweEE0LCAweDI4LCAweDUxLCAweDQ1LCAweDU1LCAweDE5LCAweDEyLCAweDE2LCAweDBBLAorICAgIDB4MUEsIDB4NDgsIDB4NTgsIDB4NjgsIDB4ODEsIDB4OTEsIDB4MjEsIDB4NjEsIDB4ODUsIDB4OTUsIDB4MjUsIDB4NjUsCisgICAgMHg0OSwgMHg1OSwgMHgyOSwgMHg2OSwgMHg0MiwgMHg0NiwgMHg1NiwgMHg4OCwgMHg5OCwgMHhBOCwgMHhBMSwgMHhBNSwKKyAgICAweDk5LCAweEE5LCAweDUyLCAweDIyLCAweDI2LCAweDY2LCAweDRBLCAweDVBLCAweDJBLCAweDZBLCAweDg5LCAweDgyLAorICAgIDB4OTIsIDB4NjIsIDB4ODYsIDB4OTYsIDB4QTYsIDB4OEEsIDB4QUEsIDB4QTIsIDB4OUEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjYzX2NiWzddID0geyAxLCA1LCAxLCAxLCAxLCAwLCA0IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjYzX3hsYXRbN10gPSB7IDAsIDEsIDcsIDIsIDMsIDUsIDYgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNjRfY2JbN10gPSB7IDEsIDUsIDEsIDEsIDEsIDEsIDIgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNjRfeGxhdFs2XSA9IHsgMSwgMCwgMiwgNSwgMywgNCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2I2NV9jYlsxNF0gPSB7CisgICAgMSwgMTIsIDEsIDAsIDAsIDIsIDIsIDIsIDYsIDEyLCAzNCwgOTIsIDU0LCAyMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNjVfeGxhdFsyMjVdID0geworICAgIDB4MDAsIDB4RjAsIDB4MDEsIDB4MTAsIDB4MEYsIDB4MTEsIDB4RjEsIDB4MjAsIDB4RTAsIDB4MDIsIDB4MEUsIDB4MUYsCisgICAgMHhGRiwgMHhEMCwgMHgyMSwgMHhFMSwgMHgxMiwgMHhGMiwgMHgwNywgMHgwQSwgMHgwRCwgMHgxRSwgMHhGRSwgMHgyRiwKKyAgICAweEVGLCAweDMwLCAweDcwLCAweDkwLCAweEEwLCAweEMwLCAweDcxLCAweDkxLCAweEMxLCAweEQxLCAweDMyLCAweDkyLAorICAgIDB4RTIsIDB4MDMsIDB4MTMsIDB4NjMsIDB4MDQsIDB4MDYsIDB4RTYsIDB4RTcsIDB4RjcsIDB4MDksIDB4MTksIDB4MzksCisgICAgMHhGQSwgMHgwQywgMHgxQywgMHhERCwgMHhFRCwgMHhGRCwgMHgyRSwgMHg3RSwgMHg5RSwgMHgzRiwgMHg5RiwgMHg0MCwKKyAgICAweDUwLCAweDYwLCAweEIwLCAweDMxLCAweDQxLCAweDYxLCAweEExLCAweEIxLCAweDIyLCAweDQyLCAweDcyLCAweEEyLAorICAgIDB4QjIsIDB4QzIsIDB4RDIsIDB4MjMsIDB4MzMsIDB4NzMsIDB4QTMsIDB4QzMsIDB4RDMsIDB4RTMsIDB4RjMsIDB4MTQsCisgICAgMHgyNCwgMHgzNCwgMHg0NCwgMHg3NCwgMHhENCwgMHhFNCwgMHgwNSwgMHgyNSwgMHg0NSwgMHg2NSwgMHg5NSwgMHhBNSwKKyAgICAweDE2LCAweDI2LCAweDQ2LCAweDc2LCAweEE2LCAweEI2LCAweEM2LCAweEQ2LCAweEY2LCAweDE3LCAweDI3LCAweDM3LAorICAgIDB4NDcsIDB4NjcsIDB4QTcsIDB4RDcsIDB4MjksIDB4NjksIDB4QjksIDB4RDksIDB4RTksIDB4RjksIDB4MUEsIDB4MkEsCisgICAgMHgzQSwgMHg5QSwgMHhDQSwgMHhEQSwgMHhFQSwgMHgwQiwgMHgxQiwgMHgzQiwgMHg2QiwgMHhFQiwgMHhGQiwgMHgyQywKKyAgICAweDZDLCAweEVDLCAweEZDLCAweDFELCAweDJELCAweDRELCAweDZELCAweDlELCAweEFELCAweDNFLCAweDRFLCAweDZFLAorICAgIDB4QUUsIDB4Q0UsIDB4RUUsIDB4NEYsIDB4NUYsIDB4NkYsIDB4REYsIDB4NTEsIDB4NTIsIDB4NjIsIDB4NDMsIDB4OTMsCisgICAgMHhCMywgMHg1NCwgMHg5NCwgMHhBNCwgMHhGNCwgMHgxNSwgMHg3NSwgMHhCNSwgMHhFNSwgMHhGNSwgMHgzNiwgMHg1NiwKKyAgICAweDY2LCAweDk2LCAweDU3LCAweDc3LCAweDQ5LCAweDU5LCAweEE5LCAweEM5LCAweDRBLCAweDVBLCAweDZBLCAweDdBLAorICAgIDB4QUEsIDB4QkEsIDB4MkIsIDB4NEIsIDB4N0IsIDB4OUIsIDB4QUIsIDB4REIsIDB4M0MsIDB4NEMsIDB4N0MsIDB4OUMsCisgICAgMHhBQywgMHhCQywgMHhDQywgMHgzRCwgMHg1RCwgMHg3RCwgMHhCRCwgMHhDRCwgMHg1RSwgMHhCRSwgMHhERSwgMHhCRiwKKyAgICAweENGLCAweDUzLCAweDY0LCAweEI0LCAweEM0LCAweDM1LCAweDU1LCAweEM1LCAweEQ1LCAweDk3LCAweEI3LCAweEM3LAorICAgIDB4NzksIDB4OTksIDB4NUIsIDB4QkIsIDB4Q0IsIDB4NUMsIDB4REMsIDB4N0YsIDB4QUYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjY2X2NiWzE0XSA9IHsKKyAgICAxLCAxMiwgMSwgMCwgMCwgMywgMCwgMywgMywgMTAsIDQwLCA4NSwgNjEsIDUwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2I2Nl94bGF0WzI1Nl0gPSB7CisgICAgMHgwMCwgMHgxMCwgMHgwMSwgMHgxMSwgMHgyMSwgMHgwMiwgMHgxMiwgMHgyMCwgMHgyMiwgMHgxMywgMHgzMCwgMHgzMSwKKyAgICAweDQxLCAweEQxLCAweEUxLCAweDMyLCAweDUyLCAweDAzLCAweDIzLCAweDJELCAweDQwLCAweDUwLCAweDYwLCAweDgwLAorICAgIDB4RDAsIDB4RTAsIDB4NTEsIDB4NjEsIDB4RjEsIDB4NDIsIDB4NjIsIDB4RDIsIDB4RTIsIDB4RjIsIDB4MzMsIDB4NDMsCisgICAgMHhDMywgMHhEMywgMHhFMywgMHgwNCwgMHgxNCwgMHhENCwgMHhGNCwgMHgyNSwgMHgzNSwgMHgxNiwgMHgxNywgMHhGNywKKyAgICAweEQ4LCAweDFDLCAweDNDLCAweDBELCAweDFELCAweDNELCAweDVELCAweDBFLCAweDFFLCAweDJFLCAweDdFLCAweDJGLAorICAgIDB4QzAsIDB4RjAsIDB4NzEsIDB4ODEsIDB4OTEsIDB4QzEsIDB4NzIsIDB4ODIsIDB4OTIsIDB4QjIsIDB4QzIsIDB4NTMsCisgICAgMHg2MywgMHg3MywgMHg5MywgMHhBMywgMHhGMywgMHgyNCwgMHg0NCwgMHg2NCwgMHg4NCwgMHhBNCwgMHhCNCwgMHgwNSwKKyAgICAweDE1LCAweDk1LCAweEQ1LCAweDA2LCAweDI2LCAweDM2LCAweDQ2LCAweDk2LCAweEQ2LCAweEU2LCAweEY2LCAweDA3LAorICAgIDB4MjcsIDB4MzcsIDB4RDcsIDB4RTcsIDB4MDgsIDB4MTgsIDB4MjgsIDB4MzgsIDB4RTgsIDB4RjgsIDB4MDksIDB4MTksCisgICAgMHgyOSwgMHhFOSwgMHhGOSwgMHgwQSwgMHgxQSwgMHhDQSwgMHhEQSwgMHhFQSwgMHgwQiwgMHgxQiwgMHhEQiwgMHhFQiwKKyAgICAweEZCLCAweDJDLCAweDRDLCAweDVDLCAweDdDLCAweDhDLCAweDRELCAweDZELCAweDhELCAweDlELCAweEZELCAweDNFLAorICAgIDB4NUUsIDB4NkUsIDB4OEUsIDB4OUUsIDB4RUUsIDB4MEYsIDB4MUYsIDB4M0YsIDB4NEYsIDB4NUYsIDB4NkYsIDB4N0YsCisgICAgMHhDRiwgMHg3MCwgMHhBMSwgMHhBMiwgMHg4MywgMHhCMywgMHgzNCwgMHg3NCwgMHhDNCwgMHhFNCwgMHg1NSwgMHg2NSwKKyAgICAweDg1LCAweEE1LCAweEM1LCAweEU1LCAweEY1LCAweDU2LCAweDY2LCAweDc2LCAweDg2LCAweEE2LCAweEM2LCAweDU3LAorICAgIDB4NjcsIDB4NzcsIDB4OTcsIDB4QTcsIDB4NDgsIDB4ODgsIDB4OTgsIDB4NDksIDB4NTksIDB4NzksIDB4OTksIDB4M0EsCisgICAgMHg0QSwgMHg4QSwgMHhCQSwgMHhGQSwgMHgyQiwgMHg3QiwgMHgwQywgMHhBQywgMHhCQywgMHhDQywgMHhFQywgMHg3RCwKKyAgICAweEFELCAweEJELCAweERELCAweDRFLCAweEJFLCAweENFLCAweEZFLCAweDhGLCAweDlGLCAweEFGLCAweEJGLCAweERGLAorICAgIDB4RUYsIDB4RkYsIDB4OTAsIDB4QTAsIDB4QjAsIDB4QjEsIDB4NTQsIDB4OTQsIDB4NDUsIDB4NzUsIDB4QjUsIDB4QjYsCisgICAgMHg0NywgMHg4NywgMHhCNywgMHhDNywgMHg1OCwgMHg2OCwgMHg3OCwgMHhBOCwgMHhCOCwgMHhDOCwgMHgzOSwgMHg2OSwKKyAgICAweDg5LCAweEE5LCAweEI5LCAweEM5LCAweEQ5LCAweDJBLCAweDVBLCAweDZBLCAweDdBLCAweDlBLCAweEFBLCAweDNCLAorICAgIDB4NEIsIDB4NUIsIDB4NkIsIDB4OEIsIDB4OUIsIDB4QUIsIDB4QkIsIDB4Q0IsIDB4NkMsIDB4OUMsIDB4REMsIDB4RkMsCisgICAgMHhDRCwgMHhFRCwgMHhBRSwgMHhERQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNjdfY2JbMTBdID0geyAyLCA5LCAxLCAyLCAxLCA0LCA3LCAxMCwgMjYsIDEyIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjY3X3hsYXRbNjNdID0geworICAgICAwLCAgMSwgNjMsIDYyLCAgMiwgIDMsIDYwLCA2MSwgIDQsICA1LCAgNiwgIDcsIDU3LCA1OCwgNTksICA4LAorICAgICA5LCAxMCwgMTEsIDEyLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDI1LAorICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0NiwgNDcsIDQ4LAorICAgIDQ5LCA1MCwgNTEsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjcxX2NiWzE0XSA9IHsKKyAgICAxLCAxMiwgMSwgMCwgMCwgMSwgNywgMCwgMTksIDUsIDEzLCAyMywgMCwgMTIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjcxX3hsYXRbODFdID0geworICAgIDB4MDAsIDB4MDMsIDB4NDAsIDB4QzAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MEMsIDB4MDEsIDB4NTAsIDB4RDAsIDB4NzAsCisgICAgMHhGMCwgMHhDNCwgMHgxNCwgMHgzNCwgMHg0QywgMHgxQywgMHgzQywgMHhDMSwgMHgxMSwgMHgzMSwgMHgwNSwgMHgwRCwKKyAgICAweDEzLCAweDMzLCAweDA3LCAweDBGLCAweDQ0LCAweENDLCAweDQxLCAweDQzLCAweEMzLCAweDU0LCAweDc0LCAweERDLAorICAgIDB4RkMsIDB4RjEsIDB4QzUsIDB4MTUsIDB4MUQsIDB4NTMsIDB4QzcsIDB4MzcsIDB4NEYsIDB4M0YsIDB4RDQsIDB4RjQsCisgICAgMHg1QywgMHg3QywgMHg1MSwgMHhEMSwgMHg3MSwgMHg0NSwgMHg1NSwgMHgzNSwgMHg0RCwgMHhDRCwgMHhERCwgMHgzRCwKKyAgICAweEQzLCAweDczLCAweEYzLCAweDQ3LCAweDE3LCAweDc3LCAweENGLCAweDFGLCAweEZGLCAweEQ1LCAweDc1LCAweEY1LAorICAgIDB4NUQsIDB4N0QsIDB4RkQsIDB4NTcsIDB4RDcsIDB4RjcsIDB4NUYsIDB4REYsIDB4N0YKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjczX2NiWzEzXSA9IHsKKyAgICAxLCAxMSwgMSwgMCwgMCwgMCwgMSwgNCwgOSwgNCwgMTAzLCAxMTAsIDI0Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2I3M194bGF0WzI1Nl0gPSB7CisgICAgMHgwMCwgMHg0MCwgMHgxMCwgMHgwNCwgMHgwMSwgMHgwNSwgMHg1MCwgMHgxNCwgMHg1NCwgMHg0MSwgMHgxMSwgMHg1MSwKKyAgICAweDQ1LCAweDE1LCAweDU1LCAweDQ0LCAweDk1LCAweDZBLCAweDAzLCAweDgwLCAweEMwLCAweDkwLCAweEQwLCAweDk0LAorICAgIDB4RDQsIDB4MjQsIDB4NjQsIDB4NTgsIDB4OTEsIDB4QTEsIDB4ODUsIDB4RDUsIDB4MjUsIDB4NjUsIDB4QTUsIDB4RTUsCisgICAgMHg3NSwgMHhCNSwgMHhGNSwgMHgxOSwgMHg1OSwgMHg5OSwgMHhEOSwgMHg2OSwgMHhBOSwgMHhFOSwgMHg3OSwgMHhCOSwKKyAgICAweEY5LCAweDRELCAweDVELCAweDlELCAweERELCAweDZELCAweEFELCAweEVELCAweDdELCAweEJELCAweEZELCAweDAyLAorICAgIDB4NDIsIDB4NTIsIDB4MDYsIDB4NDYsIDB4MTYsIDB4NTYsIDB4OTYsIDB4RDYsIDB4MjYsIDB4NjYsIDB4QTYsIDB4RTYsCisgICAgMHg3NiwgMHhCNiwgMHhGNiwgMHgxQSwgMHg1QSwgMHg5QSwgMHhEQSwgMHhBQSwgMHhFQSwgMHg3QSwgMHhCQSwgMHhGQSwKKyAgICAweDVFLCAweDlFLCAweERFLCAweDZFLCAweEFFLCAweEVFLCAweDdFLCAweEJFLCAweEZFLCAweDA3LCAweDQ3LCAweDU3LAorICAgIDB4OTcsIDB4RDcsIDB4NjcsIDB4QTcsIDB4RTcsIDB4NzcsIDB4QjcsIDB4RjcsIDB4NUIsIDB4OUIsIDB4REIsIDB4NkIsCisgICAgMHhBQiwgMHhFQiwgMHg3QiwgMHhCQiwgMHhGQiwgMHg1RiwgMHg5RiwgMHhERiwgMHg2RiwgMHhBRiwgMHhFRiwgMHg3RiwKKyAgICAweEJGLCAweEZGLCAweDIwLCAweDYwLCAweDcwLCAweEIwLCAweEYwLCAweDg0LCAweEM0LCAweEE0LCAweEU0LCAweDc0LAorICAgIDB4QjQsIDB4RjQsIDB4MDgsIDB4ODgsIDB4MTgsIDB4OTgsIDB4RDgsIDB4NjgsIDB4QTgsIDB4RTgsIDB4NzgsIDB4QjgsCisgICAgMHhGOCwgMHgxQywgMHg1QywgMHg5QywgMHhEQywgMHg2QywgMHhBQywgMHhFQywgMHgzQywgMHg3QywgMHhCQywgMHhGQywKKyAgICAweDgxLCAweEQxLCAweDIxLCAweDYxLCAweEUxLCAweDcxLCAweEIxLCAweEYxLCAweEM1LCAweDM1LCAweDA5LCAweDQ5LAorICAgIDB4ODksIDB4QzksIDB4MjksIDB4MzksIDB4MEQsIDB4OEQsIDB4Q0QsIDB4MUQsIDB4MkQsIDB4M0QsIDB4OTIsIDB4RDIsCisgICAgMHgyMiwgMHg2MiwgMHhBMiwgMHhFMiwgMHg3MiwgMHhCMiwgMHhGMiwgMHg4NiwgMHhDNiwgMHgzNiwgMHgwQSwgMHg0QSwKKyAgICAweDhBLCAweENBLCAweDJBLCAweDNBLCAweDBFLCAweDRFLCAweDhFLCAweENFLCAweDFFLCAweDJFLCAweDNFLCAweDEzLAorICAgIDB4NTMsIDB4OTMsIDB4RDMsIDB4NjMsIDB4QTMsIDB4RTMsIDB4NzMsIDB4QjMsIDB4RjMsIDB4ODcsIDB4QzcsIDB4MTcsCisgICAgMHgyNywgMHgzNywgMHgwQiwgMHg0QiwgMHg4QiwgMHhDQiwgMHgxQiwgMHgyQiwgMHgzQiwgMHgwRiwgMHg0RiwgMHg4RiwKKyAgICAweENGLCAweDFGLCAweDJGLCAweDNGLCAweEEwLCAweEUwLCAweDMwLCAweDM0LCAweDQ4LCAweEM4LCAweDI4LCAweDM4LAorICAgIDB4MEMsIDB4NEMsIDB4OEMsIDB4Q0MsIDB4MkMsIDB4QzEsIDB4MzEsIDB4ODIsIDB4QzIsIDB4MTIsIDB4MzIsIDB4NDMsCisgICAgMHg4MywgMHhDMywgMHgyMywgMHgzMworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNzRfY2JbOF0gPSB7IDEsIDYsIDEsIDAsIDIsIDIsIDIsIDQgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNzRfeGxhdFsxMV0gPSB7CisgICAgMCwgMSwgMTUsIDIsIDE0LCA1LCAxMywgMywgNCwgMTEsIDEyCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmX2I3NV9jYlsxM10gPSB7CisgICAgMiwgMTIsIDEsIDQsIDAsIDAsIDAsIDgsIDExLCAyNCwgNTMsIDY0LCA2MAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNzVfeGxhdFsyMjVdID0geworICAgIDB4MDAsIDB4MTAsIDB4RjAsIDB4MDEsIDB4MEYsIDB4MjAsIDB4RTAsIDB4MTEsIDB4RjEsIDB4MDIsIDB4MEUsIDB4MUYsCisgICAgMHhGRiwgMHhEMCwgMHgyMSwgMHhFMSwgMHgxMiwgMHhGMiwgMHgwMywgMHgwRCwgMHgxRSwgMHhGRSwgMHgyRiwgMHhFRiwKKyAgICAweDMwLCAweDQwLCAweDYwLCAweDcwLCAweDkwLCAweEEwLCAweEMwLCAweDMxLCAweEQxLCAweDIyLCAweEUyLCAweDEzLAorICAgIDB4RjMsIDB4MDQsIDB4MDYsIDB4MDcsIDB4MDksIDB4MEMsIDB4MUQsIDB4RkQsIDB4MkUsIDB4RUUsIDB4M0YsIDB4REYsCisgICAgMHg1MCwgMHhCMCwgMHg0MSwgMHg2MSwgMHg3MSwgMHg5MSwgMHhBMSwgMHhDMSwgMHgzMiwgMHg2MiwgMHg3MiwgMHg5MiwKKyAgICAweEEyLCAweEQyLCAweDIzLCAweEQzLCAweEUzLCAweDE0LCAweEY0LCAweDA1LCAweDE2LCAweDI2LCAweEU2LCAweEY2LAorICAgIDB4MTcsIDB4MjcsIDB4RTcsIDB4RjcsIDB4MTksIDB4MjksIDB4RjksIDB4MEEsIDB4MUEsIDB4MkEsIDB4RkEsIDB4MEIsCisgICAgMHgxQywgMHgyQywgMHhGQywgMHgyRCwgMHgzRCwgMHhFRCwgMHgzRSwgMHg0RSwgMHg3RSwgMHg5RSwgMHhERSwgMHg0RiwKKyAgICAweDZGLCAweDdGLCAweDlGLCAweEFGLCAweENGLCAweDUxLCAweEIxLCAweDQyLCAweDUyLCAweEIyLCAweEMyLCAweDMzLAorICAgIDB4NjMsIDB4NzMsIDB4OTMsIDB4QTMsIDB4QjMsIDB4QzMsIDB4MjQsIDB4MzQsIDB4NzQsIDB4QTQsIDB4RDQsIDB4RTQsCisgICAgMHgxNSwgMHgyNSwgMHg2NSwgMHg5NSwgMHhFNSwgMHhGNSwgMHgzNiwgMHhENiwgMHgzNywgMHg0NywgMHhDNywgMHhENywKKyAgICAweDM5LCAweDU5LCAweEI5LCAweEM5LCAweEQ5LCAweEU5LCAweDNBLCAweDZBLCAweERBLCAweEVBLCAweDFCLCAweDJCLAorICAgIDB4OUIsIDB4QUIsIDB4RUIsIDB4RkIsIDB4NkMsIDB4N0MsIDB4OUMsIDB4QUMsIDB4RUMsIDB4NEQsIDB4NkQsIDB4N0QsCisgICAgMHg5RCwgMHhBRCwgMHhCRCwgMHhERCwgMHg1RSwgMHg2RSwgMHhBRSwgMHhDRSwgMHg1RiwgMHg0MywgMHg1MywgMHg0NCwKKyAgICAweDU0LCAweDY0LCAweDk0LCAweEI0LCAweEM0LCAweDM1LCAweDQ1LCAweDU1LCAweDc1LCAweEE1LCAweEI1LCAweEM1LAorICAgIDB4RDUsIDB4NDYsIDB4NTYsIDB4NjYsIDB4NzYsIDB4OTYsIDB4QTYsIDB4QjYsIDB4QzYsIDB4NTcsIDB4NjcsIDB4NzcsCisgICAgMHg5NywgMHhBNywgMHhCNywgMHg0OSwgMHg2OSwgMHg3OSwgMHg5OSwgMHhBOSwgMHg0QSwgMHg1QSwgMHg3QSwgMHg5QSwKKyAgICAweEFBLCAweEJBLCAweENBLCAweDNCLCAweDRCLCAweDVCLCAweDZCLCAweDdCLCAweEJCLCAweENCLCAweERCLCAweDNDLAorICAgIDB4NEMsIDB4NUMsIDB4QkMsIDB4Q0MsIDB4REMsIDB4NUQsIDB4Q0QsIDB4QkUsIDB4QkYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh1ZmZfYjc3X2NiWzEyXSA9IHsKKyAgICAyLCAxMSwgMSwgMCwgNCwgNiwgMTAsIDEyLCA3LCAxNSwgNCwgNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaHVmZl9iNzdfeGxhdFs2M10gPSB7CisgICAgIDAsICAxLCAgMiwgNjIsIDYzLCAgMywgIDQsICA1LCA1OSwgNjAsIDYxLCAgNiwgIDcsICA4LCAgOSwgMTAsCisgICAgNTQsIDU1LCA1NiwgNTcsIDU4LCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCA0NywgNDksIDUwLCA1MSwgNTIsCisgICAgNTMsIDE3LCAxOCwgMTksIDIwLCA0NSwgNDYsIDQ4LCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMzcsCisgICAgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDI4LCAyOSwgMzAsIDM1LCAzMSwgMzMsIDM0LCAzNgorfTsKKworLyoqIFRhYmxlcyBmb3Igc3BlY3RydW0gY29kaW5nLiAqLwordHlwZWRlZiBzdHJ1Y3QgQXRyYWMzcFNwZWNDb2RlVGFiIHsKKyAgICB1aW50OF90IGdyb3VwX3NpemU7ICAvLy88IG51bWJlciBvZiBjb2VmZmljaWVudHMgZ3JvdXBlZCB0b2dldGhlcgorICAgIHVpbnQ4X3QgbnVtX2NvZWZmczsgIC8vLzwgMSAtIG1hcCBpbmRleCB0byBhIHNpbmdsZSB2YWx1ZSwgPiAxIC0gbWFwIGluZGV4IHRvIGEgdmVjdG9yIG9mIHZhbHVlcworICAgIHVpbnQ4X3QgYml0czsgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJpdHMgYSBzaW5nbGUgY29lZmZpY2llbnQgb2NjdXB5CisgICAgdWludDhfdCBpc19zaWduZWQ7ICAgLy8vPCAxIC0gdmFsdWVzIGluIHRoYXQgdGFibGUgYXJlIHNpZ25lZCBvbmVzLCBvdGhlcndpc2UgLSBhYnNvbHV0ZSBvbmVzCisKKyAgICBpbnQgcmVkaXJlY3Q7ICAgICAgICAvLy88IGlmID49IDA6IHRlbGxzIHdoaWNoIGh1ZmZtYW4gdGFibGUgbXVzdCBiZSByZXVzZWQKKyAgICBjb25zdCB1aW50OF90ICpjYjsgICAvLy88IHBvaW50ZXIgdG8gdGhlIGNvZGVib29rIGRlc2NyaXB0b3IKKyAgICBjb25zdCB1aW50OF90ICp4bGF0OyAvLy88IHBvaW50ZXIgdG8gdGhlIHRyYW5zbGF0aW9uIHRhYmxlIG9yIE5VTEwgaWYgbm9uZQorfSBBdHJhYzNwU3BlY0NvZGVUYWI7CisKK3N0YXRpYyBjb25zdCBBdHJhYzNwU3BlY0NvZGVUYWIgYXRyYWMzcF9zcGVjdHJhX3RhYnNbMTEyXSA9IHsKKyAgICAvKiB0YWJsZSBzZXQgPSBBICovCisgICAgLyogY29kZSB0YWJsZSA9IDAgKi8KKyAgICB7IDEsIDQsIDIsIDEsIC0xLCBodWZmX2EwMV9jYiwgaHVmZl9hMDFfeGxhdCB9LCAvLyB3b3JkbGVuID0gMQorICAgIHsgMSwgNCwgMiwgMCwgLTEsIGh1ZmZfYTAyX2NiLCBodWZmX2EwMl94bGF0IH0sIC8vIHdvcmRsZW4gPSAyCisgICAgeyAxLCAyLCAzLCAxLCAtMSwgaHVmZl9hMDNfY2IsIGh1ZmZfYTAzX3hsYXQgfSwgLy8gd29yZGxlbiA9IDMKKyAgICB7IDEsIDEsIDMsIDAsIC0xLCBodWZmX2EwNF9jYiwgaHVmZl9hMDRfeGxhdCB9LCAvLyB3b3JkbGVuID0gNAorICAgIHsgMSwgMiwgNCwgMSwgLTEsIGh1ZmZfYTA1X2NiLCBodWZmX2EwNV94bGF0IH0sIC8vIHdvcmRsZW4gPSA1CisgICAgeyAxLCAxLCA0LCAwLCAtMSwgaHVmZl9hMDZfY2IsIGh1ZmZfYTA2X3hsYXQgfSwgLy8gd29yZGxlbiA9IDYKKyAgICB7IDEsIDEsIDYsIDEsIC0xLCBodWZmX2EwN19jYiwgaHVmZl9hMDdfeGxhdCB9LCAvLyB3b3JkbGVuID0gNworCisgICAgLyogY29kZSB0YWJsZSA9IDEgKi8KKyAgICB7IDQsIDQsIDIsIDEsIC0xLCBodWZmX2ExMV9jYiwgaHVmZl9hMTFfeGxhdCB9LCAvLyB3b3JkbGVuID0gMQorICAgIHsgMSwgNCwgMiwgMCwgLTEsIGh1ZmZfYTEyX2NiLCBodWZmX2ExMl94bGF0IH0sIC8vIHdvcmRsZW4gPSAyCisgICAgeyAxLCAyLCAzLCAxLCAtMSwgaHVmZl9hMTNfY2IsIGh1ZmZfYTEzX3hsYXQgfSwgLy8gd29yZGxlbiA9IDMKKyAgICB7IDEsIDIsIDQsIDEsIC0xLCBodWZmX2ExNF9jYiwgaHVmZl9hMTRfeGxhdCB9LCAvLyB3b3JkbGVuID0gNAorICAgIHsgMSwgMiwgNCwgMSwgLTEsIGh1ZmZfYTE1X2NiLCBodWZmX2ExNV94bGF0IH0sIC8vIHdvcmRsZW4gPSA1CisgICAgeyAxLCAyLCA0LCAwLCAtMSwgaHVmZl9hMTZfY2IsIGh1ZmZfYTE2X3hsYXQgfSwgLy8gd29yZGxlbiA9IDYKKyAgICB7IDEsIDEsIDYsIDEsIC0xLCBodWZmX2ExN19jYiwgaHVmZl9hMTdfeGxhdCB9LCAvLyB3b3JkbGVuID0gNworCisgICAgLyogY29kZSB0YWJsZSA9IDIgKi8KKyAgICB7IDEsIDQsIDIsIDEsIC0xLCBodWZmX2EyMV9jYiwgaHVmZl9hMjFfeGxhdCB9LCAvLyB3b3JkbGVuID0gMQorICAgIHsgMSwgMiwgMywgMSwgLTEsIGh1ZmZfYTIyX2NiLCBodWZmX2EyMl94bGF0IH0sIC8vIHdvcmRsZW4gPSAyCisgICAgeyAxLCAyLCAzLCAxLCAtMSwgaHVmZl9hMjNfY2IsIGh1ZmZfYTIzX3hsYXQgfSwgLy8gd29yZGxlbiA9IDMKKyAgICB7IDEsIDEsIDMsIDAsIC0xLCBodWZmX2EyNF9jYiwgTlVMTCAgICAgICAgICB9LCAvLyB3b3JkbGVuID0gNAorICAgIHsgMSwgMSwgMywgMCwgLTEsIGh1ZmZfYTI1X2NiLCBodWZmX2EyNV94bGF0IH0sIC8vIHdvcmRsZW4gPSA1CisgICAgeyAxLCAyLCA0LCAwLCAtMSwgaHVmZl9hMjZfY2IsIGh1ZmZfYTI2X3hsYXQgfSwgLy8gd29yZGxlbiA9IDYKKyAgICB7IDEsIDEsIDYsIDEsIC0xLCBodWZmX2EyN19jYiwgaHVmZl9hMjdfeGxhdCB9LCAvLyB3b3JkbGVuID0gNworCisgICAgLyogY29kZSB0YWJsZSA9IDMgKi8KKyAgICB7IDEsIDIsIDIsIDEsIC0xLCBodWZmX2EzMV9jYiwgaHVmZl9hMzFfeGxhdCB9LCAvLyB3b3JkbGVuID0gMQorICAgIHsgMSwgNCwgMiwgMCwgLTEsIGh1ZmZfYTMyX2NiLCBodWZmX2EzMl94bGF0IH0sIC8vIHdvcmRsZW4gPSAyCisgICAgeyAxLCA0LCAyLCAwLCAtMSwgaHVmZl9hMzNfY2IsIGh1ZmZfYTMzX3hsYXQgfSwgLy8gd29yZGxlbiA9IDMKKyAgICB7IDEsIDEsIDMsIDAsIC0xLCBodWZmX2EzNF9jYiwgaHVmZl9hMzRfeGxhdCB9LCAvLyB3b3JkbGVuID0gNAorICAgIHsgMSwgMiwgNCwgMSwgLTEsIGh1ZmZfYTM1X2NiLCBodWZmX2EzNV94bGF0IH0sIC8vIHdvcmRsZW4gPSA1CisgICAgeyAxLCAyLCA0LCAwLCAtMSwgaHVmZl9hMzZfY2IsIGh1ZmZfYTM2X3hsYXQgfSwgLy8gd29yZGxlbiA9IDYKKyAgICB7IDEsIDEsIDYsIDEsIC0xLCBodWZmX2EzN19jYiwgaHVmZl9hMzdfeGxhdCB9LCAvLyB3b3JkbGVuID0gNworCisgICAgLyogY29kZSB0YWJsZSA9IDQgKi8KKyAgICB7IDEsIDQsIDIsIDEsIC0xLCBodWZmX2E0MV9jYiwgaHVmZl9hNDFfeGxhdCB9LCAvLyB3b3JkbGVuID0gMQorICAgIHsgMSwgNCwgMiwgMCwgLTEsIGh1ZmZfYTQyX2NiLCBodWZmX2E0Ml94bGF0IH0sIC8vIHdvcmRsZW4gPSAyCisgICAgeyAxLCAxLCAzLCAxLCAtMSwgaHVmZl9hNDNfY2IsIGh1ZmZfYTQzX3hsYXQgfSwgLy8gd29yZGxlbiA9IDMKKyAgICB7IDEsIDIsIDQsIDEsIC0xLCBodWZmX2E0NF9jYiwgaHVmZl9hNDRfeGxhdCB9LCAvLyB3b3JkbGVuID0gNAorICAgIHsgMSwgMSwgMywgMCwgLTEsIGh1ZmZfYTQ1X2NiLCBodWZmX2E0NV94bGF0IH0sIC8vIHdvcmRsZW4gPSA1CisgICAgeyAxLCAyLCA0LCAwLCAtMSwgaHVmZl9hNDZfY2IsIGh1ZmZfYTQ2X3hsYXQgfSwgLy8gd29yZGxlbiA9IDYKKyAgICB7IDEsIDEsIDYsIDEsIC0xLCBodWZmX2E0N19jYiwgaHVmZl9hNDdfeGxhdCB9LCAvLyB3b3JkbGVuID0gNworCisgICAgLyogY29kZSB0YWJsZSA9IDUgKi8KKyAgICB7IDEsIDQsIDIsIDEsIC0xLCBodWZmX2E1MV9jYiwgaHVmZl9hNTFfeGxhdCB9LCAvLyB3b3JkbGVuID0gMQorICAgIHsgMSwgMiwgMywgMSwgLTEsIGh1ZmZfYTUyX2NiLCBodWZmX2E1Ml94bGF0IH0sIC8vIHdvcmRsZW4gPSAyCisgICAgeyAxLCAxLCAzLCAxLCAtMSwgaHVmZl9hNDNfY2IsIGh1ZmZfYTUzX3hsYXQgfSwgLy8gd29yZGxlbiA9IDMKKyAgICB7IDEsIDIsIDQsIDEsIC0xLCBodWZmX2E1NF9jYiwgaHVmZl9hNTRfeGxhdCB9LCAvLyB3b3JkbGVuID0gNAorICAgIHsgMSwgMSwgMywgMCwgLTEsIGh1ZmZfYTU1X2NiLCBodWZmX2E1NV94bGF0IH0sIC8vIHdvcmRsZW4gPSA1CisgICAgeyAxLCAxLCA1LCAxLCAtMSwgaHVmZl9hNTZfY2IsIGh1ZmZfYTU2X3hsYXQgfSwgLy8gd29yZGxlbiA9IDYKKyAgICB7IDEsIDEsIDYsIDEsIC0xLCBodWZmX2E1N19jYiwgaHVmZl9hNTdfeGxhdCB9LCAvLyB3b3JkbGVuID0gNworCisgICAgLyogY29kZSB0YWJsZSA9IDYgKi8KKyAgICB7IDIsIDQsIDIsIDEsIC0xLCBodWZmX2E2MV9jYiwgaHVmZl9hNjFfeGxhdCB9LCAvLyB3b3JkbGVuID0gMQorICAgIHsgMSwgMiwgMywgMSwgLTEsIGh1ZmZfYTYyX2NiLCBodWZmX2E2Ml94bGF0IH0sIC8vIHdvcmRsZW4gPSAyCisgICAgeyAxLCA0LCAyLCAwLCAtMSwgaHVmZl9hNjNfY2IsIGh1ZmZfYTYzX3hsYXQgfSwgLy8gd29yZGxlbiA9IDMKKyAgICB7IDEsIDIsIDQsIDEsIC0xLCBodWZmX2E2NF9jYiwgaHVmZl9hNjRfeGxhdCB9LCAvLyB3b3JkbGVuID0gNAorICAgIHsgMSwgMSwgNCwgMSwgLTEsIGh1ZmZfYTY1X2NiLCBodWZmX2E2NV94bGF0IH0sIC8vIHdvcmRsZW4gPSA1CisgICAgeyAxLCAxLCA1LCAxLCAtMSwgaHVmZl9hNjZfY2IsIGh1ZmZfYTY2X3hsYXQgfSwgLy8gd29yZGxlbiA9IDYKKyAgICB7IDEsIDEsIDYsIDEsIC0xLCBodWZmX2E2N19jYiwgaHVmZl9hNjdfeGxhdCB9LCAvLyB3b3JkbGVuID0gNworCisgICAgLyogY29kZSB0YWJsZSA9IDcgKi8KKyAgICB7IDEsIDIsIDEsIDAsIC0xLCBodWZmX2E3MV9jYiwgTlVMTCAgICAgICAgICB9LCAvLyB3b3JkbGVuID0gMQorICAgIHsgMiwgNCwgMiwgMCwgLTEsIGh1ZmZfYTcyX2NiLCBodWZmX2E3Ml94bGF0IH0sIC8vIHdvcmRsZW4gPSAyCisgICAgeyAxLCAyLCAzLCAxLCAtMSwgaHVmZl9hNzNfY2IsIGh1ZmZfYTczX3hsYXQgfSwgLy8gd29yZGxlbiA9IDMKKyAgICB7IDEsIDIsIDQsIDEsIC0xLCBodWZmX2E3NF9jYiwgaHVmZl9hNzRfeGxhdCB9LCAvLyB3b3JkbGVuID0gNAorICAgIHsgMSwgMSwgNCwgMSwgLTEsIGh1ZmZfYTc1X2NiLCBodWZmX2E3NV94bGF0IH0sIC8vIHdvcmRsZW4gPSA1CisgICAgeyAyLCAyLCA0LCAwLCAtMSwgaHVmZl9hNzZfY2IsIGh1ZmZfYTc2X3hsYXQgfSwgLy8gd29yZGxlbiA9IDYKKyAgICB7IDQsIDEsIDYsIDEsICA2LCBOVUxMLCAgICAgICAgTlVMTCAgICAgICAgICB9LCAvLyB3b3JkbGVuID0gNworCisgICAgLyogdGFibGUgc2V0ID0gQiAqLworICAgIC8qIGNvZGUgdGFibGUgPSAwICovCisgICAgeyA0LCA0LCAyLCAxLCAtMSwgaHVmZl9iMDFfY2IsIGh1ZmZfYjAxX3hsYXQgfSwgLy8gd29yZGxlbiA9IDEKKyAgICB7IDEsIDQsIDIsIDAsIC0xLCBodWZmX2IwMl9jYiwgaHVmZl9iMDJfeGxhdCB9LCAvLyB3b3JkbGVuID0gMgorICAgIHsgNCwgMiwgMywgMSwgLTEsIGh1ZmZfYjAzX2NiLCBodWZmX2IwM194bGF0IH0sIC8vIHdvcmRsZW4gPSAzCisgICAgeyAxLCAyLCA0LCAxLCAtMSwgaHVmZl9iMDRfY2IsIGh1ZmZfYjA0X3hsYXQgfSwgLy8gd29yZGxlbiA9IDQKKyAgICB7IDEsIDIsIDQsIDEsIC0xLCBodWZmX2IwNV9jYiwgaHVmZl9iMDVfeGxhdCB9LCAvLyB3b3JkbGVuID0gNQorICAgIHsgMSwgMSwgNCwgMCwgIDUsIE5VTEwsICAgICAgICBOVUxMICAgICAgICAgIH0sIC8vIHdvcmRsZW4gPSA2CisgICAgeyAxLCAxLCA2LCAxLCAtMSwgaHVmZl9iMDdfY2IsIGh1ZmZfYjA3X3hsYXQgfSwgLy8gd29yZGxlbiA9IDcKKworICAgIC8qIGNvZGUgdGFibGUgPSAxICovCisgICAgeyAxLCA0LCAyLCAxLCAxNCwgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDEKKyAgICB7IDEsIDQsIDIsIDAsIC0xLCBodWZmX2IxMl9jYiwgaHVmZl9iMTJfeGxhdCB9LCAvLyB3b3JkbGVuID0gMgorICAgIHsgMSwgMiwgMywgMSwgIDksIE5VTEwsICAgICAgICBOVUxMICAgICAgICAgIH0sIC8vIHdvcmRsZW4gPSAzCisgICAgeyAxLCAyLCA0LCAxLCAtMSwgaHVmZl9iMTRfY2IsIGh1ZmZfYjE0X3hsYXQgfSwgLy8gd29yZGxlbiA9IDQKKyAgICB7IDEsIDIsIDQsIDEsIDExLCBOVUxMLCAgICAgICAgTlVMTCAgICAgICAgICB9LCAvLyB3b3JkbGVuID0gNQorICAgIHsgMSwgMiwgNCwgMCwgLTEsIGh1ZmZfYjE2X2NiLCBodWZmX2IxNl94bGF0IH0sIC8vIHdvcmRsZW4gPSA2CisgICAgeyAxLCAxLCA2LCAxLCAgNiwgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDcKKworICAgIC8qIGNvZGUgdGFibGUgPSAyICovCisgICAgeyA0LCA0LCAyLCAxLCAyOCwgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDEKKyAgICB7IDQsIDQsIDIsIDAsIDIyLCBOVUxMLCAgICAgICAgTlVMTCAgICAgICAgICB9LCAvLyB3b3JkbGVuID0gMgorICAgIHsgMSwgMiwgMywgMSwgIDIsIE5VTEwsICAgICAgICBOVUxMICAgICAgICAgIH0sIC8vIHdvcmRsZW4gPSAzCisgICAgeyAxLCAyLCA0LCAxLCAzMSwgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDQKKyAgICB7IDIsIDIsIDQsIDEsIDYwLCBOVUxMLCAgICAgICAgTlVMTCAgICAgICAgICB9LCAvLyB3b3JkbGVuID0gNQorICAgIHsgMiwgMiwgNCwgMCwgLTEsIGh1ZmZfYjI2X2NiLCBodWZmX2IyNl94bGF0IH0sIC8vIHdvcmRsZW4gPSA2CisgICAgeyA0LCAxLCA2LCAxLCAgNiwgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDcKKworICAgIC8qIGNvZGUgdGFibGUgPSAzICovCisgICAgeyAxLCA0LCAyLCAxLCAzNSwgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDEKKyAgICB7IDEsIDQsIDIsIDAsIC0xLCBodWZmX2IzMl9jYiwgaHVmZl9iMzJfeGxhdCB9LCAvLyB3b3JkbGVuID0gMgorICAgIHsgMSwgNCwgMiwgMCwgLTEsIGh1ZmZfYjMzX2NiLCBodWZmX2IzM194bGF0IH0sIC8vIHdvcmRsZW4gPSAzCisgICAgeyAyLCAyLCA0LCAxLCA1OSwgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDQKKyAgICB7IDEsIDIsIDQsIDEsIC0xLCBodWZmX2IzNV9jYiwgaHVmZl9iMzVfeGxhdCB9LCAvLyB3b3JkbGVuID0gNQorICAgIHsgMSwgMiwgNCwgMCwgNzUsIE5VTEwsICAgICAgICBOVUxMICAgICAgICAgIH0sIC8vIHdvcmRsZW4gPSA2CisgICAgeyAxLCAxLCA2LCAxLCAtMSwgaHVmZl9iMzdfY2IsIGh1ZmZfYjM3X3hsYXQgfSwgLy8gd29yZGxlbiA9IDcKKworICAgIC8qIGNvZGUgdGFibGUgPSA0ICovCisgICAgeyAxLCA0LCAyLCAxLCAtMSwgaHVmZl9iNDFfY2IsIGh1ZmZfYjQxX3hsYXQgfSwgLy8gd29yZGxlbiA9IDEKKyAgICB7IDQsIDIsIDMsIDEsIC0xLCBodWZmX2I0Ml9jYiwgaHVmZl9iNDJfeGxhdCB9LCAvLyB3b3JkbGVuID0gMgorICAgIHsgMSwgMiwgMywgMSwgLTEsIGh1ZmZfYjQzX2NiLCBodWZmX2I0M194bGF0IH0sIC8vIHdvcmRsZW4gPSAzCisgICAgeyA0LCAyLCA0LCAxLCA2NiwgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDQKKyAgICB7IDEsIDEsIDMsIDAsIDMyLCBOVUxMLCAgICAgICAgTlVMTCAgICAgICAgICB9LCAvLyB3b3JkbGVuID0gNQorICAgIHsgMSwgMiwgNCwgMCwgMTIsIE5VTEwsICAgICAgICBOVUxMICAgICAgICAgIH0sIC8vIHdvcmRsZW4gPSA2CisgICAgeyAxLCAxLCA2LCAxLCAtMSwgaHVmZl9iNDdfY2IsIGh1ZmZfYjQ3X3hsYXQgfSwgLy8gd29yZGxlbiA9IDcKKworICAgIC8qIGNvZGUgdGFibGUgPSA1ICovCisgICAgeyAyLCA0LCAyLCAxLCA0MiwgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDEKKyAgICB7IDEsIDIsIDMsIDEsIC0xLCBodWZmX2I1Ml9jYiwgaHVmZl9iNTJfeGxhdCB9LCAvLyB3b3JkbGVuID0gMgorICAgIHsgNCwgMSwgMywgMSwgLTEsIGh1ZmZfYjUzX2NiLCBodWZmX2I1M194bGF0IH0sIC8vIHdvcmRsZW4gPSAzCisgICAgeyAxLCAxLCAzLCAwLCAxNywgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDQKKyAgICB7IDEsIDEsIDMsIDAsIDM5LCBOVUxMLCAgICAgICAgTlVMTCAgICAgICAgICB9LCAvLyB3b3JkbGVuID0gNQorICAgIHsgMSwgMSwgNSwgMSwgLTEsIGh1ZmZfYjU2X2NiLCBodWZmX2I1Nl94bGF0IH0sIC8vIHdvcmRsZW4gPSA2CisgICAgeyAyLCAxLCA2LCAxLCA2MiwgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDcKKworICAgIC8qIGNvZGUgdGFibGUgPSA2ICovCisgICAgeyAxLCA0LCAyLCAxLCAyOCwgTlVMTCwgICAgICAgIE5VTEwgICAgICAgICAgfSwgLy8gd29yZGxlbiA9IDEKKyAgICB7IDEsIDQsIDIsIDAsIC0xLCBodWZmX2I2Ml9jYiwgaHVmZl9iNjJfeGxhdCB9LCAvLyB3b3JkbGVuID0gMgorICAgIHsgMSwgMSwgMywgMSwgLTEsIGh1ZmZfYjYzX2NiLCBodWZmX2I2M194bGF0IH0sIC8vIHdvcmRsZW4gPSAzCisgICAgeyAxLCAxLCAzLCAwLCAtMSwgaHVmZl9iNjRfY2IsIGh1ZmZfYjY0X3hsYXQgfSwgLy8gd29yZGxlbiA9IDQKKyAgICB7IDQsIDIsIDQsIDEsIC0xLCBodWZmX2I2NV9jYiwgaHVmZl9iNjVfeGxhdCB9LCAvLyB3b3JkbGVuID0gNQorICAgIHsgMSwgMiwgNCwgMCwgLTEsIGh1ZmZfYjY2X2NiLCBodWZmX2I2Nl94bGF0IH0sIC8vIHdvcmRsZW4gPSA2CisgICAgeyAxLCAxLCA2LCAxLCAtMSwgaHVmZl9iNjdfY2IsIGh1ZmZfYjY3X3hsYXQgfSwgLy8gd29yZGxlbiA9IDcKKworICAgIC8qIGNvZGUgdGFibGUgPSA3ICovCisgICAgeyAxLCA0LCAyLCAxLCAtMSwgaHVmZl9iNzFfY2IsIGh1ZmZfYjcxX3hsYXQgfSwgLy8gd29yZGxlbiA9IDEKKyAgICB7IDQsIDQsIDIsIDAsIDc4LCBOVUxMLCAgICAgICAgTlVMTCAgICAgICAgICB9LCAvLyB3b3JkbGVuID0gMgorICAgIHsgNCwgNCwgMiwgMCwgLTEsIGh1ZmZfYjczX2NiLCBodWZmX2I3M194bGF0IH0sIC8vIHdvcmRsZW4gPSAzCisgICAgeyAxLCAxLCA0LCAxLCAtMSwgaHVmZl9iNzRfY2IsIGh1ZmZfYjc0X3hsYXQgfSwgLy8gd29yZGxlbiA9IDQKKyAgICB7IDEsIDIsIDQsIDEsIC0xLCBodWZmX2I3NV9jYiwgaHVmZl9iNzVfeGxhdCB9LCAvLyB3b3JkbGVuID0gNQorICAgIHsgMSwgMSwgNSwgMSwgNDcsIE5VTEwsICAgICAgICBOVUxMICAgICAgICAgIH0sIC8vIHdvcmRsZW4gPSA2CisgICAgeyAxLCAxLCA2LCAxLCAtMSwgaHVmZl9iNzdfY2IsIGh1ZmZfYjc3X3hsYXQgfSwgLy8gd29yZGxlbiA9IDcKK307CisKKy8qIEh1ZmZtYW4gdGFibGVzIGZvciBnYWluIGNvbnRyb2wgZGF0YS4gKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfaHVmZl9nYWluX25wb2ludHMxX2NiWzldID0geworICAgIDEsIDcsIDEsIDEsIDEsIDEsIDEsIDEsIDIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfaHVmZl9nYWluX25wb2ludHMyX3hsYXRbOF0gPSB7CisgICAgMCwgMSwgNywgMiwgNiwgMywgNCwgNQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX2dhaW5fbGV2MV9jYls5XSA9IHsgMSwgNywgMSwgMCwgMiwgMiwgMSwgMiwgOCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX2dhaW5fbGV2MV94bGF0WzE2XSA9IHsKKyAgICA3LCA1LCA4LCA2LCA5LCA0LCAxMCwgMTEsIDAsIDEsIDIsIDMsIDEyLCAxMywgMTQsIDE1Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sZXYyX2NiWzExXSA9IHsKKyAgICAxLCA5LCAxLCAxLCAxLCAxLCAxLCAwLCAyLCAwLCA4Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sZXYyX3hsYXRbMTVdID0geworICAgIDE1LCAxNCwgMSwgMTMsIDIsIDMsIDEyLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfaHVmZl9nYWluX2xldjNfY2JbMTFdID0geworICAgIDEsIDksIDEsIDAsIDMsIDEsIDEsIDAsIDIsIDAsIDgKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfaHVmZl9nYWluX2xldjNfeGxhdFsxNl0gPSB7CisgICAgMCwgMSwgMTQsIDE1LCAyLCAxMywgMywgMTIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX2dhaW5fbGV2NF9jYlsxMV0gPSB7CisgICAgMSwgOSwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMiwgOAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX2dhaW5fbGV2NF94bGF0WzE2XSA9IHsKKyAgICAwLCAxLCAxNSwgMTQsIDIsIDEzLCAzLCAxMiwgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sb2MxX2NiWzldID0geyAyLCA4LCAxLCAyLCA0LCA0LCA0LCAwLCAxNiB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX2dhaW5fbG9jMV94bGF0WzMxXSA9IHsKKyAgICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKyAgICAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sb2MyX2NiWzhdID0geyAzLCA4LCA1LCAzLCAyLCAzLCAyLCAxNiB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX2dhaW5fbG9jMl94bGF0WzMxXSA9IHsKKyAgICAgMiwgIDMsICA0LCAgNSwgIDYsICAxLCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKyAgICAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sb2MzX2NiWzddID0geyAyLCA2LCAxLCAwLCAyLCAxMSwgMTggfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfaHVmZl9nYWluX2xvYzNfeGxhdFszMl0gPSB7CisgICAgMCwgICAxLCAzMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgMjYsIDI3LCAyOCwgMjksIDMwLCAgOCwgIDksCisgICAgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfaHVmZl9nYWluX2xvYzRfY2JbNV0gPSB7IDQsIDYsIDMsIDIzLCA2IH07CitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sb2M0X3hsYXRbMzJdID0geworICAgIDAsICAyOCwgMjksICAxLCAgMiwgIDMsICA0LCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LAorICAgIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMzAsIDMxLCAgNSwgIDYsICA3LCAgOCwgIDksIDEwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX2h1ZmZfZ2Fpbl9sb2M1X2NiWzldID0geyAxLCA3LCAxLCAwLCAwLCAzLCAyLCA2LCAyMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX2dhaW5fbG9jNV94bGF0WzMyXSA9IHsKKyAgICAwLCAgIDEsICAyLCAzMSwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgMjksIDMwLCAgOSwgMTAsIDExLCAxMiwKKyAgICAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOAorfTsKKworLyogSHVmZm1hbiB0YWJsZXMgZm9yIEdIQSB3YXZlcyBkYXRhLiAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX3RvbmViYW5kc19jYls4XSA9IHsgMSwgNiwgMSwgMCwgMSwgMiwgNCwgOCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX251bXdhdnMxX2NiWzldID0geyAxLCA3LCAxLCAxLCAxLCAxLCAxLCAxLCAyIH07CitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX2h1ZmZfbnVtd2F2czJfY2JbOF0gPSB7IDEsIDYsIDEsIDEsIDEsIDEsIDAsIDQgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfaHVmZl9udW13YXZzMl94bGF0WzhdID0geyAwLCAxLCA3LCAyLCAzLCA0LCA1LCA2IH07CitzdGF0aWMgY29uc3QgdWludDhfdCBhdHJhYzNwX2h1ZmZfd2F2X2FtcHNmMV9jYls3XSA9IHsgNCwgOCwgMTAsIDgsIDYsIDAsIDggfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfaHVmZl93YXZfYW1wc2YxX3hsYXRbMzJdID0geworICAgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCA1LCA2LCAgNywgMTgsIDE5LCAyMCwKKyAgICAyMSwgMjIsICA0LCAyMywgMjQsIDI1LCAyNiwgMjcsICAwLCAgMSwgMiwgMywgMjgsIDI5LCAzMCwgMzEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfaHVmZl93YXZfYW1wc2YyX2NiWzddID0geyA0LCA4LCAxMSwgNSwgNiwgNiwgNCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX3dhdl9hbXBzZjJfeGxhdFszMl0gPSB7CisgICAgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAxNCwgMTUsIDE2LCAxNywgMjksCisgICAgIDksIDEwLCAxMSwgMTIsIDEzLCAzMCwgIDQsICA1LCAgNiwgIDcsICA4LCAzMSwgIDAsICAxLCAgMiwgIDMKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfaHVmZl93YXZfYW1wc2YzX2NiWzldID0geyAyLCA4LCAxLCAzLCAzLCAxLCA0LCA0LCAxNiB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX3dhdl9hbXBzZjNfeGxhdFszMl0gPSB7CisgICAgMCwgMSwgIDIsIDMxLCAgMywgMjksIDMwLCAgNCwgIDUsICA2LCAyNywgMjgsICA3LCAyNCwgMjUsIDI2LAorICAgIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXRyYWMzcF9odWZmX2ZyZXFfY2JbMTNdID0geworICAgIDEsIDExLCAxLCAwLCAwLCAyLCAyLCAwLCA5LCA5LCAyOSwgMTA0LCAxMDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF0cmFjM3BfaHVmZl9mcmVxX3hsYXRbMjU2XSA9IHsKKyAgICAgIDAsICAgMSwgMjU1LCAgIDIsIDI1NCwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgMjUxLCAyNTIsIDI1MywgICA5LCAgMTAsCisgICAgIDExLCAgMTIsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLAorICAgICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywKKyAgICAgMzgsIDI0MywgMjQ0LCAyNDUsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsCisgICAgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLCAgNjQsICA2NSwgIDY2LAorICAgICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwgIDgwLCAgODEsICA4MiwKKyAgICAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsCisgICAgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LAorICAgIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsIDIyNCwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIzMCwKKyAgICAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAgOTQsICA5NSwgIDk2LCAgOTcsCisgICAgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLAorICAgIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwKKyAgICAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LCAxNDUsCisgICAgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksIDE2MCwgMTYxLAorICAgIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3NCwgMTc1LCAxNzYsIDE3NywKKyAgICAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5LCAxOTAsIDE5MSwgMTkyLCAxOTMKK307CisKKyNlbmRpZiAvKiBBVkNPREVDX0FUUkFDM1BMVVNfREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hdHJhYzNwbHVzZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hdHJhYzNwbHVzZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxMjFlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F0cmFjM3BsdXNkZWMuYwpAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIEFUUkFDMysgY29tcGF0aWJsZSBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTMgTWF4aW0gUG9saWFrb3Zza2kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU29ueSBBVFJBQzMrIGNvbXBhdGlibGUgZGVjb2Rlci4KKyAqCisgKiBDb250YWluZXIgZm9ybWF0cyB1c2VkIHRvIHN0b3JlIGl0cyBkYXRhOgorICogUklGRiBXQVYgKC5hdDMpIGFuZCBTb255IE9wZW5NRyAoLm9tYSwgLmFhMykuCisgKgorICogVGVjaG5pY2FsIGRlc2NyaXB0aW9uIG9mIHRoaXMgY29kZWMgY2FuIGJlIGZvdW5kIGhlcmU6CisgKiBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1BVFJBQzNwbHVzCisgKgorICogS3Vkb3MgdG8gQmVuamFtaW4gTGFyc3NvbiBhbmQgTWljaGFlbCBLYXJjaGVyCisgKiBmb3IgdGhlaXIgcHJlY2lvdXMgdGVjaG5pY2FsIGhlbHAhCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXRyYWMuaCIKKyNpbmNsdWRlICJhdHJhYzNwbHVzLmgiCisKK3R5cGVkZWYgc3RydWN0IEFUUkFDM1BDb250ZXh0IHsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOworCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgc2FtcGxlcylbMl1bQVRSQUMzUF9GUkFNRV9TQU1QTEVTXTsgIC8vLzwgcXVhbnRpemVkIE1EQ1Qgc3BlY3RydW0KKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBtZGN0X2J1ZilbMl1bQVRSQUMzUF9GUkFNRV9TQU1QTEVTXTsgLy8vPCBvdXRwdXQgb2YgdGhlIElNRENUCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgdGltZV9idWYpWzJdW0FUUkFDM1BfRlJBTUVfU0FNUExFU107IC8vLzwgb3V0cHV0IG9mIHRoZSBnYWluIGNvbXBlbnNhdGlvbgorICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIG91dHBfYnVmKVsyXVtBVFJBQzNQX0ZSQU1FX1NBTVBMRVNdOworCisgICAgQXRyYWNHQ0NvbnRleHQgZ2FpbmNfY3R4OyAgIC8vLzwgZ2FpbiBjb21wZW5zYXRpb24gY29udGV4dAorICAgIEZGVENvbnRleHQgbWRjdF9jdHg7CisgICAgRkZUQ29udGV4dCBpcHFmX2RjdF9jdHg7ICAgIC8vLzwgSURDVCBjb250ZXh0IHVzZWQgYnkgSVBRRgorCisgICAgQXRyYWMzcENoYW5Vbml0Q3R4ICpjaF91bml0czsgICAvLy88IGdsb2JhbCBjaGFubmVsIHVuaXRzCisKKyAgICBpbnQgbnVtX2NoYW5uZWxfYmxvY2tzOyAgICAgLy8vPCBudW1iZXIgb2YgY2hhbm5lbCBibG9ja3MKKyAgICB1aW50OF90IGNoYW5uZWxfYmxvY2tzWzVdOyAgLy8vPCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvcgorICAgIHVpbnQ2NF90IG15X2NoYW5uZWxfbGF5b3V0OyAvLy88IGN1cnJlbnQgY2hhbm5lbCBsYXlvdXQKK30gQVRSQUMzUENvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBhdHJhYzNwX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQVRSQUMzUENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5jaF91bml0cyk7CisgICAgYXZfZnJlZXAoJmN0eC0+ZmRzcCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHNldF9jaGFubmVsX3BhcmFtcyhBVFJBQzNQQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgbWVtc2V0KGN0eC0+Y2hhbm5lbF9ibG9ja3MsIDAsIHNpemVvZihjdHgtPmNoYW5uZWxfYmxvY2tzKSk7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jaGFubmVscykgeworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVsX2xheW91dCAhPSBBVl9DSF9GUk9OVF9MRUZUKQorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisKKyAgICAgICAgY3R4LT5udW1fY2hhbm5lbF9ibG9ja3MgPSAxOworICAgICAgICBjdHgtPmNoYW5uZWxfYmxvY2tzWzBdICA9IENIX1VOSVRfTU9OTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgICA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgIGN0eC0+bnVtX2NoYW5uZWxfYmxvY2tzID0gMTsKKyAgICAgICAgY3R4LT5jaGFubmVsX2Jsb2Nrc1swXSAgPSBDSF9VTklUX1NURVJFTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgICA9IEFWX0NIX0xBWU9VVF9TVVJST1VORDsKKyAgICAgICAgY3R4LT5udW1fY2hhbm5lbF9ibG9ja3MgPSAyOworICAgICAgICBjdHgtPmNoYW5uZWxfYmxvY2tzWzBdICA9IENIX1VOSVRfU1RFUkVPOworICAgICAgICBjdHgtPmNoYW5uZWxfYmxvY2tzWzFdICA9IENIX1VOSVRfTU9OTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgICA9IEFWX0NIX0xBWU9VVF80UE9JTlQwOworICAgICAgICBjdHgtPm51bV9jaGFubmVsX2Jsb2NrcyA9IDM7CisgICAgICAgIGN0eC0+Y2hhbm5lbF9ibG9ja3NbMF0gID0gQ0hfVU5JVF9TVEVSRU87CisgICAgICAgIGN0eC0+Y2hhbm5lbF9ibG9ja3NbMV0gID0gQ0hfVU5JVF9NT05POworICAgICAgICBjdHgtPmNoYW5uZWxfYmxvY2tzWzJdICA9IENIX1VOSVRfTU9OTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgICA9IEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0s7CisgICAgICAgIGN0eC0+bnVtX2NoYW5uZWxfYmxvY2tzID0gNDsKKyAgICAgICAgY3R4LT5jaGFubmVsX2Jsb2Nrc1swXSAgPSBDSF9VTklUX1NURVJFTzsKKyAgICAgICAgY3R4LT5jaGFubmVsX2Jsb2Nrc1sxXSAgPSBDSF9VTklUX01PTk87CisgICAgICAgIGN0eC0+Y2hhbm5lbF9ibG9ja3NbMl0gID0gQ0hfVU5JVF9TVEVSRU87CisgICAgICAgIGN0eC0+Y2hhbm5lbF9ibG9ja3NbM10gID0gQ0hfVU5JVF9NT05POworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCAgID0gQVZfQ0hfTEFZT1VUXzZQT0lOVDFfQkFDSzsKKyAgICAgICAgY3R4LT5udW1fY2hhbm5lbF9ibG9ja3MgPSA1OworICAgICAgICBjdHgtPmNoYW5uZWxfYmxvY2tzWzBdICA9IENIX1VOSVRfU1RFUkVPOworICAgICAgICBjdHgtPmNoYW5uZWxfYmxvY2tzWzFdICA9IENIX1VOSVRfTU9OTzsKKyAgICAgICAgY3R4LT5jaGFubmVsX2Jsb2Nrc1syXSAgPSBDSF9VTklUX1NURVJFTzsKKyAgICAgICAgY3R4LT5jaGFubmVsX2Jsb2Nrc1szXSAgPSBDSF9VTklUX01PTk87CisgICAgICAgIGN0eC0+Y2hhbm5lbF9ibG9ja3NbNF0gID0gQ0hfVU5JVF9NT05POworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCAgID0gQVZfQ0hfTEFZT1VUXzdQT0lOVDE7CisgICAgICAgIGN0eC0+bnVtX2NoYW5uZWxfYmxvY2tzID0gNTsKKyAgICAgICAgY3R4LT5jaGFubmVsX2Jsb2Nrc1swXSAgPSBDSF9VTklUX1NURVJFTzsKKyAgICAgICAgY3R4LT5jaGFubmVsX2Jsb2Nrc1sxXSAgPSBDSF9VTklUX01PTk87CisgICAgICAgIGN0eC0+Y2hhbm5lbF9ibG9ja3NbMl0gID0gQ0hfVU5JVF9TVEVSRU87CisgICAgICAgIGN0eC0+Y2hhbm5lbF9ibG9ja3NbM10gID0gQ0hfVU5JVF9TVEVSRU87CisgICAgICAgIGN0eC0+Y2hhbm5lbF9ibG9ja3NbNF0gID0gQ0hfVU5JVF9NT05POworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBjaGFubmVsIGNvdW50OiAlZCFcbiIsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYXRyYWMzcF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQVRSQUMzUENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIGNoLCByZXQ7CisKKyAgICBpZiAoIWF2Y3R4LT5ibG9ja19hbGlnbikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJsb2NrX2FsaWduIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGZmX2F0cmFjM3BfaW5pdF92bGNzKCk7CisKKyAgICAvKiBpbml0aWFsaXplIElQUUYgKi8KKyAgICBmZl9tZGN0X2luaXQoJmN0eC0+aXBxZl9kY3RfY3R4LCA1LCAxLCAzMi4wIC8gMzI3NjguMCk7CisKKyAgICBmZl9hdHJhYzNwX2luaXRfaW1kY3QoYXZjdHgsICZjdHgtPm1kY3RfY3R4KTsKKworICAgIGZmX2F0cmFjX2luaXRfZ2Fpbl9jb21wZW5zYXRpb24oJmN0eC0+Z2FpbmNfY3R4LCA2LCAyKTsKKworICAgIGZmX2F0cmFjM3BfaW5pdF93YXZlX3N5bnRoKCk7CisKKyAgICBpZiAoKHJldCA9IHNldF9jaGFubmVsX3BhcmFtcyhjdHgsIGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgY3R4LT5teV9jaGFubmVsX2xheW91dCA9IGF2Y3R4LT5jaGFubmVsX2xheW91dDsKKworICAgIGN0eC0+Y2hfdW5pdHMgPSBhdl9tYWxsb2N6X2FycmF5KGN0eC0+bnVtX2NoYW5uZWxfYmxvY2tzLCBzaXplb2YoKmN0eC0+Y2hfdW5pdHMpKTsKKyAgICBjdHgtPmZkc3AgPSBhdnByaXZfZmxvYXRfZHNwX2FsbG9jKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpOworCisgICAgaWYgKCFjdHgtPmNoX3VuaXRzIHx8ICFjdHgtPmZkc3ApIHsKKyAgICAgICAgYXRyYWMzcF9kZWNvZGVfY2xvc2UoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm51bV9jaGFubmVsX2Jsb2NrczsgaSsrKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IDI7IGNoKyspIHsKKyAgICAgICAgICAgIGN0eC0+Y2hfdW5pdHNbaV0uY2hhbm5lbHNbY2hdLmNoX251bSAgICAgICAgICA9IGNoOworICAgICAgICAgICAgY3R4LT5jaF91bml0c1tpXS5jaGFubmVsc1tjaF0ud25kX3NoYXBlICAgICAgID0gJmN0eC0+Y2hfdW5pdHNbaV0uY2hhbm5lbHNbY2hdLnduZF9zaGFwZV9oaXN0WzBdWzBdOworICAgICAgICAgICAgY3R4LT5jaF91bml0c1tpXS5jaGFubmVsc1tjaF0ud25kX3NoYXBlX3ByZXYgID0gJmN0eC0+Y2hfdW5pdHNbaV0uY2hhbm5lbHNbY2hdLnduZF9zaGFwZV9oaXN0WzFdWzBdOworICAgICAgICAgICAgY3R4LT5jaF91bml0c1tpXS5jaGFubmVsc1tjaF0uZ2Fpbl9kYXRhICAgICAgID0gJmN0eC0+Y2hfdW5pdHNbaV0uY2hhbm5lbHNbY2hdLmdhaW5fZGF0YV9oaXN0WzBdWzBdOworICAgICAgICAgICAgY3R4LT5jaF91bml0c1tpXS5jaGFubmVsc1tjaF0uZ2Fpbl9kYXRhX3ByZXYgID0gJmN0eC0+Y2hfdW5pdHNbaV0uY2hhbm5lbHNbY2hdLmdhaW5fZGF0YV9oaXN0WzFdWzBdOworICAgICAgICAgICAgY3R4LT5jaF91bml0c1tpXS5jaGFubmVsc1tjaF0udG9uZXNfaW5mbyAgICAgID0gJmN0eC0+Y2hfdW5pdHNbaV0uY2hhbm5lbHNbY2hdLnRvbmVzX2luZm9faGlzdFswXVswXTsKKyAgICAgICAgICAgIGN0eC0+Y2hfdW5pdHNbaV0uY2hhbm5lbHNbY2hdLnRvbmVzX2luZm9fcHJldiA9ICZjdHgtPmNoX3VuaXRzW2ldLmNoYW5uZWxzW2NoXS50b25lc19pbmZvX2hpc3RbMV1bMF07CisgICAgICAgIH0KKworICAgICAgICBjdHgtPmNoX3VuaXRzW2ldLndhdmVzX2luZm8gICAgICA9ICZjdHgtPmNoX3VuaXRzW2ldLndhdmVfc3ludGhfaGlzdFswXTsKKyAgICAgICAgY3R4LT5jaF91bml0c1tpXS53YXZlc19pbmZvX3ByZXYgPSAmY3R4LT5jaF91bml0c1tpXS53YXZlX3N5bnRoX2hpc3RbMV07CisgICAgfQorCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX0ZMVFA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3Jlc2lkdWFsX3NwZWN0cnVtKEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG91dFsyXVtBVFJBQzNQX0ZSQU1FX1NBTVBMRVNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBpLCBzYiwgY2gsIHF1LCBuc3BlY2xpbmVzLCBSTkdfaW5kZXg7CisgICAgZmxvYXQgKmRzdCwgcTsKKyAgICBpbnQxNl90ICpzcmM7CisgICAgLyogY2FsY3VsYXRlIFJORyB0YWJsZSBpbmRleCBmb3IgZWFjaCBzdWJiYW5kICovCisgICAgaW50IHNiX1JOR19pbmRleFtBVFJBQzNQX1NVQkJBTkRTXSA9IHsgMCB9OworCisgICAgaWYgKGN0eC0+bXV0ZV9mbGFnKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG51bV9jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIG1lbXNldChvdXRbY2hdLCAwLCBBVFJBQzNQX0ZSQU1FX1NBTVBMRVMgKiBzaXplb2YoKm91dFtjaF0pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAocXUgPSAwLCBSTkdfaW5kZXggPSAwOyBxdSA8IGN0eC0+dXNlZF9xdWFudF91bml0czsgcXUrKykKKyAgICAgICAgUk5HX2luZGV4ICs9IGN0eC0+Y2hhbm5lbHNbMF0ucXVfc2ZfaWR4W3F1XSArCisgICAgICAgICAgICAgICAgICAgICBjdHgtPmNoYW5uZWxzWzFdLnF1X3NmX2lkeFtxdV07CisKKyAgICBmb3IgKHNiID0gMDsgc2IgPCBjdHgtPm51bV9jb2RlZF9zdWJiYW5kczsgc2IrKywgUk5HX2luZGV4ICs9IDEyOCkKKyAgICAgICAgc2JfUk5HX2luZGV4W3NiXSA9IFJOR19pbmRleCAmIDB4M0ZDOworCisgICAgLyogaW52ZXJzZSBxdWFudCBhbmQgcG93ZXIgY29tcGVuc2F0aW9uICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgbnVtX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIC8qIGNsZWFyIGNoYW5uZWwncyByZXNpZHVhbCBzcGVjdHJ1bSAqLworICAgICAgICBtZW1zZXQob3V0W2NoXSwgMCwgQVRSQUMzUF9GUkFNRV9TQU1QTEVTICogc2l6ZW9mKCpvdXRbY2hdKSk7CisKKyAgICAgICAgZm9yIChxdSA9IDA7IHF1IDwgY3R4LT51c2VkX3F1YW50X3VuaXRzOyBxdSsrKSB7CisgICAgICAgICAgICBzcmMgICAgICAgID0gJmN0eC0+Y2hhbm5lbHNbY2hdLnNwZWN0cnVtW2ZmX2F0cmFjM3BfcXVfdG9fc3BlY19wb3NbcXVdXTsKKyAgICAgICAgICAgIGRzdCAgICAgICAgPSAmb3V0W2NoXVtmZl9hdHJhYzNwX3F1X3RvX3NwZWNfcG9zW3F1XV07CisgICAgICAgICAgICBuc3BlY2xpbmVzID0gZmZfYXRyYWMzcF9xdV90b19zcGVjX3Bvc1txdSArIDFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBmZl9hdHJhYzNwX3F1X3RvX3NwZWNfcG9zW3F1XTsKKworICAgICAgICAgICAgaWYgKGN0eC0+Y2hhbm5lbHNbY2hdLnF1X3dvcmRsZW5bcXVdID4gMCkgeworICAgICAgICAgICAgICAgIHEgPSBmZl9hdHJhYzNwX3NmX3RhYltjdHgtPmNoYW5uZWxzW2NoXS5xdV9zZl9pZHhbcXVdXSAqCisgICAgICAgICAgICAgICAgICAgIGZmX2F0cmFjM3BfbWFudF90YWJbY3R4LT5jaGFubmVsc1tjaF0ucXVfd29yZGxlbltxdV1dOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuc3BlY2xpbmVzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IHNyY1tpXSAqIHE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBjdHgtPm51bV9jb2RlZF9zdWJiYW5kczsgc2IrKykKKyAgICAgICAgICAgIGZmX2F0cmFjM3BfcG93ZXJfY29tcGVuc2F0aW9uKGN0eCwgY2gsICZvdXRbY2hdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JfUk5HX2luZGV4W3NiXSwgc2IpOworICAgIH0KKworICAgIGlmIChjdHgtPnVuaXRfdHlwZSA9PSBDSF9VTklUX1NURVJFTykgeworICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBjdHgtPm51bV9jb2RlZF9zdWJiYW5kczsgc2IrKykgeworICAgICAgICAgICAgaWYgKGN0eC0+c3dhcF9jaGFubmVsc1tzYl0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVRSQUMzUF9TVUJCQU5EX1NBTVBMRVM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgRkZTV0FQKGZsb2F0LCBvdXRbMF1bc2IgKiBBVFJBQzNQX1NVQkJBTkRfU0FNUExFUyArIGldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFsxXVtzYiAqIEFUUkFDM1BfU1VCQkFORF9TQU1QTEVTICsgaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBmbGlwIGNvZWZmaWNpZW50cycgc2lnbiBpZiByZXF1ZXN0ZWQgKi8KKyAgICAgICAgICAgIGlmIChjdHgtPm5lZ2F0ZV9jb2VmZnNbc2JdKQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBVFJBQzNQX1NVQkJBTkRfU0FNUExFUzsgaSsrKQorICAgICAgICAgICAgICAgICAgICBvdXRbMV1bc2IgKiBBVFJBQzNQX1NVQkJBTkRfU0FNUExFUyArIGldID0gLShvdXRbMV1bc2IgKiBBVFJBQzNQX1NVQkJBTkRfU0FNUExFUyArIGldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVjb25zdHJ1Y3RfZnJhbWUoQVRSQUMzUENvbnRleHQgKmN0eCwgQXRyYWMzcENoYW5Vbml0Q3R4ICpjaF91bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jaGFubmVscywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBjaCwgc2I7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBudW1fY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY2hfdW5pdC0+bnVtX3N1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICAvKiBpbnZlcnNlIHRyYW5zZm9ybSBhbmQgd2luZG93aW5nICovCisgICAgICAgICAgICBmZl9hdHJhYzNwX2ltZGN0KGN0eC0+ZmRzcCwgJmN0eC0+bWRjdF9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnNhbXBsZXNbY2hdW3NiICogQVRSQUMzUF9TVUJCQU5EX1NBTVBMRVNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5tZGN0X2J1ZltjaF1bc2IgKiBBVFJBQzNQX1NVQkJBTkRfU0FNUExFU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaF91bml0LT5jaGFubmVsc1tjaF0ud25kX3NoYXBlX3ByZXZbc2JdIDw8IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hfdW5pdC0+Y2hhbm5lbHNbY2hdLnduZF9zaGFwZVtzYl0sIHNiKTsKKworICAgICAgICAgICAgLyogZ2FpbiBjb21wZW5zYXRpb24gYW5kIG92ZXJsYXBwaW5nICovCisgICAgICAgICAgICBmZl9hdHJhY19nYWluX2NvbXBlbnNhdGlvbigmY3R4LT5nYWluY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5tZGN0X2J1ZltjaF1bc2IgKiBBVFJBQzNQX1NVQkJBTkRfU0FNUExFU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hfdW5pdC0+cHJldl9idWZbY2hdW3NiICogQVRSQUMzUF9TVUJCQU5EX1NBTVBMRVNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoX3VuaXQtPmNoYW5uZWxzW2NoXS5nYWluX2RhdGFfcHJldltzYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hfdW5pdC0+Y2hhbm5lbHNbY2hdLmdhaW5fZGF0YVtzYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFJBQzNQX1NVQkJBTkRfU0FNUExFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnRpbWVfYnVmW2NoXVtzYiAqIEFUUkFDM1BfU1VCQkFORF9TQU1QTEVTXSk7CisgICAgICAgIH0KKworICAgICAgICAvKiB6ZXJvIHVudXNlZCBzdWJiYW5kcyBpbiBib3RoIG91dHB1dCBhbmQgb3ZlcmxhcHBpbmcgYnVmZmVycyAqLworICAgICAgICBtZW1zZXQoJmNoX3VuaXQtPnByZXZfYnVmW2NoXVtjaF91bml0LT5udW1fc3ViYmFuZHMgKiBBVFJBQzNQX1NVQkJBTkRfU0FNUExFU10sCisgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgKEFUUkFDM1BfU1VCQkFORFMgLSBjaF91bml0LT5udW1fc3ViYmFuZHMpICoKKyAgICAgICAgICAgICAgIEFUUkFDM1BfU1VCQkFORF9TQU1QTEVTICoKKyAgICAgICAgICAgICAgIHNpemVvZihjaF91bml0LT5wcmV2X2J1ZltjaF1bY2hfdW5pdC0+bnVtX3N1YmJhbmRzICogQVRSQUMzUF9TVUJCQU5EX1NBTVBMRVNdKSk7CisgICAgICAgIG1lbXNldCgmY3R4LT50aW1lX2J1ZltjaF1bY2hfdW5pdC0+bnVtX3N1YmJhbmRzICogQVRSQUMzUF9TVUJCQU5EX1NBTVBMRVNdLAorICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgIChBVFJBQzNQX1NVQkJBTkRTIC0gY2hfdW5pdC0+bnVtX3N1YmJhbmRzKSAqCisgICAgICAgICAgICAgICBBVFJBQzNQX1NVQkJBTkRfU0FNUExFUyAqCisgICAgICAgICAgICAgICBzaXplb2YoY3R4LT50aW1lX2J1ZltjaF1bY2hfdW5pdC0+bnVtX3N1YmJhbmRzICogQVRSQUMzUF9TVUJCQU5EX1NBTVBMRVNdKSk7CisKKyAgICAgICAgLyogcmVzeW50aGVzaXplIGFuZCBhZGQgdG9uYWwgc2lnbmFsICovCisgICAgICAgIGlmIChjaF91bml0LT53YXZlc19pbmZvLT50b25lc19wcmVzZW50IHx8CisgICAgICAgICAgICBjaF91bml0LT53YXZlc19pbmZvX3ByZXYtPnRvbmVzX3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGNoX3VuaXQtPm51bV9zdWJiYW5kczsgc2IrKykKKyAgICAgICAgICAgICAgICBpZiAoY2hfdW5pdC0+Y2hhbm5lbHNbY2hdLnRvbmVzX2luZm9bc2JdLm51bV93YXZzIHx8CisgICAgICAgICAgICAgICAgICAgIGNoX3VuaXQtPmNoYW5uZWxzW2NoXS50b25lc19pbmZvX3ByZXZbc2JdLm51bV93YXZzKSB7CisgICAgICAgICAgICAgICAgICAgIGZmX2F0cmFjM3BfZ2VuZXJhdGVfdG9uZXMoY2hfdW5pdCwgY3R4LT5mZHNwLCBjaCwgc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+dGltZV9idWZbY2hdW3NiICogMTI4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogc3ViYmFuZCBzeW50aGVzaXMgYW5kIGFjb3VzdGljIHNpZ25hbCBvdXRwdXQgKi8KKyAgICAgICAgZmZfYXRyYWMzcF9pcHFmKCZjdHgtPmlwcWZfZGN0X2N0eCwgJmNoX3VuaXQtPmlwcWZfY3R4W2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnRpbWVfYnVmW2NoXVswXSwgJmN0eC0+b3V0cF9idWZbY2hdWzBdKTsKKyAgICB9CisKKyAgICAvKiBzd2FwIHdpbmRvdyBzaGFwZSBhbmQgZ2FpbiBjb250cm9sIGJ1ZmZlcnMuICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgbnVtX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIEZGU1dBUCh1aW50OF90ICosIGNoX3VuaXQtPmNoYW5uZWxzW2NoXS53bmRfc2hhcGUsCisgICAgICAgICAgICAgICBjaF91bml0LT5jaGFubmVsc1tjaF0ud25kX3NoYXBlX3ByZXYpOworICAgICAgICBGRlNXQVAoQXRyYWNHYWluSW5mbyAqLCBjaF91bml0LT5jaGFubmVsc1tjaF0uZ2Fpbl9kYXRhLAorICAgICAgICAgICAgICAgY2hfdW5pdC0+Y2hhbm5lbHNbY2hdLmdhaW5fZGF0YV9wcmV2KTsKKyAgICAgICAgRkZTV0FQKEF0cmFjM3BXYXZlc0RhdGEgKiwgY2hfdW5pdC0+Y2hhbm5lbHNbY2hdLnRvbmVzX2luZm8sCisgICAgICAgICAgICAgICBjaF91bml0LT5jaGFubmVsc1tjaF0udG9uZXNfaW5mb19wcmV2KTsKKyAgICB9CisKKyAgICBGRlNXQVAoQXRyYWMzcFdhdmVTeW50aFBhcmFtcyAqLCBjaF91bml0LT53YXZlc19pbmZvLCBjaF91bml0LT53YXZlc19pbmZvX3ByZXYpOworfQorCitzdGF0aWMgaW50IGF0cmFjM3BfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVRSQUMzUENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgICA9IGRhdGE7CisgICAgaW50IGksIHJldCwgY2hfdW5pdF9pZCwgY2hfYmxvY2sgPSAwLCBvdXRfY2hfaW5kZXggPSAwLCBjaGFubmVsc190b19wcm9jZXNzOworICAgIGZsb2F0ICoqc2FtcGxlc19wID0gKGZsb2F0ICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhOworCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBBVFJBQzNQX0ZSQU1FX1NBTVBMRVM7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImdldF9idWZmZXIoKSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmN0eC0+Z2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChnZXRfYml0czEoJmN0eC0+Z2IpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzdGFydCBiaXQhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgd2hpbGUgKGdldF9iaXRzX2xlZnQoJmN0eC0+Z2IpID49IDIgJiYKKyAgICAgICAgICAgKGNoX3VuaXRfaWQgPSBnZXRfYml0cygmY3R4LT5nYiwgMikpICE9IENIX1VOSVRfVEVSTUlOQVRPUikgeworICAgICAgICBpZiAoY2hfdW5pdF9pZCA9PSBDSF9VTklUX0VYVEVOU0lPTikgeworICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJDaGFubmVsIHVuaXQgZXh0ZW5zaW9uIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoX2Jsb2NrID49IGN0eC0+bnVtX2NoYW5uZWxfYmxvY2tzIHx8CisgICAgICAgICAgICBjdHgtPmNoYW5uZWxfYmxvY2tzW2NoX2Jsb2NrXSAhPSBjaF91bml0X2lkKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRnJhbWUgZGF0YSBkb2Vzbid0IG1hdGNoIGNoYW5uZWwgY29uZmlndXJhdGlvbiFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPmNoX3VuaXRzW2NoX2Jsb2NrXS51bml0X3R5cGUgPSBjaF91bml0X2lkOworICAgICAgICBjaGFubmVsc190b19wcm9jZXNzICAgICAgICAgICAgICAgPSBjaF91bml0X2lkICsgMTsKKworICAgICAgICBpZiAoKHJldCA9IGZmX2F0cmFjM3BfZGVjb2RlX2NoYW5uZWxfdW5pdCgmY3R4LT5nYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+Y2hfdW5pdHNbY2hfYmxvY2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsc190b19wcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgZGVjb2RlX3Jlc2lkdWFsX3NwZWN0cnVtKCZjdHgtPmNoX3VuaXRzW2NoX2Jsb2NrXSwgY3R4LT5zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNfdG9fcHJvY2VzcywgYXZjdHgpOworICAgICAgICByZWNvbnN0cnVjdF9mcmFtZShjdHgsICZjdHgtPmNoX3VuaXRzW2NoX2Jsb2NrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNfdG9fcHJvY2VzcywgYXZjdHgpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsc190b19wcm9jZXNzOyBpKyspCisgICAgICAgICAgICBtZW1jcHkoc2FtcGxlc19wW291dF9jaF9pbmRleCArIGldLCBjdHgtPm91dHBfYnVmW2ldLAorICAgICAgICAgICAgICAgICAgIEFUUkFDM1BfRlJBTUVfU0FNUExFUyAqIHNpemVvZigqKnNhbXBsZXNfcCkpOworCisgICAgICAgIGNoX2Jsb2NrKys7CisgICAgICAgIG91dF9jaF9pbmRleCArPSBjaGFubmVsc190b19wcm9jZXNzOworICAgIH0KKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBhdmN0eC0+YmxvY2tfYWxpZ247Cit9CisKK0FWQ29kZWMgZmZfYXRyYWMzcF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhdHJhYzNwbHVzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVRSQUMzKyAoQWRhcHRpdmUgVFJhbnNmb3JtIEFjb3VzdGljIENvZGluZyAzKykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQVRSQUMzUCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVRSQUMzUENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGF0cmFjM3BfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gYXRyYWMzcF9kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gYXRyYWMzcF9kZWNvZGVfZnJhbWUsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMzcGx1c2RzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXRyYWMzcGx1c2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MjJhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdHJhYzNwbHVzZHNwLmMKQEAgLTAsMCArMSw2MzggQEAKKy8qCisgKiBBVFJBQzMrIGNvbXBhdGlibGUgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEzIE1heGltIFBvbGlha292c2tpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogIEBmaWxlCisgKiAgRFNQIGZ1bmN0aW9ucyBmb3IgQVRSQUMzKyBkZWNvZGVyLgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInNpbmV3aW4uaCIKKyNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJhdHJhYzNwbHVzLmgiCisKKy8qKgorICogIE1hcCBxdWFudCB1bml0IG51bWJlciB0byBpdHMgcG9zaXRpb24gaW4gdGhlIHNwZWN0cnVtLgorICogIFRvIGdldCB0aGUgbnVtYmVyIG9mIHNwZWN0cmFsIGxpbmVzIGluIGVhY2ggcXVhbnQgdW5pdCBkbyB0aGUgZm9sbG93aW5nOgorICogIG51bV9zcGVjcyA9IHF1X3RvX3NwZWNfcG9zW2krMV0gLSBxdV90b19zcGVjX3Bvc1tpXQorICovCitjb25zdCB1aW50MTZfdCBmZl9hdHJhYzNwX3F1X3RvX3NwZWNfcG9zWzMzXSA9IHsKKyAgICAgIDAsICAgIDE2LCAgIDMyLCAgIDQ4LCAgIDY0LCAgIDgwLCAgIDk2LCAgMTEyLAorICAgIDEyOCwgICAxNjAsICAxOTIsICAyMjQsICAyNTYsICAyODgsICAzMjAsICAzNTIsCisgICAgMzg0LCAgIDQ0OCwgIDUxMiwgIDU3NiwgIDY0MCwgIDcwNCwgIDc2OCwgIDg5NiwKKyAgICAxMDI0LCAxMTUyLCAxMjgwLCAxNDA4LCAxNTM2LCAxNjY0LCAxNzkyLCAxOTIwLAorICAgIDIwNDgKK307CisKKy8qIFNjYWxlZmFjdG9ycyB0YWJsZS4gKi8KKy8qIEFwcHJveC4gRXF1OiBwb3coMi4wLCAoaSAtIDE2LjAgKyAwLjUwMTc4Mzk0OCkgLyAzLjApICovCitjb25zdCBmbG9hdCBmZl9hdHJhYzNwX3NmX3RhYls2NF0gPSB7CisgICAgMC4wMjc4NTIwNTgsICAwLjAzNTA5MTQsIDAuMDQ0MjEyMzQxLCAwLjA1NTcwNDExNywgIDAuMDcwMTgyOCwKKyAgICAwLjA4ODQyNDY4MywgMC4xMTE0MDgyMywgICAwLjE0MDM2NTYsICAwLjE3Njg0OTM3LCAwLjIyMjgxNjQ3LCAwLjI4MDczMTIsIDAuMzUzNjk4NzMsCisgICAgMC40NDU2MzI5MywgICAwLjU2MTQ2MjQsICAwLjcwNzM5NzQ2LCAgMC44OTEyNjU4NywgIDEuMTIyOTI0OCwgMS40MTQ3OTQ5LCAgMS43ODI1MzE3LAorICAgIDIuMjQ1ODQ5NiwgICAgMi44Mjk1ODk4LCAgIDMuNTY1MDYzNSwgICA0LjQ5MTY5OTIsICA1LjY1OTE3OTcsICA3LjEzMDEyNywgIDguOTgzMzk4NCwKKyAgICAxMS4zMTgzNTksICAgIDE0LjI2MDI1NCwgICAxNy45NjY3OTcsICAgMjIuNjM2NzE5LCAgMjguNTIwNTA4LCAzNS45MzM1OTQsICA0NS4yNzM0MzgsCisgICAgNTcuMDQxMDE2LCAgICA3MS44NjcxODgsICAgOTAuNTQ2ODc1LCAgIDExNC4wODIwMywgIDE0My43MzQzOCwgMTgxLjA5Mzc1LCAgMjI4LjE2NDA2LAorICAgIDI4Ny40Njg3NSwgICAgIDM2Mi4xODc1LCAgIDQ1Ni4zMjgxMiwgICAgNTc0LjkzNzUsICAgIDcyNC4zNzUsIDkxMi42NTYyNSwgICAxMTQ5Ljg3NSwKKyAgICAxNDQ4Ljc1LCAgICAgIDE4MjUuMzEyNSwgICAgIDIyOTkuNzUsICAgICAgMjg5Ny41LCAgIDM2NTAuNjI1LCAgICA0NTk5LjUsICAgICA1Nzk1LjAsCisgICAgNzMwMS4yNSwgICAgICAgICA5MTk5LjAsICAgICAxMTU5MC4wLCAgICAgMTQ2MDIuNSwgICAgMTgzOTguMCwgICAyMzE4MC4wLCAgICAyOTIwNS4wLAorICAgIDM2Nzk2LjAsICAgICAgICA0NjM2MC4wLCAgICAgNTg0MTAuMAorfTsKKworLyogTWFudGlzc2EgdGFibGUuICovCisvKiBwb3coMTAsIHggKiBsb2cxMCgyKSArIDAuMDUpIC8gMiAvIChbMSwyLDMsNSw3LDE1LDMxXSArIDAuNSkgKi8KK2NvbnN0IGZsb2F0IGZmX2F0cmFjM3BfbWFudF90YWJbOF0gPSB7CisgICAgMC4wLAorICAgIDAuNzQ4MDE2MzYsCisgICAgMC40NDg4MjIwMiwKKyAgICAwLjMyMDU4NzE2LAorICAgIDAuMjA0MDAyMzgsCisgICAgMC4xNDk2MDQ4LAorICAgIDAuMDcyMzkxNTEsCisgICAgMC4wMzU2MTk3MzYKK307CisKKyNkZWZpbmUgQVRSQUMzUF9NRENUX1NJWkUgKEFUUkFDM1BfU1VCQkFORF9TQU1QTEVTICogMikKKworYXZfY29sZCB2b2lkIGZmX2F0cmFjM3BfaW5pdF9pbWRjdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEZGVENvbnRleHQgKm1kY3RfY3R4KQoreworICAgIGZmX2luaXRfZmZfc2luZV93aW5kb3dzKDcpOworICAgIGZmX2luaXRfZmZfc2luZV93aW5kb3dzKDYpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgTURDVCB0cmFuc2Zvcm0uICovCisgICAgZmZfbWRjdF9pbml0KG1kY3RfY3R4LCA4LCAxLCAtMS4wKTsKK30KKworI2RlZmluZSBUV09QSSAoMiAqIE1fUEkpCisKKyNkZWZpbmUgREVRVUFOVF9QSEFTRShwaCkgKCgocGgpICYgMHgxRikgPDwgNikKKworc3RhdGljIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHNpbmVfdGFibGUpWzIwNDhdOyAvLy88IHdhdmUgdGFibGUKK3N0YXRpYyBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBoYW5uX3dpbmRvdylbMjU2XTsgLy8vPCBIYW5uIHdpbmRvd2luZyBmdW5jdGlvbgorc3RhdGljIGZsb2F0IGFtcF9zZl90YWJbNjRdOyAgIC8vLzwgc2NhbGVmYWN0b3JzIGZvciBxdWFudGl6ZWQgYW1wbGl0dWRlcworCithdl9jb2xkIHZvaWQgZmZfYXRyYWMzcF9pbml0X3dhdmVfc3ludGgodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIGdlbmVyYXRlIHNpbmUgd2F2ZSB0YWJsZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyMDQ4OyBpKyspCisgICAgICAgIHNpbmVfdGFibGVbaV0gPSBzaW4oVFdPUEkgKiBpIC8gMjA0OCk7CisKKyAgICAvKiBnZW5lcmF0ZSBIYW5uIHdpbmRvdyAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgaGFubl93aW5kb3dbaV0gPSAoMS4wZiAtIGNvcyhUV09QSSAqIGkgLyAyNTYuMGYpKSAqIDAuNWY7CisKKyAgICAvKiBnZW5lcmF0ZSBhbXBsaXR1ZGUgc2NhbGVmYWN0b3JzIHRhYmxlICovCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgIGFtcF9zZl90YWJbaV0gPSBwb3coMi4wZiwgKChkb3VibGUpaSAtIDMpIC8gNC4wZik7Cit9CisKKy8qKgorICogIFN5bnRoZXNpemUgc2luZSB3YXZlcyBhY2NvcmRpbmcgdG8gZ2l2ZW4gcGFyYW1ldGVycy4KKyAqCisgKiAgQHBhcmFtW2luXSAgICBzeW50aF9wYXJhbSAgIHB0ciB0byBjb21tb24gc3ludGhlc2lzIHBhcmFtZXRlcnMKKyAqICBAcGFyYW1baW5dICAgIHdhdmVzX2luZm8gICAgcGFyYW1ldGVycyBmb3IgZWFjaCBzaW5lIHdhdmUKKyAqICBAcGFyYW1baW5dICAgIGVudmVsb3BlICAgICAgZW52ZWxvcGUgZGF0YSBmb3IgYWxsIHdhdmVzIGluIGEgZ3JvdXAKKyAqICBAcGFyYW1baW5dICAgIHBoYXNlX3NoaWZ0ICAgZmxhZyBpbmRpY2F0ZXMgMTgwwrAgcGhhc2Ugc2hpZnQKKyAqICBAcGFyYW1baW5dICAgIHJlZ19vZmZzZXQgICAgcmVnaW9uIG9mZnNldCBmb3IgdHJpbW1pbmcgZW52ZWxvcGUgZGF0YQorICogIEBwYXJhbVtvdXRdICAgb3V0ICAgICAgICAgICByZWNlaXZlcyBzeXRoZXNpemVkIGRhdGEKKyAqLworc3RhdGljIHZvaWQgd2F2ZXNfc3ludGgoQXRyYWMzcFdhdmVTeW50aFBhcmFtcyAqc3ludGhfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBBdHJhYzNwV2F2ZXNEYXRhICp3YXZlc19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgQXRyYWMzcFdhdmVFbnZlbG9wZSAqZW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGhhc2Vfc2hpZnQsIGludCByZWdfb2Zmc2V0LCBmbG9hdCAqb3V0KQoreworICAgIGludCBpLCB3biwgaW5jLCBwb3M7CisgICAgZG91YmxlIGFtcDsKKyAgICBBdHJhYzNwV2F2ZVBhcmFtICp3YXZlX3BhcmFtID0gJnN5bnRoX3BhcmFtLT53YXZlc1t3YXZlc19pbmZvLT5zdGFydF9pbmRleF07CisKKyAgICBmb3IgKHduID0gMDsgd24gPCB3YXZlc19pbmZvLT5udW1fd2F2czsgd24rKywgd2F2ZV9wYXJhbSsrKSB7CisgICAgICAgIC8qIGFtcGxpdHVkZSBkZXF1YW50aXphdGlvbiAqLworICAgICAgICBhbXAgPSBhbXBfc2ZfdGFiW3dhdmVfcGFyYW0tPmFtcF9zZl0gKgorICAgICAgICAgICAgICAoIXN5bnRoX3BhcmFtLT5hbXBsaXR1ZGVfbW9kZQorICAgICAgICAgICAgICAgPyAod2F2ZV9wYXJhbS0+YW1wX2luZGV4ICsgMSkgLyAxNS4xM2YKKyAgICAgICAgICAgICAgIDogMS4wZik7CisKKyAgICAgICAgaW5jID0gd2F2ZV9wYXJhbS0+ZnJlcV9pbmRleDsKKyAgICAgICAgcG9zID0gREVRVUFOVF9QSEFTRSh3YXZlX3BhcmFtLT5waGFzZV9pbmRleCkgLSAocmVnX29mZnNldCBeIDEyOCkgKiBpbmMgJiAyMDQ3OworCisgICAgICAgIC8qIHdhdmVmb3JtIGdlbmVyYXRpb24gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgICAgICBvdXRbaV0gKz0gc2luZV90YWJsZVtwb3NdICogYW1wOworICAgICAgICAgICAgcG9zICAgICA9IChwb3MgKyBpbmMpICYgMjA0NzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGZhZGUgaW4gd2l0aCBzdGVlcCBIYW5uIHdpbmRvdyBpZiByZXF1ZXN0ZWQgKi8KKyAgICBpZiAoZW52ZWxvcGUtPmhhc19zdGFydF9wb2ludCkgeworICAgICAgICBwb3MgPSAoZW52ZWxvcGUtPnN0YXJ0X3BvcyA8PCAyKSAtIHJlZ19vZmZzZXQ7CisgICAgICAgIGlmIChwb3MgPiAwICYmIHBvcyA8PSAxMjgpIHsKKyAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIHBvcyAqIHNpemVvZigqb3V0KSk7CisgICAgICAgICAgICBpZiAoIWVudmVsb3BlLT5oYXNfc3RvcF9wb2ludCB8fAorICAgICAgICAgICAgICAgIGVudmVsb3BlLT5zdGFydF9wb3MgIT0gZW52ZWxvcGUtPnN0b3BfcG9zKSB7CisgICAgICAgICAgICAgICAgb3V0W3BvcyArIDBdICo9IGhhbm5fd2luZG93WzBdOworICAgICAgICAgICAgICAgIG91dFtwb3MgKyAxXSAqPSBoYW5uX3dpbmRvd1szMl07CisgICAgICAgICAgICAgICAgb3V0W3BvcyArIDJdICo9IGhhbm5fd2luZG93WzY0XTsKKyAgICAgICAgICAgICAgICBvdXRbcG9zICsgM10gKj0gaGFubl93aW5kb3dbOTZdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogZmFkZSBvdXQgd2l0aCBzdGVlcCBIYW5uIHdpbmRvdyBpZiByZXF1ZXN0ZWQgKi8KKyAgICBpZiAoZW52ZWxvcGUtPmhhc19zdG9wX3BvaW50KSB7CisgICAgICAgIHBvcyA9IChlbnZlbG9wZS0+c3RvcF9wb3MgKyAxIDw8IDIpIC0gcmVnX29mZnNldDsKKyAgICAgICAgaWYgKHBvcyA+IDAgJiYgcG9zIDw9IDEyOCkgeworICAgICAgICAgICAgb3V0W3BvcyAtIDRdICo9IGhhbm5fd2luZG93Wzk2XTsKKyAgICAgICAgICAgIG91dFtwb3MgLSAzXSAqPSBoYW5uX3dpbmRvd1s2NF07CisgICAgICAgICAgICBvdXRbcG9zIC0gMl0gKj0gaGFubl93aW5kb3dbMzJdOworICAgICAgICAgICAgb3V0W3BvcyAtIDFdICo9IGhhbm5fd2luZG93WzBdOworICAgICAgICAgICAgbWVtc2V0KCZvdXRbcG9zXSwgMCwgKDEyOCAtIHBvcykgKiBzaXplb2Yob3V0W3Bvc10pKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl9hdHJhYzNwX2dlbmVyYXRlX3RvbmVzKEF0cmFjM3BDaGFuVW5pdEN0eCAqY2hfdW5pdCwgQVZGbG9hdERTUENvbnRleHQgKmZkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoX251bSwgaW50IHNiLCBmbG9hdCAqb3V0KQoreworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHdhdnJlZzEpWzEyOF0gPSB7IDAgfTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCB3YXZyZWcyKVsxMjhdID0geyAwIH07CisgICAgaW50IGksIHJlZzFfZW52X25vbnplcm8sIHJlZzJfZW52X25vbnplcm87CisgICAgQXRyYWMzcFdhdmVzRGF0YSAqdG9uZXNfbm93ICA9ICZjaF91bml0LT5jaGFubmVsc1tjaF9udW1dLnRvbmVzX2luZm9fcHJldltzYl07CisgICAgQXRyYWMzcFdhdmVzRGF0YSAqdG9uZXNfbmV4dCA9ICZjaF91bml0LT5jaGFubmVsc1tjaF9udW1dLnRvbmVzX2luZm9bc2JdOworCisgICAgLyogcmVjb25zdHJ1Y3QgZnVsbCBlbnZlbG9wZXMgZm9yIGJvdGggb3ZlcmxhcHBpbmcgcmVnaW9ucworICAgICAqIGZyb20gdHJ1bmNhdGVkIGJpdHN0cmVhbSBkYXRhICovCisgICAgaWYgKHRvbmVzX25leHQtPnBlbmRfZW52Lmhhc19zdGFydF9wb2ludCAmJgorICAgICAgICB0b25lc19uZXh0LT5wZW5kX2Vudi5zdGFydF9wb3MgPCB0b25lc19uZXh0LT5wZW5kX2Vudi5zdG9wX3BvcykgeworICAgICAgICB0b25lc19uZXh0LT5jdXJyX2Vudi5oYXNfc3RhcnRfcG9pbnQgPSAxOworICAgICAgICB0b25lc19uZXh0LT5jdXJyX2Vudi5zdGFydF9wb3MgICAgICAgPSB0b25lc19uZXh0LT5wZW5kX2Vudi5zdGFydF9wb3MgKyAzMjsKKyAgICB9IGVsc2UgaWYgKHRvbmVzX25vdy0+cGVuZF9lbnYuaGFzX3N0YXJ0X3BvaW50KSB7CisgICAgICAgIHRvbmVzX25leHQtPmN1cnJfZW52Lmhhc19zdGFydF9wb2ludCA9IDE7CisgICAgICAgIHRvbmVzX25leHQtPmN1cnJfZW52LnN0YXJ0X3BvcyAgICAgICA9IHRvbmVzX25vdy0+cGVuZF9lbnYuc3RhcnRfcG9zOworICAgIH0gZWxzZSB7CisgICAgICAgIHRvbmVzX25leHQtPmN1cnJfZW52Lmhhc19zdGFydF9wb2ludCA9IDA7CisgICAgICAgIHRvbmVzX25leHQtPmN1cnJfZW52LnN0YXJ0X3BvcyAgICAgICA9IDA7CisgICAgfQorCisgICAgaWYgKHRvbmVzX25vdy0+cGVuZF9lbnYuaGFzX3N0b3BfcG9pbnQgJiYKKyAgICAgICAgdG9uZXNfbm93LT5wZW5kX2Vudi5zdG9wX3BvcyA+PSB0b25lc19uZXh0LT5jdXJyX2Vudi5zdGFydF9wb3MpIHsKKyAgICAgICAgdG9uZXNfbmV4dC0+Y3Vycl9lbnYuaGFzX3N0b3BfcG9pbnQgPSAxOworICAgICAgICB0b25lc19uZXh0LT5jdXJyX2Vudi5zdG9wX3BvcyAgICAgICA9IHRvbmVzX25vdy0+cGVuZF9lbnYuc3RvcF9wb3M7CisgICAgfSBlbHNlIGlmICh0b25lc19uZXh0LT5wZW5kX2Vudi5oYXNfc3RvcF9wb2ludCkgeworICAgICAgICB0b25lc19uZXh0LT5jdXJyX2Vudi5oYXNfc3RvcF9wb2ludCA9IDE7CisgICAgICAgIHRvbmVzX25leHQtPmN1cnJfZW52LnN0b3BfcG9zICAgICAgID0gdG9uZXNfbmV4dC0+cGVuZF9lbnYuc3RvcF9wb3MgKyAzMjsKKyAgICB9IGVsc2UgeworICAgICAgICB0b25lc19uZXh0LT5jdXJyX2Vudi5oYXNfc3RvcF9wb2ludCA9IDA7CisgICAgICAgIHRvbmVzX25leHQtPmN1cnJfZW52LnN0b3BfcG9zICAgICAgID0gNjQ7CisgICAgfQorCisgICAgLyogaXMgdGhlIHZpc2libGUgcGFydCBvZiB0aGUgZW52ZWxvcGUgbm9uLXplcm8/ICovCisgICAgcmVnMV9lbnZfbm9uemVybyA9ICh0b25lc19ub3ctPmN1cnJfZW52LnN0b3BfcG9zICAgIDwgMzIpID8gMCA6IDE7CisgICAgcmVnMl9lbnZfbm9uemVybyA9ICh0b25lc19uZXh0LT5jdXJyX2Vudi5zdGFydF9wb3MgPj0gMzIpID8gMCA6IDE7CisKKyAgICAvKiBzeW50aGVzaXplIHdhdmVzIGZvciBib3RoIG92ZXJsYXBwaW5nIHJlZ2lvbnMgKi8KKyAgICBpZiAodG9uZXNfbm93LT5udW1fd2F2cyAmJiByZWcxX2Vudl9ub256ZXJvKQorICAgICAgICB3YXZlc19zeW50aChjaF91bml0LT53YXZlc19pbmZvX3ByZXYsIHRvbmVzX25vdywgJnRvbmVzX25vdy0+Y3Vycl9lbnYsCisgICAgICAgICAgICAgICAgICAgIGNoX3VuaXQtPndhdmVzX2luZm9fcHJldi0+cGhhc2Vfc2hpZnRbc2JdICYgY2hfbnVtLAorICAgICAgICAgICAgICAgICAgICAxMjgsIHdhdnJlZzEpOworCisgICAgaWYgKHRvbmVzX25leHQtPm51bV93YXZzICYmIHJlZzJfZW52X25vbnplcm8pCisgICAgICAgIHdhdmVzX3N5bnRoKGNoX3VuaXQtPndhdmVzX2luZm8sIHRvbmVzX25leHQsICZ0b25lc19uZXh0LT5jdXJyX2VudiwKKyAgICAgICAgICAgICAgICAgICAgY2hfdW5pdC0+d2F2ZXNfaW5mby0+cGhhc2Vfc2hpZnRbc2JdICYgY2hfbnVtLCAwLCB3YXZyZWcyKTsKKworICAgIC8qIEhhbm4gd2luZG93aW5nIGZvciBub24tZmFkZWQgd2F2ZSBzaWduYWxzICovCisgICAgaWYgKHRvbmVzX25vdy0+bnVtX3dhdnMgJiYgdG9uZXNfbmV4dC0+bnVtX3dhdnMgJiYKKyAgICAgICAgcmVnMV9lbnZfbm9uemVybyAmJiByZWcyX2Vudl9ub256ZXJvKSB7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsKHdhdnJlZzEsIHdhdnJlZzEsICZoYW5uX3dpbmRvd1sxMjhdLCAxMjgpOworICAgICAgICBmZHNwLT52ZWN0b3JfZm11bCh3YXZyZWcyLCB3YXZyZWcyLCAgaGFubl93aW5kb3csICAgICAgMTI4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodG9uZXNfbm93LT5udW1fd2F2cyAmJiAhdG9uZXNfbm93LT5jdXJyX2Vudi5oYXNfc3RvcF9wb2ludCkKKyAgICAgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsKHdhdnJlZzEsIHdhdnJlZzEsICZoYW5uX3dpbmRvd1sxMjhdLCAxMjgpOworCisgICAgICAgIGlmICh0b25lc19uZXh0LT5udW1fd2F2cyAmJiAhdG9uZXNfbmV4dC0+Y3Vycl9lbnYuaGFzX3N0YXJ0X3BvaW50KQorICAgICAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWwod2F2cmVnMiwgd2F2cmVnMiwgaGFubl93aW5kb3csIDEyOCk7CisgICAgfQorCisgICAgLyogT3ZlcmxhcCBhbmQgYWRkIHRvIHJlc2lkdWFsICovCisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgICAgICBvdXRbaV0gKz0gd2F2cmVnMVtpXSArIHdhdnJlZzJbaV07Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgc3ViYmFuZF90b19wb3dncnBbQVRSQUMzUF9TVUJCQU5EU10gPSB7CisgICAgMCwgMSwgMSwgMiwgMiwgMiwgMywgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNAorfTsKKworLyogbm9pc2UgdGFibGUgZm9yIHBvd2VyIGNvbXBlbnNhdGlvbiAqLworc3RhdGljIGNvbnN0IGZsb2F0IG5vaXNlX3RhYlsxMDI0XSA9IHsKKyAgICAtMC4wMTM1ODAzMiwgIC0wLjA1NTkzODcyLCAgIDAuMDE2OTY3NzcsICAtMC4xNDg3MTIxNiwgIC0wLjI2NDEyOTY0LCAgLTAuMDk4OTM3OTksICAgMC4yNTcyMzI2NywKKyAgICAgMC4wMjAwODA1NywgIC0wLjcyMjM1MTA3LCAgLTAuNDQzNTExOTYsICAtMC4yMjk4NTg0MCwgICAwLjE2ODMzNDk2LCAgIDAuNDY5MDI0NjYsICAgMC4wNTkxNzM1OCwKKyAgICAtMC4xNTE3OTQ0MywgICAwLjQxMjk5NDM4LCAgLTAuMDEyODc4NDIsICAgMC4xMzM2MDU5NiwgICAwLjQzNTU3NzM5LCAgLTAuMDk1MzA2NDAsICAtMC41ODQyMjg1MiwKKyAgICAgMC4zOTI2Njk2OCwgIC0wLjA4MzQzNTA2LCAgLTAuMjU2MDQyNDgsICAgMC4yMjg0ODUxMSwgICAwLjI2MDEzMTg0LCAgLTAuNjU1ODgzNzksICAgMC4xNzI4ODIwOCwKKyAgICAtMC4wODY3MzA5NiwgIC0wLjA1MjAzMjQ3LCAgIDAuMDcyOTk4MDUsICAtMC4yODY2NTE2MSwgIC0wLjM1ODA2Mjc0LCAgIDAuMDY1NTIxMjQsICAtMC4wOTM4NzIwNywKKyAgICAgMC4yMTA5OTg1NCwgIC0wLjI4MzQ3Nzc4LCAgLTAuNzI0MDI5NTQsICAgMC4wNTA1MDY1OSwgIC0wLjEwNjM1Mzc2LCAgLTAuMTg4NTM3NjAsICAgMC4yOTcyNDEyMSwKKyAgICAgMC4yMDcwMzEyNSwgIC0wLjI5NzkxMjYwLCAgLTAuMzc2MzQyNzcsICAgMC40Nzk3MDU4MSwgIC0wLjA5OTc2MTk2LCAgIDAuMzI2NDE2MDIsICAtMC4yOTI0ODA0NywKKyAgICAtMC4yODIzNzkxNSwgICAwLjI2MDI4NDQyLCAgLTAuMzYxNTcyMjcsICAgMC4yMjA0Mjg0NywgIC0wLjAzMjIyNjU2LCAgLTAuMzcyNjgwNjYsICAtMC4wMzc1OTc2NiwKKyAgICAgMC4wOTkwOTA1OCwgICAwLjIzMjg0OTEyLCAgIDAuMTkzMjA2NzksICAgMC4xNDQ1MzEyNSwgIC0wLjAyMTM5MjgyLCAgLTAuMTk3MDIxNDgsICAgMC4zMTUzMzgxMywKKyAgICAtMC4xNjc0MTk0MywgICAwLjM1MDMxMTI4LCAgLTAuMzU2NTY3MzgsICAtMC42NjEyODU0MCwgIC0wLjAwNzAxOTA0LCAgIDAuMjA4OTg0MzgsICAgMC4yNjgzNzE1OCwKKyAgICAtMC4zMzcwNjY2NSwgIC0wLjA0NTY4NDgxLCAgIDAuMTI2MDA3MDgsICAgMC4xMDI4NDQyNCwgICAwLjA3MzIxMTY3LCAgLTAuMTgyODAwMjksICAgMC4zODEwMTE5NiwKKyAgICAgMC4yMTMwMTI3MCwgICAwLjA0NTQxMDE2LCAgIDAuMDExNTY2MTYsICAtMC4yNjM5MTYwMiwgIC0wLjAyMzQ2ODAyLCAgLTAuMjIxMjUyNDQsICAgMC4yOTc2MDc0MiwKKyAgICAtMC4zNjIzMzUyMSwgIC0wLjMxMzE0MDg3LCAgLTAuMTM5Njc4OTYsICAtMC4xMTI3NjI0NSwgIC0wLjE5NDMzNTk0LCAgIDAuMzQ0OTA5NjcsICAgMC4wMjM0Mzc1MCwKKyAgICAgMC4yMTk2MzUwMSwgIC0wLjAyNzc3MTAwLCAgLTAuNjc2Nzg4MzMsICAtMC4wODk5OTYzNCwgICAwLjE0MjMzMzk4LCAgLTAuMjc2OTc3NTQsICAgMC41MTQyMjExOSwKKyAgICAtMC4wNTA0NzYwNywgICAwLjQ4MzI3NjM3LCAgIDAuMzcxNjczNTgsICAtMC42MDgwNjI3NCwgICAwLjE4NzI4NjM4LCAgLTAuMTUxOTE2NTAsICAgMC4wMDYzNzgxNywKKyAgICAgMC4wMjgzMjAzMSwgIC0wLjE1NjE4ODk2LCAgIDAuNjA2NDQ1MzEsICAgMC4yMTgyNjE3MiwgICAwLjA2Mzg0Mjc3LCAgLTAuMzE4NjM0MDMsICAgMC4wODgxNjUyOCwKKyAgICAgMC4xNTQ0Nzk5OCwgIC0wLjA3MDE1OTkxLCAgLTAuMDgxNTQyOTcsICAtMC40MDk2Njc5NywgIC0wLjM5Nzg1NzY3LCAgLTAuMTE3MDk1OTUsICAgMC4yMjA1MjAwMiwKKyAgICAgMC4xODQ2NjE4NywgIC0wLjE3MjU3NjkwLCAgIDAuMDM3NTk3NjYsICAtMC4wNjE5NTA2OCwgICAwLjAwNDMzMzUwLCAgIDAuMTIxNzY1MTQsICAgMC4zNDAxMTg0MSwKKyAgICAgMC4yNTYxMDM1MiwgIC0wLjA1Mjk0ODAwLCAgIDAuNDEwMzM5MzYsICAgMC4xNjg1NDg1OCwgIC0wLjc2MTg3MTM0LCAgIDAuMTM4NDU4MjUsICAtMC4xOTQxODMzNSwKKyAgICAtMC4yMTUyNDA0OCwgIC0wLjQ0NDEyMjMxLCAgLTAuMDgxNjA0MDAsICAtMC4yODE5NTE5MCwgIC0wLjAxODczNzc5LCAgIDAuMTU1MjQyOTIsICAtMC4zNzQzODk2NSwKKyAgICAtMC40NDg2MDg0MCwgICAwLjQzMDk2OTI0LCAgLTAuMjQ3NDY3MDQsICAgMC40OTg1NjU2NywgICAwLjE0ODU5MDA5LCAgIDAuMzgxNTkxODAsICAgMC4yMDU0MTM4MiwKKyAgICAtMC4zOTE3NTQxNSwgIC0wLjY1ODUwODMwLCAgLTAuNDM3MTY0MzEsICAgMC4xMzAzNzEwOSwgIC0wLjA1MTExNjk0LCAgIDAuMzk5NTY2NjUsICAgMC4yMTQ0Nzc1NCwKKyAgICAtMC4wNDg2MTQ1MCwgICAwLjMzNjU0Nzg1LCAgIDAuMTA1ODk2MDAsICAtMC44ODA4NTkzOCwgIC0wLjMwODIyNzU0LCAgIDAuMzg1NzcyNzEsICAgMC4zMDA0NzYwNywKKyAgICAgMC4zODgzNjY3MCwgICAwLjA5MTE4NjUyLCAgLTAuMzY0Nzc2NjEsICAtMC4wMTY0MTg0NiwgIC0wLjIzMDMxNjE2LCAgIDAuMjYwNTg5NjAsICAgMC4xODg1OTg2MywKKyAgICAtMC4yMTg2ODg5NiwgIC0wLjE3ODYxOTM4LCAgLTAuMjk3NTQ2MzksICAgMC4wOTc3NzgzMiwgICAwLjEwODA2Mjc0LCAgLTAuNTE2MDUyMjUsICAgMC4wMDA3NjI5NCwKKyAgICAgMC4xMzI1OTg4OCwgICAwLjExMDkwMDg4LCAgLTAuMjQwODQ0NzMsICAgMC4yNDk1NzI3NSwgICAwLjAxMzc5Mzk1LCAgLTAuMDQxNDEyMzUsICAtMC4wNDkzNzc0NCwKKyAgICAgMC41NzM5NDQwOSwgICAwLjI3NDEwODg5LCAgIDAuMjc1ODc4OTEsICAgMC40NTAxMzQyOCwgIC0wLjMyNTkyNzczLCAgIDAuMTExNjAyNzgsICAtMC4wMDk3MDQ1OSwKKyAgICAgMC4yOTA5MjQwNywgICAwLjAzMzU2OTM0LCAgLTAuNzA5MjU5MDMsICAgMC4wNDg4MjgxMiwgICAwLjQzNDk5NzU2LCAgIDAuMDc3MjA5NDcsICAtMC4yNzU1NDMyMSwKKyAgICAtMC4wMTc0MjU1NCwgIC0wLjA4NDEzNjk2LCAgLTAuMDQwMjgzMjAsICAtMC41Mjg1MDM0MiwgIC0wLjA3MzMwMzIyLCAgIDAuMDUxODE4ODUsICAgMC4yMTM2MjMwNSwKKyAgICAtMC4xODc2NTI1OSwgICAwLjA3MDU4NzE2LCAgLTAuMDMwMDkwMzMsICAgMC4zMjY2Mjk2NCwgICAwLjI3MDIzMzE1LCAgLTAuMjgwMDI5MzAsICAgMC4xNzU2ODk3MCwKKyAgICAgMC4wMzMzODYyMywgICAwLjMwMjQyOTIwLCAgLTAuMDM5MjE1MDksICAgMC4zMjE3NDY4MywgIC0wLjIzNzMzNTIxLCAgIDAuMDg1NzU0MzksICAtMC4zODI2OTA0MywKKyAgICAgMC4wOTE5NDk0NiwgIC0wLjA3MjM4NzcwLCAgIDAuMTc5NDEyODQsICAtMC41MTI3ODY4NywgIC0wLjI1MTQ2NDg0LCAgIDAuMTk3OTA2NDksICAtMC4xOTE5NTU1NywKKyAgICAgMC4xNjU0OTY4MywgICAwLjQyNDU2MDU1LCAgIDAuMzkxMjk2MzksICAtMC4wMjg2ODY1MiwgICAwLjE3OTgwOTU3LCAgIDAuMjQ5MDIzNDQsICAtMC43NjU4Mzg2MiwKKyAgICAtMC4yMDk1OTQ3MywgICAwLjYxMDEzNzk0LCAgIDAuMzcwMTE3MTksICAgMC4zNjg1OTEzMSwgIC0wLjA0NDg2MDg0LCAgIDAuMTA2NzgxMDEsICAtMC4xNTk5NDI2MywKKyAgICAtMC4wNTMyODM2OSwgICAwLjI4NDYzNzQ1LCAgLTAuMDY0MjA4OTgsICAtMC4zNjk4NzMwNSwgIC0wLjI4MDA5MDMzLCAgLTAuMTE3NjQ1MjYsICAgMC4wNDMxMjEzNCwKKyAgICAtMC4wODAzODMzMCwgICAwLjA0ODg1ODY0LCAgLTAuMDMwNjcwMTcsICAtMC4wMDA0MjcyNSwgICAwLjM0Mjg5NTUxLCAgLTAuMDA5ODg3NzAsICAgMC4zNDgzODg2NywKKyAgICAgMC4zMjUxNjQ3OSwgIC0wLjE2MjcxOTczLCAgIDAuMzgyNjkwNDMsICAgMC4wMzI0MDk2NywgICAwLjEyNDE3NjAzLCAgLTAuMTQzMzEwNTUsICAtMC4zNDkwMjk1NCwKKyAgICAtMC4xODMyNTgwNiwgICAwLjI5NDIxOTk3LCAgIDAuNDQyODQwNTgsICAgMC43NTE3MDg5OCwgIC0wLjY3MjQ1NDgzLCAgLTAuMTIxNzY1MTQsICAgMC4yNzkxNDQyOSwKKyAgICAtMC4yOTgwNjUxOSwgICAwLjE5ODYzODkyLCAgIDAuMzAwODcyODAsICAgMC4yMjY4MDY2NCwgIC0wLjM2NjMzMzAxLCAgLTAuMzI1MzQ3OTAsICAtMC41NzU1MzEwMSwKKyAgICAtMC4xNjY0MTIzNSwgICAwLjQzODExMDM1LCAgIDAuMDgzMzEyOTksICAgMC4xNTk0MjM4MywgICAwLjI2NTE2NzI0LCAgLTAuMjQyNDAxMTIsICAtMC4xMTc2MTQ3NSwKKyAgICAtMC4xNjgyNzM5MywgIC0wLjE0MjYwODY0LCAgIDAuNDYzNDM5OTQsICAgMC4xMTgwNDE5OSwgIC0wLjU1NTE0NTI2LCAgLTAuMDI1MjA3NTIsICAtMC4xNDMwOTY5MiwKKyAgICAgMC4wMDQ0ODYwOCwgICAwLjAyNzQ5NjM0LCAgLTAuMzA1NDUwNDQsICAgMC43MDk2NTU3NiwgICAwLjQ1MTA4MDMyLCAgIDAuNjY0Mzk4MTksICAtMC42ODI1NTYxNSwKKyAgICAtMC4xMjQ5Njk0OCwgICAwLjA5MTQ2MTE4LCAgLTAuMjExMDkwMDksICAtMC4yMzc5MTUwNCwgICAwLjc5OTQzODQ4LCAgLTAuMzUyMDUwNzgsICAtMC4yNDk2MzM3OSwKKyAgICAgMC4xODcxOTQ4MiwgIC0wLjE5MDc5NTkwLCAgIDAuMDc0NTg0OTYsICAgMC4wNzYyMzI5MSwgIC0wLjI4NzgxMTI4LCAgLTAuMzcxMjE1ODIsICAtMC4xOTU4MDA3OCwKKyAgICAtMC4wMTc3MzA3MSwgIC0wLjE2NzE3NTI5LCAgIDAuMTMwNDAxNjEsICAgMC4xNDY3Mjg1MiwgICAwLjQyMzc5NzYxLCAgIDAuMDM1ODI3NjQsICAgMC4xMTQzMTg4NSwKKyAgICAgMC4wNTE0NTI2NCwgICAwLjQ0NzAyMTQ4LCAgIDAuMDg5NjMwMTMsICAgMC4wMTM2NzE4OCwgIC0wLjU0NTE5NjUzLCAgLTAuMTI2OTIyNjEsICAgMC4yMTE3NjE0NywKKyAgICAgMC4wNDkyNTUzNywgICAwLjMwNjcwMTY2LCAgLTAuMTEwMjkwNTMsICAgMC4xOTU1NTY2NCwgIC0wLjI3NzQwNDc5LCAgIDAuMjMwNDM4MjMsICAgMC4xNTU1NDgxMCwKKyAgICAtMC4xOTI5OTMxNiwgIC0wLjI1NzI5MzcwLCAgIDAuMTc4MDA5MDMsICAtMC4wMzU3OTcxMiwgIC0wLjA1MDY1OTE4LCAgLTAuMDY5MzM1OTQsICAtMC4wOTUwMDEyMiwKKyAgICAtMC4wNzgyMTY1NSwgICAwLjIzODg5MTYwLCAgLTAuMzE5MDAwMjQsICAgMC4wMzA3MzEyMCwgIC0wLjAwNDE1MDM5LCAgIDAuNjEzMTU5MTgsICAgMC4zNzE3NjUxNCwKKyAgICAtMC4xMzQ0Mjk5MywgIC0wLjE1NTM2NDk5LCAgLTAuMTkyMTY5MTksICAtMC4zNzg5OTc4MCwgICAwLjE5OTkyMDY1LCAgIDAuMDI2MzA2MTUsICAtMC4xMjU3MzI0MiwKKyAgICAgMC4yNTkyNzczNCwgIC0wLjAyNDQ3NTEwLCAgIDAuMjk2Mjk1MTcsICAtMC40MDczMTgxMiwgIC0wLjE3MzMzOTg0LCAgIDAuMjQzMTAzMDMsICAtMC4xMDYwNzkxMCwKKyAgICAgMC4xNDgyODQ5MSwgICAwLjA4NzkyMTE0LCAgLTAuMTg3NDM4OTYsICAtMC4wNTU3MjUxMCwgIC0wLjA0ODMzOTg0LCAgIDAuMTA0NzM2MzMsICAtMC4yOTAyODMyMCwKKyAgICAtMC42NzY4Nzk4OCwgIC0wLjI4MTcwNzc2LCAgLTAuNDE2ODcwMTIsICAgMC4wNTQxMzgxOCwgIC0wLjIzMjg0OTEyLCAgIDAuMDk1NTUwNTQsICAtMC4wODk2OTExNiwKKyAgICAtMC4xNTExMjMwNSwgICAwLjEyNzM4MDM3LCAgIDAuMzU5ODYzMjgsICAgMC4yODk0ODk3NSwgICAwLjMwNjkxNTI4LCAgIDAuMjM5NTYyOTksICAgMC4wNjk3MzI2NywKKyAgICAtMC4zMTE5ODEyMCwgIC0wLjE4NDUwOTI4LCAgIDAuMjIyODA4ODQsICAtMC4yMTYwMDM0MiwgICAwLjIzNTIyOTQ5LCAgLTAuNjE4NDA4MjAsICAtMC4xMzAxMjY5NSwKKyAgICAgMC4yNjQxMjk2NCwgICAwLjQ3MzIwNTU3LCAgLTAuMjY0NDA0MzAsICAgMC4zODc1NzMyNCwgICAwLjE3MzUyMjk1LCAgLTAuMjYxMDQ3MzYsICAtMC4yNTg2NjY5OSwKKyAgICAtMC4xMjI3NDE3MCwgIC0wLjI5NzMzMjc2LCAgIDAuMDc2ODczNzgsICAgMC4xODU4ODI1NywgIC0wLjA4ODgwNjE1LCAgIDAuMzExODU5MTMsICAgMC4wNTMxMzExMCwKKyAgICAtMC4xMDg4NTYyMCwgIC0wLjE0OTAxNzMzLCAgLTAuMjIzMjM2MDgsICAtMC4wODUzODgxOCwgICAwLjE5ODEyMDEyLCAgIDAuMTk3MzI2NjYsICAtMC4xODkyNzAwMiwKKyAgICAgMC4yOTA1ODgzOCwgICAwLjI1NTU1NDIwLCAgLTAuNDg1OTkyNDMsICAgMC4xODc2ODMxMSwgICAwLjAxMzQ1ODI1LCAgIDAuMzQ4ODc2OTUsICAgMC4yMTUzMDE1MSwKKyAgICAgMC4xOTg1Nzc4OCwgICAwLjE4NjYxNDk5LCAgLTAuMDEzOTQ2NTMsICAtMC4wOTA2MzcyMSwgIC0wLjM4NzgxNzM4LCAgIDAuMjcxNjA2NDUsICAtMC4yMDM3OTYzOSwKKyAgICAtMC4zMjExOTc1MSwgIC0wLjIzODg5MTYwLCAgIDAuMjcwOTY1NTgsICAgMC4yNDk1MTE3MiwgICAwLjA3OTIyMzYzLCAgIDAuMDc0Nzk4NTgsICAtMC41MDk0NjA0NSwKKyAgICAgMC4xMDIyMDMzNywgICAwLjU4MzY0ODY4LCAgLTAuMTk1MDM3ODQsICAtMC4xODU2MDc5MSwgIC0wLjAxMTY1NzcxLCAgIDAuNDcxOTU0MzUsICAgMC4yMjQzMDQyMCwKKyAgICAtMC4zODYzNTI1NCwgIC0wLjAzNzMyMzAwLCAgLTAuMDkxNzk2ODgsICAgMC4wNjk5MTU3NywgICAwLjE1MTA2MjAxLCAgIDAuMjA2MDU0NjksICAtMC4wNTk2OTIzOCwKKyAgICAtMC40MTgyMTI4OSwgICAwLjEyMjMxNDQ1LCAgLTAuMDQ2NzIyNDEsICAtMC4wNTExNzc5OCwgIC0wLjExNTIzNDM4LCAgLTAuNTE4NDkzNjUsICAtMC4wNDA3NzE0OCwKKyAgICAgMC40NDI4NDA1OCwgIC0wLjY0MDg2OTE0LCAgIDAuMTcwMTk2NTMsICAgMC4wMjIzNjkzOCwgICAwLjIyODQ4NTExLCAgLTAuMjMyMTQ3MjIsICAtMC4zMjM1NDczNiwKKyAgICAtMC4xNDA2ODYwNCwgIC0wLjI5NjkwNTUyLCAgLTAuMTk4OTEzNTcsICAgMC4wMjc3NDA0OCwgIC0wLjIwOTY1NTc2LCAgLTAuNTIxOTExNjIsICAtMC4xOTI5OTMxNiwKKyAgICAtMC4wNzI5MDY0OSwgICAwLjQ5MDUzOTU1LCAgLTAuMjIzMDIyNDYsICAgMC4wNTY0MjcwMCwgICAwLjEzMTIyNTU5LCAgLTAuMjA4MTkwOTIsICAtMC44MzU5MDY5OCwKKyAgICAtMC4wODE4MTc2MywgICAwLjI2Nzk3NDg1LCAgLTAuMDAwOTE1NTMsICAtMC4wOTQ1NzM5NywgICAwLjE3MDg5ODQ0LCAgLTAuMjcwMjAyNjQsICAgMC4zMDI3MDM4NiwKKyAgICAgMC4wNTQ5NjIxNiwgICAwLjA5NTY0MjA5LCAgLTAuMDg1OTA2OTgsICAgMC4wMjEzMDEyNywgICAwLjM1OTMxMzk2LCAgIDAuMjE3Mjg1MTYsICAtMC4xNTM5NjExOCwKKyAgICAtMC4wNTA1MzcxMSwgICAwLjAyNzE5MTE2LCAgIDAuMTYzMDI0OTAsICAgMC40MzIxMjg5MSwgICAwLjEwMjI5NDkyLCAgLTAuNDA4MjAzMTIsICAgMC4yMTY0NjExOCwKKyAgICAgMC4wODQzNTA1OSwgIC0wLjExMTQ1MDIwLCAgLTAuMzk5NjI3NjksICAtMC4wNTYxODI4NiwgIC0wLjEwMjIzMzg5LCAgLTAuNjA4Mzk4NDQsICAgMC4zMzcyNDk3NiwKKyAgICAtMC4wNjM0MTU1MywgIC0wLjQ3MzY5Mzg1LCAgLTAuMzI4NTIxNzMsICAgMC4wNTI0MjkyMCwgICAwLjE5NjM1MDEwLCAgLTAuMTkxMzc1NzMsICAtMC42NzkwMTYxMSwKKyAgICAgMC4xNjE4MDQyMCwgICAwLjA1MTMzMDU3LCAgLTAuMjIyODM5MzYsICAgMC4wOTY0NjYwNiwgICAwLjI0Mjg4OTQwLCAgLTAuNDUwMDczMjQsICAgMC4wODgwNDMyMSwKKyAgICAgMC4xNDA1MzM0NSwgICAwLjIyNjE5NjI5LCAgLTAuMDEwMDA5NzcsICAgMC4zNjM1NTU5MSwgIC0wLjE5ODYzODkyLCAgLTAuMzAzNjQ5OTAsICAtMC4yNDExODA0MiwKKyAgICAtMC41NzQ2MTU0OCwgICAwLjI2NDk4NDEzLCAgIDAuMDQzNDU3MDMsICAtMC4wOTc5NjE0MywgIC0wLjQ3NzE0MjMzLCAgLTAuMjM3Mzk2MjQsICAgMC4xODczNzc5MywKKyAgICAgMC4wODkyNjM5MiwgIC0wLjAyNzk1NDEwLCAgIDAuMDAzMDUxNzYsICAtMC4wODcwMDU2MiwgIC0wLjM4NzExNTQ4LCAgIDAuMDMyMjI2NTYsICAgMC4xMDk0MDU1MiwKKyAgICAtMC40MTkwNjczOCwgIC0wLjAxNjIwNDgzLCAgLTAuNDcwNjExNTcsICAgMC4zNzk4NTIyOSwgIC0wLjIxNjI0NzU2LCAgIDAuNDc5NzY2ODUsICAtMC4yMDA0Njk5NywKKyAgICAtMC42MjUzMzU2OSwgIC0wLjI2OTA3MzQ5LCAgLTAuMDI4Nzc4MDgsICAgMC4wMDY3MTM4NywgIC0wLjI5MDcxMDQ1LCAgLTAuMjQ2ODU2NjksICAtMC4xNTcyMjY1NiwKKyAgICAtMC4yNjA1NTkwOCwgICAwLjI5OTY4MjYyLCAgIDAuMjgyMjU3MDgsICAtMC4wODk5MDQ3OSwgIC0wLjE2NzQ4MDQ3LCAgLTAuNDY3NTkwMzMsICAtMC4yNTA2NzEzOSwKKyAgICAtMC4yNTE4MzEwNSwgIC0wLjQ1OTMyMDA3LCAgIDAuMDU4Mjg4NTcsICAgMC4yOTAwNjk1OCwgICAwLjIzODQwMzMyLCAgLTAuMTc5NzQ4NTQsICAgMC4yNjkzMTc2MywKKyAgICAgMC4xMDY5NjQxMSwgIC0wLjA2ODQ4MTQ1LCAgLTAuMTcxMjY0NjUsICAtMC4xMDUyMjQ2MSwgIC0wLjU1Mzg2MzUzLCAgLTAuNDIzMDY1MTksICAtMC4wNzYwODAzMiwKKyAgICAgMC4yNDM4MDQ5MywgICAwLjM4NTg2NDI2LCAgIDAuMTY4ODIzMjQsICAgMC4yNjc1MTcwOSwgICAwLjE3MzAzNDY3LCAgIDAuMzU4MDkzMjYsICAtMC4yMjA5NDcyNywKKyAgICAtMC4zMDcwMzczNSwgIC0wLjI4NDk3MzE0LCAgLTAuMDQzMjEyODksICAgMC4xNTIxOTExNiwgIC0wLjE3MDcxNTMzLCAgLTAuMzkzMzQxMDYsICAgMC4wMzQzOTMzMSwKKyAgICAtMC4xMDgwOTMyNiwgIC0wLjMwNTkwODIwLCAgIDAuMjY0NDk1ODUsICAtMC4wNzQxMjcyMCwgICAwLjEzNjM4MzA2LCAgLTAuMDEwNjIwMTIsICAgMC4yNzk5NjgyNiwKKyAgICAgMC4wNDM5NzU4MywgIC0wLjA1NTU3MjUxLCAgLTAuNTY5MzM1OTQsICAgMC4wMzM2MzAzNywgIC0wLjAwOTQ5MDk3LCAgIDAuNTI2NDI4MjIsICAtMC40NDMyOTgzNCwKKyAgICAgMC4yODMwODEwNSwgIC0wLjA1NDk5MjY4LCAgLTAuMjMzMTIzNzgsICAtMC4yOTg3MDYwNSwgIC0wLjA1MTIzOTAxLCAgIDAuMjY4MzEwNTUsICAtMC4zNTIzODY0NywKKyAgICAtMC4zMDk5MzY1MiwgICAwLjM0NjQ2NjA2LCAgLTAuMTk3NzUzOTEsICAgMC40NDU5NTMzNywgICAwLjEzNzY5NTMxLCAgIDAuNDUzNTgyNzYsICAgMC4xOTk2MTU0OCwKKyAgICAgMC40MjY4MTg4NSwgICAwLjE1NzIyNjU2LCAgIDAuMDAxMjgxNzQsICAgMC4yMzc1NzkzNSwgICAwLjQwOTg4MTU5LCAgIDAuMjUxNjQ3OTUsICAtMC4wMDczMjQyMiwKKyAgICAtMC4xMjQwNTM5NiwgIC0wLjQzNDIwNDEwLCAgLTAuMDA0MDI4MzIsICAgMC4zNDI0Mzc3NCwgICAwLjM2MjY0MDM4LCAgIDAuMTg4MDc5ODMsICAtMC4wOTMwMTc1OCwKKyAgICAtMC4xMDI5NjYzMSwgICAwLjA1NTMyODM3LCAgLTAuMzE2NTI4MzIsICAgMC4xNDMzNzE1OCwgICAwLjM1MDQwMjgzLCAgIDAuMzI1NDA4OTQsICAgMC4wNTcyODE0OSwKKyAgICAtMC4xMjAzMDAyOSwgIC0wLjI1OTQyOTkzLCAgLTAuMjAzMTI1MDAsICAtMC4xNjQ5MTY5OSwgIC0wLjQ2MDUxMDI1LCAgLTAuMDgwMDQ3NjEsICAgMC41MDc3MjA5NSwKKyAgICAgMC4xNjE2ODIxMywgICAwLjI4NDM5MzMxLCAgIDAuMDgxMDU0NjksICAtMC4xOTEwNDAwNCwgICAwLjM4NTg5NDc4LCAgLTAuMTY0MDAxNDYsICAtMC4yNTQ1NDcxMiwKKyAgICAgMC4yMDI4MTk4MiwgIC0wLjIwNzMwNTkxLCAgLTAuMDYzMTEwMzUsICAgMC4zMjkzNzYyMiwgICAwLjE1MDMyOTU5LCAgLTAuMDUzNDA1NzYsICAgMC4zMDQ4NzA2MSwKKyAgICAtMC4xMTY0ODU2MCwgICAwLjM4MDA5NjQ0LCAgLTAuMjAwNjIyNTYsICAgMC40MzQ2NjE4NywgICAwLjAxMTUwNTEzLCAgIDAuMzU3NTQzOTUsICAtMC4xMzE0Njk3MywKKyAgICAgMC42NzQ4OTYyNCwgICAwLjA1MjEyNDAyLCAgIDAuMjc5MTQ0MjksICAtMC4zOTQzMTc2MywgICAwLjc1MzA4MjI4LCAgLTAuMTMzNjY2OTksICAgMC4yNDQ1MzczNSwKKyAgICAgMC40MjI0ODUzNSwgIC0wLjY1OTA1NzYyLCAgLTAuMDA1NDYyNjUsICAtMC4wMzQ5MTIxMSwgIC0wLjEzNjU5NjY4LCAgLTAuMDgyOTQ2NzgsICAtMC40NTY2NjUwNCwKKyAgICAgMC4yNzE4ODExMCwgICAwLjEyNzMxOTM0LCAgIDAuNjExNDgwNzEsICAgMC4xMDQ0OTIxOSwgIC0wLjI4ODM2MDYwLCAgIDAuMDAwOTE1NTMsICAgMC4yNDYxODUzMCwKKyAgICAgMC4xMzExOTUwNywgICAwLjA1Njg1NDI1LCAgIDAuMTczNTUzNDcsICAgMC40MjAzNDkxMiwgICAwLjA4NTE0NDA0LCAgIDAuMjQ1MzYxMzMsICAgMC4xODk1MTQxNiwKKyAgICAtMC4xOTEwNzA1NiwgIC0wLjE1MDM2MDExLCAgIDAuMDIzMzQ1OTUsICAgMC41NDk4NjU3MiwgICAwLjMyMzIxMTY3LCAgLTAuMTYxMDQxMjYsICAtMC4wMzA1NDgxMCwKKyAgICAgMC40MzU5NDM2MCwgICAwLjE3MzA5NTcwLCAgIDAuNjEwNTM0NjcsICAgMC4yNDczMTQ0NSwgICAwLjMzMzM0MzUxLCAgIDAuMTUyNDA0NzksICAgMC4xNTU4ODM3OSwKKyAgICAgMC4zNjQyNTc4MSwgIC0wLjMwNDA3NzE1LCAgLTAuMTMzMDI2MTIsICAgMC4wMDQyNzI0NiwgICAwLjA0MTcxNzUzLCAgLTAuMzMxNzg3MTEsICAgMC4zNDIxNjMwOSwKKyAgICAtMC4xMjQ2MzM3OSwgIC0wLjAyNzY0ODkzLCAgIDAuMDU5MDUxNTEsICAtMC4zMTQzNjE1NywgICAwLjE2NTMxMzcyLCAgIDAuMzQ1NDI4NDcsICAtMC4wMzI5Mjg0NywKKyAgICAgMC4xMjUyNzQ2NiwgIC0wLjEyMzEzODQzLCAgLTAuMTMxNzEzODcsICAgMC4wNDc1NzY5MCwgIC0wLjQ1MDk1ODI1LCAgLTAuMTkwODU2OTMsICAgMC4zNTM0MjQwNywKKyAgICAtMC4yMzIzOTEzNiwgIC0wLjM0Mzg3MjA3LCAgIDAuMTEyNjQwMzgsICAtMC4xNTc0MDk2NywgICAwLjA1MjczNDM4LCAgIDAuNzQ5NDIwMTcsICAgMC4yMTUwNTczNywKKyAgICAgMC4wODUxNDQwNCwgIC0wLjQyMzkxOTY4LCAgLTAuMTk1MzEyNTAsICAgMC4zNTI5MzU3OSwgICAwLjI1MzA1MTc2LCAgIDAuMTU3MzE4MTIsICAtMC43MDMyNDcwNywKKyAgICAtMC4yMTU5MTE4NywgICAwLjM1NjA0ODU4LCAgIDAuMTQxMzI2OTAsICAgMC4xMTcyNDg1NCwgICAwLjE1ODUzODgyLCAgLTAuMjQ1OTcxNjgsICAgMC4wNzAxOTA0MywKKyAgICAgMC4wMjEyNzA3NSwgICAwLjEyNjU4NjkxLCAgIDAuMDYzOTAzODEsICAtMC4xMjI5MjQ4MCwgICAwLjE1NDQxODk1LCAgLTAuNDc2NDA5OTEsICAgMC4wNjE5NTA2OCwKKyAgICAgMC41ODk4MTMyMywgIC0wLjE1MTUxOTc4LCAgLTAuMDM2MDQxMjYsICAtMC40NTA1OTIwNCwgIC0wLjAxNjcyMzYzLCAgLTAuNDY5OTcwNzAsICAgMC4yNTc1MDczMiwKKyAgICAgMC4xODA4NDcxNywgICAwLjA2NjYxOTg3LCAgIDAuMTMyNTM3ODQsICAgMC42NzgyODM2OSwgICAwLjExMzcwODUwLCAgIDAuMTEzMjUwNzMsICAtMC4wNDYxMTIwNiwKKyAgICAtMC4wNzc5MTEzOCwgIC0wLjM2NTQ0ODAwLCAgLTAuMDY3NDc0MzcsICAtMC4zMTU5NDg0OSwgICAwLjE2MTMxNTkyLCAgIDAuNDE5ODMwMzIsICAgMC4xMTA3MTc3NywKKyAgICAtMC4zNjg4OTY0OCwgICAwLjMwOTYzMTM1LCAgLTAuMzc4NzUzNjYsICAgMC41ODUwODMwMSwgICAwLjAwMzkzNjc3LCAgIDAuMTIzMzgyNTcsICAgMC4wMzQyNDA3MiwKKyAgICAtMC4yMTcyODUxNiwgIC0wLjEyODM4NzQ1LCAgLTAuNDY5ODE4MTIsICAgMC4wNTg2ODUzMCwgIC0wLjI1MDE1MjU5LCAgIDAuMjc0MDc4MzcsICAgMC42NTI0MDQ3OSwKKyAgICAtMC4zNDQyOTkzMiwgIC0wLjE1MTc5NDQzLCAgIDAuMTQwNTYzOTYsICAgMC4zMzUwNTI0OSwgICAwLjI4ODI2OTA0LCAgIDAuMDk5MjEyNjUsICAgMC4zNDM5MDI1OSwKKyAgICAgMC4xMzY1NjYxNiwgIC0wLjIzNjA4Mzk4LCAgIDAuMDA4NjM2NDcsICAgMC4wMjYyNzU2MywgIC0wLjE5MTE5MjYzLCAgIDAuMTk3NzUzOTEsICAtMC4wNzIxNDM1NSwKKyAgICAgMC4wNzgwOTQ0OCwgICAwLjAzNDU0NTkwLCAgLTAuMDM0MTc5NjksICAgMC4wMDAzMzU2OSwgIC0wLjIzMDk1NzAzLCAgIDAuMTg2NzM3MDYsICAgMC4wNTc5ODM0MCwKKyAgICAgMC4wMzgxNDY5NywgIC0wLjA0MzE4MjM3LCAgIDAuMDU0ODcwNjEsICAgMC4wODYzMzQyMywgICAwLjU1OTUwOTI4LCAgLTAuMDYzNDc2NTYsICAgMC4xMDMzMzI1MiwKKyAgICAgMC4yNTMwNTE3NiwgICAwLjA1ODUzMjcxLCAgIDAuMTIyNDY3MDQsICAtMC4yNTU0MzIxMywgIC0wLjM0MjYyMDg1LCAgLTAuMzY0Mzc5ODgsICAtMC4yMTMwNDMyMSwKKyAgICAtMC4wNTA5MzM4NCwgICAwLjAyNzc3MTAwLCAgIDAuMDc2MjAyMzksICAtMC4yMTIxNTgyMCwgIC0wLjA5MzI2MTcyLCAgIDAuMTkwMjE2MDYsICAtMC40MDU3OTIyNCwKKyAgICAtMC4wMTE5MzIzNywgICAwLjE5ODQ1NTgxLCAgLTAuMzUzMzYzMDQsICAtMC4wNzM5NzQ2MSwgICAwLjIwMTA0OTgwLCAgIDAuMDg2MTUxMTIsICAtMC40NDM3NTYxMCwKKyAgICAgMC4xMTQxOTY3OCwgICAwLjI0NDUzNzM1LCAgLTAuMTY1NTU3ODYsICAtMC4wNTA4MTE3NywgIC0wLjAxNDA2ODYwLCAgIDAuMjc4OTMwNjYsICAtMC4xODY5MjAxNywKKyAgICAgMC4wNzQ3Mzc1NSwgICAwLjAzNDUxNTM4LCAgLTAuMzk3MzM4ODcsICAgMC4yMTU0ODQ2MiwgIC0wLjIyNTM0MTgwLCAgLTAuMzk2NTE0ODksICAtMC4wNDk4OTYyNCwKKyAgICAtMC41NzY2Mjk2NCwgICAwLjA2MzkwMzgxLCAgIDAuNjIwMjA4NzQsICAtMC4xMzQ3MDQ1OSwgICAwLjA0MzQ1NzAzLCAgLTAuMjE4NjI3OTMsICAtMC4wMjc4OTMwNywKKyAgICAgMC41MTY5Njc3NywgIC0wLjI3NTg3ODkxLCAgIDAuMzkwMDQ1MTcsICAgMC4wOTg1NzE3OCwgIC0wLjAwNzM4NTI1LCAgIDAuMzEzMTcxMzksICAgMC4wMDA0ODgyOCwKKyAgICAtMC40NjU3Mjg3NiwgICAwLjI5NTMxODYwLCAgLTAuMTAwMDk3NjYsICAtMC4yNzg1NjQ0NSwgICAwLjAzNTk0OTcxLCAgIDAuMjUwNDg4MjgsICAtMC43NDU4NDk2MSwKKyAgICAtMC4yNTM1MDk1MiwgIC0wLjAzMzAyMDAyLCAgIDAuMzExODg5NjUsICAgMC4wMTU3MTY1NSwgICAwLjQ2NzEwMjA1LCAgIDAuMjE1OTExODcsICAgMC4wNzI2MDEzMiwKKyAgICAtMC40MjEzMjU2OCwgIC0wLjUzOTAwMTQ2LCAgLTAuMTM2NzQ5MjcsICAtMC4xNjU3MTA0NSwgIC0wLjM0NDU0MzQ2LCAgIDAuMTIzNTk2MTksICAtMC4xMTE4NDY5MiwKKyAgICAgMC4wMDk2NzQwNywgICAwLjM0NTc2NDE2LCAgLTAuMDU3NjE3MTksICAgMC4zNDg0ODAyMiwgICAwLjE3NjQ1MjY0LCAgLTAuMzkzOTUxNDIsICAgMC4xMDMzOTM1NSwKKyAgICAgMC4xODIxNTk0MiwgICAwLjIwNjk3MDIxLCAgIDAuNTkxMDk0OTcsICAtMC4xMTU2MDA1OSwgIC0wLjA3Mzg1MjU0LCAgIDAuMTAzOTczMzksICAgMC4zNTQzNzAxMiwKKyAgICAtMC4yMjg2Mzc3MCwgICAwLjAxNzk0NDM0LCAgIDAuMTc1NTk4MTQsICAtMC4xNzQ5NTcyOCwgICAwLjEyMTQyOTQ0LCAgIDAuMTA5MjgzNDUsICAtMS4wMDAwMDAwMCwKKyAgICAtMC4wMTM3OTM5NSwgICAwLjIxMjM3MTgzLCAgLTAuMjcwMzU1MjIsICAgMC4yNzMxOTMzNiwgIC0wLjM3MDY2NjUwLCAgIDAuNDEzNTQzNzAsICAtMC40MDA1NDMyMSwKKyAgICAgMC4wMDY4OTY5NywgICAwLjI2MzIxNDExLCAgIDAuMzkyNjY5NjgsICAgMC42NTI5ODQ2MiwgICAwLjQxNjI1OTc3LCAgLTAuMTM5MDk5MTIsICAgMC43ODM3NTI0NCwKKyAgICAtMC4zMDk0MTc3MiwgICAwLjIwMTY5MDY3LCAgLTAuMzkzNjc2NzYsICAgMC45NDAyMTYwNiwgIC0wLjI0MDY2MTYyLCAgIDAuMDU1NTcyNTEsICAtMC4yNDUzMzA4MSwKKyAgICAtMC4wNTQ0NDMzNiwgIC0wLjc2NzU0NzYxLCAgLTAuMTkzNzU2MTAsICAtMC4xMTA0MTI2MCwgIC0wLjE3NTMyMzQ5LCAgIDAuMTYwMDY0NzAsICAgMC4wMjE4ODExMCwKKyAgICAgMC4xNzQ2NTIxMCwgIC0wLjA0MzQyNjUxLCAgLTAuNTY3Nzc5NTQsICAtMC40MDk4ODE1OSwgICAwLjI2Njg3NjIyLCAgIDAuMTE3MDA0MzksICAtMC4wMDM0NDg0OSwKKyAgICAtMC4wNTM5NTUwOCwgICAwLjM3NDI2NzU4LCAgLTAuNDA3MTk2MDQsICAtMC4xNTAzMjk1OSwgIC0wLjAxNjYwMTU2LCAgIDAuMDQxOTYxNjcsICAtMC4wNDU1OTMyNiwKKyAgICAtMC4xMjk2OTk3MSwgICAwLjEyMDExNzE5LCAgIDAuMDg0MTk4MDAsICAtMC4xMTE5OTk1MSwgICAwLjM1MTc0NTYxLCAgIDAuMTAyNzUyNjksICAtMC4yNTY4NjY0NiwKKyAgICAgMC40ODQ0NjY1NSwgICAwLjAzMjI1NzA4LCAgIDAuMjg0MDg4MTMsICAtMC4xODcwMTE3MiwgICAwLjM2MjgyMzQ5LCAgLTAuMDMyODA2NDAsICAgMC4zMjMwMjg1NiwKKyAgICAgMC4xNzIzMzI3NiwgICAwLjQ4MjY5NjUzLCAgIDAuMzExMTI2NzEsICAtMC4wNDk0Njg5OSwgICAwLjEyNzc0NjU4LCAgIDAuNTI2ODU1NDcsICAgMC4xMDIxMTE4MiwKKyAgICAgMC4wNTk1Mzk3OSwgICAwLjA1OTk5NzU2LCAgIDAuMjAxNDQ2NTMsICAgMC4wMDc0NDYyOSwgICAwLjI3MzE2Mjg0LCAgIDAuMjQzNzc0NDEsICAgMC4zOTY3Mjg1MiwKKyAgICAgMC4wMTcwMjg4MSwgIC0wLjM1NTEzMzA2LCAgIDAuMTEzNjQ3NDYsICAtMC4xMzU1NTkwOCwgICAwLjQ4ODgwMDA1LCAgLTAuMTU0MTc0ODAsICAtMC4wOTE0OTE3MCwKKyAgICAtMC4wMjYxNTM1NiwgICAwLjQ2MjQ2MzM4LCAgLTAuNzIyNTAzNjYsICAgMC4yMjMzMjc2NCwgICAwLjIzODQ5NDg3LCAgLTAuMjU2ODY2NDYsICAtMC4wODUxNDQwNCwKKyAgICAtMC4wMjA2Mjk4OCwgIC0wLjM0NDk0MDE5LCAgLTAuMDIyOTc5NzQsICAtMC44MDM4NjM1MywgIC0wLjA4MDc0OTUxLCAgLTAuMTI2ODkyMDksICAtMC4wNjg5Njk3MywKKyAgICAgMC4yNDA5OTczMSwgIC0wLjM1NjUwNjM1LCAgLTAuMDk1NTgxMDUsICAgMC4yOTI1NDE1MCwgICAwLjIzMTMyMzI0LCAgLTAuMTY3MjY2ODUsICAgMC4wMDAwMDAwMCwKKyAgICAtMC4yNDIzNzA2MSwgICAwLjMwODk5MDQ4LCAgIDAuMjk1MDQzOTUsICAtMC4yMDg5ODQzOCwgICAwLjE3MDU5MzI2LCAgLTAuMDc2NzIxMTksICAtMC4xNDM5NTE0MiwKKyAgICAgMC4wNTU3MjUxMCwgICAwLjIwNjAyNDE3LCAgLTAuNTE1NTAyOTMsICAtMC4wMzE2NzcyNSwgIC0wLjQ4ODQwMzMyLCAgLTAuMjA0MjU0MTUsICAgMC4xNDE0NDg5NywKKyAgICAgMC4wNzI3NTM5MSwgIC0wLjc2NjY5MzEyLCAgLTAuMjI0ODg0MDMsICAgMC4yMDY1MTI0NSwgICAwLjAzMjU5Mjc3LCAgIDAuMDAwODU0NDksICAgMC4wMzAzOTU1MSwKKyAgICAgMC40NzU1NTU0MiwgICAwLjM4MzUxNDQwCit9OworCisvKiogTm9pc2UgbGV2ZWwgdGFibGUgZm9yIHBvd2VyIGNvbXBlbnNhdGlvbi4KKyAqICBFcXU6IHBvdygyLjBmLCAoZG91YmxlKSg2IC0gaSkgLyAzLjBmKSB3aGVyZSBpID0gMC4uLjE1ICovCitzdGF0aWMgY29uc3QgZmxvYXQgcHdjX2xldnNbMTZdID0geworICAgIDMuOTY4NzUsIDMuMTU2MjUsICAgICAyLjUsICAgIDIuMCwgMS41OTM3NSwgICAxLjI1LCAgICAgMS4wLCAwLjc4MTI1LAorICAgIDAuNjI1LCAgICAgICAwLjUsIDAuNDA2MjUsIDAuMzEyNSwgICAgMC4yNSwgMC4xODc1LCAwLjE1NjI1LCAwLjAKK307CisKKy8qKiBNYXAgc3ViYmFuZCBudW1iZXIgdG8gcXVhbnQgdW5pdCBudW1iZXIuICovCitzdGF0aWMgY29uc3QgaW50IHN1YmJhbmRfdG9fcXVbMTddID0geworICAgIDAsIDgsIDEyLCAxNiwgMTgsIDIwLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIKK307CisKK3ZvaWQgZmZfYXRyYWMzcF9wb3dlcl9jb21wZW5zYXRpb24oQXRyYWMzcENoYW5Vbml0Q3R4ICpjdHgsIGludCBjaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnNwLCBpbnQgcm5nX2luZGV4LCBpbnQgc2IpCit7CisgICAgQXRyYWNHYWluSW5mbyAqZzEsICpnMjsKKyAgICBmbG9hdCBwd2NzcFtBVFJBQzNQX1NVQkJBTkRfU0FNUExFU10sICpkc3QsIGdycF9sZXYsIHF1X2xldjsKKyAgICBpbnQgaSwgZ2Fpbl9sZXYsIGdjdiA9IDAsIHF1LCBuc3A7CisgICAgaW50IHN3YXBfY2ggPSAoY3R4LT51bml0X3R5cGUgPT0gQ0hfVU5JVF9TVEVSRU8gJiYgY3R4LT5zd2FwX2NoYW5uZWxzW3NiXSkgPyAxIDogMDsKKworICAgIGlmIChjdHgtPmNoYW5uZWxzW2NoX2luZGV4IF4gc3dhcF9jaF0ucG93ZXJfbGV2c1tzdWJiYW5kX3RvX3Bvd2dycFtzYl1dID09IEFUUkFDM1BfUE9XRVJfQ09NUF9PRkYpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIGdlbmVyYXRlIGluaXRpYWwgbm9pc2Ugc3BlY3RydW0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQVRSQUMzUF9TVUJCQU5EX1NBTVBMRVM7IGkrKywgcm5nX2luZGV4KyspCisgICAgICAgIHB3Y3NwW2ldID0gbm9pc2VfdGFiW3JuZ19pbmRleCAmIDB4M0ZGXTsKKworICAgIC8qIGNoZWNrIGdhaW4gY29udHJvbCBpbmZvcm1hdGlvbiAqLworICAgIGcxID0gJmN0eC0+Y2hhbm5lbHNbY2hfaW5kZXggXiBzd2FwX2NoXS5nYWluX2RhdGFbc2JdOworICAgIGcyID0gJmN0eC0+Y2hhbm5lbHNbY2hfaW5kZXggXiBzd2FwX2NoXS5nYWluX2RhdGFfcHJldltzYl07CisKKyAgICBnYWluX2xldiA9IChnMS0+bnVtX3BvaW50cyA+IDApID8gKDYgLSBnMS0+bGV2X2NvZGVbMF0pIDogMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnMi0+bnVtX3BvaW50czsgaSsrKQorICAgICAgICBnY3YgPSBGRk1BWChnY3YsIGdhaW5fbGV2IC0gKGcyLT5sZXZfY29kZVtpXSAtIDYpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnMS0+bnVtX3BvaW50czsgaSsrKQorICAgICAgICBnY3YgPSBGRk1BWChnY3YsIDYgLSBnMS0+bGV2X2NvZGVbaV0pOworCisgICAgZ3JwX2xldiA9IHB3Y19sZXZzW2N0eC0+Y2hhbm5lbHNbY2hfaW5kZXggXiBzd2FwX2NoXS5wb3dlcl9sZXZzW3N1YmJhbmRfdG9fcG93Z3JwW3NiXV1dIC8gKDEgPDwgZ2N2KTsKKworICAgIC8qIHNraXAgdGhlIGxvd2VzdCB0d28gcXVhbnQgdW5pdHMgKGZyZXF1ZW5jaWVzIDAuLi4zNTEgSHopIGZvciBzdWJiYW5kIDAgKi8KKyAgICBmb3IgKHF1ID0gc3ViYmFuZF90b19xdVtzYl0gKyAoIXNiID8gMiA6IDApOyBxdSA8IHN1YmJhbmRfdG9fcXVbc2IgKyAxXTsgcXUrKykgeworICAgICAgICBpZiAoY3R4LT5jaGFubmVsc1tjaF9pbmRleF0ucXVfd29yZGxlbltxdV0gPD0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHF1X2xldiA9IGZmX2F0cmFjM3Bfc2ZfdGFiW2N0eC0+Y2hhbm5lbHNbY2hfaW5kZXhdLnF1X3NmX2lkeFtxdV1dICoKKyAgICAgICAgICAgICAgICAgZmZfYXRyYWMzcF9tYW50X3RhYltjdHgtPmNoYW5uZWxzW2NoX2luZGV4XS5xdV93b3JkbGVuW3F1XV0gLworICAgICAgICAgICAgICAgICAoMSA8PCBjdHgtPmNoYW5uZWxzW2NoX2luZGV4XS5xdV93b3JkbGVuW3F1XSkgKiBncnBfbGV2OworCisgICAgICAgIGRzdCA9ICZzcFtmZl9hdHJhYzNwX3F1X3RvX3NwZWNfcG9zW3F1XV07CisgICAgICAgIG5zcCA9IGZmX2F0cmFjM3BfcXVfdG9fc3BlY19wb3NbcXUgKyAxXSAtIGZmX2F0cmFjM3BfcXVfdG9fc3BlY19wb3NbcXVdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuc3A7IGkrKykKKyAgICAgICAgICAgIGRzdFtpXSArPSBwd2NzcFtpXSAqIHF1X2xldjsKKyAgICB9Cit9CisKK3ZvaWQgZmZfYXRyYWMzcF9pbWRjdChBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCwgRkZUQ29udGV4dCAqbWRjdF9jdHgsIGZsb2F0ICpwSW4sCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnBPdXQsIGludCB3aW5kX2lkLCBpbnQgc2IpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoc2IgJiAxKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVRSQUMzUF9TVUJCQU5EX1NBTVBMRVMgLyAyOyBpKyspCisgICAgICAgICAgICBGRlNXQVAoZmxvYXQsIHBJbltpXSwgcEluW0FUUkFDM1BfU1VCQkFORF9TQU1QTEVTIC0gMSAtIGldKTsKKworICAgIG1kY3RfY3R4LT5pbWRjdF9jYWxjKG1kY3RfY3R4LCBwT3V0LCBwSW4pOworCisgICAgLyogUGVyZm9ybSB3aW5kb3dpbmcgb24gdGhlIG91dHB1dC4KKyAgICAgKiBBVFJBQzMrIHVzZXMgdHdvIGRpZmZlcmVudCBNRENUIHdpbmRvd3M6CisgICAgICogLSBUaGUgZmlyc3Qgb25lIGlzIGp1c3QgdGhlIHBsYWluIHNpbmUgd2luZG93IG9mIHNpemUgMjU2CisgICAgICogLSBUaGUgMm5kIG9uZSBpcyB0aGUgcGxhaW4gc2luZSB3aW5kb3cgb2Ygc2l6ZSAxMjgKKyAgICAgKiAgIHdyYXBwZWQgaW50byB6ZXJvIChhdCB0aGUgc3RhcnQpIGFuZCBvbmUgKGF0IHRoZSBlbmQpIHJlZ2lvbnMuCisgICAgICogICBCb3RoIHJlZ2lvbnMgYXJlIDMyIHNhbXBsZXMgbG9uZy4gKi8KKyAgICBpZiAod2luZF9pZCAmIDIpIHsgLyogMXN0IGhhbGY6IHN0ZWVwIHdpbmRvdyAqLworICAgICAgICBtZW1zZXQocE91dCwgMCwgc2l6ZW9mKGZsb2F0KSAqIDMyKTsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWwoJnBPdXRbMzJdLCAmcE91dFszMl0sIGZmX3NpbmVfNjQsIDY0KTsKKyAgICB9IGVsc2UgLyogMXN0IGhhbGY6IHNpbXBsZSBzaW5lIHdpbmRvdyAqLworICAgICAgICBmZHNwLT52ZWN0b3JfZm11bChwT3V0LCBwT3V0LCBmZl9zaW5lXzEyOCwgQVRSQUMzUF9NRENUX1NJWkUgLyAyKTsKKworICAgIGlmICh3aW5kX2lkICYgMSkgeyAvKiAybmQgaGFsZjogc3RlZXAgd2luZG93ICovCisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2UoJnBPdXRbMTYwXSwgJnBPdXRbMTYwXSwgZmZfc2luZV82NCwgNjQpOworICAgICAgICBtZW1zZXQoJnBPdXRbMjI0XSwgMCwgc2l6ZW9mKGZsb2F0KSAqIDMyKTsKKyAgICB9IGVsc2UgLyogMm5kIGhhbGY6IHNpbXBsZSBzaW5lIHdpbmRvdyAqLworICAgICAgICBmZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKCZwT3V0WzEyOF0sICZwT3V0WzEyOF0sIGZmX3NpbmVfMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDM1BfTURDVF9TSVpFIC8gMik7Cit9CisKKy8qIGxvb2t1cCB0YWJsZSBmb3IgZmFzdCBtb2R1bG8gMjMgb3AgcmVxdWlyZWQgZm9yIGN5Y2xpYyBidWZmZXJzIG9mIHRoZSBJUFFGICovCitzdGF0aWMgY29uc3QgaW50IG1vZDIzX2x1dFsyNl0gPSB7CisgICAgMjMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsCisgICAgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMAorfTsKKworLyogRmlyc3QgaGFsZiBvZiB0aGUgMzg0LXRhcCBJUFFGIGZpbHRlcmluZyBjb2VmZmljaWVudHMuICovCitzdGF0aWMgY29uc3QgZmxvYXQgaXBxZl9jb2VmZnMxW0FUUkFDM1BfUFFGX0ZJUl9MRU5dWzE2XSA9IHsKKyAgICB7IC01LjgzMzYyMDdlLTcsICAgIC04LjA2MDQyMjllLTcsICAgIC00LjIwMDU0MTFlLTcsICAgIC00LjQ0MDA1NzJlLTgsCisgICAgICAgMy4yMjYyNDdlLTgsICAgICAgMy41MzA4NTZlLTgsICAgICAgMS4yNjYwMzc3ZS04LCAgICAgMC4wMDAwMTA1MTY3ODMsCisgICAgICAtMC4wMDAwMTE4Mzg2MTgsICAgNi4wMDUzODllLTcsICAgICAgMC4wMDAwMDE0MzMzNzU0LCAgMC4wMDAwMDIzMTA4Njg1LAorICAgICAgIDAuMDAwMDAzMjU2OTc0MiwgIDAuMDAwMDA0NjE5MjQyMiwgIDAuMDAwMDA2Mzg5NDI1OCwgIDAuMDAwMDA3MDMwMjk3MiB9LAorICAgIHsgLTAuMDAwMDA5MTYyMjgyNCwgLTAuMDAwMDEwNTAyOTM1LCAgLTAuMDAwMDA3OTIxMjc4NywgLTAuMDAwMDA0MTcxMjAyNCwKKyAgICAgIC0wLjAwMDAwMjYzMzY2MjksIC0wLjAwMDAwMTU0MzI5MTgsIC01LjcxNjg2MTRlLTcsICAgICAwLjAwMDAwMTgxMTE5NTQsCisgICAgICAgMC4wMDAwMjM1MzA4NTEsICAgMC4wMDAwMjc4MDU2MiwgICAgMC4wMDAwMzIzMDIzMjMsICAgMC4wMDAwMzY5Njg5MTksCisgICAgICAgMC4wMDAwNDE1NzU2MTUsICAgMC4wMDAwNDUzMzc4NDUsICAgMC4wMDAwNDYwNDM5NDgsICAgMC4wMDAwNDg1ODU1ODIgfSwKKyAgICB7IC0wLjAwMDA2NDQ2NDU0OCwgIC0wLjAwMDA2ODMwNjk1MiwgIC0wLjAwMDA3MzA4MTQ3MiwgIC0wLjAwMDA3NjEyNzg1LAorICAgICAgLTAuMDAwMDc0ODUwNzUyLCAgLTAuMDAwMDcwMjA4NTA5LCAgLTAuMDAwMDYyMjg1MTUxLCAgLTAuMDAwMDU4MjcwNDQyLAorICAgICAgLTAuMDAwMDU2Mjk2MzI5LCAgLTAuMDAwMDQ5ODg4ODExLCAgLTAuMDAwMDM1NjE1MzI1LCAgLTAuMDAwMDE4NTMyOTQzLAorICAgICAgIDAuMDAwMDAxNjY1NzM1MywgIDAuMDAwMDI2MTA1ODcsICAgIDAuMDAwMDUzMzk3MDY3LCAgIDAuMDAwMDgwNzk1NjYgfSwKKyAgICB7IC0wLjAwMDU0NDg4NTUyLCAgIC0wLjAwMDUyNTM3MjI4LCAgIC0wLjAwMDQ5NzMxMjg3LCAgIC0wLjAwMDQ1Nzc4LAorICAgICAgLTAuMDAwNDA2MTIzODcsICAgLTAuMDAwMzQzMDE1NzcsICAgLTAuMDAwMjY4NjYzMzcsICAgLTAuMDAwMTgyNDg5MDEsCisgICAgICAtMC4wMDAwODQzMDc5MjUsICAgMC4wMDAwMjUwODExNTcsICAgMC4wMDAxNDEzNTU4MywgICAgMC4wMDAyNjY0OTk1MywKKyAgICAgICAwLjAwMDM5OTQ1MDU3LCAgICAwLjAwMDUzOTI4NDQ5LCAgICAwLjAwMDY4NDIyODY3LCAgICAwLjAwMDgzMDkzNzEyIH0sCisgICAgeyAtMC4wMDE0NzcxNDMxLCAgICAtMC4wMDEyODMyMjcsICAgICAtMC4wMDEwNTY2ODIxLCAgICAtMC4wMDA3OTc4MDcyNCwKKyAgICAgIC0wLjAwMDUwNzgyNDA2LCAgIC0wLjAwMDE4ODU1OTEzLCAgICAwLjAwMDE1NzcxNTMzLCAgICAwLjAwMDUyNzY5NDUzLAorICAgICAgIDAuMDAwOTE4NjIyMTksICAgIDAuMDAxMzI2MzU3LCAgICAgIDAuMDAxNzQ2OTQ4MywgICAgIDAuMDAyMTc1NDgyNSwKKyAgICAgICAwLjAwMjYwNjc2ODQsICAgICAwLjAwMzAzNTI4OTIsICAgICAwLjAwMzQ1NDkzOTUsICAgICAwLjAwMzg1OTEzNzQgfSwKKyAgICB7IC0wLjAwMjI5OTUxNDEsICAgIC0wLjAwMTQ0MzU0NiwgICAgIC0wLjAwMDQ5MjY2NTY4LCAgICAwLjAwMDU1MDY4OTg3LAorICAgICAgIDAuMDAxNjgyODk1LCAgICAgIDAuMDAyODk5Mjg3MywgICAgIDAuMDA0MTk0MzE1MSwgICAgIDAuMDA1NTYxNDczOCwKKyAgICAgICAwLjAwNjk5MzUxMjIsICAgICAwLjAwODQ4MjM1NjYsICAgICAwLjAxMDAxODk2MywgICAgICAwLjAxMTU5Mzg2MiwKKyAgICAgICAwLjAxMzE5Njg3MiwgICAgICAwLjAxNDgxNzMwOSwgICAgICAwLjAxNjQ0NDA0MiwgICAgICAwLjAxODA2NTUzMyB9LAorICAgIHsgLTAuMDM0NDI2MjgzLCAgICAgLTAuMDM0MjgxNDM2LCAgICAgLTAuMDMzOTkyOTg3LCAgICAgLTAuMDMzNTYzMjQ5LAorICAgICAgLTAuMDMyOTk1NzY4LCAgICAgLTAuMDMyMjk1MjI3LCAgICAgLTAuMDMxNDY3MzYzLCAgICAgLTAuMDMwNTE4OTAyLAorICAgICAgLTAuMDI5NDU3NjYsICAgICAgLTAuMDI4MjkxOTU0LCAgICAgLTAuMDI3MDMxMjY1LCAgICAgLTAuMDI1Njg1NTQzLAorICAgICAgLTAuMDI0MjY1MzU4LCAgICAgLTAuMDIyNzgxNzczLCAgICAgLTAuMDIxMjQ2MTg0LCAgICAgLTAuMDE5NjcwMTYyIH0sCisgICAgeyAtMC4wMDMwNTg2Nzc1LCAgICAtMC4wMDM3MjAzMjA1LCAgICAtMC4wMDQyODQ3ODQ3LCAgICAtMC4wMDQ3NTI5NzY0LAorICAgICAgLTAuMDA1MTI2ODMxNiwgICAgLTAuMDA1NDA5MTQ3NiwgICAgLTAuMDA1NjAzNDIzMywgICAgLTAuMDA1NzE0MjYxLAorICAgICAgLTAuMDA1NzQ0NTg2MiwgICAgLTAuMDA1NzAyNTkwNiwgICAgLTAuMDA1NTkyMDEwOSwgICAgLTAuMDA1NDE5NDg0MywKKyAgICAgIC0wLjAwNTE5MTQ1NjUsICAgIC0wLjAwNDkxNDY1MDcsICAgIC0wLjAwNDU5NTk0NDcsICAgIC0wLjAwNDI0MTgyNjkgfSwKKyAgICB7IC0wLjAwMTYzNzY4NjMsICAgIC0wLjAwMTc2NTE4OTksICAgIC0wLjAwMTg2MDg0NTQsICAgIC0wLjAwMTkyNTIxNDEsCisgICAgICAtMC4wMDE5NTkzNzkxLCAgICAtMC4wMDE5NjUzMTcyLCAgICAtMC4wMDE5NDUwNjE4LCAgICAtMC4wMDE4OTkwMDQ4LAorICAgICAgLTAuMDAxODM4MDgsICAgICAgLTAuMDAxNzUwMTcxNywgICAgLTAuMDAxNjQ4MTA3OCwgICAgLTAuMDAxNTMyMDc0MiwKKyAgICAgIC0wLjAwMTQwNDY5MDMsICAgIC0wLjAwMTI2ODU0NzQsICAgIC0wLjAwMTEyNTgxNCwgICAgIC0wLjAwMDk3OTQzNzI2IH0sCisgICAgeyAtMC4wMDA1NTQzMjM3OCwgICAtMC4wMDA1NTQ3MjkyNSwgICAtMC4wMDA1NDc4MzQ2MSwgICAtMC4wMDA1MzI3NjkxOSwKKyAgICAgIC0wLjAwMDUxMTM1NzkxLCAgIC0wLjAwMDQ4NDY2MDYyLCAgIC0wLjAwMDQ1MzU4OTI4LCAgIC0wLjAwMDQyNDk5Njg5LAorICAgICAgLTAuMDAwMzY5NDI2NzEsICAgLTAuMDAwMzM5MjYxOSwgICAgLTAuMDAwMzAwMDE3ODMsICAgLTAuMDAwMjU5ODYzMDQsCisgICAgICAtMC4wMDAyMTk3MjA0LCAgICAtMC4wMDAxODExNjE2NywgICAtMC4wMDAxNDY5MTM1NSwgICAtMC4wMDAxMTI3OTQzMiB9LAorICAgIHsgLTAuMDAwMDY0MTQ3Mzg5LCAgLTAuMDAwMDYxNzQ4NjgsICAgLTAuMDAwMDU0MjY3Nzg4LCAgLTAuMDAwMDQ3MTMzODI0LAorICAgICAgLTAuMDAwMDQyOTI3NTgyLCAgLTAuMDAwMDM5NDc3MzA5LCAgLTAuMDAwMDM2MzQwNzQ1LCAgLTAuMDAwMDI5Njg3NTE3LAorICAgICAgLTAuMDAwMDQ5Nzg3NzM3LCAgLTAuMDAwMDQxNTc3ODg5LCAgLTAuMDAwMDMzODY0NzQ0LCAgLTAuMDAwMDI2NTM0NzQ4LAorICAgICAgLTAuMDAwMDE5ODQxMzA1LCAgLTAuMDAwMDE0Nzg5NDg2LCAgLTAuMDAwMDEzMTMxMTg0LCAgLTAuMDAwMDA5OTE5ODg2OSB9LAorICAgIHsgLTAuMDAwMDA2Mjk5MDIwNywgLTAuMDAwMDA3MjcwMTI1OSwgLTAuMDAwMDExOTg0MDUyLCAgLTAuMDAwMDE3MzQ4MDgyLAorICAgICAgLTAuMDAwMDE5OTA3MTA2LCAgLTAuMDAwMDIxMzQ4NzczLCAgLTAuMDAwMDIxOTYxOTY1LCAgLTAuMDAwMDEyMjAzNTc2LAorICAgICAgLTAuMDAwMDEwODQwOTkyLCAgIDQuNjI5OTU0NGUtNywgICAgIDUuMjU4ODc2M2UtNywgICAgIDIuNzc5MjY4NmUtNywKKyAgICAgIC0yLjM2NDk3MDRlLTcsICAgIC0wLjAwMDAwMTA4OTc3ODQsIC05LjE3MTQ0OGUtNywgICAgIC01LjIyNjgyZS03IH0KK307CisKKy8qIFNlY29uZCBoYWxmIG9mIHRoZSAzODQtdGFwIElQUUYgZmlsdGVyaW5nIGNvZWZmaWNpZW50cy4gKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBpcHFmX2NvZWZmczJbQVRSQUMzUF9QUUZfRklSX0xFTl1bMTZdID0geworICAgIHsgIDUuMjI2ODJlLTcsICAgICAgIDkuMTcxNDQ4ZS03LCAgICAgIDAuMDAwMDAxMDg5Nzc4NCwgIDIuMzY0OTcwNGUtNywKKyAgICAgIC0yLjc3OTI2ODZlLTcsICAgIC01LjI1ODg3NjNlLTcsICAgIC00LjYyOTk1NDRlLTcsICAgICAwLjAwMDAxMDg0MDk5MiwKKyAgICAgIC0wLjAwMDAxMjIwMzU3NiwgIC0wLjAwMDAyMTk2MTk2NSwgIC0wLjAwMDAyMTM0ODc3MywgIC0wLjAwMDAxOTkwNzEwNiwKKyAgICAgIC0wLjAwMDAxNzM0ODA4MiwgIC0wLjAwMDAxMTk4NDA1MiwgIC0wLjAwMDAwNzI3MDEyNTksIC0wLjAwMDAwNjI5OTAyMDcgfSwKKyAgICB7ICAwLjAwMDAwOTkxOTg4NjksICAwLjAwMDAxMzEzMTE4NCwgICAwLjAwMDAxNDc4OTQ4NiwgICAwLjAwMDAxOTg0MTMwNSwKKyAgICAgICAwLjAwMDAyNjUzNDc0OCwgICAwLjAwMDAzMzg2NDc0NCwgICAwLjAwMDA0MTU3Nzg4OSwgICAwLjAwMDA0OTc4NzczNywKKyAgICAgIC0wLjAwMDAyOTY4NzUxNywgIC0wLjAwMDAzNjM0MDc0NSwgIC0wLjAwMDAzOTQ3NzMwOSwgIC0wLjAwMDA0MjkyNzU4MiwKKyAgICAgIC0wLjAwMDA0NzEzMzgyNCwgIC0wLjAwMDA1NDI2Nzc4OCwgIC0wLjAwMDA2MTc0ODY4LCAgIC0wLjAwMDA2NDE0NzM4OSB9LAorICAgIHsgIDAuMDAwMTEyNzk0MzIsICAgIDAuMDAwMTQ2OTEzNTUsICAgIDAuMDAwMTgxMTYxNjcsICAgIDAuMDAwMjE5NzIwNCwKKyAgICAgICAwLjAwMDI1OTg2MzA0LCAgICAwLjAwMDMwMDAxNzgzLCAgICAwLjAwMDMzOTI2MTksICAgICAwLjAwMDM2OTQyNjcxLAorICAgICAgLTAuMDAwNDI0OTk2ODksICAgLTAuMDAwNDUzNTg5MjgsICAgLTAuMDAwNDg0NjYwNjIsICAgLTAuMDAwNTExMzU3OTEsCisgICAgICAtMC4wMDA1MzI3NjkxOSwgICAtMC4wMDA1NDc4MzQ2MSwgICAtMC4wMDA1NTQ3MjkyNSwgICAtMC4wMDA1NTQzMjM3OCB9LAorICAgIHsgIDAuMDAwOTc5NDM3MjYsICAgIDAuMDAxMTI1ODE0LCAgICAgIDAuMDAxMjY4NTQ3NCwgICAgIDAuMDAxNDA0NjkwMywKKyAgICAgICAwLjAwMTUzMjA3NDIsICAgICAwLjAwMTY0ODEwNzgsICAgICAwLjAwMTc1MDE3MTcsICAgICAwLjAwMTgzODA4LAorICAgICAgLTAuMDAxODk5MDA0OCwgICAgLTAuMDAxOTQ1MDYxOCwgICAgLTAuMDAxOTY1MzE3MiwgICAgLTAuMDAxOTU5Mzc5MSwKKyAgICAgIC0wLjAwMTkyNTIxNDEsICAgIC0wLjAwMTg2MDg0NTQsICAgIC0wLjAwMTc2NTE4OTksICAgIC0wLjAwMTYzNzY4NjMgfSwKKyAgICB7ICAwLjAwNDI0MTgyNjksICAgICAwLjAwNDU5NTk0NDcsICAgICAwLjAwNDkxNDY1MDcsICAgICAwLjAwNTE5MTQ1NjUsCisgICAgICAgMC4wMDU0MTk0ODQzLCAgICAgMC4wMDU1OTIwMTA5LCAgICAgMC4wMDU3MDI1OTA2LCAgICAgMC4wMDU3NDQ1ODYyLAorICAgICAgLTAuMDA1NzE0MjYxLCAgICAgLTAuMDA1NjAzNDIzMywgICAgLTAuMDA1NDA5MTQ3NiwgICAgLTAuMDA1MTI2ODMxNiwKKyAgICAgIC0wLjAwNDc1Mjk3NjQsICAgIC0wLjAwNDI4NDc4NDcsICAgIC0wLjAwMzcyMDMyMDUsICAgIC0wLjAwMzA1ODY3NzUgfSwKKyAgICB7ICAwLjAxOTY3MDE2MiwgICAgICAwLjAyMTI0NjE4NCwgICAgICAwLjAyMjc4MTc3MywgICAgICAwLjAyNDI2NTM1OCwKKyAgICAgICAwLjAyNTY4NTU0MywgICAgICAwLjAyNzAzMTI2NSwgICAgICAwLjAyODI5MTk1NCwgICAgICAwLjAyOTQ1NzY2LAorICAgICAgLTAuMDMwNTE4OTAyLCAgICAgLTAuMDMxNDY3MzYzLCAgICAgLTAuMDMyMjk1MjI3LCAgICAgLTAuMDMyOTk1NzY4LAorICAgICAgLTAuMDMzNTYzMjQ5LCAgICAgLTAuMDMzOTkyOTg3LCAgICAgLTAuMDM0MjgxNDM2LCAgICAgLTAuMDM0NDI2MjgzIH0sCisgICAgeyAtMC4wMTgwNjU1MzMsICAgICAtMC4wMTY0NDQwNDIsICAgICAtMC4wMTQ4MTczMDksICAgICAtMC4wMTMxOTY4NzIsCisgICAgICAtMC4wMTE1OTM4NjIsICAgICAtMC4wMTAwMTg5NjMsICAgICAtMC4wMDg0ODIzNTY2LCAgICAtMC4wMDY5OTM1MTIyLAorICAgICAgIDAuMDA1NTYxNDczOCwgICAgIDAuMDA0MTk0MzE1MSwgICAgIDAuMDAyODk5Mjg3MywgICAgIDAuMDAxNjgyODk1LAorICAgICAgIDAuMDAwNTUwNjg5ODcsICAgLTAuMDAwNDkyNjY1NjgsICAgLTAuMDAxNDQzNTQ2LCAgICAgLTAuMDAyMjk5NTE0MSB9LAorICAgIHsgLTAuMDAzODU5MTM3NCwgICAgLTAuMDAzNDU0OTM5NSwgICAgLTAuMDAzMDM1Mjg5MiwgICAgLTAuMDAyNjA2NzY4NCwKKyAgICAgIC0wLjAwMjE3NTQ4MjUsICAgIC0wLjAwMTc0Njk0ODMsICAgIC0wLjAwMTMyNjM1NywgICAgIC0wLjAwMDkxODYyMjE5LAorICAgICAgIDAuMDAwNTI3Njk0NTMsICAgIDAuMDAwMTU3NzE1MzMsICAgLTAuMDAwMTg4NTU5MTMsICAgLTAuMDAwNTA3ODI0MDYsCisgICAgICAtMC4wMDA3OTc4MDcyNCwgICAtMC4wMDEwNTY2ODIxLCAgICAtMC4wMDEyODMyMjcsICAgICAtMC4wMDE0NzcxNDMxIH0sCisgICAgeyAtMC4wMDA4MzA5MzcxMiwgICAtMC4wMDA2ODQyMjg2NywgICAtMC4wMDA1MzkyODQ0OSwgICAtMC4wMDAzOTk0NTA1NywKKyAgICAgIC0wLjAwMDI2NjQ5OTUzLCAgIC0wLjAwMDE0MTM1NTgzLCAgIC0wLjAwMDAyNTA4MTE1NywgICAwLjAwMDA4NDMwNzkyNSwKKyAgICAgIC0wLjAwMDE4MjQ4OTAxLCAgIC0wLjAwMDI2ODY2MzM3LCAgIC0wLjAwMDM0MzAxNTc3LCAgIC0wLjAwMDQwNjEyMzg3LAorICAgICAgLTAuMDAwNDU3NzgsICAgICAgLTAuMDAwNDk3MzEyODcsICAgLTAuMDAwNTI1MzcyMjgsICAgLTAuMDAwNTQ0ODg1NTIgfSwKKyAgICB7IC0wLjAwMDA4MDc5NTY2LCAgIC0wLjAwMDA1MzM5NzA2NywgIC0wLjAwMDAyNjEwNTg3LCAgIC0wLjAwMDAwMTY2NTczNTMsCisgICAgICAgMC4wMDAwMTg1MzI5NDMsICAgMC4wMDAwMzU2MTUzMjUsICAgMC4wMDAwNDk4ODg4MTEsICAgMC4wMDAwNTYyOTYzMjksCisgICAgICAtMC4wMDAwNTgyNzA0NDIsICAtMC4wMDAwNjIyODUxNTEsICAtMC4wMDAwNzAyMDg1MDksICAtMC4wMDAwNzQ4NTA3NTIsCisgICAgICAtMC4wMDAwNzYxMjc4NSwgICAtMC4wMDAwNzMwODE0NzIsICAtMC4wMDAwNjgzMDY5NTIsICAtMC4wMDAwNjQ0NjQ1NDggfSwKKyAgICB7IC0wLjAwMDA0ODU4NTU4MiwgIC0wLjAwMDA0NjA0Mzk0OCwgIC0wLjAwMDA0NTMzNzg0NSwgIC0wLjAwMDA0MTU3NTYxNSwKKyAgICAgIC0wLjAwMDAzNjk2ODkxOSwgIC0wLjAwMDAzMjMwMjMyMywgIC0wLjAwMDAyNzgwNTYyLCAgIC0wLjAwMDAyMzUzMDg1MSwKKyAgICAgICAwLjAwMDAwMTgxMTE5NTQsIC01LjcxNjg2MTRlLTcsICAgIC0wLjAwMDAwMTU0MzI5MTgsIC0wLjAwMDAwMjYzMzY2MjksCisgICAgICAtMC4wMDAwMDQxNzEyMDI0LCAtMC4wMDAwMDc5MjEyNzg3LCAtMC4wMDAwMTA1MDI5MzUsICAtMC4wMDAwMDkxNjIyODI0IH0sCisgICAgeyAtMC4wMDAwMDcwMzAyOTcyLCAtMC4wMDAwMDYzODk0MjU4LCAtMC4wMDAwMDQ2MTkyNDIyLCAtMC4wMDAwMDMyNTY5NzQyLAorICAgICAgLTAuMDAwMDAyMzEwODY4NSwgLTAuMDAwMDAxNDMzMzc1NCwgLTYuMDA1Mzg5ZS03LCAgICAgIDAuMDAwMDExODM4NjE4LAorICAgICAgIDAuMDAwMDEwNTE2NzgzLCAgIDEuMjY2MDM3N2UtOCwgICAgIDMuNTMwODU2ZS04LCAgICAgIDMuMjI2MjQ3ZS04LAorICAgICAgLTQuNDQwMDU3MmUtOCwgICAgLTQuMjAwNTQxMWUtNywgICAgLTguMDYwNDIyOWUtNywgICAgLTUuODMzNjIwN2UtNyB9Cit9OworCit2b2lkIGZmX2F0cmFjM3BfaXBxZihGRlRDb250ZXh0ICpkY3RfY3R4LCBBdHJhYzNwSVBRRkNoYW5uZWxDdHggKmhpc3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW4sIGZsb2F0ICpvdXQpCit7CisgICAgaW50IGksIHMsIHNiLCB0LCBwb3Nfbm93LCBwb3NfbmV4dDsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBpZGN0X2luKVtBVFJBQzNQX1NVQkJBTkRTXTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBpZGN0X291dClbQVRSQUMzUF9TVUJCQU5EU107CisKKyAgICBtZW1zZXQob3V0LCAwLCBBVFJBQzNQX0ZSQU1FX1NBTVBMRVMgKiBzaXplb2YoKm91dCkpOworCisgICAgZm9yIChzID0gMDsgcyA8IEFUUkFDM1BfU1VCQkFORF9TQU1QTEVTOyBzKyspIHsKKyAgICAgICAgLyogcGljayB1cCBvbmUgc2FtcGxlIGZyb20gZWFjaCBzdWJiYW5kICovCisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IEFUUkFDM1BfU1VCQkFORFM7IHNiKyspCisgICAgICAgICAgICBpZGN0X2luW3NiXSA9IGluW3NiICogQVRSQUMzUF9TVUJCQU5EX1NBTVBMRVMgKyBzXTsKKworICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIHNpbmUgYW5kIGNvc2luZSBwYXJ0IG9mIHRoZSBQUUYgdXNpbmcgSURDVC1JViAqLworICAgICAgICBkY3RfY3R4LT5pbWRjdF9oYWxmKGRjdF9jdHgsIGlkY3Rfb3V0LCBpZGN0X2luKTsKKworICAgICAgICAvKiBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUgaGlzdG9yeSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBoaXN0LT5idWYxW2hpc3QtPnBvc11baV0gPSBpZGN0X291dFtpICsgOF07CisgICAgICAgICAgICBoaXN0LT5idWYyW2hpc3QtPnBvc11baV0gPSBpZGN0X291dFs3IC0gaV07CisgICAgICAgIH0KKworICAgICAgICBwb3Nfbm93ICA9IGhpc3QtPnBvczsKKyAgICAgICAgcG9zX25leHQgPSBtb2QyM19sdXRbcG9zX25vdyArIDJdOyAvLyBwb3NfbmV4dCA9IChwb3Nfbm93ICsgMSkgJSAyMzsKKworICAgICAgICBmb3IgKHQgPSAwOyB0IDwgQVRSQUMzUF9QUUZfRklSX0xFTjsgdCsrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgICAgb3V0W3MgKiAxNiArIGkgKyAwXSArPSBoaXN0LT5idWYxW3Bvc19ub3ddW2ldICAqIGlwcWZfY29lZmZzMVt0XVtpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0LT5idWYyW3Bvc19uZXh0XVtpXSAqIGlwcWZfY29lZmZzMlt0XVtpXTsKKyAgICAgICAgICAgICAgICBvdXRbcyAqIDE2ICsgaSArIDhdICs9IGhpc3QtPmJ1ZjFbcG9zX25vd11bNyAtIGldICAqIGlwcWZfY29lZmZzMVt0XVtpICsgOF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdC0+YnVmMltwb3NfbmV4dF1bNyAtIGldICogaXBxZl9jb2VmZnMyW3RdW2kgKyA4XTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9zX25vdyAgPSBtb2QyM19sdXRbcG9zX25leHQgKyAyXTsgLy8gcG9zX25vdyAgPSAocG9zX25vdyAgKyAyKSAlIDIzOworICAgICAgICAgICAgcG9zX25leHQgPSBtb2QyM19sdXRbcG9zX25vdyArIDJdOyAgLy8gcG9zX25leHQgPSAocG9zX25leHQgKyAyKSAlIDIzOworICAgICAgICB9CisKKyAgICAgICAgaGlzdC0+cG9zID0gbW9kMjNfbHV0W2hpc3QtPnBvc107IC8vIGhpc3QtPnBvcyA9IChoaXN0LT5wb3MgLSAxKSAlIDIzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F1ZGlvX2ZyYW1lX3F1ZXVlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hdWRpb19mcmFtZV9xdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNmJjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdWRpb19mcmFtZV9xdWV1ZS5jCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQXVkaW8gRnJhbWUgUXVldWUKKyAqIENvcHlyaWdodCAoYykgMjAxMiBKdXN0aW4gUnVnZ2xlcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAiYXVkaW9fZnJhbWVfcXVldWUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorCithdl9jb2xkIHZvaWQgZmZfYWZfcXVldWVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEF1ZGlvRnJhbWVRdWV1ZSAqYWZxKQoreworICAgIGFmcS0+YXZjdHggPSBhdmN0eDsKKyAgICBhZnEtPnJlbWFpbmluZ19kZWxheSAgID0gYXZjdHgtPmluaXRpYWxfcGFkZGluZzsKKyAgICBhZnEtPnJlbWFpbmluZ19zYW1wbGVzID0gYXZjdHgtPmluaXRpYWxfcGFkZGluZzsKKyAgICBhZnEtPmZyYW1lX2NvdW50ICAgICAgID0gMDsKK30KKwordm9pZCBmZl9hZl9xdWV1ZV9jbG9zZShBdWRpb0ZyYW1lUXVldWUgKmFmcSkKK3sKKyAgICBpZihhZnEtPmZyYW1lX2NvdW50KQorICAgICAgICBhdl9sb2coYWZxLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICIlZCBmcmFtZXMgbGVmdCBpbiB0aGUgcXVldWUgb24gY2xvc2luZ1xuIiwgYWZxLT5mcmFtZV9jb3VudCk7CisgICAgYXZfZnJlZXAoJmFmcS0+ZnJhbWVzKTsKKyAgICBtZW1zZXQoYWZxLCAwLCBzaXplb2YoKmFmcSkpOworfQorCitpbnQgZmZfYWZfcXVldWVfYWRkKEF1ZGlvRnJhbWVRdWV1ZSAqYWZxLCBjb25zdCBBVkZyYW1lICpmKQoreworICAgIEF1ZGlvRnJhbWUgKm5ldyA9IGF2X2Zhc3RfcmVhbGxvYyhhZnEtPmZyYW1lcywgJmFmcS0+ZnJhbWVfYWxsb2MsIHNpemVvZigqYWZxLT5mcmFtZXMpKihhZnEtPmZyYW1lX2NvdW50KzEpKTsKKyAgICBpZighbmV3KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGFmcS0+ZnJhbWVzID0gbmV3OworICAgIG5ldyArPSBhZnEtPmZyYW1lX2NvdW50OworCisgICAgLyogZ2V0IGZyYW1lIHBhcmFtZXRlcnMgKi8KKyAgICBuZXctPmR1cmF0aW9uID0gZi0+bmJfc2FtcGxlczsKKyAgICBuZXctPmR1cmF0aW9uICs9IGFmcS0+cmVtYWluaW5nX2RlbGF5OworICAgIGlmIChmLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgbmV3LT5wdHMgPSBhdl9yZXNjYWxlX3EoZi0+cHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnEtPmF2Y3R4LT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgYWZxLT5hdmN0eC0+c2FtcGxlX3JhdGUgfSk7CisgICAgICAgIG5ldy0+cHRzIC09IGFmcS0+cmVtYWluaW5nX2RlbGF5OworICAgICAgICBpZihhZnEtPmZyYW1lX2NvdW50ICYmIG5ld1stMV0ucHRzID49IG5ldy0+cHRzKQorICAgICAgICAgICAgYXZfbG9nKGFmcS0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiUXVldWUgaW5wdXQgaXMgYmFja3dhcmQgaW4gdGltZVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3LT5wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICB9CisgICAgYWZxLT5yZW1haW5pbmdfZGVsYXkgPSAwOworCisgICAgLyogYWRkIGZyYW1lIHNhbXBsZSBjb3VudCAqLworICAgIGFmcS0+cmVtYWluaW5nX3NhbXBsZXMgKz0gZi0+bmJfc2FtcGxlczsKKworICAgIGFmcS0+ZnJhbWVfY291bnQrKzsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX2FmX3F1ZXVlX3JlbW92ZShBdWRpb0ZyYW1lUXVldWUgKmFmcSwgaW50IG5iX3NhbXBsZXMsIGludDY0X3QgKnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZHVyYXRpb24pCit7CisgICAgaW50NjRfdCBvdXRfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgaW50IHJlbW92ZWRfc2FtcGxlcyA9IDA7CisgICAgaW50IGk7CisKKyAgICBpZiAoYWZxLT5mcmFtZV9jb3VudCB8fCBhZnEtPmZyYW1lX2FsbG9jKSB7CisgICAgICAgIGlmIChhZnEtPmZyYW1lcy0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgb3V0X3B0cyA9IGFmcS0+ZnJhbWVzLT5wdHM7CisgICAgfQorICAgIGlmKCFhZnEtPmZyYW1lX2NvdW50KQorICAgICAgICBhdl9sb2coYWZxLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUcnlpbmcgdG8gcmVtb3ZlICVkIHNhbXBsZXMsIGJ1dCB0aGUgcXVldWUgaXMgZW1wdHlcbiIsIG5iX3NhbXBsZXMpOworICAgIGlmIChwdHMpCisgICAgICAgICpwdHMgPSBmZl9zYW1wbGVzX3RvX3RpbWVfYmFzZShhZnEtPmF2Y3R4LCBvdXRfcHRzKTsKKworICAgIGZvcihpPTA7IG5iX3NhbXBsZXMgJiYgaTxhZnEtPmZyYW1lX2NvdW50OyBpKyspeworICAgICAgICBpbnQgbj0gRkZNSU4oYWZxLT5mcmFtZXNbaV0uZHVyYXRpb24sIG5iX3NhbXBsZXMpOworICAgICAgICBhZnEtPmZyYW1lc1tpXS5kdXJhdGlvbiAtPSBuOworICAgICAgICBuYl9zYW1wbGVzICAgICAgICAgICAgICAtPSBuOworICAgICAgICByZW1vdmVkX3NhbXBsZXMgICAgICAgICArPSBuOworICAgICAgICBpZihhZnEtPmZyYW1lc1tpXS5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBhZnEtPmZyYW1lc1tpXS5wdHMgICAgICArPSBuOworICAgIH0KKyAgICBhZnEtPnJlbWFpbmluZ19zYW1wbGVzIC09IHJlbW92ZWRfc2FtcGxlczsKKyAgICBpIC09IGkgJiYgYWZxLT5mcmFtZXNbaS0xXS5kdXJhdGlvbjsKKyAgICBtZW1tb3ZlKGFmcS0+ZnJhbWVzLCBhZnEtPmZyYW1lcyArIGksIHNpemVvZigqYWZxLT5mcmFtZXMpICogKGFmcS0+ZnJhbWVfY291bnQgLSBpKSk7CisgICAgYWZxLT5mcmFtZV9jb3VudCAtPSBpOworCisgICAgaWYobmJfc2FtcGxlcyl7CisgICAgICAgIGF2X2Fzc2VydDAoIWFmcS0+ZnJhbWVfY291bnQpOworICAgICAgICBhdl9hc3NlcnQwKGFmcS0+cmVtYWluaW5nX3NhbXBsZXMgPT0gYWZxLT5yZW1haW5pbmdfZGVsYXkpOworICAgICAgICBpZihhZnEtPmZyYW1lcyAmJiBhZnEtPmZyYW1lc1swXS5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBhZnEtPmZyYW1lc1swXS5wdHMgKz0gbmJfc2FtcGxlczsKKyAgICAgICAgYXZfbG9nKGFmcS0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlRyeWluZyB0byByZW1vdmUgJWQgbW9yZSBzYW1wbGVzIHRoYW4gdGhlcmUgYXJlIGluIHRoZSBxdWV1ZVxuIiwgbmJfc2FtcGxlcyk7CisgICAgfQorICAgIGlmIChkdXJhdGlvbikKKyAgICAgICAgKmR1cmF0aW9uID0gZmZfc2FtcGxlc190b190aW1lX2Jhc2UoYWZxLT5hdmN0eCwgcmVtb3ZlZF9zYW1wbGVzKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F1ZGlvX2ZyYW1lX3F1ZXVlLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hdWRpb19mcmFtZV9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMzE3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdWRpb19mcmFtZV9xdWV1ZS5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBBdWRpbyBGcmFtZSBRdWV1ZQorICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19BVURJT19GUkFNRV9RVUVVRV9ICisjZGVmaW5lIEFWQ09ERUNfQVVESU9fRlJBTUVfUVVFVUVfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCit0eXBlZGVmIHN0cnVjdCBBdWRpb0ZyYW1lIHsKKyAgICBpbnQ2NF90IHB0czsKKyAgICBpbnQgZHVyYXRpb247Cit9IEF1ZGlvRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IEF1ZGlvRnJhbWVRdWV1ZSB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGludCByZW1haW5pbmdfZGVsYXk7CisgICAgaW50IHJlbWFpbmluZ19zYW1wbGVzOworICAgIEF1ZGlvRnJhbWUgKmZyYW1lczsKKyAgICB1bnNpZ25lZCBmcmFtZV9jb3VudDsKKyAgICB1bnNpZ25lZCBmcmFtZV9hbGxvYzsKK30gQXVkaW9GcmFtZVF1ZXVlOworCisvKioKKyAqIEluaXRpYWxpemUgQXVkaW9GcmFtZVF1ZXVlLgorICoKKyAqIEBwYXJhbSBhdmN0eCBjb250ZXh0IHRvIHVzZSBmb3IgdGltZV9iYXNlIGFuZCBhdl9sb2cKKyAqIEBwYXJhbSBhZnEgICBxdWV1ZSBjb250ZXh0CisgKi8KK3ZvaWQgZmZfYWZfcXVldWVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEF1ZGlvRnJhbWVRdWV1ZSAqYWZxKTsKKworLyoqCisgKiBDbG9zZSBBdWRpb0ZyYW1lUXVldWUuCisgKgorICogRnJlZXMgbWVtb3J5IGlmIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gYWZxIHF1ZXVlIGNvbnRleHQKKyAqLwordm9pZCBmZl9hZl9xdWV1ZV9jbG9zZShBdWRpb0ZyYW1lUXVldWUgKmFmcSk7CisKKy8qKgorICogQWRkIGEgZnJhbWUgdG8gdGhlIHF1ZXVlLgorICoKKyAqIEBwYXJhbSBhZnEgcXVldWUgY29udGV4dAorICogQHBhcmFtIGYgICBmcmFtZSB0byBhZGQgdG8gdGhlIHF1ZXVlCisgKi8KK2ludCBmZl9hZl9xdWV1ZV9hZGQoQXVkaW9GcmFtZVF1ZXVlICphZnEsIGNvbnN0IEFWRnJhbWUgKmYpOworCisvKioKKyAqIFJlbW92ZSBmcmFtZShzKSBmcm9tIHRoZSBxdWV1ZS4KKyAqCisgKiBSZXRyaWV2ZXMgdGhlIHB0cyBvZiB0aGUgbmV4dCBhdmFpbGFibGUgZnJhbWUsIG9yIGEgZ2VuZXJhdGVkIHB0cyBiYXNlZCBvbgorICogdGhlIGxhc3QgZnJhbWUgZHVyYXRpb24gaWYgdGhlcmUgYXJlIG5vIGZyYW1lcyBsZWZ0IGluIHRoZSBxdWV1ZS4gVGhlIG51bWJlcgorICogb2YgcmVxdWVzdGVkIHNhbXBsZXMgc2hvdWxkIGJlIHRoZSBmdWxsIG51bWJlciBvZiBzYW1wbGVzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogcGFja2V0IHRoYXQgd2lsbCBiZSBvdXRwdXQgYnkgdGhlIGVuY29kZXIuIElmIGZld2VyIHNhbXBsZXMgYXJlIGF2YWlsYWJsZQorICogaW4gdGhlIHF1ZXVlLCBhIHNtYWxsZXIgdmFsdWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgb3V0cHV0IGR1cmF0aW9uLgorICoKKyAqIEBwYXJhbSBhZnEgICAgICAgICAgIHF1ZXVlIGNvbnRleHQKKyAqIEBwYXJhbSBuYl9zYW1wbGVzICAgIG51bWJlciBvZiBzYW1wbGVzIHRvIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZQorICogQHBhcmFtW291dF0gcHRzICAgICAgb3V0cHV0IHBhY2tldCBwdHMKKyAqIEBwYXJhbVtvdXRdIGR1cmF0aW9uIG91dHB1dCBwYWNrZXQgZHVyYXRpb24KKyAqLwordm9pZCBmZl9hZl9xdWV1ZV9yZW1vdmUoQXVkaW9GcmFtZVF1ZXVlICphZnEsIGludCBuYl9zYW1wbGVzLCBpbnQ2NF90ICpwdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmR1cmF0aW9uKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQVVESU9fRlJBTUVfUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXVkaW9jb252ZXJ0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hdWRpb2NvbnZlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ2ZmFlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXVkaW9jb252ZXJ0LmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBhdWRpbyBjb252ZXJzaW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogYXVkaW8gY29udmVyc2lvbgorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImF1ZGlvY29udmVydC5oIgorCisjaWYgRkZfQVBJX0FVRElPX0NPTlZFUlQKKworc3RydWN0IEFWQXVkaW9Db252ZXJ0IHsKKyAgICBpbnQgaW5fY2hhbm5lbHMsIG91dF9jaGFubmVsczsKKyAgICBpbnQgZm10X3BhaXI7Cit9OworCitBVkF1ZGlvQ29udmVydCAqYXZfYXVkaW9fY29udmVydF9hbGxvYyhlbnVtIEFWU2FtcGxlRm9ybWF0IG91dF9mbXQsIGludCBvdXRfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGluX2ZtdCwgaW50IGluX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKm1hdHJpeCwgaW50IGZsYWdzKQoreworICAgIEFWQXVkaW9Db252ZXJ0ICpjdHg7CisgICAgaWYgKGluX2NoYW5uZWxzIT1vdXRfY2hhbm5lbHMpCisgICAgICAgIHJldHVybiBOVUxMOyAgLyogRklYTUU6IG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBjdHggPSBhdl9tYWxsb2Moc2l6ZW9mKEFWQXVkaW9Db252ZXJ0KSk7CisgICAgaWYgKCFjdHgpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGN0eC0+aW5fY2hhbm5lbHMgPSBpbl9jaGFubmVsczsKKyAgICBjdHgtPm91dF9jaGFubmVscyA9IG91dF9jaGFubmVsczsKKyAgICBjdHgtPmZtdF9wYWlyID0gb3V0X2ZtdCArIEFWX1NBTVBMRV9GTVRfTkIqaW5fZm10OworICAgIHJldHVybiBjdHg7Cit9CisKK3ZvaWQgYXZfYXVkaW9fY29udmVydF9mcmVlKEFWQXVkaW9Db252ZXJ0ICpjdHgpCit7CisgICAgYXZfZnJlZShjdHgpOworfQorCitpbnQgYXZfYXVkaW9fY29udmVydChBVkF1ZGlvQ29udmVydCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGNvbnN0IG91dFs2XSwgY29uc3QgaW50IG91dF9zdHJpZGVbNl0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogY29uc3QgIGluWzZdLCBjb25zdCBpbnQgIGluX3N0cmlkZVs2XSwgaW50IGxlbikKK3sKKyAgICBpbnQgY2g7CisKKyAgICAvL0ZJWE1FIG9wdGltaXplIGNvbW1vbiBjYXNlcworCisgICAgZm9yKGNoPTA7IGNoPGN0eC0+b3V0X2NoYW5uZWxzOyBjaCsrKXsKKyAgICAgICAgY29uc3QgaW50IGlzPSAgaW5fc3RyaWRlW2NoXTsKKyAgICAgICAgY29uc3QgaW50IG9zPSBvdXRfc3RyaWRlW2NoXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcGk9ICBpbltjaF07CisgICAgICAgIHVpbnQ4X3QgKnBvPSBvdXRbY2hdOworICAgICAgICB1aW50OF90ICplbmQ9IHBvICsgb3MqbGVuOworICAgICAgICBpZighb3V0W2NoXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisjZGVmaW5lIENPTlYob2ZtdCwgb3R5cGUsIGlmbXQsIGV4cHIpXAoraWYoY3R4LT5mbXRfcGFpciA9PSBvZm10ICsgQVZfU0FNUExFX0ZNVF9OQippZm10KXtcCisgICAgZG97XAorICAgICAgICAqKG90eXBlKilwbyA9IGV4cHI7IHBpICs9IGlzOyBwbyArPSBvcztcCisgICAgfXdoaWxlKHBvIDwgZW5kKTtcCit9CisKKy8vRklYTUUgcHV0IHRoaW5ncyBiZWxvdyB1bmRlciBpZmRlZnMgc28gd2UgZG8gbm90IHdhc3RlIHNwYWNlIGZvciBjYXNlcyBubyBjb2RlYyB3aWxsIG5lZWQKKy8vRklYTUUgcm91bmRpbmcgPworCisgICAgICAgICAgICAgQ09OVihBVl9TQU1QTEVfRk1UX1U4ICwgdWludDhfdCwgQVZfU0FNUExFX0ZNVF9VOCAsICAqKGNvbnN0IHVpbnQ4X3QqKXBpKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsIEFWX1NBTVBMRV9GTVRfVTggLCAoKihjb25zdCB1aW50OF90KilwaSAtIDB4ODApPDw4KQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsIEFWX1NBTVBMRV9GTVRfVTggLCAoKihjb25zdCB1aW50OF90KilwaSAtIDB4ODApPDwyNCkKKyAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfRkxULCBmbG9hdCAgLCBBVl9TQU1QTEVfRk1UX1U4ICwgKCooY29uc3QgdWludDhfdCopcGkgLSAweDgwKSooMS4wIC8gKDE8PDcpKSkKKyAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUgLCBBVl9TQU1QTEVfRk1UX1U4ICwgKCooY29uc3QgdWludDhfdCopcGkgLSAweDgwKSooMS4wIC8gKDE8PDcpKSkKKyAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfVTggLCB1aW50OF90LCBBVl9TQU1QTEVfRk1UX1MxNiwgKCooY29uc3QgaW50MTZfdCopcGk+PjgpICsgMHg4MCkKKyAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX1MxNiwgICooY29uc3QgaW50MTZfdCopcGkpCisgICAgICAgIGVsc2UgQ09OVihBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgQVZfU0FNUExFX0ZNVF9TMTYsICAqKGNvbnN0IGludDE2X3QqKXBpPDwxNikKKyAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfRkxULCBmbG9hdCAgLCBBVl9TQU1QTEVfRk1UX1MxNiwgICooY29uc3QgaW50MTZfdCopcGkqKDEuMCAvICgxPDwxNSkpKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSAsIEFWX1NBTVBMRV9GTVRfUzE2LCAgKihjb25zdCBpbnQxNl90KilwaSooMS4wIC8gKDE8PDE1KSkpCisgICAgICAgIGVsc2UgQ09OVihBVl9TQU1QTEVfRk1UX1U4ICwgdWludDhfdCwgQVZfU0FNUExFX0ZNVF9TMzIsICgqKGNvbnN0IGludDMyX3QqKXBpPj4yNCkgKyAweDgwKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsIEFWX1NBTVBMRV9GTVRfUzMyLCAgKihjb25zdCBpbnQzMl90KilwaT4+MTYpCisgICAgICAgIGVsc2UgQ09OVihBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgQVZfU0FNUExFX0ZNVF9TMzIsICAqKGNvbnN0IGludDMyX3QqKXBpKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9GTFQsIGZsb2F0ICAsIEFWX1NBTVBMRV9GTVRfUzMyLCAgKihjb25zdCBpbnQzMl90KilwaSooMS4wIC8gKDFVPDwzMSkpKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSAsIEFWX1NBTVBMRV9GTVRfUzMyLCAgKihjb25zdCBpbnQzMl90KilwaSooMS4wIC8gKDFVPDwzMSkpKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9VOCAsIHVpbnQ4X3QsIEFWX1NBTVBMRV9GTVRfRkxULCBhdl9jbGlwX3VpbnQ4KCAgbHJpbnRmKCooY29uc3QgZmxvYXQqKXBpICogKDE8PDcpKSArIDB4ODApKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsIEFWX1NBTVBMRV9GTVRfRkxULCBhdl9jbGlwX2ludDE2KCAgbHJpbnRmKCooY29uc3QgZmxvYXQqKXBpICogKDE8PDE1KSkpKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsIEFWX1NBTVBMRV9GTVRfRkxULCBhdl9jbGlwbF9pbnQzMihsbHJpbnRmKCooY29uc3QgZmxvYXQqKXBpICogKDFVPDwzMSkpKSkKKyAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfRkxULCBmbG9hdCAgLCBBVl9TQU1QTEVfRk1UX0ZMVCwgKihjb25zdCBmbG9hdCopcGkpCisgICAgICAgIGVsc2UgQ09OVihBVl9TQU1QTEVfRk1UX0RCTCwgZG91YmxlICwgQVZfU0FNUExFX0ZNVF9GTFQsICooY29uc3QgZmxvYXQqKXBpKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9VOCAsIHVpbnQ4X3QsIEFWX1NBTVBMRV9GTVRfREJMLCBhdl9jbGlwX3VpbnQ4KCAgbHJpbnQoKihjb25zdCBkb3VibGUqKXBpICogKDE8PDcpKSArIDB4ODApKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsIEFWX1NBTVBMRV9GTVRfREJMLCBhdl9jbGlwX2ludDE2KCAgbHJpbnQoKihjb25zdCBkb3VibGUqKXBpICogKDE8PDE1KSkpKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsIEFWX1NBTVBMRV9GTVRfREJMLCBhdl9jbGlwbF9pbnQzMihsbHJpbnQoKihjb25zdCBkb3VibGUqKXBpICogKDFVPDwzMSkpKSkKKyAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfRkxULCBmbG9hdCAgLCBBVl9TQU1QTEVfRk1UX0RCTCwgKihjb25zdCBkb3VibGUqKXBpKQorICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSAsIEFWX1NBTVBMRV9GTVRfREJMLCAqKGNvbnN0IGRvdWJsZSopcGkpCisgICAgICAgIGVsc2UgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIEZGX0FQSV9BVURJT19DT05WRVJUICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hdWRpb2NvbnZlcnQuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2F1ZGlvY29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NmFiMzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdWRpb2NvbnZlcnQuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogYXVkaW8gY29udmVyc2lvbgorICogQ29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUGV0ZXIgUm9zcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVVESU9DT05WRVJUX0gKKyNkZWZpbmUgQVZDT0RFQ19BVURJT0NPTlZFUlRfSAorCisvKioKKyAqIEBmaWxlCisgKiBBdWRpbyBmb3JtYXQgY29udmVyc2lvbiByb3V0aW5lcworICogVGhpcyBpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBkcm9wcGVkIGluIGEgZnV0dXJlCisgKiB2ZXJzaW9uLiBZb3Ugc2hvdWxkIHVzZSB0aGUgbGlic3dyZXNhbXBsZSBsaWJyYXJ5IGluc3RlYWQuCisgKi8KKworI2lmIEZGX0FQSV9BVURJT19DT05WRVJUCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorCitzdHJ1Y3QgQVZBdWRpb0NvbnZlcnQ7Cit0eXBlZGVmIHN0cnVjdCBBVkF1ZGlvQ29udmVydCBBVkF1ZGlvQ29udmVydDsKKworLyoqCisgKiBDcmVhdGUgYW4gYXVkaW8gc2FtcGxlIGZvcm1hdCBjb252ZXJ0ZXIgY29udGV4dAorICogQHBhcmFtIG91dF9mbXQgT3V0cHV0IHNhbXBsZSBmb3JtYXQKKyAqIEBwYXJhbSBvdXRfY2hhbm5lbHMgTnVtYmVyIG9mIG91dHB1dCBjaGFubmVscworICogQHBhcmFtIGluX2ZtdCBJbnB1dCBzYW1wbGUgZm9ybWF0CisgKiBAcGFyYW0gaW5fY2hhbm5lbHMgTnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzCisgKiBAcGFyYW1baW5dIG1hdHJpeCBDaGFubmVsIG1peGluZyBtYXRyaXggKG9mIGRpbWVuc2lvbiBpbl9jaGFubmVsKm91dF9jaGFubmVscykuIFNldCB0byBOVUxMIHRvIGlnbm9yZS4KKyAqIEBwYXJhbSBmbGFncyBTZWUgQVZfQ1BVX0ZMQUdfeHgKKyAqIEByZXR1cm4gTlVMTCBvbiBlcnJvcgorICogQGRlcHJlY2F0ZWQgU2VlIGxpYnN3cmVzYW1wbGUKKyAqLworCithdHRyaWJ1dGVfZGVwcmVjYXRlZAorQVZBdWRpb0NvbnZlcnQgKmF2X2F1ZGlvX2NvbnZlcnRfYWxsb2MoZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfZm10LCBpbnQgb3V0X2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBpbl9mbXQsIGludCBpbl9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICptYXRyaXgsIGludCBmbGFncyk7CisKKy8qKgorICogRnJlZSBhdWRpbyBzYW1wbGUgZm9ybWF0IGNvbnZlcnRlciBjb250ZXh0CisgKiBAZGVwcmVjYXRlZCBTZWUgbGlic3dyZXNhbXBsZQorICovCisKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCit2b2lkIGF2X2F1ZGlvX2NvbnZlcnRfZnJlZShBVkF1ZGlvQ29udmVydCAqY3R4KTsKKworLyoqCisgKiBDb252ZXJ0IGJldHdlZW4gYXVkaW8gc2FtcGxlIGZvcm1hdHMKKyAqIEBwYXJhbVtpbl0gb3V0IGFycmF5IG9mIG91dHB1dCBidWZmZXJzIGZvciBlYWNoIGNoYW5uZWwuIHNldCB0byBOVUxMIHRvIGlnbm9yZSBwcm9jZXNzaW5nIG9mIHRoZSBnaXZlbiBjaGFubmVsLgorICogQHBhcmFtW2luXSBvdXRfc3RyaWRlIGRpc3RhbmNlIGJldHdlZW4gY29uc2VjdXRpdmUgb3V0cHV0IHNhbXBsZXMgKG1lYXN1cmVkIGluIGJ5dGVzKQorICogQHBhcmFtW2luXSBpbiBhcnJheSBvZiBpbnB1dCBidWZmZXJzIGZvciBlYWNoIGNoYW5uZWwKKyAqIEBwYXJhbVtpbl0gaW5fc3RyaWRlIGRpc3RhbmNlIGJldHdlZW4gY29uc2VjdXRpdmUgaW5wdXQgc2FtcGxlcyAobWVhc3VyZWQgaW4gYnl0ZXMpCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiBhdWRpbyBmcmFtZSBzaXplIChtZWFzdXJlZCBpbiBzYW1wbGVzKQorICogQGRlcHJlY2F0ZWQgU2VlIGxpYnN3cmVzYW1wbGUKKyAqLworCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IGF2X2F1ZGlvX2NvbnZlcnQoQVZBdWRpb0NvbnZlcnQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBjb25zdCBvdXRbNl0sIGNvbnN0IGludCBvdXRfc3RyaWRlWzZdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIGNvbnN0ICBpbls2XSwgY29uc3QgaW50ICBpbl9zdHJpZGVbNl0sIGludCBsZW4pOworCisjZW5kaWYgLyogRkZfQVBJX0FVRElPX0NPTlZFUlQgKi8KKworI2VuZGlmIC8qIEFWQ09ERUNfQVVESU9DT05WRVJUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F1ZGlvZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hdWRpb2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjVhNzQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdWRpb2RzcC5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImF1ZGlvZHNwLmgiCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY2xpcGZfY19vbmUodWludDMyX3QgYSwgdWludDMyX3QgbWluaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4aSwgdWludDMyX3QgbWF4aXNpZ24pCit7CisgICAgaWYgKGEgPiBtaW5pKQorICAgICAgICByZXR1cm4gbWluaTsKKyAgICBlbHNlIGlmICgoYSBeICgxVSA8PCAzMSkpID4gbWF4aXNpZ24pCisgICAgICAgIHJldHVybiBtYXhpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGE7Cit9CisKK3N0YXRpYyB2b2lkIHZlY3Rvcl9jbGlwZl9jX29wcG9zaXRlX3NpZ24oZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm1pbiwgZmxvYXQgKm1heCwgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50MzJfdCBtaW5pICAgICAgICA9ICoodWludDMyX3QgKikgbWluOworICAgIHVpbnQzMl90IG1heGkgICAgICAgID0gKih1aW50MzJfdCAqKSBtYXg7CisgICAgdWludDMyX3QgbWF4aXNpZ24gICAgPSBtYXhpIF4gKDFVIDw8IDMxKTsKKyAgICB1aW50MzJfdCAqZHN0aSAgICAgICA9ICh1aW50MzJfdCAqKSBkc3Q7CisgICAgY29uc3QgdWludDMyX3QgKnNyY2kgPSAoY29uc3QgdWludDMyX3QgKikgc3JjOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7CisgICAgICAgIGRzdGlbaSArIDBdID0gY2xpcGZfY19vbmUoc3JjaVtpICsgMF0sIG1pbmksIG1heGksIG1heGlzaWduKTsKKyAgICAgICAgZHN0aVtpICsgMV0gPSBjbGlwZl9jX29uZShzcmNpW2kgKyAxXSwgbWluaSwgbWF4aSwgbWF4aXNpZ24pOworICAgICAgICBkc3RpW2kgKyAyXSA9IGNsaXBmX2Nfb25lKHNyY2lbaSArIDJdLCBtaW5pLCBtYXhpLCBtYXhpc2lnbik7CisgICAgICAgIGRzdGlbaSArIDNdID0gY2xpcGZfY19vbmUoc3JjaVtpICsgM10sIG1pbmksIG1heGksIG1heGlzaWduKTsKKyAgICAgICAgZHN0aVtpICsgNF0gPSBjbGlwZl9jX29uZShzcmNpW2kgKyA0XSwgbWluaSwgbWF4aSwgbWF4aXNpZ24pOworICAgICAgICBkc3RpW2kgKyA1XSA9IGNsaXBmX2Nfb25lKHNyY2lbaSArIDVdLCBtaW5pLCBtYXhpLCBtYXhpc2lnbik7CisgICAgICAgIGRzdGlbaSArIDZdID0gY2xpcGZfY19vbmUoc3JjaVtpICsgNl0sIG1pbmksIG1heGksIG1heGlzaWduKTsKKyAgICAgICAgZHN0aVtpICsgN10gPSBjbGlwZl9jX29uZShzcmNpW2kgKyA3XSwgbWluaSwgbWF4aSwgbWF4aXNpZ24pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdmVjdG9yX2NsaXBmX2MoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1pbiwgZmxvYXQgbWF4LCBpbnQgbGVuKQoreworICAgIGludCBpOworCisgICAgaWYgKG1pbiA8IDAgJiYgbWF4ID4gMCkgeworICAgICAgICB2ZWN0b3JfY2xpcGZfY19vcHBvc2l0ZV9zaWduKGRzdCwgc3JjLCAmbWluLCAmbWF4LCBsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkgeworICAgICAgICAgICAgZHN0W2ldICAgICA9IGF2X2NsaXBmKHNyY1tpXSwgbWluLCBtYXgpOworICAgICAgICAgICAgZHN0W2kgKyAxXSA9IGF2X2NsaXBmKHNyY1tpICsgMV0sIG1pbiwgbWF4KTsKKyAgICAgICAgICAgIGRzdFtpICsgMl0gPSBhdl9jbGlwZihzcmNbaSArIDJdLCBtaW4sIG1heCk7CisgICAgICAgICAgICBkc3RbaSArIDNdID0gYXZfY2xpcGYoc3JjW2kgKyAzXSwgbWluLCBtYXgpOworICAgICAgICAgICAgZHN0W2kgKyA0XSA9IGF2X2NsaXBmKHNyY1tpICsgNF0sIG1pbiwgbWF4KTsKKyAgICAgICAgICAgIGRzdFtpICsgNV0gPSBhdl9jbGlwZihzcmNbaSArIDVdLCBtaW4sIG1heCk7CisgICAgICAgICAgICBkc3RbaSArIDZdID0gYXZfY2xpcGYoc3JjW2kgKyA2XSwgbWluLCBtYXgpOworICAgICAgICAgICAgZHN0W2kgKyA3XSA9IGF2X2NsaXBmKHNyY1tpICsgN10sIG1pbiwgbWF4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludDMyX3Qgc2NhbGFycHJvZHVjdF9pbnQxNl9jKGNvbnN0IGludDE2X3QgKnYxLCBjb25zdCBpbnQxNl90ICp2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIpCit7CisgICAgaW50IHJlcyA9IDA7CisKKyAgICB3aGlsZSAob3JkZXItLSkKKyAgICAgICAgcmVzICs9ICp2MSsrICoqdjIrKzsKKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHZlY3Rvcl9jbGlwX2ludDMyX2MoaW50MzJfdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsIGludDMyX3QgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heCwgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICBkbyB7CisgICAgICAgICpkc3QrKyA9IGF2X2NsaXAoKnNyYysrLCBtaW4sIG1heCk7CisgICAgICAgICpkc3QrKyA9IGF2X2NsaXAoKnNyYysrLCBtaW4sIG1heCk7CisgICAgICAgICpkc3QrKyA9IGF2X2NsaXAoKnNyYysrLCBtaW4sIG1heCk7CisgICAgICAgICpkc3QrKyA9IGF2X2NsaXAoKnNyYysrLCBtaW4sIG1heCk7CisgICAgICAgICpkc3QrKyA9IGF2X2NsaXAoKnNyYysrLCBtaW4sIG1heCk7CisgICAgICAgICpkc3QrKyA9IGF2X2NsaXAoKnNyYysrLCBtaW4sIG1heCk7CisgICAgICAgICpkc3QrKyA9IGF2X2NsaXAoKnNyYysrLCBtaW4sIG1heCk7CisgICAgICAgICpkc3QrKyA9IGF2X2NsaXAoKnNyYysrLCBtaW4sIG1heCk7CisgICAgICAgIGxlbiAgIC09IDg7CisgICAgfSB3aGlsZSAobGVuID4gMCk7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9hdWRpb2RzcF9pbml0KEF1ZGlvRFNQQ29udGV4dCAqYykKK3sKKyAgICBjLT5zY2FsYXJwcm9kdWN0X2ludDE2ID0gc2NhbGFycHJvZHVjdF9pbnQxNl9jOworICAgIGMtPnZlY3Rvcl9jbGlwX2ludDMyICAgPSB2ZWN0b3JfY2xpcF9pbnQzMl9jOworICAgIGMtPnZlY3Rvcl9jbGlwZiAgICAgICAgPSB2ZWN0b3JfY2xpcGZfYzsKKworICAgIGlmIChBUkNIX0FSTSkKKyAgICAgICAgZmZfYXVkaW9kc3BfaW5pdF9hcm0oYyk7CisgICAgaWYgKEFSQ0hfUFBDKQorICAgICAgICBmZl9hdWRpb2RzcF9pbml0X3BwYyhjKTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2F1ZGlvZHNwX2luaXRfeDg2KGMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXVkaW9kc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2F1ZGlvZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1YmY4NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F1ZGlvZHNwLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVVESU9EU1BfSAorI2RlZmluZSBBVkNPREVDX0FVRElPRFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHN0cnVjdCBBdWRpb0RTUENvbnRleHQgeworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSBzY2FsYXIgcHJvZHVjdCBvZiB0d28gdmVjdG9ycy4KKyAgICAgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB2ZWN0b3JzLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgMTYKKyAgICAgKi8KKyAgICBpbnQzMl90ICgqc2NhbGFycHJvZHVjdF9pbnQxNikoY29uc3QgaW50MTZfdCAqdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnYyIC8qIGFsaWduIDE2ICovLCBpbnQgbGVuKTsKKworICAgIC8qKgorICAgICAqIENsaXAgZWFjaCBlbGVtZW50IGluIGFuIGFycmF5IG9mIGludDMyX3QgdG8gYSBnaXZlbiBtaW5pbXVtIGFuZAorICAgICAqIG1heGltdW0gdmFsdWUuCisgICAgICogQHBhcmFtIGRzdCAgZGVzdGluYXRpb24gYXJyYXkKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogMTYtYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIHNyYyAgc291cmNlIGFycmF5CisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IDE2LWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBtaW4gIG1pbmltdW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWy0oMSA8PCAyNCksIDEgPDwgMjRdCisgICAgICogQHBhcmFtIG1heCAgbWF4aW11bSB2YWx1ZQorICAgICAqICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBtdXN0IGJlIGluIHRoZSByYW5nZSBbLSgxIDw8IDI0KSwgMSA8PCAyNF0KKyAgICAgKiBAcGFyYW0gbGVuICBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5CisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IG11bHRpcGxlIG9mIDMyIGdyZWF0ZXIgdGhhbiB6ZXJvCisgICAgICovCisgICAgdm9pZCAoKnZlY3Rvcl9jbGlwX2ludDMyKShpbnQzMl90ICpkc3QsIGNvbnN0IGludDMyX3QgKnNyYywgaW50MzJfdCBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heCwgdW5zaWduZWQgaW50IGxlbik7CisgICAgLyogYXNzdW1lIGxlbiBpcyBhIG11bHRpcGxlIG9mIDgsIGFuZCBhcnJheXMgYXJlIDE2LWJ5dGUgYWxpZ25lZCAqLworICAgIHZvaWQgKCp2ZWN0b3JfY2xpcGYpKGZsb2F0ICpkc3QgLyogYWxpZ24gMTYgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYyAvKiBhbGlnbiAxNiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaW4sIGZsb2F0IG1heCwgaW50IGxlbiAvKiBhbGlnbiAxNiAqLyk7Cit9IEF1ZGlvRFNQQ29udGV4dDsKKwordm9pZCBmZl9hdWRpb2RzcF9pbml0KEF1ZGlvRFNQQ29udGV4dCAqYyk7Cit2b2lkIGZmX2F1ZGlvZHNwX2luaXRfYXJtKEF1ZGlvRFNQQ29udGV4dCAqYyk7Cit2b2lkIGZmX2F1ZGlvZHNwX2luaXRfcHBjKEF1ZGlvRFNQQ29udGV4dCAqYyk7Cit2b2lkIGZmX2F1ZGlvZHNwX2luaXRfeDg2KEF1ZGlvRFNQQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FVRElPRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F1cmEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F1cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDBmMTZhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXVyYS5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQXVyYSAyIGRlY29kZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQXVyYSAyIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCBhdXJhX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICAvKiB3aWR0aCBuZWVkcyB0byBiZSBkaXZpc2libGUgYnkgNCBmb3IgdGhpcyBjb2RlYyB0byB3b3JrICovCisgICAgaWYgKGF2Y3R4LT53aWR0aCAmIDB4MykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1cmFfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIHVpbnQ4X3QgKlksICpVLCAqVjsKKyAgICB1aW50OF90IHZhbDsKKyAgICBpbnQgeCwgeSwgcmV0OworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IHBrdC0+ZGF0YTsKKworICAgIC8qIHByZWRpY3Rpb24gZXJyb3IgdGFibGVzIChtYWtlIGl0IGNsZWFyIHRoYXQgdGhleSBhcmUgc2lnbmVkIHZhbHVlcykgKi8KKyAgICBjb25zdCBpbnQ4X3QgKmRlbHRhX3RhYmxlID0gKGNvbnN0IGludDhfdCopYnVmICsgMTY7CisKKyAgICBpZiAocGt0LT5zaXplICE9IDQ4ICsgYXZjdHgtPmhlaWdodCAqIGF2Y3R4LT53aWR0aCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImdvdCBhIGJ1ZmZlciB3aXRoICVkIGJ5dGVzIHdoZW4gJWQgd2VyZSBleHBlY3RlZFxuIiwKKyAgICAgICAgICAgICAgIHBrdC0+c2l6ZSwgNDggKyBhdmN0eC0+aGVpZ2h0ICogYXZjdHgtPndpZHRoKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogcGl4ZWwgZGF0YSBzdGFydHMgNDggYnl0ZXMgaW4sIGFmdGVyIDN4MTYtYnl0ZSB0YWJsZXMgKi8KKyAgICBidWYgKz0gNDg7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgWSA9IGZyYW1lLT5kYXRhWzBdOworICAgIFUgPSBmcmFtZS0+ZGF0YVsxXTsKKyAgICBWID0gZnJhbWUtPmRhdGFbMl07CisKKyAgICAvKiBpdGVyYXRlIHRocm91Z2ggZWFjaCBsaW5lIGluIHRoZSBoZWlnaHQgKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIC8qIHJlc2V0IHByZWRpY3RvcnMgKi8KKyAgICAgICAgdmFsICA9ICpidWYrKzsKKyAgICAgICAgVVswXSA9IHZhbCAmIDB4RjA7CisgICAgICAgIFlbMF0gPSB2YWwgPDwgNDsKKyAgICAgICAgdmFsICA9ICpidWYrKzsKKyAgICAgICAgVlswXSA9IHZhbCAmIDB4RjA7CisgICAgICAgIFlbMV0gPSBZWzBdICsgZGVsdGFfdGFibGVbdmFsICYgMHhGXTsKKyAgICAgICAgWSAgICs9IDI7IFUrKzsgVisrOworCisgICAgICAgIC8qIGl0ZXJhdGUgdGhyb3VnaCB0aGUgcmVtYWluaW5nIHBpeGVsIGdyb3VwcyAoNCBwaXhlbHMvZ3JvdXApICovCisgICAgICAgIGZvciAoeCA9IDE7IHggPCAoYXZjdHgtPndpZHRoID4+IDEpOyB4KyspIHsKKyAgICAgICAgICAgIHZhbCAgPSAqYnVmKys7CisgICAgICAgICAgICBVWzBdID0gVVstMV0gKyBkZWx0YV90YWJsZVt2YWwgPj4gNF07CisgICAgICAgICAgICBZWzBdID0gWVstMV0gKyBkZWx0YV90YWJsZVt2YWwgJiAweEZdOworICAgICAgICAgICAgdmFsICA9ICpidWYrKzsKKyAgICAgICAgICAgIFZbMF0gPSBWWy0xXSArIGRlbHRhX3RhYmxlW3ZhbCA+PiA0XTsKKyAgICAgICAgICAgIFlbMV0gPSBZWyAwXSArIGRlbHRhX3RhYmxlW3ZhbCAmIDB4Rl07CisgICAgICAgICAgICBZICAgKz0gMjsgVSsrOyBWKys7CisgICAgICAgIH0KKyAgICAgICAgWSArPSBmcmFtZS0+bGluZXNpemVbMF0gLSAgYXZjdHgtPndpZHRoOworICAgICAgICBVICs9IGZyYW1lLT5saW5lc2l6ZVsxXSAtIChhdmN0eC0+d2lkdGggPj4gMSk7CisgICAgICAgIFYgKz0gZnJhbWUtPmxpbmVzaXplWzJdIC0gKGF2Y3R4LT53aWR0aCA+PiAxKTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfYXVyYTJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXVyYTIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdXJhdmlzaW9uIEF1cmEgMiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BVVJBMiwKKyAgICAuaW5pdCAgICAgICAgICAgPSBhdXJhX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGF1cmFfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXZjb2RlYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXZjb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYmFlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdmNvZGVjLmgKQEAgLTAsMCArMSw1MjQ3IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVZDT0RFQ19ICisjZGVmaW5lIEFWQ09ERUNfQVZDT0RFQ19ICisKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxpYmF2YworICogTGliYXZjb2RlYyBleHRlcm5hbCBBUEkgaGVhZGVyCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYXRpb25hbC5oIgorCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisvKioKKyAqIEBkZWZncm91cCBsaWJhdmMgRW5jb2RpbmcvRGVjb2RpbmcgTGlicmFyeQorICogQHsKKyAqCisgKiBAZGVmZ3JvdXAgbGF2Y19kZWNvZGluZyBEZWNvZGluZworICogQHsKKyAqIEB9CisgKgorICogQGRlZmdyb3VwIGxhdmNfZW5jb2RpbmcgRW5jb2RpbmcKKyAqIEB7CisgKiBAfQorICoKKyAqIEBkZWZncm91cCBsYXZjX2NvZGVjIENvZGVjcworICogQHsKKyAqIEBkZWZncm91cCBsYXZjX2NvZGVjX25hdGl2ZSBOYXRpdmUgQ29kZWNzCisgKiBAeworICogQH0KKyAqIEBkZWZncm91cCBsYXZjX2NvZGVjX3dyYXBwZXJzIEV4dGVybmFsIGxpYnJhcnkgd3JhcHBlcnMKKyAqIEB7CisgKiBAfQorICogQGRlZmdyb3VwIGxhdmNfY29kZWNfaHdhY2NlbCBIYXJkd2FyZSBBY2NlbGVyYXRvcnMgYnJpZGdlCisgKiBAeworICogQH0KKyAqIEB9CisgKiBAZGVmZ3JvdXAgbGF2Y19pbnRlcm5hbCBJbnRlcm5hbAorICogQHsKKyAqIEB9CisgKiBAfQorICoKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBsYXZjX2NvcmUgQ29yZSBmdW5jdGlvbnMvc3RydWN0dXJlcy4KKyAqIEBpbmdyb3VwIGxpYmF2YworICoKKyAqIEJhc2ljIGRlZmluaXRpb25zLCBmdW5jdGlvbnMgZm9yIHF1ZXJ5aW5nIGxpYmF2Y29kZWMgY2FwYWJpbGl0aWVzLAorICogYWxsb2NhdGluZyBjb3JlIHN0cnVjdHVyZXMsIGV0Yy4KKyAqIEB7CisgKi8KKworCisvKioKKyAqIElkZW50aWZ5IHRoZSBzeW50YXggYW5kIHNlbWFudGljcyBvZiB0aGUgYml0c3RyZWFtLgorICogVGhlIHByaW5jaXBsZSBpcyByb3VnaGx5OgorICogVHdvIGRlY29kZXJzIHdpdGggdGhlIHNhbWUgSUQgY2FuIGRlY29kZSB0aGUgc2FtZSBzdHJlYW1zLgorICogVHdvIGVuY29kZXJzIHdpdGggdGhlIHNhbWUgSUQgY2FuIGVuY29kZSBjb21wYXRpYmxlIHN0cmVhbXMuCisgKiBUaGVyZSBtYXkgYmUgc2xpZ2h0IGRldmlhdGlvbnMgZnJvbSB0aGUgcHJpbmNpcGxlIGR1ZSB0byBpbXBsZW1lbnRhdGlvbgorICogZGV0YWlscy4KKyAqCisgKiBJZiB5b3UgYWRkIGEgY29kZWMgSUQgdG8gdGhpcyBsaXN0LCBhZGQgaXQgc28gdGhhdAorICogMS4gbm8gdmFsdWUgb2YgYSBleGlzdGluZyBjb2RlYyBJRCBjaGFuZ2VzICh0aGF0IHdvdWxkIGJyZWFrIEFCSSksCisgKiAyLiBHaXZlIGl0IGEgdmFsdWUgd2hpY2ggd2hlbiB0YWtlbiBhcyBBU0NJSSBpcyByZWNvZ25pemVkIHVuaXF1ZWx5IGJ5IGEgaHVtYW4gYXMgdGhpcyBzcGVjaWZpYyBjb2RlYy4KKyAqICAgIFRoaXMgZW5zdXJlcyB0aGF0IDIgZm9ya3MgY2FuIGluZGVwZW5kZW50bHkgYWRkIEFWQ29kZWNJRHMgd2l0aG91dCBwcm9kdWNpbmcgY29uZmxpY3RzLgorICoKKyAqIEFmdGVyIGFkZGluZyBuZXcgY29kZWMgSURzLCBkbyBub3QgZm9yZ2V0IHRvIGFkZCBhbiBlbnRyeSB0byB0aGUgY29kZWMKKyAqIGRlc2NyaXB0b3IgbGlzdCBhbmQgYnVtcCBsaWJhdmNvZGVjIG1pbm9yIHZlcnNpb24uCisgKi8KK2VudW0gQVZDb2RlY0lEIHsKKyAgICBBVl9DT0RFQ19JRF9OT05FLAorCisgICAgLyogdmlkZW8gY29kZWNzICovCisgICAgQVZfQ09ERUNfSURfTVBFRzFWSURFTywKKyAgICBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCAvLy88IHByZWZlcnJlZCBJRCBmb3IgTVBFRy0xLzIgdmlkZW8gZGVjb2RpbmcKKyNpZiBGRl9BUElfWFZNQworICAgIEFWX0NPREVDX0lEX01QRUcyVklERU9fWFZNQywKKyNlbmRpZiAvKiBGRl9BUElfWFZNQyAqLworICAgIEFWX0NPREVDX0lEX0gyNjEsCisgICAgQVZfQ09ERUNfSURfSDI2MywKKyAgICBBVl9DT0RFQ19JRF9SVjEwLAorICAgIEFWX0NPREVDX0lEX1JWMjAsCisgICAgQVZfQ09ERUNfSURfTUpQRUcsCisgICAgQVZfQ09ERUNfSURfTUpQRUdCLAorICAgIEFWX0NPREVDX0lEX0xKUEVHLAorICAgIEFWX0NPREVDX0lEX1NQNVgsCisgICAgQVZfQ09ERUNfSURfSlBFR0xTLAorICAgIEFWX0NPREVDX0lEX01QRUc0LAorICAgIEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIEFWX0NPREVDX0lEX01TTVBFRzRWMSwKKyAgICBBVl9DT0RFQ19JRF9NU01QRUc0VjIsCisgICAgQVZfQ09ERUNfSURfTVNNUEVHNFYzLAorICAgIEFWX0NPREVDX0lEX1dNVjEsCisgICAgQVZfQ09ERUNfSURfV01WMiwKKyAgICBBVl9DT0RFQ19JRF9IMjYzUCwKKyAgICBBVl9DT0RFQ19JRF9IMjYzSSwKKyAgICBBVl9DT0RFQ19JRF9GTFYxLAorICAgIEFWX0NPREVDX0lEX1NWUTEsCisgICAgQVZfQ09ERUNfSURfU1ZRMywKKyAgICBBVl9DT0RFQ19JRF9EVlZJREVPLAorICAgIEFWX0NPREVDX0lEX0hVRkZZVVYsCisgICAgQVZfQ09ERUNfSURfQ1lVViwKKyAgICBBVl9DT0RFQ19JRF9IMjY0LAorICAgIEFWX0NPREVDX0lEX0lOREVPMywKKyAgICBBVl9DT0RFQ19JRF9WUDMsCisgICAgQVZfQ09ERUNfSURfVEhFT1JBLAorICAgIEFWX0NPREVDX0lEX0FTVjEsCisgICAgQVZfQ09ERUNfSURfQVNWMiwKKyAgICBBVl9DT0RFQ19JRF9GRlYxLAorICAgIEFWX0NPREVDX0lEXzRYTSwKKyAgICBBVl9DT0RFQ19JRF9WQ1IxLAorICAgIEFWX0NPREVDX0lEX0NMSlIsCisgICAgQVZfQ09ERUNfSURfTURFQywKKyAgICBBVl9DT0RFQ19JRF9ST1EsCisgICAgQVZfQ09ERUNfSURfSU5URVJQTEFZX1ZJREVPLAorICAgIEFWX0NPREVDX0lEX1hBTl9XQzMsCisgICAgQVZfQ09ERUNfSURfWEFOX1dDNCwKKyAgICBBVl9DT0RFQ19JRF9SUFpBLAorICAgIEFWX0NPREVDX0lEX0NJTkVQQUssCisgICAgQVZfQ09ERUNfSURfV1NfVlFBLAorICAgIEFWX0NPREVDX0lEX01TUkxFLAorICAgIEFWX0NPREVDX0lEX01TVklERU8xLAorICAgIEFWX0NPREVDX0lEX0lEQ0lOLAorICAgIEFWX0NPREVDX0lEXzhCUFMsCisgICAgQVZfQ09ERUNfSURfU01DLAorICAgIEFWX0NPREVDX0lEX0ZMSUMsCisgICAgQVZfQ09ERUNfSURfVFJVRU1PVElPTjEsCisgICAgQVZfQ09ERUNfSURfVk1EVklERU8sCisgICAgQVZfQ09ERUNfSURfTVNaSCwKKyAgICBBVl9DT0RFQ19JRF9aTElCLAorICAgIEFWX0NPREVDX0lEX1FUUkxFLAorICAgIEFWX0NPREVDX0lEX1RTQ0MsCisgICAgQVZfQ09ERUNfSURfVUxUSSwKKyAgICBBVl9DT0RFQ19JRF9RRFJBVywKKyAgICBBVl9DT0RFQ19JRF9WSVhMLAorICAgIEFWX0NPREVDX0lEX1FQRUcsCisgICAgQVZfQ09ERUNfSURfUE5HLAorICAgIEFWX0NPREVDX0lEX1BQTSwKKyAgICBBVl9DT0RFQ19JRF9QQk0sCisgICAgQVZfQ09ERUNfSURfUEdNLAorICAgIEFWX0NPREVDX0lEX1BHTVlVViwKKyAgICBBVl9DT0RFQ19JRF9QQU0sCisgICAgQVZfQ09ERUNfSURfRkZWSFVGRiwKKyAgICBBVl9DT0RFQ19JRF9SVjMwLAorICAgIEFWX0NPREVDX0lEX1JWNDAsCisgICAgQVZfQ09ERUNfSURfVkMxLAorICAgIEFWX0NPREVDX0lEX1dNVjMsCisgICAgQVZfQ09ERUNfSURfTE9DTywKKyAgICBBVl9DT0RFQ19JRF9XTlYxLAorICAgIEFWX0NPREVDX0lEX0FBU0MsCisgICAgQVZfQ09ERUNfSURfSU5ERU8yLAorICAgIEFWX0NPREVDX0lEX0ZSQVBTLAorICAgIEFWX0NPREVDX0lEX1RSVUVNT1RJT04yLAorICAgIEFWX0NPREVDX0lEX0JNUCwKKyAgICBBVl9DT0RFQ19JRF9DU0NELAorICAgIEFWX0NPREVDX0lEX01NVklERU8sCisgICAgQVZfQ09ERUNfSURfWk1CViwKKyAgICBBVl9DT0RFQ19JRF9BVlMsCisgICAgQVZfQ09ERUNfSURfU01BQ0tWSURFTywKKyAgICBBVl9DT0RFQ19JRF9OVVYsCisgICAgQVZfQ09ERUNfSURfS01WQywKKyAgICBBVl9DT0RFQ19JRF9GTEFTSFNWLAorICAgIEFWX0NPREVDX0lEX0NBVlMsCisgICAgQVZfQ09ERUNfSURfSlBFRzIwMDAsCisgICAgQVZfQ09ERUNfSURfVk1OQywKKyAgICBBVl9DT0RFQ19JRF9WUDUsCisgICAgQVZfQ09ERUNfSURfVlA2LAorICAgIEFWX0NPREVDX0lEX1ZQNkYsCisgICAgQVZfQ09ERUNfSURfVEFSR0EsCisgICAgQVZfQ09ERUNfSURfRFNJQ0lOVklERU8sCisgICAgQVZfQ09ERUNfSURfVElFUlRFWFNFUVZJREVPLAorICAgIEFWX0NPREVDX0lEX1RJRkYsCisgICAgQVZfQ09ERUNfSURfR0lGLAorICAgIEFWX0NPREVDX0lEX0RYQSwKKyAgICBBVl9DT0RFQ19JRF9ETlhIRCwKKyAgICBBVl9DT0RFQ19JRF9USFAsCisgICAgQVZfQ09ERUNfSURfU0dJLAorICAgIEFWX0NPREVDX0lEX0M5MywKKyAgICBBVl9DT0RFQ19JRF9CRVRIU09GVFZJRCwKKyAgICBBVl9DT0RFQ19JRF9QVFgsCisgICAgQVZfQ09ERUNfSURfVFhELAorICAgIEFWX0NPREVDX0lEX1ZQNkEsCisgICAgQVZfQ09ERUNfSURfQU1WLAorICAgIEFWX0NPREVDX0lEX1ZCLAorICAgIEFWX0NPREVDX0lEX1BDWCwKKyAgICBBVl9DT0RFQ19JRF9TVU5SQVNULAorICAgIEFWX0NPREVDX0lEX0lOREVPNCwKKyAgICBBVl9DT0RFQ19JRF9JTkRFTzUsCisgICAgQVZfQ09ERUNfSURfTUlNSUMsCisgICAgQVZfQ09ERUNfSURfUkwyLAorICAgIEFWX0NPREVDX0lEX0VTQ0FQRTEyNCwKKyAgICBBVl9DT0RFQ19JRF9ESVJBQywKKyAgICBBVl9DT0RFQ19JRF9CRkksCisgICAgQVZfQ09ERUNfSURfQ01WLAorICAgIEFWX0NPREVDX0lEX01PVElPTlBJWEVMUywKKyAgICBBVl9DT0RFQ19JRF9UR1YsCisgICAgQVZfQ09ERUNfSURfVEdRLAorICAgIEFWX0NPREVDX0lEX1RRSSwKKyAgICBBVl9DT0RFQ19JRF9BVVJBLAorICAgIEFWX0NPREVDX0lEX0FVUkEyLAorICAgIEFWX0NPREVDX0lEX1YyMTBYLAorICAgIEFWX0NPREVDX0lEX1RNViwKKyAgICBBVl9DT0RFQ19JRF9WMjEwLAorICAgIEFWX0NPREVDX0lEX0RQWCwKKyAgICBBVl9DT0RFQ19JRF9NQUQsCisgICAgQVZfQ09ERUNfSURfRlJXVSwKKyAgICBBVl9DT0RFQ19JRF9GTEFTSFNWMiwKKyAgICBBVl9DT0RFQ19JRF9DREdSQVBISUNTLAorICAgIEFWX0NPREVDX0lEX1IyMTAsCisgICAgQVZfQ09ERUNfSURfQU5NLAorICAgIEFWX0NPREVDX0lEX0JJTktWSURFTywKKyAgICBBVl9DT0RFQ19JRF9JRkZfSUxCTSwKKyAgICBBVl9DT0RFQ19JRF9JRkZfQllURVJVTjEsCisgICAgQVZfQ09ERUNfSURfS0dWMSwKKyAgICBBVl9DT0RFQ19JRF9ZT1AsCisgICAgQVZfQ09ERUNfSURfVlA4LAorICAgIEFWX0NPREVDX0lEX1BJQ1RPUiwKKyAgICBBVl9DT0RFQ19JRF9BTlNJLAorICAgIEFWX0NPREVDX0lEX0E2NF9NVUxUSSwKKyAgICBBVl9DT0RFQ19JRF9BNjRfTVVMVEk1LAorICAgIEFWX0NPREVDX0lEX1IxMEssCisgICAgQVZfQ09ERUNfSURfTVhQRUcsCisgICAgQVZfQ09ERUNfSURfTEFHQVJJVEgsCisgICAgQVZfQ09ERUNfSURfUFJPUkVTLAorICAgIEFWX0NPREVDX0lEX0pWLAorICAgIEFWX0NPREVDX0lEX0RGQSwKKyAgICBBVl9DT0RFQ19JRF9XTVYzSU1BR0UsCisgICAgQVZfQ09ERUNfSURfVkMxSU1BR0UsCisgICAgQVZfQ09ERUNfSURfVVRWSURFTywKKyAgICBBVl9DT0RFQ19JRF9CTVZfVklERU8sCisgICAgQVZfQ09ERUNfSURfVkJMRSwKKyAgICBBVl9DT0RFQ19JRF9EWFRPUlksCisgICAgQVZfQ09ERUNfSURfVjQxMCwKKyAgICBBVl9DT0RFQ19JRF9YV0QsCisgICAgQVZfQ09ERUNfSURfQ0RYTCwKKyAgICBBVl9DT0RFQ19JRF9YQk0sCisgICAgQVZfQ09ERUNfSURfWkVST0NPREVDLAorICAgIEFWX0NPREVDX0lEX01TUzEsCisgICAgQVZfQ09ERUNfSURfTVNBMSwKKyAgICBBVl9DT0RFQ19JRF9UU0NDMiwKKyAgICBBVl9DT0RFQ19JRF9NVFMyLAorICAgIEFWX0NPREVDX0lEX0NMTEMsCisgICAgQVZfQ09ERUNfSURfTVNTMiwKKyAgICBBVl9DT0RFQ19JRF9WUDksCisgICAgQVZfQ09ERUNfSURfQUlDLAorICAgIEFWX0NPREVDX0lEX0VTQ0FQRTEzMF9ERVBSRUNBVEVELAorICAgIEFWX0NPREVDX0lEX0cyTV9ERVBSRUNBVEVELAorICAgIEFWX0NPREVDX0lEX1dFQlBfREVQUkVDQVRFRCwKKyAgICBBVl9DT0RFQ19JRF9ITk00X1ZJREVPLAorICAgIEFWX0NPREVDX0lEX0hFVkNfREVQUkVDQVRFRCwKKyAgICBBVl9DT0RFQ19JRF9GSUMsCisgICAgQVZfQ09ERUNfSURfQUxJQVNfUElYLAorICAgIEFWX0NPREVDX0lEX0JSRU5ERVJfUElYX0RFUFJFQ0FURUQsCisgICAgQVZfQ09ERUNfSURfUEFGX1ZJREVPX0RFUFJFQ0FURUQsCisgICAgQVZfQ09ERUNfSURfRVhSX0RFUFJFQ0FURUQsCisgICAgQVZfQ09ERUNfSURfVlA3X0RFUFJFQ0FURUQsCisgICAgQVZfQ09ERUNfSURfU0FOTV9ERVBSRUNBVEVELAorICAgIEFWX0NPREVDX0lEX1NHSVJMRV9ERVBSRUNBVEVELAorICAgIEFWX0NPREVDX0lEX01WQzFfREVQUkVDQVRFRCwKKyAgICBBVl9DT0RFQ19JRF9NVkMyX0RFUFJFQ0FURUQsCisKKyAgICBBVl9DT0RFQ19JRF9CUkVOREVSX1BJWD0gTUtCRVRBRygnQicsJ1AnLCdJJywnWCcpLAorICAgIEFWX0NPREVDX0lEX1k0MVAgICAgICAgPSBNS0JFVEFHKCdZJywnNCcsJzEnLCdQJyksCisgICAgQVZfQ09ERUNfSURfRVNDQVBFMTMwICA9IE1LQkVUQUcoJ0UnLCcxJywnMycsJzAnKSwKKyAgICBBVl9DT0RFQ19JRF9FWFIgICAgICAgID0gTUtCRVRBRygnMCcsJ0UnLCdYJywnUicpLAorICAgIEFWX0NPREVDX0lEX0FWUlAgICAgICAgPSBNS0JFVEFHKCdBJywnVicsJ1InLCdQJyksCisKKyAgICBBVl9DT0RFQ19JRF8wMTJWICAgICAgID0gTUtCRVRBRygnMCcsJzEnLCcyJywnVicpLAorICAgIEFWX0NPREVDX0lEX0cyTSAgICAgICAgPSBNS0JFVEFHKCAwICwnRycsJzInLCdNJyksCisgICAgQVZfQ09ERUNfSURfQVZVSSAgICAgICA9IE1LQkVUQUcoJ0EnLCdWJywnVScsJ0knKSwKKyAgICBBVl9DT0RFQ19JRF9BWVVWICAgICAgID0gTUtCRVRBRygnQScsJ1knLCdVJywnVicpLAorICAgIEFWX0NPREVDX0lEX1RBUkdBX1kyMTYgPSBNS0JFVEFHKCdUJywnMicsJzEnLCc2JyksCisgICAgQVZfQ09ERUNfSURfVjMwOCAgICAgICA9IE1LQkVUQUcoJ1YnLCczJywnMCcsJzgnKSwKKyAgICBBVl9DT0RFQ19JRF9WNDA4ICAgICAgID0gTUtCRVRBRygnVicsJzQnLCcwJywnOCcpLAorICAgIEFWX0NPREVDX0lEX1lVVjQgICAgICAgPSBNS0JFVEFHKCdZJywnVScsJ1YnLCc0JyksCisgICAgQVZfQ09ERUNfSURfU0FOTSAgICAgICA9IE1LQkVUQUcoJ1MnLCdBJywnTicsJ00nKSwKKyAgICBBVl9DT0RFQ19JRF9QQUZfVklERU8gID0gTUtCRVRBRygnUCcsJ0EnLCdGJywnVicpLAorICAgIEFWX0NPREVDX0lEX0FWUk4gICAgICAgPSBNS0JFVEFHKCdBJywnVicsJ1InLCduJyksCisgICAgQVZfQ09ERUNfSURfQ1BJQSAgICAgICA9IE1LQkVUQUcoJ0MnLCdQJywnSScsJ0EnKSwKKyAgICBBVl9DT0RFQ19JRF9YRkFDRSAgICAgID0gTUtCRVRBRygnWCcsJ0YnLCdBJywnQycpLAorICAgIEFWX0NPREVDX0lEX1NHSVJMRSAgICAgPSBNS0JFVEFHKCdTJywnRycsJ0knLCdSJyksCisgICAgQVZfQ09ERUNfSURfTVZDMSAgICAgICA9IE1LQkVUQUcoJ00nLCdWJywnQycsJzEnKSwKKyAgICBBVl9DT0RFQ19JRF9NVkMyICAgICAgID0gTUtCRVRBRygnTScsJ1YnLCdDJywnMicpLAorICAgIEFWX0NPREVDX0lEX1NOT1cgICAgICAgPSBNS0JFVEFHKCdTJywnTicsJ08nLCdXJyksCisgICAgQVZfQ09ERUNfSURfV0VCUCAgICAgICA9IE1LQkVUQUcoJ1cnLCdFJywnQicsJ1AnKSwKKyAgICBBVl9DT0RFQ19JRF9TTVZKUEVHICAgID0gTUtCRVRBRygnUycsJ00nLCdWJywnSicpLAorICAgIEFWX0NPREVDX0lEX0hFVkMgICAgICAgPSBNS0JFVEFHKCdIJywnMicsJzYnLCc1JyksCisjZGVmaW5lIEFWX0NPREVDX0lEX0gyNjUgQVZfQ09ERUNfSURfSEVWQworICAgIEFWX0NPREVDX0lEX1ZQNyAgICAgICAgPSBNS0JFVEFHKCdWJywnUCcsJzcnLCcwJyksCisgICAgQVZfQ09ERUNfSURfQVBORyAgICAgICA9IE1LQkVUQUcoJ0EnLCdQJywnTicsJ0cnKSwKKworICAgIC8qIHZhcmlvdXMgUENNICJjb2RlY3MiICovCisgICAgQVZfQ09ERUNfSURfRklSU1RfQVVESU8gPSAweDEwMDAwLCAgICAgLy8vPCBBIGR1bW15IGlkIHBvaW50aW5nIGF0IHRoZSBzdGFydCBvZiBhdWRpbyBjb2RlY3MKKyAgICBBVl9DT0RFQ19JRF9QQ01fUzE2TEUgPSAweDEwMDAwLAorICAgIEFWX0NPREVDX0lEX1BDTV9TMTZCRSwKKyAgICBBVl9DT0RFQ19JRF9QQ01fVTE2TEUsCisgICAgQVZfQ09ERUNfSURfUENNX1UxNkJFLAorICAgIEFWX0NPREVDX0lEX1BDTV9TOCwKKyAgICBBVl9DT0RFQ19JRF9QQ01fVTgsCisgICAgQVZfQ09ERUNfSURfUENNX01VTEFXLAorICAgIEFWX0NPREVDX0lEX1BDTV9BTEFXLAorICAgIEFWX0NPREVDX0lEX1BDTV9TMzJMRSwKKyAgICBBVl9DT0RFQ19JRF9QQ01fUzMyQkUsCisgICAgQVZfQ09ERUNfSURfUENNX1UzMkxFLAorICAgIEFWX0NPREVDX0lEX1BDTV9VMzJCRSwKKyAgICBBVl9DT0RFQ19JRF9QQ01fUzI0TEUsCisgICAgQVZfQ09ERUNfSURfUENNX1MyNEJFLAorICAgIEFWX0NPREVDX0lEX1BDTV9VMjRMRSwKKyAgICBBVl9DT0RFQ19JRF9QQ01fVTI0QkUsCisgICAgQVZfQ09ERUNfSURfUENNX1MyNERBVUQsCisgICAgQVZfQ09ERUNfSURfUENNX1pPUkssCisgICAgQVZfQ09ERUNfSURfUENNX1MxNkxFX1BMQU5BUiwKKyAgICBBVl9DT0RFQ19JRF9QQ01fRFZELAorICAgIEFWX0NPREVDX0lEX1BDTV9GMzJCRSwKKyAgICBBVl9DT0RFQ19JRF9QQ01fRjMyTEUsCisgICAgQVZfQ09ERUNfSURfUENNX0Y2NEJFLAorICAgIEFWX0NPREVDX0lEX1BDTV9GNjRMRSwKKyAgICBBVl9DT0RFQ19JRF9QQ01fQkxVUkFZLAorICAgIEFWX0NPREVDX0lEX1BDTV9MWEYsCisgICAgQVZfQ09ERUNfSURfUzMwMk0sCisgICAgQVZfQ09ERUNfSURfUENNX1M4X1BMQU5BUiwKKyAgICBBVl9DT0RFQ19JRF9QQ01fUzI0TEVfUExBTkFSX0RFUFJFQ0FURUQsCisgICAgQVZfQ09ERUNfSURfUENNX1MzMkxFX1BMQU5BUl9ERVBSRUNBVEVELAorICAgIEFWX0NPREVDX0lEX1BDTV9TMjRMRV9QTEFOQVIgPSBNS0JFVEFHKDI0LCdQJywnUycsJ1AnKSwKKyAgICBBVl9DT0RFQ19JRF9QQ01fUzMyTEVfUExBTkFSID0gTUtCRVRBRygzMiwnUCcsJ1MnLCdQJyksCisgICAgQVZfQ09ERUNfSURfUENNX1MxNkJFX1BMQU5BUiA9IE1LQkVUQUcoJ1AnLCdTJywnUCcsMTYpLAorCisgICAgLyogdmFyaW91cyBBRFBDTSBjb2RlY3MgKi8KKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQgPSAweDExMDAwLAorICAgIEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYsCisgICAgQVZfQ09ERUNfSURfQURQQ01fSU1BX0RLMywKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREs0LAorICAgIEFWX0NPREVDX0lEX0FEUENNX0lNQV9XUywKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfU01KUEVHLAorICAgIEFWX0NPREVDX0lEX0FEUENNX01TLAorICAgIEFWX0NPREVDX0lEX0FEUENNXzRYTSwKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9YQSwKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9BRFgsCisgICAgQVZfQ09ERUNfSURfQURQQ01fRUEsCisgICAgQVZfQ09ERUNfSURfQURQQ01fRzcyNiwKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9DVCwKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9TV0YsCisgICAgQVZfQ09ERUNfSURfQURQQ01fWUFNQUhBLAorICAgIEFWX0NPREVDX0lEX0FEUENNX1NCUFJPXzQsCisgICAgQVZfQ09ERUNfSURfQURQQ01fU0JQUk9fMywKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9TQlBST18yLAorICAgIEFWX0NPREVDX0lEX0FEUENNX1RIUCwKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQU1WLAorICAgIEFWX0NPREVDX0lEX0FEUENNX0VBX1IxLAorICAgIEFWX0NPREVDX0lEX0FEUENNX0VBX1IzLAorICAgIEFWX0NPREVDX0lEX0FEUENNX0VBX1IyLAorICAgIEFWX0NPREVDX0lEX0FEUENNX0lNQV9FQV9TRUFELAorICAgIEFWX0NPREVDX0lEX0FEUENNX0lNQV9FQV9FQUNTLAorICAgIEFWX0NPREVDX0lEX0FEUENNX0VBX1hBUywKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9FQV9NQVhJU19YQSwKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfSVNTLAorICAgIEFWX0NPREVDX0lEX0FEUENNX0c3MjIsCisgICAgQVZfQ09ERUNfSURfQURQQ01fSU1BX0FQQywKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9WSU1BX0RFUFJFQ0FURUQsCisgICAgQVZfQ09ERUNfSURfQURQQ01fVklNQSA9IE1LQkVUQUcoJ1YnLCdJJywnTScsJ0EnKSwKKyAgICBBVl9DT0RFQ19JRF9WSU1BICAgICAgID0gTUtCRVRBRygnVicsJ0knLCdNJywnQScpLAorICAgIEFWX0NPREVDX0lEX0FEUENNX0FGQyAgPSBNS0JFVEFHKCdBJywnRicsJ0MnLCcgJyksCisgICAgQVZfQ09ERUNfSURfQURQQ01fSU1BX09LSSA9IE1LQkVUQUcoJ08nLCdLJywnSScsJyAnKSwKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9EVEsgID0gTUtCRVRBRygnRCcsJ1QnLCdLJywnICcpLAorICAgIEFWX0NPREVDX0lEX0FEUENNX0lNQV9SQUQgPSBNS0JFVEFHKCdSJywnQScsJ0QnLCcgJyksCisgICAgQVZfQ09ERUNfSURfQURQQ01fRzcyNkxFID0gTUtCRVRBRygnNicsJzInLCc3JywnRycpLAorCisgICAgLyogQU1SICovCisgICAgQVZfQ09ERUNfSURfQU1SX05CID0gMHgxMjAwMCwKKyAgICBBVl9DT0RFQ19JRF9BTVJfV0IsCisKKyAgICAvKiBSZWFsQXVkaW8gY29kZWNzKi8KKyAgICBBVl9DT0RFQ19JRF9SQV8xNDQgPSAweDEzMDAwLAorICAgIEFWX0NPREVDX0lEX1JBXzI4OCwKKworICAgIC8qIHZhcmlvdXMgRFBDTSBjb2RlY3MgKi8KKyAgICBBVl9DT0RFQ19JRF9ST1FfRFBDTSA9IDB4MTQwMDAsCisgICAgQVZfQ09ERUNfSURfSU5URVJQTEFZX0RQQ00sCisgICAgQVZfQ09ERUNfSURfWEFOX0RQQ00sCisgICAgQVZfQ09ERUNfSURfU09MX0RQQ00sCisKKyAgICAvKiBhdWRpbyBjb2RlY3MgKi8KKyAgICBBVl9DT0RFQ19JRF9NUDIgPSAweDE1MDAwLAorICAgIEFWX0NPREVDX0lEX01QMywgLy8vPCBwcmVmZXJyZWQgSUQgZm9yIGRlY29kaW5nIE1QRUcgYXVkaW8gbGF5ZXIgMSwgMiBvciAzCisgICAgQVZfQ09ERUNfSURfQUFDLAorICAgIEFWX0NPREVDX0lEX0FDMywKKyAgICBBVl9DT0RFQ19JRF9EVFMsCisgICAgQVZfQ09ERUNfSURfVk9SQklTLAorICAgIEFWX0NPREVDX0lEX0RWQVVESU8sCisgICAgQVZfQ09ERUNfSURfV01BVjEsCisgICAgQVZfQ09ERUNfSURfV01BVjIsCisgICAgQVZfQ09ERUNfSURfTUFDRTMsCisgICAgQVZfQ09ERUNfSURfTUFDRTYsCisgICAgQVZfQ09ERUNfSURfVk1EQVVESU8sCisgICAgQVZfQ09ERUNfSURfRkxBQywKKyAgICBBVl9DT0RFQ19JRF9NUDNBRFUsCisgICAgQVZfQ09ERUNfSURfTVAzT040LAorICAgIEFWX0NPREVDX0lEX1NIT1JURU4sCisgICAgQVZfQ09ERUNfSURfQUxBQywKKyAgICBBVl9DT0RFQ19JRF9XRVNUV09PRF9TTkQxLAorICAgIEFWX0NPREVDX0lEX0dTTSwgLy8vPCBhcyBpbiBCZXJsaW4gdG9hc3QgZm9ybWF0CisgICAgQVZfQ09ERUNfSURfUURNMiwKKyAgICBBVl9DT0RFQ19JRF9DT09LLAorICAgIEFWX0NPREVDX0lEX1RSVUVTUEVFQ0gsCisgICAgQVZfQ09ERUNfSURfVFRBLAorICAgIEFWX0NPREVDX0lEX1NNQUNLQVVESU8sCisgICAgQVZfQ09ERUNfSURfUUNFTFAsCisgICAgQVZfQ09ERUNfSURfV0FWUEFDSywKKyAgICBBVl9DT0RFQ19JRF9EU0lDSU5BVURJTywKKyAgICBBVl9DT0RFQ19JRF9JTUMsCisgICAgQVZfQ09ERUNfSURfTVVTRVBBQ0s3LAorICAgIEFWX0NPREVDX0lEX01MUCwKKyAgICBBVl9DT0RFQ19JRF9HU01fTVMsIC8qIGFzIGZvdW5kIGluIFdBViAqLworICAgIEFWX0NPREVDX0lEX0FUUkFDMywKKyNpZiBGRl9BUElfVk9YV0FSRQorICAgIEFWX0NPREVDX0lEX1ZPWFdBUkUsCisjZW5kaWYKKyAgICBBVl9DT0RFQ19JRF9BUEUsCisgICAgQVZfQ09ERUNfSURfTkVMTFlNT1NFUiwKKyAgICBBVl9DT0RFQ19JRF9NVVNFUEFDSzgsCisgICAgQVZfQ09ERUNfSURfU1BFRVgsCisgICAgQVZfQ09ERUNfSURfV01BVk9JQ0UsCisgICAgQVZfQ09ERUNfSURfV01BUFJPLAorICAgIEFWX0NPREVDX0lEX1dNQUxPU1NMRVNTLAorICAgIEFWX0NPREVDX0lEX0FUUkFDM1AsCisgICAgQVZfQ09ERUNfSURfRUFDMywKKyAgICBBVl9DT0RFQ19JRF9TSVBSLAorICAgIEFWX0NPREVDX0lEX01QMSwKKyAgICBBVl9DT0RFQ19JRF9UV0lOVlEsCisgICAgQVZfQ09ERUNfSURfVFJVRUhELAorICAgIEFWX0NPREVDX0lEX01QNEFMUywKKyAgICBBVl9DT0RFQ19JRF9BVFJBQzEsCisgICAgQVZfQ09ERUNfSURfQklOS0FVRElPX1JERlQsCisgICAgQVZfQ09ERUNfSURfQklOS0FVRElPX0RDVCwKKyAgICBBVl9DT0RFQ19JRF9BQUNfTEFUTSwKKyAgICBBVl9DT0RFQ19JRF9RRE1DLAorICAgIEFWX0NPREVDX0lEX0NFTFQsCisgICAgQVZfQ09ERUNfSURfRzcyM18xLAorICAgIEFWX0NPREVDX0lEX0c3MjksCisgICAgQVZfQ09ERUNfSURfOFNWWF9FWFAsCisgICAgQVZfQ09ERUNfSURfOFNWWF9GSUIsCisgICAgQVZfQ09ERUNfSURfQk1WX0FVRElPLAorICAgIEFWX0NPREVDX0lEX1JBTEYsCisgICAgQVZfQ09ERUNfSURfSUFDLAorICAgIEFWX0NPREVDX0lEX0lMQkMsCisgICAgQVZfQ09ERUNfSURfT1BVU19ERVBSRUNBVEVELAorICAgIEFWX0NPREVDX0lEX0NPTUZPUlRfTk9JU0UsCisgICAgQVZfQ09ERUNfSURfVEFLX0RFUFJFQ0FURUQsCisgICAgQVZfQ09ERUNfSURfTUVUQVNPVU5ELAorICAgIEFWX0NPREVDX0lEX1BBRl9BVURJT19ERVBSRUNBVEVELAorICAgIEFWX0NPREVDX0lEX09OMkFWQywKKyAgICBBVl9DT0RFQ19JRF9GRldBVkVTWU5USCA9IE1LQkVUQUcoJ0YnLCdGJywnVycsJ1MnKSwKKyAgICBBVl9DT0RFQ19JRF9TT05JQyAgICAgICA9IE1LQkVUQUcoJ1MnLCdPJywnTicsJ0MnKSwKKyAgICBBVl9DT0RFQ19JRF9TT05JQ19MUyAgICA9IE1LQkVUQUcoJ1MnLCdPJywnTicsJ0wnKSwKKyAgICBBVl9DT0RFQ19JRF9QQUZfQVVESU8gICA9IE1LQkVUQUcoJ1AnLCdBJywnRicsJ0EnKSwKKyAgICBBVl9DT0RFQ19JRF9PUFVTICAgICAgICA9IE1LQkVUQUcoJ08nLCdQJywnVScsJ1MnKSwKKyAgICBBVl9DT0RFQ19JRF9UQUsgICAgICAgICA9IE1LQkVUQUcoJ3QnLCdCJywnYScsJ0snKSwKKyAgICBBVl9DT0RFQ19JRF9FVlJDICAgICAgICA9IE1LQkVUQUcoJ3MnLCdlJywndicsJ2MnKSwKKyAgICBBVl9DT0RFQ19JRF9TTVYgICAgICAgICA9IE1LQkVUQUcoJ3MnLCdzJywnbScsJ3YnKSwKKyAgICBBVl9DT0RFQ19JRF9EU0RfTFNCRiAgICA9IE1LQkVUQUcoJ0QnLCdTJywnRCcsJ0wnKSwKKyAgICBBVl9DT0RFQ19JRF9EU0RfTVNCRiAgICA9IE1LQkVUQUcoJ0QnLCdTJywnRCcsJ00nKSwKKyAgICBBVl9DT0RFQ19JRF9EU0RfTFNCRl9QTEFOQVIgPSBNS0JFVEFHKCdEJywnUycsJ0QnLCcxJyksCisgICAgQVZfQ09ERUNfSURfRFNEX01TQkZfUExBTkFSID0gTUtCRVRBRygnRCcsJ1MnLCdEJywnOCcpLAorCisgICAgLyogc3VidGl0bGUgY29kZWNzICovCisgICAgQVZfQ09ERUNfSURfRklSU1RfU1VCVElUTEUgPSAweDE3MDAwLCAgICAgICAgICAvLy88IEEgZHVtbXkgSUQgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mIHN1YnRpdGxlIGNvZGVjcy4KKyAgICBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEUgPSAweDE3MDAwLAorICAgIEFWX0NPREVDX0lEX0RWQl9TVUJUSVRMRSwKKyAgICBBVl9DT0RFQ19JRF9URVhULCAgLy8vPCByYXcgVVRGLTggdGV4dAorICAgIEFWX0NPREVDX0lEX1hTVUIsCisgICAgQVZfQ09ERUNfSURfU1NBLAorICAgIEFWX0NPREVDX0lEX01PVl9URVhULAorICAgIEFWX0NPREVDX0lEX0hETVZfUEdTX1NVQlRJVExFLAorICAgIEFWX0NPREVDX0lEX0RWQl9URUxFVEVYVCwKKyAgICBBVl9DT0RFQ19JRF9TUlQsCisgICAgQVZfQ09ERUNfSURfTUlDUk9EVkQgICA9IE1LQkVUQUcoJ20nLCdEJywnVicsJ0QnKSwKKyAgICBBVl9DT0RFQ19JRF9FSUFfNjA4ICAgID0gTUtCRVRBRygnYycsJzYnLCcwJywnOCcpLAorICAgIEFWX0NPREVDX0lEX0pBQ09TVUIgICAgPSBNS0JFVEFHKCdKJywnUycsJ1UnLCdCJyksCisgICAgQVZfQ09ERUNfSURfU0FNSSAgICAgICA9IE1LQkVUQUcoJ1MnLCdBJywnTScsJ0knKSwKKyAgICBBVl9DT0RFQ19JRF9SRUFMVEVYVCAgID0gTUtCRVRBRygnUicsJ1QnLCdYJywnVCcpLAorICAgIEFWX0NPREVDX0lEX1NUTCAgICAgICAgPSBNS0JFVEFHKCdTJywncCcsJ1QnLCdMJyksCisgICAgQVZfQ09ERUNfSURfU1VCVklFV0VSMSA9IE1LQkVUQUcoJ1MnLCdiJywnVicsJzEnKSwKKyAgICBBVl9DT0RFQ19JRF9TVUJWSUVXRVIgID0gTUtCRVRBRygnUycsJ3UnLCdiJywnVicpLAorICAgIEFWX0NPREVDX0lEX1NVQlJJUCAgICAgPSBNS0JFVEFHKCdTJywnUicsJ2knLCdwJyksCisgICAgQVZfQ09ERUNfSURfV0VCVlRUICAgICA9IE1LQkVUQUcoJ1cnLCdWJywnVCcsJ1QnKSwKKyAgICBBVl9DT0RFQ19JRF9NUEwyICAgICAgID0gTUtCRVRBRygnTScsJ1AnLCdMJywnMicpLAorICAgIEFWX0NPREVDX0lEX1ZQTEFZRVIgICAgPSBNS0JFVEFHKCdWJywnUCcsJ2wnLCdyJyksCisgICAgQVZfQ09ERUNfSURfUEpTICAgICAgICA9IE1LQkVUQUcoJ1AnLCdoJywnSicsJ1MnKSwKKyAgICBBVl9DT0RFQ19JRF9BU1MgICAgICAgID0gTUtCRVRBRygnQScsJ1MnLCdTJywnICcpLCAgLy8vPCBBU1MgYXMgZGVmaW5lZCBpbiBNYXRyb3NrYQorCisgICAgLyogb3RoZXIgc3BlY2lmaWMga2luZCBvZiBjb2RlY3MgKGdlbmVyYWxseSB1c2VkIGZvciBhdHRhY2htZW50cykgKi8KKyAgICBBVl9DT0RFQ19JRF9GSVJTVF9VTktOT1dOID0gMHgxODAwMCwgICAgICAgICAgIC8vLzwgQSBkdW1teSBJRCBwb2ludGluZyBhdCB0aGUgc3RhcnQgb2YgdmFyaW91cyBmYWtlIGNvZGVjcy4KKyAgICBBVl9DT0RFQ19JRF9UVEYgPSAweDE4MDAwLAorICAgIEFWX0NPREVDX0lEX0JJTlRFWFQgICAgPSBNS0JFVEFHKCdCJywnVCcsJ1gnLCdUJyksCisgICAgQVZfQ09ERUNfSURfWEJJTiAgICAgICA9IE1LQkVUQUcoJ1gnLCdCJywnSScsJ04nKSwKKyAgICBBVl9DT0RFQ19JRF9JREYgICAgICAgID0gTUtCRVRBRyggMCAsJ0knLCdEJywnRicpLAorICAgIEFWX0NPREVDX0lEX09URiAgICAgICAgPSBNS0JFVEFHKCAwICwnTycsJ1QnLCdGJyksCisgICAgQVZfQ09ERUNfSURfU01QVEVfS0xWICA9IE1LQkVUQUcoJ0snLCdMJywnVicsJ0EnKSwKKyAgICBBVl9DT0RFQ19JRF9EVkRfTkFWICAgID0gTUtCRVRBRygnRCcsJ04nLCdBJywnVicpLAorICAgIEFWX0NPREVDX0lEX1RJTUVEX0lEMyAgPSBNS0JFVEFHKCdUJywnSScsJ0QnLCczJyksCisgICAgQVZfQ09ERUNfSURfQklOX0RBVEEgICA9IE1LQkVUQUcoJ0QnLCdBJywnVCcsJ0EnKSwKKworCisgICAgQVZfQ09ERUNfSURfUFJPQkUgPSAweDE5MDAwLCAvLy88IGNvZGVjX2lkIGlzIG5vdCBrbm93biAobGlrZSBBVl9DT0RFQ19JRF9OT05FKSBidXQgbGF2ZiBzaG91bGQgYXR0ZW1wdCB0byBpZGVudGlmeSBpdAorCisgICAgQVZfQ09ERUNfSURfTVBFRzJUUyA9IDB4MjAwMDAsIC8qKjwgX0ZBS0VfIGNvZGVjIHRvIGluZGljYXRlIGEgcmF3IE1QRUctMiBUUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0cmVhbSAob25seSB1c2VkIGJ5IGxpYmF2Zm9ybWF0KSAqLworICAgIEFWX0NPREVDX0lEX01QRUc0U1lTVEVNUyA9IDB4MjAwMDEsIC8qKjwgX0ZBS0VfIGNvZGVjIHRvIGluZGljYXRlIGEgTVBFRy00IFN5c3RlbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdHJlYW0gKG9ubHkgdXNlZCBieSBsaWJhdmZvcm1hdCkgKi8KKyAgICBBVl9DT0RFQ19JRF9GRk1FVEFEQVRBID0gMHgyMTAwMCwgICAvLy88IER1bW15IGNvZGVjIGZvciBzdHJlYW1zIGNvbnRhaW5pbmcgb25seSBtZXRhZGF0YSBpbmZvcm1hdGlvbi4KKworI2lmIEZGX0FQSV9DT0RFQ19JRAorI2luY2x1ZGUgIm9sZF9jb2RlY19pZHMuaCIKKyNlbmRpZgorfTsKKworLyoqCisgKiBUaGlzIHN0cnVjdCBkZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgYSBzaW5nbGUgY29kZWMgZGVzY3JpYmVkIGJ5IGFuCisgKiBBVkNvZGVjSUQuCisgKiBAc2VlIGF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoKQorICovCit0eXBlZGVmIHN0cnVjdCBBVkNvZGVjRGVzY3JpcHRvciB7CisgICAgZW51bSBBVkNvZGVjSUQgICAgIGlkOworICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZTsKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBjb2RlYyBkZXNjcmliZWQgYnkgdGhpcyBkZXNjcmlwdG9yLiBJdCBpcyBub24tZW1wdHkgYW5kCisgICAgICogdW5pcXVlIGZvciBlYWNoIGNvZGVjIGRlc2NyaXB0b3IuIEl0IHNob3VsZCBjb250YWluIGFscGhhbnVtZXJpYworICAgICAqIGNoYXJhY3RlcnMgYW5kICdfJyBvbmx5LgorICAgICAqLworICAgIGNvbnN0IGNoYXIgICAgICAqbmFtZTsKKyAgICAvKioKKyAgICAgKiBBIG1vcmUgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhpcyBjb2RlYy4gTWF5IGJlIE5VTEwuCisgICAgICovCisgICAgY29uc3QgY2hhciAqbG9uZ19uYW1lOworICAgIC8qKgorICAgICAqIENvZGVjIHByb3BlcnRpZXMsIGEgY29tYmluYXRpb24gb2YgQVZfQ09ERUNfUFJPUF8qIGZsYWdzLgorICAgICAqLworICAgIGludCAgICAgICAgICAgICBwcm9wczsKKworICAgIC8qKgorICAgICAqIE1JTUUgdHlwZShzKSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvZGVjLgorICAgICAqIE1heSBiZSBOVUxMOyBpZiBub3QsIGEgTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIE1JTUUgdHlwZXMuCisgICAgICogVGhlIGZpcnN0IGl0ZW0gaXMgYWx3YXlzIG5vbi1OVUxMIGFuZCBpcyB0aGUgcHJlZmVycmVkIE1JTUUgdHlwZS4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpjb25zdCAqbWltZV90eXBlczsKK30gQVZDb2RlY0Rlc2NyaXB0b3I7CisKKy8qKgorICogQ29kZWMgdXNlcyBvbmx5IGludHJhIGNvbXByZXNzaW9uLgorICogVmlkZW8gY29kZWNzIG9ubHkuCisgKi8KKyNkZWZpbmUgQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZICAgICgxIDw8IDApCisvKioKKyAqIENvZGVjIHN1cHBvcnRzIGxvc3N5IGNvbXByZXNzaW9uLiBBdWRpbyBhbmQgdmlkZW8gY29kZWNzIG9ubHkuCisgKiBAbm90ZSBhIGNvZGVjIG1heSBzdXBwb3J0IGJvdGggbG9zc3kgYW5kIGxvc3NsZXNzCisgKiBjb21wcmVzc2lvbiBtb2RlcworICovCisjZGVmaW5lIEFWX0NPREVDX1BST1BfTE9TU1kgICAgICAgICAoMSA8PCAxKQorLyoqCisgKiBDb2RlYyBzdXBwb3J0cyBsb3NzbGVzcyBjb21wcmVzc2lvbi4gQXVkaW8gYW5kIHZpZGVvIGNvZGVjcyBvbmx5LgorICovCisjZGVmaW5lIEFWX0NPREVDX1BST1BfTE9TU0xFU1MgICAgICAoMSA8PCAyKQorLyoqCisgKiBDb2RlYyBzdXBwb3J0cyBmcmFtZSByZW9yZGVyaW5nLiBUaGF0IGlzLCB0aGUgY29kZWQgb3JkZXIgKHRoZSBvcmRlciBpbiB3aGljaAorICogdGhlIGVuY29kZWQgcGFja2V0cyBhcmUgb3V0cHV0IGJ5IHRoZSBlbmNvZGVycyAvIHN0b3JlZCAvIGlucHV0IHRvIHRoZQorICogZGVjb2RlcnMpIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgcHJlc2VudGF0aW9uIG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nCisgKiBmcmFtZXMuCisgKgorICogRm9yIGNvZGVjcyB0aGF0IGRvIG5vdCBoYXZlIHRoaXMgcHJvcGVydHkgc2V0LCBQVFMgYW5kIERUUyBzaG91bGQgYWx3YXlzIGJlCisgKiBlcXVhbC4KKyAqLworI2RlZmluZSBBVl9DT0RFQ19QUk9QX1JFT1JERVIgICAgICAgKDEgPDwgMykKKy8qKgorICogU3VidGl0bGUgY29kZWMgaXMgYml0bWFwIGJhc2VkCisgKiBEZWNvZGVkIEFWU3VidGl0bGUgZGF0YSBjYW4gYmUgcmVhZCBmcm9tIHRoZSBBVlN1YnRpdGxlUmVjdC0+cGljdCBmaWVsZC4KKyAqLworI2RlZmluZSBBVl9DT0RFQ19QUk9QX0JJVE1BUF9TVUIgICAgKDEgPDwgMTYpCisvKioKKyAqIFN1YnRpdGxlIGNvZGVjIGlzIHRleHQgYmFzZWQuCisgKiBEZWNvZGVkIEFWU3VidGl0bGUgZGF0YSBjYW4gYmUgcmVhZCBmcm9tIHRoZSBBVlN1YnRpdGxlUmVjdC0+YXNzIGZpZWxkLgorICovCisjZGVmaW5lIEFWX0NPREVDX1BST1BfVEVYVF9TVUIgICAgICAoMSA8PCAxNykKKworLyoqCisgKiBAaW5ncm91cCBsYXZjX2RlY29kaW5nCisgKiBSZXF1aXJlZCBudW1iZXIgb2YgYWRkaXRpb25hbGx5IGFsbG9jYXRlZCBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBiaXRzdHJlYW0gZm9yIGRlY29kaW5nLgorICogVGhpcyBpcyBtYWlubHkgbmVlZGVkIGJlY2F1c2Ugc29tZSBvcHRpbWl6ZWQgYml0c3RyZWFtIHJlYWRlcnMgcmVhZAorICogMzIgb3IgNjQgYml0IGF0IG9uY2UgYW5kIGNvdWxkIHJlYWQgb3ZlciB0aGUgZW5kLjxicj4KKyAqIE5vdGU6IElmIHRoZSBmaXJzdCAyMyBiaXRzIG9mIHRoZSBhZGRpdGlvbmFsIGJ5dGVzIGFyZSBub3QgMCwgdGhlbiBkYW1hZ2VkCisgKiBNUEVHIGJpdHN0cmVhbXMgY291bGQgY2F1c2Ugb3ZlcnJlYWQgYW5kIHNlZ2ZhdWx0LgorICovCisjZGVmaW5lIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgMzIKKworLyoqCisgKiBAaW5ncm91cCBsYXZjX2VuY29kaW5nCisgKiBtaW5pbXVtIGVuY29kaW5nIGJ1ZmZlciBzaXplCisgKiBVc2VkIHRvIGF2b2lkIHNvbWUgY2hlY2tzIGR1cmluZyBoZWFkZXIgd3JpdGluZy4KKyAqLworI2RlZmluZSBGRl9NSU5fQlVGRkVSX1NJWkUgMTYzODQKKworCisvKioKKyAqIEBpbmdyb3VwIGxhdmNfZW5jb2RpbmcKKyAqIG1vdGlvbiBlc3RpbWF0aW9uIHR5cGUuCisgKi8KK2VudW0gTW90aW9uX0VzdF9JRCB7CisgICAgTUVfWkVSTyA9IDEsICAgIC8vLzwgbm8gc2VhcmNoLCB0aGF0IGlzIHVzZSAwLDAgdmVjdG9yIHdoZW5ldmVyIG9uZSBpcyBuZWVkZWQKKyAgICBNRV9GVUxMLAorICAgIE1FX0xPRywKKyAgICBNRV9QSE9EUywKKyAgICBNRV9FUFpTLCAgICAgICAgLy8vPCBlbmhhbmNlZCBwcmVkaWN0aXZlIHpvbmFsIHNlYXJjaAorICAgIE1FX1gxLCAgICAgICAgICAvLy88IHJlc2VydmVkIGZvciBleHBlcmltZW50cworICAgIE1FX0hFWCwgICAgICAgICAvLy88IGhleGFnb24gYmFzZWQgc2VhcmNoCisgICAgTUVfVU1ILCAgICAgICAgIC8vLzwgdW5ldmVuIG11bHRpLWhleGFnb24gc2VhcmNoCisgICAgTUVfVEVTQSwgICAgICAgIC8vLzwgdHJhbnNmb3JtZWQgZXhoYXVzdGl2ZSBzZWFyY2ggYWxnb3JpdGhtCisgICAgTUVfSVRFUj01MCwgICAgIC8vLzwgaXRlcmF0aXZlIHNlYXJjaAorfTsKKworLyoqCisgKiBAaW5ncm91cCBsYXZjX2RlY29kaW5nCisgKi8KK2VudW0gQVZEaXNjYXJkeworICAgIC8qIFdlIGxlYXZlIHNvbWUgc3BhY2UgYmV0d2VlbiB0aGVtIGZvciBleHRlbnNpb25zIChkcm9wIHNvbWUKKyAgICAgKiBrZXlmcmFtZXMgZm9yIGludHJhLW9ubHkgb3IgZHJvcCBqdXN0IHNvbWUgYmlkaXIgZnJhbWVzKS4gKi8KKyAgICBBVkRJU0NBUkRfTk9ORSAgICA9LTE2LCAvLy88IGRpc2NhcmQgbm90aGluZworICAgIEFWRElTQ0FSRF9ERUZBVUxUID0gIDAsIC8vLzwgZGlzY2FyZCB1c2VsZXNzIHBhY2tldHMgbGlrZSAwIHNpemUgcGFja2V0cyBpbiBhdmkKKyAgICBBVkRJU0NBUkRfTk9OUkVGICA9ICA4LCAvLy88IGRpc2NhcmQgYWxsIG5vbiByZWZlcmVuY2UKKyAgICBBVkRJU0NBUkRfQklESVIgICA9IDE2LCAvLy88IGRpc2NhcmQgYWxsIGJpZGlyZWN0aW9uYWwgZnJhbWVzCisgICAgQVZESVNDQVJEX05PTklOVFJBPSAyNCwgLy8vPCBkaXNjYXJkIGFsbCBub24gaW50cmEgZnJhbWVzCisgICAgQVZESVNDQVJEX05PTktFWSAgPSAzMiwgLy8vPCBkaXNjYXJkIGFsbCBmcmFtZXMgZXhjZXB0IGtleWZyYW1lcworICAgIEFWRElTQ0FSRF9BTEwgICAgID0gNDgsIC8vLzwgZGlzY2FyZCBhbGwKK307CisKK2VudW0gQVZBdWRpb1NlcnZpY2VUeXBlIHsKKyAgICBBVl9BVURJT19TRVJWSUNFX1RZUEVfTUFJTiAgICAgICAgICAgICAgPSAwLAorICAgIEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9FRkZFQ1RTICAgICAgICAgICA9IDEsCisgICAgQVZfQVVESU9fU0VSVklDRV9UWVBFX1ZJU1VBTExZX0lNUEFJUkVEID0gMiwKKyAgICBBVl9BVURJT19TRVJWSUNFX1RZUEVfSEVBUklOR19JTVBBSVJFRCAgPSAzLAorICAgIEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9ESUFMT0dVRSAgICAgICAgICA9IDQsCisgICAgQVZfQVVESU9fU0VSVklDRV9UWVBFX0NPTU1FTlRBUlkgICAgICAgID0gNSwKKyAgICBBVl9BVURJT19TRVJWSUNFX1RZUEVfRU1FUkdFTkNZICAgICAgICAgPSA2LAorICAgIEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9WT0lDRV9PVkVSICAgICAgICA9IDcsCisgICAgQVZfQVVESU9fU0VSVklDRV9UWVBFX0tBUkFPS0UgICAgICAgICAgID0gOCwKKyAgICBBVl9BVURJT19TRVJWSUNFX1RZUEVfTkIgICAgICAgICAgICAgICAgICAgLCAvLy88IE5vdCBwYXJ0IG9mIEFCSQorfTsKKworLyoqCisgKiBAaW5ncm91cCBsYXZjX2VuY29kaW5nCisgKi8KK3R5cGVkZWYgc3RydWN0IFJjT3ZlcnJpZGV7CisgICAgaW50IHN0YXJ0X2ZyYW1lOworICAgIGludCBlbmRfZnJhbWU7CisgICAgaW50IHFzY2FsZTsgLy8gSWYgdGhpcyBpcyAwIHRoZW4gcXVhbGl0eV9mYWN0b3Igd2lsbCBiZSB1c2VkIGluc3RlYWQuCisgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3I7Cit9IFJjT3ZlcnJpZGU7CisKKyNpZiBGRl9BUElfTUFYX0JGUkFNRVMKKy8qKgorICogQGRlcHJlY2F0ZWQgdGhlcmUgaXMgbm8gbGliYXZjb2RlYy13aWRlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgQi1mcmFtZXMKKyAqLworI2RlZmluZSBGRl9NQVhfQl9GUkFNRVMgMTYKKyNlbmRpZgorCisvKiBlbmNvZGluZyBzdXBwb3J0CisgICBUaGVzZSBmbGFncyBjYW4gYmUgcGFzc2VkIGluIEFWQ29kZWNDb250ZXh0LmZsYWdzIGJlZm9yZSBpbml0aWFsaXphdGlvbi4KKyAgIE5vdGU6IE5vdCBldmVyeXRoaW5nIGlzIHN1cHBvcnRlZCB5ZXQuCisqLworCisvKioKKyAqIEFsbG93IGRlY29kZXJzIHRvIHByb2R1Y2UgZnJhbWVzIHdpdGggZGF0YSBwbGFuZXMgdGhhdCBhcmUgbm90IGFsaWduZWQKKyAqIHRvIENQVSByZXF1aXJlbWVudHMgKGUuZy4gZHVlIHRvIGNyb3BwaW5nKS4KKyAqLworI2RlZmluZSBDT0RFQ19GTEFHX1VOQUxJR05FRCAweDAwMDEKKyNkZWZpbmUgQ09ERUNfRkxBR19RU0NBTEUgMHgwMDAyICAvLy88IFVzZSBmaXhlZCBxc2NhbGUuCisjZGVmaW5lIENPREVDX0ZMQUdfNE1WICAgIDB4MDAwNCAgLy8vPCA0IE1WIHBlciBNQiBhbGxvd2VkIC8gYWR2YW5jZWQgcHJlZGljdGlvbiBmb3IgSC4yNjMuCisjZGVmaW5lIENPREVDX0ZMQUdfT1VUUFVUX0NPUlJVUFQgMHgwMDA4IC8vLzwgT3V0cHV0IGV2ZW4gdGhvc2UgZnJhbWVzIHRoYXQgbWlnaHQgYmUgY29ycnVwdGVkCisjZGVmaW5lIENPREVDX0ZMQUdfUVBFTCAgIDB4MDAxMCAgLy8vPCBVc2UgcXBlbCBNQy4KKyNpZiBGRl9BUElfR01DCisvKioKKyAqIEBkZXByZWNhdGVkIHVzZSB0aGUgImdtYyIgcHJpdmF0ZSBvcHRpb24gb2YgdGhlIGxpYnh2aWQgZW5jb2RlcgorICovCisjZGVmaW5lIENPREVDX0ZMQUdfR01DICAgIDB4MDAyMCAgLy8vPCBVc2UgR01DLgorI2VuZGlmCisjaWYgRkZfQVBJX01WMAorLyoqCisgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIGZsYWcgIm12MCIgaW4gdGhlICJtcHZfZmxhZ3MiIHByaXZhdGUgb3B0aW9uIG9mIHRoZQorICogbXBlZ3ZpZGVvIGVuY29kZXJzCisgKi8KKyNkZWZpbmUgQ09ERUNfRkxBR19NVjAgICAgMHgwMDQwCisjZW5kaWYKKyNpZiBGRl9BUElfSU5QVVRfUFJFU0VSVkVECisvKioKKyAqIEBkZXByZWNhdGVkIHBhc3NpbmcgcmVmZXJlbmNlLWNvdW50ZWQgZnJhbWVzIHRvIHRoZSBlbmNvZGVycyByZXBsYWNlcyB0aGlzCisgKiBmbGFnCisgKi8KKyNkZWZpbmUgQ09ERUNfRkxBR19JTlBVVF9QUkVTRVJWRUQgMHgwMTAwCisjZW5kaWYKKyNkZWZpbmUgQ09ERUNfRkxBR19QQVNTMSAgICAgICAgICAgMHgwMjAwICAgLy8vPCBVc2UgaW50ZXJuYWwgMnBhc3MgcmF0ZWNvbnRyb2wgaW4gZmlyc3QgcGFzcyBtb2RlLgorI2RlZmluZSBDT0RFQ19GTEFHX1BBU1MyICAgICAgICAgICAweDA0MDAgICAvLy88IFVzZSBpbnRlcm5hbCAycGFzcyByYXRlY29udHJvbCBpbiBzZWNvbmQgcGFzcyBtb2RlLgorI2RlZmluZSBDT0RFQ19GTEFHX0dSQVkgICAgICAgICAgICAweDIwMDAgICAvLy88IE9ubHkgZGVjb2RlL2VuY29kZSBncmF5c2NhbGUuCisjaWYgRkZfQVBJX0VNVV9FREdFCisvKioKKyAqIEBkZXByZWNhdGVkIGVkZ2VzIGFyZSBub3QgdXNlZC9yZXF1aXJlZCBhbnltb3JlLiBJLmUuIHRoaXMgZmxhZyBpcyBub3cgYWx3YXlzCisgKiBzZXQuCisgKi8KKyNkZWZpbmUgQ09ERUNfRkxBR19FTVVfRURHRSAgICAgICAgMHg0MDAwCisjZW5kaWYKKyNkZWZpbmUgQ09ERUNfRkxBR19QU05SICAgICAgICAgICAgMHg4MDAwICAgLy8vPCBlcnJvcls/XSB2YXJpYWJsZXMgd2lsbCBiZSBzZXQgZHVyaW5nIGVuY29kaW5nLgorI2RlZmluZSBDT0RFQ19GTEFHX1RSVU5DQVRFRCAgICAgICAweDAwMDEwMDAwIC8qKiBJbnB1dCBiaXRzdHJlYW0gbWlnaHQgYmUgdHJ1bmNhdGVkIGF0IGEgcmFuZG9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uIGluc3RlYWQgb2Ygb25seSBhdCBmcmFtZSBib3VuZGFyaWVzLiAqLworI2lmIEZGX0FQSV9OT1JNQUxJWkVfQVFQCisvKioKKyAqIEBkZXByZWNhdGVkIHVzZSB0aGUgZmxhZyAibmFxIiBpbiB0aGUgIm1wdl9mbGFncyIgcHJpdmF0ZSBvcHRpb24gb2YgdGhlCisgKiBtcGVndmlkZW8gZW5jb2RlcnMKKyAqLworI2RlZmluZSBDT0RFQ19GTEFHX05PUk1BTElaRV9BUVAgIDB4MDAwMjAwMDAKKyNlbmRpZgorI2RlZmluZSBDT0RFQ19GTEFHX0lOVEVSTEFDRURfRENUIDB4MDAwNDAwMDAgLy8vPCBVc2UgaW50ZXJsYWNlZCBEQ1QuCisjZGVmaW5lIENPREVDX0ZMQUdfTE9XX0RFTEFZICAgICAgMHgwMDA4MDAwMCAvLy88IEZvcmNlIGxvdyBkZWxheS4KKyNkZWZpbmUgQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSICAweDAwNDAwMDAwIC8vLzwgUGxhY2UgZ2xvYmFsIGhlYWRlcnMgaW4gZXh0cmFkYXRhIGluc3RlYWQgb2YgZXZlcnkga2V5ZnJhbWUuCisjZGVmaW5lIENPREVDX0ZMQUdfQklURVhBQ1QgICAgICAgMHgwMDgwMDAwMCAvLy88IFVzZSBvbmx5IGJpdGV4YWN0IHN0dWZmIChleGNlcHQgKEkpRENUKS4KKy8qIEZ4IDogRmxhZyBmb3IgaDI2MysgZXh0cmEgb3B0aW9ucyAqLworI2RlZmluZSBDT0RFQ19GTEFHX0FDX1BSRUQgICAgICAgIDB4MDEwMDAwMDAgLy8vPCBILjI2MyBhZHZhbmNlZCBpbnRyYSBjb2RpbmcgLyBNUEVHLTQgQUMgcHJlZGljdGlvbgorI2RlZmluZSBDT0RFQ19GTEFHX0xPT1BfRklMVEVSICAgIDB4MDAwMDA4MDAgLy8vPCBsb29wIGZpbHRlcgorI2RlZmluZSBDT0RFQ19GTEFHX0lOVEVSTEFDRURfTUUgIDB4MjAwMDAwMDAgLy8vPCBpbnRlcmxhY2VkIG1vdGlvbiBlc3RpbWF0aW9uCisjZGVmaW5lIENPREVDX0ZMQUdfQ0xPU0VEX0dPUCAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBDT0RFQ19GTEFHMl9GQVNUICAgICAgICAgIDB4MDAwMDAwMDEgLy8vPCBBbGxvdyBub24gc3BlYyBjb21wbGlhbnQgc3BlZWR1cCB0cmlja3MuCisjZGVmaW5lIENPREVDX0ZMQUcyX05PX09VVFBVVCAgICAgMHgwMDAwMDAwNCAvLy88IFNraXAgYml0c3RyZWFtIGVuY29kaW5nLgorI2RlZmluZSBDT0RFQ19GTEFHMl9MT0NBTF9IRUFERVIgIDB4MDAwMDAwMDggLy8vPCBQbGFjZSBnbG9iYWwgaGVhZGVycyBhdCBldmVyeSBrZXlmcmFtZSBpbnN0ZWFkIG9mIGluIGV4dHJhZGF0YS4KKyNkZWZpbmUgQ09ERUNfRkxBRzJfRFJPUF9GUkFNRV9USU1FQ09ERSAweDAwMDAyMDAwIC8vLzwgdGltZWNvZGUgaXMgaW4gZHJvcCBmcmFtZSBmb3JtYXQuIERFUFJFQ0FURUQhISEhCisjZGVmaW5lIENPREVDX0ZMQUcyX0lHTk9SRV9DUk9QICAgMHgwMDAxMDAwMCAvLy88IERpc2NhcmQgY3JvcHBpbmcgaW5mb3JtYXRpb24gZnJvbSBTUFMuCisKKyNkZWZpbmUgQ09ERUNfRkxBRzJfQ0hVTktTICAgICAgICAweDAwMDA4MDAwIC8vLzwgSW5wdXQgYml0c3RyZWFtIG1pZ2h0IGJlIHRydW5jYXRlZCBhdCBhIHBhY2tldCBib3VuZGFyaWVzIGluc3RlYWQgb2Ygb25seSBhdCBmcmFtZSBib3VuZGFyaWVzLgorI2RlZmluZSBDT0RFQ19GTEFHMl9TSE9XX0FMTCAgICAgIDB4MDA0MDAwMDAgLy8vPCBTaG93IGFsbCBmcmFtZXMgYmVmb3JlIHRoZSBmaXJzdCBrZXlmcmFtZQorI2RlZmluZSBDT0RFQ19GTEFHMl9FWFBPUlRfTVZTICAgIDB4MTAwMDAwMDAgLy8vPCBFeHBvcnQgbW90aW9uIHZlY3RvcnMgdGhyb3VnaCBmcmFtZSBzaWRlIGRhdGEKKyNkZWZpbmUgQ09ERUNfRkxBRzJfU0tJUF9NQU5VQUwgICAweDIwMDAwMDAwIC8vLzwgRG8gbm90IHNraXAgc2FtcGxlcyBhbmQgZXhwb3J0IHNraXAgaW5mb3JtYXRpb24gYXMgZnJhbWUgc2lkZSBkYXRhCisKKy8qIFVuc3VwcG9ydGVkIG9wdGlvbnMgOgorICogICAgICAgICAgICAgIFN5bnRheCBBcml0aG1ldGljIGNvZGluZyAoU0FDKQorICogICAgICAgICAgICAgIFJlZmVyZW5jZSBQaWN0dXJlIFNlbGVjdGlvbgorICogICAgICAgICAgICAgIEluZGVwZW5kZW50IFNlZ21lbnQgRGVjb2RpbmcgKi8KKy8qIC9GeCAqLworLyogY29kZWMgY2FwYWJpbGl0aWVzICovCisKKyNkZWZpbmUgQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCAweDAwMDEgLy8vPCBEZWNvZGVyIGNhbiB1c2UgZHJhd19ob3Jpel9iYW5kIGNhbGxiYWNrLgorLyoqCisgKiBDb2RlYyB1c2VzIGdldF9idWZmZXIoKSBmb3IgYWxsb2NhdGluZyBidWZmZXJzIGFuZCBzdXBwb3J0cyBjdXN0b20gYWxsb2NhdG9ycy4KKyAqIElmIG5vdCBzZXQsIGl0IG1pZ2h0IG5vdCB1c2UgZ2V0X2J1ZmZlcigpIGF0IGFsbCBvciB1c2Ugb3BlcmF0aW9ucyB0aGF0CisgKiBhc3N1bWUgdGhlIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIGJ5IGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyLgorICovCisjZGVmaW5lIENPREVDX0NBUF9EUjEgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIENPREVDX0NBUF9UUlVOQ0FURUQgICAgICAgMHgwMDA4CisjaWYgRkZfQVBJX1hWTUMKKy8qIENvZGVjIGNhbiBleHBvcnQgZGF0YSBmb3IgSFcgZGVjb2RpbmcuIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdAorICogdGhlIGNvZGVjIHdvdWxkIGNhbGwgZ2V0X2Zvcm1hdCgpIHdpdGggbGlzdCB0aGF0IG1pZ2h0IGNvbnRhaW4gSFcgYWNjZWxlcmF0ZWQKKyAqIHBpeGVsIGZvcm1hdHMgKFh2TUMsIFZEUEFVLCBWQUFQSSwgZXRjKS4gVGhlIGFwcGxpY2F0aW9uIGNhbiBwaWNrIGFueSBvZiB0aGVtCisgKiBpbmNsdWRpbmcgcmF3IGltYWdlIGZvcm1hdC4KKyAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoZSBwYXNzZWQgY29udGV4dCB0byBkZXRlcm1pbmUgYml0c3RyZWFtIHZlcnNpb24sCisgKiBjaHJvbWEgZm9ybWF0LCByZXNvbHV0aW9uIGV0Yy4KKyAqLworI2RlZmluZSBDT0RFQ19DQVBfSFdBQ0NFTCAgICAgICAgIDB4MDAxMAorI2VuZGlmIC8qIEZGX0FQSV9YVk1DICovCisvKioKKyAqIEVuY29kZXIgb3IgZGVjb2RlciByZXF1aXJlcyBmbHVzaGluZyB3aXRoIE5VTEwgaW5wdXQgYXQgdGhlIGVuZCBpbiBvcmRlciB0bworICogZ2l2ZSB0aGUgY29tcGxldGUgYW5kIGNvcnJlY3Qgb3V0cHV0LgorICoKKyAqIE5PVEU6IElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCB0aGUgY29kZWMgaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBmZWQgd2l0aAorICogICAgICAgd2l0aCBOVUxMIGRhdGEuIFRoZSB1c2VyIGNhbiBzdGlsbCBzZW5kIE5VTEwgZGF0YSB0byB0aGUgcHVibGljIGVuY29kZQorICogICAgICAgb3IgZGVjb2RlIGZ1bmN0aW9uLCBidXQgbGliYXZjb2RlYyB3aWxsIG5vdCBwYXNzIGl0IGFsb25nIHRvIHRoZSBjb2RlYworICogICAgICAgdW5sZXNzIHRoaXMgZmxhZyBpcyBzZXQuCisgKgorICogRGVjb2RlcnM6CisgKiBUaGUgZGVjb2RlciBoYXMgYSBub24temVybyBkZWxheSBhbmQgbmVlZHMgdG8gYmUgZmVkIHdpdGggYXZwa3QtPmRhdGE9TlVMTCwKKyAqIGF2cGt0LT5zaXplPTAgYXQgdGhlIGVuZCB0byBnZXQgdGhlIGRlbGF5ZWQgZGF0YSB1bnRpbCB0aGUgZGVjb2RlciBubyBsb25nZXIKKyAqIHJldHVybnMgZnJhbWVzLgorICoKKyAqIEVuY29kZXJzOgorICogVGhlIGVuY29kZXIgbmVlZHMgdG8gYmUgZmVkIHdpdGggTlVMTCBkYXRhIGF0IHRoZSBlbmQgb2YgZW5jb2RpbmcgdW50aWwgdGhlCisgKiBlbmNvZGVyIG5vIGxvbmdlciByZXR1cm5zIGRhdGEuCisgKgorICogTk9URTogRm9yIGVuY29kZXJzIGltcGxlbWVudGluZyB0aGUgQVZDb2RlYy5lbmNvZGUyKCkgZnVuY3Rpb24sIHNldHRpbmcgdGhpcworICogICAgICAgZmxhZyBhbHNvIG1lYW5zIHRoYXQgdGhlIGVuY29kZXIgbXVzdCBzZXQgdGhlIHB0cyBhbmQgZHVyYXRpb24gZm9yCisgKiAgICAgICBlYWNoIG91dHB1dCBwYWNrZXQuIElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCB0aGUgcHRzIGFuZCBkdXJhdGlvbiB3aWxsCisgKiAgICAgICBiZSBkZXRlcm1pbmVkIGJ5IGxpYmF2Y29kZWMgZnJvbSB0aGUgaW5wdXQgZnJhbWUuCisgKi8KKyNkZWZpbmUgQ09ERUNfQ0FQX0RFTEFZICAgICAgICAgICAweDAwMjAKKy8qKgorICogQ29kZWMgY2FuIGJlIGZlZCBhIGZpbmFsIGZyYW1lIHdpdGggYSBzbWFsbGVyIHNpemUuCisgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgdHJ1bmNhdGlvbiBvZiB0aGUgbGFzdCBhdWRpbyBzYW1wbGVzLgorICovCisjZGVmaW5lIENPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FIDB4MDA0MAorI2lmIEZGX0FQSV9DQVBfVkRQQVUKKy8qKgorICogQ29kZWMgY2FuIGV4cG9ydCBkYXRhIGZvciBIVyBkZWNvZGluZyAoVkRQQVUpLgorICovCisjZGVmaW5lIENPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVICAgIDB4MDA4MAorI2VuZGlmCisvKioKKyAqIENvZGVjIGNhbiBvdXRwdXQgbXVsdGlwbGUgZnJhbWVzIHBlciBBVlBhY2tldAorICogTm9ybWFsbHkgZGVtdXhlcnMgcmV0dXJuIG9uZSBmcmFtZSBhdCBhIHRpbWUsIGRlbXV4ZXJzIHdoaWNoIGRvIG5vdCBkbworICogYXJlIGNvbm5lY3RlZCB0byBhIHBhcnNlciB0byBzcGxpdCB3aGF0IHRoZXkgcmV0dXJuIGludG8gcHJvcGVyIGZyYW1lcy4KKyAqIFRoaXMgZmxhZyBpcyByZXNlcnZlZCB0byB0aGUgdmVyeSByYXJlIGNhdGVnb3J5IG9mIGNvZGVjcyB3aGljaCBoYXZlIGEKKyAqIGJpdHN0cmVhbSB0aGF0IGNhbm5vdCBiZSBzcGxpdCBpbnRvIGZyYW1lcyB3aXRob3V0IHRpbWVjb25zdW1pbmcKKyAqIG9wZXJhdGlvbnMgbGlrZSBmdWxsIGRlY29kaW5nLiBEZW11eGVycyBjYXJyaW5nIHN1Y2ggYml0c3RyZWFtcyB0aHVzCisgKiBtYXkgcmV0dXJuIG11bHRpcGxlIGZyYW1lcyBpbiBhIHBhY2tldC4gVGhpcyBoYXMgbWFueSBkaXNhZHZhbnRhZ2VzIGxpa2UKKyAqIHByb2hpYml0aW5nIHN0cmVhbSBjb3B5IGluIG1hbnkgY2FzZXMgdGh1cyBpdCBzaG91bGQgb25seSBiZSBjb25zaWRlcmVkCisgKiBhcyBhIGxhc3QgcmVzb3J0LgorICovCisjZGVmaW5lIENPREVDX0NBUF9TVUJGUkFNRVMgICAgICAgIDB4MDEwMAorLyoqCisgKiBDb2RlYyBpcyBleHBlcmltZW50YWwgYW5kIGlzIHRodXMgYXZvaWRlZCBpbiBmYXZvciBvZiBub24gZXhwZXJpbWVudGFsCisgKiBlbmNvZGVycworICovCisjZGVmaW5lIENPREVDX0NBUF9FWFBFUklNRU5UQUwgICAgIDB4MDIwMAorLyoqCisgKiBDb2RlYyBzaG91bGQgZmlsbCBpbiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIHNhbXBsZXJhdGUgaW5zdGVhZCBvZiBjb250YWluZXIKKyAqLworI2RlZmluZSBDT0RFQ19DQVBfQ0hBTk5FTF9DT05GICAgICAweDA0MDAKKyNpZiBGRl9BUElfTkVHX0xJTkVTSVpFUworLyoqCisgKiBAZGVwcmVjYXRlZCBubyBjb2RlY3MgdXNlIHRoaXMgY2FwYWJpbGl0eQorICovCisjZGVmaW5lIENPREVDX0NBUF9ORUdfTElORVNJWkVTICAgIDB4MDgwMAorI2VuZGlmCisvKioKKyAqIENvZGVjIHN1cHBvcnRzIGZyYW1lLWxldmVsIG11bHRpdGhyZWFkaW5nLgorICovCisjZGVmaW5lIENPREVDX0NBUF9GUkFNRV9USFJFQURTICAgIDB4MTAwMAorLyoqCisgKiBDb2RlYyBzdXBwb3J0cyBzbGljZS1iYXNlZCAob3IgcGFydGl0aW9uLWJhc2VkKSBtdWx0aXRocmVhZGluZy4KKyAqLworI2RlZmluZSBDT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUyAgICAweDIwMDAKKy8qKgorICogQ29kZWMgc3VwcG9ydHMgY2hhbmdlZCBwYXJhbWV0ZXJzIGF0IGFueSBwb2ludC4KKyAqLworI2RlZmluZSBDT0RFQ19DQVBfUEFSQU1fQ0hBTkdFICAgICAweDQwMDAKKy8qKgorICogQ29kZWMgc3VwcG9ydHMgYXZjdHgtPnRocmVhZF9jb3VudCA9PSAwIChhdXRvKS4KKyAqLworI2RlZmluZSBDT0RFQ19DQVBfQVVUT19USFJFQURTICAgICAweDgwMDAKKy8qKgorICogQXVkaW8gZW5jb2RlciBzdXBwb3J0cyByZWNlaXZpbmcgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHNhbXBsZXMgaW4gZWFjaCBjYWxsLgorICovCisjZGVmaW5lIENPREVDX0NBUF9WQVJJQUJMRV9GUkFNRV9TSVpFIDB4MTAwMDAKKy8qKgorICogQ29kZWMgaXMgaW50cmEgb25seS4KKyAqLworI2RlZmluZSBDT0RFQ19DQVBfSU5UUkFfT05MWSAgICAgICAweDQwMDAwMDAwCisvKioKKyAqIENvZGVjIGlzIGxvc3NsZXNzLgorICovCisjZGVmaW5lIENPREVDX0NBUF9MT1NTTEVTUyAgICAgICAgIDB4ODAwMDAwMDAKKworI2lmIEZGX0FQSV9NQl9UWVBFCisvL1RoZSBmb2xsb3dpbmcgZGVmaW5lcyBtYXkgY2hhbmdlLCBkb24ndCBleHBlY3QgY29tcGF0aWJpbGl0eSBpZiB5b3UgdXNlIHRoZW0uCisjZGVmaW5lIE1CX1RZUEVfSU5UUkE0eDQgICAweDAwMDEKKyNkZWZpbmUgTUJfVFlQRV9JTlRSQTE2eDE2IDB4MDAwMiAvL0ZJWE1FIEguMjY0LXNwZWNpZmljCisjZGVmaW5lIE1CX1RZUEVfSU5UUkFfUENNICAweDAwMDQgLy9GSVhNRSBILjI2NC1zcGVjaWZpYworI2RlZmluZSBNQl9UWVBFXzE2eDE2ICAgICAgMHgwMDA4CisjZGVmaW5lIE1CX1RZUEVfMTZ4OCAgICAgICAweDAwMTAKKyNkZWZpbmUgTUJfVFlQRV84eDE2ICAgICAgIDB4MDAyMAorI2RlZmluZSBNQl9UWVBFXzh4OCAgICAgICAgMHgwMDQwCisjZGVmaW5lIE1CX1RZUEVfSU5URVJMQUNFRCAweDAwODAKKyNkZWZpbmUgTUJfVFlQRV9ESVJFQ1QyICAgIDB4MDEwMCAvL0ZJWE1FCisjZGVmaW5lIE1CX1RZUEVfQUNQUkVEICAgICAweDAyMDAKKyNkZWZpbmUgTUJfVFlQRV9HTUMgICAgICAgIDB4MDQwMAorI2RlZmluZSBNQl9UWVBFX1NLSVAgICAgICAgMHgwODAwCisjZGVmaW5lIE1CX1RZUEVfUDBMMCAgICAgICAweDEwMDAKKyNkZWZpbmUgTUJfVFlQRV9QMUwwICAgICAgIDB4MjAwMAorI2RlZmluZSBNQl9UWVBFX1AwTDEgICAgICAgMHg0MDAwCisjZGVmaW5lIE1CX1RZUEVfUDFMMSAgICAgICAweDgwMDAKKyNkZWZpbmUgTUJfVFlQRV9MMCAgICAgICAgIChNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AxTDApCisjZGVmaW5lIE1CX1RZUEVfTDEgICAgICAgICAoTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxKQorI2RlZmluZSBNQl9UWVBFX0wwTDEgICAgICAgKE1CX1RZUEVfTDAgICB8IE1CX1RZUEVfTDEpCisjZGVmaW5lIE1CX1RZUEVfUVVBTlQgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIE1CX1RZUEVfQ0JQICAgICAgICAweDAwMDIwMDAwCisvL05vdGUgYml0cyAyNC0zMSBhcmUgcmVzZXJ2ZWQgZm9yIGNvZGVjIHNwZWNpZmljIHVzZSAoaDI2NCByZWYwLCBtcGVnMSAwbXYsIC4uLikKKyNlbmRpZgorCisvKioKKyAqIFBhbiBTY2FuIGFyZWEuCisgKiBUaGlzIHNwZWNpZmllcyB0aGUgYXJlYSB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkLgorICogTm90ZSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgc3VjaCBhcmVhcyBmb3Igb25lIGZyYW1lLgorICovCit0eXBlZGVmIHN0cnVjdCBBVlBhblNjYW57CisgICAgLyoqCisgICAgICogaWQKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYy4KKyAgICAgKi8KKyAgICBpbnQgaWQ7CisKKyAgICAvKioKKyAgICAgKiB3aWR0aCBhbmQgaGVpZ2h0IGluIDEvMTYgcGVsCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMuCisgICAgICovCisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisKKyAgICAvKioKKyAgICAgKiBwb3NpdGlvbiBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIGluIDEvMTYgcGVsIGZvciB1cCB0byAzIGZpZWxkcy9mcmFtZXMKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYy4KKyAgICAgKi8KKyAgICBpbnQxNl90IHBvc2l0aW9uWzNdWzJdOworfUFWUGFuU2NhbjsKKworI2lmIEZGX0FQSV9RU0NBTEVfVFlQRQorI2RlZmluZSBGRl9RU0NBTEVfVFlQRV9NUEVHMSAwCisjZGVmaW5lIEZGX1FTQ0FMRV9UWVBFX01QRUcyIDEKKyNkZWZpbmUgRkZfUVNDQUxFX1RZUEVfSDI2NCAgMgorI2RlZmluZSBGRl9RU0NBTEVfVFlQRV9WUDU2ICAzCisjZW5kaWYKKworI2lmIEZGX0FQSV9HRVRfQlVGRkVSCisjZGVmaW5lIEZGX0JVRkZFUl9UWVBFX0lOVEVSTkFMIDEKKyNkZWZpbmUgRkZfQlVGRkVSX1RZUEVfVVNFUiAgICAgMiAvLy88IGRpcmVjdCByZW5kZXJpbmcgYnVmZmVycyAoaW1hZ2UgaXMgKGRlKWFsbG9jYXRlZCBieSB1c2VyKQorI2RlZmluZSBGRl9CVUZGRVJfVFlQRV9TSEFSRUQgICA0IC8vLzwgQnVmZmVyIGZyb20gc29tZXdoZXJlIGVsc2U7IGRvbid0IGRlYWxsb2NhdGUgaW1hZ2UgKGRhdGEvYmFzZSksIGFsbCBvdGhlciB0YWJsZXMgYXJlIG5vdCBzaGFyZWQuCisjZGVmaW5lIEZGX0JVRkZFUl9UWVBFX0NPUFkgICAgIDggLy8vPCBKdXN0IGEgKG1vZGlmaWVkKSBjb3B5IG9mIHNvbWUgb3RoZXIgYnVmZmVyLCBkb24ndCBkZWFsbG9jYXRlIGFueXRoaW5nLgorCisjZGVmaW5lIEZGX0JVRkZFUl9ISU5UU19WQUxJRCAgICAweDAxIC8vIEJ1ZmZlciBoaW50cyB2YWx1ZSBpcyBtZWFuaW5nZnVsIChpZiAwIGlnbm9yZSkuCisjZGVmaW5lIEZGX0JVRkZFUl9ISU5UU19SRUFEQUJMRSAweDAyIC8vIENvZGVjIHdpbGwgcmVhZCBmcm9tIGJ1ZmZlci4KKyNkZWZpbmUgRkZfQlVGRkVSX0hJTlRTX1BSRVNFUlZFIDB4MDQgLy8gVXNlciBtdXN0IG5vdCBhbHRlciBidWZmZXIgY29udGVudC4KKyNkZWZpbmUgRkZfQlVGRkVSX0hJTlRTX1JFVVNBQkxFIDB4MDggLy8gQ29kZWMgd2lsbCByZXVzZSB0aGUgYnVmZmVyICh1cGRhdGUpLgorI2VuZGlmCisKKy8qKgorICogVGhlIGRlY29kZXIgd2lsbCBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBmcmFtZSBhbmQgbWF5IHJldXNlIGl0IGxhdGVyLgorICovCisjZGVmaW5lIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYgKDEgPDwgMCkKKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2Y19wYWNrZXQgQVZQYWNrZXQKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggQVZQYWNrZXQuCisgKiBAeworICovCitlbnVtIEFWUGFja2V0U2lkZURhdGFUeXBlIHsKKyAgICBBVl9QS1RfREFUQV9QQUxFVFRFLAorICAgIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsCisKKyAgICAvKioKKyAgICAgKiBBbiBBVl9QS1RfREFUQV9QQVJBTV9DSEFOR0Ugc2lkZSBkYXRhIHBhY2tldCBpcyBsYWlkIG91dCBhcyBmb2xsb3dzOgorICAgICAqIEBjb2RlCisgICAgICogdTMybGUgcGFyYW1fZmxhZ3MKKyAgICAgKiBpZiAocGFyYW1fZmxhZ3MgJiBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0NIQU5ORUxfQ09VTlQpCisgICAgICogICAgIHMzMmxlIGNoYW5uZWxfY291bnQKKyAgICAgKiBpZiAocGFyYW1fZmxhZ3MgJiBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0NIQU5ORUxfTEFZT1VUKQorICAgICAqICAgICB1NjRsZSBjaGFubmVsX2xheW91dAorICAgICAqIGlmIChwYXJhbV9mbGFncyAmIEFWX1NJREVfREFUQV9QQVJBTV9DSEFOR0VfU0FNUExFX1JBVEUpCisgICAgICogICAgIHMzMmxlIHNhbXBsZV9yYXRlCisgICAgICogaWYgKHBhcmFtX2ZsYWdzICYgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9ESU1FTlNJT05TKQorICAgICAqICAgICBzMzJsZSB3aWR0aAorICAgICAqICAgICBzMzJsZSBoZWlnaHQKKyAgICAgKiBAZW5kY29kZQorICAgICAqLworICAgIEFWX1BLVF9EQVRBX1BBUkFNX0NIQU5HRSwKKworICAgIC8qKgorICAgICAqIEFuIEFWX1BLVF9EQVRBX0gyNjNfTUJfSU5GTyBzaWRlIGRhdGEgcGFja2V0IGNvbnRhaW5zIGEgbnVtYmVyIG9mCisgICAgICogc3RydWN0dXJlcyB3aXRoIGluZm8gYWJvdXQgbWFjcm9ibG9ja3MgcmVsZXZhbnQgdG8gc3BsaXR0aW5nIHRoZQorICAgICAqIHBhY2tldCBpbnRvIHNtYWxsZXIgcGFja2V0cyBvbiBtYWNyb2Jsb2NrIGVkZ2VzIChlLmcuIGFzIGZvciBSRkMgMjE5MCkuCisgICAgICogVGhhdCBpcywgaXQgZG9lcyBub3QgbmVjZXNzYXJpbHkgY29udGFpbiBpbmZvIGFib3V0IGFsbCBtYWNyb2Jsb2NrcywKKyAgICAgKiBhcyBsb25nIGFzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIG1hY3JvYmxvY2tzIGluIHRoZSBpbmZvIGlzIHNtYWxsZXIKKyAgICAgKiB0aGFuIHRoZSB0YXJnZXQgcGF5bG9hZCBzaXplLgorICAgICAqIEVhY2ggTUIgaW5mbyBzdHJ1Y3R1cmUgaXMgMTIgYnl0ZXMsIGFuZCBpcyBsYWlkIG91dCBhcyBmb2xsb3dzOgorICAgICAqIEBjb2RlCisgICAgICogdTMybGUgYml0IG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0CisgICAgICogdTggICAgY3VycmVudCBxdWFudGl6ZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBtYWNyb2Jsb2NrCisgICAgICogdTggICAgR09CIG51bWJlcgorICAgICAqIHUxNmxlIG1hY3JvYmxvY2sgYWRkcmVzcyB3aXRoaW4gdGhlIEdPQgorICAgICAqIHU4ICAgIGhvcml6b250YWwgTVYgcHJlZGljdG9yCisgICAgICogdTggICAgdmVydGljYWwgTVYgcHJlZGljdG9yCisgICAgICogdTggICAgaG9yaXpvbnRhbCBNViBwcmVkaWN0b3IgZm9yIGJsb2NrIG51bWJlciAzCisgICAgICogdTggICAgdmVydGljYWwgTVYgcHJlZGljdG9yIGZvciBibG9jayBudW1iZXIgMworICAgICAqIEBlbmRjb2RlCisgICAgICovCisgICAgQVZfUEtUX0RBVEFfSDI2M19NQl9JTkZPLAorCisgICAgLyoqCisgICAgICogVGhpcyBzaWRlIGRhdGEgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBhdWRpbyBzdHJlYW0gYW5kIGNvbnRhaW5zCisgICAgICogUmVwbGF5R2FpbiBpbmZvcm1hdGlvbiBpbiBmb3JtIG9mIHRoZSBBVlJlcGxheUdhaW4gc3RydWN0LgorICAgICAqLworICAgIEFWX1BLVF9EQVRBX1JFUExBWUdBSU4sCisKKyAgICAvKioKKyAgICAgKiBUaGlzIHNpZGUgZGF0YSBjb250YWlucyBhIDN4MyB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggZGVzY3JpYmluZyBhbiBhZmZpbmUKKyAgICAgKiB0cmFuc2Zvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGRlY29kZWQgdmlkZW8gZnJhbWVzIGZvcgorICAgICAqIGNvcnJlY3QgcHJlc2VudGF0aW9uLgorICAgICAqCisgICAgICogU2VlIGxpYmF2dXRpbC9kaXNwbGF5LmggZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEuCisgICAgICovCisgICAgQVZfUEtUX0RBVEFfRElTUExBWU1BVFJJWCwKKworICAgIC8qKgorICAgICAqIFRoaXMgc2lkZSBkYXRhIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggYSB2aWRlbyBzdHJlYW0gYW5kIGNvbnRhaW5zCisgICAgICogU3RlcmVvc2NvcGljIDNEIGluZm9ybWF0aW9uIGluIGZvcm0gb2YgdGhlIEFWU3RlcmVvM0Qgc3RydWN0LgorICAgICAqLworICAgIEFWX1BLVF9EQVRBX1NURVJFTzNELAorCisgICAgLyoqCisgICAgICogUmVjb21tbWVuZHMgc2tpcHBpbmcgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2FtcGxlcworICAgICAqIEBjb2RlCisgICAgICogdTMybGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gc2tpcCBmcm9tIHN0YXJ0IG9mIHRoaXMgcGFja2V0CisgICAgICogdTMybGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gc2tpcCBmcm9tIGVuZCBvZiB0aGlzIHBhY2tldAorICAgICAqIHU4ICAgIHJlYXNvbiBmb3Igc3RhcnQgc2tpcAorICAgICAqIHU4ICAgIHJlYXNvbiBmb3IgZW5kICAgc2tpcCAoMD1wYWRkaW5nIHNpbGVuY2UsIDE9Y29udmVyZ2VuY2UpCisgICAgICogQGVuZGNvZGUKKyAgICAgKi8KKyAgICBBVl9QS1RfREFUQV9TS0lQX1NBTVBMRVM9NzAsCisKKyAgICAvKioKKyAgICAgKiBBbiBBVl9QS1RfREFUQV9KUF9EVUFMTU9OTyBzaWRlIGRhdGEgcGFja2V0IGluZGljYXRlcyB0aGF0CisgICAgICogdGhlIHBhY2tldCBtYXkgY29udGFpbiAiZHVhbCBtb25vIiBhdWRpbyBzcGVjaWZpYyB0byBKYXBhbmVzZSBEVFYKKyAgICAgKiBhbmQgaWYgaXQgaXMgdHJ1ZSwgcmVjb21tZW5kcyBvbmx5IHRoZSBzZWxlY3RlZCBjaGFubmVsIHRvIGJlIHVzZWQuCisgICAgICogQGNvZGUKKyAgICAgKiB1OCAgICBzZWxlY3RlZCBjaGFubmVscyAoMD1tYWlsL2xlZnQsIDE9c3ViL3JpZ2h0LCAyPWJvdGgpCisgICAgICogQGVuZGNvZGUKKyAgICAgKi8KKyAgICBBVl9QS1RfREFUQV9KUF9EVUFMTU9OTywKKworICAgIC8qKgorICAgICAqIEEgbGlzdCBvZiB6ZXJvIHRlcm1pbmF0ZWQga2V5L3ZhbHVlIHN0cmluZ3MuIFRoZXJlIGlzIG5vIGVuZCBtYXJrZXIgZm9yCisgICAgICogdGhlIGxpc3QsIHNvIGl0IGlzIHJlcXVpcmVkIHRvIHJlbHkgb24gdGhlIHNpZGUgZGF0YSBzaXplIHRvIHN0b3AuCisgICAgICovCisgICAgQVZfUEtUX0RBVEFfU1RSSU5HU19NRVRBREFUQSwKKworICAgIC8qKgorICAgICAqIFN1YnRpdGxlIGV2ZW50IHBvc2l0aW9uCisgICAgICogQGNvZGUKKyAgICAgKiB1MzJsZSB4MQorICAgICAqIHUzMmxlIHkxCisgICAgICogdTMybGUgeDIKKyAgICAgKiB1MzJsZSB5MgorICAgICAqIEBlbmRjb2RlCisgICAgICovCisgICAgQVZfUEtUX0RBVEFfU1VCVElUTEVfUE9TSVRJT04sCisKKyAgICAvKioKKyAgICAgKiBEYXRhIGZvdW5kIGluIEJsb2NrQWRkaXRpb25hbCBlbGVtZW50IG9mIG1hdHJvc2thIGNvbnRhaW5lci4gVGhlcmUgaXMKKyAgICAgKiBubyBlbmQgbWFya2VyIGZvciB0aGUgZGF0YSwgc28gaXQgaXMgcmVxdWlyZWQgdG8gcmVseSBvbiB0aGUgc2lkZSBkYXRhCisgICAgICogc2l6ZSB0byByZWNvZ25pemUgdGhlIGVuZC4gOCBieXRlIGlkIChhcyBmb3VuZCBpbiBCbG9ja0FkZElkKSBmb2xsb3dlZAorICAgICAqIGJ5IGRhdGEuCisgICAgICovCisgICAgQVZfUEtUX0RBVEFfTUFUUk9TS0FfQkxPQ0tBRERJVElPTkFMLAorCisgICAgLyoqCisgICAgICogVGhlIG9wdGlvbmFsIGZpcnN0IGlkZW50aWZpZXIgbGluZSBvZiBhIFdlYlZUVCBjdWUuCisgICAgICovCisgICAgQVZfUEtUX0RBVEFfV0VCVlRUX0lERU5USUZJRVIsCisKKyAgICAvKioKKyAgICAgKiBUaGUgb3B0aW9uYWwgc2V0dGluZ3MgKHJlbmRlcmluZyBpbnN0cnVjdGlvbnMpIHRoYXQgaW1tZWRpYXRlbHkKKyAgICAgKiBmb2xsb3cgdGhlIHRpbWVzdGFtcCBzcGVjaWZpZXIgb2YgYSBXZWJWVFQgY3VlLgorICAgICAqLworICAgIEFWX1BLVF9EQVRBX1dFQlZUVF9TRVRUSU5HUywKKworICAgIC8qKgorICAgICAqIEEgbGlzdCBvZiB6ZXJvIHRlcm1pbmF0ZWQga2V5L3ZhbHVlIHN0cmluZ3MuIFRoZXJlIGlzIG5vIGVuZCBtYXJrZXIgZm9yCisgICAgICogdGhlIGxpc3QsIHNvIGl0IGlzIHJlcXVpcmVkIHRvIHJlbHkgb24gdGhlIHNpZGUgZGF0YSBzaXplIHRvIHN0b3AuIFRoaXMKKyAgICAgKiBzaWRlIGRhdGEgaW5jbHVkZXMgdXBkYXRlZCBtZXRhZGF0YSB3aGljaCBhcHBlYXJlZCBpbiB0aGUgc3RyZWFtLgorICAgICAqLworICAgIEFWX1BLVF9EQVRBX01FVEFEQVRBX1VQREFURSwKK307CisKK3R5cGVkZWYgc3RydWN0IEFWUGFja2V0U2lkZURhdGEgeworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgaW50ICAgICAgc2l6ZTsKKyAgICBlbnVtIEFWUGFja2V0U2lkZURhdGFUeXBlIHR5cGU7Cit9IEFWUGFja2V0U2lkZURhdGE7CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIGNvbXByZXNzZWQgZGF0YS4gSXQgaXMgdHlwaWNhbGx5IGV4cG9ydGVkIGJ5IGRlbXV4ZXJzCisgKiBhbmQgdGhlbiBwYXNzZWQgYXMgaW5wdXQgdG8gZGVjb2RlcnMsIG9yIHJlY2VpdmVkIGFzIG91dHB1dCBmcm9tIGVuY29kZXJzIGFuZAorICogdGhlbiBwYXNzZWQgdG8gbXV4ZXJzLgorICoKKyAqIEZvciB2aWRlbywgaXQgc2hvdWxkIHR5cGljYWxseSBjb250YWluIG9uZSBjb21wcmVzc2VkIGZyYW1lLiBGb3IgYXVkaW8gaXQgbWF5CisgKiBjb250YWluIHNldmVyYWwgY29tcHJlc3NlZCBmcmFtZXMuCisgKgorICogQVZQYWNrZXQgaXMgb25lIG9mIHRoZSBmZXcgc3RydWN0cyBpbiBGRm1wZWcsIHdob3NlIHNpemUgaXMgYSBwYXJ0IG9mIHB1YmxpYworICogQUJJLiBUaHVzIGl0IG1heSBiZSBhbGxvY2F0ZWQgb24gc3RhY2sgYW5kIG5vIG5ldyBmaWVsZHMgY2FuIGJlIGFkZGVkIHRvIGl0CisgKiB3aXRob3V0IGxpYmF2Y29kZWMgYW5kIGxpYmF2Zm9ybWF0IG1ham9yIGJ1bXAuCisgKgorICogVGhlIHNlbWFudGljcyBvZiBkYXRhIG93bmVyc2hpcCBkZXBlbmRzIG9uIHRoZSBidWYgb3IgZGVzdHJ1Y3QgKGRlcHJlY2F0ZWQpCisgKiBmaWVsZHMuIElmIGVpdGhlciBpcyBzZXQsIHRoZSBwYWNrZXQgZGF0YSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIGlzCisgKiB2YWxpZCBpbmRlZmluaXRlbHkgdW50aWwgYXZfZnJlZV9wYWNrZXQoKSBpcyBjYWxsZWQgKHdoaWNoIGluIHR1cm4gY2FsbHMKKyAqIGF2X2J1ZmZlcl91bnJlZigpL3RoZSBkZXN0cnVjdCBjYWxsYmFjayB0byBmcmVlIHRoZSBkYXRhKS4gSWYgbmVpdGhlciBpcyBzZXQsCisgKiB0aGUgcGFja2V0IGRhdGEgaXMgdHlwaWNhbGx5IGJhY2tlZCBieSBzb21lIHN0YXRpYyBidWZmZXIgc29tZXdoZXJlIGFuZCBpcworICogb25seSB2YWxpZCBmb3IgYSBsaW1pdGVkIHRpbWUgKGUuZy4gdW50aWwgdGhlIG5leHQgcmVhZCBjYWxsIHdoZW4gZGVtdXhpbmcpLgorICoKKyAqIFRoZSBzaWRlIGRhdGEgaXMgYWx3YXlzIGFsbG9jYXRlZCB3aXRoIGF2X21hbGxvYygpIGFuZCBpcyBmcmVlZCBpbgorICogYXZfZnJlZV9wYWNrZXQoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZQYWNrZXQgeworICAgIC8qKgorICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSByZWZlcmVuY2UtY291bnRlZCBidWZmZXIgd2hlcmUgdGhlIHBhY2tldCBkYXRhIGlzCisgICAgICogc3RvcmVkLgorICAgICAqIE1heSBiZSBOVUxMLCB0aGVuIHRoZSBwYWNrZXQgZGF0YSBpcyBub3QgcmVmZXJlbmNlLWNvdW50ZWQuCisgICAgICovCisgICAgQVZCdWZmZXJSZWYgKmJ1ZjsKKyAgICAvKioKKyAgICAgKiBQcmVzZW50YXRpb24gdGltZXN0YW1wIGluIEFWU3RyZWFtLT50aW1lX2Jhc2UgdW5pdHM7IHRoZSB0aW1lIGF0IHdoaWNoCisgICAgICogdGhlIGRlY29tcHJlc3NlZCBwYWNrZXQgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCisgICAgICogQ2FuIGJlIEFWX05PUFRTX1ZBTFVFIGlmIGl0IGlzIG5vdCBzdG9yZWQgaW4gdGhlIGZpbGUuCisgICAgICogcHRzIE1VU1QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIGR0cyBhcyBwcmVzZW50YXRpb24gY2Fubm90IGhhcHBlbiBiZWZvcmUKKyAgICAgKiBkZWNvbXByZXNzaW9uLCB1bmxlc3Mgb25lIHdhbnRzIHRvIHZpZXcgaGV4IGR1bXBzLiBTb21lIGZvcm1hdHMgbWlzdXNlCisgICAgICogdGhlIHRlcm1zIGR0cyBhbmQgcHRzL2N0cyB0byBtZWFuIHNvbWV0aGluZyBkaWZmZXJlbnQuIFN1Y2ggdGltZXN0YW1wcworICAgICAqIG11c3QgYmUgY29udmVydGVkIHRvIHRydWUgcHRzL2R0cyBiZWZvcmUgdGhleSBhcmUgc3RvcmVkIGluIEFWUGFja2V0LgorICAgICAqLworICAgIGludDY0X3QgcHRzOworICAgIC8qKgorICAgICAqIERlY29tcHJlc3Npb24gdGltZXN0YW1wIGluIEFWU3RyZWFtLT50aW1lX2Jhc2UgdW5pdHM7IHRoZSB0aW1lIGF0IHdoaWNoCisgICAgICogdGhlIHBhY2tldCBpcyBkZWNvbXByZXNzZWQuCisgICAgICogQ2FuIGJlIEFWX05PUFRTX1ZBTFVFIGlmIGl0IGlzIG5vdCBzdG9yZWQgaW4gdGhlIGZpbGUuCisgICAgICovCisgICAgaW50NjRfdCBkdHM7CisgICAgdWludDhfdCAqZGF0YTsKKyAgICBpbnQgICBzaXplOworICAgIGludCAgIHN0cmVhbV9pbmRleDsKKyAgICAvKioKKyAgICAgKiBBIGNvbWJpbmF0aW9uIG9mIEFWX1BLVF9GTEFHIHZhbHVlcworICAgICAqLworICAgIGludCAgIGZsYWdzOworICAgIC8qKgorICAgICAqIEFkZGl0aW9uYWwgcGFja2V0IGRhdGEgdGhhdCBjYW4gYmUgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lci4KKyAgICAgKiBQYWNrZXQgY2FuIGNvbnRhaW4gc2V2ZXJhbCB0eXBlcyBvZiBzaWRlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIEFWUGFja2V0U2lkZURhdGEgKnNpZGVfZGF0YTsKKyAgICBpbnQgc2lkZV9kYXRhX2VsZW1zOworCisgICAgLyoqCisgICAgICogRHVyYXRpb24gb2YgdGhpcyBwYWNrZXQgaW4gQVZTdHJlYW0tPnRpbWVfYmFzZSB1bml0cywgMCBpZiB1bmtub3duLgorICAgICAqIEVxdWFscyBuZXh0X3B0cyAtIHRoaXNfcHRzIGluIHByZXNlbnRhdGlvbiBvcmRlci4KKyAgICAgKi8KKyAgICBpbnQgICBkdXJhdGlvbjsKKyNpZiBGRl9BUElfREVTVFJVQ1RfUEFDS0VUCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICB2b2lkICAoKmRlc3RydWN0KShzdHJ1Y3QgQVZQYWNrZXQgKik7CisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICB2b2lkICAqcHJpdjsKKyNlbmRpZgorICAgIGludDY0X3QgcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGJ5dGUgcG9zaXRpb24gaW4gc3RyZWFtLCAtMSBpZiB1bmtub3duCisKKyAgICAvKioKKyAgICAgKiBUaW1lIGRpZmZlcmVuY2UgaW4gQVZTdHJlYW0tPnRpbWVfYmFzZSB1bml0cyBmcm9tIHRoZSBwdHMgb2YgdGhpcworICAgICAqIHBhY2tldCB0byB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIG91dHB1dCBmcm9tIHRoZSBkZWNvZGVyIGhhcyBjb252ZXJnZWQKKyAgICAgKiBpbmRlcGVuZGVudCBmcm9tIHRoZSBhdmFpbGFiaWxpdHkgb2YgcHJldmlvdXMgZnJhbWVzLiBUaGF0IGlzLCB0aGUKKyAgICAgKiBmcmFtZXMgYXJlIHZpcnR1YWxseSBpZGVudGljYWwgbm8gbWF0dGVyIGlmIGRlY29kaW5nIHN0YXJ0ZWQgZnJvbQorICAgICAqIHRoZSB2ZXJ5IGZpcnN0IGZyYW1lIG9yIGZyb20gdGhpcyBrZXlmcmFtZS4KKyAgICAgKiBJcyBBVl9OT1BUU19WQUxVRSBpZiB1bmtub3duLgorICAgICAqIFRoaXMgZmllbGQgaXMgbm90IHRoZSBkaXNwbGF5IGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IHBhY2tldC4KKyAgICAgKiBUaGlzIGZpZWxkIGhhcyBubyBtZWFuaW5nIGlmIHRoZSBwYWNrZXQgZG9lcyBub3QgaGF2ZSBBVl9QS1RfRkxBR19LRVkKKyAgICAgKiBzZXQuCisgICAgICoKKyAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGZpZWxkIGlzIHRvIGFsbG93IHNlZWtpbmcgaW4gc3RyZWFtcyB0aGF0IGhhdmUgbm8KKyAgICAgKiBrZXlmcmFtZXMgaW4gdGhlIGNvbnZlbnRpb25hbCBzZW5zZS4gSXQgY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICogcmVjb3ZlcnkgcG9pbnQgU0VJIGluIEguMjY0IGFuZCBtYXRjaF90aW1lX2RlbHRhIGluIE5VVC4gSXQgaXMgYWxzbworICAgICAqIGVzc2VudGlhbCBmb3Igc29tZSB0eXBlcyBvZiBzdWJ0aXRsZSBzdHJlYW1zIHRvIGVuc3VyZSB0aGF0IGFsbAorICAgICAqIHN1YnRpdGxlcyBhcmUgY29ycmVjdGx5IGRpc3BsYXllZCBhZnRlciBzZWVraW5nLgorICAgICAqLworICAgIGludDY0X3QgY29udmVyZ2VuY2VfZHVyYXRpb247Cit9IEFWUGFja2V0OworI2RlZmluZSBBVl9QS1RfRkxBR19LRVkgICAgIDB4MDAwMSAvLy88IFRoZSBwYWNrZXQgY29udGFpbnMgYSBrZXlmcmFtZQorI2RlZmluZSBBVl9QS1RfRkxBR19DT1JSVVBUIDB4MDAwMiAvLy88IFRoZSBwYWNrZXQgY29udGVudCBpcyBjb3JydXB0ZWQKKworZW51bSBBVlNpZGVEYXRhUGFyYW1DaGFuZ2VGbGFncyB7CisgICAgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9DSEFOTkVMX0NPVU5UICA9IDB4MDAwMSwKKyAgICBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0NIQU5ORUxfTEFZT1VUID0gMHgwMDAyLAorICAgIEFWX1NJREVfREFUQV9QQVJBTV9DSEFOR0VfU0FNUExFX1JBVEUgICAgPSAweDAwMDQsCisgICAgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9ESU1FTlNJT05TICAgICA9IDB4MDAwOCwKK307CisvKioKKyAqIEB9CisgKi8KKworc3RydWN0IEFWQ29kZWNJbnRlcm5hbDsKKworZW51bSBBVkZpZWxkT3JkZXIgeworICAgIEFWX0ZJRUxEX1VOS05PV04sCisgICAgQVZfRklFTERfUFJPR1JFU1NJVkUsCisgICAgQVZfRklFTERfVFQsICAgICAgICAgIC8vPCBUb3AgY29kZWRfZmlyc3QsIHRvcCBkaXNwbGF5ZWQgZmlyc3QKKyAgICBBVl9GSUVMRF9CQiwgICAgICAgICAgLy88IEJvdHRvbSBjb2RlZCBmaXJzdCwgYm90dG9tIGRpc3BsYXllZCBmaXJzdAorICAgIEFWX0ZJRUxEX1RCLCAgICAgICAgICAvLzwgVG9wIGNvZGVkIGZpcnN0LCBib3R0b20gZGlzcGxheWVkIGZpcnN0CisgICAgQVZfRklFTERfQlQsICAgICAgICAgIC8vPCBCb3R0b20gY29kZWQgZmlyc3QsIHRvcCBkaXNwbGF5ZWQgZmlyc3QKK307CisKKy8qKgorICogbWFpbiBleHRlcm5hbCBBUEkgc3RydWN0dXJlLgorICogTmV3IGZpZWxkcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGVuZCB3aXRoIG1pbm9yIHZlcnNpb24gYnVtcHMuCisgKiBSZW1vdmFsLCByZW9yZGVyaW5nIGFuZCBjaGFuZ2VzIHRvIGV4aXN0aW5nIGZpZWxkcyByZXF1aXJlIGEgbWFqb3IKKyAqIHZlcnNpb24gYnVtcC4KKyAqIFBsZWFzZSB1c2UgQVZPcHRpb25zIChhdl9vcHQqIC8gYXZfc2V0L2dldCooKSkgdG8gYWNjZXNzIHRoZXNlIGZpZWxkcyBmcm9tIHVzZXIKKyAqIGFwcGxpY2F0aW9ucy4KKyAqIHNpemVvZihBVkNvZGVjQ29udGV4dCkgbXVzdCBub3QgYmUgdXNlZCBvdXRzaWRlIGxpYmF2Ki4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgeworICAgIC8qKgorICAgICAqIGluZm9ybWF0aW9uIG9uIHN0cnVjdCBmb3IgYXZfbG9nCisgICAgICogLSBzZXQgYnkgYXZjb2RlY19hbGxvY19jb250ZXh0MworICAgICAqLworICAgIGNvbnN0IEFWQ2xhc3MgKmF2X2NsYXNzOworICAgIGludCBsb2dfbGV2ZWxfb2Zmc2V0OworCisgICAgZW51bSBBVk1lZGlhVHlwZSBjb2RlY190eXBlOyAvKiBzZWUgQVZNRURJQV9UWVBFX3h4eCAqLworICAgIGNvbnN0IHN0cnVjdCBBVkNvZGVjICAqY29kZWM7CisjaWYgRkZfQVBJX0NPREVDX05BTUUKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIGZpZWxkIGlzIG5vdCB1c2VkIGZvciBhbnl0aGluZyBpbiBsaWJhdmNvZGVjCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICBjaGFyICAgICAgICAgICAgIGNvZGVjX25hbWVbMzJdOworI2VuZGlmCisgICAgZW51bSBBVkNvZGVjSUQgICAgIGNvZGVjX2lkOyAvKiBzZWUgQVZfQ09ERUNfSURfeHh4ICovCisKKyAgICAvKioKKyAgICAgKiBmb3VyY2MgKExTQiBmaXJzdCwgc28gIkFCQ0QiIC0+ICgnRCc8PDI0KSArICgnQyc8PDE2KSArICgnQic8PDgpICsgJ0EnKS4KKyAgICAgKiBUaGlzIGlzIHVzZWQgdG8gd29yayBhcm91bmQgc29tZSBlbmNvZGVyIGJ1Z3MuCisgICAgICogQSBkZW11eGVyIHNob3VsZCBzZXQgdGhpcyB0byB3aGF0IGlzIHN0b3JlZCBpbiB0aGUgZmllbGQgdXNlZCB0byBpZGVudGlmeSB0aGUgY29kZWMuCisgICAgICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHN1Y2ggZmllbGRzIGluIGEgY29udGFpbmVyIHRoZW4gdGhlIGRlbXV4ZXIgc2hvdWxkIGNob29zZSB0aGUgb25lCisgICAgICogd2hpY2ggbWF4aW1pemVzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlZCBjb2RlYy4KKyAgICAgKiBJZiB0aGUgY29kZWMgdGFnIGZpZWxkIGluIGEgY29udGFpbmVyIGlzIGxhcmdlciB0aGFuIDMyIGJpdHMgdGhlbiB0aGUgZGVtdXhlciBzaG91bGQKKyAgICAgKiByZW1hcCB0aGUgbG9uZ2VyIElEIHRvIDMyIGJpdHMgd2l0aCBhIHRhYmxlIG9yIG90aGVyIHN0cnVjdHVyZS4gQWx0ZXJuYXRpdmVseSBhIG5ldworICAgICAqIGV4dHJhX2NvZGVjX3RhZyArIHNpemUgY291bGQgYmUgYWRkZWQgYnV0IGZvciB0aGlzIGEgY2xlYXIgYWR2YW50YWdlIG11c3QgYmUgZGVtb25zdHJhdGVkCisgICAgICogZmlyc3QuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIsIGlmIG5vdCB0aGVuIHRoZSBkZWZhdWx0IGJhc2VkIG9uIGNvZGVjX2lkIHdpbGwgYmUgdXNlZC4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlciwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlIGJ5IGxpYmF2Y29kZWMgZHVyaW5nIGluaXQuCisgICAgICovCisgICAgdW5zaWduZWQgaW50IGNvZGVjX3RhZzsKKworICAgIC8qKgorICAgICAqIGZvdXJjYyBmcm9tIHRoZSBBVkkgc3RyZWFtIGhlYWRlciAoTFNCIGZpcnN0LCBzbyAiQUJDRCIgLT4gKCdEJzw8MjQpICsgKCdDJzw8MTYpICsgKCdCJzw8OCkgKyAnQScpLgorICAgICAqIFRoaXMgaXMgdXNlZCB0byB3b3JrIGFyb3VuZCBzb21lIGVuY29kZXIgYnVncy4KKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlciwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlIGJ5IGxpYmF2Y29kZWMgZHVyaW5nIGluaXQuCisgICAgICovCisgICAgdW5zaWduZWQgaW50IHN0cmVhbV9jb2RlY190YWc7CisKKyAgICB2b2lkICpwcml2X2RhdGE7CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnRleHQgdXNlZCBmb3IgaW50ZXJuYWwgZGF0YS4KKyAgICAgKgorICAgICAqIFVubGlrZSBwcml2X2RhdGEsIHRoaXMgaXMgbm90IGNvZGVjLXNwZWNpZmljLiBJdCBpcyB1c2VkIGluIGdlbmVyYWwKKyAgICAgKiBsaWJhdmNvZGVjIGZ1bmN0aW9ucy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQVZDb2RlY0ludGVybmFsICppbnRlcm5hbDsKKworICAgIC8qKgorICAgICAqIFByaXZhdGUgZGF0YSBvZiB0aGUgdXNlciwgY2FuIGJlIHVzZWQgdG8gY2FycnkgYXBwIHNwZWNpZmljIHN0dWZmLgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqLworICAgIHZvaWQgKm9wYXF1ZTsKKworICAgIC8qKgorICAgICAqIHRoZSBhdmVyYWdlIGJpdHJhdGUKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlcjsgdW51c2VkIGZvciBjb25zdGFudCBxdWFudGl6ZXIgZW5jb2RpbmcuCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMuIDAgb3Igc29tZSBiaXRyYXRlIGlmIHRoaXMgaW5mbyBpcyBhdmFpbGFibGUgaW4gdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBpbnQgYml0X3JhdGU7CisKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2YgYml0cyB0aGUgYml0c3RyZWFtIGlzIGFsbG93ZWQgdG8gZGl2ZXJnZSBmcm9tIHRoZSByZWZlcmVuY2UuCisgICAgICogICAgICAgICAgIHRoZSByZWZlcmVuY2UgY2FuIGJlIENCUiAoZm9yIENCUiBwYXNzMSkgb3IgVkJSIChmb3IgcGFzczIpCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXI7IHVudXNlZCBmb3IgY29uc3RhbnQgcXVhbnRpemVyIGVuY29kaW5nLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBiaXRfcmF0ZV90b2xlcmFuY2U7CisKKyAgICAvKioKKyAgICAgKiBHbG9iYWwgcXVhbGl0eSBmb3IgY29kZWNzIHdoaWNoIGNhbm5vdCBjaGFuZ2UgaXQgcGVyIGZyYW1lLgorICAgICAqIFRoaXMgc2hvdWxkIGJlIHByb3BvcnRpb25hbCB0byBNUEVHLTEvMi80IHFzY2FsZS4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgZ2xvYmFsX3F1YWxpdHk7CisKKyAgICAvKioKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgY29tcHJlc3Npb25fbGV2ZWw7CisjZGVmaW5lIEZGX0NPTVBSRVNTSU9OX0RFRkFVTFQgLTEKKworICAgIC8qKgorICAgICAqIENPREVDX0ZMQUdfKi4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBpbnQgZmxhZ3M7CisKKyAgICAvKioKKyAgICAgKiBDT0RFQ19GTEFHMl8qCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICovCisgICAgaW50IGZsYWdzMjsKKworICAgIC8qKgorICAgICAqIHNvbWUgY29kZWNzIG5lZWQgLyBjYW4gdXNlIGV4dHJhZGF0YSBsaWtlIEh1ZmZtYW4gdGFibGVzLgorICAgICAqIG1qcGVnOiBIdWZmbWFuIHRhYmxlcworICAgICAqIHJ2MTA6IGFkZGl0aW9uYWwgZmxhZ3MKKyAgICAgKiBtcGVnNDogZ2xvYmFsIGhlYWRlcnMgKHRoZXkgY2FuIGJlIGluIHRoZSBiaXRzdHJlYW0gb3IgaGVyZSkKKyAgICAgKiBUaGUgYWxsb2NhdGVkIG1lbW9yeSBzaG91bGQgYmUgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSBieXRlcyBsYXJnZXIKKyAgICAgKiB0aGFuIGV4dHJhZGF0YV9zaXplIHRvIGF2b2lkIHByb2JsZW1zIGlmIGl0IGlzIHJlYWQgd2l0aCB0aGUgYml0c3RyZWFtIHJlYWRlci4KKyAgICAgKiBUaGUgYnl0ZXdpc2UgY29udGVudHMgb2YgZXh0cmFkYXRhIG11c3Qgbm90IGRlcGVuZCBvbiB0aGUgYXJjaGl0ZWN0dXJlIG9yIENQVSBlbmRpYW5uZXNzLgorICAgICAqIC0gZW5jb2Rpbmc6IFNldC9hbGxvY2F0ZWQvZnJlZWQgYnkgbGliYXZjb2RlYy4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQvYWxsb2NhdGVkL2ZyZWVkIGJ5IHVzZXIuCisgICAgICovCisgICAgdWludDhfdCAqZXh0cmFkYXRhOworICAgIGludCBleHRyYWRhdGFfc2l6ZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGZ1bmRhbWVudGFsIHVuaXQgb2YgdGltZSAoaW4gc2Vjb25kcykgaW4gdGVybXMKKyAgICAgKiBvZiB3aGljaCBmcmFtZSB0aW1lc3RhbXBzIGFyZSByZXByZXNlbnRlZC4gRm9yIGZpeGVkLWZwcyBjb250ZW50LAorICAgICAqIHRpbWViYXNlIHNob3VsZCBiZSAxL2ZyYW1lcmF0ZSBhbmQgdGltZXN0YW1wIGluY3JlbWVudHMgc2hvdWxkIGJlCisgICAgICogaWRlbnRpY2FsbHkgMS4KKyAgICAgKiBUaGlzIG9mdGVuLCBidXQgbm90IGFsd2F5cyBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgZnJhbWUgcmF0ZSBvciBmaWVsZCByYXRlCisgICAgICogZm9yIHZpZGVvLgorICAgICAqIC0gZW5jb2Rpbmc6IE1VU1QgYmUgc2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdGhlIHVzZSBvZiB0aGlzIGZpZWxkIGZvciBkZWNvZGluZyBpcyBkZXByZWNhdGVkLgorICAgICAqICAgICAgICAgICAgIFVzZSBmcmFtZXJhdGUgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsKKworICAgIC8qKgorICAgICAqIEZvciBzb21lIGNvZGVjcywgdGhlIHRpbWUgYmFzZSBpcyBjbG9zZXIgdG8gdGhlIGZpZWxkIHJhdGUgdGhhbiB0aGUgZnJhbWUgcmF0ZS4KKyAgICAgKiBNb3N0IG5vdGFibHksIEguMjY0IGFuZCBNUEVHLTIgc3BlY2lmeSB0aW1lX2Jhc2UgYXMgaGFsZiBvZiBmcmFtZSBkdXJhdGlvbgorICAgICAqIGlmIG5vIHRlbGVjaW5lIGlzIHVzZWQgLi4uCisgICAgICoKKyAgICAgKiBTZXQgdG8gdGltZV9iYXNlIHRpY2tzIHBlciBmcmFtZS4gRGVmYXVsdCAxLCBlLmcuLCBILjI2NC9NUEVHLTIgc2V0IGl0IHRvIDIuCisgICAgICovCisgICAgaW50IHRpY2tzX3Blcl9mcmFtZTsKKworICAgIC8qKgorICAgICAqIENvZGVjIGRlbGF5LgorICAgICAqCisgICAgICogRW5jb2Rpbmc6IE51bWJlciBvZiBmcmFtZXMgZGVsYXkgdGhlcmUgd2lsbCBiZSBmcm9tIHRoZSBlbmNvZGVyIGlucHV0IHRvCisgICAgICogICAgICAgICAgIHRoZSBkZWNvZGVyIG91dHB1dC4gKHdlIGFzc3VtZSB0aGUgZGVjb2RlciBtYXRjaGVzIHRoZSBzcGVjKQorICAgICAqIERlY29kaW5nOiBOdW1iZXIgb2YgZnJhbWVzIGRlbGF5IGluIGFkZGl0aW9uIHRvIHdoYXQgYSBzdGFuZGFyZCBkZWNvZGVyCisgICAgICogICAgICAgICAgIGFzIHNwZWNpZmllZCBpbiB0aGUgc3BlYyB3b3VsZCBwcm9kdWNlLgorICAgICAqCisgICAgICogVmlkZW86CisgICAgICogICBOdW1iZXIgb2YgZnJhbWVzIHRoZSBkZWNvZGVkIG91dHB1dCB3aWxsIGJlIGRlbGF5ZWQgcmVsYXRpdmUgdG8gdGhlCisgICAgICogICBlbmNvZGVkIGlucHV0LgorICAgICAqCisgICAgICogQXVkaW86CisgICAgICogICBGb3IgZW5jb2RpbmcsIHRoaXMgZmllbGQgaXMgdW51c2VkIChzZWUgaW5pdGlhbF9wYWRkaW5nKS4KKyAgICAgKgorICAgICAqICAgRm9yIGRlY29kaW5nLCB0aGlzIGlzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGUgZGVjb2RlciBuZWVkcyB0bworICAgICAqICAgb3V0cHV0IGJlZm9yZSB0aGUgZGVjb2RlcidzIG91dHB1dCBpcyB2YWxpZC4gV2hlbiBzZWVraW5nLCB5b3Ugc2hvdWxkCisgICAgICogICBzdGFydCBkZWNvZGluZyB0aGlzIG1hbnkgc2FtcGxlcyBwcmlvciB0byB5b3VyIGRlc2lyZWQgc2VlayBwb2ludC4KKyAgICAgKgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqLworICAgIGludCBkZWxheTsKKworCisgICAgLyogdmlkZW8gb25seSAqLworICAgIC8qKgorICAgICAqIHBpY3R1cmUgd2lkdGggLyBoZWlnaHQuCisgICAgICogLSBlbmNvZGluZzogTVVTVCBiZSBzZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiBNYXkgYmUgc2V0IGJ5IHRoZSB1c2VyIGJlZm9yZSBvcGVuaW5nIHRoZSBkZWNvZGVyIGlmIGtub3duIGUuZy4KKyAgICAgKiAgICAgICAgICAgICBmcm9tIHRoZSBjb250YWluZXIuIFNvbWUgZGVjb2RlcnMgd2lsbCByZXF1aXJlIHRoZSBkaW1lbnNpb25zCisgICAgICogICAgICAgICAgICAgdG8gYmUgc2V0IGJ5IHRoZSBjYWxsZXIuIER1cmluZyBkZWNvZGluZywgdGhlIGRlY29kZXIgbWF5CisgICAgICogICAgICAgICAgICAgb3ZlcndyaXRlIHRob3NlIHZhbHVlcyBhcyByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKworICAgIC8qKgorICAgICAqIEJpdHN0cmVhbSB3aWR0aCAvIGhlaWdodCwgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHdpZHRoL2hlaWdodCBlLmcuIHdoZW4KKyAgICAgKiB0aGUgZGVjb2RlZCBmcmFtZSBpcyBjcm9wcGVkIGJlZm9yZSBiZWluZyBvdXRwdXQgb3IgbG93cmVzIGlzIGVuYWJsZWQuCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogTWF5IGJlIHNldCBieSB0aGUgdXNlciBiZWZvcmUgb3BlbmluZyB0aGUgZGVjb2RlciBpZiBrbm93bgorICAgICAqICAgICAgICAgICAgIGUuZy4gZnJvbSB0aGUgY29udGFpbmVyLiBEdXJpbmcgZGVjb2RpbmcsIHRoZSBkZWNvZGVyIG1heQorICAgICAqICAgICAgICAgICAgIG92ZXJ3cml0ZSB0aG9zZSB2YWx1ZXMgYXMgcmVxdWlyZWQuCisgICAgICovCisgICAgaW50IGNvZGVkX3dpZHRoLCBjb2RlZF9oZWlnaHQ7CisKKyNpZiBGRl9BUElfQVNQRUNUX0VYVEVOREVECisjZGVmaW5lIEZGX0FTUEVDVF9FWFRFTkRFRCAxNQorI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiB0aGUgbnVtYmVyIG9mIHBpY3R1cmVzIGluIGEgZ3JvdXAgb2YgcGljdHVyZXMsIG9yIDAgZm9yIGludHJhX29ubHkKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgZ29wX3NpemU7CisKKyAgICAvKioKKyAgICAgKiBQaXhlbCBmb3JtYXQsIHNlZSBBVl9QSVhfRk1UX3h4eC4KKyAgICAgKiBNYXkgYmUgc2V0IGJ5IHRoZSBkZW11eGVyIGlmIGtub3duIGZyb20gaGVhZGVycy4KKyAgICAgKiBNYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZGVjb2RlciBpZiBpdCBrbm93cyBiZXR0ZXIuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIgaWYga25vd24sIG92ZXJyaWRkZW4gYnkgbGliYXZjb2RlYyBpZiBrbm93bgorICAgICAqLworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworCisgICAgLyoqCisgICAgICogTW90aW9uIGVzdGltYXRpb24gYWxnb3JpdGhtIHVzZWQgZm9yIHZpZGVvIGNvZGluZy4KKyAgICAgKiAxICh6ZXJvKSwgMiAoZnVsbCksIDMgKGxvZyksIDQgKHBob2RzKSwgNSAoZXB6cyksIDYgKHgxKSwgNyAoaGV4KSwKKyAgICAgKiA4ICh1bWgpLCA5IChpdGVyKSwgMTAgKHRlc2EpIFs3LCA4LCAxMCBhcmUgeDI2NCBzcGVjaWZpYywgOSBpcyBzbm93IHNwZWNpZmljXQorICAgICAqIC0gZW5jb2Rpbmc6IE1VU1QgYmUgc2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IG1lX21ldGhvZDsKKworICAgIC8qKgorICAgICAqIElmIG5vbiBOVUxMLCAnZHJhd19ob3Jpel9iYW5kJyBpcyBjYWxsZWQgYnkgdGhlIGxpYmF2Y29kZWMKKyAgICAgKiBkZWNvZGVyIHRvIGRyYXcgYSBob3Jpem9udGFsIGJhbmQuIEl0IGltcHJvdmVzIGNhY2hlIHVzYWdlLiBOb3QKKyAgICAgKiBhbGwgY29kZWNzIGNhbiBkbyB0aGF0LiBZb3UgbXVzdCBjaGVjayB0aGUgY29kZWMgY2FwYWJpbGl0aWVzCisgICAgICogYmVmb3JlaGFuZC4KKyAgICAgKiBXaGVuIG11bHRpdGhyZWFkaW5nIGlzIHVzZWQsIGl0IG1heSBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzCisgICAgICogYXQgdGhlIHNhbWUgdGltZTsgdGhyZWFkcyBtaWdodCBkcmF3IGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgc2FtZSBBVkZyYW1lLAorICAgICAqIG9yIG11bHRpcGxlIEFWRnJhbWVzLCBhbmQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgc2xpY2VzIHdpbGwgYmUgZHJhd24KKyAgICAgKiBpbiBvcmRlci4KKyAgICAgKiBUaGUgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGJ5IGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBBUElzLgorICAgICAqIEl0IGlzIGNhbGxlZCBhdCBsZWFzdCBvbmNlIGR1cmluZyBmcmFtZSBkZWNvZGluZyB0byBwYXNzCisgICAgICogdGhlIGRhdGEgbmVlZGVkIGZvciBoYXJkd2FyZSByZW5kZXIuCisgICAgICogSW4gdGhhdCBtb2RlIGluc3RlYWQgb2YgcGl4ZWwgZGF0YSwgQVZGcmFtZSBwb2ludHMgdG8KKyAgICAgKiBhIHN0cnVjdHVyZSBzcGVjaWZpYyB0byB0aGUgYWNjZWxlcmF0aW9uIEFQSS4gVGhlIGFwcGxpY2F0aW9uCisgICAgICogcmVhZHMgdGhlIHN0cnVjdHVyZSBhbmQgY2FuIGNoYW5nZSBzb21lIGZpZWxkcyB0byBpbmRpY2F0ZSBwcm9ncmVzcworICAgICAqIG9yIG1hcmsgc3RhdGUuCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBzbGljZQorICAgICAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIG9mIHRoZSBzbGljZQorICAgICAqIEBwYXJhbSB0eXBlIDEtPnRvcCBmaWVsZCwgMi0+Ym90dG9tIGZpZWxkLCAzLT5mcmFtZQorICAgICAqIEBwYXJhbSBvZmZzZXQgb2Zmc2V0IGludG8gdGhlIEFWRnJhbWUuZGF0YSBmcm9tIHdoaWNoIHRoZSBzbGljZSBzaG91bGQgYmUgcmVhZAorICAgICAqLworICAgIHZvaWQgKCpkcmF3X2hvcml6X2JhbmQpKHN0cnVjdCBBVkNvZGVjQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzcmMsIGludCBvZmZzZXRbQVZfTlVNX0RBVEFfUE9JTlRFUlNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LCBpbnQgdHlwZSwgaW50IGhlaWdodCk7CisKKyAgICAvKioKKyAgICAgKiBjYWxsYmFjayB0byBuZWdvdGlhdGUgdGhlIHBpeGVsRm9ybWF0CisgICAgICogQHBhcmFtIGZtdCBpcyB0aGUgbGlzdCBvZiBmb3JtYXRzIHdoaWNoIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGNvZGVjLAorICAgICAqIGl0IGlzIHRlcm1pbmF0ZWQgYnkgLTEgYXMgMCBpcyBhIHZhbGlkIGZvcm1hdCwgdGhlIGZvcm1hdHMgYXJlIG9yZGVyZWQgYnkgcXVhbGl0eS4KKyAgICAgKiBUaGUgZmlyc3QgaXMgYWx3YXlzIHRoZSBuYXRpdmUgb25lLgorICAgICAqIEBub3RlIFRoZSBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIGFnYWluIGltbWVkaWF0ZWx5IGlmIGluaXRpYWxpemF0aW9uIGZvcgorICAgICAqIHRoZSBzZWxlY3RlZCAoaGFyZHdhcmUtYWNjZWxlcmF0ZWQpIHBpeGVsIGZvcm1hdCBmYWlsZWQuCisgICAgICogQHdhcm5pbmcgQmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgdmFsdWUgbm90CisgICAgICogaW4gdGhlIGZtdCBsaXN0IG9mIGZvcm1hdHMuCisgICAgICogQHJldHVybiB0aGUgY2hvc2VuIGZvcm1hdAorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLCBpZiBub3Qgc2V0IHRoZSBuYXRpdmUgZm9ybWF0IHdpbGwgYmUgY2hvc2VuLgorICAgICAqLworICAgIGVudW0gQVZQaXhlbEZvcm1hdCAoKmdldF9mb3JtYXQpKHN0cnVjdCBBVkNvZGVjQ29udGV4dCAqcywgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICogZm10KTsKKworICAgIC8qKgorICAgICAqIG1heGltdW0gbnVtYmVyIG9mIEItZnJhbWVzIGJldHdlZW4gbm9uLUItZnJhbWVzCisgICAgICogTm90ZTogVGhlIG91dHB1dCB3aWxsIGJlIGRlbGF5ZWQgYnkgbWF4X2JfZnJhbWVzKzEgcmVsYXRpdmUgdG8gdGhlIGlucHV0LgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBtYXhfYl9mcmFtZXM7CisKKyAgICAvKioKKyAgICAgKiBxc2NhbGUgZmFjdG9yIGJldHdlZW4gSVAgYW5kIEItZnJhbWVzCisgICAgICogSWYgPiAwIHRoZW4gdGhlIGxhc3QgUC1mcmFtZSBxdWFudGl6ZXIgd2lsbCBiZSB1c2VkIChxPSBsYXN0cF9xKmZhY3RvcitvZmZzZXQpLgorICAgICAqIElmIDwgMCB0aGVuIG5vcm1hbCByYXRlY29udHJvbCB3aWxsIGJlIGRvbmUgKHE9IC1ub3JtYWxfcSpmYWN0b3Irb2Zmc2V0KS4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBmbG9hdCBiX3F1YW50X2ZhY3RvcjsKKworICAgIC8qKiBvYnNvbGV0ZSBGSVhNRSByZW1vdmUgKi8KKyAgICBpbnQgcmNfc3RyYXRlZ3k7CisjZGVmaW5lIEZGX1JDX1NUUkFURUdZX1hWSUQgMQorCisgICAgaW50IGJfZnJhbWVfc3RyYXRlZ3k7CisKKyAgICAvKioKKyAgICAgKiBxc2NhbGUgb2Zmc2V0IGJldHdlZW4gSVAgYW5kIEItZnJhbWVzCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgZmxvYXQgYl9xdWFudF9vZmZzZXQ7CisKKyAgICAvKioKKyAgICAgKiBTaXplIG9mIHRoZSBmcmFtZSByZW9yZGVyaW5nIGJ1ZmZlciBpbiB0aGUgZGVjb2Rlci4KKyAgICAgKiBGb3IgTVBFRy0yIGl0IGlzIDEgSVBCIG9yIDAgbG93IGRlbGF5IElQLgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqLworICAgIGludCBoYXNfYl9mcmFtZXM7CisKKyAgICAvKioKKyAgICAgKiAwLT4gaDI2MyBxdWFudCAxLT4gbXBlZyBxdWFudAorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBtcGVnX3F1YW50OworCisgICAgLyoqCisgICAgICogcXNjYWxlIGZhY3RvciBiZXR3ZWVuIFAgYW5kIEktZnJhbWVzCisgICAgICogSWYgPiAwIHRoZW4gdGhlIGxhc3QgcCBmcmFtZSBxdWFudGl6ZXIgd2lsbCBiZSB1c2VkIChxPSBsYXN0cF9xKmZhY3RvcitvZmZzZXQpLgorICAgICAqIElmIDwgMCB0aGVuIG5vcm1hbCByYXRlY29udHJvbCB3aWxsIGJlIGRvbmUgKHE9IC1ub3JtYWxfcSpmYWN0b3Irb2Zmc2V0KS4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBmbG9hdCBpX3F1YW50X2ZhY3RvcjsKKworICAgIC8qKgorICAgICAqIHFzY2FsZSBvZmZzZXQgYmV0d2VlbiBQIGFuZCBJLWZyYW1lcworICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGZsb2F0IGlfcXVhbnRfb2Zmc2V0OworCisgICAgLyoqCisgICAgICogbHVtaW5hbmNlIG1hc2tpbmcgKDAtPiBkaXNhYmxlZCkKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBmbG9hdCBsdW1pX21hc2tpbmc7CisKKyAgICAvKioKKyAgICAgKiB0ZW1wb3JhcnkgY29tcGxleGl0eSBtYXNraW5nICgwLT4gZGlzYWJsZWQpCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgZmxvYXQgdGVtcG9yYWxfY3BseF9tYXNraW5nOworCisgICAgLyoqCisgICAgICogc3BhdGlhbCBjb21wbGV4aXR5IG1hc2tpbmcgKDAtPiBkaXNhYmxlZCkKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBmbG9hdCBzcGF0aWFsX2NwbHhfbWFza2luZzsKKworICAgIC8qKgorICAgICAqIHAgYmxvY2sgbWFza2luZyAoMC0+IGRpc2FibGVkKQorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGZsb2F0IHBfbWFza2luZzsKKworICAgIC8qKgorICAgICAqIGRhcmtuZXNzIG1hc2tpbmcgKDAtPiBkaXNhYmxlZCkKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBmbG9hdCBkYXJrX21hc2tpbmc7CisKKyAgICAvKioKKyAgICAgKiBzbGljZSBjb3VudAorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyIChvciAwKS4KKyAgICAgKi8KKyAgICBpbnQgc2xpY2VfY291bnQ7CisgICAgLyoqCisgICAgICogcHJlZGljdGlvbiBtZXRob2QgKG5lZWRlZCBmb3IgaHVmZnl1dikKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICAgaW50IHByZWRpY3Rpb25fbWV0aG9kOworI2RlZmluZSBGRl9QUkVEX0xFRlQgICAwCisjZGVmaW5lIEZGX1BSRURfUExBTkUgIDEKKyNkZWZpbmUgRkZfUFJFRF9NRURJQU4gMgorCisgICAgLyoqCisgICAgICogc2xpY2Ugb2Zmc2V0cyBpbiB0aGUgZnJhbWUgaW4gYnl0ZXMKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQvYWxsb2NhdGVkIGJ5IGxpYmF2Y29kZWMuCisgICAgICogLSBkZWNvZGluZzogU2V0L2FsbG9jYXRlZCBieSB1c2VyIChvciBOVUxMKS4KKyAgICAgKi8KKyAgICBpbnQgKnNsaWNlX29mZnNldDsKKworICAgIC8qKgorICAgICAqIHNhbXBsZSBhc3BlY3QgcmF0aW8gKDAgaWYgdW5rbm93bikKKyAgICAgKiBUaGF0IGlzIHRoZSB3aWR0aCBvZiBhIHBpeGVsIGRpdmlkZWQgYnkgdGhlIGhlaWdodCBvZiB0aGUgcGl4ZWwuCisgICAgICogTnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBtdXN0IGJlIHJlbGF0aXZlbHkgcHJpbWUgYW5kIHNtYWxsZXIgdGhhbiAyNTYgZm9yIHNvbWUgdmlkZW8gc3RhbmRhcmRzLgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqLworICAgIEFWUmF0aW9uYWwgc2FtcGxlX2FzcGVjdF9yYXRpbzsKKworICAgIC8qKgorICAgICAqIG1vdGlvbiBlc3RpbWF0aW9uIGNvbXBhcmlzb24gZnVuY3Rpb24KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgbWVfY21wOworICAgIC8qKgorICAgICAqIHN1YnBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uIGNvbXBhcmlzb24gZnVuY3Rpb24KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgbWVfc3ViX2NtcDsKKyAgICAvKioKKyAgICAgKiBtYWNyb2Jsb2NrIGNvbXBhcmlzb24gZnVuY3Rpb24gKG5vdCBzdXBwb3J0ZWQgeWV0KQorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBtYl9jbXA7CisgICAgLyoqCisgICAgICogaW50ZXJsYWNlZCBEQ1QgY29tcGFyaXNvbiBmdW5jdGlvbgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBpbGRjdF9jbXA7CisjZGVmaW5lIEZGX0NNUF9TQUQgICAgMAorI2RlZmluZSBGRl9DTVBfU1NFICAgIDEKKyNkZWZpbmUgRkZfQ01QX1NBVEQgICAyCisjZGVmaW5lIEZGX0NNUF9EQ1QgICAgMworI2RlZmluZSBGRl9DTVBfUFNOUiAgIDQKKyNkZWZpbmUgRkZfQ01QX0JJVCAgICA1CisjZGVmaW5lIEZGX0NNUF9SRCAgICAgNgorI2RlZmluZSBGRl9DTVBfWkVSTyAgIDcKKyNkZWZpbmUgRkZfQ01QX1ZTQUQgICA4CisjZGVmaW5lIEZGX0NNUF9WU1NFICAgOQorI2RlZmluZSBGRl9DTVBfTlNTRSAgIDEwCisjZGVmaW5lIEZGX0NNUF9XNTMgICAgMTEKKyNkZWZpbmUgRkZfQ01QX1c5NyAgICAxMgorI2RlZmluZSBGRl9DTVBfRENUTUFYIDEzCisjZGVmaW5lIEZGX0NNUF9EQ1QyNjQgMTQKKyNkZWZpbmUgRkZfQ01QX0NIUk9NQSAyNTYKKworICAgIC8qKgorICAgICAqIE1FIGRpYW1vbmQgc2l6ZSAmIHNoYXBlCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IGRpYV9zaXplOworCisgICAgLyoqCisgICAgICogYW1vdW50IG9mIHByZXZpb3VzIE1WIHByZWRpY3RvcnMgKDJhKzEgeCAyYSsxIHNxdWFyZSkKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgbGFzdF9wcmVkaWN0b3JfY291bnQ7CisKKyAgICAvKioKKyAgICAgKiBwcmVwYXNzIGZvciBtb3Rpb24gZXN0aW1hdGlvbgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBwcmVfbWU7CisKKyAgICAvKioKKyAgICAgKiBtb3Rpb24gZXN0aW1hdGlvbiBwcmVwYXNzIGNvbXBhcmlzb24gZnVuY3Rpb24KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgbWVfcHJlX2NtcDsKKworICAgIC8qKgorICAgICAqIE1FIHByZXBhc3MgZGlhbW9uZCBzaXplICYgc2hhcGUKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgcHJlX2RpYV9zaXplOworCisgICAgLyoqCisgICAgICogc3VicGVsIE1FIHF1YWxpdHkKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgbWVfc3VicGVsX3F1YWxpdHk7CisKKyNpZiBGRl9BUElfQUZECisgICAgLyoqCisgICAgICogRFRHIGFjdGl2ZSBmb3JtYXQgaW5mb3JtYXRpb24gKGFkZGl0aW9uYWwgYXNwZWN0IHJhdGlvCisgICAgICogaW5mb3JtYXRpb24gb25seSB1c2VkIGluIERWQiBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbXMpCisgICAgICogMCBpZiBub3Qgc2V0LgorICAgICAqCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGRlY29kZXIuCisgICAgICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBBVlNpZGVEYXRhCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQgaW50IGR0Z19hY3RpdmVfZm9ybWF0OworI2RlZmluZSBGRl9EVEdfQUZEX1NBTUUgICAgICAgICA4CisjZGVmaW5lIEZGX0RUR19BRkRfNF8zICAgICAgICAgIDkKKyNkZWZpbmUgRkZfRFRHX0FGRF8xNl85ICAgICAgICAgMTAKKyNkZWZpbmUgRkZfRFRHX0FGRF8xNF85ICAgICAgICAgMTEKKyNkZWZpbmUgRkZfRFRHX0FGRF80XzNfU1BfMTRfOSAgMTMKKyNkZWZpbmUgRkZfRFRHX0FGRF8xNl85X1NQXzE0XzkgMTQKKyNkZWZpbmUgRkZfRFRHX0FGRF9TUF80XzMgICAgICAgMTUKKyNlbmRpZiAvKiBGRl9BUElfQUZEICovCisKKyAgICAvKioKKyAgICAgKiBtYXhpbXVtIG1vdGlvbiBlc3RpbWF0aW9uIHNlYXJjaCByYW5nZSBpbiBzdWJwZWwgdW5pdHMKKyAgICAgKiBJZiAwIHRoZW4gbm8gbGltaXQuCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgbWVfcmFuZ2U7CisKKyAgICAvKioKKyAgICAgKiBpbnRyYSBxdWFudGl6ZXIgYmlhcworICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBpbnRyYV9xdWFudF9iaWFzOworI2RlZmluZSBGRl9ERUZBVUxUX1FVQU5UX0JJQVMgOTk5OTk5CisKKyAgICAvKioKKyAgICAgKiBpbnRlciBxdWFudGl6ZXIgYmlhcworICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBpbnRlcl9xdWFudF9iaWFzOworCisgICAgLyoqCisgICAgICogc2xpY2UgZmxhZ3MKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBpbnQgc2xpY2VfZmxhZ3M7CisjZGVmaW5lIFNMSUNFX0ZMQUdfQ09ERURfT1JERVIgICAgMHgwMDAxIC8vLzwgZHJhd19ob3Jpel9iYW5kKCkgaXMgY2FsbGVkIGluIGNvZGVkIG9yZGVyIGluc3RlYWQgb2YgZGlzcGxheQorI2RlZmluZSBTTElDRV9GTEFHX0FMTE9XX0ZJRUxEICAgIDB4MDAwMiAvLy88IGFsbG93IGRyYXdfaG9yaXpfYmFuZCgpIHdpdGggZmllbGQgc2xpY2VzIChNUEVHMiBmaWVsZCBwaWNzKQorI2RlZmluZSBTTElDRV9GTEFHX0FMTE9XX1BMQU5FICAgIDB4MDAwNCAvLy88IGFsbG93IGRyYXdfaG9yaXpfYmFuZCgpIHdpdGggMSBjb21wb25lbnQgYXQgYSB0aW1lIChTVlExKQorCisjaWYgRkZfQVBJX1hWTUMKKyAgICAvKioKKyAgICAgKiBYVmlkZW8gTW90aW9uIEFjY2VsZXJhdGlvbgorICAgICAqIC0gZW5jb2Rpbmc6IGZvcmJpZGRlbgorICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSBkZWNvZGVyCisgICAgICogQGRlcHJlY2F0ZWQgWHZNQyBkb2Vzbid0IG5lZWQgaXQgYW55bW9yZS4KKyAgICAgKi8KKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZCBpbnQgeHZtY19hY2NlbGVyYXRpb247CisjZW5kaWYgLyogRkZfQVBJX1hWTUMgKi8KKworICAgIC8qKgorICAgICAqIG1hY3JvYmxvY2sgZGVjaXNpb24gbW9kZQorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBtYl9kZWNpc2lvbjsKKyNkZWZpbmUgRkZfTUJfREVDSVNJT05fU0lNUExFIDAgICAgICAgIC8vLzwgdXNlcyBtYl9jbXAKKyNkZWZpbmUgRkZfTUJfREVDSVNJT05fQklUUyAgIDEgICAgICAgIC8vLzwgY2hvb3NlcyB0aGUgb25lIHdoaWNoIG5lZWRzIHRoZSBmZXdlc3QgYml0cworI2RlZmluZSBGRl9NQl9ERUNJU0lPTl9SRCAgICAgMiAgICAgICAgLy8vPCByYXRlIGRpc3RvcnRpb24KKworICAgIC8qKgorICAgICAqIGN1c3RvbSBpbnRyYSBxdWFudGl6YXRpb24gbWF0cml4CisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIsIGNhbiBiZSBOVUxMLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqLworICAgIHVpbnQxNl90ICppbnRyYV9tYXRyaXg7CisKKyAgICAvKioKKyAgICAgKiBjdXN0b20gaW50ZXIgcXVhbnRpemF0aW9uIG1hdHJpeAorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLCBjYW4gYmUgTlVMTC4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYy4KKyAgICAgKi8KKyAgICB1aW50MTZfdCAqaW50ZXJfbWF0cml4OworCisgICAgLyoqCisgICAgICogc2NlbmUgY2hhbmdlIGRldGVjdGlvbiB0aHJlc2hvbGQKKyAgICAgKiAwIGlzIGRlZmF1bHQsIGxhcmdlciBtZWFucyBmZXdlciBkZXRlY3RlZCBzY2VuZSBjaGFuZ2VzLgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBzY2VuZWNoYW5nZV90aHJlc2hvbGQ7CisKKyAgICAvKioKKyAgICAgKiBub2lzZSByZWR1Y3Rpb24gc3RyZW5ndGgKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgbm9pc2VfcmVkdWN0aW9uOworCisjaWYgRkZfQVBJX01QVl9PUFQKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIGZpZWxkIGlzIHVudXNlZAorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgaW50IG1lX3RocmVzaG9sZDsKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHRoaXMgZmllbGQgaXMgdW51c2VkCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICBpbnQgbWJfdGhyZXNob2xkOworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBwcmVjaXNpb24gb2YgdGhlIGludHJhIERDIGNvZWZmaWNpZW50IC0gOAorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBpbnRyYV9kY19wcmVjaXNpb247CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgbWFjcm9ibG9jayByb3dzIGF0IHRoZSB0b3Agd2hpY2ggYXJlIHNraXBwZWQuCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICovCisgICAgaW50IHNraXBfdG9wOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIG1hY3JvYmxvY2sgcm93cyBhdCB0aGUgYm90dG9tIHdoaWNoIGFyZSBza2lwcGVkLgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqLworICAgIGludCBza2lwX2JvdHRvbTsKKworI2lmIEZGX0FQSV9NUFZfT1BUCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQKKyAgICAgKi8KKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorICAgIGZsb2F0IGJvcmRlcl9tYXNraW5nOworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBtaW5pbXVtIE1CIGxhZ3JhbmdlIG11bHRpcGxlcgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBtYl9sbWluOworCisgICAgLyoqCisgICAgICogbWF4aW11bSBNQiBsYWdyYW5nZSBtdWx0aXBsZXIKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgbWJfbG1heDsKKworICAgIC8qKgorICAgICAqCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IG1lX3BlbmFsdHlfY29tcGVuc2F0aW9uOworCisgICAgLyoqCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgYmlkaXJfcmVmaW5lOworCisgICAgLyoqCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgYnJkX3NjYWxlOworCisgICAgLyoqCisgICAgICogbWluaW11bSBHT1Agc2l6ZQorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBrZXlpbnRfbWluOworCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGF2Yy4KKyAgICAgKi8KKyAgICBpbnQgcmVmczsKKworICAgIC8qKgorICAgICAqIGNocm9tYSBxcCBvZmZzZXQgZnJvbSBsdW1hCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IGNocm9tYW9mZnNldDsKKworI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUworICAgIC8qKgorICAgICAqIE11bHRpcGxpZWQgYnkgcXNjYWxlIGZvciBlYWNoIGZyYW1lIGFuZCBhZGRlZCB0byBzY2VuZV9jaGFuZ2Vfc2NvcmUuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQgaW50IHNjZW5lY2hhbmdlX2ZhY3RvcjsKKyNlbmRpZgorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBOb3RlOiBWYWx1ZSBkZXBlbmRzIHVwb24gdGhlIGNvbXBhcmUgZnVuY3Rpb24gdXNlZCBmb3IgZnVsbHBlbCBNRS4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgbXYwX3RocmVzaG9sZDsKKworICAgIC8qKgorICAgICAqIEFkanVzdCBzZW5zaXRpdml0eSBvZiBiX2ZyYW1lX3N0cmF0ZWd5IDEuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IGJfc2Vuc2l0aXZpdHk7CisKKyAgICAvKioKKyAgICAgKiBDaHJvbWF0aWNpdHkgY29vcmRpbmF0ZXMgb2YgdGhlIHNvdXJjZSBwcmltYXJpZXMuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYworICAgICAqLworICAgIGVudW0gQVZDb2xvclByaW1hcmllcyBjb2xvcl9wcmltYXJpZXM7CisKKyAgICAvKioKKyAgICAgKiBDb2xvciBUcmFuc2ZlciBDaGFyYWN0ZXJpc3RpYy4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlcgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjCisgICAgICovCisgICAgZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyBjb2xvcl90cmM7CisKKyAgICAvKioKKyAgICAgKiBZVVYgY29sb3JzcGFjZSB0eXBlLgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMKKyAgICAgKi8KKyAgICBlbnVtIEFWQ29sb3JTcGFjZSBjb2xvcnNwYWNlOworCisgICAgLyoqCisgICAgICogTVBFRyB2cyBKUEVHIFlVViByYW5nZS4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlcgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjCisgICAgICovCisgICAgZW51bSBBVkNvbG9yUmFuZ2UgY29sb3JfcmFuZ2U7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGRlZmluZXMgdGhlIGxvY2F0aW9uIG9mIGNocm9tYSBzYW1wbGVzLgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMKKyAgICAgKi8KKyAgICBlbnVtIEFWQ2hyb21hTG9jYXRpb24gY2hyb21hX3NhbXBsZV9sb2NhdGlvbjsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBzbGljZXMuCisgICAgICogSW5kaWNhdGVzIG51bWJlciBvZiBwaWN0dXJlIHN1YmRpdmlzaW9ucy4gVXNlZCBmb3IgcGFyYWxsZWxpemVkCisgICAgICogZGVjb2RpbmcuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIKKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgc2xpY2VzOworCisgICAgLyoqIEZpZWxkIG9yZGVyCisgICAgICogLSBlbmNvZGluZzogc2V0IGJ5IGxpYmF2Y29kZWMKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBlbnVtIEFWRmllbGRPcmRlciBmaWVsZF9vcmRlcjsKKworICAgIC8qIGF1ZGlvIG9ubHkgKi8KKyAgICBpbnQgc2FtcGxlX3JhdGU7IC8vLzwgc2FtcGxlcyBwZXIgc2Vjb25kCisgICAgaW50IGNoYW5uZWxzOyAgICAvLy88IG51bWJlciBvZiBhdWRpbyBjaGFubmVscworCisgICAgLyoqCisgICAgICogYXVkaW8gc2FtcGxlIGZvcm1hdAorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqLworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdDsgIC8vLzwgc2FtcGxlIGZvcm1hdAorCisgICAgLyogVGhlIGZvbGxvd2luZyBkYXRhIHNob3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQuICovCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIGNoYW5uZWwgaW4gYW4gYXVkaW8gZnJhbWUuCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiBzZXQgYnkgbGliYXZjb2RlYyBpbiBhdmNvZGVjX29wZW4yKCkuIEVhY2ggc3VibWl0dGVkIGZyYW1lCisgICAgICogICBleGNlcHQgdGhlIGxhc3QgbXVzdCBjb250YWluIGV4YWN0bHkgZnJhbWVfc2l6ZSBzYW1wbGVzIHBlciBjaGFubmVsLgorICAgICAqICAgTWF5IGJlIDAgd2hlbiB0aGUgY29kZWMgaGFzIENPREVDX0NBUF9WQVJJQUJMRV9GUkFNRV9TSVpFIHNldCwgdGhlbiB0aGUKKyAgICAgKiAgIGZyYW1lIHNpemUgaXMgbm90IHJlc3RyaWN0ZWQuCisgICAgICogLSBkZWNvZGluZzogbWF5IGJlIHNldCBieSBzb21lIGRlY29kZXJzIHRvIGluZGljYXRlIGNvbnN0YW50IGZyYW1lIHNpemUKKyAgICAgKi8KKyAgICBpbnQgZnJhbWVfc2l6ZTsKKworICAgIC8qKgorICAgICAqIEZyYW1lIGNvdW50ZXIsIHNldCBieSBsaWJhdmNvZGVjLgorICAgICAqCisgICAgICogLSBkZWNvZGluZzogdG90YWwgbnVtYmVyIG9mIGZyYW1lcyByZXR1cm5lZCBmcm9tIHRoZSBkZWNvZGVyIHNvIGZhci4KKyAgICAgKiAtIGVuY29kaW5nOiB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHBhc3NlZCB0byB0aGUgZW5jb2RlciBzbyBmYXIuCisgICAgICoKKyAgICAgKiAgIEBub3RlIHRoZSBjb3VudGVyIGlzIG5vdCBpbmNyZW1lbnRlZCBpZiBlbmNvZGluZy9kZWNvZGluZyByZXN1bHRlZCBpbgorICAgICAqICAgYW4gZXJyb3IuCisgICAgICovCisgICAgaW50IGZyYW1lX251bWJlcjsKKworICAgIC8qKgorICAgICAqIG51bWJlciBvZiBieXRlcyBwZXIgcGFja2V0IGlmIGNvbnN0YW50IGFuZCBrbm93biBvciAwCisgICAgICogVXNlZCBieSBzb21lIFdBViBiYXNlZCBhdWRpbyBjb2RlY3MuCisgICAgICovCisgICAgaW50IGJsb2NrX2FsaWduOworCisgICAgLyoqCisgICAgICogQXVkaW8gY3V0b2ZmIGJhbmR3aWR0aCAoMCBtZWFucyAiYXV0b21hdGljIikKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgY3V0b2ZmOworCisjaWYgRkZfQVBJX1JFUVVFU1RfQ0hBTk5FTFMKKyAgICAvKioKKyAgICAgKiBEZWNvZGVyIHNob3VsZCBkZWNvZGUgdG8gdGhpcyBtYW55IGNoYW5uZWxzIGlmIGl0IGNhbiAoMCBmb3IgZGVmYXVsdCkKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGluIGZhdm9yIG9mIHJlcXVlc3RfY2hhbm5lbF9sYXlvdXQuCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQgaW50IHJlcXVlc3RfY2hhbm5lbHM7CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIEF1ZGlvIGNoYW5uZWwgbGF5b3V0LgorICAgICAqIC0gZW5jb2Rpbmc6IHNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSB1c2VyLCBtYXkgYmUgb3ZlcndyaXR0ZW4gYnkgbGliYXZjb2RlYy4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dDsKKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgZGVjb2RlciB0byB1c2UgdGhpcyBjaGFubmVsIGxheW91dCBpZiBpdCBjYW4gKDAgZm9yIGRlZmF1bHQpCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICovCisgICAgdWludDY0X3QgcmVxdWVzdF9jaGFubmVsX2xheW91dDsKKworICAgIC8qKgorICAgICAqIFR5cGUgb2Ygc2VydmljZSB0aGF0IHRoZSBhdWRpbyBzdHJlYW0gY29udmV5cy4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYy4KKyAgICAgKi8KKyAgICBlbnVtIEFWQXVkaW9TZXJ2aWNlVHlwZSBhdWRpb19zZXJ2aWNlX3R5cGU7CisKKyAgICAvKioKKyAgICAgKiBkZXNpcmVkIHNhbXBsZSBmb3JtYXQKKyAgICAgKiAtIGVuY29kaW5nOiBOb3QgdXNlZC4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiBEZWNvZGVyIHdpbGwgZGVjb2RlIHRvIHRoaXMgZm9ybWF0IGlmIGl0IGNhbi4KKyAgICAgKi8KKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHJlcXVlc3Rfc2FtcGxlX2ZtdDsKKworI2lmIEZGX0FQSV9HRVRfQlVGRkVSCisgICAgLyoqCisgICAgICogQ2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBmcmFtZSB0byBnZXQgYSBidWZmZXIgZm9yIGl0LgorICAgICAqCisgICAgICogVGhlIGZ1bmN0aW9uIHdpbGwgc2V0IEFWRnJhbWUuZGF0YVtdLCBBVkZyYW1lLmxpbmVzaXplW10uCisgICAgICogQVZGcmFtZS5leHRlbmRlZF9kYXRhW10gbXVzdCBhbHNvIGJlIHNldCwgYnV0IGl0IHNob3VsZCBiZSB0aGUgc2FtZSBhcworICAgICAqIEFWRnJhbWUuZGF0YVtdIGV4Y2VwdCBmb3IgcGxhbmFyIGF1ZGlvIHdpdGggbW9yZSBjaGFubmVscyB0aGFuIGNhbiBmaXQKKyAgICAgKiBpbiBBVkZyYW1lLmRhdGFbXS4gSW4gdGhhdCBjYXNlLCBBVkZyYW1lLmRhdGFbXSBzaGFsbCBzdGlsbCBjb250YWluIGFzCisgICAgICogbWFueSBkYXRhIHBvaW50ZXJzIGFzIGl0IGNhbiBob2xkLgorICAgICAqCisgICAgICogaWYgQ09ERUNfQ0FQX0RSMSBpcyBub3Qgc2V0IHRoZW4gZ2V0X2J1ZmZlcigpIG11c3QgY2FsbAorICAgICAqIGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyKCkgaW5zdGVhZCBvZiBwcm92aWRpbmcgYnVmZmVycyBhbGxvY2F0ZWQgYnkKKyAgICAgKiBzb21lIG90aGVyIG1lYW5zLgorICAgICAqCisgICAgICogQVZGcmFtZS5kYXRhW10gc2hvdWxkIGJlIDMyLSBvciAxNi1ieXRlLWFsaWduZWQgdW5sZXNzIHRoZSBDUFUgZG9lc24ndAorICAgICAqIG5lZWQgaXQuIGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyKCkgYWxpZ25zIHRoZSBvdXRwdXQgYnVmZmVyIHByb3Blcmx5LAorICAgICAqIGJ1dCBpZiBnZXRfYnVmZmVyKCkgaXMgb3ZlcnJpZGRlbiB0aGVuIGFsaWdubWVudCBjb25zaWRlcmF0aW9ucyBzaG91bGQKKyAgICAgKiBiZSB0YWtlbiBpbnRvIGFjY291bnQuCisgICAgICoKKyAgICAgKiBAc2VlIGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyKCkKKyAgICAgKgorICAgICAqIFZpZGVvOgorICAgICAqCisgICAgICogSWYgcGljLnJlZmVyZW5jZSBpcyBzZXQgdGhlbiB0aGUgZnJhbWUgd2lsbCBiZSByZWFkIGxhdGVyIGJ5IGxpYmF2Y29kZWMuCisgICAgICogYXZjb2RlY19hbGlnbl9kaW1lbnNpb25zMigpIHNob3VsZCBiZSB1c2VkIHRvIGZpbmQgdGhlIHJlcXVpcmVkIHdpZHRoIGFuZAorICAgICAqIGhlaWdodCwgYXMgdGhleSBub3JtYWxseSBuZWVkIHRvIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgMTYuCisgICAgICoKKyAgICAgKiBJZiBmcmFtZSBtdWx0aXRocmVhZGluZyBpcyB1c2VkIGFuZCB0aHJlYWRfc2FmZV9jYWxsYmFja3MgaXMgc2V0LAorICAgICAqIGl0IG1heSBiZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQsIGJ1dCBub3QgZnJvbSBtb3JlIHRoYW4gb25lIGF0CisgICAgICogb25jZS4gRG9lcyBub3QgbmVlZCB0byBiZSByZWVudHJhbnQuCisgICAgICoKKyAgICAgKiBAc2VlIHJlbGVhc2VfYnVmZmVyKCksIHJlZ2V0X2J1ZmZlcigpCisgICAgICogQHNlZSBhdmNvZGVjX2FsaWduX2RpbWVuc2lvbnMyKCkKKyAgICAgKgorICAgICAqIEF1ZGlvOgorICAgICAqCisgICAgICogRGVjb2RlcnMgcmVxdWVzdCBhIGJ1ZmZlciBvZiBhIHBhcnRpY3VsYXIgc2l6ZSBieSBzZXR0aW5nCisgICAgICogQVZGcmFtZS5uYl9zYW1wbGVzIHByaW9yIHRvIGNhbGxpbmcgZ2V0X2J1ZmZlcigpLiBUaGUgZGVjb2RlciBtYXksCisgICAgICogaG93ZXZlciwgdXRpbGl6ZSBvbmx5IHBhcnQgb2YgdGhlIGJ1ZmZlciBieSBzZXR0aW5nIEFWRnJhbWUubmJfc2FtcGxlcworICAgICAqIHRvIGEgc21hbGxlciB2YWx1ZSBpbiB0aGUgb3V0cHV0IGZyYW1lLgorICAgICAqCisgICAgICogRGVjb2RlcnMgY2Fubm90IHVzZSB0aGUgYnVmZmVyIGFmdGVyIHJldHVybmluZyBmcm9tCisgICAgICogYXZjb2RlY19kZWNvZGVfYXVkaW80KCksIHNvIHRoZXkgd2lsbCBub3QgY2FsbCByZWxlYXNlX2J1ZmZlcigpLCBhcyBpdAorICAgICAqIGlzIGFzc3VtZWQgdG8gYmUgcmVsZWFzZWQgaW1tZWRpYXRlbHkgdXBvbiByZXR1cm4uIEluIHNvbWUgcmFyZSBjYXNlcywKKyAgICAgKiBhIGRlY29kZXIgbWF5IG5lZWQgdG8gY2FsbCBnZXRfYnVmZmVyKCkgbW9yZSB0aGFuIG9uY2UgaW4gYSBzaW5nbGUKKyAgICAgKiBjYWxsIHRvIGF2Y29kZWNfZGVjb2RlX2F1ZGlvNCgpLiBJbiB0aGF0IGNhc2UsIHdoZW4gZ2V0X2J1ZmZlcigpIGlzCisgICAgICogY2FsbGVkIGFnYWluIGFmdGVyIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIG9uY2UsIHRoZSBwcmV2aW91c2x5CisgICAgICogYWNxdWlyZWQgYnVmZmVyIGlzIGFzc3VtZWQgdG8gYmUgcmVsZWFzZWQgYXQgdGhhdCB0aW1lIGFuZCBtYXkgbm90IGJlCisgICAgICogcmV1c2VkIGJ5IHRoZSBkZWNvZGVyLgorICAgICAqCisgICAgICogQXMgYSBjb252ZW5pZW5jZSwgYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoKSBhbmQKKyAgICAgKiBhdl9zYW1wbGVzX2ZpbGxfYXJyYXlzKCkgaW4gbGliYXZ1dGlsIG1heSBiZSB1c2VkIGJ5IGN1c3RvbSBnZXRfYnVmZmVyKCkKKyAgICAgKiBmdW5jdGlvbnMgdG8gZmluZCB0aGUgcmVxdWlyZWQgZGF0YSBzaXplIGFuZCB0byBmaWxsIGRhdGEgcG9pbnRlcnMgYW5kCisgICAgICogbGluZXNpemUuIEluIEFWRnJhbWUubGluZXNpemUsIG9ubHkgbGluZXNpemVbMF0gbWF5IGJlIHNldCBmb3IgYXVkaW8KKyAgICAgKiBzaW5jZSBhbGwgcGxhbmVzIG11c3QgYmUgdGhlIHNhbWUgc2l6ZS4KKyAgICAgKgorICAgICAqIEBzZWUgYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoKSwgYXZfc2FtcGxlc19maWxsX2FycmF5cygpCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYywgdXNlciBjYW4gb3ZlcnJpZGUuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0X2J1ZmZlcjIoKQorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgaW50ICgqZ2V0X2J1ZmZlcikoc3RydWN0IEFWQ29kZWNDb250ZXh0ICpjLCBBVkZyYW1lICpwaWMpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIHJlbGVhc2UgYnVmZmVycyB3aGljaCB3ZXJlIGFsbG9jYXRlZCB3aXRoIGdldF9idWZmZXIuCisgICAgICogQSByZWxlYXNlZCBidWZmZXIgY2FuIGJlIHJldXNlZCBpbiBnZXRfYnVmZmVyKCkuCisgICAgICogcGljLmRhdGFbKl0gbXVzdCBiZSBzZXQgdG8gTlVMTC4KKyAgICAgKiBNYXkgYmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIGlmIGZyYW1lIG11bHRpdGhyZWFkaW5nIGlzIHVzZWQsCisgICAgICogYnV0IG5vdCBieSBtb3JlIHRoYW4gb25lIHRocmVhZCBhdCBvbmNlLCBzbyBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlZW50cmFudC4KKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYywgdXNlciBjYW4gb3ZlcnJpZGUuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBjdXN0b20gZnJlZWluZyBjYWxsYmFja3Mgc2hvdWxkIGJlIHNldCBmcm9tIGdldF9idWZmZXIyKCkKKyAgICAgKi8KKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorICAgIHZvaWQgKCpyZWxlYXNlX2J1ZmZlcikoc3RydWN0IEFWQ29kZWNDb250ZXh0ICpjLCBBVkZyYW1lICpwaWMpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmcmFtZSB0byBnZXQgY3IgYnVmZmVyIGZvciBpdC4KKyAgICAgKiBCdWZmZXIgdHlwZSAoc2l6ZSwgaGludHMpIG11c3QgYmUgdGhlIHNhbWUuIGxpYmF2Y29kZWMgd29uJ3QgY2hlY2sgaXQuCisgICAgICogbGliYXZjb2RlYyB3aWxsIHBhc3MgcHJldmlvdXMgYnVmZmVyIGluIHBpYywgZnVuY3Rpb24gc2hvdWxkIHJldHVybgorICAgICAqIHNhbWUgYnVmZmVyIG9yIG5ldyBidWZmZXIgd2l0aCBvbGQgZnJhbWUgInBhaW50ZWQiIGludG8gaXQuCisgICAgICogSWYgcGljLmRhdGFbMF0gPT0gTlVMTCBtdXN0IGJlaGF2ZSBsaWtlIGdldF9idWZmZXIoKS4KKyAgICAgKiBpZiBDT0RFQ19DQVBfRFIxIGlzIG5vdCBzZXQgdGhlbiByZWdldF9idWZmZXIoKSBtdXN0IGNhbGwKKyAgICAgKiBhdmNvZGVjX2RlZmF1bHRfcmVnZXRfYnVmZmVyKCkgaW5zdGVhZCBvZiBwcm92aWRpbmcgYnVmZmVycyBhbGxvY2F0ZWQgYnkKKyAgICAgKiBzb21lIG90aGVyIG1lYW5zLgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLCB1c2VyIGNhbiBvdmVycmlkZS4KKyAgICAgKi8KKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorICAgIGludCAoKnJlZ2V0X2J1ZmZlcikoc3RydWN0IEFWQ29kZWNDb250ZXh0ICpjLCBBVkZyYW1lICpwaWMpOworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZnJhbWUgdG8gZ2V0IGRhdGEKKyAgICAgKiBidWZmZXIocykgZm9yIGl0LiBUaGVyZSBtYXkgYmUgb25lIGNvbnRpZ3VvdXMgYnVmZmVyIGZvciBhbGwgdGhlIGRhdGEgb3IKKyAgICAgKiB0aGVyZSBtYXkgYmUgYSBidWZmZXIgcGVyIGVhY2ggZGF0YSBwbGFuZSBvciBhbnl0aGluZyBpbiBiZXR3ZWVuLiBXaGF0CisgICAgICogdGhpcyBtZWFucyBpcywgeW91IG1heSBzZXQgaG93ZXZlciBtYW55IGVudHJpZXMgaW4gYnVmW10geW91IGZlZWwgbmVjZXNzYXJ5LgorICAgICAqIEVhY2ggYnVmZmVyIG11c3QgYmUgcmVmZXJlbmNlLWNvdW50ZWQgdXNpbmcgdGhlIEFWQnVmZmVyIEFQSSAoc2VlIGRlc2NyaXB0aW9uCisgICAgICogb2YgYnVmW10gYmVsb3cpLgorICAgICAqCisgICAgICogVGhlIGZvbGxvd2luZyBmaWVsZHMgd2lsbCBiZSBzZXQgaW4gdGhlIGZyYW1lIGJlZm9yZSB0aGlzIGNhbGxiYWNrIGlzCisgICAgICogY2FsbGVkOgorICAgICAqIC0gZm9ybWF0CisgICAgICogLSB3aWR0aCwgaGVpZ2h0ICh2aWRlbyBvbmx5KQorICAgICAqIC0gc2FtcGxlX3JhdGUsIGNoYW5uZWxfbGF5b3V0LCBuYl9zYW1wbGVzIChhdWRpbyBvbmx5KQorICAgICAqIFRoZWlyIHZhbHVlcyBtYXkgZGlmZmVyIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluCisgICAgICogQVZDb2RlY0NvbnRleHQuIFRoaXMgY2FsbGJhY2sgbXVzdCB1c2UgdGhlIGZyYW1lIHZhbHVlcywgbm90IHRoZSBjb2RlYworICAgICAqIGNvbnRleHQgdmFsdWVzLCB0byBjYWxjdWxhdGUgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplLgorICAgICAqCisgICAgICogVGhpcyBjYWxsYmFjayBtdXN0IGZpbGwgdGhlIGZvbGxvd2luZyBmaWVsZHMgaW4gdGhlIGZyYW1lOgorICAgICAqIC0gZGF0YVtdCisgICAgICogLSBsaW5lc2l6ZVtdCisgICAgICogLSBleHRlbmRlZF9kYXRhOgorICAgICAqICAgKiBpZiB0aGUgZGF0YSBpcyBwbGFuYXIgYXVkaW8gd2l0aCBtb3JlIHRoYW4gOCBjaGFubmVscywgdGhlbiB0aGlzCisgICAgICogICAgIGNhbGxiYWNrIG11c3QgYWxsb2NhdGUgYW5kIGZpbGwgZXh0ZW5kZWRfZGF0YSB0byBjb250YWluIGFsbCBwb2ludGVycworICAgICAqICAgICB0byBhbGwgZGF0YSBwbGFuZXMuIGRhdGFbXSBtdXN0IGhvbGQgYXMgbWFueSBwb2ludGVycyBhcyBpdCBjYW4uCisgICAgICogICAgIGV4dGVuZGVkX2RhdGEgbXVzdCBiZSBhbGxvY2F0ZWQgd2l0aCBhdl9tYWxsb2MoKSBhbmQgd2lsbCBiZSBmcmVlZCBpbgorICAgICAqICAgICBhdl9mcmFtZV91bnJlZigpLgorICAgICAqICAgKiBvdGhlcndpc2UgZXhlbmRlZF9kYXRhIG11c3QgcG9pbnQgdG8gZGF0YQorICAgICAqIC0gYnVmW10gbXVzdCBjb250YWluIG9uZSBvciBtb3JlIHBvaW50ZXJzIHRvIEFWQnVmZmVyUmVmIHN0cnVjdHVyZXMuIEVhY2ggb2YKKyAgICAgKiAgIHRoZSBmcmFtZSdzIGRhdGEgYW5kIGV4dGVuZGVkX2RhdGEgcG9pbnRlcnMgbXVzdCBiZSBjb250YWluZWQgaW4gdGhlc2UuIFRoYXQKKyAgICAgKiAgIGlzLCBvbmUgQVZCdWZmZXJSZWYgZm9yIGVhY2ggYWxsb2NhdGVkIGNodW5rIG9mIG1lbW9yeSwgbm90IG5lY2Vzc2FyaWx5IG9uZQorICAgICAqICAgQVZCdWZmZXJSZWYgcGVyIGRhdGFbXSBlbnRyeS4gU2VlOiBhdl9idWZmZXJfY3JlYXRlKCksIGF2X2J1ZmZlcl9hbGxvYygpLAorICAgICAqICAgYW5kIGF2X2J1ZmZlcl9yZWYoKS4KKyAgICAgKiAtIGV4dGVuZGVkX2J1ZiBhbmQgbmJfZXh0ZW5kZWRfYnVmIG11c3QgYmUgYWxsb2NhdGVkIHdpdGggYXZfbWFsbG9jKCkgYnkKKyAgICAgKiAgIHRoaXMgY2FsbGJhY2sgYW5kIGZpbGxlZCB3aXRoIHRoZSBleHRyYSBidWZmZXJzIGlmIHRoZXJlIGFyZSBtb3JlCisgICAgICogICBidWZmZXJzIHRoYW4gYnVmW10gY2FuIGhvbGQuIGV4dGVuZGVkX2J1ZiB3aWxsIGJlIGZyZWVkIGluCisgICAgICogICBhdl9mcmFtZV91bnJlZigpLgorICAgICAqCisgICAgICogSWYgQ09ERUNfQ0FQX0RSMSBpcyBub3Qgc2V0IHRoZW4gZ2V0X2J1ZmZlcjIoKSBtdXN0IGNhbGwKKyAgICAgKiBhdmNvZGVjX2RlZmF1bHRfZ2V0X2J1ZmZlcjIoKSBpbnN0ZWFkIG9mIHByb3ZpZGluZyBidWZmZXJzIGFsbG9jYXRlZCBieQorICAgICAqIHNvbWUgb3RoZXIgbWVhbnMuCisgICAgICoKKyAgICAgKiBFYWNoIGRhdGEgcGxhbmUgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZSBtYXhpbXVtIHJlcXVpcmVkIGJ5IHRoZSB0YXJnZXQKKyAgICAgKiBDUFUuCisgICAgICoKKyAgICAgKiBAc2VlIGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyMigpCisgICAgICoKKyAgICAgKiBWaWRlbzoKKyAgICAgKgorICAgICAqIElmIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYgaXMgc2V0IGluIGZsYWdzIHRoZW4gdGhlIGZyYW1lIG1heSBiZSByZXVzZWQKKyAgICAgKiAocmVhZCBhbmQvb3Igd3JpdHRlbiB0byBpZiBpdCBpcyB3cml0YWJsZSkgbGF0ZXIgYnkgbGliYXZjb2RlYy4KKyAgICAgKgorICAgICAqIGF2Y29kZWNfYWxpZ25fZGltZW5zaW9uczIoKSBzaG91bGQgYmUgdXNlZCB0byBmaW5kIHRoZSByZXF1aXJlZCB3aWR0aCBhbmQKKyAgICAgKiBoZWlnaHQsIGFzIHRoZXkgbm9ybWFsbHkgbmVlZCB0byBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIDE2LgorICAgICAqCisgICAgICogU29tZSBkZWNvZGVycyBkbyBub3Qgc3VwcG9ydCBsaW5lc2l6ZXMgY2hhbmdpbmcgYmV0d2VlbiBmcmFtZXMuCisgICAgICoKKyAgICAgKiBJZiBmcmFtZSBtdWx0aXRocmVhZGluZyBpcyB1c2VkIGFuZCB0aHJlYWRfc2FmZV9jYWxsYmFja3MgaXMgc2V0LAorICAgICAqIHRoaXMgY2FsbGJhY2sgbWF5IGJlIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCwgYnV0IG5vdCBmcm9tIG1vcmUKKyAgICAgKiB0aGFuIG9uZSBhdCBvbmNlLiBEb2VzIG5vdCBuZWVkIHRvIGJlIHJlZW50cmFudC4KKyAgICAgKgorICAgICAqIEBzZWUgYXZjb2RlY19hbGlnbl9kaW1lbnNpb25zMigpCisgICAgICoKKyAgICAgKiBBdWRpbzoKKyAgICAgKgorICAgICAqIERlY29kZXJzIHJlcXVlc3QgYSBidWZmZXIgb2YgYSBwYXJ0aWN1bGFyIHNpemUgYnkgc2V0dGluZworICAgICAqIEFWRnJhbWUubmJfc2FtcGxlcyBwcmlvciB0byBjYWxsaW5nIGdldF9idWZmZXIyKCkuIFRoZSBkZWNvZGVyIG1heSwKKyAgICAgKiBob3dldmVyLCB1dGlsaXplIG9ubHkgcGFydCBvZiB0aGUgYnVmZmVyIGJ5IHNldHRpbmcgQVZGcmFtZS5uYl9zYW1wbGVzCisgICAgICogdG8gYSBzbWFsbGVyIHZhbHVlIGluIHRoZSBvdXRwdXQgZnJhbWUuCisgICAgICoKKyAgICAgKiBBcyBhIGNvbnZlbmllbmNlLCBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZSgpIGFuZAorICAgICAqIGF2X3NhbXBsZXNfZmlsbF9hcnJheXMoKSBpbiBsaWJhdnV0aWwgbWF5IGJlIHVzZWQgYnkgY3VzdG9tIGdldF9idWZmZXIyKCkKKyAgICAgKiBmdW5jdGlvbnMgdG8gZmluZCB0aGUgcmVxdWlyZWQgZGF0YSBzaXplIGFuZCB0byBmaWxsIGRhdGEgcG9pbnRlcnMgYW5kCisgICAgICogbGluZXNpemUuIEluIEFWRnJhbWUubGluZXNpemUsIG9ubHkgbGluZXNpemVbMF0gbWF5IGJlIHNldCBmb3IgYXVkaW8KKyAgICAgKiBzaW5jZSBhbGwgcGxhbmVzIG11c3QgYmUgdGhlIHNhbWUgc2l6ZS4KKyAgICAgKgorICAgICAqIEBzZWUgYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoKSwgYXZfc2FtcGxlc19maWxsX2FycmF5cygpCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYywgdXNlciBjYW4gb3ZlcnJpZGUuCisgICAgICovCisgICAgaW50ICgqZ2V0X2J1ZmZlcjIpKHN0cnVjdCBBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBJZiBub24temVybywgdGhlIGRlY29kZWQgYXVkaW8gYW5kIHZpZGVvIGZyYW1lcyByZXR1cm5lZCBmcm9tCisgICAgICogYXZjb2RlY19kZWNvZGVfdmlkZW8yKCkgYW5kIGF2Y29kZWNfZGVjb2RlX2F1ZGlvNCgpIGFyZSByZWZlcmVuY2UtY291bnRlZAorICAgICAqIGFuZCBhcmUgdmFsaWQgaW5kZWZpbml0ZWx5LiBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGVtIHdpdGgKKyAgICAgKiBhdl9mcmFtZV91bnJlZigpIHdoZW4gdGhleSBhcmUgbm90IG5lZWRlZCBhbnltb3JlLgorICAgICAqIE90aGVyd2lzZSwgdGhlIGRlY29kZWQgZnJhbWVzIG11c3Qgbm90IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgYW5kIGFyZQorICAgICAqIG9ubHkgdmFsaWQgdW50aWwgdGhlIG5leHQgZGVjb2RlIGNhbGwuCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgdGhlIGNhbGxlciBiZWZvcmUgYXZjb2RlY19vcGVuMigpLgorICAgICAqLworICAgIGludCByZWZjb3VudGVkX2ZyYW1lczsKKworICAgIC8qIC0gZW5jb2RpbmcgcGFyYW1ldGVycyAqLworICAgIGZsb2F0IHFjb21wcmVzczsgIC8vLzwgYW1vdW50IG9mIHFzY2FsZSBjaGFuZ2UgYmV0d2VlbiBlYXN5ICYgaGFyZCBzY2VuZXMgKDAuMC0xLjApCisgICAgZmxvYXQgcWJsdXI7ICAgICAgLy8vPCBhbW91bnQgb2YgcXNjYWxlIHNtb290aGluZyBvdmVyIHRpbWUgKDAuMC0xLjApCisKKyAgICAvKioKKyAgICAgKiBtaW5pbXVtIHF1YW50aXplcgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBxbWluOworCisgICAgLyoqCisgICAgICogbWF4aW11bSBxdWFudGl6ZXIKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgcW1heDsKKworICAgIC8qKgorICAgICAqIG1heGltdW0gcXVhbnRpemVyIGRpZmZlcmVuY2UgYmV0d2VlbiBmcmFtZXMKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgbWF4X3FkaWZmOworCisjaWYgRkZfQVBJX01QVl9PUFQKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZW5jb2RlciBwcml2YXRlIG9wdGlvbnMgaW5zdGVhZAorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgZmxvYXQgcmNfcXNxdWlzaDsKKworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgZmxvYXQgcmNfcW1vZF9hbXA7CisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICBpbnQgcmNfcW1vZF9mcmVxOworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBkZWNvZGVyIGJpdHN0cmVhbSBidWZmZXIgc2l6ZQorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCByY19idWZmZXJfc2l6ZTsKKworICAgIC8qKgorICAgICAqIHJhdGVjb250cm9sIG92ZXJyaWRlLCBzZWUgUmNPdmVycmlkZQorICAgICAqIC0gZW5jb2Rpbmc6IEFsbG9jYXRlZC9zZXQvZnJlZWQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgcmNfb3ZlcnJpZGVfY291bnQ7CisgICAgUmNPdmVycmlkZSAqcmNfb3ZlcnJpZGU7CisKKyNpZiBGRl9BUElfTVBWX09QVAorICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBlbmNvZGVyIHByaXZhdGUgb3B0aW9ucyBpbnN0ZWFkCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICBjb25zdCBjaGFyICpyY19lcTsKKyNlbmRpZgorCisgICAgLyoqCisgICAgICogbWF4aW11bSBiaXRyYXRlCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMuCisgICAgICovCisgICAgaW50IHJjX21heF9yYXRlOworCisgICAgLyoqCisgICAgICogbWluaW11bSBiaXRyYXRlCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IHJjX21pbl9yYXRlOworCisjaWYgRkZfQVBJX01QVl9PUFQKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZW5jb2RlciBwcml2YXRlIG9wdGlvbnMgaW5zdGVhZAorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgZmxvYXQgcmNfYnVmZmVyX2FnZ3Jlc3Npdml0eTsKKworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgZmxvYXQgcmNfaW5pdGlhbF9jcGx4OworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBSYXRlY29udHJvbCBhdHRlbXB0IHRvIHVzZSwgYXQgbWF4aW11bSwgPHZhbHVlPiBvZiB3aGF0IGNhbiBiZSB1c2VkIHdpdGhvdXQgYW4gdW5kZXJmbG93LgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZC4KKyAgICAgKi8KKyAgICBmbG9hdCByY19tYXhfYXZhaWxhYmxlX3Zidl91c2U7CisKKyAgICAvKioKKyAgICAgKiBSYXRlY29udHJvbCBhdHRlbXB0IHRvIHVzZSwgYXQgbGVhc3QsIDx2YWx1ZT4gdGltZXMgdGhlIGFtb3VudCBuZWVkZWQgdG8gcHJldmVudCBhIHZidiBvdmVyZmxvdy4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQuCisgICAgICovCisgICAgZmxvYXQgcmNfbWluX3Zidl9vdmVyZmxvd191c2U7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgYml0cyB3aGljaCBzaG91bGQgYmUgbG9hZGVkIGludG8gdGhlIHJjIGJ1ZmZlciBiZWZvcmUgZGVjb2Rpbmcgc3RhcnRzLgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCByY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3k7CisKKyNkZWZpbmUgRkZfQ09ERVJfVFlQRV9WTEMgICAgICAgMAorI2RlZmluZSBGRl9DT0RFUl9UWVBFX0FDICAgICAgICAxCisjZGVmaW5lIEZGX0NPREVSX1RZUEVfUkFXICAgICAgIDIKKyNkZWZpbmUgRkZfQ09ERVJfVFlQRV9STEUgICAgICAgMworI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUworI2RlZmluZSBGRl9DT0RFUl9UWVBFX0RFRkxBVEUgICA0CisjZW5kaWYgLyogRkZfQVBJX1VOVVNFRF9NRU1CRVJTICovCisgICAgLyoqCisgICAgICogY29kZXIgdHlwZQorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBjb2Rlcl90eXBlOworCisgICAgLyoqCisgICAgICogY29udGV4dCBtb2RlbAorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBjb250ZXh0X21vZGVsOworCisjaWYgRkZfQVBJX01QVl9PUFQKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZW5jb2RlciBwcml2YXRlIG9wdGlvbnMgaW5zdGVhZAorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgaW50IGxtaW47CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZW5jb2RlciBwcml2YXRlIG9wdGlvbnMgaW5zdGVhZAorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgaW50IGxtYXg7CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIGZyYW1lIHNraXAgdGhyZXNob2xkCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IGZyYW1lX3NraXBfdGhyZXNob2xkOworCisgICAgLyoqCisgICAgICogZnJhbWUgc2tpcCBmYWN0b3IKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgZnJhbWVfc2tpcF9mYWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBmcmFtZSBza2lwIGV4cG9uZW50CisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IGZyYW1lX3NraXBfZXhwOworCisgICAgLyoqCisgICAgICogZnJhbWUgc2tpcCBjb21wYXJpc29uIGZ1bmN0aW9uCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IGZyYW1lX3NraXBfY21wOworCisgICAgLyoqCisgICAgICogdHJlbGxpcyBSRCBxdWFudGl6YXRpb24KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgdHJlbGxpczsKKworICAgIC8qKgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBtaW5fcHJlZGljdGlvbl9vcmRlcjsKKworICAgIC8qKgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBtYXhfcHJlZGljdGlvbl9vcmRlcjsKKworICAgIC8qKgorICAgICAqIEdPUCB0aW1lY29kZSBmcmFtZSBzdGFydCBudW1iZXIKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlciwgaW4gbm9uIGRyb3AgZnJhbWUgZm9ybWF0CisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMgKHRpbWVjb2RlIGluIHRoZSAyNSBiaXRzIGZvcm1hdCwgLTEgaWYgdW5zZXQpCisgICAgICovCisgICAgaW50NjRfdCB0aW1lY29kZV9mcmFtZV9zdGFydDsKKworICAgIC8qIFRoZSBSVFAgY2FsbGJhY2s6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICAgICovCisgICAgLyogZXZlcnkgdGltZSB0aGUgZW5jb2RlciBoYXMgYSBwYWNrZXQgdG8gc2VuZC4gKi8KKyAgICAvKiBJdCBkZXBlbmRzIG9uIHRoZSBlbmNvZGVyIGlmIHRoZSBkYXRhIHN0YXJ0cyAqLworICAgIC8qIHdpdGggYSBTdGFydCBDb2RlIChpdCBzaG91bGQpLiBILjI2MyBkb2VzLiAgICovCisgICAgLyogbWJfbmIgY29udGFpbnMgdGhlIG51bWJlciBvZiBtYWNyb2Jsb2NrcyAgICAgKi8KKyAgICAvKiBlbmNvZGVkIGluIHRoZSBSVFAgcGF5bG9hZC4gICAgICAgICAgICAgICAgICAqLworICAgIHZvaWQgKCpydHBfY2FsbGJhY2spKHN0cnVjdCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCBzaXplLCBpbnQgbWJfbmIpOworCisgICAgaW50IHJ0cF9wYXlsb2FkX3NpemU7ICAgLyogVGhlIHNpemUgb2YgdGhlIFJUUCBwYXlsb2FkOiB0aGUgY29kZXIgd2lsbCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBpdHMgYmVzdCB0byBkZWxpdmVyIGEgY2h1bmsgd2l0aCBzaXplICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJlbG93IHJ0cF9wYXlsb2FkX3NpemUsIHRoZSBjaHVuayB3aWxsIHN0YXJ0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2l0aCBhIHN0YXJ0IGNvZGUgb24gc29tZSBjb2RlY3MgbGlrZSBILjI2My4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGRvZXNuJ3QgdGFrZSBhY2NvdW50IG9mIGFueSBwYXJ0aWN1bGFyICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhlYWRlcnMgaW5zaWRlIHRoZSB0cmFuc21pdHRlZCBSVFAgcGF5bG9hZC4gICovCisKKyAgICAvKiBzdGF0aXN0aWNzLCB1c2VkIGZvciAyLXBhc3MgZW5jb2RpbmcgKi8KKyAgICBpbnQgbXZfYml0czsKKyAgICBpbnQgaGVhZGVyX2JpdHM7CisgICAgaW50IGlfdGV4X2JpdHM7CisgICAgaW50IHBfdGV4X2JpdHM7CisgICAgaW50IGlfY291bnQ7CisgICAgaW50IHBfY291bnQ7CisgICAgaW50IHNraXBfY291bnQ7CisgICAgaW50IG1pc2NfYml0czsKKworICAgIC8qKgorICAgICAqIG51bWJlciBvZiBiaXRzIHVzZWQgZm9yIHRoZSBwcmV2aW91c2x5IGVuY29kZWQgZnJhbWUKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYy4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgZnJhbWVfYml0czsKKworICAgIC8qKgorICAgICAqIHBhc3MxIGVuY29kaW5nIHN0YXRpc3RpY3Mgb3V0cHV0IGJ1ZmZlcgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGNoYXIgKnN0YXRzX291dDsKKworICAgIC8qKgorICAgICAqIHBhc3MyIGVuY29kaW5nIHN0YXRpc3RpY3MgaW5wdXQgYnVmZmVyCisgICAgICogQ29uY2F0ZW5hdGVkIHN0dWZmIGZyb20gc3RhdHNfb3V0IG9mIHBhc3MxIHNob3VsZCBiZSBwbGFjZWQgaGVyZS4KKyAgICAgKiAtIGVuY29kaW5nOiBBbGxvY2F0ZWQvc2V0L2ZyZWVkIGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgY2hhciAqc3RhdHNfaW47CisKKyAgICAvKioKKyAgICAgKiBXb3JrIGFyb3VuZCBidWdzIGluIGVuY29kZXJzIHdoaWNoIHNvbWV0aW1lcyBjYW5ub3QgYmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlcgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyCisgICAgICovCisgICAgaW50IHdvcmthcm91bmRfYnVnczsKKyNkZWZpbmUgRkZfQlVHX0FVVE9ERVRFQ1QgICAgICAgMSAgLy8vPCBhdXRvZGV0ZWN0aW9uCisjaWYgRkZfQVBJX09MRF9NU01QRUc0CisjZGVmaW5lIEZGX0JVR19PTERfTVNNUEVHNCAgICAgIDIKKyNlbmRpZgorI2RlZmluZSBGRl9CVUdfWFZJRF9JTEFDRSAgICAgICA0CisjZGVmaW5lIEZGX0JVR19VTVA0ICAgICAgICAgICAgIDgKKyNkZWZpbmUgRkZfQlVHX05PX1BBRERJTkcgICAgICAgMTYKKyNkZWZpbmUgRkZfQlVHX0FNViAgICAgICAgICAgICAgMzIKKyNpZiBGRl9BUElfQUNfVkxDCisjZGVmaW5lIEZGX0JVR19BQ19WTEMgICAgICAgICAgIDAgIC8vLzwgV2lsbCBiZSByZW1vdmVkLCBsaWJhdmNvZGVjIGNhbiBub3cgaGFuZGxlIHRoZXNlIG5vbi1jb21wbGlhbnQgZmlsZXMgYnkgZGVmYXVsdC4KKyNlbmRpZgorI2RlZmluZSBGRl9CVUdfUVBFTF9DSFJPTUEgICAgICA2NAorI2RlZmluZSBGRl9CVUdfU1REX1FQRUwgICAgICAgICAxMjgKKyNkZWZpbmUgRkZfQlVHX1FQRUxfQ0hST01BMiAgICAgMjU2CisjZGVmaW5lIEZGX0JVR19ESVJFQ1RfQkxPQ0tTSVpFIDUxMgorI2RlZmluZSBGRl9CVUdfRURHRSAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIEZGX0JVR19IUEVMX0NIUk9NQSAgICAgIDIwNDgKKyNkZWZpbmUgRkZfQlVHX0RDX0NMSVAgICAgICAgICAgNDA5NgorI2RlZmluZSBGRl9CVUdfTVMgICAgICAgICAgICAgICA4MTkyIC8vLzwgV29yayBhcm91bmQgdmFyaW91cyBidWdzIGluIE1pY3Jvc29mdCdzIGJyb2tlbiBkZWNvZGVycy4KKyNkZWZpbmUgRkZfQlVHX1RSVU5DQVRFRCAgICAgICAxNjM4NAorCisgICAgLyoqCisgICAgICogc3RyaWN0bHkgZm9sbG93IHRoZSBzdGFuZGFyZCAoTVBFRzQsIC4uLikuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogU2V0dGluZyB0aGlzIHRvIFNUUklDVCBvciBoaWdoZXIgbWVhbnMgdGhlIGVuY29kZXIgYW5kIGRlY29kZXIgd2lsbAorICAgICAqIGdlbmVyYWxseSBkbyBzdHVwaWQgdGhpbmdzLCB3aGVyZWFzIHNldHRpbmcgaXQgdG8gdW5vZmZpY2lhbCBvciBsb3dlcgorICAgICAqIHdpbGwgbWVhbiB0aGUgZW5jb2RlciBtaWdodCBwcm9kdWNlIG91dHB1dCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsCisgICAgICogc3BlYy1jb21wbGlhbnQgZGVjb2RlcnMuIERlY29kZXJzIGRvbid0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBub3JtYWwsCisgICAgICogdW5vZmZpY2lhbCBhbmQgZXhwZXJpbWVudGFsICh0aGF0IGlzLCB0aGV5IGFsd2F5cyB0cnkgdG8gZGVjb2RlIHRoaW5ncworICAgICAqIHdoZW4gdGhleSBjYW4pIHVubGVzcyB0aGV5IGFyZSBleHBsaWNpdGx5IGFza2VkIHRvIGJlaGF2ZSBzdHVwaWRseQorICAgICAqICg9c3RyaWN0bHkgY29uZm9ybSB0byB0aGUgc3BlY3MpCisgICAgICovCisgICAgaW50IHN0cmljdF9zdGRfY29tcGxpYW5jZTsKKyNkZWZpbmUgRkZfQ09NUExJQU5DRV9WRVJZX1NUUklDVCAgIDIgLy8vPCBTdHJpY3RseSBjb25mb3JtIHRvIGFuIG9sZGVyIG1vcmUgc3RyaWN0IHZlcnNpb24gb2YgdGhlIHNwZWMgb3IgcmVmZXJlbmNlIHNvZnR3YXJlLgorI2RlZmluZSBGRl9DT01QTElBTkNFX1NUUklDVCAgICAgICAgMSAvLy88IFN0cmljdGx5IGNvbmZvcm0gdG8gYWxsIHRoZSB0aGluZ3MgaW4gdGhlIHNwZWMgbm8gbWF0dGVyIHdoYXQgY29uc2VxdWVuY2VzLgorI2RlZmluZSBGRl9DT01QTElBTkNFX05PUk1BTCAgICAgICAgMAorI2RlZmluZSBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwgICAtMSAvLy88IEFsbG93IHVub2ZmaWNpYWwgZXh0ZW5zaW9ucworI2RlZmluZSBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCAtMiAvLy88IEFsbG93IG5vbnN0YW5kYXJkaXplZCBleHBlcmltZW50YWwgdGhpbmdzLgorCisgICAgLyoqCisgICAgICogZXJyb3IgY29uY2VhbG1lbnQgZmxhZ3MKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBpbnQgZXJyb3JfY29uY2VhbG1lbnQ7CisjZGVmaW5lIEZGX0VDX0dVRVNTX01WUyAgIDEKKyNkZWZpbmUgRkZfRUNfREVCTE9DSyAgICAgMgorI2RlZmluZSBGRl9FQ19GQVZPUl9JTlRFUiAyNTYKKworICAgIC8qKgorICAgICAqIGRlYnVnCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICovCisgICAgaW50IGRlYnVnOworI2RlZmluZSBGRl9ERUJVR19QSUNUX0lORk8gICAxCisjZGVmaW5lIEZGX0RFQlVHX1JDICAgICAgICAgIDIKKyNkZWZpbmUgRkZfREVCVUdfQklUU1RSRUFNICAgNAorI2RlZmluZSBGRl9ERUJVR19NQl9UWVBFICAgICA4CisjZGVmaW5lIEZGX0RFQlVHX1FQICAgICAgICAgIDE2CisjaWYgRkZfQVBJX0RFQlVHX01WCisvKioKKyAqIEBkZXByZWNhdGVkIHRoaXMgb3B0aW9uIGRvZXMgbm90aGluZworICovCisjZGVmaW5lIEZGX0RFQlVHX01WICAgICAgICAgIDMyCisjZW5kaWYKKyNkZWZpbmUgRkZfREVCVUdfRENUX0NPRUZGICAgMHgwMDAwMDA0MAorI2RlZmluZSBGRl9ERUJVR19TS0lQICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEZGX0RFQlVHX1NUQVJUQ09ERSAgIDB4MDAwMDAxMDAKKyNpZiBGRl9BUElfVU5VU0VEX01FTUJFUlMKKyNkZWZpbmUgRkZfREVCVUdfUFRTICAgICAgICAgMHgwMDAwMDIwMAorI2VuZGlmIC8qIEZGX0FQSV9VTlVTRURfTUVNQkVSUyAqLworI2RlZmluZSBGRl9ERUJVR19FUiAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEZGX0RFQlVHX01NQ08gICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgRkZfREVCVUdfQlVHUyAgICAgICAgMHgwMDAwMTAwMAorI2lmIEZGX0FQSV9ERUJVR19NVgorI2RlZmluZSBGRl9ERUJVR19WSVNfUVAgICAgICAweDAwMDAyMDAwIC8vLzwgb25seSBhY2Nlc3MgdGhyb3VnaCBBVk9wdGlvbnMgZnJvbSBvdXRzaWRlIGxpYmF2Y29kZWMKKyNkZWZpbmUgRkZfREVCVUdfVklTX01CX1RZUEUgMHgwMDAwNDAwMCAvLy88IG9ubHkgYWNjZXNzIHRocm91Z2ggQVZPcHRpb25zIGZyb20gb3V0c2lkZSBsaWJhdmNvZGVjCisjZW5kaWYKKyNkZWZpbmUgRkZfREVCVUdfQlVGRkVSUyAgICAgMHgwMDAwODAwMAorI2RlZmluZSBGRl9ERUJVR19USFJFQURTICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEZGX0RFQlVHX05PTUMgICAgICAgIDB4MDEwMDAwMDAKKworI2lmIEZGX0FQSV9ERUJVR19NVgorICAgIC8qKgorICAgICAqIGRlYnVnCisgICAgICogQ29kZSBvdXRzaWRlIGxpYmF2Y29kZWMgc2hvdWxkIGFjY2VzcyB0aGlzIGZpZWxkIHVzaW5nIEFWT3B0aW9ucworICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqLworICAgIGludCBkZWJ1Z19tdjsKKyNkZWZpbmUgRkZfREVCVUdfVklTX01WX1BfRk9SICAweDAwMDAwMDAxIC8vdmlzdWFsaXplIGZvcndhcmQgcHJlZGljdGVkIE1WcyBvZiBQIGZyYW1lcworI2RlZmluZSBGRl9ERUJVR19WSVNfTVZfQl9GT1IgIDB4MDAwMDAwMDIgLy92aXN1YWxpemUgZm9yd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIEIgZnJhbWVzCisjZGVmaW5lIEZGX0RFQlVHX1ZJU19NVl9CX0JBQ0sgMHgwMDAwMDAwNCAvL3Zpc3VhbGl6ZSBiYWNrd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIEIgZnJhbWVzCisjZW5kaWYKKworICAgIC8qKgorICAgICAqIEVycm9yIHJlY29nbml0aW9uOyBtYXkgbWlzZGV0ZWN0IHNvbWUgbW9yZSBvciBsZXNzIHZhbGlkIHBhcnRzIGFzIGVycm9ycy4KKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBpbnQgZXJyX3JlY29nbml0aW9uOworCisvKioKKyAqIFZlcmlmeSBjaGVja3N1bXMgZW1iZWRkZWQgaW4gdGhlIGJpdHN0cmVhbSAoY291bGQgYmUgb2YgZWl0aGVyIGVuY29kZWQgb3IKKyAqIGRlY29kZWQgZGF0YSwgZGVwZW5kaW5nIG9uIHRoZSBjb2RlYykgYW5kIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gbWlzbWF0Y2guCisgKiBJZiBBVl9FRl9FWFBMT0RFIGlzIGFsc28gc2V0LCBhIG1pc21hdGNoaW5nIGNoZWNrc3VtIHdpbGwgcmVzdWx0IGluIHRoZQorICogZGVjb2RlciByZXR1cm5pbmcgYW4gZXJyb3IuCisgKi8KKyNkZWZpbmUgQVZfRUZfQ1JDQ0hFQ0sgICgxPDwwKQorI2RlZmluZSBBVl9FRl9CSVRTVFJFQU0gKDE8PDEpICAgICAgICAgIC8vLzwgZGV0ZWN0IGJpdHN0cmVhbSBzcGVjaWZpY2F0aW9uIGRldmlhdGlvbnMKKyNkZWZpbmUgQVZfRUZfQlVGRkVSICAgICgxPDwyKSAgICAgICAgICAvLy88IGRldGVjdCBpbXByb3BlciBiaXRzdHJlYW0gbGVuZ3RoCisjZGVmaW5lIEFWX0VGX0VYUExPREUgICAoMTw8MykgICAgICAgICAgLy8vPCBhYm9ydCBkZWNvZGluZyBvbiBtaW5vciBlcnJvciBkZXRlY3Rpb24KKworI2RlZmluZSBBVl9FRl9JR05PUkVfRVJSICgxPDwxNSkgICAgICAgIC8vLzwgaWdub3JlIGVycm9ycyBhbmQgY29udGludWUKKyNkZWZpbmUgQVZfRUZfQ0FSRUZVTCAgICAoMTw8MTYpICAgICAgICAvLy88IGNvbnNpZGVyIHRoaW5ncyB0aGF0IHZpb2xhdGUgdGhlIHNwZWMsIGFyZSBmYXN0IHRvIGNhbGN1bGF0ZSBhbmQgaGF2ZSBub3QgYmVlbiBzZWVuIGluIHRoZSB3aWxkIGFzIGVycm9ycworI2RlZmluZSBBVl9FRl9DT01QTElBTlQgICgxPDwxNykgICAgICAgIC8vLzwgY29uc2lkZXIgYWxsIHNwZWMgbm9uIGNvbXBsaWFuY2VzIGFzIGVycm9ycworI2RlZmluZSBBVl9FRl9BR0dSRVNTSVZFICgxPDwxOCkgICAgICAgIC8vLzwgY29uc2lkZXIgdGhpbmdzIHRoYXQgYSBzYW5lIGVuY29kZXIgc2hvdWxkIG5vdCBkbyBhcyBhbiBlcnJvcgorCisKKyAgICAvKioKKyAgICAgKiBvcGFxdWUgNjRiaXQgbnVtYmVyIChnZW5lcmFsbHkgYSBQVFMpIHRoYXQgd2lsbCBiZSByZW9yZGVyZWQgYW5kCisgICAgICogb3V0cHV0IGluIEFWRnJhbWUucmVvcmRlcmVkX29wYXF1ZQorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqLworICAgIGludDY0X3QgcmVvcmRlcmVkX29wYXF1ZTsKKworICAgIC8qKgorICAgICAqIEhhcmR3YXJlIGFjY2VsZXJhdG9yIGluIHVzZQorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZC4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYworICAgICAqLworICAgIHN0cnVjdCBBVkhXQWNjZWwgKmh3YWNjZWw7CisKKyAgICAvKioKKyAgICAgKiBIYXJkd2FyZSBhY2NlbGVyYXRvciBjb250ZXh0LgorICAgICAqIEZvciBzb21lIGhhcmR3YXJlIGFjY2VsZXJhdG9ycywgYSBnbG9iYWwgY29udGV4dCBuZWVkcyB0byBiZQorICAgICAqIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBJbiB0aGF0IGNhc2UsIHRoaXMgaG9sZHMgZGlzcGxheS1kZXBlbmRlbnQKKyAgICAgKiBkYXRhIEZGbXBlZyBjYW5ub3QgaW5zdGFudGlhdGUgaXRzZWxmLiBQbGVhc2UgcmVmZXIgdG8gdGhlCisgICAgICogRkZtcGVnIEhXIGFjY2VsZXJhdG9yIGRvY3VtZW50YXRpb24gdG8ga25vdyBob3cgdG8gZmlsbCB0aGlzCisgICAgICogaXMuIGUuZy4gZm9yIFZBIEFQSSwgdGhpcyBpcyBhIHN0cnVjdCB2YWFwaV9jb250ZXh0LgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyCisgICAgICovCisgICAgdm9pZCAqaHdhY2NlbF9jb250ZXh0OworCisgICAgLyoqCisgICAgICogZXJyb3IKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYyBpZiBmbGFncyZDT0RFQ19GTEFHX1BTTlIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgdWludDY0X3QgZXJyb3JbQVZfTlVNX0RBVEFfUE9JTlRFUlNdOworCisgICAgLyoqCisgICAgICogRENUIGFsZ29yaXRobSwgc2VlIEZGX0RDVF8qIGJlbG93CisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IGRjdF9hbGdvOworI2RlZmluZSBGRl9EQ1RfQVVUTyAgICAwCisjZGVmaW5lIEZGX0RDVF9GQVNUSU5UIDEKKyNpZiBGRl9BUElfVU5VU0VEX01FTUJFUlMKKyNkZWZpbmUgRkZfRENUX0lOVCAgICAgMgorI2VuZGlmIC8qIEZGX0FQSV9VTlVTRURfTUVNQkVSUyAqLworI2RlZmluZSBGRl9EQ1RfTU1YICAgICAzCisjZGVmaW5lIEZGX0RDVF9BTFRJVkVDIDUKKyNkZWZpbmUgRkZfRENUX0ZBQU4gICAgNgorCisgICAgLyoqCisgICAgICogSURDVCBhbGdvcml0aG0sIHNlZSBGRl9JRENUXyogYmVsb3cuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICovCisgICAgaW50IGlkY3RfYWxnbzsKKyNkZWZpbmUgRkZfSURDVF9BVVRPICAgICAgICAgIDAKKyNkZWZpbmUgRkZfSURDVF9JTlQgICAgICAgICAgIDEKKyNkZWZpbmUgRkZfSURDVF9TSU1QTEUgICAgICAgIDIKKyNkZWZpbmUgRkZfSURDVF9TSU1QTEVNTVggICAgIDMKKyNkZWZpbmUgRkZfSURDVF9BUk0gICAgICAgICAgIDcKKyNkZWZpbmUgRkZfSURDVF9BTFRJVkVDICAgICAgIDgKKyNpZiBGRl9BUElfQVJDSF9TSDQKKyNkZWZpbmUgRkZfSURDVF9TSDQgICAgICAgICAgIDkKKyNlbmRpZgorI2RlZmluZSBGRl9JRENUX1NJTVBMRUFSTSAgICAgMTAKKyNpZiBGRl9BUElfVU5VU0VEX01FTUJFUlMKKyNkZWZpbmUgRkZfSURDVF9JUFAgICAgICAgICAgIDEzCisjZW5kaWYgLyogRkZfQVBJX1VOVVNFRF9NRU1CRVJTICovCisjZGVmaW5lIEZGX0lEQ1RfWFZJRCAgICAgICAgICAxNAorI2lmIEZGX0FQSV9JRENUX1hWSURNTVgKKyNkZWZpbmUgRkZfSURDVF9YVklETU1YICAgICAgIDE0CisjZW5kaWYgLyogRkZfQVBJX0lEQ1RfWFZJRE1NWCAqLworI2RlZmluZSBGRl9JRENUX1NJTVBMRUFSTVY1VEUgMTYKKyNkZWZpbmUgRkZfSURDVF9TSU1QTEVBUk1WNiAgIDE3CisjaWYgRkZfQVBJX0FSQ0hfU1BBUkMKKyNkZWZpbmUgRkZfSURDVF9TSU1QTEVWSVMgICAgIDE4CisjZW5kaWYKKyNkZWZpbmUgRkZfSURDVF9GQUFOICAgICAgICAgIDIwCisjZGVmaW5lIEZGX0lEQ1RfU0lNUExFTkVPTiAgICAyMgorI2lmIEZGX0FQSV9BUkNIX0FMUEhBCisjZGVmaW5lIEZGX0lEQ1RfU0lNUExFQUxQSEEgICAyMworI2VuZGlmCisjZGVmaW5lIEZGX0lEQ1RfU0lNUExFQVVUTyAgICAxMjgKKworICAgIC8qKgorICAgICAqIGJpdHMgcGVyIHNhbXBsZS9waXhlbCBmcm9tIHRoZSBkZW11eGVyIChuZWVkZWQgZm9yIGh1ZmZ5dXYpLgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqLworICAgICBpbnQgYml0c19wZXJfY29kZWRfc2FtcGxlOworCisgICAgLyoqCisgICAgICogQml0cyBwZXIgc2FtcGxlL3BpeGVsIG9mIGludGVybmFsIGxpYmF2Y29kZWMgcGl4ZWwvc2FtcGxlIGZvcm1hdC4KKyAgICAgKiAtIGVuY29kaW5nOiBzZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgbGliYXZjb2RlYy4KKyAgICAgKi8KKyAgICBpbnQgYml0c19wZXJfcmF3X3NhbXBsZTsKKworI2lmIEZGX0FQSV9MT1dSRVMKKyAgICAvKioKKyAgICAgKiBsb3cgcmVzb2x1dGlvbiBkZWNvZGluZywgMS0+IDEvMiBzaXplLCAyLT4xLzQgc2l6ZQorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIENvZGUgb3V0c2lkZSBsaWJhdmNvZGVjIHNob3VsZCBhY2Nlc3MgdGhpcyBmaWVsZCB1c2luZzoKKyAgICAgKiBhdl9jb2RlY197Z2V0LHNldH1fbG93cmVzKGF2Y3R4KQorICAgICAqLworICAgICBpbnQgbG93cmVzOworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiB0aGUgcGljdHVyZSBpbiB0aGUgYml0c3RyZWFtCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgQVZGcmFtZSAqY29kZWRfZnJhbWU7CisKKyAgICAvKioKKyAgICAgKiB0aHJlYWQgY291bnQKKyAgICAgKiBpcyB1c2VkIHRvIGRlY2lkZSBob3cgbWFueSBpbmRlcGVuZGVudCB0YXNrcyBzaG91bGQgYmUgcGFzc2VkIHRvIGV4ZWN1dGUoKQorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqLworICAgIGludCB0aHJlYWRfY291bnQ7CisKKyAgICAvKioKKyAgICAgKiBXaGljaCBtdWx0aXRocmVhZGluZyBtZXRob2RzIHRvIHVzZS4KKyAgICAgKiBVc2Ugb2YgRkZfVEhSRUFEX0ZSQU1FIHdpbGwgaW5jcmVhc2UgZGVjb2RpbmcgZGVsYXkgYnkgb25lIGZyYW1lIHBlciB0aHJlYWQsCisgICAgICogc28gY2xpZW50cyB3aGljaCBjYW5ub3QgcHJvdmlkZSBmdXR1cmUgZnJhbWVzIHNob3VsZCBub3QgdXNlIGl0LgorICAgICAqCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBpcyB1c2VkLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBpbnQgdGhyZWFkX3R5cGU7CisjZGVmaW5lIEZGX1RIUkVBRF9GUkFNRSAgIDEgLy8vPCBEZWNvZGUgbW9yZSB0aGFuIG9uZSBmcmFtZSBhdCBvbmNlCisjZGVmaW5lIEZGX1RIUkVBRF9TTElDRSAgIDIgLy8vPCBEZWNvZGUgbW9yZSB0aGFuIG9uZSBwYXJ0IG9mIGEgc2luZ2xlIGZyYW1lIGF0IG9uY2UKKworICAgIC8qKgorICAgICAqIFdoaWNoIG11bHRpdGhyZWFkaW5nIG1ldGhvZHMgYXJlIGluIHVzZSBieSB0aGUgY29kZWMuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMuCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMuCisgICAgICovCisgICAgaW50IGFjdGl2ZV90aHJlYWRfdHlwZTsKKworICAgIC8qKgorICAgICAqIFNldCBieSB0aGUgY2xpZW50IGlmIGl0cyBjdXN0b20gZ2V0X2J1ZmZlcigpIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQKKyAgICAgKiBzeW5jaHJvbm91c2x5IGZyb20gYW5vdGhlciB0aHJlYWQsIHdoaWNoIGFsbG93cyBmYXN0ZXIgbXVsdGl0aHJlYWRlZCBkZWNvZGluZy4KKyAgICAgKiBkcmF3X2hvcml6X2JhbmQoKSB3aWxsIGJlIGNhbGxlZCBmcm9tIG90aGVyIHRocmVhZHMgcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisgICAgICogSWdub3JlZCBpZiB0aGUgZGVmYXVsdCBnZXRfYnVmZmVyKCkgaXMgdXNlZC4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBpbnQgdGhyZWFkX3NhZmVfY2FsbGJhY2tzOworCisgICAgLyoqCisgICAgICogVGhlIGNvZGVjIG1heSBjYWxsIHRoaXMgdG8gZXhlY3V0ZSBzZXZlcmFsIGluZGVwZW5kZW50IHRoaW5ncy4KKyAgICAgKiBJdCB3aWxsIHJldHVybiBvbmx5IGFmdGVyIGZpbmlzaGluZyBhbGwgdGFza3MuCisgICAgICogVGhlIHVzZXIgbWF5IHJlcGxhY2UgdGhpcyB3aXRoIHNvbWUgbXVsdGl0aHJlYWRlZCBpbXBsZW1lbnRhdGlvbiwKKyAgICAgKiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGV4ZWN1dGUgdGhlIHBhcnRzIHNlcmlhbGx5LgorICAgICAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIHRoaW5ncyB0byBleGVjdXRlCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMsIHVzZXIgY2FuIG92ZXJyaWRlLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLCB1c2VyIGNhbiBvdmVycmlkZS4KKyAgICAgKi8KKyAgICBpbnQgKCpleGVjdXRlKShzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKmMsIGludCAoKmZ1bmMpKHN0cnVjdCBBVkNvZGVjQ29udGV4dCAqYzIsIHZvaWQgKmFyZyksIHZvaWQgKmFyZzIsIGludCAqcmV0LCBpbnQgY291bnQsIGludCBzaXplKTsKKworICAgIC8qKgorICAgICAqIFRoZSBjb2RlYyBtYXkgY2FsbCB0aGlzIHRvIGV4ZWN1dGUgc2V2ZXJhbCBpbmRlcGVuZGVudCB0aGluZ3MuCisgICAgICogSXQgd2lsbCByZXR1cm4gb25seSBhZnRlciBmaW5pc2hpbmcgYWxsIHRhc2tzLgorICAgICAqIFRoZSB1c2VyIG1heSByZXBsYWNlIHRoaXMgd2l0aCBzb21lIG11bHRpdGhyZWFkZWQgaW1wbGVtZW50YXRpb24sCisgICAgICogdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2lsbCBleGVjdXRlIHRoZSBwYXJ0cyBzZXJpYWxseS4KKyAgICAgKiBBbHNvIHNlZSBhdmNvZGVjX3RocmVhZF9pbml0IGFuZCBlLmcuIHRoZSAtLWVuYWJsZS1wdGhyZWFkIGNvbmZpZ3VyZSBvcHRpb24uCisgICAgICogQHBhcmFtIGMgY29udGV4dCBwYXNzZWQgYWxzbyB0byBmdW5jCisgICAgICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgdGhpbmdzIHRvIGV4ZWN1dGUKKyAgICAgKiBAcGFyYW0gYXJnMiBhcmd1bWVudCBwYXNzZWQgdW5jaGFuZ2VkIHRvIGZ1bmMKKyAgICAgKiBAcGFyYW0gcmV0IHJldHVybiB2YWx1ZXMgb2YgZXhlY3V0ZWQgZnVuY3Rpb25zLCBtdXN0IGhhdmUgc3BhY2UgZm9yICJjb3VudCIgdmFsdWVzLiBNYXkgYmUgTlVMTC4KKyAgICAgKiBAcGFyYW0gZnVuYyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGNvdW50IHRpbWVzLCB3aXRoIGpvYm5yIGZyb20gMCB0byBjb3VudC0xLgorICAgICAqICAgICAgICAgICAgIHRocmVhZG5yIHdpbGwgYmUgaW4gdGhlIHJhbmdlIDAgdG8gYy0+dGhyZWFkX2NvdW50LTEgPCBNQVhfVEhSRUFEUyBhbmQgc28gdGhhdCBubworICAgICAqICAgICAgICAgICAgIHR3byBpbnN0YW5jZXMgb2YgZnVuYyBleGVjdXRpbmcgYXQgdGhlIHNhbWUgdGltZSB3aWxsIGhhdmUgdGhlIHNhbWUgdGhyZWFkbnIuCisgICAgICogQHJldHVybiBhbHdheXMgMCBjdXJyZW50bHksIGJ1dCBjb2RlIHNob3VsZCBoYW5kbGUgYSBmdXR1cmUgaW1wcm92ZW1lbnQgd2hlcmUgd2hlbiBhbnkgY2FsbCB0byBmdW5jCisgICAgICogICAgICAgICByZXR1cm5zIDwgMCBubyBmdXJ0aGVyIGNhbGxzIHRvIGZ1bmMgbWF5IGJlIGRvbmUgYW5kIDwgMCBpcyByZXR1cm5lZC4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYywgdXNlciBjYW4gb3ZlcnJpZGUuCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMsIHVzZXIgY2FuIG92ZXJyaWRlLgorICAgICAqLworICAgIGludCAoKmV4ZWN1dGUyKShzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKmMsIGludCAoKmZ1bmMpKHN0cnVjdCBBVkNvZGVjQ29udGV4dCAqYzIsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIpLCB2b2lkICphcmcyLCBpbnQgKnJldCwgaW50IGNvdW50KTsKKworI2lmIEZGX0FQSV9USFJFQURfT1BBUVVFCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIHVzZWQgZnJvbSBvdXRzaWRlIG9mIGxhdmMKKyAgICAgKi8KKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorICAgIHZvaWQgKnRocmVhZF9vcGFxdWU7CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIG5vaXNlIHZzLiBzc2Ugd2VpZ2h0IGZvciB0aGUgbnNzZSBjb21wYXJpc29uIGZ1bmN0aW9uCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgIGludCBuc3NlX3dlaWdodDsKKworICAgIC8qKgorICAgICAqIHByb2ZpbGUKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYy4KKyAgICAgKi8KKyAgICAgaW50IHByb2ZpbGU7CisjZGVmaW5lIEZGX1BST0ZJTEVfVU5LTk9XTiAtOTkKKyNkZWZpbmUgRkZfUFJPRklMRV9SRVNFUlZFRCAtMTAwCisKKyNkZWZpbmUgRkZfUFJPRklMRV9BQUNfTUFJTiAwCisjZGVmaW5lIEZGX1BST0ZJTEVfQUFDX0xPVyAgMQorI2RlZmluZSBGRl9QUk9GSUxFX0FBQ19TU1IgIDIKKyNkZWZpbmUgRkZfUFJPRklMRV9BQUNfTFRQICAzCisjZGVmaW5lIEZGX1BST0ZJTEVfQUFDX0hFICAgNAorI2RlZmluZSBGRl9QUk9GSUxFX0FBQ19IRV9WMiAyOAorI2RlZmluZSBGRl9QUk9GSUxFX0FBQ19MRCAgIDIyCisjZGVmaW5lIEZGX1BST0ZJTEVfQUFDX0VMRCAgMzgKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHMl9BQUNfTE9XIDEyOAorI2RlZmluZSBGRl9QUk9GSUxFX01QRUcyX0FBQ19IRSAgMTMxCisKKyNkZWZpbmUgRkZfUFJPRklMRV9EVFMgICAgICAgICAyMAorI2RlZmluZSBGRl9QUk9GSUxFX0RUU19FUyAgICAgIDMwCisjZGVmaW5lIEZGX1BST0ZJTEVfRFRTXzk2XzI0ICAgNDAKKyNkZWZpbmUgRkZfUFJPRklMRV9EVFNfSERfSFJBICA1MAorI2RlZmluZSBGRl9QUk9GSUxFX0RUU19IRF9NQSAgIDYwCisKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHMl80MjIgICAgMAorI2RlZmluZSBGRl9QUk9GSUxFX01QRUcyX0hJR0ggICAxCisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzJfU1MgICAgIDIKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHMl9TTlJfU0NBTEFCTEUgIDMKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHMl9NQUlOICAgNAorI2RlZmluZSBGRl9QUk9GSUxFX01QRUcyX1NJTVBMRSA1CisKKyNkZWZpbmUgRkZfUFJPRklMRV9IMjY0X0NPTlNUUkFJTkVEICAoMTw8OSkgIC8vIDgrMTsgY29uc3RyYWludF9zZXQxX2ZsYWcKKyNkZWZpbmUgRkZfUFJPRklMRV9IMjY0X0lOVFJBICAgICAgICAoMTw8MTEpIC8vIDgrMzsgY29uc3RyYWludF9zZXQzX2ZsYWcKKworI2RlZmluZSBGRl9QUk9GSUxFX0gyNjRfQkFTRUxJTkUgICAgICAgICAgICAgNjYKKyNkZWZpbmUgRkZfUFJPRklMRV9IMjY0X0NPTlNUUkFJTkVEX0JBU0VMSU5FICg2NnxGRl9QUk9GSUxFX0gyNjRfQ09OU1RSQUlORUQpCisjZGVmaW5lIEZGX1BST0ZJTEVfSDI2NF9NQUlOICAgICAgICAgICAgICAgICA3NworI2RlZmluZSBGRl9QUk9GSUxFX0gyNjRfRVhURU5ERUQgICAgICAgICAgICAgODgKKyNkZWZpbmUgRkZfUFJPRklMRV9IMjY0X0hJR0ggICAgICAgICAgICAgICAgIDEwMAorI2RlZmluZSBGRl9QUk9GSUxFX0gyNjRfSElHSF8xMCAgICAgICAgICAgICAgMTEwCisjZGVmaW5lIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzEwX0lOVFJBICAgICAgICAoMTEwfEZGX1BST0ZJTEVfSDI2NF9JTlRSQSkKKyNkZWZpbmUgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDIyICAgICAgICAgICAgIDEyMgorI2RlZmluZSBGRl9QUk9GSUxFX0gyNjRfSElHSF80MjJfSU5UUkEgICAgICAgKDEyMnxGRl9QUk9GSUxFX0gyNjRfSU5UUkEpCisjZGVmaW5lIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NCAgICAgICAgICAgICAxNDQKKyNkZWZpbmUgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDQ0X1BSRURJQ1RJVkUgIDI0NAorI2RlZmluZSBGRl9QUk9GSUxFX0gyNjRfSElHSF80NDRfSU5UUkEgICAgICAgKDI0NHxGRl9QUk9GSUxFX0gyNjRfSU5UUkEpCisjZGVmaW5lIEZGX1BST0ZJTEVfSDI2NF9DQVZMQ180NDQgICAgICAgICAgICA0NAorCisjZGVmaW5lIEZGX1BST0ZJTEVfVkMxX1NJTVBMRSAgIDAKKyNkZWZpbmUgRkZfUFJPRklMRV9WQzFfTUFJTiAgICAgMQorI2RlZmluZSBGRl9QUk9GSUxFX1ZDMV9DT01QTEVYICAyCisjZGVmaW5lIEZGX1BST0ZJTEVfVkMxX0FEVkFOQ0VEIDMKKworI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X1NJTVBMRSAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHNF9TSU1QTEVfU0NBTEFCTEUgICAgICAgICAgICAxCisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzRfQ09SRSAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X01BSU4gICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHNF9OX0JJVCAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzRfU0NBTEFCTEVfVEVYVFVSRSAgICAgICAgICAgNQorI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X1NJTVBMRV9GQUNFX0FOSU1BVElPTiAgICAgIDYKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHNF9CQVNJQ19BTklNQVRFRF9URVhUVVJFICAgICA3CisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzRfSFlCUklEICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X0FEVkFOQ0VEX1JFQUxfVElNRSAgICAgICAgIDkKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHNF9DT1JFX1NDQUxBQkxFICAgICAgICAgICAgIDEwCisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzRfQURWQU5DRURfQ09ESU5HICAgICAgICAgICAxMQorI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X0FEVkFOQ0VEX0NPUkUgICAgICAgICAgICAgMTIKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHNF9BRFZBTkNFRF9TQ0FMQUJMRV9URVhUVVJFIDEzCisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzRfU0lNUExFX1NUVURJTyAgICAgICAgICAgICAxNAorI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X0FEVkFOQ0VEX1NJTVBMRSAgICAgICAgICAgMTUKKworI2RlZmluZSBGRl9QUk9GSUxFX0pQRUcyMDAwX0NTVFJFQU1fUkVTVFJJQ1RJT05fMCAgIDAKKyNkZWZpbmUgRkZfUFJPRklMRV9KUEVHMjAwMF9DU1RSRUFNX1JFU1RSSUNUSU9OXzEgICAxCisjZGVmaW5lIEZGX1BST0ZJTEVfSlBFRzIwMDBfQ1NUUkVBTV9OT19SRVNUUklDVElPTiAgMgorI2RlZmluZSBGRl9QUk9GSUxFX0pQRUcyMDAwX0RDSU5FTUFfMksgICAgICAgICAgICAgIDMKKyNkZWZpbmUgRkZfUFJPRklMRV9KUEVHMjAwMF9EQ0lORU1BXzRLICAgICAgICAgICAgICA0CisKKworI2RlZmluZSBGRl9QUk9GSUxFX0hFVkNfTUFJTiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRkZfUFJPRklMRV9IRVZDX01BSU5fMTAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEZGX1BST0ZJTEVfSEVWQ19NQUlOX1NUSUxMX1BJQ1RVUkUgICAgICAgICAgMworI2RlZmluZSBGRl9QUk9GSUxFX0hFVkNfUkVYVCAgICAgICAgICAgICAgICAgICAgICAgIDQKKworICAgIC8qKgorICAgICAqIGxldmVsCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMuCisgICAgICovCisgICAgIGludCBsZXZlbDsKKyNkZWZpbmUgRkZfTEVWRUxfVU5LTk9XTiAtOTkKKworICAgIC8qKgorICAgICAqIFNraXAgbG9vcCBmaWx0ZXJpbmcgZm9yIHNlbGVjdGVkIGZyYW1lcy4KKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBlbnVtIEFWRGlzY2FyZCBza2lwX2xvb3BfZmlsdGVyOworCisgICAgLyoqCisgICAgICogU2tpcCBJRENUL2RlcXVhbnRpemF0aW9uIGZvciBzZWxlY3RlZCBmcmFtZXMuCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICovCisgICAgZW51bSBBVkRpc2NhcmQgc2tpcF9pZGN0OworCisgICAgLyoqCisgICAgICogU2tpcCBkZWNvZGluZyBmb3Igc2VsZWN0ZWQgZnJhbWVzLgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqLworICAgIGVudW0gQVZEaXNjYXJkIHNraXBfZnJhbWU7CisKKyAgICAvKioKKyAgICAgKiBIZWFkZXIgY29udGFpbmluZyBzdHlsZSBpbmZvcm1hdGlvbiBmb3IgdGV4dCBzdWJ0aXRsZXMuCisgICAgICogRm9yIFNVQlRJVExFX0FTUyBzdWJ0aXRsZSB0eXBlLCBpdCBzaG91bGQgY29udGFpbiB0aGUgd2hvbGUgQVNTCisgICAgICogW1NjcmlwdCBJbmZvXSBhbmQgW1Y0KyBTdHlsZXNdIHNlY3Rpb24sIHBsdXMgdGhlIFtFdmVudHNdIGxpbmUgYW5kCisgICAgICogdGhlIEZvcm1hdCBsaW5lIGZvbGxvd2luZy4gSXQgc2hvdWxkbid0IGluY2x1ZGUgYW55IERpYWxvZ3VlIGxpbmUuCisgICAgICogLSBlbmNvZGluZzogU2V0L2FsbG9jYXRlZC9mcmVlZCBieSB1c2VyIChiZWZvcmUgYXZjb2RlY19vcGVuMigpKQorICAgICAqIC0gZGVjb2Rpbmc6IFNldC9hbGxvY2F0ZWQvZnJlZWQgYnkgbGliYXZjb2RlYyAoYnkgYXZjb2RlY19vcGVuMigpKQorICAgICAqLworICAgIHVpbnQ4X3QgKnN1YnRpdGxlX2hlYWRlcjsKKyAgICBpbnQgc3VidGl0bGVfaGVhZGVyX3NpemU7CisKKyNpZiBGRl9BUElfRVJST1JfUkFURQorICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUgJ2Vycm9yX3JhdGUnIHByaXZhdGUgQVZPcHRpb24gb2YgdGhlIG1wZWd2aWRlbworICAgICAqIGVuY29kZXJzCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICBpbnQgZXJyb3JfcmF0ZTsKKyNlbmRpZgorCisjaWYgRkZfQVBJX0NPREVDX1BLVAorICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHRoaXMgZmllbGQgaXMgbm90IHN1cHBvc2VkIHRvIGJlIGFjY2Vzc2VkIGZyb20gb3V0c2lkZSBsYXZjCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICBBVlBhY2tldCAqcGt0OworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBWQlYgZGVsYXkgY29kZWQgaW4gdGhlIGxhc3QgZnJhbWUgKGluIHBlcmlvZHMgb2YgYSAyNyBNSHogY2xvY2spLgorICAgICAqIFVzZWQgZm9yIGNvbXBsaWFudCBUUyBtdXhpbmcuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMuCisgICAgICogLSBkZWNvZGluZzogdW51c2VkLgorICAgICAqLworICAgIHVpbnQ2NF90IHZidl9kZWxheTsKKworICAgIC8qKgorICAgICAqIEVuY29kaW5nIG9ubHkuIEFsbG93IGVuY29kZXJzIHRvIG91dHB1dCBwYWNrZXRzIHRoYXQgZG8gbm90IGNvbnRhaW4gYW55CisgICAgICogZW5jb2RlZCBkYXRhLCBvbmx5IHNpZGUgZGF0YS4KKyAgICAgKgorICAgICAqIFNvbWUgZW5jb2RlcnMgbmVlZCB0byBvdXRwdXQgc3VjaCBwYWNrZXRzLCBlLmcuIHRvIHVwZGF0ZSBzb21lIHN0cmVhbQorICAgICAqIHBhcmFtZXRlcnMgYXQgdGhlIGVuZCBvZiBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEFsbCBjYWxsZXJzIGFyZSBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gMSBhbmQgdXBkYXRlCisgICAgICogdGhlaXIgY29kZSB0byBkZWFsIHdpdGggc3VjaCBwYWNrZXRzLCBzaW5jZSB0aGlzIGJlaGF2aW91ciBtYXkgYmVjb21lCisgICAgICogYWx3YXlzIGVuYWJsZWQgaW4gdGhlIGZ1dHVyZSAodGhlbiB0aGlzIG9wdGlvbiB3aWxsIGJlIGRlcHJlY2F0ZWQgYW5kCisgICAgICogbGF0ZXIgcmVtb3ZlZCkuIFRvIGF2b2lkIEFCSSBpc3N1ZXMgd2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBjYWxsZXJzIHNob3VsZAorICAgICAqIHVzZSBBVk9wdGlvbnMgdG8gc2V0IHRoaXMgZmllbGQuCisgICAgICovCisgICAgaW50IHNpZGVfZGF0YV9vbmx5X3BhY2tldHM7CisKKyAgICAvKioKKyAgICAgKiBBdWRpbyBvbmx5LiBUaGUgbnVtYmVyIG9mICJwcmltaW5nIiBzYW1wbGVzIChwYWRkaW5nKSBpbnNlcnRlZCBieSB0aGUKKyAgICAgKiBlbmNvZGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvLiBJLmUuIHRoaXMgbnVtYmVyIG9mIGxlYWRpbmcKKyAgICAgKiBkZWNvZGVkIHNhbXBsZXMgbXVzdCBiZSBkaXNjYXJkZWQgYnkgdGhlIGNhbGxlciB0byBnZXQgdGhlIG9yaWdpbmFsIGF1ZGlvCisgICAgICogd2l0aG91dCBsZWFkaW5nIHBhZGRpbmcuCisgICAgICoKKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYy4gVGhlIHRpbWVzdGFtcHMgb24gdGhlIG91dHB1dCBwYWNrZXRzIGFyZQorICAgICAqICAgICAgICAgICAgIGFkanVzdGVkIGJ5IHRoZSBlbmNvZGVyIHNvIHRoYXQgdGhleSBhbHdheXMgcmVmZXIgdG8gdGhlCisgICAgICogICAgICAgICAgICAgZmlyc3Qgc2FtcGxlIG9mIHRoZSBkYXRhIGFjdHVhbGx5IGNvbnRhaW5lZCBpbiB0aGUgcGFja2V0LAorICAgICAqICAgICAgICAgICAgIGluY2x1ZGluZyBhbnkgYWRkZWQgcGFkZGluZy4gIEUuZy4gaWYgdGhlIHRpbWViYXNlIGlzCisgICAgICogICAgICAgICAgICAgMS9zYW1wbGVyYXRlIGFuZCB0aGUgdGltZXN0YW1wIG9mIHRoZSBmaXJzdCBpbnB1dCBzYW1wbGUgaXMKKyAgICAgKiAgICAgICAgICAgICAwLCB0aGUgdGltZXN0YW1wIG9mIHRoZSBmaXJzdCBvdXRwdXQgcGFja2V0IHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAtaW5pdGlhbF9wYWRkaW5nLgorICAgICAqLworICAgIGludCBpbml0aWFsX3BhZGRpbmc7CisKKyAgICAvKioKKyAgICAgKiAtIGRlY29kaW5nOiBGb3IgY29kZWNzIHRoYXQgc3RvcmUgYSBmcmFtZXJhdGUgdmFsdWUgaW4gdGhlIGNvbXByZXNzZWQKKyAgICAgKiAgICAgICAgICAgICBiaXRzdHJlYW0sIHRoZSBkZWNvZGVyIG1heSBleHBvcnQgaXQgaGVyZS4geyAwLCAxfSB3aGVuCisgICAgICogICAgICAgICAgICAgdW5rbm93bi4KKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZTsKKworICAgIC8qKgorICAgICAqIFRpbWViYXNlIGluIHdoaWNoIHBrdF9kdHMvcHRzIGFuZCBBVlBhY2tldC5kdHMvcHRzIGFyZS4KKyAgICAgKiBDb2RlIG91dHNpZGUgbGliYXZjb2RlYyBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmc6CisgICAgICogYXZfY29kZWNfe2dldCxzZXR9X3BrdF90aW1lYmFzZShhdmN0eCkKKyAgICAgKiAtIGVuY29kaW5nIHVudXNlZC4KKyAgICAgKiAtIGRlY29kaW5nIHNldCBieSB1c2VyLgorICAgICAqLworICAgIEFWUmF0aW9uYWwgcGt0X3RpbWViYXNlOworCisgICAgLyoqCisgICAgICogQVZDb2RlY0Rlc2NyaXB0b3IKKyAgICAgKiBDb2RlIG91dHNpZGUgbGliYXZjb2RlYyBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmc6CisgICAgICogYXZfY29kZWNfe2dldCxzZXR9X2NvZGVjX2Rlc2NyaXB0b3IoYXZjdHgpCisgICAgICogLSBlbmNvZGluZzogdW51c2VkLgorICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSBsaWJhdmNvZGVjLgorICAgICAqLworICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpjb2RlY19kZXNjcmlwdG9yOworCisjaWYgIUZGX0FQSV9MT1dSRVMKKyAgICAvKioKKyAgICAgKiBsb3cgcmVzb2x1dGlvbiBkZWNvZGluZywgMS0+IDEvMiBzaXplLCAyLT4xLzQgc2l6ZQorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIENvZGUgb3V0c2lkZSBsaWJhdmNvZGVjIHNob3VsZCBhY2Nlc3MgdGhpcyBmaWVsZCB1c2luZzoKKyAgICAgKiBhdl9jb2RlY197Z2V0LHNldH1fbG93cmVzKGF2Y3R4KQorICAgICAqLworICAgICBpbnQgbG93cmVzOworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IHN0YXRpc3RpY3MgZm9yIFBUUyBjb3JyZWN0aW9uLgorICAgICAqIC0gZGVjb2Rpbmc6IG1haW50YWluZWQgYW5kIHVzZWQgYnkgbGliYXZjb2RlYywgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdXNlciBhcHBzCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50NjRfdCBwdHNfY29ycmVjdGlvbl9udW1fZmF1bHR5X3B0czsgLy8vIE51bWJlciBvZiBpbmNvcnJlY3QgUFRTIHZhbHVlcyBzbyBmYXIKKyAgICBpbnQ2NF90IHB0c19jb3JyZWN0aW9uX251bV9mYXVsdHlfZHRzOyAvLy8gTnVtYmVyIG9mIGluY29ycmVjdCBEVFMgdmFsdWVzIHNvIGZhcgorICAgIGludDY0X3QgcHRzX2NvcnJlY3Rpb25fbGFzdF9wdHM7ICAgICAgIC8vLyBQVFMgb2YgdGhlIGxhc3QgZnJhbWUKKyAgICBpbnQ2NF90IHB0c19jb3JyZWN0aW9uX2xhc3RfZHRzOyAgICAgICAvLy8gRFRTIG9mIHRoZSBsYXN0IGZyYW1lCisKKyAgICAvKioKKyAgICAgKiBDaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIGlucHV0IHN1YnRpdGxlcyBmaWxlLgorICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSB1c2VyCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICovCisgICAgY2hhciAqc3ViX2NoYXJlbmM7CisKKyAgICAvKioKKyAgICAgKiBTdWJ0aXRsZXMgY2hhcmFjdGVyIGVuY29kaW5nIG1vZGUuIEZvcm1hdHMgb3IgY29kZWNzIG1pZ2h0IGJlIGFkanVzdGluZworICAgICAqIHRoaXMgc2V0dGluZyAoaWYgdGhleSBhcmUgZG9pbmcgdGhlIGNvbnZlcnNpb24gdGhlbXNlbHZlcyBmb3IgaW5zdGFuY2UpLgorICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSBsaWJhdmNvZGVjCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IHN1Yl9jaGFyZW5jX21vZGU7CisjZGVmaW5lIEZGX1NVQl9DSEFSRU5DX01PREVfRE9fTk9USElORyAgLTEgIC8vLzwgZG8gbm90aGluZyAoZGVtdXhlciBvdXRwdXRzIGEgc3RyZWFtIHN1cHBvc2VkIHRvIGJlIGFscmVhZHkgaW4gVVRGLTgsIG9yIHRoZSBjb2RlYyBpcyBiaXRtYXAgZm9yIGluc3RhbmNlKQorI2RlZmluZSBGRl9TVUJfQ0hBUkVOQ19NT0RFX0FVVE9NQVRJQyAgICAwICAvLy88IGxpYmF2Y29kZWMgd2lsbCBzZWxlY3QgdGhlIG1vZGUgaXRzZWxmCisjZGVmaW5lIEZGX1NVQl9DSEFSRU5DX01PREVfUFJFX0RFQ09ERVIgIDEgIC8vLzwgdGhlIEFWUGFja2V0IGRhdGEgbmVlZHMgdG8gYmUgcmVjb2RlZCB0byBVVEYtOCBiZWZvcmUgYmVpbmcgZmVkIHRvIHRoZSBkZWNvZGVyLCByZXF1aXJlcyBpY29udgorCisgICAgLyoqCisgICAgICogU2tpcCBwcm9jZXNzaW5nIGFscGhhIGlmIHN1cHBvcnRlZCBieSBjb2RlYy4KKyAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIGZvcm1hdCB1c2VzIHByZS1tdWx0aXBsaWVkIGFscGhhIChjb21tb24gd2l0aCBWUDYsCisgICAgICogYW5kIHJlY29tbWVuZGVkIGR1ZSB0byBiZXR0ZXIgdmlkZW8gcXVhbGl0eS9jb21wcmVzc2lvbikKKyAgICAgKiB0aGUgaW1hZ2Ugd2lsbCBsb29rIGFzIGlmIGFscGhhLWJsZW5kZWQgb250byBhIGJsYWNrIGJhY2tncm91bmQuCisgICAgICogSG93ZXZlciBmb3IgZm9ybWF0cyB0aGF0IGRvIG5vdCB1c2UgcHJlLW11bHRpcGxpZWQgYWxwaGEKKyAgICAgKiB0aGVyZSBtaWdodCBiZSBzZXJpb3VzIGFydGVmYWN0cyAodGhvdWdoIGUuZy4gbGlic3dzY2FsZSBjdXJyZW50bHkKKyAgICAgKiBhc3N1bWVzIHByZS1tdWx0aXBsaWVkIGFscGhhIGFueXdheSkuCisgICAgICogQ29kZSBvdXRzaWRlIGxpYmF2Y29kZWMgc2hvdWxkIGFjY2VzcyB0aGlzIGZpZWxkIHVzaW5nIEFWT3B0aW9ucworICAgICAqCisgICAgICogLSBkZWNvZGluZzogc2V0IGJ5IHVzZXIKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgc2tpcF9hbHBoYTsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBzYW1wbGVzIHRvIHNraXAgYWZ0ZXIgYSBkaXNjb250aW51aXR5CisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICogLSBlbmNvZGluZzogc2V0IGJ5IGxpYmF2Y29kZWMKKyAgICAgKi8KKyAgICBpbnQgc2Vla19wcmVyb2xsOworCisjaWYgIUZGX0FQSV9ERUJVR19NVgorICAgIC8qKgorICAgICAqIGRlYnVnIG1vdGlvbiB2ZWN0b3JzCisgICAgICogQ29kZSBvdXRzaWRlIGxpYmF2Y29kZWMgc2hvdWxkIGFjY2VzcyB0aGlzIGZpZWxkIHVzaW5nIEFWT3B0aW9ucworICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqLworICAgIGludCBkZWJ1Z19tdjsKKyNkZWZpbmUgRkZfREVCVUdfVklTX01WX1BfRk9SICAweDAwMDAwMDAxIC8vdmlzdWFsaXplIGZvcndhcmQgcHJlZGljdGVkIE1WcyBvZiBQIGZyYW1lcworI2RlZmluZSBGRl9ERUJVR19WSVNfTVZfQl9GT1IgIDB4MDAwMDAwMDIgLy92aXN1YWxpemUgZm9yd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIEIgZnJhbWVzCisjZGVmaW5lIEZGX0RFQlVHX1ZJU19NVl9CX0JBQ0sgMHgwMDAwMDAwNCAvL3Zpc3VhbGl6ZSBiYWNrd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIEIgZnJhbWVzCisjZW5kaWYKKworICAgIC8qKgorICAgICAqIGN1c3RvbSBpbnRyYSBxdWFudGl6YXRpb24gbWF0cml4CisgICAgICogQ29kZSBvdXRzaWRlIGxpYmF2Y29kZWMgc2hvdWxkIGFjY2VzcyB0aGlzIGZpZWxkIHVzaW5nIGF2X2NvZGVjX2cvc2V0X2Nocm9tYV9pbnRyYV9tYXRyaXgoKQorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLCBjYW4gYmUgTlVMTC4KKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQuCisgICAgICovCisgICAgdWludDE2X3QgKmNocm9tYV9pbnRyYV9tYXRyaXg7CisKKyAgICAvKioKKyAgICAgKiBkdW1wIGZvcm1hdCBzZXBhcmF0b3IuCisgICAgICogY2FuIGJlICIsICIgb3IgIlxuICAgICAgIiBvciBhbnl0aGluZyBlbHNlCisgICAgICogQ29kZSBvdXRzaWRlIGxpYmF2Y29kZWMgc2hvdWxkIGFjY2VzcyB0aGlzIGZpZWxkIHVzaW5nIEFWT3B0aW9ucworICAgICAqIChOTyBkaXJlY3QgYWNjZXNzKS4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICB1aW50OF90ICpkdW1wX3NlcGFyYXRvcjsKKworICAgIC8qKgorICAgICAqICcsJyBzZXBhcmF0ZWQgbGlzdCBvZiBhbGxvd2VkIGRlY29kZXJzLgorICAgICAqIElmIE5VTEwgdGhlbiBhbGwgYXJlIGFsbG93ZWQKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgdXNlciB0aHJvdWdoIEFWT1B0aW9ucyAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKi8KKyAgICBjaGFyICpjb2RlY193aGl0ZWxpc3Q7Cit9IEFWQ29kZWNDb250ZXh0OworCitBVlJhdGlvbmFsIGF2X2NvZGVjX2dldF9wa3RfdGltZWJhc2UgICAgICAgICAoY29uc3QgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK3ZvaWQgICAgICAgYXZfY29kZWNfc2V0X3BrdF90aW1lYmFzZSAgICAgICAgIChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUmF0aW9uYWwgdmFsKTsKKworY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmF2X2NvZGVjX2dldF9jb2RlY19kZXNjcmlwdG9yKGNvbnN0IEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cit2b2lkICAgICAgICAgICAgICAgICAgICAgYXZfY29kZWNfc2V0X2NvZGVjX2Rlc2NyaXB0b3IoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqZGVzYyk7CisKK2ludCAgYXZfY29kZWNfZ2V0X2xvd3Jlcyhjb25zdCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBhdl9jb2RlY19zZXRfbG93cmVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IHZhbCk7CisKK2ludCAgYXZfY29kZWNfZ2V0X3NlZWtfcHJlcm9sbChjb25zdCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBhdl9jb2RlY19zZXRfc2Vla19wcmVyb2xsKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IHZhbCk7CisKK3VpbnQxNl90ICphdl9jb2RlY19nZXRfY2hyb21hX2ludHJhX21hdHJpeChjb25zdCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBhdl9jb2RlY19zZXRfY2hyb21hX2ludHJhX21hdHJpeChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQxNl90ICp2YWwpOworCisvKioKKyAqIEFWUHJvZmlsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZQcm9maWxlIHsKKyAgICBpbnQgcHJvZmlsZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOyAvLy88IHNob3J0IG5hbWUgZm9yIHRoZSBwcm9maWxlCit9IEFWUHJvZmlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgQVZDb2RlY0RlZmF1bHQgQVZDb2RlY0RlZmF1bHQ7CisKK3N0cnVjdCBBVlN1YnRpdGxlOworCisvKioKKyAqIEFWQ29kZWMuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWQ29kZWMgeworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGNvZGVjIGltcGxlbWVudGF0aW9uLgorICAgICAqIFRoZSBuYW1lIGlzIGdsb2JhbGx5IHVuaXF1ZSBhbW9uZyBlbmNvZGVycyBhbmQgYW1vbmcgZGVjb2RlcnMgKGJ1dCBhbgorICAgICAqIGVuY29kZXIgYW5kIGEgZGVjb2RlciBjYW4gc2hhcmUgdGhlIHNhbWUgbmFtZSkuCisgICAgICogVGhpcyBpcyB0aGUgcHJpbWFyeSB3YXkgdG8gZmluZCBhIGNvZGVjIGZyb20gdGhlIHVzZXIgcGVyc3BlY3RpdmUuCisgICAgICovCisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGUgY29kZWMsIG1lYW50IHRvIGJlIG1vcmUgaHVtYW4gcmVhZGFibGUgdGhhbiBuYW1lLgorICAgICAqIFlvdSBzaG91bGQgdXNlIHRoZSBOVUxMX0lGX0NPTkZJR19TTUFMTCgpIG1hY3JvIHRvIGRlZmluZSBpdC4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpsb25nX25hbWU7CisgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlOworICAgIGVudW0gQVZDb2RlY0lEIGlkOworICAgIC8qKgorICAgICAqIENvZGVjIGNhcGFiaWxpdGllcy4KKyAgICAgKiBzZWUgQ09ERUNfQ0FQXyoKKyAgICAgKi8KKyAgICBpbnQgY2FwYWJpbGl0aWVzOworICAgIGNvbnN0IEFWUmF0aW9uYWwgKnN1cHBvcnRlZF9mcmFtZXJhdGVzOyAvLy88IGFycmF5IG9mIHN1cHBvcnRlZCBmcmFtZXJhdGVzLCBvciBOVUxMIGlmIGFueSwgYXJyYXkgaXMgdGVybWluYXRlZCBieSB7MCwwfQorICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcGl4X2ZtdHM7ICAgICAvLy88IGFycmF5IG9mIHN1cHBvcnRlZCBwaXhlbCBmb3JtYXRzLCBvciBOVUxMIGlmIHVua25vd24sIGFycmF5IGlzIHRlcm1pbmF0ZWQgYnkgLTEKKyAgICBjb25zdCBpbnQgKnN1cHBvcnRlZF9zYW1wbGVyYXRlczsgICAgICAgLy8vPCBhcnJheSBvZiBzdXBwb3J0ZWQgYXVkaW8gc2FtcGxlcmF0ZXMsIG9yIE5VTEwgaWYgdW5rbm93biwgYXJyYXkgaXMgdGVybWluYXRlZCBieSAwCisgICAgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCAqc2FtcGxlX2ZtdHM7IC8vLzwgYXJyYXkgb2Ygc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXRzLCBvciBOVUxMIGlmIHVua25vd24sIGFycmF5IGlzIHRlcm1pbmF0ZWQgYnkgLTEKKyAgICBjb25zdCB1aW50NjRfdCAqY2hhbm5lbF9sYXlvdXRzOyAgICAgICAgIC8vLzwgYXJyYXkgb2Ygc3VwcG9ydCBjaGFubmVsIGxheW91dHMsIG9yIE5VTEwgaWYgdW5rbm93bi4gYXJyYXkgaXMgdGVybWluYXRlZCBieSAwCisjaWYgRkZfQVBJX0xPV1JFUworICAgIHVpbnQ4X3QgbWF4X2xvd3JlczsgICAgICAgICAgICAgICAgICAgICAvLy88IG1heGltdW0gdmFsdWUgZm9yIGxvd3JlcyBzdXBwb3J0ZWQgYnkgdGhlIGRlY29kZXIsIG5vIGRpcmVjdCBhY2Nlc3MsIHVzZSBhdl9jb2RlY19nZXRfbWF4X2xvd3JlcygpCisjZW5kaWYKKyAgICBjb25zdCBBVkNsYXNzICpwcml2X2NsYXNzOyAgICAgICAgICAgICAgLy8vPCBBVkNsYXNzIGZvciB0aGUgcHJpdmF0ZSBjb250ZXh0CisgICAgY29uc3QgQVZQcm9maWxlICpwcm9maWxlczsgICAgICAgICAgICAgIC8vLzwgYXJyYXkgb2YgcmVjb2duaXplZCBwcm9maWxlcywgb3IgTlVMTCBpZiB1bmtub3duLCBhcnJheSBpcyB0ZXJtaW5hdGVkIGJ5IHtGRl9QUk9GSUxFX1VOS05PV059CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBObyBmaWVsZHMgYmVsb3cgdGhpcyBsaW5lIGFyZSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLiBUaGV5CisgICAgICogbWF5IG5vdCBiZSB1c2VkIG91dHNpZGUgb2YgbGliYXZjb2RlYyBhbmQgY2FuIGJlIGNoYW5nZWQgYW5kCisgICAgICogcmVtb3ZlZCBhdCB3aWxsLgorICAgICAqIE5ldyBwdWJsaWMgZmllbGRzIHNob3VsZCBiZSBhZGRlZCByaWdodCBhYm92ZS4KKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKyAgICBpbnQgcHJpdl9kYXRhX3NpemU7CisgICAgc3RydWN0IEFWQ29kZWMgKm5leHQ7CisgICAgLyoqCisgICAgICogQG5hbWUgRnJhbWUtbGV2ZWwgdGhyZWFkaW5nIHN1cHBvcnQgZnVuY3Rpb25zCisgICAgICogQHsKKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBJZiBkZWZpbmVkLCBjYWxsZWQgb24gdGhyZWFkIGNvbnRleHRzIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4KKyAgICAgKiBJZiB0aGUgY29kZWMgYWxsb2NhdGVzIHdyaXRhYmxlIHRhYmxlcyBpbiBpbml0KCksIHJlLWFsbG9jYXRlIHRoZW0gaGVyZS4KKyAgICAgKiBwcml2X2RhdGEgd2lsbCBiZSBzZXQgdG8gYSBjb3B5IG9mIHRoZSBvcmlnaW5hbC4KKyAgICAgKi8KKyAgICBpbnQgKCppbml0X3RocmVhZF9jb3B5KShBVkNvZGVjQ29udGV4dCAqKTsKKyAgICAvKioKKyAgICAgKiBDb3B5IG5lY2Vzc2FyeSBjb250ZXh0IHZhcmlhYmxlcyBmcm9tIGEgcHJldmlvdXMgdGhyZWFkIGNvbnRleHQgdG8gdGhlIGN1cnJlbnQgb25lLgorICAgICAqIElmIG5vdCBkZWZpbmVkLCB0aGUgbmV4dCB0aHJlYWQgd2lsbCBzdGFydCBhdXRvbWF0aWNhbGx5OyBvdGhlcndpc2UsIHRoZSBjb2RlYworICAgICAqIG11c3QgY2FsbCBmZl90aHJlYWRfZmluaXNoX3NldHVwKCkuCisgICAgICoKKyAgICAgKiBkc3QgYW5kIHNyYyB3aWxsIChyYXJlbHkpIHBvaW50IHRvIHRoZSBzYW1lIGNvbnRleHQsIGluIHdoaWNoIGNhc2UgbWVtY3B5IHNob3VsZCBiZSBza2lwcGVkLgorICAgICAqLworICAgIGludCAoKnVwZGF0ZV90aHJlYWRfY29udGV4dCkoQVZDb2RlY0NvbnRleHQgKmRzdCwgY29uc3QgQVZDb2RlY0NvbnRleHQgKnNyYyk7CisgICAgLyoqIEB9ICovCisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvZGVjLXNwZWNpZmljIGRlZmF1bHRzLgorICAgICAqLworICAgIGNvbnN0IEFWQ29kZWNEZWZhdWx0ICpkZWZhdWx0czsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgY29kZWMgc3RhdGljIGRhdGEsIGNhbGxlZCBmcm9tIGF2Y29kZWNfcmVnaXN0ZXIoKS4KKyAgICAgKi8KKyAgICB2b2lkICgqaW5pdF9zdGF0aWNfZGF0YSkoc3RydWN0IEFWQ29kZWMgKmNvZGVjKTsKKworICAgIGludCAoKmluaXQpKEFWQ29kZWNDb250ZXh0ICopOworICAgIGludCAoKmVuY29kZV9zdWIpKEFWQ29kZWNDb250ZXh0ICosIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBBVlN1YnRpdGxlICpzdWIpOworICAgIC8qKgorICAgICAqIEVuY29kZSBkYXRhIHRvIGFuIEFWUGFja2V0LgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgYXZjdHggICAgICAgICAgY29kZWMgY29udGV4dAorICAgICAqIEBwYXJhbSAgICAgIGF2cGt0ICAgICAgICAgIG91dHB1dCBBVlBhY2tldCAobWF5IGNvbnRhaW4gYSB1c2VyLXByb3ZpZGVkIGJ1ZmZlcikKKyAgICAgKiBAcGFyYW1baW5dICBmcmFtZSAgICAgICAgICBBVkZyYW1lIGNvbnRhaW5pbmcgdGhlIHJhdyBkYXRhIHRvIGJlIGVuY29kZWQKKyAgICAgKiBAcGFyYW1bb3V0XSBnb3RfcGFja2V0X3B0ciBlbmNvZGVyIHNldHMgdG8gMCBvciAxIHRvIGluZGljYXRlIHRoYXQgYQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1lbXB0eSBwYWNrZXQgd2FzIHJldHVybmVkIGluIGF2cGt0LgorICAgICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBpbnQgKCplbmNvZGUyKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwgY29uc3QgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfcGFja2V0X3B0cik7CisgICAgaW50ICgqZGVjb2RlKShBVkNvZGVjQ29udGV4dCAqLCB2b2lkICpvdXRkYXRhLCBpbnQgKm91dGRhdGFfc2l6ZSwgQVZQYWNrZXQgKmF2cGt0KTsKKyAgICBpbnQgKCpjbG9zZSkoQVZDb2RlY0NvbnRleHQgKik7CisgICAgLyoqCisgICAgICogRmx1c2ggYnVmZmVycy4KKyAgICAgKiBXaWxsIGJlIGNhbGxlZCB3aGVuIHNlZWtpbmcKKyAgICAgKi8KKyAgICB2b2lkICgqZmx1c2gpKEFWQ29kZWNDb250ZXh0ICopOworfSBBVkNvZGVjOworCitpbnQgYXZfY29kZWNfZ2V0X21heF9sb3dyZXMoY29uc3QgQVZDb2RlYyAqY29kZWMpOworCitzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQ7CisKKy8qKgorICogQGRlZmdyb3VwIGxhdmNfaHdhY2NlbCBBVkhXQWNjZWwKKyAqIEB7CisgKi8KK3R5cGVkZWYgc3RydWN0IEFWSFdBY2NlbCB7CisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgY29kZWMuCisgICAgICogVGhlIG5hbWUgaXMgZ2xvYmFsbHkgdW5pcXVlIGFtb25nIGVuY29kZXJzIGFuZCBhbW9uZyBkZWNvZGVycyAoYnV0IGFuCisgICAgICogZW5jb2RlciBhbmQgYSBkZWNvZGVyIGNhbiBzaGFyZSB0aGUgc2FtZSBuYW1lKS4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgLyoqCisgICAgICogVHlwZSBvZiBjb2RlYyBpbXBsZW1lbnRlZCBieSB0aGUgaGFyZHdhcmUgYWNjZWxlcmF0b3IuCisgICAgICoKKyAgICAgKiBTZWUgQVZNRURJQV9UWVBFX3h4eAorICAgICAqLworICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZTsKKworICAgIC8qKgorICAgICAqIENvZGVjIGltcGxlbWVudGVkIGJ5IHRoZSBoYXJkd2FyZSBhY2NlbGVyYXRvci4KKyAgICAgKgorICAgICAqIFNlZSBBVl9DT0RFQ19JRF94eHgKKyAgICAgKi8KKyAgICBlbnVtIEFWQ29kZWNJRCBpZDsKKworICAgIC8qKgorICAgICAqIFN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuCisgICAgICoKKyAgICAgKiBPbmx5IGhhcmR3YXJlIGFjY2VsZXJhdGVkIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCBoZXJlLgorICAgICAqLworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworCisgICAgLyoqCisgICAgICogSGFyZHdhcmUgYWNjZWxlcmF0ZWQgY29kZWMgY2FwYWJpbGl0aWVzLgorICAgICAqIHNlZSBGRl9IV0FDQ0VMX0NPREVDX0NBUF8qCisgICAgICovCisgICAgaW50IGNhcGFiaWxpdGllczsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIE5vIGZpZWxkcyBiZWxvdyB0aGlzIGxpbmUgYXJlIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuIFRoZXkKKyAgICAgKiBtYXkgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiBsaWJhdmNvZGVjIGFuZCBjYW4gYmUgY2hhbmdlZCBhbmQKKyAgICAgKiByZW1vdmVkIGF0IHdpbGwuCisgICAgICogTmV3IHB1YmxpYyBmaWVsZHMgc2hvdWxkIGJlIGFkZGVkIHJpZ2h0IGFib3ZlLgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworICAgIHN0cnVjdCBBVkhXQWNjZWwgKm5leHQ7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIGN1c3RvbSBidWZmZXIKKyAgICAgKi8KKyAgICBpbnQgKCphbGxvY19mcmFtZSkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGZyYW1lIG9yIGZpZWxkIHBpY3R1cmUuCisgICAgICoKKyAgICAgKiBNZWFuaW5nZnVsIGZyYW1lIGluZm9ybWF0aW9uIChjb2RlYyBzcGVjaWZpYykgaXMgZ3VhcmFudGVlZCB0bworICAgICAqIGJlIHBhcnNlZCBhdCB0aGlzIHBvaW50LiBUaGlzIGZ1bmN0aW9uIGlzIG1hbmRhdG9yeS4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCBidWYgY2FuIGJlIE5VTEwgYWxvbmcgd2l0aCBidWZfc2l6ZSBzZXQgdG8gMC4KKyAgICAgKiBPdGhlcndpc2UsIHRoaXMgbWVhbnMgdGhlIHdob2xlIGZyYW1lIGlzIGF2YWlsYWJsZSBhdCB0aGlzIHBvaW50LgorICAgICAqCisgICAgICogQHBhcmFtIGF2Y3R4IHRoZSBjb2RlYyBjb250ZXh0CisgICAgICogQHBhcmFtIGJ1ZiB0aGUgZnJhbWUgZGF0YSBidWZmZXIgYmFzZQorICAgICAqIEBwYXJhbSBidWZfc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgaW4gYnl0ZXMKKyAgICAgKiBAcmV0dXJuIHplcm8gaWYgc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBpbnQgKCpzdGFydF9mcmFtZSkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9zaXplKTsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZvciBlYWNoIHNsaWNlLgorICAgICAqCisgICAgICogTWVhbmluZ2Z1bCBzbGljZSBpbmZvcm1hdGlvbiAoY29kZWMgc3BlY2lmaWMpIGlzIGd1YXJhbnRlZWQgdG8KKyAgICAgKiBiZSBwYXJzZWQgYXQgdGhpcyBwb2ludC4gVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkuCisgICAgICogVGhlIG9ubHkgZXhjZXB0aW9uIGlzIFh2TUMsIHRoYXQgd29ya3Mgb24gTUIgbGV2ZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXZjdHggdGhlIGNvZGVjIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gYnVmIHRoZSBzbGljZSBkYXRhIGJ1ZmZlciBiYXNlCisgICAgICogQHBhcmFtIGJ1Zl9zaXplIHRoZSBzaXplIG9mIHRoZSBzbGljZSBpbiBieXRlcworICAgICAqIEByZXR1cm4gemVybyBpZiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZQorICAgICAqLworICAgIGludCAoKmRlY29kZV9zbGljZSkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9zaXplKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggZnJhbWUgb3IgZmllbGQgcGljdHVyZS4KKyAgICAgKgorICAgICAqIFRoZSB3aG9sZSBwaWN0dXJlIGlzIHBhcnNlZCBhdCB0aGlzIHBvaW50IGFuZCBjYW4gbm93IGJlIHNlbnQKKyAgICAgKiB0byB0aGUgaGFyZHdhcmUgYWNjZWxlcmF0b3IuIFRoaXMgZnVuY3Rpb24gaXMgbWFuZGF0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIGF2Y3R4IHRoZSBjb2RlYyBjb250ZXh0CisgICAgICogQHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlCisgICAgICovCisgICAgaW50ICgqZW5kX2ZyYW1lKShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisgICAgLyoqCisgICAgICogU2l6ZSBvZiBwZXItZnJhbWUgaGFyZHdhcmUgYWNjZWxlcmF0b3IgcHJpdmF0ZSBkYXRhLgorICAgICAqCisgICAgICogUHJpdmF0ZSBkYXRhIGlzIGFsbG9jYXRlZCB3aXRoIGF2X21hbGxvY3ooKSBiZWZvcmUKKyAgICAgKiBBVkNvZGVjQ29udGV4dC5nZXRfYnVmZmVyKCkgYW5kIGRlYWxsb2NhdGVkIGFmdGVyCisgICAgICogQVZDb2RlY0NvbnRleHQucmVsZWFzZV9idWZmZXIoKS4KKyAgICAgKi8KKyAgICBpbnQgZnJhbWVfcHJpdl9kYXRhX3NpemU7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgZm9yIGV2ZXJ5IE1hY3JvYmxvY2sgaW4gYSBzbGljZS4KKyAgICAgKgorICAgICAqIFh2TUMgdXNlcyBpdCB0byByZXBsYWNlIHRoZSBmZl9tcHZfZGVjb2RlX21iKCkuCisgICAgICogSW5zdGVhZCBvZiBkZWNvZGluZyB0byByYXcgcGljdHVyZSwgTUIgcGFyYW1ldGVycyBhcmUKKyAgICAgKiBzdG9yZWQgaW4gYW4gYXJyYXkgcHJvdmlkZWQgYnkgdGhlIHZpZGVvIGRyaXZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBtcGVnIGNvbnRleHQKKyAgICAgKi8KKyAgICB2b2lkICgqZGVjb2RlX21iKShzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgaHdhY2NlbCBwcml2YXRlIGRhdGEuCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGZyb20gZmZfZ2V0X2Zvcm1hdCgpLCBhZnRlciBod2FjY2VsIGFuZAorICAgICAqIGh3YWNjZWxfY29udGV4dCBhcmUgc2V0IGFuZCB0aGUgaHdhY2NlbCBwcml2YXRlIGRhdGEgaW4gQVZDb2RlY0ludGVybmFsCisgICAgICogaXMgYWxsb2NhdGVkLgorICAgICAqLworICAgIGludCAoKmluaXQpKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKyAgICAvKioKKyAgICAgKiBVbmluaXRpYWxpemUgdGhlIGh3YWNjZWwgcHJpdmF0ZSBkYXRhLgorICAgICAqCisgICAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCBmcm9tIGdldF9mb3JtYXQoKSBvciBhdmNvZGVjX2Nsb3NlKCksIGFmdGVyIGh3YWNjZWwKKyAgICAgKiBhbmQgaHdhY2NlbF9jb250ZXh0IGFyZSBhbHJlYWR5IHVuaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgaW50ICgqdW5pbml0KShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisgICAgLyoqCisgICAgICogU2l6ZSBvZiB0aGUgcHJpdmF0ZSBkYXRhIHRvIGFsbG9jYXRlIGluCisgICAgICogQVZDb2RlY0ludGVybmFsLmh3YWNjZWxfcHJpdl9kYXRhLgorICAgICAqLworICAgIGludCBwcml2X2RhdGFfc2l6ZTsKK30gQVZIV0FjY2VsOworCisvKioKKyAqIEhhcmR3YXJlIGFjY2VsZXJhdGlvbiBzaG91bGQgYmUgdXNlZCBmb3IgZGVjb2RpbmcgZXZlbiBpZiB0aGUgY29kZWMgbGV2ZWwKKyAqIHVzZWQgaXMgdW5rbm93biBvciBoaWdoZXIgdGhhbiB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgbGV2ZWwgcmVwb3J0ZWQgYnkgdGhlCisgKiBoYXJkd2FyZSBkcml2ZXIuCisgKi8KKyNkZWZpbmUgQVZfSFdBQ0NFTF9GTEFHX0lHTk9SRV9MRVZFTCAoMSA8PCAwKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2Y19waWN0dXJlIEFWUGljdHVyZQorICoKKyAqIEZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIEFWUGljdHVyZQorICogQHsKKyAqLworCisvKioKKyAqIFBpY3R1cmUgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogVXAgdG8gZm91ciBjb21wb25lbnRzIGNhbiBiZSBzdG9yZWQgaW50byBpdCwgdGhlIGxhc3QgY29tcG9uZW50IGlzCisgKiBhbHBoYS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZQaWN0dXJlIHsKKyAgICB1aW50OF90ICpkYXRhW0FWX05VTV9EQVRBX1BPSU5URVJTXTsgICAgLy8vPCBwb2ludGVycyB0byB0aGUgaW1hZ2UgZGF0YSBwbGFuZXMKKyAgICBpbnQgbGluZXNpemVbQVZfTlVNX0RBVEFfUE9JTlRFUlNdOyAgICAgLy8vPCBudW1iZXIgb2YgYnl0ZXMgcGVyIGxpbmUKK30gQVZQaWN0dXJlOworCisvKioKKyAqIEB9CisgKi8KKworZW51bSBBVlN1YnRpdGxlVHlwZSB7CisgICAgU1VCVElUTEVfTk9ORSwKKworICAgIFNVQlRJVExFX0JJVE1BUCwgICAgICAgICAgICAgICAgLy8vPCBBIGJpdG1hcCwgcGljdCB3aWxsIGJlIHNldAorCisgICAgLyoqCisgICAgICogUGxhaW4gdGV4dCwgdGhlIHRleHQgZmllbGQgbXVzdCBiZSBzZXQgYnkgdGhlIGRlY29kZXIgYW5kIGlzCisgICAgICogYXV0aG9yaXRhdGl2ZS4gYXNzIGFuZCBwaWN0IGZpZWxkcyBtYXkgY29udGFpbiBhcHByb3hpbWF0aW9ucy4KKyAgICAgKi8KKyAgICBTVUJUSVRMRV9URVhULAorCisgICAgLyoqCisgICAgICogRm9ybWF0dGVkIHRleHQsIHRoZSBhc3MgZmllbGQgbXVzdCBiZSBzZXQgYnkgdGhlIGRlY29kZXIgYW5kIGlzCisgICAgICogYXV0aG9yaXRhdGl2ZS4gcGljdCBhbmQgdGV4dCBmaWVsZHMgbWF5IGNvbnRhaW4gYXBwcm94aW1hdGlvbnMuCisgICAgICovCisgICAgU1VCVElUTEVfQVNTLAorfTsKKworI2RlZmluZSBBVl9TVUJUSVRMRV9GTEFHX0ZPUkNFRCAweDAwMDAwMDAxCisKK3R5cGVkZWYgc3RydWN0IEFWU3VidGl0bGVSZWN0IHsKKyAgICBpbnQgeDsgICAgICAgICAvLy88IHRvcCBsZWZ0IGNvcm5lciAgb2YgcGljdCwgdW5kZWZpbmVkIHdoZW4gcGljdCBpcyBub3Qgc2V0CisgICAgaW50IHk7ICAgICAgICAgLy8vPCB0b3AgbGVmdCBjb3JuZXIgIG9mIHBpY3QsIHVuZGVmaW5lZCB3aGVuIHBpY3QgaXMgbm90IHNldAorICAgIGludCB3OyAgICAgICAgIC8vLzwgd2lkdGggICAgICAgICAgICBvZiBwaWN0LCB1bmRlZmluZWQgd2hlbiBwaWN0IGlzIG5vdCBzZXQKKyAgICBpbnQgaDsgICAgICAgICAvLy88IGhlaWdodCAgICAgICAgICAgb2YgcGljdCwgdW5kZWZpbmVkIHdoZW4gcGljdCBpcyBub3Qgc2V0CisgICAgaW50IG5iX2NvbG9yczsgLy8vPCBudW1iZXIgb2YgY29sb3JzIGluIHBpY3QsIHVuZGVmaW5lZCB3aGVuIHBpY3QgaXMgbm90IHNldAorCisgICAgLyoqCisgICAgICogZGF0YStsaW5lc2l6ZSBmb3IgdGhlIGJpdG1hcCBvZiB0aGlzIHN1YnRpdGxlLgorICAgICAqIGNhbiBiZSBzZXQgZm9yIHRleHQvYXNzIGFzIHdlbGwgb25jZSB0aGV5IHdoZXJlIHJlbmRlcmVkCisgICAgICovCisgICAgQVZQaWN0dXJlIHBpY3Q7CisgICAgZW51bSBBVlN1YnRpdGxlVHlwZSB0eXBlOworCisgICAgY2hhciAqdGV4dDsgICAgICAgICAgICAgICAgICAgICAvLy88IDAgdGVybWluYXRlZCBwbGFpbiBVVEYtOCB0ZXh0CisKKyAgICAvKioKKyAgICAgKiAwIHRlcm1pbmF0ZWQgQVNTL1NTQSBjb21wYXRpYmxlIGV2ZW50IGxpbmUuCisgICAgICogVGhlIHByZXNlbnRhdGlvbiBvZiB0aGlzIGlzIHVuYWZmZWN0ZWQgYnkgdGhlIG90aGVyIHZhbHVlcyBpbiB0aGlzCisgICAgICogc3RydWN0LgorICAgICAqLworICAgIGNoYXIgKmFzczsKKworICAgIGludCBmbGFnczsKK30gQVZTdWJ0aXRsZVJlY3Q7CisKK3R5cGVkZWYgc3RydWN0IEFWU3VidGl0bGUgeworICAgIHVpbnQxNl90IGZvcm1hdDsgLyogMCA9IGdyYXBoaWNzICovCisgICAgdWludDMyX3Qgc3RhcnRfZGlzcGxheV90aW1lOyAvKiByZWxhdGl2ZSB0byBwYWNrZXQgcHRzLCBpbiBtcyAqLworICAgIHVpbnQzMl90IGVuZF9kaXNwbGF5X3RpbWU7IC8qIHJlbGF0aXZlIHRvIHBhY2tldCBwdHMsIGluIG1zICovCisgICAgdW5zaWduZWQgbnVtX3JlY3RzOworICAgIEFWU3VidGl0bGVSZWN0ICoqcmVjdHM7CisgICAgaW50NjRfdCBwdHM7ICAgIC8vLzwgU2FtZSBhcyBwYWNrZXQgcHRzLCBpbiBBVl9USU1FX0JBU0UKK30gQVZTdWJ0aXRsZTsKKworLyoqCisgKiBJZiBjIGlzIE5VTEwsIHJldHVybnMgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgY29kZWMsCisgKiBpZiBjIGlzIG5vbi1OVUxMLCByZXR1cm5zIHRoZSBuZXh0IHJlZ2lzdGVyZWQgY29kZWMgYWZ0ZXIgYywKKyAqIG9yIE5VTEwgaWYgYyBpcyB0aGUgbGFzdCBvbmUuCisgKi8KK0FWQ29kZWMgKmF2X2NvZGVjX25leHQoY29uc3QgQVZDb2RlYyAqYyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBMSUJBVkNPREVDX1ZFUlNJT05fSU5UIGNvbnN0YW50LgorICovCit1bnNpZ25lZCBhdmNvZGVjX3ZlcnNpb24odm9pZCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBsaWJhdmNvZGVjIGJ1aWxkLXRpbWUgY29uZmlndXJhdGlvbi4KKyAqLworY29uc3QgY2hhciAqYXZjb2RlY19jb25maWd1cmF0aW9uKHZvaWQpOworCisvKioKKyAqIFJldHVybiB0aGUgbGliYXZjb2RlYyBsaWNlbnNlLgorICovCitjb25zdCBjaGFyICphdmNvZGVjX2xpY2Vuc2Uodm9pZCk7CisKKy8qKgorICogUmVnaXN0ZXIgdGhlIGNvZGVjIGNvZGVjIGFuZCBpbml0aWFsaXplIGxpYmF2Y29kZWMuCisgKgorICogQHdhcm5pbmcgZWl0aGVyIHRoaXMgZnVuY3Rpb24gb3IgYXZjb2RlY19yZWdpc3Rlcl9hbGwoKSBtdXN0IGJlIGNhbGxlZAorICogYmVmb3JlIGFueSBvdGhlciBsaWJhdmNvZGVjIGZ1bmN0aW9ucy4KKyAqCisgKiBAc2VlIGF2Y29kZWNfcmVnaXN0ZXJfYWxsKCkKKyAqLwordm9pZCBhdmNvZGVjX3JlZ2lzdGVyKEFWQ29kZWMgKmNvZGVjKTsKKworLyoqCisgKiBSZWdpc3RlciBhbGwgdGhlIGNvZGVjcywgcGFyc2VycyBhbmQgYml0c3RyZWFtIGZpbHRlcnMgd2hpY2ggd2VyZSBlbmFibGVkIGF0CisgKiBjb25maWd1cmF0aW9uIHRpbWUuIElmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHlvdSBjYW4gc2VsZWN0IGV4YWN0bHkKKyAqIHdoaWNoIGZvcm1hdHMgeW91IHdhbnQgdG8gc3VwcG9ydCwgYnkgdXNpbmcgdGhlIGluZGl2aWR1YWwgcmVnaXN0cmF0aW9uCisgKiBmdW5jdGlvbnMuCisgKgorICogQHNlZSBhdmNvZGVjX3JlZ2lzdGVyCisgKiBAc2VlIGF2X3JlZ2lzdGVyX2NvZGVjX3BhcnNlcgorICogQHNlZSBhdl9yZWdpc3Rlcl9iaXRzdHJlYW1fZmlsdGVyCisgKi8KK3ZvaWQgYXZjb2RlY19yZWdpc3Rlcl9hbGwodm9pZCk7CisKKy8qKgorICogQWxsb2NhdGUgYW4gQVZDb2RlY0NvbnRleHQgYW5kIHNldCBpdHMgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiBUaGUKKyAqIHJlc3VsdGluZyBzdHJ1Y3Qgc2hvdWxkIGJlIGZyZWVkIHdpdGggYXZjb2RlY19mcmVlX2NvbnRleHQoKS4KKyAqCisgKiBAcGFyYW0gY29kZWMgaWYgbm9uLU5VTEwsIGFsbG9jYXRlIHByaXZhdGUgZGF0YSBhbmQgaW5pdGlhbGl6ZSBkZWZhdWx0cworICogICAgICAgICAgICAgIGZvciB0aGUgZ2l2ZW4gY29kZWMuIEl0IGlzIGlsbGVnYWwgdG8gdGhlbiBjYWxsIGF2Y29kZWNfb3BlbjIoKQorICogICAgICAgICAgICAgIHdpdGggYSBkaWZmZXJlbnQgY29kZWMuCisgKiAgICAgICAgICAgICAgSWYgTlVMTCwgdGhlbiB0aGUgY29kZWMtc3BlY2lmaWMgZGVmYXVsdHMgd29uJ3QgYmUgaW5pdGlhbGl6ZWQsCisgKiAgICAgICAgICAgICAgd2hpY2ggbWF5IHJlc3VsdCBpbiBzdWJvcHRpbWFsIGRlZmF1bHQgc2V0dGluZ3MgKHRoaXMgaXMKKyAqICAgICAgICAgICAgICBpbXBvcnRhbnQgbWFpbmx5IGZvciBlbmNvZGVycywgZS5nLiBsaWJ4MjY0KS4KKyAqCisgKiBAcmV0dXJuIEFuIEFWQ29kZWNDb250ZXh0IGZpbGxlZCB3aXRoIGRlZmF1bHQgdmFsdWVzIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqIEBzZWUgYXZjb2RlY19nZXRfY29udGV4dF9kZWZhdWx0cworICovCitBVkNvZGVjQ29udGV4dCAqYXZjb2RlY19hbGxvY19jb250ZXh0Myhjb25zdCBBVkNvZGVjICpjb2RlYyk7CisKKy8qKgorICogRnJlZSB0aGUgY29kZWMgY29udGV4dCBhbmQgZXZlcnl0aGluZyBhc3NvY2lhdGVkIHdpdGggaXQgYW5kIHdyaXRlIE5VTEwgdG8KKyAqIHRoZSBwcm92aWRlZCBwb2ludGVyLgorICovCit2b2lkIGF2Y29kZWNfZnJlZV9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICoqYXZjdHgpOworCisvKioKKyAqIFNldCB0aGUgZmllbGRzIG9mIHRoZSBnaXZlbiBBVkNvZGVjQ29udGV4dCB0byBkZWZhdWx0IHZhbHVlcyBjb3JyZXNwb25kaW5nCisgKiB0byB0aGUgZ2l2ZW4gY29kZWMgKGRlZmF1bHRzIG1heSBiZSBjb2RlYy1kZXBlbmRlbnQpLgorICoKKyAqIERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgYSBub24tTlVMTCBjb2RlYyBoYXMgYmVlbiBwYXNzZWQKKyAqIHRvIGF2Y29kZWNfYWxsb2NfY29udGV4dDMoKSB0aGF0IGFsbG9jYXRlZCB0aGlzIEFWQ29kZWNDb250ZXh0LgorICogSWYgY29kZWMgaXMgbm9uLU5VTEwsIGl0IGlzIGlsbGVnYWwgdG8gY2FsbCBhdmNvZGVjX29wZW4yKCkgd2l0aCBhCisgKiBkaWZmZXJlbnQgY29kZWMgb24gdGhpcyBBVkNvZGVjQ29udGV4dC4KKyAqLworaW50IGF2Y29kZWNfZ2V0X2NvbnRleHRfZGVmYXVsdHMzKEFWQ29kZWNDb250ZXh0ICpzLCBjb25zdCBBVkNvZGVjICpjb2RlYyk7CisKKy8qKgorICogR2V0IHRoZSBBVkNsYXNzIGZvciBBVkNvZGVjQ29udGV4dC4gSXQgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aAorICogQVZfT1BUX1NFQVJDSF9GQUtFX09CSiBmb3IgZXhhbWluaW5nIG9wdGlvbnMuCisgKgorICogQHNlZSBhdl9vcHRfZmluZCgpLgorICovCitjb25zdCBBVkNsYXNzICphdmNvZGVjX2dldF9jbGFzcyh2b2lkKTsKKworLyoqCisgKiBHZXQgdGhlIEFWQ2xhc3MgZm9yIEFWRnJhbWUuIEl0IGNhbiBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgKKyAqIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkogZm9yIGV4YW1pbmluZyBvcHRpb25zLgorICoKKyAqIEBzZWUgYXZfb3B0X2ZpbmQoKS4KKyAqLworY29uc3QgQVZDbGFzcyAqYXZjb2RlY19nZXRfZnJhbWVfY2xhc3Modm9pZCk7CisKKy8qKgorICogR2V0IHRoZSBBVkNsYXNzIGZvciBBVlN1YnRpdGxlUmVjdC4gSXQgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aAorICogQVZfT1BUX1NFQVJDSF9GQUtFX09CSiBmb3IgZXhhbWluaW5nIG9wdGlvbnMuCisgKgorICogQHNlZSBhdl9vcHRfZmluZCgpLgorICovCitjb25zdCBBVkNsYXNzICphdmNvZGVjX2dldF9zdWJ0aXRsZV9yZWN0X2NsYXNzKHZvaWQpOworCisvKioKKyAqIENvcHkgdGhlIHNldHRpbmdzIG9mIHRoZSBzb3VyY2UgQVZDb2RlY0NvbnRleHQgaW50byB0aGUgZGVzdGluYXRpb24KKyAqIEFWQ29kZWNDb250ZXh0LiBUaGUgcmVzdWx0aW5nIGRlc3RpbmF0aW9uIGNvZGVjIGNvbnRleHQgd2lsbCBiZQorICogdW5vcGVuZWQsIGkuZS4geW91IGFyZSByZXF1aXJlZCB0byBjYWxsIGF2Y29kZWNfb3BlbjIoKSBiZWZvcmUgeW91CisgKiBjYW4gdXNlIHRoaXMgQVZDb2RlY0NvbnRleHQgdG8gZGVjb2RlL2VuY29kZSB2aWRlby9hdWRpbyBkYXRhLgorICoKKyAqIEBwYXJhbSBkZXN0IHRhcmdldCBjb2RlYyBjb250ZXh0LCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aAorICogICAgICAgICAgICAgYXZjb2RlY19hbGxvY19jb250ZXh0MyhOVUxMKSwgYnV0IG90aGVyd2lzZSB1bmluaXRpYWxpemVkCisgKiBAcGFyYW0gc3JjIHNvdXJjZSBjb2RlYyBjb250ZXh0CisgKiBAcmV0dXJuIEFWRVJST1IoKSBvbiBlcnJvciAoZS5nLiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciksIDAgb24gc3VjY2VzcworICovCitpbnQgYXZjb2RlY19jb3B5X2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmRlc3QsIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpzcmMpOworCisjaWYgRkZfQVBJX0FWRlJBTUVfTEFWQworLyoqCisgKiBAZGVwcmVjYXRlZCB1c2UgYXZfZnJhbWVfYWxsb2MoKQorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAorQVZGcmFtZSAqYXZjb2RlY19hbGxvY19mcmFtZSh2b2lkKTsKKworLyoqCisgKiBTZXQgdGhlIGZpZWxkcyBvZiB0aGUgZ2l2ZW4gQVZGcmFtZSB0byBkZWZhdWx0IHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gZnJhbWUgVGhlIEFWRnJhbWUgb2Ygd2hpY2ggdGhlIGZpZWxkcyBzaG91bGQgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBhdl9mcmFtZV91bnJlZigpCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCit2b2lkIGF2Y29kZWNfZ2V0X2ZyYW1lX2RlZmF1bHRzKEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBGcmVlIHRoZSBmcmFtZSBhbmQgYW55IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBvYmplY3RzIGluIGl0LAorICogZS5nLiBleHRlbmRlZF9kYXRhLgorICoKKyAqIEBwYXJhbSBmcmFtZSBmcmFtZSB0byBiZSBmcmVlZC4gVGhlIHBvaW50ZXIgd2lsbCBiZSBzZXQgdG8gTlVMTC4KKyAqCisgKiBAd2FybmluZyB0aGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGZyZWUgdGhlIGRhdGEgYnVmZmVycyB0aGVtc2VsdmVzCisgKiAoaXQgZG9lcyBub3Qga25vdyBob3csIHNpbmNlIHRoZXkgbWlnaHQgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoCisgKiAgYSBjdXN0b20gZ2V0X2J1ZmZlcigpKS4KKyAqCisgKiBAZGVwcmVjYXRlZCB1c2UgYXZfZnJhbWVfZnJlZSgpCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCit2b2lkIGF2Y29kZWNfZnJlZV9mcmFtZShBVkZyYW1lICoqZnJhbWUpOworI2VuZGlmCisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgQVZDb2RlY0NvbnRleHQgdG8gdXNlIHRoZSBnaXZlbiBBVkNvZGVjLiBQcmlvciB0byB1c2luZyB0aGlzCisgKiBmdW5jdGlvbiB0aGUgY29udGV4dCBoYXMgdG8gYmUgYWxsb2NhdGVkIHdpdGggYXZjb2RlY19hbGxvY19jb250ZXh0MygpLgorICoKKyAqIFRoZSBmdW5jdGlvbnMgYXZjb2RlY19maW5kX2RlY29kZXJfYnlfbmFtZSgpLCBhdmNvZGVjX2ZpbmRfZW5jb2Rlcl9ieV9uYW1lKCksCisgKiBhdmNvZGVjX2ZpbmRfZGVjb2RlcigpIGFuZCBhdmNvZGVjX2ZpbmRfZW5jb2RlcigpIHByb3ZpZGUgYW4gZWFzeSB3YXkgZm9yCisgKiByZXRyaWV2aW5nIGEgY29kZWMuCisgKgorICogQHdhcm5pbmcgVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUhCisgKgorICogQGNvZGUKKyAqIGF2Y29kZWNfcmVnaXN0ZXJfYWxsKCk7CisgKiBhdl9kaWN0X3NldCgmb3B0cywgImIiLCAiMi41TSIsIDApOworICogY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihBVl9DT0RFQ19JRF9IMjY0KTsKKyAqIGlmICghY29kZWMpCisgKiAgICAgZXhpdCgxKTsKKyAqCisgKiBjb250ZXh0ID0gYXZjb2RlY19hbGxvY19jb250ZXh0Myhjb2RlYyk7CisgKgorICogaWYgKGF2Y29kZWNfb3BlbjIoY29udGV4dCwgY29kZWMsIG9wdHMpIDwgMCkKKyAqICAgICBleGl0KDEpOworICogQGVuZGNvZGUKKyAqCisgKiBAcGFyYW0gYXZjdHggVGhlIGNvbnRleHQgdG8gaW5pdGlhbGl6ZS4KKyAqIEBwYXJhbSBjb2RlYyBUaGUgY29kZWMgdG8gb3BlbiB0aGlzIGNvbnRleHQgZm9yLiBJZiBhIG5vbi1OVUxMIGNvZGVjIGhhcyBiZWVuCisgKiAgICAgICAgICAgICAgcHJldmlvdXNseSBwYXNzZWQgdG8gYXZjb2RlY19hbGxvY19jb250ZXh0MygpIG9yCisgKiAgICAgICAgICAgICAgYXZjb2RlY19nZXRfY29udGV4dF9kZWZhdWx0czMoKSBmb3IgdGhpcyBjb250ZXh0LCB0aGVuIHRoaXMKKyAqICAgICAgICAgICAgICBwYXJhbWV0ZXIgTVVTVCBiZSBlaXRoZXIgTlVMTCBvciBlcXVhbCB0byB0aGUgcHJldmlvdXNseSBwYXNzZWQKKyAqICAgICAgICAgICAgICBjb2RlYy4KKyAqIEBwYXJhbSBvcHRpb25zIEEgZGljdGlvbmFyeSBmaWxsZWQgd2l0aCBBVkNvZGVjQ29udGV4dCBhbmQgY29kZWMtcHJpdmF0ZSBvcHRpb25zLgorICogICAgICAgICAgICAgICAgT24gcmV0dXJuIHRoaXMgb2JqZWN0IHdpbGwgYmUgZmlsbGVkIHdpdGggb3B0aW9ucyB0aGF0IHdlcmUgbm90IGZvdW5kLgorICoKKyAqIEByZXR1cm4gemVybyBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yCisgKiBAc2VlIGF2Y29kZWNfYWxsb2NfY29udGV4dDMoKSwgYXZjb2RlY19maW5kX2RlY29kZXIoKSwgYXZjb2RlY19maW5kX2VuY29kZXIoKSwKKyAqICAgICAgYXZfZGljdF9zZXQoKSwgYXZfb3B0X2ZpbmQoKS4KKyAqLworaW50IGF2Y29kZWNfb3BlbjIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkNvZGVjICpjb2RlYywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucyk7CisKKy8qKgorICogQ2xvc2UgYSBnaXZlbiBBVkNvZGVjQ29udGV4dCBhbmQgZnJlZSBhbGwgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0CisgKiAoYnV0IG5vdCB0aGUgQVZDb2RlY0NvbnRleHQgaXRzZWxmKS4KKyAqCisgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gb24gYW4gQVZDb2RlY0NvbnRleHQgdGhhdCBoYXNuJ3QgYmVlbiBvcGVuZWQgd2lsbCBmcmVlCisgKiB0aGUgY29kZWMtc3BlY2lmaWMgZGF0YSBhbGxvY2F0ZWQgaW4gYXZjb2RlY19hbGxvY19jb250ZXh0MygpIC8KKyAqIGF2Y29kZWNfZ2V0X2NvbnRleHRfZGVmYXVsdHMzKCkgd2l0aCBhIG5vbi1OVUxMIGNvZGVjLiBTdWJzZXF1ZW50IGNhbGxzIHdpbGwKKyAqIGRvIG5vdGhpbmcuCisgKi8KK2ludCBhdmNvZGVjX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKy8qKgorICogRnJlZSBhbGwgYWxsb2NhdGVkIGRhdGEgaW4gdGhlIGdpdmVuIHN1YnRpdGxlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gc3ViIEFWU3VidGl0bGUgdG8gZnJlZS4KKyAqLwordm9pZCBhdnN1YnRpdGxlX2ZyZWUoQVZTdWJ0aXRsZSAqc3ViKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgbGF2Y19wYWNrZXQKKyAqIEB7CisgKi8KKworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKKy8qKgorICogRGVmYXVsdCBwYWNrZXQgZGVzdHJ1Y3Rvci4KKyAqIEBkZXByZWNhdGVkIHVzZSB0aGUgQVZCdWZmZXIgQVBJIGluc3RlYWQKKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK3ZvaWQgYXZfZGVzdHJ1Y3RfcGFja2V0KEFWUGFja2V0ICpwa3QpOworI2VuZGlmCisKKy8qKgorICogSW5pdGlhbGl6ZSBvcHRpb25hbCBmaWVsZHMgb2YgYSBwYWNrZXQgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAqCisgKiBOb3RlLCB0aGlzIGRvZXMgbm90IHRvdWNoIHRoZSBkYXRhIGFuZCBzaXplIG1lbWJlcnMsIHdoaWNoIGhhdmUgdG8gYmUKKyAqIGluaXRpYWxpemVkIHNlcGFyYXRlbHkuCisgKgorICogQHBhcmFtIHBrdCBwYWNrZXQKKyAqLwordm9pZCBhdl9pbml0X3BhY2tldChBVlBhY2tldCAqcGt0KTsKKworLyoqCisgKiBBbGxvY2F0ZSB0aGUgcGF5bG9hZCBvZiBhIHBhY2tldCBhbmQgaW5pdGlhbGl6ZSBpdHMgZmllbGRzIHdpdGgKKyAqIGRlZmF1bHQgdmFsdWVzLgorICoKKyAqIEBwYXJhbSBwa3QgcGFja2V0CisgKiBAcGFyYW0gc2l6ZSB3YW50ZWQgcGF5bG9hZCBzaXplCisgKiBAcmV0dXJuIDAgaWYgT0ssIEFWRVJST1JfeHh4IG90aGVyd2lzZQorICovCitpbnQgYXZfbmV3X3BhY2tldChBVlBhY2tldCAqcGt0LCBpbnQgc2l6ZSk7CisKKy8qKgorICogUmVkdWNlIHBhY2tldCBzaXplLCBjb3JyZWN0bHkgemVyb2luZyBwYWRkaW5nCisgKgorICogQHBhcmFtIHBrdCBwYWNrZXQKKyAqIEBwYXJhbSBzaXplIG5ldyBzaXplCisgKi8KK3ZvaWQgYXZfc2hyaW5rX3BhY2tldChBVlBhY2tldCAqcGt0LCBpbnQgc2l6ZSk7CisKKy8qKgorICogSW5jcmVhc2UgcGFja2V0IHNpemUsIGNvcnJlY3RseSB6ZXJvaW5nIHBhZGRpbmcKKyAqCisgKiBAcGFyYW0gcGt0IHBhY2tldAorICogQHBhcmFtIGdyb3dfYnkgbnVtYmVyIG9mIGJ5dGVzIGJ5IHdoaWNoIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBwYWNrZXQKKyAqLworaW50IGF2X2dyb3dfcGFja2V0KEFWUGFja2V0ICpwa3QsIGludCBncm93X2J5KTsKKworLyoqCisgKiBJbml0aWFsaXplIGEgcmVmZXJlbmNlLWNvdW50ZWQgcGFja2V0IGZyb20gYXZfbWFsbG9jKCllZCBkYXRhLgorICoKKyAqIEBwYXJhbSBwa3QgcGFja2V0IHRvIGJlIGluaXRpYWxpemVkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IHRoZSBkYXRhLCBzaXplLAorICogICAgICAgIGJ1ZiBhbmQgZGVzdHJ1Y3QgZmllbGRzLCBhbGwgb3RoZXJzIGFyZSBsZWZ0IHVudG91Y2hlZC4KKyAqIEBwYXJhbSBkYXRhIERhdGEgYWxsb2NhdGVkIGJ5IGF2X21hbGxvYygpIHRvIGJlIHVzZWQgYXMgcGFja2V0IGRhdGEuIElmIHRoaXMKKyAqICAgICAgICBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3NmdWxseSwgdGhlIGRhdGEgaXMgb3duZWQgYnkgdGhlIHVuZGVybHlpbmcgQVZCdWZmZXIuCisgKiAgICAgICAgVGhlIGNhbGxlciBtYXkgbm90IGFjY2VzcyB0aGUgZGF0YSB0aHJvdWdoIG90aGVyIG1lYW5zLgorICogQHBhcmFtIHNpemUgc2l6ZSBvZiBkYXRhIGluIGJ5dGVzLCB3aXRob3V0IHRoZSBwYWRkaW5nLiBJLmUuIHRoZSBmdWxsIGJ1ZmZlcgorICogICAgICAgIHNpemUgaXMgYXNzdW1lZCB0byBiZSBzaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRS4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIG9uIGVycm9yCisgKi8KK2ludCBhdl9wYWNrZXRfZnJvbV9kYXRhKEFWUGFja2V0ICpwa3QsIHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKTsKKworLyoqCisgKiBAd2FybmluZyBUaGlzIGlzIGEgaGFjayAtIHRoZSBwYWNrZXQgbWVtb3J5IGFsbG9jYXRpb24gc3R1ZmYgaXMgYnJva2VuLiBUaGUKKyAqIHBhY2tldCBpcyBhbGxvY2F0ZWQgaWYgaXQgd2FzIG5vdCByZWFsbHkgYWxsb2NhdGVkLgorICovCitpbnQgYXZfZHVwX3BhY2tldChBVlBhY2tldCAqcGt0KTsKKworLyoqCisgKiBDb3B5IHBhY2tldCwgaW5jbHVkaW5nIGNvbnRlbnRzCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIEFWRVJST1Igb24gZmFpbAorICovCitpbnQgYXZfY29weV9wYWNrZXQoQVZQYWNrZXQgKmRzdCwgY29uc3QgQVZQYWNrZXQgKnNyYyk7CisKKy8qKgorICogQ29weSBwYWNrZXQgc2lkZSBkYXRhCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIEFWRVJST1Igb24gZmFpbAorICovCitpbnQgYXZfY29weV9wYWNrZXRfc2lkZV9kYXRhKEFWUGFja2V0ICpkc3QsIGNvbnN0IEFWUGFja2V0ICpzcmMpOworCisvKioKKyAqIEZyZWUgYSBwYWNrZXQuCisgKgorICogQHBhcmFtIHBrdCBwYWNrZXQgdG8gZnJlZQorICovCit2b2lkIGF2X2ZyZWVfcGFja2V0KEFWUGFja2V0ICpwa3QpOworCisvKioKKyAqIEFsbG9jYXRlIG5ldyBpbmZvcm1hdGlvbiBvZiBhIHBhY2tldC4KKyAqCisgKiBAcGFyYW0gcGt0IHBhY2tldAorICogQHBhcmFtIHR5cGUgc2lkZSBpbmZvcm1hdGlvbiB0eXBlCisgKiBAcGFyYW0gc2l6ZSBzaWRlIGluZm9ybWF0aW9uIHNpemUKKyAqIEByZXR1cm4gcG9pbnRlciB0byBmcmVzaCBhbGxvY2F0ZWQgZGF0YSBvciBOVUxMIG90aGVyd2lzZQorICovCit1aW50OF90KiBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShBVlBhY2tldCAqcGt0LCBlbnVtIEFWUGFja2V0U2lkZURhdGFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSk7CisKKy8qKgorICogU2hyaW5rIHRoZSBhbHJlYWR5IGFsbG9jYXRlZCBzaWRlIGRhdGEgYnVmZmVyCisgKgorICogQHBhcmFtIHBrdCBwYWNrZXQKKyAqIEBwYXJhbSB0eXBlIHNpZGUgaW5mb3JtYXRpb24gdHlwZQorICogQHBhcmFtIHNpemUgbmV3IHNpZGUgaW5mb3JtYXRpb24gc2l6ZQorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDwgMCBvbiBmYWlsdXJlCisgKi8KK2ludCBhdl9wYWNrZXRfc2hyaW5rX3NpZGVfZGF0YShBVlBhY2tldCAqcGt0LCBlbnVtIEFWUGFja2V0U2lkZURhdGFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpOworCisvKioKKyAqIEdldCBzaWRlIGluZm9ybWF0aW9uIGZyb20gcGFja2V0LgorICoKKyAqIEBwYXJhbSBwa3QgcGFja2V0CisgKiBAcGFyYW0gdHlwZSBkZXNpcmVkIHNpZGUgaW5mb3JtYXRpb24gdHlwZQorICogQHBhcmFtIHNpemUgcG9pbnRlciBmb3Igc2lkZSBpbmZvcm1hdGlvbiBzaXplIHRvIHN0b3JlIChvcHRpb25hbCkKKyAqIEByZXR1cm4gcG9pbnRlciB0byBkYXRhIGlmIHByZXNlbnQgb3IgTlVMTCBvdGhlcndpc2UKKyAqLwordWludDhfdCogYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoQVZQYWNrZXQgKnBrdCwgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzaXplKTsKKworaW50IGF2X3BhY2tldF9tZXJnZV9zaWRlX2RhdGEoQVZQYWNrZXQgKnBrdCk7CisKK2ludCBhdl9wYWNrZXRfc3BsaXRfc2lkZV9kYXRhKEFWUGFja2V0ICpwa3QpOworCisvKioKKyAqIFBhY2sgYSBkaWN0aW9uYXJ5IGZvciB1c2UgaW4gc2lkZV9kYXRhLgorICoKKyAqIEBwYXJhbSBkaWN0IFRoZSBkaWN0aW9uYXJ5IHRvIHBhY2suCisgKiBAcGFyYW0gc2l6ZSBwb2ludGVyIHRvIHN0b3JlIHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBkYXRhCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gZGF0YSBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZQorICovCit1aW50OF90ICphdl9wYWNrZXRfcGFja19kaWN0aW9uYXJ5KEFWRGljdGlvbmFyeSAqZGljdCwgaW50ICpzaXplKTsKKy8qKgorICogVW5wYWNrIGEgZGljdGlvbmFyeSBmcm9tIHNpZGVfZGF0YS4KKyAqCisgKiBAcGFyYW0gZGF0YSBkYXRhIGZyb20gc2lkZV9kYXRhCisgKiBAcGFyYW0gc2l6ZSBzaXplIG9mIHRoZSBkYXRhCisgKiBAcGFyYW0gZGljdCB0aGUgbWV0YWRhdGEgc3RvcmFnZSBkaWN0aW9uYXJ5CisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPCAwIG9uIGZhaWx1cmUKKyAqLworaW50IGF2X3BhY2tldF91bnBhY2tfZGljdGlvbmFyeShjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSwgQVZEaWN0aW9uYXJ5ICoqZGljdCk7CisKKworLyoqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBmcmVlIGFsbCB0aGUgc2lkZSBkYXRhIHN0b3JlZC4KKyAqIEFsbCB0aGUgb3RoZXIgZmllbGRzIHN0YXkgdW50b3VjaGVkLgorICoKKyAqIEBwYXJhbSBwa3QgcGFja2V0CisgKi8KK3ZvaWQgYXZfcGFja2V0X2ZyZWVfc2lkZV9kYXRhKEFWUGFja2V0ICpwa3QpOworCisvKioKKyAqIFNldHVwIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgZGF0YSBkZXNjcmliZWQgYnkgYSBnaXZlbiBwYWNrZXQKKyAqCisgKiBJZiBzcmMgaXMgcmVmZXJlbmNlLWNvdW50ZWQsIHNldHVwIGRzdCBhcyBhIG5ldyByZWZlcmVuY2UgdG8gdGhlCisgKiBidWZmZXIgaW4gc3JjLiBPdGhlcndpc2UgYWxsb2NhdGUgYSBuZXcgYnVmZmVyIGluIGRzdCBhbmQgY29weSB0aGUKKyAqIGRhdGEgZnJvbSBzcmMgaW50byBpdC4KKyAqCisgKiBBbGwgdGhlIG90aGVyIGZpZWxkcyBhcmUgY29waWVkIGZyb20gc3JjLgorICoKKyAqIEBzZWUgYXZfcGFja2V0X3VucmVmCisgKgorICogQHBhcmFtIGRzdCBEZXN0aW5hdGlvbiBwYWNrZXQKKyAqIEBwYXJhbSBzcmMgU291cmNlIHBhY2tldAorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1Igb24gZXJyb3IuCisgKi8KK2ludCBhdl9wYWNrZXRfcmVmKEFWUGFja2V0ICpkc3QsIGNvbnN0IEFWUGFja2V0ICpzcmMpOworCisvKioKKyAqIFdpcGUgdGhlIHBhY2tldC4KKyAqCisgKiBVbnJlZmVyZW5jZSB0aGUgYnVmZmVyIHJlZmVyZW5jZWQgYnkgdGhlIHBhY2tldCBhbmQgcmVzZXQgdGhlCisgKiByZW1haW5pbmcgcGFja2V0IGZpZWxkcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gcGt0IFRoZSBwYWNrZXQgdG8gYmUgdW5yZWZlcmVuY2VkLgorICovCit2b2lkIGF2X3BhY2tldF91bnJlZihBVlBhY2tldCAqcGt0KTsKKworLyoqCisgKiBNb3ZlIGV2ZXJ5IGZpZWxkIGluIHNyYyB0byBkc3QgYW5kIHJlc2V0IHNyYy4KKyAqCisgKiBAc2VlIGF2X3BhY2tldF91bnJlZgorICoKKyAqIEBwYXJhbSBzcmMgU291cmNlIHBhY2tldCwgd2lsbCBiZSByZXNldAorICogQHBhcmFtIGRzdCBEZXN0aW5hdGlvbiBwYWNrZXQKKyAqLwordm9pZCBhdl9wYWNrZXRfbW92ZV9yZWYoQVZQYWNrZXQgKmRzdCwgQVZQYWNrZXQgKnNyYyk7CisKKy8qKgorICogQ29weSBvbmx5ICJwcm9wZXJ0aWVzIiBmaWVsZHMgZnJvbSBzcmMgdG8gZHN0LgorICoKKyAqIFByb3BlcnRpZXMgZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGFsbCB0aGUgZmllbGRzCisgKiBiZXNpZGUgdGhvc2UgcmVsYXRlZCB0byB0aGUgcGFja2V0IGRhdGEgKGJ1ZiwgZGF0YSwgc2l6ZSkKKyAqCisgKiBAcGFyYW0gZHN0IERlc3RpbmF0aW9uIHBhY2tldAorICogQHBhcmFtIHNyYyBTb3VyY2UgcGFja2V0CisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MgQVZFUlJPUiBvbiBmYWlsdXJlLgorICoKKyAqLworaW50IGF2X3BhY2tldF9jb3B5X3Byb3BzKEFWUGFja2V0ICpkc3QsIGNvbnN0IEFWUGFja2V0ICpzcmMpOworCisvKioKKyAqIENvbnZlcnQgdmFsaWQgdGltaW5nIGZpZWxkcyAodGltZXN0YW1wcyAvIGR1cmF0aW9ucykgaW4gYSBwYWNrZXQgZnJvbSBvbmUKKyAqIHRpbWViYXNlIHRvIGFub3RoZXIuIFRpbWVzdGFtcHMgd2l0aCB1bmtub3duIHZhbHVlcyAoQVZfTk9QVFNfVkFMVUUpIHdpbGwgYmUKKyAqIGlnbm9yZWQuCisgKgorICogQHBhcmFtIHBrdCBwYWNrZXQgb24gd2hpY2ggdGhlIGNvbnZlcnNpb24gd2lsbCBiZSBwZXJmb3JtZWQKKyAqIEBwYXJhbSB0Yl9zcmMgc291cmNlIHRpbWViYXNlLCBpbiB3aGljaCB0aGUgdGltaW5nIGZpZWxkcyBpbiBwa3QgYXJlCisgKiAgICAgICAgICAgICAgIGV4cHJlc3NlZAorICogQHBhcmFtIHRiX2RzdCBkZXN0aW5hdGlvbiB0aW1lYmFzZSwgdG8gd2hpY2ggdGhlIHRpbWluZyBmaWVsZHMgd2lsbCBiZQorICogICAgICAgICAgICAgICBjb252ZXJ0ZWQKKyAqLwordm9pZCBhdl9wYWNrZXRfcmVzY2FsZV90cyhBVlBhY2tldCAqcGt0LCBBVlJhdGlvbmFsIHRiX3NyYywgQVZSYXRpb25hbCB0Yl9kc3QpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBsYXZjX2RlY29kaW5nCisgKiBAeworICovCisKKy8qKgorICogRmluZCBhIHJlZ2lzdGVyZWQgZGVjb2RlciB3aXRoIGEgbWF0Y2hpbmcgY29kZWMgSUQuCisgKgorICogQHBhcmFtIGlkIEFWQ29kZWNJRCBvZiB0aGUgcmVxdWVzdGVkIGRlY29kZXIKKyAqIEByZXR1cm4gQSBkZWNvZGVyIGlmIG9uZSB3YXMgZm91bmQsIE5VTEwgb3RoZXJ3aXNlLgorICovCitBVkNvZGVjICphdmNvZGVjX2ZpbmRfZGVjb2RlcihlbnVtIEFWQ29kZWNJRCBpZCk7CisKKy8qKgorICogRmluZCBhIHJlZ2lzdGVyZWQgZGVjb2RlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAqCisgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZGVjb2RlcgorICogQHJldHVybiBBIGRlY29kZXIgaWYgb25lIHdhcyBmb3VuZCwgTlVMTCBvdGhlcndpc2UuCisgKi8KK0FWQ29kZWMgKmF2Y29kZWNfZmluZF9kZWNvZGVyX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSk7CisKKyNpZiBGRl9BUElfR0VUX0JVRkZFUgorYXR0cmlidXRlX2RlcHJlY2F0ZWQgaW50IGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICpwaWMpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQgdm9pZCBhdmNvZGVjX2RlZmF1bHRfcmVsZWFzZV9idWZmZXIoQVZDb2RlY0NvbnRleHQgKnMsIEFWRnJhbWUgKnBpYyk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZCBpbnQgYXZjb2RlY19kZWZhdWx0X3JlZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqcGljKTsKKyNlbmRpZgorCisvKioKKyAqIFRoZSBkZWZhdWx0IGNhbGxiYWNrIGZvciBBVkNvZGVjQ29udGV4dC5nZXRfYnVmZmVyMigpLiBJdCBpcyBtYWRlIHB1YmxpYyBzbworICogaXQgY2FuIGJlIGNhbGxlZCBieSBjdXN0b20gZ2V0X2J1ZmZlcjIoKSBpbXBsZW1lbnRhdGlvbnMgZm9yIGRlY29kZXJzIHdpdGhvdXQKKyAqIENPREVDX0NBUF9EUjEgc2V0LgorICovCitpbnQgYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXIyKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgaW50IGZsYWdzKTsKKworI2lmIEZGX0FQSV9FTVVfRURHRQorLyoqCisgKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIHBpeGVscyB3aGljaCB0aGUgZ2V0X2J1ZmZlciBjYWxsYmFjayBtdXN0CisgKiBwcm92aWRlIGFyb3VuZCB0aGUgZWRnZSBvZiB0aGUgaW1hZ2UgZm9yIGNvZGVjcyB3aGljaCBkbyBub3QgaGF2ZSB0aGUKKyAqIENPREVDX0ZMQUdfRU1VX0VER0UgZmxhZy4KKyAqCisgKiBAcmV0dXJuIFJlcXVpcmVkIHBhZGRpbmcgaW4gcGl4ZWxzLgorICoKKyAqIEBkZXByZWNhdGVkIENPREVDX0ZMQUdfRU1VX0VER0UgaXMgZGVwcmVjYXRlZCwgc28gdGhpcyBmdW5jdGlvbiBpcyBubyBsb25nZXIKKyAqIG5lZWRlZAorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAordW5zaWduZWQgYXZjb2RlY19nZXRfZWRnZV93aWR0aCh2b2lkKTsKKyNlbmRpZgorCisvKioKKyAqIE1vZGlmeSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyBzbyB0aGF0IHRoZXkgd2lsbCByZXN1bHQgaW4gYSBtZW1vcnkKKyAqIGJ1ZmZlciB0aGF0IGlzIGFjY2VwdGFibGUgZm9yIHRoZSBjb2RlYyBpZiB5b3UgZG8gbm90IHVzZSBhbnkgaG9yaXpvbnRhbAorICogcGFkZGluZy4KKyAqCisgKiBNYXkgb25seSBiZSB1c2VkIGlmIGEgY29kZWMgd2l0aCBDT0RFQ19DQVBfRFIxIGhhcyBiZWVuIG9wZW5lZC4KKyAqLwordm9pZCBhdmNvZGVjX2FsaWduX2RpbWVuc2lvbnMoQVZDb2RlY0NvbnRleHQgKnMsIGludCAqd2lkdGgsIGludCAqaGVpZ2h0KTsKKworLyoqCisgKiBNb2RpZnkgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgc28gdGhhdCB0aGV5IHdpbGwgcmVzdWx0IGluIGEgbWVtb3J5CisgKiBidWZmZXIgdGhhdCBpcyBhY2NlcHRhYmxlIGZvciB0aGUgY29kZWMgaWYgeW91IGFsc28gZW5zdXJlIHRoYXQgYWxsCisgKiBsaW5lIHNpemVzIGFyZSBhIG11bHRpcGxlIG9mIHRoZSByZXNwZWN0aXZlIGxpbmVzaXplX2FsaWduW2ldLgorICoKKyAqIE1heSBvbmx5IGJlIHVzZWQgaWYgYSBjb2RlYyB3aXRoIENPREVDX0NBUF9EUjEgaGFzIGJlZW4gb3BlbmVkLgorICovCit2b2lkIGF2Y29kZWNfYWxpZ25fZGltZW5zaW9uczIoQVZDb2RlY0NvbnRleHQgKnMsIGludCAqd2lkdGgsIGludCAqaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZV9hbGlnbltBVl9OVU1fREFUQV9QT0lOVEVSU10pOworCisvKioKKyAqIENvbnZlcnRzIEFWQ2hyb21hTG9jYXRpb24gdG8gc3dzY2FsZSB4L3kgY2hyb21hIHBvc2l0aW9uLgorICoKKyAqIFRoZSBwb3NpdGlvbnMgcmVwcmVzZW50IHRoZSBjaHJvbWEgKDAsMCkgcG9zaXRpb24gaW4gYSBjb29yZGluYXRlcyBzeXN0ZW0KKyAqIHdpdGggbHVtYSAoMCwwKSByZXByZXNlbnRpbmcgdGhlIG9yaWdpbiBhbmQgbHVtYSgxLDEpIHJlcHJlc2VudGluZyAyNTYsMjU2CisgKgorICogQHBhcmFtIHhwb3MgIGhvcml6b250YWwgY2hyb21hIHNhbXBsZSBwb3NpdGlvbgorICogQHBhcmFtIHlwb3MgIHZlcnRpY2FsICAgY2hyb21hIHNhbXBsZSBwb3NpdGlvbgorICovCitpbnQgYXZjb2RlY19lbnVtX3RvX2Nocm9tYV9wb3MoaW50ICp4cG9zLCBpbnQgKnlwb3MsIGVudW0gQVZDaHJvbWFMb2NhdGlvbiBwb3MpOworCisvKioKKyAqIENvbnZlcnRzIHN3c2NhbGUgeC95IGNocm9tYSBwb3NpdGlvbiB0byBBVkNocm9tYUxvY2F0aW9uLgorICoKKyAqIFRoZSBwb3NpdGlvbnMgcmVwcmVzZW50IHRoZSBjaHJvbWEgKDAsMCkgcG9zaXRpb24gaW4gYSBjb29yZGluYXRlcyBzeXN0ZW0KKyAqIHdpdGggbHVtYSAoMCwwKSByZXByZXNlbnRpbmcgdGhlIG9yaWdpbiBhbmQgbHVtYSgxLDEpIHJlcHJlc2VudGluZyAyNTYsMjU2CisgKgorICogQHBhcmFtIHhwb3MgIGhvcml6b250YWwgY2hyb21hIHNhbXBsZSBwb3NpdGlvbgorICogQHBhcmFtIHlwb3MgIHZlcnRpY2FsICAgY2hyb21hIHNhbXBsZSBwb3NpdGlvbgorICovCitlbnVtIEFWQ2hyb21hTG9jYXRpb24gYXZjb2RlY19jaHJvbWFfcG9zX3RvX2VudW0oaW50IHhwb3MsIGludCB5cG9zKTsKKworI2lmIEZGX0FQSV9PTERfREVDT0RFX0FVRElPCisvKioKKyAqIFdyYXBwZXIgZnVuY3Rpb24gd2hpY2ggY2FsbHMgYXZjb2RlY19kZWNvZGVfYXVkaW80LgorICoKKyAqIEBkZXByZWNhdGVkIFVzZSBhdmNvZGVjX2RlY29kZV9hdWRpbzQgaW5zdGVhZC4KKyAqCisgKiBEZWNvZGUgdGhlIGF1ZGlvIGZyYW1lIG9mIHNpemUgYXZwa3QtPnNpemUgZnJvbSBhdnBrdC0+ZGF0YSBpbnRvIHNhbXBsZXMuCisgKiBTb21lIGRlY29kZXJzIG1heSBzdXBwb3J0IG11bHRpcGxlIGZyYW1lcyBpbiBhIHNpbmdsZSBBVlBhY2tldCwgc3VjaAorICogZGVjb2RlcnMgd291bGQgdGhlbiBqdXN0IGRlY29kZSB0aGUgZmlyc3QgZnJhbWUuIEluIHRoaXMgY2FzZSwKKyAqIGF2Y29kZWNfZGVjb2RlX2F1ZGlvMyBoYXMgdG8gYmUgY2FsbGVkIGFnYWluIHdpdGggYW4gQVZQYWNrZXQgdGhhdCBjb250YWlucworICogdGhlIHJlbWFpbmluZyBkYXRhIGluIG9yZGVyIHRvIGRlY29kZSB0aGUgc2Vjb25kIGZyYW1lIGV0Yy4KKyAqIElmIG5vIGZyYW1lCisgKiBjb3VsZCBiZSBvdXRwdXR0ZWQsIGZyYW1lX3NpemVfcHRyIGlzIHplcm8uIE90aGVyd2lzZSwgaXQgaXMgdGhlCisgKiBkZWNvbXByZXNzZWQgZnJhbWUgc2l6ZSBpbiBieXRlcy4KKyAqCisgKiBAd2FybmluZyBZb3UgbXVzdCBzZXQgZnJhbWVfc2l6ZV9wdHIgdG8gdGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoZQorICogb3V0cHV0IGJ1ZmZlciBiZWZvcmUgY2FsbGluZyBhdmNvZGVjX2RlY29kZV9hdWRpbzMoKS4KKyAqCisgKiBAd2FybmluZyBUaGUgaW5wdXQgYnVmZmVyIG11c3QgYmUgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSBsYXJnZXIgdGhhbgorICogdGhlIGFjdHVhbCByZWFkIGJ5dGVzIGJlY2F1c2Ugc29tZSBvcHRpbWl6ZWQgYml0c3RyZWFtIHJlYWRlcnMgcmVhZCAzMiBvciA2NAorICogYml0cyBhdCBvbmNlIGFuZCBjb3VsZCByZWFkIG92ZXIgdGhlIGVuZC4KKyAqCisgKiBAd2FybmluZyBUaGUgZW5kIG9mIHRoZSBpbnB1dCBidWZmZXIgYXZwa3QtPmRhdGEgc2hvdWxkIGJlIHNldCB0byAwIHRvIGVuc3VyZSB0aGF0CisgKiBubyBvdmVycmVhZGluZyBoYXBwZW5zIGZvciBkYW1hZ2VkIE1QRUcgc3RyZWFtcy4KKyAqCisgKiBAd2FybmluZyBZb3UgbXVzdCBub3QgcHJvdmlkZSBhIGN1c3RvbSBnZXRfYnVmZmVyKCkgd2hlbiB1c2luZworICogYXZjb2RlY19kZWNvZGVfYXVkaW8zKCkuICBEb2luZyBzbyB3aWxsIG92ZXJyaWRlIGl0IHdpdGgKKyAqIGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyLiAgVXNlIGF2Y29kZWNfZGVjb2RlX2F1ZGlvNCgpIGluc3RlYWQsCisgKiB3aGljaCBkb2VzIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBwcm92aWRlIGEgY3VzdG9tIGdldF9idWZmZXIoKS4KKyAqCisgKiBAbm90ZSBZb3UgbWlnaHQgaGF2ZSB0byBhbGlnbiB0aGUgaW5wdXQgYnVmZmVyIGF2cGt0LT5kYXRhIGFuZCBvdXRwdXQgYnVmZmVyCisgKiBzYW1wbGVzLiBUaGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBkZXBlbmQgb24gdGhlIENQVTogT24gc29tZSBDUFVzIGl0IGlzbid0CisgKiBuZWNlc3NhcnkgYXQgYWxsLCBvbiBvdGhlcnMgaXQgd29uJ3Qgd29yayBhdCBhbGwgaWYgbm90IGFsaWduZWQgYW5kIG9uIG90aGVycworICogaXQgd2lsbCB3b3JrIGJ1dCBpdCB3aWxsIGhhdmUgYW4gaW1wYWN0IG9uIHBlcmZvcm1hbmNlLgorICoKKyAqIEluIHByYWN0aWNlLCBhdnBrdC0+ZGF0YSBzaG91bGQgaGF2ZSA0IGJ5dGUgYWxpZ25tZW50IGF0IG1pbmltdW0gYW5kCisgKiBzYW1wbGVzIHNob3VsZCBiZSAxNiBieXRlIGFsaWduZWQgdW5sZXNzIHRoZSBDUFUgZG9lc24ndCBuZWVkIGl0CisgKiAoQWx0aVZlYyBhbmQgU1NFIGRvKS4KKyAqCisgKiBAbm90ZSBDb2RlY3Mgd2hpY2ggaGF2ZSB0aGUgQ09ERUNfQ0FQX0RFTEFZIGNhcGFiaWxpdHkgc2V0IGhhdmUgYSBkZWxheQorICogYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0LCB0aGVzZSBuZWVkIHRvIGJlIGZlZCB3aXRoIGF2cGt0LT5kYXRhPU5VTEwsCisgKiBhdnBrdC0+c2l6ZT0wIGF0IHRoZSBlbmQgdG8gcmV0dXJuIHRoZSByZW1haW5pbmcgZnJhbWVzLgorICoKKyAqIEBwYXJhbSBhdmN0eCB0aGUgY29kZWMgY29udGV4dAorICogQHBhcmFtW291dF0gc2FtcGxlcyB0aGUgb3V0cHV0IGJ1ZmZlciwgc2FtcGxlIHR5cGUgaW4gYXZjdHgtPnNhbXBsZV9mbXQKKyAqICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHNhbXBsZSBmb3JtYXQgaXMgcGxhbmFyLCBlYWNoIGNoYW5uZWwgcGxhbmUgd2lsbAorICogICAgICAgICAgICAgICAgICAgICBiZSB0aGUgc2FtZSBzaXplLCB3aXRoIG5vIHBhZGRpbmcgYmV0d2VlbiBjaGFubmVscy4KKyAqIEBwYXJhbVtpbixvdXRdIGZyYW1lX3NpemVfcHRyIHRoZSBvdXRwdXQgYnVmZmVyIHNpemUgaW4gYnl0ZXMKKyAqIEBwYXJhbVtpbl0gYXZwa3QgVGhlIGlucHV0IEFWUGFja2V0IGNvbnRhaW5pbmcgdGhlIGlucHV0IGJ1ZmZlci4KKyAqICAgICAgICAgICAgWW91IGNhbiBjcmVhdGUgc3VjaCBwYWNrZXQgd2l0aCBhdl9pbml0X3BhY2tldCgpIGFuZCBieSB0aGVuIHNldHRpbmcKKyAqICAgICAgICAgICAgZGF0YSBhbmQgc2l6ZSwgc29tZSBkZWNvZGVycyBtaWdodCBpbiBhZGRpdGlvbiBuZWVkIG90aGVyIGZpZWxkcy4KKyAqICAgICAgICAgICAgQWxsIGRlY29kZXJzIGFyZSBkZXNpZ25lZCB0byB1c2UgdGhlIGxlYXN0IGZpZWxkcyBwb3NzaWJsZSB0aG91Z2guCisgKiBAcmV0dXJuIE9uIGVycm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiB1c2VkIG9yIHplcm8gaWYgbm8gZnJhbWUgZGF0YSB3YXMgZGVjb21wcmVzc2VkICh1c2VkKSBmcm9tIHRoZSBpbnB1dCBBVlBhY2tldC4KKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQgaW50IGF2Y29kZWNfZGVjb2RlX2F1ZGlvMyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludDE2X3QgKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmcmFtZV9zaXplX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpOworI2VuZGlmCisKKy8qKgorICogRGVjb2RlIHRoZSBhdWRpbyBmcmFtZSBvZiBzaXplIGF2cGt0LT5zaXplIGZyb20gYXZwa3QtPmRhdGEgaW50byBmcmFtZS4KKyAqCisgKiBTb21lIGRlY29kZXJzIG1heSBzdXBwb3J0IG11bHRpcGxlIGZyYW1lcyBpbiBhIHNpbmdsZSBBVlBhY2tldC4gU3VjaAorICogZGVjb2RlcnMgd291bGQgdGhlbiBqdXN0IGRlY29kZSB0aGUgZmlyc3QgZnJhbWUgYW5kIHRoZSByZXR1cm4gdmFsdWUgd291bGQgYmUKKyAqIGxlc3MgdGhhbiB0aGUgcGFja2V0IHNpemUuIEluIHRoaXMgY2FzZSwgYXZjb2RlY19kZWNvZGVfYXVkaW80IGhhcyB0byBiZQorICogY2FsbGVkIGFnYWluIHdpdGggYW4gQVZQYWNrZXQgY29udGFpbmluZyB0aGUgcmVtYWluaW5nIGRhdGEgaW4gb3JkZXIgdG8KKyAqIGRlY29kZSB0aGUgc2Vjb25kIGZyYW1lLCBldGMuLi4gIEV2ZW4gaWYgbm8gZnJhbWVzIGFyZSByZXR1cm5lZCwgdGhlIHBhY2tldAorICogbmVlZHMgdG8gYmUgZmVkIHRvIHRoZSBkZWNvZGVyIHdpdGggcmVtYWluaW5nIGRhdGEgdW50aWwgaXQgaXMgY29tcGxldGVseQorICogY29uc3VtZWQgb3IgYW4gZXJyb3Igb2NjdXJzLgorICoKKyAqIFNvbWUgZGVjb2RlcnMgKHRob3NlIG1hcmtlZCB3aXRoIENPREVDX0NBUF9ERUxBWSkgaGF2ZSBhIGRlbGF5IGJldHdlZW4gaW5wdXQKKyAqIGFuZCBvdXRwdXQuIFRoaXMgbWVhbnMgdGhhdCBmb3Igc29tZSBwYWNrZXRzIHRoZXkgd2lsbCBub3QgaW1tZWRpYXRlbHkKKyAqIHByb2R1Y2UgZGVjb2RlZCBvdXRwdXQgYW5kIG5lZWQgdG8gYmUgZmx1c2hlZCBhdCB0aGUgZW5kIG9mIGRlY29kaW5nIHRvIGdldAorICogYWxsIHRoZSBkZWNvZGVkIGRhdGEuIEZsdXNoaW5nIGlzIGRvbmUgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggcGFja2V0cworICogd2l0aCBhdnBrdC0+ZGF0YSBzZXQgdG8gTlVMTCBhbmQgYXZwa3QtPnNpemUgc2V0IHRvIDAgdW50aWwgaXQgc3RvcHMKKyAqIHJldHVybmluZyBzYW1wbGVzLiBJdCBpcyBzYWZlIHRvIGZsdXNoIGV2ZW4gdGhvc2UgZGVjb2RlcnMgdGhhdCBhcmUgbm90CisgKiBtYXJrZWQgd2l0aCBDT0RFQ19DQVBfREVMQVksIHRoZW4gbm8gc2FtcGxlcyB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIEB3YXJuaW5nIFRoZSBpbnB1dCBidWZmZXIsIGF2cGt0LT5kYXRhIG11c3QgYmUgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRQorICogICAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIGFjdHVhbCByZWFkIGJ5dGVzIGJlY2F1c2Ugc29tZSBvcHRpbWl6ZWQgYml0c3RyZWFtCisgKiAgICAgICAgICByZWFkZXJzIHJlYWQgMzIgb3IgNjQgYml0cyBhdCBvbmNlIGFuZCBjb3VsZCByZWFkIG92ZXIgdGhlIGVuZC4KKyAqCisgKiBAcGFyYW0gICAgICBhdmN0eCB0aGUgY29kZWMgY29udGV4dAorICogQHBhcmFtW291dF0gZnJhbWUgVGhlIEFWRnJhbWUgaW4gd2hpY2ggdG8gc3RvcmUgZGVjb2RlZCBhdWRpbyBzYW1wbGVzLgorICogICAgICAgICAgICAgICAgICAgVGhlIGRlY29kZXIgd2lsbCBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGRlY29kZWQgZnJhbWUgYnkKKyAqICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgdGhlIEFWQ29kZWNDb250ZXh0LmdldF9idWZmZXIyKCkgY2FsbGJhY2suCisgKiAgICAgICAgICAgICAgICAgICBXaGVuIEFWQ29kZWNDb250ZXh0LnJlZmNvdW50ZWRfZnJhbWVzIGlzIHNldCB0byAxLCB0aGUgZnJhbWUgaXMKKyAqICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSBjb3VudGVkIGFuZCB0aGUgcmV0dXJuZWQgcmVmZXJlbmNlIGJlbG9uZ3MgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICBjYWxsZXIuIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBmcmFtZSB1c2luZyBhdl9mcmFtZV91bnJlZigpCisgKiAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSBmcmFtZSBpcyBubyBsb25nZXIgbmVlZGVkLiBUaGUgY2FsbGVyIG1heSBzYWZlbHkgd3JpdGUKKyAqICAgICAgICAgICAgICAgICAgIHRvIHRoZSBmcmFtZSBpZiBhdl9mcmFtZV9pc193cml0YWJsZSgpIHJldHVybnMgMS4KKyAqICAgICAgICAgICAgICAgICAgIFdoZW4gQVZDb2RlY0NvbnRleHQucmVmY291bnRlZF9mcmFtZXMgaXMgc2V0IHRvIDAsIHRoZSByZXR1cm5lZAorICogICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIGJlbG9uZ3MgdG8gdGhlIGRlY29kZXIgYW5kIGlzIHZhbGlkIG9ubHkgdW50aWwgdGhlCisgKiAgICAgICAgICAgICAgICAgICBuZXh0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBvciB1bnRpbCBjbG9zaW5nIG9yIGZsdXNoaW5nIHRoZQorICogICAgICAgICAgICAgICAgICAgZGVjb2Rlci4gVGhlIGNhbGxlciBtYXkgbm90IHdyaXRlIHRvIGl0LgorICogQHBhcmFtW291dF0gZ290X2ZyYW1lX3B0ciBaZXJvIGlmIG5vIGZyYW1lIGNvdWxkIGJlIGRlY29kZWQsIG90aGVyd2lzZSBpdCBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICBub24temVyby4gTm90ZSB0aGF0IHRoaXMgZmllbGQgYmVpbmcgc2V0IHRvIHplcm8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgbWVhbiB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZC4gRm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJzIHdpdGggQ09ERUNfQ0FQX0RFTEFZIHNldCwgbm8gZ2l2ZW4gZGVjb2RlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgaXMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgZnJhbWUuCisgKiBAcGFyYW1baW5dICBhdnBrdCBUaGUgaW5wdXQgQVZQYWNrZXQgY29udGFpbmluZyB0aGUgaW5wdXQgYnVmZmVyLgorICogICAgICAgICAgICAgICAgICAgQXQgbGVhc3QgYXZwa3QtPmRhdGEgYW5kIGF2cGt0LT5zaXplIHNob3VsZCBiZSBzZXQuIFNvbWUKKyAqICAgICAgICAgICAgICAgICAgIGRlY29kZXJzIG1pZ2h0IGFsc28gcmVxdWlyZSBhZGRpdGlvbmFsIGZpZWxkcyB0byBiZSBzZXQuCisgKiBAcmV0dXJuIEEgbmVnYXRpdmUgZXJyb3IgY29kZSBpcyByZXR1cm5lZCBpZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcKKyAqICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGlucHV0CisgKiAgICAgICAgIEFWUGFja2V0IGlzIHJldHVybmVkLgorICovCitpbnQgYXZjb2RlY19kZWNvZGVfYXVkaW80KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgY29uc3QgQVZQYWNrZXQgKmF2cGt0KTsKKworLyoqCisgKiBEZWNvZGUgdGhlIHZpZGVvIGZyYW1lIG9mIHNpemUgYXZwa3QtPnNpemUgZnJvbSBhdnBrdC0+ZGF0YSBpbnRvIHBpY3R1cmUuCisgKiBTb21lIGRlY29kZXJzIG1heSBzdXBwb3J0IG11bHRpcGxlIGZyYW1lcyBpbiBhIHNpbmdsZSBBVlBhY2tldCwgc3VjaAorICogZGVjb2RlcnMgd291bGQgdGhlbiBqdXN0IGRlY29kZSB0aGUgZmlyc3QgZnJhbWUuCisgKgorICogQHdhcm5pbmcgVGhlIGlucHV0IGJ1ZmZlciBtdXN0IGJlIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgbGFyZ2VyIHRoYW4KKyAqIHRoZSBhY3R1YWwgcmVhZCBieXRlcyBiZWNhdXNlIHNvbWUgb3B0aW1pemVkIGJpdHN0cmVhbSByZWFkZXJzIHJlYWQgMzIgb3IgNjQKKyAqIGJpdHMgYXQgb25jZSBhbmQgY291bGQgcmVhZCBvdmVyIHRoZSBlbmQuCisgKgorICogQHdhcm5pbmcgVGhlIGVuZCBvZiB0aGUgaW5wdXQgYnVmZmVyIGJ1ZiBzaG91bGQgYmUgc2V0IHRvIDAgdG8gZW5zdXJlIHRoYXQKKyAqIG5vIG92ZXJyZWFkaW5nIGhhcHBlbnMgZm9yIGRhbWFnZWQgTVBFRyBzdHJlYW1zLgorICoKKyAqIEBub3RlIENvZGVjcyB3aGljaCBoYXZlIHRoZSBDT0RFQ19DQVBfREVMQVkgY2FwYWJpbGl0eSBzZXQgaGF2ZSBhIGRlbGF5CisgKiBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQsIHRoZXNlIG5lZWQgdG8gYmUgZmVkIHdpdGggYXZwa3QtPmRhdGE9TlVMTCwKKyAqIGF2cGt0LT5zaXplPTAgYXQgdGhlIGVuZCB0byByZXR1cm4gdGhlIHJlbWFpbmluZyBmcmFtZXMuCisgKgorICogQHBhcmFtIGF2Y3R4IHRoZSBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW1bb3V0XSBwaWN0dXJlIFRoZSBBVkZyYW1lIGluIHdoaWNoIHRoZSBkZWNvZGVkIHZpZGVvIGZyYW1lIHdpbGwgYmUgc3RvcmVkLgorICogICAgICAgICAgICAgVXNlIGF2X2ZyYW1lX2FsbG9jKCkgdG8gZ2V0IGFuIEFWRnJhbWUuIFRoZSBjb2RlYyB3aWxsCisgKiAgICAgICAgICAgICBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBhY3R1YWwgYml0bWFwIGJ5IGNhbGxpbmcgdGhlCisgKiAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dC5nZXRfYnVmZmVyMigpIGNhbGxiYWNrLgorICogICAgICAgICAgICAgV2hlbiBBVkNvZGVjQ29udGV4dC5yZWZjb3VudGVkX2ZyYW1lcyBpcyBzZXQgdG8gMSwgdGhlIGZyYW1lIGlzCisgKiAgICAgICAgICAgICByZWZlcmVuY2UgY291bnRlZCBhbmQgdGhlIHJldHVybmVkIHJlZmVyZW5jZSBiZWxvbmdzIHRvIHRoZQorICogICAgICAgICAgICAgY2FsbGVyLiBUaGUgY2FsbGVyIG11c3QgcmVsZWFzZSB0aGUgZnJhbWUgdXNpbmcgYXZfZnJhbWVfdW5yZWYoKQorICogICAgICAgICAgICAgd2hlbiB0aGUgZnJhbWUgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gVGhlIGNhbGxlciBtYXkgc2FmZWx5IHdyaXRlCisgKiAgICAgICAgICAgICB0byB0aGUgZnJhbWUgaWYgYXZfZnJhbWVfaXNfd3JpdGFibGUoKSByZXR1cm5zIDEuCisgKiAgICAgICAgICAgICBXaGVuIEFWQ29kZWNDb250ZXh0LnJlZmNvdW50ZWRfZnJhbWVzIGlzIHNldCB0byAwLCB0aGUgcmV0dXJuZWQKKyAqICAgICAgICAgICAgIHJlZmVyZW5jZSBiZWxvbmdzIHRvIHRoZSBkZWNvZGVyIGFuZCBpcyB2YWxpZCBvbmx5IHVudGlsIHRoZQorICogICAgICAgICAgICAgbmV4dCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gb3IgdW50aWwgY2xvc2luZyBvciBmbHVzaGluZyB0aGUKKyAqICAgICAgICAgICAgIGRlY29kZXIuIFRoZSBjYWxsZXIgbWF5IG5vdCB3cml0ZSB0byBpdC4KKyAqCisgKiBAcGFyYW1baW5dIGF2cGt0IFRoZSBpbnB1dCBBVlBhY2tldCBjb250YWluaW5nIHRoZSBpbnB1dCBidWZmZXIuCisgKiAgICAgICAgICAgIFlvdSBjYW4gY3JlYXRlIHN1Y2ggcGFja2V0IHdpdGggYXZfaW5pdF9wYWNrZXQoKSBhbmQgYnkgdGhlbiBzZXR0aW5nCisgKiAgICAgICAgICAgIGRhdGEgYW5kIHNpemUsIHNvbWUgZGVjb2RlcnMgbWlnaHQgaW4gYWRkaXRpb24gbmVlZCBvdGhlciBmaWVsZHMgbGlrZQorICogICAgICAgICAgICBmbGFncyZBVl9QS1RfRkxBR19LRVkuIEFsbCBkZWNvZGVycyBhcmUgZGVzaWduZWQgdG8gdXNlIHRoZSBsZWFzdAorICogICAgICAgICAgICBmaWVsZHMgcG9zc2libGUuCisgKiBAcGFyYW1baW4sb3V0XSBnb3RfcGljdHVyZV9wdHIgWmVybyBpZiBubyBmcmFtZSBjb3VsZCBiZSBkZWNvbXByZXNzZWQsIG90aGVyd2lzZSwgaXQgaXMgbm9uemVyby4KKyAqIEByZXR1cm4gT24gZXJyb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqIHVzZWQgb3IgemVybyBpZiBubyBmcmFtZSBjb3VsZCBiZSBkZWNvbXByZXNzZWQuCisgKi8KK2ludCBhdmNvZGVjX2RlY29kZV92aWRlbzIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3BpY3R1cmVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWUGFja2V0ICphdnBrdCk7CisKKy8qKgorICogRGVjb2RlIGEgc3VidGl0bGUgbWVzc2FnZS4KKyAqIFJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZC4KKyAqIElmIG5vIHN1YnRpdGxlIGNvdWxkIGJlIGRlY29tcHJlc3NlZCwgZ290X3N1Yl9wdHIgaXMgemVyby4KKyAqIE90aGVyd2lzZSwgdGhlIHN1YnRpdGxlIGlzIHN0b3JlZCBpbiAqc3ViLgorICogTm90ZSB0aGF0IENPREVDX0NBUF9EUjEgaXMgbm90IGF2YWlsYWJsZSBmb3Igc3VidGl0bGUgY29kZWNzLiBUaGlzIGlzIGZvcgorICogc2ltcGxpY2l0eSwgYmVjYXVzZSB0aGUgcGVyZm9ybWFuY2UgZGlmZmVyZW5jZSBpcyBleHBlY3QgdG8gYmUgbmVnbGlnaWJsZQorICogYW5kIHJldXNpbmcgYSBnZXRfYnVmZmVyIHdyaXR0ZW4gZm9yIHZpZGVvIGNvZGVjcyB3b3VsZCBwcm9iYWJseSBwZXJmb3JtIGJhZGx5CisgKiBkdWUgdG8gYSBwb3RlbnRpYWxseSB2ZXJ5IGRpZmZlcmVudCBhbGxvY2F0aW9uIHBhdHRlcm4uCisgKgorICogU29tZSBkZWNvZGVycyAodGhvc2UgbWFya2VkIHdpdGggQ09ERUNfQ0FQX0RFTEFZKSBoYXZlIGEgZGVsYXkgYmV0d2VlbiBpbnB1dAorICogYW5kIG91dHB1dC4gVGhpcyBtZWFucyB0aGF0IGZvciBzb21lIHBhY2tldHMgdGhleSB3aWxsIG5vdCBpbW1lZGlhdGVseQorICogcHJvZHVjZSBkZWNvZGVkIG91dHB1dCBhbmQgbmVlZCB0byBiZSBmbHVzaGVkIGF0IHRoZSBlbmQgb2YgZGVjb2RpbmcgdG8gZ2V0CisgKiBhbGwgdGhlIGRlY29kZWQgZGF0YS4gRmx1c2hpbmcgaXMgZG9uZSBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBwYWNrZXRzCisgKiB3aXRoIGF2cGt0LT5kYXRhIHNldCB0byBOVUxMIGFuZCBhdnBrdC0+c2l6ZSBzZXQgdG8gMCB1bnRpbCBpdCBzdG9wcworICogcmV0dXJuaW5nIHN1YnRpdGxlcy4gSXQgaXMgc2FmZSB0byBmbHVzaCBldmVuIHRob3NlIGRlY29kZXJzIHRoYXQgYXJlIG5vdAorICogbWFya2VkIHdpdGggQ09ERUNfQ0FQX0RFTEFZLCB0aGVuIG5vIHN1YnRpdGxlcyB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIEBwYXJhbSBhdmN0eCB0aGUgY29kZWMgY29udGV4dAorICogQHBhcmFtW291dF0gc3ViIFRoZSBQcmVhbGxvY2F0ZWQgQVZTdWJ0aXRsZSBpbiB3aGljaCB0aGUgZGVjb2RlZCBzdWJ0aXRsZSB3aWxsIGJlIHN0b3JlZCwKKyAqICAgICAgICAgICAgICAgICBtdXN0IGJlIGZyZWVkIHdpdGggYXZzdWJ0aXRsZV9mcmVlIGlmICpnb3Rfc3ViX3B0ciBpcyBzZXQuCisgKiBAcGFyYW1baW4sb3V0XSBnb3Rfc3ViX3B0ciBaZXJvIGlmIG5vIHN1YnRpdGxlIGNvdWxkIGJlIGRlY29tcHJlc3NlZCwgb3RoZXJ3aXNlLCBpdCBpcyBub256ZXJvLgorICogQHBhcmFtW2luXSBhdnBrdCBUaGUgaW5wdXQgQVZQYWNrZXQgY29udGFpbmluZyB0aGUgaW5wdXQgYnVmZmVyLgorICovCitpbnQgYXZjb2RlY19kZWNvZGVfc3VidGl0bGUyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZTdWJ0aXRsZSAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3N1Yl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KTsKKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2Y19wYXJzaW5nIEZyYW1lIHBhcnNpbmcKKyAqIEB7CisgKi8KKworZW51bSBBVlBpY3R1cmVTdHJ1Y3R1cmUgeworICAgIEFWX1BJQ1RVUkVfU1RSVUNUVVJFX1VOS05PV04sICAgICAgLy88IHVua25vd24KKyAgICBBVl9QSUNUVVJFX1NUUlVDVFVSRV9UT1BfRklFTEQsICAgIC8vPCBjb2RlZCBhcyB0b3AgZmllbGQKKyAgICBBVl9QSUNUVVJFX1NUUlVDVFVSRV9CT1RUT01fRklFTEQsIC8vPCBjb2RlZCBhcyBib3R0b20gZmllbGQKKyAgICBBVl9QSUNUVVJFX1NUUlVDVFVSRV9GUkFNRSwgICAgICAgIC8vPCBjb2RlZCBhcyBmcmFtZQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgQVZDb2RlY1BhcnNlckNvbnRleHQgeworICAgIHZvaWQgKnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgQVZDb2RlY1BhcnNlciAqcGFyc2VyOworICAgIGludDY0X3QgZnJhbWVfb2Zmc2V0OyAvKiBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBpbnQ2NF90IGN1cl9vZmZzZXQ7IC8qIGN1cnJlbnQgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5jcmVtZW50ZWQgYnkgZWFjaCBhdl9wYXJzZXJfcGFyc2UoKSkgKi8KKyAgICBpbnQ2NF90IG5leHRfZnJhbWVfb2Zmc2V0OyAvKiBvZmZzZXQgb2YgdGhlIG5leHQgZnJhbWUgKi8KKyAgICAvKiB2aWRlbyBpbmZvICovCisgICAgaW50IHBpY3RfdHlwZTsgLyogWFhYOiBQdXQgaXQgYmFjayBpbiBBVkNvZGVjQ29udGV4dC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIHByb3BlciBmcmFtZSBkdXJhdGlvbiBjb21wdXRhdGlvbiBpbiBsYXZmLgorICAgICAqIEl0IHNpZ25hbHMsIGhvdyBtdWNoIGxvbmdlciB0aGUgZnJhbWUgZHVyYXRpb24gb2YgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICAgKiBpcyBjb21wYXJlZCB0byBub3JtYWwgZnJhbWUgZHVyYXRpb24uCisgICAgICoKKyAgICAgKiBmcmFtZV9kdXJhdGlvbiA9ICgxICsgcmVwZWF0X3BpY3QpICogdGltZV9iYXNlCisgICAgICoKKyAgICAgKiBJdCBpcyB1c2VkIGJ5IGNvZGVjcyBsaWtlIEguMjY0IHRvIGRpc3BsYXkgdGVsZWNpbmVkIG1hdGVyaWFsLgorICAgICAqLworICAgIGludCByZXBlYXRfcGljdDsgLyogWFhYOiBQdXQgaXQgYmFjayBpbiBBVkNvZGVjQ29udGV4dC4gKi8KKyAgICBpbnQ2NF90IHB0czsgICAgIC8qIHB0cyBvZiB0aGUgY3VycmVudCBmcmFtZSAqLworICAgIGludDY0X3QgZHRzOyAgICAgLyogZHRzIG9mIHRoZSBjdXJyZW50IGZyYW1lICovCisKKyAgICAvKiBwcml2YXRlIGRhdGEgKi8KKyAgICBpbnQ2NF90IGxhc3RfcHRzOworICAgIGludDY0X3QgbGFzdF9kdHM7CisgICAgaW50IGZldGNoX3RpbWVzdGFtcDsKKworI2RlZmluZSBBVl9QQVJTRVJfUFRTX05CIDQKKyAgICBpbnQgY3VyX2ZyYW1lX3N0YXJ0X2luZGV4OworICAgIGludDY0X3QgY3VyX2ZyYW1lX29mZnNldFtBVl9QQVJTRVJfUFRTX05CXTsKKyAgICBpbnQ2NF90IGN1cl9mcmFtZV9wdHNbQVZfUEFSU0VSX1BUU19OQl07CisgICAgaW50NjRfdCBjdXJfZnJhbWVfZHRzW0FWX1BBUlNFUl9QVFNfTkJdOworCisgICAgaW50IGZsYWdzOworI2RlZmluZSBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVMgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQQVJTRVJfRkxBR19PTkNFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorLy8vIFNldCBpZiB0aGUgcGFyc2VyIGhhcyBhIHZhbGlkIGZpbGUgb2Zmc2V0CisjZGVmaW5lIFBBUlNFUl9GTEFHX0ZFVENIRURfT0ZGU0VUICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFBBUlNFUl9GTEFHX1VTRV9DT0RFQ19UUyAgICAgICAgICAgICAgMHgxMDAwCisKKyAgICBpbnQ2NF90IG9mZnNldDsgICAgICAvLy88IGJ5dGUgb2Zmc2V0IGZyb20gc3RhcnRpbmcgcGFja2V0IHN0YXJ0CisgICAgaW50NjRfdCBjdXJfZnJhbWVfZW5kW0FWX1BBUlNFUl9QVFNfTkJdOworCisgICAgLyoqCisgICAgICogU2V0IGJ5IHBhcnNlciB0byAxIGZvciBrZXkgZnJhbWVzIGFuZCAwIGZvciBub24ta2V5IGZyYW1lcy4KKyAgICAgKiBJdCBpcyBpbml0aWFsaXplZCB0byAtMSwgc28gaWYgdGhlIHBhcnNlciBkb2Vzbid0IHNldCB0aGlzIGZsYWcsCisgICAgICogb2xkLXN0eWxlIGZhbGxiYWNrIHVzaW5nIEFWX1BJQ1RVUkVfVFlQRV9JIHBpY3R1cmUgdHlwZSBhcyBrZXkgZnJhbWVzCisgICAgICogd2lsbCBiZSB1c2VkLgorICAgICAqLworICAgIGludCBrZXlfZnJhbWU7CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGRpZmZlcmVuY2UgaW4gc3RyZWFtIHRpbWUgYmFzZSB1bml0cyBmcm9tIHRoZSBwdHMgb2YgdGhpcworICAgICAqIHBhY2tldCB0byB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIG91dHB1dCBmcm9tIHRoZSBkZWNvZGVyIGhhcyBjb252ZXJnZWQKKyAgICAgKiBpbmRlcGVuZGVudCBmcm9tIHRoZSBhdmFpbGFiaWxpdHkgb2YgcHJldmlvdXMgZnJhbWVzLiBUaGF0IGlzLCB0aGUKKyAgICAgKiBmcmFtZXMgYXJlIHZpcnR1YWxseSBpZGVudGljYWwgbm8gbWF0dGVyIGlmIGRlY29kaW5nIHN0YXJ0ZWQgZnJvbQorICAgICAqIHRoZSB2ZXJ5IGZpcnN0IGZyYW1lIG9yIGZyb20gdGhpcyBrZXlmcmFtZS4KKyAgICAgKiBJcyBBVl9OT1BUU19WQUxVRSBpZiB1bmtub3duLgorICAgICAqIFRoaXMgZmllbGQgaXMgbm90IHRoZSBkaXNwbGF5IGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGZyYW1lLgorICAgICAqIFRoaXMgZmllbGQgaGFzIG5vIG1lYW5pbmcgaWYgdGhlIHBhY2tldCBkb2VzIG5vdCBoYXZlIEFWX1BLVF9GTEFHX0tFWQorICAgICAqIHNldC4KKyAgICAgKgorICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgZmllbGQgaXMgdG8gYWxsb3cgc2Vla2luZyBpbiBzdHJlYW1zIHRoYXQgaGF2ZSBubworICAgICAqIGtleWZyYW1lcyBpbiB0aGUgY29udmVudGlvbmFsIHNlbnNlLiBJdCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiByZWNvdmVyeSBwb2ludCBTRUkgaW4gSC4yNjQgYW5kIG1hdGNoX3RpbWVfZGVsdGEgaW4gTlVULiBJdCBpcyBhbHNvCisgICAgICogZXNzZW50aWFsIGZvciBzb21lIHR5cGVzIG9mIHN1YnRpdGxlIHN0cmVhbXMgdG8gZW5zdXJlIHRoYXQgYWxsCisgICAgICogc3VidGl0bGVzIGFyZSBjb3JyZWN0bHkgZGlzcGxheWVkIGFmdGVyIHNlZWtpbmcuCisgICAgICovCisgICAgaW50NjRfdCBjb252ZXJnZW5jZV9kdXJhdGlvbjsKKworICAgIC8vIFRpbWVzdGFtcCBnZW5lcmF0aW9uIHN1cHBvcnQ6CisgICAgLyoqCisgICAgICogU3luY2hyb25pemF0aW9uIHBvaW50IGZvciBzdGFydCBvZiB0aW1lc3RhbXAgZ2VuZXJhdGlvbi4KKyAgICAgKgorICAgICAqIFNldCB0byA+MCBmb3Igc3luYyBwb2ludCwgMCBmb3Igbm8gc3luYyBwb2ludCBhbmQgPDAgZm9yIHVuZGVmaW5lZAorICAgICAqIChkZWZhdWx0KS4KKyAgICAgKgorICAgICAqIEZvciBleGFtcGxlLCB0aGlzIGNvcnJlc3BvbmRzIHRvIHByZXNlbmNlIG9mIEguMjY0IGJ1ZmZlcmluZyBwZXJpb2QKKyAgICAgKiBTRUkgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBpbnQgZHRzX3N5bmNfcG9pbnQ7CisKKyAgICAvKioKKyAgICAgKiBPZmZzZXQgb2YgdGhlIGN1cnJlbnQgdGltZXN0YW1wIGFnYWluc3QgbGFzdCB0aW1lc3RhbXAgc3luYyBwb2ludCBpbgorICAgICAqIHVuaXRzIG9mIEFWQ29kZWNDb250ZXh0LnRpbWVfYmFzZS4KKyAgICAgKgorICAgICAqIFNldCB0byBJTlRfTUlOIHdoZW4gZHRzX3N5bmNfcG9pbnQgdW51c2VkLiBPdGhlcndpc2UsIGl0IG11c3QKKyAgICAgKiBjb250YWluIGEgdmFsaWQgdGltZXN0YW1wIG9mZnNldC4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGUgdGltZXN0YW1wIG9mIHN5bmMgcG9pbnQgaGFzIHVzdWFsbHkgYSBub256ZXJvCisgICAgICogZHRzX3JlZl9kdHNfZGVsdGEsIHdoaWNoIHJlZmVycyB0byB0aGUgcHJldmlvdXMgc3luYyBwb2ludC4gT2Zmc2V0IG9mCisgICAgICogdGhlIG5leHQgZnJhbWUgYWZ0ZXIgdGltZXN0YW1wIHN5bmMgcG9pbnQgd2lsbCBiZSB1c3VhbGx5IDEuCisgICAgICoKKyAgICAgKiBGb3IgZXhhbXBsZSwgdGhpcyBjb3JyZXNwb25kcyB0byBILjI2NCBjcGJfcmVtb3ZhbF9kZWxheS4KKyAgICAgKi8KKyAgICBpbnQgZHRzX3JlZl9kdHNfZGVsdGE7CisKKyAgICAvKioKKyAgICAgKiBQcmVzZW50YXRpb24gZGVsYXkgb2YgY3VycmVudCBmcmFtZSBpbiB1bml0cyBvZiBBVkNvZGVjQ29udGV4dC50aW1lX2Jhc2UuCisgICAgICoKKyAgICAgKiBTZXQgdG8gSU5UX01JTiB3aGVuIGR0c19zeW5jX3BvaW50IHVudXNlZC4gT3RoZXJ3aXNlLCBpdCBtdXN0CisgICAgICogY29udGFpbiB2YWxpZCBub24tbmVnYXRpdmUgdGltZXN0YW1wIGRlbHRhIChwcmVzZW50YXRpb24gdGltZSBvZiBhIGZyYW1lCisgICAgICogbXVzdCBub3QgbGllIGluIHRoZSBwYXN0KS4KKyAgICAgKgorICAgICAqIFRoaXMgZGVsYXkgcmVwcmVzZW50cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGRlY29kaW5nIGFuZCBwcmVzZW50YXRpb24KKyAgICAgKiB0aW1lIG9mIHRoZSBmcmFtZS4KKyAgICAgKgorICAgICAqIEZvciBleGFtcGxlLCB0aGlzIGNvcnJlc3BvbmRzIHRvIEguMjY0IGRwYl9vdXRwdXRfZGVsYXkuCisgICAgICovCisgICAgaW50IHB0c19kdHNfZGVsdGE7CisKKyAgICAvKioKKyAgICAgKiBQb3NpdGlvbiBvZiB0aGUgcGFja2V0IGluIGZpbGUuCisgICAgICoKKyAgICAgKiBBbmFsb2dvdXMgdG8gY3VyX2ZyYW1lX3B0cy9kdHMKKyAgICAgKi8KKyAgICBpbnQ2NF90IGN1cl9mcmFtZV9wb3NbQVZfUEFSU0VSX1BUU19OQl07CisKKyAgICAvKioKKyAgICAgKiBCeXRlIHBvc2l0aW9uIG9mIGN1cnJlbnRseSBwYXJzZWQgZnJhbWUgaW4gc3RyZWFtLgorICAgICAqLworICAgIGludDY0X3QgcG9zOworCisgICAgLyoqCisgICAgICogUHJldmlvdXMgZnJhbWUgYnl0ZSBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBpbnQ2NF90IGxhc3RfcG9zOworCisgICAgLyoqCisgICAgICogRHVyYXRpb24gb2YgdGhlIGN1cnJlbnQgZnJhbWUuCisgICAgICogRm9yIGF1ZGlvLCB0aGlzIGlzIGluIHVuaXRzIG9mIDEgLyBBVkNvZGVjQ29udGV4dC5zYW1wbGVfcmF0ZS4KKyAgICAgKiBGb3IgYWxsIG90aGVyIHR5cGVzLCB0aGlzIGlzIGluIHVuaXRzIG9mIEFWQ29kZWNDb250ZXh0LnRpbWVfYmFzZS4KKyAgICAgKi8KKyAgICBpbnQgZHVyYXRpb247CisKKyAgICBlbnVtIEFWRmllbGRPcmRlciBmaWVsZF9vcmRlcjsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgYSBwaWN0dXJlIGlzIGNvZGVkIGFzIGEgZnJhbWUsIHRvcCBmaWVsZCBvciBib3R0b20gZmllbGQuCisgICAgICoKKyAgICAgKiBGb3IgZXhhbXBsZSwgSC4yNjQgZmllbGRfcGljX2ZsYWcgZXF1YWwgdG8gMCBjb3JyZXNwb25kcyB0bworICAgICAqIEFWX1BJQ1RVUkVfU1RSVUNUVVJFX0ZSQU1FLiBBbiBILjI2NCBwaWN0dXJlIHdpdGggZmllbGRfcGljX2ZsYWcKKyAgICAgKiBlcXVhbCB0byAxIGFuZCBib3R0b21fZmllbGRfZmxhZyBlcXVhbCB0byAwIGNvcnJlc3BvbmRzIHRvCisgICAgICogQVZfUElDVFVSRV9TVFJVQ1RVUkVfVE9QX0ZJRUxELgorICAgICAqLworICAgIGVudW0gQVZQaWN0dXJlU3RydWN0dXJlIHBpY3R1cmVfc3RydWN0dXJlOworCisgICAgLyoqCisgICAgICogUGljdHVyZSBudW1iZXIgaW5jcmVtZW50ZWQgaW4gcHJlc2VudGF0aW9uIG9yIG91dHB1dCBvcmRlci4KKyAgICAgKiBUaGlzIGZpZWxkIG1heSBiZSByZWluaXRpYWxpemVkIGF0IHRoZSBmaXJzdCBwaWN0dXJlIG9mIGEgbmV3IHNlcXVlbmNlLgorICAgICAqCisgICAgICogRm9yIGV4YW1wbGUsIHRoaXMgY29ycmVzcG9uZHMgdG8gSC4yNjQgUGljT3JkZXJDbnQuCisgICAgICovCisgICAgaW50IG91dHB1dF9waWN0dXJlX251bWJlcjsKK30gQVZDb2RlY1BhcnNlckNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IEFWQ29kZWNQYXJzZXIgeworICAgIGludCBjb2RlY19pZHNbNV07IC8qIHNldmVyYWwgY29kZWMgSURzIGFyZSBwZXJtaXR0ZWQgKi8KKyAgICBpbnQgcHJpdl9kYXRhX3NpemU7CisgICAgaW50ICgqcGFyc2VyX2luaXQpKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzKTsKKyAgICBpbnQgKCpwYXJzZXJfcGFyc2UpKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpOworICAgIHZvaWQgKCpwYXJzZXJfY2xvc2UpKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzKTsKKyAgICBpbnQgKCpzcGxpdCkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSk7CisgICAgc3RydWN0IEFWQ29kZWNQYXJzZXIgKm5leHQ7Cit9IEFWQ29kZWNQYXJzZXI7CisKK0FWQ29kZWNQYXJzZXIgKmF2X3BhcnNlcl9uZXh0KGNvbnN0IEFWQ29kZWNQYXJzZXIgKmMpOworCit2b2lkIGF2X3JlZ2lzdGVyX2NvZGVjX3BhcnNlcihBVkNvZGVjUGFyc2VyICpwYXJzZXIpOworQVZDb2RlY1BhcnNlckNvbnRleHQgKmF2X3BhcnNlcl9pbml0KGludCBjb2RlY19pZCk7CisKKy8qKgorICogUGFyc2UgYSBwYWNrZXQuCisgKgorICogQHBhcmFtIHMgICAgICAgICAgICAgcGFyc2VyIGNvbnRleHQuCisgKiBAcGFyYW0gYXZjdHggICAgICAgICBjb2RlYyBjb250ZXh0LgorICogQHBhcmFtIHBvdXRidWYgICAgICAgc2V0IHRvIHBvaW50ZXIgdG8gcGFyc2VkIGJ1ZmZlciBvciBOVUxMIGlmIG5vdCB5ZXQgZmluaXNoZWQuCisgKiBAcGFyYW0gcG91dGJ1Zl9zaXplICBzZXQgdG8gc2l6ZSBvZiBwYXJzZWQgYnVmZmVyIG9yIHplcm8gaWYgbm90IHlldCBmaW5pc2hlZC4KKyAqIEBwYXJhbSBidWYgICAgICAgICAgIGlucHV0IGJ1ZmZlci4KKyAqIEBwYXJhbSBidWZfc2l6ZSAgICAgIGlucHV0IGxlbmd0aCwgdG8gc2lnbmFsIEVPRiwgdGhpcyBzaG91bGQgYmUgMCAoc28gdGhhdCB0aGUgbGFzdCBmcmFtZSBjYW4gYmUgb3V0cHV0KS4KKyAqIEBwYXJhbSBwdHMgICAgICAgICAgIGlucHV0IHByZXNlbnRhdGlvbiB0aW1lc3RhbXAuCisgKiBAcGFyYW0gZHRzICAgICAgICAgICBpbnB1dCBkZWNvZGluZyB0aW1lc3RhbXAuCisgKiBAcGFyYW0gcG9zICAgICAgICAgICBpbnB1dCBieXRlIHBvc2l0aW9uIGluIHN0cmVhbS4KKyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVzZWQuCisgKgorICogRXhhbXBsZToKKyAqIEBjb2RlCisgKiAgIHdoaWxlKGluX2xlbil7CisgKiAgICAgICBsZW4gPSBhdl9wYXJzZXJfcGFyc2UyKG15cGFyc2VyLCBBVkNvZGVjQ29udGV4dCwgJmRhdGEsICZzaXplLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZGF0YSwgaW5fbGVuLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRzLCBkdHMsIHBvcyk7CisgKiAgICAgICBpbl9kYXRhICs9IGxlbjsKKyAqICAgICAgIGluX2xlbiAgLT0gbGVuOworICoKKyAqICAgICAgIGlmKHNpemUpCisgKiAgICAgICAgICBkZWNvZGVfZnJhbWUoZGF0YSwgc2l6ZSk7CisgKiAgIH0KKyAqIEBlbmRjb2RlCisgKi8KK2ludCBhdl9wYXJzZXJfcGFyc2UyKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cywgaW50NjRfdCBkdHMsCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvcyk7CisKKy8qKgorICogQHJldHVybiAwIGlmIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGEgc3Vic2V0IG9mIHRoZSBpbnB1dCwgMSBpZiBpdCBpcyBhbGxvY2F0ZWQgYW5kIG11c3QgYmUgZnJlZWQKKyAqIEBkZXByZWNhdGVkIHVzZSBBVkJpdFN0cmVhbUZpbHRlcgorICovCitpbnQgYXZfcGFyc2VyX2NoYW5nZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQga2V5ZnJhbWUpOwordm9pZCBhdl9wYXJzZXJfY2xvc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMpOworCisvKioKKyAqIEB9CisgKiBAfQorICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgbGF2Y19lbmNvZGluZworICogQHsKKyAqLworCisvKioKKyAqIEZpbmQgYSByZWdpc3RlcmVkIGVuY29kZXIgd2l0aCBhIG1hdGNoaW5nIGNvZGVjIElELgorICoKKyAqIEBwYXJhbSBpZCBBVkNvZGVjSUQgb2YgdGhlIHJlcXVlc3RlZCBlbmNvZGVyCisgKiBAcmV0dXJuIEFuIGVuY29kZXIgaWYgb25lIHdhcyBmb3VuZCwgTlVMTCBvdGhlcndpc2UuCisgKi8KK0FWQ29kZWMgKmF2Y29kZWNfZmluZF9lbmNvZGVyKGVudW0gQVZDb2RlY0lEIGlkKTsKKworLyoqCisgKiBGaW5kIGEgcmVnaXN0ZXJlZCBlbmNvZGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICoKKyAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBlbmNvZGVyCisgKiBAcmV0dXJuIEFuIGVuY29kZXIgaWYgb25lIHdhcyBmb3VuZCwgTlVMTCBvdGhlcndpc2UuCisgKi8KK0FWQ29kZWMgKmF2Y29kZWNfZmluZF9lbmNvZGVyX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSk7CisKKyNpZiBGRl9BUElfT0xEX0VOQ09ERV9BVURJTworLyoqCisgKiBFbmNvZGUgYW4gYXVkaW8gZnJhbWUgZnJvbSBzYW1wbGVzIGludG8gYnVmLgorICoKKyAqIEBkZXByZWNhdGVkIFVzZSBhdmNvZGVjX2VuY29kZV9hdWRpbzIgaW5zdGVhZC4KKyAqCisgKiBAbm90ZSBUaGUgb3V0cHV0IGJ1ZmZlciBzaG91bGQgYmUgYXQgbGVhc3QgRkZfTUlOX0JVRkZFUl9TSVpFIGJ5dGVzIGxhcmdlLgorICogSG93ZXZlciwgZm9yIGNvZGVjcyB3aXRoIGF2Y3R4LT5mcmFtZV9zaXplIGVxdWFsIHRvIDAgKGUuZy4gUENNKSB0aGUgdXNlcgorICogd2lsbCBrbm93IGhvdyBtdWNoIHNwYWNlIGlzIG5lZWRlZCBiZWNhdXNlIGl0IGRlcGVuZHMgb24gdGhlIHZhbHVlIHBhc3NlZAorICogaW4gYnVmX3NpemUgYXMgZGVzY3JpYmVkIGJlbG93LiBJbiB0aGF0IGNhc2UgYSBsb3dlciB2YWx1ZSBjYW4gYmUgdXNlZC4KKyAqCisgKiBAcGFyYW0gYXZjdHggdGhlIGNvZGVjIGNvbnRleHQKKyAqIEBwYXJhbVtvdXRdIGJ1ZiB0aGUgb3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtW2luXSBidWZfc2l6ZSB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplCisgKiBAcGFyYW1baW5dIHNhbXBsZXMgdGhlIGlucHV0IGJ1ZmZlciBjb250YWluaW5nIHRoZSBzYW1wbGVzCisgKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZCBmcm9tIHRoaXMgYnVmZmVyIGlzIGZyYW1lX3NpemUqY2hhbm5lbHMsCisgKiBib3RoIG9mIHdoaWNoIGFyZSBkZWZpbmVkIGluIGF2Y3R4LgorICogRm9yIGNvZGVjcyB3aGljaCBoYXZlIGF2Y3R4LT5mcmFtZV9zaXplIGVxdWFsIHRvIDAgKGUuZy4gUENNKSB0aGUgbnVtYmVyIG9mCisgKiBzYW1wbGVzIHJlYWQgZnJvbSBzYW1wbGVzIGlzIGVxdWFsIHRvOgorICogYnVmX3NpemUgKiA4IC8gKGF2Y3R4LT5jaGFubmVscyAqIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoYXZjdHgtPmNvZGVjX2lkKSkKKyAqIFRoaXMgYWxzbyBpbXBsaWVzIHRoYXQgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZSgpIG11c3Qgbm90IHJldHVybiAwIGZvciB0aGVzZQorICogY29kZWNzLgorICogQHJldHVybiBPbiBlcnJvciBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJldHVybmVkLCBvbiBzdWNjZXNzIHplcm8gb3IgdGhlIG51bWJlcgorICogb2YgYnl0ZXMgdXNlZCB0byBlbmNvZGUgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSBpbnB1dCBidWZmZXIuCisgKi8KK2ludCBhdHRyaWJ1dGVfZGVwcmVjYXRlZCBhdmNvZGVjX2VuY29kZV9hdWRpbyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgKnNhbXBsZXMpOworI2VuZGlmCisKKy8qKgorICogRW5jb2RlIGEgZnJhbWUgb2YgYXVkaW8uCisgKgorICogVGFrZXMgaW5wdXQgc2FtcGxlcyBmcm9tIGZyYW1lIGFuZCB3cml0ZXMgdGhlIG5leHQgb3V0cHV0IHBhY2tldCwgaWYKKyAqIGF2YWlsYWJsZSwgdG8gYXZwa3QuIFRoZSBvdXRwdXQgcGFja2V0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNvbnRhaW4gZGF0YSBmb3IKKyAqIHRoZSBtb3N0IHJlY2VudCBmcmFtZSwgYXMgZW5jb2RlcnMgY2FuIGRlbGF5LCBzcGxpdCwgYW5kIGNvbWJpbmUgaW5wdXQgZnJhbWVzCisgKiBpbnRlcm5hbGx5IGFzIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gYXZjdHggICAgIGNvZGVjIGNvbnRleHQKKyAqIEBwYXJhbSBhdnBrdCAgICAgb3V0cHV0IEFWUGFja2V0LgorICogICAgICAgICAgICAgICAgICBUaGUgdXNlciBjYW4gc3VwcGx5IGFuIG91dHB1dCBidWZmZXIgYnkgc2V0dGluZworICogICAgICAgICAgICAgICAgICBhdnBrdC0+ZGF0YSBhbmQgYXZwa3QtPnNpemUgcHJpb3IgdG8gY2FsbGluZyB0aGUKKyAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIGJ1dCBpZiB0aGUgc2l6ZSBvZiB0aGUgdXNlci1wcm92aWRlZCBkYXRhIGlzIG5vdAorICogICAgICAgICAgICAgICAgICBsYXJnZSBlbm91Z2gsIGVuY29kaW5nIHdpbGwgZmFpbC4gSWYgYXZwa3QtPmRhdGEgYW5kCisgKiAgICAgICAgICAgICAgICAgIGF2cGt0LT5zaXplIGFyZSBzZXQsIGF2cGt0LT5kZXN0cnVjdCBtdXN0IGFsc28gYmUgc2V0LiBBbGwKKyAqICAgICAgICAgICAgICAgICAgb3RoZXIgQVZQYWNrZXQgZmllbGRzIHdpbGwgYmUgcmVzZXQgYnkgdGhlIGVuY29kZXIgdXNpbmcKKyAqICAgICAgICAgICAgICAgICAgYXZfaW5pdF9wYWNrZXQoKS4gSWYgYXZwa3QtPmRhdGEgaXMgTlVMTCwgdGhlIGVuY29kZXIgd2lsbAorICogICAgICAgICAgICAgICAgICBhbGxvY2F0ZSBpdC4gVGhlIGVuY29kZXIgd2lsbCBzZXQgYXZwa3QtPnNpemUgdG8gdGhlIHNpemUKKyAqICAgICAgICAgICAgICAgICAgb2YgdGhlIG91dHB1dCBwYWNrZXQuCisgKgorICogICAgICAgICAgICAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzIG9yIHByb2R1Y2VzIG5vIG91dHB1dCwgYXZwa3Qgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICBmcmVlZCB1c2luZyBhdl9mcmVlX3BhY2tldCgpIChpLmUuIGF2cGt0LT5kZXN0cnVjdCB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB0byBmcmVlIHRoZSB1c2VyIHN1cHBsaWVkIGJ1ZmZlcikuCisgKiBAcGFyYW1baW5dIGZyYW1lIEFWRnJhbWUgY29udGFpbmluZyB0aGUgcmF3IGF1ZGlvIGRhdGEgdG8gYmUgZW5jb2RlZC4KKyAqICAgICAgICAgICAgICAgICAgTWF5IGJlIE5VTEwgd2hlbiBmbHVzaGluZyBhbiBlbmNvZGVyIHRoYXQgaGFzIHRoZQorICogICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfREVMQVkgY2FwYWJpbGl0eSBzZXQuCisgKiAgICAgICAgICAgICAgICAgIElmIENPREVDX0NBUF9WQVJJQUJMRV9GUkFNRV9TSVpFIGlzIHNldCwgdGhlbiBlYWNoIGZyYW1lCisgKiAgICAgICAgICAgICAgICAgIGNhbiBoYXZlIGFueSBudW1iZXIgb2Ygc2FtcGxlcy4KKyAqICAgICAgICAgICAgICAgICAgSWYgaXQgaXMgbm90IHNldCwgZnJhbWUtPm5iX3NhbXBsZXMgbXVzdCBiZSBlcXVhbCB0bworICogICAgICAgICAgICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSBmb3IgYWxsIGZyYW1lcyBleGNlcHQgdGhlIGxhc3QuCisgKiAgICAgICAgICAgICAgICAgIFRoZSBmaW5hbCBmcmFtZSBtYXkgYmUgc21hbGxlciB0aGFuIGF2Y3R4LT5mcmFtZV9zaXplLgorICogQHBhcmFtW291dF0gZ290X3BhY2tldF9wdHIgVGhpcyBmaWVsZCBpcyBzZXQgdG8gMSBieSBsaWJhdmNvZGVjIGlmIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBhY2tldCBpcyBub24tZW1wdHksIGFuZCB0byAwIGlmIGl0IGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eS4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IsIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0IGNhbiBiZSBhc3N1bWVkIHRvIGJlIGludmFsaWQsIGFuZCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIGdvdF9wYWNrZXRfcHRyIGlzIHVuZGVmaW5lZCBhbmQgc2hvdWxkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmUgdXNlZC4KKyAqIEByZXR1cm4gICAgICAgICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGF2Y29kZWNfZW5jb2RlX2F1ZGlvMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpOworCisjaWYgRkZfQVBJX09MRF9FTkNPREVfVklERU8KKy8qKgorICogQGRlcHJlY2F0ZWQgdXNlIGF2Y29kZWNfZW5jb2RlX3ZpZGVvMigpIGluc3RlYWQuCisgKgorICogRW5jb2RlIGEgdmlkZW8gZnJhbWUgZnJvbSBwaWN0IGludG8gYnVmLgorICogVGhlIGlucHV0IHBpY3R1cmUgc2hvdWxkIGJlCisgKiBzdG9yZWQgdXNpbmcgYSBzcGVjaWZpYyBmb3JtYXQsIG5hbWVseSBhdmN0eC5waXhfZm10LgorICoKKyAqIEBwYXJhbSBhdmN0eCB0aGUgY29kZWMgY29udGV4dAorICogQHBhcmFtW291dF0gYnVmIHRoZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYml0c3RyZWFtIG9mIGVuY29kZWQgZnJhbWUKKyAqIEBwYXJhbVtpbl0gYnVmX3NpemUgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIgaW4gYnl0ZXMKKyAqIEBwYXJhbVtpbl0gcGljdCB0aGUgaW5wdXQgcGljdHVyZSB0byBlbmNvZGUKKyAqIEByZXR1cm4gT24gZXJyb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZCwgb24gc3VjY2VzcyB6ZXJvIG9yIHRoZSBudW1iZXIKKyAqIG9mIGJ5dGVzIHVzZWQgZnJvbSB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK2ludCBhdmNvZGVjX2VuY29kZV92aWRlbyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpY3QpOworI2VuZGlmCisKKy8qKgorICogRW5jb2RlIGEgZnJhbWUgb2YgdmlkZW8uCisgKgorICogVGFrZXMgaW5wdXQgcmF3IHZpZGVvIGRhdGEgZnJvbSBmcmFtZSBhbmQgd3JpdGVzIHRoZSBuZXh0IG91dHB1dCBwYWNrZXQsIGlmCisgKiBhdmFpbGFibGUsIHRvIGF2cGt0LiBUaGUgb3V0cHV0IHBhY2tldCBkb2VzIG5vdCBuZWNlc3NhcmlseSBjb250YWluIGRhdGEgZm9yCisgKiB0aGUgbW9zdCByZWNlbnQgZnJhbWUsIGFzIGVuY29kZXJzIGNhbiBkZWxheSBhbmQgcmVvcmRlciBpbnB1dCBmcmFtZXMKKyAqIGludGVybmFsbHkgYXMgbmVlZGVkLgorICoKKyAqIEBwYXJhbSBhdmN0eCAgICAgY29kZWMgY29udGV4dAorICogQHBhcmFtIGF2cGt0ICAgICBvdXRwdXQgQVZQYWNrZXQuCisgKiAgICAgICAgICAgICAgICAgIFRoZSB1c2VyIGNhbiBzdXBwbHkgYW4gb3V0cHV0IGJ1ZmZlciBieSBzZXR0aW5nCisgKiAgICAgICAgICAgICAgICAgIGF2cGt0LT5kYXRhIGFuZCBhdnBrdC0+c2l6ZSBwcmlvciB0byBjYWxsaW5nIHRoZQorICogICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgYnV0IGlmIHRoZSBzaXplIG9mIHRoZSB1c2VyLXByb3ZpZGVkIGRhdGEgaXMgbm90CisgKiAgICAgICAgICAgICAgICAgIGxhcmdlIGVub3VnaCwgZW5jb2Rpbmcgd2lsbCBmYWlsLiBBbGwgb3RoZXIgQVZQYWNrZXQgZmllbGRzCisgKiAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcmVzZXQgYnkgdGhlIGVuY29kZXIgdXNpbmcgYXZfaW5pdF9wYWNrZXQoKS4gSWYKKyAqICAgICAgICAgICAgICAgICAgYXZwa3QtPmRhdGEgaXMgTlVMTCwgdGhlIGVuY29kZXIgd2lsbCBhbGxvY2F0ZSBpdC4KKyAqICAgICAgICAgICAgICAgICAgVGhlIGVuY29kZXIgd2lsbCBzZXQgYXZwa3QtPnNpemUgdG8gdGhlIHNpemUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgIG91dHB1dCBwYWNrZXQuIFRoZSByZXR1cm5lZCBkYXRhIChpZiBhbnkpIGJlbG9uZ3MgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgIGNhbGxlciwgaGUgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgaXQuCisgKgorICogICAgICAgICAgICAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzIG9yIHByb2R1Y2VzIG5vIG91dHB1dCwgYXZwa3Qgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICBmcmVlZCB1c2luZyBhdl9mcmVlX3BhY2tldCgpIChpLmUuIGF2cGt0LT5kZXN0cnVjdCB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB0byBmcmVlIHRoZSB1c2VyIHN1cHBsaWVkIGJ1ZmZlcikuCisgKiBAcGFyYW1baW5dIGZyYW1lIEFWRnJhbWUgY29udGFpbmluZyB0aGUgcmF3IHZpZGVvIGRhdGEgdG8gYmUgZW5jb2RlZC4KKyAqICAgICAgICAgICAgICAgICAgTWF5IGJlIE5VTEwgd2hlbiBmbHVzaGluZyBhbiBlbmNvZGVyIHRoYXQgaGFzIHRoZQorICogICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfREVMQVkgY2FwYWJpbGl0eSBzZXQuCisgKiBAcGFyYW1bb3V0XSBnb3RfcGFja2V0X3B0ciBUaGlzIGZpZWxkIGlzIHNldCB0byAxIGJ5IGxpYmF2Y29kZWMgaWYgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcGFja2V0IGlzIG5vbi1lbXB0eSwgYW5kIHRvIDAgaWYgaXQgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5LiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciwgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQgY2FuIGJlIGFzc3VtZWQgdG8gYmUgaW52YWxpZCwgYW5kIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgZ290X3BhY2tldF9wdHIgaXMgdW5kZWZpbmVkIGFuZCBzaG91bGQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSB1c2VkLgorICogQHJldHVybiAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgYXZjb2RlY19lbmNvZGVfdmlkZW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cik7CisKK2ludCBhdmNvZGVjX2VuY29kZV9zdWJ0aXRsZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWU3VidGl0bGUgKnN1Yik7CisKKworLyoqCisgKiBAfQorICovCisKKyNpZiBGRl9BUElfQVZDT0RFQ19SRVNBTVBMRQorLyoqCisgKiBAZGVmZ3JvdXAgbGF2Y19yZXNhbXBsZSBBdWRpbyByZXNhbXBsaW5nCisgKiBAaW5ncm91cCBsaWJhdmMKKyAqIEBkZXByZWNhdGVkIHVzZSBsaWJzd3Jlc2FtcGxlIGluc3RlYWQKKyAqCisgKiBAeworICovCitzdHJ1Y3QgUmVTYW1wbGVDb250ZXh0Oworc3RydWN0IEFWUmVzYW1wbGVDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBSZVNhbXBsZUNvbnRleHQgUmVTYW1wbGVDb250ZXh0OworCisvKioKKyAqICBJbml0aWFsaXplIGF1ZGlvIHJlc2FtcGxpbmcgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gb3V0cHV0X2NoYW5uZWxzICBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzCisgKiBAcGFyYW0gaW5wdXRfY2hhbm5lbHMgICBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMKKyAqIEBwYXJhbSBvdXRwdXRfcmF0ZSAgICAgIG91dHB1dCBzYW1wbGUgcmF0ZQorICogQHBhcmFtIGlucHV0X3JhdGUgICAgICAgaW5wdXQgc2FtcGxlIHJhdGUKKyAqIEBwYXJhbSBzYW1wbGVfZm10X291dCAgIHJlcXVlc3RlZCBvdXRwdXQgc2FtcGxlIGZvcm1hdAorICogQHBhcmFtIHNhbXBsZV9mbXRfaW4gICAgaW5wdXQgc2FtcGxlIGZvcm1hdAorICogQHBhcmFtIGZpbHRlcl9sZW5ndGggICAgbGVuZ3RoIG9mIGVhY2ggRklSIGZpbHRlciBpbiB0aGUgZmlsdGVyYmFuayByZWxhdGl2ZSB0byB0aGUgY3V0b2ZmIGZyZXF1ZW5jeQorICogQHBhcmFtIGxvZzJfcGhhc2VfY291bnQgbG9nMiBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBvbHlwaGFzZSBmaWx0ZXJiYW5rCisgKiBAcGFyYW0gbGluZWFyICAgICAgICAgICBpZiAxIHRoZW4gdGhlIHVzZWQgRklSIGZpbHRlciB3aWxsIGJlIGxpbmVhcmx5IGludGVycG9sYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiB0aGUgMiBjbG9zZXN0LCBpZiAwIHRoZSBjbG9zZXN0IHdpbGwgYmUgdXNlZAorICogQHBhcmFtIGN1dG9mZiAgICAgICAgICAgY3V0b2ZmIGZyZXF1ZW5jeSwgMS4wIGNvcnJlc3BvbmRzIHRvIGhhbGYgdGhlIG91dHB1dCBzYW1wbGluZyByYXRlCisgKiBAcmV0dXJuIGFsbG9jYXRlZCBSZVNhbXBsZUNvbnRleHQsIE5VTEwgaWYgZXJyb3Igb2NjdXJyZWQKKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK1JlU2FtcGxlQ29udGV4dCAqYXZfYXVkaW9fcmVzYW1wbGVfaW5pdChpbnQgb3V0cHV0X2NoYW5uZWxzLCBpbnQgaW5wdXRfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dF9yYXRlLCBpbnQgaW5wdXRfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsdGVyX2xlbmd0aCwgaW50IGxvZzJfcGhhc2VfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVhciwgZG91YmxlIGN1dG9mZik7CisKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitpbnQgYXVkaW9fcmVzYW1wbGUoUmVTYW1wbGVDb250ZXh0ICpzLCBzaG9ydCAqb3V0cHV0LCBzaG9ydCAqaW5wdXQsIGludCBuYl9zYW1wbGVzKTsKKworLyoqCisgKiBGcmVlIHJlc2FtcGxlIGNvbnRleHQuCisgKgorICogQHBhcmFtIHMgYSBub24tTlVMTCBwb2ludGVyIHRvIGEgcmVzYW1wbGUgY29udGV4dCBwcmV2aW91c2x5CisgKiAgICAgICAgICBjcmVhdGVkIHdpdGggYXZfYXVkaW9fcmVzYW1wbGVfaW5pdCgpCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCit2b2lkIGF1ZGlvX3Jlc2FtcGxlX2Nsb3NlKFJlU2FtcGxlQ29udGV4dCAqcyk7CisKKworLyoqCisgKiBJbml0aWFsaXplIGFuIGF1ZGlvIHJlc2FtcGxlci4KKyAqIE5vdGUsIGlmIGVpdGhlciByYXRlIGlzIG5vdCBhbiBpbnRlZ2VyIHRoZW4gc2ltcGx5IHNjYWxlIGJvdGggcmF0ZXMgdXAgc28gdGhleSBhcmUuCisgKiBAcGFyYW0gZmlsdGVyX2xlbmd0aCBsZW5ndGggb2YgZWFjaCBGSVIgZmlsdGVyIGluIHRoZSBmaWx0ZXJiYW5rIHJlbGF0aXZlIHRvIHRoZSBjdXRvZmYgZnJlcQorICogQHBhcmFtIGxvZzJfcGhhc2VfY291bnQgbG9nMiBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBvbHlwaGFzZSBmaWx0ZXJiYW5rCisgKiBAcGFyYW0gbGluZWFyIElmIDEgdGhlbiB0aGUgdXNlZCBGSVIgZmlsdGVyIHdpbGwgYmUgbGluZWFybHkgaW50ZXJwb2xhdGVkCisgICAgICAgICAgICAgICAgIGJldHdlZW4gdGhlIDIgY2xvc2VzdCwgaWYgMCB0aGUgY2xvc2VzdCB3aWxsIGJlIHVzZWQKKyAqIEBwYXJhbSBjdXRvZmYgY3V0b2ZmIGZyZXF1ZW5jeSwgMS4wIGNvcnJlc3BvbmRzIHRvIGhhbGYgdGhlIG91dHB1dCBzYW1wbGluZyByYXRlCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitzdHJ1Y3QgQVZSZXNhbXBsZUNvbnRleHQgKmF2X3Jlc2FtcGxlX2luaXQoaW50IG91dF9yYXRlLCBpbnQgaW5fcmF0ZSwgaW50IGZpbHRlcl9sZW5ndGgsIGludCBsb2cyX3BoYXNlX2NvdW50LCBpbnQgbGluZWFyLCBkb3VibGUgY3V0b2ZmKTsKKworLyoqCisgKiBSZXNhbXBsZSBhbiBhcnJheSBvZiBzYW1wbGVzIHVzaW5nIGEgcHJldmlvdXNseSBjb25maWd1cmVkIGNvbnRleHQuCisgKiBAcGFyYW0gc3JjIGFuIGFycmF5IG9mIHVuY29uc3VtZWQgc2FtcGxlcworICogQHBhcmFtIGNvbnN1bWVkIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiBzcmMgd2hpY2ggaGF2ZSBiZWVuIGNvbnN1bWVkIGFyZSByZXR1cm5lZCBoZXJlCisgKiBAcGFyYW0gc3JjX3NpemUgdGhlIG51bWJlciBvZiB1bmNvbnN1bWVkIHNhbXBsZXMgYXZhaWxhYmxlCisgKiBAcGFyYW0gZHN0X3NpemUgdGhlIGFtb3VudCBvZiBzcGFjZSBpbiBzYW1wbGVzIGF2YWlsYWJsZSBpbiBkc3QKKyAqIEBwYXJhbSB1cGRhdGVfY3R4IElmIHRoaXMgaXMgMCB0aGVuIHRoZSBjb250ZXh0IHdpbGwgbm90IGJlIG1vZGlmaWVkLCB0aGF0IHdheSBzZXZlcmFsIGNoYW5uZWxzIGNhbiBiZSByZXNhbXBsZWQgd2l0aCB0aGUgc2FtZSBjb250ZXh0LgorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgd3JpdHRlbiBpbiBkc3Qgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK2ludCBhdl9yZXNhbXBsZShzdHJ1Y3QgQVZSZXNhbXBsZUNvbnRleHQgKmMsIHNob3J0ICpkc3QsIHNob3J0ICpzcmMsIGludCAqY29uc3VtZWQsIGludCBzcmNfc2l6ZSwgaW50IGRzdF9zaXplLCBpbnQgdXBkYXRlX2N0eCk7CisKKworLyoqCisgKiBDb21wZW5zYXRlIHNhbXBsZXJhdGUvdGltZXN0YW1wIGRyaWZ0LiBUaGUgY29tcGVuc2F0aW9uIGlzIGRvbmUgYnkgY2hhbmdpbmcKKyAqIHRoZSByZXNhbXBsZXIgcGFyYW1ldGVycywgc28gbm8gYXVkaWJsZSBjbGlja3Mgb3Igc2ltaWxhciBkaXN0b3J0aW9ucyBvY2N1cgorICogQHBhcmFtIGNvbXBlbnNhdGlvbl9kaXN0YW5jZSBkaXN0YW5jZSBpbiBvdXRwdXQgc2FtcGxlcyBvdmVyIHdoaWNoIHRoZSBjb21wZW5zYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZAorICogQHBhcmFtIHNhbXBsZV9kZWx0YSBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMgd2hpY2ggc2hvdWxkIGJlIG91dHB1dCBsZXNzCisgKgorICogZXhhbXBsZTogYXZfcmVzYW1wbGVfY29tcGVuc2F0ZShjLCAxMCwgNTAwKQorICogaGVyZSBpbnN0ZWFkIG9mIDUxMCBzYW1wbGVzIG9ubHkgNTAwIHNhbXBsZXMgd291bGQgYmUgb3V0cHV0CisgKgorICogbm90ZSwgZHVlIHRvIHJvdW5kaW5nIHRoZSBhY3R1YWwgY29tcGVuc2F0aW9uIG1pZ2h0IGJlIHNsaWdodGx5IGRpZmZlcmVudCwKKyAqIGVzcGVjaWFsbHkgaWYgdGhlIGNvbXBlbnNhdGlvbl9kaXN0YW5jZSBpcyBsYXJnZSBhbmQgdGhlIGluX3JhdGUgdXNlZCBkdXJpbmcgaW5pdCBpcyBzbWFsbAorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAordm9pZCBhdl9yZXNhbXBsZV9jb21wZW5zYXRlKHN0cnVjdCBBVlJlc2FtcGxlQ29udGV4dCAqYywgaW50IHNhbXBsZV9kZWx0YSwgaW50IGNvbXBlbnNhdGlvbl9kaXN0YW5jZSk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAordm9pZCBhdl9yZXNhbXBsZV9jbG9zZShzdHJ1Y3QgQVZSZXNhbXBsZUNvbnRleHQgKmMpOworCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZgorCisvKioKKyAqIEBhZGR0b2dyb3VwIGxhdmNfcGljdHVyZQorICogQHsKKyAqLworCisvKioKKyAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBpeGVscyBvZiBhIHBpY3R1cmUgYW5kIHNldHVwIHRoZSBBVlBpY3R1cmUKKyAqIGZpZWxkcyBmb3IgaXQuCisgKgorICogQ2FsbCBhdnBpY3R1cmVfZnJlZSgpIHRvIGZyZWUgaXQuCisgKgorICogQHBhcmFtIHBpY3R1cmUgICAgICAgICAgICB0aGUgcGljdHVyZSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGluCisgKiBAcGFyYW0gcGl4X2ZtdCAgICAgICAgICAgIHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlIHBpY3R1cmUKKyAqIEBwYXJhbSB3aWR0aCAgICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBwaWN0dXJlCisgKiBAcGFyYW0gaGVpZ2h0ICAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHBpY3R1cmUKKyAqIEByZXR1cm4gemVybyBpZiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKgorICogQHNlZSBhdl9pbWFnZV9hbGxvYygpLCBhdnBpY3R1cmVfZmlsbCgpCisgKi8KK2ludCBhdnBpY3R1cmVfYWxsb2MoQVZQaWN0dXJlICpwaWN0dXJlLCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworLyoqCisgKiBGcmVlIGEgcGljdHVyZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBieSBhdnBpY3R1cmVfYWxsb2MoKS4KKyAqIFRoZSBkYXRhIGJ1ZmZlciB1c2VkIGJ5IHRoZSBBVlBpY3R1cmUgaXMgZnJlZWQsIGJ1dCB0aGUgQVZQaWN0dXJlIHN0cnVjdHVyZQorICogaXRzZWxmIGlzIG5vdC4KKyAqCisgKiBAcGFyYW0gcGljdHVyZSB0aGUgQVZQaWN0dXJlIHRvIGJlIGZyZWVkCisgKi8KK3ZvaWQgYXZwaWN0dXJlX2ZyZWUoQVZQaWN0dXJlICpwaWN0dXJlKTsKKworLyoqCisgKiBTZXR1cCB0aGUgcGljdHVyZSBmaWVsZHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBpbWFnZSBwYXJhbWV0ZXJzCisgKiBhbmQgdGhlIHByb3ZpZGVkIGltYWdlIGRhdGEgYnVmZmVyLgorICoKKyAqIFRoZSBwaWN0dXJlIGZpZWxkcyBhcmUgZmlsbGVkIGluIGJ5IHVzaW5nIHRoZSBpbWFnZSBkYXRhIGJ1ZmZlcgorICogcG9pbnRlZCB0byBieSBwdHIuCisgKgorICogSWYgcHRyIGlzIE5VTEwsIHRoZSBmdW5jdGlvbiB3aWxsIGZpbGwgb25seSB0aGUgcGljdHVyZSBsaW5lc2l6ZQorICogYXJyYXkgYW5kIHJldHVybiB0aGUgcmVxdWlyZWQgc2l6ZSBmb3IgdGhlIGltYWdlIGJ1ZmZlci4KKyAqCisgKiBUbyBhbGxvY2F0ZSBhbiBpbWFnZSBidWZmZXIgYW5kIGZpbGwgdGhlIHBpY3R1cmUgZGF0YSBpbiBvbmUgY2FsbCwKKyAqIHVzZSBhdnBpY3R1cmVfYWxsb2MoKS4KKyAqCisgKiBAcGFyYW0gcGljdHVyZSAgICAgICB0aGUgcGljdHVyZSB0byBiZSBmaWxsZWQgaW4KKyAqIEBwYXJhbSBwdHIgICAgICAgICAgIGJ1ZmZlciB3aGVyZSB0aGUgaW1hZ2UgZGF0YSBpcyBzdG9yZWQsIG9yIE5VTEwKKyAqIEBwYXJhbSBwaXhfZm10ICAgICAgIHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gd2lkdGggICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGluIHBpeGVscworICogQHBhcmFtIGhlaWdodCAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgaW4gcGl4ZWxzCisgKiBAcmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIHJlcXVpcmVkIGZvciBzcmMsIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICogaW4gY2FzZSBvZiBmYWlsdXJlCisgKgorICogQHNlZSBhdl9pbWFnZV9maWxsX2FycmF5cygpCisgKi8KK2ludCBhdnBpY3R1cmVfZmlsbChBVlBpY3R1cmUgKnBpY3R1cmUsIGNvbnN0IHVpbnQ4X3QgKnB0ciwKKyAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworLyoqCisgKiBDb3B5IHBpeGVsIGRhdGEgZnJvbSBhbiBBVlBpY3R1cmUgaW50byBhIGJ1ZmZlci4KKyAqCisgKiBhdnBpY3R1cmVfZ2V0X3NpemUoKSBjYW4gYmUgdXNlZCB0byBjb21wdXRlIHRoZSByZXF1aXJlZCBzaXplIGZvcgorICogdGhlIGJ1ZmZlciB0byBmaWxsLgorICoKKyAqIEBwYXJhbSBzcmMgICAgICAgIHNvdXJjZSBwaWN0dXJlIHdpdGggZmlsbGVkIGRhdGEKKyAqIEBwYXJhbSBwaXhfZm10ICAgIHBpY3R1cmUgcGl4ZWwgZm9ybWF0CisgKiBAcGFyYW0gd2lkdGggICAgICBwaWN0dXJlIHdpZHRoCisgKiBAcGFyYW0gaGVpZ2h0ICAgICBwaWN0dXJlIGhlaWdodAorICogQHBhcmFtIGRlc3QgICAgICAgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW0gZGVzdF9zaXplICBkZXN0aW5hdGlvbiBidWZmZXIgc2l6ZSBpbiBieXRlcworICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gZGVzdCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZQorICogKGVycm9yIGNvZGUpIG9uIGVycm9yLCBmb3IgZXhhbXBsZSBpZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGlzIG5vdAorICogYmlnIGVub3VnaAorICoKKyAqIEBzZWUgYXZfaW1hZ2VfY29weV90b19idWZmZXIoKQorICovCitpbnQgYXZwaWN0dXJlX2xheW91dChjb25zdCBBVlBpY3R1cmUgKnNyYywgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZXN0LCBpbnQgZGVzdF9zaXplKTsKKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIHNpemUgaW4gYnl0ZXMgdGhhdCBhIHBpY3R1cmUgb2YgdGhlIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQKKyAqIHdvdWxkIG9jY3VweSBpZiBzdG9yZWQgaW4gdGhlIGdpdmVuIHBpY3R1cmUgZm9ybWF0LgorICoKKyAqIEBwYXJhbSBwaXhfZm10ICAgIHBpY3R1cmUgcGl4ZWwgZm9ybWF0CisgKiBAcGFyYW0gd2lkdGggICAgICBwaWN0dXJlIHdpZHRoCisgKiBAcGFyYW0gaGVpZ2h0ICAgICBwaWN0dXJlIGhlaWdodAorICogQHJldHVybiB0aGUgY29tcHV0ZWQgcGljdHVyZSBidWZmZXIgc2l6ZSBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqIGluIGNhc2Ugb2YgZXJyb3IKKyAqCisgKiBAc2VlIGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZSgpLgorICovCitpbnQgYXZwaWN0dXJlX2dldF9zaXplKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisjaWYgRkZfQVBJX0RFSU5URVJMQUNFCisvKioKKyAqICBkZWludGVybGFjZSAtIGlmIG5vdCBzdXBwb3J0ZWQgcmV0dXJuIC0xCisgKgorICogQGRlcHJlY2F0ZWQgLSB1c2UgeWFkaWYgKGluIGxpYmF2ZmlsdGVyKSBpbnN0ZWFkCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitpbnQgYXZwaWN0dXJlX2RlaW50ZXJsYWNlKEFWUGljdHVyZSAqZHN0LCBjb25zdCBBVlBpY3R1cmUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisjZW5kaWYKKy8qKgorICogQ29weSBpbWFnZSBzcmMgdG8gZHN0LiBXcmFwcyBhdl9pbWFnZV9jb3B5KCkuCisgKi8KK3ZvaWQgYXZfcGljdHVyZV9jb3B5KEFWUGljdHVyZSAqZHN0LCBjb25zdCBBVlBpY3R1cmUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvKioKKyAqIENyb3AgaW1hZ2UgdG9wIGFuZCBsZWZ0IHNpZGUuCisgKi8KK2ludCBhdl9waWN0dXJlX2Nyb3AoQVZQaWN0dXJlICpkc3QsIGNvbnN0IEFWUGljdHVyZSAqc3JjLAorICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHRvcF9iYW5kLCBpbnQgbGVmdF9iYW5kKTsKKworLyoqCisgKiBQYWQgaW1hZ2UuCisgKi8KK2ludCBhdl9waWN0dXJlX3BhZChBVlBpY3R1cmUgKmRzdCwgY29uc3QgQVZQaWN0dXJlICpzcmMsIGludCBoZWlnaHQsIGludCB3aWR0aCwgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsCisgICAgICAgICAgICBpbnQgcGFkdG9wLCBpbnQgcGFkYm90dG9tLCBpbnQgcGFkbGVmdCwgaW50IHBhZHJpZ2h0LCBpbnQgKmNvbG9yKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIGxhdmNfbWlzYyBVdGlsaXR5IGZ1bmN0aW9ucworICogQGluZ3JvdXAgbGliYXZjCisgKgorICogTWlzY2VsbGFuZW91cyB1dGlsaXR5IGZ1bmN0aW9ucyByZWxhdGVkIHRvIGJvdGggZW5jb2RpbmcgYW5kIGRlY29kaW5nCisgKiAob3IgbmVpdGhlcikuCisgKiBAeworICovCisKKy8qKgorICogQGRlZmdyb3VwIGxhdmNfbWlzY19waXhmbXQgUGl4ZWwgZm9ybWF0cworICoKKyAqIEZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIHBpeGVsIGZvcm1hdHMuCisgKiBAeworICovCisKKy8qKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byBhY2Nlc3MgbG9nMl9jaHJvbWFfdyBsb2cyX2Nocm9tYV9oIGZyb20KKyAqIHRoZSBwaXhlbCBmb3JtYXQgQVZQaXhGbXREZXNjcmlwdG9yLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzZXJ0cyB0aGF0IHBpeF9mbXQgaXMgdmFsaWQuIFNlZSBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZQorICogZm9yIG9uZSB0aGF0IHJldHVybnMgYSBmYWlsdXJlIGNvZGUgYW5kIGNvbnRpbnVlcyBpbiBjYXNlIG9mIGludmFsaWQKKyAqIHBpeF9mbXRzLgorICoKKyAqIEBwYXJhbVtpbl0gIHBpeF9mbXQgdGhlIHBpeGVsIGZvcm1hdAorICogQHBhcmFtW291dF0gaF9zaGlmdCBzdG9yZSBsb2cyX2Nocm9tYV93CisgKiBAcGFyYW1bb3V0XSB2X3NoaWZ0IHN0b3JlIGxvZzJfY2hyb21hX2gKKyAqCisgKiBAc2VlIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlCisgKi8KKwordm9pZCBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50ICpoX3NoaWZ0LCBpbnQgKnZfc2hpZnQpOworCisvKioKKyAqIFJldHVybiBhIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgZm91ckNDIGNvZGUgYXNzb2NpYXRlZCB0byB0aGUKKyAqIHBpeGVsIGZvcm1hdCBwaXhfZm10LCBvciAwIGlmIG5vIGFzc29jaWF0ZWQgZm91ckNDIGNvZGUgY2FuIGJlCisgKiBmb3VuZC4KKyAqLwordW5zaWduZWQgaW50IGF2Y29kZWNfcGl4X2ZtdF90b19jb2RlY190YWcoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpOworCisvKioKKyAqIEBkZXByZWNhdGVkIHNlZSBhdl9nZXRfcGl4X2ZtdF9sb3NzKCkKKyAqLworaW50IGF2Y29kZWNfZ2V0X3BpeF9mbXRfbG9zcyhlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0X3BpeF9mbXQsIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNfcGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19hbHBoYSk7CisKKy8qKgorICogRmluZCB0aGUgYmVzdCBwaXhlbCBmb3JtYXQgdG8gY29udmVydCB0byBnaXZlbiBhIGNlcnRhaW4gc291cmNlIHBpeGVsCisgKiBmb3JtYXQuICBXaGVuIGNvbnZlcnRpbmcgZnJvbSBvbmUgcGl4ZWwgZm9ybWF0IHRvIGFub3RoZXIsIGluZm9ybWF0aW9uIGxvc3MKKyAqIG1heSBvY2N1ci4gIEZvciBleGFtcGxlLCB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IyNCB0byBHUkFZLCB0aGUgY29sb3IKKyAqIGluZm9ybWF0aW9uIHdpbGwgYmUgbG9zdC4gU2ltaWxhcmx5LCBvdGhlciBsb3NzZXMgb2NjdXIgd2hlbiBjb252ZXJ0aW5nIGZyb20KKyAqIHNvbWUgZm9ybWF0cyB0byBvdGhlciBmb3JtYXRzLiBhdmNvZGVjX2ZpbmRfYmVzdF9waXhfZm10X29mXzIoKSBzZWFyY2hlcyB3aGljaCBvZgorICogdGhlIGdpdmVuIHBpeGVsIGZvcm1hdHMgc2hvdWxkIGJlIHVzZWQgdG8gc3VmZmVyIHRoZSBsZWFzdCBhbW91bnQgb2YgbG9zcy4KKyAqIFRoZSBwaXhlbCBmb3JtYXRzIGZyb20gd2hpY2ggaXQgY2hvb3NlcyBvbmUsIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZQorICogcGl4X2ZtdF9saXN0IHBhcmFtZXRlci4KKyAqCisgKgorICogQHBhcmFtW2luXSBwaXhfZm10X2xpc3QgQVZfUElYX0ZNVF9OT05FIHRlcm1pbmF0ZWQgYXJyYXkgb2YgcGl4ZWwgZm9ybWF0cyB0byBjaG9vc2UgZnJvbQorICogQHBhcmFtW2luXSBzcmNfcGl4X2ZtdCBzb3VyY2UgcGl4ZWwgZm9ybWF0CisgKiBAcGFyYW1baW5dIGhhc19hbHBoYSBXaGV0aGVyIHRoZSBzb3VyY2UgcGl4ZWwgZm9ybWF0IGFscGhhIGNoYW5uZWwgaXMgdXNlZC4KKyAqIEBwYXJhbVtvdXRdIGxvc3NfcHRyIENvbWJpbmF0aW9uIG9mIGZsYWdzIGluZm9ybWluZyB5b3Ugd2hhdCBraW5kIG9mIGxvc3NlcyB3aWxsIG9jY3VyLgorICogQHJldHVybiBUaGUgYmVzdCBwaXhlbCBmb3JtYXQgdG8gY29udmVydCB0byBvciAtMSBpZiBub25lIHdhcyBmb3VuZC4KKyAqLworZW51bSBBVlBpeGVsRm9ybWF0IGF2Y29kZWNfZmluZF9iZXN0X3BpeF9mbXRfb2ZfbGlzdChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnBpeF9mbXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY19waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX2FscGhhLCBpbnQgKmxvc3NfcHRyKTsKKworLyoqCisgKiBAZGVwcmVjYXRlZCBzZWUgYXZfZmluZF9iZXN0X3BpeF9mbXRfb2ZfMigpCisgKi8KK2VudW0gQVZQaXhlbEZvcm1hdCBhdmNvZGVjX2ZpbmRfYmVzdF9waXhfZm10X29mXzIoZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10MSwgZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY19waXhfZm10LCBpbnQgaGFzX2FscGhhLCBpbnQgKmxvc3NfcHRyKTsKKworYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyNpZiBBVl9IQVZFX0lOQ09NUEFUSUJMRV9MSUJBVl9BQkkKK2VudW0gQVZQaXhlbEZvcm1hdCBhdmNvZGVjX2ZpbmRfYmVzdF9waXhfZm10Mihjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnBpeF9mbXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjX3BpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19hbHBoYSwgaW50ICpsb3NzX3B0cik7CisjZWxzZQorZW51bSBBVlBpeGVsRm9ybWF0IGF2Y29kZWNfZmluZF9iZXN0X3BpeF9mbXQyKGVudW0gQVZQaXhlbEZvcm1hdCBkc3RfcGl4X2ZtdDEsIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RfcGl4X2ZtdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNfcGl4X2ZtdCwgaW50IGhhc19hbHBoYSwgaW50ICpsb3NzX3B0cik7CisjZW5kaWYKKworCitlbnVtIEFWUGl4ZWxGb3JtYXQgYXZjb2RlY19kZWZhdWx0X2dldF9mb3JtYXQoc3RydWN0IEFWQ29kZWNDb250ZXh0ICpzLCBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKiBmbXQpOworCisvKioKKyAqIEB9CisgKi8KKworI2lmIEZGX0FQSV9TRVRfRElNRU5TSU9OUworLyoqCisgKiBAZGVwcmVjYXRlZCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3NlZCB0byBiZSB1c2VkIGZyb20gb3V0c2lkZSBvZiBsYXZjCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCit2b2lkIGF2Y29kZWNfc2V0X2RpbWVuc2lvbnMoQVZDb2RlY0NvbnRleHQgKnMsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisjZW5kaWYKKworLyoqCisgKiBQdXQgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb2RlYyB0YWcgY29kZWNfdGFnIGluIGJ1Zi4KKyAqCisgKiBAcGFyYW0gYnVmICAgICAgIGJ1ZmZlciB0byBwbGFjZSBjb2RlYyB0YWcgaW4KKyAqIEBwYXJhbSBidWZfc2l6ZSBzaXplIGluIGJ5dGVzIG9mIGJ1ZgorICogQHBhcmFtIGNvZGVjX3RhZyBjb2RlYyB0YWcgdG8gYXNzaWduCisgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQgaWYKKyAqIGVub3VnaCBzcGFjZSBoYWQgYmVlbiBhdmFpbGFibGUsIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgbnVsbAorICovCitzaXplX3QgYXZfZ2V0X2NvZGVjX3RhZ19zdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUsIHVuc2lnbmVkIGludCBjb2RlY190YWcpOworCit2b2lkIGF2Y29kZWNfc3RyaW5nKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBBVkNvZGVjQ29udGV4dCAqZW5jLCBpbnQgZW5jb2RlKTsKKworLyoqCisgKiBSZXR1cm4gYSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIHByb2ZpbGUsIGlmIGF2YWlsYWJsZS4KKyAqCisgKiBAcGFyYW0gY29kZWMgdGhlIGNvZGVjIHRoYXQgaXMgc2VhcmNoZWQgZm9yIHRoZSBnaXZlbiBwcm9maWxlCisgKiBAcGFyYW0gcHJvZmlsZSB0aGUgcHJvZmlsZSB2YWx1ZSBmb3Igd2hpY2ggYSBuYW1lIGlzIHJlcXVlc3RlZAorICogQHJldHVybiBBIG5hbWUgZm9yIHRoZSBwcm9maWxlIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZS4KKyAqLworY29uc3QgY2hhciAqYXZfZ2V0X3Byb2ZpbGVfbmFtZShjb25zdCBBVkNvZGVjICpjb2RlYywgaW50IHByb2ZpbGUpOworCitpbnQgYXZjb2RlY19kZWZhdWx0X2V4ZWN1dGUoQVZDb2RlY0NvbnRleHQgKmMsIGludCAoKmZ1bmMpKEFWQ29kZWNDb250ZXh0ICpjMiwgdm9pZCAqYXJnMiksdm9pZCAqYXJnLCBpbnQgKnJldCwgaW50IGNvdW50LCBpbnQgc2l6ZSk7CitpbnQgYXZjb2RlY19kZWZhdWx0X2V4ZWN1dGUyKEFWQ29kZWNDb250ZXh0ICpjLCBpbnQgKCpmdW5jKShBVkNvZGVjQ29udGV4dCAqYzIsIHZvaWQgKmFyZzIsIGludCwgaW50KSx2b2lkICphcmcsIGludCAqcmV0LCBpbnQgY291bnQpOworLy9GSVhNRSBmdW5jIHR5cGVkZWYKKworLyoqCisgKiBGaWxsIEFWRnJhbWUgYXVkaW8gZGF0YSBhbmQgbGluZXNpemUgcG9pbnRlcnMuCisgKgorICogVGhlIGJ1ZmZlciBidWYgbXVzdCBiZSBhIHByZWFsbG9jYXRlZCBidWZmZXIgd2l0aCBhIHNpemUgYmlnIGVub3VnaAorICogdG8gY29udGFpbiB0aGUgc3BlY2lmaWVkIHNhbXBsZXMgYW1vdW50LiBUaGUgZmlsbGVkIEFWRnJhbWUgZGF0YQorICogcG9pbnRlcnMgd2lsbCBwb2ludCB0byB0aGlzIGJ1ZmZlci4KKyAqCisgKiBBVkZyYW1lIGV4dGVuZGVkX2RhdGEgY2hhbm5lbCBwb2ludGVycyBhcmUgYWxsb2NhdGVkIGlmIG5lY2Vzc2FyeSBmb3IKKyAqIHBsYW5hciBhdWRpby4KKyAqCisgKiBAcGFyYW0gZnJhbWUgICAgICAgdGhlIEFWRnJhbWUKKyAqICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyBtdXN0IGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZQorICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIGZyYW1lLT5kYXRhLAorICogICAgICAgICAgICAgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhLCBmcmFtZS0+bGluZXNpemVbMF0uCisgKiBAcGFyYW0gbmJfY2hhbm5lbHMgY2hhbm5lbCBjb3VudAorICogQHBhcmFtIHNhbXBsZV9mbXQgIHNhbXBsZSBmb3JtYXQKKyAqIEBwYXJhbSBidWYgICAgICAgICBidWZmZXIgdG8gdXNlIGZvciBmcmFtZSBkYXRhCisgKiBAcGFyYW0gYnVmX3NpemUgICAgc2l6ZSBvZiBidWZmZXIKKyAqIEBwYXJhbSBhbGlnbiAgICAgICBwbGFuZSBzaXplIHNhbXBsZSBhbGlnbm1lbnQgKDAgPSBkZWZhdWx0KQorICogQHJldHVybiAgICAgICAgICAgID49MCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqIEB0b2RvIHJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgc2FtcGxlcyBpbgorICogY2FzZSBvZiBzdWNjZXNzLCBhdCB0aGUgbmV4dCBsaWJhdnV0aWwgYnVtcAorICovCitpbnQgYXZjb2RlY19maWxsX2F1ZGlvX2ZyYW1lKEFWRnJhbWUgKmZyYW1lLCBpbnQgbmJfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUsIGludCBhbGlnbik7CisKKy8qKgorICogUmVzZXQgdGhlIGludGVybmFsIGRlY29kZXIgc3RhdGUgLyBmbHVzaCBpbnRlcm5hbCBidWZmZXJzLiBTaG91bGQgYmUgY2FsbGVkCisgKiBlLmcuIHdoZW4gc2Vla2luZyBvciB3aGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBzdHJlYW0uCisgKgorICogQG5vdGUgd2hlbiByZWZjb3VudGVkIGZyYW1lcyBhcmUgbm90IHVzZWQgKGkuZS4gYXZjdHgtPnJlZmNvdW50ZWRfZnJhbWVzIGlzIDApLAorICogdGhpcyBpbnZhbGlkYXRlcyB0aGUgZnJhbWVzIHByZXZpb3VzbHkgcmV0dXJuZWQgZnJvbSB0aGUgZGVjb2Rlci4gV2hlbgorICogcmVmY291bnRlZCBmcmFtZXMgYXJlIHVzZWQsIHRoZSBkZWNvZGVyIGp1c3QgcmVsZWFzZXMgYW55IHJlZmVyZW5jZXMgaXQgbWlnaHQKKyAqIGtlZXAgaW50ZXJuYWxseSwgYnV0IHRoZSBjYWxsZXIncyByZWZlcmVuY2UgcmVtYWlucyB2YWxpZC4KKyAqLwordm9pZCBhdmNvZGVjX2ZsdXNoX2J1ZmZlcnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworLyoqCisgKiBSZXR1cm4gY29kZWMgYml0cyBwZXIgc2FtcGxlLgorICoKKyAqIEBwYXJhbVtpbl0gY29kZWNfaWQgdGhlIGNvZGVjCisgKiBAcmV0dXJuIE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgb3IgemVybyBpZiB1bmtub3duIGZvciB0aGUgZ2l2ZW4gY29kZWMuCisgKi8KK2ludCBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIFBDTSBjb2RlYyBhc3NvY2lhdGVkIHdpdGggYSBzYW1wbGUgZm9ybWF0LgorICogQHBhcmFtIGJlICBlbmRpYW5uZXNzLCAwIGZvciBsaXR0bGUsIDEgZm9yIGJpZywKKyAqICAgICAgICAgICAgLTEgKG9yIGFueXRoaW5nIGVsc2UpIGZvciBuYXRpdmUKKyAqIEByZXR1cm4gIEFWX0NPREVDX0lEX1BDTV8qIG9yIEFWX0NPREVDX0lEX05PTkUKKyAqLworZW51bSBBVkNvZGVjSUQgYXZfZ2V0X3BjbV9jb2RlYyhlbnVtIEFWU2FtcGxlRm9ybWF0IGZtdCwgaW50IGJlKTsKKworLyoqCisgKiBSZXR1cm4gY29kZWMgYml0cyBwZXIgc2FtcGxlLgorICogT25seSByZXR1cm4gbm9uLXplcm8gaWYgdGhlIGJpdHMgcGVyIHNhbXBsZSBpcyBleGFjdGx5IGNvcnJlY3QsIG5vdCBhbgorICogYXBwcm94aW1hdGlvbi4KKyAqCisgKiBAcGFyYW1baW5dIGNvZGVjX2lkIHRoZSBjb2RlYworICogQHJldHVybiBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIG9yIHplcm8gaWYgdW5rbm93biBmb3IgdGhlIGdpdmVuIGNvZGVjLgorICovCitpbnQgYXZfZ2V0X2V4YWN0X2JpdHNfcGVyX3NhbXBsZShlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCk7CisKKy8qKgorICogUmV0dXJuIGF1ZGlvIGZyYW1lIGR1cmF0aW9uLgorICoKKyAqIEBwYXJhbSBhdmN0eCAgICAgICAgY29kZWMgY29udGV4dAorICogQHBhcmFtIGZyYW1lX2J5dGVzICBzaXplIG9mIHRoZSBmcmFtZSwgb3IgMCBpZiB1bmtub3duCisgKiBAcmV0dXJuICAgICAgICAgICAgIGZyYW1lIGR1cmF0aW9uLCBpbiBzYW1wbGVzLCBpZiBrbm93bi4gMCBpZiBub3QgYWJsZSB0bworICogICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmUuCisgKi8KK2ludCBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgZnJhbWVfYnl0ZXMpOworCisKK3R5cGVkZWYgc3RydWN0IEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCB7CisgICAgdm9pZCAqcHJpdl9kYXRhOworICAgIHN0cnVjdCBBVkJpdFN0cmVhbUZpbHRlciAqZmlsdGVyOworICAgIEFWQ29kZWNQYXJzZXJDb250ZXh0ICpwYXJzZXI7CisgICAgc3RydWN0IEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqbmV4dDsKK30gQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0OworCisKK3R5cGVkZWYgc3RydWN0IEFWQml0U3RyZWFtRmlsdGVyIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCBwcml2X2RhdGFfc2l6ZTsKKyAgICBpbnQgKCpmaWx0ZXIpKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywKKyAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgY2hhciAqYXJncywKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQga2V5ZnJhbWUpOworICAgIHZvaWQgKCpjbG9zZSkoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjKTsKKyAgICBzdHJ1Y3QgQVZCaXRTdHJlYW1GaWx0ZXIgKm5leHQ7Cit9IEFWQml0U3RyZWFtRmlsdGVyOworCisvKioKKyAqIFJlZ2lzdGVyIGEgYml0c3RyZWFtIGZpbHRlci4KKyAqCisgKiBUaGUgZmlsdGVyIHdpbGwgYmUgYWNjZXNzaWJsZSB0byB0aGUgYXBwbGljYXRpb24gY29kZSB0aHJvdWdoCisgKiBhdl9iaXRzdHJlYW1fZmlsdGVyX25leHQoKSBvciBjYW4gYmUgZGlyZWN0bHkgaW5pdGlhbGl6ZWQgd2l0aAorICogYXZfYml0c3RyZWFtX2ZpbHRlcl9pbml0KCkuCisgKgorICogQHNlZSBhdmNvZGVjX3JlZ2lzdGVyX2FsbCgpCisgKi8KK3ZvaWQgYXZfcmVnaXN0ZXJfYml0c3RyZWFtX2ZpbHRlcihBVkJpdFN0cmVhbUZpbHRlciAqYnNmKTsKKworLyoqCisgKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBiaXRzdHJlYW0gZmlsdGVyIGNvbnRleHQgZ2l2ZW4gYSBiaXRzdHJlYW0KKyAqIGZpbHRlciBuYW1lLgorICoKKyAqIFRoZSByZXR1cm5lZCBjb250ZXh0IG11c3QgYmUgZnJlZWQgd2l0aCBhdl9iaXRzdHJlYW1fZmlsdGVyX2Nsb3NlKCkuCisgKgorICogQHBhcmFtIG5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIGJpdHN0cmVhbSBmaWx0ZXIKKyAqIEByZXR1cm4gYSBiaXRzdHJlYW0gZmlsdGVyIGNvbnRleHQgaWYgYSBtYXRjaGluZyBmaWx0ZXIgd2FzIGZvdW5kCisgKiBhbmQgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLCBOVUxMIG90aGVyd2lzZQorICovCitBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmF2X2JpdHN0cmVhbV9maWx0ZXJfaW5pdChjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBGaWx0ZXIgYml0c3RyZWFtLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZmlsdGVycyB0aGUgYnVmZmVyIGJ1ZiB3aXRoIHNpemUgYnVmX3NpemUsIGFuZCBwbGFjZXMgdGhlCisgKiBmaWx0ZXJlZCBidWZmZXIgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHBvdXRidWYuCisgKgorICogVGhlIG91dHB1dCBidWZmZXIgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIEBwYXJhbSBic2ZjICAgICAgICAgICAgYml0c3RyZWFtIGZpbHRlciBjb250ZXh0IGNyZWF0ZWQgYnkgYXZfYml0c3RyZWFtX2ZpbHRlcl9pbml0KCkKKyAqIEBwYXJhbSBhdmN0eCAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgYWNjZXNzZWQgYnkgdGhlIGZpbHRlciwgbWF5IGJlIE5VTEwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIElmIHNwZWNpZmllZCwgdGhpcyBtdXN0IHBvaW50IHRvIHRoZSBlbmNvZGVyIGNvbnRleHQgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzdHJlYW0gdGhlIHBhY2tldCBpcyBzZW50IHRvLgorICogQHBhcmFtIGFyZ3MgICAgICAgICAgICBhcmd1bWVudHMgd2hpY2ggc3BlY2lmeSB0aGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24sIG1heSBiZSBOVUxMCisgKiBAcGFyYW0gcG91dGJ1ZiAgICAgICAgIHBvaW50ZXIgd2hpY2ggaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgZmlsdGVyZWQgYnVmZmVyCisgKiBAcGFyYW0gcG91dGJ1Zl9zaXplICAgIHBvaW50ZXIgd2hpY2ggaXMgdXBkYXRlZCB0byB0aGUgZmlsdGVyZWQgYnVmZmVyIHNpemUgaW4gYnl0ZXMKKyAqIEBwYXJhbSBidWYgICAgICAgICAgICAgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gZmlsdGVyCisgKiBAcGFyYW0gYnVmX3NpemUgICAgICAgIHNpemUgaW4gYnl0ZXMgb2YgYnVmCisgKiBAcGFyYW0ga2V5ZnJhbWUgICAgICAgIHNldCB0byBub24temVybyBpZiB0aGUgYnVmZmVyIHRvIGZpbHRlciBjb3JyZXNwb25kcyB0byBhIGtleS1mcmFtZSBwYWNrZXQgZGF0YQorICogQHJldHVybiA+PSAwIGluIGNhc2Ugb2Ygc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICoKKyAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgcG9zaXRpdmUsIGFuIG91dHB1dCBidWZmZXIgaXMgYWxsb2NhdGVkIGFuZAorICogaXMgYXZhaWxhYmxlIGluICpwb3V0YnVmLCBhbmQgaXMgZGlzdGluY3QgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLgorICoKKyAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgMCwgdGhlIG91dHB1dCBidWZmZXIgaXMgbm90IGFsbG9jYXRlZCBhbmQKKyAqIHNob3VsZCBiZSBjb25zaWRlcmVkIGlkZW50aWNhbCB0byB0aGUgaW5wdXQgYnVmZmVyLCBvciBpbiBjYXNlCisgKiAqcG91dGJ1ZiB3YXMgc2V0IGl0IHBvaW50cyB0byB0aGUgaW5wdXQgYnVmZmVyIChub3QgbmVjZXNzYXJpbHkgdG8KKyAqIGl0cyBzdGFydGluZyBhZGRyZXNzKS4KKyAqLworaW50IGF2X2JpdHN0cmVhbV9maWx0ZXJfZmlsdGVyKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQga2V5ZnJhbWUpOworCisvKioKKyAqIFJlbGVhc2UgYml0c3RyZWFtIGZpbHRlciBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBic2YgdGhlIGJpdHN0cmVhbSBmaWx0ZXIgY29udGV4dCBjcmVhdGVkIHdpdGgKKyAqIGF2X2JpdHN0cmVhbV9maWx0ZXJfaW5pdCgpLCBjYW4gYmUgTlVMTAorICovCit2b2lkIGF2X2JpdHN0cmVhbV9maWx0ZXJfY2xvc2UoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2YpOworCisvKioKKyAqIElmIGYgaXMgTlVMTCwgcmV0dXJuIHRoZSBmaXJzdCByZWdpc3RlcmVkIGJpdHN0cmVhbSBmaWx0ZXIsCisgKiBpZiBmIGlzIG5vbi1OVUxMLCByZXR1cm4gdGhlIG5leHQgcmVnaXN0ZXJlZCBiaXRzdHJlYW0gZmlsdGVyCisgKiBhZnRlciBmLCBvciBOVUxMIGlmIGYgaXMgdGhlIGxhc3Qgb25lLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIGFsbCByZWdpc3RlcmVkIGJpdHN0cmVhbQorICogZmlsdGVycy4KKyAqLworQVZCaXRTdHJlYW1GaWx0ZXIgKmF2X2JpdHN0cmVhbV9maWx0ZXJfbmV4dChjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqZik7CisKKy8qIG1lbW9yeSAqLworCisvKioKKyAqIFNhbWUgYmVoYXZpb3VyIGF2X2Zhc3RfbWFsbG9jIGJ1dCB0aGUgYnVmZmVyIGhhcyBhZGRpdGlvbmFsCisgKiBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFIGF0IHRoZSBlbmQgd2hpY2ggd2lsbCBhbHdheXMgYmUgMC4KKyAqCisgKiBJbiBhZGRpdGlvbiB0aGUgd2hvbGUgYnVmZmVyIHdpbGwgaW5pdGlhbGx5IGFuZCBhZnRlciByZXNpemVzCisgKiBiZSAwLWluaXRpYWxpemVkIHNvIHRoYXQgbm8gdW5pbml0aWFsaXplZCBkYXRhIHdpbGwgZXZlciBhcHBlYXIuCisgKi8KK3ZvaWQgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKHZvaWQgKnB0ciwgdW5zaWduZWQgaW50ICpzaXplLCBzaXplX3QgbWluX3NpemUpOworCisvKioKKyAqIFNhbWUgYmVoYXZpb3VyIGF2X2Zhc3RfcGFkZGVkX21hbGxvYyBleGNlcHQgdGhhdCBidWZmZXIgd2lsbCBhbHdheXMKKyAqIGJlIDAtaW5pdGlhbGl6ZWQgYWZ0ZXIgY2FsbC4KKyAqLwordm9pZCBhdl9mYXN0X3BhZGRlZF9tYWxsb2N6KHZvaWQgKnB0ciwgdW5zaWduZWQgaW50ICpzaXplLCBzaXplX3QgbWluX3NpemUpOworCisvKioKKyAqIEVuY29kZSBleHRyYWRhdGEgbGVuZ3RoIHRvIGEgYnVmZmVyLiBVc2VkIGJ5IHhpcGggY29kZWNzLgorICoKKyAqIEBwYXJhbSBzIGJ1ZmZlciB0byB3cml0ZSB0bzsgbXVzdCBiZSBhdCBsZWFzdCAodi8yNTUrMSkgYnl0ZXMgbG9uZworICogQHBhcmFtIHYgc2l6ZSBvZiBleHRyYWRhdGEgaW4gYnl0ZXMKKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlci4KKyAqLwordW5zaWduZWQgaW50IGF2X3hpcGhsYWNpbmcodW5zaWduZWQgY2hhciAqcywgdW5zaWduZWQgaW50IHYpOworCisjaWYgRkZfQVBJX01JU1NJTkdfU0FNUExFCisvKioKKyAqIExvZyBhIGdlbmVyaWMgd2FybmluZyBtZXNzYWdlIGFib3V0IGEgbWlzc2luZyBmZWF0dXJlLiBUaGlzIGZ1bmN0aW9uIGlzCisgKiBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYnkgRkZtcGVnIChsaWJhdmNvZGVjLCBsaWJhdmZvcm1hdCwgZXRjLikKKyAqIG9ubHksIGFuZCB3b3VsZCBub3JtYWxseSBub3QgYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuCisgKiBAcGFyYW1baW5dIGF2YyBhIHBvaW50ZXIgdG8gYW4gYXJiaXRyYXJ5IHN0cnVjdCBvZiB3aGljaCB0aGUgZmlyc3QgZmllbGQgaXMKKyAqIGEgcG9pbnRlciB0byBhbiBBVkNsYXNzIHN0cnVjdAorICogQHBhcmFtW2luXSBmZWF0dXJlIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBtaXNzaW5nIGZlYXR1cmUKKyAqIEBwYXJhbVtpbl0gd2FudF9zYW1wbGUgaW5kaWNhdGVzIGlmIHNhbXBsZXMgYXJlIHdhbnRlZCB3aGljaCBleGhpYml0IHRoaXMgZmVhdHVyZS4KKyAqIElmIHdhbnRfc2FtcGxlIGlzIG5vbi16ZXJvLCBhZGRpdGlvbmFsIHZlcmJhZ2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUgbG9nCisgKiBtZXNzYWdlIHdoaWNoIHRlbGxzIHRoZSB1c2VyIGhvdyB0byByZXBvcnQgc2FtcGxlcyB0byB0aGUgZGV2ZWxvcG1lbnQKKyAqIG1haWxpbmcgbGlzdC4KKyAqIEBkZXByZWNhdGVkIFVzZSBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZSgpIGluc3RlYWQuCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCit2b2lkIGF2X2xvZ19taXNzaW5nX2ZlYXR1cmUodm9pZCAqYXZjLCBjb25zdCBjaGFyICpmZWF0dXJlLCBpbnQgd2FudF9zYW1wbGUpOworCisvKioKKyAqIExvZyBhIGdlbmVyaWMgd2FybmluZyBtZXNzYWdlIGFza2luZyBmb3IgYSBzYW1wbGUuIFRoaXMgZnVuY3Rpb24gaXMKKyAqIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBieSBGRm1wZWcgKGxpYmF2Y29kZWMsIGxpYmF2Zm9ybWF0LCBldGMuKQorICogb25seSwgYW5kIHdvdWxkIG5vcm1hbGx5IG5vdCBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4KKyAqIEBwYXJhbVtpbl0gYXZjIGEgcG9pbnRlciB0byBhbiBhcmJpdHJhcnkgc3RydWN0IG9mIHdoaWNoIHRoZSBmaXJzdCBmaWVsZCBpcworICogYSBwb2ludGVyIHRvIGFuIEFWQ2xhc3Mgc3RydWN0CisgKiBAcGFyYW1baW5dIG1zZyBzdHJpbmcgY29udGFpbmluZyBhbiBvcHRpb25hbCBtZXNzYWdlLCBvciBOVUxMIGlmIG5vIG1lc3NhZ2UKKyAqIEBkZXByZWNhdGVkIFVzZSBhdnByaXZfcmVxdWVzdF9zYW1wbGUoKSBpbnN0ZWFkLgorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAordm9pZCBhdl9sb2dfYXNrX2Zvcl9zYW1wbGUodm9pZCAqYXZjLCBjb25zdCBjaGFyICptc2csIC4uLikgYXZfcHJpbnRmX2Zvcm1hdCgyLCAzKTsKKyNlbmRpZiAvKiBGRl9BUElfTUlTU0lOR19TQU1QTEUgKi8KKworLyoqCisgKiBSZWdpc3RlciB0aGUgaGFyZHdhcmUgYWNjZWxlcmF0b3IgaHdhY2NlbC4KKyAqLwordm9pZCBhdl9yZWdpc3Rlcl9od2FjY2VsKEFWSFdBY2NlbCAqaHdhY2NlbCk7CisKKy8qKgorICogSWYgaHdhY2NlbCBpcyBOVUxMLCByZXR1cm5zIHRoZSBmaXJzdCByZWdpc3RlcmVkIGhhcmR3YXJlIGFjY2VsZXJhdG9yLAorICogaWYgaHdhY2NlbCBpcyBub24tTlVMTCwgcmV0dXJucyB0aGUgbmV4dCByZWdpc3RlcmVkIGhhcmR3YXJlIGFjY2VsZXJhdG9yCisgKiBhZnRlciBod2FjY2VsLCBvciBOVUxMIGlmIGh3YWNjZWwgaXMgdGhlIGxhc3Qgb25lLgorICovCitBVkhXQWNjZWwgKmF2X2h3YWNjZWxfbmV4dChjb25zdCBBVkhXQWNjZWwgKmh3YWNjZWwpOworCisKKy8qKgorICogTG9jayBvcGVyYXRpb24gdXNlZCBieSBsb2NrbWdyCisgKi8KK2VudW0gQVZMb2NrT3AgeworICBBVl9MT0NLX0NSRUFURSwgIC8vLzwgQ3JlYXRlIGEgbXV0ZXgKKyAgQVZfTE9DS19PQlRBSU4sICAvLy88IExvY2sgdGhlIG11dGV4CisgIEFWX0xPQ0tfUkVMRUFTRSwgLy8vPCBVbmxvY2sgdGhlIG11dGV4CisgIEFWX0xPQ0tfREVTVFJPWSwgLy8vPCBGcmVlIG11dGV4IHJlc291cmNlcworfTsKKworLyoqCisgKiBSZWdpc3RlciBhIHVzZXIgcHJvdmlkZWQgbG9jayBtYW5hZ2VyIHN1cHBvcnRpbmcgdGhlIG9wZXJhdGlvbnMKKyAqIHNwZWNpZmllZCBieSBBVkxvY2tPcC4gVGhlICJtdXRleCIgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uIHBvaW50cworICogdG8gYSAodm9pZCAqKSB3aGVyZSB0aGUgbG9ja21nciBzaG91bGQgc3RvcmUvZ2V0IGEgcG9pbnRlciB0byBhIHVzZXIKKyAqIGFsbG9jYXRlZCBtdXRleC4gSXQgaXMgTlVMTCB1cG9uIEFWX0xPQ0tfQ1JFQVRFIGFuZCBlcXVhbCB0byB0aGUKKyAqIHZhbHVlIGxlZnQgYnkgdGhlIGxhc3QgY2FsbCBmb3IgYWxsIG90aGVyIG9wcy4gSWYgdGhlIGxvY2sgbWFuYWdlciBpcworICogdW5hYmxlIHRvIHBlcmZvcm0gdGhlIG9wIHRoZW4gaXQgc2hvdWxkIGxlYXZlIHRoZSBtdXRleCBpbiB0aGUgc2FtZQorICogc3RhdGUgYXMgd2hlbiBpdCB3YXMgY2FsbGVkIGFuZCByZXR1cm4gYSBub24temVybyB2YWx1ZS4gSG93ZXZlciwKKyAqIHdoZW4gY2FsbGVkIHdpdGggQVZfTE9DS19ERVNUUk9ZIHRoZSBtdXRleCB3aWxsIGFsd2F5cyBiZSBhc3N1bWVkIHRvCisgKiBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlc3Ryb3llZC4gSWYgYXZfbG9ja21ncl9yZWdpc3RlciBzdWNjZWVkcworICogaXQgd2lsbCByZXR1cm4gYSBub24tbmVnYXRpdmUgdmFsdWUsIGlmIGl0IGZhaWxzIGl0IHdpbGwgcmV0dXJuIGEKKyAqIG5lZ2F0aXZlIHZhbHVlIGFuZCBkZXN0cm95IGFsbCBtdXRleCBhbmQgdW5yZWdpc3RlciBhbGwgY2FsbGJhY2tzLgorICogYXZfbG9ja21ncl9yZWdpc3RlciBpcyBub3QgdGhyZWFkLXNhZmUsIGl0IG11c3QgYmUgY2FsbGVkIGZyb20gYQorICogc2luZ2xlIHRocmVhZCBiZWZvcmUgYW55IGNhbGxzIHdoaWNoIG1ha2UgdXNlIG9mIGxvY2tpbmcgYXJlIHVzZWQuCisgKgorICogQHBhcmFtIGNiIFVzZXIgZGVmaW5lZCBjYWxsYmFjay4gYXZfbG9ja21ncl9yZWdpc3RlciBpbnZva2VzIGNhbGxzCisgKiAgICAgICAgICAgdG8gdGhpcyBjYWxsYmFjayBhbmQgdGhlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFjay4KKyAqICAgICAgICAgICBUaGUgY2FsbGJhY2sgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBtb3JlIHRoYW4gb25lIG11dGV4CisgKiAgICAgICAgICAgZWFjaCBvZiB3aGljaCBtdXN0IGJlIGJhY2tlZCBieSBpdHMgb3duIHVuZGVybHlpbmcgbG9ja2luZworICogICAgICAgICAgIG1lY2hhbmlzbSAoaS5lLiBkbyBub3QgdXNlIGEgc2luZ2xlIHN0YXRpYyBvYmplY3QgdG8KKyAqICAgICAgICAgICBpbXBsZW1lbnQgeW91ciBsb2NrIG1hbmFnZXIpLiBJZiBjYiBpcyBzZXQgdG8gTlVMTCB0aGUKKyAqICAgICAgICAgICBsb2NrbWdyIHdpbGwgYmUgdW5yZWdpc3RlcmVkLgorICovCitpbnQgYXZfbG9ja21ncl9yZWdpc3RlcihpbnQgKCpjYikodm9pZCAqKm11dGV4LCBlbnVtIEFWTG9ja09wIG9wKSk7CisKKy8qKgorICogR2V0IHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBjb2RlYy4KKyAqLworZW51bSBBVk1lZGlhVHlwZSBhdmNvZGVjX2dldF90eXBlKGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKTsKKworLyoqCisgKiBHZXQgdGhlIG5hbWUgb2YgYSBjb2RlYy4KKyAqIEByZXR1cm4gIGEgc3RhdGljIHN0cmluZyBpZGVudGlmeWluZyB0aGUgY29kZWM7IG5ldmVyIE5VTEwKKyAqLworY29uc3QgY2hhciAqYXZjb2RlY19nZXRfbmFtZShlbnVtIEFWQ29kZWNJRCBpZCk7CisKKy8qKgorICogQHJldHVybiBhIHBvc2l0aXZlIHZhbHVlIGlmIHMgaXMgb3BlbiAoaS5lLiBhdmNvZGVjX29wZW4yKCkgd2FzIGNhbGxlZCBvbiBpdAorICogd2l0aCBubyBjb3JyZXNwb25kaW5nIGF2Y29kZWNfY2xvc2UoKSksIDAgb3RoZXJ3aXNlLgorICovCitpbnQgYXZjb2RlY19pc19vcGVuKEFWQ29kZWNDb250ZXh0ICpzKTsKKworLyoqCisgKiBAcmV0dXJuIGEgbm9uLXplcm8gbnVtYmVyIGlmIGNvZGVjIGlzIGFuIGVuY29kZXIsIHplcm8gb3RoZXJ3aXNlCisgKi8KK2ludCBhdl9jb2RlY19pc19lbmNvZGVyKGNvbnN0IEFWQ29kZWMgKmNvZGVjKTsKKworLyoqCisgKiBAcmV0dXJuIGEgbm9uLXplcm8gbnVtYmVyIGlmIGNvZGVjIGlzIGEgZGVjb2RlciwgemVybyBvdGhlcndpc2UKKyAqLworaW50IGF2X2NvZGVjX2lzX2RlY29kZXIoY29uc3QgQVZDb2RlYyAqY29kZWMpOworCisvKioKKyAqIEByZXR1cm4gZGVzY3JpcHRvciBmb3IgZ2l2ZW4gY29kZWMgSUQgb3IgTlVMTCBpZiBubyBkZXNjcmlwdG9yIGV4aXN0cy4KKyAqLworY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoZW51bSBBVkNvZGVjSUQgaWQpOworCisvKioKKyAqIEl0ZXJhdGUgb3ZlciBhbGwgY29kZWMgZGVzY3JpcHRvcnMga25vd24gdG8gbGliYXZjb2RlYy4KKyAqCisgKiBAcGFyYW0gcHJldiBwcmV2aW91cyBkZXNjcmlwdG9yLiBOVUxMIHRvIGdldCB0aGUgZmlyc3QgZGVzY3JpcHRvci4KKyAqCisgKiBAcmV0dXJuIG5leHQgZGVzY3JpcHRvciBvciBOVUxMIGFmdGVyIHRoZSBsYXN0IGRlc2NyaXB0b3IKKyAqLworY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmF2Y29kZWNfZGVzY3JpcHRvcl9uZXh0KGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpwcmV2KTsKKworLyoqCisgKiBAcmV0dXJuIGNvZGVjIGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciBOVUxMIGlmIG5vIHN1Y2ggZGVzY3JpcHRvcgorICogICAgICAgICBleGlzdHMuCisgKi8KK2NvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICphdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZDT0RFQ19BVkNPREVDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F2Y29kZWNyZXMucmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hdmNvZGVjcmVzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNjk2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdmNvZGVjcmVzLnJjCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBXaW5kb3dzIHJlc291cmNlIGZpbGUgZm9yIGxpYmF2Y29kZWMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSmFtZXMgQWxtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaWFuY2hlbmcgIlRpbW90aHkiIEd1CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAibGliYXZjb2RlYy92ZXJzaW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZmdmVyc2lvbi5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisxIFZFUlNJT05JTkZPCitGSUxFVkVSU0lPTiAgICAgTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SLCBMSUJBVkNPREVDX1ZFUlNJT05fTUlOT1IsIExJQkFWQ09ERUNfVkVSU0lPTl9NSUNSTywgMAorUFJPRFVDVFZFUlNJT04gIExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiwgTElCQVZDT0RFQ19WRVJTSU9OX01JTk9SLCBMSUJBVkNPREVDX1ZFUlNJT05fTUlDUk8sIDAKK0ZJTEVGTEFHU01BU0sgICBWU19GRklfRklMRUZMQUdTTUFTSworRklMRU9TICAgICAgICAgIFZPU19OVF9XSU5ET1dTMzIKK0ZJTEVUWVBFICAgICAgICBWRlRfRExMCit7CisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIHsKKyAgICAgICAgQkxPQ0sgIjA0MDkwNEIwIgorICAgICAgICB7CisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAgICAgICJGRm1wZWcgUHJvamVjdCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAgIkZGbXBlZyBjb2RlYyBsaWJyYXJ5IgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgICAgICBBVl9TVFJJTkdJRlkoTElCQVZDT0RFQ19WRVJTSU9OKQorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICAgICAibGliYXZjb2RlYyIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICAgIkNvcHlyaWdodCAoQykgMjAwMC0iIEFWX1NUUklOR0lGWShDT05GSUdfVEhJU19ZRUFSKSAiIEZGbXBlZyBQcm9qZWN0IgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAiYXZjb2RlYyIgQlVJTERTVUYgIi0iIEFWX1NUUklOR0lGWShMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IpIFNMSUJTVUYKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICAgICAgIkZGbXBlZyIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICAgRkZNUEVHX1ZFUlNJT04KKyAgICAgICAgfQorICAgIH0KKworICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgICB7CisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4MDQwOSwgMHgwNEIwCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXZkY3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F2ZGN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxYTZiNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F2ZGN0LmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAiZmRjdGRzcC5oIgorI2luY2x1ZGUgInBpeGJsb2NrZHNwLmgiCisjaW5jbHVkZSAiYXZkY3QuaCIKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQVZEQ1QseCkKKyNkZWZpbmUgREVGQVVMVCAwIC8vc2hvdWxkIGJlIE5BTiBidXQgaXQgZG9lcyBub3Qgd29yayBhcyBpdCBpcyBub3QgYSBjb25zdGFudCBpbiBnbGliYyBhcyByZXF1aXJlZCBieSBBTlNJL0lTTyBDCisvL3RoZXNlIG5hbWVzIGFyZSB0b28gbG9uZyB0byBiZSByZWFkYWJsZQorI2RlZmluZSBWIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisjZGVmaW5lIEEgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0KKyNkZWZpbmUgRSBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorI2RlZmluZSBEIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhdmRjdF9vcHRpb25zW10gPSB7Cit7ImRjdCIsICJEQ1QgYWxnb3JpdGhtIiwgT0ZGU0VUKGRjdF9hbGdvKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgSU5UX01BWCwgVnxFLCAiZGN0In0sCit7ImF1dG8iLCAiYXV0b3NlbGVjdCBhIGdvb2Qgb25lIChkZWZhdWx0KSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RDVF9BVVRPIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImRjdCJ9LAoreyJmYXN0aW50IiwgImZhc3QgaW50ZWdlciAoZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZykiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9EQ1RfRkFTVElOVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJkY3QifSwKK3siaW50IiwgImFjY3VyYXRlIGludGVnZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9EQ1RfSU5UIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImRjdCJ9LAoreyJtbXgiLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RDVF9NTVggfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiZGN0In0sCit7ImFsdGl2ZWMiLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RDVF9BTFRJVkVDIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImRjdCJ9LAoreyJmYWFuIiwgImZsb2F0aW5nIHBvaW50IEFBTiBEQ1QgKGV4cGVyaW1lbnRhbCAvIGZvciBkZWJ1Z2dpbmcpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfRENUX0ZBQU4gfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiZGN0In0sCisKK3siaWRjdCIsICJzZWxlY3QgSURDVCBpbXBsZW1lbnRhdGlvbiIsIE9GRlNFVChpZGN0X2FsZ28pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKK3siYXV0byIsICJhdXRvc2VsZWN0IGEgZ29vZCBvbmUgKGRlZmF1bHQpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9BVVRPIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAoreyJpbnQiLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfSU5UIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAoreyJzaW1wbGUiLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfU0lNUExFIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAoreyJzaW1wbGVtbXgiLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfU0lNUExFTU1YIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAoreyJhcm0iLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfQVJNIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAoreyJhbHRpdmVjIiwgImV4cGVyaW1lbnRhbCAvIGZvciBkZWJ1Z2dpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX0FMVElWRUMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJpZGN0In0sCisjaWYgRkZfQVBJX0FSQ0hfU0g0Cit7InNoNCIsICJleHBlcmltZW50YWwgLyBmb3IgZGVidWdnaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSDQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJpZGN0In0sCisjZW5kaWYKK3sic2ltcGxlYXJtIiwgImV4cGVyaW1lbnRhbCAvIGZvciBkZWJ1Z2dpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX1NJTVBMRUFSTSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKK3sic2ltcGxlYXJtdjV0ZSIsICJleHBlcmltZW50YWwgLyBmb3IgZGVidWdnaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSU1QTEVBUk1WNVRFIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAoreyJzaW1wbGVhcm12NiIsICJleHBlcmltZW50YWwgLyBmb3IgZGVidWdnaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSU1QTEVBUk1WNiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKK3sic2ltcGxlbmVvbiIsICJleHBlcmltZW50YWwgLyBmb3IgZGVidWdnaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSU1QTEVORU9OIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAorI2lmIEZGX0FQSV9BUkNIX0FMUEhBCit7InNpbXBsZWFscGhhIiwgImV4cGVyaW1lbnRhbCAvIGZvciBkZWJ1Z2dpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX1NJTVBMRUFMUEhBIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAorI2VuZGlmCit7ImlwcCIsICJleHBlcmltZW50YWwgLyBmb3IgZGVidWdnaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9JUFAgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJpZGN0In0sCit7Inh2aWQiLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfWFZJRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKK3sieHZpZG1teCIsICJleHBlcmltZW50YWwgLyBmb3IgZGVidWdnaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9YVklEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAoreyJmYWFuaSIsICJmbG9hdGluZyBwb2ludCBBQU4gSURDVCAoZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZykiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX0ZBQU4gfSwgSU5UX01JTiwgSU5UX01BWCwgVnxEfEUsICJpZGN0In0sCit7InNpbXBsZWF1dG8iLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfU0lNUExFQVVUTyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKK3tOVUxMfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGF2ZGN0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICAgICAgICAgICA9ICJBVkRDVCIsCisgICAgLm9wdGlvbiAgICAgICAgICAgICAgICAgID0gYXZkY3Rfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgICAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitjb25zdCBBVkNsYXNzICphdmNvZGVjX2RjdF9nZXRfY2xhc3Modm9pZCkKK3sKKyAgICByZXR1cm4gJmF2ZGN0X2NsYXNzOworfQorCitBVkRDVCAqYXZjb2RlY19kY3RfYWxsb2Modm9pZCkKK3sKKyAgICBBVkRDVCAqZHNwID0gYXZfbWFsbG9jeihzaXplb2YoQVZEQ1QpKTsKKworICAgIGlmICghZHNwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGRzcC0+YXZfY2xhc3MgPSAmYXZkY3RfY2xhc3M7CisgICAgYXZfb3B0X3NldF9kZWZhdWx0cyhkc3ApOworCisgICAgcmV0dXJuIGRzcDsKK30KKworaW50IGF2Y29kZWNfZGN0X2luaXQoQVZEQ1QgKmRzcCkKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOworCisgICAgaWYgKCFhdmN0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2Y3R4LT5pZGN0X2FsZ28gPSBkc3AtPmlkY3RfYWxnbzsKKyAgICBhdmN0eC0+ZGN0X2FsZ28gID0gZHNwLT5kY3RfYWxnbzsKKworI2RlZmluZSBDT1BZKHNyYywgbmFtZSkgbWVtY3B5KCZkc3AtPm5hbWUsICZzcmMubmFtZSwgc2l6ZW9mKGRzcC0+bmFtZSkpCisKKyNpZiBDT05GSUdfSURDVERTUAorICAgIHsKKyAgICAgICAgSURDVERTUENvbnRleHQgaWRzcDsKKyAgICAgICAgZmZfaWRjdGRzcF9pbml0KCZpZHNwLCBhdmN0eCk7CisgICAgICAgIENPUFkoaWRzcCwgaWRjdCk7CisgICAgICAgIENPUFkoaWRzcCwgaWRjdF9wZXJtdXRhdGlvbik7CisgICAgfQorI2VuZGlmCisKKyNpZiBDT05GSUdfRkRDVERTUAorICAgIHsKKyAgICAgICAgRkRDVERTUENvbnRleHQgZmRzcDsKKyAgICAgICAgZmZfZmRjdGRzcF9pbml0KCZmZHNwLCBhdmN0eCk7CisgICAgICAgIENPUFkoZmRzcCwgZmRjdCk7CisgICAgfQorI2VuZGlmCisKKyNpZiBDT05GSUdfUElYQkxPQ0tEU1AKKyAgICB7CisgICAgICAgIFBpeGJsb2NrRFNQQ29udGV4dCBwZHNwOworICAgICAgICBmZl9waXhibG9ja2RzcF9pbml0KCZwZHNwLCBhdmN0eCk7CisgICAgICAgIENPUFkocGRzcCwgZ2V0X3BpeGVscyk7CisgICAgfQorI2VuZGlmCisKKyAgICBhdmNvZGVjX2Nsb3NlKGF2Y3R4KTsKKyAgICBhdl9mcmVlKGF2Y3R4KTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXZkY3QuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2F2ZGN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwZWZlMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F2ZGN0LmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVZEQ1RfSAorI2RlZmluZSBBVkNPREVDX0FWRENUX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworLyoqCisgKiBBVkRDVCBjb250ZXh0LgorICogQG5vdGUgZnVuY3Rpb24gcG9pbnRlcnMgY2FuIGJlIE5VTEwgaWYgdGhlIHNwZWNpZmljIGZlYXR1cmVzIGhhdmUgYmVlbgorICogICAgICAgZGlzYWJsZWQgYXQgYnVpbGQgdGltZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZEQ1QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmF2X2NsYXNzOworCisgICAgdm9pZCAoKmlkY3QpKGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovKTsKKworICAgIC8qKgorICAgICAqIElEQ1QgaW5wdXQgcGVybXV0YXRpb24uCisgICAgICogU2V2ZXJhbCBvcHRpbWl6ZWQgSURDVHMgbmVlZCBhIHBlcm11dGF0ZWQgaW5wdXQgKHJlbGF0aXZlIHRvIHRoZQorICAgICAqIG5vcm1hbCBvcmRlciBvZiB0aGUgcmVmZXJlbmNlIElEQ1QpLgorICAgICAqIFRoaXMgcGVybXV0YXRpb24gbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBpZGN0X3B1dC9hZGQuCisgICAgICogTm90ZSwgbm9ybWFsbHkgdGhpcyBjYW4gYmUgbWVyZ2VkIHdpdGggdGhlIHppZ3phZy9hbHRlcm5hdGUgc2Nhbjxicj4KKyAgICAgKiBBbiBleGFtcGxlIHRvIGF2b2lkIGNvbmZ1c2lvbjoKKyAgICAgKiAtICgtPmRlY29kZSBjb2VmZnMgLT4gemlnemFnIHJlb3JkZXIgLT4gZGVxdWFudCAtPiByZWZlcmVuY2UgSURDVCAtPiAuLi4pCisgICAgICogLSAoeCAtPiByZWZlcmVuY2UgRENUIC0+IHJlZmVyZW5jZSBJRENUIC0+IHgpCisgICAgICogLSAoeCAtPiByZWZlcmVuY2UgRENUIC0+IHNpbXBsZV9tbXhfcGVybSA9IGlkY3RfcGVybXV0YXRpb24KKyAgICAgKiAgICAtPiBzaW1wbGVfaWRjdF9tbXggLT4geCkKKyAgICAgKiAtICgtPiBkZWNvZGUgY29lZmZzIC0+IHppZ3phZyByZW9yZGVyIC0+IHNpbXBsZV9tbXhfcGVybSAtPiBkZXF1YW50CisgICAgICogICAgLT4gc2ltcGxlX2lkY3RfbW14IC0+IC4uLikKKyAgICAgKi8KKyAgICB1aW50OF90IGlkY3RfcGVybXV0YXRpb25bNjRdOworCisgICAgdm9pZCAoKmZkY3QpKGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovKTsKKworCisgICAgLyoqCisgICAgICogRENUIGFsZ29yaXRobS4KKyAgICAgKiBtdXN0IHVzZSBBVk9wdGlvbnMgdG8gc2V0IHRoaXMgZmllbGQuCisgICAgICovCisgICAgaW50IGRjdF9hbGdvOworCisgICAgLyoqCisgICAgICogSURDVCBhbGdvcml0aG0uCisgICAgICogbXVzdCB1c2UgQVZPcHRpb25zIHRvIHNldCB0aGlzIGZpZWxkLgorICAgICAqLworICAgIGludCBpZGN0X2FsZ287CisKKyAgICB2b2lkICgqZ2V0X3BpeGVscykoaW50MTZfdCAqYmxvY2sgLyogYWxpZ24gMTYgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscyAvKiBhbGlnbiA4ICovLAorICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKK30gQVZEQ1Q7CisKKy8qKgorICogQWxsb2NhdGVzIGEgQVZEQ1QgY29udGV4dC4KKyAqIFRoaXMgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCBhdmNvZGVjX2RjdF9pbml0KCkgYWZ0ZXIgb3B0aW9uYWxseQorICogY29uZmlndXJpbmcgaXQgd2l0aCBBVk9wdGlvbnMuCisgKgorICogVG8gZnJlZSBpdCB1c2UgYXZfZnJlZSgpCisgKi8KK0FWRENUICphdmNvZGVjX2RjdF9hbGxvYyh2b2lkKTsKK2ludCBhdmNvZGVjX2RjdF9pbml0KEFWRENUICopOworCitjb25zdCBBVkNsYXNzICphdmNvZGVjX2RjdF9nZXRfY2xhc3Modm9pZCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FWRENUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F2ZmZ0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hdmZmdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDBmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdmZmdC5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJhdmZmdC5oIgorI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgInJkZnQuaCIKKyNpbmNsdWRlICJkY3QuaCIKKworLyogRkZUICovCisKK0ZGVENvbnRleHQgKmF2X2ZmdF9pbml0KGludCBuYml0cywgaW50IGludmVyc2UpCit7CisgICAgRkZUQ29udGV4dCAqcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzKSk7CisKKyAgICBpZiAocyAmJiBmZl9mZnRfaW5pdChzLCBuYml0cywgaW52ZXJzZSkpCisgICAgICAgIGF2X2ZyZWVwKCZzKTsKKworICAgIHJldHVybiBzOworfQorCit2b2lkIGF2X2ZmdF9wZXJtdXRlKEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopCit7CisgICAgcy0+ZmZ0X3Blcm11dGUocywgeik7Cit9CisKK3ZvaWQgYXZfZmZ0X2NhbGMoRkZUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqeikKK3sKKyAgICBzLT5mZnRfY2FsYyhzLCB6KTsKK30KKworYXZfY29sZCB2b2lkIGF2X2ZmdF9lbmQoRkZUQ29udGV4dCAqcykKK3sKKyAgICBpZiAocykgeworICAgICAgICBmZl9mZnRfZW5kKHMpOworICAgICAgICBhdl9mcmVlKHMpOworICAgIH0KK30KKworI2lmIENPTkZJR19NRENUCisKK0ZGVENvbnRleHQgKmF2X21kY3RfaW5pdChpbnQgbmJpdHMsIGludCBpbnZlcnNlLCBkb3VibGUgc2NhbGUpCit7CisgICAgRkZUQ29udGV4dCAqcyA9IGF2X21hbGxvYyhzaXplb2YoKnMpKTsKKworICAgIGlmIChzICYmIGZmX21kY3RfaW5pdChzLCBuYml0cywgaW52ZXJzZSwgc2NhbGUpKQorICAgICAgICBhdl9mcmVlcCgmcyk7CisKKyAgICByZXR1cm4gczsKK30KKwordm9pZCBhdl9pbWRjdF9jYWxjKEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KQoreworICAgIHMtPmltZGN0X2NhbGMocywgb3V0cHV0LCBpbnB1dCk7Cit9CisKK3ZvaWQgYXZfaW1kY3RfaGFsZihGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm91dHB1dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dCkKK3sKKyAgICBzLT5pbWRjdF9oYWxmKHMsIG91dHB1dCwgaW5wdXQpOworfQorCit2b2lkIGF2X21kY3RfY2FsYyhGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm91dHB1dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dCkKK3sKKyAgICBzLT5tZGN0X2NhbGMocywgb3V0cHV0LCBpbnB1dCk7Cit9CisKK2F2X2NvbGQgdm9pZCBhdl9tZGN0X2VuZChGRlRDb250ZXh0ICpzKQoreworICAgIGlmIChzKSB7CisgICAgICAgIGZmX21kY3RfZW5kKHMpOworICAgICAgICBhdl9mcmVlKHMpOworICAgIH0KK30KKworI2VuZGlmIC8qIENPTkZJR19NRENUICovCisKKyNpZiBDT05GSUdfUkRGVAorCitSREZUQ29udGV4dCAqYXZfcmRmdF9pbml0KGludCBuYml0cywgZW51bSBSREZUcmFuc2Zvcm1UeXBlIHRyYW5zKQoreworICAgIFJERlRDb250ZXh0ICpzID0gYXZfbWFsbG9jKHNpemVvZigqcykpOworCisgICAgaWYgKHMgJiYgZmZfcmRmdF9pbml0KHMsIG5iaXRzLCB0cmFucykpCisgICAgICAgIGF2X2ZyZWVwKCZzKTsKKworICAgIHJldHVybiBzOworfQorCit2b2lkIGF2X3JkZnRfY2FsYyhSREZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpkYXRhKQoreworICAgIHMtPnJkZnRfY2FsYyhzLCBkYXRhKTsKK30KKworYXZfY29sZCB2b2lkIGF2X3JkZnRfZW5kKFJERlRDb250ZXh0ICpzKQoreworICAgIGlmIChzKSB7CisgICAgICAgIGZmX3JkZnRfZW5kKHMpOworICAgICAgICBhdl9mcmVlKHMpOworICAgIH0KK30KKworI2VuZGlmIC8qIENPTkZJR19SREZUICovCisKKyNpZiBDT05GSUdfRENUCisKK0RDVENvbnRleHQgKmF2X2RjdF9pbml0KGludCBuYml0cywgZW51bSBEQ1RUcmFuc2Zvcm1UeXBlIGludmVyc2UpCit7CisgICAgRENUQ29udGV4dCAqcyA9IGF2X21hbGxvYyhzaXplb2YoKnMpKTsKKworICAgIGlmIChzICYmIGZmX2RjdF9pbml0KHMsIG5iaXRzLCBpbnZlcnNlKSkKKyAgICAgICAgYXZfZnJlZXAoJnMpOworCisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgYXZfZGN0X2NhbGMoRENUQ29udGV4dCAqcywgRkZUU2FtcGxlICpkYXRhKQoreworICAgIHMtPmRjdF9jYWxjKHMsIGRhdGEpOworfQorCithdl9jb2xkIHZvaWQgYXZfZGN0X2VuZChEQ1RDb250ZXh0ICpzKQoreworICAgIGlmIChzKSB7CisgICAgICAgIGZmX2RjdF9lbmQocyk7CisgICAgICAgIGF2X2ZyZWUocyk7CisgICAgfQorfQorCisjZW5kaWYgLyogQ09ORklHX0RDVCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXZmZnQuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2F2ZmZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwZjliOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F2ZmZ0LmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FWRkZUX0gKKyNkZWZpbmUgQVZDT0RFQ19BVkZGVF9ICisKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdmNfZmZ0CisgKiBGRlQgZnVuY3Rpb25zCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2Y19mZnQgRkZUIGZ1bmN0aW9ucworICogQGluZ3JvdXAgbGF2Y19taXNjCisgKgorICogQHsKKyAqLworCit0eXBlZGVmIGZsb2F0IEZGVFNhbXBsZTsKKwordHlwZWRlZiBzdHJ1Y3QgRkZUQ29tcGxleCB7CisgICAgRkZUU2FtcGxlIHJlLCBpbTsKK30gRkZUQ29tcGxleDsKKwordHlwZWRlZiBzdHJ1Y3QgRkZUQ29udGV4dCBGRlRDb250ZXh0OworCisvKioKKyAqIFNldCB1cCBhIGNvbXBsZXggRkZULgorICogQHBhcmFtIG5iaXRzICAgICAgICAgICBsb2cyIG9mIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGFycmF5CisgKiBAcGFyYW0gaW52ZXJzZSAgICAgICAgIGlmIDAgcGVyZm9ybSB0aGUgZm9yd2FyZCB0cmFuc2Zvcm0sIGlmIDEgcGVyZm9ybSB0aGUgaW52ZXJzZQorICovCitGRlRDb250ZXh0ICphdl9mZnRfaW5pdChpbnQgbmJpdHMsIGludCBpbnZlcnNlKTsKKworLyoqCisgKiBEbyB0aGUgcGVybXV0YXRpb24gbmVlZGVkIEJFRk9SRSBjYWxsaW5nIGZmX2ZmdF9jYWxjKCkuCisgKi8KK3ZvaWQgYXZfZmZ0X3Blcm11dGUoRkZUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqeik7CisKKy8qKgorICogRG8gYSBjb21wbGV4IEZGVCB3aXRoIHRoZSBwYXJhbWV0ZXJzIGRlZmluZWQgaW4gYXZfZmZ0X2luaXQoKS4gVGhlCisgKiBpbnB1dCBkYXRhIG11c3QgYmUgcGVybXV0ZWQgYmVmb3JlLiBObyAxLjAvc3FydChuKSBub3JtYWxpemF0aW9uIGlzIGRvbmUuCisgKi8KK3ZvaWQgYXZfZmZ0X2NhbGMoRkZUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqeik7CisKK3ZvaWQgYXZfZmZ0X2VuZChGRlRDb250ZXh0ICpzKTsKKworRkZUQ29udGV4dCAqYXZfbWRjdF9pbml0KGludCBuYml0cywgaW50IGludmVyc2UsIGRvdWJsZSBzY2FsZSk7Cit2b2lkIGF2X2ltZGN0X2NhbGMoRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpOwordm9pZCBhdl9pbWRjdF9oYWxmKEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKK3ZvaWQgYXZfbWRjdF9jYWxjKEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKK3ZvaWQgYXZfbWRjdF9lbmQoRkZUQ29udGV4dCAqcyk7CisKKy8qIFJlYWwgRGlzY3JldGUgRm91cmllciBUcmFuc2Zvcm0gKi8KKworZW51bSBSREZUcmFuc2Zvcm1UeXBlIHsKKyAgICBERlRfUjJDLAorICAgIElERlRfQzJSLAorICAgIElERlRfUjJDLAorICAgIERGVF9DMlIsCit9OworCit0eXBlZGVmIHN0cnVjdCBSREZUQ29udGV4dCBSREZUQ29udGV4dDsKKworLyoqCisgKiBTZXQgdXAgYSByZWFsIEZGVC4KKyAqIEBwYXJhbSBuYml0cyAgICAgICAgICAgbG9nMiBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBhcnJheQorICogQHBhcmFtIHRyYW5zICAgICAgICAgICB0aGUgdHlwZSBvZiB0cmFuc2Zvcm0KKyAqLworUkRGVENvbnRleHQgKmF2X3JkZnRfaW5pdChpbnQgbmJpdHMsIGVudW0gUkRGVHJhbnNmb3JtVHlwZSB0cmFucyk7Cit2b2lkIGF2X3JkZnRfY2FsYyhSREZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpkYXRhKTsKK3ZvaWQgYXZfcmRmdF9lbmQoUkRGVENvbnRleHQgKnMpOworCisvKiBEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtICovCisKK3R5cGVkZWYgc3RydWN0IERDVENvbnRleHQgRENUQ29udGV4dDsKKworZW51bSBEQ1RUcmFuc2Zvcm1UeXBlIHsKKyAgICBEQ1RfSUkgPSAwLAorICAgIERDVF9JSUksCisgICAgRENUX0ksCisgICAgRFNUX0ksCit9OworCisvKioKKyAqIFNldCB1cCBEQ1QuCisgKgorICogQHBhcmFtIG5iaXRzICAgICAgICAgICBzaXplIG9mIHRoZSBpbnB1dCBhcnJheToKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgbmJpdHMpICAgICBmb3IgRENULUlJLCBEQ1QtSUlJIGFuZCBEU1QtSQorICogICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBuYml0cykgKyAxIGZvciBEQ1QtSQorICogQHBhcmFtIHR5cGUgICAgICAgICAgICB0aGUgdHlwZSBvZiB0cmFuc2Zvcm0KKyAqCisgKiBAbm90ZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgaW5wdXQgb2YgRFNULUkgaXMgaWdub3JlZAorICovCitEQ1RDb250ZXh0ICphdl9kY3RfaW5pdChpbnQgbmJpdHMsIGVudW0gRENUVHJhbnNmb3JtVHlwZSB0eXBlKTsKK3ZvaWQgYXZfZGN0X2NhbGMoRENUQ29udGV4dCAqcywgRkZUU2FtcGxlICpkYXRhKTsKK3ZvaWQgYXZfZGN0X2VuZCAoRENUQ29udGV4dCAqcyk7CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZDT0RFQ19BVkZGVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hdnBhY2tldC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXZwYWNrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI2MDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXZwYWNrZXQuYwpAQCAtMCwwICsxLDU3NiBAQAorLyoKKyAqIEFWUGFja2V0IGZ1bmN0aW9ucyBmb3IgbGliYXZjb2RlYworICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKKwordm9pZCBhdl9kZXN0cnVjdF9wYWNrZXQoQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBhdl9mcmVlcCgmcGt0LT5kYXRhKTsKKyAgICBwa3QtPnNpemUgPSAwOworfQorCisvKiBhIGR1bW15IGRlc3RydWN0IGNhbGxiYWNrIGZvciB0aGUgY2FsbGVycyB0aGF0IGFzc3VtZSBBVlBhY2tldC5kZXN0cnVjdCA9PQorICogTlVMTCA9PiBzdGF0aWMgZGF0YSAqLworc3RhdGljIHZvaWQgZHVtbXlfZGVzdHJ1Y3RfcGFja2V0KEFWUGFja2V0ICpwa3QpCit7CisgICAgYXZfYXNzZXJ0MCgwKTsKK30KKyNlbmRpZgorCit2b2lkIGF2X2luaXRfcGFja2V0KEFWUGFja2V0ICpwa3QpCit7CisgICAgcGt0LT5wdHMgICAgICAgICAgICAgICAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgIHBrdC0+ZHRzICAgICAgICAgICAgICAgICAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBwa3QtPnBvcyAgICAgICAgICAgICAgICAgID0gLTE7CisgICAgcGt0LT5kdXJhdGlvbiAgICAgICAgICAgICA9IDA7CisgICAgcGt0LT5jb252ZXJnZW5jZV9kdXJhdGlvbiA9IDA7CisgICAgcGt0LT5mbGFncyAgICAgICAgICAgICAgICA9IDA7CisgICAgcGt0LT5zdHJlYW1faW5kZXggICAgICAgICA9IDA7CisjaWYgRkZfQVBJX0RFU1RSVUNUX1BBQ0tFVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIHBrdC0+ZGVzdHJ1Y3QgICAgICAgICAgICAgPSBOVUxMOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICBwa3QtPmJ1ZiAgICAgICAgICAgICAgICAgID0gTlVMTDsKKyAgICBwa3QtPnNpZGVfZGF0YSAgICAgICAgICAgID0gTlVMTDsKKyAgICBwa3QtPnNpZGVfZGF0YV9lbGVtcyAgICAgID0gMDsKK30KKworc3RhdGljIGludCBwYWNrZXRfYWxsb2MoQVZCdWZmZXJSZWYgKipidWYsIGludCBzaXplKQoreworICAgIGludCByZXQ7CisgICAgaWYgKCh1bnNpZ25lZClzaXplID49ICh1bnNpZ25lZClzaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHJldCA9IGF2X2J1ZmZlcl9yZWFsbG9jKGJ1Ziwgc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgbWVtc2V0KCgqYnVmKS0+ZGF0YSArIHNpemUsIDAsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9uZXdfcGFja2V0KEFWUGFja2V0ICpwa3QsIGludCBzaXplKQoreworICAgIEFWQnVmZmVyUmVmICpidWYgPSBOVUxMOworICAgIGludCByZXQgPSBwYWNrZXRfYWxsb2MoJmJ1Ziwgc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdl9pbml0X3BhY2tldChwa3QpOworICAgIHBrdC0+YnVmICAgICAgPSBidWY7CisgICAgcGt0LT5kYXRhICAgICA9IGJ1Zi0+ZGF0YTsKKyAgICBwa3QtPnNpemUgICAgID0gc2l6ZTsKKyNpZiBGRl9BUElfREVTVFJVQ1RfUEFDS0VUCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgcGt0LT5kZXN0cnVjdCA9IGR1bW15X2Rlc3RydWN0X3BhY2tldDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBhdl9zaHJpbmtfcGFja2V0KEFWUGFja2V0ICpwa3QsIGludCBzaXplKQoreworICAgIGlmIChwa3QtPnNpemUgPD0gc2l6ZSkKKyAgICAgICAgcmV0dXJuOworICAgIHBrdC0+c2l6ZSA9IHNpemU7CisgICAgbWVtc2V0KHBrdC0+ZGF0YSArIHNpemUsIDAsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworfQorCitpbnQgYXZfZ3Jvd19wYWNrZXQoQVZQYWNrZXQgKnBrdCwgaW50IGdyb3dfYnkpCit7CisgICAgaW50IG5ld19zaXplOworICAgIGF2X2Fzc2VydDAoKHVuc2lnbmVkKXBrdC0+c2l6ZSA8PSBJTlRfTUFYIC0gRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFwa3QtPnNpemUpCisgICAgICAgIHJldHVybiBhdl9uZXdfcGFja2V0KHBrdCwgZ3Jvd19ieSk7CisgICAgaWYgKCh1bnNpZ25lZClncm93X2J5ID4KKyAgICAgICAgSU5UX01BWCAtIChwa3QtPnNpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgbmV3X3NpemUgPSBwa3QtPnNpemUgKyBncm93X2J5ICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRTsKKyAgICBpZiAocGt0LT5idWYpIHsKKyAgICAgICAgaW50IHJldCA9IGF2X2J1ZmZlcl9yZWFsbG9jKCZwa3QtPmJ1ZiwgbmV3X3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGt0LT5idWYgPSBhdl9idWZmZXJfYWxsb2MobmV3X3NpemUpOworICAgICAgICBpZiAoIXBrdC0+YnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KHBrdC0+YnVmLT5kYXRhLCBwa3QtPmRhdGEsIEZGTUlOKHBrdC0+c2l6ZSwgcGt0LT5zaXplICsgZ3Jvd19ieSkpOworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgcGt0LT5kZXN0cnVjdCA9IGR1bW15X2Rlc3RydWN0X3BhY2tldDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgfQorICAgIHBrdC0+ZGF0YSAgPSBwa3QtPmJ1Zi0+ZGF0YTsKKyAgICBwa3QtPnNpemUgKz0gZ3Jvd19ieTsKKyAgICBtZW1zZXQocGt0LT5kYXRhICsgcGt0LT5zaXplLCAwLCBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgYXZfcGFja2V0X2Zyb21fZGF0YShBVlBhY2tldCAqcGt0LCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA+PSBJTlRfTUFYIC0gRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHBrdC0+YnVmID0gYXZfYnVmZmVyX2NyZWF0ZShkYXRhLCBzaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYnVmZmVyX2RlZmF1bHRfZnJlZSwgTlVMTCwgMCk7CisgICAgaWYgKCFwa3QtPmJ1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHBrdC0+ZGF0YSA9IGRhdGE7CisgICAgcGt0LT5zaXplID0gc2l6ZTsKKyNpZiBGRl9BUElfREVTVFJVQ1RfUEFDS0VUCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgcGt0LT5kZXN0cnVjdCA9IGR1bW15X2Rlc3RydWN0X3BhY2tldDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBBTExPQ19NQUxMT0MoZGF0YSwgc2l6ZSkgZGF0YSA9IGF2X21hbGxvYyhzaXplKQorI2RlZmluZSBBTExPQ19CVUYoZGF0YSwgc2l6ZSkgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2J1ZmZlcl9yZWFsbG9jKCZwa3QtPmJ1Ziwgc2l6ZSk7ICAgICAgXAorICAgIGRhdGEgPSBwa3QtPmJ1ZiA/IHBrdC0+YnVmLT5kYXRhIDogTlVMTDsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEVVBfREFUQShkc3QsIHNyYywgc2l6ZSwgcGFkZGluZywgQUxMT0MpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2b2lkICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAocGFkZGluZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoc2l6ZSkgPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCkoc2l6ZSkgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkX2FsbG9jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxMT0MoZGF0YSwgc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOyAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxMT0MoZGF0YSwgc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIWRhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZ290byBmYWlsZWRfYWxsb2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtZW1jcHkoZGF0YSwgc3JjLCBzaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAocGFkZGluZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbWVtc2V0KCh1aW50OF90ICopZGF0YSArIHNpemUsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3QgPSBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIE1ha2VzIGR1cGxpY2F0ZXMgb2YgZGF0YSwgc2lkZV9kYXRhLCBidXQgZG9lcyBub3QgY29weSBhbnkgb3RoZXIgZmllbGRzICovCitzdGF0aWMgaW50IGNvcHlfcGFja2V0X2RhdGEoQVZQYWNrZXQgKnBrdCwgY29uc3QgQVZQYWNrZXQgKnNyYywgaW50IGR1cCkKK3sKKyAgICBwa3QtPmRhdGEgICAgICA9IE5VTEw7CisgICAgcGt0LT5zaWRlX2RhdGEgPSBOVUxMOworICAgIGlmIChwa3QtPmJ1ZikgeworICAgICAgICBBVkJ1ZmZlclJlZiAqcmVmID0gYXZfYnVmZmVyX3JlZihzcmMtPmJ1Zik7CisgICAgICAgIGlmICghcmVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcGt0LT5idWYgID0gcmVmOworICAgICAgICBwa3QtPmRhdGEgPSByZWYtPmRhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRFVQX0RBVEEocGt0LT5kYXRhLCBzcmMtPmRhdGEsIHBrdC0+c2l6ZSwgMSwgQUxMT0NfQlVGKTsKKyAgICB9CisjaWYgRkZfQVBJX0RFU1RSVUNUX1BBQ0tFVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIHBrdC0+ZGVzdHJ1Y3QgPSBkdW1teV9kZXN0cnVjdF9wYWNrZXQ7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorICAgIGlmIChwa3QtPnNpZGVfZGF0YV9lbGVtcyAmJiBkdXApCisgICAgICAgIHBrdC0+c2lkZV9kYXRhID0gc3JjLT5zaWRlX2RhdGE7CisgICAgaWYgKHBrdC0+c2lkZV9kYXRhX2VsZW1zICYmICFkdXApIHsKKyAgICAgICAgcmV0dXJuIGF2X2NvcHlfcGFja2V0X3NpZGVfZGF0YShwa3QsIHNyYyk7CisgICAgfQorICAgIHJldHVybiAwOworCitmYWlsZWRfYWxsb2M6CisgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCitpbnQgYXZfY29weV9wYWNrZXRfc2lkZV9kYXRhKEFWUGFja2V0ICpwa3QsIGNvbnN0IEFWUGFja2V0ICpzcmMpCit7CisgICAgaWYgKHNyYy0+c2lkZV9kYXRhX2VsZW1zKSB7CisgICAgICAgIGludCBpOworICAgICAgICBEVVBfREFUQShwa3QtPnNpZGVfZGF0YSwgc3JjLT5zaWRlX2RhdGEsCisgICAgICAgICAgICAgICAgc3JjLT5zaWRlX2RhdGFfZWxlbXMgKiBzaXplb2YoKnNyYy0+c2lkZV9kYXRhKSwgMCwgQUxMT0NfTUFMTE9DKTsKKyAgICAgICAgaWYgKHNyYyAhPSBwa3QpIHsKKyAgICAgICAgICAgIG1lbXNldChwa3QtPnNpZGVfZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICBzcmMtPnNpZGVfZGF0YV9lbGVtcyAqIHNpemVvZigqc3JjLT5zaWRlX2RhdGEpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3JjLT5zaWRlX2RhdGFfZWxlbXM7IGkrKykgeworICAgICAgICAgICAgRFVQX0RBVEEocGt0LT5zaWRlX2RhdGFbaV0uZGF0YSwgc3JjLT5zaWRlX2RhdGFbaV0uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgc3JjLT5zaWRlX2RhdGFbaV0uc2l6ZSwgMSwgQUxMT0NfTUFMTE9DKTsKKyAgICAgICAgICAgIHBrdC0+c2lkZV9kYXRhW2ldLnNpemUgPSBzcmMtPnNpZGVfZGF0YVtpXS5zaXplOworICAgICAgICAgICAgcGt0LT5zaWRlX2RhdGFbaV0udHlwZSA9IHNyYy0+c2lkZV9kYXRhW2ldLnR5cGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcGt0LT5zaWRlX2RhdGFfZWxlbXMgPSBzcmMtPnNpZGVfZGF0YV9lbGVtczsKKyAgICByZXR1cm4gMDsKKworZmFpbGVkX2FsbG9jOgorICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworaW50IGF2X2R1cF9wYWNrZXQoQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVlBhY2tldCB0bXBfcGt0OworCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgaWYgKCFwa3QtPmJ1ZiAmJiBwa3QtPmRhdGEKKyNpZiBGRl9BUElfREVTVFJVQ1RfUEFDS0VUCisgICAgICAgICYmICFwa3QtPmRlc3RydWN0CisjZW5kaWYKKyAgICAgICAgKSB7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgdG1wX3BrdCA9ICpwa3Q7CisgICAgICAgIHJldHVybiBjb3B5X3BhY2tldF9kYXRhKHBrdCwgJnRtcF9wa3QsIDEpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X2NvcHlfcGFja2V0KEFWUGFja2V0ICpkc3QsIGNvbnN0IEFWUGFja2V0ICpzcmMpCit7CisgICAgKmRzdCA9ICpzcmM7CisgICAgcmV0dXJuIGNvcHlfcGFja2V0X2RhdGEoZHN0LCBzcmMsIDApOworfQorCit2b2lkIGF2X3BhY2tldF9mcmVlX3NpZGVfZGF0YShBVlBhY2tldCAqcGt0KQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBwa3QtPnNpZGVfZGF0YV9lbGVtczsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmcGt0LT5zaWRlX2RhdGFbaV0uZGF0YSk7CisgICAgYXZfZnJlZXAoJnBrdC0+c2lkZV9kYXRhKTsKKyAgICBwa3QtPnNpZGVfZGF0YV9lbGVtcyA9IDA7Cit9CisKK3ZvaWQgYXZfZnJlZV9wYWNrZXQoQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpZiAocGt0KSB7CitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgIGlmIChwa3QtPmJ1ZikKKyAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcGt0LT5idWYpOworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKKyAgICAgICAgZWxzZSBpZiAocGt0LT5kZXN0cnVjdCkKKyAgICAgICAgICAgIHBrdC0+ZGVzdHJ1Y3QocGt0KTsKKyAgICAgICAgcGt0LT5kZXN0cnVjdCA9IE5VTEw7CisjZW5kaWYKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICBwa3QtPmRhdGEgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIHBrdC0+c2l6ZSAgICAgICAgICAgID0gMDsKKworICAgICAgICBhdl9wYWNrZXRfZnJlZV9zaWRlX2RhdGEocGt0KTsKKyAgICB9Cit9CisKK3VpbnQ4X3QgKmF2X3BhY2tldF9uZXdfc2lkZV9kYXRhKEFWUGFja2V0ICpwa3QsIGVudW0gQVZQYWNrZXRTaWRlRGF0YVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKQoreworICAgIGludCBlbGVtcyA9IHBrdC0+c2lkZV9kYXRhX2VsZW1zOworCisgICAgaWYgKCh1bnNpZ25lZCllbGVtcyArIDEgPiBJTlRfTUFYIC8gc2l6ZW9mKCpwa3QtPnNpZGVfZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgodW5zaWduZWQpc2l6ZSA+IElOVF9NQVggLSBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHBrdC0+c2lkZV9kYXRhID0gYXZfcmVhbGxvYyhwa3QtPnNpZGVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsZW1zICsgMSkgKiBzaXplb2YoKnBrdC0+c2lkZV9kYXRhKSk7CisgICAgaWYgKCFwa3QtPnNpZGVfZGF0YSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBwa3QtPnNpZGVfZGF0YVtlbGVtc10uZGF0YSA9IGF2X21hbGxvY3ooc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghcGt0LT5zaWRlX2RhdGFbZWxlbXNdLmRhdGEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBrdC0+c2lkZV9kYXRhW2VsZW1zXS5zaXplID0gc2l6ZTsKKyAgICBwa3QtPnNpZGVfZGF0YVtlbGVtc10udHlwZSA9IHR5cGU7CisgICAgcGt0LT5zaWRlX2RhdGFfZWxlbXMrKzsKKworICAgIHJldHVybiBwa3QtPnNpZGVfZGF0YVtlbGVtc10uZGF0YTsKK30KKwordWludDhfdCAqYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoQVZQYWNrZXQgKnBrdCwgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzaXplKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBrdC0+c2lkZV9kYXRhX2VsZW1zOyBpKyspIHsKKyAgICAgICAgaWYgKHBrdC0+c2lkZV9kYXRhW2ldLnR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgaWYgKHNpemUpCisgICAgICAgICAgICAgICAgKnNpemUgPSBwa3QtPnNpZGVfZGF0YVtpXS5zaXplOworICAgICAgICAgICAgcmV0dXJuIHBrdC0+c2lkZV9kYXRhW2ldLmRhdGE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgRkZfTUVSR0VfTUFSS0VSIDB4OGM0ZDlkMTA4ZTI1ZTlmZVVMTAorCitpbnQgYXZfcGFja2V0X21lcmdlX3NpZGVfZGF0YShBVlBhY2tldCAqcGt0KXsKKyAgICBpZihwa3QtPnNpZGVfZGF0YV9lbGVtcyl7CisgICAgICAgIEFWQnVmZmVyUmVmICpidWY7CisgICAgICAgIGludCBpOworICAgICAgICB1aW50OF90ICpwOworICAgICAgICB1aW50NjRfdCBzaXplPSBwa3QtPnNpemUgKyA4TEwgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFOworICAgICAgICBBVlBhY2tldCBvbGQ9ICpwa3Q7CisgICAgICAgIGZvciAoaT0wOyBpPG9sZC5zaWRlX2RhdGFfZWxlbXM7IGkrKykgeworICAgICAgICAgICAgc2l6ZSArPSBvbGQuc2lkZV9kYXRhW2ldLnNpemUgKyA1TEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPiBJTlRfTUFYKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgYnVmID0gYXZfYnVmZmVyX2FsbG9jKHNpemUpOworICAgICAgICBpZiAoIWJ1ZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHBrdC0+YnVmID0gYnVmOworICAgICAgICBwa3QtPmRhdGEgPSBwID0gYnVmLT5kYXRhOworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgcGt0LT5kZXN0cnVjdCA9IGR1bW15X2Rlc3RydWN0X3BhY2tldDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgICAgIHBrdC0+c2l6ZSA9IHNpemUgLSBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFOworICAgICAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnAsIG9sZC5kYXRhLCBvbGQuc2l6ZSk7CisgICAgICAgIGZvciAoaT1vbGQuc2lkZV9kYXRhX2VsZW1zLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZwLCBvbGQuc2lkZV9kYXRhW2ldLmRhdGEsIG9sZC5zaWRlX2RhdGFbaV0uc2l6ZSk7CisgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwLCBvbGQuc2lkZV9kYXRhW2ldLnNpemUpOworICAgICAgICAgICAgKnArKyA9IG9sZC5zaWRlX2RhdGFbaV0udHlwZSB8ICgoaT09b2xkLnNpZGVfZGF0YV9lbGVtcy0xKSoxMjgpOworICAgICAgICB9CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlNjQoJnAsIEZGX01FUkdFX01BUktFUik7CisgICAgICAgIGF2X2Fzc2VydDAocC1wa3QtPmRhdGEgPT0gcGt0LT5zaXplKTsKKyAgICAgICAgbWVtc2V0KHAsIDAsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBhdl9mcmVlX3BhY2tldCgmb2xkKTsKKyAgICAgICAgcGt0LT5zaWRlX2RhdGFfZWxlbXMgPSAwOworICAgICAgICBwa3QtPnNpZGVfZGF0YSA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X3BhY2tldF9zcGxpdF9zaWRlX2RhdGEoQVZQYWNrZXQgKnBrdCl7CisgICAgaWYgKCFwa3QtPnNpZGVfZGF0YV9lbGVtcyAmJiBwa3QtPnNpemUgPjEyICYmIEFWX1JCNjQocGt0LT5kYXRhICsgcGt0LT5zaXplIC0gOCkgPT0gRkZfTUVSR0VfTUFSS0VSKXsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHVuc2lnbmVkIGludCBzaXplOworICAgICAgICB1aW50OF90ICpwOworCisgICAgICAgIHAgPSBwa3QtPmRhdGEgKyBwa3QtPnNpemUgLSA4IC0gNTsKKyAgICAgICAgZm9yIChpPTE7IDsgaSsrKXsKKyAgICAgICAgICAgIHNpemUgPSBBVl9SQjMyKHApOworICAgICAgICAgICAgaWYgKHNpemU+SU5UX01BWCB8fCBwIC0gcGt0LT5kYXRhIDwgc2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChwWzRdJjEyOCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHAtPSBzaXplKzU7CisgICAgICAgIH0KKworICAgICAgICBwa3QtPnNpZGVfZGF0YSA9IGF2X21hbGxvY19hcnJheShpLCBzaXplb2YoKnBrdC0+c2lkZV9kYXRhKSk7CisgICAgICAgIGlmICghcGt0LT5zaWRlX2RhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHA9IHBrdC0+ZGF0YSArIHBrdC0+c2l6ZSAtIDggLSA1OworICAgICAgICBmb3IgKGk9MDsgOyBpKyspeworICAgICAgICAgICAgc2l6ZT0gQVZfUkIzMihwKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoc2l6ZTw9SU5UX01BWCAmJiBwIC0gcGt0LT5kYXRhID49IHNpemUpOworICAgICAgICAgICAgcGt0LT5zaWRlX2RhdGFbaV0uZGF0YSA9IGF2X21hbGxvY3ooc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgcGt0LT5zaWRlX2RhdGFbaV0uc2l6ZSA9IHNpemU7CisgICAgICAgICAgICBwa3QtPnNpZGVfZGF0YVtpXS50eXBlID0gcFs0XSYxMjc7CisgICAgICAgICAgICBpZiAoIXBrdC0+c2lkZV9kYXRhW2ldLmRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG1lbWNweShwa3QtPnNpZGVfZGF0YVtpXS5kYXRhLCBwLXNpemUsIHNpemUpOworICAgICAgICAgICAgcGt0LT5zaXplIC09IHNpemUgKyA1OworICAgICAgICAgICAgaWYocFs0XSYxMjgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwLT0gc2l6ZSs1OworICAgICAgICB9CisgICAgICAgIHBrdC0+c2l6ZSAtPSA4OworICAgICAgICBwa3QtPnNpZGVfZGF0YV9lbGVtcyA9IGkrMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit1aW50OF90ICphdl9wYWNrZXRfcGFja19kaWN0aW9uYXJ5KEFWRGljdGlvbmFyeSAqZGljdCwgaW50ICpzaXplKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICB1aW50OF90ICpkYXRhID0gTlVMTDsKKyAgICAqc2l6ZSA9IDA7CisKKyAgICBpZiAoIWRpY3QpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQoZGljdCwgIiIsIHQsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBrZXlsZW4gICA9IHN0cmxlbih0LT5rZXkpOworICAgICAgICBjb25zdCBzaXplX3QgdmFsdWVsZW4gPSBzdHJsZW4odC0+dmFsdWUpOworICAgICAgICBjb25zdCBzaXplX3QgbmV3X3NpemUgPSAqc2l6ZSArIGtleWxlbiArIDEgKyB2YWx1ZWxlbiArIDE7CisgICAgICAgIHVpbnQ4X3QgKmNvbnN0IG5ld19kYXRhID0gYXZfcmVhbGxvYyhkYXRhLCBuZXdfc2l6ZSk7CisKKyAgICAgICAgaWYgKCFuZXdfZGF0YSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgZGF0YSA9IG5ld19kYXRhOworICAgICAgICBpZiAobmV3X3NpemUgPiBJTlRfTUFYKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIG1lbWNweShkYXRhICsgKnNpemUsIHQtPmtleSwga2V5bGVuICsgMSk7CisgICAgICAgIG1lbWNweShkYXRhICsgKnNpemUgKyBrZXlsZW4gKyAxLCB0LT52YWx1ZSwgdmFsdWVsZW4gKyAxKTsKKworICAgICAgICAqc2l6ZSA9IG5ld19zaXplOworICAgIH0KKworICAgIHJldHVybiBkYXRhOworCitmYWlsOgorICAgIGF2X2ZyZWVwKCZkYXRhKTsKKyAgICAqc2l6ZSA9IDA7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBhdl9wYWNrZXRfdW5wYWNrX2RpY3Rpb25hcnkoY29uc3QgdWludDhfdCAqZGF0YSwgaW50IHNpemUsIEFWRGljdGlvbmFyeSAqKmRpY3QpCit7CisgICAgY29uc3QgdWludDhfdCAqZW5kID0gZGF0YSArIHNpemU7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIWRpY3QgfHwgIWRhdGEgfHwgIXNpemUpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKHNpemUgJiYgZW5kWy0xXSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgd2hpbGUgKGRhdGEgPCBlbmQpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqa2V5ID0gZGF0YTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdmFsID0gZGF0YSArIHN0cmxlbihrZXkpICsgMTsKKworICAgICAgICBpZiAodmFsID49IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHJldCA9IGF2X2RpY3Rfc2V0KGRpY3QsIGtleSwgdmFsLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGF0YSA9IHZhbCArIHN0cmxlbih2YWwpICsgMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZfcGFja2V0X3Nocmlua19zaWRlX2RhdGEoQVZQYWNrZXQgKnBrdCwgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBrdC0+c2lkZV9kYXRhX2VsZW1zOyBpKyspIHsKKyAgICAgICAgaWYgKHBrdC0+c2lkZV9kYXRhW2ldLnR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgaWYgKHNpemUgPiBwa3QtPnNpZGVfZGF0YVtpXS5zaXplKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBwa3QtPnNpZGVfZGF0YVtpXS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBVkVSUk9SKEVOT0VOVCk7Cit9CisKK2ludCBhdl9wYWNrZXRfY29weV9wcm9wcyhBVlBhY2tldCAqZHN0LCBjb25zdCBBVlBhY2tldCAqc3JjKQoreworICAgIGludCBpOworCisgICAgZHN0LT5wdHMgICAgICAgICAgICAgICAgICA9IHNyYy0+cHRzOworICAgIGRzdC0+ZHRzICAgICAgICAgICAgICAgICAgPSBzcmMtPmR0czsKKyAgICBkc3QtPnBvcyAgICAgICAgICAgICAgICAgID0gc3JjLT5wb3M7CisgICAgZHN0LT5kdXJhdGlvbiAgICAgICAgICAgICA9IHNyYy0+ZHVyYXRpb247CisgICAgZHN0LT5jb252ZXJnZW5jZV9kdXJhdGlvbiA9IHNyYy0+Y29udmVyZ2VuY2VfZHVyYXRpb247CisgICAgZHN0LT5mbGFncyAgICAgICAgICAgICAgICA9IHNyYy0+ZmxhZ3M7CisgICAgZHN0LT5zdHJlYW1faW5kZXggICAgICAgICA9IHNyYy0+c3RyZWFtX2luZGV4OworCisgICAgZm9yIChpID0gMDsgaSA8IHNyYy0+c2lkZV9kYXRhX2VsZW1zOyBpKyspIHsKKyAgICAgICAgIGVudW0gQVZQYWNrZXRTaWRlRGF0YVR5cGUgdHlwZSA9IHNyYy0+c2lkZV9kYXRhW2ldLnR5cGU7CisgICAgICAgICBpbnQgc2l6ZSAgICAgICAgICA9IHNyYy0+c2lkZV9kYXRhW2ldLnNpemU7CisgICAgICAgICB1aW50OF90ICpzcmNfZGF0YSA9IHNyYy0+c2lkZV9kYXRhW2ldLmRhdGE7CisgICAgICAgICB1aW50OF90ICpkc3RfZGF0YSA9IGF2X3BhY2tldF9uZXdfc2lkZV9kYXRhKGRzdCwgdHlwZSwgc2l6ZSk7CisKKyAgICAgICAgaWYgKCFkc3RfZGF0YSkgeworICAgICAgICAgICAgYXZfcGFja2V0X2ZyZWVfc2lkZV9kYXRhKGRzdCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIG1lbWNweShkc3RfZGF0YSwgc3JjX2RhdGEsIHNpemUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGF2X3BhY2tldF91bnJlZihBVlBhY2tldCAqcGt0KQoreworICAgIGF2X3BhY2tldF9mcmVlX3NpZGVfZGF0YShwa3QpOworICAgIGF2X2J1ZmZlcl91bnJlZigmcGt0LT5idWYpOworICAgIGF2X2luaXRfcGFja2V0KHBrdCk7CisgICAgcGt0LT5kYXRhID0gTlVMTDsKKyAgICBwa3QtPnNpemUgPSAwOworfQorCitpbnQgYXZfcGFja2V0X3JlZihBVlBhY2tldCAqZHN0LCBjb25zdCBBVlBhY2tldCAqc3JjKQoreworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBhdl9wYWNrZXRfY29weV9wcm9wcyhkc3QsIHNyYyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIXNyYy0+YnVmKSB7CisgICAgICAgIHJldCA9IHBhY2tldF9hbGxvYygmZHN0LT5idWYsIHNyYy0+c2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBtZW1jcHkoZHN0LT5idWYtPmRhdGEsIHNyYy0+ZGF0YSwgc3JjLT5zaXplKTsKKyAgICB9IGVsc2UKKyAgICAgICAgZHN0LT5idWYgPSBhdl9idWZmZXJfcmVmKHNyYy0+YnVmKTsKKworICAgIGRzdC0+c2l6ZSA9IHNyYy0+c2l6ZTsKKyAgICBkc3QtPmRhdGEgPSBkc3QtPmJ1Zi0+ZGF0YTsKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfcGFja2V0X2ZyZWVfc2lkZV9kYXRhKGRzdCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBhdl9wYWNrZXRfbW92ZV9yZWYoQVZQYWNrZXQgKmRzdCwgQVZQYWNrZXQgKnNyYykKK3sKKyAgICAqZHN0ID0gKnNyYzsKKyAgICBhdl9pbml0X3BhY2tldChzcmMpOworfQorCit2b2lkIGF2X3BhY2tldF9yZXNjYWxlX3RzKEFWUGFja2V0ICpwa3QsIEFWUmF0aW9uYWwgc3JjX3RiLCBBVlJhdGlvbmFsIGRzdF90YikKK3sKKyAgICBpZiAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHBrdC0+cHRzID0gYXZfcmVzY2FsZV9xKHBrdC0+cHRzLCBzcmNfdGIsIGRzdF90Yik7CisgICAgaWYgKHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBwa3QtPmR0cyA9IGF2X3Jlc2NhbGVfcShwa3QtPmR0cywgc3JjX3RiLCBkc3RfdGIpOworICAgIGlmIChwa3QtPmR1cmF0aW9uID4gMCkKKyAgICAgICAgcGt0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShwa3QtPmR1cmF0aW9uLCBzcmNfdGIsIGRzdF90Yik7CisgICAgaWYgKHBrdC0+Y29udmVyZ2VuY2VfZHVyYXRpb24gPiAwKQorICAgICAgICBwa3QtPmNvbnZlcmdlbmNlX2R1cmF0aW9uID0gYXZfcmVzY2FsZV9xKHBrdC0+Y29udmVyZ2VuY2VfZHVyYXRpb24sIHNyY190YiwgZHN0X3RiKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F2cGljdHVyZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXZwaWN0dXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NGRjMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F2cGljdHVyZS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBBVlBpY3R1cmUgbWFuYWdlbWVudCByb3V0aW5lcworICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBVlBpY3R1cmUgbWFuYWdlbWVudCByb3V0aW5lcworICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29sb3JzcGFjZS5oIgorCitpbnQgYXZwaWN0dXJlX2ZpbGwoQVZQaWN0dXJlICpwaWN0dXJlLCBjb25zdCB1aW50OF90ICpwdHIsCisgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICByZXR1cm4gYXZfaW1hZ2VfZmlsbF9hcnJheXMocGljdHVyZS0+ZGF0YSwgcGljdHVyZS0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgcGl4X2ZtdCwgd2lkdGgsIGhlaWdodCwgMSk7Cit9CisKK2ludCBhdnBpY3R1cmVfbGF5b3V0KGNvbnN0IEFWUGljdHVyZSogc3JjLCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVzdCwgaW50IGRlc3Rfc2l6ZSkKK3sKKyAgICByZXR1cm4gYXZfaW1hZ2VfY29weV90b19idWZmZXIoZGVzdCwgZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqIGNvbnN0KilzcmMtPmRhdGEsIHNyYy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeF9mbXQsIHdpZHRoLCBoZWlnaHQsIDEpOworfQorCitpbnQgYXZwaWN0dXJlX2dldF9zaXplKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgcmV0dXJuIGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShwaXhfZm10LCB3aWR0aCwgaGVpZ2h0LCAxKTsKK30KKworaW50IGF2cGljdHVyZV9hbGxvYyhBVlBpY3R1cmUgKnBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IHJldCA9IGF2X2ltYWdlX2FsbG9jKHBpY3R1cmUtPmRhdGEsIHBpY3R1cmUtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXhfZm10LCAxKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBtZW1zZXQocGljdHVyZSwgMCwgc2l6ZW9mKEFWUGljdHVyZSkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGF2cGljdHVyZV9mcmVlKEFWUGljdHVyZSAqcGljdHVyZSkKK3sKKyAgICBhdl9mcmVlcCgmcGljdHVyZS0+ZGF0YVswXSk7Cit9CisKK3ZvaWQgYXZfcGljdHVyZV9jb3B5KEFWUGljdHVyZSAqZHN0LCBjb25zdCBBVlBpY3R1cmUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgYXZfaW1hZ2VfY29weShkc3QtPmRhdGEsIGRzdC0+bGluZXNpemUsIChjb25zdCB1aW50OF90ICoqKXNyYy0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgIHNyYy0+bGluZXNpemUsIHBpeF9mbXQsIHdpZHRoLCBoZWlnaHQpOworfQorCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9hdnIzMi9tYXRob3BzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9hdnIzMi9tYXRob3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmNDJiNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F2cjMyL21hdGhvcHMuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIFNpbXBsZSBtYXRoIG9wZXJhdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOSBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FWUjMyX01BVEhPUFNfSAorI2RlZmluZSBBVkNPREVDX0FWUjMyX01BVEhPUFNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKKyNkZWZpbmUgTVVMTCBNVUxMCitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IGludCBNVUxMKGludCBhLCBpbnQgYiwgdW5zaWduZWQgc2hpZnQpCit7CisgICAgdW5pb24geyBpbnQ2NF90IHg7IGludCBobFsyXTsgfSB4OworICAgIF9fYXNtX18gKCJtdWxzLmQgJTAsICUxLCAlMiAgICAgICBcblx0IgorICAgICAgICAgICAgICJsc3IgICAgJTAsICUzICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJvciAgICAgJTAsICUwLCAlbTA8PCU0ICBcblx0IgorICAgICAgICAgICAgIDogIj1yIih4KSA6ICJyIihiKSwgInIiKGEpLCAiaSIoc2hpZnQpLCAiaSIoMzItc2hpZnQpKTsKKyAgICByZXR1cm4geC5obFsxXTsKK30KKworI2RlZmluZSBNVUxIIE1VTEgKK3N0YXRpYyBpbmxpbmUgYXZfY29uc3QgaW50IE1VTEgoaW50IGEsIGludCBiKQoreworICAgIHVuaW9uIHsgaW50NjRfdCB4OyBpbnQgaGxbMl07IH0geDsKKyAgICBfX2FzbV9fICgibXVscy5kICUwLCAlMSwgJTIiIDogIj1yIih4LngpIDogInIiKGEpLCAiciIoYikpOworICAgIHJldHVybiB4LmhsWzBdOworfQorCisjZGVmaW5lIE1VTDY0IE1VTDY0CitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IGludDY0X3QgTVVMNjQoaW50IGEsIGludCBiKQoreworICAgIGludDY0X3QgeDsKKyAgICBfX2FzbV9fICgibXVscy5kICUwLCAlMSwgJTIiIDogIj1yIih4KSA6ICJyIihhKSwgInIiKGIpKTsKKyAgICByZXR1cm4geDsKK30KKworc3RhdGljIGlubGluZSBhdl9jb25zdCBpbnQ2NF90IE1BQzY0KGludDY0X3QgZCwgaW50IGEsIGludCBiKQoreworICAgIF9fYXNtX18gKCJtYWNzLmQgJTAsICUxLCAlMiIgOiAiK3IiKGQpIDogInIiKGEpLCAiciIoYikpOworICAgIHJldHVybiBkOworfQorI2RlZmluZSBNQUM2NChkLCBhLCBiKSAoKGQpID0gTUFDNjQoZCwgYSwgYikpCisjZGVmaW5lIE1MUzY0KGQsIGEsIGIpIE1BQzY0KGQsIC0oYSksIGIpCisKK3N0YXRpYyBpbmxpbmUgYXZfY29uc3QgaW50IE1BQzE2KGludCBkLCBpbnQgYSwgaW50IGIpCit7CisgICAgX19hc21fXyAoIm1hY2hoLncgJTAsICUxOmIsICUyOmIiIDogIityIihkKSA6ICJyIihhKSwgInIiKGIpKTsKKyAgICByZXR1cm4gZDsKK30KKyNkZWZpbmUgTUFDMTYoZCwgYSwgYikgKChkKSA9IE1BQzE2KGQsIGEsIGIpKQorI2RlZmluZSBNTFMxNihkLCBhLCBiKSBNQUMxNihkLCAtKGEpLCBiKQorCisjZGVmaW5lIE1VTDE2IE1VTDE2CitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IGludCBNVUwxNihpbnQgYSwgaW50IGIpCit7CisgICAgaW50IGQ7CisgICAgX19hc21fXyAoIm11bGhoLncgJTAsICUxOmIsICUyOmIiIDogIj1yIihkKSA6ICJyIihhKSwgInIiKGIpKTsKKyAgICByZXR1cm4gZDsKK30KKworI2RlZmluZSBtaWRfcHJlZCBtaWRfcHJlZAorc3RhdGljIGlubGluZSBhdl9jb25zdCBpbnQgbWlkX3ByZWQoaW50IGEsIGludCBiLCBpbnQgYykKK3sKKyAgICBpbnQgbTsKKyAgICBfX2FzbV9fICgibW92ICAgJTAsICUyICBcblx0IgorICAgICAgICAgICAgICJjcC53ICAlMSwgJTIgIFxuXHQiCisgICAgICAgICAgICAgIm1vdmd0ICUwLCAlMSAgXG5cdCIKKyAgICAgICAgICAgICAibW92Z3QgJTEsICUyICBcblx0IgorICAgICAgICAgICAgICJjcC53ICAlMSwgJTMgIFxuXHQiCisgICAgICAgICAgICAgIm1vdmxlICUxLCAlMyAgXG5cdCIKKyAgICAgICAgICAgICAiY3AudyAgJTAsICUxICBcblx0IgorICAgICAgICAgICAgICJtb3ZndCAlMCwgJTEgIFxuXHQiCisgICAgICAgICAgICAgOiAiPSZyIihtKSwgIityIihhKQorICAgICAgICAgICAgIDogInIiKGIpLCAiciIoYykpOworICAgIHJldHVybiBtOworfQorCisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCisKKyNlbmRpZiAvKiBBVkNPREVDX0FWUjMyX01BVEhPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXZybmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXZybmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNTBhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9hdnJuZGVjLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBBVlJuIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtanBlZy5oIgorI2luY2x1ZGUgIm1qcGVnZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBNSnBlZ0RlY29kZUNvbnRleHQgbWpwZWdfY3R4OworICAgIGludCBpc19tanBlZzsKKyAgICBpbnQgaW50ZXJsYWNlOyAvL0ZJWE1FIHVzZSBmcmFtZS5pbnRlcmxhY2VkX2ZyYW1lCisgICAgaW50IHRmZjsKK30gQVZSbkNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBVlJuQ29udGV4dCAqYSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIC8vIFN1cHBvcnQgIlJlc29sdXRpb24gMToxIiBmb3IgQXZpZCBBVkkgQ29kZWMKKyAgICBhLT5pc19tanBlZyA9IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDMxIHx8IG1lbWNtcCgmYXZjdHgtPmV4dHJhZGF0YVsyOF0sICIxOjEiLCAzKTsKKworICAgIGlmKCFhLT5pc19tanBlZyAmJiBhdmN0eC0+bG93cmVzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibG93cmVzIGlzIG5vdCBwb3NzaWJsZSB3aXRoIHJhd3ZpZGVvXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZihhLT5pc19tanBlZykKKyAgICAgICAgcmV0dXJuIGZmX21qcGVnX2RlY29kZV9pbml0KGF2Y3R4KTsKKworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIDAsIGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1VZVlk0MjI7CisKKyAgICBpZihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPj0gOSAmJiBhdmN0eC0+ZXh0cmFkYXRhWzRdKzI4IDwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgIGludCBuZHggPSBhdmN0eC0+ZXh0cmFkYXRhWzRdICsgNDsKKyAgICAgICAgYS0+aW50ZXJsYWNlID0gIW1lbWNtcChhdmN0eC0+ZXh0cmFkYXRhICsgbmR4LCAiMToxKCIsIDQpOworICAgICAgICBpZihhLT5pbnRlcmxhY2UpIHsKKyAgICAgICAgICAgIGEtPnRmZiA9IGF2Y3R4LT5leHRyYWRhdGFbbmR4ICsgMjRdID09IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGVuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQVZSbkNvbnRleHQgKmEgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYoYS0+aXNfbWpwZWcpCisgICAgICAgIGZmX21qcGVnX2RlY29kZV9lbmQoYXZjdHgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZSbkNvbnRleHQgKmEgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKnAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIGludCB5LCByZXQsIHRydWVfaGVpZ2h0OworCisgICAgaWYoYS0+aXNfbWpwZWcpCisgICAgICAgIHJldHVybiBmZl9tanBlZ19kZWNvZGVfZnJhbWUoYXZjdHgsIGRhdGEsIGdvdF9mcmFtZSwgYXZwa3QpOworCisgICAgdHJ1ZV9oZWlnaHQgICAgPSBidWZfc2l6ZSAvICgyKmF2Y3R4LT53aWR0aCk7CisKKyAgICBpZihidWZfc2l6ZSA8IDIqYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBhY2tldCB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHAsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcC0+cGljdF90eXBlPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwLT5rZXlfZnJhbWU9IDE7CisKKyAgICBpZihhLT5pbnRlcmxhY2UpIHsKKyAgICAgICAgYnVmICs9ICh0cnVlX2hlaWdodCAtIGF2Y3R4LT5oZWlnaHQpKmF2Y3R4LT53aWR0aDsKKyAgICAgICAgZm9yKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodC0xOyB5Kz0yKSB7CisgICAgICAgICAgICBtZW1jcHkocC0+ZGF0YVswXSArICh5KyBhLT50ZmYpKnAtPmxpbmVzaXplWzBdLCBidWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMiphdmN0eC0+d2lkdGgpOworICAgICAgICAgICAgbWVtY3B5KHAtPmRhdGFbMF0gKyAoeSshYS0+dGZmKSpwLT5saW5lc2l6ZVswXSwgYnVmICsgYXZjdHgtPndpZHRoKnRydWVfaGVpZ2h0KzQsIDIqYXZjdHgtPndpZHRoKTsKKyAgICAgICAgICAgIGJ1ZiArPSAyKmF2Y3R4LT53aWR0aDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZiArPSAodHJ1ZV9oZWlnaHQgLSBhdmN0eC0+aGVpZ2h0KSphdmN0eC0+d2lkdGgqMjsKKyAgICAgICAgZm9yKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBtZW1jcHkocC0+ZGF0YVswXSArIHkqcC0+bGluZXNpemVbMF0sIGJ1ZiwgMiphdmN0eC0+d2lkdGgpOworICAgICAgICAgICAgYnVmICs9IDIqYXZjdHgtPndpZHRoOworICAgICAgICB9CisgICAgfQorCisgICAgKmdvdF9mcmFtZSAgICAgID0gMTsKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK0FWQ29kZWMgZmZfYXZybl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhdnJuIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXZpZCBBVkkgQ29kZWMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQVZSTiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVZSbkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGluaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5tYXhfbG93cmVzICAgICA9IDMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYXZzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9hdnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzZkMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXZzLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBBVlMgdmlkZW8gZGVjb2Rlci4KKyAqIENvcHlyaWdodCAoYykgMjAwNiAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQVZGcmFtZSAqZnJhbWU7Cit9IEF2c0NvbnRleHQ7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQVZTX1ZJREVPICAgICA9IDB4MDEsCisgICAgQVZTX0FVRElPICAgICA9IDB4MDIsCisgICAgQVZTX1BBTEVUVEUgICA9IDB4MDMsCisgICAgQVZTX0dBTUVfREFUQSA9IDB4MDQsCit9IEF2c0Jsb2NrVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBVlNfSV9GUkFNRSAgICAgPSAweDAwLAorICAgIEFWU19QX0ZSQU1FXzNYMyA9IDB4MDEsCisgICAgQVZTX1BfRlJBTUVfMlgyID0gMHgwMiwKKyAgICBBVlNfUF9GUkFNRV8yWDMgPSAweDAzLAorfSBBdnNWaWRlb1N1YlR5cGU7CisKKworc3RhdGljIGludAorYXZzX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqIGF2Y3R4LAorICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBhdnBrdC0+ZGF0YSArIGF2cGt0LT5zaXplOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIEF2c0NvbnRleHQgKmNvbnN0IGF2cyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqcGljdHVyZSA9IGRhdGE7CisgICAgQVZGcmFtZSAqY29uc3QgcCA9ICBhdnMtPmZyYW1lOworICAgIGNvbnN0IHVpbnQ4X3QgKnRhYmxlLCAqdmVjdDsKKyAgICB1aW50OF90ICpvdXQ7CisgICAgaW50IGksIGosIHgsIHksIHN0cmlkZSwgcmV0LCB2ZWN0X3cgPSAzLCB2ZWN0X2ggPSAzOworICAgIEF2c1ZpZGVvU3ViVHlwZSBzdWJfdHlwZTsKKyAgICBBdnNCbG9ja1R5cGUgdHlwZTsKKyAgICBHZXRCaXRDb250ZXh0IGNoYW5nZV9tYXAgPSB7MH07IC8vaW5pdCB0byBzaWxlbmNlIHdhcm5pbmcKKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHAtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgIHAtPmtleV9mcmFtZSA9IDA7CisKKyAgICBvdXQgICAgPSBwLT5kYXRhWzBdOworICAgIHN0cmlkZSA9IHAtPmxpbmVzaXplWzBdOworCisgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPCA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBzdWJfdHlwZSA9IGJ1ZlswXTsKKyAgICB0eXBlID0gYnVmWzFdOworICAgIGJ1ZiArPSA0OworCisgICAgaWYgKHR5cGUgPT0gQVZTX1BBTEVUVEUpIHsKKyAgICAgICAgaW50IGZpcnN0LCBsYXN0OworICAgICAgICB1aW50MzJfdCAqcGFsID0gKHVpbnQzMl90ICopIHAtPmRhdGFbMV07CisKKyAgICAgICAgZmlyc3QgPSBBVl9STDE2KGJ1Zik7CisgICAgICAgIGxhc3QgPSBmaXJzdCArIEFWX1JMMTYoYnVmICsgMik7CisgICAgICAgIGlmIChmaXJzdCA+PSAyNTYgfHwgbGFzdCA+IDI1NiB8fCBidWZfZW5kIC0gYnVmIDwgNCArIDQgKyAzICogKGxhc3QgLSBmaXJzdCkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgYnVmICs9IDQ7CisgICAgICAgIGZvciAoaT1maXJzdDsgaTxsYXN0OyBpKyssIGJ1Zis9MykgeworICAgICAgICAgICAgcGFsW2ldID0gKGJ1ZlswXSA8PCAxOCkgfCAoYnVmWzFdIDw8IDEwKSB8IChidWZbMl0gPDwgMik7CisgICAgICAgICAgICBwYWxbaV0gfD0gMHhGRlUgPDwgMjQgfCAocGFsW2ldID4+IDYpICYgMHgzMDMwMzsKKyAgICAgICAgfQorCisgICAgICAgIHN1Yl90eXBlID0gYnVmWzBdOworICAgICAgICB0eXBlID0gYnVmWzFdOworICAgICAgICBidWYgKz0gNDsKKyAgICB9CisKKyAgICBpZiAodHlwZSAhPSBBVlNfVklERU8pCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3dpdGNoIChzdWJfdHlwZSkgeworICAgIGNhc2UgQVZTX0lfRlJBTUU6CisgICAgICAgIHAtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBwLT5rZXlfZnJhbWUgPSAxOworICAgIGNhc2UgQVZTX1BfRlJBTUVfM1gzOgorICAgICAgICB2ZWN0X3cgPSAzOworICAgICAgICB2ZWN0X2ggPSAzOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZTX1BfRlJBTUVfMlgyOgorICAgICAgICB2ZWN0X3cgPSAyOworICAgICAgICB2ZWN0X2ggPSAyOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZTX1BfRlJBTUVfMlgzOgorICAgICAgICB2ZWN0X3cgPSAyOworICAgICAgICB2ZWN0X2ggPSAzOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoYnVmX2VuZCAtIGJ1ZiA8IDI1NiAqIHZlY3RfdyAqIHZlY3RfaCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgdGFibGUgPSBidWYgKyAoMjU2ICogdmVjdF93ICogdmVjdF9oKTsKKyAgICBpZiAoc3ViX3R5cGUgIT0gQVZTX0lfRlJBTUUpIHsKKyAgICAgICAgaW50IG1hcF9zaXplID0gKCgzMTggLyB2ZWN0X3cgKyA3KSAvIDgpICogKDE5OCAvIHZlY3RfaCk7CisgICAgICAgIGlmIChidWZfZW5kIC0gdGFibGUgPCBtYXBfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpbml0X2dldF9iaXRzKCZjaGFuZ2VfbWFwLCB0YWJsZSwgbWFwX3NpemUgKiA4KTsKKyAgICAgICAgdGFibGUgKz0gbWFwX3NpemU7CisgICAgfQorCisgICAgZm9yICh5PTA7IHk8MTk4OyB5Kz12ZWN0X2gpIHsKKyAgICAgICAgZm9yICh4PTA7IHg8MzE4OyB4Kz12ZWN0X3cpIHsKKyAgICAgICAgICAgIGlmIChzdWJfdHlwZSA9PSBBVlNfSV9GUkFNRSB8fCBnZXRfYml0czEoJmNoYW5nZV9tYXApKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1Zl9lbmQgLSB0YWJsZSA8IDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHZlY3QgPSAmYnVmWyp0YWJsZSsrICogKHZlY3RfdyAqIHZlY3RfaCldOworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPHZlY3RfdzsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIG91dFsoeSArIDApICogc3RyaWRlICsgeCArIGpdID0gdmVjdFsoMCAqIHZlY3RfdykgKyBqXTsKKyAgICAgICAgICAgICAgICAgICAgb3V0Wyh5ICsgMSkgKiBzdHJpZGUgKyB4ICsgal0gPSB2ZWN0WygxICogdmVjdF93KSArIGpdOworICAgICAgICAgICAgICAgICAgICBpZiAodmVjdF9oID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbKHkgKyAyKSAqIHN0cmlkZSArIHggKyBqXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdFsoMiAqIHZlY3RfdykgKyBqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1Yl90eXBlICE9IEFWU19JX0ZSQU1FKQorICAgICAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJmNoYW5nZV9tYXApOworICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKHBpY3R1cmUsIHApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhdnNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCkKK3sKKyAgICBBdnNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICByZXR1cm4gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIDMxOCwgMTk4KTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGF2c19kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBdnNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworQVZDb2RlYyBmZl9hdnNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXZzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVZTIChBdWRpbyBWaWRlbyBTdGFuZGFyZCkgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQVZTLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBdnNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBhdnNfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gYXZzX2RlY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBhdnNfZGVjb2RlX2VuZCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F2dWlkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F2dWlkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmI2NDRjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXZ1aWRlYy5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQVZJRCBNZXJpZGllbiBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyIENhcmwgRXVnZW4gSG95b3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworc3RhdGljIGF2X2NvbGQgaW50IGF2dWlfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDIyUDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdnVpX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgaW50IHJldDsKKyAgICBBVkZyYW1lICpwaWMgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IGF2cGt0LT5kYXRhLCAqZXh0cmFkYXRhID0gYXZjdHgtPmV4dHJhZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNhOworICAgIHVpbnQ4X3QgKnksICp1LCAqdiwgKmE7CisgICAgaW50IHRyYW5zcGFyZW50LCBpbnRlcmxhY2VkID0gMSwgc2tpcCwgb3BhcXVlX2xlbmd0aCwgaSwgaiwgazsKKyAgICB1aW50MzJfdCBleHRyYWRhdGFfc2l6ZSA9IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZTsKKworICAgIHdoaWxlIChleHRyYWRhdGFfc2l6ZSA+PSAyNCkgeworICAgICAgICB1aW50MzJfdCBhdG9tX3NpemUgPSBBVl9SQjMyKGV4dHJhZGF0YSk7CisgICAgICAgIGlmICghbWVtY21wKCZleHRyYWRhdGFbNF0sICJBUFJHQVBSRzAwMDEiLCAxMikpIHsKKyAgICAgICAgICAgIGludGVybGFjZWQgPSBleHRyYWRhdGFbMTldICE9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXRvbV9zaXplICYmIGF0b21fc2l6ZSA8PSBleHRyYWRhdGFfc2l6ZSkgeworICAgICAgICAgICAgZXh0cmFkYXRhICAgICAgKz0gYXRvbV9zaXplOworICAgICAgICAgICAgZXh0cmFkYXRhX3NpemUgLT0gYXRvbV9zaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGF2Y3R4LT5oZWlnaHQgPT0gNDg2KSB7CisgICAgICAgIHNraXAgPSAxMDsKKyAgICB9IGVsc2UgeworICAgICAgICBza2lwID0gMTY7CisgICAgfQorICAgIG9wYXF1ZV9sZW5ndGggPSAyICogYXZjdHgtPndpZHRoICogKGF2Y3R4LT5oZWlnaHQgKyBza2lwKSArIDQgKiBpbnRlcmxhY2VkOworICAgIGlmIChhdnBrdC0+c2l6ZSA8IG9wYXF1ZV9sZW5ndGgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnN1ZmZpY2llbnQgaW5wdXQgZGF0YS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICB0cmFuc3BhcmVudCA9IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMzIgJiYKKyAgICAgICAgICAgICAgICAgIGF2cGt0LT5zaXplID49IG9wYXF1ZV9sZW5ndGggKiAyICsgNDsKKyAgICBzcmNhID0gc3JjICsgb3BhcXVlX2xlbmd0aCArIDU7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpYywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBpYy0+a2V5X2ZyYW1lID0gMTsKKyAgICBwaWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgaWYgKCFpbnRlcmxhY2VkKSB7CisgICAgICAgIHNyYyAgKz0gYXZjdHgtPndpZHRoICogc2tpcDsKKyAgICAgICAgc3JjYSArPSBhdmN0eC0+d2lkdGggKiBza2lwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBpbnRlcmxhY2VkICsgMTsgaSsrKSB7CisgICAgICAgIHNyYyAgKz0gYXZjdHgtPndpZHRoICogc2tpcDsKKyAgICAgICAgc3JjYSArPSBhdmN0eC0+d2lkdGggKiBza2lwOworICAgICAgICBpZiAoaW50ZXJsYWNlZCAmJiBhdmN0eC0+aGVpZ2h0ID09IDQ4NikgeworICAgICAgICAgICAgeSA9IHBpYy0+ZGF0YVswXSArICgxIC0gaSkgKiBwaWMtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgdSA9IHBpYy0+ZGF0YVsxXSArICgxIC0gaSkgKiBwaWMtPmxpbmVzaXplWzFdOworICAgICAgICAgICAgdiA9IHBpYy0+ZGF0YVsyXSArICgxIC0gaSkgKiBwaWMtPmxpbmVzaXplWzJdOworICAgICAgICAgICAgYSA9IHBpYy0+ZGF0YVszXSArICgxIC0gaSkgKiBwaWMtPmxpbmVzaXplWzNdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeSA9IHBpYy0+ZGF0YVswXSArIGkgKiBwaWMtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgdSA9IHBpYy0+ZGF0YVsxXSArIGkgKiBwaWMtPmxpbmVzaXplWzFdOworICAgICAgICAgICAgdiA9IHBpYy0+ZGF0YVsyXSArIGkgKiBwaWMtPmxpbmVzaXplWzJdOworICAgICAgICAgICAgYSA9IHBpYy0+ZGF0YVszXSArIGkgKiBwaWMtPmxpbmVzaXplWzNdOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT5oZWlnaHQgPj4gaW50ZXJsYWNlZDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgYXZjdHgtPndpZHRoID4+IDE7IGsrKykgeworICAgICAgICAgICAgICAgIHVbICAgIGsgICAgXSA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICB5WzIgKiBrICAgIF0gPSAqc3JjKys7CisgICAgICAgICAgICAgICAgYVsyICogayAgICBdID0gMHhGRiAtICh0cmFuc3BhcmVudCA/ICpzcmNhKysgOiAwKTsKKyAgICAgICAgICAgICAgICBzcmNhKys7CisgICAgICAgICAgICAgICAgdlsgICAgayAgICBdID0gKnNyYysrOworICAgICAgICAgICAgICAgIHlbMiAqIGsgKyAxXSA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICBhWzIgKiBrICsgMV0gPSAweEZGIC0gKHRyYW5zcGFyZW50ID8gKnNyY2ErKyA6IDApOworICAgICAgICAgICAgICAgIHNyY2ErKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeSArPSAoaW50ZXJsYWNlZCArIDEpICogcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIHUgKz0gKGludGVybGFjZWQgKyAxKSAqIHBpYy0+bGluZXNpemVbMV07CisgICAgICAgICAgICB2ICs9IChpbnRlcmxhY2VkICsgMSkgKiBwaWMtPmxpbmVzaXplWzJdOworICAgICAgICAgICAgYSArPSAoaW50ZXJsYWNlZCArIDEpICogcGljLT5saW5lc2l6ZVszXTsKKyAgICAgICAgfQorICAgICAgICBzcmMgICs9IDQ7CisgICAgICAgIHNyY2EgKz0gNDsKKyAgICB9CisgICAgKmdvdF9mcmFtZSAgICAgICA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfYXZ1aV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAiYXZ1aSIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlkIE1lcmlkaWVuIFVuY29tcHJlc3NlZCIpLAorICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FWVUksCisgICAgLmluaXQgICAgICAgICA9IGF2dWlfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICA9IGF2dWlfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2F2dWllbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2F2dWllbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjY0MGJiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYXZ1aWVuYy5jCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQVZJRCBNZXJpZGllbiBlbmNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyIENhcmwgRXVnZW4gSG95b3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgYXZ1aV9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKGF2Y3R4LT53aWR0aCAhPSA3MjAgfHwgYXZjdHgtPmhlaWdodCAhPSA0ODYgJiYgYXZjdHgtPmhlaWdodCAhPSA1NzYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IDcyMHg0ODYgYW5kIDcyMHg1NzYgYXJlIHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoIShhdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeigyNCArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSAyNDsKKyAgICBtZW1jcHkoYXZjdHgtPmV4dHJhZGF0YSwgIlwwXDBcMFx4MTgiIkFQUkdBUFJHMDAwMSIsIDE2KTsKKyAgICBpZiAoYXZjdHgtPmZpZWxkX29yZGVyID4gQVZfRklFTERfUFJPR1JFU1NJVkUpIHsKKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YVsxOV0gPSAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFbMTldID0gMTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXZ1aV9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWMsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICB1aW50OF90ICpkc3Q7CisgICAgaW50IGksIGosIHNraXAsIHJldCwgc2l6ZSwgaW50ZXJsYWNlZDsKKworICAgIGludGVybGFjZWQgPSBhdmN0eC0+ZmllbGRfb3JkZXIgPiBBVl9GSUVMRF9QUk9HUkVTU0lWRTsKKworICAgIGlmIChhdmN0eC0+aGVpZ2h0ID09IDQ4NikgeworICAgICAgICBza2lwID0gMTA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2tpcCA9IDE2OworICAgIH0KKyAgICBzaXplID0gMiAqIGF2Y3R4LT53aWR0aCAqIChhdmN0eC0+aGVpZ2h0ICsgc2tpcCkgKyA4ICogaW50ZXJsYWNlZDsKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBkc3QgPSBwa3QtPmRhdGE7CisgICAgaWYgKCFpbnRlcmxhY2VkKSB7CisgICAgICAgIGRzdCArPSBhdmN0eC0+d2lkdGggKiBza2lwOworICAgIH0KKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgZm9yIChpID0gMDsgaSA8PSBpbnRlcmxhY2VkOyBpKyspIHsKKyAgICAgICAgdWludDhfdCAqc3JjOworICAgICAgICBpZiAoaW50ZXJsYWNlZCAmJiBhdmN0eC0+aGVpZ2h0ID09IDQ4NikgeworICAgICAgICAgICAgc3JjID0gcGljLT5kYXRhWzBdICsgKDEgLSBpKSAqIHBpYy0+bGluZXNpemVbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmMgPSBwaWMtPmRhdGFbMF0gKyBpICogcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gYXZjdHgtPndpZHRoICogc2tpcCArIDQgKiBpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPmhlaWdodDsgaiArPSBpbnRlcmxhY2VkICsgMSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBhdmN0eC0+d2lkdGggKiAyKTsKKyAgICAgICAgICAgIHNyYyArPSAoaW50ZXJsYWNlZCArIDEpICogcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIGRzdCArPSBhdmN0eC0+d2lkdGggKiAyOworICAgICAgICB9CisgICAgfQorCisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYXZ1aV9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2X2ZyZWVwKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfYXZ1aV9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAiYXZ1aSIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlkIE1lcmlkaWVuIFVuY29tcHJlc3NlZCIpLAorICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FWVUksCisgICAgLmluaXQgICAgICAgICA9IGF2dWlfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICA9IGF2dWlfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgPSBhdnVpX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzID0gQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCwKKyAgICAucGl4X2ZtdHMgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9VWVZZNDIyLCBBVl9QSVhfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9iZXRoc29mdHZpZGVvLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9iZXRoc29mdHZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjZDIyZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JldGhzb2Z0dmlkZW8uYwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIEJldGhlc2RhIFZJRCB2aWRlbyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTmljaG9sYXMgVHVuZworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgQmV0aGVzZGEgU29mdHdvcmtzIFZJRCBWaWRlbyBEZWNvZGVyCisgKiBAYXV0aG9yIE5pY2hvbGFzIFR1bmcgW250dW5nIChhdC4gbnR1bmcgY29tXSAoMjAwNy0wMykKKyAqIEBzZWUgaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9QmV0aHNvZnRfVklECisgKiBAc2VlIGh0dHA6Ly93d3cuc3ZhdG9wbHVrLmNvbS9hbmR1eC9kb2NzL2RmdmlkLmh0bWwKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJiZXRoc29mdHZpZGVvLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IEJldGhzb2Z0dmlkQ29udGV4dCB7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgR2V0Qnl0ZUNvbnRleHQgZzsKK30gQmV0aHNvZnR2aWRDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgYmV0aHNvZnR2aWRfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEJldGhzb2Z0dmlkQ29udGV4dCAqdmlkID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKworICAgIHZpZC0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghdmlkLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9wYWxldHRlKEJldGhzb2Z0dmlkQ29udGV4dCAqY3R4KQoreworICAgIHVpbnQzMl90ICpwYWxldHRlID0gKHVpbnQzMl90ICopY3R4LT5mcmFtZS0+ZGF0YVsxXTsKKyAgICBpbnQgYTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nKSA8IDI1NiozKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGZvcihhID0gMDsgYSA8IDI1NjsgYSsrKXsKKyAgICAgICAgcGFsZXR0ZVthXSA9IDB4RkZVIDw8IDI0IHwgYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZjdHgtPmcpICogNDsKKyAgICAgICAgcGFsZXR0ZVthXSB8PSBwYWxldHRlW2FdID4+IDYgJiAweDMwMzAzOworICAgIH0KKyAgICBjdHgtPmZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZXRoc29mdHZpZF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQmV0aHNvZnR2aWRDb250ZXh0ICogdmlkID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjaGFyIGJsb2NrX3R5cGU7CisgICAgdWludDhfdCAqIGRzdDsKKyAgICB1aW50OF90ICogZnJhbWVfZW5kOworICAgIGludCByZW1haW5pbmcgPSBhdmN0eC0+d2lkdGg7ICAgICAgICAgIC8vIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgb24gYSBsaW5lCisgICAgaW50IHdyYXBfdG9fbmV4dF9saW5lOworICAgIGludCBjb2RlLCByZXQ7CisgICAgaW50IHlvZmZzZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgdmlkLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB3cmFwX3RvX25leHRfbGluZSA9IHZpZC0+ZnJhbWUtPmxpbmVzaXplWzBdIC0gYXZjdHgtPndpZHRoOworCisgICAgaWYgKGF2cGt0LT5zaWRlX2RhdGFfZWxlbXMgPiAwICYmCisgICAgICAgIGF2cGt0LT5zaWRlX2RhdGFbMF0udHlwZSA9PSBBVl9QS1RfREFUQV9QQUxFVFRFKSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJnZpZC0+ZywgYXZwa3QtPnNpZGVfZGF0YVswXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF2cGt0LT5zaWRlX2RhdGFbMF0uc2l6ZSk7CisgICAgICAgIGlmICgocmV0ID0gc2V0X3BhbGV0dGUodmlkKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZ2aWQtPmcsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisgICAgZHN0ID0gdmlkLT5mcmFtZS0+ZGF0YVswXTsKKyAgICBmcmFtZV9lbmQgPSB2aWQtPmZyYW1lLT5kYXRhWzBdICsgdmlkLT5mcmFtZS0+bGluZXNpemVbMF0gKiBhdmN0eC0+aGVpZ2h0OworCisgICAgc3dpdGNoKGJsb2NrX3R5cGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmdmlkLT5nKSl7CisgICAgICAgIGNhc2UgUEFMRVRURV9CTE9DSzogeworICAgICAgICAgICAgKmdvdF9mcmFtZSA9IDA7CisgICAgICAgICAgICBpZiAoKHJldCA9IHNldF9wYWxldHRlKHZpZCkpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgcmVhZGluZyBwYWxldHRlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzdHJlYW0yX3RlbGwoJnZpZC0+Zyk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBWSURFT19ZT0ZGX1BfRlJBTUU6CisgICAgICAgICAgICB5b2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnZpZC0+Zyk7CisgICAgICAgICAgICBpZih5b2Zmc2V0ID49IGF2Y3R4LT5oZWlnaHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBkc3QgKz0gdmlkLT5mcmFtZS0+bGluZXNpemVbMF0gKiB5b2Zmc2V0OworICAgIH0KKworICAgIC8vIG1haW4gY29kZQorICAgIHdoaWxlKChjb2RlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnZpZC0+ZykpKXsKKyAgICAgICAgaW50IGxlbmd0aCA9IGNvZGUgJiAweDdmOworCisgICAgICAgIC8vIGNvcHkgYW55IGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLCBhbmQgZW5kaW5nIGF0IHRoZSBmcmFtZSB3aWR0aAorICAgICAgICB3aGlsZShsZW5ndGggPiByZW1haW5pbmcpeworICAgICAgICAgICAgaWYoY29kZSA8IDB4ODApCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmdmlkLT5nLCBkc3QsIHJlbWFpbmluZyk7CisgICAgICAgICAgICBlbHNlIGlmKGJsb2NrX3R5cGUgPT0gVklERU9fSV9GUkFNRSkKKyAgICAgICAgICAgICAgICBtZW1zZXQoZHN0LCBieXRlc3RyZWFtMl9wZWVrX2J5dGUoJnZpZC0+ZyksIHJlbWFpbmluZyk7CisgICAgICAgICAgICBsZW5ndGggLT0gcmVtYWluaW5nOyAgICAgIC8vIGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZAorICAgICAgICAgICAgZHN0ICs9IHJlbWFpbmluZyArIHdyYXBfdG9fbmV4dF9saW5lOyAgICAvLyBza2lwIG92ZXIgZXh0cmEgYnl0ZXMgYXQgZW5kIG9mIGZyYW1lCisgICAgICAgICAgICByZW1haW5pbmcgPSBhdmN0eC0+d2lkdGg7CisgICAgICAgICAgICBpZihkc3QgPT0gZnJhbWVfZW5kKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29weSBhbnkgcmVtYWluaW5nIGJ5dGVzIGFmdGVyIC8gaWYgbGluZSBvdmVyZmxvd3MKKyAgICAgICAgaWYoY29kZSA8IDB4ODApCisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZ2aWQtPmcsIGRzdCwgbGVuZ3RoKTsKKyAgICAgICAgZWxzZSBpZihibG9ja190eXBlID09IFZJREVPX0lfRlJBTUUpCisgICAgICAgICAgICBtZW1zZXQoZHN0LCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmdmlkLT5nKSwgbGVuZ3RoKTsKKyAgICAgICAgcmVtYWluaW5nIC09IGxlbmd0aDsKKyAgICAgICAgZHN0ICs9IGxlbmd0aDsKKyAgICB9CisgICAgZW5kOgorCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgdmlkLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYmV0aHNvZnR2aWRfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQmV0aHNvZnR2aWRDb250ZXh0ICogdmlkID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdl9mcmFtZV9mcmVlKCZ2aWQtPmZyYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9iZXRoc29mdHZpZF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJiZXRoc29mdHZpZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJldGhlc2RhIFZJRCB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9CRVRIU09GVFZJRCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQmV0aHNvZnR2aWRDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBiZXRoc29mdHZpZF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBiZXRoc29mdHZpZF9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGJldGhzb2Z0dmlkX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2JldGhzb2Z0dmlkZW8uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2JldGhzb2Z0dmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWI1ZDBhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYmV0aHNvZnR2aWRlby5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBCZXRoZXNkYSBWSUQgdmlkZW8gZGVjb2RlcgorICogQ29weXJpZ2h0IChDKSAyMDA3IE5pY2hvbGFzIFR1bmcKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0JFVEhTT0ZUVklERU9fSAorI2RlZmluZSBBVkNPREVDX0JFVEhTT0ZUVklERU9fSAorCitlbnVtIEJldGhzb2Z0VmlkQmxvY2tUeXBlCit7CisgICAgUEFMRVRURV9CTE9DSyAgICAgICA9IDB4MDIsCisgICAgRklSU1RfQVVESU9fQkxPQ0sgICA9IDB4N2MsCisgICAgQVVESU9fQkxPQ0sgICAgICAgICA9IDB4N2QsCisgICAgVklERU9fSV9GUkFNRSAgICAgICA9IDB4MDMsCisgICAgVklERU9fUF9GUkFNRSAgICAgICA9IDB4MDEsCisgICAgVklERU9fWU9GRl9QX0ZSQU1FICA9IDB4MDQsCisgICAgRU9GX0JMT0NLICAgICAgICAgICA9IDB4MTQsCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19CRVRIU09GVFZJREVPX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2JmaS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiY2E0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JmaS5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQnJ1dGUgRm9yY2UgJiBJZ25vcmFuY2UgKEJGSSkgdmlkZW8gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNpc2lyIEtvcHBha2EKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIEJydXRlIEZvcmNlICYgSWdub3JhbmNlICguYmZpKSB2aWRlbyBkZWNvZGVyCisgKiBAYXV0aG9yIFNpc2lyIEtvcHBha2EgKCBzaXNpci5rb3BwYWthIGF0IGdtYWlsIGRvdCBjb20gKQorICogQHNlZSBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1CRkkKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQkZJQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICB1aW50MzJfdCBwYWxbMjU2XTsKK30gQkZJQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGJmaV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQkZJQ29udGV4dCAqYmZpID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdmN0eC0+cGl4X2ZtdCAgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgYmZpLT5kc3QgICAgICAgID0gYXZfbWFsbG9jeihhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0KTsKKyAgICBpZiAoIWJmaS0+ZHN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJmaV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIEdldEJ5dGVDb250ZXh0IGc7CisgICAgaW50IGJ1Zl9zaXplICAgID0gYXZwa3QtPnNpemU7CisgICAgQkZJQ29udGV4dCAqYmZpID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpkc3QgICAgPSBiZmktPmRzdDsKKyAgICB1aW50OF90ICpzcmMsICpkc3Rfb2Zmc2V0LCBjb2xvdXIxLCBjb2xvdXIyOworICAgIHVpbnQ4X3QgKmZyYW1lX2VuZCA9IGJmaS0+ZHN0ICsgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodDsKKyAgICB1aW50MzJfdCAqcGFsOworICAgIGludCBpLCBqLCByZXQsIGhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZywgYXZwa3QtPmRhdGEsIGJ1Zl9zaXplKTsKKworICAgIC8qIFNldCBmcmFtZSBwYXJhbWV0ZXJzIGFuZCBwYWxldHRlLCBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoIWF2Y3R4LT5mcmFtZV9udW1iZXIpIHsKKyAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICAgICAgLyogU2V0dGluZyB0aGUgcGFsZXR0ZSAqLworICAgICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID4gNzY4KSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiUGFsZXR0ZSBpcyB0b28gbGFyZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHBhbCA9ICh1aW50MzJfdCAqKWZyYW1lLT5kYXRhWzFdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmV4dHJhZGF0YV9zaXplIC8gMzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgc2hpZnQgPSAxNjsKKyAgICAgICAgICAgICpwYWwgPSAweEZGVSA8PCAyNDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyssIHNoaWZ0IC09IDgpCisgICAgICAgICAgICAgICAgKnBhbCArPSAoKGF2Y3R4LT5leHRyYWRhdGFbaSAqIDMgKyBqXSA8PCAyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5leHRyYWRhdGFbaSAqIDMgKyBqXSA+PiA0KSkgPDwgc2hpZnQ7CisgICAgICAgICAgICBwYWwrKzsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYmZpLT5wYWwsIGZyYW1lLT5kYXRhWzFdLCBzaXplb2YoYmZpLT5wYWwpKTsKKyAgICAgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgZnJhbWUtPmtleV9mcmFtZSA9IDA7CisgICAgICAgIGZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMDsKKyAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzFdLCBiZmktPnBhbCwgc2l6ZW9mKGJmaS0+cGFsKSk7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZywgNCk7IC8vIFVucGFja2VkIHNpemUsIG5vdCByZXF1aXJlZC4KKworICAgIHdoaWxlIChkc3QgIT0gZnJhbWVfZW5kKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGxlbnRhYls0XSA9IHsgMCwgMiwgMCwgMSB9OworICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZSAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcpLCBhdl91bmluaXQob2Zmc2V0KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvZGUgICA9IGJ5dGUgPj4gNjsKKyAgICAgICAgdW5zaWduZWQgaW50IGxlbmd0aCA9IGJ5dGUgJiB+MHhDMDsKKworICAgICAgICBpZiAoIWJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIklucHV0IHJlc29sdXRpb24gbGFyZ2VyIHRoYW4gYWN0dWFsIGZyYW1lLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCBsZW5ndGggYW5kIG9mZnNldCAoaWYgcmVxdWlyZWQpICovCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnKTsKKyAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAyICYmIGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjb2RlID09IDEpCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcpOworICAgICAgICB9CisKKyAgICAgICAgLyogRG8gYm91bmRhcnkgY2hlY2sgKi8KKyAgICAgICAgaWYgKGRzdCArIChsZW5ndGggPDwgbGVudGFiW2NvZGVdKSA+IGZyYW1lX2VuZCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgIC8vIG5vcm1hbCBjaGFpbgorICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZykpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZyYW1lIGxhcmdlciB0aGFuIGJ1ZmZlci5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmZywgZHN0LCBsZW5ndGgpOworICAgICAgICAgICAgZHN0ICs9IGxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgIC8vIGJhY2sgY2hhaW4KKyAgICAgICAgICAgIGRzdF9vZmZzZXQgPSBkc3QgLSBvZmZzZXQ7CisgICAgICAgICAgICBsZW5ndGggICAgKj0gNDsgICAgIC8vIENvbnZlcnQgZHdvcmRzIHRvIGJ5dGVzLgorICAgICAgICAgICAgaWYgKGRzdF9vZmZzZXQgPCBiZmktPmRzdCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdoaWxlIChsZW5ndGgtLSkKKyAgICAgICAgICAgICAgICAqZHN0KysgPSAqZHN0X29mZnNldCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgLy8gc2tpcCBjaGFpbgorICAgICAgICAgICAgZHN0ICs9IGxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgIC8vIGZpbGwgY2hhaW4KKyAgICAgICAgICAgIGNvbG91cjEgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZyk7CisgICAgICAgICAgICBjb2xvdXIyID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcpOworICAgICAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gY29sb3VyMTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBjb2xvdXIyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcmMgPSBiZmktPmRzdDsKKyAgICBkc3QgPSBmcmFtZS0+ZGF0YVswXTsKKyAgICB3aGlsZSAoaGVpZ2h0LS0pIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBhdmN0eC0+d2lkdGgpOworICAgICAgICBzcmMgKz0gYXZjdHgtPndpZHRoOworICAgICAgICBkc3QgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIH0KKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGJmaV9kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEJGSUNvbnRleHQgKmJmaSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYXZfZnJlZXAoJmJmaS0+ZHN0KTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9iZmlfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYmZpIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQnJ1dGUgRm9yY2UgJiBJZ25vcmFuY2UiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQkZJLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihCRklDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBiZmlfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gYmZpX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBiZmlfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYmZpbi9SRUFETUUgYi9mZm1wZWcvbGliYXZjb2RlYy9iZmluL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmIzNDYxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYmZpbi9SRUFETUUKQEAgLTAsMCArMSw2IEBACitCRklOIG9wdGltaXphdGlvbnMgaGF2ZSBiZWVuIHJlbW92ZWQgaW4KK2NvbW1pdCA4ODBlMmFhMjM2NDVlZDk4NzFjNjZlZTFjYmQwMGY5M2M3MmQyZDczCitUaGUgbGFzdCByZXZpc3Npb24gd2l0aCB0aGUgb3B0aW1pemF0aW9ucyBpcyBmYTRlMTdjMTQwMzVlYmY0MzEzMGZiMzY5ZTE3MjhjZGQ5OGQwYjcyCisKK0lmIHlvdSB3YW50IHRvIG1haW50YWluIHRoZXNlIChvciBvdGhlcikgQkZJTiBvcHRpbWl6YXRpb25zIGluIGZmbXBlZywgdGhlbiBwbGVhc2UKK2NvbnRhY3QgZmZtcGVnLWRldmVsQGZmbXBlZy5vcmcKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2JnbWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JnbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTY4MTdiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYmdtYy5jCkBAIC0wLDAgKzEsNTYwIEBACisvKgorICogQmxvY2sgR2lsYmVydC1Nb29yZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgVGhpbG8gQm9yZ21hbm4gPHRoaWxvLmJvcmdtYW5uIF9hdF8gbWFpbC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQmxvY2sgR2lsYmVydC1Nb29yZSBkZWNvZGVyIGFzIHVzZWQgYnkgTVBFRy00IEFMUworICogQGF1dGhvciBUaGlsbyBCb3JnbWFubiA8dGhpbG8uYm9yZ21hbm4gX2F0XyBtYWlsLmRlPgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImJnbWMuaCIKKworI2RlZmluZSBGUkVRX0JJVFMgIDE0ICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdHMgdXNlZCBieSBmcmVxdWVuY3kgY291bnRlcnMKKyNkZWZpbmUgVkFMVUVfQklUUyAxOCAgICAgICAgICAgICAgICAgICAgICAvLyBiaXRzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB2YWx1ZXMKKyNkZWZpbmUgVE9QX1ZBTFVFICAoKDEgPDwgVkFMVUVfQklUUykgLSAxKSAvLyBtYXhpbXVtIHZhbHVlCisjZGVmaW5lIEZJUlNUX1FUUiAgKFRPUF9WQUxVRSAvIDQgKyAxKSAgICAgLy8gZmlyc3QgcXVhcnRlciBvZiB2YWx1ZXMgbWF4aW11bSB2YWx1ZQorI2RlZmluZSBIQUxGICAgICAgICgyICogRklSU1RfUVRSKSAgICAgICAgIC8vIGZpcnN0IGhhbGYgb2YgdmFsdWVzIG1heGltdW0gdmFsdWUKKyNkZWZpbmUgVEhJUkRfUVRSICAoMyAqIEZJUlNUX1FUUikgICAgICAgICAvLyB0aGlyZCBxdWFydGVyIG9mIHZhbHVlcyBtYXhpbXVtIHZhbHVlCisKKyNkZWZpbmUgTFVUX0JJVFMgICAoRlJFUV9CSVRTIC0gOCkgICAgICAgICAvLyBudW1iZXIgb2YgYml0cyB1c2VkIHRvIGluZGV4IGxvb2t1cCB0YWJsZXMKKyNkZWZpbmUgTFVUX1NJWkUgICAoMSA8PCBMVVRfQklUUykgICAgICAgICAvLyBzaXplIG9mIHRoZSBsb29rdXAgdGFibGVzCisjZGVmaW5lIExVVF9CVUZGICAgNCAgICAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJ1ZmZlcmVkIGxvb2t1cCB0YWJsZXMKKworCisvKiogQ3VtdWxhdGl2ZSBmcmVxdWVuY3kgdGFibGVzIGZvciBibG9jayBHaWxiZXJ0LU1vb3JlIGNvZGluZy4gKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjZl90YWJsZXNfMVszXVsxMjldID0geworICAgIHsKKyAgICAgICAgMTYzODQsIDE2MDY2LCAxNTc0OCwgMTU0MzEsIDE1MTE0LCAxNDc5OSwgMTQ0ODUsIDE0MTczLCAxMzg2MSwgMTM1NTIsCisgICAgICAgIDEzMjQzLCAxMjkzOSwgMTI2MzUsIDEyMzM2LCAxMjAzOCwgMTE3NDUsIDExNDUyLCAxMTE2MSwgMTA4NzAsIDEwNTg2LAorICAgICAgICAxMDMwMywgMTAwMjcsICA5NzUxLCAgOTQ4MywgIDkyMTUsICA4OTUzLCAgODY5MiwgIDg0NDAsICA4MTg5LCAgNzk0NiwKKyAgICAgICAgIDc3MDQsICA3NDcyLCAgNzI0MCwgIDcwMDgsICA2Nzc2LCAgNjU1NCwgIDYzMzMsICA2MTIyLCAgNTkxMiwgIDU3MTEsCisgICAgICAgICA1NTEyLCAgNTMyMCwgIDUxMjgsICA0OTQ3LCAgNDc2NiwgIDQ1OTUsICA0NDI1LCAgNDI2NCwgIDQxMDQsICAzOTQ2LAorICAgICAgICAgMzc4OCwgIDM2NDAsICAzNDkzLCAgMzM1NSwgIDMyMTgsICAzMDkwLCAgMjk2MywgIDI4NDIsICAyNzIxLCAgMjYwOSwKKyAgICAgICAgIDI0OTgsICAyMzk1LCAgMjI5MiwgIDIxOTYsICAyMTAwLCAgMjAwNCwgIDE5MDgsICAxODIwLCAgMTczMiwgIDE2NTEsCisgICAgICAgICAxNTcwLCAgMTQ5NywgIDE0MjQsICAxMzU1LCAgMTI4NywgIDEyMjMsICAxMTYxLCAgMTEwMCwgIDEwNDQsICAgOTg4LAorICAgICAgICAgIDkzOCwgICA4ODgsICAgODM5LCAgIDc5MCwgICA3NDYsICAgNzAyLCAgIDY2MiwgICA2MjMsICAgNTg4LCAgIDU1MywKKyAgICAgICAgICA1MjAsICAgNDg4LCAgIDQ1OSwgICA0MzEsICAgNDA1LCAgIDM4MCwgICAzNTcsICAgMzM0LCAgIDMxMSwgICAyODgsCisgICAgICAgICAgMjY4LCAgIDI0OCwgICAyMzAsICAgMjEzLCAgIDE5NywgICAxODIsICAgMTY4LCAgIDE1NCwgICAxNDIsICAgMTMwLAorICAgICAgICAgIDExOSwgICAxMDgsICAgIDk5LCAgICA5MCwgICAgODEsICAgIDcyLCAgICA2NCwgICAgNTYsICAgIDQ5LCAgICA0MiwKKyAgICAgICAgICAgMzYsICAgIDMwLCAgICAyNSwgICAgMjAsICAgIDE1LCAgICAxMSwgICAgIDcsICAgICAzLCAgICAgMAorICAgIH0sCisgICAgeworICAgICAgICAxNjM4NCwgMTYwODAsIDE1Nzc2LCAxNTQ3MywgMTUxNzAsIDE0ODY4LCAxNDU2NywgMTQyNjgsIDEzOTcwLCAxMzY3NCwKKyAgICAgICAgMTMzNzgsIDEzMDg2LCAxMjc5NCwgMTI1MDUsIDEyMjE4LCAxMTkzNiwgMTE2NTQsIDExMzczLCAxMTA5MiwgMTA4MTgsCisgICAgICAgIDEwNTQ0LCAxMDI3NiwgMTAwMDgsICA5NzQ5LCAgOTQ5MCwgIDkyMzYsICA4OTgyLCAgODczNywgIDg0OTIsICA4MjU2LAorICAgICAgICAgODAyMCwgIDc3OTIsICA3NTY0LCAgNzMzNiwgIDcxMDgsICA2ODg4LCAgNjY2OSwgIDY0NTksICA2MjQ5LCAgNjA1MCwKKyAgICAgICAgIDU4NTIsICA1NjYwLCAgNTQ2OCwgIDUyODYsICA1MTA0LCAgNDkzMSwgIDQ3NjAsICA0NTk4LCAgNDQzNiwgIDQyNzUsCisgICAgICAgICA0MTE1LCAgMzk2NSwgIDM4MTYsICAzNjc0LCAgMzUzNCwgIDM0MDMsICAzMjcyLCAgMzE0NywgIDMwMjMsICAyOTA3LAorICAgICAgICAgMjc5MiwgIDI2ODQsICAyNTc3LCAgMjQ3NiwgIDIzNzUsICAyMjc0LCAgMjE3MywgIDIwNzksICAxOTg2LCAgMTg5NywKKyAgICAgICAgIDE4MTAsICAxNzI0LCAgMTY0NSwgIDE1NjcsICAxNDkzLCAgMTQxOSwgIDEzNTEsICAxMjg0LCAgMTIyMiwgIDExNjEsCisgICAgICAgICAxMTA1LCAgMTA1MCwgICA5OTUsICAgOTQxLCAgIDg5MSwgICA4NDIsICAgNzk3LCAgIDc1MywgICA3MTMsICAgNjczLAorICAgICAgICAgIDYzNiwgICA1OTksICAgNTY2LCAgIDUzMywgICA1MDMsICAgNDczLCAgIDQ0NiwgICA0MTksICAgMzkyLCAgIDM2NSwKKyAgICAgICAgICAzNDAsICAgMzE2LCAgIDI5NCwgICAyNzIsICAgMjUzLCAgIDIzNCwgICAyMTYsICAgMTk5LCAgIDE4NCwgICAxNjksCisgICAgICAgICAgMTU1LCAgIDE0MiwgICAxMzAsICAgMTE4LCAgIDEwNiwgICAgOTUsICAgIDg1LCAgICA3NSwgICAgNjYsICAgIDU3LAorICAgICAgICAgICA0OSwgICAgNDEsICAgIDM0LCAgICAyNywgICAgMjEsICAgIDE1LCAgICAxMCwgICAgIDUsICAgICAwCisgICAgfSwKKyAgICB7CisgICAgICAgIDE2Mzg0LCAxNjA5MiwgMTU4MDEsIDE1NTEwLCAxNTIxOSwgMTQ5MzAsIDE0NjQxLCAxNDM1NSwgMTQwNjksIDEzNzg1LAorICAgICAgICAxMzUwMSwgMTMyMTksIDEyOTM4LCAxMjY2MSwgMTIzODQsIDEyMTEyLCAxMTg0MSwgMTE1NzEsIDExMzAxLCAxMTAzNywKKyAgICAgICAgMTA3NzMsIDEwNTE0LCAxMDI1NiwgMTAwMDUsICA5NzU0LCAgOTUwOCwgIDkyNjMsICA5MDI1LCAgODc4NywgIDg1NTcsCisgICAgICAgICA4MzI3LCAgODEwMywgIDc4NzksICA3NjU1LCAgNzQzMSwgIDcyMTUsICA3MDAwLCAgNjc5MiwgIDY1ODUsICA2Mzg3LAorICAgICAgICAgNjE5MCwgIDU5OTgsICA1ODA3LCAgNTYyNSwgIDU0NDUsICA1MjcyLCAgNTEwMCwgIDQ5MzcsICA0Nzc0LCAgNDYxMywKKyAgICAgICAgIDQ0NTIsICA0MzAxLCAgNDE1MCwgIDQwMDcsICAzODY1LCAgMzczMSwgIDM1OTcsICAzNDY5LCAgMzM0MSwgIDMyMTgsCisgICAgICAgICAzMDk5LCAgMjk4MSwgIDI4NjksICAyNzU4LCAgMjY1MiwgIDI1NDYsICAyNDQwLCAgMjMzNCwgIDIyMzQsICAyMTM0LAorICAgICAgICAgMjA0MSwgIDE5NDksICAxODY0LCAgMTc3OSwgIDE2OTksICAxNjIwLCAgMTU0NywgIDE0NzQsICAxNDA3LCAgMTM0MCwKKyAgICAgICAgIDEyNzgsICAxMjE3LCAgMTE1NywgIDEwOTcsICAxMDQzLCAgIDk4OSwgICA5NDAsICAgODkxLCAgIDg0NiwgICA4MDEsCisgICAgICAgICAgNzU5LCAgIDcxOCwgICA2ODAsICAgNjQzLCAgIDYwOSwgICA1NzUsICAgNTQzLCAgIDUxMSwgICA0NzksICAgNDQ3LAorICAgICAgICAgIDQxOCwgICAzODksICAgMzYzLCAgIDMzNywgICAzMTQsICAgMjkxLCAgIDI3MCwgICAyNDksICAgMjMwLCAgIDIxMiwKKyAgICAgICAgICAxOTUsICAgMTc5LCAgIDE2NCwgICAxNDksICAgMTM1LCAgIDEyMSwgICAxMDgsICAgIDk2LCAgICA4NSwgICAgNzQsCisgICAgICAgICAgNjQsICAgICA1NCwgICAgNDUsICAgIDM2LCAgICAyOCwgICAgMjAsICAgIDEzLCAgICAgNiwgICAgIDAKKyAgICB9Cit9OworCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjZl90YWJsZXNfMls4XVsxOTNdID0geworICAgIHsKKyAgICAgICAgMTYzODQsIDE2MTA0LCAxNTgyNSwgMTU1NDYsIDE1MjY4LCAxNDk5MSwgMTQ3MTQsIDE0NDM5LCAxNDE2NCwgMTM4OTEsCisgICAgICAgIDEzNjIwLCAxMzM1MCwgMTMwODEsIDEyODE1LCAxMjU0OSwgMTIyODcsIDEyMDI1LCAxMTc2NSwgMTE1MDUsIDExMjUwLAorICAgICAgICAxMDk5NiwgMTA3NDYsIDEwNDk3LCAxMDI1NCwgMTAwMTEsICA5NzcyLCAgOTUzNCwgIDkzMDMsICA5MDcyLCAgODg0OCwKKyAgICAgICAgIDg2MjQsICA4NDA2LCAgODE4OCwgIDc5NzAsICA3NzUyLCAgNzUzOSwgIDczMjcsICA3MTIzLCAgNjkxOSwgIDY3MjQsCisgICAgICAgICA2NTI5LCAgNjMzOSwgIDYxNTAsICA1OTcwLCAgNTc5MCwgIDU2MTgsICA1NDQ2LCAgNTI4MiwgIDUxMTksICA0OTU3LAorICAgICAgICAgNDc5NSwgIDQ2NDIsICA0NDkwLCAgNDM0NSwgIDQyMDEsICA0MDY1LCAgMzkyOSwgIDM3OTgsICAzNjY5LCAgMzU0NywKKyAgICAgICAgIDM0MjUsICAzMzEwLCAgMzE5NiwgIDMwODYsICAyOTc2LCAgMjg2NiwgIDI3NTYsICAyNjUwLCAgMjU0NSwgIDI0NDcsCisgICAgICAgICAyMzUwLCAgMjI2MCwgIDIxNzAsICAyMDg1LCAgMjAwMCwgIDE5MjEsICAxODQzLCAgMTc3MCwgIDE2OTgsICAxNjMyLAorICAgICAgICAgMTU2NiwgIDE1MDEsICAxNDM2LCAgMTM3NiwgIDEzMTYsICAxMjYxLCAgMTIwNywgIDExNTcsICAxMTA4LCAgMTA2MSwKKyAgICAgICAgIDEwMTUsICAgOTczLCAgIDkzMSwgICA4OTMsICAgODU1LCAgIDgxOSwgICA3ODMsICAgNzQ3LCAgIDcxMSwgICA2NzcsCisgICAgICAgICAgNjQ0LCAgIDYxNCwgICA1ODQsICAgNTU3LCAgIDUzMCwgICA1MDUsICAgNDgwLCAgIDQ1OCwgICA0MzYsICAgNDE2LAorICAgICAgICAgIDM5NiwgICAzNzgsICAgMzYwLCAgIDM0MywgICAzMjYsICAgMzEwLCAgIDI5NSwgICAyODEsICAgMjY3LCAgIDI1NSwKKyAgICAgICAgICAyNDMsICAgMjMyLCAgIDIyMSwgICAyMTEsICAgMjAxLCAgIDE5MiwgICAxODMsICAgMTc0LCAgIDE2NiwgICAxNTgsCisgICAgICAgICAgMTUwLCAgIDE0MiwgICAxMzQsICAgMTI2LCAgIDExOSwgICAxMTIsICAgMTA2LCAgIDEwMCwgICAgOTUsICAgIDkwLAorICAgICAgICAgICA4NSwgICAgODAsICAgIDc2LCAgICA3MiwgICAgNjksICAgIDY2LCAgICA2MywgICAgNjAsICAgIDU3LCAgICA1NCwKKyAgICAgICAgICAgNTEsICAgIDQ4LCAgICA0NiwgICAgNDQsICAgIDQyLCAgICA0MCwgICAgMzgsICAgIDM2LCAgICAzNCwgICAgMzMsCisgICAgICAgICAgIDMyLCAgICAzMSwgICAgMzAsICAgIDI5LCAgICAyOCwgICAgMjcsICAgIDI2LCAgICAyNSwgICAgMjQsICAgIDIzLAorICAgICAgICAgICAyMiwgICAgMjEsICAgIDIwLCAgICAxOSwgICAgMTgsICAgIDE3LCAgICAxNiwgICAgMTUsICAgIDE0LCAgICAxMywKKyAgICAgICAgICAgMTIsICAgIDExLCAgICAxMCwgICAgIDksICAgICA4LCAgICAgNywgICAgIDYsICAgICA1LCAgICAgNCwgICAgIDMsCisgICAgICAgICAgICAyLCAgICAgMSwgICAgIDAKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTYzODQsIDE2MTE2LCAxNTg0OSwgMTU1ODIsIDE1MzE2LCAxNTA1MCwgMTQ3ODUsIDE0NTIxLCAxNDI1NywgMTM5OTUsCisgICAgICAgIDEzNzM0LCAxMzQ3NiwgMTMyMTgsIDEyOTYzLCAxMjcwOCwgMTI0NTcsIDEyMjA2LCAxMTk1NiwgMTE3MDYsIDExNDYwLAorICAgICAgICAxMTIxNSwgMTA5NzUsIDEwNzM1LCAxMDUwMCwgMTAyNjUsIDEwMDM0LCAgOTgwMywgIDk1NzksICA5MzU1LCAgOTEzNiwKKyAgICAgICAgIDg5MTcsICA4NzAzLCAgODQ4OSwgIDgyNzUsICA4MDYxLCAgNzg1MywgIDc2NDUsICA3NDQ0LCAgNzI0NCwgIDcwNTEsCisgICAgICAgICA2ODU4LCAgNjY3MSwgIDY0ODQsICA2MzA1LCAgNjEyNywgIDU5NTYsICA1Nzg1LCAgNTYyMiwgIDU0NTksICA1Mjk4LAorICAgICAgICAgNTEzNywgIDQ5ODMsICA0ODMwLCAgNDY4NCwgIDQ1MzksICA0NDAxLCAgNDI2MywgIDQxMzEsICAzOTk5LCAgMzg3NCwKKyAgICAgICAgIDM3NTAsICAzNjMyLCAgMzUxNSwgIDM0MDEsICAzMjg3LCAgMzE3MywgIDMwNTksICAyOTQ5LCAgMjg0MCwgIDI3MzcsCisgICAgICAgICAyNjM1LCAgMjUzOSwgIDI0NDQsICAyMzU0LCAgMjI2NCwgIDIxODEsICAyMDk4LCAgMjAyMCwgIDE5NDMsICAxODcyLAorICAgICAgICAgMTgwMSwgIDE3MzEsICAxNjYxLCAgMTU5NiwgIDE1MzIsICAxNDcyLCAgMTQxMiwgIDEzNTcsICAxMzAzLCAgMTI1MSwKKyAgICAgICAgIDEyMDAsICAxMTUzLCAgMTEwNiwgIDEwNjMsICAxMDIwLCAgIDk3OSwgICA5MzgsICAgODk3LCAgIDg1NiwgICA4MTgsCisgICAgICAgICAgNzgwLCAgIDc0NiwgICA3MTIsICAgNjgxLCAgIDY1MCwgICA2MjEsICAgNTkyLCAgIDU2NiwgICA1NDAsICAgNTE3LAorICAgICAgICAgIDQ5NCwgICA0NzMsICAgNDUyLCAgIDQzMSwgICA0MTAsICAgMzkxLCAgIDM3MywgICAzNTYsICAgMzQwLCAgIDMyNSwKKyAgICAgICAgICAzMTAsICAgMjk2LCAgIDI4MiwgICAyNzAsICAgMjU4LCAgIDI0NywgICAyMzYsICAgMjI1LCAgIDIxNCwgICAyMDMsCisgICAgICAgICAgMTkyLCAgIDE4MiwgICAxNzIsICAgMTYyLCAgIDE1MywgICAxNDQsICAgMTM2LCAgIDEyOCwgICAxMjEsICAgMTE0LAorICAgICAgICAgIDEwOCwgICAxMDIsICAgIDk3LCAgICA5MiwgICAgODcsICAgIDgyLCAgICA3NywgICAgNzMsICAgIDY5LCAgICA2NSwKKyAgICAgICAgICAgNjIsICAgIDU5LCAgICA1NiwgICAgNTMsICAgIDUwLCAgICA0NywgICAgNDUsICAgIDQzLCAgICA0MSwgICAgMzksCisgICAgICAgICAgIDM3LCAgICAzNSwgICAgMzMsICAgIDMxLCAgICAyOSwgICAgMjcsICAgIDI2LCAgICAyNSwgICAgMjQsICAgIDIzLAorICAgICAgICAgICAyMiwgICAgMjEsICAgIDIwLCAgICAxOSwgICAgMTgsICAgIDE3LCAgICAxNiwgICAgMTUsICAgIDE0LCAgICAxMywKKyAgICAgICAgICAgMTIsICAgIDExLCAgICAxMCwgICAgIDksICAgICA4LCAgICAgNywgICAgIDYsICAgICA1LCAgICAgNCwgICAgIDMsCisgICAgICAgICAgICAyLCAgICAgMSwgICAgIDAKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTYzODQsIDE2MTI4LCAxNTg3MiwgMTU2MTcsIDE1MzYyLCAxNTEwNywgMTQ4NTMsIDE0NjAwLCAxNDM0NywgMTQwOTYsCisgICAgICAgIDEzODQ2LCAxMzU5NywgMTMzNTAsIDEzMTA1LCAxMjg2MCwgMTI2MTgsIDEyMzc2LCAxMjEzNSwgMTE4OTQsIDExNjU3LAorICAgICAgICAxMTQyMSwgMTExODksIDEwOTU3LCAxMDczMCwgMTA1MDMsIDEwMjc5LCAxMDA1NiwgIDk4MzgsICA5NjIwLCAgOTQwNywKKyAgICAgICAgIDkxOTUsICA4OTg3LCAgODc3OSwgIDg1NzEsICA4MzYzLCAgODE1OSwgIDc5NTUsICA3NzU4LCAgNzU2MSwgIDczNzEsCisgICAgICAgICA3MTgyLCAgNjk5NywgIDY4MTIsICA2NjM1LCAgNjQ1OSwgIDYyODksICA2MTIwLCAgNTk1NywgIDU3OTUsICA1NjM0LAorICAgICAgICAgNTQ3MywgIDUzMTksICA1MTY1LCAgNTAxOCwgIDQ4NzEsICA0NzMyLCAgNDU5MywgIDQ0NTgsICA0MzI0LCAgNDE5NywKKyAgICAgICAgIDQwNzEsICAzOTUxLCAgMzgzMSwgIDM3MTQsICAzNTk3LCAgMzQ4MCwgIDMzNjMsICAzMjUwLCAgMzEzOCwgIDMwMzIsCisgICAgICAgICAyOTI3LCAgMjgyOCwgIDI3MjksICAyNjM1LCAgMjU0MSwgIDI0NTMsICAyMzY2LCAgMjI4NCwgIDIyMDIsICAyMTI2LAorICAgICAgICAgMjA1MCwgIDE5NzUsICAxOTAwLCAgMTgzMCwgIDE3NjEsICAxNjk3LCAgMTYzMywgIDE1NzQsICAxNTE1LCAgMTQ1OSwKKyAgICAgICAgIDE0MDMsICAxMzUxLCAgMTMwMCwgIDEyNTIsICAxMjA1LCAgMTE2MCwgIDExMTUsICAxMDcwLCAgMTAyNSwgICA5ODIsCisgICAgICAgICAgOTM5LCAgIDg5OSwgICA4NjAsICAgODI0LCAgIDc4OSwgICA3NTYsICAgNzIzLCAgIDY5MywgICA2NjMsICAgNjM2LAorICAgICAgICAgIDYwOSwgICA1ODQsICAgNTU5LCAgIDUzNSwgICA1MTEsICAgNDg5LCAgIDQ2NywgICA0NDcsICAgNDI3LCAgIDQwOSwKKyAgICAgICAgICAzOTEsICAgMzc0LCAgIDM1OCwgICAzNDMsICAgMzI4LCAgIDMxMywgICAzMDAsICAgMjg3LCAgIDI3NCwgICAyNjEsCisgICAgICAgICAgMjQ4LCAgIDIzNSwgICAyMjMsICAgMjExLCAgIDIwMCwgICAxODksICAgMTc5LCAgIDE2OSwgICAxNjAsICAgMTUxLAorICAgICAgICAgIDE0MywgICAxMzUsICAgMTI4LCAgIDEyMSwgICAxMTUsICAgMTA5LCAgIDEwMywgICAgOTcsICAgIDkyLCAgICA4NywKKyAgICAgICAgICAgODIsICAgIDc3LCAgICA3MywgICAgNjksICAgIDY1LCAgICA2MSwgICAgNTgsICAgIDU1LCAgICA1MiwgICAgNDksCisgICAgICAgICAgIDQ2LCAgICA0MywgICAgNDAsICAgIDM3LCAgICAzNSwgICAgMzMsICAgIDMxLCAgICAyOSwgICAgMjcsICAgIDI1LAorICAgICAgICAgICAyMywgICAgMjEsICAgIDIwLCAgICAxOSwgICAgMTgsICAgIDE3LCAgICAxNiwgICAgMTUsICAgIDE0LCAgICAxMywKKyAgICAgICAgICAgMTIsICAgIDExLCAgICAxMCwgICAgIDksICAgICA4LCAgICAgNywgICAgIDYsICAgICA1LCAgICAgNCwgICAgIDMsCisgICAgICAgICAgICAyLCAgICAgMSwgICAgIDAKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTYzODQsIDE2MTM5LCAxNTg5NCwgMTU2NDksIDE1NDA1LCAxNTE2MiwgMTQ5MTksIDE0Njc3LCAxNDQzNSwgMTQxOTUsCisgICAgICAgIDEzOTU1LCAxMzcxNywgMTM0NzksIDEzMjQzLCAxMzAwOCwgMTI3NzUsIDEyNTQyLCAxMjMxMCwgMTIwNzksIDExODUxLAorICAgICAgICAxMTYyMywgMTEzOTksIDExMTc2LCAxMDk1NiwgMTA3MzcsIDEwNTIxLCAxMDMwNSwgMTAwOTQsICA5ODgzLCAgOTY3NywKKyAgICAgICAgIDk0NzEsICA5MjY4LCAgOTA2NSwgIDg4NjIsICA4NjU5LCAgODQ1OSwgIDgyNjAsICA4MDY3LCAgNzg3NCwgIDc2ODgsCisgICAgICAgICA3NTAyLCAgNzMyMSwgIDcxNDAsICA2OTY1LCAgNjc5MCwgIDY2MjEsICA2NDUyLCAgNjI5MCwgIDYxMjgsICA1OTY4LAorICAgICAgICAgNTgwOCwgIDU2NTUsICA1NTAzLCAgNTM1NiwgIDUyMDksICA1MDY5LCAgNDkyOSwgIDQ3OTQsICA0NjYwLCAgNDUzMiwKKyAgICAgICAgIDQ0MDQsICA0MjgyLCAgNDE2MCwgIDQwNDEsICAzOTIyLCAgMzgwMywgIDM2ODQsICAzNTY4LCAgMzQ1MiwgIDMzNDMsCisgICAgICAgICAzMjM0LCAgMzEzMSwgIDMwMjksICAyOTMxLCAgMjgzMywgIDI3NDEsICAyNjQ5LCAgMjU2MywgIDI0NzcsICAyMzk2LAorICAgICAgICAgMjMxNiwgIDIyMzYsICAyMTU3LCAgMjA4MywgIDIwMDksICAxOTQwLCAgMTg3MSwgIDE4MDcsICAxNzQzLCAgMTY4MywKKyAgICAgICAgIDE2MjMsICAxNTY3LCAgMTUxMSwgIDE0NTksICAxNDA3LCAgMTM1NywgIDEzMDcsICAxMjU3LCAgMTIwNywgIDExNTksCisgICAgICAgICAxMTExLCAgMTA2NywgIDEwMjMsICAgOTgzLCAgIDk0MywgICA5MDUsICAgODY4LCAgIDgzNCwgICA4MDAsICAgNzY5LAorICAgICAgICAgIDczOCwgICA3MDksICAgNjgxLCAgIDY1MywgICA2MjUsICAgNjAwLCAgIDU3NSwgICA1NTIsICAgNTI5LCAgIDUwOCwKKyAgICAgICAgICA0ODcsICAgNDY2LCAgIDQ0NywgICA0MjgsICAgNDEwLCAgIDM5MiwgICAzNzYsICAgMzYwLCAgIDM0NCwgICAzMjgsCisgICAgICAgICAgMzEzLCAgIDI5OCwgICAyODMsICAgMjY4LCAgIDI1NSwgICAyNDIsICAgMjMwLCAgIDIxOCwgICAyMDcsICAgMTk2LAorICAgICAgICAgIDE4NiwgICAxNzYsICAgMTY3LCAgIDE1OCwgICAxNTAsICAgMTQyLCAgIDEzNSwgICAxMjgsICAgMTIxLCAgIDExNCwKKyAgICAgICAgICAxMDgsICAgMTAyLCAgICA5NywgICAgOTIsICAgIDg3LCAgICA4MiwgICAgNzgsICAgIDc0LCAgICA3MCwgICAgNjYsCisgICAgICAgICAgIDYyLCAgICA1OCwgICAgNTQsICAgIDUwLCAgICA0NywgICAgNDQsICAgIDQxLCAgICAzOCwgICAgMzUsICAgIDMyLAorICAgICAgICAgICAzMCwgICAgMjgsICAgIDI2LCAgICAyNCwgICAgMjIsICAgIDIwLCAgICAxOCwgICAgMTYsICAgIDE0LCAgICAxMywKKyAgICAgICAgICAgMTIsICAgIDExLCAgICAxMCwgICAgIDksICAgICA4LCAgICAgNywgICAgIDYsICAgICA1LCAgICAgNCwgICAgIDMsCisgICAgICAgICAgICAyLCAgICAgMSwgICAgIDAKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTYzODQsIDE2MTQ5LCAxNTkxNSwgMTU2ODEsIDE1NDQ3LCAxNTIxNCwgMTQ5ODEsIDE0NzQ5LCAxNDUxNywgMTQyODYsCisgICAgICAgIDE0MDU1LCAxMzgyNywgMTM1OTksIDEzMzczLCAxMzE0NywgMTI5MjMsIDEyNjk5LCAxMjQ3NiwgMTIyNTMsIDEyMDM0LAorICAgICAgICAxMTgxNSwgMTE1OTksIDExMzgzLCAxMTE3MSwgMTA5NTksIDEwNzUwLCAxMDU0MSwgMTAzMzcsIDEwMTMzLCAgOTkzMywKKyAgICAgICAgIDk3MzMsICA5NTM2LCAgOTMzOSwgIDkxNDIsICA4OTQ1LCAgODc1MSwgIDg1NTcsICA4MzY5LCAgODE4MSwgIDc5OTgsCisgICAgICAgICA3ODE2LCAgNzYzOCwgIDc0NjAsICA3Mjg4LCAgNzExNiwgIDY5NTAsICA2Nzg1LCAgNjYyNSwgIDY0NjUsICA2MzA2LAorICAgICAgICAgNjE0NywgIDU5OTUsICA1ODQzLCAgNTY5NywgIDU1NTEsICA1NDExLCAgNTI3MSwgIDUxMzUsICA1MDAwLCAgNDg3MSwKKyAgICAgICAgIDQ3NDIsICA0NjE4LCAgNDQ5NSwgIDQzNzQsICA0MjUzLCAgNDEzMiwgIDQwMTEsICAzODkzLCAgMzc3NSwgIDM2NjMsCisgICAgICAgICAzNTUyLCAgMzQ0NiwgIDMzNDAsICAzMjM5LCAgMzEzOCwgIDMwNDMsICAyOTQ4LCAgMjg1OCwgIDI3NjgsICAyNjg0LAorICAgICAgICAgMjYwMCwgIDI1MTYsICAyNDMzLCAgMjM1NSwgIDIyNzgsICAyMjA1LCAgMjEzMywgIDIwNjUsICAxOTk3LCAgMTkzMiwKKyAgICAgICAgIDE4NjcsICAxODA3LCAgMTc0NywgIDE2OTAsICAxNjM0LCAgMTU4MCwgIDE1MjYsICAxNDcyLCAgMTQxOCwgIDEzNjYsCisgICAgICAgICAxMzE0LCAgMTI2NiwgIDEyMTgsICAxMTc0LCAgMTEzMCwgIDEwODgsICAxMDQ3LCAgMTAwOSwgICA5NzEsICAgOTM2LAorICAgICAgICAgIDkwMSwgICA4NjgsICAgODM2LCAgIDgwNCwgICA3NzIsICAgNzQzLCAgIDcxNCwgICA2ODUsICAgNjU4LCAgIDYzMSwKKyAgICAgICAgICA2MDYsICAgNTgyLCAgIDU1OSwgICA1MzYsICAgNTE1LCAgIDQ5NCwgICA0NzUsICAgNDU2LCAgIDQzNywgICA0MTgsCisgICAgICAgICAgMzk5LCAgIDM4MCwgICAzNjIsICAgMzQ0LCAgIDMyOCwgICAzMTIsICAgMjk3LCAgIDI4MywgICAyNzAsICAgMjU3LAorICAgICAgICAgIDI0NSwgICAyMzMsICAgMjIyLCAgIDIxMSwgICAyMDEsICAgMTkxLCAgIDE4MSwgICAxNzIsICAgMTYzLCAgIDE1NSwKKyAgICAgICAgICAxNDcsICAgMTM5LCAgIDEzMiwgICAxMjUsICAgMTE5LCAgIDExMywgICAxMDcsICAgMTAxLCAgICA5NiwgICAgOTEsCisgICAgICAgICAgIDg2LCAgICA4MSwgICAgNzYsICAgIDcxLCAgICA2NiwgICAgNjIsICAgIDU4LCAgICA1NCwgICAgNTAsICAgIDQ2LAorICAgICAgICAgICA0MywgICAgNDAsICAgIDM3LCAgICAzNCwgICAgMzEsICAgIDI4LCAgICAyNiwgICAgMjQsICAgIDIyLCAgICAyMCwKKyAgICAgICAgICAgMTgsICAgIDE2LCAgICAxNCwgICAgMTIsICAgIDEwLCAgICAgOCwgICAgIDYsICAgICA1LCAgICAgNCwgICAgIDMsCisgICAgICAgICAgICAyLCAgICAgMSwgICAgIDAKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTYzODQsIDE2MTU5LCAxNTkzNCwgMTU3MDksIDE1NDg1LCAxNTI2MSwgMTUwMzgsIDE0ODE2LCAxNDU5NCwgMTQzNzMsCisgICAgICAgIDE0MTUyLCAxMzkzMywgMTM3MTQsIDEzNDk3LCAxMzI4MCwgMTMwNjUsIDEyODUwLCAxMjYzNiwgMTI0MjIsIDEyMjExLAorICAgICAgICAxMjAwMCwgMTE3OTEsIDExNTgzLCAxMTM3OCwgMTExNzMsIDEwOTcxLCAxMDc2OSwgMTA1NzEsIDEwMzczLCAxMDE3OSwKKyAgICAgICAgIDk5ODUsICA5NzkzLCAgOTYwMSwgIDk0MDksICA5MjE3LCAgOTAyOSwgIDg4NDIsICA4NjU4LCAgODQ3NSwgIDgyOTcsCisgICAgICAgICA4MTIwLCAgNzk0NiwgIDc3NzMsICA3NjA0LCAgNzQzNSwgIDcyNzEsICA3MTA4LCAgNjk1MCwgIDY3OTIsICA2NjM0LAorICAgICAgICAgNjQ3NywgIDYzMjYsICA2MTc1LCAgNjAyOSwgIDU4ODMsICA1NzQyLCAgNTYwMiwgIDU0NjYsICA1MzMwLCAgNTE5OSwKKyAgICAgICAgIDUwNjgsICA0OTQzLCAgNDgxOCwgIDQ2OTYsICA0NTc0LCAgNDQ1MiwgIDQzMzAsICA0MjExLCAgNDA5MywgIDM5NzksCisgICAgICAgICAzODY2LCAgMzc1OSwgIDM2NTIsICAzNTQ5LCAgMzQ0NiwgIDMzNDgsICAzMjUwLCAgMzE1NywgIDMwNjUsICAyOTc3LAorICAgICAgICAgMjg4OSwgIDI4MDIsICAyNzE2LCAgMjYzNCwgIDI1NTMsICAyNDc2LCAgMjM5OSwgIDIzMjYsICAyMjU0LCAgMjE4NSwKKyAgICAgICAgIDIxMTcsICAyMDUyLCAgMTk4NywgIDE5MjYsICAxODY2LCAgMTgwOCwgIDE3NTAsICAxNjkyLCAgMTYzNCwgIDE1NzgsCisgICAgICAgICAxNTIyLCAgMTQ3MCwgIDE0MTgsICAxMzY5LCAgMTMyMSwgIDEyNzUsICAxMjI5LCAgMTE4NywgIDExNDUsICAxMTA1LAorICAgICAgICAgMTA2NiwgIDEwMjcsICAgOTkxLCAgIDk1NSwgICA5MTksICAgODgzLCAgIDg1MCwgICA4MTcsICAgNzg2LCAgIDc1NiwKKyAgICAgICAgICA3MjgsICAgNzAwLCAgIDY3NCwgICA2NDgsICAgNjI0LCAgIDYwMCwgICA1NzgsICAgNTU2LCAgIDUzNCwgICA1MTIsCisgICAgICAgICAgNDkwLCAgIDQ2OCwgICA0NDcsICAgNDI2LCAgIDQwNywgICAzODgsICAgMzcxLCAgIDM1NCwgICAzMzgsICAgMzIyLAorICAgICAgICAgIDMwNywgICAyOTMsICAgMjgwLCAgIDI2NywgICAyNTUsICAgMjQzLCAgIDIzMSwgICAyMTksICAgMjA5LCAgIDE5OSwKKyAgICAgICAgICAxODksICAgMTc5LCAgIDE3MCwgICAxNjEsICAgMTUzLCAgIDE0NSwgICAxMzgsICAgMTMxLCAgIDEyNCwgICAxMTcsCisgICAgICAgICAgMTExLCAgIDEwNSwgICAgOTksICAgIDkzLCAgICA4NywgICAgODEsICAgIDc2LCAgICA3MSwgICAgNjYsICAgIDYxLAorICAgICAgICAgICA1NywgICAgNTMsICAgIDQ5LCAgICA0NSwgICAgNDIsICAgIDM5LCAgICAzNiwgICAgMzMsICAgIDMwLCAgICAyNywKKyAgICAgICAgICAgMjQsICAgIDIxLCAgICAxOSwgICAgMTcsICAgIDE1LCAgICAxMywgICAgMTEsICAgICA5LCAgICAgNywgICAgIDUsCisgICAgICAgICAgICAzLCAgICAgMSwgICAgIDAKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTYzODQsIDE2MTY5LCAxNTk1NCwgMTU3MzksIDE1NTI0LCAxNTMxMCwgMTUwOTYsIDE0ODgzLCAxNDY3MCwgMTQ0NTgsCisgICAgICAgIDE0MjQ2LCAxNDAzNSwgMTM4MjQsIDEzNjE0LCAxMzQwNSwgMTMxOTgsIDEyOTkxLCAxMjc4NSwgMTI1NzksIDEyMzc2LAorICAgICAgICAxMjE3MywgMTE5NzIsIDExNzcyLCAxMTU3NCwgMTEzNzcsIDExMTgyLCAxMDk4NywgMTA3OTUsIDEwNjAzLCAxMDQxNCwKKyAgICAgICAgMTAyMjYsIDEwMDQwLCAgOTg1NCwgIDk2NjgsICA5NDgyLCAgOTI5OSwgIDkxMTYsICA4OTM3LCAgODc1OSwgIDg1ODUsCisgICAgICAgICA4NDExLCAgODI0MSwgIDgwNzEsICA3OTA2LCAgNzc0MSwgIDc1ODAsICA3NDE5LCAgNzI2MywgIDcxMDcsICA2OTUyLAorICAgICAgICAgNjc5NywgIDY2NDcsICA2NDk3LCAgNjM1MywgIDYyMDksICA2MDcwLCAgNTkzMSwgIDU3OTYsICA1NjYxLCAgNTUzMSwKKyAgICAgICAgIDU0MDEsICA1Mjc1LCAgNTE1MCwgIDUwMjcsICA0OTA0LCAgNDc4MSwgIDQ2NTgsICA0NTM4LCAgNDQxOSwgIDQzMDQsCisgICAgICAgICA0MTkwLCAgNDA4MSwgIDM5NzIsICAzODY3LCAgMzc2MiwgIDM2NjIsICAzNTYyLCAgMzQ2NywgIDMzNzIsICAzMjgxLAorICAgICAgICAgMzE5MSwgIDMxMDEsICAzMDEyLCAgMjkyOCwgIDI4NDQsICAyNzY0LCAgMjY4NCwgIDI2MDgsICAyNTMzLCAgMjQ2MCwKKyAgICAgICAgIDIzODcsICAyMzE4LCAgMjI1MCwgIDIxODUsICAyMTIxLCAgMjA1OSwgIDE5OTcsICAxOTM1LCAgMTg3MywgIDE4MTMsCisgICAgICAgICAxNzU0LCAgMTY5OCwgIDE2NDIsICAxNTg4LCAgMTUzNSwgIDE0ODMsICAxNDMzLCAgMTM4NCwgIDEzMzgsICAxMjkyLAorICAgICAgICAgMTI0OSwgIDEyMDYsICAxMTY1LCAgMTEyNSwgIDEwODUsICAxMDQ1LCAgMTAwOCwgICA5NzEsICAgOTM3LCAgIDkwMywKKyAgICAgICAgICA4NzEsICAgODQwLCAgIDgxMCwgICA3ODAsICAgNzUyLCAgIDcyNCwgICA2OTgsICAgNjcyLCAgIDY0NywgICA2MjIsCisgICAgICAgICAgNTk3LCAgIDU3MiwgICA1NDgsICAgNTI0LCAgIDUwMiwgICA0ODAsICAgNDYwLCAgIDQ0MCwgICA0MjEsICAgNDAzLAorICAgICAgICAgIDM4NiwgICAzNjksICAgMzUzLCAgIDMzNywgICAzMjMsICAgMzA5LCAgIDI5NSwgICAyODEsICAgMjY4LCAgIDI1NSwKKyAgICAgICAgICAyNDMsICAgMjMxLCAgIDIyMCwgICAyMDksICAgMTk5LCAgIDE4OSwgICAxODAsICAgMTcxLCAgIDE2MywgICAxNTUsCisgICAgICAgICAgMTQ3LCAgIDEzOSwgICAxMzEsICAgMTIzLCAgIDExNiwgICAxMDksICAgMTAyLCAgICA5NSwgICAgODksICAgIDgzLAorICAgICAgICAgICA3NywgICAgNzIsICAgIDY3LCAgICA2MiwgICAgNTcsICAgIDUyLCAgICA0OCwgICAgNDQsICAgIDQwLCAgICAzNiwKKyAgICAgICAgICAgMzIsICAgIDI4LCAgICAyNSwgICAgMjIsICAgIDE5LCAgICAxNiwgICAgMTMsICAgIDEwLCAgICAgOCwgICAgIDYsCisgICAgICAgICAgICA0LCAgICAgMiwgICAgIDAKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTYzODQsIDE2MTc3LCAxNTk3MCwgMTU3NjQsIDE1NTU4LCAxNTM1MywgMTUxNDgsIDE0OTQ0LCAxNDc0MCwgMTQ1MzcsCisgICAgICAgIDE0MzM0LCAxNDEzMiwgMTM5MzAsIDEzNzI5LCAxMzUyOSwgMTMzMzAsIDEzMTMxLCAxMjkzMywgMTI3MzUsIDEyNTM5LAorICAgICAgICAxMjM0MywgMTIxNTAsIDExOTU3LCAxMTc2NiwgMTE1NzYsIDExMzg4LCAxMTIwMCwgMTEwMTUsIDEwODMwLCAxMDY0NywKKyAgICAgICAgMTA0NjUsIDEwMjg1LCAxMDEwNSwgIDk5MjUsICA5NzQ1LCAgOTU2OCwgIDkzOTEsICA5MjE4LCAgOTA0NSwgIDg4NzYsCisgICAgICAgICA4NzA3LCAgODU0MSwgIDgzNzUsICA4MjEzLCAgODA1MSwgIDc4OTQsICA3NzM3LCAgNzU4MywgIDc0MjksICA3Mjc3LAorICAgICAgICAgNzEyNSwgIDY5NzcsICA2ODMwLCAgNjY4NywgIDY1NDQsICA2NDA2LCAgNjI2OCwgIDYxMzMsICA1OTk4LCAgNTg2OCwKKyAgICAgICAgIDU3MzgsICA1NjEyLCAgNTQ4NywgIDUzNjQsICA1MjQxLCAgNTExOCwgIDQ5OTUsICA0ODc1LCAgNDc1NSwgIDQ2NDAsCisgICAgICAgICA0NTI1LCAgNDQxNCwgIDQzMDQsICA0MTk4LCAgNDA5MiwgIDM5OTAsICAzODg4LCAgMzc5MCwgIDM2OTMsICAzNjAwLAorICAgICAgICAgMzUwNywgIDM0MTUsICAzMzIzLCAgMzIzNSwgIDMxNDcsICAzMDY0LCAgMjk4MSwgIDI5MDIsICAyODIzLCAgMjc0NiwKKyAgICAgICAgIDI2NzAsICAyNTk0LCAgMjUyMiwgIDI0NTAsICAyMzgyLCAgMjMxNCwgIDIyNDgsICAyMTgyLCAgMjExNiwgIDIwNTAsCisgICAgICAgICAxOTg3LCAgMTkyNCwgIDE4NjQsICAxODA0LCAgMTc0OCwgIDE2OTIsICAxNjM4LCAgMTU4NSwgIDE1MzQsICAxNDg0LAorICAgICAgICAgMTQzNywgIDEzOTAsICAxMzQ2LCAgMTMwMiwgIDEyNTgsICAxMjE1LCAgMTE3NCwgIDExMzMsICAxMDk1LCAgMTA1NywKKyAgICAgICAgIDEwMjEsICAgOTg2LCAgIDk1MiwgICA5MTgsICAgODg3LCAgIDg1NiwgICA4MjcsICAgNzk4LCAgIDc3MCwgICA3NDIsCisgICAgICAgICAgNzE0LCAgIDY4NiwgICA2NTksICAgNjMyLCAgIDYwNywgICA1ODIsICAgNTU5LCAgIDUzNiwgICA1MTQsICAgNDkyLAorICAgICAgICAgIDQ3MiwgICA0NTIsICAgNDMzLCAgIDQxNSwgICAzOTgsICAgMzgxLCAgIDM2NCwgICAzNDgsICAgMzMzLCAgIDMxOCwKKyAgICAgICAgICAzMDQsICAgMjkwLCAgIDI3NywgICAyNjQsICAgMjUyLCAgIDI0MCwgICAyMjksICAgMjE4LCAgIDIwOCwgICAxOTgsCisgICAgICAgICAgMTg4LCAgIDE3OCwgICAxNjgsICAgMTU4LCAgIDE0OSwgICAxNDAsICAgMTMyLCAgIDEyNCwgICAxMTYsICAgMTA4LAorICAgICAgICAgIDEwMSwgICAgOTQsICAgIDg3LCAgICA4MSwgICAgNzUsICAgIDY5LCAgICA2NCwgICAgNTksICAgIDU0LCAgICA0OSwKKyAgICAgICAgICAgNDQsICAgIDM5LCAgICAzNSwgICAgMzEsICAgIDI3LCAgICAyMywgICAgMTksICAgIDE1LCAgICAxMiwgICAgIDksCisgICAgICAgICAgICA2LCAgICAgMywgICAgIDAKKyAgICB9Cit9OworCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjZl90YWJsZXNfM1s1XVsyNTddID0geworICAgIHsKKyAgICAgICAgMTYzODQsIDE2MTg3LCAxNTk5MCwgMTU3OTMsIDE1NTk3LCAxNTQwMSwgMTUyMDUsIDE1MDA5LCAxNDgxMywgMTQ2MTgsCisgICAgICAgIDE0NDIzLCAxNDIzMCwgMTQwMzcsIDEzODQ1LCAxMzY1MywgMTM0NjMsIDEzMjczLCAxMzA4MywgMTI4OTQsIDEyNzA2LAorICAgICAgICAxMjUxOCwgMTIzMzIsIDEyMTQ2LCAxMTk2MiwgMTE3NzgsIDExNTk3LCAxMTQxNiwgMTEyMzcsIDExMDU5LCAxMDg4MiwKKyAgICAgICAgMTA3MDYsIDEwNTMyLCAxMDM1OCwgMTAxODQsIDEwMDEwLCAgOTgzOCwgIDk2NjYsICA5NDk3LCAgOTMyOCwgIDkxNjMsCisgICAgICAgICA4OTk5LCAgODgzNywgIDg2NzUsICA4NTE3LCAgODM1OSwgIDgyMDUsICA4MDUxLCAgNzkwMSwgIDc3NTEsICA3NjAyLAorICAgICAgICAgNzQ1MywgIDczMDgsICA3MTYzLCAgNzAyMiwgIDY4ODIsICA2NzQ1LCAgNjYwOSwgIDY0NzYsICA2MzQzLCAgNjIxNCwKKyAgICAgICAgIDYwODUsICA1OTYwLCAgNTgzNSwgIDU3MTIsICA1NTg5LCAgNTQ2NiwgIDUzNDMsICA1MjIzLCAgNTEwMywgIDQ5ODcsCisgICAgICAgICA0ODcyLCAgNDc2MSwgIDQ2NTAsICA0NTQyLCAgNDQzNSwgIDQzMzIsICA0MjI5LCAgNDEzMCwgIDQwMzEsICAzOTM2LAorICAgICAgICAgMzg0MSwgIDM3NDcsICAzNjUzLCAgMzU2MywgIDM0NzMsICAzMzg3LCAgMzMwMiwgIDMyMjAsICAzMTM4LCAgMzA1OSwKKyAgICAgICAgIDI5ODAsICAyOTA1LCAgMjgzMCwgIDI3NTksICAyNjg4LCAgMjYxOSwgIDI1NTAsICAyNDgxLCAgMjQxMiwgIDIzNDUsCisgICAgICAgICAyMjc4LCAgMjIxNSwgIDIxNTIsICAyMDkyLCAgMjAzMiwgIDE5NzQsICAxOTE3LCAgMTg2MywgIDE4MDksICAxNzU4LAorICAgICAgICAgMTcwNywgIDE2NTksICAxNjExLCAgMTU2NCwgIDE1MTcsICAxNDczLCAgMTQyOSwgIDEzODcsICAxMzQ2LCAgMTMwNywKKyAgICAgICAgIDEyNjgsICAxMjMwLCAgMTE5MywgIDExNTgsICAxMTIzLCAgMTA5MCwgIDEwNTgsICAxMDI2LCAgIDk5NCwgICA5NjIsCisgICAgICAgICAgOTMwLCAgIDg5OSwgICA4NjksICAgODQxLCAgIDgxMywgICA3ODYsICAgNzYwLCAgIDczNSwgICA3MTAsICAgNjg3LAorICAgICAgICAgIDY2NCwgICA2NDMsICAgNjIyLCAgIDYwMiwgICA1ODIsICAgNTYyLCAgIDU0MywgICA1MjUsICAgNTA3LCAgIDQ5MCwKKyAgICAgICAgICA0NzMsICAgNDU3LCAgIDQ0MiwgICA0MjcsICAgNDEyLCAgIDM5OCwgICAzODUsICAgMzczLCAgIDM2MSwgICAzNDksCisgICAgICAgICAgMzM3LCAgIDMyNSwgICAzMTMsICAgMzAxLCAgIDI5MCwgICAyNzksICAgMjY5LCAgIDI1OSwgICAyNDksICAgMjQwLAorICAgICAgICAgIDIzMSwgICAyMjIsICAgMjE0LCAgIDIwNiwgICAxOTksICAgMTkyLCAgIDE4NSwgICAxNzgsICAgMTcxLCAgIDE2NSwKKyAgICAgICAgICAxNTksICAgMTUzLCAgIDE0OCwgICAxNDMsICAgMTM4LCAgIDEzMywgICAxMjgsICAgMTIzLCAgIDExOSwgICAxMTUsCisgICAgICAgICAgMTExLCAgIDEwNywgICAxMDMsICAgIDk5LCAgICA5NSwgICAgOTEsICAgIDg3LCAgICA4MywgICAgODAsICAgIDc3LAorICAgICAgICAgICA3NCwgICAgNzEsICAgIDY4LCAgICA2NSwgICAgNjMsICAgIDYxLCAgICA1OSwgICAgNTcsICAgIDU1LCAgICA1MywKKyAgICAgICAgICAgNTEsICAgIDQ5LCAgICA0NywgICAgNDUsICAgIDQzLCAgICA0MSwgICAgNDAsICAgIDM5LCAgICAzOCwgICAgMzcsCisgICAgICAgICAgIDM2LCAgICAzNSwgICAgMzQsICAgIDMzLCAgICAzMiwgICAgMzEsICAgIDMwLCAgICAyOSwgICAgMjgsICAgIDI3LAorICAgICAgICAgICAyNiwgICAgMjUsICAgIDI0LCAgICAyMywgICAgMjIsICAgIDIxLCAgICAyMCwgICAgMTksICAgIDE4LCAgICAxNywKKyAgICAgICAgICAgMTYsICAgIDE1LCAgICAxNCwgICAgMTMsICAgIDEyLCAgICAxMSwgICAgMTAsICAgICA5LCAgICAgOCwgICAgIDcsCisgICAgICAgICAgICA2LCAgICAgNSwgICAgIDQsICAgICAzLCAgICAgMiwgICAgIDEsICAgICAwCisgICAgfSwKKyAgICB7CisgICAgICAgIDE2Mzg0LCAxNjE5NSwgMTYwMDYsIDE1ODE3LCAxNTYyOSwgMTU0NDEsIDE1MjUzLCAxNTA2NSwgMTQ4NzgsIDE0NjkyLAorICAgICAgICAxNDUwNiwgMTQzMjEsIDE0MTM2LCAxMzk1MiwgMTM3NjgsIDEzNTg1LCAxMzQwMiwgMTMyMTksIDEzMDM3LCAxMjg1NywKKyAgICAgICAgMTI2NzcsIDEyNDk5LCAxMjMyMSwgMTIxNDQsIDExOTY3LCAxMTc5MiwgMTE2MTcsIDExNDQ0LCAxMTI3MSwgMTExMDAsCisgICAgICAgIDEwOTMwLCAxMDc2MiwgMTA1OTQsIDEwNDI2LCAxMDI1OCwgMTAwOTEsICA5OTI1LCAgOTc2MSwgIDk1OTgsICA5NDM4LAorICAgICAgICAgOTI3OCwgIDkxMjAsICA4OTYzLCAgODgwOSwgIDg2NTUsICA4NTA0LCAgODM1NCwgIDgyMDcsICA4MDYwLCAgNzkxNCwKKyAgICAgICAgIDc3NjksICA3NjI3LCAgNzQ4NSwgIDczNDcsICA3MjA5LCAgNzA3NCwgIDY5MzksICA2ODA3LCAgNjY3NiwgIDY1NDgsCisgICAgICAgICA2NDIwLCAgNjI5NiwgIDYxNzIsICA2MDUwLCAgNTkyOCwgIDU4MDYsICA1Njg0LCAgNTU2NCwgIDU0NDQsICA1MzI4LAorICAgICAgICAgNTIxMiwgIDUxMDAsICA0OTg4LCAgNDg3OSwgIDQ3NzEsICA0NjY3LCAgNDU2MywgIDQ0NjIsICA0MzYyLCAgNDI2NSwKKyAgICAgICAgIDQxNjksICA0MDczLCAgMzk3OCwgIDM4ODYsICAzNzk1LCAgMzcwNywgIDM2MTksICAzNTM1LCAgMzQ1MSwgIDMzNjksCisgICAgICAgICAzMjg4LCAgMzIxMCwgIDMxMzMsICAzMDU5LCAgMjk4NSwgIDI5MTMsICAyODQxLCAgMjc2OSwgIDI2OTcsICAyNjI3LAorICAgICAgICAgMjU1NywgIDI0OTAsICAyNDI0LCAgMjM2MCwgIDIyOTcsICAyMjM3LCAgMjE3NywgIDIxMTksICAyMDYyLCAgMjAwNywKKyAgICAgICAgIDE5NTMsICAxOTAxLCAgMTg0OSwgIDE3OTgsICAxNzQ4LCAgMTcwMCwgIDE2NTIsICAxNjA3LCAgMTU2MiwgIDE1MTksCisgICAgICAgICAxNDc2LCAgMTQzNSwgIDEzOTQsICAxMzU1LCAgMTMxNywgIDEyODEsICAxMjQ1LCAgMTIxMCwgIDExNzUsICAxMTQwLAorICAgICAgICAgMTEwNSwgIDEwNzEsICAxMDM3LCAgMTAwNSwgICA5NzMsICAgOTQzLCAgIDkxMywgICA4ODUsICAgODU3LCAgIDgzMCwKKyAgICAgICAgICA4MDQsICAgNzc5LCAgIDc1NCwgICA3MzEsICAgNzA4LCAgIDY4NSwgICA2NjMsICAgNjQyLCAgIDYyMSwgICA2MDEsCisgICAgICAgICAgNTgxLCAgIDU2MywgICA1NDUsICAgNTI4LCAgIDUxMSwgICA0OTUsICAgNDc5LCAgIDQ2MywgICA0NDgsICAgNDMzLAorICAgICAgICAgIDQxOSwgICA0MDUsICAgMzkxLCAgIDM3NywgICAzNjQsICAgMzUxLCAgIDMzOCwgICAzMjYsICAgMzE0LCAgIDMwMiwKKyAgICAgICAgICAyOTEsICAgMjgwLCAgIDI3MCwgICAyNjAsICAgMjUxLCAgIDI0MiwgICAyMzQsICAgMjI2LCAgIDIxOCwgICAyMTAsCisgICAgICAgICAgMjAyLCAgIDE5NSwgICAxODgsICAgMTgxLCAgIDE3NCwgICAxNjgsICAgMTYyLCAgIDE1NiwgICAxNTAsICAgMTQ0LAorICAgICAgICAgIDEzOSwgICAxMzQsICAgMTI5LCAgIDEyNCwgICAxMTksICAgMTE0LCAgIDEwOSwgICAxMDQsICAgMTAwLCAgICA5NiwKKyAgICAgICAgICAgOTIsICAgIDg4LCAgICA4NCwgICAgODAsICAgIDc3LCAgICA3NCwgICAgNzEsICAgIDY4LCAgICA2NSwgICAgNjIsCisgICAgICAgICAgIDU5LCAgICA1NiwgICAgNTQsICAgIDUyLCAgICA1MCwgICAgNDgsICAgIDQ2LCAgICA0NCwgICAgNDIsICAgIDQwLAorICAgICAgICAgICAzOCwgICAgMzYsICAgIDM0LCAgICAzMywgICAgMzIsICAgIDMxLCAgICAzMCwgICAgMjksICAgIDI4LCAgICAyNywKKyAgICAgICAgICAgMjYsICAgIDI1LCAgICAyNCwgICAgMjMsICAgIDIyLCAgICAyMSwgICAgMjAsICAgIDE5LCAgICAxOCwgICAgMTcsCisgICAgICAgICAgIDE2LCAgICAxNSwgICAgMTQsICAgIDEzLCAgICAxMiwgICAgMTEsICAgIDEwLCAgICAgOSwgICAgIDgsICAgICA3LAorICAgICAgICAgICAgNiwgICAgIDUsICAgICA0LCAgICAgMywgICAgIDIsICAgICAxLCAgICAgMAorICAgIH0sCisgICAgeworICAgICAgICAxNjM4NCwgMTYyMDMsIDE2MDIyLCAxNTg0MiwgMTU2NjIsIDE1NDgyLCAxNTMwMiwgMTUxMjIsIDE0OTQyLCAxNDc2MywKKyAgICAgICAgMTQ1ODQsIDE0NDA2LCAxNDIyOCwgMTQwNTEsIDEzODc0LCAxMzY5OCwgMTM1MjIsIDEzMzQ3LCAxMzE3MiwgMTI5OTgsCisgICAgICAgIDEyODI0LCAxMjY1MiwgMTI0ODAsIDEyMzEwLCAxMjE0MCwgMTE5NzEsIDExODAzLCAxMTYzNywgMTE0NzEsIDExMzA3LAorICAgICAgICAxMTE0MywgMTA5ODAsIDEwODE3LCAxMDY1NCwgMTA0OTEsIDEwMzMwLCAxMDE2OSwgMTAwMTEsICA5ODUzLCAgOTY5NywKKyAgICAgICAgIDk1NDIsICA5Mzg5LCAgOTIzNiwgIDkwODYsICA4OTM2LCAgODc4OSwgIDg2NDIsICA4NDk4LCAgODM1NSwgIDgyMTIsCisgICAgICAgICA4MDcwLCAgNzkzMSwgIDc3OTIsICA3NjU2LCAgNzUyMCwgIDczODgsICA3MjU2LCAgNzEyNiwgIDY5OTYsICA2ODcwLAorICAgICAgICAgNjc0NCwgIDY2MjEsICA2NDk4LCAgNjM3NywgIDYyNTYsICA2MTM1LCAgNjAxNCwgIDU4OTUsICA1Nzc2LCAgNTY2MCwKKyAgICAgICAgIDU1NDUsICA1NDMzLCAgNTMyMSwgIDUyMTIsICA1MTA0LCAgNDk5OSwgIDQ4OTUsICA0NzkzLCAgNDY5MiwgIDQ1OTQsCisgICAgICAgICA0NDk2LCAgNDQwMCwgIDQzMDQsICA0MjExLCAgNDExOCwgIDQwMjgsICAzOTM5LCAgMzg1MywgIDM3NjcsICAzNjg0LAorICAgICAgICAgMzYwMSwgIDM1MjEsICAzNDQxLCAgMzM2NCwgIDMyODcsICAzMjEyLCAgMzEzNywgIDMwNjIsICAyOTg3LCAgMjkxNSwKKyAgICAgICAgIDI4NDMsICAyNzczLCAgMjcwNCwgIDI2MzgsICAyNTcyLCAgMjUwOCwgIDI0NDUsICAyMzg0LCAgMjMyNCwgIDIyNjYsCisgICAgICAgICAyMjA4LCAgMjE1MywgIDIwOTgsICAyMDQ0LCAgMTk5MCwgIDE5MzksICAxODg4LCAgMTgzOSwgIDE3OTEsICAxNzQ1LAorICAgICAgICAgMTY5OSwgIDE2NTUsICAxNjExLCAgMTU2OSwgIDE1MjcsICAxNDg3LCAgMTQ0OCwgIDE0MDksICAxMzcwLCAgMTMzMSwKKyAgICAgICAgIDEyOTIsICAxMjU1LCAgMTIxOCwgIDExODMsICAxMTQ4LCAgMTExNSwgIDEwODIsICAxMDUxLCAgMTAyMCwgICA5OTAsCisgICAgICAgICAgOTYwLCAgIDkzMiwgICA5MDQsICAgODc4LCAgIDg1MiwgICA4MjYsICAgODAxLCAgIDc3NywgICA3NTMsICAgNzMxLAorICAgICAgICAgIDcwOSwgICA2ODcsICAgNjY2LCAgIDY0NSwgICA2MjUsICAgNjA1LCAgIDU4NiwgICA1NjcsICAgNTUwLCAgIDUzMywKKyAgICAgICAgICA1MTYsICAgNDk5LCAgIDQ4MiwgICA0NjUsICAgNDQ5LCAgIDQzMywgICA0MTgsICAgNDAzLCAgIDM4OSwgICAzNzUsCisgICAgICAgICAgMzYyLCAgIDM0OSwgICAzMzcsICAgMzI1LCAgIDMxNCwgICAzMDMsICAgMjkzLCAgIDI4MywgICAyNzMsICAgMjYzLAorICAgICAgICAgIDI1NCwgICAyNDUsICAgMjM2LCAgIDIyNywgICAyMTksICAgMjExLCAgIDIwNCwgICAxOTcsICAgMTkwLCAgIDE4MywKKyAgICAgICAgICAxNzcsICAgMTcxLCAgIDE2NSwgICAxNTksICAgMTUzLCAgIDE0NywgICAxNDEsICAgMTM1LCAgIDEzMCwgICAxMjUsCisgICAgICAgICAgMTIwLCAgIDExNSwgICAxMTAsICAgMTA1LCAgIDEwMSwgICAgOTcsICAgIDkzLCAgICA4OSwgICAgODUsICAgIDgxLAorICAgICAgICAgICA3NywgICAgNzQsICAgIDcxLCAgICA2OCwgICAgNjUsICAgIDYyLCAgICA1OSwgICAgNTYsICAgIDUzLCAgICA1MSwKKyAgICAgICAgICAgNDksICAgIDQ3LCAgICA0NSwgICAgNDMsICAgIDQxLCAgICAzOSwgICAgMzcsICAgIDM1LCAgICAzMywgICAgMzEsCisgICAgICAgICAgIDI5LCAgICAyNywgICAgMjUsICAgIDIzLCAgICAyMiwgICAgMjEsICAgIDIwLCAgICAxOSwgICAgMTgsICAgIDE3LAorICAgICAgICAgICAxNiwgICAgMTUsICAgIDE0LCAgICAxMywgICAgMTIsICAgIDExLCAgICAxMCwgICAgIDksICAgICA4LCAgICAgNywKKyAgICAgICAgICAgIDYsICAgICA1LCAgICAgNCwgICAgIDMsICAgICAyLCAgICAgMSwgICAgIDAKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTYzODQsIDE2MjEwLCAxNjAzNiwgMTU4NjMsIDE1NjkwLCAxNTUxNywgMTUzNDQsIDE1MTcyLCAxNTAwMCwgMTQ4MjgsCisgICAgICAgIDE0NjU2LCAxNDQ4NSwgMTQzMTQsIDE0MTQ1LCAxMzk3NiwgMTM4MDgsIDEzNjQwLCAxMzQ3MiwgMTMzMDQsIDEzMTM3LAorICAgICAgICAxMjk3MCwgMTI4MDQsIDEyNjM5LCAxMjQ3NSwgMTIzMTIsIDEyMTQ5LCAxMTk4NywgMTE4MjcsIDExNjY3LCAxMTUwOCwKKyAgICAgICAgMTEzNDksIDExMTkyLCAxMTAzNSwgMTA4NzgsIDEwNzIxLCAxMDU2NSwgMTA0MTAsIDEwMjU3LCAxMDEwNCwgIDk5NTMsCisgICAgICAgICA5ODAyLCAgOTY1NCwgIDk1MDYsICA5MzU5LCAgOTIxMywgIDkwNzAsICA4OTI3LCAgODc4NywgIDg2NDcsICA4NTA4LAorICAgICAgICAgODM2OSwgIDgyMzMsICA4MDk3LCAgNzk2NCwgIDc4MzEsICA3NzAwLCAgNzU3MCwgIDc0NDIsICA3MzE1LCAgNzE5MCwKKyAgICAgICAgIDcwNjUsICA2OTQzLCAgNjgyMSwgIDY3MDEsICA2NTgxLCAgNjQ2MSwgIDYzNDEsICA2MjIzLCAgNjEwNSwgIDU5OTAsCisgICAgICAgICA1ODc2LCAgNTc2NCwgIDU2NTMsICA1NTQ1LCAgNTQzNywgIDUzMzEsICA1MjI2LCAgNTEyNCwgIDUwMjIsICA0OTI0LAorICAgICAgICAgNDgyNiwgIDQ3MjksICA0NjMyLCAgNDUzOCwgIDQ0NDQsICA0MzUzLCAgNDI2MiwgIDQxNzQsICA0MDg3LCAgNDAwMiwKKyAgICAgICAgIDM5MTcsICAzODM1LCAgMzc1MywgIDM2NzQsICAzNTk1LCAgMzUxOCwgIDM0NDEsICAzMzY0LCAgMzI4NywgIDMyMTIsCisgICAgICAgICAzMTM4LCAgMzA2NiwgIDI5OTUsICAyOTI2LCAgMjg1OCwgIDI3OTIsICAyNzI2LCAgMjY2MiwgIDI1OTksICAyNTM4LAorICAgICAgICAgMjQ3OCwgIDI0MjAsICAyMzYyLCAgMjMwNSwgIDIyNDksICAyMTk1LCAgMjE0MSwgIDIwODksICAyMDM3LCAgMTk4OCwKKyAgICAgICAgIDE5MzksICAxODkxLCAgMTg0NCwgIDE3OTksICAxNzU0LCAgMTcxMSwgIDE2NjgsICAxNjI2LCAgMTU4NCwgIDE1NDIsCisgICAgICAgICAxNTAwLCAgMTQ1OSwgIDE0MTgsICAxMzgwLCAgMTM0MiwgIDEzMDUsICAxMjY5LCAgMTIzNCwgIDExOTksICAxMTY2LAorICAgICAgICAgMTEzMywgIDExMDIsICAxMDcxLCAgMTA0MSwgIDEwMTIsICAgOTgzLCAgIDk1NCwgICA5MjYsICAgODk5LCAgIDg3MiwKKyAgICAgICAgICA4NDcsICAgODIyLCAgIDc5OCwgICA3NzQsICAgNzUxLCAgIDcyOCwgICA3MDcsICAgNjg2LCAgIDY2NiwgICA2NDYsCisgICAgICAgICAgNjI3LCAgIDYwOCwgICA1ODksICAgNTcwLCAgIDU1MiwgICA1MzQsICAgNTE3LCAgIDUwMCwgICA0ODQsICAgNDY4LAorICAgICAgICAgIDQ1MywgICA0MzgsICAgNDI0LCAgIDQxMCwgICAzOTcsICAgMzg0LCAgIDM3MiwgICAzNjAsICAgMzQ4LCAgIDMzNiwKKyAgICAgICAgICAzMjUsICAgMzE0LCAgIDMwMywgICAyOTMsICAgMjgzLCAgIDI3MywgICAyNjQsICAgMjU1LCAgIDI0NiwgICAyMzcsCisgICAgICAgICAgMjI5LCAgIDIyMSwgICAyMTMsICAgMjA1LCAgIDE5NywgICAxODksICAgMTgxLCAgIDE3NCwgICAxNjcsICAgMTYwLAorICAgICAgICAgIDE1NCwgICAxNDgsICAgMTQyLCAgIDEzNiwgICAxMzEsICAgMTI2LCAgIDEyMSwgICAxMTYsICAgMTExLCAgIDEwNiwKKyAgICAgICAgICAxMDEsICAgIDk3LCAgICA5MywgICAgODksICAgIDg1LCAgICA4MSwgICAgNzcsICAgIDczLCAgICA3MCwgICAgNjcsCisgICAgICAgICAgIDY0LCAgICA2MSwgICAgNTgsICAgIDU1LCAgICA1MiwgICAgNDksICAgIDQ2LCAgICA0MywgICAgNDAsICAgIDM3LAorICAgICAgICAgICAzNSwgICAgMzMsICAgIDMxLCAgICAyOSwgICAgMjcsICAgIDI1LCAgICAyMywgICAgMjEsICAgIDE5LCAgICAxNywKKyAgICAgICAgICAgMTYsICAgIDE1LCAgICAxNCwgICAgMTMsICAgIDEyLCAgICAxMSwgICAgMTAsICAgICA5LCAgICAgOCwgICAgIDcsCisgICAgICAgICAgICA2LCAgICAgNSwgICAgIDQsICAgICAzLCAgICAgMiwgICAgIDEsICAgICAwCisgICAgfSwKKyAgICB7CisgICAgICAgIDE2Mzg0LCAxNjIxOCwgMTYwNTIsIDE1ODg2LCAxNTcyMCwgMTU1NTQsIDE1Mzg5LCAxNTIyNCwgMTUwNTksIDE0ODk1LAorICAgICAgICAxNDczMSwgMTQ1NjcsIDE0NDAzLCAxNDI0MCwgMTQwNzcsIDEzOTE1LCAxMzc1MywgMTM1OTEsIDEzNDI5LCAxMzI2OSwKKyAgICAgICAgMTMxMDksIDEyOTUwLCAxMjc5MSwgMTI2MzMsIDEyNDc2LCAxMjMyMCwgMTIxNjQsIDEyMDA5LCAxMTg1NCwgMTE3MDEsCisgICAgICAgIDExNTQ4LCAxMTM5NiwgMTEyNDQsIDExMDkyLCAxMDk0MCwgMTA3OTAsIDEwNjQwLCAxMDQ5MiwgMTAzNDQsIDEwMTk4LAorICAgICAgICAxMDA1MiwgIDk5MDgsICA5NzY0LCAgOTYyMiwgIDk0ODEsICA5MzQyLCAgOTIwMywgIDkwNjYsICA4OTI5LCAgODc5MywKKyAgICAgICAgIDg2NTcsICA4NTI0LCAgODM5MSwgIDgyNjEsICA4MTMxLCAgODAwMywgIDc4NzUsICA3NzQ5LCAgNzYyNCwgIDc1MDIsCisgICAgICAgICA3MzgwLCAgNzI2MCwgIDcxNDAsICA3MDIyLCAgNjkwNCwgIDY3ODYsICA2NjY4LCAgNjU1MSwgIDY0MzUsICA2MzIyLAorICAgICAgICAgNjIwOSwgIDYwOTksICA1OTg5LCAgNTg4MSwgIDU3NzMsICA1NjY4LCAgNTU2MywgIDU0NjEsICA1MzU5LCAgNTI2MCwKKyAgICAgICAgIDUxNjEsICA1MDYzLCAgNDk2NSwgIDQ4NzEsICA0Nzc3LCAgNDY4NiwgIDQ1OTUsICA0NTA2LCAgNDQxNywgIDQzMzEsCisgICAgICAgICA0MjQ1LCAgNDE2MiwgIDQwNzksICAzOTk5LCAgMzkxOSwgIDM4NDEsICAzNzYzLCAgMzY4NSwgIDM2MDcsICAzNTMwLAorICAgICAgICAgMzQ1NCwgIDMzODAsICAzMzA3LCAgMzIzNiwgIDMxNjYsICAzMDk3LCAgMzAyOSwgIDI5NjMsICAyODk3LCAgMjgzNCwKKyAgICAgICAgIDI3NzEsICAyNzEwLCAgMjY1MCwgIDI1OTEsICAyNTMyLCAgMjQ3NSwgIDI0MTgsICAyMzYzLCAgMjMwOSwgIDIyNTcsCisgICAgICAgICAyMjA1LCAgMjE1NSwgIDIxMDUsICAyMDU3LCAgMjAwOSwgIDE5NjMsICAxOTE4LCAgMTg3MywgIDE4MjgsICAxNzgzLAorICAgICAgICAgMTczOCwgIDE2OTQsICAxNjUwLCAgMTYwNywgIDE1NjUsICAxNTI0LCAgMTQ4NCwgIDE0NDUsICAxNDA3LCAgMTM2OSwKKyAgICAgICAgIDEzMzMsICAxMjk3LCAgMTI2MywgIDEyMjksICAxMTk3LCAgMTE2NSwgIDExMzQsICAxMTAzLCAgMTA3MywgIDEwNDMsCisgICAgICAgICAxMDE1LCAgIDk4NywgICA5NjAsICAgOTMzLCAgIDkwNywgICA4ODIsICAgODU4LCAgIDgzNCwgICA4MTEsICAgNzg4LAorICAgICAgICAgIDc2NiwgICA3NDQsICAgNzIyLCAgIDcwMCwgICA2NzksICAgNjU4LCAgIDYzOCwgICA2MTgsICAgNTk5LCAgIDU4MSwKKyAgICAgICAgICA1NjMsICAgNTQ1LCAgIDUyOCwgICA1MTEsICAgNDk1LCAgIDQ4MCwgICA0NjUsICAgNDUxLCAgIDQzNywgICA0MjMsCisgICAgICAgICAgNDEwLCAgIDM5NywgICAzODQsICAgMzcyLCAgIDM2MCwgICAzNDgsICAgMzM3LCAgIDMyNiwgICAzMTUsICAgMzA1LAorICAgICAgICAgIDI5NSwgICAyODUsICAgMjc1LCAgIDI2NSwgICAyNTUsICAgMjQ1LCAgIDIzNiwgICAyMjcsICAgMjE5LCAgIDIxMSwKKyAgICAgICAgICAyMDMsICAgMTk1LCAgIDE4OCwgICAxODEsICAgMTc0LCAgIDE2NywgICAxNjEsICAgMTU1LCAgIDE0OSwgICAxNDMsCisgICAgICAgICAgMTM3LCAgIDEzMSwgICAxMjYsICAgMTIxLCAgIDExNiwgICAxMTEsICAgMTA2LCAgIDEwMSwgICAgOTcsICAgIDkzLAorICAgICAgICAgICA4OSwgICAgODUsICAgIDgxLCAgICA3NywgICAgNzMsICAgIDY5LCAgICA2NSwgICAgNjEsICAgIDU4LCAgICA1NSwKKyAgICAgICAgICAgNTIsICAgIDQ5LCAgICA0NiwgICAgNDMsICAgIDQwLCAgICAzNywgICAgMzQsICAgIDMyLCAgICAzMCwgICAgMjgsCisgICAgICAgICAgIDI2LCAgICAyNCwgICAgMjIsICAgIDIwLCAgICAxOCwgICAgMTYsICAgIDE0LCAgICAxMiwgICAgMTAsICAgICA4LAorICAgICAgICAgICAgNiwgICAgIDUsICAgICA0LCAgICAgMywgICAgIDIsICAgICAxLCAgICAgMAorICAgIH0KK307CisKKworc3RhdGljIGNvbnN0IHVpbnQxNl90ICpjb25zdCBjZl90YWJsZVsxNl0gPSB7CisgICAgY2ZfdGFibGVzXzFbMF0sIGNmX3RhYmxlc18xWzFdLCBjZl90YWJsZXNfMVsyXSwgY2ZfdGFibGVzXzJbMF0sCisgICAgY2ZfdGFibGVzXzJbMV0sIGNmX3RhYmxlc18yWzJdLCBjZl90YWJsZXNfMlszXSwgY2ZfdGFibGVzXzJbNF0sCisgICAgY2ZfdGFibGVzXzJbNV0sIGNmX3RhYmxlc18yWzZdLCBjZl90YWJsZXNfMls3XSwgY2ZfdGFibGVzXzNbMF0sCisgICAgY2ZfdGFibGVzXzNbMV0sIGNmX3RhYmxlc18zWzJdLCBjZl90YWJsZXNfM1szXSwgY2ZfdGFibGVzXzNbNF0KK307CisKKworLyoqIEluaXRpYWxpemUgYSBnaXZlbiBsb29rdXAgdGFibGUgdXNpbmcgYSBnaXZlbiBkZWx0YSAqLworc3RhdGljIHZvaWQgYmdtY19sdXRfZmlsbHAodWludDhfdCAqbHV0LCBpbnQgKmx1dF9zdGF0dXMsIGludCBkZWx0YSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3gsIGk7CisKKyAgICBmb3IgKHN4ID0gMDsgc3ggPCAxNjsgc3grKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IExVVF9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXQgPSAoaSArIDEpIDw8IChGUkVRX0JJVFMgLSBMVVRfQklUUyk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3ltYm9sID0gMSA8PCBkZWx0YTsKKworICAgICAgICAgICAgd2hpbGUgKGNmX3RhYmxlW3N4XVtzeW1ib2xdID4gdGFyZ2V0KQorICAgICAgICAgICAgICAgIHN5bWJvbCArPSAxIDw8IGRlbHRhOworCisgICAgICAgICAgICAqbHV0KysgPSBzeW1ib2wgPj4gZGVsdGE7CisgICAgICAgIH0KKworICAgICpsdXRfc3RhdHVzID0gZGVsdGE7Cit9CisKKworLyoqIFJldHVuZSB0aGUgaW5kZXggb2YgYSBzdWl0YWJsZSBsb29rdXAgdGFibGUgZm9yIGEgZ2l2ZW4gZGVsdGEgKi8KK3N0YXRpYyB1aW50OF90ICpiZ21jX2x1dF9nZXRwKHVpbnQ4X3QgKmx1dCwgaW50ICpsdXRfc3RhdHVzLCBpbnQgZGVsdGEpCit7CisgICAgdW5zaWduZWQgaW50IGkgPSBhdl9jbGlwKGRlbHRhLCAwLCBMVVRfQlVGRiAtIDEpOworCisgICAgbHV0ICs9IChpICogTFVUX1NJWkUpIDw8IDQ7CisKKyAgICBpZiAobHV0X3N0YXR1c1tpXSAhPSBkZWx0YSkKKyAgICAgICAgYmdtY19sdXRfZmlsbHAobHV0LCAmbHV0X3N0YXR1c1tpXSwgZGVsdGEpOworCisgICAgcmV0dXJuIGx1dDsKK30KKworCisvKiogSW5pdGlhbGl6ZSB0aGUgbG9va3VwIHRhYmxlIGFycmF5cyAqLworYXZfY29sZCBpbnQgZmZfYmdtY19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqY2ZfbHV0LCBpbnQgKipjZl9sdXRfc3RhdHVzKQoreworICAgICpjZl9sdXQgICAgICAgID0gYXZfbWFsbG9jKHNpemVvZigqKmNmX2x1dCkgICAgICAgICogTFVUX0JVRkYgKiAxNiAqIExVVF9TSVpFKTsKKyAgICAqY2ZfbHV0X3N0YXR1cyA9IGF2X21hbGxvYyhzaXplb2YoKipjZl9sdXRfc3RhdHVzKSAqIExVVF9CVUZGKTsKKworICAgIGlmICghKmNmX2x1dCB8fCAhKmNmX2x1dF9zdGF0dXMpIHsKKyAgICAgICAgZmZfYmdtY19lbmQoY2ZfbHV0LCBjZl9sdXRfc3RhdHVzKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBbGxvY2F0aW5nIGJ1ZmZlciBtZW1vcnkgZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBsdXRfc3RhdHVzIGJ1ZmZlciB0byBhIHZhbHVlIG5ldmVyIHVzZWQgdG8gY29tcGFyZSBhZ2FpbnN0CisgICAgICAgIG1lbXNldCgqY2ZfbHV0X3N0YXR1cywgLTEsIHNpemVvZigqKmNmX2x1dF9zdGF0dXMpICogTFVUX0JVRkYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKy8qKiBSZWxlYXNlIHRoZSBsb29rdXAgdGFibGUgYXJyYXlzICovCithdl9jb2xkIHZvaWQgZmZfYmdtY19lbmQodWludDhfdCAqKmNmX2x1dCwgaW50ICoqY2ZfbHV0X3N0YXR1cykKK3sKKyAgICBhdl9mcmVlcChjZl9sdXQpOworICAgIGF2X2ZyZWVwKGNmX2x1dF9zdGF0dXMpOworfQorCisKKy8qKiBJbml0aWFsaXplIGRlY29kaW5nIGFuZCByZWFkcyB0aGUgZmlyc3QgdmFsdWUgKi8KK3ZvaWQgZmZfYmdtY19kZWNvZGVfaW5pdChHZXRCaXRDb250ZXh0ICpnYiwgdW5zaWduZWQgaW50ICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbCwgdW5zaWduZWQgaW50ICp2KQoreworICAgICpoID0gVE9QX1ZBTFVFOworICAgICpsID0gMDsKKyAgICAqdiA9IGdldF9iaXRzX2xvbmcoZ2IsIFZBTFVFX0JJVFMpOworfQorCisKKy8qKiBGaW5pc2ggZGVjb2RpbmcgKi8KK3ZvaWQgZmZfYmdtY19kZWNvZGVfZW5kKEdldEJpdENvbnRleHQgKmdiKQoreworICAgIHNraXBfYml0c19sb25nKGdiLCAtKFZBTFVFX0JJVFMgLSAyKSk7Cit9CisKKworLyoqIFJlYWQgYW5kIGRlY29kZSBhIGJsb2NrIEdpbGJlcnQtTW9vcmUgY29kZWQgc3ltYm9sICovCit2b2lkIGZmX2JnbWNfZGVjb2RlKEdldEJpdENvbnRleHQgKmdiLCB1bnNpZ25lZCBpbnQgbnVtLCBpbnQzMl90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSwgdW5zaWduZWQgaW50IHN4LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmgsIHVuc2lnbmVkIGludCAqbCwgdW5zaWduZWQgaW50ICp2LAorICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpjZl9sdXQsIGludCAqY2ZfbHV0X3N0YXR1cykKK3sKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB1aW50OF90ICpsdXQgPSBiZ21jX2x1dF9nZXRwKGNmX2x1dCwgY2ZfbHV0X3N0YXR1cywgZGVsdGEpOworCisgICAgLy8gcmVhZCBjdXJyZW50IHN0YXRlCisgICAgdW5zaWduZWQgaW50IGhpZ2ggID0gKmg7CisgICAgdW5zaWduZWQgaW50IGxvdyAgID0gKmw7CisgICAgdW5zaWduZWQgaW50IHZhbHVlID0gKnY7CisKKyAgICBsdXQgKz0gc3ggKiBMVVRfU0laRTsKKworICAgIC8vIGRlY29kZSBudW0gc2FtcGxlcworICAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICB1bnNpZ25lZCBpbnQgcmFuZ2UgID0gaGlnaCAtIGxvdyArIDE7CisgICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXQgPSAoKCh2YWx1ZSAtIGxvdyArIDEpIDw8IEZSRVFfQklUUykgLSAxKSAvIHJhbmdlOworICAgICAgICB1bnNpZ25lZCBpbnQgc3ltYm9sID0gbHV0W3RhcmdldCA+PiAoRlJFUV9CSVRTIC0gTFVUX0JJVFMpXSA8PCBkZWx0YTsKKworICAgICAgICB3aGlsZSAoY2ZfdGFibGVbc3hdW3N5bWJvbF0gPiB0YXJnZXQpCisgICAgICAgICAgICBzeW1ib2wgKz0gMSA8PCBkZWx0YTsKKworICAgICAgICBzeW1ib2wgPSAoc3ltYm9sID4+IGRlbHRhKSAtIDE7CisKKyAgICAgICAgaGlnaCA9IGxvdyArICgocmFuZ2UgKiBjZl90YWJsZVtzeF1bKHN5bWJvbCkgICAgIDw8IGRlbHRhXSAtICgxIDw8IEZSRVFfQklUUykpID4+IEZSRVFfQklUUyk7CisgICAgICAgIGxvdyAgPSBsb3cgKyAoKHJhbmdlICogY2ZfdGFibGVbc3hdWyhzeW1ib2wgKyAxKSA8PCBkZWx0YV0pICAgICAgICAgICAgICAgICAgICA+PiBGUkVRX0JJVFMpOworCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBpZiAoaGlnaCA+PSBIQUxGKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvdyA+PSBIQUxGKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlIC09IEhBTEY7CisgICAgICAgICAgICAgICAgICAgIGxvdyAgIC09IEhBTEY7CisgICAgICAgICAgICAgICAgICAgIGhpZ2ggIC09IEhBTEY7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb3cgPj0gRklSU1RfUVRSICYmIGhpZ2ggPCBUSElSRF9RVFIpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgLT0gRklSU1RfUVRSOworICAgICAgICAgICAgICAgICAgICBsb3cgICAtPSBGSVJTVF9RVFI7CisgICAgICAgICAgICAgICAgICAgIGhpZ2ggIC09IEZJUlNUX1FUUjsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvdyAgKj0gMjsKKyAgICAgICAgICAgIGhpZ2ggID0gMiAqIGhpZ2ggKyAxOworICAgICAgICAgICAgdmFsdWUgPSAyICogdmFsdWUgKyBnZXRfYml0czEoZ2IpOworICAgICAgICB9CisKKyAgICAgICAgKmRzdCsrID0gc3ltYm9sOworICAgIH0KKworICAgIC8vIHNhdmUgY3VycmVudCBzdGF0ZQorICAgICpoID0gaGlnaDsKKyAgICAqbCA9IGxvdzsKKyAgICAqdiA9IHZhbHVlOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYmdtYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYmdtYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OTM3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9iZ21jLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIEJsb2NrIEdpbGJlcnQtTW9vcmUgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIFRoaWxvIEJvcmdtYW5uIDx0aGlsby5ib3JnbWFubiBfYXRfIG1haWwuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEJsb2NrIEdpbGJlcnQtTW9vcmUgZGVjb2RlciBoZWFkZXIKKyAqIEBhdXRob3IgVGhpbG8gQm9yZ21hbm4gPHRoaWxvLmJvcmdtYW5uIF9hdF8gbWFpbC5kZT4KKyAqLworCisKKyNpZm5kZWYgQVZDT0RFQ19CR01DX0gKKyNkZWZpbmUgQVZDT0RFQ19CR01DX0gKKworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisKKworaW50IGZmX2JnbWNfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ4X3QgKipjZl9sdXQsIGludCAqKmNmX2x1dF9zdGF0dXMpOworCisKK3ZvaWQgZmZfYmdtY19lbmQodWludDhfdCAqKmNmX2x1dCwgaW50ICoqY2ZfbHV0X3N0YXR1cyk7CisKKwordm9pZCBmZl9iZ21jX2RlY29kZV9pbml0KEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqaCwgdW5zaWduZWQgaW50ICpsLCB1bnNpZ25lZCBpbnQgKnYpOworCisKK3ZvaWQgZmZfYmdtY19kZWNvZGVfZW5kKEdldEJpdENvbnRleHQgKmdiKTsKKworCit2b2lkIGZmX2JnbWNfZGVjb2RlKEdldEJpdENvbnRleHQgKmdiLCB1bnNpZ25lZCBpbnQgbnVtLCBpbnQzMl90ICpkc3QsCisgICAgICAgICAgICAgICAgIGludCBkZWx0YSwgdW5zaWduZWQgaW50IHN4LAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmgsIHVuc2lnbmVkIGludCAqbCwgdW5zaWduZWQgaW50ICp2LAorICAgICAgICAgICAgICAgICB1aW50OF90ICpjZl9sdXQsIGludCAqY2ZfbHV0X3N0YXR1cyk7CisKKworI2VuZGlmIC8qIEFWQ09ERUNfQkdNQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9iaW5rLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9iaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzZDI1YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JpbmsuYwpAQCAtMCwwICsxLDEzNTYgQEAKKy8qCisgKiBCaW5rIHZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBLb25zdGFudGluIFNoaXNoa292CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUGV0ZXIgUm9zcyA8cHJvc3NAeHZpZC5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJiaW5rZGF0YS5oIgorI2luY2x1ZGUgImJpbmtkc3AuaCIKKyNpbmNsdWRlICJibG9ja2RzcC5oIgorI2luY2x1ZGUgImhwZWxkc3AuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKworI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworI2RlZmluZSBCSU5LX0ZMQUdfQUxQSEEgMHgwMDEwMDAwMAorI2RlZmluZSBCSU5LX0ZMQUdfR1JBWSAgMHgwMDAyMDAwMAorCitzdGF0aWMgVkxDIGJpbmtfdHJlZXNbMTZdOworCisvKioKKyAqIElEcyBmb3IgZGlmZmVyZW50IGRhdGEgdHlwZXMgdXNlZCBpbiBvbGQgdmVyc2lvbiBvZiBCaW5rIHZpZGVvIGNvZGVjCisgKi8KK2VudW0gT2xkU291cmNlcyB7CisgICAgQklOS0JfU1JDX0JMT0NLX1RZUEVTID0gMCwgLy8vPCA4eDggYmxvY2sgdHlwZXMKKyAgICBCSU5LQl9TUkNfQ09MT1JTLCAgICAgICAgICAvLy88IHBpeGVsIHZhbHVlcyB1c2VkIGZvciBkaWZmZXJlbnQgYmxvY2sgdHlwZXMKKyAgICBCSU5LQl9TUkNfUEFUVEVSTiwgICAgICAgICAvLy88IDgtYml0IHZhbHVlcyBmb3IgMi1jb2xvdXIgcGF0dGVybiBmaWxsCisgICAgQklOS0JfU1JDX1hfT0ZGLCAgICAgICAgICAgLy8vPCBYIGNvbXBvbmVudHMgb2YgbW90aW9uIHZhbHVlCisgICAgQklOS0JfU1JDX1lfT0ZGLCAgICAgICAgICAgLy8vPCBZIGNvbXBvbmVudHMgb2YgbW90aW9uIHZhbHVlCisgICAgQklOS0JfU1JDX0lOVFJBX0RDLCAgICAgICAgLy8vPCBEQyB2YWx1ZXMgZm9yIGludHJhYmxvY2tzIHdpdGggRENUCisgICAgQklOS0JfU1JDX0lOVEVSX0RDLCAgICAgICAgLy8vPCBEQyB2YWx1ZXMgZm9yIGludGVyYmxvY2tzIHdpdGggRENUCisgICAgQklOS0JfU1JDX0lOVFJBX1EsICAgICAgICAgLy8vPCBxdWFudGl6ZXIgdmFsdWVzIGZvciBpbnRyYWJsb2NrcyB3aXRoIERDVAorICAgIEJJTktCX1NSQ19JTlRFUl9RLCAgICAgICAgIC8vLzwgcXVhbnRpemVyIHZhbHVlcyBmb3IgaW50ZXJibG9ja3Mgd2l0aCBEQ1QKKyAgICBCSU5LQl9TUkNfSU5URVJfQ09FRlMsICAgICAvLy88IG51bWJlciBvZiBjb2VmZmljaWVudHMgZm9yIHJlc2lkdWUgYmxvY2tzCisKKyAgICBCSU5LQl9OQl9TUkMKK307CisKK3N0YXRpYyBjb25zdCBpbnQgYmlua2JfYnVuZGxlX3NpemVzW0JJTktCX05CX1NSQ10gPSB7CisgICAgNCwgOCwgOCwgNSwgNSwgMTEsIDExLCA0LCA0LCA3Cit9OworCitzdGF0aWMgY29uc3QgaW50IGJpbmtiX2J1bmRsZV9zaWduZWRbQklOS0JfTkJfU1JDXSA9IHsKKyAgICAwLCAwLCAwLCAxLCAxLCAwLCAxLCAwLCAwLCAwCit9OworCitzdGF0aWMgaW50MzJfdCBiaW5rYl9pbnRyYV9xdWFudFsxNl1bNjRdOworc3RhdGljIGludDMyX3QgYmlua2JfaW50ZXJfcXVhbnRbMTZdWzY0XTsKKworLyoqCisgKiBJRHMgZm9yIGRpZmZlcmVudCBkYXRhIHR5cGVzIHVzZWQgaW4gQmluayB2aWRlbyBjb2RlYworICovCitlbnVtIFNvdXJjZXMgeworICAgIEJJTktfU1JDX0JMT0NLX1RZUEVTID0gMCwgLy8vPCA4eDggYmxvY2sgdHlwZXMKKyAgICBCSU5LX1NSQ19TVUJfQkxPQ0tfVFlQRVMsIC8vLzwgMTZ4MTYgYmxvY2sgdHlwZXMgKGEgc3Vic2V0IG9mIDh4OCBibG9jayB0eXBlcykKKyAgICBCSU5LX1NSQ19DT0xPUlMsICAgICAgICAgIC8vLzwgcGl4ZWwgdmFsdWVzIHVzZWQgZm9yIGRpZmZlcmVudCBibG9jayB0eXBlcworICAgIEJJTktfU1JDX1BBVFRFUk4sICAgICAgICAgLy8vPCA4LWJpdCB2YWx1ZXMgZm9yIDItY29sb3VyIHBhdHRlcm4gZmlsbAorICAgIEJJTktfU1JDX1hfT0ZGLCAgICAgICAgICAgLy8vPCBYIGNvbXBvbmVudHMgb2YgbW90aW9uIHZhbHVlCisgICAgQklOS19TUkNfWV9PRkYsICAgICAgICAgICAvLy88IFkgY29tcG9uZW50cyBvZiBtb3Rpb24gdmFsdWUKKyAgICBCSU5LX1NSQ19JTlRSQV9EQywgICAgICAgIC8vLzwgREMgdmFsdWVzIGZvciBpbnRyYWJsb2NrcyB3aXRoIERDVAorICAgIEJJTktfU1JDX0lOVEVSX0RDLCAgICAgICAgLy8vPCBEQyB2YWx1ZXMgZm9yIGludGVyYmxvY2tzIHdpdGggRENUCisgICAgQklOS19TUkNfUlVOLCAgICAgICAgICAgICAvLy88IHJ1biBsZW5ndGhzIGZvciBzcGVjaWFsIGZpbGwgYmxvY2sKKworICAgIEJJTktfTkJfU1JDCit9OworCisvKioKKyAqIGRhdGEgbmVlZGVkIHRvIGRlY29kZSA0LWJpdCBIdWZmbWFuLWNvZGVkIHZhbHVlCisgKi8KK3R5cGVkZWYgc3RydWN0IFRyZWUgeworICAgIGludCAgICAgdmxjX251bTsgIC8vLzwgdHJlZSBudW1iZXIgKGluIGJpbmtfdHJlZXNbXSkKKyAgICB1aW50OF90IHN5bXNbMTZdOyAvLy88IGxlYWYgdmFsdWUgdG8gc3ltYm9sIG1hcHBpbmcKK30gVHJlZTsKKworI2RlZmluZSBHRVRfSFVGRihnYiwgdHJlZSkgICh0cmVlKS5zeW1zW2dldF92bGMyKGdiLCBiaW5rX3RyZWVzWyh0cmVlKS52bGNfbnVtXS50YWJsZSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlua190cmVlc1sodHJlZSkudmxjX251bV0uYml0cywgMSldCisKKy8qKgorICogZGF0YSBzdHJ1Y3R1cmUgdXNlZCBmb3IgZGVjb2Rpbmcgc2luZ2xlIEJpbmsgZGF0YSB0eXBlCisgKi8KK3R5cGVkZWYgc3RydWN0IEJ1bmRsZSB7CisgICAgaW50ICAgICBsZW47ICAgICAgIC8vLzwgbGVuZ3RoIG9mIG51bWJlciBvZiBlbnRyaWVzIHRvIGRlY29kZSAoaW4gYml0cykKKyAgICBUcmVlICAgIHRyZWU7ICAgICAgLy8vPCBIdWZmbWFuIHRyZWUtcmVsYXRlZCBkYXRhCisgICAgdWludDhfdCAqZGF0YTsgICAgIC8vLzwgYnVmZmVyIGZvciBkZWNvZGVkIHN5bWJvbHMKKyAgICB1aW50OF90ICpkYXRhX2VuZDsgLy8vPCBidWZmZXIgZW5kCisgICAgdWludDhfdCAqY3VyX2RlYzsgIC8vLzwgcG9pbnRlciB0byB0aGUgbm90IHlldCBkZWNvZGVkIHBhcnQgb2YgdGhlIGJ1ZmZlcgorICAgIHVpbnQ4X3QgKmN1cl9wdHI7ICAvLy88IHBvaW50ZXIgdG8gdGhlIGRhdGEgdGhhdCBpcyBub3QgcmVhZCBmcm9tIGJ1ZmZlciB5ZXQKK30gQnVuZGxlOworCisvKgorICogRGVjb2RlciBjb250ZXh0CisgKi8KK3R5cGVkZWYgc3RydWN0IEJpbmtDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQmxvY2tEU1BDb250ZXh0IGJkc3A7CisgICAgSHBlbERTUENvbnRleHQgaGRzcDsKKyAgICBCaW5rRFNQQ29udGV4dCBiaW5rZHNwOworICAgIEFWRnJhbWUgICAgICAgICpsYXN0OworICAgIGludCAgICAgICAgICAgIHZlcnNpb247ICAgICAgICAgICAgICAvLy88IGludGVybmFsIEJpbmsgZmlsZSB2ZXJzaW9uCisgICAgaW50ICAgICAgICAgICAgaGFzX2FscGhhOworICAgIGludCAgICAgICAgICAgIHN3YXBfcGxhbmVzOworICAgIHVuc2lnbmVkICAgICAgIGZyYW1lX251bTsKKworICAgIEJ1bmRsZSAgICAgICAgIGJ1bmRsZVtCSU5LQl9OQl9TUkNdOyAvLy88IGJ1bmRsZXMgZm9yIGRlY29kaW5nIGFsbCBkYXRhIHR5cGVzCisgICAgVHJlZSAgICAgICAgICAgY29sX2hpZ2hbMTZdOyAgICAgICAgIC8vLzwgdHJlZXMgZm9yIGRlY29kaW5nIGhpZ2ggbmliYmxlIGluICJjb2xvdXJzIiBkYXRhIHR5cGUKKyAgICBpbnQgICAgICAgICAgICBjb2xfbGFzdHZhbDsgICAgICAgICAgLy8vPCB2YWx1ZSBvZiBsYXN0IGRlY29kZWQgaGlnaCBuaWJibGUgaW4gImNvbG91cnMiIGRhdGEgdHlwZQorfSBCaW5rQ29udGV4dDsKKworLyoqCisgKiBCaW5rIHZpZGVvIGJsb2NrIHR5cGVzCisgKi8KK2VudW0gQmxvY2tUeXBlcyB7CisgICAgU0tJUF9CTE9DSyA9IDAsIC8vLzwgc2tpcHBlZCBibG9jaworICAgIFNDQUxFRF9CTE9DSywgICAvLy88IGJsb2NrIGhhcyBzaXplIDE2eDE2CisgICAgTU9USU9OX0JMT0NLLCAgIC8vLzwgYmxvY2sgaXMgY29waWVkIGZyb20gcHJldmlvdXMgZnJhbWUgd2l0aCBzb21lIG9mZnNldAorICAgIFJVTl9CTE9DSywgICAgICAvLy88IGJsb2NrIGlzIGNvbXBvc2VkIGZyb20gcnVucyBvZiBjb2xvdXJzIHdpdGggY3VzdG9tIHNjYW4gb3JkZXIKKyAgICBSRVNJRFVFX0JMT0NLLCAgLy8vPCBtb3Rpb24gYmxvY2sgd2l0aCBzb21lIGRpZmZlcmVuY2UgYWRkZWQKKyAgICBJTlRSQV9CTE9DSywgICAgLy8vPCBpbnRyYSBEQ1QgYmxvY2sKKyAgICBGSUxMX0JMT0NLLCAgICAgLy8vPCBibG9jayBpcyBmaWxsZWQgd2l0aCBzaW5nbGUgY29sb3VyCisgICAgSU5URVJfQkxPQ0ssICAgIC8vLzwgbW90aW9uIGJsb2NrIHdpdGggRENUIGFwcGxpZWQgdG8gdGhlIGRpZmZlcmVuY2UKKyAgICBQQVRURVJOX0JMT0NLLCAgLy8vPCBibG9jayBpcyBmaWxsZWQgd2l0aCB0d28gY29sb3VycyBmb2xsb3dpbmcgY3VzdG9tIHBhdHRlcm4KKyAgICBSQVdfQkxPQ0ssICAgICAgLy8vPCB1bmNvZGVkIDh4OCBibG9jaworfTsKKworLyoqCisgKiBJbml0aWFsaXplIGxlbmd0aCBpbiBhbGwgYnVuZGxlcy4KKyAqCisgKiBAcGFyYW0gYyAgICAgZGVjb2RlciBjb250ZXh0CisgKiBAcGFyYW0gd2lkdGggcGxhbmUgd2lkdGgKKyAqIEBwYXJhbSBidyAgICBwbGFuZSB3aWR0aCBpbiA4eDggYmxvY2tzCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfbGVuZ3RocyhCaW5rQ29udGV4dCAqYywgaW50IHdpZHRoLCBpbnQgYncpCit7CisgICAgd2lkdGggPSBGRkFMSUdOKHdpZHRoLCA4KTsKKworICAgIGMtPmJ1bmRsZVtCSU5LX1NSQ19CTE9DS19UWVBFU10ubGVuID0gYXZfbG9nMigod2lkdGggPj4gMykgKyA1MTEpICsgMTsKKworICAgIGMtPmJ1bmRsZVtCSU5LX1NSQ19TVUJfQkxPQ0tfVFlQRVNdLmxlbiA9IGF2X2xvZzIoKHdpZHRoID4+IDQpICsgNTExKSArIDE7CisKKyAgICBjLT5idW5kbGVbQklOS19TUkNfQ09MT1JTXS5sZW4gPSBhdl9sb2cyKGJ3KjY0ICsgNTExKSArIDE7CisKKyAgICBjLT5idW5kbGVbQklOS19TUkNfSU5UUkFfRENdLmxlbiA9CisgICAgYy0+YnVuZGxlW0JJTktfU1JDX0lOVEVSX0RDXS5sZW4gPQorICAgIGMtPmJ1bmRsZVtCSU5LX1NSQ19YX09GRl0ubGVuID0KKyAgICBjLT5idW5kbGVbQklOS19TUkNfWV9PRkZdLmxlbiA9IGF2X2xvZzIoKHdpZHRoID4+IDMpICsgNTExKSArIDE7CisKKyAgICBjLT5idW5kbGVbQklOS19TUkNfUEFUVEVSTl0ubGVuID0gYXZfbG9nMigoYncgPDwgMykgKyA1MTEpICsgMTsKKworICAgIGMtPmJ1bmRsZVtCSU5LX1NSQ19SVU5dLmxlbiA9IGF2X2xvZzIoYncqNDggKyA1MTEpICsgMTsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGJ1bmRsZXMuCisgKgorICogQHBhcmFtIGMgZGVjb2RlciBjb250ZXh0CisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBpbml0X2J1bmRsZXMoQmlua0NvbnRleHQgKmMpCit7CisgICAgaW50IGJ3LCBiaCwgYmxvY2tzOworICAgIGludCBpOworCisgICAgYncgPSAoYy0+YXZjdHgtPndpZHRoICArIDcpID4+IDM7CisgICAgYmggPSAoYy0+YXZjdHgtPmhlaWdodCArIDcpID4+IDM7CisgICAgYmxvY2tzID0gYncgKiBiaDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCSU5LQl9OQl9TUkM7IGkrKykgeworICAgICAgICBjLT5idW5kbGVbaV0uZGF0YSA9IGF2X21hbGxvY3ooYmxvY2tzICogNjQpOworICAgICAgICBpZiAoIWMtPmJ1bmRsZVtpXS5kYXRhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYy0+YnVuZGxlW2ldLmRhdGFfZW5kID0gYy0+YnVuZGxlW2ldLmRhdGEgKyBibG9ja3MgKiA2NDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBGcmVlIG1lbW9yeSB1c2VkIGJ5IGJ1bmRsZXMuCisgKgorICogQHBhcmFtIGMgZGVjb2RlciBjb250ZXh0CisgKi8KK3N0YXRpYyBhdl9jb2xkIHZvaWQgZnJlZV9idW5kbGVzKEJpbmtDb250ZXh0ICpjKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBCSU5LQl9OQl9TUkM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmMtPmJ1bmRsZVtpXS5kYXRhKTsKK30KKworLyoqCisgKiBNZXJnZSB0d28gY29uc2VxdWVudCBsaXN0cyBvZiBlcXVhbCBzaXplIGRlcGVuZGluZyBvbiBiaXRzIHJlYWQuCisgKgorICogQHBhcmFtIGdiICAgY29udGV4dCBmb3IgcmVhZGluZyBiaXRzCisgKiBAcGFyYW0gZHN0ICBidWZmZXIgd2hlcmUgbWVyZ2VkIGxpc3Qgd2lsbCBiZSB3cml0dGVuIHRvCisgKiBAcGFyYW0gc3JjICBwb2ludGVyIHRvIHRoZSBoZWFkIG9mIHRoZSBmaXJzdCBsaXN0ICh0aGUgc2Vjb25kIGxpc3RzIHN0YXJ0cyBhdCBzcmMrc2l6ZSkKKyAqIEBwYXJhbSBzaXplIGlucHV0IGxpc3RzIHNpemUKKyAqLworc3RhdGljIHZvaWQgbWVyZ2UoR2V0Qml0Q29udGV4dCAqZ2IsIHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc2l6ZSkKK3sKKyAgICB1aW50OF90ICpzcmMyID0gc3JjICsgc2l6ZTsKKyAgICBpbnQgc2l6ZTIgPSBzaXplOworCisgICAgZG8geworICAgICAgICBpZiAoIWdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMyKys7CisgICAgICAgICAgICBzaXplMi0tOworICAgICAgICB9CisgICAgfSB3aGlsZSAoc2l6ZSAmJiBzaXplMik7CisKKyAgICB3aGlsZSAoc2l6ZS0tKQorICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgd2hpbGUgKHNpemUyLS0pCisgICAgICAgICpkc3QrKyA9ICpzcmMyKys7Cit9CisKKy8qKgorICogUmVhZCBpbmZvcm1hdGlvbiBhYm91dCBIdWZmbWFuIHRyZWUgdXNlZCB0byBkZWNvZGUgZGF0YS4KKyAqCisgKiBAcGFyYW0gZ2IgICBjb250ZXh0IGZvciByZWFkaW5nIGJpdHMKKyAqIEBwYXJhbSB0cmVlIHBvaW50ZXIgZm9yIHN0b3JpbmcgdHJlZSBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfdHJlZShHZXRCaXRDb250ZXh0ICpnYiwgVHJlZSAqdHJlZSkKK3sKKyAgICB1aW50OF90IHRtcDFbMTZdID0geyAwIH0sIHRtcDJbMTZdLCAqaW4gPSB0bXAxLCAqb3V0ID0gdG1wMjsKKyAgICBpbnQgaSwgdCwgbGVuOworCisgICAgdHJlZS0+dmxjX251bSA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICBpZiAoIXRyZWUtPnZsY19udW0pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICB0cmVlLT5zeW1zW2ldID0gaTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBsZW4gPSBnZXRfYml0cyhnYiwgMyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbGVuOyBpKyspIHsKKyAgICAgICAgICAgIHRyZWUtPnN5bXNbaV0gPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgICAgICB0bXAxW3RyZWUtPnN5bXNbaV1dID0gMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTYgJiYgbGVuIDwgMTYgLSAxOyBpKyspCisgICAgICAgICAgICBpZiAoIXRtcDFbaV0pCisgICAgICAgICAgICAgICAgdHJlZS0+c3ltc1srK2xlbl0gPSBpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxlbiA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICBpbltpXSA9IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGludCBzaXplID0gMSA8PCBpOworICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IDE2OyB0ICs9IHNpemUgPDwgMSkKKyAgICAgICAgICAgICAgICBtZXJnZShnYiwgb3V0ICsgdCwgaW4gKyB0LCBzaXplKTsKKyAgICAgICAgICAgIEZGU1dBUCh1aW50OF90KiwgaW4sIG91dCk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHRyZWUtPnN5bXMsIGluLCAxNik7CisgICAgfQorfQorCisvKioKKyAqIFByZXBhcmUgYnVuZGxlIGZvciBkZWNvZGluZyBkYXRhLgorICoKKyAqIEBwYXJhbSBnYiAgICAgICAgICBjb250ZXh0IGZvciByZWFkaW5nIGJpdHMKKyAqIEBwYXJhbSBjICAgICAgICAgICBkZWNvZGVyIGNvbnRleHQKKyAqIEBwYXJhbSBidW5kbGVfbnVtICBudW1iZXIgb2YgdGhlIGJ1bmRsZSB0byBpbml0aWFsaXplCisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfYnVuZGxlKEdldEJpdENvbnRleHQgKmdiLCBCaW5rQ29udGV4dCAqYywgaW50IGJ1bmRsZV9udW0pCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoYnVuZGxlX251bSA9PSBCSU5LX1NSQ19DT0xPUlMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICByZWFkX3RyZWUoZ2IsICZjLT5jb2xfaGlnaFtpXSk7CisgICAgICAgIGMtPmNvbF9sYXN0dmFsID0gMDsKKyAgICB9CisgICAgaWYgKGJ1bmRsZV9udW0gIT0gQklOS19TUkNfSU5UUkFfREMgJiYgYnVuZGxlX251bSAhPSBCSU5LX1NSQ19JTlRFUl9EQykKKyAgICAgICAgcmVhZF90cmVlKGdiLCAmYy0+YnVuZGxlW2J1bmRsZV9udW1dLnRyZWUpOworICAgIGMtPmJ1bmRsZVtidW5kbGVfbnVtXS5jdXJfZGVjID0KKyAgICBjLT5idW5kbGVbYnVuZGxlX251bV0uY3VyX3B0ciA9IGMtPmJ1bmRsZVtidW5kbGVfbnVtXS5kYXRhOworfQorCisvKioKKyAqIGNvbW1vbiBjaGVjayBiZWZvcmUgc3RhcnRpbmcgZGVjb2RpbmcgYnVuZGxlIGRhdGEKKyAqCisgKiBAcGFyYW0gZ2IgY29udGV4dCBmb3IgcmVhZGluZyBiaXRzCisgKiBAcGFyYW0gYiAgYnVuZGxlCisgKiBAcGFyYW0gdCAgdmFyaWFibGUgd2hlcmUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRlY29kZSB3aWxsIGJlIHN0b3JlZAorICovCisjZGVmaW5lIENIRUNLX1JFQURfVkFMKGdiLCBiLCB0KSBcCisgICAgaWYgKCFiLT5jdXJfZGVjIHx8IChiLT5jdXJfZGVjID4gYi0+Y3VyX3B0cikpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB0ID0gZ2V0X2JpdHMoZ2IsIGItPmxlbik7IFwKKyAgICBpZiAoIXQpIHsgXAorICAgICAgICBiLT5jdXJfZGVjID0gTlVMTDsgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAorCitzdGF0aWMgaW50IHJlYWRfcnVucyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEdldEJpdENvbnRleHQgKmdiLCBCdW5kbGUgKmIpCit7CisgICAgaW50IHQsIHY7CisgICAgY29uc3QgdWludDhfdCAqZGVjX2VuZDsKKworICAgIENIRUNLX1JFQURfVkFMKGdiLCBiLCB0KTsKKyAgICBkZWNfZW5kID0gYi0+Y3VyX2RlYyArIHQ7CisgICAgaWYgKGRlY19lbmQgPiBiLT5kYXRhX2VuZCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlJ1biB2YWx1ZSB3ZW50IG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgdiA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgbWVtc2V0KGItPmN1cl9kZWMsIHYsIHQpOworICAgICAgICBiLT5jdXJfZGVjICs9IHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKGItPmN1cl9kZWMgPCBkZWNfZW5kKQorICAgICAgICAgICAgKmItPmN1cl9kZWMrKyA9IEdFVF9IVUZGKGdiLCBiLT50cmVlKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9tb3Rpb25fdmFsdWVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IsIEJ1bmRsZSAqYikKK3sKKyAgICBpbnQgdCwgc2lnbiwgdjsKKyAgICBjb25zdCB1aW50OF90ICpkZWNfZW5kOworCisgICAgQ0hFQ0tfUkVBRF9WQUwoZ2IsIGIsIHQpOworICAgIGRlY19lbmQgPSBiLT5jdXJfZGVjICsgdDsKKyAgICBpZiAoZGVjX2VuZCA+IGItPmRhdGFfZW5kKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgbW90aW9uIHZhbHVlc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICB2ID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBpZiAodikgeworICAgICAgICAgICAgc2lnbiA9IC1nZXRfYml0czEoZ2IpOworICAgICAgICAgICAgdiA9ICh2IF4gc2lnbikgLSBzaWduOworICAgICAgICB9CisgICAgICAgIG1lbXNldChiLT5jdXJfZGVjLCB2LCB0KTsKKyAgICAgICAgYi0+Y3VyX2RlYyArPSB0OworICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChiLT5jdXJfZGVjIDwgZGVjX2VuZCkgeworICAgICAgICAgICAgdiA9IEdFVF9IVUZGKGdiLCBiLT50cmVlKTsKKyAgICAgICAgICAgIGlmICh2KSB7CisgICAgICAgICAgICAgICAgc2lnbiA9IC1nZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIHYgPSAodiBeIHNpZ24pIC0gc2lnbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpiLT5jdXJfZGVjKysgPSB2OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCBiaW5rX3JsZWxlbnNbNF0gPSB7IDQsIDgsIDEyLCAzMiB9OworCitzdGF0aWMgaW50IHJlYWRfYmxvY2tfdHlwZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYiwgQnVuZGxlICpiKQoreworICAgIGludCB0LCB2OworICAgIGludCBsYXN0ID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpkZWNfZW5kOworCisgICAgQ0hFQ0tfUkVBRF9WQUwoZ2IsIGIsIHQpOworICAgIGRlY19lbmQgPSBiLT5jdXJfZGVjICsgdDsKKyAgICBpZiAoZGVjX2VuZCA+IGItPmRhdGFfZW5kKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgYmxvY2sgdHlwZSB2YWx1ZXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgdiA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgbWVtc2V0KGItPmN1cl9kZWMsIHYsIHQpOworICAgICAgICBiLT5jdXJfZGVjICs9IHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKGItPmN1cl9kZWMgPCBkZWNfZW5kKSB7CisgICAgICAgICAgICB2ID0gR0VUX0hVRkYoZ2IsIGItPnRyZWUpOworICAgICAgICAgICAgaWYgKHYgPCAxMikgeworICAgICAgICAgICAgICAgIGxhc3QgPSB2OworICAgICAgICAgICAgICAgICpiLT5jdXJfZGVjKysgPSB2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcnVuID0gYmlua19ybGVsZW5zW3YgLSAxMl07CisKKyAgICAgICAgICAgICAgICBpZiAoZGVjX2VuZCAtIGItPmN1cl9kZWMgPCBydW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIG1lbXNldChiLT5jdXJfZGVjLCBsYXN0LCBydW4pOworICAgICAgICAgICAgICAgIGItPmN1cl9kZWMgKz0gcnVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfcGF0dGVybnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYiwgQnVuZGxlICpiKQoreworICAgIGludCB0LCB2OworICAgIGNvbnN0IHVpbnQ4X3QgKmRlY19lbmQ7CisKKyAgICBDSEVDS19SRUFEX1ZBTChnYiwgYiwgdCk7CisgICAgZGVjX2VuZCA9IGItPmN1cl9kZWMgKyB0OworICAgIGlmIChkZWNfZW5kID4gYi0+ZGF0YV9lbmQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBwYXR0ZXJuIHZhbHVlc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICB3aGlsZSAoYi0+Y3VyX2RlYyA8IGRlY19lbmQpIHsKKyAgICAgICAgdiAgPSBHRVRfSFVGRihnYiwgYi0+dHJlZSk7CisgICAgICAgIHYgfD0gR0VUX0hVRkYoZ2IsIGItPnRyZWUpIDw8IDQ7CisgICAgICAgICpiLT5jdXJfZGVjKysgPSB2OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfY29sb3JzKEdldEJpdENvbnRleHQgKmdiLCBCdW5kbGUgKmIsIEJpbmtDb250ZXh0ICpjKQoreworICAgIGludCB0LCBzaWduLCB2OworICAgIGNvbnN0IHVpbnQ4X3QgKmRlY19lbmQ7CisKKyAgICBDSEVDS19SRUFEX1ZBTChnYiwgYiwgdCk7CisgICAgZGVjX2VuZCA9IGItPmN1cl9kZWMgKyB0OworICAgIGlmIChkZWNfZW5kID4gYi0+ZGF0YV9lbmQpIHsKKyAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBjb2xvciB2YWx1ZXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgYy0+Y29sX2xhc3R2YWwgPSBHRVRfSFVGRihnYiwgYy0+Y29sX2hpZ2hbYy0+Y29sX2xhc3R2YWxdKTsKKyAgICAgICAgdiA9IEdFVF9IVUZGKGdiLCBiLT50cmVlKTsKKyAgICAgICAgdiA9IChjLT5jb2xfbGFzdHZhbCA8PCA0KSB8IHY7CisgICAgICAgIGlmIChjLT52ZXJzaW9uIDwgJ2knKSB7CisgICAgICAgICAgICBzaWduID0gKChpbnQ4X3QpIHYpID4+IDc7CisgICAgICAgICAgICB2ID0gKCh2ICYgMHg3RikgXiBzaWduKSAtIHNpZ247CisgICAgICAgICAgICB2ICs9IDB4ODA7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGItPmN1cl9kZWMsIHYsIHQpOworICAgICAgICBiLT5jdXJfZGVjICs9IHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKGItPmN1cl9kZWMgPCBkZWNfZW5kKSB7CisgICAgICAgICAgICBjLT5jb2xfbGFzdHZhbCA9IEdFVF9IVUZGKGdiLCBjLT5jb2xfaGlnaFtjLT5jb2xfbGFzdHZhbF0pOworICAgICAgICAgICAgdiA9IEdFVF9IVUZGKGdiLCBiLT50cmVlKTsKKyAgICAgICAgICAgIHYgPSAoYy0+Y29sX2xhc3R2YWwgPDwgNCkgfCB2OworICAgICAgICAgICAgaWYgKGMtPnZlcnNpb24gPCAnaScpIHsKKyAgICAgICAgICAgICAgICBzaWduID0gKChpbnQ4X3QpIHYpID4+IDc7CisgICAgICAgICAgICAgICAgdiA9ICgodiAmIDB4N0YpIF4gc2lnbikgLSBzaWduOworICAgICAgICAgICAgICAgIHYgKz0gMHg4MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpiLT5jdXJfZGVjKysgPSB2OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiogbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBzdG9yZSBmaXJzdCBEQyB2YWx1ZSBpbiBidW5kbGUgKi8KKyNkZWZpbmUgRENfU1RBUlRfQklUUyAxMQorCitzdGF0aWMgaW50IHJlYWRfZGNzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IsIEJ1bmRsZSAqYiwKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2JpdHMsIGludCBoYXNfc2lnbikKK3sKKyAgICBpbnQgaSwgaiwgbGVuLCBsZW4yLCBic2l6ZSwgc2lnbiwgdiwgdjI7CisgICAgaW50MTZfdCAqZHN0ICAgICA9IChpbnQxNl90KiliLT5jdXJfZGVjOworICAgIGludDE2X3QgKmRzdF9lbmQgPSAoaW50MTZfdCopYi0+ZGF0YV9lbmQ7CisKKyAgICBDSEVDS19SRUFEX1ZBTChnYiwgYiwgbGVuKTsKKyAgICB2ID0gZ2V0X2JpdHMoZ2IsIHN0YXJ0X2JpdHMgLSBoYXNfc2lnbik7CisgICAgaWYgKHYgJiYgaGFzX3NpZ24pIHsKKyAgICAgICAgc2lnbiA9IC1nZXRfYml0czEoZ2IpOworICAgICAgICB2ID0gKHYgXiBzaWduKSAtIHNpZ247CisgICAgfQorICAgIGlmIChkc3RfZW5kIC0gZHN0IDwgMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgKmRzdCsrID0gdjsKKyAgICBsZW4tLTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHsKKyAgICAgICAgbGVuMiA9IEZGTUlOKGxlbiAtIGksIDgpOworICAgICAgICBpZiAoZHN0X2VuZCAtIGRzdCA8IGxlbjIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgYnNpemUgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgIGlmIChic2l6ZSkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjI7IGorKykgeworICAgICAgICAgICAgICAgIHYyID0gZ2V0X2JpdHMoZ2IsIGJzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAodjIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9IC1nZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgICAgICB2MiA9ICh2MiBeIHNpZ24pIC0gc2lnbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdiArPSB2MjsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSB2OworICAgICAgICAgICAgICAgIGlmICh2IDwgLTMyNzY4IHx8IHYgPiAzMjc2NykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRDIHZhbHVlIHdlbnQgb3V0IG9mIGJvdW5kczogJWRcbiIsIHYpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuMjsgaisrKQorICAgICAgICAgICAgICAgICpkc3QrKyA9IHY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiLT5jdXJfZGVjID0gKHVpbnQ4X3QqKWRzdDsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSZXRyaWV2ZSBuZXh0IHZhbHVlIGZyb20gYnVuZGxlLgorICoKKyAqIEBwYXJhbSBjICAgICAgZGVjb2RlciBjb250ZXh0CisgKiBAcGFyYW0gYnVuZGxlIGJ1bmRsZSBudW1iZXIKKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3ZhbHVlKEJpbmtDb250ZXh0ICpjLCBpbnQgYnVuZGxlKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoYnVuZGxlIDwgQklOS19TUkNfWF9PRkYgfHwgYnVuZGxlID09IEJJTktfU1JDX1JVTikKKyAgICAgICAgcmV0dXJuICpjLT5idW5kbGVbYnVuZGxlXS5jdXJfcHRyKys7CisgICAgaWYgKGJ1bmRsZSA9PSBCSU5LX1NSQ19YX09GRiB8fCBidW5kbGUgPT0gQklOS19TUkNfWV9PRkYpCisgICAgICAgIHJldHVybiAoaW50OF90KSpjLT5idW5kbGVbYnVuZGxlXS5jdXJfcHRyKys7CisgICAgcmV0ID0gKihpbnQxNl90KiljLT5idW5kbGVbYnVuZGxlXS5jdXJfcHRyOworICAgIGMtPmJ1bmRsZVtidW5kbGVdLmN1cl9wdHIgKz0gMjsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGJpbmtiX2luaXRfYnVuZGxlKEJpbmtDb250ZXh0ICpjLCBpbnQgYnVuZGxlX251bSkKK3sKKyAgICBjLT5idW5kbGVbYnVuZGxlX251bV0uY3VyX2RlYyA9CisgICAgYy0+YnVuZGxlW2J1bmRsZV9udW1dLmN1cl9wdHIgPSBjLT5idW5kbGVbYnVuZGxlX251bV0uZGF0YTsKKyAgICBjLT5idW5kbGVbYnVuZGxlX251bV0ubGVuID0gMTM7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgYmlua2JfaW5pdF9idW5kbGVzKEJpbmtDb250ZXh0ICpjKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBCSU5LQl9OQl9TUkM7IGkrKykKKyAgICAgICAgYmlua2JfaW5pdF9idW5kbGUoYywgaSk7Cit9CisKK3N0YXRpYyBpbnQgYmlua2JfcmVhZF9idW5kbGUoQmlua0NvbnRleHQgKmMsIEdldEJpdENvbnRleHQgKmdiLCBpbnQgYnVuZGxlX251bSkKK3sKKyAgICBjb25zdCBpbnQgYml0cyA9IGJpbmtiX2J1bmRsZV9zaXplc1tidW5kbGVfbnVtXTsKKyAgICBjb25zdCBpbnQgbWFzayA9IDEgPDwgKGJpdHMgLSAxKTsKKyAgICBjb25zdCBpbnQgaXNzaWduZWQgPSBiaW5rYl9idW5kbGVfc2lnbmVkW2J1bmRsZV9udW1dOworICAgIEJ1bmRsZSAqYiA9ICZjLT5idW5kbGVbYnVuZGxlX251bV07CisgICAgaW50IGksIGxlbjsKKworICAgIENIRUNLX1JFQURfVkFMKGdiLCBiLCBsZW4pOworICAgIGlmIChiLT5kYXRhX2VuZCAtIGItPmN1cl9kZWMgPCBsZW4gKiAoMSArIChiaXRzID4gOCkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoYml0cyA8PSA4KSB7CisgICAgICAgIGlmICghaXNzaWduZWQpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgICAgICAqYi0+Y3VyX2RlYysrID0gZ2V0X2JpdHMoZ2IsIGJpdHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgICAgICpiLT5jdXJfZGVjKysgPSBnZXRfYml0cyhnYiwgYml0cykgLSBtYXNrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MTZfdCAqZHN0ID0gKGludDE2X3QqKWItPmN1cl9kZWM7CisKKyAgICAgICAgaWYgKCFpc3NpZ25lZCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgICAgICpkc3QrKyA9IGdldF9iaXRzKGdiLCBiaXRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBnZXRfYml0cyhnYiwgYml0cykgLSBtYXNrOworICAgICAgICB9CisgICAgICAgIGItPmN1cl9kZWMgPSAodWludDhfdCopZHN0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmlua2JfZ2V0X3ZhbHVlKEJpbmtDb250ZXh0ICpjLCBpbnQgYnVuZGxlX251bSkKK3sKKyAgICBpbnQxNl90IHJldDsKKyAgICBjb25zdCBpbnQgYml0cyA9IGJpbmtiX2J1bmRsZV9zaXplc1tidW5kbGVfbnVtXTsKKworICAgIGlmIChiaXRzIDw9IDgpIHsKKyAgICAgICAgaW50IHZhbCA9ICpjLT5idW5kbGVbYnVuZGxlX251bV0uY3VyX3B0cisrOworICAgICAgICByZXR1cm4gYmlua2JfYnVuZGxlX3NpZ25lZFtidW5kbGVfbnVtXSA/IChpbnQ4X3QpdmFsIDogdmFsOworICAgIH0KKyAgICByZXQgPSAqKGludDE2X3QqKWMtPmJ1bmRsZVtidW5kbGVfbnVtXS5jdXJfcHRyOworICAgIGMtPmJ1bmRsZVtidW5kbGVfbnVtXS5jdXJfcHRyICs9IDI7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBSZWFkIDh4OCBibG9jayBvZiBEQ1QgY29lZmZpY2llbnRzLgorICoKKyAqIEBwYXJhbSBnYiAgICAgICBjb250ZXh0IGZvciByZWFkaW5nIGJpdHMKKyAqIEBwYXJhbSBibG9jayAgICBwbGFjZSBmb3Igc3RvcmluZyBjb2VmZmljaWVudHMKKyAqIEBwYXJhbSBzY2FuICAgICBzY2FuIG9yZGVyIHRhYmxlCisgKiBAcGFyYW0gcXVhbnRfbWF0cmljZXMgcXVhbnRpemF0aW9uIG1hdHJpY2VzCisgKiBAcmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIGluIG90aGVyIGNhc2VzCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9kY3RfY29lZmZzKEdldEJpdENvbnRleHQgKmdiLCBpbnQzMl90IGJsb2NrWzY0XSwgY29uc3QgdWludDhfdCAqc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgcXVhbnRfbWF0cmljZXNbMTZdWzY0XSwgaW50IHEpCit7CisgICAgaW50IGNvZWZfbGlzdFsxMjhdOworICAgIGludCBtb2RlX2xpc3RbMTI4XTsKKyAgICBpbnQgaSwgdCwgYml0cywgY2NvZWYsIG1vZGUsIHNpZ247CisgICAgaW50IGxpc3Rfc3RhcnQgPSA2NCwgbGlzdF9lbmQgPSA2NCwgbGlzdF9wb3M7CisgICAgaW50IGNvZWZfY291bnQgPSAwOworICAgIGludCBjb2VmX2lkeFs2NF07CisgICAgaW50IHF1YW50X2lkeDsKKyAgICBjb25zdCBpbnQzMl90ICpxdWFudDsKKworICAgIGNvZWZfbGlzdFtsaXN0X2VuZF0gPSA0OyAgbW9kZV9saXN0W2xpc3RfZW5kKytdID0gMDsKKyAgICBjb2VmX2xpc3RbbGlzdF9lbmRdID0gMjQ7IG1vZGVfbGlzdFtsaXN0X2VuZCsrXSA9IDA7CisgICAgY29lZl9saXN0W2xpc3RfZW5kXSA9IDQ0OyBtb2RlX2xpc3RbbGlzdF9lbmQrK10gPSAwOworICAgIGNvZWZfbGlzdFtsaXN0X2VuZF0gPSAxOyAgbW9kZV9saXN0W2xpc3RfZW5kKytdID0gMzsKKyAgICBjb2VmX2xpc3RbbGlzdF9lbmRdID0gMjsgIG1vZGVfbGlzdFtsaXN0X2VuZCsrXSA9IDM7CisgICAgY29lZl9saXN0W2xpc3RfZW5kXSA9IDM7ICBtb2RlX2xpc3RbbGlzdF9lbmQrK10gPSAzOworCisgICAgZm9yIChiaXRzID0gZ2V0X2JpdHMoZ2IsIDQpIC0gMTsgYml0cyA+PSAwOyBiaXRzLS0pIHsKKyAgICAgICAgbGlzdF9wb3MgPSBsaXN0X3N0YXJ0OworICAgICAgICB3aGlsZSAobGlzdF9wb3MgPCBsaXN0X2VuZCkgeworICAgICAgICAgICAgaWYgKCEobW9kZV9saXN0W2xpc3RfcG9zXSB8IGNvZWZfbGlzdFtsaXN0X3Bvc10pIHx8ICFnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgbGlzdF9wb3MrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNjb2VmID0gY29lZl9saXN0W2xpc3RfcG9zXTsKKyAgICAgICAgICAgIG1vZGUgID0gbW9kZV9saXN0W2xpc3RfcG9zXTsKKyAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNvZWZfbGlzdFtsaXN0X3Bvc10gPSBjY29lZiArIDQ7CisgICAgICAgICAgICAgICAgbW9kZV9saXN0W2xpc3RfcG9zXSA9IDE7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBjb2VmX2xpc3RbbGlzdF9wb3NdICAgPSAwOworICAgICAgICAgICAgICAgICAgICBtb2RlX2xpc3RbbGlzdF9wb3MrK10gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBjY29lZisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX2xpc3RbLS1saXN0X3N0YXJ0XSA9IGNjb2VmOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9saXN0WyAgbGlzdF9zdGFydF0gPSAzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiaXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IDEgLSAoZ2V0X2JpdHMxKGdiKSA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGdldF9iaXRzKGdiLCBiaXRzKSB8IDEgPDwgYml0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gLWdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICh0IF4gc2lnbikgLSBzaWduOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbc2NhbltjY29lZl1dID0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZfaWR4W2NvZWZfY291bnQrK10gPSBjY29lZjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBtb2RlX2xpc3RbbGlzdF9wb3NdID0gMjsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNjb2VmICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGNvZWZfbGlzdFtsaXN0X2VuZF0gICA9IGNjb2VmOworICAgICAgICAgICAgICAgICAgICBtb2RlX2xpc3RbbGlzdF9lbmQrK10gPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBpZiAoIWJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdCA9IDEgLSAoZ2V0X2JpdHMxKGdiKSA8PCAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ID0gZ2V0X2JpdHMoZ2IsIGJpdHMpIHwgMSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICBzaWduID0gLWdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgICAgIHQgPSAodCBeIHNpZ24pIC0gc2lnbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmxvY2tbc2NhbltjY29lZl1dID0gdDsKKyAgICAgICAgICAgICAgICBjb2VmX2lkeFtjb2VmX2NvdW50KytdID0gY2NvZWY7CisgICAgICAgICAgICAgICAgY29lZl9saXN0W2xpc3RfcG9zXSAgID0gMDsKKyAgICAgICAgICAgICAgICBtb2RlX2xpc3RbbGlzdF9wb3MrK10gPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHEgPT0gLTEpIHsKKyAgICAgICAgcXVhbnRfaWR4ID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHF1YW50X2lkeCA9IHE7CisgICAgICAgIGlmIChxdWFudF9pZHggPiAxNVUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJxdWFudF9pbmRleCAlZCBvdXQgb2YgcmFuZ2VcbiIsIHF1YW50X2lkeCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHF1YW50ID0gcXVhbnRfbWF0cmljZXNbcXVhbnRfaWR4XTsKKworICAgIGJsb2NrWzBdID0gKGJsb2NrWzBdICogcXVhbnRbMF0pID4+IDExOworICAgIGZvciAoaSA9IDA7IGkgPCBjb2VmX2NvdW50OyBpKyspIHsKKyAgICAgICAgaW50IGlkeCA9IGNvZWZfaWR4W2ldOworICAgICAgICBibG9ja1tzY2FuW2lkeF1dID0gKGJsb2NrW3NjYW5baWR4XV0gKiBxdWFudFtpZHhdKSA+PiAxMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWFkIDh4OCBibG9jayB3aXRoIHJlc2lkdWUgYWZ0ZXIgbW90aW9uIGNvbXBlbnNhdGlvbi4KKyAqCisgKiBAcGFyYW0gZ2IgICAgICAgICAgY29udGV4dCBmb3IgcmVhZGluZyBiaXRzCisgKiBAcGFyYW0gYmxvY2sgICAgICAgcGxhY2UgdG8gc3RvcmUgcmVhZCBkYXRhCisgKiBAcGFyYW0gbWFza3NfY291bnQgbnVtYmVyIG9mIG1hc2tzIHRvIGRlY29kZQorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIGluIG90aGVyIGNhc2VzCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9yZXNpZHVlKEdldEJpdENvbnRleHQgKmdiLCBpbnQxNl90IGJsb2NrWzY0XSwgaW50IG1hc2tzX2NvdW50KQoreworICAgIGludCBjb2VmX2xpc3RbMTI4XTsKKyAgICBpbnQgbW9kZV9saXN0WzEyOF07CisgICAgaW50IGksIHNpZ24sIG1hc2ssIGNjb2VmLCBtb2RlOworICAgIGludCBsaXN0X3N0YXJ0ID0gNjQsIGxpc3RfZW5kID0gNjQsIGxpc3RfcG9zOworICAgIGludCBuel9jb2VmZls2NF07CisgICAgaW50IG56X2NvZWZmX2NvdW50ID0gMDsKKworICAgIGNvZWZfbGlzdFtsaXN0X2VuZF0gPSAgNDsgbW9kZV9saXN0W2xpc3RfZW5kKytdID0gMDsKKyAgICBjb2VmX2xpc3RbbGlzdF9lbmRdID0gMjQ7IG1vZGVfbGlzdFtsaXN0X2VuZCsrXSA9IDA7CisgICAgY29lZl9saXN0W2xpc3RfZW5kXSA9IDQ0OyBtb2RlX2xpc3RbbGlzdF9lbmQrK10gPSAwOworICAgIGNvZWZfbGlzdFtsaXN0X2VuZF0gPSAgMDsgbW9kZV9saXN0W2xpc3RfZW5kKytdID0gMjsKKworICAgIGZvciAobWFzayA9IDEgPDwgZ2V0X2JpdHMoZ2IsIDMpOyBtYXNrOyBtYXNrID4+PSAxKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuel9jb2VmZl9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWdldF9iaXRzMShnYikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoYmxvY2tbbnpfY29lZmZbaV1dIDwgMCkKKyAgICAgICAgICAgICAgICBibG9ja1tuel9jb2VmZltpXV0gLT0gbWFzazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBibG9ja1tuel9jb2VmZltpXV0gKz0gbWFzazsKKyAgICAgICAgICAgIG1hc2tzX2NvdW50LS07CisgICAgICAgICAgICBpZiAobWFza3NfY291bnQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGxpc3RfcG9zID0gbGlzdF9zdGFydDsKKyAgICAgICAgd2hpbGUgKGxpc3RfcG9zIDwgbGlzdF9lbmQpIHsKKyAgICAgICAgICAgIGlmICghKGNvZWZfbGlzdFtsaXN0X3Bvc10gfCBtb2RlX2xpc3RbbGlzdF9wb3NdKSB8fCAhZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgICAgIGxpc3RfcG9zKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjY29lZiA9IGNvZWZfbGlzdFtsaXN0X3Bvc107CisgICAgICAgICAgICBtb2RlICA9IG1vZGVfbGlzdFtsaXN0X3Bvc107CisgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBjb2VmX2xpc3RbbGlzdF9wb3NdID0gY2NvZWYgKyA0OworICAgICAgICAgICAgICAgIG1vZGVfbGlzdFtsaXN0X3Bvc10gPSAxOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmIChtb2RlID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29lZl9saXN0W2xpc3RfcG9zXSAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbW9kZV9saXN0W2xpc3RfcG9zKytdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgY2NvZWYrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29lZl9saXN0Wy0tbGlzdF9zdGFydF0gPSBjY29lZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfbGlzdFsgIGxpc3Rfc3RhcnRdID0gMzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG56X2NvZWZmW256X2NvZWZmX2NvdW50KytdID0gYmlua19zY2FuW2Njb2VmXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAtZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW2Jpbmtfc2NhbltjY29lZl1dID0gKG1hc2sgXiBzaWduKSAtIHNpZ247CisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrc19jb3VudC0tOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2tzX2NvdW50IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBtb2RlX2xpc3RbbGlzdF9wb3NdID0gMjsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNjb2VmICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGNvZWZfbGlzdFtsaXN0X2VuZF0gICA9IGNjb2VmOworICAgICAgICAgICAgICAgICAgICBtb2RlX2xpc3RbbGlzdF9lbmQrK10gPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBuel9jb2VmZltuel9jb2VmZl9jb3VudCsrXSA9IGJpbmtfc2NhbltjY29lZl07CisgICAgICAgICAgICAgICAgc2lnbiA9IC1nZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIGJsb2NrW2Jpbmtfc2NhbltjY29lZl1dID0gKG1hc2sgXiBzaWduKSAtIHNpZ247CisgICAgICAgICAgICAgICAgY29lZl9saXN0W2xpc3RfcG9zXSAgID0gMDsKKyAgICAgICAgICAgICAgICBtb2RlX2xpc3RbbGlzdF9wb3MrK10gPSAwOworICAgICAgICAgICAgICAgIG1hc2tzX2NvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKG1hc2tzX2NvdW50IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDb3B5IDh4OCBibG9jayBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiwgd2hlcmUgc3JjIGFuZCBkc3QgbWF5IGJlIG92ZXJsYXBwZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHB1dF9waXhlbHM4eDhfb3ZlcmxhcHBlZCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKK3sKKyAgICB1aW50OF90IHRtcFs2NF07CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgbWVtY3B5KHRtcCArIGkqOCwgc3JjICsgaSpzdHJpZGUsIDgpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIG1lbWNweShkc3QgKyBpKnN0cmlkZSwgdG1wICsgaSo4LCA4KTsKK30KKworc3RhdGljIGludCBiaW5rYl9kZWNvZGVfcGxhbmUoQmlua0NvbnRleHQgKmMsIEFWRnJhbWUgKmZyYW1lLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGFuZV9pZHgsIGludCBpc19rZXksIGludCBpc19jaHJvbWEpCit7CisgICAgaW50IGJsaywgcmV0OworICAgIGludCBpLCBqLCBieCwgYnk7CisgICAgdWludDhfdCAqZHN0LCAqcmVmLCAqcmVmX3N0YXJ0LCAqcmVmX2VuZDsKKyAgICBpbnQgdiwgY29sWzJdOworICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW47CisgICAgaW50IHhvZmYsIHlvZmY7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBibG9jaywgWzY0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQzMl90LCBkY3RibG9jaywgWzY0XSk7CisgICAgaW50IGNvb3JkbWFwWzY0XTsKKyAgICBpbnQgeWJpYXMgPSBpc19rZXkgPyAtMTUgOiAwOworICAgIGludCBxcDsKKworICAgIGNvbnN0IGludCBzdHJpZGUgPSBmcmFtZS0+bGluZXNpemVbcGxhbmVfaWR4XTsKKyAgICBpbnQgYncgPSBpc19jaHJvbWEgPyAoYy0+YXZjdHgtPndpZHRoICArIDE1KSA+PiA0IDogKGMtPmF2Y3R4LT53aWR0aCAgKyA3KSA+PiAzOworICAgIGludCBiaCA9IGlzX2Nocm9tYSA/IChjLT5hdmN0eC0+aGVpZ2h0ICsgMTUpID4+IDQgOiAoYy0+YXZjdHgtPmhlaWdodCArIDcpID4+IDM7CisKKyAgICBiaW5rYl9pbml0X2J1bmRsZXMoYyk7CisgICAgcmVmX3N0YXJ0ID0gZnJhbWUtPmRhdGFbcGxhbmVfaWR4XTsKKyAgICByZWZfZW5kICAgPSBmcmFtZS0+ZGF0YVtwbGFuZV9pZHhdICsgKGJoICogZnJhbWUtPmxpbmVzaXplW3BsYW5lX2lkeF0gKyBidykgKiA4OworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgIGNvb3JkbWFwW2ldID0gKGkgJiA3KSArIChpID4+IDMpICogc3RyaWRlOworCisgICAgZm9yIChieSA9IDA7IGJ5IDwgYmg7IGJ5KyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEJJTktCX05CX1NSQzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGJpbmtiX3JlYWRfYnVuZGxlKGMsIGdiLCBpKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBkc3QgID0gZnJhbWUtPmRhdGFbcGxhbmVfaWR4XSAgKyA4KmJ5KnN0cmlkZTsKKyAgICAgICAgZm9yIChieCA9IDA7IGJ4IDwgYnc7IGJ4KyssIGRzdCArPSA4KSB7CisgICAgICAgICAgICBibGsgPSBiaW5rYl9nZXRfdmFsdWUoYywgQklOS0JfU1JDX0JMT0NLX1RZUEVTKTsKKyAgICAgICAgICAgIHN3aXRjaCAoYmxrKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgc2NhbiA9IGJpbmtfcGF0dGVybnNbZ2V0X2JpdHMoZ2IsIDQpXTsKKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLCBydW47CisKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgICAgIHJ1biA9IGdldF9iaXRzKGdiLCBiaW5rYl9ydW5iaXRzW2ldKSArIDE7CisKKyAgICAgICAgICAgICAgICAgICAgaSArPSBydW47CisgICAgICAgICAgICAgICAgICAgIGlmIChpID4gNjQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUnVuIHdlbnQgb3V0IG9mIGJvdW5kc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGJpbmtiX2dldF92YWx1ZShjLCBCSU5LQl9TUkNfQ09MT1JTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBydW47IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbY29vcmRtYXBbKnNjYW4rK11dID0gdjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBydW47IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbY29vcmRtYXBbKnNjYW4rK11dID0gYmlua2JfZ2V0X3ZhbHVlKGMsIEJJTktCX1NSQ19DT0xPUlMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoaSA8IDYzKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSA2MykKKyAgICAgICAgICAgICAgICAgICAgZHN0W2Nvb3JkbWFwWypzY2FuKytdXSA9IGJpbmtiX2dldF92YWx1ZShjLCBCSU5LQl9TUkNfQ09MT1JTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBtZW1zZXQoZGN0YmxvY2ssIDAsIHNpemVvZigqZGN0YmxvY2spICogNjQpOworICAgICAgICAgICAgICAgIGRjdGJsb2NrWzBdID0gYmlua2JfZ2V0X3ZhbHVlKGMsIEJJTktCX1NSQ19JTlRSQV9EQyk7CisgICAgICAgICAgICAgICAgcXAgPSBiaW5rYl9nZXRfdmFsdWUoYywgQklOS0JfU1JDX0lOVFJBX1EpOworICAgICAgICAgICAgICAgIHJlYWRfZGN0X2NvZWZmcyhnYiwgZGN0YmxvY2ssIGJpbmtfc2NhbiwgKGNvbnN0IGludDMyX3QgKCopWzY0XSliaW5rYl9pbnRyYV9xdWFudCwgcXApOworICAgICAgICAgICAgICAgIGMtPmJpbmtkc3AuaWRjdF9wdXQoZHN0LCBzdHJpZGUsIGRjdGJsb2NrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICB4b2ZmID0gYmlua2JfZ2V0X3ZhbHVlKGMsIEJJTktCX1NSQ19YX09GRik7CisgICAgICAgICAgICAgICAgeW9mZiA9IGJpbmtiX2dldF92YWx1ZShjLCBCSU5LQl9TUkNfWV9PRkYpICsgeWJpYXM7CisgICAgICAgICAgICAgICAgcmVmID0gZHN0ICsgeG9mZiArIHlvZmYgKiBzdHJpZGU7CisgICAgICAgICAgICAgICAgaWYgKHJlZiA8IHJlZl9zdGFydCB8fCByZWYgKyA4KnN0cmlkZSA+IHJlZl9lbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlJlZmVyZW5jZSBibG9jayBpcyBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZiArIDgqc3RyaWRlIDwgZHN0IHx8IHJlZiA+PSBkc3QgKyA4KnN0cmlkZSkgeworICAgICAgICAgICAgICAgICAgICBjLT5oZHNwLnB1dF9waXhlbHNfdGFiWzFdWzBdKGRzdCwgcmVmLCBzdHJpZGUsIDgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9waXhlbHM4eDhfb3ZlcmxhcHBlZChkc3QsIHJlZiwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYy0+YmRzcC5jbGVhcl9ibG9jayhibG9jayk7CisgICAgICAgICAgICAgICAgdiA9IGJpbmtiX2dldF92YWx1ZShjLCBCSU5LQl9TUkNfSU5URVJfQ09FRlMpOworICAgICAgICAgICAgICAgIHJlYWRfcmVzaWR1ZShnYiwgYmxvY2ssIHYpOworICAgICAgICAgICAgICAgIGMtPmJpbmtkc3AuYWRkX3BpeGVsczgoZHN0LCBibG9jaywgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICB4b2ZmID0gYmlua2JfZ2V0X3ZhbHVlKGMsIEJJTktCX1NSQ19YX09GRik7CisgICAgICAgICAgICAgICAgeW9mZiA9IGJpbmtiX2dldF92YWx1ZShjLCBCSU5LQl9TUkNfWV9PRkYpICsgeWJpYXM7CisgICAgICAgICAgICAgICAgcmVmID0gZHN0ICsgeG9mZiArIHlvZmYgKiBzdHJpZGU7CisgICAgICAgICAgICAgICAgaWYgKHJlZiA8IHJlZl9zdGFydCB8fCByZWYgKyA4ICogc3RyaWRlID4gcmVmX2VuZCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiUmVmZXJlbmNlIGJsb2NrIGlzIG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVmICsgOCpzdHJpZGUgPCBkc3QgfHwgcmVmID49IGRzdCArIDgqc3RyaWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGMtPmhkc3AucHV0X3BpeGVsc190YWJbMV1bMF0oZHN0LCByZWYsIHN0cmlkZSwgOCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3BpeGVsczh4OF9vdmVybGFwcGVkKGRzdCwgcmVmLCBzdHJpZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1zZXQoZGN0YmxvY2ssIDAsIHNpemVvZigqZGN0YmxvY2spICogNjQpOworICAgICAgICAgICAgICAgIGRjdGJsb2NrWzBdID0gYmlua2JfZ2V0X3ZhbHVlKGMsIEJJTktCX1NSQ19JTlRFUl9EQyk7CisgICAgICAgICAgICAgICAgcXAgPSBiaW5rYl9nZXRfdmFsdWUoYywgQklOS0JfU1JDX0lOVEVSX1EpOworICAgICAgICAgICAgICAgIHJlYWRfZGN0X2NvZWZmcyhnYiwgZGN0YmxvY2ssIGJpbmtfc2NhbiwgKGNvbnN0IGludDMyX3QgKCopWzY0XSliaW5rYl9pbnRlcl9xdWFudCwgcXApOworICAgICAgICAgICAgICAgIGMtPmJpbmtkc3AuaWRjdF9hZGQoZHN0LCBzdHJpZGUsIGRjdGJsb2NrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICB2ID0gYmlua2JfZ2V0X3ZhbHVlKGMsIEJJTktCX1NSQ19DT0xPUlMpOworICAgICAgICAgICAgICAgIGMtPmJkc3AuZmlsbF9ibG9ja190YWJbMV0oZHN0LCB2LCBzdHJpZGUsIDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGNvbFtpXSA9IGJpbmtiX2dldF92YWx1ZShjLCBCSU5LQl9TUkNfQ09MT1JTKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBiaW5rYl9nZXRfdmFsdWUoYywgQklOS0JfU1JDX1BBVFRFUk4pOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrLCB2ID4+PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0W2kqc3RyaWRlICsgal0gPSBjb2xbdiAmIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICB4b2ZmID0gYmlua2JfZ2V0X3ZhbHVlKGMsIEJJTktCX1NSQ19YX09GRik7CisgICAgICAgICAgICAgICAgeW9mZiA9IGJpbmtiX2dldF92YWx1ZShjLCBCSU5LQl9TUkNfWV9PRkYpICsgeWJpYXM7CisgICAgICAgICAgICAgICAgcmVmID0gZHN0ICsgeG9mZiArIHlvZmYgKiBzdHJpZGU7CisgICAgICAgICAgICAgICAgaWYgKHJlZiA8IHJlZl9zdGFydCB8fCByZWYgKyA4ICogc3RyaWRlID4gcmVmX2VuZCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiUmVmZXJlbmNlIGJsb2NrIGlzIG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVmICsgOCpzdHJpZGUgPCBkc3QgfHwgcmVmID49IGRzdCArIDgqc3RyaWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGMtPmhkc3AucHV0X3BpeGVsc190YWJbMV1bMF0oZHN0LCByZWYsIHN0cmlkZSwgOCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3BpeGVsczh4OF9vdmVybGFwcGVkKGRzdCwgcmVmLCBzdHJpZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0ICsgaSpzdHJpZGUsIGMtPmJ1bmRsZVtCSU5LQl9TUkNfQ09MT1JTXS5jdXJfcHRyICsgaSo4LCA4KTsKKyAgICAgICAgICAgICAgICBjLT5idW5kbGVbQklOS0JfU1JDX0NPTE9SU10uY3VyX3B0ciArPSA2NDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGJsb2NrIHR5cGUgJWRcbiIsIGJsayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGdldF9iaXRzX2NvdW50KGdiKSAmIDB4MUYpIC8vbmV4dCBwbGFuZSBkYXRhIHN0YXJ0cyBhdCAzMi1iaXQgYm91bmRhcnkKKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDMyIC0gKGdldF9iaXRzX2NvdW50KGdiKSAmIDB4MUYpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJpbmtfZGVjb2RlX3BsYW5lKEJpbmtDb250ZXh0ICpjLCBBVkZyYW1lICpmcmFtZSwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGFuZV9pZHgsIGludCBpc19jaHJvbWEpCit7CisgICAgaW50IGJsaywgcmV0OworICAgIGludCBpLCBqLCBieCwgYnk7CisgICAgdWludDhfdCAqZHN0LCAqcHJldiwgKnJlZiwgKnJlZl9zdGFydCwgKnJlZl9lbmQ7CisgICAgaW50IHYsIGNvbFsyXTsKKyAgICBjb25zdCB1aW50OF90ICpzY2FuOworICAgIGludCB4b2ZmLCB5b2ZmOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgYmxvY2ssIFs2NF0pOworICAgIExPQ0FMX0FMSUdORURfMTYodWludDhfdCwgdWJsb2NrLCBbNjRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDMyX3QsIGRjdGJsb2NrLCBbNjRdKTsKKyAgICBpbnQgY29vcmRtYXBbNjRdOworCisgICAgY29uc3QgaW50IHN0cmlkZSA9IGZyYW1lLT5saW5lc2l6ZVtwbGFuZV9pZHhdOworICAgIGludCBidyA9IGlzX2Nocm9tYSA/IChjLT5hdmN0eC0+d2lkdGggICsgMTUpID4+IDQgOiAoYy0+YXZjdHgtPndpZHRoICArIDcpID4+IDM7CisgICAgaW50IGJoID0gaXNfY2hyb21hID8gKGMtPmF2Y3R4LT5oZWlnaHQgKyAxNSkgPj4gNCA6IChjLT5hdmN0eC0+aGVpZ2h0ICsgNykgPj4gMzsKKyAgICBpbnQgd2lkdGggPSBjLT5hdmN0eC0+d2lkdGggPj4gaXNfY2hyb21hOworCisgICAgaW5pdF9sZW5ndGhzKGMsIEZGTUFYKHdpZHRoLCA4KSwgYncpOworICAgIGZvciAoaSA9IDA7IGkgPCBCSU5LX05CX1NSQzsgaSsrKQorICAgICAgICByZWFkX2J1bmRsZShnYiwgYywgaSk7CisKKyAgICByZWZfc3RhcnQgPSBjLT5sYXN0LT5kYXRhW3BsYW5lX2lkeF0gPyBjLT5sYXN0LT5kYXRhW3BsYW5lX2lkeF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmcmFtZS0+ZGF0YVtwbGFuZV9pZHhdOworICAgIHJlZl9lbmQgICA9IHJlZl9zdGFydAorICAgICAgICAgICAgICAgICsgKGJ3IC0gMSArIGMtPmxhc3QtPmxpbmVzaXplW3BsYW5lX2lkeF0gKiAoYmggLSAxKSkgKiA4OworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgIGNvb3JkbWFwW2ldID0gKGkgJiA3KSArIChpID4+IDMpICogc3RyaWRlOworCisgICAgZm9yIChieSA9IDA7IGJ5IDwgYmg7IGJ5KyspIHsKKyAgICAgICAgaWYgKChyZXQgPSByZWFkX2Jsb2NrX3R5cGVzKGMtPmF2Y3R4LCBnYiwgJmMtPmJ1bmRsZVtCSU5LX1NSQ19CTE9DS19UWVBFU10pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IHJlYWRfYmxvY2tfdHlwZXMoYy0+YXZjdHgsIGdiLCAmYy0+YnVuZGxlW0JJTktfU1JDX1NVQl9CTE9DS19UWVBFU10pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IHJlYWRfY29sb3JzKGdiLCAmYy0+YnVuZGxlW0JJTktfU1JDX0NPTE9SU10sIGMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IHJlYWRfcGF0dGVybnMoYy0+YXZjdHgsIGdiLCAmYy0+YnVuZGxlW0JJTktfU1JDX1BBVFRFUk5dKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKChyZXQgPSByZWFkX21vdGlvbl92YWx1ZXMoYy0+YXZjdHgsIGdiLCAmYy0+YnVuZGxlW0JJTktfU1JDX1hfT0ZGXSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmICgocmV0ID0gcmVhZF9tb3Rpb25fdmFsdWVzKGMtPmF2Y3R4LCBnYiwgJmMtPmJ1bmRsZVtCSU5LX1NSQ19ZX09GRl0pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IHJlYWRfZGNzKGMtPmF2Y3R4LCBnYiwgJmMtPmJ1bmRsZVtCSU5LX1NSQ19JTlRSQV9EQ10sIERDX1NUQVJUX0JJVFMsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IHJlYWRfZGNzKGMtPmF2Y3R4LCBnYiwgJmMtPmJ1bmRsZVtCSU5LX1NSQ19JTlRFUl9EQ10sIERDX1NUQVJUX0JJVFMsIDEpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IHJlYWRfcnVucyhjLT5hdmN0eCwgZ2IsICZjLT5idW5kbGVbQklOS19TUkNfUlVOXSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKGJ5ID09IGJoKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRzdCAgPSBmcmFtZS0+ZGF0YVtwbGFuZV9pZHhdICArIDgqYnkqc3RyaWRlOworICAgICAgICBwcmV2ID0gKGMtPmxhc3QtPmRhdGFbcGxhbmVfaWR4XSA/IGMtPmxhc3QtPmRhdGFbcGxhbmVfaWR4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZyYW1lLT5kYXRhW3BsYW5lX2lkeF0pICsgOCpieSpzdHJpZGU7CisgICAgICAgIGZvciAoYnggPSAwOyBieCA8IGJ3OyBieCsrLCBkc3QgKz0gOCwgcHJldiArPSA4KSB7CisgICAgICAgICAgICBibGsgPSBnZXRfdmFsdWUoYywgQklOS19TUkNfQkxPQ0tfVFlQRVMpOworICAgICAgICAgICAgLy8gMTZ4MTYgYmxvY2sgdHlwZSBvbiBvZGQgbGluZSBtZWFucyBwYXJ0IG9mIHRoZSBhbHJlYWR5IGRlY29kZWQgYmxvY2ssIHNvIHNraXAgaXQKKyAgICAgICAgICAgIGlmICgoYnkgJiAxKSAmJiBibGsgPT0gU0NBTEVEX0JMT0NLKSB7CisgICAgICAgICAgICAgICAgYngrKzsKKyAgICAgICAgICAgICAgICBkc3QgICs9IDg7CisgICAgICAgICAgICAgICAgcHJldiArPSA4OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChibGspIHsKKyAgICAgICAgICAgIGNhc2UgU0tJUF9CTE9DSzoKKyAgICAgICAgICAgICAgICBjLT5oZHNwLnB1dF9waXhlbHNfdGFiWzFdWzBdKGRzdCwgcHJldiwgc3RyaWRlLCA4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0NBTEVEX0JMT0NLOgorICAgICAgICAgICAgICAgIGJsayA9IGdldF92YWx1ZShjLCBCSU5LX1NSQ19TVUJfQkxPQ0tfVFlQRVMpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYmxrKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSVU5fQkxPQ0s6CisgICAgICAgICAgICAgICAgICAgIHNjYW4gPSBiaW5rX3BhdHRlcm5zW2dldF9iaXRzKGdiLCA0KV07CisgICAgICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVuID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX1JVTikgKyAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IHJ1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gNjQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlJ1biB3ZW50IG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX0NPTE9SUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJ1bjsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1YmxvY2tbKnNjYW4rK10gPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcnVuOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVibG9ja1sqc2NhbisrXSA9IGdldF92YWx1ZShjLCBCSU5LX1NSQ19DT0xPUlMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgNjMpOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSA2MykKKyAgICAgICAgICAgICAgICAgICAgICAgIHVibG9ja1sqc2NhbisrXSA9IGdldF92YWx1ZShjLCBCSU5LX1NSQ19DT0xPUlMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOVFJBX0JMT0NLOgorICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZGN0YmxvY2ssIDAsIHNpemVvZigqZGN0YmxvY2spICogNjQpOworICAgICAgICAgICAgICAgICAgICBkY3RibG9ja1swXSA9IGdldF92YWx1ZShjLCBCSU5LX1NSQ19JTlRSQV9EQyk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRfZGN0X2NvZWZmcyhnYiwgZGN0YmxvY2ssIGJpbmtfc2NhbiwgYmlua19pbnRyYV9xdWFudCwgLTEpOworICAgICAgICAgICAgICAgICAgICBjLT5iaW5rZHNwLmlkY3RfcHV0KHVibG9jaywgOCwgZGN0YmxvY2spOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZJTExfQkxPQ0s6CisgICAgICAgICAgICAgICAgICAgIHYgPSBnZXRfdmFsdWUoYywgQklOS19TUkNfQ09MT1JTKTsKKyAgICAgICAgICAgICAgICAgICAgYy0+YmRzcC5maWxsX2Jsb2NrX3RhYlswXShkc3QsIHYsIHN0cmlkZSwgMTYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBBVFRFUk5fQkxPQ0s6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xbaV0gPSBnZXRfdmFsdWUoYywgQklOS19TUkNfQ09MT1JTKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdldF92YWx1ZShjLCBCSU5LX1NSQ19QQVRURVJOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHYgPj49IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWJsb2NrW2kgKyBqKjhdID0gY29sW3YgJiAxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJBV19CTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWJsb2NrW2kgKyBqKjhdID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX0NPTE9SUyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IDE2eDE2IGJsb2NrIHR5cGUgJWRcbiIsIGJsayk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYmxrICE9IEZJTExfQkxPQ0spCisgICAgICAgICAgICAgICAgYy0+Ymlua2RzcC5zY2FsZV9ibG9jayh1YmxvY2ssIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICBieCsrOworICAgICAgICAgICAgICAgIGRzdCAgKz0gODsKKyAgICAgICAgICAgICAgICBwcmV2ICs9IDg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1PVElPTl9CTE9DSzoKKyAgICAgICAgICAgICAgICB4b2ZmID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX1hfT0ZGKTsKKyAgICAgICAgICAgICAgICB5b2ZmID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX1lfT0ZGKTsKKyAgICAgICAgICAgICAgICByZWYgPSBwcmV2ICsgeG9mZiArIHlvZmYgKiBzdHJpZGU7CisgICAgICAgICAgICAgICAgaWYgKHJlZiA8IHJlZl9zdGFydCB8fCByZWYgPiByZWZfZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29weSBvdXQgb2YgYm91bmRzIEAlZCwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBieCo4ICsgeG9mZiwgYnkqOCArIHlvZmYpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYy0+aGRzcC5wdXRfcGl4ZWxzX3RhYlsxXVswXShkc3QsIHJlZiwgc3RyaWRlLCA4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlVOX0JMT0NLOgorICAgICAgICAgICAgICAgIHNjYW4gPSBiaW5rX3BhdHRlcm5zW2dldF9iaXRzKGdiLCA0KV07CisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBpbnQgcnVuID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX1JVTikgKyAxOworCisgICAgICAgICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDY0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlJ1biB3ZW50IG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnZXRfdmFsdWUoYywgQklOS19TUkNfQ09MT1JTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBydW47IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbY29vcmRtYXBbKnNjYW4rK11dID0gdjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBydW47IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbY29vcmRtYXBbKnNjYW4rK11dID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX0NPTE9SUyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgNjMpOworICAgICAgICAgICAgICAgIGlmIChpID09IDYzKQorICAgICAgICAgICAgICAgICAgICBkc3RbY29vcmRtYXBbKnNjYW4rK11dID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX0NPTE9SUyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJFU0lEVUVfQkxPQ0s6CisgICAgICAgICAgICAgICAgeG9mZiA9IGdldF92YWx1ZShjLCBCSU5LX1NSQ19YX09GRik7CisgICAgICAgICAgICAgICAgeW9mZiA9IGdldF92YWx1ZShjLCBCSU5LX1NSQ19ZX09GRik7CisgICAgICAgICAgICAgICAgcmVmID0gcHJldiArIHhvZmYgKyB5b2ZmICogc3RyaWRlOworICAgICAgICAgICAgICAgIGlmIChyZWYgPCByZWZfc3RhcnQgfHwgcmVmID4gcmVmX2VuZCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvcHkgb3V0IG9mIGJvdW5kcyBAJWQsICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYngqOCArIHhvZmYsIGJ5KjggKyB5b2ZmKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGMtPmhkc3AucHV0X3BpeGVsc190YWJbMV1bMF0oZHN0LCByZWYsIHN0cmlkZSwgOCk7CisgICAgICAgICAgICAgICAgYy0+YmRzcC5jbGVhcl9ibG9jayhibG9jayk7CisgICAgICAgICAgICAgICAgdiA9IGdldF9iaXRzKGdiLCA3KTsKKyAgICAgICAgICAgICAgICByZWFkX3Jlc2lkdWUoZ2IsIGJsb2NrLCB2KTsKKyAgICAgICAgICAgICAgICBjLT5iaW5rZHNwLmFkZF9waXhlbHM4KGRzdCwgYmxvY2ssIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOVFJBX0JMT0NLOgorICAgICAgICAgICAgICAgIG1lbXNldChkY3RibG9jaywgMCwgc2l6ZW9mKCpkY3RibG9jaykgKiA2NCk7CisgICAgICAgICAgICAgICAgZGN0YmxvY2tbMF0gPSBnZXRfdmFsdWUoYywgQklOS19TUkNfSU5UUkFfREMpOworICAgICAgICAgICAgICAgIHJlYWRfZGN0X2NvZWZmcyhnYiwgZGN0YmxvY2ssIGJpbmtfc2NhbiwgYmlua19pbnRyYV9xdWFudCwgLTEpOworICAgICAgICAgICAgICAgIGMtPmJpbmtkc3AuaWRjdF9wdXQoZHN0LCBzdHJpZGUsIGRjdGJsb2NrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRklMTF9CTE9DSzoKKyAgICAgICAgICAgICAgICB2ID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX0NPTE9SUyk7CisgICAgICAgICAgICAgICAgYy0+YmRzcC5maWxsX2Jsb2NrX3RhYlsxXShkc3QsIHYsIHN0cmlkZSwgOCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOVEVSX0JMT0NLOgorICAgICAgICAgICAgICAgIHhvZmYgPSBnZXRfdmFsdWUoYywgQklOS19TUkNfWF9PRkYpOworICAgICAgICAgICAgICAgIHlvZmYgPSBnZXRfdmFsdWUoYywgQklOS19TUkNfWV9PRkYpOworICAgICAgICAgICAgICAgIHJlZiA9IHByZXYgKyB4b2ZmICsgeW9mZiAqIHN0cmlkZTsKKyAgICAgICAgICAgICAgICBpZiAocmVmIDwgcmVmX3N0YXJ0IHx8IHJlZiA+IHJlZl9lbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3B5IG91dCBvZiBib3VuZHMgQCVkLCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ4KjggKyB4b2ZmLCBieSo4ICsgeW9mZik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYy0+aGRzcC5wdXRfcGl4ZWxzX3RhYlsxXVswXShkc3QsIHJlZiwgc3RyaWRlLCA4KTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoZGN0YmxvY2ssIDAsIHNpemVvZigqZGN0YmxvY2spICogNjQpOworICAgICAgICAgICAgICAgIGRjdGJsb2NrWzBdID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX0lOVEVSX0RDKTsKKyAgICAgICAgICAgICAgICByZWFkX2RjdF9jb2VmZnMoZ2IsIGRjdGJsb2NrLCBiaW5rX3NjYW4sIGJpbmtfaW50ZXJfcXVhbnQsIC0xKTsKKyAgICAgICAgICAgICAgICBjLT5iaW5rZHNwLmlkY3RfYWRkKGRzdCwgc3RyaWRlLCBkY3RibG9jayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBBVFRFUk5fQkxPQ0s6CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgY29sW2ldID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX0NPTE9SUyk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0X3ZhbHVlKGMsIEJJTktfU1JDX1BBVFRFUk4pOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrLCB2ID4+PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0W2kqc3RyaWRlICsgal0gPSBjb2xbdiAmIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkFXX0JMT0NLOgorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QgKyBpKnN0cmlkZSwgYy0+YnVuZGxlW0JJTktfU1JDX0NPTE9SU10uY3VyX3B0ciArIGkqOCwgOCk7CisgICAgICAgICAgICAgICAgYy0+YnVuZGxlW0JJTktfU1JDX0NPTE9SU10uY3VyX3B0ciArPSA2NDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGJsb2NrIHR5cGUgJWRcbiIsIGJsayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGdldF9iaXRzX2NvdW50KGdiKSAmIDB4MUYpIC8vbmV4dCBwbGFuZSBkYXRhIHN0YXJ0cyBhdCAzMi1iaXQgYm91bmRhcnkKKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDMyIC0gKGdldF9iaXRzX2NvdW50KGdiKSAmIDB4MUYpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqcGt0KQoreworICAgIEJpbmtDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IHBsYW5lLCBwbGFuZV9pZHgsIHJldDsKKyAgICBpbnQgYml0c19jb3VudCA9IHBrdC0+c2l6ZSA8PCAzOworCisgICAgaWYgKGMtPnZlcnNpb24gPiAnYicpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIGMtPmxhc3QpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihmcmFtZSwgYy0+bGFzdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIHBrdC0+ZGF0YSwgYml0c19jb3VudCk7CisgICAgaWYgKGMtPmhhc19hbHBoYSkgeworICAgICAgICBpZiAoYy0+dmVyc2lvbiA+PSAnaScpCisgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDMyKTsKKyAgICAgICAgaWYgKChyZXQgPSBiaW5rX2RlY29kZV9wbGFuZShjLCBmcmFtZSwgJmdiLCAzLCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKGMtPnZlcnNpb24gPj0gJ2knKQorICAgICAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDMyKTsKKworICAgIGMtPmZyYW1lX251bSsrOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMzsgcGxhbmUrKykgeworICAgICAgICBwbGFuZV9pZHggPSAoIXBsYW5lIHx8ICFjLT5zd2FwX3BsYW5lcykgPyBwbGFuZSA6IChwbGFuZSBeIDMpOworCisgICAgICAgIGlmIChjLT52ZXJzaW9uID4gJ2InKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGJpbmtfZGVjb2RlX3BsYW5lKGMsIGZyYW1lLCAmZ2IsIHBsYW5lX2lkeCwgISFwbGFuZSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChyZXQgPSBiaW5rYl9kZWNvZGVfcGxhbmUoYywgZnJhbWUsICZnYiwgcGxhbmVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZnJhbWVfbnVtID09IDEsICEhcGxhbmUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0X2JpdHNfY291bnQoJmdiKSA+PSBiaXRzX2NvdW50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGVtbXNfYygpOworCisgICAgaWYgKGMtPnZlcnNpb24gPiAnYicpIHsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoYy0+bGFzdCk7CisgICAgICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGMtPmxhc3QsIGZyYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIC8qIGFsd2F5cyByZXBvcnQgdGhhdCB0aGUgYnVmZmVyIHdhcyBjb21wbGV0ZWx5IGNvbnN1bWVkICovCisgICAgcmV0dXJuIHBrdC0+c2l6ZTsKK30KKworLyoqCisgKiBDYWNsdWxhdGUgcXVhbnRpemF0aW9uIHRhYmxlcyBmb3IgdmVyc2lvbiBiCisgKi8KK3N0YXRpYyBhdl9jb2xkIHZvaWQgYmlua2JfY2FsY19xdWFudCh2b2lkKQoreworICAgIHVpbnQ4X3QgaW52X2Jpbmtfc2Nhbls2NF07CisgICAgc3RhdGljIGNvbnN0IGludCBzWzY0XT17CisgICAgICAgIDEwNzM3NDE4MjQsMTQ4OTMyMjY5MywxNDAyOTExMzAxLDEyNjI1ODY4MTQsMTA3Mzc0MTgyNCwgODQzNjMzNTM4LCA1ODExMDQ4ODgsIDI5NjI0NDcwMywKKyAgICAgICAgMTQ4OTMyMjY5MywyMDY1NzQ5OTE4LDE5NDU4OTM4NzQsMTc1MTI1ODIxOSwxNDg5MzIyNjkzLDExNzAxNTMzMzIsIDgwNjAxNTYzNCwgNDEwOTAzMjA3LAorICAgICAgICAxNDAyOTExMzAxLDE5NDU4OTM4NzQsMTgzMjk5MTk0OSwxNjQ5NjQ5MTcxLDE0MDI5MTEzMDEsMTEwMjI2MDMzNiwgNzU5MjUwMTI1LCAzODcwNjIzNTcsCisgICAgICAgIDEyNjI1ODY4MTQsMTc1MTI1ODIxOSwxNjQ5NjQ5MTcxLDE0ODQ2NDUwMzEsMTI2MjU4NjgxNCwgOTkyMDA4MDk0LCA2ODMzMDcwNjAsIDM0ODM0NjkxOCwKKyAgICAgICAgMTA3Mzc0MTgyNCwxNDg5MzIyNjkzLDE0MDI5MTEzMDEsMTI2MjU4NjgxNCwxMDczNzQxODI0LCA4NDM2MzM1MzgsIDU4MTEwNDg4OCwgMjk2MjQ0NzAzLAorICAgICAgICAgODQzNjMzNTM4LDExNzAxNTMzMzIsMTEwMjI2MDMzNiwgOTkyMDA4MDk0LCA4NDM2MzM1MzgsIDY2MjgzODYxNywgNDU2NTcxMTgxLCAyMzI3NTc5NjksCisgICAgICAgICA1ODExMDQ4ODgsIDgwNjAxNTYzNCwgNzU5MjUwMTI1LCA2ODMzMDcwNjAsIDU4MTEwNDg4OCwgNDU2NTcxMTgxLCAzMTQ0OTE2OTksIDE2MDMyNjQ3OCwKKyAgICAgICAgIDI5NjI0NDcwMywgNDEwOTAzMjA3LCAzODcwNjIzNTcsIDM0ODM0NjkxOCwgMjk2MjQ0NzAzLCAyMzI3NTc5NjksIDE2MDMyNjQ3OCwgIDgxNzMzNzMwLAorICAgIH07CisgICAgaW50IGksIGo7CisjZGVmaW5lIEMgKDFMTDw8MzApCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgIGludl9iaW5rX3NjYW5bYmlua19zY2FuW2ldXSA9IGk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgaW50IGsgPSBpbnZfYmlua19zY2FuW2ldOworICAgICAgICAgICAgYmlua2JfaW50cmFfcXVhbnRbal1ba10gPSBiaW5rYl9pbnRyYV9zZWVkW2ldICogKGludDY0X3Qpc1tpXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlua2JfbnVtW2pdLyhiaW5rYl9kZW5bal0gKiAoQz4+MTIpKTsKKyAgICAgICAgICAgIGJpbmtiX2ludGVyX3F1YW50W2pdW2tdID0gYmlua2JfaW50ZXJfc2VlZFtpXSAqIChpbnQ2NF90KXNbaV0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmtiX251bVtqXS8oYmlua2JfZGVuW2pdICogKEM+PjEyKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQmlua0NvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdGF0aWMgVkxDX1RZUEUgdGFibGVbMTYgKiAxMjhdWzJdOworICAgIHN0YXRpYyBpbnQgYmlua2JfaW5pdGlhbGlzZWQgPSAwOworICAgIGludCBpLCByZXQ7CisgICAgaW50IGZsYWdzOworCisgICAgYy0+dmVyc2lvbiA9IGF2Y3R4LT5jb2RlY190YWcgPj4gMjQ7CisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFeHRyYWRhdGEgbWlzc2luZyBvciB0b28gc2hvcnRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZmxhZ3MgPSBBVl9STDMyKGF2Y3R4LT5leHRyYWRhdGEpOworICAgIGMtPmhhc19hbHBoYSA9IGZsYWdzICYgQklOS19GTEFHX0FMUEhBOworICAgIGMtPnN3YXBfcGxhbmVzID0gYy0+dmVyc2lvbiA+PSAnaCc7CisgICAgaWYgKCFiaW5rX3RyZWVzWzE1XS50YWJsZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgY29uc3QgaW50IG1heGJpdHMgPSBiaW5rX3RyZWVfbGVuc1tpXVsxNV07CisgICAgICAgICAgICBiaW5rX3RyZWVzW2ldLnRhYmxlID0gdGFibGUgKyBpKjEyODsKKyAgICAgICAgICAgIGJpbmtfdHJlZXNbaV0udGFibGVfYWxsb2NhdGVkID0gMSA8PCBtYXhiaXRzOworICAgICAgICAgICAgaW5pdF92bGMoJmJpbmtfdHJlZXNbaV0sIG1heGJpdHMsIDE2LAorICAgICAgICAgICAgICAgICAgICAgYmlua190cmVlX2xlbnNbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICBiaW5rX3RyZWVfYml0c1tpXSwgMSwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMgfCBJTklUX1ZMQ19MRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYy0+YXZjdHggPSBhdmN0eDsKKworICAgIGMtPmxhc3QgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYy0+bGFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIDAsIGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBjLT5oYXNfYWxwaGEgPyBBVl9QSVhfRk1UX1lVVkE0MjBQIDogQVZfUElYX0ZNVF9ZVVY0MjBQOworCisgICAgZmZfYmxvY2tkc3BfaW5pdCgmYy0+YmRzcCwgYXZjdHgpOworICAgIGZmX2hwZWxkc3BfaW5pdCgmYy0+aGRzcCwgYXZjdHgtPmZsYWdzKTsKKyAgICBmZl9iaW5rZHNwX2luaXQoJmMtPmJpbmtkc3ApOworCisgICAgaWYgKChyZXQgPSBpbml0X2J1bmRsZXMoYykpIDwgMCkgeworICAgICAgICBmcmVlX2J1bmRsZXMoYyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGMtPnZlcnNpb24gPT0gJ2InKSB7CisgICAgICAgIGlmICghYmlua2JfaW5pdGlhbGlzZWQpIHsKKyAgICAgICAgICAgIGJpbmtiX2NhbGNfcXVhbnQoKTsKKyAgICAgICAgICAgIGJpbmtiX2luaXRpYWxpc2VkID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQmlua0NvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmMtPmxhc3QpOworCisgICAgZnJlZV9idW5kbGVzKGMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQmlua0NvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGMtPmZyYW1lX251bSA9IDA7Cit9CisKK0FWQ29kZWMgZmZfYmlua19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJiaW5rdmlkZW8iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCaW5rIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0JJTktWSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQmlua0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYmlua2F1ZGlvLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9iaW5rYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjRlZTdlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYmlua2F1ZGlvLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBCaW5rIEF1ZGlvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDExIFBldGVyIFJvc3MgKHByb3NzQHh2aWQub3JnKQorICogQ29weXJpZ2h0IChjKSAyMDA5IERhbmllbCBWZXJrYW1wIChkYW5pZWxAZHJ2Lm51KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBCaW5rIEF1ZGlvIGRlY29kZXIKKyAqCisgKiBUZWNobmljYWwgZGV0YWlscyBoZXJlOgorICogIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPUJpbmtfQXVkaW8KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJkY3QuaCIKKyNpbmNsdWRlICJyZGZ0LmgiCisjaW5jbHVkZSAiZm10Y29udmVydC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAid21hX2ZyZXFzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGZsb2F0LmgiCisKK3N0YXRpYyBmbG9hdCBxdWFudF90YWJsZVs5Nl07CisKKyNkZWZpbmUgTUFYX0NIQU5ORUxTIDIKKyNkZWZpbmUgQklOS19CTE9DS19NQVhfU0laRSAoTUFYX0NIQU5ORUxTIDw8IDExKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgdmVyc2lvbl9iOyAgICAgICAgICAvLy88IEJpbmsgdmVyc2lvbiAnYicKKyAgICBpbnQgZmlyc3Q7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBmcmFtZV9sZW47ICAgICAgICAgIC8vLzwgdHJhbnNmb3JtIHNpemUgKHNhbXBsZXMpCisgICAgaW50IG92ZXJsYXBfbGVuOyAgICAgICAgLy8vPCBvdmVybGFwIHNpemUgKHNhbXBsZXMpCisgICAgaW50IGJsb2NrX3NpemU7CisgICAgaW50IG51bV9iYW5kczsKKyAgICB1bnNpZ25lZCBpbnQgKmJhbmRzOworICAgIGZsb2F0IHJvb3Q7CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBGRlRTYW1wbGUsIGNvZWZmcylbQklOS19CTE9DS19NQVhfU0laRV07CisgICAgZmxvYXQgcHJldmlvdXNbTUFYX0NIQU5ORUxTXVtCSU5LX0JMT0NLX01BWF9TSVpFIC8gMTZdOyAgLy8vPCBjb2VmZnMgZnJvbSBwcmV2aW91cyBhdWRpbyBibG9jaworICAgIHVpbnQ4X3QgKnBhY2tldF9idWZmZXI7CisgICAgdW5pb24geworICAgICAgICBSREZUQ29udGV4dCByZGZ0OworICAgICAgICBEQ1RDb250ZXh0IGRjdDsKKyAgICB9IHRyYW5zOworfSBCaW5rQXVkaW9Db250ZXh0OworCisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQmlua0F1ZGlvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHNhbXBsZV9yYXRlID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIGludCBzYW1wbGVfcmF0ZV9oYWxmOworICAgIGludCBpOworICAgIGludCBmcmFtZV9sZW5fYml0czsKKworICAgIC8qIGRldGVybWluZSBmcmFtZSBsZW5ndGggKi8KKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlIDwgMjIwNTApIHsKKyAgICAgICAgZnJhbWVfbGVuX2JpdHMgPSA5OworICAgIH0gZWxzZSBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlIDwgNDQxMDApIHsKKyAgICAgICAgZnJhbWVfbGVuX2JpdHMgPSAxMDsKKyAgICB9IGVsc2UgeworICAgICAgICBmcmFtZV9sZW5fYml0cyA9IDExOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPCAxIHx8IGF2Y3R4LT5jaGFubmVscyA+IE1BWF9DSEFOTkVMUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAlZFxuIiwgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGF2Y3R4LT5jaGFubmVscyA9PSAxID8gQVZfQ0hfTEFZT1VUX01PTk8gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTzsKKworICAgIHMtPnZlcnNpb25fYiA9IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSA0ICYmIGF2Y3R4LT5leHRyYWRhdGFbM10gPT0gJ2InOworCisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfQklOS0FVRElPX1JERlQpIHsKKyAgICAgICAgLy8gYXVkaW8gaXMgYWxyZWFkeSBpbnRlcmxlYXZlZCBmb3IgdGhlIFJERlQgZm9ybWF0IHZhcmlhbnQKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX0ZMVDsKKyAgICAgICAgc2FtcGxlX3JhdGUgICo9IGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgcy0+Y2hhbm5lbHMgPSAxOworICAgICAgICBpZiAoIXMtPnZlcnNpb25fYikKKyAgICAgICAgICAgIGZyYW1lX2xlbl9iaXRzICs9IGF2X2xvZzIoYXZjdHgtPmNoYW5uZWxzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5jaGFubmVscyA9IGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX0ZMVFA7CisgICAgfQorCisgICAgcy0+ZnJhbWVfbGVuICAgICA9IDEgPDwgZnJhbWVfbGVuX2JpdHM7CisgICAgcy0+b3ZlcmxhcF9sZW4gICA9IHMtPmZyYW1lX2xlbiAvIDE2OworICAgIHMtPmJsb2NrX3NpemUgICAgPSAocy0+ZnJhbWVfbGVuIC0gcy0+b3ZlcmxhcF9sZW4pICogcy0+Y2hhbm5lbHM7CisgICAgc2FtcGxlX3JhdGVfaGFsZiA9IChzYW1wbGVfcmF0ZSArIDEpIC8gMjsKKyAgICBpZiAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9CSU5LQVVESU9fUkRGVCkKKyAgICAgICAgcy0+cm9vdCA9IDIuMCAvIChzcXJ0KHMtPmZyYW1lX2xlbikgKiAzMjc2OC4wKTsKKyAgICBlbHNlCisgICAgICAgIHMtPnJvb3QgPSBzLT5mcmFtZV9sZW4gLyAoc3FydChzLT5mcmFtZV9sZW4pICogMzI3NjguMCk7CisgICAgZm9yIChpID0gMDsgaSA8IDk2OyBpKyspIHsKKyAgICAgICAgLyogY29uc3RhbnQgaXMgcmVzdWx0IG9mIDAuMDY2Mzk5OTk5L2xvZzEwKE1fRSkgKi8KKyAgICAgICAgcXVhbnRfdGFibGVbaV0gPSBleHBmKGkgKiAwLjE1Mjg5MTY0Nzg3MjIxOTUzODIzZikgKiBzLT5yb290OworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmFuZHMgKi8KKyAgICBmb3IgKHMtPm51bV9iYW5kcyA9IDE7IHMtPm51bV9iYW5kcyA8IDI1OyBzLT5udW1fYmFuZHMrKykKKyAgICAgICAgaWYgKHNhbXBsZV9yYXRlX2hhbGYgPD0gZmZfd21hX2NyaXRpY2FsX2ZyZXFzW3MtPm51bV9iYW5kcyAtIDFdKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBzLT5iYW5kcyA9IGF2X21hbGxvYygocy0+bnVtX2JhbmRzICsgMSkgKiBzaXplb2YoKnMtPmJhbmRzKSk7CisgICAgaWYgKCFzLT5iYW5kcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8qIHBvcHVsYXRlIGJhbmRzIGRhdGEgKi8KKyAgICBzLT5iYW5kc1swXSA9IDI7CisgICAgZm9yIChpID0gMTsgaSA8IHMtPm51bV9iYW5kczsgaSsrKQorICAgICAgICBzLT5iYW5kc1tpXSA9IChmZl93bWFfY3JpdGljYWxfZnJlcXNbaSAtIDFdICogcy0+ZnJhbWVfbGVuIC8gc2FtcGxlX3JhdGVfaGFsZikgJiB+MTsKKyAgICBzLT5iYW5kc1tzLT5udW1fYmFuZHNdID0gcy0+ZnJhbWVfbGVuOworCisgICAgcy0+Zmlyc3QgPSAxOworCisgICAgaWYgKENPTkZJR19CSU5LQVVESU9fUkRGVF9ERUNPREVSICYmIGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfQklOS0FVRElPX1JERlQpCisgICAgICAgIGZmX3JkZnRfaW5pdCgmcy0+dHJhbnMucmRmdCwgZnJhbWVfbGVuX2JpdHMsIERGVF9DMlIpOworICAgIGVsc2UgaWYgKENPTkZJR19CSU5LQVVESU9fRENUX0RFQ09ERVIpCisgICAgICAgIGZmX2RjdF9pbml0KCZzLT50cmFucy5kY3QsIGZyYW1lX2xlbl9iaXRzLCBEQ1RfSUlJKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgZmxvYXQgZ2V0X2Zsb2F0KEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBwb3dlciA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICBmbG9hdCBmID0gbGRleHBmKGdldF9iaXRzX2xvbmcoZ2IsIDIzKSwgcG93ZXIgLSAyMyk7CisgICAgaWYgKGdldF9iaXRzMShnYikpCisgICAgICAgIGYgPSAtZjsKKyAgICByZXR1cm4gZjsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmxlX2xlbmd0aF90YWJbMTZdID0geworICAgIDIsIDMsIDQsIDUsIDYsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAzMiwgNjQKK307CisKKy8qKgorICogRGVjb2RlIEJpbmsgQXVkaW8gYmxvY2sKKyAqIEBwYXJhbVtvdXRdIG91dCBPdXRwdXQgYnVmZmVyIChtdXN0IGNvbnRhaW4gcy0+YmxvY2tfc2l6ZSBlbGVtZW50cykKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBkZWNvZGVfYmxvY2soQmlua0F1ZGlvQ29udGV4dCAqcywgZmxvYXQgKipvdXQsIGludCB1c2VfZGN0KQoreworICAgIGludCBjaCwgaSwgaiwgazsKKyAgICBmbG9hdCBxLCBxdWFudFsyNV07CisgICAgaW50IHdpZHRoLCBjb2VmZjsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKworICAgIGlmICh1c2VfZGN0KQorICAgICAgICBza2lwX2JpdHMoZ2IsIDIpOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgRkZUU2FtcGxlICpjb2VmZnMgPSBvdXRbY2hdOworCisgICAgICAgIGlmIChzLT52ZXJzaW9uX2IpIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDY0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgY29lZmZzWzBdID0gYXZfaW50MmZsb2F0KGdldF9iaXRzX2xvbmcoZ2IsIDMyKSkgKiBzLT5yb290OworICAgICAgICAgICAgY29lZmZzWzFdID0gYXZfaW50MmZsb2F0KGdldF9iaXRzX2xvbmcoZ2IsIDMyKSkgKiBzLT5yb290OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgNTgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBjb2VmZnNbMF0gPSBnZXRfZmxvYXQoZ2IpICogcy0+cm9vdDsKKyAgICAgICAgICAgIGNvZWZmc1sxXSA9IGdldF9mbG9hdChnYikgKiBzLT5yb290OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgcy0+bnVtX2JhbmRzICogOCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX2JhbmRzOyBpKyspIHsKKyAgICAgICAgICAgIGludCB2YWx1ZSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIHF1YW50W2ldICA9IHF1YW50X3RhYmxlW0ZGTUlOKHZhbHVlLCA5NSldOworICAgICAgICB9CisKKyAgICAgICAgayA9IDA7CisgICAgICAgIHEgPSBxdWFudFswXTsKKworICAgICAgICAvLyBwYXJzZSBjb2VmZmljaWVudHMKKyAgICAgICAgaSA9IDI7CisgICAgICAgIHdoaWxlIChpIDwgcy0+ZnJhbWVfbGVuKSB7CisgICAgICAgICAgICBpZiAocy0+dmVyc2lvbl9iKSB7CisgICAgICAgICAgICAgICAgaiA9IGkgKyAxNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHYgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIGlmICh2KSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgICAgICAgICAgICAgIGogPSBpICsgcmxlX2xlbmd0aF90YWJbdl0gKiA4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGogPSBpICsgODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGogPSBGRk1JTihqLCBzLT5mcmFtZV9sZW4pOworCisgICAgICAgICAgICB3aWR0aCA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgICAgIGlmICh3aWR0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KGNvZWZmcyArIGksIDAsIChqIC0gaSkgKiBzaXplb2YoKmNvZWZmcykpOworICAgICAgICAgICAgICAgIGkgPSBqOworICAgICAgICAgICAgICAgIHdoaWxlIChzLT5iYW5kc1trXSA8IGkpCisgICAgICAgICAgICAgICAgICAgIHEgPSBxdWFudFtrKytdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGopIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmJhbmRzW2tdID09IGkpCisgICAgICAgICAgICAgICAgICAgICAgICBxID0gcXVhbnRbaysrXTsKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgPSBnZXRfYml0cyhnYiwgd2lkdGgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29lZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2OworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZnNbaV0gPSAtcSAqIGNvZWZmOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmc1tpXSA9ICBxICogY29lZmY7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZnNbaV0gPSAwLjBmOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoQ09ORklHX0JJTktBVURJT19EQ1RfREVDT0RFUiAmJiB1c2VfZGN0KSB7CisgICAgICAgICAgICBjb2VmZnNbMF0gLz0gMC41OworICAgICAgICAgICAgcy0+dHJhbnMuZGN0LmRjdF9jYWxjKCZzLT50cmFucy5kY3QsICBjb2VmZnMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKENPTkZJR19CSU5LQVVESU9fUkRGVF9ERUNPREVSKQorICAgICAgICAgICAgcy0+dHJhbnMucmRmdC5yZGZ0X2NhbGMoJnMtPnRyYW5zLnJkZnQsIGNvZWZmcyk7CisgICAgfQorCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGludCBjb3VudCA9IHMtPm92ZXJsYXBfbGVuICogcy0+Y2hhbm5lbHM7CisgICAgICAgIGlmICghcy0+Zmlyc3QpIHsKKyAgICAgICAgICAgIGogPSBjaDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5vdmVybGFwX2xlbjsgaSsrLCBqICs9IHMtPmNoYW5uZWxzKQorICAgICAgICAgICAgICAgIG91dFtjaF1baV0gPSAocy0+cHJldmlvdXNbY2hdW2ldICogKGNvdW50IC0gaikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbY2hdW2ldICogICAgICAgICAgaikgLyBjb3VudDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocy0+cHJldmlvdXNbY2hdLCAmb3V0W2NoXVtzLT5mcmFtZV9sZW4gLSBzLT5vdmVybGFwX2xlbl0sCisgICAgICAgICAgICAgICBzLT5vdmVybGFwX2xlbiAqIHNpemVvZigqcy0+cHJldmlvdXNbY2hdKSk7CisgICAgfQorCisgICAgcy0+Zmlyc3QgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBCaW5rQXVkaW9Db250ZXh0ICogcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYXZfZnJlZXAoJnMtPmJhbmRzKTsKKyAgICBhdl9mcmVlcCgmcy0+cGFja2V0X2J1ZmZlcik7CisgICAgaWYgKENPTkZJR19CSU5LQVVESU9fUkRGVF9ERUNPREVSICYmIGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfQklOS0FVRElPX1JERlQpCisgICAgICAgIGZmX3JkZnRfZW5kKCZzLT50cmFucy5yZGZ0KTsKKyAgICBlbHNlIGlmIChDT05GSUdfQklOS0FVRElPX0RDVF9ERUNPREVSKQorICAgICAgICBmZl9kY3RfZW5kKCZzLT50cmFucy5kY3QpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9iaXRzX2FsaWduMzIoR2V0Qml0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgbiA9ICgtZ2V0X2JpdHNfY291bnQocykpICYgMzE7CisgICAgaWYgKG4pIHNraXBfYml0cyhzLCBuKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQmlua0F1ZGlvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgICA9IGRhdGE7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+Z2I7CisgICAgaW50IHJldCwgY29uc3VtZWQgPSAwOworCisgICAgaWYgKCFnZXRfYml0c19sZWZ0KGdiKSkgeworICAgICAgICB1aW50OF90ICpidWY7CisgICAgICAgIC8qIGhhbmRsZSBlbmQtb2Ytc3RyZWFtICovCisgICAgICAgIGlmICghYXZwa3QtPnNpemUpIHsKKyAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChhdnBrdC0+c2l6ZSA8IDQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGlzIHRvbyBzbWFsbFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBidWYgPSBhdl9yZWFsbG9jKHMtPnBhY2tldF9idWZmZXIsIGF2cGt0LT5zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIGlmICghYnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtc2V0KGJ1ZiArIGF2cGt0LT5zaXplLCAwLCBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgcy0+cGFja2V0X2J1ZmZlciA9IGJ1ZjsKKyAgICAgICAgbWVtY3B5KHMtPnBhY2tldF9idWZmZXIsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisgICAgICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoZ2IsIHMtPnBhY2tldF9idWZmZXIsIGF2cGt0LT5zaXplKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgY29uc3VtZWQgPSBhdnBrdC0+c2l6ZTsKKworICAgICAgICAvKiBza2lwIHJlcG9ydGVkIHNpemUgKi8KKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDMyKTsKKyAgICB9CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gcy0+ZnJhbWVfbGVuOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoZGVjb2RlX2Jsb2NrKHMsIChmbG9hdCAqKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfQklOS0FVRElPX0RDVCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvbXBsZXRlIHBhY2tldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBnZXRfYml0c19hbGlnbjMyKGdiKTsKKworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gcy0+YmxvY2tfc2l6ZSAvIGF2Y3R4LT5jaGFubmVsczsKKyAgICAqZ290X2ZyYW1lX3B0ciAgICA9IDE7CisKKyAgICByZXR1cm4gY29uc3VtZWQ7Cit9CisKK0FWQ29kZWMgZmZfYmlua2F1ZGlvX3JkZnRfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYmlua2F1ZGlvX3JkZnQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCaW5rIEF1ZGlvIChSREZUKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9CSU5LQVVESU9fUkRGVCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQmlua0F1ZGlvQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RFTEFZIHwgQ09ERUNfQ0FQX0RSMSwKK307CisKK0FWQ29kZWMgZmZfYmlua2F1ZGlvX2RjdF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJiaW5rYXVkaW9fZGN0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQmluayBBdWRpbyAoRENUKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9CSU5LQVVESU9fRENULAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihCaW5rQXVkaW9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfREVMQVkgfCBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2JpbmtkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9iaW5rZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NjE5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9iaW5rZGF0YS5oCkBAIC0wLDAgKzEsNjU1IEBACisvKgorICogQmluayB2aWRlbyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQklOS0RBVEFfSAorI2RlZmluZSBBVkNPREVDX0JJTktEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiogQmluayBEQ1QgYW5kIHJlc2lkdWUgOHg4IGJsb2NrIHNjYW4gb3JkZXIgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGJpbmtfc2Nhbls2NF0gPSB7CisgICAgIDAsICAxLCAgOCwgIDksICAyLCAgMywgMTAsIDExLAorICAgICA0LCAgNSwgMTIsIDEzLCAgNiwgIDcsIDE0LCAxNSwKKyAgICAyMCwgMjEsIDI4LCAyOSwgMjIsIDIzLCAzMCwgMzEsCisgICAgMTYsIDE3LCAyNCwgMjUsIDMyLCAzMywgNDAsIDQxLAorICAgIDM0LCAzNSwgNDIsIDQzLCA0OCwgNDksIDU2LCA1NywKKyAgICA1MCwgNTEsIDU4LCA1OSwgMTgsIDE5LCAyNiwgMjcsCisgICAgMzYsIDM3LCA0NCwgNDUsIDM4LCAzOSwgNDYsIDQ3LAorICAgIDUyLCA1MywgNjAsIDYxLCA1NCwgNTUsIDYyLCA2MworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmlua190cmVlX2JpdHNbMTZdWzE2XSA9IHsKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgICAgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDksIDB4MEIsIDB4MEQsCisgICAgICAgIDB4MEYsIDB4MTMsIDB4MTUsIDB4MTcsIDB4MTksIDB4MUIsIDB4MUQsIDB4MUYsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDksIDB4MDUsIDB4MTUsIDB4MEQsIDB4MUQsCisgICAgICAgIDB4MDMsIDB4MTMsIDB4MEIsIDB4MUIsIDB4MDcsIDB4MTcsIDB4MEYsIDB4MUYsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDIsIDB4MDYsIDB4MDEsIDB4MDksIDB4MDUsIDB4MEQsIDB4MUQsCisgICAgICAgIDB4MDMsIDB4MTMsIDB4MEIsIDB4MUIsIDB4MDcsIDB4MTcsIDB4MEYsIDB4MUYsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDQsIDB4MDIsIDB4MDYsIDB4MDEsIDB4MDksIDB4MDUsIDB4MEQsCisgICAgICAgIDB4MDMsIDB4MTMsIDB4MEIsIDB4MUIsIDB4MDcsIDB4MTcsIDB4MEYsIDB4MUYsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDQsIDB4MDIsIDB4MEEsIDB4MDYsIDB4MEUsIDB4MDEsIDB4MDksCisgICAgICAgIDB4MDUsIDB4MEQsIDB4MDMsIDB4MEIsIDB4MDcsIDB4MTcsIDB4MEYsIDB4MUYsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDIsIDB4MEEsIDB4MDYsIDB4MEUsIDB4MDEsIDB4MDksIDB4MDUsCisgICAgICAgIDB4MEQsIDB4MDMsIDB4MEIsIDB4MUIsIDB4MDcsIDB4MTcsIDB4MEYsIDB4MUYsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDEsIDB4MDUsIDB4MDMsIDB4MTMsIDB4MEIsIDB4MUIsIDB4M0IsCisgICAgICAgIDB4MDcsIDB4MjcsIDB4MTcsIDB4MzcsIDB4MEYsIDB4MkYsIDB4MUYsIDB4M0YsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDEsIDB4MDMsIDB4MTMsIDB4MEIsIDB4MkIsIDB4MUIsIDB4M0IsCisgICAgICAgIDB4MDcsIDB4MjcsIDB4MTcsIDB4MzcsIDB4MEYsIDB4MkYsIDB4MUYsIDB4M0YsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDEsIDB4MDUsIDB4MEQsIDB4MDMsIDB4MTMsIDB4MEIsIDB4MUIsCisgICAgICAgIDB4MDcsIDB4MjcsIDB4MTcsIDB4MzcsIDB4MEYsIDB4MkYsIDB4MUYsIDB4M0YsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDUsIDB4MEQsIDB4MDMsIDB4MTMsIDB4MEIsCisgICAgICAgIDB4MUIsIDB4MDcsIDB4MTcsIDB4MzcsIDB4MEYsIDB4MkYsIDB4MUYsIDB4M0YsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDEsIDB4MDksIDB4MDUsIDB4MEQsIDB4MDMsIDB4MTMsIDB4MEIsCisgICAgICAgIDB4MUIsIDB4MDcsIDB4MTcsIDB4MzcsIDB4MEYsIDB4MkYsIDB4MUYsIDB4M0YsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDMsIDB4MTMsIDB4MEIsIDB4MUIsIDB4M0IsCisgICAgICAgIDB4MDcsIDB4MjcsIDB4MTcsIDB4MzcsIDB4MEYsIDB4MkYsIDB4MUYsIDB4M0YsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDEsIDB4MDUsIDB4MDMsIDB4MDcsIDB4MjcsIDB4MTcsIDB4MzcsCisgICAgICAgIDB4MEYsIDB4NEYsIDB4MkYsIDB4NkYsIDB4MUYsIDB4NUYsIDB4M0YsIDB4N0YsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDEsIDB4MDUsIDB4MDMsIDB4MDcsIDB4MTcsIDB4MzcsIDB4NzcsCisgICAgICAgIDB4MEYsIDB4NEYsIDB4MkYsIDB4NkYsIDB4MUYsIDB4NUYsIDB4M0YsIDB4N0YsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDUsIDB4MDMsIDB4MDcsIDB4MjcsIDB4MTcsCisgICAgICAgIDB4MzcsIDB4MEYsIDB4MkYsIDB4NkYsIDB4MUYsIDB4NUYsIDB4M0YsIDB4N0YsCisgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpbmtfdHJlZV9sZW5zWzE2XVsxNl0gPSB7CisgICAgeyA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0IH0sCisgICAgeyAxLCA0LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1IH0sCisgICAgeyAyLCAyLCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1IH0sCisgICAgeyAyLCAzLCAzLCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1IH0sCisgICAgeyAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1IH0sCisgICAgeyAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1IH0sCisgICAgeyAyLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA1IH0sCisgICAgeyAxLCAzLCAzLCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2IH0sCisgICAgeyAxLCAyLCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2IH0sCisgICAgeyAxLCAzLCA0LCA0LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2IH0sCisgICAgeyAyLCAyLCAzLCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2IH0sCisgICAgeyAxLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2IH0sCisgICAgeyAyLCAyLCAyLCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2IH0sCisgICAgeyAxLCAzLCAzLCAzLCA2LCA2LCA2LCA2LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3IH0sCisgICAgeyAxLCAzLCAzLCAzLCA1LCA2LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3IH0sCisgICAgeyAyLCAyLCAzLCAzLCAzLCA2LCA2LCA2LCA2LCA2LCA3LCA3LCA3LCA3LCA3LCA3IH0sCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaW5rX3BhdHRlcm5zWzE2XVs2NF0gPSB7CisgICAgeworICAgICAgICAweDAwLCAweDA4LCAweDEwLCAweDE4LCAweDIwLCAweDI4LCAweDMwLCAweDM4LAorICAgICAgICAweDM5LCAweDMxLCAweDI5LCAweDIxLCAweDE5LCAweDExLCAweDA5LCAweDAxLAorICAgICAgICAweDAyLCAweDBBLCAweDEyLCAweDFBLCAweDIyLCAweDJBLCAweDMyLCAweDNBLAorICAgICAgICAweDNCLCAweDMzLCAweDJCLCAweDIzLCAweDFCLCAweDEzLCAweDBCLCAweDAzLAorICAgICAgICAweDA0LCAweDBDLCAweDE0LCAweDFDLCAweDI0LCAweDJDLCAweDM0LCAweDNDLAorICAgICAgICAweDNELCAweDM1LCAweDJELCAweDI1LCAweDFELCAweDE1LCAweDBELCAweDA1LAorICAgICAgICAweDA2LCAweDBFLCAweDE2LCAweDFFLCAweDI2LCAweDJFLCAweDM2LCAweDNFLAorICAgICAgICAweDNGLCAweDM3LCAweDJGLCAweDI3LCAweDFGLCAweDE3LCAweDBGLCAweDA3LAorICAgIH0sCisgICAgeworICAgICAgICAweDNCLCAweDNBLCAweDM5LCAweDM4LCAweDMwLCAweDMxLCAweDMyLCAweDMzLAorICAgICAgICAweDJCLCAweDJBLCAweDI5LCAweDI4LCAweDIwLCAweDIxLCAweDIyLCAweDIzLAorICAgICAgICAweDFCLCAweDFBLCAweDE5LCAweDE4LCAweDEwLCAweDExLCAweDEyLCAweDEzLAorICAgICAgICAweDBCLCAweDBBLCAweDA5LCAweDA4LCAweDAwLCAweDAxLCAweDAyLCAweDAzLAorICAgICAgICAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDBGLCAweDBFLCAweDBELCAweDBDLAorICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDFGLCAweDFFLCAweDFELCAweDFDLAorICAgICAgICAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDJGLCAweDJFLCAweDJELCAweDJDLAorICAgICAgICAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDNGLCAweDNFLCAweDNELCAweDNDLAorICAgIH0sCisgICAgeworICAgICAgICAweDE5LCAweDExLCAweDEyLCAweDFBLCAweDFCLCAweDEzLCAweDBCLCAweDAzLAorICAgICAgICAweDAyLCAweDBBLCAweDA5LCAweDAxLCAweDAwLCAweDA4LCAweDEwLCAweDE4LAorICAgICAgICAweDIwLCAweDI4LCAweDMwLCAweDM4LCAweDM5LCAweDMxLCAweDI5LCAweDJBLAorICAgICAgICAweDMyLCAweDNBLCAweDNCLCAweDMzLCAweDJCLCAweDIzLCAweDIyLCAweDIxLAorICAgICAgICAweDFELCAweDE1LCAweDE2LCAweDFFLCAweDFGLCAweDE3LCAweDBGLCAweDA3LAorICAgICAgICAweDA2LCAweDBFLCAweDBELCAweDA1LCAweDA0LCAweDBDLCAweDE0LCAweDFDLAorICAgICAgICAweDI0LCAweDJDLCAweDM0LCAweDNDLCAweDNELCAweDM1LCAweDJELCAweDJFLAorICAgICAgICAweDM2LCAweDNFLCAweDNGLCAweDM3LCAweDJGLCAweDI3LCAweDI2LCAweDI1LAorICAgIH0sCisgICAgeworICAgICAgICAweDAzLCAweDBCLCAweDAyLCAweDBBLCAweDAxLCAweDA5LCAweDAwLCAweDA4LAorICAgICAgICAweDEwLCAweDE4LCAweDExLCAweDE5LCAweDEyLCAweDFBLCAweDEzLCAweDFCLAorICAgICAgICAweDIzLCAweDJCLCAweDIyLCAweDJBLCAweDIxLCAweDI5LCAweDIwLCAweDI4LAorICAgICAgICAweDMwLCAweDM4LCAweDMxLCAweDM5LCAweDMyLCAweDNBLCAweDMzLCAweDNCLAorICAgICAgICAweDNDLCAweDM0LCAweDNELCAweDM1LCAweDNFLCAweDM2LCAweDNGLCAweDM3LAorICAgICAgICAweDJGLCAweDI3LCAweDJFLCAweDI2LCAweDJELCAweDI1LCAweDJDLCAweDI0LAorICAgICAgICAweDFDLCAweDE0LCAweDFELCAweDE1LCAweDFFLCAweDE2LCAweDFGLCAweDE3LAorICAgICAgICAweDBGLCAweDA3LCAweDBFLCAweDA2LCAweDBELCAweDA1LCAweDBDLCAweDA0LAorICAgIH0sCisgICAgeworICAgICAgICAweDE4LCAweDE5LCAweDEwLCAweDExLCAweDA4LCAweDA5LCAweDAwLCAweDAxLAorICAgICAgICAweDAyLCAweDAzLCAweDBBLCAweDBCLCAweDEyLCAweDEzLCAweDFBLCAweDFCLAorICAgICAgICAweDFDLCAweDFELCAweDE0LCAweDE1LCAweDBDLCAweDBELCAweDA0LCAweDA1LAorICAgICAgICAweDA2LCAweDA3LCAweDBFLCAweDBGLCAweDE2LCAweDE3LCAweDFFLCAweDFGLAorICAgICAgICAweDI3LCAweDI2LCAweDJGLCAweDJFLCAweDM3LCAweDM2LCAweDNGLCAweDNFLAorICAgICAgICAweDNELCAweDNDLCAweDM1LCAweDM0LCAweDJELCAweDJDLCAweDI1LCAweDI0LAorICAgICAgICAweDIzLCAweDIyLCAweDJCLCAweDJBLCAweDMzLCAweDMyLCAweDNCLCAweDNBLAorICAgICAgICAweDM5LCAweDM4LCAweDMxLCAweDMwLCAweDI5LCAweDI4LCAweDIxLCAweDIwLAorICAgIH0sCisgICAgeworICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA4LCAweDA5LCAweDBBLCAweDBCLAorICAgICAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE4LCAweDE5LCAweDFBLCAweDFCLAorICAgICAgICAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI4LCAweDI5LCAweDJBLCAweDJCLAorICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM4LCAweDM5LCAweDNBLCAweDNCLAorICAgICAgICAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDFDLCAweDFELCAweDFFLCAweDFGLAorICAgICAgICAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDJDLCAweDJELCAweDJFLCAweDJGLAorICAgICAgICAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDNDLCAweDNELCAweDNFLCAweDNGLAorICAgIH0sCisgICAgeworICAgICAgICAweDA2LCAweDA3LCAweDBGLCAweDBFLCAweDBELCAweDA1LCAweDBDLCAweDA0LAorICAgICAgICAweDAzLCAweDBCLCAweDAyLCAweDBBLCAweDA5LCAweDAxLCAweDAwLCAweDA4LAorICAgICAgICAweDEwLCAweDE4LCAweDExLCAweDE5LCAweDEyLCAweDFBLCAweDEzLCAweDFCLAorICAgICAgICAweDE0LCAweDFDLCAweDE1LCAweDFELCAweDE2LCAweDFFLCAweDE3LCAweDFGLAorICAgICAgICAweDI3LCAweDJGLCAweDI2LCAweDJFLCAweDI1LCAweDJELCAweDI0LCAweDJDLAorICAgICAgICAweDIzLCAweDJCLCAweDIyLCAweDJBLCAweDIxLCAweDI5LCAweDIwLCAweDI4LAorICAgICAgICAweDMxLCAweDMwLCAweDM4LCAweDM5LCAweDNBLCAweDMyLCAweDNCLCAweDMzLAorICAgICAgICAweDNDLCAweDM0LCAweDNELCAweDM1LCAweDM2LCAweDM3LCAweDNGLCAweDNFLAorICAgIH0sCisgICAgeworICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAgICAweDBGLCAweDBFLCAweDBELCAweDBDLCAweDBCLCAweDBBLCAweDA5LCAweDA4LAorICAgICAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorICAgICAgICAweDFGLCAweDFFLCAweDFELCAweDFDLCAweDFCLCAweDFBLCAweDE5LCAweDE4LAorICAgICAgICAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LAorICAgICAgICAweDJGLCAweDJFLCAweDJELCAweDJDLCAweDJCLCAweDJBLCAweDI5LCAweDI4LAorICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorICAgICAgICAweDNGLCAweDNFLCAweDNELCAweDNDLCAweDNCLCAweDNBLCAweDM5LCAweDM4LAorICAgIH0sCisgICAgeworICAgICAgICAweDAwLCAweDA4LCAweDA5LCAweDAxLCAweDAyLCAweDAzLCAweDBCLCAweDBBLAorICAgICAgICAweDEyLCAweDEzLCAweDFCLCAweDFBLCAweDE5LCAweDExLCAweDEwLCAweDE4LAorICAgICAgICAweDIwLCAweDI4LCAweDI5LCAweDIxLCAweDIyLCAweDIzLCAweDJCLCAweDJBLAorICAgICAgICAweDMyLCAweDMxLCAweDMwLCAweDM4LCAweDM5LCAweDNBLCAweDNCLCAweDMzLAorICAgICAgICAweDM0LCAweDNDLCAweDNELCAweDNFLCAweDNGLCAweDM3LCAweDM2LCAweDM1LAorICAgICAgICAweDJELCAweDJDLCAweDI0LCAweDI1LCAweDI2LCAweDJFLCAweDJGLCAweDI3LAorICAgICAgICAweDFGLCAweDE3LCAweDE2LCAweDFFLCAweDFELCAweDFDLCAweDE0LCAweDE1LAorICAgICAgICAweDBELCAweDBDLCAweDA0LCAweDA1LCAweDA2LCAweDBFLCAweDBGLCAweDA3LAorICAgIH0sCisgICAgeworICAgICAgICAweDE4LCAweDE5LCAweDEwLCAweDExLCAweDA4LCAweDA5LCAweDAwLCAweDAxLAorICAgICAgICAweDAyLCAweDAzLCAweDBBLCAweDBCLCAweDEyLCAweDEzLCAweDFBLCAweDFCLAorICAgICAgICAweDFDLCAweDFELCAweDE0LCAweDE1LCAweDBDLCAweDBELCAweDA0LCAweDA1LAorICAgICAgICAweDA2LCAweDA3LCAweDBFLCAweDBGLCAweDE2LCAweDE3LCAweDFFLCAweDFGLAorICAgICAgICAweDI2LCAweDI3LCAweDJFLCAweDJGLCAweDM2LCAweDM3LCAweDNFLCAweDNGLAorICAgICAgICAweDNDLCAweDNELCAweDM0LCAweDM1LCAweDJDLCAweDJELCAweDI0LCAweDI1LAorICAgICAgICAweDIyLCAweDIzLCAweDJBLCAweDJCLCAweDMyLCAweDMzLCAweDNBLCAweDNCLAorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDMxLCAweDI4LCAweDI5LCAweDIwLCAweDIxLAorICAgIH0sCisgICAgeworICAgICAgICAweDAwLCAweDA4LCAweDAxLCAweDA5LCAweDAyLCAweDBBLCAweDAzLCAweDBCLAorICAgICAgICAweDEzLCAweDFCLCAweDEyLCAweDFBLCAweDExLCAweDE5LCAweDEwLCAweDE4LAorICAgICAgICAweDIwLCAweDI4LCAweDIxLCAweDI5LCAweDIyLCAweDJBLCAweDIzLCAweDJCLAorICAgICAgICAweDMzLCAweDNCLCAweDMyLCAweDNBLCAweDMxLCAweDM5LCAweDMwLCAweDM4LAorICAgICAgICAweDNDLCAweDM0LCAweDNELCAweDM1LCAweDNFLCAweDM2LCAweDNGLCAweDM3LAorICAgICAgICAweDJGLCAweDI3LCAweDJFLCAweDI2LCAweDJELCAweDI1LCAweDJDLCAweDI0LAorICAgICAgICAweDFGLCAweDE3LCAweDFFLCAweDE2LCAweDFELCAweDE1LCAweDFDLCAweDE0LAorICAgICAgICAweDBDLCAweDA0LCAweDBELCAweDA1LCAweDBFLCAweDA2LCAweDBGLCAweDA3LAorICAgIH0sCisgICAgeworICAgICAgICAweDAwLCAweDA4LCAweDEwLCAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDEzLAorICAgICAgICAweDBCLCAweDAzLCAweDAyLCAweDAxLCAweDA5LCAweDExLCAweDEyLCAweDBBLAorICAgICAgICAweDA0LCAweDBDLCAweDE0LCAweDFDLCAweDFELCAweDFFLCAweDFGLCAweDE3LAorICAgICAgICAweDBGLCAweDA3LCAweDA2LCAweDA1LCAweDBELCAweDE1LCAweDE2LCAweDBFLAorICAgICAgICAweDI0LCAweDJDLCAweDM0LCAweDNDLCAweDNELCAweDNFLCAweDNGLCAweDM3LAorICAgICAgICAweDJGLCAweDI3LCAweDI2LCAweDI1LCAweDJELCAweDM1LCAweDM2LCAweDJFLAorICAgICAgICAweDIwLCAweDI4LCAweDMwLCAweDM4LCAweDM5LCAweDNBLCAweDNCLCAweDMzLAorICAgICAgICAweDJCLCAweDIzLCAweDIyLCAweDIxLCAweDI5LCAweDMxLCAweDMyLCAweDJBLAorICAgIH0sCisgICAgeworICAgICAgICAweDAwLCAweDA4LCAweDA5LCAweDAxLCAweDAyLCAweDAzLCAweDBCLCAweDBBLAorICAgICAgICAweDEzLCAweDFCLCAweDFBLCAweDEyLCAweDExLCAweDEwLCAweDE4LCAweDE5LAorICAgICAgICAweDIxLCAweDIwLCAweDI4LCAweDI5LCAweDJBLCAweDIyLCAweDIzLCAweDJCLAorICAgICAgICAweDMzLCAweDNCLCAweDNBLCAweDMyLCAweDMxLCAweDM5LCAweDM4LCAweDMwLAorICAgICAgICAweDM0LCAweDNDLCAweDNELCAweDM1LCAweDM2LCAweDNFLCAweDNGLCAweDM3LAorICAgICAgICAweDJGLCAweDI3LCAweDI2LCAweDJFLCAweDJELCAweDJDLCAweDI0LCAweDI1LAorICAgICAgICAweDFELCAweDFDLCAweDE0LCAweDE1LCAweDE2LCAweDFFLCAweDFGLCAweDE3LAorICAgICAgICAweDBFLCAweDBGLCAweDA3LCAweDA2LCAweDA1LCAweDBELCAweDBDLCAweDA0LAorICAgIH0sCisgICAgeworICAgICAgICAweDE4LCAweDEwLCAweDA4LCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDBCLAorICAgICAgICAweDEzLCAweDFCLCAweDFBLCAweDE5LCAweDExLCAweDBBLCAweDA5LCAweDEyLAorICAgICAgICAweDFDLCAweDE0LCAweDBDLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDBGLAorICAgICAgICAweDE3LCAweDFGLCAweDFFLCAweDFELCAweDE1LCAweDBFLCAweDBELCAweDE2LAorICAgICAgICAweDNDLCAweDM0LCAweDJDLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDJGLAorICAgICAgICAweDM3LCAweDNGLCAweDNFLCAweDNELCAweDM1LCAweDJFLCAweDJELCAweDM2LAorICAgICAgICAweDM4LCAweDMwLCAweDI4LCAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDJCLAorICAgICAgICAweDMzLCAweDNCLCAweDNBLCAweDM5LCAweDMxLCAweDJBLCAweDI5LCAweDMyLAorICAgIH0sCisgICAgeworICAgICAgICAweDAwLCAweDA4LCAweDA5LCAweDAxLCAweDAyLCAweDBBLCAweDEyLCAweDExLAorICAgICAgICAweDEwLCAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDEzLCAweDBCLCAweDAzLAorICAgICAgICAweDA3LCAweDA2LCAweDBFLCAweDBGLCAweDE3LCAweDE2LCAweDE1LCAweDBELAorICAgICAgICAweDA1LCAweDA0LCAweDBDLCAweDE0LCAweDFDLCAweDFELCAweDFFLCAweDFGLAorICAgICAgICAweDNGLCAweDNFLCAweDM2LCAweDM3LCAweDJGLCAweDJFLCAweDJELCAweDM1LAorICAgICAgICAweDNELCAweDNDLCAweDM0LCAweDJDLCAweDI0LCAweDI1LCAweDI2LCAweDI3LAorICAgICAgICAweDM4LCAweDMwLCAweDMxLCAweDM5LCAweDNBLCAweDMyLCAweDJBLCAweDI5LAorICAgICAgICAweDI4LCAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDJCLCAweDMzLCAweDNCLAorICAgIH0sCisgICAgeworICAgICAgICAweDAwLCAweDAxLCAweDA4LCAweDA5LCAweDEwLCAweDExLCAweDE4LCAweDE5LAorICAgICAgICAweDIwLCAweDIxLCAweDI4LCAweDI5LCAweDMwLCAweDMxLCAweDM4LCAweDM5LAorICAgICAgICAweDNBLCAweDNCLCAweDMyLCAweDMzLCAweDJBLCAweDJCLCAweDIyLCAweDIzLAorICAgICAgICAweDFBLCAweDFCLCAweDEyLCAweDEzLCAweDBBLCAweDBCLCAweDAyLCAweDAzLAorICAgICAgICAweDA0LCAweDA1LCAweDBDLCAweDBELCAweDE0LCAweDE1LCAweDFDLCAweDFELAorICAgICAgICAweDI0LCAweDI1LCAweDJDLCAweDJELCAweDM0LCAweDM1LCAweDNDLCAweDNELAorICAgICAgICAweDNFLCAweDNGLCAweDM2LCAweDM3LCAweDJFLCAweDJGLCAweDI2LCAweDI3LAorICAgICAgICAweDFFLCAweDFGLCAweDE2LCAweDE3LCAweDBFLCAweDBGLCAweDA2LCAweDA3LAorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGJpbmtfaW50cmFfcXVhbnRbMTZdWzY0XSA9IHsKK3sKKyAweDAxMDAwMCwgMHgwMTYzMTUsIDB4MDFFODNELCAweDAyQTUzNSwgMHgwMTRFN0IsIDB4MDE2NTc3LCAweDAyRjFFNiwgMHgwMjcyNEMsCisgMHgwMTAwMDAsIDB4MDBFRURBLCAweDAyNDEwMiwgMHgwMTdGOUIsIDB4MDBCRTgwLCAweDAwNjExRSwgMHgwMTA4M0MsIDB4MDBBNTUyLAorIDB4MDIxRjg4LCAweDAxREM1MywgMHgwMjdGQUQsIDB4MDFGNjk3LCAweDAxNDgxOSwgMHgwMEE3NDMsIDB4MDE1QTMxLCAweDAwOTY4OCwKKyAweDAyMzQ2RiwgMHgwMzBFRTUsIDB4MDFGQkZBLCAweDAyQzA5NiwgMHgwMUQwMDAsIDB4MDI4Mzk2LCAweDAxOTI0NywgMHgwMUY5QUEsCisgMHgwMjM0NkYsIDB4MDFGQkZBLCAweDAxREM1MywgMHgwMjMxQjgsIDB4MDEyRjEyLCAweDAxRTA2QywgMHgwMENCMTAsIDB4MDExOUE4LAorIDB4MDFDNDhDLCAweDAxOTc0OCwgMHgwMTRFODYsIDB4MDEyMkFGLCAweDAyQzYyOCwgMHgwMjdGMjAsIDB4MDI5N0I1LCAweDAyM0YzMiwKKyAweDAyNTAwMCwgMHgwMUFCNkIsIDB4MDFEMTIyLCAweDAxNTlCMywgMHgwMTI2NjksIDB4MDA4RDQzLCAweDAwRUUxRiwgMHgwMDc1RUQsCisgMHgwMTQ5MEMsIDB4MDEwMjg4LCAweDAwRjczNSwgMHgwMEVGNTEsIDB4MDBFMEYxLCAweDAwNzJBRCwgMHgwMEE0RDgsIDB4MDA2NTE3LAorfSwKK3sKKyAweDAxNTU1NSwgMHgwMUQ5NzEsIDB4MDI4QUZDLCAweDAzODZGMSwgMHgwMUJERjksIDB4MDFEQzlGLCAweDAzRUQzMywgMHgwMzQzMTEsCisgMHgwMTU1NTUsIDB4MDEzRTc4LCAweDAzMDE1OCwgMHgwMUZGN0EsIDB4MDBGRTAwLCAweDAwODE3RCwgMHgwMTYwNEYsIDB4MDBEQzZELAorIDB4MDJENEI1LCAweDAyN0IxOSwgMHgwMzU0RTcsIDB4MDI5RTFGLCAweDAxQjU3NywgMHgwMERGMDQsIDB4MDFDRDk2LCAweDAwQzhCNiwKKyAweDAyRjA5NSwgMHgwNDEzREMsIDB4MDJBNTRFLCAweDAzQUI3MywgMHgwMjZBQUIsIDB4MDM1QTFFLCAweDAyMTg1RSwgMHgwMkEyMzgsCisgMHgwMkYwOTUsIDB4MDJBNTRFLCAweDAyN0IxOSwgMHgwMkVDRjUsIDB4MDE5NDE4LCAweDAyODA5MCwgMHgwMTBFQzAsIDB4MDE3NzhBLAorIDB4MDI1QjY2LCAweDAyMUYwQiwgMHgwMUJFMDksIDB4MDE4Mzk0LCAweDAzQjJFMCwgMHgwMzU0MkEsIDB4MDM3NEYxLCAweDAyRkVFRSwKKyAweDAzMTU1NSwgMHgwMjM5RTQsIDB4MDI2QzJELCAweDAxQ0NFRSwgMHgwMTg4OEMsIDB4MDBCQzU5LCAweDAxM0Q3RSwgMHgwMDlEM0MsCisgMHgwMUI2QkIsIDB4MDE1OEI1LCAweDAxNDk5QywgMHgwMTNGMTcsIDB4MDEyQkVDLCAweDAwOThFNiwgMHgwMERCQ0IsIDB4MDA4NkM5LAorfSwKK3sKKyAweDAxQUFBQiwgMHgwMjRGQ0UsIDB4MDMyREJCLCAweDA0NjhBRCwgMHgwMjJENzgsIDB4MDI1M0M3LCAweDA0RTg3RiwgMHgwNDEzRDUsCisgMHgwMUFBQUIsIDB4MDE4RTE2LCAweDAzQzFBRSwgMHgwMjdGNTgsIDB4MDEzRDgwLCAweDAwQTFEQywgMHgwMUI4NjMsIDB4MDExMzg4LAorIDB4MDM4OUUyLCAweDAzMTlERiwgMHgwNDJBMjEsIDB4MDM0NUE3LCAweDAyMjJENCwgMHgwMTE2QzUsIDB4MDI0MEZDLCAweDAwRkFFMywKKyAweDAzQUNCQSwgMHgwNTE4RDMsIDB4MDM0RUExLCAweDA0OTY0RiwgMHgwMzA1NTUsIDB4MDQzMEE1LCAweDAyOUU3NiwgMHgwMzRBQzUsCisgMHgwM0FDQkEsIDB4MDM0RUExLCAweDAzMTlERiwgMHgwM0E4MzMsIDB4MDFGOTFFLCAweDAzMjBCNCwgMHgwMTUyNzAsIDB4MDFENTZELAorIDB4MDJGMjNGLCAweDAyQTZDRSwgMHgwMjJEOEIsIDB4MDFFNDc5LCAweDA0OUY5OCwgMHgwNDI5MzUsIDB4MDQ1MjJELCAweDAzQkVBOSwKKyAweDAzREFBQiwgMHgwMkM4NUQsIDB4MDMwNzM4LCAweDAyNDAyQSwgMHgwMUVBQUYsIDB4MDBFQjZGLCAweDAxOENERSwgMHgwMEM0OEEsCisgMHgwMjI0NjksIDB4MDFBRUUyLCAweDAxOUMwMiwgMHgwMThFREQsIDB4MDE3NkU3LCAweDAwQkYyMCwgMHgwMTEyQkUsIDB4MDBBODdCLAorfSwKK3sKKyAweDAyMDAwMCwgMHgwMkM2MkEsIDB4MDNEMDdBLCAweDA1NEE2OSwgMHgwMjlDRjYsIDB4MDJDQUVGLCAweDA1RTNDQywgMHgwNEU0OTksCisgMHgwMjAwMDAsIDB4MDFEREI0LCAweDA0ODIwNCwgMHgwMkZGMzYsIDB4MDE3RDAxLCAweDAwQzIzQywgMHgwMjEwNzcsIDB4MDE0QUEzLAorIDB4MDQzRjBGLCAweDAzQjhBNiwgMHgwNEZGNUEsIDB4MDNFRDJFLCAweDAyOTAzMiwgMHgwMTRFODYsIDB4MDJCNDYxLCAweDAxMkQxMSwKKyAweDA0NjhERiwgMHgwNjFEQ0EsIDB4MDNGN0Y1LCAweDA1ODEyQywgMHgwM0EwMDAsIDB4MDUwNzJDLCAweDAzMjQ4RCwgMHgwM0YzNTMsCisgMHgwNDY4REYsIDB4MDNGN0Y1LCAweDAzQjhBNiwgMHgwNDYzNzAsIDB4MDI1RTI0LCAweDAzQzBEOCwgMHgwMTk2MjAsIDB4MDIzMzRGLAorIDB4MDM4OTE5LCAweDAzMkU5MSwgMHgwMjlEMEQsIDB4MDI0NTVFLCAweDA1OEM1MCwgMHgwNEZFM0YsIDB4MDUyRjY5LCAweDA0N0U2NSwKKyAweDA0QTAwMCwgMHgwMzU2RDYsIDB4MDNBMjQzLCAweDAyQjM2NSwgMHgwMjRDRDIsIDB4MDExQTg1LCAweDAxREMzRSwgMHgwMEVCRDksCisgMHgwMjkyMTgsIDB4MDIwNTEwLCAweDAxRUU2OSwgMHgwMURFQTIsIDB4MDFDMUUyLCAweDAwRTU1OSwgMHgwMTQ5QjAsIDB4MDBDQTJELAorfSwKK3sKKyAweDAyQUFBQiwgMHgwM0IyRTMsIDB4MDUxNUY4LCAweDA3MERFMiwgMHgwMzdCRjIsIDB4MDNCOTNFLCAweDA3REE2NSwgMHgwNjg2MjEsCisgMHgwMkFBQUIsIDB4MDI3Q0YwLCAweDA2MDJCMSwgMHgwM0ZFRjMsIDB4MDFGQzAxLCAweDAxMDJGQSwgMHgwMkMwOUYsIDB4MDFCOERBLAorIDB4MDVBOTZBLCAweDA0RjYzMiwgMHgwNkE5Q0UsIDB4MDUzQzNFLCAweDAzNkFFRCwgMHgwMUJFMDksIDB4MDM5QjJELCAweDAxOTE2QiwKKyAweDA1RTEyOSwgMHgwODI3QjgsIDB4MDU0QTlDLCAweDA3NTZFNSwgMHgwNEQ1NTUsIDB4MDZCNDNCLCAweDA0MzBCQywgMHgwNTQ0NkYsCisgMHgwNUUxMjksIDB4MDU0QTlDLCAweDA0RjYzMiwgMHgwNUQ5RUIsIDB4MDMyODMwLCAweDA1MDEyMSwgMHgwMjFEODAsIDB4MDJFRjE0LAorIDB4MDRCNkNDLCAweDA0M0UxNiwgMHgwMzdDMTEsIDB4MDMwNzI4LCAweDA3NjVDMCwgMHgwNkE4NTUsIDB4MDZFOUUyLCAweDA1RkREQiwKKyAweDA2MkFBQiwgMHgwNDczQzgsIDB4MDREODVBLCAweDAzOTlEQywgMHgwMzExMTgsIDB4MDE3OEIyLCAweDAyN0FGRCwgMHgwMTNBNzcsCisgMHgwMzZENzYsIDB4MDJCMTZBLCAweDAyOTMzNywgMHgwMjdFMkUsIDB4MDI1N0Q4LCAweDAxMzFDQywgMHgwMUI3OTYsIDB4MDEwRDkxLAorfSwKK3sKKyAweDAzODAwMCwgMHgwNERBQ0EsIDB4MDZBQ0Q1LCAweDA5NDIzOCwgMHgwNDkyQUUsIDB4MDRFMzIyLCAweDBBNEVBNSwgMHgwODkwMEMsCisgMHgwMzgwMDAsIDB4MDM0M0ZCLCAweDA3RTM4OCwgMHgwNTNFOUYsIDB4MDI5QUMxLCAweDAxNTNFOCwgMHgwMzlDRDAsIDB4MDI0MjlFLAorIDB4MDc2RTVCLCAweDA2ODMyMiwgMHgwOEJFREUsIDB4MDZERjExLCAweDA0N0M1NywgMHgwMjQ5NkIsIDB4MDRCQkFCLCAweDAyMEVERCwKKyAweDA3Qjc4NiwgMHgwQUI0MjEsIDB4MDZGMUVELCAweDA5QTIwRCwgMHgwNjU4MDAsIDB4MDhDQzhFLCAweDA1N0ZGNywgMHgwNkU5RDIsCisgMHgwN0I3ODYsIDB4MDZGMUVELCAweDA2ODMyMiwgMHgwN0FFMDQsIDB4MDQyNEJGLCAweDA2OTE3QiwgMHgwMkM2QjgsIDB4MDNEOUNCLAorIDB4MDYyRkVCLCAweDA1OTE3RCwgMHgwNDkyRDcsIDB4MDNGOTY0LCAweDA5QjU4QywgMHgwOEJDRUYsIDB4MDkxMkY4LCAweDA3REQzMCwKKyAweDA4MTgwMCwgMHgwNUQ3RjcsIDB4MDY1QkY2LCAweDA0QjlGMSwgMHgwNDA2NzAsIDB4MDFFRTY5LCAweDAzNDE2QywgMHgwMTlDQkMsCisgMHgwNDdGQUEsIDB4MDM4OERDLCAweDAzNjEzOCwgMHgwMzQ1OUMsIDB4MDMxMzRDLCAweDAxOTE1QywgMHgwMjQwRjUsIDB4MDE2MUNGLAorfSwKK3sKKyAweDA0MDAwMCwgMHgwNThDNTQsIDB4MDdBMEY0LCAweDBBOTREMywgMHgwNTM5RUMsIDB4MDU5NURELCAweDBCQzc5OCwgMHgwOUM5MzIsCisgMHgwNDAwMDAsIDB4MDNCQjY4LCAweDA5MDQwOSwgMHgwNUZFNkQsIDB4MDJGQTAxLCAweDAxODQ3NywgMHgwNDIwRUUsIDB4MDI5NTQ3LAorIDB4MDg3RTFGLCAweDA3NzE0QywgMHgwOUZFQjUsIDB4MDdEQTVELCAweDA1MjA2NCwgMHgwMjlEMEQsIDB4MDU2OEMzLCAweDAyNUEyMSwKKyAweDA4RDFCRSwgMHgwQzNCOTQsIDB4MDdFRkVBLCAweDBCMDI1OCwgMHgwNzQwMDAsIDB4MEEwRTU5LCAweDA2NDkxQSwgMHgwN0U2QTcsCisgMHgwOEQxQkUsIDB4MDdFRkVBLCAweDA3NzE0QywgMHgwOEM2RTAsIDB4MDRCQzQ4LCAweDA3ODFCMSwgMHgwMzJDM0YsIDB4MDQ2NjlGLAorIDB4MDcxMjMyLCAweDA2NUQyMiwgMHgwNTNBMUEsIDB4MDQ4QUJDLCAweDBCMThBMCwgMHgwOUZDN0YsIDB4MEE1RUQzLCAweDA4RkNDOSwKKyAweDA5NDAwMCwgMHgwNkFEQUMsIDB4MDc0NDg3LCAweDA1NjZDQSwgMHgwNDk5QTUsIDB4MDIzNTBCLCAweDAzQjg3QiwgMHgwMUQ3QjMsCisgMHgwNTI0MzAsIDB4MDQwQTIwLCAweDAzRENEMywgMHgwM0JENDUsIDB4MDM4M0M1LCAweDAxQ0FCMywgMHgwMjkzNjEsIDB4MDE5NDVBLAorfSwKK3sKKyAweDA1MDAwMCwgMHgwNkVGNjksIDB4MDk4OTMxLCAweDBEM0EwNywgMHgwNjg4NjcsIDB4MDZGQjU1LCAweDBFQjk3RSwgMHgwQzNCN0UsCisgMHgwNTAwMDAsIDB4MDRBQTQyLCAweDBCNDUwQiwgMHgwNzdFMDgsIDB4MDNCODgxLCAweDAxRTU5NSwgMHgwNTI5MkEsIDB4MDMzQTk5LAorIDB4MEE5REE3LCAweDA5NEQ5RiwgMHgwQzdFNjIsIDB4MDlEMEY0LCAweDA2Njg3RCwgMHgwMzQ0NTAsIDB4MDZDMkY0LCAweDAyRjBBQSwKKyAweDBCMDYyRCwgMHgwRjRBNzgsIDB4MDlFQkU0LCAweDBEQzJFRSwgMHgwOTEwMDAsIDB4MEM5MUVGLCAweDA3REI2MSwgMHgwOUUwNTAsCisgMHgwQjA2MkQsIDB4MDlFQkU0LCAweDA5NEQ5RiwgMHgwQUY4OTgsIDB4MDVFQjU5LCAweDA5NjIxRCwgMHgwM0Y3NEYsIDB4MDU4MDQ2LAorIDB4MDhENkJFLCAweDA3RjQ2QSwgMHgwNjg4QTAsIDB4MDVBRDZCLCAweDBEREVDOCwgMHgwQzdCOUYsIDB4MENGNjg3LCAweDBCM0JGQiwKKyAweDBCOTAwMCwgMHgwODU5MTcsIDB4MDkxNUE4LCAweDA2QzA3RCwgMHgwNUMwMEUsIDB4MDJDMjRELCAweDA0QTY5QSwgMHgwMjREOUYsCisgMHgwNjZEM0MsIDB4MDUwQ0E3LCAweDA0RDQwNywgMHgwNEFDOTYsIDB4MDQ2NEI2LCAweDAyM0Q1RiwgMHgwMzM4MzksIDB4MDFGOTcxLAorfSwKK3sKKyAweDA2MDAwMCwgMHgwODUyN0UsIDB4MEI3MTZFLCAweDBGREYzQywgMHgwN0Q2RTEsIDB4MDg2MENDLCAweDExQUI2MywgMHgwRUFEQ0IsCisgMHgwNjAwMDAsIDB4MDU5OTFDLCAweDBEODYwRCwgMHgwOEZEQTMsIDB4MDQ3NzAyLCAweDAyNDZCMywgMHgwNjMxNjUsIDB4MDNERkVBLAorIDB4MENCRDJFLCAweDBCMjlGMSwgMHgwRUZFMEYsIDB4MEJDNzhCLCAweDA3QjA5NiwgMHgwM0VCOTMsIDB4MDgxRDI0LCAweDAzODczMiwKKyAweDBEM0E5QywgMHgxMjU5NUQsIDB4MEJFN0RGLCAweDEwODM4NCwgMHgwQUUwMDAsIDB4MEYxNTg1LCAweDA5NkRBOCwgMHgwQkQ5RkEsCisgMHgwRDNBOUMsIDB4MEJFN0RGLCAweDBCMjlGMSwgMHgwRDJBNTAsIDB4MDcxQTZCLCAweDBCNDI4OSwgMHgwNEMyNUYsIDB4MDY5OUVFLAorIDB4MEE5QjRBLCAweDA5OEJCMiwgMHgwN0Q3MjcsIDB4MDZEMDFBLCAweDEwQTRGMCwgMHgwRUZBQkUsIDB4MEY4RTNDLCAweDBEN0IyRSwKKyAweDBERTAwMCwgMHgwQTA0ODIsIDB4MEFFNkNBLCAweDA4MUEyRiwgMHgwNkU2NzcsIDB4MDM0RjkwLCAweDA1OTRCOSwgMHgwMkMzOEMsCisgMHgwN0I2NDksIDB4MDYwRjJGLCAweDA1Q0IzQywgMHgwNTlCRTcsIDB4MDU0NUE3LCAweDAyQjAwQywgMHgwM0REMTEsIDB4MDI1RTg3LAorfSwKK3sKKyAweDA4MDAwMCwgMHgwQjE4QTgsIDB4MEY0MUU4LCAweDE1MjlBNSwgMHgwQTczRDcsIDB4MEIyQkJCLCAweDE3OEYyRiwgMHgxMzkyNjQsCisgMHgwODAwMDAsIDB4MDc3NkNGLCAweDEyMDgxMiwgMHgwQkZDRDksIDB4MDVGNDAyLCAweDAzMDhFRiwgMHgwODQxREMsIDB4MDUyQThFLAorIDB4MTBGQzNFLCAweDBFRTI5NywgMHgxM0ZENjksIDB4MEZCNEI5LCAweDBBNDBDOCwgMHgwNTNBMUEsIDB4MEFEMTg2LCAweDA0QjQ0MiwKKyAweDExQTM3QiwgMHgxODc3MjcsIDB4MEZERkQ0LCAweDE2MDRCMCwgMHgwRTgwMDAsIDB4MTQxQ0IxLCAweDBDOTIzNSwgMHgwRkNENEQsCisgMHgxMUEzN0IsIDB4MEZERkQ0LCAweDBFRTI5NywgMHgxMThEQzAsIDB4MDk3ODhGLCAweDBGMDM2MiwgMHgwNjU4N0YsIDB4MDhDRDNELAorIDB4MEUyNDYzLCAweDBDQkE0MywgMHgwQTc0MzQsIDB4MDkxNTc3LCAweDE2MzE0MCwgMHgxM0Y4RkUsIDB4MTRCREE1LCAweDExRjk5MiwKKyAweDEyODAwMCwgMHgwRDVCNTgsIDB4MEU4OTBELCAweDBBQ0Q5NCwgMHgwOTMzNDksIDB4MDQ2QTE1LCAweDA3NzBGNywgMHgwM0FGNjUsCisgMHgwQTQ4NjEsIDB4MDgxNDNGLCAweDA3QjlBNiwgMHgwNzdBODksIDB4MDcwNzg5LCAweDAzOTU2NSwgMHgwNTI2QzIsIDB4MDMyOEI0LAorfSwKK3sKKyAweDBDMDAwMCwgMHgxMEE0RkQsIDB4MTZFMkRCLCAweDFGQkU3OCwgMHgwRkFEQzMsIDB4MTBDMTk4LCAweDIzNTZDNywgMHgxRDVCOTYsCisgMHgwQzAwMDAsIDB4MEIzMjM3LCAweDFCMEMxQSwgMHgxMUZCNDYsIDB4MDhFRTAzLCAweDA0OEQ2NiwgMHgwQzYyQ0EsIDB4MDdCRkQ1LAorIDB4MTk3QTVELCAweDE2NTNFMywgMHgxREZDMUUsIDB4MTc4RjE2LCAweDBGNjEyQywgMHgwN0Q3MjcsIDB4MTAzQTQ5LCAweDA3MEU2NCwKKyAweDFBNzUzOSwgMHgyNEIyQkIsIDB4MTdDRkJELCAweDIxMDcwOSwgMHgxNUMwMDAsIDB4MUUyQjBBLCAweDEyREI0RiwgMHgxN0IzRjQsCisgMHgxQTc1MzksIDB4MTdDRkJELCAweDE2NTNFMywgMHgxQTU0QTAsIDB4MEUzNEQ3LCAweDE2ODUxMywgMHgwOTg0QkUsIDB4MEQzM0RDLAorIDB4MTUzNjk1LCAweDEzMTc2NSwgMHgwRkFFNEUsIDB4MERBMDMzLCAweDIxNDlFMSwgMHgxREY1N0QsIDB4MUYxQzc4LCAweDFBRjY1QiwKKyAweDFCQzAwMCwgMHgxNDA5MDQsIDB4MTVDRDk0LCAweDEwMzQ1RSwgMHgwRENDRUUsIDB4MDY5RjIwLCAweDBCMjk3MiwgMHgwNTg3MTgsCisgMHgwRjZDOTEsIDB4MEMxRTVFLCAweDBCOTY3OCwgMHgwQjM3Q0UsIDB4MEE4QjRFLCAweDA1NjAxOCwgMHgwN0JBMjIsIDB4MDRCRDBFLAorfSwKK3sKKyAweDExMDAwMCwgMHgxNzk0NjYsIDB4MjA2QzBDLCAweDJDRjg3RiwgMHgxNjM2MkEsIDB4MTdCQ0VELCAweDMyMTA0NCwgMHgyOTk3MTQsCisgMHgxMTAwMDAsIDB4MEZEQzc5LCAweDI2NTEyNSwgMHgxOTc5NEUsIDB4MENBNjg1LCAweDA2NzJGQiwgMHgxMThCRjQsIDB4MEFGQTZELAorIDB4MjQxODA0LCAweDFGQTE4MSwgMHgyQTdBODAsIDB4MjE2MDBBLCAweDE1QzlBOSwgMHgwQjFCNzcsIDB4MTZGRDNDLCAweDA5RkYwRCwKKyAweDI1N0I2NiwgMHgzM0ZEMzMsIDB4MjFCQkEyLCAweDJFQzlGNywgMHgxRUQwMDAsIDB4MkFCQ0Y5LCAweDFBQjZCMCwgMHgyMTk0NDQsCisgMHgyNTdCNjYsIDB4MjFCQkEyLCAweDFGQTE4MSwgMHgyNTREMzgsIDB4MTQyMDMwLCAweDFGRTczMCwgMHgwRDdDMEUsIDB4MTJCNDIzLAorIDB4MUUwRDUyLCAweDFCMEJDRiwgMHgxNjM2RUUsIDB4MTM0RDlFLCAweDJGMjhBOSwgMHgyQTcxMUIsIDB4MkMxMkZGLCAweDI2MzI1NiwKKyAweDI3NTAwMCwgMHgxQzYyMUIsIDB4MUVFMzNDLCAweDE2RjREQiwgMHgxMzhDRkIsIDB4MDk2MTZFLCAweDBGRDAwQywgMHgwN0Q0QjcsCisgMHgxNUQ5Q0UsIDB4MTEyQjA2LCAweDEwNkE4MCwgMHgwRkU0NjQsIDB4MEVGMDA0LCAweDA3OUQ3NywgMHgwQUYyNUIsIDB4MDZCNjdGLAorfSwKK3sKKyAweDE2MDAwMCwgMHgxRTgzQ0YsIDB4MjlGNTNELCAweDNBMzI4NiwgMHgxQ0JFOTAsIDB4MUVCODQyLCAweDQwQzlDMiwgMHgzNUQyOTMsCisgMHgxNjAwMDAsIDB4MTQ4NkJBLCAweDMxOTYzMCwgMHgyMEY3NTYsIDB4MTA1RjA2LCAweDA4NTg5MSwgMHgxNkI1MUUsIDB4MEUzNTA2LAorIDB4MkVCNUFBLCAweDI4RUYyMCwgMHgzNkY4RTEsIDB4MkIzMEZFLCAweDFDMzIyNSwgMHgwRTVGQzcsIDB4MURDMDMwLCAweDBDRUZCNywKKyAweDMwODE5MywgMHg0MzQ3QUMsIDB4MkJBNzg2LCAweDNDOENFNSwgMHgyN0UwMDAsIDB4Mzc0RUU3LCAweDIyOTIxMiwgMHgyQjc0OTQsCisgMHgzMDgxOTMsIDB4MkJBNzg2LCAweDI4RUYyMCwgMHgzMDQ1RDAsIDB4MUEwQjg5LCAweDI5NDk0RCwgMHgxMTczNUQsIDB4MTgzNDY5LAorIDB4MjZFNDEwLCAweDIzMDAzOSwgMHgxQ0JGOEYsIDB4MThGQjA5LCAweDNEMDc3MSwgMHgzNkVDQkEsIDB4MzkwOTg2LCAweDMxNkU1MiwKKyAweDMyRTAwMCwgMHgyNEJCMzMsIDB4MjdGOEU0LCAweDFEQjU1NywgMHgxOTREMDksIDB4MEMyM0JCLCAweDE0NzZBNiwgMHgwQTIyNTYsCisgMHgxQzQ3MEEsIDB4MTYzN0FELCAweDE1M0U4NywgMHgxNDkwRkEsIDB4MTM1NEI5LCAweDA5REFENiwgMHgwRTJBOTQsIDB4MDhBRkYwLAorfSwKK3sKKyAweDFDMDAwMCwgMHgyNkQ2NEQsIDB4MzU2NkFBLCAweDRBMTFDMiwgMHgyNDk1NzIsIDB4MjcxOTBFLCAweDUyNzUyNSwgMHg0NDgwNUUsCisgMHgxQzAwMDAsIDB4MUExRkQ2LCAweDNGMUMzRSwgMHgyOUY0RjksIDB4MTRENjA3LCAweDBBOUY0NCwgMHgxQ0U2ODMsIDB4MTIxNEYwLAorIDB4M0I3MkQ5LCAweDM0MTkxMSwgMHg0NUY2RjAsIDB4MzZGODg5LCAweDIzRTJCQiwgMHgxMjRCNUIsIDB4MjVERDU0LCAweDEwNzZFOSwKKyAweDNEQkMzMCwgMHg1NUExMDksIDB4Mzc4RjY0LCAweDREMTA2OSwgMHgzMkMwMDAsIDB4NDY2NDZDLCAweDJCRkZCOSwgMHgzNzRFOEUsCisgMHgzREJDMzAsIDB4Mzc4RjY0LCAweDM0MTkxMSwgMHgzRDcwMjAsIDB4MjEyNUY1LCAweDM0OEJENiwgMHgxNjM1QkMsIDB4MUVDRTU3LAorIDB4MzE3RjVCLCAweDJDOEJFQiwgMHgyNDk2QjYsIDB4MUZDQjIyLCAweDREQUM2MSwgMHg0NUU3NzgsIDB4NDg5N0MyLCAweDNFRTk3RiwKKyAweDQwQzAwMCwgMHgyRUJGQjUsIDB4MzJERkFFLCAweDI1Q0Y4NiwgMHgyMDMzODAsIDB4MEY3MzRCLCAweDFBMEI1RiwgMHgwQ0U1RTIsCisgMHgyM0ZENTMsIDB4MUM0NkRDLCAweDFCMDlDNCwgMHgxQTJDRTEsIDB4MTg5QTYwLCAweDBDOEFFMiwgMHgxMjA3QTUsIDB4MEIwRTc3LAorfSwKK3sKKyAweDIyMDAwMCwgMHgyRjI4Q0MsIDB4NDBEODE4LCAweDU5RjBGRSwgMHgyQzZDNTMsIDB4MkY3OURBLCAweDY0MjA4OSwgMHg1MzJFMjksCisgMHgyMjAwMDAsIDB4MUZCOEYxLCAweDRDQTI0QiwgMHgzMkYyOUMsIDB4MTk0RDA5LCAweDBDRTVGNywgMHgyMzE3RTgsIDB4MTVGNERCLAorIDB4NDgzMDA3LCAweDNGNDMwMywgMHg1NEY0RkYsIDB4NDJDMDE0LCAweDJCOTM1MSwgMHgxNjM2RUUsIDB4MkRGQTc5LCAweDEzRkUxQSwKKyAweDRBRjZDQywgMHg2N0ZBNjcsIDB4NDM3NzQzLCAweDVEOTNFRSwgMHgzREEwMDAsIDB4NTU3OUYxLCAweDM1NkQ2MSwgMHg0MzI4ODgsCisgMHg0QUY2Q0MsIDB4NDM3NzQzLCAweDNGNDMwMywgMHg0QTlBNzAsIDB4Mjg0MDYwLCAweDNGQ0U2MCwgMHgxQUY4MUIsIDB4MjU2ODQ1LAorIDB4M0MxQUE1LCAweDM2MTc5RCwgMHgyQzZEREQsIDB4MjY5QjNDLCAweDVFNTE1MiwgMHg1NEUyMzcsIDB4NTgyNUZFLCAweDRDNjRBRCwKKyAweDRFQTAwMCwgMHgzOEM0MzcsIDB4M0RDNjc4LCAweDJERTlCNSwgMHgyNzE5RjcsIDB4MTJDMkRCLCAweDFGQTAxOCwgMHgwRkE5NkUsCisgMHgyQkIzOUIsIDB4MjI1NjBDLCAweDIwRDUwMCwgMHgxRkM4QzgsIDB4MURFMDA3LCAweDBGM0FFRSwgMHgxNUU0QjcsIDB4MEQ2Q0ZFLAorfSwKK3sKKyAweDJDMDAwMCwgMHgzRDA3OUUsIDB4NTNFQTc5LCAweDc0NjUwQywgMHgzOTdEMjAsIDB4M0Q3MDgzLCAweDgxOTM4MywgMHg2QkE1MjUsCisgMHgyQzAwMDAsIDB4MjkwRDc1LCAweDYzMkM2MSwgMHg0MUVFQUMsIDB4MjBCRTBDLCAweDEwQjEyMSwgMHgyRDZBM0IsIDB4MUM2QTBDLAorIDB4NUQ2QjU0LCAweDUxREU0MCwgMHg2REYxQzIsIDB4NTY2MUZCLCAweDM4NjQ0QiwgMHgxQ0JGOEYsIDB4M0I4MDYwLCAweDE5REY2RCwKKyAweDYxMDMyNiwgMHg4NjhGNTcsIDB4NTc0RjBCLCAweDc5MTlDQSwgMHg0RkMwMDAsIDB4NkU5RENFLCAweDQ1MjQyMywgMHg1NkU5MjgsCisgMHg2MTAzMjYsIDB4NTc0RjBCLCAweDUxREU0MCwgMHg2MDhCQTAsIDB4MzQxNzEzLCAweDUyOTI5QSwgMHgyMkU2QkEsIDB4MzA2OEQyLAorIDB4NERDODIxLCAweDQ2MDA3MSwgMHgzOTdGMUUsIDB4MzFGNjExLCAweDdBMEVFMiwgMHg2REQ5NzQsIDB4NzIxMzBDLCAweDYyRENBMywKKyAweDY1QzAwMCwgMHg0OTc2NjUsIDB4NEZGMUM5LCAweDNCNkFBRSwgMHgzMjlBMTIsIDB4MTg0Nzc2LCAweDI4RUQ0RCwgMHgxNDQ0QUMsCisgMHgzODhFMTQsIDB4MkM2RjVBLCAweDJBN0QwRiwgMHgyOTIxRjQsIDB4MjZBOTczLCAweDEzQjVBRCwgMHgxQzU1MjgsIDB4MTE1RkRGLAorfSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGJpbmtfaW50ZXJfcXVhbnRbMTZdWzY0XSA9IHsKK3sKKyAweDAxMDAwMCwgMHgwMTc5NDYsIDB4MDFBNUE5LCAweDAyNDhEQywgMHgwMTYzNjMsIDB4MDE1MkE3LCAweDAyNDNFQywgMHgwMjA5RUEsCisgMHgwMTIwMDAsIDB4MDBFMjQ4LCAweDAxQkJEQSwgMHgwMTVDQkMsIDB4MDBBNDg2LCAweDAwNTNFMCwgMHgwMEYwMzYsIDB4MDA4MDk1LAorIDB4MDFCNzAxLCAweDAxNjk1OSwgMHgwMUIwQjksIDB4MDE1M0ZELCAweDAwRjhFNywgMHgwMDdFRTQsIDB4MDBFQTMwLCAweDAwNzc2MywKKyAweDAxQjcwMSwgMHgwMjYwRUIsIDB4MDE5REU5LCAweDAyM0UxQiwgMHgwMTcwMDAsIDB4MDFGRTZFLCAweDAxMkRCNSwgMHgwMUEyN0IsCisgMHgwMUUwRDEsIDB4MDFCMEI5LCAweDAxOEEzMywgMHgwMTcxOEQsIDB4MDBEODdBLCAweDAxNDQ0OSwgMHgwMDdCOUEsIDB4MDBBQjcxLAorIDB4MDEzMTc4LCAweDAxMTJFQSwgMHgwMEFEMDgsIDB4MDA5QkI5LCAweDAyM0Q5NywgMHgwMjA0MzcsIDB4MDIxQ0NDLCAweDAxRTZCNCwKKyAweDAxODAwMCwgMHgwMTJEQjUsIDB4MDE0NkQ5LCAweDAxMDBDRSwgMHgwMENGRDIsIDB4MDA2RTVDLCAweDAwQjBFNCwgMHgwMDVBMkQsCisgMHgwMEU5Q0MsIDB4MDBCN0IxLCAweDAwODQ2RiwgMHgwMDZCODUsIDB4MDA4MzM3LCAweDAwNDJFNSwgMHgwMDRBMTAsIDB4MDAyODMxLAorfSwKK3sKKyAweDAxNTU1NSwgMHgwMUY3MDgsIDB4MDIzMjM3LCAweDAzMEJEMCwgMHgwMUQ5RDksIDB4MDFDMzg5LCAweDAzMDUzQiwgMHgwMkI3RTMsCisgMHgwMTgwMDAsIDB4MDEyREI1LCAweDAyNEZDRSwgMHgwMUQwRkEsIDB4MDBEQjVELCAweDAwNkZENSwgMHgwMTQwNDgsIDB4MDBBQjcxLAorIDB4MDI0OTU3LCAweDAxRTFDQywgMHgwMjQwRjcsIDB4MDFDNTUxLCAweDAxNEJERSwgMHgwMEE5MkYsIDB4MDEzODQwLCAweDAwOUYyRiwKKyAweDAyNDk1NywgMHgwMzJCRTQsIDB4MDIyN0UxLCAweDAyRkQ3QSwgMHgwMUVBQUIsIDB4MDJBODkzLCAweDAxOTI0NywgMHgwMjJERjksCisgMHgwMjgxMTYsIDB4MDI0MEY3LCAweDAyMEQ5OSwgMHgwMUVDQkMsIDB4MDEyMEEzLCAweDAxQjA2MSwgMHgwMEE0Q0UsIDB4MDBFNDk3LAorIDB4MDE5NzRCLCAweDAxNkU4RSwgMHgwMEU2QjUsIDB4MDBDRkEyLCAweDAyRkNDOSwgMHgwMkIwNEEsIDB4MDJEMTEwLCAweDAyODhGMSwKKyAweDAyMDAwMCwgMHgwMTkyNDcsIDB4MDFCM0NDLCAweDAxNTY2OCwgMHgwMTE1MTgsIDB4MDA5MzI1LCAweDAwRUJEQSwgMHgwMDc4M0QsCisgMHgwMTM3QkIsIDB4MDBGNEVELCAweDAwQjA5MywgMHgwMDhGNUMsIDB4MDBBRUY0LCAweDAwNTkzMSwgMHgwMDYyQkYsIDB4MDAzNTk3LAorfSwKK3sKKyAweDAxQUFBQiwgMHgwMjc0Q0IsIDB4MDJCRUM0LCAweDAzQ0VDNCwgMHgwMjUwNEYsIDB4MDIzNDZDLCAweDAzQzY4OSwgMHgwMzY1REMsCisgMHgwMUUwMDAsIDB4MDE3OTIyLCAweDAyRTNDMSwgMHgwMjQ1MzksIDB4MDExMjM1LCAweDAwOEJDQSwgMHgwMTkwNUEsIDB4MDBENjRELAorIDB4MDJEQkFELCAweDAyNUE0MCwgMHgwMkQxMzQsIDB4MDIzNkE1LCAweDAxOUVENiwgMHgwMEQzN0IsIDB4MDE4NjUwLCAweDAwQzZGQiwKKyAweDAyREJBRCwgMHgwM0Y2REQsIDB4MDJCMUQ5LCAweDAzQkNEOCwgMHgwMjY1NTUsIDB4MDM1MkI4LCAweDAxRjZEOCwgMHgwMkI5NzcsCisgMHgwMzIxNUMsIDB4MDJEMTM0LCAweDAyOTEwMCwgMHgwMjY3RUIsIDB4MDE2OENDLCAweDAyMUM3QSwgMHgwMENFMDEsIDB4MDExREJELAorIDB4MDFGRDFFLCAweDAxQ0EzMSwgMHgwMTIwNjIsIDB4MDEwMzhBLCAweDAzQkJGQiwgMHgwMzVDNUMsIDB4MDM4NTU0LCAweDAzMkIyRCwKKyAweDAyODAwMCwgMHgwMUY2RDgsIDB4MDIyMEMwLCAweDAxQUMwMiwgMHgwMTVBNUUsIDB4MDBCN0VGLCAweDAxMjZEMSwgMHgwMDk2NEMsCisgMHgwMTg1QTksIDB4MDEzMjI4LCAweDAwRENCOCwgMHgwMEIzMzMsIDB4MDBEQUIyLCAweDAwNkY3RCwgMHgwMDdCNkYsIDB4MDA0MkZDLAorfSwKK3sKKyAweDAyMDAwMCwgMHgwMkYyOEQsIDB4MDM0QjUyLCAweDA0OTFCOCwgMHgwMkM2QzUsIDB4MDJBNTRFLCAweDA0ODdEOCwgMHgwNDEzRDUsCisgMHgwMjQwMDAsIDB4MDFDNDhGLCAweDAzNzdCNSwgMHgwMkI5NzcsIDB4MDE0OTBDLCAweDAwQTdCRiwgMHgwMUUwNkMsIDB4MDEwMTJBLAorIDB4MDM2RTAzLCAweDAyRDJCMywgMHgwMzYxNzIsIDB4MDJBN0ZBLCAweDAxRjFDRSwgMHgwMEZEQzcsIDB4MDFENDYwLCAweDAwRUVDNywKKyAweDAzNkUwMywgMHgwNEMxRDYsIDB4MDMzQkQxLCAweDA0N0MzNywgMHgwMkUwMDAsIDB4MDNGQ0RELCAweDAyNUI2QSwgMHgwMzQ0RjUsCisgMHgwM0MxQTEsIDB4MDM2MTcyLCAweDAzMTQ2NiwgMHgwMkUzMUIsIDB4MDFCMEY1LCAweDAyODg5MiwgMHgwMEY3MzUsIDB4MDE1NkUyLAorIDB4MDI2MkYxLCAweDAyMjVENSwgMHgwMTVBMTAsIDB4MDEzNzcyLCAweDA0N0IyRCwgMHgwNDA4NkUsIDB4MDQzOTk4LCAweDAzQ0Q2OSwKKyAweDAzMDAwMCwgMHgwMjVCNkEsIDB4MDI4REIzLCAweDAyMDE5QiwgMHgwMTlGQTMsIDB4MDBEQ0I4LCAweDAxNjFDNywgMHgwMEI0NUIsCisgMHgwMUQzOTgsIDB4MDE2RjYzLCAweDAxMDhERCwgMHgwMEQ3MEEsIDB4MDEwNjZGLCAweDAwODVDOSwgMHgwMDk0MUYsIDB4MDA1MDYyLAorfSwKK3sKKyAweDAyQUFBQiwgMHgwM0VFMTEsIDB4MDQ2NDZELCAweDA2MTdBMCwgMHgwM0IzQjIsIDB4MDM4NzEzLCAweDA2MEE3NSwgMHgwNTZGQzYsCisgMHgwMzAwMDAsIDB4MDI1QjZBLCAweDA0OUY5QiwgMHgwM0ExRjQsIDB4MDFCNkJCLCAweDAwREZBQSwgMHgwMjgwOTAsIDB4MDE1NkUyLAorIDB4MDQ5MkFFLCAweDAzQzM5OSwgMHgwNDgxRUQsIDB4MDM4QUEyLCAweDAyOTdCRCwgMHgwMTUyNUYsIDB4MDI3MDgwLCAweDAxM0U1RSwKKyAweDA0OTJBRSwgMHgwNjU3QzgsIDB4MDQ0RkMxLCAweDA1RkFGNCwgMHgwM0Q1NTUsIDB4MDU1MTI2LCAweDAzMjQ4RCwgMHgwNDVCRjIsCisgMHgwNTAyMkQsIDB4MDQ4MUVELCAweDA0MUIzMywgMHgwM0Q5NzksIDB4MDI0MTQ3LCAweDAzNjBDMywgMHgwMTQ5OUMsIDB4MDFDOTJFLAorIDB4MDMyRTk2LCAweDAyREQxQywgMHgwMUNENkEsIDB4MDE5RjQzLCAweDA1Rjk5MSwgMHgwNTYwOTMsIDB4MDVBMjIwLCAweDA1MTFFMSwKKyAweDA0MDAwMCwgMHgwMzI0OEQsIDB4MDM2Nzk5LCAweDAyQUNDRiwgMHgwMjJBMkYsIDB4MDEyNjRCLCAweDAxRDdCNSwgMHgwMEYwNzksCisgMHgwMjZGNzUsIDB4MDFFOUQ5LCAweDAxNjEyNywgMHgwMTFFQjgsIDB4MDE1REU5LCAweDAwQjI2MiwgMHgwMEM1N0YsIDB4MDA2QjJELAorfSwKK3sKKyAweDAzODAwMCwgMHgwNTI4NzYsIDB4MDVDM0NGLCAweDA3RkYwMiwgMHgwNERCRDksIDB4MDRBMTQ4LCAweDA3RURCQSwgMHgwNzIyQjQsCisgMHgwM0YwMDAsIDB4MDMxN0ZCLCAweDA2MTE3QywgMHgwNEM0OTEsIDB4MDIzRkQ1LCAweDAxMjU4RiwgMHgwMzQ4QkQsIDB4MDFDMjA5LAorIDB4MDYwMDg1LCAweDA0RjBCOSwgMHgwNUVBODcsIDB4MDRBNUY1LCAweDAzNjcyOCwgMHgwMUJDMUMsIDB4MDMzM0E4LCAweDAxQTFEQiwKKyAweDA2MDA4NSwgMHgwODUzMzYsIDB4MDVBOEFFLCAweDA3RDk2MCwgMHgwNTA4MDAsIDB4MDZGQTgyLCAweDA0MUZGOSwgMHgwNUI4QUUsCisgMHgwNjkyREEsIDB4MDVFQTg3LCAweDA1NjNCMiwgMHgwNTBENkUsIDB4MDJGNUFELCAweDA0NkYwMCwgMHgwMUIwOUMsIDB4MDI1ODBDLAorIDB4MDQyRDI1LCAweDAzQzIzNSwgMHgwMjVEOUIsIDB4MDIyMTA4LCAweDA3RDc4RiwgMHgwNzBFQzEsIDB4MDc2NENBLCAweDA2QTc3NywKKyAweDA1NDAwMCwgMHgwNDFGRjksIDB4MDQ3N0Y5LCAweDAzODJEMCwgMHgwMkQ3NUUsIDB4MDE4MjQyLCAweDAyNkIxRCwgMHgwMTNCOUYsCisgMHgwMzMyNEEsIDB4MDI4MkVELCAweDAxQ0Y4MywgMHgwMTc4NTEsIDB4MDFDQjQyLCAweDAwRUEyMSwgMHgwMTAzMzYsIDB4MDA4Q0FDLAorfSwKK3sKKyAweDA0MDAwMCwgMHgwNUU1MTksIDB4MDY5NkE0LCAweDA5MjM3MCwgMHgwNThEOEEsIDB4MDU0QTlDLCAweDA5MEZCMCwgMHgwODI3QUEsCisgMHgwNDgwMDAsIDB4MDM4OTFGLCAweDA2RUY2OSwgMHgwNTcyRUUsIDB4MDI5MjE4LCAweDAxNEY3RSwgMHgwM0MwRDgsIDB4MDIwMjU0LAorIDB4MDZEQzA1LCAweDA1QTU2NSwgMHgwNkMyRTQsIDB4MDU0RkYzLCAweDAzRTM5QiwgMHgwMUZCOEUsIDB4MDNBOEMwLCAweDAxREQ4RCwKKyAweDA2REMwNSwgMHgwOTgzQUMsIDB4MDY3N0EyLCAweDA4Rjg2RSwgMHgwNUMwMDAsIDB4MDdGOUI5LCAweDA0QjZENCwgMHgwNjg5RUIsCisgMHgwNzgzNDMsIDB4MDZDMkU0LCAweDA2MjhDQywgMHgwNUM2MzUsIDB4MDM2MUVBLCAweDA1MTEyNCwgMHgwMUVFNjksIDB4MDJBREM1LAorIDB4MDRDNUUxLCAweDA0NEJBQSwgMHgwMkI0MUYsIDB4MDI2RUU1LCAweDA4RjY1QSwgMHgwODEwREQsIDB4MDg3MzMwLCAweDA3OUFEMSwKKyAweDA2MDAwMCwgMHgwNEI2RDQsIDB4MDUxQjY1LCAweDA0MDMzNywgMHgwMzNGNDcsIDB4MDFCOTcwLCAweDAyQzM4RiwgMHgwMTY4QjYsCisgMHgwM0E3MzAsIDB4MDJERUM2LCAweDAyMTFCQSwgMHgwMUFFMTQsIDB4MDIwQ0RELCAweDAxMEI5MywgMHgwMTI4M0UsIDB4MDBBMEM0LAorfSwKK3sKKyAweDA1MDAwMCwgMHgwNzVFNjAsIDB4MDgzQzRELCAweDBCNkM0QywgMHgwNkYwRUQsIDB4MDY5RDQzLCAweDBCNTM5QywgMHgwQTMxOTQsCisgMHgwNUEwMDAsIDB4MDQ2QjY3LCAweDA4QUI0NCwgMHgwNkNGQUEsIDB4MDMzNjlFLCAweDAxQTM1RSwgMHgwNEIxMEYsIDB4MDI4MkU4LAorIDB4MDg5MzA3LCAweDA3MEVCRiwgMHgwODczOUMsIDB4MDZBM0YwLCAweDA0REM4MiwgMHgwMjdBNzIsIDB4MDQ5MkYwLCAweDAyNTRGMCwKKyAweDA4OTMwNywgMHgwQkU0OTcsIDB4MDgxNThCLCAweDBCMzY4OSwgMHgwNzMwMDAsIDB4MDlGODI3LCAweDA1RTQ4OSwgMHgwODJDNjYsCisgMHgwOTY0MTMsIDB4MDg3MzlDLCAweDA3QjJGRiwgMHgwNzM3QzIsIDB4MDQzQTY0LCAweDA2NTU2RCwgMHgwMjZBMDQsIDB4MDM1OTM2LAorIDB4MDVGNzVBLCAweDA1NUU5NCwgMHgwMzYxMjcsIDB4MDMwQTlFLCAweDBCMzNGMSwgMHgwQTE1MTQsIDB4MEE4RkZDLCAweDA5ODE4NiwKKyAweDA3ODAwMCwgMHgwNUU0ODksIDB4MDY2MjNGLCAweDA1MDQwNSwgMHgwNDBGMTksIDB4MDIyN0NDLCAweDAzNzQ3MywgMHgwMUMyRTMsCisgMHgwNDkwRkMsIDB4MDM5Njc3LCAweDAyOTYyOSwgMHgwMjE5OTksIDB4MDI5MDE1LCAweDAxNEU3OCwgMHgwMTcyNEUsIDB4MDBDOEY1LAorfSwKK3sKKyAweDA2MDAwMCwgMHgwOEQ3QTYsIDB4MDlFMUY2LCAweDBEQjUyOCwgMHgwODU0NTAsIDB4MDdFRkVBLCAweDBEOTc4OCwgMHgwQzNCN0UsCisgMHgwNkMwMDAsIDB4MDU0REFFLCAweDBBNjcxRSwgMHgwODJDNjYsIDB4MDNEQjI0LCAweDAxRjczRSwgMHgwNUExNDUsIDB4MDMwMzdELAorIDB4MEE0QTA4LCAweDA4NzgxOCwgMHgwQTI0NTUsIDB4MDdGN0VELCAweDA1RDU2OSwgMHgwMkY5NTUsIDB4MDU3RDIwLCAweDAyQ0M1NCwKKyAweDBBNEEwOCwgMHgwRTQ1ODIsIDB4MDlCMzczLCAweDBENzRBNSwgMHgwOEEwMDAsIDB4MEJGNjk2LCAweDA3MTIzRSwgMHgwOUNFRTAsCisgMHgwQjQ0RTQsIDB4MEEyNDU1LCAweDA5M0QzMiwgMHgwOEE5NTAsIDB4MDUxMkRGLCAweDA3OTlCNiwgMHgwMkU1OUUsIDB4MDQwNEE3LAorIDB4MDcyOEQyLCAweDA2NzE3RiwgMHgwNDBFMkYsIDB4MDNBNjU3LCAweDBENzE4NywgMHgwQzE5NEIsIDB4MENBQ0M4LCAweDBCNjgzQSwKKyAweDA5MDAwMCwgMHgwNzEyM0UsIDB4MDdBOTE4LCAweDA2MDREMiwgMHgwNERFRUEsIDB4MDI5NjI5LCAweDA0MjU1NiwgMHgwMjFEMTEsCisgMHgwNTdBQzgsIDB4MDQ0RTI4LCAweDAzMUE5NywgMHgwMjg1MUUsIDB4MDMxMzRDLCAweDAxOTE1QywgMHgwMUJDNUQsIDB4MDBGMTI2LAorfSwKK3sKKyAweDA4MDAwMCwgMHgwQkNBMzMsIDB4MEQyRDQ4LCAweDEyNDZFMCwgMHgwQjFCMTUsIDB4MEE5NTM4LCAweDEyMUY1RiwgMHgxMDRGNTMsCisgMHgwOTAwMDAsIDB4MDcxMjNFLCAweDBEREVEMiwgMHgwQUU1REQsIDB4MDUyNDMwLCAweDAyOUVGRCwgMHgwNzgxQjEsIDB4MDQwNEE3LAorIDB4MERCODBCLCAweDBCNEFDQiwgMHgwRDg1QzcsIDB4MEE5RkU3LCAweDA3QzczNiwgMHgwM0Y3MUQsIDB4MDc1MTgwLCAweDAzQkIxQSwKKyAweDBEQjgwQiwgMHgxMzA3NTcsIDB4MENFRjQ0LCAweDExRjBEQywgMHgwQjgwMDAsIDB4MEZGMzcyLCAweDA5NkRBOCwgMHgwRDEzRDYsCisgMHgwRjA2ODYsIDB4MEQ4NUM3LCAweDBDNTE5OCwgMHgwQjhDNkEsIDB4MDZDM0Q0LCAweDBBMjI0OCwgMHgwM0RDRDMsIDB4MDU1QjhBLAorIDB4MDk4QkMzLCAweDA4OTc1NCwgMHgwNTY4M0UsIDB4MDREREM5LCAweDExRUNCNCwgMHgxMDIxQjksIDB4MTBFNjYxLCAweDBGMzVBMywKKyAweDBDMDAwMCwgMHgwOTZEQTgsIDB4MEEzNkNCLCAweDA4MDY2RSwgMHgwNjdFOEUsIDB4MDM3MkUxLCAweDA1ODcxRSwgMHgwMkQxNkIsCisgMHgwNzRFNjAsIDB4MDVCRDhCLCAweDA0MjM3NCwgMHgwMzVDMjgsIDB4MDQxOUJCLCAweDAyMTcyNiwgMHgwMjUwN0MsIDB4MDE0MTg4LAorfSwKK3sKKyAweDBDMDAwMCwgMHgxMUFGNEMsIDB4MTNDM0VDLCAweDFCNkE1MCwgMHgxMEE4OUYsIDB4MEZERkQ0LCAweDFCMkYwRiwgMHgxODc2RkQsCisgMHgwRDgwMDAsIDB4MEE5QjVELCAweDE0Q0UzQywgMHgxMDU4Q0IsIDB4MDdCNjQ5LCAweDAzRUU3QiwgMHgwQjQyODksIDB4MDYwNkZCLAorIDB4MTQ5NDEwLCAweDEwRjAzMCwgMHgxNDQ4QUIsIDB4MEZFRkRBLCAweDBCQUFEMiwgMHgwNUYyQUIsIDB4MEFGQTQwLCAweDA1OThBNywKKyAweDE0OTQxMCwgMHgxQzhCMDMsIDB4MTM2NkU2LCAweDFBRTk0OSwgMHgxMTQwMDAsIDB4MTdFRDJCLCAweDBFMjQ3QywgMHgxMzlEQzEsCisgMHgxNjg5QzgsIDB4MTQ0OEFCLCAweDEyN0E2MywgMHgxMTUyOUYsIDB4MEEyNUJFLCAweDBGMzM2RCwgMHgwNUNCM0MsIDB4MDgwOTRFLAorIDB4MEU1MUE0LCAweDBDRTJGRSwgMHgwODFDNUQsIDB4MDc0Q0FFLCAweDFBRTMwRSwgMHgxODMyOTYsIDB4MTk1OTkxLCAweDE2RDA3NCwKKyAweDEyMDAwMCwgMHgwRTI0N0MsIDB4MEY1MjMwLCAweDBDMDlBNSwgMHgwOUJERDUsIDB4MDUyQzUxLCAweDA4NEFBQywgMHgwNDNBMjEsCisgMHgwQUY1OTAsIDB4MDg5QzUxLCAweDA2MzUyRSwgMHgwNTBBM0IsIDB4MDYyNjk4LCAweDAzMjJCOSwgMHgwMzc4QkEsIDB4MDFFMjRELAorfSwKK3sKKyAweDExMDAwMCwgMHgxOTBEQUMsIDB4MUMwMDM5LCAweDI2RDY5QywgMHgxNzk5OEMsIDB4MTY3RDE2LCAweDI2ODJBQiwgMHgyMkE4OTEsCisgMHgxMzIwMDAsIDB4MEYwNkMzLCAweDFENzk3RiwgMHgxNzI4NzYsIDB4MEFFQ0U3LCAweDA1OTFEOSwgMHgwRkYzOTgsIDB4MDg4OUUzLAorIDB4MUQyNzE3LCAweDE3RkVFRiwgMHgxQ0JDNDcsIDB4MTY5M0NBLCAweDEwODc1NCwgMHgwODZEMUQsIDB4MEY4RDMwLCAweDA3RUQ5OCwKKyAweDFEMjcxNywgMHgyODZGOUEsIDB4MUI3QzcxLCAweDI2MUZEMywgMHgxODcwMDAsIDB4MjFFNTUyLCAweDE0MDkwNCwgMHgxQkNBMjcsCisgMHgxRkVEREMsIDB4MUNCQzQ3LCAweDFBMkQ2MiwgMHgxODhBNjIsIDB4MEU2MDIyLCAweDE1ODhEQSwgMHgwODM1NDAsIDB4MEI2Mjg0LAorIDB4MTQ0OEZFLCAweDEyNDE5MiwgMHgwQjdEODQsIDB4MEE1NzRCLCAweDI2MTZGRiwgMHgyMjQ3QUEsIDB4MjNFOThELCAweDIwNTFGQSwKKyAweDE5ODAwMCwgMHgxNDA5MDQsIDB4MTVCNDZGLCAweDExMERBQSwgMHgwRENDRUUsIDB4MDc1NDFFLCAweDBCQkYxRiwgMHgwNUZEMDQsCisgMHgwRjg2OEIsIDB4MEMzMkM4LCAweDA4Q0I1NywgMHgwNzIzRDQsIDB4MDhCNkFELCAweDA0NzEzMCwgMHgwNEVCMDgsIDB4MDJBQjQyLAorfSwKK3sKKyAweDE2MDAwMCwgMHgyMDZDMEMsIDB4MjQzQzg2LCAweDMyNDJFOCwgMHgxRThBNzksIDB4MUQxQTU5LCAweDMxRDY0NiwgMHgyQ0RBMjUsCisgMHgxOEMwMDAsIDB4MTM3MjJBLCAweDI2MjRDMywgMHgxREY4MjAsIDB4MEUyMzg1LCAweDA3MzUzNywgMHgxNEE0QTcsIDB4MEIwQ0NDLAorIDB4MjVCQTFELCAweDFGMERBRSwgMHgyNTJGRTQsIDB4MUQzN0JCLCAweDE1NjNENiwgMHgwQUU3OEUsIDB4MTQyMDIxLCAweDBBNDI4OCwKKyAweDI1QkExRCwgMHgzNDU0MzAsIDB4MjM5MUZCLCAweDMxNTY1QywgMHgxRkEwMDAsIDB4MkJERDdBLCAweDE5RUQ4RCwgMHgyM0Y2OEMsCisgMHgyOTUxRUYsIDB4MjUyRkU0LCAweDIxRTA2MSwgMHgxRkMyMjQsIDB4MTI5QTg3LCAweDFCREU0NywgMHgwQTlGNDQsIDB4MEVCQkJBLAorIDB4MUE0MDU4LCAweDE3QTAyNiwgMHgwRURFQUIsIDB4MEQ2MUU5LCAweDMxNEFFRiwgMHgyQzVDQkUsIDB4MkU3OThBLCAweDI5RDM4MCwKKyAweDIxMDAwMCwgMHgxOUVEOEQsIDB4MUMxNkFFLCAweDE2MTFBRSwgMHgxMURDMDYsIDB4MDk3QkVBLCAweDBGMzM5MSwgMHgwN0JGRTcsCisgMHgxNDE3ODcsIDB4MEZDOTNFLCAweDBCNjE3RiwgMHgwOTNENkQsIDB4MEI0NkMxLCAweDA1QkZBOCwgMHgwNjVENTUsIDB4MDM3NDM3LAorfSwKK3sKKyAweDFDMDAwMCwgMHgyOTQzQjIsIDB4MkUxRTdDLCAweDNGRjgxMCwgMHgyNkRFQzksIDB4MjUwQTQzLCAweDNGNkRDRSwgMHgzOTE1QTMsCisgMHgxRjgwMDAsIDB4MThCRkQ4LCAweDMwOEJFMSwgMHgyNjI0ODUsIDB4MTFGRUE5LCAweDA5MkM3NSwgMHgxQTQ1RUIsIDB4MEUxMDQ5LAorIDB4MzAwNDI1LCAweDI3ODVDNiwgMHgyRjU0MzksIDB4MjUyRkE4LCAweDFCMzkzRiwgMHgwREUwRTQsIDB4MTk5RDQxLCAweDBEMEVEQywKKyAweDMwMDQyNSwgMHg0Mjk5QjIsIDB4MkQ0NTZFLCAweDNFQ0IwMCwgMHgyODQwMDAsIDB4MzdENDBGLCAweDIwRkZDQiwgMHgyREM1NkQsCisgMHgzNDk2RDMsIDB4MkY1NDM5LCAweDJCMUQ5MywgMHgyODZCNzQsIDB4MTdBRDY2LCAweDIzNzdGRSwgMHgwRDg0RTIsIDB4MTJDMDYyLAorIDB4MjE2OTJBLCAweDFFMTFBNSwgMHgxMkVDREEsIDB4MTEwODQwLCAweDNFQkM3NiwgMHgzODc2MDgsIDB4M0IyNjUyLCAweDM1M0JCQSwKKyAweDJBMDAwMCwgMHgyMEZGQ0IsIDB4MjNCRkM2LCAweDFDMTY4MSwgMHgxNkJBRjEsIDB4MEMxMjEzLCAweDEzNThFOCwgMHgwOURDRjgsCisgMHgxOTkyNEYsIDB4MTQxNzY3LCAweDBFN0MxNiwgMHgwQkMyOEEsIDB4MEU1QTBELCAweDA3NTEwNCwgMHgwODE5QjIsIDB4MDQ2NTVELAorfSwKK3sKKyAweDIyMDAwMCwgMHgzMjFCNTgsIDB4MzgwMDcyLCAweDREQUQzOCwgMHgyRjMzMTgsIDB4MkNGQTJELCAweDREMDU1NiwgMHg0NTUxMjIsCisgMHgyNjQwMDAsIDB4MUUwRDg2LCAweDNBRjJGRSwgMHgyRTUwRUIsIDB4MTVEOUNFLCAweDBCMjNCMiwgMHgxRkU3MzAsIDB4MTExM0M3LAorIDB4M0E0RTJELCAweDJGRkRERiwgMHgzOTc4OEUsIDB4MkQyNzk1LCAweDIxMEVBOCwgMHgxMERBMzksIDB4MUYxQTYxLCAweDBGREIyRiwKKyAweDNBNEUyRCwgMHg1MERGMzMsIDB4MzZGOEUxLCAweDRDM0ZBNSwgMHgzMEUwMDAsIDB4NDNDQUE1LCAweDI4MTIwOSwgMHgzNzk0NEQsCisgMHgzRkRCQjcsIDB4Mzk3ODhFLCAweDM0NUFDNCwgMHgzMTE0QzMsIDB4MUNDMDQ0LCAweDJCMTFCNCwgMHgxMDZBODAsIDB4MTZDNTA5LAorIDB4Mjg5MUZDLCAweDI0ODMyNCwgMHgxNkZCMDgsIDB4MTRBRTk3LCAweDRDMkRGRCwgMHg0NDhGNTQsIDB4NDdEMzFCLCAweDQwQTNGNSwKKyAweDMzMDAwMCwgMHgyODEyMDksIDB4MkI2OERGLCAweDIyMUI1MywgMHgxQjk5REIsIDB4MEVBODNCLCAweDE3N0UzRSwgMHgwQkZBMDksCisgMHgxRjBEMTcsIDB4MTg2NThGLCAweDExOTZBRSwgMHgwRTQ3QTgsIDB4MTE2RDVBLCAweDA4RTI2MCwgMHgwOUQ2MEYsIDB4MDU1Njg0LAorfSwKK3sKKyAweDJDMDAwMCwgMHg0MEQ4MTgsIDB4NDg3OTBDLCAweDY0ODVEMCwgMHgzRDE0RjIsIDB4M0EzNEIyLCAweDYzQUM4RCwgMHg1OUI0NEEsCisgMHgzMTgwMDAsIDB4MjZFNDU0LCAweDRDNDk4NiwgMHgzQkYwM0YsIDB4MUM0NzBBLCAweDBFNkE2RSwgMHgyOTQ5NEQsIDB4MTYxOTk4LAorIDB4NEI3NDNBLCAweDNFMUI1QywgMHg0QTVGQzcsIDB4M0E2Rjc1LCAweDJBQzdBQywgMHgxNUNGMUQsIDB4Mjg0MDQxLCAweDE0ODUxMCwKKyAweDRCNzQzQSwgMHg2OEE4NjEsIDB4NDcyM0Y2LCAweDYyQUNCOCwgMHgzRjQwMDAsIDB4NTdCQUYzLCAweDMzREIxQSwgMHg0N0VEMTksCisgMHg1MkEzREUsIDB4NEE1RkM3LCAweDQzQzBDMiwgMHgzRjg0NDgsIDB4MjUzNTBELCAweDM3QkM4RSwgMHgxNTNFODcsIDB4MUQ3Nzc1LAorIDB4MzQ4MEIwLCAweDJGNDA0QywgMHgxREJENTYsIDB4MUFDM0QyLCAweDYyOTVERSwgMHg1OEI5N0IsIDB4NUNGMzEzLCAweDUzQTcwMSwKKyAweDQyMDAwMCwgMHgzM0RCMUEsIDB4MzgyRDVDLCAweDJDMjM1RCwgMHgyM0I4MEQsIDB4MTJGN0Q0LCAweDFFNjcyMywgMHgwRjdGQ0YsCisgMHgyODJGMEUsIDB4MUY5MjdELCAweDE2QzJGRiwgMHgxMjdBRDksIDB4MTY4RDgzLCAweDBCN0Y1MCwgMHgwQ0JBQUEsIDB4MDZFODZFLAorfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpbmtiX3J1bmJpdHNbNjRdID0geworICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKyAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgMywgMywgMywgMywgMiwgMiwgMSwgMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpbmtiX2ludHJhX3NlZWRbNjRdID0geworICAgIDE2LCAxNiwgMTYsIDE5LCAxNiwgMTksIDIyLCAyMiwKKyAgICAyMiwgMjIsIDI2LCAyNCwgMjYsIDIyLCAyMiwgMjcsCisgICAgMjcsIDI3LCAyNiwgMjYsIDI2LCAyOSwgMjksIDI5LAorICAgIDI3LCAyNywgMjcsIDI2LCAzNCwgMzQsIDM0LCAyOSwKKyAgICAyOSwgMjksIDI3LCAyNywgMzcsIDM0LCAzNCwgMzIsCisgICAgMzIsIDI5LCAyOSwgMzgsIDM3LCAzNSwgMzUsIDM0LAorICAgIDM1LCA0MCwgNDAsIDQwLCAzOCwgMzgsIDQ4LCA0OCwKKyAgICA0NiwgNDYsIDU4LCA1NiwgNTYsIDY5LCA2OSwgODMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaW5rYl9pbnRlcl9zZWVkWzY0XSA9IHsKKyAgICAxNiwgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOSwgMTksCisgICAgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIxLAorICAgIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwKKyAgICAyMiwgMjIsIDIyLCAyMiwgMjMsIDIzLCAyMywgMjMsCisgICAgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI1LAorICAgIDI0LCAyNCwgMjQsIDI1LCAyNiwgMjYsIDI2LCAyNiwKKyAgICAyNSwgMjcsIDI3LCAyNywgMjcsIDI3LCAyOCwgMjgsCisgICAgMjgsIDI4LCAzMCwgMzAsIDMwLCAzMSwgMzEsIDMzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmlua2JfbnVtWzE2XSA9IHsKKyAgICAxLCA0LCA1LCAyLCA3LCA4LCAzLCA3LCA0LCA5LCA1LCA2LCA3LCA4LCA5LCAxMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmlua2JfZGVuWzE2XSA9IHsKKyAgICAxLCAzLCAzLCAxLCAzLCAzLCAxLCAyLCAxLCAyLCAxLCAxLCAxLCAxLCAxLCAxCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19CSU5LREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9iaW5rZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9iaW5rZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3MGUyMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Jpbmtkc3AuYwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIEJpbmsgRFNQIHJvdXRpbmVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBCaW5rIERTUCByb3V0aW5lcworICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImJpbmtkc3AuaCIKKworI2RlZmluZSBBMSAgMjg5NiAvKiAoMS9zcXJ0KDIpKTw8MTIgKi8KKyNkZWZpbmUgQTIgIDIyMTcKKyNkZWZpbmUgQTMgIDM3ODQKKyNkZWZpbmUgQTQgLTUzNTIKKworI2RlZmluZSBJRENUX1RSQU5TRk9STShkZXN0LHMwLHMxLHMyLHMzLHM0LHM1LHM2LHM3LGQwLGQxLGQyLGQzLGQ0LGQ1LGQ2LGQ3LG11bmdlLHNyYykge1wKKyAgICBjb25zdCBpbnQgYTAgPSAoc3JjKVtzMF0gKyAoc3JjKVtzNF07IFwKKyAgICBjb25zdCBpbnQgYTEgPSAoc3JjKVtzMF0gLSAoc3JjKVtzNF07IFwKKyAgICBjb25zdCBpbnQgYTIgPSAoc3JjKVtzMl0gKyAoc3JjKVtzNl07IFwKKyAgICBjb25zdCBpbnQgYTMgPSAoQTEqKChzcmMpW3MyXSAtIChzcmMpW3M2XSkpID4+IDExOyBcCisgICAgY29uc3QgaW50IGE0ID0gKHNyYylbczVdICsgKHNyYylbczNdOyBcCisgICAgY29uc3QgaW50IGE1ID0gKHNyYylbczVdIC0gKHNyYylbczNdOyBcCisgICAgY29uc3QgaW50IGE2ID0gKHNyYylbczFdICsgKHNyYylbczddOyBcCisgICAgY29uc3QgaW50IGE3ID0gKHNyYylbczFdIC0gKHNyYylbczddOyBcCisgICAgY29uc3QgaW50IGIwID0gYTQgKyBhNjsgXAorICAgIGNvbnN0IGludCBiMSA9IChBMyooYTUgKyBhNykpID4+IDExOyBcCisgICAgY29uc3QgaW50IGIyID0gKChBNCphNSkgPj4gMTEpIC0gYjAgKyBiMTsgXAorICAgIGNvbnN0IGludCBiMyA9IChBMSooYTYgLSBhNCkgPj4gMTEpIC0gYjI7IFwKKyAgICBjb25zdCBpbnQgYjQgPSAoKEEyKmE3KSA+PiAxMSkgKyBiMyAtIGIxOyBcCisgICAgKGRlc3QpW2QwXSA9IG11bmdlKGEwK2EyICAgK2IwKTsgXAorICAgIChkZXN0KVtkMV0gPSBtdW5nZShhMSthMy1hMitiMik7IFwKKyAgICAoZGVzdClbZDJdID0gbXVuZ2UoYTEtYTMrYTIrYjMpOyBcCisgICAgKGRlc3QpW2QzXSA9IG11bmdlKGEwLWEyICAgLWI0KTsgXAorICAgIChkZXN0KVtkNF0gPSBtdW5nZShhMC1hMiAgICtiNCk7IFwKKyAgICAoZGVzdClbZDVdID0gbXVuZ2UoYTEtYTMrYTItYjMpOyBcCisgICAgKGRlc3QpW2Q2XSA9IG11bmdlKGExK2EzLWEyLWIyKTsgXAorICAgIChkZXN0KVtkN10gPSBtdW5nZShhMCthMiAgIC1iMCk7IFwKK30KKy8qIGVuZCBJRENUX1RSQU5TRk9STSBtYWNybyAqLworCisjZGVmaW5lIE1VTkdFX05PTkUoeCkgKHgpCisjZGVmaW5lIElEQ1RfQ09MKGRlc3Qsc3JjKSBJRENUX1RSQU5TRk9STShkZXN0LDAsOCwxNiwyNCwzMiw0MCw0OCw1NiwwLDgsMTYsMjQsMzIsNDAsNDgsNTYsTVVOR0VfTk9ORSxzcmMpCisKKyNkZWZpbmUgTVVOR0VfUk9XKHgpICgoKHgpICsgMHg3Rik+PjgpCisjZGVmaW5lIElEQ1RfUk9XKGRlc3Qsc3JjKSBJRENUX1RSQU5TRk9STShkZXN0LDAsMSwyLDMsNCw1LDYsNywwLDEsMiwzLDQsNSw2LDcsTVVOR0VfUk9XLHNyYykKKworc3RhdGljIGlubGluZSB2b2lkIGJpbmtfaWRjdF9jb2woaW50ICpkZXN0LCBjb25zdCBpbnQzMl90ICpzcmMpCit7CisgICAgaWYgKChzcmNbOF18c3JjWzE2XXxzcmNbMjRdfHNyY1szMl18c3JjWzQwXXxzcmNbNDhdfHNyY1s1Nl0pPT0wKSB7CisgICAgICAgIGRlc3RbMF0gID0KKyAgICAgICAgZGVzdFs4XSAgPQorICAgICAgICBkZXN0WzE2XSA9CisgICAgICAgIGRlc3RbMjRdID0KKyAgICAgICAgZGVzdFszMl0gPQorICAgICAgICBkZXN0WzQwXSA9CisgICAgICAgIGRlc3RbNDhdID0KKyAgICAgICAgZGVzdFs1Nl0gPSBzcmNbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgSURDVF9DT0woZGVzdCwgc3JjKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJpbmtfaWRjdF9jKGludDMyX3QgKmJsb2NrKQoreworICAgIGludCBpOworICAgIGludCB0ZW1wWzY0XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIGJpbmtfaWRjdF9jb2woJnRlbXBbaV0sICZibG9ja1tpXSk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBJRENUX1JPVyggKCZibG9ja1s4KmldKSwgKCZ0ZW1wWzgqaV0pICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBiaW5rX2lkY3RfYWRkX2ModWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQzMl90ICpibG9jaykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGJpbmtfaWRjdF9jKGJsb2NrKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBkZXN0ICs9IGxpbmVzaXplLCBibG9jayArPSA4KQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgIGRlc3Rbal0gKz0gYmxvY2tbal07Cit9CisKK3N0YXRpYyB2b2lkIGJpbmtfaWRjdF9wdXRfYyh1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUsIGludDMyX3QgKmJsb2NrKQoreworICAgIGludCBpOworICAgIGludCB0ZW1wWzY0XTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBiaW5rX2lkY3RfY29sKCZ0ZW1wW2ldLCAmYmxvY2tbaV0pOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgSURDVF9ST1coICgmZGVzdFtpKmxpbmVzaXplXSksICgmdGVtcFs4KmldKSApOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2NhbGVfYmxvY2tfYyhjb25zdCB1aW50OF90IHNyY1s2NF0vKmFsaWduIDgqLywgdWludDhfdCAqZHN0LyphbGlnbiA4Ki8sIGludCBsaW5lc2l6ZSkKK3sKKyAgICBpbnQgaSwgajsKKyAgICB1aW50MTZfdCAqZHN0MSA9ICh1aW50MTZfdCAqKSBkc3Q7CisgICAgdWludDE2X3QgKmRzdDIgPSAodWludDE2X3QgKikoZHN0ICsgbGluZXNpemUpOworCisgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBkc3QxW2ldID0gZHN0MltpXSA9IHNyY1tpXSAqIDB4MDEwMTsKKyAgICAgICAgfQorICAgICAgICBzcmMgICs9IDg7CisgICAgICAgIGRzdDEgKz0gbGluZXNpemU7CisgICAgICAgIGRzdDIgKz0gbGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGRfcGl4ZWxzOF9jKHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHBpeGVscywgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX3NpemUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIHBpeGVsc1swXSArPSBibG9ja1swXTsKKyAgICAgICAgcGl4ZWxzWzFdICs9IGJsb2NrWzFdOworICAgICAgICBwaXhlbHNbMl0gKz0gYmxvY2tbMl07CisgICAgICAgIHBpeGVsc1szXSArPSBibG9ja1szXTsKKyAgICAgICAgcGl4ZWxzWzRdICs9IGJsb2NrWzRdOworICAgICAgICBwaXhlbHNbNV0gKz0gYmxvY2tbNV07CisgICAgICAgIHBpeGVsc1s2XSArPSBibG9ja1s2XTsKKyAgICAgICAgcGl4ZWxzWzddICs9IGJsb2NrWzddOworICAgICAgICBwaXhlbHMgICAgKz0gbGluZV9zaXplOworICAgICAgICBibG9jayAgICAgKz0gODsKKyAgICB9Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9iaW5rZHNwX2luaXQoQmlua0RTUENvbnRleHQgKmMpCit7CisgICAgYy0+aWRjdF9hZGQgICAgPSBiaW5rX2lkY3RfYWRkX2M7CisgICAgYy0+aWRjdF9wdXQgICAgPSBiaW5rX2lkY3RfcHV0X2M7CisgICAgYy0+c2NhbGVfYmxvY2sgPSBzY2FsZV9ibG9ja19jOworICAgIGMtPmFkZF9waXhlbHM4ID0gYWRkX3BpeGVsczhfYzsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2Jpbmtkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2Jpbmtkc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE5ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYmlua2RzcC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBCaW5rIERTUCByb3V0aW5lcworICogQ29weXJpZ2h0IChjKSAyMDA5IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQmluayBEU1Agcm91dGluZXMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQklOS0RTUF9ICisjZGVmaW5lIEFWQ09ERUNfQklOS0RTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgQmlua0RTUENvbnRleHQgeworICAgIHZvaWQgKCppZGN0X3B1dCkodWludDhfdCAqZGVzdC8qYWxpZ24gOCovLCBpbnQgbGluZV9zaXplLCBpbnQzMl90ICpibG9jay8qYWxpZ24gMTYqLyk7CisgICAgdm9pZCAoKmlkY3RfYWRkKSh1aW50OF90ICpkZXN0LyphbGlnbiA4Ki8sIGludCBsaW5lX3NpemUsIGludDMyX3QgKmJsb2NrLyphbGlnbiAxNiovKTsKKyAgICB2b2lkICgqc2NhbGVfYmxvY2spKGNvbnN0IHVpbnQ4X3Qgc3JjWzY0XS8qYWxpZ24gOCovLCB1aW50OF90ICpkc3QvKmFsaWduIDgqLywgaW50IGxpbmVzaXplKTsKKyAgICB2b2lkICgqYWRkX3BpeGVsczgpKHVpbnQ4X3QgKnBpeGVscywgaW50MTZfdCAqYmxvY2ssIGludCBsaW5lX3NpemUpOworfSBCaW5rRFNQQ29udGV4dDsKKwordm9pZCBmZl9iaW5rZHNwX2luaXQoQmlua0RTUENvbnRleHQgKmMpOworCisjZW5kaWYgLyogQVZDT0RFQ19CSU5LRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2JpbnRleHQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JpbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2ZjZWIxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYmludGV4dC5jCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogQmluYXJ5IHRleHQgZGVjb2RlcgorICogZVh0ZW5kZWQgQklOYXJ5IHRleHQgKFhCSU4pIGRlY29kZXIKKyAqIGlDRURyYXcgRmlsZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUGV0ZXIgUm9zcyAocHJvc3NAeHZpZC5vcmcpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEJpbmFyeSB0ZXh0IGRlY29kZXIKKyAqIGVYdGVuZGVkIEJJTmFyeSB0ZXh0IChYQklOKSBkZWNvZGVyCisgKiBpQ0VEcmF3IEZpbGUgZGVjb2RlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3hnYV9mb250X2RhdGEuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiY2dhX2RhdGEuaCIKKyNpbmNsdWRlICJiaW50ZXh0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgWGJpbkNvbnRleHQgeworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIGludCBwYWxldHRlWzE2XTsKKyAgICBpbnQgZmxhZ3M7CisgICAgaW50IGZvbnRfaGVpZ2h0OworICAgIGNvbnN0IHVpbnQ4X3QgKmZvbnQ7CisgICAgaW50IHgsIHk7Cit9IFhiaW5Db250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFhiaW5Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpwOworICAgIGludCBpOworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgcCA9IGF2Y3R4LT5leHRyYWRhdGE7CisgICAgaWYgKHApIHsKKyAgICAgICAgcy0+Zm9udF9oZWlnaHQgPSBwWzBdOworICAgICAgICBzLT5mbGFncyA9IHBbMV07CisgICAgICAgIHAgKz0gMjsKKyAgICAgICAgaWYoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMiArICghIShzLT5mbGFncyAmIEJJTlRFWFRfUEFMRVRURSkpKjMqMTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICghIShzLT5mbGFncyAmIEJJTlRFWFRfRk9OVCkpKnMtPmZvbnRfaGVpZ2h0KjI1NikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJub3QgZW5vdWdoIGV4dHJhZGF0YVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmZvbnRfaGVpZ2h0ID0gODsKKyAgICAgICAgcy0+ZmxhZ3MgPSAwOworICAgIH0KKworICAgIGlmICgocy0+ZmxhZ3MgJiBCSU5URVhUX1BBTEVUVEUpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBzLT5wYWxldHRlW2ldID0gMHhGRjAwMDAwMCB8IChBVl9SQjI0KHApIDw8IDIpIHwgKChBVl9SQjI0KHApID4+IDQpICYgMHgzMDMwMyk7CisgICAgICAgICAgICBwICs9IDM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIHMtPnBhbGV0dGVbaV0gPSAweEZGMDAwMDAwIHwgZmZfY2dhX3BhbGV0dGVbaV07CisgICAgfQorCisgICAgaWYgKChzLT5mbGFncyAmIEJJTlRFWFRfRk9OVCkpIHsKKyAgICAgICAgcy0+Zm9udCA9IHA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoKHMtPmZvbnRfaGVpZ2h0KSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZm9udCBoZWlnaHQgJWkgbm90IHN1cHBvcnRlZFxuIiwgcy0+Zm9udF9oZWlnaHQpOworICAgICAgICAgICAgcy0+Zm9udF9oZWlnaHQgPSA4OworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBzLT5mb250ID0gYXZwcml2X2NnYV9mb250OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICBzLT5mb250ID0gYXZwcml2X3ZnYTE2X2ZvbnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgREVGQVVMVF9CR19DT0xPUiAwCithdl91bnVzZWQgc3RhdGljIHZvaWQgaHNjcm9sbChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgWGJpbkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGlmIChzLT55IDwgYXZjdHgtPmhlaWdodCAtIHMtPmZvbnRfaGVpZ2h0KSB7CisgICAgICAgIHMtPnkgKz0gcy0+Zm9udF9oZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtbW92ZShzLT5mcmFtZS0+ZGF0YVswXSwgcy0+ZnJhbWUtPmRhdGFbMF0gKyBzLT5mb250X2hlaWdodCpzLT5mcmFtZS0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAoYXZjdHgtPmhlaWdodCAtIHMtPmZvbnRfaGVpZ2h0KSpzLT5mcmFtZS0+bGluZXNpemVbMF0pOworICAgICAgICBtZW1zZXQocy0+ZnJhbWUtPmRhdGFbMF0gKyAoYXZjdHgtPmhlaWdodCAtIHMtPmZvbnRfaGVpZ2h0KSpzLT5mcmFtZS0+bGluZXNpemVbMF0sCisgICAgICAgICAgICBERUZBVUxUX0JHX0NPTE9SLCBzLT5mb250X2hlaWdodCAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgfQorfQorCisjZGVmaW5lIEZPTlRfV0lEVEggOAorCisvKioKKyAqIERyYXcgY2hhcmFjdGVyIHRvIHNjcmVlbgorICovCitzdGF0aWMgdm9pZCBkcmF3X2NoYXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgYywgaW50IGEpCit7CisgICAgWGJpbkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGlmIChzLT55ID4gYXZjdHgtPmhlaWdodCAtIHMtPmZvbnRfaGVpZ2h0KQorICAgICAgICByZXR1cm47CisgICAgZmZfZHJhd19wY19mb250KHMtPmZyYW1lLT5kYXRhWzBdICsgcy0+eSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXSArIHMtPngsCisgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lLT5saW5lc2l6ZVswXSwgcy0+Zm9udCwgcy0+Zm9udF9oZWlnaHQsIGMsCisgICAgICAgICAgICAgICAgICAgIGEgJiAweDBGLCBhID4+IDQpOworICAgIHMtPnggKz0gRk9OVF9XSURUSDsKKyAgICBpZiAocy0+eCA+IGF2Y3R4LT53aWR0aCAtIEZPTlRfV0lEVEgpIHsKKyAgICAgICAgcy0+eCA9IDA7CisgICAgICAgIHMtPnkgKz0gcy0+Zm9udF9oZWlnaHQ7CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFhiaW5Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmK2J1Zl9zaXplOworICAgIGludCByZXQ7CisKKyAgICBzLT54ID0gcy0+eSA9IDA7CisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHMtPmZyYW1lLT5waWN0X3R5cGUgICAgICAgICAgID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcy0+ZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgIG1lbWNweShzLT5mcmFtZS0+ZGF0YVsxXSwgcy0+cGFsZXR0ZSwgMTYgKiA0KTsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWEJJTikgeworICAgICAgICB3aGlsZSAoYnVmICsgMiA8IGJ1Zl9lbmQpIHsKKyAgICAgICAgICAgIGludCBpLGMsYTsKKyAgICAgICAgICAgIGludCB0eXBlICA9ICpidWYgPj4gNjsKKyAgICAgICAgICAgIGludCBjb3VudCA9ICgqYnVmICYgMHgzRikgKyAxOworICAgICAgICAgICAgYnVmKys7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDogLy9ubyBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCAmJiBidWYgKyAxIDwgYnVmX2VuZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRyYXdfY2hhcihhdmN0eCwgYnVmWzBdLCBidWZbMV0pOworICAgICAgICAgICAgICAgICAgICBidWYgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IC8vY2hhcmFjdGVyIGNvbXByZXNzaW9uCisgICAgICAgICAgICAgICAgYyA9ICpidWYrKzsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgJiYgYnVmIDwgYnVmX2VuZDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBkcmF3X2NoYXIoYXZjdHgsIGMsICpidWYrKyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8vYXR0cmlidXRlIGNvbXByZXNzaW9uCisgICAgICAgICAgICAgICAgYSA9ICpidWYrKzsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgJiYgYnVmIDwgYnVmX2VuZDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBkcmF3X2NoYXIoYXZjdHgsICpidWYrKywgYSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IC8vY2hhcmFjdGVyL2F0dHJpYnV0ZSBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgIGMgPSAqYnVmKys7CisgICAgICAgICAgICAgICAgYSA9ICpidWYrKzsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgJiYgYnVmIDwgYnVmX2VuZDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBkcmF3X2NoYXIoYXZjdHgsIGMsIGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSURGKSB7CisgICAgICAgIHdoaWxlIChidWYgKyAyIDwgYnVmX2VuZCkgeworICAgICAgICAgICAgaWYgKEFWX1JMMTYoYnVmKSA9PSAxKSB7CisgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgIGlmIChidWYgKyA2ID4gYnVmX2VuZCkKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWZbMl07IGkrKykKKyAgICAgICAgICAgICAgICAgICBkcmF3X2NoYXIoYXZjdHgsIGJ1Zls0XSwgYnVmWzVdKTsKKyAgICAgICAgICAgICAgIGJ1ZiArPSA2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIGRyYXdfY2hhcihhdmN0eCwgYnVmWzBdLCBidWZbMV0pOworICAgICAgICAgICAgICAgYnVmICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoYnVmICsgMSA8IGJ1Zl9lbmQpIHsKKyAgICAgICAgICAgIGRyYXdfY2hhcihhdmN0eCwgYnVmWzBdLCBidWZbMV0pOworICAgICAgICAgICAgYnVmICs9IDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAqZ290X2ZyYW1lICAgICAgPSAxOworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFhiaW5Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX0JJTlRFWFRfREVDT0RFUgorQVZDb2RlYyBmZl9iaW50ZXh0X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImJpbnRleHQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCaW5hcnkgdGV4dCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9CSU5URVhULAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihYYmluQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CisjZW5kaWYKKyNpZiBDT05GSUdfWEJJTl9ERUNPREVSCitBVkNvZGVjIGZmX3hiaW5fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAieGJpbiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImVYdGVuZGVkIEJJTmFyeSB0ZXh0IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1hCSU4sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFhiaW5Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19JREZfREVDT0RFUgorQVZDb2RlYyBmZl9pZGZfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaWRmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiaUNFRHJhdyB0ZXh0IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0lERiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoWGJpbkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9iaW50ZXh0LmggYi9mZm1wZWcvbGliYXZjb2RlYy9iaW50ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0MjhiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JpbnRleHQuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQmluYXJ5IHRleHQgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIFBldGVyIFJvc3MgKHByb3NzQHh2aWQub3JnKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBCaW5hcnkgdGV4dCBkZWNvZGVyCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0JJTlRFWFRfSAorI2RlZmluZSBBVkNPREVDX0JJTlRFWFRfSAorCisvKiBmbGFnIHZhbHVlcyBwYXNzZWQgYmV0d2VlbiBhdmZvcm1hdCBhbmQgYXZjb2RlYzsKKyAqIHdoaWxlIHRoZXNlIGFyZSBpZGVudGljYWwgdG8gdGhlIFhCSU4gZmxhZ3MsIHRoZXkgYXJlIGFsc28gdXNlZAorICogZm9yIHRoZSBCSU5URVhUIGFuZCBJREYgZGVjb2RlcnMuCisgKi8KKyNkZWZpbmUgQklOVEVYVF9QQUxFVFRFICAweDEKKyNkZWZpbmUgQklOVEVYVF9GT05UICAgICAweDIKKworI2VuZGlmIC8qIEFWQ09ERUNfQklOVEVYVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9iaXRfZGVwdGhfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JpdF9kZXB0aF90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMTg0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9iaXRfZGVwdGhfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDkzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAicm5kX2F2Zy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2lmbmRlZiBCSVRfREVQVEgKKyNkZWZpbmUgQklUX0RFUFRIIDgKKyNlbmRpZgorCisjaWZkZWYgQVZDT0RFQ19CSVRfREVQVEhfVEVNUExBVEVfQworIyAgIHVuZGVmIHBpeGVsCisjICAgdW5kZWYgcGl4ZWwyCisjICAgdW5kZWYgcGl4ZWw0CisjICAgdW5kZWYgZGN0Y29lZgorIyAgIHVuZGVmIElOSVRfQ0xJUAorIyAgIHVuZGVmIG5vX3JuZF9hdmdfcGl4ZWw0CisjICAgdW5kZWYgcm5kX2F2Z19waXhlbDQKKyMgICB1bmRlZiBBVl9STjJQCisjICAgdW5kZWYgQVZfUk40UAorIyAgIHVuZGVmIEFWX1JONFBBCisjICAgdW5kZWYgQVZfV04yUAorIyAgIHVuZGVmIEFWX1dONFAKKyMgICB1bmRlZiBBVl9XTjRQQQorIyAgIHVuZGVmIENMSVAKKyMgICB1bmRlZiBGVU5DCisjICAgdW5kZWYgRlVOQ0MKKyMgICB1bmRlZiBhdl9jbGlwX3BpeGVsCisjICAgdW5kZWYgUElYRUxfU1BMQVRfWDQKKyNlbHNlCisjICAgZGVmaW5lIEFWQ09ERUNfQklUX0RFUFRIX1RFTVBMQVRFX0MKKyNlbmRpZgorCisjaWYgQklUX0RFUFRIID4gOAorIyAgIGRlZmluZSBwaXhlbCAgdWludDE2X3QKKyMgICBkZWZpbmUgcGl4ZWwyIHVpbnQzMl90CisjICAgZGVmaW5lIHBpeGVsNCB1aW50NjRfdAorIyAgIGRlZmluZSBkY3Rjb2VmIGludDMyX3QKKworIyAgIGRlZmluZSBJTklUX0NMSVAKKyMgICBkZWZpbmUgbm9fcm5kX2F2Z19waXhlbDQgbm9fcm5kX2F2ZzY0CisjICAgZGVmaW5lICAgIHJuZF9hdmdfcGl4ZWw0ICAgIHJuZF9hdmc2NAorIyAgIGRlZmluZSBBVl9STjJQICBBVl9STjMyCisjICAgZGVmaW5lIEFWX1JONFAgIEFWX1JONjQKKyMgICBkZWZpbmUgQVZfUk40UEEgQVZfUk42NEEKKyMgICBkZWZpbmUgQVZfV04yUCAgQVZfV04zMgorIyAgIGRlZmluZSBBVl9XTjRQICBBVl9XTjY0CisjICAgZGVmaW5lIEFWX1dONFBBIEFWX1dONjRBCisjICAgZGVmaW5lIFBJWEVMX1NQTEFUX1g0KHgpICgoeCkqMHgwMDAxMDAwMTAwMDEwMDAxVUxMKQorCisjICAgZGVmaW5lIGF2X2NsaXBfcGl4ZWwoYSkgYXZfY2xpcF91aW50cDIoYSwgQklUX0RFUFRIKQorIyAgIGRlZmluZSBDTElQKGEpICAgICAgICAgIGF2X2NsaXBfdWludHAyKGEsIEJJVF9ERVBUSCkKKyNlbHNlCisjICAgZGVmaW5lIHBpeGVsICB1aW50OF90CisjICAgZGVmaW5lIHBpeGVsMiB1aW50MTZfdAorIyAgIGRlZmluZSBwaXhlbDQgdWludDMyX3QKKyMgICBkZWZpbmUgZGN0Y29lZiBpbnQxNl90CisKKyMgICBkZWZpbmUgSU5JVF9DTElQCisjICAgZGVmaW5lIG5vX3JuZF9hdmdfcGl4ZWw0IG5vX3JuZF9hdmczMgorIyAgIGRlZmluZSAgICBybmRfYXZnX3BpeGVsNCAgICBybmRfYXZnMzIKKyMgICBkZWZpbmUgQVZfUk4yUCAgQVZfUk4xNgorIyAgIGRlZmluZSBBVl9STjRQICBBVl9STjMyCisjICAgZGVmaW5lIEFWX1JONFBBIEFWX1JOMzJBCisjICAgZGVmaW5lIEFWX1dOMlAgIEFWX1dOMTYKKyMgICBkZWZpbmUgQVZfV040UCAgQVZfV04zMgorIyAgIGRlZmluZSBBVl9XTjRQQSBBVl9XTjMyQQorIyAgIGRlZmluZSBQSVhFTF9TUExBVF9YNCh4KSAoKHgpKjB4MDEwMTAxMDFVKQorCisjICAgZGVmaW5lIGF2X2NsaXBfcGl4ZWwoYSkgYXZfY2xpcF91aW50OChhKQorIyAgIGRlZmluZSBDTElQKGEpIGF2X2NsaXBfdWludDgoYSkKKyNlbmRpZgorCisjZGVmaW5lIEZVTkMzKGEsIGIsIGMpICBhICMjIF8gIyMgYiAjIyBjCisjZGVmaW5lIEZVTkMyKGEsIGIsIGMpICBGVU5DMyhhLCBiLCBjKQorI2RlZmluZSBGVU5DKGEpICBGVU5DMihhLCBCSVRfREVQVEgsKQorI2RlZmluZSBGVU5DQyhhKSBGVU5DMihhLCBCSVRfREVQVEgsIF9jKQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYml0c3RyZWFtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9iaXRzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQxNjQzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYml0c3RyZWFtLmMKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiBDb21tb24gYml0IGkvbyB1dGlscworICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBMb3JlbiBNZXJyaXR0CisgKgorICogYWx0ZXJuYXRpdmUgYml0c3RyZWFtIHJlYWRlciAmIHdyaXRlciBieSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBiaXRzdHJlYW0gYXBpLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXRvbWljLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisKK2NvbnN0IHVpbnQ4X3QgZmZfbG9nMl9ydW5bNDFdPXsKKyAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLAorIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsCisgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywKKyA4LCA5LDEwLDExLDEyLDEzLDE0LDE1LAorMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsCisyNCwKK307CisKK3ZvaWQgYXZwcml2X2FsaWduX3B1dF9iaXRzKFB1dEJpdENvbnRleHQgKnMpCit7CisgICAgcHV0X2JpdHMocywgcy0+Yml0X2xlZnQgJiA3LCAwKTsKK30KKwordm9pZCBhdnByaXZfcHV0X3N0cmluZyhQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgY2hhciAqc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGVybWluYXRlX3N0cmluZykKK3sKKyAgICB3aGlsZSAoKnN0cmluZykgeworICAgICAgICBwdXRfYml0cyhwYiwgOCwgKnN0cmluZyk7CisgICAgICAgIHN0cmluZysrOworICAgIH0KKyAgICBpZiAodGVybWluYXRlX3N0cmluZykKKyAgICAgICAgcHV0X2JpdHMocGIsIDgsIDApOworfQorCit2b2lkIGF2cHJpdl9jb3B5X2JpdHMoUHV0Qml0Q29udGV4dCAqcGIsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgd29yZHMgPSBsZW5ndGggPj4gNDsKKyAgICBpbnQgYml0cyAgPSBsZW5ndGggJiAxNTsKKyAgICBpbnQgaTsKKworICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKENPTkZJR19TTUFMTCB8fCB3b3JkcyA8IDE2IHx8IHB1dF9iaXRzX2NvdW50KHBiKSAmIDcpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspCisgICAgICAgICAgICBwdXRfYml0cyhwYiwgMTYsIEFWX1JCMTYoc3JjICsgMiAqIGkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBwdXRfYml0c19jb3VudChwYikgJiAzMTsgaSsrKQorICAgICAgICAgICAgcHV0X2JpdHMocGIsIDgsIHNyY1tpXSk7CisgICAgICAgIGZsdXNoX3B1dF9iaXRzKHBiKTsKKyAgICAgICAgbWVtY3B5KHB1dF9iaXRzX3B0cihwYiksIHNyYyArIGksIDIgKiB3b3JkcyAtIGkpOworICAgICAgICBza2lwX3B1dF9ieXRlcyhwYiwgMiAqIHdvcmRzIC0gaSk7CisgICAgfQorCisgICAgcHV0X2JpdHMocGIsIGJpdHMsIEFWX1JCMTYoc3JjICsgMiAqIHdvcmRzKSA+PiAoMTYgLSBiaXRzKSk7Cit9CisKKy8qIFZMQyBkZWNvZGluZyAqLworCisjZGVmaW5lIEdFVF9EQVRBKHYsIHRhYmxlLCBpLCB3cmFwLCBzaXplKSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKil0YWJsZSArIGkgKiB3cmFwOyBcCisgICAgc3dpdGNoKHNpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHYgPSAqKGNvbnN0IHVpbnQ4X3QgKilwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHYgPSAqKGNvbnN0IHVpbnQxNl90ICopcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHYgPSAqKGNvbnN0IHVpbnQzMl90ICopcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworc3RhdGljIGludCBhbGxvY190YWJsZShWTEMgKnZsYywgaW50IHNpemUsIGludCB1c2Vfc3RhdGljKQoreworICAgIGludCBpbmRleCA9IHZsYy0+dGFibGVfc2l6ZTsKKworICAgIHZsYy0+dGFibGVfc2l6ZSArPSBzaXplOworICAgIGlmICh2bGMtPnRhYmxlX3NpemUgPiB2bGMtPnRhYmxlX2FsbG9jYXRlZCkgeworICAgICAgICBpZiAodXNlX3N0YXRpYykKKyAgICAgICAgICAgIGFib3J0KCk7IC8vIGNhbm5vdCBkbyBhbnl0aGluZywgaW5pdF92bGMoKSBpcyB1c2VkIHdpdGggdG9vIGxpdHRsZSBtZW1vcnkKKyAgICAgICAgdmxjLT50YWJsZV9hbGxvY2F0ZWQgKz0gKDEgPDwgdmxjLT5iaXRzKTsKKyAgICAgICAgdmxjLT50YWJsZSA9IGF2X3JlYWxsb2NfZih2bGMtPnRhYmxlLCB2bGMtPnRhYmxlX2FsbG9jYXRlZCwgc2l6ZW9mKFZMQ19UWVBFKSAqIDIpOworICAgICAgICBpZiAoIXZsYy0+dGFibGUpIHsKKyAgICAgICAgICAgIHZsYy0+dGFibGVfYWxsb2NhdGVkID0gMDsKKyAgICAgICAgICAgIHZsYy0+dGFibGVfc2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIG1lbXNldCh2bGMtPnRhYmxlICsgdmxjLT50YWJsZV9hbGxvY2F0ZWQgLSAoMSA8PCB2bGMtPmJpdHMpLCAwLCBzaXplb2YoVkxDX1RZUEUpICogMiA8PCB2bGMtPmJpdHMpOworICAgIH0KKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQzMl90IGJpdHN3YXBfMzIodWludDMyX3QgeCkKK3sKKyAgICByZXR1cm4gKHVpbnQzMl90KWZmX3JldmVyc2VbIHggICAgICAgICYgMHhGRl0gPDwgMjQgfAorICAgICAgICAgICAodWludDMyX3QpZmZfcmV2ZXJzZVsoeCA+PiA4KSAgJiAweEZGXSA8PCAxNiB8CisgICAgICAgICAgICh1aW50MzJfdClmZl9yZXZlcnNlWyh4ID4+IDE2KSAmIDB4RkZdIDw8IDggIHwKKyAgICAgICAgICAgKHVpbnQzMl90KWZmX3JldmVyc2VbIHggPj4gMjRdOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBiaXRzOworICAgIHVpbnQxNl90IHN5bWJvbDsKKyAgICAvKiogY29kZXdvcmQsIHdpdGggdGhlIGZpcnN0IGJpdC10by1iZS1yZWFkIGluIHRoZSBtc2IKKyAgICAgKiAoZXZlbiBpZiBpbnRlbmRlZCBmb3IgYSBsaXR0bGUtZW5kaWFuIGJpdHN0cmVhbSByZWFkZXIpICovCisgICAgdWludDMyX3QgY29kZTsKK30gVkxDY29kZTsKKworc3RhdGljIGludCBjb21wYXJlX3ZsY3NwZWMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBWTENjb2RlICpzYSA9IGEsICpzYiA9IGI7CisgICAgcmV0dXJuIChzYS0+Y29kZSA+PiAxKSAtIChzYi0+Y29kZSA+PiAxKTsKK30KKy8qKgorICogQnVpbGQgVkxDIGRlY29kaW5nIHRhYmxlcyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggZ2V0X3ZsYygpLgorICoKKyAqIEBwYXJhbSB2bGMgICAgICAgICAgICB0aGUgY29udGV4dCB0byBiZSBpbml0dGVkCisgKgorICogQHBhcmFtIHRhYmxlX25iX2JpdHMgIG1heCBsZW5ndGggb2YgdmxjIGNvZGVzIHRvIHN0b3JlIGRpcmVjdGx5IGluIHRoaXMgdGFibGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAoTG9uZ2VyIGNvZGVzIGFyZSBkZWxlZ2F0ZWQgdG8gc3VidGFibGVzLikKKyAqCisgKiBAcGFyYW0gbmJfY29kZXMgICAgICAgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGNvZGVzW10KKyAqCisgKiBAcGFyYW0gY29kZXMgICAgICAgICAgZGVzY3JpcHRpb25zIG9mIHRoZSB2bGMgY29kZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICBUaGVzZSBtdXN0IGJlIG9yZGVyZWQgc3VjaCB0aGF0IGNvZGVzIGdvaW5nIGludG8gdGhlIHNhbWUgc3VidGFibGUgYXJlIGNvbnRpZ3VvdXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgU29ydGluZyBieSBWTENjb2RlLmNvZGUgaXMgc3VmZmljaWVudCwgdGhvdWdoIG5vdCBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBpbnQgYnVpbGRfdGFibGUoVkxDICp2bGMsIGludCB0YWJsZV9uYl9iaXRzLCBpbnQgbmJfY29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgIFZMQ2NvZGUgKmNvZGVzLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IHRhYmxlX3NpemUsIHRhYmxlX2luZGV4LCBpbmRleCwgY29kZV9wcmVmaXgsIHN5bWJvbCwgc3VidGFibGVfYml0czsKKyAgICBpbnQgaSwgaiwgaywgbiwgbmIsIGluYzsKKyAgICB1aW50MzJfdCBjb2RlOworICAgIHZvbGF0aWxlIFZMQ19UWVBFICgqIHZvbGF0aWxlIHRhYmxlKVsyXTsgLy8gdGhlIGRvdWJsZSB2b2xhdGlsZSBpcyBuZWVkZWQgdG8gcHJldmVudCBhIGludGVybmFsIGNvbXBpbGVyIGVycm9yIGluIGdjYyA0LjIKKworICAgIHRhYmxlX3NpemUgPSAxIDw8IHRhYmxlX25iX2JpdHM7CisgICAgaWYgKHRhYmxlX25iX2JpdHMgPiAzMCkKKyAgICAgICByZXR1cm4gLTE7CisgICAgdGFibGVfaW5kZXggPSBhbGxvY190YWJsZSh2bGMsIHRhYmxlX3NpemUsIGZsYWdzICYgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgIGF2X2Rsb2coTlVMTCwgIm5ldyB0YWJsZSBpbmRleD0lZCBzaXplPSVkXG4iLCB0YWJsZV9pbmRleCwgdGFibGVfc2l6ZSk7CisgICAgaWYgKHRhYmxlX2luZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIHRhYmxlX2luZGV4OworICAgIHRhYmxlID0gKHZvbGF0aWxlIFZMQ19UWVBFICgqKVsyXSkmdmxjLT50YWJsZVt0YWJsZV9pbmRleF07CisKKyAgICAvKiBmaXJzdCBwYXNzOiBtYXAgY29kZXMgYW5kIGNvbXB1dGUgYXV4aWxpYXJ5IHRhYmxlIHNpemVzICovCisgICAgZm9yIChpID0gMDsgaSA8IG5iX2NvZGVzOyBpKyspIHsKKyAgICAgICAgbiAgICAgID0gY29kZXNbaV0uYml0czsKKyAgICAgICAgY29kZSAgID0gY29kZXNbaV0uY29kZTsKKyAgICAgICAgc3ltYm9sID0gY29kZXNbaV0uc3ltYm9sOworICAgICAgICBhdl9kbG9nKE5VTEwsICJpPSVkIG49JWQgY29kZT0weCV4XG4iLCBpLCBuLCBjb2RlKTsKKyAgICAgICAgaWYgKG4gPD0gdGFibGVfbmJfYml0cykgeworICAgICAgICAgICAgLyogbm8gbmVlZCB0byBhZGQgYW5vdGhlciB0YWJsZSAqLworICAgICAgICAgICAgaiA9IGNvZGUgPj4gKDMyIC0gdGFibGVfbmJfYml0cyk7CisgICAgICAgICAgICBuYiA9IDEgPDwgKHRhYmxlX25iX2JpdHMgLSBuKTsKKyAgICAgICAgICAgIGluYyA9IDE7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBJTklUX1ZMQ19MRSkgeworICAgICAgICAgICAgICAgIGogPSBiaXRzd2FwXzMyKGNvZGUpOworICAgICAgICAgICAgICAgIGluYyA9IDEgPDwgbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBuYjsgaysrKSB7CisgICAgICAgICAgICAgICAgaW50IGJpdHMgPSB0YWJsZVtqXVsxXTsKKyAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIlNHg6IGNvZGU9JWQgbj0lZFxuIiwgaiwgaSwgbik7CisgICAgICAgICAgICAgICAgaWYgKGJpdHMgIT0gMCAmJiBiaXRzICE9IG4pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImluY29ycmVjdCBjb2Rlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0YWJsZVtqXVsxXSA9IG47IC8vYml0cworICAgICAgICAgICAgICAgIHRhYmxlW2pdWzBdID0gc3ltYm9sOworICAgICAgICAgICAgICAgIGogKz0gaW5jOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZmlsbCBhdXhpbGlhcnkgdGFibGUgcmVjdXJzaXZlbHkgKi8KKyAgICAgICAgICAgIG4gLT0gdGFibGVfbmJfYml0czsKKyAgICAgICAgICAgIGNvZGVfcHJlZml4ID0gY29kZSA+PiAoMzIgLSB0YWJsZV9uYl9iaXRzKTsKKyAgICAgICAgICAgIHN1YnRhYmxlX2JpdHMgPSBuOworICAgICAgICAgICAgY29kZXNbaV0uYml0cyA9IG47CisgICAgICAgICAgICBjb2Rlc1tpXS5jb2RlID0gY29kZSA8PCB0YWJsZV9uYl9iaXRzOworICAgICAgICAgICAgZm9yIChrID0gaSsxOyBrIDwgbmJfY29kZXM7IGsrKykgeworICAgICAgICAgICAgICAgIG4gPSBjb2Rlc1trXS5iaXRzIC0gdGFibGVfbmJfYml0czsKKyAgICAgICAgICAgICAgICBpZiAobiA8PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjb2RlID0gY29kZXNba10uY29kZTsKKyAgICAgICAgICAgICAgICBpZiAoY29kZSA+PiAoMzIgLSB0YWJsZV9uYl9iaXRzKSAhPSBjb2RlX3ByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY29kZXNba10uYml0cyA9IG47CisgICAgICAgICAgICAgICAgY29kZXNba10uY29kZSA9IGNvZGUgPDwgdGFibGVfbmJfYml0czsKKyAgICAgICAgICAgICAgICBzdWJ0YWJsZV9iaXRzID0gRkZNQVgoc3VidGFibGVfYml0cywgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdWJ0YWJsZV9iaXRzID0gRkZNSU4oc3VidGFibGVfYml0cywgdGFibGVfbmJfYml0cyk7CisgICAgICAgICAgICBqID0gKGZsYWdzICYgSU5JVF9WTENfTEUpID8gYml0c3dhcF8zMihjb2RlX3ByZWZpeCkgPj4gKDMyIC0gdGFibGVfbmJfYml0cykgOiBjb2RlX3ByZWZpeDsKKyAgICAgICAgICAgIHRhYmxlW2pdWzFdID0gLXN1YnRhYmxlX2JpdHM7CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIlNHg6IG49JWQgKHN1YnRhYmxlKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgaiwgY29kZXNbaV0uYml0cyArIHRhYmxlX25iX2JpdHMpOworICAgICAgICAgICAgaW5kZXggPSBidWlsZF90YWJsZSh2bGMsIHN1YnRhYmxlX2JpdHMsIGstaSwgY29kZXMraSwgZmxhZ3MpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICAvKiBub3RlOiByZWFsbG9jIGhhcyBiZWVuIGRvbmUsIHNvIHJlbG9hZCB0YWJsZXMgKi8KKyAgICAgICAgICAgIHRhYmxlID0gKHZvbGF0aWxlIFZMQ19UWVBFICgqKVsyXSkmdmxjLT50YWJsZVt0YWJsZV9pbmRleF07CisgICAgICAgICAgICB0YWJsZVtqXVswXSA9IGluZGV4OyAvL2NvZGUKKyAgICAgICAgICAgIGkgPSBrLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGFibGVfc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICh0YWJsZVtpXVsxXSA9PSAwKSAvL2JpdHMKKyAgICAgICAgICAgIHRhYmxlW2ldWzBdID0gLTE7IC8vY29kZXMKKyAgICB9CisKKyAgICByZXR1cm4gdGFibGVfaW5kZXg7Cit9CisKKworLyogQnVpbGQgVkxDIGRlY29kaW5nIHRhYmxlcyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggZ2V0X3ZsYygpLgorCisgICAnbmJfYml0cycgc2V0IHRoZWUgZGVjb2RpbmcgdGFibGUgc2l6ZSAoMl5uYl9iaXRzKSBlbnRyaWVzLiBUaGUKKyAgIGJpZ2dlciBpdCBpcywgdGhlIGZhc3RlciBpcyB0aGUgZGVjb2RpbmcuIEJ1dCBpdCBzaG91bGQgbm90IGJlIHRvbworICAgYmlnIHRvIHNhdmUgbWVtb3J5IGFuZCBMMSBjYWNoZS4gJzknIGlzIGEgZ29vZCBjb21wcm9taXNlLgorCisgICAnbmJfY29kZXMnIDogbnVtYmVyIG9mIHZsY3MgY29kZXMKKworICAgJ2JpdHMnIDogdGFibGUgd2hpY2ggZ2l2ZXMgdGhlIHNpemUgKGluIGJpdHMpIG9mIGVhY2ggdmxjIGNvZGUuCisKKyAgICdjb2RlcycgOiB0YWJsZSB3aGljaCBnaXZlcyB0aGUgYml0IHBhdHRlcm4gb2Ygb2YgZWFjaCB2bGMgY29kZS4KKworICAgJ3N5bWJvbHMnIDogdGFibGUgd2hpY2ggZ2l2ZXMgdGhlIHZhbHVlcyB0byBiZSByZXR1cm5lZCBmcm9tIGdldF92bGMoKS4KKworICAgJ3h4eF93cmFwJyA6IGdpdmUgdGhlIG51bWJlciBvZiBieXRlcyBiZXR3ZWVuIGVhY2ggZW50cnkgb2YgdGhlCisgICAnYml0cycgb3IgJ2NvZGVzJyB0YWJsZXMuCisKKyAgICd4eHhfc2l6ZScgOiBnaXZlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGVhY2ggZW50cnkgb2YgdGhlICdiaXRzJworICAgb3IgJ2NvZGVzJyB0YWJsZXMuCisKKyAgICd3cmFwJyBhbmQgJ3NpemUnIGFsbG93cyB0byB1c2UgYW55IG1lbW9yeSBjb25maWd1cmF0aW9uIGFuZCB0eXBlcworICAgKGJ5dGUvd29yZC9sb25nKSB0byBzdG9yZSB0aGUgJ2JpdHMnLCAnY29kZXMnLCBhbmQgJ3N5bWJvbHMnIHRhYmxlcy4KKworICAgJ3VzZV9zdGF0aWMnIHNob3VsZCBiZSBzZXQgdG8gMSBmb3IgdGFibGVzLCB3aGljaCBzaG91bGQgYmUgZnJlZWQKKyAgIHdpdGggYXZfZnJlZV9zdGF0aWMoKSwgMCBpZiBmZl9mcmVlX3ZsYygpIHdpbGwgYmUgdXNlZC4KKyovCitpbnQgZmZfaW5pdF92bGNfc3BhcnNlKFZMQyAqdmxjX2FyZywgaW50IG5iX2JpdHMsIGludCBuYl9jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYml0cywgaW50IGJpdHNfd3JhcCwgaW50IGJpdHNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29kZXMsIGludCBjb2Rlc193cmFwLCBpbnQgY29kZXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3ltYm9scywgaW50IHN5bWJvbHNfd3JhcCwgaW50IHN5bWJvbHNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIFZMQ2NvZGUgKmJ1ZjsKKyAgICBpbnQgaSwgaiwgcmV0OworICAgIFZMQ2NvZGUgbG9jYWxidWZbMTUwMF07IC8vIHRoZSBtYXhpbXVtIGN1cnJlbnRseSBuZWVkZWQgaXMgMTI5NiBieSBydjM0CisgICAgVkxDIGxvY2FsdmxjLCAqdmxjOworCisgICAgdmxjID0gdmxjX2FyZzsKKyAgICB2bGMtPmJpdHMgPSBuYl9iaXRzOworICAgIGlmIChmbGFncyAmIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKSB7CisgICAgICAgIGF2X2Fzc2VydDAobmJfY29kZXMgKyAxIDw9IEZGX0FSUkFZX0VMRU1TKGxvY2FsYnVmKSk7CisgICAgICAgIGJ1ZiA9IGxvY2FsYnVmOworICAgICAgICBsb2NhbHZsYyA9ICp2bGNfYXJnOworICAgICAgICB2bGMgPSAmbG9jYWx2bGM7CisgICAgICAgIHZsYy0+dGFibGVfc2l6ZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmxjLT50YWJsZSAgICAgICAgICAgPSBOVUxMOworICAgICAgICB2bGMtPnRhYmxlX2FsbG9jYXRlZCA9IDA7CisgICAgICAgIHZsYy0+dGFibGVfc2l6ZSAgICAgID0gMDsKKworICAgICAgICBidWYgPSBhdl9tYWxsb2NfYXJyYXkoKG5iX2NvZGVzICsgMSksIHNpemVvZihWTENjb2RlKSk7CisgICAgICAgIGlmICghYnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKworICAgIGF2X2Fzc2VydDAoc3ltYm9sc19zaXplIDw9IDIgfHwgIXN5bWJvbHMpOworICAgIGogPSAwOworI2RlZmluZSBDT1BZKGNvbmRpdGlvbilcCisgICAgZm9yIChpID0gMDsgaSA8IG5iX2NvZGVzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHRVRfREFUQShidWZbal0uYml0cywgYml0cywgaSwgYml0c193cmFwLCBiaXRzX3NpemUpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCEoY29uZGl0aW9uKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYnVmW2pdLmJpdHMgPiAzKm5iX2JpdHMgfHwgYnVmW2pdLmJpdHM+MzIpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJUb28gbG9uZyBWTEMgKCVkKSBpbiBpbml0X3ZsY1xuIiwgYnVmW2pdLmJpdHMpO1wKKyAgICAgICAgICAgIGlmICghKGZsYWdzICYgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXZfZnJlZShidWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVF9EQVRBKGJ1ZltqXS5jb2RlLCBjb2RlcywgaSwgY29kZXNfd3JhcCwgY29kZXNfc2l6ZSk7ICAgICAgICAgICAgXAorICAgICAgICBpZiAoYnVmW2pdLmNvZGUgPj0gKDFMTDw8YnVmW2pdLmJpdHMpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNvZGUgaW4gaW5pdF92bGNcbiIpOyAgICAgICBcCisgICAgICAgICAgICBpZiAoIShmbGFncyAmIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGF2X2ZyZWUoYnVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmxhZ3MgJiBJTklUX1ZMQ19MRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJ1ZltqXS5jb2RlID0gYml0c3dhcF8zMihidWZbal0uY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnVmW2pdLmNvZGUgPDw9IDMyIC0gYnVmW2pdLmJpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHN5bWJvbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBHRVRfREFUQShidWZbal0uc3ltYm9sLCBzeW1ib2xzLCBpLCBzeW1ib2xzX3dyYXAsIHN5bWJvbHNfc2l6ZSkgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJ1ZltqXS5zeW1ib2wgPSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGorKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICBDT1BZKGJ1ZltqXS5iaXRzID4gbmJfYml0cyk7CisgICAgLy8gcXNvcnQgaXMgdGhlIHNsb3dlc3QgcGFydCBvZiBpbml0X3ZsYywgYW5kIGNvdWxkIHByb2JhYmx5IGJlIGltcHJvdmVkIG9yIGF2b2lkZWQKKyAgICBxc29ydChidWYsIGosIHNpemVvZihWTENjb2RlKSwgY29tcGFyZV92bGNzcGVjKTsKKyAgICBDT1BZKGJ1ZltqXS5iaXRzICYmIGJ1ZltqXS5iaXRzIDw9IG5iX2JpdHMpOworICAgIG5iX2NvZGVzID0gajsKKworICAgIHJldCA9IGJ1aWxkX3RhYmxlKHZsYywgbmJfYml0cywgbmJfY29kZXMsIGJ1ZiwgZmxhZ3MpOworCisgICAgaWYgKGZsYWdzICYgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpIHsKKyAgICAgICAgaWYodmxjLT50YWJsZV9zaXplICE9IHZsYy0+dGFibGVfYWxsb2NhdGVkKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIm5lZWRlZCAlZCBoYWQgJWRcbiIsIHZsYy0+dGFibGVfc2l6ZSwgdmxjLT50YWJsZV9hbGxvY2F0ZWQpOworCisgICAgICAgIGF2X2Fzc2VydDAocmV0ID49IDApOworICAgICAgICAqdmxjX2FyZyA9ICp2bGM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnZsYy0+dGFibGUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIGZmX2ZyZWVfdmxjKFZMQyAqdmxjKQoreworICAgIGF2X2ZyZWVwKCZ2bGMtPnRhYmxlKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2JpdHN0cmVhbV9maWx0ZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JpdHN0cmVhbV9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjc1MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYml0c3RyZWFtX2ZpbHRlci5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdG9taWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKK3N0YXRpYyBBVkJpdFN0cmVhbUZpbHRlciAqZmlyc3RfYml0c3RyZWFtX2ZpbHRlciA9IE5VTEw7CisKK0FWQml0U3RyZWFtRmlsdGVyICphdl9iaXRzdHJlYW1fZmlsdGVyX25leHQoY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgKmYpCit7CisgICAgaWYgKGYpCisgICAgICAgIHJldHVybiBmLT5uZXh0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZpcnN0X2JpdHN0cmVhbV9maWx0ZXI7Cit9CisKK3ZvaWQgYXZfcmVnaXN0ZXJfYml0c3RyZWFtX2ZpbHRlcihBVkJpdFN0cmVhbUZpbHRlciAqYnNmKQoreworICAgIGRvIHsKKyAgICAgICAgYnNmLT5uZXh0ID0gZmlyc3RfYml0c3RyZWFtX2ZpbHRlcjsKKyAgICB9IHdoaWxlKGJzZi0+bmV4dCAhPSBhdnByaXZfYXRvbWljX3B0cl9jYXMoKHZvaWQgKiB2b2xhdGlsZSAqKSZmaXJzdF9iaXRzdHJlYW1fZmlsdGVyLCBic2YtPm5leHQsIGJzZikpOworfQorCitBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmF2X2JpdHN0cmVhbV9maWx0ZXJfaW5pdChjb25zdCBjaGFyICpuYW1lKQoreworICAgIEFWQml0U3RyZWFtRmlsdGVyICpic2YgPSBOVUxMOworCisgICAgd2hpbGUgKGJzZiA9IGF2X2JpdHN0cmVhbV9maWx0ZXJfbmV4dChic2YpKSB7CisgICAgICAgIGlmICghc3RyY21wKG5hbWUsIGJzZi0+bmFtZSkpIHsKKyAgICAgICAgICAgIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYyA9CisgICAgICAgICAgICAgICAgYXZfbWFsbG9jeihzaXplb2YoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0KSk7CisgICAgICAgICAgICBic2ZjLT5maWx0ZXIgICAgPSBic2Y7CisgICAgICAgICAgICBic2ZjLT5wcml2X2RhdGEgPQorICAgICAgICAgICAgICAgIGJzZi0+cHJpdl9kYXRhX3NpemUgPyBhdl9tYWxsb2N6KGJzZi0+cHJpdl9kYXRhX3NpemUpIDogTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBic2ZjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIGF2X2JpdHN0cmVhbV9maWx0ZXJfY2xvc2UoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjKQoreworICAgIGlmICghYnNmYykKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChic2ZjLT5maWx0ZXItPmNsb3NlKQorICAgICAgICBic2ZjLT5maWx0ZXItPmNsb3NlKGJzZmMpOworICAgIGF2X2ZyZWVwKCZic2ZjLT5wcml2X2RhdGEpOworICAgIGF2X3BhcnNlcl9jbG9zZShic2ZjLT5wYXJzZXIpOworICAgIGF2X2ZyZWUoYnNmYyk7Cit9CisKK2ludCBhdl9iaXRzdHJlYW1fZmlsdGVyX2ZpbHRlcihBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50IGtleWZyYW1lKQoreworICAgICpwb3V0YnVmICAgICAgPSAodWludDhfdCAqKWJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisgICAgcmV0dXJuIGJzZmMtPmZpbHRlci0+ZmlsdGVyKGJzZmMsIGF2Y3R4LCBhcmdzLCBwb3V0YnVmLCBwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX3NpemUsIGtleWZyYW1lKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2Jsb2NrZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9ibG9ja2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjU5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9ibG9ja2RzcC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKK3N0YXRpYyB2b2lkIGNsZWFyX2Jsb2NrXzhfYyhpbnQxNl90ICpibG9jaykKK3sKKyAgICBtZW1zZXQoYmxvY2ssIDAsIHNpemVvZihpbnQxNl90KSAqIDY0KTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfYmxvY2tzXzhfYyhpbnQxNl90ICpibG9ja3MpCit7CisgICAgbWVtc2V0KGJsb2NrcywgMCwgc2l6ZW9mKGludDE2X3QpICogNiAqIDY0KTsKK30KKworc3RhdGljIHZvaWQgZmlsbF9ibG9jazE2X2ModWludDhfdCAqYmxvY2ssIHVpbnQ4X3QgdmFsdWUsIGludCBsaW5lX3NpemUsIGludCBoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBtZW1zZXQoYmxvY2ssIHZhbHVlLCAxNik7CisgICAgICAgIGJsb2NrICs9IGxpbmVfc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfYmxvY2s4X2ModWludDhfdCAqYmxvY2ssIHVpbnQ4X3QgdmFsdWUsIGludCBsaW5lX3NpemUsIGludCBoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBtZW1zZXQoYmxvY2ssIHZhbHVlLCA4KTsKKyAgICAgICAgYmxvY2sgKz0gbGluZV9zaXplOworICAgIH0KK30KKworYXZfY29sZCB2b2lkIGZmX2Jsb2NrZHNwX2luaXQoQmxvY2tEU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgY29uc3QgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGggPSBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+IDg7CisKKyAgICBjLT5jbGVhcl9ibG9jayAgPSBjbGVhcl9ibG9ja184X2M7CisgICAgYy0+Y2xlYXJfYmxvY2tzID0gY2xlYXJfYmxvY2tzXzhfYzsKKworICAgIGMtPmZpbGxfYmxvY2tfdGFiWzBdID0gZmlsbF9ibG9jazE2X2M7CisgICAgYy0+ZmlsbF9ibG9ja190YWJbMV0gPSBmaWxsX2Jsb2NrOF9jOworCisgICAgaWYgKEFSQ0hfQUxQSEEpCisgICAgICAgIGZmX2Jsb2NrZHNwX2luaXRfYWxwaGEoYywgaGlnaF9iaXRfZGVwdGgpOworICAgIGlmIChBUkNIX0FSTSkKKyAgICAgICAgZmZfYmxvY2tkc3BfaW5pdF9hcm0oYywgaGlnaF9iaXRfZGVwdGgpOworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfYmxvY2tkc3BfaW5pdF9wcGMoYywgaGlnaF9iaXRfZGVwdGgpOworICAgIGlmIChBUkNIX1g4NikKKyNpZiBGRl9BUElfWFZNQworICAgICAgICBmZl9ibG9ja2RzcF9pbml0X3g4NihjLCBoaWdoX2JpdF9kZXB0aCwgYXZjdHgpOworI2Vsc2UKKyAgICAgICAgZmZfYmxvY2tkc3BfaW5pdF94ODYoYywgaGlnaF9iaXRfZGVwdGgpOworI2VuZGlmIC8qIEZGX0FQSV9YVk1DICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ibG9ja2RzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvYmxvY2tkc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2FkMjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYmxvY2tkc3AuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19CTE9DS0RTUF9ICisjZGVmaW5lIEFWQ09ERUNfQkxPQ0tEU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisvKiBhZGQgYW5kIHB1dCBwaXhlbCAoZGVjb2RpbmcpCisgKiBCbG9jayBzaXplcyBmb3Igb3BfcGl4ZWxzX2Z1bmMgYXJlIDh4NCw4eDggMTZ4OCAxNngxNi4KKyAqIGggZm9yIG9wX3BpeGVsc19mdW5jIGlzIGxpbWl0ZWQgdG8geyB3aWR0aCAvIDIsIHdpZHRoIH0sCisgKiBidXQgbmV2ZXIgbGFyZ2VyIHRoYW4gMTYgYW5kIG5ldmVyIHNtYWxsZXIgdGhhbiA0LiAqLwordHlwZWRlZiB2b2lkICgqb3BfZmlsbF9mdW5jKSh1aW50OF90ICpibG9jayAvKiBhbGlnbiB3aWR0aCAoOCBvciAxNikgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmFsdWUsIGludCBsaW5lX3NpemUsIGludCBoKTsKKwordHlwZWRlZiBzdHJ1Y3QgQmxvY2tEU1BDb250ZXh0IHsKKyAgICB2b2lkICgqY2xlYXJfYmxvY2spKGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovKTsKKyAgICB2b2lkICgqY2xlYXJfYmxvY2tzKShpbnQxNl90ICpibG9ja3MgLyogYWxpZ24gMTYgKi8pOworCisgICAgb3BfZmlsbF9mdW5jIGZpbGxfYmxvY2tfdGFiWzJdOworfSBCbG9ja0RTUENvbnRleHQ7CisKK3ZvaWQgZmZfYmxvY2tkc3BfaW5pdChCbG9ja0RTUENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK3ZvaWQgZmZfYmxvY2tkc3BfaW5pdF9hbHBoYShCbG9ja0RTUENvbnRleHQgKmMsIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKTsKK3ZvaWQgZmZfYmxvY2tkc3BfaW5pdF9hcm0oQmxvY2tEU1BDb250ZXh0ICpjLCB1bnNpZ25lZCBoaWdoX2JpdF9kZXB0aCk7Cit2b2lkIGZmX2Jsb2NrZHNwX2luaXRfcHBjKEJsb2NrRFNQQ29udGV4dCAqYywgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpOworI2lmIEZGX0FQSV9YVk1DCit2b2lkIGZmX2Jsb2NrZHNwX2luaXRfeDg2KEJsb2NrRFNQQ29udGV4dCAqYywgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisjZWxzZQordm9pZCBmZl9ibG9ja2RzcF9pbml0X3g4NihCbG9ja0RTUENvbnRleHQgKmMsIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKTsKKyNlbmRpZiAvKiBGRl9BUElfWFZNQyAqLworCisjZW5kaWYgLyogQVZDT0RFQ19CTE9DS0RTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ibXAuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGZkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9ibXAuYwpAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIEJNUCBpbWFnZSBmb3JtYXQgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA1IE1hbnMgUnVsbGdhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImJtcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXNybGVkZWMuaCIKKworc3RhdGljIGludCBibXBfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgQVZGcmFtZSAqcCAgICAgICAgID0gZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgZnNpemUsIGhzaXplOworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIHVuc2lnbmVkIGludCBkZXB0aDsKKyAgICBCaUNvbXByZXNzaW9uIGNvbXA7CisgICAgdW5zaWduZWQgaW50IGloc2l6ZTsKKyAgICBpbnQgaSwgaiwgbiwgbGluZXNpemUsIHJldDsKKyAgICB1aW50MzJfdCByZ2JbM10gPSB7MH07CisgICAgdWludDMyX3QgYWxwaGEgPSAwOworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICBpbnQgZHNpemU7CisgICAgY29uc3QgdWludDhfdCAqYnVmMCA9IGJ1ZjsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKworICAgIGlmIChidWZfc2l6ZSA8IDE0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYnVmIHNpemUgdG9vIHNtYWxsICglZClcbiIsIGJ1Zl9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1ZikgIT0gJ0InIHx8CisgICAgICAgIGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1ZikgIT0gJ00nKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYmFkIG1hZ2ljIG51bWJlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZzaXplID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmYnVmKTsKKyAgICBpZiAoYnVmX3NpemUgPCBmc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm5vdCBlbm91Z2ggZGF0YSAoJWQgPCAldSksIHRyeWluZyB0byBkZWNvZGUgYW55d2F5XG4iLAorICAgICAgICAgICAgICAgYnVmX3NpemUsIGZzaXplKTsKKyAgICAgICAgZnNpemUgPSBidWZfc2l6ZTsKKyAgICB9CisKKyAgICBidWYgKz0gMjsgLyogcmVzZXJ2ZWQxICovCisgICAgYnVmICs9IDI7IC8qIHJlc2VydmVkMiAqLworCisgICAgaHNpemUgID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmYnVmKTsgLyogaGVhZGVyIHNpemUgKi8KKyAgICBpaHNpemUgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZidWYpOyAvKiBtb3JlIGhlYWRlciBzaXplICovCisgICAgaWYgKGloc2l6ZSArIDE0TEwgPiBoc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgaGVhZGVyIHNpemUgJXVcbiIsIGhzaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogc29tZXRpbWVzIGZpbGUgc2l6ZSBpcyBzZXQgdG8gc29tZSBoZWFkZXJzIHNpemUsIHNldCBhIHJlYWwgc2l6ZSBpbiB0aGF0IGNhc2UgKi8KKyAgICBpZiAoZnNpemUgPT0gMTQgfHwgZnNpemUgPT0gaWhzaXplICsgMTQpCisgICAgICAgIGZzaXplID0gYnVmX3NpemUgLSAyOworCisgICAgaWYgKGZzaXplIDw9IGhzaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkRlY2xhcmVkIGZpbGUgc2l6ZSBpcyBsZXNzIHRoYW4gaGVhZGVyIHNpemUgKCV1IDwgJXUpXG4iLAorICAgICAgICAgICAgICAgZnNpemUsIGhzaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3dpdGNoIChpaHNpemUpIHsKKyAgICBjYXNlICA0MDogLy8gd2luZGliCisgICAgY2FzZSAgNTY6IC8vIHdpbmRpYiB2MworICAgIGNhc2UgIDY0OiAvLyBPUy8yIHYyCisgICAgY2FzZSAxMDg6IC8vIHdpbmRpYiB2NAorICAgIGNhc2UgMTI0OiAvLyB3aW5kaWIgdjUKKyAgICAgICAgd2lkdGggID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmYnVmKTsKKyAgICAgICAgaGVpZ2h0ID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgMTI6IC8vIE9TLzIgdjEKKyAgICAgICAgd2lkdGggID0gYnl0ZXN0cmVhbV9nZXRfbGUxNigmYnVmKTsKKyAgICAgICAgaGVpZ2h0ID0gYnl0ZXN0cmVhbV9nZXRfbGUxNigmYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBCTVAgZmlsZSwgcGF0Y2ggd2VsY29tZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvKiBwbGFuZXMgKi8KKyAgICBpZiAoYnl0ZXN0cmVhbV9nZXRfbGUxNigmYnVmKSAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBCTVAgaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZGVwdGggPSBieXRlc3RyZWFtX2dldF9sZTE2KCZidWYpOworCisgICAgaWYgKGloc2l6ZSA+PSA0MCkKKyAgICAgICAgY29tcCA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmJ1Zik7CisgICAgZWxzZQorICAgICAgICBjb21wID0gQk1QX1JHQjsKKworICAgIGlmIChjb21wICE9IEJNUF9SR0IgJiYgY29tcCAhPSBCTVBfQklURklFTERTICYmIGNvbXAgIT0gQk1QX1JMRTQgJiYKKyAgICAgICAgY29tcCAhPSBCTVBfUkxFOCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJNUCBjb2RpbmcgJWQgbm90IHN1cHBvcnRlZFxuIiwgY29tcCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChjb21wID09IEJNUF9CSVRGSUVMRFMpIHsKKyAgICAgICAgYnVmICs9IDIwOworICAgICAgICByZ2JbMF0gPSBieXRlc3RyZWFtX2dldF9sZTMyKCZidWYpOworICAgICAgICByZ2JbMV0gPSBieXRlc3RyZWFtX2dldF9sZTMyKCZidWYpOworICAgICAgICByZ2JbMl0gPSBieXRlc3RyZWFtX2dldF9sZTMyKCZidWYpOworICAgICAgICBpZiAoaWhzaXplID4gNDApCisgICAgICAgIGFscGhhID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmYnVmKTsKKyAgICB9CisKKyAgICBhdmN0eC0+d2lkdGggID0gd2lkdGg7CisgICAgYXZjdHgtPmhlaWdodCA9IGhlaWdodCA+IDAgPyBoZWlnaHQgOiAtaGVpZ2h0OworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICBzd2l0Y2ggKGRlcHRoKSB7CisgICAgY2FzZSAzMjoKKyAgICAgICAgaWYgKGNvbXAgPT0gQk1QX0JJVEZJRUxEUykgeworICAgICAgICAgICAgaWYgKHJnYlswXSA9PSAweEZGMDAwMDAwICYmIHJnYlsxXSA9PSAweDAwRkYwMDAwICYmIHJnYlsyXSA9PSAweDAwMDBGRjAwKQorICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gYWxwaGEgPyBBVl9QSVhfRk1UX0FCR1IgOiBBVl9QSVhfRk1UXzBCR1I7CisgICAgICAgICAgICBlbHNlIGlmIChyZ2JbMF0gPT0gMHgwMEZGMDAwMCAmJiByZ2JbMV0gPT0gMHgwMDAwRkYwMCAmJiByZ2JbMl0gPT0gMHgwMDAwMDBGRikKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IGFscGhhID8gQVZfUElYX0ZNVF9CR1JBIDogQVZfUElYX0ZNVF9CR1IwOworICAgICAgICAgICAgZWxzZSBpZiAocmdiWzBdID09IDB4MDAwMEZGMDAgJiYgcmdiWzFdID09IDB4MDBGRjAwMDAgJiYgcmdiWzJdID09IDB4RkYwMDAwMDApCisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBhbHBoYSA/IEFWX1BJWF9GTVRfQVJHQiA6IEFWX1BJWF9GTVRfMFJHQjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJnYlswXSA9PSAweDAwMDAwMEZGICYmIHJnYlsxXSA9PSAweDAwMDBGRjAwICYmIHJnYlsyXSA9PSAweDAwRkYwMDAwKQorICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gYWxwaGEgPyBBVl9QSVhfRk1UX1JHQkEgOiBBVl9QSVhfRk1UX1JHQjA7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gYml0ZmllbGRzICUwWCAlMFggJTBYXG4iLCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUkE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgICBpZiAoY29tcCA9PSBCTVBfUkdCKQorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU1NTsKKyAgICAgICAgZWxzZSBpZiAoY29tcCA9PSBCTVBfQklURklFTERTKSB7CisgICAgICAgICAgICBpZiAocmdiWzBdID09IDB4RjgwMCAmJiByZ2JbMV0gPT0gMHgwN0UwICYmIHJnYlsyXSA9PSAweDAwMUYpCisgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNTY1OworICAgICAgICAgICAgZWxzZSBpZiAocmdiWzBdID09IDB4N0MwMCAmJiByZ2JbMV0gPT0gMHgwM0UwICYmIHJnYlsyXSA9PSAweDAwMUYpCisgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNTU1OworICAgICAgICAgICAgZWxzZSBpZiAocmdiWzBdID09IDB4MEYwMCAmJiByZ2JbMV0gPT0gMHgwMEYwICYmIHJnYlsyXSA9PSAweDAwMEYpCisgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNDQ0OworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBiaXRmaWVsZHMgJTAiUFJJWDMyIiAlMCJQUklYMzIiICUwIlBSSVgzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcmdiWzBdLCByZ2JbMV0sIHJnYlsyXSk7CisgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgaWYgKGhzaXplIC0gaWhzaXplIC0gMTQgPiAwKQorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgIGNhc2UgNDoKKyAgICAgICAgaWYgKGhzaXplIC0gaWhzaXplIC0gMTQgPiAwKSB7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBwYWxldHRlIGZvciAldS1jb2xvdXIgQk1QXG4iLAorICAgICAgICAgICAgICAgICAgIDEgPDwgZGVwdGgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkZXB0aCAldSBub3Qgc3VwcG9ydGVkXG4iLCBkZXB0aCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHAsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcC0+a2V5X2ZyYW1lID0gMTsKKworICAgIGJ1ZiAgID0gYnVmMCArIGhzaXplOworICAgIGRzaXplID0gYnVmX3NpemUgLSBoc2l6ZTsKKworICAgIC8qIExpbmUgc2l6ZSBpbiBmaWxlIG11bHRpcGxlIG9mIDQgKi8KKyAgICBuID0gKChhdmN0eC0+d2lkdGggKiBkZXB0aCArIDMxKSAvIDgpICYgfjM7CisKKyAgICBpZiAobiAqIGF2Y3R4LT5oZWlnaHQgPiBkc2l6ZSAmJiBjb21wICE9IEJNUF9STEU0ICYmIGNvbXAgIT0gQk1QX1JMRTgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJub3QgZW5vdWdoIGRhdGEgKCVkIDwgJWQpXG4iLAorICAgICAgICAgICAgICAgZHNpemUsIG4gKiBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLy8gUkxFIG1heSBza2lwIGRlY29kaW5nIHNvbWUgcGljdHVyZSBhcmVhcywgc28gYmxhbmsgcGljdHVyZSBiZWZvcmUgZGVjb2RpbmcKKyAgICBpZiAoY29tcCA9PSBCTVBfUkxFNCB8fCBjb21wID09IEJNUF9STEU4KQorICAgICAgICBtZW1zZXQocC0+ZGF0YVswXSwgMCwgYXZjdHgtPmhlaWdodCAqIHAtPmxpbmVzaXplWzBdKTsKKworICAgIGlmIChoZWlnaHQgPiAwKSB7CisgICAgICAgIHB0ciAgICAgID0gcC0+ZGF0YVswXSArIChhdmN0eC0+aGVpZ2h0IC0gMSkgKiBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgbGluZXNpemUgPSAtcC0+bGluZXNpemVbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRyICAgICAgPSBwLT5kYXRhWzBdOworICAgICAgICBsaW5lc2l6ZSA9IHAtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpIHsKKyAgICAgICAgaW50IGNvbG9ycyA9IDEgPDwgZGVwdGg7CisKKyAgICAgICAgbWVtc2V0KHAtPmRhdGFbMV0sIDAsIDEwMjQpOworCisgICAgICAgIGlmIChpaHNpemUgPj0gMzYpIHsKKyAgICAgICAgICAgIGludCB0OworICAgICAgICAgICAgYnVmID0gYnVmMCArIDQ2OworICAgICAgICAgICAgdCAgID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmYnVmKTsKKyAgICAgICAgICAgIGlmICh0IDwgMCB8fCB0ID4gKDEgPDwgZGVwdGgpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJJbmNvcnJlY3QgbnVtYmVyIG9mIGNvbG9ycyAtICVYIGZvciBiaXRkZXB0aCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdCwgZGVwdGgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0KSB7CisgICAgICAgICAgICAgICAgY29sb3JzID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbG9ycyA9IEZGTUlOKDI1NiwgKGhzaXplLWloc2l6ZS0xNCkgLyAzKTsKKyAgICAgICAgfQorICAgICAgICBidWYgPSBidWYwICsgMTQgKyBpaHNpemU7IC8vcGFsZXR0ZSBsb2NhdGlvbgorICAgICAgICAvLyBPUy8yIGJpdG1hcCwgMyBieXRlcyBwZXIgcGFsZXR0ZSBlbnRyeQorICAgICAgICBpZiAoKGhzaXplLWloc2l6ZS0xNCkgPCAoY29sb3JzIDw8IDIpKSB7CisgICAgICAgICAgICBpZiAoKGhzaXplLWloc2l6ZS0xNCkgPCBjb2xvcnMgKiAzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwYWxldHRlIGRvZXNuJ3QgZml0IGluIHBhY2tldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyBpKyspCisgICAgICAgICAgICAgICAgKCh1aW50MzJfdCopcC0+ZGF0YVsxXSlbaV0gPSAoMHhGRlU8PDI0KSB8IGJ5dGVzdHJlYW1fZ2V0X2xlMjQoJmJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyBpKyspCisgICAgICAgICAgICAgICAgKCh1aW50MzJfdCopcC0+ZGF0YVsxXSlbaV0gPSAweEZGVSA8PCAyNCB8IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgYnVmID0gYnVmMCArIGhzaXplOworICAgIH0KKyAgICBpZiAoY29tcCA9PSBCTVBfUkxFNCB8fCBjb21wID09IEJNUF9STEU4KSB7CisgICAgICAgIGlmIChjb21wID09IEJNUF9STEU4ICYmIGhlaWdodCA8IDApIHsKKyAgICAgICAgICAgIHAtPmRhdGFbMF0gICAgKz0gIHAtPmxpbmVzaXplWzBdICogKGF2Y3R4LT5oZWlnaHQgLSAxKTsKKyAgICAgICAgICAgIHAtPmxpbmVzaXplWzBdID0gLXAtPmxpbmVzaXplWzBdOworICAgICAgICB9CisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBidWYsIGRzaXplKTsKKyAgICAgICAgZmZfbXNybGVfZGVjb2RlKGF2Y3R4LCAoQVZQaWN0dXJlKilwLCBkZXB0aCwgJmdiKTsKKyAgICAgICAgaWYgKGhlaWdodCA8IDApIHsKKyAgICAgICAgICAgIHAtPmRhdGFbMF0gICAgKz0gIHAtPmxpbmVzaXplWzBdICogKGF2Y3R4LT5oZWlnaHQgLSAxKTsKKyAgICAgICAgICAgIHAtPmxpbmVzaXplWzBdID0gLXAtPmxpbmVzaXplWzBdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChkZXB0aCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgeworICAgICAgICAgICAgICAgICAgICBwdHJbaio4KzBdID0gIGJ1ZltqXSA+PiA3OworICAgICAgICAgICAgICAgICAgICBwdHJbaio4KzFdID0gKGJ1ZltqXSA+PiA2KSAmIDE7CisgICAgICAgICAgICAgICAgICAgIHB0cltqKjgrMl0gPSAoYnVmW2pdID4+IDUpICYgMTsKKyAgICAgICAgICAgICAgICAgICAgcHRyW2oqOCszXSA9IChidWZbal0gPj4gNCkgJiAxOworICAgICAgICAgICAgICAgICAgICBwdHJbaio4KzRdID0gKGJ1ZltqXSA+PiAzKSAmIDE7CisgICAgICAgICAgICAgICAgICAgIHB0cltqKjgrNV0gPSAoYnVmW2pdID4+IDIpICYgMTsKKyAgICAgICAgICAgICAgICAgICAgcHRyW2oqOCs2XSA9IChidWZbal0gPj4gMSkgJiAxOworICAgICAgICAgICAgICAgICAgICBwdHJbaio4KzddID0gIGJ1ZltqXSAgICAgICAmIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZiArPSBuOworICAgICAgICAgICAgICAgIHB0ciArPSBsaW5lc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgIGNhc2UgMjQ6CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHB0ciwgYnVmLCBuKTsKKyAgICAgICAgICAgICAgICBidWYgKz0gbjsKKyAgICAgICAgICAgICAgICBwdHIgKz0gbGluZXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyW2oqMiswXSA9IChidWZbal0gPj4gNCkgJiAweEY7CisgICAgICAgICAgICAgICAgICAgIHB0cltqKjIrMV0gPSBidWZbal0gJiAweEY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZiArPSBuOworICAgICAgICAgICAgICAgIHB0ciArPSBsaW5lc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgPSAoY29uc3QgdWludDE2X3QgKikgYnVmOworICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkc3QgICAgICAgPSAodWludDE2X3QgKikgcHRyOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBhdl9sZTJuZTE2KCpzcmMrKyk7CisKKyAgICAgICAgICAgICAgICBidWYgKz0gbjsKKyAgICAgICAgICAgICAgICBwdHIgKz0gbGluZXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQk1QIGRlY29kZXIgaXMgYnJva2VuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK0FWQ29kZWMgZmZfYm1wX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImJtcCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJNUCAoV2luZG93cyBhbmQgT1MvMiBiaXRtYXApIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0JNUCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBibXBfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYm1wLmggYi9mZm1wZWcvbGliYXZjb2RlYy9ibXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjIxMDkwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYm1wLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIGludGVybmFscyBmb3IgQk1QIGNvZGVjcworICogQ29weXJpZ2h0IChjKSAyMDA1IE1hbnMgUnVsbGdhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0JNUF9ICisjZGVmaW5lIEFWQ09ERUNfQk1QX0gKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBCTVBfUkdCICAgICAgICAgPTAsCisgICAgQk1QX1JMRTggICAgICAgID0xLAorICAgIEJNUF9STEU0ICAgICAgICA9MiwKKyAgICBCTVBfQklURklFTERTICAgPTMsCit9IEJpQ29tcHJlc3Npb247CisKKyNlbmRpZiAvKiBBVkNPREVDX0JNUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ibXBfcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9ibXBfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0OTNkYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JtcF9wYXJzZXIuYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIEJNUCBwYXJzZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQk1QIHBhcnNlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQk1QUGFyc2VDb250ZXh0IHsKKyAgICBQYXJzZUNvbnRleHQgcGM7CisgICAgdWludDMyX3QgZnNpemU7CisgICAgdWludDMyX3QgcmVtYWluaW5nX3NpemU7Cit9IEJNUFBhcnNlQ29udGV4dDsKKworc3RhdGljIGludCBibXBfcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIEJNUFBhcnNlQ29udGV4dCAqYnBjID0gcy0+cHJpdl9kYXRhOworICAgIHVpbnQ2NF90IHN0YXRlID0gYnBjLT5wYy5zdGF0ZTY0OworICAgIGludCBuZXh0ID0gRU5EX05PVF9GT1VORDsKKyAgICBpbnQgaSA9IDA7CisKKyAgICAqcG91dGJ1Zl9zaXplID0gMDsKKworcmVzdGFydDoKKyAgICBpZiAoYnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA8PSAyKzQrNCkgeworICAgICAgICBmb3IgKDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgYnVmW2ldOworICAgICAgICAgICAgaWYgKGJwYy0+cGMuZnJhbWVfc3RhcnRfZm91bmQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPj4gNDgpID09ICgoJ0InIDw8IDgpIHwgJ00nKSkgeworICAgICAgICAgICAgICAgICAgICBicGMtPmZzaXplID0gYXZfYnN3YXAzMihzdGF0ZSA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgIGJwYy0+cGMuZnJhbWVfc3RhcnRfZm91bmQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9PSAyKzQrNCkgeworLy8gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhzaXplID0gYXZfYnN3YXAzMihzdGF0ZT4+MzIpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGloc2l6ZSA9IGF2X2Jzd2FwMzIoc3RhdGUpOworICAgICAgICAgICAgICAgIGlmIChpaHNpemUgPCAxMiB8fCBpaHNpemUgPiAyMDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicGMtPnBjLmZyYW1lX3N0YXJ0X2ZvdW5kKys7CisgICAgICAgICAgICAgICAgYnBjLT5yZW1haW5pbmdfc2l6ZSA9IGJwYy0+ZnNpemUgKyBpIC0gMTc7CisKKyAgICAgICAgICAgICAgICBpZiAoYnBjLT5wYy5pbmRleCArIGkgPiAxNykgeworICAgICAgICAgICAgICAgICAgICBuZXh0ID0gaSAtIDE3OworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJwYy0+cGMuZnJhbWVfc3RhcnRfZm91bmQpCisgICAgICAgICAgICAgICAgYnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCsrOworICAgICAgICB9CisgICAgICAgIGJwYy0+cGMuc3RhdGU2NCA9IHN0YXRlOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChicGMtPnJlbWFpbmluZ19zaXplKSB7CisgICAgICAgICAgICBpID0gRkZNSU4oYnBjLT5yZW1haW5pbmdfc2l6ZSwgYnVmX3NpemUpOworICAgICAgICAgICAgYnBjLT5yZW1haW5pbmdfc2l6ZSAtPSBpOworICAgICAgICAgICAgaWYgKGJwYy0+cmVtYWluaW5nX3NpemUpCisgICAgICAgICAgICAgICAgZ290byBmbHVzaDsKKworICAgICAgICAgICAgYnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CisgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgIH0KKyAgICB9CisKK2ZsdXNoOgorICAgIGlmIChmZl9jb21iaW5lX2ZyYW1lKCZicGMtPnBjLCBuZXh0LCAmYnVmLCAmYnVmX3NpemUpIDwgMCkKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworCisgICAgYnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CisKKyAgICAqcG91dGJ1ZiAgICAgID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gbmV4dDsKK30KKworQVZDb2RlY1BhcnNlciBmZl9ibXBfcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfQk1QIH0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEJNUFBhcnNlQ29udGV4dCksCisgICAgLnBhcnNlcl9wYXJzZSAgID0gYm1wX3BhcnNlLAorICAgIC5wYXJzZXJfY2xvc2UgICA9IGZmX3BhcnNlX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2JtcGVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYm1wZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExOTU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JtcGVuYy5jCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQk1QIGltYWdlIGZvcm1hdCBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgTWljaGVsIEJhcmRpYXV4CisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRGFuaWVsIFZlcmthbXAgPGRhbmllbCBhdCBkcnYubnU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImJtcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBtb25vYmxhY2tfcGFsW10gPSB7IDB4MDAwMDAwLCAweEZGRkZGRiB9Oworc3RhdGljIGNvbnN0IHVpbnQzMl90IHJnYjU2NV9tYXNrc1tdICA9IHsgMHhGODAwLCAweDA3RTAsIDB4MDAxRiB9Oworc3RhdGljIGNvbnN0IHVpbnQzMl90IHJnYjQ0NF9tYXNrc1tdICA9IHsgMHgwRjAwLCAweDAwRjAsIDB4MDAwRiB9OworCitzdGF0aWMgYXZfY29sZCBpbnQgYm1wX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCl7CisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBOgorICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IyNDoKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTU1OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NjU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ0NDoKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNF9CWVRFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0X0JZVEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9QQUw4OgorICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX01PTk9CTEFDSzoKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJ1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibXBfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWN0LCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgY29uc3QgQVZGcmFtZSAqIGNvbnN0IHAgPSBwaWN0OworICAgIGludCBuX2J5dGVzX2ltYWdlLCBuX2J5dGVzX3Blcl9yb3csIG5fYnl0ZXMsIGksIG4sIGhzaXplLCByZXQ7CisgICAgY29uc3QgdWludDMyX3QgKnBhbCA9IE5VTEw7CisgICAgdWludDMyX3QgcGFsZXR0ZTI1NlsyNTZdOworICAgIGludCBwYWRfYnl0ZXNfcGVyX3JvdywgcGFsX2VudHJpZXMgPSAwLCBjb21wcmVzc2lvbiA9IEJNUF9SR0I7CisgICAgaW50IGJpdF9jb3VudCA9IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgdWludDhfdCAqcHRyLCAqYnVmOworCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0NDQ6CisgICAgICAgIGNvbXByZXNzaW9uID0gQk1QX0JJVEZJRUxEUzsKKyAgICAgICAgcGFsID0gcmdiNDQ0X21hc2tzOyAvLyBhYnVzZSBwYWwgdG8gaG9sZCBjb2xvciBtYXNrcworICAgICAgICBwYWxfZW50cmllcyA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NjU6CisgICAgICAgIGNvbXByZXNzaW9uID0gQk1QX0JJVEZJRUxEUzsKKyAgICAgICAgcGFsID0gcmdiNTY1X21hc2tzOyAvLyBhYnVzZSBwYWwgdG8gaG9sZCBjb2xvciBtYXNrcworICAgICAgICBwYWxfZW50cmllcyA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0X0JZVEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjRfQllURToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6CisgICAgICAgIGF2X2Fzc2VydDEoYml0X2NvdW50ID09IDgpOworICAgICAgICBhdnByaXZfc2V0X3N5c3RlbWF0aWNfcGFsMihwYWxldHRlMjU2LCBhdmN0eC0+cGl4X2ZtdCk7CisgICAgICAgIHBhbCA9IHBhbGV0dGUyNTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9QQUw4OgorICAgICAgICBwYWwgPSAodWludDMyX3QgKilwLT5kYXRhWzFdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfTU9OT0JMQUNLOgorICAgICAgICBwYWwgPSBtb25vYmxhY2tfcGFsOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHBhbCAmJiAhcGFsX2VudHJpZXMpIHBhbF9lbnRyaWVzID0gMSA8PCBiaXRfY291bnQ7CisgICAgbl9ieXRlc19wZXJfcm93ID0gKChpbnQ2NF90KWF2Y3R4LT53aWR0aCAqIChpbnQ2NF90KWJpdF9jb3VudCArIDdMTCkgPj4gM0xMOworICAgIHBhZF9ieXRlc19wZXJfcm93ID0gKDQgLSBuX2J5dGVzX3Blcl9yb3cpICYgMzsKKyAgICBuX2J5dGVzX2ltYWdlID0gYXZjdHgtPmhlaWdodCAqIChuX2J5dGVzX3Blcl9yb3cgKyBwYWRfYnl0ZXNfcGVyX3Jvdyk7CisKKyAgICAvLyBTVFJVQ1RVUkUuZmllbGQgcmVmZXIgdG8gdGhlIE1TVkMgZG9jdW1lbnRhdGlvbiBmb3IgQklUTUFQRklMRUhFQURFUgorICAgIC8vIGFuZCByZWxhdGVkIHBhZ2VzLgorI2RlZmluZSBTSVpFX0JJVE1BUEZJTEVIRUFERVIgMTQKKyNkZWZpbmUgU0laRV9CSVRNQVBJTkZPSEVBREVSIDQwCisgICAgaHNpemUgPSBTSVpFX0JJVE1BUEZJTEVIRUFERVIgKyBTSVpFX0JJVE1BUElORk9IRUFERVIgKyAocGFsX2VudHJpZXMgPDwgMik7CisgICAgbl9ieXRlcyA9IG5fYnl0ZXNfaW1hZ2UgKyBoc2l6ZTsKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgbl9ieXRlcykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBidWYgPSBwa3QtPmRhdGE7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCAnQicpOyAgICAgICAgICAgICAgICAgICAvLyBCSVRNQVBGSUxFSEVBREVSLmJmVHlwZQorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgJ00nKTsgICAgICAgICAgICAgICAgICAgLy8gZG8uCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmYnVmLCBuX2J5dGVzKTsgICAgICAgICAgICAgICAvLyBCSVRNQVBGSUxFSEVBREVSLmJmU2l6ZQorICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmJ1ZiwgMCk7ICAgICAgICAgICAgICAgICAgICAgLy8gQklUTUFQRklMRUhFQURFUi5iZlJlc2VydmVkMQorICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmJ1ZiwgMCk7ICAgICAgICAgICAgICAgICAgICAgLy8gQklUTUFQRklMRUhFQURFUi5iZlJlc2VydmVkMgorICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmJ1ZiwgaHNpemUpOyAgICAgICAgICAgICAgICAgLy8gQklUTUFQRklMRUhFQURFUi5iZk9mZkJpdHMKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZidWYsIFNJWkVfQklUTUFQSU5GT0hFQURFUik7IC8vIEJJVE1BUElORk9IRUFERVIuYmlTaXplCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmYnVmLCBhdmN0eC0+d2lkdGgpOyAgICAgICAgICAvLyBCSVRNQVBJTkZPSEVBREVSLmJpV2lkdGgKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZidWYsIGF2Y3R4LT5oZWlnaHQpOyAgICAgICAgIC8vIEJJVE1BUElORk9IRUFERVIuYmlIZWlnaHQKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZidWYsIDEpOyAgICAgICAgICAgICAgICAgICAgIC8vIEJJVE1BUElORk9IRUFERVIuYmlQbGFuZXMKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZidWYsIGJpdF9jb3VudCk7ICAgICAgICAgICAgIC8vIEJJVE1BUElORk9IRUFERVIuYmlCaXRDb3VudAorICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmJ1ZiwgY29tcHJlc3Npb24pOyAgICAgICAgICAgLy8gQklUTUFQSU5GT0hFQURFUi5iaUNvbXByZXNzaW9uCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmYnVmLCBuX2J5dGVzX2ltYWdlKTsgICAgICAgICAvLyBCSVRNQVBJTkZPSEVBREVSLmJpU2l6ZUltYWdlCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmYnVmLCAwKTsgICAgICAgICAgICAgICAgICAgICAvLyBCSVRNQVBJTkZPSEVBREVSLmJpWFBlbHNQZXJNZXRlcgorICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmJ1ZiwgMCk7ICAgICAgICAgICAgICAgICAgICAgLy8gQklUTUFQSU5GT0hFQURFUi5iaVlQZWxzUGVyTWV0ZXIKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZidWYsIDApOyAgICAgICAgICAgICAgICAgICAgIC8vIEJJVE1BUElORk9IRUFERVIuYmlDbHJVc2VkCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmYnVmLCAwKTsgICAgICAgICAgICAgICAgICAgICAvLyBCSVRNQVBJTkZPSEVBREVSLmJpQ2xySW1wb3J0YW50CisgICAgZm9yIChpID0gMDsgaSA8IHBhbF9lbnRyaWVzOyBpKyspCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmJ1ZiwgcGFsW2ldICYgMHhGRkZGRkYpOworICAgIC8vIEJNUCBmaWxlcyBhcmUgYm90dG9tLXRvLXRvcCBzbyB3ZSBzdGFydCBmcm9tIHRoZSBlbmQuLi4KKyAgICBwdHIgPSBwLT5kYXRhWzBdICsgKGF2Y3R4LT5oZWlnaHQgLSAxKSAqIHAtPmxpbmVzaXplWzBdOworICAgIGJ1ZiA9IHBrdC0+ZGF0YSArIGhzaXplOworICAgIGZvcihpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICBpZiAoYml0X2NvdW50ID09IDE2KSB7CisgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKGNvbnN0IHVpbnQxNl90ICopIHB0cjsKKyAgICAgICAgICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKikgYnVmOworICAgICAgICAgICAgZm9yKG4gPSAwOyBuIDwgYXZjdHgtPndpZHRoOyBuKyspCisgICAgICAgICAgICAgICAgQVZfV0wxNihkc3QgKyBuLCBzcmNbbl0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KGJ1ZiwgcHRyLCBuX2J5dGVzX3Blcl9yb3cpOworICAgICAgICB9CisgICAgICAgIGJ1ZiArPSBuX2J5dGVzX3Blcl9yb3c7CisgICAgICAgIG1lbXNldChidWYsIDAsIHBhZF9ieXRlc19wZXJfcm93KTsKKyAgICAgICAgYnVmICs9IHBhZF9ieXRlc19wZXJfcm93OworICAgICAgICBwdHIgLT0gcC0+bGluZXNpemVbMF07IC8vIC4uLiBhbmQgZ28gYmFjaworICAgIH0KKworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGJtcF9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfYm1wX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImJtcCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJNUCAoV2luZG93cyBhbmQgT1MvMiBiaXRtYXApIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0JNUCwKKyAgICAuaW5pdCAgICAgICAgICAgPSBibXBfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gYm1wX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBibXBfZW5jb2RlX2Nsb3NlLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7CisgICAgICAgIEFWX1BJWF9GTVRfQkdSQSwgQVZfUElYX0ZNVF9CR1IyNCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0I1NjUsIEFWX1BJWF9GTVRfUkdCNTU1LCBBVl9QSVhfRk1UX1JHQjQ0NCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0I4LCBBVl9QSVhfRk1UX0JHUjgsIEFWX1BJWF9GTVRfUkdCNF9CWVRFLCBBVl9QSVhfRk1UX0JHUjRfQllURSwgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9QQUw4LAorICAgICAgICBBVl9QSVhfRk1UX01PTk9CTEFDSywKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ibXZhdWRpby5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYm12YXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTQ3M2RmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYm12YXVkaW8uYwpAQCAtMCwwICsxLDg5IEBACisvKgorICogRGlzY3dvcmxkIElJIEJNViBhdWRpbyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBjb25zdCBpbnQgYm12X2F1ZF9tdWx0c1sxNl0gPSB7CisgICAgMTY1MTIsIDgyNTYsIDQxMjgsIDIwNjQsIDEwMzIsIDUxNiwgMjU4LCAxOTIsIDEyOSwgODgsIDY0LCA1NiwgNDgsIDQwLCAzNiwgMzIKK307CisKK3N0YXRpYyBhdl9jb2xkIGludCBibXZfYXVkX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgICAgID0gQVZfU0FNUExFX0ZNVF9TMTY7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibXZfYXVkX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lICAgICA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgaW50IGJsb2NrcyA9IDAsIHRvdGFsX2Jsb2NrcywgaTsKKyAgICBpbnQgcmV0OworICAgIGludDE2X3QgKm91dHB1dF9zYW1wbGVzOworICAgIGludCBzY2FsZVsyXTsKKworICAgIHRvdGFsX2Jsb2NrcyA9ICpidWYrKzsKKyAgICBpZiAoYnVmX3NpemUgPCB0b3RhbF9ibG9ja3MgKiA2NSArIDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJleHBlY3RlZCAlZCBieXRlcywgZ290ICVkXG4iLAorICAgICAgICAgICAgICAgdG90YWxfYmxvY2tzICogNjUgKyAxLCBidWZfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSB0b3RhbF9ibG9ja3MgKiAzMjsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG91dHB1dF9zYW1wbGVzID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIGZvciAoYmxvY2tzID0gMDsgYmxvY2tzIDwgdG90YWxfYmxvY2tzOyBibG9ja3MrKykgeworICAgICAgICB1aW50OF90IGNvZGUgPSAqYnVmKys7CisgICAgICAgIGNvZGUgPSAoY29kZSA+PiAxKSB8IChjb2RlIDw8IDcpOworICAgICAgICBzY2FsZVswXSA9IGJtdl9hdWRfbXVsdHNbY29kZSAmIDB4Rl07CisgICAgICAgIHNjYWxlWzFdID0gYm12X2F1ZF9tdWx0c1tjb2RlID4+IDRdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgICAgICAgKm91dHB1dF9zYW1wbGVzKysgPSBhdl9jbGlwX2ludDE2KChzY2FsZVswXSAqIChpbnQ4X3QpKmJ1ZisrKSA+PiA1KTsKKyAgICAgICAgICAgICpvdXRwdXRfc2FtcGxlcysrID0gYXZfY2xpcF9pbnQxNigoc2NhbGVbMV0gKiAoaW50OF90KSpidWYrKykgPj4gNSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK0FWQ29kZWMgZmZfYm12X2F1ZGlvX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImJtdl9hdWRpbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRpc2N3b3JsZCBJSSBCTVYgYXVkaW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQk1WX0FVRElPLAorICAgIC5pbml0ICAgICAgICAgICA9IGJtdl9hdWRfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gYm12X2F1ZF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ibXZ2aWRlby5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvYm12dmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQzYjJhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYm12dmlkZW8uYwpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIERpc2N3b3JsZCBJSSBCTVYgdmlkZW8gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDExIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZW51bSBCTVZGbGFnc3sKKyAgICBCTVZfTk9QID0gMCwKKyAgICBCTVZfRU5ELAorICAgIEJNVl9ERUxUQSwKKyAgICBCTVZfSU5UUkEsCisKKyAgICBCTVZfU0NST0xMICA9IDB4MDQsCisgICAgQk1WX1BBTEVUVEUgPSAweDA4LAorICAgIEJNVl9DT01NQU5EID0gMHgxMCwKKyAgICBCTVZfQVVESU8gICA9IDB4MjAsCisgICAgQk1WX0VYVCAgICAgPSAweDQwLAorICAgIEJNVl9QUklOVCAgID0gMHg4MAorfTsKKworI2RlZmluZSBTQ1JFRU5fV0lERSA2NDAKKyNkZWZpbmUgU0NSRUVOX0hJR0ggNDI5CisKK3R5cGVkZWYgc3RydWN0IEJNVkRlY0NvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKworICAgIHVpbnQ4X3QgKmZyYW1lLCBmcmFtZV9iYXNlW1NDUkVFTl9XSURFICogKFNDUkVFTl9ISUdIICsgMSldOworICAgIHVpbnQzMl90IHBhbFsyNTZdOworICAgIGNvbnN0IHVpbnQ4X3QgKnN0cmVhbTsKK30gQk1WRGVjQ29udGV4dDsKKworI2RlZmluZSBORVhUX0JZVEUodikgdiA9IGZvcndhcmQgPyB2ICsgMSA6IHYgLSAxOworCitzdGF0aWMgaW50IGRlY29kZV9ibXZfZnJhbWUoY29uc3QgdWludDhfdCAqc291cmNlLCBpbnQgc3JjX2xlbiwgdWludDhfdCAqZnJhbWUsIGludCBmcmFtZV9vZmYpCit7CisgICAgdW5zaWduZWQgdmFsLCBzYXZlZF92YWwgPSAwOworICAgIGludCB0bXBsZW4gPSBzcmNfbGVuOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgKnNvdXJjZV9lbmQgPSBzb3VyY2UgKyBzcmNfbGVuOworICAgIHVpbnQ4X3QgKmZyYW1lX2VuZCA9IGZyYW1lICsgU0NSRUVOX1dJREUgKiBTQ1JFRU5fSElHSDsKKyAgICB1aW50OF90ICpkc3QsICpkc3RfZW5kOworICAgIGludCBsZW4sIG1hc2s7CisgICAgaW50IGZvcndhcmQgPSAoZnJhbWVfb2ZmIDw9IC1TQ1JFRU5fV0lERSkgfHwgKGZyYW1lX29mZiA+PSAwKTsKKyAgICBpbnQgcmVhZF90d29fbmliYmxlcywgZmxhZzsKKyAgICBpbnQgYWR2YW5jZV9tb2RlOworICAgIGludCBtb2RlID0gMDsKKyAgICBpbnQgaTsKKworICAgIGlmIChzcmNfbGVuIDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGZvcndhcmQpIHsKKyAgICAgICAgc3JjID0gc291cmNlOworICAgICAgICBkc3QgPSBmcmFtZTsKKyAgICAgICAgZHN0X2VuZCA9IGZyYW1lX2VuZDsKKyAgICB9IGVsc2UgeworICAgICAgICBzcmMgPSBzb3VyY2UgKyBzcmNfbGVuIC0gMTsKKyAgICAgICAgZHN0ID0gZnJhbWVfZW5kIC0gMTsKKyAgICAgICAgZHN0X2VuZCA9IGZyYW1lIC0gMTsKKyAgICB9CisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc2hpZnQgPSAwOworICAgICAgICBmbGFnID0gMDsKKworICAgICAgICAvKiBUaGUgbW9kZS9sZW4gZGVjb2RpbmcgaXMgYSBiaXQgc3RyYW5nZToKKyAgICAgICAgICogdmFsdWVzIGFyZSBjb2RlZCBhcyB2YXJpYWJsZS1sZW5ndGggY29kZXMgd2l0aCBuaWJibGUgdW5pdHMsCisgICAgICAgICAqIGNvZGUgZW5kIGlzIHNpZ25hbGxlZCBieSB0d28gdG9wIGJpdHMgaW4gdGhlIG5pYmJsZSBiZWluZyBub256ZXJvLgorICAgICAgICAgKiBBbmQgc2luY2UgZGF0YSBpcyBieXRlcGFja2VkIGFuZCB3ZSByZWFkIHR3byBuaWJibGVzIGF0IGEgdGltZSwKKyAgICAgICAgICogd2UgbWF5IGdldCBhIG5pYmJsZSBiZWxvbmdpbmcgdG8gdGhlIG5leHQgY29kZS4KKyAgICAgICAgICogSGVuY2UgdGhpcyBjb252b2x1dGVkIGxvb3AuCisgICAgICAgICAqLworICAgICAgICBpZiAoIW1vZGUgfHwgKHRtcGxlbiA9PSA0KSkgeworICAgICAgICAgICAgaWYgKHNyYyA8IHNvdXJjZSB8fCBzcmMgPj0gc291cmNlX2VuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHZhbCA9ICpzcmM7CisgICAgICAgICAgICByZWFkX3R3b19uaWJibGVzID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbCA9IHNhdmVkX3ZhbDsKKyAgICAgICAgICAgIHJlYWRfdHdvX25pYmJsZXMgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICghKHZhbCAmIDB4QykpIHsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBpZihzaGlmdD4yMikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGlmICghcmVhZF90d29fbmliYmxlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjIDwgc291cmNlIHx8IHNyYyA+PSBzb3VyY2VfZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDI7CisgICAgICAgICAgICAgICAgICAgIHZhbCB8PSAqc3JjIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBpZiAoKnNyYyAmIDB4QykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB0d28gdXBwZXIgYml0cyBvZiB0aGUgbmliYmxlIGlzIHplcm8sCisgICAgICAgICAgICAgICAgLy8gc28gc2hpZnQgdG9wIG5pYmJsZSB2YWx1ZSBkb3duIGludG8gdGhlaXIgcGxhY2UKKyAgICAgICAgICAgICAgICByZWFkX3R3b19uaWJibGVzID0gMDsKKyAgICAgICAgICAgICAgICBzaGlmdCArPSAyOworICAgICAgICAgICAgICAgIG1hc2sgPSAoMSA8PCBzaGlmdCkgLSAxOworICAgICAgICAgICAgICAgIHZhbCA9ICgodmFsID4+IDIpICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOworICAgICAgICAgICAgICAgIE5FWFRfQllURShzcmMpOworICAgICAgICAgICAgICAgIGlmICgodmFsICYgKDB4QyA8PCBzaGlmdCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSkgeworICAgICAgICAgICAgZmxhZyA9IHRtcGxlbiAhPSA0OworICAgICAgICB9CisgICAgICAgIGlmIChmbGFnKSB7CisgICAgICAgICAgICB0bXBsZW4gPSA0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2F2ZWRfdmFsID0gdmFsID4+ICg0ICsgc2hpZnQpOworICAgICAgICAgICAgdG1wbGVuID0gMDsKKyAgICAgICAgICAgIHZhbCAmPSAoMSA8PCAoc2hpZnQgKyA0KSkgLSAxOworICAgICAgICAgICAgTkVYVF9CWVRFKHNyYyk7CisgICAgICAgIH0KKyAgICAgICAgYWR2YW5jZV9tb2RlID0gdmFsICYgMTsKKyAgICAgICAgbGVuID0gKHZhbCA+PiAxKSAtIDE7CisgICAgICAgIGF2X2Fzc2VydDAobGVuPjApOworICAgICAgICBtb2RlICs9IDEgKyBhZHZhbmNlX21vZGU7CisgICAgICAgIGlmIChtb2RlID49IDQpCisgICAgICAgICAgICBtb2RlIC09IDM7CisgICAgICAgIGlmIChsZW4gPD0gMCB8fCBGRkFCUyhkc3RfZW5kIC0gZHN0KSA8IGxlbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGZvcndhcmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZHN0IC0gZnJhbWUgKyBTQ1JFRU5fV0lERSA8IGZyYW1lX29mZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0IC0gZnJhbWUgKyBTQ1JFRU5fV0lERSArIGZyYW1lX29mZiA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2VuZCAtIGRzdCA8IGZyYW1lX29mZiArIGxlbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfZW5kIC0gZHN0IDwgbGVuKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IGRzdFtmcmFtZV9vZmYgKyBpXTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gbGVuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkc3QgLT0gbGVuOworICAgICAgICAgICAgICAgIGlmIChkc3QgLSBmcmFtZSArIFNDUkVFTl9XSURFIDwgZnJhbWVfb2ZmIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkc3QgLSBmcmFtZSArIFNDUkVFTl9XSURFICsgZnJhbWVfb2ZmIDwgMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfZW5kIC0gZHN0IDwgZnJhbWVfb2ZmICsgbGVuIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9lbmQgLSBkc3QgPCBsZW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSBkc3RbZnJhbWVfb2ZmICsgaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKGZvcndhcmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlICsgc3JjX2xlbiAtIHNyYyA8IGxlbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBsZW4pOworICAgICAgICAgICAgICAgIGRzdCArPSBsZW47CisgICAgICAgICAgICAgICAgc3JjICs9IGxlbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHNyYyAtIHNvdXJjZSA8IGxlbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZHN0IC09IGxlbjsKKyAgICAgICAgICAgICAgICBzcmMgLT0gbGVuOworICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB2YWwgPSBmb3J3YXJkID8gZHN0Wy0xXSA6IGRzdFsxXTsKKyAgICAgICAgICAgIGlmIChmb3J3YXJkKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KGRzdCwgdmFsLCBsZW4pOworICAgICAgICAgICAgICAgIGRzdCArPSBsZW47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRzdCAtPSBsZW47CisgICAgICAgICAgICAgICAgbWVtc2V0KGRzdCwgdmFsLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRzdCA9PSBkc3RfZW5kKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBCTVZEZWNDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIGludCB0eXBlLCBzY3Jfb2ZmOworICAgIGludCBpLCByZXQ7CisgICAgdWludDhfdCAqc3JjcHRyLCAqb3V0cHRyOworCisgICAgYy0+c3RyZWFtID0gcGt0LT5kYXRhOworICAgIHR5cGUgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZjLT5zdHJlYW0pOworICAgIGlmICh0eXBlICYgQk1WX0FVRElPKSB7CisgICAgICAgIGludCBibG9icyA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmMtPnN0cmVhbSk7CisgICAgICAgIGlmIChwa3QtPnNpemUgPCBibG9icyAqIDY1ICsgMikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBdWRpbyBkYXRhIGRvZXNuJ3QgZml0IGluIGZyYW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGMtPnN0cmVhbSArPSBibG9icyAqIDY1OworICAgIH0KKyAgICBpZiAodHlwZSAmIEJNVl9DT01NQU5EKSB7CisgICAgICAgIGludCBjb21tYW5kX3NpemUgPSAodHlwZSAmIEJNVl9QUklOVCkgPyA4IDogMTA7CisgICAgICAgIGlmIChjLT5zdHJlYW0gLSBwa3QtPmRhdGEgKyBjb21tYW5kX3NpemUgPiBwa3QtPnNpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29tbWFuZCBkYXRhIGRvZXNuJ3QgZml0IGluIGZyYW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGMtPnN0cmVhbSArPSBjb21tYW5kX3NpemU7CisgICAgfQorICAgIGlmICh0eXBlICYgQk1WX1BBTEVUVEUpIHsKKyAgICAgICAgaWYgKGMtPnN0cmVhbSAtIHBrdC0+ZGF0YSA+IHBrdC0+c2l6ZSAtIDc2OCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWxldHRlIGRhdGEgZG9lc24ndCBmaXQgaW4gZnJhbWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICAgICAgYy0+cGFsW2ldID0gMHhGRlUgPDwgMjQgfCBieXRlc3RyZWFtX2dldF9iZTI0KCZjLT5zdHJlYW0pOworICAgIH0KKyAgICBpZiAodHlwZSAmIEJNVl9TQ1JPTEwpIHsKKyAgICAgICAgaWYgKGMtPnN0cmVhbSAtIHBrdC0+ZGF0YSA+IHBrdC0+c2l6ZSAtIDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2NyZWVuIG9mZnNldCBkYXRhIGRvZXNuJ3QgZml0IGluIGZyYW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHNjcl9vZmYgPSAoaW50MTZfdClieXRlc3RyZWFtX2dldF9sZTE2KCZjLT5zdHJlYW0pOworICAgIH0gZWxzZSBpZiAoKHR5cGUgJiBCTVZfSU5UUkEpID09IEJNVl9JTlRSQSkgeworICAgICAgICBzY3Jfb2ZmID0gLTY0MDsKKyAgICB9IGVsc2UgeworICAgICAgICBzY3Jfb2ZmID0gMDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGRlY29kZV9ibXZfZnJhbWUoYy0+c3RyZWFtLCBwa3QtPnNpemUgLSAoYy0+c3RyZWFtIC0gcGt0LT5kYXRhKSwgYy0+ZnJhbWUsIHNjcl9vZmYpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZGVjb2RpbmcgZnJhbWUgZGF0YVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIG1lbWNweShmcmFtZS0+ZGF0YVsxXSwgYy0+cGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSB0eXBlICYgQk1WX1BBTEVUVEU7CisKKyAgICBvdXRwdHIgPSBmcmFtZS0+ZGF0YVswXTsKKyAgICBzcmNwdHIgPSBjLT5mcmFtZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgbWVtY3B5KG91dHB0ciwgc3JjcHRyLCBhdmN0eC0+d2lkdGgpOworICAgICAgICBzcmNwdHIgKz0gYXZjdHgtPndpZHRoOworICAgICAgICBvdXRwdHIgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgLyogYWx3YXlzIHJlcG9ydCB0aGF0IHRoZSBidWZmZXIgd2FzIGNvbXBsZXRlbHkgY29uc3VtZWQgKi8KKyAgICByZXR1cm4gcGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEJNVkRlY0NvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGMtPmF2Y3R4ID0gYXZjdHg7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICBpZiAoYXZjdHgtPndpZHRoICE9IFNDUkVFTl9XSURFIHx8IGF2Y3R4LT5oZWlnaHQgIT0gU0NSRUVOX0hJR0gpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGRpbWVuc2lvbiAlZHglZFxuIiwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYy0+ZnJhbWUgPSBjLT5mcmFtZV9iYXNlICsgNjQwOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfYm12X3ZpZGVvX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImJtdl92aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRpc2N3b3JsZCBJSSBCTVYgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQk1WX1ZJREVPLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihCTVZEZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9icmVuZGVycGl4LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9icmVuZGVycGl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkOTIyZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2JyZW5kZXJwaXguYwpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqIEJSZW5kZXIgUElYICgucGl4KSBpbWFnZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQWxla3NpIE51cm1pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qIFRlc3RlZCBhZ2FpbnN0IHNhbXBsZXMgZnJvbSBJLVdhciAvIEluZGVwZW5kZW5jZSBXYXIgYW5kIERlZmlhbmNlLiAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgSEVBREVSMV9DSFVOSyAgICAweDAzCisjZGVmaW5lIEhFQURFUjJfQ0hVTksgICAgMHgzRAorI2RlZmluZSBJTUFHRV9EQVRBX0NIVU5LIDB4MjEKKworLyogSW4gOC1iaXQgY29sb3VyIG1vZGUsIDI1NiBjb2xvdXJzIGFyZSBhdmFpbGFibGUgYXQgYW55IHRpbWUuIFdoaWNoIDI1NgorICogY29sb3VycyBhcmUgYXZhaWxhYmxlIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBoYXJkd2FyZSBwYWxldHRlCisgKiAob3IgQ0xVVCkuIEluIHRoaXMgY2FzZSwgdGhlIHBhbGV0dGUgc3VwcGxpZWQgd2l0aCBCUmVuZGVyIChzdGQucGFsKSBoYXMKKyAqIGJlZW4gbG9hZGVkIGludG8gdGhlIENMVVQuCisgKgorICogVGhlIDI1NiBjb2xvdXJzIGluIHN0ZC5wYWwgYXJlIGRpdmlkZWQgaW50byBzZXZlbiByYW5nZXMsIG9yIGBjb2xvdXIgcmFtcHMnLgorICogVGhlIGZpcnN0IDY0IGNvbG91cnMgcmVwcmVzZW50IHNoYWRlcyBvZiBncmV5IHJhbmdpbmcgZnJvbSB2ZXJ5IGRhcmsgZ3JleQorICogKGJsYWNrKSB0byB2ZXJ5IGxpZ2h0IGdyZXkgKHdoaXRlKS4gVGhlIGZvbGxvd2luZyBjb2xvdXJzIGFyZSAzMi1lbGVtZW50CisgKiByYW1wcyBmb3Igc2l4IGNvbG91cnMgYXMgc2hvd24gYmVsb3cuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBzdGRfcGFsX3RhYmxlWzI1Nl0gPSB7CisgICAgLy8gZ3JheQorICAgIDB4RkYwMDAwMDAsIDB4RkYwMzAzMDMsIDB4RkYwNjA2MDYsIDB4RkYwOTA5MDksIDB4RkYwQzBDMEMsIDB4RkYwRjBGMEYsCisgICAgMHhGRjEyMTIxMiwgMHhGRjE1MTUxNSwgMHhGRjE4MTgxOCwgMHhGRjFCMUIxQiwgMHhGRjFFMUUxRSwgMHhGRjIxMjEyMSwKKyAgICAweEZGMjQyNDI0LCAweEZGMjcyNzI3LCAweEZGMkEyQTJBLCAweEZGMkQyRDJELCAweEZGMzEzMTMxLCAweEZGMzQzNDM0LAorICAgIDB4RkYzNzM3MzcsIDB4RkYzQTNBM0EsIDB4RkYzRDNEM0QsIDB4RkY0MDQwNDAsIDB4RkY0MzQzNDMsIDB4RkY0NjQ2NDYsCisgICAgMHhGRjQ5NDk0OSwgMHhGRjRDNEM0QywgMHhGRjRGNEY0RiwgMHhGRjUyNTI1MiwgMHhGRjU1NTU1NSwgMHhGRjU4NTg1OCwKKyAgICAweEZGNUI1QjVCLCAweEZGNUU1RTVFLCAweEZGNjI2MjYyLCAweEZGNjU2NTY1LCAweEZGNjg2ODY4LCAweEZGNkI2QjZCLAorICAgIDB4RkY2RTZFNkUsIDB4RkY3MTcxNzEsIDB4RkY3NDc0NzQsIDB4RkY3Nzc3NzcsIDB4RkY3QTdBN0EsIDB4RkY3RDdEN0QsCisgICAgMHhGRjgwODA4MCwgMHhGRjgzODM4MywgMHhGRjg2ODY4NiwgMHhGRjg5ODk4OSwgMHhGRjhDOEM4QywgMHhGRjhGOEY4RiwKKyAgICAweEZGOTM5MzkzLCAweEZGOTk5OTk5LCAweEZGQTBBMEEwLCAweEZGQTdBN0E3LCAweEZGQUVBRUFFLCAweEZGQjRCNEI0LAorICAgIDB4RkZCQkJCQkIsIDB4RkZDMkMyQzIsIDB4RkZDOUM5QzksIDB4RkZDRkNGQ0YsIDB4RkZENkQ2RDYsIDB4RkZEREREREQsCisgICAgMHhGRkU0RTRFNCwgMHhGRkVBRUFFQSwgMHhGRkYxRjFGMSwgMHhGRkY4RjhGOCwKKworICAgIC8vIGJsdWUKKyAgICAweEZGMDAwMDAwLCAweEZGMDIwMjA5LCAweEZGMDUwNTEzLCAweEZGMDcwNzFELCAweEZGMEEwQTI3LCAweEZGMEMwQzMxLAorICAgIDB4RkYwRjBGM0IsIDB4RkYxMTExNDUsIDB4RkYxNDE0NEYsIDB4RkYxNjE2NTksIDB4RkYxODE4NjMsIDB4RkYxQjFCNkQsCisgICAgMHhGRjFFMUU3NywgMHhGRjIwMjA4MCwgMHhGRjIyMjI4QSwgMHhGRjI1MjU5NCwgMHhGRjI4Mjg5RSwgMHhGRjJBMkFBOCwKKyAgICAweEZGMkQyREIyLCAweEZGMkYyRkJDLCAweEZGMzEzMUM2LCAweEZGMzQzNEQwLCAweEZGMzczN0RBLCAweEZGMzkzOUU0LAorICAgIDB4RkYzQzNDRUUsIDB4RkY1NDU0RjAsIDB4RkY2QzZDRjIsIDB4RkY4NTg1RjQsIDB4RkY5RDlERjYsIDB4RkZCNUI1RjgsCisgICAgMHhGRkNFQ0VGQSwgMHhGRkU2RTZGQywKKworICAgIC8vIGdyZWVuCisgICAgMHhGRjAwMDAwMCwgMHhGRjAyMDkwMiwgMHhGRjA1MTMwNSwgMHhGRjA3MUQwNywgMHhGRjBBMjcwQSwgMHhGRjBDMzEwQywKKyAgICAweEZGMEYzQjBGLCAweEZGMTE0NTExLCAweEZGMTQ0RjE0LCAweEZGMTY1OTE2LCAweEZGMTg2MzE4LCAweEZGMUI2RDFCLAorICAgIDB4RkYxRTc3MUUsIDB4RkYyMDgwMjAsIDB4RkYyMjhBMjIsIDB4RkYyNTk0MjUsIDB4RkYyODlFMjgsIDB4RkYyQUE4MkEsCisgICAgMHhGRjJEQjIyRCwgMHhGRjJGQkMyRiwgMHhGRjMxQzYzMSwgMHhGRjM0RDAzNCwgMHhGRjM3REEzNywgMHhGRjM5RTQzOSwKKyAgICAweEZGM0NFRTNDLCAweEZGNTRGMDU0LCAweEZGNkNGMjZDLCAweEZGODVGNDg1LCAweEZGOURGNjlELCAweEZGQjVGOEI1LAorICAgIDB4RkZDRUZBQ0UsIDB4RkZFNkZDRTYsCisKKyAgICAvLyBjeWFuCisgICAgMHhGRjAwMDAwMCwgMHhGRjAyMDkwOSwgMHhGRjA1MTMxMywgMHhGRjA3MUQxRCwgMHhGRjBBMjcyNywgMHhGRjBDMzEzMSwKKyAgICAweEZGMEYzQjNCLCAweEZGMTE0NTQ1LCAweEZGMTQ0RjRGLCAweEZGMTY1OTU5LCAweEZGMTg2MzYzLCAweEZGMUI2RDZELAorICAgIDB4RkYxRTc3NzcsIDB4RkYyMDgwODAsIDB4RkYyMjhBOEEsIDB4RkYyNTk0OTQsIDB4RkYyODlFOUUsIDB4RkYyQUE4QTgsCisgICAgMHhGRjJEQjJCMiwgMHhGRjJGQkNCQywgMHhGRjMxQzZDNiwgMHhGRjM0RDBEMCwgMHhGRjM3REFEQSwgMHhGRjM5RTRFNCwKKyAgICAweEZGM0NFRUVFLCAweEZGNTRGMEYwLCAweEZGNkNGMkYyLCAweEZGODVGNEY0LCAweEZGOURGNkY2LCAweEZGQjVGOEY4LAorICAgIDB4RkZDRUZBRkEsIDB4RkZFNkZDRkMsCisKKyAgICAvLyByZWQKKyAgICAweEZGMDAwMDAwLCAweEZGMDkwMjAyLCAweEZGMTMwNTA1LCAweEZGMUQwNzA3LCAweEZGMjcwQTBBLCAweEZGMzEwQzBDLAorICAgIDB4RkYzQjBGMEYsIDB4RkY0NTExMTEsIDB4RkY0RjE0MTQsIDB4RkY1OTE2MTYsIDB4RkY2MzE4MTgsIDB4RkY2RDFCMUIsCisgICAgMHhGRjc3MUUxRSwgMHhGRjgwMjAyMCwgMHhGRjhBMjIyMiwgMHhGRjk0MjUyNSwgMHhGRjlFMjgyOCwgMHhGRkE4MkEyQSwKKyAgICAweEZGQjIyRDJELCAweEZGQkMyRjJGLCAweEZGQzYzMTMxLCAweEZGRDAzNDM0LCAweEZGREEzNzM3LCAweEZGRTQzOTM5LAorICAgIDB4RkZFRTNDM0MsIDB4RkZGMDU0NTQsIDB4RkZGMjZDNkMsIDB4RkZGNDg1ODUsIDB4RkZGNjlEOUQsIDB4RkZGOEI1QjUsCisgICAgMHhGRkZBQ0VDRSwgMHhGRkZDRTZFNiwKKworICAgIC8vIG1hZ2VudGEKKyAgICAweEZGMDAwMDAwLCAweEZGMDkwMjA5LCAweEZGMTMwNTEzLCAweEZGMUQwNzFELCAweEZGMjcwQTI3LCAweEZGMzEwQzMxLAorICAgIDB4RkYzQjBGM0IsIDB4RkY0NTExNDUsIDB4RkY0RjE0NEYsIDB4RkY1OTE2NTksIDB4RkY2MzE4NjMsIDB4RkY2RDFCNkQsCisgICAgMHhGRjc3MUU3NywgMHhGRjgwMjA4MCwgMHhGRjhBMjI4QSwgMHhGRjk0MjU5NCwgMHhGRjlFMjg5RSwgMHhGRkE4MkFBOCwKKyAgICAweEZGQjIyREIyLCAweEZGQkMyRkJDLCAweEZGQzYzMUM2LCAweEZGRDAzNEQwLCAweEZGREEzN0RBLCAweEZGRTQzOUU0LAorICAgIDB4RkZFRTNDRUUsIDB4RkZGMDU0RjAsIDB4RkZGMjZDRjIsIDB4RkZGNDg1RjQsIDB4RkZGNjlERjYsIDB4RkZGOEI1RjgsCisgICAgMHhGRkZBQ0VGQSwgMHhGRkZDRTZGQywKKworICAgIC8vIHllbGxvdworICAgIDB4RkYwMDAwMDAsIDB4RkYwOTA5MDIsIDB4RkYxMzEzMDUsIDB4RkYxRDFEMDcsIDB4RkYyNzI3MEEsIDB4RkYzMTMxMEMsCisgICAgMHhGRjNCM0IwRiwgMHhGRjQ1NDUxMSwgMHhGRjRGNEYxNCwgMHhGRjU5NTkxNiwgMHhGRjYzNjMxOCwgMHhGRjZENkQxQiwKKyAgICAweEZGNzc3NzFFLCAweEZGODA4MDIwLCAweEZGOEE4QTIyLCAweEZGOTQ5NDI1LCAweEZGOUU5RTI4LCAweEZGQThBODJBLAorICAgIDB4RkZCMkIyMkQsIDB4RkZCQ0JDMkYsIDB4RkZDNkM2MzEsIDB4RkZEMEQwMzQsIDB4RkZEQURBMzcsIDB4RkZFNEU0MzksCisgICAgMHhGRkVFRUUzQywgMHhGRkYwRjA1NCwgMHhGRkYyRjI2QywgMHhGRkY0RjQ4NSwgMHhGRkY2RjY5RCwgMHhGRkY4RjhCNSwKKyAgICAweEZGRkFGQUNFLCAweEZGRkNGQ0U2LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgUGl4SGVhZGVyIHsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgZm9ybWF0OworfSBQaXhIZWFkZXI7CisKK3N0YXRpYyBpbnQgcGl4X2RlY29kZV9oZWFkZXIoUGl4SGVhZGVyICpvdXQsIEdldEJ5dGVDb250ZXh0ICpwZ2IpCit7CisgICAgdW5zaWduZWQgaW50IGhlYWRlcl9sZW4gPSBieXRlc3RyZWFtMl9nZXRfYmUzMihwZ2IpOworCisgICAgb3V0LT5mb3JtYXQgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShwZ2IpOworICAgIGJ5dGVzdHJlYW0yX3NraXAocGdiLCAyKTsKKyAgICBvdXQtPndpZHRoICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KHBnYik7CisgICAgb3V0LT5oZWlnaHQgPSBieXRlc3RyZWFtMl9nZXRfYmUxNihwZ2IpOworCisgICAgLy8gdGhlIGhlYWRlciBpcyBhdCBsZWFzdCAxMSBieXRlcyBsb25nOyB3ZSByZWFkIHRoZSBmaXJzdCA3CisgICAgaWYgKGhlYWRlcl9sZW4gPCAxMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvLyBza2lwIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIKKyAgICBieXRlc3RyZWFtMl9za2lwKHBnYiwgaGVhZGVyX2xlbiAtIDcpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGl4X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisKKyAgICBpbnQgcmV0LCBpOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgdW5zaWduZWQgaW50IGJ5dGVzX3BwOworICAgIHVuc2lnbmVkIGludCBtYWdpY1s0XTsKKyAgICB1bnNpZ25lZCBpbnQgY2h1bmtfdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgZGF0YV9sZW47CisgICAgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9zY2FubGluZTsKKyAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfbGVmdDsKKyAgICBQaXhIZWFkZXIgaGRyOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisKKyAgICBtYWdpY1swXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgbWFnaWNbMV0gPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgIG1hZ2ljWzJdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKyAgICBtYWdpY1szXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisKKyAgICBpZiAobWFnaWNbMF0gIT0gMHgxMiB8fAorICAgICAgICBtYWdpY1sxXSAhPSAweDA4IHx8CisgICAgICAgIG1hZ2ljWzJdICE9IDB4MDIgfHwKKyAgICAgICAgbWFnaWNbM10gIT0gMHgwMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCBhIEJSZW5kZXIgUElYIGZpbGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY2h1bmtfdHlwZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgaWYgKGNodW5rX3R5cGUgIT0gSEVBREVSMV9DSFVOSyAmJiBjaHVua190eXBlICE9IEhFQURFUjJfQ0hVTkspIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNodW5rIHR5cGUgJWQuXG4iLCBjaHVua190eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0ID0gcGl4X2RlY29kZV9oZWFkZXIoJmhkciwgJmdiKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgaGVhZGVyIGxlbmd0aC5cbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBzd2l0Y2ggKGhkci5mb3JtYXQpIHsKKyAgICBjYXNlIDM6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworICAgICAgICBieXRlc19wcCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU1NUJFOworICAgICAgICBieXRlc19wcCA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU2NUJFOworICAgICAgICBieXRlc19wcCA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjI0OworICAgICAgICBieXRlc19wcCA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UXzBSR0I7CisgICAgICAgIGJ5dGVzX3BwID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiAvLyBBUkdCCisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9BUkdCOworICAgICAgICBieXRlc19wcCA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTg6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZQTg7CisgICAgICAgIGJ5dGVzX3BwID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiRm9ybWF0ICVkIiwgaGRyLmZvcm1hdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBoZHIud2lkdGgsIGhkci5oZWlnaHQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgY2h1bmtfdHlwZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4ICYmCisgICAgICAgIChjaHVua190eXBlID09IEhFQURFUjFfQ0hVTksgfHwKKyAgICAgICAgIGNodW5rX3R5cGUgPT0gSEVBREVSMl9DSFVOSykpIHsKKyAgICAgICAgLyogcmVhZCBwYWxldHRlIGRhdGEgZnJvbSBkYXRhWzFdICovCisgICAgICAgIFBpeEhlYWRlciBwYWxoZHI7CisgICAgICAgIHVpbnQzMl90ICpwYWxfb3V0ID0gKHVpbnQzMl90ICopZnJhbWUtPmRhdGFbMV07CisKKyAgICAgICAgcmV0ID0gcGl4X2RlY29kZV9oZWFkZXIoJnBhbGhkciwgJmdiKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYWxldHRlIGhlYWRlciBsZW5ndGguXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhbGhkci5mb3JtYXQgIT0gNykKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIlBhbGV0dGUgbm90IGluIFJHQiBmb3JtYXQiKTsKKworICAgICAgICBjaHVua190eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKyAgICAgICAgZGF0YV9sZW4gPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgOCk7CisgICAgICAgIGlmIChjaHVua190eXBlICE9IElNQUdFX0RBVEFfQ0hVTksgfHwgZGF0YV9sZW4gIT0gMTAzMiB8fAorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IDEwMzIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYWxldHRlIGRhdGEuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIC8vIHBhbGV0dGUgZGF0YSBpcyBzdXJyb3VuZGVkIGJ5IDggbnVsbCBieXRlcyAoYm90aCB0b3AgYW5kIGJvdHRvbSkKKyAgICAgICAgLy8gY29udmVydCAwUkdCIHRvIG1hY2hpbmUgZW5kaWFuIGZvcm1hdCAoQVJHQjMyKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpCisgICAgICAgICAgICAqcGFsX291dCsrID0gKDB4RkZVIDw8IDI0KSB8IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgOCk7CisKKyAgICAgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworCisgICAgICAgIGNodW5rX3R5cGUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7CisgICAgICAgIC8qIG5vIHBhbGV0dGUgc3VwcGxpZWQsIHVzZSB0aGUgZGVmYXVsdCBvbmUgKi8KKyAgICAgICAgdWludDMyX3QgKnBhbF9vdXQgPSAodWludDMyX3QgKilmcmFtZS0+ZGF0YVsxXTsKKworICAgICAgICAvLyBUT0RPOiBhZGQgYW4gQVZPcHRpb24gdG8gbG9hZCBjdXN0b20gcGFsZXR0ZSBmaWxlcworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlVzaW5nIGRlZmF1bHQgcGFsZXR0ZSwgY29sb3JzIG1pZ2h0IGJlIG9mZi5cbiIpOworICAgICAgICBtZW1jcHkocGFsX291dCwgc3RkX3BhbF90YWJsZSwgc2l6ZW9mKHVpbnQzMl90KSAqIDI1Nik7CisKKyAgICAgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgIH0KKworICAgIGRhdGFfbGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgOCk7CisKKyAgICAvLyByZWFkIHRoZSBpbWFnZSBkYXRhIHRvIHRoZSBidWZmZXIKKyAgICBieXRlc19wZXJfc2NhbmxpbmUgPSBieXRlc19wcCAqIGhkci53aWR0aDsKKyAgICBieXRlc19sZWZ0ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKTsKKworICAgIGlmIChjaHVua190eXBlICE9IElNQUdFX0RBVEFfQ0hVTksgfHwgZGF0YV9sZW4gIT0gYnl0ZXNfbGVmdCB8fAorICAgICAgICBieXRlc19sZWZ0IC8gYnl0ZXNfcGVyX3NjYW5saW5lIDwgaGRyLmhlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgaW1hZ2UgZGF0YS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGZyYW1lLT5kYXRhWzBdLCBmcmFtZS0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBhdnBrdC0+ZGF0YSArIGJ5dGVzdHJlYW0yX3RlbGwoJmdiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl9zY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl9zY2FubGluZSwgaGRyLmhlaWdodCk7CisKKyAgICBmcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfYnJlbmRlcl9waXhfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gImJyZW5kZXJfcGl4IiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJSZW5kZXIgUElYIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfQlJFTkRFUl9QSVgsCisgICAgLmRlY29kZSAgICAgICA9IHBpeF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYnN3YXBkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Jzd2FwZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlMWVjMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Jzd2FwZHNwLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisKK3N0YXRpYyB2b2lkIGJzd2FwX2J1Zih1aW50MzJfdCAqZHN0LCBjb25zdCB1aW50MzJfdCAqc3JjLCBpbnQgdykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgKyA4IDw9IHc7IGkgKz0gOCkgeworICAgICAgICBkc3RbaSArIDBdID0gYXZfYnN3YXAzMihzcmNbaSArIDBdKTsKKyAgICAgICAgZHN0W2kgKyAxXSA9IGF2X2Jzd2FwMzIoc3JjW2kgKyAxXSk7CisgICAgICAgIGRzdFtpICsgMl0gPSBhdl9ic3dhcDMyKHNyY1tpICsgMl0pOworICAgICAgICBkc3RbaSArIDNdID0gYXZfYnN3YXAzMihzcmNbaSArIDNdKTsKKyAgICAgICAgZHN0W2kgKyA0XSA9IGF2X2Jzd2FwMzIoc3JjW2kgKyA0XSk7CisgICAgICAgIGRzdFtpICsgNV0gPSBhdl9ic3dhcDMyKHNyY1tpICsgNV0pOworICAgICAgICBkc3RbaSArIDZdID0gYXZfYnN3YXAzMihzcmNbaSArIDZdKTsKKyAgICAgICAgZHN0W2kgKyA3XSA9IGF2X2Jzd2FwMzIoc3JjW2kgKyA3XSk7CisgICAgfQorICAgIGZvciAoOyBpIDwgdzsgaSsrKQorICAgICAgICBkc3RbaSArIDBdID0gYXZfYnN3YXAzMihzcmNbaSArIDBdKTsKK30KKworc3RhdGljIHZvaWQgYnN3YXAxNl9idWYodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgaW50IGxlbikKK3sKKyAgICB3aGlsZSAobGVuLS0pCisgICAgICAgICpkc3QrKyA9IGF2X2Jzd2FwMTYoKnNyYysrKTsKK30KKworYXZfY29sZCB2b2lkIGZmX2Jzd2FwZHNwX2luaXQoQnN3YXBEU1BDb250ZXh0ICpjKQoreworICAgIGMtPmJzd2FwX2J1ZiAgID0gYnN3YXBfYnVmOworICAgIGMtPmJzd2FwMTZfYnVmID0gYnN3YXAxNl9idWY7CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2Jzd2FwZHNwX2luaXRfeDg2KGMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYnN3YXBkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2Jzd2FwZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2N2Q3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Jzd2FwZHNwLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQlNXQVBfQlVGX0gKKyNkZWZpbmUgQVZDT0RFQ19CU1dBUF9CVUZfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IEJzd2FwRFNQQ29udGV4dCB7CisgICAgdm9pZCAoKmJzd2FwX2J1ZikodWludDMyX3QgKmRzdCwgY29uc3QgdWludDMyX3QgKnNyYywgaW50IHcpOworICAgIHZvaWQgKCpic3dhcDE2X2J1ZikodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgaW50IGxlbik7Cit9IEJzd2FwRFNQQ29udGV4dDsKKwordm9pZCBmZl9ic3dhcGRzcF9pbml0KEJzd2FwRFNQQ29udGV4dCAqYyk7Cit2b2lkIGZmX2Jzd2FwZHNwX2luaXRfeDg2KEJzd2FwRFNQQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0JTV0FQX0JVRl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ieXRlc3RyZWFtLmggYi9mZm1wZWcvbGliYXZjb2RlYy9ieXRlc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjYjYwMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2J5dGVzdHJlYW0uaApAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIEJ5dGVzdHJlYW0gZnVuY3Rpb25zCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZS5jb3VkdXJpZXJAZnJlZS5mcj4KKyAqIENvcHlyaWdodCAoYykgMjAxMiBBbmVlc2ggRG9ncmEgKGxpb25hbmVlc2gpIDxsaW9uYW5lZXNoQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0JZVEVTVFJFQU1fSAorI2RlZmluZSBBVkNPREVDX0JZVEVTVFJFQU1fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCit0eXBlZGVmIHN0cnVjdCBHZXRCeXRlQ29udGV4dCB7CisgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLCAqYnVmZmVyX2VuZCwgKmJ1ZmZlcl9zdGFydDsKK30gR2V0Qnl0ZUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFB1dEJ5dGVDb250ZXh0IHsKKyAgICB1aW50OF90ICpidWZmZXIsICpidWZmZXJfZW5kLCAqYnVmZmVyX3N0YXJ0OworICAgIGludCBlb2Y7Cit9IFB1dEJ5dGVDb250ZXh0OworCisjZGVmaW5lIERFRih0eXBlLCBuYW1lLCBieXRlcywgcmVhZCwgd3JpdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHR5cGUgYnl0ZXN0cmVhbV9nZXRfICMjIG5hbWUoY29uc3QgdWludDhfdCAqKmIpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqYikgKz0gYnl0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmVhZCgqYiAtIGJ5dGVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBieXRlc3RyZWFtX3B1dF8gIyMgbmFtZSh1aW50OF90ICoqYiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSB2YWx1ZSkgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdyaXRlKCpiLCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmIpICs9IGJ5dGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBieXRlc3RyZWFtMl9wdXRfICMjIG5hbWUgIyMgdShQdXRCeXRlQ29udGV4dCAqcCwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSB2YWx1ZSkgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJ5dGVzdHJlYW1fcHV0XyAjIyBuYW1lKCZwLT5idWZmZXIsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGJ5dGVzdHJlYW0yX3B1dF8gIyMgbmFtZShQdXRCeXRlQ29udGV4dCAqcCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSB2YWx1ZSkgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFwLT5lb2YgJiYgKHAtPmJ1ZmZlcl9lbmQgLSBwLT5idWZmZXIgPj0gYnl0ZXMpKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3cml0ZShwLT5idWZmZXIsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcC0+YnVmZmVyICs9IGJ5dGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwLT5lb2YgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB0eXBlIGJ5dGVzdHJlYW0yX2dldF8gIyMgbmFtZSAjIyB1KEdldEJ5dGVDb250ZXh0ICpnKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gYnl0ZXN0cmVhbV9nZXRfICMjIG5hbWUoJmctPmJ1ZmZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdHlwZSBieXRlc3RyZWFtMl9nZXRfICMjIG5hbWUoR2V0Qnl0ZUNvbnRleHQgKmcpICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGctPmJ1ZmZlcl9lbmQgLSBnLT5idWZmZXIgPCBieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gYnl0ZXN0cmVhbTJfZ2V0XyAjIyBuYW1lICMjIHUoZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdHlwZSBieXRlc3RyZWFtMl9wZWVrXyAjIyBuYW1lKEdldEJ5dGVDb250ZXh0ICpnKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGctPmJ1ZmZlcl9lbmQgLSBnLT5idWZmZXIgPCBieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmVhZChnLT5idWZmZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0RFRih1aW50NjRfdCwgICAgIGxlNjQsIDgsIEFWX1JMNjQsIEFWX1dMNjQpCitERUYodW5zaWduZWQgaW50LCBsZTMyLCA0LCBBVl9STDMyLCBBVl9XTDMyKQorREVGKHVuc2lnbmVkIGludCwgbGUyNCwgMywgQVZfUkwyNCwgQVZfV0wyNCkKK0RFRih1bnNpZ25lZCBpbnQsIGxlMTYsIDIsIEFWX1JMMTYsIEFWX1dMMTYpCitERUYodWludDY0X3QsICAgICBiZTY0LCA4LCBBVl9SQjY0LCBBVl9XQjY0KQorREVGKHVuc2lnbmVkIGludCwgYmUzMiwgNCwgQVZfUkIzMiwgQVZfV0IzMikKK0RFRih1bnNpZ25lZCBpbnQsIGJlMjQsIDMsIEFWX1JCMjQsIEFWX1dCMjQpCitERUYodW5zaWduZWQgaW50LCBiZTE2LCAyLCBBVl9SQjE2LCBBVl9XQjE2KQorREVGKHVuc2lnbmVkIGludCwgYnl0ZSwgMSwgQVZfUkI4ICwgQVZfV0I4KQorCisjaWYgSEFWRV9CSUdFTkRJQU4KKyMgICBkZWZpbmUgYnl0ZXN0cmVhbTJfZ2V0X25lMTYgIGJ5dGVzdHJlYW0yX2dldF9iZTE2CisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX2dldF9uZTI0ICBieXRlc3RyZWFtMl9nZXRfYmUyNAorIyAgIGRlZmluZSBieXRlc3RyZWFtMl9nZXRfbmUzMiAgYnl0ZXN0cmVhbTJfZ2V0X2JlMzIKKyMgICBkZWZpbmUgYnl0ZXN0cmVhbTJfZ2V0X25lNjQgIGJ5dGVzdHJlYW0yX2dldF9iZTY0CisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX2dldF9uZTE2dSBieXRlc3RyZWFtMl9nZXRfYmUxNnUKKyMgICBkZWZpbmUgYnl0ZXN0cmVhbTJfZ2V0X25lMjR1IGJ5dGVzdHJlYW0yX2dldF9iZTI0dQorIyAgIGRlZmluZSBieXRlc3RyZWFtMl9nZXRfbmUzMnUgYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1CisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX2dldF9uZTY0dSBieXRlc3RyZWFtMl9nZXRfYmU2NHUKKyMgICBkZWZpbmUgYnl0ZXN0cmVhbTJfcHV0X25lMTYgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2CisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX3B1dF9uZTI0ICBieXRlc3RyZWFtMl9wdXRfYmUyNAorIyAgIGRlZmluZSBieXRlc3RyZWFtMl9wdXRfbmUzMiAgYnl0ZXN0cmVhbTJfcHV0X2JlMzIKKyMgICBkZWZpbmUgYnl0ZXN0cmVhbTJfcHV0X25lNjQgIGJ5dGVzdHJlYW0yX3B1dF9iZTY0CisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX3BlZWtfbmUxNiBieXRlc3RyZWFtMl9wZWVrX2JlMTYKKyMgICBkZWZpbmUgYnl0ZXN0cmVhbTJfcGVla19uZTI0IGJ5dGVzdHJlYW0yX3BlZWtfYmUyNAorIyAgIGRlZmluZSBieXRlc3RyZWFtMl9wZWVrX25lMzIgYnl0ZXN0cmVhbTJfcGVla19iZTMyCisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX3BlZWtfbmU2NCBieXRlc3RyZWFtMl9wZWVrX2JlNjQKKyNlbHNlCisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX2dldF9uZTE2ICBieXRlc3RyZWFtMl9nZXRfbGUxNgorIyAgIGRlZmluZSBieXRlc3RyZWFtMl9nZXRfbmUyNCAgYnl0ZXN0cmVhbTJfZ2V0X2xlMjQKKyMgICBkZWZpbmUgYnl0ZXN0cmVhbTJfZ2V0X25lMzIgIGJ5dGVzdHJlYW0yX2dldF9sZTMyCisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX2dldF9uZTY0ICBieXRlc3RyZWFtMl9nZXRfbGU2NAorIyAgIGRlZmluZSBieXRlc3RyZWFtMl9nZXRfbmUxNnUgYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1CisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX2dldF9uZTI0dSBieXRlc3RyZWFtMl9nZXRfbGUyNHUKKyMgICBkZWZpbmUgYnl0ZXN0cmVhbTJfZ2V0X25lMzJ1IGJ5dGVzdHJlYW0yX2dldF9sZTMydQorIyAgIGRlZmluZSBieXRlc3RyZWFtMl9nZXRfbmU2NHUgYnl0ZXN0cmVhbTJfZ2V0X2xlNjR1CisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX3B1dF9uZTE2ICBieXRlc3RyZWFtMl9wdXRfbGUxNgorIyAgIGRlZmluZSBieXRlc3RyZWFtMl9wdXRfbmUyNCAgYnl0ZXN0cmVhbTJfcHV0X2xlMjQKKyMgICBkZWZpbmUgYnl0ZXN0cmVhbTJfcHV0X25lMzIgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyCisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX3B1dF9uZTY0ICBieXRlc3RyZWFtMl9wdXRfbGU2NAorIyAgIGRlZmluZSBieXRlc3RyZWFtMl9wZWVrX25lMTYgYnl0ZXN0cmVhbTJfcGVla19sZTE2CisjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX3BlZWtfbmUyNCBieXRlc3RyZWFtMl9wZWVrX2xlMjQKKyMgICBkZWZpbmUgYnl0ZXN0cmVhbTJfcGVla19uZTMyIGJ5dGVzdHJlYW0yX3BlZWtfbGUzMgorIyAgIGRlZmluZSBieXRlc3RyZWFtMl9wZWVrX25lNjQgYnl0ZXN0cmVhbTJfcGVla19sZTY0CisjZW5kaWYKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBieXRlc3RyZWFtMl9pbml0KEdldEJ5dGVDb250ZXh0ICpnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUpCit7CisgICAgYXZfYXNzZXJ0MChidWZfc2l6ZSA+PSAwKTsKKyAgICBnLT5idWZmZXIgICAgICAgPSBidWY7CisgICAgZy0+YnVmZmVyX3N0YXJ0ID0gYnVmOworICAgIGctPmJ1ZmZlcl9lbmQgICA9IGJ1ZiArIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGJ5dGVzdHJlYW0yX2luaXRfd3JpdGVyKFB1dEJ5dGVDb250ZXh0ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSkKK3sKKyAgICBhdl9hc3NlcnQwKGJ1Zl9zaXplID49IDApOworICAgIHAtPmJ1ZmZlciAgICAgICA9IGJ1ZjsKKyAgICBwLT5idWZmZXJfc3RhcnQgPSBidWY7CisgICAgcC0+YnVmZmVyX2VuZCAgID0gYnVmICsgYnVmX3NpemU7CisgICAgcC0+ZW9mICAgICAgICAgID0gMDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KEdldEJ5dGVDb250ZXh0ICpnKQoreworICAgIHJldHVybiBnLT5idWZmZXJfZW5kIC0gZy0+YnVmZmVyOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnRfcChQdXRCeXRlQ29udGV4dCAqcCkKK3sKKyAgICByZXR1cm4gcC0+YnVmZmVyX2VuZCAtIHAtPmJ1ZmZlcjsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBieXRlc3RyZWFtMl9za2lwKEdldEJ5dGVDb250ZXh0ICpnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIGctPmJ1ZmZlciArPSBGRk1JTihnLT5idWZmZXJfZW5kIC0gZy0+YnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBieXRlc3RyZWFtMl9za2lwdShHZXRCeXRlQ29udGV4dCAqZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgZy0+YnVmZmVyICs9IHNpemU7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgYnl0ZXN0cmVhbTJfc2tpcF9wKFB1dEJ5dGVDb250ZXh0ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgaW50IHNpemUyOworICAgIGlmIChwLT5lb2YpCisgICAgICAgIHJldHVybjsKKyAgICBzaXplMiA9IEZGTUlOKHAtPmJ1ZmZlcl9lbmQgLSBwLT5idWZmZXIsIHNpemUpOworICAgIGlmIChzaXplMiAhPSBzaXplKQorICAgICAgICBwLT5lb2YgPSAxOworICAgIHAtPmJ1ZmZlciArPSBzaXplMjsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGJ5dGVzdHJlYW0yX3RlbGwoR2V0Qnl0ZUNvbnRleHQgKmcpCit7CisgICAgcmV0dXJuIChpbnQpKGctPmJ1ZmZlciAtIGctPmJ1ZmZlcl9zdGFydCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBieXRlc3RyZWFtMl90ZWxsX3AoUHV0Qnl0ZUNvbnRleHQgKnApCit7CisgICAgcmV0dXJuIChpbnQpKHAtPmJ1ZmZlciAtIHAtPmJ1ZmZlcl9zdGFydCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBieXRlc3RyZWFtMl9zaXplKEdldEJ5dGVDb250ZXh0ICpnKQoreworICAgIHJldHVybiAoaW50KShnLT5idWZmZXJfZW5kIC0gZy0+YnVmZmVyX3N0YXJ0KTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGJ5dGVzdHJlYW0yX3NpemVfcChQdXRCeXRlQ29udGV4dCAqcCkKK3sKKyAgICByZXR1cm4gKGludCkocC0+YnVmZmVyX2VuZCAtIHAtPmJ1ZmZlcl9zdGFydCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBieXRlc3RyZWFtMl9zZWVrKEdldEJ5dGVDb250ZXh0ICpnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGVuY2UpCit7CisgICAgc3dpdGNoICh3aGVuY2UpIHsKKyAgICBjYXNlIFNFRUtfQ1VSOgorICAgICAgICBvZmZzZXQgICAgID0gYXZfY2xpcChvZmZzZXQsIC0oZy0+YnVmZmVyIC0gZy0+YnVmZmVyX3N0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy0+YnVmZmVyX2VuZCAtIGctPmJ1ZmZlcik7CisgICAgICAgIGctPmJ1ZmZlciArPSBvZmZzZXQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VFS19FTkQ6CisgICAgICAgIG9mZnNldCAgICA9IGF2X2NsaXAob2Zmc2V0LCAtKGctPmJ1ZmZlcl9lbmQgLSBnLT5idWZmZXJfc3RhcnQpLCAwKTsKKyAgICAgICAgZy0+YnVmZmVyID0gZy0+YnVmZmVyX2VuZCArIG9mZnNldDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUVLX1NFVDoKKyAgICAgICAgb2Zmc2V0ICAgID0gYXZfY2xpcChvZmZzZXQsIDAsIGctPmJ1ZmZlcl9lbmQgLSBnLT5idWZmZXJfc3RhcnQpOworICAgICAgICBnLT5idWZmZXIgPSBnLT5idWZmZXJfc3RhcnQgKyBvZmZzZXQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHJldHVybiBieXRlc3RyZWFtMl90ZWxsKGcpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgYnl0ZXN0cmVhbTJfc2Vla19wKFB1dEJ5dGVDb250ZXh0ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hlbmNlKQoreworICAgIHAtPmVvZiA9IDA7CisgICAgc3dpdGNoICh3aGVuY2UpIHsKKyAgICBjYXNlIFNFRUtfQ1VSOgorICAgICAgICBpZiAocC0+YnVmZmVyX2VuZCAtIHAtPmJ1ZmZlciA8IG9mZnNldCkKKyAgICAgICAgICAgIHAtPmVvZiA9IDE7CisgICAgICAgIG9mZnNldCAgICAgPSBhdl9jbGlwKG9mZnNldCwgLShwLT5idWZmZXIgLSBwLT5idWZmZXJfc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5idWZmZXJfZW5kIC0gcC0+YnVmZmVyKTsKKyAgICAgICAgcC0+YnVmZmVyICs9IG9mZnNldDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUVLX0VORDoKKyAgICAgICAgaWYgKG9mZnNldCA+IDApCisgICAgICAgICAgICBwLT5lb2YgPSAxOworICAgICAgICBvZmZzZXQgICAgPSBhdl9jbGlwKG9mZnNldCwgLShwLT5idWZmZXJfZW5kIC0gcC0+YnVmZmVyX3N0YXJ0KSwgMCk7CisgICAgICAgIHAtPmJ1ZmZlciA9IHAtPmJ1ZmZlcl9lbmQgKyBvZmZzZXQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VFS19TRVQ6CisgICAgICAgIGlmIChwLT5idWZmZXJfZW5kIC0gcC0+YnVmZmVyX3N0YXJ0IDwgb2Zmc2V0KQorICAgICAgICAgICAgcC0+ZW9mID0gMTsKKyAgICAgICAgb2Zmc2V0ICAgID0gYXZfY2xpcChvZmZzZXQsIDAsIHAtPmJ1ZmZlcl9lbmQgLSBwLT5idWZmZXJfc3RhcnQpOworICAgICAgICBwLT5idWZmZXIgPSBwLT5idWZmZXJfc3RhcnQgKyBvZmZzZXQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHJldHVybiBieXRlc3RyZWFtMl90ZWxsX3AocCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKEdldEJ5dGVDb250ZXh0ICpnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgaW50IHNpemUyID0gRkZNSU4oZy0+YnVmZmVyX2VuZCAtIGctPmJ1ZmZlciwgc2l6ZSk7CisgICAgbWVtY3B5KGRzdCwgZy0+YnVmZmVyLCBzaXplMik7CisgICAgZy0+YnVmZmVyICs9IHNpemUyOworICAgIHJldHVybiBzaXplMjsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IGJ5dGVzdHJlYW0yX2dldF9idWZmZXJ1KEdldEJ5dGVDb250ZXh0ICpnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgICBtZW1jcHkoZHN0LCBnLT5idWZmZXIsIHNpemUpOworICAgIGctPmJ1ZmZlciArPSBzaXplOworICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQgYnl0ZXN0cmVhbTJfcHV0X2J1ZmZlcihQdXRCeXRlQ29udGV4dCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIGludCBzaXplMjsKKyAgICBpZiAocC0+ZW9mKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzaXplMiA9IEZGTUlOKHAtPmJ1ZmZlcl9lbmQgLSBwLT5idWZmZXIsIHNpemUpOworICAgIGlmIChzaXplMiAhPSBzaXplKQorICAgICAgICBwLT5lb2YgPSAxOworICAgIG1lbWNweShwLT5idWZmZXIsIHNyYywgc2l6ZTIpOworICAgIHAtPmJ1ZmZlciArPSBzaXplMjsKKyAgICByZXR1cm4gc2l6ZTI7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCBieXRlc3RyZWFtMl9wdXRfYnVmZmVydShQdXRCeXRlQ29udGV4dCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgbWVtY3B5KHAtPmJ1ZmZlciwgc3JjLCBzaXplKTsKKyAgICBwLT5idWZmZXIgKz0gc2l6ZTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBieXRlc3RyZWFtMl9zZXRfYnVmZmVyKFB1dEJ5dGVDb250ZXh0ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgc2l6ZTI7CisgICAgaWYgKHAtPmVvZikKKyAgICAgICAgcmV0dXJuOworICAgIHNpemUyID0gRkZNSU4ocC0+YnVmZmVyX2VuZCAtIHAtPmJ1ZmZlciwgc2l6ZSk7CisgICAgaWYgKHNpemUyICE9IHNpemUpCisgICAgICAgIHAtPmVvZiA9IDE7CisgICAgbWVtc2V0KHAtPmJ1ZmZlciwgYywgc2l6ZTIpOworICAgIHAtPmJ1ZmZlciArPSBzaXplMjsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBieXRlc3RyZWFtMl9zZXRfYnVmZmVydShQdXRCeXRlQ29udGV4dCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgICBtZW1zZXQocC0+YnVmZmVyLCBjLCBzaXplKTsKKyAgICBwLT5idWZmZXIgKz0gc2l6ZTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IGJ5dGVzdHJlYW0yX2dldF9lb2YoUHV0Qnl0ZUNvbnRleHQgKnApCit7CisgICAgcmV0dXJuIHAtPmVvZjsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IGJ5dGVzdHJlYW0yX2NvcHlfYnVmZmVydShQdXRCeXRlQ29udGV4dCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgKmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIG1lbWNweShwLT5idWZmZXIsIGctPmJ1ZmZlciwgc2l6ZSk7CisgICAgcC0+YnVmZmVyICs9IHNpemU7CisgICAgZy0+YnVmZmVyICs9IHNpemU7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCBieXRlc3RyZWFtMl9jb3B5X2J1ZmZlcihQdXRCeXRlQ29udGV4dCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCeXRlQ29udGV4dCAqZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgc2l6ZTI7CisKKyAgICBpZiAocC0+ZW9mKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzaXplICA9IEZGTUlOKGctPmJ1ZmZlcl9lbmQgLSBnLT5idWZmZXIsIHNpemUpOworICAgIHNpemUyID0gRkZNSU4ocC0+YnVmZmVyX2VuZCAtIHAtPmJ1ZmZlciwgc2l6ZSk7CisgICAgaWYgKHNpemUyICE9IHNpemUpCisgICAgICAgIHAtPmVvZiA9IDE7CisKKyAgICByZXR1cm4gYnl0ZXN0cmVhbTJfY29weV9idWZmZXJ1KHAsIGcsIHNpemUyKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IGJ5dGVzdHJlYW1fZ2V0X2J1ZmZlcihjb25zdCB1aW50OF90ICoqYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgICBtZW1jcHkoZHN0LCAqYiwgc2l6ZSk7CisgICAgKCpiKSArPSBzaXplOworICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcih1aW50OF90ICoqYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIG1lbWNweSgqYiwgc3JjLCBzaXplKTsKKyAgICAoKmIpICs9IHNpemU7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX0JZVEVTVFJFQU1fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvYzkzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9jOTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDNmYTNiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvYzkzLmMKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiBJbnRlcnBsYXkgQzkzIHZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWRnJhbWUgKnBpY3R1cmVzWzJdOworICAgIGludCBjdXJyZW50cGljOworfSBDOTNEZWNvZGVyQ29udGV4dDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDOTNfOFg4X0ZST01fUFJFViAgPSAweDAyLAorICAgIEM5M180WDRfRlJPTV9QUkVWICA9IDB4MDYsCisgICAgQzkzXzRYNF9GUk9NX0NVUlIgID0gMHgwNywKKyAgICBDOTNfOFg4XzJDT0xPUiAgICAgPSAweDA4LAorICAgIEM5M180WDRfMkNPTE9SICAgICA9IDB4MEEsCisgICAgQzkzXzRYNF80Q09MT1JfR1JQID0gMHgwQiwKKyAgICBDOTNfNFg0XzRDT0xPUiAgICAgPSAweDBELAorICAgIEM5M19OT09QICAgICAgICAgICA9IDB4MEUsCisgICAgQzkzXzhYOF9JTlRSQSAgICAgID0gMHgwRiwKK30gQzkzQmxvY2tUeXBlOworCisjZGVmaW5lIFdJRFRIICAgMzIwCisjZGVmaW5lIEhFSUdIVCAgMTkyCisKKyNkZWZpbmUgQzkzX0hBU19QQUxFVFRFIDB4MDEKKyNkZWZpbmUgQzkzX0ZJUlNUX0ZSQU1FIDB4MDIKKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEM5M0RlY29kZXJDb250ZXh0ICogY29uc3QgYzkzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmM5My0+cGljdHVyZXNbMF0pOworICAgIGF2X2ZyYW1lX2ZyZWUoJmM5My0+cGljdHVyZXNbMV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQzkzRGVjb2RlckNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworCisgICAgcy0+cGljdHVyZXNbMF0gPSBhdl9mcmFtZV9hbGxvYygpOworICAgIHMtPnBpY3R1cmVzWzFdID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPnBpY3R1cmVzWzBdIHx8ICFzLT5waWN0dXJlc1sxXSkgeworICAgICAgICBkZWNvZGVfZW5kKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY29weV9ibG9jayhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ4X3QgKnRvLAorICAgICAgICB1aW50OF90ICpmcm9tLCBpbnQgb2Zmc2V0LCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKQoreworICAgIGludCBpOworICAgIGludCB3aWR0aCA9IGhlaWdodDsKKyAgICBpbnQgZnJvbV94ID0gb2Zmc2V0ICUgV0lEVEg7CisgICAgaW50IGZyb21feSA9IG9mZnNldCAvIFdJRFRIOworICAgIGludCBvdmVyZmxvdyA9IGZyb21feCArIHdpZHRoIC0gV0lEVEg7CisKKyAgICBpZiAoIWZyb20pIHsKKyAgICAgICAgLyogc2lsZW50bHkgaWdub3JpbmcgcHJlZGljdGl2ZSBibG9ja3MgaW4gZmlyc3QgZnJhbWUgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGZyb21feSArIGhlaWdodCA+IEhFSUdIVCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgb2Zmc2V0ICVkIGR1cmluZyBDOTMgZGVjb2RpbmdcbiIsCisgICAgICAgICAgICAgICBvZmZzZXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAob3ZlcmZsb3cgPiAwKSB7CisgICAgICAgIHdpZHRoIC09IG92ZXJmbG93OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIG1lbWNweSgmdG9baSpzdHJpZGUrd2lkdGhdLCAmZnJvbVsoZnJvbV95K2kpKnN0cmlkZV0sIG92ZXJmbG93KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBtZW1jcHkoJnRvW2kqc3RyaWRlXSwgJmZyb21bKGZyb21feStpKSpzdHJpZGUrZnJvbV94XSwgd2lkdGgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHJhd19uX2NvbG9yKHVpbnQ4X3QgKm91dCwgaW50IHN0cmlkZSwgaW50IHdpZHRoLAorICAgICAgICAgaW50IGhlaWdodCwgaW50IGJwcCwgdWludDhfdCBjb2xzWzRdLCB1aW50OF90IGdycHNbNF0sIHVpbnQzMl90IGNvbCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaWYgKGdycHMpCisgICAgICAgICAgICBjb2xzWzBdID0gZ3Jwc1szICogKHkgPj4gMSldOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaWYgKGdycHMpCisgICAgICAgICAgICAgICAgY29sc1sxXT0gZ3Jwc1soeCA+PiAxKSArIDFdOworICAgICAgICAgICAgb3V0W3ggKyB5KnN0cmlkZV0gPSBjb2xzW2NvbCAmICgoMSA8PCBicHApIC0gMSldOworICAgICAgICAgICAgY29sID4+PSBicHA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgQzkzRGVjb2RlckNvbnRleHQgKiBjb25zdCBjOTMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKiBjb25zdCBuZXdwaWMgPSBjOTMtPnBpY3R1cmVzW2M5My0+Y3VycmVudHBpY107CisgICAgQVZGcmFtZSAqIGNvbnN0IG9sZHBpYyA9IGM5My0+cGljdHVyZXNbYzkzLT5jdXJyZW50cGljXjFdOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIHVpbnQ4X3QgKm91dDsKKyAgICBpbnQgc3RyaWRlLCByZXQsIGksIHgsIHksIGIsIGJ0ID0gMDsKKworICAgIGlmICgocmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIFdJRFRILCBIRUlHSFQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBjOTMtPmN1cnJlbnRwaWMgXj0gMTsKKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBuZXdwaWMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzdHJpZGUgPSBuZXdwaWMtPmxpbmVzaXplWzBdOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGJ1ZiwgYnVmX3NpemUpOworICAgIGIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgIGlmIChiICYgQzkzX0ZJUlNUX0ZSQU1FKSB7CisgICAgICAgIG5ld3BpYy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIG5ld3BpYy0+a2V5X2ZyYW1lID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXdwaWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICBuZXdwaWMtPmtleV9mcmFtZSA9IDA7CisgICAgfQorCisgICAgZm9yICh5ID0gMDsgeSA8IEhFSUdIVDsgeSArPSA4KSB7CisgICAgICAgIG91dCA9IG5ld3BpYy0+ZGF0YVswXSArIHkgKiBzdHJpZGU7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBXSURUSDsgeCArPSA4KSB7CisgICAgICAgICAgICB1aW50OF90ICpjb3B5X2Zyb20gPSBvbGRwaWMtPmRhdGFbMF07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBqOworICAgICAgICAgICAgdWludDhfdCBjb2xzWzRdLCBncnBzWzRdOworICAgICAgICAgICAgQzkzQmxvY2tUeXBlIGJsb2NrX3R5cGU7CisKKyAgICAgICAgICAgIGlmICghYnQpCisgICAgICAgICAgICAgICAgYnQgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworCisgICAgICAgICAgICBibG9ja190eXBlPSBidCAmIDB4MEY7CisgICAgICAgICAgICBzd2l0Y2ggKGJsb2NrX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzkzXzhYOF9GUk9NX1BSRVY6CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGNvcHlfYmxvY2soYXZjdHgsIG91dCwgY29weV9mcm9tLCBvZmZzZXQsIDgsIHN0cmlkZSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDOTNfNFg0X0ZST01fQ1VSUjoKKyAgICAgICAgICAgICAgICBjb3B5X2Zyb20gPSBuZXdwaWMtPmRhdGFbMF07CisgICAgICAgICAgICBjYXNlIEM5M180WDRfRlJPTV9QUkVWOgorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqICs9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnYik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbV94ID0gb2Zmc2V0ICUgV0lEVEg7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbV95ID0gb2Zmc2V0IC8gV0lEVEg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tfdHlwZSA9PSBDOTNfNFg0X0ZST01fQ1VSUiAmJiBmcm9tX3kgPT0geStqICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZGQUJTKGZyb21feCAtIHgtaSkgPCA0IHx8IEZGQUJTKGZyb21feCAtIHgtaSkgPiBXSURUSC00KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgImJsb2NrIG92ZXJsYXAgJWQgJWQgJWQgJWRcbiIsIGZyb21feCwgeCtpLCBmcm9tX3ksIHkraik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGNvcHlfYmxvY2soYXZjdHgsICZvdXRbaipzdHJpZGUraV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weV9mcm9tLCBvZmZzZXQsIDQsIHN0cmlkZSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEM5M184WDhfMkNPTE9SOgorICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmdiLCBjb2xzLCAyKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRyYXdfbl9jb2xvcihvdXQgKyBpKnN0cmlkZSwgc3RyaWRlLCA4LCAxLCAxLCBjb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEM5M180WDRfMkNPTE9SOgorICAgICAgICAgICAgY2FzZSBDOTNfNFg0XzRDT0xPUjoKKyAgICAgICAgICAgIGNhc2UgQzkzXzRYNF80Q09MT1JfR1JQOgorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqICs9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrX3R5cGUgPT0gQzkzXzRYNF8yQ09MT1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnYiwgY29scywgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19uX2NvbG9yKG91dCArIGkgKyBqKnN0cmlkZSwgc3RyaWRlLCA0LCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgY29scywgTlVMTCwgYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJsb2NrX3R5cGUgPT0gQzkzXzRYNF80Q09MT1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnYiwgY29scywgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19uX2NvbG9yKG91dCArIGkgKyBqKnN0cmlkZSwgc3RyaWRlLCA0LCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgY29scywgTlVMTCwgYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmdiLCBncnBzLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X25fY29sb3Iob3V0ICsgaSArIGoqc3RyaWRlLCBzdHJpZGUsIDQsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBjb2xzLCBncnBzLCBieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDOTNfTk9PUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDOTNfOFg4X0lOVFJBOgorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmdiLCBvdXQgKyBqKnN0cmlkZSwgOCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bmV4cGVjdGVkIHR5cGUgJXggYXQgJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3R5cGUsIHgsIHkpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnQgPj49IDQ7CisgICAgICAgICAgICBvdXQgKz0gODsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiICYgQzkzX0hBU19QQUxFVFRFKSB7CisgICAgICAgIHVpbnQzMl90ICpwYWxldHRlID0gKHVpbnQzMl90ICopIG5ld3BpYy0+ZGF0YVsxXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICBwYWxldHRlW2ldID0gMHhGRlUgPDwgMjQgfCBieXRlc3RyZWFtMl9nZXRfYmUyNCgmZ2IpOworICAgICAgICB9CisgICAgICAgIG5ld3BpYy0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG9sZHBpYy0+ZGF0YVsxXSkKKyAgICAgICAgICAgIG1lbWNweShuZXdwaWMtPmRhdGFbMV0sIG9sZHBpYy0+ZGF0YVsxXSwgMjU2ICogNCk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgbmV3cGljKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitBVkNvZGVjIGZmX2M5M19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjOTMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJJbnRlcnBsYXkgQzkzIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0M5MywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQzkzRGVjb2RlckNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2FiYWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NhYmFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhNzVkZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NhYmFjLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBlbmNvZGVyL2RlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDb250ZXh0IEFkYXB0aXZlIEJpbmFyeSBBcml0aG1ldGljIENvZGVyLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImNhYmFjLmgiCisjaW5jbHVkZSAiY2FiYWNfZnVuY3Rpb25zLmgiCisKKyNpbmNsdWRlICJjYWJhY190YWJsZWdlbi5oIgorCisvKioKKyAqCisgKiBAcGFyYW0gYnVmX3NpemUgc2l6ZSBvZiBidWYgaW4gYml0cworICovCit2b2lkIGZmX2luaXRfY2FiYWNfZW5jb2RlcihDQUJBQ0NvbnRleHQgKmMsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKXsKKyAgICBpbml0X3B1dF9iaXRzKCZjLT5wYiwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICBjLT5sb3c9IDA7CisgICAgYy0+cmFuZ2U9IDB4MUZFOworICAgIGMtPm91dHN0YW5kaW5nX2NvdW50PSAwOworICAgIGMtPnBiLmJpdF9sZWZ0Kys7IC8vYXZvaWRzIGZpcnN0Qml0RmxhZworfQorCisvKioKKyAqCisgKiBAcGFyYW0gYnVmX3NpemUgc2l6ZSBvZiBidWYgaW4gYml0cworICovCit2b2lkIGZmX2luaXRfY2FiYWNfZGVjb2RlcihDQUJBQ0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKXsKKyAgICBjLT5ieXRlc3RyZWFtX3N0YXJ0PQorICAgIGMtPmJ5dGVzdHJlYW09IGJ1ZjsKKyAgICBjLT5ieXRlc3RyZWFtX2VuZD0gYnVmICsgYnVmX3NpemU7CisKKyNpZiBDQUJBQ19CSVRTID09IDE2CisgICAgYy0+bG93ID0gICgqYy0+Ynl0ZXN0cmVhbSsrKTw8MTg7CisgICAgYy0+bG93Kz0gICgqYy0+Ynl0ZXN0cmVhbSsrKTw8MTA7CisjZWxzZQorICAgIGMtPmxvdyA9ICAoKmMtPmJ5dGVzdHJlYW0rKyk8PDEwOworI2VuZGlmCisgICAgYy0+bG93Kz0gKCgqYy0+Ynl0ZXN0cmVhbSsrKTw8MikgKyAyOworICAgIGMtPnJhbmdlPSAweDFGRTsKK30KKwordm9pZCBmZl9pbml0X2NhYmFjX3N0YXRlcyh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCisgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWJhY190YWJsZWluaXQoKTsKKworICAgIGluaXRpYWxpemVkID0gMTsKK30KKworI2lmZGVmIFRFU1QKKyNkZWZpbmUgU0laRSAxMDI0MAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9jYWJhY19iaXQoQ0FCQUNDb250ZXh0ICpjLCBpbnQgYil7CisgICAgcHV0X2JpdHMoJmMtPnBiLCAxLCBiKTsKKyAgICBmb3IoO2MtPm91dHN0YW5kaW5nX2NvdW50OyBjLT5vdXRzdGFuZGluZ19jb3VudC0tKXsKKyAgICAgICAgcHV0X2JpdHMoJmMtPnBiLCAxLCAxLWIpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbm9ybV9jYWJhY19lbmNvZGVyKENBQkFDQ29udGV4dCAqYyl7CisgICAgd2hpbGUoYy0+cmFuZ2UgPCAweDEwMCl7CisgICAgICAgIC8vRklYTUUgb3B0aW1pemUKKyAgICAgICAgaWYoYy0+bG93PDB4MTAwKXsKKyAgICAgICAgICAgIHB1dF9jYWJhY19iaXQoYywgMCk7CisgICAgICAgIH1lbHNlIGlmKGMtPmxvdzwweDIwMCl7CisgICAgICAgICAgICBjLT5vdXRzdGFuZGluZ19jb3VudCsrOworICAgICAgICAgICAgYy0+bG93IC09IDB4MTAwOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHB1dF9jYWJhY19iaXQoYywgMSk7CisgICAgICAgICAgICBjLT5sb3cgLT0gMHgyMDA7CisgICAgICAgIH0KKworICAgICAgICBjLT5yYW5nZSs9IGMtPnJhbmdlOworICAgICAgICBjLT5sb3cgKz0gYy0+bG93OworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHV0X2NhYmFjKENBQkFDQ29udGV4dCAqYywgdWludDhfdCAqIGNvbnN0IHN0YXRlLCBpbnQgYml0KXsKKyAgICBpbnQgUmFuZ2VMUFM9IGZmX2gyNjRfbHBzX3JhbmdlWzIqKGMtPnJhbmdlJjB4QzApICsgKnN0YXRlXTsKKworICAgIGlmKGJpdCA9PSAoKCpzdGF0ZSkmMSkpeworICAgICAgICBjLT5yYW5nZSAtPSBSYW5nZUxQUzsKKyAgICAgICAgKnN0YXRlICAgID0gZmZfaDI2NF9tbHBzX3N0YXRlWzEyOCArICpzdGF0ZV07CisgICAgfWVsc2V7CisgICAgICAgIGMtPmxvdyArPSBjLT5yYW5nZSAtIFJhbmdlTFBTOworICAgICAgICBjLT5yYW5nZSA9IFJhbmdlTFBTOworICAgICAgICAqc3RhdGU9IGZmX2gyNjRfbWxwc19zdGF0ZVsxMjcgLSAqc3RhdGVdOworICAgIH0KKworICAgIHJlbm9ybV9jYWJhY19lbmNvZGVyKGMpOworfQorCisvKioKKyAqIEBwYXJhbSBiaXQgMCAtPiB3cml0ZSB6ZXJvIGJpdCwgIT0wIHdyaXRlIG9uZSBiaXQKKyAqLworc3RhdGljIHZvaWQgcHV0X2NhYmFjX2J5cGFzcyhDQUJBQ0NvbnRleHQgKmMsIGludCBiaXQpeworICAgIGMtPmxvdyArPSBjLT5sb3c7CisKKyAgICBpZihiaXQpeworICAgICAgICBjLT5sb3cgKz0gYy0+cmFuZ2U7CisgICAgfQorLy9GSVhNRSBvcHRpbWl6ZQorICAgIGlmKGMtPmxvdzwweDIwMCl7CisgICAgICAgIHB1dF9jYWJhY19iaXQoYywgMCk7CisgICAgfWVsc2UgaWYoYy0+bG93PDB4NDAwKXsKKyAgICAgICAgYy0+b3V0c3RhbmRpbmdfY291bnQrKzsKKyAgICAgICAgYy0+bG93IC09IDB4MjAwOworICAgIH1lbHNleworICAgICAgICBwdXRfY2FiYWNfYml0KGMsIDEpOworICAgICAgICBjLT5sb3cgLT0gMHg0MDA7CisgICAgfQorfQorCisvKioKKyAqCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorICovCitzdGF0aWMgaW50IHB1dF9jYWJhY190ZXJtaW5hdGUoQ0FCQUNDb250ZXh0ICpjLCBpbnQgYml0KXsKKyAgICBjLT5yYW5nZSAtPSAyOworCisgICAgaWYoIWJpdCl7CisgICAgICAgIHJlbm9ybV9jYWJhY19lbmNvZGVyKGMpOworICAgIH1lbHNleworICAgICAgICBjLT5sb3cgKz0gYy0+cmFuZ2U7CisgICAgICAgIGMtPnJhbmdlPSAyOworCisgICAgICAgIHJlbm9ybV9jYWJhY19lbmNvZGVyKGMpOworCisgICAgICAgIGF2X2Fzc2VydDAoYy0+bG93IDw9IDB4MUZGKTsKKyAgICAgICAgcHV0X2NhYmFjX2JpdChjLCBjLT5sb3c+PjkpOworICAgICAgICBwdXRfYml0cygmYy0+cGIsIDIsICgoYy0+bG93Pj43KSYzKXwxKTsKKworICAgICAgICBmbHVzaF9wdXRfYml0cygmYy0+cGIpOyAvL0ZJWE1FIEZJWE1FIEZJWE1FIFhYWCB3cm9uZworICAgIH0KKworICAgIHJldHVybiAocHV0X2JpdHNfY291bnQoJmMtPnBiKSs3KT4+MzsKK30KKworaW50IG1haW4odm9pZCl7CisgICAgQ0FCQUNDb250ZXh0IGM7CisgICAgdWludDhfdCBiWzkqU0laRV07CisgICAgdWludDhfdCByWzkqU0laRV07CisgICAgaW50IGk7CisgICAgdWludDhfdCBzdGF0ZVsxMF09IHswfTsKKyAgICBBVkxGRyBwcm5nOworCisgICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOworICAgIGZmX2luaXRfY2FiYWNfZW5jb2RlcigmYywgYiwgU0laRSk7CisgICAgZmZfaW5pdF9jYWJhY19zdGF0ZXMoKTsKKworICAgIGZvcihpPTA7IGk8U0laRTsgaSsrKXsKKyAgICAgICAgaWYoMippPFNJWkUpIHJbaV0gPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDc7CisgICAgICAgIGVsc2UgICAgICAgICByW2ldID0gKGk+PjgpJjE7CisgICAgfQorCisgICAgZm9yKGk9MDsgaTxTSVpFOyBpKyspeworU1RBUlRfVElNRVIKKyAgICAgICAgcHV0X2NhYmFjX2J5cGFzcygmYywgcltpXSYxKTsKK1NUT1BfVElNRVIoInB1dF9jYWJhY19ieXBhc3MiKQorICAgIH0KKworICAgIGZvcihpPTA7IGk8U0laRTsgaSsrKXsKK1NUQVJUX1RJTUVSCisgICAgICAgIHB1dF9jYWJhYygmYywgc3RhdGUsIHJbaV0mMSk7CitTVE9QX1RJTUVSKCJwdXRfY2FiYWMiKQorICAgIH0KKworICAgIHB1dF9jYWJhY190ZXJtaW5hdGUoJmMsIDEpOworCisgICAgZmZfaW5pdF9jYWJhY19kZWNvZGVyKCZjLCBiLCBTSVpFKTsKKworICAgIG1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7CisKKyAgICBmb3IoaT0wOyBpPFNJWkU7IGkrKyl7CitTVEFSVF9USU1FUgorICAgICAgICBpZiggKHJbaV0mMSkgIT0gZ2V0X2NhYmFjX2J5cGFzcygmYykgKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNBQkFDIGJ5cGFzcyBmYWlsdXJlIGF0ICVkXG4iLCBpKTsKK1NUT1BfVElNRVIoImdldF9jYWJhY19ieXBhc3MiKQorICAgIH0KKworICAgIGZvcihpPTA7IGk8U0laRTsgaSsrKXsKK1NUQVJUX1RJTUVSCisgICAgICAgIGlmKCAocltpXSYxKSAhPSBnZXRfY2FiYWNfbm9pbmxpbmUoJmMsIHN0YXRlKSApCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ0FCQUMgZmFpbHVyZSBhdCAlZFxuIiwgaSk7CitTVE9QX1RJTUVSKCJnZXRfY2FiYWMiKQorICAgIH0KKyAgICBpZighZ2V0X2NhYmFjX3Rlcm1pbmF0ZSgmYykpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJ3aGVyZSdzIHRoZSBUZXJtaW5hdG9yP1xuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2NhYmFjLmggYi9mZm1wZWcvbGliYXZjb2RlYy9jYWJhYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZWFmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jYWJhYy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBlbmNvZGVyL2RlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDb250ZXh0IEFkYXB0aXZlIEJpbmFyeSBBcml0aG1ldGljIENvZGVyLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19DQUJBQ19ICisjZGVmaW5lIEFWQ09ERUNfQ0FCQUNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCisjaWYgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKKyNkZWZpbmUgQ0FCQUNfVEFCTEVfQ09OU1QgY29uc3QKKyNlbHNlCisjZGVmaW5lIENBQkFDX1RBQkxFX0NPTlNUCisjZW5kaWYKK2V4dGVybiBDQUJBQ19UQUJMRV9DT05TVCB1aW50OF90IGZmX2gyNjRfY2FiYWNfdGFibGVzWzUxMiArIDQqMio2NCArIDQqNjQgKyA2M107CisjZGVmaW5lIEgyNjRfTk9STV9TSElGVF9PRkZTRVQgMAorI2RlZmluZSBIMjY0X0xQU19SQU5HRV9PRkZTRVQgNTEyCisjZGVmaW5lIEgyNjRfTUxQU19TVEFURV9PRkZTRVQgMTAyNAorI2RlZmluZSBIMjY0X0xBU1RfQ09FRkZfRkxBR19PRkZTRVRfOHg4X09GRlNFVCAxMjgwCisKKyNkZWZpbmUgQ0FCQUNfQklUUyAxNgorI2RlZmluZSBDQUJBQ19NQVNLICgoMTw8Q0FCQUNfQklUUyktMSkKKwordHlwZWRlZiBzdHJ1Y3QgQ0FCQUNDb250ZXh0eworICAgIGludCBsb3c7CisgICAgaW50IHJhbmdlOworICAgIGludCBvdXRzdGFuZGluZ19jb3VudDsKKyAgICBjb25zdCB1aW50OF90ICpieXRlc3RyZWFtX3N0YXJ0OworICAgIGNvbnN0IHVpbnQ4X3QgKmJ5dGVzdHJlYW07CisgICAgY29uc3QgdWludDhfdCAqYnl0ZXN0cmVhbV9lbmQ7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKK31DQUJBQ0NvbnRleHQ7CisKK3ZvaWQgZmZfaW5pdF9jYWJhY19lbmNvZGVyKENBQkFDQ29udGV4dCAqYywgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpOwordm9pZCBmZl9pbml0X2NhYmFjX2RlY29kZXIoQ0FCQUNDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSk7Cit2b2lkIGZmX2luaXRfY2FiYWNfc3RhdGVzKHZvaWQpOworCisjZW5kaWYgLyogQVZDT0RFQ19DQUJBQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jYWJhY19mdW5jdGlvbnMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2NhYmFjX2Z1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZGJhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jYWJhY19mdW5jdGlvbnMuaApAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIEguMjZML0guMjY0L0FWQy9KVlQvMTQ0OTYtMTAvLi4uIGVuY29kZXIvZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENvbnRleHQgQWRhcHRpdmUgQmluYXJ5IEFyaXRobWV0aWMgQ29kZXIgaW5saW5lIGZ1bmN0aW9ucworICovCisKKyNpZm5kZWYgQVZDT0RFQ19DQUJBQ19GVU5DVElPTlNfSAorI2RlZmluZSBBVkNPREVDX0NBQkFDX0ZVTkNUSU9OU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNhYmFjLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZm5kZWYgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIKKyNkZWZpbmUgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIgIUNPTkZJR19TQUZFX0JJVFNUUkVBTV9SRUFERVIKKyNlbmRpZgorCisjaWYgQVJDSF9BQVJDSDY0CisjICAgaW5jbHVkZSAiYWFyY2g2NC9jYWJhYy5oIgorI2VuZGlmCisjaWYgQVJDSF9BUk0KKyMgICBpbmNsdWRlICJhcm0vY2FiYWMuaCIKKyNlbmRpZgorI2lmIEFSQ0hfWDg2CisjICAgaW5jbHVkZSAieDg2L2NhYmFjLmgiCisjZW5kaWYKKworc3RhdGljIENBQkFDX1RBQkxFX0NPTlNUIHVpbnQ4X3QgKiBjb25zdCBmZl9oMjY0X25vcm1fc2hpZnQgPSBmZl9oMjY0X2NhYmFjX3RhYmxlcyArIEgyNjRfTk9STV9TSElGVF9PRkZTRVQ7CitzdGF0aWMgQ0FCQUNfVEFCTEVfQ09OU1QgdWludDhfdCAqIGNvbnN0IGZmX2gyNjRfbHBzX3JhbmdlID0gZmZfaDI2NF9jYWJhY190YWJsZXMgKyBIMjY0X0xQU19SQU5HRV9PRkZTRVQ7CitzdGF0aWMgQ0FCQUNfVEFCTEVfQ09OU1QgdWludDhfdCAqIGNvbnN0IGZmX2gyNjRfbWxwc19zdGF0ZSA9IGZmX2gyNjRfY2FiYWNfdGFibGVzICsgSDI2NF9NTFBTX1NUQVRFX09GRlNFVDsKK3N0YXRpYyBDQUJBQ19UQUJMRV9DT05TVCB1aW50OF90ICogY29uc3QgZmZfaDI2NF9sYXN0X2NvZWZmX2ZsYWdfb2Zmc2V0Xzh4OCA9IGZmX2gyNjRfY2FiYWNfdGFibGVzICsgSDI2NF9MQVNUX0NPRUZGX0ZMQUdfT0ZGU0VUXzh4OF9PRkZTRVQ7CisKK3N0YXRpYyB2b2lkIHJlZmlsbChDQUJBQ0NvbnRleHQgKmMpeworI2lmIENBQkFDX0JJVFMgPT0gMTYKKyAgICAgICAgYy0+bG93Kz0gKGMtPmJ5dGVzdHJlYW1bMF08PDkpICsgKGMtPmJ5dGVzdHJlYW1bMV08PDEpOworI2Vsc2UKKyAgICAgICAgYy0+bG93Kz0gYy0+Ynl0ZXN0cmVhbVswXTw8MTsKKyNlbmRpZgorICAgIGMtPmxvdyAtPSBDQUJBQ19NQVNLOworI2lmICFVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUgorICAgIGlmIChjLT5ieXRlc3RyZWFtIDwgYy0+Ynl0ZXN0cmVhbV9lbmQpCisjZW5kaWYKKyAgICAgICAgYy0+Ynl0ZXN0cmVhbSArPSBDQUJBQ19CSVRTIC8gODsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbm9ybV9jYWJhY19kZWNvZGVyX29uY2UoQ0FCQUNDb250ZXh0ICpjKXsKKyAgICBpbnQgc2hpZnQ9ICh1aW50MzJfdCkoYy0+cmFuZ2UgLSAweDEwMCk+PjMxOworICAgIGMtPnJhbmdlPDw9IHNoaWZ0OworICAgIGMtPmxvdyAgPDw9IHNoaWZ0OworICAgIGlmKCEoYy0+bG93ICYgQ0FCQUNfTUFTSykpCisgICAgICAgIHJlZmlsbChjKTsKK30KKworI2lmbmRlZiBnZXRfY2FiYWNfaW5saW5lCitzdGF0aWMgdm9pZCByZWZpbGwyKENBQkFDQ29udGV4dCAqYyl7CisgICAgaW50IGksIHg7CisKKyAgICB4PSBjLT5sb3cgXiAoYy0+bG93LTEpOworICAgIGk9IDcgLSBmZl9oMjY0X25vcm1fc2hpZnRbeD4+KENBQkFDX0JJVFMtMSldOworCisgICAgeD0gLUNBQkFDX01BU0s7CisKKyNpZiBDQUJBQ19CSVRTID09IDE2CisgICAgICAgIHgrPSAoYy0+Ynl0ZXN0cmVhbVswXTw8OSkgKyAoYy0+Ynl0ZXN0cmVhbVsxXTw8MSk7CisjZWxzZQorICAgICAgICB4Kz0gYy0+Ynl0ZXN0cmVhbVswXTw8MTsKKyNlbmRpZgorCisgICAgYy0+bG93ICs9IHg8PGk7CisjaWYgIVVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSCisgICAgaWYgKGMtPmJ5dGVzdHJlYW0gPCBjLT5ieXRlc3RyZWFtX2VuZCkKKyNlbmRpZgorICAgICAgICBjLT5ieXRlc3RyZWFtICs9IENBQkFDX0JJVFMvODsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF9jYWJhY19pbmxpbmUoQ0FCQUNDb250ZXh0ICpjLCB1aW50OF90ICogY29uc3Qgc3RhdGUpeworICAgIGludCBzID0gKnN0YXRlOworICAgIGludCBSYW5nZUxQUz0gZmZfaDI2NF9scHNfcmFuZ2VbMiooYy0+cmFuZ2UmMHhDMCkgKyBzXTsKKyAgICBpbnQgYml0LCBscHNfbWFzazsKKworICAgIGMtPnJhbmdlIC09IFJhbmdlTFBTOworICAgIGxwc19tYXNrPSAoKGMtPnJhbmdlPDwoQ0FCQUNfQklUUysxKSkgLSBjLT5sb3cpPj4zMTsKKworICAgIGMtPmxvdyAtPSAoYy0+cmFuZ2U8PChDQUJBQ19CSVRTKzEpKSAmIGxwc19tYXNrOworICAgIGMtPnJhbmdlICs9IChSYW5nZUxQUyAtIGMtPnJhbmdlKSAmIGxwc19tYXNrOworCisgICAgc149bHBzX21hc2s7CisgICAgKnN0YXRlPSAoZmZfaDI2NF9tbHBzX3N0YXRlKzEyOClbc107CisgICAgYml0PSBzJjE7CisKKyAgICBscHNfbWFzaz0gZmZfaDI2NF9ub3JtX3NoaWZ0W2MtPnJhbmdlXTsKKyAgICBjLT5yYW5nZTw8PSBscHNfbWFzazsKKyAgICBjLT5sb3cgIDw8PSBscHNfbWFzazsKKyAgICBpZighKGMtPmxvdyAmIENBQkFDX01BU0spKQorICAgICAgICByZWZpbGwyKGMpOworICAgIHJldHVybiBiaXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhdl9ub2lubGluZSBhdl91bnVzZWQgZ2V0X2NhYmFjX25vaW5saW5lKENBQkFDQ29udGV4dCAqYywgdWludDhfdCAqIGNvbnN0IHN0YXRlKXsKKyAgICByZXR1cm4gZ2V0X2NhYmFjX2lubGluZShjLHN0YXRlKTsKK30KKworc3RhdGljIGludCBhdl91bnVzZWQgZ2V0X2NhYmFjKENBQkFDQ29udGV4dCAqYywgdWludDhfdCAqIGNvbnN0IHN0YXRlKXsKKyAgICByZXR1cm4gZ2V0X2NhYmFjX2lubGluZShjLHN0YXRlKTsKK30KKworI2lmbmRlZiBnZXRfY2FiYWNfYnlwYXNzCitzdGF0aWMgaW50IGF2X3VudXNlZCBnZXRfY2FiYWNfYnlwYXNzKENBQkFDQ29udGV4dCAqYyl7CisgICAgaW50IHJhbmdlOworICAgIGMtPmxvdyArPSBjLT5sb3c7CisKKyAgICBpZighKGMtPmxvdyAmIENBQkFDX01BU0spKQorICAgICAgICByZWZpbGwoYyk7CisKKyAgICByYW5nZT0gYy0+cmFuZ2U8PChDQUJBQ19CSVRTKzEpOworICAgIGlmKGMtPmxvdyA8IHJhbmdlKXsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfWVsc2V7CisgICAgICAgIGMtPmxvdyAtPSByYW5nZTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorI2VuZGlmCisKKyNpZm5kZWYgZ2V0X2NhYmFjX2J5cGFzc19zaWduCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X2NhYmFjX2J5cGFzc19zaWduKENBQkFDQ29udGV4dCAqYywgaW50IHZhbCl7CisgICAgaW50IHJhbmdlLCBtYXNrOworICAgIGMtPmxvdyArPSBjLT5sb3c7CisKKyAgICBpZighKGMtPmxvdyAmIENBQkFDX01BU0spKQorICAgICAgICByZWZpbGwoYyk7CisKKyAgICByYW5nZT0gYy0+cmFuZ2U8PChDQUJBQ19CSVRTKzEpOworICAgIGMtPmxvdyAtPSByYW5nZTsKKyAgICBtYXNrPSBjLT5sb3cgPj4gMzE7CisgICAgcmFuZ2UgJj0gbWFzazsKKyAgICBjLT5sb3cgKz0gcmFuZ2U7CisgICAgcmV0dXJuICh2YWxebWFzayktbWFzazsKK30KKyNlbmRpZgorCisvKioKKyAqCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAwIGlmIG5vIGVuZAorICovCitzdGF0aWMgaW50IGF2X3VudXNlZCBnZXRfY2FiYWNfdGVybWluYXRlKENBQkFDQ29udGV4dCAqYyl7CisgICAgYy0+cmFuZ2UgLT0gMjsKKyAgICBpZihjLT5sb3cgPCBjLT5yYW5nZTw8KENBQkFDX0JJVFMrMSkpeworICAgICAgICByZW5vcm1fY2FiYWNfZGVjb2Rlcl9vbmNlKGMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9ZWxzZXsKKyAgICAgICAgcmV0dXJuIGMtPmJ5dGVzdHJlYW0gLSBjLT5ieXRlc3RyZWFtX3N0YXJ0OworICAgIH0KK30KKworLyoqCisgKiBTa2lwIEBwIG4gYnl0ZXMgYW5kIHJlc2V0IHRoZSBkZWNvZGVyLgorICogQHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2tpcHBlZCBieXRlIG9yIE5VTEwgaWYgdGhlcmUncyBsZXNzIHRoYW4gQHAgbiBieXRlcyBsZWZ0CisgKi8KK3N0YXRpYyBhdl91bnVzZWQgY29uc3QgdWludDhfdCogc2tpcF9ieXRlcyhDQUJBQ0NvbnRleHQgKmMsIGludCBuKSB7CisgICAgY29uc3QgdWludDhfdCAqcHRyID0gYy0+Ynl0ZXN0cmVhbTsKKworICAgIGlmIChjLT5sb3cgJiAweDEpCisgICAgICAgIHB0ci0tOworI2lmIENBQkFDX0JJVFMgPT0gMTYKKyAgICBpZiAoYy0+bG93ICYgMHgxRkYpCisgICAgICAgIHB0ci0tOworI2VuZGlmCisgICAgaWYgKChpbnQpIChjLT5ieXRlc3RyZWFtX2VuZCAtIHB0cikgPCBuKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmZl9pbml0X2NhYmFjX2RlY29kZXIoYywgcHRyICsgbiwgYy0+Ynl0ZXN0cmVhbV9lbmQgLSBwdHIgLSBuKTsKKworICAgIHJldHVybiBwdHI7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX0NBQkFDX0ZVTkNUSU9OU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jYWJhY190YWJsZWdlbi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2FiYWNfdGFibGVnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDU0NDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2FiYWNfdGFibGVnZW4uYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogSGVhZGVyIGZpbGUgZm9yIGhhcmRjb2RlZCBBQUMgU0JSIHdpbmRvd3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJjYWJhY19mdW5jdGlvbnMuaCIKKyN1bmRlZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUworI2RlZmluZSBDT05GSUdfSEFSRENPREVEX1RBQkxFUyAwCithdl9jb25zdCBpbnQgYXZfbG9nMih1bnNpZ25lZCB2KSB7IGludCByID0gMDsgd2hpbGUgKHYgPj49IDEpIHIrKzsgcmV0dXJuIHI7IH0KKyNpbmNsdWRlICJjYWJhY190YWJsZWdlbi5oIgorI2luY2x1ZGUgInRhYmxlcHJpbnQuaCIKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBjYWJhY190YWJsZWluaXQoKTsKKworICAgIHdyaXRlX2ZpbGVoZWFkZXIoKTsKKworICAgIFdSSVRFX0FSUkFZKCJjb25zdCIsIHVpbnQ4X3QsIGZmX2gyNjRfY2FiYWNfdGFibGVzKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2FiYWNfdGFibGVnZW4uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2NhYmFjX3RhYmxlZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzNzkxMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NhYmFjX3RhYmxlZ2VuLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBIZWFkZXIgZmlsZSBmb3IgaGFyZGNvZGVkIENBQkFDIHRhYmxlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19DQUJBQ19UQUJMRUdFTl9ICisjZGVmaW5lIEFWQ09ERUNfQ0FCQUNfVEFCTEVHRU5fSAorCisjaWYgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKKyNkZWZpbmUgY2FiYWNfdGFibGVpbml0KCkKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2NhYmFjX3RhYmxlcy5oIgorI2Vsc2UKK3VpbnQ4X3QgZmZfaDI2NF9jYWJhY190YWJsZXNbNTEyICsgNCoyKjY0ICsgNCo2NCArIDYzXTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbHBzX3JhbmdlWzY0XVs0XT0geworezEyOCwxNzYsMjA4LDI0MH0sIHsxMjgsMTY3LDE5NywyMjd9LCB7MTI4LDE1OCwxODcsMjE2fSwgezEyMywxNTAsMTc4LDIwNX0sCit7MTE2LDE0MiwxNjksMTk1fSwgezExMSwxMzUsMTYwLDE4NX0sIHsxMDUsMTI4LDE1MiwxNzV9LCB7MTAwLDEyMiwxNDQsMTY2fSwKK3sgOTUsMTE2LDEzNywxNTh9LCB7IDkwLDExMCwxMzAsMTUwfSwgeyA4NSwxMDQsMTIzLDE0Mn0sIHsgODEsIDk5LDExNywxMzV9LAoreyA3NywgOTQsMTExLDEyOH0sIHsgNzMsIDg5LDEwNSwxMjJ9LCB7IDY5LCA4NSwxMDAsMTE2fSwgeyA2NiwgODAsIDk1LDExMH0sCit7IDYyLCA3NiwgOTAsMTA0fSwgeyA1OSwgNzIsIDg2LCA5OX0sIHsgNTYsIDY5LCA4MSwgOTR9LCB7IDUzLCA2NSwgNzcsIDg5fSwKK3sgNTEsIDYyLCA3MywgODV9LCB7IDQ4LCA1OSwgNjksIDgwfSwgeyA0NiwgNTYsIDY2LCA3Nn0sIHsgNDMsIDUzLCA2MywgNzJ9LAoreyA0MSwgNTAsIDU5LCA2OX0sIHsgMzksIDQ4LCA1NiwgNjV9LCB7IDM3LCA0NSwgNTQsIDYyfSwgeyAzNSwgNDMsIDUxLCA1OX0sCit7IDMzLCA0MSwgNDgsIDU2fSwgeyAzMiwgMzksIDQ2LCA1M30sIHsgMzAsIDM3LCA0MywgNTB9LCB7IDI5LCAzNSwgNDEsIDQ4fSwKK3sgMjcsIDMzLCAzOSwgNDV9LCB7IDI2LCAzMSwgMzcsIDQzfSwgeyAyNCwgMzAsIDM1LCA0MX0sIHsgMjMsIDI4LCAzMywgMzl9LAoreyAyMiwgMjcsIDMyLCAzN30sIHsgMjEsIDI2LCAzMCwgMzV9LCB7IDIwLCAyNCwgMjksIDMzfSwgeyAxOSwgMjMsIDI3LCAzMX0sCit7IDE4LCAyMiwgMjYsIDMwfSwgeyAxNywgMjEsIDI1LCAyOH0sIHsgMTYsIDIwLCAyMywgMjd9LCB7IDE1LCAxOSwgMjIsIDI1fSwKK3sgMTQsIDE4LCAyMSwgMjR9LCB7IDE0LCAxNywgMjAsIDIzfSwgeyAxMywgMTYsIDE5LCAyMn0sIHsgMTIsIDE1LCAxOCwgMjF9LAoreyAxMiwgMTQsIDE3LCAyMH0sIHsgMTEsIDE0LCAxNiwgMTl9LCB7IDExLCAxMywgMTUsIDE4fSwgeyAxMCwgMTIsIDE1LCAxN30sCit7IDEwLCAxMiwgMTQsIDE2fSwgeyAgOSwgMTEsIDEzLCAxNX0sIHsgIDksIDExLCAxMiwgMTR9LCB7ICA4LCAxMCwgMTIsIDE0fSwKK3sgIDgsICA5LCAxMSwgMTN9LCB7ICA3LCAgOSwgMTEsIDEyfSwgeyAgNywgIDksIDEwLCAxMn0sIHsgIDcsICA4LCAxMCwgMTF9LAoreyAgNiwgIDgsICA5LCAxMX0sIHsgIDYsICA3LCAgOSwgMTB9LCB7ICA2LCAgNywgIDgsICA5fSwgeyAgMiwgIDIsICAyLCAgMn0sCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtcHNfc3RhdGVbNjRdPSB7CisgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsCisgIDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsCisgMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsCisgMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsCisgMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsCisgNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsCisgNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsCisgNTcsNTgsNTksNjAsNjEsNjIsNjIsNjMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBscHNfc3RhdGVbNjRdPSB7CisgIDAsIDAsIDEsIDIsIDIsIDQsIDQsIDUsCisgIDYsIDcsIDgsIDksIDksMTEsMTEsMTIsCisgMTMsMTMsMTUsMTUsMTYsMTYsMTgsMTgsCisgMTksMTksMjEsMjEsMjIsMjIsMjMsMjQsCisgMjQsMjUsMjYsMjYsMjcsMjcsMjgsMjksCisgMjksMzAsMzAsMzAsMzEsMzIsMzIsMzMsCisgMzMsMzMsMzQsMzQsMzUsMzUsMzUsMzYsCisgMzYsMzYsMzcsMzcsMzcsMzgsMzgsNjMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBsYXN0X2NvZWZmX2ZsYWdfb2Zmc2V0Xzh4OFs2M10gPSB7CisgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgNSwgNSwgNSwgNSwgNiwgNiwgNiwgNiwgNywgNywgNywgNywgOCwgOCwgOAorfTsKKworc3RhdGljIGF2X2NvbGQgdm9pZCBjYWJhY190YWJsZWluaXQodm9pZCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspCisgICAgICAgIGZmX2gyNjRfbm9ybV9zaGlmdFtpXSA9IGkgPyA4IC0gYXZfbG9nMihpKSA6IDk7CisKKyAgICBmb3IoaT0wOyBpPDY0OyBpKyspeworICAgICAgICBmb3Ioaj0wOyBqPDQ7IGorKyl7IC8vRklYTUUgY2hlY2sgaWYgdGhpcyBpcyB3b3J0aCB0aGUgMSBzaGlmdCB3ZSBzYXZlCisgICAgICAgICAgICBmZl9oMjY0X2xwc19yYW5nZVtqKjIqNjQrMippKzBdPQorICAgICAgICAgICAgZmZfaDI2NF9scHNfcmFuZ2VbaioyKjY0KzIqaSsxXT0gbHBzX3JhbmdlW2ldW2pdOworICAgICAgICB9CisgICAgICAgIGZmX2gyNjRfbWxwc19zdGF0ZVsxMjggKyAyICogaSArIDBdID0gMiAqIG1wc19zdGF0ZVtpXSArIDA7CisgICAgICAgIGZmX2gyNjRfbWxwc19zdGF0ZVsxMjggKyAyICogaSArIDFdID0gMiAqIG1wc19zdGF0ZVtpXSArIDE7CisKKyAgICAgICAgaWYoIGkgKXsKKyAgICAgICAgICAgIGZmX2gyNjRfbWxwc19zdGF0ZVsxMjgtMippLTFdPSAyKmxwc19zdGF0ZVtpXSswOworICAgICAgICAgICAgZmZfaDI2NF9tbHBzX3N0YXRlWzEyOC0yKmktMl09IDIqbHBzX3N0YXRlW2ldKzE7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZmZfaDI2NF9tbHBzX3N0YXRlWzEyOC0yKmktMV09IDE7CisgICAgICAgICAgICBmZl9oMjY0X21scHNfc3RhdGVbMTI4LTIqaS0yXT0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IoaT0wOyBpPCA2MzsgaSsrKXsKKyAgICAgIGZmX2gyNjRfbGFzdF9jb2VmZl9mbGFnX29mZnNldF84eDhbaV0gPSBsYXN0X2NvZWZmX2ZsYWdfb2Zmc2V0Xzh4OFtpXTsKKyAgICB9Cit9CisjZW5kaWYgLyogQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMgKi8KKworI2VuZGlmIC8qIEFWQ09ERUNfQ0FCQUNfVEFCTEVHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2F2cy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2F2cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwODgwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jYXZzLmMKQEAgLTAsMCArMSw4MzggQEAKKy8qCisgKiBDaGluZXNlIEFWUyB2aWRlbyAoQVZTMS1QMiwgSmlaaHVuIHByb2ZpbGUpIGRlY29kZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIFN0ZWZhbiBHZWhyZXIgPHN0ZWZhbi5nZWhyZXJAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDaGluZXNlIEFWUyB2aWRlbyAoQVZTMS1QMiwgSmlaaHVuIHByb2ZpbGUpIGRlY29kZXIKKyAqIEBhdXRob3IgU3RlZmFuIEdlaHJlciA8c3RlZmFuLmdlaHJlckBnbXguZGU+CisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImdvbG9tYi5oIgorI2luY2x1ZGUgImgyNjRjaHJvbWEuaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAicXBlbGRzcC5oIgorI2luY2x1ZGUgImNhdnMuaCIKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWxwaGFfdGFiWzY0XSA9IHsKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAyLCAgMiwgIDIsICAzLCAgMywKKyAgICAgNCwgIDQsICA1LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE4LCAyMCwKKyAgICAyMiwgMjQsIDI2LCAyOCwgMzAsIDMzLCAzMywgMzUsIDM1LCAzNiwgMzcsIDM3LCAzOSwgMzksIDQyLCA0NCwKKyAgICA0NiwgNDgsIDUwLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmV0YV90YWJbNjRdID0geworICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDMsICAzLCAgMywgIDMsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LAorICAgICA2LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTMsIDE0LAorICAgIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI3Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0Y190YWJbNjRdID0geworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCA0LCA0LCA0LAorICAgIDUsIDUsIDUsIDYsIDYsIDYsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDksIDksIDkKK307CisKKy8qKiBtYXJrIGJsb2NrIGFzIHVuYXZhaWxhYmxlLCBpLmUuIG91dCBvZiBwaWN0dXJlCisgKiAgb3Igbm90IHlldCBkZWNvZGVkICovCitzdGF0aWMgY29uc3QgY2F2c192ZWN0b3IgdW5fbXYgPSB7IDAsIDAsIDEsIE5PVF9BVkFJTCB9OworCitzdGF0aWMgY29uc3QgaW50OF90IGxlZnRfbW9kaWZpZXJfbFs4XSA9IHsgIDAsIC0xLCAgNiwgLTEsIC0xLCA3LCA2LCA3IH07CitzdGF0aWMgY29uc3QgaW50OF90IHRvcF9tb2RpZmllcl9sWzhdICA9IHsgLTEsICAxLCAgNSwgLTEsIC0xLCA1LCA3LCA3IH07CitzdGF0aWMgY29uc3QgaW50OF90IGxlZnRfbW9kaWZpZXJfY1s3XSA9IHsgIDUsIC0xLCAgMiwgLTEsICA2LCA1LCA2IH07CitzdGF0aWMgY29uc3QgaW50OF90IHRvcF9tb2RpZmllcl9jWzddICA9IHsgIDQsICAxLCAtMSwgLTEsICA0LCA2LCA2IH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGluLWxvb3AgZGVibG9ja2luZyBmaWx0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2JzKGNhdnNfdmVjdG9yICptdlAsIGNhdnNfdmVjdG9yICptdlEsIGludCBiKQoreworICAgIGlmICgobXZQLT5yZWYgPT0gUkVGX0lOVFJBKSB8fCAobXZRLT5yZWYgPT0gUkVGX0lOVFJBKSkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYoKGFicyhtdlAtPnggLSBtdlEtPngpID49IDQpIHx8CisgICAgICAgKGFicyhtdlAtPnkgLSBtdlEtPnkpID49IDQpIHx8CisgICAgICAgKG12UC0+cmVmICE9IG12US0+cmVmKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKGIpIHsKKyAgICAgICAgbXZQICs9IE1WX0JXRF9PRkZTOworICAgICAgICBtdlEgKz0gTVZfQldEX09GRlM7CisgICAgICAgIGlmKChhYnMobXZQLT54IC0gbXZRLT54KSA+PSA0KSB8fAorICAgICAgICAgICAoYWJzKG12UC0+eSAtIG12US0+eSkgPj0gNCkgfHwKKyAgICAgICAgICAgKG12UC0+cmVmICE9IG12US0+cmVmKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBTRVRfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFscGhhID0gYWxwaGFfdGFiW2F2X2NsaXAocXBfYXZnICsgaC0+YWxwaGFfb2Zmc2V0LCAwLCA2MyldOyAgXAorICAgIGJldGEgID0gIGJldGFfdGFiW2F2X2NsaXAocXBfYXZnICsgaC0+YmV0YV9vZmZzZXQsICAwLCA2MyldOyAgXAorICAgIHRjICAgID0gICAgdGNfdGFiW2F2X2NsaXAocXBfYXZnICsgaC0+YWxwaGFfb2Zmc2V0LCAwLCA2MyldOworCisvKioKKyAqIGluLWxvb3AgZGVibG9ja2luZyBmaWx0ZXIgZm9yIGEgc2luZ2xlIG1hY3JvYmxvY2sKKyAqCisgKiBib3VuZGFyeSBzdHJlbmd0aCAoYnMpIG1hcHBpbmc6CisgKgorICogLS00LS0tNS0tCisgKiAwICAgMiAgIHwKKyAqIHwgNiB8IDcgfAorICogMSAgIDMgICB8CisgKiAtLS0tLS0tLS0KKyAqCisgKi8KK3ZvaWQgZmZfY2F2c19maWx0ZXIoQVZTQ29udGV4dCAqaCwgZW51bSBjYXZzX21iIG1iX3R5cGUpCit7CisgICAgdWludDhfdCBic1s4XTsKKyAgICBpbnQgcXBfYXZnLCBhbHBoYSwgYmV0YSwgdGM7CisgICAgaW50IGk7CisKKyAgICAvKiBzYXZlIHVuLWRlYmxvY2tlZCBsaW5lcyAqLworICAgIGgtPnRvcGxlZnRfYm9yZGVyX3kgPSBoLT50b3BfYm9yZGVyX3lbaC0+bWJ4ICogMTYgKyAxNV07CisgICAgaC0+dG9wbGVmdF9ib3JkZXJfdSA9IGgtPnRvcF9ib3JkZXJfdVtoLT5tYnggKiAxMCArIDhdOworICAgIGgtPnRvcGxlZnRfYm9yZGVyX3YgPSBoLT50b3BfYm9yZGVyX3ZbaC0+bWJ4ICogMTAgKyA4XTsKKyAgICBtZW1jcHkoJmgtPnRvcF9ib3JkZXJfeVtoLT5tYnggKiAxNl0sICAgICBoLT5jeSArIDE1ICogaC0+bF9zdHJpZGUsIDE2KTsKKyAgICBtZW1jcHkoJmgtPnRvcF9ib3JkZXJfdVtoLT5tYnggKiAxMCArIDFdLCBoLT5jdSArICA3ICogaC0+Y19zdHJpZGUsIDgpOworICAgIG1lbWNweSgmaC0+dG9wX2JvcmRlcl92W2gtPm1ieCAqIDEwICsgMV0sIGgtPmN2ICsgIDcgKiBoLT5jX3N0cmlkZSwgOCk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBoLT5sZWZ0X2JvcmRlcl95W2kgKiAyICsgMV0gPSAqKGgtPmN5ICsgMTUgKyAoaSAqIDIgKyAwKSAqIGgtPmxfc3RyaWRlKTsKKyAgICAgICAgaC0+bGVmdF9ib3JkZXJfeVtpICogMiArIDJdID0gKihoLT5jeSArIDE1ICsgKGkgKiAyICsgMSkgKiBoLT5sX3N0cmlkZSk7CisgICAgICAgIGgtPmxlZnRfYm9yZGVyX3VbaSArIDFdICAgICA9ICooaC0+Y3UgKyA3ICArICBpICAgICAgICAgICogaC0+Y19zdHJpZGUpOworICAgICAgICBoLT5sZWZ0X2JvcmRlcl92W2kgKyAxXSAgICAgPSAqKGgtPmN2ICsgNyAgKyAgaSAgICAgICAgICAqIGgtPmNfc3RyaWRlKTsKKyAgICB9CisgICAgaWYgKCFoLT5sb29wX2ZpbHRlcl9kaXNhYmxlKSB7CisgICAgICAgIC8qIGRldGVybWluZSBicyAqLworICAgICAgICBpZiAobWJfdHlwZSA9PSBJXzhYOCkKKyAgICAgICAgICAgIG1lbXNldChicywgMiwgOCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbWVtc2V0KGJzLCAwLCA4KTsKKyAgICAgICAgICAgIGlmIChmZl9jYXZzX3BhcnRpdGlvbl9mbGFnc1ttYl90eXBlXSAmIFNQTElUVikgeworICAgICAgICAgICAgICAgIGJzWzJdID0gZ2V0X2JzKCZoLT5tdltNVl9GV0RfWDBdLCAmaC0+bXZbTVZfRldEX1gxXSwgbWJfdHlwZSA+IFBfOFg4KTsKKyAgICAgICAgICAgICAgICBic1szXSA9IGdldF9icygmaC0+bXZbTVZfRldEX1gyXSwgJmgtPm12W01WX0ZXRF9YM10sIG1iX3R5cGUgPiBQXzhYOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmZfY2F2c19wYXJ0aXRpb25fZmxhZ3NbbWJfdHlwZV0gJiBTUExJVEgpIHsKKyAgICAgICAgICAgICAgICBic1s2XSA9IGdldF9icygmaC0+bXZbTVZfRldEX1gwXSwgJmgtPm12W01WX0ZXRF9YMl0sIG1iX3R5cGUgPiBQXzhYOCk7CisgICAgICAgICAgICAgICAgYnNbN10gPSBnZXRfYnMoJmgtPm12W01WX0ZXRF9YMV0sICZoLT5tdltNVl9GV0RfWDNdLCBtYl90eXBlID4gUF84WDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnNbMF0gPSBnZXRfYnMoJmgtPm12W01WX0ZXRF9BMV0sICZoLT5tdltNVl9GV0RfWDBdLCBtYl90eXBlID4gUF84WDgpOworICAgICAgICAgICAgYnNbMV0gPSBnZXRfYnMoJmgtPm12W01WX0ZXRF9BM10sICZoLT5tdltNVl9GV0RfWDJdLCBtYl90eXBlID4gUF84WDgpOworICAgICAgICAgICAgYnNbNF0gPSBnZXRfYnMoJmgtPm12W01WX0ZXRF9CMl0sICZoLT5tdltNVl9GV0RfWDBdLCBtYl90eXBlID4gUF84WDgpOworICAgICAgICAgICAgYnNbNV0gPSBnZXRfYnMoJmgtPm12W01WX0ZXRF9CM10sICZoLT5tdltNVl9GV0RfWDFdLCBtYl90eXBlID4gUF84WDgpOworICAgICAgICB9CisgICAgICAgIGlmIChBVl9STjY0KGJzKSkgeworICAgICAgICAgICAgaWYgKGgtPmZsYWdzICYgQV9BVkFJTCkgeworICAgICAgICAgICAgICAgIHFwX2F2ZyA9IChoLT5xcCArIGgtPmxlZnRfcXAgKyAxKSA+PiAxOworICAgICAgICAgICAgICAgIFNFVF9QQVJBTVM7CisgICAgICAgICAgICAgICAgaC0+Y2RzcC5jYXZzX2ZpbHRlcl9sdihoLT5jeSwgaC0+bF9zdHJpZGUsIGFscGhhLCBiZXRhLCB0YywgYnNbMF0sIGJzWzFdKTsKKyAgICAgICAgICAgICAgICBxcF9hdmcgPSAoZmZfY2F2c19jaHJvbWFfcXBbaC0+cXBdICsgZmZfY2F2c19jaHJvbWFfcXBbaC0+bGVmdF9xcF0gKyAxKSA+PiAxOworICAgICAgICAgICAgICAgIFNFVF9QQVJBTVM7CisgICAgICAgICAgICAgICAgaC0+Y2RzcC5jYXZzX2ZpbHRlcl9jdihoLT5jdSwgaC0+Y19zdHJpZGUsIGFscGhhLCBiZXRhLCB0YywgYnNbMF0sIGJzWzFdKTsKKyAgICAgICAgICAgICAgICBoLT5jZHNwLmNhdnNfZmlsdGVyX2N2KGgtPmN2LCBoLT5jX3N0cmlkZSwgYWxwaGEsIGJldGEsIHRjLCBic1swXSwgYnNbMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcXBfYXZnID0gaC0+cXA7CisgICAgICAgICAgICBTRVRfUEFSQU1TOworICAgICAgICAgICAgaC0+Y2RzcC5jYXZzX2ZpbHRlcl9sdihoLT5jeSArIDgsICAgICAgICAgICAgICAgaC0+bF9zdHJpZGUsIGFscGhhLCBiZXRhLCB0YywgYnNbMl0sIGJzWzNdKTsKKyAgICAgICAgICAgIGgtPmNkc3AuY2F2c19maWx0ZXJfbGgoaC0+Y3kgKyA4ICogaC0+bF9zdHJpZGUsIGgtPmxfc3RyaWRlLCBhbHBoYSwgYmV0YSwgdGMsIGJzWzZdLCBic1s3XSk7CisKKyAgICAgICAgICAgIGlmIChoLT5mbGFncyAmIEJfQVZBSUwpIHsKKyAgICAgICAgICAgICAgICBxcF9hdmcgPSAoaC0+cXAgKyBoLT50b3BfcXBbaC0+bWJ4XSArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgU0VUX1BBUkFNUzsKKyAgICAgICAgICAgICAgICBoLT5jZHNwLmNhdnNfZmlsdGVyX2xoKGgtPmN5LCBoLT5sX3N0cmlkZSwgYWxwaGEsIGJldGEsIHRjLCBic1s0XSwgYnNbNV0pOworICAgICAgICAgICAgICAgIHFwX2F2ZyA9IChmZl9jYXZzX2Nocm9tYV9xcFtoLT5xcF0gKyBmZl9jYXZzX2Nocm9tYV9xcFtoLT50b3BfcXBbaC0+bWJ4XV0gKyAxKSA+PiAxOworICAgICAgICAgICAgICAgIFNFVF9QQVJBTVM7CisgICAgICAgICAgICAgICAgaC0+Y2RzcC5jYXZzX2ZpbHRlcl9jaChoLT5jdSwgaC0+Y19zdHJpZGUsIGFscGhhLCBiZXRhLCB0YywgYnNbNF0sIGJzWzVdKTsKKyAgICAgICAgICAgICAgICBoLT5jZHNwLmNhdnNfZmlsdGVyX2NoKGgtPmN2LCBoLT5jX3N0cmlkZSwgYWxwaGEsIGJldGEsIHRjLCBic1s0XSwgYnNbNV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGgtPmxlZnRfcXAgICAgICAgID0gaC0+cXA7CisgICAgaC0+dG9wX3FwW2gtPm1ieF0gPSBoLT5xcDsKK30KKworI3VuZGVmIFNFVF9QQVJBTVMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc3BhdGlhbCBpbnRyYSBwcmVkaWN0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgZmZfY2F2c19sb2FkX2ludHJhX3ByZWRfbHVtYShBVlNDb250ZXh0ICpoLCB1aW50OF90ICp0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKmxlZnQsIGludCBibG9jaykKK3sKKyAgICBpbnQgaTsKKworICAgIHN3aXRjaCAoYmxvY2spIHsKKyAgICBjYXNlIDA6CisgICAgICAgICpsZWZ0ICAgICAgICAgICAgICAgPSBoLT5sZWZ0X2JvcmRlcl95OworICAgICAgICBoLT5sZWZ0X2JvcmRlcl95WzBdID0gaC0+bGVmdF9ib3JkZXJfeVsxXTsKKyAgICAgICAgbWVtc2V0KCZoLT5sZWZ0X2JvcmRlcl95WzE3XSwgaC0+bGVmdF9ib3JkZXJfeVsxNl0sIDkpOworICAgICAgICBtZW1jcHkoJnRvcFsxXSwgJmgtPnRvcF9ib3JkZXJfeVtoLT5tYnggKiAxNl0sIDE2KTsKKyAgICAgICAgdG9wWzE3XSA9IHRvcFsxNl07CisgICAgICAgIHRvcFswXSAgPSB0b3BbMV07CisgICAgICAgIGlmICgoaC0+ZmxhZ3MgJiBBX0FWQUlMKSAmJiAoaC0+ZmxhZ3MgJiBCX0FWQUlMKSkKKyAgICAgICAgICAgIGgtPmxlZnRfYm9yZGVyX3lbMF0gPSB0b3BbMF0gPSBoLT50b3BsZWZ0X2JvcmRlcl95OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgICpsZWZ0ID0gaC0+aW50ZXJuX2JvcmRlcl95OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgaC0+aW50ZXJuX2JvcmRlcl95W2kgKyAxXSA9ICooaC0+Y3kgKyA3ICsgaSAqIGgtPmxfc3RyaWRlKTsKKyAgICAgICAgbWVtc2V0KCZoLT5pbnRlcm5fYm9yZGVyX3lbOV0sIGgtPmludGVybl9ib3JkZXJfeVs4XSwgOSk7CisgICAgICAgIGgtPmludGVybl9ib3JkZXJfeVswXSA9IGgtPmludGVybl9ib3JkZXJfeVsxXTsKKyAgICAgICAgbWVtY3B5KCZ0b3BbMV0sICZoLT50b3BfYm9yZGVyX3lbaC0+bWJ4ICogMTYgKyA4XSwgOCk7CisgICAgICAgIGlmIChoLT5mbGFncyAmIENfQVZBSUwpCisgICAgICAgICAgICBtZW1jcHkoJnRvcFs5XSwgJmgtPnRvcF9ib3JkZXJfeVsoaC0+bWJ4ICsgMSkgKiAxNl0sIDgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtZW1zZXQoJnRvcFs5XSwgdG9wWzhdLCA5KTsKKyAgICAgICAgdG9wWzE3XSA9IHRvcFsxNl07CisgICAgICAgIHRvcFswXSAgPSB0b3BbMV07CisgICAgICAgIGlmIChoLT5mbGFncyAmIEJfQVZBSUwpCisgICAgICAgICAgICBoLT5pbnRlcm5fYm9yZGVyX3lbMF0gPSB0b3BbMF0gPSBoLT50b3BfYm9yZGVyX3lbaC0+bWJ4ICogMTYgKyA3XTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICAqbGVmdCA9ICZoLT5sZWZ0X2JvcmRlcl95WzhdOworICAgICAgICBtZW1jcHkoJnRvcFsxXSwgaC0+Y3kgKyA3ICogaC0+bF9zdHJpZGUsIDE2KTsKKyAgICAgICAgdG9wWzE3XSA9IHRvcFsxNl07CisgICAgICAgIHRvcFswXSAgPSB0b3BbMV07CisgICAgICAgIGlmIChoLT5mbGFncyAmIEFfQVZBSUwpCisgICAgICAgICAgICB0b3BbMF0gPSBoLT5sZWZ0X2JvcmRlcl95WzhdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgICpsZWZ0ID0gJmgtPmludGVybl9ib3JkZXJfeVs4XTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIGgtPmludGVybl9ib3JkZXJfeVtpICsgOV0gPSAqKGgtPmN5ICsgNyArIChpICsgOCkgKiBoLT5sX3N0cmlkZSk7CisgICAgICAgIG1lbXNldCgmaC0+aW50ZXJuX2JvcmRlcl95WzE3XSwgaC0+aW50ZXJuX2JvcmRlcl95WzE2XSwgOSk7CisgICAgICAgIG1lbWNweSgmdG9wWzBdLCBoLT5jeSArIDcgKyA3ICogaC0+bF9zdHJpZGUsIDkpOworICAgICAgICBtZW1zZXQoJnRvcFs5XSwgdG9wWzhdLCA5KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGZmX2NhdnNfbG9hZF9pbnRyYV9wcmVkX2Nocm9tYShBVlNDb250ZXh0ICpoKQoreworICAgIC8qIGV4dGVuZCBib3JkZXJzIGJ5IG9uZSBwaXhlbCAqLworICAgIGgtPmxlZnRfYm9yZGVyX3VbOV0gICAgICAgICAgICAgID0gaC0+bGVmdF9ib3JkZXJfdVs4XTsKKyAgICBoLT5sZWZ0X2JvcmRlcl92WzldICAgICAgICAgICAgICA9IGgtPmxlZnRfYm9yZGVyX3ZbOF07CisgICAgaWYoaC0+ZmxhZ3MgJiBDX0FWQUlMKSB7CisgICAgICAgIGgtPnRvcF9ib3JkZXJfdVtoLT5tYngqMTAgKyA5XSA9IGgtPnRvcF9ib3JkZXJfdVtoLT5tYngqMTAgKyAxMV07CisgICAgICAgIGgtPnRvcF9ib3JkZXJfdltoLT5tYngqMTAgKyA5XSA9IGgtPnRvcF9ib3JkZXJfdltoLT5tYngqMTAgKyAxMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaC0+dG9wX2JvcmRlcl91W2gtPm1ieCAqIDEwICsgOV0gPSBoLT50b3BfYm9yZGVyX3VbaC0+bWJ4ICogMTAgKyA4XTsKKyAgICAgICAgaC0+dG9wX2JvcmRlcl92W2gtPm1ieCAqIDEwICsgOV0gPSBoLT50b3BfYm9yZGVyX3ZbaC0+bWJ4ICogMTAgKyA4XTsKKyAgICB9CisgICAgaWYoKGgtPmZsYWdzICYgQV9BVkFJTCkgJiYgKGgtPmZsYWdzICYgQl9BVkFJTCkpIHsKKyAgICAgICAgaC0+dG9wX2JvcmRlcl91W2gtPm1ieCAqIDEwXSA9IGgtPmxlZnRfYm9yZGVyX3VbMF0gPSBoLT50b3BsZWZ0X2JvcmRlcl91OworICAgICAgICBoLT50b3BfYm9yZGVyX3ZbaC0+bWJ4ICogMTBdID0gaC0+bGVmdF9ib3JkZXJfdlswXSA9IGgtPnRvcGxlZnRfYm9yZGVyX3Y7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaC0+bGVmdF9ib3JkZXJfdVswXSAgICAgICAgICA9IGgtPmxlZnRfYm9yZGVyX3VbMV07CisgICAgICAgIGgtPmxlZnRfYm9yZGVyX3ZbMF0gICAgICAgICAgPSBoLT5sZWZ0X2JvcmRlcl92WzFdOworICAgICAgICBoLT50b3BfYm9yZGVyX3VbaC0+bWJ4ICogMTBdID0gaC0+dG9wX2JvcmRlcl91W2gtPm1ieCAqIDEwICsgMV07CisgICAgICAgIGgtPnRvcF9ib3JkZXJfdltoLT5tYnggKiAxMF0gPSBoLT50b3BfYm9yZGVyX3ZbaC0+bWJ4ICogMTAgKyAxXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGludHJhX3ByZWRfdmVydCh1aW50OF90ICpkLCB1aW50OF90ICp0b3AsIHVpbnQ4X3QgKmxlZnQsIGludCBzdHJpZGUpCit7CisgICAgaW50IHk7CisgICAgdWludDY0X3QgYSA9IEFWX1JONjQoJnRvcFsxXSk7CisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKKyAgICAgICAgKigodWludDY0X3QgKikoZCArIHkgKiBzdHJpZGUpKSA9IGE7Cit9CisKK3N0YXRpYyB2b2lkIGludHJhX3ByZWRfaG9yaXoodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBpbnQgc3RyaWRlKQoreworICAgIGludCB5OworICAgIHVpbnQ2NF90IGE7CisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBhID0gbGVmdFt5ICsgMV0gKiAweDAxMDEwMTAxMDEwMTAxMDFVTEw7CisgICAgICAgICooKHVpbnQ2NF90ICopKGQgKyB5ICogc3RyaWRlKSkgPSBhOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaW50cmFfcHJlZF9kY18xMjgodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBpbnQgc3RyaWRlKQoreworICAgIGludCB5OworICAgIHVpbnQ2NF90IGEgPSAweDgwODA4MDgwODA4MDgwODBVTEw7CisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKKyAgICAgICAgKigodWludDY0X3QgKikoZCArIHkgKiBzdHJpZGUpKSA9IGE7Cit9CisKK3N0YXRpYyB2b2lkIGludHJhX3ByZWRfcGxhbmUodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBpbnQgc3RyaWRlKQoreworICAgIGludCB4LCB5LCBpYTsKKyAgICBpbnQgaWggPSAwOworICAgIGludCBpdiA9IDA7CisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKworICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspIHsKKyAgICAgICAgaWggKz0gKHggKyAxKSAqICAodG9wWzUgKyB4XSAtICB0b3BbMyAtIHhdKTsKKyAgICAgICAgaXYgKz0gKHggKyAxKSAqIChsZWZ0WzUgKyB4XSAtIGxlZnRbMyAtIHhdKTsKKyAgICB9CisgICAgaWEgPSAodG9wWzhdICsgbGVmdFs4XSkgPDwgNDsKKyAgICBpaCA9ICgxNyAqIGloICsgMTYpID4+IDU7CisgICAgaXYgPSAoMTcgKiBpdiArIDE2KSA+PiA1OworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICBkW3kgKiBzdHJpZGUgKyB4XSA9IGNtWyhpYSArICh4IC0gMykgKiBpaCArICh5IC0gMykgKiBpdiArIDE2KSA+PiA1XTsKK30KKworI2RlZmluZSBMT1dQQVNTKEFSUkFZLCBJTkRFWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoQVJSQVlbKElOREVYKSAtIDFdICsgMiAqIEFSUkFZWyhJTkRFWCldICsgQVJSQVlbKElOREVYKSArIDFdICsgMikgPj4gMikKKworc3RhdGljIHZvaWQgaW50cmFfcHJlZF9scCh1aW50OF90ICpkLCB1aW50OF90ICp0b3AsIHVpbnQ4X3QgKmxlZnQsIGludCBzdHJpZGUpCit7CisgICAgaW50IHgsIHk7CisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIGRbeSAqIHN0cmlkZSArIHhdID0gKExPV1BBU1ModG9wLCB4ICsgMSkgKyBMT1dQQVNTKGxlZnQsIHkgKyAxKSkgPj4gMTsKK30KKworc3RhdGljIHZvaWQgaW50cmFfcHJlZF9kb3duX2xlZnQodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBpbnQgc3RyaWRlKQoreworICAgIGludCB4LCB5OworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICBkW3kgKiBzdHJpZGUgKyB4XSA9IChMT1dQQVNTKHRvcCwgeCArIHkgKyAyKSArIExPV1BBU1MobGVmdCwgeCArIHkgKyAyKSkgPj4gMTsKK30KKworc3RhdGljIHZvaWQgaW50cmFfcHJlZF9kb3duX3JpZ2h0KHVpbnQ4X3QgKmQsIHVpbnQ4X3QgKnRvcCwgdWludDhfdCAqbGVmdCwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgaWYgKHggPT0geSkKKyAgICAgICAgICAgICAgICBkW3kgKiBzdHJpZGUgKyB4XSA9IChsZWZ0WzFdICsgMiAqIHRvcFswXSArIHRvcFsxXSArIDIpID4+IDI7CisgICAgICAgICAgICBlbHNlIGlmICh4ID4geSkKKyAgICAgICAgICAgICAgICBkW3kgKiBzdHJpZGUgKyB4XSA9IExPV1BBU1ModG9wLCB4IC0geSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZFt5ICogc3RyaWRlICsgeF0gPSBMT1dQQVNTKGxlZnQsIHkgLSB4KTsKK30KKworc3RhdGljIHZvaWQgaW50cmFfcHJlZF9scF9sZWZ0KHVpbnQ4X3QgKmQsIHVpbnQ4X3QgKnRvcCwgdWludDhfdCAqbGVmdCwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgZFt5ICogc3RyaWRlICsgeF0gPSBMT1dQQVNTKGxlZnQsIHkgKyAxKTsKK30KKworc3RhdGljIHZvaWQgaW50cmFfcHJlZF9scF90b3AodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBpbnQgc3RyaWRlKQoreworICAgIGludCB4LCB5OworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICBkW3kgKiBzdHJpZGUgKyB4XSA9IExPV1BBU1ModG9wLCB4ICsgMSk7Cit9CisKKyN1bmRlZiBMT1dQQVNTCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtb2RpZnlfcHJlZChjb25zdCBpbnQ4X3QgKm1vZF90YWJsZSwgaW50ICptb2RlKQoreworICAgICptb2RlID0gbW9kX3RhYmxlWyptb2RlXTsKKyAgICBpZiAoKm1vZGUgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbGxlZ2FsIGludHJhIHByZWRpY3Rpb24gbW9kZVxuIik7CisgICAgICAgICptb2RlID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgZmZfY2F2c19tb2RpZnlfbWJfaShBVlNDb250ZXh0ICpoLCBpbnQgKnByZWRfbW9kZV91dikKK3sKKyAgICAvKiBzYXZlIHByZWQgbW9kZXMgYmVmb3JlIHRoZXkgZ2V0IG1vZGlmaWVkICovCisgICAgaC0+cHJlZF9tb2RlX1lbM10gICAgICAgICAgICAgPSBoLT5wcmVkX21vZGVfWVs1XTsKKyAgICBoLT5wcmVkX21vZGVfWVs2XSAgICAgICAgICAgICA9IGgtPnByZWRfbW9kZV9ZWzhdOworICAgIGgtPnRvcF9wcmVkX1lbaC0+bWJ4ICogMiArIDBdID0gaC0+cHJlZF9tb2RlX1lbN107CisgICAgaC0+dG9wX3ByZWRfWVtoLT5tYnggKiAyICsgMV0gPSBoLT5wcmVkX21vZGVfWVs4XTsKKworICAgIC8qIG1vZGlmeSBwcmVkIG1vZGVzIGFjY29yZGluZyB0byBhdmFpbGFiaWxpdHkgb2YgbmVpZ2hib3VyIHNhbXBsZXMgKi8KKyAgICBpZiAoIShoLT5mbGFncyAmIEFfQVZBSUwpKSB7CisgICAgICAgIG1vZGlmeV9wcmVkKGxlZnRfbW9kaWZpZXJfbCwgJmgtPnByZWRfbW9kZV9ZWzRdKTsKKyAgICAgICAgbW9kaWZ5X3ByZWQobGVmdF9tb2RpZmllcl9sLCAmaC0+cHJlZF9tb2RlX1lbN10pOworICAgICAgICBtb2RpZnlfcHJlZChsZWZ0X21vZGlmaWVyX2MsIHByZWRfbW9kZV91dik7CisgICAgfQorICAgIGlmICghKGgtPmZsYWdzICYgQl9BVkFJTCkpIHsKKyAgICAgICAgbW9kaWZ5X3ByZWQodG9wX21vZGlmaWVyX2wsICZoLT5wcmVkX21vZGVfWVs0XSk7CisgICAgICAgIG1vZGlmeV9wcmVkKHRvcF9tb2RpZmllcl9sLCAmaC0+cHJlZF9tb2RlX1lbNV0pOworICAgICAgICBtb2RpZnlfcHJlZCh0b3BfbW9kaWZpZXJfYywgcHJlZF9tb2RlX3V2KTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG1vdGlvbiBjb21wZW5zYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1jX2Rpcl9wYXJ0KEFWU0NvbnRleHQgKmgsIEFWRnJhbWUgKnBpYywgaW50IGNocm9tYV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhLCBpbnQgbGlzdCwgdWludDhfdCAqZGVzdF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY2IsIHVpbnQ4X3QgKmRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY194X29mZnNldCwgaW50IHNyY195X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcGVsX21jX2Z1bmMgKnFwaXhfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF9jaHJvbWFfbWNfZnVuYyBjaHJvbWFfb3AsIGNhdnNfdmVjdG9yICptdikKK3sKKyAgICBjb25zdCBpbnQgbXggICAgICAgICA9IG12LT54ICsgc3JjX3hfb2Zmc2V0ICogODsKKyAgICBjb25zdCBpbnQgbXkgICAgICAgICA9IG12LT55ICsgc3JjX3lfb2Zmc2V0ICogODsKKyAgICBjb25zdCBpbnQgbHVtYV94eSAgICA9IChteCAmIDMpICsgKChteSAmIDMpIDw8IDIpOworICAgIHVpbnQ4X3QgKnNyY195ICAgICAgID0gcGljLT5kYXRhWzBdICsgKG14ID4+IDIpICsgKG15ID4+IDIpICogaC0+bF9zdHJpZGU7CisgICAgdWludDhfdCAqc3JjX2NiICAgICAgPSBwaWMtPmRhdGFbMV0gKyAobXggPj4gMykgKyAobXkgPj4gMykgKiBoLT5jX3N0cmlkZTsKKyAgICB1aW50OF90ICpzcmNfY3IgICAgICA9IHBpYy0+ZGF0YVsyXSArIChteCA+PiAzKSArIChteSA+PiAzKSAqIGgtPmNfc3RyaWRlOworICAgIGludCBleHRyYV93aWR0aCAgICAgID0gMDsKKyAgICBpbnQgZXh0cmFfaGVpZ2h0ICAgICA9IGV4dHJhX3dpZHRoOworICAgIGNvbnN0IGludCBmdWxsX214ICAgID0gbXggPj4gMjsKKyAgICBjb25zdCBpbnQgZnVsbF9teSAgICA9IG15ID4+IDI7CisgICAgY29uc3QgaW50IHBpY193aWR0aCAgPSAxNiAqIGgtPm1iX3dpZHRoOworICAgIGNvbnN0IGludCBwaWNfaGVpZ2h0ID0gMTYgKiBoLT5tYl9oZWlnaHQ7CisgICAgaW50IGVtdSA9IDA7CisKKyAgICBpZiAoIXBpYy0+ZGF0YVswXSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChteCAmIDcpCisgICAgICAgIGV4dHJhX3dpZHRoICAtPSAzOworICAgIGlmIChteSAmIDcpCisgICAgICAgIGV4dHJhX2hlaWdodCAtPSAzOworCisgICAgaWYgKGZ1bGxfbXggPCAwIC0gZXh0cmFfd2lkdGggfHwKKyAgICAgICAgZnVsbF9teSA8IDAgLSBleHRyYV9oZWlnaHQgfHwKKyAgICAgICAgZnVsbF9teCArIDE2IC8qIEZJWE1FICovID4gcGljX3dpZHRoICsgZXh0cmFfd2lkdGggfHwKKyAgICAgICAgZnVsbF9teSArIDE2IC8qIEZJWE1FICovID4gcGljX2hlaWdodCArIGV4dHJhX2hlaWdodCkgeworICAgICAgICBoLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMoaC0+ZWRnZV9lbXVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3kgLSAyIC0gMiAqIGgtPmxfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bF9zdHJpZGUsIGgtPmxfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgKyA1LCAxNiArIDUgLyogRklYTUUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX214IC0gMiwgZnVsbF9teSAtIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOworICAgICAgICBzcmNfeSA9IGgtPmVkZ2VfZW11X2J1ZmZlciArIDIgKyAyICogaC0+bF9zdHJpZGU7CisgICAgICAgIGVtdSAgID0gMTsKKyAgICB9CisKKyAgICAvLyBGSVhNRSB0cnkgdmFyaWFibGUgaGVpZ2h0IHBlcmhhcHM/CisgICAgcXBpeF9vcFtsdW1hX3h5XShkZXN0X3ksIHNyY195LCBoLT5sX3N0cmlkZSk7CisKKyAgICBpZiAoZW11KSB7CisgICAgICAgIGgtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhoLT5lZGdlX2VtdV9idWZmZXIsIHNyY19jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmNfc3RyaWRlLCBoLT5jX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIDkgLyogRklYTUUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteCA+PiAzLCBteSA+PiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljX3dpZHRoID4+IDEsIHBpY19oZWlnaHQgPj4gMSk7CisgICAgICAgIHNyY19jYiA9IGgtPmVkZ2VfZW11X2J1ZmZlcjsKKyAgICB9CisgICAgY2hyb21hX29wKGRlc3RfY2IsIHNyY19jYiwgaC0+Y19zdHJpZGUsIGNocm9tYV9oZWlnaHQsIG14ICYgNywgbXkgJiA3KTsKKworICAgIGlmIChlbXUpIHsKKyAgICAgICAgaC0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGgtPmVkZ2VfZW11X2J1ZmZlciwgc3JjX2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+Y19zdHJpZGUsIGgtPmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOSAvKiBGSVhNRSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14ID4+IDMsIG15ID4+IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfd2lkdGggPj4gMSwgcGljX2hlaWdodCA+PiAxKTsKKyAgICAgICAgc3JjX2NyID0gaC0+ZWRnZV9lbXVfYnVmZmVyOworICAgIH0KKyAgICBjaHJvbWFfb3AoZGVzdF9jciwgc3JjX2NyLCBoLT5jX3N0cmlkZSwgY2hyb21hX2hlaWdodCwgbXggJiA3LCBteSAmIDcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWNfcGFydF9zdGQoQVZTQ29udGV4dCAqaCwgaW50IGNocm9tYV9oZWlnaHQsIGludCBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X29mZnNldCwgaW50IHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFwZWxfbWNfZnVuYyAqcXBpeF9wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF9jaHJvbWFfbWNfZnVuYyBjaHJvbWFfcHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFwZWxfbWNfZnVuYyAqcXBpeF9hdmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF9jaHJvbWFfbWNfZnVuYyBjaHJvbWFfYXZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdnNfdmVjdG9yICptdikKK3sKKyAgICBxcGVsX21jX2Z1bmMgKnFwaXhfb3AgPSAgcXBpeF9wdXQ7CisgICAgaDI2NF9jaHJvbWFfbWNfZnVuYyBjaHJvbWFfb3AgPSBjaHJvbWFfcHV0OworCisgICAgZGVzdF95ICAgKz0geF9vZmZzZXQgKiAyICsgeV9vZmZzZXQgKiBoLT5sX3N0cmlkZSAqIDI7CisgICAgZGVzdF9jYiAgKz0geF9vZmZzZXQgICAgICsgeV9vZmZzZXQgKiBoLT5jX3N0cmlkZTsKKyAgICBkZXN0X2NyICArPSB4X29mZnNldCAgICAgKyB5X29mZnNldCAqIGgtPmNfc3RyaWRlOworICAgIHhfb2Zmc2V0ICs9IDggKiBoLT5tYng7CisgICAgeV9vZmZzZXQgKz0gOCAqIGgtPm1ieTsKKworICAgIGlmIChtdi0+cmVmID49IDApIHsKKyAgICAgICAgQVZGcmFtZSAqcmVmID0gaC0+RFBCW212LT5yZWZdLmY7CisgICAgICAgIG1jX2Rpcl9wYXJ0KGgsIHJlZiwgY2hyb21hX2hlaWdodCwgZGVsdGEsIDAsCisgICAgICAgICAgICAgICAgICAgIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgeF9vZmZzZXQsIHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBxcGl4X29wLCBjaHJvbWFfb3AsIG12KTsKKworICAgICAgICBxcGl4X29wICAgPSBxcGl4X2F2ZzsKKyAgICAgICAgY2hyb21hX29wID0gY2hyb21hX2F2ZzsKKyAgICB9CisKKyAgICBpZiAoKG12ICsgTVZfQldEX09GRlMpLT5yZWYgPj0gMCkgeworICAgICAgICBBVkZyYW1lICpyZWYgPSBoLT5EUEJbMF0uZjsKKyAgICAgICAgbWNfZGlyX3BhcnQoaCwgcmVmLCBjaHJvbWFfaGVpZ2h0LCBkZWx0YSwgMSwKKyAgICAgICAgICAgICAgICAgICAgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLCB4X29mZnNldCwgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHFwaXhfb3AsIGNocm9tYV9vcCwgbXYgKyBNVl9CV0RfT0ZGUyk7CisgICAgfQorfQorCit2b2lkIGZmX2NhdnNfaW50ZXIoQVZTQ29udGV4dCAqaCwgZW51bSBjYXZzX21iIG1iX3R5cGUpCit7CisgICAgaWYgKGZmX2NhdnNfcGFydGl0aW9uX2ZsYWdzW21iX3R5cGVdID09IDApIHsgLy8gMTZ4MTYKKyAgICAgICAgbWNfcGFydF9zdGQoaCwgOCwgMCwgaC0+Y3ksIGgtPmN1LCBoLT5jdiwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgaC0+Y2RzcC5wdXRfY2F2c19xcGVsX3BpeGVsc190YWJbMF0sCisgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRjaHJvbWEucHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWJbMF0sCisgICAgICAgICAgICAgICAgICAgIGgtPmNkc3AuYXZnX2NhdnNfcXBlbF9waXhlbHNfdGFiWzBdLAorICAgICAgICAgICAgICAgICAgICBoLT5oMjY0Y2hyb21hLmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdLAorICAgICAgICAgICAgICAgICAgICAmaC0+bXZbTVZfRldEX1gwXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWNfcGFydF9zdGQoaCwgNCwgMCwgaC0+Y3ksIGgtPmN1LCBoLT5jdiwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgaC0+Y2RzcC5wdXRfY2F2c19xcGVsX3BpeGVsc190YWJbMV0sCisgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRjaHJvbWEucHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWJbMV0sCisgICAgICAgICAgICAgICAgICAgIGgtPmNkc3AuYXZnX2NhdnNfcXBlbF9waXhlbHNfdGFiWzFdLAorICAgICAgICAgICAgICAgICAgICBoLT5oMjY0Y2hyb21hLmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdLAorICAgICAgICAgICAgICAgICAgICAmaC0+bXZbTVZfRldEX1gwXSk7CisgICAgICAgIG1jX3BhcnRfc3RkKGgsIDQsIDAsIGgtPmN5LCBoLT5jdSwgaC0+Y3YsIDQsIDAsCisgICAgICAgICAgICAgICAgICAgIGgtPmNkc3AucHV0X2NhdnNfcXBlbF9waXhlbHNfdGFiWzFdLAorICAgICAgICAgICAgICAgICAgICBoLT5oMjY0Y2hyb21hLnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdLAorICAgICAgICAgICAgICAgICAgICBoLT5jZHNwLmF2Z19jYXZzX3FwZWxfcGl4ZWxzX3RhYlsxXSwKKyAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGNocm9tYS5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsxXSwKKyAgICAgICAgICAgICAgICAgICAgJmgtPm12W01WX0ZXRF9YMV0pOworICAgICAgICBtY19wYXJ0X3N0ZChoLCA0LCAwLCBoLT5jeSwgaC0+Y3UsIGgtPmN2LCAwLCA0LAorICAgICAgICAgICAgICAgICAgICBoLT5jZHNwLnB1dF9jYXZzX3FwZWxfcGl4ZWxzX3RhYlsxXSwKKyAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGNocm9tYS5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsxXSwKKyAgICAgICAgICAgICAgICAgICAgaC0+Y2RzcC5hdmdfY2F2c19xcGVsX3BpeGVsc190YWJbMV0sCisgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRjaHJvbWEuYXZnX2gyNjRfY2hyb21hX3BpeGVsc190YWJbMV0sCisgICAgICAgICAgICAgICAgICAgICZoLT5tdltNVl9GV0RfWDJdKTsKKyAgICAgICAgbWNfcGFydF9zdGQoaCwgNCwgMCwgaC0+Y3ksIGgtPmN1LCBoLT5jdiwgNCwgNCwKKyAgICAgICAgICAgICAgICAgICAgaC0+Y2RzcC5wdXRfY2F2c19xcGVsX3BpeGVsc190YWJbMV0sCisgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRjaHJvbWEucHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWJbMV0sCisgICAgICAgICAgICAgICAgICAgIGgtPmNkc3AuYXZnX2NhdnNfcXBlbF9waXhlbHNfdGFiWzFdLAorICAgICAgICAgICAgICAgICAgICBoLT5oMjY0Y2hyb21hLmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdLAorICAgICAgICAgICAgICAgICAgICAmaC0+bXZbTVZfRldEX1gzXSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNjYWxlX212KEFWU0NvbnRleHQgKmgsIGludCAqZF94LCBpbnQgKmRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXZzX3ZlY3RvciAqc3JjLCBpbnQgZGlzdHApCit7CisgICAgaW50IGRlbiA9IGgtPnNjYWxlX2RlbltGRk1BWChzcmMtPnJlZiwgMCldOworCisgICAgKmRfeCA9IChzcmMtPnggKiBkaXN0cCAqIGRlbiArIDI1NiArIEZGX1NJR05CSVQoc3JjLT54KSkgPj4gOTsKKyAgICAqZF95ID0gKHNyYy0+eSAqIGRpc3RwICogZGVuICsgMjU2ICsgRkZfU0lHTkJJVChzcmMtPnkpKSA+PiA5OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXZfcHJlZF9tZWRpYW4oQVZTQ29udGV4dCAqaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXZzX3ZlY3RvciAqbXZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdnNfdmVjdG9yICptdkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F2c192ZWN0b3IgKm12QiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXZzX3ZlY3RvciAqbXZDKQoreworICAgIGludCBheCwgYXksIGJ4LCBieSwgY3gsIGN5OworICAgIGludCBsZW5fYWIsIGxlbl9iYywgbGVuX2NhLCBsZW5fbWlkOworCisgICAgLyogc2NhbGUgY2FuZGlkYXRlcyBhY2NvcmRpbmcgdG8gdGhlaXIgdGVtcG9yYWwgc3BhbiAqLworICAgIHNjYWxlX212KGgsICZheCwgJmF5LCBtdkEsIG12UC0+ZGlzdCk7CisgICAgc2NhbGVfbXYoaCwgJmJ4LCAmYnksIG12QiwgbXZQLT5kaXN0KTsKKyAgICBzY2FsZV9tdihoLCAmY3gsICZjeSwgbXZDLCBtdlAtPmRpc3QpOworICAgIC8qIGZpbmQgdGhlIGdlb21ldHJpY2FsIG1lZGlhbiBvZiB0aGUgdGhyZWUgY2FuZGlkYXRlcyAqLworICAgIGxlbl9hYiAgPSBhYnMoYXggLSBieCkgKyBhYnMoYXkgLSBieSk7CisgICAgbGVuX2JjICA9IGFicyhieCAtIGN4KSArIGFicyhieSAtIGN5KTsKKyAgICBsZW5fY2EgID0gYWJzKGN4IC0gYXgpICsgYWJzKGN5IC0gYXkpOworICAgIGxlbl9taWQgPSBtaWRfcHJlZChsZW5fYWIsIGxlbl9iYywgbGVuX2NhKTsKKyAgICBpZiAobGVuX21pZCA9PSBsZW5fYWIpIHsKKyAgICAgICAgbXZQLT54ID0gY3g7CisgICAgICAgIG12UC0+eSA9IGN5OworICAgIH0gZWxzZSBpZiAobGVuX21pZCA9PSBsZW5fYmMpIHsKKyAgICAgICAgbXZQLT54ID0gYXg7CisgICAgICAgIG12UC0+eSA9IGF5OworICAgIH0gZWxzZSB7CisgICAgICAgIG12UC0+eCA9IGJ4OworICAgICAgICBtdlAtPnkgPSBieTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfY2F2c19tdihBVlNDb250ZXh0ICpoLCBlbnVtIGNhdnNfbXZfbG9jIG5QLCBlbnVtIGNhdnNfbXZfbG9jIG5DLAorICAgICAgICAgICAgICAgIGVudW0gY2F2c19tdl9wcmVkIG1vZGUsIGVudW0gY2F2c19ibG9jayBzaXplLCBpbnQgcmVmKQoreworICAgIGNhdnNfdmVjdG9yICptdlAgPSAmaC0+bXZbblBdOworICAgIGNhdnNfdmVjdG9yICptdkEgPSAmaC0+bXZbblAtMV07CisgICAgY2F2c192ZWN0b3IgKm12QiA9ICZoLT5tdltuUC00XTsKKyAgICBjYXZzX3ZlY3RvciAqbXZDID0gJmgtPm12W25DXTsKKyAgICBjb25zdCBjYXZzX3ZlY3RvciAqbXZQMiA9IE5VTEw7CisKKyAgICBtdlAtPnJlZiAgPSByZWY7CisgICAgbXZQLT5kaXN0ID0gaC0+ZGlzdFttdlAtPnJlZl07CisgICAgaWYgKG12Qy0+cmVmID09IE5PVF9BVkFJTCB8fCAoblAgPT0gTVZfRldEX1gzKSB8fCAoblAgPT0gTVZfQldEX1gzICkpCisgICAgICAgIG12QyA9ICZoLT5tdltuUCAtIDVdOyAgLy8gc2V0IHRvIHRvcC1sZWZ0IChtdkQpCisgICAgaWYgKG1vZGUgPT0gTVZfUFJFRF9QU0tJUCAmJgorICAgICAgICAobXZBLT5yZWYgPT0gTk9UX0FWQUlMIHx8CisgICAgICAgICBtdkItPnJlZiA9PSBOT1RfQVZBSUwgfHwKKyAgICAgICAgIChtdkEtPnggfCBtdkEtPnkgfCBtdkEtPnJlZikgPT0gMCB8fAorICAgICAgICAgKG12Qi0+eCB8IG12Qi0+eSB8IG12Qi0+cmVmKSA9PSAwKSkgeworICAgICAgICBtdlAyID0gJnVuX212OworICAgIC8qIGlmIHRoZXJlIGlzIG9ubHkgb25lIHN1aXRhYmxlIGNhbmRpZGF0ZSwgdGFrZSBpdCAqLworICAgIH0gZWxzZSBpZiAobXZBLT5yZWYgPj0gMCAmJiBtdkItPnJlZiA8IDAgICYmIG12Qy0+cmVmIDwgMCkgeworICAgICAgICBtdlAyID0gbXZBOworICAgIH0gZWxzZSBpZiAobXZBLT5yZWYgPCAwICAmJiBtdkItPnJlZiA+PSAwICYmIG12Qy0+cmVmIDwgMCkgeworICAgICAgICBtdlAyID0gbXZCOworICAgIH0gZWxzZSBpZiAobXZBLT5yZWYgPCAwICAmJiBtdkItPnJlZiA8IDAgICYmIG12Qy0+cmVmID49IDApIHsKKyAgICAgICAgbXZQMiA9IG12QzsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTVZfUFJFRF9MRUZUICAgICAmJiBtdkEtPnJlZiA9PSByZWYpIHsKKyAgICAgICAgbXZQMiA9IG12QTsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTVZfUFJFRF9UT1AgICAgICAmJiBtdkItPnJlZiA9PSByZWYpIHsKKyAgICAgICAgbXZQMiA9IG12QjsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTVZfUFJFRF9UT1BSSUdIVCAmJiBtdkMtPnJlZiA9PSByZWYpIHsKKyAgICAgICAgbXZQMiA9IG12QzsKKyAgICB9CisgICAgaWYgKG12UDIpIHsKKyAgICAgICAgbXZQLT54ID0gbXZQMi0+eDsKKyAgICAgICAgbXZQLT55ID0gbXZQMi0+eTsKKyAgICB9IGVsc2UKKyAgICAgICAgbXZfcHJlZF9tZWRpYW4oaCwgbXZQLCBtdkEsIG12QiwgbXZDKTsKKworICAgIGlmIChtb2RlIDwgTVZfUFJFRF9QU0tJUCkgeworICAgICAgICBtdlAtPnggKz0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICBtdlAtPnkgKz0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOworICAgIH0KKyAgICBzZXRfbXZzKG12UCwgc2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG1hY3JvYmxvY2sgbGV2ZWwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBpbml0aWFsaXNlIHByZWRpY3RvcnMgZm9yIG1vdGlvbiB2ZWN0b3JzIGFuZCBpbnRyYSBwcmVkaWN0aW9uCisgKi8KK3ZvaWQgZmZfY2F2c19pbml0X21iKEFWU0NvbnRleHQgKmgpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBjb3B5IHByZWRpY3RvcnMgZnJvbSB0b3AgbGluZSAoTUIgQiBhbmQgQykgaW50byBjYWNoZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaC0+bXZbTVZfRldEX0IyICsgaV0gPSBoLT50b3BfbXZbMF1baC0+bWJ4ICogMiArIGldOworICAgICAgICBoLT5tdltNVl9CV0RfQjIgKyBpXSA9IGgtPnRvcF9tdlsxXVtoLT5tYnggKiAyICsgaV07CisgICAgfQorICAgIGgtPnByZWRfbW9kZV9ZWzFdID0gaC0+dG9wX3ByZWRfWVtoLT5tYnggKiAyICsgMF07CisgICAgaC0+cHJlZF9tb2RlX1lbMl0gPSBoLT50b3BfcHJlZF9ZW2gtPm1ieCAqIDIgKyAxXTsKKyAgICAvKiBjbGVhciB0b3AgcHJlZGljdG9ycyBpZiBNQiBCIGlzIG5vdCBhdmFpbGFibGUgKi8KKyAgICBpZiAoIShoLT5mbGFncyAmIEJfQVZBSUwpKSB7CisgICAgICAgIGgtPm12W01WX0ZXRF9CMl0gID0gdW5fbXY7CisgICAgICAgIGgtPm12W01WX0ZXRF9CM10gID0gdW5fbXY7CisgICAgICAgIGgtPm12W01WX0JXRF9CMl0gID0gdW5fbXY7CisgICAgICAgIGgtPm12W01WX0JXRF9CM10gID0gdW5fbXY7CisgICAgICAgIGgtPnByZWRfbW9kZV9ZWzFdID0gaC0+cHJlZF9tb2RlX1lbMl0gPSBOT1RfQVZBSUw7CisgICAgICAgIGgtPmZsYWdzICAgICAgICAgJj0gfihDX0FWQUlMIHwgRF9BVkFJTCk7CisgICAgfSBlbHNlIGlmIChoLT5tYngpIHsKKyAgICAgICAgaC0+ZmxhZ3MgfD0gRF9BVkFJTDsKKyAgICB9CisgICAgaWYgKGgtPm1ieCA9PSBoLT5tYl93aWR0aCAtIDEpIC8vIE1CIEMgbm90IGF2YWlsYWJsZQorICAgICAgICBoLT5mbGFncyAmPSB+Q19BVkFJTDsKKyAgICAvKiBjbGVhciB0b3AtcmlnaHQgcHJlZGljdG9ycyBpZiBNQiBDIGlzIG5vdCBhdmFpbGFibGUgKi8KKyAgICBpZiAoIShoLT5mbGFncyAmIENfQVZBSUwpKSB7CisgICAgICAgIGgtPm12W01WX0ZXRF9DMl0gPSB1bl9tdjsKKyAgICAgICAgaC0+bXZbTVZfQldEX0MyXSA9IHVuX212OworICAgIH0KKyAgICAvKiBjbGVhciB0b3AtbGVmdCBwcmVkaWN0b3JzIGlmIE1CIEQgaXMgbm90IGF2YWlsYWJsZSAqLworICAgIGlmICghKGgtPmZsYWdzICYgRF9BVkFJTCkpIHsKKyAgICAgICAgaC0+bXZbTVZfRldEX0QzXSA9IHVuX212OworICAgICAgICBoLT5tdltNVl9CV0RfRDNdID0gdW5fbXY7CisgICAgfQorfQorCisvKioKKyAqIHNhdmUgcHJlZGljdG9ycyBmb3IgbGF0ZXIgbWFjcm9ibG9ja3MgYW5kIGluY3JlYXNlCisgKiBtYWNyb2Jsb2NrIGFkZHJlc3MKKyAqIEByZXR1cm4gMCBpZiBlbmQgb2YgZnJhbWUgaXMgcmVhY2hlZCwgMSBvdGhlcndpc2UKKyAqLworaW50IGZmX2NhdnNfbmV4dF9tYihBVlNDb250ZXh0ICpoKQoreworICAgIGludCBpOworCisgICAgaC0+ZmxhZ3MgfD0gQV9BVkFJTDsKKyAgICBoLT5jeSAgICArPSAxNjsKKyAgICBoLT5jdSAgICArPSA4OworICAgIGgtPmN2ICAgICs9IDg7CisgICAgLyogY29weSBtdnMgYXMgcHJlZGljdG9ycyB0byB0aGUgbGVmdCAqLworICAgIGZvciAoaSA9IDA7IGkgPD0gMjA7IGkgKz0gNCkKKyAgICAgICAgaC0+bXZbaV0gPSBoLT5tdltpICsgMl07CisgICAgLyogY29weSBib3R0b20gbXZzIGZyb20gY2FjaGUgdG8gdG9wIGxpbmUgKi8KKyAgICBoLT50b3BfbXZbMF1baC0+bWJ4ICogMiArIDBdID0gaC0+bXZbTVZfRldEX1gyXTsKKyAgICBoLT50b3BfbXZbMF1baC0+bWJ4ICogMiArIDFdID0gaC0+bXZbTVZfRldEX1gzXTsKKyAgICBoLT50b3BfbXZbMV1baC0+bWJ4ICogMiArIDBdID0gaC0+bXZbTVZfQldEX1gyXTsKKyAgICBoLT50b3BfbXZbMV1baC0+bWJ4ICogMiArIDFdID0gaC0+bXZbTVZfQldEX1gzXTsKKyAgICAvKiBuZXh0IE1CIGFkZHJlc3MgKi8KKyAgICBoLT5tYmlkeCsrOworICAgIGgtPm1ieCsrOworICAgIGlmIChoLT5tYnggPT0gaC0+bWJfd2lkdGgpIHsgLy8gTmV3IG1iIGxpbmUKKyAgICAgICAgaC0+ZmxhZ3MgPSBCX0FWQUlMIHwgQ19BVkFJTDsKKyAgICAgICAgLyogY2xlYXIgbGVmdCBwcmVkX21vZGVzICovCisgICAgICAgIGgtPnByZWRfbW9kZV9ZWzNdID0gaC0+cHJlZF9tb2RlX1lbNl0gPSBOT1RfQVZBSUw7CisgICAgICAgIC8qIGNsZWFyIGxlZnQgbXYgcHJlZGljdG9ycyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IDIwOyBpICs9IDQpCisgICAgICAgICAgICBoLT5tdltpXSA9IHVuX212OworICAgICAgICBoLT5tYnggPSAwOworICAgICAgICBoLT5tYnkrKzsKKyAgICAgICAgLyogcmUtY2FsY3VsYXRlIHNhbXBsZSBwb2ludGVycyAqLworICAgICAgICBoLT5jeSA9IGgtPmN1ci5mLT5kYXRhWzBdICsgaC0+bWJ5ICogMTYgKiBoLT5sX3N0cmlkZTsKKyAgICAgICAgaC0+Y3UgPSBoLT5jdXIuZi0+ZGF0YVsxXSArIGgtPm1ieSAqIDggKiBoLT5jX3N0cmlkZTsKKyAgICAgICAgaC0+Y3YgPSBoLT5jdXIuZi0+ZGF0YVsyXSArIGgtPm1ieSAqIDggKiBoLT5jX3N0cmlkZTsKKyAgICAgICAgaWYgKGgtPm1ieSA9PSBoLT5tYl9oZWlnaHQpIHsgLy8gRnJhbWUgZW5kCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnJhbWUgbGV2ZWwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGZmX2NhdnNfaW5pdF9waWMoQVZTQ29udGV4dCAqaCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIGNsZWFyIHNvbWUgcHJlZGljdG9ycyAqLworICAgIGZvciAoaSA9IDA7IGkgPD0gMjA7IGkgKz0gNCkKKyAgICAgICAgaC0+bXZbaV0gPSB1bl9tdjsKKyAgICBoLT5tdltNVl9CV0RfWDBdID0gZmZfY2F2c19kaXJfbXY7CisgICAgc2V0X212cygmaC0+bXZbTVZfQldEX1gwXSwgQkxLXzE2WDE2KTsKKyAgICBoLT5tdltNVl9GV0RfWDBdID0gZmZfY2F2c19kaXJfbXY7CisgICAgc2V0X212cygmaC0+bXZbTVZfRldEX1gwXSwgQkxLXzE2WDE2KTsKKyAgICBoLT5wcmVkX21vZGVfWVszXSA9IGgtPnByZWRfbW9kZV9ZWzZdID0gTk9UX0FWQUlMOworICAgIGgtPmN5ICAgICAgICAgICAgID0gaC0+Y3VyLmYtPmRhdGFbMF07CisgICAgaC0+Y3UgICAgICAgICAgICAgPSBoLT5jdXIuZi0+ZGF0YVsxXTsKKyAgICBoLT5jdiAgICAgICAgICAgICA9IGgtPmN1ci5mLT5kYXRhWzJdOworICAgIGgtPmxfc3RyaWRlICAgICAgID0gaC0+Y3VyLmYtPmxpbmVzaXplWzBdOworICAgIGgtPmNfc3RyaWRlICAgICAgID0gaC0+Y3VyLmYtPmxpbmVzaXplWzFdOworICAgIGgtPmx1bWFfc2NhblsyXSAgID0gOCAqIGgtPmxfc3RyaWRlOworICAgIGgtPmx1bWFfc2NhblszXSAgID0gOCAqIGgtPmxfc3RyaWRlICsgODsKKyAgICBoLT5tYnggICAgICAgICAgICA9IGgtPm1ieSA9IGgtPm1iaWR4ID0gMDsKKyAgICBoLT5mbGFncyAgICAgICAgICA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogaGVhZGVycyBhbmQgaW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogc29tZSBwcmVkaWN0aW9ucyByZXF1aXJlIGRhdGEgZnJvbSB0aGUgdG9wLW5laWdoYm91cmluZyBtYWNyb2Jsb2NrLgorICogdGhpcyBkYXRhIGhhcyB0byBiZSBzdG9yZWQgZm9yIG9uZSBjb21wbGV0ZSByb3cgb2YgbWFjcm9ibG9ja3MKKyAqIGFuZCB0aGlzIHN0b3JhZ2Ugc3BhY2UgaXMgYWxsb2NhdGVkIGhlcmUKKyAqLwordm9pZCBmZl9jYXZzX2luaXRfdG9wX2xpbmVzKEFWU0NvbnRleHQgKmgpCit7CisgICAgLyogYWxsb2MgdG9wIGxpbmUgb2YgcHJlZGljdG9ycyAqLworICAgIGgtPnRvcF9xcCAgICAgICA9IGF2X21hbGxvY3ooaC0+bWJfd2lkdGgpOworICAgIGgtPnRvcF9tdlswXSAgICA9IGF2X21hbGxvY3pfYXJyYXkoaC0+bWJfd2lkdGggKiAyICsgMSwgIHNpemVvZihjYXZzX3ZlY3RvcikpOworICAgIGgtPnRvcF9tdlsxXSAgICA9IGF2X21hbGxvY3pfYXJyYXkoaC0+bWJfd2lkdGggKiAyICsgMSwgIHNpemVvZihjYXZzX3ZlY3RvcikpOworICAgIGgtPnRvcF9wcmVkX1kgICA9IGF2X21hbGxvY3pfYXJyYXkoaC0+bWJfd2lkdGggKiAyLCAgc2l6ZW9mKCpoLT50b3BfcHJlZF9ZKSk7CisgICAgaC0+dG9wX2JvcmRlcl95ID0gYXZfbWFsbG9jel9hcnJheShoLT5tYl93aWR0aCArIDEsICAxNik7CisgICAgaC0+dG9wX2JvcmRlcl91ID0gYXZfbWFsbG9jel9hcnJheShoLT5tYl93aWR0aCwgIDEwKTsKKyAgICBoLT50b3BfYm9yZGVyX3YgPSBhdl9tYWxsb2N6X2FycmF5KGgtPm1iX3dpZHRoLCAgMTApOworCisgICAgLyogYWxsb2Mgc3BhY2UgZm9yIGNvLWxvY2F0ZWQgTVZzIGFuZCB0eXBlcyAqLworICAgIGgtPmNvbF9tdiAgICAgICAgPSBhdl9tYWxsb2N6X2FycmF5KGgtPm1iX3dpZHRoICogaC0+bWJfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKiBzaXplb2YoY2F2c192ZWN0b3IpKTsKKyAgICBoLT5jb2xfdHlwZV9iYXNlID0gYXZfbWFsbG9jeihoLT5tYl93aWR0aCAqIGgtPm1iX2hlaWdodCk7CisgICAgaC0+YmxvY2sgICAgICAgICA9IGF2X21hbGxvY3ooNjQgKiBzaXplb2YoaW50MTZfdCkpOworfQorCithdl9jb2xkIGludCBmZl9jYXZzX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFWU0NvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmZfYmxvY2tkc3BfaW5pdCgmaC0+YmRzcCwgYXZjdHgpOworICAgIGZmX2gyNjRjaHJvbWFfaW5pdCgmaC0+aDI2NGNocm9tYSwgOCk7CisgICAgZmZfaWRjdGRzcF9pbml0KCZoLT5pZHNwLCBhdmN0eCk7CisgICAgZmZfdmlkZW9kc3BfaW5pdCgmaC0+dmRzcCwgOCk7CisgICAgZmZfY2F2c2RzcF9pbml0KCZoLT5jZHNwLCBhdmN0eCk7CisgICAgZmZfaW5pdF9zY2FudGFibGVfcGVybXV0YXRpb24oaC0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmNkc3AuaWRjdF9wZXJtKTsKKyAgICBmZl9pbml0X3NjYW50YWJsZShoLT5pZHNwLmlkY3RfcGVybXV0YXRpb24sICZoLT5zY2FudGFibGUsIGZmX3ppZ3phZ19kaXJlY3QpOworCisgICAgaC0+YXZjdHggICAgICAgPSBhdmN0eDsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKworICAgIGgtPmN1ci5mICAgID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBoLT5EUEJbMF0uZiA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaC0+RFBCWzFdLmYgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghaC0+Y3VyLmYgfHwgIWgtPkRQQlswXS5mIHx8ICFoLT5EUEJbMV0uZikgeworICAgICAgICBmZl9jYXZzX2VuZChhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaC0+bHVtYV9zY2FuWzBdICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgIGgtPmx1bWFfc2NhblsxXSAgICAgICAgICAgICAgICAgICAgID0gODsKKyAgICBoLT5pbnRyYV9wcmVkX2xbSU5UUkFfTF9WRVJUXSAgICAgICA9IGludHJhX3ByZWRfdmVydDsKKyAgICBoLT5pbnRyYV9wcmVkX2xbSU5UUkFfTF9IT1JJWl0gICAgICA9IGludHJhX3ByZWRfaG9yaXo7CisgICAgaC0+aW50cmFfcHJlZF9sW0lOVFJBX0xfTFBdICAgICAgICAgPSBpbnRyYV9wcmVkX2xwOworICAgIGgtPmludHJhX3ByZWRfbFtJTlRSQV9MX0RPV05fTEVGVF0gID0gaW50cmFfcHJlZF9kb3duX2xlZnQ7CisgICAgaC0+aW50cmFfcHJlZF9sW0lOVFJBX0xfRE9XTl9SSUdIVF0gPSBpbnRyYV9wcmVkX2Rvd25fcmlnaHQ7CisgICAgaC0+aW50cmFfcHJlZF9sW0lOVFJBX0xfTFBfTEVGVF0gICAgPSBpbnRyYV9wcmVkX2xwX2xlZnQ7CisgICAgaC0+aW50cmFfcHJlZF9sW0lOVFJBX0xfTFBfVE9QXSAgICAgPSBpbnRyYV9wcmVkX2xwX3RvcDsKKyAgICBoLT5pbnRyYV9wcmVkX2xbSU5UUkFfTF9EQ18xMjhdICAgICA9IGludHJhX3ByZWRfZGNfMTI4OworICAgIGgtPmludHJhX3ByZWRfY1tJTlRSQV9DX0xQXSAgICAgICAgID0gaW50cmFfcHJlZF9scDsKKyAgICBoLT5pbnRyYV9wcmVkX2NbSU5UUkFfQ19IT1JJWl0gICAgICA9IGludHJhX3ByZWRfaG9yaXo7CisgICAgaC0+aW50cmFfcHJlZF9jW0lOVFJBX0NfVkVSVF0gICAgICAgPSBpbnRyYV9wcmVkX3ZlcnQ7CisgICAgaC0+aW50cmFfcHJlZF9jW0lOVFJBX0NfUExBTkVdICAgICAgPSBpbnRyYV9wcmVkX3BsYW5lOworICAgIGgtPmludHJhX3ByZWRfY1tJTlRSQV9DX0xQX0xFRlRdICAgID0gaW50cmFfcHJlZF9scF9sZWZ0OworICAgIGgtPmludHJhX3ByZWRfY1tJTlRSQV9DX0xQX1RPUF0gICAgID0gaW50cmFfcHJlZF9scF90b3A7CisgICAgaC0+aW50cmFfcHJlZF9jW0lOVFJBX0NfRENfMTI4XSAgICAgPSBpbnRyYV9wcmVkX2RjXzEyODsKKyAgICBoLT5tdls3XSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHVuX212OworICAgIGgtPm12WzE5XSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdW5fbXY7CisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgaW50IGZmX2NhdnNfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBVlNDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmgtPmN1ci5mKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZoLT5EUEJbMF0uZik7CisgICAgYXZfZnJhbWVfZnJlZSgmaC0+RFBCWzFdLmYpOworCisgICAgYXZfZnJlZXAoJmgtPnRvcF9xcCk7CisgICAgYXZfZnJlZXAoJmgtPnRvcF9tdlswXSk7CisgICAgYXZfZnJlZXAoJmgtPnRvcF9tdlsxXSk7CisgICAgYXZfZnJlZXAoJmgtPnRvcF9wcmVkX1kpOworICAgIGF2X2ZyZWVwKCZoLT50b3BfYm9yZGVyX3kpOworICAgIGF2X2ZyZWVwKCZoLT50b3BfYm9yZGVyX3UpOworICAgIGF2X2ZyZWVwKCZoLT50b3BfYm9yZGVyX3YpOworICAgIGF2X2ZyZWVwKCZoLT5jb2xfbXYpOworICAgIGF2X2ZyZWVwKCZoLT5jb2xfdHlwZV9iYXNlKTsKKyAgICBhdl9mcmVlcCgmaC0+YmxvY2spOworICAgIGF2X2ZyZWVwKCZoLT5lZGdlX2VtdV9idWZmZXIpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2F2cy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2F2cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjM5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jYXZzLmgKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiBDaGluZXNlIEFWUyB2aWRlbyAoQVZTMS1QMiwgSmlaaHVuIHByb2ZpbGUpIGRlY29kZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIFN0ZWZhbiBHZWhyZXIgPHN0ZWZhbi5nZWhyZXJAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQ0FWU19ICisjZGVmaW5lIEFWQ09ERUNfQ0FWU19ICisKKyNpbmNsdWRlICJjYXZzZHNwLmgiCisjaW5jbHVkZSAiYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJoMjY0Y2hyb21hLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAidmlkZW9kc3AuaCIKKworI2RlZmluZSBTTElDRV9NQVhfU1RBUlRfQ09ERSAgICAweDAwMDAwMWFmCisjZGVmaW5lIEVYVF9TVEFSVF9DT0RFICAgICAgICAgIDB4MDAwMDAxYjUKKyNkZWZpbmUgVVNFUl9TVEFSVF9DT0RFICAgICAgICAgMHgwMDAwMDFiMgorI2RlZmluZSBDQVZTX1NUQVJUX0NPREUgICAgICAgICAweDAwMDAwMWIwCisjZGVmaW5lIFBJQ19JX1NUQVJUX0NPREUgICAgICAgIDB4MDAwMDAxYjMKKyNkZWZpbmUgUElDX1BCX1NUQVJUX0NPREUgICAgICAgMHgwMDAwMDFiNgorCisjZGVmaW5lIEFfQVZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQl9BVkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBDX0FWQUlMICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIERfQVZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTk9UX0FWQUlMICAgICAgICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBSRUZfSU5UUkEgICAgICAgICAgICAgICAgICAgICAgIC0yCisjZGVmaW5lIFJFRl9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgLTMKKworI2RlZmluZSBFU0NBUEVfQ09ERSAgICAgICAgICAgICAgICAgICAgIDU5CisKKyNkZWZpbmUgRldEMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBGV0QxICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEJXRDAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQldEMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBTWU0wICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFNZTTEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU1BMSVRIICAgICAgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBTUExJVFYgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgTVZfQldEX09GRlMgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBNVl9TVFJJREUgICAgICAgICAgICAgICAgICAgICAgICA0CisKK2VudW0gY2F2c19tYiB7CisgIElfOFg4ID0gMCwKKyAgUF9TS0lQLAorICBQXzE2WDE2LAorICBQXzE2WDgsCisgIFBfOFgxNiwKKyAgUF84WDgsCisgIEJfU0tJUCwKKyAgQl9ESVJFQ1QsCisgIEJfRldEXzE2WDE2LAorICBCX0JXRF8xNlgxNiwKKyAgQl9TWU1fMTZYMTYsCisgIEJfOFg4ID0gMjkKK307CisKK2VudW0gY2F2c19zdWJfbWIgeworICBCX1NVQl9ESVJFQ1QsCisgIEJfU1VCX0ZXRCwKKyAgQl9TVUJfQldELAorICBCX1NVQl9TWU0KK307CisKK2VudW0gY2F2c19pbnRyYV9sdW1hIHsKKyAgSU5UUkFfTF9WRVJULAorICBJTlRSQV9MX0hPUklaLAorICBJTlRSQV9MX0xQLAorICBJTlRSQV9MX0RPV05fTEVGVCwKKyAgSU5UUkFfTF9ET1dOX1JJR0hULAorICBJTlRSQV9MX0xQX0xFRlQsCisgIElOVFJBX0xfTFBfVE9QLAorICBJTlRSQV9MX0RDXzEyOAorfTsKKworZW51bSBjYXZzX2ludHJhX2Nocm9tYSB7CisgIElOVFJBX0NfTFAsCisgIElOVFJBX0NfSE9SSVosCisgIElOVFJBX0NfVkVSVCwKKyAgSU5UUkFfQ19QTEFORSwKKyAgSU5UUkFfQ19MUF9MRUZULAorICBJTlRSQV9DX0xQX1RPUCwKKyAgSU5UUkFfQ19EQ18xMjgsCit9OworCitlbnVtIGNhdnNfbXZfcHJlZCB7CisgIE1WX1BSRURfTUVESUFOLAorICBNVl9QUkVEX0xFRlQsCisgIE1WX1BSRURfVE9QLAorICBNVl9QUkVEX1RPUFJJR0hULAorICBNVl9QUkVEX1BTS0lQLAorICBNVl9QUkVEX0JTS0lQCit9OworCitlbnVtIGNhdnNfYmxvY2sgeworICBCTEtfMTZYMTYsCisgIEJMS18xNlg4LAorICBCTEtfOFgxNiwKKyAgQkxLXzhYOAorfTsKKworZW51bSBjYXZzX212X2xvYyB7CisgIE1WX0ZXRF9EMyA9IDAsCisgIE1WX0ZXRF9CMiwKKyAgTVZfRldEX0IzLAorICBNVl9GV0RfQzIsCisgIE1WX0ZXRF9BMSwKKyAgTVZfRldEX1gwLAorICBNVl9GV0RfWDEsCisgIE1WX0ZXRF9BMyA9IDgsCisgIE1WX0ZXRF9YMiwKKyAgTVZfRldEX1gzLAorICBNVl9CV0RfRDMgPSBNVl9CV0RfT0ZGUywKKyAgTVZfQldEX0IyLAorICBNVl9CV0RfQjMsCisgIE1WX0JXRF9DMiwKKyAgTVZfQldEX0ExLAorICBNVl9CV0RfWDAsCisgIE1WX0JXRF9YMSwKKyAgTVZfQldEX0EzID0gTVZfQldEX09GRlMrOCwKKyAgTVZfQldEX1gyLAorICBNVl9CV0RfWDMKK307CisKK0RFQ0xBUkVfQUxJR05FRCg4LCB0eXBlZGVmLCBzdHJ1Y3QpIHsKKyAgICBpbnQxNl90IHg7CisgICAgaW50MTZfdCB5OworICAgIGludDE2X3QgZGlzdDsKKyAgICBpbnQxNl90IHJlZjsKK30gY2F2c192ZWN0b3I7CisKK3N0cnVjdCBkZWNfMmR2bGMgeworICBpbnQ4X3Qgcmx0YWJbNTldWzNdOworICBpbnQ4X3QgbGV2ZWxfYWRkWzI3XTsKKyAgaW50OF90IGdvbG9tYl9vcmRlcjsKKyAgaW50IGluY19saW1pdDsKKyAgaW50OF90IG1heF9ydW47Cit9OworCit0eXBlZGVmIHN0cnVjdCBBVlNGcmFtZSB7CisgICAgQVZGcmFtZSAqZjsKKyAgICBpbnQgcG9jOworfSBBVlNGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgQVZTQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEJsb2NrRFNQQ29udGV4dCBiZHNwOworICAgIEgyNjRDaHJvbWFDb250ZXh0IGgyNjRjaHJvbWE7CisgICAgSURDVERTUENvbnRleHQgaWRzcDsKKyAgICBWaWRlb0RTUENvbnRleHQgdmRzcDsKKyAgICBDQVZTRFNQQ29udGV4dCAgY2RzcDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIEFWU0ZyYW1lIGN1cjsgICAgIC8vLzwgY3VycmVudGx5IGRlY29kZWQgZnJhbWUKKyAgICBBVlNGcmFtZSBEUEJbMl07ICAvLy88IHJlZmVyZW5jZSBmcmFtZXMKKyAgICBpbnQgZGlzdFsyXTsgICAgIC8vLzwgdGVtcG9yYWwgZGlzdGFuY2VzIGZyb20gY3VycmVudCBmcmFtZSB0byByZWYgZnJhbWVzCisgICAgaW50IGxvd19kZWxheTsKKyAgICBpbnQgcHJvZmlsZSwgbGV2ZWw7CisgICAgaW50IGFzcGVjdF9yYXRpbzsKKyAgICBpbnQgbWJfd2lkdGgsIG1iX2hlaWdodDsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgc3RyZWFtX3JldmlzaW9uOyAvLy88MCBmb3Igc2FtcGxlcyBmcm9tIDIwMDYsIDEgZm9yIHJtNTJqIGVuY29kZXIKKyAgICBpbnQgcHJvZ3Jlc3NpdmU7CisgICAgaW50IHBpY19zdHJ1Y3R1cmU7CisgICAgaW50IHNraXBfbW9kZV9mbGFnOyAvLy88IHNlbGVjdCBiZXR3ZWVuIHNraXBfY291bnQgb3Igb25lIHNraXBfZmxhZyBwZXIgTUIKKyAgICBpbnQgbG9vcF9maWx0ZXJfZGlzYWJsZTsKKyAgICBpbnQgYWxwaGFfb2Zmc2V0LCBiZXRhX29mZnNldDsKKyAgICBpbnQgcmVmX2ZsYWc7CisgICAgaW50IG1ieCwgbWJ5LCBtYmlkeDsgLy8vPCBtYWNyb2Jsb2NrIGNvb3JkaW5hdGVzCisgICAgaW50IGZsYWdzOyAgICAgICAgIC8vLzwgYXZhaWxhYmlsaXR5IGZsYWdzIG9mIG5laWdoYm91cmluZyBtYWNyb2Jsb2NrcworICAgIGludCBzdGM7ICAgICAgICAgICAvLy88IGxhc3Qgc3RhcnQgY29kZQorICAgIHVpbnQ4X3QgKmN5LCAqY3UsICpjdjsgLy8vPCBjdXJyZW50IE1CIHNhbXBsZSBwb2ludGVycworICAgIGludCBsZWZ0X3FwOworICAgIHVpbnQ4X3QgKnRvcF9xcDsKKworICAgIC8qKiBtdiBtb3Rpb24gdmVjdG9yIGNhY2hlCisgICAgICAgMDogICAgRDMgIEIyICBCMyAgQzIKKyAgICAgICA0OiAgICBBMSAgWDAgIFgxICAgLQorICAgICAgIDg6ICAgIEEzICBYMiAgWDMgICAtCisKKyAgICAgICBYIGFyZSB0aGUgdmVjdG9ycyBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrICg1LDYsOSwxMCkKKyAgICAgICBBIGlzIHRoZSBtYWNyb2Jsb2NrIHRvIHRoZSBsZWZ0ICg0LDgpCisgICAgICAgQiBpcyB0aGUgbWFjcm9ibG9jayB0byB0aGUgdG9wICgxLDIpCisgICAgICAgQyBpcyB0aGUgbWFjcm9ibG9jayB0byB0aGUgdG9wLXJpZ2h0ICgzKQorICAgICAgIEQgaXMgdGhlIG1hY3JvYmxvY2sgdG8gdGhlIHRvcC1sZWZ0ICgwKQorCisgICAgICAgdGhlIHNhbWUgaXMgcmVwZWF0ZWQgZm9yIGJhY2t3YXJkIG1vdGlvbiB2ZWN0b3JzICovCisgICAgY2F2c192ZWN0b3IgbXZbMio0KjNdOworICAgIGNhdnNfdmVjdG9yICp0b3BfbXZbMl07CisgICAgY2F2c192ZWN0b3IgKmNvbF9tdjsKKworICAgIC8qKiBsdW1hIHByZWQgbW9kZSBjYWNoZQorICAgICAgIDA6ICAgIC0tICBCMiAgQjMKKyAgICAgICAzOiAgICBBMSAgWDAgIFgxCisgICAgICAgNjogICAgQTMgIFgyICBYMyAgICovCisgICAgaW50IHByZWRfbW9kZV9ZWzMqM107CisgICAgaW50ICp0b3BfcHJlZF9ZOworICAgIHB0cmRpZmZfdCBsX3N0cmlkZSwgY19zdHJpZGU7CisgICAgaW50IGx1bWFfc2Nhbls0XTsKKyAgICBpbnQgcXA7CisgICAgaW50IHFwX2ZpeGVkOworICAgIGludCBwaWNfcXBfZml4ZWQ7CisgICAgaW50IGNicDsKKyAgICBTY2FuVGFibGUgc2NhbnRhYmxlOworCisgICAgLyoqIGludHJhIHByZWRpY3Rpb24gaXMgZG9uZSB3aXRoIHVuLWRlYmxvY2tlZCBzYW1wbGVzCisgICAgIHRoZXkgYXJlIHNhdmVkIGhlcmUgYmVmb3JlIGRlYmxvY2tpbmcgdGhlIE1CICAqLworICAgIHVpbnQ4X3QgKnRvcF9ib3JkZXJfeSwgKnRvcF9ib3JkZXJfdSwgKnRvcF9ib3JkZXJfdjsKKyAgICB1aW50OF90IGxlZnRfYm9yZGVyX3lbMjZdLCBsZWZ0X2JvcmRlcl91WzEwXSwgbGVmdF9ib3JkZXJfdlsxMF07CisgICAgdWludDhfdCBpbnRlcm5fYm9yZGVyX3lbMjZdOworICAgIHVpbnQ4X3QgdG9wbGVmdF9ib3JkZXJfeSwgdG9wbGVmdF9ib3JkZXJfdSwgdG9wbGVmdF9ib3JkZXJfdjsKKworICAgIHZvaWQgKCppbnRyYV9wcmVkX2xbOF0pKHVpbnQ4X3QgKmQsdWludDhfdCAqdG9wLHVpbnQ4X3QgKmxlZnQsaW50IHN0cmlkZSk7CisgICAgdm9pZCAoKmludHJhX3ByZWRfY1s3XSkodWludDhfdCAqZCx1aW50OF90ICp0b3AsdWludDhfdCAqbGVmdCxpbnQgc3RyaWRlKTsKKyAgICB1aW50OF90ICpjb2xfdHlwZV9iYXNlOworCisgICAgLyogc2NhbGluZyBmYWN0b3JzIGZvciBNViBwcmVkaWN0aW9uICovCisgICAgaW50IHN5bV9mYWN0b3I7ICAgIC8vLzwgZm9yIHNjYWxpbmcgaW4gc3ltbWV0cmljYWwgQiBibG9jaworICAgIGludCBkaXJlY3RfZGVuWzJdOyAvLy88IGZvciBzY2FsaW5nIGluIGRpcmVjdCBCIGJsb2NrCisgICAgaW50IHNjYWxlX2RlblsyXTsgIC8vLzwgZm9yIHNjYWxpbmcgbmVpZ2hib3VyaW5nIE1WcworCisgICAgdWludDhfdCAqZWRnZV9lbXVfYnVmZmVyOworCisgICAgaW50IGdvdF9rZXlmcmFtZTsKKyAgICBpbnQxNl90ICpibG9jazsKK30gQVZTQ29udGV4dDsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgICAgIGZmX2NhdnNfY2hyb21hX3FwWzY0XTsKK2V4dGVybiBjb25zdCB1aW50OF90ICAgICBmZl9jYXZzX3BhcnRpdGlvbl9mbGFnc1szMF07CitleHRlcm4gY29uc3QgY2F2c192ZWN0b3IgZmZfY2F2c19pbnRyYV9tdjsKK2V4dGVybiBjb25zdCBjYXZzX3ZlY3RvciBmZl9jYXZzX2Rpcl9tdjsKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9tdnMoY2F2c192ZWN0b3IgKm12LCBlbnVtIGNhdnNfYmxvY2sgc2l6ZSkgeworICAgIHN3aXRjaChzaXplKSB7CisgICAgY2FzZSBCTEtfMTZYMTY6CisgICAgICAgIG12W01WX1NUUklERSAgXSA9IG12WzBdOworICAgICAgICBtdltNVl9TVFJJREUrMV0gPSBtdlswXTsKKyAgICBjYXNlIEJMS18xNlg4OgorICAgICAgICBtdlsxXSA9IG12WzBdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJMS184WDE2OgorICAgICAgICBtdltNVl9TVFJJREVdID0gbXZbMF07CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBmZl9jYXZzX2ZpbHRlcihBVlNDb250ZXh0ICpoLCBlbnVtIGNhdnNfbWIgbWJfdHlwZSk7Cit2b2lkIGZmX2NhdnNfbG9hZF9pbnRyYV9wcmVkX2x1bWEoQVZTQ29udGV4dCAqaCwgdWludDhfdCAqdG9wLCB1aW50OF90ICoqbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2spOwordm9pZCBmZl9jYXZzX2xvYWRfaW50cmFfcHJlZF9jaHJvbWEoQVZTQ29udGV4dCAqaCk7Cit2b2lkIGZmX2NhdnNfbW9kaWZ5X21iX2koQVZTQ29udGV4dCAqaCwgaW50ICpwcmVkX21vZGVfdXYpOwordm9pZCBmZl9jYXZzX2ludGVyKEFWU0NvbnRleHQgKmgsIGVudW0gY2F2c19tYiBtYl90eXBlKTsKK3ZvaWQgZmZfY2F2c19tdihBVlNDb250ZXh0ICpoLCBlbnVtIGNhdnNfbXZfbG9jIG5QLCBlbnVtIGNhdnNfbXZfbG9jIG5DLAorICAgICAgICAgICAgICAgIGVudW0gY2F2c19tdl9wcmVkIG1vZGUsIGVudW0gY2F2c19ibG9jayBzaXplLCBpbnQgcmVmKTsKK3ZvaWQgZmZfY2F2c19pbml0X21iKEFWU0NvbnRleHQgKmgpOworaW50ICBmZl9jYXZzX25leHRfbWIoQVZTQ29udGV4dCAqaCk7CitpbnQgZmZfY2F2c19pbml0X3BpYyhBVlNDb250ZXh0ICpoKTsKK3ZvaWQgZmZfY2F2c19pbml0X3RvcF9saW5lcyhBVlNDb250ZXh0ICpoKTsKK2ludCBmZl9jYXZzX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK2ludCBmZl9jYXZzX2VuZCAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQ0FWU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jYXZzX3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2F2c19wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDY3YTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2F2c19wYXJzZXIuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENoaW5lc2UgQVZTIHZpZGVvIChBVlMxLVAyLCBKaVpodW4gcHJvZmlsZSkgcGFyc2VyLgorICogQ29weXJpZ2h0IChjKSAyMDA2ICBTdGVmYW4gR2VocmVyIDxzdGVmYW4uZ2VocmVyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ2hpbmVzZSBBVlMgdmlkZW8gKEFWUzEtUDIsIEppWmh1biBwcm9maWxlKSBwYXJzZXIKKyAqIEBhdXRob3IgU3RlZmFuIEdlaHJlciA8c3RlZmFuLmdlaHJlckBnbXguZGU+CisgKi8KKworI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgImNhdnMuaCIKKworCisvKioKKyAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZSBpbiB0aGUgYml0c3RyZWFtLgorICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQgZnJhbWUsIG9yIC0xCisgKi8KK3N0YXRpYyBpbnQgY2F2c19maW5kX2ZyYW1lX2VuZChQYXJzZUNvbnRleHQgKnBjLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKSB7CisgICAgaW50IHBpY19mb3VuZCwgaTsKKyAgICB1aW50MzJfdCBzdGF0ZTsKKworICAgIHBpY19mb3VuZD0gcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kOworICAgIHN0YXRlPSBwYy0+c3RhdGU7CisKKyAgICBpPTA7CisgICAgaWYoIXBpY19mb3VuZCl7CisgICAgICAgIGZvcihpPTA7IGk8YnVmX3NpemU7IGkrKyl7CisgICAgICAgICAgICBzdGF0ZT0gKHN0YXRlPDw4KSB8IGJ1ZltpXTsKKyAgICAgICAgICAgIGlmKHN0YXRlID09IFBJQ19JX1NUQVJUX0NPREUgfHwgc3RhdGUgPT0gUElDX1BCX1NUQVJUX0NPREUpeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBwaWNfZm91bmQ9MTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHBpY19mb3VuZCl7CisgICAgICAgIC8qIEVPRiBjb25zaWRlcmVkIGFzIGVuZCBvZiBmcmFtZSAqLworICAgICAgICBpZiAoYnVmX3NpemUgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3IoOyBpPGJ1Zl9zaXplOyBpKyspeworICAgICAgICAgICAgc3RhdGU9IChzdGF0ZTw8OCkgfCBidWZbaV07CisgICAgICAgICAgICBpZigoc3RhdGUmMHhGRkZGRkYwMCkgPT0gMHgxMDApeworICAgICAgICAgICAgICAgIGlmKHN0YXRlID4gU0xJQ0VfTUFYX1NUQVJUX0NPREUpeworICAgICAgICAgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQ9MDsKKyAgICAgICAgICAgICAgICAgICAgcGMtPnN0YXRlPS0xOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQ9IHBpY19mb3VuZDsKKyAgICBwYy0+c3RhdGU9IHN0YXRlOworICAgIHJldHVybiBFTkRfTk9UX0ZPVU5EOworfQorCitzdGF0aWMgaW50IGNhdnN2aWRlb19wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIFBhcnNlQ29udGV4dCAqcGMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IG5leHQ7CisKKyAgICBpZihzLT5mbGFncyAmIFBBUlNFUl9GTEFHX0NPTVBMRVRFX0ZSQU1FUyl7CisgICAgICAgIG5leHQ9IGJ1Zl9zaXplOworICAgIH1lbHNleworICAgICAgICBuZXh0PSBjYXZzX2ZpbmRfZnJhbWVfZW5kKHBjLCBidWYsIGJ1Zl9zaXplKTsKKworICAgICAgICBpZiAoZmZfY29tYmluZV9mcmFtZShwYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgICAgICpwb3V0YnVmID0gTlVMTDsKKyAgICAgICAgICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICB9CisgICAgfQorICAgICpwb3V0YnVmID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gbmV4dDsKK30KKworQVZDb2RlY1BhcnNlciBmZl9jYXZzdmlkZW9fcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfQ0FWUyB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfcGFyc2UgICA9IGNhdnN2aWRlb19wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKKyAgICAuc3BsaXQgICAgICAgICAgPSBmZl9tcGVnNHZpZGVvX3NwbGl0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2NhdnNkYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9jYXZzZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MzVhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jYXZzZGF0YS5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDaGluZXNlIEFWUyB2aWRlbyAoQVZTMS1QMiwgSmlaaHVuIHByb2ZpbGUpIGRlY29kZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIFN0ZWZhbiBHZWhyZXIgPHN0ZWZhbi5nZWhyZXJAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY2F2cy5oIgorCitjb25zdCB1aW50OF90IGZmX2NhdnNfcGFydGl0aW9uX2ZsYWdzWzMwXSA9IHsKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lfOFg4CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QX1NLSVAKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1BfMTZYMTYKKyAgICAgICAgICAgICAgICAgICAgICBTUExJVEgsICAgICAgICAvL1BfMTZYOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUExJVFYsIC8vUF84WDE2CisgICAgICAgICAgICAgICAgICAgICAgU1BMSVRIfFNQTElUViwgLy9QXzhYOAorICAgICAgICAgICAgICAgICAgICAgIFNQTElUSHxTUExJVFYsIC8vQl9TS0lQCisgICAgICAgICAgICAgICAgICAgICAgU1BMSVRIfFNQTElUViwgLy9CX0RJUkVDVAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQl9GV0RfMTZYMTYKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0JfQldEXzE2WDE2CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9CX1NZTV8xNlgxNgorICBGV0QwfEZXRDEgICAgICAgICAgfFNQTElUSCwKKyAgRldEMHxGV0QxICAgICAgICAgICAgICAgICB8U1BMSVRWLAorICBCV0QwfEJXRDEgICAgICAgICAgfFNQTElUSCwKKyAgQldEMHxCV0QxICAgICAgICAgICAgICAgICB8U1BMSVRWLAorICBGV0QwfEJXRDEgICAgICAgICAgfFNQTElUSCwKKyAgRldEMHxCV0QxICAgICAgICAgICAgICAgICB8U1BMSVRWLAorICBCV0QwfEZXRDEgICAgICAgICAgfFNQTElUSCwKKyAgQldEMHxGV0QxICAgICAgICAgICAgICAgICB8U1BMSVRWLAorICBGV0QwfEZXRDEgICAgIHxTWU0xfFNQTElUSCwKKyAgRldEMHxGV0QxICAgICB8U1lNMSAgICAgICB8U1BMSVRWLAorICBCV0QwfEZXRDEgICAgIHxTWU0xfFNQTElUSCwKKyAgQldEMHxGV0QxICAgICB8U1lNMSAgICAgICB8U1BMSVRWLAorICBGV0QwfEZXRDF8U1lNMCAgICAgfFNQTElUSCwKKyAgRldEMHxGV0QxfFNZTTAgICAgICAgICAgICB8U1BMSVRWLAorICBGV0QwfEJXRDF8U1lNMCAgICAgfFNQTElUSCwKKyAgRldEMHxCV0QxfFNZTTAgICAgICAgICAgICB8U1BMSVRWLAorICBGV0QwfEZXRDF8U1lNMHxTWU0xfFNQTElUSCwKKyAgRldEMHxGV0QxfFNZTTB8U1lNMSAgICAgICB8U1BMSVRWLAorICAgICAgICAgICAgICAgICAgICAgIFNQTElUSHxTUExJVFYsIC8vQl84WDggPSAyOQorfTsKKworY29uc3QgdWludDhfdCBmZl9jYXZzX2Nocm9tYV9xcFs2NF0gPSB7CisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKyAgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MiwgNDMsIDQzLCA0NCwgNDQsCisgIDQ1LCA0NSwgNDYsIDQ2LCA0NywgNDcsIDQ4LCA0OCwgNDgsIDQ5LCA0OSwgNDksIDUwLCA1MCwgNTAsIDUxCit9OworCisvKiogbWFyayBibG9jayBhcyAibm8gcHJlZGljdGlvbiBmcm9tIHRoaXMgZGlyZWN0aW9uIgorICAgIGUuZy4gZm9yd2FyZCBtb3Rpb24gdmVjdG9yIGluIEJXRCBwYXJ0aXRpb24gKi8KK2NvbnN0IGNhdnNfdmVjdG9yIGZmX2NhdnNfZGlyX212ICAgPSB7MCwwLDEsUkVGX0RJUn07CisKKy8qKiBtYXJrIGJsb2NrIGFzIHVzaW5nIGludHJhIHByZWRpY3Rpb24gKi8KK2NvbnN0IGNhdnNfdmVjdG9yIGZmX2NhdnNfaW50cmFfbXYgPSB7MCwwLDEsUkVGX0lOVFJBfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2NhdnNkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NhdnNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTMwNGVhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2F2c2RlYy5jCkBAIC0wLDAgKzEsMTI1MyBAQAorLyoKKyAqIENoaW5lc2UgQVZTIHZpZGVvIChBVlMxLVAyLCBKaVpodW4gcHJvZmlsZSkgZGVjb2Rlci4KKyAqIENvcHlyaWdodCAoYykgMjAwNiAgU3RlZmFuIEdlaHJlciA8c3RlZmFuLmdlaHJlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENoaW5lc2UgQVZTIHZpZGVvIChBVlMxLVAyLCBKaVpodW4gcHJvZmlsZSkgZGVjb2RlcgorICogQGF1dGhvciBTdGVmYW4gR2VocmVyIDxzdGVmYW4uZ2VocmVyQGdteC5kZT4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiY2F2cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXBlZzEyZGF0YS5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorCitzdGF0aWMgY29uc3QgdWludDhfdCBtdl9zY2FuWzRdID0geworICAgIE1WX0ZXRF9YMCwgTVZfRldEX1gxLAorICAgIE1WX0ZXRF9YMiwgTVZfRldEX1gzCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjYnBfdGFiWzY0XVsyXSA9IHsKKyAgeyA2MywgIDAgfSwgeyAxNSwgMTUgfSwgeyAzMSwgNjMgfSwgeyA0NywgMzEgfSwgeyAgMCwgMTYgfSwgeyAxNCwgMzIgfSwgeyAxMywgNDcgfSwgeyAxMSwgMTMgfSwKKyAgeyAgNywgMTQgfSwgeyAgNSwgMTEgfSwgeyAxMCwgMTIgfSwgeyAgOCwgIDUgfSwgeyAxMiwgMTAgfSwgeyA2MSwgIDcgfSwgeyAgNCwgNDggfSwgeyA1NSwgIDMgfSwKKyAgeyAgMSwgIDIgfSwgeyAgMiwgIDggfSwgeyA1OSwgIDQgfSwgeyAgMywgIDEgfSwgeyA2MiwgNjEgfSwgeyAgOSwgNTUgfSwgeyAgNiwgNTkgfSwgeyAyOSwgNjIgfSwKKyAgeyA0NSwgMjkgfSwgeyA1MSwgMjcgfSwgeyAyMywgMjMgfSwgeyAzOSwgMTkgfSwgeyAyNywgMzAgfSwgeyA0NiwgMjggfSwgeyA1MywgIDkgfSwgeyAzMCwgIDYgfSwKKyAgeyA0MywgNjAgfSwgeyAzNywgMjEgfSwgeyA2MCwgNDQgfSwgeyAxNiwgMjYgfSwgeyAyMSwgNTEgfSwgeyAyOCwgMzUgfSwgeyAxOSwgMTggfSwgeyAzNSwgMjAgfSwKKyAgeyA0MiwgMjQgfSwgeyAyNiwgNTMgfSwgeyA0NCwgMTcgfSwgeyAzMiwgMzcgfSwgeyA1OCwgMzkgfSwgeyAyNCwgNDUgfSwgeyAyMCwgNTggfSwgeyAxNywgNDMgfSwKKyAgeyAxOCwgNDIgfSwgeyA0OCwgNDYgfSwgeyAyMiwgMzYgfSwgeyAzMywgMzMgfSwgeyAyNSwgMzQgfSwgeyA0OSwgNDAgfSwgeyA0MCwgNTIgfSwgeyAzNiwgNDkgfSwKKyAgeyAzNCwgNTAgfSwgeyA1MCwgNTYgfSwgeyA1MiwgMjUgfSwgeyA1NCwgMjIgfSwgeyA0MSwgNTQgfSwgeyA1NiwgNTcgfSwgeyAzOCwgNDEgfSwgeyA1NywgMzggfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2NhbjN4M1s0XSA9IHsgNCwgNSwgNywgOCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkZXF1YW50X3NoaWZ0WzY0XSA9IHsKKyAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgOSwgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICA3LCAgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBkZXF1YW50X211bFs2NF0gPSB7CisgIDMyNzY4LCAzNjA2MSwgMzg5NjgsIDQyNDk1LCA0NjM0MSwgNTA1MzUsIDU1NDM3LCA2MDQyNCwKKyAgMzI5MzIsIDM1NzM0LCAzODk2OCwgNDI0OTUsIDQ2MTc3LCA1MDUzNSwgNTUxMDksIDU5OTMzLAorICA2NTUzNSwgMzU3MzQsIDM4OTY4LCA0MjU3NywgNDYzNDEsIDUwNjE3LCA1NTAyNywgNjAwOTcsCisgIDMyODA5LCAzNTczNCwgMzg5NjgsIDQyNDU0LCA0NjM4MiwgNTA1NzYsIDU1MTA5LCA2MDA1NiwKKyAgNjU1MzUsIDM1NzM0LCAzODk2OCwgNDI0OTUsIDQ2MzIwLCA1MDUxNSwgNTUxMDksIDYwMDc2LAorICA2NTUzNSwgMzU3NDQsIDM4OTY4LCA0MjQ5NSwgNDYzNDEsIDUwNTM1LCA1NTA5OSwgNjAwODcsCisgIDY1NTM1LCAzNTczNCwgMzg5NzMsIDQyNTAwLCA0NjM0MSwgNTA1MzUsIDU1MTA5LCA2MDA5NywKKyAgMzI3NzEsIDM1NzM0LCAzODk2NSwgNDI0OTcsIDQ2MzQxLCA1MDUzNSwgNTUxMDksIDYwMDk5Cit9OworCisjZGVmaW5lIEVPQiAwLCAwLCAwCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGVjXzJkdmxjIGludHJhX2RlY1s3XSA9IHsKKyAgICB7CisgICAgICAgIHsgLy9sZXZlbCAvIHJ1biAvIHRhYmxlX2luYworICAgICAgICAgICAgeyAgMSwgIDEsICAxIH0sIHsgLTEsICAxLCAgMSB9LCB7ICAxLCAgMiwgIDEgfSwgeyAtMSwgIDIsICAxIH0sIHsgIDEsICAzLCAgMSB9LCB7IC0xLCAgMywgMSB9LAorICAgICAgICAgICAgeyAgMSwgIDQsICAxIH0sIHsgLTEsICA0LCAgMSB9LCB7ICAxLCAgNSwgIDEgfSwgeyAtMSwgIDUsICAxIH0sIHsgIDEsICA2LCAgMSB9LCB7IC0xLCAgNiwgMSB9LAorICAgICAgICAgICAgeyAgMSwgIDcsICAxIH0sIHsgLTEsICA3LCAgMSB9LCB7ICAxLCAgOCwgIDEgfSwgeyAtMSwgIDgsICAxIH0sIHsgIDEsICA5LCAgMSB9LCB7IC0xLCAgOSwgMSB9LAorICAgICAgICAgICAgeyAgMSwgMTAsICAxIH0sIHsgLTEsIDEwLCAgMSB9LCB7ICAxLCAxMSwgIDEgfSwgeyAtMSwgMTEsICAxIH0sIHsgIDIsICAxLCAgMiB9LCB7IC0yLCAgMSwgMiB9LAorICAgICAgICAgICAgeyAgMSwgMTIsICAxIH0sIHsgLTEsIDEyLCAgMSB9LCB7ICAxLCAxMywgIDEgfSwgeyAtMSwgMTMsICAxIH0sIHsgIDEsIDE0LCAgMSB9LCB7IC0xLCAxNCwgMSB9LAorICAgICAgICAgICAgeyAgMSwgMTUsICAxIH0sIHsgLTEsIDE1LCAgMSB9LCB7ICAyLCAgMiwgIDIgfSwgeyAtMiwgIDIsICAyIH0sIHsgIDEsIDE2LCAgMSB9LCB7IC0xLCAxNiwgMSB9LAorICAgICAgICAgICAgeyAgMSwgMTcsICAxIH0sIHsgLTEsIDE3LCAgMSB9LCB7ICAzLCAgMSwgIDMgfSwgeyAtMywgIDEsICAzIH0sIHsgIDEsIDE4LCAgMSB9LCB7IC0xLCAxOCwgMSB9LAorICAgICAgICAgICAgeyAgMSwgMTksICAxIH0sIHsgLTEsIDE5LCAgMSB9LCB7ICAyLCAgMywgIDIgfSwgeyAtMiwgIDMsICAyIH0sIHsgIDEsIDIwLCAgMSB9LCB7IC0xLCAyMCwgMSB9LAorICAgICAgICAgICAgeyAgMSwgMjEsICAxIH0sIHsgLTEsIDIxLCAgMSB9LCB7ICAyLCAgNCwgIDIgfSwgeyAtMiwgIDQsICAyIH0sIHsgIDEsIDIyLCAgMSB9LCB7IC0xLCAyMiwgMSB9LAorICAgICAgICAgICAgeyAgMiwgIDUsICAyIH0sIHsgLTIsICA1LCAgMiB9LCB7ICAxLCAyMywgIDEgfSwgeyAtMSwgMjMsICAxIH0sIHsgICBFT0IgICAgfQorICAgICAgICB9LAorICAgICAgICAvL2xldmVsX2FkZAorICAgICAgICB7IDAsIDQsIDMsIDMsIDMsIDMsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIC0xLCAtMSwgLTEgfSwKKyAgICAgICAgMiwgLy9nb2xvbWJfb3JkZXIKKyAgICAgICAgMCwgLy9pbmNfbGltaXQKKyAgICAgICAgMjMsIC8vbWF4X3J1bgorICAgIH0sCisgICAgeworICAgICAgICB7IC8vbGV2ZWwgLyBydW4KKyAgICAgICAgICAgIHsgIDEsICAxLCAgMCB9LCB7IC0xLCAgMSwgIDAgfSwgeyAgMSwgIDIsICAwIH0sIHsgLTEsICAyLCAgMCB9LCB7ICAyLCAgMSwgIDEgfSwgeyAtMiwgIDEsICAxIH0sCisgICAgICAgICAgICB7ICAxLCAgMywgIDAgfSwgeyAtMSwgIDMsICAwIH0sIHsgICAgIEVPQiAgICB9LCB7ICAxLCAgNCwgIDAgfSwgeyAtMSwgIDQsICAwIH0sIHsgIDEsICA1LCAgMCB9LAorICAgICAgICAgICAgeyAtMSwgIDUsICAwIH0sIHsgIDEsICA2LCAgMCB9LCB7IC0xLCAgNiwgIDAgfSwgeyAgMywgIDEsICAyIH0sIHsgLTMsICAxLCAgMiB9LCB7ICAyLCAgMiwgIDEgfSwKKyAgICAgICAgICAgIHsgLTIsICAyLCAgMSB9LCB7ICAxLCAgNywgIDAgfSwgeyAtMSwgIDcsICAwIH0sIHsgIDEsICA4LCAgMCB9LCB7IC0xLCAgOCwgIDAgfSwgeyAgMSwgIDksICAwIH0sCisgICAgICAgICAgICB7IC0xLCAgOSwgIDAgfSwgeyAgMiwgIDMsICAxIH0sIHsgLTIsICAzLCAgMSB9LCB7ICA0LCAgMSwgIDIgfSwgeyAtNCwgIDEsICAyIH0sIHsgIDEsIDEwLCAgMCB9LAorICAgICAgICAgICAgeyAtMSwgMTAsICAwIH0sIHsgIDEsIDExLCAgMCB9LCB7IC0xLCAxMSwgIDAgfSwgeyAgMiwgIDQsICAxIH0sIHsgLTIsICA0LCAgMSB9LCB7ICAzLCAgMiwgIDIgfSwKKyAgICAgICAgICAgIHsgLTMsICAyLCAgMiB9LCB7ICAxLCAxMiwgIDAgfSwgeyAtMSwgMTIsICAwIH0sIHsgIDIsICA1LCAgMSB9LCB7IC0yLCAgNSwgIDEgfSwgeyAgNSwgIDEsICAzIH0sCisgICAgICAgICAgICB7IC01LCAgMSwgIDMgfSwgeyAgMSwgMTMsICAwIH0sIHsgLTEsIDEzLCAgMCB9LCB7ICAyLCAgNiwgIDEgfSwgeyAtMiwgIDYsICAxIH0sIHsgIDEsIDE0LCAgMCB9LAorICAgICAgICAgICAgeyAtMSwgMTQsICAwIH0sIHsgIDIsICA3LCAgMSB9LCB7IC0yLCAgNywgIDEgfSwgeyAgMiwgIDgsICAxIH0sIHsgLTIsICA4LCAgMSB9LCB7ICAzLCAgMywgIDIgfSwKKyAgICAgICAgICAgIHsgLTMsICAzLCAgMiB9LCB7ICA2LCAgMSwgIDMgfSwgeyAtNiwgIDEsICAzIH0sIHsgIDEsIDE1LCAgMCB9LCB7IC0xLCAxNSwgIDAgfQorICAgICAgICB9LAorICAgICAgICAvL2xldmVsX2FkZAorICAgICAgICB7IDAsIDcsIDQsIDQsIDMsIDMsIDMsIDMsIDMsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgICAgICAyLCAvL2dvbG9tYl9vcmRlcgorICAgICAgICAxLCAvL2luY19saW1pdAorICAgICAgICAxNSwgLy9tYXhfcnVuCisgICAgfSwKKyAgICB7CisgICAgICAgIHsgLy9sZXZlbCAvIHJ1bgorICAgICAgICAgICAgeyAgMSwgIDEsICAwIH0sIHsgLTEsICAxLCAgMCB9LCB7ICAyLCAgMSwgIDAgfSwgeyAtMiwgIDEsICAwIH0sIHsgIDEsICAyLCAgMCB9LCB7IC0xLCAgMiwgIDAgfSwKKyAgICAgICAgICAgIHsgIDMsICAxLCAgMSB9LCB7IC0zLCAgMSwgIDEgfSwgeyAgICAgRU9CICAgIH0sIHsgIDEsICAzLCAgMCB9LCB7IC0xLCAgMywgIDAgfSwgeyAgMiwgIDIsICAwIH0sCisgICAgICAgICAgICB7IC0yLCAgMiwgIDAgfSwgeyAgNCwgIDEsICAxIH0sIHsgLTQsICAxLCAgMSB9LCB7ICAxLCAgNCwgIDAgfSwgeyAtMSwgIDQsICAwIH0sIHsgIDUsICAxLCAgMiB9LAorICAgICAgICAgICAgeyAtNSwgIDEsICAyIH0sIHsgIDEsICA1LCAgMCB9LCB7IC0xLCAgNSwgIDAgfSwgeyAgMywgIDIsICAxIH0sIHsgLTMsICAyLCAgMSB9LCB7ICAyLCAgMywgIDAgfSwKKyAgICAgICAgICAgIHsgLTIsICAzLCAgMCB9LCB7ICAxLCAgNiwgIDAgfSwgeyAtMSwgIDYsICAwIH0sIHsgIDYsICAxLCAgMiB9LCB7IC02LCAgMSwgIDIgfSwgeyAgMiwgIDQsICAwIH0sCisgICAgICAgICAgICB7IC0yLCAgNCwgIDAgfSwgeyAgMSwgIDcsICAwIH0sIHsgLTEsICA3LCAgMCB9LCB7ICA0LCAgMiwgIDEgfSwgeyAtNCwgIDIsICAxIH0sIHsgIDcsICAxLCAgMiB9LAorICAgICAgICAgICAgeyAtNywgIDEsICAyIH0sIHsgIDMsICAzLCAgMSB9LCB7IC0zLCAgMywgIDEgfSwgeyAgMiwgIDUsICAwIH0sIHsgLTIsICA1LCAgMCB9LCB7ICAxLCAgOCwgIDAgfSwKKyAgICAgICAgICAgIHsgLTEsICA4LCAgMCB9LCB7ICAyLCAgNiwgIDAgfSwgeyAtMiwgIDYsICAwIH0sIHsgIDgsICAxLCAgMyB9LCB7IC04LCAgMSwgIDMgfSwgeyAgMSwgIDksICAwIH0sCisgICAgICAgICAgICB7IC0xLCAgOSwgIDAgfSwgeyAgNSwgIDIsICAyIH0sIHsgLTUsICAyLCAgMiB9LCB7ICAzLCAgNCwgIDEgfSwgeyAtMywgIDQsICAxIH0sIHsgIDIsICA3LCAgMCB9LAorICAgICAgICAgICAgeyAtMiwgIDcsICAwIH0sIHsgIDksICAxLCAgMyB9LCB7IC05LCAgMSwgIDMgfSwgeyAgMSwgMTAsICAwIH0sIHsgLTEsIDEwLCAgMCB9CisgICAgICAgIH0sCisgICAgICAgIC8vbGV2ZWxfYWRkCisgICAgICAgIHsgMCwgMTAsIDYsIDQsIDQsIDMsIDMsIDMsIDIsIDIsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgICAgIDIsIC8vZ29sb21iX29yZGVyCisgICAgICAgIDIsIC8vaW5jX2xpbWl0CisgICAgICAgIDEwLCAvL21heF9ydW4KKyAgICB9LAorICAgIHsKKyAgICAgICAgeyAvL2xldmVsIC8gcnVuCisgICAgICAgICAgICB7ICAxLCAgMSwgIDAgfSwgeyAtMSwgIDEsICAwIH0sIHsgIDIsICAxLCAgMCB9LCB7IC0yLCAgMSwgIDAgfSwgeyAgMywgIDEsICAwIH0sIHsgLTMsICAxLCAgMCB9LAorICAgICAgICAgICAgeyAgMSwgIDIsICAwIH0sIHsgLTEsICAyLCAgMCB9LCB7ICAgICBFT0IgICAgfSwgeyAgNCwgIDEsICAwIH0sIHsgLTQsICAxLCAgMCB9LCB7ICA1LCAgMSwgIDEgfSwKKyAgICAgICAgICAgIHsgLTUsICAxLCAgMSB9LCB7ICAyLCAgMiwgIDAgfSwgeyAtMiwgIDIsICAwIH0sIHsgIDEsICAzLCAgMCB9LCB7IC0xLCAgMywgIDAgfSwgeyAgNiwgIDEsICAxIH0sCisgICAgICAgICAgICB7IC02LCAgMSwgIDEgfSwgeyAgMywgIDIsICAwIH0sIHsgLTMsICAyLCAgMCB9LCB7ICA3LCAgMSwgIDEgfSwgeyAtNywgIDEsICAxIH0sIHsgIDEsICA0LCAgMCB9LAorICAgICAgICAgICAgeyAtMSwgIDQsICAwIH0sIHsgIDgsICAxLCAgMiB9LCB7IC04LCAgMSwgIDIgfSwgeyAgMiwgIDMsICAwIH0sIHsgLTIsICAzLCAgMCB9LCB7ICA0LCAgMiwgIDAgfSwKKyAgICAgICAgICAgIHsgLTQsICAyLCAgMCB9LCB7ICAxLCAgNSwgIDAgfSwgeyAtMSwgIDUsICAwIH0sIHsgIDksICAxLCAgMiB9LCB7IC05LCAgMSwgIDIgfSwgeyAgNSwgIDIsICAxIH0sCisgICAgICAgICAgICB7IC01LCAgMiwgIDEgfSwgeyAgMiwgIDQsICAwIH0sIHsgLTIsICA0LCAgMCB9LCB7IDEwLCAgMSwgIDIgfSwgey0xMCwgIDEsICAyIH0sIHsgIDMsICAzLCAgMCB9LAorICAgICAgICAgICAgeyAtMywgIDMsICAwIH0sIHsgIDEsICA2LCAgMCB9LCB7IC0xLCAgNiwgIDAgfSwgeyAxMSwgIDEsICAzIH0sIHstMTEsICAxLCAgMyB9LCB7ICA2LCAgMiwgIDEgfSwKKyAgICAgICAgICAgIHsgLTYsICAyLCAgMSB9LCB7ICAxLCAgNywgIDAgfSwgeyAtMSwgIDcsICAwIH0sIHsgIDIsICA1LCAgMCB9LCB7IC0yLCAgNSwgIDAgfSwgeyAgMywgIDQsICAwIH0sCisgICAgICAgICAgICB7IC0zLCAgNCwgIDAgfSwgeyAxMiwgIDEsICAzIH0sIHstMTIsICAxLCAgMyB9LCB7ICA0LCAgMywgIDAgfSwgeyAtNCwgIDMsICAwIH0KKyAgICAgICAgIH0sCisgICAgICAgIC8vbGV2ZWxfYWRkCisgICAgICAgIHsgMCwgMTMsIDcsIDUsIDQsIDMsIDIsIDIsIC0xLCAtMSwgLTEgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICAgICAgMiwgLy9nb2xvbWJfb3JkZXIKKyAgICAgICAgNCwgLy9pbmNfbGltaXQKKyAgICAgICAgNywgLy9tYXhfcnVuCisgICAgfSwKKyAgICB7CisgICAgICAgIHsgLy9sZXZlbCAvIHJ1bgorICAgICAgICAgICAgeyAgMSwgIDEsICAwIH0sIHsgLTEsICAxLCAgMCB9LCB7ICAyLCAgMSwgIDAgfSwgeyAtMiwgIDEsICAwIH0sIHsgIDMsICAxLCAgMCB9LCB7IC0zLCAgMSwgIDAgfSwKKyAgICAgICAgICAgIHsgICAgIEVPQiAgICB9LCB7ICA0LCAgMSwgIDAgfSwgeyAtNCwgIDEsICAwIH0sIHsgIDUsICAxLCAgMCB9LCB7IC01LCAgMSwgIDAgfSwgeyAgNiwgIDEsICAwIH0sCisgICAgICAgICAgICB7IC02LCAgMSwgIDAgfSwgeyAgMSwgIDIsICAwIH0sIHsgLTEsICAyLCAgMCB9LCB7ICA3LCAgMSwgIDAgfSwgeyAtNywgIDEsICAwIH0sIHsgIDgsICAxLCAgMSB9LAorICAgICAgICAgICAgeyAtOCwgIDEsICAxIH0sIHsgIDIsICAyLCAgMCB9LCB7IC0yLCAgMiwgIDAgfSwgeyAgOSwgIDEsICAxIH0sIHsgLTksICAxLCAgMSB9LCB7IDEwLCAgMSwgIDEgfSwKKyAgICAgICAgICAgIHstMTAsICAxLCAgMSB9LCB7ICAxLCAgMywgIDAgfSwgeyAtMSwgIDMsICAwIH0sIHsgIDMsICAyLCAgMCB9LCB7IC0zLCAgMiwgIDAgfSwgeyAxMSwgIDEsICAyIH0sCisgICAgICAgICAgICB7LTExLCAgMSwgIDIgfSwgeyAgNCwgIDIsICAwIH0sIHsgLTQsICAyLCAgMCB9LCB7IDEyLCAgMSwgIDIgfSwgey0xMiwgIDEsICAyIH0sIHsgMTMsICAxLCAgMiB9LAorICAgICAgICAgICAgey0xMywgIDEsICAyIH0sIHsgIDUsICAyLCAgMCB9LCB7IC01LCAgMiwgIDAgfSwgeyAgMSwgIDQsICAwIH0sIHsgLTEsICA0LCAgMCB9LCB7ICAyLCAgMywgIDAgfSwKKyAgICAgICAgICAgIHsgLTIsICAzLCAgMCB9LCB7IDE0LCAgMSwgIDIgfSwgey0xNCwgIDEsICAyIH0sIHsgIDYsICAyLCAgMCB9LCB7IC02LCAgMiwgIDAgfSwgeyAxNSwgIDEsICAyIH0sCisgICAgICAgICAgICB7LTE1LCAgMSwgIDIgfSwgeyAxNiwgIDEsICAyIH0sIHstMTYsICAxLCAgMiB9LCB7ICAzLCAgMywgIDAgfSwgeyAtMywgIDMsICAwIH0sIHsgIDEsICA1LCAgMCB9LAorICAgICAgICAgICAgeyAtMSwgIDUsICAwIH0sIHsgIDcsICAyLCAgMCB9LCB7IC03LCAgMiwgIDAgfSwgeyAxNywgIDEsICAyIH0sIHstMTcsICAxLCAgMiB9CisgICAgICAgIH0sCisgICAgICAgIC8vbGV2ZWxfYWRkCisgICAgICAgIHsgMCwxOCwgOCwgNCwgMiwgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgICAgICAyLCAvL2dvbG9tYl9vcmRlcgorICAgICAgICA3LCAvL2luY19saW1pdAorICAgICAgICA1LCAvL21heF9ydW4KKyAgICB9LAorICAgIHsKKyAgICAgICAgeyAvL2xldmVsIC8gcnVuCisgICAgICAgICAgICB7ICAgICBFT0IgICAgfSwgeyAgMSwgIDEsICAwIH0sIHsgLTEsICAxLCAgMCB9LCB7ICAyLCAgMSwgIDAgfSwgeyAtMiwgIDEsICAwIH0sIHsgIDMsICAxLCAgMCB9LAorICAgICAgICAgICAgeyAtMywgIDEsICAwIH0sIHsgIDQsICAxLCAgMCB9LCB7IC00LCAgMSwgIDAgfSwgeyAgNSwgIDEsICAwIH0sIHsgLTUsICAxLCAgMCB9LCB7ICA2LCAgMSwgIDAgfSwKKyAgICAgICAgICAgIHsgLTYsICAxLCAgMCB9LCB7ICA3LCAgMSwgIDAgfSwgeyAtNywgIDEsICAwIH0sIHsgIDgsICAxLCAgMCB9LCB7IC04LCAgMSwgIDAgfSwgeyAgOSwgIDEsICAwIH0sCisgICAgICAgICAgICB7IC05LCAgMSwgIDAgfSwgeyAxMCwgIDEsICAwIH0sIHstMTAsICAxLCAgMCB9LCB7ICAxLCAgMiwgIDAgfSwgeyAtMSwgIDIsICAwIH0sIHsgMTEsICAxLCAgMSB9LAorICAgICAgICAgICAgey0xMSwgIDEsICAxIH0sIHsgMTIsICAxLCAgMSB9LCB7LTEyLCAgMSwgIDEgfSwgeyAxMywgIDEsICAxIH0sIHstMTMsICAxLCAgMSB9LCB7ICAyLCAgMiwgIDAgfSwKKyAgICAgICAgICAgIHsgLTIsICAyLCAgMCB9LCB7IDE0LCAgMSwgIDEgfSwgey0xNCwgIDEsICAxIH0sIHsgMTUsICAxLCAgMSB9LCB7LTE1LCAgMSwgIDEgfSwgeyAgMywgIDIsICAwIH0sCisgICAgICAgICAgICB7IC0zLCAgMiwgIDAgfSwgeyAxNiwgIDEsICAxIH0sIHstMTYsICAxLCAgMSB9LCB7ICAxLCAgMywgIDAgfSwgeyAtMSwgIDMsICAwIH0sIHsgMTcsICAxLCAgMSB9LAorICAgICAgICAgICAgey0xNywgIDEsICAxIH0sIHsgIDQsICAyLCAgMCB9LCB7IC00LCAgMiwgIDAgfSwgeyAxOCwgIDEsICAxIH0sIHstMTgsICAxLCAgMSB9LCB7ICA1LCAgMiwgIDAgfSwKKyAgICAgICAgICAgIHsgLTUsICAyLCAgMCB9LCB7IDE5LCAgMSwgIDEgfSwgey0xOSwgIDEsICAxIH0sIHsgMjAsICAxLCAgMSB9LCB7LTIwLCAgMSwgIDEgfSwgeyAgNiwgIDIsICAwIH0sCisgICAgICAgICAgICB7IC02LCAgMiwgIDAgfSwgeyAyMSwgIDEsICAxIH0sIHstMjEsICAxLCAgMSB9LCB7ICAyLCAgMywgIDAgfSwgeyAtMiwgIDMsICAwIH0KKyAgICAgICAgfSwKKyAgICAgICAgLy9sZXZlbF9hZGQKKyAgICAgICAgeyAwLCAyMiwgNywgMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgICAgIDIsIC8vZ29sb21iX29yZGVyCisgICAgICAgIDEwLCAvL2luY19saW1pdAorICAgICAgICAzLCAvL21heF9ydW4KKyAgICB9LAorICAgIHsKKyAgICAgICAgeyAvL2xldmVsIC8gcnVuCisgICAgICAgICAgICB7ICAgICBFT0IgICAgfSwgeyAgMSwgIDEsICAwIH0sIHsgLTEsICAxLCAgMCB9LCB7ICAyLCAgMSwgIDAgfSwgeyAtMiwgIDEsICAwIH0sIHsgIDMsICAxLCAgMCB9LAorICAgICAgICAgICAgeyAtMywgIDEsICAwIH0sIHsgIDQsICAxLCAgMCB9LCB7IC00LCAgMSwgIDAgfSwgeyAgNSwgIDEsICAwIH0sIHsgLTUsICAxLCAgMCB9LCB7ICA2LCAgMSwgIDAgfSwKKyAgICAgICAgICAgIHsgLTYsICAxLCAgMCB9LCB7ICA3LCAgMSwgIDAgfSwgeyAtNywgIDEsICAwIH0sIHsgIDgsICAxLCAgMCB9LCB7IC04LCAgMSwgIDAgfSwgeyAgOSwgIDEsICAwIH0sCisgICAgICAgICAgICB7IC05LCAgMSwgIDAgfSwgeyAxMCwgIDEsICAwIH0sIHstMTAsICAxLCAgMCB9LCB7IDExLCAgMSwgIDAgfSwgey0xMSwgIDEsICAwIH0sIHsgMTIsICAxLCAgMCB9LAorICAgICAgICAgICAgey0xMiwgIDEsICAwIH0sIHsgMTMsICAxLCAgMCB9LCB7LTEzLCAgMSwgIDAgfSwgeyAxNCwgIDEsICAwIH0sIHstMTQsICAxLCAgMCB9LCB7IDE1LCAgMSwgIDAgfSwKKyAgICAgICAgICAgIHstMTUsICAxLCAgMCB9LCB7IDE2LCAgMSwgIDAgfSwgey0xNiwgIDEsICAwIH0sIHsgIDEsICAyLCAgMCB9LCB7IC0xLCAgMiwgIDAgfSwgeyAxNywgIDEsICAwIH0sCisgICAgICAgICAgICB7LTE3LCAgMSwgIDAgfSwgeyAxOCwgIDEsICAwIH0sIHstMTgsICAxLCAgMCB9LCB7IDE5LCAgMSwgIDAgfSwgey0xOSwgIDEsICAwIH0sIHsgMjAsICAxLCAgMCB9LAorICAgICAgICAgICAgey0yMCwgIDEsICAwIH0sIHsgMjEsICAxLCAgMCB9LCB7LTIxLCAgMSwgIDAgfSwgeyAgMiwgIDIsICAwIH0sIHsgLTIsICAyLCAgMCB9LCB7IDIyLCAgMSwgIDAgfSwKKyAgICAgICAgICAgIHstMjIsICAxLCAgMCB9LCB7IDIzLCAgMSwgIDAgfSwgey0yMywgIDEsICAwIH0sIHsgMjQsICAxLCAgMCB9LCB7LTI0LCAgMSwgIDAgfSwgeyAyNSwgIDEsICAwIH0sCisgICAgICAgICAgICB7LTI1LCAgMSwgIDAgfSwgeyAgMywgIDIsICAwIH0sIHsgLTMsICAyLCAgMCB9LCB7IDI2LCAgMSwgIDAgfSwgey0yNiwgIDEsICAwIH0KKyAgICAgICAgfSwKKyAgICAgICAgLy9sZXZlbF9hZGQKKyAgICAgICAgeyAwLCAyNywgNCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgICAgICAyLCAvL2dvbG9tYl9vcmRlcgorICAgICAgICBJTlRfTUFYLCAvL2luY19saW1pdAorICAgICAgICAyLCAvL21heF9ydW4KKyAgICB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRlY18yZHZsYyBpbnRlcl9kZWNbN10gPSB7CisgICAgeworICAgICAgICB7IC8vbGV2ZWwgLyBydW4KKyAgICAgICAgICAgIHsgIDEsICAxLCAgMSB9LCB7IC0xLCAgMSwgIDEgfSwgeyAgMSwgIDIsICAxIH0sIHsgLTEsICAyLCAgMSB9LCB7ICAxLCAgMywgIDEgfSwgeyAtMSwgIDMsICAxIH0sCisgICAgICAgICAgICB7ICAxLCAgNCwgIDEgfSwgeyAtMSwgIDQsICAxIH0sIHsgIDEsICA1LCAgMSB9LCB7IC0xLCAgNSwgIDEgfSwgeyAgMSwgIDYsICAxIH0sIHsgLTEsICA2LCAgMSB9LAorICAgICAgICAgICAgeyAgMSwgIDcsICAxIH0sIHsgLTEsICA3LCAgMSB9LCB7ICAxLCAgOCwgIDEgfSwgeyAtMSwgIDgsICAxIH0sIHsgIDEsICA5LCAgMSB9LCB7IC0xLCAgOSwgIDEgfSwKKyAgICAgICAgICAgIHsgIDEsIDEwLCAgMSB9LCB7IC0xLCAxMCwgIDEgfSwgeyAgMSwgMTEsICAxIH0sIHsgLTEsIDExLCAgMSB9LCB7ICAxLCAxMiwgIDEgfSwgeyAtMSwgMTIsICAxIH0sCisgICAgICAgICAgICB7ICAxLCAxMywgIDEgfSwgeyAtMSwgMTMsICAxIH0sIHsgIDIsICAxLCAgMiB9LCB7IC0yLCAgMSwgIDIgfSwgeyAgMSwgMTQsICAxIH0sIHsgLTEsIDE0LCAgMSB9LAorICAgICAgICAgICAgeyAgMSwgMTUsICAxIH0sIHsgLTEsIDE1LCAgMSB9LCB7ICAxLCAxNiwgIDEgfSwgeyAtMSwgMTYsICAxIH0sIHsgIDEsIDE3LCAgMSB9LCB7IC0xLCAxNywgIDEgfSwKKyAgICAgICAgICAgIHsgIDEsIDE4LCAgMSB9LCB7IC0xLCAxOCwgIDEgfSwgeyAgMSwgMTksICAxIH0sIHsgLTEsIDE5LCAgMSB9LCB7ICAzLCAgMSwgIDMgfSwgeyAtMywgIDEsICAzIH0sCisgICAgICAgICAgICB7ICAxLCAyMCwgIDEgfSwgeyAtMSwgMjAsICAxIH0sIHsgIDEsIDIxLCAgMSB9LCB7IC0xLCAyMSwgIDEgfSwgeyAgMiwgIDIsICAyIH0sIHsgLTIsICAyLCAgMiB9LAorICAgICAgICAgICAgeyAgMSwgMjIsICAxIH0sIHsgLTEsIDIyLCAgMSB9LCB7ICAxLCAyMywgIDEgfSwgeyAtMSwgMjMsICAxIH0sIHsgIDEsIDI0LCAgMSB9LCB7IC0xLCAyNCwgIDEgfSwKKyAgICAgICAgICAgIHsgIDEsIDI1LCAgMSB9LCB7IC0xLCAyNSwgIDEgfSwgeyAgMSwgMjYsICAxIH0sIHsgLTEsIDI2LCAgMSB9LCB7ICAgRU9CICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgLy9sZXZlbF9hZGQKKyAgICAgICAgeyAwLCA0LCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyIH0sCisgICAgICAgIDMsIC8vZ29sb21iX29yZGVyCisgICAgICAgIDAsIC8vaW5jX2xpbWl0CisgICAgICAgIDI2IC8vbWF4X3J1bgorICAgIH0sCisgICAgeworICAgICAgICB7IC8vbGV2ZWwgLyBydW4KKyAgICAgICAgICAgIHsgIDEsICAxLCAgMCB9LCB7IC0xLCAgMSwgIDAgfSwgeyAgICAgRU9CICAgIH0sIHsgIDEsICAyLCAgMCB9LCB7IC0xLCAgMiwgIDAgfSwgeyAgMSwgIDMsICAwIH0sCisgICAgICAgICAgICB7IC0xLCAgMywgIDAgfSwgeyAgMSwgIDQsICAwIH0sIHsgLTEsICA0LCAgMCB9LCB7ICAxLCAgNSwgIDAgfSwgeyAtMSwgIDUsICAwIH0sIHsgIDEsICA2LCAgMCB9LAorICAgICAgICAgICAgeyAtMSwgIDYsICAwIH0sIHsgIDIsICAxLCAgMSB9LCB7IC0yLCAgMSwgIDEgfSwgeyAgMSwgIDcsICAwIH0sIHsgLTEsICA3LCAgMCB9LCB7ICAxLCAgOCwgIDAgfSwKKyAgICAgICAgICAgIHsgLTEsICA4LCAgMCB9LCB7ICAxLCAgOSwgIDAgfSwgeyAtMSwgIDksICAwIH0sIHsgIDEsIDEwLCAgMCB9LCB7IC0xLCAxMCwgIDAgfSwgeyAgMiwgIDIsICAxIH0sCisgICAgICAgICAgICB7IC0yLCAgMiwgIDEgfSwgeyAgMSwgMTEsICAwIH0sIHsgLTEsIDExLCAgMCB9LCB7ICAxLCAxMiwgIDAgfSwgeyAtMSwgMTIsICAwIH0sIHsgIDMsICAxLCAgMiB9LAorICAgICAgICAgICAgeyAtMywgIDEsICAyIH0sIHsgIDEsIDEzLCAgMCB9LCB7IC0xLCAxMywgIDAgfSwgeyAgMSwgMTQsICAwIH0sIHsgLTEsIDE0LCAgMCB9LCB7ICAyLCAgMywgIDEgfSwKKyAgICAgICAgICAgIHsgLTIsICAzLCAgMSB9LCB7ICAxLCAxNSwgIDAgfSwgeyAtMSwgMTUsICAwIH0sIHsgIDIsICA0LCAgMSB9LCB7IC0yLCAgNCwgIDEgfSwgeyAgMSwgMTYsICAwIH0sCisgICAgICAgICAgICB7IC0xLCAxNiwgIDAgfSwgeyAgMiwgIDUsICAxIH0sIHsgLTIsICA1LCAgMSB9LCB7ICAxLCAxNywgIDAgfSwgeyAtMSwgMTcsICAwIH0sIHsgIDQsICAxLCAgMyB9LAorICAgICAgICAgICAgeyAtNCwgIDEsICAzIH0sIHsgIDIsICA2LCAgMSB9LCB7IC0yLCAgNiwgIDEgfSwgeyAgMSwgMTgsICAwIH0sIHsgLTEsIDE4LCAgMCB9LCB7ICAxLCAxOSwgIDAgfSwKKyAgICAgICAgICAgIHsgLTEsIDE5LCAgMCB9LCB7ICAyLCAgNywgIDEgfSwgeyAtMiwgIDcsICAxIH0sIHsgIDMsICAyLCAgMiB9LCB7IC0zLCAgMiwgIDIgfQorICAgICAgICB9LAorICAgICAgICAvL2xldmVsX2FkZAorICAgICAgICB7IDAsIDUsIDQsIDMsIDMsIDMsIDMsIDMsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgICAgIDIsIC8vZ29sb21iX29yZGVyCisgICAgICAgIDEsIC8vaW5jX2xpbWl0CisgICAgICAgIDE5IC8vbWF4X3J1bgorICAgIH0sCisgICAgeworICAgICAgICB7IC8vbGV2ZWwgLyBydW4KKyAgICAgICAgICAgIHsgIDEsICAxLCAgMCB9LCB7IC0xLCAgMSwgIDAgfSwgeyAgICAgRU9CICAgIH0sIHsgIDEsICAyLCAgMCB9LCB7IC0xLCAgMiwgIDAgfSwgeyAgMiwgIDEsICAwIH0sCisgICAgICAgICAgICB7IC0yLCAgMSwgIDAgfSwgeyAgMSwgIDMsICAwIH0sIHsgLTEsICAzLCAgMCB9LCB7ICAxLCAgNCwgIDAgfSwgeyAtMSwgIDQsICAwIH0sIHsgIDMsICAxLCAgMSB9LAorICAgICAgICAgICAgeyAtMywgIDEsICAxIH0sIHsgIDIsICAyLCAgMCB9LCB7IC0yLCAgMiwgIDAgfSwgeyAgMSwgIDUsICAwIH0sIHsgLTEsICA1LCAgMCB9LCB7ICAxLCAgNiwgIDAgfSwKKyAgICAgICAgICAgIHsgLTEsICA2LCAgMCB9LCB7ICAxLCAgNywgIDAgfSwgeyAtMSwgIDcsICAwIH0sIHsgIDIsICAzLCAgMCB9LCB7IC0yLCAgMywgIDAgfSwgeyAgNCwgIDEsICAyIH0sCisgICAgICAgICAgICB7IC00LCAgMSwgIDIgfSwgeyAgMSwgIDgsICAwIH0sIHsgLTEsICA4LCAgMCB9LCB7ICAzLCAgMiwgIDEgfSwgeyAtMywgIDIsICAxIH0sIHsgIDIsICA0LCAgMCB9LAorICAgICAgICAgICAgeyAtMiwgIDQsICAwIH0sIHsgIDEsICA5LCAgMCB9LCB7IC0xLCAgOSwgIDAgfSwgeyAgMSwgMTAsICAwIH0sIHsgLTEsIDEwLCAgMCB9LCB7ICA1LCAgMSwgIDIgfSwKKyAgICAgICAgICAgIHsgLTUsICAxLCAgMiB9LCB7ICAyLCAgNSwgIDAgfSwgeyAtMiwgIDUsICAwIH0sIHsgIDEsIDExLCAgMCB9LCB7IC0xLCAxMSwgIDAgfSwgeyAgMiwgIDYsICAwIH0sCisgICAgICAgICAgICB7IC0yLCAgNiwgIDAgfSwgeyAgMSwgMTIsICAwIH0sIHsgLTEsIDEyLCAgMCB9LCB7ICAzLCAgMywgIDEgfSwgeyAtMywgIDMsICAxIH0sIHsgIDYsICAxLCAgMiB9LAorICAgICAgICAgICAgeyAtNiwgIDEsICAyIH0sIHsgIDQsICAyLCAgMiB9LCB7IC00LCAgMiwgIDIgfSwgeyAgMSwgMTMsICAwIH0sIHsgLTEsIDEzLCAgMCB9LCB7ICAyLCAgNywgIDAgfSwKKyAgICAgICAgICAgIHsgLTIsICA3LCAgMCB9LCB7ICAzLCAgNCwgIDEgfSwgeyAtMywgIDQsICAxIH0sIHsgIDEsIDE0LCAgMCB9LCB7IC0xLCAxNCwgIDAgfQorICAgICAgICB9LAorICAgICAgICAvL2xldmVsX2FkZAorICAgICAgICB7IDAsIDcsIDUsIDQsIDQsIDMsIDMsIDMsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICAgICAgMiwgLy9nb2xvbWJfb3JkZXIKKyAgICAgICAgMiwgLy9pbmNfbGltaXQKKyAgICAgICAgMTQgLy9tYXhfcnVuCisgICAgfSwKKyAgICB7CisgICAgICAgIHsgLy9sZXZlbCAvIHJ1bgorICAgICAgICAgICAgeyAgMSwgIDEsICAwIH0sIHsgLTEsICAxLCAgMCB9LCB7ICAgICBFT0IgICAgfSwgeyAgMiwgIDEsICAwIH0sIHsgLTIsICAxLCAgMCB9LCB7ICAxLCAgMiwgIDAgfSwKKyAgICAgICAgICAgIHsgLTEsICAyLCAgMCB9LCB7ICAzLCAgMSwgIDAgfSwgeyAtMywgIDEsICAwIH0sIHsgIDEsICAzLCAgMCB9LCB7IC0xLCAgMywgIDAgfSwgeyAgMiwgIDIsICAwIH0sCisgICAgICAgICAgICB7IC0yLCAgMiwgIDAgfSwgeyAgNCwgIDEsICAxIH0sIHsgLTQsICAxLCAgMSB9LCB7ICAxLCAgNCwgIDAgfSwgeyAtMSwgIDQsICAwIH0sIHsgIDUsICAxLCAgMSB9LAorICAgICAgICAgICAgeyAtNSwgIDEsICAxIH0sIHsgIDEsICA1LCAgMCB9LCB7IC0xLCAgNSwgIDAgfSwgeyAgMywgIDIsICAwIH0sIHsgLTMsICAyLCAgMCB9LCB7ICAyLCAgMywgIDAgfSwKKyAgICAgICAgICAgIHsgLTIsICAzLCAgMCB9LCB7ICAxLCAgNiwgIDAgfSwgeyAtMSwgIDYsICAwIH0sIHsgIDYsICAxLCAgMSB9LCB7IC02LCAgMSwgIDEgfSwgeyAgMiwgIDQsICAwIH0sCisgICAgICAgICAgICB7IC0yLCAgNCwgIDAgfSwgeyAgMSwgIDcsICAwIH0sIHsgLTEsICA3LCAgMCB9LCB7ICA0LCAgMiwgIDEgfSwgeyAtNCwgIDIsICAxIH0sIHsgIDcsICAxLCAgMiB9LAorICAgICAgICAgICAgeyAtNywgIDEsICAyIH0sIHsgIDMsICAzLCAgMCB9LCB7IC0zLCAgMywgIDAgfSwgeyAgMSwgIDgsICAwIH0sIHsgLTEsICA4LCAgMCB9LCB7ICAyLCAgNSwgIDAgfSwKKyAgICAgICAgICAgIHsgLTIsICA1LCAgMCB9LCB7ICA4LCAgMSwgIDIgfSwgeyAtOCwgIDEsICAyIH0sIHsgIDEsICA5LCAgMCB9LCB7IC0xLCAgOSwgIDAgfSwgeyAgMywgIDQsICAwIH0sCisgICAgICAgICAgICB7IC0zLCAgNCwgIDAgfSwgeyAgMiwgIDYsICAwIH0sIHsgLTIsICA2LCAgMCB9LCB7ICA1LCAgMiwgIDEgfSwgeyAtNSwgIDIsICAxIH0sIHsgIDEsIDEwLCAgMCB9LAorICAgICAgICAgICAgeyAtMSwgMTAsICAwIH0sIHsgIDksICAxLCAgMiB9LCB7IC05LCAgMSwgIDIgfSwgeyAgNCwgIDMsICAxIH0sIHsgLTQsICAzLCAgMSB9CisgICAgICAgIH0sCisgICAgICAgIC8vbGV2ZWxfYWRkCisgICAgICAgIHsgMCwxMCwgNiwgNSwgNCwgMywgMywgMiwgMiwgMiwgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICAgICAgMiwgLy9nb2xvbWJfb3JkZXIKKyAgICAgICAgMywgLy9pbmNfbGltaXQKKyAgICAgICAgMTAgLy9tYXhfcnVuCisgICAgfSwKKyAgICB7CisgICAgICAgIHsgLy9sZXZlbCAvIHJ1bgorICAgICAgICAgICAgeyAgMSwgIDEsICAwIH0sIHsgLTEsICAxLCAgMCB9LCB7ICAgICBFT0IgICAgfSwgeyAgMiwgIDEsICAwIH0sIHsgLTIsICAxLCAgMCB9LCB7ICAzLCAgMSwgIDAgfSwKKyAgICAgICAgICAgIHsgLTMsICAxLCAgMCB9LCB7ICAxLCAgMiwgIDAgfSwgeyAtMSwgIDIsICAwIH0sIHsgIDQsICAxLCAgMCB9LCB7IC00LCAgMSwgIDAgfSwgeyAgNSwgIDEsICAwIH0sCisgICAgICAgICAgICB7IC01LCAgMSwgIDAgfSwgeyAgMiwgIDIsICAwIH0sIHsgLTIsICAyLCAgMCB9LCB7ICAxLCAgMywgIDAgfSwgeyAtMSwgIDMsICAwIH0sIHsgIDYsICAxLCAgMCB9LAorICAgICAgICAgICAgeyAtNiwgIDEsICAwIH0sIHsgIDMsICAyLCAgMCB9LCB7IC0zLCAgMiwgIDAgfSwgeyAgNywgIDEsICAxIH0sIHsgLTcsICAxLCAgMSB9LCB7ICAxLCAgNCwgIDAgfSwKKyAgICAgICAgICAgIHsgLTEsICA0LCAgMCB9LCB7ICA4LCAgMSwgIDEgfSwgeyAtOCwgIDEsICAxIH0sIHsgIDIsICAzLCAgMCB9LCB7IC0yLCAgMywgIDAgfSwgeyAgNCwgIDIsICAwIH0sCisgICAgICAgICAgICB7IC00LCAgMiwgIDAgfSwgeyAgMSwgIDUsICAwIH0sIHsgLTEsICA1LCAgMCB9LCB7ICA5LCAgMSwgIDEgfSwgeyAtOSwgIDEsICAxIH0sIHsgIDUsICAyLCAgMCB9LAorICAgICAgICAgICAgeyAtNSwgIDIsICAwIH0sIHsgIDIsICA0LCAgMCB9LCB7IC0yLCAgNCwgIDAgfSwgeyAgMSwgIDYsICAwIH0sIHsgLTEsICA2LCAgMCB9LCB7IDEwLCAgMSwgIDIgfSwKKyAgICAgICAgICAgIHstMTAsICAxLCAgMiB9LCB7ICAzLCAgMywgIDAgfSwgeyAtMywgIDMsICAwIH0sIHsgMTEsICAxLCAgMiB9LCB7LTExLCAgMSwgIDIgfSwgeyAgMSwgIDcsICAwIH0sCisgICAgICAgICAgICB7IC0xLCAgNywgIDAgfSwgeyAgNiwgIDIsICAwIH0sIHsgLTYsICAyLCAgMCB9LCB7ICAzLCAgNCwgIDAgfSwgeyAtMywgIDQsICAwIH0sIHsgIDIsICA1LCAgMCB9LAorICAgICAgICAgICAgeyAtMiwgIDUsICAwIH0sIHsgMTIsICAxLCAgMiB9LCB7LTEyLCAgMSwgIDIgfSwgeyAgNCwgIDMsICAwIH0sIHsgLTQsICAzLCAgMCB9CisgICAgICAgIH0sCisgICAgICAgIC8vbGV2ZWxfYWRkCisgICAgICAgIHsgMCwgMTMsIDcsIDUsIDQsIDMsIDIsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgICAgIDIsIC8vZ29sb21iX29yZGVyCisgICAgICAgIDYsIC8vaW5jX2xpbWl0CisgICAgICAgIDcgIC8vbWF4X3J1bgorICAgIH0sCisgICAgeworICAgICAgICB7IC8vbGV2ZWwgLyBydW4KKyAgICAgICAgICAgIHsgICAgICBFT0IgICAgfSwgeyAgMSwgIDEsICAwIH0sIHsgIC0xLCAgMSwgIDAgfSwgeyAgMiwgIDEsICAwIH0sIHsgIC0yLCAgMSwgIDAgfSwgeyAgMywgIDEsICAwIH0sCisgICAgICAgICAgICB7ICAtMywgIDEsICAwIH0sIHsgIDQsICAxLCAgMCB9LCB7ICAtNCwgIDEsICAwIH0sIHsgIDUsICAxLCAgMCB9LCB7ICAtNSwgIDEsICAwIH0sIHsgIDEsICAyLCAgMCB9LAorICAgICAgICAgICAgeyAgLTEsICAyLCAgMCB9LCB7ICA2LCAgMSwgIDAgfSwgeyAgLTYsICAxLCAgMCB9LCB7ICA3LCAgMSwgIDAgfSwgeyAgLTcsICAxLCAgMCB9LCB7ICA4LCAgMSwgIDAgfSwKKyAgICAgICAgICAgIHsgIC04LCAgMSwgIDAgfSwgeyAgMiwgIDIsICAwIH0sIHsgIC0yLCAgMiwgIDAgfSwgeyAgOSwgIDEsICAwIH0sIHsgIC05LCAgMSwgIDAgfSwgeyAgMSwgIDMsICAwIH0sCisgICAgICAgICAgICB7ICAtMSwgIDMsICAwIH0sIHsgMTAsICAxLCAgMSB9LCB7IC0xMCwgIDEsICAxIH0sIHsgIDMsICAyLCAgMCB9LCB7ICAtMywgIDIsICAwIH0sIHsgMTEsICAxLCAgMSB9LAorICAgICAgICAgICAgeyAtMTEsICAxLCAgMSB9LCB7ICA0LCAgMiwgIDAgfSwgeyAgLTQsICAyLCAgMCB9LCB7IDEyLCAgMSwgIDEgfSwgeyAtMTIsICAxLCAgMSB9LCB7ICAxLCAgNCwgIDAgfSwKKyAgICAgICAgICAgIHsgIC0xLCAgNCwgIDAgfSwgeyAgMiwgIDMsICAwIH0sIHsgIC0yLCAgMywgIDAgfSwgeyAxMywgIDEsICAxIH0sIHsgLTEzLCAgMSwgIDEgfSwgeyAgNSwgIDIsICAwIH0sCisgICAgICAgICAgICB7ICAtNSwgIDIsICAwIH0sIHsgMTQsICAxLCAgMSB9LCB7IC0xNCwgIDEsICAxIH0sIHsgIDYsICAyLCAgMCB9LCB7ICAtNiwgIDIsICAwIH0sIHsgIDEsICA1LCAgMCB9LAorICAgICAgICAgICAgeyAgLTEsICA1LCAgMCB9LCB7IDE1LCAgMSwgIDEgfSwgeyAtMTUsICAxLCAgMSB9LCB7ICAzLCAgMywgIDAgfSwgeyAgLTMsICAzLCAgMCB9LCB7IDE2LCAgMSwgIDEgfSwKKyAgICAgICAgICAgIHsgLTE2LCAgMSwgIDEgfSwgeyAgMiwgIDQsICAwIH0sIHsgIC0yLCAgNCwgIDAgfSwgeyAgNywgIDIsICAwIH0sIHsgIC03LCAgMiwgIDAgfQorICAgICAgICB9LAorICAgICAgICAvL2xldmVsX2FkZAorICAgICAgICB7IDAsIDE3LCA4LCA0LCAzLCAyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgICAgIDIsIC8vZ29sb21iX29yZGVyCisgICAgICAgIDksIC8vaW5jX2xpbWl0CisgICAgICAgIDUgIC8vbWF4X3J1bgorICAgIH0sCisgICAgeworICAgICAgICB7IC8vbGV2ZWwgLyBydW4KKyAgICAgICAgICAgIHsgICAgICBFT0IgICAgfSwgeyAgMSwgIDEsICAwIH0sIHsgIC0xLCAgMSwgIDAgfSwgeyAgMiwgIDEsICAwIH0sIHsgIC0yLCAgMSwgIDAgfSwgeyAgIDMsICAxLCAgMCB9LAorICAgICAgICAgICAgeyAgLTMsICAxLCAgMCB9LCB7ICA0LCAgMSwgIDAgfSwgeyAgLTQsICAxLCAgMCB9LCB7ICA1LCAgMSwgIDAgfSwgeyAgLTUsICAxLCAgMCB9LCB7ICAgNiwgIDEsICAwIH0sCisgICAgICAgICAgICB7ICAtNiwgIDEsICAwIH0sIHsgIDcsICAxLCAgMCB9LCB7ICAtNywgIDEsICAwIH0sIHsgIDEsICAyLCAgMCB9LCB7ICAtMSwgIDIsICAwIH0sIHsgICA4LCAgMSwgIDAgfSwKKyAgICAgICAgICAgIHsgIC04LCAgMSwgIDAgfSwgeyAgOSwgIDEsICAwIH0sIHsgIC05LCAgMSwgIDAgfSwgeyAxMCwgIDEsICAwIH0sIHsgLTEwLCAgMSwgIDAgfSwgeyAgMTEsICAxLCAgMCB9LAorICAgICAgICAgICAgeyAtMTEsICAxLCAgMCB9LCB7IDEyLCAgMSwgIDAgfSwgeyAtMTIsICAxLCAgMCB9LCB7ICAyLCAgMiwgIDAgfSwgeyAgLTIsICAyLCAgMCB9LCB7ICAxMywgIDEsICAwIH0sCisgICAgICAgICAgICB7IC0xMywgIDEsICAwIH0sIHsgIDEsICAzLCAgMCB9LCB7ICAtMSwgIDMsICAwIH0sIHsgMTQsICAxLCAgMCB9LCB7IC0xNCwgIDEsICAwIH0sIHsgIDE1LCAgMSwgIDAgfSwKKyAgICAgICAgICAgIHsgLTE1LCAgMSwgIDAgfSwgeyAgMywgIDIsICAwIH0sIHsgIC0zLCAgMiwgIDAgfSwgeyAxNiwgIDEsICAwIH0sIHsgLTE2LCAgMSwgIDAgfSwgeyAgMTcsICAxLCAgMCB9LAorICAgICAgICAgICAgeyAtMTcsICAxLCAgMCB9LCB7IDE4LCAgMSwgIDAgfSwgeyAtMTgsICAxLCAgMCB9LCB7ICA0LCAgMiwgIDAgfSwgeyAgLTQsICAyLCAgMCB9LCB7ICAxOSwgIDEsICAwIH0sCisgICAgICAgICAgICB7IC0xOSwgIDEsICAwIH0sIHsgMjAsICAxLCAgMCB9LCB7IC0yMCwgIDEsICAwIH0sIHsgIDIsICAzLCAgMCB9LCB7ICAtMiwgIDMsICAwIH0sIHsgICAxLCAgNCwgIDAgfSwKKyAgICAgICAgICAgIHsgIC0xLCAgNCwgIDAgfSwgeyAgNSwgIDIsICAwIH0sIHsgIC01LCAgMiwgIDAgfSwgeyAyMSwgIDEsICAwIH0sIHsgLTIxLCAgMSwgIDAgfQorICAgICAgICB9LAorICAgICAgICAvL2xldmVsX2FkZAorICAgICAgICB7IDAsIDIyLCA2LCAzLCAyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgICAgICAyLCAvL2dvbG9tYl9vcmRlcgorICAgICAgICBJTlRfTUFYLCAvL2luY19saW1pdAorICAgICAgICA0IC8vbWF4X3J1bgorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGVjXzJkdmxjIGNocm9tYV9kZWNbNV0gPSB7CisgICAgeworICAgICAgICB7IC8vbGV2ZWwgLyBydW4KKyAgICAgICAgICAgIHsgIDEsICAxLCAgMSB9LCB7IC0xLCAgMSwgIDEgfSwgeyAgMSwgIDIsICAxIH0sIHsgLTEsICAyLCAgMSB9LCB7ICAxLCAgMywgIDEgfSwgeyAtMSwgIDMsICAxIH0sCisgICAgICAgICAgICB7ICAxLCAgNCwgIDEgfSwgeyAtMSwgIDQsICAxIH0sIHsgIDEsICA1LCAgMSB9LCB7IC0xLCAgNSwgIDEgfSwgeyAgMSwgIDYsICAxIH0sIHsgLTEsICA2LCAgMSB9LAorICAgICAgICAgICAgeyAgMSwgIDcsICAxIH0sIHsgLTEsICA3LCAgMSB9LCB7ICAyLCAgMSwgIDIgfSwgeyAtMiwgIDEsICAyIH0sIHsgIDEsICA4LCAgMSB9LCB7IC0xLCAgOCwgIDEgfSwKKyAgICAgICAgICAgIHsgIDEsICA5LCAgMSB9LCB7IC0xLCAgOSwgIDEgfSwgeyAgMSwgMTAsICAxIH0sIHsgLTEsIDEwLCAgMSB9LCB7ICAxLCAxMSwgIDEgfSwgeyAtMSwgMTEsICAxIH0sCisgICAgICAgICAgICB7ICAxLCAxMiwgIDEgfSwgeyAtMSwgMTIsICAxIH0sIHsgIDEsIDEzLCAgMSB9LCB7IC0xLCAxMywgIDEgfSwgeyAgMSwgMTQsICAxIH0sIHsgLTEsIDE0LCAgMSB9LAorICAgICAgICAgICAgeyAgMSwgMTUsICAxIH0sIHsgLTEsIDE1LCAgMSB9LCB7ICAzLCAgMSwgIDMgfSwgeyAtMywgIDEsICAzIH0sIHsgIDEsIDE2LCAgMSB9LCB7IC0xLCAxNiwgIDEgfSwKKyAgICAgICAgICAgIHsgIDEsIDE3LCAgMSB9LCB7IC0xLCAxNywgIDEgfSwgeyAgMSwgMTgsICAxIH0sIHsgLTEsIDE4LCAgMSB9LCB7ICAxLCAxOSwgIDEgfSwgeyAtMSwgMTksICAxIH0sCisgICAgICAgICAgICB7ICAxLCAyMCwgIDEgfSwgeyAtMSwgMjAsICAxIH0sIHsgIDEsIDIxLCAgMSB9LCB7IC0xLCAyMSwgIDEgfSwgeyAgMSwgMjIsICAxIH0sIHsgLTEsIDIyLCAgMSB9LAorICAgICAgICAgICAgeyAgMiwgIDIsICAyIH0sIHsgLTIsICAyLCAgMiB9LCB7ICAxLCAyMywgIDEgfSwgeyAtMSwgMjMsICAxIH0sIHsgIDEsIDI0LCAgMSB9LCB7IC0xLCAyNCwgIDEgfSwKKyAgICAgICAgICAgIHsgIDEsIDI1LCAgMSB9LCB7IC0xLCAyNSwgIDEgfSwgeyAgNCwgIDEsICAzIH0sIHsgLTQsICAxLCAgMyB9LCB7ICAgRU9CICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgLy9sZXZlbF9hZGQKKyAgICAgICAgeyAwLCA1LCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAtMSB9LAorICAgICAgICAyLCAvL2dvbG9tYl9vcmRlcgorICAgICAgICAwLCAvL2luY19saW1pdAorICAgICAgICAyNSAvL21heF9ydW4KKyAgICB9LAorICAgIHsKKyAgICAgICAgeyAvL2xldmVsIC8gcnVuCisgICAgICAgICAgICB7ICAgICBFT0IgICAgfSwgeyAgMSwgIDEsICAwIH0sIHsgLTEsICAxLCAgMCB9LCB7ICAxLCAgMiwgIDAgfSwgeyAtMSwgIDIsICAwIH0sIHsgIDIsICAxLCAgMSB9LAorICAgICAgICAgICAgeyAtMiwgIDEsICAxIH0sIHsgIDEsICAzLCAgMCB9LCB7IC0xLCAgMywgIDAgfSwgeyAgMSwgIDQsICAwIH0sIHsgLTEsICA0LCAgMCB9LCB7ICAxLCAgNSwgIDAgfSwKKyAgICAgICAgICAgIHsgLTEsICA1LCAgMCB9LCB7ICAxLCAgNiwgIDAgfSwgeyAtMSwgIDYsICAwIH0sIHsgIDMsICAxLCAgMiB9LCB7IC0zLCAgMSwgIDIgfSwgeyAgMSwgIDcsICAwIH0sCisgICAgICAgICAgICB7IC0xLCAgNywgIDAgfSwgeyAgMSwgIDgsICAwIH0sIHsgLTEsICA4LCAgMCB9LCB7ICAyLCAgMiwgIDEgfSwgeyAtMiwgIDIsICAxIH0sIHsgIDEsICA5LCAgMCB9LAorICAgICAgICAgICAgeyAtMSwgIDksICAwIH0sIHsgIDEsIDEwLCAgMCB9LCB7IC0xLCAxMCwgIDAgfSwgeyAgMSwgMTEsICAwIH0sIHsgLTEsIDExLCAgMCB9LCB7ICA0LCAgMSwgIDIgfSwKKyAgICAgICAgICAgIHsgLTQsICAxLCAgMiB9LCB7ICAxLCAxMiwgIDAgfSwgeyAtMSwgMTIsICAwIH0sIHsgIDEsIDEzLCAgMCB9LCB7IC0xLCAxMywgIDAgfSwgeyAgMSwgMTQsICAwIH0sCisgICAgICAgICAgICB7IC0xLCAxNCwgIDAgfSwgeyAgMiwgIDMsICAxIH0sIHsgLTIsICAzLCAgMSB9LCB7ICAxLCAxNSwgIDAgfSwgeyAtMSwgMTUsICAwIH0sIHsgIDIsICA0LCAgMSB9LAorICAgICAgICAgICAgeyAtMiwgIDQsICAxIH0sIHsgIDUsICAxLCAgMyB9LCB7IC01LCAgMSwgIDMgfSwgeyAgMywgIDIsICAyIH0sIHsgLTMsICAyLCAgMiB9LCB7ICAxLCAxNiwgIDAgfSwKKyAgICAgICAgICAgIHsgLTEsIDE2LCAgMCB9LCB7ICAxLCAxNywgIDAgfSwgeyAtMSwgMTcsICAwIH0sIHsgIDEsIDE4LCAgMCB9LCB7IC0xLCAxOCwgIDAgfSwgeyAgMiwgIDUsICAxIH0sCisgICAgICAgICAgICB7IC0yLCAgNSwgIDEgfSwgeyAgMSwgMTksICAwIH0sIHsgLTEsIDE5LCAgMCB9LCB7ICAxLCAyMCwgIDAgfSwgeyAtMSwgMjAsICAwIH0KKyAgICAgICAgfSwKKyAgICAgICAgLy9sZXZlbF9hZGQKKyAgICAgICAgeyAwLCA2LCA0LCAzLCAzLCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgICAgIDAsIC8vZ29sb21iX29yZGVyCisgICAgICAgIDEsIC8vaW5jX2xpbWl0CisgICAgICAgIDIwIC8vbWF4X3J1bgorICAgIH0sCisgICAgeworICAgICAgICB7IC8vbGV2ZWwgLyBydW4KKyAgICAgICAgICAgIHsgIDEsICAxLCAgMCB9LCB7IC0xLCAgMSwgIDAgfSwgeyAgICAgRU9CICAgIH0sIHsgIDIsICAxLCAgMCB9LCB7IC0yLCAgMSwgIDAgfSwgeyAgMSwgIDIsICAwIH0sCisgICAgICAgICAgICB7IC0xLCAgMiwgIDAgfSwgeyAgMywgIDEsICAxIH0sIHsgLTMsICAxLCAgMSB9LCB7ICAxLCAgMywgIDAgfSwgeyAtMSwgIDMsICAwIH0sIHsgIDQsICAxLCAgMSB9LAorICAgICAgICAgICAgeyAtNCwgIDEsICAxIH0sIHsgIDIsICAyLCAgMCB9LCB7IC0yLCAgMiwgIDAgfSwgeyAgMSwgIDQsICAwIH0sIHsgLTEsICA0LCAgMCB9LCB7ICA1LCAgMSwgIDIgfSwKKyAgICAgICAgICAgIHsgLTUsICAxLCAgMiB9LCB7ICAxLCAgNSwgIDAgfSwgeyAtMSwgIDUsICAwIH0sIHsgIDMsICAyLCAgMSB9LCB7IC0zLCAgMiwgIDEgfSwgeyAgMiwgIDMsICAwIH0sCisgICAgICAgICAgICB7IC0yLCAgMywgIDAgfSwgeyAgMSwgIDYsICAwIH0sIHsgLTEsICA2LCAgMCB9LCB7ICA2LCAgMSwgIDIgfSwgeyAtNiwgIDEsICAyIH0sIHsgIDEsICA3LCAgMCB9LAorICAgICAgICAgICAgeyAtMSwgIDcsICAwIH0sIHsgIDIsICA0LCAgMCB9LCB7IC0yLCAgNCwgIDAgfSwgeyAgNywgIDEsICAyIH0sIHsgLTcsICAxLCAgMiB9LCB7ICAxLCAgOCwgIDAgfSwKKyAgICAgICAgICAgIHsgLTEsICA4LCAgMCB9LCB7ICA0LCAgMiwgIDEgfSwgeyAtNCwgIDIsICAxIH0sIHsgIDEsICA5LCAgMCB9LCB7IC0xLCAgOSwgIDAgfSwgeyAgMywgIDMsICAxIH0sCisgICAgICAgICAgICB7IC0zLCAgMywgIDEgfSwgeyAgMiwgIDUsICAwIH0sIHsgLTIsICA1LCAgMCB9LCB7ICAyLCAgNiwgIDAgfSwgeyAtMiwgIDYsICAwIH0sIHsgIDgsICAxLCAgMiB9LAorICAgICAgICAgICAgeyAtOCwgIDEsICAyIH0sIHsgIDEsIDEwLCAgMCB9LCB7IC0xLCAxMCwgIDAgfSwgeyAgMSwgMTEsICAwIH0sIHsgLTEsIDExLCAgMCB9LCB7ICA5LCAgMSwgIDIgfSwKKyAgICAgICAgICAgIHsgLTksICAxLCAgMiB9LCB7ICA1LCAgMiwgIDIgfSwgeyAtNSwgIDIsICAyIH0sIHsgIDMsICA0LCAgMSB9LCB7IC0zLCAgNCwgIDEgfSwKKyAgICAgICAgfSwKKyAgICAgICAgLy9sZXZlbF9hZGQKKyAgICAgICAgeyAwLDEwLCA2LCA0LCA0LCAzLCAzLCAyLCAyLCAyLCAyLCAyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgICAgIDEsIC8vZ29sb21iX29yZGVyCisgICAgICAgIDIsIC8vaW5jX2xpbWl0CisgICAgICAgIDExIC8vbWF4X3J1bgorICAgIH0sCisgICAgeworICAgICAgICB7IC8vbGV2ZWwgLyBydW4KKyAgICAgICAgICAgIHsgICAgIEVPQiAgICB9LCB7ICAxLCAgMSwgIDAgfSwgeyAtMSwgIDEsICAwIH0sIHsgIDIsICAxLCAgMCB9LCB7IC0yLCAgMSwgIDAgfSwgeyAgMywgIDEsICAwIH0sCisgICAgICAgICAgICB7IC0zLCAgMSwgIDAgfSwgeyAgNCwgIDEsICAwIH0sIHsgLTQsICAxLCAgMCB9LCB7ICAxLCAgMiwgIDAgfSwgeyAtMSwgIDIsICAwIH0sIHsgIDUsICAxLCAgMSB9LAorICAgICAgICAgICAgeyAtNSwgIDEsICAxIH0sIHsgIDIsICAyLCAgMCB9LCB7IC0yLCAgMiwgIDAgfSwgeyAgNiwgIDEsICAxIH0sIHsgLTYsICAxLCAgMSB9LCB7ICAxLCAgMywgIDAgfSwKKyAgICAgICAgICAgIHsgLTEsICAzLCAgMCB9LCB7ICA3LCAgMSwgIDEgfSwgeyAtNywgIDEsICAxIH0sIHsgIDMsICAyLCAgMCB9LCB7IC0zLCAgMiwgIDAgfSwgeyAgOCwgIDEsICAxIH0sCisgICAgICAgICAgICB7IC04LCAgMSwgIDEgfSwgeyAgMSwgIDQsICAwIH0sIHsgLTEsICA0LCAgMCB9LCB7ICAyLCAgMywgIDAgfSwgeyAtMiwgIDMsICAwIH0sIHsgIDksICAxLCAgMSB9LAorICAgICAgICAgICAgeyAtOSwgIDEsICAxIH0sIHsgIDQsICAyLCAgMCB9LCB7IC00LCAgMiwgIDAgfSwgeyAgMSwgIDUsICAwIH0sIHsgLTEsICA1LCAgMCB9LCB7IDEwLCAgMSwgIDEgfSwKKyAgICAgICAgICAgIHstMTAsICAxLCAgMSB9LCB7ICAzLCAgMywgIDAgfSwgeyAtMywgIDMsICAwIH0sIHsgIDUsICAyLCAgMSB9LCB7IC01LCAgMiwgIDEgfSwgeyAgMiwgIDQsICAwIH0sCisgICAgICAgICAgICB7IC0yLCAgNCwgIDAgfSwgeyAxMSwgIDEsICAxIH0sIHstMTEsICAxLCAgMSB9LCB7ICAxLCAgNiwgIDAgfSwgeyAtMSwgIDYsICAwIH0sIHsgMTIsICAxLCAgMSB9LAorICAgICAgICAgICAgey0xMiwgIDEsICAxIH0sIHsgIDEsICA3LCAgMCB9LCB7IC0xLCAgNywgIDAgfSwgeyAgNiwgIDIsICAxIH0sIHsgLTYsICAyLCAgMSB9LCB7IDEzLCAgMSwgIDEgfSwKKyAgICAgICAgICAgIHstMTMsICAxLCAgMSB9LCB7ICAyLCAgNSwgIDAgfSwgeyAtMiwgIDUsICAwIH0sIHsgIDEsICA4LCAgMCB9LCB7IC0xLCAgOCwgIDAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgLy9sZXZlbF9hZGQKKyAgICAgICAgeyAwLCAxNCwgNywgNCwgMywgMywgMiwgMiwgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgICAgICAxLCAvL2dvbG9tYl9vcmRlcgorICAgICAgICA0LCAvL2luY19saW1pdAorICAgICAgICA4ICAvL21heF9ydW4KKyAgICB9LAorICAgIHsKKyAgICAgICAgeyAvL2xldmVsIC8gcnVuCisgICAgICAgICAgICB7ICAgICAgRU9CICAgIH0sIHsgIDEsICAxLCAgMCB9LCB7ICAtMSwgIDEsICAwIH0sIHsgIDIsICAxLCAgMCB9LCB7ICAtMiwgIDEsICAwIH0sIHsgIDMsICAxLCAgMCB9LAorICAgICAgICAgICAgeyAgLTMsICAxLCAgMCB9LCB7ICA0LCAgMSwgIDAgfSwgeyAgLTQsICAxLCAgMCB9LCB7ICA1LCAgMSwgIDAgfSwgeyAgLTUsICAxLCAgMCB9LCB7ICA2LCAgMSwgIDAgfSwKKyAgICAgICAgICAgIHsgIC02LCAgMSwgIDAgfSwgeyAgNywgIDEsICAwIH0sIHsgIC03LCAgMSwgIDAgfSwgeyAgOCwgIDEsICAwIH0sIHsgIC04LCAgMSwgIDAgfSwgeyAgMSwgIDIsICAwIH0sCisgICAgICAgICAgICB7ICAtMSwgIDIsICAwIH0sIHsgIDksICAxLCAgMCB9LCB7ICAtOSwgIDEsICAwIH0sIHsgMTAsICAxLCAgMCB9LCB7IC0xMCwgIDEsICAwIH0sIHsgMTEsICAxLCAgMCB9LAorICAgICAgICAgICAgeyAtMTEsICAxLCAgMCB9LCB7ICAyLCAgMiwgIDAgfSwgeyAgLTIsICAyLCAgMCB9LCB7IDEyLCAgMSwgIDAgfSwgeyAtMTIsICAxLCAgMCB9LCB7IDEzLCAgMSwgIDAgfSwKKyAgICAgICAgICAgIHsgLTEzLCAgMSwgIDAgfSwgeyAgMywgIDIsICAwIH0sIHsgIC0zLCAgMiwgIDAgfSwgeyAxNCwgIDEsICAwIH0sIHsgLTE0LCAgMSwgIDAgfSwgeyAgMSwgIDMsICAwIH0sCisgICAgICAgICAgICB7ICAtMSwgIDMsICAwIH0sIHsgMTUsICAxLCAgMCB9LCB7IC0xNSwgIDEsICAwIH0sIHsgIDQsICAyLCAgMCB9LCB7ICAtNCwgIDIsICAwIH0sIHsgMTYsICAxLCAgMCB9LAorICAgICAgICAgICAgeyAtMTYsICAxLCAgMCB9LCB7IDE3LCAgMSwgIDAgfSwgeyAtMTcsICAxLCAgMCB9LCB7ICA1LCAgMiwgIDAgfSwgeyAgLTUsICAyLCAgMCB9LCB7ICAxLCAgNCwgIDAgfSwKKyAgICAgICAgICAgIHsgIC0xLCAgNCwgIDAgfSwgeyAgMiwgIDMsICAwIH0sIHsgIC0yLCAgMywgIDAgfSwgeyAxOCwgIDEsICAwIH0sIHsgLTE4LCAgMSwgIDAgfSwgeyAgNiwgIDIsICAwIH0sCisgICAgICAgICAgICB7ICAtNiwgIDIsICAwIH0sIHsgMTksICAxLCAgMCB9LCB7IC0xOSwgIDEsICAwIH0sIHsgIDEsICA1LCAgMCB9LCB7ICAtMSwgIDUsICAwIH0sCisgICAgICAgIH0sCisgICAgICAgIC8vbGV2ZWxfYWRkCisgICAgICAgIHsgMCwgMjAsIDcsIDMsIDIsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICAgICAgMCwgLy9nb2xvbWJfb3JkZXIKKyAgICAgICAgSU5UX01BWCwgLy9pbmNfbGltaXQKKyAgICAgICAgNSwgLy9tYXhfcnVuCisgICAgfQorfTsKKworI3VuZGVmIEVPQgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlX212cyhBVlNDb250ZXh0ICpoKQoreworICAgIGgtPmNvbF9tdltoLT5tYmlkeCAqIDQgKyAwXSA9IGgtPm12W01WX0ZXRF9YMF07CisgICAgaC0+Y29sX212W2gtPm1iaWR4ICogNCArIDFdID0gaC0+bXZbTVZfRldEX1gxXTsKKyAgICBoLT5jb2xfbXZbaC0+bWJpZHggKiA0ICsgMl0gPSBoLT5tdltNVl9GV0RfWDJdOworICAgIGgtPmNvbF9tdltoLT5tYmlkeCAqIDQgKyAzXSA9IGgtPm12W01WX0ZXRF9YM107Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdl9wcmVkX2RpcmVjdChBVlNDb250ZXh0ICpoLCBjYXZzX3ZlY3RvciAqcG12X2Z3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdnNfdmVjdG9yICpjb2xfbXYpCit7CisgICAgY2F2c192ZWN0b3IgKnBtdl9idyA9IHBtdl9mdyArIE1WX0JXRF9PRkZTOworICAgIGludCBkZW4gPSBoLT5kaXJlY3RfZGVuW2NvbF9tdi0+cmVmXTsKKyAgICBpbnQgbSA9IEZGX1NJR05CSVQoY29sX212LT54KTsKKworICAgIHBtdl9mdy0+ZGlzdCA9IGgtPmRpc3RbMV07CisgICAgcG12X2J3LT5kaXN0ID0gaC0+ZGlzdFswXTsKKyAgICBwbXZfZnctPnJlZiA9IDE7CisgICAgcG12X2J3LT5yZWYgPSAwOworICAgIC8qIHNjYWxlIHRoZSBjby1sb2NhdGVkIG1vdGlvbiB2ZWN0b3IgYWNjb3JkaW5nIHRvIGl0cyB0ZW1wb3JhbCBzcGFuICovCisgICAgcG12X2Z3LT54ID0gICAgICgoKGRlbiArIChkZW4gKiBjb2xfbXYtPnggKiBwbXZfZnctPmRpc3QgXiBtKSAtIG0gLSAxKSA+PiAxNCkgXiBtKSAtIG07CisgICAgcG12X2J3LT54ID0gbSAtICgoKGRlbiArIChkZW4gKiBjb2xfbXYtPnggKiBwbXZfYnctPmRpc3QgXiBtKSAtIG0gLSAxKSA+PiAxNCkgXiBtKTsKKyAgICBtID0gRkZfU0lHTkJJVChjb2xfbXYtPnkpOworICAgIHBtdl9mdy0+eSA9ICAgICAoKChkZW4gKyAoZGVuICogY29sX212LT55ICogcG12X2Z3LT5kaXN0IF4gbSkgLSBtIC0gMSkgPj4gMTQpIF4gbSkgLSBtOworICAgIHBtdl9idy0+eSA9IG0gLSAoKChkZW4gKyAoZGVuICogY29sX212LT55ICogcG12X2J3LT5kaXN0IF4gbSkgLSBtIC0gMSkgPj4gMTQpIF4gbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdl9wcmVkX3N5bShBVlNDb250ZXh0ICpoLCBjYXZzX3ZlY3RvciAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gY2F2c19ibG9jayBzaXplKQoreworICAgIGNhdnNfdmVjdG9yICpkc3QgPSBzcmMgKyBNVl9CV0RfT0ZGUzsKKworICAgIC8qIGJhY2t3YXJkIG12IGlzIHRoZSBzY2FsZWQgYW5kIG5lZ2F0ZWQgZm9yd2FyZCBtdiAqLworICAgIGRzdC0+eCA9IC0oKHNyYy0+eCAqIGgtPnN5bV9mYWN0b3IgKyAyNTYpID4+IDkpOworICAgIGRzdC0+eSA9IC0oKHNyYy0+eSAqIGgtPnN5bV9mYWN0b3IgKyAyNTYpID4+IDkpOworICAgIGRzdC0+cmVmID0gMDsKKyAgICBkc3QtPmRpc3QgPSBoLT5kaXN0WzBdOworICAgIHNldF9tdnMoZHN0LCBzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcmVzaWR1YWwgZGF0YSBkZWNvZGluZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioga3RoLW9yZGVyIGV4cG9uZW50aWFsIGdvbG9tYiBjb2RlICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfdWVfY29kZShHZXRCaXRDb250ZXh0ICpnYiwgaW50IG9yZGVyKQoreworICAgIHVuc2lnbmVkIHJldCA9IGdldF91ZV9nb2xvbWIoZ2IpOworICAgIGlmIChyZXQgPj0gKCgxVTw8MzEpPj5vcmRlcikpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImdldF91ZV9jb2RlOiB2YWx1ZSB0b28gbGFyZ2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChvcmRlcikgeworICAgICAgICByZXR1cm4gKHJldDw8b3JkZXIpICsgZ2V0X2JpdHMoZ2IsIG9yZGVyKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVxdWFudChBVlNDb250ZXh0ICpoLCBpbnQxNl90ICpsZXZlbF9idWYsIHVpbnQ4X3QgKnJ1bl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRzdCwgaW50IG11bCwgaW50IHNoaWZ0LCBpbnQgY29lZmZfbnVtKQoreworICAgIGludCByb3VuZCA9IDEgPDwgKHNoaWZ0IC0gMSk7CisgICAgaW50IHBvcyA9IC0xOworICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW50YWIgPSBoLT5zY2FudGFibGUucGVybXV0YXRlZDsKKworICAgIC8qIGludmVyc2Ugc2NhbiBhbmQgZGVxdWFudGl6YXRpb24gKi8KKyAgICB3aGlsZSAoLS1jb2VmZl9udW0gPj0gMCkgeworICAgICAgICBwb3MgKz0gcnVuX2J1Zltjb2VmZl9udW1dOworICAgICAgICBpZiAocG9zID4gNjMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiBvdXQgb2YgYmxvY2sgYm91bmRzIGF0IHBpYyAlZCBNQiglZCwlZClcbiIsCisgICAgICAgICAgICAgICAgICAgaC0+Y3VyLnBvYywgaC0+bWJ4LCBoLT5tYnkpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgZHN0W3NjYW50YWJbcG9zXV0gPSAobGV2ZWxfYnVmW2NvZWZmX251bV0gKiBtdWwgKyByb3VuZCkgPj4gc2hpZnQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIGRlY29kZSBjb2VmZmljaWVudHMgZnJvbSBvbmUgOHg4IGJsb2NrLCBkZXF1YW50aXplLCBpbnZlcnNlIHRyYW5zZm9ybQorICogIGFuZCBhZGQgdGhlbSB0byBzYW1wbGUgYmxvY2sKKyAqIEBwYXJhbSByIHBvaW50ZXIgdG8gMkQgVkxDIHRhYmxlCisgKiBAcGFyYW0gZXNjX2dvbG9tYl9vcmRlciBlc2NhcGUgY29kZXMgYXJlIGstZ29sb21iIHdpdGggdGhpcyBvcmRlciBrCisgKiBAcGFyYW0gcXAgcXVhbnRpemVyCisgKiBAcGFyYW0gZHN0IGxvY2F0aW9uIG9mIHNhbXBsZSBibG9jaworICogQHBhcmFtIHN0cmlkZSBsaW5lIHN0cmlkZSBpbiBmcmFtZSBidWZmZXIKKyAqLworc3RhdGljIGludCBkZWNvZGVfcmVzaWR1YWxfYmxvY2soQVZTQ29udGV4dCAqaCwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZGVjXzJkdmxjICpyLCBpbnQgZXNjX2dvbG9tYl9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxcCwgdWludDhfdCAqZHN0LCBpbnQgc3RyaWRlKQoreworICAgIGludCBpLCBlc2NfY29kZSwgbGV2ZWwsIG1hc2ssIHJldDsKKyAgICB1bnNpZ25lZCBpbnQgbGV2ZWxfY29kZSwgcnVuOworICAgIGludDE2X3QgbGV2ZWxfYnVmWzY1XTsKKyAgICB1aW50OF90IHJ1bl9idWZbNjVdOworICAgIGludDE2X3QgKmJsb2NrID0gaC0+YmxvY2s7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjU7IGkrKykgeworICAgICAgICBsZXZlbF9jb2RlID0gZ2V0X3VlX2NvZGUoZ2IsIHItPmdvbG9tYl9vcmRlcik7CisgICAgICAgIGlmIChsZXZlbF9jb2RlID49IEVTQ0FQRV9DT0RFKSB7CisgICAgICAgICAgICBydW4gICAgICA9ICgobGV2ZWxfY29kZSAtIEVTQ0FQRV9DT0RFKSA+PiAxKSArIDE7CisgICAgICAgICAgICBpZihydW4gPiA2NCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicnVuICVkIGlzIHRvbyBsYXJnZVxuIiwgcnVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVzY19jb2RlID0gZ2V0X3VlX2NvZGUoZ2IsIGVzY19nb2xvbWJfb3JkZXIpOworICAgICAgICAgICAgbGV2ZWwgICAgPSBlc2NfY29kZSArIChydW4gPiByLT5tYXhfcnVuID8gMSA6IHItPmxldmVsX2FkZFtydW5dKTsKKyAgICAgICAgICAgIHdoaWxlIChsZXZlbCA+IHItPmluY19saW1pdCkKKyAgICAgICAgICAgICAgICByKys7CisgICAgICAgICAgICBtYXNrICA9IC0obGV2ZWxfY29kZSAmIDEpOworICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgXiBtYXNrKSAtIG1hc2s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXZlbCA9IHItPnJsdGFiW2xldmVsX2NvZGVdWzBdOworICAgICAgICAgICAgaWYgKCFsZXZlbCkgLy9lbmQgb2YgYmxvY2sgc2lnbmFsCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBydW4gPSByLT5ybHRhYltsZXZlbF9jb2RlXVsxXTsKKyAgICAgICAgICAgIHIgICs9IHItPnJsdGFiW2xldmVsX2NvZGVdWzJdOworICAgICAgICB9CisgICAgICAgIGxldmVsX2J1ZltpXSA9IGxldmVsOworICAgICAgICBydW5fYnVmW2ldICAgPSBydW47CisgICAgfQorICAgIGlmICgocmV0ID0gZGVxdWFudChoLCBsZXZlbF9idWYsIHJ1bl9idWYsIGJsb2NrLCBkZXF1YW50X211bFtxcF0sCisgICAgICAgICAgICAgICAgICAgICAgZGVxdWFudF9zaGlmdFtxcF0sIGkpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaC0+Y2RzcC5jYXZzX2lkY3Q4X2FkZChkc3QsIGJsb2NrLCBzdHJpZGUpOworICAgIGgtPmJkc3AuY2xlYXJfYmxvY2soYmxvY2spOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNvZGVfcmVzaWR1YWxfY2hyb21hKEFWU0NvbnRleHQgKmgpCit7CisgICAgaWYgKGgtPmNicCAmICgxIDw8IDQpKQorICAgICAgICBkZWNvZGVfcmVzaWR1YWxfYmxvY2soaCwgJmgtPmdiLCBjaHJvbWFfZGVjLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfY2F2c19jaHJvbWFfcXBbaC0+cXBdLCBoLT5jdSwgaC0+Y19zdHJpZGUpOworICAgIGlmIChoLT5jYnAgJiAoMSA8PCA1KSkKKyAgICAgICAgZGVjb2RlX3Jlc2lkdWFsX2Jsb2NrKGgsICZoLT5nYiwgY2hyb21hX2RlYywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NhdnNfY2hyb21hX3FwW2gtPnFwXSwgaC0+Y3YsIGgtPmNfc3RyaWRlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX3Jlc2lkdWFsX2ludGVyKEFWU0NvbnRleHQgKmgpCit7CisgICAgaW50IGJsb2NrOworCisgICAgLyogZ2V0IGNvZGVkIGJsb2NrIHBhdHRlcm4gKi8KKyAgICBpbnQgY2JwID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgIGlmIChjYnAgPiA2M1UpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIGludGVyIGNicCAlZFxuIiwgY2JwKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGgtPmNicCA9IGNicF90YWJbY2JwXVsxXTsKKworICAgIC8qIGdldCBxdWFudGl6ZXIgKi8KKyAgICBpZiAoaC0+Y2JwICYmICFoLT5xcF9maXhlZCkKKyAgICAgICAgaC0+cXAgPSAoaC0+cXAgKyBnZXRfc2VfZ29sb21iKCZoLT5nYikpICYgNjM7CisgICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgNDsgYmxvY2srKykKKyAgICAgICAgaWYgKGgtPmNicCAmICgxIDw8IGJsb2NrKSkKKyAgICAgICAgICAgIGRlY29kZV9yZXNpZHVhbF9ibG9jayhoLCAmaC0+Z2IsIGludGVyX2RlYywgMCwgaC0+cXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+Y3kgKyBoLT5sdW1hX3NjYW5bYmxvY2tdLCBoLT5sX3N0cmlkZSk7CisgICAgZGVjb2RlX3Jlc2lkdWFsX2Nocm9tYShoKTsKKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtYWNyb2Jsb2NrIGxldmVsCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbXZfaW50cmEoQVZTQ29udGV4dCAqaCkKK3sKKyAgICBoLT5tdltNVl9GV0RfWDBdID0gZmZfY2F2c19pbnRyYV9tdjsKKyAgICBzZXRfbXZzKCZoLT5tdltNVl9GV0RfWDBdLCBCTEtfMTZYMTYpOworICAgIGgtPm12W01WX0JXRF9YMF0gPSBmZl9jYXZzX2ludHJhX212OworICAgIHNldF9tdnMoJmgtPm12W01WX0JXRF9YMF0sIEJMS18xNlgxNik7CisgICAgaWYgKGgtPmN1ci5mLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgIGgtPmNvbF90eXBlX2Jhc2VbaC0+bWJpZHhdID0gSV84WDg7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX21iX2koQVZTQ29udGV4dCAqaCwgaW50IGNicF9jb2RlKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJmgtPmdiOworICAgIHVuc2lnbmVkIHByZWRfbW9kZV91djsKKyAgICBpbnQgYmxvY2s7CisgICAgdWludDhfdCB0b3BbMThdOworICAgIHVpbnQ4X3QgKmxlZnQgPSBOVUxMOworICAgIHVpbnQ4X3QgKmQ7CisKKyAgICBmZl9jYXZzX2luaXRfbWIoaCk7CisKKyAgICAvKiBnZXQgaW50cmEgcHJlZGljdGlvbiBtb2RlcyBmcm9tIHN0cmVhbSAqLworICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IDQ7IGJsb2NrKyspIHsKKyAgICAgICAgaW50IG5BLCBuQiwgcHJlZHByZWQ7CisgICAgICAgIGludCBwb3MgPSBzY2FuM3gzW2Jsb2NrXTsKKworICAgICAgICBuQSA9IGgtPnByZWRfbW9kZV9ZW3BvcyAtIDFdOworICAgICAgICBuQiA9IGgtPnByZWRfbW9kZV9ZW3BvcyAtIDNdOworICAgICAgICBwcmVkcHJlZCA9IEZGTUlOKG5BLCBuQik7CisgICAgICAgIGlmIChwcmVkcHJlZCA9PSBOT1RfQVZBSUwpIC8vIGlmIGVpdGhlciBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgICAgICBwcmVkcHJlZCA9IElOVFJBX0xfTFA7CisgICAgICAgIGlmICghZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgaW50IHJlbV9tb2RlID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgcHJlZHByZWQgICAgID0gcmVtX21vZGUgKyAocmVtX21vZGUgPj0gcHJlZHByZWQpOworICAgICAgICB9CisgICAgICAgIGgtPnByZWRfbW9kZV9ZW3Bvc10gPSBwcmVkcHJlZDsKKyAgICB9CisgICAgcHJlZF9tb2RlX3V2ID0gZ2V0X3VlX2dvbG9tYihnYik7CisgICAgaWYgKHByZWRfbW9kZV91diA+IDYpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIGludHJhIGNocm9tYSBwcmVkIG1vZGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZmZfY2F2c19tb2RpZnlfbWJfaShoLCAmcHJlZF9tb2RlX3V2KTsKKworICAgIC8qIGdldCBjb2RlZCBibG9jayBwYXR0ZXJuICovCisgICAgaWYgKGgtPmN1ci5mLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgIGNicF9jb2RlID0gZ2V0X3VlX2dvbG9tYihnYik7CisgICAgaWYgKGNicF9jb2RlID4gNjNVKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBpbnRyYSBjYnBcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaC0+Y2JwID0gY2JwX3RhYltjYnBfY29kZV1bMF07CisgICAgaWYgKGgtPmNicCAmJiAhaC0+cXBfZml4ZWQpCisgICAgICAgIGgtPnFwID0gKGgtPnFwICsgZ2V0X3NlX2dvbG9tYihnYikpICYgNjM7IC8vcXBfZGVsdGEKKworICAgIC8qIGx1bWEgaW50cmEgcHJlZGljdGlvbiBpbnRlcmxlYXZlZCB3aXRoIHJlc2lkdWFsIGRlY29kZS90cmFuc2Zvcm0vYWRkICovCisgICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgNDsgYmxvY2srKykgeworICAgICAgICBkID0gaC0+Y3kgKyBoLT5sdW1hX3NjYW5bYmxvY2tdOworICAgICAgICBmZl9jYXZzX2xvYWRfaW50cmFfcHJlZF9sdW1hKGgsIHRvcCwgJmxlZnQsIGJsb2NrKTsKKyAgICAgICAgaC0+aW50cmFfcHJlZF9sW2gtPnByZWRfbW9kZV9ZW3NjYW4zeDNbYmxvY2tdXV0KKyAgICAgICAgICAgIChkLCB0b3AsIGxlZnQsIGgtPmxfc3RyaWRlKTsKKyAgICAgICAgaWYgKGgtPmNicCAmICgxPDxibG9jaykpCisgICAgICAgICAgICBkZWNvZGVfcmVzaWR1YWxfYmxvY2soaCwgZ2IsIGludHJhX2RlYywgMSwgaC0+cXAsIGQsIGgtPmxfc3RyaWRlKTsKKyAgICB9CisKKyAgICAvKiBjaHJvbWEgaW50cmEgcHJlZGljdGlvbiAqLworICAgIGZmX2NhdnNfbG9hZF9pbnRyYV9wcmVkX2Nocm9tYShoKTsKKyAgICBoLT5pbnRyYV9wcmVkX2NbcHJlZF9tb2RlX3V2XShoLT5jdSwgJmgtPnRvcF9ib3JkZXJfdVtoLT5tYnggKiAxMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bGVmdF9ib3JkZXJfdSwgaC0+Y19zdHJpZGUpOworICAgIGgtPmludHJhX3ByZWRfY1twcmVkX21vZGVfdXZdKGgtPmN2LCAmaC0+dG9wX2JvcmRlcl92W2gtPm1ieCAqIDEwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5sZWZ0X2JvcmRlcl92LCBoLT5jX3N0cmlkZSk7CisKKyAgICBkZWNvZGVfcmVzaWR1YWxfY2hyb21hKGgpOworICAgIGZmX2NhdnNfZmlsdGVyKGgsIElfOFg4KTsKKyAgICBzZXRfbXZfaW50cmEoaCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaW50cmFfbW9kZV9kZWZhdWx0KEFWU0NvbnRleHQgKmgpCit7CisgICAgaWYgKGgtPnN0cmVhbV9yZXZpc2lvbiA+IDApIHsKKyAgICAgICAgaC0+cHJlZF9tb2RlX1lbM10gPSAgaC0+cHJlZF9tb2RlX1lbNl0gPSBOT1RfQVZBSUw7CisgICAgICAgIGgtPnRvcF9wcmVkX1lbaC0+bWJ4ICogMiArIDBdID0gaC0+dG9wX3ByZWRfWVtoLT5tYnggKiAyICsgMV0gPSBOT1RfQVZBSUw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaC0+cHJlZF9tb2RlX1lbM10gPSAgaC0+cHJlZF9tb2RlX1lbNl0gPSBJTlRSQV9MX0xQOworICAgICAgICBoLT50b3BfcHJlZF9ZW2gtPm1ieCAqIDIgKyAwXSA9IGgtPnRvcF9wcmVkX1lbaC0+bWJ4ICogMiArIDFdID0gSU5UUkFfTF9MUDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9tYl9wKEFWU0NvbnRleHQgKmgsIGVudW0gY2F2c19tYiBtYl90eXBlKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJmgtPmdiOworICAgIGludCByZWZbNF07CisKKyAgICBmZl9jYXZzX2luaXRfbWIoaCk7CisgICAgc3dpdGNoIChtYl90eXBlKSB7CisgICAgY2FzZSBQX1NLSVA6CisgICAgICAgIGZmX2NhdnNfbXYoaCwgTVZfRldEX1gwLCBNVl9GV0RfQzIsIE1WX1BSRURfUFNLSVAsICBCTEtfMTZYMTYsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBfMTZYMTY6CisgICAgICAgIHJlZlswXSA9IGgtPnJlZl9mbGFnID8gMCA6IGdldF9iaXRzMShnYik7CisgICAgICAgIGZmX2NhdnNfbXYoaCwgTVZfRldEX1gwLCBNVl9GV0RfQzIsIE1WX1BSRURfTUVESUFOLCBCTEtfMTZYMTYsIHJlZlswXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUF8xNlg4OgorICAgICAgICByZWZbMF0gPSBoLT5yZWZfZmxhZyA/IDAgOiBnZXRfYml0czEoZ2IpOworICAgICAgICByZWZbMl0gPSBoLT5yZWZfZmxhZyA/IDAgOiBnZXRfYml0czEoZ2IpOworICAgICAgICBmZl9jYXZzX212KGgsIE1WX0ZXRF9YMCwgTVZfRldEX0MyLCBNVl9QUkVEX1RPUCwgICAgQkxLXzE2WDgsIHJlZlswXSk7CisgICAgICAgIGZmX2NhdnNfbXYoaCwgTVZfRldEX1gyLCBNVl9GV0RfQTEsIE1WX1BSRURfTEVGVCwgICBCTEtfMTZYOCwgcmVmWzJdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQXzhYMTY6CisgICAgICAgIHJlZlswXSA9IGgtPnJlZl9mbGFnID8gMCA6IGdldF9iaXRzMShnYik7CisgICAgICAgIHJlZlsxXSA9IGgtPnJlZl9mbGFnID8gMCA6IGdldF9iaXRzMShnYik7CisgICAgICAgIGZmX2NhdnNfbXYoaCwgTVZfRldEX1gwLCBNVl9GV0RfQjMsIE1WX1BSRURfTEVGVCwgICAgIEJMS184WDE2LCByZWZbMF0pOworICAgICAgICBmZl9jYXZzX212KGgsIE1WX0ZXRF9YMSwgTVZfRldEX0MyLCBNVl9QUkVEX1RPUFJJR0hULCBCTEtfOFgxNiwgcmVmWzFdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQXzhYODoKKyAgICAgICAgcmVmWzBdID0gaC0+cmVmX2ZsYWcgPyAwIDogZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgcmVmWzFdID0gaC0+cmVmX2ZsYWcgPyAwIDogZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgcmVmWzJdID0gaC0+cmVmX2ZsYWcgPyAwIDogZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgcmVmWzNdID0gaC0+cmVmX2ZsYWcgPyAwIDogZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgZmZfY2F2c19tdihoLCBNVl9GV0RfWDAsIE1WX0ZXRF9CMywgTVZfUFJFRF9NRURJQU4sICAgQkxLXzhYOCwgcmVmWzBdKTsKKyAgICAgICAgZmZfY2F2c19tdihoLCBNVl9GV0RfWDEsIE1WX0ZXRF9DMiwgTVZfUFJFRF9NRURJQU4sICAgQkxLXzhYOCwgcmVmWzFdKTsKKyAgICAgICAgZmZfY2F2c19tdihoLCBNVl9GV0RfWDIsIE1WX0ZXRF9YMSwgTVZfUFJFRF9NRURJQU4sICAgQkxLXzhYOCwgcmVmWzJdKTsKKyAgICAgICAgZmZfY2F2c19tdihoLCBNVl9GV0RfWDMsIE1WX0ZXRF9YMCwgTVZfUFJFRF9NRURJQU4sICAgQkxLXzhYOCwgcmVmWzNdKTsKKyAgICB9CisgICAgZmZfY2F2c19pbnRlcihoLCBtYl90eXBlKTsKKyAgICBzZXRfaW50cmFfbW9kZV9kZWZhdWx0KGgpOworICAgIHN0b3JlX212cyhoKTsKKyAgICBpZiAobWJfdHlwZSAhPSBQX1NLSVApCisgICAgICAgIGRlY29kZV9yZXNpZHVhbF9pbnRlcihoKTsKKyAgICBmZl9jYXZzX2ZpbHRlcihoLCBtYl90eXBlKTsKKyAgICBoLT5jb2xfdHlwZV9iYXNlW2gtPm1iaWR4XSA9IG1iX3R5cGU7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX21iX2IoQVZTQ29udGV4dCAqaCwgZW51bSBjYXZzX21iIG1iX3R5cGUpCit7CisgICAgaW50IGJsb2NrOworICAgIGVudW0gY2F2c19zdWJfbWIgc3ViX3R5cGVbNF07CisgICAgaW50IGZsYWdzOworCisgICAgZmZfY2F2c19pbml0X21iKGgpOworCisgICAgLyogcmVzZXQgYWxsIE1WcyAqLworICAgIGgtPm12W01WX0ZXRF9YMF0gPSBmZl9jYXZzX2Rpcl9tdjsKKyAgICBzZXRfbXZzKCZoLT5tdltNVl9GV0RfWDBdLCBCTEtfMTZYMTYpOworICAgIGgtPm12W01WX0JXRF9YMF0gPSBmZl9jYXZzX2Rpcl9tdjsKKyAgICBzZXRfbXZzKCZoLT5tdltNVl9CV0RfWDBdLCBCTEtfMTZYMTYpOworICAgIHN3aXRjaCAobWJfdHlwZSkgeworICAgIGNhc2UgQl9TS0lQOgorICAgIGNhc2UgQl9ESVJFQ1Q6CisgICAgICAgIGlmICghaC0+Y29sX3R5cGVfYmFzZVtoLT5tYmlkeF0pIHsKKyAgICAgICAgICAgIC8qIGludHJhIE1CIGF0IGNvLWxvY2F0aW9uLCBkbyBpbi1wbGFuZSBwcmVkaWN0aW9uICovCisgICAgICAgICAgICBmZl9jYXZzX212KGgsIE1WX0ZXRF9YMCwgTVZfRldEX0MyLCBNVl9QUkVEX0JTS0lQLCBCTEtfMTZYMTYsIDEpOworICAgICAgICAgICAgZmZfY2F2c19tdihoLCBNVl9CV0RfWDAsIE1WX0JXRF9DMiwgTVZfUFJFRF9CU0tJUCwgQkxLXzE2WDE2LCAwKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAvKiBkaXJlY3QgcHJlZGljdGlvbiBmcm9tIGNvLWxvY2F0ZWQgUCBNQiwgYmxvY2std2lzZSAqLworICAgICAgICAgICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgNDsgYmxvY2srKykKKyAgICAgICAgICAgICAgICBtdl9wcmVkX2RpcmVjdChoLCAmaC0+bXZbbXZfc2NhbltibG9ja11dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5jb2xfbXZbaC0+bWJpZHggKiA0ICsgYmxvY2tdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCX0ZXRF8xNlgxNjoKKyAgICAgICAgZmZfY2F2c19tdihoLCBNVl9GV0RfWDAsIE1WX0ZXRF9DMiwgTVZfUFJFRF9NRURJQU4sIEJMS18xNlgxNiwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQl9TWU1fMTZYMTY6CisgICAgICAgIGZmX2NhdnNfbXYoaCwgTVZfRldEX1gwLCBNVl9GV0RfQzIsIE1WX1BSRURfTUVESUFOLCBCTEtfMTZYMTYsIDEpOworICAgICAgICBtdl9wcmVkX3N5bShoLCAmaC0+bXZbTVZfRldEX1gwXSwgQkxLXzE2WDE2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCX0JXRF8xNlgxNjoKKyAgICAgICAgZmZfY2F2c19tdihoLCBNVl9CV0RfWDAsIE1WX0JXRF9DMiwgTVZfUFJFRF9NRURJQU4sIEJMS18xNlgxNiwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQl84WDg6CisjZGVmaW5lIFRNUF9VTlVTRURfSU5YICA3CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgNDsgYmxvY2srKykKKyAgICAgICAgICAgIHN1Yl90eXBlW2Jsb2NrXSA9IGdldF9iaXRzKCZoLT5nYiwgMik7CisgICAgICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IDQ7IGJsb2NrKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3ViX3R5cGVbYmxvY2tdKSB7CisgICAgICAgICAgICBjYXNlIEJfU1VCX0RJUkVDVDoKKyAgICAgICAgICAgICAgICBpZiAoIWgtPmNvbF90eXBlX2Jhc2VbaC0+bWJpZHhdKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGludHJhIE1CIGF0IGNvLWxvY2F0aW9uLCBkbyBpbi1wbGFuZSBwcmVkaWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmKGZsYWdzPT0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBjb2wtTUIgaXMgYSBJbnRyYSBNQiwgY3VycmVudCBCbG9jayBzaXplIGlzIDE2eDE2LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVZTIHN0YW5kYXJkIHNlY3Rpb24gOS45LjEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJsb2NrPjApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm12W1RNUF9VTlVTRURfSU5YICAgICAgICAgICAgICBdID0gaC0+bXZbTVZfRldEX1gwICAgICAgICAgICAgICBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm12W1RNUF9VTlVTRURfSU5YICsgTVZfQldEX09GRlNdID0gaC0+bXZbTVZfRldEX1gwICsgTVZfQldEX09GRlNdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmZfY2F2c19tdihoLCBNVl9GV0RfWDAsIE1WX0ZXRF9DMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfUFJFRF9CU0tJUCwgQkxLXzhYOCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmZl9jYXZzX212KGgsIE1WX0ZXRF9YMCtNVl9CV0RfT0ZGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfRldEX0MyK01WX0JXRF9PRkZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVl9QUkVEX0JTS0lQLCBCTEtfOFg4LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJsb2NrPjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IG12X3NjYW5bYmxvY2tdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm12W2ZsYWdzICAgICAgICAgICAgICBdID0gaC0+bXZbTVZfRldEX1gwICAgICAgICAgICAgICBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm12W2ZsYWdzICsgTVZfQldEX09GRlNdID0gaC0+bXZbTVZfRldEX1gwICsgTVZfQldEX09GRlNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm12W01WX0ZXRF9YMCAgICAgICAgICAgICAgXSA9IGgtPm12W1RNUF9VTlVTRURfSU5YICAgICAgICAgICAgICBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm12W01WX0ZXRF9YMCArIE1WX0JXRF9PRkZTXSA9IGgtPm12W1RNUF9VTlVTRURfSU5YICsgTVZfQldEX09GRlNdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBNVl9GV0RfWDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoLT5tdlttdl9zY2FuW2Jsb2NrXSAgICAgICAgICAgICAgXSA9IGgtPm12W2ZsYWdzICAgICAgICAgICAgICBdOworICAgICAgICAgICAgICAgICAgICAgICAgaC0+bXZbbXZfc2NhbltibG9ja10gKyBNVl9CV0RfT0ZGU10gPSBoLT5tdltmbGFncyArIE1WX0JXRF9PRkZTXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBtdl9wcmVkX2RpcmVjdChoLCAmaC0+bXZbbXZfc2NhbltibG9ja11dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+Y29sX212W2gtPm1iaWR4ICogNCArIGJsb2NrXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJfU1VCX0ZXRDoKKyAgICAgICAgICAgICAgICBmZl9jYXZzX212KGgsIG12X3NjYW5bYmxvY2tdLCBtdl9zY2FuW2Jsb2NrXSAtIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNVl9QUkVEX01FRElBTiwgQkxLXzhYOCwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJfU1VCX1NZTToKKyAgICAgICAgICAgICAgICBmZl9jYXZzX212KGgsIG12X3NjYW5bYmxvY2tdLCBtdl9zY2FuW2Jsb2NrXSAtIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNVl9QUkVEX01FRElBTiwgQkxLXzhYOCwgMSk7CisgICAgICAgICAgICAgICAgbXZfcHJlZF9zeW0oaCwgJmgtPm12W212X3NjYW5bYmxvY2tdXSwgQkxLXzhYOCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyN1bmRlZiBUTVBfVU5VU0VEX0lOWAorICAgICAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCA0OyBibG9jaysrKSB7CisgICAgICAgICAgICBpZiAoc3ViX3R5cGVbYmxvY2tdID09IEJfU1VCX0JXRCkKKyAgICAgICAgICAgICAgICBmZl9jYXZzX212KGgsIG12X3NjYW5bYmxvY2tdICsgTVZfQldEX09GRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9zY2FuW2Jsb2NrXSArIE1WX0JXRF9PRkZTIC0gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WX1BSRURfTUVESUFOLCBCTEtfOFg4LCAwKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAobWJfdHlwZSA8PSBCX1NZTV8xNlgxNikgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG1iX3R5cGUgJWQgaW4gQiBmcmFtZVxuIiwgbWJfdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBhdl9hc3NlcnQyKG1iX3R5cGUgPCBCXzhYOCk7CisgICAgICAgIGZsYWdzID0gZmZfY2F2c19wYXJ0aXRpb25fZmxhZ3NbbWJfdHlwZV07CisgICAgICAgIGlmIChtYl90eXBlICYgMSkgeyAvKiAxNng4IG1hY3JvYmxvY2sgdHlwZXMgKi8KKyAgICAgICAgICAgIGlmIChmbGFncyAmIEZXRDApCisgICAgICAgICAgICAgICAgZmZfY2F2c19tdihoLCBNVl9GV0RfWDAsIE1WX0ZXRF9DMiwgTVZfUFJFRF9UT1AsICBCTEtfMTZYOCwgMSk7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBTWU0wKQorICAgICAgICAgICAgICAgIG12X3ByZWRfc3ltKGgsICZoLT5tdltNVl9GV0RfWDBdLCBCTEtfMTZYOCk7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGV0QxKQorICAgICAgICAgICAgICAgIGZmX2NhdnNfbXYoaCwgTVZfRldEX1gyLCBNVl9GV0RfQTEsIE1WX1BSRURfTEVGVCwgQkxLXzE2WDgsIDEpOworICAgICAgICAgICAgaWYgKGZsYWdzICYgU1lNMSkKKyAgICAgICAgICAgICAgICBtdl9wcmVkX3N5bShoLCAmaC0+bXZbTVZfRldEX1gyXSwgQkxLXzE2WDgpOworICAgICAgICAgICAgaWYgKGZsYWdzICYgQldEMCkKKyAgICAgICAgICAgICAgICBmZl9jYXZzX212KGgsIE1WX0JXRF9YMCwgTVZfQldEX0MyLCBNVl9QUkVEX1RPUCwgIEJMS18xNlg4LCAwKTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIEJXRDEpCisgICAgICAgICAgICAgICAgZmZfY2F2c19tdihoLCBNVl9CV0RfWDIsIE1WX0JXRF9BMSwgTVZfUFJFRF9MRUZULCBCTEtfMTZYOCwgMCk7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgIC8qIDh4MTYgbWFjcm9ibG9jayB0eXBlcyAqLworICAgICAgICAgICAgaWYgKGZsYWdzICYgRldEMCkKKyAgICAgICAgICAgICAgICBmZl9jYXZzX212KGgsIE1WX0ZXRF9YMCwgTVZfRldEX0IzLCBNVl9QUkVEX0xFRlQsIEJMS184WDE2LCAxKTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFNZTTApCisgICAgICAgICAgICAgICAgbXZfcHJlZF9zeW0oaCwgJmgtPm12W01WX0ZXRF9YMF0sIEJMS184WDE2KTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIEZXRDEpCisgICAgICAgICAgICAgICAgZmZfY2F2c19tdihoLCBNVl9GV0RfWDEsIE1WX0ZXRF9DMiwgTVZfUFJFRF9UT1BSSUdIVCwgQkxLXzhYMTYsIDEpOworICAgICAgICAgICAgaWYgKGZsYWdzICYgU1lNMSkKKyAgICAgICAgICAgICAgICBtdl9wcmVkX3N5bShoLCAmaC0+bXZbTVZfRldEX1gxXSwgQkxLXzhYMTYpOworICAgICAgICAgICAgaWYgKGZsYWdzICYgQldEMCkKKyAgICAgICAgICAgICAgICBmZl9jYXZzX212KGgsIE1WX0JXRF9YMCwgTVZfQldEX0IzLCBNVl9QUkVEX0xFRlQsIEJMS184WDE2LCAwKTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIEJXRDEpCisgICAgICAgICAgICAgICAgZmZfY2F2c19tdihoLCBNVl9CV0RfWDEsIE1WX0JXRF9DMiwgTVZfUFJFRF9UT1BSSUdIVCwgQkxLXzhYMTYsIDApOworICAgICAgICB9CisgICAgfQorICAgIGZmX2NhdnNfaW50ZXIoaCwgbWJfdHlwZSk7CisgICAgc2V0X2ludHJhX21vZGVfZGVmYXVsdChoKTsKKyAgICBpZiAobWJfdHlwZSAhPSBCX1NLSVApCisgICAgICAgIGRlY29kZV9yZXNpZHVhbF9pbnRlcihoKTsKKyAgICBmZl9jYXZzX2ZpbHRlcihoLCBtYl90eXBlKTsKKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzbGljZSBsZXZlbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfc2xpY2VfaGVhZGVyKEFWU0NvbnRleHQgKmgsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGlmIChoLT5zdGMgPiAweEFGKQorICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInVuZXhwZWN0ZWQgc3RhcnQgY29kZSAweCUwMnhcbiIsIGgtPnN0Yyk7CisKKyAgICBpZiAoaC0+c3RjID49IGgtPm1iX2hlaWdodCkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInN0YyAweCUwMnggaXMgdG9vIGxhcmdlXG4iLCBoLT5zdGMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBoLT5tYnkgICA9IGgtPnN0YzsKKyAgICBoLT5tYmlkeCA9IGgtPm1ieSAqIGgtPm1iX3dpZHRoOworCisgICAgLyogbWFyayB0b3AgbWFjcm9ibG9ja3MgYXMgdW5hdmFpbGFibGUgKi8KKyAgICBoLT5mbGFncyAmPSB+KEJfQVZBSUwgfCBDX0FWQUlMKTsKKyAgICBpZiAoIWgtPnBpY19xcF9maXhlZCkgeworICAgICAgICBoLT5xcF9maXhlZCA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGgtPnFwICAgICAgID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgIH0KKyAgICAvKiBpbnRlciBmcmFtZSBvciBzZWNvbmQgc2xpY2UgY2FuIGhhdmUgd2VpZ2h0aW5nIHBhcmFtcyAqLworICAgIGlmICgoaC0+Y3VyLmYtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkgfHwKKyAgICAgICAgKCFoLT5waWNfc3RydWN0dXJlICYmIGgtPm1ieSA+PSBoLT5tYl93aWR0aCAvIDIpKQorICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvL3NsaWNlX3dlaWdodGluZ19mbGFnCisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAid2VpZ2h0ZWQgcHJlZGljdGlvbiBub3QgeWV0IHN1cHBvcnRlZFxuIik7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfZm9yX3NsaWNlKEFWU0NvbnRleHQgKmgpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmaC0+Z2I7CisgICAgaW50IGFsaWduOworCisgICAgaWYgKGgtPm1ieCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYWxpZ24gPSAoLWdldF9iaXRzX2NvdW50KGdiKSkgJiA3OworICAgIC8qIGNoZWNrIGZvciBzdHVmZmluZyBieXRlICovCisgICAgaWYgKCFhbGlnbiAmJiAoc2hvd19iaXRzKGdiLCA4KSA9PSAweDgwKSkKKyAgICAgICAgYWxpZ24gPSA4OworICAgIGlmICgoc2hvd19iaXRzX2xvbmcoZ2IsIDI0ICsgYWxpZ24pICYgMHhGRkZGRkYpID09IDB4MDAwMDAxKSB7CisgICAgICAgIHNraXBfYml0c19sb25nKGdiLCAyNCArIGFsaWduKTsKKyAgICAgICAgaC0+c3RjID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICBpZiAoaC0+c3RjID49IGgtPm1iX2hlaWdodCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBkZWNvZGVfc2xpY2VfaGVhZGVyKGgsIGdiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmcmFtZSBsZXZlbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGRlY29kZV9waWMoQVZTQ29udGV4dCAqaCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCBza2lwX2NvdW50ICAgID0gLTE7CisgICAgZW51bSBjYXZzX21iIG1iX3R5cGU7CisKKyAgICBpZiAoIWgtPnRvcF9xcCkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIHNlcXVlbmNlIGhlYWRlciBkZWNvZGVkIHlldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2X2ZyYW1lX3VucmVmKGgtPmN1ci5mKTsKKworICAgIHNraXBfYml0cygmaC0+Z2IsIDE2KTsvL2Jidl9kd2xheQorICAgIGlmIChoLT5zdGMgPT0gUElDX1BCX1NUQVJUX0NPREUpIHsKKyAgICAgICAgaC0+Y3VyLmYtPnBpY3RfdHlwZSA9IGdldF9iaXRzKCZoLT5nYiwgMikgKyBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgaWYgKGgtPmN1ci5mLT5waWN0X3R5cGUgPiBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIHBpY3R1cmUgdHlwZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICAvKiBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgcmVmZXJlbmNlIGZyYW1lcyB3ZSBuZWVkICovCisgICAgICAgIGlmICghaC0+RFBCWzBdLmYtPmRhdGFbMF0gfHwKKyAgICAgICAgICAgKCFoLT5EUEJbMV0uZi0+ZGF0YVswXSAmJiBoLT5jdXIuZi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0gZWxzZSB7CisgICAgICAgIGgtPmN1ci5mLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgaWYgKGdldF9iaXRzMSgmaC0+Z2IpKQorICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgMjQpOy8vdGltZV9jb2RlCisgICAgICAgIC8qIG9sZCBzYW1wbGUgY2xpcHMgd2VyZSBhbGwgcHJvZ3Jlc3NpdmUgYW5kIG5vIGxvd19kZWxheSwKKyAgICAgICAgICAgYnVtcCBzdHJlYW0gcmV2aXNpb24gaWYgZGV0ZWN0ZWQgb3RoZXJ3aXNlICovCisgICAgICAgIGlmIChoLT5sb3dfZGVsYXkgfHwgIShzaG93X2JpdHMoJmgtPmdiLCA5KSAmIDEpKQorICAgICAgICAgICAgaC0+c3RyZWFtX3JldmlzaW9uID0gMTsKKyAgICAgICAgLyogc2ltaWxhcmx5IHRlc3QgdG9wX2ZpZWxkX2ZpcnN0IGFuZCByZXBlYXRfZmlyc3RfZmllbGQgKi8KKyAgICAgICAgZWxzZSBpZiAoc2hvd19iaXRzKCZoLT5nYiwgMTEpICYgMykKKyAgICAgICAgICAgIGgtPnN0cmVhbV9yZXZpc2lvbiA9IDE7CisgICAgICAgIGlmIChoLT5zdHJlYW1fcmV2aXNpb24gPiAwKQorICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgMSk7IC8vbWFya2VyX2JpdAorICAgIH0KKworICAgIHJldCA9IGZmX2dldF9idWZmZXIoaC0+YXZjdHgsIGgtPmN1ci5mLCBoLT5jdXIuZi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CID8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICghaC0+ZWRnZV9lbXVfYnVmZmVyKSB7CisgICAgICAgIGludCBhbGxvY19zaXplID0gRkZBTElHTihGRkFCUyhoLT5jdXIuZi0+bGluZXNpemVbMF0pICsgMzIsIDMyKTsKKyAgICAgICAgaC0+ZWRnZV9lbXVfYnVmZmVyID0gYXZfbWFsbG9jeihhbGxvY19zaXplICogMiAqIDI0KTsKKyAgICAgICAgaWYgKCFoLT5lZGdlX2VtdV9idWZmZXIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfY2F2c19pbml0X3BpYyhoKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGgtPmN1ci5wb2MgPSBnZXRfYml0cygmaC0+Z2IsIDgpICogMjsKKworICAgIC8qIGdldCB0ZW1wb3JhbCBkaXN0YW5jZXMgYW5kIE1WIHNjYWxpbmcgZmFjdG9ycyAqLworICAgIGlmIChoLT5jdXIuZi0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIGgtPmRpc3RbMF0gPSAoaC0+Y3VyLnBvYyAtIGgtPkRQQlswXS5wb2MpICYgNTExOworICAgIH0gZWxzZSB7CisgICAgICAgIGgtPmRpc3RbMF0gPSAoaC0+RFBCWzBdLnBvYyAgLSBoLT5jdXIucG9jKSAmIDUxMTsKKyAgICB9CisgICAgaC0+ZGlzdFsxXSA9IChoLT5jdXIucG9jIC0gaC0+RFBCWzFdLnBvYykgJiA1MTE7CisgICAgaC0+c2NhbGVfZGVuWzBdID0gaC0+ZGlzdFswXSA/IDUxMi9oLT5kaXN0WzBdIDogMDsKKyAgICBoLT5zY2FsZV9kZW5bMV0gPSBoLT5kaXN0WzFdID8gNTEyL2gtPmRpc3RbMV0gOiAwOworICAgIGlmIChoLT5jdXIuZi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIGgtPnN5bV9mYWN0b3IgPSBoLT5kaXN0WzBdICogaC0+c2NhbGVfZGVuWzFdOworICAgIH0gZWxzZSB7CisgICAgICAgIGgtPmRpcmVjdF9kZW5bMF0gPSBoLT5kaXN0WzBdID8gMTYzODQgLyBoLT5kaXN0WzBdIDogMDsKKyAgICAgICAgaC0+ZGlyZWN0X2RlblsxXSA9IGgtPmRpc3RbMV0gPyAxNjM4NCAvIGgtPmRpc3RbMV0gOiAwOworICAgIH0KKworICAgIGlmIChoLT5sb3dfZGVsYXkpCisgICAgICAgIGdldF91ZV9nb2xvbWIoJmgtPmdiKTsgLy9iYnZfY2hlY2tfdGltZXMKKyAgICBoLT5wcm9ncmVzc2l2ZSAgID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgaC0+cGljX3N0cnVjdHVyZSA9IDE7CisgICAgaWYgKCFoLT5wcm9ncmVzc2l2ZSkKKyAgICAgICAgaC0+cGljX3N0cnVjdHVyZSA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIGlmICghaC0+cGljX3N0cnVjdHVyZSAmJiBoLT5zdGMgPT0gUElDX1BCX1NUQVJUX0NPREUpCisgICAgICAgIHNraXBfYml0czEoJmgtPmdiKTsgICAgIC8vYWR2YW5jZWRfcHJlZF9tb2RlX2Rpc2FibGUKKyAgICBza2lwX2JpdHMxKCZoLT5nYik7ICAgICAgICAvL3RvcF9maWVsZF9maXJzdAorICAgIHNraXBfYml0czEoJmgtPmdiKTsgICAgICAgIC8vcmVwZWF0X2ZpcnN0X2ZpZWxkCisgICAgaC0+cGljX3FwX2ZpeGVkID0KKyAgICBoLT5xcF9maXhlZCA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIGgtPnFwICAgICAgID0gZ2V0X2JpdHMoJmgtPmdiLCA2KTsKKyAgICBpZiAoaC0+Y3VyLmYtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICBpZiAoIWgtPnByb2dyZXNzaXZlICYmICFoLT5waWNfc3RydWN0dXJlKQorICAgICAgICAgICAgc2tpcF9iaXRzMSgmaC0+Z2IpOy8vd2hhdCBpcyB0aGlzPworICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCA0KTsgICAvL3Jlc2VydmVkIGJpdHMKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIShoLT5jdXIuZi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmIGgtPnBpY19zdHJ1Y3R1cmUgPT0gMSkpCisgICAgICAgICAgICBoLT5yZWZfZmxhZyAgICAgICAgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgNCk7ICAgLy9yZXNlcnZlZCBiaXRzCisgICAgICAgIGgtPnNraXBfbW9kZV9mbGFnICAgICAgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICB9CisgICAgaC0+bG9vcF9maWx0ZXJfZGlzYWJsZSAgICAgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICBpZiAoIWgtPmxvb3BfZmlsdGVyX2Rpc2FibGUgJiYgZ2V0X2JpdHMxKCZoLT5nYikpIHsKKyAgICAgICAgaC0+YWxwaGFfb2Zmc2V0ICAgICAgICA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgaC0+YmV0YV9vZmZzZXQgICAgICAgICA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoLT5hbHBoYV9vZmZzZXQgPSBoLT5iZXRhX29mZnNldCAgPSAwOworICAgIH0KKyAgICBpZiAoaC0+Y3VyLmYtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBjaGVja19mb3Jfc2xpY2UoaCk7CisgICAgICAgICAgICBkZWNvZGVfbWJfaShoLCAwKTsKKyAgICAgICAgfSB3aGlsZSAoZmZfY2F2c19uZXh0X21iKGgpKTsKKyAgICB9IGVsc2UgaWYgKGgtPmN1ci5mLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGNoZWNrX2Zvcl9zbGljZShoKSkKKyAgICAgICAgICAgICAgICBza2lwX2NvdW50ID0gLTE7CisgICAgICAgICAgICBpZiAoaC0+c2tpcF9tb2RlX2ZsYWcgJiYgKHNraXBfY291bnQgPCAwKSkKKyAgICAgICAgICAgICAgICBza2lwX2NvdW50ID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICAgICAgaWYgKGgtPnNraXBfbW9kZV9mbGFnICYmIHNraXBfY291bnQtLSkgeworICAgICAgICAgICAgICAgIGRlY29kZV9tYl9wKGgsIFBfU0tJUCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSBnZXRfdWVfZ29sb21iKCZoLT5nYikgKyBQX1NLSVAgKyBoLT5za2lwX21vZGVfZmxhZzsKKyAgICAgICAgICAgICAgICBpZiAobWJfdHlwZSA+IFBfOFg4KQorICAgICAgICAgICAgICAgICAgICBkZWNvZGVfbWJfaShoLCBtYl90eXBlIC0gUF84WDggLSAxKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRlY29kZV9tYl9wKGgsIG1iX3R5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChmZl9jYXZzX25leHRfbWIoaCkpOworICAgIH0gZWxzZSB7IC8qIEFWX1BJQ1RVUkVfVFlQRV9CICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChjaGVja19mb3Jfc2xpY2UoaCkpCisgICAgICAgICAgICAgICAgc2tpcF9jb3VudCA9IC0xOworICAgICAgICAgICAgaWYgKGgtPnNraXBfbW9kZV9mbGFnICYmIChza2lwX2NvdW50IDwgMCkpCisgICAgICAgICAgICAgICAgc2tpcF9jb3VudCA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgICAgIGlmIChoLT5za2lwX21vZGVfZmxhZyAmJiBza2lwX2NvdW50LS0pIHsKKyAgICAgICAgICAgICAgICBkZWNvZGVfbWJfYihoLCBCX1NLSVApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYl90eXBlID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpICsgQl9TS0lQICsgaC0+c2tpcF9tb2RlX2ZsYWc7CisgICAgICAgICAgICAgICAgaWYgKG1iX3R5cGUgPiBCXzhYOCkKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX21iX2koaCwgbWJfdHlwZSAtIEJfOFg4IC0gMSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkZWNvZGVfbWJfYihoLCBtYl90eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoZmZfY2F2c19uZXh0X21iKGgpKTsKKyAgICB9CisgICAgaWYgKGgtPmN1ci5mLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoaC0+RFBCWzFdLmYpOworICAgICAgICBGRlNXQVAoQVZTRnJhbWUsIGgtPmN1ciwgaC0+RFBCWzFdKTsKKyAgICAgICAgRkZTV0FQKEFWU0ZyYW1lLCBoLT5EUEJbMF0sIGgtPkRQQlsxXSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBoZWFkZXJzIGFuZCBpbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBkZWNvZGVfc2VxX2hlYWRlcihBVlNDb250ZXh0ICpoKQoreworICAgIGludCBmcmFtZV9yYXRlX2NvZGU7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgICBoLT5wcm9maWxlID0gZ2V0X2JpdHMoJmgtPmdiLCA4KTsKKyAgICBoLT5sZXZlbCAgID0gZ2V0X2JpdHMoJmgtPmdiLCA4KTsKKyAgICBza2lwX2JpdHMxKCZoLT5nYik7IC8vcHJvZ3Jlc3NpdmUgc2VxdWVuY2UKKworICAgIHdpZHRoICA9IGdldF9iaXRzKCZoLT5nYiwgMTQpOworICAgIGhlaWdodCA9IGdldF9iaXRzKCZoLT5nYiwgMTQpOworICAgIGlmICgoaC0+d2lkdGggfHwgaC0+aGVpZ2h0KSAmJiAoaC0+d2lkdGggIT0gd2lkdGggfHwgaC0+aGVpZ2h0ICE9IGhlaWdodCkpIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoaC0+YXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaWR0aC9oZWlnaHQgY2hhbmdpbmcgaW4gQ0FWUyIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGltZW5zaW9ucyBpbnZhbGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGgtPndpZHRoICA9IHdpZHRoOworICAgIGgtPmhlaWdodCA9IGhlaWdodDsKKworICAgIHNraXBfYml0cygmaC0+Z2IsIDIpOyAvL2Nocm9tYSBmb3JtYXQKKyAgICBza2lwX2JpdHMoJmgtPmdiLCAzKTsgLy9zYW1wbGVfcHJlY2lzaW9uCisgICAgaC0+YXNwZWN0X3JhdGlvID0gZ2V0X2JpdHMoJmgtPmdiLCA0KTsKKyAgICBmcmFtZV9yYXRlX2NvZGUgPSBnZXRfYml0cygmaC0+Z2IsIDQpOworICAgIHNraXBfYml0cygmaC0+Z2IsIDE4KTsgLy9iaXRfcmF0ZV9sb3dlcgorICAgIHNraXBfYml0czEoJmgtPmdiKTsgICAgLy9tYXJrZXJfYml0CisgICAgc2tpcF9iaXRzKCZoLT5nYiwgMTIpOyAvL2JpdF9yYXRlX3VwcGVyCisgICAgaC0+bG93X2RlbGF5ID0gIGdldF9iaXRzMSgmaC0+Z2IpOworICAgIGgtPm1iX3dpZHRoICA9IChoLT53aWR0aCAgKyAxNSkgPj4gNDsKKyAgICBoLT5tYl9oZWlnaHQgPSAoaC0+aGVpZ2h0ICsgMTUpID4+IDQ7CisgICAgaC0+YXZjdHgtPmZyYW1lcmF0ZSA9IGZmX21wZWcxMl9mcmFtZV9yYXRlX3RhYltmcmFtZV9yYXRlX2NvZGVdOworICAgIGgtPmF2Y3R4LT53aWR0aCAgPSBoLT53aWR0aDsKKyAgICBoLT5hdmN0eC0+aGVpZ2h0ID0gaC0+aGVpZ2h0OworICAgIGlmICghaC0+dG9wX3FwKQorICAgICAgICBmZl9jYXZzX2luaXRfdG9wX2xpbmVzKGgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjYXZzX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICogYXZjdHgpCit7CisgICAgQVZTQ29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaC0+Z290X2tleWZyYW1lID0gMDsKK30KKworc3RhdGljIGludCBjYXZzX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZTQ29udGV4dCAqaCAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICB1aW50MzJfdCBzdGMgICAgICAgPSAtMTsKKyAgICBpbnQgaW5wdXRfc2l6ZSwgcmV0OworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQ7CisgICAgY29uc3QgdWludDhfdCAqYnVmX3B0cjsKKworICAgIGlmIChidWZfc2l6ZSA9PSAwKSB7CisgICAgICAgIGlmICghaC0+bG93X2RlbGF5ICYmIGgtPkRQQlswXS5mLT5kYXRhWzBdKSB7CisgICAgICAgICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX21vdmVfcmVmKGRhdGEsIGgtPkRQQlswXS5mKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBoLT5zdGMgPSAwOworCisgICAgYnVmX3B0ciA9IGJ1ZjsKKyAgICBidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisgICAgZm9yKDs7KSB7CisgICAgICAgIGJ1Zl9wdHIgPSBhdnByaXZfZmluZF9zdGFydF9jb2RlKGJ1Zl9wdHIsIGJ1Zl9lbmQsICZzdGMpOworICAgICAgICBpZiAoKHN0YyAmIDB4RkZGRkZFMDApIHx8IGJ1Zl9wdHIgPT0gYnVmX2VuZCkgeworICAgICAgICAgICAgaWYgKCFoLT5zdGMpCisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIm5vIGZyYW1lIGRlY29kZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEZGTUFYKDAsIGJ1Zl9wdHIgLSBidWYpOworICAgICAgICB9CisgICAgICAgIGlucHV0X3NpemUgPSAoYnVmX2VuZCAtIGJ1Zl9wdHIpICogODsKKyAgICAgICAgc3dpdGNoIChzdGMpIHsKKyAgICAgICAgY2FzZSBDQVZTX1NUQVJUX0NPREU6CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZoLT5nYiwgYnVmX3B0ciwgaW5wdXRfc2l6ZSk7CisgICAgICAgICAgICBkZWNvZGVfc2VxX2hlYWRlcihoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBJQ19JX1NUQVJUX0NPREU6CisgICAgICAgICAgICBpZiAoIWgtPmdvdF9rZXlmcmFtZSkgeworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGgtPkRQQlswXS5mKTsKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihoLT5EUEJbMV0uZik7CisgICAgICAgICAgICAgICAgaC0+Z290X2tleWZyYW1lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBQSUNfUEJfU1RBUlRfQ09ERToKKyAgICAgICAgICAgICpnb3RfZnJhbWUgPSAwOworICAgICAgICAgICAgaWYgKCFoLT5nb3Rfa2V5ZnJhbWUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZoLT5nYiwgYnVmX3B0ciwgaW5wdXRfc2l6ZSk7CisgICAgICAgICAgICBoLT5zdGMgPSBzdGM7CisgICAgICAgICAgICBpZiAoZGVjb2RlX3BpYyhoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICpnb3RfZnJhbWUgPSAxOworICAgICAgICAgICAgaWYgKGgtPmN1ci5mLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgICAgICBpZiAoaC0+RFBCWyFoLT5sb3dfZGVsYXldLmYtPmRhdGFbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgaC0+RFBCWyFoLT5sb3dfZGVsYXldLmYpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICpnb3RfZnJhbWUgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfbW92ZV9yZWYoZGF0YSwgaC0+Y3VyLmYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVhUX1NUQVJUX0NPREU6CisgICAgICAgICAgICAvL21wZWdfZGVjb2RlX2V4dGVuc2lvbihhdmN0eCwgYnVmX3B0ciwgaW5wdXRfc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVU0VSX1NUQVJUX0NPREU6CisgICAgICAgICAgICAvL21wZWdfZGVjb2RlX3VzZXJfZGF0YShhdmN0eCwgYnVmX3B0ciwgaW5wdXRfc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChzdGMgPD0gU0xJQ0VfTUFYX1NUQVJUX0NPREUpIHsKKyAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZoLT5nYiwgYnVmX3B0ciwgaW5wdXRfc2l6ZSk7CisgICAgICAgICAgICAgICAgZGVjb2RlX3NsaWNlX2hlYWRlcihoLCAmaC0+Z2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0FWQ29kZWMgZmZfY2F2c19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjYXZzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ2hpbmVzZSBBVlMgKEF1ZGlvIFZpZGVvIFN0YW5kYXJkKSAoQVZTMS1QMiwgSmlaaHVuIHByb2ZpbGUpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0NBVlMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFWU0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX2NhdnNfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl9jYXZzX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBjYXZzX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5mbHVzaCAgICAgICAgICA9IGNhdnNfZmx1c2gsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2F2c2RzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2F2c2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjZkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jYXZzZHNwLmMKQEAgLTAsMCArMSw1NjggQEAKKy8qCisgKiBDaGluZXNlIEFWUyB2aWRlbyAoQVZTMS1QMiwgSmlaaHVuIHByb2ZpbGUpIGRlY29kZXIuCisgKgorICogRFNQIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiAgU3RlZmFuIEdlaHJlciA8c3RlZmFuLmdlaHJlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJjYXZzZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBpbi1sb29wIGRlYmxvY2tpbmcgZmlsdGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUDIgcDBfcFstMypzdHJpZGVdCisjZGVmaW5lIFAxIHAwX3BbLTIqc3RyaWRlXQorI2RlZmluZSBQMCBwMF9wWy0xKnN0cmlkZV0KKyNkZWZpbmUgUTAgcDBfcFsgMCpzdHJpZGVdCisjZGVmaW5lIFExIHAwX3BbIDEqc3RyaWRlXQorI2RlZmluZSBRMiBwMF9wWyAyKnN0cmlkZV0KKworc3RhdGljIGlubGluZSB2b2lkIGxvb3BfZmlsdGVyX2wyKHVpbnQ4X3QgKnAwX3AsaW50IHN0cmlkZSxpbnQgYWxwaGEsIGludCBiZXRhKSB7CisgICAgaW50IHAwID0gUDA7CisgICAgaW50IHEwID0gUTA7CisKKyAgICBpZihhYnMocDAtcTApPGFscGhhICYmIGFicyhQMS1wMCk8YmV0YSAmJiBhYnMoUTEtcTApPGJldGEpIHsKKyAgICAgICAgaW50IHMgPSBwMCArIHEwICsgMjsKKyAgICAgICAgYWxwaGEgPSAoYWxwaGE+PjIpICsgMjsKKyAgICAgICAgaWYoYWJzKFAyLXAwKSA8IGJldGEgJiYgYWJzKHAwLXEwKSA8IGFscGhhKSB7CisgICAgICAgICAgICBQMCA9IChQMSArIHAwICsgcykgPj4gMjsKKyAgICAgICAgICAgIFAxID0gKDIqUDEgKyBzKSA+PiAyOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIFAwID0gKDIqUDEgKyBzKSA+PiAyOworICAgICAgICBpZihhYnMoUTItcTApIDwgYmV0YSAmJiBhYnMocTAtcDApIDwgYWxwaGEpIHsKKyAgICAgICAgICAgIFEwID0gKFExICsgcTAgKyBzKSA+PiAyOworICAgICAgICAgICAgUTEgPSAoMipRMSArIHMpID4+IDI7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgUTAgPSAoMipRMSArIHMpID4+IDI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbG9vcF9maWx0ZXJfbDEodWludDhfdCAqcDBfcCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwgaW50IHRjKSB7CisgICAgaW50IHAwID0gUDA7CisgICAgaW50IHEwID0gUTA7CisKKyAgICBpZihhYnMocDAtcTApPGFscGhhICYmIGFicyhQMS1wMCk8YmV0YSAmJiBhYnMoUTEtcTApPGJldGEpIHsKKyAgICAgICAgaW50IGRlbHRhID0gYXZfY2xpcCgoKHEwLXAwKSozK1AxLVExKzQpPj4zLC10YywgdGMpOworICAgICAgICBQMCA9IGF2X2NsaXBfdWludDgocDArZGVsdGEpOworICAgICAgICBRMCA9IGF2X2NsaXBfdWludDgocTAtZGVsdGEpOworICAgICAgICBpZihhYnMoUDItcDApPGJldGEpIHsKKyAgICAgICAgICAgIGRlbHRhID0gYXZfY2xpcCgoKFAwLVAxKSozK1AyLVEwKzQpPj4zLCAtdGMsIHRjKTsKKyAgICAgICAgICAgIFAxID0gYXZfY2xpcF91aW50OChQMStkZWx0YSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoYWJzKFEyLXEwKTxiZXRhKSB7CisgICAgICAgICAgICBkZWx0YSA9IGF2X2NsaXAoKChRMS1RMCkqMytQMC1RMis0KT4+MywgLXRjLCB0Yyk7CisgICAgICAgICAgICBRMSA9IGF2X2NsaXBfdWludDgoUTEtZGVsdGEpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbG9vcF9maWx0ZXJfYzIodWludDhfdCAqcDBfcCxpbnQgc3RyaWRlLGludCBhbHBoYSwgaW50IGJldGEpIHsKKyAgICBpbnQgcDAgPSBQMDsKKyAgICBpbnQgcTAgPSBRMDsKKworICAgIGlmKGFicyhwMC1xMCk8YWxwaGEgJiYgYWJzKFAxLXAwKTxiZXRhICYmIGFicyhRMS1xMCk8YmV0YSkgeworICAgICAgICBpbnQgcyA9IHAwICsgcTAgKyAyOworICAgICAgICBhbHBoYSA9IChhbHBoYT4+MikgKyAyOworICAgICAgICBpZihhYnMoUDItcDApIDwgYmV0YSAmJiBhYnMocDAtcTApIDwgYWxwaGEpIHsKKyAgICAgICAgICAgIFAwID0gKFAxICsgcDAgKyBzKSA+PiAyOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIFAwID0gKDIqUDEgKyBzKSA+PiAyOworICAgICAgICBpZihhYnMoUTItcTApIDwgYmV0YSAmJiBhYnMocTAtcDApIDwgYWxwaGEpIHsKKyAgICAgICAgICAgIFEwID0gKFExICsgcTAgKyBzKSA+PiAyOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIFEwID0gKDIqUTEgKyBzKSA+PiAyOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGxvb3BfZmlsdGVyX2MxKHVpbnQ4X3QgKnAwX3AsaW50IHN0cmlkZSxpbnQgYWxwaGEsIGludCBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YykgeworICAgIGlmKGFicyhQMC1RMCk8YWxwaGEgJiYgYWJzKFAxLVAwKTxiZXRhICYmIGFicyhRMS1RMCk8YmV0YSkgeworICAgICAgICBpbnQgZGVsdGEgPSBhdl9jbGlwKCgoUTAtUDApKjMrUDEtUTErNCk+PjMsIC10YywgdGMpOworICAgICAgICBQMCA9IGF2X2NsaXBfdWludDgoUDArZGVsdGEpOworICAgICAgICBRMCA9IGF2X2NsaXBfdWludDgoUTAtZGVsdGEpOworICAgIH0KK30KKworI3VuZGVmIFAwCisjdW5kZWYgUDEKKyN1bmRlZiBQMgorI3VuZGVmIFEwCisjdW5kZWYgUTEKKyN1bmRlZiBRMgorCitzdGF0aWMgdm9pZCBjYXZzX2ZpbHRlcl9sdl9jKHVpbnQ4X3QgKmQsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludCB0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiczEsIGludCBiczIpIHsKKyAgICBpbnQgaTsKKyAgICBpZihiczE9PTIpCisgICAgICAgIGZvcihpPTA7aTwxNjtpKyspCisgICAgICAgICAgICBsb29wX2ZpbHRlcl9sMihkICsgaSpzdHJpZGUsMSxhbHBoYSxiZXRhKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYoYnMxKQorICAgICAgICAgICAgZm9yKGk9MDtpPDg7aSsrKQorICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyX2wxKGQgKyBpKnN0cmlkZSwxLGFscGhhLGJldGEsdGMpOworICAgICAgICBpZiAoYnMyKQorICAgICAgICAgICAgZm9yKGk9ODtpPDE2O2krKykKKyAgICAgICAgICAgICAgICBsb29wX2ZpbHRlcl9sMShkICsgaSpzdHJpZGUsMSxhbHBoYSxiZXRhLHRjKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNhdnNfZmlsdGVyX2xoX2ModWludDhfdCAqZCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwgaW50IHRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJzMSwgaW50IGJzMikgeworICAgIGludCBpOworICAgIGlmKGJzMT09MikKKyAgICAgICAgZm9yKGk9MDtpPDE2O2krKykKKyAgICAgICAgICAgIGxvb3BfZmlsdGVyX2wyKGQgKyBpLHN0cmlkZSxhbHBoYSxiZXRhKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYoYnMxKQorICAgICAgICAgICAgZm9yKGk9MDtpPDg7aSsrKQorICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyX2wxKGQgKyBpLHN0cmlkZSxhbHBoYSxiZXRhLHRjKTsKKyAgICAgICAgaWYgKGJzMikKKyAgICAgICAgICAgIGZvcihpPTg7aTwxNjtpKyspCisgICAgICAgICAgICAgICAgbG9vcF9maWx0ZXJfbDEoZCArIGksc3RyaWRlLGFscGhhLGJldGEsdGMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2F2c19maWx0ZXJfY3ZfYyh1aW50OF90ICpkLCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnMxLCBpbnQgYnMyKSB7CisgICAgaW50IGk7CisgICAgaWYoYnMxPT0yKQorICAgICAgICBmb3IoaT0wO2k8ODtpKyspCisgICAgICAgICAgICBsb29wX2ZpbHRlcl9jMihkICsgaSpzdHJpZGUsMSxhbHBoYSxiZXRhKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYoYnMxKQorICAgICAgICAgICAgZm9yKGk9MDtpPDQ7aSsrKQorICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyX2MxKGQgKyBpKnN0cmlkZSwxLGFscGhhLGJldGEsdGMpOworICAgICAgICBpZiAoYnMyKQorICAgICAgICAgICAgZm9yKGk9NDtpPDg7aSsrKQorICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyX2MxKGQgKyBpKnN0cmlkZSwxLGFscGhhLGJldGEsdGMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2F2c19maWx0ZXJfY2hfYyh1aW50OF90ICpkLCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnMxLCBpbnQgYnMyKSB7CisgICAgaW50IGk7CisgICAgaWYoYnMxPT0yKQorICAgICAgICBmb3IoaT0wO2k8ODtpKyspCisgICAgICAgICAgICBsb29wX2ZpbHRlcl9jMihkICsgaSxzdHJpZGUsYWxwaGEsYmV0YSk7CisgICAgZWxzZSB7CisgICAgICAgIGlmKGJzMSkKKyAgICAgICAgICAgIGZvcihpPTA7aTw0O2krKykKKyAgICAgICAgICAgICAgICBsb29wX2ZpbHRlcl9jMShkICsgaSxzdHJpZGUsYWxwaGEsYmV0YSx0Yyk7CisgICAgICAgIGlmIChiczIpCisgICAgICAgICAgICBmb3IoaT00O2k8ODtpKyspCisgICAgICAgICAgICAgICAgbG9vcF9maWx0ZXJfYzEoZCArIGksc3RyaWRlLGFscGhhLGJldGEsdGMpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogaW52ZXJzZSB0cmFuc2Zvcm0KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgY2F2c19pZGN0OF9hZGRfYyh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKSB7CisgICAgaW50IGk7CisgICAgaW50MTZfdCAoKnNyYylbOF0gPSAoaW50MTZfdCgqKVs4XSlibG9jazsKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOworCisgICAgc3JjWzBdWzBdICs9IDg7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkgeworICAgICAgICBjb25zdCBpbnQgYTAgPSAgMypzcmNbaV1bMV0gLSAoc3JjW2ldWzddPDwxKTsKKyAgICAgICAgY29uc3QgaW50IGExID0gIDMqc3JjW2ldWzNdICsgKHNyY1tpXVs1XTw8MSk7CisgICAgICAgIGNvbnN0IGludCBhMiA9ICAoc3JjW2ldWzNdPDwxKSAtIDMqc3JjW2ldWzVdOworICAgICAgICBjb25zdCBpbnQgYTMgPSAgKHNyY1tpXVsxXTw8MSkgKyAzKnNyY1tpXVs3XTsKKworICAgICAgICBjb25zdCBpbnQgYjQgPSAoKGEwICsgYTEgKyBhMyk8PDEpICsgYTE7CisgICAgICAgIGNvbnN0IGludCBiNSA9ICgoYTAgLSBhMSArIGEyKTw8MSkgKyBhMDsKKyAgICAgICAgY29uc3QgaW50IGI2ID0gKChhMyAtIGEyIC0gYTEpPDwxKSArIGEzOworICAgICAgICBjb25zdCBpbnQgYjcgPSAoKGEwIC0gYTIgLSBhMyk8PDEpIC0gYTI7CisKKyAgICAgICAgY29uc3QgaW50IGE3ID0gKHNyY1tpXVsyXTw8MikgLSAxMCpzcmNbaV1bNl07CisgICAgICAgIGNvbnN0IGludCBhNiA9IChzcmNbaV1bNl08PDIpICsgMTAqc3JjW2ldWzJdOworICAgICAgICBjb25zdCBpbnQgYTUgPSAoKHNyY1tpXVswXSAtIHNyY1tpXVs0XSkgPDwgMykgKyA0OworICAgICAgICBjb25zdCBpbnQgYTQgPSAoKHNyY1tpXVswXSArIHNyY1tpXVs0XSkgPDwgMykgKyA0OworCisgICAgICAgIGNvbnN0IGludCBiMCA9IGE0ICsgYTY7CisgICAgICAgIGNvbnN0IGludCBiMSA9IGE1ICsgYTc7CisgICAgICAgIGNvbnN0IGludCBiMiA9IGE1IC0gYTc7CisgICAgICAgIGNvbnN0IGludCBiMyA9IGE0IC0gYTY7CisKKyAgICAgICAgc3JjW2ldWzBdID0gKGIwICsgYjQpID4+IDM7CisgICAgICAgIHNyY1tpXVsxXSA9IChiMSArIGI1KSA+PiAzOworICAgICAgICBzcmNbaV1bMl0gPSAoYjIgKyBiNikgPj4gMzsKKyAgICAgICAgc3JjW2ldWzNdID0gKGIzICsgYjcpID4+IDM7CisgICAgICAgIHNyY1tpXVs0XSA9IChiMyAtIGI3KSA+PiAzOworICAgICAgICBzcmNbaV1bNV0gPSAoYjIgLSBiNikgPj4gMzsKKyAgICAgICAgc3JjW2ldWzZdID0gKGIxIC0gYjUpID4+IDM7CisgICAgICAgIHNyY1tpXVs3XSA9IChiMCAtIGI0KSA+PiAzOworICAgIH0KKyAgICBmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkgeworICAgICAgICBjb25zdCBpbnQgYTAgPSAgMypzcmNbMV1baV0gLSAoc3JjWzddW2ldPDwxKTsKKyAgICAgICAgY29uc3QgaW50IGExID0gIDMqc3JjWzNdW2ldICsgKHNyY1s1XVtpXTw8MSk7CisgICAgICAgIGNvbnN0IGludCBhMiA9ICAoc3JjWzNdW2ldPDwxKSAtIDMqc3JjWzVdW2ldOworICAgICAgICBjb25zdCBpbnQgYTMgPSAgKHNyY1sxXVtpXTw8MSkgKyAzKnNyY1s3XVtpXTsKKworICAgICAgICBjb25zdCBpbnQgYjQgPSAoKGEwICsgYTEgKyBhMyk8PDEpICsgYTE7CisgICAgICAgIGNvbnN0IGludCBiNSA9ICgoYTAgLSBhMSArIGEyKTw8MSkgKyBhMDsKKyAgICAgICAgY29uc3QgaW50IGI2ID0gKChhMyAtIGEyIC0gYTEpPDwxKSArIGEzOworICAgICAgICBjb25zdCBpbnQgYjcgPSAoKGEwIC0gYTIgLSBhMyk8PDEpIC0gYTI7CisKKyAgICAgICAgY29uc3QgaW50IGE3ID0gKHNyY1syXVtpXTw8MikgLSAxMCpzcmNbNl1baV07CisgICAgICAgIGNvbnN0IGludCBhNiA9IChzcmNbNl1baV08PDIpICsgMTAqc3JjWzJdW2ldOworICAgICAgICBjb25zdCBpbnQgYTUgPSAoc3JjWzBdW2ldIC0gc3JjWzRdW2ldKSA8PCAzOworICAgICAgICBjb25zdCBpbnQgYTQgPSAoc3JjWzBdW2ldICsgc3JjWzRdW2ldKSA8PCAzOworCisgICAgICAgIGNvbnN0IGludCBiMCA9IGE0ICsgYTY7CisgICAgICAgIGNvbnN0IGludCBiMSA9IGE1ICsgYTc7CisgICAgICAgIGNvbnN0IGludCBiMiA9IGE1IC0gYTc7CisgICAgICAgIGNvbnN0IGludCBiMyA9IGE0IC0gYTY7CisKKyAgICAgICAgZHN0W2kgKyAwKnN0cmlkZV0gPSBjbVsgZHN0W2kgKyAwKnN0cmlkZV0gKyAoKGIwICsgYjQpID4+IDcpXTsKKyAgICAgICAgZHN0W2kgKyAxKnN0cmlkZV0gPSBjbVsgZHN0W2kgKyAxKnN0cmlkZV0gKyAoKGIxICsgYjUpID4+IDcpXTsKKyAgICAgICAgZHN0W2kgKyAyKnN0cmlkZV0gPSBjbVsgZHN0W2kgKyAyKnN0cmlkZV0gKyAoKGIyICsgYjYpID4+IDcpXTsKKyAgICAgICAgZHN0W2kgKyAzKnN0cmlkZV0gPSBjbVsgZHN0W2kgKyAzKnN0cmlkZV0gKyAoKGIzICsgYjcpID4+IDcpXTsKKyAgICAgICAgZHN0W2kgKyA0KnN0cmlkZV0gPSBjbVsgZHN0W2kgKyA0KnN0cmlkZV0gKyAoKGIzIC0gYjcpID4+IDcpXTsKKyAgICAgICAgZHN0W2kgKyA1KnN0cmlkZV0gPSBjbVsgZHN0W2kgKyA1KnN0cmlkZV0gKyAoKGIyIC0gYjYpID4+IDcpXTsKKyAgICAgICAgZHN0W2kgKyA2KnN0cmlkZV0gPSBjbVsgZHN0W2kgKyA2KnN0cmlkZV0gKyAoKGIxIC0gYjUpID4+IDcpXTsKKyAgICAgICAgZHN0W2kgKyA3KnN0cmlkZV0gPSBjbVsgZHN0W2kgKyA3KnN0cmlkZV0gKyAoKGIwIC0gYjQpID4+IDcpXTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG1vdGlvbiBjb21wZW5zYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDQVZTX1NVQlBJWChPUE5BTUUsIE9QLCBOQU1FLCBBLCBCLCBDLCBELCBFLCBGKSBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19maWx0OF9oXyAjIyBOQU1FKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgY29uc3QgaW50IGg9ODtcCisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDtcCisgICAgaW50IGk7XAorICAgIGZvcihpPTA7IGk8aDsgaSsrKVwKKyAgICB7XAorICAgICAgICBPUChkc3RbMF0sIEEqc3JjWy0yXSArIEIqc3JjWy0xXSArIEMqc3JjWzBdICsgRCpzcmNbMV0gKyBFKnNyY1syXSArIEYqc3JjWzNdKTtcCisgICAgICAgIE9QKGRzdFsxXSwgQSpzcmNbLTFdICsgQipzcmNbIDBdICsgQypzcmNbMV0gKyBEKnNyY1syXSArIEUqc3JjWzNdICsgRipzcmNbNF0pO1wKKyAgICAgICAgT1AoZHN0WzJdLCBBKnNyY1sgMF0gKyBCKnNyY1sgMV0gKyBDKnNyY1syXSArIEQqc3JjWzNdICsgRSpzcmNbNF0gKyBGKnNyY1s1XSk7XAorICAgICAgICBPUChkc3RbM10sIEEqc3JjWyAxXSArIEIqc3JjWyAyXSArIEMqc3JjWzNdICsgRCpzcmNbNF0gKyBFKnNyY1s1XSArIEYqc3JjWzZdKTtcCisgICAgICAgIE9QKGRzdFs0XSwgQSpzcmNbIDJdICsgQipzcmNbIDNdICsgQypzcmNbNF0gKyBEKnNyY1s1XSArIEUqc3JjWzZdICsgRipzcmNbN10pO1wKKyAgICAgICAgT1AoZHN0WzVdLCBBKnNyY1sgM10gKyBCKnNyY1sgNF0gKyBDKnNyY1s1XSArIEQqc3JjWzZdICsgRSpzcmNbN10gKyBGKnNyY1s4XSk7XAorICAgICAgICBPUChkc3RbNl0sIEEqc3JjWyA0XSArIEIqc3JjWyA1XSArIEMqc3JjWzZdICsgRCpzcmNbN10gKyBFKnNyY1s4XSArIEYqc3JjWzldKTtcCisgICAgICAgIE9QKGRzdFs3XSwgQSpzcmNbIDVdICsgQipzcmNbIDZdICsgQypzcmNbN10gKyBEKnNyY1s4XSArIEUqc3JjWzldICsgRipzcmNbMTBdKTtcCisgICAgICAgIGRzdCs9ZHN0U3RyaWRlO1wKKyAgICAgICAgc3JjKz1zcmNTdHJpZGU7XAorICAgIH1cCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfZmlsdDhfdl8gICMjIE5BTUUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKKyAgICBjb25zdCBpbnQgdz04O1wKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QO1wKKyAgICBpbnQgaTtcCisgICAgZm9yKGk9MDsgaTx3OyBpKyspXAorICAgIHtcCisgICAgICAgIGNvbnN0IGludCBzcmNCPSBzcmNbLTIqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmNBPSBzcmNbLTEqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMwPSBzcmNbMCAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMxPSBzcmNbMSAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMyPSBzcmNbMiAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMzPSBzcmNbMyAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM0PSBzcmNbNCAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM1PSBzcmNbNSAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM2PSBzcmNbNiAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM3PSBzcmNbNyAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM4PSBzcmNbOCAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM5PSBzcmNbOSAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMxMD0gc3JjWzEwICpzcmNTdHJpZGVdO1wKKyAgICAgICAgT1AoZHN0WzAqZHN0U3RyaWRlXSwgQSpzcmNCICsgQipzcmNBICsgQypzcmMwICsgRCpzcmMxICsgRSpzcmMyICsgRipzcmMzKTtcCisgICAgICAgIE9QKGRzdFsxKmRzdFN0cmlkZV0sIEEqc3JjQSArIEIqc3JjMCArIEMqc3JjMSArIEQqc3JjMiArIEUqc3JjMyArIEYqc3JjNCk7XAorICAgICAgICBPUChkc3RbMipkc3RTdHJpZGVdLCBBKnNyYzAgKyBCKnNyYzEgKyBDKnNyYzIgKyBEKnNyYzMgKyBFKnNyYzQgKyBGKnNyYzUpO1wKKyAgICAgICAgT1AoZHN0WzMqZHN0U3RyaWRlXSwgQSpzcmMxICsgQipzcmMyICsgQypzcmMzICsgRCpzcmM0ICsgRSpzcmM1ICsgRipzcmM2KTtcCisgICAgICAgIE9QKGRzdFs0KmRzdFN0cmlkZV0sIEEqc3JjMiArIEIqc3JjMyArIEMqc3JjNCArIEQqc3JjNSArIEUqc3JjNiArIEYqc3JjNyk7XAorICAgICAgICBPUChkc3RbNSpkc3RTdHJpZGVdLCBBKnNyYzMgKyBCKnNyYzQgKyBDKnNyYzUgKyBEKnNyYzYgKyBFKnNyYzcgKyBGKnNyYzgpO1wKKyAgICAgICAgT1AoZHN0WzYqZHN0U3RyaWRlXSwgQSpzcmM0ICsgQipzcmM1ICsgQypzcmM2ICsgRCpzcmM3ICsgRSpzcmM4ICsgRipzcmM5KTtcCisgICAgICAgIE9QKGRzdFs3KmRzdFN0cmlkZV0sIEEqc3JjNSArIEIqc3JjNiArIEMqc3JjNyArIEQqc3JjOCArIEUqc3JjOSArIEYqc3JjMTApO1wKKyAgICAgICAgZHN0Kys7XAorICAgICAgICBzcmMrKztcCisgICAgfVwKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19maWx0MTZfdl8gIyMgTkFNRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X3ZfICMjIE5BTUUoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X3ZfICMjIE5BTUUoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIHNyYyArPSA4KnNyY1N0cmlkZTtcCisgICAgZHN0ICs9IDgqZHN0U3RyaWRlO1wKKyAgICBPUE5BTUUgIyMgY2F2c19maWx0OF92XyAjIyBOQU1FKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBPUE5BTUUgIyMgY2F2c19maWx0OF92XyAjIyBOQU1FKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19maWx0MTZfaF8gIyMgTkFNRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X2hfICMjIE5BTUUoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X2hfICMjIE5BTUUoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIHNyYyArPSA4KnNyY1N0cmlkZTtcCisgICAgZHN0ICs9IDgqZHN0U3RyaWRlO1wKKyAgICBPUE5BTUUgIyMgY2F2c19maWx0OF9oXyAjIyBOQU1FKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBPUE5BTUUgIyMgY2F2c19maWx0OF9oXyAjIyBOQU1FKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKK31cCisKKyNkZWZpbmUgQ0FWU19TVUJQSVhfSFYoT1BOQU1FLCBPUCwgTkFNRSwgQUgsIEJILCBDSCwgREgsIEVILCBGSCwgQVYsIEJWLCBDViwgRFYsIEVWLCBGViwgRlVMTCkgXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfZmlsdDhfaHZfICMjIE5BTUUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgaW50MTZfdCB0ZW1wWzgqKDgrNSldO1wKKyAgICBpbnQxNl90ICp0bXAgPSB0ZW1wO1wKKyAgICBjb25zdCBpbnQgaD04O1wKKyAgICBjb25zdCBpbnQgdz04O1wKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QO1wKKyAgICBpbnQgaTtcCisgICAgc3JjMSAtPSAyKnNyY1N0cmlkZTtcCisgICAgZm9yKGk9MDsgaTxoKzU7IGkrKylcCisgICAge1wKKyAgICAgICAgdG1wWzBdPSBBSCpzcmMxWy0yXSArIEJIKnNyYzFbLTFdICsgQ0gqc3JjMVswXSArIERIKnNyYzFbMV0gKyBFSCpzcmMxWzJdICsgRkgqc3JjMVszXTtcCisgICAgICAgIHRtcFsxXT0gQUgqc3JjMVstMV0gKyBCSCpzcmMxWyAwXSArIENIKnNyYzFbMV0gKyBESCpzcmMxWzJdICsgRUgqc3JjMVszXSArIEZIKnNyYzFbNF07XAorICAgICAgICB0bXBbMl09IEFIKnNyYzFbIDBdICsgQkgqc3JjMVsgMV0gKyBDSCpzcmMxWzJdICsgREgqc3JjMVszXSArIEVIKnNyYzFbNF0gKyBGSCpzcmMxWzVdO1wKKyAgICAgICAgdG1wWzNdPSBBSCpzcmMxWyAxXSArIEJIKnNyYzFbIDJdICsgQ0gqc3JjMVszXSArIERIKnNyYzFbNF0gKyBFSCpzcmMxWzVdICsgRkgqc3JjMVs2XTtcCisgICAgICAgIHRtcFs0XT0gQUgqc3JjMVsgMl0gKyBCSCpzcmMxWyAzXSArIENIKnNyYzFbNF0gKyBESCpzcmMxWzVdICsgRUgqc3JjMVs2XSArIEZIKnNyYzFbN107XAorICAgICAgICB0bXBbNV09IEFIKnNyYzFbIDNdICsgQkgqc3JjMVsgNF0gKyBDSCpzcmMxWzVdICsgREgqc3JjMVs2XSArIEVIKnNyYzFbN10gKyBGSCpzcmMxWzhdO1wKKyAgICAgICAgdG1wWzZdPSBBSCpzcmMxWyA0XSArIEJIKnNyYzFbIDVdICsgQ0gqc3JjMVs2XSArIERIKnNyYzFbN10gKyBFSCpzcmMxWzhdICsgRkgqc3JjMVs5XTtcCisgICAgICAgIHRtcFs3XT0gQUgqc3JjMVsgNV0gKyBCSCpzcmMxWyA2XSArIENIKnNyYzFbN10gKyBESCpzcmMxWzhdICsgRUgqc3JjMVs5XSArIEZIKnNyYzFbMTBdO1wKKyAgICAgICAgdG1wKz04O1wKKyAgICAgICAgc3JjMSs9c3JjU3RyaWRlO1wKKyAgICB9XAorICAgIGlmKEZVTEwpIHtcCisgICAgICB0bXAgPSB0ZW1wKzgqMjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmb3IoaT0wOyBpPHc7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY29uc3QgaW50IHRtcEI9IHRtcFstMio4XTsgICAgXAorICAgICAgICAgIGNvbnN0IGludCB0bXBBPSB0bXBbLTEqOF07ICAgIFwKKyAgICAgICAgICBjb25zdCBpbnQgdG1wMD0gdG1wWzAgKjhdOyAgICBcCisgICAgICAgICAgY29uc3QgaW50IHRtcDE9IHRtcFsxICo4XTsgICAgXAorICAgICAgICAgIGNvbnN0IGludCB0bXAyPSB0bXBbMiAqOF07ICAgIFwKKyAgICAgICAgICBjb25zdCBpbnQgdG1wMz0gdG1wWzMgKjhdOyAgICBcCisgICAgICAgICAgY29uc3QgaW50IHRtcDQ9IHRtcFs0ICo4XTsgICAgXAorICAgICAgICAgIGNvbnN0IGludCB0bXA1PSB0bXBbNSAqOF07ICAgIFwKKyAgICAgICAgICBjb25zdCBpbnQgdG1wNj0gdG1wWzYgKjhdOyAgICBcCisgICAgICAgICAgY29uc3QgaW50IHRtcDc9IHRtcFs3ICo4XTsgICAgXAorICAgICAgICAgIGNvbnN0IGludCB0bXA4PSB0bXBbOCAqOF07ICAgIFwKKyAgICAgICAgICBjb25zdCBpbnQgdG1wOT0gdG1wWzkgKjhdOyAgICBcCisgICAgICAgICAgY29uc3QgaW50IHRtcDEwPXRtcFsxMCo4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIE9QKGRzdFswKmRzdFN0cmlkZV0sIEFWKnRtcEIgKyBCVip0bXBBICsgQ1YqdG1wMCArIERWKnRtcDEgKyBFVip0bXAyICsgRlYqdG1wMyArIDY0KnNyYzJbMCpzcmNTdHJpZGVdKTsgXAorICAgICAgICAgIE9QKGRzdFsxKmRzdFN0cmlkZV0sIEFWKnRtcEEgKyBCVip0bXAwICsgQ1YqdG1wMSArIERWKnRtcDIgKyBFVip0bXAzICsgRlYqdG1wNCArIDY0KnNyYzJbMSpzcmNTdHJpZGVdKTsgXAorICAgICAgICAgIE9QKGRzdFsyKmRzdFN0cmlkZV0sIEFWKnRtcDAgKyBCVip0bXAxICsgQ1YqdG1wMiArIERWKnRtcDMgKyBFVip0bXA0ICsgRlYqdG1wNSArIDY0KnNyYzJbMipzcmNTdHJpZGVdKTsgXAorICAgICAgICAgIE9QKGRzdFszKmRzdFN0cmlkZV0sIEFWKnRtcDEgKyBCVip0bXAyICsgQ1YqdG1wMyArIERWKnRtcDQgKyBFVip0bXA1ICsgRlYqdG1wNiArIDY0KnNyYzJbMypzcmNTdHJpZGVdKTsgXAorICAgICAgICAgIE9QKGRzdFs0KmRzdFN0cmlkZV0sIEFWKnRtcDIgKyBCVip0bXAzICsgQ1YqdG1wNCArIERWKnRtcDUgKyBFVip0bXA2ICsgRlYqdG1wNyArIDY0KnNyYzJbNCpzcmNTdHJpZGVdKTsgXAorICAgICAgICAgIE9QKGRzdFs1KmRzdFN0cmlkZV0sIEFWKnRtcDMgKyBCVip0bXA0ICsgQ1YqdG1wNSArIERWKnRtcDYgKyBFVip0bXA3ICsgRlYqdG1wOCArIDY0KnNyYzJbNSpzcmNTdHJpZGVdKTsgXAorICAgICAgICAgIE9QKGRzdFs2KmRzdFN0cmlkZV0sIEFWKnRtcDQgKyBCVip0bXA1ICsgQ1YqdG1wNiArIERWKnRtcDcgKyBFVip0bXA4ICsgRlYqdG1wOSArIDY0KnNyYzJbNipzcmNTdHJpZGVdKTsgXAorICAgICAgICAgIE9QKGRzdFs3KmRzdFN0cmlkZV0sIEFWKnRtcDUgKyBCVip0bXA2ICsgQ1YqdG1wNyArIERWKnRtcDggKyBFVip0bXA5ICsgRlYqdG1wMTAgKyA2NCpzcmMyWzcqc3JjU3RyaWRlXSk7IFwKKyAgICAgICAgICBkc3QrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB0bXArKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBzcmMyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2Uge1wKKyAgICAgIHRtcCA9IHRlbXArOCoyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvcihpPTA7IGk8dzsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBjb25zdCBpbnQgdG1wQj0gdG1wWy0yKjhdOyAgICBcCisgICAgICAgICAgY29uc3QgaW50IHRtcEE9IHRtcFstMSo4XTsgICAgXAorICAgICAgICAgIGNvbnN0IGludCB0bXAwPSB0bXBbMCAqOF07ICAgIFwKKyAgICAgICAgICBjb25zdCBpbnQgdG1wMT0gdG1wWzEgKjhdOyAgICBcCisgICAgICAgICAgY29uc3QgaW50IHRtcDI9IHRtcFsyICo4XTsgICAgXAorICAgICAgICAgIGNvbnN0IGludCB0bXAzPSB0bXBbMyAqOF07ICAgIFwKKyAgICAgICAgICBjb25zdCBpbnQgdG1wND0gdG1wWzQgKjhdOyAgICBcCisgICAgICAgICAgY29uc3QgaW50IHRtcDU9IHRtcFs1ICo4XTsgICAgXAorICAgICAgICAgIGNvbnN0IGludCB0bXA2PSB0bXBbNiAqOF07ICAgIFwKKyAgICAgICAgICBjb25zdCBpbnQgdG1wNz0gdG1wWzcgKjhdOyAgICBcCisgICAgICAgICAgY29uc3QgaW50IHRtcDg9IHRtcFs4ICo4XTsgICAgXAorICAgICAgICAgIGNvbnN0IGludCB0bXA5PSB0bXBbOSAqOF07ICAgIFwKKyAgICAgICAgICBjb25zdCBpbnQgdG1wMTA9dG1wWzEwKjhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgT1AoZHN0WzAqZHN0U3RyaWRlXSwgQVYqdG1wQiArIEJWKnRtcEEgKyBDVip0bXAwICsgRFYqdG1wMSArIEVWKnRtcDIgKyBGVip0bXAzKTsgXAorICAgICAgICAgIE9QKGRzdFsxKmRzdFN0cmlkZV0sIEFWKnRtcEEgKyBCVip0bXAwICsgQ1YqdG1wMSArIERWKnRtcDIgKyBFVip0bXAzICsgRlYqdG1wNCk7IFwKKyAgICAgICAgICBPUChkc3RbMipkc3RTdHJpZGVdLCBBVip0bXAwICsgQlYqdG1wMSArIENWKnRtcDIgKyBEVip0bXAzICsgRVYqdG1wNCArIEZWKnRtcDUpOyBcCisgICAgICAgICAgT1AoZHN0WzMqZHN0U3RyaWRlXSwgQVYqdG1wMSArIEJWKnRtcDIgKyBDVip0bXAzICsgRFYqdG1wNCArIEVWKnRtcDUgKyBGVip0bXA2KTsgXAorICAgICAgICAgIE9QKGRzdFs0KmRzdFN0cmlkZV0sIEFWKnRtcDIgKyBCVip0bXAzICsgQ1YqdG1wNCArIERWKnRtcDUgKyBFVip0bXA2ICsgRlYqdG1wNyk7IFwKKyAgICAgICAgICBPUChkc3RbNSpkc3RTdHJpZGVdLCBBVip0bXAzICsgQlYqdG1wNCArIENWKnRtcDUgKyBEVip0bXA2ICsgRVYqdG1wNyArIEZWKnRtcDgpOyBcCisgICAgICAgICAgT1AoZHN0WzYqZHN0U3RyaWRlXSwgQVYqdG1wNCArIEJWKnRtcDUgKyBDVip0bXA2ICsgRFYqdG1wNyArIEVWKnRtcDggKyBGVip0bXA5KTsgXAorICAgICAgICAgIE9QKGRzdFs3KmRzdFN0cmlkZV0sIEFWKnRtcDUgKyBCVip0bXA2ICsgQ1YqdG1wNyArIERWKnRtcDggKyBFVip0bXA5ICsgRlYqdG1wMTApOyBcCisgICAgICAgICAgZHN0Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdG1wKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfVwKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19maWx0MTZfaHZfICMjIE5BTUUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXsgXAorICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X2h2XyAjIyBOQU1FKGRzdCAgLCBzcmMxLCAgIHNyYzIgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpOyBcCisgICAgT1BOQU1FICMjIGNhdnNfZmlsdDhfaHZfICMjIE5BTUUoZHN0KzgsIHNyYzErOCwgc3JjMis4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7IFwKKyAgICBzcmMxICs9IDgqc3JjU3RyaWRlO1wKKyAgICBzcmMyICs9IDgqc3JjU3RyaWRlO1wKKyAgICBkc3QgKz0gOCpkc3RTdHJpZGU7XAorICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X2h2XyAjIyBOQU1FKGRzdCAgLCBzcmMxLCAgIHNyYzIgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpOyBcCisgICAgT1BOQU1FICMjIGNhdnNfZmlsdDhfaHZfICMjIE5BTUUoZHN0KzgsIHNyYzErOCwgc3JjMis4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7IFwKK31cCisKKyNkZWZpbmUgQ0FWU19NQyhPUE5BTUUsIFNJWkUpIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWwgIyMgU0laRSAjIyBfbWMxMF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgT1BOQU1FICMjIGNhdnNfZmlsdCAjIyBTSVpFICMjIF9oX3FwZWxfbChkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsICMjIFNJWkUgIyMgX21jMjBfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQgIyMgU0laRSAjIyBfaF9ocGVsKGRzdCwgc3JjLCBzdHJpZGUsIHN0cmlkZSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWwgIyMgU0laRSAjIyBfbWMzMF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgT1BOQU1FICMjIGNhdnNfZmlsdCAjIyBTSVpFICMjIF9oX3FwZWxfcihkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsICMjIFNJWkUgIyMgX21jMDFfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQgIyMgU0laRSAjIyBfdl9xcGVsX2woZHN0LCBzcmMsIHN0cmlkZSwgc3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbCAjIyBTSVpFICMjIF9tYzAyX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBPUE5BTUUgIyMgY2F2c19maWx0ICMjIFNJWkUgIyMgX3ZfaHBlbChkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsICMjIFNJWkUgIyMgX21jMDNfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQgIyMgU0laRSAjIyBfdl9xcGVsX3IoZHN0LCBzcmMsIHN0cmlkZSwgc3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbCAjIyBTSVpFICMjIF9tYzIyX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgT1BOQU1FICMjIGNhdnNfZmlsdCAjIyBTSVpFICMjIF9odl9qaihkc3QsIHNyYywgTlVMTCwgc3RyaWRlLCBzdHJpZGUpOyBcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbCAjIyBTSVpFICMjIF9tYzExX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgT1BOQU1FICMjIGNhdnNfZmlsdCAjIyBTSVpFICMjIF9odl9lZ3ByKGRzdCwgc3JjLCBzcmMsIHN0cmlkZSwgc3RyaWRlKTsgXAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWwgIyMgU0laRSAjIyBfbWMxM19jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgIE9QTkFNRSAjIyBjYXZzX2ZpbHQgIyMgU0laRSAjIyBfaHZfZWdwcihkc3QsIHNyYywgc3JjK3N0cmlkZSwgc3RyaWRlLCBzdHJpZGUpOyBcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbCAjIyBTSVpFICMjIF9tYzMxX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgT1BOQU1FICMjIGNhdnNfZmlsdCAjIyBTSVpFICMjIF9odl9lZ3ByKGRzdCwgc3JjLCBzcmMrMSwgc3RyaWRlLCBzdHJpZGUpOyBcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbCAjIyBTSVpFICMjIF9tYzMzX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgT1BOQU1FICMjIGNhdnNfZmlsdCAjIyBTSVpFICMjIF9odl9lZ3ByKGRzdCwgc3JjLCBzcmMrc3RyaWRlKzEsc3RyaWRlLCBzdHJpZGUpOyBcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbCAjIyBTSVpFICMjIF9tYzIxX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgT1BOQU1FICMjIGNhdnNfZmlsdCAjIyBTSVpFICMjIF9odl9mZihkc3QsIHNyYywgc3JjK3N0cmlkZSsxLHN0cmlkZSwgc3RyaWRlKTsgXAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWwgIyMgU0laRSAjIyBfbWMxMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgIE9QTkFNRSAjIyBjYXZzX2ZpbHQgIyMgU0laRSAjIyBfaHZfaWkoZHN0LCBzcmMsIHNyYytzdHJpZGUrMSxzdHJpZGUsIHN0cmlkZSk7IFwKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsICMjIFNJWkUgIyMgX21jMzJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICBPUE5BTUUgIyMgY2F2c19maWx0ICMjIFNJWkUgIyMgX2h2X2trKGRzdCwgc3JjLCBzcmMrc3RyaWRlKzEsc3RyaWRlLCBzdHJpZGUpOyBcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbCAjIyBTSVpFICMjIF9tYzIzX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgT1BOQU1FICMjIGNhdnNfZmlsdCAjIyBTSVpFICMjIF9odl9xcShkc3QsIHNyYywgc3JjK3N0cmlkZSsxLHN0cmlkZSwgc3RyaWRlKTsgXAorfVwKKworI2RlZmluZSBvcF9wdXQxKGEsIGIpICBhID0gY21bKChiKSs0KT4+M10KKyNkZWZpbmUgb3BfcHV0MihhLCBiKSAgYSA9IGNtWygoYikrNjQpPj43XQorI2RlZmluZSBvcF9wdXQzKGEsIGIpICBhID0gY21bKChiKSszMik+PjZdCisjZGVmaW5lIG9wX3B1dDQoYSwgYikgIGEgPSBjbVsoKGIpKzUxMik+PjEwXQorI2RlZmluZSBvcF9hdmcxKGEsIGIpICBhID0gKChhKStjbVsoKGIpKzQpPj4zXSAgICsxKT4+MQorI2RlZmluZSBvcF9hdmcyKGEsIGIpICBhID0gKChhKStjbVsoKGIpKzY0KT4+N10gICsxKT4+MQorI2RlZmluZSBvcF9hdmczKGEsIGIpICBhID0gKChhKStjbVsoKGIpKzMyKT4+Nl0gICsxKT4+MQorI2RlZmluZSBvcF9hdmc0KGEsIGIpICBhID0gKChhKStjbVsoKGIpKzUxMik+PjEwXSsxKT4+MQorQ0FWU19TVUJQSVgocHV0XyAgICwgb3BfcHV0MSwgaHBlbCwgICAgMCwgLTEsICA1LCAgNSwgLTEsICAwKQorQ0FWU19TVUJQSVgocHV0XyAgICwgb3BfcHV0MiwgcXBlbF9sLCAtMSwgLTIsIDk2LCA0MiwgLTcsICAwKQorQ0FWU19TVUJQSVgocHV0XyAgICwgb3BfcHV0MiwgcXBlbF9yLCAgMCwgLTcsIDQyLCA5NiwgLTIsIC0xKQorQ0FWU19TVUJQSVhfSFYocHV0Xywgb3BfcHV0MywgamosICAgICAgMCwgLTEsICA1LCAgNSwgLTEsICAwLCAgMCwgLTEsICA1LCAgNSwgLTEsIDAsIDApCitDQVZTX1NVQlBJWF9IVihwdXRfLCBvcF9wdXQ0LCBmZiwgICAgICAwLCAtMSwgIDUsICA1LCAtMSwgIDAsIC0xLCAtMiwgOTYsIDQyLCAtNywgMCwgMCkKK0NBVlNfU1VCUElYX0hWKHB1dF8sIG9wX3B1dDQsIGlpLCAgICAgLTEsIC0yLCA5NiwgNDIsIC03LCAgMCwgIDAsIC0xLCAgNSwgIDUsIC0xLCAwLCAwKQorQ0FWU19TVUJQSVhfSFYocHV0Xywgb3BfcHV0NCwga2ssICAgICAgMCwgLTcsIDQyLCA5NiwgLTIsIC0xLCAgMCwgLTEsICA1LCAgNSwgLTEsIDAsIDApCitDQVZTX1NVQlBJWF9IVihwdXRfLCBvcF9wdXQ0LCBxcSwgICAgICAwLCAtMSwgIDUsICA1LCAtMSwgIDAsICAwLCAtNywgNDIsIDk2LCAtMiwtMSwgMCkKK0NBVlNfU1VCUElYX0hWKHB1dF8sIG9wX3B1dDIsIGVncHIsICAgIDAsIC0xLCAgNSwgIDUsIC0xLCAgMCwgIDAsIC0xLCAgNSwgIDUsIC0xLCAwLCAxKQorQ0FWU19TVUJQSVgoYXZnXyAgICwgb3BfYXZnMSwgaHBlbCwgICAgMCwgLTEsICA1LCAgNSwgLTEsICAwKQorQ0FWU19TVUJQSVgoYXZnXyAgICwgb3BfYXZnMiwgcXBlbF9sLCAtMSwgLTIsIDk2LCA0MiwgLTcsICAwKQorQ0FWU19TVUJQSVgoYXZnXyAgICwgb3BfYXZnMiwgcXBlbF9yLCAgMCwgLTcsIDQyLCA5NiwgLTIsIC0xKQorQ0FWU19TVUJQSVhfSFYoYXZnXywgb3BfYXZnMywgamosICAgICAgMCwgLTEsICA1LCAgNSwgLTEsICAwLCAgMCwgLTEsICA1LCAgNSwgLTEsIDAsIDApCitDQVZTX1NVQlBJWF9IVihhdmdfLCBvcF9hdmc0LCBmZiwgICAgICAwLCAtMSwgIDUsICA1LCAtMSwgIDAsIC0xLCAtMiwgOTYsIDQyLCAtNywgMCwgMCkKK0NBVlNfU1VCUElYX0hWKGF2Z18sIG9wX2F2ZzQsIGlpLCAgICAgLTEsIC0yLCA5NiwgNDIsIC03LCAgMCwgIDAsIC0xLCAgNSwgIDUsIC0xLCAwLCAwKQorQ0FWU19TVUJQSVhfSFYoYXZnXywgb3BfYXZnNCwga2ssICAgICAgMCwgLTcsIDQyLCA5NiwgLTIsIC0xLCAgMCwgLTEsICA1LCAgNSwgLTEsIDAsIDApCitDQVZTX1NVQlBJWF9IVihhdmdfLCBvcF9hdmc0LCBxcSwgICAgICAwLCAtMSwgIDUsICA1LCAtMSwgIDAsICAwLCAtNywgNDIsIDk2LCAtMiwtMSwgMCkKK0NBVlNfU1VCUElYX0hWKGF2Z18sIG9wX2F2ZzIsIGVncHIsICAgIDAsIC0xLCAgNSwgIDUsIC0xLCAgMCwgIDAsIC0xLCAgNSwgIDUsIC0xLCAwLCAxKQorQ0FWU19NQyhwdXRfLCA4KQorQ0FWU19NQyhwdXRfLCAxNikKK0NBVlNfTUMoYXZnXywgOCkKK0NBVlNfTUMoYXZnXywgMTYpCisKKyNkZWZpbmUgcHV0X2NhdnNfcXBlbDhfbWMwMF9jICBmZl9wdXRfcGl4ZWxzOHg4X2MKKyNkZWZpbmUgYXZnX2NhdnNfcXBlbDhfbWMwMF9jICBmZl9hdmdfcGl4ZWxzOHg4X2MKKyNkZWZpbmUgcHV0X2NhdnNfcXBlbDE2X21jMDBfYyBmZl9wdXRfcGl4ZWxzMTZ4MTZfYworI2RlZmluZSBhdmdfY2F2c19xcGVsMTZfbWMwMF9jIGZmX2F2Z19waXhlbHMxNngxNl9jCisKK2F2X2NvbGQgdm9pZCBmZl9jYXZzZHNwX2luaXQoQ0FWU0RTUENvbnRleHQqIGMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkgeworI2RlZmluZSBkc3BmdW5jKFBGWCwgSURYLCBOVU0pIFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgMF0gPSBQRlggIyMgTlVNICMjIF9tYzAwX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgMV0gPSBQRlggIyMgTlVNICMjIF9tYzEwX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgMl0gPSBQRlggIyMgTlVNICMjIF9tYzIwX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgM10gPSBQRlggIyMgTlVNICMjIF9tYzMwX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgNF0gPSBQRlggIyMgTlVNICMjIF9tYzAxX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgNV0gPSBQRlggIyMgTlVNICMjIF9tYzExX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgNl0gPSBQRlggIyMgTlVNICMjIF9tYzIxX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgN10gPSBQRlggIyMgTlVNICMjIF9tYzMxX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgOF0gPSBQRlggIyMgTlVNICMjIF9tYzAyX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgOV0gPSBQRlggIyMgTlVNICMjIF9tYzEyX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxMF0gPSBQRlggIyMgTlVNICMjIF9tYzIyX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxMV0gPSBQRlggIyMgTlVNICMjIF9tYzMyX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxMl0gPSBQRlggIyMgTlVNICMjIF9tYzAzX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxM10gPSBQRlggIyMgTlVNICMjIF9tYzEzX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxNF0gPSBQRlggIyMgTlVNICMjIF9tYzIzX2M7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxNV0gPSBQRlggIyMgTlVNICMjIF9tYzMzX2MKKyAgICBkc3BmdW5jKHB1dF9jYXZzX3FwZWwsIDAsIDE2KTsKKyAgICBkc3BmdW5jKHB1dF9jYXZzX3FwZWwsIDEsIDgpOworICAgIGRzcGZ1bmMoYXZnX2NhdnNfcXBlbCwgMCwgMTYpOworICAgIGRzcGZ1bmMoYXZnX2NhdnNfcXBlbCwgMSwgOCk7CisgICAgYy0+Y2F2c19maWx0ZXJfbHYgPSBjYXZzX2ZpbHRlcl9sdl9jOworICAgIGMtPmNhdnNfZmlsdGVyX2xoID0gY2F2c19maWx0ZXJfbGhfYzsKKyAgICBjLT5jYXZzX2ZpbHRlcl9jdiA9IGNhdnNfZmlsdGVyX2N2X2M7CisgICAgYy0+Y2F2c19maWx0ZXJfY2ggPSBjYXZzX2ZpbHRlcl9jaF9jOworICAgIGMtPmNhdnNfaWRjdDhfYWRkID0gY2F2c19pZGN0OF9hZGRfYzsKKyAgICBjLT5pZGN0X3Blcm0gPSBGRl9JRENUX1BFUk1fTk9ORTsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfY2F2c2RzcF9pbml0X3g4NihjLCBhdmN0eCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jYXZzZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy9jYXZzZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3ZjVjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NhdnNkc3AuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ2hpbmVzZSBBVlMgdmlkZW8gKEFWUzEtUDIsIEppWmh1biBwcm9maWxlKSBkZWNvZGVyLgorICogQ29weXJpZ2h0IChjKSAyMDA2ICBTdGVmYW4gR2VocmVyIDxzdGVmYW4uZ2VocmVyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0NBVlNEU1BfSAorI2RlZmluZSBBVkNPREVDX0NBVlNEU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAicXBlbGRzcC5oIgorCit0eXBlZGVmIHN0cnVjdCBDQVZTRFNQQ29udGV4dCB7CisgICAgcXBlbF9tY19mdW5jIHB1dF9jYXZzX3FwZWxfcGl4ZWxzX3RhYlsyXVsxNl07CisgICAgcXBlbF9tY19mdW5jIGF2Z19jYXZzX3FwZWxfcGl4ZWxzX3RhYlsyXVsxNl07CisgICAgdm9pZCAoKmNhdnNfZmlsdGVyX2x2KSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludCB0YywgaW50IGJzMSwgaW50IGJzMik7CisgICAgdm9pZCAoKmNhdnNfZmlsdGVyX2xoKSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludCB0YywgaW50IGJzMSwgaW50IGJzMik7CisgICAgdm9pZCAoKmNhdnNfZmlsdGVyX2N2KSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludCB0YywgaW50IGJzMSwgaW50IGJzMik7CisgICAgdm9pZCAoKmNhdnNfZmlsdGVyX2NoKSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludCB0YywgaW50IGJzMSwgaW50IGJzMik7CisgICAgdm9pZCAoKmNhdnNfaWRjdDhfYWRkKSh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKTsKKyAgICBpbnQgaWRjdF9wZXJtOworfSBDQVZTRFNQQ29udGV4dDsKKwordm9pZCBmZl9jYXZzZHNwX2luaXQoQ0FWU0RTUENvbnRleHQqIGMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cit2b2lkIGZmX2NhdnNkc3BfaW5pdF94ODYoQ0FWU0RTUENvbnRleHQqIGMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0NBVlNEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2JydF90YWJsZWdlbi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2JydF90YWJsZWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYThlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jYnJ0X3RhYmxlZ2VuLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIEdlbmVyYXRlIGEgaGVhZGVyIGZpbGUgZm9yIGhhcmRjb2RlZCBBQUMgY3ViZS1yb290IHRhYmxlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMgMAorI2luY2x1ZGUgImNicnRfdGFibGVnZW4uaCIKKyNpbmNsdWRlICJ0YWJsZXByaW50LmgiCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgY2JydF90YWJsZWluaXQoKTsKKworICAgIHdyaXRlX2ZpbGVoZWFkZXIoKTsKKworICAgIFdSSVRFX0FSUkFZKCJzdGF0aWMgY29uc3QiLCB1aW50MzJfdCwgY2JydF90YWIpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jYnJ0X3RhYmxlZ2VuLmggYi9mZm1wZWcvbGliYXZjb2RlYy9jYnJ0X3RhYmxlZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjNzdjMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NicnRfdGFibGVnZW4uaApAQCAtMCwwICsxLDUzIEBACisvKgorICogSGVhZGVyIGZpbGUgZm9yIGhhcmRjb2RlZCBBQUMgY3ViZS1yb290IHRhYmxlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19DQlJUX1RBQkxFR0VOX0gKKyNkZWZpbmUgQVZDT0RFQ19DQlJUX1RBQkxFR0VOX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorCisjaWYgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKKyNkZWZpbmUgY2JydF90YWJsZWluaXQoKQorI2luY2x1ZGUgImxpYmF2Y29kZWMvY2JydF90YWJsZXMuaCIKKyNlbHNlCitzdGF0aWMgdWludDMyX3QgY2JydF90YWJbMSA8PCAxM107CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgY2JydF90YWJsZWluaXQodm9pZCkKK3sKKyAgICBpZiAoIWNicnRfdGFiWygxPDwxMykgLSAxXSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgLyogY2JydGYoKSBpc24ndCBhdmFpbGFibGUgb24gYWxsIHN5c3RlbXMsIHNvIHdlIHVzZSBwb3dmKCkuICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxPDwxMzsgaSsrKSB7CisgICAgICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgZmxvYXQgZjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpOworICAgICAgICAgICAgfSBmOworICAgICAgICAgICAgZi5mID0gcG93KGksIDEuMCAvIDMuMCkgKiBpOworICAgICAgICAgICAgY2JydF90YWJbaV0gPSBmLmk7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLyogQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMgKi8KKworI2VuZGlmIC8qIEFWQ09ERUNfQ0JSVF9UQUJMRUdFTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jZGdyYXBoaWNzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9jZGdyYXBoaWNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwZGY0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NkZ3JhcGhpY3MuYwpAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIENEIEdyYXBoaWNzIFZpZGVvIERlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBNaWNoYWVsIFRpc29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qKgorICogQGZpbGUKKyAqIEBicmllZiBDRCBHcmFwaGljcyBWaWRlbyBEZWNvZGVyCisgKiBAYXV0aG9yIE1pY2hhZWwgVGlzb24KKyAqIEBzZWUgaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9Q0RfR3JhcGhpY3MKKyAqIEBzZWUgaHR0cDovL3d3dy5jY3MubmV1LmVkdS9ob21lL2JjaGFmeS9jZGIvaW5mby9jZGcKKyAqLworCisvLy8gZGVmYXVsdCBzY3JlZW4gc2l6ZXMKKyNkZWZpbmUgQ0RHX0ZVTExfV0lEVEggICAgICAgICAgIDMwMAorI2RlZmluZSBDREdfRlVMTF9IRUlHSFQgICAgICAgICAgMjE2CisjZGVmaW5lIENER19ESVNQTEFZX1dJRFRIICAgICAgICAyOTQKKyNkZWZpbmUgQ0RHX0RJU1BMQVlfSEVJR0hUICAgICAgIDIwNAorI2RlZmluZSBDREdfQk9SREVSX1dJRFRIICAgICAgICAgICA2CisjZGVmaW5lIENER19CT1JERVJfSEVJR0hUICAgICAgICAgMTIKKworLy8vIG1hc2tzCisjZGVmaW5lIENER19DT01NQU5EICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgQ0RHX01BU0sgICAgICAgICAgICAgICAgMHgzRgorCisvLy8gaW5zdHJ1Y3Rpb24gY29kZXMKKyNkZWZpbmUgQ0RHX0lOU1RfTUVNT1JZX1BSRVNFVCAgICAgMQorI2RlZmluZSBDREdfSU5TVF9CT1JERVJfUFJFU0VUICAgICAyCisjZGVmaW5lIENER19JTlNUX1RJTEVfQkxPQ0sgICAgICAgIDYKKyNkZWZpbmUgQ0RHX0lOU1RfU0NST0xMX1BSRVNFVCAgICAyMAorI2RlZmluZSBDREdfSU5TVF9TQ1JPTExfQ09QWSAgICAgIDI0CisjZGVmaW5lIENER19JTlNUX0xPQURfUEFMX0xPICAgICAgMzAKKyNkZWZpbmUgQ0RHX0lOU1RfTE9BRF9QQUxfSElHSCAgICAzMQorI2RlZmluZSBDREdfSU5TVF9USUxFX0JMT0NLX1hPUiAgIDM4CisKKy8vLyBkYXRhIHNpemVzCisjZGVmaW5lIENER19QQUNLRVRfU0laRSAgICAgICAgICAgMjQKKyNkZWZpbmUgQ0RHX0RBVEFfU0laRSAgICAgICAgICAgICAxNgorI2RlZmluZSBDREdfVElMRV9IRUlHSFQgICAgICAgICAgIDEyCisjZGVmaW5lIENER19USUxFX1dJRFRIICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ0RHX01JTklNVU1fUEtUX1NJWkUgICAgICAgNgorI2RlZmluZSBDREdfTUlOSU1VTV9TQ1JPTExfU0laRSAgICAzCisjZGVmaW5lIENER19IRUFERVJfU0laRSAgICAgICAgICAgIDgKKyNkZWZpbmUgQ0RHX1BBTEVUVEVfU0laRSAgICAgICAgICAxNgorCit0eXBlZGVmIHN0cnVjdCBDREdyYXBoaWNzQ29udGV4dCB7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgaW50IGhzY3JvbGw7CisgICAgaW50IHZzY3JvbGw7Cit9IENER3JhcGhpY3NDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgY2RnX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDREdyYXBoaWNzQ29udGV4dCAqY2MgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgY2MtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWNjLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2Y3R4LT53aWR0aCAgID0gQ0RHX0ZVTExfV0lEVEg7CisgICAgYXZjdHgtPmhlaWdodCAgPSBDREdfRlVMTF9IRUlHSFQ7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2RnX2JvcmRlcl9wcmVzZXQoQ0RHcmFwaGljc0NvbnRleHQgKmNjLCB1aW50OF90ICpkYXRhKQoreworICAgIGludCB5OworICAgIGludCBsc2l6ZSAgICA9IGNjLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgdWludDhfdCAqYnVmID0gY2MtPmZyYW1lLT5kYXRhWzBdOworICAgIGludCBjb2xvciAgICA9IGRhdGFbMF0gJiAweDBGOworCisgICAgaWYgKCEoZGF0YVsxXSAmIDB4MEYpKSB7CisgICAgICAgIC8vLyBmaWxsIHRoZSB0b3AgYW5kIGJvdHRvbSBib3JkZXJzCisgICAgICAgIG1lbXNldChidWYsIGNvbG9yLCBDREdfQk9SREVSX0hFSUdIVCAqIGxzaXplKTsKKyAgICAgICAgbWVtc2V0KGJ1ZiArIChDREdfRlVMTF9IRUlHSFQgLSBDREdfQk9SREVSX0hFSUdIVCkgKiBsc2l6ZSwKKyAgICAgICAgICAgICAgIGNvbG9yLCBDREdfQk9SREVSX0hFSUdIVCAqIGxzaXplKTsKKworICAgICAgICAvLy8gZmlsbCB0aGUgc2lkZSBib3JkZXJzCisgICAgICAgIGZvciAoeSA9IENER19CT1JERVJfSEVJR0hUOyB5IDwgQ0RHX0ZVTExfSEVJR0hUIC0gQ0RHX0JPUkRFUl9IRUlHSFQ7IHkrKykgeworICAgICAgICAgICAgbWVtc2V0KGJ1ZiArIHkgKiBsc2l6ZSwgY29sb3IsIENER19CT1JERVJfV0lEVEgpOworICAgICAgICAgICAgbWVtc2V0KGJ1ZiArIENER19GVUxMX1dJRFRIIC0gQ0RHX0JPUkRFUl9XSURUSCArIHkgKiBsc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBjb2xvciwgQ0RHX0JPUkRFUl9XSURUSCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNkZ19sb2FkX3BhbGV0dGUoQ0RHcmFwaGljc0NvbnRleHQgKmNjLCB1aW50OF90ICpkYXRhLCBpbnQgbG93KQoreworICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICB1aW50MTZfdCBjb2xvcjsKKyAgICBpbnQgaTsKKyAgICBpbnQgYXJyYXlfb2Zmc2V0ICA9IGxvdyA/IDAgOiA4OworICAgIHVpbnQzMl90ICpwYWxldHRlID0gKHVpbnQzMl90ICopIGNjLT5mcmFtZS0+ZGF0YVsxXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgY29sb3IgPSAoZGF0YVsyICogaV0gPDwgNikgKyAoZGF0YVsyICogaSArIDFdICYgMHgzRik7CisgICAgICAgIHIgPSAoKGNvbG9yID4+IDgpICYgMHgwMDBGKSAqIDE3OworICAgICAgICBnID0gKChjb2xvciA+PiA0KSAmIDB4MDAwRikgKiAxNzsKKyAgICAgICAgYiA9ICgoY29sb3IgICAgICkgJiAweDAwMEYpICogMTc7CisgICAgICAgIHBhbGV0dGVbaSArIGFycmF5X29mZnNldF0gPSAweEZGVSA8PCAyNCB8IHIgPDwgMTYgfCBnIDw8IDggfCBiOworICAgIH0KKyAgICBjYy0+ZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworfQorCitzdGF0aWMgaW50IGNkZ190aWxlX2Jsb2NrKENER3JhcGhpY3NDb250ZXh0ICpjYywgdWludDhfdCAqZGF0YSwgaW50IGIpCit7CisgICAgdW5zaWduZWQgY2ksIHJpOworICAgIGludCBjb2xvcjsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgYWk7CisgICAgaW50IHN0cmlkZSAgID0gY2MtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB1aW50OF90ICpidWYgPSBjYy0+ZnJhbWUtPmRhdGFbMF07CisKKyAgICByaSA9IChkYXRhWzJdICYgMHgxRikgKiBDREdfVElMRV9IRUlHSFQgKyBjYy0+dnNjcm9sbDsKKyAgICBjaSA9IChkYXRhWzNdICYgMHgzRikgKiBDREdfVElMRV9XSURUSCAgKyBjYy0+aHNjcm9sbDsKKworICAgIGlmIChyaSA+IChDREdfRlVMTF9IRUlHSFQgLSBDREdfVElMRV9IRUlHSFQpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGlmIChjaSA+IChDREdfRlVMTF9XSURUSCAtIENER19USUxFX1dJRFRIKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBDREdfVElMRV9IRUlHSFQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgQ0RHX1RJTEVfV0lEVEg7IHgrKykgeworICAgICAgICAgICAgaWYgKCEoKGRhdGFbNCArIHldID4+ICg1IC0geCkpICYgMHgwMSkpCisgICAgICAgICAgICAgICAgY29sb3IgPSBkYXRhWzBdICYgMHgwRjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb2xvciA9IGRhdGFbMV0gJiAweDBGOworCisgICAgICAgICAgICBhaSA9IGNpICsgeCArIChzdHJpZGUgKiAocmkgKyB5KSk7CisgICAgICAgICAgICBpZiAoYikKKyAgICAgICAgICAgICAgICBjb2xvciBePSBidWZbYWldOworICAgICAgICAgICAgYnVmW2FpXSA9IGNvbG9yOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVVAgICAgMgorI2RlZmluZSBET1dOICAxCisjZGVmaW5lIExFRlQgIDIKKyNkZWZpbmUgUklHSFQgMQorCitzdGF0aWMgdm9pZCBjZGdfY29weV9yZWN0X2J1ZihpbnQgb3V0X3RsX3gsIGludCBvdXRfdGxfeSwgdWludDhfdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluX3RsX3gsIGludCBpbl90bF95LCB1aW50OF90ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgeTsKKworICAgIGluICArPSBpbl90bF94ICArIGluX3RsX3kgICogc3RyaWRlOworICAgIG91dCArPSBvdXRfdGxfeCArIG91dF90bF95ICogc3RyaWRlOworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspCisgICAgICAgIG1lbWNweShvdXQgKyB5ICogc3RyaWRlLCBpbiArIHkgKiBzdHJpZGUsIHcpOworfQorCitzdGF0aWMgdm9pZCBjZGdfZmlsbF9yZWN0X3ByZXNldChpbnQgdGxfeCwgaW50IHRsX3ksIHVpbnQ4X3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvciwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKQoreworICAgIGludCB5OworCisgICAgZm9yICh5ID0gdGxfeTsgeSA8IHRsX3kgKyBoOyB5KyspCisgICAgICAgIG1lbXNldChvdXQgKyB0bF94ICsgeSAqIHN0cmlkZSwgY29sb3IsIHcpOworfQorCitzdGF0aWMgdm9pZCBjZGdfZmlsbF93cmFwcGVyKGludCBvdXRfdGxfeCwgaW50IG91dF90bF95LCB1aW50OF90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl90bF94LCBpbnQgaW5fdGxfeSwgdWludDhfdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvciwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlLCBpbnQgcm9sbCkKK3sKKyAgICBpZiAocm9sbCkgeworICAgICAgICBjZGdfY29weV9yZWN0X2J1ZihvdXRfdGxfeCwgb3V0X3RsX3ksIG91dCwgaW5fdGxfeCwgaW5fdGxfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW4sIHcsIGgsIHN0cmlkZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2RnX2ZpbGxfcmVjdF9wcmVzZXQob3V0X3RsX3gsIG91dF90bF95LCBvdXQsIGNvbG9yLCB3LCBoLCBzdHJpZGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2RnX3Njcm9sbChDREdyYXBoaWNzQ29udGV4dCAqY2MsIHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKm5ld19mcmFtZSwgaW50IHJvbGxfb3ZlcikKK3sKKyAgICBpbnQgY29sb3I7CisgICAgaW50IGhzY21kLCBoX29mZiwgaGluYywgdnNjbWQsIHZfb2ZmLCB2aW5jOworICAgIGludCB5OworICAgIGludCBzdHJpZGUgICA9IGNjLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgdWludDhfdCAqaW4gID0gY2MtPmZyYW1lLT5kYXRhWzBdOworICAgIHVpbnQ4X3QgKm91dCA9IG5ld19mcmFtZS0+ZGF0YVswXTsKKworICAgIGNvbG9yID0gIGRhdGFbMF0gJiAweDBGOworICAgIGhzY21kID0gKGRhdGFbMV0gJiAweDMwKSA+PiA0OworICAgIHZzY21kID0gKGRhdGFbMl0gJiAweDMwKSA+PiA0OworCisgICAgaF9vZmYgPSAgRkZNSU4oZGF0YVsxXSAmIDB4MDcsIENER19CT1JERVJfV0lEVEggIC0gMSk7CisgICAgdl9vZmYgPSAgRkZNSU4oZGF0YVsyXSAmIDB4MEYsIENER19CT1JERVJfSEVJR0hUIC0gMSk7CisKKyAgICAvLy8gZmluZCB0aGUgZGlmZmVyZW5jZSBhbmQgc2F2ZSB0aGUgb2Zmc2V0IGZvciBjZGdfdGlsZV9ibG9jayB1c2FnZQorICAgIGhpbmMgPSBoX29mZiAtIGNjLT5oc2Nyb2xsOworICAgIHZpbmMgPSB2X29mZiAtIGNjLT52c2Nyb2xsOworICAgIGNjLT5oc2Nyb2xsID0gaF9vZmY7CisgICAgY2MtPnZzY3JvbGwgPSB2X29mZjsKKworICAgIGlmICh2c2NtZCA9PSBVUCkKKyAgICAgICAgdmluYyAtPSAxMjsKKyAgICBpZiAodnNjbWQgPT0gRE9XTikKKyAgICAgICAgdmluYyArPSAxMjsKKyAgICBpZiAoaHNjbWQgPT0gTEVGVCkKKyAgICAgICAgaGluYyAtPSA2OworICAgIGlmIChoc2NtZCA9PSBSSUdIVCkKKyAgICAgICAgaGluYyArPSA2OworCisgICAgaWYgKCFoaW5jICYmICF2aW5jKQorICAgICAgICByZXR1cm47CisKKyAgICBtZW1jcHkobmV3X2ZyYW1lLT5kYXRhWzFdLCBjYy0+ZnJhbWUtPmRhdGFbMV0sIENER19QQUxFVFRFX1NJWkUgKiA0KTsKKworICAgIGZvciAoeSA9IEZGTUFYKDAsIHZpbmMpOyB5IDwgRkZNSU4oQ0RHX0ZVTExfSEVJR0hUICsgdmluYywgQ0RHX0ZVTExfSEVJR0hUKTsgeSsrKQorICAgICAgICBtZW1jcHkob3V0ICsgRkZNQVgoMCwgaGluYykgKyBzdHJpZGUgKiB5LAorICAgICAgICAgICAgICAgaW4gKyBGRk1BWCgwLCBoaW5jKSAtIGhpbmMgKyAoeSAtIHZpbmMpICogc3RyaWRlLAorICAgICAgICAgICAgICAgRkZNSU4oc3RyaWRlICsgaGluYywgc3RyaWRlKSk7CisKKyAgICBpZiAodmluYyA+IDApCisgICAgICAgIGNkZ19maWxsX3dyYXBwZXIoMCwgMCwgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsIENER19GVUxMX0hFSUdIVCAtIHZpbmMsIGluLCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHZpbmMsIHN0cmlkZSwgcm9sbF9vdmVyKTsKKyAgICBlbHNlIGlmICh2aW5jIDwgMCkKKyAgICAgICAgY2RnX2ZpbGxfd3JhcHBlcigwLCBDREdfRlVMTF9IRUlHSFQgKyB2aW5jLCBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgaW4sIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgLTEgKiB2aW5jLCBzdHJpZGUsIHJvbGxfb3Zlcik7CisKKyAgICBpZiAoaGluYyA+IDApCisgICAgICAgIGNkZ19maWxsX3dyYXBwZXIoMCwgMCwgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENER19GVUxMX1dJRFRIIC0gaGluYywgMCwgaW4sIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhpbmMsIENER19GVUxMX0hFSUdIVCwgc3RyaWRlLCByb2xsX292ZXIpOworICAgIGVsc2UgaWYgKGhpbmMgPCAwKQorICAgICAgICBjZGdfZmlsbF93cmFwcGVyKENER19GVUxMX1dJRFRIICsgaGluYywgMCwgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGluLCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtMSAqIGhpbmMsIENER19GVUxMX0hFSUdIVCwgc3RyaWRlLCByb2xsX292ZXIpOworCit9CisKK3N0YXRpYyBpbnQgY2RnX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBpbnQgcmV0OworICAgIHVpbnQ4X3QgY29tbWFuZCwgaW5zdDsKKyAgICB1aW50OF90IGNkZ19kYXRhW0NER19EQVRBX1NJWkVdID0gezB9OworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBDREdyYXBoaWNzQ29udGV4dCAqY2MgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGJ1Zl9zaXplIDwgQ0RHX01JTklNVU1fUEtUX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJidWZmZXIgdG9vIHNtYWxsIGZvciBkZWNvZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKGJ1Zl9zaXplID4gQ0RHX0hFQURFUl9TSVpFICsgQ0RHX0RBVEFfU0laRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJ1ZmZlciB0b28gYmlnIGZvciBkZWNvZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBjYy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKCFhdmN0eC0+ZnJhbWVfbnVtYmVyKSB7CisgICAgICAgIG1lbXNldChjYy0+ZnJhbWUtPmRhdGFbMF0sIDAsIGNjLT5mcmFtZS0+bGluZXNpemVbMF0gKiBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgbWVtc2V0KGNjLT5mcmFtZS0+ZGF0YVsxXSwgMCwgQVZQQUxFVFRFX1NJWkUpOworICAgIH0KKworICAgIGNvbW1hbmQgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgIGluc3QgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgIGluc3QgICAgJj0gQ0RHX01BU0s7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDIpOworICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmdiLCBjZGdfZGF0YSwgc2l6ZW9mKGNkZ19kYXRhKSk7CisKKyAgICBpZiAoKGNvbW1hbmQgJiBDREdfTUFTSykgPT0gQ0RHX0NPTU1BTkQpIHsKKyAgICAgICAgc3dpdGNoIChpbnN0KSB7CisgICAgICAgIGNhc2UgQ0RHX0lOU1RfTUVNT1JZX1BSRVNFVDoKKyAgICAgICAgICAgIGlmICghKGNkZ19kYXRhWzFdICYgMHgwRikpCisgICAgICAgICAgICAgICAgbWVtc2V0KGNjLT5mcmFtZS0+ZGF0YVswXSwgY2RnX2RhdGFbMF0gJiAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICBjYy0+ZnJhbWUtPmxpbmVzaXplWzBdICogQ0RHX0ZVTExfSEVJR0hUKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENER19JTlNUX0xPQURfUEFMX0xPOgorICAgICAgICBjYXNlIENER19JTlNUX0xPQURfUEFMX0hJR0g6CisgICAgICAgICAgICBpZiAoYnVmX3NpemUgLSBDREdfSEVBREVSX1NJWkUgPCBDREdfREFUQV9TSVpFKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJidWZmZXIgdG9vIHNtYWxsIGZvciBsb2FkaW5nIHBhbGV0dGVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNkZ19sb2FkX3BhbGV0dGUoY2MsIGNkZ19kYXRhLCBpbnN0ID09IENER19JTlNUX0xPQURfUEFMX0xPKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENER19JTlNUX0JPUkRFUl9QUkVTRVQ6CisgICAgICAgICAgICBjZGdfYm9yZGVyX3ByZXNldChjYywgY2RnX2RhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0RHX0lOU1RfVElMRV9CTE9DS19YT1I6CisgICAgICAgIGNhc2UgQ0RHX0lOU1RfVElMRV9CTE9DSzoKKyAgICAgICAgICAgIGlmIChidWZfc2l6ZSAtIENER19IRUFERVJfU0laRSA8IENER19EQVRBX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJ1ZmZlciB0b28gc21hbGwgZm9yIGRyYXdpbmcgdGlsZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gY2RnX3RpbGVfYmxvY2soY2MsIGNkZ19kYXRhLCBpbnN0ID09IENER19JTlNUX1RJTEVfQkxPQ0tfWE9SKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInRpbGUgaXMgb3V0IG9mIHJhbmdlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0RHX0lOU1RfU0NST0xMX1BSRVNFVDoKKyAgICAgICAgY2FzZSBDREdfSU5TVF9TQ1JPTExfQ09QWToKKyAgICAgICAgICAgIGlmIChidWZfc2l6ZSAtIENER19IRUFERVJfU0laRSA8IENER19NSU5JTVVNX1NDUk9MTF9TSVpFKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJidWZmZXIgdG9vIHNtYWxsIGZvciBzY3JvbGxpbmdcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgY2RnX3Njcm9sbChjYywgY2RnX2RhdGEsIGZyYW1lLCBpbnN0ID09IENER19JTlNUX1NDUk9MTF9DT1BZKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGNjLT5mcmFtZSk7CisgICAgICAgICAgICByZXQgPSBhdl9mcmFtZV9yZWYoY2MtPmZyYW1lLCBmcmFtZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZnJhbWUtPmRhdGFbMF0pIHsKKyAgICAgICAgICAgIHJldCA9IGF2X2ZyYW1lX3JlZihmcmFtZSwgY2MtPmZyYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmdvdF9mcmFtZSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgY2RnX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENER3JhcGhpY3NDb250ZXh0ICpjYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZjYy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfY2RncmFwaGljc19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjZGdyYXBoaWNzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ0QgR3JhcGhpY3MgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQ0RHUkFQSElDUywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ0RHcmFwaGljc0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGNkZ19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBjZGdfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBjZGdfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2R4bC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2R4bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYWQ1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jZHhsLmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBDRFhMIHZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDb21tb2RvcmUgQ0RYTCB2aWRlbyBkZWNvZGVyCisgKiBAYXV0aG9yIFBhdWwgQiBNYWhvbAorICovCisKKyNkZWZpbmUgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIgMQorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgQklUX1BMQU5BUiAgIDB4MDAKKyNkZWZpbmUgQ0hVTktZICAgICAgIDB4MjAKKyNkZWZpbmUgQllURV9QTEFOQVIgIDB4NDAKKyNkZWZpbmUgQklUX0xJTkUgICAgIDB4ODAKKyNkZWZpbmUgQllURV9MSU5FICAgIDB4QzAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBpbnQgICAgICAgICAgICBicHA7CisgICAgaW50ICAgICAgICAgICAgZm9ybWF0OworICAgIGludCAgICAgICAgICAgIHBhZGRlZF9iaXRzOworICAgIGNvbnN0IHVpbnQ4X3QgICpwYWxldHRlOworICAgIGludCAgICAgICAgICAgIHBhbGV0dGVfc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICAqdmlkZW87CisgICAgaW50ICAgICAgICAgICAgdmlkZW9fc2l6ZTsKKyAgICB1aW50OF90ICAgICAgICAqbmV3X3ZpZGVvOworICAgIGludCAgICAgICAgICAgIG5ld192aWRlb19zaXplOworfSBDRFhMVmlkZW9Db250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgY2R4bF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQ0RYTFZpZGVvQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBjLT5uZXdfdmlkZW9fc2l6ZSA9IDA7CisgICAgYy0+YXZjdHggICAgICAgICAgPSBhdmN0eDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbXBvcnRfcGFsZXR0ZShDRFhMVmlkZW9Db250ZXh0ICpjLCB1aW50MzJfdCAqbmV3X3BhbGV0dGUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+cGFsZXR0ZV9zaXplIC8gMjsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIHJnYiA9IEFWX1JCMTYoJmMtPnBhbGV0dGVbaSAqIDJdKTsKKyAgICAgICAgdW5zaWduZWQgciAgID0gKChyZ2IgPj4gOCkgJiAweEYpICogMHgxMTsKKyAgICAgICAgdW5zaWduZWQgZyAgID0gKChyZ2IgPj4gNCkgJiAweEYpICogMHgxMTsKKyAgICAgICAgdW5zaWduZWQgYiAgID0gIChyZ2IgICAgICAgJiAweEYpICogMHgxMTsKKyAgICAgICAgQVZfV04zMigmbmV3X3BhbGV0dGVbaV0sICgweEZGVSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYml0cGxhbmFyMmNodW5reShDRFhMVmlkZW9Db250ZXh0ICpjLCBpbnQgbGluZXNpemUsIHVpbnQ4X3QgKm91dCkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCB4LCB5LCBwbGFuZTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBjLT52aWRlbywgYy0+dmlkZW9fc2l6ZSAqIDgpOworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IGMtPmJwcDsgcGxhbmUrKykgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYy0+YXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYy0+YXZjdHgtPndpZHRoOyB4KyspCisgICAgICAgICAgICAgICAgb3V0W2xpbmVzaXplICogeSArIHhdIHw9IGdldF9iaXRzMSgmZ2IpIDw8IHBsYW5lOworICAgICAgICAgICAgc2tpcF9iaXRzKCZnYiwgYy0+cGFkZGVkX2JpdHMpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBiaXRsaW5lMmNodW5reShDRFhMVmlkZW9Db250ZXh0ICpjLCBpbnQgbGluZXNpemUsIHVpbnQ4X3QgKm91dCkKK3sKKyAgICBHZXRCaXRDb250ZXh0ICBnYjsKKyAgICBpbnQgeCwgeSwgcGxhbmU7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgYy0+dmlkZW8sIGMtPnZpZGVvX3NpemUgKiA4KTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgYy0+YXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IGMtPmJwcDsgcGxhbmUrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGMtPmF2Y3R4LT53aWR0aDsgeCsrKQorICAgICAgICAgICAgICAgIG91dFtsaW5lc2l6ZSAqIHkgKyB4XSB8PSBnZXRfYml0czEoJmdiKSA8PCBwbGFuZTsKKyAgICAgICAgICAgIHNraXBfYml0cygmZ2IsIGMtPnBhZGRlZF9iaXRzKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaW1wb3J0X2Zvcm1hdChDRFhMVmlkZW9Db250ZXh0ICpjLCBpbnQgbGluZXNpemUsIHVpbnQ4X3QgKm91dCkKK3sKKyAgICBtZW1zZXQob3V0LCAwLCBsaW5lc2l6ZSAqIGMtPmF2Y3R4LT5oZWlnaHQpOworCisgICAgc3dpdGNoIChjLT5mb3JtYXQpIHsKKyAgICBjYXNlIEJJVF9QTEFOQVI6CisgICAgICAgIGJpdHBsYW5hcjJjaHVua3koYywgbGluZXNpemUsIG91dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQklUX0xJTkU6CisgICAgICAgIGJpdGxpbmUyY2h1bmt5KGMsIGxpbmVzaXplLCBvdXQpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNkeGxfZGVjb2RlX3JnYihDRFhMVmlkZW9Db250ZXh0ICpjLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICB1aW50MzJfdCAqbmV3X3BhbGV0dGUgPSAodWludDMyX3QgKilmcmFtZS0+ZGF0YVsxXTsKKworICAgIG1lbXNldChmcmFtZS0+ZGF0YVsxXSwgMCwgQVZQQUxFVFRFX1NJWkUpOworICAgIGltcG9ydF9wYWxldHRlKGMsIG5ld19wYWxldHRlKTsKKyAgICBpbXBvcnRfZm9ybWF0KGMsIGZyYW1lLT5saW5lc2l6ZVswXSwgZnJhbWUtPmRhdGFbMF0pOworfQorCitzdGF0aWMgdm9pZCBjZHhsX2RlY29kZV9oYW02KENEWExWaWRlb0NvbnRleHQgKmMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IGMtPmF2Y3R4OworICAgIHVpbnQzMl90IG5ld19wYWxldHRlWzE2XSwgciwgZywgYjsKKyAgICB1aW50OF90ICpwdHIsICpvdXQsIGluZGV4LCBvcDsKKyAgICBpbnQgeCwgeTsKKworICAgIHB0ciA9IGMtPm5ld192aWRlbzsKKyAgICBvdXQgPSBmcmFtZS0+ZGF0YVswXTsKKworICAgIGltcG9ydF9wYWxldHRlKGMsIG5ld19wYWxldHRlKTsKKyAgICBpbXBvcnRfZm9ybWF0KGMsIGF2Y3R4LT53aWR0aCwgYy0+bmV3X3ZpZGVvKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgciA9IG5ld19wYWxldHRlWzBdICYgMHhGRjAwMDA7CisgICAgICAgIGcgPSBuZXdfcGFsZXR0ZVswXSAmIDB4RkYwMDsKKyAgICAgICAgYiA9IG5ld19wYWxldHRlWzBdICYgMHhGRjsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbmRleCAgPSAqcHRyKys7CisgICAgICAgICAgICBvcCAgICAgPSBpbmRleCA+PiA0OworICAgICAgICAgICAgaW5kZXggJj0gMTU7CisgICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgciA9IG5ld19wYWxldHRlW2luZGV4XSAmIDB4RkYwMDAwOworICAgICAgICAgICAgICAgIGcgPSBuZXdfcGFsZXR0ZVtpbmRleF0gJiAweEZGMDA7CisgICAgICAgICAgICAgICAgYiA9IG5ld19wYWxldHRlW2luZGV4XSAmIDB4RkY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgYiA9IGluZGV4ICogMHgxMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICByID0gaW5kZXggKiAweDExIDw8IDE2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGcgPSBpbmRleCAqIDB4MTEgPDwgODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFWX1dMMjQob3V0ICsgeCAqIDMsIHIgfCBnIHwgYik7CisgICAgICAgIH0KKyAgICAgICAgb3V0ICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNkeGxfZGVjb2RlX2hhbTgoQ0RYTFZpZGVvQ29udGV4dCAqYywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gYy0+YXZjdHg7CisgICAgdWludDMyX3QgbmV3X3BhbGV0dGVbNjRdLCByLCBnLCBiOworICAgIHVpbnQ4X3QgKnB0ciwgKm91dCwgaW5kZXgsIG9wOworICAgIGludCB4LCB5OworCisgICAgcHRyID0gYy0+bmV3X3ZpZGVvOworICAgIG91dCA9IGZyYW1lLT5kYXRhWzBdOworCisgICAgaW1wb3J0X3BhbGV0dGUoYywgbmV3X3BhbGV0dGUpOworICAgIGltcG9ydF9mb3JtYXQoYywgYXZjdHgtPndpZHRoLCBjLT5uZXdfdmlkZW8pOworCisgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICByID0gbmV3X3BhbGV0dGVbMF0gJiAweEZGMDAwMDsKKyAgICAgICAgZyA9IG5ld19wYWxldHRlWzBdICYgMHhGRjAwOworICAgICAgICBiID0gbmV3X3BhbGV0dGVbMF0gJiAweEZGOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGluZGV4ICA9ICpwdHIrKzsKKyAgICAgICAgICAgIG9wICAgICA9IGluZGV4ID4+IDY7CisgICAgICAgICAgICBpbmRleCAmPSA2MzsKKyAgICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICByID0gbmV3X3BhbGV0dGVbaW5kZXhdICYgMHhGRjAwMDA7CisgICAgICAgICAgICAgICAgZyA9IG5ld19wYWxldHRlW2luZGV4XSAmIDB4RkYwMDsKKyAgICAgICAgICAgICAgICBiID0gbmV3X3BhbGV0dGVbaW5kZXhdICYgMHhGRjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBiID0gKGluZGV4IDw8ICAyKSB8IChiICYgMyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgciA9IChpbmRleCA8PCAxOCkgfCAociAmICgzIDw8IDE2KSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgZyA9IChpbmRleCA8PCAxMCkgfCAoZyAmICgzIDw8IDgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFWX1dMMjQob3V0ICsgeCAqIDMsIHIgfCBnIHwgYik7CisgICAgICAgIH0KKyAgICAgICAgb3V0ICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY2R4bF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBDRFhMVmlkZW9Db250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICogY29uc3QgcCA9IGRhdGE7CisgICAgaW50IHJldCwgdywgaCwgZW5jb2RpbmcsIGFsaWduZWRfd2lkdGgsIGJ1Zl9zaXplID0gcGt0LT5zaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IHBrdC0+ZGF0YTsKKworICAgIGlmIChidWZfc2l6ZSA8IDMyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBlbmNvZGluZyAgICAgICAgPSBidWZbMV0gJiA3OworICAgIGMtPmZvcm1hdCAgICAgICA9IGJ1ZlsxXSAmIDB4RTA7CisgICAgdyAgICAgICAgICAgICAgID0gQVZfUkIxNigmYnVmWzE0XSk7CisgICAgaCAgICAgICAgICAgICAgID0gQVZfUkIxNigmYnVmWzE2XSk7CisgICAgYy0+YnBwICAgICAgICAgID0gYnVmWzE5XTsKKyAgICBjLT5wYWxldHRlX3NpemUgPSBBVl9SQjE2KCZidWZbMjBdKTsKKyAgICBjLT5wYWxldHRlICAgICAgPSBidWYgKyAzMjsKKyAgICBjLT52aWRlbyAgICAgICAgPSBjLT5wYWxldHRlICsgYy0+cGFsZXR0ZV9zaXplOworICAgIGMtPnZpZGVvX3NpemUgICA9IGJ1Zl9zaXplIC0gYy0+cGFsZXR0ZV9zaXplIC0gMzI7CisKKyAgICBpZiAoYy0+cGFsZXR0ZV9zaXplID4gNTEyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoYnVmX3NpemUgPCBjLT5wYWxldHRlX3NpemUgKyAzMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKGMtPmJwcCA8IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChjLT5mb3JtYXQgIT0gQklUX1BMQU5BUiAmJiBjLT5mb3JtYXQgIT0gQklUX0xJTkUpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiUGl4ZWwgZm9ybWF0IDB4JTB4IiwgYy0+Zm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHcsIGgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhbGlnbmVkX3dpZHRoID0gRkZBTElHTihjLT5hdmN0eC0+d2lkdGgsIDE2KTsKKyAgICBjLT5wYWRkZWRfYml0cyAgPSBhbGlnbmVkX3dpZHRoIC0gYy0+YXZjdHgtPndpZHRoOworICAgIGlmIChjLT52aWRlb19zaXplIDwgYWxpZ25lZF93aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiBjLT5icHAgLyA4KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoIWVuY29kaW5nICYmIGMtPnBhbGV0dGVfc2l6ZSAmJiBjLT5icHAgPD0gOCkgeworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKyAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09IDEgJiYgKGMtPmJwcCA9PSA2IHx8IGMtPmJwcCA9PSA4KSkgeworICAgICAgICBpZiAoYy0+cGFsZXR0ZV9zaXplICE9ICgxIDw8IChjLT5icHAgLSAxKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjI0OworICAgIH0gZWxzZSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkVuY29kaW5nICVkIGFuZCBicHAgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIGMtPmJwcCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHAsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICBpZiAoZW5jb2RpbmcpIHsKKyAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZjLT5uZXdfdmlkZW8sICZjLT5uZXdfdmlkZW9fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKiB3ICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIGlmICghYy0+bmV3X3ZpZGVvKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKGMtPmJwcCA9PSA4KQorICAgICAgICAgICAgY2R4bF9kZWNvZGVfaGFtOChjLCBwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2R4bF9kZWNvZGVfaGFtNihjLCBwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjZHhsX2RlY29kZV9yZ2IoYywgcCk7CisgICAgfQorICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgY2R4bF9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDRFhMVmlkZW9Db250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZjLT5uZXdfdmlkZW8pOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfY2R4bF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjZHhsIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29tbW9kb3JlIENEWEwgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQ0RYTCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ0RYTFZpZGVvQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gY2R4bF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBjZHhsX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gY2R4bF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jZWxwX2ZpbHRlcnMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NlbHBfZmlsdGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MWZkODgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jZWxwX2ZpbHRlcnMuYwpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIHZhcmlvdXMgZmlsdGVycyBmb3IgQUNFTFAtYmFzZWQgY29kZWNzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFZsYWRpbWlyIFZvcm9zaGlsb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiY2VscF9maWx0ZXJzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCit2b2lkIGZmX2NlbHBfY29udm9sdmVfY2lyYyhpbnQxNl90KiBmY19vdXQsIGNvbnN0IGludDE2X3QqIGZjX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogZmlsdGVyLCBpbnQgbGVuKQoreworICAgIGludCBpLCBrOworCisgICAgbWVtc2V0KGZjX291dCwgMCwgbGVuICogc2l6ZW9mKGludDE2X3QpKTsKKworICAgIC8qIFNpbmNlIHRoZXJlIGFyZSBmZXcgcHVsc2VzIG92ZXIgYW4gZW50aXJlIHN1YmZyYW1lIChpLmUuIGFsbW9zdAorICAgICAgIGFsbCBmY19pbltpXSBhcmUgemVybykgaXQgaXMgZmFzdGVyIHRvIGxvb3Agb3ZlciBmY19pbiBmaXJzdC4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKGZjX2luW2ldKSB7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaTsgaysrKQorICAgICAgICAgICAgICAgIGZjX291dFtrXSArPSAoZmNfaW5baV0gKiBmaWx0ZXJbbGVuICsgayAtIGldKSA+PiAxNTsKKworICAgICAgICAgICAgZm9yIChrID0gaTsgayA8IGxlbjsgaysrKQorICAgICAgICAgICAgICAgIGZjX291dFtrXSArPSAoZmNfaW5baV0gKiBmaWx0ZXJbICAgICAgayAtIGldKSA+PiAxNTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl9jZWxwX2NpcmNfYWRkZihmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpsYWdnZWQsIGludCBsYWcsIGZsb2F0IGZhYywgaW50IG4pCit7CisgICAgaW50IGs7CisgICAgZm9yIChrID0gMDsgayA8IGxhZzsgaysrKQorICAgICAgICBvdXRba10gPSBpbltrXSArIGZhYyAqIGxhZ2dlZFtuICsgayAtIGxhZ107CisgICAgZm9yICg7IGsgPCBuOyBrKyspCisgICAgICAgIG91dFtrXSA9IGluW2tdICsgZmFjICogbGFnZ2VkWyAgICBrIC0gbGFnXTsKK30KKworaW50IGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcihpbnQxNl90ICpvdXQsIGNvbnN0IGludDE2X3QgKmZpbHRlcl9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmluLCBpbnQgYnVmZmVyX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbHRlcl9sZW5ndGgsIGludCBzdG9wX29uX292ZXJmbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQsIGludCByb3VuZGVyKQoreworICAgIGludCBpLG47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgYnVmZmVyX2xlbmd0aDsgbisrKSB7CisgICAgICAgIGludCBzdW0gPSAtcm91bmRlciwgc3VtMTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBmaWx0ZXJfbGVuZ3RoOyBpKyspCisgICAgICAgICAgICBzdW0gKz0gZmlsdGVyX2NvZWZmc1tpLTFdICogb3V0W24taV07CisKKyAgICAgICAgc3VtMSA9ICgoLXN1bSA+PiAxMikgKyBpbltuXSkgPj4gc2hpZnQ7CisgICAgICAgIHN1bSAgPSBhdl9jbGlwX2ludDE2KHN1bTEpOworCisgICAgICAgIGlmIChzdG9wX29uX292ZXJmbG93ICYmIHN1bSAhPSBzdW0xKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgb3V0W25dID0gc3VtOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmZpbHRlcl9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGluLCBpbnQgYnVmZmVyX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsdGVyX2xlbmd0aCkKK3sKKyAgICBpbnQgaSxuOworCisjaWYgMCAvLyBVbm9wdGltaXplZCBjb2RlIHBhdGggZm9yIGltcHJvdmVkIHJlYWRhYmlsaXR5CisgICAgZm9yIChuID0gMDsgbiA8IGJ1ZmZlcl9sZW5ndGg7IG4rKykgeworICAgICAgICBvdXRbbl0gPSBpbltuXTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBmaWx0ZXJfbGVuZ3RoOyBpKyspCisgICAgICAgICAgICBvdXRbbl0gLT0gZmlsdGVyX2NvZWZmc1tpLTFdICogb3V0W24taV07CisgICAgfQorI2Vsc2UKKyAgICBmbG9hdCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIGZsb2F0IG9sZF9vdXQwLCBvbGRfb3V0MSwgb2xkX291dDIsIG9sZF9vdXQzOworICAgIGZsb2F0IGEsYixjOworCisgICAgYSA9IGZpbHRlcl9jb2VmZnNbMF07CisgICAgYiA9IGZpbHRlcl9jb2VmZnNbMV07CisgICAgYyA9IGZpbHRlcl9jb2VmZnNbMl07CisgICAgYiAtPSBmaWx0ZXJfY29lZmZzWzBdICogZmlsdGVyX2NvZWZmc1swXTsKKyAgICBjIC09IGZpbHRlcl9jb2VmZnNbMV0gKiBmaWx0ZXJfY29lZmZzWzBdOworICAgIGMgLT0gZmlsdGVyX2NvZWZmc1swXSAqIGI7CisKKyAgICBhdl9hc3NlcnQyKChmaWx0ZXJfbGVuZ3RoJjEpPT0wICYmIGZpbHRlcl9sZW5ndGg+PTQpOworCisgICAgb2xkX291dDAgPSBvdXRbLTRdOworICAgIG9sZF9vdXQxID0gb3V0Wy0zXTsKKyAgICBvbGRfb3V0MiA9IG91dFstMl07CisgICAgb2xkX291dDMgPSBvdXRbLTFdOworICAgIGZvciAobiA9IDA7IG4gPD0gYnVmZmVyX2xlbmd0aCAtIDQ7IG4rPTQpIHsKKyAgICAgICAgZmxvYXQgdG1wMCx0bXAxLHRtcDI7CisgICAgICAgIGZsb2F0IHZhbDsKKworICAgICAgICBvdXQwID0gaW5bMF07CisgICAgICAgIG91dDEgPSBpblsxXTsKKyAgICAgICAgb3V0MiA9IGluWzJdOworICAgICAgICBvdXQzID0gaW5bM107CisKKyAgICAgICAgb3V0MCAtPSBmaWx0ZXJfY29lZmZzWzJdICogb2xkX291dDE7CisgICAgICAgIG91dDEgLT0gZmlsdGVyX2NvZWZmc1syXSAqIG9sZF9vdXQyOworICAgICAgICBvdXQyIC09IGZpbHRlcl9jb2VmZnNbMl0gKiBvbGRfb3V0MzsKKworICAgICAgICBvdXQwIC09IGZpbHRlcl9jb2VmZnNbMV0gKiBvbGRfb3V0MjsKKyAgICAgICAgb3V0MSAtPSBmaWx0ZXJfY29lZmZzWzFdICogb2xkX291dDM7CisKKyAgICAgICAgb3V0MCAtPSBmaWx0ZXJfY29lZmZzWzBdICogb2xkX291dDM7CisKKyAgICAgICAgdmFsID0gZmlsdGVyX2NvZWZmc1szXTsKKworICAgICAgICBvdXQwIC09IHZhbCAqIG9sZF9vdXQwOworICAgICAgICBvdXQxIC09IHZhbCAqIG9sZF9vdXQxOworICAgICAgICBvdXQyIC09IHZhbCAqIG9sZF9vdXQyOworICAgICAgICBvdXQzIC09IHZhbCAqIG9sZF9vdXQzOworCisgICAgICAgIGZvciAoaSA9IDU7IGkgPCBmaWx0ZXJfbGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIG9sZF9vdXQzID0gb3V0Wy1pXTsKKyAgICAgICAgICAgIHZhbCA9IGZpbHRlcl9jb2VmZnNbaS0xXTsKKworICAgICAgICAgICAgb3V0MCAtPSB2YWwgKiBvbGRfb3V0MzsKKyAgICAgICAgICAgIG91dDEgLT0gdmFsICogb2xkX291dDA7CisgICAgICAgICAgICBvdXQyIC09IHZhbCAqIG9sZF9vdXQxOworICAgICAgICAgICAgb3V0MyAtPSB2YWwgKiBvbGRfb3V0MjsKKworICAgICAgICAgICAgb2xkX291dDIgPSBvdXRbLWktMV07CisKKyAgICAgICAgICAgIHZhbCA9IGZpbHRlcl9jb2VmZnNbaV07CisKKyAgICAgICAgICAgIG91dDAgLT0gdmFsICogb2xkX291dDI7CisgICAgICAgICAgICBvdXQxIC09IHZhbCAqIG9sZF9vdXQzOworICAgICAgICAgICAgb3V0MiAtPSB2YWwgKiBvbGRfb3V0MDsKKyAgICAgICAgICAgIG91dDMgLT0gdmFsICogb2xkX291dDE7CisKKyAgICAgICAgICAgIEZGU1dBUChmbG9hdCwgb2xkX291dDAsIG9sZF9vdXQyKTsKKyAgICAgICAgICAgIG9sZF9vdXQxID0gb2xkX291dDM7CisgICAgICAgIH0KKworICAgICAgICB0bXAwID0gb3V0MDsKKyAgICAgICAgdG1wMSA9IG91dDE7CisgICAgICAgIHRtcDIgPSBvdXQyOworCisgICAgICAgIG91dDMgLT0gYSAqIHRtcDI7CisgICAgICAgIG91dDIgLT0gYSAqIHRtcDE7CisgICAgICAgIG91dDEgLT0gYSAqIHRtcDA7CisKKyAgICAgICAgb3V0MyAtPSBiICogdG1wMTsKKyAgICAgICAgb3V0MiAtPSBiICogdG1wMDsKKworICAgICAgICBvdXQzIC09IGMgKiB0bXAwOworCisKKyAgICAgICAgb3V0WzBdID0gb3V0MDsKKyAgICAgICAgb3V0WzFdID0gb3V0MTsKKyAgICAgICAgb3V0WzJdID0gb3V0MjsKKyAgICAgICAgb3V0WzNdID0gb3V0MzsKKworICAgICAgICBvbGRfb3V0MCA9IG91dDA7CisgICAgICAgIG9sZF9vdXQxID0gb3V0MTsKKyAgICAgICAgb2xkX291dDIgPSBvdXQyOworICAgICAgICBvbGRfb3V0MyA9IG91dDM7CisKKyAgICAgICAgb3V0ICs9IDQ7CisgICAgICAgIGluICArPSA0OworICAgIH0KKworICAgIG91dCAtPSBuOworICAgIGluIC09IG47CisgICAgZm9yICg7IG4gPCBidWZmZXJfbGVuZ3RoOyBuKyspIHsKKyAgICAgICAgb3V0W25dID0gaW5bbl07CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gZmlsdGVyX2xlbmd0aDsgaSsrKQorICAgICAgICAgICAgb3V0W25dIC09IGZpbHRlcl9jb2VmZnNbaS0xXSAqIG91dFtuLWldOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX2NlbHBfbHBfemVyb19zeW50aGVzaXNfZmlsdGVyZihmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqZmlsdGVyX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppbiwgaW50IGJ1ZmZlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsdGVyX2xlbmd0aCkKK3sKKyAgICBpbnQgaSxuOworCisgICAgZm9yIChuID0gMDsgbiA8IGJ1ZmZlcl9sZW5ndGg7IG4rKykgeworICAgICAgICBvdXRbbl0gPSBpbltuXTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBmaWx0ZXJfbGVuZ3RoOyBpKyspCisgICAgICAgICAgICBvdXRbbl0gKz0gZmlsdGVyX2NvZWZmc1tpLTFdICogaW5bbi1pXTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfY2VscF9maWx0ZXJfaW5pdChDRUxQRkNvbnRleHQgKmMpCit7CisgICAgYy0+Y2VscF9scF9zeW50aGVzaXNfZmlsdGVyZiAgICAgICAgPSBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXJmOworICAgIGMtPmNlbHBfbHBfemVyb19zeW50aGVzaXNfZmlsdGVyZiAgID0gZmZfY2VscF9scF96ZXJvX3N5bnRoZXNpc19maWx0ZXJmOworCisgICAgaWYoSEFWRV9NSVBTRlBVKQorICAgICAgICBmZl9jZWxwX2ZpbHRlcl9pbml0X21pcHMoYyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jZWxwX2ZpbHRlcnMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2NlbHBfZmlsdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDRlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jZWxwX2ZpbHRlcnMuaApAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIHZhcmlvdXMgZmlsdGVycyBmb3IgQ0VMUC1iYXNlZCBjb2RlY3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQ0VMUF9GSUxURVJTX0gKKyNkZWZpbmUgQVZDT0RFQ19DRUxQX0ZJTFRFUlNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IENFTFBGQ29udGV4dCB7CisgICAgLyoqCisgICAgICogTFAgc3ludGhlc2lzIGZpbHRlci4KKyAgICAgKiBAcGFyYW1bb3V0XSBvdXQgcG9pbnRlciB0byBvdXRwdXQgYnVmZmVyCisgICAgICogICAgICAgIC0gdGhlIGFycmF5IG91dFstZmlsdGVyX2xlbmd0aCwgLTFdIG11c3QKKyAgICAgKiAgICAgICAgY29udGFpbiB0aGUgcHJldmlvdXMgcmVzdWx0IG9mIHRoaXMgZmlsdGVyCisgICAgICogQHBhcmFtIGZpbHRlcl9jb2VmZnMgZmlsdGVyIGNvZWZmaWNpZW50cy4KKyAgICAgKiBAcGFyYW0gaW4gaW5wdXQgc2lnbmFsCisgICAgICogQHBhcmFtIGJ1ZmZlcl9sZW5ndGggYW1vdW50IG9mIGRhdGEgdG8gcHJvY2VzcworICAgICAqIEBwYXJhbSBmaWx0ZXJfbGVuZ3RoIGZpbHRlciBsZW5ndGggKDEwIGZvciAxMHRoIG9yZGVyIExQIGZpbHRlcikuIE11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gNCBhbmQgZXZlbi4KKyAgICAgKgorICAgICAqIEBub3RlIE91dHB1dCBidWZmZXIgbXVzdCBjb250YWluIGZpbHRlcl9sZW5ndGggc2FtcGxlcyBvZiBwYXN0CisgICAgICogICAgICAgc3BlZWNoIGRhdGEgYmVmb3JlIHBvaW50ZXIuCisgICAgICoKKyAgICAgKiBSb3V0aW5lIGFwcGxpZXMgMS9BKHopIGZpbHRlciB0byBnaXZlbiBzcGVlY2ggZGF0YS4KKyAgICAgKi8KKyAgICB2b2lkICgqY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZikoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmZpbHRlcl9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppbiwgaW50IGJ1ZmZlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWx0ZXJfbGVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIExQIHplcm8gc3ludGhlc2lzIGZpbHRlci4KKyAgICAgKiBAcGFyYW1bb3V0XSBvdXQgcG9pbnRlciB0byBvdXRwdXQgYnVmZmVyCisgICAgICogQHBhcmFtIGZpbHRlcl9jb2VmZnMgZmlsdGVyIGNvZWZmaWNpZW50cy4KKyAgICAgKiBAcGFyYW0gaW4gaW5wdXQgc2lnbmFsCisgICAgICogICAgICAgIC0gdGhlIGFycmF5IGluWy1maWx0ZXJfbGVuZ3RoLCAtMV0gbXVzdAorICAgICAqICAgICAgICBjb250YWluIHRoZSBwcmV2aW91cyBpbnB1dCBvZiB0aGlzIGZpbHRlcgorICAgICAqIEBwYXJhbSBidWZmZXJfbGVuZ3RoIGFtb3VudCBvZiBkYXRhIHRvIHByb2Nlc3MgKHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIGVpZ2h0KQorICAgICAqIEBwYXJhbSBmaWx0ZXJfbGVuZ3RoIGZpbHRlciBsZW5ndGggKDEwIGZvciAxMHRoIG9yZGVyIExQIGZpbHRlcjsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgdHdvKQorICAgICAqCisgICAgICogQG5vdGUgT3V0cHV0IGJ1ZmZlciBtdXN0IGNvbnRhaW4gZmlsdGVyX2xlbmd0aCBzYW1wbGVzIG9mIHBhc3QKKyAgICAgKiAgICAgICBzcGVlY2ggZGF0YSBiZWZvcmUgcG9pbnRlci4KKyAgICAgKgorICAgICAqIFJvdXRpbmUgYXBwbGllcyBBKHopIGZpbHRlciB0byBnaXZlbiBzcGVlY2ggZGF0YS4KKyAgICAgKi8KKyAgICB2b2lkICgqY2VscF9scF96ZXJvX3N5bnRoZXNpc19maWx0ZXJmKShmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqZmlsdGVyX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW4sIGludCBidWZmZXJfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWx0ZXJfbGVuZ3RoKTsKKworfUNFTFBGQ29udGV4dDsKKworLyoqCisgKiBJbml0aWFsaXplIENFTFBGQ29udGV4dC4KKyAqLwordm9pZCBmZl9jZWxwX2ZpbHRlcl9pbml0KENFTFBGQ29udGV4dCAqYyk7Cit2b2lkIGZmX2NlbHBfZmlsdGVyX2luaXRfbWlwcyhDRUxQRkNvbnRleHQgKmMpOworCisvKioKKyAqIENpcmN1bGFybHkgY29udm9sdmUgZml4ZWQgdmVjdG9yIHdpdGggYSBwaGFzZSBkaXNwZXJzaW9uIGltcHVsc2UKKyAqICAgICAgICByZXNwb25zZSBmaWx0ZXIgKEQuNi4yIG9mIEcuNzI5IGFuZCA2LjEuNSBvZiBBTVIpLgorICogQHBhcmFtIGZjX291dCB2ZWN0b3Igd2l0aCBmaWx0ZXIgYXBwbGllZAorICogQHBhcmFtIGZjX2luIHNvdXJjZSB2ZWN0b3IKKyAqIEBwYXJhbSBmaWx0ZXIgcGhhc2UgZmlsdGVyIGNvZWZmaWNpZW50cworICoKKyAqICBmY19vdXRbbl0gPSBzdW0oaSwwLGxlbi0xKXsgZmNfaW5baV0gKiBmaWx0ZXJbKGxlbiArIG4gLSBpKSVsZW5dIH0KKyAqCisgKiBAbm90ZSBmY19pbiBhbmQgZmNfb3V0IHNob3VsZCBub3Qgb3ZlcmxhcCEKKyAqLwordm9pZCBmZl9jZWxwX2NvbnZvbHZlX2NpcmMoaW50MTZfdCAqZmNfb3V0LCBjb25zdCBpbnQxNl90ICpmY19pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmZpbHRlciwgaW50IGxlbik7CisKKy8qKgorICogQWRkIGFuIGFycmF5IHRvIGEgcm90YXRlZCBhcnJheS4KKyAqCisgKiBvdXRba10gPSBpbltrXSArIGZhYyAqIGxhZ2dlZFtrLWxhZ10gd2l0aCB3cmFwLWFyb3VuZAorICoKKyAqIEBwYXJhbSBvdXQgcmVzdWx0IHZlY3RvcgorICogQHBhcmFtIGluIHNhbXBsZXMgdG8gYmUgYWRkZWQgdW5maWx0ZXJlZAorICogQHBhcmFtIGxhZ2dlZCBzYW1wbGVzIHRvIGJlIHJvdGF0ZWQsIG11bHRpcGxpZWQgYW5kIGFkZGVkCisgKiBAcGFyYW0gbGFnIGxhZ2dlZCB2ZWN0b3IgZGVsYXkgaW4gdGhlIHJhbmdlIFswLCBuXQorICogQHBhcmFtIGZhYyBzY2FsZWZhY3RvciBmb3IgbGFnZ2VkIHNhbXBsZXMKKyAqIEBwYXJhbSBuIG51bWJlciBvZiBzYW1wbGVzCisgKi8KK3ZvaWQgZmZfY2VscF9jaXJjX2FkZGYoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbGFnZ2VkLCBpbnQgbGFnLCBmbG9hdCBmYWMsIGludCBuKTsKKworLyoqCisgKiBMUCBzeW50aGVzaXMgZmlsdGVyLgorICogQHBhcmFtW291dF0gb3V0IHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtIGZpbHRlcl9jb2VmZnMgZmlsdGVyIGNvZWZmaWNpZW50cyAoLTB4ODAwMCA8PSAoMy4xMikgPCAweDgwMDApCisgKiBAcGFyYW0gaW4gaW5wdXQgc2lnbmFsCisgKiBAcGFyYW0gYnVmZmVyX2xlbmd0aCBhbW91bnQgb2YgZGF0YSB0byBwcm9jZXNzCisgKiBAcGFyYW0gZmlsdGVyX2xlbmd0aCBmaWx0ZXIgbGVuZ3RoICgxMCBmb3IgMTB0aCBvcmRlciBMUCBmaWx0ZXIpCisgKiBAcGFyYW0gc3RvcF9vbl9vdmVyZmxvdyAgIDEgLSByZXR1cm4gaW1tZWRpYXRlbHkgaWYgb3ZlcmZsb3cgb2NjdXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBpZ25vcmUgb3ZlcmZsb3dzCisgKiBAcGFyYW0gc2hpZnQgdGhlIHJlc3VsdCBpcyBzaGlmdGVkIHJpZ2h0IGJ5IHRoaXMgdmFsdWUKKyAqIEBwYXJhbSByb3VuZGVyIHRoZSBhbW91bnQgdG8gYWRkIGZvciByb3VuZGluZyAodXN1YWxseSAweDgwMCBvciAweGZmZikKKyAqCisgKiBAcmV0dXJuIDEgaWYgb3ZlcmZsb3cgb2NjdXJyZWQsIDAgLSBvdGhlcndpc2UKKyAqCisgKiBAbm90ZSBPdXRwdXQgYnVmZmVyIG11c3QgY29udGFpbiBmaWx0ZXJfbGVuZ3RoIHNhbXBsZXMgb2YgcGFzdAorICogICAgICAgc3BlZWNoIGRhdGEgYmVmb3JlIHBvaW50ZXIuCisgKgorICogUm91dGluZSBhcHBsaWVzIDEvQSh6KSBmaWx0ZXIgdG8gZ2l2ZW4gc3BlZWNoIGRhdGEuCisgKi8KK2ludCBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXIoaW50MTZfdCAqb3V0LCBjb25zdCBpbnQxNl90ICpmaWx0ZXJfY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICppbiwgaW50IGJ1ZmZlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWx0ZXJfbGVuZ3RoLCBpbnQgc3RvcF9vbl9vdmVyZmxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0LCBpbnQgcm91bmRlcik7CisKKy8qKgorICogTFAgc3ludGhlc2lzIGZpbHRlci4KKyAqIEBwYXJhbVtvdXRdIG91dCBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIKKyAqICAgICAgICAtIHRoZSBhcnJheSBvdXRbLWZpbHRlcl9sZW5ndGgsIC0xXSBtdXN0CisgKiAgICAgICAgY29udGFpbiB0aGUgcHJldmlvdXMgcmVzdWx0IG9mIHRoaXMgZmlsdGVyCisgKiBAcGFyYW0gZmlsdGVyX2NvZWZmcyBmaWx0ZXIgY29lZmZpY2llbnRzLgorICogQHBhcmFtIGluIGlucHV0IHNpZ25hbAorICogQHBhcmFtIGJ1ZmZlcl9sZW5ndGggYW1vdW50IG9mIGRhdGEgdG8gcHJvY2VzcworICogQHBhcmFtIGZpbHRlcl9sZW5ndGggZmlsdGVyIGxlbmd0aCAoMTAgZm9yIDEwdGggb3JkZXIgTFAgZmlsdGVyKS4gTXVzdCBiZQorICogICAgICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIDQgYW5kIGV2ZW4uCisgKgorICogQG5vdGUgT3V0cHV0IGJ1ZmZlciBtdXN0IGNvbnRhaW4gZmlsdGVyX2xlbmd0aCBzYW1wbGVzIG9mIHBhc3QKKyAqICAgICAgIHNwZWVjaCBkYXRhIGJlZm9yZSBwb2ludGVyLgorICoKKyAqIFJvdXRpbmUgYXBwbGllcyAxL0EoeikgZmlsdGVyIHRvIGdpdmVuIHNwZWVjaCBkYXRhLgorICovCit2b2lkIGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmZpbHRlcl9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluLCBpbnQgYnVmZmVyX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsdGVyX2xlbmd0aCk7CisKKy8qKgorICogTFAgemVybyBzeW50aGVzaXMgZmlsdGVyLgorICogQHBhcmFtW291dF0gb3V0IHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtIGZpbHRlcl9jb2VmZnMgZmlsdGVyIGNvZWZmaWNpZW50cy4KKyAqIEBwYXJhbSBpbiBpbnB1dCBzaWduYWwKKyAqICAgICAgICAtIHRoZSBhcnJheSBpblstZmlsdGVyX2xlbmd0aCwgLTFdIG11c3QKKyAqICAgICAgICBjb250YWluIHRoZSBwcmV2aW91cyBpbnB1dCBvZiB0aGlzIGZpbHRlcgorICogQHBhcmFtIGJ1ZmZlcl9sZW5ndGggYW1vdW50IG9mIGRhdGEgdG8gcHJvY2VzcworICogQHBhcmFtIGZpbHRlcl9sZW5ndGggZmlsdGVyIGxlbmd0aCAoMTAgZm9yIDEwdGggb3JkZXIgTFAgZmlsdGVyKQorICoKKyAqIEBub3RlIE91dHB1dCBidWZmZXIgbXVzdCBjb250YWluIGZpbHRlcl9sZW5ndGggc2FtcGxlcyBvZiBwYXN0CisgKiAgICAgICBzcGVlY2ggZGF0YSBiZWZvcmUgcG9pbnRlci4KKyAqCisgKiBSb3V0aW5lIGFwcGxpZXMgQSh6KSBmaWx0ZXIgdG8gZ2l2ZW4gc3BlZWNoIGRhdGEuCisgKi8KK3ZvaWQgZmZfY2VscF9scF96ZXJvX3N5bnRoZXNpc19maWx0ZXJmKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICpmaWx0ZXJfY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluLCBpbnQgYnVmZmVyX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWx0ZXJfbGVuZ3RoKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQ0VMUF9GSUxURVJTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2NlbHBfbWF0aC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2VscF9tYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2YjFhZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NlbHBfbWF0aC5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogVmFyaW91cyBmaXhlZC1wb2ludCBtYXRoIG9wZXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAiY2VscF9tYXRoLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCitzdGF0aWMgY29uc3QgdWludDE2X3QgZXhwMmFbXT0KK3sKKyAgICAgMCwgIDE0MzUsICAyOTAxLCAgNDQwMCwgIDU5MzEsICA3NDk2LCAgOTA5NiwgMTA3MzAsCisgMTI0MDAsIDE0MTA2LCAxNTg1MCwgMTc2MzIsIDE5NDU0LCAyMTMxNSwgMjMyMTYsIDI1MTYwLAorIDI3MTQ2LCAyOTE3NSwgMzEyNDksIDMzMzY4LCAzNTUzNCwgMzc3NDcsIDQwMDA5LCA0MjMyMCwKKyA0NDY4MiwgNDcwOTUsIDQ5NTYyLCA1MjA4MiwgNTQ2NTcsIDU3Mjg5LCA1OTk3OSwgNjI3MjcsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgZXhwMmJbXT0KK3sKKyAgICAgMywgICA3MTIsICAxNDI0LCAgMjEzNCwgIDI4NDUsICAzNTU3LCAgNDI3MCwgIDQ5ODIsCisgIDU2OTYsICA2NDA5LCAgNzEyNCwgIDc4MzksICA4NTU0LCAgOTI3MCwgIDk5ODYsIDEwNzA0LAorIDExNDIxLCAxMjEzOCwgMTI4NTcsIDEzNTc2LCAxNDI5NSwgMTUwMTQsIDE1NzM0LCAxNjQ1NSwKKyAxNzE3NiwgMTc4OTgsIDE4NjIwLCAxOTM0MywgMjAwNjYsIDIwNzkwLCAyMTUxNCwgMjIyMzgsCit9OworCitpbnQgZmZfZXhwMih1aW50MTZfdCBwb3dlcikKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmVzdWx0PSBleHAyYVtwb3dlcj4+MTBdICsgMHgxMDAwMDsKKworICAgIGF2X2Fzc2VydDIocG93ZXIgPD0gMHg3ZmZmKTsKKworICAgIHJlc3VsdD0gKHJlc3VsdDw8MykgKyAoKHJlc3VsdCpleHAyYlsocG93ZXI+PjUpJjMxXSk+PjE3KTsKKyAgICByZXR1cm4gcmVzdWx0ICsgKChyZXN1bHQqKHBvd2VyJjMxKSo4OSk+PjIyKTsKK30KKworLyoqCisgKiBUYWJsZSB1c2VkIHRvIGNvbXB1dGUgbG9nMih4KQorICoKKyAqIHRhYl9sb2cyW2ldID0gKDE8PDE1KSAqIGxvZzIoMSArIGkvMzIpLCBpPTAuLjMyCisgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCB0YWJfbG9nMlszM10gPQoreworI2lmZGVmIEc3MjlfQklURVhBQ1QKKyAgICAgIDAsICAgMTQ1NSwgICAyODY2LCAgIDQyMzYsICAgNTU2OCwgICA2ODYzLCAgIDgxMjQsICAgOTM1MiwKKyAgMTA1NDksICAxMTcxNiwgIDEyODU1LCAgMTM5NjcsICAxNTA1NCwgIDE2MTE3LCAgMTcxNTYsICAxODE3MiwKKyAgMTkxNjcsICAyMDE0MiwgIDIxMDk3LCAgMjIwMzMsICAyMjk1MSwgIDIzODUyLCAgMjQ3MzUsICAyNTYwMywKKyAgMjY0NTUsICAyNzI5MSwgIDI4MTEzLCAgMjg5MjIsICAyOTcxNiwgIDMwNDk3LCAgMzEyNjYsICAzMjAyMywgIDMyNzY3LAorI2Vsc2UKKyAgICAgIDQsICAgMTQ1OSwgICAyODcwLCAgIDQyNDAsICAgNTU3MiwgICA2ODY3LCAgIDgxMjcsICAgOTM1NSwKKyAgMTA1NTIsICAxMTcxOSwgIDEyODU4LCAgMTM5NzEsICAxNTA1NywgIDE2MTIwLCAgMTcxNTgsICAxODE3NSwKKyAgMTkxNzAsICAyMDE0NSwgIDIxMTAwLCAgMjIwMzYsICAyMjk1NCwgIDIzODU0LCAgMjQ3MzgsICAyNTYwNSwKKyAgMjY0NTcsICAyNzI5NCwgIDI4MTE2LCAgMjg5MjQsICAyOTcxOSwgIDMwNTAwLCAgMzEyNjksICAzMjAyNSwgIDMyNzY5LAorI2VuZGlmCit9OworCitpbnQgZmZfbG9nMl9xMTUodWludDMyX3QgdmFsdWUpCit7CisgICAgdWludDhfdCAgcG93ZXJfaW50OworICAgIHVpbnQ4X3QgIGZyYWNfeDA7CisgICAgdWludDE2X3QgZnJhY19keDsKKworICAgIC8vIFN0cmlwcGluZyB6ZXJvcyBmcm9tIGJlZ2lubmluZworICAgIHBvd2VyX2ludCA9IGF2X2xvZzIodmFsdWUpOworICAgIHZhbHVlIDw8PSAoMzEgLSBwb3dlcl9pbnQpOworCisgICAgLy8gYjMxIGlzIGFsd2F5cyBub24temVybyBub3cKKyAgICBmcmFjX3gwID0gKHZhbHVlICYgMHg3YzAwMDAwMCkgPj4gMjY7IC8vIGIyNi1iMzEgYW5kIFszMi4uNjNdIC0+IFswLi4zMV0KKyAgICBmcmFjX2R4ID0gKHZhbHVlICYgMHgwM2ZmZjgwMCkgPj4gMTE7CisKKyAgICB2YWx1ZSA9IHRhYl9sb2cyW2ZyYWNfeDBdOworICAgIHZhbHVlICs9IChmcmFjX2R4ICogKHRhYl9sb2cyW2ZyYWNfeDArMV0gLSB0YWJfbG9nMltmcmFjX3gwXSkpID4+IDE1OworCisgICAgcmV0dXJuIChwb3dlcl9pbnQgPDwgMTUpICsgdmFsdWU7Cit9CisKK2ludDY0X3QgZmZfZG90X3Byb2R1Y3QoY29uc3QgaW50MTZfdCAqYSwgY29uc3QgaW50MTZfdCAqYiwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQ2NF90IHN1bSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIHN1bSArPSBNVUwxNihhW2ldLCBiW2ldKTsKKworICAgIHJldHVybiBzdW07Cit9CisKK2Zsb2F0IGZmX2RvdF9wcm9kdWN0Zihjb25zdCBmbG9hdCogYSwgY29uc3QgZmxvYXQqIGIsIGludCBsZW5ndGgpCit7CisgICAgZmxvYXQgc3VtID0gMDsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCisgICAgICAgIHN1bSArPSBhW2ldICogYltpXTsKKworICAgIHJldHVybiBzdW07Cit9CisKK3ZvaWQgZmZfY2VscF9tYXRoX2luaXQoQ0VMUE1Db250ZXh0ICpjKQoreworICAgIGMtPmRvdF9wcm9kdWN0ZiAgID0gZmZfZG90X3Byb2R1Y3RmOworCisgICAgaWYoSEFWRV9NSVBTRlBVKQorICAgICAgICBmZl9jZWxwX21hdGhfaW5pdF9taXBzKGMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2VscF9tYXRoLmggYi9mZm1wZWcvbGliYXZjb2RlYy9jZWxwX21hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQzYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2VscF9tYXRoLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIFZhcmlvdXMgZml4ZWQtcG9pbnQgbWF0aCBvcGVyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFZsYWRpbWlyIFZvcm9zaGlsb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0NFTFBfTUFUSF9ICisjZGVmaW5lIEFWQ09ERUNfQ0VMUF9NQVRIX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHN0cnVjdCBDRUxQTUNvbnRleHQgeworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZG90IHByb2R1Y3QuCisgICAgICogQHBhcmFtIGEgaW5wdXQgZGF0YSBhcnJheQorICAgICAqIEBwYXJhbSBiIGlucHV0IGRhdGEgYXJyYXkKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIG51bWJlciBvZiBlbGVtZW50cworICAgICAqCisgICAgICogQHJldHVybiBkb3QgcHJvZHVjdCA9IHN1bSBvZiBlbGVtZW50d2lzZSBwcm9kdWN0cworICAgICAqLworICAgIGZsb2F0ICgqZG90X3Byb2R1Y3RmKShjb25zdCBmbG9hdCogYSwgY29uc3QgZmxvYXQqIGIsIGludCBsZW5ndGgpOworCit9Q0VMUE1Db250ZXh0OworCisvKioKKyAqIEluaXRpYWxpemUgQ0VMUE1Db250ZXh0LgorICovCit2b2lkIGZmX2NlbHBfbWF0aF9pbml0KENFTFBNQ29udGV4dCAqYyk7Cit2b2lkIGZmX2NlbHBfbWF0aF9pbml0X21pcHMoQ0VMUE1Db250ZXh0ICpjKTsKKworLyoqCisgKiBmaXhlZC1wb2ludCBpbXBsZW1lbnRhdGlvbiBvZiBleHAyKHgpIGluIFswOyAxXSBkb21haW4uCisgKiBAcGFyYW0gcG93ZXIgYXJndW1lbnQgdG8gZXhwMiwgMCA8PSBwb3dlciA8PSAweDdmZmYKKyAqCisgKiBAcmV0dXJuIHZhbHVlIG9mICgxPDwyMCkgKiBleHAyKHBvd2VyIC8gKDE8PDE1KSkKKyAqICAgICAgICAgMHg4MDAwYyA8PSByZXN1bHQgPD0gMHhmZmZlYQorICovCitpbnQgZmZfZXhwMih1aW50MTZfdCBwb3dlcik7CisKKy8qKgorICogQ2FsY3VsYXRlIGxvZzIoeCkuCisgKiBAcGFyYW0gdmFsdWUgZnVuY3Rpb24gYXJndW1lbnQsIDAgPCB2YWx1ZSA8PSA3ZmZmIGZmZmYKKyAqCisgKiBAcmV0dXJuIHZhbHVlIG9mICgxPDwxNSkgKiBsb2cyKHZhbHVlKQorICovCitpbnQgZmZfbG9nMl9xMTUodWludDMyX3QgdmFsdWUpOworCisvKioKKyAqIFNoaWZ0IHZhbHVlIGxlZnQgb3IgcmlnaHQgZGVwZW5kaW5nIG9uIHNpZ24gb2Ygb2Zmc2V0IHBhcmFtZXRlci4KKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBzaGlmdAorICogQHBhcmFtIG9mZnNldCBzaGlmdCBvZmZzZXQKKyAqCisgKiBAcmV0dXJuIHZhbHVlIDw8IG9mZnNldCwgaWYgb2Zmc2V0Pj0wOyB2YWx1ZSA+PiAtb2Zmc2V0IC0gb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJpZGlyX3NhbChpbnQgdmFsdWUsIGludCBvZmZzZXQpCit7CisgICAgaWYob2Zmc2V0IDwgMCkgcmV0dXJuIHZhbHVlID4+IC1vZmZzZXQ7CisgICAgZWxzZSAgICAgICAgICAgcmV0dXJuIHZhbHVlIDw8ICBvZmZzZXQ7Cit9CisKKy8qKgorICogcmV0dXJucyB0aGUgZG90IHByb2R1Y3Qgb2YgMiBpbnQxNl90IHZlY3RvcnMuCisgKiBAcGFyYW0gYSBpbnB1dCBkYXRhIGFycmF5CisgKiBAcGFyYW0gYiBpbnB1dCBkYXRhIGFycmF5CisgKiBAcGFyYW0gbGVuZ3RoIG51bWJlciBvZiBlbGVtZW50cworICoKKyAqIEByZXR1cm4gZG90IHByb2R1Y3QgPSBzdW0gb2YgZWxlbWVudHdpc2UgcHJvZHVjdHMKKyAqLworaW50NjRfdCBmZl9kb3RfcHJvZHVjdChjb25zdCBpbnQxNl90ICphLCBjb25zdCBpbnQxNl90ICpiLCBpbnQgbGVuZ3RoKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGRvdCBwcm9kdWN0LgorICogQHBhcmFtIGEgaW5wdXQgZGF0YSBhcnJheQorICogQHBhcmFtIGIgaW5wdXQgZGF0YSBhcnJheQorICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgZWxlbWVudHMKKyAqCisgKiBAcmV0dXJuIGRvdCBwcm9kdWN0ID0gc3VtIG9mIGVsZW1lbnR3aXNlIHByb2R1Y3RzCisgKi8KK2Zsb2F0IGZmX2RvdF9wcm9kdWN0Zihjb25zdCBmbG9hdCogYSwgY29uc3QgZmxvYXQqIGIsIGludCBsZW5ndGgpOworCisjZW5kaWYgLyogQVZDT0RFQ19DRUxQX01BVEhfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2dhX2RhdGEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NnYV9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzYTg2YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NnYV9kYXRhLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENHQS9FR0EvVkdBIFJPTSBkYXRhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENHQS9FR0EvVkdBIFJPTSBkYXRhCisgKiBAbm90ZSBmb250cyBhcmUgaW4gbGliYXZ1dGlsL3hnYV9mb250X2RhdGEuW2NoXQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJjZ2FfZGF0YS5oIgorCitjb25zdCB1aW50MzJfdCBmZl9jZ2FfcGFsZXR0ZVsxNl0gPSB7CisgICAgMHhGRjAwMDAwMCwgMHhGRjAwMDBBQSwgMHhGRjAwQUEwMCwgMHhGRjAwQUFBQSwgMHhGRkFBMDAwMCwgMHhGRkFBMDBBQSwgMHhGRkFBNTUwMCwgMHhGRkFBQUFBQSwKKyAgICAweEZGNTU1NTU1LCAweEZGNTU1NUZGLCAweEZGNTVGRjU1LCAweEZGNTVGRkZGLCAweEZGRkY1NTU1LCAweEZGRkY1NUZGLCAweEZGRkZGRjU1LCAweEZGRkZGRkZGLAorfTsKKworY29uc3QgdWludDMyX3QgZmZfZWdhX3BhbGV0dGVbNjRdID0geworICAgIDB4RkYwMDAwMDAsIDB4RkYwMDAwQUEsIDB4RkYwMEFBMDAsIDB4RkYwMEFBQUEsIDB4RkZBQTAwMDAsIDB4RkZBQTAwQUEsIDB4RkZBQUFBMDAsIDB4RkZBQUFBQUEsCisgICAgMHhGRjAwMDA1NSwgMHhGRjAwMDBGRiwgMHhGRjAwQUE1NSwgMHhGRjAwQUFGRiwgMHhGRkFBMDA1NSwgMHhGRkFBMDBGRiwgMHhGRkFBQUE1NSwgMHhGRkFBQUFGRiwKKyAgICAweEZGMDA1NTAwLCAweEZGMDA1NUFBLCAweEZGMDBGRjAwLCAweEZGMDBGRkFBLCAweEZGQUE1NTAwLCAweEZGQUE1NUFBLCAweEZGQUFGRjAwLCAweEZGQUFGRkFBLAorICAgIDB4RkYwMDU1NTUsIDB4RkYwMDU1RkYsIDB4RkYwMEZGNTUsIDB4RkYwMEZGRkYsIDB4RkZBQTU1NTUsIDB4RkZBQTU1RkYsIDB4RkZBQUZGNTUsIDB4RkZBQUZGRkYsCisgICAgMHhGRjU1MDAwMCwgMHhGRjU1MDBBQSwgMHhGRjU1QUEwMCwgMHhGRjU1QUFBQSwgMHhGRkZGMDAwMCwgMHhGRkZGMDBBQSwgMHhGRkZGQUEwMCwgMHhGRkZGQUFBQSwKKyAgICAweEZGNTUwMDU1LCAweEZGNTUwMEZGLCAweEZGNTVBQTU1LCAweEZGNTVBQUZGLCAweEZGRkYwMDU1LCAweEZGRkYwMEZGLCAweEZGRkZBQTU1LCAweEZGRkZBQUZGLAorICAgIDB4RkY1NTU1MDAsIDB4RkY1NTU1QUEsIDB4RkY1NUZGMDAsIDB4RkY1NUZGQUEsIDB4RkZGRjU1MDAsIDB4RkZGRjU1QUEsIDB4RkZGRkZGMDAsIDB4RkZGRkZGQUEsCisgICAgMHhGRjU1NTU1NSwgMHhGRjU1NTVGRiwgMHhGRjU1RkY1NSwgMHhGRjU1RkZGRiwgMHhGRkZGNTU1NSwgMHhGRkZGNTVGRiwgMHhGRkZGRkY1NSwgMHhGRkZGRkZGRgorfTsKKwordm9pZCBmZl9kcmF3X3BjX2ZvbnQodWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUsIGNvbnN0IHVpbnQ4X3QgKmZvbnQsIGludCBmb250X2hlaWdodCwgaW50IGNoLCBpbnQgZmcsIGludCBiZykKK3sKKyAgICBpbnQgY2hhcl95LCBtYXNrOworICAgIGZvciAoY2hhcl95ID0gMDsgY2hhcl95IDwgZm9udF9oZWlnaHQ7IGNoYXJfeSsrKSB7CisgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2s7IG1hc2sgPj49IDEpIHsKKyAgICAgICAgICAgICpkc3QrKyA9IGZvbnRbY2ggKiBmb250X2hlaWdodCArIGNoYXJfeV0gJiBtYXNrID8gZmcgOiBiZzsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gbGluZXNpemUgLSA4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2NnYV9kYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9jZ2FfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTI4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jZ2FfZGF0YS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDR0EvRUdBL1ZHQSBST00gZGF0YQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDR0EvRUdBL1ZHQSBST00gZGF0YQorICogQG5vdGUgZm9udHMgYXJlIGluIGxpYmF2dXRpbC94Z2FfZm9udF9kYXRhLltjaF0KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQ0dBX0RBVEFfSAorI2RlZmluZSBBVkNPREVDX0NHQV9EQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitleHRlcm4gY29uc3QgdWludDMyX3QgZmZfY2dhX3BhbGV0dGVbMTZdOworZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGZmX2VnYV9wYWxldHRlWzY0XTsKKworLyoqCisgKiBEcmF3IENHQS9FR0EvVkdBIGZvbnQgdG8gOC1iaXQgcGl4ZWwgYnVmZmVyCisgKgorICogQHBhcmFtIGRzdCBEZXN0aW5hdGlvbiBwaXhlbCBidWZmZXIKKyAqIEBwYXJhbSBsaW5lc2l6ZSBMaW5lc2l6ZSAocGl4ZWxzKQorICogQHBhcmFtIGZvbnQgRm9udCB0YWJsZS4gV2UgYXNzdW1lIGZvbnQgd2lkdGggaXMgYWx3YXlzIDggcGl4ZWxzIHdpZGUuCisgKiBAcGFyYW0gZm9udF9oZWlnaHQgRm9udCBoZWlnaHQgKHBpeGVscykKKyAqIEBwYXJhbSBmZyxiZyBGb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIHBhbGV0dGUgaW5kZXgKKyAqIEBwYXJhbSBjaCBDaGFyYWN0ZXIgdG8gZHJhdworICovCit2b2lkIGZmX2RyYXdfcGNfZm9udCh1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSwgY29uc3QgdWludDhfdCAqZm9udCwgaW50IGZvbnRfaGVpZ2h0LCBpbnQgY2gsIGludCBmZywgaW50IGJnKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQ0dBX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2hvbXBfYnNmLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9jaG9tcF9ic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjkzZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2hvbXBfYnNmLmMKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENob21wIGJpdHN0cmVhbSBmaWx0ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBbGV4IENvbnZlcnNlIDxhbGV4LmNvbnZlcnNlQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IGNob21wX2ZpbHRlcihBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMsCisgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgICAgICBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlmcmFtZSkKK3sKKyAgICB3aGlsZSAoYnVmX3NpemUgPiAwICYmICFidWZbYnVmX3NpemUtMV0pCisgICAgICAgIGJ1Zl9zaXplLS07CisKKyAgICAqcG91dGJ1ZiA9ICh1aW50OF90KikgYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFRoaXMgZmlsdGVyIHJlbW92ZXMgYSBzdHJpbmcgb2YgTlVMTCBieXRlcyBmcm9tIHRoZSBlbmQgb2YgYSBwYWNrZXQuCisgKi8KK0FWQml0U3RyZWFtRmlsdGVyIGZmX2Nob21wX2JzZiA9IHsKKyAgICAubmFtZSAgID0gImNob21wIiwKKyAgICAuZmlsdGVyID0gY2hvbXBfZmlsdGVyLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2NpbmVwYWsuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NpbmVwYWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjUxYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2luZXBhay5jCkBAIC0wLDAgKzEsNDg4IEBACisvKgorICogQ2luZXBhayBWaWRlbyBEZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENpbmVwYWsgdmlkZW8gZGVjb2RlcgorICogQGF1dGhvciBFd2FsZCBTbmVsIDxld2FsZEByYW1iby5pdHMudHVkZWxmdC5ubD4KKyAqCisgKiBAc2VlIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBDaW5lcGFrIGFsZ29yaXRobSwgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cuY3NzZS5tb25hc2guZWR1LmF1L350aW1mLworICogQHNlZSBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcXVpcmt5IGRhdGEgaW5zaWRlIFNlZ2EgRklMTS9DUEsgZmlsZXMsIHZpc2l0OgorICogICBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1TZWdhX0ZJTE0KKyAqCisgKiBDaW5lcGFrIGNvbG9yc3BhY2Ugc3VwcG9ydCAoYykgMjAxMyBSbCwgQWV0ZXkgR2xvYmFsIFRlY2hub2xvZ2llcyBBQgorICogQGF1dGhvciBDaW5lcGFrIGNvbG9yc3BhY2UsIFJsLCBBZXRleSBHbG9iYWwgVGVjaG5vbG9naWVzIEFCCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3R5cGVkZWYgdWludDhfdCBjdmlkX2NvZGVib29rWzEyXTsKKworI2RlZmluZSBNQVhfU1RSSVBTICAgICAgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgICAgICAgIGlkOworICAgIHVpbnQxNl90ICAgICAgICAgIHgxLCB5MTsKKyAgICB1aW50MTZfdCAgICAgICAgICB4MiwgeTI7CisgICAgY3ZpZF9jb2RlYm9vayAgICAgdjRfY29kZWJvb2tbMjU2XTsKKyAgICBjdmlkX2NvZGVib29rICAgICB2MV9jb2RlYm9va1syNTZdOworfSBjdmlkX3N0cmlwOworCit0eXBlZGVmIHN0cnVjdCBDaW5lcGFrQ29udGV4dCB7CisKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAqZnJhbWU7CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIGludCBzaXplOworCisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgICBpbnQgcGFsZXR0ZV92aWRlbzsKKyAgICBjdmlkX3N0cmlwIHN0cmlwc1tNQVhfU1RSSVBTXTsKKworICAgIGludCBzZWdhX2ZpbG1fc2tpcF9ieXRlczsKKworICAgIHVpbnQzMl90IHBhbFsyNTZdOworfSBDaW5lcGFrQ29udGV4dDsKKworc3RhdGljIHZvaWQgY2luZXBha19kZWNvZGVfY29kZWJvb2sgKGN2aWRfY29kZWJvb2sgKmNvZGVib29rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHVua19pZCwgaW50IHNpemUsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpCit7CisgICAgY29uc3QgdWludDhfdCAqZW9kID0gKGRhdGEgKyBzaXplKTsKKyAgICB1aW50MzJfdCBmbGFnLCBtYXNrOworICAgIGludCAgICAgIGksIG47CisgICAgdWludDhfdCAqcDsKKworICAgIC8qIGNoZWNrIGlmIHRoaXMgY2h1bmsgY29udGFpbnMgNC0gb3IgNi1lbGVtZW50IHZlY3RvcnMgKi8KKyAgICBuICAgID0gKGNodW5rX2lkICYgMHgwNCkgPyA0IDogNjsKKyAgICBmbGFnID0gMDsKKyAgICBtYXNrID0gMDsKKworICAgIHAgPSBjb2RlYm9va1swXTsKKyAgICBmb3IgKGk9MDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGlmICgoY2h1bmtfaWQgJiAweDAxKSAmJiAhKG1hc2sgPj49IDEpKSB7CisgICAgICAgICAgICBpZiAoKGRhdGEgKyA0KSA+IGVvZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZmxhZyAgPSBBVl9SQjMyIChkYXRhKTsKKyAgICAgICAgICAgIGRhdGEgKz0gNDsKKyAgICAgICAgICAgIG1hc2sgID0gMHg4MDAwMDAwMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKGNodW5rX2lkICYgMHgwMSkgfHwgKGZsYWcgJiBtYXNrKSkgeworICAgICAgICAgICAgaW50IGssIGtrOworCisgICAgICAgICAgICBpZiAoKGRhdGEgKyBuKSA+IGVvZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7ICsraykgeworICAgICAgICAgICAgICAgIGludCByID0gKmRhdGErKzsKKyAgICAgICAgICAgICAgICBmb3IgKGtrID0gMDsga2sgPCAzOyArK2trKQorICAgICAgICAgICAgICAgICAgICAqcCsrID0gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuID09IDYpIHsKKyAgICAgICAgICAgICAgICBpbnQgciwgZywgYiwgdSwgdjsKKyAgICAgICAgICAgICAgICB1ID0gKihpbnQ4X3QgKilkYXRhKys7CisgICAgICAgICAgICAgICAgdiA9ICooaW50OF90ICopZGF0YSsrOworICAgICAgICAgICAgICAgIHAgLT0gMTI7CisgICAgICAgICAgICAgICAgZm9yKGs9MDsgazw0OyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgciA9ICpwKysgKyB2KjI7CisgICAgICAgICAgICAgICAgICAgIGcgPSAqcCsrIC0gKHUvMikgLSB2OworICAgICAgICAgICAgICAgICAgICBiID0gKnAgICArIHUqMjsKKyAgICAgICAgICAgICAgICAgICAgcCAtPSAyOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gYXZfY2xpcF91aW50OChyKTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IGF2X2NsaXBfdWludDgoZyk7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBhdl9jbGlwX3VpbnQ4KGIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHAgKz0gMTI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY2luZXBha19kZWNvZGVfdmVjdG9ycyAoQ2luZXBha0NvbnRleHQgKnMsIGN2aWRfc3RyaXAgKnN0cmlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2h1bmtfaWQsIGludCBzaXplLCBjb25zdCB1aW50OF90ICpkYXRhKQoreworICAgIGNvbnN0IHVpbnQ4X3QgICAqZW9kID0gKGRhdGEgKyBzaXplKTsKKyAgICB1aW50MzJfdCAgICAgICAgIGZsYWcsIG1hc2s7CisgICAgdWludDhfdCAgICAgICAgICpjYjAsICpjYjEsICpjYjIsICpjYjM7CisgICAgaW50ICAgICAgICAgICAgIHgsIHk7CisgICAgY2hhciAgICAgICAgICAgICppcDAsICppcDEsICppcDIsICppcDM7CisKKyAgICBmbGFnID0gMDsKKyAgICBtYXNrID0gMDsKKworICAgIGZvciAoeT1zdHJpcC0+eTE7IHkgPCBzdHJpcC0+eTI7IHkrPTQpIHsKKworLyogdGFrZSBjYXJlIG9mIHkgZGltZW5zaW9uIG5vdCBiZWluZyBtdWx0aXBsZSBvZiA0LCBzdWNoIHN0cmVhbXMgZXhpc3QgKi8KKyAgICAgICAgaXAwID0gaXAxID0gaXAyID0gaXAzID0gcy0+ZnJhbWUtPmRhdGFbMF0gKworICAgICAgICAgIChzLT5wYWxldHRlX3ZpZGVvP3N0cmlwLT54MTpzdHJpcC0+eDEqMykgKyAoeSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgICAgIGlmKHMtPmF2Y3R4LT5oZWlnaHQgLSB5ID4gMSkgeworICAgICAgICAgICAgaXAxID0gaXAwICsgcy0+ZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgaWYocy0+YXZjdHgtPmhlaWdodCAtIHkgPiAyKSB7CisgICAgICAgICAgICAgICAgaXAyID0gaXAxICsgcy0+ZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgICAgIGlmKHMtPmF2Y3R4LT5oZWlnaHQgLSB5ID4gMykgeworICAgICAgICAgICAgICAgICAgICBpcDMgPSBpcDIgKyBzLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisvKiB0byBnZXQgdGhlIGNvcnJlY3QgcGljdHVyZSBmb3Igbm90LW11bHRpcGxlLW9mLTQgY2FzZXMgbGV0IHVzIGZpbGwKKyAqIGVhY2ggYmxvY2sgZnJvbSB0aGUgYm90dG9tIHVwLCB0aHVzIHBvc3NpYmx5IG92ZXJ3cml0aW5nIHRoZSB0b3AgbGluZQorICogbW9yZSB0aGFuIG9uY2UgYnV0IGVuZGluZyB3aXRoIHRoZSBjb3JyZWN0IGRhdGEgaW4gcGxhY2UKKyAqIChpbnN0ZWFkIG9mIGluLWxvb3AgY2hlY2tpbmcpICovCisKKyAgICAgICAgZm9yICh4PXN0cmlwLT54MTsgeCA8IHN0cmlwLT54MjsgeCs9NCkgeworICAgICAgICAgICAgaWYgKChjaHVua19pZCAmIDB4MDEpICYmICEobWFzayA+Pj0gMSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGRhdGEgKyA0KSA+IGVvZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICBmbGFnICA9IEFWX1JCMzIgKGRhdGEpOworICAgICAgICAgICAgICAgIGRhdGEgKz0gNDsKKyAgICAgICAgICAgICAgICBtYXNrICA9IDB4ODAwMDAwMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghKGNodW5rX2lkICYgMHgwMSkgfHwgKGZsYWcgJiBtYXNrKSkgeworICAgICAgICAgICAgICAgIGlmICghKGNodW5rX2lkICYgMHgwMikgJiYgIShtYXNrID4+PSAxKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGRhdGEgKyA0KSA+IGVvZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgICAgIGZsYWcgID0gQVZfUkIzMiAoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgbWFzayAgPSAweDgwMDAwMDAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoY2h1bmtfaWQgJiAweDAyKSB8fCAofmZsYWcgJiBtYXNrKSkgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwOworICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA+PSBlb2QpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgICAgICAgICBwID0gc3RyaXAtPnYxX2NvZGVib29rWypkYXRhKytdOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGFsZXR0ZV92aWRlbykgeworICAgICAgICAgICAgICAgICAgICAgICAgaXAzWzBdID0gaXAzWzFdID0gaXAyWzBdID0gaXAyWzFdID0gcFs2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwM1syXSA9IGlwM1szXSA9IGlwMlsyXSA9IGlwMlszXSA9IHBbOV07CisgICAgICAgICAgICAgICAgICAgICAgICBpcDFbMF0gPSBpcDFbMV0gPSBpcDBbMF0gPSBpcDBbMV0gPSBwWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaXAxWzJdID0gaXAxWzNdID0gaXAwWzJdID0gaXAwWzNdID0gcFszXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShpcDMgKyAwLCBwLCAzKTsgbWVtY3B5KGlwMyArIDMsIHAsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGlwMiArIDAsIHAsIDMpOyBtZW1jcHkoaXAyICsgMywgcCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwICs9IDM7IC8qIC4uLiArIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShpcDMgKyA2LCBwLCAzKTsgbWVtY3B5KGlwMyArIDksIHAsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGlwMiArIDYsIHAsIDMpOyBtZW1jcHkoaXAyICsgOSwgcCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwIC09IDk7IC8qIC4uLiArIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShpcDEgKyAwLCBwLCAzKTsgbWVtY3B5KGlwMSArIDMsIHAsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGlwMCArIDAsIHAsIDMpOyBtZW1jcHkoaXAwICsgMywgcCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwICs9IDM7IC8qIC4uLiArIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShpcDEgKyA2LCBwLCAzKTsgbWVtY3B5KGlwMSArIDksIHAsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGlwMCArIDYsIHAsIDMpOyBtZW1jcHkoaXAwICsgOSwgcCwgMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZyAmIG1hc2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChkYXRhICsgNCkgPiBlb2QpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgICAgICAgICBjYjAgPSBzdHJpcC0+djRfY29kZWJvb2tbKmRhdGErK107CisgICAgICAgICAgICAgICAgICAgIGNiMSA9IHN0cmlwLT52NF9jb2RlYm9va1sqZGF0YSsrXTsKKyAgICAgICAgICAgICAgICAgICAgY2IyID0gc3RyaXAtPnY0X2NvZGVib29rWypkYXRhKytdOworICAgICAgICAgICAgICAgICAgICBjYjMgPSBzdHJpcC0+djRfY29kZWJvb2tbKmRhdGErK107CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wYWxldHRlX3ZpZGVvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwOworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGlwMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBjYjJbNl07CisgICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gY2IyWzldOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IGNiM1s2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwICAgPSBjYjNbOV07CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gaXAyOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IGNiMlswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBjYjJbM107CisgICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gY2IzWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgKnAgICA9IGNiM1szXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBpcDE7CisgICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gY2IwWzZdOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IGNiMFs5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBjYjFbNl07CisgICAgICAgICAgICAgICAgICAgICAgICAqcCAgID0gY2IxWzldOworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGlwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBjYjBbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gY2IwWzNdOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IGNiMVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwICAgPSBjYjFbM107CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaXAzICsgMCwgY2IyICsgNiwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaXAzICsgNiwgY2IzICsgNiwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaXAyICsgMCwgY2IyICsgMCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaXAyICsgNiwgY2IzICsgMCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaXAxICsgMCwgY2IwICsgNiwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaXAxICsgNiwgY2IxICsgNiwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaXAwICsgMCwgY2IwICsgMCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaXAwICsgNiwgY2IxICsgMCwgNik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPnBhbGV0dGVfdmlkZW8pIHsKKyAgICAgICAgICAgICAgICBpcDAgKz0gNDsgIGlwMSArPSA0OworICAgICAgICAgICAgICAgIGlwMiArPSA0OyAgaXAzICs9IDQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlwMCArPSAxMjsgIGlwMSArPSAxMjsKKyAgICAgICAgICAgICAgICBpcDIgKz0gMTI7ICBpcDMgKz0gMTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW5lcGFrX2RlY29kZV9zdHJpcCAoQ2luZXBha0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdmlkX3N0cmlwICpzdHJpcCwgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IHNpemUpCit7CisgICAgY29uc3QgdWludDhfdCAqZW9kID0gKGRhdGEgKyBzaXplKTsKKyAgICBpbnQgICAgICBjaHVua19pZCwgY2h1bmtfc2l6ZTsKKworICAgIC8qIGNvb3JkaW5hdGUgc2FuaXR5IGNoZWNrcyAqLworICAgIGlmIChzdHJpcC0+eDIgPiBzLT53aWR0aCAgIHx8CisgICAgICAgIHN0cmlwLT55MiA+IHMtPmhlaWdodCAgfHwKKyAgICAgICAgc3RyaXAtPngxID49IHN0cmlwLT54MiB8fCBzdHJpcC0+eTEgPj0gc3RyaXAtPnkyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHdoaWxlICgoZGF0YSArIDQpIDw9IGVvZCkgeworICAgICAgICBjaHVua19pZCAgID0gZGF0YVswXTsKKyAgICAgICAgY2h1bmtfc2l6ZSA9IEFWX1JCMjQgKCZkYXRhWzFdKSAtIDQ7CisgICAgICAgIGlmKGNodW5rX3NpemUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgZGF0YSAgICAgICs9IDQ7CisgICAgICAgIGNodW5rX3NpemUgPSAoKGRhdGEgKyBjaHVua19zaXplKSA+IGVvZCkgPyAoZW9kIC0gZGF0YSkgOiBjaHVua19zaXplOworCisgICAgICAgIHN3aXRjaCAoY2h1bmtfaWQpIHsKKworICAgICAgICBjYXNlIDB4MjA6CisgICAgICAgIGNhc2UgMHgyMToKKyAgICAgICAgY2FzZSAweDI0OgorICAgICAgICBjYXNlIDB4MjU6CisgICAgICAgICAgICBjaW5lcGFrX2RlY29kZV9jb2RlYm9vayAoc3RyaXAtPnY0X2NvZGVib29rLCBjaHVua19pZCwKKyAgICAgICAgICAgICAgICBjaHVua19zaXplLCBkYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgyMjoKKyAgICAgICAgY2FzZSAweDIzOgorICAgICAgICBjYXNlIDB4MjY6CisgICAgICAgIGNhc2UgMHgyNzoKKyAgICAgICAgICAgIGNpbmVwYWtfZGVjb2RlX2NvZGVib29rIChzdHJpcC0+djFfY29kZWJvb2ssIGNodW5rX2lkLAorICAgICAgICAgICAgICAgIGNodW5rX3NpemUsIGRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDMwOgorICAgICAgICBjYXNlIDB4MzE6CisgICAgICAgIGNhc2UgMHgzMjoKKyAgICAgICAgICAgIHJldHVybiBjaW5lcGFrX2RlY29kZV92ZWN0b3JzIChzLCBzdHJpcCwgY2h1bmtfaWQsCisgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSwgZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IGNodW5rX3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKK3N0YXRpYyBpbnQgY2luZXBha19kZWNvZGUgKENpbmVwYWtDb250ZXh0ICpzKQoreworICAgIGNvbnN0IHVpbnQ4X3QgICplb2QgPSAocy0+ZGF0YSArIHMtPnNpemUpOworICAgIGludCAgICAgICAgICAgaSwgcmVzdWx0LCBzdHJpcF9zaXplLCBmcmFtZV9mbGFncywgbnVtX3N0cmlwczsKKyAgICBpbnQgICAgICAgICAgIHkwID0gMDsKKyAgICBpbnQgICAgICAgICAgIGVuY29kZWRfYnVmX3NpemU7CisKKyAgICBpZiAocy0+c2l6ZSA8IDEwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGZyYW1lX2ZsYWdzID0gcy0+ZGF0YVswXTsKKyAgICBudW1fc3RyaXBzICA9IEFWX1JCMTYgKCZzLT5kYXRhWzhdKTsKKyAgICBlbmNvZGVkX2J1Zl9zaXplID0gQVZfUkIyNCgmcy0+ZGF0YVsxXSk7CisKKyAgICAvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBmcmFtZSwgY2hlY2sgZm9yIGRldmlhbnQgU2VnYSBGSUxNIGRhdGEgKi8KKyAgICBpZiAocy0+c2VnYV9maWxtX3NraXBfYnl0ZXMgPT0gLTEpIHsKKyAgICAgICAgaWYgKCFlbmNvZGVkX2J1Zl9zaXplKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJlbmNvZGVkX2J1Zl9zaXplIDAiKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5jb2RlZF9idWZfc2l6ZSAhPSBzLT5zaXplICYmIChzLT5zaXplICUgZW5jb2RlZF9idWZfc2l6ZSkgIT0gMCkgeworICAgICAgICAgICAgLyogSWYgdGhlIGVuY29kZWQgZnJhbWUgc2l6ZSBkaWZmZXJzIGZyb20gdGhlIGZyYW1lIHNpemUgYXMgaW5kaWNhdGVkCisgICAgICAgICAgICAgKiBieSB0aGUgY29udGFpbmVyIGZpbGUsIHRoaXMgZGF0YSBsaWtlbHkgY29tZXMgZnJvbSBhIFNlZ2EgRklMTS9DUEsgZmlsZS4KKyAgICAgICAgICAgICAqIElmIHRoZSBmcmFtZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgdGhlIGJ5dGVzIEZFIDAwIDAwIDA2IDAwIDAwIHRoZW4KKyAgICAgICAgICAgICAqIHRoaXMgaXMgcHJvYmFibHkgb25lIG9mIHRoZSB0d28ga25vd24gZmlsZXMgdGhhdCBoYXZlIDYgZXh0cmEgYnl0ZXMKKyAgICAgICAgICAgICAqIGFmdGVyIHRoZSBmcmFtZSBoZWFkZXIuIEVsc2UsIGFzc3VtZSAyIGV4dHJhIGJ5dGVzLiBUaGUgY29udGFpbmVyCisgICAgICAgICAgICAgKiBzaXplIGFsc28gY2Fubm90IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGVuY29kZWQgc2l6ZS4gKi8KKyAgICAgICAgICAgIGlmIChzLT5zaXplID49IDE2ICYmCisgICAgICAgICAgICAgICAgKHMtPmRhdGFbMTBdID09IDB4RkUpICYmCisgICAgICAgICAgICAgICAgKHMtPmRhdGFbMTFdID09IDB4MDApICYmCisgICAgICAgICAgICAgICAgKHMtPmRhdGFbMTJdID09IDB4MDApICYmCisgICAgICAgICAgICAgICAgKHMtPmRhdGFbMTNdID09IDB4MDYpICYmCisgICAgICAgICAgICAgICAgKHMtPmRhdGFbMTRdID09IDB4MDApICYmCisgICAgICAgICAgICAgICAgKHMtPmRhdGFbMTVdID09IDB4MDApKQorICAgICAgICAgICAgICAgIHMtPnNlZ2FfZmlsbV9za2lwX2J5dGVzID0gNjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzLT5zZWdhX2ZpbG1fc2tpcF9ieXRlcyA9IDI7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcy0+c2VnYV9maWxtX3NraXBfYnl0ZXMgPSAwOworICAgIH0KKworICAgIHMtPmRhdGEgKz0gMTAgKyBzLT5zZWdhX2ZpbG1fc2tpcF9ieXRlczsKKworICAgIG51bV9zdHJpcHMgPSBGRk1JTihudW1fc3RyaXBzLCBNQVhfU1RSSVBTKTsKKworICAgIHMtPmZyYW1lLT5rZXlfZnJhbWUgPSAwOworCisgICAgZm9yIChpPTA7IGkgPCBudW1fc3RyaXBzOyBpKyspIHsKKyAgICAgICAgaWYgKChzLT5kYXRhICsgMTIpID4gZW9kKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgcy0+c3RyaXBzW2ldLmlkID0gcy0+ZGF0YVswXTsKKy8qIHplcm8geTEgbWVhbnMgInJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBzdHJpcGUiICovCisgICAgICAgIGlmICghKHMtPnN0cmlwc1tpXS55MSA9IEFWX1JCMTYgKCZzLT5kYXRhWzRdKSkpCisgICAgICAgICAgICBzLT5zdHJpcHNbaV0ueTIgPSAocy0+c3RyaXBzW2ldLnkxID0geTApICsgQVZfUkIxNiAoJnMtPmRhdGFbOF0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5zdHJpcHNbaV0ueTIgPSBBVl9SQjE2ICgmcy0+ZGF0YVs4XSk7CisgICAgICAgIHMtPnN0cmlwc1tpXS54MSA9IEFWX1JCMTYgKCZzLT5kYXRhWzZdKTsKKyAgICAgICAgcy0+c3RyaXBzW2ldLngyID0gQVZfUkIxNiAoJnMtPmRhdGFbMTBdKTsKKworICAgICAgICBpZiAocy0+c3RyaXBzW2ldLmlkID09IDB4MTApCisgICAgICAgICAgICBzLT5mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKworICAgICAgICBzdHJpcF9zaXplID0gQVZfUkIyNCAoJnMtPmRhdGFbMV0pIC0gMTI7CisgICAgICAgIGlmIChzdHJpcF9zaXplIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBzLT5kYXRhICAgKz0gMTI7CisgICAgICAgIHN0cmlwX3NpemUgPSAoKHMtPmRhdGEgKyBzdHJpcF9zaXplKSA+IGVvZCkgPyAoZW9kIC0gcy0+ZGF0YSkgOiBzdHJpcF9zaXplOworCisgICAgICAgIGlmICgoaSA+IDApICYmICEoZnJhbWVfZmxhZ3MgJiAweDAxKSkgeworICAgICAgICAgICAgbWVtY3B5IChzLT5zdHJpcHNbaV0udjRfY29kZWJvb2ssIHMtPnN0cmlwc1tpLTFdLnY0X2NvZGVib29rLAorICAgICAgICAgICAgICAgIHNpemVvZihzLT5zdHJpcHNbaV0udjRfY29kZWJvb2spKTsKKyAgICAgICAgICAgIG1lbWNweSAocy0+c3RyaXBzW2ldLnYxX2NvZGVib29rLCBzLT5zdHJpcHNbaS0xXS52MV9jb2RlYm9vaywKKyAgICAgICAgICAgICAgICBzaXplb2Yocy0+c3RyaXBzW2ldLnYxX2NvZGVib29rKSk7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSBjaW5lcGFrX2RlY29kZV9zdHJpcCAocywgJnMtPnN0cmlwc1tpXSwgcy0+ZGF0YSwgc3RyaXBfc2l6ZSk7CisKKyAgICAgICAgaWYgKHJlc3VsdCAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgICAgICBzLT5kYXRhICs9IHN0cmlwX3NpemU7CisgICAgICAgIHkwICAgID0gcy0+c3RyaXBzW2ldLnkyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGNpbmVwYWtfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENpbmVwYWtDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgcy0+d2lkdGggPSAoYXZjdHgtPndpZHRoICsgMykgJiB+MzsKKyAgICBzLT5oZWlnaHQgPSAoYXZjdHgtPmhlaWdodCArIDMpICYgfjM7CisKKyAgICBzLT5zZWdhX2ZpbG1fc2tpcF9ieXRlcyA9IC0xOyAgLyogdW5pbml0aWFsaXplZCBzdGF0ZSAqLworCisgICAgLy8gY2hlY2sgZm9yIHBhbGV0dGVkIGRhdGEKKyAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAhPSA4KSB7CisgICAgICAgIHMtPnBhbGV0dGVfdmlkZW8gPSAwOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+cGFsZXR0ZV92aWRlbyA9IDE7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworICAgIH0KKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2luZXBha19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCByZXQgPSAwLCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIENpbmVwYWtDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHMtPmRhdGEgPSBidWY7CisgICAgcy0+c2l6ZSA9IGJ1Zl9zaXplOworCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHMtPnBhbGV0dGVfdmlkZW8pIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIE5VTEwpOworICAgICAgICBpZiAocGFsKSB7CisgICAgICAgICAgICBzLT5mcmFtZS0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisgICAgICAgICAgICBtZW1jcHkocy0+cGFsLCBwYWwsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocmV0ID0gY2luZXBha19kZWNvZGUocykpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImNpbmVwYWtfZGVjb2RlIGZhaWxlZFxuIik7CisgICAgfQorCisgICAgaWYgKHMtPnBhbGV0dGVfdmlkZW8pCisgICAgICAgIG1lbWNweSAocy0+ZnJhbWUtPmRhdGFbMV0sIHMtPnBhbCwgQVZQQUxFVFRFX1NJWkUpOworCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIC8qIHJlcG9ydCB0aGF0IHRoZSBidWZmZXIgd2FzIGNvbXBsZXRlbHkgY29uc3VtZWQgKi8KKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjaW5lcGFrX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENpbmVwYWtDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2NpbmVwYWtfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiY2luZXBhayIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNpbmVwYWsiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQ0lORVBBSywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ2luZXBha0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGNpbmVwYWtfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gY2luZXBha19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGNpbmVwYWtfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2luZXBha2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2luZXBha2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzczNDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jaW5lcGFrZW5jLmMKQEAgLTAsMCArMSwxMzM1IEBACisvKgorICogQ2luZXBhayBlbmNvZGVyIChjKSAyMDExIFRvbWFzIEjkcmRpbgorICogaHR0cDovL3RpdGFuLmNvZGVtaWxsLnNlL350b21oYXIvY2luZXBha2VuYy5wYXRjaAorICoKKyAqIEZpeGVzIGFuZCBpbXByb3ZlbWVudHMsIHZpbnRhZ2UgZGVjb2RlcnMgY29tcGF0aWJpbGl0eQorICogIChjKSAyMDEzLCAyMDE0IFJsLCBBZXRleSBHbG9iYWwgVGVjaG5vbG9naWVzIEFCCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCitjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAordG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgordGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCithbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKK1NvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKK1RIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisgKiBUT0RPOgorICogLSBvcHRpbWl6ZTogY29sb3Igc3BhY2UgY29udmVyc2lvbiwgLi4uCisgKiAtIGltcGxlbWVudCBvcHRpb25zIHRvIHNldCB0aGUgbWluL21heCBudW1iZXIgb2Ygc3RyaXBzPworICogTUFZQkU6CisgKiAtICJvcHRpbWFsbHkiIHNwbGl0IHRoZSBmcmFtZSBpbnRvIHNldmVyYWwgbm9uLXJlZ3VsYXIgYXJlYXMKKyAqICAgdXNpbmcgYSBzZXBhcmF0ZSBjb2RlYm9vayBwYWlyIGZvciBlYWNoIGFyZWEgYW5kIGFwcHJveGltYXRpbmcKKyAqICAgdGhlIGFyZWEgYnkgc2V2ZXJhbCByZWN0YW5ndWxhciBzdHJpcHMgKGdlbmVyYWxseSBub3QgZnVsbCB3aWR0aCBvbmVzKQorICogICAodXNlIHF1YWR0cmVlIHNwbGl0dGluZz8gYSBzaW1wbGUgZml4ZWQtZ3JhbnVsYXJpdHkgZ3JpZD8pCisgKgorICoKKyAqIHZlcnNpb24gMjAxNC0wMS0yMyBSbAorICogLSBhZGRlZCBvcHRpb24gaGFuZGxpbmcgZm9yIGZsZXhpYmlsaXR5CisgKgorICogdmVyc2lvbiAyMDE0LTAxLTIxIFJsCisgKiAtIGJlbGlldmUgaXQgb3Igbm90LCBub3cgd2UgZ2V0IGV2ZW4gc21hbGxlciBmaWxlcywgd2l0aCBiZXR0ZXIgcXVhbGl0eQorICogICAod2hpY2ggbWVhbnMgSSBtaXNzZWQgYW4gb3B0aW1pemF0aW9uIGVhcmxpZXIgOikKKyAqCisgKiB2ZXJzaW9uIDIwMTQtMDEtMjAgUmwKKyAqIC0gbWFkZSB0aGUgZW5jb2RlciBjb21wYXRpYmxlIHdpdGggdmludGFnZSBkZWNvZGVycworICogICBhbmQgYWRkZWQgc29tZSB5ZXQgdW51c2VkIGNvZGUgZm9yIHBvc3NpYmxlIGZ1dHVyZQorICogICBpbmNyZW1lbnRhbCBjb2RlYm9vayB1cGRhdGVzCisgKiAtIGZpeGVkIGEgc21hbGwgbWVtb3J5IGxlYWsKKyAqCisgKiB2ZXJzaW9uIDIwMTMtMDQtMjggUmwKKyAqIC0gYnVnZml4ZWQgY29kZWJvb2sgb3B0aW1pemF0aW9uIGxvZ2ljCisgKgorICogdmVyc2lvbiAyMDEzLTAyLTE0IFJsCisgKiAiVmFsZW50aW5lJ3MgRGF5IiB2ZXJzaW9uOgorICogLSBtYWRlIHN0cmlwIGRpdmlzaW9uIG1vcmUgcm9idXN0CisgKiAtIG1pbmltaXplZCBicnV0ZWZvcmNpbmcgdGhlIG51bWJlciBvZiBzdHJpcHMsCisgKiAgIChjb3N0cyBzb21lIFIvRCBidXQgc3BlZWRzIHVwIGNvbXBlc3Npb24gYSBsb3QpLCB0aGUgaGV1cmlzdGljCisgKiAgIGFzc3VtcHRpb24gaXMgdGhhdCBzY29yZSBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBudW1iZXIgb2Ygc3RyaXBzIGhhcworICogICBvbmUgd2lkZSBtaW5pbXVtIHdoaWNoIG1vdmVzIHNsb3dseSwgb2YgY291cnNlIG5vdCBmdWxseSB0cnVlCisgKiAtIHNpbXBsaWZpZWQgY29kZWJvb2sgZ2VuZXJhdGlvbiwKKyAqICAgdGhlIG9sZCBjb2RlIHdhcyBtZWFudCBmb3Igb3RoZXIgb3B0aW1pemF0aW9ucyB0aGFuIHdlIGFjdHVhbGx5IGRvCisgKiAtIG9wdGltaXplZCB0aGUgY29kZWJvb2sgZ2VuZXJhdGlvbiAvIGVycm9yIGVzdGltYXRpb24gZm9yIE1PREVfTUMKKyAqCisgKiB2ZXJzaW9uIDIwMTMtMDItMTIgUmwKKyAqIC0gc2VwYXJhdGVkIGNvZGVib29rIHRyYWluaW5nIHNldHMsIGF2b2lkZWQgdGhlIHRyYW5zZmVyIG9mIHdhc3RlZCBieXRlcywKKyAqICAgd2hpY2ggeWllbGRzIGJvdGggYmV0dGVyIHF1YWxpdHkgYW5kIHNtYWxsZXIgZmlsZXMKKyAqIC0gbm93IHVzaW5nIHRoZSBjb3JyZWN0IGNvbG9yc3BhY2UgKFRPRE86IG1vdmUgY29udmVyc2lvbiB0byBsaWJzd3NjYWxlKQorICoKKyAqIHZlcnNpb24gMjAxMy0wMi0wOCBSbAorICogLSBmaXhlcy9vcHRpbWl6YXRpb24gaW4gbXVsdGlzdHJpcCBlbmNvZGluZyBhbmQgY29kZWJvb2sgc2l6ZSBjaG9pY2UsCisgKiAgIHF1YWxpdHkvYml0cmF0ZSBpcyBub3cgYmV0dGVyIHRoYW4gdGhhdCBvZiB0aGUgYmluYXJ5IHByb3ByaWV0YXJ5IGVuY29kZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCisjaW5jbHVkZSAiZWxiZy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNkZWZpbmUgQ1ZJRF9IRUFERVJfU0laRSAxMAorI2RlZmluZSBTVFJJUF9IRUFERVJfU0laRSAxMgorI2RlZmluZSBDSFVOS19IRUFERVJfU0laRSA0CisKKyNkZWZpbmUgTUJfU0laRSA0ICAgICAgICAgICAvLzR4NCBNQnMKKyNkZWZpbmUgTUJfQVJFQSAoTUJfU0laRSpNQl9TSVpFKQorCisjZGVmaW5lIFZFQ1RPUl9NQVggNiAgICAgICAgLy9zaXggb3IgZm91ciBlbnRyaWVzIHBlciB2ZWN0b3IgZGVwZW5kaW5nIG9uIGZvcm1hdAorI2RlZmluZSBDT0RFQk9PS19NQVggMjU2ICAgIC8vc2l6ZSBvZiBhIGNvZGVib29rCisKKyNkZWZpbmUgTUFYX1NUUklQUyAgMzIgICAgICAvL05vdGU6IGhhdmluZyBmZXdlciBjaG9pY2VzIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIHN0cmlwcyBzcGVlZHMgdXAgZW5jb2RpbmcgKG9idmlvdXNseSkKKyNkZWZpbmUgTUlOX1NUUklQUyAgMSAgICAgICAvL05vdGU6IGhhdmluZyBtb3JlIHN0cmlwcyBzcGVlZHMgdXAgZW5jb2RpbmcgdGhlIGZyYW1lICh0aGlzIGlzIGxlc3Mgb2J2aW91cykKKy8vIE1BWF9TVFJJUFMgbGltaXRzIHRoZSBtYXhpbXVtIHF1YWxpdHkgeW91IGNhbiByZWFjaAorLy8gICAgICAgICAgICB3aGVuIHlvdSB3YW50IGhpZ2h0IHF1YWxpdHkgb24gaGlnaCByZXNvbHV0aW9ucywKKy8vIE1JTl9TVFJJUFMgbGltaXRzIHRoZSBtaW5pbXVtIGVmZmljaWVudGx5IGVuY29kYWJsZSBiaXQgcmF0ZQorLy8gICAgICAgICAgICBvbiBsb3cgcmVzb2x1dGlvbnMKKy8vIHRoZSBudW1iZXJzIGFyZSBvbmx5IHVzZWQgZm9yIGJydXRlIGZvcmNlIG9wdGltaXphdGlvbiBmb3IgdGhlIGZpcnN0IGZyYW1lLAorLy8gZm9yIHRoZSBmb2xsb3dpbmcgZnJhbWVzIHRoZXkgYXJlIGFkYXB0aXZlbHkgcmVhZGp1c3RlZAorLy8gTk9URSB0aGUgZGVjb2RlciBpbiBmZm1wZWcgaGFzIGl0cyBvd24gYXJiaXRyYXJ5IGxpbWl0YXRpb24gb24gdGhlIG51bWJlcgorLy8gb2Ygc3RyaXBzLCBjdXJyZW50bHkgMzIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNT0RFX1YxX09OTFkgPSAwLAorICAgIE1PREVfVjFfVjQsCisgICAgTU9ERV9NQywKKworICAgIE1PREVfQ09VTlQsCit9IENpbmVwYWtNb2RlOworCit0eXBlZGVmIGVudW0geworICAgIEVOQ19WMSwKKyAgICBFTkNfVjQsCisgICAgRU5DX1NLSVAsCisKKyAgICBFTkNfVU5DRVJUQUlOCit9IG1iX2VuY29kaW5nOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHYxX3ZlY3RvcjsgICAgICAgICAgICAgICAgICAvL2luZGV4IGludG8gdjEgY29kZWJvb2sKKyAgICBpbnQgdjFfZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8vZXJyb3Igd2hlbiB1c2luZyBWMSBlbmNvZGluZworICAgIGludCB2NF92ZWN0b3JbNF07ICAgICAgICAgICAgICAgLy9pbmRpY2VzIGludG8gdjQgY29kZWJvb2tzCisgICAgaW50IHY0X2Vycm9yOyAgICAgICAgICAgICAgICAgICAvL2Vycm9yIHdoZW4gdXNpbmcgVjQgZW5jb2RpbmcKKyAgICBpbnQgc2tpcF9lcnJvcjsgICAgICAgICAgICAgICAgIC8vZXJyb3Igd2hlbiBibG9jayBpcyBza2lwcGVkIChha2EgY29waWVkIGZyb20gbGFzdCBmcmFtZSkKKyAgICBtYl9lbmNvZGluZyBiZXN0X2VuY29kaW5nOyAgICAgIC8vbGFzdCByZXN1bHQgZnJvbSBjYWxjdWxhdGVfbW9kZV9zY29yZSgpCit9IG1iX2luZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdjFfY29kZWJvb2tbQ09ERUJPT0tfTUFYKlZFQ1RPUl9NQVhdOworICAgIGludCB2NF9jb2RlYm9va1tDT0RFQk9PS19NQVgqVkVDVE9SX01BWF07CisgICAgaW50IHYxX3NpemU7CisgICAgaW50IHY0X3NpemU7CisgICAgQ2luZXBha01vZGUgbW9kZTsKK30gc3RyaXBfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICB1bnNpZ25lZCBjaGFyICpwaWN0X2J1ZnNbNF0sICpzdHJpcF9idWYsICpmcmFtZV9idWY7CisgICAgQVZGcmFtZSAqbGFzdF9mcmFtZTsKKyAgICBBVkZyYW1lICpiZXN0X2ZyYW1lOworICAgIEFWRnJhbWUgKnNjcmF0Y2hfZnJhbWU7CisgICAgQVZGcmFtZSAqaW5wdXRfZnJhbWU7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgaW50IHcsIGg7CisgICAgaW50IGZyYW1lX2J1Zl9zaXplOworICAgIGludCBjdXJmcmFtZSwga2V5aW50OworICAgIEFWTEZHIHJhbmRjdHg7CisgICAgdWludDY0X3QgbGFtYmRhOworICAgIGludCAqY29kZWJvb2tfaW5wdXQ7CisgICAgaW50ICpjb2RlYm9va19jbG9zZXN0OworICAgIG1iX2luZm8gKm1iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NQiBSRCBzdGF0ZQorICAgIGludCBtaW5fc3RyaXBzOyAgICAgICAgICAvL3RoZSBjdXJyZW50IGxpbWl0CisgICAgaW50IG1heF9zdHJpcHM7ICAgICAgICAgIC8vdGhlIGN1cnJlbnQgbGltaXQKKyNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCisgICAgbWJfaW5mbyAqYmVzdF9tYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IHJlbW92ZS4gb25seSB1c2VkIGZvciBwcmludGluZyBzdGF0cworICAgIGludCBudW1fdjFfbW9kZSwgbnVtX3Y0X21vZGUsIG51bV9tY19tb2RlOworICAgIGludCBudW1fdjFfZW5jcywgbnVtX3Y0X2VuY3MsIG51bV9za2lwczsKKyNlbmRpZgorLy8gb3B0aW9ucworICAgIGludCBtYXhfZXh0cmFfY2JfaXRlcmF0aW9uczsKKyAgICBpbnQgc2tpcF9lbXB0eV9jYjsKKyAgICBpbnQgbWluX21pbl9zdHJpcHM7CisgICAgaW50IG1heF9tYXhfc3RyaXBzOworICAgIGludCBzdHJpcF9udW1iZXJfZGVsdGFfcmFuZ2U7Cit9IENpbmVwYWtFbmNDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDaW5lcGFrRW5jQ29udGV4dCwgeCkKKyNkZWZpbmUgVkUgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJtYXhfZXh0cmFfY2JfaXRlcmF0aW9ucyIsICJNYXggZXh0cmEgY29kZWJvb2sgcmVjYWxjdWxhdGlvbiBwYXNzZXMsIG1vcmUgaXMgYmV0dGVyIGFuZCBzbG93ZXIiLCBPRkZTRVQobWF4X2V4dHJhX2NiX2l0ZXJhdGlvbnMpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDIgfSwgMCwgSU5UX01BWCwgVkUgfSwKKyAgICB7ICJza2lwX2VtcHR5X2NiIiwgIkF2b2lkIHdhc3RpbmcgYnl0ZXMsIGlnbm9yZSB2aW50YWdlIE1hY09TIGRlY29kZXIiLCBPRkZTRVQoc2tpcF9lbXB0eV9jYiksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgIm1heF9zdHJpcHMiLCAiTGltaXQgc3RyaXBzL2ZyYW1lLCB2aW50YWdlIGNvbXBhdGlibGUgaXMgMS4uMywgb3RoZXJ3aXNlIHRoZSBtb3JlIHRoZSBiZXR0ZXIiLCBPRkZTRVQobWF4X21heF9zdHJpcHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDMgfSwgTUlOX1NUUklQUywgTUFYX1NUUklQUywgVkUgfSwKKyAgICB7ICJtaW5fc3RyaXBzIiwgIkVuZm9yY2UgbWluIHN0cmlwcy9mcmFtZSwgbW9yZSBpcyB3b3JzZSBhbmQgZmFzdGVyLCBtdXN0IGJlIDw9IG1heF9zdHJpcHMiLCBPRkZTRVQobWluX21pbl9zdHJpcHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IE1JTl9TVFJJUFMgfSwgTUlOX1NUUklQUywgTUFYX1NUUklQUywgVkUgfSwKKyAgICB7ICJzdHJpcF9udW1iZXJfYWRhcHRpdml0eSIsICJIb3cgZmFzdCB0aGUgc3RyaXAgbnVtYmVyIGFkYXB0cywgbW9yZSBpcyBzbGlnaHRseSBiZXR0ZXIsIG11Y2ggc2xvd2VyIiwgT0ZGU0VUKHN0cmlwX251bWJlcl9kZWx0YV9yYW5nZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBNQVhfU1RSSVBTLU1JTl9TVFJJUFMsIFZFIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBjaW5lcGFrX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImNpbmVwYWsiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IGNpbmVwYWtfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENpbmVwYWtFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgeCwgbWJfY291bnQsIHN0cmlwX2J1Zl9zaXplLCBmcmFtZV9idWZfc2l6ZTsKKworICAgIGlmIChhdmN0eC0+d2lkdGggJiAzIHx8IGF2Y3R4LT5oZWlnaHQgJiAzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAid2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIG11bHRpcGxlcyBvZiBmb3VyIChnb3QgJWl4JWkpXG4iLAorICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKHMtPm1pbl9taW5fc3RyaXBzID4gcy0+bWF4X21heF9zdHJpcHMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaW5pbWFsIG51bWJlciBvZiBzdHJpcHMgY2FuIG5vdCBleGNlZWQgbWF4aW1hbCAoZ290ICVpIGFuZCAlaSlcbiIsCisgICAgICAgICAgICAgICAgcy0+bWluX21pbl9zdHJpcHMsIHMtPm1heF9tYXhfc3RyaXBzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoIShzLT5sYXN0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaWYgKCEocy0+YmVzdF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKQorICAgICAgICBnb3RvIGVub21lbTsKKyAgICBpZiAoIShzLT5zY3JhdGNoX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCisgICAgICAgIGdvdG8gZW5vbWVtOworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KQorICAgICAgICBpZiAoIShzLT5pbnB1dF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKQorICAgICAgICAgICAgZ290byBlbm9tZW07CisKKyAgICBpZiAoIShzLT5jb2RlYm9va19pbnB1dCA9IGF2X21hbGxvYyhzaXplb2YoaW50KSAqIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQpICogKGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQpID4+IDIpKSkKKyAgICAgICAgZ290byBlbm9tZW07CisKKyAgICBpZiAoIShzLT5jb2RlYm9va19jbG9zZXN0ID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICogKGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQpID4+IDIpKSkKKyAgICAgICAgZ290byBlbm9tZW07CisKKyAgICBmb3IoeCA9IDA7IHggPCAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDQgOiAzKTsgeCsrKQorICAgICAgICBpZighKHMtPnBpY3RfYnVmc1t4XSA9IGF2X21hbGxvYygoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDYgOiA0KSAqIChhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0KSA+PiAyKSkpCisgICAgICAgICAgICBnb3RvIGVub21lbTsKKworICAgIG1iX2NvdW50ID0gYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAvIE1CX0FSRUE7CisKKyAgICAvL3RoZSBsYXJnZXN0IHBvc3NpYmxlIGNodW5rIGlzIDB4MzEgd2l0aCBhbGwgTUJzIGVuY29kZWQgaW4gVjQgbW9kZQorICAgIC8vYW5kIGZ1bGwgY29kZWJvb2tzIGJlaW5nIHJlcGxhY2VkIGluIElOVEVSIG1vZGUsCisgICAgLy8gd2hpY2ggaXMgMzQgYml0cyBwZXIgTUIKKyAgICAvL2FuZCAyKjI1NiBleHRyYSBmbGFnIGJpdHMgcGVyIHN0cmlwCisgICAgc3RyaXBfYnVmX3NpemUgPSBTVFJJUF9IRUFERVJfU0laRSArIDMgKiBDSFVOS19IRUFERVJfU0laRSArIDIgKiBWRUNUT1JfTUFYICogQ09ERUJPT0tfTUFYICsgNCAqIChtYl9jb3VudCArIChtYl9jb3VudCArIDE1KSAvIDE2KSArICgyICogQ09ERUJPT0tfTUFYKS84OworCisgICAgZnJhbWVfYnVmX3NpemUgPSBDVklEX0hFQURFUl9TSVpFICsgcy0+bWF4X21heF9zdHJpcHMgKiBzdHJpcF9idWZfc2l6ZTsKKworICAgIGlmICghKHMtPnN0cmlwX2J1ZiA9IGF2X21hbGxvYyhzdHJpcF9idWZfc2l6ZSkpKQorICAgICAgICBnb3RvIGVub21lbTsKKworICAgIGlmICghKHMtPmZyYW1lX2J1ZiA9IGF2X21hbGxvYyhmcmFtZV9idWZfc2l6ZSkpKQorICAgICAgICBnb3RvIGVub21lbTsKKworICAgIGlmICghKHMtPm1iID0gYXZfbWFsbG9jX2FycmF5KG1iX2NvdW50LCBzaXplb2YobWJfaW5mbykpKSkKKyAgICAgICAgZ290byBlbm9tZW07CisKKyNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCisgICAgaWYgKCEocy0+YmVzdF9tYiA9IGF2X21hbGxvY19hcnJheShtYl9jb3VudCwgc2l6ZW9mKG1iX2luZm8pKSkpCisgICAgICAgIGdvdG8gZW5vbWVtOworI2VuZGlmCisKKyAgICBhdl9sZmdfaW5pdCgmcy0+cmFuZGN0eCwgMSk7CisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBzLT53ID0gYXZjdHgtPndpZHRoOworICAgIHMtPmggPSBhdmN0eC0+aGVpZ2h0OworICAgIHMtPmZyYW1lX2J1Zl9zaXplID0gZnJhbWVfYnVmX3NpemU7CisgICAgcy0+Y3VyZnJhbWUgPSAwOworICAgIHMtPmtleWludCA9IGF2Y3R4LT5rZXlpbnRfbWluOworICAgIHMtPnBpeF9mbXQgPSBhdmN0eC0+cGl4X2ZtdDsKKworICAgIC8vc2V0IHVwIEFWRnJhbWVzCisgICAgcy0+bGFzdF9mcmFtZS0+ZGF0YVswXSAgICAgICAgPSBzLT5waWN0X2J1ZnNbMF07CisgICAgcy0+bGFzdF9mcmFtZS0+bGluZXNpemVbMF0gICAgPSBzLT53OworICAgIHMtPmJlc3RfZnJhbWUtPmRhdGFbMF0gICAgICAgID0gcy0+cGljdF9idWZzWzFdOworICAgIHMtPmJlc3RfZnJhbWUtPmxpbmVzaXplWzBdICAgID0gcy0+dzsKKyAgICBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzBdICAgICA9IHMtPnBpY3RfYnVmc1syXTsKKyAgICBzLT5zY3JhdGNoX2ZyYW1lLT5saW5lc2l6ZVswXSA9IHMtPnc7CisKKyAgICBpZiAocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CisgICAgICAgIHMtPmxhc3RfZnJhbWUtPmRhdGFbMV0gICAgICAgID0gcy0+bGFzdF9mcmFtZS0+ZGF0YVswXSArIHMtPncgKiBzLT5oOworICAgICAgICBzLT5sYXN0X2ZyYW1lLT5kYXRhWzJdICAgICAgICA9IHMtPmxhc3RfZnJhbWUtPmRhdGFbMV0gKyAoKHMtPncgKiBzLT5oKSA+PiAyKTsKKyAgICAgICAgcy0+bGFzdF9mcmFtZS0+bGluZXNpemVbMV0gICAgPSBzLT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKKworICAgICAgICBzLT5iZXN0X2ZyYW1lLT5kYXRhWzFdICAgICAgICA9IHMtPmJlc3RfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKKyAgICAgICAgcy0+YmVzdF9mcmFtZS0+ZGF0YVsyXSAgICAgICAgPSBzLT5iZXN0X2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7CisgICAgICAgIHMtPmJlc3RfZnJhbWUtPmxpbmVzaXplWzFdICAgID0gcy0+YmVzdF9mcmFtZS0+bGluZXNpemVbMl0gPSBzLT53ID4+IDE7CisKKyAgICAgICAgcy0+c2NyYXRjaF9mcmFtZS0+ZGF0YVsxXSAgICAgPSBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzBdICsgcy0+dyAqIHMtPmg7CisgICAgICAgIHMtPnNjcmF0Y2hfZnJhbWUtPmRhdGFbMl0gICAgID0gcy0+c2NyYXRjaF9mcmFtZS0+ZGF0YVsxXSArICgocy0+dyAqIHMtPmgpID4+IDIpOworICAgICAgICBzLT5zY3JhdGNoX2ZyYW1lLT5saW5lc2l6ZVsxXSA9IHMtPnNjcmF0Y2hfZnJhbWUtPmxpbmVzaXplWzJdID0gcy0+dyA+PiAxOworCisgICAgICAgIHMtPmlucHV0X2ZyYW1lLT5kYXRhWzBdICAgICAgID0gcy0+cGljdF9idWZzWzNdOworICAgICAgICBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemVbMF0gICA9IHMtPnc7CisgICAgICAgIHMtPmlucHV0X2ZyYW1lLT5kYXRhWzFdICAgICAgID0gcy0+aW5wdXRfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKKyAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmRhdGFbMl0gICAgICAgPSBzLT5pbnB1dF9mcmFtZS0+ZGF0YVsxXSArICgocy0+dyAqIHMtPmgpID4+IDIpOworICAgICAgICBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemVbMV0gICA9IHMtPmlucHV0X2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKKyAgICB9CisKKyAgICBzLT5taW5fc3RyaXBzID0gcy0+bWluX21pbl9zdHJpcHM7CisgICAgcy0+bWF4X3N0cmlwcyA9IHMtPm1heF9tYXhfc3RyaXBzOworCisjaWZkZWYgQ0lORVBBS0VOQ19ERUJVRworICAgIHMtPm51bV92MV9tb2RlID0gcy0+bnVtX3Y0X21vZGUgPSBzLT5udW1fbWNfbW9kZSA9IHMtPm51bV92MV9lbmNzID0gcy0+bnVtX3Y0X2VuY3MgPSBzLT5udW1fc2tpcHMgPSAwOworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKKworZW5vbWVtOgorICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmxhc3RfZnJhbWUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmJlc3RfZnJhbWUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnNjcmF0Y2hfZnJhbWUpOworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5pbnB1dF9mcmFtZSk7CisgICAgYXZfZnJlZXAoJnMtPmNvZGVib29rX2lucHV0KTsKKyAgICBhdl9mcmVlcCgmcy0+Y29kZWJvb2tfY2xvc2VzdCk7CisgICAgYXZfZnJlZXAoJnMtPnN0cmlwX2J1Zik7CisgICAgYXZfZnJlZXAoJnMtPmZyYW1lX2J1Zik7CisgICAgYXZfZnJlZXAoJnMtPm1iKTsKKyNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCisgICAgYXZfZnJlZXAoJnMtPmJlc3RfbWIpOworI2VuZGlmCisKKyAgICBmb3IoeCA9IDA7IHggPCAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDQgOiAzKTsgeCsrKQorICAgICAgICBhdl9mcmVlcCgmcy0+cGljdF9idWZzW3hdKTsKKworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGNhbGN1bGF0ZV9tb2RlX3Njb3JlKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgaCwgc3RyaXBfaW5mbyAqaW5mbywgaW50IHJlcG9ydCwgaW50ICp0cmFpbmluZ19zZXRfdjFfc2hydW5rLCBpbnQgKnRyYWluaW5nX3NldF92NF9zaHJ1bmsKKyNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCissIGludDY0X3QgKnNlcnIKKyNlbmRpZgorKQoreworICAgIC8vc2NvcmUgPSBGRl9MQU1CREFfU0NBTEUgKiBlcnJvciArIGxhbWJkYSAqIGJpdHMKKyAgICBpbnQgeDsKKyAgICBpbnQgZW50cnlfc2l6ZSA9IHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDYgOiA0OworICAgIGludCBtYl9jb3VudCA9IHMtPncgKiBoIC8gTUJfQVJFQTsKKyAgICBtYl9pbmZvICptYjsKKyAgICBpbnQ2NF90IHNjb3JlMSwgc2NvcmUyLCBzY29yZTM7CisgICAgaW50NjRfdCByZXQgPSBzLT5sYW1iZGEgKiAoKGluZm8tPnYxX3NpemUgPyBDSFVOS19IRUFERVJfU0laRSArIGluZm8tPnYxX3NpemUgKiBlbnRyeV9zaXplIDogMCkgKworICAgICAgICAgICAgICAgICAgIChpbmZvLT52NF9zaXplID8gQ0hVTktfSEVBREVSX1NJWkUgKyBpbmZvLT52NF9zaXplICogZW50cnlfc2l6ZSA6IDApICsKKyAgICAgICAgICAgICAgICAgICBDSFVOS19IRUFERVJfU0laRSkgPDwgMzsKKworICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInNpemVzICUzaSAlM2kgLT4gJTlsbGkgc2NvcmUgbWJfY291bnQgJWkiLCBpbmZvLT52MV9zaXplLCBpbmZvLT52NF9zaXplLCAobG9uZyBsb25nIGludClyZXQsIG1iX2NvdW50KTsKKworI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKyAgICAqc2VyciA9IDA7CisjZW5kaWYKKworICAgIHN3aXRjaChpbmZvLT5tb2RlKSB7CisgICAgY2FzZSBNT0RFX1YxX09OTFk6CisgICAgICAgIC8vb25lIGJ5dGUgcGVyIE1CCisgICAgICAgIHJldCArPSBzLT5sYW1iZGEgKiA4ICogbWJfY291bnQ7CisKKy8vIHdoaWxlIGNhbGN1bGF0aW5nIHdlIGFzc3VtZSBhbGwgYmxvY2tzIGFyZSBFTkNfVjEKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgeworICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07CisgICAgICAgICAgICByZXQgKz0gRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yOworI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKyAgICAgICAgICAgICpzZXJyICs9IG1iLT52MV9lcnJvcjsKKyNlbmRpZgorLy8gdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQgZm9yIHJlcG9ydCBpbiBNT0RFX1YxX09OTFkKKy8vICAgICAgICAgICAgaWYoIXJlcG9ydCkKKyAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1YxOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX1YxX1Y0OgorICAgICAgICAvLzkgb3IgMzMgYml0cyBwZXIgTUIKKyAgICAgICAgaWYocmVwb3J0KSB7CisvLyBubyBtb3ZlcyBiZXR3ZWVuIHRoZSBjb3JyZXNwb25kaW5nIHRyYWluaW5nIHNldHMgYXJlIGFsbG93ZWQKKyAgICAgICAgICAgICp0cmFpbmluZ19zZXRfdjFfc2hydW5rID0gKnRyYWluaW5nX3NldF92NF9zaHJ1bmsgPSAwOworICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgeworICAgICAgICAgICAgICAgIGludCBtYmVycjsKKyAgICAgICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKKyAgICAgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCisgICAgICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDkgICsgRkZfTEFNQkRBX1NDQUxFICogKG1iZXJyPW1iLT52MV9lcnJvcik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzY29yZTEgPSBzLT5sYW1iZGEgKiAzMyArIEZGX0xBTUJEQV9TQ0FMRSAqIChtYmVycj1tYi0+djRfZXJyb3IpOworICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7CisjaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgorICAgICAgICAgICAgICAgICpzZXJyICs9IG1iZXJyOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vIGZpbmQgYmVzdCBtb2RlIHBlciBibG9jaworICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgeworICAgICAgICAgICAgICAgIG1iID0gJnMtPm1iW3hdOworICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDkgICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yOworICAgICAgICAgICAgICAgIHNjb3JlMiA9IHMtPmxhbWJkYSAqIDMzICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnY0X2Vycm9yOworCisgICAgICAgICAgICAgICAgaWYoc2NvcmUxIDw9IHNjb3JlMikgeworICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOworI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKyAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnYxX2Vycm9yOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1YxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTI7CisjaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgorICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djRfZXJyb3I7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfVjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX01DOgorICAgICAgICAvLzEsIDEwIG9yIDM0IGJpdHMgcGVyIE1CCisgICAgICAgIGlmKHJlcG9ydCkgeworICAgICAgICAgICAgaW50IHYxX3NocnVuayA9IDAsIHY0X3NocnVuayA9IDA7CisgICAgICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CisgICAgICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07CisvLyBpdCBpcyBPSyB0byBtb3ZlIGJsb2NrcyB0byBFTkNfU0tJUCBoZXJlCisvLyBidXQgbm90IHRvIGFueSBjb2RlYm9vayBlbmNvZGluZyEKKyAgICAgICAgICAgICAgICBzY29yZTEgPSBzLT5sYW1iZGEgKiAxICArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT5za2lwX2Vycm9yOworICAgICAgICAgICAgICAgIGlmKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19TS0lQKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7CisjaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgorICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+c2tpcF9lcnJvcjsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0gZWxzZSBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKHNjb3JlMj1zLT5sYW1iZGEgKiAxMCArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52MV9lcnJvcikgPj0gc2NvcmUxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19TS0lQOworICAgICAgICAgICAgICAgICAgICAgICAgKyt2MV9zaHJ1bms7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOworI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKyAgICAgICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT5za2lwX2Vycm9yOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUyOworI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKyAgICAgICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT52MV9lcnJvcjsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKHNjb3JlMz1zLT5sYW1iZGEgKiAzNCArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52NF9lcnJvcikgPj0gc2NvcmUxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19TS0lQOworICAgICAgICAgICAgICAgICAgICAgICAgKyt2NF9zaHJ1bms7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOworI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKyAgICAgICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT5za2lwX2Vycm9yOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUzOworI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKyAgICAgICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT52NF9lcnJvcjsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKnRyYWluaW5nX3NldF92MV9zaHJ1bmsgPSB2MV9zaHJ1bms7CisgICAgICAgICAgICAqdHJhaW5pbmdfc2V0X3Y0X3NocnVuayA9IHY0X3NocnVuazsKKyAgICAgICAgfSBlbHNlIHsgLy8gZmluZCBiZXN0IG1vZGUgcGVyIGJsb2NrCisgICAgICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CisgICAgICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07CisgICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogMSAgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+c2tpcF9lcnJvcjsKKyAgICAgICAgICAgICAgICBzY29yZTIgPSBzLT5sYW1iZGEgKiAxMCArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52MV9lcnJvcjsKKyAgICAgICAgICAgICAgICBzY29yZTMgPSBzLT5sYW1iZGEgKiAzNCArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52NF9lcnJvcjsKKworICAgICAgICAgICAgICAgIGlmKHNjb3JlMSA8PSBzY29yZTIgJiYgc2NvcmUxIDw9IHNjb3JlMykgeworICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOworI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKyAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnNraXBfZXJyb3I7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfU0tJUDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoc2NvcmUyIDw9IHNjb3JlMykgeworICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUyOworI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKyAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnYxX2Vycm9yOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1YxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTM7CisjaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgorICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djRfZXJyb3I7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfVjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3cml0ZV9jaHVua19oZWFkZXIodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY2h1bmtfdHlwZSwgaW50IGNodW5rX3NpemUpCit7CisgICAgYnVmWzBdID0gY2h1bmtfdHlwZTsKKyAgICBBVl9XQjI0KCZidWZbMV0sIGNodW5rX3NpemUgKyBDSFVOS19IRUFERVJfU0laRSk7CisgICAgcmV0dXJuIENIVU5LX0hFQURFUl9TSVpFOworfQorCitzdGF0aWMgaW50IGVuY29kZV9jb2RlYm9vayhDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50ICpjb2RlYm9vaywgaW50IHNpemUsIGludCBjaHVua190eXBlX3l1diwgaW50IGNodW5rX3R5cGVfZ3JheSwgdW5zaWduZWQgY2hhciAqYnVmKQoreworICAgIGludCB4LCB5LCByZXQsIGVudHJ5X3NpemUgPSBzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNDsKKyAgICBpbnQgaW5jcmVtZW50YWxfY29kZWJvb2tfcmVwbGFjZW1lbnRfbW9kZSA9IDA7IC8vIGhhcmRjb2RlZCBoZXJlLAorICAgICAgICAgICAgICAgIC8vIHRoZSBjb21waWxlciBzaG91bGQgbm90aWNlIHRoYXQgdGhpcyBpcyBhIGNvbnN0YW50IC0tIHJsCisKKyAgICByZXQgPSB3cml0ZV9jaHVua19oZWFkZXIoYnVmLAorICAgICAgICAgIHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/CisgICAgICAgICAgIGNodW5rX3R5cGVfeXV2KyhpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlPzE6MCkgOgorICAgICAgICAgICBjaHVua190eXBlX2dyYXkrKGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGU/MTowKSwKKyAgICAgICAgICBlbnRyeV9zaXplICogc2l6ZQorICAgICAgICAgICArIChpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlPyhzaXplKzMxKS8zMio0OjApICk7CisKKy8vIHdlIGRvIGNvZGVib29rIGVuY29kaW5nIGFjY29yZGluZyB0byB0aGUgImludHJhIiBtb2RlCisvLyBidXQgd2Uga2VlcCB0aGUgImRlYWQiIGNvZGUgZm9yIHJlZmVyZW5jZSBpbiBjYXNlIHdlIHdpbGwgd2FudAorLy8gdG8gdXNlIGluY3JlbWVudGFsIGNvZGVib29rIHVwZGF0ZXMgKHdoaWNoIGFjdHVhbGx5IHdvdWxkIGdpdmUgdXMKKy8vICJraW5kIG9mIiBtb3Rpb24gY29tcGVuc2F0aW9uLCBlc3BlY2lhbGx5IGluIDEgc3RyaXAvZnJhbWUgY2FzZSkgLS0gcmwKKy8vIChvZiBjb3Vyc2UsIHRoZSBjb2RlIHdpbGwgYmUgbm90IHVzZWZ1bCBhcy1pcykKKyAgICBpZihpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlKSB7CisgICAgICAgIGludCBmbGFncyA9IDA7CisgICAgICAgIGludCBmbGFnc2luZDsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7CisgICAgICAgICAgICBpZihmbGFncyA9PSAwKSB7CisgICAgICAgICAgICAgICAgZmxhZ3NpbmQgPSByZXQ7CisgICAgICAgICAgICAgICAgcmV0ICs9IDQ7CisgICAgICAgICAgICAgICAgZmxhZ3MgPSAweDgwMDAwMDAwOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgZmxhZ3MgPSAoKGZsYWdzPj4xKSB8IDB4ODAwMDAwMDApOworICAgICAgICAgICAgZm9yKHkgPSAwOyB5IDwgZW50cnlfc2l6ZTsgeSsrKQorICAgICAgICAgICAgICAgIGJ1ZltyZXQrK10gPSBjb2RlYm9va1t5ICsgeCplbnRyeV9zaXplXSBeICh5ID49IDQgPyAweDgwIDogMCk7CisgICAgICAgICAgICBpZigoZmxhZ3MmMHhmZmZmZmZmZikgPT0gMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgIEFWX1dCMzIoJmJ1ZltmbGFnc2luZF0sIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoZmxhZ3MpCisgICAgICAgICAgICBBVl9XQjMyKCZidWZbZmxhZ3NpbmRdLCBmbGFncyk7CisgICAgfSBlbHNlCisgICAgICAgIGZvcih4ID0gMDsgeCA8IHNpemU7IHgrKykKKyAgICAgICAgICAgIGZvcih5ID0gMDsgeSA8IGVudHJ5X3NpemU7IHkrKykKKyAgICAgICAgICAgICAgICBidWZbcmV0KytdID0gY29kZWJvb2tbeSArIHgqZW50cnlfc2l6ZV0gXiAoeSA+PSA0ID8gMHg4MCA6IDApOworCisgICAgcmV0dXJuIHJldDsKK30KKworLy9zZXRzIG91dCB0byB0aGUgc3ViIHBpY3R1cmUgc3RhcnRpbmcgYXQgKHgseSkgaW4gaW4KK3N0YXRpYyB2b2lkIGdldF9zdWJfcGljdHVyZShDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IHgsIGludCB5LCBBVlBpY3R1cmUgKmluLCBBVlBpY3R1cmUgKm91dCkKK3sKKyAgICBvdXQtPmRhdGFbMF0gPSBpbi0+ZGF0YVswXSArIHggKyB5ICogaW4tPmxpbmVzaXplWzBdOworICAgIG91dC0+bGluZXNpemVbMF0gPSBpbi0+bGluZXNpemVbMF07CisKKyAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKKyAgICAgICAgb3V0LT5kYXRhWzFdID0gaW4tPmRhdGFbMV0gKyAoeCA+PiAxKSArICh5ID4+IDEpICogaW4tPmxpbmVzaXplWzFdOworICAgICAgICBvdXQtPmxpbmVzaXplWzFdID0gaW4tPmxpbmVzaXplWzFdOworCisgICAgICAgIG91dC0+ZGF0YVsyXSA9IGluLT5kYXRhWzJdICsgKHggPj4gMSkgKyAoeSA+PiAxKSAqIGluLT5saW5lc2l6ZVsyXTsKKyAgICAgICAgb3V0LT5saW5lc2l6ZVsyXSA9IGluLT5saW5lc2l6ZVsyXTsKKyAgICB9Cit9CisKKy8vZGVjb2RlcyB0aGUgVjEgdmVjdG9yIGluIG1iIGludG8gdGhlIDR4NCBNQiBwb2ludGVkIHRvIGJ5IHN1Yl9waWN0CitzdGF0aWMgdm9pZCBkZWNvZGVfdjFfdmVjdG9yKENpbmVwYWtFbmNDb250ZXh0ICpzLCBBVlBpY3R1cmUgKnN1Yl9waWN0LCBpbnQgdjFfdmVjdG9yLCBzdHJpcF9pbmZvICppbmZvKQoreworICAgIGludCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CisKKyAgICBzdWJfcGljdC0+ZGF0YVswXVswXSA9CisgICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVsxXSA9CisgICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVsgICAgc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9CisgICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVsxKyAgc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9IGluZm8tPnYxX2NvZGVib29rW3YxX3ZlY3RvciplbnRyeV9zaXplXTsKKworICAgIHN1Yl9waWN0LT5kYXRhWzBdWzJdID0KKyAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzNdID0KKyAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzIrICBzdWJfcGljdC0+bGluZXNpemVbMF1dID0KKyAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzMrICBzdWJfcGljdC0+bGluZXNpemVbMF1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrMV07CisKKyAgICBzdWJfcGljdC0+ZGF0YVswXVsyKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPQorICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bMSsyKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPQorICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bICAzKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPQorICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bMSszKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZSsyXTsKKworICAgIHN1Yl9waWN0LT5kYXRhWzBdWzIrMipzdWJfcGljdC0+bGluZXNpemVbMF1dID0KKyAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzMrMipzdWJfcGljdC0+bGluZXNpemVbMF1dID0KKyAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzIrMypzdWJfcGljdC0+bGluZXNpemVbMF1dID0KKyAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzMrMypzdWJfcGljdC0+bGluZXNpemVbMF1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrM107CisKKyAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKKyAgICAgICAgc3ViX3BpY3QtPmRhdGFbMV1bMF0gPQorICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMV1bMV0gPQorICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMV1bICAgIHN1Yl9waWN0LT5saW5lc2l6ZVsxXV0gPQorICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMV1bMSsgIHN1Yl9waWN0LT5saW5lc2l6ZVsxXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZSs0XTsKKworICAgICAgICBzdWJfcGljdC0+ZGF0YVsyXVswXSA9CisgICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsyXVsxXSA9CisgICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsyXVsgICAgc3ViX3BpY3QtPmxpbmVzaXplWzJdXSA9CisgICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsyXVsxKyAgc3ViX3BpY3QtPmxpbmVzaXplWzJdXSA9IGluZm8tPnYxX2NvZGVib29rW3YxX3ZlY3RvciplbnRyeV9zaXplKzVdOworICAgIH0KK30KKworLy9kZWNvZGVzIHRoZSBWNCB2ZWN0b3JzIGluIG1iIGludG8gdGhlIDR4NCBNQiBwb2ludGVkIHRvIGJ5IHN1Yl9waWN0CitzdGF0aWMgdm9pZCBkZWNvZGVfdjRfdmVjdG9yKENpbmVwYWtFbmNDb250ZXh0ICpzLCBBVlBpY3R1cmUgKnN1Yl9waWN0LCBpbnQgKnY0X3ZlY3Rvciwgc3RyaXBfaW5mbyAqaW5mbykKK3sKKyAgICBpbnQgaSwgeCwgeSwgZW50cnlfc2l6ZSA9IHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDYgOiA0OworCisgICAgZm9yKGkgPSB5ID0gMDsgeSA8IDQ7IHkgKz0gMikgeworICAgICAgICBmb3IoeCA9IDA7IHggPCA0OyB4ICs9IDIsIGkrKykgeworICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1beCAgICsgICAgIHkqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSplbnRyeV9zaXplXTsKKyAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdW3grMSArICAgICB5KnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSsxXTsKKyAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdW3ggICArICh5KzEpKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSsyXTsKKyAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdW3grMSArICh5KzEpKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSszXTsKKworICAgICAgICAgICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CisgICAgICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMV1bKHg+PjEpICsgKHk+PjEpKnN1Yl9waWN0LT5saW5lc2l6ZVsxXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSs0XTsKKyAgICAgICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsyXVsoeD4+MSkgKyAoeT4+MSkqc3ViX3BpY3QtPmxpbmVzaXplWzJdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSplbnRyeV9zaXplKzVdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5X21iKENpbmVwYWtFbmNDb250ZXh0ICpzLCBBVlBpY3R1cmUgKmEsIEFWUGljdHVyZSAqYikKK3sKKyAgICBpbnQgeSwgcDsKKworICAgIGZvcih5ID0gMDsgeSA8IE1CX1NJWkU7IHkrKykgeworICAgICAgICBtZW1jcHkoYS0+ZGF0YVswXSt5KmEtPmxpbmVzaXplWzBdLCBiLT5kYXRhWzBdK3kqYi0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICBNQl9TSVpFKTsKKyAgICB9CisKKyAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKKyAgICAgICAgZm9yKHAgPSAxOyBwIDw9IDI7IHArKykgeworICAgICAgICAgICAgZm9yKHkgPSAwOyB5IDwgTUJfU0laRS8yOyB5KyspIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYS0+ZGF0YVtwXSArIHkqYS0+bGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgIGItPmRhdGFbcF0gKyB5KmItPmxpbmVzaXplW3BdLAorICAgICAgICAgICAgICAgICAgICAgICBNQl9TSVpFLzIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGVuY29kZV9tb2RlKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgaCwgQVZQaWN0dXJlICpzY3JhdGNoX3BpY3QsIEFWUGljdHVyZSAqbGFzdF9waWN0LCBzdHJpcF9pbmZvICppbmZvLCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisgICAgaW50IHgsIHksIHosIGZsYWdzLCBiaXRzLCB0ZW1wX3NpemUsIGhlYWRlcl9vZnMsIHJldCA9IDAsIG1iX2NvdW50ID0gcy0+dyAqIGggLyBNQl9BUkVBOworICAgIGludCBuZWVkc19leHRyYV9iaXQsIHNob3VsZF93cml0ZV90ZW1wOworICAgIHVuc2lnbmVkIGNoYXIgdGVtcFs2NF07IC8vMzIvMiA9IDE2IFY0IGJsb2NrcyBhdCA0IEIgZWFjaCAtPiA2NCBCCisgICAgbWJfaW5mbyAqbWI7CisgICAgQVZQaWN0dXJlIHN1Yl9zY3JhdGNoID0ge3swfX0sIHN1Yl9sYXN0ID0ge3swfX07CisKKyAgICAvL2VuY29kZSBjb2RlYm9va3MKKy8vLy8vLyBNYWNPUyB2aW50YWdlIGRlY29kZXIgY29tcGF0aWJpbGl0eSBkaWN0YXRlcyB0aGUgcHJlc2VuY2Ugb2YKKy8vLy8vLyB0aGUgY29kZWJvb2sgY2h1bmsgZXZlbiB3aGVuIHRoZSBjb2RlYm9vayBpcyBlbXB0eSAtIHByZXR0eSBkdW1iLi4uCisvLy8vLy8gYW5kIGFsc28gdGhlIGNlcnRhaW4gb3JkZXIgb2YgdGhlIGNvZGVib29rIGNodW5rcyAtLSBybAorICAgIGlmKGluZm8tPnY0X3NpemUgfHwgIXMtPnNraXBfZW1wdHlfY2IpCisgICAgICAgIHJldCArPSBlbmNvZGVfY29kZWJvb2socywgaW5mby0+djRfY29kZWJvb2ssIGluZm8tPnY0X3NpemUsIDB4MjAsIDB4MjQsIGJ1ZiArIHJldCk7CisKKyAgICBpZihpbmZvLT52MV9zaXplIHx8ICFzLT5za2lwX2VtcHR5X2NiKQorICAgICAgICByZXQgKz0gZW5jb2RlX2NvZGVib29rKHMsIGluZm8tPnYxX2NvZGVib29rLCBpbmZvLT52MV9zaXplLCAweDIyLCAweDI2LCBidWYgKyByZXQpOworCisgICAgLy91cGRhdGUgc2NyYXRjaCBwaWN0dXJlCisgICAgZm9yKHogPSB5ID0gMDsgeSA8IGg7IHkgKz0gTUJfU0laRSkgeworICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53OyB4ICs9IE1CX1NJWkUsIHorKykgeworICAgICAgICAgICAgbWIgPSAmcy0+bWJbel07CisKKyAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBzY3JhdGNoX3BpY3QsICZzdWJfc2NyYXRjaCk7CisKKyAgICAgICAgICAgIGlmKGluZm8tPm1vZGUgPT0gTU9ERV9NQyAmJiBtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfU0tJUCkgeworICAgICAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBsYXN0X3BpY3QsICZzdWJfbGFzdCk7CisgICAgICAgICAgICAgICAgY29weV9tYihzLCAmc3ViX3NjcmF0Y2gsICZzdWJfbGFzdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYoaW5mby0+bW9kZSA9PSBNT0RFX1YxX09OTFkgfHwgbWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKQorICAgICAgICAgICAgICAgIGRlY29kZV92MV92ZWN0b3IocywgJnN1Yl9zY3JhdGNoLCBtYi0+djFfdmVjdG9yLCBpbmZvKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkZWNvZGVfdjRfdmVjdG9yKHMsICZzdWJfc2NyYXRjaCwgbWItPnY0X3ZlY3RvciwgaW5mbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2goaW5mby0+bW9kZSkgeworICAgIGNhc2UgTU9ERV9WMV9PTkxZOgorICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtYl9jb3VudCA9ICVpXG4iLCBtYl9jb3VudCk7CisgICAgICAgIHJldCArPSB3cml0ZV9jaHVua19oZWFkZXIoYnVmICsgcmV0LCAweDMyLCBtYl9jb3VudCk7CisKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykKKyAgICAgICAgICAgIGJ1ZltyZXQrK10gPSBzLT5tYlt4XS52MV92ZWN0b3I7CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX1YxX1Y0OgorICAgICAgICAvL3JlbWVtYmVyIGhlYWRlciBwb3NpdGlvbgorICAgICAgICBoZWFkZXJfb2ZzID0gcmV0OworICAgICAgICByZXQgKz0gQ0hVTktfSEVBREVSX1NJWkU7CisKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHggKz0gMzIpIHsKKyAgICAgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgICAgIGZvcih5ID0geDsgeSA8IEZGTUlOKHgrMzIsIG1iX2NvdW50KTsgeSsrKQorICAgICAgICAgICAgICAgIGlmKHMtPm1iW3ldLmJlc3RfZW5jb2RpbmcgPT0gRU5DX1Y0KQorICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSAxIDw8ICgzMSAtIHkgKyB4KTsKKworICAgICAgICAgICAgQVZfV0IzMigmYnVmW3JldF0sIGZsYWdzKTsKKyAgICAgICAgICAgIHJldCArPSA0OworCisgICAgICAgICAgICBmb3IoeSA9IHg7IHkgPCBGRk1JTih4KzMyLCBtYl9jb3VudCk7IHkrKykgeworICAgICAgICAgICAgICAgIG1iID0gJnMtPm1iW3ldOworCisgICAgICAgICAgICAgICAgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKQorICAgICAgICAgICAgICAgICAgICBidWZbcmV0KytdID0gbWItPnYxX3ZlY3RvcjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZvcih6ID0gMDsgeiA8IDQ7IHorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltyZXQrK10gPSBtYi0+djRfdmVjdG9yW3pdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd3JpdGVfY2h1bmtfaGVhZGVyKGJ1ZiArIGhlYWRlcl9vZnMsIDB4MzAsIHJldCAtIGhlYWRlcl9vZnMgLSBDSFVOS19IRUFERVJfU0laRSk7CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX01DOgorICAgICAgICAvL3JlbWVtYmVyIGhlYWRlciBwb3NpdGlvbgorICAgICAgICBoZWFkZXJfb2ZzID0gcmV0OworICAgICAgICByZXQgKz0gQ0hVTktfSEVBREVSX1NJWkU7CisgICAgICAgIGZsYWdzID0gYml0cyA9IHRlbXBfc2l6ZSA9IDA7CisKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgeworICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07CisgICAgICAgICAgICBmbGFncyB8PSAobWItPmJlc3RfZW5jb2RpbmcgIT0gRU5DX1NLSVApIDw8ICgzMSAtIGJpdHMrKyk7CisgICAgICAgICAgICBuZWVkc19leHRyYV9iaXQgPSAwOworICAgICAgICAgICAgc2hvdWxkX3dyaXRlX3RlbXAgPSAwOworCisgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyAhPSBFTkNfU0tJUCkgeworICAgICAgICAgICAgICAgIGlmKGJpdHMgPCAzMikKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WNCkgPDwgKDMxIC0gYml0cysrKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5lZWRzX2V4dHJhX2JpdCA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGJpdHMgPT0gMzIpIHsKKyAgICAgICAgICAgICAgICBBVl9XQjMyKCZidWZbcmV0XSwgZmxhZ3MpOworICAgICAgICAgICAgICAgIHJldCArPSA0OworICAgICAgICAgICAgICAgIGZsYWdzID0gYml0cyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfU0tJUCB8fCBuZWVkc19leHRyYV9iaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZidWZbcmV0XSwgdGVtcCwgdGVtcF9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHRlbXBfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9zaXplID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2hvdWxkX3dyaXRlX3RlbXAgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihuZWVkc19leHRyYV9iaXQpIHsKKyAgICAgICAgICAgICAgICBmbGFncyA9IChtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpIDw8IDMxOworICAgICAgICAgICAgICAgIGJpdHMgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCisgICAgICAgICAgICAgICAgdGVtcFt0ZW1wX3NpemUrK10gPSBtYi0+djFfdmVjdG9yOworICAgICAgICAgICAgZWxzZSBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpCisgICAgICAgICAgICAgICAgZm9yKHogPSAwOyB6IDwgNDsgeisrKQorICAgICAgICAgICAgICAgICAgICB0ZW1wW3RlbXBfc2l6ZSsrXSA9IG1iLT52NF92ZWN0b3Jbel07CisKKyAgICAgICAgICAgIGlmKHNob3VsZF93cml0ZV90ZW1wKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZidWZbcmV0XSwgdGVtcCwgdGVtcF9zaXplKTsKKyAgICAgICAgICAgICAgICByZXQgKz0gdGVtcF9zaXplOworICAgICAgICAgICAgICAgIHRlbXBfc2l6ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihiaXRzID4gMCkgeworICAgICAgICAgICAgQVZfV0IzMigmYnVmW3JldF0sIGZsYWdzKTsKKyAgICAgICAgICAgIHJldCArPSA0OworICAgICAgICAgICAgbWVtY3B5KCZidWZbcmV0XSwgdGVtcCwgdGVtcF9zaXplKTsKKyAgICAgICAgICAgIHJldCArPSB0ZW1wX3NpemU7CisgICAgICAgIH0KKworICAgICAgICB3cml0ZV9jaHVua19oZWFkZXIoYnVmICsgaGVhZGVyX29mcywgMHgzMSwgcmV0IC0gaGVhZGVyX29mcyAtIENIVU5LX0hFQURFUl9TSVpFKTsKKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvL2NvbXB1dGVzIGRpc3RvcnRpb24gb2YgNHg0IE1CIGluIGIgY29tcGFyZWQgdG8gYQorc3RhdGljIGludCBjb21wdXRlX21iX2Rpc3RvcnRpb24oQ2luZXBha0VuY0NvbnRleHQgKnMsIEFWUGljdHVyZSAqYSwgQVZQaWN0dXJlICpiKQoreworICAgIGludCB4LCB5LCBwLCBkLCByZXQgPSAwOworCisgICAgZm9yKHkgPSAwOyB5IDwgTUJfU0laRTsgeSsrKSB7CisgICAgICAgIGZvcih4ID0gMDsgeCA8IE1CX1NJWkU7IHgrKykgeworICAgICAgICAgICAgZCA9IGEtPmRhdGFbMF1beCArIHkqYS0+bGluZXNpemVbMF1dIC0gYi0+ZGF0YVswXVt4ICsgeSpiLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICByZXQgKz0gZCpkOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CisgICAgICAgIGZvcihwID0gMTsgcCA8PSAyOyBwKyspIHsKKyAgICAgICAgICAgIGZvcih5ID0gMDsgeSA8IE1CX1NJWkUvMjsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgTUJfU0laRS8yOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZCA9IGEtPmRhdGFbcF1beCArIHkqYS0+bGluZXNpemVbcF1dIC0gYi0+ZGF0YVtwXVt4ICsgeSpiLT5saW5lc2l6ZVtwXV07CisgICAgICAgICAgICAgICAgICAgIHJldCArPSBkKmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLy8gcmV0dXJuIHRoZSBwb3NzaWJseSBhZGp1c3RlZCBzaXplIG9mIHRoZSBjb2RlYm9vaworI2RlZmluZSBDRVJUQUlOKHgpICgoeCkhPUVOQ19VTkNFUlRBSU4pCitzdGF0aWMgaW50IHF1YW50aXplKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgaCwgQVZQaWN0dXJlICpwaWN0LAorICAgICAgICAgICAgICAgICAgICBpbnQgdjFtb2RlLCBzdHJpcF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICBtYl9lbmNvZGluZyBlbmNvZGluZykKK3sKKyAgICBpbnQgeCwgeSwgaSwgaiwgaywgeDIsIHkyLCB4MywgeTMsIHBsYW5lLCBzaGlmdCwgbWJuOworICAgIGludCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CisgICAgaW50ICpjb2RlYm9vayA9IHYxbW9kZSA/IGluZm8tPnYxX2NvZGVib29rIDogaW5mby0+djRfY29kZWJvb2s7CisgICAgaW50IHNpemUgPSB2MW1vZGUgPyBpbmZvLT52MV9zaXplIDogaW5mby0+djRfc2l6ZTsKKyAgICBpbnQ2NF90IHRvdGFsX2Vycm9yID0gMDsKKyAgICB1aW50OF90IHZxX3BpY3RfYnVmWyhNQl9BUkVBKjMpLzJdOworICAgIEFWUGljdHVyZSBzdWJfcGljdCwgdnFfcGljdDsKKworICAgIGZvcihtYm4gPSBpID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCArK21ibikgeworICAgICAgICAgICAgaW50ICpiYXNlOworCisgICAgICAgICAgICBpZihDRVJUQUlOKGVuY29kaW5nKSkgeworLy8gdXNlIGZvciB0aGUgdHJhaW5pbmcgb25seSB0aGUgYmxvY2tzIGtub3duIHRvIGJlIHRvIGJlIGVuY29kZWQgW3NpYzotXQorICAgICAgICAgICAgICAgaWYocy0+bWJbbWJuXS5iZXN0X2VuY29kaW5nICE9IGVuY29kaW5nKSBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmFzZSA9IHMtPmNvZGVib29rX2lucHV0ICsgaSplbnRyeV9zaXplOworICAgICAgICAgICAgaWYodjFtb2RlKSB7CisgICAgICAgICAgICAgICAgLy9zdWJzYW1wbGUKKyAgICAgICAgICAgICAgICBmb3IoaiA9IHkyID0gMDsgeTIgPCBlbnRyeV9zaXplOyB5MiArPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcih4MiA9IDA7IHgyIDwgNDsgeDIgKz0gMiwgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZSA9IHkyIDwgNCA/IDAgOiAxICsgKHgyID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSB5MiA8IDQgPyAwIDogMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHgzID0gc2hpZnQgPyAwIDogeDI7CisgICAgICAgICAgICAgICAgICAgICAgICB5MyA9IHNoaWZ0ID8gMCA6IHkyOworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVtqXSA9IChwaWN0LT5kYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArICAgICAgKCh5K3kzKSA+PiBzaGlmdCkgICAgICAqIHBpY3QtPmxpbmVzaXplW3BsYW5lXV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5kYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArIDEgKyAgKCh5K3kzKSA+PiBzaGlmdCkgICAgICAqIHBpY3QtPmxpbmVzaXplW3BsYW5lXV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5kYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArICAgICAoKCh5K3kzKSA+PiBzaGlmdCkgKyAxKSAqIHBpY3QtPmxpbmVzaXplW3BsYW5lXV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5kYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArIDEgKyAoKCh5K3kzKSA+PiBzaGlmdCkgKyAxKSAqIHBpY3QtPmxpbmVzaXplW3BsYW5lXV0pID4+IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vY29weQorICAgICAgICAgICAgICAgIGZvcihqID0geTIgPSAwOyB5MiA8IE1CX1NJWkU7IHkyICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKHgyID0gMDsgeDIgPCBNQl9TSVpFOyB4MiArPSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBlbnRyeV9zaXplOyBrKyssIGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lID0gayA+PSA0ID8gayAtIDMgOiAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoayA+PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgzID0gKHgreDIpID4+IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkzID0gKHkreTIpID4+IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDMgPSB4ICsgeDIgKyAoayAmIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MyA9IHkgKyB5MiArIChrID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vbal0gPSBwaWN0LT5kYXRhW3BsYW5lXVt4MyArIHkzKnBpY3QtPmxpbmVzaXplW3BsYW5lXV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpICs9IHYxbW9kZSA/IDEgOiA0OworICAgICAgICB9CisgICAgfQorLy8gICAgaWYoaSA8IG1ibioodjFtb2RlID8gMSA6IDQpKSB7CisvLyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInJlZHVjaW5nIHRyYWluaW5nIHNldCBmb3IgJXMgZnJvbSAlaSB0byAlaSAoZW5jb2RpbmcgJWkpXG4iLCB2MW1vZGU/InYxIjoidjQiLCBtYm4qKHYxbW9kZSA/IDEgOiA0KSwgaSwgZW5jb2RpbmcpOworLy8gICAgfQorCisgICAgaWYoaSA9PSAwKSAvLyBlbXB0eSB0cmFpbmluZyBzZXQsIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYoaSA8IHNpemUpIHsKKyAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIChDRVJUQUlOKGVuY29kaW5nKSA/IEFWX0xPR19FUlJPUiA6IEFWX0xPR19JTkZPKSwgIldPVUxEIFdBU1RFOiAlcyBjYnNpemUgJWkgYmlnZ2VyIHRoYW4gdHJhaW5pbmcgc2V0IHNpemUgJWkgKGVuY29kaW5nICVpKVxuIiwgdjFtb2RlPyJ2MSI6InY0Iiwgc2l6ZSwgaSwgZW5jb2RpbmcpOworICAgICAgICBzaXplID0gaTsKKyAgICB9CisKKyAgICBhdnByaXZfaW5pdF9lbGJnKHMtPmNvZGVib29rX2lucHV0LCBlbnRyeV9zaXplLCBpLCBjb2RlYm9vaywgc2l6ZSwgMSwgcy0+Y29kZWJvb2tfY2xvc2VzdCwgJnMtPnJhbmRjdHgpOworICAgIGF2cHJpdl9kb19lbGJnKHMtPmNvZGVib29rX2lucHV0LCBlbnRyeV9zaXplLCBpLCBjb2RlYm9vaywgc2l6ZSwgMSwgcy0+Y29kZWJvb2tfY2xvc2VzdCwgJnMtPnJhbmRjdHgpOworCisgICAgLy9zZXR1cCB2cV9waWN0LCB3aGljaCBjb250YWlucyBhIHNpbmdsZSBNQgorICAgIHZxX3BpY3QuZGF0YVswXSA9IHZxX3BpY3RfYnVmOworICAgIHZxX3BpY3QubGluZXNpemVbMF0gPSBNQl9TSVpFOworICAgIHZxX3BpY3QuZGF0YVsxXSA9ICZ2cV9waWN0X2J1ZltNQl9BUkVBXTsKKyAgICB2cV9waWN0LmRhdGFbMl0gPSB2cV9waWN0LmRhdGFbMV0gKyAoTUJfQVJFQSA+PiAyKTsKKyAgICB2cV9waWN0LmxpbmVzaXplWzFdID0gdnFfcGljdC5saW5lc2l6ZVsyXSA9IE1CX1NJWkUgPj4gMTsKKworICAgIC8vY29weSBpbmRpY2VzCisgICAgZm9yKGkgPSBqID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCBqKyspIHsKKyAgICAgICAgICAgIG1iX2luZm8gKm1iID0gJnMtPm1iW2pdOworLy8gc2tpcCB1bmludGVyZXN0aW5nIGJsb2NrcyBpZiB3ZSBrbm93IHRoZWlyIHByZWZlcnJlZCBlbmNvZGluZworICAgICAgICAgICAgaWYoQ0VSVEFJTihlbmNvZGluZykgJiYgbWItPmJlc3RfZW5jb2RpbmcgIT0gZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vcG9pbnQgc3ViX3BpY3QgdG8gY3VycmVudCBNQgorICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIHBpY3QsICZzdWJfcGljdCk7CisKKyAgICAgICAgICAgIGlmKHYxbW9kZSkgeworICAgICAgICAgICAgICAgIG1iLT52MV92ZWN0b3IgPSBzLT5jb2RlYm9va19jbG9zZXN0W2ldOworCisgICAgICAgICAgICAgICAgLy9maWxsIGluIHZxX3BpY3Qgd2l0aCBWMSBkYXRhCisgICAgICAgICAgICAgICAgZGVjb2RlX3YxX3ZlY3RvcihzLCAmdnFfcGljdCwgbWItPnYxX3ZlY3RvciwgaW5mbyk7CisKKyAgICAgICAgICAgICAgICBtYi0+djFfZXJyb3IgPSBjb21wdXRlX21iX2Rpc3RvcnRpb24ocywgJnN1Yl9waWN0LCAmdnFfcGljdCk7CisgICAgICAgICAgICAgICAgdG90YWxfZXJyb3IgKz0gbWItPnYxX2Vycm9yOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCA0OyBrKyspCisgICAgICAgICAgICAgICAgICAgIG1iLT52NF92ZWN0b3Jba10gPSBzLT5jb2RlYm9va19jbG9zZXN0W2kra107CisKKyAgICAgICAgICAgICAgICAvL2ZpbGwgaW4gdnFfcGljdCB3aXRoIFY0IGRhdGEKKyAgICAgICAgICAgICAgICBkZWNvZGVfdjRfdmVjdG9yKHMsICZ2cV9waWN0LCBtYi0+djRfdmVjdG9yLCBpbmZvKTsKKworICAgICAgICAgICAgICAgIG1iLT52NF9lcnJvciA9IGNvbXB1dGVfbWJfZGlzdG9ydGlvbihzLCAmc3ViX3BpY3QsICZ2cV9waWN0KTsKKyAgICAgICAgICAgICAgICB0b3RhbF9lcnJvciArPSBtYi0+djRfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpICs9IHYxbW9kZSA/IDEgOiA0OworICAgICAgICB9CisgICAgfQorLy8gY2hlY2sgdGhhdCB3ZSBkaWQgaXQgcmlnaHQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24KKyAgICBhdl9hc3NlcnQwKGkgPj0gc2l6ZSk7IC8vIHRyYWluaW5nIHNldCBpcyBubyBzbWFsbGVyIHRoYW4gdGhlIGNvZGVib29rCisKKyAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJpc3YxICVpIHNpemU9ICVpIGk9ICVpIGVycm9yICVsbGlcbiIsIHYxbW9kZSwgc2l6ZSwgaSwgKGxvbmcgbG9uZyBpbnQpdG90YWxfZXJyb3IpOworCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9za2lwX2Vycm9ycyhDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IGgsIEFWUGljdHVyZSAqbGFzdF9waWN0LCBBVlBpY3R1cmUgKnBpY3QsIHN0cmlwX2luZm8gKmluZm8pCit7CisgICAgaW50IHgsIHksIGk7CisgICAgQVZQaWN0dXJlIHN1Yl9sYXN0LCBzdWJfcGljdDsKKworICAgIGZvcihpID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCBpKyspIHsKKyAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBsYXN0X3BpY3QsICZzdWJfbGFzdCk7CisgICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgeCwgeSwgcGljdCwgICAgICAmc3ViX3BpY3QpOworCisgICAgICAgICAgICBzLT5tYltpXS5za2lwX2Vycm9yID0gY29tcHV0ZV9tYl9kaXN0b3J0aW9uKHMsICZzdWJfbGFzdCwgJnN1Yl9waWN0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgd3JpdGVfc3RyaXBfaGVhZGVyKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgeSwgaW50IGgsIGludCBrZXlmcmFtZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RyaXBfc2l6ZSkKK3sKKy8vIGFjdHVhbGx5IHdlIGFyZSBleGNsdXNpdmVseSB1c2luZyBpbnRyYSBzdHJpcCBjb2RpbmcgKGhvdyBtdWNoIGNhbiB3ZSB3aW4KKy8vIG90aGVyd2lzZT8gaG93IHRvIGNob29zZSB3aGljaCBwYXJ0IG9mIGEgY29kZWJvb2sgdG8gdXBkYXRlPyksCisvLyBrZXlmcmFtZXMgYXJlIGRpZmZlcmVudCBvbmx5IGJlY2F1c2Ugd2UgZGlzYWxsb3cgRU5DX1NLSVAgb24gdGhlbSAtLSBybAorLy8gKGJlc2lkZXMsIHRoZSBsb2dpYyBoZXJlIHVzZWQgdG8gYmUgaW52ZXJ0ZWQ6ICkKKy8vICAgIGJ1ZlswXSA9IGtleWZyYW1lID8gMHgxMTogMHgxMDsKKyAgICBidWZbMF0gPSBrZXlmcmFtZSA/IDB4MTA6IDB4MTE7CisgICAgQVZfV0IyNCgmYnVmWzFdLCBzdHJpcF9zaXplICsgU1RSSVBfSEVBREVSX1NJWkUpOworLy8gICAgQVZfV0IxNigmYnVmWzRdLCB5KTsgLyogdXNpbmcgYWJzb2x1dGUgeSB2YWx1ZXMgd29ya3MgLS0gcmwgKi8KKyAgICBBVl9XQjE2KCZidWZbNF0sIDApOyAvKiB1c2luZyByZWxhdGl2ZSB2YWx1ZXMgd29ya3MgYXMgd2VsbCAtLSBybCAqLworICAgIEFWX1dCMTYoJmJ1Zls2XSwgMCk7CisvLyAgICBBVl9XQjE2KCZidWZbOF0sIHkraCk7IC8qIHVzaW5nIGFic29sdXRlIHkgdmFsdWVzIHdvcmtzIC0tIHJsICovCisgICAgQVZfV0IxNigmYnVmWzhdLCBoKTsgLyogdXNpbmcgcmVsYXRpdmUgdmFsdWVzIHdvcmtzIGFzIHdlbGwgLS0gcmwgKi8KKyAgICBBVl9XQjE2KCZidWZbMTBdLCBzLT53KTsKKyAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJ3cml0ZV9zdHJpcF9oZWFkZXIoKSAleCBrZXlmcmFtZT0lZFxuIiwgYnVmWzBdLCBrZXlmcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcmRfc3RyaXAoQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCB5LCBpbnQgaCwgaW50IGtleWZyYW1lLCBBVlBpY3R1cmUgKmxhc3RfcGljdCwgQVZQaWN0dXJlICpwaWN0LCBBVlBpY3R1cmUgKnNjcmF0Y2hfcGljdCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQ2NF90ICpiZXN0X3Njb3JlCisjaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgorLCBpbnQ2NF90ICpiZXN0X3NlcnIKKyNlbmRpZgorKQoreworICAgIGludDY0X3Qgc2NvcmUgPSAwOworI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKyAgICBpbnQ2NF90IHNlcnI7CisjZW5kaWYKKyAgICBpbnQgYmVzdF9zaXplID0gMDsKKyAgICBzdHJpcF9pbmZvIGluZm87CisvLyBmb3IgY29kZWJvb2sgb3B0aW1pemF0aW9uOgorICAgIGludCB2MWVub3VnaCwgdjFfc2l6ZSwgdjRlbm91Z2gsIHY0X3NpemU7CisgICAgaW50IG5ld192MV9zaXplLCBuZXdfdjRfc2l6ZTsKKyAgICBpbnQgdjFzaHJ1bmssIHY0c2hydW5rOworCisgICAgaWYoIWtleWZyYW1lKQorICAgICAgICBjYWxjdWxhdGVfc2tpcF9lcnJvcnMocywgaCwgbGFzdF9waWN0LCBwaWN0LCAmaW5mbyk7CisKKyAgICAvL3RyeSBzb21lIHBvd2VycyBvZiA0IGZvciB0aGUgc2l6ZSBvZiB0aGUgY29kZWJvb2tzCisgICAgLy9jb25zdHJhaW50IHRoZSB2NCBjb2RlYm9vayB0byBiZSBubyBiaWdnZXIgdGhhbiB2MSBvbmUsCisgICAgLy8oYW5kIG5vIGxlc3MgdGhhbiB2MV9zaXplLzQpCisgICAgLy90aHVzIG1ha2luZyB2MSBwcmVmZXJhYmxlIGFuZCBwb3NzaWJseSBsb3Npbmcgc21hbGwgZGV0YWlscz8gc2hvdWxkIGJlIG9rCisjZGVmaW5lIFNNQUxMRVNUX0NPREVCT09LIDEKKyAgICBmb3IodjFlbm91Z2ggPSAwLCB2MV9zaXplID0gU01BTExFU1RfQ09ERUJPT0s7IHYxX3NpemUgPD0gQ09ERUJPT0tfTUFYICYmICF2MWVub3VnaDsgdjFfc2l6ZSA8PD0gMikgeworICAgICAgICBmb3IodjRlbm91Z2ggPSAwLCB2NF9zaXplID0gMDsgdjRfc2l6ZSA8PSB2MV9zaXplICYmICF2NGVub3VnaDsgdjRfc2l6ZSA9IHY0X3NpemUgPyB2NF9zaXplIDw8IDIgOiB2MV9zaXplID49IFNNQUxMRVNUX0NPREVCT09LIDw8IDIgPyB2MV9zaXplID4+IDIgOiBTTUFMTEVTVF9DT0RFQk9PSykgeworICAgICAgICAgICAgLy90cnkgYWxsIG1vZGVzCisgICAgICAgICAgICBmb3IoQ2luZXBha01vZGUgbW9kZSA9IDA7IG1vZGUgPCBNT0RFX0NPVU5UOyBtb2RlKyspIHsKKyAgICAgICAgICAgICAgICAvL2Rvbid0IGFsbG93IE1PREVfTUMgaW4gaW50cmEgZnJhbWVzCisgICAgICAgICAgICAgICAgaWYoa2V5ZnJhbWUgJiYgbW9kZSA9PSBNT0RFX01DKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmKG1vZGUgPT0gTU9ERV9WMV9PTkxZKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8udjFfc2l6ZSA9IHYxX3NpemU7CisvLyB0aGUgc2l6ZSBtYXkgc2hyaW5rIGV2ZW4gYmVmb3JlIG9wdGltaXphdGlvbnMgaWYgdGhlIGlucHV0IGlzIHNob3J0OgorICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSBxdWFudGl6ZShzLCBoLCBwaWN0LCAxLCAmaW5mbywgRU5DX1VOQ0VSVEFJTik7CisgICAgICAgICAgICAgICAgICAgIGlmKGluZm8udjFfc2l6ZSA8IHYxX3NpemUpCisvLyB0b28gZmV3IGVsaWdpYmxlIGJsb2Nrcywgbm8gc2Vuc2UgaW4gdHJ5aW5nIGJpZ2dlciBzaXplcworICAgICAgICAgICAgICAgICAgICAgICAgdjFlbm91Z2ggPSAxOworCisgICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gbW9kZSAhPSBNT0RFX1YxX09OTFkKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdjQgY29kZWJvb2sgaXMgZW1wdHkgdGhlbiBvbmx5IGFsbG93IFYxLW9ubHkgbW9kZQorICAgICAgICAgICAgICAgICAgICBpZighdjRfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIGlmKG1vZGUgPT0gTU9ERV9WMV9WNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gdjRfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IHF1YW50aXplKHMsIGgsIHBpY3QsIDAsICZpbmZvLCBFTkNfVU5DRVJUQUlOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZm8udjRfc2l6ZSA8IHY0X3NpemUpCisvLyB0b28gZmV3IGVsaWdpYmxlIGJsb2Nrcywgbm8gc2Vuc2UgaW4gdHJ5aW5nIGJpZ2dlciBzaXplcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0ZW5vdWdoID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGluZm8ubW9kZSA9IG1vZGU7CisvLyBjaG9vc2UgdGhlIGJlc3QgZW5jb2RpbmcgcGVyIGJsb2NrLCBiYXNlZCBvbiBjdXJyZW50IGV4cGVyaWVuY2UKKyAgICAgICAgICAgICAgICBzY29yZSA9IGNhbGN1bGF0ZV9tb2RlX3Njb3JlKHMsIGgsICZpbmZvLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYxc2hydW5rLCAmdjRzaHJ1bmsKKyNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCissICZzZXJyCisjZW5kaWYKKyk7CisKKyAgICAgICAgICAgICAgICBpZihtb2RlICE9IE1PREVfVjFfT05MWSl7CisgICAgICAgICAgICAgICAgICAgIGludCBleHRyYV9pdGVyYXRpb25zX2xpbWl0ID0gcy0+bWF4X2V4dHJhX2NiX2l0ZXJhdGlvbnM7CisvLyByZWNvbXB1dGUgdGhlIGNvZGVib29rcywgb21pdHRpbmcgdGhlIGV4dHJhIGJsb2NrcworLy8gd2UgYXNzdW1lIHdlIF9tYXlfIGNvbWUgaGVyZSB3aXRoIG1vcmUgYmxvY2tzIHRvIGVuY29kZSB0aGFuIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSB2MV9zaXplOworICAgICAgICAgICAgICAgICAgICBuZXdfdjFfc2l6ZSA9IHF1YW50aXplKHMsIGgsIHBpY3QsIDEsICZpbmZvLCBFTkNfVjEpOworICAgICAgICAgICAgICAgICAgICBpZihuZXdfdjFfc2l6ZSA8IGluZm8udjFfc2l6ZSl7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtb2RlICVpLCAlM2ksICUzaTogY3V0IHYxIGNvZGVib29rIHRvICVpIGVudHJpZXNcbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192MV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjFfc2l6ZSA9IG5ld192MV9zaXplOworICAgICAgICAgICAgICAgICAgICB9CisvLyB3ZSBhc3N1bWUgd2UgX21heV8gY29tZSBoZXJlIHdpdGggbW9yZSBibG9ja3MgdG8gZW5jb2RlIHRoYW4gYmVmb3JlCisgICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IHY0X3NpemU7CisgICAgICAgICAgICAgICAgICAgIG5ld192NF9zaXplID0gcXVhbnRpemUocywgaCwgcGljdCwgMCwgJmluZm8sIEVOQ19WNCk7CisgICAgICAgICAgICAgICAgICAgIGlmKG5ld192NF9zaXplIDwgaW5mby52NF9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtb2RlICVpLCAlM2ksICUzaTogY3V0IHY0IGNvZGVib29rIHRvICVpIGVudHJpZXMgYXQgZmlyc3QgaXRlcmF0aW9uXG4iLCBtb2RlLCB2MV9zaXplLCB2NF9zaXplLCBuZXdfdjRfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnY0X3NpemUgPSBuZXdfdjRfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorLy8gY2FsY3VsYXRlIHRoZSByZXN1bHRpbmcgc2NvcmUKKy8vIChkbyBub3QgbW92ZSBibG9ja3MgdG8gY29kZWJvb2sgZW5jb2RpbmdzIG5vdywgYXMgc29tZSBibG9ja3MgbWF5IGhhdmUKKy8vIGdvdCBiaWdnZXIgZXJyb3JzIGRlc3BpdGUgYSBzbWFsbGVyIHRyYWluaW5nIHNldCAtIGJ1dCB3ZSBkbyBub3QKKy8vIGV2ZXIgZ3JvdyB0aGUgdHJhaW5pbmcgc2V0cyBiYWNrKQorICAgICAgICAgICAgICAgICAgICBmb3IoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlID0gY2FsY3VsYXRlX21vZGVfc2NvcmUocywgaCwgJmluZm8sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2MXNocnVuaywgJnY0c2hydW5rCisjaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgorLCAmc2VycgorI2VuZGlmCispOworLy8gZG8gd2UgaGF2ZSBhIHJlYXNvbiB0byByZWl0ZXJhdGU/IGlmIHNvLCBoYXZlIHdlIHJlYWNoZWQgdGhlIGxpbWl0PworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCF2MXNocnVuayAmJiAhdjRzaHJ1bmspIHx8ICFleHRyYV9pdGVyYXRpb25zX2xpbWl0LS0pIGJyZWFrOworLy8gcmVjb21wdXRlIHRoZSBjb2RlYm9va3MsIG9taXR0aW5nIHRoZSBleHRyYSBibG9ja3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHYxc2hydW5rKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gdjFfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdjFfc2l6ZSA9IHF1YW50aXplKHMsIGgsIHBpY3QsIDEsICZpbmZvLCBFTkNfVjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5ld192MV9zaXplIDwgaW5mby52MV9zaXplKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibW9kZSAlaSwgJTNpLCAlM2k6IGN1dCB2MSBjb2RlYm9vayB0byAlaSBlbnRyaWVzXG4iLCBtb2RlLCB2MV9zaXplLCB2NF9zaXplLCBuZXdfdjFfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjFfc2l6ZSA9IG5ld192MV9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHY0c2hydW5rKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gdjRfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdjRfc2l6ZSA9IHF1YW50aXplKHMsIGgsIHBpY3QsIDAsICZpbmZvLCBFTkNfVjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5ld192NF9zaXplIDwgaW5mby52NF9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiBjdXQgdjQgY29kZWJvb2sgdG8gJWkgZW50cmllc1xuIiwgbW9kZSwgdjFfc2l6ZSwgdjRfc2l6ZSwgbmV3X3Y0X3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnY0X3NpemUgPSBuZXdfdjRfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICIlM2kgJTNpIHNjb3JlID0gJWxsaVxuIiwgdjFfc2l6ZSwgdjRfc2l6ZSwgKGxvbmcgbG9uZyBpbnQpc2NvcmUpOworCisgICAgICAgICAgICAgICAgaWYoYmVzdF9zaXplID09IDAgfHwgc2NvcmUgPCAqYmVzdF9zY29yZSkgeworCisgICAgICAgICAgICAgICAgICAgICpiZXN0X3Njb3JlID0gc2NvcmU7CisjaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgorICAgICAgICAgICAgICAgICAgICAqYmVzdF9zZXJyID0gc2VycjsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBiZXN0X3NpemUgPSBlbmNvZGVfbW9kZShzLCBoLCBzY3JhdGNoX3BpY3QsIGxhc3RfcGljdCwgJmluZm8sIHMtPnN0cmlwX2J1ZiArIFNUUklQX0hFQURFUl9TSVpFKTsKKworICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtb2RlICVpLCAlM2ksICUzaTogJTE4bGxpICVpIEIiLCBtb2RlLCBpbmZvLnYxX3NpemUsIGluZm8udjRfc2l6ZSwgKGxvbmcgbG9uZyBpbnQpc2NvcmUsIGJlc3Rfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CisjaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibW9kZSAlaSwgJTNpLCAlM2k6ICUxOGxsaSAlaSBCXG4iLCBtb2RlLCB2MV9zaXplLCB2NF9zaXplLCAobG9uZyBsb25nIGludClzZXJyLCBiZXN0X3NpemUpOworI2VuZGlmCisKKyNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIC8vc2F2ZSBNQiBlbmNvZGluZyBjaG9pY2VzCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5iZXN0X21iLCBzLT5tYiwgbWJfY291bnQqc2l6ZW9mKG1iX2luZm8pKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgIC8vbWVtY3B5KHN0cmlwX3RlbXAgKyBTVFJJUF9IRUFERVJfU0laRSwgc3RyaXBfdGVtcCwgYmVzdF9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfc3RyaXBfaGVhZGVyKHMsIHksIGgsIGtleWZyYW1lLCBzLT5zdHJpcF9idWYsIGJlc3Rfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCisgICAgLy9nYXRoZXIgc3RhdHMuIHRoaXMgd2lsbCBvbmx5IHdvcmsgcHJvcGVybHkgb2YgTUFYX1NUUklQUyA9PSAxCisgICAgaWYoYmVzdF9pbmZvLm1vZGUgPT0gTU9ERV9WMV9PTkxZKSB7CisgICAgICAgIHMtPm51bV92MV9tb2RlKys7CisgICAgICAgIHMtPm51bV92MV9lbmNzICs9IHMtPncqaC9NQl9BUkVBOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKGJlc3RfaW5mby5tb2RlID09IE1PREVfVjFfVjQpCisgICAgICAgICAgICBzLT5udW1fdjRfbW9kZSsrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5udW1fbWNfbW9kZSsrOworCisgICAgICAgIGludCB4OworICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53KmgvTUJfQVJFQTsgeCsrKQorICAgICAgICAgICAgaWYocy0+YmVzdF9tYlt4XS5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkKKyAgICAgICAgICAgICAgICBzLT5udW1fdjFfZW5jcysrOworICAgICAgICAgICAgZWxzZSBpZihzLT5iZXN0X21iW3hdLmJlc3RfZW5jb2RpbmcgPT0gRU5DX1Y0KQorICAgICAgICAgICAgICAgIHMtPm51bV92NF9lbmNzKys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcy0+bnVtX3NraXBzKys7CisgICAgfQorI2VuZGlmCisKKyAgICBiZXN0X3NpemUgKz0gU1RSSVBfSEVBREVSX1NJWkU7CisgICAgbWVtY3B5KGJ1Ziwgcy0+c3RyaXBfYnVmLCBiZXN0X3NpemUpOworCisgICAgcmV0dXJuIGJlc3Rfc2l6ZTsKK30KKworc3RhdGljIGludCB3cml0ZV9jdmlkX2hlYWRlcihDaW5lcGFrRW5jQ29udGV4dCAqcywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbnVtX3N0cmlwcywgaW50IGRhdGFfc2l6ZSwgaW50IGlzYWtleWZyYW1lKQoreworICAgIGJ1ZlswXSA9IGlzYWtleWZyYW1lID8gMCA6IDE7CisgICAgQVZfV0IyNCgmYnVmWzFdLCBkYXRhX3NpemUgKyBDVklEX0hFQURFUl9TSVpFKTsKKyAgICBBVl9XQjE2KCZidWZbNF0sIHMtPncpOworICAgIEFWX1dCMTYoJmJ1Zls2XSwgcy0+aCk7CisgICAgQVZfV0IxNigmYnVmWzhdLCBudW1fc3RyaXBzKTsKKworICAgIHJldHVybiBDVklEX0hFQURFUl9TSVpFOworfQorCitzdGF0aWMgaW50IHJkX2ZyYW1lKENpbmVwYWtFbmNDb250ZXh0ICpzLCBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50IGlzYWtleWZyYW1lLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgbnVtX3N0cmlwcywgc3RyaXAsIGksIHksIG5leHR5LCBzaXplLCB0ZW1wX3NpemU7CisgICAgQVZQaWN0dXJlIGxhc3RfcGljdCwgcGljdCwgc2NyYXRjaF9waWN0OworICAgIGludDY0X3QgYmVzdF9zY29yZSA9IDAsIHNjb3JlLCBzY29yZV90ZW1wOworI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKyAgICBpbnQ2NF90IGJlc3Rfc2VyciA9IDAsIHNlcnIsIHNlcnJfdGVtcDsKKyNlbmRpZgorCisgICAgaW50IGJlc3RfbnN0cmlwcyA9IC0xLCBiZXN0X3NpemUgPSAtMTsgLy8gbWFyayBhcyB1bmluaXRpYWx6ZWQKKworICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgeworICAgICAgICBpbnQgeDsKKy8vIGJ1aWxkIGEgY29weSBvZiB0aGUgZ2l2ZW4gZnJhbWUgaW4gdGhlIGNvcnJlY3QgY29sb3JzcGFjZQorICAgICAgICBmb3IoeSA9IDA7IHkgPCBzLT5oOyB5ICs9IDIpIHsKKyAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IHMtPnc7IHggKz0gMikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmlyWzJdOyBpbnQzMl90IHIsIGcsIGIsIHJyLCBnZywgYmI7CisgICAgICAgICAgICAgICAgaXJbMF0gPSAoKEFWUGljdHVyZSopZnJhbWUpLT5kYXRhWzBdICsgeCozICsgeSooKEFWUGljdHVyZSopZnJhbWUpLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICBpclsxXSA9IGlyWzBdICsgKChBVlBpY3R1cmUqKWZyYW1lKS0+bGluZXNpemVbMF07CisgICAgICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIChBVlBpY3R1cmUqKXMtPmlucHV0X2ZyYW1lLCAmc2NyYXRjaF9waWN0KTsKKyAgICAgICAgICAgICAgICByID0gZyA9IGIgPSAwOworICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8NDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpMSwgaTI7CisgICAgICAgICAgICAgICAgICAgIGkxID0gKGkmMSk7IGkyID0gKGk+PTIpOworICAgICAgICAgICAgICAgICAgICByciA9IGlyW2kyXVtpMSozKzBdOworICAgICAgICAgICAgICAgICAgICBnZyA9IGlyW2kyXVtpMSozKzFdOworICAgICAgICAgICAgICAgICAgICBiYiA9IGlyW2kyXVtpMSozKzJdOworICAgICAgICAgICAgICAgICAgICByICs9IHJyOyBnICs9IGdnOyBiICs9IGJiOworLy8gdXNpbmcgZml4ZWQgcG9pbnQgYXJpdGhtZXRpYyBmb3IgcG9ydGFibGUgcmVwZWF0YWJpbGl0eSwgc2NhbGluZyBieSAyXjIzCisvLyAiWSIKKy8vICAgICAgICAgICAgICAgICAgICByciA9IDAuMjg1NypyciArIDAuNTcxNCpnZyArIDAuMTQyOSpiYjsKKyAgICAgICAgICAgICAgICAgICAgcnIgPSAoMjM5NjYyNSpyciArIDQ3OTMyNTEqZ2cgKyAxMTk4NzMyKmJiKSA+PiAyMzsKKyAgICAgICAgICAgICAgICAgICAgaWYoICAgICAgcnIgPCAgIDApIHJyID0gICAwOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyciA+IDI1NSkgcnIgPSAyNTU7CisgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfcGljdC5kYXRhWzBdW2kxICsgaTIqc2NyYXRjaF9waWN0LmxpbmVzaXplWzBdXSA9IHJyOworICAgICAgICAgICAgICAgIH0KKy8vIGxldCB1cyBzY2FsZSBkb3duIGFzIGxhdGUgYXMgcG9zc2libGUKKy8vICAgICAgICAgICAgICAgIHIgLz0gNDsgZyAvPSA0OyBiIC89IDQ7CisvLyAiVSIKKy8vICAgICAgICAgICAgICAgIHJyID0gLTAuMTQyOSpyIC0gMC4yODU3KmcgKyAwLjQyODYqYjsKKyAgICAgICAgICAgICAgICByciA9ICgtMjk5NjgzKnIgLSA1OTkxNTYqZyArIDg5ODgzOSpiKSA+PiAyMzsKKyAgICAgICAgICAgICAgICBpZiggICAgICByciA8IC0xMjgpIHJyID0gLTEyODsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyciA+ICAxMjcpIHJyID0gIDEyNzsKKyAgICAgICAgICAgICAgICBzY3JhdGNoX3BpY3QuZGF0YVsxXVswXSA9IHJyICsgMTI4OyAvLyBxdWFudGl6ZSBuZWVkcyB1bnNpZ25lZAorLy8gIlYiCisvLyAgICAgICAgICAgICAgICByciA9IDAuMzU3MSpyIC0gMC4yODU3KmcgLSAwLjA3MTQqYjsKKyAgICAgICAgICAgICAgICByciA9ICg3NDg4OTMqciAtIDU5OTE1NipnIC0gMTQ5NzM3KmIpID4+IDIzOworICAgICAgICAgICAgICAgIGlmKCAgICAgIHJyIDwgLTEyOCkgcnIgPSAtMTI4OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJyID4gIDEyNykgcnIgPSAgMTI3OworICAgICAgICAgICAgICAgIHNjcmF0Y2hfcGljdC5kYXRhWzJdWzBdID0gcnIgKyAxMjg7IC8vIHF1YW50aXplIG5lZWRzIHVuc2lnbmVkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3dvdWxkIGJlIG5pY2UgYnV0IHF1aXRlIGNlcnRhaW5seSBpbmNvbXBhdGlibGUgd2l0aCB2aW50YWdlIHBsYXllcnM6CisgICAgLy8gc3VwcG9ydCBlbmNvZGluZyB6ZXJvIHN0cmlwcyAobWVhbmluZyBza2lwIHRoZSB3aG9sZSBmcmFtZSkKKyAgICBmb3IobnVtX3N0cmlwcyA9IHMtPm1pbl9zdHJpcHM7IG51bV9zdHJpcHMgPD0gcy0+bWF4X3N0cmlwcyAmJiBudW1fc3RyaXBzIDw9IHMtPmggLyBNQl9TSVpFOyBudW1fc3RyaXBzKyspIHsKKyAgICAgICAgc2NvcmUgPSAwOworICAgICAgICBzaXplID0gMDsKKyNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCisgICAgICAgIHNlcnIgPSAwOworI2VuZGlmCisKKyAgICAgICAgZm9yKHkgPSAwLCBzdHJpcCA9IDE7IHkgPCBzLT5oOyBzdHJpcCsrLCB5ID0gbmV4dHkpIHsKKyAgICAgICAgICAgIGludCBzdHJpcF9oZWlnaHQ7CisKKyAgICAgICAgICAgIG5leHR5ID0gc3RyaXAgKiBzLT5oIC8gbnVtX3N0cmlwczsgLy8gPD0gcy0+aAorICAgICAgICAgICAgLy9tYWtlIG5leHR5IHRoZSBuZXh0IG11bHRpcGxlIG9mIDQgaWYgbm90IGFscmVhZHkgdGhlcmUKKyAgICAgICAgICAgIGlmKG5leHR5ICYgMykKKyAgICAgICAgICAgICAgICBuZXh0eSArPSA0IC0gKG5leHR5ICYgMyk7CisKKyAgICAgICAgICAgIHN0cmlwX2hlaWdodCA9IG5leHR5IC0geTsKKyAgICAgICAgICAgIGlmKHN0cmlwX2hlaWdodCA8PSAwKSB7IC8vIGNhbiB0aGlzIGV2ZXIgaGFwcGVuPworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJza2lwcGluZyB6ZXJvIGhlaWdodCBzdHJpcCAlaSBvZiAlaVxuIiwgc3RyaXAsIG51bV9zdHJpcHMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpCisgICAgICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIDAsIHksIChBVlBpY3R1cmUqKXMtPmlucHV0X2ZyYW1lLCAgICAmcGljdCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIDAsIHksIChBVlBpY3R1cmUqKWZyYW1lLCAgICAgICAgICAgICAgJnBpY3QpOworICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIDAsIHksIChBVlBpY3R1cmUqKXMtPmxhc3RfZnJhbWUsICAgICZsYXN0X3BpY3QpOworICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIDAsIHksIChBVlBpY3R1cmUqKXMtPnNjcmF0Y2hfZnJhbWUsICZzY3JhdGNoX3BpY3QpOworCisgICAgICAgICAgICBpZigodGVtcF9zaXplID0gcmRfc3RyaXAocywgeSwgc3RyaXBfaGVpZ2h0LCBpc2FrZXlmcmFtZSwgJmxhc3RfcGljdCwgJnBpY3QsICZzY3JhdGNoX3BpY3QsIHMtPmZyYW1lX2J1ZiArIHNpemUgKyBDVklEX0hFQURFUl9TSVpFLCAmc2NvcmVfdGVtcAorI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKKywgJnNlcnJfdGVtcAorI2VuZGlmCispKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBfc2l6ZTsKKworICAgICAgICAgICAgc2NvcmUgKz0gc2NvcmVfdGVtcDsKKyNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCisgICAgICAgICAgICBzZXJyICs9IHNlcnJfdGVtcDsKKyNlbmRpZgorICAgICAgICAgICAgc2l6ZSArPSB0ZW1wX3NpemU7CisgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJzdHJpcCAlZCwgaXNha2V5ZnJhbWU9JWQiLCBzdHJpcCwgaXNha2V5ZnJhbWUpOworICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGJlc3Rfc2NvcmUgPT0gMCB8fCBzY29yZSA8IGJlc3Rfc2NvcmUpIHsKKyAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKKyNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCisgICAgICAgICAgICBiZXN0X3NlcnIgPSBzZXJyOworI2VuZGlmCisgICAgICAgICAgICBiZXN0X3NpemUgPSBzaXplICsgd3JpdGVfY3ZpZF9oZWFkZXIocywgcy0+ZnJhbWVfYnVmLCBudW1fc3RyaXBzLCBzaXplLCBpc2FrZXlmcmFtZSk7CisgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJiZXN0IG51bWJlciBvZiBzdHJpcHMgc28gZmFyOiAlMmksICUxMmxsaSwgJWkgQlxuIiwgbnVtX3N0cmlwcywgKGxvbmcgbG9uZyBpbnQpc2NvcmUsIGJlc3Rfc2l6ZSk7CisjaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgImJlc3QgbnVtYmVyIG9mIHN0cmlwcyBzbyBmYXI6ICUyaSwgJTEybGxpLCAlaSBCXG4iLCBudW1fc3RyaXBzLCAobG9uZyBsb25nIGludClzZXJyLCBiZXN0X3NpemUpOworI2VuZGlmCisKKyAgICAgICAgICAgIEZGU1dBUChBVkZyYW1lICosIHMtPmJlc3RfZnJhbWUsIHMtPnNjcmF0Y2hfZnJhbWUpOworICAgICAgICAgICAgbWVtY3B5KGJ1Ziwgcy0+ZnJhbWVfYnVmLCBiZXN0X3NpemUpOworICAgICAgICAgICAgYmVzdF9uc3RyaXBzID0gbnVtX3N0cmlwczsKKyAgICAgICAgfQorLy8gYXZvaWQgdHJ5aW5nIHRvbyBtYW55IHN0cmlwIG51bWJlcnMgd2l0aG91dCBhIHJlYWwgcmVhc29uCisvLyAodGhpcyBtYWtlcyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgdmVyeSBmaXJzdCBmcmFtZSBmYXN0ZXIpCisgICAgICAgIGlmKG51bV9zdHJpcHMgLSBiZXN0X25zdHJpcHMgPiA0KQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MChiZXN0X25zdHJpcHMgPj0gMCAmJiBiZXN0X3NpemUgPj0gMCk7CisKKy8vIGxldCB0aGUgbnVtYmVyIG9mIHN0cmlwcyBzbG93bHkgYWRhcHQgdG8gdGhlIGNoYW5nZXMgaW4gdGhlIGNvbnRlbnRzLAorLy8gY29tcGFyZWQgdG8gZnVsbCBicnV0ZWZvcmNpbmcgZXZlcnkgdGltZSB0aGlzIHdpbGwgb2NjYXNpb25hbGx5IGxlYWQKKy8vIHRvIHNvbWUgci9kIHBlcmZvcm1hbmNlIGxvc3MgYnV0IG1ha2VzIGVuY29kaW5nIHVwIHRvIHNldmVyYWwgdGltZXMgZmFzdGVyCisgICAgaWYoIXMtPnN0cmlwX251bWJlcl9kZWx0YV9yYW5nZSkgeworICAgICAgICBpZihiZXN0X25zdHJpcHMgPT0gcy0+bWF4X3N0cmlwcykgeyAvLyBsZXQgdXMgdHJ5IHRvIHN0ZXAgdXAKKyAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBiZXN0X25zdHJpcHMgKyAxOworICAgICAgICAgICAgaWYocy0+bWF4X3N0cmlwcyA+PSBzLT5tYXhfbWF4X3N0cmlwcykKKyAgICAgICAgICAgICAgICBzLT5tYXhfc3RyaXBzID0gcy0+bWF4X21heF9zdHJpcHM7CisgICAgICAgIH0gZWxzZSB7IC8vIHRyeSB0byBzdGVwIGRvd24KKyAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBiZXN0X25zdHJpcHM7CisgICAgICAgIH0KKyAgICAgICAgcy0+bWluX3N0cmlwcyA9IHMtPm1heF9zdHJpcHMgLSAxOworICAgICAgICBpZihzLT5taW5fc3RyaXBzIDwgcy0+bWluX21pbl9zdHJpcHMpCisgICAgICAgICAgICBzLT5taW5fc3RyaXBzID0gcy0+bWluX21pbl9zdHJpcHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bWF4X3N0cmlwcyA9IGJlc3RfbnN0cmlwcyArIHMtPnN0cmlwX251bWJlcl9kZWx0YV9yYW5nZTsKKyAgICAgICAgaWYocy0+bWF4X3N0cmlwcyA+PSBzLT5tYXhfbWF4X3N0cmlwcykKKyAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBzLT5tYXhfbWF4X3N0cmlwczsKKyAgICAgICAgcy0+bWluX3N0cmlwcyA9IGJlc3RfbnN0cmlwcyAtIHMtPnN0cmlwX251bWJlcl9kZWx0YV9yYW5nZTsKKyAgICAgICAgaWYocy0+bWluX3N0cmlwcyA8IHMtPm1pbl9taW5fc3RyaXBzKQorICAgICAgICAgICAgcy0+bWluX3N0cmlwcyA9IHMtPm1pbl9taW5fc3RyaXBzOworICAgIH0KKworICAgIHJldHVybiBiZXN0X3NpemU7Cit9CisKK3N0YXRpYyBpbnQgY2luZXBha19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIENpbmVwYWtFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgcy0+bGFtYmRhID0gZnJhbWUtPnF1YWxpdHkgPyBmcmFtZS0+cXVhbGl0eSAtIDEgOiAyICogRkZfTEFNQkRBX1NDQUxFOworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIHMtPmZyYW1lX2J1Zl9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldCA9IHJkX2ZyYW1lKHMsIGZyYW1lLCAocy0+Y3VyZnJhbWUgPT0gMCksIHBrdC0+ZGF0YSwgcy0+ZnJhbWVfYnVmX3NpemUpOworICAgIHBrdC0+c2l6ZSA9IHJldDsKKyAgICBpZiAocy0+Y3VyZnJhbWUgPT0gMCkKKyAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCisgICAgRkZTV0FQKEFWRnJhbWUgKiwgcy0+bGFzdF9mcmFtZSwgcy0+YmVzdF9mcmFtZSk7CisKKyAgICBpZiAoKytzLT5jdXJmcmFtZSA+PSBzLT5rZXlpbnQpCisgICAgICAgIHMtPmN1cmZyYW1lID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgY2luZXBha19lbmNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDaW5lcGFrRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHg7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5sYXN0X2ZyYW1lKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5iZXN0X2ZyYW1lKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5zY3JhdGNoX2ZyYW1lKTsKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+aW5wdXRfZnJhbWUpOworICAgIGF2X2ZyZWVwKCZzLT5jb2RlYm9va19pbnB1dCk7CisgICAgYXZfZnJlZXAoJnMtPmNvZGVib29rX2Nsb3Nlc3QpOworICAgIGF2X2ZyZWVwKCZzLT5zdHJpcF9idWYpOworICAgIGF2X2ZyZWVwKCZzLT5mcmFtZV9idWYpOworICAgIGF2X2ZyZWVwKCZzLT5tYik7CisjaWZkZWYgQ0lORVBBS0VOQ19ERUJVRworICAgIGF2X2ZyZWVwKCZzLT5iZXN0X21iKTsKKyNlbmRpZgorCisgICAgZm9yKHggPSAwOyB4IDwgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA0IDogMyk7IHgrKykKKyAgICAgICAgYXZfZnJlZXAoJnMtPnBpY3RfYnVmc1t4XSk7CisKKyNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgInN0cmlwIGNvZGluZyBzdGF0czogJWkgVjEgbW9kZSwgJWkgVjQgbW9kZSwgJWkgTUMgbW9kZSAoJWkgVjEgZW5jcywgJWkgVjQgZW5jcywgJWkgc2tpcHMpXG4iLAorICAgICAgICBzLT5udW1fdjFfbW9kZSwgcy0+bnVtX3Y0X21vZGUsIHMtPm51bV9tY19tb2RlLCBzLT5udW1fdjFfZW5jcywgcy0+bnVtX3Y0X2VuY3MsIHMtPm51bV9za2lwcyk7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2NpbmVwYWtfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiY2luZXBhayIsCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0NJTkVQQUssCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENpbmVwYWtFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBjaW5lcGFrX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGNpbmVwYWtfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGNpbmVwYWtfZW5jb2RlX2VuZCwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pe0FWX1BJWF9GTVRfUkdCMjQsIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfTk9ORX0sCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNpbmVwYWsgLyBDVklEIiksCisgICAgLnByaXZfY2xhc3MgICAgID0gJmNpbmVwYWtfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2xqcmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2xqcmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Yzg3NzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jbGpyZGVjLmMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENpcnJ1cyBMb2dpYyBBY2N1UGFrIChDTEpSKSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDaXJydXMgTG9naWMgQWNjdVBhayBkZWNvZGVyLgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIEFWRnJhbWUgKiBjb25zdCBwID0gZGF0YTsKKyAgICBpbnQgeCwgeSwgcmV0OworCisgICAgaWYgKGF2Y3R4LT5oZWlnaHQgPD0gMCB8fCBhdmN0eC0+d2lkdGggPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgd2lkdGggb3IgaGVpZ2h0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGJ1Zl9zaXplIC8gYXZjdHgtPmhlaWdodCA8IGF2Y3R4LT53aWR0aCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJSZXNvbHV0aW9uIGxhcmdlciB0aGFuIGJ1ZmZlciBzaXplLiBJbnZhbGlkIGhlYWRlcj9cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHAsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcC0+a2V5X2ZyYW1lID0gMTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJ1Zl9zaXplICogOCk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIHVpbnQ4X3QgKmx1bWEgPSAmcC0+ZGF0YVswXVt5ICogcC0+bGluZXNpemVbMF1dOworICAgICAgICB1aW50OF90ICpjYiAgID0gJnAtPmRhdGFbMV1beSAqIHAtPmxpbmVzaXplWzFdXTsKKyAgICAgICAgdWludDhfdCAqY3IgICA9ICZwLT5kYXRhWzJdW3kgKiBwLT5saW5lc2l6ZVsyXV07CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHggKz0gNCkgeworICAgICAgICAgICAgbHVtYVszXSA9IChnZXRfYml0cygmZ2IsIDUpKjMzKSA+PiAyOworICAgICAgICAgICAgbHVtYVsyXSA9IChnZXRfYml0cygmZ2IsIDUpKjMzKSA+PiAyOworICAgICAgICAgICAgbHVtYVsxXSA9IChnZXRfYml0cygmZ2IsIDUpKjMzKSA+PiAyOworICAgICAgICAgICAgbHVtYVswXSA9IChnZXRfYml0cygmZ2IsIDUpKjMzKSA+PiAyOworICAgICAgICAgICAgbHVtYSArPSA0OworICAgICAgICAgICAgKihjYisrKSA9IGdldF9iaXRzKCZnYiwgNikgPDwgMjsKKyAgICAgICAgICAgICooY3IrKykgPSBnZXRfYml0cygmZ2IsIDYpIDw8IDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDExUDsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9jbGpyX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImNsanIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDaXJydXMgTG9naWMgQWNjdVBhayIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9DTEpSLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2xqcmVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2xqcmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzJmODAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jbGpyZW5jLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDaXJydXMgTG9naWMgQWNjdVBhayAoQ0xKUikgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIEFsZXggQmVyZWdzemFzemkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ2lycnVzIExvZ2ljIEFjY3VQYWsgZW5jb2Rlci4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisKK3R5cGVkZWYgc3RydWN0IENMSlJDb250ZXh0IHsKKyAgICBBVkNsYXNzICAgICAgICAqYXZjbGFzczsKKyAgICBpbnQgICAgICAgICAgICAgZGl0aGVyX3R5cGU7Cit9IENMSlJDb250ZXh0OworCitzdGF0aWMgaW50IGVuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgQ0xKUkNvbnRleHQgKmEgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFB1dEJpdENvbnRleHQgcGI7CisgICAgaW50IHgsIHksIHJldDsKKyAgICB1aW50MzJfdCBkaXRoZXI9IGF2Y3R4LT5mcmFtZV9udW1iZXI7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG9yZGVyZWRfZGl0aGVyWzJdWzJdID0KKyAgICB7CisgICAgICAgIHsgMHgxMDQwMDAwMCwgMHgxMDRGMDAwMCB9LAorICAgICAgICB7IDB4Q0IyQTAwMDAsIDB4Q0IyNTAwMDAgfSwKKyAgICB9OworCisgICAgaWYgKGF2Y3R4LT53aWR0aCU0ICYmIGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwpIHsKKyAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJXaWR0aHMgd2hpY2ggYXJlIG5vdCBhIG11bHRpcGxlIG9mIDQgbWlnaHQgZmFpbCB3aXRoIHNvbWUgZGVjb2RlcnMsICIKKyAgICAgICAgICAgICAgICAidXNlIHZzdHJpY3Q9LTEgLyAtc3RyaWN0IC0xIHRvIHVzZSAlZCBhbnl3YXkuXG4iLCBhdmN0eC0+d2lkdGgpOworICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhQRVJJTUVOVEFMOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCAzMiphdmN0eC0+aGVpZ2h0KmF2Y3R4LT53aWR0aC80KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaW5pdF9wdXRfYml0cygmcGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgdWludDhfdCAqbHVtYSA9ICZwLT5kYXRhWzBdW3kgKiBwLT5saW5lc2l6ZVswXV07CisgICAgICAgIHVpbnQ4X3QgKmNiICAgPSAmcC0+ZGF0YVsxXVt5ICogcC0+bGluZXNpemVbMV1dOworICAgICAgICB1aW50OF90ICpjciAgID0gJnAtPmRhdGFbMl1beSAqIHAtPmxpbmVzaXplWzJdXTsKKyAgICAgICAgdWludDhfdCBsdW1hX3RtcFs0XTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSA0KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGEtPmRpdGhlcl90eXBlKSB7CisgICAgICAgICAgICBjYXNlIDA6IGRpdGhlciA9IDB4NDkyQTAwMDA7ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogZGl0aGVyID0gZGl0aGVyICogMTY2NDUyNSArIDEwMTM5MDQyMjM7ICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBkaXRoZXIgPSBvcmRlcmVkX2RpdGhlclsgeSYxIF1bICh4Pj4yKSYxIF07YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeCszID49IGF2Y3R4LT53aWR0aCkgeworICAgICAgICAgICAgICAgIG1lbXNldChsdW1hX3RtcCwgMCwgc2l6ZW9mKGx1bWFfdG1wKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGx1bWFfdG1wLCBsdW1hLCBhdmN0eC0+d2lkdGggLSB4KTsKKyAgICAgICAgICAgICAgICBsdW1hID0gbHVtYV90bXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXRfYml0cygmcGIsIDUsICgyNDkqKGx1bWFbM10gKyAgKGRpdGhlcj4+MjkpICAgKSkgPj4gMTEpOworICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCA1LCAoMjQ5KihsdW1hWzJdICsgKChkaXRoZXI+PjI2KSY3KSkpID4+IDExKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgNSwgKDI0OSoobHVtYVsxXSArICgoZGl0aGVyPj4yMykmNykpKSA+PiAxMSk7CisgICAgICAgICAgICBwdXRfYml0cygmcGIsIDUsICgyNDkqKGx1bWFbMF0gKyAoKGRpdGhlcj4+MjApJjcpKSkgPj4gMTEpOworICAgICAgICAgICAgbHVtYSArPSA0OworICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCA2LCAoMjUzKigqKGNiKyspICsgKChkaXRoZXI+PjE4KSYzKSkpID4+IDEwKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgNiwgKDI1MyooKihjcisrKSArICgoZGl0aGVyPj4xNikmMykpKSA+PiAxMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworCisgICAgcGt0LT5zaXplICAgPSBwdXRfYml0c19jb3VudCgmcGIpIC8gODsKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENMSlJDb250ZXh0LCB4KQorI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImRpdGhlcl90eXBlIiwgICAiRGl0aGVyIHR5cGUiLCAgIE9GRlNFVChkaXRoZXJfdHlwZSksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2ND0xIH0sIDAsIDIsIFZFfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGNsanJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiY2xqciBlbmNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfY2xqcl9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjbGpyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ2lycnVzIExvZ2ljIEFjY3VQYWsiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQ0xKUiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ0xKUkNvbnRleHQpLAorICAgIC5lbmNvZGUyICAgICAgICA9IGVuY29kZV9mcmFtZSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJmNsanJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY2xsYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY2xsYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzEwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jbGxjLmMKQEAgLTAsMCArMSw0OTQgQEAKKy8qCisgKiBDYW5vcHVzIExvc3NsZXNzIENvZGVjIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMyBEZXJlayBCdWl0ZW5odWlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ0xMQ0NvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBCc3dhcERTUENvbnRleHQgYmRzcDsKKworICAgIHVpbnQ4X3QgKnN3YXBwZWRfYnVmOworICAgIGludCAgICAgIHN3YXBwZWRfYnVmX3NpemU7Cit9IENMTENDb250ZXh0OworCitzdGF0aWMgaW50IHJlYWRfY29kZV90YWJsZShDTExDQ29udGV4dCAqY3R4LCBHZXRCaXRDb250ZXh0ICpnYiwgVkxDICp2bGMpCit7CisgICAgdWludDhfdCBzeW1ib2xzWzI1Nl07CisgICAgdWludDhfdCBiaXRzWzI1Nl07CisgICAgdWludDE2X3QgY29kZXNbMjU2XTsKKyAgICBpbnQgbnVtX2xlbnMsIG51bV9jb2RlcywgbnVtX2NvZGVzX3N1bSwgcHJlZml4OworICAgIGludCBpLCBqLCBjb3VudDsKKworICAgIHByZWZpeCAgICAgICAgPSAwOworICAgIGNvdW50ICAgICAgICAgPSAwOworICAgIG51bV9jb2Rlc19zdW0gPSAwOworCisgICAgbnVtX2xlbnMgPSBnZXRfYml0cyhnYiwgNSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2xlbnM7IGkrKykgeworICAgICAgICBudW1fY29kZXMgICAgICA9IGdldF9iaXRzKGdiLCA5KTsKKyAgICAgICAgbnVtX2NvZGVzX3N1bSArPSBudW1fY29kZXM7CisKKyAgICAgICAgaWYgKG51bV9jb2Rlc19zdW0gPiAyNTYpIHsKKyAgICAgICAgICAgIHZsYy0+dGFibGUgPSBOVUxMOworCisgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJUb28gbWFueSBWTENzICglZCkgdG8gYmUgcmVhZC5cbiIsIG51bV9jb2Rlc19zdW0pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX2NvZGVzOyBqKyspIHsKKyAgICAgICAgICAgIHN5bWJvbHNbY291bnRdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgYml0c1tjb3VudF0gICAgPSBpICsgMTsKKyAgICAgICAgICAgIGNvZGVzW2NvdW50XSAgID0gcHJlZml4Kys7CisKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICBwcmVmaXggPDw9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGZmX2luaXRfdmxjX3NwYXJzZSh2bGMsIDcsIGNvdW50LCBiaXRzLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXMsIDIsIDIsIHN5bWJvbHMsIDEsIDEsIDApOworfQorCisvKgorICogVW5saWtlIHRoZSBSR0IyNCByZWFkL3Jlc3RvcmUsIHdoaWNoIHJlYWRzIGluIGEgY29tcG9uZW50IGF0IGEgdGltZSwKKyAqIEFSR0IgcmVhZC9yZXN0b3JlIHJlYWRzIGluIEFSR0IgcXVhZHMuCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9hcmdiX2xpbmUoQ0xMQ0NvbnRleHQgKmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IsIGludCAqdG9wX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZMQyAqdmxjLCB1aW50OF90ICpvdXRidWYpCit7CisgICAgdWludDhfdCAqZHN0OworICAgIGludCBwcmVkWzRdOworICAgIGludCBjb2RlOworICAgIGludCBpOworCisgICAgT1BFTl9SRUFERVIoYml0cywgZ2IpOworCisgICAgZHN0ICAgICA9IG91dGJ1ZjsKKyAgICBwcmVkWzBdID0gdG9wX2xlZnRbMF07CisgICAgcHJlZFsxXSA9IHRvcF9sZWZ0WzFdOworICAgIHByZWRbMl0gPSB0b3BfbGVmdFsyXTsKKyAgICBwcmVkWzNdID0gdG9wX2xlZnRbM107CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5hdmN0eC0+d2lkdGg7IGkrKykgeworICAgICAgICAvKiBBbHdheXMgZ2V0IHRoZSBhbHBoYSBjb21wb25lbnQgKi8KKyAgICAgICAgVVBEQVRFX0NBQ0hFKGJpdHMsIGdiKTsKKyAgICAgICAgR0VUX1ZMQyhjb2RlLCBiaXRzLCBnYiwgdmxjWzBdLnRhYmxlLCA3LCAyKTsKKworICAgICAgICBwcmVkWzBdICs9IGNvZGU7CisgICAgICAgIGRzdFswXSAgID0gcHJlZFswXTsKKworICAgICAgICAvKiBTa2lwIHRoZSBjb21wb25lbnRzIGlmIHRoZXkgYXJlICBlbnRpcmVseSB0cmFuc3BhcmVudCAqLworICAgICAgICBpZiAoZHN0WzBdKSB7CisgICAgICAgICAgICAvKiBSZWQgKi8KKyAgICAgICAgICAgIFVQREFURV9DQUNIRShiaXRzLCBnYik7CisgICAgICAgICAgICBHRVRfVkxDKGNvZGUsIGJpdHMsIGdiLCB2bGNbMV0udGFibGUsIDcsIDIpOworCisgICAgICAgICAgICBwcmVkWzFdICs9IGNvZGU7CisgICAgICAgICAgICBkc3RbMV0gICA9IHByZWRbMV07CisKKyAgICAgICAgICAgIC8qIEdyZWVuICovCisgICAgICAgICAgICBVUERBVEVfQ0FDSEUoYml0cywgZ2IpOworICAgICAgICAgICAgR0VUX1ZMQyhjb2RlLCBiaXRzLCBnYiwgdmxjWzJdLnRhYmxlLCA3LCAyKTsKKworICAgICAgICAgICAgcHJlZFsyXSArPSBjb2RlOworICAgICAgICAgICAgZHN0WzJdICAgPSBwcmVkWzJdOworCisgICAgICAgICAgICAvKiBCbHVlICovCisgICAgICAgICAgICBVUERBVEVfQ0FDSEUoYml0cywgZ2IpOworICAgICAgICAgICAgR0VUX1ZMQyhjb2RlLCBiaXRzLCBnYiwgdmxjWzNdLnRhYmxlLCA3LCAyKTsKKworICAgICAgICAgICAgcHJlZFszXSArPSBjb2RlOworICAgICAgICAgICAgZHN0WzNdICAgPSBwcmVkWzNdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0WzFdID0gMDsKKyAgICAgICAgICAgIGRzdFsyXSA9IDA7CisgICAgICAgICAgICBkc3RbM10gPSAwOworICAgICAgICB9CisKKyAgICAgICAgZHN0ICs9IDQ7CisgICAgfQorCisgICAgQ0xPU0VfUkVBREVSKGJpdHMsIGdiKTsKKworICAgIHRvcF9sZWZ0WzBdICA9IG91dGJ1ZlswXTsKKworICAgIC8qIE9ubHkgc3Rhc2ggY29tcG9uZW50cyBpZiB0aGV5IGFyZSBub3QgdHJhbnNwYXJlbnQgKi8KKyAgICBpZiAodG9wX2xlZnRbMF0pIHsKKyAgICAgICAgdG9wX2xlZnRbMV0gPSBvdXRidWZbMV07CisgICAgICAgIHRvcF9sZWZ0WzJdID0gb3V0YnVmWzJdOworICAgICAgICB0b3BfbGVmdFszXSA9IG91dGJ1ZlszXTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3JnYjI0X2NvbXBvbmVudF9saW5lKENMTENDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdG9wX2xlZnQsIFZMQyAqdmxjLCB1aW50OF90ICpvdXRidWYpCit7CisgICAgdWludDhfdCAqZHN0OworICAgIGludCBwcmVkLCBjb2RlOworICAgIGludCBpOworCisgICAgT1BFTl9SRUFERVIoYml0cywgZ2IpOworCisgICAgZHN0ICA9IG91dGJ1ZjsKKyAgICBwcmVkID0gKnRvcF9sZWZ0OworCisgICAgLyogU2ltdWx0YW5lb3VzbHkgcmVhZCBhbmQgcmVzdG9yZSB0aGUgbGluZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPmF2Y3R4LT53aWR0aDsgaSsrKSB7CisgICAgICAgIFVQREFURV9DQUNIRShiaXRzLCBnYik7CisgICAgICAgIEdFVF9WTEMoY29kZSwgYml0cywgZ2IsIHZsYy0+dGFibGUsIDcsIDIpOworCisgICAgICAgIHByZWQgICs9IGNvZGU7CisgICAgICAgIGRzdFswXSA9IHByZWQ7CisgICAgICAgIGRzdCAgICs9IDM7CisgICAgfQorCisgICAgQ0xPU0VfUkVBREVSKGJpdHMsIGdiKTsKKworICAgIC8qIFN0YXNoIHRoZSBmaXJzdCBwaXhlbCAqLworICAgICp0b3BfbGVmdCA9IG91dGJ1ZlswXTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfeXV2X2NvbXBvbmVudF9saW5lKENMTENDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRvcF9sZWZ0LCBWTEMgKnZsYywgdWludDhfdCAqb3V0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfY2hyb21hKQoreworICAgIGludCBwcmVkLCBjb2RlOworICAgIGludCBpOworCisgICAgT1BFTl9SRUFERVIoYml0cywgZ2IpOworCisgICAgcHJlZCA9ICp0b3BfbGVmdDsKKworICAgIC8qIFNpbXVsdGFuZW91c2x5IHJlYWQgYW5kIHJlc3RvcmUgdGhlIGxpbmUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5hdmN0eC0+d2lkdGggPj4gaXNfY2hyb21hOyBpKyspIHsKKyAgICAgICAgVVBEQVRFX0NBQ0hFKGJpdHMsIGdiKTsKKyAgICAgICAgR0VUX1ZMQyhjb2RlLCBiaXRzLCBnYiwgdmxjLT50YWJsZSwgNywgMik7CisKKyAgICAgICAgcHJlZCAgICAgKz0gY29kZTsKKyAgICAgICAgb3V0YnVmW2ldID0gcHJlZDsKKyAgICB9CisKKyAgICBDTE9TRV9SRUFERVIoYml0cywgZ2IpOworCisgICAgLyogU3Rhc2ggdGhlIGZpcnN0IHBpeGVsICovCisgICAgKnRvcF9sZWZ0ID0gb3V0YnVmWzBdOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2FyZ2JfZnJhbWUoQ0xMQ0NvbnRleHQgKmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IsIEFWRnJhbWUgKnBpYykKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBjdHgtPmF2Y3R4OworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBpbnQgcHJlZFs0XTsKKyAgICBpbnQgcmV0OworICAgIGludCBpLCBqOworICAgIFZMQyB2bGNbNF07CisKKyAgICBwcmVkWzBdID0gMDsKKyAgICBwcmVkWzFdID0gMHg4MDsKKyAgICBwcmVkWzJdID0gMHg4MDsKKyAgICBwcmVkWzNdID0gMHg4MDsKKworICAgIGRzdCA9IHBpYy0+ZGF0YVswXTsKKworICAgIHNraXBfYml0cyhnYiwgMTYpOworCisgICAgLyogUmVhZCBpbiBjb2RlIHRhYmxlIGZvciBlYWNoIHBsYW5lICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICByZXQgPSByZWFkX2NvZGVfdGFibGUoY3R4LCBnYiwgJnZsY1tpXSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IGk7IGorKykKKyAgICAgICAgICAgICAgICBmZl9mcmVlX3ZsYygmdmxjW2pdKTsKKworICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlYWQgY29kZSB0YWJsZSAlZC5cbiIsIGkpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlYWQgaW4gYW5kIHJlc3RvcmUgZXZlcnkgbGluZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgcmVhZF9hcmdiX2xpbmUoY3R4LCBnYiwgcHJlZCwgdmxjLCBkc3QpOworCisgICAgICAgIGRzdCArPSBwaWMtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGZmX2ZyZWVfdmxjKCZ2bGNbaV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3JnYjI0X2ZyYW1lKENMTENDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiLCBBVkZyYW1lICpwaWMpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gY3R4LT5hdmN0eDsKKyAgICB1aW50OF90ICpkc3Q7CisgICAgaW50IHByZWRbM107CisgICAgaW50IHJldDsKKyAgICBpbnQgaSwgajsKKyAgICBWTEMgdmxjWzNdOworCisgICAgcHJlZFswXSA9IDB4ODA7CisgICAgcHJlZFsxXSA9IDB4ODA7CisgICAgcHJlZFsyXSA9IDB4ODA7CisKKyAgICBkc3QgPSBwaWMtPmRhdGFbMF07CisKKyAgICBza2lwX2JpdHMoZ2IsIDE2KTsKKworICAgIC8qIFJlYWQgaW4gY29kZSB0YWJsZSBmb3IgZWFjaCBwbGFuZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgcmV0ID0gcmVhZF9jb2RlX3RhYmxlKGN0eCwgZ2IsICZ2bGNbaV0pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBpOyBqKyspCisgICAgICAgICAgICAgICAgZmZfZnJlZV92bGMoJnZsY1tqXSk7CisKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZWFkIGNvZGUgdGFibGUgJWQuXG4iLCBpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZWFkIGluIGFuZCByZXN0b3JlIGV2ZXJ5IGxpbmUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCisgICAgICAgICAgICByZWFkX3JnYjI0X2NvbXBvbmVudF9saW5lKGN0eCwgZ2IsICZwcmVkW2pdLCAmdmxjW2pdLCAmZHN0W2pdKTsKKworICAgICAgICBkc3QgKz0gcGljLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICBmZl9mcmVlX3ZsYygmdmxjW2ldKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV95dXZfZnJhbWUoQ0xMQ0NvbnRleHQgKmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IsIEFWRnJhbWUgKnBpYykKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBjdHgtPmF2Y3R4OworICAgIHVpbnQ4X3QgYmxvY2s7CisgICAgdWludDhfdCAqZHN0WzNdOworICAgIGludCBwcmVkWzNdOworICAgIGludCByZXQ7CisgICAgaW50IGksIGo7CisgICAgVkxDIHZsY1syXTsKKworICAgIHByZWRbMF0gPSAweDgwOworICAgIHByZWRbMV0gPSAweDgwOworICAgIHByZWRbMl0gPSAweDgwOworCisgICAgZHN0WzBdID0gcGljLT5kYXRhWzBdOworICAgIGRzdFsxXSA9IHBpYy0+ZGF0YVsxXTsKKyAgICBkc3RbMl0gPSBwaWMtPmRhdGFbMl07CisKKyAgICBza2lwX2JpdHMoZ2IsIDgpOworCisgICAgYmxvY2sgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgaWYgKGJsb2NrKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShjdHgtPmF2Y3R4LCAiQmxvY2tlZCBZVVYiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIC8qIFJlYWQgaW4gY29kZSB0YWJsZSBmb3IgbHVtYSBhbmQgY2hyb21hICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICByZXQgPSByZWFkX2NvZGVfdGFibGUoY3R4LCBnYiwgJnZsY1tpXSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IGk7IGorKykKKyAgICAgICAgICAgICAgICBmZl9mcmVlX3ZsYygmdmxjW2pdKTsKKworICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlYWQgY29kZSB0YWJsZSAlZC5cbiIsIGkpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlYWQgaW4gYW5kIHJlc3RvcmUgZXZlcnkgbGluZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgcmVhZF95dXZfY29tcG9uZW50X2xpbmUoY3R4LCBnYiwgJnByZWRbMF0sICZ2bGNbMF0sIGRzdFswXSwgMCk7IC8qIFkgKi8KKyAgICAgICAgcmVhZF95dXZfY29tcG9uZW50X2xpbmUoY3R4LCBnYiwgJnByZWRbMV0sICZ2bGNbMV0sIGRzdFsxXSwgMSk7IC8qIFUgKi8KKyAgICAgICAgcmVhZF95dXZfY29tcG9uZW50X2xpbmUoY3R4LCBnYiwgJnByZWRbMl0sICZ2bGNbMV0sIGRzdFsyXSwgMSk7IC8qIFYgKi8KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgZHN0W2pdICs9IHBpYy0+bGluZXNpemVbal07CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgZmZfZnJlZV92bGMoJnZsY1tpXSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbGxjX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3BpY3R1cmVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQ0xMQ0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqcGljID0gZGF0YTsKKyAgICB1aW50OF90ICpzcmMgPSBhdnBrdC0+ZGF0YTsKKyAgICB1aW50MzJfdCBpbmZvX3RhZywgaW5mb19vZmZzZXQ7CisgICAgaW50IGRhdGFfc2l6ZTsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBjb2RpbmdfdHlwZSwgcmV0OworCisgICAgLyogU2tpcCB0aGUgSU5GTyBoZWFkZXIgaWYgcHJlc2VudCAqLworICAgIGluZm9fb2Zmc2V0ID0gMDsKKyAgICBpbmZvX3RhZyAgICA9IEFWX1JMMzIoc3JjKTsKKyAgICBpZiAoaW5mb190YWcgPT0gTUtUQUcoJ0knLCAnTicsICdGJywgJ08nKSkgeworICAgICAgICBpbmZvX29mZnNldCA9IEFWX1JMMzIoc3JjICsgNCk7CisgICAgICAgIGlmIChpbmZvX29mZnNldCA+IFVJTlQzMl9NQVggLSA4IHx8IGluZm9fb2Zmc2V0ICsgOCA+IGF2cGt0LT5zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBJTkZPIGhlYWRlciBvZmZzZXQ6IDB4JTA4IlBSSVgzMiIgaXMgdG9vIGxhcmdlLlxuIiwKKyAgICAgICAgICAgICAgICAgICBpbmZvX29mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGluZm9fb2Zmc2V0ICs9IDg7CisgICAgICAgIHNyYyAgICAgICAgICs9IGluZm9fb2Zmc2V0OworCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU2tpcHBpbmcgSU5GTyBjaHVuay5cbiIpOworICAgIH0KKworICAgIGRhdGFfc2l6ZSA9IChhdnBrdC0+c2l6ZSAtIGluZm9fb2Zmc2V0KSAmIH4xOworCisgICAgLyogTWFrZSBzdXJlIG91ciBic3dhcDE2J2QgYnVmZmVyIGlzIGJpZyBlbm91Z2ggKi8KKyAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmN0eC0+c3dhcHBlZF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnN3YXBwZWRfYnVmX3NpemUsIGRhdGFfc2l6ZSk7CisgICAgaWYgKCFjdHgtPnN3YXBwZWRfYnVmKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIHN3YXBwZWQgYnVmZmVyLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLyogYnN3YXAxNiB0aGUgYnVmZmVyIHNpbmNlIENMTEMncyBiaXRyZWFkZXIgd29ya3MgaW4gMTYtYml0IHdvcmRzICovCisgICAgY3R4LT5iZHNwLmJzd2FwMTZfYnVmKCh1aW50MTZfdCAqKSBjdHgtPnN3YXBwZWRfYnVmLCAodWludDE2X3QgKikgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUgLyAyKTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBjdHgtPnN3YXBwZWRfYnVmLCBkYXRhX3NpemUgKiA4KTsKKworICAgIC8qCisgICAgICogUmVhZCBpbiBjb2RpbmcgdHlwZS4gVGhlIHR5cGVzIGFyZSBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogMCAtIFlVWTIKKyAgICAgKiAxIC0gQkdSMjQgKFRyaXBsZXMpCisgICAgICogMiAtIEJHUjI0IChRdWFkcykKKyAgICAgKiAzIC0gQkdSQQorICAgICAqLworICAgIGNvZGluZ190eXBlID0gKEFWX1JMMzIoc3JjKSA+PiA4KSAmIDB4RkY7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJGcmFtZSBjb2RpbmcgdHlwZTogJWRcbiIsIGNvZGluZ190eXBlKTsKKworICAgIHN3aXRjaCAoY29kaW5nX3R5cGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDg7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwaWMsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldCA9IGRlY29kZV95dXZfZnJhbWUoY3R4LCAmZ2IsIHBpYyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCAgICAgICAgICAgICA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gODsKKworICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpYywgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0ID0gZGVjb2RlX3JnYjI0X2ZyYW1lKGN0eCwgJmdiLCBwaWMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCAgICAgICAgICAgICA9IEFWX1BJWF9GTVRfQVJHQjsKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSA4OworCisgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICByZXQgPSBkZWNvZGVfYXJnYl9mcmFtZShjdHgsICZnYiwgcGljKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjb2RpbmcgdHlwZTogJWQuXG4iLCBjb2RpbmdfdHlwZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHBpYy0+a2V5X2ZyYW1lID0gMTsKKyAgICBwaWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgKmdvdF9waWN0dXJlX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjbGxjX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQ0xMQ0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5zd2FwcGVkX2J1Zik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGNsbGNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENMTENDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgLyogSW5pdGlhbGl6ZSB2YXJpb3VzIGNvbnRleHQgdmFsdWVzICovCisgICAgY3R4LT5hdmN0eCAgICAgICAgICAgID0gYXZjdHg7CisgICAgY3R4LT5zd2FwcGVkX2J1ZiAgICAgID0gTlVMTDsKKyAgICBjdHgtPnN3YXBwZWRfYnVmX3NpemUgPSAwOworCisgICAgZmZfYnN3YXBkc3BfaW5pdCgmY3R4LT5iZHNwKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2NsbGNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiY2xsYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNhbm9wdXMgTG9zc2xlc3MgQ29kZWMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQ0xMQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ0xMQ0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGNsbGNfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gY2xsY19kZWNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gY2xsY19kZWNvZGVfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jbmdkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NuZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWU5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jbmdkZWMuYwpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIFJGQyAzMzg5IGNvbWZvcnQgbm9pc2UgZ2VuZXJhdG9yCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiY2VscF9maWx0ZXJzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCisKK3R5cGVkZWYgc3RydWN0IENOR0NvbnRleHQgeworICAgIGZsb2F0ICpyZWZsX2NvZWYsICp0YXJnZXRfcmVmbF9jb2VmOworICAgIGZsb2F0ICpscGNfY29lZjsKKyAgICBpbnQgb3JkZXI7CisgICAgaW50IGVuZXJneSwgdGFyZ2V0X2VuZXJneTsKKyAgICBpbnQgaW5pdGVkOworICAgIGZsb2F0ICpmaWx0ZXJfb3V0OworICAgIGZsb2F0ICpleGNpdGF0aW9uOworICAgIEFWTEZHIGxmZzsKK30gQ05HQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGNuZ19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENOR0NvbnRleHQgKnAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGF2X2ZyZWVwKCZwLT5yZWZsX2NvZWYpOworICAgIGF2X2ZyZWVwKCZwLT50YXJnZXRfcmVmbF9jb2VmKTsKKyAgICBhdl9mcmVlcCgmcC0+bHBjX2NvZWYpOworICAgIGF2X2ZyZWVwKCZwLT5maWx0ZXJfb3V0KTsKKyAgICBhdl9mcmVlcCgmcC0+ZXhjaXRhdGlvbik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjbmdfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENOR0NvbnRleHQgKnAgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgID0gQVZfU0FNUExFX0ZNVF9TMTY7CisgICAgYXZjdHgtPmNoYW5uZWxzICAgID0gMTsKKyAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSA4MDAwOworCisgICAgcC0+b3JkZXIgICAgICAgICAgICA9IDEyOworICAgIGF2Y3R4LT5mcmFtZV9zaXplICAgPSA2NDA7CisgICAgcC0+cmVmbF9jb2VmICAgICAgICA9IGF2X21hbGxvY3pfYXJyYXkocC0+b3JkZXIsIHNpemVvZigqcC0+cmVmbF9jb2VmKSk7CisgICAgcC0+dGFyZ2V0X3JlZmxfY29lZiA9IGF2X21hbGxvY3pfYXJyYXkocC0+b3JkZXIsIHNpemVvZigqcC0+dGFyZ2V0X3JlZmxfY29lZikpOworICAgIHAtPmxwY19jb2VmICAgICAgICAgPSBhdl9tYWxsb2N6X2FycmF5KHAtPm9yZGVyLCBzaXplb2YoKnAtPmxwY19jb2VmKSk7CisgICAgcC0+ZmlsdGVyX291dCAgICAgICA9IGF2X21hbGxvY3pfYXJyYXkoYXZjdHgtPmZyYW1lX3NpemUgKyBwLT5vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnAtPmZpbHRlcl9vdXQpKTsKKyAgICBwLT5leGNpdGF0aW9uICAgICAgID0gYXZfbWFsbG9jel9hcnJheShhdmN0eC0+ZnJhbWVfc2l6ZSwgc2l6ZW9mKCpwLT5leGNpdGF0aW9uKSk7CisgICAgaWYgKCFwLT5yZWZsX2NvZWYgfHwgIXAtPnRhcmdldF9yZWZsX2NvZWYgfHwgIXAtPmxwY19jb2VmIHx8CisgICAgICAgICFwLT5maWx0ZXJfb3V0IHx8ICFwLT5leGNpdGF0aW9uKSB7CisgICAgICAgIGNuZ19kZWNvZGVfY2xvc2UoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF2X2xmZ19pbml0KCZwLT5sZmcsIDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1ha2VfbHBjX2NvZWZzKGZsb2F0ICpscGMsIGNvbnN0IGZsb2F0ICpyZWZsLCBpbnQgb3JkZXIpCit7CisgICAgZmxvYXQgYnVmWzEwMF07CisgICAgZmxvYXQgKm5leHQsICpjdXI7CisgICAgaW50IG0sIGk7CisgICAgbmV4dCA9IGJ1ZjsKKyAgICBjdXIgID0gbHBjOworICAgIGZvciAobSA9IDA7IG0gPCBvcmRlcjsgbSsrKSB7CisgICAgICAgIG5leHRbbV0gPSByZWZsW21dOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKQorICAgICAgICAgICAgbmV4dFtpXSA9IGN1cltpXSArIHJlZmxbbV0gKiBjdXJbbSAtIGkgLSAxXTsKKyAgICAgICAgRkZTV0FQKGZsb2F0KiwgbmV4dCwgY3VyKTsKKyAgICB9CisgICAgaWYgKGN1ciAhPSBscGMpCisgICAgICAgIG1lbWNweShscGMsIGN1ciwgc2l6ZW9mKCpscGMpICogb3JkZXIpOworfQorCitzdGF0aWMgdm9pZCBjbmdfZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDTkdDb250ZXh0ICpwID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBwLT5pbml0ZWQgPSAwOworfQorCitzdGF0aWMgaW50IGNuZ19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBDTkdDb250ZXh0ICpwID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgID0gYXZwa3QtPnNpemU7CisgICAgaW50IHJldCwgaTsKKyAgICBpbnQxNl90ICpidWZfb3V0OworICAgIGZsb2F0IGUgPSAxLjA7CisgICAgZmxvYXQgc2NhbGluZzsKKworICAgIGlmIChhdnBrdC0+c2l6ZSkgeworICAgICAgICBpbnQgZGJvdiA9IC1hdnBrdC0+ZGF0YVswXTsKKyAgICAgICAgcC0+dGFyZ2V0X2VuZXJneSA9IDEwODExMDk5NzUgKiBwb3coMTAsIGRib3YgLyAxMC4wKSAqIDAuNzU7CisgICAgICAgIG1lbXNldChwLT50YXJnZXRfcmVmbF9jb2VmLCAwLCBwLT5vcmRlciAqIHNpemVvZigqcC0+dGFyZ2V0X3JlZmxfY29lZikpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZNSU4oYXZwa3QtPnNpemUgLSAxLCBwLT5vcmRlcik7IGkrKykgeworICAgICAgICAgICAgcC0+dGFyZ2V0X3JlZmxfY29lZltpXSA9IChhdnBrdC0+ZGF0YVsxICsgaV0gLSAxMjcpIC8gMTI4LjA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocC0+aW5pdGVkKSB7CisgICAgICAgIHAtPmVuZXJneSA9IHAtPmVuZXJneSAvIDIgKyBwLT50YXJnZXRfZW5lcmd5IC8gMjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHAtPm9yZGVyOyBpKyspCisgICAgICAgICAgICBwLT5yZWZsX2NvZWZbaV0gPSAwLjYgKnAtPnJlZmxfY29lZltpXSArIDAuNCAqIHAtPnRhcmdldF9yZWZsX2NvZWZbaV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcC0+ZW5lcmd5ID0gcC0+dGFyZ2V0X2VuZXJneTsKKyAgICAgICAgbWVtY3B5KHAtPnJlZmxfY29lZiwgcC0+dGFyZ2V0X3JlZmxfY29lZiwgcC0+b3JkZXIgKiBzaXplb2YoKnAtPnJlZmxfY29lZikpOworICAgICAgICBwLT5pbml0ZWQgPSAxOworICAgIH0KKyAgICBtYWtlX2xwY19jb2VmcyhwLT5scGNfY29lZiwgcC0+cmVmbF9jb2VmLCBwLT5vcmRlcik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+b3JkZXI7IGkrKykKKyAgICAgICAgZSAqPSAxLjAgLSBwLT5yZWZsX2NvZWZbaV0qcC0+cmVmbF9jb2VmW2ldOworCisgICAgc2NhbGluZyA9IHNxcnQoZSAqIHAtPmVuZXJneSAvIDEwODExMDk5NzUpOworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+ZnJhbWVfc2l6ZTsgaSsrKSB7CisgICAgICAgIGludCByID0gKGF2X2xmZ19nZXQoJnAtPmxmZykgJiAweGZmZmYpIC0gMHg4MDAwOworICAgICAgICBwLT5leGNpdGF0aW9uW2ldID0gc2NhbGluZyAqIHI7CisgICAgfQorICAgIGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYocC0+ZmlsdGVyX291dCArIHAtPm9yZGVyLCBwLT5scGNfY29lZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmV4Y2l0YXRpb24sIGF2Y3R4LT5mcmFtZV9zaXplLCBwLT5vcmRlcik7CisKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IGF2Y3R4LT5mcmFtZV9zaXplOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgYnVmX291dCA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5mcmFtZV9zaXplOyBpKyspCisgICAgICAgIGJ1Zl9vdXRbaV0gPSBwLT5maWx0ZXJfb3V0W2kgKyBwLT5vcmRlcl07CisgICAgbWVtY3B5KHAtPmZpbHRlcl9vdXQsIHAtPmZpbHRlcl9vdXQgKyBhdmN0eC0+ZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgcC0+b3JkZXIgKiBzaXplb2YoKnAtPmZpbHRlcl9vdXQpKTsKKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworQVZDb2RlYyBmZl9jb21mb3J0bm9pc2VfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiY29tZm9ydG5vaXNlIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUkZDIDMzODkgY29tZm9ydCBub2lzZSBnZW5lcmF0b3IiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQ09NRk9SVF9OT0lTRSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ05HQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gY25nX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGNuZ19kZWNvZGVfZnJhbWUsCisgICAgLmZsdXNoICAgICAgICAgID0gY25nX2RlY29kZV9mbHVzaCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBjbmdfZGVjb2RlX2Nsb3NlLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RFTEFZIHwgQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jbmdlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NuZ2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNWY3YmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jbmdlbmMuYwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIFJGQyAzMzg5IGNvbWZvcnQgbm9pc2UgZ2VuZXJhdG9yCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJscGMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ05HQ29udGV4dCB7CisgICAgTFBDQ29udGV4dCBscGM7CisgICAgaW50IG9yZGVyOworICAgIGludDMyX3QgKnNhbXBsZXMzMjsKKyAgICBkb3VibGUgKnJlZl9jb2VmOworfSBDTkdDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgY25nX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQ05HQ29udGV4dCAqcCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZmZfbHBjX2VuZCgmcC0+bHBjKTsKKyAgICBhdl9mcmVlKHAtPnNhbXBsZXMzMik7CisgICAgYXZfZnJlZShwLT5yZWZfY29lZik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjbmdfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENOR0NvbnRleHQgKnAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IG1vbm8gc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IDY0MDsKKyAgICBwLT5vcmRlciA9IDEwOworICAgIGlmICgocmV0ID0gZmZfbHBjX2luaXQoJnAtPmxwYywgYXZjdHgtPmZyYW1lX3NpemUsIHAtPm9yZGVyLCBGRl9MUENfVFlQRV9MRVZJTlNPTikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwLT5zYW1wbGVzMzIgPSBhdl9tYWxsb2NfYXJyYXkoYXZjdHgtPmZyYW1lX3NpemUsIHNpemVvZigqcC0+c2FtcGxlczMyKSk7CisgICAgcC0+cmVmX2NvZWYgPSBhdl9tYWxsb2NfYXJyYXkocC0+b3JkZXIsIHNpemVvZigqcC0+cmVmX2NvZWYpKTsKKyAgICBpZiAoIXAtPnNhbXBsZXMzMiB8fCAhcC0+cmVmX2NvZWYpIHsKKyAgICAgICAgY25nX2VuY29kZV9jbG9zZShhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY25nX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBDTkdDb250ZXh0ICpwID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBpOworICAgIGRvdWJsZSBlbmVyZ3kgPSAwOworICAgIGludCBxZGJvdjsKKyAgICBpbnQxNl90ICpzYW1wbGVzID0gKGludDE2X3QqKSBmcmFtZS0+ZGF0YVswXTsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0KGF2cGt0LCAxICsgcC0+b3JkZXIpKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGdldHRpbmcgb3V0cHV0IHBhY2tldFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5uYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgcC0+c2FtcGxlczMyW2ldID0gc2FtcGxlc1tpXTsKKyAgICAgICAgZW5lcmd5ICs9IHNhbXBsZXNbaV0gKiBzYW1wbGVzW2ldOworICAgIH0KKyAgICBlbmVyZ3kgLz0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgaWYgKGVuZXJneSA+IDApIHsKKyAgICAgICAgZG91YmxlIGRib3YgPSAxMCAqIGxvZzEwKGVuZXJneSAvIDEwODExMDk5NzUpOworICAgICAgICBxZGJvdiA9IGF2X2NsaXAoLWZsb29yKGRib3YpLCAwLCAxMjcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHFkYm92ID0gMTI3OworICAgIH0KKyAgICByZXQgPSBmZl9scGNfY2FsY19yZWZfY29lZnMoJnAtPmxwYywgcC0+c2FtcGxlczMyLCBwLT5vcmRlciwgcC0+cmVmX2NvZWYpOworICAgIGF2cGt0LT5kYXRhWzBdID0gcWRib3Y7CisgICAgZm9yIChpID0gMDsgaSA8IHAtPm9yZGVyOyBpKyspCisgICAgICAgIGF2cGt0LT5kYXRhWzEgKyBpXSA9IHAtPnJlZl9jb2VmW2ldICogMTI3ICsgMTI3OworCisgICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKKyAgICBhdnBrdC0+c2l6ZSA9IDEgKyBwLT5vcmRlcjsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2NvbWZvcnRub2lzZV9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjb21mb3J0bm9pc2UiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSRkMgMzM4OSBjb21mb3J0IG5vaXNlIGdlbmVyYXRvciIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9DT01GT1JUX05PSVNFLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihDTkdDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBjbmdfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gY25nX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBjbmdfZW5jb2RlX2Nsb3NlLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvY29kZWNfZGVzYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY29kZWNfZGVzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjY2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jb2RlY19kZXNjLmMKQEAgLTAsMCArMSwyODg4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIFRoaXMgdGFibGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBsb25nIGFuZCBzaG9ydCBuYW1lcyBvZiBBVkNvZGVjcworICogcGxlYXNlIHNlZSB0aGUgcmVzcGVjdGl2ZSBjb2RlYyBzb3VyY2VzIGZvciBhdXRob3JzaGlwCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNkZWZpbmUgTVQoLi4uKSAoY29uc3QgY2hhciAqY29uc3RbXSl7IF9fVkFfQVJHU19fLCBOVUxMIH0KKworc3RhdGljIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yIGNvZGVjX2Rlc2NyaXB0b3JzW10gPSB7CisgICAgLyogdmlkZW8gY29kZWNzICovCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzFWSURFTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJtcGVnMXZpZGVvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTEgdmlkZW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1kgfCBBVl9DT0RFQ19QUk9QX1JFT1JERVIsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm1wZWcydmlkZW8iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctMiB2aWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSB8IEFWX0NPREVDX1BST1BfUkVPUkRFUiwKKyAgICB9LAorI2lmIEZGX0FQSV9YVk1DCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFT19YVk1DLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm1wZWd2aWRlb194dm1jIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTEvMiB2aWRlbyBYdk1DIChYLVZpZGVvIE1vdGlvbiBDb21wZW5zYXRpb24pIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisjZW5kaWYgLyogRkZfQVBJX1hWTUMgKi8KKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYxLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImgyNjEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkguMjYxIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSDI2MywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJoMjYzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJILjI2MyAvIEguMjYzLTE5OTYsIEguMjYzKyAvIEguMjYzLTE5OTggLyBILjI2MyB2ZXJzaW9uIDIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1kgfCBBVl9DT0RFQ19QUk9QX1JFT1JERVIsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9SVjEwLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInJ2MTAiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlYWxWaWRlbyAxLjAiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9SVjIwLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInJ2MjAiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlYWxWaWRlbyAyLjAiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1kgfCBBVl9DT0RFQ19QUk9QX1JFT1JERVIsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NSlBFRywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJtanBlZyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTW90aW9uIEpQRUciKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UvanBlZyIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTUpQRUdCLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm1qcGVnYiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbGUgTUpQRUctQiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01QRUc0LAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm1wZWc0IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTQgcGFydCAyIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZIHwgQVZfQ09ERUNfUFJPUF9SRU9SREVSLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicmF3dmlkZW8iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyB2aWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01TTVBFRzRWMSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJtc21wZWc0djEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctNCBwYXJ0IDIgTWljcm9zb2Z0IHZhcmlhbnQgdmVyc2lvbiAxIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVNNUEVHNFYyLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm1zbXBlZzR2MiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy00IHBhcnQgMiBNaWNyb3NvZnQgdmFyaWFudCB2ZXJzaW9uIDIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NU01QRUc0VjMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibXNtcGVnNHYzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTQgcGFydCAyIE1pY3Jvc29mdCB2YXJpYW50IHZlcnNpb24gMyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1dNVjEsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAid212MSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2luZG93cyBNZWRpYSBWaWRlbyA3IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfV01WMiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ3bXYyIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIFZpZGVvIDgiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYzUCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJoMjYzcCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSC4yNjMrIC8gSC4yNjMtMTk5OCAvIEguMjYzIHZlcnNpb24gMiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSB8IEFWX0NPREVDX1BST1BfUkVPUkRFUiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjNJLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImgyNjNpIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJJbnRlbCBILjI2MyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSB8IEFWX0NPREVDX1BST1BfUkVPUkRFUiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0ZMVjEsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZmx2MSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRkxWIC8gU29yZW5zb24gU3BhcmsgLyBTb3JlbnNvbiBILjI2MyAoRmxhc2ggVmlkZW8pIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU1ZRMSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJzdnExIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTb3JlbnNvbiBWZWN0b3IgUXVhbnRpemVyIDEgLyBTb3JlbnNvbiBWaWRlbyAxIC8gU1ZRMSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NWUTMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic3ZxMyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU29yZW5zb24gVmVjdG9yIFF1YW50aXplciAzIC8gU29yZW5zb24gVmlkZW8gMyAvIFNWUTMiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1kgfCBBVl9DT0RFQ19QUk9QX1JFT1JERVIsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9EVlZJREVPLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImR2dmlkZW8iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRWIChEaWdpdGFsIFZpZGVvKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0hVRkZZVVYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiaHVmZnl1diIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSHVmZllVViIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0NZVVYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiY3l1diIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ3JlYXRpdmUgWVVWIChDWVVWKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiaDI2NCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSC4yNjQgLyBBVkMgLyBNUEVHLTQgQVZDIC8gTVBFRy00IHBhcnQgMTAiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1kgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTIHwgQVZfQ09ERUNfUFJPUF9SRU9SREVSLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSU5ERU8zLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImluZGVvMyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSW50ZWwgSW5kZW8gMyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1ZQMywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2cDMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9uMiBWUDMiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9USEVPUkEsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidGhlb3JhIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUaGVvcmEiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BU1YxLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImFzdjEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTVVMgVjEiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BU1YyLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImFzdjIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTVVMgVjIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9GRlYxLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImZmdjEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZGbXBlZyB2aWRlbyBjb2RlYyAjMSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEXzRYTSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICI0eG0iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIjRYIE1vdmllIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVkNSMSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2Y3IxIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVEkgVkNSMSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0NMSlIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiY2xqciIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ2lycnVzIExvZ2ljIEFjY3VQYWsiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NREVDLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm1kZWMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNvbnkgUGxheVN0YXRpb24gTURFQyAoTW90aW9uIERFQ29kZXIpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUk9RLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInJvcSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiaWQgUm9RIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSU5URVJQTEFZX1ZJREVPLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImludGVycGxheXZpZGVvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJJbnRlcnBsYXkgTVZFIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWEFOX1dDMywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ4YW5fd2MzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5nIENvbW1hbmRlciBJSUkgLyBYYW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9YQU5fV0M0LAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInhhbl93YzQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldpbmcgQ29tbWFuZGVyIElWIC8gWHhhbiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1JQWkEsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicnB6YSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUXVpY2tUaW1lIHZpZGVvIChSUFpBKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0NJTkVQQUssCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiY2luZXBhayIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ2luZXBhayIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1dTX1ZRQSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ3c192cWEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldlc3R3b29kIFN0dWRpb3MgVlFBIChWZWN0b3IgUXVhbnRpemVkIEFuaW1hdGlvbikgdmlkZW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NU1JMRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJtc3JsZSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWljcm9zb2Z0IFJMRSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01TVklERU8xLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm1zdmlkZW8xIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNaWNyb3NvZnQgVmlkZW8gMSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0lEQ0lOLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImlkY2luIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJpZCBRdWFrZSBJSSBDSU4gdmlkZW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF84QlBTLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIjhicHMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlF1aWNrVGltZSA4QlBTIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU01DLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInNtYyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUXVpY2tUaW1lIEdyYXBoaWNzIChTTUMpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRkxJQywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJmbGljIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdXRvZGVzayBBbmltYXRvciBGbGljIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVFJVRU1PVElPTjEsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidHJ1ZW1vdGlvbjEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkR1Y2sgVHJ1ZU1vdGlvbiAxLjAiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9WTURWSURFTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2bWR2aWRlbyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2llcnJhIFZNRCB2aWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01TWkgsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibXN6aCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTENMIChMb3NzTGVzcyBDb2RlYyBMaWJyYXJ5KSBNU1pIIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWkxJQiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ6bGliIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMQ0wgKExvc3NMZXNzIENvZGVjIExpYnJhcnkpIFpMSUIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9RVFJMRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJxdHJsZSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUXVpY2tUaW1lIEFuaW1hdGlvbiAoUkxFKSB2aWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NOT1csCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic25vdyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU25vdyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9UU0NDLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInRzY2MiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRlY2hTbWl0aCBTY3JlZW4gQ2FwdHVyZSBDb2RlYyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1VMVEksCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidWx0aSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSUJNIFVsdGlNb3Rpb24iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9RRFJBVywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJxZHJhdyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbGUgUXVpY2tEcmF3IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVklYTCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2aXhsIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNaXJvIFZpZGVvWEwiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9RUEVHLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInFwZWciLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlEtdGVhbSBRUEVHIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRkZWSFVGRiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJmZnZodWZmIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJIdWZmeXV2IEZGbXBlZyB2YXJpYW50IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUlYzMCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJydjMwIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsVmlkZW8gMy4wIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZIHwgQVZfQ09ERUNfUFJPUF9SRU9SREVSLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUlY0MCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJydjQwIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsVmlkZW8gNC4wIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZIHwgQVZfQ09ERUNfUFJPUF9SRU9SREVSLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVkMxLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInZjMSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU01QVEUgVkMtMSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSB8IEFWX0NPREVDX1BST1BfUkVPUkRFUiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1dNVjMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAid212MyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2luZG93cyBNZWRpYSBWaWRlbyA5IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZIHwgQVZfQ09ERUNfUFJPUF9SRU9SREVSLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTE9DTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJsb2NvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMT0NPIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfV05WMSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ3bnYxIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5ub3YgV05WMSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FBU0MsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWFzYyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXV0b2Rlc2sgUkxFIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSU5ERU8yLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImluZGVvMiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSW50ZWwgSW5kZW8gMiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0ZSQVBTLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImZyYXBzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGcmFwcyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RSVUVNT1RJT04yLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInRydWVtb3Rpb24yIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEdWNrIFRydWVNb3Rpb24gMi4wIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQk1QLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImJtcCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQk1QIChXaW5kb3dzIGFuZCBPUy8yIGJpdG1hcCkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UveC1tcy1ibXAiKSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0NTQ0QsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiY3NjZCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ2FtU3R1ZGlvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTU1WSURFTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJtbXZpZGVvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBbWVyaWNhbiBMYXNlciBHYW1lcyBNTSBWaWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1pNQlYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiem1idiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiWmlwIE1vdGlvbiBCbG9ja3MgVmlkZW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BVlMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYXZzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVlMgKEF1ZGlvIFZpZGVvIFN0YW5kYXJkKSB2aWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NNQUNLVklERU8sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic21hY2t2aWRlbyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU21hY2tlciB2aWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX05VViwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJudXYiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk51cHBlbFZpZGVvL1JUSlBFRyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0tNVkMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAia212YyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiS2FybCBNb3J0b24ncyB2aWRlbyBjb2RlYyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0ZMQVNIU1YsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZmxhc2hzdiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmxhc2ggU2NyZWVuIFZpZGVvIHYxIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQ0FWUywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJjYXZzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDaGluZXNlIEFWUyAoQXVkaW8gVmlkZW8gU3RhbmRhcmQpIChBVlMxLVAyLCBKaVpodW4gcHJvZmlsZSkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1kgfCBBVl9DT0RFQ19QUk9QX1JFT1JERVIsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9KUEVHMjAwMCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJqcGVnMjAwMCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSlBFRyAyMDAwIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZIHwKKyAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UvanAyIiksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9WTU5DLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInZtbmMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZNd2FyZSBTY3JlZW4gQ29kZWMgLyBWTXdhcmUgVmlkZW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidnA1IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPbjIgVlA1IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVlA2LAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInZwNiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT24yIFZQNiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1ZQNkYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidnA2ZiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT24yIFZQNiAoRmxhc2ggdmVyc2lvbikiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9EU0lDSU5WSURFTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJkc2ljaW52aWRlbyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGVscGhpbmUgU29mdHdhcmUgSW50ZXJuYXRpb25hbCBDSU4gdmlkZW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9USUVSVEVYU0VRVklERU8sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidGllcnRleHNlcXZpZGVvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUaWVydGV4IExpbWl0ZWQgU0VRIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRFhBLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImR4YSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmVlYmxlIEZpbGVzL1NjdW1tVk0gRFhBIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRE5YSEQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZG54aGQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZDMy9ETnhIRCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RIUCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ0aHAiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5pbnRlbmRvIEdhbWVjdWJlIFRIUCB2aWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0M5MywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJjOTMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkludGVycGxheSBDOTMiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9CRVRIU09GVFZJRCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJiZXRoc29mdHZpZCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQmV0aGVzZGEgVklEIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVlA2QSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2cDZhIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPbjIgVlA2IChGbGFzaCB2ZXJzaW9uLCB3aXRoIGFscGhhIGNoYW5uZWwpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQU1WLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImFtdiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQU1WIFZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVkIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidmIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJlYW0gU29mdHdhcmUgVkIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9JTkRFTzQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiaW5kZW80IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJJbnRlbCBJbmRlbyBWaWRlbyBJbnRlcmFjdGl2ZSA0IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSU5ERU81LAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImluZGVvNSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSW50ZWwgSW5kZW8gVmlkZW8gSW50ZXJhY3RpdmUgNSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01JTUlDLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm1pbWljIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNaW1pYyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1JMMiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJybDIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJMMiB2aWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0VTQ0FQRTEyNCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJlc2NhcGUxMjQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkVzY2FwZSAxMjQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9ESVJBQywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJkaXJhYyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGlyYWMiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1kgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTIHwgQVZfQ09ERUNfUFJPUF9SRU9SREVSLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQkZJLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImJmaSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQnJ1dGUgRm9yY2UgJiBJZ25vcmFuY2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9DTVYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiY212IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJFbGVjdHJvbmljIEFydHMgQ01WIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTU9USU9OUElYRUxTLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm1vdGlvbnBpeGVscyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTW90aW9uIFBpeGVscyB2aWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RHViwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ0Z3YiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkVsZWN0cm9uaWMgQXJ0cyBUR1YgdmlkZW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9UR1EsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidGdxIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJFbGVjdHJvbmljIEFydHMgVEdRIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVFFJLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInRxaSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRWxlY3Ryb25pYyBBcnRzIFRRSSB2aWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FVUkEsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYXVyYSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXVyYXZpc2lvbiBBVVJBIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVVSQTIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYXVyYTIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkF1cmF2aXNpb24gQXVyYSAyIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVjIxMFgsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidjIxMHgiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCA0OjI6MiAxMC1iaXQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9UTVYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidG12IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCI4MDg4ZmxleCBUTVYiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9WMjEwLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInYyMTAiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCA0OjI6MiAxMC1iaXQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NQUQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibWFkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJFbGVjdHJvbmljIEFydHMgTWFkY293IFZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRlJXVSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJmcnd1IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGb3J3YXJkIFVuY29tcHJlc3NlZCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0ZMQVNIU1YyLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImZsYXNoc3YyIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGbGFzaCBTY3JlZW4gVmlkZW8gdjIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9DREdSQVBISUNTLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImNkZ3JhcGhpY3MiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNEIEdyYXBoaWNzIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUjIxMCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJyMjEwIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgUkdCIDEwLWJpdCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FOTSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhbm0iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRlbHV4ZSBQYWludCBBbmltYXRpb24iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9CSU5LVklERU8sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYmlua3ZpZGVvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCaW5rIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSUZGX0lMQk0sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiaWZmX2lsYm0iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIklGRiBJTEJNIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSUZGX0JZVEVSVU4xLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImlmZl9ieXRlcnVuMSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSUZGIEJ5dGVSdW4xIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfS0dWMSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJrZ3YxIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJLZWdhIEdhbWUgVmlkZW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9ZT1AsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAieW9wIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQc3lnbm9zaXMgWU9QIFZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVlA4LAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInZwOCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT24yIFZQOCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1ZQOSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2cDkiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdvb2dsZSBWUDkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QSUNUT1IsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGljdG9yIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQaWN0b3IvUEMgUGFpbnQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BNjRfTVVMVEksCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYTY0X211bHRpIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNdWx0aWNvbG9yIGNoYXJzZXQgZm9yIENvbW1vZG9yZSA2NCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0E2NF9NVUxUSTUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYTY0X211bHRpNSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTXVsdGljb2xvciBjaGFyc2V0IGZvciBDb21tb2RvcmUgNjQsIGV4dGVuZGVkIHdpdGggNXRoIGNvbG9yIChjb2xyYW0pIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUjEwSywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJyMTBrIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBSkEgS29uYSAxMC1iaXQgUkdCIENvZGVjIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVZDMSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJtdmMxIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTaWxpY29uIEdyYXBoaWNzIE1vdGlvbiBWaWRlbyBDb21wcmVzc29yIDEiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NVkMyLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm12YzIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNpbGljb24gR3JhcGhpY3MgTW90aW9uIFZpZGVvIENvbXByZXNzb3IgMiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01YUEVHLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm14cGVnIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNb2JvdGl4IE14UEVHIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTEFHQVJJVEgsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibGFnYXJpdGgiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkxhZ2FyaXRoIGxvc3NsZXNzIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUFJPUkVTLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInByb3JlcyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbGUgUHJvUmVzIChpQ29kZWMgUHJvKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0pWLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImp2IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCaXRtYXAgQnJvdGhlcnMgSlYgdmlkZW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9ERkEsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZGZhIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDaHJvbm9tYXN0ZXIgREZBIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVVRWSURFTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ1dHZpZGVvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVdCBWaWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0JNVl9WSURFTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJibXZfdmlkZW8iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRpc2N3b3JsZCBJSSBCTVYgdmlkZW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9WQkxFLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInZibGUiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZCTEUgTG9zc2xlc3MgQ29kZWMiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9EWFRPUlksCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZHh0b3J5IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEeHRvcnkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9WNDEwLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInY0MTAiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCA0OjQ6NCAxMC1iaXQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9DRFhMLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImNkeGwiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvbW1vZG9yZSBDRFhMIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWkVST0NPREVDLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInplcm9jb2RlYyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiWmVyb0NvZGVjIExvc3NsZXNzIFZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVNTMSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJtc3MxIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUyBTY3JlZW4gMSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01TQTEsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibXNhMSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVMgQVRDIFNjcmVlbiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RTQ0MyLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInRzY2MyIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUZWNoU21pdGggU2NyZWVuIENvZGVjIDIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NVFMyLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm10czIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1TIEV4cHJlc3Npb24gRW5jb2RlciBTY3JlZW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9DTExDLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImNsbGMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNhbm9wdXMgTG9zc2xlc3MgQ29kZWMiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NU1MyLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm1zczIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1TIFdpbmRvd3MgTWVkaWEgVmlkZW8gVjkgU2NyZWVuIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQUlDLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImFpYyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbGUgSW50ZXJtZWRpYXRlIENvZGVjIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWTQxUCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ5NDFwIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgWVVWIDQ6MToxIDEyLWJpdCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRVNDQVBFMTMwLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImVzY2FwZTEzMCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRXNjYXBlIDEzMCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FWUlAsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYXZycCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXZpZCAxOjEgMTAtYml0IFJHQiBQYWNrZXIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEXzAxMlYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiMDEydiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIDQ6MjoyIDEwLWJpdCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVZVSSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhdnVpIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlkIE1lcmlkaWVuIFVuY29tcHJlc3NlZCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVlVViwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJheXV2IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgcGFja2VkIE1TIDQ6NDo0OjQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RBUkdBX1kyMTYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidGFyZ2FfeTIxNiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUGlubmFjbGUgVEFSR0EgQ2luZVdhdmUgWVVWMTYiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1YzMDgsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidjMwOCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIHBhY2tlZCA0OjQ6NCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVjQwOCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2NDA4IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgcGFja2VkIFFUIDQ6NDo0OjQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1lVVjQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAieXV2NCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIHBhY2tlZCA0OjI6MCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVZSTiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhdnJuIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlkIEFWSSBDb2RlYyIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQ1BJQSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJjcGlhIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDUGlBIHZpZGVvIGZvcm1hdCIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWEZBQ0UsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAieGZhY2UiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlgtZmFjZSBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NNVkpQRUcsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic212IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTaWdtYXRlbCBNb3Rpb24gVmlkZW8iKSwKKyAgICB9LAorCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRzJNLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImcybSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR28yTWVldGluZyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0hOTTRfVklERU8sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiaG5tNHZpZGVvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJITk0gNCB2aWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0hFVkMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiaGV2YyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSC4yNjUgLyBIRVZDIChIaWdoIEVmZmljaWVuY3kgVmlkZW8gQ29kaW5nKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSB8IEFWX0NPREVDX1BST1BfUkVPUkRFUiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0ZJQywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJmaWMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1pcmlsbGlzIEZJQyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BBRl9WSURFTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwYWZfdmlkZW8iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFtYXppbmcgU3R1ZGlvIFBhY2tlZCBBbmltYXRpb24gRmlsZSBWaWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1ZQNywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2cDciLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9uMiBWUDciKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TQU5NLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInNhbm0iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkx1Y2FzQXJ0cyBTQU5NL1NNVVNIIHZpZGVvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU0dJUkxFLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInNnaXJsZSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU0dJIFJMRSA4LWJpdCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorCisgICAgLyogaW1hZ2UgY29kZWNzICovCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQUxJQVNfUElYLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImFsaWFzX3BpeCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQWxpYXMvV2F2ZWZyb250IFBJWCBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FOU0ksCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYW5zaSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVNDSUkvQU5TSSBhcnQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9CUkVOREVSX1BJWCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJicmVuZGVyX3BpeCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQlJlbmRlciBQSVggaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9EUFgsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZHB4IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEUFggKERpZ2l0YWwgUGljdHVyZSBFeGNoYW5nZSkgaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9FWFIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZXhyIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPcGVuRVhSIGltYWdlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZIHwKKyAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9HSUYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZ2lmIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHSUYgKEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdCkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UvZ2lmIiksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9KUEVHTFMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAianBlZ2xzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJKUEVHLUxTIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZIHwKKyAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9MSlBFRywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJsanBlZyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTG9zc2xlc3MgSlBFRyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BBTSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwYW0iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBBTSAoUG9ydGFibGUgQW55TWFwKSBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICAgICAgLm1pbWVfdHlwZXM9IE1UKCJpbWFnZS94LXBvcnRhYmxlLXBpeG1hcCIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUEJNLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInBibSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUEJNIChQb3J0YWJsZSBCaXRNYXApIGltYWdlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENYLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInBjeCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUEMgUGFpbnRicnVzaCBQQ1ggaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UveC1wY3giKSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BHTSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwZ20iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBHTSAoUG9ydGFibGUgR3JheU1hcCkgaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QR01ZVVYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGdteXV2IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQR01ZVVYgKFBvcnRhYmxlIEdyYXlNYXAgWVVWKSBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BORywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwbmciLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBORyAoUG9ydGFibGUgTmV0d29yayBHcmFwaGljcykgaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UvcG5nIiksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QUE0sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicHBtIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQUE0gKFBvcnRhYmxlIFBpeGVsTWFwKSBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BUWCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwdHgiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlYuRmxhc2ggUFRYIGltYWdlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU0dJLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInNnaSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU0dJIGltYWdlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU1A1WCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJzcDV4IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTdW5wbHVzIEpQRUcgKFNQNVgpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU1VOUkFTVCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJzdW5yYXN0IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTdW4gUmFzdGVyZmlsZSBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RBUkdBLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInRhcmdhIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUcnVldmlzaW9uIFRhcmdhIGltYWdlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgICAgICAubWltZV90eXBlcz0gTVQoImltYWdlL3gtdGFyZ2EiLCAiaW1hZ2UveC10Z2EiKSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RJRkYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidGlmZiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVElGRiBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICAgICAgLm1pbWVfdHlwZXM9IE1UKCJpbWFnZS90aWZmIiksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9UWEQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidHhkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZW5kZXJ3YXJlIFRYRCAoVGVYdHVyZSBEaWN0aW9uYXJ5KSBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMUlNQUdFLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInZjMWltYWdlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIFZpZGVvIDkgSW1hZ2UgdjIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9XRUJQLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIndlYnAiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldlYlAiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1kgfAorICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICAgICAgLm1pbWVfdHlwZXM9IE1UKCJpbWFnZS93ZWJwIiksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9XTVYzSU1BR0UsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAid212M2ltYWdlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIFZpZGVvIDkgSW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9YQk0sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAieGJtIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJYQk0gKFggQml0TWFwKSBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1hXRCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ4d2QiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlhXRCAoWCBXaW5kb3cgRHVtcCkgaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UveC14d2luZG93ZHVtcCIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVBORywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhcG5nIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBUE5HIChBbmltYXRlZCBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzKSBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICAgICAgLm1pbWVfdHlwZXM9IE1UKCJpbWFnZS9wbmciKSwKKyAgICB9LAorCisgICAgLyogdmFyaW91cyBQQ00gImNvZGVjcyIgKi8KKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX3MxNmxlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkJFLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV9zMTZiZSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUENNIHNpZ25lZCAxNi1iaXQgYmlnLWVuZGlhbiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9VMTZMRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fdTE2bGUiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSB1bnNpZ25lZCAxNi1iaXQgbGl0dGxlLWVuZGlhbiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9VMTZCRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fdTE2YmUiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSB1bnNpZ25lZCAxNi1iaXQgYmlnLWVuZGlhbiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TOCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fczgiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgOC1iaXQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTgsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX3U4IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gdW5zaWduZWQgOC1iaXQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fTVVMQVcsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX211bGF3IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gbXUtbGF3IC8gRy43MTEgbXUtbGF3IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX0FMQVcsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX2FsYXciLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBBLWxhdyAvIEcuNzExIEEtbGF3IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MzMkxFLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV9zMzJsZSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUENNIHNpZ25lZCAzMi1iaXQgbGl0dGxlLWVuZGlhbiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMzJCRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fczMyYmUiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgMzItYml0IGJpZy1lbmRpYW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTMyTEUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX3UzMmxlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gdW5zaWduZWQgMzItYml0IGxpdHRsZS1lbmRpYW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTMyQkUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX3UzMmJlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gdW5zaWduZWQgMzItYml0IGJpZy1lbmRpYW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzI0TEUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX3MyNGxlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gc2lnbmVkIDI0LWJpdCBsaXR0bGUtZW5kaWFuIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MyNEJFLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV9zMjRiZSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUENNIHNpZ25lZCAyNC1iaXQgYmlnLWVuZGlhbiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9VMjRMRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fdTI0bGUiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSB1bnNpZ25lZCAyNC1iaXQgbGl0dGxlLWVuZGlhbiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9VMjRCRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fdTI0YmUiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSB1bnNpZ25lZCAyNC1iaXQgYmlnLWVuZGlhbiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMjREQVVELAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV9zMjRkYXVkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gRC1DaW5lbWEgYXVkaW8gc2lnbmVkIDI0LWJpdCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9aT1JLLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV96b3JrIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gWm9yayIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZCRV9QTEFOQVIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX3MxNmJlX3BsYW5hciIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUENNIHNpZ25lZCAxNi1iaXQgYmlnLWVuZGlhbiBwbGFuYXIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEVfUExBTkFSLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV9zMTZsZV9wbGFuYXIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgMTYtYml0IGxpdHRsZS1lbmRpYW4gcGxhbmFyIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MyNExFX1BMQU5BUiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fczI0bGVfcGxhbmFyIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gc2lnbmVkIDI0LWJpdCBsaXR0bGUtZW5kaWFuIHBsYW5hciIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMzJMRV9QTEFOQVIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX3MzMmxlX3BsYW5hciIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUENNIHNpZ25lZCAzMi1iaXQgbGl0dGxlLWVuZGlhbiBwbGFuYXIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fRFZELAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV9kdmQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgMjB8MjQtYml0IGJpZy1lbmRpYW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fRjMyQkUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX2YzMmJlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gMzItYml0IGZsb2F0aW5nIHBvaW50IGJpZy1lbmRpYW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fRjMyTEUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX2YzMmxlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gMzItYml0IGZsb2F0aW5nIHBvaW50IGxpdHRsZS1lbmRpYW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fRjY0QkUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX2Y2NGJlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gNjQtYml0IGZsb2F0aW5nIHBvaW50IGJpZy1lbmRpYW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fRjY0TEUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX2Y2NGxlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gNjQtYml0IGZsb2F0aW5nIHBvaW50IGxpdHRsZS1lbmRpYW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fQkxVUkFZLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV9ibHVyYXkiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgMTZ8MjB8MjQtYml0IGJpZy1lbmRpYW4gZm9yIEJsdS1yYXkgbWVkaWEiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fTFhGLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV9seGYiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgMjAtYml0IGxpdHRsZS1lbmRpYW4gcGxhbmFyIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUzMwMk0sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiczMwMm0iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNNUFRFIDMwMk0iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzhfUExBTkFSLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV9zOF9wbGFuYXIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgOC1iaXQgcGxhbmFyIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisKKyAgICAvKiB2YXJpb3VzIEFEUENNIGNvZGVjcyAqLworICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9pbWFfcXQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIElNQSBRdWlja1RpbWUiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX2ltYV93YXYiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIElNQSBXQVYiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREszLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX2ltYV9kazMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIElNQSBEdWNrIERLMyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9ESzQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21faW1hX2RrNCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gSU1BIER1Y2sgREs0IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dTLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX2ltYV93cyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gSU1BIFdlc3R3b29kIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1NNSlBFRywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9pbWFfc21qcGVnIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBRFBDTSBJTUEgTG9raSBTREwgTUpQRUciKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9NUywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9tcyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gTWljcm9zb2Z0IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fNFhNLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtXzR4bSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gNFggTW92aWUiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9YQSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV94YSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gQ0RST00gWEEiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9BRFgsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21fYWR4IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTRUdBIENSSSBBRFggQURQQ00iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9FQSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9lYSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gRWxlY3Ryb25pYyBBcnRzIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fRzcyNiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9nNzI2IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHLjcyNiBBRFBDTSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0NULAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX2N0IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBRFBDTSBDcmVhdGl2ZSBUZWNobm9sb2d5IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fU1dGLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX3N3ZiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gU2hvY2t3YXZlIEZsYXNoIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fWUFNQUhBLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX3lhbWFoYSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gWWFtYWhhIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fU0JQUk9fNCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9zYnByb180IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBRFBDTSBTb3VuZCBCbGFzdGVyIFBybyA0LWJpdCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX1NCUFJPXzMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21fc2Jwcm9fMyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gU291bmQgQmxhc3RlciBQcm8gMi42LWJpdCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX1NCUFJPXzIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21fc2Jwcm9fMiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gU291bmQgQmxhc3RlciBQcm8gMi1iaXQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9USFAsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21fdGhwIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBRFBDTSBOaW50ZW5kbyBHYW1lY3ViZSBUSFAiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQU1WLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX2ltYV9hbXYiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIElNQSBBTVYiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9SMSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9lYV9yMSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gRWxlY3Ryb25pYyBBcnRzIFIxIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fRUFfUjMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21fZWFfcjMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIEVsZWN0cm9uaWMgQXJ0cyBSMyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0VBX1IyLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX2VhX3IyIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBRFBDTSBFbGVjdHJvbmljIEFydHMgUjIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfRUFfU0VBRCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9pbWFfZWFfc2VhZCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gSU1BIEVsZWN0cm9uaWMgQXJ0cyBTRUFEIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX0VBX0VBQ1MsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21faW1hX2VhX2VhY3MiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIElNQSBFbGVjdHJvbmljIEFydHMgRUFDUyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0VBX1hBUywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9lYV94YXMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIEVsZWN0cm9uaWMgQXJ0cyBYQVMiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9NQVhJU19YQSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9lYV9tYXhpc194YSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gRWxlY3Ryb25pYyBBcnRzIE1heGlzIENEUk9NIFhBIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX0lTUywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9pbWFfaXNzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBRFBDTSBJTUEgRnVuY29tIElTUyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0c3MjIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21fZzcyMiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRy43MjIgQURQQ00iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQVBDLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX2ltYV9hcGMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIElNQSBDUllPIEFQQyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0FGQywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9hZmMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIE5pbnRlbmRvIEdhbWVjdWJlIEFGQyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9PS0ksCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21faW1hX29raSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gSU1BIERpYWxvZ2ljIE9LSSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0RUSywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV9kdGsiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIE5pbnRlbmRvIEdhbWVjdWJlIERUSyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9SQUQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21faW1hX3JhZCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gSU1BIFJhZGljYWwiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2TEUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21fZzcyNmxlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHLjcyNiBBRFBDTSBsaXR0bGUtZW5kaWFuIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fVklNQSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV92aW1hIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMdWNhc0FydHMgVklNQSBhdWRpbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorCisgICAgLyogQU1SICovCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQU1SX05CLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFtcl9uYiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQU1SLU5CIChBZGFwdGl2ZSBNdWx0aS1SYXRlIE5hcnJvd0JhbmQpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQU1SX1dCLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFtcl93YiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQU1SLVdCIChBZGFwdGl2ZSBNdWx0aS1SYXRlIFdpZGVCYW5kKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorCisgICAgLyogUmVhbEF1ZGlvIGNvZGVjcyovCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUkFfMTQ0LAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInJhXzE0NCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVhbEF1ZGlvIDEuMCAoMTQuNEspIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUkFfMjg4LAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInJhXzI4OCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVhbEF1ZGlvIDIuMCAoMjguOEspIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisKKyAgICAvKiB2YXJpb3VzIERQQ00gY29kZWNzICovCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUk9RX0RQQ00sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicm9xX2RwY20iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRQQ00gaWQgUm9RIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSU5URVJQTEFZX0RQQ00sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiaW50ZXJwbGF5X2RwY20iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRQQ00gSW50ZXJwbGF5IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWEFOX0RQQ00sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAieGFuX2RwY20iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRQQ00gWGFuIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU09MX0RQQ00sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic29sX2RwY20iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRQQ00gU29sIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisKKyAgICAvKiBhdWRpbyBjb2RlY3MgKi8KKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibXAyIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUDIgKE1QRUcgYXVkaW8gbGF5ZXIgMikiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibXAzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUDMgKE1QRUcgYXVkaW8gbGF5ZXIgMykiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BQUMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWFjIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBQUMgKEFkdmFuY2VkIEF1ZGlvIENvZGluZykiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BQzMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWMzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVFNDIEEvNTJBIChBQy0zKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0RUUywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJkdHMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRDQSAoRFRTIENvaGVyZW50IEFjb3VzdGljcykiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1kgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVk9SQklTLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInZvcmJpcyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVm9yYmlzIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRFZBVURJTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJkdmF1ZGlvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEViBhdWRpbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1dNQVYxLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gIndtYXYxIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIEF1ZGlvIDEiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9XTUFWMiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ3bWF2MiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2luZG93cyBNZWRpYSBBdWRpbyAyIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTUFDRTMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibWFjZTMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1BQ0UgKE1hY2ludG9zaCBBdWRpbyBDb21wcmVzc2lvbi9FeHBhbnNpb24pIDM6MSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01BQ0U2LAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gIm1hY2U2IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNQUNFIChNYWNpbnRvc2ggQXVkaW8gQ29tcHJlc3Npb24vRXhwYW5zaW9uKSA2OjEiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9WTURBVURJTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2bWRhdWRpbyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2llcnJhIFZNRCBhdWRpbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0ZMQUMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZmxhYyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRkxBQyAoRnJlZSBMb3NzbGVzcyBBdWRpbyBDb2RlYykiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDNBRFUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibXAzYWR1IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBRFUgKEFwcGxpY2F0aW9uIERhdGEgVW5pdCkgTVAzIChNUEVHIGF1ZGlvIGxheWVyIDMpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVAzT040LAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gIm1wM29uNCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVAzb25NUDQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TSE9SVEVOLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInNob3J0ZW4iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNob3J0ZW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BTEFDLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFsYWMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFMQUMgKEFwcGxlIExvc3NsZXNzIEF1ZGlvIENvZGVjKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1dFU1RXT09EX1NORDEsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAid2VzdHdvb2Rfc25kMSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2VzdHdvb2QgQXVkaW8gKFNORDEpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfR1NNLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImdzbSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR1NNIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUURNMiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJxZG0yIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJRRGVzaWduIE11c2ljIENvZGVjIDIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9DT09LLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImNvb2siLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvb2sgLyBDb29rZXIgLyBHZWNrbyAoUmVhbEF1ZGlvIEcyKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RSVUVTUEVFQ0gsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidHJ1ZXNwZWVjaCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRFNQIEdyb3VwIFRydWVTcGVlY2giKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9UVEEsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidHRhIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUVEEgKFRydWUgQXVkaW8pIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU01BQ0tBVURJTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJzbWFja2F1ZGlvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTbWFja2VyIGF1ZGlvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUUNFTFAsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicWNlbHAiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlFDRUxQIC8gUHVyZVZvaWNlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfV0FWUEFDSywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ3YXZwYWNrIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXYXZQYWNrIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0RTSUNJTkFVRElPLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImRzaWNpbmF1ZGlvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEZWxwaGluZSBTb2Z0d2FyZSBJbnRlcm5hdGlvbmFsIENJTiBhdWRpbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0lNQywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJpbWMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIklNQyAoSW50ZWwgTXVzaWMgQ29kZXIpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVVTRVBBQ0s3LAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gIm11c2VwYWNrNyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTXVzZXBhY2sgU1Y3IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTUxQLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gIm1scCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTUxQIChNZXJpZGlhbiBMb3NzbGVzcyBQYWNraW5nKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0dTTV9NUywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJnc21fbXMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdTTSBNaWNyb3NvZnQgdmFyaWFudCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FUUkFDMywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhdHJhYzMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFUUkFDMyAoQWRhcHRpdmUgVFJhbnNmb3JtIEFjb3VzdGljIENvZGluZyAzKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorI2lmIEZGX0FQSV9WT1hXQVJFCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVk9YV0FSRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2b3h3YXJlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWb3h3YXJlIFJUMjkgTWV0YXNvdW5kIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisjZW5kaWYKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BUEUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYXBlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNb25rZXkncyBBdWRpbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX05FTExZTU9TRVIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibmVsbHltb3NlciIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTmVsbHltb3NlciBBc2FvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVVTRVBBQ0s4LAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gIm11c2VwYWNrOCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTXVzZXBhY2sgU1Y4IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU1BFRVgsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic3BlZXgiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNwZWV4IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfV01BVk9JQ0UsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAid21hdm9pY2UiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldpbmRvd3MgTWVkaWEgQXVkaW8gVm9pY2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9XTUFQUk8sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAid21hcHJvIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIEF1ZGlvIDkgUHJvZmVzc2lvbmFsIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfV01BTE9TU0xFU1MsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAid21hbG9zc2xlc3MiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldpbmRvd3MgTWVkaWEgQXVkaW8gTG9zc2xlc3MiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BVFJBQzNQLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImF0cmFjM3AiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFUUkFDMysgKEFkYXB0aXZlIFRSYW5zZm9ybSBBY291c3RpYyBDb2RpbmcgMyspIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRUFDMywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJlYWMzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVFNDIEEvNTJCIChBQy0zLCBFLUFDLTMpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU0lQUiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJzaXByIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsQXVkaW8gU0lQUiAvIEFDRUxQLk5FVCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01QMSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJtcDEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QMSAoTVBFRyBhdWRpbyBsYXllciAxKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RXSU5WUSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ0d2ludnEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZRRiBUd2luVlEiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9UUlVFSEQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidHJ1ZWhkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUcnVlSEQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDRBTFMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibXA0YWxzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTQgQXVkaW8gTG9zc2xlc3MgQ29kaW5nIChBTFMpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVRSQUMxLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImF0cmFjMSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVRSQUMxIChBZGFwdGl2ZSBUUmFuc2Zvcm0gQWNvdXN0aWMgQ29kaW5nKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0JJTktBVURJT19SREZULAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImJpbmthdWRpb19yZGZ0IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCaW5rIEF1ZGlvIChSREZUKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0JJTktBVURJT19EQ1QsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYmlua2F1ZGlvX2RjdCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQmluayBBdWRpbyAoRENUKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FBQ19MQVRNLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFhY19sYXRtIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBQUMgTEFUTSAoQWR2YW5jZWQgQXVkaW8gQ29kaW5nIExBVE0gc3ludGF4KSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1FETUMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicWRtYyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUURlc2lnbiBNdXNpYyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0NFTFQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiY2VsdCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29uc3RyYWluZWQgRW5lcmd5IExhcHBlZCBUcmFuc2Zvcm0gKENFTFQpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRzcyM18xLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImc3MjNfMSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRy43MjMuMSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0c3MjksCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZzcyOSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRy43MjkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF84U1ZYX0VYUCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICI4c3Z4X2V4cCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiOFNWWCBleHBvbmVudGlhbCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEXzhTVlhfRklCLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gIjhzdnhfZmliIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCI4U1ZYIGZpYm9uYWNjaSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0JNVl9BVURJTywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJibXZfYXVkaW8iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRpc2N3b3JsZCBJSSBCTVYgYXVkaW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9SQUxGLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInJhbGYiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlYWxBdWRpbyBMb3NzbGVzcyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0lBQywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJpYWMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIklBQyAoSW5kZW8gQXVkaW8gQ29kZXIpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSUxCQywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJpbGJjIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJpTEJDIChJbnRlcm5ldCBMb3cgQml0cmF0ZSBDb2RlYykiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9GRldBVkVTWU5USCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ3YXZlc3ludGgiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldhdmUgc3ludGhlc2lzIHBzZXVkby1jb2RlYyIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU09OSUMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic29uaWMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNvbmljIiksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TT05JQ19MUywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJzb25pY2xzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTb25pYyBsb3NzbGVzcyIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfT1BVUywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJvcHVzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPcHVzIChPcHVzIEludGVyYWN0aXZlIEF1ZGlvIENvZGVjKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0NPTUZPUlRfTk9JU0UsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiY29tZm9ydG5vaXNlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSRkMgMzM4OSBDb21mb3J0IE5vaXNlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVEFLLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInRhayIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVEFLIChUb20ncyBsb3NzbGVzcyBBdWRpbyBLb21wcmVzc29yKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01FVEFTT1VORCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJtZXRhc291bmQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZveHdhcmUgTWV0YVNvdW5kIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUEFGX0FVRElPLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBhZl9hdWRpbyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQW1hemluZyBTdHVkaW8gUGFja2VkIEFuaW1hdGlvbiBGaWxlIEF1ZGlvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfT04yQVZDLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImF2YyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT24yIEF1ZGlvIGZvciBWaWRlbyBDb2RlYyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0VWUkMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZXZyYyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRVZSQyAoRW5oYW5jZWQgVmFyaWFibGUgUmF0ZSBDb2RlYykiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TTVYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic212IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTTVYgKFNlbGVjdGFibGUgTW9kZSBWb2NvZGVyKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0RTRF9MU0JGLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImRzZF9sc2JmIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEU0QgKERpcmVjdCBTdHJlYW0gRGlnaXRhbCksIGxlYXN0IHNpZ25pZmljYW50IGJpdCBmaXJzdCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0RTRF9NU0JGLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImRzZF9tc2JmIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEU0QgKERpcmVjdCBTdHJlYW0gRGlnaXRhbCksIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRFNEX0xTQkZfUExBTkFSLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImRzZF9sc2JmX3BsYW5hciIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRFNEIChEaXJlY3QgU3RyZWFtIERpZ2l0YWwpLCBsZWFzdCBzaWduaWZpY2FudCBiaXQgZmlyc3QsIHBsYW5hciIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0RTRF9NU0JGX1BMQU5BUiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJkc2RfbXNiZl9wbGFuYXIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRTRCAoRGlyZWN0IFN0cmVhbSBEaWdpdGFsKSwgbW9zdCBzaWduaWZpY2FudCBiaXQgZmlyc3QsIHBsYW5hciIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorCisgICAgLyogc3VidGl0bGUgY29kZWNzICovCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRFZEX1NVQlRJVExFLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gImR2ZF9zdWJ0aXRsZSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRFZEIHN1YnRpdGxlcyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9CSVRNQVBfU1VCLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gImR2Yl9zdWJ0aXRsZSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRFZCIHN1YnRpdGxlcyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9CSVRNQVBfU1VCLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVEVYVCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJ0ZXh0IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgVVRGLTggdGV4dCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1hTVUIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgICAgIC5uYW1lICAgICAgPSAieHN1YiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiWFNVQiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9CSVRNQVBfU1VCLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVNTLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gImFzcyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVNTIChBZHZhbmNlZCBTU0EpIHN1YnRpdGxlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU1NBLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gInNzYSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU1NBIChTdWJTdGF0aW9uIEFscGhhKSBzdWJ0aXRsZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01PVl9URVhULAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gIm1vdl90ZXh0IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNT1YgdGV4dCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0hETVZfUEdTX1NVQlRJVExFLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gImhkbXZfcGdzX3N1YnRpdGxlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJIRE1WIFByZXNlbnRhdGlvbiBHcmFwaGljIFN0cmVhbSBzdWJ0aXRsZXMiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfQklUTUFQX1NVQiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0RWQl9URUxFVEVYVCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJkdmJfdGVsZXRleHQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRWQiB0ZWxldGV4dCIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU1JULAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gInNydCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3ViUmlwIHN1YnRpdGxlIHdpdGggZW1iZWRkZWQgdGltaW5nIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU1VCUklQLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gInN1YnJpcCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3ViUmlwIHN1YnRpdGxlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTUlDUk9EVkQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgICAgIC5uYW1lICAgICAgPSAibWljcm9kdmQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1pY3JvRFZEIHN1YnRpdGxlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVBMMiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJtcGwyIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEwyIHN1YnRpdGxlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRUlBXzYwOCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJlaWFfNjA4IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJFSUEtNjA4IGNsb3NlZCBjYXB0aW9ucyIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSkFDT1NVQiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJqYWNvc3ViIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJKQUNPc3ViIHN1YnRpdGxlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUEpTLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gInBqcyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUEpTIChQaG9lbml4IEphcGFuaW1hdGlvbiBTb2NpZXR5KSBzdWJ0aXRsZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NBTUksCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgICAgIC5uYW1lICAgICAgPSAic2FtaSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU0FNSSBzdWJ0aXRsZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1JFQUxURVhULAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gInJlYWx0ZXh0IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsVGV4dCBzdWJ0aXRsZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NUTCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJzdGwiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNwcnVjZSBzdWJ0aXRsZSBmb3JtYXQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfVEVYVF9TVUIsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TVUJWSUVXRVIxLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gInN1YnZpZXdlcjEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlN1YlZpZXdlciB2MSBzdWJ0aXRsZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NVQlZJRVdFUiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJzdWJ2aWV3ZXIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlN1YlZpZXdlciBzdWJ0aXRsZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1ZQTEFZRVIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgICAgIC5uYW1lICAgICAgPSAidnBsYXllciIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVlBsYXllciBzdWJ0aXRsZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1dFQlZUVCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJ3ZWJ2dHQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldlYlZUVCBzdWJ0aXRsZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorCisgICAgLyogb3RoZXIga2luZCBvZiBjb2RlY3MgYW5kIHBzZXVkby1jb2RlY3MgKi8KKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9UVEYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfREFUQSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJ0dGYiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRydWVUeXBlIGZvbnQiKSwKKyAgICAgICAgLm1pbWVfdHlwZXM9IE1UKCJhcHBsaWNhdGlvbi94LXRydWV0eXBlLWZvbnQiLCAiYXBwbGljYXRpb24veC1mb250IiksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9CSU5URVhULAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImJpbnRleHQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJpbmFyeSB0ZXh0IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9YQklOLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInhiaW4iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImVYdGVuZGVkIEJJTmFyeSB0ZXh0IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9JREYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiaWRmIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJpQ0VEcmF3IHRleHQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX09URiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9EQVRBLAorICAgICAgICAubmFtZSAgICAgID0gIm90ZiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT3BlblR5cGUgZm9udCIpLAorICAgICAgICAubWltZV90eXBlcz0gTVQoImFwcGxpY2F0aW9uL3ZuZC5tcy1vcGVudHlwZSIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU01QVEVfS0xWLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0RBVEEsCisgICAgICAgIC5uYW1lICAgICAgPSAia2x2IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTTVBURSAzMzZNIEtleS1MZW5ndGgtVmFsdWUgKEtMVikgbWV0YWRhdGEiKSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0RWRF9OQVYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfREFUQSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJkdmRfbmF2X3BhY2tldCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRFZEIE5hdiBwYWNrZXQiKSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RJTUVEX0lEMywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9EQVRBLAorICAgICAgICAubmFtZSAgICAgID0gInRpbWVkX2lkMyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgidGltZWQgSUQzIG1ldGFkYXRhIiksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9CSU5fREFUQSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9EQVRBLAorICAgICAgICAubmFtZSAgICAgID0gImJpbl9kYXRhIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJiaW5hcnkgZGF0YSIpLAorICAgICAgICAubWltZV90eXBlcz0gTVQoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpLAorICAgIH0sCisKKyAgICAvKiBkZXByZWNhdGVkIGNvZGVjIGlkcyAqLworICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0JSRU5ERVJfUElYX0RFUFJFQ0FURUQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYnJlbmRlcl9waXhfZGVwcmVjYXRlZCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQlJlbmRlciBQSVggaW1hZ2UgKGRlcHJlY2F0ZWQgaWQpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRVNDQVBFMTMwX0RFUFJFQ0FURUQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZXNjYXBlMTMwX2RlcHJlY2F0ZWQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkVzY2FwZSAxMzAgKGRlcHJlY2F0ZWQgaWQpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRVhSX0RFUFJFQ0FURUQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZXhyX2RlcHJlY2F0ZWQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9wZW5FWFIgaW1hZ2UgKGRlcHJlY2F0ZWQgaWQpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZIHwKKyAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9HMk1fREVQUkVDQVRFRCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJnMm1fZGVwcmVjYXRlZCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR28yTWVldGluZyAoZGVwcmVjYXRlZCBpZCkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9IRVZDX0RFUFJFQ0FURUQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiaGV2Y19kZXByZWNhdGVkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJILjI2NSAvIEhFVkMgKEhpZ2ggRWZmaWNpZW5jeSBWaWRlbyBDb2RpbmcpIChkZXByZWNhdGVkIGlkKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BBRl9WSURFT19ERVBSRUNBVEVELAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInBhZl92aWRlb19kZXByZWNhdGVkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBbWF6aW5nIFN0dWRpbyBQYWNrZWQgQW5pbWF0aW9uIEZpbGUgVmlkZW8gKGRlcHJlY2F0ZWQgaWQpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU0FOTV9ERVBSRUNBVEVELAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInNhbm1fZGVwcmVjYXRlZCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTHVjYXNBcnRzIFNBTk0vU01VU0ggdmlkZW8gKGRlcHJlY2F0ZWQgaWQpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVlA3X0RFUFJFQ0FURUQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidnA3X2RlcHJlY2F0ZWQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9uMiBWUDcgKGRlcHJlY2F0ZWQgaWQpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfV0VCUF9ERVBSRUNBVEVELAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIndlYnBfZGVwcmVjYXRlZCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2ViUCAoZGVwcmVjYXRlZCBpZCkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1kgfAorICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVklNQSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2aW1hIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMdWNhc0FydHMgVklNQSBhdWRpbyAoZGVwcmVjYXRlZCBpZCkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9WSU1BX0RFUFJFQ0FURUQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21fdmltYV9kZXByZWNhdGVkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMdWNhc0FydHMgVklNQSBhdWRpbyAoZGVwcmVjYXRlZCBpZCkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9PUFVTX0RFUFJFQ0FURUQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAib3B1c19kZXByZWNhdGVkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPcHVzIChPcHVzIEludGVyYWN0aXZlIEF1ZGlvIENvZGVjKSAoZGVwcmVjYXRlZCBpZCkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQUZfQVVESU9fREVQUkVDQVRFRCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwYWZfYXVkaW9fZGVwcmVjYXRlZCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQW1hemluZyBTdHVkaW8gUGFja2VkIEFuaW1hdGlvbiBGaWxlIEF1ZGlvIChkZXByZWNhdGVkIGlkKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMjRMRV9QTEFOQVJfREVQUkVDQVRFRCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fczI0bGVfcGxhbmFyX2RlcHJlY2F0ZWQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgMjQtYml0IGxpdHRsZS1lbmRpYW4gcGxhbmFyIChkZXByZWNhdGVkIGlkKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMzJMRV9QTEFOQVJfREVQUkVDQVRFRCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fczMybGVfcGxhbmFyX2RlcHJlY2F0ZWQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgMzItYml0IGxpdHRsZS1lbmRpYW4gcGxhbmFyIChkZXByZWNhdGVkIGlkKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RBS19ERVBSRUNBVEVELAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInRha19kZXByZWNhdGVkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUQUsgKFRvbSdzIGxvc3NsZXNzIEF1ZGlvIEtvbXByZXNzb3IpIChkZXByZWNhdGVkIGlkKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorfTsKKworY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoZW51bSBBVkNvZGVjSUQgaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoY29kZWNfZGVzY3JpcHRvcnMpOyBpKyspCisgICAgICAgIGlmIChjb2RlY19kZXNjcmlwdG9yc1tpXS5pZCA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiAmY29kZWNfZGVzY3JpcHRvcnNbaV07CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICphdmNvZGVjX2Rlc2NyaXB0b3JfbmV4dChjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqcHJldikKK3sKKyAgICBpZiAoIXByZXYpCisgICAgICAgIHJldHVybiAmY29kZWNfZGVzY3JpcHRvcnNbMF07CisgICAgaWYgKHByZXYgLSBjb2RlY19kZXNjcmlwdG9ycyA8IEZGX0FSUkFZX0VMRU1TKGNvZGVjX2Rlc2NyaXB0b3JzKSAtIDEpCisgICAgICAgIHJldHVybiBwcmV2ICsgMTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmF2Y29kZWNfZGVzY3JpcHRvcl9nZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpkZXNjID0gTlVMTDsKKworICAgIHdoaWxlICgoZGVzYyA9IGF2Y29kZWNfZGVzY3JpcHRvcl9uZXh0KGRlc2MpKSkKKyAgICAgICAgaWYgKCFzdHJjbXAoZGVzYy0+bmFtZSwgbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gZGVzYzsKKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2Nvb2suYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Nvb2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmJjZTJhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvY29vay5jCkBAIC0wLDAgKzEsMTI5MCBAQAorLyoKKyAqIENPT0sgY29tcGF0aWJsZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgU2FzY2hhIFNvbW1lcgorICogQ29weXJpZ2h0IChjKSAyMDA1IEJlbmphbWluIExhcnNzb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ29vayBjb21wYXRpYmxlIGRlY29kZXIuIEJhc3RhcmRpemF0aW9uIG9mIHRoZSBHLjcyMi4xIHN0YW5kYXJkLgorICogVGhpcyBkZWNvZGVyIGhhbmRsZXMgUmVhbE5ldHdvcmtzLCBSZWFsQXVkaW8gRzIgZGF0YS4KKyAqIENvb2sgaXMgaWRlbnRpZmllZCBieSB0aGUgY29kZWMgbmFtZSBjb29rIGluIFJNIGZpbGVzLgorICoKKyAqIFRvIHVzZSB0aGlzIGRlY29kZXIsIGEgY2FsbGluZyBhcHBsaWNhdGlvbiBtdXN0IHN1cHBseSB0aGUgZXh0cmFkYXRhCisgKiBieXRlcyBwcm92aWRlZCBmcm9tIHRoZSBSTSBjb250YWluZXI7IDgrIGJ5dGVzIGZvciBtb25vIHN0cmVhbXMgYW5kCisgKiAxNisgZm9yIHN0ZXJlbyBzdHJlYW1zIChtYXliZSBtb3JlKS4KKyAqCisgKiBDb2RlYyB0ZWNobmljYWxpdGllcyAoYWxsIHRoaXMgYXNzdW1lIGEgYnVmZmVyIGxlbmd0aCBvZiAxMDI0KToKKyAqIENvb2sgd29ya3Mgd2l0aCBzZXZlcmFsIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgaXRzIGNvbXByZXNzaW9uLgorICogSW4gdGhlIHRpbWVkb21haW4gdGhlIGJ1ZmZlciBpcyBkaXZpZGVkIGludG8gOCBwaWVjZXMgYW5kIHF1YW50aXplZC4gSWYKKyAqIHR3byBuZWlnaGJvcmluZyBwaWVjZXMgaGF2ZSBkaWZmZXJlbnQgcXVhbnRpemF0aW9uIGluZGV4IGEgc21vb3RoCisgKiBxdWFudGl6YXRpb24gY3VydmUgaXMgdXNlZCB0byBnZXQgYSBzbW9vdGggb3ZlcmxhcCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQKKyAqIHBpZWNlcy4KKyAqIFRvIGdldCB0byB0aGUgdHJhbnNmb3JtZG9tYWluIENvb2sgdXNlcyBhIG1vZHVsYXRlZCBsYXBwZWQgdHJhbnNmb3JtLgorICogVGhlIHRyYW5zZm9ybSBkb21haW4gaGFzIDUwIHN1YmJhbmRzIHdpdGggMjAgZWxlbWVudHMgZWFjaC4gVGhpcworICogbWVhbnMgb25seSBhIG1heGltdW0gb2YgNTAqMjA9MTAwMCBjb2VmZmljaWVudHMgYXJlIHVzZWQgb3V0IG9mIHRoZSAxMDI0CisgKiBhdmFpbGFibGUuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKworI2luY2x1ZGUgImF1ZGlvZHNwLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic2luZXdpbi5oIgorI2luY2x1ZGUgInVuYXJ5LmgiCisKKyNpbmNsdWRlICJjb29rZGF0YS5oIgorCisvKiB0aGUgZGlmZmVyZW50IENvb2sgdmVyc2lvbnMgKi8KKyNkZWZpbmUgTU9OTyAgICAgICAgICAgIDB4MTAwMDAwMQorI2RlZmluZSBTVEVSRU8gICAgICAgICAgMHgxMDAwMDAyCisjZGVmaW5lIEpPSU5UX1NURVJFTyAgICAweDEwMDAwMDMKKyNkZWZpbmUgTUNfQ09PSyAgICAgICAgIDB4MjAwMDAwMCAgIC8vIG11bHRpY2hhbm5lbCBDb29rLCBub3Qgc3VwcG9ydGVkCisKKyNkZWZpbmUgU1VCQkFORF9TSVpFICAgIDIwCisjZGVmaW5lIE1BWF9TVUJQQUNLRVRTICAgNQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICpub3c7CisgICAgaW50ICpwcmV2aW91czsKK30gY29va19nYWluczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICAgICAgY2hfaWR4OworICAgIGludCAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9jaGFubmVsczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGNvb2t2ZXJzaW9uOworICAgIGludCAgICAgICAgICAgICAgICAgc3ViYmFuZHM7CisgICAgaW50ICAgICAgICAgICAgICAgICBqc19zdWJiYW5kX3N0YXJ0OworICAgIGludCAgICAgICAgICAgICAgICAganNfdmxjX2JpdHM7CisgICAgaW50ICAgICAgICAgICAgICAgICBzYW1wbGVzX3Blcl9jaGFubmVsOworICAgIGludCAgICAgICAgICAgICAgICAgbG9nMl9udW12ZWN0b3Jfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIGNoYW5uZWxfbWFzazsKKyAgICBWTEMgICAgICAgICAgICAgICAgIGNoYW5uZWxfY291cGxpbmc7CisgICAgaW50ICAgICAgICAgICAgICAgICBqb2ludF9zdGVyZW87CisgICAgaW50ICAgICAgICAgICAgICAgICBiaXRzX3Blcl9zdWJwYWNrZXQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBiaXRzX3Blcl9zdWJwZGl2OworICAgIGludCAgICAgICAgICAgICAgICAgdG90YWxfc3ViYmFuZHM7CisgICAgaW50ICAgICAgICAgICAgICAgICBudW12ZWN0b3Jfc2l6ZTsgICAgICAgLy8gMSA8PCBsb2cyX251bXZlY3Rvcl9zaXplOworCisgICAgZmxvYXQgICAgICAgICAgICAgICBtb25vX3ByZXZpb3VzX2J1ZmZlcjFbMTAyNF07CisgICAgZmxvYXQgICAgICAgICAgICAgICBtb25vX3ByZXZpb3VzX2J1ZmZlcjJbMTAyNF07CisKKyAgICBjb29rX2dhaW5zICAgICAgICAgIGdhaW5zMTsKKyAgICBjb29rX2dhaW5zICAgICAgICAgIGdhaW5zMjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGdhaW5fMVs5XTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGdhaW5fMls5XTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGdhaW5fM1s5XTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGdhaW5fNFs5XTsKK30gQ09PS1N1YnBhY2tldDsKKwordHlwZWRlZiBzdHJ1Y3QgY29vayB7CisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIDUgZnVuY3Rpb25zIHByb3ZpZGUgdGhlIGxvd2xldmVsIGFyaXRobWV0aWMgb24KKyAgICAgKiB0aGUgaW50ZXJuYWwgYXVkaW8gYnVmZmVycy4KKyAgICAgKi8KKyAgICB2b2lkICgqc2NhbGFyX2RlcXVhbnQpKHN0cnVjdCBjb29rICpxLCBpbnQgaW5kZXgsIGludCBxdWFudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc3ViYmFuZF9jb2VmX2luZGV4LCBpbnQgKnN1YmJhbmRfY29lZl9zaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm1sdF9wKTsKKworICAgIHZvaWQgKCpkZWNvdXBsZSkoc3RydWN0IGNvb2sgKnEsCisgICAgICAgICAgICAgICAgICAgICBDT09LU3VicGFja2V0ICpwLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmMSwgZmxvYXQgZjIsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVjb2RlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICptbHRfYnVmZmVyMSwgZmxvYXQgKm1sdF9idWZmZXIyKTsKKworICAgIHZvaWQgKCppbWx0X3dpbmRvdykoc3RydWN0IGNvb2sgKnEsIGZsb2F0ICpidWZmZXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgY29va19nYWlucyAqZ2FpbnNfcHRyLCBmbG9hdCAqcHJldmlvdXNfYnVmZmVyKTsKKworICAgIHZvaWQgKCppbnRlcnBvbGF0ZSkoc3RydWN0IGNvb2sgKnEsIGZsb2F0ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ2Fpbl9pbmRleCwgaW50IGdhaW5faW5kZXhfbmV4dCk7CisKKyAgICB2b2lkICgqc2F0dXJhdGVfb3V0cHV0KShzdHJ1Y3QgY29vayAqcSwgZmxvYXQgKm91dCk7CisKKyAgICBBVkNvZGVjQ29udGV4dCogICAgIGF2Y3R4OworICAgIEF1ZGlvRFNQQ29udGV4dCAgICAgYWRzcDsKKyAgICBHZXRCaXRDb250ZXh0ICAgICAgIGdiOworICAgIC8qIHN0cmVhbSBkYXRhICovCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fdmVjdG9yczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNhbXBsZXNfcGVyX2NoYW5uZWw7CisgICAgLyogc3RhdGVzICovCisgICAgQVZMRkcgICAgICAgICAgICAgICByYW5kb21fc3RhdGU7CisgICAgaW50ICAgICAgICAgICAgICAgICBkaXNjYXJkZWRfcGFja2V0czsKKworICAgIC8qIHRyYW5zZm9ybSBkYXRhICovCisgICAgRkZUQ29udGV4dCAgICAgICAgICBtZGN0X2N0eDsKKyAgICBmbG9hdCogICAgICAgICAgICAgIG1sdF93aW5kb3c7CisKKyAgICAvKiBWTEMgZGF0YSAqLworICAgIFZMQyAgICAgICAgICAgICAgICAgZW52ZWxvcGVfcXVhbnRfaW5kZXhbMTNdOworICAgIFZMQyAgICAgICAgICAgICAgICAgc3F2aFs3XTsgICAgICAgICAgLy8gc2NhbGFyIHF1YW50aXphdGlvbgorCisgICAgLyogZ2VuZXJhdGFibGUgdGFibGVzIGFuZCByZWxhdGVkIHZhcmlhYmxlcyAqLworICAgIGludCAgICAgICAgICAgICAgICAgZ2Fpbl9zaXplX2ZhY3RvcjsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIGdhaW5fdGFibGVbMjNdOworCisgICAgLyogZGF0YSBidWZmZXJzICovCisKKyAgICB1aW50OF90KiAgICAgICAgICAgIGRlY29kZWRfYnl0ZXNfYnVmZmVyOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIG1vbm9fbWRjdF9vdXRwdXQpWzIwNDhdOworICAgIGZsb2F0ICAgICAgICAgICAgICAgZGVjb2RlX2J1ZmZlcl8xWzEwMjRdOworICAgIGZsb2F0ICAgICAgICAgICAgICAgZGVjb2RlX2J1ZmZlcl8yWzEwMjRdOworICAgIGZsb2F0ICAgICAgICAgICAgICAgZGVjb2RlX2J1ZmZlcl8wWzEwNjBdOyAvKiBzdGF0aWMgYWxsb2NhdGlvbiBmb3Igam9pbnQgZGVjb2RlICovCisKKyAgICBjb25zdCBmbG9hdCAgICAgICAgICpjcGxzY2FsZXNbNV07CisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fc3VicGFja2V0czsKKyAgICBDT09LU3VicGFja2V0ICAgICAgIHN1YnBhY2tldFtNQVhfU1VCUEFDS0VUU107Cit9IENPT0tDb250ZXh0OworCitzdGF0aWMgZmxvYXQgICAgIHBvdzJ0YWJbMTI3XTsKK3N0YXRpYyBmbG9hdCByb290cG93MnRhYlsxMjddOworCisvKioqKioqKioqKioqKioqIGluaXQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKi8KKworLyogdGFibGUgZ2VuZXJhdG9yICovCitzdGF0aWMgYXZfY29sZCB2b2lkIGluaXRfcG93MnRhYmxlKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gLTYzOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBwb3cydGFiWzYzICsgaV0gPSBwb3coMiwgaSk7CisgICAgICAgIHJvb3Rwb3cydGFiWzYzICsgaV0gPSBzcXJ0KHBvdygyLCBpKSk7CisgICAgfQorfQorCisvKiB0YWJsZSBnZW5lcmF0b3IgKi8KK3N0YXRpYyBhdl9jb2xkIHZvaWQgaW5pdF9nYWluX3RhYmxlKENPT0tDb250ZXh0ICpxKQoreworICAgIGludCBpOworICAgIHEtPmdhaW5fc2l6ZV9mYWN0b3IgPSBxLT5zYW1wbGVzX3Blcl9jaGFubmVsIC8gODsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjM7IGkrKykKKyAgICAgICAgcS0+Z2Fpbl90YWJsZVtpXSA9IHBvdyhwb3cydGFiW2kgKyA1Ml0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEuMCAvIChkb3VibGUpIHEtPmdhaW5fc2l6ZV9mYWN0b3IpKTsKK30KKworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdF9jb29rX3ZsY190YWJsZXMoQ09PS0NvbnRleHQgKnEpCit7CisgICAgaW50IGksIHJlc3VsdDsKKworICAgIHJlc3VsdCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDEzOyBpKyspIHsKKyAgICAgICAgcmVzdWx0IHw9IGluaXRfdmxjKCZxLT5lbnZlbG9wZV9xdWFudF9pbmRleFtpXSwgOSwgMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZV9xdWFudF9pbmRleF9odWZmYml0c1tpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlX3F1YW50X2luZGV4X2h1ZmZjb2Rlc1tpXSwgMiwgMiwgMCk7CisgICAgfQorICAgIGF2X2xvZyhxLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAic3F2aCBWTEMgaW5pdFxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworICAgICAgICByZXN1bHQgfD0gaW5pdF92bGMoJnEtPnNxdmhbaV0sIHZodmxjc2l6ZV90YWJbaV0sIHZoc2l6ZV90YWJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdmhfaHVmZmJpdHNbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdmhfaHVmZmNvZGVzW2ldLCAyLCAyLCAwKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcS0+bnVtX3N1YnBhY2tldHM7IGkrKykgeworICAgICAgICBpZiAocS0+c3VicGFja2V0W2ldLmpvaW50X3N0ZXJlbyA9PSAxKSB7CisgICAgICAgICAgICByZXN1bHQgfD0gaW5pdF92bGMoJnEtPnN1YnBhY2tldFtpXS5jaGFubmVsX2NvdXBsaW5nLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IHEtPnN1YnBhY2tldFtpXS5qc192bGNfYml0cykgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjcGxfaHVmZmJpdHNbcS0+c3VicGFja2V0W2ldLmpzX3ZsY19iaXRzIC0gMl0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NwbF9odWZmY29kZXNbcS0+c3VicGFja2V0W2ldLmpzX3ZsY19iaXRzIC0gMl0sIDIsIDIsIDApOworICAgICAgICAgICAgYXZfbG9nKHEtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJzdWJwYWNrZXQgJWkgSm9pbnQtc3RlcmVvIFZMQyB1c2VkLlxuIiwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9sb2cocS0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlZMQyB0YWJsZXMgaW5pdGlhbGl6ZWQuXG4iKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdF9jb29rX21sdChDT09LQ29udGV4dCAqcSkKK3sKKyAgICBpbnQgaiwgcmV0OworICAgIGludCBtbHRfc2l6ZSA9IHEtPnNhbXBsZXNfcGVyX2NoYW5uZWw7CisKKyAgICBpZiAoKHEtPm1sdF93aW5kb3cgPSBhdl9tYWxsb2NfYXJyYXkobWx0X3NpemUsIHNpemVvZigqcS0+bWx0X3dpbmRvdykpKSA9PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgTUxUIHdpbmRvdzogc2ltcGxlIHNpbmUgd2luZG93LiAqLworICAgIGZmX3NpbmVfd2luZG93X2luaXQocS0+bWx0X3dpbmRvdywgbWx0X3NpemUpOworICAgIGZvciAoaiA9IDA7IGogPCBtbHRfc2l6ZTsgaisrKQorICAgICAgICBxLT5tbHRfd2luZG93W2pdICo9IHNxcnQoMi4wIC8gcS0+c2FtcGxlc19wZXJfY2hhbm5lbCk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBNRENULiAqLworICAgIGlmICgocmV0ID0gZmZfbWRjdF9pbml0KCZxLT5tZGN0X2N0eCwgYXZfbG9nMihtbHRfc2l6ZSkgKyAxLCAxLCAxLjAgLyAzMjc2OC4wKSkpIHsKKyAgICAgICAgYXZfZnJlZXAoJnEtPm1sdF93aW5kb3cpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBhdl9sb2cocS0+YXZjdHgsIEFWX0xPR19ERUJVRywgIk1EQ1QgaW5pdGlhbGl6ZWQsIG9yZGVyID0gJWQuXG4iLAorICAgICAgICAgICBhdl9sb2cyKG1sdF9zaXplKSArIDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgaW5pdF9jcGxzY2FsZXNfdGFibGUoQ09PS0NvbnRleHQgKnEpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgcS0+Y3Bsc2NhbGVzW2ldID0gY3Bsc2NhbGVzW2ldOworfQorCisvKioqKioqKioqKioqKioqIGluaXQgZnVuY3Rpb25zIGVuZCAqKioqKioqKioqKi8KKworI2RlZmluZSBERUNPREVfQllURVNfUEFEMShieXRlcykgKDMgLSAoKGJ5dGVzKSArIDMpICUgNCkKKyNkZWZpbmUgREVDT0RFX0JZVEVTX1BBRDIoYnl0ZXMpICgoYnl0ZXMpICUgNCArIERFQ09ERV9CWVRFU19QQUQxKDIgKiAoYnl0ZXMpKSkKKworLyoqCisgKiBDb29rIGluZGF0YSBkZWNvZGluZywgZXZlcnkgMzIgYml0cyBhcmUgWE9SZWQgd2l0aCAweDM3YzUxMWYyLgorICogV2h5PyBObyBpZGVhLCBzb21lIGNoZWNrc3VtL2Vycm9yIGRldGVjdGlvbiBtZXRob2QgbWF5YmUuCisgKgorICogT3V0IGJ1ZmZlciBzaXplOiBleHRyYSBieXRlcyBhcmUgbmVlZGVkIHRvIGNvcGUgd2l0aAorICogcGFkZGluZy9taXNhbGlnbm1lbnQuCisgKiBTdWJwYWNrZXRzIHBhc3NlZCB0byB0aGUgZGVjb2RlciBjYW4gY29udGFpbiB0d28sIGNvbnNlY3V0aXZlCisgKiBoYWxmLXN1YnBhY2tldHMsIG9mIGlkZW50aWNhbCBidXQgYXJiaXRyYXJ5IHNpemUuCisgKiAgICAgICAgICAxMjM0IDEyMzQgMTIzNCAxMjM0ICBleHRyYUEgZXh0cmFCCisgKiBDYXNlIDE6ICBBQUFBIEJCQkIgICAgICAgICAgICAgIDAgICAgICAwCisgKiBDYXNlIDI6ICBBQUFBIEFCQkIgQkItLSAgICAgICAgIDMgICAgICAzCisgKiBDYXNlIDM6ICBBQUFBIEFBQkIgQkJCQiAgICAgICAgIDIgICAgICAyCisgKiBDYXNlIDQ6ICBBQUFBIEFBQUIgQkJCQiBCQi0tICAgIDEgICAgICA1CisgKgorICogTmljZSB3YXkgdG8gd2FzdGUgQ1BVIGN5Y2xlcy4KKyAqCisgKiBAcGFyYW0gaW5idWZmZXIgIHBvaW50ZXIgdG8gYnl0ZSBhcnJheSBvZiBpbmRhdGEKKyAqIEBwYXJhbSBvdXQgICAgICAgcG9pbnRlciB0byBieXRlIGFycmF5IG9mIG91dGRhdGEKKyAqIEBwYXJhbSBieXRlcyAgICAgbnVtYmVyIG9mIGJ5dGVzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRlY29kZV9ieXRlcyhjb25zdCB1aW50OF90ICppbmJ1ZmZlciwgdWludDhfdCAqb3V0LCBpbnQgYnl0ZXMpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHRhYls0XSA9IHsKKyAgICAgICAgQVZfQkUyTkUzMkMoMHgzN2M1MTFmMnUpLCBBVl9CRTJORTMyQygweGYyMzdjNTExdSksCisgICAgICAgIEFWX0JFMk5FMzJDKDB4MTFmMjM3YzV1KSwgQVZfQkUyTkUzMkMoMHhjNTExZjIzN3UpLAorICAgIH07CisgICAgaW50IGksIG9mZjsKKyAgICB1aW50MzJfdCBjOworICAgIGNvbnN0IHVpbnQzMl90ICpidWY7CisgICAgdWludDMyX3QgKm9idWYgPSAodWludDMyX3QgKikgb3V0OworICAgIC8qIEZJWE1FOiA2NCBiaXQgcGxhdGZvcm1zIHdvdWxkIGJlIGFibGUgdG8gZG8gNjQgYml0cyBhdCBhIHRpbWUuCisgICAgICogSSdtIHRvbyBsYXp5IHRob3VnaCwgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlCisgICAgICogZm9yIChpID0gMDsgaSA8IGJpdGFtb3VudCAvIDY0OyBpKyspCisgICAgICogICAgIChpbnQ2NF90KSBvdXRbaV0gPSAweDM3YzUxMWYyMzdjNTExZjIgXiBhdl9iZTJuZTY0KGludDY0X3QpIGluW2ldKTsKKyAgICAgKiBCdWZmZXIgYWxpZ25tZW50IG5lZWRzIHRvIGJlIGNoZWNrZWQuICovCisKKyAgICBvZmYgPSAoaW50cHRyX3QpIGluYnVmZmVyICYgMzsKKyAgICBidWYgPSAoY29uc3QgdWludDMyX3QgKikgKGluYnVmZmVyIC0gb2ZmKTsKKyAgICBjID0gdGFiW29mZl07CisgICAgYnl0ZXMgKz0gMyArIG9mZjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnl0ZXMgLyA0OyBpKyspCisgICAgICAgIG9idWZbaV0gPSBjIF4gYnVmW2ldOworCisgICAgcmV0dXJuIG9mZjsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGNvb2tfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgaTsKKyAgICBDT09LQ29udGV4dCAqcSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJEZWFsbG9jYXRpbmcgbWVtb3J5LlxuIik7CisKKyAgICAvKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgYnVmZmVycy4gKi8KKyAgICBhdl9mcmVlcCgmcS0+bWx0X3dpbmRvdyk7CisgICAgYXZfZnJlZXAoJnEtPmRlY29kZWRfYnl0ZXNfYnVmZmVyKTsKKworICAgIC8qIEZyZWUgdGhlIHRyYW5zZm9ybS4gKi8KKyAgICBmZl9tZGN0X2VuZCgmcS0+bWRjdF9jdHgpOworCisgICAgLyogRnJlZSB0aGUgVkxDIHRhYmxlcy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykKKyAgICAgICAgZmZfZnJlZV92bGMoJnEtPmVudmVsb3BlX3F1YW50X2luZGV4W2ldKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICAgICAgICBmZl9mcmVlX3ZsYygmcS0+c3F2aFtpXSk7CisgICAgZm9yIChpID0gMDsgaSA8IHEtPm51bV9zdWJwYWNrZXRzOyBpKyspCisgICAgICAgIGZmX2ZyZWVfdmxjKCZxLT5zdWJwYWNrZXRbaV0uY2hhbm5lbF9jb3VwbGluZyk7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIk1lbW9yeSBkZWFsbG9jYXRlZC5cbiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmlsbCB0aGUgZ2FpbiBhcnJheSBmb3IgdGhlIHRpbWVkb21haW4gcXVhbnRpemF0aW9uLgorICoKKyAqIEBwYXJhbSBnYiAgICAgICAgICBwb2ludGVyIHRvIHRoZSBHZXRCaXRDb250ZXh0CisgKiBAcGFyYW0gZ2FpbmluZm8gICAgYXJyYXlbOV0gb2YgZ2FpbiBpbmRleGVzCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9nYWluX2luZm8oR2V0Qml0Q29udGV4dCAqZ2IsIGludCAqZ2FpbmluZm8pCit7CisgICAgaW50IGksIG47CisKKyAgICBuID0gZ2V0X3VuYXJ5KGdiLCAwLCBnZXRfYml0c19sZWZ0KGdiKSk7ICAgICAvLyBhbW91bnQgb2YgZWxlbWVudHMqMiB0byB1cGRhdGUKKworICAgIGkgPSAwOworICAgIHdoaWxlIChuLS0pIHsKKyAgICAgICAgaW50IGluZGV4ID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICBpbnQgZ2FpbiA9IGdldF9iaXRzMShnYikgPyBnZXRfYml0cyhnYiwgNCkgLSA3IDogLTE7CisKKyAgICAgICAgd2hpbGUgKGkgPD0gaW5kZXgpCisgICAgICAgICAgICBnYWluaW5mb1tpKytdID0gZ2FpbjsKKyAgICB9CisgICAgd2hpbGUgKGkgPD0gOCkKKyAgICAgICAgZ2FpbmluZm9baSsrXSA9IDA7Cit9CisKKy8qKgorICogQ3JlYXRlIHRoZSBxdWFudCBpbmRleCB0YWJsZSBuZWVkZWQgZm9yIHRoZSBlbnZlbG9wZS4KKyAqCisgKiBAcGFyYW0gcSAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQ09PS0NvbnRleHQKKyAqIEBwYXJhbSBxdWFudF9pbmRleF90YWJsZSBwb2ludGVyIHRvIHRoZSBhcnJheQorICovCitzdGF0aWMgaW50IGRlY29kZV9lbnZlbG9wZShDT09LQ29udGV4dCAqcSwgQ09PS1N1YnBhY2tldCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcXVhbnRfaW5kZXhfdGFibGUpCit7CisgICAgaW50IGksIGosIHZsY19pbmRleDsKKworICAgIHF1YW50X2luZGV4X3RhYmxlWzBdID0gZ2V0X2JpdHMoJnEtPmdiLCA2KSAtIDY7IC8vIFRoaXMgaXMgdXNlZCBsYXRlciBpbiBjYXRlZ29yaXplCisKKyAgICBmb3IgKGkgPSAxOyBpIDwgcC0+dG90YWxfc3ViYmFuZHM7IGkrKykgeworICAgICAgICB2bGNfaW5kZXggPSBpOworICAgICAgICBpZiAoaSA+PSBwLT5qc19zdWJiYW5kX3N0YXJ0ICogMikgeworICAgICAgICAgICAgdmxjX2luZGV4IC09IHAtPmpzX3N1YmJhbmRfc3RhcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2bGNfaW5kZXggLz0gMjsKKyAgICAgICAgICAgIGlmICh2bGNfaW5kZXggPCAxKQorICAgICAgICAgICAgICAgIHZsY19pbmRleCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZsY19pbmRleCA+IDEzKQorICAgICAgICAgICAgdmxjX2luZGV4ID0gMTM7IC8vIHRoZSBWTEMgdGFibGVzID4xMyBhcmUgaWRlbnRpY2FsIHRvIE5vLiAxMworCisgICAgICAgIGogPSBnZXRfdmxjMigmcS0+Z2IsIHEtPmVudmVsb3BlX3F1YW50X2luZGV4W3ZsY19pbmRleCAtIDFdLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgcS0+ZW52ZWxvcGVfcXVhbnRfaW5kZXhbdmxjX2luZGV4IC0gMV0uYml0cywgMik7CisgICAgICAgIHF1YW50X2luZGV4X3RhYmxlW2ldID0gcXVhbnRfaW5kZXhfdGFibGVbaSAtIDFdICsgaiAtIDEyOyAvLyBkaWZmZXJlbnRpYWwgZW5jb2RpbmcKKyAgICAgICAgaWYgKHF1YW50X2luZGV4X3RhYmxlW2ldID4gNjMgfHwgcXVhbnRfaW5kZXhfdGFibGVbaV0gPCAtNjMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhxLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHF1YW50aXplciAlZCBhdCBwb3NpdGlvbiAlZCwgb3V0c2lkZSBbLTYzLCA2M10gcmFuZ2VcbiIsCisgICAgICAgICAgICAgICAgICAgcXVhbnRfaW5kZXhfdGFibGVbaV0sIGkpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIGNhdGVnb3J5IGFuZCBjYXRlZ29yeV9pbmRleCB2ZWN0b3IuCisgKgorICogQHBhcmFtIHEgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBDT09LQ29udGV4dAorICogQHBhcmFtIHF1YW50X2luZGV4X3RhYmxlICAgICBwb2ludGVyIHRvIHRoZSBhcnJheQorICogQHBhcmFtIGNhdGVnb3J5ICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjYXRlZ29yeSBhcnJheQorICogQHBhcmFtIGNhdGVnb3J5X2luZGV4ICAgICAgICBwb2ludGVyIHRvIHRoZSBjYXRlZ29yeV9pbmRleCBhcnJheQorICovCitzdGF0aWMgdm9pZCBjYXRlZ29yaXplKENPT0tDb250ZXh0ICpxLCBDT09LU3VicGFja2V0ICpwLCBjb25zdCBpbnQgKnF1YW50X2luZGV4X3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNhdGVnb3J5LCBpbnQgKmNhdGVnb3J5X2luZGV4KQoreworICAgIGludCBleHBfaWR4LCBiaWFzLCB0bXBiaWFzMSwgdG1wYmlhczIsIGJpdHNfbGVmdCwgbnVtX2JpdHMsIGluZGV4LCB2LCBpLCBqOworICAgIGludCBleHBfaW5kZXgyWzEwMl0gPSB7IDAgfTsKKyAgICBpbnQgZXhwX2luZGV4MVsxMDJdID0geyAwIH07CisKKyAgICBpbnQgdG1wX2NhdGVnb3JpemVfYXJyYXlbMTI4ICogMl0gPSB7IDAgfTsKKyAgICBpbnQgdG1wX2NhdGVnb3JpemVfYXJyYXkxX2lkeCA9IHAtPm51bXZlY3Rvcl9zaXplOworICAgIGludCB0bXBfY2F0ZWdvcml6ZV9hcnJheTJfaWR4ID0gcC0+bnVtdmVjdG9yX3NpemU7CisKKyAgICBiaXRzX2xlZnQgPSBwLT5iaXRzX3Blcl9zdWJwYWNrZXQgLSBnZXRfYml0c19jb3VudCgmcS0+Z2IpOworCisgICAgaWYgKGJpdHNfbGVmdCA+IHEtPnNhbXBsZXNfcGVyX2NoYW5uZWwpCisgICAgICAgIGJpdHNfbGVmdCA9IHEtPnNhbXBsZXNfcGVyX2NoYW5uZWwgKworICAgICAgICAgICAgICAgICAgICAoKGJpdHNfbGVmdCAtIHEtPnNhbXBsZXNfcGVyX2NoYW5uZWwpICogNSkgLyA4OworCisgICAgYmlhcyA9IC0zMjsKKworICAgIC8qIEVzdGltYXRlIGJpYXMuICovCisgICAgZm9yIChpID0gMzI7IGkgPiAwOyBpID0gaSAvIDIpIHsKKyAgICAgICAgbnVtX2JpdHMgPSAwOworICAgICAgICBpbmRleCAgICA9IDA7CisgICAgICAgIGZvciAoaiA9IHAtPnRvdGFsX3N1YmJhbmRzOyBqID4gMDsgai0tKSB7CisgICAgICAgICAgICBleHBfaWR4ID0gYXZfY2xpcCgoaSAtIHF1YW50X2luZGV4X3RhYmxlW2luZGV4XSArIGJpYXMpIC8gMiwgMCwgNyk7CisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgbnVtX2JpdHMgKz0gZXhwYml0c190YWJbZXhwX2lkeF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bV9iaXRzID49IGJpdHNfbGVmdCAtIDMyKQorICAgICAgICAgICAgYmlhcyArPSBpOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSB0b3RhbCBudW1iZXIgb2YgYml0cy4gKi8KKyAgICBudW1fYml0cyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHAtPnRvdGFsX3N1YmJhbmRzOyBpKyspIHsKKyAgICAgICAgZXhwX2lkeCA9IGF2X2NsaXAoKGJpYXMgLSBxdWFudF9pbmRleF90YWJsZVtpXSkgLyAyLCAwLCA3KTsKKyAgICAgICAgbnVtX2JpdHMgKz0gZXhwYml0c190YWJbZXhwX2lkeF07CisgICAgICAgIGV4cF9pbmRleDFbaV0gPSBleHBfaWR4OworICAgICAgICBleHBfaW5kZXgyW2ldID0gZXhwX2lkeDsKKyAgICB9CisgICAgdG1wYmlhczEgPSB0bXBiaWFzMiA9IG51bV9iaXRzOworCisgICAgZm9yIChqID0gMTsgaiA8IHAtPm51bXZlY3Rvcl9zaXplOyBqKyspIHsKKyAgICAgICAgaWYgKHRtcGJpYXMxICsgdG1wYmlhczIgPiAyICogYml0c19sZWZ0KSB7ICAvKiAtLS0+ICovCisgICAgICAgICAgICBpbnQgbWF4ID0gLTk5OTk5OTsKKyAgICAgICAgICAgIGluZGV4ID0gLTE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcC0+dG90YWxfc3ViYmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChleHBfaW5kZXgxW2ldIDwgNykgeworICAgICAgICAgICAgICAgICAgICB2ID0gKC0yICogZXhwX2luZGV4MVtpXSkgLSBxdWFudF9pbmRleF90YWJsZVtpXSArIGJpYXM7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ID49IG1heCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4ICAgPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdG1wX2NhdGVnb3JpemVfYXJyYXlbdG1wX2NhdGVnb3JpemVfYXJyYXkxX2lkeCsrXSA9IGluZGV4OworICAgICAgICAgICAgdG1wYmlhczEgLT0gZXhwYml0c190YWJbZXhwX2luZGV4MVtpbmRleF1dIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGJpdHNfdGFiW2V4cF9pbmRleDFbaW5kZXhdICsgMV07CisgICAgICAgICAgICArK2V4cF9pbmRleDFbaW5kZXhdOworICAgICAgICB9IGVsc2UgeyAgLyogPC0tLSAqLworICAgICAgICAgICAgaW50IG1pbiA9IDk5OTk5OTsKKyAgICAgICAgICAgIGluZGV4ID0gLTE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcC0+dG90YWxfc3ViYmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChleHBfaW5kZXgyW2ldID4gMCkgeworICAgICAgICAgICAgICAgICAgICB2ID0gKC0yICogZXhwX2luZGV4MltpXSkgLSBxdWFudF9pbmRleF90YWJsZVtpXSArIGJpYXM7CisgICAgICAgICAgICAgICAgICAgIGlmICh2IDwgbWluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW4gICA9IHY7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB0bXBfY2F0ZWdvcml6ZV9hcnJheVstLXRtcF9jYXRlZ29yaXplX2FycmF5Ml9pZHhdID0gaW5kZXg7CisgICAgICAgICAgICB0bXBiaWFzMiAtPSBleHBiaXRzX3RhYltleHBfaW5kZXgyW2luZGV4XV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgZXhwYml0c190YWJbZXhwX2luZGV4MltpbmRleF0gLSAxXTsKKyAgICAgICAgICAgIC0tZXhwX2luZGV4MltpbmRleF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+dG90YWxfc3ViYmFuZHM7IGkrKykKKyAgICAgICAgY2F0ZWdvcnlbaV0gPSBleHBfaW5kZXgyW2ldOworCisgICAgZm9yIChpID0gMDsgaSA8IHAtPm51bXZlY3Rvcl9zaXplIC0gMTsgaSsrKQorICAgICAgICBjYXRlZ29yeV9pbmRleFtpXSA9IHRtcF9jYXRlZ29yaXplX2FycmF5W3RtcF9jYXRlZ29yaXplX2FycmF5Ml9pZHgrK107Cit9CisKKworLyoqCisgKiBFeHBhbmQgdGhlIGNhdGVnb3J5IHZlY3Rvci4KKyAqCisgKiBAcGFyYW0gcSAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIENPT0tDb250ZXh0CisgKiBAcGFyYW0gY2F0ZWdvcnkgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNhdGVnb3J5IGFycmF5CisgKiBAcGFyYW0gY2F0ZWdvcnlfaW5kZXggICAgICAgIHBvaW50ZXIgdG8gdGhlIGNhdGVnb3J5X2luZGV4IGFycmF5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBleHBhbmRfY2F0ZWdvcnkoQ09PS0NvbnRleHQgKnEsIGludCAqY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY2F0ZWdvcnlfaW5kZXgpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHEtPm51bV92ZWN0b3JzOyBpKyspCisgICAgeworICAgICAgICBpbnQgaWR4ID0gY2F0ZWdvcnlfaW5kZXhbaV07CisgICAgICAgIGlmICgrK2NhdGVnb3J5W2lkeF0gPj0gRkZfQVJSQVlfRUxFTVMoZGl0aGVyX3RhYikpCisgICAgICAgICAgICAtLWNhdGVnb3J5W2lkeF07CisgICAgfQorfQorCisvKioKKyAqIFRoZSByZWFsIHJlcXVhbnRpemF0aW9uIG9mIHRoZSBtbHRjb2VmcworICoKKyAqIEBwYXJhbSBxICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQ09PS0NvbnRleHQKKyAqIEBwYXJhbSBpbmRleCAgICAgICAgICAgICAgICAgaW5kZXgKKyAqIEBwYXJhbSBxdWFudF9pbmRleCAgICAgICAgICAgcXVhbnRpc2F0aW9uIGluZGV4CisgKiBAcGFyYW0gc3ViYmFuZF9jb2VmX2luZGV4ICAgIGFycmF5IG9mIGluZGV4ZXMgdG8gcXVhbnRfY2VudHJvaWRfdGFiCisgKiBAcGFyYW0gc3ViYmFuZF9jb2VmX3NpZ24gICAgIHNpZ25zIG9mIGNvZWZmaWNpZW50cworICogQHBhcmFtIG1sdF9wICAgICAgICAgICAgICAgICBwb2ludGVyIGludG8gdGhlIG1sdCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgc2NhbGFyX2RlcXVhbnRfZmxvYXQoQ09PS0NvbnRleHQgKnEsIGludCBpbmRleCwgaW50IHF1YW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzdWJiYW5kX2NvZWZfaW5kZXgsIGludCAqc3ViYmFuZF9jb2VmX3NpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbWx0X3ApCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgZjE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgU1VCQkFORF9TSVpFOyBpKyspIHsKKyAgICAgICAgaWYgKHN1YmJhbmRfY29lZl9pbmRleFtpXSkgeworICAgICAgICAgICAgZjEgPSBxdWFudF9jZW50cm9pZF90YWJbaW5kZXhdW3N1YmJhbmRfY29lZl9pbmRleFtpXV07CisgICAgICAgICAgICBpZiAoc3ViYmFuZF9jb2VmX3NpZ25baV0pCisgICAgICAgICAgICAgICAgZjEgPSAtZjE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBub2lzZSBjb2RpbmcgaWYgc3ViYmFuZF9jb2VmX2luZGV4W2ldID09IDAgKi8KKyAgICAgICAgICAgIGYxID0gZGl0aGVyX3RhYltpbmRleF07CisgICAgICAgICAgICBpZiAoYXZfbGZnX2dldCgmcS0+cmFuZG9tX3N0YXRlKSA8IDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgZjEgPSAtZjE7CisgICAgICAgIH0KKyAgICAgICAgbWx0X3BbaV0gPSBmMSAqIHJvb3Rwb3cydGFiW3F1YW50X2luZGV4ICsgNjNdOworICAgIH0KK30KKy8qKgorICogVW5wYWNrIHRoZSBzdWJiYW5kX2NvZWZfaW5kZXggYW5kIHN1YmJhbmRfY29lZl9zaWduIHZlY3RvcnMuCisgKgorICogQHBhcmFtIHEgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBDT09LQ29udGV4dAorICogQHBhcmFtIGNhdGVnb3J5ICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjYXRlZ29yeSBhcnJheQorICogQHBhcmFtIHN1YmJhbmRfY29lZl9pbmRleCAgICBhcnJheSBvZiBpbmRleGVzIHRvIHF1YW50X2NlbnRyb2lkX3RhYgorICogQHBhcmFtIHN1YmJhbmRfY29lZl9zaWduICAgICBzaWducyBvZiBjb2VmZmljaWVudHMKKyAqLworc3RhdGljIGludCB1bnBhY2tfU1FWSChDT09LQ29udGV4dCAqcSwgQ09PS1N1YnBhY2tldCAqcCwgaW50IGNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnN1YmJhbmRfY29lZl9pbmRleCwgaW50ICpzdWJiYW5kX2NvZWZfc2lnbikKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgdmxjLCB2ZCwgdG1wLCByZXN1bHQ7CisKKyAgICB2ZCA9IHZkX3RhYltjYXRlZ29yeV07CisgICAgcmVzdWx0ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdnByX3RhYltjYXRlZ29yeV07IGkrKykgeworICAgICAgICB2bGMgPSBnZXRfdmxjMigmcS0+Z2IsIHEtPnNxdmhbY2F0ZWdvcnldLnRhYmxlLCBxLT5zcXZoW2NhdGVnb3J5XS5iaXRzLCAzKTsKKyAgICAgICAgaWYgKHAtPmJpdHNfcGVyX3N1YnBhY2tldCA8IGdldF9iaXRzX2NvdW50KCZxLT5nYikpIHsKKyAgICAgICAgICAgIHZsYyA9IDA7CisgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IHZkIC0gMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgIHRtcCA9ICh2bGMgKiBpbnZyYWRpeF90YWJbY2F0ZWdvcnldKSAvIDB4MTAwMDAwOworICAgICAgICAgICAgc3ViYmFuZF9jb2VmX2luZGV4W3ZkICogaSArIGpdID0gdmxjIC0gdG1wICogKGttYXhfdGFiW2NhdGVnb3J5XSArIDEpOworICAgICAgICAgICAgdmxjID0gdG1wOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB2ZDsgaisrKSB7CisgICAgICAgICAgICBpZiAoc3ViYmFuZF9jb2VmX2luZGV4W2kgKiB2ZCArIGpdKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2NvdW50KCZxLT5nYikgPCBwLT5iaXRzX3Blcl9zdWJwYWNrZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ViYmFuZF9jb2VmX3NpZ25baSAqIHZkICsgal0gPSBnZXRfYml0czEoJnEtPmdiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgICAgICBzdWJiYW5kX2NvZWZfc2lnbltpICogdmQgKyBqXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdWJiYW5kX2NvZWZfc2lnbltpICogdmQgKyBqXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIEZpbGwgdGhlIG1sdF9idWZmZXIgd2l0aCBtbHQgY29lZmZpY2llbnRzLgorICoKKyAqIEBwYXJhbSBxICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBDT09LQ29udGV4dAorICogQHBhcmFtIGNhdGVnb3J5ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNhdGVnb3J5IGFycmF5CisgKiBAcGFyYW0gcXVhbnRfaW5kZXhfdGFibGUgcG9pbnRlciB0byB0aGUgYXJyYXkKKyAqIEBwYXJhbSBtbHRfYnVmZmVyICAgICAgICBwb2ludGVyIHRvIG1sdCBjb2VmZmljaWVudHMKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX3ZlY3RvcnMoQ09PS0NvbnRleHQgKnEsIENPT0tTdWJwYWNrZXQgKnAsIGludCAqY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnF1YW50X2luZGV4X3RhYmxlLCBmbG9hdCAqbWx0X2J1ZmZlcikKK3sKKyAgICAvKiBBIHplcm8gaW4gdGhpcyB0YWJsZSBtZWFucyB0aGF0IHRoZSBzdWJiYW5kIGNvZWZmaWNpZW50IGlzCisgICAgICAgcmFuZG9tIG5vaXNlIGNvZGVkLiAqLworICAgIGludCBzdWJiYW5kX2NvZWZfaW5kZXhbU1VCQkFORF9TSVpFXTsKKyAgICAvKiBBIHplcm8gaW4gdGhpcyB0YWJsZSBtZWFucyB0aGF0IHRoZSBzdWJiYW5kIGNvZWZmaWNpZW50IGlzIGEKKyAgICAgICBwb3NpdGl2ZSBtdWx0aXBsaWNhdG9yLiAqLworICAgIGludCBzdWJiYW5kX2NvZWZfc2lnbltTVUJCQU5EX1NJWkVdOworICAgIGludCBiYW5kLCBqOworICAgIGludCBpbmRleCA9IDA7CisKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgcC0+dG90YWxfc3ViYmFuZHM7IGJhbmQrKykgeworICAgICAgICBpbmRleCA9IGNhdGVnb3J5W2JhbmRdOworICAgICAgICBpZiAoY2F0ZWdvcnlbYmFuZF0gPCA3KSB7CisgICAgICAgICAgICBpZiAodW5wYWNrX1NRVkgocSwgcCwgY2F0ZWdvcnlbYmFuZF0sIHN1YmJhbmRfY29lZl9pbmRleCwgc3ViYmFuZF9jb2VmX3NpZ24pKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSA3OworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwLT50b3RhbF9zdWJiYW5kczsgaisrKQorICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeVtiYW5kICsgal0gPSA3OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbmRleCA+PSA3KSB7CisgICAgICAgICAgICBtZW1zZXQoc3ViYmFuZF9jb2VmX2luZGV4LCAwLCBzaXplb2Yoc3ViYmFuZF9jb2VmX2luZGV4KSk7CisgICAgICAgICAgICBtZW1zZXQoc3ViYmFuZF9jb2VmX3NpZ24sICAwLCBzaXplb2Yoc3ViYmFuZF9jb2VmX3NpZ24pKTsKKyAgICAgICAgfQorICAgICAgICBxLT5zY2FsYXJfZGVxdWFudChxLCBpbmRleCwgcXVhbnRfaW5kZXhfdGFibGVbYmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmJhbmRfY29lZl9pbmRleCwgc3ViYmFuZF9jb2VmX3NpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtbHRfYnVmZmVyW2JhbmQgKiBTVUJCQU5EX1NJWkVdKTsKKyAgICB9CisKKyAgICAvKiBGSVhNRTogc2hvdWxkIHRoaXMgYmUgcmVtb3ZlZCwgb3IgbW92ZWQgaW50byBsb29wIGFib3ZlPyAqLworICAgIGlmIChwLT50b3RhbF9zdWJiYW5kcyAqIFNVQkJBTkRfU0laRSA+PSBxLT5zYW1wbGVzX3Blcl9jaGFubmVsKQorICAgICAgICByZXR1cm47Cit9CisKKworc3RhdGljIGludCBtb25vX2RlY29kZShDT09LQ29udGV4dCAqcSwgQ09PS1N1YnBhY2tldCAqcCwgZmxvYXQgKm1sdF9idWZmZXIpCit7CisgICAgaW50IGNhdGVnb3J5X2luZGV4WzEyOF0gPSB7IDAgfTsKKyAgICBpbnQgY2F0ZWdvcnlbMTI4XSAgICAgICA9IHsgMCB9OworICAgIGludCBxdWFudF9pbmRleF90YWJsZVsxMDJdOworICAgIGludCByZXMsIGk7CisKKyAgICBpZiAoKHJlcyA9IGRlY29kZV9lbnZlbG9wZShxLCBwLCBxdWFudF9pbmRleF90YWJsZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBxLT5udW1fdmVjdG9ycyA9IGdldF9iaXRzKCZxLT5nYiwgcC0+bG9nMl9udW12ZWN0b3Jfc2l6ZSk7CisgICAgY2F0ZWdvcml6ZShxLCBwLCBxdWFudF9pbmRleF90YWJsZSwgY2F0ZWdvcnksIGNhdGVnb3J5X2luZGV4KTsKKyAgICBleHBhbmRfY2F0ZWdvcnkocSwgY2F0ZWdvcnksIGNhdGVnb3J5X2luZGV4KTsKKyAgICBmb3IgKGk9MDsgaTxwLT50b3RhbF9zdWJiYW5kczsgaSsrKSB7CisgICAgICAgIGlmIChjYXRlZ29yeVtpXSA+IDcpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZGVjb2RlX3ZlY3RvcnMocSwgcCwgY2F0ZWdvcnksIHF1YW50X2luZGV4X3RhYmxlLCBtbHRfYnVmZmVyKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogdGhlIGFjdHVhbCByZXF1YW50aXphdGlvbiBvZiB0aGUgdGltZWRvbWFpbiBzYW1wbGVzCisgKgorICogQHBhcmFtIHEgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIENPT0tDb250ZXh0CisgKiBAcGFyYW0gYnVmZmVyICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgdGltZWRvbWFpbiBidWZmZXIKKyAqIEBwYXJhbSBnYWluX2luZGV4ICAgICAgICBpbmRleCBmb3IgdGhlIGJsb2NrIG11bHRpcGxpZXIKKyAqIEBwYXJhbSBnYWluX2luZGV4X25leHQgICBpbmRleCBmb3IgdGhlIG5leHQgYmxvY2sgbXVsdGlwbGllcgorICovCitzdGF0aWMgdm9pZCBpbnRlcnBvbGF0ZV9mbG9hdChDT09LQ29udGV4dCAqcSwgZmxvYXQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnYWluX2luZGV4LCBpbnQgZ2Fpbl9pbmRleF9uZXh0KQoreworICAgIGludCBpOworICAgIGZsb2F0IGZjMSwgZmMyOworICAgIGZjMSA9IHBvdzJ0YWJbZ2Fpbl9pbmRleCArIDYzXTsKKworICAgIGlmIChnYWluX2luZGV4ID09IGdhaW5faW5kZXhfbmV4dCkgeyAgICAgICAgICAgICAvLyBzdGF0aWMgZ2FpbgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcS0+Z2Fpbl9zaXplX2ZhY3RvcjsgaSsrKQorICAgICAgICAgICAgYnVmZmVyW2ldICo9IGZjMTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbW9vdGggZ2FpbgorICAgICAgICBmYzIgPSBxLT5nYWluX3RhYmxlWzExICsgKGdhaW5faW5kZXhfbmV4dCAtIGdhaW5faW5kZXgpXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHEtPmdhaW5fc2l6ZV9mYWN0b3I7IGkrKykgeworICAgICAgICAgICAgYnVmZmVyW2ldICo9IGZjMTsKKyAgICAgICAgICAgIGZjMSAgICAgICAqPSBmYzI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogQXBwbHkgdHJhbnNmb3JtIHdpbmRvdywgb3ZlcmxhcCBidWZmZXJzLgorICoKKyAqIEBwYXJhbSBxICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBDT09LQ29udGV4dAorICogQHBhcmFtIGluYnVmZmVyICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1sdGNvZWZmaWNpZW50cworICogQHBhcmFtIGdhaW5zX3B0ciAgICAgICAgIGN1cnJlbnQgYW5kIHByZXZpb3VzIGdhaW5zCisgKiBAcGFyYW0gcHJldmlvdXNfYnVmZmVyICAgcG9pbnRlciB0byB0aGUgcHJldmlvdXMgYnVmZmVyIHRvIGJlIHVzZWQgZm9yIG92ZXJsYXBwaW5nCisgKi8KK3N0YXRpYyB2b2lkIGltbHRfd2luZG93X2Zsb2F0KENPT0tDb250ZXh0ICpxLCBmbG9hdCAqaW5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rX2dhaW5zICpnYWluc19wdHIsIGZsb2F0ICpwcmV2aW91c19idWZmZXIpCit7CisgICAgY29uc3QgZmxvYXQgZmMgPSBwb3cydGFiW2dhaW5zX3B0ci0+cHJldmlvdXNbMF0gKyA2M107CisgICAgaW50IGk7CisgICAgLyogVGhlIHdlaXJkIHRoaW5nIGhlcmUsIGlzIHRoYXQgdGhlIHR3byBoYWx2ZXMgb2YgdGhlIHRpbWUgZG9tYWluCisgICAgICogYnVmZmVyIGFyZSBzd2FwcGVkLiBBbHNvLCB0aGUgbmV3ZXN0IGRhdGEsIHRoYXQgd2Ugc2F2ZSBhd2F5IGZvcgorICAgICAqIG5leHQgZnJhbWUsIGhhcyB0aGUgd3Jvbmcgc2lnbi4gSGVuY2UgdGhlIHN1YnRyYWN0aW9uIGJlbG93LgorICAgICAqIEFsbW9zdCBzb3VuZHMgbGlrZSBhIGNvbXBsZXggY29uanVnYXRlL3JldmVyc2UgZGF0YS9GRlQgZWZmZWN0LgorICAgICAqLworCisgICAgLyogQXBwbHkgd2luZG93IGFuZCBvdmVybGFwICovCisgICAgZm9yIChpID0gMDsgaSA8IHEtPnNhbXBsZXNfcGVyX2NoYW5uZWw7IGkrKykKKyAgICAgICAgaW5idWZmZXJbaV0gPSBpbmJ1ZmZlcltpXSAqIGZjICogcS0+bWx0X3dpbmRvd1tpXSAtCisgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfYnVmZmVyW2ldICogcS0+bWx0X3dpbmRvd1txLT5zYW1wbGVzX3Blcl9jaGFubmVsIC0gMSAtIGldOworfQorCisvKioKKyAqIFRoZSBtb2R1bGF0ZWQgbGFwcGVkIHRyYW5zZm9ybSwgdGhpcyB0YWtlcyB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCisgKiBhbmQgdHJhbnNmb3JtcyB0aGVtIGludG8gdGltZWRvbWFpbiBzYW1wbGVzLgorICogQXBwbHkgdHJhbnNmb3JtIHdpbmRvdywgb3ZlcmxhcCBidWZmZXJzLCBhcHBseSBnYWluIHByb2ZpbGUKKyAqIGFuZCBidWZmZXIgbWFuYWdlbWVudC4KKyAqCisgKiBAcGFyYW0gcSAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQ09PS0NvbnRleHQKKyAqIEBwYXJhbSBpbmJ1ZmZlciAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtbHRjb2VmZmljaWVudHMKKyAqIEBwYXJhbSBnYWluc19wdHIgICAgICAgICBjdXJyZW50IGFuZCBwcmV2aW91cyBnYWlucworICogQHBhcmFtIHByZXZpb3VzX2J1ZmZlciAgIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIGJ1ZmZlciB0byBiZSB1c2VkIGZvciBvdmVybGFwcGluZworICovCitzdGF0aWMgdm9pZCBpbWx0X2dhaW4oQ09PS0NvbnRleHQgKnEsIGZsb2F0ICppbmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICBjb29rX2dhaW5zICpnYWluc19wdHIsIGZsb2F0ICpwcmV2aW91c19idWZmZXIpCit7CisgICAgZmxvYXQgKmJ1ZmZlcjAgPSBxLT5tb25vX21kY3Rfb3V0cHV0OworICAgIGZsb2F0ICpidWZmZXIxID0gcS0+bW9ub19tZGN0X291dHB1dCArIHEtPnNhbXBsZXNfcGVyX2NoYW5uZWw7CisgICAgaW50IGk7CisKKyAgICAvKiBJbnZlcnNlIG1vZGlmaWVkIGRpc2NyZXRlIGNvc2luZSB0cmFuc2Zvcm0gKi8KKyAgICBxLT5tZGN0X2N0eC5pbWRjdF9jYWxjKCZxLT5tZGN0X2N0eCwgcS0+bW9ub19tZGN0X291dHB1dCwgaW5idWZmZXIpOworCisgICAgcS0+aW1sdF93aW5kb3cocSwgYnVmZmVyMSwgZ2FpbnNfcHRyLCBwcmV2aW91c19idWZmZXIpOworCisgICAgLyogQXBwbHkgZ2FpbiBwcm9maWxlICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgaWYgKGdhaW5zX3B0ci0+bm93W2ldIHx8IGdhaW5zX3B0ci0+bm93W2kgKyAxXSkKKyAgICAgICAgICAgIHEtPmludGVycG9sYXRlKHEsICZidWZmZXIxW3EtPmdhaW5fc2l6ZV9mYWN0b3IgKiBpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5zX3B0ci0+bm93W2ldLCBnYWluc19wdHItPm5vd1tpICsgMV0pOworCisgICAgLyogU2F2ZSBhd2F5IHRoZSBjdXJyZW50IHRvIGJlIHByZXZpb3VzIGJsb2NrLiAqLworICAgIG1lbWNweShwcmV2aW91c19idWZmZXIsIGJ1ZmZlcjAsCisgICAgICAgICAgIHEtPnNhbXBsZXNfcGVyX2NoYW5uZWwgKiBzaXplb2YoKnByZXZpb3VzX2J1ZmZlcikpOworfQorCisKKy8qKgorICogZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIGpvaW50c3RlcmVvIGNvdXBsaW5nIGluZm9ybWF0aW9uCisgKgorICogQHBhcmFtIHEgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIENPT0tDb250ZXh0CisgKiBAcGFyYW0gZGVjb3VwbGVfdGFiICAgICAgZGVjb3VwbGluZyBhcnJheQorICovCitzdGF0aWMgaW50IGRlY291cGxlX2luZm8oQ09PS0NvbnRleHQgKnEsIENPT0tTdWJwYWNrZXQgKnAsIGludCAqZGVjb3VwbGVfdGFiKQoreworICAgIGludCBpOworICAgIGludCB2bGMgICAgPSBnZXRfYml0czEoJnEtPmdiKTsKKyAgICBpbnQgc3RhcnQgID0gY3BsYmFuZFtwLT5qc19zdWJiYW5kX3N0YXJ0XTsKKyAgICBpbnQgZW5kICAgID0gY3BsYmFuZFtwLT5zdWJiYW5kcyAtIDFdOworICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydCArIDE7CisKKyAgICBpZiAoc3RhcnQgPiBlbmQpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHZsYykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICAgICAgZGVjb3VwbGVfdGFiW3N0YXJ0ICsgaV0gPSBnZXRfdmxjMigmcS0+Z2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmNoYW5uZWxfY291cGxpbmcudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmNoYW5uZWxfY291cGxpbmcuYml0cywgMik7CisgICAgZWxzZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCB2ID0gZ2V0X2JpdHMoJnEtPmdiLCBwLT5qc192bGNfYml0cyk7CisgICAgICAgICAgICBpZiAodiA9PSAoMTw8cC0+anNfdmxjX2JpdHMpLTEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocS0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRlY291cGxlIHZhbHVlIHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWNvdXBsZV90YWJbc3RhcnQgKyBpXSA9IHY7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBmdW5jdGlvbiBkZWNvdXBsZXMgYSBwYWlyIG9mIHNpZ25hbHMgZnJvbSBhIHNpbmdsZSBzaWduYWwgdmlhIG11bHRpcGxpY2F0aW9uLgorICoKKyAqIEBwYXJhbSBxICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBDT09LQ29udGV4dAorICogQHBhcmFtIHN1YmJhbmQgICAgICAgICAgIGluZGV4IG9mIHRoZSBjdXJyZW50IHN1YmJhbmQKKyAqIEBwYXJhbSBmMSAgICAgICAgICAgICAgICBtdWx0aXBsaWVyIGZvciBjaGFubmVsIDEgZXh0cmFjdGlvbgorICogQHBhcmFtIGYyICAgICAgICAgICAgICAgIG11bHRpcGxpZXIgZm9yIGNoYW5uZWwgMiBleHRyYWN0aW9uCisgKiBAcGFyYW0gZGVjb2RlX2J1ZmZlciAgICAgaW5wdXQgYnVmZmVyCisgKiBAcGFyYW0gbWx0X2J1ZmZlcjEgICAgICAgcG9pbnRlciB0byBsZWZ0IGNoYW5uZWwgbWx0IGNvZWZmaWNpZW50cworICogQHBhcmFtIG1sdF9idWZmZXIyICAgICAgIHBvaW50ZXIgdG8gcmlnaHQgY2hhbm5lbCBtbHQgY29lZmZpY2llbnRzCisgKi8KK3N0YXRpYyB2b2lkIGRlY291cGxlX2Zsb2F0KENPT0tDb250ZXh0ICpxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09PS1N1YnBhY2tldCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZjEsIGZsb2F0IGYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlY29kZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbWx0X2J1ZmZlcjEsIGZsb2F0ICptbHRfYnVmZmVyMikKK3sKKyAgICBpbnQgaiwgdG1wX2lkeDsKKyAgICBmb3IgKGogPSAwOyBqIDwgU1VCQkFORF9TSVpFOyBqKyspIHsKKyAgICAgICAgdG1wX2lkeCA9ICgocC0+anNfc3ViYmFuZF9zdGFydCArIHN1YmJhbmQpICogU1VCQkFORF9TSVpFKSArIGo7CisgICAgICAgIG1sdF9idWZmZXIxW1NVQkJBTkRfU0laRSAqIHN1YmJhbmQgKyBqXSA9IGYxICogZGVjb2RlX2J1ZmZlclt0bXBfaWR4XTsKKyAgICAgICAgbWx0X2J1ZmZlcjJbU1VCQkFORF9TSVpFICogc3ViYmFuZCArIGpdID0gZjIgKiBkZWNvZGVfYnVmZmVyW3RtcF9pZHhdOworICAgIH0KK30KKworLyoqCisgKiBmdW5jdGlvbiBmb3IgZGVjb2Rpbmcgam9pbnQgc3RlcmVvIGRhdGEKKyAqCisgKiBAcGFyYW0gcSAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQ09PS0NvbnRleHQKKyAqIEBwYXJhbSBtbHRfYnVmZmVyMSAgICAgICBwb2ludGVyIHRvIGxlZnQgY2hhbm5lbCBtbHQgY29lZmZpY2llbnRzCisgKiBAcGFyYW0gbWx0X2J1ZmZlcjIgICAgICAgcG9pbnRlciB0byByaWdodCBjaGFubmVsIG1sdCBjb2VmZmljaWVudHMKKyAqLworc3RhdGljIGludCBqb2ludF9kZWNvZGUoQ09PS0NvbnRleHQgKnEsIENPT0tTdWJwYWNrZXQgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbWx0X2J1ZmZlcl9sZWZ0LCBmbG9hdCAqbWx0X2J1ZmZlcl9yaWdodCkKK3sKKyAgICBpbnQgaSwgaiwgcmVzOworICAgIGludCBkZWNvdXBsZV90YWJbU1VCQkFORF9TSVpFXSA9IHsgMCB9OworICAgIGZsb2F0ICpkZWNvZGVfYnVmZmVyID0gcS0+ZGVjb2RlX2J1ZmZlcl8wOworICAgIGludCBpZHgsIGNwbF90bXA7CisgICAgZmxvYXQgZjEsIGYyOworICAgIGNvbnN0IGZsb2F0ICpjcGxzY2FsZTsKKworICAgIG1lbXNldChkZWNvZGVfYnVmZmVyLCAwLCBzaXplb2YocS0+ZGVjb2RlX2J1ZmZlcl8wKSk7CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlIGJ1ZmZlcnMgYXJlIHplcm9lZCBvdXQuICovCisgICAgbWVtc2V0KG1sdF9idWZmZXJfbGVmdCwgIDAsIDEwMjQgKiBzaXplb2YoKm1sdF9idWZmZXJfbGVmdCkpOworICAgIG1lbXNldChtbHRfYnVmZmVyX3JpZ2h0LCAwLCAxMDI0ICogc2l6ZW9mKCptbHRfYnVmZmVyX3JpZ2h0KSk7CisgICAgaWYgKChyZXMgPSBkZWNvdXBsZV9pbmZvKHEsIHAsIGRlY291cGxlX3RhYikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBpZiAoKHJlcyA9IG1vbm9fZGVjb2RlKHEsIHAsIGRlY29kZV9idWZmZXIpKSA8IDApCisgICAgICAgIHJldHVybiByZXM7CisgICAgLyogVGhlIHR3byBjaGFubmVscyBhcmUgc3RvcmVkIGludGVybGVhdmVkIGluIGRlY29kZV9idWZmZXIuICovCisgICAgZm9yIChpID0gMDsgaSA8IHAtPmpzX3N1YmJhbmRfc3RhcnQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgU1VCQkFORF9TSVpFOyBqKyspIHsKKyAgICAgICAgICAgIG1sdF9idWZmZXJfbGVmdFtpICAqIDIwICsgal0gPSBkZWNvZGVfYnVmZmVyW2kgKiA0MCArIGpdOworICAgICAgICAgICAgbWx0X2J1ZmZlcl9yaWdodFtpICogMjAgKyBqXSA9IGRlY29kZV9idWZmZXJbaSAqIDQwICsgMjAgKyBqXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFdoZW4gd2UgcmVhY2gganNfc3ViYmFuZF9zdGFydCAodGhlIGhpZ2hlciBmcmVxdWVuY2llcykKKyAgICAgICB0aGUgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgaW4gYSBjb3VwbGluZyBzY2hlbWUuICovCisgICAgaWR4ID0gKDEgPDwgcC0+anNfdmxjX2JpdHMpIC0gMTsKKyAgICBmb3IgKGkgPSBwLT5qc19zdWJiYW5kX3N0YXJ0OyBpIDwgcC0+c3ViYmFuZHM7IGkrKykgeworICAgICAgICBjcGxfdG1wID0gY3BsYmFuZFtpXTsKKyAgICAgICAgaWR4IC09IGRlY291cGxlX3RhYltjcGxfdG1wXTsKKyAgICAgICAgY3Bsc2NhbGUgPSBxLT5jcGxzY2FsZXNbcC0+anNfdmxjX2JpdHMgLSAyXTsgIC8vIGNob29zZSBkZWNvdXBsZXIgdGFibGUKKyAgICAgICAgZjEgPSBjcGxzY2FsZVtkZWNvdXBsZV90YWJbY3BsX3RtcF0gKyAxXTsKKyAgICAgICAgZjIgPSBjcGxzY2FsZVtpZHhdOworICAgICAgICBxLT5kZWNvdXBsZShxLCBwLCBpLCBmMSwgZjIsIGRlY29kZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgIG1sdF9idWZmZXJfbGVmdCwgbWx0X2J1ZmZlcl9yaWdodCk7CisgICAgICAgIGlkeCA9ICgxIDw8IHAtPmpzX3ZsY19iaXRzKSAtIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmlyc3QgcGFydCBvZiBzdWJwYWNrZXQgZGVjb2Rpbmc6CisgKiAgZGVjb2RlIHJhdyBzdHJlYW0gYnl0ZXMgYW5kIHJlYWQgZ2FpbiBpbmZvLgorICoKKyAqIEBwYXJhbSBxICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBDT09LQ29udGV4dAorICogQHBhcmFtIGluYnVmZmVyICAgICAgICAgIHBvaW50ZXIgdG8gcmF3IHN0cmVhbSBkYXRhCisgKiBAcGFyYW0gZ2FpbnNfcHRyICAgICAgICAgYXJyYXkgb2YgY3VycmVudC9wcmV2IGdhaW4gcG9pbnRlcnMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRlY29kZV9ieXRlc19hbmRfZ2FpbihDT09LQ29udGV4dCAqcSwgQ09PS1N1YnBhY2tldCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tfZ2FpbnMgKmdhaW5zX3B0cikKK3sKKyAgICBpbnQgb2Zmc2V0OworCisgICAgb2Zmc2V0ID0gZGVjb2RlX2J5dGVzKGluYnVmZmVyLCBxLT5kZWNvZGVkX2J5dGVzX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Yml0c19wZXJfc3VicGFja2V0IC8gOCk7CisgICAgaW5pdF9nZXRfYml0cygmcS0+Z2IsIHEtPmRlY29kZWRfYnl0ZXNfYnVmZmVyICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgcC0+Yml0c19wZXJfc3VicGFja2V0KTsKKyAgICBkZWNvZGVfZ2Fpbl9pbmZvKCZxLT5nYiwgZ2FpbnNfcHRyLT5ub3cpOworCisgICAgLyogU3dhcCBjdXJyZW50IGFuZCBwcmV2aW91cyBnYWlucyAqLworICAgIEZGU1dBUChpbnQgKiwgZ2FpbnNfcHRyLT5ub3csIGdhaW5zX3B0ci0+cHJldmlvdXMpOworfQorCisvKioKKyAqIFNhdHVyYXRlIHRoZSBvdXRwdXQgc2lnbmFsIGFuZCBpbnRlcmxlYXZlLgorICoKKyAqIEBwYXJhbSBxICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBDT09LQ29udGV4dAorICogQHBhcmFtIG91dCAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCB2ZWN0b3IKKyAqLworc3RhdGljIHZvaWQgc2F0dXJhdGVfb3V0cHV0X2Zsb2F0KENPT0tDb250ZXh0ICpxLCBmbG9hdCAqb3V0KQoreworICAgIHEtPmFkc3AudmVjdG9yX2NsaXBmKG91dCwgcS0+bW9ub19tZGN0X291dHB1dCArIHEtPnNhbXBsZXNfcGVyX2NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMGYsIDEuMGYsIEZGQUxJR04ocS0+c2FtcGxlc19wZXJfY2hhbm5lbCwgOCkpOworfQorCisKKy8qKgorICogRmluYWwgcGFydCBvZiBzdWJwYWNrZXQgZGVjb2Rpbmc6CisgKiAgQXBwbHkgbW9kdWxhdGVkIGxhcHBlZCB0cmFuc2Zvcm0sIGdhaW4gY29tcGVuc2F0aW9uLAorICogIGNsaXAgYW5kIGNvbnZlcnQgdG8gaW50ZWdlci4KKyAqCisgKiBAcGFyYW0gcSAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQ09PS0NvbnRleHQKKyAqIEBwYXJhbSBkZWNvZGVfYnVmZmVyICAgICBwb2ludGVyIHRvIHRoZSBtbHQgY29lZmZpY2llbnRzCisgKiBAcGFyYW0gZ2FpbnNfcHRyICAgICAgICAgYXJyYXkgb2YgY3VycmVudC9wcmV2IGdhaW4gcG9pbnRlcnMKKyAqIEBwYXJhbSBwcmV2aW91c19idWZmZXIgICBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBidWZmZXIgdG8gYmUgdXNlZCBmb3Igb3ZlcmxhcHBpbmcKKyAqIEBwYXJhbSBvdXQgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtbHRfY29tcGVuc2F0ZV9vdXRwdXQoQ09PS0NvbnRleHQgKnEsIGZsb2F0ICpkZWNvZGVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rX2dhaW5zICpnYWluc19wdHIsIGZsb2F0ICpwcmV2aW91c19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXQpCit7CisgICAgaW1sdF9nYWluKHEsIGRlY29kZV9idWZmZXIsIGdhaW5zX3B0ciwgcHJldmlvdXNfYnVmZmVyKTsKKyAgICBpZiAob3V0KQorICAgICAgICBxLT5zYXR1cmF0ZV9vdXRwdXQocSwgb3V0KTsKK30KKworCisvKioKKyAqIENvb2sgc3VicGFja2V0IGRlY29kaW5nLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgb25lIGRlY29kZWQgc3VicGFja2V0LAorICogdXN1YWxseSAxMDI0IHNhbXBsZXMgcGVyIGNoYW5uZWwuCisgKgorICogQHBhcmFtIHEgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIENPT0tDb250ZXh0CisgKiBAcGFyYW0gaW5idWZmZXIgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5idWZmZXIKKyAqIEBwYXJhbSBvdXRidWZmZXIgICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRidWZmZXIKKyAqLworc3RhdGljIGludCBkZWNvZGVfc3VicGFja2V0KENPT0tDb250ZXh0ICpxLCBDT09LU3VicGFja2V0ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluYnVmZmVyLCBmbG9hdCAqKm91dGJ1ZmZlcikKK3sKKyAgICBpbnQgc3ViX3BhY2tldF9zaXplID0gcC0+c2l6ZTsKKyAgICBpbnQgcmVzOworCisgICAgbWVtc2V0KHEtPmRlY29kZV9idWZmZXJfMSwgMCwgc2l6ZW9mKHEtPmRlY29kZV9idWZmZXJfMSkpOworICAgIGRlY29kZV9ieXRlc19hbmRfZ2FpbihxLCBwLCBpbmJ1ZmZlciwgJnAtPmdhaW5zMSk7CisKKyAgICBpZiAocC0+am9pbnRfc3RlcmVvKSB7CisgICAgICAgIGlmICgocmVzID0gam9pbnRfZGVjb2RlKHEsIHAsIHEtPmRlY29kZV9idWZmZXJfMSwgcS0+ZGVjb2RlX2J1ZmZlcl8yKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHJlcyA9IG1vbm9fZGVjb2RlKHEsIHAsIHEtPmRlY29kZV9idWZmZXJfMSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgICAgaWYgKHAtPm51bV9jaGFubmVscyA9PSAyKSB7CisgICAgICAgICAgICBkZWNvZGVfYnl0ZXNfYW5kX2dhaW4ocSwgcCwgaW5idWZmZXIgKyBzdWJfcGFja2V0X3NpemUgLyAyLCAmcC0+Z2FpbnMyKTsKKyAgICAgICAgICAgIGlmICgocmVzID0gbW9ub19kZWNvZGUocSwgcCwgcS0+ZGVjb2RlX2J1ZmZlcl8yKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtbHRfY29tcGVuc2F0ZV9vdXRwdXQocSwgcS0+ZGVjb2RlX2J1ZmZlcl8xLCAmcC0+Z2FpbnMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5tb25vX3ByZXZpb3VzX2J1ZmZlcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJ1ZmZlciA/IG91dGJ1ZmZlcltwLT5jaF9pZHhdIDogTlVMTCk7CisKKyAgICBpZiAocC0+bnVtX2NoYW5uZWxzID09IDIpIHsKKyAgICAgICAgaWYgKHAtPmpvaW50X3N0ZXJlbykKKyAgICAgICAgICAgIG1sdF9jb21wZW5zYXRlX291dHB1dChxLCBxLT5kZWNvZGVfYnVmZmVyXzIsICZwLT5nYWluczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+bW9ub19wcmV2aW91c19idWZmZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJ1ZmZlciA/IG91dGJ1ZmZlcltwLT5jaF9pZHggKyAxXSA6IE5VTEwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtbHRfY29tcGVuc2F0ZV9vdXRwdXQocSwgcS0+ZGVjb2RlX2J1ZmZlcl8yLCAmcC0+Z2FpbnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1vbm9fcHJldmlvdXNfYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRidWZmZXIgPyBvdXRidWZmZXJbcC0+Y2hfaWR4ICsgMV0gOiBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNvb2tfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBDT09LQ29udGV4dCAqcSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZmxvYXQgKipzYW1wbGVzID0gTlVMTDsKKyAgICBpbnQgaSwgcmV0OworICAgIGludCBvZmZzZXQgPSAwOworICAgIGludCBjaGlkeCA9IDA7CisKKyAgICBpZiAoYnVmX3NpemUgPCBhdmN0eC0+YmxvY2tfYWxpZ24pCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgaWYgKHEtPmRpc2NhcmRlZF9wYWNrZXRzID49IDIpIHsKKyAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBxLT5zYW1wbGVzX3Blcl9jaGFubmVsOworICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgc2FtcGxlcyA9IChmbG9hdCAqKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YTsKKyAgICB9CisKKyAgICAvKiBlc3RpbWF0ZSBzdWJwYWNrZXQgc2l6ZXMgKi8KKyAgICBxLT5zdWJwYWNrZXRbMF0uc2l6ZSA9IGF2Y3R4LT5ibG9ja19hbGlnbjsKKworICAgIGZvciAoaSA9IDE7IGkgPCBxLT5udW1fc3VicGFja2V0czsgaSsrKSB7CisgICAgICAgIHEtPnN1YnBhY2tldFtpXS5zaXplID0gMiAqIGJ1ZlthdmN0eC0+YmxvY2tfYWxpZ24gLSBxLT5udW1fc3VicGFja2V0cyArIGldOworICAgICAgICBxLT5zdWJwYWNrZXRbMF0uc2l6ZSAtPSBxLT5zdWJwYWNrZXRbaV0uc2l6ZSArIDE7CisgICAgICAgIGlmIChxLT5zdWJwYWNrZXRbMF0uc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJmcmFtZSBzdWJwYWNrZXQgc2l6ZSB0b3RhbCA+IGF2Y3R4LT5ibG9ja19hbGlnbiFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBkZWNvZGUgc3VwYmFja2V0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBxLT5udW1fc3VicGFja2V0czsgaSsrKSB7CisgICAgICAgIHEtPnN1YnBhY2tldFtpXS5iaXRzX3Blcl9zdWJwYWNrZXQgPSAocS0+c3VicGFja2V0W2ldLnNpemUgKiA4KSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPnN1YnBhY2tldFtpXS5iaXRzX3Blcl9zdWJwZGl2OworICAgICAgICBxLT5zdWJwYWNrZXRbaV0uY2hfaWR4ID0gY2hpZHg7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgInN1YnBhY2tldFslaV0gc2l6ZSAlaSBqcyAlaSAlaSBibG9ja19hbGlnbiAlaVxuIiwKKyAgICAgICAgICAgICAgIGksIHEtPnN1YnBhY2tldFtpXS5zaXplLCBxLT5zdWJwYWNrZXRbaV0uam9pbnRfc3RlcmVvLCBvZmZzZXQsCisgICAgICAgICAgICAgICBhdmN0eC0+YmxvY2tfYWxpZ24pOworCisgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX3N1YnBhY2tldChxLCAmcS0+c3VicGFja2V0W2ldLCBidWYgKyBvZmZzZXQsIHNhbXBsZXMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBvZmZzZXQgKz0gcS0+c3VicGFja2V0W2ldLnNpemU7CisgICAgICAgIGNoaWR4ICs9IHEtPnN1YnBhY2tldFtpXS5udW1fY2hhbm5lbHM7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAic3VicGFja2V0WyVpXSAlaSAlaVxuIiwKKyAgICAgICAgICAgICAgIGksIHEtPnN1YnBhY2tldFtpXS5zaXplICogOCwgZ2V0X2JpdHNfY291bnQoJnEtPmdiKSk7CisgICAgfQorCisgICAgLyogRGlzY2FyZCB0aGUgZmlyc3QgdHdvIGZyYW1lczogbm8gdmFsaWQgYXVkaW8uICovCisgICAgaWYgKHEtPmRpc2NhcmRlZF9wYWNrZXRzIDwgMikgeworICAgICAgICBxLT5kaXNjYXJkZWRfcGFja2V0cysrOworICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgIHJldHVybiBhdmN0eC0+YmxvY2tfYWxpZ247CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGF2Y3R4LT5ibG9ja19hbGlnbjsKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBkdW1wX2Nvb2tfY29udGV4dChDT09LQ29udGV4dCAqcSkKK3sKKyAgICAvL2ludCBpPTA7CisjZGVmaW5lIFBSSU5UKGEsIGIpIGF2X2Rsb2cocS0+YXZjdHgsICIgJXMgPSAlZFxuIiwgYSwgYik7CisgICAgYXZfZGxvZyhxLT5hdmN0eCwgIkNPT0tleHRyYWRhdGFcbiIpOworICAgIGF2X2Rsb2cocS0+YXZjdHgsICJjb29rdmVyc2lvbj0leFxuIiwgcS0+c3VicGFja2V0WzBdLmNvb2t2ZXJzaW9uKTsKKyAgICBpZiAocS0+c3VicGFja2V0WzBdLmNvb2t2ZXJzaW9uID4gU1RFUkVPKSB7CisgICAgICAgIFBSSU5UKCJqc19zdWJiYW5kX3N0YXJ0IiwgcS0+c3VicGFja2V0WzBdLmpzX3N1YmJhbmRfc3RhcnQpOworICAgICAgICBQUklOVCgianNfdmxjX2JpdHMiLCBxLT5zdWJwYWNrZXRbMF0uanNfdmxjX2JpdHMpOworICAgIH0KKyAgICBhdl9kbG9nKHEtPmF2Y3R4LCAiQ09PS0NvbnRleHRcbiIpOworICAgIFBSSU5UKCJuYl9jaGFubmVscyIsIHEtPmF2Y3R4LT5jaGFubmVscyk7CisgICAgUFJJTlQoImJpdF9yYXRlIiwgcS0+YXZjdHgtPmJpdF9yYXRlKTsKKyAgICBQUklOVCgic2FtcGxlX3JhdGUiLCBxLT5hdmN0eC0+c2FtcGxlX3JhdGUpOworICAgIFBSSU5UKCJzYW1wbGVzX3Blcl9jaGFubmVsIiwgcS0+c3VicGFja2V0WzBdLnNhbXBsZXNfcGVyX2NoYW5uZWwpOworICAgIFBSSU5UKCJzdWJiYW5kcyIsIHEtPnN1YnBhY2tldFswXS5zdWJiYW5kcyk7CisgICAgUFJJTlQoImpzX3N1YmJhbmRfc3RhcnQiLCBxLT5zdWJwYWNrZXRbMF0uanNfc3ViYmFuZF9zdGFydCk7CisgICAgUFJJTlQoImxvZzJfbnVtdmVjdG9yX3NpemUiLCBxLT5zdWJwYWNrZXRbMF0ubG9nMl9udW12ZWN0b3Jfc2l6ZSk7CisgICAgUFJJTlQoIm51bXZlY3Rvcl9zaXplIiwgcS0+c3VicGFja2V0WzBdLm51bXZlY3Rvcl9zaXplKTsKKyAgICBQUklOVCgidG90YWxfc3ViYmFuZHMiLCBxLT5zdWJwYWNrZXRbMF0udG90YWxfc3ViYmFuZHMpOworfQorI2VuZGlmCisKKy8qKgorICogQ29vayBpbml0aWFsaXphdGlvbgorICoKKyAqIEBwYXJhbSBhdmN0eCAgICAgcG9pbnRlciB0byB0aGUgQVZDb2RlY0NvbnRleHQKKyAqLworc3RhdGljIGF2X2NvbGQgaW50IGNvb2tfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENPT0tDb250ZXh0ICpxID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICplZGF0YV9wdHIgPSBhdmN0eC0+ZXh0cmFkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmVkYXRhX3B0cl9lbmQgPSBlZGF0YV9wdHIgKyBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7CisgICAgaW50IGV4dHJhZGF0YV9zaXplID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplOworICAgIGludCBzID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbF9tYXNrID0gMDsKKyAgICBpbnQgc2FtcGxlc19wZXJfZnJhbWUgPSAwOworICAgIGludCByZXQ7CisgICAgcS0+YXZjdHggPSBhdmN0eDsKKworICAgIC8qIFRha2UgY2FyZSBvZiB0aGUgY29kZWMgc3BlY2lmaWMgZXh0cmFkYXRhLiAqLworICAgIGlmIChleHRyYWRhdGFfc2l6ZSA8IDgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJOZWNlc3NhcnkgZXh0cmFkYXRhIG1pc3NpbmchXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiY29kZWNkYXRhX2xlbmd0aD0lZFxuIiwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKworICAgIC8qIFRha2UgZGF0YSBmcm9tIHRoZSBBVkNvZGVjQ29udGV4dCAoUk0gY29udGFpbmVyKS4gKi8KKyAgICBpZiAoIWF2Y3R4LT5jaGFubmVscykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBSTkcuICovCisgICAgYXZfbGZnX2luaXQoJnEtPnJhbmRvbV9zdGF0ZSwgMCk7CisKKyAgICBmZl9hdWRpb2RzcF9pbml0KCZxLT5hZHNwKTsKKworICAgIHdoaWxlIChlZGF0YV9wdHIgPCBlZGF0YV9wdHJfZW5kKSB7CisgICAgICAgIC8qIDggZm9yIG1vbm8sIDE2IGZvciBzdGVyZW8sID8gZm9yIG11bHRpY2hhbm5lbAorICAgICAgICAgICBTd2FwIHRvIHJpZ2h0IGVuZGlhbm5lc3Mgc28gd2UgZG9uJ3QgbmVlZCB0byBjYXJlIGxhdGVyIG9uLiAqLworICAgICAgICBpZiAoZXh0cmFkYXRhX3NpemUgPj0gOCkgeworICAgICAgICAgICAgcS0+c3VicGFja2V0W3NdLmNvb2t2ZXJzaW9uID0gYnl0ZXN0cmVhbV9nZXRfYmUzMigmZWRhdGFfcHRyKTsKKyAgICAgICAgICAgIHNhbXBsZXNfcGVyX2ZyYW1lICAgICAgICAgICA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmVkYXRhX3B0cik7CisgICAgICAgICAgICBxLT5zdWJwYWNrZXRbc10uc3ViYmFuZHMgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZlZGF0YV9wdHIpOworICAgICAgICAgICAgZXh0cmFkYXRhX3NpemUgLT0gODsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXh0cmFkYXRhX3NpemUgPj0gOCkgeworICAgICAgICAgICAgYnl0ZXN0cmVhbV9nZXRfYmUzMigmZWRhdGFfcHRyKTsgICAgLy8gVW5rbm93biB1bnVzZWQKKyAgICAgICAgICAgIHEtPnN1YnBhY2tldFtzXS5qc19zdWJiYW5kX3N0YXJ0ID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmZWRhdGFfcHRyKTsKKyAgICAgICAgICAgIGlmIChxLT5zdWJwYWNrZXRbc10uanNfc3ViYmFuZF9zdGFydCA+PSA1MSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAianNfc3ViYmFuZF9zdGFydCAlZCBpcyB0b28gbGFyZ2VcbiIsIHEtPnN1YnBhY2tldFtzXS5qc19zdWJiYW5kX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcS0+c3VicGFja2V0W3NdLmpzX3ZsY19iaXRzID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmZWRhdGFfcHRyKTsKKyAgICAgICAgICAgIGV4dHJhZGF0YV9zaXplIC09IDg7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXplIGV4dHJhZGF0YSByZWxhdGVkIHZhcmlhYmxlcy4gKi8KKyAgICAgICAgcS0+c3VicGFja2V0W3NdLnNhbXBsZXNfcGVyX2NoYW5uZWwgPSBzYW1wbGVzX3Blcl9mcmFtZSAvIGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgcS0+c3VicGFja2V0W3NdLmJpdHNfcGVyX3N1YnBhY2tldCA9IGF2Y3R4LT5ibG9ja19hbGlnbiAqIDg7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBkZWZhdWx0IGRhdGEgc3RhdGVzLiAqLworICAgICAgICBxLT5zdWJwYWNrZXRbc10ubG9nMl9udW12ZWN0b3Jfc2l6ZSA9IDU7CisgICAgICAgIHEtPnN1YnBhY2tldFtzXS50b3RhbF9zdWJiYW5kcyA9IHEtPnN1YnBhY2tldFtzXS5zdWJiYW5kczsKKyAgICAgICAgcS0+c3VicGFja2V0W3NdLm51bV9jaGFubmVscyA9IDE7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB2ZXJzaW9uLWRlcGVuZGVudCB2YXJpYWJsZXMgKi8KKworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInN1YnBhY2tldFslaV0uY29va3ZlcnNpb249JXhcbiIsIHMsCisgICAgICAgICAgICAgICBxLT5zdWJwYWNrZXRbc10uY29va3ZlcnNpb24pOworICAgICAgICBxLT5zdWJwYWNrZXRbc10uam9pbnRfc3RlcmVvID0gMDsKKyAgICAgICAgc3dpdGNoIChxLT5zdWJwYWNrZXRbc10uY29va3ZlcnNpb24pIHsKKyAgICAgICAgY2FzZSBNT05POgorICAgICAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscyAhPSAxKSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiQ29udGFpbmVyIGNoYW5uZWxzICE9IDEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIk1PTk9cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RFUkVPOgorICAgICAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscyAhPSAxKSB7CisgICAgICAgICAgICAgICAgcS0+c3VicGFja2V0W3NdLmJpdHNfcGVyX3N1YnBkaXYgPSAxOworICAgICAgICAgICAgICAgIHEtPnN1YnBhY2tldFtzXS5udW1fY2hhbm5lbHMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJTVEVSRU9cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSk9JTlRfU1RFUkVPOgorICAgICAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscyAhPSAyKSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiQ29udGFpbmVyIGNoYW5uZWxzICE9IDIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkpPSU5UX1NURVJFT1xuIik7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDE2KSB7CisgICAgICAgICAgICAgICAgcS0+c3VicGFja2V0W3NdLnRvdGFsX3N1YmJhbmRzID0gcS0+c3VicGFja2V0W3NdLnN1YmJhbmRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5zdWJwYWNrZXRbc10uanNfc3ViYmFuZF9zdGFydDsKKyAgICAgICAgICAgICAgICBxLT5zdWJwYWNrZXRbc10uam9pbnRfc3RlcmVvID0gMTsKKyAgICAgICAgICAgICAgICBxLT5zdWJwYWNrZXRbc10ubnVtX2NoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChxLT5zdWJwYWNrZXRbc10uc2FtcGxlc19wZXJfY2hhbm5lbCA+IDI1NikgeworICAgICAgICAgICAgICAgIHEtPnN1YnBhY2tldFtzXS5sb2cyX251bXZlY3Rvcl9zaXplID0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChxLT5zdWJwYWNrZXRbc10uc2FtcGxlc19wZXJfY2hhbm5lbCA+IDUxMikgeworICAgICAgICAgICAgICAgIHEtPnN1YnBhY2tldFtzXS5sb2cyX251bXZlY3Rvcl9zaXplID0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1DX0NPT0s6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIk1VTFRJX0NIQU5ORUxcbiIpOworICAgICAgICAgICAgaWYgKGV4dHJhZGF0YV9zaXplID49IDQpCisgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXNrIHw9IHEtPnN1YnBhY2tldFtzXS5jaGFubmVsX21hc2sgPSBieXRlc3RyZWFtX2dldF9iZTMyKCZlZGF0YV9wdHIpOworCisgICAgICAgICAgICBpZiAoYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHEtPnN1YnBhY2tldFtzXS5jaGFubmVsX21hc2spID4gMSkgeworICAgICAgICAgICAgICAgIHEtPnN1YnBhY2tldFtzXS50b3RhbF9zdWJiYW5kcyA9IHEtPnN1YnBhY2tldFtzXS5zdWJiYW5kcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+c3VicGFja2V0W3NdLmpzX3N1YmJhbmRfc3RhcnQ7CisgICAgICAgICAgICAgICAgcS0+c3VicGFja2V0W3NdLmpvaW50X3N0ZXJlbyA9IDE7CisgICAgICAgICAgICAgICAgcS0+c3VicGFja2V0W3NdLm51bV9jaGFubmVscyA9IDI7CisgICAgICAgICAgICAgICAgcS0+c3VicGFja2V0W3NdLnNhbXBsZXNfcGVyX2NoYW5uZWwgPSBzYW1wbGVzX3Blcl9mcmFtZSA+PiAxOworCisgICAgICAgICAgICAgICAgaWYgKHEtPnN1YnBhY2tldFtzXS5zYW1wbGVzX3Blcl9jaGFubmVsID4gMjU2KSB7CisgICAgICAgICAgICAgICAgICAgIHEtPnN1YnBhY2tldFtzXS5sb2cyX251bXZlY3Rvcl9zaXplID0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHEtPnN1YnBhY2tldFtzXS5zYW1wbGVzX3Blcl9jaGFubmVsID4gNTEyKSB7CisgICAgICAgICAgICAgICAgICAgIHEtPnN1YnBhY2tldFtzXS5sb2cyX251bXZlY3Rvcl9zaXplID0gNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBxLT5zdWJwYWNrZXRbc10uc2FtcGxlc19wZXJfY2hhbm5lbCA9IHNhbXBsZXNfcGVyX2ZyYW1lOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkNvb2sgdmVyc2lvbiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+c3VicGFja2V0W3NdLmNvb2t2ZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzID4gMSAmJiBxLT5zdWJwYWNrZXRbc10uc2FtcGxlc19wZXJfY2hhbm5lbCAhPSBxLT5zYW1wbGVzX3Blcl9jaGFubmVsKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImRpZmZlcmVudCBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcS0+c2FtcGxlc19wZXJfY2hhbm5lbCA9IHEtPnN1YnBhY2tldFswXS5zYW1wbGVzX3Blcl9jaGFubmVsOworCisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZSByZWxhdGlvbnMgKi8KKyAgICAgICAgcS0+c3VicGFja2V0W3NdLm51bXZlY3Rvcl9zaXplID0gKDEgPDwgcS0+c3VicGFja2V0W3NdLmxvZzJfbnVtdmVjdG9yX3NpemUpOworCisgICAgICAgIC8qIFRyeSB0byBjYXRjaCBzb21lIG9idmlvdXNseSBmYXVsdHkgc3RyZWFtcywgb3RoZXJ2aXNlIGl0IG1pZ2h0IGJlIGV4cGxvaXRhYmxlICovCisgICAgICAgIGlmIChxLT5zdWJwYWNrZXRbc10udG90YWxfc3ViYmFuZHMgPiA1MykgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAidG90YWxfc3ViYmFuZHMgPiA1MyIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChxLT5zdWJwYWNrZXRbc10uanNfdmxjX2JpdHMgPiA2KSB8fAorICAgICAgICAgICAgKHEtPnN1YnBhY2tldFtzXS5qc192bGNfYml0cyA8IDIgKiBxLT5zdWJwYWNrZXRbc10uam9pbnRfc3RlcmVvKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJqc192bGNfYml0cyA9ICVkLCBvbmx5ID49ICVkIGFuZCA8PSA2IGFsbG93ZWQhXG4iLAorICAgICAgICAgICAgICAgICAgIHEtPnN1YnBhY2tldFtzXS5qc192bGNfYml0cywgMiAqIHEtPnN1YnBhY2tldFtzXS5qb2ludF9zdGVyZW8pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocS0+c3VicGFja2V0W3NdLnN1YmJhbmRzID4gNTApIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInN1YmJhbmRzID4gNTAiKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+c3VicGFja2V0W3NdLnN1YmJhbmRzID09IDApIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInN1YmJhbmRzID0gMCIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgICAgIHEtPnN1YnBhY2tldFtzXS5nYWluczEubm93ICAgICAgPSBxLT5zdWJwYWNrZXRbc10uZ2Fpbl8xOworICAgICAgICBxLT5zdWJwYWNrZXRbc10uZ2FpbnMxLnByZXZpb3VzID0gcS0+c3VicGFja2V0W3NdLmdhaW5fMjsKKyAgICAgICAgcS0+c3VicGFja2V0W3NdLmdhaW5zMi5ub3cgICAgICA9IHEtPnN1YnBhY2tldFtzXS5nYWluXzM7CisgICAgICAgIHEtPnN1YnBhY2tldFtzXS5nYWluczIucHJldmlvdXMgPSBxLT5zdWJwYWNrZXRbc10uZ2Fpbl80OworCisgICAgICAgIGlmIChxLT5udW1fc3VicGFja2V0cyArIHEtPnN1YnBhY2tldFtzXS5udW1fY2hhbm5lbHMgPiBxLT5hdmN0eC0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgc3VicGFja2V0cyAlZCBmb3IgY2hhbm5lbHMgJWRcbiIsIHEtPm51bV9zdWJwYWNrZXRzLCBxLT5hdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBxLT5udW1fc3VicGFja2V0cysrOworICAgICAgICBzKys7CisgICAgICAgIGlmIChzID4gRkZNSU4oTUFYX1NVQlBBQ0tFVFMsIGF2Y3R4LT5ibG9ja19hbGlnbikpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInN1YnBhY2tldHMgPiAlZCIsIEZGTUlOKE1BWF9TVUJQQUNLRVRTLCBhdmN0eC0+YmxvY2tfYWxpZ24pKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBHZW5lcmF0ZSB0YWJsZXMgKi8KKyAgICBpbml0X3BvdzJ0YWJsZSgpOworICAgIGluaXRfZ2Fpbl90YWJsZShxKTsKKyAgICBpbml0X2NwbHNjYWxlc190YWJsZShxKTsKKworICAgIGlmICgocmV0ID0gaW5pdF9jb29rX3ZsY190YWJsZXMocSkpKQorICAgICAgICByZXR1cm4gcmV0OworCisKKyAgICBpZiAoYXZjdHgtPmJsb2NrX2FsaWduID49IFVJTlRfTUFYIC8gMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIC8qIFBhZCB0aGUgZGF0YWJ1ZmZlciB3aXRoOgorICAgICAgIERFQ09ERV9CWVRFU19QQUQxIG9yIERFQ09ERV9CWVRFU19QQUQyIGZvciBkZWNvZGVfYnl0ZXMoKSwKKyAgICAgICBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFLCBmb3IgdGhlIGJpdHN0cmVhbXJlYWRlci4gKi8KKyAgICBxLT5kZWNvZGVkX2J5dGVzX2J1ZmZlciA9CisgICAgICAgIGF2X21hbGxvY3ooYXZjdHgtPmJsb2NrX2FsaWduCisgICAgICAgICAgICAgICAgICAgKyBERUNPREVfQllURVNfUEFEMShhdmN0eC0+YmxvY2tfYWxpZ24pCisgICAgICAgICAgICAgICAgICAgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIXEtPmRlY29kZWRfYnl0ZXNfYnVmZmVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogSW5pdGlhbGl6ZSB0cmFuc2Zvcm0uICovCisgICAgaWYgKChyZXQgPSBpbml0X2Nvb2tfbWx0KHEpKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIEluaXRpYWxpemUgQ09PSyBzaWduYWwgYXJpdGhtZXRpYyBoYW5kbGluZyAqLworICAgIGlmICgxKSB7CisgICAgICAgIHEtPnNjYWxhcl9kZXF1YW50ICA9IHNjYWxhcl9kZXF1YW50X2Zsb2F0OworICAgICAgICBxLT5kZWNvdXBsZSAgICAgICAgPSBkZWNvdXBsZV9mbG9hdDsKKyAgICAgICAgcS0+aW1sdF93aW5kb3cgICAgID0gaW1sdF93aW5kb3dfZmxvYXQ7CisgICAgICAgIHEtPmludGVycG9sYXRlICAgICA9IGludGVycG9sYXRlX2Zsb2F0OworICAgICAgICBxLT5zYXR1cmF0ZV9vdXRwdXQgPSBzYXR1cmF0ZV9vdXRwdXRfZmxvYXQ7CisgICAgfQorCisgICAgLyogVHJ5IHRvIGNhdGNoIHNvbWUgb2J2aW91c2x5IGZhdWx0eSBzdHJlYW1zLCBvdGhlcnZpc2UgaXQgbWlnaHQgYmUgZXhwbG9pdGFibGUgKi8KKyAgICBpZiAocS0+c2FtcGxlc19wZXJfY2hhbm5lbCAhPSAyNTYgJiYgcS0+c2FtcGxlc19wZXJfY2hhbm5lbCAhPSA1MTIgJiYKKyAgICAgICAgcS0+c2FtcGxlc19wZXJfY2hhbm5lbCAhPSAxMDI0KSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInNhbXBsZXNfcGVyX2NoYW5uZWwgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5zYW1wbGVzX3Blcl9jaGFubmVsKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9GTFRQOworICAgIGlmIChjaGFubmVsX21hc2spCisgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGNoYW5uZWxfbWFzazsKKyAgICBlbHNlCisgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IChhdmN0eC0+Y2hhbm5lbHMgPT0gMikgPyBBVl9DSF9MQVlPVVRfU1RFUkVPIDogQVZfQ0hfTEFZT1VUX01PTk87CisKKyNpZmRlZiBERUJVRworICAgIGR1bXBfY29va19jb250ZXh0KHEpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfY29va19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjb29rIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29vayAvIENvb2tlciAvIEdlY2tvIChSZWFsQXVkaW8gRzIpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0NPT0ssCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENPT0tDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBjb29rX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGNvb2tfZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGNvb2tfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jb29rX3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY29va19wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGJiZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvY29va19wYXJzZXIuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENvb2sgYXVkaW8gcGFyc2VyCisgKgorICogRGV0ZXJtaW5lcyBzdWJwYWNrZXQgZHVyYXRpb24gZnJvbSBleHRyYWRhdGEuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorCit0eXBlZGVmIHN0cnVjdCBDb29rUGFyc2VDb250ZXh0IHsKKyAgICBpbnQgZHVyYXRpb247Cit9IENvb2tQYXJzZUNvbnRleHQ7CisKK3N0YXRpYyBpbnQgY29va19wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqczEsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgQ29va1BhcnNlQ29udGV4dCAqcyA9IHMxLT5wcml2X2RhdGE7CisKKyAgICBpZiAoIXMtPmR1cmF0aW9uICYmCisgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSAmJiBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPj0gOCAmJiBhdmN0eC0+Y2hhbm5lbHMpCisgICAgICAgIHMtPmR1cmF0aW9uID0gQVZfUkIxNihhdmN0eC0+ZXh0cmFkYXRhICsgNCkgLyBhdmN0eC0+Y2hhbm5lbHM7CisKKyAgICBzMS0+ZHVyYXRpb24gPSBzLT5kdXJhdGlvbjsKKworICAgIC8qIGFsd2F5cyByZXR1cm4gdGhlIGZ1bGwgcGFja2V0LiB0aGlzIHBhcnNlciBpc24ndCBkb2luZyBhbnkgc3BsaXR0aW5nIG9yCisgICAgICAgY29tYmluaW5nLCBvbmx5IHNldHRpbmcgcGFja2V0IGR1cmF0aW9uICovCisgICAgKnBvdXRidWYgICAgICA9IGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitBVkNvZGVjUGFyc2VyIGZmX2Nvb2tfcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfQ09PSyB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihDb29rUGFyc2VDb250ZXh0KSwKKyAgICAucGFyc2VyX3BhcnNlICAgPSBjb29rX3BhcnNlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2Nvb2tkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9jb29rZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOWNiYTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jb29rZGF0YS5oCkBAIC0wLDAgKzEsNTgwIEBACisvKgorICogQ09PSyBjb21wYXRpYmxlIGRlY29kZXIgZGF0YQorICogQ29weXJpZ2h0IChjKSAyMDAzIFNhc2NoYSBTb21tZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNSBCZW5qYW1pbiBMYXJzc29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENvb2sgQUtBIFJlYWxBdWRpbyBHMiBjb21wYXRpYmxlIGRlY29kZXJkYXRhCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0NPT0tEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19DT09LREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogdmFyaW91cyBkYXRhIHRhYmxlcyAqLworCitzdGF0aWMgY29uc3QgaW50IGV4cGJpdHNfdGFiWzhdID0geworICAgIDUyLDQ3LDQzLDM3LDI5LDIyLDE2LDAsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgZGl0aGVyX3RhYls5XSA9IHsKKyAgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMTc2Nzc3LCAwLjI1LCAwLjcwNzEwNywgMS4wCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcXVhbnRfY2VudHJvaWRfdGFiWzddWzE0XSA9IHsKKyAgeyAwLjAwMCwgMC4zOTIsIDAuNzYxLCAxLjEyMCwgMS40NzcsIDEuODMyLCAyLjE4MywgMi41NDEsIDIuODkzLCAzLjI0NSwgMy41OTgsIDMuOTQyLCA0LjI4OCwgNC43MjQgfSwKKyAgeyAwLjAwMCwgMC41NDQsIDEuMDYwLCAxLjU2MywgMi4wNjgsIDIuNTcxLCAzLjA3MiwgMy41NjIsIDQuMDcwLCA0LjYyMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAgfSwKKyAgeyAwLjAwMCwgMC43NDYsIDEuNDY0LCAyLjE4MCwgMi44ODIsIDMuNTg0LCA0LjMxNiwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAgfSwKKyAgeyAwLjAwMCwgMS4wMDYsIDIuMDAwLCAyLjk5MywgMy45ODUsIDAuMDAwLCAwLjAwMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAgfSwKKyAgeyAwLjAwMCwgMS4zMjEsIDIuNzAzLCAzLjk4MywgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAgfSwKKyAgeyAwLjAwMCwgMS42NTcsIDMuNDkxLCAwLjAwMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAgfSwKKyAgeyAwLjAwMCwgMS45NjQsIDAuMDAwLCAwLjAwMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAsIDAuMDAwLCAwLjAwMCwgMC4wMDAgfQorfTsKKworc3RhdGljIGNvbnN0IGludCBpbnZyYWRpeF90YWJbN10gPSB7CisgICAgNzQ4OTksIDEwNDg1OCwgMTQ5Nzk3LCAyMDk3MTYsIDI2MjE0NCwgMzQ5NTI2LCA1MjQyODgsCit9OworCitzdGF0aWMgY29uc3QgaW50IGttYXhfdGFiWzddID0geworICAgIDEzLCA5LCA2LCA0LCAzLCAyLCAxLAorfTsKKworc3RhdGljIGNvbnN0IGludCB2ZF90YWJbN10gPSB7CisgICAgMiwgMiwgMiwgNCwgNCwgNSwgNSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgdnByX3RhYls3XSA9IHsKKyAgICAxMCwgMTAsIDEwLCA1LCA1LCA0LCA0LAorfTsKKworCisKKy8qIFZMQyBkYXRhICovCisKK3N0YXRpYyBjb25zdCBpbnQgdmhzaXplX3RhYls3XSA9IHsKKyAgICAxOTEsIDk3LCA0OCwgNjA3LCAyNDYsIDIzMCwgMzIsCit9OworCitzdGF0aWMgY29uc3QgaW50IHZodmxjc2l6ZV90YWJbN10gPSB7CisgICAgOCwgNywgNywgMTAsIDksIDksIDYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBlbnZlbG9wZV9xdWFudF9pbmRleF9odWZmYml0c1sxM11bMjRdID0geworICAgIHsgIDQsICA2LCAgNSwgIDUsICA0LCA0LCA0LCA0LCA0LCA0LCAzLCAzLCAzLCA0LCA1LCA3LCAgOCwgIDksIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIgfSwKKyAgICB7IDEwLCAgOCwgIDYsICA1LCAgNSwgNCwgMywgMywgMywgMywgMywgMywgNCwgNSwgNywgOSwgMTEsIDEyLCAxMywgMTUsIDE1LCAxNSwgMTYsIDE2IH0sCisgICAgeyAxMiwgMTAsICA4LCAgNiwgIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDMsIDMsIDMsIDQsIDQsICA1LCAgNSwgIDcsICA5LCAxMSwgMTMsIDE0LCAxNCB9LAorICAgIHsgMTMsIDEwLCAgOSwgIDksICA3LCA3LCA1LCA1LCA0LCAzLCAzLCAzLCAzLCAzLCA0LCA0LCAgNCwgIDUsICA3LCAgOSwgMTEsIDEzLCAxMywgMTMgfSwKKyAgICB7IDEyLCAxMywgMTAsICA4LCAgNiwgNiwgNSwgNSwgNCwgNCwgMywgMywgMywgMywgMywgNCwgIDUsICA1LCAgNiwgIDcsICA5LCAxMSwgMTQsIDE0IH0sCisgICAgeyAxMiwgMTEsICA5LCAgOCwgIDgsIDcsIDUsIDQsIDQsIDMsIDMsIDMsIDMsIDMsIDQsIDQsICA1LCAgNSwgIDcsICA4LCAxMCwgMTMsIDE0LCAxNCB9LAorICAgIHsgMTUsIDE2LCAxNSwgMTIsIDEwLCA4LCA2LCA1LCA0LCAzLCAzLCAzLCAyLCAzLCA0LCA1LCAgNSwgIDcsICA5LCAxMSwgMTMsIDE2LCAxNiwgMTYgfSwKKyAgICB7IDE0LCAxNCwgMTEsIDEwLCAgOSwgNywgNywgNSwgNSwgNCwgMywgMywgMiwgMywgMywgNCwgIDUsICA3LCAgOSwgIDksIDEyLCAxNCwgMTUsIDE1IH0sCisgICAgeyAgOSwgIDksICA5LCAgOCwgIDcsIDYsIDUsIDQsIDMsIDMsIDMsIDMsIDMsIDMsIDQsIDUsICA2LCAgNywgIDgsIDEwLCAxMSwgMTIsIDEzLCAxMyB9LAorICAgIHsgMTQsIDEyLCAxMCwgIDgsICA2LCA2LCA1LCA0LCAzLCAzLCAzLCAzLCAzLCAzLCA0LCA1LCAgNiwgIDgsICA4LCAgOSwgMTEsIDE0LCAxNCwgMTQgfSwKKyAgICB7IDEzLCAxMCwgIDksICA4LCAgNiwgNiwgNSwgNCwgNCwgNCwgMywgMywgMiwgMywgNCwgNSwgIDYsICA4LCAgOSwgIDksIDExLCAxMiwgMTQsIDE0IH0sCisgICAgeyAxNiwgMTMsIDEyLCAxMSwgIDksIDYsIDUsIDUsIDQsIDQsIDQsIDMsIDIsIDMsIDMsIDQsICA1LCAgNywgIDgsIDEwLCAxNCwgMTYsIDE2LCAxNiB9LAorICAgIHsgMTMsIDE0LCAxNCwgMTQsIDEwLCA4LCA3LCA3LCA1LCA0LCAzLCAzLCAyLCAzLCAzLCA0LCAgNSwgIDUsICA3LCAgOSwgMTEsIDE0LCAxNCwgMTQgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBlbnZlbG9wZV9xdWFudF9pbmRleF9odWZmY29kZXNbMTNdWzI0XSA9IHsKKyAgICB7MHgwMDA2LCAweDAwM2UsIDB4MDAxYywgMHgwMDFkLCAweDAwMDcsIDB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwgMHgwMDBjLCAweDAwMDAsIDB4MDAwMSwKKyAgICAgMHgwMDAyLCAweDAwMGQsIDB4MDAxZSwgMHgwMDdlLCAweDAwZmUsIDB4MDFmZSwgMHgwN2ZjLCAweDA3ZmQsIDB4MGZmYywgMHgwZmZkLCAweDBmZmUsIDB4MGZmZn0sCisgICAgezB4MDNmZSwgMHgwMGZlLCAweDAwM2UsIDB4MDAxYywgMHgwMDFkLCAweDAwMGMsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgMHgwMDA0LCAweDAwMDUsCisgICAgIDB4MDAwZCwgMHgwMDFlLCAweDAwN2UsIDB4MDFmZSwgMHgwN2ZlLCAweDBmZmUsIDB4MWZmZSwgMHg3ZmZjLCAweDdmZmQsIDB4N2ZmZSwgMHhmZmZlLCAweGZmZmZ9LAorICAgIHsweDBmZmUsIDB4MDNmZSwgMHgwMGZlLCAweDAwM2UsIDB4MDAxYywgMHgwMDA2LCAweDAwMDcsIDB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwgMHgwMDAwLAorICAgICAweDAwMDEsIDB4MDAwMiwgMHgwMDBjLCAweDAwMGQsIDB4MDAxZCwgMHgwMDFlLCAweDAwN2UsIDB4MDFmZSwgMHgwN2ZlLCAweDFmZmUsIDB4M2ZmZSwgMHgzZmZmfSwKKyAgICB7MHgxZmZjLCAweDAzZmUsIDB4MDFmYywgMHgwMWZkLCAweDAwN2MsIDB4MDA3ZCwgMHgwMDFjLCAweDAwMWQsIDB4MDAwYSwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwKKyAgICAgMHgwMDAzLCAweDAwMDQsIDB4MDAwYiwgMHgwMDBjLCAweDAwMGQsIDB4MDAxZSwgMHgwMDdlLCAweDAxZmUsIDB4MDdmZSwgMHgxZmZkLCAweDFmZmUsIDB4MWZmZn0sCisgICAgezB4MGZmZSwgMHgxZmZlLCAweDAzZmUsIDB4MDBmZSwgMHgwMDNjLCAweDAwM2QsIDB4MDAxYSwgMHgwMDFiLCAweDAwMGEsIDB4MDAwYiwgMHgwMDAwLCAweDAwMDEsCisgICAgIDB4MDAwMiwgMHgwMDAzLCAweDAwMDQsIDB4MDAwYywgMHgwMDFjLCAweDAwMWQsIDB4MDAzZSwgMHgwMDdlLCAweDAxZmUsIDB4MDdmZSwgMHgzZmZlLCAweDNmZmZ9LAorICAgIHsweDBmZmUsIDB4MDdmZSwgMHgwMWZlLCAweDAwZmMsIDB4MDBmZCwgMHgwMDdjLCAweDAwMWMsIDB4MDAwYSwgMHgwMDBiLCAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLAorICAgICAweDAwMDMsIDB4MDAwNCwgMHgwMDBjLCAweDAwMGQsIDB4MDAxZCwgMHgwMDFlLCAweDAwN2QsIDB4MDBmZSwgMHgwM2ZlLCAweDFmZmUsIDB4M2ZmZSwgMHgzZmZmfSwKKyAgICB7MHg3ZmZjLCAweGZmZmMsIDB4N2ZmZCwgMHgwZmZlLCAweDAzZmUsIDB4MDBmZSwgMHgwMDNlLCAweDAwMWMsIDB4MDAwYywgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwKKyAgICAgMHgwMDAwLCAweDAwMDUsIDB4MDAwZCwgMHgwMDFkLCAweDAwMWUsIDB4MDA3ZSwgMHgwMWZlLCAweDA3ZmUsIDB4MWZmZSwgMHhmZmZkLCAweGZmZmUsIDB4ZmZmZn0sCisgICAgezB4M2ZmYywgMHgzZmZkLCAweDA3ZmUsIDB4MDNmZSwgMHgwMWZjLCAweDAwN2MsIDB4MDA3ZCwgMHgwMDFjLCAweDAwMWQsIDB4MDAwYywgMHgwMDAyLCAweDAwMDMsCisgICAgIDB4MDAwMCwgMHgwMDA0LCAweDAwMDUsIDB4MDAwZCwgMHgwMDFlLCAweDAwN2UsIDB4MDFmZCwgMHgwMWZlLCAweDBmZmUsIDB4M2ZmZSwgMHg3ZmZlLCAweDdmZmZ9LAorICAgIHsweDAxZmMsIDB4MDFmZCwgMHgwMWZlLCAweDAwZmMsIDB4MDA3YywgMHgwMDNjLCAweDAwMWMsIDB4MDAwYywgMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorICAgICAweDAwMDQsIDB4MDAwNSwgMHgwMDBkLCAweDAwMWQsIDB4MDAzZCwgMHgwMDdkLCAweDAwZmQsIDB4MDNmZSwgMHgwN2ZlLCAweDBmZmUsIDB4MWZmZSwgMHgxZmZmfSwKKyAgICB7MHgzZmZjLCAweDBmZmUsIDB4MDNmZSwgMHgwMGZjLCAweDAwM2MsIDB4MDAzZCwgMHgwMDFjLCAweDAwMGMsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKyAgICAgMHgwMDA0LCAweDAwMDUsIDB4MDAwZCwgMHgwMDFkLCAweDAwM2UsIDB4MDBmZCwgMHgwMGZlLCAweDAxZmUsIDB4MDdmZSwgMHgzZmZkLCAweDNmZmUsIDB4M2ZmZn0sCisgICAgezB4MWZmZSwgMHgwM2ZlLCAweDAxZmMsIDB4MDBmYywgMHgwMDNjLCAweDAwM2QsIDB4MDAxYywgMHgwMDBhLCAweDAwMGIsIDB4MDAwYywgMHgwMDAyLCAweDAwMDMsCisgICAgIDB4MDAwMCwgMHgwMDA0LCAweDAwMGQsIDB4MDAxZCwgMHgwMDNlLCAweDAwZmQsIDB4MDFmZCwgMHgwMWZlLCAweDA3ZmUsIDB4MGZmZSwgMHgzZmZlLCAweDNmZmZ9LAorICAgIHsweGZmZmMsIDB4MWZmZSwgMHgwZmZlLCAweDA3ZmUsIDB4MDFmZSwgMHgwMDNlLCAweDAwMWMsIDB4MDAxZCwgMHgwMDBhLCAweDAwMGIsIDB4MDAwYywgMHgwMDAyLAorICAgICAweDAwMDAsIDB4MDAwMywgMHgwMDA0LCAweDAwMGQsIDB4MDAxZSwgMHgwMDdlLCAweDAwZmUsIDB4MDNmZSwgMHgzZmZlLCAweGZmZmQsIDB4ZmZmZSwgMHhmZmZmfSwKKyAgICB7MHgxZmZjLCAweDNmZmEsIDB4M2ZmYiwgMHgzZmZjLCAweDAzZmUsIDB4MDBmZSwgMHgwMDdjLCAweDAwN2QsIDB4MDAxYywgMHgwMDBjLCAweDAwMDIsIDB4MDAwMywKKyAgICAgMHgwMDAwLCAweDAwMDQsIDB4MDAwNSwgMHgwMDBkLCAweDAwMWQsIDB4MDAxZSwgMHgwMDdlLCAweDAxZmUsIDB4MDdmZSwgMHgzZmZkLCAweDNmZmUsIDB4M2ZmZn0sCit9OworCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGN2aF9odWZmYml0czBbMTkxXSA9IHsKKyAgICAxLCA0LCA2LCA2LCA3LCA3LCA4LCA4LCA4LCA5LCA5LCAxMCwKKyAgICAxMSwgMTEsIDQsIDUsIDYsIDcsIDcsIDgsIDgsIDksIDksIDksCisgICAgOSwgMTAsIDExLCAxMSwgNSwgNiwgNywgOCwgOCwgOSwgOSwgOSwKKyAgICA5LCAxMCwgMTAsIDEwLCAxMSwgMTIsIDYsIDcsIDgsIDksIDksIDksCisgICAgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMiwgMTMsIDcsIDcsIDgsIDksCisgICAgOSwgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsIDEzLCA4LCA4LAorICAgIDksIDksIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMywgMTQsCisgICAgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEzLAorICAgIDEzLCAxNSwgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTMsIDE0LCAxNSwgOSwgOSwgOSwgMTAsIDEwLCAxMCwgMTEsIDExLAorICAgIDEyLCAxMywgMTIsIDE0LCAxNSwgMTYsIDksIDksIDEwLCAxMCwgMTAsIDEwLAorICAgIDExLCAxMiwgMTIsIDE0LCAxNCwgMTYsIDE2LCAwLCA5LCA5LCAxMCwgMTAsCisgICAgMTEsIDExLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAwLCAwLCAxMCwgMTAsCisgICAgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTUsIDE1LCAxNiwgMCwgMCwgMCwKKyAgICAxMSwgMTEsIDExLCAxMiwgMTMsIDEzLCAxMywgMTUsIDE2LCAxNiwgMCwgMCwKKyAgICAwLCAwLCAxMSwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNSwgMTYsIDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGN2aF9odWZmY29kZXMwWzE5MV0gPSB7CisgICAgMHgwMDAwLDB4MDAwOCwweDAwMmMsMHgwMDJkLDB4MDA2MiwweDAwNjMsMHgwMGQ0LDB4MDBkNSwweDAwZDYsMHgwMWM2LDB4MDFjNywweDAzY2EsCisgICAgMHgwN2Q2LDB4MDdkNywweDAwMDksMHgwMDE0LDB4MDAyZSwweDAwNjQsMHgwMDY1LDB4MDBkNywweDAwZDgsMHgwMWM4LDB4MDFjOSwweDAxY2EsCisgICAgMHgwMWNiLDB4MDNjYiwweDA3ZDgsMHgwN2Q5LDB4MDAxNSwweDAwMmYsMHgwMDY2LDB4MDBkOSwweDAwZGEsMHgwMWNjLDB4MDFjZCwweDAxY2UsCisgICAgMHgwMWNmLDB4MDNjYywweDAzY2QsMHgwM2NlLDB4MDdkYSwweDBmZTQsMHgwMDMwLDB4MDA2NywweDAwZGIsMHgwMWQwLDB4MDFkMSwweDAxZDIsCisgICAgMHgwMWQzLDB4MDNjZiwweDAzZDAsMHgwM2QxLDB4MDNkMiwweDA3ZGIsMHgwZmU1LDB4MWZlYSwweDAwNjgsMHgwMDY5LDB4MDBkYywweDAxZDQsCisgICAgMHgwMWQ1LDB4MDFkNiwweDAzZDMsMHgwM2Q0LDB4MDNkNSwweDAzZDYsMHgwN2RjLDB4MDdkZCwweDBmZTYsMHgxZmViLDB4MDBkZCwweDAwZGUsCisgICAgMHgwMWQ3LDB4MDFkOCwweDAxZDksMHgwM2Q3LDB4MDNkOCwweDAzZDksMHgwM2RhLDB4MDdkZSwweDA3ZGYsMHgwZmU3LDB4MWZlYywweDNmZjIsCisgICAgMHgwMGRmLDB4MDBlMCwweDAxZGEsMHgwMWRiLDB4MDNkYiwweDAzZGMsMHgwN2UwLDB4MDdlMSwweDA3ZTIsMHgwZmU4LDB4MGZlOSwweDFmZWQsCisgICAgMHgxZmVlLDB4N2ZmNCwweDAwZTEsMHgwMGUyLDB4MDFkYywweDAxZGQsMHgwM2RkLDB4MDNkZSwweDA3ZTMsMHgwN2U0LDB4MDdlNSwweDBmZWEsCisgICAgMHgwZmViLDB4MWZlZiwweDNmZjMsMHg3ZmY1LDB4MDFkZSwweDAxZGYsMHgwMWUwLDB4MDNkZiwweDAzZTAsMHgwM2UxLDB4MDdlNiwweDA3ZTcsCisgICAgMHgwZmVjLDB4MWZmMCwweDBmZWQsMHgzZmY0LDB4N2ZmNiwweGZmZjgsMHgwMWUxLDB4MDFlMiwweDAzZTIsMHgwM2UzLDB4MDNlNCwweDAzZTUsCisgICAgMHgwN2U4LDB4MGZlZSwweDBmZWYsMHgzZmY1LDB4M2ZmNiwweGZmZjksMHhmZmZhLDB4ZmZmYSwweDAxZTMsMHgwMWU0LDB4MDNlNiwweDAzZTcsCisgICAgMHgwN2U5LDB4MDdlYSwweDBmZjAsMHgxZmYxLDB4MWZmMiwweDNmZjcsMHgzZmY4LDB4N2ZmNywweDdmZjcsMHhmZmZhLDB4MDNlOCwweDAzZTksCisgICAgMHgwM2VhLDB4MDdlYiwweDA3ZWMsMHgwZmYxLDB4MGZmMiwweDFmZjMsMHg3ZmY4LDB4N2ZmOSwweGZmZmIsMHgzZmY4LDB4N2ZmNywweDdmZjcsCisgICAgMHgwN2VkLDB4MDdlZSwweDA3ZWYsMHgwZmYzLDB4MWZmNCwweDFmZjUsMHgxZmY2LDB4N2ZmYSwweGZmZmMsMHhmZmZkLDB4ZmZmYiwweGZmZmIsCisgICAgMHgzZmY4LDB4N2ZmNywweDA3ZjAsMHgwN2YxLDB4MGZmNCwweDFmZjcsMHgxZmY4LDB4M2ZmOSwweDdmZmIsMHhmZmZlLDB4ZmZmZiwKK307CisKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY3ZoX2h1ZmZiaXRzMVs5N10gPSB7CisgICAgMSwgNCwgNSwgNiwgNywgOCwgOCwgOSwgMTAsIDEwLCA0LCA1LAorICAgIDYsIDcsIDcsIDgsIDgsIDksIDksIDExLCA1LCA1LCA2LCA3LAorICAgIDgsIDgsIDksIDksIDEwLCAxMSwgNiwgNiwgNywgOCwgOCwgOSwKKyAgICA5LCAxMCwgMTEsIDEyLCA3LCA3LCA4LCA4LCA5LCA5LCAxMCwgMTEsCisgICAgMTEsIDEzLCA4LCA4LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMiwgMTQsCisgICAgOCwgOCwgOCwgOSwgMTAsIDExLCAxMSwgMTIsIDEzLCAxNSwgOSwgOSwKKyAgICA5LCAxMCwgMTEsIDEyLCAxMiwgMTQsIDE0LCAwLCA5LCA5LCA5LCAxMCwKKyAgICAxMSwgMTIsIDE0LCAxNiwgMCwgMCwgMTAsIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAxNiwKK307CisKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGN2aF9odWZmY29kZXMxWzk3XSA9IHsKKyAgICAweDAwMDAsMHgwMDA4LDB4MDAxNCwweDAwMzAsMHgwMDZhLDB4MDBlMiwweDAwZTMsMHgwMWU0LDB4MDNlYywweDAzZWQsMHgwMDA5LDB4MDAxNSwKKyAgICAweDAwMzEsMHgwMDZiLDB4MDA2YywweDAwZTQsMHgwMGU1LDB4MDFlNSwweDAxZTYsMHgwN2YwLDB4MDAxNiwweDAwMTcsMHgwMDMyLDB4MDA2ZCwKKyAgICAweDAwZTYsMHgwMGU3LDB4MDFlNywweDAxZTgsMHgwM2VlLDB4MDdmMSwweDAwMzMsMHgwMDM0LDB4MDA2ZSwweDAwZTgsMHgwMGU5LDB4MDFlOSwKKyAgICAweDAxZWEsMHgwM2VmLDB4MDdmMiwweDBmZjYsMHgwMDZmLDB4MDA3MCwweDAwZWEsMHgwMGViLDB4MDFlYiwweDAxZWMsMHgwM2YwLDB4MDdmMywKKyAgICAweDA3ZjQsMHgxZmZhLDB4MDBlYywweDAwZWQsMHgwMGVlLDB4MDFlZCwweDAxZWUsMHgwM2YxLDB4MDNmMiwweDA3ZjUsMHgwZmY3LDB4M2ZmYSwKKyAgICAweDAwZWYsMHgwMGYwLDB4MDBmMSwweDAxZWYsMHgwM2YzLDB4MDdmNiwweDA3ZjcsMHgwZmY4LDB4MWZmYiwweDdmZmUsMHgwMWYwLDB4MDFmMSwKKyAgICAweDAxZjIsMHgwM2Y0LDB4MDdmOCwweDBmZjksMHgwZmZhLDB4M2ZmYiwweDNmZmMsMHgwMDAwLDB4MDFmMywweDAxZjQsMHgwMWY1LDB4MDNmNSwKKyAgICAweDA3ZjksMHgwZmZiLDB4M2ZmZCwweGZmZmUsMHgwMDAwLDB4MDAwMCwweDAzZjYsMHgwM2Y3LDB4MDdmYSwweDBmZmMsMHgxZmZjLDB4M2ZmZSwKKyAgICAweGZmZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjdmhfaHVmZmJpdHMyWzQ4XSA9IHsKKyAgICAxLCA0LCA1LCA3LCA4LCA5LCAxMCwgMywgNCwgNSwgNywgOCwKKyAgICA5LCAxMCwgNSwgNSwgNiwgNywgOCwgMTAsIDEwLCA3LCA2LCA3LAorICAgIDgsIDksIDEwLCAxMiwgOCwgOCwgOCwgOSwgMTAsIDEyLCAxNCwgOCwKKyAgICA5LCA5LCAxMCwgMTEsIDE1LCAxNiwgOSwgMTAsIDExLCAxMiwgMTMsIDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGN2aF9odWZmY29kZXMyWzQ4XSA9IHsKKyAgICAweDAwMDAsMHgwMDBhLDB4MDAxOCwweDAwNzQsMHgwMGYyLDB4MDFmNCwweDAzZjYsMHgwMDA0LDB4MDAwYiwweDAwMTksMHgwMDc1LDB4MDBmMywKKyAgICAweDAxZjUsMHgwM2Y3LDB4MDAxYSwweDAwMWIsMHgwMDM4LDB4MDA3NiwweDAwZjQsMHgwM2Y4LDB4MDNmOSwweDAwNzcsMHgwMDM5LDB4MDA3OCwKKyAgICAweDAwZjUsMHgwMWY2LDB4MDNmYSwweDBmZmMsMHgwMGY2LDB4MDBmNywweDAwZjgsMHgwMWY3LDB4MDNmYiwweDBmZmQsMHgzZmZlLDB4MDBmOSwKKyAgICAweDAxZjgsMHgwMWY5LDB4MDNmYywweDA3ZmMsMHg3ZmZlLDB4ZmZmZSwweDAxZmEsMHgwM2ZkLDB4MDdmZCwweDBmZmUsMHgxZmZlLDB4ZmZmZiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGN2aF9odWZmYml0czNbNjA3XSA9IHsKKyAgICAyLCA0LCA2LCA4LCAxMCwgNSwgNSwgNiwgOCwgMTAsIDcsIDgsCisgICAgOCwgMTAsIDEyLCA5LCA5LCAxMCwgMTIsIDE1LCAxMCwgMTEsIDEzLCAxNiwKKyAgICAxNiwgNSwgNiwgOCwgMTAsIDExLCA1LCA2LCA4LCAxMCwgMTIsIDcsCisgICAgNywgOCwgMTAsIDEzLCA5LCA5LCAxMCwgMTIsIDE1LCAxMiwgMTEsIDEzLAorICAgIDE2LCAxNiwgNywgOSwgMTAsIDEyLCAxNSwgNywgOCwgMTAsIDEyLCAxMywKKyAgICA5LCA5LCAxMSwgMTMsIDE2LCAxMSwgMTEsIDEyLCAxNCwgMTYsIDEyLCAxMiwKKyAgICAxNCwgMTYsIDAsIDksIDExLCAxMiwgMTYsIDE2LCA5LCAxMCwgMTMsIDE1LAorICAgIDE2LCAxMCwgMTEsIDEyLCAxNiwgMTYsIDEzLCAxMywgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE1LCAxNiwgMCwgMTEsIDEzLCAxNiwgMTYsIDE1LCAxMSwgMTMsIDE1LAorICAgIDE2LCAxNiwgMTMsIDEzLCAxNiwgMTYsIDAsIDE0LCAxNiwgMTYsIDE2LCAwLAorICAgIDE2LCAxNiwgMCwgMCwgMCwgNCwgNiwgOCwgMTAsIDEzLCA2LCA2LAorICAgIDgsIDEwLCAxMywgOSwgOCwgMTAsIDEyLCAxNiwgMTAsIDEwLCAxMSwgMTUsCisgICAgMTYsIDEzLCAxMiwgMTQsIDE2LCAxNiwgNSwgNiwgOCwgMTEsIDEzLCA2LAorICAgIDYsIDgsIDEwLCAxMywgOCwgOCwgOSwgMTEsIDE0LCAxMCwgMTAsIDEyLAorICAgIDEyLCAxNiwgMTMsIDEyLCAxMywgMTUsIDE2LCA3LCA4LCA5LCAxMiwgMTYsCisgICAgNywgOCwgMTAsIDEyLCAxNCwgOSwgOSwgMTAsIDEzLCAxNiwgMTEsIDEwLAorICAgIDEyLCAxNSwgMTYsIDEzLCAxMywgMTYsIDE2LCAwLCA5LCAxMSwgMTMsIDE2LAorICAgIDE2LCA5LCAxMCwgMTIsIDE1LCAxNiwgMTAsIDExLCAxMywgMTYsIDE2LCAxMywKKyAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDAsIDExLCAxMywgMTYsCisgICAgMTYsIDE2LCAxMSwgMTMsIDE2LCAxNiwgMTYsIDEyLCAxMywgMTUsIDE2LCAwLAorICAgIDE2LCAxNiwgMTYsIDE2LCAwLCAxNiwgMTYsIDAsIDAsIDAsIDYsIDgsCisgICAgMTEsIDEzLCAxNiwgOCwgOCwgMTAsIDEyLCAxNiwgMTEsIDEwLCAxMSwgMTMsCisgICAgMTYsIDEyLCAxMywgMTMsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDAsIDYsCisgICAgOCwgMTAsIDEzLCAxNiwgOCwgOCwgMTAsIDEyLCAxNiwgMTAsIDEwLCAxMSwKKyAgICAxMywgMTYsIDEzLCAxMiwgMTMsIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTYsIDAsCisgICAgOCwgOSwgMTEsIDEzLCAxNiwgOCwgOSwgMTEsIDE2LCAxNCwgMTAsIDEwLAorICAgIDEyLCAxNSwgMTYsIDEyLCAxMiwgMTMsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsCisgICAgMCwgMTAsIDEyLCAxNSwgMTYsIDE2LCAxMCwgMTIsIDEyLCAxNCwgMTYsIDEyLAorICAgIDEyLCAxMywgMTYsIDE2LCAxNCwgMTUsIDE2LCAxNiwgMCwgMTYsIDE2LCAxNiwKKyAgICAwLCAwLCAxMiwgMTUsIDE1LCAxNiwgMCwgMTMsIDEzLCAxNiwgMTYsIDAsCisgICAgMTQsIDE2LCAxNiwgMTYsIDAsIDE2LCAxNiwgMTYsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgOCwgMTAsIDEzLCAxNSwgMTYsIDEwLCAxMSwgMTMsIDE2LAorICAgIDE2LCAxMywgMTMsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMCwgOCwgMTAsIDExLCAxNSwgMTYsIDksIDEwLCAxMiwKKyAgICAxNiwgMTYsIDEyLCAxMiwgMTUsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAwLCA5LCAxMSwgMTQsIDE2LCAxNiwgMTAsIDExLAorICAgIDEzLCAxNiwgMTYsIDE0LCAxMywgMTQsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTYsCisgICAgMCwgMTYsIDE2LCAxNiwgMCwgMCwgMTEsIDEzLCAxNiwgMTYsIDE2LCAxMSwKKyAgICAxMywgMTUsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDAsIDE2LCAxNiwgMTYsCisgICAgMTYsIDAsIDE2LCAxNiwgMCwgMCwgMCwgMTUsIDE2LCAxNiwgMTYsIDAsCisgICAgMTQsIDE2LCAxNiwgMTYsIDAsIDE2LCAxNiwgMTYsIDAsIDAsIDE2LCAxNiwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA5LCAxMywgMTYsIDE2LAorICAgIDE2LCAxMSwgMTMsIDE2LCAxNiwgMTYsIDE0LCAxNSwgMTYsIDE2LCAwLCAxNSwKKyAgICAxNiwgMTYsIDE2LCAwLCAxNiwgMTYsIDAsIDAsIDAsIDksIDEzLCAxNSwKKyAgICAxNSwgMTYsIDEyLCAxMywgMTQsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDAsCisgICAgMTYsIDE2LCAxNiwgMTYsIDAsIDE2LCAxNiwgMCwgMCwgMCwgMTEsIDEzLAorICAgIDE1LCAxNiwgMCwgMTIsIDE0LCAxNiwgMTYsIDAsIDE2LCAxNiwgMTYsIDE2LAorICAgIDAsIDE2LCAxNiwgMTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDE2LAorICAgIDE2LCAxNiwgMTYsIDAsIDE2LCAxNiwgMTYsIDE2LCAwLCAxNiwgMTYsIDE2LAorICAgIDAsIDAsIDE2LCAxNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAxNiwgMTYsIDAsIDAsIDAsIDE2LCAxNiwKK307CisKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGN2aF9odWZmY29kZXMzWzYwN10gPSB7CisgICAgMHgwMDAwLDB4MDAwNCwweDAwMjIsMHgwMGM2LDB4MDNiMCwweDAwMGMsMHgwMDBkLDB4MDAyMywweDAwYzcsMHgwM2IxLDB4MDA1YywweDAwYzgsCisgICAgMHgwMGM5LDB4MDNiMiwweDBmYTQsMHgwMWMyLDB4MDFjMywweDAzYjMsMHgwZmE1LDB4N2Y3MiwweDAzYjQsMHgwN2IyLDB4MWY5YSwweGZmMjQsCisgICAgMHhmZjI1LDB4MDAwZSwweDAwMjQsMHgwMGNhLDB4MDNiNSwweDA3YjMsMHgwMDBmLDB4MDAyNSwweDAwY2IsMHgwM2I2LDB4MGZhNiwweDAwNWQsCisgICAgMHgwMDVlLDB4MDBjYywweDAzYjcsMHgxZjliLDB4MDFjNCwweDAxYzUsMHgwM2I4LDB4MGZhNywweDdmNzMsMHgwZmE4LDB4MDdiNCwweDFmOWMsCisgICAgMHhmZjI2LDB4ZmYyNywweDAwNWYsMHgwMWM2LDB4MDNiOSwweDBmYTksMHg3Zjc0LDB4MDA2MCwweDAwY2QsMHgwM2JhLDB4MGZhYSwweDFmOWQsCisgICAgMHgwMWM3LDB4MDFjOCwweDA3YjUsMHgxZjllLDB4ZmYyOCwweDA3YjYsMHgwN2I3LDB4MGZhYiwweDNmYTIsMHhmZjI5LDB4MGZhYywweDBmYWQsCisgICAgMHgzZmEzLDB4ZmYyYSwweDNmYTIsMHgwMWM5LDB4MDdiOCwweDBmYWUsMHhmZjJiLDB4ZmYyYywweDAxY2EsMHgwM2JiLDB4MWY5ZiwweDdmNzUsCisgICAgMHhmZjJkLDB4MDNiYywweDA3YjksMHgwZmFmLDB4ZmYyZSwweGZmMmYsMHgxZmEwLDB4MWZhMSwweGZmMzAsMHhmZjMxLDB4ZmYzMiwweGZmMzMsCisgICAgMHhmZjM0LDB4N2Y3NiwweGZmMzUsMHhmZjMxLDB4MDdiYSwweDFmYTIsMHhmZjM2LDB4ZmYzNywweDdmNzcsMHgwN2JiLDB4MWZhMywweDdmNzgsCisgICAgMHhmZjM4LDB4ZmYzOSwweDFmYTQsMHgxZmE1LDB4ZmYzYSwweGZmM2IsMHhmZjJlLDB4M2ZhNCwweGZmM2MsMHhmZjNkLDB4ZmYzZSwweGZmMzEsCisgICAgMHhmZjNmLDB4ZmY0MCwweGZmMzAsMHhmZjMxLDB4ZmYzMSwweDAwMDUsMHgwMDI2LDB4MDBjZSwweDAzYmQsMHgxZmE2LDB4MDAyNywweDAwMjgsCisgICAgMHgwMGNmLDB4MDNiZSwweDFmYTcsMHgwMWNiLDB4MDBkMCwweDAzYmYsMHgwZmIwLDB4ZmY0MSwweDAzYzAsMHgwM2MxLDB4MDdiYywweDdmNzksCisgICAgMHhmZjQyLDB4MWZhOCwweDBmYjEsMHgzZmE1LDB4ZmY0MywweGZmNDQsMHgwMDEwLDB4MDAyOSwweDAwZDEsMHgwN2JkLDB4MWZhOSwweDAwMmEsCisgICAgMHgwMDJiLDB4MDBkMiwweDAzYzIsMHgxZmFhLDB4MDBkMywweDAwZDQsMHgwMWNjLDB4MDdiZSwweDNmYTYsMHgwM2MzLDB4MDNjNCwweDBmYjIsCisgICAgMHgwZmIzLDB4ZmY0NSwweDFmYWIsMHgwZmI0LDB4MWZhYywweDdmN2EsMHhmZjQ2LDB4MDA2MSwweDAwZDUsMHgwMWNkLDB4MGZiNSwweGZmNDcsCisgICAgMHgwMDYyLDB4MDBkNiwweDAzYzUsMHgwZmI2LDB4M2ZhNywweDAxY2UsMHgwMWNmLDB4MDNjNiwweDFmYWQsMHhmZjQ4LDB4MDdiZiwweDAzYzcsCisgICAgMHgwZmI3LDB4N2Y3YiwweGZmNDksMHgxZmFlLDB4MWZhZiwweGZmNGEsMHhmZjRiLDB4N2Y3YiwweDAxZDAsMHgwN2MwLDB4MWZiMCwweGZmNGMsCisgICAgMHhmZjRkLDB4MDFkMSwweDAzYzgsMHgwZmI4LDB4N2Y3YywweGZmNGUsMHgwM2M5LDB4MDdjMSwweDFmYjEsMHhmZjRmLDB4ZmY1MCwweDFmYjIsCisgICAgMHgwZmI5LDB4ZmY1MSwweGZmNTIsMHhmZjUzLDB4ZmY1NCwweGZmNTUsMHhmZjU2LDB4ZmY1NywweGZmNTIsMHgwN2MyLDB4MWZiMywweGZmNTgsCisgICAgMHhmZjU5LDB4ZmY1YSwweDA3YzMsMHgxZmI0LDB4ZmY1YiwweGZmNWMsMHhmZjVkLDB4MGZiYSwweDFmYjUsMHg3ZjdkLDB4ZmY1ZSwweGZmNGYsCisgICAgMHhmZjVmLDB4ZmY2MCwweGZmNjEsMHhmZjYyLDB4ZmY1MiwweGZmNjMsMHhmZjY0LDB4ZmY1MSwweGZmNTIsMHhmZjUyLDB4MDAyYywweDAwZDcsCisgICAgMHgwN2M0LDB4MWZiNiwweGZmNjUsMHgwMGQ4LDB4MDBkOSwweDAzY2EsMHgwZmJiLDB4ZmY2NiwweDA3YzUsMHgwM2NiLDB4MDdjNiwweDFmYjcsCisgICAgMHhmZjY3LDB4MGZiYywweDFmYjgsMHgxZmI5LDB4N2Y3ZSwweGZmNjgsMHhmZjY5LDB4ZmY2YSwweDNmYTgsMHhmZjZiLDB4N2Y3ZSwweDAwMmQsCisgICAgMHgwMGRhLDB4MDNjYywweDFmYmEsMHhmZjZjLDB4MDBkYiwweDAwZGMsMHgwM2NkLDB4MGZiZCwweGZmNmQsMHgwM2NlLDB4MDNjZiwweDA3YzcsCisgICAgMHgxZmJiLDB4ZmY2ZSwweDFmYmMsMHgwZmJlLDB4MWZiZCwweGZmNmYsMHhmZjcwLDB4M2ZhOSwweDNmYWEsMHgzZmFiLDB4ZmY3MSwweGZmNmYsCisgICAgMHgwMGRkLDB4MDFkMiwweDA3YzgsMHgxZmJlLDB4ZmY3MiwweDAwZGUsMHgwMWQzLDB4MDdjOSwweGZmNzMsMHgzZmFjLDB4MDNkMCwweDAzZDEsCisgICAgMHgwZmJmLDB4N2Y3ZiwweGZmNzQsMHgwZmMwLDB4MGZjMSwweDFmYmYsMHhmZjc1LDB4ZmY3NiwweDdmODAsMHhmZjc3LDB4ZmY3OCwweGZmNzksCisgICAgMHhmZjc1LDB4MDNkMiwweDBmYzIsMHg3ZjgxLDB4ZmY3YSwweGZmN2IsMHgwM2QzLDB4MGZjMywweDBmYzQsMHgzZmFkLDB4ZmY3YywweDBmYzUsCisgICAgMHgwZmM2LDB4MWZjMCwweGZmN2QsMHhmZjdlLDB4M2ZhZSwweDdmODIsMHhmZjdmLDB4ZmY4MCwweGZmODAsMHhmZjgxLDB4ZmY4MiwweGZmODMsCisgICAgMHhmZjgwLDB4ZmY4MCwweDBmYzcsMHg3ZjgzLDB4N2Y4NCwweGZmODQsMHhmZjdhLDB4MWZjMSwweDFmYzIsMHhmZjg1LDB4ZmY4NiwweDNmYWQsCisgICAgMHgzZmFmLDB4ZmY4NywweGZmODgsMHhmZjg5LDB4ZmY3ZCwweGZmOGEsMHhmZjhiLDB4ZmY4YywweGZmODAsMHhmZjgwLDB4M2ZhZSwweDdmODIsCisgICAgMHhmZjdmLDB4ZmY4MCwweGZmODAsMHgwMGRmLDB4MDNkNCwweDFmYzMsMHg3Zjg1LDB4ZmY4ZCwweDAzZDUsMHgwN2NhLDB4MWZjNCwweGZmOGUsCisgICAgMHhmZjhmLDB4MWZjNSwweDFmYzYsMHgzZmIwLDB4ZmY5MCwweGZmOTEsMHhmZjkyLDB4ZmY5MywweGZmOTQsMHhmZjk1LDB4ZmY5NiwweGZmOTcsCisgICAgMHhmZjk4LDB4ZmY5OSwweGZmOWEsMHhmZjk1LDB4MDBlMCwweDAzZDYsMHgwN2NiLDB4N2Y4NiwweGZmOWIsMHgwMWQ0LDB4MDNkNywweDBmYzgsCisgICAgMHhmZjljLDB4ZmY5ZCwweDBmYzksMHgwZmNhLDB4N2Y4NywweGZmOWUsMHhmZjlmLDB4ZmZhMCwweDNmYjEsMHhmZmExLDB4ZmZhMiwweGZmYTMsCisgICAgMHhmZmE0LDB4ZmZhNSwweGZmYTYsMHhmZmE3LDB4ZmZhMiwweDAxZDUsMHgwN2NjLDB4M2ZiMiwweGZmYTgsMHhmZmE5LDB4MDNkOCwweDA3Y2QsCisgICAgMHgxZmM3LDB4ZmZhYSwweGZmYWIsMHgzZmIzLDB4MWZjOCwweDNmYjQsMHhmZmFjLDB4ZmZhZCwweGZmYWUsMHg3Zjg4LDB4N2Y4OSwweGZmYWYsCisgICAgMHhmZmFmLDB4ZmZiMCwweGZmYjEsMHhmZmIyLDB4ZmZhZiwweGZmYWYsMHgwN2NlLDB4MWZjOSwweGZmYjMsMHhmZmI0LDB4ZmZiNSwweDA3Y2YsCisgICAgMHgxZmNhLDB4N2Y4YSwweGZmYjYsMHhmZmI3LDB4MWZjYiwweGZmYjgsMHhmZmI5LDB4ZmZiYSwweGZmYmEsMHhmZmJiLDB4ZmZiYywweGZmYmQsCisgICAgMHhmZmJlLDB4ZmZiZSwweGZmYmYsMHhmZmMwLDB4ZmZiZCwweGZmYmUsMHhmZmJlLDB4N2Y4YiwweGZmYzEsMHhmZmMyLDB4ZmZjMywweGZmYjQsCisgICAgMHgzZmI1LDB4ZmZjNCwweGZmYzUsMHhmZmM2LDB4ZmZiNiwweGZmYzcsMHhmZmM4LDB4ZmZjOSwweGZmYmEsMHhmZmJhLDB4ZmZjYSwweGZmY2IsCisgICAgMHhmZmJkLDB4ZmZiZSwweGZmYmUsMHhmZmJiLDB4ZmZiYywweGZmYmQsMHhmZmJlLDB4ZmZiZSwweDAxZDYsMHgxZmNjLDB4ZmZjYywweGZmY2QsCisgICAgMHhmZmNlLDB4MDdkMCwweDFmY2QsMHhmZmNmLDB4ZmZkMCwweGZmZDEsMHgzZmI2LDB4N2Y4YywweGZmZDIsMHhmZmQzLDB4ZmY5MCwweDdmOGQsCisgICAgMHhmZmQ0LDB4ZmZkNSwweGZmZDYsMHhmZjk1LDB4ZmZkNywweGZmZDgsMHhmZjk0LDB4ZmY5NSwweGZmOTUsMHgwMWQ3LDB4MWZjZSwweDdmOGUsCisgICAgMHg3ZjhmLDB4ZmZkOSwweDBmY2IsMHgxZmNmLDB4M2ZiNywweGZmZGEsMHhmZmRiLDB4ZmZkYywweDdmOTAsMHhmZmRkLDB4ZmZkZSwweGZmOWUsCisgICAgMHhmZmRmLDB4ZmZlMCwweGZmZTEsMHhmZmUyLDB4ZmZhMiwweGZmZTMsMHhmZmU0LDB4ZmZhMSwweGZmYTIsMHhmZmEyLDB4MDdkMSwweDFmZDAsCisgICAgMHg3ZjkxLDB4ZmZlNSwweGZmYTgsMHgwZmNjLDB4M2ZiOCwweGZmZTYsMHhmZmU3LDB4ZmZhYSwweGZmZTgsMHhmZmU5LDB4ZmZlYSwweGZmZWIsCisgICAgMHhmZmFjLDB4ZmZlYywweGZmZWQsMHhmZmVlLDB4ZmZhZiwweGZmYWYsMHhmZmFlLDB4N2Y4OCwweDdmODksMHhmZmFmLDB4ZmZhZiwweGZmZWYsCisgICAgMHhmZmYwLDB4ZmZmMSwweGZmZjIsMHhmZmI0LDB4ZmZmMywweGZmZjQsMHhmZmY1LDB4ZmZmNiwweGZmYjYsMHhmZmY3LDB4ZmZmOCwweGZmZjksCisgICAgMHhmZmJhLDB4ZmZiYSwweGZmZmEsMHhmZmZiLDB4ZmZiZCwweGZmYmUsMHhmZmJlLDB4ZmZiYiwweGZmYmMsMHhmZmJkLDB4ZmZiZSwweGZmYmUsCisgICAgMHhmZmZjLDB4ZmZmZCwweGZmYjMsMHhmZmI0LDB4ZmZiNCwweGZmZmUsMHhmZmZmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY3ZoX2h1ZmZiaXRzNFsyNDZdID0geworICAgIDIsIDQsIDcsIDEwLCA0LCA1LCA3LCAxMCwgNywgOCwgMTAsIDE0LAorICAgIDExLCAxMSwgMTUsIDE1LCA0LCA1LCA5LCAxMiwgNSwgNSwgOCwgMTIsCisgICAgOCwgNywgMTAsIDE1LCAxMSwgMTEsIDE1LCAxNSwgNywgOSwgMTIsIDE1LAorICAgIDgsIDgsIDEyLCAxNSwgMTAsIDEwLCAxMywgMTUsIDE0LCAxNCwgMTUsIDAsCisgICAgMTEsIDEzLCAxNSwgMTUsIDExLCAxMywgMTUsIDE1LCAxNCwgMTUsIDE1LCAwLAorICAgIDE1LCAxNSwgMCwgMCwgNCwgNSwgOSwgMTMsIDUsIDYsIDksIDEzLAorICAgIDksIDksIDExLCAxNSwgMTQsIDEzLCAxNSwgMTUsIDQsIDYsIDksIDEyLAorICAgIDUsIDYsIDksIDEzLCA5LCA4LCAxMSwgMTUsIDEzLCAxMiwgMTUsIDE1LAorICAgIDcsIDksIDEyLCAxNSwgNywgOCwgMTEsIDE1LCAxMCwgMTAsIDE0LCAxNSwKKyAgICAxNCwgMTUsIDE1LCAwLCAxMCwgMTIsIDE1LCAxNSwgMTEsIDEzLCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMCwgMTUsIDE1LCAwLCAwLCA2LCA5LCAxMywgMTQsCisgICAgOCwgOSwgMTIsIDE1LCAxMiwgMTIsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMCwKKyAgICA3LCA5LCAxMywgMTUsIDgsIDksIDEyLCAxNSwgMTEsIDEyLCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMCwgOSwgMTEsIDE1LCAxNSwgOSwgMTEsIDE1LCAxNSwKKyAgICAxNCwgMTQsIDE1LCAwLCAxNSwgMTUsIDAsIDAsIDE0LCAxNSwgMTUsIDAsCisgICAgMTQsIDE1LCAxNSwgMCwgMTUsIDE1LCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDksIDEyLCAxNSwgMTUsIDEyLCAxMywgMTUsIDE1LCAxNSwgMTUsIDE1LCAwLAorICAgIDE1LCAxNSwgMCwgMCwgMTAsIDEyLCAxNSwgMTUsIDEyLCAxNCwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDAsIDE1LCAxNSwgMCwgMCwgMTQsIDE1LCAxNSwgMCwKKyAgICAxNSwgMTUsIDE1LCAwLCAxNSwgMTUsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMTUsIDE1LCAwLCAwLCAxNSwgMTUsCit9OworCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjdmhfaHVmZmNvZGVzNFsyNDZdID0geworICAgIDB4MDAwMCwweDAwMDQsMHgwMDZjLDB4MDNlNiwweDAwMDUsMHgwMDEyLDB4MDA2ZCwweDAzZTcsMHgwMDZlLDB4MDBlOCwweDAzZTgsMHgzZmM0LAorICAgIDB4MDdlMCwweDA3ZTEsMHg3ZmE0LDB4N2ZhNSwweDAwMDYsMHgwMDEzLDB4MDFlMiwweDBmZGEsMHgwMDE0LDB4MDAxNSwweDAwZTksMHgwZmRiLAorICAgIDB4MDBlYSwweDAwNmYsMHgwM2U5LDB4N2ZhNiwweDA3ZTIsMHgwN2UzLDB4N2ZhNywweDdmYTgsMHgwMDcwLDB4MDFlMywweDBmZGMsMHg3ZmE5LAorICAgIDB4MDBlYiwweDAwZWMsMHgwZmRkLDB4N2ZhYSwweDAzZWEsMHgwM2ViLDB4MWZkNiwweDdmYWIsMHgzZmM1LDB4M2ZjNiwweDdmYWMsMHgxZmQ2LAorICAgIDB4MDdlNCwweDFmZDcsMHg3ZmFkLDB4N2ZhZSwweDA3ZTUsMHgxZmQ4LDB4N2ZhZiwweDdmYjAsMHgzZmM3LDB4N2ZiMSwweDdmYjIsMHgxZmQ2LAorICAgIDB4N2ZiMywweDdmYjQsMHgxZmQ2LDB4MWZkNiwweDAwMDcsMHgwMDE2LDB4MDFlNCwweDFmZDksMHgwMDE3LDB4MDAzMiwweDAxZTUsMHgxZmRhLAorICAgIDB4MDFlNiwweDAxZTcsMHgwN2U2LDB4N2ZiNSwweDNmYzgsMHgxZmRiLDB4N2ZiNiwweDdmYjcsMHgwMDA4LDB4MDAzMywweDAxZTgsMHgwZmRlLAorICAgIDB4MDAxOCwweDAwMzQsMHgwMWU5LDB4MWZkYywweDAxZWEsMHgwMGVkLDB4MDdlNywweDdmYjgsMHgxZmRkLDB4MGZkZiwweDdmYjksMHg3ZmJhLAorICAgIDB4MDA3MSwweDAxZWIsMHgwZmUwLDB4N2ZiYiwweDAwNzIsMHgwMGVlLDB4MDdlOCwweDdmYmMsMHgwM2VjLDB4MDNlZCwweDNmYzksMHg3ZmJkLAorICAgIDB4M2ZjYSwweDdmYmUsMHg3ZmJmLDB4M2ZjOSwweDAzZWUsMHgwZmUxLDB4N2ZjMCwweDdmYzEsMHgwN2U5LDB4MWZkZSwweDdmYzIsMHg3ZmMzLAorICAgIDB4N2ZjNCwweDdmYzUsMHg3ZmM2LDB4M2ZjOSwweDdmYzcsMHg3ZmM4LDB4M2ZjOSwweDNmYzksMHgwMDM1LDB4MDFlYywweDFmZGYsMHgzZmNiLAorICAgIDB4MDBlZiwweDAxZWQsMHgwZmUyLDB4N2ZjOSwweDBmZTMsMHgwZmU0LDB4N2ZjYSwweDdmY2IsMHg3ZmNjLDB4N2ZjZCwweDdmY2UsMHg3ZmNhLAorICAgIDB4MDA3MywweDAxZWUsMHgxZmUwLDB4N2ZjZiwweDAwZjAsMHgwMWVmLDB4MGZlNSwweDdmZDAsMHgwN2VhLDB4MGZlNiwweDdmZDEsMHg3ZmQyLAorICAgIDB4N2ZkMywweDdmZDQsMHg3ZmQ1LDB4N2ZkMSwweDAxZjAsMHgwN2ViLDB4N2ZkNiwweDdmZDcsMHgwMWYxLDB4MDdlYywweDdmZDgsMHg3ZmQ5LAorICAgIDB4M2ZjYywweDNmY2QsMHg3ZmRhLDB4N2ZkYSwweDdmZGIsMHg3ZmRjLDB4N2ZkYSwweDdmZGEsMHgzZmNlLDB4N2ZkZCwweDdmZGUsMHg3ZmQ2LAorICAgIDB4M2ZjZiwweDdmZGYsMHg3ZmUwLDB4N2ZkOCwweDdmZTEsMHg3ZmUyLDB4N2ZkYSwweDdmZGEsMHgzZmNjLDB4M2ZjZCwweDdmZGEsMHg3ZmRhLAorICAgIDB4MDFmMiwweDBmZTcsMHg3ZmUzLDB4N2ZlNCwweDBmZTgsMHgxZmUxLDB4N2ZlNSwweDdmZTYsMHg3ZmU3LDB4N2ZlOCwweDdmZTksMHg3ZmNhLAorICAgIDB4N2ZlYSwweDdmZWIsMHg3ZmNhLDB4N2ZjYSwweDAzZWYsMHgwZmU5LDB4N2ZlYywweDdmZWQsMHgwZmVhLDB4M2ZkMCwweDdmZWUsMHg3ZmVmLAorICAgIDB4N2ZmMCwweDdmZjEsMHg3ZmYyLDB4N2ZkMSwweDdmZjMsMHg3ZmY0LDB4N2ZkMSwweDdmZDEsMHgzZmQxLDB4N2ZmNSwweDdmZjYsMHg3ZmQ2LAorICAgIDB4N2ZmNywweDdmZjgsMHg3ZmY5LDB4N2ZkOCwweDdmZmEsMHg3ZmZiLDB4N2ZkYSwweDdmZGEsMHgzZmNjLDB4M2ZjZCwweDdmZGEsMHg3ZmRhLAorICAgIDB4N2ZmYywweDdmZmQsMHg3ZmQ2LDB4N2ZkNiwweDdmZmUsMHg3ZmZmLAorfTsKKworCitzdGF0aWMgY29uc3QgdWludDhfdCBjdmhfaHVmZmJpdHM1WzIzMF0gPSB7CisgICAgMiwgNCwgOCwgNCwgNSwgOSwgOSwgMTAsIDE0LCA0LCA2LCAxMSwKKyAgICA1LCA2LCAxMiwgMTAsIDExLCAxNSwgOSwgMTEsIDE1LCAxMCwgMTMsIDE1LAorICAgIDE0LCAxNSwgMCwgNCwgNiwgMTIsIDYsIDcsIDEyLCAxMiwgMTIsIDE1LAorICAgIDUsIDcsIDEzLCA2LCA3LCAxMywgMTIsIDEzLCAxNSwgMTAsIDEyLCAxNSwKKyAgICAxMSwgMTMsIDE1LCAxNSwgMTUsIDAsIDgsIDEzLCAxNSwgMTEsIDEyLCAxNSwKKyAgICAxNSwgMTUsIDAsIDEwLCAxMywgMTUsIDEyLCAxNSwgMTUsIDE1LCAxNSwgMCwKKyAgICAxNSwgMTUsIDAsIDE1LCAxNSwgMCwgMCwgMCwgMCwgNCwgNSwgMTEsCisgICAgNSwgNywgMTIsIDExLCAxMiwgMTUsIDYsIDcsIDEzLCA3LCA4LCAxNCwKKyAgICAxMiwgMTQsIDE1LCAxMSwgMTMsIDE1LCAxMiwgMTMsIDE1LCAxNSwgMTUsIDAsCisgICAgNSwgNiwgMTMsIDcsIDgsIDE1LCAxMiwgMTQsIDE1LCA2LCA4LCAxNCwKKyAgICA3LCA4LCAxNSwgMTQsIDE1LCAxNSwgMTIsIDEyLCAxNSwgMTIsIDEzLCAxNSwKKyAgICAxNSwgMTUsIDAsIDksIDEzLCAxNSwgMTIsIDEzLCAxNSwgMTUsIDE1LCAwLAorICAgIDExLCAxMywgMTUsIDEzLCAxMywgMTUsIDE1LCAxNSwgMCwgMTQsIDE1LCAwLAorICAgIDE1LCAxNSwgMCwgMCwgMCwgMCwgOCwgMTAsIDE1LCAxMSwgMTIsIDE1LAorICAgIDE1LCAxNSwgMCwgMTAsIDEyLCAxNSwgMTIsIDEzLCAxNSwgMTUsIDE1LCAwLAorICAgIDE0LCAxNSwgMCwgMTUsIDE1LCAwLCAwLCAwLCAwLCA4LCAxMiwgMTUsCisgICAgMTIsIDEzLCAxNSwgMTUsIDE1LCAwLCAxMSwgMTMsIDE1LCAxMywgMTUsIDE1LAorICAgIDE1LCAxNSwgMCwgMTUsIDE1LCAwLCAxNSwgMTUsIDAsIDAsIDAsIDAsCisgICAgMTQsIDE1LCAwLCAxNSwgMTUsIDAsIDAsIDAsIDAsIDE1LCAxNSwgMCwKKyAgICAxNSwgMTUsCit9OworCisKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGN2aF9odWZmY29kZXM1WzIzMF0gPSB7CisgICAgMHgwMDAwLDB4MDAwNCwweDAwZjAsMHgwMDA1LDB4MDAxMiwweDAxZjAsMHgwMWYxLDB4MDNlOCwweDNmY2UsMHgwMDA2LDB4MDAzMCwweDA3ZGUsCisgICAgMHgwMDEzLDB4MDAzMSwweDBmZDIsMHgwM2U5LDB4MDdkZiwweDdmYjAsMHgwMWYyLDB4MDdlMCwweDdmYjEsMHgwM2VhLDB4MWZkMiwweDdmYjIsCisgICAgMHgzZmNmLDB4N2ZiMywweDAwMzEsMHgwMDA3LDB4MDAzMiwweDBmZDMsMHgwMDMzLDB4MDA3MCwweDBmZDQsMHgwZmQ1LDB4MGZkNiwweDdmYjQsCisgICAgMHgwMDE0LDB4MDA3MSwweDFmZDMsMHgwMDM0LDB4MDA3MiwweDFmZDQsMHgwZmQ3LDB4MWZkNSwweDdmYjUsMHgwM2ViLDB4MGZkOCwweDdmYjYsCisgICAgMHgwN2UxLDB4MWZkNiwweDdmYjcsMHg3ZmI4LDB4N2ZiOSwweDAwNzIsMHgwMGYxLDB4MWZkNywweDdmYmEsMHgwN2UyLDB4MGZkOSwweDdmYmIsCisgICAgMHg3ZmJjLDB4N2ZiZCwweDAwNzAsMHgwM2VjLDB4MWZkOCwweDdmYmUsMHgwZmRhLDB4N2ZiZiwweDdmYzAsMHg3ZmMxLDB4N2ZjMiwweDAwNzIsCisgICAgMHg3ZmMzLDB4N2ZjNCwweDAwNzEsMHg3ZmM1LDB4N2ZjNiwweDAwNzIsMHgwMDM0LDB4MDA3MiwweDAwNzIsMHgwMDA4LDB4MDAxNSwweDA3ZTMsCisgICAgMHgwMDE2LDB4MDA3MywweDBmZGIsMHgwN2U0LDB4MGZkYywweDdmYzcsMHgwMDM1LDB4MDA3NCwweDFmZDksMHgwMDc1LDB4MDBmMiwweDNmZDAsCisgICAgMHgwZmRkLDB4M2ZkMSwweDdmYzgsMHgwN2U1LDB4MWZkYSwweDdmYzksMHgwZmRlLDB4MWZkYiwweDdmY2EsMHg3ZmNiLDB4N2ZjYywweDAwZjIsCisgICAgMHgwMDE3LDB4MDAzNiwweDFmZGMsMHgwMDc2LDB4MDBmMywweDdmY2QsMHgwZmRmLDB4M2ZkMiwweDdmY2UsMHgwMDM3LDB4MDBmNCwweDNmZDMsCisgICAgMHgwMDc3LDB4MDBmNSwweDdmY2YsMHgzZmQ0LDB4N2ZkMCwweDdmZDEsMHgwZmUwLDB4MGZlMSwweDdmZDIsMHgwZmUyLDB4MWZkZCwweDdmZDMsCisgICAgMHg3ZmQ0LDB4N2ZkNSwweDAwZjUsMHgwMWYzLDB4MWZkZSwweDdmZDYsMHgwZmUzLDB4MWZkZiwweDdmZDcsMHg3ZmQ4LDB4N2ZkOSwweDAwZjMsCisgICAgMHgwN2U2LDB4MWZlMCwweDdmZGEsMHgxZmUxLDB4MWZlMiwweDdmZGIsMHg3ZmRjLDB4N2ZkZCwweDAwZjUsMHgzZmQ1LDB4N2ZkZSwweDAwZjQsCisgICAgMHg3ZmRmLDB4N2ZlMCwweDAwZjUsMHgwMDc3LDB4MDBmNSwweDAwZjUsMHgwMGY2LDB4MDNlZCwweDdmZTEsMHgwN2U3LDB4MGZlNCwweDdmZTIsCisgICAgMHg3ZmUzLDB4N2ZlNCwweDAwNzMsMHgwM2VlLDB4MGZlNSwweDdmZTUsMHgwZmU2LDB4MWZlMywweDdmZTYsMHg3ZmU3LDB4N2ZlOCwweDAwZjIsCisgICAgMHgzZmQ2LDB4N2ZlOSwweDAwNzQsMHg3ZmVhLDB4N2ZlYiwweDAwZjIsMHgwMDc1LDB4MDBmMiwweDAwZjIsMHgwMGY3LDB4MGZlNywweDdmZWMsCisgICAgMHgwZmU4LDB4MWZlNCwweDdmZWQsMHg3ZmVlLDB4N2ZlZiwweDAwZjMsMHgwN2U4LDB4MWZlNSwweDdmZjAsMHgxZmU2LDB4N2ZmMSwweDdmZjIsCisgICAgMHg3ZmYzLDB4N2ZmNCwweDAwZjUsMHg3ZmY1LDB4N2ZmNiwweDAwZjQsMHg3ZmY3LDB4N2ZmOCwweDAwZjUsMHgwMDc3LDB4MDBmNSwweDAwZjUsCisgICAgMHgzZmQ3LDB4N2ZmOSwweDAwMzYsMHg3ZmZhLDB4N2ZmYiwweDAwZjMsMHgwMDc2LDB4MDBmMywweDAwZjMsMHg3ZmZjLDB4N2ZmZCwweDAwMDAsCisgICAgMHg3ZmZlLDB4N2ZmZiwKK307CisKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY3ZoX2h1ZmZiaXRzNlszMl0gPSB7CisgICAgIDEsICA0LCAgNCwgIDYsICA0LCAgNiwgIDYsICA4LCAgNCwgIDYsICA2LCAgOCwKKyAgICAgNiwgIDksICA4LCAxMCwgIDQsICA2LCAgNywgIDgsICA2LCAgOSwgIDgsIDExLAorICAgICA2LCAgOSwgIDgsIDEwLCAgOCwgMTAsICA5LCAgMTEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY3ZoX2h1ZmZjb2RlczZbMzJdID0geworICAgIDB4MDAwMCwweDAwMDgsMHgwMDA5LDB4MDAzNCwweDAwMGEsMHgwMDM1LDB4MDAzNiwweDAwZjYsMHgwMDBiLDB4MDAzNywweDAwMzgsMHgwMGY3LAorICAgIDB4MDAzOSwweDAxZmEsMHgwMGY4LDB4MDNmYywweDAwMGMsMHgwMDNhLDB4MDA3YSwweDAwZjksMHgwMDNiLDB4MDFmYiwweDAwZmEsMHgwN2ZlLAorICAgIDB4MDAzYywweDAxZmMsMHgwMGZiLDB4MDNmZCwweDAwZmMsMHgwM2ZlLDB4MDFmZCwweDA3ZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QqIGNvbnN0IGN2aF9odWZmY29kZXNbN10gPSB7CisgICAgY3ZoX2h1ZmZjb2RlczAsIGN2aF9odWZmY29kZXMxLCBjdmhfaHVmZmNvZGVzMiwgY3ZoX2h1ZmZjb2RlczMsCisgICAgY3ZoX2h1ZmZjb2RlczQsIGN2aF9odWZmY29kZXM1LCBjdmhfaHVmZmNvZGVzNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90KiBjb25zdCBjdmhfaHVmZmJpdHNbN10gPSB7CisgICAgY3ZoX2h1ZmZiaXRzMCwgY3ZoX2h1ZmZiaXRzMSwgY3ZoX2h1ZmZiaXRzMiwgY3ZoX2h1ZmZiaXRzMywKKyAgICBjdmhfaHVmZmJpdHM0LCBjdmhfaHVmZmJpdHM1LCBjdmhfaHVmZmJpdHM2LAorfTsKKworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2NwbF9odWZmY29kZXMyWzNdID0geworICAgIDB4MDIsMHgwMCwweDAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNjcGxfaHVmZmNvZGVzM1s3XSA9IHsKKyAgICAweDNlLDB4MWUsMHgwMiwweDAwLDB4MDYsMHgwZSwweDNmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNjcGxfaHVmZmNvZGVzNFsxNV0gPSB7CisgICAgMHhmYywweGZkLDB4N2MsMHgzYywweDFjLDB4MGMsMHgwNCwweDAwLDB4MDUsMHgwZCwweDFkLDB4M2QsCisgICAgMHg3ZCwweGZlLDB4ZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2NwbF9odWZmY29kZXM1WzMxXSA9IHsKKyAgICAweDAzZjgsMHgwM2Y5LDB4MDNmYSwweDAzZmIsMHgwMWY4LDB4MDFmOSwweDAwZjgsMHgwMGY5LDB4MDA3OCwweDAwNzksMHgwMDM4LDB4MDAzOSwKKyAgICAweDAwMTgsMHgwMDE5LDB4MDAwNCwweDAwMDAsMHgwMDA1LDB4MDAxYSwweDAwMWIsMHgwMDNhLDB4MDAzYiwweDAwN2EsMHgwMDdiLDB4MDBmYSwKKyAgICAweDAwZmIsMHgwMWZhLDB4MDFmYiwweDAzZmMsMHgwM2ZkLDB4MDNmZSwweDAzZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2NwbF9odWZmY29kZXM2WzYzXSA9IHsKKyAgICAweDAwMDQsMHgwMDA1LDB4MDAwNSwweDAwMDYsMHgwMDA2LDB4MDAwNywweDAwMDcsMHgwMDA3LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOCwKKyAgICAweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwKKyAgICAweDAwMGIsMHgwMDBiLDB4MDAwYywweDAwMGQsMHgwMDBlLDB4MDAwZSwweDAwMTAsMHgwMDAwLDB4MDAwYSwweDAwMTgsMHgwMDE5LDB4MDAzNiwKKyAgICAweDAwMzcsMHgwMDc0LDB4MDA3NSwweDAwNzYsMHgwMDc3LDB4MDBmNCwweDAwZjUsMHgwMGY2LDB4MDBmNywweDAxZjUsMHgwMWY2LDB4MDFmNywKKyAgICAweDAxZjgsMHgwM2Y2LDB4MDNmNywweDAzZjgsMHgwM2Y5LDB4MDNmYSwweDA3ZmEsMHgwN2ZiLDB4MDdmYywweDA3ZmQsMHgwZmZkLDB4MWZmZCwKKyAgICAweDNmZmQsMHgzZmZlLDB4ZmZmZiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNjcGxfaHVmZmJpdHMyWzNdID0geworICAgIDIsMSwyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2NwbF9odWZmYml0czNbN10gPSB7CisgICAgNiw1LDIsMSwzLDQsNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNjcGxfaHVmZmJpdHM0WzE1XSA9IHsKKyAgICA4LDgsNyw2LDUsNCwzLDEsMyw0LDUsNiw3LDgsOCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNjcGxfaHVmZmJpdHM1WzMxXSA9IHsKKyAgICAxMCwxMCwxMCwxMCw5LDksOCw4LDcsNyw2LDYsCisgICAgNSw1LDMsMSwzLDUsNSw2LDYsNyw3LDgsCisgICAgOCw5LDksMTAsMTAsMTAsMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjY3BsX2h1ZmZiaXRzNls2M10gPSB7CisgICAgMTYsMTUsMTQsMTMsMTIsMTEsMTEsMTEsMTEsMTAsMTAsMTAsCisgICAgMTAsOSw5LDksOSw5LDgsOCw4LDgsNyw3LAorICAgIDcsNyw2LDYsNSw1LDMsMSw0LDUsNSw2LAorICAgIDYsNyw3LDcsNyw4LDgsOCw4LDksOSw5LAorICAgIDksMTAsMTAsMTAsMTAsMTAsMTEsMTEsMTEsMTEsMTIsMTMsCisgICAgMTQsMTQsMTYsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QqIGNvbnN0IGNjcGxfaHVmZmNvZGVzWzVdID0geworICAgIGNjcGxfaHVmZmNvZGVzMixjY3BsX2h1ZmZjb2RlczMsCisgICAgY2NwbF9odWZmY29kZXM0LGNjcGxfaHVmZmNvZGVzNSxjY3BsX2h1ZmZjb2RlczYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90KiBjb25zdCBjY3BsX2h1ZmZiaXRzWzVdID0geworICAgIGNjcGxfaHVmZmJpdHMyLGNjcGxfaHVmZmJpdHMzLAorICAgIGNjcGxfaHVmZmJpdHM0LGNjcGxfaHVmZmJpdHM1LGNjcGxfaHVmZmJpdHM2Cit9OworCisKKy8vQ291cGxpbmcgdGFibGVzCisKK3N0YXRpYyBjb25zdCBpbnQgY3BsYmFuZFs1MV0gPSB7CisgICAgMCwxLDIsMyw0LDUsNiw3LDgsOSwKKyAgICAxMCwxMSwxMSwxMiwxMiwxMywxMywxNCwxNCwxNCwKKyAgICAxNSwxNSwxNSwxNSwxNiwxNiwxNiwxNiwxNiwxNywKKyAgICAxNywxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOCwKKyAgICAxOCwxOCwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwKKyAgICAxOSwKK307CisKKy8vIFRoZSAxIGFuZCAwIGF0IHRoZSBiZWdpbm5pbmcvZW5kIGFyZSB0byBwcmV2ZW50IG92ZXJmbG93cyB3aXRoCisvLyBiaXRzdHJlYW0tcmVhZCBpbmRleGVzLiBFLmcuIGlmIG5fYml0cz01LCB3ZSBjYW4gYWNjZXNzIGFueQorLy8gaW5kZXggZnJvbSBbMSwgKDE8PG5fYml0cyldIGZvciB0aGUgZmlyc3QgZGVjb3VwbGluZyBjb2VmZiwKKy8vIGFuZCAoMTw8bl9iaXRzKS1jb2VmZjEgYXMgaW5kZXggZm9yIGNvZWZmMiwgaS5lLjoKKy8vIGNvZWZmMV9pZHggPSBbMSwgMzJdLCBhbmQgY29lZmYyX2lkeCA9IFswLCAzMV0uCisvLyBUaGVzZSB2YWx1ZXMgYXJlbid0IHBhcnQgb2YgdGhlIHRhYmxlcyBpbiB0aGUgb3JpZ2luYWwgYmluYXJ5LgorCitzdGF0aWMgY29uc3QgZmxvYXQgY3Bsc2NhbGUyWzVdID0geworMSwKKzAuOTUzMDIwNjMyMjY2OTk4LDAuNzA3MTA2NzY5MDg0OTMsMC4zMDI5MDU0NDAzMzA1MDUsCiswLAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGNwbHNjYWxlM1s5XSA9IHsKKzEsCiswLjk4MTI3OTc5MDQwMTQ1OSwwLjkzNjk5NzU5MjQ0OTE4OCwwLjg3NTkzNDQ4MTYyMDc4OSwwLjcwNzEwNjc2OTA4NDkzLAorMC40ODI0MzAwNDA4MzYzMzQsMC4zNDkzMzU4MTk0ODI4MDMsMC4xOTI1ODc0Nzk5NDg5OTcsCiswLAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGNwbHNjYWxlNFsxN10gPSB7CisxLAorMC45OTE0ODY3MjgxOTEzNzYsMC45NzMyNDkwMTgxOTIyOTEsMC45NTMwMjA2MzIyNjY5OTgsMC45MzAxMzM1MjE1NTY4NTQsCiswLjkwMzQ1MzIzMDg1Nzg0OSwwLjg3MDc0NjE5NTMxNjMxNSwwLjgyNjE4MDQ1ODA2ODg0OCwwLjcwNzEwNjc2OTA4NDkzLAorMC41NjM0MDU1NzMzNjgwNzMsMC40OTE3MzI3NDYzNjI2ODYsMC40Mjg2ODY2MTg4MDQ5MzIsMC4zNjcyMjE0NzQ2NDc1MjIsCiswLjMwMjkwNTQ0MDMzMDUwNSwwLjIyOTc1Mjg5ODIxNjI0OCwwLjEzMDIwNzg5NjIzMjYwNSwKKzAsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgY3Bsc2NhbGU1WzMzXSA9IHsKKzEsCiswLjk5NTkyNjM4MDE1NzQ3MSwwLjk4NzUxNzU5NTI5MTEzOCwwLjk3ODcyNjQ0NjYyODU3MSwwLjk2OTUwNTcyNzI5MTEwNywKKzAuOTU5Nzk3Nzk5NTg3MjUsMC45NDk1MzEyNTcxNTI1NTcsMC45Mzg2MTYyMTYxODI3MDksMC45MjY5MzYxNDk1OTcxNjgsCiswLjkxNDMzNjIwNDUyODgwOSwwLjkwMDYwMjg3NzE0MDA0NSwwLjg4NTQyNjkzODUzMzc4MywwLjg2ODMzMTg0OTU3NTA0MywKKzAuODQ4NTEwODYxMzk2NzksMC44MjQzODE3Njg3MDM0NjEsMC43OTE4MzM0MDA3MjYzMTgsMC43MDcxMDY3NjkwODQ5MywKKzAuNjEwNzM3MTQ0OTQ3MDUyLDAuNTY2MDM0MTk3ODA3MzEyLDAuNTI5MTc3OTYzNzMzNjczLDAuNDk1OTgzNjMwNDE4Nzc3LAorMC40NjQ3Nzg1NDI1MTg2MTYsMC40MzQ2NDI5NDA3NTk2NTksMC40MDQ5NTU4NjM5NTI2MzcsMC4zNzUyMTkxMzY0NzY1MTcsCiswLjM0NDk2MzIyMjc0MjA4MSwwLjMxMzY3MjMzMzk1NTc2NSwwLjI4MDY5MjQyODM1MDQ0OSwwLjI0NTA2ODY4NDIyMDMxNCwKKzAuMjA1MTY5NTI4NzIyNzYzLDAuMTU3NTA4ODY0OTk4ODE3LDAuMDkwMTcwMDEwOTI0MzM5MywKKzAsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgY3Bsc2NhbGU2WzY1XSA9IHsKKzEsCiswLjk5ODAwNTkyNjYwOTAzOSwwLjk5Mzk1Njc0NDY3MDg2OCwwLjk4OTgyMjUwNjkwNDYwMiwwLjk4NTU5ODU2NDE0Nzk0OSwKKzAuOTgxMjc5NzkwNDAxNDU5LDAuOTc2ODYwNzAyMDM3ODExLDAuOTcyMzM1MDQwNTY5MzA1LDAuOTY3Njk2MTMwMjc1NzI2LAorMC45NjI5MzY0NjA5NzE4MzIsMC45NTgwNDc3NDc2MTIwMDAsMC45NTMwMjA2MzIyNjY5OTgsMC45NDc4NDQ2ODQxMjM5OTMsCiswLjk0MjUwODE2MTA2Nzk2MywwLjkzNjk5NzU5MjQ0OTE4OCwwLjkzMTI5NzcxOTQ3ODYwNywwLjkyNTM5MDg5OTE4MTM2NiwKKzAuOTE5MjU2NjI3NTU5NjYyLDAuOTEyODcwOTQzNTQ2Mjk1LDAuOTA2MjA1Mjk2NTE2NDE4LDAuODk5MjI1NTkyNjEzMjIwLAorMC44OTE4OTAzNDcwMDM5MzcsMC44ODQxNDgyNDAwODk0MTcsMC44NzU5MzQ0ODE2MjA3ODksMC44NjcxNjU2ODQ3MDAwMTIsCiswLjg1NzczMDg2NTQ3ODUxNiwwLjg0NzQ3NzM3NjQ2MTAyOSwwLjgzNjE4NDY4MDQ2MTg4NCwwLjgyMzUxMzMyOTAyOTA4MywKKzAuODA4ODkwMjIzNTAzMTEzLDAuNzkxMTk0MTQwOTExMTAyLDAuNzY3NTIwMDcwMDc1OTg5LDAuNzA3MTA2NzY5MDg0OTMwLAorMC42NDEwMjQ4ODc1NjE3OTgsMC42MTE1NjUwNTM0NjI5ODIsMC41ODc5NTk3MDY3ODMyOTUsMC41NjcyOTY5ODE4MTE1MjMsCiswLjU0ODQ0ODAyNjE4MDI2NywwLjUzMDgzMTUxNTc4OTAzMiwwLjUxNDA5ODk0MjI3OTgxNiwwLjQ5ODAxOTc1NDg4NjYyNywKKzAuNDgyNDMwMDQwODM2MzM0LDAuNDY3MjA2NDc4MTE4ODk2LDAuNDUyMjUxNjcyNzQ0NzUxLDAuNDM3NDg1MTg4MjQ1NzczLAorMC40MjI4Mzc5NzI2NDA5OTEsMC40MDgyNDgyNzU1MTg0MTcsMC4zOTM2NTg3NTcyMDk3NzgsMC4zNzkwMTQwNzQ4MDIzOTksCiswLjM2NDI1ODg4NTM4MzYwNiwwLjM0OTMzNTgxOTQ4MjgwMywwLjMzNDE4MzE4NjI5MjY0OCwwLjMxODczMjU1OTY4MDkzOSwKKzAuMzAyOTA1NDQwMzMwNTA1LDAuMjg2NjA4Njk1OTgzODg3LDAuMjY5NzI4MzAyOTU1NjI3LDAuMjUyMTE5NDIxOTU4OTIzLAorMC4yMzM1OTA2MzI2NzcwNzgsMC4yMTM4NzY2NDk3MzczNTgsMC4xOTI1ODc0Nzk5NDg5OTcsMC4xNjkxMDE5Mzg2MDUzMDksCiswLjE0MjMwNzMyNjE5NzYyNCwwLjEwOTc3MjI2NDk1NzQyOCwwLjA2MzExOTgyODcwMTAxOTMsCiswLAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0KiBjb25zdCBjcGxzY2FsZXNbNV0gPSB7CisgICAgY3Bsc2NhbGUyLCBjcGxzY2FsZTMsIGNwbHNjYWxlNCwgY3Bsc2NhbGU1LCBjcGxzY2FsZTYsCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19DT09LREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jb3B5X2Jsb2NrLmggYi9mZm1wZWcvbGliYXZjb2RlYy9jb3B5X2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkNDUxZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NvcHlfYmxvY2suaApAQCAtMCwwICsxLDg5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19DT1BZX0JMT0NLX0gKKyNkZWZpbmUgQVZDT0RFQ19DT1BZX0JMT0NLX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9ibG9jazIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKQoreworICAgIGludCBpOworICAgIGZvcihpPTA7IGk8aDsgaSsrKQorICAgIHsKKyAgICAgICAgQVZfQ09QWTE2VShkc3QsIHNyYyk7CisgICAgICAgIGRzdCs9ZHN0U3RyaWRlOworICAgICAgICBzcmMrPXNyY1N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Jsb2NrNCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50IGgpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBBVl9DT1BZMzJVKGRzdCwgc3JjKTsKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZTsKKyAgICAgICAgc3JjICs9IHNyY1N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Jsb2NrOCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50IGgpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBBVl9DT1BZNjRVKGRzdCwgc3JjKTsKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZTsKKyAgICAgICAgc3JjICs9IHNyY1N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Jsb2NrOSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50IGgpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBBVl9DT1BZNjRVKGRzdCwgc3JjKTsKKyAgICAgICAgZHN0WzhdID0gc3JjWzhdOworICAgICAgICBkc3QgICArPSBkc3RTdHJpZGU7CisgICAgICAgIHNyYyAgICs9IHNyY1N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Jsb2NrMTYodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgQVZfQ09QWTEyOFUoZHN0LCBzcmMpOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlOworICAgICAgICBzcmMgKz0gc3JjU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfYmxvY2sxNyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50IGgpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBBVl9DT1BZMTI4VShkc3QsIHNyYyk7CisgICAgICAgIGRzdFsxNl0gPSBzcmNbMTZdOworICAgICAgICBkc3QgICAgKz0gZHN0U3RyaWRlOworICAgICAgICBzcmMgICAgKz0gc3JjU3RyaWRlOworICAgIH0KK30KKworI2VuZGlmIC8qIEFWQ09ERUNfQ09QWV9CTE9DS19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jb3NfdGFibGVnZW4uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Nvc190YWJsZWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjgzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9jb3NfdGFibGVnZW4uYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogR2VuZXJhdGUgYSBoZWFkZXIgZmlsZSBmb3IgaGFyZGNvZGVkIGZmX2Nvc18qIHRhYmxlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBSZWltYXIgRMO2ZmZpbmdlciA8UmVpbWFyLkRvZWZmaW5nZXJAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNkZWZpbmUgQklUUyAxNgorI2RlZmluZSBGTE9BVEZNVCAiJS4xOGUiCisjZGVmaW5lIEZJWEVERk1UICIlNmQiCisKK3N0YXRpYyBpbnQgY2xpcF9mMTUoaW50IHYpCit7CisgICAgcmV0dXJuIHYgPCAtMzI3NjcgPyAtMzI3NjcgOgorICAgICAgICAgICB2ID4gIDMyNzY3ID8gIDMyNzY3IDoKKyAgICAgICAgICAgdjsKK30KKworc3RhdGljIHZvaWQgcHJpbnR2YWwoZG91YmxlIHZhbCwgaW50IGZpeGVkKQoreworICAgIGlmIChmaXhlZCkgeworICAgICAgICAvKiBscmludCgpIGlzbid0IGFsd2F5cyBhdmFpbGFibGUsIHNvIHJvdW5kIGFuZCBjYXN0IG1hbnVhbGx5LiAqLworICAgICAgICBkb3VibGUgbmV3X3ZhbCA9IHZhbCAqIChkb3VibGUpICgxIDw8IDE1KTsKKworICAgICAgICBuZXdfdmFsID0gbmV3X3ZhbCA+PSAwID8gZmxvb3IobmV3X3ZhbCArIDAuNSkgOiBjZWlsKG5ld192YWwgLSAwLjUpOworCisgICAgICAgIHByaW50ZigiICJGSVhFREZNVCIsIiwgY2xpcF9mMTUoKGxvbmcgaW50KSBuZXdfdmFsKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIgIkZMT0FURk1UIiwiLCB2YWwpOworICAgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgZG9fc2luID0gYXJnYyA+IDEgJiYgIXN0cmNtcChhcmd2WzFdLCAic2luIik7CisgICAgaW50IGZpeGVkICA9IGFyZ2MgPiAxICYmICBzdHJzdHIoYXJndlsxXSwgImZpeGVkIik7CisgICAgZG91YmxlICgqZnVuYykoZG91YmxlKSA9IGRvX3NpbiA/IHNpbiA6IGNvczsKKworICAgIHByaW50ZigiLyogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gKi9cbiIpOworICAgIHByaW50ZigiI2RlZmluZSBGRlRfRkxPQVQgJWRcbiIsICFmaXhlZCk7CisgICAgcHJpbnRmKCIjaW5jbHVkZSBcImxpYmF2Y29kZWMvJXNcIlxuIiwgZG9fc2luID8gInJkZnQuaCIgOiAiZmZ0LmgiKTsKKyAgICBmb3IgKGkgPSA0OyBpIDw9IEJJVFM7IGkrKykgeworICAgICAgICBpbnQgbSA9IDEgPDwgaTsKKyAgICAgICAgZG91YmxlIGZyZXEgPSAyKjMuMTQxNTkyNjUzNTg5NzkzMjM4NDYvbTsKKyAgICAgICAgcHJpbnRmKCIlcyglaSkgPSB7XG4gICAiLCBkb19zaW4gPyAiU0lOVEFCTEUiIDogIkNPU1RBQkxFIiwgbSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBtLzIgLSAxOyBqKyspIHsKKyAgICAgICAgICAgIGludCBpZHggPSBqID4gbS80ID8gbS8yIC0gaiA6IGo7CisgICAgICAgICAgICBpZiAoZG9fc2luICYmIGogPj0gbS80KQorICAgICAgICAgICAgICAgIGlkeCA9IG0vNCAtIGo7CisgICAgICAgICAgICBwcmludHZhbChmdW5jKGlkeCpmcmVxKSwgZml4ZWQpOworICAgICAgICAgICAgaWYgKChqICYgMykgPT0gMykKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuICAgIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnR2YWwoZnVuYyhkb19zaW4gPyAtKG0vNCAtIDEpKmZyZXEgOiBmcmVxKSwgZml4ZWQpOworICAgICAgICBwcmludGYoIlxufTtcbiIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2NwaWEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NwaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDM2Y2IzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvY3BpYS5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ1BpQSB2aWRlbyBkZWNvZGVyLgorICogQ29weXJpZ2h0IChjKSAyMDEwIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBkZWNvZGVyIGlzIGJhc2VkIG9uIHRoZSBMR1BMIGNvZGUgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3Y0bDRqLmdvb2dsZWNvZGUuY29tL3N2bi92NGw0ai90cnVuay9saWJ2aWRlby9saWJ2NGxjb252ZXJ0L2NwaWExLmMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKworI2RlZmluZSBGUkFNRV9IRUFERVJfU0laRSA2NAorI2RlZmluZSBNQUdJQ18wICAgICAgICAgMHgxOSAgICAvKio8IEZpcnN0IGhlYWRlciBieXRlICovCisjZGVmaW5lIE1BR0lDXzEgICAgICAgICAweDY4ICAgIC8qKjwgU2Vjb25kIGhlYWRlciBieXRlICovCisjZGVmaW5lIFNVQlNBTVBMRV80MjAgICAgICAwCisjZGVmaW5lIFNVQlNBTVBMRV80MjIgICAgICAxCisjZGVmaW5lIFlVVk9SREVSX1lVWVYgICAgICAwCisjZGVmaW5lIFlVVk9SREVSX1VZVlkgICAgICAxCisjZGVmaW5lIE5PVF9DT01QUkVTU0VEICAgICAwCisjZGVmaW5lIENPTVBSRVNTRUQgICAgICAgICAxCisjZGVmaW5lIE5PX0RFQ0lNQVRJT04gICAgICAwCisjZGVmaW5lIERFQ0lNQVRJT05fRU5BQiAgICAxCisjZGVmaW5lIEVPTCAgICAgICAgICAgICAweGZkICAgIC8qKjwgRW5kIE9mIExpbmUgbWFya2VyICovCisjZGVmaW5lIEVPSSAgICAgICAgICAgICAweGZmICAgIC8qKjwgRW5kIE9mIEltYWdlIG1hcmtlciAqLworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkZyYW1lICpmcmFtZTsKK30gQ3BpYUNvbnRleHQ7CisKKworc3RhdGljIGludCBjcGlhX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCogYXZwa3QpCit7CisgICAgQ3BpYUNvbnRleHQqIGNvbnN0IGNwaWEgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLGoscmV0OworCisgICAgdWludDhfdCogY29uc3QgaGVhZGVyID0gYXZwa3QtPmRhdGE7CisgICAgdWludDhfdCogc3JjOworICAgIGludCBzcmNfc2l6ZTsKKyAgICB1aW50MTZfdCBsaW5lbGVuZ3RoOworICAgIHVpbnQ4X3Qgc2tpcDsKKworICAgIEFWRnJhbWUgKmZyYW1lID0gY3BpYS0+ZnJhbWU7CisgICAgdWludDhfdCAqeSwgKnUsICp2LCAqeV9lbmQsICp1X2VuZCwgKnZfZW5kOworCisgICAgLy8gQ2hlY2sgaGVhZGVyCisgICAgaWYgKCBhdnBrdC0+c2l6ZSA8IEZSQU1FX0hFQURFUl9TSVpFCisgICAgICB8fCBoZWFkZXJbMF0gIT0gTUFHSUNfMCB8fCBoZWFkZXJbMV0gIT0gTUFHSUNfMQorICAgICAgfHwgKGhlYWRlclsxN10gIT0gU1VCU0FNUExFXzQyMCAmJiBoZWFkZXJbMTddICE9IFNVQlNBTVBMRV80MjIpCisgICAgICB8fCAoaGVhZGVyWzE4XSAhPSBZVVZPUkRFUl9ZVVlWICYmIGhlYWRlclsxOF0gIT0gWVVWT1JERVJfVVlWWSkKKyAgICAgIHx8IChoZWFkZXJbMjhdICE9IE5PVF9DT01QUkVTU0VEICYmIGhlYWRlclsyOF0gIT0gQ09NUFJFU1NFRCkKKyAgICAgIHx8IChoZWFkZXJbMjldICE9IE5PX0RFQ0lNQVRJT04gJiYgaGVhZGVyWzI5XSAhPSBERUNJTUFUSU9OX0VOQUIpCisgICAgKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBoZWFkZXIhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLy8gY3VycmVudGx5IHVuc3VwcG9ydGVkIHByb3BlcnRpZXMKKyAgICBpZiAoaGVhZGVyWzE3XSA9PSBTVUJTQU1QTEVfNDIyKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiNDoyOjIgc3Vic2FtcGxpbmciKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAoaGVhZGVyWzE4XSA9PSBZVVZPUkRFUl9VWVZZKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiWVVWIGJ5dGUgb3JkZXIgVVlWWSIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIGlmIChoZWFkZXJbMjldID09IERFQ0lNQVRJT05fRU5BQikgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIkRlY2ltYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHNyYyA9IGhlYWRlciArIEZSQU1FX0hFQURFUl9TSVpFOworICAgIHNyY19zaXplID0gYXZwa3QtPnNpemUgLSBGUkFNRV9IRUFERVJfU0laRTsKKworICAgIGlmIChoZWFkZXJbMjhdID09IE5PVF9DT01QUkVTU0VEKSB7CisgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMDsKKyAgICB9CisKKyAgICAvLyBHZXQgYnVmZmVyIGZpbGxlZCB3aXRoIHByZXZpb3VzIGZyYW1lCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIGZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisKKyAgICBmb3IgKCBpID0gMDsKKyAgICAgICAgICBpIDwgZnJhbWUtPmhlaWdodDsKKyAgICAgICAgICBpKyssIHNyYyArPSBsaW5lbGVuZ3RoLCBzcmNfc2l6ZSAtPSBsaW5lbGVuZ3RoCisgICAgKSB7CisgICAgICAgIC8vIFJlYWQgbGluZSBsZW5ndGgsIHR3byBieXRlIGxpdHRsZSBlbmRpYW4KKyAgICAgICAgbGluZWxlbmd0aCA9IEFWX1JMMTYoc3JjKTsKKyAgICAgICAgc3JjICs9IDI7CisKKyAgICAgICAgaWYgKHNyY19zaXplIDwgbGluZWxlbmd0aCkgeworICAgICAgICAgICAgYXZfZnJhbWVfc2V0X2RlY29kZV9lcnJvcl9mbGFncyhmcmFtZSwgRkZfREVDT0RFX0VSUk9SX0lOVkFMSURfQklUU1RSRUFNKTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJGcmFtZSBlbmRlZCB1bmV4cGVjdGVkbHkhXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChzcmNbbGluZWxlbmd0aCAtIDFdICE9IEVPTCkgeworICAgICAgICAgICAgYXZfZnJhbWVfc2V0X2RlY29kZV9lcnJvcl9mbGFncyhmcmFtZSwgRkZfREVDT0RFX0VSUk9SX0lOVkFMSURfQklUU1RSRUFNKTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJXcm9uZyBsaW5lIGxlbmd0aCAlZCBvciBsaW5lIG5vdCB0ZXJtaW5hdGVkIHByb3Blcmx5IChmb3VuZCAweCUwMngpIVxuIiwgbGluZWxlbmd0aCwgc3JjW2xpbmVsZW5ndGggLSAxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZGF0YSBwb2ludGVycy4gWSBkYXRhIGlzIG9uIGV2ZXJ5IGxpbmUuCisgICAgICAgICAqIFUgYW5kIFYgZGF0YSBvbiBldmVyeSBzZWNvbmQgbGluZQorICAgICAgICAgKi8KKyAgICAgICAgeSA9ICZmcmFtZS0+ZGF0YVswXVtpICogZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgdSA9ICZmcmFtZS0+ZGF0YVsxXVsoaSA+PiAxKSAqIGZyYW1lLT5saW5lc2l6ZVsxXV07CisgICAgICAgIHYgPSAmZnJhbWUtPmRhdGFbMl1bKGkgPj4gMSkgKiBmcmFtZS0+bGluZXNpemVbMl1dOworICAgICAgICB5X2VuZCA9IHkgKyBmcmFtZS0+bGluZXNpemVbMF0gLSAxOworICAgICAgICB1X2VuZCA9IHUgKyBmcmFtZS0+bGluZXNpemVbMV0gLSAxOworICAgICAgICB2X2VuZCA9IHYgKyBmcmFtZS0+bGluZXNpemVbMl0gLSAxOworCisgICAgICAgIGlmICgoaSAmIDEpICYmIGhlYWRlclsxN10gPT0gU1VCU0FNUExFXzQyMCkgeworICAgICAgICAgICAgLyogV2UgYXJlIG9uIGEgb2RkIGxpbmUgYW5kIDQyMCBzdWJzYW1wbGUgaXMgdXNlZC4KKyAgICAgICAgICAgICAqIE9uIHRoaXMgbGluZSBvbmx5IFkgdmFsdWVzIGFyZSBzcGVjaWZpZWQsIG9uZSBwZXIgcGl4ZWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsaW5lbGVuZ3RoIC0gMTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHkgPiB5X2VuZCkgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV9zZXRfZGVjb2RlX2Vycm9yX2ZsYWdzKGZyYW1lLCBGRl9ERUNPREVfRVJST1JfSU5WQUxJRF9CSVRTVFJFQU0pOworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRGVjb2RlZCBkYXRhIGV4Y2VlZGVkIGxpbmVzaXplIVxuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHNyY1tqXSAmIDEpICYmIGhlYWRlclsyOF0gPT0gQ09NUFJFU1NFRCkgeworICAgICAgICAgICAgICAgICAgICAvKiBJdCBzZWVtcyB0aGF0IG9kZCBsaW5lcyBhcmUgYWx3YXlzIHVuY29tcHJlc3NlZCwgYnV0CisgICAgICAgICAgICAgICAgICAgICAqIHdlIGRvIGl0IGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uIGFueXdheXMuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBza2lwID0gc3JjW2pdID4+IDE7CisgICAgICAgICAgICAgICAgICAgIHkgKz0gc2tpcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqKHkrKykgPSBzcmNbal07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGhlYWRlclsxN10gPT0gU1VCU0FNUExFXzQyMCkgeworICAgICAgICAgICAgLyogV2UgYXJlIG9uIGFuIGV2ZW4gbGluZSBhbmQgNDIwIHN1YnNhbXBsZSBpcyB1c2VkLgorICAgICAgICAgICAgICogT24gdGhpcyBsaW5lIGVhY2ggcGFpciBvZiBwaXhlbHMgaXMgZGVzY3JpYmVkIGJ5IGZvdXIgYnl0ZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsaW5lbGVuZ3RoIC0gNDsgKSB7CisgICAgICAgICAgICAgICAgaWYgKHkgKyAxID4geV9lbmQgfHwgdSA+IHVfZW5kIHx8IHYgPiB2X2VuZCkgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV9zZXRfZGVjb2RlX2Vycm9yX2ZsYWdzKGZyYW1lLCBGRl9ERUNPREVfRVJST1JfSU5WQUxJRF9CSVRTVFJFQU0pOworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRGVjb2RlZCBkYXRhIGV4Y2VlZGVkIGxpbmVzaXplIVxuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHNyY1tqXSAmIDEpICYmIGhlYWRlclsyOF0gPT0gQ09NUFJFU1NFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGFtb3VudCBvZiBwaXhlbHMgYW5kIG1vdmUgZm9yd2FyZCBvbmUgYnl0ZQorICAgICAgICAgICAgICAgICAgICBza2lwID0gc3JjW2pdID4+IDE7CisgICAgICAgICAgICAgICAgICAgIHkgKz0gc2tpcDsKKyAgICAgICAgICAgICAgICAgICAgdSArPSBza2lwID4+IDE7CisgICAgICAgICAgICAgICAgICAgIHYgKz0gc2tpcCA+PiAxOworICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGltYWdlIGRhdGEgYXMgc3BlY2lmaWVkIGFuZCBtb3ZlIGZvcndhcmQgNCBieXRlcworICAgICAgICAgICAgICAgICAgICAqKHkrKykgPSBzcmNbal07CisgICAgICAgICAgICAgICAgICAgICoodSsrKSA9IHNyY1tqKzFdOworICAgICAgICAgICAgICAgICAgICAqKHkrKykgPSBzcmNbaisyXTsKKyAgICAgICAgICAgICAgICAgICAgKih2KyspID0gc3JjW2orM107CisgICAgICAgICAgICAgICAgICAgIGogKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBjcGlhLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGNwaWFfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENwaWFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIC8vIG91dHB1dCBwaXhlbCBmb3JtYXQKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKworICAgIC8qIFRoZSBkZWZhdWx0IHRpbWViYXNlIHNldCBieSB0aGUgdjRsMiBkZW11eGVyIGxlYWRzIHRvIHByb2Jpbmcgd2hpY2ggaXMgYnVnZ3kuCisgICAgICogU2V0IHNvbWUgcmVhc29uYWJsZSB0aW1lX2Jhc2UgdG8gc2tpcCB0aGlzLgorICAgICAqLworICAgIGlmIChhdmN0eC0+dGltZV9iYXNlLm51bSA9PSAxICYmIGF2Y3R4LT50aW1lX2Jhc2UuZGVuID09IDEwMDAwMDApIHsKKyAgICAgICAgYXZjdHgtPnRpbWVfYmFzZS5udW0gPSAxOworICAgICAgICBhdmN0eC0+dGltZV9iYXNlLmRlbiA9IDYwOworICAgIH0KKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjcGlhX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENwaWFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2NwaWFfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiY3BpYSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNQaUEgdmlkZW8gZm9ybWF0IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0NQSUEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENwaWFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBjcGlhX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGNwaWFfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBjcGlhX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2NyeXN0YWxoZC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvY3J5c3RhbGhkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxYWZhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NyeXN0YWxoZC5jCkBAIC0wLDAgKzEsMTIyNiBAQAorLyoKKyAqIC0gQ3J5c3RhbEhEIGRlY29kZXIgbW9kdWxlIC0KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAxMCwyMDExIFBoaWxpcCBMYW5nZGFsZSA8ZmZtcGVnLnBoaWxpcGxAb3ZlcnQub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogLSBQcmluY2lwbGVzIG9mIE9wZXJhdGlvbiAtCisgKgorICogVGhlIENyeXN0YWxIRCBkZWNvZGVyIG9wZXJhdGVzIGF0IHRoZSBiaXRzdHJlYW0gbGV2ZWwgLSB3aGljaCBpcyBhbiBldmVuCisgKiBoaWdoZXIgbGV2ZWwgdGhhbiB0aGUgZGVjb2RpbmcgaGFyZHdhcmUgeW91IHR5cGljYWxseSBzZWUgaW4gbW9kZXJuIEdQVXMuCisgKiBUaGlzIG1lYW5zIGl0IGhhcyBhIHZlcnkgc2ltcGxlIGludGVyZmFjZSwgaW4gcHJpbmNpcGxlLiBZb3UgZmVlZCBkZW11eGVkCisgKiBwYWNrZXRzIGluIG9uZSBlbmQgYW5kIGdldCBkZWNvZGVkIHBpY3R1cmUgKGZpZWxkcy9mcmFtZXMpIG91dCB0aGUgb3RoZXIuCisgKgorICogT2YgY291cnNlLCBub3RoaW5nIGlzIGV2ZXIgdGhhdCBzaW1wbGUuIER1ZSwgYXQgdGhlIHZlcnkgbGVhc3QsIHRvIGItZnJhbWUKKyAqIGRlcGVuZGVuY2llcyBpbiB0aGUgc3VwcG9ydGVkIGZvcm1hdHMsIHRoZSBoYXJkd2FyZSBoYXMgYSBkZWxheSBiZXR3ZWVuCisgKiB3aGVuIGEgcGFja2V0IGdvZXMgaW4sIGFuZCB3aGVuIGEgcGljdHVyZSBjb21lcyBvdXQuIEZ1cnRoZXJtb3JlLCB0aGlzIGRlbGF5CisgKiBpcyBub3QganVzdCBhIGZ1bmN0aW9uIG9mIHRpbWUsIGJ1dCBhbHNvIG9uZSBvZiB0aGUgZGVwZW5kZW5jeSBvbiBhZGRpdGlvbmFsCisgKiBmcmFtZXMgYmVpbmcgZmVkIGludG8gdGhlIGRlY29kZXIgdG8gc2F0aXNmeSB0aGUgYi1mcmFtZSBkZXBlbmRlbmNpZXMuCisgKgorICogQXMgc3VjaCwgYSBwaXBlbGluZSB3aWxsIGJ1aWxkIHVwIHRoYXQgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHRoZSByZXF1aXJlZAorICogRFBCIGZvciB0aGUgZmlsZSBiZWluZyBwbGF5ZWQuIElmIHRoYXQgd2FzIGFsbCBpdCB0b29rLCB0aGluZ3Mgd291bGQgc3RpbGwKKyAqIGJlIHNpbXBsZSAtIHNvLCBvZiBjb3Vyc2UsIGl0IGlzbid0LgorICoKKyAqIFRoZSBoYXJkd2FyZSBoYXMgYSB3YXkgb2YgaW5kaWNhdGluZyB0aGF0IGEgcGljdHVyZSBpcyByZWFkeSB0byBiZSBjb3BpZWQgb3V0LAorICogYnV0IHRoaXMgaXMgdW5yZWxpYWJsZSAtIGFuZCBzb21ldGltZXMgdGhlIGF0dGVtcHQgd2lsbCBzdGlsbCBmYWlsIHNvLCBiYXNlZAorICogb24gdGVzdGluZywgdGhlIGNvZGUgd2lsbCB3YWl0IHVudGlsIDMgcGljdHVyZXMgYXJlIHJlYWR5IGJlZm9yZSBzdGFydGluZworICogdG8gY29weSBvdXQgLSBhbmQgdGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBleHRlbmRpbmcgdGhlIHBpcGVsaW5lLgorICoKKyAqIEZpbmFsbHksIHdoaWxlIGl0IGlzIHRlbXB0aW5nIHRvIHNheSB0aGF0IG9uY2UgdGhlIGRlY29kZXIgc3RhcnRzIG91dHB1dHRpbmcKKyAqIGZyYW1lcywgdGhlIHNvZnR3YXJlIHNob3VsZCBuZXZlciBmYWlsIHRvIHJldHVybiBhIGZyYW1lIGZyb20gYSBkZWNvZGUoKSwKKyAqIHRoaXMgaXMgYSBoYXJkIGFzc2VydGlvbiB0byBtYWtlLCBiZWNhdXNlIHRoZSBzdHJlYW0gbWF5IHN3aXRjaCBiZXR3ZWVuCisgKiBkaWZmZXJlbnRseSBlbmNvZGVkIGNvbnRlbnQgKG51bWJlciBvZiBiLWZyYW1lcywgaW50ZXJsYWNpbmcsIGV0Yykgd2hpY2gKKyAqIG1pZ2h0IHJlcXVpcmUgYSBsb25nZXIgcGlwZWxpbmUgdGhhbiBiZWZvcmUuIElmIHRoYXQgaGFwcGVuZWQsIHlvdSBjb3VsZAorICogZGVhZGxvY2sgdHJ5aW5nIHRvIHJldHJpZXZlIGEgZnJhbWUgdGhhdCBjYW4ndCBiZSBkZWNvZGVkIHdpdGhvdXQgZmVlZGluZworICogaW4gYWRkaXRpb25hbCBwYWNrZXRzLgorICoKKyAqIEFzIHN1Y2gsIHRoZSBjb2RlIHdpbGwgcmV0dXJuIGluIHRoZSBldmVudCB0aGF0IGEgcGljdHVyZSBjYW5ub3QgYmUgY29waWVkCisgKiBvdXQsIGxlYWRpbmcgdG8gYW4gaW5jcmVhc2UgaW4gdGhlIGxlbmd0aCBvZiB0aGUgcGlwZWxpbmUuIFRoaXMgaW4gdHVybiwKKyAqIG1lYW5zIHdlIGhhdmUgdG8gYmUgc2Vuc2l0aXZlIHRvIHRoZSB0aW1lIGl0IHRha2VzIHRvIGRlY29kZSBhIHBpY3R1cmU7CisgKiBXZSBkbyBub3Qgd2FudCB0byBnaXZlIHVwIGp1c3QgYmVjYXVzZSB0aGUgaGFyZHdhcmUgbmVlZGVkIGEgbGl0dGxlIG1vcmUKKyAqIHRpbWUgdG8gcHJlcGFyZSB0aGUgcGljdHVyZSEgRm9yIHRoaXMgcmVhc29uLCB0aGVyZSBhcmUgZGVsYXlzIGluY2x1ZGVkCisgKiBpbiB0aGUgZGVjb2RlKCkgcGF0aCB0aGF0IGVuc3VyZSB0aGF0LCB1bmRlciBub3JtYWwgY29uZGl0aW9ucywgdGhlIGhhcmR3YXJlCisgKiB3aWxsIG9ubHkgZmFpbCB0byByZXR1cm4gYSBmcmFtZSBpZiBpdCByZWFsbHkgbmVlZHMgYWRkaXRpb25hbCBwYWNrZXRzIHRvCisgKiBjb21wbGV0ZSB0aGUgZGVjb2RpbmcuCisgKgorICogRmluYWxseSwgdG8gYmUgZXhwbGljaXQsIHdlIGRvIG5vdCB3YW50IHRoZSBwaXBlbGluZSB0byBncm93IHdpdGhvdXQgYm91bmQKKyAqIGZvciB0d28gcmVhc29uczogMSkgVGhlIGhhcmR3YXJlIGNhbiBvbmx5IGJ1ZmZlciBhIGZpbml0ZSBudW1iZXIgb2YgcGFja2V0cywKKyAqIGFuZCAyKSBUaGUgY2xpZW50IGFwcGxpY2F0aW9uIG1heSBub3QgYmUgYWJsZSB0byBjb3BlIHdpdGggYXJiaXRyYXJpbHkgbG9uZworICogZGVsYXlzIGluIHRoZSB2aWRlbyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBhdWRpbyBwYXRoLiBGb3IgZXhhbXBsZS4gTVBsYXllcgorICogY2FuIG9ubHkgaGFuZGxlIGEgMjAgcGljdHVyZSBkZWxheSAoYWx0aG91Z2ggdGhpcyBpcyBhcmJpdHJhcnksIGFuZCBuZWVkcworICogdG8gYmUgZXh0ZW5kZWQgdG8gZnVsbHkgc3VwcG9ydCB0aGUgQ3J5c3RhbEhEIHdoZXJlIHRoZSBkZWxheSBjb3VsZCBiZSB1cAorICogdG8gMzIgcGljdHVyZXMgLSBjb25zaWRlciBQQUZGIEguMjY0IGNvbnRlbnQgd2l0aCAxNiBiLWZyYW1lcykuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbmNsdWRlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA2MDAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxsaWJjcnlzdGFsaGQvYmNfZHRzX3R5cGVzLmg+CisjaW5jbHVkZSA8bGliY3J5c3RhbGhkL2JjX2R0c19kZWZzLmg+CisjaW5jbHVkZSA8bGliY3J5c3RhbGhkL2xpYmNyeXN0YWxoZF9pZi5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworLyoqIFRpbWVvdXQgcGFyYW1ldGVyIHBhc3NlZCB0byBEdHNQcm9jT3V0cHV0KCkgaW4gdXMgKi8KKyNkZWZpbmUgT1VUUFVUX1BST0NfVElNRU9VVCA1MAorLyoqIFN0ZXAgYmV0d2VlbiBmYWtlIHRpbWVzdGFtcHMgcGFzc2VkIHRvIGhhcmR3YXJlIGluIHVuaXRzIG9mIDEwMG5zICovCisjZGVmaW5lIFRJTUVTVEFNUF9VTklUIDEwMDAwMAorLyoqIEluaXRpYWwgdmFsdWUgaW4gdXMgb2YgdGhlIHdhaXQgaW4gZGVjb2RlKCkgKi8KKyNkZWZpbmUgQkFTRV9XQUlUIDEwMDAwCisvKiogSW5jcmVtZW50IGluIHVzIHRvIGFkanVzdCB3YWl0IGluIGRlY29kZSgpICovCisjZGVmaW5lIFdBSVRfVU5JVCAxMDAwCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2R1bGUgcHJpdmF0ZSBkYXRhCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBSRVRfRVJST1IgICAgICAgICAgID0gLTEsCisgICAgUkVUX09LICAgICAgICAgICAgICA9IDAsCisgICAgUkVUX0NPUFlfQUdBSU4gICAgICA9IDEsCisgICAgUkVUX1NLSVBfTkVYVF9DT1BZICA9IDIsCisgICAgUkVUX0NPUFlfTkVYVF9GSUVMRCA9IDMsCit9IENvcHlSZXQ7CisKK3R5cGVkZWYgc3RydWN0IE9wYXF1ZUxpc3QgeworICAgIHN0cnVjdCBPcGFxdWVMaXN0ICpuZXh0OworICAgIHVpbnQ2NF90IGZha2VfdGltZXN0YW1wOworICAgIHVpbnQ2NF90IHJlb3JkZXJlZF9vcGFxdWU7CisgICAgdWludDhfdCBwaWNfdHlwZTsKK30gT3BhcXVlTGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQ2xhc3MgKmF2X2NsYXNzOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBVkZyYW1lICpwaWM7CisgICAgSEFORExFIGRldjsKKworICAgIHVpbnQ4X3QgKm9yaWdfZXh0cmFkYXRhOworICAgIHVpbnQzMl90IG9yaWdfZXh0cmFkYXRhX3NpemU7CisKKyAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmM7CisgICAgQVZDb2RlY1BhcnNlckNvbnRleHQgKnBhcnNlcjsKKworICAgIHVpbnQ4X3QgaXNfNzAwMTI7CisgICAgdWludDhfdCAqc3BzX3Bwc19idWY7CisgICAgdWludDMyX3Qgc3BzX3Bwc19zaXplOworICAgIHVpbnQ4X3QgaXNfbmFsOworICAgIHVpbnQ4X3Qgb3V0cHV0X3JlYWR5OworICAgIHVpbnQ4X3QgbmVlZF9zZWNvbmRfZmllbGQ7CisgICAgdWludDhfdCBza2lwX25leHRfb3V0cHV0OworICAgIHVpbnQ2NF90IGRlY29kZV93YWl0OworCisgICAgdWludDY0X3QgbGFzdF9waWN0dXJlOworCisgICAgT3BhcXVlTGlzdCAqaGVhZDsKKyAgICBPcGFxdWVMaXN0ICp0YWlsOworCisgICAgLyogT3B0aW9ucyAqLworICAgIHVpbnQzMl90IHNXaWR0aDsKKyAgICB1aW50OF90IGJmcmFtZV9idWc7Cit9IENIRENvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiY3J5c3RhbGhkX2Rvd25zY2FsZV93aWR0aCIsCisgICAgICAiVHVybiBvbiBkb3duc2NhbGluZyB0byB0aGUgc3BlY2lmaWVkIHdpZHRoIiwKKyAgICAgIG9mZnNldG9mKENIRENvbnRleHQsIHNXaWR0aCksCisgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIFVJTlQzMl9NQVgsCisgICAgICBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCB9LAorICAgIHsgTlVMTCwgfSwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIZWxwZXIgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSBCQ19NRURJQV9TVUJUWVBFIGlkMnN1YnR5cGUoQ0hEQ29udGV4dCAqcHJpdiwgZW51bSBBVkNvZGVjSUQgaWQpCit7CisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzQ6CisgICAgICAgIHJldHVybiBCQ19NU1VCVFlQRV9ESVZYOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVNNUEVHNFYzOgorICAgICAgICByZXR1cm4gQkNfTVNVQlRZUEVfRElWWDMxMTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcyVklERU86CisgICAgICAgIHJldHVybiBCQ19NU1VCVFlQRV9NUEVHMlZJREVPOworICAgIGNhc2UgQVZfQ09ERUNfSURfVkMxOgorICAgICAgICByZXR1cm4gQkNfTVNVQlRZUEVfVkMxOworICAgIGNhc2UgQVZfQ09ERUNfSURfV01WMzoKKyAgICAgICAgcmV0dXJuIEJDX01TVUJUWVBFX1dNVjM7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY0OgorICAgICAgICByZXR1cm4gcHJpdi0+aXNfbmFsID8gQkNfTVNVQlRZUEVfQVZDMSA6IEJDX01TVUJUWVBFX0gyNjQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJDX01TVUJUWVBFX0lOVkFMSUQ7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfZnJhbWVfaW5mbyhDSERDb250ZXh0ICpwcml2LCBCQ19EVFNfUFJPQ19PVVQgKm91dHB1dCkKK3sKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRZQnVmZlN6OiAldVxuIiwgb3V0cHV0LT5ZYnVmZlN6KTsKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRZQnVmZkRvbmVTejogJXVcbiIsCisgICAgICAgICAgIG91dHB1dC0+WUJ1ZmZEb25lU3opOworICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdFVWQnVmZkRvbmVTejogJXVcbiIsCisgICAgICAgICAgIG91dHB1dC0+VVZCdWZmRG9uZVN6KTsKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRUaW1lc3RhbXA6ICUiUFJJdTY0IlxuIiwKKyAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLnRpbWVTdGFtcCk7CisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0UGljdHVyZSBOdW1iZXI6ICV1XG4iLAorICAgICAgICAgICBvdXRwdXQtPlBpY0luZm8ucGljdHVyZV9udW1iZXIpOworICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdFdpZHRoOiAldVxuIiwKKyAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLndpZHRoKTsKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRIZWlnaHQ6ICV1XG4iLAorICAgICAgICAgICBvdXRwdXQtPlBpY0luZm8uaGVpZ2h0KTsKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRDaHJvbWE6IDB4JTAzeFxuIiwKKyAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLmNocm9tYV9mb3JtYXQpOworICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdFB1bGxkb3duOiAldVxuIiwKKyAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLnB1bGxkb3duKTsKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRGbGFnczogMHglMDh4XG4iLAorICAgICAgICAgICBvdXRwdXQtPlBpY0luZm8uZmxhZ3MpOworICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdEZyYW1lIFJhdGUvUmVzOiAldVxuIiwKKyAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLmZyYW1lX3JhdGUpOworICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdEFzcGVjdCBSYXRpbzogJXVcbiIsCisgICAgICAgICAgIG91dHB1dC0+UGljSW5mby5hc3BlY3RfcmF0aW8pOworICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdENvbG9yIFByaW1hcmllczogJXVcbiIsCisgICAgICAgICAgIG91dHB1dC0+UGljSW5mby5jb2xvdXJfcHJpbWFyaWVzKTsKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRNZXRhRGF0YTogJXVcbiIsCisgICAgICAgICAgIG91dHB1dC0+UGljSW5mby5waWN0dXJlX21ldGFfcGF5bG9hZCk7CisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0U2Vzc2lvbiBOdW1iZXI6ICV1XG4iLAorICAgICAgICAgICBvdXRwdXQtPlBpY0luZm8uc2Vzc19udW0pOworICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdHljb206ICV1XG4iLAorICAgICAgICAgICBvdXRwdXQtPlBpY0luZm8ueWNvbSk7CisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0Q3VzdG9tIEFzcGVjdDogJXVcbiIsCisgICAgICAgICAgIG91dHB1dC0+UGljSW5mby5jdXN0b21fYXNwZWN0X3JhdGlvX3dpZHRoX2hlaWdodCk7CisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0RnJhbWVzIHRvIERyb3A6ICV1XG4iLAorICAgICAgICAgICBvdXRwdXQtPlBpY0luZm8ubl9kcm9wKTsKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRIMjY0IFZhbGlkIEZpZWxkczogMHglMDh4XG4iLAorICAgICAgICAgICBvdXRwdXQtPlBpY0luZm8ub3RoZXIuaDI2NC52YWxpZCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcGFxdWVMaXN0IGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1aW50NjRfdCBvcGFxdWVfbGlzdF9wdXNoKENIRENvbnRleHQgKnByaXYsIHVpbnQ2NF90IHJlb3JkZXJlZF9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpY190eXBlKQoreworICAgIE9wYXF1ZUxpc3QgKm5ld05vZGUgPSBhdl9tYWxsb2N6KHNpemVvZiAoT3BhcXVlTGlzdCkpOworICAgIGlmICghbmV3Tm9kZSkgeworICAgICAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbmV3IG5vZGUgaW4gT3BhcXVlTGlzdC5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFwcml2LT5oZWFkKSB7CisgICAgICAgIG5ld05vZGUtPmZha2VfdGltZXN0YW1wID0gVElNRVNUQU1QX1VOSVQ7CisgICAgICAgIHByaXYtPmhlYWQgICAgICAgICAgICAgID0gbmV3Tm9kZTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXdOb2RlLT5mYWtlX3RpbWVzdGFtcCA9IHByaXYtPnRhaWwtPmZha2VfdGltZXN0YW1wICsgVElNRVNUQU1QX1VOSVQ7CisgICAgICAgIHByaXYtPnRhaWwtPm5leHQgICAgICAgID0gbmV3Tm9kZTsKKyAgICB9CisgICAgcHJpdi0+dGFpbCA9IG5ld05vZGU7CisgICAgbmV3Tm9kZS0+cmVvcmRlcmVkX29wYXF1ZSA9IHJlb3JkZXJlZF9vcGFxdWU7CisgICAgbmV3Tm9kZS0+cGljX3R5cGUgPSBwaWNfdHlwZTsKKworICAgIHJldHVybiBuZXdOb2RlLT5mYWtlX3RpbWVzdGFtcDsKK30KKworLyoKKyAqIFRoZSBPcGFxdWVMaXN0IGlzIGJ1aWx0IGluIGRlY29kZSBvcmRlciwgd2hpbGUgZWxlbWVudHMgd2lsbCBiZSByZW1vdmVkCisgKiBpbiBwcmVzZW50YXRpb24gb3JkZXIuIElmIGZyYW1lcyBhcmUgcmVvcmRlcmVkLCB0aGlzIG1lYW5zIHdlIG11c3QgYmUKKyAqIGFibGUgdG8gcmVtb3ZlIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB0aGUgZmlyc3QgZWxlbWVudC4KKyAqCisgKiBSZXR1cm5lZCBub2RlIG11c3QgYmUgZnJlZWQgYnkgY2FsbGVyLgorICovCitzdGF0aWMgT3BhcXVlTGlzdCAqb3BhcXVlX2xpc3RfcG9wKENIRENvbnRleHQgKnByaXYsIHVpbnQ2NF90IGZha2VfdGltZXN0YW1wKQoreworICAgIE9wYXF1ZUxpc3QgKm5vZGUgPSBwcml2LT5oZWFkOworCisgICAgaWYgKCFwcml2LT5oZWFkKSB7CisgICAgICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNyeXN0YWxIRDogQXR0ZW1wdGVkIHRvIHF1ZXJ5IG5vbi1leGlzdGVudCB0aW1lc3RhbXBzLlxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qCisgICAgICogVGhlIGZpcnN0IGVsZW1lbnQgaXMgc3BlY2lhbC1jYXNlZCBiZWNhdXNlIHdlIGhhdmUgdG8gbWFuaXB1bGF0ZQorICAgICAqIHRoZSBoZWFkIHBvaW50ZXIgcmF0aGVyIHRoYW4gdGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgaWYgKHByaXYtPmhlYWQtPmZha2VfdGltZXN0YW1wID09IGZha2VfdGltZXN0YW1wKSB7CisgICAgICAgIHByaXYtPmhlYWQgPSBub2RlLT5uZXh0OworCisgICAgICAgIGlmICghcHJpdi0+aGVhZC0+bmV4dCkKKyAgICAgICAgICAgIHByaXYtPnRhaWwgPSBwcml2LT5oZWFkOworCisgICAgICAgIG5vZGUtPm5leHQgPSBOVUxMOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBsaXN0IGlzIHByb2Nlc3NlZCBhdCBhcm0ncyBsZW5ndGggc28gdGhhdCB3ZSBoYXZlIHRoZQorICAgICAqIHByZXZpb3VzIGVsZW1lbnQgYXZhaWxhYmxlIHRvIHJld3JpdGUgaXRzIG5leHQgcG9pbnRlci4KKyAgICAgKi8KKyAgICB3aGlsZSAobm9kZS0+bmV4dCkgeworICAgICAgICBPcGFxdWVMaXN0ICpjdXJyZW50ID0gbm9kZS0+bmV4dDsKKyAgICAgICAgaWYgKGN1cnJlbnQtPmZha2VfdGltZXN0YW1wID09IGZha2VfdGltZXN0YW1wKSB7CisgICAgICAgICAgICBub2RlLT5uZXh0ID0gY3VycmVudC0+bmV4dDsKKworICAgICAgICAgICAgaWYgKCFub2RlLT5uZXh0KQorICAgICAgICAgICAgICAgcHJpdi0+dGFpbCA9IG5vZGU7CisKKyAgICAgICAgICAgIGN1cnJlbnQtPm5leHQgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub2RlID0gY3VycmVudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICJDcnlzdGFsSEQ6IENvdWxkbid0IG1hdGNoIGZha2VfdGltZXN0YW1wLlxuIik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWaWRlbyBkZWNvZGVyIEFQSSBmdW5jdGlvbiBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDSERDb250ZXh0ICpwcml2ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2Y3R4LT5oYXNfYl9mcmFtZXMgICAgID0gMDsKKyAgICBwcml2LT5sYXN0X3BpY3R1cmUgICAgICA9IC0xOworICAgIHByaXYtPm91dHB1dF9yZWFkeSAgICAgID0gMDsKKyAgICBwcml2LT5uZWVkX3NlY29uZF9maWVsZCA9IDA7CisgICAgcHJpdi0+c2tpcF9uZXh0X291dHB1dCAgPSAwOworICAgIHByaXYtPmRlY29kZV93YWl0ICAgICAgID0gQkFTRV9XQUlUOworCisgICAgYXZfZnJhbWVfdW5yZWYgKHByaXYtPnBpYyk7CisKKyAgICAvKiBGbHVzaCBtb2RlIDQgZmx1c2hlcyBhbGwgc29mdHdhcmUgYW5kIGhhcmR3YXJlIGJ1ZmZlcnMuICovCisgICAgRHRzRmx1c2hJbnB1dChwcml2LT5kZXYsIDQpOworfQorCisKK3N0YXRpYyBhdl9jb2xkIGludCB1bmluaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENIRENvbnRleHQgKnByaXYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEhBTkRMRSBkZXZpY2U7CisKKyAgICBkZXZpY2UgPSBwcml2LT5kZXY7CisgICAgRHRzU3RvcERlY29kZXIoZGV2aWNlKTsKKyAgICBEdHNDbG9zZURlY29kZXIoZGV2aWNlKTsKKyAgICBEdHNEZXZpY2VDbG9zZShkZXZpY2UpOworCisgICAgLyoKKyAgICAgKiBSZXN0b3JlIG9yaWdpbmFsIGV4dHJhZGF0YSwgc28gdGhhdCBpZiB0aGUgZGVjb2RlciBpcworICAgICAqIHJlaW5pdGlhbGlzZWQsIHRoZSBiaXRzdHJlYW0gZGV0ZWN0aW9uIGFuZCBmaWx0ZXJpbmcKKyAgICAgKiB3aWxsIHdvcmsgYXMgZXhwZWN0ZWQuCisgICAgICovCisgICAgaWYgKHByaXYtPm9yaWdfZXh0cmFkYXRhKSB7CisgICAgICAgIGF2X2ZyZWUoYXZjdHgtPmV4dHJhZGF0YSk7CisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBwcml2LT5vcmlnX2V4dHJhZGF0YTsKKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gcHJpdi0+b3JpZ19leHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgcHJpdi0+b3JpZ19leHRyYWRhdGEgPSBOVUxMOworICAgICAgICBwcml2LT5vcmlnX2V4dHJhZGF0YV9zaXplID0gMDsKKyAgICB9CisKKyAgICBhdl9wYXJzZXJfY2xvc2UocHJpdi0+cGFyc2VyKTsKKyAgICBpZiAocHJpdi0+YnNmYykgeworICAgICAgICBhdl9iaXRzdHJlYW1fZmlsdGVyX2Nsb3NlKHByaXYtPmJzZmMpOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZwcml2LT5zcHNfcHBzX2J1Zik7CisKKyAgICBhdl9mcmFtZV9mcmVlICgmcHJpdi0+cGljKTsKKworICAgIGlmIChwcml2LT5oZWFkKSB7CisgICAgICAgT3BhcXVlTGlzdCAqbm9kZSA9IHByaXYtPmhlYWQ7CisgICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICBPcGFxdWVMaXN0ICpuZXh0ID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICBhdl9mcmVlKG5vZGUpOworICAgICAgICAgIG5vZGUgPSBuZXh0OworICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQ0hEQ29udGV4dCogcHJpdjsKKyAgICBCQ19TVEFUVVMgcmV0OworICAgIEJDX0lORk9fQ1JZU1RBTCB2ZXJzaW9uOworICAgIEJDX0lOUFVUX0ZPUk1BVCBmb3JtYXQgPSB7CisgICAgICAgIC5GR1RFbmFibGUgICA9IEZBTFNFLAorICAgICAgICAuUHJvZ3Jlc3NpdmUgPSBUUlVFLAorICAgICAgICAuT3B0RmxhZ3MgICAgPSAweDgwMDAwMDAwIHwgdmRlY0ZyYW1lUmF0ZTU5Xzk0IHwgMHg0MCwKKyAgICAgICAgLndpZHRoICAgICAgID0gYXZjdHgtPndpZHRoLAorICAgICAgICAuaGVpZ2h0ICAgICAgPSBhdmN0eC0+aGVpZ2h0LAorICAgIH07CisKKyAgICBCQ19NRURJQV9TVUJUWVBFIHN1YnR5cGU7CisKKyAgICB1aW50MzJfdCBtb2RlID0gRFRTX1BMQVlCQUNLX01PREUgfAorICAgICAgICAgICAgICAgICAgICBEVFNfTE9BRF9GSUxFX1BMQVlfRlcgfAorICAgICAgICAgICAgICAgICAgICBEVFNfU0tJUF9UWF9DSEtfQ1BCIHwKKyAgICAgICAgICAgICAgICAgICAgRFRTX1BMQVlCQUNLX0RST1BfUlBUX01PREUgfAorICAgICAgICAgICAgICAgICAgICBEVFNfU0lOR0xFX1RIUkVBREVEX01PREUgfAorICAgICAgICAgICAgICAgICAgICBEVFNfREZMVF9SRVNPTFVUSU9OKHZkZWNSRVNPTFVUSU9OXzEwODBwMjNfOTc2KTsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJDcnlzdGFsSEQgSW5pdCBmb3IgJXNcbiIsCisgICAgICAgICAgIGF2Y3R4LT5jb2RlYy0+bmFtZSk7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVZVjQyMjsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGxpYnJhcnkgKi8KKyAgICBwcml2ICAgICAgICAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHByaXYtPmF2Y3R4ICAgICAgICA9IGF2Y3R4OworICAgIHByaXYtPmlzX25hbCAgICAgICA9IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYgKihhdmN0eC0+ZXh0cmFkYXRhKSA9PSAxOworICAgIHByaXYtPmxhc3RfcGljdHVyZSA9IC0xOworICAgIHByaXYtPmRlY29kZV93YWl0ICA9IEJBU0VfV0FJVDsKKyAgICBwcml2LT5waWMgICAgICAgICAgPSBhdl9mcmFtZV9hbGxvYygpOworCisgICAgc3VidHlwZSA9IGlkMnN1YnR5cGUocHJpdiwgYXZjdHgtPmNvZGVjLT5pZCk7CisgICAgc3dpdGNoIChzdWJ0eXBlKSB7CisgICAgY2FzZSBCQ19NU1VCVFlQRV9BVkMxOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90ICpkdW1teV9wOworICAgICAgICAgICAgaW50IGR1bW15X2ludDsKKworICAgICAgICAgICAgLyogQmFjayB1cCB0aGUgZXh0cmFkYXRhIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBhdCBjbG9zZSB0aW1lLiAqLworICAgICAgICAgICAgcHJpdi0+b3JpZ19leHRyYWRhdGEgPSBhdl9tYWxsb2MoYXZjdHgtPmV4dHJhZGF0YV9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBpZiAoIXByaXYtPm9yaWdfZXh0cmFkYXRhKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgY29weSBvZiBleHRyYWRhdGFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcml2LT5vcmlnX2V4dHJhZGF0YV9zaXplID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplOworICAgICAgICAgICAgbWVtY3B5KHByaXYtPm9yaWdfZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgICAgICAgICBwcml2LT5ic2ZjID0gYXZfYml0c3RyZWFtX2ZpbHRlcl9pbml0KCJoMjY0X21wNHRvYW5uZXhiIik7CisgICAgICAgICAgICBpZiAoIXByaXYtPmJzZmMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBvcGVuIHRoZSBoMjY0X21wNHRvYW5uZXhiIEJTRiFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JTRl9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9iaXRzdHJlYW1fZmlsdGVyX2ZpbHRlcihwcml2LT5ic2ZjLCBhdmN0eCwgTlVMTCwgJmR1bW15X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXlfaW50LCBOVUxMLCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgICBzdWJ0eXBlID0gQkNfTVNVQlRZUEVfSDI2NDsKKyAgICAgICAgLy8gRmFsbC10aHJvdWdoCisgICAgY2FzZSBCQ19NU1VCVFlQRV9IMjY0OgorICAgICAgICBmb3JtYXQuc3RhcnRDb2RlU3ogPSA0OworICAgICAgICAvLyBGYWxsLXRocm91Z2gKKyAgICBjYXNlIEJDX01TVUJUWVBFX1ZDMToKKyAgICBjYXNlIEJDX01TVUJUWVBFX1dWQzE6CisgICAgY2FzZSBCQ19NU1VCVFlQRV9XTVYzOgorICAgIGNhc2UgQkNfTVNVQlRZUEVfV01WQToKKyAgICBjYXNlIEJDX01TVUJUWVBFX01QRUcyVklERU86CisgICAgY2FzZSBCQ19NU1VCVFlQRV9ESVZYOgorICAgIGNhc2UgQkNfTVNVQlRZUEVfRElWWDMxMToKKyAgICAgICAgZm9ybWF0LnBNZXRhRGF0YSAgPSBhdmN0eC0+ZXh0cmFkYXRhOworICAgICAgICBmb3JtYXQubWV0YURhdGFTeiA9IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDcnlzdGFsSEQ6IFVua25vd24gY29kZWMgbmFtZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGZvcm1hdC5tU3VidHlwZSA9IHN1YnR5cGU7CisKKyAgICBpZiAocHJpdi0+c1dpZHRoKSB7CisgICAgICAgIGZvcm1hdC5iRW5hYmxlU2NhbGluZyA9IDE7CisgICAgICAgIGZvcm1hdC5TY2FsaW5nUGFyYW1zLnNXaWR0aCA9IHByaXYtPnNXaWR0aDsKKyAgICB9CisKKyAgICAvKiBHZXQgYSBkZWNvZGVyIGluc3RhbmNlICovCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNyeXN0YWxIRDogc3RhcnRpbmcgdXBcbiIpOworICAgIC8vIEluaXRpYWxpemUgdGhlIExpbmsgYW5kIERlY29kZXIgZGV2aWNlcworICAgIHJldCA9IER0c0RldmljZU9wZW4oJnByaXYtPmRldiwgbW9kZSk7CisgICAgaWYgKHJldCAhPSBCQ19TVFNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ3J5c3RhbEhEOiBEdHNEZXZpY2VPcGVuIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBEdHNDcnlzdGFsSERWZXJzaW9uKHByaXYtPmRldiwgJnZlcnNpb24pOworICAgIGlmIChyZXQgIT0gQkNfU1RTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgICAgICJDcnlzdGFsSEQ6IER0c0NyeXN0YWxIRFZlcnNpb24gZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBwcml2LT5pc183MDAxMiA9IHZlcnNpb24uZGV2aWNlID09IDA7CisKKyAgICBpZiAocHJpdi0+aXNfNzAwMTIgJiYKKyAgICAgICAgKHN1YnR5cGUgPT0gQkNfTVNVQlRZUEVfRElWWCB8fCBzdWJ0eXBlID09IEJDX01TVUJUWVBFX0RJVlgzMTEpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAiQ3J5c3RhbEhEOiBCQ003MDAxMiBkb2Vzbid0IHN1cHBvcnQgTVBFRzQtQVNQL0RpdlgvWHZpZFxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBEdHNTZXRJbnB1dEZvcm1hdChwcml2LT5kZXYsICZmb3JtYXQpOworICAgIGlmIChyZXQgIT0gQkNfU1RTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDcnlzdGFsSEQ6IFNldElucHV0Rm9ybWF0IGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBEdHNPcGVuRGVjb2Rlcihwcml2LT5kZXYsIEJDX1NUUkVBTV9UWVBFX0VTKTsKKyAgICBpZiAocmV0ICE9IEJDX1NUU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ3J5c3RhbEhEOiBEdHNPcGVuRGVjb2RlciBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gRHRzU2V0Q29sb3JTcGFjZShwcml2LT5kZXYsIE9VVFBVVF9NT0RFNDIyX1lVWTIpOworICAgIGlmIChyZXQgIT0gQkNfU1RTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDcnlzdGFsSEQ6IER0c1NldENvbG9yU3BhY2UgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICByZXQgPSBEdHNTdGFydERlY29kZXIocHJpdi0+ZGV2KTsKKyAgICBpZiAocmV0ICE9IEJDX1NUU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ3J5c3RhbEhEOiBEdHNTdGFydERlY29kZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICByZXQgPSBEdHNTdGFydENhcHR1cmUocHJpdi0+ZGV2KTsKKyAgICBpZiAocmV0ICE9IEJDX1NUU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ3J5c3RhbEhEOiBEdHNTdGFydENhcHR1cmUgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgcHJpdi0+cGFyc2VyID0gYXZfcGFyc2VyX2luaXQoYXZjdHgtPmNvZGVjLT5pZCk7CisgICAgICAgIGlmICghcHJpdi0+cGFyc2VyKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiQ2Fubm90IG9wZW4gdGhlIGguMjY0IHBhcnNlciEgSW50ZXJsYWNlZCBoLjI2NCBjb250ZW50ICIKKyAgICAgICAgICAgICAgICAgICAid2lsbCBub3QgYmUgZGV0ZWN0ZWQgcmVsaWFibHkuXG4iKTsKKyAgICAgICAgcHJpdi0+cGFyc2VyLT5mbGFncyA9IFBBUlNFUl9GTEFHX0NPTVBMRVRFX0ZSQU1FUzsKKyAgICB9CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNyeXN0YWxIRDogSW5pdCBjb21wbGV0ZS5cbiIpOworCisgICAgcmV0dXJuIDA7CisKKyBmYWlsOgorICAgIHVuaW5pdChhdmN0eCk7CisgICAgcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBpbmxpbmUgQ29weVJldCBjb3B5X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDX0RUU19QUk9DX09VVCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUpCit7CisgICAgQkNfU1RBVFVTIHJldDsKKyAgICBCQ19EVFNfU1RBVFVTIGRlY29kZXJfc3RhdHVzID0geyAwLCB9OworICAgIHVpbnQ4X3QgdHJ1c3RfaW50ZXJsYWNlZDsKKyAgICB1aW50OF90IGludGVybGFjZWQ7CisKKyAgICBDSERDb250ZXh0ICpwcml2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IHBrdF9wdHMgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgdWludDhfdCBwaWNfdHlwZSA9IDA7CisKKyAgICB1aW50OF90IGJvdHRvbV9maWVsZCA9IChvdXRwdXQtPlBpY0luZm8uZmxhZ3MgJiBWREVDX0ZMQUdfQk9UVE9NRklFTEQpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICBWREVDX0ZMQUdfQk9UVE9NRklFTEQ7CisgICAgdWludDhfdCBib3R0b21fZmlyc3QgPSAhIShvdXRwdXQtPlBpY0luZm8uZmxhZ3MgJiBWREVDX0ZMQUdfQk9UVE9NX0ZJUlNUKTsKKworICAgIGludCB3aWR0aCAgICA9IG91dHB1dC0+UGljSW5mby53aWR0aDsKKyAgICBpbnQgaGVpZ2h0ICAgPSBvdXRwdXQtPlBpY0luZm8uaGVpZ2h0OworICAgIGludCBid2lkdGg7CisgICAgdWludDhfdCAqc3JjID0gb3V0cHV0LT5ZYnVmZjsKKyAgICBpbnQgc1N0cmlkZTsKKyAgICB1aW50OF90ICpkc3Q7CisgICAgaW50IGRTdHJpZGU7CisKKyAgICBpZiAob3V0cHV0LT5QaWNJbmZvLnRpbWVTdGFtcCAhPSAwKSB7CisgICAgICAgIE9wYXF1ZUxpc3QgKm5vZGUgPSBvcGFxdWVfbGlzdF9wb3AocHJpdiwgb3V0cHV0LT5QaWNJbmZvLnRpbWVTdGFtcCk7CisgICAgICAgIGlmIChub2RlKSB7CisgICAgICAgICAgICBwa3RfcHRzID0gbm9kZS0+cmVvcmRlcmVkX29wYXF1ZTsKKyAgICAgICAgICAgIHBpY190eXBlID0gbm9kZS0+cGljX3R5cGU7CisgICAgICAgICAgICBhdl9mcmVlKG5vZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdlIHdpbGwgZW5jb3VudGVyIGEgc2l0dWF0aW9uIHdoZXJlIGEgdGltZXN0YW1wIGNhbm5vdCBiZQorICAgICAgICAgICAgICogcG9wcGVkIGlmIGEgc2Vjb25kIGZpZWxkIGlzIGJlaW5nIHJldHVybmVkLiBJbiB0aGlzIGNhc2UsCisgICAgICAgICAgICAgKiBlYWNoIGZpZWxkIGhhcyB0aGUgc2FtZSB0aW1lc3RhbXAgYW5kIHRoZSBmaXJzdCBvbmUgd2lsbAorICAgICAgICAgICAgICogY2F1c2UgaXQgdG8gYmUgcG9wcGVkLiBUbyBrZWVwIHN1YnNlcXVlbnQgY2FsY3VsYXRpb25zCisgICAgICAgICAgICAgKiBzaW1wbGUsIHBpY190eXBlIHNob3VsZCBiZSBzZXQgYSBGSUVMRCB2YWx1ZSAtIGRvZXNuJ3QKKyAgICAgICAgICAgICAqIG1hdHRlciB3aGljaCwgYnV0IEkgY2hvc2UgQk9UVE9NLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwaWNfdHlwZSA9IFBJQ1RfQk9UVE9NX0ZJRUxEOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJvdXRwdXQgXCJwdHNcIjogJSJQUkl1NjQiXG4iLAorICAgICAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLnRpbWVTdGFtcCk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJvdXRwdXQgcGljdHVyZSB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgcGljX3R5cGUpOworICAgIH0KKworICAgIHJldCA9IER0c0dldERyaXZlclN0YXR1cyhwcml2LT5kZXYsICZkZWNvZGVyX3N0YXR1cyk7CisgICAgaWYgKHJldCAhPSBCQ19TVFNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDcnlzdGFsSEQ6IEdldERyaXZlclN0YXR1cyBmYWlsZWQ6ICV1XG4iLCByZXQpOworICAgICAgIHJldHVybiBSRVRfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgbW9zdCBjb250ZW50LCB3ZSBjYW4gdHJ1c3QgdGhlIGludGVybGFjZWQgZmxhZyByZXR1cm5lZAorICAgICAqIGJ5IHRoZSBoYXJkd2FyZSwgYnV0IHNvbWV0aW1lcyB3ZSBjYW4ndC4gVGhlc2UgYXJlIHRoZQorICAgICAqIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggd2UgY2FuIHRydXN0IHRoZSBmbGFnOgorICAgICAqCisgICAgICogMSkgSXQncyBub3QgaC4yNjQgY29udGVudAorICAgICAqIDIpIFRoZSBVTktOT1dOX1NSQyBmbGFnIGlzIG5vdCBzZXQKKyAgICAgKiAzKSBXZSBrbm93IHdlJ3JlIGV4cGVjdGluZyBhIHNlY29uZCBmaWVsZAorICAgICAqIDQpIFRoZSBoYXJkd2FyZSByZXBvcnRzIHRoaXMgcGljdHVyZSBhbmQgdGhlIG5leHQgcGljdHVyZQorICAgICAqICAgIGhhdmUgdGhlIHNhbWUgcGljdHVyZSBudW1iZXIuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlcmUgY2FuIHN0aWxsIGJlIGludGVybGFjZWQgY29udGVudCB0aGF0IHdpbGwKKyAgICAgKiBmYWlsIHRoaXMgY2hlY2ssIGlmIHRoZSBoYXJkd2FyZSBoYXNuJ3QgZGVjb2RlZCB0aGUgbmV4dAorICAgICAqIHBpY3R1cmUgb3IgaWYgdGhlcmUgaXMgYSBjb3JydXB0aW9uIGluIHRoZSBzdHJlYW0uIChJbiBlaXRoZXIKKyAgICAgKiBjYXNlIGEgMCB3aWxsIGJlIHJldHVybmVkIGZvciB0aGUgbmV4dCBwaWN0dXJlIG51bWJlcikKKyAgICAgKi8KKyAgICB0cnVzdF9pbnRlcmxhY2VkID0gYXZjdHgtPmNvZGVjLT5pZCAhPSBBVl9DT0RFQ19JRF9IMjY0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICEob3V0cHV0LT5QaWNJbmZvLmZsYWdzICYgVkRFQ19GTEFHX1VOS05PV05fU1JDKSB8fAorICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5uZWVkX3NlY29uZF9maWVsZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAoZGVjb2Rlcl9zdGF0dXMucGljTnVtRmxhZ3MgJiB+MHg0MDAwMDAwMCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLnBpY3R1cmVfbnVtYmVyOworCisgICAgLyoKKyAgICAgKiBJZiB3ZSBnb3QgYSBmYWxzZSBuZWdhdGl2ZSBmb3IgdHJ1c3RfaW50ZXJsYWNlZCBvbiB0aGUgZmlyc3QgZmllbGQsCisgICAgICogd2Ugd2lsbCByZWFsaXNlIG91ciBtaXN0YWtlIGhlcmUgd2hlbiB3ZSBzZWUgdGhhdCB0aGUgcGljdHVyZSBudW1iZXIgaXMgdGhhdAorICAgICAqIG9mIHRoZSBwcmV2aW91cyBwaWN0dXJlLiBXZSBjYW5ub3QgcmVjb3ZlciB0aGUgZnJhbWUgYW5kIHNob3VsZCBkaXNjYXJkIHRoZQorICAgICAqIHNlY29uZCBmaWVsZCB0byBrZWVwIHRoZSBjb3JyZWN0IG51bWJlciBvZiBvdXRwdXQgZnJhbWVzLgorICAgICAqLworICAgIGlmIChvdXRwdXQtPlBpY0luZm8ucGljdHVyZV9udW1iZXIgPT0gcHJpdi0+bGFzdF9waWN0dXJlICYmICFwcml2LT5uZWVkX3NlY29uZF9maWVsZCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkluY29ycmVjdGx5IGd1ZXNzZWQgcHJvZ3Jlc3NpdmUgZnJhbWUuIERpc2NhcmRpbmcgc2Vjb25kIGZpZWxkXG4iKTsKKyAgICAgICAgLyogUmV0dXJuaW5nIHdpdGhvdXQgcHJvdmlkaW5nIGEgcGljdHVyZS4gKi8KKyAgICAgICAgcmV0dXJuIFJFVF9PSzsKKyAgICB9CisKKyAgICBpbnRlcmxhY2VkID0gKG91dHB1dC0+UGljSW5mby5mbGFncyAmIFZERUNfRkxBR19JTlRFUkxBQ0VEX1NSQykgJiYKKyAgICAgICAgICAgICAgICAgdHJ1c3RfaW50ZXJsYWNlZDsKKworICAgIGlmICghdHJ1c3RfaW50ZXJsYWNlZCAmJiAoZGVjb2Rlcl9zdGF0dXMucGljTnVtRmxhZ3MgJiB+MHg0MDAwMDAwMCkgPT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgIk5leHQgcGljdHVyZSBudW1iZXIgdW5rbm93bi4gQXNzdW1pbmcgcHJvZ3Jlc3NpdmUgZnJhbWUuXG4iKTsKKyAgICB9CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiSW50ZXJsYWNlZCBzdGF0ZTogJWQgfCB0cnVzdF9pbnRlcmxhY2VkICVkXG4iLAorICAgICAgICAgICBpbnRlcmxhY2VkLCB0cnVzdF9pbnRlcmxhY2VkKTsKKworICAgIGlmIChwcml2LT5waWMtPmRhdGFbMF0gJiYgIXByaXYtPm5lZWRfc2Vjb25kX2ZpZWxkKQorICAgICAgICBhdl9mcmFtZV91bnJlZihwcml2LT5waWMpOworCisgICAgcHJpdi0+bmVlZF9zZWNvbmRfZmllbGQgPSBpbnRlcmxhY2VkICYmICFwcml2LT5uZWVkX3NlY29uZF9maWVsZDsKKworICAgIGlmICghcHJpdi0+cGljLT5kYXRhWzBdKSB7CisgICAgICAgIGlmIChmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwcml2LT5waWMsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBSRVRfRVJST1I7CisgICAgfQorCisgICAgYndpZHRoID0gYXZfaW1hZ2VfZ2V0X2xpbmVzaXplKGF2Y3R4LT5waXhfZm10LCB3aWR0aCwgMCk7CisgICAgaWYgKHByaXYtPmlzXzcwMDEyKSB7CisgICAgICAgIGludCBwU3RyaWRlOworCisgICAgICAgIGlmICh3aWR0aCA8PSA3MjApCisgICAgICAgICAgICBwU3RyaWRlID0gNzIwOworICAgICAgICBlbHNlIGlmICh3aWR0aCA8PSAxMjgwKQorICAgICAgICAgICAgcFN0cmlkZSA9IDEyODA7CisgICAgICAgIGVsc2UgcFN0cmlkZSA9IDE5MjA7CisgICAgICAgIHNTdHJpZGUgPSBhdl9pbWFnZV9nZXRfbGluZXNpemUoYXZjdHgtPnBpeF9mbXQsIHBTdHJpZGUsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHNTdHJpZGUgPSBid2lkdGg7CisgICAgfQorCisgICAgZFN0cmlkZSA9IHByaXYtPnBpYy0+bGluZXNpemVbMF07CisgICAgZHN0ICAgICA9IHByaXYtPnBpYy0+ZGF0YVswXTsKKworICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJDcnlzdGFsSEQ6IENvcHlpbmcgb3V0IGZyYW1lXG4iKTsKKworICAgIGlmIChpbnRlcmxhY2VkKSB7CisgICAgICAgIGludCBkWSA9IDA7CisgICAgICAgIGludCBzWSA9IDA7CisKKyAgICAgICAgaGVpZ2h0IC89IDI7CisgICAgICAgIGlmIChib3R0b21fZmllbGQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJJbnRlcmxhY2VkOiBib3R0b20gZmllbGRcbiIpOworICAgICAgICAgICAgZFkgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkludGVybGFjZWQ6IHRvcCBmaWVsZFxuIik7CisgICAgICAgICAgICBkWSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHNZID0gMDsgc1kgPCBoZWlnaHQ7IGRZKyssIHNZKyspIHsKKyAgICAgICAgICAgIG1lbWNweSgmKGRzdFtkWSAqIGRTdHJpZGVdKSwgJihzcmNbc1kgKiBzU3RyaWRlXSksIGJ3aWR0aCk7CisgICAgICAgICAgICBkWSsrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShkc3QsIGRTdHJpZGUsIHNyYywgc1N0cmlkZSwgYndpZHRoLCBoZWlnaHQpOworICAgIH0KKworICAgIHByaXYtPnBpYy0+aW50ZXJsYWNlZF9mcmFtZSA9IGludGVybGFjZWQ7CisgICAgaWYgKGludGVybGFjZWQpCisgICAgICAgIHByaXYtPnBpYy0+dG9wX2ZpZWxkX2ZpcnN0ID0gIWJvdHRvbV9maXJzdDsKKworICAgIHByaXYtPnBpYy0+cGt0X3B0cyA9IHBrdF9wdHM7CisKKyAgICBpZiAoIXByaXYtPm5lZWRfc2Vjb25kX2ZpZWxkKSB7CisgICAgICAgICpnb3RfZnJhbWUgICAgICAgPSAxOworICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBwcml2LT5waWMpKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFR3byB0eXBlcyBvZiBQQUZGIGNvbnRlbnQgaGF2ZSBiZWVuIG9ic2VydmVkLiBPbmUgZm9ybSBjYXVzZXMgdGhlCisgICAgICogaGFyZHdhcmUgdG8gcmV0dXJuIGEgZmllbGQgcGFpciBhbmQgdGhlIG90aGVyIGluZGl2aWR1YWwgZmllbGRzLAorICAgICAqIGV2ZW4gdGhvdWdoIHRoZSBpbnB1dCBpcyBhbHdheXMgaW5kaXZpZHVhbCBmaWVsZHMuIFdlIG11c3Qgc2tpcAorICAgICAqIGNvcHlpbmcgb24gdGhlIG5leHQgZGVjb2RlKCkgY2FsbCB0byBtYWludGFpbiBwaXBlbGluZSBsZW5ndGggaW4KKyAgICAgKiB0aGUgZmlyc3QgY2FzZS4KKyAgICAgKi8KKyAgICBpZiAoIWludGVybGFjZWQgJiYgKG91dHB1dC0+UGljSW5mby5mbGFncyAmIFZERUNfRkxBR19VTktOT1dOX1NSQykgJiYKKyAgICAgICAgKHBpY190eXBlID09IFBJQ1RfVE9QX0ZJRUxEIHx8IHBpY190eXBlID09IFBJQ1RfQk9UVE9NX0ZJRUxEKSkgeworICAgICAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiRmllbGRwYWlyIGZyb20gdHdvIHBhY2tldHMuXG4iKTsKKyAgICAgICAgcmV0dXJuIFJFVF9TS0lQX05FWFRfQ09QWTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBsb2dpYyBoZXJlIGlzIHB1cmVseSBiYXNlZCBvbiBlbXBpcmljYWwgdGVzdGluZyB3aXRoIHNhbXBsZXMuCisgICAgICogSWYgd2UgbmVlZCBhIHNlY29uZCBmaWVsZCwgaXQgY291bGQgY29tZSBmcm9tIGEgc2Vjb25kIGlucHV0IHBhY2tldCwKKyAgICAgKiBvciBpdCBjb3VsZCBjb21lIGZyb20gdGhlIHNhbWUgZmllbGQtcGFpciBpbnB1dCBwYWNrZXQgYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBmaWVsZC4gSW4gdGhlIGZpcnN0IGNhc2UsIHdlIHNob3VsZCByZXR1cm4gYW5kIHdhaXQgZm9yIHRoZSBuZXh0IHRpbWUKKyAgICAgKiByb3VuZCB0byBnZXQgdGhlIHNlY29uZCBmaWVsZCwgd2hpbGUgaW4gdGhlIHNlY29uZCBjYXNlLCB3ZSBzaG91bGQKKyAgICAgKiBhc2sgdGhlIGRlY29kZXIgZm9yIGl0IGltbWVkaWF0ZWx5LgorICAgICAqCisgICAgICogVGVzdGluZyBoYXMgc2hvd24gdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoIHRoZSBmaWVsZHBhaXIgLT4gdHdvIGZpZWxkcworICAgICAqIGNhc2UgaWYgdGhlIFZERUNfRkxBR19VTktOT1dOX1NSQyBpcyBub3Qgc2V0IG9yIGlmIHRoZSBpbnB1dCBwaWN0dXJlCisgICAgICogdHlwZSB3YXMgUElDVF9GUkFNRSAoaW4gdGhpcyBzZWNvbmQgY2FzZSwgdGhlIGZsYWcgbWlnaHQgc3RpbGwgYmUgc2V0KQorICAgICAqLworICAgIHJldHVybiBwcml2LT5uZWVkX3NlY29uZF9maWVsZCAmJgorICAgICAgICAgICAoIShvdXRwdXQtPlBpY0luZm8uZmxhZ3MgJiBWREVDX0ZMQUdfVU5LTk9XTl9TUkMpIHx8CisgICAgICAgICAgICBwaWNfdHlwZSA9PSBQSUNUX0ZSQU1FKSA/CisgICAgICAgICAgIFJFVF9DT1BZX05FWFRfRklFTEQgOiBSRVRfT0s7Cit9CisKKworc3RhdGljIGlubGluZSBDb3B5UmV0IHJlY2VpdmVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUpCit7CisgICAgQkNfU1RBVFVTIHJldDsKKyAgICBCQ19EVFNfUFJPQ19PVVQgb3V0cHV0ID0geworICAgICAgICAuUGljSW5mby53aWR0aCAgPSBhdmN0eC0+d2lkdGgsCisgICAgICAgIC5QaWNJbmZvLmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQsCisgICAgfTsKKyAgICBDSERDb250ZXh0ICpwcml2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBIQU5ETEUgZGV2ICAgICAgID0gcHJpdi0+ZGV2OworCisgICAgKmdvdF9mcmFtZSA9IDA7CisKKyAgICAvLyBSZXF1ZXN0IGRlY29kZWQgZGF0YSBmcm9tIHRoZSBkcml2ZXIKKyAgICByZXQgPSBEdHNQcm9jT3V0cHV0Tm9Db3B5KGRldiwgT1VUUFVUX1BST0NfVElNRU9VVCwgJm91dHB1dCk7CisgICAgaWYgKHJldCA9PSBCQ19TVFNfRk1UX0NIQU5HRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ3J5c3RhbEhEOiBJbml0aWFsIGZvcm1hdCBjaGFuZ2VcbiIpOworICAgICAgICBhdmN0eC0+d2lkdGggID0gb3V0cHV0LlBpY0luZm8ud2lkdGg7CisgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSBvdXRwdXQuUGljSW5mby5oZWlnaHQ7CisgICAgICAgIHN3aXRjaCAoIG91dHB1dC5QaWNJbmZvLmFzcGVjdF9yYXRpbyApIHsKKyAgICAgICAgY2FzZSB2ZGVjQXNwZWN0UmF0aW9TcXVhcmU6CisgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKSB7ICAxLCAgMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB2ZGVjQXNwZWN0UmF0aW8xMl8xMToKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpIHsgMTIsIDExfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHZkZWNBc3BlY3RSYXRpbzEwXzExOgorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCkgeyAxMCwgMTF9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdmRlY0FzcGVjdFJhdGlvMTZfMTE6CisgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKSB7IDE2LCAxMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB2ZGVjQXNwZWN0UmF0aW80MF8zMzoKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpIHsgNDAsIDMzfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHZkZWNBc3BlY3RSYXRpbzI0XzExOgorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCkgeyAyNCwgMTF9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdmRlY0FzcGVjdFJhdGlvMjBfMTE6CisgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKSB7IDIwLCAxMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB2ZGVjQXNwZWN0UmF0aW8zMl8xMToKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpIHsgMzIsIDExfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHZkZWNBc3BlY3RSYXRpbzgwXzMzOgorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCkgeyA4MCwgMzN9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdmRlY0FzcGVjdFJhdGlvMThfMTE6CisgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKSB7IDE4LCAxMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB2ZGVjQXNwZWN0UmF0aW8xNV8xMToKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpIHsgMTUsIDExfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHZkZWNBc3BlY3RSYXRpbzY0XzMzOgorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCkgeyA2NCwgMzN9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdmRlY0FzcGVjdFJhdGlvMTYwXzk5OgorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCkgezE2MCwgOTl9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdmRlY0FzcGVjdFJhdGlvNF8zOgorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCkgeyAgNCwgIDN9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdmRlY0FzcGVjdFJhdGlvMTZfOToKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpIHsgMTYsICA5fTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHZkZWNBc3BlY3RSYXRpbzIyMV8xOgorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCkgezIyMSwgIDF9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJFVF9DT1BZX0FHQUlOOworICAgIH0gZWxzZSBpZiAocmV0ID09IEJDX1NUU19TVUNDRVNTKSB7CisgICAgICAgIGludCBjb3B5X3JldCA9IC0xOworICAgICAgICBpZiAob3V0cHV0LlBvdXRGbGFncyAmIEJDX1BPVVRfRkxBR1NfUElCX1ZBTElEKSB7CisgICAgICAgICAgICBpZiAocHJpdi0+bGFzdF9waWN0dXJlID09IC0xKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBJbml0IHRvIG9uZSBsZXNzLCBzbyB0aGF0IHRoZSBpbmNyZW1lbnRpbmcgY29kZSBkb2Vzbid0CisgICAgICAgICAgICAgICAgICogbmVlZCB0byBiZSBzcGVjaWFsLWNhc2VkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHByaXYtPmxhc3RfcGljdHVyZSA9IG91dHB1dC5QaWNJbmZvLnBpY3R1cmVfbnVtYmVyIC0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfTVBFRzQgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXQuUGljSW5mby50aW1lU3RhbXAgPT0gMCAmJiBwcml2LT5iZnJhbWVfYnVnKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNyeXN0YWxIRDogTm90IHJldHVybmluZyBwYWNrZWQgZnJhbWUgdHdpY2UuXG4iKTsKKyAgICAgICAgICAgICAgICBwcml2LT5sYXN0X3BpY3R1cmUrKzsKKyAgICAgICAgICAgICAgICBEdHNSZWxlYXNlT3V0cHV0QnVmZnMoZGV2LCBOVUxMLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJFVF9DT1BZX0FHQUlOOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmludF9mcmFtZV9pbmZvKHByaXYsICZvdXRwdXQpOworCisgICAgICAgICAgICBpZiAocHJpdi0+bGFzdF9waWN0dXJlICsgMSA8IG91dHB1dC5QaWNJbmZvLnBpY3R1cmVfbnVtYmVyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIkNyeXN0YWxIRDogUGljdHVyZSBOdW1iZXIgZGlzY29udGludWl0eVxuIik7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBIYXZlIHdlIGxvc3QgZnJhbWVzPyBJZiBzbywgd2UgbmVlZCB0byBzaHJpbmsgdGhlCisgICAgICAgICAgICAgICAgICogcGlwZWxpbmUgbGVuZ3RoIGFwcHJvcHJpYXRlbHkuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBYWFg6IEkgaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHNpdHVhdGlvbgorICAgICAgICAgICAgICAgICAqIGFyZSBzbyBJIGRvbid0IGV2ZW4ga25vdyBpZiB3ZSd2ZSBsb3N0IGZyYW1lcyBvciB3aGljaAorICAgICAgICAgICAgICAgICAqIG9uZXMuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBJbiBhbnkgY2FzZSwgb25seSB3YXJuIHRoZSBmaXJzdCB0aW1lLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgcHJpdi0+bGFzdF9waWN0dXJlID0gb3V0cHV0LlBpY0luZm8ucGljdHVyZV9udW1iZXIgLSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb3B5X3JldCA9IGNvcHlfZnJhbWUoYXZjdHgsICZvdXRwdXQsIGRhdGEsIGdvdF9mcmFtZSk7CisgICAgICAgICAgICBpZiAoKmdvdF9mcmFtZSA+IDApIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+aGFzX2JfZnJhbWVzLS07CisgICAgICAgICAgICAgICAgcHJpdi0+bGFzdF9waWN0dXJlKys7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNyeXN0YWxIRDogUGlwZWxpbmUgbGVuZ3RoOiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmhhc19iX2ZyYW1lcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQW4gaW52YWxpZCBmcmFtZSBoYXMgYmVlbiBjb25zdW1lZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDcnlzdGFsSEQ6IFByb2NPdXRwdXQgc3VjY2VlZGVkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIFBJQlxuIik7CisgICAgICAgICAgICBhdmN0eC0+aGFzX2JfZnJhbWVzLS07CisgICAgICAgICAgICBjb3B5X3JldCA9IFJFVF9PSzsKKyAgICAgICAgfQorICAgICAgICBEdHNSZWxlYXNlT3V0cHV0QnVmZnMoZGV2LCBOVUxMLCBGQUxTRSk7CisKKyAgICAgICAgcmV0dXJuIGNvcHlfcmV0OworICAgIH0gZWxzZSBpZiAocmV0ID09IEJDX1NUU19CVVNZKSB7CisgICAgICAgIHJldHVybiBSRVRfQ09QWV9BR0FJTjsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNyeXN0YWxIRDogUHJvY091dHB1dCBmYWlsZWQgJWRcbiIsIHJldCk7CisgICAgICAgIHJldHVybiBSRVRfRVJST1I7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQgZGVjb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBCQ19TVEFUVVMgcmV0OworICAgIEJDX0RUU19TVEFUVVMgZGVjb2Rlcl9zdGF0dXMgPSB7IDAsIH07CisgICAgQ29weVJldCByZWNfcmV0OworICAgIENIRENvbnRleHQgKnByaXYgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgSEFORExFIGRldiAgICAgICAgID0gcHJpdi0+ZGV2OworICAgIHVpbnQ4X3QgKmluX2RhdGEgICA9IGF2cGt0LT5kYXRhOworICAgIGludCBsZW4gICAgICAgICAgICA9IGF2cGt0LT5zaXplOworICAgIGludCBmcmVlX2RhdGEgICAgICA9IDA7CisgICAgdWludDhfdCBwaWNfdHlwZSAgID0gMDsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJDcnlzdGFsSEQ6IGRlY29kZV9mcmFtZVxuIik7CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPT0gNyAmJiAhcHJpdi0+YmZyYW1lX2J1ZykgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgdXNlIG9mIGEgZHJvcCBmcmFtZSB0cmlnZ2VycyB0aGUgYnVnCisgICAgICAgICAqLworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgIkNyeXN0YWxIRDogRW5hYmxpbmcgd29yay1hcm91bmQgZm9yIHBhY2tlZCBiLWZyYW1lIGJ1Z1xuIik7CisgICAgICAgIHByaXYtPmJmcmFtZV9idWcgPSAxOworICAgIH0gZWxzZSBpZiAoYXZwa3QtPnNpemUgPT0gOCAmJiBwcml2LT5iZnJhbWVfYnVnKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIERlbGF5IGZyYW1lcyBkb24ndCB0cmlnZ2VyIHRoZSBidWcKKyAgICAgICAgICovCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAiQ3J5c3RhbEhEOiBEaXNhYmxpbmcgd29yay1hcm91bmQgZm9yIHBhY2tlZCBiLWZyYW1lIGJ1Z1xuIik7CisgICAgICAgIHByaXYtPmJmcmFtZV9idWcgPSAwOworICAgIH0KKworICAgIGlmIChsZW4pIHsKKyAgICAgICAgaW50MzJfdCB0eF9mcmVlID0gKGludDMyX3QpRHRzVHhGcmVlU2l6ZShkZXYpOworCisgICAgICAgIGlmIChwcml2LT5wYXJzZXIpIHsKKyAgICAgICAgICAgIGludCByZXQgPSAwOworCisgICAgICAgICAgICBpZiAocHJpdi0+YnNmYykgeworICAgICAgICAgICAgICAgIHJldCA9IGF2X2JpdHN0cmVhbV9maWx0ZXJfZmlsdGVyKHByaXYtPmJzZmMsIGF2Y3R4LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbl9kYXRhLCAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cGt0LT5kYXRhLCBsZW4sIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZV9kYXRhID0gcmV0ID4gMDsKKworICAgICAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcG91dDsKKyAgICAgICAgICAgICAgICBpbnQgcHNpemU7CisgICAgICAgICAgICAgICAgaW50IGluZGV4OworICAgICAgICAgICAgICAgIEgyNjRDb250ZXh0ICpoID0gcHJpdi0+cGFyc2VyLT5wcml2X2RhdGE7CisKKyAgICAgICAgICAgICAgICBpbmRleCA9IGF2X3BhcnNlcl9wYXJzZTIocHJpdi0+cGFyc2VyLCBhdmN0eCwgJnBvdXQsICZwc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZGF0YSwgbGVuLCBhdmN0eC0+aW50ZXJuYWwtPnBrdC0+cHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnBrdC0+ZHRzLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3J5c3RhbEhEOiBGYWlsZWQgdG8gcGFyc2UgaC4yNjQgcGFja2V0IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXRlY3QgaW50ZXJsYWNpbmcuXG4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IGxlbikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyeXN0YWxIRDogRmFpbGVkIHRvIHBhcnNlIGguMjY0IHBhY2tldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGxldGVseS4gSW50ZXJsYWNlZCBmcmFtZXMgbWF5IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvcnJlY3RseSBkZXRlY3RlZC5cbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3J5c3RhbEhEOiBwYXJzZXIgcGljdHVyZSB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUpOworICAgICAgICAgICAgICAgICAgICBwaWNfdHlwZSA9IGgtPnBpY3R1cmVfc3RydWN0dXJlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIkNyeXN0YWxIRDogbXA0dG9hbm5leGIgZmlsdGVyIGZhaWxlZCB0byBmaWx0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAicGFja2V0LiBJbnRlcmxhY2VkIGZyYW1lcyBtYXkgYmUgaW5jb3JyZWN0bHkgIgorICAgICAgICAgICAgICAgICAgICAgICAiZGV0ZWN0ZWQuXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4gPCB0eF9mcmVlIC0gMTAyNCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIERlc3BpdGUgYmVpbmcgbm90aW9uYWxseSBvcGFxdWUsIGVpdGhlciBsaWJjcnlzdGFsaGQgb3IKKyAgICAgICAgICAgICAqIHRoZSBoYXJkd2FyZSBpdHNlbGYgd2lsbCBtYW5nbGUgcHRzIHZhbHVlcyB0aGF0IGFyZSB0b28KKyAgICAgICAgICAgICAqIHNtYWxsIG9yIHRvbyBsYXJnZS4gVGhlIGRvY3MgY2xhaW0gaXQgc2hvdWxkIGJlIGluIHVuaXRzCisgICAgICAgICAgICAgKiBvZiAxMDBucy4gR2l2ZW4gdGhhdCB3ZSdyZSBub21pbmFsbHkgZGVhbGluZyB3aXRoIGEgYmxhY2sKKyAgICAgICAgICAgICAqIGJveCBvbiBib3RoIHNpZGVzLCBhbnkgdHJhbnNmb3JtIHdlIGRvIGhhcyBubyBndWFyYW50ZWUgb2YKKyAgICAgICAgICAgICAqIGF2b2lkaW5nIG1hbmdsaW5nIHNvIHdlIG5lZWQgdG8gYnVpbGQgYSBtYXBwaW5nIHRvIHZhbHVlcworICAgICAgICAgICAgICogd2Uga25vdyB3aWxsIG5vdCBiZSBtYW5nbGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB1aW50NjRfdCBwdHMgPSBvcGFxdWVfbGlzdF9wdXNoKHByaXYsIGF2Y3R4LT5pbnRlcm5hbC0+cGt0LT5wdHMsIHBpY190eXBlKTsKKyAgICAgICAgICAgIGlmICghcHRzKSB7CisgICAgICAgICAgICAgICAgaWYgKGZyZWVfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmaW5fZGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgICAgICJpbnB1dCBcInB0c1wiOiAlIlBSSXU2NCJcbiIsIHB0cyk7CisgICAgICAgICAgICByZXQgPSBEdHNQcm9jSW5wdXQoZGV2LCBpbl9kYXRhLCBsZW4sIHB0cywgMCk7CisgICAgICAgICAgICBpZiAoZnJlZV9kYXRhKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmluX2RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCA9PSBCQ19TVFNfQlVTWSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJDcnlzdGFsSEQ6IFByb2NJbnB1dCByZXR1cm5lZCBidXN5XG4iKTsKKyAgICAgICAgICAgICAgICB1c2xlZXAoQkFTRV9XQUlUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQlVTWSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBCQ19TVFNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ3J5c3RhbEhEOiBQcm9jSW5wdXQgZmFpbGVkOiAldVxuIiwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmN0eC0+aGFzX2JfZnJhbWVzKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQ3J5c3RhbEhEOiBJbnB1dCBidWZmZXIgZnVsbFxuIik7CisgICAgICAgICAgICBsZW4gPSAwOyAvLyBXZSBkaWRuJ3QgY29uc3VtZSBhbnkgYnl0ZXMuCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiQ3J5c3RhbEhEOiBObyBtb3JlIGlucHV0IGRhdGFcbiIpOworICAgIH0KKworICAgIGlmIChwcml2LT5za2lwX25leHRfb3V0cHV0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJDcnlzdGFsSEQ6IFNraXBwaW5nIG5leHQgb3V0cHV0LlxuIik7CisgICAgICAgIHByaXYtPnNraXBfbmV4dF9vdXRwdXQgPSAwOworICAgICAgICBhdmN0eC0+aGFzX2JfZnJhbWVzLS07CisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorCisgICAgcmV0ID0gRHRzR2V0RHJpdmVyU3RhdHVzKGRldiwgJmRlY29kZXJfc3RhdHVzKTsKKyAgICBpZiAocmV0ICE9IEJDX1NUU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ3J5c3RhbEhEOiBHZXREcml2ZXJTdGF0dXMgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qCisgICAgICogTm8gZnJhbWVzIHJlYWR5LiBEb24ndCB0cnkgdG8gZXh0cmFjdC4KKyAgICAgKgorICAgICAqIEVtcGlyaWNhbCB0ZXN0aW5nIHNob3dzIHRoYXQgUmVhZHlMaXN0Q291bnQgY2FuIGJlIGEgZGFtbiBsaWUsCisgICAgICogYW5kIFByb2NPdXQgc3RpbGwgZmFpbHMgd2hlbiBjb3VudCA+IDAuIFRoZSBzYW1lIHRlc3Rpbmcgc2hvd2VkCisgICAgICogdGhhdCB0d28gbW9yZSBpdGVyYXRpb25zIHdlcmUgbmVlZGVkIGJlZm9yZSBQcm9jT3V0cHV0IHdvdWxkCisgICAgICogc3VjY2VlZC4KKyAgICAgKi8KKyAgICBpZiAocHJpdi0+b3V0cHV0X3JlYWR5IDwgMikgeworICAgICAgICBpZiAoZGVjb2Rlcl9zdGF0dXMuUmVhZHlMaXN0Q291bnQgIT0gMCkKKyAgICAgICAgICAgIHByaXYtPm91dHB1dF9yZWFkeSsrOworICAgICAgICB1c2xlZXAoQkFTRV9XQUlUKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIkNyeXN0YWxIRDogRmlsbGluZyBwaXBlbGluZS5cbiIpOworICAgICAgICByZXR1cm4gbGVuOworICAgIH0gZWxzZSBpZiAoZGVjb2Rlcl9zdGF0dXMuUmVhZHlMaXN0Q291bnQgPT0gMCkgeworICAgICAgICAvKgorICAgICAgICAgKiBBZnRlciB0aGUgcGlwZWxpbmUgaXMgZXN0YWJsaXNoZWQsIGlmIHdlIGVuY291bnRlciBhIGxhY2sgb2YgZnJhbWVzCisgICAgICAgICAqIHRoYXQgcHJvYmFibHkgbWVhbnMgd2UncmUgbm90IGdpdmluZyB0aGUgaGFyZHdhcmUgZW5vdWdoIHRpbWUgdG8KKyAgICAgICAgICogZGVjb2RlIHRoZW0sIHNvIHN0YXJ0IGluY3JlYXNpbmcgdGhlIHdhaXQgdGltZSBhdCB0aGUgZW5kIG9mIGEKKyAgICAgICAgICogZGVjb2RlIGNhbGwuCisgICAgICAgICAqLworICAgICAgICB1c2xlZXAoQkFTRV9XQUlUKTsKKyAgICAgICAgcHJpdi0+ZGVjb2RlX3dhaXQgKz0gV0FJVF9VTklUOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiQ3J5c3RhbEhEOiBObyBmcmFtZXMgcmVhZHkuIFJldHVybmluZ1xuIik7CisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorCisgICAgZG8geworICAgICAgICByZWNfcmV0ID0gcmVjZWl2ZV9mcmFtZShhdmN0eCwgZGF0YSwgZ290X2ZyYW1lKTsKKyAgICAgICAgaWYgKHJlY19yZXQgPT0gUkVUX09LICYmICpnb3RfZnJhbWUgPT0gMCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgY2FzZSBpcyBmb3Igd2hlbiB0aGUgZW5jb2RlZCBmaWVsZHMgYXJlIHN0b3JlZAorICAgICAgICAgICAgICogc2VwYXJhdGVseSBhbmQgd2UgZ2V0IGEgc2VwYXJhdGUgYXZwa3QgZm9yIGVhY2ggb25lLiBUbyBrZWVwCisgICAgICAgICAgICAgKiB0aGUgcGlwZWxpbmUgc3RhYmxlLCB3ZSBzaG91bGQgcmV0dXJuIG5vdGhpbmcgYW5kIHdhaXQgZm9yCisgICAgICAgICAgICAgKiB0aGUgbmV4dCB0aW1lIHJvdW5kIHRvIGdyYWIgdGhlIHNlY29uZCBmaWVsZC4KKyAgICAgICAgICAgICAqIEguMjY0IFBBRkYgaXMgYW4gZXhhbXBsZSBvZiB0aGlzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiUmV0dXJuaW5nIGFmdGVyIGZpcnN0IGZpZWxkLlxuIik7CisgICAgICAgICAgICBhdmN0eC0+aGFzX2JfZnJhbWVzLS07CisgICAgICAgIH0gZWxzZSBpZiAocmVjX3JldCA9PSBSRVRfQ09QWV9ORVhUX0ZJRUxEKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBjYXNlIGlzIGZvciB3aGVuIHRoZSBlbmNvZGVkIGZpZWxkcyBhcmUgc3RvcmVkIGluIGEKKyAgICAgICAgICAgICAqIHNpbmdsZSBhdnBrdCBidXQgdGhlIGhhcmR3YXJlIHJldHVybnMgdGhlbiBzZXBhcmF0ZWx5LiBVbmxlc3MKKyAgICAgICAgICAgICAqIHdlIGdyYWIgdGhlIHNlY29uZCBmaWVsZCBiZWZvcmUgcmV0dXJuaW5nLCB3ZSdsbCBzbGlwIGFub3RoZXIKKyAgICAgICAgICAgICAqIGZyYW1lIGluIHRoZSBwaXBlbGluZSBhbmQgaWYgdGhhdCBoYXBwZW5zIGEgbG90LCB3ZSdyZSBzdW5rLgorICAgICAgICAgICAgICogU28gd2UgaGF2ZSB0byBnZXQgdGhhdCBzZWNvbmQgZmllbGQgbm93LgorICAgICAgICAgICAgICogSW50ZXJsYWNlZCBtcGVnMiBhbmQgdmMxIGFyZSBleGFtcGxlcyBvZiB0aGlzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiVHJ5aW5nIHRvIGdldCBzZWNvbmQgZmllbGQuXG4iKTsKKyAgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgICAgdXNsZWVwKHByaXYtPmRlY29kZV93YWl0KTsKKyAgICAgICAgICAgICAgICByZXQgPSBEdHNHZXREcml2ZXJTdGF0dXMoZGV2LCAmZGVjb2Rlcl9zdGF0dXMpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gQkNfU1RTX1NVQ0NFU1MgJiYKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl9zdGF0dXMuUmVhZHlMaXN0Q291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlY19yZXQgPSByZWNlaXZlX2ZyYW1lKGF2Y3R4LCBkYXRhLCBnb3RfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHJlY19yZXQgPT0gUkVUX09LICYmICpnb3RfZnJhbWUgPiAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcmVjX3JldCA9PSBSRVRfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ3J5c3RhbEhEOiBHb3Qgc2Vjb25kIGZpZWxkLlxuIik7CisgICAgICAgIH0gZWxzZSBpZiAocmVjX3JldCA9PSBSRVRfU0tJUF9ORVhUX0NPUFkpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUd28gaW5wdXQgcGFja2V0cyBnb3QgdHVybmVkIGludG8gYSBmaWVsZCBwYWlyLiBHYXdkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgICAgICJEb24ndCBvdXRwdXQgb24gbmV4dCBkZWNvZGUgY2FsbC5cbiIpOworICAgICAgICAgICAgcHJpdi0+c2tpcF9uZXh0X291dHB1dCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgcmVjX3JldCA9PSBSRVRfQ09QWV9BR0FJTiwgdGhhdCBtZWFucyB0aGF0IGVpdGhlciB3ZSBqdXN0IGhhbmRsZWQKKyAgICAgICAgICogYSBGTVRfQ0hBTkdFIGV2ZW50IGFuZCBuZWVkIHRvIGdvIGFyb3VuZCBhZ2FpbiBmb3IgdGhlIGFjdHVhbCBmcmFtZSwKKyAgICAgICAgICogd2UgZ290IGEgYnVzeSBzdGF0dXMgYW5kIG5lZWQgdG8gdHJ5IGFnYWluLCBvciB3ZSdyZSBkZWFsaW5nIHdpdGgKKyAgICAgICAgICogcGFja2VkIGItZnJhbWVzLCB3aGVyZSB0aGUgaGFyZHdhcmUgc3RyYW5nZWx5IHJldHVybnMgdGhlIHBhY2tlZAorICAgICAgICAgKiBwLWZyYW1lIHR3aWNlLiBXZSBjaG9vc2UgdG8ga2VlcCB0aGUgc2Vjb25kIGNvcHkgYXMgaXQgY2FycmllcyB0aGUKKyAgICAgICAgICogdmFsaWQgcHRzLgorICAgICAgICAgKi8KKyAgICB9IHdoaWxlIChyZWNfcmV0ID09IFJFVF9DT1BZX0FHQUlOKTsKKyAgICB1c2xlZXAocHJpdi0+ZGVjb2RlX3dhaXQpOworICAgIHJldHVybiBsZW47Cit9CisKKworI2lmIENPTkZJR19IMjY0X0NSWVNUQUxIRF9ERUNPREVSCitzdGF0aWMgQVZDbGFzcyBoMjY0X2NsYXNzID0geworICAgICJoMjY0X2NyeXN0YWxoZCIsCisgICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgb3B0aW9ucywKKyAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2gyNjRfY3J5c3RhbGhkX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImgyNjRfY3J5c3RhbGhkIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSC4yNjQgLyBBVkMgLyBNUEVHLTQgQVZDIC8gTVBFRy00IHBhcnQgMTAgKENyeXN0YWxIRCBhY2NlbGVyYXRpb24pIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENIRENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGluaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gdW5pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7QVZfUElYX0ZNVF9ZVVlWNDIyLCBBVl9QSVhfRk1UX05PTkV9LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZoMjY0X2NsYXNzLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX01QRUcyX0NSWVNUQUxIRF9ERUNPREVSCitzdGF0aWMgQVZDbGFzcyBtcGVnMl9jbGFzcyA9IHsKKyAgICAibXBlZzJfY3J5c3RhbGhkIiwKKyAgICBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICBvcHRpb25zLAorICAgIExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbXBlZzJfY3J5c3RhbGhkX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wZWcyX2NyeXN0YWxoZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctMiBWaWRlbyAoQ3J5c3RhbEhEIGFjY2VsZXJhdGlvbikiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ0hEQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB1bmluaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfREVMQVksCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXtBVl9QSVhfRk1UX1lVWVY0MjIsIEFWX1BJWF9GTVRfTk9ORX0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJm1wZWcyX2NsYXNzLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX01QRUc0X0NSWVNUQUxIRF9ERUNPREVSCitzdGF0aWMgQVZDbGFzcyBtcGVnNF9jbGFzcyA9IHsKKyAgICAibXBlZzRfY3J5c3RhbGhkIiwKKyAgICBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICBvcHRpb25zLAorICAgIExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbXBlZzRfY3J5c3RhbGhkX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wZWc0X2NyeXN0YWxoZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctNCBQYXJ0IDIgKENyeXN0YWxIRCBhY2NlbGVyYXRpb24pIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihDSERDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBpbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHVuaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9ERUxBWSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pe0FWX1BJWF9GTVRfWVVZVjQyMiwgQVZfUElYX0ZNVF9OT05FfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmbXBlZzRfY2xhc3MsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfTVNNUEVHNF9DUllTVEFMSERfREVDT0RFUgorc3RhdGljIEFWQ2xhc3MgbXNtcGVnNF9jbGFzcyA9IHsKKyAgICAibXNtcGVnNF9jcnlzdGFsaGQiLAorICAgIGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIG9wdGlvbnMsCisgICAgTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9tc21wZWc0X2NyeXN0YWxoZF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtc21wZWc0X2NyeXN0YWxoZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctNCBQYXJ0IDIgTWljcm9zb2Z0IHZhcmlhbnQgdmVyc2lvbiAzIChDcnlzdGFsSEQgYWNjZWxlcmF0aW9uKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NU01QRUc0VjMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENIRENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGluaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gdW5pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0RFTEFZIHwgQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pe0FWX1BJWF9GTVRfWVVZVjQyMiwgQVZfUElYX0ZNVF9OT05FfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmbXNtcGVnNF9jbGFzcywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19WQzFfQ1JZU1RBTEhEX0RFQ09ERVIKK3N0YXRpYyBBVkNsYXNzIHZjMV9jbGFzcyA9IHsKKyAgICAidmMxX2NyeXN0YWxoZCIsCisgICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgb3B0aW9ucywKKyAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX3ZjMV9jcnlzdGFsaGRfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidmMxX2NyeXN0YWxoZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNNUFRFIFZDLTEgKENyeXN0YWxIRCBhY2NlbGVyYXRpb24pIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ0hEQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB1bmluaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfREVMQVksCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXtBVl9QSVhfRk1UX1lVWVY0MjIsIEFWX1BJWF9GTVRfTk9ORX0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJnZjMV9jbGFzcywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19XTVYzX0NSWVNUQUxIRF9ERUNPREVSCitzdGF0aWMgQVZDbGFzcyB3bXYzX2NsYXNzID0geworICAgICJ3bXYzX2NyeXN0YWxoZCIsCisgICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgb3B0aW9ucywKKyAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX3dtdjNfY3J5c3RhbGhkX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIndtdjNfY3J5c3RhbGhkIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2luZG93cyBNZWRpYSBWaWRlbyA5IChDcnlzdGFsSEQgYWNjZWxlcmF0aW9uKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XTVYzLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihDSERDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBpbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHVuaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9ERUxBWSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pe0FWX1BJWF9GTVRfWVVZVjQyMiwgQVZfUElYX0ZNVF9OT05FfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmd212M19jbGFzcywKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2NzY2QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2NzY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODc1ZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvY3NjZC5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ2FtU3R1ZGlvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBSZWltYXIgRG9lZmZpbmdlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKyNpZiBDT05GSUdfWkxJQgorI2luY2x1ZGUgPHpsaWIuaD4KKyNlbmRpZgorI2luY2x1ZGUgImxpYmF2dXRpbC9sem8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWRnJhbWUgKnBpYzsKKyAgICBpbnQgbGluZWxlbiwgaGVpZ2h0LCBicHA7CisgICAgdW5zaWduZWQgaW50IGRlY29tcF9zaXplOworICAgIHVuc2lnbmVkIGNoYXIqIGRlY29tcF9idWY7Cit9IENhbVN0dWRpb0NvbnRleHQ7CisKK3N0YXRpYyB2b2lkIGNvcHlfZnJhbWVfZGVmYXVsdChBVkZyYW1lICpmLCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVsZW4sIGludCBoZWlnaHQpIHsKKyAgICBpbnQgaSwgc3JjX3N0cmlkZSA9IEZGQUxJR04obGluZWxlbiwgNCk7CisgICAgdWludDhfdCAqZHN0ID0gZi0+ZGF0YVswXTsKKyAgICBkc3QgKz0gKGhlaWdodCAtIDEpICogZi0+bGluZXNpemVbMF07CisgICAgZm9yIChpID0gaGVpZ2h0OyBpOyBpLS0pIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBsaW5lbGVuKTsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgICAgIGRzdCAtPSBmLT5saW5lc2l6ZVswXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9mcmFtZV9kZWZhdWx0KEFWRnJhbWUgKmYsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lbGVuLCBpbnQgaGVpZ2h0KSB7CisgICAgaW50IGksIGosIHNyY19zdHJpZGUgPSBGRkFMSUdOKGxpbmVsZW4sIDQpOworICAgIHVpbnQ4X3QgKmRzdCA9IGYtPmRhdGFbMF07CisgICAgZHN0ICs9IChoZWlnaHQgLSAxKSAqIGYtPmxpbmVzaXplWzBdOworICAgIGZvciAoaSA9IGhlaWdodDsgaTsgaS0tKSB7CisgICAgICAgIGZvciAoaiA9IGxpbmVsZW47IGo7IGotLSkKKyAgICAgICAgICAgICpkc3QrKyArPSAqc3JjKys7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlIC0gbGluZWxlbjsKKyAgICAgICAgZHN0IC09IGYtPmxpbmVzaXplWzBdICsgbGluZWxlbjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpIHsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBDYW1TdHVkaW9Db250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGJ1Zl9zaXplIDwgMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImNvZGVkIGZyYW1lIHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBjLT5waWMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvLyBkZWNvbXByZXNzIGRhdGEKKyAgICBzd2l0Y2ggKChidWZbMF0gPj4gMSkgJiA3KSB7CisgICAgICAgIGNhc2UgMDogeyAvLyBsem8gY29tcHJlc3Npb24KKyAgICAgICAgICAgIGludCBvdXRsZW4gPSBjLT5kZWNvbXBfc2l6ZSwgaW5sZW4gPSBidWZfc2l6ZSAtIDI7CisgICAgICAgICAgICBpZiAoYXZfbHpvMXhfZGVjb2RlKGMtPmRlY29tcF9idWYsICZvdXRsZW4sICZidWZbMl0sICZpbmxlbikpCisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBkdXJpbmcgbHpvIGRlY29tcHJlc3Npb25cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAxOiB7IC8vIHpsaWIgY29tcHJlc3Npb24KKyNpZiBDT05GSUdfWkxJQgorICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBkbGVuID0gYy0+ZGVjb21wX3NpemU7CisgICAgICAgICAgICBpZiAodW5jb21wcmVzcyhjLT5kZWNvbXBfYnVmLCAmZGxlbiwgJmJ1ZlsyXSwgYnVmX3NpemUgLSAyKSAhPSBaX09LKQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgZHVyaW5nIHpsaWIgZGVjb21wcmVzc2lvblxuIik7CisgICAgICAgICAgICBicmVhazsKKyNlbHNlCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImNvbXBpbGVkIHdpdGhvdXQgemxpYiBzdXBwb3J0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bmtub3duIGNvbXByZXNzaW9uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8vIGZsaXAgdXBzaWRlIGRvd24sIGFkZCBkaWZmZXJlbmNlIGZyYW1lCisgICAgaWYgKGJ1ZlswXSAmIDEpIHsgLy8ga2V5ZnJhbWUKKyAgICAgICAgYy0+cGljLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgYy0+cGljLT5rZXlfZnJhbWUgPSAxOworICAgICAgICAgICAgICBjb3B5X2ZyYW1lX2RlZmF1bHQoYy0+cGljLCBjLT5kZWNvbXBfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+bGluZWxlbiwgYy0+aGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjLT5waWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICBjLT5waWMtPmtleV9mcmFtZSA9IDA7CisgICAgICAgICAgICAgIGFkZF9mcmFtZV9kZWZhdWx0KGMtPnBpYywgYy0+ZGVjb21wX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+bGluZWxlbiwgYy0+aGVpZ2h0KTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBjLT5waWMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpIHsKKyAgICBDYW1TdHVkaW9Db250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgc3RyaWRlOworICAgIHN3aXRjaCAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgICAgICBjYXNlIDE2OiBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNTU1TEU7IGJyZWFrOworICAgICAgICBjYXNlIDI0OiBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQ7IGJyZWFrOworICAgICAgICBjYXNlIDMyOiBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSQTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ2FtU3R1ZGlvIGNvZGVjIGVycm9yOiBpbnZhbGlkIGRlcHRoICVpIGJwcFxuIiwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBjLT5icHAgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgIGMtPmxpbmVsZW4gPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC8gODsKKyAgICBjLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworICAgIHN0cmlkZSA9IEZGQUxJR04oYy0+bGluZWxlbiwgNCk7CisgICAgYy0+ZGVjb21wX3NpemUgPSBjLT5oZWlnaHQgKiBzdHJpZGU7CisgICAgYy0+ZGVjb21wX2J1ZiA9IGF2X21hbGxvYyhjLT5kZWNvbXBfc2l6ZSArIEFWX0xaT19PVVRQVVRfUEFERElORyk7CisgICAgaWYgKCFjLT5kZWNvbXBfYnVmKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgYWxsb2NhdGUgZGVjb21wcmVzc2lvbiBidWZmZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYy0+cGljID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWMtPnBpYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KSB7CisgICAgQ2FtU3R1ZGlvQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYXZfZnJlZXAoJmMtPmRlY29tcF9idWYpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmMtPnBpYyk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfY3NjZF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjYW1zdHVkaW8iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDYW1TdHVkaW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQ1NDRCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ2FtU3R1ZGlvQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9jeXV2LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9jeXV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4ZTQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2N5dXYuYwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENyZWF0aXZlIFlVViAoQ1lVVikgVmlkZW8gRGVjb2RlcgorICogICBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQorICogYmFzZWQgb24gIkNyZWF0aXZlIFlVViAoQ1lVVikgc3RyZWFtIGZvcm1hdCBmb3IgQVZJIjoKKyAqICAgaHR0cDovL3d3dy5jc3NlLm1vbmFzaC5lZHUuYXUvfnRpbWYvdmlkZW9jb2RlYy9jeXV2LnR4dAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ3JlYXRpdmUgWVVWIChDWVVWKSBWaWRlbyBEZWNvZGVyLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgQ3l1dkRlY29kZUNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKK30gQ3l1dkRlY29kZUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBjeXV2X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDeXV2RGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIHMtPndpZHRoID0gYXZjdHgtPndpZHRoOworICAgIC8qIHdpZHRoIG5lZWRzIHRvIGJlIGRpdmlzaWJsZSBieSA0IGZvciB0aGlzIGNvZGVjIHRvIHdvcmsgKi8KKyAgICBpZiAocy0+d2lkdGggJiAweDMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHMtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeXV2X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgQ3l1dkRlY29kZUNvbnRleHQgKnM9YXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisKKyAgICB1bnNpZ25lZCBjaGFyICp5X3BsYW5lOworICAgIHVuc2lnbmVkIGNoYXIgKnVfcGxhbmU7CisgICAgdW5zaWduZWQgY2hhciAqdl9wbGFuZTsKKyAgICBpbnQgeV9wdHI7CisgICAgaW50IHVfcHRyOworICAgIGludCB2X3B0cjsKKworICAgIC8qIHByZWRpY3Rpb24gZXJyb3IgdGFibGVzIChtYWtlIGl0IGNsZWFyIHRoYXQgdGhleSBhcmUgc2lnbmVkIHZhbHVlcykgKi8KKyAgICBjb25zdCBzaWduZWQgY2hhciAqeV90YWJsZSA9IChjb25zdCBzaWduZWQgY2hhciopYnVmICsgIDA7CisgICAgY29uc3Qgc2lnbmVkIGNoYXIgKnVfdGFibGUgPSAoY29uc3Qgc2lnbmVkIGNoYXIqKWJ1ZiArIDE2OworICAgIGNvbnN0IHNpZ25lZCBjaGFyICp2X3RhYmxlID0gKGNvbnN0IHNpZ25lZCBjaGFyKilidWYgKyAzMjsKKworICAgIHVuc2lnbmVkIGNoYXIgeV9wcmVkLCB1X3ByZWQsIHZfcHJlZDsKKyAgICBpbnQgc3RyZWFtX3B0cjsKKyAgICB1bnNpZ25lZCBjaGFyIGN1cl9ieXRlOworICAgIGludCBwaXhlbF9ncm91cHM7CisgICAgaW50IHJhd3NpemUgPSBzLT5oZWlnaHQgKiBGRkFMSUdOKHMtPndpZHRoLDIpICogMjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BVVJBKSB7CisgICAgICAgIHlfdGFibGUgPSB1X3RhYmxlOworICAgICAgICB1X3RhYmxlID0gdl90YWJsZTsKKyAgICB9CisgICAgLyogc2FuaXR5IGNoZWNrIHRoZSBidWZmZXIgc2l6ZTogQSBidWZmZXIgaGFzIDN4MTYtYnl0ZXMgdGFibGVzCisgICAgICogZm9sbG93ZWQgYnkgKGhlaWdodCkgbGluZXMgZWFjaCB3aXRoIDMgYnl0ZXMgdG8gcmVwcmVzZW50IGdyb3VwcworICAgICAqIG9mIDQgcGl4ZWxzLiBUaHVzLCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgYnVmZmVyIG91Z2h0IHRvIGJlOgorICAgICAqICAgICgzICogMTYpICsgaGVpZ2h0ICogKHdpZHRoICogMyAvIDQpICovCisgICAgaWYgKGJ1Zl9zaXplID09IDQ4ICsgcy0+aGVpZ2h0ICogKHMtPndpZHRoICogMyAvIDQpKSB7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MTFQOworICAgIH0gZWxzZSBpZihidWZfc2l6ZSA9PSByYXdzaXplICkgeworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfVVlWWTQyMjsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImdvdCBhIGJ1ZmZlciB3aXRoICVkIGJ5dGVzIHdoZW4gJWQgd2VyZSBleHBlY3RlZFxuIiwKKyAgICAgICAgICAgICAgIGJ1Zl9zaXplLCA0OCArIHMtPmhlaWdodCAqIChzLT53aWR0aCAqIDMgLyA0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIHBpeGVsIGRhdGEgc3RhcnRzIDQ4IGJ5dGVzIGluLCBhZnRlciAzeDE2LWJ5dGUgdGFibGVzICovCisgICAgc3RyZWFtX3B0ciA9IDQ4OworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHlfcGxhbmUgPSBmcmFtZS0+ZGF0YVswXTsKKyAgICB1X3BsYW5lID0gZnJhbWUtPmRhdGFbMV07CisgICAgdl9wbGFuZSA9IGZyYW1lLT5kYXRhWzJdOworCisgICAgaWYgKGJ1Zl9zaXplID09IHJhd3NpemUpIHsKKyAgICAgICAgaW50IGxpbmVzaXplID0gRkZBTElHTihzLT53aWR0aCwyKSAqIDI7CisgICAgICAgIHlfcGxhbmUgKz0gZnJhbWUtPmxpbmVzaXplWzBdICogcy0+aGVpZ2h0OworICAgICAgICBmb3IgKHN0cmVhbV9wdHIgPSAwOyBzdHJlYW1fcHRyIDwgcmF3c2l6ZTsgc3RyZWFtX3B0ciArPSBsaW5lc2l6ZSkgeworICAgICAgICAgICAgeV9wbGFuZSAtPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICBtZW1jcHkoeV9wbGFuZSwgYnVmK3N0cmVhbV9wdHIsIGxpbmVzaXplKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisKKyAgICAvKiBpdGVyYXRlIHRocm91Z2ggZWFjaCBsaW5lIGluIHRoZSBoZWlnaHQgKi8KKyAgICBmb3IgKHlfcHRyID0gMCwgdV9wdHIgPSAwLCB2X3B0ciA9IDA7CisgICAgICAgICB5X3B0ciA8IChzLT5oZWlnaHQgKiBmcmFtZS0+bGluZXNpemVbMF0pOworICAgICAgICAgeV9wdHIgKz0gZnJhbWUtPmxpbmVzaXplWzBdIC0gcy0+d2lkdGgsCisgICAgICAgICB1X3B0ciArPSBmcmFtZS0+bGluZXNpemVbMV0gLSBzLT53aWR0aCAvIDQsCisgICAgICAgICB2X3B0ciArPSBmcmFtZS0+bGluZXNpemVbMl0gLSBzLT53aWR0aCAvIDQpIHsKKworICAgICAgICAvKiByZXNldCBwcmVkaWN0b3JzICovCisgICAgICAgIGN1cl9ieXRlID0gYnVmW3N0cmVhbV9wdHIrK107CisgICAgICAgIHVfcGxhbmVbdV9wdHIrK10gPSB1X3ByZWQgPSBjdXJfYnl0ZSAmIDB4RjA7CisgICAgICAgIHlfcGxhbmVbeV9wdHIrK10gPSB5X3ByZWQgPSAoY3VyX2J5dGUgJiAweDBGKSA8PCA0OworCisgICAgICAgIGN1cl9ieXRlID0gYnVmW3N0cmVhbV9wdHIrK107CisgICAgICAgIHZfcGxhbmVbdl9wdHIrK10gPSB2X3ByZWQgPSBjdXJfYnl0ZSAmIDB4RjA7CisgICAgICAgIHlfcHJlZCArPSB5X3RhYmxlW2N1cl9ieXRlICYgMHgwRl07CisgICAgICAgIHlfcGxhbmVbeV9wdHIrK10gPSB5X3ByZWQ7CisKKyAgICAgICAgY3VyX2J5dGUgPSBidWZbc3RyZWFtX3B0cisrXTsKKyAgICAgICAgeV9wcmVkICs9IHlfdGFibGVbY3VyX2J5dGUgJiAweDBGXTsKKyAgICAgICAgeV9wbGFuZVt5X3B0cisrXSA9IHlfcHJlZDsKKyAgICAgICAgeV9wcmVkICs9IHlfdGFibGVbKGN1cl9ieXRlICYgMHhGMCkgPj4gNF07CisgICAgICAgIHlfcGxhbmVbeV9wdHIrK10gPSB5X3ByZWQ7CisKKyAgICAgICAgLyogaXRlcmF0ZSB0aHJvdWdoIHRoZSByZW1haW5pbmcgcGl4ZWwgZ3JvdXBzICg0IHBpeGVscy9ncm91cCkgKi8KKyAgICAgICAgcGl4ZWxfZ3JvdXBzID0gcy0+d2lkdGggLyA0IC0gMTsKKyAgICAgICAgd2hpbGUgKHBpeGVsX2dyb3Vwcy0tKSB7CisKKyAgICAgICAgICAgIGN1cl9ieXRlID0gYnVmW3N0cmVhbV9wdHIrK107CisgICAgICAgICAgICB1X3ByZWQgKz0gdV90YWJsZVsoY3VyX2J5dGUgJiAweEYwKSA+PiA0XTsKKyAgICAgICAgICAgIHVfcGxhbmVbdV9wdHIrK10gPSB1X3ByZWQ7CisgICAgICAgICAgICB5X3ByZWQgKz0geV90YWJsZVtjdXJfYnl0ZSAmIDB4MEZdOworICAgICAgICAgICAgeV9wbGFuZVt5X3B0cisrXSA9IHlfcHJlZDsKKworICAgICAgICAgICAgY3VyX2J5dGUgPSBidWZbc3RyZWFtX3B0cisrXTsKKyAgICAgICAgICAgIHZfcHJlZCArPSB2X3RhYmxlWyhjdXJfYnl0ZSAmIDB4RjApID4+IDRdOworICAgICAgICAgICAgdl9wbGFuZVt2X3B0cisrXSA9IHZfcHJlZDsKKyAgICAgICAgICAgIHlfcHJlZCArPSB5X3RhYmxlW2N1cl9ieXRlICYgMHgwRl07CisgICAgICAgICAgICB5X3BsYW5lW3lfcHRyKytdID0geV9wcmVkOworCisgICAgICAgICAgICBjdXJfYnl0ZSA9IGJ1ZltzdHJlYW1fcHRyKytdOworICAgICAgICAgICAgeV9wcmVkICs9IHlfdGFibGVbY3VyX2J5dGUgJiAweDBGXTsKKyAgICAgICAgICAgIHlfcGxhbmVbeV9wdHIrK10gPSB5X3ByZWQ7CisgICAgICAgICAgICB5X3ByZWQgKz0geV90YWJsZVsoY3VyX2J5dGUgJiAweEYwKSA+PiA0XTsKKyAgICAgICAgICAgIHlfcGxhbmVbeV9wdHIrK10gPSB5X3ByZWQ7CisKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworI2lmIENPTkZJR19BVVJBX0RFQ09ERVIKK0FWQ29kZWMgZmZfYXVyYV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhdXJhIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXVyYXZpc2lvbiBBVVJBIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FVUkEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEN5dXZEZWNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBjeXV2X2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGN5dXZfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfQ1lVVl9ERUNPREVSCitBVkNvZGVjIGZmX2N5dXZfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiY3l1diIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNyZWF0aXZlIFlVViAoQ1lVVikiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQ1lVViwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ3l1dkRlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGN5dXZfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gY3l1dl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RjYS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiZTg4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RjYS5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBEQ0EgY29tcGF0aWJsZSBkZWNvZGVyIGRhdGEKKyAqIENvcHlyaWdodCAoQykgMjAwNCBHaWxkYXMgQmF6aW4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBab3JlcworICogQ29weXJpZ2h0IChDKSAyMDA2IEJlbmphbWluIExhcnNzb24KKyAqIENvcHlyaWdodCAoQykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9lcnJvci5oIgorCisjaW5jbHVkZSAiZGNhLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKworY29uc3QgdWludDMyX3QgYXZwcml2X2RjYV9zYW1wbGVfcmF0ZXNbMTZdID0geworICAgIDAsIDgwMDAsIDE2MDAwLCAzMjAwMCwgMCwgMCwgMTEwMjUsIDIyMDUwLCA0NDEwMCwgMCwgMCwKKyAgICAxMjAwMCwgMjQwMDAsIDQ4MDAwLCA5NjAwMCwgMTkyMDAwCit9OworCitpbnQgYXZwcml2X2RjYV9jb252ZXJ0X2JpdHN0cmVhbShjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc2l6ZSwgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3NpemUpCit7CisgICAgdWludDMyX3QgbXJrOworICAgIGludCBpLCB0bXA7CisgICAgY29uc3QgdWludDE2X3QgKnNzcmMgPSAoY29uc3QgdWludDE2X3QgKikgc3JjOworICAgIHVpbnQxNl90ICpzZHN0ID0gKHVpbnQxNl90ICopIGRzdDsKKyAgICBQdXRCaXRDb250ZXh0IHBiOworCisgICAgaWYgKCh1bnNpZ25lZCkgc3JjX3NpemUgPiAodW5zaWduZWQpIG1heF9zaXplKQorICAgICAgICBzcmNfc2l6ZSA9IG1heF9zaXplOworCisgICAgbXJrID0gQVZfUkIzMihzcmMpOworICAgIHN3aXRjaCAobXJrKSB7CisgICAgY2FzZSBEQ0FfTUFSS0VSX1JBV19CRToKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBzcmNfc2l6ZSk7CisgICAgICAgIHJldHVybiBzcmNfc2l6ZTsKKyAgICBjYXNlIERDQV9NQVJLRVJfUkFXX0xFOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHNyY19zaXplICsgMSkgPj4gMTsgaSsrKQorICAgICAgICAgICAgKnNkc3QrKyA9IGF2X2Jzd2FwMTYoKnNzcmMrKyk7CisgICAgICAgIHJldHVybiBzcmNfc2l6ZTsKKyAgICBjYXNlIERDQV9NQVJLRVJfMTRCX0JFOgorICAgIGNhc2UgRENBX01BUktFUl8xNEJfTEU6CisgICAgICAgIGluaXRfcHV0X2JpdHMoJnBiLCBkc3QsIG1heF9zaXplKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChzcmNfc2l6ZSArIDEpID4+IDE7IGkrKywgc3JjICs9IDIpIHsKKyAgICAgICAgICAgIHRtcCA9ICgobXJrID09IERDQV9NQVJLRVJfMTRCX0JFKSA/IEFWX1JCMTYoc3JjKSA6IEFWX1JMMTYoc3JjKSkgJiAweDNGRkY7CisgICAgICAgICAgICBwdXRfYml0cygmcGIsIDE0LCB0bXApOworICAgICAgICB9CisgICAgICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgICAgIHJldHVybiAocHV0X2JpdHNfY291bnQoJnBiKSArIDcpID4+IDM7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZGNhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9kY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGRhZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGNhLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIERDQSBjb21wYXRpYmxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBHaWxkYXMgQmF6aW4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBab3JlcworICogQ29weXJpZ2h0IChDKSAyMDA2IEJlbmphbWluIExhcnNzb24KKyAqIENvcHlyaWdodCAoQykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19EQ0FfSAorI2RlZmluZSBBVkNPREVDX0RDQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKworLyoqIERDQSBzeW5jd29yZHMsIGFsc28gdXNlZCBmb3IgYml0c3RyZWFtIHR5cGUgZGV0ZWN0aW9uICovCisjZGVmaW5lIERDQV9NQVJLRVJfUkFXX0JFIDB4N0ZGRTgwMDEKKyNkZWZpbmUgRENBX01BUktFUl9SQVdfTEUgMHhGRTdGMDE4MAorI2RlZmluZSBEQ0FfTUFSS0VSXzE0Ql9CRSAweDFGRkZFODAwCisjZGVmaW5lIERDQV9NQVJLRVJfMTRCX0xFIDB4RkYxRjAwRTgKKworLyoqIERDQS1IRCBzcGVjaWZpYyBibG9jayBzdGFydHMgd2l0aCB0aGlzIG1hcmtlci4gKi8KKyNkZWZpbmUgRENBX0hEX01BUktFUiAgICAgMHg2NDU4MjAyNQorCitleHRlcm4gYXZfZXhwb3J0IGNvbnN0IHVpbnQzMl90IGF2cHJpdl9kY2Ffc2FtcGxlX3JhdGVzWzE2XTsKKworLyoqCisgKiBDb252ZXJ0IGJpdHN0cmVhbSB0byBvbmUgcmVwcmVzZW50YXRpb24gYmFzZWQgb24gc3luYyBtYXJrZXIKKyAqLworaW50IGF2cHJpdl9kY2FfY29udmVydF9iaXRzdHJlYW0oY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3NpemUsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9zaXplKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfRENBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RjYV9wYXJzZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RjYV9wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmE2ZDBkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGNhX3BhcnNlci5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogRENBIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSAyMDA0IEdpbGRhcyBCYXppbgorICogQ29weXJpZ2h0IChDKSAyMDA0IEJlbmphbWluIFpvcmVzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQmVuamFtaW4gTGFyc3NvbgorICogQ29weXJpZ2h0IChDKSAyMDA3IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImRjYS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisKK3R5cGVkZWYgc3RydWN0IERDQVBhcnNlQ29udGV4dCB7CisgICAgUGFyc2VDb250ZXh0IHBjOworICAgIHVpbnQzMl90IGxhc3RtYXJrZXI7CisgICAgaW50IHNpemU7CisgICAgaW50IGZyYW1lc2l6ZTsKKyAgICBpbnQgaGRfcG9zOworfSBEQ0FQYXJzZUNvbnRleHQ7CisKKyNkZWZpbmUgSVNfTUFSS0VSKHN0YXRlLCBpLCBidWYsIGJ1Zl9zaXplKSBcCisgICAgKChzdGF0ZSA9PSBEQ0FfTUFSS0VSXzE0Ql9MRSAmJiAoaSA8IGJ1Zl9zaXplIC0gMikgJiYgKGJ1ZltpICsgMV0gJiAweEYwKSA9PSAweEYwICYmICBidWZbaSArIDJdICAgICAgICAgPT0gMHgwNykgfHwgXAorICAgICAoc3RhdGUgPT0gRENBX01BUktFUl8xNEJfQkUgJiYgKGkgPCBidWZfc2l6ZSAtIDIpICYmICBidWZbaSArIDFdICAgICAgICAgPT0gMHgwNyAmJiAoYnVmW2kgKyAyXSAmIDB4RjApID09IDB4RjApIHx8IFwKKyAgICAgIHN0YXRlID09IERDQV9NQVJLRVJfUkFXX0xFIHx8IHN0YXRlID09IERDQV9NQVJLRVJfUkFXX0JFIHx8IHN0YXRlID09IERDQV9IRF9NQVJLRVIpCisKKy8qKgorICogRmluZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lIGluIHRoZSBiaXRzdHJlYW0uCisgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbmV4dCBmcmFtZSwgb3IgLTEKKyAqLworc3RhdGljIGludCBkY2FfZmluZF9mcmFtZV9lbmQoRENBUGFyc2VDb250ZXh0ICpwYzEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgc3RhcnRfZm91bmQsIGk7CisgICAgdWludDMyX3Qgc3RhdGU7CisgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZwYzEtPnBjOworCisgICAgc3RhcnRfZm91bmQgPSBwYy0+ZnJhbWVfc3RhcnRfZm91bmQ7CisgICAgc3RhdGUgICAgICAgPSBwYy0+c3RhdGU7CisKKyAgICBpID0gMDsKKyAgICBpZiAoIXN0YXJ0X2ZvdW5kKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWZfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBzdGF0ZSA9IChzdGF0ZSA8PCA4KSB8IGJ1ZltpXTsKKyAgICAgICAgICAgIGlmIChJU19NQVJLRVIoc3RhdGUsIGksIGJ1ZiwgYnVmX3NpemUpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFwYzEtPmxhc3RtYXJrZXIgfHwgc3RhdGUgPT0gcGMxLT5sYXN0bWFya2VyIHx8IHBjMS0+bGFzdG1hcmtlciA9PSBEQ0FfSERfTUFSS0VSKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2ZvdW5kICAgICA9IDE7CisgICAgICAgICAgICAgICAgICAgIHBjMS0+bGFzdG1hcmtlciA9IHN0YXRlOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhcnRfZm91bmQpIHsKKyAgICAgICAgZm9yICg7IGkgPCBidWZfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBwYzEtPnNpemUrKzsKKyAgICAgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgYnVmW2ldOworICAgICAgICAgICAgaWYgKHN0YXRlID09IERDQV9IRF9NQVJLRVIgJiYgIXBjMS0+aGRfcG9zKQorICAgICAgICAgICAgICAgIHBjMS0+aGRfcG9zID0gcGMxLT5zaXplOworICAgICAgICAgICAgaWYgKElTX01BUktFUihzdGF0ZSwgaSwgYnVmLCBidWZfc2l6ZSkgJiYgKHN0YXRlID09IHBjMS0+bGFzdG1hcmtlciB8fCBwYzEtPmxhc3RtYXJrZXIgPT0gRENBX0hEX01BUktFUikpIHsKKyAgICAgICAgICAgICAgICBpZiAocGMxLT5mcmFtZXNpemUgPiBwYzEtPnNpemUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CisgICAgICAgICAgICAgICAgcGMtPnN0YXRlICAgICAgICAgICAgID0gLTE7CisgICAgICAgICAgICAgICAgcGMxLT5zaXplICAgICAgICAgICAgID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gaSAtIDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gc3RhcnRfZm91bmQ7CisgICAgcGMtPnN0YXRlICAgICAgICAgICAgID0gc3RhdGU7CisgICAgcmV0dXJuIEVORF9OT1RfRk9VTkQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkY2FfcGFyc2VfaW5pdChBVkNvZGVjUGFyc2VyQ29udGV4dCAqcykKK3sKKyAgICBEQ0FQYXJzZUNvbnRleHQgKnBjMSA9IHMtPnByaXZfZGF0YTsKKworICAgIHBjMS0+bGFzdG1hcmtlciA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGNhX3BhcnNlX3BhcmFtcyhjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50ICpkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNhbXBsZV9yYXRlLCBpbnQgKmZyYW1lc2l6ZSkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIHVpbnQ4X3QgaGRyWzEyICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV0gPSB7IDAgfTsKKyAgICBpbnQgcmV0LCBzYW1wbGVfYmxvY2tzLCBzcl9jb2RlOworCisgICAgaWYgKGJ1Zl9zaXplIDwgMTIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKChyZXQgPSBhdnByaXZfZGNhX2NvbnZlcnRfYml0c3RyZWFtKGJ1ZiwgMTIsIGhkciwgMTIpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgaGRyLCA5Nik7CisKKyAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDM5KTsKKyAgICBzYW1wbGVfYmxvY2tzID0gZ2V0X2JpdHMoJmdiLCA3KSArIDE7CisgICAgaWYgKHNhbXBsZV9ibG9ja3MgPCA4KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAqZHVyYXRpb24gPSAyNTYgKiAoc2FtcGxlX2Jsb2NrcyAvIDgpOworCisgICAgKmZyYW1lc2l6ZSA9IGdldF9iaXRzKCZnYiwgMTQpICsgMTsKKyAgICBpZiAoKmZyYW1lc2l6ZSA8IDk1KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHNraXBfYml0cygmZ2IsIDYpOworICAgIHNyX2NvZGUgICAgICA9IGdldF9iaXRzKCZnYiwgNCk7CisgICAgKnNhbXBsZV9yYXRlID0gYXZwcml2X2RjYV9zYW1wbGVfcmF0ZXNbc3JfY29kZV07CisgICAgaWYgKCpzYW1wbGVfcmF0ZSA9PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRjYV9wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgRENBUGFyc2VDb250ZXh0ICpwYzEgPSBzLT5wcml2X2RhdGE7CisgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZwYzEtPnBjOworICAgIGludCBuZXh0LCBkdXJhdGlvbiwgc2FtcGxlX3JhdGU7CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVMpIHsKKyAgICAgICAgbmV4dCA9IGJ1Zl9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIG5leHQgPSBkY2FfZmluZF9mcmFtZV9lbmQocGMxLCBidWYsIGJ1Zl9zaXplKTsKKworICAgICAgICBpZiAoZmZfY29tYmluZV9mcmFtZShwYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgICAgICpwb3V0YnVmICAgICAgPSBOVUxMOworICAgICAgICAgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZWFkIHRoZSBkdXJhdGlvbiBhbmQgc2FtcGxlIHJhdGUgZnJvbSB0aGUgZnJhbWUgaGVhZGVyICovCisgICAgaWYgKCFkY2FfcGFyc2VfcGFyYW1zKGJ1ZiwgYnVmX3NpemUsICZkdXJhdGlvbiwgJnNhbXBsZV9yYXRlLCAmcGMxLT5mcmFtZXNpemUpKSB7CisgICAgICAgIHMtPmR1cmF0aW9uICAgICAgICA9IGR1cmF0aW9uOworICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKyAgICB9IGVsc2UKKyAgICAgICAgcy0+ZHVyYXRpb24gPSAwOworCisgICAgKnBvdXRidWYgICAgICA9IGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK0FWQ29kZWNQYXJzZXIgZmZfZGNhX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX0RUUyB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihEQ0FQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfaW5pdCAgICA9IGRjYV9wYXJzZV9pbml0LAorICAgIC5wYXJzZXJfcGFyc2UgICA9IGRjYV9wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kY2FkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9kY2FkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyZjE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RjYWRhdGEuaApAQCAtMCwwICsxLDc2NjYgQEAKKy8qCisgKiBEQ0EgY29tcGF0aWJsZSBkZWNvZGVyIGRhdGEKKyAqIENvcHlyaWdodCAoQykgMjAwNCBHaWxkYXMgQmF6aW4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBCZW5qYW1pbiBMYXJzc29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19EQ0FEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19EQ0FEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisvKiBHZW5lcmljIHRhYmxlcyAqLworCitzdGF0aWMgY29uc3QgdWludDMyX3QgZGNhX2JpdF9yYXRlc1szMl0gPSB7CisgICAgICAzMjAwMCwgICA1NjAwMCwgICA2NDAwMCwgICA5NjAwMCwgIDExMjAwMCwgMTI4MDAwLAorICAgICAxOTIwMDAsICAyMjQwMDAsICAyNTYwMDAsICAzMjAwMDAsICAzODQwMDAsCisgICAgIDQ0ODAwMCwgIDUxMjAwMCwgIDU3NjAwMCwgIDY0MDAwMCwgIDc2ODAwMCwKKyAgICAgODk2MDAwLCAxMDI0MDAwLCAxMTUyMDAwLCAxMjgwMDAwLCAxMzQ0MDAwLAorICAgIDE0MDgwMDAsIDE0MTEyMDAsIDE0NzIwMDAsIDE1MzYwMDAsIDE5MjAwMDAsCisgICAgMjA0ODAwMCwgMzA3MjAwMCwgMzg0MDAwMCwgMSAvKiBvcGVuICovLCAyIC8qIHZhcmlhYmxlICovLCAzIC8qIGxvc3NsZXNzICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkY2FfY2hhbm5lbHNbMTZdID0geworICAgIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDYsIDYsIDYsIDcsIDgsIDgKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRjYV9iaXRzX3Blcl9zYW1wbGVbN10gPSB7CisgICAgMTYsIDE2LCAyMCwgMjAsIDAsIDI0LCAyNAorfTsKKworLyogQURQQ00gZGF0YSAqLworCisvKiAxNmJpdHMgc2lnbmVkIGZyYWN0aW9uYWwgUTEzIGJpbmFyeSBjb2RlcyAqLworc3RhdGljIGNvbnN0IGludDE2X3QgYWRwY21fdmJbNDA5Nl1bNF0gPSB7CisgICAgeyAgIDk5MjgsICAtMjYxOCwgIC0xMDkzLCAtMTI2MyB9LAorICAgIHsgIDExMDc3LCAgLTI4NzYsICAtMTc0NywgIC0zMDggfSwKKyAgICB7ICAxMDUwMywgIC0xMDgyLCAgLTE0MjYsIC0xMTY3IH0sCisgICAgeyAgIDkzMzcsICAtMjQwMywgIC0xNDk1LCAgIDI3NCB9LAorICAgIHsgIDEwNjk4LCAgLTI1MjksICAgLTUzMiwgLTExMjIgfSwKKyAgICB7ICAxMDM2OCwgIC0zOTc0LCAgLTEyNjQsICAtNzUwIH0sCisgICAgeyAgMTAwNzAsICAtMzY2NywgICAgMzQ2LCAgIDg2MyB9LAorICAgIHsgIDEwMjc4LCAgLTMwOTMsICAgIDMxMSwgIC01NzYgfSwKKyAgICB7ICAgOTg5NCwgIC0xMzMwLCAgLTE0MjgsICAtODYwIH0sCisgICAgeyAgMTA1NDQsICAtMTkyMywgIC0xMDU4LCAgLTk3MSB9LAorICAgIHsgIDEwOTk2LCAgLTE2MzIsICAgLTg0MSwgLTE0MDQgfSwKKyAgICB7ICAxMTgzMiwgIC0zNDY1LCAgIDE2NTgsIC0xOTkwIH0sCisgICAgeyAgMTA4NTIsICAgLTY4OCwgIC0yNjU4LCAgLTQ5OSB9LAorICAgIHsgIDEwNTQ2LCAgLTE3NDksICAgLTE0NywgLTE3MzMgfSwKKyAgICB7ICAxMDgwMSwgIC0xMDA0LCAgIC03MDgsIC0xNDUzIH0sCisgICAgeyAgMTA1ODgsICAgLTQ0MSwgIC0yMTEzLCAgLTk1MiB9LAorICAgIHsgIDEwMTQxLCAgLTMzMzEsICAgLTU4MiwgLTE0MzIgfSwKKyAgICB7ICAgOTYwOCwgIC0yNTkwLCAgICAzODMsICAgMjU4IH0sCisgICAgeyAgMTE0MjIsICAtMzI2NSwgICAgMjI5LCAtMTU0NCB9LAorICAgIHsgIDEwNDYwLCAgLTEzMzgsICAgLTcxMywgLTE1NjggfSwKKyAgICB7ICAxMDMwNiwgIC0xNzIxLCAgLTE2NjAsICAtNjAzIH0sCisgICAgeyAgIDk1ODAsICAtMTgxMiwgIC0xMjM1LCAtMTA2MSB9LAorICAgIHsgIDExNDcxLCAgLTIyODUsICAtMTYxNywgIC02MDcgfSwKKyAgICB7ICAxMDA4MSwgIC0yMjI1LCAgLTE0MDgsICAtODY4IH0sCisgICAgeyAgMTA3MTUsICAtMjYyNCwgIC0xMzY3LCAgLTcwNCB9LAorICAgIHsgIDEwNjE2LCAgLTE4NzEsICAtMjc3MCwgICAtMzUgfSwKKyAgICB7ICAgOTM1MiwgIC0yMzQwLCAgLTEwMjQsIC0xNTY2IH0sCisgICAgeyAgMTEwNjUsICAtMTQ1OCwgIC0xOTI2LCAgLTczNSB9LAorICAgIHsgIDExMzM0LCAgLTIwNTYsICAtMTA0MSwgLTExNDQgfSwKKyAgICB7ICAgOTgyNSwgIC0yMDQ4LCAgIC03OTQsIC0xNTM2IH0sCisgICAgeyAgMTE4NTAsICAtMjY5NSwgIC0xMTIzLCAgLTg2NyB9LAorICAgIHsgIDEwNjU0LCAgLTIyMjYsICAtMTg5MSwgIC0zNzMgfSwKKyAgICB7ICAxMDAyNCwgIC0xNTU3LCAgIC04MDgsIC0xMDY5IH0sCisgICAgeyAgMTExNDIsICAtMTI2NiwgIC0zMjM4LCAgIDEyOCB9LAorICAgIHsgIDExNzI5LCAgLTMyODIsICAgLTUxNCwgLTEwMTEgfSwKKyAgICB7ICAxMTQwMiwgIC0yMDk0LCAgLTIzMzUsICAtMTg5IH0sCisgICAgeyAgMTAxOTUsICAtMzY1OCwgICAgMTgxLCAtMTg3NSB9LAorICAgIHsgIDExNDMxLCAgLTI2MjYsICAgLTQwNCwgLTEzNzcgfSwKKyAgICB7ICAxMTAwMSwgIC0zODY4LCAgIC02MTksIC0xMDc3IH0sCisgICAgeyAgMTA4OTQsICAtMjU1OSwgICAgMjc0LCAtMTc1OCB9LAorICAgIHsgICA5NjMzLCAgLTE0ODIsICAtMjI1MywgIC03NzMgfSwKKyAgICB7ICAxMTI0NSwgIC0zMzIxLCAgICA4MzAsIC0xOTcyIH0sCisgICAgeyAgIDk3NjgsICAtMjcwMSwgICAtMTk5LCAtMTg1OSB9LAorICAgIHsgIDEwNTAwLCAgLTIwNDIsICAgIDUyNSwgLTIwNDMgfSwKKyAgICB7ICAxMTY2OSwgIC00MDY5LCAgICAyOTMsIC0xNDY4IH0sCisgICAgeyAgIDkxOTIsICAtMTk5MSwgICAtNTgzLCAgIC02MSB9LAorICAgIHsgIDEwMDU3LCAgLTMyMjAsICAtMjAxNSwgIC00NzMgfSwKKyAgICB7ICAgOTQ5NywgIC0yMzE1LCAgLTI0OTAsICAtNDY3IH0sCisgICAgeyAgMTA0NTUsICAtMzA2OSwgIC0xMTk0LCAtMTAwNyB9LAorICAgIHsgICA5OTk0LCAgLTE5MzYsICAgIC02MCwgLTEyMjUgfSwKKyAgICB7ICAgOTI5NSwgIC0yMTU2LCAgLTE3NjEsIC0xMTM0IH0sCisgICAgeyAgMTAwODUsICAtMzc0OCwgIC0xMDI2LCAgIDE5NyB9LAorICAgIHsgICA5MzM0LCAgLTIzNjAsICAgIDgwNCwgIC0zNTEgfSwKKyAgICB7ICAxMTU2MSwgIC0yNTUzLCAgIDEzNTIsIC0yMzEzIH0sCisgICAgeyAgMTI4MzcsICAtMzk5OCwgICAxMTk1LCAtMTk1OCB9LAorICAgIHsgIDEwMTE0LCAgLTExMDAsICAtMjQxNCwgIC0zOTQgfSwKKyAgICB7ICAgOTM0MSwgIC0yNTMwLCAgICAzMTUsICAgNzU1IH0sCisgICAgeyAgMTAxMzEsICAtMzE2NCwgICAxNDExLCAgLTY3NCB9LAorICAgIHsgICA5NTM1LCAgIC05MDUsICAtMTU1MSwgICA1NzkgfSwKKyAgICB7ICAxMTcxNywgIC0xNTE5LCAgLTMwNTEsICAgIDkxIH0sCisgICAgeyAgIDk4MjQsICAtMjkxMSwgIC0yNzc1LCAgIDE5MiB9LAorICAgIHsgICA5NjYyLCAgLTI5MzQsICAgLTU2MSwgIDE0NTAgfSwKKyAgICB7ICAxMTA4NSwgIC0zMzkyLCAgLTEyOTgsICAtNjU5IH0sCisgICAgeyAgIDg5NTUsICAtMjEwMiwgIC0xODk5LCAgIDcwMyB9LAorICAgIHsgICA4NjA3LCAgLTE3NDIsICAtNDM0OCwgICA4MTQgfSwKKyAgICB7ICAgNzY0MCwgIC0yMDYzLCAgLTM2MTcsICAgIDUyIH0sCisgICAgeyAgIDcwNzQsICAgLTgyNiwgIC00MzI1LCAgNDM3NSB9LAorICAgIHsgICA3NzE0LCAgICA1ODQsICAtNDIzOCwgIDE5MjcgfSwKKyAgICB7ICAgNjM1NSwgICAtOTUyLCAgLTQ5MTIsICAzMTI3IH0sCisgICAgeyAgIDcwNjksICAgLTY2MCwgIC02NDEzLCAgNDA4NyB9LAorICAgIHsgICA4MzEzLCAgIC0xMzIsICAtMjk2NCwgIC04NzYgfSwKKyAgICB7ICAgNjk1MiwgIC0xNDIyLCAgLTM5NjIsICAgLTI0IH0sCisgICAgeyAgIDkyOTksICAgLTczNCwgIC0zMDg4LCAgLTI2MyB9LAorICAgIHsgICA5NDg0LCAgIC01NzQsICAtNDUxMywgICA0NjYgfSwKKyAgICB7ICAgNzI0NiwgICAgLTkxLCAgLTM3MzUsICAtNzA0IH0sCisgICAgeyAgIDgzMjUsICAtMTQxNywgIC0zMDkwLCAgLTUzMCB9LAorICAgIHsgICA2NDY5LCAgLTEyMjYsICAtNDc1NywgICA4MjkgfSwKKyAgICB7ICAgNjY1MiwgICAtMzY4LCAgLTU2ODIsICAxMzkzIH0sCisgICAgeyAgIDc5NzEsICAtMTI3OCwgIC0yMjg0LCAgMTIwNSB9LAorICAgIHsgICA3MjI5LCAgIC02OTksICAtMzU1NiwgIDE4NDAgfSwKKyAgICB7ICAgNzk5NCwgICAxMjg0LCAgLTI3MjksICAgNzMyIH0sCisgICAgeyAgIDkwMDUsICAgLTY5OCwgIC00NTIyLCAgMjE4OSB9LAorICAgIHsgICA2OTYzLCAgICAxOTcsICAtMjcyNywgICAzODAgfSwKKyAgICB7ICAgODUyNywgICAgMTM1LCAgLTM5OTEsICAtMjEzIH0sCisgICAgeyAgIDg4NDAsICAgIDkzNCwgIC0zMDE0LCAgLTU2NyB9LAorICAgIHsgIDEwMTI1LCAgICA0MTgsICAtMzI4NCwgIC0zNzEgfSwKKyAgICB7ICAgNjM2NywgICAgMzYxLCAgLTIzMTgsICAyNTU0IH0sCisgICAgeyAgIDc4OTIsICAgIDE3MiwgIC01MjQ3LCAgNDY3MyB9LAorICAgIHsgICA2Njc0LCAgICAzODcsICAtNTQyNCwgIDQzOTggfSwKKyAgICB7ICAgNjI0MCwgICAgNjg0LCAgLTQwNDcsICAxMjE5IH0sCisgICAgeyAgMTExNzAsICAgLTc5NCwgIC01MDgxLCAgMTE5NSB9LAorICAgIHsgIDExNzY1LCAgIC02NDgsICAtNjI2NSwgIDIwNTIgfSwKKyAgICB7ICAxMDg0NSwgICAtNzc1LCAgLTM4MzcsICAgMzY2IH0sCisgICAgeyAgMTI0OTYsICAgLTY4OSwgIC04MjYwLCAgMzU2MiB9LAorICAgIHsgICA3ODkzLCAgLTExNjYsICAtNDk3MiwgICA5ODggfSwKKyAgICB7ICAgODU5MiwgICAxMDUyLCAgLTU5ODYsICAzMDg3IH0sCisgICAgeyAgIDcyNzcsICAgMTg3NCwgIC01Njg1LCAgMzU3OSB9LAorICAgIHsgICA2OTAwLCAgIDIwMTYsICAtNDgwOSwgIDM0OTEgfSwKKyAgICB7ICAgODUzMCwgIC0yNDA1LCAgLTMyNTAsICAxOTg2IH0sCisgICAgeyAgIDk0MjYsICAgIDQ5NCwgIC03MDY3LCAgNTAzOCB9LAorICAgIHsgIDEwMjg1LCAgICA1NjQsICAtODIxMCwgIDUzNzAgfSwKKyAgICB7ICAgODc0OSwgIC0yMjA3LCAgLTM5ODAsICAyODUyIH0sCisgICAgeyAgIDk2NTMsICAtMjY4NiwgIC00MzAwLCAgMTQwMCB9LAorICAgIHsgICA5NzcwLCAgLTIyODYsICAtNTY2MywgIDQyMzMgfSwKKyAgICB7ICAgODQ5MCwgICAgIC00LCAgLTcwNDgsICA0NDk2IH0sCisgICAgeyAgIDc2OTcsICAtMTIwOSwgIC01MzI4LCAgMzE4MyB9LAorICAgIHsgICA2NDUxLCAgICA4MDEsICAtNDMyNCwgIC01NTQgfSwKKyAgICB7ICAgNzM4NywgICAxODA2LCAgLTUyNjUsICAgNTQ1IH0sCisgICAgeyAgIDc0NTAsICAtMjMwMiwgIC00NDQ1LCAgMTQxOCB9LAorICAgIHsgICA4ODE3LCAgLTEzNzAsICAtNTgyNywgIDIxNjggfSwKKyAgICB7ICAxMDMyNCwgIC0yNDA2LCAgLTU2MjksICAyNTc5IH0sCisgICAgeyAgIDg4NjMsICAtMjU3OCwgIC0zNTM3LCAgIDQ2NyB9LAorICAgIHsgICA2OTAxLCAgLTE2MjQsICAtMzE2OSwgIDMzOTIgfSwKKyAgICB7ICAgNzg0NiwgICAgMTU2LCAgLTY5NDgsICAzMzgxIH0sCisgICAgeyAgIDc5MjgsICAtMTExNSwgIC01OTcyLCAgNDgxNiB9LAorICAgIHsgICA2MDg5LCAgIC01OTksICAtNDM2OCwgIC0zMjAgfSwKKyAgICB7ICAgNzgzMywgICAxMjQ2LCAgLTM5NjAsICAtNjIxIH0sCisgICAgeyAgIDg5MzEsICAgMjUyMSwgIC02NzY4LCAgMjA1MiB9LAorICAgIHsgICA4OTAwLCAgIDE5NDQsICAtNDEyNiwgICAgNDAgfSwKKyAgICB7ICAgNzY2MSwgICAgLTM0LCAgLTI4NTUsICAyNDgwIH0sCisgICAgeyAgIDU4NzMsICAgIDQ3NCwgIC0zMjYyLCAgMzcxMiB9LAorICAgIHsgICA3NTM1LCAgIC0yMzQsICAtNDY5OSwgICAyMTYgfSwKKyAgICB7ICAgNTg1NiwgICAgMTQzLCAgLTUxNDIsICAgIDczIH0sCisgICAgeyAgIDg5NDQsICAgLTEwNiwgIC01ODc0LCAgMzY2MyB9LAorICAgIHsgICA3MTM0LCAgICA0MjYsICAtNTg3OSwgIDI4OTUgfSwKKyAgICB7ICAxMDE5OSwgICAxMDExLCAgLTQ3NjIsICAgMzY5IH0sCisgICAgeyAgIDg0NTQsICAgIDI2NCwgIC01OTcxLCAgMTI5MSB9LAorICAgIHsgICA3ODIyLCAgLTI0NDksICAtNDMzMywgIDQ1NDAgfSwKKyAgICB7ICAgNjIwMCwgIC0yNzU4LCAgLTI2MzIsICAxNDk3IH0sCisgICAgeyAgIDYwNzAsICAtNDMxNSwgIC0yNjk5LCAgIDQxNCB9LAorICAgIHsgICA3MDQ3LCAgLTM3MzksICAtMzIxMCwgIDEwNjAgfSwKKyAgICB7ICAgNTY3NSwgIC0zODAxLCAgLTI3MTcsICAtNDA3IH0sCisgICAgeyAgIDQ3ODksICAtNDA2MywgIC0yNjI4LCAgLTc0NCB9LAorICAgIHsgICA0MDIzLCAgLTMzNjYsICAtMzEzMywgIC03MjYgfSwKKyAgICB7ICAgNDI5NiwgIC0yNDA3LCAgLTMzODEsICAtNTEzIH0sCisgICAgeyAgIDQzODgsICAtMjkzMSwgIC0yODIwLCAgMTUxMiB9LAorICAgIHsgICA0NTU5LCAgLTQyMzMsICAtMTk0MSwgIDE5NzYgfSwKKyAgICB7ICAgNjcwMiwgIC0zMjA4LCAgLTE3NTUsICAxNjgwIH0sCisgICAgeyAgIDQ0MTYsICAtMzUyMSwgIC0xMDUyLCAgMjk4NCB9LAorICAgIHsgICA3MTU0LCAgLTQyNjYsICAtMTIwMywgIDM3MzIgfSwKKyAgICB7ICAgMzYyNSwgIC00MjQyLCAgLTMyNDQsICAxMzk1IH0sCisgICAgeyAgIDY1MTgsICAtMjg1NiwgIC0xMzA0LCAgMjg4NyB9LAorICAgIHsgICA2MTcwLCAgLTE5NDksICAtMzAxNCwgIDM5NzMgfSwKKyAgICB7ICAgNTE4OSwgIC0yNDUxLCAgLTQwMjAsICAzNDc3IH0sCisgICAgeyAgIDYyMTgsICAtMjk4OCwgIC0xOTIxLCAgMzg0NCB9LAorICAgIHsgICA0ODI3LCAgLTM2ODgsICAtMTkyOCwgIDMzNDMgfSwKKyAgICB7ICAgNjY2OCwgIC0zOTkxLCAgLTI4MDUsICAzMDk1IH0sCisgICAgeyAgIDUyOTcsICAtMzExNSwgIC0zNjg0LCAgMjM5MCB9LAorICAgIHsgICA1MzU0LCAgLTQ2MTQsICAtMjY2MiwgIDE1MDQgfSwKKyAgICB7ICAgNDE5NiwgIC0zMDkxLCAgLTQxNDcsICAxMTM1IH0sCisgICAgeyAgIDM1NDAsICAtMjg5MywgIC00MDA3LCAgIDEwMCB9LAorICAgIHsgICA1NTY5LCAgLTE2MDIsICAtNDAwNywgIDE5MDkgfSwKKyAgICB7ICAgNDM0MSwgIC0yMDkxLCAgLTQyNzIsICAgMjUyIH0sCisgICAgeyAgIDU1NTksICAtMjg3OCwgIC0zODMyLCAgIDQ5OCB9LAorICAgIHsgICA0NTQ4LCAgLTQ0NzksICAtMjg5OCwgICAtMjcgfSwKKyAgICB7ICAgNTE3NiwgIC0yNDk0LCAgLTQ2MzUsICAxNDc2IH0sCisgICAgeyAgIDMyOTQsICAtMzQ4NSwgIC0zNzM4LCAgIDcxNiB9LAorICAgIHsgICA0OTIwLCAgLTEyMjksICAtNDE5NSwgIC0zNjUgfSwKKyAgICB7ICAgMzI1NywgIC0zNTE4LCAgLTMzNDksICAyODYyIH0sCisgICAgeyAgIDUyODYsICAtMTk0OCwgIC0zNDg1LCAgLTc3OCB9LAorICAgIHsgICA2NTAyLCAgLTMwNTEsICAgLTE1MiwgIDI4NTQgfSwKKyAgICB7ICAgNTg2NCwgIC00MTkyLCAgLTEwNzYsICAzNDUxIH0sCisgICAgeyAgIDQ2NTYsICAtMzEyMiwgIC0zNDQ4LCAgIDE3OSB9LAorICAgIHsgICA1OTA3LCAgIC03NTQsICAtMTU5NiwgIDMxMTYgfSwKKyAgICB7ICAgNzIyOSwgIC0zNjgwLCAgLTE1OTAsICAyODkyIH0sCisgICAgeyAgIDUxMDcsICAtMzg4OCwgIC0zMzY0LCAgIDgwNiB9LAorICAgIHsgICA2NzY0LCAgLTI2MzUsICAtMzQ1MCwgICAxMzQgfSwKKyAgICB7ICAgNTI1OCwgIC0yODI3LCAgLTI4NDQsIC0xMDUyIH0sCisgICAgeyAgIDU3OTgsICAtMTcyNSwgIC00MzA1LCAgIDIwNSB9LAorICAgIHsgICA1NDA0LCAgLTEyMTMsICAtMzM2MiwgICA0NDkgfSwKKyAgICB7ICAgNjIyNCwgIC0yNzM4LCAgLTMwNDYsICAtNTgxIH0sCisgICAgeyAgIDQyMjMsICAtMjQzOCwgIC0yNzI1LCAgMzc0NSB9LAorICAgIHsgICA0NzUxLCAgLTM0MTEsICAtMjEyMywgICAxMTYgfSwKKyAgICB7ICAgMzg2OCwgIC0zMDAwLCAgLTM5NTQsICAyMjk3IH0sCisgICAgeyAgIDY4MTksICAtMjg5OSwgIC00Mjc3LCAgMjgyNSB9LAorICAgIHsgICA0MjA3LCAgLTQ3NTQsICAtMjgwOCwgICA4NjUgfSwKKyAgICB7ICAgNDgwNCwgIC0xNDk0LCAgLTE5OTcsICA0Njg4IH0sCisgICAgeyAgIDUyODIsICAtMjIxMywgICAtNTQ4LCAgMzU1OSB9LAorICAgIHsgICA1NTgwLCAgLTE5MTIsICAgLTU2NiwgIDQzNzAgfSwKKyAgICB7ICAgNjE2OCwgIC0yODU3LCAgIC02NzIsICA0MDUzIH0sCisgICAgeyAgIDY1ODMsICAtNDUxNSwgIC0yODUwLCAgMTY3MCB9LAorICAgIHsgICA2NTExLCAgLTMwOTMsICAtMzk4OCwgIDE0MjEgfSwKKyAgICB7ICAgNDY0NiwgIC0xNzkwLCAgLTE0NDMsICAzNjUwIH0sCisgICAgeyAgIDU5MTUsICAgLTkyNCwgIC0yMDIwLCAgIDg5NiB9LAorICAgIHsgICA3ODE0LCAgLTQxODEsICAtMzE1MiwgIDIwMDcgfSwKKyAgICB7ICAgNjE5MCwgIC0yMjM4LCAgLTQ4MTcsICAyMjc5IH0sCisgICAgeyAgIDQ3MzcsICAtNDAzNCwgIC0zMjg4LCAgMTgzNSB9LAorICAgIHsgICA4MTYxLCAgLTM2MzMsICAtMzQyMywgIDMxMzcgfSwKKyAgICB7ICAgNzQxNSwgIC0yMzUxLCAgLTIwODgsICA0MjkwIH0sCisgICAgeyAgIDQxMDYsICAtMjUxNywgICAgLTYyLCAgMjkwNSB9LAorICAgIHsgICA0OTA5LCAgLTMxNDUsICAgLTYxNCwgIDQxMTIgfSwKKyAgICB7ICAgNDkzOCwgIC0zMjgxLCAgIC0zOTcsICAxMTAwIH0sCisgICAgeyAgIC0xNzMsICAgIDkxOSwgICAxNTg5LCAtNTM2MyB9LAorICAgIHsgICAgLTEzLCAgICA3OTYsICAgLTI5NSwgLTY2NTUgfSwKKyAgICB7ICAtMTg2MCwgICAtODI5LCAgIDExNDEsIC00NTU1IH0sCisgICAgeyAgIDIyOTgsICAgLTgzOCwgICAtNjY0LCAtNTAwNSB9LAorICAgIHsgICAtODg0LCAgLTEwOTcsICAgMjA3NCwgLTQ2MTMgfSwKKyAgICB7ICAgLTEwMSwgICAgMjgxLCAgIDI4NDYsIC00NTM1IH0sCisgICAgeyAgIDExNjYsICAgIDQ1MywgICAyNDI5LCAtNTkxMCB9LAorICAgIHsgICAgODc5LCAgIC02NjQsICAgMjM3MCwgLTU0NTIgfSwKKyAgICB7ICAgMTQxNSwgICAtMzcwLCAgLTE2OTksIC00NzI3IH0sCisgICAgeyAgLTE0MTMsICAgMTI3NywgICAtNjY5LCAtNjY0OSB9LAorICAgIHsgICAyMTMzLCAgICAzMDQsICAgLTk2OCwgLTQ2MjQgfSwKKyAgICB7ICAgIDM4MCwgICAgNTg2LCAgLTIwODcsIC00ODkyIH0sCisgICAgeyAgIDEzMzYsICAgIDI3NSwgICAgLTgyLCAtNTc4OSB9LAorICAgIHsgIC0yNDU5LCAgIDEwNTcsICAgIC0zNCwgLTU0MTYgfSwKKyAgICB7ICAgMjI3OCwgIC0xNzU4LCAgICA4NjYsIC01NjUzIH0sCisgICAgeyAgIDE5NDUsICAtMjI5NSwgICAtMTQ5LCAtNTMwMiB9LAorICAgIHsgICAxMjg3LCAgLTM1MjUsICAgIDk5NiwgLTUyNTUgfSwKKyAgICB7ICAgMjI5NywgICAgODAzLCAgIDExNzcsIC02MDY3IH0sCisgICAgeyAgICAxODcsICAgLTE4MCwgICAtNjE5LCAtNjIwMiB9LAorICAgIHsgICAtNzkzLCAgLTI1MzcsICAgMTU1NCwgLTUwNTcgfSwKKyAgICB7ICAtMjcwMywgICAtMjA0LCAgIC02MjksIC01ODUzIH0sCisgICAgeyAgLTEwMDcsICAgLTE0NiwgICAgMzEzLCAtNTU4MiB9LAorICAgIHsgICAgODMwLCAgICAzNTcsICAgIDg2OSwgLTYzNjMgfSwKKyAgICB7ICAgLTIyOCwgICAtNTc1LCAgLTMxNzcsIC00NDMzIH0sCisgICAgeyAgLTEwMDEsICAtMTU1MywgICAtMTQyLCAtNTcwOCB9LAorICAgIHsgIC0xNjQ0LCAgIDE2ODMsICAgMTcyMSwgLTQ1MzMgfSwKKyAgICB7ICAgIDg5MywgICAxOTI0LCAgICAtMTUsIC01NzkxIH0sCisgICAgeyAgIDIxOTUsICAgMjA2MSwgICAtMjYyLCAtNTQ3MSB9LAorICAgIHsgICAzMDMxLCAgICAyNzAsICAgIDMxMSwgLTUwOTYgfSwKKyAgICB7ICAgMTkxMiwgICAxNjM4LCAgLTE1MjMsIC00Njc3IH0sCisgICAgeyAgLTMxNDIsICAgIC01NSwgICAgMjUzLCAtNDkxNCB9LAorICAgIHsgICAgMzU2LCAgLTE2ODAsICAgIDM0MywgLTYxMjMgfSwKKyAgICB7ICAtMjI0MSwgIC0xNzM0LCAgIC05NzYsIC01OTM5IH0sCisgICAgeyAgLTIxOTYsICAtMjg5MywgICAgNTQ3LCAtNDkzOCB9LAorICAgIHsgIC0xMjQ1LCAgICAxMjYsICAtMTkxNiwgLTU0MTkgfSwKKyAgICB7ICAgLTI0OSwgIC0zNzU1LCAgLTE0MjIsIC01NTk0IH0sCisgICAgeyAgICA1NzUsICAtMjY4MywgIC0xOTI2LCAtNDU2NiB9LAorICAgIHsgICAtNzYyLCAgIDE4ODUsICAgIDE5MiwgLTU4ODAgfSwKKyAgICB7ICAgLTgxMSwgIC0yNTYyLCAgLTEwNjgsIC02MDEzIH0sCisgICAgeyAgLTIyNjQsICAtMzA4NiwgICAtOTc2LCAtNDc3NSB9LAorICAgIHsgICAgIDcwLCAgLTEyMTUsICAgMjg4MCwgLTQ0MTAgfSwKKyAgICB7ICAgIDcxNCwgIC0zNzYwLCAgIDI5MTYsIC00NjkxIH0sCisgICAgeyAgIC0yNDQsICAtMzQwNCwgICAxNzQwLCAtNDQ5MyB9LAorICAgIHsgICAgNjg0LCAgLTUxMzcsICAgLTMyOCwgLTU2MDggfSwKKyAgICB7ICAgLTUyOSwgIC0zODI1LCAgLTE3ODYsIC00NTM1IH0sCisgICAgeyAgIC03MTMsICAtNDc0MywgIC0xMTE4LCAtNTU0NiB9LAorICAgIHsgICAyNzE4LCAgLTM3ODgsICAgMTc5OCwgLTU3MDggfSwKKyAgICB7ICAtMTYzOSwgIC0zNjc5LCAgLTE1NjQsIC02MDk1IH0sCisgICAgeyAgIDE2OTMsICAtMjY0MiwgIC0xMzg5LCAtNDUzOSB9LAorICAgIHsgICAgNTA1LCAgLTE1NzMsICAtMTY1MSwgLTQ4NzggfSwKKyAgICB7ICAgLTgzNSwgIC0yMjU2LCAgLTE5NDEsIC01MzUyIH0sCisgICAgeyAgIDE0NjQsICAgLTQxMSwgICAxOTkzLCAtNjQ0MSB9LAorICAgIHsgICAgNDkzLCAgLTMxODQsICAgLTE0NSwgLTYxNDggfSwKKyAgICB7ICAtMTQxMywgICAgNDk5LCAgLTE2MTcsIC02NDc5IH0sCisgICAgeyAgIC0yOTQsICAgMTcyMiwgIC0xNDE5LCAtNTcyNSB9LAorICAgIHsgIC0yOTM3LCAgLTE1MjgsICAgLTE3NSwgLTQ2MjQgfSwKKyAgICB7ICAgLTU5NCwgIC01OTExLCAgICAtNTYsIC02MTQ2IH0sCisgICAgeyAgIC0zMDAsICAtNDI3NSwgICAxMTU2LCAtNTk0NyB9LAorICAgIHsgICAgNTUyLCAgLTI2NDMsICAgMjY2OSwgLTM5NTkgfSwKKyAgICB7ICAgIDkwNSwgIC00MTU4LCAgIDE3ODksIC01ODA5IH0sCisgICAgeyAgIDEzMzYsICAtMjAwOSwgICAyMTA4LCAtNTkwMyB9LAorICAgIHsgICAxNTU1LCAgLTM2MDAsICAgMTExMCwgLTY3NTkgfSwKKyAgICB7ICAtMTI5NCwgIC0zNDY0LCAgICAgNzcsIC02MDg0IH0sCisgICAgeyAgLTExMzksICAtNDAwNiwgIC0xMjcwLCAtNDE4MSB9LAorICAgIHsgIC01MDk0LCAgLTMyOTYsICAgMTA5MiwgLTI4NDcgfSwKKyAgICB7ICAtNTUwMywgIC0yODgzLCAgIDE5ODQsIC0yMDY3IH0sCisgICAgeyAgLTQ2NzEsICAtNDIxOCwgIC0xNDE3LCAtNDEzMiB9LAorICAgIHsgIC0zNzYzLCAgLTM4MTgsICAgMTI2MiwgLTMwODIgfSwKKyAgICB7ICAtNTEzMiwgIC0zNDMwLCAgIDI5MjgsICAtNzI4IH0sCisgICAgeyAgLTU5NTcsICAtMjg3NywgICAxMjUxLCAtMjQ0NiB9LAorICAgIHsgIC00NDI1LCAgLTIzMTksICAgLTIxMiwgLTQyNzYgfSwKKyAgICB7ICAtNjIwMSwgIC0xOTkzLCAgIDE3NzQsIC0yMTgyIH0sCisgICAgeyAgLTU1MDAsICAtMzgzNiwgICAyMjAxLCAtMTM5NiB9LAorICAgIHsgIC02OTM0LCAgLTIzMzQsICAgMjM2NiwgLTEyOTMgfSwKKyAgICB7ICAtNjEyNCwgIC00MTQwLCAgIDEzMzcsIC0xOTc3IH0sCisgICAgeyAgLTY1NTMsICAtNDE4NiwgICAxNzU2LCAtMTMyNSB9LAorICAgIHsgIC01MTI2LCAgLTEyNTgsICAgIDc0NCwgLTM2NTYgfSwKKyAgICB7ICAtNTE2NywgIC0xMzkwLCAgIDE1ODEsIC0yODk1IH0sCisgICAgeyAgLTQ1MjUsICAtMzM5OCwgICAyNDI5LCAtMTg2NSB9LAorICAgIHsgIC00MDc2LCAgLTMxODMsICAgMjAyNywgLTI1MTAgfSwKKyAgICB7ICAtNjE5MSwgIC0zMjc0LCAgIDE4MzgsIC0xODE0IH0sCisgICAgeyAgLTQ0NTQsICAtMjc1MywgICAyNzIzLCAtMTE4NSB9LAorICAgIHsgIC02NjU1LCAgLTQ3OTcsICAgIDI1MSwgLTI1OTUgfSwKKyAgICB7ICAtNjMzMiwgIC0yMjMyLCAgIDE4MzIsICAgMjE3IH0sCisgICAgeyAgLTU4NjksICAtMTY5OCwgICAgMTM0LCAgIDM0MCB9LAorICAgIHsgIC02NjE0LCAgLTEwNDUsICAgMjEyNiwgLTE5MzIgfSwKKyAgICB7ICAtNDg1OSwgIC0yMTA3LCAgIDIwMTAsIC0yNDM1IH0sCisgICAgeyAgLTYyNzQsICAtMTYyMiwgICAyODA4LCAtMTM3NCB9LAorICAgIHsgIC0zMTE5LCAgLTMyMDksICAgIDUyMSwgLTM5ODggfSwKKyAgICB7ICAtNTY3NiwgIC0yMDgyLCAgIC00MjAsIC0yNzExIH0sCisgICAgeyAgLTcwNzMsICAtMzYyMywgICAgNjk2LCAtMjM0MyB9LAorICAgIHsgIC01OTg2LCAgLTQyMjQsICAgIDU3MiwgLTI0NTQgfSwKKyAgICB7ICAtNDM0MCwgIC00NTIxLCAgICA4ODIsIC0yNzcxIH0sCisgICAgeyAgLTYxNzgsICAtMTkzMywgICAgNTM1LCAtMTQ0NCB9LAorICAgIHsgIC00OTIzLCAgLTQxNjMsICAgMTc0NCwgLTIwNjYgfSwKKyAgICB7ICAtNjQxMCwgIC0xNTE5LCAgIDEwNTgsIC0yNjgzIH0sCisgICAgeyAgLTUwNzcsICAtMTE4NSwgICAgODU2LCAtMjIxNiB9LAorICAgIHsgIC03MDkxLCAgLTI0NDQsICAgIDY4NywgLTI1OTcgfSwKKyAgICB7ICAtNTI4NCwgIC0yMTY1LCAgIDMyMzksICAtOTkzIH0sCisgICAgeyAgLTQ3NjMsICAtMTQ5NywgICAgMTk3LCAtMzE3OSB9LAorICAgIHsgIC00MTI4LCAgLTQ5NTgsICAgLTM5NiwgLTM1NzggfSwKKyAgICB7ICAtNTA1NCwgIC0zODc4LCAgIC02NDcsIC0yNjcyIH0sCisgICAgeyAgLTcwMDUsICAtMzM0OCwgICAxNjc5LCAtMTU3OSB9LAorICAgIHsgIC01NzY3LCAgLTEwMTcsICAgMjU4MiwgLTE5MTUgfSwKKyAgICB7ICAtNzA2OSwgIC0yNzg3LCAgIDEzMzEsIC0yMDcwIH0sCisgICAgeyAgLTU1MzIsICAtMjI5NiwgICAgNzA2LCAtMjk1MCB9LAorICAgIHsgIC01MDU5LCAgLTM1NDMsICAgLTgyMSwgLTM2MzcgfSwKKyAgICB7ICAtNjYzOSwgIC0xODM1LCAgIDEwMTYsICAtNjk2IH0sCisgICAgeyAgLTU2MTEsICAtNTIyMCwgICAtNjk0LCAtMzM3MSB9LAorICAgIHsgIC01OTk0LCAgLTI4MDMsICAgMjkzMywgIC03MjkgfSwKKyAgICB7ICAtNTk0OCwgICAtNjE5LCAgIDE1OTYsIC0yNjc2IH0sCisgICAgeyAgLTU0ODYsICAtNDQxOSwgICAgMTUzLCAtMzI2NSB9LAorICAgIHsgIC00MzI5LCAgLTM0NDAsICAgMTY0NiwgLTE0MzkgfSwKKyAgICB7ICAtNDA4MywgIC0zOTc4LCAgICAxNzcsIC0zNTY5IH0sCisgICAgeyAgLTQyODksICAtMjU5OSwgICAxMjI0LCAtMzA3NSB9LAorICAgIHsgIC01NzA3LCAgLTMyNTMsICAgMTkxMiwgIC03NTkgfSwKKyAgICB7ICAtNjYwNiwgIC0zNDM3LCAgIDI1NjIsICAtNTcxIH0sCisgICAgeyAgLTUyNTQsICAtMjQ0NCwgICAgNzY5LCAgLTM1MiB9LAorICAgIHsgIC02NTQ1LCAgLTMxNTQsICAgIDU4MiwgLTExMDMgfSwKKyAgICB7ICAtNTMyOCwgIC0yMjQxLCAgIDI1NjYsIC0xNzc1IH0sCisgICAgeyAgLTcyMTYsICAtMTkzNiwgICAxNTM4LCAtMTk4MyB9LAorICAgIHsgIC0zNzMwLCAgLTI0NTEsICAgIDQyNiwgLTM4NjkgfSwKKyAgICB7ICAtNTExMCwgIC0xMzg1LCAgIDIwMzEsIC0xMTY5IH0sCisgICAgeyAgLTY0NzAsICAtMjcxNSwgICAgMjY5LCAtMzEyMyB9LAorICAgIHsgIC01ODA2LCAgLTI0ODAsICAgIC05NywgLTM4MzIgfSwKKyAgICB7ICAtMzY4MywgIC00OTE2LCAgIC00OTAsIC00MzMwIH0sCisgICAgeyAgLTYzNDEsICAtMjA4MywgICAtNjY5LCAgLTExNSB9LAorICAgIHsgIC00OTEzLCAgLTQwNzksICAgLTgzNywgLTQ2NzMgfSwKKyAgICB7ICAtMzI3NCwgIC0yNDk3LCAgIDIzMzQsIC0yNjUyIH0sCisgICAgeyAgLTEyODYsICAtMTczMSwgICAyNTUwLCAtMzc1NiB9LAorICAgIHsgIC0zMzc1LCAgIC04NzcsICAgIDkyNiwgLTM5NzcgfSwKKyAgICB7ICAtMjUyNSwgIC0yMDc5LCAgIDI4NzksIC0yNjI1IH0sCisgICAgeyAgLTUzMDgsICAgLTUwNCwgICAzMTExLCAtMTYwNyB9LAorICAgIHsgIC00OTA0LCAgICA0NjAsICAgNDA5MywgLTEyMzIgfSwKKyAgICB7ICAtMTk5MywgICAxNjE2LCAgIDQ2NTYsIC0xOTEzIH0sCisgICAgeyAgLTM0ODEsICAtMTE3NiwgICAzMTE5LCAtMjIzNiB9LAorICAgIHsgIC00MTMyLCAgLTE1MDIsICAgMjMzOSwgLTI1NDUgfSwKKyAgICB7ICAtMjU0MiwgICAxMTUxLCAgIDM1NjksIC0yNTUwIH0sCisgICAgeyAgLTQzODEsICAgIDQzMCwgICAzMTQ3LCAtMjA4MiB9LAorICAgIHsgIC0zODg4LCAgICA4NjcsICAgMzg5OSwgLTE2NTcgfSwKKyAgICB7ICAtMjg2MSwgICAxMjkwLCAgIDQyMDIsIC0xOTc5IH0sCisgICAgeyAgLTM4OTMsICAgLTI1MywgICAyMzYzLCAtMjc2NCB9LAorICAgIHsgIC0xNzA1LCAgICA2ODgsICAgMzgyNywgLTI5MjMgfSwKKyAgICB7ICAtMjIyMywgICAyMzEyLCAgIDM3MDAsIC0zMTQ4IH0sCisgICAgeyAgLTE5ODYsICAgLTcyMCwgICA1MDIxLCAgLTc5NSB9LAorICAgIHsgIC0zMTc3LCAgICAyNDIsICAgMTk1MiwgLTMzNTIgfSwKKyAgICB7ICAtMTg1NCwgICAxNTA5LCAgIDI1MjgsIC0zODE1IH0sCisgICAgeyAgLTMxNzMsICAgICA5NywgICA1MDE5LCAgLTcwNiB9LAorICAgIHsgIC0yNjg5LCAgIC0xNDUsICAgMTM3NSwgLTM5MTUgfSwKKyAgICB7ICAtNDgzOCwgICAtMzg1LCAgIDI0ODgsIC0yNDI3IH0sCisgICAgeyAgLTQ1NTcsICAgLTM1NSwgICAxNjAzLCAtMzA2MCB9LAorICAgIHsgIC0zNTIyLCAgIDE4MzIsICAgMzI5MiwgLTI2NzQgfSwKKyAgICB7ICAtMzc2OSwgICAgNzgwLCAgIDIzNzgsIC0yNzA0IH0sCisgICAgeyAgLTQzMjMsICAtMTkzMiwgICAzNDE0LCAtMTE2OSB9LAorICAgIHsgIC0yNzQwLCAgIDExNTgsICAgMjcyOSwgLTMyNzMgfSwKKyAgICB7ICAtMzY0NywgICAgMjEwLCAgIDE0NjQsIC0yODkyIH0sCisgICAgeyAgLTIzNDIsICAtMjA5NywgICAxNTEzLCAtMzcyNyB9LAorICAgIHsgIC00NDIyLCAgLTEyNDIsICAgMzEzMCwgLTE4MzMgfSwKKyAgICB7ICAtMTMwOCwgIC0xMDM5LCAgIDQyOTAsIC0xODc1IH0sCisgICAgeyAgLTE3NTQsICAtMjUzNSwgICAzMjk4LCAtMjMxNCB9LAorICAgIHsgIC00MTAyLCAgIC0xODYsICAgNDAzNywgLTEwOTQgfSwKKyAgICB7ICAtMTAwOCwgICAxNTcwLCAgIDMyOTAsICAgMTcxIH0sCisgICAgeyAgLTMzMjIsICAtMjYyMSwgICAyNzkxLCAtMTUzNiB9LAorICAgIHsgIC0yNTM5LCAgLTI1OTcsICAgMzQ0MiwgLTE2NzIgfSwKKyAgICB7ICAtMzQxMSwgIC0yMDE1LCAgIDM2NzAsIC0xMTc0IH0sCisgICAgeyAgLTIwOTcsICAgIDczMCwgICA1NTgxLCAtMTM5OSB9LAorICAgIHsgIC0xNTEwLCAgICAtNzQsICAgNDgyMCwgLTIwMDQgfSwKKyAgICB7ICAtNDA4NiwgICAtODY4LCAgIDQ0MjUsICAtNzcxIH0sCisgICAgeyAgIC05NTYsICAgLTk4NiwgICAzNjQwLCAtMjkyNSB9LAorICAgIHsgIC0yMDg3LCAgLTEyNTAsICAgMzQ2NCwgLTI0NTggfSwKKyAgICB7ICAtMzMwOCwgIC0yNDExLCAgIDEzMzQsIC0zNjY3IH0sCisgICAgeyAgLTIyNjQsICAgLTM4OSwgICA0MDA0LCAtMTg1NCB9LAorICAgIHsgICAtNjgwLCAgICAyMzksICAgNDA1OCwgLTMzODggfSwKKyAgICB7ICAtMTM1NywgICAgIDMwLCAgIDI5OTMsIC0zNjU4IH0sCisgICAgeyAgLTM2MDEsICAgLTU1MiwgICAxMTc3LCAtMTEzNiB9LAorICAgIHsgIC0yNjQxLCAgICA0NDIsICAgNDM3NCwgLTE2MjUgfSwKKyAgICB7ICAtMjUyNSwgICAgNzcwLCAgIDE2NDAsIC0zODk1IH0sCisgICAgeyAgLTMxNzIsICAgLTg5MSwgICAzODkzLCAtMTYwOCB9LAorICAgIHsgIC0yOTk2LCAgICAgMTMsICAgMzI3NywgLTI0MTQgfSwKKyAgICB7ICAgLTg5OSwgICAxMDU1LCAgIDQ0NzAsIC0yNTAxIH0sCisgICAgeyAgIC00MjIsICAgLTU4NCwgICAzNDc1LCAtMzc4NyB9LAorICAgIHsgIC0xOTc4LCAgIC01OTMsICAgMjU2NiwgLTM0MTUgfSwKKyAgICB7ICAtMzE1MCwgIC0xMjgwLCAgIDIzNjIsIC0zMDQ3IH0sCisgICAgeyAgLTM1OTIsICAgIDIyNCwgICAxMDI2LCAtMzkzMiB9LAorICAgIHsgIC00ODQwLCAgLTExODksICAgMzYzMywgIC04NzkgfSwKKyAgICB7ICAtMzk1MiwgIC0yMjU1LCAgIDI5MTYsIC0xODI2IH0sCisgICAgeyAgLTE2OTUsICAgICAyOCwgICAxODEwLCAgLTM0OSB9LAorICAgIHsgICAtNzQ1LCAgLTI0ODQsICAgMzMwOCwgLTMyOTMgfSwKKyAgICB7ICAtMTAxNiwgICAxNTYzLCAgIDUzNjUsIC0xODIzIH0sCisgICAgeyAgLTIxNzIsICAtMTc4NywgICA0MjY2LCAtMTI4NyB9LAorICAgIHsgIC0xMjQxLCAgLTE5NTEsICAgMzk4MiwgLTI0MTMgfSwKKyAgICB7ICAtMjAwOSwgIC0yNjM5LCAgIDIzMzAsIC0zNDgwIH0sCisgICAgeyAgIDUxMDUsICAtMTYxOCwgIC0yNTg4LCAtMjAxNSB9LAorICAgIHsgICA2NDk3LCAgLTE1MjMsICAtMzIxOCwgIC05MTAgfSwKKyAgICB7ICAgNjUyNiwgIC0yMzA1LCAgLTIwMjksIC0xNzkwIH0sCisgICAgeyAgIDUyODksICAgIC05OSwgIC0zNDM2LCAgLTQwMCB9LAorICAgIHsgICA1NzgxLCAgLTE2MjMsICAtMTU3NywgLTI2MTcgfSwKKyAgICB7ICAgNTI1OSwgICAtNjcwLCAgLTMxMjUsIC0xNzAwIH0sCisgICAgeyAgIDYzNDMsICAtMTI1NiwgICAtMzMxLCAtMzIyMiB9LAorICAgIHsgICA3OTY3LCAgIC02NzgsICAtMjE5NSwgLTE0NjIgfSwKKyAgICB7ICAgNjExOSwgICAtNjk1LCAgLTI5ODgsIC0xNTM4IH0sCisgICAgeyAgIDYxMDgsICAgIDQ5NCwgIC0zMzU5LCAtMTU0OCB9LAorICAgIHsgICA1MDY3LCAgICA5NjksICAtMjMyOCwgLTI3MDcgfSwKKyAgICB7ICAgNzU5NSwgICAtNDM1LCAgLTE0OTcsIC0yMDU2IH0sCisgICAgeyAgIDY5MjksICAgLTcxOSwgIC0yNDIwLCAtMTY2NSB9LAorICAgIHsgICA1MTkwLCAgICA1ODQsICAtMjk4MiwgLTIxMDMgfSwKKyAgICB7ICAgNjEwNiwgICAtNDQ0LCAgLTE0MTEsIC0yNzM5IH0sCisgICAgeyAgIDU1ODQsICAgIDI4OSwgIC0xODA0LCAtMjgwMyB9LAorICAgIHsgICA1Mjc2LCAgICAyMjcsICAtMTE4MCwgLTMzNjEgfSwKKyAgICB7ICAgNzU0NCwgIC0xNTI1LCAgLTE4MzQsIC0xNzI1IH0sCisgICAgeyAgIDU5ODYsICAtMTQ3MCwgIC0yNjA2LCAtMTcwMSB9LAorICAgIHsgICA1MDk2LCAgIC03NjUsICAtMTcxMiwgLTMwMDYgfSwKKyAgICB7ICAgNTQyMywgICAtMTQ5LCAgLTM5MzMsIC0xMTU3IH0sCisgICAgeyAgIDc2NTEsICAgICAyNiwgIC0yNDQ1LCAtMTUwNyB9LAorICAgIHsgICA0NzQ1LCAgIC00NjQsICAtMTczNSwgLTIzNjIgfSwKKyAgICB7ICAgNTM1MiwgIC0xMDExLCAgLTEwOTQsIC0xOTk5IH0sCisgICAgeyAgIDYzMDAsICAgLTY3MiwgICAtNTQyLCAtMTk1MCB9LAorICAgIHsgICA2Njc1LCAgLTEwMjAsICAtMTMxOCwgLTEwNTkgfSwKKyAgICB7ICAgNzIxOCwgIC0yMDM2LCAgIC02MDMsIC0yNDYyIH0sCisgICAgeyAgIDc3NTUsICAtMTUxNCwgIC0yNDMwLCAtMTIyOSB9LAorICAgIHsgICA1MDQxLCAgICA0NDksICAtMTA1NiwgLTI0MDUgfSwKKyAgICB7ICAgNjcxMCwgIC0yMjc3LCAgLTEzNDQsIC0yMjg0IH0sCisgICAgeyAgIDY4MjQsICAtMTM0NywgIC0yMjU0LCAgIDI1MSB9LAorICAgIHsgICA2MDY4LCAgLTE4NTcsICAgLTk4MywgLTEzMTYgfSwKKyAgICB7ICAgNTYwMywgIC0yMTc3LCAgLTI3MzAsIC0xNDc3IH0sCisgICAgeyAgIDU4MzgsICAtMTA1OSwgIC0zNjA0LCAgLTk3MCB9LAorICAgIHsgICA1MDc2LCAgIC03ODksICAgLTMzNSwgLTI0MTMgfSwKKyAgICB7ICAgNjE5MSwgIC0xNjM0LCAgLTIwMDAsIC0yMTI5IH0sCisgICAgeyAgIDUwOTIsICAtMTI5MiwgIC0yNTQzLCAtMTAzNCB9LAorICAgIHsgICA1MzA1LCAgICA0MzUsICAtMTcxMCwgLTE4NTAgfSwKKyAgICB7ICAgNjE0MCwgICAgNTYxLCAgLTIxNzYsIC0yMzgwIH0sCisgICAgeyAgIDY3NTIsICAgIDM0OCwgIC0yNDk2LCAtMTg5MCB9LAorICAgIHsgICA2NDA1LCAgICAyNzMsICAtMTA5OCwgLTI3NzggfSwKKyAgICB7ICAgNjk0MiwgIC0xMzQwLCAgIC00OTYsIC0xMzgxIH0sCisgICAgeyAgIDUyMzgsICAgLTY4NywgIC0yNDU0LCAtMjM0OSB9LAorICAgIHsgICA2OTU5LCAgIC04ODIsICAtMTgzMywgLTIwNjEgfSwKKyAgICB7ICAgNjI5MiwgICAtMjUzLCAgLTIxMjUsIC0yMTk5IH0sCisgICAgeyAgIDU4MzgsICAgLTU3NCwgICAtNzU5LCAtMzIxNSB9LAorICAgIHsgICA2OTU0LCAgLTE0ODQsICAgLTY0MCwgLTI3NzEgfSwKKyAgICB7ICAgNzQ5OCwgIC0xNzA2LCAgLTEyMTAsIC0yMTU0IH0sCisgICAgeyAgIDY3NzIsICAtMTAwMywgIC0xMjM1LCAtMjUzMiB9LAorICAgIHsgICA2MDE0LCAgICAyMjgsICAtMjE1NCwgLTExMDggfSwKKyAgICB7ICAgNjk0MywgIC0yMTc4LCAgLTI2NDQsIC0xMTIyIH0sCisgICAgeyAgIDcyNjIsICAgLTc2MywgIC0zMDU2LCAtMTA5MCB9LAorICAgIHsgICA2MjczLCAgLTE0NzgsICAtMTA3MiwgICAxNzcgfSwKKyAgICB7ICAgNDczNCwgICAgNDI1LCAgLTI5MTIsICAgMzU3IH0sCisgICAgeyAgIDcxMjksICAgIDE2OCwgIC0xNTM3LCAtMjMyNyB9LAorICAgIHsgICA3MjA0LCAgIC00MzQsICAgLTc0NiwgLTI2NjAgfSwKKyAgICB7ICAgNjg3OSwgICAgIDU3LCAgLTMwODcsIC0xMzEwIH0sCisgICAgeyAgIDQ2MjMsICAgLTYxMCwgICAtNzE4LCAtMzQ1OSB9LAorICAgIHsgICA2NTY1LCAgIC01NDMsICAtMTk5OCwgIC0zMzkgfSwKKyAgICB7ICAgNDc1MiwgICAtMjc3LCAgLTIwNjYsIC0xNDA1IH0sCisgICAgeyAgIDc0MzUsICAtMTQxNiwgIC0xOTA0LCAgLTUwNSB9LAorICAgIHsgICA0MDc2LCAgICAxNTAsICAtMTIyMiwgLTM1NTYgfSwKKyAgICB7ICAgNzA4MiwgICAgLTI4LCAgLTE0NTYsIC0xMTc0IH0sCisgICAgeyAgIDU5NDEsICAgLTQ0NiwgIC0xMzI2LCAtMTE1OCB9LAorICAgIHsgICAzODcwLCAgLTE2NDgsICAtMjQ3NCwgLTI1ODkgfSwKKyAgICB7ICAgIDg1OCwgICAgIDM3LCAgLTMzODcsIC0zNzIxIH0sCisgICAgeyAgIDM1NTcsICAtMTUwMywgIC0xNjY0LCAtMzM4MyB9LAorICAgIHsgICAzMzM2LCAgLTE5NzIsICAtMzA3OSwgLTIyMTYgfSwKKyAgICB7ICAgMzE4NiwgICAgIDYwLCAgLTQxODUsICAtODYzIH0sCisgICAgeyAgIDM0NTYsICAgLTc3MywgIC0zMDY2LCAtMjQ1NyB9LAorICAgIHsgICA0MTMxLCAgIC05MTMsICAtMjA2MCwgLTI2MDEgfSwKKyAgICB7ICAgNDQzMSwgICAtNjkxLCAgLTQxMTQsICAtOTcyIH0sCisgICAgeyAgIDM0NjEsICAgLTMzNCwgIC0zNjgwLCAtMTc1MSB9LAorICAgIHsgICAyMDA2LCAgIC00NTksICAtMjIxNCwgLTM4MjcgfSwKKyAgICB7ICAgMTMyMiwgICAgIDMyLCAgLTI4MTYsIC0zMjAzIH0sCisgICAgeyAgIDQ0MjUsICAtMTg5NywgIC0yNzkxLCAtMTk0NiB9LAorICAgIHsgICA0NTA0LCAgICAgMjMsICAtMzQyMSwgLTE5MDkgfSwKKyAgICB7ICAgMzA5MCwgICAtODg1LCAgLTIzNjYsIC0zMjY0IH0sCisgICAgeyAgIDMyMDksICAtMjM2MywgIC0zNzMwLCAgLTgzNCB9LAorICAgIHsgICAzMzEyLCAgLTE0NzEsICAtMzY0MSwgLTE1NzkgfSwKKyAgICB7ICAgNDE4NCwgIC0xNjY5LCAgLTMzMjMsIC0xMjQ4IH0sCisgICAgeyAgIDIxOTAsICAgLTkzMSwgIC0zMzAyLCAtMjk0NCB9LAorICAgIHsgICAyOTQ3LCAgIC0yMjksICAtNDc5MSwgLTExOTUgfSwKKyAgICB7ICAgMjAyMCwgIC0xNjI2LCAgLTI3MDAsIC0zMTI1IH0sCisgICAgeyAgIDIyMTQsICAgLTMyNiwgIC00MzUyLCAtMTY4MyB9LAorICAgIHsgICAzMjg2LCAgLTI2MTksICAtMjQxMiwgLTI0NTggfSwKKyAgICB7ICAgMTAwMCwgIC0yNTcxLCAgLTQxMjksIC0yMTU4IH0sCisgICAgeyAgIDI0OTYsICAtMjYyNywgIC0zNjExLCAtMTQzMyB9LAorICAgIHsgICAyMDQzLCAgLTIxOTEsICAtMjE2NywgLTM4MjcgfSwKKyAgICB7ICAgMjU3MSwgIC0yNTQ0LCAgLTE5MTUsIC0zMjIyIH0sCisgICAgeyAgIDIwMjIsICAtMTUwMSwgIC0zODU2LCAtMjE2NSB9LAorICAgIHsgICAyNjg1LCAgLTExODAsICAtMTQ2MSwgLTQwMzggfSwKKyAgICB7ICAgMTYxMCwgIC0yMzEzLCAgLTQzOTEsIC0xMTczIH0sCisgICAgeyAgIDIzNDAsICAtMjQ5MCwgIC00MjE1LCAgLTUxNiB9LAorICAgIHsgICAxNzQyLCAgLTI2MTUsICAtMzYzMiwgLTIxNDYgfSwKKyAgICB7ICAgIDUyMywgIC0xMjkzLCAgLTQyNDYsIC0yNDQyIH0sCisgICAgeyAgIDM3MjUsICAtMjcyMywgIC0zMDE0LCAtMTU3NiB9LAorICAgIHsgICAzNTU0LCAgLTEzODEsICAtNDIwMCwgIC04MjQgfSwKKyAgICB7ICAgMTI5MSwgIC0xNTk0LCAgLTQ3NzcsIC0xNDMwIH0sCisgICAgeyAgIDE0NTIsICAgIDUxNSwgIC0yOTYwLCAtMzgzMCB9LAorICAgIHsgICA0MjY0LCAgIC04OTQsICAtMzMwNSwgLTE4MjYgfSwKKyAgICB7ICAgMjYwNiwgIC0xNDUyLCAgLTQ1MjIsICAtOTY2IH0sCisgICAgeyAgIDExOTYsICAgLTgzMCwgIC00ODA3LCAtMTgxNiB9LAorICAgIHsgICAxMDU0LCAgIC03NzUsICAtMjYxNiwgLTQwNzEgfSwKKyAgICB7ICAgNDIwNiwgICAgNDE1LCAgLTQzNDQsIC0xMTMyIH0sCisgICAgeyAgIDMwNDQsICAgIDQ5MSwgIC00MTI2LCAtMTkzNCB9LAorICAgIHsgICAgOTg4LCAgIC05MDEsICAtMzM1MywgLTM0NDMgfSwKKyAgICB7ICAgMTcyOSwgIC0zMDYzLCAgLTIyNjcsIC0zMzcwIH0sCisgICAgeyAgIDM5MTUsICAgIDkxMiwgIC0yOTg5LCAtMjM4NyB9LAorICAgIHsgICAzNzgxLCAgICAzMDAsICAtMjQ1NywgLTMwNTAgfSwKKyAgICB7ICAgMjcxMiwgICAgOTI0LCAgLTEzNTAsIC0xMjA2IH0sCisgICAgeyAgIDQyMzAsICAgIDQwNSwgIC0yMzQzLCAgIDY2NSB9LAorICAgIHsgICAxODc4LCAgIC04NzMsICAgLTIyNSwgICAtMjkgfSwKKyAgICB7ICAgMzUxMCwgICAgIDU2LCAgLTEzMzQsIC0zNDIwIH0sCisgICAgeyAgIDI4NTAsICAgMTQ0NywgIC0yNjUxLCAtMzE1MCB9LAorICAgIHsgICAxNTEwLCAgIC03MDYsICAtNDEyNSwgLTI0ODMgfSwKKyAgICB7ICAgMzExNSwgICAgNzkzLCAgLTE2OTIsIC0zODk0IH0sCisgICAgeyAgIDI2NjcsICAgIDIxMywgIC0yOTczLCAtMjc4NiB9LAorICAgIHsgICAxMTg0LCAgLTIzODQsICAtMzA1MSwgLTMxNzMgfSwKKyAgICB7ICAgMjEzOSwgICAgNzk2LCAgLTIwNzksIC0zNjk3IH0sCisgICAgeyAgIDE0NjQsICAtMTQ4MywgIC0zNzI2LCAtMjc1NCB9LAorICAgIHsgICAyNDA3LCAgLTExNDgsICAtMzkxNSwgLTE1NjkgfSwKKyAgICB7ICAgMjYxMiwgIC0xNzc5LCAgLTMyMTcsIC0yMjcxIH0sCisgICAgeyAgIDI0MDYsICAtMjg3MCwgIC0yOTM3LCAtMjQ5NiB9LAorICAgIHsgICAyMTQwLCAgICAxMjYsICAtMzY0NiwgLTI3NTggfSwKKyAgICB7ICAgMjk1MiwgIC0xMDM2LCAgICAyNjgsIC0xNDIzIH0sCisgICAgeyAgICAgOTMsICAtMTkzMSwgIC0zODQxLCAtMzUzNSB9LAorICAgIHsgICAgMzg5LCAgLTI5NTMsICAtMzM4MywgLTMzNDMgfSwKKyAgICB7ICAgODY1MiwgIC01NTExLCAgLTE2NjIsICAgNTY1IH0sCisgICAgeyAgIDc0MjcsICAtMjc5MSwgIC0yNTM1LCAgLTg0MiB9LAorICAgIHsgICA4NTQxLCAgLTQyNTMsICAtMTQwNywgIC05ODggfSwKKyAgICB7ICAgODAxOCwgIC0zMjAzLCAgLTI5OTgsICAgMTA1IH0sCisgICAgeyAgIDcyMzEsICAtMzkyNiwgICAtOTU4LCAgMTMwOCB9LAorICAgIHsgICA3MzMxLCAgLTM2OTAsICAgLTM2MywgIDI1ODYgfSwKKyAgICB7ICAgNjgwMywgIC0zNjQ2LCAgLTIyMjYsICAtOTAzIH0sCisgICAgeyAgIDgxNjMsICAtMjgxMSwgICAtNDc3LCAtMjIzNSB9LAorICAgIHsgICA5MzU2LCAgLTM4MTgsICAtMTY4NSwgIC02ODQgfSwKKyAgICB7ICAgODQ2NiwgIC0yODU0LCAgIC0zMDIsICAtNjk4IH0sCisgICAgeyAgIDg0NTgsICAtMzIyNCwgICAgNTE3LCAgIDI3OSB9LAorICAgIHsgICA4MDc0LCAgLTI2MTksICAtMTMyNiwgIDI1OTYgfSwKKyAgICB7ICAgODc3OSwgIC0yNzYxLCAgLTI1MjcsICAtNDQxIH0sCisgICAgeyAgIDY1MzMsICAtMjg4NywgICAtODk5LCAgLTY5NiB9LAorICAgIHsgICA3Mzk0LCAgLTIzMDUsICAtMTY0MiwgIC0xMjAgfSwKKyAgICB7ICAgODI4MSwgIC0zNzgwLCAgICAtMjIsICAxMzA1IH0sCisgICAgeyAgIDkxNTgsICAtNDQxMywgICAtNzc5LCAgIDkwMSB9LAorICAgIHsgICA5MDMxLCAgLTUyNDAsICAtMTEwOSwgIDE2NzggfSwKKyAgICB7ICAgODcxNywgIC0zNjUwLCAgICA0MTAsIC0xMDc1IH0sCisgICAgeyAgIDczMTcsICAtMzE5NywgICAtODE4LCAtMjI2NCB9LAorICAgIHsgICA3OTM0LCAgLTIzODUsICAtMTIxNCwgLTE4ODYgfSwKKyAgICB7ICAgODI1NiwgIC00NDQxLCAgIC0yOTEsICAtNTg3IH0sCisgICAgeyAgIDczNTgsICAtMzM5NSwgICAxMDkwLCAgLTI3MCB9LAorICAgIHsgICA5NDQ2LCAgLTQ5MTAsICAtMTM0MywgIC00NzMgfSwKKyAgICB7ICAgODE4NywgIC00NzI2LCAgIC04MDgsICAxMTY2IH0sCisgICAgeyAgIDc1MDQsICAtMzg0NSwgICAgLTQ3LCAgIDI2NyB9LAorICAgIHsgICA4MDI5LCAgLTIxNDYsICAtMTI4MywgIC0zODMgfSwKKyAgICB7ICAgNzQ2MSwgIC0yNzA1LCAgIC04NTMsICAgNzgzIH0sCisgICAgeyAgIDkzNjcsICAtMzYzNiwgICAtNjQ1LCAgLTM1NCB9LAorICAgIHsgICA4OTU1LCAgLTM0NzMsICAgLTMwOCwgLTE5NDcgfSwKKyAgICB7ICAgODY3NiwgIC0yNjgzLCAgLTIwOTksICAxNDg1IH0sCisgICAgeyAgIDc0ODEsICAtMzAwMywgICAtODcxLCAgLTQ0NCB9LAorICAgIHsgICA4MDE1LCAgLTI4MzksICAtMTY3MywgIDExNzUgfSwKKyAgICB7ICAgNjk0NywgIC00NjQzLCAgLTE1MjcsIC0xMDQ3IH0sCisgICAgeyAgIDc2MjIsICAtMjU3NSwgICAtMTM3LCAgLTk2MCB9LAorICAgIHsgICA5Mzg4LCAgLTQyNzksICAgLTcwNywgLTEzMjIgfSwKKyAgICB7ICAgODM4MiwgIC01MjU5LCAgLTEyODMsICAtNTY1IH0sCisgICAgeyAgIDY4NTYsICAtNDEzOCwgIC0xMDMwLCAgIDYzMCB9LAorICAgIHsgICA4NjU5LCAgLTI1NzEsICAtMTEyNCwgLTE2NjYgfSwKKyAgICB7ICAgODc2MywgIC0zODA3LCAgIC01MzcsICAyNTQzIH0sCisgICAgeyAgIDgwNDksICAtMzU3OCwgIC0yMTg2LCAgLTYwNCB9LAorICAgIHsgICA4MjcyLCAgLTIzNTEsICAtMTk4NSwgLTEyMTQgfSwKKyAgICB7ICAgNjg1NSwgIC0zNzk2LCAgLTE1MjcsIC0xNjMxIH0sCisgICAgeyAgIDcxNzgsICAtMjg5NiwgIC0xNjAwLCAtMTc1NiB9LAorICAgIHsgICA3MDQwLCAgLTI4ODgsICAgIC04OSwgLTE1ODYgfSwKKyAgICB7ICAgNjI2MSwgIC0zNDAzLCAgIC0yNjQsICAgOTk4IH0sCisgICAgeyAgIDc3NTYsICAtNDY5OSwgIC0xNTQzLCAgLTgzNCB9LAorICAgIHsgICA3NjgyLCAgLTQ2MjIsICAgLTc1OCwgLTE3MjEgfSwKKyAgICB7ICAgODgzOSwgIC00MjMyLCAgLTI5MzIsICAxOTU5IH0sCisgICAgeyAgIDkzNjMsICAtNDY3OSwgIC0xOTU2LCAgICAzOSB9LAorICAgIHsgICA3ODgzLCAgLTM2MTYsICAtMTQxNCwgLTE0MzIgfSwKKyAgICB7ICAgODgyOCwgIC0zMTg4LCAgLTEzNTYsIC0xMzEyIH0sCisgICAgeyAgIDc3NDYsICAtMzk4NywgICAtMTIxLCAtMjQyNCB9LAorICAgIHsgICA5MjYyLCAgLTMyNTYsICAgLTY5MywgICA4MTggfSwKKyAgICB7ICAgNzY3MCwgIC0zNDIwLCAgIC0xNDgsICAzNTA0IH0sCisgICAgeyAgIDczNDQsICAtMzE4MywgICAgNjA4LCAgMTU5NSB9LAorICAgIHsgICA4OTc2LCAgLTQxMzksICAtMTg0OCwgIDEzMDQgfSwKKyAgICB7ICAgNjcwOCwgIC00MTMxLCAgICAgMzMsICAtODUyIH0sCisgICAgeyAgIDc4NDAsICAtNDQyOSwgIC0yMjc1LCAgICA3OSB9LAorICAgIHsgICA4OTgwLCAgLTM4NTgsICAtMjgzOCwgICA0NTMgfSwKKyAgICB7ICAgNzgxNSwgIC00NjA0LCAgLTI1NjMsICAgOTQ0IH0sCisgICAgeyAgIDgzNzIsICAtNDQyMiwgIC0xNzgzLCAgMzA3MSB9LAorICAgIHsgICA4NjIzLCAgLTUxMjgsICAtMTc1NCwgIDI4ODggfSwKKyAgICB7ICAgNzQ2MiwgIC0zMjgxLCAgICA4ODksICAgOTIwIH0sCisgICAgeyAgIDg0MTYsICAgIC01OSwgIC0xMzIwLCAtMTgyNSB9LAorICAgIHsgICA3OTI4LCAgLTE0ODgsICAgLTQxNCwgLTI0OTkgfSwKKyAgICB7ICAgODExMCwgICAtOTc3LCAgLTEwNDcsIC0yMDQyIH0sCisgICAgeyAgIDgyNzgsICAgLTY4NywgIC0xNTk3LCAtMTU1MCB9LAorICAgIHsgICA3OTg4LCAgIC0xNzQsICAgLTk3NywgLTIxMDYgfSwKKyAgICB7ICAgODYwOSwgIC0xNTQ3LCAgLTE2MjgsIC0xNTI3IH0sCisgICAgeyAgIDkwMDAsICAtMTc5OCwgICAtOTQ2LCAtMTc2MSB9LAorICAgIHsgICA4OTU0LCAgIC04NzIsICAtMTQwNCwgLTE1OTQgfSwKKyAgICB7ICAgODkzOSwgICAgNDY2LCAgIC03NDgsIC0xMjEyIH0sCisgICAgeyAgIDk1NDksICAgLTMyOSwgICAtMTc3LCAtMTM2MCB9LAorICAgIHsgICA5NDExLCAgICAtMTgsICAtMTEyNiwgLTE1NjggfSwKKyAgICB7ICAgODg1OSwgICAtNzgyLCAgIC00ODgsIC0xMzM4IH0sCisgICAgeyAgIDg5NTUsICAgLTIxOCwgICAgLTQzLCAtMTIwOSB9LAorICAgIHsgICA5MTMxLCAgICAtNjksICAgLTQ1MywgLTEwMDEgfSwKKyAgICB7ICAgOTA2OSwgIC0xNTE5LCAgLTEwOTEsIC0xMTk5IH0sCisgICAgeyAgIDkyNDcsICAtMTMwOSwgICAtNTY2LCAtMTE0NiB9LAorICAgIHsgICA4NTI4LCAgLTE2MTcsICAgLTI4NywgLTEzMTMgfSwKKyAgICB7ICAgNzc2MywgICAtNzQ1LCAgIC0xNDksIC0yMDQwIH0sCisgICAgeyAgIDgyOTQsICAgLTM0MywgICAgMjU3LCAtMjYzMyB9LAorICAgIHsgIDEwMTQ5LCAgIC04OTMsICAgLTU1MiwgLTE2NDkgfSwKKyAgICB7ICAgOTM5OCwgICAtOTE1LCAgICAyMTgsIC0yMDQyIH0sCisgICAgeyAgIDk3MDMsICAtMTE5NCwgICAtNjc1LCAtMTU5MiB9LAorICAgIHsgICA5NTg2LCAgIC03MDAsICAgLTQyNywgLTE3MTAgfSwKKyAgICB7ICAgODkzMCwgICAgNDk3LCAgLTE0NDUsIC0xMjE4IH0sCisgICAgeyAgIDkyODUsICAtMTMyMywgICAtMTYzLCAtMTU1MiB9LAorICAgIHsgICA4NDMxLCAgLTEyODksICAgLTk4NSwgLTE0MDQgfSwKKyAgICB7ICAgODk2NSwgICAtNjU1LCAgICA2NTMsIC0xNDgzIH0sCisgICAgeyAgIDk1NDIsICAtMTAwMSwgICAtOTUxLCAtMTEyOCB9LAorICAgIHsgICA5MjA1LCAgIC02NDcsICAgIC0zNywgIC04ODIgfSwKKyAgICB7ICAgODYwMywgICAgLTU2LCAgICA1MTQsIC0xNzkzIH0sCisgICAgeyAgIDkzMDAsICAgIC0xMiwgIC0xMzI0LCAgLTU2NyB9LAorICAgIHsgICA4NzczLCAgICAyMzgsICAgLTE4NCwgLTE0NTYgfSwKKyAgICB7ICAgOTk0MSwgIC0xMzA2LCAgICAtNjksIC0xNzkyIH0sCisgICAgeyAgIDkzNjAsICAgIDI3OSwgICAtMzc2LCAtMTkxOSB9LAorICAgIHsgICA5MTgwLCAgIC0yODUsICAgICA5NSwgLTIxNzAgfSwKKyAgICB7ICAgOTkyMiwgICAtNTAxLCAgIC05NzAsIC0xNTcwIH0sCisgICAgeyAgIDgzNDEsICAtMTQ5MywgICAtODU2LCAtMjA5MiB9LAorICAgIHsgICA4NzgwLCAgIC05ODEsICAgLTg1MCwgLTEwMTQgfSwKKyAgICB7ICAgOTcyMSwgICAtNTQ4LCAgLTE1MDQsIC0xMDk0IH0sCisgICAgeyAgIDk5NzMsICAtMTQ5MywgICAgNDgyLCAtMjEwNSB9LAorICAgIHsgICA4NzA3LCAgIC0zMzMsICAtMTAyNywgLTEwODcgfSwKKyAgICB7ICAgOTA5OCwgICAtNDY5LCAgIC0zMTUsIC0xNzIzIH0sCisgICAgeyAgIDg4NzksICAtMTA1MCwgICAtNjYxLCAtMjAyMCB9LAorICAgIHsgICA4ODU3LCAgICA2MDIsICAgLTg2NiwgLTE5MTggfSwKKyAgICB7ICAgODk0NSwgIC0xMDI1LCAgLTIxNTQsIC0xMDcxIH0sCisgICAgeyAgIDg0ODQsICAtMTkzMCwgICAtNDY4LCAtMjE3OSB9LAorICAgIHsgICA5MTc3LCAgLTE5MDMsICAgLTIyNCwgLTIxMTIgfSwKKyAgICB7ICAgODY1MiwgICAtMTM3LCAgLTIwOTcsIC0xMjE0IH0sCisgICAgeyAgIDkwNjMsICAgLTk3MywgIC0xNDA1LCAgLTc3MiB9LAorICAgIHsgICA5MzI4LCAgIC00NTYsICAgIDY2MiwgLTI0NjkgfSwKKyAgICB7ICAxMDEwMSwgICAtNjk3LCAgICAxMjcsIC0yMTEzIH0sCisgICAgeyAgIDk2ODUsICAgIDgxMSwgIC0yMzU5LCAtMTAyNCB9LAorICAgIHsgICA4NTg2LCAgICAtOTQsICAgLTQ2MCwgLTE5ODIgfSwKKyAgICB7ICAgNzkyNCwgICAtMTQxLCAgIC01MDksIC0yNTEzIH0sCisgICAgeyAgIDc3NzMsICAgLTY2OSwgICAtMTA3LCAtMjgzNSB9LAorICAgIHsgICA4NjM2LCAgLTEwNjQsICAgIC00NiwgLTI0MDkgfSwKKyAgICB7ICAgOTc0OCwgICAgNTk2LCAgLTE4MTUsIC0xMzQ5IH0sCisgICAgeyAgIDg5MjQsICAgIDMwNCwgICAgNTQ3LCAtMjYxNCB9LAorICAgIHsgICA5NDQyLCAgICA3NDYsICAtMTE1MywgLTE2NzkgfSwKKyAgICB7ICAgOTQ1NCwgICAtMjc4LCAgIC01MjksIC0xOTc2IH0sCisgICAgeyAgIDg0ODgsICAgIDU2MSwgICAgLTMyLCAtMjE2MCB9LAorICAgIHsgIDEwMDgzLCAgICAtNjMsICAtMTU0NCwgLTEzNjQgfSwKKyAgICB7ICAgOTM5MCwgIC0xMjc4LCAgICA1NjgsIC0xMTMxIH0sCisgICAgeyAgIDk3NDAsICAgIC00OSwgIC0yMjUzLCAgLTkxMCB9LAorICAgIHsgICAzNjM2LCAgLTIzOTEsICAtMTExNSwgLTM2MTQgfSwKKyAgICB7ICAgNjAxNCwgIC0zMjA0LCAgLTE5MDIsIC0xODA4IH0sCisgICAgeyAgIDU3ODcsICAtMzQ5NywgIC0xMTE2LCAtMjU5MCB9LAorICAgIHsgICA0MzY1LCAgLTMwNDYsICAtMTYzMiwgLTI2NjggfSwKKyAgICB7ICAgNDczMywgIC0yMTkyLCAgLTIwMjksIC0yNDY4IH0sCisgICAgeyAgIDU0MTIsICAtMjc1MywgIC0xNjMzLCAtMjQ2NCB9LAorICAgIHsgICA0NDU1LCAgLTMzNzUsICAgLTc2NywgLTMzOTkgfSwKKyAgICB7ICAgNDQ1NiwgIC0xNjQ0LCAgIC05ODMsIC0yODQxIH0sCisgICAgeyAgIDQwMzksICAtMjUyMywgICAgIDM4LCAtMzk2NyB9LAorICAgIHsgICAzNDA2LCAgLTI2NjIsICAgICA3MiwgLTQ3NTcgfSwKKyAgICB7ICAgNDI3OSwgIC0yMDA1LCAgIDEwNTUsIC00Mzk5IH0sCisgICAgeyAgIDQzMjEsICAtMTM3NywgICAtODYwLCAtMzc4NiB9LAorICAgIHsgICAzNzQzLCAgLTU3MzksICAgLTY1MSwgLTMwNDcgfSwKKyAgICB7ICAgMzUyOCwgIC01NTEwLCAgICAzNjEsIC00MDYwIH0sCisgICAgeyAgIDY0OTYsICAtNDg4NiwgICAtMTM2LCAtMjY4OSB9LAorICAgIHsgICA0NTEzLCAgLTUyNTQsICAgIDU1MSwgLTQwMTAgfSwKKyAgICB7ICAgNjU1NywgIC0zNDEzLCAgICAtOTIsIC0zMDYzIH0sCisgICAgeyAgIDQxODYsICAtMjA1OSwgICAgMTg3LCAgICA0NyB9LAorICAgIHsgICA2MjEwLCAgLTQxMTcsICAtMTI1NiwgLTE5ODUgfSwKKyAgICB7ICAgNjAzOCwgIC00MzQzLCAgICAzNTEsIC0yMTI0IH0sCisgICAgeyAgIDQzMDUsICAtNDc4MCwgIC0yMDc3LCAtMTg5NyB9LAorICAgIHsgICA0NDgwLCAgLTM4MTUsICAtMjIyOCwgLTE1MzMgfSwKKyAgICB7ICAgNTU4MiwgIC0zNjg5LCAgIDEyMjEsIC0zNDI5IH0sCisgICAgeyAgIDU1MzIsICAtNDg3NCwgICAxMTk1LCAtMjc2NSB9LAorICAgIHsgICA2NTE4LCAgLTI4NTMsICAgLTkwNSwgLTI1NjggfSwKKyAgICB7ICAgNTQ2NywgIC0yMTkyLCAgICA0NzAsIC00MTE1IH0sCisgICAgeyAgIDQxMzksICAtMTU3NywgICAgMjQwLCAtMzQ5MyB9LAorICAgIHsgICA1MjgxLCAgLTE5MjYsICAgLTcyOSwgLTMzNDAgfSwKKyAgICB7ICAgNTIxNCwgIC0yODcwLCAgIDEzNTksIC00Mjg5IH0sCisgICAgeyAgIDMwNDYsICAtMzUxMCwgIC0xNTM2LCAtMzIxNCB9LAorICAgIHsgICA1NDMzLCAgLTI4ODEsICAtMTIzMCwgLTExODQgfSwKKyAgICB7ICAgNDg2MSwgIC0zOTMyLCAgLTEwNzEsIC0yNzkxIH0sCisgICAgeyAgIDU2OTMsICAtNDIzNCwgIC0xOTA2LCAtMTUwMiB9LAorICAgIHsgICA0MDA0LCAgLTM5MzUsICAtMTgwNCwgLTIzODMgfSwKKyAgICB7ICAgMzcyOCwgIC0zNzkyLCAgICA2ODEsIC00NzczIH0sCisgICAgeyAgIDM2MjEsICAtMzAzMCwgIC0xOTUxLCAtMjU5OCB9LAorICAgIHsgICA1MTMzLCAgLTM5MDMsICAgICA0NCwgLTM3MDAgfSwKKyAgICB7ICAgMzU2MSwgIC0zNDUxLCAgIDExODMsIC01MzAxIH0sCisgICAgeyAgIDUwMjYsICAtMjc2MiwgIC0yMzQxLCAtMTc4MCB9LAorICAgIHsgICA1ODQxLCAgLTI0OTIsICAgLTQ2NywgLTMyMTAgfSwKKyAgICB7ICAgNTU5MSwgIC0xNzkxLCAgICA0OTcsIC0yNDcyIH0sCisgICAgeyAgIDUwNTQsICAtMzg5OCwgIC0xODIyLCAtMjA5NyB9LAorICAgIHsgICA1ODEzLCAgLTI3OTIsICAgICA4MywgLTE0NjkgfSwKKyAgICB7ICAgNDQzMiwgIC00NDk3LCAgIDE2NzAsIC01MTkzIH0sCisgICAgeyAgIDUzMzgsICAtNDY1MywgIC0xMTA5LCAtMjIwMCB9LAorICAgIHsgICAzMjM5LCAgLTQ0MDEsICAgLTY0OCwgLTM2NTUgfSwKKyAgICB7ICAgMjE0NywgIC0zNTk4LCAgLTEyMDAsIC00MjQyIH0sCisgICAgeyAgIDQ0MTcsICAtMjI3MSwgIC0xNTUyLCAtMzIxMCB9LAorICAgIHsgICA2NDk0LCAgLTQzNjAsICAgIDg1MiwgLTM1NjUgfSwKKyAgICB7ICAgMjM5MywgIC02MzU4LCAgIC04NTYsIC00NTI0IH0sCisgICAgeyAgIDQ5NTksICAtNDE5NiwgICAtODQ3LCAtMTQwMyB9LAorICAgIHsgICA0OTI0LCAgLTU0MzgsICAgLTIyNiwgLTMwMjYgfSwKKyAgICB7ICAgNDI1NCwgIC01MzAzLCAgLTEzMDYsIC0yNDI0IH0sCisgICAgeyAgIDQxMjEsICAtMzEyNiwgIC0yMzM0LCAtMTk4MSB9LAorICAgIHsgICAzNDM3LCAgLTQ0NDMsICAtMTQ2NCwgLTI5NTMgfSwKKyAgICB7ICAgMzIwMywgIC0zNDU5LCAgIC01MjksIC00MzM5IH0sCisgICAgeyAgIDU4OTYsICAtNTk0NSwgICAgNTQzLCAtMzI0NiB9LAorICAgIHsgICAxOTg3LCAgLTQ3MzMsICAgLTIyMCwgLTQ4NjMgfSwKKyAgICB7ICAgNDM1OCwgIC00NDMxLCAgIC01MTQsIC0zMDgxIH0sCisgICAgeyAgIDQ1ODMsICAtMjQxNiwgICAtNDkyLCAtMjI4NyB9LAorICAgIHsgICAyOTQzLCAgLTUwMzUsICAgIDQxOSwgLTQ5MjcgfSwKKyAgICB7ICAgNTM1OCwgIC01MTI5LCAgICA5ODcsIC00MzA5IH0sCisgICAgeyAgIDQ0NjAsICAtMzM5MiwgICAxNzUyLCAtNTYzNCB9LAorICAgIHsgICAzNDE1LCAgLTQ2MzMsICAgMTUwNywgLTU5NDUgfSwKKyAgICB7ICAgIDgxMSwgIC00NjkyLCAgIC00NDUsICAyMzMzIH0sCisgICAgeyAgIDEwMDksICAtNTYxMywgIC0xODU3LCAgMTM2MCB9LAorICAgIHsgICAxMzM4LCAgLTI3MTIsICAtMjcyMCwgIDMwMzYgfSwKKyAgICB7ICAgMTAwMiwgIC0zNzU0LCAgLTI1ODIsICAyMzQ0IH0sCisgICAgeyAgICA3NTAsICAtNDYwOCwgIC0yMzM0LCAgIDcxNCB9LAorICAgIHsgICAyMDQzLCAgLTMyMDcsICAtMjgyMiwgIDIxNzMgfSwKKyAgICB7ICAgLTE0MCwgIC00NjU0LCAgLTI5NTMsICAgMzU3IH0sCisgICAgeyAgICAtNTQsICAtNDAyNiwgIC0yMzc2LCAgMjY5NSB9LAorICAgIHsgICAxODU4LCAgLTUwMjIsICAgLTcxNywgIDIyODcgfSwKKyAgICB7ICAgMjA2NCwgIC0zODk0LCAgIC03MjIsICAzMjU1IH0sCisgICAgeyAgIDI3MjcsICAtNDU1OCwgICAtMzMyLCAgMjYwMyB9LAorICAgIHsgICAxODEwLCAgLTUzNzgsICAgIDI4MywgIDE4MjYgfSwKKyAgICB7ICAgMzkzNSwgIC00MzI2LCAgICA3NjIsICAzMzgzIH0sCisgICAgeyAgIC03NjcsICAtNDY5NywgIC0yNTEwLCAgMTkyMiB9LAorICAgIHsgICAyMTQ2LCAgLTQzMTIsICAtMzA5MCwgIDE2NDEgfSwKKyAgICB7ICAgICA1NCwgIC01ODgxLCAgLTIxMTQsICAgOTIxIH0sCisgICAgeyAgIDE5OTIsICAtNTc2NiwgICAtNjQwLCAgMTU3NCB9LAorICAgIHsgICAxMjAwLCAgLTUzNzEsICAtMTExNCwgIDE4MjggfSwKKyAgICB7ICAgMjk3MywgIC01MzM3LCAgICAgMzQsICAyMjY2IH0sCisgICAgeyAgIDE1MzEsICAtNTAxOCwgIC0yODE3LCAgMTE5MiB9LAorICAgIHsgICAzMDc4LCAgLTQ1NzAsICAgIDExNywgIDE5OTAgfSwKKyAgICB7ICAgIDkyNCwgIC00Mjg2LCAgLTEzODgsICAyNzEzIH0sCisgICAgeyAgICAxNDIsICAtNTA1OCwgIC0yODQ4LCAgMTQ4NyB9LAorICAgIHsgICAtMTA2LCAgLTYxODAsICAgLTg4MSwgICA4NDIgfSwKKyAgICB7ICAgIDY3MywgIC01NDMzLCAgIC0yMjksICAxNTk2IH0sCisgICAgeyAgICA3ODMsICAtNTcxMCwgIC0yNzg0LCAgIDU2MiB9LAorICAgIHsgICAxOTM1LCAgLTU3MjksICAtMjAwOSwgICA4NTYgfSwKKyAgICB7ICAgLTQxMCwgIC0zMzc1LCAgLTMzMjYsICAyNzM0IH0sCisgICAgeyAgICAyMzQsICAtMzAwMCwgIC0yNjI4LCAgMzI2MCB9LAorICAgIHsgICAgNzMzLCAgLTM0MDUsICAtMzgwNiwgIDE1ODkgfSwKKyAgICB7ICAgIDc3MSwgIC00Mjg1LCAgLTM1NDQsICAxMzE0IH0sCisgICAgeyAgIDExOTIsICAtMzU2MywgIC0zOTYwLCAgMjE3OCB9LAorICAgIHsgICAgMjA2LCAgLTU1NTUsICAtMTI1MCwgIDE1NDYgfSwKKyAgICB7ICAgLTEzMCwgIC0zODE1LCAgLTEyMTAsICAzMDQxIH0sCisgICAgeyAgICA2NDYsICAtMzk0MCwgICAtMzkzLCAgMjk5MiB9LAorICAgIHsgICAtMTg0LCAgLTQ5MzEsICAtMTc2NywgIDE5MjUgfSwKKyAgICB7ICAgMjc0NiwgIC01MTIwLCAgLTIyNzUsICAxNDY0IH0sCisgICAgeyAgIDI0NDAsICAtMzczMSwgIC0zMzUyLCAgMjcyOSB9LAorICAgIHsgICAtNDkwLCAgLTQ5NDIsICAtMzc3OSwgICA5OTcgfSwKKyAgICB7ICAgICA2OCwgIC0yNjM2LCAgLTQxNjcsICAzNzc4IH0sCisgICAgeyAgICAgNDgsICAtMzk4NiwgIC00MTE4LCAgMjEwNiB9LAorICAgIHsgICAtOTc4LCAgLTU0ODYsICAtMTMzNiwgIDEzOTAgfSwKKyAgICB7ICAgMTEyNiwgIC01Mjk3LCAgIC04NTUsICAgNjQwIH0sCisgICAgeyAgIC00NzIsICAtMzk3NSwgIC0zNjIyLCAgMTU1NyB9LAorICAgIHsgICAyNDU2LCAgLTUzNDQsICAtMTUyMywgIDE2NDggfSwKKyAgICB7ICAgLTc3NCwgIC01NjUyLCAgLTI0MTcsICAxMTQ3IH0sCisgICAgeyAgICA5OTUsICAtNjEyMiwgICAtODEyLCAgMTEzMiB9LAorICAgIHsgICAzMjgyLCAgLTQ1NzEsICAtMTc2MywgIDIxNzUgfSwKKyAgICB7ICAgMzY1NSwgIC0zODYyLCAgIC02NzYsICAzNTY4IH0sCisgICAgeyAgIDMwMzgsICAtMzY0NywgIC0xNjcyLCAgMzM4MSB9LAorICAgIHsgICAyNTk1LCAgLTI5NjQsICAtMjc3MiwgIDMyNjMgfSwKKyAgICB7ICAgNDE3NiwgIC0zMzUzLCAgLTExNDgsICA0MzU0IH0sCisgICAgeyAgIDE2MDMsICAtMzQ0MiwgIC0xNTAwLCAgMzQ0NCB9LAorICAgIHsgICAgODI4LCAgLTYyMjYsICAtMTc4MywgICA2NzggfSwKKyAgICB7ICAgMTQyMSwgIC0zMzMzLCAgLTMwODAsICAzNDAzIH0sCisgICAgeyAgIDExMjEsICAtNDcyNywgIC0xOTI0LCAgMTk4NCB9LAorICAgIHsgICAtMTg2LCAgLTUwODMsICAgLTY4MiwgIDE3OTYgfSwKKyAgICB7ICAgIDgxOSwgIC0yNzc4LCAgLTM0ODgsICAgNTMwIH0sCisgICAgeyAgICA0MjEsICAtMjg3MywgIC0zODMyLCAgMjU5NiB9LAorICAgIHsgICAyMTY0LCAgLTQyNjMsICAtMTYwNSwgIDIyODIgfSwKKyAgICB7ICAgIDU4NSwgIC00NDM3LCAgIC02ODIsICAtNDkxIH0sCisgICAgeyAgIC02NDQsICAtNDQ1MiwgIC0xMTU3LCAgMjMyNSB9LAorICAgIHsgICAxOTkxLCAgLTQyOTksICAgIDIxMCwgIDI4MzQgfSwKKyAgICB7ICAgMjEzNSwgIC0zNjMyLCAgLTIxMTMsICAgNjY1IH0sCisgICAgeyAgLTc0ODIsICAtMjcyNCwgIC0yNjYyLCAtMTM4MCB9LAorICAgIHsgIC02OTgzLCAgLTIxNjYsICAtMzc1NiwgLTM1MDkgfSwKKyAgICB7ICAtNzA4NSwgIC0xNDM5LCAgLTIzOTcsIC0zMTEyIH0sCisgICAgeyAgLTc3NjAsICAtMzA0OSwgIC0zMzE5LCAtMjgyMiB9LAorICAgIHsgIC04NDEzLCAgLTI3NjAsICAtNDQwNiwgLTMyOTggfSwKKyAgICB7ICAtNTk5NSwgIC0zOTQzLCAgLTEyNjAsIC0zNzUwIH0sCisgICAgeyAgLTc4NzksICAtMTU1NCwgIC0zNDY0LCAtMjYwNiB9LAorICAgIHsgIC02MzE0LCAgLTIwMzQsICAtMzg3OCwgLTE2ODEgfSwKKyAgICB7ICAtODg0OSwgIC0yMDg0LCAgLTEzOTksIC0xMjMxIH0sCisgICAgeyAgLTcxNTMsICAtMjYwMiwgIC0xMzg0LCAgLTgxNyB9LAorICAgIHsgIC04MDQxLCAgLTI1NzEsICAgLTQwNywgLTI3ODUgfSwKKyAgICB7ICAtNzI0NiwgIC0yMjMzLCAgLTE1NzgsICAgMjYwIH0sCisgICAgeyAgLTczMzYsICAtMzg4MywgIC00MDYxLCAtMTM0MiB9LAorICAgIHsgIC03NjE5LCAgLTM5MDgsICAtMjM0MiwgICAzODIgfSwKKyAgICB7ICAtODY4NCwgIC0zNzI0LCAgLTE2NjIsICAtNzI3IH0sCisgICAgeyAgLTc4NTAsICAtMjkyMiwgIC0xNzcwLCAtMzQ0OSB9LAorICAgIHsgIC02NzY2LCAgLTIwMzQsICAtMTI5MywgLTE5ODggfSwKKyAgICB7ICAtNjg5NSwgIC0yMTE2LCAgIC05NjgsIC0zNzQ0IH0sCisgICAgeyAgLTcxMzYsICAtNTE0NywgIC0yNjE4LCAtMjgwOSB9LAorICAgIHsgIC04MjI0LCAgLTM3MjQsICAtMjUxOSwgLTE1ODkgfSwKKyAgICB7ICAtNjcxMSwgIC0yNzUwLCAgLTMwMjEsICAtMjE5IH0sCisgICAgeyAgLTgwNTksICAtMTYzOCwgIC0xMTAyLCAtMzE3NSB9LAorICAgIHsgIC04NzEwLCAgLTQ4MzksICAtMzk2MywgLTMxNDMgfSwKKyAgICB7ICAtOTM2MywgIC00OTY1LCAgLTMyNTcsIC0xMDAyIH0sCisgICAgeyAgLTYwOTksICAtMTc1MSwgIC0zMTU3LCAgLTM5NSB9LAorICAgIHsgIC02NDUzLCAgLTMyMTYsICAtNDU5NywgIC00ODMgfSwKKyAgICB7ICAtNzg3OSwgIC01NDc3LCAgIC04MzksIC0yNjM4IH0sCisgICAgeyAgLTcyMDIsICAtNDAzOCwgICAtNTI2LCAtMjg1NiB9LAorICAgIHsgIC04MDIyLCAgLTEyMjgsICAtMTkxMCwgLTE2NDYgfSwKKyAgICB7ICAtOTExNywgIC0xMzkzLCAgLTE1ODIsIC0yNTM1IH0sCisgICAgeyAgLTkwOTUsICAtMjY5MywgICAtNjM2LCAtMjYwNSB9LAorICAgIHsgIC05MDc2LCAgLTI1ODAsICAtMzQ4MSwgLTI1MTkgfSwKKyAgICB7ICAtODMyNywgIC00ODU5LCAgLTI0MjIsICAgIDgzIH0sCisgICAgeyAgLTgzNjgsICAtMjEyOSwgIC0yMzI0LCAtMjE3MyB9LAorICAgIHsgIC04NTU0LCAgLTQ1NjMsICAtMzg0MiwgLTIwMDcgfSwKKyAgICB7IC0xMDQ2MiwgIC00MjYxLCAgLTE5MzQsIC0yMDg0IH0sCisgICAgeyAgLTk3MTcsICAtMzE4NywgIC0yMjk0LCAtMTg5NiB9LAorICAgIHsgIC05NjI1LCAgLTM4ODksICAtMzAyMCwgLTMyMjQgfSwKKyAgICB7ICAtOTg1NywgIC00OTU1LCAgLTQyMzksIC0yMTg0IH0sCisgICAgeyAgLTk3NTIsICAtMjM1MSwgIC0yMjc3LCAtMzEyOSB9LAorICAgIHsgIC03MjE5LCAgLTEzMDIsICAtMjYzOSwgLTE2MDMgfSwKKyAgICB7ICAtNzQ3NywgIC00MzYwLCAgLTM3MTgsICAtNTU5IH0sCisgICAgeyAgLTU2ODAsICAtMjAzMywgIC0yMzI2LCAtMzA3OCB9LAorICAgIHsgLTEwMTkwLCAgLTU1NDgsICAtNDY0MywgLTM2MDEgfSwKKyAgICB7ICAtOTQzMSwgIC00MTIxLCAgIC04NzksIC0yNDc5IH0sCisgICAgeyAgLTgzNjUsICAtNTQ1MCwgIC0yMDIwLCAtMTQzOSB9LAorICAgIHsgIC02Mjg5LCAgLTUxNzgsICAtMTYwNSwgLTM4NDUgfSwKKyAgICB7ICAtODMxOSwgIC0zODY2LCAgIC02ODcsIC0yNzkyIH0sCisgICAgeyAgLTgxMzEsICAtMTAzMSwgIC0zNjA4LCAtMzk0NyB9LAorICAgIHsgLTEwNTEwLCAgLTI1NjAsICAtMTE5OSwgLTIwODIgfSwKKyAgICB7IC0xMTAxNSwgIC0zNjQwLCAgLTI3NDgsIC0zMDQxIH0sCisgICAgeyAgLTg3NjIsICAtNTAyMiwgIC01MjMxLCAtMTE2MiB9LAorICAgIHsgLTEwMTUzLCAgLTI3MTUsICAtNDY0OCwgLTQ4NTkgfSwKKyAgICB7ICAtNzkzMCwgIC01MjA1LCAgLTE5MDAsIC0zNjAwIH0sCisgICAgeyAgLTk1NjEsICAtMzU0OCwgIC00ODEyLCAtMzcyMiB9LAorICAgIHsgIC03NjYzLCAgLTQ3MDksICAtMTE4MCwgLTE0NzUgfSwKKyAgICB7ICAtOTA3MywgIC01NzA3LCAgLTE4MTUsIC0yOTgwIH0sCisgICAgeyAgLTg2MDIsICAtMjM2MywgIC0yNjc1LCAtMzc3MCB9LAorICAgIHsgIC05OTY3LCAgLTU2MTQsICAtMzU3NSwgLTM4MzggfSwKKyAgICB7ICAtODMyNCwgIC0xMDA1LCAgLTIxMzEsIC0zMjU0IH0sCisgICAgeyAtMTAzMzEsICAtNTczNywgIC0yNTUwLCAtMjk0MCB9LAorICAgIHsgIC04MjM0LCAgLTMzNTQsICAtMzM2MSwgLTQ0NzkgfSwKKyAgICB7ICAtODE0MCwgIC0xOTUxLCAgLTQ1MjYsIC00NTQ1IH0sCisgICAgeyAgLTY2NzksICAtMjY2MiwgIC0yMjg0LCAtNDE4MiB9LAorICAgIHsgIC0xMTIyLCAgLTE1MTQsICAtNjQyNywgIC0yMTIgfSwKKyAgICB7ICAgICA1NCwgIC0xNjYwLCAgLTU0MjQsIC0xNDA0IH0sCisgICAgeyAgICAyNTQsICAtMjc3OCwgIC01MjIyLCAgIDg0NiB9LAorICAgIHsgICAtMjY3LCAgLTE2NjEsICAtNjU3NywgICA4MTQgfSwKKyAgICB7ICAgLTMwNSwgIC0yMDIxLCAgLTU3NTksICAxNDg0IH0sCisgICAgeyAgLTE3OTEsICAtMjQ0NiwgIC02ODY3LCAgIC04NiB9LAorICAgIHsgIC0yOTI5LCAgLTMxNTgsICAtNjYwMywgLTE3OTkgfSwKKyAgICB7ICAtMTM5MSwgIC0zMTg5LCAgLTU1NTcsIC0xMDUzIH0sCisgICAgeyAgLTE2MDIsICAgLTg4NCwgIC02NzY3LCAtMTIxMyB9LAorICAgIHsgICAtMzYxLCAgIC0zMTgsICAtNjIxOSwgICAtNDQgfSwKKyAgICB7ICAtNDA3OCwgIC0yNjM1LCAgLTU1MjMsICAtNDMzIH0sCisgICAgeyAgIC05NTYsICAgIDQ3OCwgIC00MzgyLCAgMTQ3MCB9LAorICAgIHsgIC0zMzAwLCAgLTI0NjIsICAtNjAyMSwgLTI3MjEgfSwKKyAgICB7ICAgIDcwOCwgIC0yNDM0LCAgLTUwODUsICAtNTQwIH0sCisgICAgeyAgLTI0MzUsICAtMzYwNywgIC01NjQ3LCAtMjExMCB9LAorICAgIHsgICAtNDkxLCAgLTExMzQsICAtNDY4MSwgLTI4ODYgfSwKKyAgICB7ICAgICA4NywgIC0zNDM1LCAgLTQ2NDEsIC0xMTk0IH0sCisgICAgeyAgIC01ODYsICAtMjkyNywgIC00Nzg0LCAgIDM2NiB9LAorICAgIHsgIC0xMzk0LCAgLTIzMjYsICAtNjAyMSwgICAzNTAgfSwKKyAgICB7ICAgICA5NywgIC0yNTE5LCAgLTQ2NzgsIC0yMTIwIH0sCisgICAgeyAgLTE1NDcsICAtMTkwNywgIC01MDY5LCAtMjk5MyB9LAorICAgIHsgICAgMjY4LCAgLTM3MjQsICAtNDcxOSwgICAxMjcgfSwKKyAgICB7ICAgLTgyNywgIC0xMTkwLCAgLTU5MTIsICAxMTQ0IH0sCisgICAgeyAgLTM5NTksICAtMjMyMiwgIC02ODk4LCAtMTk3NCB9LAorICAgIHsgIC0yNzI4LCAgLTIyMjgsICAtNjQyNiwgIC01NjIgfSwKKyAgICB7ICAgLTQ1NiwgICAtNjY2LCAgLTU3ODUsIC0xNjA5IH0sCisgICAgeyAgICA1MzEsICAtMTA5NiwgIC01NzMxLCAgLTY1NiB9LAorICAgIHsgIC0zNTY5LCAgIC02ODgsICAtMzkxNSwgICAxMTAgfSwKKyAgICB7ICAtNDc1MiwgIC0xNzI1LCAgLTQzOTMsICAtMzc3IH0sCisgICAgeyAgLTMyMTAsICAtMzMxNSwgIC02OTYwLCAgLTg0MCB9LAorICAgIHsgICAtNjg4LCAgLTM0MTYsICAtNDk3MSwgIDEyMjEgfSwKKyAgICB7ICAtMTgzMywgICAgIDc3LCAgLTY0OTEsIC0yNDM0IH0sCisgICAgeyAgIC0yMzksICAgLTI1NSwgIC02ODUwLCAgLTg4NiB9LAorICAgIHsgIC0yMTEyLCAgLTE0OTAsICAtNjI5MSwgLTI2ODkgfSwKKyAgICB7ICAtMTU0NCwgIC00NTc5LCAgLTUxOTgsIC0xMjYxIH0sCisgICAgeyAgLTI3NzEsICAtNDAxNCwgIC01NTIwLCAgIDY4MyB9LAorICAgIHsgIC0xNjM1LCAgLTI4MjksICAtNTUxMiwgIDEyMTQgfSwKKyAgICB7ICAgLTk1OCwgIC0yNTgyLCAgLTQ4MjMsICAyMzYwIH0sCisgICAgeyAgLTIwNzcsICAtNDU2NiwgIC00NjQyLCAgIDM2NSB9LAorICAgIHsgIC0zMTEyLCAgLTQyMTQsICAtNTk2MCwgIC04MjMgfSwKKyAgICB7ICAtMjQ2NywgIC0yNTEwLCAgLTQ4NTgsICAxNDY3IH0sCisgICAgeyAgLTE1NjEsICAtMzM5OSwgIC01ODIyLCAgIDIxMSB9LAorICAgIHsgICAtNzc1LCAgLTEwODEsICAtNDQyNCwgIDI2MzYgfSwKKyAgICB7ICAtMTI2MywgICAgIDI1LCAgLTYzNzgsIC0xMzkyIH0sCisgICAgeyAgLTM0NzYsICAgLTM2NiwgIC01NDE3LCAtMTM5MyB9LAorICAgIHsgIC0zMTc2LCAgLTE0NzYsICAtNDE0OSwgIDE0NjYgfSwKKyAgICB7ICAtMjQ3OSwgICAgNTE4LCAgLTQ0NDgsICAtMjU3IH0sCisgICAgeyAgLTI5OTIsICAgIDE1OCwgIC00NjYwLCAtMTI3OSB9LAorICAgIHsgIC0xMzIwLCAgLTM4NzIsICAtNDQ3OSwgIDExNDcgfSwKKyAgICB7ICAtMTQ3NSwgICAtMzEyLCAgLTUzMTgsICAgNTM5IH0sCisgICAgeyAgLTM1MjcsICAtMTY3OSwgIC01ODYwLCAtMTY4MSB9LAorICAgIHsgIC0zMzk3LCAgLTM0MzgsICAtNTU5MywgIDE4NjYgfSwKKyAgICB7ICAtNDA4OSwgIC0yNDM5LCAgLTQ3NjMsICAxMjc1IH0sCisgICAgeyAgIC03NDgsICAtNDUxMywgIC00Njg3LCAgIC00OCB9LAorICAgIHsgIC0yMTY2LCAgLTQ1MzEsICAtNDY5MSwgLTI4NTYgfSwKKyAgICB7ICAtMjM4NSwgICAtODUzLCAgLTYwMzUsICAtNjI3IH0sCisgICAgeyAgLTExOTQsICAtNDA5MSwgIC00NDcyLCAtMTk2MyB9LAorICAgIHsgICAtNjgyLCAgLTMyMzQsICAtNDA4NCwgLTMwMzMgfSwKKyAgICB7ICAtMzI1NSwgIC01MDE1LCAgLTUzMjgsICAgLTEyIH0sCisgICAgeyAgLTIzMTMsICAtMzQzNiwgIC00NjAxLCAgLTE1NSB9LAorICAgIHsgIC0yNzkyLCAgLTEwMzgsICAtNjk0NywgLTIwMTkgfSwKKyAgICB7ICAtMTI0NCwgIC0xNTI2LCAgLTU3NzEsIC0xODgyIH0sCisgICAgeyAgLTQ2NzksICAtMzczMSwgIC01NTA2LCAgIDI4MyB9LAorICAgIHsgIC0zMDYyLCAgICAtNjYsICAtMzU1OCwgIC03NTggfSwKKyAgICB7ICAtNDg5NSwgIC0xMTg3LCAgIDQ3NTEsICAzNzI4IH0sCisgICAgeyAgLTc2MDAsICAtMjc1MiwgICAzMzIwLCAgNDYxMyB9LAorICAgIHsgIC01NzAzLCAgLTI5NzUsICAgMzk0NCwgIDI2NTkgfSwKKyAgICB7ICAtNDk3MiwgIC0xMjU3LCAgIC0yNDYsICAyOTUyIH0sCisgICAgeyAgLTQyMjEsICAtMjQ4NywgICAxNzAyLCAgNDI5NSB9LAorICAgIHsgIC0yOTAwLCAgLTE1MjksICAgMjQ1OCwgIDQ5MzUgfSwKKyAgICB7ICAtNTA2MSwgICAgNDA3LCAgIDI0MTYsICA0MDUwIH0sCisgICAgeyAgLTY5MzEsICAtMzQ3OCwgICAyNzYxLCAgMjIxMyB9LAorICAgIHsgIC02MDM3LCAgLTM5MjEsICAgMzE5MiwgIDE4NjYgfSwKKyAgICB7ICAtNjExMywgICAtODExLCAgIDI0MDcsICAzNzgyIH0sCisgICAgeyAgLTU4NzgsICAtMTcxNiwgICAxMjA3LCAgMzQ3OCB9LAorICAgIHsgIC01OTUzLCAgLTI4NTMsICAgMjIwNywgIDI3MTIgfSwKKyAgICB7ICAtNjgwNywgIC0zMjIzLCAgIDI3NDksICAzNTk1IH0sCisgICAgeyAgLTMyNzIsICAtMzE1NywgICAxMzg5LCAgMzc4OCB9LAorICAgIHsgIC01MzY4LCAgLTE5MDQsICAgMTk4MCwgIDUwNzcgfSwKKyAgICB7ICAtNzIzNSwgIC0xMzk4LCAgIDMwNzUsICA0NTQ4IH0sCisgICAgeyAgLTQ3NjUsICAtMzQ4NywgICAyNzU1LCAgMjc5NiB9LAorICAgIHsgIC03NjU4LCAgLTQ0MzUsICAgMjY5NCwgIDI1ODIgfSwKKyAgICB7ICAtNjk5NywgIC00MjgyLCAgICA0NTYsICAzODMyIH0sCisgICAgeyAgLTU1NjMsICAtMzExNSwgICAgLTYzLCAgMzcxMyB9LAorICAgIHsgIC00MjQ0LCAgLTQyMjAsICAgMTQ1MCwgIDI3NjcgfSwKKyAgICB7ICAtMzgwMSwgIC0yMTk0LCAgICAxOTAsICA0MzAzIH0sCisgICAgeyAgLTU0NTgsICAtNDExOSwgICAxOTU4LCAgMjI3NCB9LAorICAgIHsgIC03MzAwLCAgLTM0NjksICAgMzUxNCwgIDMxOTMgfSwKKyAgICB7ICAtNDU5NCwgIC0yMDY3LCAgICA3NzUsICA0NzUyIH0sCisgICAgeyAgLTMzODksICAtMTY1NCwgICAxNDY0LCAgNTQxMiB9LAorICAgIHsgIC00ODQ1LCAgLTM0ODMsICAgIDk2NCwgIDM0MzcgfSwKKyAgICB7ICAtNjAwNywgIC0yODE4LCAgIDE2NjYsICA0NjU5IH0sCisgICAgeyAgLTg3MDksICAtNTAwNywgICAxNzU3LCAgMzI4NyB9LAorICAgIHsgIC01ODMzLCAgLTQzODksICAgMTAyNSwgIDMxNzEgfSwKKyAgICB7ICAtNTc4OCwgIC0xNzgwLCAgIDM5NDQsICAzNjYxIH0sCisgICAgeyAgLTQ0MzAsICAgLTkyMCwgICAxOTM4LCAgNDc1MyB9LAorICAgIHsgIC03MDY2LCAgLTE4NTcsICAgNDU5MSwgIDQ1MzggfSwKKyAgICB7ICAtMzU0OSwgICAtNTEzLCAgIDE0MjcsICA1MzE3IH0sCisgICAgeyAgLTc1MTcsICAtMTIyMCwgICAyODgzLCAgMzA0OSB9LAorICAgIHsgIC03NjA1LCAgLTI2ODcsICAgMTg3NCwgIDI3MzUgfSwKKyAgICB7ICAtODcxOCwgIC00MDM1LCAgIDI2NzYsICAzNzMwIH0sCisgICAgeyAgLTc5OTAsICAtMzkwNywgICAxMTg1LCAgMjYwNyB9LAorICAgIHsgIC02MDU4LCAgLTE3NDQsICAgMzM0OSwgIDUxNTcgfSwKKyAgICB7ICAtNTk1NCwgICAgNTY1LCAgIDMxNjEsICAzMjUwIH0sCisgICAgeyAgLTY0NzgsICAgLTYxMiwgICAxOTMwLCAgMjI3MSB9LAorICAgIHsgIC02NTM1LCAgLTE0NDUsICAgICAtMiwgIDE2MTggfSwKKyAgICB7ICAtODk2MywgIC00MTUxLCAgIDExOTIsICA0MDQ0IH0sCisgICAgeyAgLTcyMjcsICAtMzU3MCwgICAxNjAwLCAgNDIzNCB9LAorICAgIHsgIC00Njc0LCAgICAgNzksICAgIDU5NSwgIDMwMTUgfSwKKyAgICB7ICAtMzk3NCwgICAgNDMwLCAgIDI3MjcsICA1MTM3IH0sCisgICAgeyAgLTUyOTksICAgICAgOSwgICAzNzE0LCAgNDc3OSB9LAorICAgIHsgIC02Nzc5LCAgLTI2OTksICAgICAtOCwgIDI0MzYgfSwKKyAgICB7ICAtNzAxNiwgIC0xMTQ1LCAgIDEyOTMsICAyMzEwIH0sCisgICAgeyAgLTY5NTUsICAtMzMxMiwgICAxNTM0LCAgMTgwMSB9LAorICAgIHsgIC00MDI1LCAgICA3NDAsICAgMTg1MCwgIDQwNTQgfSwKKyAgICB7ICAtOTU4OSwgIC0zNDYwLCAgIDQxNTQsICA1MjcwIH0sCisgICAgeyAgLTQ0MDQsICAtMTE4MSwgICA0Mjk4LCAgNTE3MyB9LAorICAgIHsgIC03MzU2LCAgLTQ1ODMsICAgIC0xOCwgIDI2NDQgfSwKKyAgICB7ICAtNjUxNiwgIC0xMjM1LCAgIDQ0MzksICA2MjM0IH0sCisgICAgeyAgLTM0NTMsICAgLTMwMSwgICA0MzQ0LCAgNDQ2NCB9LAorICAgIHsgIC00NjQzLCAgIDE1MzAsICAgMzMxNSwgIDQzNDAgfSwKKyAgICB7ICAtNDU3NSwgIC0yNTU3LCAgIDM3NTQsICAzNjgyIH0sCisgICAgeyAgLTM2NDMsICAtMzUwMSwgICAyMDUxLCAgMjk5NyB9LAorICAgIHsgIC01NDEyLCAgLTI0NzUsICAgMjMwMSwgIDE1NzkgfSwKKyAgICB7ICAtNTg0NiwgICAgMjU5LCAgIDEzNjAsICAyMzQ4IH0sCisgICAgeyAgLTUyNTgsICAtMTM1OCwgICAxMDUwLCAgIDgzOCB9LAorICAgIHsgIC01NTQyLCAgIC0yMTksICAgNjM3NywgIDU3NTAgfSwKKyAgICB7ICAtNTcxMywgIC0yOTUyLCAgICA5MjIsICAgODk5IH0sCisgICAgeyAgLTIwNDksICAtMTEzNSwgICA1MjA2LCAgMTAzMyB9LAorICAgIHsgIC0xNjkzLCAgLTE4ODYsICAgNDgzNSwgIC0xMDYgfSwKKyAgICB7ICAtMjM0NCwgIC0zNTA0LCAgIDQyMzIsICAgLTEzIH0sCisgICAgeyAgLTI0NzUsICAtMjMzNCwgICA1MDQzLCAgMTEyNiB9LAorICAgIHsgICAtNzg3LCAgLTI1NDksICAgMzg4MCwgIDIxMzggfSwKKyAgICB7ICAtMzE1OSwgIC0yMzQxLCAgIDQ4MzAsICAyODg3IH0sCisgICAgeyAgLTE3ODAsICAtMTAwOSwgICA2MjQwLCAgMjA2MSB9LAorICAgIHsgIC00MzI3LCAgLTMzNjMsICAgMjgxOCwgICA4ODYgfSwKKyAgICB7ICAtMzM3NiwgIC0yNzQzLCAgIDQxMDQsICAgMjA3IH0sCisgICAgeyAgLTMyNTAsICAtNDY0MCwgICAyNzE4LCAgMTQ5OCB9LAorICAgIHsgICAtMzgyLCAgLTEwNzUsICAgNDM4MiwgIDM0NjAgfSwKKyAgICB7ICAtMjQxNiwgIC00MTY4LCAgIDM1MzAsICAgODE2IH0sCisgICAgeyAgLTE3NTYsICAtMjcwOCwgICA0ODYxLCAgIDYyMiB9LAorICAgIHsgIC0xODc5LCAgLTIwOTcsICAgNTE1NiwgIDI4ODkgfSwKKyAgICB7ICAtMjQ5NiwgIC0yNDE4LCAgIDM3MjIsICAyNjcxIH0sCisgICAgeyAgLTI3MTcsICAtMzI1MiwgICAzMzQxLCAgMTk0NCB9LAorICAgIHsgIC00MDYzLCAgLTQwOTEsICAgMzMwNiwgICAyNjcgfSwKKyAgICB7ICAtMzU0OSwgIC0zODA4LCAgIDM3NDcsICAgODQyIH0sCisgICAgeyAgLTI2MzUsICAgIDU0NiwgICA1Nzk0LCAgMTg5NCB9LAorICAgIHsgIC0xODU3LCAgLTExMjEsICAgNDM4MywgIDM5NjQgfSwKKyAgICB7ICAtMjIyNiwgIC0yMTY2LCAgIDM0ODksICAzNjc4IH0sCisgICAgeyAgLTM0OTIsICAgLTY2MCwgICA1MzIzLCAgMTA2MyB9LAorICAgIHsgIC0zMDMzLCAgLTMxMzAsICAgNDM4MiwgIDE4MjggfSwKKyAgICB7ICAtMjcwMywgICAtNjI1LCAgIDYzNjksICAyODUxIH0sCisgICAgeyAgLTE2NTYsICAtMjg0MiwgICA0NTg0LCAgLTUyOCB9LAorICAgIHsgIC00NzgxLCAgLTI2MjIsICAgNDM5MCwgIDIwOTcgfSwKKyAgICB7ICAgLTQxMywgIC0yMDQ1LCAgIDUwODEsICAzMDM1IH0sCisgICAgeyAgLTM4MTAsICAtMjY2MiwgICA0NTMyLCAgMTA5NSB9LAorICAgIHsgIC0zMTQ0LCAgLTE4NTgsICAgNTIxNSwgIDE4ODAgfSwKKyAgICB7ICAtMzU2MiwgIC0xNzk1LCAgIDQ5MjgsICAgNjcwIH0sCisgICAgeyAgLTQ4MDAsICAtMTUwOSwgICA1MTg5LCAgMTg1OSB9LAorICAgIHsgIC0xMDg1LCAgLTM4MzIsICAgNDE2OSwgICA5MDAgfSwKKyAgICB7ICAtMTk2OSwgIC0zMjcwLCAgIDI4NTcsICAyODc4IH0sCisgICAgeyAgLTQyNjcsICAtNDE0MCwgICAzMTc2LCAgMTgwNSB9LAorICAgIHsgIC01MTQ1LCAgLTM3MjcsICAgMzUyNCwgIDExNjggfSwKKyAgICB7ICAtMTM0NiwgIC0xODc2LCAgIDU1MDEsICAxNzQ4IH0sCisgICAgeyAgLTQ5OTgsICAtMjk0NSwgICAzNjk5LCAgIDMzOCB9LAorICAgIHsgIC0zNDU4LCAgLTMwOTYsICAgMzQwNiwgIC02MzUgfSwKKyAgICB7ICAtMTc1MSwgIC0zMjA5LCAgIDM1MDgsICAgMzk1IH0sCisgICAgeyAgLTI1MDcsICAgIDE3MCwgICA1OTg3LCAgIDcwNSB9LAorICAgIHsgIC0zNzU2LCAgLTEwNzIsICAgNTY0NywgIDM1MzYgfSwKKyAgICB7ICAtMjg3MCwgIC0xNDM5LCAgIDUwMjYsICAzMjEyIH0sCisgICAgeyAgLTM5MTMsICAtMzIyNSwgICAzNjY5LCAgMjE0NCB9LAorICAgIHsgIC0zNzM5LCAgICAyMjYsICAgNTc0NywgICA3NjQgfSwKKyAgICB7ICAtMjA1MiwgICAtODIwLCAgIDUyNjYsICAzMDkzIH0sCisgICAgeyAgLTMyMTQsICAtMzgyMCwgICAyNDA5LCAgMjM5MSB9LAorICAgIHsgIC00Mzk4LCAgLTI1ODgsICAgMzUwMSwgIC0yMTggfSwKKyAgICB7ICAtNDQ4NCwgIC0xNzYzLCAgIDQxODAsICAtMTk4IH0sCisgICAgeyAgLTMzNjgsICAtMTUyNSwgICA0MzYyLCAgLTEzNCB9LAorICAgIHsgIC0yNDA3LCAgICAyMjQsICAgNDkwNSwgIDM1MzMgfSwKKyAgICB7ICAtMTM2OSwgIC0yOTM3LCAgIDQ3MjgsICAxNzg4IH0sCisgICAgeyAgLTQ4NDgsICAtMTcwNywgICA0MTU5LCAgIDg1MSB9LAorICAgIHsgIC0zNDU0LCAgLTE3NDksICAgNDI4MSwgIDMyMzAgfSwKKyAgICB7ICAtMTk5MCwgIC0zODUzLCAgIDM0ODcsICAxNzM1IH0sCisgICAgeyAgLTMxMTcsICAgICA5MiwgICA2MTU1LCAgNDA3NSB9LAorICAgIHsgIC0yNjc2LCAgLTI0NzIsICAgNDA3OCwgIC01ODkgfSwKKyAgICB7ICAtMTU0NywgIC0yMDEyLCAgIDI2MjYsICAxODM1IH0sCisgICAgeyAgLTQyNzUsICAgLTU4OCwgICA0ODI0LCAgIDcyNSB9LAorICAgIHsgICAtNjAxLCAgLTIyNDksICAgMzczNiwgIDM1NDggfSwKKyAgICB7ICAtNDA2MCwgICAgLTYxLCAgIDUzMzMsICAzMDk3IH0sCisgICAgeyAgLTQzMDMsICAgICAgNywgICA2NTUxLCAgMzA1NCB9LAorICAgIHsgIC01MDAzLCAgLTEwMjksICAgNTc4NiwgIDMzMTkgfSwKKyAgICB7ICAtMjgxMCwgICAtNzI4LCAgIDUzOTIsICAgMTk5IH0sCisgICAgeyAgLTEyMzIsICAgLTIwMCwgICA1MjI4LCAgMzEyMSB9LAorICAgIHsgICAyNjIxLCAgICAxNjUsICAtNjI1NSwgICAyOTggfSwKKyAgICB7ICAgMzY2OSwgICAgNTM3LCAgLTY4NDQsICAxNTY0IH0sCisgICAgeyAgIDE1OTgsICAtMTE5MCwgIC02MjM1LCAgMjUyMyB9LAorICAgIHsgICAyMTY0LCAgICAtMzIsICAtNjg5NCwgIDEzODMgfSwKKyAgICB7ICAgIDg1MywgIC0xNTk3LCAgLTYwNjksICAxNDQ5IH0sCisgICAgeyAgIDEzNzcsICAtMTY2MSwgIC01MjY2LCAgIDEwOCB9LAorICAgIHsgICAyNjYwLCAgICAgNDgsICAtNTE3MiwgIC01MTcgfSwKKyAgICB7ICAgMTkwMywgICAtMzkxLCAgLTU2NzcsICAxMDEwIH0sCisgICAgeyAgIDM3OTIsICAgIDIwNiwgIC01Mjc0LCAgIC0xMSB9LAorICAgIHsgICAxMjM5LCAgIDI3NzYsICAtMjkyOSwgIDI3MjEgfSwKKyAgICB7ICAgNDA3MSwgICAgMTQ5LCAgLTcyNTksICAzMTI1IH0sCisgICAgeyAgIDE0MzYsICAgLTQ4MCwgIC02MTU2LCAgLTE5NiB9LAorICAgIHsgICAxMzczLCAgLTE5NjAsICAtNTAwNSwgIDMxMjIgfSwKKyAgICB7ICAgMzQxMywgIC0xMjcxLCAgLTUxNzYsICAzMjgzIH0sCisgICAgeyAgIDMwNjAsICAgIC02OCwgIC02NDk1LCAgMjIzOCB9LAorICAgIHsgICAyNzAwLCAgLTIwNzUsICAtNDY4MSwgICAgOTEgfSwKKyAgICB7ICAgMjkyOCwgIC0xNzI4LCAgLTUxNjgsICAxODU4IH0sCisgICAgeyAgIDQ0MjQsICAgIDgyOCwgIC00NDcxLCAgICA4OCB9LAorICAgIHsgICAyNjcyLCAgLTI2MDQsICAtNDAzOCwgIDI3NTMgfSwKKyAgICB7ICAgNTIyMywgICAtMTIzLCAgLTY3NDksICAyMjk1IH0sCisgICAgeyAgIDQyMzcsICAgLTQyMCwgIC01NTM4LCAgMTM1MyB9LAorICAgIHsgICA0NzQ0LCAgLTEyODEsICAtNDA5NywgIDQ3MDggfSwKKyAgICB7ICAgMTEwMywgIC0yNzY0LCAgLTQ3NTEsICAyMDI0IH0sCisgICAgeyAgIDM3NDcsICAtMTkxMywgIC0zOTExLCAgMzk2MCB9LAorICAgIHsgICAyNDcwLCAgLTE0MTYsICAtNTU0MiwgICA2MTUgfSwKKyAgICB7ICAgNDg0NywgIC0xMzU0LCAgLTUzMzQsICAxNzMzIH0sCisgICAgeyAgIDUzMzYsICAgICA4OCwgIC03NTkzLCAgNDAwNyB9LAorICAgIHsgICAyMzg4LCAgLTI4ODAsICAtNDgwNywgIDEwMzcgfSwKKyAgICB7ICAgNDQ5NSwgICAxMzkxLCAgLTU2ODUsICAtMTM5IH0sCisgICAgeyAgIDUyNTMsICAgMTYzNywgIC02NDUwLCAgMTUzMyB9LAorICAgIHsgICAxMTk5LCAgICA3OTUsICAtNTUxNSwgIDEyNjEgfSwKKyAgICB7ICAgMTM5NywgIC0xMjU5LCAgLTQyNTIsICAzODM4IH0sCisgICAgeyAgICA3NDYsICAgICA3MCwgIC02NjQwLCAgIDYwNCB9LAorICAgIHsgICAxNTg0LCAgICAxNjYsICAtNDk3MiwgIDMwNzIgfSwKKyAgICB7ICAgIDM4MCwgICAtOTk5LCAgLTUzOTcsICAyMjY3IH0sCisgICAgeyAgIDI5NzQsICAgMTcwNywgIC0zMjQyLCAgNTM2MCB9LAorICAgIHsgICA1MjAyLCAgIC00MDMsICAtNTQ1MywgIDI4MzIgfSwKKyAgICB7ICAgMzcxOCwgIC0xNzMxLCAgLTQ3NjAsICAgNzE0IH0sCisgICAgeyAgIDQxNTAsICAgLTk3NSwgIC00NzkyLCAgICA2MSB9LAorICAgIHsgICAyOTI1LCAgIC04MTgsICAtNDg0MSwgICAgMTUgfSwKKyAgICB7ICAgNTMwMSwgICAgNTc3LCAgLTQwMDYsICAzMjU5IH0sCisgICAgeyAgIDUyNjUsICAgMTk4NiwgIC01Njc5LCAgMzAyOCB9LAorICAgIHsgICAzNzUyLCAgIDE5MjgsICAtNDUwOSwgIDM3MjkgfSwKKyAgICB7ICAgMzI3OCwgICAxOTI1LCAgLTYzNzAsICAxMjQ3IH0sCisgICAgeyAgIDUxMDcsICAgMTcyMSwgIC00ODUzLCAgMzEyNyB9LAorICAgIHsgICAzMjc5LCAgIDI5ODIsICAtMjUxNSwgIDQwMDUgfSwKKyAgICB7ICAgNDYyMiwgICAgNjY4LCAgLTYyMDQsICAgNzU5IH0sCisgICAgeyAgIDYwMzQsICAgIDMxNywgIC01NzYzLCAgNDgxOCB9LAorICAgIHsgICAtNTU4LCAgICAgNTcsICAtMzc4NSwgIDI4MTcgfSwKKyAgICB7ICAgNDQ3NiwgICAxNjE2LCAgLTM5NjUsICA0NTM2IH0sCisgICAgeyAgIDU5NTMsICAgMjA1NiwgIC04MjE1LCAgMjcxNSB9LAorICAgIHsgICA0Mzg3LCAgIDI2MTMsICAtNzQ2MywgICA4NjggfSwKKyAgICB7ICAgNTgzNCwgICAxMDg4LCAgLTQ3MzYsICA0OTI0IH0sCisgICAgeyAgIDY0NzMsICAgLTg1NiwgIC02OTkxLCAgNDE3MiB9LAorICAgIHsgICA0OTU5LCAgIC0yOTMsICAtNTE2MiwgICAgNzYgfSwKKyAgICB7ICAgMjczMSwgICAtODQzLCAgLTYxMTksICAzODQ3IH0sCisgICAgeyAgIDMyNDUsICAgMTIwMiwgIC02ODMzLCAgIDYxNiB9LAorICAgIHsgICAyNTUzLCAgIDEzODMsICAtMzgyOSwgIDM4NTkgfSwKKyAgICB7ICAgNDMzMiwgICAyMDk5LCAgLTM0ODAsICAzNjIyIH0sCisgICAgeyAgIDIxMTAsICAgMjY4MywgIC0yNzI4LCAgMzk5MCB9LAorICAgIHsgICAgODc2LCAgIDExNjcsICAtMzI5MCwgIDM0NjYgfSwKKyAgICB7ICAgMzk5MSwgICAxNzA5LCAgLTI0MTAsICA0MDc3IH0sCisgICAgeyAgIDUxMDUsICAgIDkzOSwgIC0yNTg0LCAgMzI1NiB9LAorICAgIHsgICA0NzE5LCAgICA2ODgsICAtMTU2NiwgIDMwNDAgfSwKKyAgICB7ICAtMzYzMiwgICA0MzM1LCAgIDEyNjYsIC0zMzAzIH0sCisgICAgeyAgLTQ5NTYsICAgMzIwNywgICAxMzEyLCAtMjgwNiB9LAorICAgIHsgIC00NjY5LCAgIDI2MjcsICAgMjY2MywgLTI0MzUgfSwKKyAgICB7ICAtNDI4MiwgICAzNzA4LCAgIDIzMDMsIC0zMDM4IH0sCisgICAgeyAgLTQ1MzYsICAgMjI5NywgICAtMTc1LCAtMzM1MCB9LAorICAgIHsgIC01MjM0LCAgIDI1MDMsICAgLTEzOSwgIC04ODAgfSwKKyAgICB7ICAtMzk3OCwgICAxNTEyLCAgIDEwOTIsIC0zNjE5IH0sCisgICAgeyAgLTQ1MTksICAgNDY0OSwgICAxMzYzLCAtMjQ1NSB9LAorICAgIHsgIC01MTE4LCAgIDMxMzIsICAgMTk2MSwgLTE1NzcgfSwKKyAgICB7ICAtNTE5NiwgICAzMzc5LCAgIC0xODIsIC0xMzc4IH0sCisgICAgeyAgLTY0MjAsICAgNDQ4NiwgICAyMzk3LCAtMTk5MyB9LAorICAgIHsgIC01MDMwLCAgIDUwNDYsICAgMTI5MiwgLTExMTggfSwKKyAgICB7ICAtNDU1OSwgICAyNTczLCAgIC05MjcsIC0xNDA2IH0sCisgICAgeyAgLTM1MDEsICAgMzczMCwgICAgNjkxLCAtNDkzMCB9LAorICAgIHsgIC00MzY0LCAgIDI3NTgsICAgMTAwNywgLTM5MDkgfSwKKyAgICB7ICAtNDAyNiwgICAyODM5LCAgLTE1NTksIC0yMzQwIH0sCisgICAgeyAgLTUwMzcsICAgNDA1MywgICAgODM2LCAtMTU3MSB9LAorICAgIHsgIC00NzI3LCAgIDUxMzYsICAgMTExMCwgLTM1ODggfSwKKyAgICB7ICAtNTI0NSwgICAyNzk5LCAgIC05OTksIC0yMTY0IH0sCisgICAgeyAgLTQ5NTQsICAgMTUwMSwgICAgNDIyLCAtMzk2MyB9LAorICAgIHsgIC01OTk0LCAgIDI3MjYsICAgMTQ2MiwgLTI4MzMgfSwKKyAgICB7ICAtNTYyMSwgICA1MTU5LCAgIDIwMzgsIC0yNTEyIH0sCisgICAgeyAgLTQ5OTEsICAgMjI5MSwgICAxOTE3LCAtMzE1MSB9LAorICAgIHsgIC01NDY5LCAgIDQzODIsICAgLTE0OCwgLTI5NzggfSwKKyAgICB7ICAtNTg1OCwgICAxOTgzLCAgICA4MDcsIC0yNzIwIH0sCisgICAgeyAgLTQ3MDksICAgMzU1NiwgICAgOTUyLCAgLTQ2NyB9LAorICAgIHsgIC0yNDg5LCAgIDIzNjIsICAgMTcxNCwgLTQyMzAgfSwKKyAgICB7ICAtNDcxNywgICA1MDA0LCAgLTExODAsIC0zNjcyIH0sCisgICAgeyAgLTU5MTQsICAgMzY1MywgICAxMzU5LCAtMTMxNyB9LAorICAgIHsgIC01NTA2LCAgIDI5OTUsICAgIDc4MCwgLTEwNTkgfSwKKyAgICB7ICAtNTI4NywgICAzOTQ1LCAgIDI0ODAsIC0yMjkzIH0sCisgICAgeyAgLTM4NDksICAgNDM1OCwgICAgMzIyLCAtMTc3MCB9LAorICAgIHsgIC0zOTExLCAgIDM1NzAsICAgIDI1MiwgLTMxODUgfSwKKyAgICB7ICAtMzY2MCwgICA1MTI4LCAgICAxNTgsIC0zNzE5IH0sCisgICAgeyAgLTQ1OTksICAgMzI3NywgICAtNTAzLCAtMjcyNyB9LAorICAgIHsgIC0zNjczLCAgIDM3NjAsICAtMTI1MiwgLTMzMzkgfSwKKyAgICB7ICAtNTE2MSwgICAyMzM3LCAgICAzODgsIC0xOTQzIH0sCisgICAgeyAgLTM1MjksICAgMjIxNiwgICAyMTU2LCAtMzA4MCB9LAorICAgIHsgIC00MzA5LCAgIDQzMzEsICAgMTgwOCwgLTE0NjAgfSwKKyAgICB7ICAtNDc4MiwgICAzODIwLCAgICA0ODAsIC0yNTA0IH0sCisgICAgeyAgLTQxNjYsICAgMzU0NCwgICAtMzc4LCAtMTU2NyB9LAorICAgIHsgIC01NTcyLCAgIDI0NjYsICAgLTQxOCwgLTI5MDkgfSwKKyAgICB7ICAtNjA5NiwgICAyOTMwLCAgICAxMTksIC0xODc4IH0sCisgICAgeyAgLTU5NjMsICAgMzU1NCwgICAxMDExLCAtMjIzMyB9LAorICAgIHsgIC02NDMzLCAgIDQzMzUsICAgIDkzNSwgLTI5MzAgfSwKKyAgICB7ICAtNTAwNCwgICAzMzE0LCAgLTEzNTIsIC0zNDMwIH0sCisgICAgeyAgLTYwNDIsICAgMzQ2MywgIC0xMDA4LCAtMzk0MCB9LAorICAgIHsgIC00NjcxLCAgIDIyMTQsICAgLTY0MCwgLTUwNDAgfSwKKyAgICB7ICAtMjc5NSwgICAzNzU5LCAgIDE0MTIsIC0zODAzIH0sCisgICAgeyAgLTM2NDcsICAgNDQzNiwgICAgNzI5LCAgLTUxNSB9LAorICAgIHsgIC0zNTk0LCAgIDEwMzMsICAgICA1NiwgLTQxNDggfSwKKyAgICB7ICAtMjkwOCwgICAzMDI3LCAgIDI4ODksIC0zNDg1IH0sCisgICAgeyAgLTMzMzgsICAgMjIzNCwgICAgMzEzLCAtNDI4NSB9LAorICAgIHsgIC0zODI1LCAgIDQ0OTcsICAgLTU2MSwgLTI2MzQgfSwKKyAgICB7ICAtNjE2NywgICAzMDEyLCAgICAtNDgsIC0zMTQ5IH0sCisgICAgeyAgLTQ4MjgsICAgMzUxNSwgICAtOTY5LCAtNDQ3NSB9LAorICAgIHsgIC01Nzg5LCAgIDI3NTcsICAgLTUzOSwgLTQxNzMgfSwKKyAgICB7ICAtMjQ1MiwgICAzMDY3LCAgICA1NjQsIC00MjQ5IH0sCisgICAgeyAgLTQ5MjEsICAgMTM1OCwgICAxMzMxLCAtMjg4OSB9LAorICAgIHsgIC0zMTI3LCAgIDQyMzksICAtMTA0NSwgLTE1MjMgfSwKKyAgICB7ICAtNDc4MCwgICAyMzI2LCAgLTExMTgsIC0zNDQ2IH0sCisgICAgeyAgLTM5MDgsICAgNTU0NiwgICAgMTUyLCAtMjYyMiB9LAorICAgIHsgIC02OTcyLCAgIDI5NzYsICAgIDMzNywgLTI4MDkgfSwKKyAgICB7ICAtNDgzOSwgICA0NjEzLCAgICAtMzUsIC00MDc3IH0sCisgICAgeyAgLTE0MDgsICAgNDgyMiwgIC0xMTQ5LCAtNDk5NyB9LAorICAgIHsgICAtOTgxLCAgIDQ5NzksICAgLTkxMiwgLTYzMDQgfSwKKyAgICB7ICAtMjA5OCwgICA1Njg5LCAgIC04ODgsIC0yODc4IH0sCisgICAgeyAgLTMzNDMsICAgNDgxNCwgICAtNjU3LCAtNDQzNCB9LAorICAgIHsgIC0yNDYxLCAgIDM2MDEsICAgLTk2NywgLTQ4NjkgfSwKKyAgICB7ICAtMjY1MiwgICAzOTQ0LCAgICAgODcsIC01NTIwIH0sCisgICAgeyAgLTExMDQsICAgNjA3NiwgICAgMTc0LCAtNjQwNyB9LAorICAgIHsgICAgMzU1LCAgIDUzNzAsICAtMTcyMSwgLTU4NjkgfSwKKyAgICB7ICAgMTI0MiwgICA0NDk3LCAgLTExMDcsIC01MDkxIH0sCisgICAgeyAgICAtODksICAgNDAwMiwgIC0xNDkxLCAtNTE4MiB9LAorICAgIHsgICAxMDU5LCAgIDU2OTMsICAtMTU5MSwgLTQ5MDUgfSwKKyAgICB7ICAgMTMyMywgICA0NjgyLCAgLTIwNzgsIC00NzY4IH0sCisgICAgeyAgICA4MTgsICAgMzk5NiwgICAtNTQ5LCAtNTQ2OCB9LAorICAgIHsgICAtMjg3LCAgIDQ1MjksICAgIDkyOSwgLTU1NDMgfSwKKyAgICB7ICAgLTkxOSwgICA1NTE5LCAgLTI3OTEsIC0yODQ0IH0sCisgICAgeyAgLTE0MDcsICAgNTY3OSwgIC0zMjg5LCAtMzk3NCB9LAorICAgIHsgICAtMTg5LCAgIDY1MzAsICAtMzU0NywgLTQwMDIgfSwKKyAgICB7ICAgLTkwMCwgICA3MDM5LCAgLTMzNzEsIC00ODU1IH0sCisgICAgeyAgLTI5ODMsICAgNzIxMSwgICAtMzYzLCAtNDgzNSB9LAorICAgIHsgICAtODE0LCAgIDY1MDMsICAgLTEwNCwgLTUxMDYgfSwKKyAgICB7ICAtMjM4NiwgICA2ODk2LCAgICA4MDksIC00OTE5IH0sCisgICAgeyAgICA4NDUsICAgNDQ5MiwgICAgMzUyLCAtNjYyMSB9LAorICAgIHsgIC0xOTk4LCAgIDcyMzcsICAtMTY0NiwgLTQyMzEgfSwKKyAgICB7ICAtMzM4MCwgICA2MjUxLCAgICA0NzEsIC00NTc3IH0sCisgICAgeyAgLTE5MDgsICAgNzA1OSwgICAgIDg0LCAtNTcyNiB9LAorICAgIHsgICAtMzQwLCAgIDYzNDYsICAgLTgwMywgLTYyNjUgfSwKKyAgICB7ICAtMjI3OSwgICA1ODM0LCAgICAtNDcsIC00NjMzIH0sCisgICAgeyAgLTE1MzIsICAgNTI4NiwgIC0xNzQ4LCAtMTkwMSB9LAorICAgIHsgIC0yNzU3LCAgIDYxODgsICAgLTQ1MywgLTM0MTUgfSwKKyAgICB7ICAtMTI1NSwgICA2NDA1LCAgLTIwNDMsIC02MzU3IH0sCisgICAgeyAgICA5MTgsICAgNTU4MSwgICAtMTIxLCAtNTY2NyB9LAorICAgIHsgICAxODQwLCAgIDUzMzYsICAgLTgyMSwgLTUwMzQgfSwKKyAgICB7ICAtMjQ3NSwgICA0OTkyLCAgLTE4MjUsIC0zMTA0IH0sCisgICAgeyAgLTI0MTMsICAgNTYwNiwgIC0xNzg5LCAtNDI5OCB9LAorICAgIHsgICAgMTMyLCAgIDUxMjgsICAtMjM4OSwgLTQ0NDIgfSwKKyAgICB7ICAgIDIyMywgICA2NDAwLCAgLTI2NTMsIC00NzQyIH0sCisgICAgeyAgIC02NzMsICAgNTAxMiwgICAgNjgwLCAtNDU4MiB9LAorICAgIHsgIC0xNjU3LCAgIDY2MjQsICAgLTM0OSwgLTM1OTYgfSwKKyAgICB7ICAgLTc1NSwgICA2Mjg5LCAgLTE4NjAsIC0zOTc4IH0sCisgICAgeyAgIC01NzIsICAgNjg5NCwgIC0xOTQ2LCAtNTIwNyB9LAorICAgIHsgIC0xMTQxLCAgIDQ3NTYsICAtMjY2NSwgLTU1ODYgfSwKKyAgICB7ICAtMTA3MywgICA0MjY5LCAgIC00MzEsIC00MDMwIH0sCisgICAgeyAgICAxODYsICAgNTc2MSwgICAgOTE2LCAtNTg2OCB9LAorICAgIHsgIC0xOTA3LCAgIDQ4MzYsICAgMTAxNywgLTUxMDYgfSwKKyAgICB7ICAgLTk2MywgICAzMzYzLCAgLTEyNDgsIC02MzQ4IH0sCisgICAgeyAgLTMyNjIsICAgNDc3NCwgIC0xODE4LCAtNTg1OCB9LAorICAgIHsgICAgODQ3LCAgIDM4MTIsICAtMjUzOCwgLTQzMDIgfSwKKyAgICB7ICAtMTIyMywgICA1OTAzLCAgIDEzNjAsIC01NDc5IH0sCisgICAgeyAgLTEwOTQsICAgNjkyMywgIC0xMjQ0LCAtMjM4MSB9LAorICAgIHsgICAgMjY3LCAgIDYyNzYsICAgLTcwOSwgLTI4NDYgfSwKKyAgICB7ICAgLTE1NywgICA1ODQwLCAgIDExMjQsIC00MjY2IH0sCisgICAgeyAgICA4ODksICAgMzIwNiwgICAtOTEwLCAtNTMwNSB9LAorICAgIHsgIC0xNzM2LCAgIDMzNDQsICAgIDU4MiwgLTQ4MzggfSwKKyAgICB7ICAtMjM1NywgICA1Njc2LCAgLTI2OTUsIC02Mjc3IH0sCisgICAgeyAgLTE5MTYsICAgNjkwMSwgICAtOTg2LCAtNTM5NyB9LAorICAgIHsgIC0zMDYyLCAgIDYwMjgsICAgLTY5NSwgLTU2ODcgfSwKKyAgICB7ICAgMTgzNiwgICAzNTY2LCAgLTEzNTcsIC01MjI2IH0sCisgICAgeyAgLTIxNzYsICAgNDkzOCwgICAgNjQ2LCAtMzg3MiB9LAorICAgIHsgIC0yMTk5LCAgIDMwNTUsICAgLTIwOCwgLTYxMjQgfSwKKyAgICB7ICAgLTIzNiwgICAzMDMyLCAgIC04MjEsIC01MzI1IH0sCisgICAgeyAgLTM5ODksICAgNzI3NywgICAtNTY1LCAtMzg5OSB9LAorICAgIHsgICAtNTk1LCAgIDQzNjIsICAgICA3NCwgLTU5NzUgfSwKKyAgICB7ICAgIDY4NCwgICA1ODc0LCAgIC04NDEsIC00NDI0IH0sCisgICAgeyAgLTI3MzEsICAgNjMwNSwgIC0yMzg5LCAtNTQ2NSB9LAorICAgIHsgIC01Nzc1LCAgIDEzMjUsICAgIC01NiwgLTI1MjggfSwKKyAgICB7ICAtNzAyOSwgICAtNTM0LCAgLTE4OTAsIC0zMjc4IH0sCisgICAgeyAgLTU3OTgsICAgIC0xNSwgIC0yNzM0LCAtMjIxMCB9LAorICAgIHsgIC01NTA0LCAgLTExOTgsICAgLTM1MywgLTM2NTkgfSwKKyAgICB7ICAtNTA3OSwgICAgOTYwLCAgIC04OTQsIC00MzM2IH0sCisgICAgeyAgLTYwNzMsICAgIC0zNiwgICAtMTMzLCAtMzAxNCB9LAorICAgIHsgIC01NzgyLCAgIC0yNTksICAtMTAyNSwgLTM5ODYgfSwKKyAgICB7ICAtNjg0MywgICAxMjYyLCAgIC04MDcsIC0xNjM5IH0sCisgICAgeyAgLTUyNjMsICAgLTkxOCwgIC0zMjkwLCAgLTU3OSB9LAorICAgIHsgIC00ODQwLCAgICA0NjEsICAtMjE1OCwgIC01MzMgfSwKKyAgICB7ICAtNjAxNCwgICAgLTUwLCAgIC02MjAsICAgNTA0IH0sCisgICAgeyAgLTU4NDMsICAgIDI0MSwgIC0xMzU5LCAgLTI4MiB9LAorICAgIHsgIC01ODk4LCAgICA1NzcsICAgIDc2OSwgLTMyNzEgfSwKKyAgICB7ICAtNjgzMywgICAtOTQ2LCAgIC00NjYsIC0zMzQ3IH0sCisgICAgeyAgLTYwMjYsICAgMTQ1OSwgICAtNTEyLCAgLTcyOSB9LAorICAgIHsgIC03MzYxLCAgICA3NDcsICAgLTM4OCwgLTExMTAgfSwKKyAgICB7ICAtNjM5MSwgICAyMTQyLCAgLTExNjAsIC0yNTEzIH0sCisgICAgeyAgLTY5OTUsICAgIDMwNCwgICAgNDk4LCAtMjY3MyB9LAorICAgIHsgIC02NzU3LCAgICA2NzksICAgLTM4NiwgIC00MzMgfSwKKyAgICB7ICAtNTIyMiwgICAxNjg4LCAgLTEwOTMsIC0xMDMyIH0sCisgICAgeyAgLTUwMTksICAgIDU3NSwgICAgMTg0LCAtMzYyNyB9LAorICAgIHsgIC00MjM3LCAgICA2MjgsICAtMzUwNywgLTEyNDMgfSwKKyAgICB7ICAtNzQ3OSwgICAtNDU2LCAgLTE3MjIsIC0xNDg2IH0sCisgICAgeyAgLTY0NjQsICAgIDcxMywgIC0xMjczLCAtMTE1MyB9LAorICAgIHsgIC02MjU1LCAgIDE2ODIsICAgLTYwNiwgLTM2MDcgfSwKKyAgICB7ICAtNzAzMywgICAxNDk3LCAgICAtNzEsIC0xOTU1IH0sCisgICAgeyAgLTY2OTQsICAgMTU1NiwgIC0xNzIxLCAtMzIxNCB9LAorICAgIHsgIC02MTE0LCAgIC0zNTYsICAgIDgxMywgLTI1NzUgfSwKKyAgICB7ICAtNTMwOCwgICAgNjMyLCAgLTE4NTEsIC0xNjM2IH0sCisgICAgeyAgLTU3NDIsICAgLTkxMSwgIC0xNzMzLCAgIDM4MyB9LAorICAgIHsgIC02MDgzLCAgIC0zODcsICAtMjMxMywgIC04NzkgfSwKKyAgICB7ICAtNjUzNSwgICAtNTMwLCAgLTE1MDUsIC0yMDgzIH0sCisgICAgeyAgLTQ4OTYsICAgMTIyMywgIC0yNzUwLCAtMTgxNiB9LAorICAgIHsgIC02MzkyLCAgIC00NjMsICAtMzI0NywgLTIwOTMgfSwKKyAgICB7ICAtNTM3MywgICAxMjY0LCAgLTI3MDYsIC0zMDQyIH0sCisgICAgeyAgLTM4OTQsICAtMTM5MCwgIC0xMDIwLCAgLTg5MSB9LAorICAgIHsgIC02MTc5LCAgIDExNjgsICAtMTk2NiwgLTE5MjIgfSwKKyAgICB7ICAtNTE2MiwgICAxNjY4LCAgLTE2MTcsIC0xOTE2IH0sCisgICAgeyAgLTY0NTMsICAgIDkyMCwgIC0xMTY5LCAtMjQzMiB9LAorICAgIHsgIC02MTMwLCAgIDIwMDUsICAgLTUzNiwgLTE1MTkgfSwKKyAgICB7ICAtNjU1MiwgICAgLTk4LCAgIC01MTgsIC0xOTM4IH0sCisgICAgeyAgLTc1MjgsICAgIDM1NSwgIC0xMTAxLCAtMTc3MiB9LAorICAgIHsgIC01NzQ1LCAgICA2MTAsICAgLTI0NywgLTEzNjAgfSwKKyAgICB7ICAtNzAwMywgICAgMTc3LCAgLTIwNjQsIC0xOTU4IH0sCisgICAgeyAgLTY5NTYsICAgLTU3MCwgIC0yMjIwLCAtNDIyNSB9LAorICAgIHsgIC03ODMwLCAgICA3OTEsICAtMTM5NCwgLTI3NzQgfSwKKyAgICB7ICAtNzYzNCwgICAgNDgwLCAgLTMxNzEsIC00MjI0IH0sCisgICAgeyAgLTc5MTMsICAgMTE1NCwgICAtMzUwLCAtMjM4MSB9LAorICAgIHsgIC01MDYzLCAgIDE3MDQsICAtMTgwNCwgLTI5NzcgfSwKKyAgICB7ICAtNDg4NywgICAtNTI0LCAgLTI3MDMsICAgMTg4IH0sCisgICAgeyAgLTU1NTEsICAgIDQwNiwgIC0xNjIwLCAtMzA2MyB9LAorICAgIHsgIC03MTA5LCAgIDEzNDIsICAgIDM4MSwgLTMwMjEgfSwKKyAgICB7ICAtNjg0NiwgICAgNjMxLCAgIC00NTgsIC0zMzk4IH0sCisgICAgeyAgLTQ2MDYsICAgLTYwNSwgICAgIDExLCAtMzkzMCB9LAorICAgIHsgIC04MTM0LCAgIC0yMjUsICAtMTczOCwgLTI2NDggfSwKKyAgICB7ICAtNzA0MywgICAgNDAyLCAgLTI3MzQsIC0zMDU5IH0sCisgICAgeyAgLTc0MTcsICAgMTgyNSwgIC0yNTQ1LCAtNDM4OSB9LAorICAgIHsgIC02OTcxLCAgIC0yMzYsICAtMTAzMSwgIC02NjUgfSwKKyAgICB7ICAtNTc1MiwgICAyMTExLCAgLTE2MzIsIC0zODA4IH0sCisgICAgeyAgLTc2NjAsICAgIC03OCwgICAtNjI0LCAtMzEzNSB9LAorICAgIHsgIC02MzU4LCAgICA2MTksICAtMTk1MSwgLTM5MTEgfSwKKyAgICB7ICAtODEzNCwgICAgNDA4LCAgLTE5MzUsIC0zNjk1IH0sCisgICAgeyAgLTYzMzUsICAgMTkxMSwgIC0yMzY4LCAtNDUwNSB9LAorICAgIHsgIC03MTE2LCAgIDIxNjMsICAgLTM0NCwgLTI3NTMgfSwKKyAgICB7ICAgMjM1NywgICA0NDg4LCAgIDIyMjAsIC01NjgyIH0sCisgICAgeyAgIDEzODUsICAgMzIwNiwgICAyMzAwLCAtNTMwNSB9LAorICAgIHsgICAxNDE5LCAgIDI1NTcsICAgNTIwMywgLTM1MTYgfSwKKyAgICB7ICAgIDI2MiwgICA0MzE1LCAgIDM5MjAsIC0xODQ3IH0sCisgICAgeyAgIDMzMTYsICAgMzE4NywgICAxNjEyLCAtNTYwOSB9LAorICAgIHsgICAxNzI5LCAgIDIzNTAsICAgMTY3MywgLTYwNjggfSwKKyAgICB7ICAgMTYwMywgICA2MTI2LCAgIDE0NjcsIC0yODM5IH0sCisgICAgeyAgLTEzMzksICAgMzMxNiwgICAzNjkxLCAtMzUzMCB9LAorICAgIHsgICAtNTYzLCAgIDQ2MTgsICAgMzE4MCwgLTQ1NDggfSwKKyAgICB7ICAgIDQ2MywgICA0NjI0LCAgIDMxMTEsIC01NjE0IH0sCisgICAgeyAgIDEyNDYsICAgNTQ1NSwgICAzMzU2LCAtNTcyMCB9LAorICAgIHsgICAgNDgwLCAgIDIxNDksICAgNTQyMiwgLTI4OTMgfSwKKyAgICB7ICAgMTc2OCwgICA0ODI3LCAgICA5MTMsIC01NTc5IH0sCisgICAgeyAgIC0xNDksICAgNTM4MSwgICA0MzY2LCAtMzI5NyB9LAorICAgIHsgICAgOTg1LCAgIDM2NzIsICAgMjY0NCwgICAtOTIgfSwKKyAgICB7ICAgLTI1OCwgICAyOTExLCAgIDU4MTcsIC0yMjEzIH0sCisgICAgeyAgIDM0MjgsICAgMzI4OSwgICAzMzUxLCAtMzU0MSB9LAorICAgIHsgICAtNjY2LCAgIDMyOTUsICAgNDcyNywgLTI4NjkgfSwKKyAgICB7ICAgICAzNSwgICA2NjQxLCAgIDQxNjAsIC00MDUyIH0sCisgICAgeyAgICA2MjMsICAgNjc4NywgICAzMTU2LCAtNDU2MCB9LAorICAgIHsgICAyNjU0LCAgIDQzNjAsICAgNDY3NiwgLTQ2MzIgfSwKKyAgICB7ICAgMTM4NiwgICA1MjQ2LCAgIDQ4MzQsIC00NDk3IH0sCisgICAgeyAgIDM0ODgsICAgNDU3NCwgICAzODU2LCAtNTk0NiB9LAorICAgIHsgICAgMzgzLCAgIDQ0ODEsICAgNDE2OCwgLTQxMTAgfSwKKyAgICB7ICAgMTc1MywgICAzNjUyLCAgIDQyODgsIC0zMzI2IH0sCisgICAgeyAgIDEzNDQsICAgNDkwNSwgICAyNTA4LCAtNDY2MCB9LAorICAgIHsgICAxNTgwLCAgIDQxMDYsICAgMzEwNCwgLTIyMjQgfSwKKyAgICB7ICAgMjAyNywgICA1MDM4LCAgIDE2ODMsIC0xNTU0IH0sCisgICAgeyAgICA0NDYsICAgMzY5OSwgICA1ODcyLCAtMzAxMyB9LAorICAgIHsgICA0NjM3LCAgIDQwODcsICAgMzU3OCwgLTUwMTggfSwKKyAgICB7ICAgMjYyOSwgICAzNTYwLCAgIDUzMzEsIC00OTAwIH0sCisgICAgeyAgIDE1MjcsICAgNjY3NCwgICAyNTIzLCAtNDEzMSB9LAorICAgIHsgIC0xNDM3LCAgIDI4MDQsICAgMjUyOCwgLTQ0NjQgfSwKKyAgICB7ICAgLTIyOSwgICAzMzU1LCAgIDIwMTYsIC01NTM3IH0sCisgICAgeyAgIDM2NjYsICAgMzQxOCwgICA0Mzc0LCAtNDU4MSB9LAorICAgIHsgICAxMTkyLCAgIDM3OTksICAgIDkyMywgLTY1OTYgfSwKKyAgICB7ICAgMjA0MCwgICAyOTU2LCAgICA0NDgsIC01MzIyIH0sCisgICAgeyAgIDI0NjgsICAgNTc2OCwgICA0MDI5LCAtNTg2OSB9LAorICAgIHsgICAzNDM4LCAgIDY1MTYsICAgMzUyOSwgLTY2NjcgfSwKKyAgICB7ICAgMjczNywgICA1NDk1LCAgICA2ODAsIC01NTM1IH0sCisgICAgeyAgIDM4OTYsICAgNTcyNywgICAxODAxLCAtNDk1OCB9LAorICAgIHsgICA0OTg4LCAgIDQ5NTcsICAgMzU5MiwgLTY1MTggfSwKKyAgICB7ICAgLTU0MiwgICA0NDE2LCAgIDU3OTQsIC0yNzg3IH0sCisgICAgeyAgIDQxMzYsICAgNDM1NCwgICAyMDY0LCAtNDY5NiB9LAorICAgIHsgICAzMDY3LCAgIDU5MzYsICAgMTIwNywgLTMzOTYgfSwKKyAgICB7ICAgMjc4OSwgICA0OTY2LCAgIDI0MDUsIC0zODU0IH0sCisgICAgeyAgIDE3MzEsICAgMzI3MCwgICAzMjUxLCAtMTA2MyB9LAorICAgIHsgICAxNzY3LCAgIDU1MzcsICAgMjA4NCwgLTIzNDkgfSwKKyAgICB7ICAgIDQ2NSwgICAzMTE2LCAgIDQ1MzIsICAtODM3IH0sCisgICAgeyAgIDE0OTksICAgMjYyNywgICA0NjEwLCAtMjIxMiB9LAorICAgIHsgICAgMTIyLCAgIDMwOTUsICAgMzY0MiwgLTM1NTIgfSwKKyAgICB7ICAgMjU0MiwgICAyODY2LCAgIDI3MDUsIC02NDAyIH0sCisgICAgeyAgIDMxMzQsICAgNDMyMywgICAgNjk4LCAtNDc4NSB9LAorICAgIHsgICAgNzMxLCAgIDE4NTksICAgMzExMiwgLTUyNDIgfSwKKyAgICB7ICAgMjU1MywgICAyOTgwLCAgIDMyNDEsIC00ODQ2IH0sCisgICAgeyAgIDEzMjksICAgNTMxMCwgICAxNjA3LCAtNjYyNCB9LAorICAgIHsgICAyNDY4LCAgIDE4NTgsICAgMzQ3NiwgLTEwMzQgfSwKKyAgICB7ICAgLTE3MiwgICA0OTk2LCAgIDIwMDAsIC01NTYyIH0sCisgICAgeyAgIDI2MjEsICAgNDIyMCwgICAxNTc0LCAtMzM4NiB9LAorICAgIHsgICAtMzMzLCAgIDE4MzIsICAgMzM2MiwgLTQxMTcgfSwKKyAgICB7ICAgMjE2OSwgICA2NzYyLCAgIDMwNjUsIC02MjI1IH0sCisgICAgeyAgIDI4NDQsICAgNTUyOCwgICAzMjIzLCAtNDc2NSB9LAorICAgIHsgICAgNTI2LCAgIDUxNzUsICAgMTY0NCwgLTQyNjcgfSwKKyAgICB7ICAgMjkyMiwgICA0NDI2LCAgIDI0MTQsIC0yNjEwIH0sCisgICAgeyAgICA0NTIsICAgMTM5OSwgIC00NTE2LCAtMjYzNiB9LAorICAgIHsgICAyODcyLCAgIDE3MjAsICAtNDY2NywgLTE0MzUgfSwKKyAgICB7ICAgMTI3OSwgICAgNzAyLCAgLTU0MjQsIC0xOTg0IH0sCisgICAgeyAgIDIxODcsICAgIDg3MCwgIC01MDIxLCAtMTM0MSB9LAorICAgIHsgICAgNTgzLCAgIC0xNDQsICAtNDYyOCwgLTI0NjQgfSwKKyAgICB7ICAgICAgMywgICAyMjM3LCAgLTUyODQsIC0yODI3IH0sCisgICAgeyAgICAtMTksICAgMTAwNSwgIC01NDYwLCAtMTgxOSB9LAorICAgIHsgICAyODk3LCAgIDIwODQsICAtNTg4NSwgIC01MTUgfSwKKyAgICB7ICAgLTQwMCwgICAzMzcwLCAgLTU1MjcsIC0yOTQ3IH0sCisgICAgeyAgIDE1MDUsICAgMjU5MywgIC01NTE4LCAtMTgwMiB9LAorICAgIHsgICAxMzQxLCAgIDQ1MzQsICAtNTA5NCwgLTE4OTkgfSwKKyAgICB7ICAgMzI0MSwgICAzNjcwLCAgLTU0OTMsIC0xMjUyIH0sCisgICAgeyAgLTEyODcsICAgIDkyMSwgIC01OTk0LCAtMTY3NSB9LAorICAgIHsgICAgNjI3LCAgICA0MDgsICAtNjY1MiwgIC0zNjQgfSwKKyAgICB7ICAgLTI2MCwgICAxMTI3LCAgLTQ4NDksIC0zMjQ3IH0sCisgICAgeyAgICAzNzEsICAgMzQwMCwgIC01OTc2LCAtMjI4NSB9LAorICAgIHsgICAxNTMzLCAgIDE1NjYsICAtNjM3MywgIC02MTAgfSwKKyAgICB7ICAgMjQ2MiwgICA0Mjc0LCAgLTYxODQsIC0xMjU0IH0sCisgICAgeyAgIDE3ODIsICAgMzM2MywgIC02MjIyLCAtMTM4MSB9LAorICAgIHsgICAgNTcyLCAgIDQ2NTAsICAtNTY3MywgLTI3NTQgfSwKKyAgICB7ICAgMjY3NCwgICAzNDE0LCAgLTQ0NjAsIC0yMTU0IH0sCisgICAgeyAgIDM2MTQsICAgMzgyMCwgIC02ODgzLCAgLTM5OCB9LAorICAgIHsgICAxMTM2LCAgICAgLTEsICAtNTUxMSwgLTExMTIgfSwKKyAgICB7ICAtMTc3MywgICAxMTM3LCAgLTU2NDcsIC0yMzc3IH0sCisgICAgeyAgIC03NTMsICAgMjEwNCwgIC02MDg1LCAtMjU2NSB9LAorICAgIHsgICAtMjA0LCAgIDMwMjUsICAtNDczMSwgLTE0MTggfSwKKyAgICB7ICAtMTQ4NiwgICAxNDM4LCAgLTQzODAsICAtMjE2IH0sCisgICAgeyAgICAzMDIsICAgIDg1OCwgIC01Nzg2LCAgLTI2NCB9LAorICAgIHsgICAzNDg2LCAgIDE0OTUsICAtNTIzNCwgIC03ODMgfSwKKyAgICB7ICAgIDg4OCwgICAyMzI3LCAgLTM0MjMsIC0zNzIwIH0sCisgICAgeyAgIC0yNTksICAgIDc3MiwgIC02NTk2LCAtMTMxMSB9LAorICAgIHsgIC0xMTk3LCAgIDIwNzMsICAtNTE3NCwgLTE4MjYgfSwKKyAgICB7ICAgMTUwMCwgICAzNDcwLCAgLTQ0NjIsIC0yNjQ1IH0sCisgICAgeyAgIDMwNzIsICAgMTk2MCwgIC0zMjc3LCAtMjI2NCB9LAorICAgIHsgICAxODQxLCAgICA5NTIsICAtNDMyNCwgLTIzNDAgfSwKKyAgICB7ICAgMTk5NCwgICAyMjAwLCAgLTM5NDAsIC0yOTIzIH0sCisgICAgeyAgLTE3ODIsICAgMTY5OSwgIC00NjY3LCAtMTA3NSB9LAorICAgIHsgIC0xNDY0LCAgIDI5MDYsICAtMzQ2OCwgIC0zNzUgfSwKKyAgICB7ICAgIDM2NiwgICAyMzgwLCAgLTM3NDcsICAxNDY3IH0sCisgICAgeyAgIC01NDUsICAgMTY0NSwgIC00NjE5LCAgIDM3NiB9LAorICAgIHsgICAxNzI0LCAgIDIzNTAsICAtMjM3NCwgLTM1MTIgfSwKKyAgICB7ICAgMzE4NCwgICAyNjI4LCAgLTI5OTYsIC0zMjc1IH0sCisgICAgeyAgICA3MzQsICAgMjAxMCwgIC02MjM5LCAtMTQ3OSB9LAorICAgIHsgICAgNTI0LCAgIDM3NTYsICAtNDQ5NiwgLTMyNjMgfSwKKyAgICB7ICAgMTQ5MiwgICAzNTcwLCAgLTM0OTQsIC0zNjAwIH0sCisgICAgeyAgIC05MzIsICAgIDYxOCwgIC01Mzg5LCAtMjg5NCB9LAorICAgIHsgICAtMTMzLCAgIDIxNjEsICAtNDA4MywgLTMyNjcgfSwKKyAgICB7ICAgIDc4NiwgICAgNzc0LCAgLTMyNzksIC0zNzMxIH0sCisgICAgeyAgIDEwNzgsICAgIDgwMywgIC0zODQzLCAtMzAwNyB9LAorICAgIHsgICAtMzMyLCAgIDM0MDUsICAtMzM0NywgICAgNDAgfSwKKyAgICB7ICAgIC0xNywgICAgICA2LCAgLTQwMDUsIC0zNjkwIH0sCisgICAgeyAgIC0xODksICAgNDM3MiwgIC00NDg4LCAtMjU2MSB9LAorICAgIHsgICAtNDUwLCAgIDM4NDYsICAtMzc5MCwgLTEzNzAgfSwKKyAgICB7ICAgIDM2MiwgICAyMjEyLCAgLTUyNzIsICAgLTE1IH0sCisgICAgeyAgLTE1MjksICAgIDc5MSwgIC02ODAyLCAtMjI5NiB9LAorICAgIHsgICAyMTQ1LCAgIDQyNDEsICAtNDQ3NCwgICAzNzYgfSwKKyAgICB7ICAgMTgxMywgICAyNDI2LCAgLTI5MzIsIC0yNzI2IH0sCisgICAgeyAgIC01NDIsICAgNDU1NywgIC0zMTQwLCAtMTA4MCB9LAorICAgIHsgICAxMTkyLCAgIDM3ODQsICAtNDM3MSwgICAtMjAgfSwKKyAgICB7ICAgMjc4NCwgICA1MTg4LCAgLTYzOTksIC0xMzk0IH0sCisgICAgeyAgICA0MzEsICAgNDU2MSwgIC0zNjczLCAtMTM5OCB9LAorICAgIHsgICAxMzgyLCAgIDMwOTYsICAtNDA4MywgIDEyNTMgfSwKKyAgICB7ICAgMTIwOSwgICA0MjI0LCAgLTI5MzAsICAxNTAwIH0sCisgICAgeyAgIDI3OTgsICAgMjY4NCwgIC02Njc2LCAgLTYwNiB9LAorICAgIHsgIC0yMzk2LCAgIDE1MTAsICAtNTM4MSwgLTI3MTMgfSwKKyAgICB7ICAtMjYyNSwgICAyNTQyLCAgLTQwMzIsIC0yODgwIH0sCisgICAgeyAgLTEyMzEsICAgMzk2NywgIC00MDk4LCAtMjg4NiB9LAorICAgIHsgIC0xMzkzLCAgIDIzNzQsICAtMzg2MiwgLTQ1MjUgfSwKKyAgICB7ICAtMjQ5NSwgICAxNjY1LCAgLTE2MzcsIC01NDQ1IH0sCisgICAgeyAgLTM4NTQsICAgMTc1OSwgIC0xNzUwLCAtNDk0NCB9LAorICAgIHsgIC0yMzczLCAgIDE2NjgsICAtMjg1NiwgLTYyNTEgfSwKKyAgICB7ICAtMjY2OCwgICAxOTgxLCAgIC04ODYsIC00NTU3IH0sCisgICAgeyAgLTI5MjcsICAgNDQyNywgIC0zNDUxLCAtNjE3MiB9LAorICAgIHsgIC0xOTI1LCAgIDI1OTYsICAtNDY5NiwgLTI1MjcgfSwKKyAgICB7ICAtMzIwMiwgICAyODQ3LCAgLTM5MjgsIC01ODk2IH0sCisgICAgeyAgLTMzMzIsICAgMTY2NSwgIC01MDI1LCAtMzQxMiB9LAorICAgIHsgIC0zMjEyLCAgIDMxMTUsICAtNDE1NSwgLTQwNjIgfSwKKyAgICB7ICAtMTAxMywgICAzMjA1LCAgLTUxMzMsIC0zNzUxIH0sCisgICAgeyAgLTIwMjIsICAgNDU5NSwgIC0zOTQ3LCAtNTYxMSB9LAorICAgIHsgIC0zNTU2LCAgIDE3NTUsICAtMzcxNSwgLTIzMDAgfSwKKyAgICB7ICAtMTc4NCwgICA0MTE0LCAgLTI3MjMsIC0xNzczIH0sCisgICAgeyAgLTM1ODYsICAgNDA4MSwgIC0yNzMzLCAtNDk0MiB9LAorICAgIHsgIC0xNjA4LCAgIDM2ODUsICAtNDE1NCwgLTQ1NzMgfSwKKyAgICB7ICAtMzM2OCwgICA0MDQyLCAgLTQ0NTIsIC02MjI3IH0sCisgICAgeyAgLTE0MDcsICAgMzg4MSwgIC01NzI5LCAtMzcxOSB9LAorICAgIHsgIC0yNzUxLCAgIDMyODEsICAtNTA3NywgLTQ5OTkgfSwKKyAgICB7ICAtMzc5MSwgICAyNDEwLCAgLTQ5MDYsIC01Mjg4IH0sCisgICAgeyAgIC03MzAsICAgMjMwMywgIC00MjE3LCAtMzc1NSB9LAorICAgIHsgIC0xODEyLCAgIDIzMTEsICAtNTQ5MiwgLTM3MDkgfSwKKyAgICB7ICAgLTYxMCwgICA0MzM2LCAgLTM5MTUsIC0zNzgzIH0sCisgICAgeyAgLTI4NDEsICAgNDMzNywgIC00Mjc4LCAtNDQzMCB9LAorICAgIHsgIC0xNjYyLCAgIDQ2NjYsICAtNDY2MSwgLTM5NjQgfSwKKyAgICB7ICAgLTU4OSwgICA1MjA5LCAgLTQ5MjMsIC0zNjgyIH0sCisgICAgeyAgLTQxNTUsICAgMjIzNCwgIC00MDc2LCAtNDIxOCB9LAorICAgIHsgIC0zOTUxLCAgIDI3NzAsICAtMjY2NSwgLTI4MDUgfSwKKyAgICB7ICAtMjMwMiwgICAzMjI4LCAgLTM3MTcsIC0xOTA4IH0sCisgICAgeyAgLTMxMjksICAgNDM3MywgIC0yMjY0LCAtMjg1MSB9LAorICAgIHsgICAtNDQ3LCAgIDEzNjMsICAtMzU3OCwgLTQzMjMgfSwKKyAgICB7ICAtMjY0OCwgICA0MjM3LCAgLTMxNTksIC0zMDcxIH0sCisgICAgeyAgLTQwNzIsICAgMzI0MSwgIC0zNTQxLCAtNDYwNSB9LAorICAgIHsgIC00NTA3LCAgIDM0NTgsICAtMjMzOSwgLTM4MzggfSwKKyAgICB7ICAtMTY0NiwgICAgOTk3LCAgLTQ5MjYsIC0zOTcwIH0sCisgICAgeyAgLTMwMjUsICAgMTYxNCwgIC0zOTQwLCAtMTI0MiB9LAorICAgIHsgIC0xMzM3LCAgIDE3NTYsICAtMzE2MywgLTU1MjkgfSwKKyAgICB7ICAtMzIwMywgICAxODY1LCAgLTMyODIsIC00MzU0IH0sCisgICAgeyAgLTE2NDYsICAgMjExOCwgIC0yMjAzLCAtNjAxOCB9LAorICAgIHsgICAgMTc0LCAgIDE4NzEsICAtMjcwNywgLTQ2MzkgfSwKKyAgICB7ICAtMjYwNywgICAxNDg1LCAgLTQ3NzgsIC00NzUwIH0sCisgICAgeyAgLTIxOTksICAgMzk5MSwgIC0zMTM0LCAtNDg3OSB9LAorICAgIHsgIC0yOTYyLCAgIDMzMjMsICAtMjgxNiwgLTI0MTkgfSwKKyAgICB7ICAtNTI4NiwgICAyNDk1LCAgLTQ1NDgsIC01Mzk1IH0sCisgICAgeyAgLTI4MTAsICAgMzcxMCwgIC0yMjc0LCAtNDIxMSB9LAorICAgIHsgICAtMzMwLCAgIDMwMDYsICAtMjk5MywgLTQ2NzggfSwKKyAgICB7ICAtMTE4NywgICAyNDExLCAgLTI3NDMsIC01MTk2IH0sCisgICAgeyAgIC02NjQsICAgNDAzMywgIC0zMTAxLCAtNTY0MSB9LAorICAgIHsgIC0xNDU4LCAgIDM2MDIsICAtMjgxNiwgLTUzNzEgfSwKKyAgICB7ICAtNDExNiwgICA0OTIzLCAgLTMzMjEsIC01NjMwIH0sCisgICAgeyAgLTQxNjUsICAgMjUyOCwgIC0yNTkyLCAtNDc5OCB9LAorICAgIHsgIC0yNzU5LCAgIDMwODAsICAtMjMzMywgLTU3MTkgfSwKKyAgICB7ICAtNTE1NywgICAzMDExLCAgLTU1MjYsIC02MzQ4IH0sCisgICAgeyAgLTMwOTUsICAgMjEyNiwgIC01ODgxLCAtNDIzNCB9LAorICAgIHsgIC00Mzc3LCAgIDM4NDksICAtMzYwMCwgLTYwOTkgfSwKKyAgICB7ICAtMTk5NCwgICA0OTQ3LCAgLTUyMzUsIC00NzUzIH0sCisgICAgeyAgLTEwNjcsICAgIDYwMCwgIC0zMjU4LCAtNTEzMyB9LAorICAgIHsgIC00OTkyLCAgIDMzMDIsICAtMjIwOCwgLTUwNTEgfSwKKyAgICB7ICAtMzM3NywgICAyOTgxLCAgLTE2NTUsIC00ODE1IH0sCisgICAgeyAgLTMzMjUsICAgMjQ0NiwgIC0xNzg3LCAtNjExNiB9LAorICAgIHsgIC0yMzQxLCAgIDI3MzcsICAtMzI0MCwgLTYzNDcgfSwKKyAgICB7ICAtMjI1OCwgIC0zNzMyLCAgIDM3MTAsIC0xMjM1IH0sCisgICAgeyAgLTE1NTgsICAtMzg0OSwgICAyNjk0LCAtMzAxMiB9LAorICAgIHsgICAtNTk5LCAgLTQ4MzcsICAgMzA1MCwgLTI5NTEgfSwKKyAgICB7ICAtMjI0NiwgIC01NDMzLCAgIDI3OTgsIC0xOTEwIH0sCisgICAgeyAgLTIyNTUsICAtNDk4OSwgICAzMjYwLCAgIDI3MCB9LAorICAgIHsgIC0zMDI2LCAgLTUzNTMsICAgMjY5MywgLTEwMzYgfSwKKyAgICB7ICAtMTE1MSwgIC02MDk3LCAgIDEwOTcsIC0zNzgyIH0sCisgICAgeyAgLTMzOTEsICAtNjAxMiwgICAyMTMwLCAtMTMwMyB9LAorICAgIHsgIC0yODUwLCAgLTQ0MjIsICAgMzM3NSwgIC00ODAgfSwKKyAgICB7ICAtMTEzOCwgIC0zNzc5LCAgIDE0OTEsIC00MTYyIH0sCisgICAgeyAgIC01NTEsICAtMzg5MiwgICAzNzg3LCAtMjA4MiB9LAorICAgIHsgIC0zMjIxLCAgLTM2NzYsICAgMzE0NCwgLTEyMDIgfSwKKyAgICB7ICAtMzAyMywgIC01MTk2LCAgIDI2NTAsICAgNjA1IH0sCisgICAgeyAgLTE3NTYsICAtNTcyOSwgICAyNjQ2LCAgIDMyMSB9LAorICAgIHsgIC0yNjkzLCAgLTQ0MDksICAgIDQ5NCwgLTQ3OTcgfSwKKyAgICB7ICAtMTkxMywgIC00NTczLCAgIDMzNzIsIC0xNzMwIH0sCisgICAgeyAgLTEyNzcsICAtMzYwNCwgICA0MDYxLCAgLTk5MyB9LAorICAgIHsgICAtNDIwLCAgLTQ5OTMsICAgMTM1MSwgLTQ3OTYgfSwKKyAgICB7ICAtMzA1MiwgIC01MzMzLCAgIDE0MzUsIC0xMjQyIH0sCisgICAgeyAgIC02MDIsICAtNTAzNCwgICAzODY5LCAtMTE0MSB9LAorICAgIHsgIC0yNDM2LCAgLTQ2ODAsICAgMTY2NSwgLTMwMTkgfSwKKyAgICB7ICAtMjY1NywgIC0zNjU4LCAgIDE0NTksIC0zMzkxIH0sCisgICAgeyAgLTEyMjAsICAtNjI0NiwgICAyNzQ5LCAgLTUyNSB9LAorICAgIHsgIC0zODM4LCAgLTQ4NDQsICAgMjI2NSwgLTE3MzUgfSwKKyAgICB7ICAtMTI0NywgIC01Njc5LCAgIDMzNTYsIC0xNDE3IH0sCisgICAgeyAgIC05MTcsICAtNTQ0OCwgICAzMzQyLCAgIDEwNSB9LAorICAgIHsgIC0xNzU2LCAgLTY4MzksICAgMjI3NiwgLTIzNTAgfSwKKyAgICB7ICAgLTQxMiwgIC01MjA2LCAgIDE3NjQsIC0zNTM5IH0sCisgICAgeyAgLTE0MzksICAtNjkxNSwgICAxNDQyLCAtMzc1MCB9LAorICAgIHsgIC0xMzgxLCAgLTQ0MzksICAgMzg2MywgIC0yODIgfSwKKyAgICB7ICAtMzQ4MiwgIC00OTUzLCAgIDI3MjYsICAtMzM2IH0sCisgICAgeyAgLTEzNzYsICAtNTkzMSwgICAxNzE0LCAtMTk4NyB9LAorICAgIHsgIC0xNzE2LCAgLTQ0MDUsICAgMjYwOCwgICAxMDUgfSwKKyAgICB7ICAtMTU5MCwgIC01MTkxLCAgIDI2NTIsIC0yNzA0IH0sCisgICAgeyAgLTIxNDksICAtNjQ0MiwgICAyNDUzLCAtMTI2MyB9LAorICAgIHsgIC0zNDI2LCAgLTM4MzIsICAgMjMzNCwgLTE4MjkgfSwKKyAgICB7ICAtMjc0NywgIC01OTQ4LCAgIDIzNjIsICAtMTczIH0sCisgICAgeyAgLTI0MzUsICAtMzI2NywgICAyOTY2LCAtMTcxMCB9LAorICAgIHsgIC0zOTc5LCAgLTQyODIsICAgMjcwNSwgIC03NzUgfSwKKyAgICB7ICAgLTM1NiwgIC00MjM4LCAgIDI1NDQsIC00MzQzIH0sCisgICAgeyAgLTEzNjMsICAtNjQ3MSwgICAyODE3LCAtMTgzNiB9LAorICAgIHsgIC0yODc4LCAgLTUxMTcsICAgIDIxOCwgLTMxNDkgfSwKKyAgICB7ICAtMzUzOSwgIC01MTk2LCAgIDE3MTAsIC0yMzU2IH0sCisgICAgeyAgLTI4ODgsICAtNDUzNywgICAyNzQ2LCAtMTcwMSB9LAorICAgIHsgIC0xODcwLCAgLTQ0MzksICAgMTQ5NiwgLTQxMjEgfSwKKyAgICB7ICAtMTQ4NiwgIC0zMzg4LCAgIDMzNDksIC0yMTQ1IH0sCisgICAgeyAgLTMzMzMsICAtNDEzOCwgICAxNDY3LCAtMjg3NiB9LAorICAgIHsgICAtMzQ1LCAgLTUzNDAsICAgMTAxMiwgLTExOTAgfSwKKyAgICB7ICAtMTY3MiwgIC00OTkyLCAgIDIyODksIC0xMDI5IH0sCisgICAgeyAgLTIxNDYsICAtNTUyOCwgICAzMDM4LCAgLTYzNSB9LAorICAgIHsgICAtMzE2LCAgLTM2NTYsICAgMzQyNiwgLTMxNTIgfSwKKyAgICB7ICAtMjY5NSwgIC01ODEyLCAgIDIzMzYsIC0yMDUwIH0sCisgICAgeyAgLTIwNjcsICAtNjA1MiwgICAgNzM3LCAtMzI1OCB9LAorICAgIHsgIC0yNjY0LCAgLTQyMDUsICAgLTM1MCwgLTEyNjYgfSwKKyAgICB7ICAgLTYxNywgIC01NDA2LCAgICAgODAsIC00ODUzIH0sCisgICAgeyAgLTI0MTgsICAtMzgyNSwgICAxODUzLCAtMTMyNiB9LAorICAgIHsgIC0xOTYxLCAgLTQzMzksICAgIDU4MywgLTQzMTUgfSwKKyAgICB7ICAtMTQ5NSwgIC01MTQxLCAgIC0xMzMsIC01MjA1IH0sCisgICAgeyAgLTMyMDgsICAtNjQ0MCwgICAxNjkxLCAtMjA2OSB9LAorICAgIHsgIC0yNjMyLCAgLTM2MzMsICAgMjMyNSwgLTI3NjEgfSwKKyAgICB7ICAtMjYyNCwgIC01NjcwLCAgIDEyNTIsIC0zNjc2IH0sCisgICAgeyAgLTM2ODcsICAtNTYwOCwgICAgNjg3LCAtMjgzMyB9LAorICAgIHsgIC0zMzIwLCAgLTU3MDcsICAgICAxNiwgLTM4NzcgfSwKKyAgICB7ICAtMjczOCwgIC02MTEyLCAgICAgODQsIC01MTM1IH0sCisgICAgeyAgIDIyNzcsICAtNTY2MSwgICAzMDc2LCAgIDg0MyB9LAorICAgIHsgICAxNTU1LCAgLTU3NjksICAgMjgyMSwgLTUyMzYgfSwKKyAgICB7ICAgIDUzNiwgIC02MzgxLCAgICA2MDMsIC00OTEwIH0sCisgICAgeyAgICA3MzQsICAtNDYwOSwgICAzMzE0LCAtNDA5MiB9LAorICAgIHsgICAxODM2LCAgLTQ1NDcsICAgMzI2NywgLTQzMjIgfSwKKyAgICB7ICAgIC0xMywgIC01OTc2LCAgIDM3NTIsIC0xNjA3IH0sCisgICAgeyAgIDE0MjMsICAtNjMxOCwgICAyMzM2LCAgIDM5OCB9LAorICAgIHsgICAgMzY1LCAgLTc3NzksICAgMTQ5OCwgIC01MzQgfSwKKyAgICB7ICAgMjEwNCwgIC04MzY2LCAgIDI5NDYsIC0xMzQ1IH0sCisgICAgeyAgICAxNDMsICAtNTU0NSwgICAxODk4LCAtMzc1NiB9LAorICAgIHsgICAgNjU1LCAgLTY4NTIsICAgMTQzMCwgICAxNDggfSwKKyAgICB7ICAgICAgNCwgIC02NjUzLCAgIDIzOTcsICAgLTU5IH0sCisgICAgeyAgIDIzNDYsICAtNTk5NiwgICA0NTYyLCAgLTkzNCB9LAorICAgIHsgICAxMjI5LCAgLTcxMDQsICAgMjk2MywgIC01OTggfSwKKyAgICB7ICAgLTUyOCwgIC03MDQ4LCAgIDI4ODcsIC0xNzkwIH0sCisgICAgeyAgIDE0NTEsICAtNjg1NywgICAzOTAwLCAtMTYzNyB9LAorICAgIHsgICAgNTU0LCAgLTYwMTgsICAgMzMzNiwgICAgIDkgfSwKKyAgICB7ICAgMzI3OCwgIC01NzU4LCAgIDQwMzQsICAgMTI5IH0sCisgICAgeyAgIDM1NDEsICAtNzE0NSwgICA0OTA1LCAtMTU3NSB9LAorICAgIHsgICAyMzM5LCAgLTY5MDcsICAgMzQ2NCwgIC0zMDEgfSwKKyAgICB7ICAgMjc3NSwgIC03MzAxLCAgIDE2NjcsIC0zODk0IH0sCisgICAgeyAgICA1MzksICAtNzg4NywgICAgOTkxLCAtNDE1NiB9LAorICAgIHsgICAyMTE1LCAgLTc0MjEsICAgMzEzMSwgLTMwNzUgfSwKKyAgICB7ICAgMjgwMywgIC04NTQ2LCAgIDI1NjQsIC01ODM2IH0sCisgICAgeyAgIDI4NjksICAtNTgzMywgICAxNjIwLCAtNDU2MSB9LAorICAgIHsgICAyNTkxLCAgLTcyODEsICAgMzIxNSwgLTQ3MTkgfSwKKyAgICB7ICAtMTIyOCwgIC04NDc3LCAgICA3MDYsIC00NzgyIH0sCisgICAgeyAgIDE5NjcsICAtNTI0MywgICA0ODEzLCAtMTk0MCB9LAorICAgIHsgICAgNzAxLCAgLTcwMTAsICAgMjI3MywgLTM4OTMgfSwKKyAgICB7ICAgIDkxNSwgIC04NDcwLCAgIDE5MTgsIC01NjIwIH0sCisgICAgeyAgICAtOTQsICAtNjcxNSwgICAgMTU2LCAtMzg3MyB9LAorICAgIHsgICAxMDc0LCAgLTU2MDcsICAgNDM4OSwgLTEwMTcgfSwKKyAgICB7ICAgMjczOSwgIC02NTUxLCAgIDEyMjcsIC0zNTIxIH0sCisgICAgeyAgICA3MjUsICAtNzgzNSwgICAyNzAxLCAtMTI5MSB9LAorICAgIHsgICAtNDkzLCAgLTc0NzUsICAgMjI2MywgLTEwNzUgfSwKKyAgICB7ICAgLTQxMiwgIC02NTA4LCAgIDI5ODQsICAtNzQ0IH0sCisgICAgeyAgICA2NjUsICAtNTQ1MSwgICAzNzI1LCAtMjY5MiB9LAorICAgIHsgICAxNDk5LCAgLTgxMjksICAgMzU2NCwgLTIwNzIgfSwKKyAgICB7ICAgMjg3MCwgIC02MzMzLCAgIDQ0ODcsIC0yMTA4IH0sCisgICAgeyAgICA3MDYsICAtNTAwNywgICAzOTExLCAgLTE1MiB9LAorICAgIHsgICAtNDgyLCAgLTg2NjAsICAgMTQ4MywgLTI5MDAgfSwKKyAgICB7ICAgMjQ4MSwgIC02NTk2LCAgIDI1MTgsIC0xNzE1IH0sCisgICAgeyAgIDE0MDMsICAtNjQxNCwgICAxMzk4LCAtNTM4NyB9LAorICAgIHsgICAgNjUyLCAgLTYyNjcsICAgIDU4MywgLTU5NDIgfSwKKyAgICB7ICAgIDY5NCwgIC03NTQwLCAgICA2NDYsIC02MjcyIH0sCisgICAgeyAgIDIyNzUsICAtNzYxNCwgICAgMjU2LCAtNTAxNSB9LAorICAgIHsgICAxNDE2LCAgLTk3MjcsICAgMTkwMCwgLTMxNTMgfSwKKyAgICB7ICAgMjc2MCwgIC02NDMzLCAgIDM4NzUsIC0zNzcxIH0sCisgICAgeyAgIDIzMjUsIC0xMTE5NiwgICAyMTgyLCAtNTE1NSB9LAorICAgIHsgICAxMjIzLCAtMTEwNjEsICAgMTM3NywgLTUwOTcgfSwKKyAgICB7ICAgIDEwOCwgLTEwNjAzLCAgICAzMDcsIC00OTUyIH0sCisgICAgeyAgIC0xMTgsICAtODI2OCwgICAxNjUwLCAtMTU3MiB9LAorICAgIHsgICAxODM5LCAgLTc5NDMsICAgMTc1NSwgIC02MTIgfSwKKyAgICB7ICAgMjUwMSwgIC05MDU2LCAgICA5ODEsIC0yOTY5IH0sCisgICAgeyAgIDI5MDIsICAtODQ3NiwgICAxNDkxLCAtNTc4MCB9LAorICAgIHsgICAxOTk1LCAtMTExNzUsICAgMTU4NSwgLTM2NDMgfSwKKyAgICB7ICAgIDY5NiwgIC04MjEyLCAgICA4MjgsIC0yNDc0IH0sCisgICAgeyAgIDE1MjYsICAtODY0OSwgICAxMzgwLCAtMTIxMCB9LAorICAgIHsgICAgNDYxLCAgLTcyNTMsICAgMzIyMiwgLTIyMjkgfSwKKyAgICB7ICAgMjk2NiwgIC04NjQxLCAgIDQxMjEsIC0zMjcxIH0sCisgICAgeyAgICA4MzMsICAtNjAzOSwgICAyMzYxLCAtMTA4NiB9LAorICAgIHsgICAzNTY1LCAgLTczMTIsICAgMTk4MCwgLTU0MjcgfSwKKyAgICB7ICAgMjg1MCwgIC04NjcxLCAgIDM3NjAsIC0xODQ2IH0sCisgICAgeyAgIDI2NDMsICAtNzI4MSwgICAyMTYzLCAgLTE3MyB9LAorICAgIHsgICAzNDYzLCAgLTM3MDYsICAtMzEzMiwgIC05MjMgfSwKKyAgICB7ICAgMTMxNSwgIC0zODI1LCAgLTM0NDMsICAgICAyIH0sCisgICAgeyAgIDI1OTQsICAtNDA4MywgIC0zODE1LCAgIDY3MCB9LAorICAgIHsgICAxODI2LCAgLTQyOTEsICAtMjc0MSwgIC0xNTUgfSwKKyAgICB7ICAgIDg2OCwgIC0zNzQ5LCAgLTQxNzUsICAtMjk4IH0sCisgICAgeyAgIDIwMDgsICAtNDIzNywgIC0zODk3LCAgLTUxNyB9LAorICAgIHsgICAxMjQyLCAgLTM0OTMsICAtNDMzNSwgLTEzMzUgfSwKKyAgICB7ICAgIC04OCwgIC00MTQyLCAgLTMzOTAsIC0xNTI5IH0sCisgICAgeyAgIDIxNzYsICAtMzQ4OCwgIC0zODIyLCAgLTk3NSB9LAorICAgIHsgICAxNzA2LCAgLTUxODgsICAtMzQxNSwgIC02MzcgfSwKKyAgICB7ICAgMjcxNywgIC02MTU5LCAgLTIzMzMsICAtODgyIH0sCisgICAgeyAgIDEyNzYsICAtMzk3OCwgIC00MzYxLCAgIDUzNyB9LAorICAgIHsgICAyNDcxLCAgLTU1NTYsICAtMjg2NiwgIC0yMDggfSwKKyAgICB7ICAgIDc5OSwgIC00NjczLCAgLTQwODYsICAgIDU2IH0sCisgICAgeyAgIDE5MDEsICAtNDc4NiwgIC0zNTMzLCAgIDI3MCB9LAorICAgIHsgICAzMDM2LCAgLTM5MDIsICAtMzYwNiwgIC0zMzMgfSwKKyAgICB7ICAgMjI0OSwgIC0zMzE3LCAgLTQzMTksICAtMTQ0IH0sCisgICAgeyAgIDI1OTQsICAtNDIwNywgIC0yMTA1LCAtMjkzMCB9LAorICAgIHsgICA0MDA4LCAgLTQ3NzQsICAtMjYyNiwgIC05MDIgfSwKKyAgICB7ICAgMTAzOCwgIC0zNjU5LCAgLTM0OTYsIC0yNDU0IH0sCisgICAgeyAgIDI3MjUsICAtMzU5NywgIC0zMjk4LCAtMTUzNSB9LAorICAgIHsgICAxNjYyLCAgLTU4MDMsICAtMjgxMywgICAxNzUgfSwKKyAgICB7ICAgIDcwNSwgIC0zNzU3LCAgLTM0NDEsIC0xNDg0IH0sCisgICAgeyAgIDE4NjAsICAtNTk4NywgIC0yODIxLCAgLTg4NiB9LAorICAgIHsgICAzNzg2LCAgLTQ5MTgsICAtMjE5OSwgLTE5MjkgfSwKKyAgICB7ICAgMzY4MywgIC00MjM1LCAgLTI1NDcsIC0xMjg3IH0sCisgICAgeyAgIDI1MzEsICAtNDg5NiwgIC0yOTU2LCAtMTU5MyB9LAorICAgIHsgICAxMDA1LCAgLTU1ODUsICAtMzMyNCwgIC0xODAgfSwKKyAgICB7ICAgMTYyNSwgIC01MjI5LCAgLTE3NTYsIC0zNjQyIH0sCisgICAgeyAgIDE0OTQsICAtNTA0MSwgIC0yOTg5LCAtMjY4NSB9LAorICAgIHsgICAyNzE4LCAgLTQ2NTUsICAtMzIyNCwgIC04NjcgfSwKKyAgICB7ICAgMjM3NCwgIC02NjQwLCAgLTE3NDUsIC0yOTc1IH0sCisgICAgeyAgIDIxMzMsICAtNjQzNiwgIC0yNDc3LCAtMTQ5OSB9LAorICAgIHsgICAxODMzLCAgLTQ0MTgsICAtMzUyMywgLTE1MTIgfSwKKyAgICB7ICAgMTEyOCwgIC00OTEwLCAgLTI2NTgsIC0xMTA2IH0sCisgICAgeyAgICA2ODksICAtNDc3NywgIC0yODMxLCAtMjA4NSB9LAorICAgIHsgICAzNTkzLCAgLTUyODAsICAtMjYyNywgIC0zMTUgfSwKKyAgICB7ICAgMzI2NCwgIC0zNzcxLCAgLTI2NzMsIC0xODYxIH0sCisgICAgeyAgIDMyMDIsICAtNTYwMiwgIC0yNDA5LCAgIDQwMiB9LAorICAgIHsgICAgNTUyLCAgLTQ2MTgsICAtMjIyMSwgLTMwMDIgfSwKKyAgICB7ICAgMzA5NSwgIC01MzU2LCAgLTI2NjYsIC0xMDgzIH0sCisgICAgeyAgIDM0MDEsICAtNDYwOSwgIC0zMTQ2LCAgICA0NSB9LAorICAgIHsgICAzMDUxLCAgLTQ2NjIsICAtMjE5MiwgLTIyMzIgfSwKKyAgICB7ICAgMjc5OCwgIC01NTUyLCAgLTI0NjIsIC0xOTQxIH0sCisgICAgeyAgIDIzNTQsICAtNTgxNSwgIC0yMjIzLCAtMjYxOSB9LAorICAgIHsgICAgMTkyLCAgLTM3MDgsICAtMjgwNywgLTI2NTggfSwKKyAgICB7ICAgMTg4NiwgIC00MjI2LCAgLTE4NjIsIC0zNTI5IH0sCisgICAgeyAgIDI1MjYsICAtMzk3NiwgIC0yODE5LCAtMjMzMiB9LAorICAgIHsgICAxNTc3LCAgLTM4NzAsICAtMjcxMSwgLTI4MDYgfSwKKyAgICB7ICAgMTI4OCwgIC01NTg4LCAgLTMzODIsIC0xNDAzIH0sCisgICAgeyAgIDI3MTEsICAtNTM5OSwgIC0xNTY0LCAtMzI1MyB9LAorICAgIHsgICAxNDU5LCAgLTU0OTIsICAtMjIyMiwgIC0zMjIgfSwKKyAgICB7ICAgMjgyMywgIC01MDkxLCAgLTI4ODYsICAgNzc2IH0sCisgICAgeyAgIDM1NTksICAtNTgyMSwgIC0yMTA5LCAtMTM2MCB9LAorICAgIHsgICAxNTg3LCAgLTYzMzEsICAtMjc2MCwgLTE5MDkgfSwKKyAgICB7ICAgMjEzOSwgIC01MjEzLCAgLTI4NzQsIC0yMTIwIH0sCisgICAgeyAgIDEzMTgsICAtNDMzNywgIC0zNjk1LCAtMjA5OCB9LAorICAgIHsgICAgODIxLCAgLTQ0NzEsICAtMTg0OSwgIC01NjUgfSwKKyAgICB7ICAgMzMyOSwgIC00NzgyLCAgLTE3MjUsICAgLTg5IH0sCisgICAgeyAgICA1ODIsICAtNDkxNCwgIC00MTA1LCAtMTExOSB9LAorICAgIHsgICAgNDE3LCAgLTQxNDQsICAtNDA3MiwgLTI1MjkgfSwKKyAgICB7ICAgLTE5OSwgIC0zODAzLCAgLTI3NjUsIC00MDQyIH0sCisgICAgeyAgIDI3MzEsICAtNDI4MywgIC0yMTQzLCAgICAgMSB9LAorICAgIHsgICAyOTExLCAgLTYxODcsICAtMTk1MSwgLTIxMTYgfSwKKyAgICB7ICAgMTU3MywgIC02MDk0LCAgIC00OTMsIC0yODM4IH0sCisgICAgeyAgIDIwODEsICAtNjkyNywgICAtODY0LCAtMzIxMSB9LAorICAgIHsgICAxMDU4LCAgLTc4MjYsICAgICA3OSwgIC0zNjQgfSwKKyAgICB7ICAgMzE0NywgIC01NTcwLCAgIC02ODQsICAtOTc4IH0sCisgICAgeyAgIDM1NzIsICAtNTg1NiwgICAxMDYwLCAgMTgyNCB9LAorICAgIHsgICAxMTQzLCAgLTY3MDIsICAtMTQ3OCwgICAzMzggfSwKKyAgICB7ICAgMjM0MSwgIC03MjIwLCAgICAtODgsICAgMjYwIH0sCisgICAgeyAgIDM2MzksICAtNjg2MSwgICAgNjY4LCAgIDgxNSB9LAorICAgIHsgICAyMjI3LCAgLTYyNjgsICAtMTcwNiwgICA0NDYgfSwKKyAgICB7ICAgMzM5MCwgIC02MDgyLCAgIC0zNTMsICAxMzAyIH0sCisgICAgeyAgIDExMjMsICAtNzU1NiwgIC0xMjM3LCAgLTQzMCB9LAorICAgIHsgICAxNzI5LCAgLTc3NDIsICAgIDcyOSwgIC0yMTggfSwKKyAgICB7ICAgMTQ1NywgIC02Nzc0LCAgICA1ODcsICAgNTc5IH0sCisgICAgeyAgICA1MDUsICAtNjkxOSwgICAtNTY5LCAgIDM3MSB9LAorICAgIHsgICAxMTA2LCAgLTcyNDUsICAgICA3OCwgICAxNTggfSwKKyAgICB7ICAgMjc1NSwgIC02NzQ1LCAgLTExMjIsICAgMzM4IH0sCisgICAgeyAgIDMwNjksICAtNjA0MCwgIC0xNDE1LCAgIDk4NiB9LAorICAgIHsgICAyMTc0LCAgLTcwNjQsICAtMTQzMCwgIC0yODMgfSwKKyAgICB7ICAgMTM5MCwgIC04NjI2LCAgIC00NDYsIC0zMDMxIH0sCisgICAgeyAgIDM1MzQsICAtNjg5MCwgICAtNDMxLCAgIDU0NyB9LAorICAgIHsgICAyMjY3LCAgLTk2MTgsICAgIDQ3NSwgLTI5OTQgfSwKKyAgICB7ICAgMzY3MiwgIC03NjczLCAgICAgNzUsICAtMTE1IH0sCisgICAgeyAgIDIxMzEsICAtNzU2MCwgIC0xMjA2LCAgLTc1MCB9LAorICAgIHsgICAyOTcyLCAgLTc0NzcsICAgLTY4NSwgIC0yNjIgfSwKKyAgICB7ICAgMTYwNCwgIC02NjM3LCAgIC02NzIsICAgNjk5IH0sCisgICAgeyAgIDE2NjYsICAtNzU3NywgICAtNTc3LCAgLTI0MCB9LAorICAgIHsgICAxNTkxLCAgLTY1NTQsICAtMjE1OCwgICAtOTQgfSwKKyAgICB7ICAgMjM0OCwgIC02Mjg2LCAgIC0zNTMsICAxMTIzIH0sCisgICAgeyAgIDIwMTcsICAtODgxMCwgICAtNDEyLCAtMTgwNSB9LAorICAgIHsgICAyODkyLCAgLTY3MTMsICAtMTc2NSwgIC01NTQgfSwKKyAgICB7ICAgMjUwMCwgIC02ODI4LCAgLTE5OTUsIC0xMTk3IH0sCisgICAgeyAgIDM4NzcsICAtNjYzOSwgICAtMjI0LCAtMTY1NSB9LAorICAgIHsgICAyMzkyLCAgLTc4NzIsICAgIC05MSwgIC0zMzMgfSwKKyAgICB7ICAgMzU2MiwgIC03MzcwLCAgIC01MzIsIC0yODM2IH0sCisgICAgeyAgIDI1NTIsICAtNzYxNCwgICAgMTY0LCAtMTgwNSB9LAorICAgIHsgICAgOTkwLCAgLTYxMDQsICAgIDIxOCwgICA0MzggfSwKKyAgICB7ICAgIDkxMCwgIC03ODYxLCAgICAzMTIsIC0xMTk1IH0sCisgICAgeyAgIDE0NzIsICAtNjMyNywgICAgMzcyLCAgLTY0MCB9LAorICAgIHsgICAxNTc2LCAgLTcxNDMsICAtMTk4MywgIC04NDMgfSwKKyAgICB7ICAgIDQyMiwgIC03NjI1LCAgIC00NTcsICAtMjc4IH0sCisgICAgeyAgIDE3OTcsICAtODUzMiwgICAgNDA1LCAtMTAxMSB9LAorICAgIHsgICAxMDg4LCAgLTczOTYsICAgLTIzOCwgLTIyNzcgfSwKKyAgICB7ICAgMzIwOSwgIC02NzUzLCAgLTE0MzEsIC0yMDcyIH0sCisgICAgeyAgIDI2MTcsICAtNjgzOSwgICAgMTAwLCAtMjU3MyB9LAorICAgIHsgICAyNTc1LCAgLTg1NzMsICAgLTM4NywgLTMxODggfSwKKyAgICB7ICAgMzYxOCwgIC02OTcxLCAgLTExOTAsICAtMzIxIH0sCisgICAgeyAgIDIyMDUsICAtNzM2MSwgIC0xNjk1LCAtMjAwOCB9LAorICAgIHsgICAyOTg1LCAgLTYyOTcsICAgMTQ2NCwgIDExNzkgfSwKKyAgICB7ICAgMjgwNCwgIC03MzEwLCAgIDEwNTMsICAgMzM4IH0sCisgICAgeyAgIDEzNjIsICAtNjA3NCwgIC0xMTYzLCAgLTg0MCB9LAorICAgIHsgICAzMzM2LCAgLTYzMjUsICAtMTc5NCwgICAgMjEgfSwKKyAgICB7ICAgMjgzNiwgIC04MTA5LCAgICA4MTgsICAtMzI5IH0sCisgICAgeyAgIDI3OTEsICAtNTg3OSwgICAgNTYwLCAgMTU0NiB9LAorICAgIHsgICAyMzkyLCAgLTYwNjQsICAgIDEzNSwgICAxMDAgfSwKKyAgICB7ICAgMTgzOCwgIC02MTk0LCAgICA1OTYsICAxMDg1IH0sCisgICAgeyAgIDE5MjYsICAtNzUxNSwgICAtNDE0LCAtNDkwMSB9LAorICAgIHsgICAzMjI1LCAgLTcyOTgsICAtMTIwMiwgLTExODkgfSwKKyAgICB7ICAgMzk2MCwgIC03NTU4LCAgIC02NTksICAtNzE5IH0sCisgICAgeyAgIDM0NDIsICAtNjY0NywgIC0xNjkyLCAtMTA5NSB9LAorICAgIHsgICAzMzgxLCAgLTY0NDEsICAgIDI2MiwgIC04ODYgfSwKKyAgICB7ICAgMTQzMSwgIC04MTUwLCAgLTExODYsIC0xNDA2IH0sCisgICAgeyAgICAzNDAsICAtODQ5OCwgICAtMTUwLCAgLTg5OSB9LAorICAgIHsgICAzMDA0LCAgLTgxNDksICAgLTI2MCwgIC05NTMgfSwKKyAgICB7ICAgMjc0OSwgIC02NjExLCAgICA1NjMsICAgODczIH0sCisgICAgeyAgLTY2NDcsICAtMTMyNSwgIC00NTE3LCAtNDY5MSB9LAorICAgIHsgIC02MDA1LCAgLTE2NTcsICAtNDA4OSwgLTM3OTcgfSwKKyAgICB7ICAtMzE1NywgICAgNTg4LCAgLTUyMTMsIC0zMDY4IH0sCisgICAgeyAgLTMzMTEsICAtMTQyNSwgIC02MzI5LCAtMzcyNiB9LAorICAgIHsgIC01ODY2LCAgIC04MTksICAtMzg1NywgLTI3NDQgfSwKKyAgICB7ICAtNTAwMSwgIC0xNzk5LCAgLTEwNzUsIC00NjIxIH0sCisgICAgeyAgLTUzMzAsICAtMjY1MCwgIC0yNjcyLCAtNDY2NCB9LAorICAgIHsgIC00OTMwLCAgIC01MzksICAtMjM2MywgLTQwMTAgfSwKKyAgICB7ICAtMjk4NCwgICAgIDEwLCAgLTM4NjMsIC01NzQ5IH0sCisgICAgeyAgLTEwNTUsICAtMjEwNiwgIC0zNzEzLCAtNDI2NyB9LAorICAgIHsgIC01NDc2LCAgIC01MDIsICAtNDI3OSwgLTY1MDQgfSwKKyAgICB7ICAtNTIzMSwgIC0xNTQzLCAgLTUwMTgsIC02NDI1IH0sCisgICAgeyAgLTUxMzQsICAgLTM2MywgIC0zMTY1LCAtNTEwOSB9LAorICAgIHsgIC0zOTUzLCAgIC03NzEsICAtNDEwNywgLTYzOTMgfSwKKyAgICB7ICAtMjE1OSwgICAtNTYzLCAgLTM2NTIsIC01MzQyIH0sCisgICAgeyAgLTM4ODgsICAtMjMyMSwgICAtOTE5LCAtNTA1NyB9LAorICAgIHsgIC0xMjM2LCAgIC01OTcsICAtNDIzNSwgLTQxOTMgfSwKKyAgICB7ICAtNDA1MywgICAgNjc1LCAgLTMwODMsIC02MTc0IH0sCisgICAgeyAgLTI3OTMsICAtMTA4OSwgIC01Mzk2LCAtMzQ2MCB9LAorICAgIHsgIC0zMDAwLCAgICAtNDQsICAtMjIwOSwgLTY1NzUgfSwKKyAgICB7ICAtMzMzNiwgIC0xNTMxLCAgLTQzMTMsIC01MTYwIH0sCisgICAgeyAgLTIxMjcsICAgIDEyOCwgIC00ODUxLCAtMzY5MiB9LAorICAgIHsgIC0zMzIxLCAgICAxMzYsICAtMjA2NywgLTU2NjAgfSwKKyAgICB7ICAtNTIxNSwgICAxNDA0LCAgLTQzNzQsIC00MzU2IH0sCisgICAgeyAgLTI3NDcsICAgIDQwMCwgIC02MzQwLCAtMzY5MSB9LAorICAgIHsgIC0zOTI2LCAgIC01OTksICAtNTM2MSwgLTUwMDYgfSwKKyAgICB7ICAtMjg3NSwgIC0yNTkyLCAgLTUxNDMsIC00MDkyIH0sCisgICAgeyAgLTQ5OTEsICAtMTk1OCwgIC01MzIyLCAtNDg5MSB9LAorICAgIHsgIC00OTY1LCAgLTEzMTgsICAtNjY1MiwgLTUzMzMgfSwKKyAgICB7ICAtNDkyMCwgIC0xNjkxLCAgLTMzODgsIC01NTYxIH0sCisgICAgeyAgLTM2NDQsICAtMzM1NCwgIC0yNjg4LCAtNTk4MiB9LAorICAgIHsgIC01MDc2LCAgIC05MTksICAtNDU2MywgLTI5ODQgfSwKKyAgICB7ICAtNjExNCwgICAgMjUwLCAgLTM4ODQsIC0zOTE1IH0sCisgICAgeyAgLTQwMTQsICAgIDc0NCwgIC0zOTczLCAtMTkyNCB9LAorICAgIHsgIC01NTQzLCAgLTEwNDEsICAtNTU1NywgLTM4NDcgfSwKKyAgICB7ICAtNDcxMSwgIC0xMzUyLCAgLTU2NDksIC0yNjAzIH0sCisgICAgeyAgLTMzNjIsICAgIDc3NSwgIC01MzA1LCAtNDg3OSB9LAorICAgIHsgIC01MDAxLCAgICAxMDcsICAtMzU1NCwgLTI4ODggfSwKKyAgICB7ICAtNjI1OCwgIC0xNjUxLCAgLTYzNTYsIC02NTY2IH0sCisgICAgeyAgLTQ1MjksICAgIDQwNywgIC01MDAzLCAtMzg2NSB9LAorICAgIHsgIC01MTU0LCAgICA1NTAsICAtNTI3OCwgLTU0NjUgfSwKKyAgICB7ICAtNDE5NSwgICAtNDY3LCAgLTE4OTQsIC0zMTI5IH0sCisgICAgeyAgLTUwMjIsICAgMTEyNywgIC0zMzQ5LCAtMzMxNCB9LAorICAgIHsgIC02MDc1LCAgIDEyNTAsICAtNDMxMywgLTU2NDEgfSwKKyAgICB7ICAtMjY3NywgIC0yMjgzLCAgLTIzMTIsIC01OTAzIH0sCisgICAgeyAgLTQxMTMsICAgIDE5MywgIC0xMTk1LCAtNDgzMyB9LAorICAgIHsgIC0zOTQwLCAgLTEwNDgsICAtMTM4OSwgLTUwNzkgfSwKKyAgICB7ICAtMzcwMywgICAgOTE3LCAgLTQwNDMsIC00NDUxIH0sCisgICAgeyAgLTMzNjYsICAtNDIzMSwgIC0xNTM0LCAtNTQ4OCB9LAorICAgIHsgIC0zMzI2LCAgLTM1ODMsICAtMjA5MSwgLTQ5MDMgfSwKKyAgICB7ICAtNTE0NCwgICAxMjU0LCAgLTI1MzIsIC00OTQ5IH0sCisgICAgeyAgLTU5ODIsICAgLTg3MCwgIC0yNTQ1LCAtNDU1NSB9LAorICAgIHsgIC0zOTI1LCAgIC0xNTcsICAtNTM2NywgLTIyODEgfSwKKyAgICB7ICAtNjQxOSwgICAtNzQ2LCAgLTU2NjgsIC00MzcxIH0sCisgICAgeyAgLTU3ODcsICAgIDUxOCwgIC03MDk2LCAtNTgwNSB9LAorICAgIHsgIC00MjU4LCAgICA5NTQsICAtNjQ1MywgLTQzMjEgfSwKKyAgICB7ICAtNDc3MSwgICAtNjk1LCAgLTQxNTgsIC0xNjM5IH0sCisgICAgeyAgLTcwNzgsICAgLTc2MCwgIC01MTk1LCAtNTg3NyB9LAorICAgIHsgIC03MzQ4LCAgICAgODMsICAtNDEwMSwgLTQ1ODYgfSwKKyAgICB7ICAtMjQzMCwgICAgMTg0LCAgLTI4NzQsIC0xNjc5IH0sCisgICAgeyAgLTIyODQsICAtMzk0MywgIC0yOTI0LCAtNTAzNCB9LAorICAgIHsgIC0xODA0LCAgLTE3ODUsICAtMzAwMiwgLTQ3MTAgfSwKKyAgICB7ICAtNDM5OSwgIC0yNzcyLCAgLTE4MTUsIC00NjM3IH0sCisgICAgeyAgLTYzNDAsICAtMjYyNiwgIC0yODI0LCAtNTE5MSB9LAorICAgIHsgIC00OTk4LCAgLTUxNjgsICAtMzQ4MCwgIDE5MDUgfSwKKyAgICB7ICAtMzk1OCwgIC01NDkyLCAgLTE1OTksICAxNTc5IH0sCisgICAgeyAgLTI0NzEsICAtMzc1NSwgICAtMjc2LCAgMzE4MiB9LAorICAgIHsgIC0zMDMzLCAgLTU3NzksICAtMTA2MywgIDE1NTQgfSwKKyAgICB7ICAtMjkzNiwgIC00ODI5LCAgLTEyOTAsICAyMzg2IH0sCisgICAgeyAgLTE4MzUsICAtNTA3MywgIC0zMDUxLCAgMTI5OSB9LAorICAgIHsgIC0xNzI0LCAgLTM3NzEsICAtMzkzNSwgIDIzMjQgfSwKKyAgICB7ICAtNTA3MCwgIC0yNTUwLCAgLTM2OTIsICAgNzY4IH0sCisgICAgeyAgLTQzMjYsICAtNTMzMywgICAtMjk3LCAgMTg3OCB9LAorICAgIHsgIC0zNDcyLCAgLTU2MTksICAtMzA5NCwgICA5OTIgfSwKKyAgICB7ICAtMzAyNywgIC00Mzg0LCAgLTMwMzgsICAyMjY1IH0sCisgICAgeyAgLTMyMDEsICAtNTMzMiwgICAgIDY3LCAgMjIwMCB9LAorICAgIHsgIC0xNjgxLCAgLTQzNzMsICAtMTk0NywgIDI0NjEgfSwKKyAgICB7ICAtMzIyMSwgIC0zMzI5LCAgLTQyMzgsICAyNTY0IH0sCisgICAgeyAgLTEyNjIsICAtMjk2OCwgIC0yOTE1LCAgMzIyNyB9LAorICAgIHsgIC0zNDE5LCAgLTE4NzgsICAtMzM3MywgIDIxMTAgfSwKKyAgICB7ICAtMjI0NCwgIC01NTgzLCAgLTIwMTIsICAxMjg4IH0sCisgICAgeyAgLTE5NzEsICAtNTI2NiwgICAtOTkwLCAgMTgxMiB9LAorICAgIHsgIC0yOTc1LCAgLTI3NzgsICAgLTQ1MiwgIDQwNjMgfSwKKyAgICB7ICAtMjE5OCwgIC0xMTY1LCAgLTMyOTgsICAyOTY1IH0sCisgICAgeyAgLTQ3ODIsICAtNDg5NCwgIC00NzY3LCAgIDY2NCB9LAorICAgIHsgIC02MDAyLCAgLTM5NTAsICAtMjgwNiwgIDIwMjUgfSwKKyAgICB7ICAtMzE0MiwgIC0zMTYyLCAgLTI4NTksICAzMjk1IH0sCisgICAgeyAgLTMyNjIsICAtMzM0MCwgIC00MTIzLCAgMTU5NiB9LAorICAgIHsgIC00MDE0LCAgLTM5MTgsICAtMTk1NSwgIDMzNjEgfSwKKyAgICB7ICAtMTcwMCwgIC0zNDYzLCAgLTEzNDYsICAzNDQ5IH0sCisgICAgeyAgLTQyNDUsICAtNDQ0NSwgIC00NzQzLCAgMTY0NCB9LAorICAgIHsgIC00MTgwLCAgLTM5NjksICAgLTQwMSwgIDMyODEgfSwKKyAgICB7ICAtMjc4MiwgIC01MjQwLCAgLTQxMTcsICAxMTU2IH0sCisgICAgeyAgLTU3NDQsICAtNDA0MCwgIC0xNDM5LCAgMzQ3MCB9LAorICAgIHsgIC01MDYzLCAgLTQ2NjMsICAgLTMyMywgIDMxNzIgfSwKKyAgICB7ICAtNDUzMSwgIC0zMzE5LCAgIC04NDQsICAzOTg4IH0sCisgICAgeyAgLTYyMjYsICAtNTEyNSwgIC0yMDY0LCAgMjk3NiB9LAorICAgIHsgIC0zMTE1LCAgLTMyNjcsICAtMTUzMSwgIDM4OTggfSwKKyAgICB7ICAtNDYyOCwgIC00NDIxLCAgLTI4NjQsICAyODA4IH0sCisgICAgeyAgLTQ1NTksICAtMjk4OSwgIC0zNDQyLCAgMjAyNCB9LAorICAgIHsgIC0xNzc1LCAgLTQ0ODcsICAgLTY1NiwgIDI0NzcgfSwKKyAgICB7ICAtMjY2NCwgIC0xODY1LCAgLTE4ODQsICA0MDgxIH0sCisgICAgeyAgLTE4MjgsICAtMjU3NSwgIC0zODk0LCAgMzM3OCB9LAorICAgIHsgIC02NDQxLCAgLTM2NzcsICAtMjAyNSwgIDE2NzcgfSwKKyAgICB7ICAtNDE0MSwgIC0yMTU2LCAgLTExOTEsICAzNDc0IH0sCisgICAgeyAgLTQ4MDIsICAtMTYyMywgIC0xNzI3LCAgMjE2MCB9LAorICAgIHsgIC01NDc0LCAgLTI3NDUsICAtMTQ3NSwgIDI0OTggfSwKKyAgICB7ICAtMzY2NCwgIC0xMDU2LCAgLTE5NzUsICAyNDkxIH0sCisgICAgeyAgLTQ2NzIsICAtMzA2MiwgIC0yMjM1LCAgMjkzMyB9LAorICAgIHsgIC00MjA1LCAgLTU5NjAsICAtMjg0OSwgIDE1MTcgfSwKKyAgICB7ICAtNDk5NSwgIC01NzA4LCAgLTE3MzksICAxODA1IH0sCisgICAgeyAgLTQ4OTIsICAtNjA4MCwgIC00NzkzLCAgIDg3MiB9LAorICAgIHsgIC00MjcwLCAgLTQxNzIsICAtNDI2MywgIDIxODUgfSwKKyAgICB7ICAtNDY4NywgIC0xNDcwLCAgLTI5MDUsICAxMDIzIH0sCisgICAgeyAgLTY0NDYsICAtNTAxNywgIC0zOTE5LCAgMTAwMCB9LAorICAgIHsgIC02MDQ2LCAgLTU1MzgsICAtMzk0MywgIDIwMDYgfSwKKyAgICB7ICAtNjAyOCwgIC0zNzUwLCAgLTM5NTMsICAgNzcxIH0sCisgICAgeyAgLTU5NTksICAtNDU4MiwgIC01MDI0LCAgIDgyNCB9LAorICAgIHsgIC01ODE4LCAgLTI1NzYsICAtMjI0OSwgIDEzMjYgfSwKKyAgICB7ICAtNTY1OSwgIC01MzQ1LCAgLTExMTksICAyNTAwIH0sCisgICAgeyAgLTMzNDYsICAtNDE1NSwgICAgNjA2LCAgMjc0OSB9LAorICAgIHsgIC01NjgwLCAgLTQ4MjcsICAtMjUwMSwgIDE4MzggfSwKKyAgICB7ICAtNjE5MywgIC0yNTQzLCAgLTEyOTUsICAgODQwIH0sCisgICAgeyAgLTY4NzEsICAtNDkyNSwgIC0zNTEyLCAgMTgwMSB9LAorICAgIHsgIC01NjA1LCAgLTE3ODgsICAtMTg5NSwgICA3NzkgfSwKKyAgICB7ICAtMzkyMiwgIC01NzEyLCAgLTQ2NDQsICAgNTEwIH0sCisgICAgeyAgLTQ3NDUsICAtMzg2OSwgIC00NTMzLCAgICA5OSB9LAorICAgIHsgIC0yOTg0LCAgLTQ5MDcsICAgLTM5OSwgIDE0OTcgfSwKKyAgICB7ICAgMTg0NywgICAtNDc4LCAgIDMwNjEsIC01ODEyIH0sCisgICAgeyAgIDQ0NTAsICAtMTExNiwgICAzNjA5LCAtNjU3MCB9LAorICAgIHsgICAzMTM5LCAgICAgOTksICAgMzAwNywgLTU1MzIgfSwKKyAgICB7ICAgMjU5MCwgIC0zNzgyLCAgIDMxMzgsIC00NzcwIH0sCisgICAgeyAgIDE4ODEsICAgMTIwNCwgICA1Nzc4LCAtMzQwNCB9LAorICAgIHsgICAzNjMxLCAgIDIwNjAsICAgNTU2NiwgLTUwMzggfSwKKyAgICB7ICAgMzQ2MSwgICAxOTYxLCAgIDUxNjcsIC0zODAwIH0sCisgICAgeyAgIDI5NDcsICAgIDI3MywgICA0NTM2LCAtNDM4OSB9LAorICAgIHsgICA0NDUzLCAgLTE3MzAsICAgNTc4OCwgLTQzNzAgfSwKKyAgICB7ICAgNDAzMiwgICAxODA1LCAgIDI2NjYsIC00NTM0IH0sCisgICAgeyAgIDM0ODcsICAgLTk0NCwgICAyMzEzLCAtNjAyOCB9LAorICAgIHsgICAxMzEzLCAgICAgMzQsICAgNDIxMCwgLTQwNjcgfSwKKyAgICB7ICAgNTYzMiwgIC0xNTAyLCAgIDU4MjUsIC01ODU1IH0sCisgICAgeyAgIDc3MzYsICAgLTU0NywgICA0ODc5LCAtNTQ3NiB9LAorICAgIHsgICA0OTA2LCAgLTE1MTIsICAgNDc2MCwgLTU3NjAgfSwKKyAgICB7ICAgMzg0MywgICAgNDQ3LCAgIDEwOTEsIC00OTU4IH0sCisgICAgeyAgIDI5ODIsICAtMTEzNSwgICA1NDQyLCAtNDM4NiB9LAorICAgIHsgICAzNTc5LCAgICAyNzEsICAgMzAzMSwgLTY3NzAgfSwKKyAgICB7ICAgMzkzMiwgICAtMjExLCAgIDQ2ODgsIC01NTA3IH0sCisgICAgeyAgIDQ0MTEsICAgMTcyMCwgICAyMzg3LCAtNTU4NCB9LAorICAgIHsgICA1Mzc5LCAgIC00NzksICAgNDU3NSwgLTYyODAgfSwKKyAgICB7ICAgMzYxMywgICAtMzYyLCAgIDIwMTIsIC00ODg1IH0sCisgICAgeyAgIDM3NDQsICAtMjAxMywgICA0NDkzLCAtNTA3MyB9LAorICAgIHsgICA1NjkzLCAgICAxMDksICAgNDM3OSwgLTMzNjIgfSwKKyAgICB7ICAgNTQ3NSwgICAtNjIxLCAgIDUzMTcsIC0zOTg1IH0sCisgICAgeyAgIDY0MTEsICAgLTY3MywgICA1NzA4LCAtNDc1MiB9LAorICAgIHsgICA0OTMzLCAgIC03OTYsICAgNzI2MiwgLTQyOTAgfSwKKyAgICB7ICAgMjgwNCwgICAgNDQ0LCAgIDYyNzYsIC0zNjU1IH0sCisgICAgeyAgIDQxMjAsICAgLTUxNywgICA2MDc4LCAtNDUzMSB9LAorICAgIHsgICA1MTE5LCAgICA4NDEsICAgMzQ4NiwgLTM5MTAgfSwKKyAgICB7ICAgNDczOCwgICAxNTM5LCAgIDM1MjUsIC0yOTcwIH0sCisgICAgeyAgIDUwODYsICAgIDM3MCwgICA1ODk1LCAtNTY0MCB9LAorICAgIHsgICA0MjM1LCAgIDI3MTYsICAgNDU4OSwgLTUwNDQgfSwKKyAgICB7ICAgMzY5MSwgICAgNjgyLCAgIDYxOTksIC00NzAwIH0sCisgICAgeyAgIDYxMTEsICAgLTU3MCwgICA2MjcxLCAtNjUyOCB9LAorICAgIHsgICAyNjExLCAgIDEyNzcsICAgMzc1NiwgLTQ4MDIgfSwKKyAgICB7ICAgNDM5NSwgICAgOTcwLCAgIDM4MDcsIC01ODc5IH0sCisgICAgeyAgIDUyMjUsICAgMjI5OSwgICAzMjQyLCAtNDMzMyB9LAorICAgIHsgICA1MTQ0LCAgIDE3NzgsICAgNDk0NiwgLTU1NDUgfSwKKyAgICB7ICAgMjk4OSwgIC0zMDE2LCAgIDMyNDcsIC01NDk1IH0sCisgICAgeyAgIDI5ODMsICAgIDkyMCwgICAyMDcxLCAtNjA1OSB9LAorICAgIHsgICA1MjcwLCAgIC05MDMsICAgNDQzNCwgLTIzNTAgfSwKKyAgICB7ICAgNjQxNSwgICAtNTg1LCAgIDM5NzAsIC0zNTU0IH0sCisgICAgeyAgIDM4NjYsICAgLTE5NywgICA1MjE2LCAtMjg4NCB9LAorICAgIHsgICAzNzY3LCAgLTEyOTgsICAgNjcwMiwgLTMzMTUgfSwKKyAgICB7ICAgNjI5OSwgICAyNjIwLCAgIDUyODQsIC02ODI0IH0sCisgICAgeyAgIDY2NTQsICAgIDY0NiwgICAzNjUzLCAtNDkyNyB9LAorICAgIHsgICA0NzcwLCAgIDMwNDcsICAgNTE2MCwgLTYyODcgfSwKKyAgICB7ICAgNTM2NCwgICAgNDM0LCAgIDI5MTksIC01MjA3IH0sCisgICAgeyAgIDI5OTgsICAgMTM0NCwgICA0ODAxLCAtMjQ1NiB9LAorICAgIHsgICAzODk2LCAgIDEwMTMsICAgMzc3MywgLTE4NjQgfSwKKyAgICB7ICAgMjExNSwgICAgNjU1LCAgIDI5OTksIC02MzQ0IH0sCisgICAgeyAgIDUxNzAsICAgLTk4MSwgICAyODQ5LCAtNDQ2NCB9LAorICAgIHsgICAyNzM1LCAgLTIxNTksICAgMjcxNywgLTU3NzYgfSwKKyAgICB7ICAgMjQzMCwgIC0xOTUyLCAgIDQzOTIsIC00NTU5IH0sCisgICAgeyAgIDYxNDMsICAtMTE4MCwgICAzNjU5LCAtNDc0NiB9LAorICAgIHsgICA0OTc4LCAgLTE0ODMsICAgMTcyNiwgLTQ4NzUgfSwKKyAgICB7ICAgMzQ4NiwgIC0yMzgzLCAgIDMzMDYsIC00MzAxIH0sCisgICAgeyAgIDE0MzQsICAtMTM3MiwgICA0MTcxLCAtNDc3MCB9LAorICAgIHsgICAzMzU0LCAgLTI2MjcsICAgMTUyNSwgLTUwOTMgfSwKKyAgICB7ICAgNjc5MCwgICAyMzg2LCAgIDM5OTUsIC01OTA5IH0sCisgICAgeyAgIDE0NzUsICAtMjY3NCwgICAzNDUxLCAtNDIwNCB9LAorICAgIHsgICAxOTk5LCAgLTM0OTQsICAgMzY5MywgLTU1NTYgfSwKKyAgICB7ICAgNDc2NCwgIC0yODQ4LCAgIDI4NTYsIC01NTg5IH0sCisgICAgeyAgLTM2NzcsICAgNTEzMSwgICAyODI3LCAtMjkzNCB9LAorICAgIHsgIC0yODQ0LCAgIDcwNzgsICAgMjg1MiwgLTM1ODAgfSwKKyAgICB7ICAtMzkwMiwgICA2NDM0LCAgIDQxMTgsIC0xOTExIH0sCisgICAgeyAgLTE3NjksICAgNzUzMCwgICAzNDkyLCAtMzU0MSB9LAorICAgIHsgIC0xOTM3LCAgIDU2NzksICAgLTQ0NywgLTExMjcgfSwKKyAgICB7ICAtMjQ1NiwgICA0NjgwLCAgIDQxOTYsIC0yNDA3IH0sCisgICAgeyAgLTI3NzgsICAgODI0MSwgICAxNjk4LCAtNDI4OCB9LAorICAgIHsgIC0yODc2LCAgIDYxMDQsICAgNTE4MiwgLTIzODcgfSwKKyAgICB7ICAtMjgwMiwgICA3MzQxLCAgIDQ0NjMsIC0yOTM4IH0sCisgICAgeyAgLTEwMjUsICAgNjI2NywgICA0NzUyLCAtMzIwMSB9LAorICAgIHsgIC0yMzQ5LCAgIDU0MTMsICAgMjA0MSwgLTM3OTQgfSwKKyAgICB7ICAtMjI1MiwgICA4MjI1LCAgIDI4NTYsIC00MjY5IH0sCisgICAgeyAgLTE0NjUsICAgNDk2NywgICA0OTc2LCAtMjUwMCB9LAorICAgIHsgICAtNjM2LCAgIDc1NjUsICAgMzUxNywgLTQyMzMgfSwKKyAgICB7ICAtMTkwNSwgICA1NjE4LCAgIDM5MDQsIC0yOTQyIH0sCisgICAgeyAgIC0zMDIsICAgNjgxNiwgICAzMzQzLCAtMzMxNiB9LAorICAgIHsgIC0yMjEwLCAgIDQxNTYsICAgMjgxNywgLTM1MTEgfSwKKyAgICB7ICAgLTcxNywgICA2NTY4LCAgIDE4NjMsIC0yOTUxIH0sCisgICAgeyAgLTM4NzMsICAgNTY4MiwgICAyMTY0LCAgLTU3NSB9LAorICAgIHsgIC0yODc4LCAgIDU4MzUsICAgIDQ0MCwgLTI1OTcgfSwKKyAgICB7ICAtMzIyOCwgICA3NzAxLCAgIDI2MTAsIC0yNTE0IH0sCisgICAgeyAgLTM2MDgsICAgODg4OCwgICAzMzc3LCAtMjQ2OCB9LAorICAgIHsgIC0yNTgyLCAgIDk3MTcsICAgMjUxOSwgLTMxMjYgfSwKKyAgICB7ICAtNTIzOCwgICA2MjAyLCAgIDI4NjYsIC0yODMxIH0sCisgICAgeyAgLTM0MjgsICAgNzM3MCwgICAzMDU2LCAgLTMzNSB9LAorICAgIHsgIC0xNjgxLCAgIDg4MzYsICAgMTIxMCwgLTIwMTAgfSwKKyAgICB7ICAtMzI3NiwgICA2NzI0LCAgIDExNTYsIC0zOTMwIH0sCisgICAgeyAgIC04OTQsICAgODE0OSwgICAgODI3LCAtMTI1OCB9LAorICAgIHsgIC0yOTY1LCAgIDg2MzEsICAgMjU0OSwgLTEzMjAgfSwKKyAgICB7ICAtMzk2MSwgICA2OTAyLCAgIDM1ODEsICAgIDU1IH0sCisgICAgeyAgLTE4OTQsICAgNzc0NSwgICAxNzUwLCAgLTg0MSB9LAorICAgIHsgICAtODIxLCAgIDY4NDQsICAgIDg1MCwgIC02NzYgfSwKKyAgICB7ICAgLTYwOCwgICA2OTQ4LCAgICAgLTQsIC0xMzc2IH0sCisgICAgeyAgICA2MTUsICAgNjUyNCwgICAxMDg5LCAtMTE0NyB9LAorICAgIHsgIC0yOTcyLCAgIDU2NjgsICAgMTA5MSwgIC00ODkgfSwKKyAgICB7ICAgLTE1NywgICA0NjQ5LCAgIDI5MDQsICAtNDEzIH0sCisgICAgeyAgICA2NzMsICAgNTEyMSwgICAxNDk4LCAgIC02NiB9LAorICAgIHsgICAtMzkwLCAgIDU5MDIsICAgMTYxMSwgIC0yNDUgfSwKKyAgICB7ICAtMjM0OSwgICA1NDc4LCAgIDQ3NzIsIC0xMzIwIH0sCisgICAgeyAgICAgODgsICAgNjc5OCwgICAxOTcyLCAtMTg1OSB9LAorICAgIHsgIC0xMjEzLCAgIDUxMjAsICAgMjk5MSwgICAyMDAgfSwKKyAgICB7ICAtMjM0NywgICA2MDQwLCAgIDI4MzksICAgMzc2IH0sCisgICAgeyAgIC01NzgsICAgNTk3NiwgICAzMzY0LCAtMTc5NiB9LAorICAgIHsgIC0xMzkxLCAgIDU4NzIsICAgMzAwMiwgIC05NjUgfSwKKyAgICB7ICAgLTU2NCwgICA0NDk2LCAgIDM5NDYsIC0xMTg2IH0sCisgICAgeyAgLTIyOTksICAgNjM4NiwgICAzMTM1LCAtMjE3NiB9LAorICAgIHsgIC0yMTMxLCAgIDU2NDEsICAgMjAxMSwgIDEyMjMgfSwKKyAgICB7ICAgLTc3MiwgICA1ODA3LCAgIDExMjQsICAgODk1IH0sCisgICAgeyAgLTI4MzcsICAgNjc1OCwgICAyMjk3LCAgLTc0MCB9LAorICAgIHsgIC0zMDkxLCAgIDYyOTgsICAgMTQxNSwgLTIxMjYgfSwKKyAgICB7ICAtNDE5NywgICA2MDM2LCAgIDE4NDMsIC0zMDIyIH0sCisgICAgeyAgICAtNDEsICAgNjQ1OSwgICAgIDkyLCAgIDM0NCB9LAorICAgIHsgIC0yMjQxLCAgIDY4NjAsICAgMjA5NSwgLTQzOTYgfSwKKyAgICB7ICAtMTkzMSwgICA3MDg4LCAgIDIxMTcsIC0yMTM1IH0sCisgICAgeyAgLTIzNzUsICAgNDQyMiwgICAxNjg4LCAtMzE2OSB9LAorICAgIHsgIC0xNzQyLCAgIDY2NzQsICAgMTUzOCwgIC0xMTkgfSwKKyAgICB7ICAtNDgxOCwgICA3NzQ5LCAgIDQxOTIsIC0xNTc3IH0sCisgICAgeyAgLTIwMDQsICAgNTY3MiwgICAgMTkzLCAgLTQzMCB9LAorICAgIHsgIC0zODI1LCAgIDYwNDIsICAgMjEyOCwgLTE4OTggfSwKKyAgICB7ICAtMTEwOCwgICA4MDMzLCAgIDIxMTksIC0zMDEzIH0sCisgICAgeyAgLTIzNzAsICAgNTQ1MywgICAxNzIxLCAgIDI2NiB9LAorICAgIHsgIC0xNTcwLCAgIDcxMzQsICAgIDYxNCwgLTI2MzggfSwKKyAgICB7ICAtMTUxOSwgICA4NzUyLCAgIDM1MDMsIC00MzMwIH0sCisgICAgeyAgLTIwNTAsICAgMzg0NSwgICAyOTA3LCAtMTEyNiB9LAorICAgIHsgICA1MDg1LCAgIDQ0MTIsICAgLTMzNSwgLTE5MjMgfSwKKyAgICB7ICAgMzYxOCwgICAxNDIzLCAgIC02MTMsIC00MDEyIH0sCisgICAgeyAgIDQ0ODEsICAgMzcyOSwgICAgNTg5LCAtNDYzMSB9LAorICAgIHsgICA0MjcwLCAgIDMyMTYsICAtMTc2MywgLTMxNjggfSwKKyAgICB7ICAgNDI0MSwgICAxNzk2LCAgLTE3MDEsIC0yNzk2IH0sCisgICAgeyAgIDQ3ODcsICAgMjMzOCwgICAtNDg3LCAtMzYzOSB9LAorICAgIHsgICAyOTE1LCAgIDM0MjksICAgLTYyMSwgLTQ3NTMgfSwKKyAgICB7ICAgNTE3NSwgICAxNjYwLCAgLTEyNjUsIC0zMjIzIH0sCisgICAgeyAgIDQyODAsICAgNDA1NywgICAtNjg0LCAtNDA3OSB9LAorICAgIHsgICA0OTgwLCAgIDQ0MTksICAtMTQ1NSwgLTI3MTkgfSwKKyAgICB7ICAgNTQzNiwgICAyNDY0LCAgICAzODcsIC00MTk3IH0sCisgICAgeyAgIDQ1MDcsICAgNDAxOCwgICAxMTIxLCAtMzMxNCB9LAorICAgIHsgICA2MDIwLCAgIDI0MDEsICAgLTQxMywgLTMyMDEgfSwKKyAgICB7ICAgNDIwMCwgICAzNzg5LCAgIC0zMzMsIC0yODEzIH0sCisgICAgeyAgIDUyMjksICAgMjQ5MywgIC0xMTk0LCAtMTg3OCB9LAorICAgIHsgICA1ODUxLCAgIDI2OTUsICAgLTQ5MiwgLTIyOTIgfSwKKyAgICB7ICAgNTc0MywgICAzMjg4LCAgIC02OTcsIC0xMjIxIH0sCisgICAgeyAgIDU2OTIsICAgMjYxMiwgICAgOTc5LCAtMjIyNyB9LAorICAgIHsgICA1MDg1LCAgIDIwNjcsICAgMTA0NiwgLTEyMTQgfSwKKyAgICB7ICAgMzE2MywgICAyMjQwLCAgLTIwOTgsIC0zNDM1IH0sCisgICAgeyAgIDUyMjgsICAgMTg5OCwgICAgMTQ1LCAtMjM5NyB9LAorICAgIHsgICA1ODYwLCAgIDM5NzYsICAgLTQxOCwgLTI4NzIgfSwKKyAgICB7ICAgNjAwOCwgICAzMzk5LCAgIDEwMjcsIC0zNTA2IH0sCisgICAgeyAgIDQxMjYsICAgMjAzNSwgICAxODY1LCAgLTg5MyB9LAorICAgIHsgICA1Mzc1LCAgIDM1OTYsICAgIDUxMSwgLTIzNjIgfSwKKyAgICB7ICAgMTkzNywgICAxNDkzLCAgIC04NTIsICAtMTIyIH0sCisgICAgeyAgIDM0NzMsICAgNDg0OSwgICAgNTQ3LCAtMjYwMyB9LAorICAgIHsgICA0NjMxLCAgIDI5NzcsICAgMTE0MSwgLTE3NjggfSwKKyAgICB7ICAgNjE0OSwgICAzMDUwLCAgICAtNzEsIC0xODg2IH0sCisgICAgeyAgIDQwNjksICAgNDM1MywgICAtMjg5LCAtMTQyOSB9LAorICAgIHsgICAyODg0LCAgIDEyMjUsICAtMTM4OCwgICAzNjUgfSwKKyAgICB7ICAgNTQ4NSwgICAyNTE4LCAgIC0yMzUsICAtNTcxIH0sCisgICAgeyAgIDEyMTYsICAgNDM3NSwgICAxNDQzLCAgIDM5OCB9LAorICAgIHsgICA0OTg4LCAgIDMxMDYsICAgIDEwNywgLTE0MzUgfSwKKyAgICB7ICAgNDUxMSwgICAyODAxLCAgICAzMDcsICAtNDQ0IH0sCisgICAgeyAgIDMyMzUsICAgNDM4NiwgICAgMzI3LCAgLTY3NiB9LAorICAgIHsgICAyMDU1LCAgIDM3MDgsICAgMTY1NywgIC0zMDUgfSwKKyAgICB7ICAgNTgzOSwgICAyMzc0LCAgICAyOTAsIC0xMzg1IH0sCisgICAgeyAgIDUxMTAsICAgMzMwNSwgICAxOTM2LCAtNDIwNiB9LAorICAgIHsgICA2NDE2LCAgIDI5MjAsICAgIDMzOCwgLTI3MzYgfSwKKyAgICB7ICAgMzM1MCwgICAyODI0LCAgLTEyNjksIC0zODgxIH0sCisgICAgeyAgIDQ4NDAsICAgMTgxNSwgICAgNDY0LCAgIDE4NiB9LAorICAgIHsgICAyMzk5LCAgIDMzMzIsICAgIDIzOCwgIDEyMzggfSwKKyAgICB7ICAgMzUxNiwgICAxMzYzLCAgIDE1ODIsICAgNjg4IH0sCisgICAgeyAgIDM1ODIsICAgMTg3NCwgICAgMTU0LCAtNDc3MCB9LAorICAgIHsgICAzMjYxLCAgIDI4NzgsICAgIDg4NiwgICAyODMgfSwKKyAgICB7ICAgMzg3NywgICAyNjU4LCAgIC0zMjcsICAgODg0IH0sCisgICAgeyAgIDQxNTEsICAgMzQzNiwgICAyMTczLCAtMjkyMyB9LAorICAgIHsgICAzNTkyLCAgIDM2NzQsICAgMTI4MSwgLTEyOTUgfSwKKyAgICB7ICAgNDU2MSwgICAzNzMwLCAgLTExMTQsIC0xNzQ3IH0sCisgICAgeyAgIDQ1OTUsICAgMzYyNSwgICAtNTU4LCAgLTU3NSB9LAorICAgIHsgICAyNTc3LCAgIDIzNDgsICAgMjI2NywgICAxMjAgfSwKKyAgICB7ICAgNTI0MiwgICAzMjk5LCAgICAgMzIsIC0zNDEyIH0sCisgICAgeyAgIDQyNjQsICAgMzYzNywgICAgNzA5LCAtMjMyMCB9LAorICAgIHsgICA2NTU2LCAgIDM1NzAsICAgLTgzOCwgLTI0NzIgfSwKKyAgICB7ICAgNTc0NSwgICA0MDE0LCAgIC05NDAsIC0xOTczIH0sCisgICAgeyAgIDU2MjksICAgNDQ3NSwgICAgNDc3LCAtMzMyOCB9LAorICAgIHsgICA1MjY5LCAgIDMxOTksICAgMTY4MiwgLTMwODUgfSwKKyAgICB7ICAgNDQzMiwgICAyNDE2LCAgIDExNDUsIC0zMjk5IH0sCisgICAgeyAgIDQ0NjUsICAgMjUwNSwgICAyMTYyLCAtMjE4NiB9LAorICAgIHsgICA0NjQzLCAgIDQ5NDEsICAgIC04OCwgLTI4ODUgfSwKKyAgICB7ICAgNDU2OCwgICA1MjMxLCAgICA1NTIsIC0zOTE1IH0sCisgICAgeyAgIDU2NjcsICAgMzA3NSwgIC0xNDA2LCAtMjk2MyB9LAorICAgIHsgICA1NDE4LCAgIDUyNTksICAgLTc3MSwgLTI4MTggfSwKKyAgICB7ICAgLTI1NiwgIC03ODc1LCAgICA1MTEsICAtNDcxIH0sCisgICAgeyAgLTE4MTMsICAtNzk3MSwgICAtNDI0LCAgLTM5NiB9LAorICAgIHsgICAtMzA2LCAgLTcwMDYsICAgIDg2MiwgICAyODIgfSwKKyAgICB7ICAtMjMwNiwgIC02NDIyLCAgLTE0NDAsICAgNTA4IH0sCisgICAgeyAgIC0yNDUsICAtNjc4NywgICAgMzc1LCAgLTEwMCB9LAorICAgIHsgIC0xMzA5LCAgLTYwNjUsICAgIC0yMCwgICA3NzkgfSwKKyAgICB7ICAtMTY1NiwgIC02MDQ3LCAgIC02NDEsICAxMzA3IH0sCisgICAgeyAgLTE0OTYsICAtNjUyMiwgICAgOTY0LCAgIDcyNiB9LAorICAgIHsgIC0yMjkxLCAgLTY1ODgsICAgLTIwMiwgICA3OTUgfSwKKyAgICB7ICAgLTc2MiwgIC03NTIyLCAgIDE0NTQsICAtNTU4IH0sCisgICAgeyAgLTIyNzAsICAtNzAwNCwgICAtODM0LCAgLTU4MCB9LAorICAgIHsgIC0xMTM5LCAgLTcwNzgsICAgIDI1OSwgICAzNjIgfSwKKyAgICB7ICAtMjUzNSwgIC03NTY4LCAgLTEwNDAsICAgIDQ5IH0sCisgICAgeyAgLTM3ODYsICAtNzI4MCwgICAgOTM0LCAgLTQ3NiB9LAorICAgIHsgIC0zMzM2LCAgLTYzNjgsICAgIDYwNiwgIDEwNTYgfSwKKyAgICB7ICAtMzYwMiwgIC02OTI0LCAgICAgNTIsICAgNzE0IH0sCisgICAgeyAgLTIyNzgsICAtNjU1MCwgICAxNjc0LCAgIDIwNCB9LAorICAgIHsgIC0yODU1LCAgLTU3NjUsICAgIDkzMCwgIDE1MzAgfSwKKyAgICB7ICAtMjg4OSwgIC03MzI1LCAgIC0yMTUsICAgMzA1IH0sCisgICAgeyAgLTI3NDksICAtNjA4MCwgICAtMjM3LCAgMTQ1MiB9LAorICAgIHsgICAtOTg1LCAgLTY2NjcsICAgMTU3NywgICA0MDAgfSwKKyAgICB7ICAtMjAzNiwgIC02MDgzLCAgICAzODAsICAxMjY3IH0sCisgICAgeyAgLTIwNzcsICAtNzQ2MCwgICAgMzgwLCAgIC0zMCB9LAorICAgIHsgIC0xNzc1LCAgLTcxNzUsICAgMTU0MCwgIC0zODYgfSwKKyAgICB7ICAtMzA2NSwgIC02OTI3LCAgICA5ODksICAgMTY4IH0sCisgICAgeyAgLTI4MzYsICAtNzYwMiwgICAgMTE3LCAtMzM5MiB9LAorICAgIHsgIC0xMDU4LCAgLTYzOTYsICAgIDU5MywgLTMwNzggfSwKKyAgICB7ICAgLTg0NCwgIC02MDYyLCAgICA5OTksICAtMjM2IH0sCisgICAgeyAgLTMyNjEsICAtNjk1MSwgICAxNDkxLCAgLTcyMCB9LAorICAgIHsgIC0yMTg2LCAgLTg0ODQsICAgICA3NSwgLTEyODcgfSwKKyAgICB7ICAtMjg4MiwgIC03NzU2LCAgICA0NTYsICAtNTEwIH0sCisgICAgeyAgLTE4MDAsICAtNjg3OSwgICAgOTYwLCAtMTE4MyB9LAorICAgIHsgIC0yNTU0LCAgLTcyNDEsICAgMTYxNCwgLTE0NzQgfSwKKyAgICB7ICAtMjYwOCwgIC01MzA1LCAgICAzOTIsICAgODUxIH0sCisgICAgeyAgLTI5NzMsICAtNjU2MiwgICAtODU5LCAgIDg1OCB9LAorICAgIHsgIC0yNjQwLCAgLTU5ODksICAgMTAzMSwgIC00MTYgfSwKKyAgICB7ICAgLTk3NywgIC04MzY2LCAgICA3MDUsIC0xNDM0IH0sCisgICAgeyAgLTEyMTMsICAtNzQwOSwgICAgLTc3LCAtMTM5MCB9LAorICAgIHsgIC0xMzM1LCAgLTY2NTcsICAgMjEyNSwgIC0xMjMgfSwKKyAgICB7ICAtMjU0NCwgIC02ODYyLCAgIDE4NTIsICAtNzM3IH0sCisgICAgeyAgLTMyMzUsICAtNjQyMiwgICAxNzUyLCAgLTEwMyB9LAorICAgIHsgIC0xMzAwLCAgLTc1NTcsICAgIDkzOSwgIC0zNDggfSwKKyAgICB7ICAtMzQ3NiwgIC03NTc5LCAgICAyMDIsICAtMTA5IH0sCisgICAgeyAgLTI0ODIsICAtNjU3MiwgICAgNzUzLCAgIDYxOSB9LAorICAgIHsgIC0yNTU0LCAgLTgxMzYsICAgLTY0OCwgIC00MjkgfSwKKyAgICB7ICAtMTAxMiwgIC03ODcwLCAgICAgLTMsICAtNDIxIH0sCisgICAgeyAgLTM2MDQsICAtNjI0NywgICAgIDMyLCAtMzEwMiB9LAorICAgIHsgIC0xNDg2LCAgLTcyNzEsICAgMjAxMywgLTEwMjEgfSwKKyAgICB7ICAgLTU3OCwgIC02Nzk5LCAgIC01MjMsICAgNDA1IH0sCisgICAgeyAgLTI4NDEsICAtNTk0OCwgICAxNjQ0LCAgIDkxMSB9LAorICAgIHsgIC0yNDExLCAgLTc0NzMsICAgMTA4NCwgIC00ODQgfSwKKyAgICB7ICAtMjIzOCwgIC02MDMzLCAgICAyOTQsIC0xMDU5IH0sCisgICAgeyAgLTM0NTksICAtNjQ3MCwgICAtMjAxLCAgLTc5MCB9LAorICAgIHsgIC0yMDI3LCAgLTYwMDksICAgMTgzMywgICA4MDUgfSwKKyAgICB7ICAtMTQzMywgIC04MDQ3LCAgIDE1MzEsIC0xNzU0IH0sCisgICAgeyAgLTMyNTgsICAtNzg4NCwgICAgNzYzLCAtMTQyMiB9LAorICAgIHsgIC0xNTQ0LCAgLTY5MjgsICAgLTcyOSwgICA0NzggfSwKKyAgICB7ICAtMjMxNCwgIC04NDE1LCAgICAgNzQsIC0zNzU3IH0sCisgICAgeyAgLTMyMDEsICAtNTY4NCwgICAgIDk1LCAtMjIxNCB9LAorICAgIHsgIC0yNDIzLCAgLTg2OTQsICAgIDcyNSwgLTM2MzEgfSwKKyAgICB7ICAtMzU0NSwgIC03MDcxLCAgIDExNjIsIC0xNzk4IH0sCisgICAgeyAgIC0yOTQsICAtOTY2MiwgICAgNDAzLCAtMjI3NCB9LAorICAgIHsgIC0yMjkwLCAgLTU0NjAsICAgMTE5NiwgICA0MDIgfSwKKyAgICB7ICAtMTYwMywgIC02NzEzLCAgICA5MDMsIC0yMzYzIH0sCisgICAgeyAgIDQxMjEsICAgMjQ5MSwgIC0zMTQyLCAtMjQ4MiB9LAorICAgIHsgICA0NTAwLCAgIDMzMDUsICAtMzY3MSwgLTE1NjcgfSwKKyAgICB7ICAgNTk3MywgICAzMTcyLCAgLTEzNDgsICAtNTM0IH0sCisgICAgeyAgIDQ4MzAsICAgMzM3OSwgIC0xNTQ5LCAgIDY0MyB9LAorICAgIHsgICA1MjE0LCAgIDM5MzgsICAtMjY0MSwgLTIzMDIgfSwKKyAgICB7ICAgNDYzOSwgICA0ODI2LCAgLTU1MzIsICAtODQ3IH0sCisgICAgeyAgIDU2MzksICAgMjczMSwgIC0yMTcwLCAgLTk2MyB9LAorICAgIHsgICA2MDg0LCAgIDM0ODcsICAtMzUyNSwgLTEzNDYgfSwKKyAgICB7ICAgNTk3MSwgICAzMTU0LCAgLTIxOTAsIC0yMzE2IH0sCisgICAgeyAgIDU2MTgsICAgNDg2NSwgIC02OTI3LCAgIDExNiB9LAorICAgIHsgICA1MzQ1LCAgIDM1NjgsICAtNzM5MSwgICA3MDkgfSwKKyAgICB7ICAgNTQyOSwgICA1MDc4LCAgLTM4MTEsIC0xNTI0IH0sCisgICAgeyAgIDY5NjAsICAgMjAzNywgIC0zNTE1LCAtMTA5NiB9LAorICAgIHsgICA3MDkyLCAgIDI1MzEsICAtNDU1NywgIC01ODggfSwKKyAgICB7ICAgNjA2MSwgICA0MjQ3LCAgLTU2NTEsICAtNDc4IH0sCisgICAgeyAgIDQ1OTUsICAgMzY4NCwgIC00OTA3LCAgLTgyNyB9LAorICAgIHsgICA3NDk3LCAgIDMyMTMsICAtMzA0OCwgIC00MjQgfSwKKyAgICB7ICAgNTk5NiwgICAyMTM3LCAgLTMwOTgsIC0xNzQ1IH0sCisgICAgeyAgIDYxOTgsICAgNTE5OSwgIC0yMjIzLCAtMjI3NCB9LAorICAgIHsgICA2ODg4LCAgIDI4NTEsICAtMjc2OCwgLTE2NzUgfSwKKyAgICB7ICAgNjExNCwgICA0MjEwLCAgLTIzMTYsICAtOTU0IH0sCisgICAgeyAgIDcxMjcsICAgNDI0MiwgIC0zMDQxLCAtMTQwOCB9LAorICAgIHsgICA2MTI2LCAgIDM2NjgsICAtMTUxNywgLTE0MjcgfSwKKyAgICB7ICAgNjI0NSwgICA2MTI5LCAgLTQyMjUsIC0xMTg2IH0sCisgICAgeyAgIDY4MTYsICAgMzIxMywgIC0yMTAxLCAgLTk2NCB9LAorICAgIHsgICA1MzQ1LCAgIDUyNzYsICAtMjY0MywgIC04NDcgfSwKKyAgICB7ICAgNjU5MiwgICA0NjY1LCAgLTQzMzgsICAgNDg0IH0sCisgICAgeyAgIDY3NDYsICAgMzc1MSwgIC0zNDQzLCAgIDEyNCB9LAorICAgIHsgICA1NDUzLCAgIDE5ODAsICAtMjczOCwgIDI2MDYgfSwKKyAgICB7ICAgNDY2MiwgICAyMTc5LCAgLTQyMjYsIC0xMDU5IH0sCisgICAgeyAgIDU1NzEsICAgMzIwOCwgIC0zNTU0LCAgIDE3NCB9LAorICAgIHsgICA1MjU2LCAgIDQ0NDcsICAtMTgxNSwgLTE0ODEgfSwKKyAgICB7ICAgNTQwMCwgICAyNTcwLCAgLTEyMTAsICAgMjM1IH0sCisgICAgeyAgIDcwNTYsICAgMjU0OSwgIC0yNjc0LCAgIDMxOCB9LAorICAgIHsgICA0NTc0LCAgIDQzNDAsICAtMjg5MiwgIC0xMzAgfSwKKyAgICB7ICAgNjIwMywgICA0NTg3LCAgLTMyNzMsICAtMzA1IH0sCisgICAgeyAgIDUxMDMsICAgMTkyNSwgIC0yNzE1LCAtMjEzNyB9LAorICAgIHsgICAzOTA1LCAgIDQyOTYsICAtMTcwMCwgICAyNDcgfSwKKyAgICB7ICAgNDQyMSwgICA0NjA1LCAgLTMyOTksICAgODExIH0sCisgICAgeyAgIDU2NzEsICAgMTI3MywgIC0zODcwLCAgLTkyNCB9LAorICAgIHsgICA1NDg2LCAgIDE4MDUsICAtNDkwMSwgICAxMzMgfSwKKyAgICB7ICAgNjQzNywgICAyNTc4LCAgLTE4MjgsICAtMTA2IH0sCisgICAgeyAgIDU1MzAsICAgNTI1MywgIC01MDU4LCAgMTIyMyB9LAorICAgIHsgICA0ODE2LCAgIDIwMjUsICAtMTIxNSwgIDE0NDMgfSwKKyAgICB7ICAgMzQ1NywgICAzNTI1LCAgLTI0NTYsICAzMjE3IH0sCisgICAgeyAgIDMzMTYsICAgMjU5NSwgIC0xMTA4LCAgMjQ1OSB9LAorICAgIHsgICAzMDY4LCAgIDM4MTAsICAtMjIwNywgIDE5MjYgfSwKKyAgICB7ICAgNjM1MSwgICA1NDM2LCAgLTY0NzAsICAgNjAwIH0sCisgICAgeyAgIDYzMjQsICAgNDI0MCwgIC01MzY1LCAgMjQxNiB9LAorICAgIHsgICA0ODUxLCAgIDQ3NzQsICAtNDA3NSwgIDE4NzggfSwKKyAgICB7ICAgNDkwMCwgICAzNjc5LCAgLTUxOTgsICAxMDc4IH0sCisgICAgeyAgIDgzNDcsICAgMzYzMywgIC00NTY1LCAgLTE3MSB9LAorICAgIHsgICA1MjQ0LCAgIDU3MTgsICAtMzg1MywgICAxNzMgfSwKKyAgICB7ICAgMzk2MCwgICAzNDkyLCAgLTI5MzksICAyMTA1IH0sCisgICAgeyAgIDYwNzAsICAgMzQ3MywgIC0yMzUxLCAgIDE2MSB9LAorICAgIHsgICA4MjI4LCAgIDMwMzQsICAtMzM2MCwgIC05MDEgfSwKKyAgICB7ICAgNzAwNiwgICAzOTg1LCAgLTE5NDAsIC0xOTI2IH0sCisgICAgeyAgIDcxMjMsICAgNDY4MSwgIC00MzAxLCAgLTg3OCB9LAorICAgIHsgICA1MTIyLCAgIDQwOTcsICAtMTg1MSwgIC00NDkgfSwKKyAgICB7ICAgNjIwMCwgICAyMDYwLCAgLTIyNTEsICAxMDQ5IH0sCisgICAgeyAgIDcxMDYsICAgMzg0NCwgIC03MjA5LCAgMjYyNSB9LAorICAgIHsgICA3MTA4LCAgIDMzNzAsICAtNjczNCwgICA1MzMgfSwKKyAgICB7ICAgNjg1OSwgICAyODQ5LCAgLTM5OTIsICAxMzYwIH0sCisgICAgeyAgIDU0NTgsICAgMjI3OCwgIC0zMjUzLCAgMTEzMSB9LAorICAgIHsgIC0xMDcyLCAgLTIxMDksICAgNDc4MywgLTEwNzMgfSwKKyAgICB7ICAgLTMxOSwgIC0yNjA0LCAgIDQyNTcsIC0yNDE4IH0sCisgICAgeyAgIDI0NjYsICAgMTMwMCwgICAzNDc2LCAgLTMxNCB9LAorICAgIHsgICAyODQ3LCAgLTE1MDIsICAgNTI5NiwgIC0xNDEgfSwKKyAgICB7ICAgMTY2NywgIC0xMjczLCAgIDU1NTksIC0yNzI1IH0sCisgICAgeyAgIDI4NzcsICAtMzQwMiwgICA2NDM0LCAgIDIwNCB9LAorICAgIHsgICAgIDUzLCAgLTI2MzcsICAgNTI3NSwgLTExODEgfSwKKyAgICB7ICAgMTA5MSwgIC0yMjE1LCAgIDU4MDMsIC0xNTQ5IH0sCisgICAgeyAgIDIzOTcsICAgLTkyMiwgICA0MzI3LCAgMTE4MiB9LAorICAgIHsgICAgMjE5LCAgLTM3NDcsICAgNDY0NywgLTE1NjQgfSwKKyAgICB7ICAgIC0yOSwgIC0yNzA1LCAgIDQ4MTIsICAxMjc3IH0sCisgICAgeyAgIDE0OTksICAtMjYwOCwgICA1NjQ4LCAgMTQwNyB9LAorICAgIHsgICAyMTM5LCAgLTIzOTksICAgNDIwMiwgIDI3OTEgfSwKKyAgICB7ICAgLTQyNiwgIC0yMDY0LCAgIDU1MjgsICAgMTUxIH0sCisgICAgeyAgIDI1NjAsICAtMjgwMywgICA2MTc5LCAtMjgwNiB9LAorICAgIHsgICA0NTM3LCAgLTI0NzksICAgMzc5NywgIDEwOTUgfSwKKyAgICB7ICAgIDg4OCwgIC0zMzU3LCAgIDUzNDEsICAtNDE1IH0sCisgICAgeyAgIDQ0NjAsICAtMTgxNCwgICA1Mzg4LCAtMTIyNyB9LAorICAgIHsgICAzOTIwLCAgLTMyNjgsICAgNjM2NCwgIC03MDMgfSwKKyAgICB7ICAgMzM0MywgIC00Njk4LCAgIDQ0MTAsICAgNzg0IH0sCisgICAgeyAgICAzMDksICAtMTg5NywgICA2MzA2LCAgMTIyMyB9LAorICAgIHsgICAgOTU4LCAgLTMzMTgsICAgNDI1NCwgLTMxNjcgfSwKKyAgICB7ICAgIC05OSwgICAxNTk2LCAgIDYwMTgsIC0xOTgzIH0sCisgICAgeyAgIC00MjksICAgLTg1MywgICA2NDA3LCAgIDg3OCB9LAorICAgIHsgICAxMTcwLCAgLTEzMjIsICAgNjI5MCwgIC00MTcgfSwKKyAgICB7ICAgMjI4OCwgICAtNTA1LCAgIDYzMDMsIC0xOTk5IH0sCisgICAgeyAgIDMzMTIsICAtMTY3NCwgICA2NzQ5LCAtMjQ5NCB9LAorICAgIHsgICAtNDE1LCAgLTM0MDEsICAgNDcyMSwgIC0zNzEgfSwKKyAgICB7ICAgLTE4OSwgIC0xMjEwLCAgIDQ4NDQsIC0yMDAyIH0sCisgICAgeyAgICA4ODgsICAtNDE0MiwgICA0Mzc3LCAgIDEzMCB9LAorICAgIHsgICAyNDY5LCAgLTQzODEsICAgNTM5OCwgLTI0OTIgfSwKKyAgICB7ICAgMjg3OSwgIC0yOTEyLCAgIDUwOTQsIC0yNTk4IH0sCisgICAgeyAgIC03MTcsICAgLTYxNywgICA1NjUwLCAgLTY4NSB9LAorICAgIHsgICAxNDcwLCAgLTM4NjMsICAgNTM1MiwgLTE2ODQgfSwKKyAgICB7ICAgMzkzNSwgICAgLTk2LCAgIDM4MjMsICAtNzMwIH0sCisgICAgeyAgIDM3NjksICAgLTQzMCwgICAzMTY4LCAgIDY5NCB9LAorICAgIHsgICAyNTU2LCAgICAzODUsICAgMzUzOSwgICA1MTIgfSwKKyAgICB7ICAgICA3NywgIC0xNDE1LCAgIDUxMTEsICAyNjU1IH0sCisgICAgeyAgIDI3MjQsICAtMjE1OCwgICA2NzE1LCAgLTgyMiB9LAorICAgIHsgICAxODMyLCAgIDEwMDEsICAgNTM4NSwgLTE5MDAgfSwKKyAgICB7ICAgIDkwMCwgICAyMTk4LCAgIDQ0NjQsICAtNTU5IH0sCisgICAgeyAgICA0NDEsICAgICA2OSwgICA1OTIxLCAtMTc0MyB9LAorICAgIHsgIC0xMTYxLCAgICA3MzgsICAgNjczMiwgIC0zMDggfSwKKyAgICB7ICAgIDI1NywgICAyMDM1LCAgIDQwOTEsICAgNzM2IH0sCisgICAgeyAgIDE2MDcsICAgMTI4OCwgICA0MzU1LCAgIC0yMyB9LAorICAgIHsgICAgLTEzLCAgIDEzMTYsICAgNDE4MCwgIDE2NzIgfSwKKyAgICB7ICAgMTUxMSwgICAxMzM2LCAgIDMwNTcsICAxNDM1IH0sCisgICAgeyAgIDIxODksICAtMzgxMywgICA0NTMwLCAgIDkzOSB9LAorICAgIHsgICAzNjMyLCAgIC03MDYsICAgMjY0NiwgIDEzNzUgfSwKKyAgICB7ICAgNDI2NiwgIC0zNzYxLCAgIDQyNDEsICAxMDc3IH0sCisgICAgeyAgIDMxMDEsICAgLTQyNywgICA1MjczLCAtMTIwMiB9LAorICAgIHsgICAyMjkzLCAgICAyNzYsICAgNDgxMCwgIC0zMTMgfSwKKyAgICB7ICAgMzQzMCwgIC0xODUxLCAgIDMxMDEsICAyMDQ1IH0sCisgICAgeyAgIDM0NTMsICAtMjk3OSwgICA1MTQyLCAgIDk0MiB9LAorICAgIHsgICAxNjgzLCAgLTMyODEsICAgNDgwMiwgIDIwMDIgfSwKKyAgICB7ICAgMzk1NCwgIC00NzE1LCAgIDU2MTEsICAgNTc4IH0sCisgICAgeyAgIDEyNzIsICAgLTE1NSwgICA1MDg1LCAgIDQ1NCB9LAorICAgIHsgICAgMTI4LCAgIC0xOTQsICAgNTA5NSwgIDE0MDkgfSwKKyAgICB7ICAgIDgyMCwgICAgODgwLCAgIDU3OTcsIC0yNjU4IH0sCisgICAgeyAgLTEwOTUsICAgIDY1NiwgICA1Nzc0LCAgMTA5NSB9LAorICAgIHsgICAgODEzLCAgLTE2NjksICAgNDMyMCwgLTMyNTEgfSwKKyAgICB7ICAgLTExOSwgICAgNTE4LCAgIDYzNzIsICAtNjUxIH0sCisgICAgeyAgIDI5MjIsICAtNDI5OSwgICA2MTE1LCAgLTg3NyB9LAorICAgIHsgICA0MjA1LCAgLTQyNzMsICAgNDAwNCwgIDI2NDIgfSwKKyAgICB7ICAtMTIxMSwgIC0zODkyLCAgICAyMjQsICAzMTI3IH0sCisgICAgeyAgICAtMzQsICAtNDM3MSwgICAxMzIxLCAgMjMxOCB9LAorICAgIHsgICAgIDc3LCAgLTYzMjYsICAgMTIwMSwgICA4MjggfSwKKyAgICB7ICAgMzk5NSwgIC0zNzc1LCAgIDE5NTgsICAzMjMzIH0sCisgICAgeyAgICAxNzgsICAtMzMwMSwgICAxOTg1LCAgMzMxOCB9LAorICAgIHsgICAyMzMwLCAgLTM4MDEsICAgMTAzMywgIDMxOTUgfSwKKyAgICB7ICAgMTQxMywgIC01NTM2LCAgICA4MjYsICAxNzA5IH0sCisgICAgeyAgIDI0NjgsICAtMzQ5OSwgICAzNjUzLCAgMzYzMSB9LAorICAgIHsgICAgNzQxLCAgLTQ2MTcsICAgMTcyMywgIDIwMDggfSwKKyAgICB7ICAgMTI0NiwgIC0zMDQzLCAgIDI5NzgsICAzOTQ5IH0sCisgICAgeyAgIC0zNDMsICAtNDMwOCwgICAyMjU4LCAgMjE4OSB9LAorICAgIHsgICAtNjgyLCAgLTQ2NDAsICAgIDQ1NCwgIDIyNzIgfSwKKyAgICB7ICAgMTIzNiwgIC00ODI5LCAgIDI0OTEsICAxNjQyIH0sCisgICAgeyAgIC01MTIsICAtMzc2NiwgICAxMTgyLCAgMzA1MiB9LAorICAgIHsgICAgMTE5LCAgLTM5MzksICAgMzcxMiwgICA5NzEgfSwKKyAgICB7ICAtMTE0NSwgIC00NjI0LCAgIDEzNjAsICAyMjgxIH0sCisgICAgeyAgICAxMDEsICAtNDc0NiwgICAyODY2LCAgMTI1NSB9LAorICAgIHsgIC0xNTAwLCAgLTU0NTUsICAgIDUzOSwgIDE2MzcgfSwKKyAgICB7ICAgLTk2OSwgIC01OTA5LCAgIDE0MTQsICAxMTI4IH0sCisgICAgeyAgLTEyNjEsICAtNDkzOSwgICAtMjMxLCAgMjAyMiB9LAorICAgIHsgICAtMjI2LCAgLTUzNDUsICAgMTIwNywgICA3MDUgfSwKKyAgICB7ICAgMjcxMiwgIC01MTA5LCAgIDMyMDUsICAxODY2IH0sCisgICAgeyAgIC00NzYsICAtNTkxMywgICAgMjczLCAgMTIwOCB9LAorICAgIHsgIC0yMDM5LCAgLTQ0NjQsICAgIDYyNCwgIDI1NDUgfSwKKyAgICB7ICAtMjM1MSwgIC0zOTMwLCAgIDIwMTksICAyNjczIH0sCisgICAgeyAgLTI2NzUsICAtNDg0OSwgICAxNTIyLCAgMTk5MCB9LAorICAgIHsgIC0xNTI0LCAgLTM0NjEsICAgMTQ0NiwgIDMyMDQgfSwKKyAgICB7ICAgIDQ3NywgIC01MzE0LCAgIDE3MTAsICAxNTc3IH0sCisgICAgeyAgICA2NTYsICAtMzcyOSwgICAyMzQ2LCAgMjUxMSB9LAorICAgIHsgICAgNTUwLCAgLTU5MTcsICAgMTk3NSwgIDEwNDAgfSwKKyAgICB7ICAgMTcyOCwgIC00NzA0LCAgIDMwNjcsICAxMDU4IH0sCisgICAgeyAgICAgLTksICAtNTI0NywgICAgNTA2LCAgMTc2MCB9LAorICAgIHsgICAtNTc0LCAgLTUxMzUsICAgMTY3NSwgIDE2NzIgfSwKKyAgICB7ICAgMjEyOSwgIC0zNzgxLCAgIDM0NDQsICAyMzEzIH0sCisgICAgeyAgIDExNDQsICAtNDQzOSwgICAyMjE0LCAgMjUyOSB9LAorICAgIHsgICAxMjkyLCAgLTQxNjAsICAgMzE4NSwgIDE4MzMgfSwKKyAgICB7ICAgMjQ0NSwgIC0zMjYyLCAgIDI1MzQsICAzMjI3IH0sCisgICAgeyAgIDIyNjYsICAtNDQwMSwgICAyMDIzLCAgMjQwMCB9LAorICAgIHsgICAtNTg3LCAgLTM2MDIsICAgMzQwOCwgIDIwNjcgfSwKKyAgICB7ICAgLTg4NSwgIC00OTUxLCAgIDMyMjgsICAxMTc0IH0sCisgICAgeyAgIC03MjgsICAtMjcxMSwgICAyODA3LCAgMzU1MiB9LAorICAgIHsgICAxMDE5LCAgLTMwNDMsICAgMzE5NSwgIDI5NTQgfSwKKyAgICB7ICAgMTg4OCwgIC00NjE1LCAgIDExNDAsICAyNDU0IH0sCisgICAgeyAgICA2NjAsICAtNTYxNiwgICAgNzU0LCAgIDgwMCB9LAorICAgIHsgIC0xOTc1LCAgLTUzNzEsICAgMTY0OSwgIDE1ODUgfSwKKyAgICB7ICAtMTU0NCwgIC01NDM2LCAgIDI0MjIsICAxMDgxIH0sCisgICAgeyAgIC00MjIsICAtNTg4MiwgICAyMzkwLCAgIDc1MCB9LAorICAgIHsgICAxMzM2LCAgLTU1NTcsICAgMjQ0MSwgIDEyMzAgfSwKKyAgICB7ICAgIDEzNiwgIC00MDAxLCAgICAyNjcsICAyODU0IH0sCisgICAgeyAgIC01MjIsICAtMzI4OSwgICAyMjI2LCAgMjcyOCB9LAorICAgIHsgICAtOTcxLCAgLTQ1ODAsICAgMjQ3MSwgICA3MDggfSwKKyAgICB7ICAgIDcwNCwgIC01MzA2LCAgIDMzMDAsICAxMDAxIH0sCisgICAgeyAgICAzMjUsICAtMzQ2NCwgICAzNTU1LCAgMjM5OCB9LAorICAgIHsgICAgNzk0LCAgLTM2ODYsICAgIDg0OCwgIDMxNjkgfSwKKyAgICB7ICAgIDY2MCwgIC0zMDE3LCAgIDQ1ODQsICAzMjQyIH0sCisgICAgeyAgLTE0ODYsICAtMzk3OCwgICAyMTcwLCAgMTY0NCB9LAorICAgIHsgIC0xNjE1LCAgLTQ2NTAsICAgMjY4OCwgIDE4NDQgfSwKKyAgICB7ICAgIDc1MCwgIC00NTc4LCAgICA1MzgsICAyMjM5IH0sCisgICAgeyAgIDE2NjgsICAtNTg0OSwgICAxNDU1LCAgMTAzMSB9LAorICAgIHsgICAzNDg2LCAgLTQ2ODEsICAgMjAzMCwgIDIxODMgfSwKKyAgICB7ICAgMjY0MiwgIC01NDI5LCAgIDE2OTYsICAxNzYxIH0sCisgICAgeyAgIDQ0OTEsICAtNDUwMiwgICAzNTM4LCAgMjc2NyB9LAorICAgIHsgICAzNTQ1LCAgLTQ1MjgsICAgMzUxNCwgIDI5ODIgfSwKKyAgICB7ICAgMzI2OSwgIC0zNjc2LCAgIDI3NTgsICAzOTY2IH0sCisgICAgeyAgIDU1NzIsICAgMTE0NiwgICAgMjA5LCAtMzM3OSB9LAorICAgIHsgICA3NDU5LCAgIDEwNTMsICAgIDU5MywgLTE4OTYgfSwKKyAgICB7ICAgNDQ4MCwgICAgMjAwLCAgIC0zMTAsIC00MjU5IH0sCisgICAgeyAgIDU1NzcsICAgLTkzOSwgICAgMjQyLCAtMzk5MiB9LAorICAgIHsgICA4MTQyLCAgICA0NDIsICAgMTI1NywgLTMwODMgfSwKKyAgICB7ICAgNTQ0MiwgICAxMjYxLCAgIDE0MjQsIC0zMjM2IH0sCisgICAgeyAgIDYyNjAsICAgLTE4MywgICAzMTI1LCAtMjUzMiB9LAorICAgIHsgICA3MTc5LCAgICA4ODksICAgMTYxOCwgLTI1NDggfSwKKyAgICB7ICAgNjQxNiwgICAgOTMyLCAgIDIzNzksIC0yNDg3IH0sCisgICAgeyAgIDcwOTQsICAgMjU2MCwgICAgOTYxLCAtMzM5MiB9LAorICAgIHsgICA3MzIyLCAgICA0NjMsICAgMjczMiwgLTM3MzUgfSwKKyAgICB7ICAgNjYzMiwgICAxNTc3LCAgIDE5MTIsIC0zMjcyIH0sCisgICAgeyAgIDYzMTIsICAgMTM0OSwgICAzMDI4LCAtMzQ2MCB9LAorICAgIHsgICA2MTA1LCAgICAzODYsICAgMTIxMywgIC05NzcgfSwKKyAgICB7ICAgNTQ3OCwgICAxMTU4LCAgIDExMTQsICAtNDg2IH0sCisgICAgeyAgIDY0OTMsICAgIDQxMCwgICAxNjg2LCAtMjE4MCB9LAorICAgIHsgICA2Mzc4LCAgIDE4ODEsICAgMTMzMywgLTIyNDAgfSwKKyAgICB7ICAgNTcxMSwgICAgODEyLCAgIDE5NTgsIC0xMzAwIH0sCisgICAgeyAgIDY4NDQsICAgIDg3NywgICAgNzMwLCAtMTE4OSB9LAorICAgIHsgICA2ODI0LCAgIC0yNDUsICAgMjI0OSwgLTIwMDAgfSwKKyAgICB7ICAgNzUxNSwgICAxNTIxLCAgIDEyNTEsIC0zMDU4IH0sCisgICAgeyAgIDY2OTcsICAgMTA1MSwgICAxMzAwLCAtMTc0OSB9LAorICAgIHsgICA2NDc2LCAgIDE0MjUsICAgIDgxMSwgLTI3NzMgfSwKKyAgICB7ICAgNzM1MCwgICAgNDY1LCAgICAtNzYsIC0yODQ5IH0sCisgICAgeyAgIDY5NzUsICAgMjA5NSwgICAgNTY3LCAtMjQ5MiB9LAorICAgIHsgICA0NjkxLCAgIDE3MzYsICAgMjY2MCwgLTIyODkgfSwKKyAgICB7ICAgNzgzNywgICAxNDU2LCAgICAzNDAsIC0yNzY3IH0sCisgICAgeyAgIDc5MzAsICAgIDUwNywgICAgODM4LCAtMjA3NCB9LAorICAgIHsgICA2MTA2LCAgIDE1MDIsICAgIDc2NiwgLTExMTAgfSwKKyAgICB7ICAgNDg5MSwgICAtNjU5LCAgICA4MzUsIC0zOTU0IH0sCisgICAgeyAgIDcyNTAsICAgIDE0MSwgICAxMzY5LCAtMTUyMyB9LAorICAgIHsgICA3NjUxLCAgICAgNjcsICAgMTY1MSwgLTIyOTggfSwKKyAgICB7ICAgNzM2NCwgICAtMzA1LCAgICA2MDEsIC0zMTMyIH0sCisgICAgeyAgIDcxNzksICAgIDE5MywgICAyNDkxLCAtMjg3MSB9LAorICAgIHsgICA2NTA0LCAgIC0yNzIsICAgMjE2NywgLTEzMjIgfSwKKyAgICB7ICAgNDQ1NiwgICAgOTgzLCAgIDIzMDAsICAtNDIxIH0sCisgICAgeyAgIDQ4MTcsICAgIDQ1NywgICAxNjk1LCAgIDM3MSB9LAorICAgIHsgICA2OTE0LCAgICA1NTUsICAgIDg1MCwgLTMxNTkgfSwKKyAgICB7ICAgNTkwNCwgICAxMDMwLCAgICAyMDIsIC0xOTU5IH0sCisgICAgeyAgIDYyNTgsICAgIDg4MCwgICAyMjMzLCAtNDUwMyB9LAorICAgIHsgICA2MDI5LCAgICAgMTAsICAgMjEzMCwgLTM2MDAgfSwKKyAgICB7ICAgNjQ0OSwgICAgOTg1LCAgIDExMjksIC0zOTYzIH0sCisgICAgeyAgIDY2MTYsICAgIC0xOCwgICAtMTExLCAtMzI4NSB9LAorICAgIHsgICA0NDk2LCAgICA3NzUsICAgIDgxNywgLTQyNzYgfSwKKyAgICB7ICAgNjEzNCwgICAyMzM4LCAgIDE0NzAsIC0yOTczIH0sCisgICAgeyAgIDY5MTEsICAgIDE1MiwgICAgNDMwLCAtMTk0NiB9LAorICAgIHsgICA0MDUzLCAgICA5OTEsICAgMzIxOCwgLTExOTMgfSwKKyAgICB7ICAgNTQzNSwgICAxMjg1LCAgIDMxMjQsIC0yNDEyIH0sCisgICAgeyAgIDU1MDcsICAgMTgzNiwgICAxOTM1LCAtMTk4OCB9LAorICAgIHsgICA1MjQwLCAgICA2ODksICAgMjE4OSwgLTI2NzAgfSwKKyAgICB7ICAgNjYzOCwgICAxNzE5LCAgICA2MDYsIC0xNzk5IH0sCisgICAgeyAgIDU1NTYsICAgLTE4MCwgICAgMTI5LCAtMjU5NSB9LAorICAgIHsgICA1NjQ0LCAgIDE5MTgsICAgMTI4MSwgLTQzMTYgfSwKKyAgICB7ICAgNjQxMCwgICAxMDg4LCAgIC0yODIsIC0zMTE3IH0sCisgICAgeyAgIDY1MDMsICAgMTg0MSwgICAgMzEyLCAtMzUxNCB9LAorICAgIHsgICA2OTQ3LCAgICAgMjAsICAgMTM1OCwgLTM4ODYgfSwKKyAgICB7ICAgNTQ2NCwgICAyMTA5LCAgIDIzOTgsIC0zMTk0IH0sCisgICAgeyAgIDU2MTYsICAgLTQwNywgICAyMTQwLCAgLTQ5OCB9LAorICAgIHsgICA2MTIxLCAgIDI3MDcsICAgMjM3OSwgLTQwOTYgfSwKKyAgICB7ICAgNzMwMywgICAxODQ2LCAgIDIyNjYsIC00MDk1IH0sCisgICAgeyAgIDU0NDQsICAgIDQ3MCwgICAyNzE4LCAtMTU1MyB9LAorICAgIHsgICA1ODE3LCAgIC02NDUsICAgMzI4NSwgLTEzNDkgfSwKKyAgICB7ICAgNTYyNSwgICAxNDI3LCAgIDExMDMsIC0xOTkxIH0sCisgICAgeyAgIDYwNDEsICAgLTgwNiwgICAxMTk2LCAtMjk0MyB9LAorICAgIHsgICAzMDUwLCAgLTU3MjIsICAgNDA3MCwgLTU0NjAgfSwKKyAgICB7ICAgMzQyMCwgIC00Mzg2LCAgIDQwNzgsIC01MTU1IH0sCisgICAgeyAgIDYwMjAsICAtMzk4MiwgICA3MjY4LCAtMjY4OSB9LAorICAgIHsgICA3NTAyLCAgLTQzMTcsICAgNzg5NCwgLTM5NzMgfSwKKyAgICB7ICAgNDE1NiwgIC0zNTU4LCAgIDUyNDcsIC00MzE2IH0sCisgICAgeyAgIDQ3MjUsICAtNDQwMSwgICA3MjkwLCAtMTU0MCB9LAorICAgIHsgICA2Njg4LCAgLTUxMjIsICAgODIxNiwgLTMyMTAgfSwKKyAgICB7ICAgOTE3NiwgIC02NTc2LCAgIDkyNzYsIC00OTYzIH0sCisgICAgeyAgIDg3MDYsICAtNTcwOCwgICA3OTg3LCAtNDYyMSB9LAorICAgIHsgICA3MDYwLCAgLTM1MzUsICAgNjUzMiwgLTMzMDggfSwKKyAgICB7ICAgNTYwMCwgIC0yNzE5LCAgIDUzNjMsIC0xNTY4IH0sCisgICAgeyAgIDQ2NjEsICAtMjgwMywgICA2MjYzLCAtNDcxNiB9LAorICAgIHsgICAzNjczLCAgLTM2MzYsICAgNjE0NywgLTM0MzMgfSwKKyAgICB7ICAgNTMwNSwgIC0yNTg1LCAgIDYwNzMsIC0yNjM4IH0sCisgICAgeyAgIDc2MTQsICAtMTk2MiwgICA2MDc5LCAtNTI2NiB9LAorICAgIHsgICA2NzYwLCAgLTMzNjYsICAgNzM4MiwgLTQzMjIgfSwKKyAgICB7ICAgNjM4NSwgIC0zODgzLCAgIDQ3OTcsIC0xMzUzIH0sCisgICAgeyAgIDgxODIsICAtNTEyMCwgICA0Mjk4LCAtNDY0MSB9LAorICAgIHsgICA5MTMwLCAgLTYxOTgsICAgNDk3NSwgLTMwNjMgfSwKKyAgICB7ICAgNzQyMSwgIC01NDM2LCAgIDU1NzYsIC0zNzEzIH0sCisgICAgeyAgIDM0ODMsICAtNDg5OCwgICA1NDQzLCAtMjc0NSB9LAorICAgIHsgICA0OTA3LCAgLTU2NDMsICAgNjM5MCwgLTQxMDUgfSwKKyAgICB7ICAgODExOSwgIC03MDA4LCAgIDc5OTIsIC02NzY0IH0sCisgICAgeyAgIDY1MjgsICAtNjEyMiwgICA2OTY3LCAtNTU5MCB9LAorICAgIHsgICA1ODkwLCAgLTQxOTAsICAgNjYyNCwgLTU2ODggfSwKKyAgICB7ICAgNjgxNSwgIC03OTM0LCAgIDcyNzUsIC01NDU2IH0sCisgICAgeyAgIDU0MzQsICAtNDMwNiwgICA1MTY5LCAtNTM3OCB9LAorICAgIHsgICA0MzY0LCAgLTY0MzYsICAgNTM3NiwgLTI2MDQgfSwKKyAgICB7ICAgODE1MiwgIC0zNDA0LCAgIDU5MTMsIC01MDQ4IH0sCisgICAgeyAgIDc5ODMsICAtNDg2MywgICA0MjYyLCAtMjQ2MSB9LAorICAgIHsgICA4MDIzLCAgLTYxODgsICAgNjIzOCwgLTUwNjIgfSwKKyAgICB7ICAgNjc1MywgIC0zNjkyLCAgIDM5MzUsIC0zNzIzIH0sCisgICAgeyAgIDY4MjYsICAtNDc2MCwgICAzMjg0LCAtNDA1MSB9LAorICAgIHsgICA3MjI0LCAgLTc0MjMsICAgNDQ5MiwgLTM4NzUgfSwKKyAgICB7ICAgNjkwNCwgIC0yNTkwLCAgIDY1ODcsIC02MjQ4IH0sCisgICAgeyAgIDYxMDYsICAtMTk0NCwgICA3MzQ1LCAtNTUwNiB9LAorICAgIHsgICA0OTU2LCAgLTI5OTAsICAgNzgwOCwgLTMxNDYgfSwKKyAgICB7ICAgNjkwOCwgIC02ODg1LCAgIDU5NDksIC0xMjg4IH0sCisgICAgeyAgIDcxNjIsICAtNjA1OCwgICAzNDE5LCAtMzQwMSB9LAorICAgIHsgICA3MDE1LCAgLTcwODAsICAgNjkwNywgLTMwMTggfSwKKyAgICB7ICAgNjk3MSwgIC02ODMyLCAgIDU2NDYsIC0zMjczIH0sCisgICAgeyAgIDgwMTQsICAtNTU0NiwgICA1NDcxLCAtMTU0NCB9LAorICAgIHsgICA2NzkyLCAgLTIyMjAsICAgNTEwNSwgLTI4NzkgfSwKKyAgICB7ICAgODQ5NCwgIC0zOTc0LCAgIDQ0MDgsIC0zOTk5IH0sCisgICAgeyAgIDk1OTEsICAtNDg2NiwgICA2MDI3LCAtNDU1OCB9LAorICAgIHsgICA1MjY0LCAgLTUxNjEsICAgNjEwMSwgIC03MzggfSwKKyAgICB7ICAgNTgwMywgIC02MTQxLCAgIDUxOTcsIC01MjMxIH0sCisgICAgeyAgIDQ2NTcsICAtNjgyMiwgICAzMjMyLCAtNTE4OSB9LAorICAgIHsgICA0NzkxLCAgLTUxMzUsICAgMzgwOSwgLTQ2NjUgfSwKKyAgICB7ICAgNjEwOCwgIC01MTAzLCAgIDIzNzksIC0zODczIH0sCisgICAgeyAgIDQ2ODAsICAtMzkwOSwgICAzMjM0LCAtNTA5MyB9LAorICAgIHsgICA1ODAyLCAgLTM4NTMsICAgMzc5NSwgLTQ5ODQgfSwKKyAgICB7ICAgNDM2MCwgIC03NDgzLCAgIDQ4MDIsIC0zODc3IH0sCisgICAgeyAgIDU0MjksICAtNzUxNywgICA1OTExLCAtMzcxNyB9LAorICAgIHsgICA2ODY2LCAgLTIyODAsICAgNDg4MCwgLTQ2MzQgfSwKKyAgICB7ICAxMDEzMSwgIC00NjI4LCAgIDQ0MTQsIC00MDkyIH0sCisgICAgeyAgMTA4MTEsICAtNTE4OSwgICA3NzQ2LCAtNTMzNyB9LAorICAgIHsgICA1NjYzLCAgLTg5NDEsICAgNTI4NywgLTU2ODAgfSwKKyAgICB7ICAgODAyMywgIC01OTkxLCAgIDc0MDMsIC0yNzk2IH0sCisgICAgeyAgIDk2NjksICAtNjkxOSwgICA2NTI1LCAtNDkzMiB9LAorICAgIHsgICA3Mjc1LCAgLTM3OTYsICAgNDk2MiwgLTI1NDcgfSwKKyAgICB7ICAgODg0OCwgIC00ODA2LCAgIDU2NzcsIC0zMDgwIH0sCisgICAgeyAgIDgxMjgsICAtNDMwOCwgICA3NzQ5LCAtNjU2OSB9LAorICAgIHsgICA0MDMyLCAgLTUxOTYsICAgMjI4MiwgLTYyMzkgfSwKKyAgICB7ICAgNjU5MywgICAgNzAwLCAgIC0yMjksICAgMzA0IH0sCisgICAgeyAgIDgyNjAsICAgIDUzOSwgICAgLTY2LCAtMTI1OSB9LAorICAgIHsgICA2NjA1LCAgICAxNzYsICAgLTgxNCwgIC0xMDkgfSwKKyAgICB7ICAgODA1NywgICAgICAwLCAgICAgLTEsICAtMTM2IH0sCisgICAgeyAgIDczODIsICAgIC0zOCwgICAtNDg0LCAtMTEyOSB9LAorICAgIHsgICA4MzczLCAgIC05MjksICAgIDY4MiwgIC00NTQgfSwKKyAgICB7ICAgNzY3NCwgICAgNjkwLCAgLTEyNzgsICAgNTQ2IH0sCisgICAgeyAgIDczMjYsICAgLTUxNywgICAgNDA2LCAtMTI4MyB9LAorICAgIHsgICA3NjEyLCAgLTE3MTUsICAtMTE2NywgIDExNzUgfSwKKyAgICB7ICAgODU5MCwgICAgNDQxLCAgIC03ODIsICAtNzEwIH0sCisgICAgeyAgIDg1NzIsICAtMTIwMiwgICAtMjkxLCAgIDI2MCB9LAorICAgIHsgICA3MzA4LCAgIC0xNDcsICAtMTc4NSwgICA0MTQgfSwKKyAgICB7ICAgNjc4NywgICAtMzUzLCAgIC02NzIsICAgOTM0IH0sCisgICAgeyAgIDUxNzcsICAgLTEzMywgICAgMTc5LCAgICA4MiB9LAorICAgIHsgICA0MTYxLCAgICAtMzQsICAgIDQ0NywgIDE0OTcgfSwKKyAgICB7ICAgNTk5NywgICAtOTAyLCAgIDE1MzMsICAtMTIxIH0sCisgICAgeyAgIDU3MjcsICAgLTg3MSwgIC0xMzcwLCAgIDk0NSB9LAorICAgIHsgICA4Mzg2LCAgIC0yNTIsICAgIDI5MywgIC04MjMgfSwKKyAgICB7ICAgNjU3MywgIC0xMzU0LCAgICA2ODIsICAgNjE2IH0sCisgICAgeyAgIDc2NTAsICAtMjA5NiwgICAgNzI1LCAgIDQ1NyB9LAorICAgIHsgICA4MTIyLCAgICAgNzgsICAgIDYzNiwgLTE0MDAgfSwKKyAgICB7ICAgODQyMSwgICAgNDI4LCAgLTE2MjAsICAgMTMxIH0sCisgICAgeyAgIDczNDEsICAtMTI5MiwgICAtNzE3LCAgIDE4NiB9LAorICAgIHsgICA3OTk4LCAgICAtNDksICAgLTcyMCwgICAyNjYgfSwKKyAgICB7ICAgNTk4NywgICAtMzUxLCAgICA2NjksICAgODQ0IH0sCisgICAgeyAgIDczMTQsICAtMTYyMCwgICAgMjUwLCAgLTYwMyB9LAorICAgIHsgICA3MjE5LCAgLTE1NjIsICAgLTU3MiwgIDE5OTQgfSwKKyAgICB7ICAgODY4MiwgICAtMzU4LCAgIC0yOTAsICAtMzg4IH0sCisgICAgeyAgIDU4MTAsICAgIDE1NSwgICAtMTc4LCAgMTE5OSB9LAorICAgIHsgICA3MjQ2LCAgICAtMTIsICAgMTA0MiwgIC03ODYgfSwKKyAgICB7ICAgNzM1NywgICAtOTIzLCAgIDE0NjgsICAtNDc1IH0sCisgICAgeyAgIDc4MDEsICAgIDYyMSwgICAtMjEyLCAgLTcyNCB9LAorICAgIHsgICA1MzQ2LCAgIC01MTQsICAgMTIxMCwgIDEzNTYgfSwKKyAgICB7ICAgODQ1OSwgICAgIDM2LCAgIC0xMjcsICAtNzc5IH0sCisgICAgeyAgIDY4NzgsICAtMjQyOSwgICAgODU0LCAgMTc1MCB9LAorICAgIHsgICA3MjgwLCAgLTE0MDEsICAtMTM1MywgIDI4NDUgfSwKKyAgICB7ICAgNzU3OSwgIC0yMTQ4LCAgLTE0NjMsICAyMDg3IH0sCisgICAgeyAgIDY2MzcsICAgIDk0NiwgICAtODcyLCAgIDc1MCB9LAorICAgIHsgICA0ODA3LCAgLTExMDAsICAgMTI4OSwgIDI2MDIgfSwKKyAgICB7ICAgNDQ5NSwgICAgMjE5LCAgIDE1NTEsICAxMTI4IH0sCisgICAgeyAgIDc2MzksICAgIDUwNiwgICAgNDQ2LCAtMTEwNyB9LAorICAgIHsgICA2MzU5LCAgICAxODgsICAgMTAwOSwgIC0xMTUgfSwKKyAgICB7ICAgNjY0MSwgIC0xODIwLCAgIDE2NTUsICAgNzIzIH0sCisgICAgeyAgIDUzOTQsICAtMjM4MiwgICAxNjA0LCAgMjU0MiB9LAorICAgIHsgICA2MDIxLCAgLTI2NDQsICAgMjM5NiwgIDE0MDcgfSwKKyAgICB7ICAgNDY5OCwgICAgODgyLCAgICAyNDUsICAxNTI1IH0sCisgICAgeyAgIDgxMDMsICAgIDU3MywgICAtNzk4LCAgLTM0OSB9LAorICAgIHsgICA4MDQ1LCAgIC01MTksICAgIDk5NywgLTEwOTIgfSwKKyAgICB7ICAgNzU3MSwgICAtMTIyLCAgICAyMjcsICAtMzM4IH0sCisgICAgeyAgIDUzNDcsICAtMTIwMCwgICAgNjMwLCAgMTcxOCB9LAorICAgIHsgICA3MDcwLCAgICA3OTAsICAgIDIxOCwgIC01NDQgfSwKKyAgICB7ICAgNzQ0MCwgICAgNzI4LCAgIC01MjcsICAgLTIwIH0sCisgICAgeyAgIDY0MDIsICAgLTM1NSwgICAgMTk3LCAgLTczNiB9LAorICAgIHsgICA0MDMxLCAgICA3NzEsICAgIDg2NiwgIDE4OTUgfSwKKyAgICB7ICAgNjAwOSwgICAgODk2LCAgICA0NDUsICAgLTMxIH0sCisgICAgeyAgIDUxNjAsICAgMTA5OCwgICAtODU2LCAgMTc4NCB9LAorICAgIHsgICA3OTgwLCAgIC04ODYsICAtMTI5MywgIDEzOTYgfSwKKyAgICB7ICAgNjMxOCwgIC0xMzYxLCAgIDI0MjMsICAgMjUyIH0sCisgICAgeyAgIDc1NDcsICAgLTY5OSwgICAgMTMzLCAgIDUwNiB9LAorICAgIHsgICA4NTYyLCAgLTIzNDQsICAgIDk0MCwgICAyNjQgfSwKKyAgICB7ICAgNTg5MCwgICAxMTg3LCAgLTE0MjUsICAyMTk0IH0sCisgICAgeyAgIDY1NTgsICAgLTY0NSwgIC0xMzExLCAgMjYyMSB9LAorICAgIHsgICA0NjM0LCAgLTE2NzEsICAgMjA3NSwgIDE2MjMgfSwKKyAgICB7ICAgNTYxNCwgICAgMTA1LCAgIC04MTYsICAyMzc2IH0sCisgICAgeyAgIDY2NDYsICAgMTU1OCwgIC0xMzY1LCAgIDYzMCB9LAorICAgIHsgICA2OTk4LCAgIDExNTAsICAtMjExNywgIC05OTAgfSwKKyAgICB7ICAgNjU1NSwgICAyMzExLCAgLTEwOTMsIC0xNzgzIH0sCisgICAgeyAgIDY2ODIsICAgMTQzMCwgIC0yMzkxLCAtMTk0MCB9LAorICAgIHsgICA3ODYxLCAgIDE1NTUsICAtMjk3NywgLTExODggfSwKKyAgICB7ICAgNjc0NSwgICAxNzIzLCAgIC00NTksIC0yMDg1IH0sCisgICAgeyAgIDc1MDQsICAgMTIyOSwgIC0xNjY2LCAtMjA2MCB9LAorICAgIHsgICA3OTM3LCAgICA2NzEsICAtMjEyOCwgLTE1MjkgfSwKKyAgICB7ICAgNzEzOSwgICAgOTkxLCAgIC03MzUsIC0yNjMyIH0sCisgICAgeyAgIDY4NjcsICAgMTU5MiwgIC0xMzAzLCAtMjMyNCB9LAorICAgIHsgICA2NDAxLCAgIDIyMzAsICAtMTczMiwgLTI1MDggfSwKKyAgICB7ICAgNzIwMSwgICAyMTg0LCAgLTIxNjksIC0xOTg4IH0sCisgICAgeyAgIDY2MzYsICAgMjE5MCwgICAtOTk1LCAtMjg0MCB9LAorICAgIHsgICA3NjIwLCAgIDIzMDYsICAtMjA4OSwgIC02NTEgfSwKKyAgICB7ICAgNzU4NCwgICAxODc1LCAgLTE0MzgsICAtNjMxIH0sCisgICAgeyAgIDkyMTQsICAgMTU2MSwgIC0yNDY0LCAtMTEzOSB9LAorICAgIHsgICA2MTU0LCAgIDEzMTgsICAtMTIzNywgLTI5MTcgfSwKKyAgICB7ICAgNzkxNywgICAyODQ3LCAgLTE3OTcsIC0xNTk5IH0sCisgICAgeyAgIDgzMDksICAgMjAyOSwgIC0yNTU1LCAgLTQ2NSB9LAorICAgIHsgICA4MjA0LCAgIDEyODIsICAgLTU4NCwgLTI0MDUgfSwKKyAgICB7ICAgODQ0MCwgICAxMDM1LCAgLTExNDcsIC0xMTM3IH0sCisgICAgeyAgIDcxMDcsICAgMTg1OCwgICAgLTYwLCAtMTU2OCB9LAorICAgIHsgICA2NzgxLCAgIDI5MTIsICAgLTg3MywgLTE0NjMgfSwKKyAgICB7ICAgNzYwMywgICAxMzE2LCAgIC0zMTksIC0xMjQ5IH0sCisgICAgeyAgIDc4MzMsICAgMTMzNSwgICAgLTc4LCAtMTg0OSB9LAorICAgIHsgICA3OTMwLCAgIDExNDEsICAtMTAxNiwgIC02OTUgfSwKKyAgICB7ICAgNzg4MywgICAxNjEwLCAgLTEwMTcsIC0xMzE0IH0sCisgICAgeyAgIDgwNjksICAgMTQwOSwgIC0xODExLCAgLTE5NiB9LAorICAgIHsgICA4MzE5LCAgIDEwMzEsICAgLTU4MiwgLTE1OTAgfSwKKyAgICB7ICAgNTk0OCwgICAxNTM3LCAgLTIxNTMsIC0yMzczIH0sCisgICAgeyAgIDg2ODQsICAgMTE3MSwgIC0xODcxLCAgLTg1MCB9LAorICAgIHsgICA4MzU3LCAgIDI0ODQsICAtMjQxMSwgLTEyOTIgfSwKKyAgICB7ICAgNjUxNiwgICAyMDkyLCAgIC0xOTMsIC0xMTY3IH0sCisgICAgeyAgIDYxMTIsICAgMTY5NywgICAgIDIyLCAgLTUyNSB9LAorICAgIHsgICA3MTYxLCAgICA3MDMsICAgLTYwMiwgLTE4NzkgfSwKKyAgICB7ICAgNjA0NywgICAyMzUxLCAgIC04MDcsICAtMjE5IH0sCisgICAgeyAgIDgwNzIsICAgMTg1NCwgIC0xODE3LCAtMTU1MyB9LAorICAgIHsgICA2OTU2LCAgIDEzMDQsICAgICA3NiwgLTEwMTEgfSwKKyAgICB7ICAgNjYwNywgICAxNDgxLCAgIC01NDQsICAtMTYyIH0sCisgICAgeyAgIDY5NTgsICAgMjU0MSwgICAtMjY1LCAtMTkzOCB9LAorICAgIHsgICA2NDE2LCAgIDI1MTQsICAgLTc3NywgIC04NTAgfSwKKyAgICB7ICAgNzI3MiwgICAyMTEwLCAgIC04OTksIC0xMTcxIH0sCisgICAgeyAgIDc3NDEsICAgMjE1MywgICAtMjgzLCAtMjYxNCB9LAorICAgIHsgICA2NDgyLCAgIDIwNDEsICAtMTc1OCwgLTEyMjEgfSwKKyAgICB7ICAgNjc2MiwgICAgOTQwLCAgLTE4NjIsIC0yMjgxIH0sCisgICAgeyAgIDU2MTAsICAgMTE5NCwgIC0xNjkxLCAtMTU2MSB9LAorICAgIHsgICA3ODMzLCAgIDIxNjQsICAgLTgyMywgLTE5NTIgfSwKKyAgICB7ICAgNTQ2MCwgICAxNDM4LCAgIC04NDgsICAxMTg5IH0sCisgICAgeyAgIDYwMTEsICAgMTM3NywgICAtNzcxLCAtMTU1NyB9LAorICAgIHsgICA3Njc5LCAgICA1NDQsICAtMTEzNCwgLTIyMTQgfSwKKyAgICB7ICAgNzIwOSwgICAxMjkyLCAgLTI3MTQsIC0xNTY0IH0sCisgICAgeyAgIDU1NjcsICAgMTIwMCwgICAtNDA0LCAgLTE2OSB9LAorICAgIHsgICA1ODUzLCAgIDE0NjEsICAtMTQ2NSwgIC01MTggfSwKKyAgICB7ICAgNjc4MiwgICAgNjg5LCAgIC04NDQsICAtODYwIH0sCisgICAgeyAgIDczMzAsICAgMTMzNywgIC0xMTUyLCAgIC03MSB9LAorICAgIHsgICA3MTg5LCAgIDE1MDYsICAgLTY1MywgIC02ODUgfSwKKyAgICB7ICAgNjg2MCwgICAyMTE2LCAgLTE0MDMsICAtMjQwIH0sCisgICAgeyAgIDg4MDQsICAgMTUxNiwgIC0xMzkxLCAtMTc2MCB9LAorICAgIHsgICA3MjEwLCAgIDI2ODksICAtMTQ5OCwgIC05ODkgfSwKKyAgICB7ICAgNzAzMCwgICAzMDIyLCAgLTE0NDEsIC0yMDgzIH0sCisgICAgeyAgIDU2NDksICAgMTgzNiwgICAtNDA3LCAgIDUyNSB9LAorICAgIHsgICA3NDUxLCAgIDMwOTksICAgLTcxNywgLTI0NjQgfSwKKyAgICB7ICAgNzM4NCwgICAxNjU2LCAgLTIwMDcsICAgMzk4IH0sCisgICAgeyAgIDY1MDQsICAgIDcwNywgIC0xOTE5LCAgLTEzNCB9LAorICAgIHsgIC0xODUxLCAgIDM2MzksICAtMjI3OSwgIC02OTUgfSwKKyAgICB7ICAtNDAzNywgICAxNjQ0LCAgICAtNzcsICAxMzI5IH0sCisgICAgeyAgLTQwMjUsICAgMTk2MCwgIC0xNTY1LCAgLTU2NyB9LAorICAgIHsgIC0zNDMwLCAgIDI0OTUsICAgLTc5NSwgICAzNjggfSwKKyAgICB7ICAtNDc3MSwgICAyNDgwLCAgICA5OTMsICAgNzU2IH0sCisgICAgeyAgLTM0MzEsICAgMjA1OCwgIC0yNTM5LCAgLTk3MSB9LAorICAgIHsgIC0zODAyLCAgIDM0MTgsICAgIDM4MCwgICAyMTcgfSwKKyAgICB7ICAtMzA3NCwgICAzMzUwLCAgLTE2NTIsIC0xMDU2IH0sCisgICAgeyAgLTM3MDUsICAgIDMyNiwgIC0xNjUwLCAgMTUzNSB9LAorICAgIHsgIC0zMTIyLCAgIDEyODEsICAtMTE5MiwgIDE2MDcgfSwKKyAgICB7ICAtNDYwMSwgICAxMzY3LCAgIC05NjgsICAgIDUzIH0sCisgICAgeyAgLTM4MDgsICAgIDk1OCwgICAgIDQ0LCAgMjU2MCB9LAorICAgIHsgIC0yMDc5LCAgIDI1MzAsICAtMTQ4NSwgIDExNjYgfSwKKyAgICB7ICAtMzcwNywgICAgMzQzLCAgLTI4ODksICAgMTgwIH0sCisgICAgeyAgLTUyNDksICAgMTQzMSwgICAgLTMxLCAgIDY4OCB9LAorICAgIHsgIC00OTkwLCAgICAxMjUsICAgLTcwNCwgIDEyNzAgfSwKKyAgICB7ICAtMjc3MSwgICAxMzM0LCAgLTI0NDYsICAgNzQ2IH0sCisgICAgeyAgLTIyOTIsICAgIDk5NCwgIC0xNTI3LCAgMjYzMCB9LAorICAgIHsgIC0xMjYxLCAgIDMwNzAsICAtMjUxOSwgICAyNjggfSwKKyAgICB7ICAtMjU0NCwgICAzODkwLCAgLTEwNTcsICAtNTUyIH0sCisgICAgeyAgLTQ0MjEsICAgIDI1NSwgIC0xOTgwLCAgIDUzMCB9LAorICAgIHsgIC0yOTUxLCAgICA0NTQsICAgIC0xMywgIDM2NDMgfSwKKyAgICB7ICAtMjI2MiwgICAxODE1LCAgIC0zNzAsICAyODgwIH0sCisgICAgeyAgLTIzODMsICAgMzY1NywgICAtNjQ5LCAgIDU3NiB9LAorICAgIHsgIC0zNTQxLCAgIC0xNjEsICAtMTM4OSwgIDI1NTAgfSwKKyAgICB7ICAtNDI0MSwgICAxNTc1LCAgIDEzMjUsICAyNTYxIH0sCisgICAgeyAgLTI3NjcsICAgNDAzNywgICAxMjIxLCAgMTU3OCB9LAorICAgIHsgIC0zNzQ4LCAgIDI2OTcsICAgMTE0OCwgIDE4MDEgfSwKKyAgICB7ICAtNDY4NiwgICAyMzg1LCAgIC0yMjAsICAgICAwIH0sCisgICAgeyAgLTE1MzEsICAgMTY0NSwgIC0yNzUxLCAgMTMyNyB9LAorICAgIHsgICAgLTQ1LCAgIDQwMzIsICAgLTc5OSwgIDIyOTggfSwKKyAgICB7ICAtMjkxNSwgICAyMjgwLCAgICA3MDksICAyNDk1IH0sCisgICAgeyAgLTExOTksICAgMzI3OCwgICAtNDA2LCAgMjM0NiB9LAorICAgIHsgIC0yNDcxLCAgICAxMTYsICAtMjcwNiwgIDIwNjAgfSwKKyAgICB7ICAtMjQ0MCwgICAyMTczLCAgLTI4OTQsICAtMzQ0IH0sCisgICAgeyAgLTMzNzUsICAgMjI4NywgICAxNzgxLCAgMzIyNiB9LAorICAgIHsgIC0yMTUzLCAgIDM1NjgsICAgMTgyNywgIDI5MTggfSwKKyAgICB7ICAgLTg2MiwgICAyMjY3LCAgLTE2MjYsICAyNTI3IH0sCisgICAgeyAgLTI2OTgsICAgMTEzNSwgICAgMzAxLCAgNDIzOSB9LAorICAgIHsgIC0yMzY0LCAgIDIxMjMsICAgMTAxMCwgIDM3MTAgfSwKKyAgICB7ICAtMjQ0NywgICAzMjgxLCAgICAtODEsICAxNDA4IH0sCisgICAgeyAgLTI2NjAsICAgNDczNSwgICAgNDcyLCAgIDI1OCB9LAorICAgIHsgIC0xMDUzLCAgIDMwOTcsICAgMjY4MiwgIDIzOTggfSwKKyAgICB7ICAtMzM2NiwgIC0xMDM3LCAgLTExNTIsICAtODY4IH0sCisgICAgeyAgIC02NDMsICAgNDI0MiwgICAyMjEyLCAgMTI1OSB9LAorICAgIHsgICAgOTcxLCAgIDM5OTEsICAgIDkzNCwgICA2NDMgfSwKKyAgICB7ICAtMTYxNywgICAyMDAyLCAgIDIxMzksICAyMTk1IH0sCisgICAgeyAgLTQ4OTcsICAgIDk3MiwgICAgNzg0LCAgMTcxOSB9LAorICAgIHsgIC0xMjc1LCAgIDI5OTIsICAgMTAzOSwgIDM4MjEgfSwKKyAgICB7ICAgLTM5MiwgICA0OTczLCAgIC0yMDksICAxODIxIH0sCisgICAgeyAgLTEwMjgsICAgNDcxOCwgIC0xNDc5LCAgLTEzNyB9LAorICAgIHsgICAgIDUwLCAgIDM5MTQsICAgIDU1MywgIDIyMTAgfSwKKyAgICB7ICAgIDY3OCwgICA0MzY0LCAgICAzNTksICAxMzAzIH0sCisgICAgeyAgIC01ODIsICAgNDkxMSwgICAgNTE0LCAgMTY3MSB9LAorICAgIHsgICAxMjc2LCAgIDM5MTQsICAtMTI1MiwgIDI5MzQgfSwKKyAgICB7ICAtMTQ5NiwgICAzOTg0LCAgICA4NTcsICAyMzMwIH0sCisgICAgeyAgICA3NzIsICAgNDc0NCwgICAtNjU1LCAgMjMzMiB9LAorICAgIHsgICAtNzk5LCAgIDUyODMsICAgLTQzOSwgICA2MjQgfSwKKyAgICB7ICAgMTM0MSwgICAyOTM3LCAgICA2NTAsICAyMDI3IH0sCisgICAgeyAgLTE3MzksICAgNDg5MiwgICAxMjc1LCAgMTcwMiB9LAorICAgIHsgICAtODkyLCAgIDI1OTYsICAgLTE1MSwgIDM5NTEgfSwKKyAgICB7ICAtMzUzMiwgICAxMDkwLCAgIDEyOTIsICAgIDMyIH0sCisgICAgeyAgICAzMjEsICAgMzE0NiwgICAyNjQ3LCAgMTQ3NSB9LAorICAgIHsgICAgMjY0LCAgIDQxOTksICAtMTU5MSwgIDEzMTcgfSwKKyAgICB7ICAgLTQ1MiwgIC0yMzU3LCAgIDIyNjYsICA0MTkyIH0sCisgICAgeyAgIDMwMjIsICAtMTAzMywgIC0yMzg5LCAgNTY3OCB9LAorICAgIHsgIC0xMTYyLCAgLTEzNDIsICAgMzU0MywgIDQ5OTAgfSwKKyAgICB7ICAgLTQ3NCwgIC0xNDc3LCAgLTEyMjMsICA1MDE2IH0sCisgICAgeyAgIC02OTksICAtMjg1NywgICAgOTAwLCAgMzgzNSB9LAorICAgIHsgICAtNDYxLCAgLTIyNTUsICAgLTExNywgIDQ2MjYgfSwKKyAgICB7ICAgMTIwNCwgIC0yMDYyLCAgLTEyMTEsICA0NDAzIH0sCisgICAgeyAgIDIxOTIsICAtMzAzNSwgICAtMzM3LCAgMzk2NiB9LAorICAgIHsgICAgMTA4LCAgIC04MzEsICAgIDI3OSwgIDU2NDMgfSwKKyAgICB7ICAgMTQ1NywgICAtNjIwLCAgLTI5MDgsICA1Mjc2IH0sCisgICAgeyAgLTI1MjcsICAgIC03OCwgICAxMDg1LCAgNTQ2MCB9LAorICAgIHsgIC0xOTc4LCAgLTE5MTgsICAgLTk0OSwgIDQ3MzMgfSwKKyAgICB7ICAgICAzMiwgICAgMzY3LCAgLTE5MDQsICA1MTY2IH0sCisgICAgeyAgIDE4OTAsICAtMTY2NSwgICAgNDQwLCAgNDc1MiB9LAorICAgIHsgICAtNTE4LCAgIC0zNDgsICAgMjgxNiwgIDQ4OTEgfSwKKyAgICB7ICAgMzY5NSwgIC0yNDkwLCAgLTEzNzQsICA0NjAzIH0sCisgICAgeyAgICAyNDYsICAtMTk2NSwgICAzNTQ5LCAgMzk2OSB9LAorICAgIHsgICAxMTAwLCAgLTMxMTEsICAgIDY1NiwgIDM3MzcgfSwKKyAgICB7ICAtMTM3OSwgICAgODcwLCAgIC00MTQsICA0NTc1IH0sCisgICAgeyAgICA2MjgsICAgLTM1NywgIC0xMjI3LCAgNjE3OSB9LAorICAgIHsgIC0xMTI5LCAgLTEzMTgsICAtMjQ1NywgIDQ1NzYgfSwKKyAgICB7ICAgLTQyNSwgICAgLTk4LCAgICAtNzMsICA2MzM2IH0sCisgICAgeyAgICAzNjcsICAgLTg4NywgICAyOTkwLCAgNDIwNyB9LAorICAgIHsgICAyMDkxLCAgLTEyNTEsICAgMjQ0NCwgIDM1NTcgfSwKKyAgICB7ICAtMTc1OSwgIC0xNjEwLCAgIDIwNDYsICA1MjczIH0sCisgICAgeyAgIDMyMTAsICAgMTQxNCwgICAgLTIwLCAgMjYxNiB9LAorICAgIHsgICAzMzAzLCAgLTI2MzYsICAgMTAwNSwgIDQyMzcgfSwKKyAgICB7ICAgLTMyNywgIC0zMTA3LCAgIC02NDAsICAzNjg3IH0sCisgICAgeyAgIC0xOTcsICAgIDc2NCwgICAgNTcyLCAgNTQ4NiB9LAorICAgIHsgICAgNjQ2LCAgIC03NjcsICAgMTM4OCwgIDU0NjQgfSwKKyAgICB7ICAgIDEwNCwgICAyNzQyLCAgIC0yMjgsICAzOTA3IH0sCisgICAgeyAgIC0yMzYsICAgMTgyOSwgICAtNTc5LCAgNDU4NSB9LAorICAgIHsgIC0yMTUwLCAgIC00NzQsICAtMTUyNSwgIDQwMDYgfSwKKyAgICB7ICAgIC0yMywgIC0yNjMyLCAgLTI0MDAsICAzODkyIH0sCisgICAgeyAgICAtMTIsICAtMTczOSwgIC0yOTEwLCAgNDg2NyB9LAorICAgIHsgIC0yMzEwLCAgIC0zNjgsICAgLTEwMiwgIDQ1ODMgfSwKKyAgICB7ICAtMTk5MSwgIC0yMDYxLCAgICA1MzMsICA0NTMxIH0sCisgICAgeyAgIDM4ODQsICAtMTQ0NiwgICAtMTUzLCAgNDM5MyB9LAorICAgIHsgICAxNTY4LCAgICAgMTQsICAgLTI4OSwgIDUyNjggfSwKKyAgICB7ICAtMTM3NiwgICAtMjUzLCAgLTI3OTcsICAzNDE3IH0sCisgICAgeyAgIDMxOTMsICAtMjU3NywgICAyNDc1LCAgMzU2NiB9LAorICAgIHsgICAzNDE4LCAgICA2MTcsICAgMTM1MCwgIDE4NTcgfSwKKyAgICB7ICAgMzc5MiwgICAgLTI0LCAgIC0yNzIsICAzMzcwIH0sCisgICAgeyAgICAxNTMsICAgMTE1OSwgICAyOTA2LCAgMjg3NyB9LAorICAgIHsgICAgNTExLCAgIDIxNjIsICAgMTU0OCwgIDI3NDEgfSwKKyAgICB7ICAgIDI2MiwgICAgODE5LCAgLTI3OTEsICAzNzM0IH0sCisgICAgeyAgIDQyMzIsICAtMjAxNSwgICAxNDg2LCAgMzQ3NyB9LAorICAgIHsgICAyOTQzLCAgLTExMTAsICAtMTAxNCwgIDU0ODAgfSwKKyAgICB7ICAgMjg0MiwgICAgMzY5LCAgICA3MDMsICAzNDc2IH0sCisgICAgeyAgIDMwMTEsICAgMTYzNCwgICAtOTMzLCAgMzU1MyB9LAorICAgIHsgICA0NDEyLCAgLTE1NDgsICAgLTk0MiwgIDUwMjEgfSwKKyAgICB7ICAtMTQwNSwgICAgNTkzLCAgIDIzNzIsICA1MjY3IH0sCisgICAgeyAgIDIwOTMsICAgMjEyOSwgICAgODk2LCAgMjM2NSB9LAorICAgIHsgICA0ODQ1LCAgLTE5ODAsICAgICAgMCwgIDM4MjMgfSwKKyAgICB7ICAtMjE0MCwgICAgIDgxLCAgIDMyNzgsICA1NjM3IH0sCisgICAgeyAgIDE0ODQsICAgMjY2NSwgICAtMzI0LCAgMzY1MyB9LAorICAgIHsgICAgIDEwLCAgICAxOTIsICAgMTYyMCwgIDUyOTEgfSwKKyAgICB7ICAgMjE1MiwgICAgNzM4LCAgLTIyNjksICA1MDAwIH0sCisgICAgeyAgIDIxMDIsICAgMjc0OCwgIC0xNjUyLCAgNDcwNyB9LAorICAgIHsgICAyODU1LCAgLTIxMzEsICAgLTM4NywgIDUxODggfSwKKyAgICB7ICAgMTE3MywgICAgNjc2LCAgIDEzMzgsICAzMjc3IH0sCisgICAgeyAgIDIzNDAsICAtMjMyOSwgIC0yMDY0LCAgNDA5NSB9LAorICAgIHsgICAgODYxLCAgLTIwMjQsICAgMTI5NiwgIDUwNTUgfSwKKyAgICB7ICAgMjE4OSwgICAzMjI1LCAgIC02OTUsICAyNjI2IH0sCisgICAgeyAgIDYxOTYsICAtNzA3OSwgICAxOTQzLCAgLTgyMiB9LAorICAgIHsgICA0NTQ3LCAgLTQ4MTMsICAgMzI2MSwgIDE4NTYgfSwKKyAgICB7ICAgNDI0MywgIC02OTA0LCAgIDM0NDMsICAgNDQ4IH0sCisgICAgeyAgIDQ1ODEsICAtNzUwMywgICAgOTQ2LCAgIDUwNiB9LAorICAgIHsgICA2NjI2LCAgLTc3NTQsICAgMzQyNywgICA0NzAgfSwKKyAgICB7ICAgMzQwNywgIC05MDg4LCAgIDMyNjksIC0xNDk2IH0sCisgICAgeyAgIDQwNzksICAtNjQ2NCwgICAyMzA0LCAgIDc3NyB9LAorICAgIHsgICA1NjIxLCAgLTkzMzYsICAgMjY4NCwgIC03NjggfSwKKyAgICB7ICAgNTM1MSwgIC02NDY0LCAgIDUyMzgsICAtMjE0IH0sCisgICAgeyAgIDU5NjEsICAtODAwNywgICAxNzI0LCAtMzA5MSB9LAorICAgIHsgICA0MjEzLCAgLTgwNjcsICAgIDYwMywgIC0yNDYgfSwKKyAgICB7ICAgNzIwOCwgIC03NDAzLCAgIDMxNjgsIC0xNzM4IH0sCisgICAgeyAgIDYwOTgsICAtNzcwMCwgICAgMzI5LCAtMTM3OSB9LAorICAgIHsgICA2NTI1LCAgLTY3MzUsICAgNDI0OCwgLTEwNzIgfSwKKyAgICB7ICAgNjA3MywgIC02MjQxLCAgIDIxNjcsIC0yMzc4IH0sCisgICAgeyAgIDQ2MDksICAtOTIxOCwgICAzMDUxLCAtMTAzMyB9LAorICAgIHsgICA2ODEzLCAgLTcyODMsICAgMTU4MSwgLTE4OTcgfSwKKyAgICB7ICAgNjEyNiwgIC02Mjc1LCAgIDI3ODksICAgNjgxIH0sCisgICAgeyAgIDQ0MjMsICAtNjUzOCwgICAxNjIxLCAtMTY5MiB9LAorICAgIHsgICA2MjcyLCAgLTgyOTgsICAgMzE2NywgLTE4NTUgfSwKKyAgICB7ICAgNjE3MiwgIC04NTU4LCAgIDQ0OTgsIC0xMTY5IH0sCisgICAgeyAgIDQ4NDQsICAtODU4OCwgICAxNjQ3LCAgLTM2NiB9LAorICAgIHsgICA2MjA5LCAgLTg4MDcsICAgMTU4MSwgIC0zNjkgfSwKKyAgICB7ICAgNTM4OSwgIC04MDU5LCAgICA1NTAsICAtMTkyIH0sCisgICAgeyAgIDY2NTQsICAtOTc3NSwgICAyNTA0LCAtMTA2MyB9LAorICAgIHsgICA3MTAzLCAgLTc5OTgsICAgIDgwNiwgICA1MzAgfSwKKyAgICB7ICAgNTY2MiwgIC02NzM2LCAgIDE1NjUsIC0zNjIwIH0sCisgICAgeyAgIDQxNjUsICAtOTU2NCwgICA0MTkxLCAtMjEzMSB9LAorICAgIHsgICA0NTI2LCAgLTcxODEsICAgIDU3NiwgLTI4NzUgfSwKKyAgICB7ICAgNDYzMywgIC04NjIzLCAgIDI4MDcsIC00NzQyIH0sCisgICAgeyAgIDM3MDksICAtNzc5NCwgICAxODE1LCAgICAzNCB9LAorICAgIHsgICAzNjM0LCAgLTg2MjIsICAgMjMxMywgIC04MjYgfSwKKyAgICB7ICAgNjk5MSwgIC04NDQ3LCAgIDIwNjMsIC0zMTk4IH0sCisgICAgeyAgIDc3NTcsICAtOTQ4NiwgICAyMjU1LCAgLTU1OCB9LAorICAgIHsgICA0MTQ5LCAgLTc3NzgsICAgNDcyOCwgLTE2OTYgfSwKKyAgICB7ICAgNTc2NywgIC03NDI3LCAgIDExMTMsICAgNzA3IH0sCisgICAgeyAgIDQ1OTIsICAtNjI2MSwgICAyMzI5LCAgMTg2NCB9LAorICAgIHsgICAzMTU5LCAtMTA0OTgsICAgMTY3NywgLTQyNzMgfSwKKyAgICB7ICAgMzUzNCwgIC05MDEwLCAgIDI0MzcsIC0zNTY1IH0sCisgICAgeyAgIDQ0NzksIC0xMDgyMSwgICAyNzE1LCAtNDk0MiB9LAorICAgIHsgICAzMjA3LCAgLTk4MDUsICAgMzA1NCwgLTM4ODYgfSwKKyAgICB7ICAgNDYyNywgIC04MTg5LCAgIDMwMTgsIC0yMzU0IH0sCisgICAgeyAgIDU1MjcsIC0xMDU2NiwgICAzMjQ0LCAtMjc0OSB9LAorICAgIHsgICA0MzQ2LCAtMTAxMjcsICAgMzMzNSwgLTMwODQgfSwKKyAgICB7ICAgNjEzMiwgLTEwMDg1LCAgIDMzMTYsIC0xMzA4IH0sCisgICAgeyAgIDU2MjksICAtOTcwNCwgICAyMTc4LCAtMzA1OCB9LAorICAgIHsgICAzNjAzLCAgLTg1MzgsICAgMTI0NiwgIC02MjQgfSwKKyAgICB7ICAgMzczNywgIC04NDg4LCAgICAzOTUsIC0zMTY3IH0sCisgICAgeyAgIDU0NjUsIC0xMTQxNCwgICAyODEwLCAtNDY0MCB9LAorICAgIHsgICA1MzA2LCAgLTc3NDUsICAgMjcyMSwgLTM5ODggfSwKKyAgICB7ICAgNzAwMCwgIC05MTExLCAgIDE2OTUsIC0xNDA5IH0sCisgICAgeyAgIDY2NjMsICAtNzc0MSwgICAyNDY2LCAtNDA3OSB9LAorICAgIHsgICA0MDgzLCAgLTcxNzUsICAgMTgzNiwgLTQ4MzEgfSwKKyAgICB7ICAgMzYxMywgIC05OTI2LCAgIDEzNDIsIC0zNDU1IH0sCisgICAgeyAgIDY1ODgsICAtODAzMywgICAgNDU3LCAgLTI1OCB9LAorICAgIHsgICA0NzIwLCAgLTgxMDIsICAgICAxNywgLTEyMDkgfSwKKyAgICB7ICAgNzQxNCwgIC04NzA5LCAgIDEyOTQsICAtMzQ0IH0sCisgICAgeyAgIDU0MzcsIC0xMDAzMCwgICA0MDQzLCAtMTcwNCB9LAorICAgIHsgICA0ODYyLCAgLTkyODEsICAgMTU1OCwgLTE0MzEgfSwKKyAgICB7ICAgNjgwMCwgIC02NDAzLCAgIDUxMTMsICAgODYyIH0sCisgICAgeyAgIDQ2MjMsICAtODI0MiwgICAyNjY3LCAgLTIyOCB9LAorICAgIHsgICA1OTE5LCAgLTUwODMsICAgMzM0OCwgIDIxMzUgfSwKKyAgICB7ICAgNTk4NSwgIC04ODg5LCAgIDI3MzMsIC01MTA1IH0sCisgICAgeyAgIDUwMjksICAtNTc2NywgICA0NDA3LCAgIDcxOSB9LAorICAgIHsgICAgMzU0LCAgLTYxNTgsICAgLTgzOCwgLTMwMDEgfSwKKyAgICB7ICAgIDM1MSwgIC01OTQzLCAgLTIxMDQsIC0xNTM0IH0sCisgICAgeyAgIC02MzMsICAtNzE5MCwgICAgLTI1LCAtNDc5OCB9LAorICAgIHsgIC0xNTk1LCAgLTcyMzUsICAtMzgxMiwgLTE0MDAgfSwKKyAgICB7ICAgIDEwMywgIC02MTk3LCAgLTI5MzMsICAgLTc4IH0sCisgICAgeyAgLTE3MjIsICAtNTAyMCwgIC0zNDQxLCAtNDMzMyB9LAorICAgIHsgIC0xOTYzLCAgLTU2NDQsICAtNDM2NSwgIC0yNzAgfSwKKyAgICB7ICAgLTg0NiwgIC01NzQzLCAgLTM0NzcsICAgMTk2IH0sCisgICAgeyAgIC0xOTEsICAtNTM0OCwgIC00MDU0LCAgLTQ2OSB9LAorICAgIHsgIC0yNTE1LCAgLTc3NTQsICAtMzQ5NSwgIC04MTggfSwKKyAgICB7ICAtMjA5MCwgIC02NzEwLCAgLTI3MDEsICAgMTE3IH0sCisgICAgeyAgIC01NDYsICAtNzAzNiwgIC0xMzk4LCAgIDE2MyB9LAorICAgIHsgICAtMjc4LCAgLTcwOTEsICAtMjY2MiwgIC01MzYgfSwKKyAgICB7ICAgLTYyMiwgIC03OTYyLCAgLTI3MzEsIC0xNDY0IH0sCisgICAgeyAgLTE1NTUsICAtODExOCwgIC0zNjEyLCAtMjA1NyB9LAorICAgIHsgIC0xMDk0LCAgLTYyODAsICAtMjMxNCwgICA1MDUgfSwKKyAgICB7ICAtMjU1NiwgIC04NTM4LCAgLTQwMjQsIC0yMjQ3IH0sCisgICAgeyAgICAxMDksICAtNzEzNCwgIC0zMTA3LCAtMTgyMyB9LAorICAgIHsgICAtOTAwLCAgLTY5NTQsICAtMzM0MCwgIC03MTcgfSwKKyAgICB7ICAgLTYwNSwgIC03MTEzLCAgLTM2NTYsIC0yMTU0IH0sCisgICAgeyAgICA4MzcsICAtNjI2MywgIC0zMjExLCAtMjE3NyB9LAorICAgIHsgICAtNDE3LCAgLTU4MTAsICAtMzg3MSwgLTE0NjkgfSwKKyAgICB7ICAtMTMxOCwgIC01NjQ5LCAgLTQyMDcsIC0zMTk4IH0sCisgICAgeyAgICA0MTMsICAtNjc2NSwgIC0yMDgyLCAgIC0zMyB9LAorICAgIHsgIC0zMTAxLCAgLTY0NTAsICAtNDM2MiwgIC03NjYgfSwKKyAgICB7ICAgIDc1NSwgIC02NDg5LCAgLTI5NjcsICAtODQ2IH0sCisgICAgeyAgIDExMTcsICAtNzEwNiwgIC0yNDUyLCAtMTM1MiB9LAorICAgIHsgIC0xMjAyLCAgLTgzODcsICAtMzA3MiwgLTI4OTcgfSwKKyAgICB7ICAgLTM2NSwgIC00ODk0LCAgLTM1NjEsIC0yOTM3IH0sCisgICAgeyAgLTIzNzIsICAtODc3NiwgICAtMjY1LCAtNDQ0MSB9LAorICAgIHsgIC0xMjI0LCAgLTg2NzgsICAgLTg5NiwgLTUwNzQgfSwKKyAgICB7ICAgLTc1NSwgLTEwMDk2LCAgIC02MDAsIC02NjIzIH0sCisgICAgeyAgICAzMDAsICAtODIwNiwgICAtMjI1LCAtNDU2OCB9LAorICAgIHsgIC0xMTc2LCAgLTY4MjQsICAtMjYzMywgLTM1MjcgfSwKKyAgICB7ICAtMjAwNiwgIC01NDQzLCAgLTE1MjYsIC01ODQ5IH0sCisgICAgeyAgLTExMTUsICAtNTU0MCwgIC0yMzYzLCAtNDc4NSB9LAorICAgIHsgICAxMDU5LCAgLTY4MTIsICAtMjU0MywgLTI2NTQgfSwKKyAgICB7ICAtMTk3NiwgIC02ODYxLCAgLTMwNjIsIC01NTA4IH0sCisgICAgeyAgIC0zNzksICAtNTMyOCwgIC0yMzIxLCAtMzYyNCB9LAorICAgIHsgIC0yMTA4LCAgLTU4NjAsICAtNDUxOCwgLTE5MTUgfSwKKyAgICB7ICAgLTM3OSwgIC03ODg1LCAgLTEzMjksICAtNTk0IH0sCisgICAgeyAgICA3NzQsICAtNTM4OSwgICAtNTgxLCAtNTIxMyB9LAorICAgIHsgIC0yNjAxLCAgLTUwODMsICAtMTg0OSwgLTQ5MjEgfSwKKyAgICB7ICAgLTE3NiwgIC01NTgwLCAgICAgNzQsIC01MDc1IH0sCisgICAgeyAgIC0yMDQsICAtNjc4MCwgICAtMTkwLCAtNjIzMiB9LAorICAgIHsgICAgNDE4LCAgLTc1OTQsICAtMTk4NywgIC04MjAgfSwKKyAgICB7ICAtMTg3MywgIC04NTI5LCAgLTI5MjYsIC0xNjA5IH0sCisgICAgeyAgIDEzNDAsICAtNjM2MiwgICAtOTE5LCAtNDk3NSB9LAorICAgIHsgICAgNTc3LCAgLTc5OTAsICAtMjA0NCwgLTE4NzMgfSwKKyAgICB7ICAtMjU3MiwgIC03NDEzLCAgLTE3NDUsIC0yMjI0IH0sCisgICAgeyAgLTIwMzcsICAtNzAzMCwgIC0xNDYxLCAtNzEzOCB9LAorICAgIHsgIC0yNTU5LCAgLTg3NTYsICAtMjAzOSwgLTU4MzYgfSwKKyAgICB7ICAtMjA3OSwgIC02NzY0LCAgLTEyMDksIC01NjY5IH0sCisgICAgeyAgLTE2MTMsICAtNzgwMSwgIC0yMDA2LCAgLTY4NSB9LAorICAgIHsgIC0xODY1LCAgLTY1ODMsICAgLTcyMiwgLTM1MjkgfSwKKyAgICB7ICAgLTU4OSwgIC02MzU4LCAgLTEzNzcsIC0xMDAzIH0sCisgICAgeyAgIC01NDAsICAtNzUxNCwgIC0xMzMxLCAtMzU0MiB9LAorICAgIHsgICAgNDE5LCAgLTYxOTIsICAtMTY3NywgLTQ5MjcgfSwKKyAgICB7ICAtMjc4NiwgIC04NzYzLCAgLTI5NjYsIC01MDY1IH0sCisgICAgeyAgLTIxNzIsICAtODQxMSwgIC0xNzI2LCAtNDY3NSB9LAorICAgIHsgIC0zMzgyLCAgLTk4MzMsICAtMzQ5NywgLTU3MjIgfSwKKyAgICB7ICAtMjQzMywgLTEwMTY5LCAgLTIwNzcsIC01Nzc1IH0sCisgICAgeyAgIC00MjQsICAtOTQ1MSwgIC0xMDk2LCAtMzY1OCB9LAorICAgIHsgICAtNTM3LCAgLTg1MjIsICAgLTkxMCwgLTE4OTcgfSwKKyAgICB7ICAtNTU1MCwgICAyODA3LCAgIDE2ODMsICAtNjkzIH0sCisgICAgeyAgLTYzOTUsICAgIDYzNSwgICAzNTczLCAtMTI0NiB9LAorICAgIHsgIC03NTQ0LCAgIDIyODAsICAgMjE0MCwgICAgNDQgfSwKKyAgICB7ICAtODc1MSwgICAxMTM2LCAgIDI5NTEsICAtNzk0IH0sCisgICAgeyAgLTU2MDUsICAgMjcwOSwgICAyMDUyLCAgIDkxNiB9LAorICAgIHsgIC03NjUwLCAgICA2NTQsICAgIDg2OSwgICAxMzUgfSwKKyAgICB7ICAtNjkzOSwgICAgOTY3LCAgIDE0MDksICAgODcwIH0sCisgICAgeyAgLTc4MzQsICAgMjEyMywgICAzMzEwLCAgIDk3NCB9LAorICAgIHsgIC02OTM1LCAgIDI4MTgsICAgMTI3NCwgLTE2NzggfSwKKyAgICB7ICAtNTYwNSwgICAyMjMzLCAgIDEwMTMsICAgNDcxIH0sCisgICAgeyAgLTcwOTUsICAgMTg0OSwgICAxNjQ4LCAgIDE5OCB9LAorICAgIHsgIC02NjM2LCAgIDE2MzQsICAgIDcxMiwgICAtMzcgfSwKKyAgICB7ICAtNzI3OSwgICAgOTc4LCAgICAyOTYsICAtMzE1IH0sCisgICAgeyAgLTc2NjQsICAgMzUwNCwgICAzMjkyLCAgLTIxNiB9LAorICAgIHsgIC03ODM2LCAgIDEyMDksICAgMTIyMSwgIC0yNTcgfSwKKyAgICB7ICAtNzkxMywgICAyMjAxLCAgIDE3NjUsIC0xNTI5IH0sCisgICAgeyAgLTcwNzcsICAgMzc4MywgICAyNjMyLCAtMTQwNyB9LAorICAgIHsgIC01NTY1LCAgIDE2NDUsICAgMTQxMCwgIC02MjIgfSwKKyAgICB7ICAtNjQ5NCwgICAyODc5LCAgIDExODEsICAtNzU5IH0sCisgICAgeyAgLTcwNzMsICAgMzEzNywgICAzMDEwLCAgIDU1MCB9LAorICAgIHsgIC03MjQ5LCAgIDE4MzksICAgIDg0NywgIC04MDUgfSwKKyAgICB7ICAtNjYzMCwgICAyMTk3LCAgICAyODIsIC0xMDk2IH0sCisgICAgeyAgLTg4MzYsICAgMTU3MywgICAxOTg4LCAtMTA5MCB9LAorICAgIHsgIC03ODA5LCAgIDEyNzQsICAgIDgzNiwgLTExOTggfSwKKyAgICB7ICAtNzg5NSwgICAyOTcwLCAgIDM1MTEsIC0xMDk3IH0sCisgICAgeyAgLTY5NjAsICAgMTY2NCwgICAxMzU2LCAtMjQ0MiB9LAorICAgIHsgIC02NTgyLCAgIDI4NjYsICAgMjI3MywgICAzMDcgfSwKKyAgICB7ICAtNzIyMSwgICAgODIxLCAgIDI4NTEsIC0xNDM1IH0sCisgICAgeyAgLTYwMTUsICAgMTcwMywgICAyMDAxLCAtMjM2NyB9LAorICAgIHsgIC04MDgyLCAgIDEwMzQsICAgMjEwMywgICAyMzkgfSwKKyAgICB7ICAtNTk1MiwgICAxOTEyLCAgICAzMDEsICAtNDY1IH0sCisgICAgeyAgLTYwOTksICAgIDg0MSwgICAgMzc5LCAgIDU2NyB9LAorICAgIHsgIC02MzQzLCAgICAgNTAsICAgIDQ5NCwgICA2NTggfSwKKyAgICB7ICAtNjU4NiwgICAgOTgzLCAgICA1OTEsICAtODkzIH0sCisgICAgeyAgLTU1MDAsICAgIDg2OSwgICAyMTg3LCAtMjQ3OSB9LAorICAgIHsgIC02NDgyLCAgICAgNjAsICAgMTU0NSwgIC05NzkgfSwKKyAgICB7ICAtNjcwNSwgICAgNTE1LCAgIDE5NzQsICAgLTUzIH0sCisgICAgeyAgLTY0NjAsICAgMTc1NSwgICAxMzI1LCAtMTI3NSB9LAorICAgIHsgIC02MDkzLCAgIDI2MTcsICAgMjQ2NSwgIC02MjMgfSwKKyAgICB7ICAtNzMzMCwgICAyMTYxLCAgICA1OTQsIC0yMTE1IH0sCisgICAgeyAgLTczMjQsICAgIDc2MiwgICAxNTkzLCAtMjAwNCB9LAorICAgIHsgIC02Mzg1LCAgICA2NzksICAgMTUxMCwgLTI1MTQgfSwKKyAgICB7ICAtNjE1OSwgICAgMjQxLCAgIDI5NzYsIC0xNjMxIH0sCisgICAgeyAgLTg1ODMsICAgMzAzMCwgICA0MDQ1LCAgLTE2MiB9LAorICAgIHsgIC02Mjk5LCAgICAgNjYsICAgMjIwOSwgLTIxMDMgfSwKKyAgICB7ICAtNTQyOCwgICAxMjc5LCAgIDMyNjcsIC0xODQ2IH0sCisgICAgeyAgLTY0MzgsICAgMTMzNSwgICAyNzI4LCAtMTYzMSB9LAorICAgIHsgIC04MDEyLCAgIDEwNzAsICAgMjQyOCwgLTExNTEgfSwKKyAgICB7ICAtNjIwMSwgICAyNzgxLCAgIDIzNDksIC0xOTE4IH0sCisgICAgeyAgLTU5MTgsICAgMTEzOSwgICAzMTIxLCAgLTE0OCB9LAorICAgIHsgIC02MzE0LCAgIDI0ODEsICAgMzEzNywgLTE4MDggfSwKKyAgICB7ICAtNzE4MCwgICAxNzIyLCAgIDI0MzUsIC0xNjAyIH0sCisgICAgeyAgLTY3NTAsICAgMTgyOSwgICAzNzYzLCAtMTE0NSB9LAorICAgIHsgIC02NzEzLCAgIDE3NzcsICAgMjIyMSwgIDEyMTIgfSwKKyAgICB7ICAtNzQ3OSwgICAxODM1LCAgIDM2MjcsICAtNDc5IH0sCisgICAgeyAgLTcyOTksICAgICAxMCwgICAyNDA2LCAtMTU5MyB9LAorICAgIHsgIC04MjQ5LCAgIDMxMjksICAgIDk5NiwgLTI4NzAgfSwKKyAgICB7ICAtODM3NCwgICAxNTM0LCAgIDEzMzMsIC0xODgyIH0sCisgICAgeyAgLTc1MDcsICAgMzM1MywgICAxNTk4LCAtMjI5OSB9LAorICAgIHsgIC03Mzc5LCAgIDI3MDEsICAgMjMyNiwgLTExNjcgfSwKKyAgICB7ICAtODQ0MCwgICAyMjc2LCAgIDI3OTYsICAtNTQyIH0sCisgICAgeyAtMTAzNDgsICAgMTUyNywgICAyNjQ5LCAtMTE2NSB9LAorICAgIHsgIC04MTg0LCAgIDM2MTQsICAgMjU3NCwgLTE3MzggfSwKKyAgICB7ICAtNTUzOSwgICAxNTc0LCAgIDE3MzMsICAxMTM4IH0sCisgICAgeyAgIDk0MDQsICAtNzY1MiwgICAgIDY3LCAgICA3OSB9LAorICAgIHsgICA4NjU0LCAgLTM5NzIsICAgMTM1OCwgICAtNjAgfSwKKyAgICB7ICAgODYxNywgIC00Nzk0LCAgICAxMTcsICAyMzE4IH0sCisgICAgeyAgIDc4ODYsICAtNDUwNSwgICAxNzg0LCAgMTIwMCB9LAorICAgIHsgICA4NjM2LCAgLTYxMjUsICAgMzg3OSwgLTEwMDMgfSwKKyAgICB7ICAgOTY1NCwgIC02ODM2LCAgIDE4MTYsICAgMjA1IH0sCisgICAgeyAgIDkzNzQsICAtNjU1MywgICAgOTEzLCAgMTg3NSB9LAorICAgIHsgICA4MDIwLCAgLTYxNTAsICAgMTEzNCwgIDIzOTAgfSwKKyAgICB7ICAgNzc4NiwgIC00OTcwLCAgIDIwNzgsIC0xODU3IH0sCisgICAgeyAgIDg2OTEsICAtNjExOSwgICAgNzExLCAgIDcwOCB9LAorICAgIHsgICA5MDM5LCAgLTU1NjgsICAgMjk0NCwgLTE5MDIgfSwKKyAgICB7ICAgOTk1NSwgIC01MDQ4LCAgIDE0MzMsICAtNjAxIH0sCisgICAgeyAgIDgwODksICAtNjkyNywgICAzMDkzLCAtMjg0NiB9LAorICAgIHsgICA4NDg3LCAgLTcwMjQsICAgMjQxNSwgICAgMTkgfSwKKyAgICB7ICAgOTM4OCwgIC01Mjg3LCAgIDM1NzcsIC0yNjU1IH0sCisgICAgeyAgIDg1OTEsICAtNzM3MSwgICAyMzAwLCAgLTk5NiB9LAorICAgIHsgICA5MTA0LCAgLTQ3NjMsICAgMTQ1MywgLTI1NTggfSwKKyAgICB7ICAgNzYxNSwgIC01NDU3LCAgICA1OTYsICAgMTY0IH0sCisgICAgeyAgIDk4NjAsICAtNzA0NywgICAzNDMzLCAgLTYxNCB9LAorICAgIHsgICA4NzU2LCAgLTQ0MDQsICAgMjIzNSwgIC05NjQgfSwKKyAgICB7ICAgOTQ2MiwgIC00NjYwLCAgICAyOTksIC0xODIyIH0sCisgICAgeyAgMTAxMTksICAtNTU1MCwgICAyNjg5LCAtMTI3MyB9LAorICAgIHsgIDEwOTE1LCAgLTc0NzEsICAgMjcwNSwgLTEwMDcgfSwKKyAgICB7ICAxMTQzMywgIC03MDkwLCAgIDE0MTAsIC0xMTk4IH0sCisgICAgeyAgIDk4ODIsICAtNzQzMSwgICAyOTY1LCAtMTg5NSB9LAorICAgIHsgICA3NjI4LCAgLTUyMTksICAgIDc2OSwgLTI2NjEgfSwKKyAgICB7ICAgODE2OSwgIC01MzE4LCAgIDIyNjIsICAgIDcwIH0sCisgICAgeyAgIDg4NDYsICAtNjMyMCwgICAxOTM5LCAgLTc1NCB9LAorICAgIHsgICA3MTQ3LCAgLTU1OTMsICAgMTI0OCwgIC05NzEgfSwKKyAgICB7ICAxMDY1MiwgIC01NDg1LCAgICA5MzUsICAgMTM3IH0sCisgICAgeyAgIDc3NzgsICAtNjUzMywgICAyNTY0LCAtMTkzMiB9LAorICAgIHsgICA4ODc4LCAgLTUxNzMsICAgMTIxNCwgIC0zNjEgfSwKKyAgICB7ICAgOTgyOCwgIC00OTQzLCAgICAyODIsICAgNTEwIH0sCisgICAgeyAgMTAwNDIsICAtNjEzNCwgICAzODk1LCAtMTkxNCB9LAorICAgIHsgICA3OTY1LCAgLTY2MzAsICAgMzU2NiwgIC00MzMgfSwKKyAgICB7ICAgODU3MywgIC00NTAyLCAgIDM1NzQsIC0xMjA5IH0sCisgICAgeyAgIDgzOTgsICAtNDgwMSwgICAxMDMxLCAtMTM0NyB9LAorICAgIHsgIDEwMTM2LCAgLTc3NzIsICAgMjYxMiwgIDE1NDcgfSwKKyAgICB7ICAgOTg5MCwgIC03MjgwLCAgIDE3NjgsIC0xMDgzIH0sCisgICAgeyAgIDg0MDcsICAtNjU4NSwgICAtNzA2LCAgIC01OCB9LAorICAgIHsgICA3OTc2LCAgLTc1ODIsICAgIDIyOSwgIC0xMzEgfSwKKyAgICB7ICAxMDQ4MSwgIC04ODY2LCAgIDExNjYsICAtMTQ3IH0sCisgICAgeyAgMTA5MTQsICAtNDM0MiwgICAzMTg5LCAtMjQxMiB9LAorICAgIHsgIDEwNDQwLCAgLTUxOTgsICAgLTEwNCwgLTExMDkgfSwKKyAgICB7ICAxMTIyNywgIC02NTMwLCAgIDIzODEsIC0yNDQ5IH0sCisgICAgeyAgIDg0ODcsICAtODA2NCwgICAxMDg2LCAgIDIzMCB9LAorICAgIHsgICA5OTc1LCAgLTYxMjMsICAgLTg1NywgIC0xMzQgfSwKKyAgICB7ICAgODMzOSwgIC02NDk4LCAgIDEyMzIsIC0yMzM3IH0sCisgICAgeyAgMTEwNDIsICAtNDUwNiwgICAxMTE5LCAtMjA5OCB9LAorICAgIHsgIDEyNTYzLCAgLTU1OTIsICAgMTgzNywgLTIwNjIgfSwKKyAgICB7ICAxMTgwMSwgIC01NTkwLCAgICA2MzIsIC0xMjk2IH0sCisgICAgeyAgMTAxNTIsICAtNTYxNywgICAxNTExLCAtMTkxNyB9LAorICAgIHsgICA3ODAwLCAgLTY0NzMsICAgICA1MSwgLTEzMzcgfSwKKyAgICB7ICAgNzk0MSwgIC01NTYwLCAgIDI0MzgsIC0zMjcwIH0sCisgICAgeyAgIDY1NTQsICAtMzgzNCwgICAyMTAwLCAgMTQ3NiB9LAorICAgIHsgICA5MDY1LCAgLTU1MjAsICAgLTIyNiwgLTExMjAgfSwKKyAgICB7ICAxMDc5NCwgIC03MTIwLCAgIC0yNDMsICAgMTIyIH0sCisgICAgeyAgMTA0MjksICAtNjk2OCwgICAgMjcyLCAgLTgwNiB9LAorICAgIHsgICA4OTQyLCAgLTg5MTQsICAgMTQ0MiwgIC0zOTIgfSwKKyAgICB7ICAgOTk2OSwgIC01MDUxLCAgIDIwMzMsIC0yOTUzIH0sCisgICAgeyAgIDcyNzUsICAtNDE1MiwgICAzMDU4LCAgIC02NCB9LAorICAgIHsgIDExMTI3LCAgLTU0ODgsICAgNDU4OSwgLTMyMjcgfSwKKyAgICB7ICAgOTYyNiwgIC02NjY2LCAgIDI3MzksIC0yOTU4IH0sCisgICAgeyAgIDY5NDMsICAtNTM2MiwgICA0NDcwLCAgMTAwOCB9LAorICAgIHsgIC03NDU2LCAgIC05NjcsICAgMjkzNiwgLTEwMDIgfSwKKyAgICB7ICAtODYyMiwgICAtMzMzLCAgIDY5NjIsICAyNjA2IH0sCisgICAgeyAgLTc0ODYsICAtMzM5MiwgICAzNjY4LCAgMTI4NyB9LAorICAgIHsgIC04MDUzLCAgIC04MjcsICAgNTE0OCwgIDEwOTcgfSwKKyAgICB7ICAtNjYxMCwgICAgNDU0LCAgIDQ5NTIsICAgIDk2IH0sCisgICAgeyAgLTc3MDEsICAtMTk4MiwgICAzMTYxLCAgLTQ2OCB9LAorICAgIHsgIC03MzA3LCAgLTExMzIsICAgNDA3MSwgICAtMzYgfSwKKyAgICB7ICAtODEyNSwgICAtMjcxLCAgIDUxOTksICAzODYyIH0sCisgICAgeyAgLTkxODIsICAtMTk1MCwgICAyODEzLCAgMTg3OCB9LAorICAgIHsgIC05ODU1LCAgIC05NTIsICAgNDc5NCwgIDMwMTAgfSwKKyAgICB7ICAtNzI0MSwgICAxNDMxLCAgIDQyMDIsICAyNDY4IH0sCisgICAgeyAgLTk2NDYsICAgIDE1NywgICA0NzY2LCAgMTA0NiB9LAorICAgIHsgIC05MzcxLCAgIDEyMzAsICAgNjAwOSwgIDI5NTggfSwKKyAgICB7IC0xMTUxNCwgICAgLTY0LCAgIDg2MzAsICA1MjQ4IH0sCisgICAgeyAgLTY3NjYsICAgIDU2NSwgICAyNzY2LCAgMjE0MCB9LAorICAgIHsgIC04NDI2LCAgICAgLTksICAgMjg1MiwgIDEyNzEgfSwKKyAgICB7IC0xMTI5MSwgIC0xMTEzLCAgIDUwODcsICAyOTM3IH0sCisgICAgeyAgLTgyOTcsICAgMjA5MiwgICA0NDk1LCAgMTI2NCB9LAorICAgIHsgIC05OTgzLCAgICA3MzUsICAgMzgwOSwgICAtNTEgfSwKKyAgICB7ICAtOTA0OCwgIC0xMDAwLCAgIDMxOTEsICAtMzA4IH0sCisgICAgeyAgLTczMzEsICAtMTk4NywgICAyNjU1LCAgMTM5MSB9LAorICAgIHsgIC03MTQ0LCAgICAtMjEsICAgNDMzMywgIDIxNjEgfSwKKyAgICB7ICAtNjAzMiwgIC0xNTQwLCAgIDM1NDMsICAgODk2IH0sCisgICAgeyAgLTc5ODcsICAtMTAzNiwgICAxOTg1LCAgMTUyOSB9LAorICAgIHsgIC05MjY0LCAgIDIwMDQsICAgNTE5NCwgICAyOTAgfSwKKyAgICB7IC0xMTMwOCwgICAtODQwLCAgIDU3NTQsICAxNjU0IH0sCisgICAgeyAgLTkxMzAsICAtMjM5OCwgICA0MjkyLCAgMjk3MyB9LAorICAgIHsgIC02MjQ4LCAgICA4MzgsICAgMzU2MywgIDEyMjMgfSwKKyAgICB7ICAtNjgxOSwgIC0yNzYwLCAgIDM1MTEsICAgMTE5IH0sCisgICAgeyAgLTcyMTMsICAtMjAwNiwgICA0MzY0LCAgIDc2MiB9LAorICAgIHsgIC01NDMxLCAgLTEwNDcsICAgNDUzMywgICAxNjYgfSwKKyAgICB7ICAtNzA5OCwgICAtNjQxLCAgIDIwMjEsICAgNjM5IH0sCisgICAgeyAgLTg2MjgsICAtMjI0OSwgICAzNTg4LCAgIDM5OSB9LAorICAgIHsgIC02MzUyLCAgLTE0OTgsICAgMzU2MCwgIC02NDggfSwKKyAgICB7ICAtNzAzMywgIC0yMTkwLCAgIDQ4NzAsICAyNTYyIH0sCisgICAgeyAgLTc0MDUsICAgIC00NiwgICAzNzcyLCAgLTU4MSB9LAorICAgIHsgIC02MTA0LCAgICA3OTYsICAgNTE0MywgIDE5NjUgfSwKKyAgICB7ICAtNTc4NywgICAgOTQzLCAgIDU3ODQsICAzMDMwIH0sCisgICAgeyAgLTgzNjcsICAgMTQ2NSwgICA3MTkyLCAgNDA5NyB9LAorICAgIHsgIC04MjU5LCAgICA3ODksICAgNTY5NCwgIDE5NjMgfSwKKyAgICB7IC0xMDYxNCwgIC0xODk5LCAgIDU3NDgsICAyNjQ1IH0sCisgICAgeyAgLTgyNTgsICAgLTgwNSwgICAzNjk4LCAgMjI3NSB9LAorICAgIHsgIC02ODc3LCAgIC05NzIsICAgNjQzMSwgIDMxNjAgfSwKKyAgICB7ICAtNjQ4MywgICAgMzYzLCAgIDcwMTgsICAzMTI5IH0sCisgICAgeyAgLTYyODMsICAtMTM1OCwgICA1MTkxLCAgMTUyNCB9LAorICAgIHsgIC04ODUzLCAgLTMxNTcsICAgNDExOSwgIDE3NDEgfSwKKyAgICB7ICAtNjA4NiwgICAtMjY3LCAgIDM4ODMsICAtODM1IH0sCisgICAgeyAgLTcyNTQsICAgMTAzMiwgICA2NjEzLCAgNDAxNyB9LAorICAgIHsgLTExNDcwLCAgLTMzNTAsICAgNDY0OSwgIDM0MjYgfSwKKyAgICB7ICAtNjc0MywgICAgNDgxLCAgIDYxNDgsICAxMjM5IH0sCisgICAgeyAgLTUzOTQsICAgLTE2NiwgICA1MzA5LCAgMzE2NSB9LAorICAgIHsgIC03OTU4LCAgIDEwNjgsICAgNDI2OCwgIC0yNDAgfSwKKyAgICB7IC0xMDUyMCwgICAyMjU2LCAgIDc5MTYsICAyODI4IH0sCisgICAgeyAgLTUxMzIsICAgICAtNCwgICA1NzM5LCAgMTE3NiB9LAorICAgIHsgIC04NjQzLCAgICAxMjAsICAgMzI1NSwgIC02MjkgfSwKKyAgICB7ICAtOTYzMSwgICAxOTc0LCAgIDg4NzAsICA0MzYyIH0sCisgICAgeyAtMTA2NjMsICAtMTIyMSwgICAzNzMzLCAgIDU4OSB9LAorICAgIHsgIC04MjI0LCAgLTE4NDMsICAgNTgwNiwgIDI2NTUgfSwKKyAgICB7ICAtODI4MiwgICAxMjU1LCAgIDg2NDcsICAzNDc4IH0sCisgICAgeyAtMTIzMTEsICAtMTUwNSwgICA5MDQzLCAgNjI1NiB9LAorICAgIHsgLTExMzEyLCAgIC04NTYsICAgNzEzNiwgIDQ2ODEgfSwKKyAgICB7IC0xMTk0NCwgICAtNzIyLCAgIDc5NDEsICAzMzA5IH0sCisgICAgeyAgLTc4NjgsICAgLTQ2MywgICA2ODQ2LCAgNDE5NiB9LAorICAgIHsgIC04Njc5LCAgIC0yNDEsICAgNzQxMCwgIDUzNDcgfSwKKyAgICB7ICAgNjc1OSwgIC00NjgwLCAgIC01MDgsICAxMjIwIH0sCisgICAgeyAgIDUxNzYsICAtNjExMSwgICAgOTQ0LCAgIDEyMSB9LAorICAgIHsgICA2ODQzLCAgLTU2NjcsICAtMTM2OCwgIC01MzMgfSwKKyAgICB7ICAgNTYxNiwgIC01ODg0LCAgLTE0NzEsICAtNjk1IH0sCisgICAgeyAgIDYwMzAsICAtNTA4OSwgIC0xODA4LCAgLTk0MCB9LAorICAgIHsgICA3NDQ0LCAgLTU0NjMsICAgIC01MiwgIDE4ODEgfSwKKyAgICB7ICAgNDIwNywgIC02MDc5LCAgIC01MDYsICAxNTcxIH0sCisgICAgeyAgIDY3ODUsICAtNDQxMCwgICAtNjQ5LCAgMzA4NCB9LAorICAgIHsgICA0ODM4LCAgLTUyMTQsICAgMjAyNiwgIDI5OTggfSwKKyAgICB7ICAgNDIwMSwgIC01NzkwLCAgICA2NDUsICAxODExIH0sCisgICAgeyAgIDY5MzAsICAtNTEyOSwgIC0xOTQwLCAgMTY5OCB9LAorICAgIHsgICA2MzMyLCAgLTQ2MjcsICAgIDY5MiwgIDMwMjcgfSwKKyAgICB7ICAgNjI4NSwgIC00MzE0LCAgIC0xMDYsICAzNjQ0IH0sCisgICAgeyAgIDYyNTUsICAtNTQ1MCwgIC0xOTc1LCAgIDc0MiB9LAorICAgIHsgICA0MTk5LCAgLTQ2NzYsICAgLTQ1OSwgIDE3OTYgfSwKKyAgICB7ICAgNTU5MiwgIC01NTAwLCAgIDEzNDUsICAxMzAwIH0sCisgICAgeyAgIDQzNTgsICAtNTU1NiwgIC0yMjM2LCAgIDExNCB9LAorICAgIHsgICA0NjIwLCAgLTU4NzUsICAtMTU2MywgICA4ODggfSwKKyAgICB7ICAgNDg5MiwgIC03NTUwLCAgIC0zMjcsICAtNDE5IH0sCisgICAgeyAgIDQ3MzQsICAtNzA4NSwgICAgICA3LCAgIDYxMyB9LAorICAgIHsgICAzODgzLCAgLTU1NjIsICAtMTk2OSwgIDEwODAgfSwKKyAgICB7ICAgNTYxMCwgIC00OTkwLCAgIC0yMDQsICAgODM0IH0sCisgICAgeyAgIDQxMTcsICAtNjQ4MiwgIC0xMjcxLCAgIDM0MSB9LAorICAgIHsgICA2NTg1LCAgLTUxMDcsICAgIDg5MiwgIDExNjkgfSwKKyAgICB7ICAgNjYzMiwgIC0zNjgzLCAgICAzMDIsICAzMDAyIH0sCisgICAgeyAgIDYzMjYsICAtNTM1MSwgICAtOTgzLCAtMTI1MCB9LAorICAgIHsgICA0MzgyLCAgLTcxOTIsICAgLTczMCwgIC0xNTggfSwKKyAgICB7ICAgNTIyNywgIC02NTQwLCAgIC00NTEsICAxMTIzIH0sCisgICAgeyAgIDU0NjgsICAtNjQ3MiwgICAtODcwLCAtMTQ3MSB9LAorICAgIHsgICA1MTkxLCAgLTY0MDIsICAtMTM2NSwgIC0xMjcgfSwKKyAgICB7ICAgNzQwNywgIC02MzE3LCAgIC05NzMsICAtMzM2IH0sCisgICAgeyAgIDQ2MTEsICAtNjUzMCwgICAtODIwLCAtMTk4MCB9LAorICAgIHsgICA0OTYzLCAgLTUxNTksICAtMjA1MCwgIC05NjYgfSwKKyAgICB7ICAgNDQxNCwgIC01NjkxLCAgIC0yMTEsICAtOTk4IH0sCisgICAgeyAgIDU5NTQsICAtNTg3MywgICAgNzUwLCAtMTc0OSB9LAorICAgIHsgICA0Mzk0LCAgLTQ3OTYsICAtMTI2OCwgICAyNTQgfSwKKyAgICB7ICAgNzE2MSwgIC02MjE0LCAgLTEwMTAsICAgNjg5IH0sCisgICAgeyAgIDQ5NjUsICAtMzU5OCwgICAyMzcyLCAgMTcxMSB9LAorICAgIHsgICA2MjQ4LCAgLTYxODAsICAgIDk4MSwgICA4NjQgfSwKKyAgICB7ICAgNjQ3MywgIC01MzM2LCAgICA1MjUsICAtNjAwIH0sCisgICAgeyAgIDQ1OTEsICAtNjg2NCwgIC0xMTMxLCAgLTkwMCB9LAorICAgIHsgICA2MzE0LCAgLTY0NDAsICAtMTAyMSwgIC0zNzUgfSwKKyAgICB7ICAgNTgzOCwgIC02MjA5LCAgLTExOTksICAgOTQ0IH0sCisgICAgeyAgIDUzMDgsICAtNTI4MywgIC0yMTAwLCAgMTI2NyB9LAorICAgIHsgICA0MzQyLCAgLTU4NjAsICAtMTYzNywgLTEzNTYgfSwKKyAgICB7ICAgNTY4MCwgIC00Mzg4LCAgLTEyMjcsICAtMTA0IH0sCisgICAgeyAgIDQ5MDAsICAtNDA5OCwgICAxNDQ5LCAgNDA0NiB9LAorICAgIHsgICA0Njc3LCAgLTQyODQsICAgLTEwNiwgIDMxOTAgfSwKKyAgICB7ICAgNzU3NCwgIC02MTczLCAgIC04NDgsICAxODU5IH0sCisgICAgeyAgIDY0OTMsICAtNzIwNywgICAtMTMxLCAgIDcyNiB9LAorICAgIHsgICA1NTEzLCAgLTUyNjEsICAtMjExNywgICAgIDQgfSwKKyAgICB7ICAgNjE5MSwgIC03MzUyLCAgIC0xOTMsICAtNTA1IH0sCisgICAgeyAgIDU4ODUsICAtNDMzMywgICAgMzI0LCAgLTEzNCB9LAorICAgIHsgICA2MTYyLCAgLTYwODEsICAgLTMxMiwgLTIwNDQgfSwKKyAgICB7ICAgNDIxNiwgIC02MjAwLCAgLTE4MTAsICAtNTcyIH0sCisgICAgeyAgIDU2NTIsICAtNzAzNSwgICAtNjk2LCAgLTE5NyB9LAorICAgIHsgICA3MTMxLCAgLTcxODksICAgLTM2NiwgICAtNjAgfSwKKyAgICB7ICAgNTAzMiwgIC00ODAzLCAgLTE1MTQsICAyODMyIH0sCisgICAgeyAgIDczODYsICAtNDYxMCwgICAtNjA2LCAgMzQ4OSB9LAorICAgIHsgICA0MjExLCAgLTUwMzEsICAgMTIyMSwgIDMwNDcgfSwKKyAgICB7ICAgNDA1MCwgIC00NjUzLCAgIDE1ODQsICAxNDY5IH0sCisgICAgeyAgIDY4NTIsICAtNTMwMiwgIC0xODYxLCAgIDIwNiB9LAorICAgIHsgICA3NzM2LCAgLTQ4MTYsICAtMTc5NCwgIDMzNTkgfSwKKyAgICB7ICAgNjI5MCwgIC0zNDM5LCAgIDE1MjIsICAyNDU0IH0sCisgICAgeyAgIDE3NjgsICAgNTk5MCwgIC01NTYwLCAtMjU5NCB9LAorICAgIHsgICAzOTAzLCAgIDUzMjYsICAtMTUzMCwgLTE1MDEgfSwKKyAgICB7ICAgMjQ3MiwgICAzNzM4LCAgLTIxMTcsIC00MjQwIH0sCisgICAgeyAgIDMyNjAsICAgNTQ0OCwgICAtOTA0LCAtNDczMyB9LAorICAgIHsgICAxNDM1LCAgIDcyOTcsICAtMzY3NiwgLTQxMDIgfSwKKyAgICB7ICAgNDA5NiwgICA1OTUxLCAgIC02NTYsIC0zMzEyIH0sCisgICAgeyAgIDIxNzgsICAgNjAwOSwgIC0zMTQ2LCAtMzcyNCB9LAorICAgIHsgICAzNzg3LCAgIDU0OTMsICAtNTQ3MywgLTE2MzMgfSwKKyAgICB7ICAgMjk5OCwgICA3Mjg2LCAgLTMzMzQsIC0zNTcxIH0sCisgICAgeyAgIDI4OTQsICAgNjU3NiwgIC00NzA4LCAtMjgwNCB9LAorICAgIHsgICAgODMwLCAgIDYxNjMsICAtNDI4NiwgLTMzNDggfSwKKyAgICB7ICAgNDc1NSwgICA1NTY5LCAgLTE3MzAsIC0yNzM5IH0sCisgICAgeyAgIDQ2MDQsICAgNjA2NSwgIC0zNTYyLCAtMjYwNSB9LAorICAgIHsgICAyNzQ5LCAgIDUxNDEsICAtMzk4NiwgLTI3NzUgfSwKKyAgICB7ICAgMzk0MiwgICA0ODc1LCAgLTIxNDMsIC0zMzQwIH0sCisgICAgeyAgIDI4MTksICAgODUxNywgIC0yMDA0LCAtMjcyNCB9LAorICAgIHsgICAyMTQ2LCAgIDYyOTgsICAgLTY4OSwgLTMwOTMgfSwKKyAgICB7ICAgNTE5NiwgICA2NTA0LCAgLTMzOTMsIC0xNDc1IH0sCisgICAgeyAgIDE4NTEsICAgODM4NiwgIC0xNzQ4LCAtMTQyMCB9LAorICAgIHsgICAzNDc0LCAgIDg1NzIsICAtMzUzNCwgLTI2ODggfSwKKyAgICB7ICAgNDUwMywgICA3NTYwLCAgLTM1NjEsIC0yMjQ1IH0sCisgICAgeyAgIDQ0MzMsICAgNjIxOSwgIC0yMzkzLCAtMTU3NSB9LAorICAgIHsgICAzNTA2LCAgIDcyNDgsICAtMjI3NSwgLTE5NzcgfSwKKyAgICB7ICAgMzQ5MCwgICA3NDA5LCAgLTMxNDcsICAtNjA0IH0sCisgICAgeyAgIDQyMTQsICAgNjQ0NywgIC0zNTIwLCAgIDUxNiB9LAorICAgIHsgICAgNjE5LCAgIDcwMzQsICAgLTgyOSwgLTE3MDUgfSwKKyAgICB7ICAgMTczMiwgICA3Mzk1LCAgIC0zNTYsIC0yMjA4IH0sCisgICAgeyAgIDEyMjYsICAgNTIwNCwgIC0zMjk0LCAtMzczMiB9LAorICAgIHsgICAyMDI3LCAgIDU2MTksICAtMTgxMywgLTQxNDYgfSwKKyAgICB7ICAgMzA3OCwgICA1ODc3LCAgICAgNDcsIC0yNjUxIH0sCisgICAgeyAgIDE2NTQsICAgNTQ1OCwgICAgNDI0LCAgLTY4MiB9LAorICAgIHsgICAzMTYzLCAgIDU0NjQsICAtMjAyNiwgIC0yNzAgfSwKKyAgICB7ICAgMjg4NCwgICA1Mzc1LCAgIC02ODUsICAtNTMwIH0sCisgICAgeyAgIDI5NTAsICAgNzI4NiwgICAgLTM1LCAtMjk2NyB9LAorICAgIHsgICAxOTg2LCAgIDUwNjYsICAgLTU5NywgICA0ODIgfSwKKyAgICB7ICAgMzQ1OSwgICA0MzA4LCAgLTM4NDUsIC0yMzMzIH0sCisgICAgeyAgIDMxNTUsICAgNzAzNywgIC0xMzQ2LCAtNDM0NSB9LAorICAgIHsgICAyMTkzLCAgIDY2OTYsICAgLTcxNywgLTEzMTkgfSwKKyAgICB7ICAgMzY3NywgICA1MDg5LCAgLTM4OTIsICAtNDg3IH0sCisgICAgeyAgIDIxODYsICAgNTEzNiwgIC00MTg2LCAtMTQ5MiB9LAorICAgIHsgICAgNzczLCAgIDU3OTYsICAgLTkxNywgICA4MTcgfSwKKyAgICB7ICAgMjQ4OSwgICA2NTQ2LCAgLTM1NzAsIC0yMTE3IH0sCisgICAgeyAgIDEyMjMsICAgNjQ2OSwgIC0xMzYyLCAgIC0zMyB9LAorICAgIHsgICAgMjcxLCAgIDYwNjEsICAtMTQ2NiwgLTE3MjUgfSwKKyAgICB7ICAgMjU0MCwgICA1MTcxLCAgLTE4NDcsICAxMDMyIH0sCisgICAgeyAgIDI1NDgsICAgNTI1MSwgIC0yNjk3LCAgMTY3NyB9LAorICAgIHsgICAgNzcxLCAgIDc2MDAsICAgLTc2OCwgIC02MzIgfSwKKyAgICB7ICAgNDcxMCwgICA2NjQ3LCAgLTQ3MzYsIC0xMjc1IH0sCisgICAgeyAgIDEzNjksICAgNTkxNywgIC0yOTcxLCAtMTA1NiB9LAorICAgIHsgICAgMTYzLCAgIDUyMzksICAtMzQ5OSwgLTIyNzUgfSwKKyAgICB7ICAgMjEwNCwgICA0Mjg1LCAgLTMyMTEsIC0zMjg2IH0sCisgICAgeyAgIDExMDcsICAgNzQxMSwgIC0xOTcyLCAtMTY3MSB9LAorICAgIHsgICAyMTk2LCAgIDcyNjIsICAtMjMxMCwgLTE5MjYgfSwKKyAgICB7ICAgLTI0NCwgICA2NDM5LCAgLTE3NDUsICAtODM5IH0sCisgICAgeyAgIDMyOTMsICAgMzgzMiwgIC0yODkwLCAtMzAwMCB9LAorICAgIHsgICAgNDE5LCAgIDY0NDMsICAgLTM3OSwgIC00MDcgfSwKKyAgICB7ICAgMzA3NywgICA0OTMwLCAgLTExNTYsIC0yODY5IH0sCisgICAgeyAgIDIxMzEsICAgNTg3NCwgIC0yMzMwLCAgIDIyNCB9LAorICAgIHsgICAgNjkwLCAgIDY1MzgsICAtMjIxMiwgLTI4NDEgfSwKKyAgICB7ICAgMTYwMiwgICA0NDIxLCAgLTI1MTUsICAxNTQyIH0sCisgICAgeyAgIDMzMTgsICAgOTM3MywgIC0zMDMyLCAtMzQ3NyB9LAorICAgIHsgICA1NjQ2LCAgIDc0NjIsICAtNTE1MywgLTE0NjMgfSwKKyAgICB7ICAgNDEzOSwgICA3MTM3LCAgLTE1MzksIC0zMzIxIH0sCisgICAgeyAgIDM0ODEsICAgOTA3NywgIC0xNjQ1LCAtMzY1MyB9LAorICAgIHsgIC03NzQ3LCAgICAzNzUsICAgLTEwNiwgIC01NDMgfSwKKyAgICB7ICAtODU4NywgIC0xMzc5LCAgIC01ODYsICAtNDYxIH0sCisgICAgeyAtMTAxNDYsICAgLTg5MiwgICAyMDk0LCAgIDY5NCB9LAorICAgIHsgIC04MTAzLCAgICAzODIsICAgIDUwNCwgIC0zMjUgfSwKKyAgICB7ICAtODU0OCwgICAgLTkyLCAgICAgOTQsICAtNjU2IH0sCisgICAgeyAgLTc0NjAsICAgICAzOCwgICAgMTUyLCAgIDM4OCB9LAorICAgIHsgIC04MjY2LCAgIC0yNzEsICAgLTQ1OSwgIC04ODMgfSwKKyAgICB7ICAtNzkzNSwgICAtNjY0LCAgLTEwMjYsICAtODAyIH0sCisgICAgeyAgLTgzNDEsICAgLTEwOSwgICAgODUzLCAgIDE2MSB9LAorICAgIHsgIC04ODAyLCAgLTEzNTUsICAgMTA5OSwgICA2MzAgfSwKKyAgICB7ICAtODk1NywgICAgIC02LCAgIDExMDgsICAtNjY5IH0sCisgICAgeyAgLTcyNjAsICAtMTUyMCwgICAgLTQzLCAgLTQwNyB9LAorICAgIHsgIC03NTU1LCAgIC0xNzQsICAgIDY2OCwgLTI1NjIgfSwKKyAgICB7ICAtOTAxNCwgICAtMTI2LCAgICAyMjcsIC0xMTkxIH0sCisgICAgeyAgLTgxODQsICAgIDc2OSwgICAgMjkwLCAtMTM3NSB9LAorICAgIHsgIC05NDc2LCAgICAgNTUsICAgIDk2MiwgLTE1MjggfSwKKyAgICB7ICAtODY3OSwgICAgNTQxLCAgICA3NTUsIC0xMDMwIH0sCisgICAgeyAgLTk4NDIsICAtMTYyNiwgICAgODM4LCAtMTU4OCB9LAorICAgIHsgIC04NTEzLCAgIC03MDIsICAgIDc4OCwgLTE5OTggfSwKKyAgICB7IC0xMDEwMSwgIC0xNTU4LCAgIC0zNjYsIC0xODQxIH0sCisgICAgeyAgLTgxMzUsICAgICA3OCwgICAxNDc5LCAtMTgxMyB9LAorICAgIHsgIC05MTI4LCAgIC00NTQsICAgIDMxMywgLTE3ODYgfSwKKyAgICB7ICAtNzU1NCwgIC0xMDg0LCAgICA4MzEsIC0yNDQyIH0sCisgICAgeyAgLTc1NzYsICAgLTcwMSwgICAyMDY4LCAtMTY2NSB9LAorICAgIHsgIC03NzkxLCAgLTE0ODEsICAgMTU4NywgLTE4MDggfSwKKyAgICB7ICAtNjcwMSwgICAtNTk2LCAgICAtOTcsICAgODAyIH0sCisgICAgeyAgLTc0MTgsICAgIC0xNSwgICAgNjg0LCAgLTk2MyB9LAorICAgIHsgIC03MTI3LCAgIC00NzcsICAgLTEzOSwgIC00MjYgfSwKKyAgICB7ICAtODA5NywgICAtMTEwLCAgICAtMzYsICAtMjY0IH0sCisgICAgeyAgLTc2MjAsICAtMTkyMiwgICAtNTkwLCAgLTEwMSB9LAorICAgIHsgIC03NjQ3LCAgLTEyMDEsICAgIDI3OSwgICA2NjAgfSwKKyAgICB7ICAtNzg1NiwgIC0xOTc0LCAgICA3NTgsIC0yMjcxIH0sCisgICAgeyAgLTg0OTYsICAgLTE2NywgICAyMjMyLCAtMTE0MyB9LAorICAgIHsgIC04NTA2LCAgLTEzNTksICAgIDYyNCwgIC03NDAgfSwKKyAgICB7ICAtNzI3NCwgIC0xMDUyLCAgIDEwNjIsICAtMTM5IH0sCisgICAgeyAgLTc4MDAsICAgLTIxNywgICAgIDkxLCAtMTc5NCB9LAorICAgIHsgIC03MDMwLCAgLTE2OTQsICAgLTk1NSwgICA2MTUgfSwKKyAgICB7ICAtOTAyMCwgIC0xODY0LCAgICAxMDEsIC0yMTgyIH0sCisgICAgeyAgLTk0MDAsICAgLTc0MCwgICAgNTk4LCAgLTY2NyB9LAorICAgIHsgIC04NDQ4LCAgLTExODQsICAgMjAyNCwgLTEyNzIgfSwKKyAgICB7ICAtODgxMiwgICAtNTcwLCAgIC04OTcsIC0yMzg0IH0sCisgICAgeyAtMTA1NTksICAtMTI4NiwgICAgNTM4LCAtMTUzNiB9LAorICAgIHsgIC04NzI4LCAgIC04ODgsICAtMTA4OSwgLTEzOTcgfSwKKyAgICB7ICAtNzA4MCwgIC0xMTg1LCAgICA2MzYsIC0xMjUyIH0sCisgICAgeyAgLTk4ODAsICAgIDIzMywgICAyMzQ0LCAgLTc4MiB9LAorICAgIHsgIC03OTUyLCAgLTEzMjYsICAgLTM3OCwgLTE5NDcgfSwKKyAgICB7ICAtNzIwNywgICAtMzc4LCAgIDE0MDgsIC0yMjM3IH0sCisgICAgeyAgLTg0NjcsICAtMTU0NSwgICAgOTAyLCAtMTk4NyB9LAorICAgIHsgIC05MTYzLCAgLTE0NzQsICAgIDkyNCwgLTE3MzkgfSwKKyAgICB7ICAtODE1OSwgICAtOTkyLCAgICAtNzcsIC0yNzQ0IH0sCisgICAgeyAgLTgzNDMsICAgIDE0OCwgICAtNDIzLCAtMTU3MyB9LAorICAgIHsgIC05MTA1LCAgIC02NDksICAgLTI1NCwgLTEyMTQgfSwKKyAgICB7ICAtODkzOSwgICAgNDU2LCAgICAyODEsIC0xOTA1IH0sCisgICAgeyAgLTg4MzcsICAgIDE3OSwgICAtMzk0LCAtMjYzNCB9LAorICAgIHsgIC05MTQ1LCAgICA3NTcsICAgMTU0NywgLTEzMTkgfSwKKyAgICB7ICAtOTc3NSwgICAtNzIzLCAgICA0NDEsIC0xNjgwIH0sCisgICAgeyAgLTg5MTAsICAgLTY4NiwgICAxNTI5LCAtMTUyNSB9LAorICAgIHsgIC05NDkyLCAgLTExMzQsICAgMjA2NCwgIC05MzggfSwKKyAgICB7ICAtNjExMSwgICAtOTQzLCAgICA2NzcsICAgLTMxIH0sCisgICAgeyAgLTc0MTEsICAgLTYxMywgICAtODE0LCAgICA0NiB9LAorICAgIHsgIC05NDc5LCAgIC05MjIsICAgLTQzMCwgLTIwNjEgfSwKKyAgICB7IC0xMTI5OCwgIC0xMjY4LCAgIDEzMTgsIC0xMTE3IH0sCisgICAgeyAgLTgxOTAsICAgIDgzMiwgICAgNjcxLCAtMjIxNCB9LAorICAgIHsgLTEwNDUzLCAgIC01NTAsICAgMTY3MiwgIC04ODYgfSwKKyAgICB7ICAgMTA0NCwgICA5MzUzLCAgLTE2NTEsIC01NDIzIH0sCisgICAgeyAgIDEwMzQsICAgODE0OSwgICAtNDU1LCAtNjE2NiB9LAorICAgIHsgICAgNzYxLCAgIDgyOTMsICAtMzIxNCwgLTQ4MzggfSwKKyAgICB7ICAgIDkzOCwgICA4MDc3LCAgICAxNjQsIC01MTMwIH0sCisgICAgeyAgIDEyOTUsICAgODY3MywgICAyNTgyLCAtNTQ5MCB9LAorICAgIHsgICAtMzE0LCAgIDc5NzMsICAtMjM5NSwgLTUyMzEgfSwKKyAgICB7ICAgLTUwNywgICA5MDEyLCAgLTI0OTcsIC01Nzc1IH0sCisgICAgeyAgIDIzOTYsICAgODMxNCwgIC0xMDIyLCAtNDY3MyB9LAorICAgIHsgIC0xNTE2LCAgIDg1MDEsICAgMTk1MCwgLTQ5NjkgfSwKKyAgICB7ICAgLTMwOCwgICA3NDAxLCAgIDE1NDksIC00ODY2IH0sCisgICAgeyAgIC0xMTIsICAgODM0MCwgICAzMDAzLCAtNDkyMCB9LAorICAgIHsgICAgLTUwLCAgIDkzMTUsICAgMTM3MSwgLTU2NjYgfSwKKyAgICB7ICAgLTY1OSwgICA5NDQ5LCAgIDI0OTYsIC01NTQ3IH0sCisgICAgeyAgIDI1NzMsICAgOTE0OCwgIC0yMjcwLCAtNDc4MyB9LAorICAgIHsgICAgODMwLCAgIDcxMDQsICAgLTQzOCwgLTM5MDcgfSwKKyAgICB7ICAgIDUyMiwgIDEwNjcyLCAgIC02NzcsIC02NDgzIH0sCisgICAgeyAgLTExOTAsICAxMDEwOCwgICAtNTEwLCAtNjUxOCB9LAorICAgIHsgICAtNDI3LCAgIDgyNzEsICAgLTU3OSwgLTYzMTUgfSwKKyAgICB7ICAgMTYwMiwgICA4MTEzLCAgLTE5MjcsIC00NDE4IH0sCisgICAgeyAgLTIyNjYsICAgODE4MCwgICAgNDQ4LCAtNTE5MCB9LAorICAgIHsgIC0xNjMzLCAgIDg4MTYsICAgLTIyNiwgLTU3NzEgfSwKKyAgICB7ICAgIDc1OSwgICA5NDgxLCAgIC0xMDUsIC01ODEzIH0sCisgICAgeyAgIDIyNTQsICAgNjY3OSwgICAtNDY2LCAtNTY2MiB9LAorICAgIHsgICAgLTg4LCAgIDY5NDYsICAgIDg5NSwgLTU5NTggfSwKKyAgICB7ICAtMTcwNSwgIDEwMDA5LCAgIDEzOTQsIC01NTc0IH0sCisgICAgeyAgICA3NDgsICAgNzk0MywgICAgNTQwLCAtNjY5MiB9LAorICAgIHsgICAxNDExLCAgIDcwMDksICAgIDIzMiwgLTYxNDUgfSwKKyAgICB7ICAgIDY5NywgICA3MjkwLCAgLTEyMjEsIC01MzQyIH0sCisgICAgeyAgLTE3NjQsICAxMDU4MCwgICAxOTQ0LCAtMzk4MSB9LAorICAgIHsgIC0xMzM0LCAgIDkxMjQsICAgMTE5NSwgLTM5MDMgfSwKKyAgICB7ICAgLTkwNSwgIDEwMDY3LCAgICA2MzUsIC01MDM5IH0sCisgICAgeyAgICA2NjQsICAxMDY4MCwgICAgIDQ5LCAtNDYyNSB9LAorICAgIHsgICAxMzc0LCAgIDk1MzYsICAgLTc3NywgLTM1OTEgfSwKKyAgICB7ICAgIDI1MiwgICA5Njk4LCAgIC01OTcsIC0yOTMxIH0sCisgICAgeyAgICA4MjQsICAgOTE2NCwgIC0xMDE0LCAtMjE0NCB9LAorICAgIHsgICAyNDM4LCAgMTA1NjksICAtMjI4OSwgLTQ0MjQgfSwKKyAgICB7ICAgMjEwMSwgICA3MTAyLCAgICA1MDcsIC0zNjE0IH0sCisgICAgeyAgICAyOTQsICAgODA1MSwgICAtNDMyLCAtMTUxOCB9LAorICAgIHsgICAtNjY1LCAgMTAzMzcsICAgIDU0NywgLTI4NTIgfSwKKyAgICB7ICAgMTE2OCwgIDExOTg5LCAgIC00OTIsIC01NDI3IH0sCisgICAgeyAgIDEzNDQsICAgNjQxNiwgICAgMzAyLCAtNTA2MSB9LAorICAgIHsgIC0xNzI3LCAgMTIyNjQsICAgMTUwNywgLTQ1NDMgfSwKKyAgICB7ICAgIDY3NCwgIDEwODg5LCAgIC05MDIsIC0zNjA1IH0sCisgICAgeyAgIC01ODIsICAgOTUwNCwgICAgMzAwLCAtMzYxOCB9LAorICAgIHsgICAgNjQxLCAgIDc2NTQsICAgIDY4OSwgLTIxMDkgfSwKKyAgICB7ICAgMjA2NSwgICA5MjQzLCAgICA1MDgsIC00MzY3IH0sCisgICAgeyAgIDEwNTUsICAgODM3MywgICAgNjg4LCAtMzE0NCB9LAorICAgIHsgICAtNjQxLCAgIDgxODUsICAgIDk4NiwgLTMzMDcgfSwKKyAgICB7ICAgMTEyMCwgICA3NDI2LCAgIDE3ODUsIC0zNzU3IH0sCisgICAgeyAgIDE2NjAsICAgODA3MCwgICAtNTkzLCAtMzEwNCB9LAorICAgIHsgICAyMDAyLCAgIDk0NjcsICAtMTcyMiwgLTM0NzUgfSwKKyAgICB7ICAgMjM2MSwgICA4MzY4LCAgICAxMDAsIC0zNzA5IH0sCisgICAgeyAgIC03NzIsICAgNzg0NSwgICAtNjEzLCAtNDk4OCB9LAorICAgIHsgICAxNDg1LCAgIDc0MzAsICAgMTg5NiwgLTYxMjcgfSwKKyAgICB7ICAgLTQzMiwgICA3ODIzLCAgIC05NDcsIC0yODgyIH0sCisgICAgeyAgICAzMTMsICAxMTEyMiwgICAtNzYwLCAtNDg3MSB9LAorICAgIHsgICAgNDEyLCAgIDg0MTIsICAgLTI4MywgLTQyMzEgfSwKKyAgICB7ICAgMTU4NSwgIDEwNDAyLCAgLTE4ODQsIC0zMjY3IH0sCisgICAgeyAgICAzMjEsICAgNjk1MiwgICAgNzczLCAtMzAxNiB9LAorICAgIHsgICAtMTA1LCAgIDkwMTQsICAgIDEyMSwgLTIyNDkgfSwKKyAgICB7ICAgMTU4NSwgIDEwMzEzLCAgIC05NzcsIC00ODEyIH0sCisgICAgeyAgIDE2MTksICAxMTg2OSwgICAxMzA2LCAtNjg3NiB9LAorICAgIHsgIC0xMTY4LCAgIDg4ODYsICAgIC04MSwgLTI1MDAgfSwKKyAgICB7ICAgLTM5NSwgIDEwODg2LCAgICA3MzMsIC02NDkwIH0sCisgICAgeyAgLTQ5NDksICAgNDI3NCwgICAzOTkyLCAtMTA1NCB9LAorICAgIHsgIC00MjQxLCAgIDUyOTksICAgNDI2MiwgLTE1ODQgfSwKKyAgICB7ICAtMjcxMCwgICAzODYyLCAgIDQ1NTIsIC0xNjczIH0sCisgICAgeyAgLTQ2MDgsICAgMjQ3MiwgICAzNjcyLCAtMTcxNSB9LAorICAgIHsgIC0yODQzLCAgIDI4MTYsICAgNDAwMywgLTIzMjYgfSwKKyAgICB7ICAtNTIyOSwgICAyOTY0LCAgIDU2MzYsICAgIDkwIH0sCisgICAgeyAgLTQ5MjQsICAgMzQ0MiwgICA1MDE1LCAtMTA5NiB9LAorICAgIHsgIC0xMjgxLCAgIDMzMTMsICAgNTUzNywgLTIwNjYgfSwKKyAgICB7ICAtMzgwOCwgICAxOTM5LCAgIDQzNTEsICAtOTE5IH0sCisgICAgeyAgLTE5MTUsICAgMjU4NSwgICA0OTM5LCAtMTYxNCB9LAorICAgIHsgIC0zNDcwLCAgIDE4NDMsICAgNTU2MiwgIC02ODIgfSwKKyAgICB7ICAtMzgwMCwgICAgODcwLCAgIDU4MjcsICAgMTQ0IH0sCisgICAgeyAgLTQ5ODUsICAgMTQ1MiwgICA0NzI4LCAgLTcwOSB9LAorICAgIHsgIC0zNzQ1LCAgIDI3NTAsICAgNzIyMCwgICAyNTkgfSwKKyAgICB7ICAtMTg3NSwgICAxOTAwLCAgIDY1MTQsICAtODI2IH0sCisgICAgeyAgLTQzMjksICAgMTU3NCwgICA3MTkyLCAgMTMwNCB9LAorICAgIHsgIC01NDA4LCAgIDE0NDQsICAgNjIwOCwgICA2MzEgfSwKKyAgICB7ICAtMzMyNywgICA1MzEyLCAgIDU3MDcsIC0xNTQxIH0sCisgICAgeyAgLTY5NjYsICAgMzMzNCwgICA0MDM0LCAgMTAyOCB9LAorICAgIHsgIC03NDg0LCAgIDQyNDUsICAgNDIxOCwgIC0yMTIgfSwKKyAgICB7ICAtNjU2NywgICA1ODM5LCAgIDQ1MzksICAtNTEyIH0sCisgICAgeyAgLTU3MTUsICAgNTkzNSwgICAzNzQ3LCAtMTE4NiB9LAorICAgIHsgIC02NDEwLCAgIDQ4ODEsICAgMzM1NiwgLTE2MTAgfSwKKyAgICB7ICAtNTE0NiwgICAyNTkwLCAgIDI4NTAsICAyMTcyIH0sCisgICAgeyAgLTUxOTYsICAgNDA5NSwgICAyNTY5LCAgLTM3MyB9LAorICAgIHsgIC01MDQzLCAgIDYwMjUsICAgNDMxOCwgICA2OTIgfSwKKyAgICB7ICAtNTUyNSwgICA0ODg0LCAgIDM1MTMsICAgMzcwIH0sCisgICAgeyAgLTY4MDQsICAgNzUzMywgICA1ODEyLCAgLTQ4OCB9LAorICAgIHsgIC01NjU3LCAgIDI0ODAsICAgNDA2MSwgIDEyMzQgfSwKKyAgICB7ICAtMzE1NSwgICAxNDcyLCAgIDYwNzEsICAxMTg4IH0sCisgICAgeyAgLTM0MjcsICAgNTIxNywgICAzNDQyLCAgIDg1OCB9LAorICAgIHsgIC00Njk4LCAgIDMwMTMsICAgNTUxNywgIDI1ODYgfSwKKyAgICB7ICAtNDQ0OSwgICAyMjI2LCAgIDU0MTgsICAzNTgwIH0sCisgICAgeyAgLTYzOTUsICAgMzU0NywgICA1NDg3LCAgMjAyOCB9LAorICAgIHsgIC0zNTAwLCAgIDUwMTksICAgNDc4NywgICAgIDEgfSwKKyAgICB7ICAtNDAzOCwgICAyNTc4LCAgIDMwNzMsICAzMTUxIH0sCisgICAgeyAgLTI3NTAsICAgMTk1NSwgICA0NDY5LCAgMzg1NiB9LAorICAgIHsgIC01Njk2LCAgIDE2NTksICAgNjExOCwgIDI0NjkgfSwKKyAgICB7ICAtNDM1MCwgICAxMjQxLCAgIDY4NDAsICAzMTI2IH0sCisgICAgeyAgLTU1NjUsICAgNTA1OCwgICA1MTk2LCAgMTMxNCB9LAorICAgIHsgIC0xNjQyLCAgIDQxOTAsICAgMzk0OCwgICA2MDcgfSwKKyAgICB7ICAtMTIzMywgICA0MTA4LCAgIDQ4NTAsICAtNjQwIH0sCisgICAgeyAgIC05OTcsICAgMzQyOCwgICAzMjM5LCAgMTM3OCB9LAorICAgIHsgIC02NDg4LCAgIDI3NDEsICAgNjkyNiwgIDI3OTIgfSwKKyAgICB7ICAtNDE4OCwgICAzNzYzLCAgIDQyMzUsICAyMDE4IH0sCisgICAgeyAgLTMyMTAsICAgMzIyNCwgICA1NjQ2LCAgMTQyNyB9LAorICAgIHsgIC01NTI2LCAgIDY5MDksICAgNTA3MCwgIC02MjcgfSwKKyAgICB7ICAtMjgxNSwgICAzOTk0LCAgIDM0MjUsICAxOTAzIH0sCisgICAgeyAgLTIxNjMsICAgMjczNCwgICA1NDIzLCAgIDE0NSB9LAorICAgIHsgIC00MTQ5LCAgIDQyNDcsICAgMjM1NSwgICA3MzQgfSwKKyAgICB7ICAgLTQxMCwgICAyNTIxLCAgIDQxMzgsICAgLTE2IH0sCisgICAgeyAgLTI0MTEsICAgMjM4NSwgICA0OTI3LCAgMjEwNSB9LAorICAgIHsgIC02MDc3LCAgIDM1OTEsICAgMzExNCwgICA1OTQgfSwKKyAgICB7ICAtNDE4NiwgICA0ODM0LCAgIDU5MjYsIC0xMDA0IH0sCisgICAgeyAgLTczMTUsICAgMzM2OSwgICA1OTY2LCAgIDQ0OCB9LAorICAgIHsgIC03MDQyLCAgIDU3MjEsICAgNTc3MSwgICAyMzggfSwKKyAgICB7ICAtNDQ2NiwgICAzOTA3LCAgIDM1MzUsIC0xNzUxIH0sCisgICAgeyAgLTIxMTYsICAgMzk3MCwgICA2MTYzLCAtMTM5MiB9LAorICAgIHsgIC03MjM5LCAgIDIxNDMsICAgODQwNywgIDM2MzAgfSwKKyAgICB7ICAtNTQzMSwgICA0NDg2LCAgIDY0ODYsICAgLTQyIH0sCisgICAgeyAgLTE4NzQsICAgMTYxNywgICA2MzMzLCAgIDUxOSB9LAorICAgIHsgIC02NDc4LCAgIDI2MjksICAgNDYzNCwgIC01MDUgfSwKKyAgICB7ICAtNzc4NCwgICAyMzQyLCAgIDcyMTYsICAxMzY1IH0sCisgICAgeyAgLTExNTQsICAgMTQzMiwgICA0ODMxLCAgMTU0NCB9LAorICAgIHsgIC00OTY0LCAgLTU4MDEsICAgMTc5NywgICA1MDYgfSwKKyAgICB7ICAtNDQzNiwgIC02OTA1LCAgIDEwNTksIC0xMjM3IH0sCisgICAgeyAgLTU0MDAsICAtNjg4NiwgICAgODg0LCAgLTI5MCB9LAorICAgIHsgIC02MjU5LCAgLTcxMDMsICAgIDUyMywgIC0yMjcgfSwKKyAgICB7ICAtNDgxOSwgIC02NDUwLCAgIDE0MTIsICAtNDUwIH0sCisgICAgeyAgLTQwNTYsICAtNjIxMywgICAxNzI1LCAgLTk0MyB9LAorICAgIHsgIC01NjQyLCAgLTYwOTEsICAgMTM1NywgICA2MDUgfSwKKyAgICB7ICAtNDE5NiwgIC01Njc4LCAgIDIxODcsICAtMTczIH0sCisgICAgeyAgLTQ3MjYsICAtNTEyNiwgICAyNDcwLCAgIDMyMSB9LAorICAgIHsgIC02NjQyLCAgLTUwOTEsICAgMTUwNywgLTEwMDUgfSwKKyAgICB7ICAtNTMwNCwgIC01MjUwLCAgIDE5NDQsICAxNTc5IH0sCisgICAgeyAgLTcxNzksICAtNTUyMCwgICAxNDY4LCAgLTQyNSB9LAorICAgIHsgIC02MDMzLCAgLTQ4OTUsICAgMTg3NiwgIC05NTUgfSwKKyAgICB7ICAtNjU5NSwgIC01MTQzLCAgIDIyMDcsICAxMjkxIH0sCisgICAgeyAgLTQyMjQsICAtNDk0MywgICAxODQ2LCAgMTc5MiB9LAorICAgIHsgIC03MTI4LCAgLTY5NTAsICAgIDUzOSwgICA3MjQgfSwKKyAgICB7ICAtNDM2OSwgIC00OTAxLCAgIDI1OTAsICAxMTAzIH0sCisgICAgeyAgLTc0MTMsICAtNTY5NiwgICAxNzEyLCAgMTQ0MCB9LAorICAgIHsgIC01ODg1LCAgLTY4MjEsICAgIDQxOCwgICA4NzEgfSwKKyAgICB7ICAtNjgyOCwgIC01NTk5LCAgICA3MTAsIC0xNTYzIH0sCisgICAgeyAgLTYxMjMsICAtNTgxNywgICAxMzU4LCAgMTYzMSB9LAorICAgIHsgIC01MjkxLCAgLTU2MjIsICAgIDU3OCwgIDIxMzggfSwKKyAgICB7ICAtNzE3MSwgIC02MDA0LCAgICAzNDcsICAyMjA4IH0sCisgICAgeyAgLTYwODMsICAtNTI1MSwgICAyMTMyLCAgIDQyNSB9LAorICAgIHsgIC00MzI5LCAgLTU3MjEsICAgIDQwNywgLTI5OTMgfSwKKyAgICB7ICAtNTMyNiwgIC01MDU2LCAgIDExMTksIC0xODM3IH0sCisgICAgeyAgLTU0ODUsICAtNTg1NiwgICAgMTg1LCAtMjM4OSB9LAorICAgIHsgIC02NTI5LCAgLTUxNzgsICAgIDQwMywgIC02OTcgfSwKKyAgICB7ICAtNjcxOSwgIC00NDEyLCAgIDI3MjYsICAgODcxIH0sCisgICAgeyAgLTUxMjYsICAtNTYyOSwgICAxODM1LCAgLTc3MSB9LAorICAgIHsgIC01NjIyLCAgLTQzNjEsICAgMjk3MywgICA4NTggfSwKKyAgICB7ICAtNTI4MiwgIC01ODk1LCAgICAgNDUsICAtMzM1IH0sCisgICAgeyAgLTQzNTcsICAtNTY1NiwgICAxNjk2LCAtMTU1OCB9LAorICAgIHsgIC03MTM5LCAgLTY2NTksICAgIDYyNywgIC00MDkgfSwKKyAgICB7ICAtNDQxNSwgIC02MzI4LCAgICAgMzUsICAxMzA2IH0sCisgICAgeyAgLTc2MzksICAtNjExMCwgICAxMTM0LCAgIDE5NyB9LAorICAgIHsgIC0zNjI2LCAgLTU1OTIsICAgMjAxOSwgICA5MDEgfSwKKyAgICB7ICAtMzU0NywgIC01MDY0LCAgIDExNzYsICAxNzM4IH0sCisgICAgeyAgLTUwNzUsICAtMzg5OSwgICAyMDg3LCAgIDI2NiB9LAorICAgIHsgIC00MDg2LCAgLTYzMTEsICAgMTQ3OSwgICAzNjAgfSwKKyAgICB7ICAtNjIxMCwgIC01MjIwLCAgIC0xOTksIC0xNDc3IH0sCisgICAgeyAgLTM5MTAsICAtNTA2MywgICAxMzU2LCAgIC0xNSB9LAorICAgIHsgIC03NjE2LCAgLTQ5NzcsICAgIDQ2MSwgIDI0MDEgfSwKKyAgICB7ICAtNjExOCwgIC02MTMxLCAgIDEyNTgsICAtNTYzIH0sCisgICAgeyAgLTYxMjcsICAtNDk2OCwgICAxMjg2LCAgIC0yNyB9LAorICAgIHsgIC00MTIxLCAgLTU4NTIsICAgMTExMywgIDE0NzYgfSwKKyAgICB7ICAtNTE1NywgIC00ODgxLCAgIDExNjIsICAtNjYyIH0sCisgICAgeyAgLTQ2MzcsICAtNTAzMSwgICAxMTc5LCAgIDcwOSB9LAorICAgIHsgIC01NTA5LCAgLTU0NTIsICAgLTM5NywgIDEyMjQgfSwKKyAgICB7ICAtNDU5NywgIC02ODYxLCAgICA2NDYsICAgNDY3IH0sCisgICAgeyAgLTYyNDcsICAtNDA0MywgICAgNDY4LCAgIDI3OCB9LAorICAgIHsgIC01MzM2LCAgLTY0NjUsICAgIDg3NCwgLTE0NzIgfSwKKyAgICB7ICAtNjk5OCwgIC02MzQ2LCAgICAgNzgsIC0xNzk4IH0sCisgICAgeyAgLTQ5MTUsICAtNDUzMCwgICAyNzU2LCAgLTIwMyB9LAorICAgIHsgIC02MDQ4LCAgLTQzNzMsICAgMTQ2OCwgIDEwNTIgfSwKKyAgICB7ICAtNDI3MywgIC03MTAwLCAgICA5NDIsICAtMzIzIH0sCisgICAgeyAgLTY1NTIsICAtNDI4NywgICAyMzUxLCAgICA2OSB9LAorICAgIHsgIC02OTU0LCAgLTQ2MTMsICAgIDcyMiwgIDE1MjEgfSwKKyAgICB7ICAtNDIwMSwgIC01MzYxLCAgICA3NjMsIC0xNTYyIH0sCisgICAgeyAgLTY4ODEsICAtNTU5NiwgICAtNzQ4LCAgIDY2OSB9LAorICAgIHsgIC02Njk1LCAgLTM1NDcsICAgIC0zNCwgIDEyOTkgfSwKKyAgICB7ICAtMzk4MSwgIC01NzI4LCAgICAgODQsICAgMTExIH0sCisgICAgeyAgLTQ2NjMsICAtNDgwOSwgICAyMTczLCAtMTAzMSB9LAorICAgIHsgIC02NTk5LCAgLTYwNzcsICAgMTMwMywgICAyNTYgfSwKKyAgICB7ICAtNzU5NiwgIC00MjY1LCAgLTU3OTEsIC00MTQwIH0sCisgICAgeyAgLTY2MTAsICAtMjc1OCwgIC01Mjg4LCAtMzkzNiB9LAorICAgIHsgIC01ODgwLCAgLTM4NjUsICAtNjU2MywgLTMwODggfSwKKyAgICB7ICAtNzIyOCwgIC01NTEwLCAgLTc2NzcsIC0zOTEyIH0sCisgICAgeyAgLTg4NTQsICAtNjU1MywgIC04MzE4LCAtNTM2MSB9LAorICAgIHsgIC05MzYyLCAgLTUyNDksICAtNjQxMywgLTQzMTkgfSwKKyAgICB7ICAtNDQxOCwgIC0zMTEwLCAgLTYzNjgsIC00MzU4IH0sCisgICAgeyAgLTU1NDQsICAtNDIwMywgIC02ODYzLCAtNTAxMyB9LAorICAgIHsgIC0zMDU2LCAgLTQzMTYsICAtNTU2NywgLTMxODEgfSwKKyAgICB7ICAtMzA3OCwgIC01OTk5LCAgLTUwNTEsIC0yNjU3IH0sCisgICAgeyAgLTU4ODQsICAtNjI5MiwgIC01NzU2LCAtNDAxMyB9LAorICAgIHsgIC00ODI1LCAgLTQ1NDksICAtNTUzNSwgLTQwNTMgfSwKKyAgICB7ICAtNDQ0MywgIC02MTI2LCAgLTUzMTYsIC0xMzY4IH0sCisgICAgeyAgLTM5NzIsICAtNjM0MSwgIC02MDk4LCAtMjY4NiB9LAorICAgIHsgIC01NzUxLCAgLTI3ODEsICAtNTM5OCwgLTYyMzAgfSwKKyAgICB7ICAtNDQ2NiwgIC02MTM1LCAgLTU1NzAsIC0zNjc5IH0sCisgICAgeyAgLTQyOTEsICAtNTk5MiwgIC0zNTY0LCAtNTE4OSB9LAorICAgIHsgIC03MTg5LCAgLTQ0MjksICAtNzI3OSwgLTYwODIgfSwKKyAgICB7ICAtNTA3NiwgIC00NDMzLCAgLTI3NDgsIC01MzY2IH0sCisgICAgeyAgLTYyMjUsICAtMjgyNSwgIC02ODMzLCAtNTY2MyB9LAorICAgIHsgIC0yOTg5LCAgLTQ3OTIsICAtMzk2MCwgLTQ0OTIgfSwKKyAgICB7ICAtNzgzNiwgIC03NzczLCAgLTc3MjIsIC01NzQxIH0sCisgICAgeyAgLTY1NTksICAtNTcwMywgIC01ODQ0LCAtNTU4OSB9LAorICAgIHsgIC03NjEyLCAgLTU0MzgsICAtNDEzNiwgLTM3NzQgfSwKKyAgICB7ICAtNDIxOCwgIC00MTc2LCAgLTY1OTEsIC0yMzMzIH0sCisgICAgeyAgLTQ4MzcsICAtNTA2MywgIC02NTgxLCAgIDMyMiB9LAorICAgIHsgIC02NTkwLCAgLTU5OTAsICAtMjk4MCwgLTM4NDcgfSwKKyAgICB7ICAtNTU1OCwgIC0yOTcxLCAgLTU0ODksIC0xOTMyIH0sCisgICAgeyAgLTcwMDEsICAtNTMyMywgIC00OTc1LCAtMTY5NyB9LAorICAgIHsgIC00Njk0LCAgLTI2ODgsICAtNjkwNCwgLTMwNDQgfSwKKyAgICB7ICAtODUxMSwgIC01Mzc5LCAgLTU3NjcsIC0yNTQ5IH0sCisgICAgeyAgLTc1NDgsICAtNTQxMiwgIC02NTIyLCAtMjU3MiB9LAorICAgIHsgIC02NTk3LCAgLTQ5NzMsICAtNjQyMywgLTEyNzQgfSwKKyAgICB7ICAtNjQxNSwgIC00MDIyLCAgLTUxNjgsIC0xMDcyIH0sCisgICAgeyAgLTU1MjgsICAtNTUzMCwgIC03MjE4LCAtMjM0NSB9LAorICAgIHsgIC00ODQ1LCAgLTQ4MDUsICAtNTk0MywgLTEyMjcgfSwKKyAgICB7ICAtNjA0OSwgIC03MTUwLCAgLTY3NDQsIC0yMTYxIH0sCisgICAgeyAgLTkwNjEsICAtNzI5OSwgIC04NTQyLCAtNDM3NSB9LAorICAgIHsgIC01MDEwLCAgLTU1NDYsICAtNTQxNiwgICAtODIgfSwKKyAgICB7ICAtNDEzNSwgIC00MjA1LCAgLTUxMDksIC0zMzczIH0sCisgICAgeyAgLTMzMTEsICAtNTg2OSwgIC00MDA3LCAtNTA2MSB9LAorICAgIHsgIC01OTkzLCAgLTY0NzIsICAtMzk2MiwgLTQ3MTggfSwKKyAgICB7ICAtMjk2NiwgIC01ODMyLCAgLTI4MjEsIC02MzA1IH0sCisgICAgeyAgLTQ4NTEsICAtNTE1MiwgIC0yMDY3LCAtMzkzMCB9LAorICAgIHsgIC0zNjIwLCAgLTQ0NDEsICAtMzM2MiwgLTU4MzYgfSwKKyAgICB7ICAtNDQ2OSwgIC01MjIxLCAgLTQ1MzQsIC01NTkyIH0sCisgICAgeyAgLTQwMjIsICAtNjMzNSwgIC00MzIxLCAtNjEwNyB9LAorICAgIHsgIC00ODk5LCAgLTQ1MDMsICAtMzA4NCwgLTM3MjUgfSwKKyAgICB7ICAtNDQ5MCwgIC04Mjc2LCAgLTQ2MjAsIC02MjM2IH0sCisgICAgeyAgLTY1OTEsICAtNDM0MiwgIC03MzY1LCAtNDA2MyB9LAorICAgIHsgIC02NDk4LCAgLTUwNTcsICAtNTU1MywgICA0ODUgfSwKKyAgICB7ICAtNjA2MCwgIC0yNzE0LCAgLTcwOTMsIC00MTQ0IH0sCisgICAgeyAgLTYxOTksICAtNzc3NCwgIC03MDk0LCAtNDA1NyB9LAorICAgIHsgIC03NTM2LCAgLTY0MjQsICAtNjQxNSwgLTQyNjUgfSwKKyAgICB7ICAtNzQzOSwgIC0yNDU0LCAgLTYzNDgsIC00ODI3IH0sCisgICAgeyAgLTUzMzMsICAtNzU2NSwgIC00NDE3LCAtNDYzOSB9LAorICAgIHsgIC00MzUzLCAgLTcxMDMsICAtNDE5NywgLTI2ODkgfSwKKyAgICB7ICAtNTIyOSwgIC02NTQ5LCAgLTUxMjksIC02ODA0IH0sCisgICAgeyAgLTYxMjksICAtNzcwMSwgIC01MjM2LCAtNDgzNiB9LAorICAgIHsgIC02Nzk3LCAgLTM5ODMsICAtMzg4NCwgLTQ0MDYgfSwKKyAgICB7ICAtNjYyNCwgIC00NDY3LCAgLTQ3NDUsIC01MDUyIH0sCisgICAgeyAgLTMzMjQsICAtNzU5NiwgIC0yNzIwLCAtNjU1MyB9LAorICAgIHsgIC01NDczLCAgLTYyODQsICAtMTcwNCwgLTQ1MTEgfSwKKyAgICB7ICAtNDEzMSwgIC03MjYzLCAgLTMxODAsIC01MTk2IH0sCisgICAgeyAgLTcxMTYsICAtNTU2NSwgIC0zNDY5LCAgIDY4NSB9LAorICAgIHsgIC02MDAyLCAgLTYwMjEsICAtMzg1OCwgICA1NzYgfSwKKyAgICB7ICAtMzE0NCwgIC04MjAzLCAgLTEyOTEsICAtNDM0IH0sCisgICAgeyAgLTYwOTYsICAtNzAyNywgIC00MDA0LCAgMTM1MyB9LAorICAgIHsgIC0zOTQzLCAgLTc3MDksICAtMjM0NCwgICAtMzYgfSwKKyAgICB7ICAtNDUxMCwgIC02NzY3LCAgLTI2NDIsICAgNjMxIH0sCisgICAgeyAgLTM2NTcsIC0xMTU0MSwgIC0yNTcwLCAtMzk4NCB9LAorICAgIHsgIC01OTU5LCAgLTg4NTQsICAtMTMzMywgIC04NjcgfSwKKyAgICB7ICAtNjY5OSwgIC04ODY2LCAgLTE2MDYsICAtMzQ0IH0sCisgICAgeyAgLTM4MzYsICAtNzk2MSwgIC0yMzM0LCAtMjAyOCB9LAorICAgIHsgIC0zNDMwLCAgLTgwNDUsICAtMzAzNywgIC02NzIgfSwKKyAgICB7ICAtMzg2OCwgIC05MTg0LCAgLTM2MzUsIC0xODE5IH0sCisgICAgeyAgLTQyNTgsICAtOTA2MCwgIC0yNjIxLCAtMTAwOCB9LAorICAgIHsgIC0zNTk1LCAgLTg2OTMsICAtMjAyMiwgIC03NTIgfSwKKyAgICB7ICAtNDU3MywgIC04MDQ4LCAgLTMxNjYsIC0yNjIyIH0sCisgICAgeyAgLTQ4NTIsICAtNzkwMywgIC0xNDA1LCAgIDI1NiB9LAorICAgIHsgIC00NTkxLCAgLTcwNTcsICAtMTU2MCwgICA5NjUgfSwKKyAgICB7ICAtNjk2MywgIC03NjU1LCAgIC05ODAsICAgODA4IH0sCisgICAgeyAgLTUxNzksICAtNjY0MSwgIC0zMzU2LCAgMTE5NiB9LAorICAgIHsgIC03MTAyLCAgLTY5NDEsICAtMjc5OCwgIDIxMjMgfSwKKyAgICB7ICAtNjg2NywgIC01ODM0LCAgLTMzMjAsICAtNzcwIH0sCisgICAgeyAgLTU5NzcsICAtNzM2OSwgIC0yNTAwLCAgLTc3OCB9LAorICAgIHsgIC02MTYwLCAgLTY0MDAsICAgLTkzNCwgLTI1NDMgfSwKKyAgICB7ICAtNjc0MSwgIC03NjA4LCAgIC0zNTUsIC0xMjg5IH0sCisgICAgeyAgLTY4NTYsICAtNjQ2NiwgIC0xNDMzLCAtMTY0MyB9LAorICAgIHsgIC00Nzg2LCAgLTYyOTIsICAtNDk3MCwgICAzNzYgfSwKKyAgICB7ICAtNTQwNywgIC04ODY2LCAgLTIyNTUsICAtNDAwIH0sCisgICAgeyAgLTM4MTQsICAtNjUwNiwgIC0xMzg3LCAtMzYyMCB9LAorICAgIHsgIC00OTk4LCAgLTYxMzcsICAtMTIwMCwgLTQwOTIgfSwKKyAgICB7ICAtNTEyMywgIC05NTU3LCAgLTI4NDksIC0xMzA2IH0sCisgICAgeyAgLTQyNTksICAtNjQ0NCwgIC00Mzk1LCAgLTMzOCB9LAorICAgIHsgIC01MjIxLCAgLTY4MTAsICAgLTg4MywgIDEyMjUgfSwKKyAgICB7ICAtNjEzNywgIC02MjE1LCAgLTIxNjUsICAgNTU0IH0sCisgICAgeyAgLTM4OTUsICAtNjU1NywgIC0zMTc2LCAtMTgyOSB9LAorICAgIHsgIC0zODg2LCAgLTgxODgsICAgIC04NywgIC05NTQgfSwKKyAgICB7ICAtNzI0MywgIC02NzA3LCAgLTIyMTYsICAtMzE2IH0sCisgICAgeyAgLTU1OTIsICAtNzYwNiwgICAgIDg1LCAgLTQzMiB9LAorICAgIHsgIC0zOTU3LCAgLTc5NDUsICAgLTUwNCwgIC0xNDQgfSwKKyAgICB7ICAtNDYxNywgIC03NjI0LCAgICAyMTgsICAtMzEyIH0sCisgICAgeyAgLTQ3OTcsICAtODczNywgICAtODQ0LCAtMTA1MSB9LAorICAgIHsgIC00NDc4LCAgLTg1MTYsICAtMTQwMSwgIC00NTQgfSwKKyAgICB7ICAtNDU1NywgIC03MDU4LCAgIC0zMDIsIC0yMzMyIH0sCisgICAgeyAgLTY2MjMsICAtNzczNiwgICAtMjcxLCAgIC01MCB9LAorICAgIHsgIC0zMTU3LCAgLTc1MzIsICAtMTExMSwgLTIyMDcgfSwKKyAgICB7ICAtMzU5MCwgIC03MzAwLCAgLTEyNzEsICAgNTE3IH0sCisgICAgeyAgLTQ0NDIsICAtNzMwNiwgICAtNTA3LCAgIDU5MCB9LAorICAgIHsgIC02NDU4LCAgLTc1MjQsICAtMjgwNywgICA2NjYgfSwKKyAgICB7ICAtNDk5MSwgIC04NDY2LCAgLTMzNjMsICAtNzg1IH0sCisgICAgeyAgLTc0NzQsICAtNzU0MSwgIC0xMDU2LCAtMTgzOSB9LAorICAgIHsgIC03NTAxLCAgLTgzMTYsICAgLTkzOCwgIC0xODAgfSwKKyAgICB7ICAtNTMyOSwgIC03NzM5LCAgIC01NzksIC0yMzQxIH0sCisgICAgeyAgLTQ1NDksICAtNzA2MywgICAtMTc2LCAtMzUzOSB9LAorICAgIHsgIC01MTkxLCAgLTg2MTIsICAtMTUwNCwgLTQyNTAgfSwKKyAgICB7ICAtMzA4MywgIC03MDU4LCAgLTIyNTEsICAgIDMyIH0sCisgICAgeyAgLTQwMDMsICAtNzA0MywgIC0xMDkzLCAgLTc5MSB9LAorICAgIHsgIC01NTIzLCAgLTgwOTMsICAgLTY3OCwgIC0xMTQgfSwKKyAgICB7ICAtMzAyMiwgLTEwMjY1LCAgLTIwNzAsIC0zMTA5IH0sCisgICAgeyAgLTM5MDUsICAtNjI3NCwgICAtMTgyLCAtMzY1MiB9LAorICAgIHsgIC0zMjY5LCAgLTkyMTcsICAgLTU1MSwgLTI2NTAgfSwKKyAgICB7ICAtMzEzOCwgIC05MzE0LCAgLTE3MjYsIC0xNzA0IH0sCisgICAgeyAgLTQ0MjAsIC0xMDMzOSwgIC0xNzQ0LCAtMzQ1OSB9LAorICAgIHsgIC00MTYzLCAgLTg2MDksICAtMjI5OCwgLTQxMTMgfSwKKyAgICB7ICAtNTU2NiwgIC02NTA1LCAgLTEyNDEsICAtNDYzIH0sCisgICAgeyAgLTMxMzAsICAtOTc0NiwgIC0yMzUyLCAtNDg4NCB9LAorICAgIHsgIC03ODI1LCAgLTM0MzksICAgMTQ1MSwgLTE0NjggfSwKKyAgICB7ICAtODQ1MSwgIC0zMzE4LCAgIDIzNjAsICAtNDM1IH0sCisgICAgeyAgLTg0NjIsICAtNDEzMCwgICAxNDM4LCAtMTAyNCB9LAorICAgIHsgIC05NDI1LCAgLTQ1NjQsICAgMTMyOCwgIC02ODkgfSwKKyAgICB7IC0xMTAxNCwgIC0zMjAyLCAgIDIyNzgsICAyMDgwIH0sCisgICAgeyAgLTgyNjksICAtMjc2MSwgICAtMTQ2LCAgLTQ0MCB9LAorICAgIHsgIC03NDk3LCAgLTI2MTgsICAgLTE2NiwgICA0MTMgfSwKKyAgICB7ICAtODI1MCwgIC0zMDYwLCAgICA1MjIsIC0yMTMzIH0sCisgICAgeyAgLTgzNjUsICAtNTM2NiwgICAxMzQ3LCAgLTQ1MSB9LAorICAgIHsgIC04NTg5LCAgLTM5NzksICAgMjk0MywgICA3MTQgfSwKKyAgICB7ICAtODExMSwgIC0yNTcyLCAgIDEyNzIsIC0xNzQ4IH0sCisgICAgeyAgLTc4MzAsICAtNTE5MywgICAgNjA1LCAtMTQ4NCB9LAorICAgIHsgIC04MTE5LCAgLTQ3MzYsICAgMjE0MSwgICAyNTYgfSwKKyAgICB7ICAtNzcyNCwgIC00NzY5LCAgIDE0NjMsICAtODEyIH0sCisgICAgeyAgLTczNjMsICAtMzkxMSwgICAyNTQwLCAgICAgNCB9LAorICAgIHsgIC03OTc0LCAgLTMzOTcsICAgMjM2MywgIDEzNjYgfSwKKyAgICB7ICAtNzM1OSwgIC00MjA0LCAgIDE3NTIsICAtOTU4IH0sCisgICAgeyAgLTc2MjIsICAtMzUwNSwgICAgNjYwLCAgIDkxNiB9LAorICAgIHsgIC05OTM0LCAgLTM2NjUsICAgMzE2NSwgICA4MjggfSwKKyAgICB7ICAtODcyMSwgIC00MTYyLCAgICAgNjIsICAxNzE4IH0sCisgICAgeyAgLTk0MzMsICAtNDc2OCwgICAyNzIyLCAgMTIzNCB9LAorICAgIHsgIC03OTYwLCAgLTQ0OTYsICAgIDEzOCwgIDE1MjggfSwKKyAgICB7ICAtODE5OCwgIC0zNDU0LCAgIC00NDMsICAgNjMxIH0sCisgICAgeyAgLTc3NTYsICAtMjI0NiwgICAgNjU1LCAgMTEzNyB9LAorICAgIHsgIC04ODQxLCAgLTMxNDUsICAgMTExMywgICA4MjkgfSwKKyAgICB7ICAtNzgxNywgIC0zMjk4LCAgIDEyNTEsICAgMjMwIH0sCisgICAgeyAgLTk0MTMsICAtMjczMywgICAgMzIzLCAtMTg2MiB9LAorICAgIHsgIC05NDA4LCAgLTQxNjgsICAgMTI3MCwgIDE1NDkgfSwKKyAgICB7ICAtOTAzNywgIC0zODkyLCAgIC05NDIsICAgMjgzIH0sCisgICAgeyAgLTgyNTUsICAtMzg0OSwgICAxMzAxLCAgMTc2MiB9LAorICAgIHsgIC05MDU3LCAgLTM5ODcsICAgIC00MSwgIC02ODIgfSwKKyAgICB7ICAtOTQ0MSwgIC00MTg3LCAgIDIwMTksICAtMTExIH0sCisgICAgeyAgLTk3NDAsICAtMzE3OCwgICAxNjAyLCAgLTg3MSB9LAorICAgIHsgIC04MzQ0LCAgLTI0NzQsICAgMTQ2MSwgIDE1MDYgfSwKKyAgICB7ICAtOTc1MiwgIC0yOTI1LCAgIDE5OTYsICAxMjQzIH0sCisgICAgeyAgLTkxOTksICAtMzc5NiwgICAgMTgwLCAgIDUzNyB9LAorICAgIHsgIC05MDYwLCAgLTI0MDUsICAgMTE0MCwgLTE1NjIgfSwKKyAgICB7ICAtOTM0OCwgIC0yMzc2LCAgICAzMDksICAtMTYyIH0sCisgICAgeyAtMTA3ODYsICAtMzE4MiwgICAgIC01LCAtMTUwMCB9LAorICAgIHsgIC04MTQyLCAgLTQ1NDAsICAgLTQzNCwgIC04MjYgfSwKKyAgICB7ICAtNzUyOCwgIC0yMzQxLCAgIDExMDQsICAgLTczIH0sCisgICAgeyAgLTkzNjAsICAtMjY1OCwgICAzMDYyLCAgICA1NiB9LAorICAgIHsgIC04MjY3LCAgLTIzMzUsICAgMjAwMCwgLTExOTMgfSwKKyAgICB7IC0xMjE2OSwgIC0zMTU0LCAgIDEyODcsICAtNjQwIH0sCisgICAgeyAtMTEzOTgsICAtMjEyMCwgICAgOTQ2LCAtMTE2MyB9LAorICAgIHsgIC04OTQwLCAgLTQ1NTksICAgIDMyOCwgLTE2OTYgfSwKKyAgICB7IC0xMTAyNSwgIC00MjEzLCAgIDI4MTMsICAgODQwIH0sCisgICAgeyAgLTkyMjQsICAtMzU4MSwgICAyMjI0LCAgMjAzOSB9LAorICAgIHsgIC04OTQzLCAgLTMzMzcsICAgMTI0OCwgLTEyOTggfSwKKyAgICB7ICAtNzkwMCwgIC00MDQyLCAgICA0ODUsIC0yMDgwIH0sCisgICAgeyAgLTkyMjEsICAtMTk0NywgICAyMTkxLCAgLTg4MCB9LAorICAgIHsgLTEwNzYyLCAgLTE4MDAsICAgMjUxNiwgIC0zMjQgfSwKKyAgICB7IC0xMDA5NSwgIC0yMjM4LCAgICA5ODEsIC0xMzM1IH0sCisgICAgeyAtMTE5MDgsICAtMjgwOCwgICAzMjU1LCAgIDY0NSB9LAorICAgIHsgLTEwNjQwLCAgLTQxMDUsICAgMTI4MywgIC01OTUgfSwKKyAgICB7ICAtNzY2MywgIC0yODYzLCAgIDI0NjcsICAtNzk3IH0sCisgICAgeyAtMTA3MTIsICAtMzg1NCwgICAzNzEwLCAgMTUzOCB9LAorICAgIHsgLTEwODIzLCAgLTI4OTMsICAgMTQwOCwgIC04MDEgfSwKKyAgICB7ICAtOTg3NCwgIC0zODMyLCAgICAyNTYsIC0xNjM4IH0sCisgICAgeyAtMTAzOTQsICAtMzM5MSwgICAyMzE1LCAgIC05NCB9LAorICAgIHsgLTExNTI1LCAgLTQwNzksICAgNDE1MywgIDIxMjIgfSwKKyAgICB7ICAtOTU0NiwgIC0yMDg4LCAgIDE1NDEsICAgNDgxIH0sCisgICAgeyAgLTg3MzEsICAtMjQzMywgICAxMDQyLCAgMjE2MCB9LAorICAgIHsgIC03ODUyLCAgLTM5NzcsICAtMTM3MCwgIDE2NzcgfSwKKyAgICB7ICAgNzA3MiwgIC0zNDIwLCAgIDEzOTgsIC0xNzQxIH0sCisgICAgeyAgIDYxODAsICAtMTk3NiwgICAxMjgwLCAtMzU1NyB9LAorICAgIHsgICA3NjkyLCAgLTE3OTMsICAgMjg0NCwgLTE3MDAgfSwKKyAgICB7ICAgODM2MywgIC0xNzczLCAgIDMxMDQsIC0yNjc5IH0sCisgICAgeyAgIDkyMTMsICAtMzI2NiwgICAzNzU2LCAtMzU0MiB9LAorICAgIHsgICA5NjUwLCAgLTI2NDQsICAgMTQyNiwgLTEzMTggfSwKKyAgICB7ICAgNzcxMiwgIC0yNzk2LCAgIDM2ODYsIC0xOTc1IH0sCisgICAgeyAgIDczMTYsICAtMzUxNywgICAyODIxLCAgLTYyMiB9LAorICAgIHsgICA3NDM0LCAgLTI1OTQsICAgMjMwNSwgLTIyNjQgfSwKKyAgICB7ICAgNzIzNywgIC0xNzk3LCAgICAyNTUsIC0zMTE0IH0sCisgICAgeyAgIDg2NjMsICAtMTk4MywgICAxMzM4LCAtMzA1NiB9LAorICAgIHsgICA2NjE2LCAgIC05NTIsICAgNDA1OSwgLTI2NTIgfSwKKyAgICB7ICAgODgyMywgIC0xMzI3LCAgIDEzNjIsIC0xMzU2IH0sCisgICAgeyAgIDk5MzgsICAtMTcyMiwgICAxMjg3LCAtMjM2MiB9LAorICAgIHsgICA3MjA3LCAgLTEwNTcsICAgMTkxMywgLTEzMTUgfSwKKyAgICB7ICAgNzUwOCwgIC0xNTg1LCAgICA4NzAsIC0xOTgyIH0sCisgICAgeyAgIDgyMTcsICAtMzY4MCwgICAxNDE3LCAtMzE3MCB9LAorICAgIHsgICA4MzI5LCAgLTI1NDEsICAgMTY4NCwgIC01ODUgfSwKKyAgICB7ICAgODA2MiwgIC0yMzM1LCAgICAyNTIsIC0yODAwIH0sCisgICAgeyAgIDgyMDQsICAtNDEwOCwgICAzMDk3LCAtMjU2OSB9LAorICAgIHsgICA3NzAxLCAgLTMzNjcsICAgIDU3NiwgLTMwMDggfSwKKyAgICB7ICAgNzM1MCwgICAtNzg2LCAgIDI0MTQsIC0yMTI5IH0sCisgICAgeyAgIDY5NDgsICAtMjU2OCwgICAxNjA3LCAgLTIyNSB9LAorICAgIHsgICA3Njg0LCAgLTIzODcsICAgMTMwOCwgLTM0NDkgfSwKKyAgICB7ICAgODMwNiwgIC0zNDU4LCAgIDIzOTQsIC0xNDU0IH0sCisgICAgeyAgIDg0MzgsICAtMjc4MSwgICAxMDQzLCAtMTM2MiB9LAorICAgIHsgICA5MTc1LCAgLTIwNzYsICAgMjE0NCwgLTE5ODcgfSwKKyAgICB7ICAgODM0NywgIC0yNzA5LCAgIDM0ODksIC00MzAxIH0sCisgICAgeyAgIDU2OTYsICAtMjM3NywgICAyODcwLCAgIDg1MSB9LAorICAgIHsgICA4ODI1LCAgLTEyNDMsICAgMjIxOSwgLTI2MDMgfSwKKyAgICB7ICAgODgwMSwgIC0xNjE0LCAgICA1ODQsIC0yNTEzIH0sCisgICAgeyAgIDg0MTMsICAgLTM4NCwgICAxNDIxLCAtMjI0NCB9LAorICAgIHsgICA5MjI4LCAgLTMwNTAsICAgMzI3OSwgLTIxNjQgfSwKKyAgICB7ICAgNjM0MiwgIC0yNjk4LCAgIDM1NDcsICAtMTA3IH0sCisgICAgeyAgMTAwNTMsICAtMjQ3NiwgICAyODM3LCAtMzE2OCB9LAorICAgIHsgICA3NDM5LCAgIC02MDQsICAgMzE3NywgLTM5OTEgfSwKKyAgICB7ICAgNzc0OSwgIC0xMDY0LCAgIDQzMjksIC00ODU1IH0sCisgICAgeyAgIDg2NTUsICAtMjE3NywgICAyMjUyLCAtMzUxOSB9LAorICAgIHsgICA4NDkwLCAgIC0yMjgsICAgMTk1OCwgLTMyMzMgfSwKKyAgICB7ICAxMDUxMywgIC0yOTY4LCAgIDE5MTEsIC0yMzQwIH0sCisgICAgeyAgIDgxNDYsICAgLTg2MiwgICAxODg0LCAtMTcyMyB9LAorICAgIHsgICA3Nzg4LCAgIC02NjYsICAgMzAwNCwgLTI4OTEgfSwKKyAgICB7ICAgNzc4NSwgIC0xNjIwLCAgIDQxMzMsIC0zNDE3IH0sCisgICAgeyAgMTAyNjIsICAtMzczMSwgICAzNDU1LCAtMjk3MSB9LAorICAgIHsgICA4NTcwLCAgIC05MDUsICAgNDUxOSwgLTQ2NDkgfSwKKyAgICB7ICAgOTEyOSwgIC0yNTYyLCAgICA0NjMsIC0yNDY1IH0sCisgICAgeyAgIDk0NTEsICAtMzU4NywgICAxOTA0LCAtMzA1NiB9LAorICAgIHsgICA2NTQ5LCAgLTIyMzYsICAgMzAxMCwgLTQ1MjMgfSwKKyAgICB7ICAgNzE3NSwgIC0yNjg0LCAgIDI5NjcsIC0zNDU4IH0sCisgICAgeyAgIDk4NzIsICAtMzI3OCwgICAxMDU0LCAtMjQ3MiB9LAorICAgIHsgICA5MTUzLCAgIC05MzEsICAgMTIxNywgLTI1NjUgfSwKKyAgICB7ICAgODc4OSwgIC0zNDY5LCAgICA3NTMsIC0yNTY4IH0sCisgICAgeyAgIDY2ODMsICAtMzc5MSwgICAxNzk3LCAtMzk2OCB9LAorICAgIHsgICA2ODAxLCAgLTE5NzcsICAgMjMxMSwgIC00NTIgfSwKKyAgICB7ICAgNjMzNiwgIC0xNTcyLCAgIDI2MTIsIC0zMjY0IH0sCisgICAgeyAgIDc5OTYsICAtMTAwOCwgICAgNzMwLCAtMjk2NCB9LAorICAgIHsgICA3NTIxLCAgLTEwNTksICAgMTU3MywgLTM2OTQgfSwKKyAgICB7ICAgODE0OCwgIC0zOTczLCAgIDI2MDAsIC0zNTcyIH0sCisgICAgeyAgIDc3NjUsICAtMTUzMiwgICAyNTI4LCAtMzg1NiB9LAorICAgIHsgICA3NDA0LCAgLTM5MTgsICAgNDQ3MiwgIC0xNDMgfSwKKyAgICB7ICAgODg5NCwgIC0xMzk4LCAgIDMyOTksIC0zNjg1IH0sCisgICAgeyAgIDU3NjgsICAtMjA0MSwgICAxNDg3LCAgLTYzNyB9LAorICAgIHsgICA1MTMxLCAgLTI4NjUsICAgMjQ2MywgIC04MTEgfSwKKyAgICB7ICAgNjQzOSwgIC0xNTY4LCAgIDM1MDAsIC0xNTUwIH0sCisgICAgeyAgLTg4NzgsICAtNjc5OCwgIC01MzE5LCAtMTQ1MiB9LAorICAgIHsgIC02MzMyLCAgLTk3MTMsICAtMzExMiwgIC05OTAgfSwKKyAgICB7ICAtODQ0NCwgIC02MzE2LCAgLTM2OTQsICAtNjg3IH0sCisgICAgeyAgLTYxMjMsIC0xMDg0MCwgIC0zNjM3LCAtNDM1OCB9LAorICAgIHsgIC00Nzg0LCAgLTk1ODAsICAtNDU3NywgLTI1ODEgfSwKKyAgICB7ICAtNjEwOCwgLTEwNTE1LCAgLTQ4NTksIC0yNTI0IH0sCisgICAgeyAgLTc2MDUsICAtNzUxOCwgIC0yMzI3LCAtMjc5NyB9LAorICAgIHsgIC05NjYyLCAgLTg3NzUsICAtMjQ2NywgLTIwMTAgfSwKKyAgICB7ICAtNjQ5NCwgIC03NTIzLCAgLTQ3MTUsICAtMTE4IH0sCisgICAgeyAgLTgyOTAsICAtODk4MiwgIC0xNjcyLCAgLTMxNyB9LAorICAgIHsgIC04Nzk4LCAtMTEwNTEsICAtMzg4OCwgLTE0MjYgfSwKKyAgICB7ICAtNjI3MywgIC02NjIzLCAgLTY3OTEsICAtMTQyIH0sCisgICAgeyAgLTgzMTMsICAtNzY2OCwgIC0yMTQxLCAtMTI3NSB9LAorICAgIHsgIC02NDUzLCAgLTg0MTIsICAtMzU4OSwgLTQxMDIgfSwKKyAgICB7ICAtNjc0NywgIC03NzUwLCAgLTU2OTAsIC0yNDk4IH0sCisgICAgeyAgLTc4MTQsICAtNjY5MywgIC0zMTc0LCAtMjQ0NiB9LAorICAgIHsgLTEwMzgzLCAtMTAxMzAsICAtMzkzMSwgLTIzNjQgfSwKKyAgICB7IC0xMDYwNiwgIC04NDY3LCAgLTU1MzksIC0yNzcyIH0sCisgICAgeyAgLTk0NzUsICAtNjY3MSwgIC0zMzA1LCAtMjI3MSB9LAorICAgIHsgIC04OTgyLCAgLTk0NTcsICAtNTYzNSwgLTQwMDUgfSwKKyAgICB7IC0xMDExMSwgIC03OTY1LCAgLTY1MTUsIC00MTgwIH0sCisgICAgeyAgLTczMDEsICAtNjQ3OSwgIC01MzY0LCAgIDcyMCB9LAorICAgIHsgIC05NTQzLCAgLTg5OTksICAtNzkyMSwgIC05MTIgfSwKKyAgICB7ICAtOTUzNCwgIC04NTYyLCAgLTM0NjksICAtMzg0IH0sCisgICAgeyAgLTc2MDEsIC0xMDM0NCwgIC0zMjA1LCAtMTEyNyB9LAorICAgIHsgIC04MDg4LCAgLTg2MjAsICAtNDk1NCwgLTI4ODggfSwKKyAgICB7ICAtODIwMiwgIC04NDA2LCAgLTcwMzgsIC0zNzc1IH0sCisgICAgeyAgLTczMTIsICAtODMyNCwgIC0zMzM0LCAtMTc3NSB9LAorICAgIHsgIC04NTY2LCAgLTkyNjIsICAtODA3MSwgLTQxNzQgfSwKKyAgICB7ICAtNzA2OCwgLTExMzAwLCAgLTU1NzMsIC0yOTA3IH0sCisgICAgeyAgLTgyOTUsICAtODk1MiwgIC00MzY2LCAtMTU0NCB9LAorICAgIHsgLTExMTA0LCAtMTAyMTAsICAtMjI4NSwgIC0zODQgfSwKKyAgICB7ICAtNTIxMywgIC03NTIwLCAgLTUwMDgsIC0xMzM5IH0sCisgICAgeyAgLTU4ODksICAtNzk0MCwgIC01OTg3LCAtMTM4NSB9LAorICAgIHsgLTEwODE2LCAgLTgyMDEsICAtNDE1MywgLTE0ODUgfSwKKyAgICB7IC0xMDI3NywgIC04OTE5LCAgLTYzMTUsIC0xNjUyIH0sCisgICAgeyAgLTU4ODgsIC0xMDMyMCwgIC0zODIxLCAtMTczMyB9LAorICAgIHsgLTEwNDk3LCAgLTcxODEsICAtNjA4MywgLTMwMzIgfSwKKyAgICB7ICAtNzcyMSwgIC05NzI0LCAgLTY1OTEsIC01MzM2IH0sCisgICAgeyAgLTU2ODgsICAtNzg5NCwgIC0zNDg2LCAtMjU1MiB9LAorICAgIHsgLTEwMDE0LCAtMTA1MDAsICAtMzI0NywgIC04MjAgfSwKKyAgICB7ICAtNjMwMSwgIC04NzY1LCAgLTQ1MDYsIC0yOTIzIH0sCisgICAgeyAgLTgyNjEsICAtNzg0NywgIC02MjEzLCAtMTU1MiB9LAorICAgIHsgLTEwMjEyLCAgLTc0ODEsICAtODExMywgLTM5NTQgfSwKKyAgICB7ICAtNjkzOCwgLTEwODc0LCAgLTYwNzQsIC00NzAzIH0sCisgICAgeyAgLTcxODMsIC0xMDk2OCwgIC00NDQ2LCAtMTc3MyB9LAorICAgIHsgIC03MTIwLCAgLTkxOTMsICAtMTk2NiwgLTI1MDkgfSwKKyAgICB7ICAtNjIzNCwgIC05MjYzLCAgLTIzMTMsIC00Mjg0IH0sCisgICAgeyAgLTg1MDMsICAtOTg1NywgIC0yNDI5LCAgLTYwOCB9LAorICAgIHsgIC05MzcyLCAgLTc4NDQsICAtODM5MSwgLTIxMjAgfSwKKyAgICB7ICAtNzk1MSwgIC03MTU3LCAgLTY1MzUsICAgLTExIH0sCisgICAgeyAgLTcyNTYsICAtOTQ3MywgIC0yMTcyLCAgLTY2MCB9LAorICAgIHsgLTEwMDYzLCAgLTk2MTIsICAtMjUxNSwgICAtMTUgfSwKKyAgICB7ICAtNjY4NCwgIC05MTM0LCAgLTYxMDksIC00MjA2IH0sCisgICAgeyAgLTgyMDQsIC0xMTkzMiwgIC01MjIwLCAtMjMwNiB9LAorICAgIHsgIC05NzEwLCAgLTY3MDYsICAtNDExNSwgLTMyNzUgfSwKKyAgICB7ICAtNjg1NSwgIC03MDc4LCAgLTI0MDksIC00NDQ3IH0sCisgICAgeyAgLTczNDQsICAtNzY3MywgIC00NDc5LCAtNDExNiB9LAorICAgIHsgIC04ODUxLCAgLTY4NDIsICAtNDkyNywgLTI5NDggfSwKKyAgICB7ICAtODkyNywgLTEwNDUyLCAgLTU2MzMsIC0yMTk0IH0sCisgICAgeyAgLTg2MjcsICAtOTAwMiwgIC03MTc2LCAtMTU3NSB9LAorICAgIHsgIC04MjA5LCAgLTk3MjIsICAtNzAyMSwgLTMzMjQgfSwKKyAgICB7ICAtMzc3MCwgLTEwMjQ5LCAgLTM2MjMsIC00ODE2IH0sCisgICAgeyAgLTgxODMsICAtNzQ2NSwgIC00MDkwLCAgIDY0NiB9LAorICAgIHsgIC04MTYzLCAgLTcxNDksICAgIDIwMCwgICA0OTggfSwKKyAgICB7ICAtODI4OSwgIC02MjY2LCAgICA2ODYsICAtMjA2IH0sCisgICAgeyAtMTAwMzAsICAtNjI0MSwgIC0xMDMyLCAtMTg2NCB9LAorICAgIHsgIC04NzkzLCAgLTgzMjcsICAgLTc3MywgIC0xNjkgfSwKKyAgICB7ICAtOTE0OSwgIC02MjE1LCAgICA5NjksICAgLTE1IH0sCisgICAgeyAgLTgzMDMsICAtNTg1OSwgICAgIC03LCAgMjAwNiB9LAorICAgIHsgIC05NjgyLCAgLTcyODMsICAgIDI1NSwgIDEzMjIgfSwKKyAgICB7ICAtOTI5MywgIC03MjI3LCAgICAgNzEsICAtMjMxIH0sCisgICAgeyAgLTg1MjUsICAtNjIxNSwgICAgMjg3LCAgLTgzNyB9LAorICAgIHsgLTEwNDc3LCAgLTUzNzksICAgMTE1OSwgIDE0NDkgfSwKKyAgICB7IC0xMDcyNiwgIC03ODU2LCAgIC0xMzAsICAgMTAyIH0sCisgICAgeyAgLTg2OTQsICAtNzQ2MSwgIC0xMjEwLCAgIDY5MCB9LAorICAgIHsgIC05MzY3LCAgLTUzMjQsICAgMTEwMywgIDMxNzAgfSwKKyAgICB7IC0xMDY4NiwgIC04MDU1LCAgIC04MzEsICAxNjMzIH0sCisgICAgeyAgLTkyMDEsICAtNjg3MywgIC0yNzA0LCAgMjI1OCB9LAorICAgIHsgIC04NDIxLCAgLTUzNTgsICAtMTQwNSwgICAyMjYgfSwKKyAgICB7ICAtOTA2NiwgIC01ODMwLCAgIC0zMDcsIC0xNTcxIH0sCisgICAgeyAtMTExNTAsICAtNzM4MSwgIC0yNzQ2LCAgLTkwMCB9LAorICAgIHsgIC05OTc4LCAgLTU5MjUsICAtMjAwNiwgIC00MzcgfSwKKyAgICB7ICAtOTQ2NCwgIC00NzQxLCAgIC0yNzMsICAxMDYxIH0sCisgICAgeyAtMTA1NDMsICAtNjY4NCwgIC0xMTEzLCAgMTY2MCB9LAorICAgIHsgLTEwMDczLCAgLTU1NzYsICAgMTA4MywgIC0yNjkgfSwKKyAgICB7ICAtODgyNiwgIC01NzYzLCAgIDE2MDAsICAxNDg2IH0sCisgICAgeyAtMTA0NDUsICAtOTA3MSwgIC0xMjUzLCAgIC02NCB9LAorICAgIHsgLTEyMDg1LCAgLTU3OTksICAgICAgMiwgICA3NjkgfSwKKyAgICB7IC0xMjkzOSwgIC02NjYzLCAgIDE2NTAsICAxNDM3IH0sCisgICAgeyAtMTA5MzIsICAtNjQzNCwgIC0xMjUyLCAgLTY0OSB9LAorICAgIHsgLTExNjUwLCAgLTc4MjYsICAtMjA1MywgICA3MTAgfSwKKyAgICB7IC0xMjEyMiwgIC02NzMzLCAgLTE4ODksICAtNzMxIH0sCisgICAgeyAgLTkwOTMsICAtNjA5NSwgIC0yNDYzLCAgLTg0MiB9LAorICAgIHsgLTEwOTc3LCAgLTQzNjQsICAgIDQ2OSwgICA0MjAgfSwKKyAgICB7IC0xMTQ4OCwgIC02OTA4LCAgIC01MjEsICAgODkzIH0sCisgICAgeyAgLTk2NjksICAtNTQ3OCwgICAtODQyLCAgIDMzNyB9LAorICAgIHsgLTEwNjA2LCAgLTUyMDMsICAgLTYzMiwgLTEzNjEgfSwKKyAgICB7IC0xMDE5OCwgIC02Mjg0LCAgIDE2NjIsICAxMjc3IH0sCisgICAgeyAtMTAxMzUsICAtNTI5MiwgICAyNDM1LCAgMzQ5MyB9LAorICAgIHsgLTExMDI3LCAgLTY1NjEsICAgIDY1NSwgICAgNTYgfSwKKyAgICB7IC0xMDk3NywgIC01MDMwLCAgIDExMjcsICAtMzU4IH0sCisgICAgeyAtMTI3NjYsICAtMzk4NiwgICAxMzQ4LCAgLTMzNSB9LAorICAgIHsgLTE0MjQ0LCAgLTc3MzEsICAgIDI2NCwgICAzMTcgfSwKKyAgICB7IC0xNTEyNCwgLTEwMzA5LCAgIC01MDgsICAxNDQ3IH0sCisgICAgeyAtMTI4MjEsICAtODYzOCwgICAtNjA4LCAgIDEzNyB9LAorICAgIHsgLTEzMDc2LCAgLTg2OTMsICAtMjg1MiwgIC00MzEgfSwKKyAgICB7IC0xMTE1NiwgIC01NTQ2LCAgLTIyNTIsIC0xNjAwIH0sCisgICAgeyAgLTg2OTIsICAtNzM2NiwgICAtODE5LCAtMTIyMyB9LAorICAgIHsgLTEyNTA3LCAgLTk4MTYsICAtMTcxNCwgIC0xMjEgfSwKKyAgICB7IC0xMDcxMiwgIC02NjY2LCAgICA1NDQsICAzMzQ5IH0sCisgICAgeyAtMTI0NjIsICAtNTg5MCwgIC0yNDkxLCAtMjMxOCB9LAorICAgIHsgLTEyNDY4LCAgLTcyMjYsICAgIDQzNywgICAyMzIgfSwKKyAgICB7IC0xMTMwMCwgIC01MjI2LCAgIDIwNjgsICAgNjg3IH0sCisgICAgeyAtMTE5OTQsICAtODMyMCwgICAtNjI2LCAgMjcyOCB9LAorICAgIHsgLTEyMjIyLCAgLTU0NzYsICAgMTE0MiwgICAgMTggfSwKKyAgICB7IC0xMDI3NywgIC04MTIyLCAgLTI0MTgsICAyMDAzIH0sCisgICAgeyAtMTM0MTgsICAtNjExNSwgIC0zNTYzLCAtMjgwMiB9LAorICAgIHsgLTE0NzU5LCAgLTk4MzQsICAtMTI0MywgICAgMjEgfSwKKyAgICB7IC0xMzY5OSwgIC01NjY1LCAgIDE1MjUsICAgNTA3IH0sCisgICAgeyAtMTYyNjksICAtOTQ3NiwgICAtNzAxLCAgIDE2MyB9LAorICAgIHsgLTEyNjc3LCAgLTU0MzcsICAgLTI0NywgLTEwMTkgfSwKKyAgICB7IC0xMTgyNywgIC00Mjk1LCAgIC0xODEsIC0xMjQzIH0sCisgICAgeyAtMTI4NDcsICAtNDQ5NiwgICAyOTg0LCAgMTEyMyB9LAorICAgIHsgLTEzODYwLCAgLTc5MTUsICAtMTE2NiwgIC01NDcgfSwKKyAgICB7IC0xMjI3NiwgIC04MTQ1LCAgLTIyOTAsIC0xNTI3IH0sCisgICAgeyAtMTE0MTcsICAtNDgzMCwgICAyOTgzLCAgMTg1NCB9LAorICAgIHsgLTExNzkzLCAgLTYwMDIsICAgMTE2MywgIDE5NDAgfSwKKyAgICB7ICAxMTQ0MywgIC00OTIwLCAgLTMyMzUsICAzMTUxIH0sCisgICAgeyAgMTEzMDAsICAtNjYxNiwgIC0xNTA2LCAgMTE3NSB9LAorICAgIHsgICA5MTk4LCAgLTQ2MjgsICAtMjA2MCwgIDIzOTAgfSwKKyAgICB7ICAxMDUzMiwgIC00MDI3LCAgIC02NDMsICAgOTEyIH0sCisgICAgeyAgIDk5MDIsICAtMzU3MywgIC0xNjA2LCAgMTMyNyB9LAorICAgIHsgICA5NjUzLCAgLTM1MzYsICAtMjI0MCwgIDE4NjkgfSwKKyAgICB7ICAgOTk0OCwgIC01MTcxLCAgIC00MjMsICAyNjYyIH0sCisgICAgeyAgMTIzMTYsICAtNDAwNCwgIC0xOTg5LCAgIDI4MSB9LAorICAgIHsgIDEyMTI1LCAgLTQ4MDAsICAtMTI2NSwgIC0xNjMgfSwKKyAgICB7ICAxMDY1MCwgIC0yNjE3LCAgLTIzMzcsICAxNDYyIH0sCisgICAgeyAgIDk5MDksICAtNDk2OCwgIC0yMzc2LCAgIDkxNiB9LAorICAgIHsgIDEyOTQ0LCAgLTQ2NDcsICAtMTk1OCwgICA0NjAgfSwKKyAgICB7ICAxMjk4OCwgIC01MjgzLCAgLTExNDEsICAgIDQxIH0sCisgICAgeyAgMTIzMjEsICAtMjkxNSwgIC0zNjIxLCAgMTAyNSB9LAorICAgIHsgIDExNDQ5LCAgLTI4OTQsICAtMjcyOCwgICAzNTEgfSwKKyAgICB7ICAxMjA4NywgIC0zMDQxLCAgLTIwMDIsICAgLTMyIH0sCisgICAgeyAgMTE1NTgsICAtNDAzMSwgIC0xMzQzLCAgLTM5OSB9LAorICAgIHsgIDEyOTgzLCAgLTM3NDAsICAtMzUxNiwgIDEyNDUgfSwKKyAgICB7ICAxMjA5OSwgIC0yNTE1LCAgLTI3NTIsICAgMjI1IH0sCisgICAgeyAgMTI1MTUsICAtMzQ2NSwgIC0yNzAxLCAgIDU1MCB9LAorICAgIHsgIDE0NjgzLCAgLTUwMjIsICAtNTI3MiwgIDI5OTYgfSwKKyAgICB7ICAxMjI2MCwgIC0zMzgzLCAgLTEyMTUsICAtNTI4IH0sCisgICAgeyAgMTM4MTAsICAtNTQyMiwgIC0yNDQzLCAgMTE2NiB9LAorICAgIHsgIDEzNDIxLCAgLTUzNzgsICAtMTg4NiwgICA3MjEgfSwKKyAgICB7ICAxMjk2MSwgIC00MjU5LCAgLTI1OTQsICAgNzk2IH0sCisgICAgeyAgMTIyNjYsICAtMjEwNCwgIC00NzY4LCAgMTU5MSB9LAorICAgIHsgIDEzNTIzLCAgLTQ3MTAsICAtMzA0NSwgIDEzNDIgfSwKKyAgICB7ICAxMjQzNywgIC0yMDk5LCAgLTU2MTAsICAyMTE3IH0sCisgICAgeyAgMTE4NTAsICAtMjE4MywgIC0zNDk3LCAgIDY2MSB9LAorICAgIHsgIDEyMjc1LCAgLTM5MzYsICAgLTU5NywgIC02OTcgfSwKKyAgICB7ICAxMjQ1OSwgIC01MjUzLCAgIC01MTcsICAtNTQ0IH0sCisgICAgeyAgMTI4MzUsICAtNDA5NCwgIC0xMzIyLCAgLTE2OCB9LAorICAgIHsgIDE0MzYwLCAgLTU2NzcsICAtMzMwNSwgIDE4NTkgfSwKKyAgICB7ICAxMzkwNSwgIC00NTUyLCAgLTQzMDksICAyMTE3IH0sCisgICAgeyAgMTE1NTksICAtMzQxMiwgIC0xODQ3LCAgIC04MSB9LAorICAgIHsgIDEzMzc5LCAgLTMxNjcsICAtNTc2NCwgIDI3NDYgfSwKKyAgICB7ICAxMTkxMCwgIC0xNjM0LCAgLTQzNDIsICAxMDUyIH0sCisgICAgeyAgMTI2NjIsICAtNDc0MiwgICAgIDcxLCAgLTk3NCB9LAorICAgIHsgIDEzMDU3LCAgLTMyNTQsICAtNDQyNCwgIDE3MDUgfSwKKyAgICB7ICAxNTA0NiwgIC01NzA2LCAgLTQ4NTEsICAzMDE5IH0sCisgICAgeyAgMTQxNjIsICAtNDE0MiwgIC01NTE0LCAgMjg0MyB9LAorICAgIHsgIDEyNzY0LCAgLTE4NDUsICAtNjY4NCwgIDI4ODggfSwKKyAgICB7ICAxMzcxNCwgIC0yMzc0LCAgLTc4MzgsICAzODU3IH0sCisgICAgeyAgMTMyOTUsICAtMTY2MywgIC04MjkzLCAgNDA3MyB9LAorICAgIHsgIDEwMDMyLCAgLTQxNTIsICAtMzQwMywgIDE0MjEgfSwKKyAgICB7ICAxMDk0MiwgIC01Mzg2LCAgLTIyMjIsICAgOTUwIH0sCisgICAgeyAgMTA1MzIsICAtNjM4NSwgIC0xNzUwLCAgMTkyNSB9LAorICAgIHsgIDEwMjczLCAgLTU5NzIsICAtMTUzNCwgICA2NDMgfSwKKyAgICB7ICAxMDYwNSwgIC00NzgyLCAgLTE2OTUsICAgIDI3IH0sCisgICAgeyAgMTA5ODgsICAtNTE1MywgIC0xMTIzLCAgLTM0MSB9LAorICAgIHsgIDExNjI5LCAgLTU4ODQsICAtMTA2MCwgICAgNDggfSwKKyAgICB7ICAxMDQ0MSwgIC00MDQ1LCAgLTI0MzEsICAgMzExIH0sCisgICAgeyAgMTA3ODgsICAtMzU5NSwgIC00MTcxLCAgMTgwNyB9LAorICAgIHsgIDEyMTEwLCAgLTU2ODYsICAtMjEyNywgICA5NzYgfSwKKyAgICB7ICAxMTc0NiwgIC00NzczLCAgLTI2MzksICAgODkxIH0sCisgICAgeyAgMTE1NDEsICAtNTI5OSwgIC0zMDMxLCAgMTczMiB9LAorICAgIHsgIDExNDE2LCAgLTI1NTksICAtNTM1OSwgIDIxOTggfSwKKyAgICB7ICAxMTU4MywgIC01Mzc2LCAgIC03MDQsICAgNjc3IH0sCisgICAgeyAgMTA0MTYsICAtMzIxNCwgIC0zNTE2LCAgIDg3MiB9LAorICAgIHsgICA5NjUxLCAgLTU0MzUsICAtMTYxOCwgIDMyNTUgfSwKKyAgICB7ICAgOTk3MywgIC01MTMzLCAgIC05OTYsICAzOTIzIH0sCisgICAgeyAgMTE3MDcsICAtNDY0MywgICAtNDMwLCAgLTc5NiB9LAorICAgIHsgIDEwOTk0LCAgLTI3MDksICAtMzU4NywgIDIzMDIgfSwKKyAgICB7ICAxMDcxNiwgIC01MTE4LCAgIC02NDUsICAgMjcwIH0sCisgICAgeyAgMTQxMDAsIC0xMDMxNCwgICAxMDk1LCAgMTUzMSB9LAorICAgIHsgIDEyOTQ0LCAgLTgwNDksICAgMTEwNSwgIC03NDEgfSwKKyAgICB7ICAxMzI3NiwgIC03MDM1LCAgIC01MTEsICAgMjc0IH0sCisgICAgeyAgMTQwMDgsICAtNzI1NCwgICAtMjgzLCAgIDEzOSB9LAorICAgIHsgIDExNTk0LCAgLTY1MzYsICAgIC05MSwgIDE2NzEgfSwKKyAgICB7ICAxMTczMiwgIC04NjQ1LCAgICA3NDYsICAgIDE1IH0sCisgICAgeyAgMTQ2MTMsICAtNzA4NSwgIC0xNTc4LCAgMTE4MyB9LAorICAgIHsgIDEzMDgzLCAgLTYyMjQsICAgLTc1MCwgICAgLTQgfSwKKyAgICB7ICAxMzk4OCwgIC02MjU2LCAgLTE1OTIsICAgODIwIH0sCisgICAgeyAgMTQ2NzgsICAtODY4MywgICAgNDQxLCAgIDEyNiB9LAorICAgIHsgIDE1NTcxLCAgLTg4NzIsICAgLTUyMSwgIDExMzkgfSwKKyAgICB7ICAxNTY0MiwgIC05NTMzLCAgICAzNDEsICAgNjk3IH0sCisgICAgeyAgMTU5NjAsICAtOTU4NiwgICAtMTY4LCAgMTEyMSB9LAorICAgIHsgIDE1NDY0LCAtMTAyMzksICAgMTQzMywgICAgLTEgfSwKKyAgICB7ICAxNDkzNCwgIC03ODg3LCAgLTEwNDYsICAxMDgwIH0sCisgICAgeyAgMTUyNTIsICAtNzYzMCwgIC0xODk5LCAgMTYyOCB9LAorICAgIHsgIDE1NDg1LCAgLTgzODQsICAtMTIzNCwgIDE0ODQgfSwKKyAgICB7ICAxNTk2MiwgIC04NjM4LCAgLTE4MTUsICAxOTMxIH0sCisgICAgeyAgMTY1MDEsIC0xMDY2NCwgICAgMzk4LCAgMTE2NyB9LAorICAgIHsgIDE2MTQ2LCAtMTAxNDUsICAgIDQxMSwgICA5MTggfSwKKyAgICB7ICAxNDU3MywgIC03NDc1LCAgIC02OTcsICAgNjAxIH0sCisgICAgeyAgMTQzMDIsICAtNzk5NiwgICAgIDI4LCAgIDI1NyB9LAorICAgIHsgIDE0NzY5LCAgLTY3OTIsICAtMjI4NiwgIDE1NzQgfSwKKyAgICB7ICAxNDE0NCwgIC02MTM3LCAgLTIxNjksICAxMjU3IH0sCisgICAgeyAgMTQ3NzAsICAtNjI3MSwgIC0zMTExLCAgMTkzMyB9LAorICAgIHsgIDE0MTEwLCAgLTgzMTIsICAgMTA4MywgIC01MzEgfSwKKyAgICB7ICAxNTIzNSwgIC02OTkxLCAgLTI5OTMsICAyMTc0IH0sCisgICAgeyAgMTMyMjIsICAtNTgwNSwgICAgNTQ3LCAgLTg5MSB9LAorICAgIHsgIDE0Nzk2LCAgLTg3NjIsICAgMTI1NCwgIC0yNDYgfSwKKyAgICB7ICAxNjA0MCwgIC05MTgxLCAgLTEwMDUsICAxNTUxIH0sCisgICAgeyAgMTY0ODcsIC0xMDA4NiwgICAtMzczLCAgMTQyMCB9LAorICAgIHsgIDE1MDc3LCAgLTk0NzksICAgIDk2NiwgICAgNTEgfSwKKyAgICB7ICAxMzAyNiwgIC02NDY4LCAgICA5MzIsIC0xMDgwIH0sCisgICAgeyAgMTI3MDMsICAtNjE1MiwgICAgLTMzLCAgLTU3MyB9LAorICAgIHsgIDE1NjQxLCAgLTY4MTAsICAtNDEyOCwgIDI4NzQgfSwKKyAgICB7ICAxMzI4MiwgIC03NjczLCAgIDE1ODMsIC0xMjgzIH0sCisgICAgeyAgMTIzNzMsICAtNzE1MCwgICAxNTEyLCAgLTkxNyB9LAorICAgIHsgIDEyOTkyLCAgLTc3NTEsICAgLTY3OCwgICA3ODMgfSwKKyAgICB7ICAxMDkwNywgIC02ODU4LCAgIC0zMTMsICAyNTk3IH0sCisgICAgeyAgMTMwMjYsICAtODk2MywgICAgMTI1LCAgMjE1MiB9LAorICAgIHsgIDEyNzcwLCAgLTk5NDYsICAgMTk1NywgIC01MDUgfSwKKyAgICB7ICAxMjQ4MiwgIC02ODQ5LCAgLTEyNjgsICAgODMzIH0sCisgICAgeyAgMTM3OTAsICAtNjE4MSwgICAtMTM4LCAgLTI3OSB9LAorICAgIHsgIDEyNzA5LCAgLTgzODIsICAgMjA0NCwgICAyMjcgfSwKKyAgICB7ICAxMjI0NCwgIC02NjMwLCAgICAyMDMsICAtNDU3IH0sCisgICAgeyAgMTQyMDksICAtNjgxNiwgIC0xMDMyLCAgIDYzMiB9LAorICAgIHsgIDE1MTM0LCAgLTgyNjcsICAgLTI4OCwgICA2NDAgfSwKKyAgICB7ICAxMzYxOSwgIC02MTU3LCAgLTEwOTAsICAgMzU2IH0sCisgICAgeyAgMTQwNDQsICAtNzQxMywgICAgNzI1LCAgLTQ4NCB9LAorICAgIHsgIDEyOTU4LCAgLTc3NTMsICAgMjU4NSwgLTE5ODAgfSwKKyAgICB7ICAxMzE4OCwgIC04Mzk2LCAgIDIzMDYsIC0xNTU4IH0sCisgICAgeyAgMTQzNzksICAtOTk4MCwgICAyMTMyLCAgLTY4OCB9LAorICAgIHsgIDE0Mjc1LCAgLTk4NTcsICAgMTE2MiwgICAxNzkgfSwKKyAgICB7ICAxMzY5MCwgIC04NjQ4LCAgIDE2MjEsICAtODg5IH0sCisgICAgeyAgMTE3NzAsICAtNjgyOSwgICAtNzQ2LCAgIDI3OCB9LAorICAgIHsgIDEyNzMyLCAgLTgyMDIsICAgIDI4NiwgICAgOTAgfSwKKyAgICB7ICAxMzYzMCwgLTEwMTQ2LCAgIDE4NjcsICAtMjA3IH0sCisgICAgeyAgMTIwNzIsICAtODc0MCwgICAxMjk5LCAgLTY0NSB9LAorICAgIHsgIDEyODUyLCAgLTk0OTIsICAgMTIyNiwgICAgNjIgfSwKKyAgICB7ICAxMTc5MiwgIC03MzgyLCAgICAtNTQsICAtMTE2IH0sCisgICAgeyAgMTM3NzksICAtOTAxNCwgICAgNDg3LCAgIDM1MSB9LAorICAgIHsgIDExOTUxLCAgLTc3MjksICAgIDEyMSwgICA4MzQgfSwKKyAgICB7ICAxMTk3MCwgIC05NzgxLCAgIDIyNzYsICAgIC00IH0sCisgICAgeyAgMTI2ODAsICAtNzk4NCwgICAyNzg3LCAgLTc4NyB9LAorICAgIHsgIDEzMzAwLCAtMTQ0ODgsICAgNjQwOCwgLTE5MjcgfSwKKyAgICB7ICAxMzYzNSwgLTE1MzU1LCAgIDkxNTMsIC0zMDczIH0sCisgICAgeyAgMTI4MDQsIC0xMzU2NiwgICA1NTE3LCAtMTYyNSB9LAorICAgIHsgIDE2NjI0LCAtMTA4NTQsICAgMTY5MCwgICAgMjggfSwKKyAgICB7ICAyMDM4NywgLTE4NTMyLCAgIDYxNjIsICAtMjYxIH0sCisgICAgeyAgMTY1MTUsIC0xMjY0MiwgICAzMzkyLCAgLTUxOSB9LAorICAgIHsgIDE1ODAwLCAtMTEwOTUsICAgMjE1MSwgIC0yMDIgfSwKKyAgICB7ICAxNjgyNCwgLTExNzkwLCAgIDE2NTEsICAgNTk5IH0sCisgICAgeyAgMTc2MDQsIC0xMzIxMywgICAyNTYzLCAgIDUzOCB9LAorICAgIHsgIDE3ODkyLCAtMTQxNzcsICAgMzU2MiwgICAxNDcgfSwKKyAgICB7ICAxNjk4NywgLTExMzk5LCAgICA4NjksICAxMDUyIH0sCisgICAgeyAgMTcwMDMsIC0xMjQ1NiwgICAyNDQyLCAgIDI2NSB9LAorICAgIHsgIDIxNjU3LCAtMjE4MDYsICAgOTE5OCwgLTEyNTAgfSwKKyAgICB7ICAxNjgyNSwgLTEzMzQxLCAgIDM5ODAsICAtNjg2IH0sCisgICAgeyAgMTc1MjUsIC0xMjcxNCwgICAxODg3LCAgIDgwNSB9LAorICAgIHsgIDE2NDE5LCAtMTEwMzQsICAgMTIxNiwgICA2MTcgfSwKKyAgICB7ICAyMDkzMSwgLTE5OTM5LCAgIDc0NjksICAtNjg0IH0sCisgICAgeyAgMTg0NTIsIC0xNTM5MCwgICA0NTczLCAgLTE5MSB9LAorICAgIHsgIDE0Nzc4LCAtMTAwNzcsICAgMjg0MSwgLTEyMDkgfSwKKyAgICB7ICAxNzQwMiwgLTEzMzE5LCAgIDMwNDIsICAgMTYwIH0sCisgICAgeyAgMTkzNjUsIC0xNzkyMiwgICA3MDg3LCAtMTA2MSB9LAorICAgIHsgIDE2Mjk4LCAtMTE5NDEsICAgMjgxMCwgIC0zNTEgfSwKKyAgICB7ICAxOTA4NywgLTE2MTc2LCAgIDQ3NzUsICAgLTg0IH0sCisgICAgeyAgMTc2NjYsIC0xMjI4OSwgICAgOTM4LCAgMTIyNCB9LAorICAgIHsgIDE4NTgxLCAtMTU4OTQsICAgNTEzMiwgIC00MzAgfSwKKyAgICB7ICAxOTgyMywgLTE2NzE3LCAgIDQxNDIsICAgNTQ1IH0sCisgICAgeyAgMTk5NjAsIC0xOTQyMywgICA4NDAwLCAtMTQ5MiB9LAorICAgIHsgIDE4OTczLCAtMTY4MTcsICAgNTkwNiwgIC01OTQgfSwKKyAgICB7ICAxOTA3OSwgLTE1NDMxLCAgIDM1MjgsICAgNTAzIH0sCisgICAgeyAgMTY2NjcsIC0xMjQ4NSwgICA0NDY3LCAtMTMwMiB9LAorICAgIHsgIDE5NzkxLCAtMTc3OTcsICAgNjE5NiwgIC01MjkgfSwKKyAgICB7ICAyMDAwNSwgLTE3NjA2LCAgIDUzNTQsICAgLTIwIH0sCisgICAgeyAgMjAxMjMsIC0xODU5OSwgICA2ODg2LCAgLTcyOCB9LAorICAgIHsgIDE5MDY4LCAtMTQ4MDUsICAgMjM5NCwgIDExMDUgfSwKKyAgICB7ICAxNDQ0MywgLTEzNzIzLCAgIDU2MzEsIC0yMDI5IH0sCisgICAgeyAgMTQ3MzAsIC0xNDIzMSwgICA1NjMxLCAtMTQ1MCB9LAorICAgIHsgIDE2MDg5LCAtMTU5NTksICAgNzI3MSwgLTIwMjkgfSwKKyAgICB7ICAxMzQ3MywgLTExMjAwLCAgIDMyMzYsICAtOTI0IH0sCisgICAgeyAgMTQ0MTMsIC0xMDkwMiwgICAyMzQ3LCAgLTI2NyB9LAorICAgIHsgIDE3NjY2LCAtMTg2NjIsICAxMTM4MSwgLTM0OTYgfSwKKyAgICB7ICAxNDc0OSwgLTExMDQyLCAgIDMzMDUsICAtMjc1IH0sCisgICAgeyAgMTUzMDQsIC0xMDQ4NiwgICAxODY5LCAgLTI0MCB9LAorICAgIHsgIDE0ODA5LCAtMTIxMjYsICAgMzM2OSwgIC02MTYgfSwKKyAgICB7ICAxNjg5NiwgLTE2NTYxLCAgIDczMDcsIC0xODQ1IH0sCisgICAgeyAgMTU3ODIsIC0xNDMzNiwgICA1MzgwLCAtMTI2NCB9LAorICAgIHsgIDE2Mzk1LCAtMTU1MjAsICAgNjQxNSwgLTE1ODggfSwKKyAgICB7ICAxMzY4MSwgLTExMTE0LCAgIDI1ODQsICAtMzIwIH0sCisgICAgeyAgMTQyNDQsIC0xMjMyNiwgICA0NDgwLCAtMTYzMiB9LAorICAgIHsgIDE1MjQ3LCAtMTMxMTksICAgNDI2NSwgIC04OTggfSwKKyAgICB7ICAxMzk4NywgLTEyMDkxLCAgIDM0NjksICAtNTk3IH0sCisgICAgeyAgMTM5NDEsIC0xMjc3MCwgICA0MjQwLCAgLTgzOSB9LAorICAgIHsgIDEzNzcxLCAtMTM2MjcsICAgNTI1MiwgLTEzODQgfSwKKyAgICB7ICAxNTAxMCwgLTE2MDc0LCAgIDc1OTIsIC0yMjQ5IH0sCisgICAgeyAgMTU4NTIsIC0xNzIyNiwgICA4NjE5LCAtMjY1NSB9LAorICAgIHsgIDE4OTIxLCAtMTY5MTYsICAgNjg3NSwgLTE1MDEgfSwKKyAgICB7ICAxNDkwOSwgLTExNjc4LCAgIDI3NjgsICAtMjk1IH0sCisgICAgeyAgMTg5ODgsIC0xODM1MywgICA4NDI0LCAtMjA3MCB9LAorICAgIHsgIDE1NDU3LCAtMTUwODAsICAgNjIxOCwgLTE1MTMgfSwKKyAgICB7ICAxNDkxNiwgLTE1NTEyLCAgIDY5NDksIC0xODgzIH0sCisgICAgeyAgMTgxMDgsIC0xNDcwMiwgICA0NjgxLCAgLTcwMSB9LAorICAgIHsgIDE3NjAwLCAtMTU3MzMsICAgNTYxNiwgIC03NzUgfSwKKyAgICB7ICAxNDA3MCwgLTEzNjgzLCAgIDY0NzIsIC0yNjI2IH0sCisgICAgeyAgMTM4MzIsIC0xMTkxNCwgICA1MjAxLCAtMjIzMiB9LAorICAgIHsgIDE4ODQ2LCAtMTkwMDksICAgOTE5MiwgLTE5NjEgfSwKKyAgICB7IC0xMTk4MSwgLTEwOTk0LCAgLTYzMjQsIC0yMjY0IH0sCisgICAgeyAtMTA5NzYsICAtOTA0NywgIC02NTQ2LCAtMzgyOCB9LAorICAgIHsgLTExMjg4LCAtMTA1MzIsICAtNzAxNCwgLTQxOTEgfSwKKyAgICB7IC0xMDEzOSwgLTEwMTg5LCAgLTc3OTksIC0yNjg4IH0sCisgICAgeyAtMTA1NTUsICAtOTk4OCwgIC05MTgxLCAtMjA0MCB9LAorICAgIHsgLTExNTk2LCAtMTEzMzksIC0xMDAyMiwgLTI3MDcgfSwKKyAgICB7IC0xMzQwMCwgLTEzMzk1LCAtMTEzMDYsIC00MjA2IH0sCisgICAgeyAgLTk3NzQsIC0xMjI4MSwgIC03NDY2LCAtNDEzMyB9LAorICAgIHsgLTEwODQyLCAtMTMxMjUsICAtODc3NywgLTQ5NTYgfSwKKyAgICB7IC0xMTk2NCwgLTE1MDgyLCAgLTk3NzksIC01MDk1IH0sCisgICAgeyAgLTkzODIsIC0xMDE4OCwgIC05MDUzLCAtNDkyNyB9LAorICAgIHsgLTExNTYyLCAtMTEyOTYsICAtMzY1MSwgIC05ODUgfSwKKyAgICB7ICAtOTI4NywgLTEwMDgzLCAgLTc5MTgsIC00MDY5IH0sCisgICAgeyAtMTI4MjEsIC0xNjU1NiwgLTExNDEwLCAtNjE5NSB9LAorICAgIHsgLTEyNjI4LCAgLTg5NTksICAtNDUyMSwgLTExMTMgfSwKKyAgICB7IC0xMzg0NSwgLTExNTgxLCAgLTM2NDksICAtNjgxIH0sCisgICAgeyAtMTI2ODUsIC0xMDI2OSwgIC01NDgzLCAtMTI3NSB9LAorICAgIHsgLTE0OTg4LCAtMTI4NzQsICAtNTEwNywgLTExODkgfSwKKyAgICB7IC0xMzc2MSwgLTExMzY3LCAgLTYyMDIsIC0xODA0IH0sCisgICAgeyAtMTMyMjUsIC0xMTI0OSwgIC03ODIwLCAtMzM1NCB9LAorICAgIHsgLTE0ODA5LCAtMTE5OTIsICAtMzIwMiwgIC0zMTIgfSwKKyAgICB7IC0xNTYyMCwgLTE1NTE5LCAtMTAyMTAsIC0zNDMzIH0sCisgICAgeyAtMTI5NTQsIC0xMDIwMCwgIC0zMTM5LCAgLTYxMSB9LAorICAgIHsgLTExNTM2LCAgLTk5ODEsICAtNTI4NCwgIC05MjMgfSwKKyAgICB7IC0xMzAzNCwgLTEyNDE3LCAgLTQ2MTIsIC0xMDk4IH0sCisgICAgeyAtMTY5MTEsIC0xNTUwNSwgIC02MTIzLCAtMTM1MiB9LAorICAgIHsgLTE3Mzk2LCAtMTc2ODUsICAtODMzMCwgLTIxNzEgfSwKKyAgICB7IC0xNDEyMCwgLTEwNzY0LCAgLTIyNjUsICAgLTk5IH0sCisgICAgeyAtMTI1OTgsICAtNzM2NywgIC01NDA2LCAtMzUzMCB9LAorICAgIHsgLTE0MTQzLCAtMTI3OTMsIC0xMDkwOSwgLTUyMjYgfSwKKyAgICB7IC0xNDY5MiwgLTE2ODcxLCAtMTE2MjYsIC01NTU0IH0sCisgICAgeyAtMTI1ODEsIC0xMTE5NywgIC05MTk0LCAtMzgzNyB9LAorICAgIHsgLTE2NzUyLCAtMTY3MjYsICAtOTc0NiwgLTI4MDggfSwKKyAgICB7IC0xMDYwMCwgLTEwMzU4LCAgLTY1NjAsIC0xMjI3IH0sCisgICAgeyAtMTQ1NzMsIC0xMzMxMiwgIC04OTU3LCAtMzM5MyB9LAorICAgIHsgLTEwMTcyLCAgLTg0NjMsICAtODU3OSwgLTMzODcgfSwKKyAgICB7IC0xMTQxOCwgLTEyNDIxLCAgLTU1MjIsIC0xODQyIH0sCisgICAgeyAtMTE4NTUsIC0xNDIwNCwgIC02NjY5LCAtMjYyNSB9LAorICAgIHsgLTEzMzA4LCAgLTgxOTEsICAtMzk0MSwgLTIxOTQgfSwKKyAgICB7IC0xMDAwNywgLTEyMjY2LCAgLTUwMjIsIC0xODExIH0sCisgICAgeyAtMTM1MzIsIC0xNTc3MSwgIC05NDk3LCAtMzE3NSB9LAorICAgIHsgLTExNzYwLCAtMTExNDgsIC0xMDMzOSwgLTU1MjkgfSwKKyAgICB7IC0xMjE0OSwgLTEyNzYzLCAtMTExOTgsIC0zNjk3IH0sCisgICAgeyAtMTIwMjksIC0xMjExOSwgIC04NTU1LCAtMTc5MiB9LAorICAgIHsgLTE2OTk1LCAtMTk5NTcsIC0xMTQ0NywgLTM0NzEgfSwKKyAgICB7IC0xMzE0NCwgLTE0NTA0LCAgLTk5ODgsIC0zMTkxIH0sCisgICAgeyAgLTk5MzgsIC0xMTA2NCwgIC02MTM5LCAtMzE2MiB9LAorICAgIHsgIC04ODczLCAtMTE1NTAsICAtODI5NCwgLTY1NTAgfSwKKyAgICB7ICAtOTMwMywgLTEzMDEwLCAgLTYxNTAsIC0yNzExIH0sCisgICAgeyAtMTU0NjMsIC0xMDQ2OSwgIC0xNzY2LCAgLTE3MCB9LAorICAgIHsgLTE1OTg1LCAtMTE2OTMsICAtMzAwNywgIC02NTAgfSwKKyAgICB7IC0xNzE0MiwgLTEwNjcxLCAgLTE0MzQsICAgIDQ3IH0sCisgICAgeyAtMTYwNjMsIC0xMzg1OCwgIC00ODE3LCAtMTA1OCB9LAorICAgIHsgLTE5NDQ2LCAtMTk1OTksICAtOTU5NCwgLTI0NjQgfSwKKyAgICB7IC0yMDA3NiwgLTE4NzQ0LCAgLTgzMTMsIC0xODg5IH0sCisgICAgeyAtMTUwNDcsIC0xNjA4NSwgIC03NTkwLCAtMjI1MCB9LAorICAgIHsgLTEzNDgxLCAtMTYxOTUsICAtODU1MiwgLTI5OTggfSwKKyAgICB7IC0xMzgyOSwgLTE0ODY5LCAgLTY3MDQsIC0xOTMyIH0sCisgICAgeyAtMTYzNTcsIC0xODQ4NCwgIC05ODAyLCAtMjk1OSB9LAorICAgIHsgLTEwNTUxLCAgLTgzOTMsICAtOTMwMywgLTUwNzAgfSwKKyAgICB7IC0xMTM0NSwgIC05MTU2LCAgLTU2NDEsIC0zMTA3IH0sCisgICAgeyAtMTMyMTcsIC0xMzQ0OSwgIC05MjcwLCAtNDU0MSB9LAorICAgIHsgLTExOTg4LCAtMTM3MzIsICAtOTk5NSwgLTYzNzQgfSwKKyAgICB7IC0xMTAwNywgIC05NTE5LCAgLTUxNjgsIC00MTA3IH0sCisgICAgeyAgIDk5MzAsICAtNzg1OCwgICA4MDYxLCAtNDM3NSB9LAorICAgIHsgICA4Mjc0LCAgLTc4NjcsICAgNTk5MiwgLTIwOTYgfSwKKyAgICB7ICAgOTY5MiwgIC05Njc1LCAgIDc2MjEsIC0zNjcwIH0sCisgICAgeyAgIDk1ODksICAtODExMCwgICA2NTA5LCAtMzAxMCB9LAorICAgIHsgIDEyNjE3LCAtMTE5NzYsICAxMDEyMiwgLTUzNjAgfSwKKyAgICB7ICAxMTg2NywgIC04ODk1LCAgIDc5NDgsIC01MzIzIH0sCisgICAgeyAgMTAzODgsIC0xMDQ4MiwgICA5MjM0LCAtNDMyNCB9LAorICAgIHsgICA4MTg4LCAgLTgyMjAsICAgNzgxMCwgLTI3MzcgfSwKKyAgICB7ICAxMDQwNywgIC04Nzg3LCAgIDQ4MDYsIC0xOTMwIH0sCisgICAgeyAgMTAzNDgsICAtODg0NSwgICA5MjMzLCAtNjYxNCB9LAorICAgIHsgICA5NDIyLCAgLTcwOTEsICAgNDgyMCwgLTI4NzggfSwKKyAgICB7ICAgOTc1OCwgIC05Nzk2LCAgIDU1ODQsIC0yMjU2IH0sCisgICAgeyAgMTAxODgsICAtNzk5NCwgICA1MzQ3LCAtMzM0MyB9LAorICAgIHsgIDExMTMzLCAgLTc0NTUsICAgNDAxNSwgLTIzMDYgfSwKKyAgICB7ICAxMDY3NiwgLTEwNzQ0LCAgIDYwOTMsIC0yNjI5IH0sCisgICAgeyAgMTE1MjIsIC0xMjE4NCwgICA3ODQ4LCAtMzM3NSB9LAorICAgIHsgICA4ODA1LCAgLTk4ODMsICAgNTMxNywgLTMwNzEgfSwKKyAgICB7ICAgOTQ5OCwgIC05NjU0LCAgIDY1NTUsIC0zNTkyIH0sCisgICAgeyAgMTA0ODgsICAtODAwOCwgICA0MDY2LCAtMTI1MiB9LAorICAgIHsgIDExMjYxLCAgLTg5MzAsICAgNjA2OCwgLTI3MzggfSwKKyAgICB7ICAxMjE4MCwgLTEwMzk3LCAgIDUwMjcsIC0xNTMxIH0sCisgICAgeyAgIDkxMzgsICAtODUzMSwgICAzNjAxLCAtMTk1OSB9LAorICAgIHsgICA4MTA3LCAgLTgzODAsICAgNDk3MCwgLTIwNjEgfSwKKyAgICB7ICAgOTczNywgLTEzMjQ4LCAgIDY0MzgsIC0yNjE3IH0sCisgICAgeyAgMTExNzgsIC0xMDQyMywgICAyNjIyLCAgLTUyMiB9LAorICAgIHsgICA5NTcyLCAtMTIzNzIsICAgNTE5OSwgLTIwMTkgfSwKKyAgICB7ICAxMjA1NywgLTEyMTQ0LCAgIDQxNDcsIC0xMDk5IH0sCisgICAgeyAgIDkwNDcsICAtOTkyNSwgICAyNTE2LCAgLTY2NSB9LAorICAgIHsgIDEwNzkwLCAgLTgwMzAsICAgNTg4MiwgLTQzODYgfSwKKyAgICB7ICAgNzE5OSwgIC04NDI2LCAgIDYzMzcsIC0yODQxIH0sCisgICAgeyAgIDc3NzgsICAtODI4NSwgICAzNTI5LCAtMzQ0MiB9LAorICAgIHsgICA3NTU5LCAtMTA1NjksICAgMzQ4NCwgLTEzMzIgfSwKKyAgICB7ICAgOTQwNCwgIC04MTE1LCAgIDc0ODQsIC01NTQxIH0sCisgICAgeyAgIDc3OTIsIC0xMTk3NiwgICA1NTQ2LCAtMjU3MyB9LAorICAgIHsgICA5MzEzLCAtMTAyNjQsICAgNzY2MSwgLTUxOTUgfSwKKyAgICB7ICAgNjcwMSwgLTEwNzI1LCAgIDQzNzAsIC0xNzg0IH0sCisgICAgeyAgIDQ5MTgsIC0xMTM2MSwgICA0NTA3LCAtNDUyNyB9LAorICAgIHsgICA1MTQ3LCAtMTIzMDUsICAgMzk3OCwgLTU1NTYgfSwKKyAgICB7ICAgNjUyNSwgIC05ODk5LCAgIDQ0ODEsIC0zMTI5IH0sCisgICAgeyAgIDc1MzgsIC0xMjg1NSwgICA2MDYwLCAtNDgyNiB9LAorICAgIHsgICA4NjU5LCAtMTIxMTEsICAgNzE1OSwgLTQ0MzAgfSwKKyAgICB7ICAgODQ0MCwgLTExMzA0LCAgIDQ1NDcsIC0xNzQ3IH0sCisgICAgeyAgIDkyMTYsIC0xMDkxOCwgICAzNTA3LCAtMTE5NSB9LAorICAgIHsgICA2MTY1LCAgLTkyNTQsICAgNDc3MSwgLTQ2NzcgfSwKKyAgICB7ICAgOTE2MywgLTExMDE5LCAgIDU2MzcsIC00OTM1IH0sCisgICAgeyAgMTM0NDEsIC0xMTUwOSwgICA2Njc2LCAtMjQzNCB9LAorICAgIHsgICA3OTEyLCAgLTkzOTgsICAgNjY2MywgLTQwNDggfSwKKyAgICB7ICAxMTcyMywgLTEzNzQ1LCAgIDgxMzEsIC00MTQ4IH0sCisgICAgeyAgIDYwNjUsIC0xMDI1NywgICA1MDA1LCAtNjMyNyB9LAorICAgIHsgIDExNjE4LCAtMTI0MTcsICAgNTMzNiwgLTE4OTQgfSwKKyAgICB7ICAgODg5MSwgLTEzOTI0LCAgIDg0MDcsIC02MTMxIH0sCisgICAgeyAgIDk2MjIsIC0xMjU2MywgICA3OTA4LCAtNTEwOSB9LAorICAgIHsgIDExNDc5LCAtMTAzMTUsICAgODM0OSwgLTM5OTEgfSwKKyAgICB7ICAxMTY3NiwgLTE0MTAzLCAgIDY2MTEsIC0yMzMwIH0sCisgICAgeyAgMTE5NTEsICAtODk1MywgICAzODI5LCAtMTU1MCB9LAorICAgIHsgIDEwNDg2LCAgLTgwNDQsICAxMDQ5MywgLTU5MjAgfSwKKyAgICB7ICAxMTgwMSwgLTEwNzY5LCAgIDk3NjMsIC01MzA1IH0sCisgICAgeyAgIDYxMDksICAtODY3NiwgICA1ODI3LCAtMTM0NiB9LAorICAgIHsgICA3MDMwLCAgLTk2MTEsICAgNTYyNCwgLTU3NjEgfSwKKyAgICB7ICAxMjgwOCwgLTEyODg2LCAgIDg2ODMsIC00MTQ4IH0sCisgICAgeyAgMTMyMTMsIC0xMDQ2NCwgICA2MzgxLCAtMzE4OSB9LAorICAgIHsgIDExNzk2LCAtMTM2ODEsICAxMDcwMywgLTYwNzUgfSwKKyAgICB7ICAgOTYzOSwgIC03OTQ5LCAgIDk2MjUsIC0zOTQ0IH0sCisgICAgeyAgIDg1MzgsICAtNjk5NywgICA1MzA5LCAgIDQ1MyB9Cit9OworCisvKiBxdWFudGl6YXRpb24gdGFibGVzICovCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBzY2FsZV9mYWN0b3JfcXVhbnQ2WzY0XSA9IHsKKyAgICAgICAgICAxLCAgICAgICAyLCAgICAgICAyLCAgICAgICAzLCAgICAgICAzLCAgICAgICA0LCAgICAgICA2LCAgICAgICA3LAorICAgICAgICAgMTAsICAgICAgMTIsICAgICAgMTYsICAgICAgMjAsICAgICAgMjYsICAgICAgMzQsICAgICAgNDQsICAgICAgNTYsCisgICAgICAgICA3MiwgICAgICA5MywgICAgIDEyMCwgICAgIDE1NSwgICAgIDIwMCwgICAgIDI1NywgICAgIDMzMSwgICAgIDQyNywKKyAgICAgICAgNTUwLCAgICAgNzA4LCAgICAgOTEyLCAgICAxMTc1LCAgICAxNTE0LCAgICAxOTUwLCAgICAyNTEyLCAgICAzMjM2LAorICAgICAgIDQxNjksICAgIDUzNzAsICAgIDY5MTgsICAgIDg5MTMsICAgMTE0ODIsICAgMTQ3OTEsICAgMTkwNTUsICAgMjQ1NDcsCisgICAgICAzMTYyMywgICA0MDczOCwgICA1MjQ4MSwgICA2NzYwOCwgICA4NzA5NiwgIDExMjIwMiwgIDE0NDU0NCwgIDE4NjIwOSwKKyAgICAgMjM5ODgzLCAgMzA5MDMwLCAgMzk4MTA3LCAgNTEyODYxLCAgNjYwNjkzLCAgODUxMTM4LCAxMDk2NDc4LCAxNDEyNTM4LAorICAgIDE4MTk3MDEsIDIzNDQyMjksIDMwMTk5NTIsIDM4OTA0NTEsIDUwMTE4NzIsIDY0NTY1NDIsIDgzMTc2MzgsICAgICAgIDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBzY2FsZV9mYWN0b3JfcXVhbnQ3WzEyOF0gPSB7CisgICAgICAgICAgMSwgICAgICAgMSwgICAgICAgMiwgICAgICAgMiwgICAgICAgMiwgICAgICAgMiwgICAgICAgMywgICAgICAgMywKKyAgICAgICAgICAzLCAgICAgICA0LCAgICAgICA0LCAgICAgICA1LCAgICAgICA2LCAgICAgICA3LCAgICAgICA3LCAgICAgICA4LAorICAgICAgICAgMTAsICAgICAgMTEsICAgICAgMTIsICAgICAgMTQsICAgICAgMTYsICAgICAgMTgsICAgICAgMjAsICAgICAgMjMsCisgICAgICAgICAyNiwgICAgICAzMCwgICAgICAzNCwgICAgICAzOCwgICAgICA0NCwgICAgICA1MCwgICAgICA1NiwgICAgICA2NCwKKyAgICAgICAgIDcyLCAgICAgIDgyLCAgICAgIDkzLCAgICAgMTA2LCAgICAgMTIwLCAgICAgMTM2LCAgICAgMTU1LCAgICAgMTc2LAorICAgICAgICAyMDAsICAgICAyMjYsICAgICAyNTcsICAgICAyOTIsICAgICAzMzEsICAgICAzNzYsICAgICA0MjcsICAgICA0ODQsCisgICAgICAgIDU1MCwgICAgIDYyNCwgICAgIDcwOCwgICAgIDgwNCwgICAgIDkxMiwgICAgMTAzNSwgICAgMTE3NSwgICAgMTMzNCwKKyAgICAgICAxNTE0LCAgICAxNzE4LCAgICAxOTUwLCAgICAyMjEzLCAgICAyNTEyLCAgICAyODUxLCAgICAzMjM2LCAgICAzNjczLAorICAgICAgIDQxNjksICAgIDQ3MzIsICAgIDUzNzAsICAgIDYwOTUsICAgIDY5MTgsICAgIDc4NTIsICAgIDg5MTMsICAgMTAxMTYsCisgICAgICAxMTQ4MiwgICAxMzAzMiwgICAxNDc5MSwgICAxNjc4OCwgICAxOTA1NSwgICAyMTYyNywgICAyNDU0NywgICAyNzg2MSwKKyAgICAgIDMxNjIzLCAgIDM1ODkyLCAgIDQwNzM4LCAgIDQ2MjM4LCAgIDUyNDgxLCAgIDU5NTY2LCAgIDY3NjA4LCAgIDc2NzM2LAorICAgICAgODcwOTYsICAgOTg4NTUsICAxMTIyMDIsICAxMjczNTAsICAxNDQ1NDQsICAxNjQwNTksICAxODYyMDksICAyMTEzNDksCisgICAgIDIzOTg4MywgIDI3MjI3MCwgIDMwOTAzMCwgIDM1MDc1MiwgIDM5ODEwNywgIDQ1MTg1NiwgIDUxMjg2MSwgIDU4MjEwMywKKyAgICAgNjYwNjkzLCAgNzQ5ODk0LCAgODUxMTM4LCAgOTY2MDUxLCAxMDk2NDc4LCAxMjQ0NTE1LCAxNDEyNTM4LCAxNjAzMjQ1LAorICAgIDE4MTk3MDEsIDIwNjUzODAsIDIzNDQyMjksIDI2NjA3MjUsIDMwMTk5NTIsIDM0Mjc2NzgsIDM4OTA0NTEsIDQ0MTU3MDQsCisgICAgNTAxMTg3MiwgNTY4ODUyOSwgNjQ1NjU0MiwgNzMyODI0NSwgODMxNzYzOCwgICAgICAgMCwgICAgICAgMCwgICAgICAgMAorfTsKKworLyogMjBiaXRzIHVuc2lnbmVkIGZyYWN0aW9uYWwgYmluYXJ5IGNvZGVzICovCitzdGF0aWMgY29uc3QgdWludDMyX3QgbG9zc3lfcXVhbnRbMzJdID0geworICAgICAgICAgMCwgNjcxMDg4NiwgNDE5NDMwNCwgMzM1NTQ0MywgMjQ3NDYzOSwgMjA5NzE1MiwgMTc2MTYwOCwgMTQyNjA2MywKKyAgICA3OTY5MTgsICA0NjEzNzMsICAyNTE2NTgsICAxNDY4MDEsICAgNzk2OTIsICAgNDYxMzcsICAgMjcyNjMsICAgMTY3NzcsCisgICAgIDEwNDg2LCAgICA1ODcyLCAgICAzMzU1LCAgICAxODg3LCAgICAxMjU4LCAgICAgNzEzLCAgICAgMzM2LCAgICAgMTY4LAorICAgICAgICA4NCwgICAgICA0MiwgICAgICAyMSwgICAgICAgMCwgICAgICAgMCwgICAgICAgMCwgICAgICAgMCwgICAgICAgMAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGxvc3N5X3F1YW50X2RbMzJdID0geworICAgICAgICAgIDAsICAgICAxLjYsICAgICAgMS4wLCAgICAgMC44LCAgICAwLjU5LCAgICAwLjUwLCAgICAwLjQyLCAgICAwLjM0LAorICAgICAgIDAuMTksICAgIDAuMTEsICAgICAwLjA2LCAgIDAuMDM1LCAgIDAuMDE5LCAgIDAuMDExLCAgMC4wMDY1LCAgMC4wMDQwLAorICAgICAwLjAwMjUsICAwLjAwMTQsICAgMC4wMDA4LCAwLjAwMDQ1LCAwLjAwMDMwLCAwLjAwMDE3LCAwLjAwMDA4LCAwLjAwMDA0LAorICAgIDAuMDAwMDIsIDAuMDAwMDEsIDAuMDAwMDA1LCAgICAgICAwLCAgICAgICAwLCAgICAgICAwLCAgICAgICAwLCAgICAgICAwCit9OworCisvKiAyMGJpdHMgdW5zaWduZWQgZnJhY3Rpb25hbCBiaW5hcnkgY29kZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBsb3NzbGVzc19xdWFudFszMl0gPSB7CisgICAgICAgICAwLCA0MTk0MzA0LCAyMDk3MTUyLCAxMzg0MTIwLCAxMDQ4NTc2LCA2OTYyNTQsIDUyNDI4OCwgMzQ4MTI3LAorICAgIDI2MjE0NCwgIDEzMTA3MiwgICA2NTQzMSwgICAzMzAyNiwgICAxNjQ1MCwgICA4MjA4LCAgIDQxMDAsICAgMjA0OSwKKyAgICAgIDEwMjQsICAgICA1MTIsICAgICAyNTYsICAgICAxMjgsICAgICAgNjQsICAgICAzMiwgICAgIDE2LCAgICAgIDgsCisgICAgICAgICA0LCAgICAgICAyLCAgICAgICAxLCAgICAgICAwLCAgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgbG9zc2xlc3NfcXVhbnRfZFszMl0gPSB7CisgICAgICAgICAgIDAsICAgICAgMS4wLCAgICAgIDAuNSwgICAgIDAuMzMsICAgICAwLjI1LCAgICAwLjE2NiwgICAgMC4xMjUsCisgICAgICAgMC4wODMsICAgMC4wNjI1LCAgMC4wMzEyNSwgICAwLjAxNTYsIDcuODc0RS0zLCAzLjkyMkUtMywgMS45NTdFLTMsCisgICAgOS43NzVFLTQsIDQuODg1RS00LCAyLjQ0MkUtNCwgMS4yMjFFLTQsIDYuMTA0RS01LCAzLjA1MkUtNSwgMS41MjZFLTUsCisgICAgNy42MjlFLTYsIDMuODE1RS02LCAxLjkwN0UtNiwgOS41MzdFLTcsIDQuNzY4RS03LCAyLjM4NEUtNywgICAgICAgIDAsCisgICAgICAgICAgIDAsICAgICAgICAwLCAgICAgICAgMCwgICAgICAgIDAKK307CisKKy8qIFZlY3RvciBxdWFudGl6YXRpb24gdGFibGVzICovCisKK0RFQ0xBUkVfQUxJR05FRCg4LCBzdGF0aWMgY29uc3QgaW50OF90LCBoaWdoX2ZyZXFfdnEpWzEwMjRdWzMyXSA9IHsKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7IC00LCAtMiwgIDIsICAxLC0xNiwtMTAsICAxLCAgMywgIDEsICAwLCAgNiwgIDEsIC0zLCAgNywgIDEsLTIyLAorICAgICAgIDIsIC00LCAtMywgMTEsIDE0LCAgNiwgLTEsICAxLC0xMywgMjksLTI4LCAxMCwgMTAsIC04LCAgMCwgLTkgfSwKKyAgICB7IC04LCAgOCwgLTcsIDEwLCAtMywtMTIsIC01LCAtOCwgIDEsIC0yLCAgOSwgLTIsIC01LC0xOCwgIDEsICA5LAorICAgICAgLTgsIC04LCAgMywgNDEsICA3LCAtOSwgLTksIDIyLC00MiwtMjksIDE0LC0xOCwtMTQsLTMyLCAgMSwtMTUgfSwKKyAgICB7LTE2LCAgOCwgMTUsIDE2LC0xNiwgIDUsICAyLCAgNywgLTYsLTE2LCAtNywgIDEsICAxLCAtMywgLTIsICAwLAorICAgICAgIDgsIDIwLC0yNiwtMTEsICAyLC0xNywgIDAsIC0zLC0zNCwtMzcsIDEwLCA0NCwgLTIsIDIyLCAgMiwgLTQgfSwKKyAgICB7ICA3LCAxNCwgIDUsICA2LCAxNSwgLTEsICAzLCAtMywgLTksLTIzLCAtNSwtMTQsICA4LCAtMSwtMTQsIC02LAorICAgICAgLTUsIC04LCA1NCwgMzEsIC02LCAxOCwgIDIsLTE5LCAtMiwtMTEsLTMwLCAtNiwtMTksICAyLCAtMiwtMTQgfSwKKyAgICB7ICAxLCAgMiwgLTIsIC0xLCAtMywgLTMsICAxLCAtNSwgIDEsIC0zLCAtNCwgLTgsICA1LCAtNCwgIDAsICAxLAorICAgICAgIDMsICA3LCAtNSwgLTQsIC0zLC0xMiwgIDMsIC0yLCAtMywgMTIsLTUzLC01MSwgIDYsIC0xLCAgNiwgIDggfSwKKyAgICB7ICAwLCAtMSwgIDUsICAxLCAtNiwgLTgsICA3LCAgNSwtMTgsIC00LCAtMSwgIDEsICAwLCAtMywgLTMsLTE0LAorICAgICAgLTEsIC02LCAgMCwtMTQsIC0xLCAtMSwgIDUsIC0zLC0xMSwgIDEsLTIwLCAxMCwgIDIsIDE5LCAtMiwgLTIgfSwKKyAgICB7ICAyLCAgNCwgIDMsICAwLCAgNSwgIDAsICAzLCAgMSwgLTIsICAwLCAtNiwgLTMsIC00LCAtNSwgLTMsIC0zLAorICAgICAgLTcsICAwLC0zNCwgIDQsLTQzLCAxNywgIDAsLTUzLC0xMywgLTcsIDI0LCAxNCwgIDUsLTE4LCAgOSwtMjAgfSwKKyAgICB7ICAxLCAgMCwgLTMsICAyLCAgMywgLTUsIC0yLCAgNywtMjEsICA1LC0yNSwgMjMsIDExLC0yOCwgIDIsICAxLAorICAgICAtMTEsICA5LCAxMywgLTYsLTEyLCAgNSwgIDcsICAyLCAgNCwtMTEsIC02LCAtMSwgIDgsICAwLCAgMSwgLTIgfSwKKyAgICB7ICAyLCAtNCwgLTYsIC00LCAgMCwgLTUsLTI5LCAxMywgLTYsLTIyLCAtMywtNDMsIDEyLC00MSwgIDUsIDI0LAorICAgICAgMTgsIC05LC0zNiwgLTYsICA0LCAtNywgLTQsIDEzLCAgNCwtMTUsIC0xLCAtNSwgIDEsICAyLCAtNSwgIDQgfSwKKyAgICB7ICAwLCAtMSwgMTMsIC02LCAtNSwgIDEsICAwLCAtMywgIDEsIC01LCAxOSwtMjIsIDMxLC0yNywgIDQsLTE1LAorICAgICAgLTYsIDE1LCAgOSwtMTMsICAxLCAtOSwgMTAsLTE3LCAgNCwgLTEsIC0xLCAgNCwgIDIsICAwLCAtMywgLTUgfSwKKyAgICB7IC03LCAgMywgLTgsIDEzLCAxOSwtMTIsICA4LC0xOSwgLTMsIC0yLC0yNCwgMzEsIDE0LCAgMCwgIDcsLTEzLAorICAgICAtMTgsICAwLCAgMywgIDYsIDEzLCAtMiwgIDEsLTEyLC0yMSwgIDksIC0yLCAzMCwgMjEsLTE0LCAgMiwtMTQgfSwKKyAgICB7IC0zLCAtNywgIDgsIC0xLCAtMiwgLTksICA2LCAgMSwgLTcsICA3LCAxMywgIDMsIC0xLC0xMCwgMzAsICA0LAorICAgICAtMTAsIDEyLCAgNSwgIDYsLTEzLCAtNywgLTQsIC0yLCAtMiwgIDcsIC0zLCAtNiwgIDMsICA0LCAgMSwgIDIgfSwKKyAgICB7IC04LCAgOSwgIDIsIC0zLCAtNSwgIDIsICAwLCAgOSwgIDMsICA3LCAtNCwtMTYsLTEzLCAgMywgMjMsLTI3LAorICAgICAgMTgsIDQ2LC0zOCwgIDYsICA0LCA0MywgLTEsICAwLCAgOCwgLTcsIC00LCAtMSwgMTEsIC03LCAgNiwgLTMgfSwKKyAgICB7ICAxLCAgMSwgMTgsIC04LCAtNiwgIDAsICAzLCAgNCwgMjIsIC0zLCAtNCwgLTIsIC00LC0xMSwgNDAsIC03LAorICAgICAgLTMsLTEzLC0xNCwgLTcsLTEwLCAxNCwgIDcsICA1LC0xNCwgMTEsIC01LCAgNywgMjEsIC0yLCAgOSwgLTMgfSwKKyAgICB7ICAwLCAgMCwgLTIsICA0LCAtMiwgIDAsICAyLCAgMCwgLTEsICAyLCAtMSwgIDAsICAwLCAgMiwgIDIsICAyLAorICAgICAgLTEsICAxLCAtMywgLTEsLTE1LCAtMiwtNjMsLTI3LC0yMSwtNDcsLTE0LCAgMSwtMTQsIDEwLCAgMCwgIDIgfSwKKyAgICB7ICAxLCAgMCwgLTQsICAwLCAtMywgLTksICA0LCAgMiwgIDYsIC02LCAgMCwgLTUsIDExLCAtNywtMTUsICA2LAorICAgICAgLTcsIC02LCAgMywgIDcsLTE1LCAtNSwgMjMsLTEzLCAtNiwgMTIsIC04LCAgOSwgIDIsIC0zLCAgMywgIDQgfSwKKyAgICB7ICA2LCAgMCwgIDMsICAwLCAtMiwgLTQsICAyLCAgMSwgIDEsIC0xLCAgMSwgLTIsIC0xLCAtNCwtMjIsLTE1LAorICAgICAtNDYsLTY2LCAxMCwgMjAsICAyLC0xNywgMTIsIC02LCAgMSwgLTIsIC0yLCAgMCwgIDEsIC01LCAgMSwgIDIgfSwKKyAgICB7IC0xLCAgMCwgIDAsICAxLCAgMCwgLTQsICAwLCAgMSwtMTAsIC0zLCAtOCwgIDUsICA3LC0xMSwgIDIsLTExLAorICAgICAgMjksLTI1LCAxMSwgMTAsICAwLCAtMSwgIDUsIC03LCAtMiwgLTUsIC0yLCAgNCwgIDQsIC0zLCAgNSwgLTIgfSwKKyAgICB7ICAxLCAtMSwgLTEsIC0zLCAtMiwgIDEsIC04LCAtMywgIDIsIC0yLCAgNCwgLTUsIC0xLCAtNywgLTIsICAxLAorICAgICAtMTQsIC03LCAgMywtMzAsLTE1LC0xNCwgIDMsIC00LCAtMSwgIDMsLTEzLCAtMSwgLTMsICAxLCAgMiwgIDMgfSwKKyAgICB7IC0xLCAtMiwgLTMsICAyLCAgMiwgLTMsICAzLCAgMSwgLTMsICAyLCAgMCwgLTQsICA2LCAgNSwgLTUsIDEwLAorICAgICAtNTcsICAzLCAyMiwtNTAsICAxLCAtMiwgLTUsIC02LCAtMSwgIDUsICAxLCAgMiwgIDIsICAxLCAtMiwgIDIgfSwKKyAgICB7ICAyLCAgMCwgLTEsIC03LCAgMiwgIDEsICAzLCAgMiwgIDAsICA0LCAgMywgLTIsICAzLCAtMywgIDQsIC00LAorICAgICAgMjQsLTM1LCAtMywgMzgsIC02LCAtNSwgMTUsIDIwLCAgMywgMTYsIC03LCAtNSwgIDAsIC00LCAtNSwgIDAgfSwKKyAgICB7ICAwLCAgMSwgIDAsICAwLCAgMCwgLTEsIC0xLCAgMSwgIDEsIC0xLCAgMSwgLTIsICAwLCAgMCwgIDAsICAwLAorICAgICAgIDAsIC0xLCAtMiwgLTEsIC01LCAtMiwtNDMsIC0zLCA0NiwtNTIsLTEwLCAgNywgLTgsIDExLCAtMiwgLTEgfSwKKyAgICB7ICAwLCAgMCwgLTEsICAwLCAtMSwgIDIsLTQxLCAzMywtNDQsLTQ4LC0xNSwtMjYsIC05LCAgNiwgIDMsICAzLAorICAgICAgLTMsICAyLCAgMiwgIDIsICAyLCAtMSwgLTEsIC0yLCAgMSwgIDMsICAwLCAgMCwgIDUsICAyLCAgMywgIDEgfSwKKyAgICB7IC00LCAgMSwgIDYsICAxLCAtNiwgLTEsIC0yLCAgMSwtMTQsIC00LCAgMCwgLTUsIC0yLCAgMiwgLTIsICAwLAorICAgICAgLTYsICAxLCAgMCwgIDgsLTIxLCAzMiwgLTMsLTM2LCAtNiwgLTIsIC0xLCAtNywgIDMsICAwLCAgMSwgLTYgfSwKKyAgICB7IC0zLCAtMiwgIDMsICAwLCAgMiwgIDIsICA4LCAtNCwgLTQsICA2LCAgMiwgIDEsICAzLCAtNiwgIDQsICAzLAorICAgICAgMTMsICAwLC0xMiwgLTEsIDI1LC0yMCwgLTIsLTIzLC0xNSwgIDcsIC0zLC0xMSwgLTMsICA2LCAtMSwgIDAgfSwKKyAgICB7ICAwLCAgMCwgLTMsIC0xLCAgMCwgIDAsIC0yLCAtMSwgLTIsIC0yLCAgMSwgLTEsICAwLCAgMCwgMTAsICAzLAorICAgICAgLTIsICAzLCAgMywgLTcsIC02LCAtNSwgIDAsIC00LC02MCwtMTYsIC02LCAzOCwgIDUsICA2LCAtNSwgIDAgfSwKKyAgICB7ICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsIC0xLCAtMSwgIDAsICAxLCAgMCwgIDAsICAxLAorICAgICAgIDAsICAwLCAtMSwgIDAsIC04LCAgMiwgLTksIDEwLCA0MCwgMzEsLTU2LC0yMSwgIDQsIDIwLCAtNCwgIDcgfSwKKyAgICB7IC0yLCAtMiwgIDAsICA0LCAtMywgLTEsICA3LCAgMywgIDEsICAzLCAtOCwgIDAsICAzLCAgMSwgIDIsICA1LAorICAgICAgIDEsIC0yLCAxNCwgIDUsICA0LCAgNSwgIDUsICA1LCAtNSwgIDksLTY2LCAgMCwtMjAsIC0yLCAtOCwgIDQgfSwKKyAgICB7IC0yLCAtMSwgIDQsIC0xLCAtOCwgLTIsIC00LCAtMSwgLTMsIC0zLCAgMiwgLTcsIC0zLCAgNSwgIDcsIC0yLAorICAgICAgNDUsIDMxLC0xNywtMTYsIC0yLCAtMiwgLTEsLTIyLCAgMSwgLTEsIC0zLCAgMywgIDUsIC0zLCAgNSwgLTEgfSwKKyAgICB7IC00LCAgMCwgIDcsICA1LCAgOCwgIDcsICAyLCAgOSwgLTksIC05LCAtNywtMTEsIC0zLCAtOCwgMTcsIC00LAorICAgICAgMzQsIDMyLCAxOCwgMjIsICAxLCAgMiwgIDEsIC03LCAtNSwgIDYsIC0xLCAgNiwgIDQsIDEwLCAtMiwgLTcgfSwKKyAgICB7ICA2LCAgMCwgMTQsICA5LCAgNiwgLTEsIC0yLCAtMywgIDQsIC02LCAtOCwgIDQsICA3LCAtMSwgMjgsIDM4LAorICAgICAgMTUsIC0xLCAxNiwtMTEsICA1LCAgOCwgIDQsLTEwLCAgMywtMTAsLTE3LCAgNSwgIDMsICAzLCAgMywgIDEgfSwKKyAgICB7ICAxLCAgMSwgIDIsIC0xLCAgMiwgIDEsICAwLCAgMCwgLTEsICAwLCAgMCwgLTIsICAxLCAtMywgIDAsICAxLAorICAgICAgIDIsIC0yLCAtNCwgLTIsICAwLCAtMSwgIDEsIC0zLCAgMSwgIDEsICAxLCAtMSwgIDgsICA4LCA2NiwgMzMgfSwKKyAgICB7IC01LCAgMiwgLTMsIC03LCAgMiwgLTgsIC00LCAxMCwgMTcsLTE4LCAtNywgIDQsIC00LCAtNywgLTYsIC02LAorICAgICAgLTUsICA1LC0xMiwgIDIsICAwLCAgNiwgIDgsIC0yLCAgMSwgIDQsLTExLCAgMiwgIDEsICA4LCAzMSwgMTkgfSwKKyAgICB7ICA2LCAgOSwgMTYsIC02LCAtNiwgLTEsIC0yLCAtMywtMTEsIC0yLCAgNywgIDcsIDE3LCAgMywgIDQsIDEwLAorICAgICAgIDIsICA1LC0xMywgIDgsICA3LCAgMSwgIDQsICA1LCAgNywgIDYsICA3LCAtOCwgIDksIC04LCAzMywgIDYgfSwKKyAgICB7ICAzLCAtMSwgIDEsICAwLCAtNywgLTUsICAwLCAxNCwgLTcsICAxLCAtNywgIDEsICAyLCAtNCwgIDcsIDEwLAorICAgICAtMTYsIDEyLCAgMSwgLTYsICAzLCAgOCwgLTEsIDEwLC0xMywgLTYsLTEyLC0yMywgMTIsIC0zLCAzMCwgMTQgfSwKKyAgICB7IC0yLC0xNSwgIDAsICA4LCAgMywtMTksICA1LCAtMywgIDIsICAzLCAxMywgIDcsIDE0LCAtMywtMTAsICAwLAorICAgICAgIDgsICA1LCAtNiwtMTYsIC04LCAtOCwgMTQsICAyLCAtMSwgIDEsIC05LC0xMSwgMTEsIC01LCAyNywgIDkgfSwKKyAgICB7IC04LCAgNiwgLTQsICA0LCAtNCwgLTEsICA1LCAgNCwgIDEsIC03LCAtNSwgLTQsLTE1LCAgMSwgIDksICAwLAorICAgICAgIDgsICA0LCAgMSwtMTcsIDExLCAtMiwtMTksIC0xLCAtNiwgLTgsICAzLC0xMiwgIDMsLTE3LCAzMywtMTAgfSwKKyAgICB7IC0zLCAtMSwgIDIsICA3LCAgNywgLTIsICA5LCAgOCwtMTgsIC0xLC0xMywtMTAsIC0zLCAtMywgMTEsICA4LAorICAgICAgLTIsLTEyLCAtOCwgIDEsICA0LCAgOSwgMTQsIDEwLCAtMywgIDAsICAyLCAgMSwgLTIsICAzLCAzMSwgMTAgfSwKKyAgICB7IC0zLC0xMCwgIDgsIC0xLCAtNSwtMTEsICA3LCAtNSwgIDMsICA2LCAgMSwgIDQsLTE2LCAxMCwgIDUsIC00LAorICAgICAgLTIsLTEwLCAtMSwgMTMsICA2LCAtNSwgLTcsIDEyLCAgNywgLTMsLTE3LCAgMSwgMTIsIC00LCAyOSwgIDggfSwKKyAgICB7ICAxLCAgMiwgIDUsICAyLCAtNiwgLTcsICAwLCAtMSwgIDYsIC0xLCAxMCwgIDYsIC00LCAgNSwgIDIsICAyLAorICAgICAgLTIsIC04LCAtNiwtMTEsIDE0LC0xMywgMjcsICAzLCAtMiwtMTIsICA1LC0xNiwgIDIsLTI2LCAyMCwgMTUgfSwKKyAgICB7IC0xLCAtMywgLTUsIC0zLCAtMywgIDYsIC0xLCAgMywgLTUsICAxLCAgNywgIDIsICAxLCAgMCwgLTEsIC0xLAorICAgICAgIDAsIC0xLCAgOSwgIDcsIC02LCAtMywgIDQsIC01LCAtNCwgIDgsIC04LC0yNSwgLTgsIC00LCAzNCwgMjMgfSwKKyAgICB7IC0xLCAtMiwgIDEsICAxLCAtMSwgLTIsIC0xLCAgMSwgLTEsICAwLCAgMCwgIDAsICAwLCAtMiwgLTEsICAxLAorICAgICAgIDAsICAyLCAgMSwgLTEsICA0LCAgMCwgIDAsICAxLCAtMSwgIDAsICA1LCAgMywgMTIsIC05LCA2OCwtMTYgfSwKKyAgICB7IDEwLCAgMCwgLTgsIDE0LCAtNiwgIDEsLTEyLCAgMCwgIDAsIC0zLCAtNSwtMTEsIC02LCAxMiwgIDksLTEwLAorICAgICAgLTMsICA1LCAgMCwgIDcsIDExLCAgMiwgIDQsIC0zLCAtOCwgLTMsICA3LCAgNCwgIDMsIC0zLCAzNCwgIDQgfSwKKyAgICB7LTEyLCAxMywgLTUsICA3LC0xMSwgLTIsIC0xLCAgMSwgLTQsLTE0LC0yMSwgIDMsIC0zLCAtMywgLTQsIC03LAorICAgICAgLTksIC00LCAgMywtMTcsIC0yLC0xMywgMTAsIC0yLCAxMiwgLTQsICAwLCAtOSwgIDEsIC01LCAzMSwgMTAgfSwKKyAgICB7LTEwLCAgNiwgIDUsICA2LCAgNCwgLTcsIDEwLCAgMCwtMjgsIC0zLCAgMCwtMTEsIC0xLCAtNSwgMTYsLTEwLAorICAgICAtMTYsICA3LCAyMCwgIDIsIC00LCAgMiwgLTUsICAwLCAxNSwgIDYsICA1LC0xMCwgIDcsIC05LCAyMCwgIDQgfSwKKyAgICB7ICAxLCAtNywgLTIsIC03LCAgNCwgLTMsIC0yLCAtNywgLTEsLTE0LCAgNiwtMTYsICA0LCAtNSwgLTQsIC02LAorICAgICAgLTUsICAwLCAtMiwgIDIsIC02LCAgOSwgLTUsICA0LC0xOCwgIDgsLTEwLCAgOCwgMTUsICAwLCAzMiwgIDEgfSwKKyAgICB7IC01LCAgNywgLTMsICA3LCAxNSwgLTQsICAwLC0xNiwgIDksICA1LCAtNSwgIDUsICA0LCAtMywtMTIsIC05LAorICAgICAtMTgsIDEwLCAgMiwgIDIsIC0zLCAgNywgIDMsIC0xLCAgNiwgLTksLTEwLCAgMywgMTUsIC00LCAzNSwgLTcgfSwKKyAgICB7IC0xLC0xMCwgIDIsICAyLCAtNCwgLTIsIDEwLCAgMiwgLTEsICAyLCAtMiwgIDEsIC0xLC0xNCwtMTEsICAzLAorICAgICAgLTgsICA1LCAtOCwgLTIsICA2LCAtMSwgLTcsICAxLCAgNywgIDUsICA3LCAgOCwgMzAsIC00LCAzMCwgMTQgfSwKKyAgICB7ICAyLCAtMiwgIDEsICAyLCAgMywgLTgsICAzLCAgMCwgLTIsICAwLCAtOSwgIDIsICAxLCAgNCwgLTYsIC0xLAorICAgICAgLTIsICA1LCAgMCwgIDEsIC0yLCAxMiwgIDYsIC0zLCAgOSwgLTMsICA0LC0xMiwgMjEsLTM5LCAyNCwgLTIgfSwKKyAgICB7ICAzLCAgNSwgIDEsIC0yLCAtMiwgLTIsIC0zLCAgNiwgLTgsIC0yLC0xMSwgLTgsIC0xLCAgNCwgIDIsICAyLAorICAgICAgLTQsLTEwLCAxMiwgLTUsLTExLCAgMSwtMTUsLTM0LC0xMSwgLTcsLTExLCAtMSwgIDcsLTE0LCAzOCwgLTEgfSwKKyAgICB7IC00LCAgNCwgIDgsICA5LCAgOCwgIDEsIC01LCAtOSwgIDQsIC0yLCAxNSwgLTQsIDExLC0xNSwgMjAsIC0xLAorICAgICAgLTEsIC0zLCAgNCwgLTksIC0yLCAtMiwgLTIsICA4LCAgNiwgMTIsIC01LCAgMCwgMTEsLTEyLCAyNywgLTQgfSwKKyAgICB7ICAwLCAgOCwgLTQsICAzLC0xMSwgIDYsLTExLCAgMiwgIDMsICAwLCAgNSwgLTgsIC03LCAtNiwgLTksLTIxLAorICAgICAgIDQsLTExLCAtMSwtMTYsIC03LCAxNiwgLTMsICA3LCAtNywgIDQsIC01LCAgMCwgMTEsIC03LCAzMSwgIDMgfSwKKyAgICB7ICAxLCAgMywgIDQsIDExLC0xMSwgLTIsIC0zLCAtNiwgIDYsICA1LCAgMCwgIDMsIC05LCAtNiwgIDQsIC00LAorICAgICAgIDAsICA0LCAtOCwgMTMsIC02LC0xMywgLTEsIC01LCAtMSwgIDQsICAwLCAgMCwgIDksLTIyLCAyNCwgMTggfSwKKyAgICB7IC03LCAgMywgMTAsLTEzLCAtNiwgIDYsIC02LCAgNiwgMjIsICAxLCAgMCwtMTQsICAyLCAgMywgIDcsIC0xLAorICAgICAgIDgsIDIwLCAtMSwgIDUsIC00LCAxMywgIDksIC05LCAtOSwgIDYsICAwLCAtNCwgIDAsIC04LCAzMSwgLTQgfSwKKyAgICB7IC0zLCAtNCwgIDAsICAxLCAgNywgIDMsIC03LCAgMCwgIDUsIC0yLCAgMSwgIDMsICAzLCAgMSwgLTUsIC0yLAorICAgICAgIDUsICAyLC0xMSwgIDQsICAwLCAtMSwgMTIsICAwLCAtMywtMTMsIDE1LCAgOCwgLTYsLTI3LCAzNCwgIDAgfSwKKyAgICB7IC0zLCAtMywgMTAsIC00LCAgMiwgLTEsIC0zLCAgMCwgLTEsIC0xLCAtNCwgIDIsICA2LCAtMiwgMTIsICAxLAorICAgICAgIDMsIC02LCAtNywgLTYsIC01LCAgNCwtMTksIC02LCAtOCwtMzQsIC00LCAtOCwgMTAsIC03LCAyMywgMTAgfSwKKyAgICB7IC03LCAgMCwgLTEsIC02LCAgOCwgIDQsIC00LCAgMiwgLTUsIC04LCAtNywgLTksIC04LCAgNSwgIDksICA3LAorICAgICAgLTYsICAxLC0xMiwtMTIsIC0xLC0xNiwgIDUsICAwLCAxNiwgIDMsIC03LCAtOCwgMjcsIC00LCAyMywgMTUgfSwKKyAgICB7IC04LCAgNCwgIDgsICA1LCAgNiwgMTEsIC0zLCAgNSwgIDMsIC0xLC0xMSwgIDYsIC01LCAgMCwgIDIsIC02LAorICAgICAgLTMsIC02LCAgNCwgLTEsICA1LCAtNSwtMTIsIC02LCAgNywgLTUsICA5LCAgMywgIDYsIC03LCAyOSwgIDEgfSwKKyAgICB7ICAxLCAgMywgLTIsIC0yLCAtNiwgLTIsICAxLCAgNiwgLTYsIC0zLCAgMSwgIDIsICAzLCAgNCwgIDEsICA1LAorICAgICAgLTEsICAwLCAgNCwgIDIsIDExLCAgNiwgIDIsIC0zLCAxMywgLTksLTE5LCAxOCwtMTUsLTEwLCAzNiwgMjEgfSwKKyAgICB7IC0zLCAtMywgIDIsIC0xLCAtNywgIDYsIC00LCAgMSwgLTMsIC0xLCAtMiwgIDIsICAzLCAtNywgLTMsICAwLAorICAgICAgLTIsICAwLCAtMiwgIDYsLTE5LCAgMywgLTgsICAyLCAtNiwgIDcsIC0xLCAgMCwgMjksIC02LCAyOCwtMTAgfSwKKyAgICB7IC01LCAgMSwgLTMsIC03LC0xMiwgLTQsICAxLCAgMSwgLTEsIDEzLC0xMCwgLTEsIC05LCAtNSwtMTMsICA2LAorICAgICAgMTMsICAzLCAtNCwgIDIsICAzLCAxMSwgIDIsICA2LC0yNSwtMTYsIC02LCAgMCwgMTQsIC0xLCAyNywgMTYgfSwKKyAgICB7IC02LCAtMSwgLTcsIC01LCAtMiwgLTUsIC01LCAtMSwgIDksICAxLCAgMCwgIDMsIC04LC0xMiwgLTYsICA1LAorICAgICAgLTYsICA1LCAgMywgLTksICAxLCAgNCwgLTcsLTEwLCAtOSwgLTcsLTE3LCAtNSwtMTUsLTIzLCAyNSwgIDMgfSwKKyAgICB7IC04LCAtMiwgIDksIC0zLCAtNCwgIDMsIC0xLCAgOCwgLTcsIC03LCAtNSwgLTQsIC0yLCAgOSwgIDQsIC0xLAorICAgICAgLTcsIC00LCAtNSwtMTYsICAzLCAtNiwgMTgsLTEzLCAtOSwgMTYsLTE1LCAgOCwgMTUsLTEwLCAyNCwgIDUgfSwKKyAgICB7ICAxLC0zOCwgIDIsIDM0LCAgOSwgMTAsIDExLCAgMiwgIDIsIC02LCAgMywgIDIsIC0yLCAgNSwgIDQsIC03LAorICAgICAgLTEsICAxLCAgNCwgIDAsICAzLCAgMSwgLTgsIC0xLCAtNiwgIDUsICA0LCAgMiwgLTQsICA1LCAgMiwgLTEgfSwKKyAgICB7ICAxLC0yMiwgMTUsIDE4LCAtMiwgMTAsLTE2LCAtOSwgLTgsLTExLCAgOCwgIDQsICAwLCAgNywtMTQsIC01LAorICAgICAgLTEsIC03LCAxMiwgMTcsICA5LCAgNSwgLTcsIC00LC0xMiwgLTYsICA3LCAgMCwgIDcsICAyLCAtMiwgIDEgfSwKKyAgICB7LTExLC0yOSwgIDcsIDEwLCAxOSwgLTEsIC04LCAtOSwgIDcsICAxLCAgOSwgIDYsICA4LCAtNywtMTQsICA4LAorICAgICAgLTMsLTExLC0xMywgIDAsIC03LC0yMywgLTIsIC04LCAxMiwgIDksICAyLCAxNCwgMTksICAxLCAtMSwgIDUgfSwKKyAgICB7LTI0LC0yNywtMTEsIDM2LCAgMiwgIDYsIC0zLCAgNCwgLTYsICA4LCAgMCwgMTIsIC0xLCAtNCwgLTYsICAzLAorICAgICAgIDQsIC0xLCAgMiwgLTMsIC0yLCAgMywgIDIsIC0xLCAtMiwgLTQsICAwLCAtMSwgLTIsICA3LCAgMiwgIDMgfSwKKyAgICB7IC05LC0yNCwgMTEsIDEzLC0xMCwtMTIsIDEyLCAtMiwgIDcsICA0LCAgOCwgMTMsIC0zLCAtMywgIDIsICA5LAorICAgICAgLTMsIC00LCAgNCwgMTMsICA1LCAxMywgLTYsIC0zLCAgMSwgMTUsICA3LCAtMywgIDAsIDE5LCAtMiwgLTkgfSwKKyAgICB7IC04LC0xNSwgIDcsIDE0LCAtNCwgLTUsICAyLC0xOCwtMTksIC0yLCAgMiwgMTcsIDE2LCAgNiwtMTAsIDEwLAorICAgICAgLTksIDE0LCAtMSwgLTUsIC0xLCAtNiwgLTcsICAyLCAgOSwgMTEsIDEzLCAgNiwgLTUsLTEyLCAgMywgIDIgfSwKKyAgICB7LTEwLC0zNywgMTMsICAxLCAgMywtMTQsICAwLC0yMCwgIDQsIC0zLCAgOCwgIDIsIC0yLCAtMywgLTksIC01LAorICAgICAgLTMsLTE3LCAtMSwgMTMsLTExLCAgMiwgLTYsICA0LCAgNCwgIDAsICAzLCAgMSwgLTksIC00LCAtNSwgLTQgfSwKKyAgICB7IC0yLC0yMiwgLTUsIDQ2LCAtOCwgIDUsICA5LC0xMSwgIDgsICA3LCAgNywgLTEsIC0xLCAtMiwgLTcsICAyLAorICAgICAgLTMsICAzLCAtMSwgLTIsICA3LCAgMCwgIDIsIC0xLCAgMSwgLTIsIC0yLCAtMywgIDYsICAwLCAtNCwgLTYgfSwKKyAgICB7LTE2LC0yNywgMTUsIDE2LCAtNCwgMTQsIC03LC0yNiwgIDIsIC0yLCAgNiwgIDUsIC0zLCAxMSwgIDAsICAyLAorICAgICAgIDMsICA5LCAtNywgLTEsICAyLCAtNCwgLTQsIC0xLCAgNiwgMTAsICAxLCAgMSwgLTMsIC0yLCAgMywgIDAgfSwKKyAgICB7IC0zLC0yMiwgMTAsIDI2LCAgMSwgIDIsIC0zLCAgMywgMTcsIC0zLCAtNywgIDksICAxLC0yMSwgLTQsICA1LAorICAgICAgIDMsICAwLCAtNywgLTYsICAzLCAgMywgLTgsIC03LCAtOSwgIDMsICA3LCAgMSwgLTgsIDEyLCAgNiwgLTcgfSwKKyAgICB7IC05LC0yNSwgIDMsIDE4LCAgOSwgLTYsLTExLCAgMCwgLTUsLTEyLCAgOSwgLTgsIC03LCAtNiwgLTYsIDIyLAorICAgICAgIDIsIC02LCAtMywgMTUsICAzLCAgMiwgLTIsICA5LCAxNCwtMTAsIC03LCAxNSwgMTMsICA2LCAtMiwgMTEgfSwKKyAgICB7ICA1LC0yMCwgLTUsIDI4LCAxMSwgMTAsIC00LCAtNCwgIDAsIC03LCAgMywgIDUsICAyLCAtNSwgLTgsICAyLAorICAgICAgIDYsIDEwLCAgOSwgLTksLTE4LCAgMywgMTQsICAxLCAgMywgLTMsIC0xLCAtNiwgIDcsICA3LCAgMiwgLTEgfSwKKyAgICB7IC04LC0zMCwgIDcsIDEyLCAxMCwgIDgsICA3LC0xMywtMTYsICAwLCAgMSwgLTEsIC02LC0xMSwtMTUsICA0LAorICAgICAgIDEsIC0yLCAxMCwtMTUsICAxLCAxMSwgLTIsICA4LCAgOSwgLTcsIC03LCAgOSwgLTUsICAyLCAgNywtMTggfSwKKyAgICB7LTEwLC0zMiwgMTAsIDExLCAgMywgLTEsICAzLCAtNSwgIDUsICAyLCAxNCwgLTYsICAzLCAgMSwgIDUsLTE1LAorICAgICAtMTEsICA2LCAyMCwgIDQsICAwLC0xMiwgLTcsICAzLCAgMSwgLTEsIDEwLCAgNiwgLTEsIC05LCAtNCwgLTEgfSwKKyAgICB7ICAxLC0yNSwtMTQsIDEyLC0xMSwgIDksICA5LC0xNiwtMjQsLTE3LCAyMiwgLTksIDExLC0zMCwgLTMsIC00LAorICAgICAgIDYsIC03LCAgOSwgIDIsIC0xLCAtNSwgLTYsICAyLCAtMSwgLTEsIDEwLCAgMSwgLTMsICAzLCAgNCwgIDggfSwKKyAgICB7LTE0LC0yNiwgLTYsICA5LCAgOCwgMTcsLTExLC0yNCwgLTcsIC00LCAtOCwgLTIsIDEwLCAgMiwgIDIsIC0xLAorICAgICAgIDIsIDEzLCAxMiwgLTcsICA0LCAtNiwtMTAsICA2LCAgNiwtMTMsLTExLCAtNywtMTYsICAwLCAtMiwgIDUgfSwKKyAgICB7IC00LC0zMCwtMTMsIDEyLCAxNiwgLTYsIDEyLC0xNiwtMTMsICA1LCAxNSwgLTIsIC0yLC0xMCwgLTcsICA3LAorICAgICAgMTEsIC0xLCAtNCwgLTIsIC00LCAgNywgIDQsIC04LCAgMSwgIDMsICAwLCAxMSwgIDMsIC0yLCAtNSwgIDQgfSwKKyAgICB7IC00LC0yMSwgMjAsIDIyLCAgMiwgMjAsIC04LCAgMSwtMTIsIC01LCAtOSwgIDQsLTEwLC0xNywgLTMsIC04LAorICAgICAgLTMsICAzLC0xMiwgIDEsIC0zLCAgMCwgIDcsICA0LCAgNywgIDcsIC0zLCAgNywgIDUsICAzLCAgMSwgLTUgfSwKKyAgICB7LTEyLC0yMCwgIDIsIDI5LCAxMSwgLTYsICA5LCAtNywgLTYsIC00LCAgMCwgIDYsIDE3LC0xMywgLTIsLTEwLAorICAgICAtMTcsIC0xLC0xOCwgIDIsICAwLCAxNCwgLTYsICAxLCAgMCwgIDMsICAyLC0xMCwgIDEsIC01LCAtMiwgIDUgfSwKKyAgICB7IDE2LC0zNywgLTEsIDI2LCAtMiwtMTQsICAxLCAtNSwtMTQsICAyLCAgMiwgIDMsICA2LCAgMSwgIDEsICA0LAorICAgICAgIDAsIC0xLCAgMCwgLTIsIC0yLCAgNCwgIDksIC02LCAgMCwgLTIsIDEwLCAtNywgLTIsICA0LCAgMSwgIDAgfSwKKyAgICB7IC05LC0yNCwtMTIsICA1LCAgNSwgIDMsLTE3LC0xNCwgIDQsICAzLCAgMiwgLTQsIDEwLC0yMiwgLTgsIC0zLAorICAgICAgIDYsICAxLCAxMiwgLTgsICA0LCAgMSwgIDksIC0xLCAxOCwgLTMsICA2LCAgNSwgIDMsIC01LCAgOSwgLTUgfSwKKyAgICB7LTE0LC0zMywgLTIsIDIwLC0xMywtMTAsICAyLCAtNywgLTEsIDExLCAtOSwgLTgsIDE4LCAtMywgIDEsICA4LAorICAgICAgIDAsIC0yLCAxMCwgIDcsIC0yLC0xMywgIDksIC0zLCAtNCwgIDUsIC0yLCAtMiwgLTEsIC01LCAgMSwgLTcgfSwKKyAgICB7LTEwLC0yMywgIDgsIDE0LCAgMSwgIDcsICAxLCAtMywgLTcsICA0LCAgMSwgIDEsICA4LCAtNywgMTUsLTE0LAorICAgICAgMTMsIDE0LCAgMiwgIDUsLTEzLCAtNSwgLTgsIC0xLCAgNiwgIDMsICA2LCAgOSwgIDYsIDE1LCAxNCwgIDUgfSwKKyAgICB7LTEzLC0yNSwtMTAsIDEzLC0xNywtMjQsIC03LC0xMywgLTYsLTEwLCAtOCwgIDIsICAwLC0xMywtMTAsIC00LAorICAgICAgLTgsICA0LCAtOSwgIDksIC00LCAgNCwgLTMsIC0zLCAgMywgIDMsIC01LCAtOSwgIDEsIC0yLCAxMSwgIDIgfSwKKyAgICB7LTEyLC0yMywgIDEsIDE4LC0xMSwgLTIsICA1LCAgOSwgLTUsICA1LCAxNCwgLTksIC0zLCAtMiwgLTYsICAyLAorICAgICAgLTIsIDExLC0xMywgIDEsIC0zLCAxMSwgLTksIC00LCAtMiwgLTYsICA4LCAxMCwgIDEsICA0LCAgMiwgIDEgfSwKKyAgICB7IC01LC0xOCwgMTYsIDIyLCAgMiwgIDAsICA4LCAtNiwgLTksIC03LCAxMCwtMTYsIDIzLCAxMCwtMTEsIC0xLAorICAgICAgIDcsICAyLCAgNywgIDIsICAxLCAtNSwgIDYsICAxLCAgMCwgLTQsICA5LCAgMiwgLTMsICAxLCAgMCwgLTQgfSwKKyAgICB7IC0zLC0yNiwgMTQsIDExLCAgMiwgLTksIDE3LCAtMiwgLTEsIC01LC0xNiwgLTksIC01LCAxMCwtMTMsICAxLAorICAgICAgIDYsIDEyLCAxMCwgMTEsICAwLCAgMCwgLTMsLTE0LCAgNiwgLTIsICAwLCAgNCwgLTUsIC0xLCAtNywgLTEgfSwKKyAgICB7LTEwLC0zMywgIDEsICA4LCAxMSwgLTUsICAxLCAtNiwgIDcsICA0LCAgNSwgIDYsICAxLCAtMiwtMTAsIC01LAorICAgICAgLTYsIDEyLC0xMSwgIDUsLTEwLCAgNCwgMTIsIC0xLCAtMSwgLTMsICA0LCAtMSwgIDksICAwLCAxNiwtMTcgfSwKKyAgICB7LTE0LC0zNywgIDcsICA3LCAtMiwgIDUsIC04LC0xMSwgIDIsLTEzLCAgNCwtMTksICAxLCAgOCwgIDgsICA0LAorICAgICAgLTksICAyLCAtNCwgIDMsIDEyLCAgMiwgIDQsIC00LCAtOCwgIDgsICAxLCAgNCwgIDgsIC0xLCAgNiwgLTIgfSwKKyAgICB7IC02LC0zMCwgMTgsIDE3LCAgMSwtMjIsIC0zLCAgNCwgLTcsLTEwLCAgNywgIDAsIC04LCAgOCwgLTEsICA0LAorICAgICAgIDIsICA4LCAgNiwgLTIsICAyLCAgNywgIDQsICA0LCAgMywgLTYsICAyLCAgMSwgLTMsICAxLCAtMSwgLTUgfSwKKyAgICB7LTE3LC0xOCwgLTMsIDIyLCAtOCwgIDEsICA5LCAtMiwtMTcsIDIwLCAtNSwgLTUsLTEyLCAtNSwgIDQsIC01LAorICAgICAgLTksICA4LCAtMiwgMTYsIC0zLCAgMCwgMTksIC04LCAgOCwgIDEsICAyLCAtNCwgIDAsIDExLCAgMCwgLTMgfSwKKyAgICB7IC05LC0yMywgIDMsIDEwLCAgNCwgIDQsIC0zLCAtMiwgLTIsIC0yLCAgMSwtMjIsIDExLCAgMCwgLTIsICA1LAorICAgICAgLTIsIDE0LCAtOSwtMTEsIC00LCAgNywgIDUsIDMyLCAgMSwgLTMsIC03LCAgMCwgMjEsIC05LCAgNywgLTYgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAyLCAtMSwgIDEsICAwLCAgMSwgIDMsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLAorICAgICAgLTMsICAwLCAtMSwgLTIsICAwLCAtMSwgLTEsIC0zLCAtMSwgIDEsIC00LCAgMSwgLTEsIC01LC02OSwtMTkgfSwKKyAgICB7IC0zLCAtNSwgLTgsLTEyLCAgNCwgLTMsLTE5LC0xMSwgLTUsICAwLC0xNCwgIDcsIDE4LCAtNiwgIDcsIDIyLAorICAgICAgIDgsIDE0LCAxNSwgMTAsICAzLCAtMSwgLTMsICA1LCAtMSwgIDcsIC03LCAgMSwgLTYsICAzLC0yNiwtMTEgfSwKKyAgICB7IC0xLCAtNiwgIDQsIC00LCAtNSwtMTYsICAwLCAtNiwgLTMsIDExLCAgMSwgIDAsICA5LCAgNSwgMTYsICAzLAorICAgICAgLTQsLTMzLCAtNCwgIDQsIC03LCAgMCwgIDEsICA2LC0xMSwgLTIsLTEzLCAtMiwtMTgsIDIwLC0yNSwtMTYgfSwKKyAgICB7ICA0LCAgMCwgLTEsICAwLCAtNSwgIDEsICAwLCAgMiwgIDAsIDExLC0xMCwgIDQsLTEwLCAgNywgMTYsICAyLAorICAgICAgMTYsIDE1LCAgMiwgLTEsICAyLCAgOSwgIDIsICA4LCAtMywgLTUsIC0yLCAgMCwgLTMsICAwLC0zMywgLTIgfSwKKyAgICB7IC0zLC0xNSwgMTAsIDEwLCAtOSwgLTEsICA3LCAgMywgIDUsIC01LCAtOCwgLTgsIC0zLCAxNSwgLTksICA0LAorICAgICAgMTIsIDEzLC0xMywtMTQsIDEwLCAtNiwgIDksIDIyLC0yNywgMjMsIC0xLCAgNSwtMjQsICAyLC0zMCwgIDUgfSwKKyAgICB7ICAwLCAtMiwgIDcsIC01LCAtNSwgIDMsICA1LCAgMywgLTMsIC01LCAgMiwgIDEsIC00LCAgMywgLTMsIC0xLAorICAgICAgIDEsIC0yLCAxMCwgMjIsIC0zLCAtNCwgLTIsIC0yLCAtNywgIDMsICA4LCAgMSwgMTQsICA0LC0zNywgIDkgfSwKKyAgICB7IC0zLCAtNCwgLTEsICAxLCAtNCwgIDAsICA2LCAgMiwgIDYsIC03LC0xMCwtMTAsIC0xLCAtNCwgMTEsIC0zLAorICAgICAgIDcsIC02LCAgNCwtMTIsIC0xLCAgNSwgIDEsIC03LCAxMCwgLTYsIDE3LCAtNCwgIDgsICAzLC00MCwgMTMgfSwKKyAgICB7ICAyLCAxMiwgIDQsIC03LCAxNCwgLTMsIDE2LCAtMiwgMTgsICAyLCAxMywgIDUsICA1LCAgMSwgMTEsIC0xLAorICAgICAgIDAsICA5LCAgMiwgLTYsIC0xLCAgMiwgLTYsICAyLCAtNSwgIDMsICA1LCAgMSwgLTEsICAxLC0zMiwgLTcgfSwKKyAgICB7LTE2LCAxMSwgIDcsIC00LCAgMiwgLTUsIC05LCAgOSwgMTEsIDExLCAxNSwtMTMsLTExLCAxMSwgIDksICA0LAorICAgICAgIDMsIC04LC0xMCwgMTIsIDEyLCAgMCwgIDAsLTE2LCAtOSwgMTMsICAyLCAgOSwgIDQsLTEzLC0zMywgIDMgfSwKKyAgICB7ICA2LCAgNCwgIDUsICA0LCAgMywgLTEsICA1LCAgNiwgIDQsICAyLC0xMSwgLTEsLTE1LC0xMSwgLTEsICAxLAorICAgICAgMTEsIC0zLCAtMiwgMjQsIC00LCAtNiwtMjUsLTEwLC0xNSwgLTgsICAwLCAgMCwgLTUsICA0LC0zMCwgIDIgfSwKKyAgICB7IDEwLCAtMywgLTYsICAxLCAtOSwgLTUsICA2LCAgOSwtMTAsIC0zLCAgOCwgLTEsICA0LCAtMSwgMTEsLTExLAorICAgICAgIDMsICA5LCAxMSwgLTMsICA2LC0xNywgIDUsIC04LC0zMywgIDksLTEzLCAxOSwgLTIsICA5LC0yNSwgIDIgfSwKKyAgICB7ICAwLCAgMCwgLTEsIC0zLCAgMCwgLTIsICAxLCAgMCwgIDAsICAyLCAgMSwgIDAsIC0yLCAgMCwgLTEsICAyLAorICAgICAgIDAsIC0xLCAgNCwgLTEsICAyLCAtMywgIDQsIC0yLCAgMywgIDMsICAxLCAgMCwtMTUsIDEyLC02MywgMjcgfSwKKyAgICB7IC0yLCAxNCwgIDksIC0xLCAgMywgIDAsICAxLCAgMSwtMTksIDE1LCAgMywgIDQsICAwLC0xMCwgIDEsIC01LAorICAgICAgIDMsICAwLCAtNSwtMTAsICAyLC0xNiwgLTQsICA4LC0xMiwgLTYsICA3LCAtNSwtMTAsIC0xLC0zMywgLTQgfSwKKyAgICB7ICAwLCAgMywgIDEsICAzLCAgMSwgIDIsICA0LCAgNCwgIDksIC02LCAtOCwgLTUsICAxLC0xMiwgIDMsICA4LAorICAgICAtMTAsICA2LCAtMSwgIDEsIDEzLCAtNSwgLTUsICAyLCAtNCwgMTMsLTE4LC0xMCwgLTcsIC05LC0zMywgMTAgfSwKKyAgICB7IC02LCAtMywtMTIsICA1LCAtMSwgMTEsIC02LCAgMCwgLTIsICAxLCAgMiwgLTcsICAzLCAgMSwgIDMsIC0yLAorICAgICAgIDEsICA4LC0xMCwgIDcsIC0xLCAtMywgIDMsICAwLCAxMywgIDEsICA2LCAgNywtMTYsIC03LC0zOSwgIDggfSwKKyAgICB7IC02LCAtMSwgMTEsICA2LCAtMywgIDgsICAzLCAtNSwgIDMsICAwLCAtNSwgLTIsIC02LCAtMywgLTQsICAyLAorICAgICAgLTMsIDEzLC0xMSwgIDEsICA3LCAgNSwgMTksIC01LCAtMywtMTUsIC0xLCAgNywgLTEsICA2LC0zMywgIDggfSwKKyAgICB7IC03LCAgMywgLTQsIC0zLCAtNCwgIDEsICA2LCAtNSwgLTUsICA2LCAtOCwgLTEsIC03LCAgNCwgLTEsIC02LAorICAgICAgLTIsICAxLCAgNywgIDAsICAxLCAgMSwgLTUsICAyLCAtMiwgIDAsLTEzLCAtMiwtMzEsLTE0LC0zOSwtMTIgfSwKKyAgICB7LTEwLCAgOSwgIDAsIC0zLCAgMSwgLTEsIC0xLCAgMCwgIDEsIC01LCAtMSwgLTQsIC0yLCAgNSwgIDIsIC03LAorICAgICAgMTgsIC04LCAtMiwtMTksIC03LCAtNywtMTIsLTE0LC0xMSwgLTEsIC05LC0xMywgLTcsLTEyLC0zMSwgLTkgfSwKKyAgICB7IC0zLC0xNiwgMTAsICA5LCAgMSwtMTAsLTEyLCAgMiwgLTIsICAyLCAgNywgLTMsIC0zLCAgMSwgLTQsIC01LAorICAgICAgLTksICA1LCAgNywgIDMsIC0xLCAgNCwtMTEsIC04LCAgNCwgMTMsLTEwLCAxMywgMTAsIC00LC0zNiwgIDEgfSwKKyAgICB7IC03LC0xMiwgIDQsLTIwLCAtNywgLTcsICAyLCAxMSwgLTEsIC0yLCAgMywtMTIsICAxLCAgMCwgLTYsIC03LAorICAgICAgIDYsICA0LCAxMywgIDMsIC0zLCAgNCwgIDMsIC02LC0xMiwgIDUsIC01LC0yMiwtMTMsIC04LC0zNywgLTYgfSwKKyAgICB7IC03LCAgNSwgIDMsICA1LCAgNywgIDksLTE0LCAtMywgMTAsIDE3LCAtMSwgIDEsLTEyLCAgNSwgLTYsICAwLAorICAgICAgLTQsIC05LCAgMCwtMTEsLTE0LCAgMywgMTMsICA2LC0yNSwgLTgsLTEyLCAgNCwtMTAsIDE4LC0zMCwgLTEgfSwKKyAgICB7LTEwLCAgNiwtMTAsICA2LCAgNiwgIDEsLTEwLCAgMCwgLTcsICA1LCAtMiwgMTcsLTE4LCAtNCwgIDAsIC0zLAorICAgICAtMTYsIC02LCAtMywgLTgsICA1LCAgMSwgLTQsICA2LCAtNywgMTYsICA2LCAxMCwgLTEsICAwLC0zMiwtMTEgfSwKKyAgICB7IC0xLCAgOSwgIDksIC01LCAgNCwgIDksICA2LCAgOSwgLTQsIC0yLCAgNywgMTEsICA0LCAgMiwgLTUsIC00LAorICAgICAgLTYsICAwLCAgMiwgLTMsIC0xLCAgNSwgMTAsICAwLCAxMiwtMTAsLTE4LCAtMywgLTEsIDE0LC0zMywgIDIgfSwKKyAgICB7ICA0LCAtOCwtMTgsIC00LCAtNSwtMTEsICA0LC0xMCwgLTQsICA5LCAxMywtMTIsICAxLCAtNiwgIDEsICAyLAorICAgICAgIDQsIC05LCAgOCwgIDMsIC02LCAyMSwgMTMsIC0xLCAtMiwgIDEsIC0yLCAgNiwgLTcsICAwLC0zMCwgIDEgfSwKKyAgICB7ICA2LCAtMSwgIDIsIC0zLCAtMSwgLTQsICA2LCAtNCwgIDAsICA0LCAgMiwgIDIsIC05LCAgMiwgIDYsICAzLAorICAgICAgLTIsICA0LCAtMSwgIDksIC02LCAgMCwgIDcsIC04LCAgNSwgMTksIC0yLCAgOSwgLTUsICAyLC0zMywgLTggfSwKKyAgICB7ICAyLCAgMSwgMTIsIC01LCAtOCwgIDgsICAzLCAtMiwgLTQsICAxLCAtMiwgIDUsIC00LCAtOSwgLTgsIC04LAorICAgICAgIDcsLTExLCAtNCwgIDYsLTEwLCAgNywgLTEsIC0xLCAtMiwgLTEsIDE2LCAzMiwgLTcsIDIwLC0zMywgLTYgfSwKKyAgICB7LTE4LCAgMiwgIDYsIDEzLCAgOSwgIDksIC0xLCAgMywtMTcsIDI0LCAtMiwgLTYsIDI4LCAgOCwgLTIsICA2LAorICAgICAgIDMsLTEwLC0zNCwtMTYsLTEzLCAtNCwtMTUsLTExLC0xMiwgLTMsLTEwLCAgNCwgLTgsICA0LC0zMSwgLTQgfSwKKyAgICB7LTExLCAgMCwgMTgsICAyLC0xNiwgLTksLTEzLCAtMiwgLTIsLTEyLCAtMywtMjIsIDMwLCAgMCwgIDgsICAzLAorICAgICAgIDksIC00LC0xNiwgIDEsICAwLC0xMSwgMTUsIC0yLCAtNCwgIDYsIC01LCAgNiwgIDEsICAyLC0yNSwtMTIgfSwKKyAgICB7IDE0LCAtMSwgIDUsICA3LCAgMywtMTUsIC04LCAgMSwgIDUsIC0yLCAxMiwgMTMsIDExLC0yNSwgIDMsICAxLAorICAgICAgIDAsIC0yLCAtNCwtMTYsLTIzLCAgMCwgLTUsLTE3LCAgNywgIDUsIC05LCAgNiwgLTUsICAyLC0zMiwgLTcgfSwKKyAgICB7ICAzLCAtMSwgIDYsIDE0LCAgMiwtMTIsIC05LCAtOSwgIDQsICA3LCAgNCwgIDYsICA1LCAtOCwgIDQsICAyLAorICAgICAgIDQsICA1LCAtMiwgIDgsICA4LCAtNiwgIDAsIDEwLC0yMCwgLTEsICAzLCAtMSwgIDgsIDIzLC0zMywgLTUgfSwKKyAgICB7IC0zLCAxMSwgLTYsICAzLCAtNCwgIDUsICA3LCAgMywgIDQsICA1LCAtMiwgIDMsIC0xLCAzMCwgIDYsICAxLAorICAgICAgIDgsIC02LCAgMCwgIDAsIC05LCAgNiwgLTksICA0LCAgMiwgIDksIC02LCAgMSwtMTIsICAwLC0zNCwgMTggfSwKKyAgICB7LTE3LCAxMywgIDAsICAxLCAgOSwgLTQsLTExLCAgMCwgIDcsICAwLC0xMCwgLTQsIC0xLCAgNiwgLTYsICA0LAorICAgICAgIDEsICA2LCAtOSwgIDMsIC01LCAtNiwtMTEsICAyLCAtNCwgMTQsIDIzLCAtMywgIDIsICA1LC0zMCwgMTIgfSwKKyAgICB7LTE0LCAgNSwtMjcsICAyLCAgMCwgIDcsICAxLCAgNCwgMzAsICA4LCAgNywgIDUsICAxLCAtMSwgIDAsICA1LAorICAgICAgIDgsLTEwLCA0OCwtMTEsIDEyLCAzMywgIDYsICA4LC0xNSwgMjAsIC0yLCAtNSwgMzIsICA1LC0xOSwgMTAgfSwKKyAgICB7LTE2LCAtNCwtMTIsIC03LCAtMiwgIDAsICA4LCAtNiwtMjAsLTE4LCAxNiwgLTMsICAwLCAzMSwgLTIsIDExLAorICAgICAgIDIsIC05LCA0OSwtMTksLTEyLC0yMywgMTAsIDI2LCAxNiwgLTIsICA0LC0yMSwtMTQsIDEzLC0xMSwgLTkgfSwKKyAgICB7IC01LCAtOSwgLTEsICAzLCAtNSwtMjEsICAyLCAxMCwgIDAsICAwLCAxMCwtMjEsIC03LCAgNywtMjYsIC05LAorICAgICAgMjIsIDMyLCA1OCwgMTEsIC0zLCAxMSwgLTUsIC04LC0xMywgIDYsIC01LCAtOSwgIDEsIDEwLCAxNCwgLTggfSwKKyAgICB7ICA3LCAgNywgMTAsICAzLCAtMiwgLTEsLTExLC0xMSwgLTYsLTQzLCAtMywgMTQsLTE5LC0xOCwgMTksIDE4LAorICAgICAtMzIsIDEwLCA0NSwgLTYsICA2LCAyMSwtMjAsLTEyLCAgMiwgIDQsICA2LCAgNiwgLTQsICAzLCAgMywgIDEgfSwKKyAgICB7IDIxLCAyMiwgLTMsIC0yLC0xMSwgLTYsIC0xLCAtMiwgIDgsICA4LCAzMiwtMjEsICA3LCAyOCwgLTQsIC02LAorICAgICAgLTMsIC0yLCA1MCwgIDIsICAyLCAyNywgLTUsIC04LCAxMiwgIDcsIC01LCAtMSwgLTQsLTE3LCAyNywgIDYgfSwKKyAgICB7IDEzLCAgNywgIDIsIC02LC0xMiwgIDIsLTEwLCAtNSwtMTcsIDExLCAgNCwgMTcsLTEyLCAtMiwgIDUsLTE3LAorICAgICAgMzcsLTE2LCA0OCwtMTQsLTE4LCAyOSwgIDgsIDI0LCAxMSwgLTUsIC05LCAxMSwgLTEsICAxLC0xMywgLTMgfSwKKyAgICB7ICAxLCAgMSwgLTEsICAyLCAgMCwgIDAsICAwLCAtMSwgIDEsIC0xLCAgNywgIDIsIC0zLCAgMywgIDAsICA2LAorICAgICAgIDIsIDEwLCA1NCwtMjUsICA3LCA1NCwgLTUsIC02LCAtMSwtMTUsICA5LCAxMywtMjQsLTE1LC0xMiwgIDMgfSwKKyAgICB7IDIxLCAgNSwgIDgsICAzLCAtMywgLTQsIC0yLCAtNCwgIDMsLTExLCAtNSwgLTgsICA5LCAxNiwgIDgsIC05LAorICAgICAtMTAsIC0zLCA0NiwtNDYsICAyLCAgMSwtMTAsIDEwLCAxNywgMTEsLTIwLC0zNiwgMTAsIDE0LCAgMCwgLTUgfSwKKyAgICB7ICA3LC0xMywgLTYsIC05LC0yNCwgNDUsICAyLCAgOCwgIDgsICAwLCAxNywgMjAsIDEyLC0yNCwgIDEsIC03LAorICAgICAtMTUsIC0zLCA0NiwtMTMsIC0yLCAyMCwgIDEsLTEzLC0xMSwtMTMsICAyLCAxNSwgIDEsIDEwLCAtMSwgIDMgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLCAgMCwgLTIsIC0xLAorICAgICAtMTYsIC05LCAzMSwtNjksLTM0LCAyNiwgIDcsIDE3LCAtMSwgLTYsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC00LAorICAgICAgLTUsLTIwLCAxOCwtODIsIDIyLCAgMywgLTcsICA5LCAgNCwgIDYsICAyLCAtNCwgLTEsICAwLCAtMiwgIDIgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDQsIC0xLAorICAgICAgMTUsIC01LCA2MiwtMzYsICA0LCA1MiwgLTcsICA1LCAgMCwgIDYsICAxLCAgMiwgIDEsICAxLCAtMSwgIDAgfSwKKyAgICB7ICAzLC0xOSwgMTksLTIwLCAxMywgLTQsLTExLCAgOCwgIDgsLTE2LCAxMCwgIDEsLTE0LCAzMCwgIDEsLTMzLAorICAgICAgMTAsLTExLCA0NSwtMzAsICAzLCAtNCwgLTMsLTEzLCAgNywgMTIsICAzLC0yMiwgIDMsIC0yLCAtNCwgLTIgfSwKKyAgICB7IC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDIsICAxLAorICAgICAgMTEsICA4LCA3MCwgNDgsLTEwLCAyMSwgIDQsICA5LCAtOSwgLTksIC00LCAtNiwgIDAsIC0xLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDIsICAwLAorICAgICAgIDIsIC0xLCA4MCwgIDIsLTE1LC0zNiwtMTAsIC01LCAtMiwgIDgsIC0yLCAgMiwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7IDEwLCAgOCwgLTgsIC04LC0yNCwgMTIsIC0xLCAgMCwgMjAsICA5LCAtMSwgLTIsICAyLCAtMiwgMTIsLTEwLAorICAgICAgLTIsLTEzLCAzNSwtNDMsIDQ0LCAxNSwtMTAsLTI1LCAgNCwgMTAsIC0zLCAtNSwgLTUsICA3LCAtMSwgIDMgfSwKKyAgICB7ICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTIsIC0xLAorICAgICAtMTgsICA5LCA0OSwtNzIsICA3LCAtOCwgIDcsIC01LCAgMiwgIDMsICAyLCAtMiwgIDEsIC0yLCAtMywgIDEgfSwKKyAgICB7IC0xLCAgNCwgLTMsIDEwLCAxOSwgIDQsICAzLCAyMCwgIDYsLTI0LCAgNiwgIDksICA4LCAxNSwgMTgsIDE4LAorICAgICAtMzYsIDE5LCA1NywtMTEsICA0LCAtMywgIDgsICA3LCAgMiwgLTMsIC0yLCAtOSwtMTUsIC0yLCAxMiwgLTQgfSwKKyAgICB7IDIwLCAgMywgMTEsIC05LCAtNCwgMjIsIDQyLC0yNSwgIDEsICA1LC0xMCwtMTksICAwLCAgOSwtMTYsICA1LAorICAgICAgIDIsIDEwLCA0NCwtMjksIDE3LCAtMywgLTksIC0yLCAtMSwgIDgsIDE0LCAtNywgLTEsIDE2LCAtNSwgIDEgfSwKKyAgICB7IC03LCAxNiwtMTEsIDEyLCAgNiwgMzMsLTE1LCAxNCwtMjMsICAyLC0yNiwgIDgsICAyLCAxMCwgIDAsIC01LAorICAgICAgIDgsIC04LCAzOCwtMzgsIC00LCAgNSwgIDUsICA1LCAgMSwgMjIsLTE1LCAgNywgIDYsICAwLCAgNCwgMjggfSwKKyAgICB7IC0xLC0xMiwgIDIsIDEwLCAtMiwgIDAsICA3LCAxNywgMTIsIDIyLCAtNCwgMTAsIDI1LCAyOSwgIDUsIDE4LAorICAgICAgIDQsICAxLCAyNywtMzksIDMxLCAxNywgIDIsICAyLCAyMiwtMjMsIDEzLCAxNiwgIDEsIC03LCAtNCwgLTUgfSwKKyAgICB7ICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwgIDAsIC0yLCAgMCwtMTQsICAwLAorICAgICAgLTcsLTExLCA0OSwtMjIsIC00LCAxOSwgMTcsLTM5LCAgNCwtMjksIDEwLCAgMiwgMzYsIC00LCAyMywgLTEgfSwKKyAgICB7IC0yLCAtMiwgLTIsIC0yLCAgMSwgMTUsIC01LCAtNywtMTYsIC04LC0xOSwgMTYsIC0zLC0yMCwgMzYsIC05LAorICAgICAgLTMsIDIwLCAzOSwtMjAsICAwLCAgMiwgMjcsLTE2LCAxMCwgMTAsLTE0LC0yMiwtMTYsIC0zLCAxMywgLTggfSwKKyAgICB7ICA1LCAtOSwgIDYsLTI1LCAgNywgMzcsIDEzLC0xMCwgLTUsICAzLCAtNSwgIDcsIDE4LC0yMiwgLTcsICA5LAorICAgICAgLTUsIC00LCA1MCwtMTEsIC00LCAtNSwgLTUsICA4LCAtNCwgLTIsIC00LC0yNywgMTQsIDIwLCAgNywgLTkgfSwKKyAgICB7ICAwLC0xNCwtMTAsLTI3LC0xNCwtMTcsIC02LCAyNiwgMTAsICAyLCAxNCwtMTIsIC01LCAgMCwgIDgsICA5LAorICAgICAgIDAsLTI4LCA1NSwgLTcsLTEyLCAtNywgIDQsLTEwLCAxMCwgIDcsLTEyLCAxMSwgIDMsICA1LCAgOSwgLTggfSwKKyAgICB7ICAyLCAyMywgIDQsIC0yLCAtMSwtMjAsIC0yLCAxNCwgMTAsIC05LCAtOSwtMjQsIDEwLCAgMCwgMTEsLTEyLAorICAgICAgMTIsIDExLCA0OSwtMjUsIC0yLCAyOSwgIDcsLTEzLCAyMSwtMTAsIDExLC0xNywgIDMsICAxLCAtOCwgIDUgfSwKKyAgICB7ICAzLCAgMCwtMTQsIC02LCAxOCwgLTIsIDE3LCAtOSwtMTksICA5LCAtNSwgIDksIDE0LCAgNiwgMTksIC0zLAorICAgICAgMjcsICAxLCA0MSwtMjEsIDIwLC0xNSwgMzMsICAwLCAyNiwgMTQsICA3LCAxMCwgIDMsIDIwLCAtMywtMTIgfSwKKyAgICB7IC0xLCAxNiwgMTUsIC04LCAgMywgLTgsIC04LCAyMSwgLTUsLTE2LC0yOSwgIDQsICAxLCAtNiwgLTQsLTI4LAorICAgICAgIDIsIDMxLCAzNywtMjYsIC0yLCAxMywgMjQsICA4LCAtOSwgLTYsLTI5LCAxMCwgIDcsICAyLCAgNywgIDggfSwKKyAgICB7LTEwLC0xMCwgMTEsIDEzLC0zMiwgIDIsIDE2LCAgOSwgMTQsIDIzLC0xNSwtMTMsIDI0LCAxMywgIDQsLTI3LAorICAgICAgMTQsIDEyLCAzMSwtMTgsIDE3LCAyMywgLTIsIC03LC0xNCwgIDksLTE3LCAtNiwtMTAsIDIwLCAgOSwgIDYgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDIsICAwLAorICAgICAgIDUsICAxLCA4OSwgIDgsIDEwLCAtNiwgIDIsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDIsIC0xLAorICAgICAgIDQsIC03LCA2NCwtNTAsICA3LCAzNywgIDIsICA1LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7IC0yLCAgNSwgIDMsIC00LCAtNCwgLTMsICAyLCAtMywgIDMsIC0zLCAgNSwgIDQsICAxLCAtNiwgLTEsICAxLAorICAgICAgIDYsIC0yLCA1MCwtMzUsIC03LCA0MywgIDcsIC03LCAtNSwtMjYsIDI0LCAyMSwgIDMsLTE1LCAgNSwgIDYgfSwKKyAgICB7IC04LCAyMSwtMTksIDMzLCAtOCwgMjIsLTExLCAxNywgIDMsICAwLCAgMCwgLTIsICAxLCAtMywgIDYsIC0xLAorICAgICAgMTAsIC04LCAgNCwtMTEsIC00LCAtNSwgIDAsICA4LCAtNCwgIDMsICAxLCAtNCwgIDQsICAyLCAgOCwgIDQgfSwKKyAgICB7IC03LCAgNSwtMjAsICA5LC0yMiwgIDMsLTE0LCAgMSwgIDYsIDEzLCAyMywgLTIsIC00LCAtNywgIDIsICAwLAorICAgICAgMTEsICA0LCAgNiwgIDMsIC03LC0xMSwgLTcsICA0LCAgNSwgIDUsLTEyLCAgOCwgIDIsICA0LCAgNywgLTMgfSwKKyAgICB7IC03LCAgNiwgLTQsIDIwLC0yMCwgMTYsIC0yLCAgNywgIDYsIDE2LCAxMSwgMTIsIC03LCAtNywgIDUsICAzLAorICAgICAgLTksIC00LCAgMSwgIDIsICA1LCAgMiwgIDEsIC05LCAtMiwtMTcsIC00LCAgNiwtMTAsICA3LCAtNywgLTYgfSwKKyAgICB7IC05LCAxOCwtMTcsIDEyLC0yNCwgIDEsIC0xLCAgNCwgMTQsICA5LCAgNCwgIDMsICAyLCAgOCwtMTIsLTE0LAorICAgICAgIDQsIC04LCAtNCwgIDcsICA3LCAgNiwgLTEsIDEzLCAtOSwgLTQsIC0xLCAgMSwgIDAsIC00LCAxNSwgIDggfSwKKyAgICB7LTI1LCAgMiwtMTEsICA2LCAtNSwgMjQsLTI4LCAtNSwgIDgsIDEyLCAtMiwgIDYsICA4LCAtMywgIDgsIC05LAorICAgICAgLTEsIC01LCAtMSwgLTUsICA2LCAtMSwgLTEsIC0xLCAtNCwgIDgsLTEyLCAtMiwtMTMsICA3LCAgMiwgIDEgfSwKKyAgICB7LTE0LCAxNCwtMTgsIDIwLC0xMCwgMTIsIC0yLCAgOSwgIDEsICAwLCAxMiwgLTIsIDE1LC0xMCwgMjYsLTE3LAorICAgICAgMTYsLTExLCAxMCwtMTAsICA5LCAtMiwgIDQsIC04LCAgMiwgLTMsICA0LCAgNCwgIDIsIC0zLCAtNSwgIDEgfSwKKyAgICB7LTE4LCAxMiwtMTgsIDIxLCAtNiwgMTIsIC02LCAxMywtMjUsIDE4LCAgMSwgMTEsIC05LCAtNSwgIDAsIDEwLAorICAgICAgLTUsICAzLCAtMywgIDgsIC05LCAgNywgIDQsICAyLCAtOSwgIDAsICA1LCAgMCwgIDIsIC0zLCAgOSwgLTggfSwKKyAgICB7IC00LCAxNiwgIDEsIDE4LC0zMCwgIDksICAxLCAgNiwgLTgsIDEzLCAxMywtMTIsIC02LCAtMSwgMTMsICA3LAorICAgICAgIDYsICAyLC0xNSwgLTMsICA1LCAgNSwgIDEsIC02LCAgMSwgLTUsICAwLCAgMiwtMTYsICAwLCAgMywgLTQgfSwKKyAgICB7LTIxLCAgMSwgLTIsICA2LC00MywgMTgsIC0xLCAgNSwgLTEsICA0LCAgNiwgLTIsIC0xLCAtMywgLTEsIC0zLAorICAgICAgIDAsICAxLCAgMiwgLTksICAwLCAtMSwgIDAsIC0yLCAgMCwgLTEsIC0xLCAtMiwgIDYsICAwLCAgMSwgLTIgfSwKKyAgICB7LTIzLCAxMCwgIDQsICA3LC0zMiwtMTEsLTE4LCAgMiwgLTIsIC03LCAtNiwgLTMsIC0zLC0xMiwgMTksICAzLAorICAgICAgLTUsIC02LCAxNiwgLTYsIDE2LCAgMiwgMTYsIDE2LCAgOCwgLTIsIDEzLCAgOCwtMTUsLTExLCAgMiwgMTAgfSwKKyAgICB7IC04LCAgMiwtMTMsICAyLC0yOSwgMjQsLTIwLCAxOSwgIDEsIDEwLCAtNCwgMTAsICAxLCAgMiwgLTksIDExLAorICAgICAgLTEsIC0yLCAgOSwgLTUsIDE5LCAtNywgMTYsIC05LCAtMiwtMTgsIDExLCAgMSwgIDEsICAwLCAgNywgLTMgfSwKKyAgICB7IC02LCAgMywgIDQsIDEzLC0yNiwgMTAsLTEwLCAyOCwgLTcsIDI4LCAgMSwgIDcsICAwLC0xNCwgIDUsICA3LAorICAgICAgIDQsIC00LCAgMywgLTIsICAzLCAgMywtMTEsICA3LCAgNiwgIDQsICAwLCAtMSwgIDIsIC0xLCAtMywgIDIgfSwKKyAgICB7IC02LCAxNiwtMzEsIDEzLC0xMCwgMTcsIC02LCAgNCwtMTQsICA0LCAgNCwgLTEsLTEwLCAxMiwgLTUsICAxLAorICAgICAtMTQsIDE1LCAgMCwgLTgsICAxLCAtNSwgIDMsICAzLCAgOSwgLTUsICA3LC0yMCwgIDcsICA0LCAxMSwgLTUgfSwKKyAgICB7LTE5LCAgMywtMTcsIDE0LC0xMiwgMTYsLTIyLCAxOCwgMTQsICA4LCAtMiwgIDQsIDEwLCAxMiwtMTQsICA0LAorICAgICAgLTMsICAyLCAgMywgIDcsIC03LCAgNywgLTYsICAyLCAtMiwgLTQsIC01LCAgMCwgLTUsIC0yLCAgMiwgIDEgfSwKKyAgICB7IC05LCAtNywtMTEsIDI0LC0zNiwgLTksLTExLCAgNSwgIDcsLTEyLC0xMywgMTgsIC0yLCAyMCwgIDEsIC00LAorICAgICAgLTEsLTEwLCAxNSwgLTYsIDE0LCAgMSwgIDAsICAyLCAgMSwgIDIsIC05LC0xNiwtMTEsICA3LCAxMywgIDAgfSwKKyAgICB7LTI0LCAyNCwtMTgsIDE4LC0yMiwgMTQsLTExLCAxMywtMTIsIDExLC0xMCwgMTEsIC03LCAxMSwgLTUsIC00LAorICAgICAgLTEsICAxLCAgNSwgIDIsICAzLCAtMSwgIDEsIC01LCAgNywgLTQsICA1LCAtNiwgIDgsIC03LCAgOCwgLTYgfSwKKyAgICB7IC02LCAxOCwtMjIsIDIyLCAgNSwgMTEsIC0xLCAgNiwgMTksIDIyLCAgOCwgIDQsIC04LCAyMCwgLTIsIDE1LAorICAgICAgLTYsLTE4LCAgMCwtMzMsIC05LC0xMiwgLTEsICA2LCAgNSwgIDIsICA1LCAgNSwgLTUsLTE3LCAtMywgLTMgfSwKKyAgICB7ICAxLCAxMSwtMTYsICA5LC0xOCwgMTEsIC00LCAxOCwgMjAsIDI2LC0xMCwgIDgsICAxLC0xMSwgIDgsIC00LAorICAgICAgIDAsICA3LCAgMywgIDUsICAyLCAgMiwgMTAsIC0yLCAtNCwgIDQsIC00LCAtMiwgIDEsIC00LCAtNSwgLTEgfSwKKyAgICB7LTEwLCAgNiwgLTEsIDE4LC0xNywgMjcsIC0zLCAxMCwgLTIsIDEyLCAtNywgLTksICAxLCAgMSwgLTEsICA3LAorICAgICAtMTIsIC0xLCAtNywgLTYsIC0xLCAgOCwgIDMsLTE1LCAgOCwgIDksICAzLCAtNywgIDQsIC0xLCAgMSwgLTEgfSwKKyAgICB7LTE0LCAgNiwtMTYsIDIyLCAgMiwgIDUsICAwLCAgNSwtMTgsIDExLCAgNiwgLTMsIDIyLC0yMCwgLTksIC0zLAorICAgICAgIDYsIC02LCAtNywtMTUsICAxLCAxNSwgLTgsIDExLCAgOCwgLTMsIC04LCAgMSwgLTgsICAyLCAgNiwgLTIgfSwKKyAgICB7LTIxLCAgNSwtMTksIDE5LCAtNywgIDQsIC03LCAgMCwgLTgsICA2LCAxMiwgIDUsIC0zLC0yMiwtMTMsIC02LAorICAgICAgLTEsIC0zLCAtMiwtMTQsICA2LCAtMywgIDEsIC04LCAtNywgLTUsIC02LCAxMSwgLTMsLTEwLCAtNSwgIDIgfSwKKyAgICB7IC0xLCAgOSwtMTIsIDE1LCAtNiwgIDYsLTE5LCAxNCwgLTksIDExLCAgMywgMTIsLTE3LCAtMywgIDgsIC00LAorICAgICAgLTMsIC00LCAgMSwgLTUsICA0LCAgNSwgLTcsLTE1LCAtNywgMTUsIC02LCAtNSwgIDEsIC01LCAtMywgIDEgfSwKKyAgICB7LTEyLCAyMCwtMTUsIDIwLC0xNCwgIDMsLTE0LCAgOSwgLTYsIDMzLC0xMywgIDYsIC0yLCAgOCwgLTYsICA3LAorICAgICAgLTUsIC02LCAtMywgLTMsICAwLCAgOCwgLTMsIC0zLCAgMSwgLTIsICAyLCAgMiwgIDYsIC01LCAtNSwgLTIgfSwKKyAgICB7IC03LCAxMiwtMTgsIDEyLC0xOCwgMTAsIC00LCAgOCwgIDIsICA0LCAgOCwgIDksICAwLCAgMywgLTgsICAzLAorICAgICAgIDYsLTEyLCAtNCwgIDEsIDI1LCAtNSwgLTksICA2LCAtNywgIDAsIC05LCAtNywgIDMsIC01LCAtNCwgLTQgfSwKKyAgICB7LTE4LCAxMiwtMTAsIDExLC0yMiwgIDAsLTE1LCAgNSwgLTIsICAyLCAtMywgIDYsIC00LCAtNCwgLTMsLTE1LAorICAgICAgLTIsIC0zLCAyMSwgIDYsLTEyLC0xMSwgMTksICAzLCAgMywtMTQsICA3LCAgMCwtMTEsLTIyLC0xMCwgIDAgfSwKKyAgICB7LTE1LCAgMiwtMzAsIDE1LC0xNywgMTMsLTE2LCAgOCwgLTcsIDEwLCAtOCwgIDIsIDExLCAgMywgMTAsIC03LAorICAgICAgIDcsLTIyLCAxMiwtMTAsICAzLC0xMiwgIDYsLTEwLCAxMiwtMTAsICA3LCAtOCwgIDUsICAyLCAgOSwgIDEgfSwKKyAgICB7IC05LCAxMSwtMTQsICA2LC0xMCwgMjEsICA1LCAxMiwgLTUsICA1LCAgNywgMjEsICA2LCAgMiwgLTIsIC0xLAorICAgICAgLTEsICA0LCAgMiwtMjAsLTE4LCAtMSwtMTQsICAzLCAtMSwgIDQsIC03LCAxMCwgIDEsIDExLCAgNCwgLTQgfSwKKyAgICB7LTIyLCAgOCwtMzAsIDEzLC0yMSwgLTQsICA0LCAtMSwgMTIsICA5LCAtMiwgLTMsICAyLCAtNiwgIDQsLTEzLAorICAgICAgLTIsICA4LCAgOCwgIDEsIC03LCAgMywgLTQsIC01LCAtMSwgLTcsIC0yLCAgOCwgIDgsICA3LCAgOCwgIDAgfSwKKyAgICB7IC02LCAtNCwtMzUsIDE2LC0xMywgMTUsLTExLCAxNCwgLTcsICA5LCAtMSwgMTEsICA3LCAgMCwgMTMsIDEwLAorICAgICAgLTEsICA4LCAgMSwgIDEsIC0yLCAgOCwgLTEsICAyLCAgMiwgIDMsLTEwLCAtMSwgIDcsLTEzLCAtMywgLTcgfSwKKyAgICB7LTE1LCAgNywtMTYsIDE0LC0xOCwgMTcsIC02LCAxNCwgIDMsICA0LCAgNywgLTMsIDEwLC0yMiwgIDUsLTE1LAorICAgICAgIDQsIC00LC0xMSwgMTUsLTE1LCAxMSwtMTEsIDIwLCAgMSwgIDAsICAyLCAgMSwgMTEsIC0zLCAxMSwgLTcgfSwKKyAgICB7LTEyLCAgMywgIDUsIDE2LC0zNywgLTEsIDE1LCAxNSwtMTUsIDEwLCAgMywtMTAsICAxLCAxNSwgIDcsLTE1LAorICAgICAtMTMsICA4LCAgOSwgLTMsICAyLCAxMiwgLTgsICAyLCAtNSwgIDAsIC0zLCAgNCwgIDUsIC05LCAtNCwgIDUgfSwKKyAgICB7LTE2LCAyNiwgLTQsIDE0LC0yMiwgMjYsICA2LCAtMywgLTgsICA0LCAyMSwgIDYsIDE2LCAtNCwtMTEsICA3LAorICAgICAtMTAsICAzLCAgMywgIDcsIC00LCAgMiwgLTksICA4LCAtMiwgIDIsICA1LCAtMiwgLTQsIC0yLCAgNywgLTEgfSwKKyAgICB7IC03LC0xMCwgIDQsICAzLCAgMiwgLTQsLTEyLC0xMCwgLTQsIC01LCAxNiwgMTksLTE2LCAgMSwgIDIsIC05LAorICAgICAtMTAsICAwLCAgOSwgIDcsIC04LCAgMywgMTIsICA4LCAtNiwtMTEsLTEzLCAtMSwgLTMsLTIwLCAgNiwgLTUgfSwKKyAgICB7LTE0LC0xNywgIDMsIC01LCAxNCwtMTIsLTEyLCAgOCwgLTYsLTI1LCAyMSwgMjEsIDEwLCAtOCwtMTIsICA0LAorICAgICAgMTAsIC00LCAgMywgLTksIDExLCAgOSwgIDAsICA0LCAgMiwtMTUsICAxLC0xNCwgIDQsICAxLCAgMCwgLTQgfSwKKyAgICB7IC00LCAtOSwgLTMsIC0xLCAgNiwgIDMsIC02LCAgNiwtMTAsIC00LCAxNCwgIDgsICAyLCAtMywtMTIsLTE5LAorICAgICAgIDAsIDExLC0yMCwgIDEsICA2LCAtMiwtMjcsIC02LCAxMCwtMTcsLTE0LC0xNywgLTksICA4LCAtOCwgIDMgfSwKKyAgICB7LTEyLC0xMywgMTYsIC00LCAtMiwgMTIsIC03LC0xMSwgIDIsLTEzLCAgMywgIDcsLTE2LC0xOCwgLTEsLTEyLAorICAgICAgLTIsICAxLC0xMiwgLTksIC0yLCAtNiwgIDIsICA5LC0yMiwgLTMsIC00LC0xNCwgLTcsICA3LCAtMSwgIDIgfSwKKyAgICB7IC03LCAtOCwgLTgsIDE1LCAxNSwgMTgsIDE1LCAxNiwgLTQsLTM3LCAxMSwgMTUsLTEyLCAtMSwgLTMsICAzLAorICAgICAgIDYsICA2LCAgMCwgLTUsIC0zLCAtNSwgIDksICAxLCAgMSwtMTEsIC0xLCAtOCwgLTYsICAyLCAgMywgIDAgfSwKKyAgICB7IC02LCAgNywgLTUsLTEyLCAxMywgMTAsLTE4LCAtNCwgLTMsLTIxLCAgNiwgMTYsLTE1LCAtNywtMTIsIC05LAorICAgICAgIDEsLTEyLCAtMSwgMTAsIC0yLCAtMSwgLTMsICA0LCAtNCwgIDEsLTE2LCAtMSwgMTIsIC05LCAgNSwgIDkgfSwKKyAgICB7LTE0LCAtNSwgIDksICAzLCAgNCwgMjYsLTI4LCAgMywgLTYsLTI0LCAgNCwgIDUsICAzLCAxMywgIDUsIC0xLAorICAgICAgIDMsIC0xLCAgMywgIDEsICAxLCAtNSwgIDMsICAwLCAtNywgLTgsIC03LCAtMywgIDMsIC01LCAgNCwgIDAgfSwKKyAgICB7IC00LCAgMiwtMTAsIC02LCAyNSwgMjYsIC02LCAxMCwgLTYsIC04LCAxNSwgMTEsIC02LCAtMywgIDIsIC03LAorICAgICAgIDUsIDE0LCAgOSwgLTEsICAwLC0xMiwgIDQsIC00LC0xMCwgIDEsIC0zLCAgMywgLTIsIC0yLCAtNiwgLTEgfSwKKyAgICB7LTEwLCAgOCwtMTUsLTEwLCAxOSwgMTcsIC04LCAgMCwgLTMsIC03LCAgNywgIDUsLTEzLCAtMSwgIDcsIC03LAorICAgICAgIDEsIDEzLC0xMiwtMTMsIDE3LC0xMiwgIDEsIDI2LC0xOCwgLTMsIC01LCAtNiwgIDQsICA1LCAgOCwgIDEgfSwKKyAgICB7ICAyLCAtNSwgIDMsICAwLCAgMCwgIDAsICAyLCAtMywgLTIsIC01LCAgNywgMTMsIC00LCAgOSwgIDAsIC01LAorICAgICAgIDQsIC0xLC0xMSwgLTgsIC00LCAgMCwtMTMsICAyLC00NywtMjMsIC04LC0xMSwgLTQsICA0LCAtMiwgLTMgfSwKKyAgICB7LTE4LCAtNCwgIDQsICA1LCAtMSwgMTcsLTEyLCAtOCwgIDEsLTEyLCAgNywgMjAsLTEyLCAgMywgLTIsLTExLAorICAgICAgMTYsIDEyLCAtNiwgIDEsLTEzLC0xNiwgLTYsIC0zLCAtMywgLTUsICA0LC0xMiwgLTUsIC05LCAxMCwgIDEgfSwKKyAgICB7LTExLCAgMCwgIDQsICA3LCAgNywgIDgsICAzLCAtMSwgIDMsLTE5LCAzMiwgIDgsLTE5LCAtOCwgIDIsICA0LAorICAgICAtMTIsIDE1LC0xNiwgIDMsICAxLCAgOSwgLTIsICAxLCAtMiwgIDgsICA1LCAgNiwgLTQsIC0xLCAxMSwgLTggfSwKKyAgICB7ICAzLCAtMSwgIDQsIC0yLCAxNCwgMzIsIC05LC0yMywtMTAsLTEyLCAyMiwgMTUsIC0xLCAtMiwgMTAsICAwLAorICAgICAgIDQsICA2LCAtOCwgIDQsLTE1LCAtMiwgLTEsIC00LCAgMCwgLTgsICA0LCAgMSwgLTgsICAzLCAgNCwgIDEgfSwKKyAgICB7LTE3LC0xMiwgIDYsIC04LCAxNiwgMTMsLTIwLCAtOCwgLTEsLTE2LCAxMCwgMjEsLTE5LCAxMSwgLTksIC01LAorICAgICAgIDcsIDE4LCAtNiwgIDcsIC03LC0xOCwgMTMsICAyLCAtMiwgIDgsLTEyLCAtOSwgIDIsICA0LCAtNSwgMTYgfSwKKyAgICB7ICA0LCAgMCwgMTcsLTExLCAxMiwgIDcsLTEyLCAgNSwgLTEsLTI1LCAzMCwgLTgsIC03LCAtNiwgLTQsIC03LAorICAgICAgIDksICA4LCAgNywgIDMsICAzLC0xNiwgIDgsICAwLCAtMiwgLTIsLTE4LCAtMywgLTQsIC01LCAgMSwgIDQgfSwKKyAgICB7IC0zLCAtNiwgIDYsLTE2LCAxNywgIDYsIC0zLCAgMiwgLTksLTE3LCAxMiwgMTEsIDExLCAgMiwtMjAsICA4LAorICAgICAgIDEsICAxLCAgMCwgIDIsIC0yLCAtNiwtMjEsLTEzLCAtOSwtMTUsIC0xLCAtOCwgLTYsIC04LCAgMCwgLTIgfSwKKyAgICB7LTExLCAtNywgIDYsIC05LCAgMywgIDYsICA4LCAxNiwgIDQsIC01LCAyMywgMjYsLTEwLCAtMywgIDQsICAwLAorICAgICAgIDIsICAyLCAtNCwgIDQsIC0yLC0xMiwgMTIsIDEwLC0xMSwgIDAsLTEwLC0xNiwgIDMsICAwLCAgMCwtMTAgfSwKKyAgICB7IC01LC0xNiwgMTAsIC02LCAyNywgMTMsIC0zLCAgNCwgLTIsLTEzLCAxNSwgIDUsICAyLCAgNSwgIDMsIC00LAorICAgICAgMTMsIDEyLC0xMSwgLTcsICAwLCAgMSwgMTEsIDEyLCAgMiwgMTMsLTE1LCAtOCwgIDksIC0yLCAgMywgIDggfSwKKyAgICB7IC01LCAtOCwgIDQsICAzLCAgOSwgIDMsLTExLCAxMCwgMTQsLTI1LCAxNCwgIDgsIC0yLCAgNSwtMTIsLTIxLAorICAgICAgIDIsIDEwLCAtNywgIDIsIC0zLCAgMiwgIDAsICAyLCAtMSwgLTMsIC01LCAtNiwgLTEsLTE2LCAgMiwgIDggfSwKKyAgICB7IC0xLCAgNSwgIDEsLTExLCAgNSwgIDksIC03LCAgOCwtMTMsLTEyLCAgNCwgMTIsIC00LCAgMSwgLTEsIC0xLAorICAgICAgMjcsIDI5LCAxMCwgMTUsICAyLCAtNiwgLTMsICA0LC0yMSwgMTAsIC05LC0xMSwgLTYsIC0xLCAtOSwgLTMgfSwKKyAgICB7IC02LCAtMywgLTEsIC02LCAxMSwgLTUsICAwLCAtMiwgLTUsLTMxLCAxMSwgIDMsIC0xLCAgNSwgLTMsICA0LAorICAgICAgIDUsICA3LC0xMCwgIDUsLTEwLC0xMywgIDQsIDEyLC0xNSwgLTIsICAyLCAtNywgIDEsIC05LCAtMywtMTAgfSwKKyAgICB7IC0zLCAtNywgMTcsIC04LCAtNSwgMzYsICA4LCAtNywgLTgsLTIwLCAxMiwgIDgsICAxLCAtMSwgIDMsICAwLAorICAgICAgIDEsICA0LC0xMCwgIDMsICAxLCAgNCwgLTIsIC0zLCAtMiwgLTMsLTEwLCAgNCwgLTEsIC03LCAgMywgIDIgfSwKKyAgICB7LTEzLCAtMywgLTUsICA5LCAyMiwgIDYsLTIzLCAgMywtMTAsIC03LCAxNywgMTcsIDE4LC0xNCwgLTgsIC04LAorICAgICAgIDIsICA0LCAtOCwgIDIsIC0zLCAtOCwgIDYsICA0LCAtMSwgIDcsICAwLCAgMCwgLTMsICAwLC0xMiwgLTMgfSwKKyAgICB7IC0zLC0xMCwtMTUsIC0zLCAgOSwgIDMsLTIzLCAtOSwtMTMsLTE4LCAxMiwgMTMsIC0yLCAgMCwgIDEsICA4LAorICAgICAgLTEsICAyLCAtNywtMTIsIC01LCAxNCwgIDIsICAxLC0yMiwgIDYsLTEwLCAtOCwgLTksIDI4LCAtNywtMTQgfSwKKyAgICB7IC0zLCAgMSwgIDIsIC0xLCAxMywgIDcsIC0yLCAtNywgIDEsIC0zLCAgNiwgIDksIC0zLCAtMiwgIDQsIC0yLAorICAgICAgIDIsICAxLC0xMCwgLTIsIC0yLC0yMiwgLTIsIC03LC0xMCwgLTUsLTExLC0yNywtMTIsLTE2LCAgNCwgLTcgfSwKKyAgICB7ICAyLCAtNiwgLTMsICAxLCAgOCwgIDAsIC0yLCAxMiwgLTMsIC00LCA1OCwgMTUsLTEwLCAtNCwgLTIsICAyLAorICAgICAgLTIsICAwLCAtMiwgLTYsICAyLCAgNCwgLTEsICAxLCAtNCwgIDEsIC0xLCAtNSwgLTQsIC0zLCAgMywgIDEgfSwKKyAgICB7IDEwLCAtMSwgIDAsICA1LCAyMSwgIDcsLTE0LCAgNiwgLTMsLTE2LCAxNSwgMTcsLTE2LCAxMywgIDMsIC02LAorICAgICAgLTQsICA2LC0xMiwgLTUsICAxLCAtNCwgLTcsIC04LCAgMiwgIDMsIC02LCAgNiwgLTEsIC04LCAgNSwgIDQgfSwKKyAgICB7IC02LCAtMiwgLTgsLTExLCAxNSwgMTAsICAwLCAgOCwgLTYsLTE1LCAzMywgIDgsIC0yLCAxOCwtMTUsLTExLAorICAgICAgIDUsIC0xLCAgMCwgMTUsLTE1LCAtNCwgLTQsIC0xLCAxMCwgIDcsLTEzLCAgNCwgLTQsICAwLCAgOCwgIDMgfSwKKyAgICB7IC03LCAtMiwgIDAsIC0yLCAgMCwgLTIsIC00LCAtNSwtMTQsLTE2LCAxMiwgMzgsICA3LCAxMiwgIDYsIC00LAorICAgICAgIDAsIC0xLCAgMCwgIDMsIC0yLCAtNiwgIDAsICAyLCAtOSwgIDEsICAwLCAtMSwgIDAsIC0yLCAgNCwgIDEgfSwKKyAgICB7IC04LCAtNCwgMTgsICAxLCAxNCwgIDUsLTEyLCAtMywgMjAsLTE3LCAgNSwgMTksLTExLCAtOCwgMTEsIC0zLAorICAgICAgIDMsICA5LCAtNywgLTgsICA5LC0xNywgIDIsIDE1LC0xMCwtMTEsICA1LCAtNSwgIDcsIDE1LCAtNiwgLTIgfSwKKyAgICB7IC03LCAgMiwgMzgsICA1LCAxOSwgMTYsIC01LCAgNCwtMTMsLTIwLCAgMCwgIDQsIC00LCAgNiwgIDQsICAyLAorICAgICAgLTcsICA2LCAtOCwgLTIsIC01LCAtNywgIDYsICAzLCAtNCwgLTMsIC0yLCAtMywgIDcsIC02LCAtNCwgIDAgfSwKKyAgICB7LTExLC0xMiwgIDgsLTE1LCAtMywgMTQsIC03LC0yMiwtMTEsICAyLCAyMiwgMTQsLTE5LCAgMiwtMTksIC02LAorICAgICAgIDEsICAzLC0xOCwgMTQsICAyLCAtNiwgLTIsIC04LCAtMywgLTYsICA1LCAtNywgLTgsIC00LCAgMSwgIDEgfSwKKyAgICB7ICA4LCAgNywgMjUsLTIxLCAxMiwgLTYsIC01LCAtNCwtMTAsICA2LCAgMCwgMTAsICAxLC0xMiwgMTgsIC01LAorICAgICAtMTUsICA0LCAgMSwgMTQsIC0xLCAgNSwgIDgsIC03LCAgMSwgLTcsIC0zLCAgOSwgMTAsICAxLCAtMSwgIDAgfSwKKyAgICB7ICA5LCAxMCwgMzIsLTE1LCAgOCwgIDIsIDExLCAtNywtMTgsIC04LCAgMiwgLTYsIC05LC0xNiwgLTMsICAzLAorICAgICAgLTEsICAzLCAgMSwgLTUsICA0LCAtMiwgIDEsIC04LCAgMCwgLTYsIC0zLC0xMSwgIDEsICA1LCAgMCwgIDAgfSwKKyAgICB7IDE0LCAgMCwgMjMsLTI1LCAyMiwgIDMsICA3LCAxMCwgIDAsIC0yLCAgNywgIDgsICAwLCAxMCwgIDAsICAwLAorICAgICAgIDMsICAyLCAgMywtMTAsICAwLCAxMCwgIDAsIC03LCAgMCwgMTAsIC0xLCAtNSwgLTcsICAxLCAtMSwgIDIgfSwKKyAgICB7IDEyLCAgMCwgMjUsLTE4LCAtNSwgLTQsIDEzLC0xMCwgIDMsIC02LCAgNywgMjEsICAwLC0xNiwgIDMsLTEwLAorICAgICAgLTYsICA1LCAtNywgLTMsICAyLCAgNSwgIDMsIC02LCAgNCwgIDksIC04LCAxMiwgLTIsICAzLCAgMiwgIDQgfSwKKyAgICB7IDMxLCAxNSwgMjcsLTIwLCAxMCwgLTcsIDE1LC0xMCwgIDksIC04LCAgNCwgLTUsICAzLCAtMywgIDUsICA2LAorICAgICAgMTEsIC0yLC0xMiwgLTIsICA2LCAtMiwgIDEsICAyLCAtMSwgLTEsICAxLCAgMSwgIDMsICAxLCAgMSwgIDIgfSwKKyAgICB7IDEyLCAtNCwgMTMsLTIzLCAxMiwgLTYsICAyLCAgNCwgLTMsIDEzLCAgNiwgLTcsICA1LC0xOSwgLTcsIDE4LAorICAgICAgIDEsIC03LCAgNywgIDEsIDE2LCAtNywgIDMsICAwLCAgMywgIDAsLTEyLCAgOCwtMTEsICA5LCAgNCwgIDcgfSwKKyAgICB7IDI5LCAgMSwgIDMsLTIyLCAtNSwgIDYsICAwLCAxMiwtMTQsIDExLCAgMSwgIDYsIC0zLCAgNCwgIDYsIC0yLAorICAgICAgIDQsLTEzLCAxMiwgIDEsICAxLCAgMywtMTEsICA5LC0xMCwgLTEsIC03LCAxNiwtMTEsIC0xLCAgMywgIDkgfSwKKyAgICB7ICA0LCAgNCwgMzYsLTIzLCAtNSwgLTgsLTE1LCAgMSwgLTYsICAzLCAxMywgLTEsIC01LCAtNywgIDQsICA5LAorICAgICAgIDIsLTExLCAtMywgIDUsICAxLCAgMywgLTYsIC0xLCAtNCwgLTQsIC0yLCAgMiwgIDMsIC0xLCAtNSwgLTIgfSwKKyAgICB7IDE5LCAxMCwgIDYsLTE3LCAgMiwgLTQsIC0yLCAtNCwgLTMsIDEzLCAgMiwgIDIsLTEzLCAtNywgLTMsLTExLAorICAgICAgIDksIC02LCAgMSwgLTksIC01LCAgNCwgLTUsIC05LC0xOCwgLTcsLTExLCAgOSwgIDQsLTExLCAgOCwgIDQgfSwKKyAgICB7IDE2LCAtMywgIDksLTE2LCAxOCwgLTIsLTEyLC0xNiwtMTEsIDExLC0xOCwgMTYsLTEzLCAgNiwgIDIsICA4LAorICAgICAgIDMsICA4LCAtNCwtMTYsIDEwLC0xMSwgLTEsIC0zLCAtOCwgIDUsIC05LCAtNCwgIDksIC00LCAgMCwgLTMgfSwKKyAgICB7IDE0LCAxNSwgIDMsLTIzLCAtNSwgIDcsIC04LCAtNiwgIDIsIDE3LCAgMiwgMTIsIC04LC0xMiwgMTMsIC0xLAorICAgICAgLTksICAzLCAgMSwgIDEsIDE5LCAxNSwgIDQsIC0xLCAgMSwgIDIsIC0zLCAgMiwgLTMsICAxLCAgNSwgIDMgfSwKKyAgICB7IDMyLCAgNSwtMTAsLTQ3LCAtNSwgLTEsICA0LCAxMSwgLTcsICAwLCAgMiwgLTIsICAxLCAtNywgIDYsIC00LAorICAgICAgIDYsICAyLCAtNCwgLTIsICAyLCAtMiwgIDAsIC00LCAgMSwgLTYsIC01LCAgMiwgLTIsIC0xLCAtMywgLTQgfSwKKyAgICB7IDIwLCAgOCwgMTAsLTIxLCAtNywgLTksLTE2LCAxMiwgIDEsICA0LCAgNiwgLTUsICA5LC0xMSwgLTcsICA0LAorICAgICAtMTEsIDI4LCAtMywgIDIsICA0LCAtNiwgMTAsIC04LCAtNSwgLTUsIC05LCAgOSwgLTIsIC0xLCAgNiwgLTUgfSwKKyAgICB7IDM4LCAgMywgMjMsLTI1LCAtNiwtMTgsICAzLC0xMCwgLTgsICA2LC0xMCwgIDEsLTEwLCAgMiwgIDIsICAwLAorICAgICAgLTcsICAyLCAtNCwgIDUsIC0xLCAgOCwgLTMsICAwLCAgMywgIDMsIC0xLCAgMSwgIDAsIC00LCAtNCwgIDAgfSwKKyAgICB7IDIwLCAgNSwgMTYsLTIyLCAyNCwtMTgsICAyLC0xMiwtMTQsIC03LCAtMywgMTAsICAyLCAgNywtMTAsICAyLAorICAgICAgLTgsICAxLCAgOCwgLTEsICA0LCAgMSwgIDQsIC0yLCAgNSwgLTksLTE4LCAtOCwtMTMsICA1LC0xMSwgMTAgfSwKKyAgICB7IDE0LCAgOCwtMTIsLTE2LCAgOSwtMTEsIC0zLCAtNiwtMjUsIC03LCAgNiwgIDUsIC03LC0xNiwgMTAsICAyLAorICAgICAgLTcsIC0xLCAtOSwgLTMsIDE2LCAgNCwgIDMsICAzLCAtMywgLTMsLTE1LCAxMywgLTMsICA0LCAxMywgLTcgfSwKKyAgICB7IDE2LCAtOSwgMTksLTIzLCAgNywtMTksIC0zLCAtNSwtMTUsIDExLC0yMSwgMjEsLTE2LCAxOCwgLTEsICA2LAorICAgICAgMTAsLTEwLCAxOCwtMTQsIDE2LC0xNSwgIDYsIC01LCAtOSwgIDUsLTE3LCAxMywtMTAsIDEzLCAgMCwgMTAgfSwKKyAgICB7ICA4LCAtNCwgIDQsLTI0LCAgOCwtMjEsLTE4LCAgOSwtMTEsICA0LCAtNiwgMTcsICA1LCAtOSwgLTIsIC0yLAorICAgICAgIDIsIDE1LCAtMiwgLTMsIC0yLCAgMSwgIDcsLTEzLCAxNSwtMTAsIC04LC0xMSwgIDMsICAzLCAtMSwgLTEgfSwKKyAgICB7IDE0LCAxNywgIDYsLTMyLCAgNSwtMTcsIC0yLCAgMCwgMTUsIC0xLCAtNSwgMTYsICAxLCAtNSwgLTIsICA5LAorICAgICAgLTMsICA4LCAgNCwgLTIsIC0yLCAtNCwgLTMsICAxLCAgMCwgIDcsIC0zLCAgNCwgLTUsICAwLCAtNywgIDIgfSwKKyAgICB7IDI0LCAgNiwgMjIsLTEyLCAgOCwgIDMsLTE0LCAgNCwgLTcsICA4LCAgNiwgIDUsICA2LCAgMSwgIDYsLTEyLAorICAgICAgMTUsIDEwLCAgNCwgMTEsICA5LCAgNiwgLTcsIC00LCAxMCwgLTksICAyLCAtMSwgLTUsIDExLCAxNSwgIDMgfSwKKyAgICB7IDE3LCAxMiwgIDMsLTIzLCAgNSwgLTEsIC0yLCAgMSwgLTksIC0xLCAtMywgIDEsICA4LCAgMSwgLTUsIDE3LAorICAgICAgMTEsICAwLCAtMiwtMTEsICA3LCAgNCwgIDAsLTI3LCAtNywgIDEsICAyLCAtOCwgIDksICA3LCAgNSwgIDMgfSwKKyAgICB7IDEyLCAxMCwgMTIsLTEwLCAtNCwgIDUsIC0xLCAgMiwtMjQsICA1LCAtOCwgIDIsICA2LC0xNywgMTksICA1LAorICAgICAgMTIsIC0yLCAxNiwgLTcsIC02LC0xNCwgIDQsICAxLCAtMywgMTMsLTE2LCAgNSwgLTEsICA0LCAgMSwgIDEgfSwKKyAgICB7IDMxLCAgOSwgMTEsLTE3LCAxMCwgLTMsIC03LCAgNywgIDEsICAyLCAgMiwgIDQsIC0zLCAtMSwgMTEsICA0LAorICAgICAgLTUsIC04LCAgMSwgIDQsIDE1LCAtNiwtMjgsICAxLCAgOCwgIDMsIC02LCAgNSwgMTcsIC0yLCAgMiwgLTQgfSwKKyAgICB7IDExLCAxOSwgMTYsLTI2LCAgMCwgLTcsIC03LCAgMiwtMTMsLTE1LC0xMiwgIDksIC0zLCAyNywgIDgsICA0LAorICAgICAgLTYsICAxLCAgNCwgLTYsIDExLCAtMSwgLTYsIC03LCAtMywgIDAsIC02LCAgNCwgLTYsIC03LCAtMywgLTEgfSwKKyAgICB7IDEwLCAxOCwgMTYsLTMyLCAxOSwgLTksIC00LCAtMywgLTcsICA4LCAgOCwgLTMsLTExLCAtMiwgLTYsLTE2LAorICAgICAgMTMsIDEzLCAtNiwgLTEsIDEwLCAtMiwgLTIsIC05LCAgMCwgLTMsICA5LCAgNCwgMTEsIC0yLCAtNiwgIDYgfSwKKyAgICB7ICA5LCAgNCwgMTksLTMzLCAgNCwgIDcsLTEyLCAzNiwgLTMsIC0xLCAgOCwgLTIsICAyLCAtOCwgLTksIC00LAorICAgICAgLTgsICAwLCAgMSwgLTEsICAwLCAtNCwgLTQsICAzLCAgMCwgIDMsICA2LCAgMCwgLTYsICAyLCAgMCwgLTIgfSwKKyAgICB7IDI1LCAgNywgMTUsLTEyLCAgMiwtMjQsIC0xLCAyNCwgLTQsICA0LCAgOSwgIDAsIC0yLCAtOSwgIDQsICA2LAorICAgICAgIDMsIDEzLCAtMywgIDEsICA1LCAtMSwgLTMsIC01LCAtMSwgIDcsIC0yLCAgMywgIDQsICA0LCAgMSwgIDAgfSwKKyAgICB7IDE5LCAgNiwgIDgsLTIwLCAgOSwgLTksICA1LCAtNCwtMTMsICA3LCAxMSwgLTMsICA1LC0xMywgLTksICA2LAorICAgICAtMTEsIC0xLCAgMCwgIDQsIDExLCAyNiwgIDMsICA2LCAtNywgMTIsICA2LCAtMywgIDEsIC05LCAgNywgIDEgfSwKKyAgICB7IDE1LCAgNiwgMTksLTIzLCAtMywgLTksICAzLCAxNiwgLTYsIC00LCAgNiwgLTUsLTEwLCAgMSwgMTYsLTE0LAorICAgICAgIDIsICAwLCAgMiwtMTMsIC0zLCAgOCwgLTYsICAzLCAgMSwgIDEsICAyLCAtNSwgMTIsIC00LCAtOCwgLTMgfSwKKyAgICB7IDE0LCAgNCwgMTYsLTIwLCAgMSwgMTIsICAwLCAgNiwgLTMsICA5LCAgNCwgMTYsIDEwLC0xNiwgIDUsICA3LAorICAgICAgIDUsIC00LCAtNCwtMTgsIC0zLC0xMSwgLTQsICA0LCAtNywgIDMsIDEzLCAgNywgIDMsICAzLCAgMiwgLTcgfSwKKyAgICB7IDIyLCAgMywgLTEsLTMwLCAxOCwgLTMsIC05LCAgOSwgLTIsIDExLC0xNiwgLTIsLTE0LCAxMiwgIDAsICA0LAorICAgICAgLTUsICA0LCAtMSwgIDMsLTIwLCAxMiwgIDQsLTEwLCAtMiwgLTIsLTEyLC0xMiwgMTAsICA2LCAxMSwgLTMgfSwKKyAgICB7IDE1LCAgNywgIDIsLTIxLCAgNSwgIDQsICA5LCAtOSwtMzMsICA3LCAgNywgIDMsIC02LC0xNCwgLTgsIDEwLAorICAgICAgMTIsICAwLCAgMiwgLTEsICA1LCAgNCwgLTIsICAwLCAtNywgIDAsICAyLCAgNCwgIDAsICAxLCAtMywgIDggfSwKKyAgICB7IC03LCAgMCwgMTIsICAzLCAgMCwgLTYsICA4LCAtNCwgIDAsICAyLCAxNCwtMTUsICAyLCAtNywtMzEsIC0zLAorICAgICAgMTQsICAwLCAxNCwtMTUsIC0xLCAtNCwtMTUsIDEwLCAgMSwgLTMsICAxLCAgMiwgIDUsICAyLCAtOCwgIDEgfSwKKyAgICB7IC0yLCAgNSwgIDEsICAwLCAtMywgIDMsICAzLCAtNiwgLTEsICAyLCAtNCwgIDEsLTE5LCAgMCwtMTEsIDE4LAorICAgICAgMTEsIDEwLCAyMSwgIDUsICA2LCAgMiwgMTAsICAzLCAtNiwgIDAsIC0yLCAxMywgIDUsIC0xLCAtMiwgIDkgfSwKKyAgICB7IC05LCAgMSwgLTUsICAwLCAgMCwtMTUsICA4LCAgNCwgIDgsICAzLCAgOCwgMTIsLTEzLCAtMiwtMzksIC0yLAorICAgICAgIDQsIC00LCAgNSwgLTMsIC00LCAgMywgLTMsICAzLCAxMCwgIDUsICAzLCAgMiwgLTMsICA1LCAtMiwgIDggfSwKKyAgICB7IC05LCAgNiwgIDYsIC04LCAxMiwtMTIsIDIzLC0xOCwgIDQsLTE1LCAtNSwgIDIsLTIwLCAxMywgLTcsICA3LAorICAgICAgIDcsLTEyLCAxNCwtMTIsICA2LCAgMSwgIDEsIC0zLCAtOCwgIDksICAwLCAgMSwgLTcsICAzLCAgNywgLTYgfSwKKyAgICB7LTE4LCAxMywgIDQsICAzLC0xMCwtMzAsLTEwLCAtNiwtMTQsICAxLCAtNywgLTQsLTM1LCAgNSwtMjUsIDExLAorICAgICAgIDksICA4LCAxOSwgLTQsIC03LCAtMywtMTgsIC04LCAgMSwgIDUsIDEwLCAtNCwtMTQsIC05LCAgMywgLTQgfSwKKyAgICB7IC02LCAtMSwgIDQsIC05LCAtOSwgIDQsIDIwLCAgMCwgIDAsICAzLCAxMSwgIDcsLTE2LC0xNywtMjAsIDExLAorICAgICAgLTYsLTE0LCAgMSwgIDQsIDE5LCAgMiwgLTgsICA2LC0xNSwgIDMsICA2LCAtNSwtMTQsICAzLCAgNywgIDIgfSwKKyAgICB7ICAxLCAgNiwgLTIsIC04LCAtNSwgLTMsICAzLCAtOCwgMjEsICAxLCAgMywgMTYsLTE0LCAtMiwgLTksIC00LAorICAgICAgMTMsIC0yLCAxOCwgMTQsIDE0LCAxOSwtMTMsICA1LC0xMCwgIDIsIC0zLCAgMywgIDUsICA1LCAgMSwgLTEgfSwKKyAgICB7IC0xLCAtNSwgLTYsIC0yLC0xMSwgLTcsICA1LCAtNCwgIDUsIC0xLCAgMCwgIDMsIC0zLCAgMiwtMTksIDE4LAorICAgICAgMTYsICA0LCAxNCwtMjIsIC0yLC0xMSwtMjIsICAxLCAtMSwgMTEsICAxLCAgMiwgMTEsLTEwLCAgNywtMTIgfSwKKyAgICB7ICAxLCAgNCwgIDUsIC0xLCAtOSwgLTUsICAxLCAxMiwgIDUsICA2LCAxMiwgIDksLTI0LCAyMywgIDEsIDIwLAorICAgICAgMTQsLTExLCAxMywgIDUsIC0yLCAtMiwgIDUsICA2LCAgMiwgIDEsIC05LCAgNiwgMTAsICA1LCAtNCwgMTEgfSwKKyAgICB7IC0xLCAtMSwgIDEsICA3LCAtMywgLTQsICA4LC0xNiwgMTUsIC0xLCAtNywgIDksLTIyLC0xMSwtMTEsIDEwLAorICAgICAgMTYsICA5LCAtMiwgIDQsIDEzLCAxMCwgIDYsIDE2LCAgNCwgIDcsICAxLCAtOCwgLTcsLTE0LCAtNywgIDQgfSwKKyAgICB7ICAxLCAgMywgLTYsICAwLCAxNSwgLTksIC00LCAgMCwgIDQsICA2LCAxMiwgIDksIC02LCAtNSwtMjIsIDE3LAorICAgICAgIDcsLTExLCAxNSwgLTUsICAxLCAgMywtMTksICAwLC0xNSwgLTMsIDE2LCAgNSwgIDUsIC03LC0xMSwgMTIgfSwKKyAgICB7IC0yLCAtMSwgMTMsICAyLCAgNCwtMjQsIDM3LCAtNSwgLTIsIC02LCAxMiwgIDcsIC0yLC0yMywgLTQsICA5LAorICAgICAgIDIsIC0zLCAgMywgIDIsICAzLCAgMywtMTQsIDExLCAgMCwgLTQsIC0yLCAtMiwgIDMsIDEwLC0xMCwgIDQgfSwKKyAgICB7ICAyLCAgOSwgIDgsIC02LC0yOCwgMTQsIDI4LC0xMSwgMTgsLTExLCAgMCwgIDIsIC0yLCAgNCwtMTIsICAzLAorICAgICAgIDYsICAwLCAgNywgLTcsIC02LCAgMiwgIDUsIC0xLCAtMSwgLTEsICA1LCAgMiwgIDMsICAwLCAtMywgIDkgfSwKKyAgICB7IC03LCAxNCwgIDUsLTEwLCAtMywgIDcsICA0LCAtNSwgIDcsIC04LCAtNywgIDQsLTEyLCAxNCwtMTYsIDI1LAorICAgICAgIDMsICAwLCAgMSwgLTUsIDEyLC0xMCwgIDAsLTEwLCAgMCwgMTIsIDEyLCAxNywgMTIsIDEwLCAtMSwgIDAgfSwKKyAgICB7IC00LCAtMiwgIDUsIC0yLC0xNywgLTMsICA1LCAtNSwgIDcsLTE3LCAgMSwgIDUsIC00LCAgNCwtMjAsICAwLAorICAgICAgMTEsLTE1LCAxMywgLTgsIDEwLCAgMSwgIDEsICA1LC0xMiwgIDksIC04LCAgMCwgIDYsIC0xLC0xMSwgIDQgfSwKKyAgICB7IC0zLCAxMiwgMTMsLTE1LCAtNywgLTcsICAwLCAgNSwgMzMsICAzLCAgMywgLTYsLTEzLCAtNywtMTUsIDEwLAorICAgICAgIDMsICAzLCAgMywgLTUsICAyLCAgNywgLTEsICAwLC0xMiwgIDIsIDExLCAtNiwgLTksICAwLCAgNSwgMTEgfSwKKyAgICB7IC04LCAgNSwgMTAsIC03LC0xNCwgLTQsIDEzLCAgMCwgMTgsIC0zLCAtNiwgIDcsICAxLCAtNiwgIDAsIDIxLAorICAgICAgIDgsIC03LCAxMCwgLTgsIC0zLCAxNywgLTksICAwLCAtNSwgIDEsICA0LCAgOCwgLTMsIDExLCAtNSwgIDAgfSwKKyAgICB7IC04LCAgOCwgLTMsIC04LCAgOCwtMTEsIDE2LC0xNiwgMTcsICAwLCAgOCwgMTYsLTE3LCAxMCwtMTYsIDEwLAorICAgICAgLTgsICA2LCAxMSwgIDAsIDEwLCAgNywgIDQsICA1LCAgNywgLTUsIC01LCAtNiwgLTcsIC01LCAtMSwgMTYgfSwKKyAgICB7IC02LCAgMCwgIDYsICAxLCAtOCwgLTgsICA4LCAtNywgLTUsLTEwLC0xMSwgIDgsLTE5LCAgNiwgLTcsIDEzLAorICAgICAgIDUsIC0zLCAgNCwgLTgsICA3LCAtMSwtMTgsICA5LCAgMCwgLTUsICA2LCAyNiwgIDMsICA4LCAgMiwgIDQgfSwKKyAgICB7IC0yLCAtMiwgMjMsIC0yLC0yMCwgIDIsICA3LCAtNywgLTYsLTE1LCAgMywgIDksLTE5LCAtMiwtMTAsICA3LAorICAgICAgLTIsICA3LCAgOSwgMTEsICAwLCAgNCwgLTQsICA2LCAgOSwgLTIsICA0LCAtMywgIDQsICAzLCAgMiwgIDggfSwKKyAgICB7IC02LCAxMiwgMTAsLTEwLCAtNywgIDQsIDE3LCAxMSwgLTYsICAxLCAxMiwgMTEsLTE4LCAgOCwtMTIsICA0LAorICAgICAgIDEsIDEzLCAgNiwtMTMsIDIzLCAgOSwgLTUsICA4LCAtMiwgLTUsICAxLCAgMywgIDAsIC0yLCAtNCwgIDQgfSwKKyAgICB7ICA3LCAgMSwgIDcsLTE3LCAtOCwgIDgsIC0xLCAtNywgIDUsIC02LCAgNCwgLTMsLTE2LCAgOSwtMjQsIDE4LAorICAgICAgLTMsIDEwLCAxMywtMTEsIC02LC0xMSwgLTQsIDEwLCAgMCwgMTEsICA4LCAgMiwgIDYsIC01LC0xMSwgIDQgfSwKKyAgICB7IC00LCAgMSwgLTUsLTEwLCAgMCwgLTMsICA5LCAtMiwgIDQsIC0xLCAgMSwgIDUsLTQxLC0xMCwgLTcsICA0LAorICAgICAgLTMsICAzLCAgMSwgIDAsLTEyLCAgNCwgLTMsICAwLCAgMiwgLTEsIC0yLCAtNSwgIDMsICAyLCAtNywgIDUgfSwKKyAgICB7IC0yLCAgMSwgIDQsICA0LCAtMywgLTYsICAxLCAgMCwgMTIsIC01LCAxMSwgIDAsLTE3LCAtMywgLTEsIDExLAorICAgICAgIDQsICAxLCAyNywtMTIsICAwLC0xNCwgIDIsLTE1LCAtMywgLTksICAwLCAtNywgLTMsIDE1LCAtOCwgIDYgfSwKKyAgICB7IC02LCAgNCwgIDksICAyLCAgNCwgIDMsICA3LC0xMCwgMjgsICAxLCAtMiwgNDgsICA3LCAgMCwtMTAsIDEwLAorICAgICAgIDEsIC05LCAgMiwgLTEsICAwLCAgMywgLTUsICA1LCAtNCwgLTIsICA3LCAgNywgIDEsICAzLCAgMiwgIDUgfSwKKyAgICB7IC0zLCAgMywgLTEsICAzLCAtOSwgIDAsIC0xLCAgMywgIDIsIC02LCAzOSwtMTQsLTEyLCAgNSwtMTksIDIxLAorICAgICAgIDcsIC02LCAgNCwgLTEsIC00LCAgMCwgLTQsICAxLCAgMCwgLTksICAxLCAxMCwgIDAsIC0yLCAgMCwgIDcgfSwKKyAgICB7ICA0LCAgMiwtMjksIDEyLCAgNSwgLTMsIDE2LCAtNiwgMTUsLTEzLCAtNCwgLTEsLTEzLCAyMiwtMTYsIDE3LAorICAgICAgMTYsICA0LCAgOSwgLTQsICA0LCAtNiwgLTQsIDExLCAtOCwgIDcsICA4LCAgNCwgIDMsIC0zLCAtNywtMTMgfSwKKyAgICB7ICAwLCAgMywgIDMsIC02LCAtNCwgIDAsICA5LCAgMCwgIDUsICAwLCAxMCwgMTAsICA0LC0xMywtMTIsIDE2LAorICAgICAgMjMsIC00LC0xMiwgLTYsIC00LCAyMCwgIDIsICAwLCAtNCwgMjMsICAxLCAgOCwgMTEsIC00LCAtNSwgMTUgfSwKKyAgICB7IC02LCAgNCwtMTUsIC05LCAtMSwtMTksIDEyLC0zMCwtMTcsIC00LCAgMSwtMTMsLTEzLCAgNCwgLTMsIDI2LAorICAgICAgIDUsLTI1LCAxMSwtMTQsIC02LC0xMywgIDAsIC03LCAgOSwgIDIsICA4LCAtMSwgLTgsICAxLCAtOCwgMTMgfSwKKyAgICB7ICAxLCAgNiwgIDEsIC00LCAtNCwgIDEsICAyLCAgMCwgLTMsICAyLCAxMCwgIDYsIC02LCAtMiwtMTEsICA0LAorICAgICAgMzIsIDE1LCAxNSwtNDcsIC04LCAgMywtMTIsICA0LCAtNSwgIDQsIC0xLCAgMCwgLTUsICA1LCAgMSwgLTcgfSwKKyAgICB7ICAyLCAtMSwgIDAsICAwLCAtMSwgLTYsICAwLCAtNiwgIDQsIC00LCAgNSwgIDksIC01LCAgMSwgLTMsIDUxLAorICAgICAgIDQsIC01LCAgNCwtMTQsIC0xLCAtNCwgLTMsICAxLCAtNCwgLTEsICAwLCAgMiwgLTgsICAwLCAgMSwgIDIgfSwKKyAgICB7ICAwLCAgNCwgLTIsIC03LCAtMiwgLTksICA2LCAtOCwgMTEsIC0zLCAtNiwgIDMsLTExLCAtOCwtMTIsICA4LAorICAgICAgMTEsICA1LCAxOSwgIDMsLTI0LCAxOSwtMTQsIDExLCAtNSwtMTgsIC04LC0xMiwgLTUsIC00LCAtMSwgIDQgfSwKKyAgICB7IDE2LCAgOSwgMTAsIDE0LC0xOCwgLTIsLTE4LC0yNywgMTAsIC01LCAxMiwgMTQsICA0LCAgMCwgLTIsIC02LAorICAgICAtMTIsIC03LCAtMSwgIDMsICA0LCAgNywgMTEsIDEwLCAgNSwgLTUsIC03LC0xNiwgLTMsIC02LCAgNiwgIDkgfSwKKyAgICB7ICA3LCAxNSwgLTksIDEwLC0xOSwgIDQsIC01LC0zNywgLTIsIC00LCAgOCwgIDIsICA0LCAtMSwgIDEsICA5LAorICAgICAgLTUsIC01LC0xMiwgIDEsIC0xLCAtOCwgIDMsIC0zLCAgNCwgIDYsICA5LCAgMywgIDMsIC0xLCAgMiwgIDQgfSwKKyAgICB7IDEzLCAxNywgIDMsICA5LCAtNywgLTcsLTE1LC0xNywgLTgsLTEzLCAtNCwgLTgsIDE5LCAgMiwgMTYsIDI1LAorICAgICAgIDcsIDE1LCAgMiwgMTYsIC01LCAtNiwtMTAsIC05LCAtNywgLTYsIC0yLCAtNywgIDcsICAyLCAgNCwgIDUgfSwKKyAgICB7IDI0LCAgNywgIDksICA4LC0xMywgLTIsICAwLCAtNCwgIDEsLTEzLCAgMywgIDYsICA3LCAxMCwgLTQsIDE1LAorICAgICAgIDUsICA3LCAtNCwgIDUsIC01LCAgMywgMTMsIC03LCAgNSwgMTUsLTExLCAtMiwgIDcsICA1LCAgOCwgIDYgfSwKKyAgICB7IDE3LCAgNiwtMTUsIDIzLCAtMiwgLTEsIC02LCAtMiwgIDAsIC00LCAxMSwgLTMsIDEyLCAxNSwgIDYsIC04LAorICAgICAtMTUsIDEwLCAtOSwgIDcsIC0xLC0xMSwgIDIsIC04LCAtNCwgIDMsICA0LC0xMCwgIDQsICA0LCAxMSwgIDEgfSwKKyAgICB7IDIxLCAxMiwgLTMsICA2LCAtOCwgIDgsLTExLCAtOCwgLTUsIC01LCAgMywgIDcsIC0xLCAtNSwgMTIsIDE1LAorICAgICAtMTAsLTExLCAgMywgMTUsICA4LCAgNCwgIDIsLTE1LCAgMCwgMTQsICAxLCAtOCwgLTEsICAzLCAxMCwgLTcgfSwKKyAgICB7IDE2LCAxMiwgIDUsIDEzLCAtNiwgMTUsLTIzLCAgMCwtMTcsIC05LCAgMCwgIDQsIC05LCAxMywgIDYsIDE4LAorICAgICAgIDAsICAwLCAtNCwgLTEsICAwLCAxNCwgIDUsIC0xLCAgOCwgLTQsIC04LCAtNiwgIDUsIC0yLCAtMiwgIDAgfSwKKyAgICB7IDE0LCAxNiwgLTEsIDEyLC0xNSwgLTksIC02LC0yMCwgIDQsICA2LCAgOCwgIDksICAzLCAgMSwgLTksIC00LAorICAgICAgLTEsLTExLCAgOSwgMTEsLTEyLCAgMSwtMTQsIC03LCAgMiwgLTgsIDExLCAgOSwgLTQsIDEwLCAgNCwtMTYgfSwKKyAgICB7IDEzLCAxMCwgIDMsICA3LCAgMCwgLTgsLTMzLCAtNiwgIDQsIC00LCAxOSwgLTIsIDE0LCAgNiwgIDUsICA3LAorICAgICAgIDYsIC0zLCAtMSwtMTAsLTEwLCAtOSwgIDQsIC0zLCAgNSwgIDksICAyLCAgMiwgMTAsICA5LCAtMiwgLTMgfSwKKyAgICB7IDExLCAxMCwgMjUsIDE4LCAtMSwgLTYsLTIxLC0yMSwtMTEsLTE2LCAgNiwgIDUsIDE0LCAgNCwgIDgsICA3LAorICAgICAgIDAsLTEwLCAtNywgLTksIC01LCAtNCwgIDMsIC0xLCAgMSwgIDYsIC0xLCAgNiwgLTIsICAyLCAtMywgLTkgfSwKKyAgICB7IDE1LCAgOSwgIDUsIDIyLC0xNywgMTUsIC05LCAgNywgIDcsIC05LCAxMywgIDksIDEwLCAtMSwgIDgsIC0zLAorICAgICAgLTIsICA2LCAgMSwgMTcsICA4LC0xNCwgIDcsIC0zLCAxMiwgIDksICAxLCAgMCwgIDEsIC01LCAxNywtMTggfSwKKyAgICB7IDI1LCAxOSwtMTcsIDEyLCAtNCwtMTAsICAxLC0xMywtMTksIC03LCAtMywgIDksICA2LCAtMiwgIDMsICAxLAorICAgICAgIDQsIC0yLC0xMSwtMTQsIC0xLCAtNywgLTUsIC05LCAgNywgLTEsIC0zLCAgNCwgLTUsICAxLCAgMCwgLTEgfSwKKyAgICB7IDIwLCAgOCwgLTMsLTEwLC0yNCwgIDMsIC02LCAtMiwgIDAsLTEyLCAxNCwgIDYsICA3LCAxMSwgIDQsICA3LAorICAgICAtMTIsIC01LCAtOCwtMTAsICA1LCAtMSwgLTQsICA0LCAxNiwgIDcsLTE0LCAgNiwgLTEsIC0yLCAtNywtMTEgfSwKKyAgICB7IDE2LCAxOCwgMTcsICAxLC0xNSwgLTYsIC01LCAtMywgLTEsLTE5LCAgOCwgLTIsICAyLCAgOCwgMTIsLTE5LAorICAgICAtMTIsICA4LCAgMCwgLTMsIC0xLCAtMSwgIDQsLTE0LCAgOSwgLTEsLTEyLCAtMSwgLTcsIDEwLCAtMywgIDUgfSwKKyAgICB7IDE4LCAxMiwgLTcsICA3LCAgMCwgLTMsLTEzLCAgMCwgLTEsIC00LCAgOSwgLTIsICA2LCAtMSwgIDAsICAxLAorICAgICAgMTUsLTIxLCAgMSwgLTgsIDI1LC0xOSwgMTMsIC05LCAgMiwgMTIsICA1LCAtNywgLTMsIC0xLCAtMywgIDEgfSwKKyAgICB7IDEzLCAxNiwgLTQsICA5LCAtMiwgIDIsIC0xLC0xOSwgLTcsIC00LCAxOCwgLTYsIDE0LCAxOCwgLTUsICA0LAorICAgICAgLTYsIC0zLC0xOSwtMTQsIC0xLC0xMiwgMTAsICA2LCAgNywgMTcsLTEyLC0xMywtMTAsIC00LCAgNSwgIDQgfSwKKyAgICB7IDI3LCAxNywgIDQsIDE0LCAtOSwgLTIsIC00LCAtOCwgIDAsIC02LCAxNCwtMTEsIC03LCAgMiwgLTMsIC0zLAorICAgICAgLTIsIC0zLC0xMywgMTIsIDE2LCAgMSwgLTUsIC05LC0xMCwtMTEsIC0yLCAgMywgLTcsICA1LCAxMSwgLTcgfSwKKyAgICB7ICA3LCAxNywtMTYsIC0yLC0xNCwtMjgsIC03LCAtOCwgMTUsLTEwLCAgNywgMTUsICA4LCAxNywgMTMsIC0xLAorICAgICAgIDQsIC03LC0xMiwtMTEsICAwLCAgMCwgIDIsICAzLCAtMywgIDcsIC02LCAgNiwgIDEsLTE2LCAgMSwgLTIgfSwKKyAgICB7IDIzLCAxMSwgLTksIDE1LC0yMywgLTQsIC02LCAtNCwgIDIsIC05LCAtNywgIDksIC04LCAgMywtMTMsIC00LAorICAgICAgIDgsIDE4LCAtNiwgLTIsICAxLCAtNSwgIDYsLTE0LCAtNSwgLTIsIC02LCAtNSwgLTMsIC0yLCAgNCwgLTUgfSwKKyAgICB7IDEyLCAxMywgMTgsIDE4LC0zNSwgIDIsICA3LC0xNywgIDMsLTExLCAgNiwgIDksIC0zLCAtMiwgMTAsIC00LAorICAgICAgIDMsICAzLCAtMiwgLTcsICAwLCAgMiwgLTQsICAwLCAtNCwgIDAsIC02LCAgNSwgMTAsICA0LCAtMywgLTEgfSwKKyAgICB7IDE5LCAxMSwgIDEsIDIwLC0xNCwgIDQsIC05LC0xMywgLTIsIDExLCAgMCwgMTcsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgLTUsIC04LCAgMCwgIDUsIC0xLCAtOCwgIDUsIC0xLCAgMywgIDIsLTEyLCAyMSwgLTIsLTI0LCAgNSwgIDcgfSwKKyAgICB7IDE1LCAxNSwtMTUsIDE3LC0xNCwtMjIsICAzLCAtNCwtMTEsIC0zLCAtNywgIDEsIDE4LCAxMCwgIDEsIDEwLAorICAgICAgLTYsIC0zLCAgOCwgIDIsIC03LCAgMCwgLTIsICAxLCAgMSwgIDIsIC05LCAtMiwgIDEsICAyLCAtMywgIDQgfSwKKyAgICB7IDQ1LCAxMywgIDgsIDE3LCAtNSwgIDIsLTE2LCAgMiwgIDgsIC0yLCAgOCwtMTUsICA0LCAgNSwgLTEsICA3LAorICAgICAgLTYsIC0yLCAtNiwgIDIsIC0zLCAgMCwgIDAsIC05LCAtMSwgIDcsICAyLCAgMywgLTMsIC0zLCAtMSwgIDUgfSwKKyAgICB7ICAxLCAxOCwgLTgsIDE4LC0xMiwtMTAsICAzLCAgNCwtMjIsLTEyLCAyMCwgIDgsIC0zLCAgOSwgIDIsIDEwLAorICAgICAtMTAsIC0zLCAgOSwgIDMsICA2LCAtMywgMTAsIC0xLCAtMywgIDIsIC0yLCAgNCwgIDIsICAzLCAtMywtMTggfSwKKyAgICB7ICA5LCAxMCwgLTUsICA5LC0zNSwtMjEsLTE4LC0xNiwgLTEsLTEyLCAtNiwgLTcsLTE1LC0xOSwgMTIsICA0LAorICAgICAgIDQsICA5LCAtNywgIDIsIDE0LCAgMSwgIDQsICAwLCAtMSwgIDYsIC03LCAgMiwgIDEsICAxLCAtNCwgIDQgfSwKKyAgICB7IDMxLCAgOCwtMTcsIDM1LCAtOCwgIDEsIC01LCAtNiwgLTcsIC02LCAxMCwgLTIsIC0zLCAgNiwgIDksICAzLAorICAgICAgLTYsIC0yLCAgMywgIDMsICA1LCAtMywgIDAsICA2LCAgMCwgIDEsIC01LCAtMywgLTIsIC00LCAtMSwgIDAgfSwKKyAgICB7IDE4LCAgNCwgLTgsICA3LCAtOCwtMTUsIC0xLC0xNiwgMTIsIDE4LCAgMywgMTksICAyLCAgNCwgIDgsICA4LAorICAgICAgIDAsIC01LCAtOCwtMTIsIDEwLCAtNSwgIDAsICAxLCAgMCwgIDQsIC0zLCAxNiwgMTEsIDExLCAtMiwgLTYgfSwKKyAgICB7IDI3LCAxNSwtMTcsLTEwLC0yMywtMjIsIC0xLC0xNCwgLTQsIC03LCAyMCwgLTIsIC03LCAgNiwgMTUsIC01LAorICAgICAgMzIsICA0LCAgOSwtMTEsIC0zLCAtOCwgMTEsIC00LCAtMSwgLTQsIC04LCAtNiwgLTQsIC01LCAtMiwgLTcgfSwKKyAgICB7IDIyLCAgNCwgLTcsICAyLC0xNSwtMTEsLTE3LC0xMCwgIDIsICAwLCAxNSwgMTEsICA3LCAxMiwgLTgsICA2LAorICAgICAtMTAsLTE4LCAtNiwtMTIsICA3LCAgMywgMjIsICAzLCAtNywgMTQsIC01LCAtMiwtMTMsIC03LCAtMSwgLTcgfSwKKyAgICB7IDE4LCAxMywgIDksIDI0LCAtNCwtMTksIC05LC0xMSwgMTMsICA4LCAgMiwgIDQsIC0xLCAgOCwgMTQsIDEwLAorICAgICAtMTIsICAwLCAgMCwgIDUsIDEwLCAgNSwgIDQsIC0xLCAgNSwgIDEsIC0xLCAxMSwgIDIsIC00LCAgMCwgLTkgfSwKKyAgICB7IDE1LCAxOSwgLTUsICAxLCAtNCwtMTAsIC04LC0yNywgIDYsICA4LCAgNSwgMTAsICA0LCAxMSwgIDUsIC01LAorICAgICAtMTEsICAwLC0xMSwtMTQsIC00LCAtOSwgLTgsIC04LCAgNiwgLTksICA0LCAtNSwgLTEsICAxLCAgNSwgLTQgfSwKKyAgICB7IDE4LCAgMSwtMTMsIDE0LC0xNCwgIDksLTE1LCAtNywgMTIsICAxLCAxMywgLTQsLTIwLCAxMiwgMTAsIDEyLAorICAgICAtMTIsICA3LCAgMSwtMTMsIDEwLCAtNiwgIDUsIC0zLCAgNCwgIDgsIDEwLC0xMywgLTMsIC02LCAgOSwgLTMgfSwKKyAgICB7IDE5LC0xNCwgIDUsIC04LCAtNiwgIDIsIC01LCAgNSwgLTMsIC0xLC0yOCwgMTEsIDE4LCAtNiwgLTQsIC0yLAorICAgICAgMTEsIDE0LC00MywtNDIsICA5LCAgMiwgMjAsLTIzLCAgNiwgMzIsICAwLCAgNSwgIDAsICA2LCAgOSwgIDUgfSwKKyAgICB7ICA4LCAxMSwtMTQsIC0xLCAgNywgMTIsIC03LCAgMiwtMTYsICAyLCAxMCwgLTMsIC0xLCAtNywgLTcsIC0xLAorICAgICAgIDEsLTEwLC02MCwtMjMsLTE4LCA0MiwtMTMsICA5LCAxOCwtMTEsICAwLCAgMSwgIDAsICAyLCAtNSwgIDEgfSwKKyAgICB7IC01LCAtMSwgIDIsICAwLCAgMywgLTMsICAzLCAtMiwgLTYsICAwLCAtMywgLTMsICA3LCAgMiwgIDAsIC0yLAorICAgICAgLTIsICAzLC0zNCwtMTUsIDM3LCA0NywgMTAsIDIwLCAgOSwgIDEsICAzLC0yMSwtMjUsLTMzLC0xNCwgIDggfSwKKyAgICB7ICA1LCAgNiwgIDIsIC0yLCAtMiwgLTIsICA2LCAgNSwgLTUsICA3LCAtMywgIDEsIC01LC0xMywgIDksICAzLAorICAgICAtMTcsLTE5LCAtMiwtNzksLTEyLCAtNywgLTgsIC02LCAtMiwgLTIsIC0xLCAtMSwgLTcsLTEzLCAgNiwgLTEgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsIC0xLAorICAgICAgIDAsICAzLCAgNCwtODcsICA2LC0xMSwgMTYsIC05LCAtMSwgIDgsICAwLCAgNSwgIDAsICAxLCAgMiwgIDEgfSwKKyAgICB7IC01LCAgNiwgIDIsLTI0LCAgNSwgLTksIC03LCAgMCwgIDcsICAzLCAtMywgMTYsLTE0LC0xNiwgIDAsIDE4LAorICAgICAgMTUsIC05LC0xNCwtMjgsLTE3LCA1MywgMTQsIC02LC0yOCwgLTEsIC0zLC0xMCwgLTcsLTE0LCAxOSwtMTUgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTMsICAwLAorICAgICAtMTMsICAwLC01MywgIDMsLTIyLCA2MywgMTksIDE2LCAgMSwtMTEsICAwLCAtMywgIDAsIC0zLCAgMCwgIDEgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLAorICAgICAgLTEsIC02LC00MywtNDMsIC0yLCA2NSwtMTMsIC00LCAgOSwgIDEsICAxLCAgMiwgIDEsICAwLCAgMCwgIDEgfSwKKyAgICB7ICAwLCAgMSwgIDAsICAwLCAtMSwgIDAsICAxLCAgMSwgIDAsICAwLCAgMSwgIDIsIC0xLCAtMSwgLTMsIC0xLAorICAgICAtMjMsICAxLC02MSwtNTUsICAzLC0yOCwgLTYsIC00LCAtNCwgIDgsICAyLCAgMSwgIDEsIC0xLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMSwgLTEsICAxLCAtMSwgIDAsIC0xLCAgMCwgIDEsIC0xLCAgMCwgIDEsIC0xLCAgMCwgLTksIC00LAorICAgICAtNDgsLTE5LC01MiwtNDYsIDExLC0xMiwgIDUsLTE0LCAgMCwtMTAsICAwLCAgMCwgLTEsIC0yLCAtMSwgIDAgfSwKKyAgICB7ICAwLCAtMywgLTEsIC00LCAgMiwgLTEsIC03LCAgMywgIDEsICAzLCAtMSwgIDEsIC0zLCAgMCwgLTcsICAwLAorICAgICAgIDMsIC03LC02MSwtNTEsIC00LC0yMSwtMTYsLTIxLC0xMSwgMTQsIC03LCAgOCwgIDMsIC01LCAgMSwgIDIgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAtMSwgIDksIC0zLAorICAgICAgNTYsLTExLCAtNiwtNjcsIC0xLCAxMywgIDAsICA3LCAgMSwgLTksIC0xLCAtMSwgIDAsICAwLCAgMSwgIDAgfSwKKyAgICB7IDE0LCAgOSwgLTIsIDE0LC0xMCwtMTAsICA5LCAtNSwgIDEsIC04LC0yMywgMzAsICA4LCAtNywgMjMsICA4LAorICAgICAgIDIsIDEwLCAtMSwtMjcsLTE3LCA1NywgMjIsICA0LCAtNSwgIDIsLTEyLCAtNiwgIDIsIC03LCAtNCwgLTkgfSwKKyAgICB7ICAxLCAgNSwgMTIsIC0yLCAtMiwgLTMsICAyLCAtMywgIDYsICAwLCAgNCwgLTIsIC04LCAtNiwgIDAsIDE2LAorICAgICAtMTUsIDI5LC01NSwtMjksLTI0LCAyOSwgIDMsIDEwLCAgNiwgMTMsIDEwLCAtNSwgMjEsIDExLC0xNCwgIDUgfSwKKyAgICB7ICA0LCAgMiwgMjYsIC02LCAxMCwgMTEsLTIzLC0xMCwtMjcsLTIwLCAgMywtMjQsLTExLC0xMCwtMTMsIDI1LAorICAgICAtMTAsICA1LCAtOSwtMzYsIC03LCA0MywgIDMsLTEzLCAgNiwgMTMsIC0yLCAgMCwgIDEsICAzLCAtMywgLTQgfSwKKyAgICB7IC0xLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAtMSwgIDEsICAwLCAtMSwgIDAsICAwLCAgMCwgLTEsICAxLAorICAgICAtMTIsIDEyLC0yNiwtNjQsLTE1LCAyOSwgMzcsIC03LCAtMywtMTIsIC01LCAxNCwgIDgsIC04LC0xMCwgLTIgfSwKKyAgICB7IDE5LCAtNCwtMTEsLTE2LCAgOCwgMTQsICA1LCAxOSwgIDMsIDIyLC0xMSwtMjEsIC0xLCAtNiwtMTEsIDExLAorICAgICAgMTAsLTI0LC0yMywtNDAsIC04LCAyMCwgMTcsICA1LCAxMywgLTYsICAzLCAxNCwtMjAsIC04LCAgMywgMjggfSwKKyAgICB7ICAyLC0xMiwgMTAsLTE0LC0xOCwgMjYsLTIyLCAgNCwgLTIsICA1LC0yMSwgIDgsICAzLCAgMSwgMTksICAwLAorICAgICAtMTIsIDI0LC0xNCwtNDAsIDE1LCAyOSwtMTUsICA2LCAxNSwgIDEsLTE5LCAgMiwgIDQsICA3LC0xMiwgLTMgfSwKKyAgICB7ICAwLCAxNywgMTMsICA3LCAtNSwtMTEsICAyLC0xOSwgIDMsIDM4LC0yMSwgLTMsIC02LCAtNCwgIDcsICAxLAorICAgICAgIDEsIC01LC00MCwtMTAsIC0yLCAzNSwgIDgsICA4LC0xMCwgLTgsIC05LCAzMywgIDQsICA0LCAgMCwgLTIgfSwKKyAgICB7IC0yLC0xMiwgIDcsIDI5LC0yNCwgIDIsIDE2LCAtMSwgLTcsIDE2LCAxMCwgLTIsIC0yLCAtMiwgMTMsIC0yLAorICAgICAtMzcsIDE1LC0yMiwtNDAsLTExLCAzMywgMTAsIC0xLCAgOCwgMTAsICA2LCAgOCwgIDksICAwLC0xMiwgIDIgfSwKKyAgICB7IDE1LCAtOCwgLTksIC0yLCAgNywtMTcsICA3LCAxOSwgMTQsICA0LCAxMiwgMjcsIDExLCAxMCwgIDQsIDExLAorICAgICAtMTUsIDE0LC0xMywtNDgsICA1LCAxOCwgIDAsIC05LC0zNiwtMTEsICAyLCAgNCwgIDUsICA1LC0xNSwtMTIgfSwKKyAgICB7LTEyLCAgMCwgIDMsICA0LCAgNywgLTUsICA1LC0xNCwtMjQsLTE4LCAtNiwtMTUsIC04LC0yMCwgIDEsIC03LAorICAgICAtMzMsLTI4LC00MCwtMzgsLTE4LC0xMCwgLTUsIDE3LC0xMiwgIDQsICAzLCAtNSwgIDUsLTEzLCAgNCwgLTcgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLAorICAgICAgLTMsIC05LC00OSwtNjAsIC01LCA0NSwgLTEsICA2LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLAorICAgICAgLTMsIC05LC00OSwtNjAsIC01LCA0NSwgLTEsICA2LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLAorICAgICAgIDMsIC0yLCAgOSwtMjksLTExLCA1NSwgIDgsIDMyLC0zNiwtMTMsIC03LCAzNywgIDQsIDExLCAgMCwgIDMgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgIDQsIC0xLC0zOSwgLTQsLTMwLCA2MywgMjgsLTE3LCAtNiwgMTAsICA3LC0xNCwgLTksIDExLCAgOSwgIDcgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLAorICAgICAgMTMsIC0yLC01MCwtMzIsIDIyLCA1MSwgIDQsICA3LCAgNiwgMTEsLTIwLC0xMywgIDksIC01LCAyMSwgLTQgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLAorICAgICAgLTMsIC05LC00OSwtNjAsIC01LCA0NSwgLTEsICA2LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLAorICAgICAgLTMsIC05LC00OSwtNjAsIC01LCA0NSwgLTEsICA2LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLAorICAgICAgIDMsIC0yLCAgOSwtMjksLTExLCA1NSwgIDgsIDMyLC0zNiwtMTMsIC03LCAzNywgIDQsIDExLCAgMCwgIDMgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgIDQsIC0xLC0zOSwgLTQsLTMwLCA2MywgMjgsLTE3LCAtNiwgMTAsICA3LC0xNCwgLTksIDExLCAgOSwgIDcgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLAorICAgICAgMTMsIC0yLC01MCwtMzIsIDIyLCA1MSwgIDQsICA3LCAgNiwgMTEsLTIwLC0xMywgIDksIC01LCAyMSwgLTQgfSwKKyAgICB7IC04LCAgMiwgIDEsIDIyLC0zMSwgLTYsLTI1LCAtMywgLTMsICAxLC0xNSwtMTEsIC0yLCAtMywgIDQsLTEzLAorICAgICAgLTksIDE1LC0xOCwgMzcsIC03LC0zNywgMTIsLTEzLC0xMSwtMjUsLTEwLC0xMSwtMjIsICA3LCAxNiwgIDcgfSwKKyAgICB7IDE0LCAxMCwgIDQsLTEwLCAtMSwgLTUsIC03LCAtMywgMTYsIDEzLCAtNSwtMTUsICA1LCAxMSwgLTEsICA4LAorICAgICAtMjcsICA3LC0xMiwgNDksIDE3LC0yMiwgIDksIC0yLCAtOSwgLTEsICAyLC0xNSwgLTEsIDQxLC0xOCwtMTcgfSwKKyAgICB7IC00LCAtOSwtMTUsIC0zLCAgMywgIDQsICA0LCAgMiwgIDcsIC0zLCAtNywgLTgsIC01LCAxNywtMTksIC03LAorICAgICAgMzYsIC05LC0zOCwgMTcsICAxLC00OCwgMTEsLTE4LC0xMywgLTIsIC04LCAgNCwtMTAsIC01LCAyMSwgMTEgfSwKKyAgICB7IDE1LC0xMywgIDQsICAyLCAgMSwgLTUsIC0yLCAgMSwtMTAsICA3LCAtMSwgIDMsIC02LCAgMCwgMTEsLTExLAorICAgICAgIDgsIDIwLC0xNywgNTEsLTE3LC00MSwgIDIsIDE1LCAgNCwgIDgsIC0yLCAxNiwtMzIsIC0xLCAxNywgIDYgfSwKKyAgICB7IC04LCAgOCwtMTgsIC01LCAgNCwgIDYsIC0zLCAgOCwgIDAsIC00LCAgMiwgIDAsIC0xLCAtNCwgIDUsICA4LAorICAgICAgMzAsIDMwLCAtOCwgNzAsICAyLCAgOCwgIDIsICAwLCAgNywgIDEsIDEzLCAtMSwgLTYsIC03LC0xMSwgIDIgfSwKKyAgICB7IC04LCAtNywgIDksLTEwLC0xMywgIDYsLTExLC0xNCwgMTMsIDI1LC0yNiwgIDUsICAyLCAtNSwgLTUsICA1LAorICAgICAgLTgsICA0LCAgMCwgMzMsIDEyLC0zOCwgLTQsICA2LCAxMywgIDYsIDI1LCAzNCwgLTEsIDI1LC0xOSwgLTUgfSwKKyAgICB7IDE4LCAgMywtMTcsICA0LCAtOCwgIDcsIDIwLCAgMSwgLTEsICA1LCAtNSwgLTIsIC04LCAgOCwtMzUsIDE1LAorICAgICAgMjQsIDQzLCAtNSwgNTEsICA1LC0xMiwgLTMsICAxLCAtMiwgIDMsIC0zLCAtMywgLTksICA4LCAtOSwgIDIgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLAorICAgICAgIDIsIDEwLCAyNCwgNzYsIC0yLC0yMiwgMTEsIC0xLCAgNCwgMzMsICA0LCAgMSwgLTEsICAxLCAgMiwgIDAgfSwKKyAgICB7ICAwLCAtMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDIsICAwLAorICAgICAgMjQsIDEzLCAzMiwgNzAsIDI2LCAgNSwtMjEsIC05LCAtNiwtMTUsICAyLCAtMiwgIDIsICA0LCAgMSwgIDEgfSwKKyAgICB7ICA1LCAtNCwtMTEsICA0LCAtNCwgMjIsIDEwLCAtMiwgMTMsLTExLCAtNCwtMjEsLTE3LCAgMCwgLTcsICA0LAorICAgICAgMTAsLTM0LCAxMSwgNTIsICAyLC00NiwgLTUsICAwLCAgMCwgLTEsICAyLCAgNCwgLTksICAxLCAgMSwgLTcgfSwKKyAgICB7ICAwLCAgMSwgIDEsICAwLCAtMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgLTMsICAxLAorICAgICAgLTgsICA5LCAtMSwgNjQsLTEzLC02MSwgLTMsICAzLCAtNSwgMTAsICAxLCAgMywgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7ICAwLCAgMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAxLCAgMSwgIDIsICAxLAorICAgICAgMTAsIC0yLC0zMSwgNzksLTEwLCAyNywgIDAsIC0xLCAgMywgIDgsICAxLCAgMSwgIDAsIC0xLCAgMCwgLTEgfSwKKyAgICB7ICAzLCAxMiwgMTAsIDI2LC0xOSwgMTAsIC05LCAgNiwgLTQsLTE1LCAxMCwgIDMsLTE2LCAgNiwgMTEsLTE5LAorICAgICAgIDMsIDEwLCAxOCwgNDQsICA1LC0zMCwgIDUsIC05LCAyMSwgIDQsIDIwLCAxMCwgMTQsLTI1LCAgOCwtMTcgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAxLCAtMSwgIDAsIC0xLCAgMCwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgLTYsIC0yLAorICAgICAgIDgsIC04LCAxMywgNjksIDI2LC0xOSwtMjUsLTE3LCAxNiwgIDYsLTEyLCAyMiwgIDIsIC02LCAgOSwgIDUgfSwKKyAgICB7ICAwLCAtMSwgIDAsICAxLCAgMCwgLTEsIC0xLCAgMCwgIDAsICAxLCAtMiwgIDEsICAwLCAgMCwgLTQsIC0xLAorICAgICAtMzQsLTE1LC0zMywgNTYsICA5LC00MiwgIDksIDEwLCAgNiwgIDksIC04LC0xMSwgIDAsIC02LCAxNSwgIDUgfSwKKyAgICB7IDEwLCAgMiwtMTQsIC0zLC0xNSwtMzUsIC0xLCAgNywtMTgsIDE0LCAgOCwgLTEsLTE1LC0yNiwgIDYsLTE1LAorICAgICAtMTgsIDIyLCAgOSwgMzMsICAwLC0zMiwgLTksICAzLC0xMSwgIDcsICA0LCAtMSwgIDUsIDMwLCAgOSwgIDEgfSwKKyAgICB7ICA0LCAxNSwgIDAsICA2LCAtNSwtMTEsICA5LCAgNiwgIDYsICA2LCAxNCwgIDIsIC0xLCAxMCwtMjQsLTI1LAorICAgICAgLTIsIC00LCAtMSwgMzcsICAyLC0yOSwgMTQsIC05LCAyMiwgMTcsIC0yLCAzMywgMTAsLTI1LCAxMSwtMTEgfSwKKyAgICB7ICAwLCAgNSwgIDIsIDE4LC0xMiwgMjEsIDIyLCAzMywgLTcsIDIxLCAtOSwgLTcsICA3LC0xNSwgLTcsIDE2LAorICAgICAgIDcsICAwLC0xNCwgNDQsIDEwLC0yNSwgIDUsIC00LCAxNSwgLTgsIDEwLCAtNCwgIDUsICA5LCAtMSwgMTYgfSwKKyAgICB7ICAzLCAxMywgMTIsIDEyLCAgOCwgMjUsLTIzLCAgOCwtMjIsIC0zLC0xOCwgLTgsIDE1LCAxMiwgIDksIDE5LAorICAgICAgIDAsICAwLCAtOSwgNDksLTI3LC0xNSwgLTksLTE1LCAxMiwgLTgsLTE2LCAtNywgMTMsICA1LCAxMywgIDIgfSwKKyAgICB7IDEyLCAtNiwgIDcsIC0yLCAyMCwgLTksLTE0LCAxMiwgMTMsIC01LC0xNywgMjIsIC04LCAtNCwgIDIsICA3LAorICAgICAtMTMsIC0yLC0xNSwgNDMsIC01LC0zMCwgMjcsICA0LCAxMCwtMjcsICA1LCAyNywtMTAsLTEwLC0xOCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLAorICAgICAgLTEsIDEwLC0xOCwgNzAsIC0yLC01MiwgLTEsIC03LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLAorICAgICAgLTEsIDEwLC0xOCwgNzAsIC0yLC01MiwgLTEsIC03LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7IDE1LC0xMywtMjAsIDE2LCAgMiwgMTMsICA1LC0xMSwgLTgsIC01LCAtMywgIDIsIDI0LC0yMywgMzAsIC03LAorICAgICAgMTEsIDMwLC0xNSwgNDMsICA1LC0xNSwgMTUsIC0zLC0xNCwgIDEsLTIzLCAgOCwgIDMsICA5LCAgNCwtMTEgfSwKKyAgICB7ICAwLCAtMSwgIDAsICAxLCAgMCwgLTEsIC0xLCAgMCwgIDAsICAxLCAtMiwgIDEsICAwLCAgMCwgLTQsIC0xLAorICAgICAtMzQsLTE1LC0zMywgNTYsICA5LC00MiwgIDksIDEwLCAgNiwgIDksIC04LC0xMSwgIDAsIC02LCAxNSwgIDUgfSwKKyAgICB7IDEwLCAgMiwtMTQsIC0zLC0xNSwtMzUsIC0xLCAgNywtMTgsIDE0LCAgOCwgLTEsLTE1LC0yNiwgIDYsLTE1LAorICAgICAtMTgsIDIyLCAgOSwgMzMsICAwLC0zMiwgLTksICAzLC0xMSwgIDcsICA0LCAtMSwgIDUsIDMwLCAgOSwgIDEgfSwKKyAgICB7ICA0LCAxNSwgIDAsICA2LCAtNSwtMTEsICA5LCAgNiwgIDYsICA2LCAxNCwgIDIsIC0xLCAxMCwtMjQsLTI1LAorICAgICAgLTIsIC00LCAtMSwgMzcsICAyLC0yOSwgMTQsIC05LCAyMiwgMTcsIC0yLCAzMywgMTAsLTI1LCAxMSwtMTEgfSwKKyAgICB7ICAwLCAgNSwgIDIsIDE4LC0xMiwgMjEsIDIyLCAzMywgLTcsIDIxLCAtOSwgLTcsICA3LC0xNSwgLTcsIDE2LAorICAgICAgIDcsICAwLC0xNCwgNDQsIDEwLC0yNSwgIDUsIC00LCAxNSwgLTgsIDEwLCAtNCwgIDUsICA5LCAtMSwgMTYgfSwKKyAgICB7ICAzLCAxMywgMTIsIDEyLCAgOCwgMjUsLTIzLCAgOCwtMjIsIC0zLC0xOCwgLTgsIDE1LCAxMiwgIDksIDE5LAorICAgICAgIDAsICAwLCAtOSwgNDksLTI3LC0xNSwgLTksLTE1LCAxMiwgLTgsLTE2LCAtNywgMTMsICA1LCAxMywgIDIgfSwKKyAgICB7IDEyLCAtNiwgIDcsIC0yLCAyMCwgLTksLTE0LCAxMiwgMTMsIC01LC0xNywgMjIsIC04LCAtNCwgIDIsICA3LAorICAgICAtMTMsIC0yLC0xNSwgNDMsIC01LC0zMCwgMjcsICA0LCAxMCwtMjcsICA1LCAyNywtMTAsLTEwLC0xOCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLAorICAgICAgLTEsIDEwLC0xOCwgNzAsIC0yLC01MiwgLTEsIC03LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLAorICAgICAgLTEsIDEwLC0xOCwgNzAsIC0yLC01MiwgLTEsIC03LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7IDE1LC0xMywtMjAsIDE2LCAgMiwgMTMsICA1LC0xMSwgLTgsIC01LCAtMywgIDIsIDI0LC0yMywgMzAsIC03LAorICAgICAgMTEsIDMwLC0xNSwgNDMsICA1LC0xNSwgMTUsIC0zLC0xNCwgIDEsLTIzLCAgOCwgIDMsICA5LCAgNCwtMTEgfSwKKyAgICB7IDE2LC0xOCwgIDcsIC00LCAzMSwtMTUsIC05LC0xMywgMjAsLTEyLCAtNiwgIDAsIDEyLCAtNiwgLTIsICA0LAorICAgICAgIDMsIC0zLCAtMSwgIDAsICAxLCAgMywgIDMsIC0yLCAgMSwgIDYsICA0LCAgMCwgLTMsICAyLCAtNSwgIDEgfSwKKyAgICB7IDM4LCAtNSwtMTMsIC00LCAgOCwtMTUsIDExLCAgMSwgIDIsIC00LCAtMSwgIDksIDEzLCAgNCwtMTIsIC03LAorICAgICAgIDAsIC0yLCAgNywgIDIsIC02LCAtMiwgLTMsIC0yLCAgMywgLTQsICA2LCAxNSwgIDEsICAxLC0xMSwgLTIgfSwKKyAgICB7IDQ3LC0yMiwgIDksLTI2LCAgMywgLTUsICAyLCAtNywgIDQsIC0yLCAgMiwgLTIsICAzLCAgMCwgIDMsIC00LAorICAgICAgIDMsIC0zLCAgMiwgLTMsICA3LCAtMywgLTEsICAxLCAgMSwgLTUsICA1LCAgMCwgIDIsIC01LCAtMywgLTIgfSwKKyAgICB7IDE0LC0xNiwgIDIsIC02LCAgNywgLTIsIC03LCAtNCwgLTQsIC03LCAxNCwgLTMsICA3LC0xOSwtMTQsLTE3LAorICAgICAtMjksICA2LCAyNiwgMTYsIC01LCAxMywgLTQsIC0xLCAyMSwgMTQsICAxLCAgMywgLTYsICAwLCAtNywgLTEgfSwKKyAgICB7IDI5LC0xMSwgIDUsIC0zLCAgNCwgMTEsICA0LC0xMCwgIDEsLTIyLCAtMywtMTAsICA1LCAgNCwgIDIsICA4LAorICAgICAgLTIsIC03LC0xMiwtMTIsIC04LCAtMywtMTgsIC0yLCAtOSwgLTUsIC0xLCAtMywgIDIsLTE0LC0xNCwgIDcgfSwKKyAgICB7IDI4LC0xMiwgIDUsICAzLCAgOSwgLTcsICAwLCAtMiwgIDIsICAxLCAgNCwgIDAsIC03LCAtMywgLTIsICA0LAorICAgICAgIDQsIDE0LCAgOCwgLTEsIC00LCAxNCwgLTcsIDE3LCAtMiwgLTIsIC05LCAgMiwgMTksIC03LCAgOSwgLTggfSwKKyAgICB7IDMxLC0xOCwtMjIsICA4LCAxNSwgLTUsLTEwLC0xNSwgIDEsIDEwLCAgNiwgIDcsICA2LCAtOCwgIDIsIC0xLAorICAgICAgMTIsIC0zLCAgMywgLTEsICAxLCAgNSwgLTYsIC00LCAgMCwgIDEsICA3LC0xMCwgLTIsICA0LCAtMywgLTQgfSwKKyAgICB7IDUzLC0zMCwgLTQsIDEyLCAgMiwgIDMsIC0zLCAtMywgIDAsICAxLCAgNiwgIDUsIC01LCAtNCwgLTcsICAxLAorICAgICAgIDAsICAyLCAgMSwgIDMsICAxLCAgNSwgIDAsICAyLCAgMiwgLTEsICAwLCAgNCwgIDIsICAwLCAtMiwgIDAgfSwKKyAgICB7IDI3LC0xOCwgLTMsIC0yLCAgNCwgLTgsICAzLCAtMiwtMTEsICAyLCAxMCwgLTgsIC04LCAtNCwgIDAsIC0yLAorICAgICAgIDgsICAwLCAgOSwgIDAsLTE2LCAxMSwgIDEsIC02LCAxMywgLTMsLTEwLC0xMywtMTUsIDI1LCAgMSwgIDAgfSwKKyAgICB7IDM1LCAtNSwgLTEsIC04LCAyMywgMTEsLTE0LCAtMywgIDIsIC0yLCAgOCwgLTYsIDE3LCAtMiwgIDcsICAwLAorICAgICAgLTIsIDEwLC0xNywgMTMsIC0yLCAtMiwgMTEsIDExLC0xNCwgIDIsIC0yLCAtMywgLTgsIC0xLC0xMiwgLTUgfSwKKyAgICB7IDI5LCAtOSwgIDcsICAzLCAgMiwtMTAsICAwLCAgMywgIDksICAwLCAtMywgIDUsICAxLC0xMCwgMTAsIC01LAorICAgICAgIDMsICA2LC0yMCwgLTksIC02LCAtNCwgIDEsICAwLCAxMiwgMTcsIC04LCAgOSwgIDMsIC0xLCAtOSwgIDAgfSwKKyAgICB7IDE1LC0xNiwgMTgsLTE5LCAxNiwtMTUsIDE3LC0xOCwgMTMsLTE2LCAxNywtMTQsIDE1LCAtOSwgMTMsLTE3LAorICAgICAgIDksIC03LCAgNCwgLTUsICAzLCAtNCwgLTMsICAwLCAtNiwgIDcsIC05LCAgNywgLTIsICA3LCAtOSwgIDkgfSwKKyAgICB7IDIxLC0xMCwgIDcsIC0yLCAxMiwgLTcsIDEzLC0xNywgMTEsIC0yLCAyMCwgIDMsICA1LC0xMSwgLTYsIC02LAorICAgICAtMTUsICAwLCAtOSwgIDUsLTExLCAgNywgLTEsICA3LCAgOCwtMTAsIC05LCAgMywgLTUsICA5LCAtOCwgLTIgfSwKKyAgICB7IDIzLC0yMiwgMTUsIC01LCAxNiwgLTQsIC0zLC0xMiwgIDksICAzLCAtMSwgLTIsIC04LCAgMiwgLTIsLTE2LAorICAgICAgIDMsICA0LCAtMiwgLTYsIC03LCAxMiwgLTgsICAyLC0xNCwgIDIsIC03LCAxMSwgLTIsICA2LCAtNCwgLTEgfSwKKyAgICB7IDM0LC0xNywgLTQsICA4LCAgNCwgLTYsICAxLCAgOCwgIDQsIDE2LCAgMywgIDYsIDEyLCAtMSwgLTEsLTE1LAorICAgICAgIDYsICA0LCAtNywgLTYsICA2LCAgMCwgIDIsICAxLCAtMiwgIDIsICAzLCAgMywgLTMsIC0yLCAgOCwgLTYgfSwKKyAgICB7IDE4LC0xOCwgIDIsIC0yLCAxMCwgIDEsIDE4LC0yMywgLTMsLTEwLCAgMCwgIDQsIDIwLC0xOSwgLTMsIC00LAorICAgICAgIDIsICA4LCAgNiwgIDEsIC0zLCAgMSwgIDEsICAzLCAgNSwgLTEsLTExLCAgMywgLTcsICA1LCAtMSwgIDEgfSwKKyAgICB7IDE1LC0xNCwgIDIsICAzLCAxMCwgLTgsIDEyLC0xMywgMTMsLTE1LCAgNiwgLTgsIC00LC0xMCwgMTQsIC05LAorICAgICAgMjQsICAyLCAtNywtMTgsIDEzLC0xMSwgIDgsIDE0LCAtNiwgLTIsICAzLCAtMSwgLTQsICA3LCAtNywgLTQgfSwKKyAgICB7IDIwLC0xMiwgMTMsICA1LCAtMSwtMTAsIDE1LCAtNiwgIDgsIC0xLCAtMywtMTAsIDE3LCAgMCwgLTYsLTE5LAorICAgICAgIDIsIC0xLCAgOCwgLTMsLTE2LCAgMCwgLTMsICAyLCAtMiwgIDAsICA4LCAtOSwgIDAsICAxLC0xMCwgLTkgfSwKKyAgICB7IDMyLCAgMCwgLTksIC01LCAtMSwgIDUsIDEzLC0xMSwgIDgsICAzLCAxMSwtMTEsICAwLCAtOCwgLTIsLTE0LAorICAgICAgIDcsIDEwLCAgNiwgLTUsICAxLCAxMCwgIDIsIDEyLC0xMCwgIDQsICA0LCAgNiwgIDQsICAwLCAtNywtMTAgfSwKKyAgICB7IDE2LC0xNCwgMTAsIC03LCAxMSwtMTEsIDExLC0xMSwgMTgsLTEzLCAgOCwtMTUsIDE2LC0xMSwgMTMsIC05LAorICAgICAgIDgsIC03LCAxMiwtMTEsICA3LCAtNiwgIDMsIC01LCAgOSwgLTUsICA0LCAtMSwgIDcsIC00LCAgOCwgLTMgfSwKKyAgICB7IDI0LC0yNywgLTEsICA1LCAgOCwgLTUsIDEyLCAgNywgIDQsIC0zLCAgMywgLTEsIC05LC0xMSwtMTMsIC01LAorICAgICAgMTAsICAwLC0xMywgIDcsICAxLCAtNSwgIDQsIC05LCAgNywgLTMsIDEzLCAgMiwgLTUsIC0zLC0xNywgLTIgfSwKKyAgICB7IDIzLC0xOSwgMTUsICAxLC0xMCwtMTgsLTEyLCAtNiwgIDgsIC0zLCAxMiwgIDAsLTEyLC0xMCwgLTQsIC00LAorICAgICAgIDgsLTEwLCAgNCwgIDIsIC0yLCAtOCwgMTMsIC0zLCAtMiwgLTYsICAyLCAtMywgIDUsIC0yLCAgMiwgMTEgfSwKKyAgICB7IDI1LC0xMiwgIDQsICAyLCAyNCwgLTMsICAzLCAtNiwgMTQsIDExLCAgMCwtMjEsIC0zLCAtMywgIDEsIC04LAorICAgICAgIDcsICAwLCAgMCwgIDMsICAzLCAtNiwgLTcsICA2LCAgMiwgIDEsIC00LCAgNSwgLTEsIDEwLCAtMiwgIDkgfSwKKyAgICB7IDI0LCAtOCwgLTYsICA3LCAxNiwtMTIsIDEzLCAtMSwgMTEsLTIxLCAgMiwgLTYsICAzLC0xMiwgIDAsICA5LAorICAgICAgIDQsIDExLCAtNywgIDEsICA0LCAgMSwgLTgsICAzLCAgMywgLTYsICAzLCAgMywgIDAsIC04LCAgOCwgIDQgfSwKKyAgICB7IDI1LC0yMSwgMTMsIDE0LCAxMywtMTgsICA0LCAtMywgIDAsIC01LCAtNCwgIDUsIC0zLCAgMCwgIDQsIDEyLAorICAgICAgIDcsICAzLCAgNSwgLTUsICAyLCAtMiwgIDMsLTEwLCAgMiwgLTksLTE1LCAgNiwgIDEsICA3LCAtNSwgIDEgfSwKKyAgICB7IDIzLC0xNiwgLTIsIDEwLCAgNCwgLTEsICAzLCAgMSwgMzIsICAzLCAtNSwgLTIsICA5LCAxMCwgLTEsIC00LAorICAgICAgLTYsICAyLCAgOSwgLTEsIDE0LCAxMiwgLTYsIC0xLC0xNywgLTIsIC00LCAtOSwgLTcsIC02LCAtOCwgIDMgfSwKKyAgICB7IDUwLCAtOCwgIDUsICAyLC0xMSwgMTAsICAwLCAgMCwgIDYsIC0zLCAgNywgIDAsIC0zLCAtMiwgLTMsICAwLAorICAgICAgIDYsIC00LCAgMiwgLTUsIC05LCAgMCwgIDMsIDEwLCAgMSwgLTcsIC0yLCAtMywgLTYsIC05LCAgMSwgLTIgfSwKKyAgICB7IDI4LC0xNywgIDAsIC0yLCAgMiwgLTksICAxLCAgNSwgLTQsIC0xLCAgMCwgIDAsIDE5LC0yNywgIDUsLTEyLAorICAgICAgIDcsLTE0LCAtMywgLTYsIDEwLCAtMiwgLTQsIC0yLCAgNCwgLTUsIC0yLCAtNywgIDEsICA3LCAtOSwgIDQgfSwKKyAgICB7IDIyLC0xOSwgLTYsIC02LCAgMywtMjIsICAzLCAgNSwgMjAsIC04LC0xNCwgLTUsICAxLCAgMSwgMjAsICAyLAorICAgICAgMTYsICA2LCAgMywgMTQsICA0LCAgMywgIDUsICAxLCAgNSwgLTcsLTEwLCAtNiwgIDMsIC02LCAgMSwtMTQgfSwKKyAgICB7IDI5LC0xNCwgLTgsIDEzLCAgOCwtMTAsIC02LCAgNCwgIDQsIC02LCAgNSwgLTcsICAxLCAxMiwgMTQsIDExLAorICAgICAgLTcsICAxLCAgMiwgLTksLTExLCAtOSwgIDAsICA0LCAtMSwgIDcsIDEwLCAgNCwgIDQsIDIwLCAtMSwtMTEgfSwKKyAgICB7IDE4LCAtOSwgIDQsICAxLCAgNywtMjksIDEyLCAgMSwgLTEsIC05LCAtMiwgLTEsIC0yLCAgMiwgIDksIC04LAorICAgICAtMTMsICA1LCAgNCwtMTMsIC00LCAgMiwgLTUsIC03LCAtNiwgMTQsLTEwLC0zNCwgLTMsICAxLCAtMywtMTMgfSwKKyAgICB7IDM4LCAtOSwgMjQsICA4LCAxMSwgIDQsIC02LC0xMSwgLTIsLTEyLCAgMSwgIDEsLTExLCAtOCwgLTUsIC0yLAorICAgICAtMTUsIC04LCAgOCwgIDAsICAxLCAtNywgIDUsICA0LCAtMSwgIDgsIC0yLCAxMSwgLTMsIC0xLCAtNSwgLTUgfSwKKyAgICB7LTIwLCAxMSwgLTQsIDI0LC0xMSwgIDEsIDE1LCAgNCwgIDAsLTI4LC0xMCwgLTEsIDEwLCAxMCwgLTYsICA1LAorICAgICAgLTYsICAyLCAgNywgLTIsICAxLCAtMiwgLTYsIC0zLCAtNywgIDEsICAyLCAxMiwgLTEsICA3LCAgMCwgLTIgfSwKKyAgICB7IC05LCAxMCwtMjMsIDI3LCAtNCwtMTcsIDIwLCAtNiwgMTQsLTE3LCAgNSwgLTEsICA1LCAtOSwgLTcsICA1LAorICAgICAgLTYsICA0LCAtMiwgIDksICAwLCAgOCwgIDAsICAxLCAtMywgLTMsIC01LCAtOCwgIDUsIC0yLCAtMiwgMTIgfSwKKyAgICB7LTEwLCAxOSwgIDQsICA5LCAgMSwtMTYsIDE3LCAtMiwgIDksLTI5LC0xNiwtMTEsIC00LCAgNywgLTUsICA0LAorICAgICAgLTEsIC0zLCAgMywgIDIsICAzLCAtNCwgIDUsLTEyLCAtMiwgIDYsICA1LCAtNCwgIDQsICAxLCAgNCwgMTAgfSwKKyAgICB7LTIwLCAxMCwtMjQsIDE0LCAtNSwgMTEsICA5LCAgMCwgMTYsLTIwLCAxMCwgLTUsIC02LCAtNiwgLTEsICAyLAorICAgICAgLTQsICA1LC0xNiwgIDgsIC0yLCAgNSwgIDUsLTExLCAgOSwtMTEsICA0LC0xMSwgLTEsIC0xLCAgNCwgIDMgfSwKKyAgICB7IC05LCAxMSwgIDMsIDE5LCAyNCwgIDQsICA1LC0xNCwgMzAsLTE3LCAtNCwgLTIsLTE3LCAgNywgIDIsICAzLAorICAgICAgIDEsICAzLCAtNywgLTQsICAyLCAtMywgIDEsICA0LCAtMSwgLTEsICAzLC0xMiwgLTIsICAzLCAtMywgMTAgfSwKKyAgICB7LTE5LCAxOCwgMTEsIDE5LCAxOSwgMTksIDEwLCAgNCwgMTMsICA2LCAgNSwgIDQsICA4LCAgMywgLTIsIDEyLAorICAgICAgLTYsIC0yLCAgNywgLTYsIDE1LCAxMiwgMTYsIDE2LCAxOCwgLTMsIC00LC0yMCwgIDAsIDEwLCAtOSwgLTMgfSwKKyAgICB7LTIxLCAgOSwgMjAsIDEyLCAgMCwgLTMsICA1LCAtOSwgMTUsLTEzLCAgNSwgLTUsIC02LCAyNCwgIDIsICA5LAorICAgICAgLTUsICAyLCAtNywgIDIsICA1LCAgNywgLTUsICAyLCAxNSwgIDMsICAxLCAtMSwgLTQsIC0yLCAgNywgIDAgfSwKKyAgICB7LTE4LCAxNiwgMTMsIDE1LCAgMiwtMTAsIDE0LC0xMSwgIDQsLTExLCAgNSwgMTIsIDEyLCAyMCwgIDgsIDMwLAorICAgICAgIDIsIDExLCAtOSwgIDcsICAwLCAtMywtMTYsIC01LCAtNiwgIDUsIC00LC0yMSwgIDAsICA1LCAgNiwgIDEgfSwKKyAgICB7LTI2LCAgOCwtMTMsICA5LCAgNiwtMTAsICAyLC0xMSwgIDcsIC00LCAgNiwtMTksLTExLCAtNiwtMTIsIDE2LAorICAgICAgIDAsICA1LCAtNywgIDgsICA1LCAgNiwgMTcsIC05LCAxMCwtMTAsICA1LCAtMywtMTEsICAyLCAgNCwgMTAgfSwKKyAgICB7LTExLCAxNywgLTMsIDIyLCAtNSwgMTgsICAzLCAgMSwgIDQsIC01LCAxNCwtMjcsICA1LCAtNywgLTQsIC01LAorICAgICAtMTAsIDExLCAgMSwgMTUsICAxLCAgMSwgLTYsIC01LCAxMCwtMjIsIC03LCAtNywtMTUsIDEzLCAtNCwgIDUgfSwKKyAgICB7LTE3LCAxNCwgLTcsIDEzLCAgMywgIDAsIDEzLCAtNiwgIDksLTE0LC0yMiwgLTEsICAxLCAxOSwgMTQsIC0zLAorICAgICAgIDQsLTEzLC0xMywgIDIsIC00LCAgOCwgLTIsIC0yLCAxMywtMTIsIDEzLC0xMiwgLTcsIC01LCAtMywgIDYgfSwKKyAgICB7LTE3LCAxNywgLTEsIDMzLCAgNiwgIDMsICA5LC0xNiwgIDMsLTE0LCAtOCwgIDYsLTE3LCAgOCwgIDMsIDEzLAorICAgICAgIDgsIC02LCAgMywgIDEsIC0yLCAgMCwgLTIsICA4LCAgNCwgIDksIDEzLC0xMCwgIDQsLTE3LCAgMCwgLTYgfSwKKyAgICB7LTIwLCAgNywgIDcsIDIxLCAgMSwgLTMsICA3LCAtMywgLTIsLTEyLCAgOSwgLTcsICAyLCAtMywgMTQsICAxLAorICAgICAgLTEsIC03LCAxMiwtMTAsICA1LC0yMCwgMTEsIC0yLCAgMCwtMjQsLTE3LCAgNiwgIDYsIC00LCAgMywgLTEgfSwKKyAgICB7IC04LCAxMCwgIDYsICA3LCAtMSwgLTYsIDI4LCAtNiwgMTAsLTMzLCAgMSwtMjAsICAwLC0xMiwgMTAsICAxLAorICAgICAgLTYsICA4LCAtMywgLTEsLTEwLCAgOCwgIDUsICAwLCAxMCwgLTIsICA4LCAxNiwgLTUsIC0zLCAtNywgIDQgfSwKKyAgICB7LTE3LCAxMywgIDMsIDE1LCAgMSwgLTUsIDI3LCAtNSwgIDYsIC02LCAxMiwgIDIsIC00LCAgOCwgLTEsIC0zLAorICAgICAgLTIsIDEyLC0xNSwgIDMsICA0LCAgMSwgIDIsIC05LCAgMCwtMTYsLTIxLCAgMiwgLTQsIDE2LCAtNywgIDQgfSwKKyAgICB7LTE1LCAyMCwgIDgsIDE3LCAgNSwtMTQsIDE1LC0xMSwgMjEsLTExLCAxMywtMTMsICAyLC0xNSwtMTMsICAxLAorICAgICAgLTUsICA1LCAgMiwgMTAsIC05LCAgNCwgLTEsICAzLCAgMiwgLTQsIDEzLCAtNSwgIDEsIC00LCAgNSwgLTMgfSwKKyAgICB7LTIxLCAgOCwgIDIsIDE2LCAtMSwgIDIsIDE1LC0xNiwgMTMsLTEyLC0xMiwgLTcsIC04LCAgMiwgLTcsIDExLAorICAgICAgLTgsICA1LCAgMiwgLTcsIDE2LCAtNCwgIDEsIC03LCAgMywtMTUsICA2LCAtNSwgLTgsICAyLCAtOCwgIDUgfSwKKyAgICB7LTE1LCAxNywgLTYsICAzLCAtMywgIDMsICA5LCAtNywgMTQsLTIzLCAxMSwgIDEsIC0xLCAgNCwgIDcsICA2LAorICAgICAgLTEsLTE0LCAgNywgIDYsIC04LCAgNSwgIDEsLTE1LCAxMCwgLTksICAyLCAtMywgLTEsICA0LC0xMCwgLTQgfSwKKyAgICB7LTEwLCAxOCwgIDMsIDExLCAgMSwgIDQsIDE0LC0xNCwgIDcsIC00LCAxNSwtMTAsIDEwLC0xMSwgMTAsIC00LAorICAgICAgIDUsLTE0LCAxMCwgIDQsIDE1LC0xMiwgMTUsLTEzLCAyMCwtMTUsIDE0LC0xNSwgIDgsLTExLCAgNCwgLTYgfSwKKyAgICB7IC03LCAyMywgIDIsIDIwLCAgNywgIDgsIDE5LCAtNSwgIDksLTE2LCAtOCwtMTcsIC01LCAgMSwgIDUsIC02LAorICAgICAgLTgsICAxLCAtNiwgLTQsIDEwLCAgNiwgIDYsICAyLC0xMSwgLTQsICAwLCAgMiwgIDQsICA3LCAgOSwgLTQgfSwKKyAgICB7LTE1LCAyMCwgLTUsIDIyLCAxMSwgLTgsICA5LCAtNSwgMTAsLTEzLCAtOCwgIDgsICAyLCAtMiwgLTMsICA3LAorICAgICAgIDYsIDEwLCAgMSwgIDIsIC01LCAtOSwgIDEsIDEwLCAxNiwtMjIsIC03LCAgMCwgIDcsICA3LCAgNiwgIDEgfSwKKyAgICB7LTI2LCAxOSwgLTUsICAzLCAgNSwgMjUsIDE4LCAtNSwgIDksLTE0LCAtOCwgLTYsIC0yLCAtNiwgIDIsICAzLAorICAgICAgLTgsIC0yLCAtNywgIDcsIC0zLCAgNywgIDMsICA0LCAtOCwgIDAsICAxLCAtOCwgLTQsIC0yLCAtMiwgIDEgfSwKKyAgICB7LTIwLCAxNCwtMTAsICA2LCAtMywgIDcsICA4LC0zMiwgLTIsIC03LCAtMiwtMTAsIDE2LC0xMiwgLTksIDE1LAorICAgICAgLTIsIC01LCAtNiwgIDIsIC03LCAgNSwgIDksICAxLCAgNiwgLTcsIC0xLCAgMCwgLTIsIC00LCAtNywgIDMgfSwKKyAgICB7LTE0LCAxNiwgIDQsIDExLCAtOCwgIDEsIDIzLCAtNCwgMTcsLTEzLC0xMCwgIDEsIDEyLCAgOSwgMTIsIC00LAorICAgICAgIDcsIC0xLCAtMSwgIDUsIC04LCAtNiwgIDMsICAzLCAtNiwgLTMsLTE4LCAgMCwgMTgsIDIwLCAgNCwgLTIgfSwKKyAgICB7LTMzLCAxOSwtMTAsIDMwLCAxNSwgIDIsIC0zLCAtMSwgLTQsLTE0LCAgNywgLTcsIC0xLCAgNywgLTgsICA5LAorICAgICAgLTEsIC0zLCAtNSwgIDIsICAyLCAgNCwgIDAsICA1LCAgMCwgIDAsICAyLCAgMywgIDMsIC0zLCAtMywgIDQgfSwKKyAgICB7IC02LCAyMCwgIDAsICA1LCAxNywtMTAsIDE4LC0xNywgIDksLTE2LCAgNCwtMTMsIC02LCAgMiwtMTQsIDE0LAorICAgICAtMjgsICA5LC0xMiwgMjUsIC00LCAgNywgIDcsIC04LCAgNiwgLTYsIC0yLC0xMCwgIDIsLTExLCAtMSwgIDIgfSwKKyAgICB7LTEyLCAxNCwgMTIsIDUyLCAtMywgIDUsIC01LCAgNCwgIDgsLTEzLCAgMiwgLTUsIC00LCAgMiwgLTIsIC0xLAorICAgICAgLTIsICAzLCAgMywgIDUsICAyLCAgMywgIDAsICAxLCAtNSwgIDIsIC00LCAtMywgIDEsIC01LCAtMiwgIDAgfSwKKyAgICB7LTEzLCAgNiwgIDksIDI0LCAgMCwgIDgsIDE0LC0xNSwgMTgsIC05LC0xMSwgLTgsICAzLCAxNSwgLTIsIC00LAorICAgICAgLTksICA0LCAtMywgMTIsIDE0LC0xMywgMTEsIC00LCAgMiwgLTQsICAwLCAtNiwgLTYsIC02LC0xNCwgLTEgfSwKKyAgICB7LTEwLCAyOCwgIDMsIDEyLCAgOSwgIDMsIDExLC0yOCwgIDYsLTExLCAtNywgIDQsICAwLCAgNywgIDgsIC05LAorICAgICAgIDAsIC02LCAgMCwtMTYsICA0LCAgNywgIDQsICA0LCAgNywgIDMsICA0LCAtNywgIDAsIC0zLC0xMCwgIDYgfSwKKyAgICB7LTExLCAxNCwgLTIsIDE5LCAtMSwgLTEsICA3LCAgOSwgLTIsLTI3LCAxMCwtMTQsIDE1LCAtNCwgMTIsIC00LAorICAgICAgIDIsIC0yLCAtNiwgMTIsIC02LCAgMCwgLTUsIC00LCAtNSwgIDEsICAzLC0xMSwgIDUsIC05LCAgMywgLTggfSwKKyAgICB7LTE4LCAgNywgMTMsIDE2LCAtNCwgIDMsICA5LC0xMCwgMTAsLTEwLCAtMywtMjIsIC00LC0xMiwgIDMsLTE2LAorICAgICAgIDAsIC0zLC0xNiwgIDgsLTExLCAgMSwgMTAsIC03LCAxNSwgIDMsICAwLCAtMSwtMTMsICA4LCAgMSwgIDYgfSwKKyAgICB7LTIwLCAxMCwtMTAsIDEwLCAgOCwgLTEsICA2LCAgMCwgMTYsLTEyLCAgOSwtMTAsIC0xLCAtNSwgLTQsLTEzLAorICAgICAgMTMsIDE2LCAtOCwgMTIsIC0yLCAxNCwgMTgsIDEzLCAgMCwtMTYsICAyLCAtNSwgLTUsIC01LCAtNCwgIDMgfSwKKyAgICB7LTE0LCAgNSwgLTcsLTE3LCAgNSwtMTMsIDIzLCAyMCwgLTQsIC0xLCAgMSwgLTYsIDEzLCAgNSwgLTEsICA0LAorICAgICAtMTQsIC0yLCAtNywgIDgsICAzLCAgMiwgIDIsIC03LCAgMiwgLTEsICA0LCAgNywgIDMsIC05LCAtMSwgLTUgfSwKKyAgICB7LTE5LCAgMywtMjQsLTI4LCAtOSwgLTcsIDE5LCAgMywgIDIsIDE5LCAgNywgIDUsLTEzLCAgOCwtMTUsLTE3LAorICAgICAgIDMsLTExLCAgNCwgMTMsICAzLCAgMiwgLTEsIC0zLCAtNCwgLTQsICAyLCAgMCwgLTUsIC02LCAgNiwgIDIgfSwKKyAgICB7LTE3LCAxOCwtMzAsLTIwLCAtMiwgLTMsICAxLCAxNSwgLTEsLTExLCAgNiwgLTQsIDExLCAxMSwgLTQsIC01LAorICAgICAtMTAsICAwLCAgMCwgIDEsICAzLCAtNywgIDgsICAyLCAgNSwgIDEsICA1LCAtNSwgIDEsICA2LCAgNCwgIDEgfSwKKyAgICB7IC02LCAgMSwtMzAsLTI1LCAtMSwgLTgsIC0yLCAtOSwtMTcsIDE2LCAgMywgLTEsIC0yLCAtOSwgLTYsIC03LAorICAgICAgLTMsIDEyLCAgNiwgLTQsLTEwLCAgMCwgMTAsIC04LCAtNiwgLTUsIC0zLC0xMSwgLTQsICAwLCAtMSwgLTMgfSwKKyAgICB7IC0xLCAtMSwtMzQsLTI4LCAgMSwtMTAsICAyLCAgOSwgIDQsIDE2LCAgMiwgIDYsIDE0LCAxNywgIDAsICA3LAorICAgICAgLTQsICA0LCAgNCwgIDQsICAwLCAgMSwgLTEsIC01LCAgOCwgIDEsIC00LCAgMSwgLTksIC0yLCAgNSwgIDYgfSwKKyAgICB7LTExLCAxNCwgIDEsLTMxLCAtNywtMjQsICA5LCAgNywgIDYsICA1LC0xMywgIDEsIC0xLCAgMywgIDQsIC0xLAorICAgICAgLTIsIC04LCAtNiwgIDMsICA1LCAtNCwgLTYsICA3LCAtMiwgIDUsICAzLCAgMywgIDAsICAwLCAtNSwgIDIgfSwKKyAgICB7LTI1LCAgOCwtMTEsLTE4LCAgMSwgLTQsICA4LCAtMywgLTQsIDE1LCAgNiwgLTUsICA4LCAgMiwgIDMsICA0LAorICAgICAgLTQsICA1LCAgNiwgIDgsIC03LCAgNiwgIDEsLTExLC0xNSwtMTMsICA5LCAtNCwtMTQsIDEwLCAxMiwgIDcgfSwKKyAgICB7LTIwLCAxMSwtMTUsLTI1LCAgMywgIDQsIDE4LCAxMywgLTQsIC01LCAtOSwgLTEsIC01LCAtMiwgLTIsIC03LAorICAgICAgMTYsICA1LCAtNCwgLTUsIC03LCAtMiwgLTMsIC05LCAxMSwgLTIsICAwLCAtNywtMTcsIC02LC0xMSwgIDYgfSwKKyAgICB7LTExLCAxOCwgLTUsLTIwLC0xNSwgLTMsICA5LCAxMSwtMjAsIDEyLCAgNSwgIDUsIDExLCAtMywgIDcsICAxLAorICAgICAgMTAsIC02LCAtMywgLTMsICAzLCAgMywgMTQsIC03LCAxMCwtMTcsICA5LC0xMSwgLTIsIC02LCAgNywtMTIgfSwKKyAgICB7LTIwLCAgOCwtMTQsLTE3LCAtOSwtMTMsIC0zLCAgMCwtMjcsLTE0LCAtMywtMTQsICA0LCAgMywgIDYsIC02LAorICAgICAgIDcsICA0LCAyMywgIDksIDExLCAgOSwgIDMsIC00LCAgOSwgIDIsICA0LCAtMSwgLTYsICAxLCAtOCwtMTEgfSwKKyAgICB7IC05LCAxNCwgIDIsLTM3LCAtNywgMTMsICA2LC0xMSwgLTYsICA5LCAxOCwtMTEsIC02LCAgMiwgMTIsICA0LAorICAgICAgLTEsICAzLCAgMSwgLTIsIC0yLCAgMSwgLTksIC00LCAtMiwgLTMsICAzLCAgNSwgLTYsICAwLCAtMiwgLTggfSwKKyAgICB7LTI5LCAgOCwgLTEsLTEzLCAtMiwgIDgsIDIzLCAgMiwtMTAsICA3LCAxMywgLTYsIC01LCAxMSwgMTMsICAwLAorICAgICAtMTAsLTEzLCAxMSwtMTIsLTEwLCAgNiwgIDQsICA2LCAgNCwgIDMsICA2LCAtNSwgLTksIC0yLCAtMSwgIDMgfSwKKyAgICB7LTE4LCAgNiwtMTAsLTU1LCAtNCwtMTEsIC0yLCAgMCwgIDEsIC0zLCAtOSwgLTYsICAzLCAtMiwgLTEsICA2LAorICAgICAgIDMsIC0xLCAgMywgIDEsIC00LCAtNywgLTIsICA2LCAgMywgLTIsIC0xLCAtMywgLTIsICAwLCAgNCwgIDEgfSwKKyAgICB7LTE0LCAgNSwgIDMsLTIxLCAtOCwtMTYsIC00LCAtMiwtMTEsIDI3LCAxNSwtMjAsICAzLCAgMCwgIDEsICAxLAorICAgICAgIDIsIC01LCAtNSwgIDQsICAxLCAtOSwgIDUsIC0zLCAgMywgIDAsIC00LCAtMiwtMTEsIC00LCAtMywgIDcgfSwKKyAgICB7LTE3LCAtMSwgLTksLTE3LCAtOCwtMTgsIDEyLC0xMywgLTksIDEzLCAtMywgIDMsICAzLCAtMywgIDEsIC0yLAorICAgICAgIDAsIDE2LCAtOSwgIDYsIDEyLCAgOSwgIDUsIDExLCAgMiwtMTUsICAxLCAtNCwtMTYsICA3LCAtNCwtMTIgfSwKKyAgICB7LTE4LCAgOCwgLTYsLTExLCAtOCwgLTcsIDEzLCAgNywgIDEsICA2LCAgOCwgLTEsIDIxLCAtNCwgMTQsIDE1LAorICAgICAgMTgsIC00LCAtMywgMTUsICAwLCAgOSwgIDQsICA3LCAgMywgLTEsICA5LCAtMiwgIDAsICA3LCAtOCwgIDIgfSwKKyAgICB7LTEwLCAgNywtMTgsLTI5LCAgMywgMTIsIDEyLCAgOSwgMTEsICA0LCAtMSwtMTUsICAxLCAtMSwgIDgsIC0yLAorICAgICAgLTIsIDEwLC0xNSwgLTEsICAwLCAgNiwgMTIsIC02LCAtMSwgMTAsIC02LCAtMywtMTEsIC00LCAgOSwgLTYgfSwKKyAgICB7LTE0LCAxNCwgLTksLTIxLC0xMiwgLTIsIC0xLCAtNywgLTUsLTEwLCAgNSwgLTgsICAwLCAgNiwgIDksLTExLAorICAgICAgMTEsIC0zLCAtNSwgIDMsICA4LCAxNSwgLTIsIC00LC0yMiwgIDQsIC02LCAxMiwgIDIsIDEzLCAgNiwgLTcgfSwKKyAgICB7LTEyLCAxMSwgLTUsLTI5LC0yNSwgIDQsIDEyLC0xMywtMTEsIC03LCAgNCwgIDIsICAyLCAtNSwgIDUsICA4LAorICAgICAgIDcsIC01LCAtNSwgIDYsICAzLC0xMCwgIDEsIC02LCAgNiwgLTYsIC01LCAtMSwgLTIsIC00LCAgNywgIDYgfSwKKyAgICB7LTE1LCAxMSwgLTUsLTE2LCAgMCwtMTMsIDI2LC0yMywgLTYsIC0zLCAgNSwgLTIsIC0yLCAyMSwgLTYsIC0zLAorICAgICAgLTUsIC0xLCAgNiwgLTEsICAwLC0xMywgIDIsIC0zLCAtOSwgLTEsIC00LCAtMywgIDUsIC00LCAxMiwtMTYgfSwKKyAgICB7IC05LCAgOSwgLTEsLTE3LCAtMywgLTYsIDEyLCAgNiwtMTgsIC0yLCAxMSwtMTQsIC02LCAgMywgMTQsLTEyLAorICAgICAtMTEsIC01LCAxNCwgIDIsICA1LCAtOCwgLTQsLTExLCAgMiwgLTUsIDE2LCAgNiwgLTcsIC00LCAgOCwgMTMgfSwKKyAgICB7LTEzLCAgNSwgIDMsLTI4LC0xNCwgIDAsICA2LCAyMywgIDUsICA0LCAtMSwtMTcsICAxLCAtMywgIDAsICAwLAorICAgICAgIDUsICA0LCAgMCwtMTgsIDE0LCAxMCwgIDQsICAyLCAgNSwgLTIsICA0LCAtMywgIDIsICAwLCAgMiwgIDAgfSwKKyAgICB7LTE1LCAgNCwtMTMsLTE2LCAtMywtMTIsIC0yLCAgMiwgIDcsIDEwLCAgOSwgIDMsIDExLCAgNCwgMjMsIDE0LAorICAgICAgIDksIDE2LCAgNCwgIDEsLTEyLCAtMywgIDQsIC03LC0xNSwgLTcsLTEwLC0xNCwgLTYsIC04LCAtMSwgLTYgfSwKKyAgICB7IC03LCAxMCwgLTUsLTEwLCAtMywtMTMsIDE2LCAtMSwtMTIsICA3LCAtMywtMTIsICAyLCAxMywgMTMsICAyLAorICAgICAgMTcsIDE1LC0xMywgIDEsIC01LCAtMiwgIDMsIC0xLCAgMSwgLTMsICA2LCAtMywtMTIsLTE2LCAgNywgLTcgfSwKKyAgICB7LTExLCAtNSwtMTIsLTMwLCAtNiwtMjIsICAxLCAgNCwgLTYsIC0zLCAxMiwgIDYsICA3LCAgMCwgMTYsICA2LAorICAgICAgLTIsICAwLC0yMiwgLTIsIC05LCAgMiwtMTMsICA4LCAgNiwgLTgsICA0LCAtNywgLTEsIC02LCAgNCwgIDYgfSwKKyAgICB7LTE0LCAgNSwgIDEsLTI3LCAtNCwgIDIsICAxLCAxNCwtMTEsIC03LCAtOCwgLTQsICAxLCAgOCwgIDAsIC02LAorICAgICAtMTMsIDExLC0xMiwgLTcsIC01LCAgMSwgMTAsICA3LCAgMywgLTIsICAwLCAgNiwgLTgsICAyLCAxMCwgLTEgfSwKKyAgICB7LTEwLCAxMCwtMjUsLTEzLC0yMCwgLTQsIDE5LCAgMywgMTMsICA1LCAgNSwgIDcsIC04LCAgMiwgIDQsICAyLAorICAgICAgIDMsIC0xLCAtMSwgLTksIDE0LCAxMCwgIDksIDE0LCAgMywgIDMsIC02LCAgMCwgLTUsICA0LCAgMSwgLTEgfSwKKyAgICB7IC05LCAxNSwtMTgsLTE3LCAgNCwtMTEsICA2LCAgNywtMTIsICA4LCAtMSwtMTEsICAyLCAgMywgIDcsIDE2LAorICAgICAgLTMsIC05LCAgNywtMTIsIDIzLCAgMCwgIDYsICA3LC0xNCwgLTksICA4LCAgMSwgLTIsICA2LCAtMiwgLTEgfSwKKyAgICB7IC02LCAgOSwtMTYsLTI2LC0xNCwtMTEsICA5LCAtNiwgIDUsIC0yLCAxMywgMTcsIDIxLCAgNywgMTgsLTE5LAorICAgICAgIDYsLTIzLCAtMiwtMTUsIC0yLCAgMiwtMTAsIC04LCAgMiwgIDEsIC0yLCAgNCwgLTMsIC00LCAtNSwgLTQgfSwKKyAgICB7ICAwLCAgNiwgLTUsLTI4LC0xNywtMzIsICAyLC0xMCwgMTEsICAzLCAtNSwgIDksIDEwLCAgMywgMTEsIDExLAorICAgICAgLTMsIDEyLCAtMiwgIDIsICA0LCAtNiwgIDksIC00LCAtNCwgLTQsIC00LCAtOSwgIDIsICAwLCAgMiwgIDQgfSwKKyAgICB7ICAwLCAtOCwtMTgsLTM0LCAtOSwgLTcsIC00LC0xMSwgMTAsIDE1LCAxMSwgLTEsIC04LCAxNSwgIDYsLTEzLAorICAgICAgIDksICAyLCAtNCwtMTIsICAwLCAtMSwgMTksIDEyLCAgNiwgIDUsICAwLCAtMywtMTAsLTEyLCAgMywgLTUgfSwKKyAgICB7LTEwLCAgNiwgLTksLTE3LC0xMiwtMTEsICA5LCAtNiwgMTEsIDExLCAxOCwgLTcsICAwLCAxNiwgIDQsICAyLAorICAgICAgLTYsICAzLC0xMiwgLTEsICAwLCAgMSwgLTUsLTIyLCAtMiwtMTIsICAwLCAgNiwgMTcsICA1LCAgNSwgIDYgfSwKKyAgICB7IDEyLCAtNSwgIDcsICAxLCAtNSwgLTIsIC0xLCAgMiwgIDIsIC00LCAtMywgLTMsIC0zLCAtMiwtMjksIDExLAorICAgICAgIDUsLTEzLC03MywgMjQsIDEyLCAgNCwtMTQsLTEwLCAgNSwgIDEsICAwLC0xMSwgLTcsIC03LCAgNywgIDMgfSwKKyAgICB7IDEwLCAtMywgLTEsIC0zLCAgNCwtMTEsIC01LCAtMiwgLTgsICA3LCAgOSwgIDIsIC04LCAtNiwgIDYsICA3LAorICAgICAgMjEsIDE3LC01NCwgNDcsLTE0LC0xMCwgMTQsIDE5LCAxMywgMjEsIC00LCAgMywgIDEsICAyLCAtNCwgIDIgfSwKKyAgICB7LTEyLCAgNCwtMTYsLTEyLCAgNSwgLTksIC00LCAxOSwgLTcsLTIyLC0yMiwtMTcsICAzLCAgMCwgLTYsICA4LAorICAgICAgMjMsIC00LC01NSwtMjgsICAyLC0yNiwgIDIsICAxLCAgNCwgIDAsLTEzLCAgNiwgIDAsIDEwLCAtNywtMTEgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDMsIC0xLAorICAgICAgMzUsIC0xLC02NywtMzUsLTI0LC0yNCwgLTYsICAyLCAgMiwgLTIsICAxLCAgMywgIDIsICAwLCAtMSwgIDEgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDUsICAwLAorICAgICAgNDEsIC00LC03MywtMTUsIDE4LCAgNCwgMTcsICA4LCAtMSwtMTYsIC0xLCAtMiwgIDEsICAwLCAgMCwgIDAgfSwKKyAgICB7IC00LCAtNCwgIDQsICA2LCAtMSwgIDIsLTE2LC0xMCwtMTUsLTEwLCAyMSwgLTIsIC02LCAtMiwgMTQsIC03LAorICAgICAgMTAsIC01LC01NSwgMzQsLTEyLCAxMSwtMTMsIC0yLCAgMiwgMjgsLTI2LCAgMCwgIDcsICA0LCAyMSwgLTcgfSwKKyAgICB7ICAyLCAgMSwgMTUsLTIyLCAxMCwgLTMsIDE0LCAtNiwgLTIsIDE1LCAtMiwgLTcsIDIwLCAgNiwtMTUsIC03LAorICAgICAgMjMsIDEwLC02MCwgIDgsIC00LCAyOSwtMjIsICAyLC0xMywgIDksLTEwLCAxMiwgLTEsIC0zLCAgNCwgIDcgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwgIDAsIC0xLCAtMiwgMTEsIC01LAorICAgICAtMjEsLTExLC02MCwtMjcsLTE3LC0zOSwgIDYsIDM2LCAgMCwgLTgsICAyLCAgMiwgIDAsICAwLCAtMiwgIDMgfSwKKyAgICB7ICAyLCAtNSwgIDksLTE3LCAtMSwgIDIsIC0zLCAtNiwgIDgsIDEyLCAgNywgLTYsLTMzLC0xMSwtMTQsLTQwLAorICAgICAgMTAsIDM2LC00NiwgIDAsLTE5LCAgNSwgIDAsLTEwLCAgMywgMTIsIC02LCAtOCwgIDYsLTEyLCAtNywgIDEgfSwKKyAgICB7ICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAtMSwgIDAsICAxLCAgMCwgLTIsICAwLAorICAgICAgIDQsIC0yLC04NywgLTMsIC0yLCAgMiwgLTIsIDIwLCAgMiwgIDYsIC0xLCAgNiwgIDAsICAwLCAgMiwgLTEgfSwKKyAgICB7ICAxLCAgMCwgIDAsICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAxLAorICAgICAgIDEsICA3LC03NiwgNDEsIC03LC0yNCwgIDAsIC02LCAgMywgIDYsICAwLCAtMiwgLTEsICAxLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAtMywgIDQsICAyLCAgMywgIDIsICAyLCAgMCwgIDMsIC0xLCAgNCwgIDAsIC0xLCAgNCwgLTIsIC00LAorICAgICAtMzIsLTExLC02NCwtMjksIC05LC00MywgIDIsLTExLCAtMSwgLTcsICAwLCAtNCwgLTIsIC0yLCAtMiwgIDIgfSwKKyAgICB7IDEwLC0yMCwgIDMsIC0zLCAxMywgMTMsICAwLCAtNCwgIDIsICA3LCAtOCwgIDcsIC0yLCAgMiwtMjAsLTIwLAorICAgICAtMTksICAzLC00NywtMTgsLTE2LCAtNiwtMTUsLTQyLC0xNywgMTQsIC02LCAgOCwgMTIsLTEwLCAxMSwtMTIgfSwKKyAgICB7IC0zLCAtMiwgLTIsIC0xLCAtMSwgIDQsIC0zLCAtMSwgLTYsIC0yLCAgMywgIDIsIC0zLCAgNiwgLTEsIC05LAorICAgICAgMTAsIDEzLC02OCwgLTksIDI2LCAgMywgIDUsICAzLC0yMSwgMTAsLTE1LCAyMSwtMjIsIDE5LCAxMSwtMTQgfSwKKyAgICB7ICAxLCAgNSwgMTgsLTE5LC0yOSwtMTMsIC0yLCAxOCwtMTAsIDIwLCAgMiwgMTAsLTEwLCAxMSwgIDEsICA4LAorICAgICAtMTYsLTE3LC00MSwgMTAsLTE0LC0yNSwgIDAsLTE0LC0xOSwgMTcsICA3LC0xMiwgMTQsLTExLCAxNCwgIDUgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAzLCAtMSwtNDMsICA1LAorICAgICAgIDYsLTEyLC00OCwgMTksICA4LC0zOCwgLTgsIC0zLCAyMiwtMjEsLTEwLCAxNSwgMjAsIC05LCAtNSwgIDggfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAtMSwgIDEsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDYsIC0zLAorICAgICAgMjIsLTE0LC03MSwtMjQsIC0yLC0zMywgMjMsICA3LCAtOCwgIDcsIC0zLCAgMiwgLTQsICAxLCAtOCwgLTIgfSwKKyAgICB7ICAxLCAgMCwgLTEsICAyLCAgMCwgLTIsICAwLCAgMCwgLTEsICAwLCAgNCwgIDAsIDI2LCAtMSwgMTAsLTExLAorICAgICAtMTcsLTMyLC01OCwgMTQsLTE0LC0xMSwgLTIsIDE1LCAgMiwgLTgsIDEyLCAxMCwgLTksIDEzLC0zMywtMTQgfSwKKyAgICB7IDE1LC0xNywtMTksICA3LCAtOCwtMTUsLTMyLC0yMiwgIDcsIDEyLCAxOCwgIDAsICAwLC0xNSwgLTQsIDE2LAorICAgICAgMzcsIC0yLC00NiwgMTEsICAyLCAtOCwtMTAsIC04LCAxNCwgIDksIC00LCAgNSwgIDcsLTE3LCAgNCwgIDMgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTIsICAwLAorICAgICAgLTUsICAzLC04NSwgMjMsIC05LC0xNywgLTIsIC0yLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTIsICAwLAorICAgICAgLTUsICAzLC04NSwgMjMsIC05LC0xNywgLTIsIC0yLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7ICAxLCAgMCwgIDAsICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAxLAorICAgICAgIDEsICA3LC03NiwgNDEsIC03LC0yNCwgIDAsIC02LCAgMywgIDYsICAwLCAtMiwgLTEsICAxLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAtMywgIDQsICAyLCAgMywgIDIsICAyLCAgMCwgIDMsIC0xLCAgNCwgIDAsIC0xLCAgNCwgLTIsIC00LAorICAgICAtMzIsLTExLC02NCwtMjksIC05LC00MywgIDIsLTExLCAtMSwgLTcsICAwLCAtNCwgLTIsIC0yLCAtMiwgIDIgfSwKKyAgICB7IDEwLC0yMCwgIDMsIC0zLCAxMywgMTMsICAwLCAtNCwgIDIsICA3LCAtOCwgIDcsIC0yLCAgMiwtMjAsLTIwLAorICAgICAtMTksICAzLC00NywtMTgsLTE2LCAtNiwtMTUsLTQyLC0xNywgMTQsIC02LCAgOCwgMTIsLTEwLCAxMSwtMTIgfSwKKyAgICB7IC0zLCAtMiwgLTIsIC0xLCAtMSwgIDQsIC0zLCAtMSwgLTYsIC0yLCAgMywgIDIsIC0zLCAgNiwgLTEsIC05LAorICAgICAgMTAsIDEzLC02OCwgLTksIDI2LCAgMywgIDUsICAzLC0yMSwgMTAsLTE1LCAyMSwtMjIsIDE5LCAxMSwtMTQgfSwKKyAgICB7ICAxLCAgNSwgMTgsLTE5LC0yOSwtMTMsIC0yLCAxOCwtMTAsIDIwLCAgMiwgMTAsLTEwLCAxMSwgIDEsICA4LAorICAgICAtMTYsLTE3LC00MSwgMTAsLTE0LC0yNSwgIDAsLTE0LC0xOSwgMTcsICA3LC0xMiwgMTQsLTExLCAxNCwgIDUgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAzLCAtMSwtNDMsICA1LAorICAgICAgIDYsLTEyLC00OCwgMTksICA4LC0zOCwgLTgsIC0zLCAyMiwtMjEsLTEwLCAxNSwgMjAsIC05LCAtNSwgIDggfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAtMSwgIDEsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDYsIC0zLAorICAgICAgMjIsLTE0LC03MSwtMjQsIC0yLC0zMywgMjMsICA3LCAtOCwgIDcsIC0zLCAgMiwgLTQsICAxLCAtOCwgLTIgfSwKKyAgICB7ICAxLCAgMCwgLTEsICAyLCAgMCwgLTIsICAwLCAgMCwgLTEsICAwLCAgNCwgIDAsIDI2LCAtMSwgMTAsLTExLAorICAgICAtMTcsLTMyLC01OCwgMTQsLTE0LC0xMSwgLTIsIDE1LCAgMiwgLTgsIDEyLCAxMCwgLTksIDEzLC0zMywtMTQgfSwKKyAgICB7IDE1LC0xNywtMTksICA3LCAtOCwtMTUsLTMyLC0yMiwgIDcsIDEyLCAxOCwgIDAsICAwLC0xNSwgLTQsIDE2LAorICAgICAgMzcsIC0yLC00NiwgMTEsICAyLCAtOCwtMTAsIC04LCAxNCwgIDksIC00LCAgNSwgIDcsLTE3LCAgNCwgIDMgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTIsICAwLAorICAgICAgLTUsICAzLC04NSwgMjMsIC05LC0xNywgLTIsIC0yLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTIsICAwLAorICAgICAgLTUsICAzLC04NSwgMjMsIC05LC0xNywgLTIsIC0yLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfSwKKyAgICB7IDE2LCA2NSwgLTIsIC0yLCAgNCwgIDMsICAwLCAtNywgIDMsICAxLCAgMywgIDEsICAwLCAgNSwgIDEsIC01LAorICAgICAgIDAsICAyLCAtMSwgIDMsICAwLCAgMCwgLTEsIC0yLCAgNiwgIDAsIC0yLCAgMCwgIDAsIC0xLCAgMSwgIDEgfSwKKyAgICB7ICA1LCAzNywgLTQsICA4LCAtNCwgLTEsICA5LCAxNywgIDYsIC03LCAgNSwgLTEsIDExLCAgNiwgLTQsICA3LAorICAgICAgLTIsICA0LCAgMSwgLTMsIDExLCAgMywgIDMsIC05LCAgNiwgIDAsIC0yLCAtNCwgLTUsICA0LC0xMiwtMTEgfSwKKyAgICB7IDE1LCAyNCwtMTQsICAyLCAgNiwgMTcsIDI2LCAgNSwgIDgsIDExLCAtOSwgLTcsIC02LCAtOCwgIDMsIC01LAorICAgICAgIDksIDEwLCAtMywgMTAsICAwLCAgMSwgIDQsIC05LCAgNCwgIDksICAzLCAgMCwgIDQsICAwLCAtNSwgIDMgfSwKKyAgICB7ICA5LCAzNiwgLTksIC04LCAgNywgIDcsICA0LCAgMywgLTEsLTE2LCAtMiwgIDcsIC01LCAtNiwgIDYsIDEyLAorICAgICAtMTEsLTEyLCAgOSwgLTEsIC0zLCAtOSwgMTIsICA2LCAtNiwgIDIsICAyLCAgNSwgIDAsICA1LCAgNiwgLTYgfSwKKyAgICB7IDI1LCAzOSwgLTUsIDI0LCAgMywgMTAsICAzLCAtNiwgMTMsIC04LCAgMywgLTcsICAyLC0xMCwgLTUsICAyLAorICAgICAgLTIsICAzLCAgNSwgLTIsICAxLCAgNSwgLTIsICAzLCAtNCwgIDEsIC01LCAtNCwgIDAsICAxLCAtMiwgIDAgfSwKKyAgICB7IDE2LCAyNywgLTEsICAwLC0xNCwgIDYsICA0LCAtNSwgIDcsIC0yLCAtNiwgIDAsIC0zLCAtNSwgIDIsIC0xLAorICAgICAgLTEsLTE5LCAgNSwgLTgsICAwLCAxMSwgMTIsICA1LCAgMCwgIDMsIDEwLCAgNiwtMTQsIDE0LC0xMywtMTUgfSwKKyAgICB7IDEyLCAyMywtMTQsICAyLCAgMSwgIDQsIC0zLCAxNiwgIDcsIC04LCAgMiwgLTgsICA4LCAgNiwgLTgsIC03LAorICAgICAgLTMsICAwLCAgMiwgIDgsLTEzLCAgNywgMTMsIC02LCAtNCwgIDYsLTEzLC0xNiwgMTQsIDExLCAtNywgIDUgfSwKKyAgICB7IDE2LCAyOCwgLTcsIC0xLCAgNiwgLTMsICA5LCAgMCwgLTcsICAzLCAgMCwgIDMsLTEyLCAyMCwgIDgsICA5LAorICAgICAgIDgsIDIzLCAgOCwtMTMsIC0yLCAgNCwgIDksICAzLCAtNSwgMTMsICA1LCAtMiwgMTIsIDE0LCAgNSwgLTEgfSwKKyAgICB7IDE5LCAzNywgMTksICA1LCAgNywgIDUsIDEwLCAgNSwgMTksIDEwLCAxNCwgIDAsICAyLCAgNSwgIDEsIC00LAorICAgICAgLTQsICAyLCAgMiwgLTUsIC0yLCAtMSwgIDIsIC02LCAtNCwgLTQsIC01LCAtMywgIDIsIC0yLCAtMiwgLTIgfSwKKyAgICB7IDI0LCAyMSwgIDEsLTExLC0xMCwgMTcsLTE0LCAxNCwgIDYsIC0xLCAtNiwgLTEsICAwLC0xMywgLTEsLTEyLAorICAgICAgLTIsIC01LCAgNiwgLTQsLTEyLCAxNCwgIDUsIC0yLCAtOCwgLTgsIDE1LCAtNywtMzAsLTEyLCAgNCwgIDAgfSwKKyAgICB7IDExLCAyNiwgLTMsICAzLCAgNSwgLTEsIC0yLCAgMywgLTIsIDEwLCAxNSwgLTQsIDEwLC0yOCwgMTAsLTE3LAorICAgICAgLTgsICAxLCAgMiwgLTcsIC0xLCAtNiwtMTUsIC0xLCAgNCwgIDUsIC03LCAgOSwgIDAsIC01LCAtNCwgIDQgfSwKKyAgICB7IDE4LCAzMiwgIDEsICAyLCAtNywgIDQsIDE1LCAgMiwgLTksIC0yLCAxMiwtMTEsICA3LCAxMSwgMTMsICAyLAorICAgICAgIDAsICA1LCAgOSwtMTAsIDE2LCAgMywgLTMsICA1LCAtOSwtMjMsICAyLCAtMiwgLTEsICA1LCAgMiwgMTEgfSwKKyAgICB7IDM1LCAyNCwtMjAsICAyLCAgNCwgLTEsICA1LCAxNCwtMTAsIC05LCAgOCwgLTcsICAwLCAgNSwgLTcsIC03LAorICAgICAgMTEsICAxLCAgNSwgIDMsICAyLCAgMCwgLTIsICAzLCAgMCwgIDEsICA0LCAgMCwgLTIsIC04LCAgMCwgLTQgfSwKKyAgICB7ICA5LCAzNSwgLTEsICAyLCAtMSwtMTksIC0zLCAxMiwgLTEsICA4LCAgOCwtMTMsIC0xLCAtMiwgIDIsICA1LAorICAgICAgLTgsIC0xLCAxMywgLTIsIDExLCAgMSwgIDAsLTEwLCAgMCwgLTMsIC03LCAgMiwgIDEsLTEyLCAgMywgMTIgfSwKKyAgICB7IDIwLCAyNywtMTIsLTEyLCAgNywgIDQsIC0xLC0xMywgLTEsIC05LCAgMiwgMTMsLTExLCAgNSwgIDcsIC05LAorICAgICAgIDksICAxLCAgMSwgIDgsIC05LCAgMCwgLTYsICA3LCAgNCwgIDIsIC0yLCAgNywgIDMsIC0yLCAgMSwgLTkgfSwKKyAgICB7ICA4LCAzNywtMjAsIC01LCAgMCwtMjEsIDEwLCAtOCwgIDMsIDE5LCAtOSwgIDcsIC0zLCAtOCwgMTAsIC0yLAorICAgICAgIDAsICA1LCAgNiwgLTQsIC0yLCAtMSwgIDAsIC03LCAgNiwgIDEsICAwLCAgNCwgLTUsICA2LCAtOCwgIDIgfSwKKyAgICB7ICA4LCAyNywgIDEsIC0zLCAtNSwgIDEsICA2LCAgMCwgMTUsICAyLCAxNywgLTEsICAzLC0xNywgMTAsICA1LAorICAgICAgIDUsIC02LCAtNiwgIDYsLTEwLCAxOCwgLTUsICAwLCAgMCwgMTMsICA3LCAxMCwgLTUsIC02LCAtMiwgLTQgfSwKKyAgICB7IDE0LCAyOSwtMjAsIC00LCAtMywgIDEsIC01LCAtMSwgIDIsIDEyLC0xMCwgLTMsICA0LC0xOCwgIDQsIDE0LAorICAgICAgLTQsIC0xLCAtOSwgMTUsIC0yLCAgMiwgLTUsIC0zLCAgMiwgIDksIC0yLC0xNCwgLTMsICA0LCAtNCwgLTcgfSwKKyAgICB7IDIzLCAyMywtMjMsLTExLCAyNywgIDQsICA0LCAtMSwgIDcsICAwLCAtNSwgIDksICAyLC0xMSwgIDMsICA3LAorICAgICAgLTIsIC01LCAgMiwgLTcsIC03LCAxMywgLTMsIC02LCAgMiwgIDMsICAzLCAtNCwgLTEsIC04LCAgNSwgLTIgfSwKKyAgICB7IDE2LCAyNiwgLTYsICA4LCAtOSwgLTEsIC0yLCAtMSwgLTgsICA0LCAtMiwgIDAsLTEyLCAgOSwgLTEsICAwLAorICAgICAtMTcsIC05LCAzMCwgLTUsLTE1LC0xNiwtMTMsICAwLCAxMCwtMTEsIC03LCAtMywgLTEsICAwLC0xMSwgLTIgfSwKKyAgICB7IDEyLCAzMiwgLTQsIC01LCAxMCwgMTksLTEwLCAgNCwtMTIsICA1LCAtNiwgIDksLTEyLCAtNiwgLTYsIC04LAorICAgICAgIDQsICAxLCAgMywgIDAsICA4LCAgMCwgLTMsIC00LCAtNywgLTQsIDEwLCAgOCwgIDYsICA1LCAtMSwgIDQgfSwKKyAgICB7IDQ2LCA0MiwgLTMsLTE0LCAtMiwgLTYsICA2LCAtMiwgLTUsIC0xLCAtMywgLTMsICAxLCAtMSwgIDMsICAxLAorICAgICAgIDEsICA0LCAtMSwgIDIsICAzLCAgMSwgLTIsICA2LCAgMCwgLTEsIC0yLCAgNCwgLTIsIC0xLCAgMiwgIDIgfSwKKyAgICB7ICA5LCAzMywtMTMsICA0LC0xMSwgIDMsIC04LCAyMiwgMTIsIC0yLCAgNCwgIDAsLTE2LCAgNSwgIDQsIC0xLAorICAgICAgIDcsIC02LCAtOSwgIDEsICA3LCAgNSwgIDAsIC01LCAgNSwgLTEsIDEwLCAgMywgLTIsIC0xLCAgMywgLTIgfSwKKyAgICB7ICA5LCAzMCwgIDYsIC0zLCAgNiwgIDEsIC03LCAgNSwgMTEsIDE0LCAgNywgIDEsICAwLCAgMiwgIDIsIC0xLAorICAgICAgIDgsICA3LCAtNiwtMTMsLTEwLCAtMiwgIDEsIC02LCAxMCwgIDcsICA2LCAgNSwgLTIsIC01LCAtMSwtMTYgfSwKKyAgICB7ICA5LCAyOCwtMTEsLTEwLCAgOSwtMTAsIDE1LCAgOCwgIDQsICA5LCAtNCwgLTcsICAwLCAtNSwgIDksICA4LAorICAgICAgLTcsICAyLC0xNSwtMjMsICA0LCAtNCwgIDQsIDE2LCAtOCwgLTMsICAwLCAtOCwgMTQsICA1LCAtMywgMTUgfSwKKyAgICB7IDE3LCAyNiwgLTUsIC01LCAtMSwgLTgsIDIwLCAxOCwgLTcsIC0yLCAgNCwgLTcsIC04LCAtNSwgLTQsIDE2LAorICAgICAgIDAsICAwLCAtNywgLTIsLTEzLCAtNSwgLTIsICAzLCAxMiwgIDEsICAzLCAtNSwgIDIsICAyLCAgMCwgLTEgfSwKKyAgICB7IDExLCAzNywgIDcsLTIzLCAgNiwgLTEsIDE1LCAxMywgIDQsIC05LCAgNywgIDUsICAzLCAtMywgLTUsIC04LAorICAgICAgLTIsICAzLCAtNSwgLTEsIC04LCAgNywgIDIsIDEzLCAgMSwgIDMsICAwLCAtMywgLTEsICAyLCAgMCwgLTIgfSwKKyAgICB7IDIxLCAzMywgIDcsIDIwLCAyMSwtMTAsICA2LCAtNSwgLTUsIC02LCAtOSwgIDIsIDEwLCAgMCwgIDgsIC00LAorICAgICAgMTAsICAyLCAtMiwgLTIsICAwLC0xMCwgLTYsIC0yLCAgMCwgLTUsICAzLC0xMSwgIDMsIC05LCAtMywgIDEgfSwKKyAgICB7ICA2LCAzMCwtMTUsIC04LCAxNiwgIDEsICA0LCAgNiwgIDQsICA1LCAgOCwgLTMsICA4LCAtOSwgLTEsIC02LAorICAgICAgIDgsICAyLCAtMiwgIDQsIC0yLCAgNSwgMTEsLTIxLCAgMywtMTAsIDE2LC0xMSwgMjQsIDEwLCAxNCwgLTYgfSwKKyAgICB7IDE1LCAzNiwgLTMsIC05LC0yMCwgMTIsICAwLCAtNywtMTgsIC00LCAtOCwgLTksICA5LCAtNywgLTMsIC0xLAorICAgICAgIDIsICA3LCAtNSwgLTgsICA2LCAgMiwgIDIsIC0xLCAgNywgIDEsICAxLCAtMywgIDMsIC00LCAtOCwgIDEgfSwKKyAgICB7IDE2LCAzNCwgMjEsICAzLCAtOSwgMTAsICA3LCAgOSwgLTcsICAxLCAtNCwgLTksIC00LCAtNSwgLTUsICAzLAorICAgICAgIDMsLTE5LCAgMSwgIDUsICA0LCAtMiwgLTYsIC01LC0xMCwtMTEsIC04LCAtMiwgIDIsIC01LCAtOCwgLTcgfSwKKyAgICB7IDI4LCAyOSwgLTMsIDE4LCAtMiwgIDAsIC02LCAxMiwgLTIsIDEwLC0xMSwgLTQsLTEzLC0xMiwgLTYsIC00LAorICAgICAgIDAsICA0LCAtMSwgLTgsICA2LCAgNCwgMTIsIDExLCAxMCwgMTAsIC0zLCAtNiwgIDEsICAyLCAgMSwgIDcgfSwKKyAgICB7ICAzLCAgOCwgMjIsIC04LCAgMywgMzYsIC04LCAtMSwgIDksICA2LC0xMywtMTQsICA4LCAtMSwgIDEsICAyLAorICAgICAgLTIsIC04LCAgMCwgIDMsICAxLCAgMiwgLTEsICA1LCAtMSwgLTgsICAwLCAtMiwgIDIsICAyLCAtMSwgIDEgfSwKKyAgICB7ICAwLCAgNiwgIDAsICAwLCAgNCwgMTMsIC03LC0xNiwgLTYsIDE1LC0xNCwtMjEsIC05LC0xMCwtMTAsIC02LAorICAgICAtMjEsICA1LCAgNCwgIDIsIDEyLCAgNCwgMTIsIDExLCAtNCwgLTYsIC02LC0xMCwgLTcsLTE4LCAgMSwgIDQgfSwKKyAgICB7IC0xLCAgMywgMTAsICAxLCAtMSwgMTUsICA0LCAtNywtMTYsICAzLCAgMCwtMjIsIDEwLCAgMiwgLTMsIC0yLAorICAgICAgMTMsICA1LCAtOCwgMTYsIC01LCAgNCwgIDAsLTExLC0xMCwtMjIsICAwLCAtNCwtMTcsICA1LCAgMiwgIDEgfSwKKyAgICB7IDEyLCAgOCwgLTQsIC05LCAxNCwgNDAsLTIxLCAgMCwgIDEsLTE1LC0xMCwtMTIsIDEyLCAgNiwtMTAsICAyLAorICAgICAgIDgsICA2LC0xMiwtMTAsLTExLCAgMSwgIDAsLTExLCAgMiwgIDEsIDEzLCAgMCwgIDYsICAzLCAgOCwgIDQgfSwKKyAgICB7LTEwLCAgMywgIDUsIC00LCAtMywgIDMsICAwLCAtOSwgIDIsICA4LC0yMiwtMjMsIDE3LCAgOCwtMTcsIC0zLAorICAgICAgMTQsIC04LCAtNCwgIDEsIC04LCAgMywgIDAsICA1LCAtMSwgLTMsIC0yLCAtNCwgIDEsLTEwLCAgMCwgLTIgfSwKKyAgICB7ICAwLCAtMSwgIDUsIC03LCAgNCwgMTIsIC0yLCAgMCwgLTcsICAyLC0xNiwtMTUsIDEyLCAyMSwgLTcsIC00LAorICAgICAgIDcsIC03LC0xMSwtMTUsIC03LCAtOSwgLTUsIC04LCAgMCwgLTYsICA4LCAtMywgLTgsIDIyLCAtNywgLTkgfSwKKyAgICB7ICA3LCAxOSwgIDQsIC05LCAyNCwgMjIsICAyLCAtNiwgIDgsIDEzLC0xNCwtMjAsIC00LCAxMSwgIDgsIC00LAorICAgICAgLTEsICAyLCAgMCwgLTcsICA1LC0xNywgLTMsICAzLCAtNiwgIDUsICAzLCAgNCwgLTUsIC03LCAtMywgMTQgfSwKKyAgICB7IC0yLCAgNiwgIDIsICA4LCAtMiwgIDUsIC00LCAtMiwtMTAsICAzLC00NSwtMzAsIC0zLCAtMywtMTIsIC00LAorICAgICAgLTMsIC0zLCAtMSwgIDksIC02LCAtNiwgIDUsIC00LCAgMCwgIDUsIC0xLCAtMiwgLTEsICAwLCAtNiwgLTEgfSwKKyAgICB7IC0zLCAxNCwtMTYsLTEwLCAxMCwgIDAsIC0yLC00MCwgLTksIDEyLCAgMiwtMTksIDE1LCAtNCwgIDQsICAzLAorICAgICAgIDMsIC00LCAgNywgIDEsIC00LCAtNSwgIDAsICA0LCAtMSwgIDAsIC05LCAtMiwgLTQsIC0xLCAtMiwgIDAgfSwKKyAgICB7ICA3LCAxNiwgIDIsIC03LCAgOCwgIDIsICAwLCAgMSwgIDUsIDIxLC0xMCwtMjYsICA3LCAgMiwgLTksIC03LAorICAgICAgLTMsLTE2LCAgOCwgIDUsICA1LCAtNiwgMTAsICA0LC0xNCwgLTYsICA1LCAgMywgLTIsIC0yLCAtNCwgIDEgfSwKKyAgICB7IC05LCAxNCwgLTEsICAzLCAgMywgMTEsICAxLCAtNSwgLTMsIDEzLC0xNiwtMTgsIDIwLCAgNiwgLTUsICAwLAorICAgICAgLTMsICAyLCAgOCwgIDQsLTE5LCAtOSwgMTIsICAwLCAtOCwgIDIsICAyLCAgMSwgIDYsIDEzLCAtNywtMTEgfSwKKyAgICB7ICAyLCAgNSwgMTYsIC00LCAxOSwgMTUsICA0LCAgMCwtMTEsICA3LC0xMCwtMTAsLTE2LCAxOCwtMTEsLTEyLAorICAgICAgLTksIC00LCAgNywgLTQsIC00LC0xNywgIDEsICAxLCAtOCwgLTMsIC0zLCAgNSwgLTIsIC02LC0xMSwgLTUgfSwKKyAgICB7ICAyLCAxMiwgIDAsIC05LC0xMCwgMTQsICA2LCAgMiwgLTMsICAyLC0xMiwtMjgsIDEyLCAgMSwgLTEsICAyLAorICAgICAgIDAsIC0zLCAtNCwgIDcsIDE2LCAgNSwgLTcsICA4LCAtNCwgLTMsIC0xLCAgMywtMTIsICA0LC0xNywgLTUgfSwKKyAgICB7IC00LCAgNywgMTEsICA2LCAgMSwgMTQsIC00LCAtNiwgIDUsICA1LCAtNiwtMjQsIDIzLCAtOSwtMTUsIDEzLAorICAgICAgLTcsIC05LC0xNSwgMTAsIC0xLCAgOCwgLTUsICAxLCAxMiwgIDYsICAyLCAgMCwgIDQsIC0yLCAgOSwtMTAgfSwKKyAgICB7ICAxLCAgNSwgMTEsICAzLCAgNiwgMTIsIC0zLCAgOCwtMjEsICA1LCAtNywtMjAsIDEyLCAtMiwgLTksIC0zLAorICAgICAgMTcsIC03LCAtOCwgLTksLTE0LCAgMywtMTMsIDE4LCAtOCwgIDksICAyLCAtOCwgIDQsIC04LCAtNSwgLTIgfSwKKyAgICB7IC0zLCAtMywgLTEsICA1LCAtMiwgMTUsICAzLCAgMiwgIDEsIC04LCAgMSwtMzksIC02LCAxMywtMTMsICAwLAorICAgICAgLTIsIC01LCAtNiwgLTMsICAwLCAtNSwgLTIsIDE1LCAtOSwgIDUsIC0zLCAtNiwgLTIsICA3LCAgMCwtMTMgfSwKKyAgICB7ICAyLCAgOCwgIDUsLTEyLC0xMywgMjIsICA4LC0xNiwgMTEsICA1LCAtMiwtMzIsIC0yLCAtNCwgMTEsICA1LAorICAgICAgIDUsIC02LCAgMSwgIDMsICAxLCAgNSwgIDMsICA2LCAtNSwgIDQsICA0LCAtOCwgIDgsICA0LCAgMSwgIDMgfSwKKyAgICB7IDEzLCAgOSwgIDUsIC00LCAgOSwgMTgsLTExLCAgMiwgLTEsIDE1LC0xMCwtMTksIC0yLCAxNCwgIDAsLTEwLAorICAgICAgIDEsICAxLC0xOCwgIDMsICAyLCAtNiwgLTgsIDIwLCAgNywgLTgsIDE2LCAgOSwgIDksLTEzLCAtMywgLTIgfSwKKyAgICB7LTEzLCAxMSwgMTEsIC05LC0xMCwgMTMsIC0zLC0xOCwgIDIsIDEwLCAgNSwtMjEsICA2LCAxNSwtMTEsLTIxLAorICAgICAgIDMsIDE0LCAgMCwtMTIsICA5LCAtMSwgLTIsIC00LCAgMywgLTMsIC05LCAtOCwgLTUsIC0yLCAtOCwgIDIgfSwKKyAgICB7ICAzLCAgMywgMTEsICA0LCAgMCwgMTMsICAxLCAtOCwgMTAsIDEzLCAtNiwtMjYsICAyLCAxMiwgLTMsIC01LAorICAgICAgMTIsIC0yLCAgMSwgIDgsIC03LC0xNywtMTksICA1LCAxMCwgIDcsIC0zLCAgMiwgLTMsICAwLCAgNSwgIDAgfSwKKyAgICB7ICA1LCAgMCwgIDMsIC0zLCAtOSwgIDUsLTE1LCAtNSwgLTUsIDE3LCAtNSwtMzEsICAwLCAxMywgMTMsICA1LAorICAgICAgLTEsIC02LC0xNCwgIDcsIC04LCAgOSwtMTQsIC0yLC0xNiwgLTQsIC00LCAtNiwgIDYsIC02LC0xMCwgIDYgfSwKKyAgICB7IDEzLCAgMywgIDEsICA3LCAtMywgIDQsIC0xLCAtMiwgLTEsICA0LCAtOCwtMzIsIC0xLCAtNCwgIDAsICAzLAorICAgICAtMTAsICA3LCAxMCwtMTAsICA0LCAtMSwgIDYsICAyLC0xNiwgLTksICA0LCAgMywgMTMsLTIzLCAtMywgLTQgfSwKKyAgICB7ICA0LCAxMSwgLTQsIC05LCAgNCwgMTEsLTEyLC0xMiwtMTIsICA2LCAgMSwtMjgsIC0zLCAxNCwgMTgsIC0yLAorICAgICAtMTIsICA3LCAxNSwgLTMsIC01LCAtNywgLTMsICAyLCAtNiwgIDQsICA0LCAtMiwgLTUsIC0zLCAgMiwtMTMgfSwKKyAgICB7ICA4LCAgNywgLTcsICAwLCAxMywgIDcsIC04LCAtNywgIDgsIDM2LC0xMCwtMjIsICAzLCAyMywgLTMsLTEwLAorICAgICAgLTMsIDExLCAgMSwgLTcsICAzLCAgMywgLTEsIC03LCAtNCwgIDIsICAzLCAgMiwgIDUsICAzLCAtNCwgLTEgfSwKKyAgICB7IC0xLCAgMSwgMTMsICAxLCAtNiwgLTEsIC02LCAtOSwtMTgsIDE3LCAtNSwtMzcsIC0xLCAtMSwgLTYsIC00LAorICAgICAgIDEsIC02LC0xNSwgIDIsIDE3LCAtOSwgIDAsIC0zLCAgMCwgIDQsICAwLCAtNSwgIDAsICA0LCAgMSwgLTUgfSwKKyAgICB7ICAwLCAxNCwgIDUsICAwLCAtNywgIDIsIC02LCAxNywgLTYsIC05LCAgNywtMTYsIC01LCAyMywtMTQsLTEzLAorICAgICAgIDgsLTE1LCAxMSwgMTAsLTExLC0xMywtMzMsIC01LCAtMiwgIDEsICA2LCAgOCwgIDAsLTEzLCAtOSwgIDUgfSwKKyAgICB7IDExLCAgNywgLTIsIC04LCAgOSwgMTEsIDI1LC0xNCwgIDcsICAzLCAtMSwtMzMsIDE0LCAgOCwgLTYsLTE5LAorICAgICAgIDMsICAzLCAgMiwgLTEsIC0zLCAtMSwgLTIsLTEwLCAtMywgIDEsICAyLCAgMSwgIDQsICAyLCAtMywgIDQgfSwKKyAgICB7IC0yLCAgOCwgIDQsIC0yLCAgOSwgMTMsIC00LCAtMiwtMTUsIC0zLCAxOSwtMzcsICA5LCAyNSwgLTksICAyLAorICAgICAgLTUsIC0yLCAtMiwgLTQsICA0LCAgMiwgIDIsICAwLCAgMywgIDMsICAzLCAgNSwgLTIsIC0zLCAtNCwgLTMgfSwKKyAgICB7IDEwLCAxMywgLTEsLTE1LCAgNCwgIDYsLTE4LCAtNCwgMjUsICAxLC0yMywtMTcsIDE1LCAxMywgLTgsIC04LAorICAgICAgIDcsICA0LCAtNSwgIDMsICA2LCAgOSwgLTcsICA2LCAgMCwgLTUsICA4LCAgMCwgLTYsIC0xLCAtMiwgLTIgfSwKKyAgICB7ICAxLCAgMywgIDksIC01LCAyNywgMTUsIC05LC0zMSwgLTEsIDIzLCAtMiwgLTksICAxLCAgOCwgLTEsIC03LAorICAgICAgLTIsIC04LCAtNCwgLTQsIC0yLCAtMSwgIDMsICA1LCAgMCwgIDAsIC0xLCAgMSwgLTcsICA3LCAtMywgLTMgfSwKKyAgICB7IC04LCAgNywgIDMsIC02LCAgOCwgIDMsLTExLCAtMiwgMzYsIDE0LCAgMSwtMzAsICA2LCAxMCwtMTIsIC02LAorICAgICAgLTYsIC0yLCAtNCwgLTMsIC01LCAgMCwgIDksICA0LCAtNSwgLTUsIC04LCAxMiwgIDQsIC0zLCAgMSwgLTggfSwKKyAgICB7IC0yLCAgOSwgMzMsICAwLCAxMiwgLTMsIC03LCAtNCwgLTQsIC0xLCAgNiwtMjUsIDExLCAtNiwgLTksLTExLAorICAgICAgLTIsIC00LCAtMiwgIDYsIC0xLCAtMywgLTYsIDE1LCAtNiwgIDMsIDEwLCAtNCwgIDEsICAwLCAgNSwgIDggfSwKKyAgICB7LTIyLC0yMSwgLTksLTE5LCAtNSwgLTcsLTEyLC0xNSwgLTgsICA5LC0xOSwgMTQsIC03LCAtNCwgIDUsIC04LAorICAgICAgLTIsICA3LCAgMSwgLTMsICA0LCAtNCwgIDYsIDExLCAgMiwgIDYsIC0zLCAtNSwgIDIsIC0yLCAgMCwgLTMgfSwKKyAgICB7LTMyLC0xMywgIDMsLTI0LCAgMywgLTgsICA0LCAgMSwtMTAsIDE0LC0xNSwgIDAsICA0LCAgNiwgLTEsICA2LAorICAgICAgIDcsIC0xLCAgNiwgIDQsIC0zLC0xNywgIDEsICA0LCAtNiwgLTEsICAxLCAgMCwgIDMsICAzLCAtNywgLTQgfSwKKyAgICB7LTMyLC0xMSwgIDcsIC04LC0xMiwgMTMsIC01LC0yMiwgLTQsIDEyLC0xNiwgIDIsICAwLCAgNCwgIDAsICAxLAorICAgICAgIDAsICA2LCAtNSwgLTgsICAyLCAgNiwgIDUsICAwLCAtMywgLTYsICA1LCAgNiwgIDUsICA1LCAxMywgLTQgfSwKKyAgICB7LTQ0LC0zMywgIDYsIC00LCAgMiwgIDAsIC05LCAxMCwgIDMsICA0LCAgNywgIDAsIC0xLCAgNywgIDUsICAxLAorICAgICAgIDEsIC0zLCAgMSwgIDYsIC0xLCAgMCwgIDIsICAzLCAtNCwgIDAsICAwLCAgMSwgIDAsIC0xLCAtMiwgLTEgfSwKKyAgICB7LTMwLC0xOCwtMjQsIC04LCAgNSwgIDAsIC0yLCAxNCwgIDcsICAwLCAgMSwgMTIsICA2LCAgNCwgLTksICA3LAorICAgICAgIDUsICA3LC0xMSwgLTUsICAxLCAtOCwgLTEsICAyLCAgMiwgLTksICA3LCAtMSwgIDcsICA1LCAgNiwgIDYgfSwKKyAgICB7LTIyLC0yMCwtMTMsIC05LCAyMCwgLTMsIDEwLCAtOCwgIDYsIC00LCAgMiwgLTcsIDEwLCAgOCwgIDAsIC0xLAorICAgICAgIDIsIC0zLCAgNiwtMTksICAyLCAgNCwgIDMsICAzLCAtNywgIDIsIC0xLCAtNiwgIDEsICAxLCAgNiwgLTIgfSwKKyAgICB7LTI3LCAtOCwgLTEsICAzLCAtMSwtMTEsIDI0LCAgNCwgLTEsICAxLCAtOCwgIDgsICA1LC0xMSwgMTUsIC0zLAorICAgICAtMTUsIC0xLCAtMSwtMTMsIC0xLCAgMSwgLTUsICA1LCAgMiwgIDMsIC05LCAgMCwgIDQsICAzLCAtNywgIDYgfSwKKyAgICB7LTMzLC0xNiwgLTEsIC04LCAxMCwtMjMsICA2LCAxMywgLTEsIC0zLCAtOSwgIDAsICA1LCAtNywgLTUsLTEyLAorICAgICAgLTIsICAzLCAgMywgIDYsIC0yLCAtMywgIDIsIC0zLCAgOSwgLTYsIC0zLCAtMiwgIDAsICA1LCAtMywgLTQgfSwKKyAgICB7LTIyLC0xNywgMTEsIC0zLCAgMywgIDEsIC0xLCAtNSwgMTcsICAyLC0xNSwgLTIsIDEwLCAtOSwgIDYsIDE0LAorICAgICAtMTYsLTEyLCAyMCwgLTEsIC03LCAgNiwgLTMsLTEyLCAgMSwgMTAsLTEwLCAtMSwgIDcsIC0zLCAtMSwgMTAgfSwKKyAgICB7LTI4LC0xMywgIDEsIC0zLCAtMSwgLTEsICAwLCAgMywgIDMsICA1LCAgMSwgMTAsLTEwLCAtMywgIDcsICAyLAorICAgICAgIDQsIDE5LCAtMSwgLTEsIDEwLCAgNSwgLTgsICAxLCAxMSwtMTUsIC00LCAtMywgLTUsICA0LC0xMywgIDMgfSwKKyAgICB7LTIyLC0xMywgNDIsLTIwLCAgNSwtMTMsICA3LC0xMSwgIDEsICAxLCAtMSwgIDEsICA2LCAgMywgIDYsLTExLAorICAgICAgIDMsICAzLCAtMiwgIDAsIC00LCAgNCwgLTMsIC0xLCAtNSwgIDIsICAwLCAgMCwgLTksIC0xLCAgNCwgIDQgfSwKKyAgICB7LTI2LC0xNSwgLTIsIC02LCAtNCwgLTIsIDE2LCAgOCwgMjEsICA4LCAgMSwgLTMsLTEwLCAgNywgLTgsLTEyLAorICAgICAgLTUsIDEyLCAtOSwgIDMsIC0yLCAtMywgMTgsICAxLC0xMiwtMTUsIC00LCAgNSwgLTMsICAwLCAxMiwgIDcgfSwKKyAgICB7LTI2LC0xNiwgIDUsICA2LCAxNCwgLTMsIDE1LCAgNiwgIDEsIC03LC0xMywgMTYsLTE1LCAgNSwgMTEsIC0yLAorICAgICAgIDksIC03LCAtNCwgLTIsICAwLCAgMCwgLTIsICA3LCAtOCwgLTYsIC01LCAgMiwgIDcsIC0zLCAgMiwgMTIgfSwKKyAgICB7LTMxLC0xNywgLTgsLTMwLCAgNCwgMTQsICA2LCAtNiwgIDYsLTExLCAgMCwgIDMsIC00LCAgMCwgIDAsIC00LAorICAgICAgIDAsIC00LCAgMSwgIDQsICAzLCAgNCwgIDAsIC01LCAgMywgIDIsICAyLCAgMCwgIDIsICAxLCAgMywgIDUgfSwKKyAgICB7LTYxLC0xMCwgIDQsIDEwLCAgNCwgIDcsICAwLCAtMywgIDAsICAxLCAgMCwgLTMsICAwLCAgMSwgIDAsIC0yLAorICAgICAgLTEsICAxLCAgMiwgLTIsICA0LCAtMywgIDEsICAxLCAtMSwgIDEsIC0yLCAtNCwgLTQsICA0LCAgMCwgIDAgfSwKKyAgICB7LTI4LC0xMywgLTgsIC00LCAgMywgLTMsICAyLCAgMSwgMTEsIDE0LCAgMywgIDksICAxLCAxMywgIDMsICA1LAorICAgICAgLTMsIC0yLCAtMiwtMTIsLTE0LCAtOSwtMTEsLTE1LC0xMiwgLTUsIC00LC0xMiwgIDMsIC0zLCAgMCwgLTUgfSwKKyAgICB7LTQxLCAgMCwgMTIsLTI0LCAxMywgIDQsICA1LCAxNiwgLTUsIC00LCAgMCwgIDAsIDEzLCAtNCwgIDEsIC05LAorICAgICAgIDksIC02LCAtMSwgIDYsIC0yLCAgNSwgIDIsICA5LCAgNiwgLTksIC04LCAgOCwgLTIsIC0zLCAtNiwgLTQgfSwKKyAgICB7LTI2LC0xOSwgLTIsLTE1LCAgNCwtMTQsICA2LCAgMCwgMjYsIDIwLCAgOCwgIDksICA5LCAgMywgLTQsIC01LAorICAgICAgLTgsICAxLCAgMCwgLTEsICA1LCAgOSwgIDMsICA0LCAgNCwgIDcsICAxLCAgMywgLTIsIC0yLC0xMCwgIDAgfSwKKyAgICB7LTI5LC0xOCwgIDksIC00LCAgMSwgLTUsLTE0LC0xMiwgIDUsLTEwLCAtNSwgIDQsIC01LCAgMCwgLTEsIC0xLAorICAgICAgIDQsIC01LCAgNywtMTYsLTExLCAgMiwgIDcsLTE1LCAgMiwgLTQsICA2LCAtNCwgLTYsICA3LCAtMywgIDcgfSwKKyAgICB7LTI3LC0xNiwgIDksLTE0LCAgMywgLTgsICA5LCAgMCwgIDcsIC00LCAtMywgLTcsICAwLC0xMCwgLTEsICAyLAorICAgICAgIDEsIC0yLCAxNSwtMTAsIDE0LCAgNywgIDYsIDE3LCAgMywgLTQsICAzLC0xMCwgIDgsIC04LCAgMywgMTEgfSwKKyAgICB7LTIxLC0yMCwgLTgsIC04LCAgNCwgIDUsIC0zLCAtMiwgIDAsIC01LCAxNCwtMTAsIDExLCAtNCwgMTMsICAwLAorICAgICAgIDUsLTExLCAxOSwtMTgsIDE4LCAgMywgLTUsIC0zLCAtNCwgLTgsIDExLC0xMCwgMTAsICAzLCAgNCwgLTkgfSwKKyAgICB7LTM1LC0xNSwgMTMsLTEyLCAgNCwgIDAsIC0yLCAtNCwtMTIsIC0zLCAtOCwtMjQsIC03LCAgMSwgIDcsICA4LAorICAgICAgLTMsICAwLCAtMiwgLTEsICAzLCAtMiwgLTIsIC02LCAgOCwgIDEsICAwLCAgMSwgLTYsIC0xLCAgMiwgLTYgfSwKKyAgICB7LTE5LC0xNCwgMTMsLTEwLCAgOSwgLTEsICAxLCAgMywtMTIsICA1LC0xNiwgIDcsIDEzLCAgOSwgIDQsIC00LAorICAgICAgIDYsIC01LCAgNCwgIDksIC0zLCAxNywgLTQsIDEyLC0xMSwgLTYsIC01LCAtNiwgMTMsICAyLCAgNywgLTkgfSwKKyAgICB7LTM0LCAtOCwgLTQsICAxLCAgMiwgLTEsICAzLCAgNiwtMjAsLTExLCAgOCwgLTEsICA0LCAgMiwgLTksICA0LAorICAgICAgLTQsIC01LCAxNiwgMTAsIC00LCAxNCwtMTMsICAxLCAtNiwgIDAsICAyLC0xMCwgIDAsIC0zLCAtMywgIDcgfSwKKyAgICB7LTM2LC0xMCwgLTgsIC0zLCAgMiwgLTIsIDE0LCAtNCwgLTEsIC03LCAtNCwgMTAsIC0xLCAtMywgMTUsLTExLAorICAgICAgIDAsICAyLCAgMywgLTEsICA0LCAgMCwgIDgsIC0xLCAgMCwgMTgsLTExLCAtNSwgMTUsIC01LCAxMywtMTIgfSwKKyAgICB7LTIyLC0xMywgMTQsLTIwLCAxNSwgMjUsIDE2LCAxMCwgIDgsIC0yLC0xMCwgLTUsIC0xLCAtOCwgMTEsICA4LAorICAgICAgLTEsIC0yLCAtNCwgIDEsICAyLCAtMSwgLTcsICAwLCAgMCwgIDAsIC0zLCAgMCwgIDIsIC0xLCAgMCwgIDIgfSwKKyAgICB7LTMxLC0yMiwgIDcsICA2LCAtMiwgIDUsLTIwLCAxNCwgLTYsICA3LCAgMCwgMTQsICAzLCAtNywgIDMsIC02LAorICAgICAgLTIsICAxLCAtMywgLTUsICAxLC0xMCwgIDEsLTI0LCAgNiwgLTIsICAzLCAtNywgIDEsIC03LCAgOCwgIDcgfSwKKyAgICB7LTI1LC0yMCwgLTMsIC05LCAxMCwgIDYsIDEyLCAgNywgIDUsICA0LCAtMywgIDYsIC0xLCAtNSwgLTYsIC04LAorICAgICAgIDMsICA1LCAgNiwgIDUsLTEwLCAxMCwgLTQsLTE1LC0xNSwgLTIsIC05LCAgMiwgMTgsICAxLCAgOCwgMTIgfSwKKyAgICB7LTI0LC0xOSwgLTIsIC00LCAtNywgMTEsICA2LCAgOSwgMTYsICAyLCAtNywgMTgsICA2LCAtNywgIDYsICA2LAorICAgICAgLTIsIC05LCAgMywgMTIsIC0yLCAgMywgLTEsICA2LCAgNywgIDgsICAwLCAgOCwtMTEsICA4LCAgNCwgIDIgfSwKKyAgICB7LTI2LC0yMCwtMTIsLTEyLCAtMiwgLTMsICAxLCAtNSwgLTEsIC0yLCAgMCwgIDMsICA3LCAgOSwgLTIsICAyLAorICAgICAgIDksIDIyLCAxMywgIDQsIC00LCAtMSwgLTIsLTE0LCAgNSwgMTUsIC04LCAtNSwgLTcsLTExLC0xNCwgLTYgfSwKKyAgICB7LTIxLC0xOCwgLTEsIC00LCAgMCwgIDMsICA3LCAtMiwgMTAsICA4LCAtOCwgLTEsIDE1LCAgMSwgLTksICAzLAorICAgICAgIDEsICAzLCAtNSwgLTIsICAyLCAgNCwgIDAsIC0xLCAxMCwgIDIsLTE5LCAtOCwgIDgsIDMwLCAtNywgIDggfSwKKyAgICB7LTI1LCAtNiwgMjYsICA0LCAtOCwgIDQsIC0yLCAyMSwgIDUsIC00LC0xNiwgIDUsIDEzLCAgNCwtMTAsIC0xLAorICAgICAgLTYsIC0yLCAgMiwtMTAsLTEzLCAgMSwgIDMsIC0zLCAtNiwgLTgsICAyLCAxMSwgIDEsIC03LCAgMCwgIDUgfSwKKyAgICB7ICAwLCAtMSwgLTIsIDE5LC0xMiwtNDgsIC02LCAxMSwgIDgsIC0yLCAtNCwgLTIsIC03LCAgNSwgLTMsICAyLAorICAgICAgLTIsIC0xLCAtMSwgLTcsICAwLCAtMywgLTMsIC00LCAtNCwgIDQsICAxLCAgMywgLTMsIC0xLCAtMiwgLTUgfSwKKyAgICB7LTExLCAtOCwtMjgsIDE4LCAxNiwtMjQsIC04LCAxOSwgIDQsICA4LC0xMiwgIDksIC00LCAtMiwgIDQsIC03LAorICAgICAgIDYsICAyLCAgMywgIDMsIC00LCAgMCwgIDEsIC02LCAtNCwgLTIsICAyLCAgNiwgIDAsIC0zLCAgMSwtMTYgfSwKKyAgICB7IC05LCAtNSwtMjYsICA3LCAtMywtMzcsLTE2LCAtMiwgIDIsIC03LCAgNCwtMTMsICAwLCAtNCwgLTYsIC01LAorICAgICAgLTYsIC00LCAgMCwgIDMsICA0LCAtMywgLTQsIC00LCAgNCwgLTMsICA5LCAtNCwgLTIsICAyLCAgNywgLTQgfSwKKyAgICB7ICAyLCAgOSwtMTgsICA3LCAyOSwtMjQsIC0xLCAgNywgMTQsIDEwLCAgMywgLTMsIC0yLCAtNSwgIDYsLTEwLAorICAgICAgLTYsIC0zLCAtOCwgIDAsICA1LCAgMSwgIDQsICAzLC0xMiwgIDIsICA2LCAgMSwgIDMsICA0LCAgMSwgLTMgfSwKKyAgICB7LTIwLCAgMiwgIDgsIDIwLCAtOSwtMjQsIC00LCAxOCwgIDMsIDExLCAtMSwtMTEsICA2LCAgOSwgLTEsIC0zLAorICAgICAgIDEsIC0xLC0xNSwgIDMsIDE1LCAgOSwgIDMsICAyLC0xMywgIDIsIC04LCAgOCwgIDEsIC0xLCAgMSwgLTggfSwKKyAgICB7LTEyLCAgNSwtMTEsICA2LCAxOSwtMjYsLTE3LCAtNiwgIDQsIDE0LCAgNiwgLTgsICA5LCAgNSwgLTYsIC01LAorICAgICAgIDIsIC0xLCAyMCwgIDEsLTExLC0xMCwtMTgsIDIwLCAtNywgIDAsIC0zLCAgNCwgIDIsICAwLCAxMCwgIDQgfSwKKyAgICB7LTE1LCAgMSwgLTIsIDEzLCAtOCwtMjEsLTIyLCAgNCwgIDQsICAzLCAgMywgLTcsLTMxLCAgNCwtMTAsLTE0LAorICAgICAgIDAsICA4LCAgNCwgIDUsICA4LCAxMSwgIDIsIC04LCAgNiwgIDcsICAwLCAtMiwgIDYsICA4LCAgOCwgIDcgfSwKKyAgICB7LTEzLC0xMCwgLTksIDEyLCAxOSwtMTYsIC0zLCAtMiwgIDksICAyLCAxMSwtMjksIC0xLCAgOSwgIDQsIC0zLAorICAgICAgIDEsLTEwLC0xMCwgMTYsICAxLCAgNywgLTcsIC02LCAtNCwgLTEsIC01LCAgMywgIDYsICAwLCAgMywgIDEgfSwKKyAgICB7LTE3LCAtMSwgLTUsIDE5LCAxMiwgLTksLTIxLCAtNSwgIDIsIDEyLCAtNywgLTcsIC0zLCAgOCwgIDcsIC0yLAorICAgICAgIDYsIC05LCAtOSwgIDEsIC00LCAgMSwgIDEsICAzLC0xNCwgIDIsIC04LCAgMCwgMTAsICAxLC0xMiwgLTYgfSwKKyAgICB7LTEzLCAtNSwgIDgsIDE1LCAgMCwtMjAsIC0yLCAyMCwgIDgsIC04LCAgOCwtMTksIDEyLCAxMCwgIDIsLTExLAorICAgICAgIDAsIDEyLCAgMSwtMTEsICAwLC0xMSwtMTUsICA1LC0xMSwgIDIsICA0LCAtNCwtMTEsICA1LCAtNCwgLTUgfSwKKyAgICB7ICAzLC0xMSwgLTcsICA4LCAgMCwtMTcsLTI2LCAxNSwgMTksIC03LCAxMCwgLTksIC01LCAtNSwgMTQsLTI1LAorICAgICAgIDAsIC04LCAgMiwgLTksIC0zLCAgOSwgIDEsIC02LCAgNCwgLTQsICAzLCAtOSwgLTEsICA2LCAgMiwgIDIgfSwKKyAgICB7LTEyLCAgNSwgIDUsICA5LCAxNCwtMTgsLTE5LCAgNCwgIDIsIDE2LCAxNCwtMjEsLTE1LCAtOSwgLTEsIDE2LAorICAgICAgMTIsLTExLC0xMCwgLTUsIC03LCAgNCwgMTUsIC04LCAtNSwgLTEsICAxLCAxNCwgMTMsIC03LCAtMSwgLTQgfSwKKyAgICB7LTEwLCAtNSwgLTEsICA4LCAgNywtMjMsLTEwLCAxNCwgIDYsIDExLCAxMCwtMTYsIC0zLCAxNiwgIDYsICAwLAorICAgICAgIDAsICA5LCAgNiwgLTIsIC03LCAgMSwgMjIsICA1LCAgMywgLTgsICAwLCAgMywgLTIsLTEwLCAgMywgIDAgfSwKKyAgICB7IC0yLC0xNCwgIDIsIDE2LCAxNSwtMTcsLTE3LCAgNiwgMTksICA0LC0xMCwtMTUsIC0xLCAxNSwgMTEsLTE0LAorICAgICAgLTgsICA1LCAgOCwgIDgsIC0yLCAtOCwtMTEsIDEwLCAxMCwgLTgsLTE0LCAgMiwgMTMsICA0LCAtMiwtMTIgfSwKKyAgICB7LTEwLCAgMywgIDYsICA0LCAxOSwtMjMsLTE5LCAgMSwgIDQsIC05LC0zMCwgIDMsIC02LCAxOCwgIDAsICAyLAorICAgICAgIDAsLTExLCAgMCwgIDMsICA3LCAtMiwgIDgsICA1LCAgMiwgLTMsICA2LCAtOSwgIDEsIC00LCAgNywgLTYgfSwKKyAgICB7ICA5LCAgNSwgLTIsIDIxLCAyMCwtMzMsLTEzLCAgNywtMTAsICA4LCAgOCwtMTUsIC02LCAtNCwgIDEsICA1LAorICAgICAgIDMsICA3LCAtMiwgLTksIC0xLCAgNCwgLTYsICAxLCAgMCwgIDksIC0xLCAtNSwgIDIsICAxLCAtMywgIDMgfSwKKyAgICB7IC05LCAtMywgIDMsIDE1LCAtMywtMzAsIC03LCAtNywtMjUsICA2LCAgMiwgLTYsICAxLCAxOSwgIDEsLTEyLAorICAgICAgIDEsIC04LC0xMywgIDksIDEzLCAgMSwgIDgsICAyLCAgNSwgMTUsIC0yLCAgMywgLTksICAwLCAtNCwgIDQgfSwKKyAgICB7IC02LC0xMiwtMTcsIDI1LCAyMiwtMTMsLTEwLCAgOSwgIDIsIDExLCAtNywtMTYsICA0LCAgNiwgIDEsICAwLAorICAgICAgIDAsIDE4LCAtNCwgLTUsICA0LCAtMiwgLTEsIC01LCAgMCwgLTQsICA2LCAgMSwgIDYsIC0xLCAgNywgIDAgfSwKKyAgICB7IC0xLCAgMCwtMTAsICA4LCAgOCwtMjcsICAwLCAtMiwgMjksIDE2LCAtMiwgLTQsICA5LCAtMSwgIDIsICAwLAorICAgICAgIDYsIDEwLCAgNiwgIDQsICAyLCAtNywgIDksLTE4LCAgMywgIDMsICAzLC0xMCwgMTcsIDEwLCAgOSwgLTYgfSwKKyAgICB7IC0zLC0xMiwgLTYsIDExLCAyMCwtMzIsICA1LCAyMSwgIDMsIC00LCAtOSwgIDIsLTEwLCAgMSwgIDcsIC00LAorICAgICAgIDUsICAwLCAgMCwgLTEsIC04LCAtOSwgLTcsICA0LC0xMCwgIDUsICAwLCAgMiwgLTUsICA0LCAgOSwgIDEgfSwKKyAgICB7IC01LCAtMSwgLTUsICAxLCAgMiwtMTksLTEzLCAgMSwgIDYsIDEyLCAgMiwtMTYsLTE3LCAxMSwgMTAsIDEzLAorICAgICAgMTYsLTEyLC0xMSwgIDMsIC02LCAgMCwgIDYsICA0LCAtMywgIDEsICA4LCAgMiwgIDUsLTExLCAgMywtMTQgfSwKKyAgICB7LTE5LCAgNSwgMTAsIDExLCAgMiwtMjMsIC05LCAxNiwgLTIsICA3LCAgMCwtMTEsIC03LCAxMCwgIDYsIC03LAorICAgICAgMjYsLTE1LCAtNCwgIDgsICA2LCAtNCwgIDcsIC05LC0xNSwgIDEsICA4LCAtNCwgIDQsICAyLC0xMiwgMTYgfSwKKyAgICB7LTExLCAgMSwgMTEsIC00LCAgMSwtMzEsLTEzLCAtMSwgIDgsICA1LCAgNCwgLTIsICAwLCAxMywgIDcsLTE3LAorICAgICAgIDcsLTEwLCAtNiwgIDEsICA0LCAtMSwgIDIsIC05LCAtNCwgIDksICAzLCAgMywgLTQsIC01LCAgMywgIDQgfSwKKyAgICB7IC0zLCAgMSwgMTAsIC0xLCAgMCwtMTUsLTIyLCAgNCwgNDAsLTExLCAtNCwgLTMsLTE0LCAgOSwgMTEsIC0xLAorICAgICAgIDksIC0xLCAtNiwgIDYsICAzLCAtNiwgIDAsICAwLC0xMiwgIDcsIC0yLCAgMCwgIDksICAzLCAgMSwgIDMgfSwKKyAgICB7IC0xLCAtMSwgLTEsIDE0LCAgOCwtMjQsLTE0LCAtOCwgIDUsICA4LCAgNSwtMTIsLTE3LCAgOCwgIDIsICA3LAorICAgICAgMTAsIC04LCAgMCwgIDQsIC02LCAtNiwtMTAsICA4LCAgNCwtMTIsICAzLCAtOSwtMTIsICA1LCAgNCwgLTMgfSwKKyAgICB7IC01LCAgMSwtMTEsICA4LCAgOSwtMjQsICAwLCAgMiwgIDIsIDE0LC0xMiwtMTMsICAxLCAgNiwgIDcsICAwLAorICAgICAgIDcsIC02LCAgOSwgMjYsIDExLC0xNCwgIDgsIDEwLCAgMSwgIDksICAwLCAxMSwgLTIsICA2LCAgMiwtMTAgfSwKKyAgICB7LTEzLCAgMSwgIDQsIDM0LCAxOSwtMTcsLTE1LCAgMCwgIDMsIC0yLCAtNywgLTEsICAwLCAtMywgLTMsIC0xLAorICAgICAgIDEsIC0xLC0xMCwgIDgsICA1LCAgMCwgLTgsICA0LC0xNywgIDksIC0yLCAgMCwgIDAsICA2LCAgMiwgLTMgfSwKKyAgICB7IC02LCAtNCwgIDEsICAyLCAgMiwtMTQsLTI5LCAgMCwgIDksIDM0LCAtMywgLTUsLTE0LCAgNiwtMTAsIC05LAorICAgICAgLTUsIC0xLCAgMCwgIDMsICAzLCAgMCwgIDEsIC0xLCAtMiwgLTEsIC0xLCAtMywgLTMsIC00LCAgMywgLTMgfSwKKyAgICB7IC00LCAgNiwgIDMsIDE0LCAxNCwgLTgsLTI5LCAzMSwgMTEsIDE0LCAtNCwgLTUsIC02LCAxMCwgIDYsIC05LAorICAgICAgLTEsLTExLCAtNywgIDEsICA3LCAgNCwgIDEsIC02LCAgNCwgIDAsIDEwLCAtNywgLTUsIC0xLCAgMiwgIDQgfSwKKyAgICB7IC00LCAtNCwgLTIsIDE0LCAgNiwtMzIsIC02LC0xNCwgMTQsIC01LC0xMSwgMTAsLTE4LCAtNCwgIDYsIC04LAorICAgICAgIDksICA1LCAtNCwgIDEsIC00LCAgNSwgLTIsIC05LCAgMywgIDUsICAyLC0xMCwgLTYsLTE3LCAgMywgMTcgfSwKKyAgICB7LTE2LCAgOSwgMjEsIDE5LCAgNCwtMjAsLTE3LCAxNCwgIDksIDE1LCAtNiwtMTcsIC0xLCAgMSwgIDYsIC0zLAorICAgICAgIDEsICAxLCAgOCwgLTMsIC02LCAgNiwgIDksICA0LCAgOSwgLTksIC01LCAgMSwgLTEsICAwLCAtMSwgIDIgfSwKKyAgICB7IC03LCAtNSwgIDMsIDE5LCAgMSwtMjAsIC05LCAxNCwgMjEsIC03LC0xOCwgLTksIDI2LCAtNywtMTcsIC03LAorICAgICAgMTIsICA2LCAgMCwgLTksIC02LCAxNCwgIDksIC05LCAtOCwgIDQsIDE1LCAtNywgLTksIC0xLCAgOSwgIDEgfSwKKyAgICB7LTIwLCAzMCwgLTYsIDExLCAyNCwgLTQsICAwLCAtNiwgLTIsICA4LCAtNCwgMTIsIC04LC0xNywgIDAsICA1LAorICAgICAgLTQsICAxLCAtMSwgIDMsIC0zLCAgNSwgIDMsICAzLCAgNywgLTIsIC0zLCAtMiwgIDQsICAwLCAgMCwgLTEgfSwKKyAgICB7LTM1LCAxNywgIDYsICAxLCAtOSwgLTEsLTE2LCAgMywtMjAsLTEzLCAgOCwgIDcsIC00LCAtNywgLTQsLTIwLAorICAgICAgIDcsIDEyLCAtNSwgIDUsIC01LC0xMSwgMTIsIC0xLCAxNSwgLTksIC02LCAxNiwgLTQsIC05LC0xMywgIDQgfSwKKyAgICB7LTIxLCAzNiwtMTksICA5LCAgMCwgLTcsIC04LCAgOSwgLTQsIC0zLCAgMywgIDAsICA3LCAtOCwgLTIsIC0yLAorICAgICAtMTEsIDEzLCAtMSwgIDUsIC0zLCAgNywgIDIsICAzLCAtMSwgLTIsIC01LCAgMSwgLTEsIC0yLCAtNSwgLTMgfSwKKyAgICB7LTEyLCAzMywgLTQsICAxLC0xMiwgLTksICAwLC0xMywgLTEsICAyLCAtOCwgIDQsLTEwLCAgNiwtMTYsIC03LAorICAgICAgLTEsIC00LC0xMCwgMTUsIC0xLCAgMCwgLTUsIC04LCAgNSwgIDUsIC0zLCAgMCwgIDIsIC03LCAgMSwgLTcgfSwKKyAgICB7LTE0LCAzMiwgIDUsIC03LC0xNSwgIDMsIC01LCAgOCwgMTQsICA1LCAgOSwgMTMsICAzLCAxOCwgLTMsICA3LAorICAgICAgIDQsLTEwLC0xMCwgMTAsIC0xLCAgMiwgIDAsIC0yLC0xMSwgIDUsIC0zLCAtNCwgIDIsICAyLCAgNywgIDQgfSwKKyAgICB7LTE0LCAzNCwgIDEsIDIwLCAtMSwtMTIsICAwLCAtMywgLTcsIC00LCAgNywgMTgsICA5LCAtMywgMTQsIC03LAorICAgICAgLTksLTIwLCAtNywgLTQsLTEzLCAxMiwgIDEsIDEyLCAgNSwgLTYsICAyLCAtNCwgIDAsLTE1LCAgMSwgIDMgfSwKKyAgICB7LTIxLCAyMywgIDcsIC04LCAgMywtMTMsIC0zLCAgMCwgLTYsIC0yLCAtNywgIDYsLTEyLCAgOSwgLTYsIC0yLAorICAgICAgLTIsIC00LCAtMSwgIDYsICA5LCAgNSwgLTksIDE1LCAgMCwgIDgsIC04LCAgNywgIDYsLTE1LCAgMywgLTUgfSwKKyAgICB7LTI3LCAzMiwgLTEsIC00LCAtMiwgIDQsLTEwLCAxMiwgLTMsICA4LCAxMywgIDcsICAwLC0xNSwgIDQsIC0yLAorICAgICAgIDMsICA1LCAgNywgLTQsICA5LC0xMiwgLTEsIC0yLCAtMSwgLTQsICAwLCAtNCwgIDIsIC01LCAgNiwgLTYgfSwKKyAgICB7LTE3LCAyOSwgMTUsICAwLCAtMSwgLTQsLTEwLCAxMywgMTIsIC0xLCAtOCwtMTAsLTEwLCAgNCwgIDcsIC0yLAorICAgICAgIDYsIC01LC0xMywgMTksICA2LCAgMSwgLTcsICAyLCAtOSwgLTIsIDEyLCAtNCwgLTgsIC0zLCAgMiwgIDQgfSwKKyAgICB7LTM4LCAyNywgMTYsLTE1LCAtNiwgIDMsIC03LCAtNCwgIDAsIC0xLCAgNiwgLTIsIC0zLCAtNiwgIDYsIC02LAorICAgICAgLTMsICAwLCAgMiwgIDAsIC00LCAgNiwgIDEsIC0xLCAgMCwgIDQsIC0xLCAgMywgIDQsICAxLCAtMiwgIDUgfSwKKyAgICB7LTMzLCA0MCwgLTQsICAyLCAgMSwgIDAsICAwLC0xMCwtMTQsICAwLCAtNywgIDQsIC0xLCAgMywgLTIsICA1LAorICAgICAgIDcsICA2LCAtMSwgIDQsICAxLCAgMywgIDEsIC03LCAgMSwgLTQsICA1LCAgNywgIDAsICA0LCAgMywgLTQgfSwKKyAgICB7LTIwLCAyNSwgMTIsIC00LCAxNiwgLTQsICAyLCAgMiwtMTQsIC0yLCAtMywgMjksIC0xLCAgMSwgIDMsICAxLAorICAgICAgIDksIC01LCAgMiwgLTgsIC0zLCAgMSwgLTcsIC0yLCAtNywgIDEsICAwLCAgNCwgMTYsIC0yLCAtMSwgLTEgfSwKKyAgICB7LTEwLCAzMCwgMTcsICAzLCAtNSwgLTIsICAwLCAtNSwtMjIsICA0LCAgNSwgIDUsIC0zLC0xOCwgLTYsIDEwLAorICAgICAgLTUsIC03LCAgMiwgIDgsICA3LCAtNywtMTEsIC0yLCAgMCwgLTMsICAzLCAgMiwgMTEsIC00LCAgNCwgLTQgfSwKKyAgICB7LTExLCAzMCwgMTEsICA0LCAtMywgLTgsICAxLCAtMiwgIDQsIDE4LCAgMywgIDEsIC0xLCAgMCwgLTgsIC00LAorICAgICAgLTMsIDEwLCAxMywgMTQsICA1LCAtNSwgIDEsICAxLC0xMCwgIDIsIDE1LCAgNCwgIDksIC0xLCAtNSwgLTMgfSwKKyAgICB7LTE3LCAzMiwgMTgsLTE4LCAtMywgLTUsICA2LCAxMCwgIDEsLTE1LCAtNSwgIDksICA4LC0xMiwtMTAsIC02LAorICAgICAgMTEsICA5LCAtNSwgLTgsIC03LCAxMCwgIDUsLTEwLC0xNCwgLTQsIC0zLCAgMSwgIDksLTExLCAgMiwgIDEgfSwKKyAgICB7LTEzLCAyOCwtMTEsIC0xLCAgMiwtMTYsIC0yLCAgNywtMjQsICAwLCAgMywgIDYsICAzLCAtMSwgLTgsIC03LAorICAgICAtMTIsICAyLCAgMiwtMjAsIDEwLCAgNCwgIDAsLTEzLCAtMiwgLTIsICAxLCAgOCwtMTQsICAwLCAgNCwgIDEgfSwKKyAgICB7LTE0LCAyMywgMTIsICA4LCAgOCwtMjYsICAyLCAtNCwtMTQsIDEzLC0xNCwgMTUsICAzLCAtOSwgLTEsLTEzLAorICAgICAtMTAsIC0yLC0xMCwgIDYsLTE2LCAxMiwgIDgsICAwLCAgOSwtMTAsIC03LCAtNCwgLTQsICA3LCAtOCwgIDggfSwKKyAgICB7LTIwLCA0NSwgMTAsLTE0LCAgNCwgMTYsICA4LCAtOSwgIDEsIC04LCAxMCwgIDUsIC03LCAtMiwgIDIsIC01LAorICAgICAgLTEsICAwLCAtNSwgIDQsIC02LCAtMiwgIDQsICAxLCAgMywgIDQsIC00LCAgMiwgLTIsIC0yLCAgNSwgIDEgfSwKKyAgICB7LTIwLCAyNiwgLTQsICAxLCAgNywgIDQsIC04LCAgMSwgLTUsLTEzLCAgMiwgMTMsIC03LCAtMywgIDYsIC02LAorICAgICAgMjIsICAwLCAgNSwgMTEsIC00LC0xMSwgIDgsIC05LCAgMiwgLTIsIC00LCAtMiwgIDIsLTEzLCAtNCwgLTggfSwKKyAgICB7LTI4LCAxOCwgMTcsICAzLCAtOCwtMjMsLTE2LCAtNiwgIDUsLTEwLCAxNCwgMTAsICA1LCAtMSwgLTgsICA0LAorICAgICAgLTIsIDEzLCAtMywgLTIsICAzLCAgNCwgIDMsIC0yLCAtMywgLTQsICAwLCAgMSwgIDMsICA0LCAgMCwgIDQgfSwKKyAgICB7LTEyLCAzMiwgLTYsLTE2LCAxOCwgMTIsLTE2LCAgMCwgIDcsIDEzLCAtNCwgIDUsIC04LCAtMSwgLTMsICA0LAorICAgICAgIDYsIC0yLCAtMSwtMTMsICA0LCAtMSwgIDMsIDEyLCAtMywtMTAsICAxLCAgNiwgIDgsLTExLCAtMiwgIDQgfSwKKyAgICB7LTE4LCAyNiwgIDIsICA1LCAgMCwgLTksLTE3LCAxNCwgIDUsICAxLCAgNywgLTMsIC04LCAtMywgMTEsICA3LAorICAgICAgLTUsLTEyLCAtOCwgIDcsICAwLCAtNywgIDIsLTEyLCAtOSwgMTMsLTExLCAgOSwgIDYsLTExLCAtNSwgMTEgfSwKKyAgICB7LTI0LCAyMiwtMTUsIC05LCAgOCwgIDEsIC03LC0xMiwgLTksICAzLCAxMSwgMTUsIDE0LC0xMSwgMTIsLTE1LAorICAgICAgLTUsICA3LCAtMiwgIDAsIC04LCAgMywgIDMsIC0xLCAgMiwgMTEsLTExLCAxNCwgLTYsIDEzLCAgMSwgLTYgfSwKKyAgICB7LTIwLCAyOCwgMTgsIC00LCAtNiwgLTUsIDEyLCAxNCwgIDIsIDEwLC0xMywgLTYsIC04LCAtNiwtMTMsIC0xLAorICAgICAtMjYsIDIyLCAtMywtMTQsICA2LCAgMCwgMTAsLTE1LC0xMywgLTksICA2LCAtNywgIDEsIC01LCAtNCwgLTEgfSwKKyAgICB7LTE5LCAyNiwgLTgsIC0zLC0xNCwgLTYsIC05LCAtNCwgLTgsIDE1LCAtOCwgIDMsLTEyLCAtNCwgLTIsIC03LAorICAgICAgLTUsICAzLCAxMywgLTMsIC00LC0yNSwgIDQsIC0xLCAgNSwtMTIsIC0xLC0xMywgIDUsICAyLCAgMCwgIDYgfSwKKyAgICB7LTE4LCA0MywgMTQsIC04LCAgMSwtMjMsIC0yLCAtMiwgIDEsICAzLCAtNywgIDAsICAwLCAgOCwgLTEsIC0zLAorICAgICAgLTUsICAxLCAgNSwgIDIsICAwLCAtMiwgLTIsIC0yLCAgMSwgLTEsIC0xLCAtNywgIDAsICAzLCAtMywgIDkgfSwKKyAgICB7LTExLCAzMCwgMTAsLTE0LCAgMywgIDEsIDEwLC0xMSwgIDEsIC03LCAtNCwgMTQsICAyLCAgMSwgLTksICAxLAorICAgICAtMTEsIC0yLCAtNywgIDUsLTExLCAgMSwgIDMsIDE0LCAgMSwtMTYsIC04LCAgMywgLTUsICA3LCAtNCwgIDQgfSwKKyAgICB7LTE4LCAyNCwgIDYsICAzLCAgOCwgIDcsLTIyLCAtNywgLTcsICAzLCAtOCwgIDQsIDIzLCAgOSwgIDMsIC0xLAorICAgICAgIDMsICA2LCAgNywgLTEsIC03LCAgNiwgIDQsICAxLCAtMywgIDEsIC02LCAtMSwgIDIsIC03LCAgMywgIDMgfSwKKyAgICB7LTE1LCAzOCwgLTcsIC0xLC0xMSwgIDIsLTE3LC0yNCwgMjQsICA4LCAgNywgLTQsIC01LCAgMiwgIDIsIC03LAorICAgICAgIDEsICA0LCAgMCwgLTksICA1LCAgMCwgLTEsICAxLCAtMSwgLTUsIC02LCAgMywgIDAsICA3LCAgOCwgLTMgfSwKKyAgICB7LTE0LCAyMiwgIDEsIC01LCAgOSwtMTIsIC05LCAtNSwgLTYsICA1LCAgNywgIDgsIC0xLCAtNCwgLTksIC0zLAorICAgICAtMzMsLTE2LCAtOSwgLTEsIDEyLC0xMSwgMTcsIC03LCAtMywgLTEsIC03LCAgMywgIDIsIC0zLCAxNiwgLTQgfSwKKyAgICB7LTE0LCAyMCwgIDYsICA0LC0xMCwgLTQsIC00LCAtNCwgIDEsIC03LCAgMiwgIDYsICA4LC0xMiwgIDQsICAxLAorICAgICAgLTEsIDEyLCAxMCwgIDMsLTE0LC0xMCwgLTMsIDE4LCAtMiwgMzMsIC01LC0xNywgMTcsIC01LCAgOSwgIDcgfSwKKyAgICB7LTEyLCAyMywgMTMsICAwLC0xMSwgLTgsLTExLCAxMiwgLTUsIC05LC0xNiwgMTEsICA2LCAgNCwgMTIsIC01LAorICAgICAgIDUsLTEzLCAgNywtMTIsIC0zLCAgMSwgIDIsIDEyLCAgMSwgLTQsIC0xLCAgNSwgIDQsIDExLC0xMiwgLTMgfSwKKyAgICB7IDE1LCAgMiwgMTQsICA3LCAgMSwgIDIsICAxLCAxMiwgMTAsIDIzLCAgNCwgIDYsLTIwLC0xMCwgIDQsIDI2LAorICAgICAgLTYsIDEzLCAgNCwgIDMsICAyLC0xMSwgIDUsIC03LC0xMCwgIDQsICA5LCAgMSwgMTAsIC00LCAxMSwgIDQgfSwKKyAgICB7IDE3LCAxNSwgMzEsIDE3LCAxOCwgMTYsIDExLCAyNCwgIDIsICA0LCAgMiwgIDMsIC04LCAtMywgIDcsIC0zLAorICAgICAgLTUsIC03LCAtMiwgLTYsIC00LCAtNSwgLTQsIC0xLCAtNCwgLTIsIC01LCAtNiwgIDIsIC0xLCAgNCwgLTIgfSwKKyAgICB7IDE2LCAgOCwgMTUsIDE0LCAgMywgIDcsIDIxLCAgOSwgIDgsIDE1LCAyMSwgIDYsICA4LCAxMiwgIDUsIC01LAorICAgICAgIDcsIC0zLCAxMCwgIDIsIC0zLCAgOCwgIDYsICAwLCAgNSwgIDUsICA2LCAtMywgIDIsICA0LCAgMCwgLTUgfSwKKyAgICB7ICA1LCAtNCwgIDYsIDEyLCAgNiwgMTMsIDI0LCAxNywgLTUsIDE3LCAtMSwgLTYsIC03LC0xMCwgLTgsLTE4LAorICAgICAgIDMsIC0yLCAgMiwgIDcsLTE1LC0xMSwgMTIsIC0zLCAtMiwgLTIsIC00LCAtNywgIDIsICAwLCAgNSwgIDUgfSwKKyAgICB7IDEwLCAtNiwgIDgsIDExLCAxMiwgMjAsIDIyLC0xMSwgLTMsIDE1LCAtMywgMTUsIC0yLCAtMiwgIDAsICAyLAorICAgICAgIDUsIC04LCAgNCwgLTUsIC05LCAtNCwgLTEsICAyLCAtMSwgLTMsICAxLCAgMywgMTMsIC0xLCAgOSwgIDcgfSwKKyAgICB7IC01LCAgOCwgIDUsIDExLCAxNCwgLTUsIDE0LCAtOSwgIDIsIDM1LCAgOCwgMTUsICAxLCAtMiwgIDIsIC0yLAorICAgICAgIDQsIC05LCAtMywtMTQsLTEyLCAtMiwgLTIsIC00LCAtMiwgLTgsIC0zLCAgMSwgLTYsICAzLCAxMCwgIDAgfSwKKyAgICB7IDE2LCAgMCwgLTYsIDE1LCAtMywgIDQsICA0LCAgMywgIDMsIDIwLCAgNSwgLTQsIDEwLCAgOSwgLTksIC0zLAorICAgICAtMTAsIC0yLCAtNywgMTEsLTExLC0xMCwgMTcsIC0xLCAgMywtMTUsICAyLCAgOSwtMTUsLTEwLCAxNiwgMTAgfSwKKyAgICB7IDE0LCAgNCwgLTcsIDE5LCAgMywgIDAsIDE5LCAgOCwgMTYsIDM0LCAtOSwgIDYsLTEzLCAtMSwgIDYsICA1LAorICAgICAgLTEsIC0yLCAgNCwgIDMsICAyLCAgMSwgIDEsIC0xLCAgMCwgLTcsICAyLCAtMSwgIDEsICAwLCAgNiwgLTEgfSwKKyAgICB7ICAxLCAgNiwgIDksIDEzLCAgOSwgMTAsIDE1LCAxNiwgMTAsIDE4LCAxMywgMTcsICAzLCAtMSwgLTcsICAyLAorICAgICAtMTUsLTExLC0xMCwgLTQsLTEzLCAtNiwtMTcsLTEzLCAtNiwtMTQsICAxLC0xMCwgIDYsICA0LCAtMSwgLTEgfSwKKyAgICB7IDEzLCAgMSwgIDcsIDEwLCAxNCwgMTMsIC03LCAgNSwgIDUsIDI4LCAxNCwgMTQsIC0yLCAgMiwgIDMsIC0zLAorICAgICAtMTMsIC00LCAxMCwgLTksIDE5LCAtNCwgLTMsICA0LCAtNSwgLTUsICAwLCAgNSwgLTUsICAwLCAgMywgLTQgfSwKKyAgICB7ICAxLCAgMCwgIDYsIDIyLCAgOSwgMTgsIDE4LCAtMywgIDUsIDEwLCAxMiwgLTIsICAxLCAtMywgLTgsLTEyLAorICAgICAgIDksLTEwLCAtNywgIDEsIC0xLCAxOSwgIDAsICAyLCAtOCwtMTEsLTEwLCAgOSwgIDYsIDExLCAgMCwgIDMgfSwKKyAgICB7IDEwLCAxMSwgMTksIDQ0LCAgMCwgMTQsICAxLCAtNywgIDYsIDIyLCAgMiwgLTEsICA5LCAgMiwgIDAsIC00LAorICAgICAgIDQsICAwLCAtNiwgLTYsICAzLCAgMCwgIDAsIC0yLCAgMiwgLTUsICAxLCAtMiwgIDAsICAxLCAgMSwgIDEgfSwKKyAgICB7ICA1LCAgNywgIDAsIDMyLCAzMCwgMjYsICA1LCAgNCwgLTcsIC0zLCAxNSwgLTYsICAzLC0xMCwgIDcsICA2LAorICAgICAgLTgsIC03LCAgMiwtMTMsIC01LCAtMSwgLTMsICA3LCAgMywgLTIsIC04LCAgMCwgIDYsICA0LCAgNSwgIDAgfSwKKyAgICB7ICA5LCAgOCwgLTIsICA0LCAgMiwgMTEsICA0LCAyOSwgLTUsIDE0LCAgOCwgLTUsLTE0LCAgOCwgIDAsICA5LAorICAgICAgIDgsLTEwLCAgNSwtMTUsIC02LCAtOSwgIDksIC0xLCAxOCwtMTYsICA5LC0yMSwgLTMsLTEzLCAtMiwgIDggfSwKKyAgICB7IDI1LCAgNywgLTksIDIzLCAyMCwgMTgsICA2LCAxNiwgLTksICA4LCAgOCwgLTUsIDExLCAxMywgLTgsICA3LAorICAgICAgIDQsIDEwLCAtMiwgLTEsIC03LCAtOSwgLTcsIC05LCAtNCwgIDEsICAxLCAtNSwtMTAsICA4LCAgNCwgLTUgfSwKKyAgICB7ICA5LCAgMiwgMTYsIDE0LCAtNSwgMTQsICAxLCAgMCwtMjEsIDE3LCAtMSwgIDksIDEyLCAtMywgLTMsICA0LAorICAgICAgLTQsIDE0LCAxMCwgIDMsICAwLC0xMCwgIDcsICA0LCAgNCwtMTEsICAyLCAgNCwgLTEsIC0zLCAgOSwgLTEgfSwKKyAgICB7IDE3LCAgOCwgMTEsIDI2LCAxNSwgLTMsIDE0LCAtMSwgMTIsICA5LCAxMCwgLTgsICA4LC0xOCwtMTEsIC0zLAorICAgICAtMTQsIC03LCAgNywgLTMsIC0zLCAtNCwgIDEsIC03LCAtMywgIDIsIC0zLCAxNiwgMTAsICAwLCAgOSwgIDYgfSwKKyAgICB7ICA5LCAgOCwgIDMsICA4LCAxOCwgMTQsIDExLCAgMSwgMTAsICA2LCAgMSwgLTQsLTE2LCAtMiwgMTQsIC0yLAorICAgICAgIDEsICA4LCAxMiwgMTQsICAzLCAtMywgIDgsICA4LCAxMiwtMTUsICAzLCAtMywgIDMsIC0yLCAxNCwgMTAgfSwKKyAgICB7IDIyLCAtMywtMTEsIDEzLCAtNywgMTEsICA0LCAxMSwgIDMsIDE0LCAgMCwgLTYsIC0yLCAtOSwgIDQsICAyLAorICAgICAgLTIsICAwLCAtNSwtMjcsLTEwLCAgMywgLTEsICA1LCAgOCwtMjQsIC0zLC0xMSwgLTMsICAyLCAxMSwgLTEgfSwKKyAgICB7IDE5LCAgMiwgIDgsIDM2LCAgNSwgLTYsICAzLCAxNSwgLTMsIC00LCAtNSwgMTQsLTEwLCAgMSwtMTIsLTEwLAorICAgICAgLTMsIC00LCAgMywgLTIsICAxLCAtOCwgIDQsICAzLCAgNSwgLTMsICAwLCAgNCwgIDgsIC0yLCAgOCwgIDQgfSwKKyAgICB7ICA4LCAxNCwgMTUsICA5LCAtNCwgMTAsICA1LCAxMSwgIDksIDEwLCAgOCwgIDksLTE1LCAxNSwgIDYsIC04LAorICAgICAtMTAsLTEzLCAgNSwgLTgsLTIwLC0xMywgLTYsLTExLCAtMSwgLTMsIC02LCAtNCwgLTEsICAwLCAxMywgMTUgfSwKKyAgICB7IC0yLCAtMSwgIDksIDEyLCAgMiwgIDIsIDEzLCAgMywtMjMsIDMzLCAxNSwgIDIsIC00LCAtMSwgIDMsICA4LAorICAgICAgIDgsICA2LCAgNiwgLTcsICA4LCAgNiwgIDksIC0xLCAgMywgLTgsICAwLCAtNCwgIDEsIC04LCAxMSwgLTEgfSwKKyAgICB7ICA2LCAgNSwgLTYsIDE2LCAgMiwgLTMsIDMxLCAyMSwgLTksIDEyLCAgMCwgLTEsIC00LCAgMSwtMTIsICAzLAorICAgICAtMTMsLTE4LCAgMiwtMTEsIC05LCAgMiwgLTgsIC02LCAxMSwgLTMsIC0xLCAgMCwgLTEsICAwLCAxMywgIDUgfSwKKyAgICB7ICA1LCAtMSwgIDIsICAwLCAyNSwgIDUsIDEwLCAxNiwgLTUsIDIxLCAxNCwgMTIsIDEzLCAgMiwgLTUsICA1LAorICAgICAgIDUsIC0zLCAtMiwtMTQsICAwLC0xMiwgIDcsIDExLCAtMSwgLTcsIDE5LCAtMSwgLTEsIC0xLCAgOCwgLTEgfSwKKyAgICB7IDEwLCAgNywgIDMsIDExLCAgMCwgIDgsIDIyLCAgMywgIDMsIDE5LCAtNCwgMTIsIDE1LCAgOSwgIDUsIDE1LAorICAgICAgIDIsICAxLCAgMiwtMTAsLTEwLCAgMCwgIDIsIC0xLCAgMCwgIDEsLTEyLCAtMSwgMjEsIDE2LCAgOSwgLTcgfSwKKyAgICB7IDExLCAtNCwgLTUsIDI0LCAtNywgMTEsIDIwLCAxMSwtMTUsIDE4LCAgNSwtMTMsLTE1LCAgMCwgLTUsICA5LAorICAgICAgIDEsICAwLCAtMSwgLTksICA0LCAtOCwgIDYsIC04LCAgMSwgLTIsIC03LCAyMCwgIDksICAzLCAgOSwgIDMgfSwKKyAgICB7IDIwLCAgMCwtMTIsIC02LCAgOSwgMzEsICA5LCAxMiwgIDgsIDI3LCAxNSwgIDcsLTE2LCAgNSwgLTMsIC03LAorICAgICAgLTEsIC05LCAtMiwgLTcsIC0zLCAgNCwgLTgsIC0zLCAgMywgLTYsIC0yLCAtMiwgLTMsIC02LCAtMSwgIDIgfSwKKyAgICB7ICA2LCAtNiwgNDgsICA4LCAtMywgMTksIDEyLCAxMSwgLTcsICAyLCAgMywgIDAsIC0xLCAgMSwgIDgsIC00LAorICAgICAgIDQsIC02LCAgMCwgLTQsIC00LCAtMywgIDMsICA2LCAgMywtMTMsIC04LCAgNSwgLTMsIC03LCAgOCwgIDUgfSwKKyAgICB7ICA3LCAtMiwgIDYsIDExLCAxMiwgIDIsIDE0LCAgNCwgLTUsIDEyLCAgMiwgIDksICA0LCAgMiwgIDAsIC0xLAorICAgICAgIDIsICAwLC0xNSwgLTksLTE2LCAtMiwgIDgsLTE3LCAtNSwtMjIsLTE5LCAtNSwgLTEsLTEwLCAgMSwgLTIgfSwKKyAgICB7IDExLCAtOSwgIDMsIDEyLCAgNiwgIDYsICAxLCAxNywgLTYsIDE5LCAxNCwgIDcsIC03LCAtMSwgLTEsIC05LAorICAgICAgIDksLTExLC0xNywgIDAsIC02LCAxNiwgIDAsICAxLCAgOSwtMjQsICAzLCAgMywgLTksIC0zLCAgMywgLTIgfSwKKyAgICB7ICA5LCAgMCwgIDEsICA4LCAgMSwgIDcsICAyLCAtNSwgLTMsICA4LCAtMSwgIDcsICAyLCAgNiwgLTMsIC02LAorICAgICAgIDUsIC0yLCAgNiwgLTIsIC00LCAtMywgIDAsIC0zLCAxMywtNTAsICAxLCAtMiwgIDIsICA0LCAgNCwgIDMgfSwKKyAgICB7ICA3LCAgMCwgMjYsIDIxLCAtNCwgIDIsIDE3LCAgOCwgIDcsIDExLCAtNywgIDEsIC0xLC0xNSwgLTEsLTE1LAorICAgICAtMTEsIC00LC0xNywgLTQsICAxLCAtNywgIDMsICA2LCAgMywgLTksICAyLCAgMywgIDYsIDEwLCAgNiwgMTIgfSwKKyAgICB7ICAxLCAtMiwgIDIsIC0xLC0xMCwgLTQsICA2LCAtMywgLTUsIC0yLCAtOCwgIDIsICAyLCAgMiwgIDgsICAwLAorICAgICAgIDEsICAxLCAgNiwgIDAsIDExLCAxMywgIDMsICA0LCAgMCwtMTIsIDExLCAtNSwgMTksIDIwLCAgMiwgIDUgfSwKKyAgICB7ICA1LCAgMywtMTMsIC0yLCAgMSwtMTIsIDExLCAtNywtMTIsICA3LCAxMCwgIDAsICA3LCAgMCwgLTIsICA0LAorICAgICAgLTYsIC05LC0xMSwtMTIsLTIzLCAxMiwgMTAsIC0zLCAgMCwgIDYsIDE5LCAtMSwgMjQsIDE4LCAgOSwgMTIgfSwKKyAgICB7ICA2LCAtMywgIDIsICA1LCAgMiwgIDIsIC0yLCAtNSwgLTgsLTExLCAtNCwgIDMsIC04LCAtNCwgIDUsIC0zLAorICAgICAtMTYsIC00LCAgMywtMTIsIC00LCAgMywgMzIsICA3LCAgMiwgIDgsIDMyLC0xOCwgLTEsIDEyLCAgMSwgIDcgfSwKKyAgICB7ICAwLCAtOCwgLTEsICAwLCAtOCwgIDcsIC04LCAtMSwgLTEsICA0LC0xMiwgLTEsICAzLCAgMCwgIDEsLTE4LAorICAgICAgIDgsICA4LC0xNCwtMTAsLTExLCAxOSwgIDksICA1LCAtNywgIDYsICA4LCAtNCwgMjYsIDEyLCAtMSwgIDYgfSwKKyAgICB7ICAzLCAgNSwtMTQsICA3LCAxNCwgIDgsIDIwLC0xMywtMTYsLTEwLCAtMiwgMTcsIC03LCAgNCwgLTgsIC05LAorICAgICAgMTQsIC01LCAgMywgLTQsLTEyLCAgNywgMTQsLTEwLC0xOSwtMjAsIDM1LCAgOCwgMTMsIDE0LCAtMiwgIDkgfSwKKyAgICB7IC0yLCAtNCwgLTEsICAxLCAtMywgIDAsIC0xLCAgMSwgIDIsICAyLCAgNiwgIDAsICAwLCAgNCwgIDUsIC0yLAorICAgICAgIDMsICAzLCAgMywgLTIsIC03LCAtMywgLTMsIC0xLCAgNiwgLTIsIDI5LCAyMiwgMTMsIDM0LCAgMCwgMTQgfSwKKyAgICB7IC0zLCAtOSwgIDMsICAxLCAgNSwgLTQsICAyLCAgMCwgIDcsIC05LCAgMCwgIDIsIC01LCAtMywgIDAsICA2LAorICAgICAgLTEsIC0xLCAtMSwgIDIsICAyLCAgNCwgIDgsICA3LCAyMCwgLTYsICA3LCAxNiwgMzMsIDIwLCAgNiwgLTEgfSwKKyAgICB7LTExLCAgMSwgLTMsIC0zLC0xMSwgIDMsIC05LC0yNSwgLTEsLTE2LCAgNCwgLTgsIDE1LCAgMSwgLTIsICA3LAorICAgICAgIDgsIDIzLCAgMiwgMTgsLTEzLCAxNiwgIDMsIC03LCAgNiwgIDMsIDE2LCAtOCwgMTIsIDE2LCAgMywgIDQgfSwKKyAgICB7ICAwLCAgNSwgIDUsIC01LCAgMSwgLTEsICAyLCAtMywgLTIsICAxLC0xMywgIDIsICAyLCAxMCwgIDYsICA3LAorICAgICAgMTgsIDE4LCAgNywgIDksICA4LCAgOSwgMjEsIDE0LCAgNywgMTIsIDE1LCAxNCwgMTUsIDEyLCAxMSwgIDUgfSwKKyAgICB7ICAxLCAtNSwgMTEsIC0yLCAxNywgIDgsICAzLCAgMCwgLTEsICA2LCAxMSwgLTcsICA2LCAgNiwgIDcsICA1LAorICAgICAtMTUsIDE0LCAgMSwgMTEsICA0LCAxMCwgMTIsICAxLCAgMiwgIDQsIDMwLCAgMSwgMTEsICAxLCAgNiwgMTMgfSwKKyAgICB7ICAyLCAgNCwgIDMsIC03LCAgNSwgIDgsLTExLCAgNywgLTUsICA5LC0xMCwgIDYsICA4LC0xMCwgLTMsIDEwLAorICAgICAgIDEsLTI5LCAtNCwtMjYsICA1LCAtOCwgMTMsICA0LCAgMywgIDYsIDM1LCAgMSwgIDMsICA2LCAgMywgIDAgfSwKKyAgICB7IC0yLCAgMSwgIDAsICAwLCAtMSwgLTMsIC03LCAtMywgLTksIC0zLCAtMSwgLTYsICAzLCAgNCwgIDQsICAwLAorICAgICAgIDUsIC0xLCAtMiwgLTIsIC0xLCAtNCwtMTAsICA4LCAgMCwgLTYsIDEwLCAtNCwgNDYsIDEyLCAgMiwgMjggfSwKKyAgICB7ICA0LCAtMSwgIDQsICAxLCAgMCwgIDQsIC0yLCAtMiwgLTIsIC0xLCAgMiwgLTQsICAxLCAgNSwgIDAsIC0zLAorICAgICAgIDEsICAxLCAtMiwgIDAsICAxLCAtMiwgLTEsIC0xLCAgMywgLTYsIDM1LC0xMSwgMTMsIDUzLCAtMywgLTEgfSwKKyAgICB7IC01LCAtMiwgIDAsLTEzLC0xNiwgIDUsLTEyLC0xMSwgIDEsLTMwLCAgMywtMTgsLTI0LCAtOCwgLTUsLTE5LAorICAgICAgIDEsIC0zLCAtOCwgIDcsIC03LCAtOCwgMTUsLTE5LCAgNCwgMTAsIDMwLCAyNCwgIDYsICAxLCAtOSwgMTAgfSwKKyAgICB7IC00LCAgOCwgLTcsIC00LCAtNiwgMTIsIC0xLCAtOSwgLTQsICAyLCAtOSwgIDMsICAyLCAtMiwgIDQsICAyLAorICAgICAgMjIsICA5LCAgNCwgLTUsICAwLCAgNSwgLTIsIC05LCAtMywgIDEsIDE4LC0xMiwgMTgsIDE2LCAgNCwgMTYgfSwKKyAgICB7IC01LCAtOCwgLTMsIC01LCAtMywgIDYsIC03LCAtMywgLTIsIC01LCAtMywgIDEsICAyLCAgMiwgIDQsIC02LAorICAgICAgMTAsICAzLCAxMiwgLTMsIDIwLCAgMCwgMjcsIC00LCAxNiwgIDUsIDE4LCAtMywgMjMsICA0LCAxMiwgMTEgfSwKKyAgICB7ICAwLCAgMSwgIDAsICAxLCAtMiwgIDEsICAyLCAgMSwgLTEsICAwLCAtMiwgIDIsIC0yLCAtNCwgIDEsIC0yLAorICAgICAgLTIsIC0xLCAtNSwgLTIsICAwLCAgMCwgLTIsICAyLCAgOSwgIDcsIDYzLCAgNSwgMTIsIC0xLCAgMSwgIDAgfSwKKyAgICB7ICA0LCAtMywgLTcsIC01LC0xMSwgLTUsLTEyLC0xMCwtMTAsLTEyLC0xNSwtMTIsLTE0LC0xNCwgIDEsICAxLAorICAgICAgMTAsLTEwLCAxNiwgIDYsICAyLCAgOSwgMTEsICA5LCAgOSwgIDgsIDEyLCAtMSwgMTMsIDEyLCAgNiwgIDMgfSwKKyAgICB7ICA3LCAtMywgLTIsICA0LCAgNiwgLTgsICAyLCAtMywtMTIsIC01LCAtOSwgLTgsLTEwLCAxNSwgLTIsIC00LAorICAgICAgIDgsICA5LCAgNywtMTMsLTE4LCAzNCwgLTUsICA3LCAxMiwgMjIsIDE2LC0xMSwgMTMsIDI1LC0xNSwtMTEgfSwKKyAgICB7IC0zLCAtMiwgIDAsIC00LCAgMSwgIDAsIC0zLC0xMywgLTcsIDEzLCAxMiwgLTcsLTEwLCAxMywgMTksICA2LAorICAgICAgMTYsIDE1LC0xMiwtMTUsIC0zLCAzNCwgIDEsICA1LCAgMSwgLTksIDExLCAyMSwgIDgsIDE3LCAtNSwgLTYgfSwKKyAgICB7ICAzLCAtNSwgIDAsIC00LCAgMCwgIDQsLTExLCAgNCwgLTcsIC0zLCAtMSwgLTgsICAzLCAtMiwgIDIsICAxLAorICAgICAgMTEsICA1LCAgNiwgMTQsIC0zLCAgMiwgLTQsIC03LCAgMCwgMzEsIDE1LCAtMiwgMjQsIDExLCAgNSwgIDQgfSwKKyAgICB7IC0xLCAtNCwgLTksICA1LCAtOCwtMTgsIC00LCAtOSwtMjAsLTE4LCAgNywtMTQsLTE2LCAgMywgIDgsIC0zLAorICAgICAgMjksIDExLC0xMywtMTMsICA3LCAgMSwgMTcsICA2LCAgNiwgMjEsIDExLCAgMSwgMTQsIC04LCAgMiwgIDUgfSwKKyAgICB7IC0zLCAgOCwtMTAsIC02LCAxMiwgIDIsICAxLCAgMywgIDMsICAzLCAgMywgLTYsIC04LC0xNCwgMTUsIC01LAorICAgICAgMTYsICA0LCAxNiwgIDAsICA3LCAtMSwgIDAsIDE2LCAgMiwgIDEsIDIyLCAgNCwgMTksIDEzLC0xMSwgIDEgfSwKKyAgICB7ICAyLCAtMywgMTAsIDIwLCAtNCwgLTEsIC04LCAgNSwgLTgsIC05LCAtNiwgLTIsIC00LCAtNywgIDgsLTEwLAorICAgICAgIDAsICA4LCAtNiwgIDEsIC04LCAxNCwgMTMsICA1LCAxNywgLTYsIDI2LCAtMSwgIDcsIC0xLCAgMCwgMTIgfSwKKyAgICB7IC00LCAtNywtMzEsIC0yLCAtNywgLTEsICA1LCAtNSwgLTUsLTEyLCAgNCwgLTcsIC02LCAgMywgMTUsIC0yLAorICAgICAgIDUsIC0yLCAgNywgLTEsIDEwLCAgNywgIDgsIC0xLCAxNCwgMjAsIDE0LCAgOSwgMTYsIDE2LCAgOCwgMjQgfSwKKyAgICB7IC03LCAgMCwgLTMsIC02LCAgMSwgIDMsLTEzLCAtNiwgLTQsIC00LCAtNSwgLTksIC0xLC0xMCwgLTQsIC04LAorICAgICAgIDIsICAwLCAtMSwgIDEsIDI0LCAyNCwgMjEsIDMxLCAgNSwgIDIsIDExLCAxMiwgIDcsICA0LCAgMywgIDYgfSwKKyAgICB7IC0zLCAtNSwgIDYsIC00LCAtMywgLTEsICAyLCAtMSwgLTIsICAxLCAgMCwgLTgsIC0xLCAgMiwgIDAsIC00LAorICAgICAgIDYsIDIyLCAtMSwgLTUsICA4LCAxMiwgLTEsIC0yLCAyOCwgMjcsIDIwLC0yNywgMTQsICAxLCAgMiwgLTMgfSwKKyAgICB7ICAxLCAtNSwgLTIsIC0yLCAgNiwgLTIsICA5LCAgMSwgLTIsIC01LCAgMywgIDQsIDExLCAgNSwgIDIsICA4LAorICAgICAgLTMsIC0xLCAgMSwgLTIsIC0zLCAtNSwgIDUsICA4LCA0OSwgMTIsICA4LCAtMywgIDksIDIwLCAxMiwgMTcgfSwKKyAgICB7IC02LCAgMCwgIDEsICA3LCAgMCwgIDksIC0yLCAtNCwgIDgsICAwLCAtMiwtMTAsICAwLCAgNywgMjEsIC0xLAorICAgICAgIDAsICAxLCAxNywgLTcsIC01LCAgMiwgIDQsIDE2LCAtMiwgMTcsIDE0LC0yMCwgMTUsIDE0LCAgNCwgMTUgfSwKKyAgICB7ICAwLCAgMywgLTQsICA5LCAtNCwgIDAsICA2LCAgNCwgLTYsIC02LCAtNSwgLTcsICAyLCAtOSwtMTAsIC0yLAorICAgICAgLTUsICAwLCAtMywtMjEsICA5LCAxNCwtMTEsIDEzLCAyOSwgIDIsIDI1LCAgNCwgMjIsIC0xLCAgMiwgLTMgfSwKKyAgICB7ICAyLCAxMiwtMTEsICAyLCAxNiwgIDksIC00LCAgNywgIDEsLTEwLC0xNSwgMTEsIC00LCAgMywgLTIsICA0LAorICAgICAgIDQsIC01LC0xMCwgIDEsICA0LCAxOSwtMTUsICA2LCAtNCwgLTIsIDMwLCAtNywgMTEsIDIxLC0xMiwgIDUgfSwKKyAgICB7IC0yLCAtMywgLTIsICA0LCAtMSwgLTUsIC0zLCAtNywgLTUsICAxLCAgMCwgLTYsICAxLCAtNiwgIDcsICAwLAorICAgICAgIDgsIC03LCAtMywgLTIsICAyLCAxNCwgIDIsIC0zLC0yNiwgLTEsIDI2LCAyMiwgMzIsICAxLCAtMiwgIDYgfSwKKyAgICB7ICAxLC0zOCwgLTEsLTIwLCAtMiwgLTMsIC02LCAtNCwgIDIsICAyLCAgNywgIDAsICAzLCAgNSwgIDMsIDEwLAorICAgICAgIDYsICAxLCAtMywgLTUsICA3LCAgNSwgLTUsIC00LCAgOCwgIDMsICAxLC0xNCwgLTEsIC05LCAtNSwgLTQgfSwKKyAgICB7IC01LC0yNiwgLTcsLTE5LC0xMCwgLTUsLTExLCAgNSwtMTEsLTI1LCAtOCwtMTQsIC05LC0xNiwgLTgsIC02LAorICAgICAtMTcsLTE0LCAtMSwgLTEsICA2LCAgMiwgIDIsICAyLCAgMywgIDAsICAyLCAgOCwgLTgsICAzLCAgMCwgLTMgfSwKKyAgICB7IDE3LC00OSwgLTMsLTIzLCAtMSwgMTEsICA3LCAgMywgIDQsIC00LCAgMCwgIDAsIC0xLCAgNCwgIDIsICA0LAorICAgICAgLTIsIC00LCAgMiwgLTIsIC0xLCAtMiwgIDIsICAwLCAgMCwgLTEsICAwLCAgMCwgIDEsICAyLCAgMCwgIDAgfSwKKyAgICB7ICA0LC0zNCwgLTYsIC05LCAgMSwgMjEsIC03LCAgMywgLTIsIC0xLCAtMywgMTgsICAyLC0xNiwgIDcsIC0zLAorICAgICAgIDgsICA3LCAtNSwgIDcsICAyLCAgNCwgIDgsIC02LCAtNywgLTIsIC01LCAtMSwgIDQsICAxLCAgMiwgLTQgfSwKKyAgICB7ICA1LC0yOSwgMTMsIC0yLC0xNCwgIDMsICAxLCAxOCwtMTUsICA0LCAtOCwgIDgsLTEwLCAgOCwgIDIsICAxLAorICAgICAgLTgsIDE1LCAgMywtMTAsIC00LCAtNCwgLTIsICAwLCAtMywgLTQsICAyLCAtMywgLTQsIC0zLCAxMiwgLTYgfSwKKyAgICB7IDEzLC0yMCwgIDMsLTE4LC0xNywgIDQsLTE0LCAxMywgMjgsIDExLCAtOCwgLTYsIDE2LCAgNiwgIDAsIDEwLAorICAgICAgIDMsICA0LCAtOSwgMTMsICA1LCAtNywgMTIsIC01LCAgMCwgLTcsICA1LCAgMSwgIDMsICAzLCAgMiwgIDEgfSwKKyAgICB7ICAzLC0yNywgLTUsLTExLC0yMSwtMTEsLTEyLCAgMCwgLTUsICA3LC0yMiwgIDEsICAzLCAgNSwgIDAsIC01LAorICAgICAgIDgsICA3LCAgMSwgLTUsIC03LCAgMiwgLTUsICA0LCAgMSwgIDMsIC04LCAtMiwgIDAsICA0LCAtMiwgIDYgfSwKKyAgICB7IDMxLC00NSwgIDAsIC0xLC0xMiwgIDEsICAyLCAtNiwgIDQsICAzLCAtMSwgIDMsICAzLCAgMCwgIDUsICAzLAorICAgICAgLTUsIDEyLCAgNCwgIDYsICAyLCAgMSwgLTIsICAxLCAgMywgIDIsICA1LCAgMiwgIDIsICAyLCAgMywgLTEgfSwKKyAgICB7ICA5LC00NSwgIDYsICA1LCAtMSwtMTcsIC0yLCAxOCwgLTMsICAyLCAgMCwgIDEsICAwLCAtMSwgMTAsICA4LAorICAgICAgLTcsIC0yLCAtNSwgLTgsICA2LCAtMSwgIDAsICA0LCAgNiwgLTMsIDEyLCAtMSwgLTIsICAwLCAgNSwgLTcgfSwKKyAgICB7ICAzLC0yNiwgLTIsLTEyLC0xMiwgIDIsLTEwLCAxNiwgLTMsIDEyLCAgNCwgIDUsIDExLCAgOCwtMTYsLTE3LAorICAgICAgLTIsIC0zLCAtMywgIDIsICA1LCAtOSwgMTMsICAxLCAxMCwgMTEsICAzLCAgNSwgLTIsICAyLCAgMiwgLTcgfSwKKyAgICB7ICA4LC0yNiwgMzIsIC03LCAtNSwgMjIsICAyLCAxNCwtMTAsIC04LCAtNywgIDMsICAzLCAgNywgIDAsIC01LAorICAgICAgIDAsIC0xLCAtMywgIDAsICA4LCAgNCwgLTUsIC03LCAgNiwgLTEsICA0LCAgOCwgIDEsICAxLCAgNywgLTYgfSwKKyAgICB7ICA0LC0zMSwgIDIsLTE0LCAgMiwgIDAsICAxLCAgOCwgLTYsIC0xLCAxNywgLTMsIDEzLCAtNiwgIDUsLTEwLAorICAgICAgLTIsLTEwLCAtMiwtMTAsIC0zLCAgNywgIDEsICA1LCAtOCwgIDgsLTE0LCAtMywtMTUsICA3LC0xMCwgLTYgfSwKKyAgICB7IDE2LC0yNywgMTMsIC00LC0yMywgIDcsIC05LCAgNiwgLTcsICA1LCAgNCwgIDIsIC0xLCAtMywgMjMsLTE4LAorICAgICAgIDcsICAwLCAtMywgIDQsIC0zLCAgOSwgLTYsIC0yLCAtMSwgIDgsIC02LCAgMiwgIDYsIC0zLCAgMiwgLTIgfSwKKyAgICB7IC0xLC0zNSwgLTIsIC04LCAxMSwgLTEsIC03LCAtMywgLTIsIDExLCAgNywgIDYsIC02LC0xMCwgIDksICA2LAorICAgICAgLTMsIC01LCAtNiwgLTMsICA5LCAxNiwtMTYsIC05LC0yMCwgMTIsICAzLCAgNSwgLTMsICAxLCAtOSwgIDQgfSwKKyAgICB7ICAyLC0yNCwgIDEsLTEyLC0xNiwgIDUsIC00LCAgMywgLTQsIC0xLC0xMSwtMTEsIC04LC0xNCwgMTQsIDEwLAorICAgICAgLTgsIDIwLCAgOCwgLTMsLTExLCAgMSwgIDEsIC00LCAtNCwgLTcsIC0zLCAxNSwgIDIsIC02LCAtMiwgIDcgfSwKKyAgICB7ICA5LC0yMSwgIDIsLTE5LCAtNywgLTUsIC04LCAyNSwgIDMsIDE3LCAgNSwgLTMsICA5LC0xMiwgIDgsICAyLAorICAgICAgLTQsICAzLCAgMywgIDEsIDExLCAtOSwgLTQsIC0zLCAgNCwgIDMsLTIyLCAgNiwgIDQsICA2LCAxMSwgLTUgfSwKKyAgICB7IDE2LC0yMywgMTMsLTE3LC0yMSwtMTIsICA1LCAgOSwtMjAsICA3LCAgNiwgLTYsICAwLCAgMiwgLTksICA2LAorICAgICAgLTYsLTEzLCAtNywgLTEsICA1LCAtMywgIDUsIC03LC0xMCwgIDEsICAwLCAgOCwgLTksIDExLCAgMCwgLTggfSwKKyAgICB7IDEwLC0yNiwgLTksIC03LC0xOSwgLTQsICA2LCAxNiwgLTcsICA1LCAtNCwgIDQsICA4LCAgMCwgIDQsIC0xLAorICAgICAgIDYsIC03LCAgMSwgLTgsLTExLCAxMCwtMTQsICAwLC0xNiwgIDYsIC0zLCAgNSwgLTEsIDE0LCAxMiwgIDEgfSwKKyAgICB7ICA4LC0yNywgMTIsLTE0LCAtMSwgLTEsLTE5LCAxMCwtMTEsIDIxLC0xNCwgIDksIC04LCAtMywgIDgsIC0xLAorICAgICAgMTIsLTEzLCAgMywgLTQsIC0yLCAgMCwgLTksICAwLCAtNywgIDIsIC0zLCAxMiwgIDEsIC0zLCAgMywgIDEgfSwKKyAgICB7IDE4LC0yMCwtMTQsLTE0LC0xNiwgLTMsLTI0LCAgNiwtMTcsICAyLCAtMywtMTEsICAyLCAtMywgMTIsIDEwLAorICAgICAgMTAsICAxLCAxMCwgIDcsICA4LCAgNSwgIDUsICA0LCAtMSwgIDcsICAyLCAgMiwgIDAsICA0LCAgNywgIDAgfSwKKyAgICB7ICAwLC0zMCwgIDksLTE2LC0xOCwgMTUsIDEyLCAtMywgIDQsIC00LCAtNSwtMTEsIC00LC0xMiwtMTAsICAwLAorICAgICAgIDIsIC0yLCAtNCwgLTEsICAyLCAgMCwgLTEsIC02LCAgMiwgLTMsICA0LCAtNSwgIDcsICAzLCAgNSwgIDcgfSwKKyAgICB7IDI1LC0yNCwgLTEsIC02LCAtOSwgIDYsLTEzLCAtMiwgIDMsIDE1LCAtMywgMTEsICA0LCAtOCwtMTEsICAyLAorICAgICAgIDAsIC05LCAtMiwgIDcsICA0LCAgOCwgIDUsIC04LCAgNSwgIDYsIC0xLC0xMSwtMTUsIC01LCAgMCwgMTEgfSwKKyAgICB7ICAwLC0zNCwgLTcsLTExLCAtNywgIDksIC0zLCAxOSwgIDQsIC04LCAgMywtMTEsIDExLCAtMywgLTksIDEyLAorICAgICAgIDksICA5LCAgMiwgIDEsIC03LCAgMSwgLTMsICAwLCAtNiwgLTIsIC0xLCAgMywgIDAsIC03LCAtMiwgLTUgfSwKKyAgICB7ICA2LC0zNCwgLTQsIC01LCAtMywgLTksICAyLCAgOSwgLTEsICA5LCAtNSwgLTMsLTI2LC0xMiwgIDgsIC02LAorICAgICAgLTcsIDExLCAtOCwgIDQsICA0LCAgMSwgLTEsICAwLCAgOCwgIDksIC00LCAgNywgLTEsICAxLCAtMywgLTEgfSwKKyAgICB7ICAzLC0zMCwgIDUsICA2LC0xMCwgIDMsIC03LCAgNiwgIDMsICAzLC0yNiwtMTksIC0zLCAgMSwgIDcsICA1LAorICAgICAgLTQsIC01LCAgNiwgMTAsIDEzLC0xMCwgIDQsIC03LCAtNCwgIDUsIC0zLCAgOSwgLTYsICAzLCAgOSwgIDUgfSwKKyAgICB7ICA0LC0yNCwgIDksLTE5LCAgMiwgLTQsIC01LCAgOCwgLTMsICAyLCAgMCwtMTUsIC0xLCAgOSwgLTQsIDIyLAorICAgICAgIDYsICA5LCAgMywgIDcsIDExLCAtOSwgIDAsIC0zLCAgNCwgIDUsIC01LCAxMCwgLTgsICA1LCAtNywgLTMgfSwKKyAgICB7ICA4LC0yNywgIDcsIC0zLCAtMSwgIDIsIC05LCAxMywgIDcsIDEyLCAtNCwgLTYsIC02LCAgNSwgIDAsICA3LAorICAgICAgIDUsICAxLCAxNSwgLTMsIC00LCAgMCwgLTUsIC0yLCAgNywgLTUsIC03LCAgMSwgLTIsIDEzLCAtOCwgMTMgfSwKKyAgICB7IDE3LC0yMiwtMTUsLTExLCAtOCwgMTYsLTE0LCAxOCwgIDIsIC0xLCAxNCwgLTcsIDE0LCAtNiwgLTYsIC03LAorICAgICAgLTgsIDE3LCAgNiwgIDQsICA0LCAtNywgLTUsIC05LC0xNCwgLTYsIC0xLCAgOSwgLTMsICAxLCAgNiwgLTUgfSwKKyAgICB7IDI1LC0zMCwgIDIsLTEyLC0xMywgMTgsLTE4LCAxNiwgIDgsIC0zLCAxMCwgLTgsIC0zLCAtMSwgLTYsICAzLAorICAgICAgLTUsIC03LCAgNCwgIDYsICA3LCAgMSwgIDEsLTExLCAtNSwgIDYsICAyLCAtNCwgIDksIC0xLCAtNSwgLTIgfSwKKyAgICB7ICA3LC0yMywgIDcsLTE1LCAtMSwgLTMsIC0xLCAgMCwtMTAsIDEyLCAgMiwgIDUsIC00LCAgMCwgIDQsICA2LAorICAgICAgLTEsICA1LCAtOSwgLTEsIC0xLCAtNywgIDEsIDE3LCAgOSwtMTcsLTE2LCAgOCwgIDQsLTE0LCAxMSwgMTQgfSwKKyAgICB7ICAwLC0zMSwgIDcsLTEzLCAgMywtMTEsIC03LCAgNiwgIDEsLTExLCAgOCwgLTcsIDE1LCAtMywgMTYsLTExLAorICAgICAgLTEsLTE1LCAxNiwgLTMsICA1LCAgMCwgLTIsIC0yLCAtNiwgMTEsICA1LCAgNiwgIDUsIC01LCAgNiwgIDMgfSwKKyAgICB7IDEzLC0yNCwgLTIsLTIwLC0xMCwgIDcsIC0zLCAtMSwgMTUsICAyLCAgNiwgLTUsIC03LC0xMCwtMjAsICAxLAorICAgICAgLTQsIDE0LCAgOCwgLTIsICAzLC0xMywgLTMsICAxLCAtNCwgIDEsIC0zLCAgMiwgIDgsIC03LCAxNiwgLTQgfSwKKyAgICB7ICAxLCAtMiwgLTIsIC0zLCAtNCwgLTcsICAwLCAgMywgIDYsICA3LCAgMywgIDIsICAxLCAtMiwgLTEsICAwLAorICAgICAgLTYsICA0LCAgMiwgLTQsIC0zLCAtNCwgIDUsICA5LCAgNSwgIDAsIC0zLCAtMywgLTQsIC03LC0zMSwtNTAgfSwKKyAgICB7IC0xLCAtMywgIDcsICAyLCAtMSwgIDIsICA0LCAgNiwgIDAsIDEwLCAtMiwgIDAsLTIwLCAtNiwgLTMsICA5LAorICAgICAtMjAsLTIyLCAtMSwgLTEsIDE1LCAgOSwtMTIsIDEwLC0xMywtMjAsIDEyLCAgMywgIDUsICA2LCAtNywtMjYgfSwKKyAgICB7ICAwLCAgNCwgLTIsLTE0LC0xMiwgIDYsLTEzLCAxMSwtMTAsICAzLCAyMiwgIDYsIDE2LCAtMiwgLTUsICAxLAorICAgICAgLTMsLTExLCAgMCwgLTcsICA1LCAtNSwgIDAsICAxLCAtMSwgLTYsICA4LCAgOCwgMTAsICA5LCAtNSwtMjcgfSwKKyAgICB7IC01LCAxMCwgLTIsICA3LCAgOSwgLTksICA1LCAtOSwgIDUsICA0LC0xNSwgMTQsICAxLCAgMywtMTAsICA1LAorICAgICAgIDAsIC0yLCAgNywgIDMsLTEzLCAgNiwgIDksIC02LCAgNSwtMTQsLTE3LCAtMSwgMTEsIDE0LCAtMiwtMjYgfSwKKyAgICB7ICAwLCAgNiwgLTMsICAwLCAtOCwgIDYsICAwLCAgMSwgIDQsIC04LCAgMiwgLTUsICA0LCAgNywgMTUsIDExLAorICAgICAgIDksIDE5LCAtMiwgMTQsIC04LCAgNywgLTEsICAzLCAtMywgLTMsLTEwLCAtMiwgMTIsIC0yLC0xMiwtMjkgfSwKKyAgICB7LTEyLCAtNSwgIDAsIC0zLCAtMiwgIDYsICAzLCAtMywgIDIsIC0yLCAgMSwgMTEsICAyLCAtNywgIDUsICAxLAorICAgICAgIDIsIC0yLC0xNCwgIDAsIC0xLCAtNSwgIDMsICA4LC0yOCwtMjYsICA2LCAtNiwgIDMsICA4LC0xMCwtMjcgfSwKKyAgICB7IC0xLCAtMywgIDYsICAyLCAgNCwgMTUsICAxLCAgMCwgIDIsIC0yLCAtMiwgMTMsICAzLCAgNiwgIDAsICA2LAorICAgICAgLTEsIC00LCAtMSwgLTUsICA4LCAtMSwgIDUsIC01LC0xNSwgMTEsIC04LCAtNSwgMTQsIC02LC0xNCwtMjkgfSwKKyAgICB7IC01LCAtNiwgIDAsICAxLCAgMCwgIDYsIC0zLCAgMiwgLTUsIC0xLCAgNSwgLTMsICAyLC0xMCwgIDMsICA0LAorICAgICAgIDMsICAwLCAxMywgLTMsIC0xLCAgNCwgLTQsIC02LCAgMiwgIDksICA4LCAgMiwgLTMsIDI4LC0xMSwtMzEgfSwKKyAgICB7ICAxLCAtNCwtMTAsIC05LCAtNCwgLTMsLTE1LCAtNiwgIDEsICA1LCAtMywgLTYsICA1LCAtNiwtMjIsIDI3LAorICAgICAtMTMsICA1LCAgMywgLTcsIC00LCAyMCwgLTcsLTEyLCAtMSwtMjQsIC00LC0xMywgLTgsLTExLC0xNSwtMjEgfSwKKyAgICB7IC02LCAtNCwgMTksIC02LCAgMiwgMTEsIC02LCAgMSwgLTMsLTEwLCAgOSwgLTksIDEyLC0xMCwgIDIsICAxLAorICAgICAgLTksICAxLCAxNSwgIDcsIC01LCAgNSwtMjksLTM1LCAgNCwtMzAsICA5LCAgOSwgMTksIDE3LCAgMiwtMTcgfSwKKyAgICB7IC0zLCAgMywgLTMsICAxLCAgMiwgIDUsIC0xLCAgNSwgLTIsIC0zLCAgMSwgLTMsIC04LCAgMywgLTQsIC0yLAorICAgICAgLTQsIC0xLCAxMiwgIDAsICAyLCAtOCwgLTYsIC00LCAxNiwgLTEsLTE0LCAtMiwgMjUsIC02LC0xNSwtMzYgfSwKKyAgICB7ICAwLCAtMSwgIDMsIC00LCAtNCwgLTEsICA3LCAtNCwgIDgsICAwLCAxMCwgIDksIC00LCAgMSwgMTAsIC0xLAorICAgICAgLTMsLTEzLCAtNSwgLTQsIC0xLCAtNCwgIDgsIDExLCAxNCwgLTcsIC01LCAxNiwgMTIsIDEzLCAtMSwtMjggfSwKKyAgICB7ICAxLCAtMiwgIDIsIC0zLCAtOCwgMTAsICA0LCAgOSwgMTIsICAzLCAgNSwgIDAsICA4LCAtMywgLTYsICAyLAorICAgICAgMTYsLTExLCAxMSwgIDAsICAxLCAgNiwgIDEsIDE4LC0xMCwtMTYsIC0xLCAtNCwgIDUsLTE0LC0xNSwtMjAgfSwKKyAgICB7ICAxLC0xMiwgIDUsICA0LCAtNywgIDgsIC0xLC0xNywgLTIsIC05LC0xNCwtMTEsICA2LCAtOSwgIDUsIC00LAorICAgICAgIDMsIC0yLCAgNywgMTgsIC01LCAgNSwgIDYsIC0xLC0xMSwgLTIsLTEwLCAtMywgIDgsIC0zLCAtMiwtMzIgfSwKKyAgICB7LTEyLCAgNSwgMjAsIC01LCAtNiwtMTEsIC02LCAtNiwtMTMsICA0LCAtNiwgMTksIC04LCAgMiwgIDMsIC05LAorICAgICAgLTQsIC00LCAtMSwgIDksIC0xLCAyMSwgLTEsICA3LCAxNSwtMTAsIC0xLCAtMywgIDksIC0zLCAgMiwtMjQgfSwKKyAgICB7ICAwLCAtMywgIDIsIC02LCAgNCwgLTEsIC05LCAtMiwgLTEsIC0zLCAgNiwgLTEsIC01LCAtNiwgLTUsIC04LAorICAgICAgIDAsIC0yLCAtNiwgIDksIC00LCAgMywgIDIsLTEzLCAgMSwgLTcsIDIzLC0xMywgIDQsIC0zLC0xNSwtMzMgfSwKKyAgICB7IC03LCAgMiwtMTUsIDExLC0xMCwgMTQsICAwLC0xMSwgIDMsIC0xLCAxMiwgLTQsIC00LCAgOSwgMTEsLTEzLAorICAgICAtMTMsIC0zLC0xNCwgIDEsICAzLCAgNiwgLTUsICA4LCAgMCwgIDUsICA1LC0xMCwgIDQsICA1LCAtNiwtMzAgfSwKKyAgICB7IC02LCAgNCwgIDAsIC01LCAgNCwgIDEsIC0xLCAtMSwgIDMsICA2LCAgNSwgLTIsIC01LCAgMCwgLTIsICA1LAorICAgICAgLTQsIC0yLCAtNCwgLTIsICA0LCAgNywgLTcsIC0xLCAgMSwgLTQsIC0zLC0xOSwgMzcsIDEyLCAxMCwtNDAgfSwKKyAgICB7IC03LCAgMiwgLTcsLTEyLCAxNywgMTEsIC03LCAgMiwgIDIsICAzLCAgMSwgLTEsICAzLCAgNCwgLTIsIC01LAorICAgICAgIDksIC05LCAgNiwgIDQsICA5LCAxMiwgMTEsIC01LCAgMiwgLTEsICAwLCAgOSwgIDUsIC03LCAtMiwtMjQgfSwKKyAgICB7IC03LCAgNiwgIDEsICAzLCAgMSwgIDAsICA2LCAgMCwgIDQsLTEyLCAtMiwgLTIsICAxLCAtOSwgMTAsIC0yLAorICAgICAgMTEsIC0xLCAyMSwtMTIsIDE1LCAtNSwgMTAsIC01LCAgNSwgLTUsIDE0LCAtNiwgIDUsIC03LCAtMywtMjkgfSwKKyAgICB7IC0yLCAgMCwgLTUsIC0yLCAtMywgIDEsIC0zLCAgMCwgIDQsICAyLCAgMywgIDAsICAyLCAtMiwgIDcsIC0yLAorICAgICAgIDMsIC01LCAgMiwgLTEsICA2LCAtNCwgIDAsIC0zLCAgOCwtMTEsIDE5LCAtOCwgMjIsLTM0LCAxMywtMzUgfSwKKyAgICB7IC0xLCAtMywgLTEsICA5LCAxMSwgLTMsIC0zLCAtMSwgIDcsIDE4LCAxMSwgLTUsICAyLC0xMiwtMTEsIDE4LAorICAgICAgIDksIC01LCAgMSwgLTYsIC05LCAxMiwgIDEsIC0zLCAtMywgLTksLTE0LCAgOSwgIDksICA4LCAtNiwtMjYgfSwKKyAgICB7ICAwLCAgNSwgLTUsIC0xLCAtMSwgLTIsICA0LCAgNiwgIDgsICAyLCAtMSwgLTIsICA1LCAgMSwgLTUsIC00LAorICAgICAgIDEsICAxLCAxOCwgIDEsICA3LC0xMCwgIDMsIC0yLCAxMiwgLTEsLTE1LCAgOSwgMTIsLTE0LCAxMywtMzggfSwKKyAgICB7ICAzLCAgMCwgLTgsIC0xLCAgMCwgIDgsIC05LCAtMywgLTgsIDE2LCAgMywgMTYsIC01LCAtOSwgIDAsIC0xLAorICAgICAgLTcsIC0xLCAtNCwgMTMsICA3LCAgMCwgIDEsICAyLCAtMSwtMTYsICAwLCAtMiwgIDEsICA4LCAtOCwtMjggfSwKKyAgICB7ICA3LCAgOSwgLTUsIC0zLCAtMiwgIDIsICAwLCAgMywgMTEsIC02LCAtNCwgLTIsIC0yLCAtNSwgMjgsLTE4LAorICAgICAgLTYsICAyLCAxNSwtMTAsLTE1LC0xMCwgLTIsICAwLCAtMiwgLTIsICA0LCAtMywgIDcsIDExLCAgNSwtMzAgfSwKKyAgICB7ICA5LCAgMCwgLTcsIC0xLCAtNCwgLTcsICAyLCAgMiwgIDksIC0yLCAgMiwgIDMsIC04LCAtNiwgLTYsICAzLAorICAgICAtMTAsICA0LCAxMCwgIDUsIDIxLCAtNCwgMTQsLTE4LCAgMSwgIDMsLTEwLCAtMiwgIDYsIDE0LCAtOCwtMjYgfSwKKyAgICB7LTE0LCAtMSwgIDIsICAzLCAtMywgIDcsICAxLC0yMiwgLTEsIC0xLCAgMCwgIDEsIDEyLC0xNCwgIDMsIC01LAorICAgICAgIDAsIDEwLCAtMywgIDEsIC01LCAxMiwgLTMsIDEwLCAtOCwtMjIsLTExLC0xMywgLTcsLTEwLC0xMywtMjUgfSwKKyAgICB7IC0yLCAtNSwgLTQsIC00LCAtOSwtMTgsICA5LCAtMywgLTUsIDE3LCAxMywgIDUsICA2LCAxMSwgIDMsICA4LAorICAgICAgMjAsICA0LCAgMiwgIDksICA4LCAgNSwgIDYsICAxLCAgNywgLTcsIC02LCAtMiwgLTcsICAwLC0xNywtMjMgfSwKKyAgICB7IC01LCAtNSwgIDIsICAwLCAgNiwgIDIsIC0yLCAgMiwgLTMsICA0LCAgNCwgIDAsIC01LCAtMiwgLTQsICA2LAorICAgICAgIDgsIDEwLCAtMSwgIDEsIC01LCAgNSwtMTQsIC0yLC0xMSwgIDgsICA2LCAyNSwgIDcsIC0xLCAgMCwtNDMgfSwKKyAgICB7IC00LCAgMCwgIDQsIC0yLCAgNywgIDAsICAzLCAxNywgIDUsICAyLCAtNSwgIDEsIDIxLCAgMywgLTIsLTEwLAorICAgICAtMTYsIC05LCAgNywtMTIsICA5LCAtOCwgIDIsICA1LCAtNSwtMTAsIC0yLC0xMSwgLTUsIC0xLCAtOSwtMzAgfSwKKyAgICB7IC0yLCAgMywgIDEsIC00LCAtMSwgIDAsICA4LCAgMSwgMTIsICA0LCAtMSwgLTEsICAzLC0xNywgMTMsICA5LAorICAgICAgIDAsICA3LCAtNiwgLTUsICA5LCAgMSwgIDUsICA0LC0xMCwtMTgsICAwLCAxNCwgMTEsIC00LC0xNiwtMjggfSwKKyAgICB7IC0xLCAgMCwgIDIsIC0xLCAgNCwgIDEsIC0xLCAgMSwgLTEsIC0yLCAtMSwgLTIsICAzLCAgMCwgIDAsIC0xLAorICAgICAgLTEsICAxLCAgMiwgLTIsICAzLCAgMywgLTIsICA0LCAtMiwgLTEsIC02LCAgMSwgLTEsIC0xLCAgNiwtNzAgfSwKKyAgICB7ICA3LCAgMywtMTEsIC0xLCAxMiwgLTQsLTE0LCAgNCwgIDQsIC00LCAgNCwgLTIsICAyLC0xMiwgLTQsIDE1LAorICAgICAtMTcsIC00LCAtMywgIDYsICA4LCAtNSwgMjIsLTIyLCAgNSwtMTEsIDE1LCAtNCwgIDQsIC0xLC0yMSwgLTEgfSwKKyAgICB7IDEwLCAtMiwtMTMsIDExLCAgNCwgMTQsICA0LCAgOSwgIDgsICA4LCAxOSwgMTUsIDE0LCAxNSwgIDUsIDEwLAorICAgICAgIDgsIDE1LCAtNSwgIDQsIDE0LCAtOCwgIDEsICAxLCAgMiwgIDEsIC0xLCAtMywgMjEsICA4LC0yOSwgMTMgfSwKKyAgICB7IC02LCAgMCwgLTYsICA2LCAtMSwgIDIsICA4LCAtNCwgLTUsICA0LCAtNCwgLTUsICAwLCAtMiwgLTQsICAwLAorICAgICAgIDksIC0yLCAgMSwgLTIsIDI2LC0xOSwgMjEsLTEwLCAgNCwgIDEsIC04LCAgNSwgMjIsLTEwLC0xMywgMTUgfSwKKyAgICB7IDExLCAtNSwgIDEsICAwLCAgNiwgIDMsICA3LCAtMiwgLTIsIC0zLCAtNSwgLTEsIC0yLCAtNiwgIDEsICAxLAorICAgICAgLTgsIC01LC0xMywgMTMsIC0yLCAtMywgLTEsIC05LC0yOCwgIDQsICAyLC0xMSwgMTgsLTIwLC0yNCwgIDkgfSwKKyAgICB7ICA3LCAgNCwgLTMsICA2LCAgNiwgLTYsIC03LCAtNSwgLTcsIC00LCAtNCwgIDAsIC03LCAtNSwgLTYsIC01LAorICAgICAgIDIsLTEzLC0xMiwgIDIsICAwLCAgNSwgMTgsIDE1LC0xMywgLTcsIDEzLC0yMCwgMTYsLTEwLC0xOSwgIDYgfSwKKyAgICB7ICA1LCAtOCwgLTEsICA1LCAxMCwgIDIsIC0xLC0xMCwtMTEsIDIzLCAgOCwgLTUsIC04LCAgNCwgLTUsIC00LAorICAgICAgLTUsIC01LC0xMSwgLTgsICA1LCAgMSwgIDcsIC05LCAtOSwgLTYsIDEyLCAxNCwgMTcsLTEyLC0yMiwgIDMgfSwKKyAgICB7IC01LCAtOCwgLTMsICAzLCAxMiwgLTEsICAwLCAtNCwgLTUsICAxLCAgMSwgIDYsICAxLCAgNSwgLTUsICA3LAorICAgICAgLTIsICA3LCAgMSwgIDYsICA2LCAgMiwgIDAsIC01LCAxNywgLTQsIC01LC0yNCwgMTMsLTIwLC0yNywgMTQgfSwKKyAgICB7IC0xLCAgMiwgLTMsICAxLCAtMywgIDEsIC0zLCAgMCwgLTIsICAzLCAtMiwgIDEsICAyLCAtMSwgLTIsIC0xLAorICAgICAgLTIsIC01LCAgNSwgLTIsICAwLCAtNywgIDEsIC02LCAgOCwgIDgsIDExLCAtNSwgMjQsLTQzLC0xMywgIDIgfSwKKyAgICB7IC0yLCAgNCwgIDcsIC0zLCAtNCwgIDQsIDEzLCAtNCwgIDAsICAwLCAtMiwgIDksICAwLCAtMywgLTYsICAxLAorICAgICAgLTcsICAxLCAtMSwgMTAsICAwLCAgNSwgLTEsLTI0LCAyNSwtMTUsICA3LCAgMiwgMjIsLTEwLC0yMSwgIDAgfSwKKyAgICB7IC01LCAgMiwgIDYsIC0yLCAxMywgIDMsICA1LC0xMiwtMTEsIDE2LCAgNiwgMTAsIC01LCAgMCwgLTMsICA2LAorICAgICAgIDUsIC01LCAtNSwgMTAsIDEyLCAxMCwgMTEsIC03LCAgOCwtMTQsICAyLC0xNSwgMTMsLTE0LCAtOCwgLTMgfSwKKyAgICB7ICA1LCAgNiwgLTcsIC01LCAgNSwgIDIsICA5LCAgNSwgIDAsIC0xLCAtNCwgIDIsICA4LCAgMCwgIDMsICA1LAorICAgICAtMTIsICAzLCAtMywgLTYsICAyLCAtMSwgLTUsIDE0LCAxMSwtMjAsLTIxLC0yNSwgMjQsIC0xLC0xMCwgIDYgfSwKKyAgICB7IC01LCAgNSwgLTIsICA5LCAgNCwgLTQsIC0xLCAtNiwgMTEsIC02LCAgNSwgIDAsICAyLCAtMywgIDYsIC0xLAorICAgICAtMTcsLTE4LCAtNCwtMTMsICA5LCAtMSwgIDksIC03LCAtNCwgLTgsICAyLCAtMywgMTIsLTMxLC0xOCwgIDUgfSwKKyAgICB7IC03LC0xMSwgIDYsIC04LCAgNCwgLTMsLTEyLCAgMCwgLTEsIC02LCAtMywgIDAsICA1LCAgOSwgIDcsICAyLAorICAgICAgIDEsIC04LCAtNiwgIDgsICAyLCAtNSwgIDcsIC0xLCAxNiwtMTAsIDE2LC0xMiwgMTgsIC0xLC0yNSwtMTIgfSwKKyAgICB7ICAzLC0xMiwgIDEsICAyLCAtMiwtMTgsIC04LC0xNSwtMTAsIC05LCAgMiwgLTcsIDExLC0xMSwgIDIsIC0xLAorICAgICAgLTEsIC0xLCAtOSwgLTYsICAzLC0xNCwgLTIsIC0xLCAgMiwtMTMsIC03LCAtOSwgMTksIC01LC0xNywgIDIgfSwKKyAgICB7ICA3LCAgMSwgLTgsICA3LCAxNywtMTMsLTEwLCAgNSwgIDcsICAxLCAtNiwgIDQsICA5LCAtNCwgIDAsICAzLAorICAgICAgIDgsICAxLC0xNCwgLTksICA0LCAgNywgLTksICAwLCAgNiwgLTUsLTEyLCAtMiwgMjUsIC0yLC0xOSwgIDEgfSwKKyAgICB7ICA3LCAtMywgIDYsIC0zLCAgMSwgIDYsIC03LCAgMCwgMTAsICAwLCAgNCwgLTUsLTE3LCAtNCwgIDQsIC0xLAorICAgICAgIDAsIC0zLCAtNywgMTksIDI0LCAtMSwgMjEsICA4LCAxMCwgIDksICA4LCAtMSwgMjMsIC0yLC0xOCwgLTIgfSwKKyAgICB7ICAzLCAtMywgIDAsICA1LCAgOCwgLTIsIC05LCAgMiwgIDksICA2LCAxOSwgIDgsICAyLCAgNiwgLTksIC0yLAorICAgICAgLTQsIC0zLCAtOCwgIDcsIC03LCAtOCwgIDUsICA0LCAyNiwgLTYsICA3LCAxOCwgMjQsICAwLC0xMywgIDQgfSwKKyAgICB7ICAwLC0xMywtMTEsIC0xLCAgMywgLTksICA1LCAgNCwgLTcsICAzLCAgMCwgIDIsIC0xLCAgNCwgLTUsICAyLAorICAgICAgIDksIC0yLC0xMSwgMTUsICAxLC0yMSwgIDEsIC0xLCAgMCwgIDQsLTE0LCAtNCwgMjQsLTE2LC0xMywgIDEgfSwKKyAgICB7ICAxLCAtOSwgLTgsICAwLCAgMCwgLTQsIDExLCAtMSwgMTQsIDE2LCAgMCwgMTcsIC0yLCAtOSwtMTIsICAwLAorICAgICAgLTEsLTE0LCAtOSwtMTQsICAwLCAtMiwgMTksICA0LCAgNiwgIDQsICA0LC0xMSwgIDgsLTE3LC0xOSwgLTUgfSwKKyAgICB7IC0zLCAgMSwgIDIsIDEyLCAtNCwtMTgsIC0xLCAtNCwgLTcsIDE0LCAtMywgIDIsICAwLCAtNywgLTgsIDEyLAorICAgICAgLTUsIC05LCAxNCwgMTIsIC05LCAtMiwgIDQsIC02LCAgNCwgMTgsIC0xLC0yNSwgMjIsICAyLC0yMywgLTUgfSwKKyAgICB7IC0yLCAgMCwgIDAsICAwLCAgMSwgIDMsICA1LCAtMSwgIDUsIC0yLCAtMiwgIDIsIC0zLCAgMCwgIDEsICAyLAorICAgICAgIDAsIC0xLCAgMiwgLTEsIC05LCAtNiwgLTcsIC00LCAtMiwgIDQsIC03LCAtNSwgNjQsIC0zLC0yNSwgIDQgfSwKKyAgICB7IDEyLCAtMiwgLTMsICAwLCAgOCwgLTksIDEzLCAtNywgIDYsIC0zLC0xMiwgMTIsIDE1LCAtOSwgLTQsICAyLAorICAgICAgIDksIC00LC0xMiwgIDMsIDE0LCAgMSwgIDcsLTE1LCAxNSwgIDAsIC02LC0xMiwgIDAsIC0zLC0yMCwgIDYgfSwKKyAgICB7ICAyLCAtMSwgLTQsICA1LCAgOSwgIDYsIC03LCAgMiwgLTIsIC03LCAtMiwgIDAsIC0xLC0xOCwgLTQsIC02LAorICAgICAtMTUsIC01LCAxMSwgIDUsLTEwLCAtMSwgIDIsICA3LCAxMiwtMTksIC03LCAgOCwgMjEsIC00LC0xNSwgIDQgfSwKKyAgICB7ICA0LCAgMiwgIDUsICA1LCAtNSwgIDEsICAzLCAgMiwgLTgsIDEzLCAgMCwgLTUsIC0yLC0xNCwtMTEsICA2LAorICAgICAgIDIsIDE3LCAgOCwtMTMsIDI2LCAtMiwgIDUsLTE1LCAtNCwtMTQsIDEyLCAtOSwgMTMsLTIxLC0yMywgLTQgfSwKKyAgICB7ICAyLCAtMywgLTIsIC0zLCAgMywgLTIsICA2LCAgOSwgLTksIDEzLCAgNCwgIDIsIDEyLCAtMywgLTMsICAxLAorICAgICAtMTcsLTIyLCAtMywgIDQsICAzLCAtMiwgIDEsIC05LCAgMSwgLTYsIDExLC0xMywgMTQsICAwLC0xNSwgIDYgfSwKKyAgICB7LTE2LCAtNCwgMTcsIC0yLC0yMCwtMTEsIDExLCAxMCwgIDUsIC04LCAxNiwgIDIsLTE3LC0xNCwgMTEsIDExLAorICAgICAgLTYsLTExLCAtNywgMTIsIDEyLC0xMCwgLTYsICA1LCAgOCwgLTQsIC0yLCAtNSwgMjgsICAzLC0xMywgIDQgfSwKKyAgICB7ICAwLCAtMywgIDMsIC03LCAgNiwgIDgsLTEyLCAyMCwtMTksIDE4LC0xMSwgMTAsIC01LCAgMCwgLTksIDExLAorICAgICAgIDMsICAwLCAtMiwgIDksIC03LCAtNSwgMTgsICAzLCAtMiwtMTYsICAxLCAgNiwgMTIsIC03LC0xNiwgIDEgfSwKKyAgICB7ICA0LCAgMSwgIDUsIC01LCAxNSwgIDIsIC04LCAgMywgIDUsLTExLCAxNSwgLTMsICA4LCAtOCwgLTEsICA3LAorICAgICAgIDQsICA3LCAtMiwgIDYsIC05LCAgNSwgMTIsICAyLCAzMywgLTIsIC02LC0xOCwgIDQsICAwLC0xOCwgMTEgfSwKKyAgICB7ICAzLCAtMSwgIDEsIC0xLCAgMCwgIDEsICA0LCAtMSwgLTUsICAwLCAgMSwgIDAsICA0LCAgMiwgLTEsICA0LAorICAgICAgLTMsICAyLCAgMCwgLTIsICA0LCAgNiwgLTEsICA2LCA0MiwgMTksIC00LC0zNywgMTksICAxLC0xNSwgLTQgfSwKKyAgICB7ICAyLCAgMCwgLTUsICAwLCAxMCwgIDAsICAwLCAtNSwgIDMsICAwLCAgMCwgLTMsIC0zLCAgMCwgIDIsIC00LAorICAgICAtMTAsICAyLCAtNiwgIDQsICA0LCAgMSwgMjcsIC03LCAxNywtMzQsICA1LCAtOSwgMTUsLTE2LCAtNywgLTUgfSwKKyAgICB7IC0yLCAgNywgIDcsIC0yLCAgOSwgLTIsLTE1LCAxMSwgMTEsICA3LCAgNSwgIDEsIDE1LCAgMSwgLTksIDMxLAorICAgICAgIDIsLTE1LCAgMiwgIDQsICAzLCAgNCwgLTEsIC04LCAgMiwgLTcsICA2LC0xNywgMTEsLTE0LC0xMSwgIDIgfSwKKyAgICB7ICAxLCAgMSwtMTEsICA5LCAgOSwgLTYsLTE0LC0xMSwtMTAsICA4LCAtMywgMTEsIDE2LCAtOSwgLTgsLTEzLAorICAgICAgLTgsICA5LCAgMCwgIDYsICA2LCAtMiwgMTMsIC04LCAtMiwgIDMsIDEzLCAtMywgMTAsIC02LC0xNywgIDQgfSwKKyAgICB7IDE0LCAgNSwgIDQsIC02LC0xMiwgMTAsIC03LCAgOCwgMjEsIC04LC0zMCwgMTUsIC0yLCAgMSwgMTEsIC05LAorICAgICAgLTUsICAxLCAgMCwgLTEsIC0xLCAtNiwgLTIsICAzLCAtNSwgIDcsICA5LCAgNSwgLTUsICAyLCAgMCwgIDEgfSwKKyAgICB7IC0xLCAgMiwgMjAsLTE3LC0xNSwgIDMsICAzLCAgNywgMTEsLTE3LC0xMywgLTYsIC0zLCAxOCwgMTcsLTE1LAorICAgICAgLTQsIC00LCAtNSwgMjIsIDE0LC0xNCwgLTIsLTEwLCAtNywgMTEsICA4LCAtNywgLTMsICAwLCAtNywgMTEgfSwKKyAgICB7ICA3LC0xMSwgLTcsIC04LC0xNCwgMjIsICA1LCAgMiwgIDYsIDEzLC0xMiwgLTIsIDEwLCAgMywgIDAsLTIxLAorICAgICAgLTQsIDIwLCAgMywgMTAsIDIxLC0xMCwtMTIsICA4LCAxMSwgIDIsIC01LCAgMiwgIDEsICAzLCAtMSwgMTUgfSwKKyAgICB7IC0xLCAtMiwgLTEsIC0yLC0xMywgIDgsIC00LCAgMCwgIDcsIC0yLC0xNywgIDgsIDE4LCAgNSwgIDMsICA4LAorICAgICAgLTgsIC0yLCAgMywgLTQsIDE0LC0xOCwtMTMsIDE0LCAxNSwtMTMsIC0xLCAtMiwgIDQsIDExLCAgMSwgMTIgfSwKKyAgICB7IDEzLCAtNiwgLTQsLTE2LC0xNywgMTYsIDIxLCAtMiwgIDUsLTExLCAtOSwgMTksIDIxLC0xNywgLTMsLTE3LAorICAgICAgIDMsIDEyLCAgOCwtMTIsIC02LCAgMSwgLTcsICA5LCAgOSwgLTcsIC01LCAtMSwgLTMsICA1LCAtNiwgLTQgfSwKKyAgICB7IDExLCAgNSwgMTIsLTIwLCAtNiwgMTAsICA0LCAxMiwgIDgsIC01LC0xMCwgMTUsIDEzLCAxNCwgMTAsLTE1LAorICAgICAtMTMsICAxLCAgNiwgMTQsIDE1LC0xNywtMTMsICA0LCAtNSwgMTAsICA3LCAtNiwgLTgsIC0zLCAtNCwgMTIgfSwKKyAgICB7IDI1LCAtMSwgIDcsIC01LCAtNywgMTEsICAxLCAxNywgMTMsLTE1LC0xNCwgLTQsICA1LCAgMywgIDgsIC0zLAorICAgICAgLTIsICAyLCAgMCwgIDYsIDE2LC0xMiwgLTYsIC00LCAgNCwgLTMsICA3LC0xMCwgLTMsIC03LC0xMywgIDcgfSwKKyAgICB7IC04LCAxMCwgLTMsLTEzLCAgNSwgIDIsICA0LCAgOSwgIDksLTE3LC0xMywgIDIsIDExLCAgMSwgIDYsIC00LAorICAgICAgIDgsLTEwLCAgNCwgIDEsIDE5LC0xNSwgLTQsIDEyLCAzMSwgIDcsIC01LC0xNywgLTQsICA5LCAtMiwgIDcgfSwKKyAgICB7IDE0LCAtNiwgLTYsIC02LC0xNCwgMTMsIDE3LCAtNSwgIDQsLTE0LCAtOSwgIDcsICA3LCAtOSwgIDMsLTE2LAorICAgICAtMTUsIDExLCAxMSwgIDYsICA0LC0xMSwtMTksICAzLCAgNSwgIDgsIDEzLC0xNCwtMTQsICAzLCAtNCwgMTIgfSwKKyAgICB7IC0yLCAtNCwgMTAsIC00LCAtNywgLTEsIDI3LCAgNSwgIDIsLTE2LC0xOCwgIDQsIDEyLCAtMiwgLTMsIC0yLAorICAgICAgLTEsICAxLCAtOCwtMTIsICAzLCAtNCwgIDgsIDE1LCAgMiwgIDQsICA5LC0xMywtMTQsICA5LCAtNywgIDUgfSwKKyAgICB7ICA0LCAgMiwtMTAsIC01LCAtNywgIDIsICAxLCAgNCwgLTEsIC02LC0xNSwgIDYsICAxLCAxMCwgIDUsLTEwLAorICAgICAgLTksIC0xLCAxMywgLTMsICA1LC0yMSwtMTEsICA4LCAgOCwgIDUsIDI3LC0yMSwtMTgsIC01LCAtMSwgMTUgfSwKKyAgICB7IDExLCAgMSwtMTYsIC04LC0xMSwgIDAsICA1LCAtOCwtMTIsLTEzLC0xNywgMjIsICA0LCAtNiwgLTEsLTE4LAorICAgICAtMTAsICAwLCAxOSwgIDIsIC0yLCAtOCwgLTcsIC0zLCAgMiwgLTIsIC05LC0xNywgLTUsICA0LCAgNCwgMTAgfSwKKyAgICB7ICA4LCAtNiwtMTksIC01LCAtNCwgMTIsIDE0LCAxNSwgMTAsIC05LCAtMSwgLTksIDE5LCAxMiwgIDAsIC0xLAorICAgICAgIDIsICA0LCAgNywgIDksIDE2LC0xNiwtMTQsICA5LCAtNCwgIDMsICAxLCAgMCwgLTIsIDEwLCAtMSwgLTEgfSwKKyAgICB7IDEyLCAtOCwgMTIsIC05LCAgMCwgMjUsICA3LCAgOSwgIDIsLTMxLCAtOSwgLTQsIDE1LCAgNCwgLTUsICAxLAorICAgICAtMTAsIDExLCAgOCwgMTAsICAwLCAtNiwgIDUsIDExLCAtMSwgLTYsICA0LC0xMCwgLTksICA2LCAgNCwgIDUgfSwKKyAgICB7IDE0LCAgNiwtMTcsIC0yLCAxNywgMTIsIC05LCAgMiwgIDAsLTI1LC0xNCwgIDUsIDIwLCAxNCwgIDgsLTIwLAorICAgICAgIDUsICAyLCAtMiwgLTMsICA5LC0xMywgLTMsIC0xLCAtNiwgIDMsICA3LCAtNiwgIDAsICAyLCAgMywgIDEgfSwKKyAgICB7ICA4LCAgNCwtMTUsIC0zLCAxMCwgMTgsIC00LCAxMywgIDgsLTIyLC0xMCwgIDksIDE5LC0xNSwgIDcsIC01LAorICAgICAtMTMsIDEyLCAtNCwgIDksICAyLCAtOSwgLTYsICAwLCAgMiwgIDEsIC05LCAtNiwgIDYsICAxLCAtMSwgMTEgfSwKKyAgICB7ICA0LCAgMSwgIDQsIC01LC0xMCwgMTgsICA3LCAgMiwgLTQsIC05LC0xMSwgIDAsIDMyLCAtNywgIDQsLTE2LAorICAgICAgLTEsICAwLCAgNiwgIDMsICA2LCAtMywtMTQsIDE2LCAgOSwgLTIsICA3LCAtMSwgIDAsIC01LCAgNSwgLTMgfSwKKyAgICB7IC0zLCAgMiwgIDMsIC04LCAtNiwgIDQsICA2LCAgMiwgIDQsLTEyLC0xNSwgIDIsICA4LCAgOCwgIDksIC0zLAorICAgICAtMTgsICA2LCAzNCwgMTEsIDEyLC0xNSwgLTEsICAyLCAgOSwgIDIsIC00LCAtNCwgIDIsICA0LCAgMiwgLTMgfSwKKyAgICB7IDE4LCAtNiwtMTIsIC04LCAtMSwgMTUsIDIwLCAtNCwgLTEsLTExLCAtNSwgIDYsICA2LC0xMSwtMTUsIC03LAorICAgICAgIDMsICA3LCAxMCwgIDIsICA4LC0xMCwgLTUsICA4LCAxNSwgLTUsICA1LC0xNywtMTMsIDEzLCAxMSwgIDcgfSwKKyAgICB7ICA4LCAtNCwgLTYsIC0xLC0xNCwgLTMsICA2LCAtMiwgIDEsIC01LCAtMSwgMTAsIDEwLC0xNSwgIDUsICAwLAorICAgICAtMTAsIC00LCAtMywgIDcsIC00LC0xOSwtMTUsIDI3LCAxMSwgMTgsICAzLC0xOSwgLTIsICA2LCAgMCwgMTIgfSwKKyAgICB7IDEyLCAgMCwgLTUsICAwLCAgNCwgLTUsICAxLCAgNSwgMTAsIC03LC0xMSwgMjEsIDI5LCAgMSwgLTIsICAxLAorICAgICAgLTQsLTExLCAtMSwgMTMsIDExLC0yMCwgLTEsICA0LCAgNCwgIDQsIC01LCAgNiwtMTMsIC0yLCAxMSwgIDkgfSwKKyAgICB7ICAyLCAtNywgLTcsIC0zLC0xMCwgLTEsIDIwLCAxMiwgIDEsLTE5LC0xOSwgLTEsICA1LCAgNCwgLTcsLTI1LAorICAgICAgMTQsICAxLCAtMywgIDIsIDEyLCAtNCwgLTMsIC0zLCAtMiwgIDYsICAxLCAgMCwgIDMsICAyLCAgNSwgLTEgfSwKKyAgICB7IDEyLCAtOCwgIDMsLTEyLC0xMCwgMTAsIDEzLCAgMCwgMjMsLTE0LC0xOCwgMTAsICAwLCAxNSwgIDMsLTEyLAorICAgICAgLTMsIC01LCAgNSwgLTQsICAyLC0xNCwtMTAsICA4LCAgMiwgIDksIC0xLC0xMSwgLTMsICA1LCAxMywgIDIgfSwKKyAgICB7ICA5LCAtNiwgIDcsIC03LC0zMCwgMTcsICA2LCAxMywgIDEsLTE0LCAgMCwgLTEsICA2LCAtOSwgIDgsICAzLAorICAgICAgLTQsICAwLCAtMSwgLTcsIC01LC0xMywtMTksIC0zLCAtNCwgIDQsIC02LCAtMiwtMTMsICAxLCAtMiwgIDMgfSwKKyAgICB7IDEwLCAgMSwgIDMsLTE4LC0yNiwgMTcsICA0LC0xNiwgIDQsIC0zLC0xMywgLTQsIC02LC0xMSwgLTQsLTIxLAorICAgICAgIDcsICA4LCAgMiwgIDUsIDEzLCAtNiwgIDEsICA1LCAgOCwgIDcsICA5LCAtNiwgLTYsICAxLCAtMSwgIDIgfSwKKyAgICB7IC0zLCAtMSwgIDAsIC0yLCAtMiwgIDAsIC0xLCAgMywgIDQsLTE0LCAtOCwgLTksIDEzLCAgMiwgNTAsLTIzLAorICAgICAgLTgsICA4LCAgNywgMTEsIDE2LCAgMywgLTcsICAwLCAtMiwgIDYsICA1LCAtMSwgIDEsIC0yLCAgNCwgIDMgfSwKKyAgICB7ICAxLCAgMywgIDEsICAxLCAtNiwgIDMsICA2LCAgNiwgIDIsIC0yLCAtMywgMTAsICAyLCAtOCwgLTUsIC01LAorICAgICAgIDUsICA0LCAgNCwgLTIsIDEwLCAtOCwtNDAsIC0xLCAyMSwgIDgsICAzLCAtNCwgLTEsIDEzLCAgNCwgIDcgfSwKKyAgICB7ICAyLCAgMCwgLTQsIC04LCAgNSwgIDIsICA3LCAtNSwgIDUsIC04LCAtNCwgLTEsIDEyLCAgMiwgMTIsLTEzLAorICAgICAgLTksICAwLCAgMSwtMTIsICA5LC00MywgIDEsIC01LCAxMiwgIDEsICAzLCAgNiwgIDEsIC0xLCAgMywgLTIgfSwKKyAgICB7ICA2LCAtMiwgLTEsICAxLCAgMCwgIDQsICA4LCAxNCwgIDQsIC03LC0yMywgLTUsIDIzLC0xNywgLTYsLTE1LAorICAgICAgLTgsICA3LCAxMCwgLTEsICA3LC0xNiwgIDQsIC02LCAgMiwgIDMsIC0zLCAtMywgLTEsICA4LCAtMSwgIDQgfSwKKyAgICB7IDEwLCAgNCwgLTQsICAxLCAgNywgLTMsICAyLCAxMSwgIDQsIC02LCAtMywgIDgsICA1LCAgNCwgIDEsLTQ1LAorICAgICAgLTYsIC00LCAgNCwgIDIsICAxLC0xNCwtMTAsICAxLCAgMSwgIDYsICAyLCAtOCwgLTEsIC0zLCAgMywgIDMgfSwKKyAgICB7ICAxLCAtMSwgIDIsIC0zLCAtOCwgIDksICAzLCAgMywgLTIsIC01LCAtOCwgIDgsICA3LCAtNywgLTQsIC02LAorICAgICAgIDUsIC05LCAxMSwgLTIsIDQ2LCAtNSwgLTEsICA5LCAtMiwgIDAsICAzLCAtNSwgLTMsIC01LCAgNywgIDAgfSwKKyAgICB7IC00LCAgMSwgLTIsIC0xLC0xMSwgMTEsICA4LCAtMywgLTIsLTEwLCAgMCwgIDQsICA5LCAgOSwtMTcsLTE3LAorICAgICAtMzQsIC00LCAtNSwgLTcsIC0zLC0xMiwgLTMsIDExLCAxOCwgIDMsIC0yLCAtNSwtMTgsIC01LCAtMywgIDYgfSwKKyAgICB7ICA3LCAtNSwgLTMsICAxLCAtNCwgLTMsIC01LCAtMSwgIDIsICA1LCAtMiwgIDMsLTEwLCAxMiwtMTgsIC01LAorICAgICAtMTAsIDEyLCAtOSwgIDQsIC02LCAgMiwgIDAsIDE2LC0xNywgMTUsIDE0LC0xMiwtMTAsIC0yLCAtOSwgLTEgfSwKKyAgICB7ICA0LCAtNSwgLTMsIC01LCAtMywgLTEsICA3LCAxOCwgLTcsIDEyLCAgMywgIDUsIC04LCAtNCwtMjAsICAxLAorICAgICAtMjUsICAxLCAtOCwgMTMsLTEwLCAgOCwtMTksIC0xLCAtOCwgMTAsICA2LCAtOSwgLTEsICAwLCAxMiwgIDQgfSwKKyAgICB7IC00LCAgNSwgIDAsIC0xLCAgMiwgIDUsIC04LCAtMiwgLTYsICA0LCAtOCwgIDksICAzLCAgMiwgLTcsICA0LAorICAgICAtMjUsIDEzLC0yMywgMTAsIDE0LCAxNSwtMTEsICAzLC0xOCwgIDQsIDE2LCAtNCwgIDEsLTEwLC0xMCwgIDMgfSwKKyAgICB7ICA1LCAtMywgLTEsIC0zLCAgNCwgIDEsIC0zLCAtNCwgLTUsICAxLC0xMiwgMTQsIC03LCAxMSwtMTUsICA2LAorICAgICAgLTYsIDI0LCAtNCwgMTMsIC0xLCAxNSwtMTMsICA4LCAgMywgIDcsIC01LCAgMiwgIDIsICAwLCAgMywgLTcgfSwKKyAgICB7IC0zLCAgMSwgIDAsICA4LCAgNiwgLTEsICA2LCAgNSwgLTUsIC0yLC0xMiwgIDQsICAwLCAtMiwgLTMsICA1LAorICAgICAgLTYsICAwLCAtOCwgIDksLTEwLCAgNCwtMjgsIDEyLC0yMCwgMTEsLTEzLCAgNywtMTgsICAxLC0xMSwgIDEgfSwKKyAgICB7ICAxLCAtNCwtMTUsICA1LCAgMCwtMTMsIC01LCAxMywtMTEsICA0LCAtNCwgLTUsICA1LC0xNCwtMTYsICAwLAorICAgICAtMTQsICA1LC0yMCwgMTIsIDEwLCAtNywgLTUsICA2LCAgNiwgMjIsICA2LCAtNCwgLTIsICAzLCAgOCwgMTEgfSwKKyAgICB7IDEzLC0xMSwgLTIsIDE2LCAxNiwgLTcsICAwLCAyMCwgLTcsIC0xLCAgMCwgIDUsIC05LCAxMiwgLTIsIC01LAorICAgICAtMjIsICA1LC0xMCwgMTIsIC02LCAxMSwgIDksIDIxLCAtOCwgMTUsICA0LCAgMCwgLTgsIC00LCAtNCwgMTAgfSwKKyAgICB7IDE4LCAtNCwtMTMsICAwLCAgMSwtMTUsIC0xLCAtMywgIDIsIDEwLCAtMSwgIDYsICAxLCAtNCwtMjAsIC01LAorICAgICAgLTgsICA2LCAtOCwgMTcsIC01LCAgNSwtMTAsICA4LC0yMiwgIDYsIC01LCAtMiwgIDgsLTE3LCAgOCwgIDIgfSwKKyAgICB7ICAxLCAtMiwgLTksICA2LC0zMSwgLTgsIC04LCAgOCwgIDAsICA1LCAtOSwgLTQsICAyLCAgMywtMTIsIDExLAorICAgICAtMTgsIDEwLCAtNSwgIDMsLTExLCAxMywgLTYsIDExLCAtMywgMTIsIC03LCAgMywgLTksIC0xLCAgMiwgMTEgfSwKKyAgICB7IC05LCAtNiwgMjEsIC04LC0xNSwgIDQsLTExLCAxMiwtMTEsIDE3LCAtMSwgIDIsIC02LCAgMCwtMTUsIDEzLAorICAgICAtMTIsIDE5LCAgMCwgIDIsIC02LCAtMywgLTksIDEwLCAgMywgMTcsIC0yLCAgNSwtMTAsIC0zLCAgMCwgIDEgfSwKKyAgICB7ICA0LCAtNiwgIDUsLTEwLCAgMSwgLTUsICAxLCAgMCwgIDAsICAwLCAgMiwgIDcsIC0yLCAgMiwgLTIsICAwLAorICAgICAgLTQsICAzLCAtNCwgIDEsLTEyLCAgNiwtNDksIDE2LC0xMCwgMTMsICAwLCAtMiwgIDgsICA2LCAgMSwgIDggfSwKKyAgICB7ICA1LCAtOCwgLTcsICA5LCAxMywgLTUsICA3LCAgMCwgMTAsIDExLCAtNCwgLTMsIC0xLCAxMywtMTQsICA2LAorICAgICAtMTUsIC02LC0xNCwgMTYsIDE1LCAgMSwtMTgsIC00LC0yMCwgMjAsIC03LCAtMSwgLTksIC0yLC0xMCwgMTAgfSwKKyAgICB7LTEyLCAgNCwgIDAsIDEwLCAgMCwgIDMsICA4LCAgNCwtMjcsIC0xLCAtMiwgMTksIC00LCAgMiwtMTMsICAzLAorICAgICAgIDEsICA5LC0xMiwgIDEsLTIyLCAxOSwgLTUsICA0LCAtOSwgMTIsICAyLCAtOSwgLTgsIDExLCAtMywgIDcgfSwKKyAgICB7ICA0LCAtNSwgMTEsIC02LCAxNywtMTcsICA1LCAtNCwgLTIsIC02LCAgMSwgLTUsICAyLCAgNCwtMTQsICA2LAorICAgICAtMjAsIDE5LC0yMCwgMTIsLTIxLCAgNSwtMTQsIDEzLCAtMiwgMTEsICA0LCAtMywgIDAsLTEwLCAtNCwgLTIgfSwKKyAgICB7IC0yLCAtMSwgLTMsICA4LCAtOSwgLTcsLTIyLCAtMywtMjQsIDEzLCAtMiwgMTAsLTE1LCAgNSwgLTksICA0LAorICAgICAgLTcsICAwLCAtNSwgMTUsIC04LCAxMSwtMTMsICA2LCAtNCwgMTksIC04LCAxMiwgLTQsICA2LCAgOSwgIDcgfSwKKyAgICB7ICAyLCAtMywgIDIsIC0xLCAgMCwgIDMsICAxLCAgMiwgIDEsIC00LCAtMiwgLTMsICAxLCAgNSwtMTIsICA2LAorICAgICAtMTYsIDE0LC0yMywgMTAsLTE0LCAxNywtMTUsIDE2LCAtMiwgIDksLTI1LCAgOSwtMTAsIDE2LCAgNCwgIDkgfSwKKyAgICB7IC0zLCAgNywgLTgsIC0zLCAgMiwgIDIsIC00LCAtOCwgLTksIDEwLCAgMywtMTEsIDI1LC0xMCwtMjgsIDI3LAorICAgICAgLTksICA3LC0xMywgIDksIC0yLCAgNCwtMTIsIC04LC0xNCwgIDYsICA3LC0xMCwgIDMsICAzLCAtMywgIDUgfSwKKyAgICB7IC04LCAtMywgIDEsLTEwLCAgOCwgLTMsIC05LCAtNCwgMTMsICA3LCAgMiwgIDQsLTEwLCAgNCwgIDMsICA3LAorICAgICAtMTgsICAyLC0yMiwgMTUsICA0LCAyMCwgLTcsICA1LCAtNiwgMTMsIC0xLCAgNCwgLTcsIC02LCAgNiwgMTMgfSwKKyAgICB7IC0yLCAgMywgIDAsICAyLCAtNCwgLTIsICAwLCAgMCwgIDEsICAyLCAtMiwgLTUsICAwLCAgMSwgLTQsICAwLAorICAgICAgLTIsIC0zLCAgMSwgIDIsIC0xLCAgMiwgLTgsIC0xLC0yNCwgNjgsIC0zLCAgOCwgIDMsICAzLCAtMSwgLTEgfSwKKyAgICB7LTE1LCAtMiwgLTksIC03LCAtMSwgIDgsLTE0LCAgOCwgIDMsICA2LCAgMCwgLTEsIC04LCAgOCwtMjMsICAyLAorICAgICAtMTQsIDE3LC0xNSwgIDgsIC00LCAgNywtMTgsICAwLCAtOCwgLTMsIC0xLCAtNCwtMTAsICA0LCAtMSwgIDQgfSwKKyAgICB7ICA4LCAgMCwgIDIsIC03LCAgMCwgIDUsICAxLCAgMywtMTEsICA0LCAtOCwgMTQsICAzLCAyMCwgIDEsIDI2LAorICAgICAtMTEsIDEzLC0xMywgMjAsIC0yLCAgMCwgLTgsICAyLCAtNiwgIDYsIC0xLCAgOSwgIDMsIC02LCAtMywgMTAgfSwKKyAgICB7ICA1LCAgMCwgLTEsIC03LCAxMCwgIDEsIC0zLCAgNSwgIDQsICA3LCAtNSwgLTEsIC0zLCAtMSwgMTIsIC0zLAorICAgICAtMTUsICA3LCAtOSwgMjIsLTE5LCAgOCwgLTksICA0LC0yMywgMTMsLTE0LCAgNiwgLTYsLTE0LCAtNCwgIDcgfSwKKyAgICB7IDE0LCAtNSwgLTgsLTEwLCAyNSwgIDMsLTIzLCAtNywtMjgsICAwLCAtMSwgLTksICA0LCAgMSwtMTMsIDIwLAorICAgICAgLTgsIDEwLC0xNiwgIDgsIDEyLC0xMywtMjEsICA1LC0xMywgMTEsIC0yLCAgMSwgMTIsIC03LCAgMiwtMTAgfSwKKyAgICB7IC01LCAtNCwgIDksICA1LCAtNiwgMzUsIC03LCAgOCwgMTUsICAyLCAtMSwgLTksIC02LCAgMiwtMTgsICA3LAorICAgICAtMTUsICA2LCAtMywgIDIsICA4LCAxMiwtMzAsICA3LCAtNCwgMjAsICAyLCAgNiwgMTMsIC02LCAtNCwgIDAgfSwKKyAgICB7ICAxLCAgOCwgLTksICA5LCAtNSwgMTIsIC05LCAxNiwgLTksIDE2LC0xNywgMTQsLTEzLCAxNSwtMTgsIDE0LAorICAgICAtMTUsIDE3LC0xMiwgMTQsLTEzLCAgNywtMTYsIDEzLCAtOSwgIDUsLTExLCAxMCwgLTksICA2LC0xMiwgMTMgfSwKKyAgICB7LTEwLCAtNCwgIDUsICAzLCAgMSwgIDYsICA4LC0xNCwgLTUsIDE1LCAgNywgIDQsICA4LCAgNywtMjIsICA4LAorICAgICAgLTcsIC04LC0xNSwgMjYsICAxLCAxMywgLTMsIDE3LCAtNSwgIDksIC0yLCAgNCwgLTYsICAzLCAtOCwgIDkgfSwKKyAgICB7ICA4LCAtMywgIDIsICAzLCAgMywgIDEsIC0yLCAtMSwtMTEsICA4LCAtNCwgIDAsIC02LCAtNSwgLTEsIDEzLAorICAgICAtMzcsICA5LCAgMSwgLTYsLTEwLCAtMiwtMTAsIDExLCAgOCwgMTMsIC0zLCAtMiwgLTYsICA4LCAtNCwgMTMgfSwKKyAgICB7ICAzLCAgMiwgLTMsIC00LCAtNCwgIDcsIC04LCAgOSwgLTgsICA5LC0yMCwgMTIsLTE5LCAxNSwtMTgsIDE3LAorICAgICAtMTUsICA3LCAtMSwgMjAsLTExLCAgNiwgLTYsICAzLCAgMSwgIDksICAyLC0xNCwgLTIsIC0yLCAgMiwgIDEgfSwKKyAgICB7IC03LCAgMSwgLTEsIC0zLCAtNiwgIDQsICA0LCAtMywgIDMsIC0xLCAgNSwgLTQsICAzLCAgMiwgLTEsICA5LAorICAgICAtNTksICA1LCAtNCwgMzAsICAzLCAgMywgLTIsIC0zLCAtMSwgIDIsICAyLCAgMSwgLTEsIC0xLCAtMiwgIDEgfSwKKyAgICB7ICAwLCAtMywgIDIsICAwLCAtMSwgLTgsICAwLCAgMiwgLTMsICA0LCAtNCwgIDEsIDEwLCAgNiwgLTYsICA4LAorICAgICAgLTcsICA0LCAxMCwgMTEsLTQxLCAyNywtMjAsICAzLCAtMywgIDgsICAxLCAxMSwgLTUsIC04LCAgMCwgIDQgfSwKKyAgICB7ICA1LCAgMSwgIDQsIC0yLCAgMSwgIDIsIC0xLCAgNiwgLTcsICAyLCAxMSwgIDQsICAwLCAgMCwgLTgsICA3LAorICAgICAtMTAsICAwLCAgMCwgIDgsICAyLCAxMCwgLTEsICAxLCAtMiwgNDQsIC0yLC0yMSwtMTIsIC0zLCAtMSwgIDIgfSwKKyAgICB7IC00LCAgNCwgLTIsIC0yLCAgNiwgLTgsICAyLCAgMSwtMTAsIDE0LCAgOCwgIDYsICA1LCAgMSwgLTIsICA0LAorICAgICAtMTMsICA0LCAgMiwgIDUsIDEwLCAtMiwtMjEsIDMyLCAtMywgMTgsICA5LCAtNiwgLTksIC05LCAxMCwgIDIgfSwKKyAgICB7ICA5LC0xNiwgLTYsIC0yLCAgMSwgIDQsIDIyLCAgMiwgLTIsICAxLCAtMywgLTIsIC05LCAgMywgMTYsIDE5LAorICAgICAtMjQsIC02LCAtNiwgLTUsIC04LCAtNywgIDgsIC03LCAtMSwtMTIsICA1LCAtMywgIDAsICA0LCAgMiwgLTMgfSwKKyAgICB7IDEwLCAgMywtMTYsIC00LCAtMSwgMTMsICA0LCAgNCwgIDEsIC0zLCAgMSwgLTYsLTE0LCAxOCwgIDMsICA4LAorICAgICAgLTgsLTI4LC0xNiwgIDQsICA0LCAgMiwgMTIsICA3LCAgOSwgLTQsIC00LCAgNSwgLTEsIC0xLCAgMiwgIDIgfSwKKyAgICB7IC01LC0xMywtMjIsIC0zLCAtOCwgMjEsIC0yLCAtOSwgMjEsIC00LCAtOSwgIDUsIC04LCAxNSwgIDUsICAxLAorICAgICAgLTUsIC05LCAtNywgLTIsIC01LCAtNSwgLTEsIC01LCAtNSwgLTUsICAzLCAxMCwgLTQsICAwLCAtNywgLTIgfSwKKyAgICB7ICA1LC0xMCwtMTgsICAyLCAyMCwgIDQsIDEzLC0xMCwgIDgsLTE1LC0xMSwgLTMsIC0xLCAxNiwgMTAsICA5LAorICAgICAgLTgsICA2LCAgNywgLTUsICA2LCAxMSwgIDUsIDE3LCAtNCwgIDcsLTExLCAgNSwgLTMsIC02LCAgMiwgIDEgfSwKKyAgICB7ICAzLCAtNSwtMTksICAxLCAgMSwgLTMsIC0yLC0yNSwtMTEsLTE3LCAgMCwtMTMsIC00LCAxMCwgMTAsICAyLAorICAgICAgLTUsICA0LCAgMCwgIDMsIC0zLCAtNSwtMTAsIC0yLCAxMywtMjIsICAwLCAgMywtMTEsIC01LCAgNywgLTEgfSwKKyAgICB7IDEyLC0xNCwtMjksICA2LCAtMSwgMTAsICA3LC0xNywtMTIsIDE0LCAgMywgIDksIC05LCAgOSwgIDcsICA2LAorICAgICAgLTMsLTEzLCAgMCwgIDUsICAzLCAtMSwgLTYsIC0xLCAgMCwgIDIsICA0LC0xMiwgLTUsIC0xLCAgMiwgMTEgfSwKKyAgICB7IDEyLC0xNSwgLTcsIC0yLC0xMiwgMTcsIDIwLC0xNiwgLTIsLTEyLCAtNiwgMTUsIC02LCAxMiwgMTEsICA5LAorICAgICAgIDcsIC02LCAgNywgLTQsLTE5LCAgNiwgIDIsICAyLCAgMywtMTEsLTEwLCAtNCwgLTUsIC0zLCAgMywgIDIgfSwKKyAgICB7IDExLC0yMiwgLTYsICAwLCAgOCwgMTgsICAzLC0xMSwgLTQsIC03LC0xNSwtMTcsLTEyLCAgNiwgMTYsICA0LAorICAgICAgLTksICA0LCAtNSwgIDMsICA2LC0xNiwgMTAsIC03LCAtNywgLTMsICA1LCAgMCwgIDEsLTE1LCAtNCwgIDUgfSwKKyAgICB7IDEyLC0yMiwtMTYsICA1LCAtNiwgIDgsIDEyLCAtNCwgLTksLTE3LC0xMSwgIDMsICA1LCAgOCwtMTcsICAwLAorICAgICAgMTEsIC00LC0xMywgLTYsICAyLCAtMSwgLTEsICAzLCAgMywtMTEsLTEyLCAtMSwgIDEsICAxLCAxMiwgLTIgfSwKKyAgICB7ICA4LC0xMCwtMzMsIC01LCAtMywgLTYsICAxLCAtNywgLTgsIC00LCAtNiwgLTEsICA1LCAtNCwgLTYsLTEyLAorICAgICAtMTYsIC04LCAxMSwgIDgsLTE0LCAgNywgMTIsIDExLCAgNCwtMTQsIC0zLCAgNiwgLTcsIC01LCAtMywgIDMgfSwKKyAgICB7ICAwLCAtOCwgLTcsICAyLCAtNCwgMjQsICAyLCAtOSwtMTEsIC0zLCAtNywgMTEsLTEyLCAxNywgIDEsIC0xLAorICAgICAgIDMsIC01LCAtNywgMTIsICA0LCAxMSwgIDAsICAzLCAgMiwtMTgsIC0zLCAgNCwgIDcsIC02LCAgMywgMTUgfSwKKyAgICB7IDEwLC0xNSwtMTYsIC0yLCAtNCwgLTksICA3LC0xNSwgLTYsICAyLC0xNiwgMTMsIC04LCAgNywgMTksLTIxLAorICAgICAgLTQsLTEyLCAtOSwgLTMsIC0zLCAgNiwgMTEsIC0zLCAtMSwtMTksICAzLCAtNywgLTksIC00LCAgMywgLTYgfSwKKyAgICB7IC01LC0xMCwtMjEsICAwLCAtMywgLTcsIDE4LC0yMSwgMTUsIC01LC0xMiwgLTQsLTEzLCAgMiwgIDYsIC05LAorICAgICAgLTksLTExLCAtNCwgMTMsIC0zLCAgNiwgIDQsIC0xLCAgNywgLTksIC00LCAgOSwgIDUsICAyLCAgNiwgIDMgfSwKKyAgICB7IDE1LCAtMSwtMjcsIC0yLCAxMCwgIDMsICA3LCAtOCwgIDksIC0yLCAgNywgIDEsIC0yLCAtNSwgMTgsICA5LAorICAgICAtMTEsLTE3LCAtMiwgIDcsIC05LCAxMSwgMTAsICAwLCAtOCwgIDYsLTE2LCAtMywgIDIsIC03LCAgMywgMTEgfSwKKyAgICB7ICA0LCAtOSwtMzksIDE5LCAgNiwtMTMsIDEzLCAtNSwgLTUsLTE1LCAtMiwgIDksICAwLCAgNCwgMTQsICA2LAorICAgICAtMTAsIC00LCAtNSwgIDIsIC00LCAtMiwgIDUsLTExLCAgMywgIDMsIC0yLCAtMiwgLTcsICA5LCAgNywtMTAgfSwKKyAgICB7ICA1LC0xMSwgLTgsIDEwLCAtMiwgMTIsIDE2LCAgMCwgMTIsIC0yLCAtNiwgIDgsIDE0LCAgOCwgIDcsICAxLAorICAgICAgMTgsLTMwLCAgNCwgMTAsIC00LCAtNiwgIDIsLTExLCAgOSwtMTAsIC04LCAgNSwgIDAsICAwLCAtNywgIDYgfSwKKyAgICB7IC0xLC0xNiwtMTAsIDExLCAgMCwgMTMsIDEyLCAtNCwgLTQsIC01LC0yMSwgMTIsICA0LCAxMywgMTQsIC03LAorICAgICAgIDYsLTE2LC0xMywgIDgsICAyLCAgOSwgMTUsLTEyLCAgMSwgLTksLTIyLCAxMCwgLTksICA5LCAgOSwgLTcgfSwKKyAgICB7ICA0LC0xMiwtMjcsICAxLCAtMiwgMTEsIDE1LCAgMywgMTQsLTE0LCAtOSwgIDAsIC05LCAxNiwgMjIsIDEwLAorICAgICAgMTYsLTEwLCAgNSwgLTUsIC05LCAgMSwgIDEsICA2LCAgNiwgLTQsICAyLC0xNywgLTUsIC02LC0xNSwgLTEgfSwKKyAgICB7ICA3LC0xMiwtMTcsICAxLCAtOSwgIDUsIDIwLCAtNywgIDMsIDIzLCAtOCwgLTgsIC04LCAtMSwgMTMsIDE3LAorICAgICAgLTcsLTEzLCAgNCwgLTQsICA3LCAxNCwgIDgsIDExLCAtMywgLTMsICA0LCAgMCwgIDQsICA2LCAtMSwgLTkgfSwKKyAgICB7ICA3LC0xNSwtMTUsIC00LCAxMCwgMTIsICAzLC0xMywgIDYsIDE0LCAgOSwgLTgsLTE1LCAxNCwgMjMsIC01LAorICAgICAtMTAsIC01LCAgMSwgMTUsLTEwLCAtNywgIDEsICA5LCAgNCwtMTMsLTEwLCAxMCwgIDcsIC0zLCAgMiwgIDMgfSwKKyAgICB7ICA0LC0xMCwtMTQsICAwLCAgMywgIDQsICAwLCAtOSwgLTMsIC00LC0xMSwgIDIsLTE3LCAgOCwgIDIsIDE1LAorICAgICAgIDYsLTEyLC0xMiwgMTUsIC01LCAxNywgMTgsICAzLCAtMywgLTMsIC00LCAtNiwgLTgsIDEzLCAgNCwgMTAgfSwKKyAgICB7IC0yLC0xOCwtMjYsIDEwLCAtNCwgMTAsIDEzLCAgNCwgLTQsLTE2LCAtNywtMTcsIC0zLCAgNSwgLTQsICAyLAorICAgICAtMTUsLTEwLCAtMSwgLTgsIC03LCAtMywgIDIsICAyLCAgOCwtMTAsIC03LCAgMiwgIDIsIC00LCAgNCwgLTEgfSwKKyAgICB7ICA0LC0xOSwgLTUsIC0xLCAtMSwgLTYsICAyLCAtOCwgMTAsLTE2LC0yOCwgLTYsICA4LCAtMSwgMTEsIDI4LAorICAgICAgIDIsLTEwLCAtNCwgIDYsIC02LCAgNiwgMTEsIDE1LCAtNCwgLTIsICA3LCAgMywgIDcsIC03LCAgNCwgIDEgfSwKKyAgICB7IC0zLCAtNiwtMTAsIC01LCAxMywgMTgsIDEwLC0xNSwgLTUsIC0zLC0xMywgIDUsICAxLCAgMiwgMTgsIC01LAorICAgICAtMTAsLTEwLCAtNywgIDQsICAyLCAgMSwgIDUsICA0LCAgMiwgIDUsICA0LCAgOCwgLTksLTE3LCAgNywgIDcgfSwKKyAgICB7IDIwLC0xMiwgLTIsIC00LCAgNSwgMTQsICA3LC0xMSwgLTEsLTE2LCAtNiwgLTQsLTExLCAxNywgMTQsICAwLAorICAgICAgLTgsLTEwLCAtOCwgMTAsICAzLCAgNSwgMTAsLTE2LCAgMywgLTgsLTE0LCAxMCwgIDMsICA5LCAgMCwgIDMgfSwKKyAgICB7IDEyLC0xMCwtMzYsICAwLCAgNywgMTUsICAyLC0xNiwgIDIsIC0xLCAgMCwgLTEsICA1LCAgNCwgIDUsIC0zLAorICAgICAgIDEsLTEwLCAgNSwgLTEsLTE1LCAtMywtMTIsIDEyLCAgMiwgIDUsIC0xLCAgNSwgIDYsIC0zLCAtMiwgIDIgfSwKKyAgICB7IDE3LC0xNSwtMzEsIDIzLCAtNCwgMTUsIC0yLCAtMywgIDYsIC03LCAtNSwgIDEsLTEyLCAgNCwgIDYsICA4LAorICAgICAtMTAsICA4LCAgMywgIDUsIC00LCAgMSwgIDUsICAzLCAtMSwgLTQsIC0zLCAgMSwgMTAsIC00LCAtMiwgLTIgfSwKKyAgICB7ICA2LC0xOCwgLTUsIDEyLCAxMCwgMTIsIDE0LC0xMSwgMTUsICAyLCAtOSwgLTYsIC01LCAtMiwgLTksICA0LAorICAgICAgLTUsLTI4LCAtNCwgMTQsICAwLC0xNiwgIDksIDE0LCAtMSwgIDMsIC00LCAtNCwgIDIsICAxLCAgMCwgIDQgfSwKKyAgICB7IC01LC0xNCwtMzEsICA4LCAxNiwgIDcsIDEzLC0xMywgIDUsICA2LC0xNiwgMTAsIC01LCAgMiwgLTIsICAyLAorICAgICAgMTQsIC01LCAgOCwgLTUsICA3LC0xNiwgIDYsLTEzLCAtNSwgIDAsIC01LCAgOCwgLTMsIC0xLCAgNCwgIDMgfSwKKyAgICB7ICAxLCAtMiwgLTEsICAwLCAgNiwgIDUsICAyLCAtNCwgLTMsIC0xLCAgMCwgIDEsICA0LCAgMiwgNDMsIDI4LAorICAgICAtMTIsLTM1LCAtMiwgLTIsIC03LCAtMSwgIDAsICAyLCAtMSwgLTIsIC0yLCAgMSwgLTQsICAwLCAtMiwgIDMgfSwKKyAgICB7ICAyLCAtOSwtMjIsIDEyLCAgMywgIDMsIC03LCAtNCwtMTksLTIyLC0xNCwgLTQsIC0xLCAyMSwgIDksIC0zLAorICAgICAtMTUsLTE2LC0xMywgIDEsLTExLCAgNCwgLTksICAxLCAtNywgLTEsIC0xLCAgMCwgLTIsICA5LC0xMywgLTMgfSwKKyAgICB7IC0xLCAtMywtMjMsICAwLCAgMiwgMTIsICAzLCAtOSwgLTQsICA3LCAgMywgIDksLTEwLCAgMSwgMjcsIDI4LAorICAgICAgIDAsICA5LC0xNSwgLTIsIC0yLCAgMSwgIDYsICA4LCAtOCwgIDcsIC0zLCAyMCwgIDAsICAwLCAtMSwgLTYgfSwKKyAgICB7IC0xLCAxMSwgIDgsIC0yLCAgMSwgIDUsIC02LCAtMSwgIDQsICAyLCAtNCwgIDAsIC0xLCAtNSwgIDQsIC02LAorICAgICAtMTAsLTEyLCAxOSwgIDEsIC03LCAgOSwgLTgsIC05LC0xNiwtMTEsIC0yLCAxMiwgMTQsICA0LCAgNCwgMzQgfSwKKyAgICB7IDE3LCAgNywgLTYsICAxLCAgNCwtMTAsIC01LCAgNCwtMTEsICAzLC0xOCwgIDQsIDE0LC0xMywgLTMsICAxLAorICAgICAgIDAsICAwLC0xMSwgIDAsICA3LC0xNywgLTQsICA0LC0xMSwgLTYsIC04LCAxOCwgIDAsICAwLCAgMCwgMjYgfSwKKyAgICB7IC02LCAtNywgLTEsIC0xLCAxMSwgLTgsICAxLCAgMywgIDIsIDExLCAtNiwgLTYsIDEwLCAtMywgIDEsIC0zLAorICAgICAgIDcsICA0LC0xMiwgLTgsICAwLCAtOSwgIDgsLTIyLCAtNSwgIDAsIC02LCAyMiwgLTIsIDExLC0xMywgMjQgfSwKKyAgICB7IC0zLCAgNCwgIDAsICAzLCAgOSwgMTAsIC0xLCAgMywgLTksLTEyLCAgMSwgLTUsIDE4LCAgMCwgLTMsICA4LAorICAgICAgMjUsIDE1LCAtOCwgIDIsICAyLCAtMiwgIDQsICA4LCAgOSwgLTEsIC01LCAxMCwgLTMsICAxLCAtMSwgMjMgfSwKKyAgICB7IC01LCAgMiwgLTksIC0xLCAtMywgIDAsICAzLCAtMSwtMTAsIC00LCAgMCwtMTMsIDE2LCAgOSwgLTEsLTE0LAorICAgICAgIDIsICA2LCAtMiwgLTYsIC01LCAtMiwgLTcsICA3LCAgNSwgIDMsIDExLCAtMiwtMTQsICAwLCAtOSwgMzAgfSwKKyAgICB7ICA0LCAgNiwgIDYsICA1LCAtMywgLTEsICA0LCAgNSwgMTAsICAwLCAgNSwgLTQsICA3LC0xMSwgMTQsIDE0LAorICAgICAgIDcsIDM0LCAtOSwgIDAsLTEwLCAyMiwgLTcsIC0xLCAgNywgLTksICAyLCAtOCwgIDAsIC03LCAtNSwgMjkgfSwKKyAgICB7IC00LCAgMywgLTEsIC00LCAtMywgIDUsICAxLCAtNCwgIDAsICAyLCAgNCwgIDIsICAxLCAtMSwtMTAsICAxLAorICAgICAgIDYsIC02LCAtNCwgIDEsICA0LCAtMywgLTMsIC01LCAgMCwgIDMsICA3LC0xMiwgIDAsIC0yLC0xMCwgNTUgfSwKKyAgICB7ICA1LCAgOSwgLTEsICAwLCAgNCwgIDksLTIxLCAtOSwgIDQsICAyLCAgNiwgLTcsIDExLCAtNywgIDEsIC01LAorICAgICAgIDAsIC00LCAgMiwgLTMsLTEzLCAtOCwgIDAsIC05LCAtNCwgIDIsIDE2LCAtMiwtMTUsIC03LC0xMSwgMzEgfSwKKyAgICB7ICA4LCAgMiwgLTEsICAwLCAgMywgLTUsIC01LCAgNSwgIDEsIC0xLCAtOSwgIDEsICAwLCAtNiwgLTIsIC0xLAorICAgICAgIDUsICAyLCAgMCwgIDAsIDEyLCAyMCwtMTksICAxLCAgOCwtMTIsLTExLCAgMCwgIDYsIC01LCAgMiwgMzEgfSwKKyAgICB7IC0xLCAtMSwgLTIsICAxLCAtMSwgIDMsIC05LCAtNSwgIDgsIC0yLCAgNSwgLTEsICAwLCAtMiwgIDQsIC0yLAorICAgICAgLTMsLTEyLCAgMCwgLTIsICAzLCAgMCwgIDksICA0LCAtMSwgMjEsIC04LCAgMywgLTQsICA5LCAtNiwgMzAgfSwKKyAgICB7IC00LCAgMCwgLTcsIDE3LCAxMCwtMTIsIC0yLC0xMCwtMTIsIC0zLCAxMCwgIDAsIDExLCAtNCwtMTMsIC0zLAorICAgICAgIDUsICA2LCAxMCwgIDcsIC04LCAgMCwgLTcsLTEzLCAgMSwgIDAsIC0yLCAgNywtMTIsICA0LCAtMywgMjQgfSwKKyAgICB7LTEzLCAgOSwgIDQsIC0yLCAgMiwgLTQsLTE0LCAtMSwgLTMsIC01LC0xMCwgIDQsIDEzLCAtMiwgIDUsIDEzLAorICAgICAgIDgsICAzLCAtMiwgIDEsICA1LCAtNiwgIDcsLTE4LC0xMCwgIDEsIC0xLCAgNSwgIDQsICAxLCAgMCwgMjUgfSwKKyAgICB7IC01LCAtMSwgMTgsIDEyLCAgOCwgIDgsLTE2LCAtMSwgIDEsICAxLCAgMSwgLTQsIC01LCAgMywgIDMsICA0LAorICAgICAgIDQsLTExLC0xMiwtMTYsIC02LCAgMiwgMTIsLTEzLCAgMCwgIDksICA3LCAgOSwgLTksICAwLC0xMCwgMjQgfSwKKyAgICB7IC00LCAgMSwgLTMsICAwLCAgMiwgLTQsICA0LCAgMSwgIDUsICAwLCAtMywgIDIsIC0zLCAtMiwgIDIsIC0xLAorICAgICAgIDEsICA0LCAtMSwgLTIsIC0yLCAgMSwgLTEsIC0xLCAtNCwgLTEsIC00LCAtMiwgLTYsICA2LCAxMiwgNjkgfSwKKyAgICB7ICA4LCAgNSwgMTEsICAwLC0xNSwgLTQsIDEzLCAgNiwgIDAsIC00LCAgOSwgIDEsIC01LCAtMywgMTUsICAwLAorICAgICAgIDEsICA2LCAtNSwgIDAsICAxLCAgNiwgIDUsICA4LCAgMCwgIDcsICAxLCAtMSwgLTQsLTExLCAtOSwgNDEgfSwKKyAgICB7IC00LCAtOSwgMzIsIC02LCAgMCwgIDcsIC00LCAgNiwgLTYsICAxLCAtNiwgLTIsICA0LCAtOCwgLTUsIC0zLAorICAgICAtMTYsIC0xLCAtMiwgLTYsICAxLCAxNSwgIDAsIDIxLCAgMywgLTMsIC00LCAgMywtMTIsIDE2LCAgMiwgMjcgfSwKKyAgICB7IC02LCAtNSwgIDEsIC05LCAtNSwgIDMsICA3LCAtMywgIDUsICA1LCAxNCwgMTMsIDIwLCAtNywgLTEsIDEyLAorICAgICAgLTEsIDEwLC0xMSwtMTEsIC03LCAtNCwtMTQsICA3LC0xNCwgMTMsIDIyLCAxOCwgLTEsICAwLCAxNCwgMjggfSwKKyAgICB7IC04LCAgMywgLTIsICAwLCAgNSwgIDYsIC0xLCAtNCwgIDEsICAzLCAtNywgIDMsICAxLC0xNSwgIDQsIC05LAorICAgICAgMjIsLTEwLCAtOSwgLTQsICAxLCAgOCwgLTQsICA5LC0xNSwgIDIsIC02LCAtNCwtMTYsIDEyLC0xMCwgMjMgfSwKKyAgICB7ICAwLCAgMCwgIDIsICAwLCAtMSwgIDMsIC0zLCAtMSwgIDMsIC01LCAgNywgIDEsICA1LCAtNSwgLTgsICAxLAorICAgICAgMTMsLTE1LCAtNSwgLTcsIDEyLCAtNiwgLTIsICAzLCAxMCwgLTUsIC04LCAxNywgLTUsLTExLC0xNCwgMjMgfSwKKyAgICB7IC03LCAtNCwgIDYsIC00LCAgNSwgLTYsIC01LCAgMiwgLTQsIDExLCAgOSwgLTQsICAyLCAtMiwgLTQsICA2LAorICAgICAgMTUsICAzLCAtMywgMTgsLTE1LCAtMiwgLTYsICAzLCAgMywtMjAsIDE3LCAxMSwgLTQsICAyLCAgMywgMjkgfSwKKyAgICB7ICA2LCAgMSwgLTYsICAyLCAgMywgIDAsICAwLCAtMywgIDMsICAzLCAtMSwgIDMsIC00LCAtNiwgLTYsIC03LAorICAgICAgLTMsIC0yLCAtNywgLTIsIC00LCAgNSwgIDMsIC01LC0yMCwtMTMsIC00LCAxMCwtMTQsLTI5LCAxNCwgMzcgfSwKKyAgICB7ICAzLCAgNCwgIDMsIC02LCAtNCwgIDUsICAwLCAgMywgIDIsICAzLCAgMCwgLTIsICA0LCAgMCwgLTMsIC01LAorICAgICAgLTQsICA0LCAtNCwgIDQsICA0LCAgMywgIDEsIC00LCAtNCwgLTksLTE0LCAyMCwtMzAsICAzLC0xOCwgMzMgfSwKKyAgICB7ICAwLCAgMiwgIDUsIC0yLCAtNCwgLTIsIC0xLCAgMiwgLTYsIC0zLCAtMiwgLTIsICAyLCAtNSwgLTEsICA0LAorICAgICAgIDMsICAyLCAtMywgIDAsIC0xLCAtMSwtMTAsIC03LCAgMiwgLTQsLTE4LCAgMiwtMzcsIC0xLCAxMiwgNDAgfSwKKyAgICB7IC03LCAgMiwgLTEsICAwLCAtMiwgIDQsIC04LCAgMSwgLTQsIDEyLCAgNywgIDQsIDE1LCAtNywgIDEsIC05LAorICAgICAgMTgsICAwLCAxMiwtMTcsIC0zLCAtMSwgIDAsICAwLCAgMCwgIDIsIC02LCAgMCwgLTQsIC0zLCAtMSwgMjYgfSwKKyAgICB7IC02LCAgNCwgIDgsIC01LCAtNiwgLTIsICAyLCAtMSwgIDEsIC0xLC0xNSwgIDgsICA3LCAtMSwtMTcsIC00LAorICAgICAgIDEsICA1LCAgNiwtMTEsIC02LCAxNCwgMTcsIC01LC0xNSwgMTEsICA4LCAgMCwgLTMsLTE1LCAtNiwgMjggfSwKKyAgICB7IC0xLCAgMCwgIDAsICAwLCAgMSwgIDAsIC0xLCAgMCwgIDEsICAzLCAgMiwgLTIsICAzLCAtMSwgLTEsICAyLAorICAgICAgIDIsIC0xLCAtMSwgLTcsICAxLCAgMiwgLTksICAwLCAtMSwgLTQsLTE4LCAgNywtMTAsIDQ5LC0xMywgMzIgfSwKKyAgICB7IC0xLCAtMywgIDQsICAxLCAgMiwgLTUsICAxLCAtNywgLTEsICA1LCAtOSwgIDQsICA0LCAyNSwgIDEsIC0xLAorICAgICAgIDIsIC01LCAgMiwgLTcsIDE3LCAtMiwgMTAsIC01LCAgMCwgIDIsLTE1LCAgMywgLTksICA3LCAtOSwgMzAgfSwKKyAgICB7IC01LCAtMSwgIDAsICAyLCAgMSwgLTEsICAyLCAgNSwtMzMsICAzLCAtNSwgMTQsIDExLCAgNywgIDUsIC0zLAorICAgICAgIDIsIC04LCAtNCwgLTIsIC03LCAtNiwgIDQsIC04LCAtMSwgLTgsICAyLCAtMiwgLTgsIC0xLCAtNCwgMjcgfSwKKyAgICB7IC0xLCAgMCwgLTEsIC0yLCAgMSwgLTEsIC0yLCAtMSwgIDIsICAwLCAgMSwgIDIsICAyLCAgNCwgIDEsICAzLAorICAgICAgIDQsICAyLCAgMSwgLTcsIC00LCAgMSwgLTMsIC00LC0zNSwtMjUsIDE3LCAxMCwgLTMsLTI2LCAtNywgMzIgfSwKKyAgICB7IC01LCAgMSwgIDYsIC0yLCAgNiwgIDYsIC05LCAgMywgLTEsIC00LCAgNSwgLTQsIC0yLCAtMiwgLTksICAyLAorICAgICAgLTUsICAyLCAgMiwgIDQsICAzLCAgNSwgLTUsLTE2LC0zMSwtMTIsLTExLCAgMiwtMTksIDIwLCAtMiwgMjEgfSwKKyAgICB7IC01LCAgMiwgIDcsIC03LCAtNywgIDUsIC03LCAgMiwgIDAsICAwLCAtNCwgIDMsIC0xLCAgMCwgLTEsIC0yLAorICAgICAgIDAsIC0zLCAgNSwtMTEsIC04LCAtMywgLTcsIC03LCAyOCwtMTEsIC03LCAgMCwtMTYsLTExLCAtNCwgMjkgfSwKKyAgICB7ICAyLCAgMSwgLTMsIC0yLCAtMSwgIDMsICA0LCAgMCwgIDEsICAwLCAtMSwgLTUsICA0LCAtNSwtMTIsICAyLAorICAgICAgLTIsIC01LC0yMiwgLTIsIC0xLCAxMSwgIDgsIC03LC0xMiwgIDAsLTM0LCAgNiwgLTUsIDExLCAtOCwgMTkgfSwKKyAgICB7IC0xLCAtMywgIDUsIDExLCAxOCwgLTIsIC0yLCAtNSwgLTIsICA0LCAtMSwgIDgsICA1LCAtNiwgIDEsIC0xLAorICAgICAgIDIsICA4LCAgNCwgLTUsIC04LCAtMiwgIDUsLTE4LCAgNywgMTIsICA3LCAxOSwtMTgsICAyLCAtNiwtMTMgfSwKKyAgICB7ICA5LCAgMCwgIDAsICA1LCAgNCwgIDMsIC02LCAgNCwgIDEsIC00LCAgNSwgLTEsIC00LCAgOCwgIDgsICA2LAorICAgICAgLTgsIC02LCAgMCwgIDYsIC0zLCAgMywgIDUsIC0zLCAxNywgMzEsIDE2LCAxMCwtMTMsICAwLCAtOSwtMTkgfSwKKyAgICB7IDEyLC0xMCwgIDIsIC0yLCAtMiwgLTEsIC0zLCAgNiwtMTIsIC01LCAtMiwgMTQsLTE2LCAgNCwgMTIsIDEyLAorICAgICAgMTcsICA0LCAgNywtMTYsICA3LCAtNiwgMTEsICA3LCAgNywgIDIsLTI1LCAyMywtMjQsICA1LCAtNywgLTkgfSwKKyAgICB7IDEwLCAgNCwgMTMsIDEwLCAxMCwgIDMsIC02LCAgMywgIDMsICAyLCAtMSwgLTYsICA4LCAgNCwgMTAsICAwLAorICAgICAgIDEsICAyLCAtNCwgIDIsIC0zLCAtOCwgIDAsIC0xLCAgOSwgIDksLTEwLCAtMywtMjksICAxLCAtMSwtMjcgfSwKKyAgICB7ICAyLCAgMiwgIDAsICA3LCAgOSwgLTIsLTEwLCAtMSwgLTEsICAxLCAtOSwgLTUsICA4LCAgNCwgIDEsICAyLAorICAgICAtMTAsICAxLCAxMywgMTIsIC0zLCAxNSwgLTksICAyLCAtNywgIDEsLTEwLCAyMywtMjAsLTE4LCAtOSwtMTUgfSwKKyAgICB7IC0zLCAtNSwgLTEsICA4LCAgMCwgLTUsIC0xLCAgNCwgIDcsIC0xLCAtNywgIDIsIC04LCAtNSwgMTEsICA3LAorICAgICAgLTYsICAzLCAtMywgLTksICA3LCAgOSwtMjIsICAxLCAgNiwgLTQsIDE0LCAyNywtMjUsLTE0LCAgMywgLTUgfSwKKyAgICB7ICAxLCAgMywgIDgsICA0LCAgNywgIDYsIDEyLC0xNywtMTUsICAxLCAtOCwtMTAsICA3LC0xNCwgLTgsICA2LAorICAgICAgLTIsIC0yLC0xMSwtMTEsIC03LCAxMywgLTIsIC0yLCAgNCwgIDUsIC01LCAxMywtMjMsIC02LC0xNywgLTggfSwKKyAgICB7IC01LCAgNCwtMTQsIC01LCAtNCwgLTUsICA2LCAgNSwgLTgsIC01LCAtMiwtMTEsIC03LC0xMiwgIDMsLTExLAorICAgICAgIDIsIC02LCAgNCwtMTAsIC01LCAtNywgMTQsICA1LCAyMywgMTEsICA3LCAxMiwtMTYsIC02LCAtNCwtMTYgfSwKKyAgICB7ICA1LCAgNiwgIDIsICA1LCAtMiwgLTUsIC01LCAtNiwgLTUsLTE5LC0xMywgLTEsIC0zLC0xMywgIDUsICAwLAorICAgICAgIDYsIC0yLCAtMiwgLTYsIC03LCAtNywgLTEsIC05LCAgNCwgMTQsIDE3LC0xMiwtMjcsICAzLCAgMCwgLTEgfSwKKyAgICB7ICA3LCAtMSwgIDksLTEwLCAgOCwgIDIsIC03LCAtMiwgIDUsICAyLCAtMywgLTcsICAzLCAgMCwgIDYsICA0LAorICAgICAgMTIsICA1LCAxMSwgMTQsLTEzLCAtMSwgIDgsICAxLCAxMywgIDksIDEyLCAxMiwtMTgsLTE0LC0xMSwtMTYgfSwKKyAgICB7IC03LCAtNSwgLTYsIC01LCAgMCwgLTEsIC0zLCAgMiwgIDIsICAxLCAgNCwgIDksICAyLCAgMywgIDUsIC0yLAorICAgICAgIDIsICAxLCAgOCwgIDAsICAzLCAgMCwgLTIsICAyLCAgMSwgIDcsIDI5LCAgMCwtMzYsIC01LCAtOSwtMjEgfSwKKyAgICB7IDE0LCAtNiwgLTksICAwLCAtMSwgLTgsIC04LC0xMSwgIDIsICAyLCAtOSwtMTIsIDEyLCAtNCwgIDUsICAzLAorICAgICAgLTUsIC05LCAxMSwgLTEsIC0zLCAxMiwtMjEsIC0zLCAxMiwgIDUsICAzLCAxMSwtMTgsLTE1LCAgMSwgLTIgfSwKKyAgICB7IC0xLCAgMywgLTksIC0zLCAgNywgLTcsLTE4LCAgMiwgIDQsIDEyLC0xMCwgIDIsICA4LCAtMywtMTQsIDEzLAorICAgICAgMTcsIC01LCAgNSwgLTksIDEzLCAtMywgLTcsLTE4LCAxNywgLTIsICA1LCAgNywtMjAsIC0zLCAtNiwtMTEgfSwKKyAgICB7IC0zLCAgMywgIDMsIC0xLCAgMSwgLTYsIC01LCAgMSwgIDUsIC0zLC0xNCwgLTYsIC01LCAtOCwgMTQsIC02LAorICAgICAgIDcsIC0xLCAgNSwgIDEsIDE1LCAtMSwgLTcsIC00LCAgNiwtMTEsICA5LCAtMiwtMzcsIDE2LCAtNywgLTMgfSwKKyAgICB7IC0xLCAgMCwgIDYsICAxLCAtMywgLTksICAwLCAxMSwgLTgsICAyLCAtMiwgIDAsICA1LCAgMiwgMTIsLTEwLAorICAgICAgMTAsIDEzLCAgMiwgIDcsIC02LCAgMiwtMTAsLTEwLCAyMSwgLTUsICA1LCAgNSwtMTIsLTIzLCAgMywtMTQgfSwKKyAgICB7ICA2LCAgMCwgLTIsICAxLCAgMCwgIDEsICAwLCAtNCwgIDEsICAxLCAgOCwgLTIsICAyLCAtNSwgLTIsICAxLAorICAgICAgIDgsIC00LCAtMSwgLTEsICA0LCAtMSwgIDIsICA2LCAzMiwgIDEsIC01LC0yMCwtNDAsIC00LC0xOCwtMTQgfSwKKyAgICB7ICAyLCAgMiwgLTcsIC0yLCAgNCwgIDQsIC0xLCAgMiwgIDAsIC0yLCAtNCwgLTcsICAzLCAgNSwgIDAsIC01LAorICAgICAgIDEsICAyLCAtNiwgIDQsIC0xLCAtMiwgLTEsLTE1LCAgOCwgIDMsICA5LCA0NiwgLTcsLTE4LCAgNiwtMTEgfSwKKyAgICB7ICA1LCAgNSwgMTYsIDIxLCAgMywtMTEsIC00LCAxMSwtMTIsICAyLCAgNCwtMTIsIC0xLCAxMSwgIDgsICAxLAorICAgICAgLTQsIDExLC0xMSwtMjEsICAxLCAgMSwtMTEsICAzLCAxMywgIDEsICA1LCAxMiwtMjUsICAxLCAtMywgLTIgfSwKKyAgICB7ICAxLCAgNiwgLTcsICA0LCAgMiwgIDMsICAxLCAtNSwgIDgsICA5LC0xNSwgIDMsIC0zLC0xNCwgMTcsICA0LAorICAgICAgLTgsIDE0LCAtMiwgLTgsIC00LCAgNSwgIDgsIC03LCAgOCwgIDksICA3LCAgNiwtMjksLTE3LCAgOCwgIDQgfSwKKyAgICB7IC03LCAtNywgIDQsICAwLCAxMywgIDEsICAwLCAgNCwgIDQsLTE2LC0xMCwgLTcsICA1LCAgOSwtMTUsLTEwLAorICAgICAtMTAsICA4LCAtNCwgLTEsLTExLCAtMSwtMTAsLTE1LCAgMywgIDMsIDE0LCAxMCwtMTksICAyLC0xOCwtMTIgfSwKKyAgICB7IC00LCAgMCwgIDIsICAwLCAgNSwgLTIsIC05LCAgMCwgIDQsIC00LCAgMiwgLTEsIC0yLCAgMiwgLTQsICA5LAorICAgICAgIDIsIC02LCAtNCwgLTIsIC0xLCAtMywgLTMsIC0xLCAgMiwgIDUsIC0xLCAxMSwtMjQsLTQ0LCAtOSwtMTUgfSwKKyAgICB7IC0xLC0xMCwgIDYsIDIxLCAxMSwgMTUsIC03LCAxMCwtMTQsIC05LCAtOCwgLTgsICA0LCAgNiwgMTksICAxLAorICAgICAgLTYsICAxLCAtNSwtMTcsIC04LC0xMCwgIDksICA1LCAxMSwgMTgsIC0xLCAxMCwtMTYsIC03LCAtOSwgLTggfSwKKyAgICB7ICAzLCAtNSwgIDAsICAwLCAtMiwgLTIsIC02LCAgNCwgLTQsICAxLCAtMSwgIDAsICA3LCAtMywgIDQsIC00LAorICAgICAgLTcsICA3LCAxNywtMjAsICA2LCAgNCwgIDEsIC02LC0xMiwgMzEsIDEzLCAxOSwtMTQsLTEwLCAtNywgLTIgfSwKKyAgICB7IC0yLCAgNiwtMTAsICAzLCAgOSwgIDYsLTE0LCAxNSwgIDIsIC01LCAgMiwtMTEsICA5LCAtOCwgIDQsICA2LAorICAgICAgMjAsLTE1LCAtMywgLTMsIC0xLCAzMiwtMjEsICA2LCAgMSwgIDksIDExLCAxNywtMTksICA2LCAtMSwgLTMgfSwKKyAgICB7ICA4LCAxMCwgLTIsICAwLCAtOCwtMTYsICA3LCAgNywgIDYsIDEwLCAgNCwtMTQsICA3LCAtNiwgMjEsIC03LAorICAgICAgMTAsICA1LCAgNSwgIDAsIC03LCAgMiwgLTYsICAwLCAtNywgMTEsIC05LCAxNSwtMjAsIC03LC0xMSwgIDIgfSwKKyAgICB7ICAwLCAtNywgIDUsICAyLCAgMCwgLTMsIC02LCAtNCwgLTIsIC0xLCAtNCwgLTUsLTEzLCAtMSwgMjcsIC05LAorICAgICAgLTYsLTExLCAtNywgIDEsIDExLCAtNCwgLTQsLTE0LCAtMiwgMTEsICA2LCAxMCwtMTksIC02LC0xNSwgIDIgfSwKKyAgICB7ICAwLCAgNywgLTEsICAyLCAtNywtMTUsIC0yLCAtMywgMTMsIC01LCAtNSwgMTIsICAzLCAgMCwgIDUsIC01LAorICAgICAtMjIsICAyLCAgNywgMjIsIDEzLCAgMCwgLTEsICAyLCAgMywgIDIsIC03LCAgNywtMjcsIC00LCAtNCwtMTIgfSwKKyAgICB7IDExLCAgMSwtMTYsICA2LC0xNSwgIDEsICAzLCAgMiwgIDAsICAyLCAtMywgIDIsICA1LCAtMiwgLTUsICA5LAorICAgICAgIDUsIC0zLCAgMywgLTIsLTExLCAgMywgIDksICA2LCAgOSwgIDMsIC0xLCAxMiwtNDEsICA4LCAtNiwgIDkgfSwKKyAgICB7ICAzLCAtNywgIDMsICAyLCAgNSwgIDUsICAwLCAtMSwgIDEsICAzLCAtNSwgLTIsLTEzLCAgNywgLTEsIC0yLAorICAgICAgLTIsIC02LCAgNCwgLTYsICAwLCAgMiwgLTIsICAyLCAgNCwgIDEsIC00LCAgMSwtNDcsLTIxLCAgNywgLTYgfSwKKyAgICB7ICAzLCAxNiwgLTcsIDEzLCAtNCwgLTIsIDEwLCAtMywgLTEsIDE4LC0xMywgIDcsLTEzLCAtNCwgIDgsICA0LAorICAgICAgIDgsICA5LCAtNSwgMTMsICA4LCAtNSwgIDMsIC02LCAgNywgMTgsIC04LCAxMCwtMjUsIC0zLC0xMiwtMTIgfSwKKyAgICB7ICAxLCAtMSwgLTEsICAwLCAgMiwgIDUsIC01LCAtMywgIDAsIC01LCAtMSwgIDAsIC00LCAtOCwgLTIsICAzLAorICAgICAgIDIsIC0yLC0xNywgLTYsIC00LCAgMSwgMzMsIC02LC0yMCwgLTYsICA4LCAzMSwtMjYsIC04LCAtMSwgLTQgfSwKKyAgICB7ICAzLCAtMywgLTMsICA1LCAtMywgLTIsICAxLCAgNywgIDAsICAzLCAgNiwgIDMsICA2LCAtMiwgIDksIDE1LAorICAgICAtMTAsIC0zLC0xNSwgLTUsIC0zLCAtNCwgLTYsLTMwLCAxNywgLTgsIC0yLCAgMiwtMjAsICAwLCAtOCwgLTIgfSwKKyAgICB7IC0yLCAtMSwgLTEsIC0xLCAgMywgLTUsIC0yLCAtMywgIDQsIC0yLCAgMCwgIDUsICA4LCAtMywgIDEsIC00LAorICAgICAgIDEsICAxLCAtMywgIDQsICA0LC0xNCwgIDMsIDExLCAtNSwgIDMsIC0zLCAgNywgLTMsIDEzLCAyMywtMTYgfSwKKyAgICB7ICAyLCAtNiwgIDEsIC0zLCAgNSwgIDAsIC02LC0xMSwgLTcsIC00LCAtMSwgIDIsIC03LCAtMSwgLTEsICA3LAorICAgICAgIDEsIC0yLCAgNiwgMTIsIC02LCAgOCwtMTMsIDE3LCAyNSwtMjMsLTE5LCAtNywtMTIsICA5LCAxNiwtMTcgfSwKKyAgICB7ICA5LCAgNCwgIDQsICA0LCAtMywgLTEsICA2LCAtMiwgLTMsICAwLCAxMywgLTQsIC03LCAxNCwgIDEsIC03LAorICAgICAgIDAsIC01LCAgMywtMTksIC0zLCAgNSwgIDMsICA5LCAtMSwgIDksLTEzLCAxMywtMTcsICA0LCAyMSwtMjYgfSwKKyAgICB7ICAwLCAtNSwgIDAsICAwLCAtNCwgLTUsICAyLCAtNiwgLTQsICA1LCAtNywgMTAsICAwLCAgMiwgIDAsIC0yLAorICAgICAgLTIsICAwLCAgNCwgLTYsICA3LCAtMiwgIDYsICA1LCAtNSwgIDIsLTEyLCAgMSwtMjksIDI5LCAyNywgMTIgfSwKKyAgICB7ICA5LC0xMCwtMjIsICA2LCAtMSwgLTEsICA5LC0xNCwtMTIsIC0yLCAgMSwgLTEsIDEwLC0xMSwtMTYsICAwLAorICAgICAgIDMsIDExLCAxMywtMTQsIC05LCAtMiwgLTEsICA2LCAgNCwtMTQsICAwLC0xMCwgLTIsIDE2LCAxNywtMTEgfSwKKyAgICB7ICAyLCAgMCwgLTEsIC0yLCAgNCwgIDMsIC02LCAtMiwgIDEsIC0xLCAgMSwgIDMsIC00LCAgMSwgIDMsIC00LAorICAgICAgLTEsIC0xLCAgNCwgLTEsICAxLCAgMCwgIDEsICA2LCAtNSwgLTcsICAyLCAgMSwtNDcsIC0zLCA1MCwtMTcgfSwKKyAgICB7ICA4LCAtNCwtMTEsIC03LCAxMSwgMTEsIDE0LCAtNywgMTIsIC03LCAgNiwgIDIsIDEzLCAtNiwgLTMsIC0yLAorICAgICAtMTQsICA2LCAgNiwgIDYsICAwLCAgMiwgLTEsICA1LC0yMCwgIDIsIC0xLCAgNCwgLTUsICA2LCAyMSwtMTEgfSwKKyAgICB7IC0yLCAtOSwgIDMsICAwLCAtNiwgIDcsICA4LCAtOCwgIDEsIC0zLCAgNCwgIDEsICA1LCAtMiwgLTMsIC03LAorICAgICAgIDQsICA3LC0xMiwgLTksIC0yLCAxMCwgLTYsIDEzLCAgNiwgIDUsIDIwLCAgMiwtMTUsICA5LCAyOCwgLTcgfSwKKyAgICB7ICAwLCAtNSwgLTYsIC02LCAtNiwgIDEsIC02LCAgNiwgLTIsICA0LCAgOCwgLTMsIDEyLCAtMSwgLTQsIC0yLAorICAgICAgIDYsIDE2LC0xNCwgIDksLTE0LCAtMiwgLTgsLTI3LCAtMywgMTgsIC0xLCAtNywgLTMsICA4LCAyMywtMjMgfSwKKyAgICB7ICAxLCAgNCwgLTksIC0xLCAtNSwgMTAsIC0yLCAgMSwtMTEsICAxLCAtOSwgIDQsICA3LCAxNCwgLTksIC0yLAorICAgICAgLTMsICAyLCAtNSwgLTEsIC02LC0xMCwgLTcsIDExLCAyMCwgIDIsICAzLC0xOSwgIDMsIDE1LCAzMCwgLTkgfSwKKyAgICB7ICA3LCAgMiwtMTQsIC00LCAgMCwgLTIsICA1LCAgMiwgIDUsIC0yLCAgOCwgLTMsIC03LCAgNiwgIDYsLTExLAorICAgICAtMTQsICAxLCAxMCwgLTEsIC03LCAtOCwgIDEsIDEwLCAgMywgLTYsLTE1LC0xMiwtMTcsICA0LCAzMCwgLTYgfSwKKyAgICB7ICA0LCAgMiwgIDEsIC0yLCAgMywgIDAsICAxLCAgMCwgIDIsICAwLCAgMSwgIDYsIC03LCAgMCwgIDMsICA0LAorICAgICAgIDQsIC00LCAtMiwgLTUsIC0yLCAgMiwgLTEsIC0yLCAgMCwgLTIsLTExLCAtNywgLTMsIDQyLCAyNCwtMTQgfSwKKyAgICB7ICA0LCAgMSwgIDMsICAyLCAgMCwgLTIsIC0zLCAtMiwgIDIsIC0xLCAgNCwgMTEsIC0yLCAgMiwgIDMsIC00LAorICAgICAgLTUsICA5LCAgMiwgLTQsIC05LCAgNSwgIDgsIC0xLCAtNywgIDEsIDI0LC0xMywtMjgsIDIwLCAxNSwtMjIgfSwKKyAgICB7IC0zLCAgNywgIDYsICAzLCAtMiwgLTUsLTEwLCAtMiwgLTIsIC0xLCAtNiwgLTYsIC0yLC0xNCwtMTYsIC02LAorICAgICAgLTUsICAwLCAxOCwgIDAsICA5LCAgMSwgIDcsLTEzLCAtNSwgLTYsIC05LCAxMSwtMTUsICA5LCAyMiwtMTEgfSwKKyAgICB7ICA5LCAtMiwgIDYsICA1LCAgMiwgIDksLTEwLCAgMSwgIDEsICA1LCAtNCwgMTIsICAyLCAgMiwtMTAsIC03LAorICAgICAgLTQsIC02LCAgNywgIDksICA2LCAxNSwgIDYsICA2LC0xMCwgMTAsICA1LC0xMywgLTUsICA2LCAyNCwtMTIgfSwKKyAgICB7ICAxLCAgMywgLTMsIC0zLCAgOCwgIDEsIC02LCAgMiwgLTUsIC0zLCAgNywgIDIsIDE0LCAgNiwgIDksIC02LAorICAgICAgLTUsIC00LCAyNywgIDcsIC0zLCAgOCwgLTYsICAzLCAtOCwgIDgsIDIyLCAtNSwgLTYsIC0yLCAyMiwtMTcgfSwKKyAgICB7IC0yLCAtMiwgIDMsIDEwLCAgOSwgIDksIDEyLC0xNSwgLTEsLTExLC0xMywgIDMsIC0yLCAgMSwgLTMsLTExLAorICAgICAgIDcsICA5LCAxNiwgLTMsLTEwLCAtNSwgLTUsICAxLCAgOCwgLTMsICA5LCAgOSwgLTUsICAzLCAzMSwtMTIgfSwKKyAgICB7ICA3LCAtNSwgMTAsIC00LCAtOCwgIDIsIDE2LCAtMiwgMTAsIDEwLCAtMywgLTIsICAzLCAtOCwgLTMsICAzLAorICAgICAtMTMsIC02LCAxNSwgMjAsIC05LCAtMywtMTIsICAxLCAtMiwtMTYsICA4LCAgOCwgLTEsIDE2LCAyMiwgLTUgfSwKKyAgICB7ICA1LCAtMywtMTUsIC0yLCAxMiwgLTgsICA4LCAtNSwgIDIsIC04LCAyMCwtMTgsIDE0LCAtNCwgIDMsICAzLAorICAgICAgIDcsLTEzLC0xNiwgIDEsLTEwLCAgNywgMTYsICA3LCAgNCwtMTQsIC00LCAtNSwgLTksICA4LCAyMywgLTYgfSwKKyAgICB7ICA1LCAtNCwgLTUsIC00LCAgMSwgIDgsICA0LCAtNywgLTUsICA4LCAxMCwgIDYsIC02LC0xMCwgLTIsICA2LAorICAgICAgIDksLTE3LC0xNCwgMTEsIDEyLCAtMywtMTMsIC03LCAgMiwgMTgsICAzLC0yNSwtMTYsIDE4LCAyMiwgLTUgfSwKKyAgICB7ICA1LCAgNiwgLTcsLTIwLCAtNCwgIDIsICA4LCAgNCwtMjQsIC00LCAgMSwgIDQsIC01LCAtMiwgIDEsLTEwLAorICAgICAgLTIsICA5LCAgMywgLTQsIC0zLCAtNCwgLTQsIC00LCAxMCwgMTAsICAzLCAgMCwgLTYsIDI1LCAyMSwtMTEgfSwKKyAgICB7ICAwLCAgNywgLTEsIDE0LCAtNiwgLTQsLTEwLCAgNSwgIDQsICA0LCAgNCwgLTUsICAzLCAgNCwgLTEsIC03LAorICAgICAgIDgsLTE5LCAgMCwgIDYsICAyLCAgMywtMTgsIC0zLCAtNiwgIDIsICA4LCAxNCwtMjYsIDIyLCAyNywtMTMgfSwKKyAgICB7IC0yLCAtNiwgIDcsIC01LCAxMiwgLTcsICA4LCAtMSwgIDMsIC0yLCAgNCwgIDEsICA4LCAtMiwgIDAsIDE0LAorICAgICAgIDYsIC01LCAgNiwgLTQsIC03LCAgNywtMjEsICA4LCAgMSwgIDgsIC05LCAtNCwgLTMsIDExLCAyNSwtMTMgfSwKKyAgICB7ICA0LCAgNCwgLTEsIC02LCAgNCwgIDksIC04LCAgMSwgLTMsLTEwLCAtMiwgIDAsIDE1LCAtOSwtMTYsIDExLAorICAgICAgIDEsICAxLCAgNiwgIDMsIC05LCAtNSwgMTYsIDI2LCAgMSwtMTQsICAxLCAtMywtMTQsICA3LCAxNSwgLTkgfSwKKyAgICB7LTEyLCAtMiwgLTksLTEzLCAgMiwgIDYsIDE0LCAgMCwgIDEsICAwLCAtMSwtMTMsICAwLCAxMCwgLTEsICA2LAorICAgICAgIDksIC03LCAgOCwgIDgsIDE5LCAgNiwgLTEsICA5LCAxMCwgLTQsICAxLCAtNywtMjIsIC0yLCAyOSwgLTcgfSwKKyAgICB7ICAyLCAgNCwgMTMsLTEyLCAtOCwgLTQsIC01LCAxMywgMTIsIC01LCAtMywgLTMsIC00LCAgMSwgLTEsIDEwLAorICAgICAgMTUsIC02LCAtMSwtMTEsLTMwLCAgNCwgMTUsIC0xLCAgOSwgLTcsICAwLCAtMiwgLTcsIDEwLCAyNSwtMTYgfSwKKyAgICB7ICA3LC0xNSwgLTcsIC03LCAtMSwgLTUsIC01LC0xMSwtMjAsIDEwLCAgMywtMTAsIC0zLCAgNSwgMjAsIC00LAorICAgICAgIDAsIC0yLCAtMiwgMTcsICAyLCAgMCwgLTMsICAzLCAgNiwgIDUsIC0xLC0xMiwgLTMsIDE1LCAyMiwtMTYgfSwKKyAgICB7ICA0LCAtMSwgIDMsICA0LCAtNSwgIDAsIC0xLCAtNSwtMjQsLTI5LCAgNCwgLTksICAxLCAtMywgIDAsICAwLAorICAgICAgIDAsIC00LCAgNywgLTQsIC00LCAtNCwgIDMsICAxLCAtNiwgIDUsIC0zLCAtNSwtMTAsICAzLCAyNSwtMTAgfSwKKyAgICB7IC0yLCAtMSwgLTEsICA0LCAgNCwgLTEsICAyLCAgMCwgLTQsIC00LCAgMiwgLTEsIC0zLCAtMSwgLTIsIC0yLAorICAgICAgIDEsIC0zLCAtNSwgLTEsICAyLCAtMywgLTQsIC00LCAtMywgIDUsIC05LCAgMSwtMTEsICA3LCA0NiwtNDYgfSwKKyAgICB7ICAwLCAtOSwgIDMsICA0LCAgNCwgIDMsIC01LCAtNiwgIDUsIC00LCAgNCwgLTIsICAxLCAgNywgLTQsLTEwLAorICAgICAgMTMsICAxLCAgMywgLTYsICA0LCAtNCwgIDcsICAyLC0xOSwtMjUsIC0zLC0xNiwtMTIsIDE2LCAyMCwgLTEgfSwKKyAgICB7IDE4LCAgNiwgIDQsLTEyLCAgMCwtMTQsICA5LCAtNiwgLTEsIC00LCAtNSwgIDIsICAxLCAxMiwgIDQsICAyLAorICAgICAgIDcsICAwLCAgMiwgIDUsLTExLCAtNSwgLTIsICAyLCAtNCwgMTAsICAwLCAtOSwgLTcsICA5LCAyNSwgLTggfSwKKyAgICB7ICA1LCAgMCwgLTYsICA1LCAgNiwgIDMsICAzLC0xMCwgLTUsICAxLCAtMSwgIDQsICAzLC0xMSwgLTgsICA1LAorICAgICAgIDQsIC01LCAgNSwgLTUsIC03LCAtNSwgMTEsICA1LCAyMCwgLTgsLTE2LCAyMSwgLTQsIDI3LCAyMywgLTUgfQorfTsKKworLyogRklSIGZpbHRlciBjb2VmZmljaWVudHMsIHRoZXkgY2FuIGJlIGN1dCBvbiBoYWxmIGFuZCBtYXliZSB1c2UgZmxvYXQgaW5zdGVhZCBvZiBkb3VibGUgKi8KKworREVDTEFSRV9BTElHTkVEKDE2LCBzdGF0aWMgY29uc3QgZmxvYXQsIGZpcl8zMmJhbmRzX3BlcmZlY3QpW10gPSB7CisgICAgKzEuMTM1OTg1MTk1RS0wMTAsCisgICAgKzcuMDE4NzcwOTgxRS0wMTEsCisgICAgLTEuNjA4NDAzMDExRS0wMDgsCisgICAgLTUuMDgzMjc1NjY3RS0wMDgsCisgICAgLTEuNTQzMzA5OTA3RS0wMDcsCisgICAgLTMuOTYxOTgxNDYzRS0wMDcsCisgICAgLTcuMzQyMjUwNjgzRS0wMDcsCisgICAgLTMuOTcwMDMwNzc1RS0wMDcsCisgICAgLTQuNzQxMTM3MDQ3RS0wMDcsCisgICAgLTYuMDIyNDQ4MjQ3RS0wMDcsCisgICAgLTYuNjI4MTkyMTgyRS0wMDcsCisgICAgLTYuOTgyODk4NTI2RS0wMDcsCisgICAgLTcuMDIwNjQ4ODA5RS0wMDcsCisgICAgLTYuNzY3ODM5NDA5RS0wMDcsCisgICAgLTYuMjYyMzQ1MDk2RS0wMDcsCisgICAgLTUuNTY0MTQwMjI0RS0wMDcsCisgICAgKzcuMDAzNDY3MzE3RS0wMDcsCisgICAgKzguNDE5OTc2ODkzRS0wMDcsCisgICAgKzkuNzQyOTU0MDM1RS0wMDcsCisgICAgKzEuMDg1MjI3OTUwRS0wMDYsCisgICAgKzEuMTYyOTI5MjY2RS0wMDYsCisgICAgKzEuMTk0NjMyMDkxRS0wMDYsCisgICAgKzEuMTc5MTgyMDUwRS0wMDYsCisgICAgKzEuMDMzNDI2NjU2RS0wMDYsCisgICAgKzkuNDUxNzM3MjQyRS0wMDcsCisgICAgKzEuOTc1MzI0MjY3RS0wMDYsCisgICAgKzEuMTkwNDQzMDcyRS0wMDYsCisgICAgKzUuMjM0NDc5NjU5RS0wMDcsCisgICAgKzIuMDE0Njc3NDIwRS0wMDcsCisgICAgKzcuODM0NzY3NTAxRS0wMDgsCisgICAgLTYuNzAyNDA2OTYzRS0wMTAsCisgICAgLTEuNjEzMjg1NTA1RS0wMDksCisgICAgLTIuNjgyNzA5NjEwRS0wMDksCisgICAgLTMuMzk5NDkzMTMxRS0wMDksCisgICAgKzEuMzE0NDA2MDA2RS0wMDgsCisgICAgKzcuNTA2NzAxOTI3RS0wMDksCisgICAgKzIuNzg4NzI4ODkyRS0wMDgsCisgICAgKzEuNDQ0OTE4OTIyRS0wMDcsCisgICAgKzMuMTMyMzg2NDM5RS0wMDcsCisgICAgKzEuMzk5Nzk4MTgwRS0wMDYsCisgICAgKzIuMDMyMTE4MTE4RS0wMDYsCisgICAgKzIuNzE1MDEzODA3RS0wMDYsCisgICAgKzMuNDUzODQwNDYzRS0wMDYsCisgICAgKzQuMTk1MDM3OTQ1RS0wMDYsCisgICAgKzQuODk2NDk0Mzc0RS0wMDYsCisgICAgKzUuNTE2MzgxNDA3RS0wMDYsCisgICAgKzYuMDE1MjM5MjUxRS0wMDYsCisgICAgKzYuMzYxNDE5MzEwRS0wMDYsCisgICAgKzguMDA2OTg1ODA5RS0wMDYsCisgICAgKzguMDg3NzMyNTY3RS0wMDYsCisgICAgKzcuOTQxMzYwMzA5RS0wMDYsCisgICAgKzcuNTY4ODM0MDA4RS0wMDYsCisgICAgKzYuOTg2Mzk5OTY3RS0wMDYsCisgICAgKzYuMjI1MDI4NzU2RS0wMDYsCisgICAgKzUuMzE1OTM2OTYwRS0wMDYsCisgICAgKzQuNDI5NDEyMDAyRS0wMDYsCisgICAgKzMuMzMyNjAwMDQ1RS0wMDYsCisgICAgKzguNDI3MjI0NDI5RS0wMDcsCisgICAgKzQuMzQxNDk4ODIzRS0wMDcsCisgICAgKzkuNDU4NTk2Mzk1RS0wMDgsCisgICAgKzIuOTc1MTY0ODI2RS0wMDgsCisgICAgKzYuNDAyNjY0MzU0RS0wMDgsCisgICAgLTMuMjQ2MjY0NDEzRS0wMDgsCisgICAgLTMuODA5ODg3ODcyRS0wMDgsCisgICAgKzguNDM0MDk0NjY3RS0wMDgsCisgICAgKzYuNDM3NzIxODIyRS0wMDgsCisgICAgKzEuMTg5MzE3MTE4RS0wMDYsCisgICAgKzIuNDk3MjE0MTU1RS0wMDYsCisgICAgKzMuNjE3MTUxMTUxRS0wMDYsCisgICAgKzMuMTU3MjQyNjQ1RS0wMDYsCisgICAgKzIuMzE5NjExMjEyRS0wMDYsCisgICAgKzcuODY5MzMzNzg1RS0wMDYsCisgICAgKzkuODI2NDQ5OTY4RS0wMDYsCisgICAgKzEuMTc3MTA4NjA2RS0wMDUsCisgICAgKzEuMzc5NDQ4MzQ5RS0wMDUsCisgICAgKzEuNTcxNDI4NTg0RS0wMDUsCisgICAgKzEuNzQzMTgzMDIwRS0wMDUsCisgICAgKzEuODg0MjA4MTc3RS0wMDUsCisgICAgKzEuOTg3MDkzMzEwRS0wMDUsCisgICAgKzIuMDQyOTcwMTE4RS0wMDUsCisgICAgLTMuMTQ0NDY4NDI4RS0wMDUsCisgICAgLTMuMzM0OTQ3MTc4RS0wMDUsCisgICAgLTMuNDYwNDM5MjU3RS0wMDUsCisgICAgLTMuNTE1OTE0NDMyRS0wMDUsCisgICAgLTMuNDk1Mzg0OTU0RS0wMDUsCisgICAgLTMuMzk3ODUzNjUyRS0wMDUsCisgICAgLTMuMjI1NDQ2MTk4RS0wMDUsCisgICAgLTIuOTc4OTkzNjg5RS0wMDUsCisgICAgLTIuNjc3MjkxNzQxRS0wMDUsCisgICAgLTEuODA2OTE0NzcwRS0wMDUsCisgICAgLTEuNzc2NTk4MDM3RS0wMDUsCisgICAgLTEuNjYxODE4NzE1RS0wMDUsCisgICAgLTEuMjA3MDAzMzM0RS0wMDUsCisgICAgLTYuOTkzMzE1MzEwRS0wMDYsCisgICAgLTUuNjMzODYwMzgzRS0wMDcsCisgICAgLTkuOTg0OTM1MzMyRS0wMDcsCisgICAgLTEuNDcwNTIwNDg4RS0wMDYsCisgICAgLTEuODUzNTkxMzU3RS0wMDYsCisgICAgKzcuMTk4MDA3NjY1RS0wMDcsCisgICAgKzMuMDg2ODU3NzYwRS0wMDYsCisgICAgKzYuMDg0NzQ2NDc0RS0wMDYsCisgICAgKzkuNTYxMDc1Nzg1RS0wMDYsCisgICAgKzEuMzA5NjM3NTM3RS0wMDUsCisgICAgKzIuMjYzMzU0ODcyRS0wMDUsCisgICAgKzIuODQ3MjQ3MTk3RS0wMDUsCisgICAgKzMuNDE1NjI0NDUxRS0wMDUsCisgICAgKzMuOTQ2Mzg3MDA1RS0wMDUsCisgICAgKzQuNDI1NzM2NTUyRS0wMDUsCisgICAgKzQuODM5Mjc1NDI1RS0wMDUsCisgICAgKzUuMTc2ODQ2MDI1RS0wMDUsCisgICAgKzUuNDI5Njk0Mjg0RS0wMDUsCisgICAgKzUuNTk1NTE5OTA2RS0wMDUsCisgICAgKzQuOTE2Mzg3Mjk3RS0wMDYsCisgICAgKzkuMjk5NTA4NzQ3RS0wMDYsCisgICAgKzEuMzU2MTkzNDc5RS0wMDUsCisgICAgKzEuNzUxODY2MTQ4RS0wMDUsCisgICAgKzIuMDkzOTM2NzQ2RS0wMDUsCisgICAgKzIuMzYyNTQ5Mjc2RS0wMDUsCisgICAgKzIuNTM3MDg2NTg0RS0wMDUsCisgICAgKzIuNjE4MTM2Mzg2RS0wMDUsCisgICAgKzIuNTU0NDYyODQ0RS0wMDUsCisgICAgKzMuMDE4NzUwMjQ5RS0wMDUsCisgICAgKzIuNTcwODMzMjAzRS0wMDUsCisgICAgKzEuOTg1MTc3MzY5RS0wMDUsCisgICAgKzEuMTkxMzQyNjUzRS0wMDUsCisgICAgKzIuNTI1NjIwMTc1RS0wMDYsCisgICAgLTEuNTIxMjQxMzkzRS0wMDUsCisgICAgLTEuNjE3NzUxMzMyRS0wMDUsCisgICAgKzEuOTkyNjM2MzE3RS0wMDUsCisgICAgKzEuNzc0NzAyNDY5RS0wMDUsCisgICAgKzQuNjI0NTI0MDgxRS0wMDUsCisgICAgKzUuNjEwNTA5ODM0RS0wMDUsCisgICAgKzYuNTY4MDAxMTE4RS0wMDUsCisgICAgKzcuNTEzNzMwODE2RS0wMDUsCisgICAgKzguNDEzNjkwMzc1RS0wMDUsCisgICAgKzguNzU3NTQ1NTg0RS0wMDUsCisgICAgKzkuNTE3MTY0MjkwRS0wMDUsCisgICAgKzEuMDIwNjg3OTk2RS0wMDQsCisgICAgKzEuMDg0NDM4NDgxRS0wMDQsCisgICAgKzEuMTQwNTgyNDYzRS0wMDQsCisgICAgKzEuMTg3OTEwMzExRS0wMDQsCisgICAgKzEuMjI0OTc4OTE0RS0wMDQsCisgICAgKzEuMjUwMjYwMjQ4RS0wMDQsCisgICAgKzEuMjYyMDI3MjE3RS0wMDQsCisgICAgKzEuMjI2NDk5MTUzRS0wMDQsCisgICAgKzEuMjEzNTc1NzQyRS0wMDQsCisgICAgKzEuMTgwOTgwMTA3RS0wMDQsCisgICAgKzEuMTI2Mjc1MTY1RS0wMDQsCisgICAgKzEuMDQ3MjA3MDQzRS0wMDQsCisgICAgKzkuNDE3MTAwMjI3RS0wMDUsCisgICAgKzguMDc4Mzg4NzgyRS0wMDUsCisgICAgKzYuNDQ3MjkwNzk4RS0wMDUsCisgICAgKzQuNDkxNTMwODU0RS0wMDUsCisgICAgKzIuNDcwNzA0MjAzRS0wMDUsCisgICAgLTEuNzE0MjQyMjE3RS0wMDYsCisgICAgLTMuMTkzMzA3NTY2RS0wMDUsCisgICAgLTYuNTQxNzQyMTg3RS0wMDUsCisgICAgLTEuMDI0MTc1MDcyRS0wMDQsCisgICAgLTEuMzEyMjAzNjc2RS0wMDQsCisgICAgLTEuNzc0MTEzNzcxRS0wMDQsCisgICAgLTIuMjMzNzI4NTkyRS0wMDQsCisgICAgLTIuNjgyMDg2MTk3RS0wMDQsCisgICAgLTMuMzQ3NjMzMTc0RS0wMDQsCisgICAgLTMuOTA2NDgxNzI1RS0wMDQsCisgICAgLTQuNDkwMjgwOTkwRS0wMDQsCisgICAgLTUuMDk5OTI5OTg2RS0wMDQsCisgICAgLTUuNzI5NjE5Mjk3RS0wMDQsCisgICAgLTYuMzU4ODI0MzIxRS0wMDQsCisgICAgLTcuMDIxOTAwMzgzRS0wMDQsCisgICAgLTcuNjk4MzQ1NTgwRS0wMDQsCisgICAgLTguMzg1MzUzNzIyRS0wMDQsCisgICAgLTkuMDc4OTU3OTU1RS0wMDQsCisgICAgLTkuNzc1MTMzODAzRS0wMDQsCisgICAgLTEuMDQ2OTQ1NDU3RS0wMDMsCisgICAgLTEuMTE1NzE3MzQzRS0wMDMsCisgICAgLTEuMTgzMzcwODI3RS0wMDMsCisgICAgLTEuMjUyODI5Nzk2RS0wMDMsCisgICAgLTEuMzE2MTkwMzQ4RS0wMDMsCisgICAgLTEuMzc2NTcxODMyRS0wMDMsCisgICAgLTEuNDMzMzQ0MDkyRS0wMDMsCisgICAgLTEuNDg1ODc2ODU1RS0wMDMsCisgICAgLTEuNTMzNTIwMTc1RS0wMDMsCisgICAgLTEuNTc1NjA5OTAyRS0wMDMsCisgICAgLTEuNjExNDU3Nzg4RS0wMDMsCisgICAgLTEuNjQwMzkwMTM5RS0wMDMsCisgICAgLTEuNjYxMjg4MjAzRS0wMDMsCisgICAgLTEuNjc0NTEyOTgzRS0wMDMsCisgICAgLTEuNjc4NDE1ODA3RS0wMDMsCisgICAgLTEuNjcyNzk4NDE4RS0wMDMsCisgICAgLTEuNjU2NTAxMDg4RS0wMDMsCisgICAgLTEuNjMzOTkzOTMyRS0wMDMsCisgICAgLTEuNTkzNDQ5Mzg2RS0wMDMsCisgICAgKzEuNTQyMDgwNjU5RS0wMDMsCisgICAgKzEuNDc5MzMyMTAyRS0wMDMsCisgICAgKzEuMzk1NTIxNTY5RS0wMDMsCisgICAgKzEuMzAzMTE2NzkxRS0wMDMsCisgICAgKzEuMTk2MTc1NDY0RS0wMDMsCisgICAgKzEuMDczNzU3MzAzRS0wMDMsCisgICAgKzkuMzU4OTYxODM0RS0wMDQsCisgICAgKzcuODE3MjY5NjUyRS0wMDQsCisgICAgKzYuMTE0MTc0MDMwRS0wMDQsCisgICAgKzQuMjQ0NDQxNTE2RS0wMDQsCisgICAgKzIuMjA2MDc1Mjk2RS0wMDQsCisgICAgLTIuNzE5NDEyNzQ4RS0wMDcsCisgICAgLTIuMzgyOTc4NzEwRS0wMDQsCisgICAgLTQuOTM1MTA2MjYzRS0wMDQsCisgICAgLTcuNjU4ODQ4MTkwRS0wMDQsCisgICAgLTEuMDU1MzY1NDI4RS0wMDMsCisgICAgLTEuMzYxNTQ3Mzg3RS0wMDMsCisgICAgLTEuNjg0NDkyNDU0RS0wMDMsCisgICAgLTIuMDIzODc0MDg0RS0wMDMsCisgICAgLTIuMzc5Mjk0MjUyRS0wMDMsCisgICAgLTIuNzUwMzE3MTAwRS0wMDMsCisgICAgLTMuMTM2NDMzMTk1RS0wMDMsCisgICAgLTMuNTM3MDYxMTU5RS0wMDMsCisgICAgLTMuOTUxNTM5NzUxRS0wMDMsCisgICAgLTQuMzc5MTU1MTE0RS0wMDMsCisgICAgLTQuODE5MDYyNTM4RS0wMDMsCisgICAgLTUuMjcwNTMxODY3RS0wMDMsCisgICAgLTUuNzMyMzkyODkyRS0wMDMsCisgICAgLTYuMjAzOTQ1MjYwRS0wMDMsCisgICAgLTYuNjgzOTAxODg0RS0wMDMsCisgICAgLTcuMTcwMDA1NzAxRS0wMDMsCisgICAgLTcuNjY0MDYzOTQ1RS0wMDMsCisgICAgLTguMTYyNzYwMTc2RS0wMDMsCisgICAgLTguNjY1MDAxOTUxRS0wMDMsCisgICAgLTkuMTcwNTMzMTU4RS0wMDMsCisgICAgLTkuNjc2NDg5MDQ4RS0wMDMsCisgICAgLTEuMDE4MjE5OTA3RS0wMDIsCisgICAgLTEuMDY4NjMwNDQyRS0wMDIsCisgICAgLTEuMTE4NzU2MDg2RS0wMDIsCisgICAgLTEuMTY4NDYwOTU4RS0wMDIsCisgICAgLTEuMjE3NTYyMDUzRS0wMDIsCisgICAgLTEuMjY1OTM5MDQ2RS0wMDIsCisgICAgLTEuMzEzNDQ4NDE4RS0wMDIsCisgICAgLTEuMzU5OTQ4ODg4RS0wMDIsCisgICAgLTEuNDA1MzAwNTczRS0wMDIsCisgICAgLTEuNDQ5MzY1MjYyRS0wMDIsCisgICAgLTEuNDkyMDA3NjM2RS0wMDIsCisgICAgLTEuNTMzMDk1NjMyRS0wMDIsCisgICAgLTEuNTcyNDgyMTAyRS0wMDIsCisgICAgLTEuNjEwMDgyMjAyRS0wMDIsCisgICAgLTEuNjQ1NzU2MTQwRS0wMDIsCisgICAgLTEuNjc5MzkxNDE0RS0wMDIsCisgICAgLTEuNzEwODc5OTg5RS0wMDIsCisgICAgLTEuNzQwMTIwMzUxRS0wMDIsCisgICAgLTEuNzY3MDE3NTA2RS0wMDIsCisgICAgLTEuNzkxNDg0MjgxRS0wMDIsCisgICAgLTEuODEzNDM5NDY2RS0wMDIsCisgICAgLTEuODMyODIxMjIwRS0wMDIsCisgICAgLTEuODQ5NTQ1OTExRS0wMDIsCisgICAgLTEuODYzNTY3MzQ1RS0wMDIsCisgICAgLTEuODc0ODM2OTA3RS0wMDIsCisgICAgLTEuODgzMzI2NjU3RS0wMDIsCisgICAgLTEuODg5MDI2NTM4RS0wMDIsCisgICAgLTEuODkxODYwOTI1RS0wMDIsCisgICAgKzEuODkxODYwOTI1RS0wMDIsCisgICAgKzEuODg5MDI2NTM4RS0wMDIsCisgICAgKzEuODgzMzI2NjU3RS0wMDIsCisgICAgKzEuODc0ODM2OTA3RS0wMDIsCisgICAgKzEuODYzNTY3MzQ1RS0wMDIsCisgICAgKzEuODQ5NTQ1OTExRS0wMDIsCisgICAgKzEuODMyODIxMjIwRS0wMDIsCisgICAgKzEuODEzNDM5NDY2RS0wMDIsCisgICAgKzEuNzkxNDg0MjgxRS0wMDIsCisgICAgKzEuNzY3MDE3NTA2RS0wMDIsCisgICAgKzEuNzQwMTIwMzUxRS0wMDIsCisgICAgKzEuNzEwODc5OTg5RS0wMDIsCisgICAgKzEuNjc5MzkxNDE0RS0wMDIsCisgICAgKzEuNjQ1NzU2MTQwRS0wMDIsCisgICAgKzEuNjEwMDgyMjAyRS0wMDIsCisgICAgKzEuNTcyNDgyMTAyRS0wMDIsCisgICAgKzEuNTMzMDk1NjMyRS0wMDIsCisgICAgKzEuNDkyMDA3NjM2RS0wMDIsCisgICAgKzEuNDQ5MzY1MjYyRS0wMDIsCisgICAgKzEuNDA1MzAwNTczRS0wMDIsCisgICAgKzEuMzU5OTQ4ODg4RS0wMDIsCisgICAgKzEuMzEzNDQ4NDE4RS0wMDIsCisgICAgKzEuMjY1OTM5MDQ2RS0wMDIsCisgICAgKzEuMjE3NTYyMDUzRS0wMDIsCisgICAgKzEuMTY4NDYwOTU4RS0wMDIsCisgICAgKzEuMTE4NzU2MDg2RS0wMDIsCisgICAgKzEuMDY4NjMwNDQyRS0wMDIsCisgICAgKzEuMDE4MjE5OTA3RS0wMDIsCisgICAgKzkuNjc2NDg5MDQ4RS0wMDMsCisgICAgKzkuMTcwNTMzMTU4RS0wMDMsCisgICAgKzguNjY1MDAxOTUxRS0wMDMsCisgICAgKzguMTYyNzYwMTc2RS0wMDMsCisgICAgKzcuNjY0MDYzOTQ1RS0wMDMsCisgICAgKzcuMTcwMDA1NzAxRS0wMDMsCisgICAgKzYuNjgzOTAxODg0RS0wMDMsCisgICAgKzYuMjAzOTQ1MjYwRS0wMDMsCisgICAgKzUuNzMyMzkyODkyRS0wMDMsCisgICAgKzUuMjcwNTMxODY3RS0wMDMsCisgICAgKzQuODE5MDYyNTM4RS0wMDMsCisgICAgKzQuMzc5MTU1MTE0RS0wMDMsCisgICAgKzMuOTUxNTM5NzUxRS0wMDMsCisgICAgKzMuNTM3MDYxMTU5RS0wMDMsCisgICAgKzMuMTM2NDMzMTk1RS0wMDMsCisgICAgKzIuNzUwMzE3MTAwRS0wMDMsCisgICAgKzIuMzc5Mjk0MjUyRS0wMDMsCisgICAgKzIuMDIzODc0MDg0RS0wMDMsCisgICAgKzEuNjg0NDkyNDU0RS0wMDMsCisgICAgKzEuMzYxNTQ3Mzg3RS0wMDMsCisgICAgKzEuMDU1MzY1NDI4RS0wMDMsCisgICAgKzcuNjU4ODQ4MTkwRS0wMDQsCisgICAgKzQuOTM1MTA2MjYzRS0wMDQsCisgICAgKzIuMzgyOTc4NzEwRS0wMDQsCisgICAgKzIuNzE5NDEyNzQ4RS0wMDcsCisgICAgLTIuMjA2MDc1Mjk2RS0wMDQsCisgICAgLTQuMjQ0NDQxNTE2RS0wMDQsCisgICAgLTYuMTE0MTc0MDMwRS0wMDQsCisgICAgLTcuODE3MjY5NjUyRS0wMDQsCisgICAgLTkuMzU4OTYxODM0RS0wMDQsCisgICAgLTEuMDczNzU3MzAzRS0wMDMsCisgICAgLTEuMTk2MTc1NDY0RS0wMDMsCisgICAgLTEuMzAzMTE2NzkxRS0wMDMsCisgICAgLTEuMzk1NTIxNTY5RS0wMDMsCisgICAgLTEuNDc5MzMyMTAyRS0wMDMsCisgICAgLTEuNTQyMDgwNjU5RS0wMDMsCisgICAgKzEuNTkzNDQ5Mzg2RS0wMDMsCisgICAgKzEuNjMzOTkzOTMyRS0wMDMsCisgICAgKzEuNjU2NTAxMDg4RS0wMDMsCisgICAgKzEuNjcyNzk4NDE4RS0wMDMsCisgICAgKzEuNjc4NDE1ODA3RS0wMDMsCisgICAgKzEuNjc0NTEyOTgzRS0wMDMsCisgICAgKzEuNjYxMjg4MjAzRS0wMDMsCisgICAgKzEuNjQwMzkwMTM5RS0wMDMsCisgICAgKzEuNjExNDU3Nzg4RS0wMDMsCisgICAgKzEuNTc1NjA5OTAyRS0wMDMsCisgICAgKzEuNTMzNTIwMTc1RS0wMDMsCisgICAgKzEuNDg1ODc2ODU1RS0wMDMsCisgICAgKzEuNDMzMzQ0MDkyRS0wMDMsCisgICAgKzEuMzc2NTcxODMyRS0wMDMsCisgICAgKzEuMzE2MTkwMzQ4RS0wMDMsCisgICAgKzEuMjUyODI5Nzk2RS0wMDMsCisgICAgKzEuMTgzMzcwODI3RS0wMDMsCisgICAgKzEuMTE1NzE3MzQzRS0wMDMsCisgICAgKzEuMDQ2OTQ1NDU3RS0wMDMsCisgICAgKzkuNzc1MTMzODAzRS0wMDQsCisgICAgKzkuMDc4OTU3OTU1RS0wMDQsCisgICAgKzguMzg1MzUzNzIyRS0wMDQsCisgICAgKzcuNjk4MzQ1NTgwRS0wMDQsCisgICAgKzcuMDIxOTAwMzgzRS0wMDQsCisgICAgKzYuMzU4ODI0MzIxRS0wMDQsCisgICAgKzUuNzI5NjE5Mjk3RS0wMDQsCisgICAgKzUuMDk5OTI5OTg2RS0wMDQsCisgICAgKzQuNDkwMjgwOTkwRS0wMDQsCisgICAgKzMuOTA2NDgxNzI1RS0wMDQsCisgICAgKzMuMzQ3NjMzMTc0RS0wMDQsCisgICAgKzIuNjgyMDg2MTk3RS0wMDQsCisgICAgKzIuMjMzNzI4NTkyRS0wMDQsCisgICAgKzEuNzc0MTEzNzcxRS0wMDQsCisgICAgKzEuMzEyMjAzNjc2RS0wMDQsCisgICAgKzEuMDI0MTc1MDcyRS0wMDQsCisgICAgKzYuNTQxNzQyMTg3RS0wMDUsCisgICAgKzMuMTkzMzA3NTY2RS0wMDUsCisgICAgKzEuNzE0MjQyMjE3RS0wMDYsCisgICAgLTIuNDcwNzA0MjAzRS0wMDUsCisgICAgLTQuNDkxNTMwODU0RS0wMDUsCisgICAgLTYuNDQ3MjkwNzk4RS0wMDUsCisgICAgLTguMDc4Mzg4NzgyRS0wMDUsCisgICAgLTkuNDE3MTAwMjI3RS0wMDUsCisgICAgLTEuMDQ3MjA3MDQzRS0wMDQsCisgICAgLTEuMTI2Mjc1MTY1RS0wMDQsCisgICAgLTEuMTgwOTgwMTA3RS0wMDQsCisgICAgLTEuMjEzNTc1NzQyRS0wMDQsCisgICAgLTEuMjI2NDk5MTUzRS0wMDQsCisgICAgLTEuMjYyMDI3MjE3RS0wMDQsCisgICAgLTEuMjUwMjYwMjQ4RS0wMDQsCisgICAgLTEuMjI0OTc4OTE0RS0wMDQsCisgICAgLTEuMTg3OTEwMzExRS0wMDQsCisgICAgLTEuMTQwNTgyNDYzRS0wMDQsCisgICAgLTEuMDg0NDM4NDgxRS0wMDQsCisgICAgLTEuMDIwNjg3OTk2RS0wMDQsCisgICAgLTkuNTE3MTY0MjkwRS0wMDUsCisgICAgLTguNzU3NTQ1NTg0RS0wMDUsCisgICAgLTguNDEzNjkwMzc1RS0wMDUsCisgICAgLTcuNTEzNzMwODE2RS0wMDUsCisgICAgLTYuNTY4MDAxMTE4RS0wMDUsCisgICAgLTUuNjEwNTA5ODM0RS0wMDUsCisgICAgLTQuNjI0NTI0MDgxRS0wMDUsCisgICAgLTEuNzc0NzAyNDY5RS0wMDUsCisgICAgLTEuOTkyNjM2MzE3RS0wMDUsCisgICAgKzEuNjE3NzUxMzMyRS0wMDUsCisgICAgKzEuNTIxMjQxMzkzRS0wMDUsCisgICAgLTIuNTI1NjIwMTc1RS0wMDYsCisgICAgLTEuMTkxMzQyNjUzRS0wMDUsCisgICAgLTEuOTg1MTc3MzY5RS0wMDUsCisgICAgLTIuNTcwODMzMjAzRS0wMDUsCisgICAgLTMuMDE4NzUwMjQ5RS0wMDUsCisgICAgLTIuNTU0NDYyODQ0RS0wMDUsCisgICAgLTIuNjE4MTM2Mzg2RS0wMDUsCisgICAgLTIuNTM3MDg2NTg0RS0wMDUsCisgICAgLTIuMzYyNTQ5Mjc2RS0wMDUsCisgICAgLTIuMDkzOTM2NzQ2RS0wMDUsCisgICAgLTEuNzUxODY2MTQ4RS0wMDUsCisgICAgLTEuMzU2MTkzNDc5RS0wMDUsCisgICAgLTkuMjk5NTA4NzQ3RS0wMDYsCisgICAgLTQuOTE2Mzg3Mjk3RS0wMDYsCisgICAgLTUuNTk1NTE5OTA2RS0wMDUsCisgICAgLTUuNDI5Njk0Mjg0RS0wMDUsCisgICAgLTUuMTc2ODQ2MDI1RS0wMDUsCisgICAgLTQuODM5Mjc1NDI1RS0wMDUsCisgICAgLTQuNDI1NzM2NTUyRS0wMDUsCisgICAgLTMuOTQ2Mzg3MDA1RS0wMDUsCisgICAgLTMuNDE1NjI0NDUxRS0wMDUsCisgICAgLTIuODQ3MjQ3MTk3RS0wMDUsCisgICAgLTIuMjYzMzU0ODcyRS0wMDUsCisgICAgLTEuMzA5NjM3NTM3RS0wMDUsCisgICAgLTkuNTYxMDc1Nzg1RS0wMDYsCisgICAgLTYuMDg0NzQ2NDc0RS0wMDYsCisgICAgLTMuMDg2ODU3NzYwRS0wMDYsCisgICAgLTcuMTk4MDA3NjY1RS0wMDcsCisgICAgKzEuODUzNTkxMzU3RS0wMDYsCisgICAgKzEuNDcwNTIwNDg4RS0wMDYsCisgICAgKzkuOTg0OTM1MzMyRS0wMDcsCisgICAgKzUuNjMzODYwMzgzRS0wMDcsCisgICAgKzYuOTkzMzE1MzEwRS0wMDYsCisgICAgKzEuMjA3MDAzMzM0RS0wMDUsCisgICAgKzEuNjYxODE4NzE1RS0wMDUsCisgICAgKzEuNzc2NTk4MDM3RS0wMDUsCisgICAgKzEuODA2OTE0NzcwRS0wMDUsCisgICAgKzIuNjc3MjkxNzQxRS0wMDUsCisgICAgKzIuOTc4OTkzNjg5RS0wMDUsCisgICAgKzMuMjI1NDQ2MTk4RS0wMDUsCisgICAgKzMuMzk3ODUzNjUyRS0wMDUsCisgICAgKzMuNDk1Mzg0OTU0RS0wMDUsCisgICAgKzMuNTE1OTE0NDMyRS0wMDUsCisgICAgKzMuNDYwNDM5MjU3RS0wMDUsCisgICAgKzMuMzM0OTQ3MTc4RS0wMDUsCisgICAgKzMuMTQ0NDY4NDI4RS0wMDUsCisgICAgLTIuMDQyOTcwMTE4RS0wMDUsCisgICAgLTEuOTg3MDkzMzEwRS0wMDUsCisgICAgLTEuODg0MjA4MTc3RS0wMDUsCisgICAgLTEuNzQzMTgzMDIwRS0wMDUsCisgICAgLTEuNTcxNDI4NTg0RS0wMDUsCisgICAgLTEuMzc5NDQ4MzQ5RS0wMDUsCisgICAgLTEuMTc3MTA4NjA2RS0wMDUsCisgICAgLTkuODI2NDQ5OTY4RS0wMDYsCisgICAgLTcuODY5MzMzNzg1RS0wMDYsCisgICAgLTIuMzE5NjExMjEyRS0wMDYsCisgICAgLTMuMTU3MjQyNjQ1RS0wMDYsCisgICAgLTMuNjE3MTUxMTUxRS0wMDYsCisgICAgLTIuNDk3MjE0MTU1RS0wMDYsCisgICAgLTEuMTg5MzE3MTE4RS0wMDYsCisgICAgLTYuNDM3NzIxODIyRS0wMDgsCisgICAgLTguNDM0MDk0NjY3RS0wMDgsCisgICAgKzMuODA5ODg3ODcyRS0wMDgsCisgICAgKzMuMjQ2MjY0NDEzRS0wMDgsCisgICAgLTYuNDAyNjY0MzU0RS0wMDgsCisgICAgLTIuOTc1MTY0ODI2RS0wMDgsCisgICAgLTkuNDU4NTk2Mzk1RS0wMDgsCisgICAgLTQuMzQxNDk4ODIzRS0wMDcsCisgICAgLTguNDI3MjI0NDI5RS0wMDcsCisgICAgLTMuMzMyNjAwMDQ1RS0wMDYsCisgICAgLTQuNDI5NDEyMDAyRS0wMDYsCisgICAgLTUuMzE1OTM2OTYwRS0wMDYsCisgICAgLTYuMjI1MDI4NzU2RS0wMDYsCisgICAgLTYuOTg2Mzk5OTY3RS0wMDYsCisgICAgLTcuNTY4ODM0MDA4RS0wMDYsCisgICAgLTcuOTQxMzYwMzA5RS0wMDYsCisgICAgLTguMDg3NzMyNTY3RS0wMDYsCisgICAgLTguMDA2OTg1ODA5RS0wMDYsCisgICAgLTYuMzYxNDE5MzEwRS0wMDYsCisgICAgLTYuMDE1MjM5MjUxRS0wMDYsCisgICAgLTUuNTE2MzgxNDA3RS0wMDYsCisgICAgLTQuODk2NDk0Mzc0RS0wMDYsCisgICAgLTQuMTk1MDM3OTQ1RS0wMDYsCisgICAgLTMuNDUzODQwNDYzRS0wMDYsCisgICAgLTIuNzE1MDEzODA3RS0wMDYsCisgICAgLTIuMDMyMTE4MTE4RS0wMDYsCisgICAgLTEuMzk5Nzk4MTgwRS0wMDYsCisgICAgLTMuMTMyMzg2NDM5RS0wMDcsCisgICAgLTEuNDQ0OTE4OTIyRS0wMDcsCisgICAgLTIuNzg4NzI4ODkyRS0wMDgsCisgICAgLTcuNTA2NzAxOTI3RS0wMDksCisgICAgLTEuMzE0NDA2MDA2RS0wMDgsCisgICAgKzMuMzk5NDkzMTMxRS0wMDksCisgICAgKzIuNjgyNzA5NjEwRS0wMDksCisgICAgKzEuNjEzMjg1NTA1RS0wMDksCisgICAgKzYuNzAyNDA2OTYzRS0wMTAsCisgICAgLTcuODM0NzY3NTAxRS0wMDgsCisgICAgLTIuMDE0Njc3NDIwRS0wMDcsCisgICAgLTUuMjM0NDc5NjU5RS0wMDcsCisgICAgLTEuMTkwNDQzMDcyRS0wMDYsCisgICAgLTEuOTc1MzI0MjY3RS0wMDYsCisgICAgLTkuNDUxNzM3MjQyRS0wMDcsCisgICAgLTEuMDMzNDI2NjU2RS0wMDYsCisgICAgLTEuMTc5MTgyMDUwRS0wMDYsCisgICAgLTEuMTk0NjMyMDkxRS0wMDYsCisgICAgLTEuMTYyOTI5MjY2RS0wMDYsCisgICAgLTEuMDg1MjI3OTUwRS0wMDYsCisgICAgLTkuNzQyOTU0MDM1RS0wMDcsCisgICAgLTguNDE5OTc2ODkzRS0wMDcsCisgICAgLTcuMDAzNDY3MzE3RS0wMDcsCisgICAgKzUuNTY0MTQwMjI0RS0wMDcsCisgICAgKzYuMjYyMzQ1MDk2RS0wMDcsCisgICAgKzYuNzY3ODM5NDA5RS0wMDcsCisgICAgKzcuMDIwNjQ4ODA5RS0wMDcsCisgICAgKzYuOTgyODk4NTI2RS0wMDcsCisgICAgKzYuNjI4MTkyMTgyRS0wMDcsCisgICAgKzYuMDIyNDQ4MjQ3RS0wMDcsCisgICAgKzQuNzQxMTM3MDQ3RS0wMDcsCisgICAgKzMuOTcwMDMwNzc1RS0wMDcsCisgICAgKzcuMzQyMjUwNjgzRS0wMDcsCisgICAgKzMuOTYxOTgxNDYzRS0wMDcsCisgICAgKzEuNTQzMzA5OTA3RS0wMDcsCisgICAgKzUuMDgzMjc1NjY3RS0wMDgsCisgICAgKzEuNjA4NDAzMDExRS0wMDgsCisgICAgLTcuMDE4NzcwOTgxRS0wMTEsCisgICAgLTEuMTM1OTg1MTk1RS0wMTAKK307CisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGNvbnN0IGZsb2F0LCBmaXJfMzJiYW5kc19ub25wZXJmZWN0KVtdID0geworICAgIC0xLjM5MDE5MTc4NEUtMDA3LAorICAgIC0xLjY5MzczODYyNUUtMDA3LAorICAgIC0yLjAzMDY3NzU2NEUtMDA3LAorICAgIC0yLjQwNDIzODQ0NEUtMDA3LAorICAgIC0yLjgxODE0MzUxNEUtMDA3LAorICAgIC0zLjI3NjY4OTE0MkUtMDA3LAorICAgIC0zLjc4NDc1MjIwOUUtMDA3LAorICAgIC00LjM0Nzg1NTMzOEUtMDA3LAorICAgIC00Ljk3MjI3NjMxNUUtMDA3LAorICAgIC01LjY2NTEyMDg1MkUtMDA3LAorICAgIC02LjQzNDMyNTQyOEUtMDA3LAorICAgIC03LjI4ODczOTQyNUUtMDA3LAorICAgIC04LjIzODE2NDM1NUUtMDA3LAorICAgIC05LjI5MzQxNjk1MkUtMDA3LAorICAgIC0xLjA0NjYzNzA2N0UtMDA2LAorICAgIC0xLjE3Njk5OTYwNEUtMDA2LAorICAgIC0xLjMyMTg0MDYxNEUtMDA2LAorICAgIC0xLjQ4MjY4MTExNEUtMDA2LAorICAgIC0xLjY2MTE1OTc4NkUtMDA2LAorICAgIC0xLjg1OTAzNDAwMUUtMDA2LAorICAgIC0yLjA3ODE3MTc0N0UtMDA2LAorICAgIC0yLjMyMDU1MDk0OEUtMDA2LAorICAgIC0yLjU4ODI1NzUzMEUtMDA2LAorICAgIC0yLjg4MzQ3MDY0M0UtMDA2LAorICAgIC0zLjIwODQ1OTAyMEUtMDA2LAorICAgIC0zLjU2NTU3MDk3OEUtMDA2LAorICAgIC0zLjk1NzIyMDk5N0UtMDA2LAorICAgIC00LjM4NTg3OTAzOEUtMDA2LAorICAgIC00Ljg1NDA1MDUzMEUtMDA2LAorICAgIC01LjM2NDI1MjUwMkUtMDA2LAorICAgIC01LjkxODk5NDI0OEUtMDA2LAorICAgIC02LjUyMDc1NTk2MEUtMDA2LAorICAgIC03LjE3MTk2NDYyNkUtMDA2LAorICAgIC03Ljg3NDk2MDgyOUUtMDA2LAorICAgIC04LjYzMTk2NDE5MkUtMDA2LAorICAgIC05LjQ0NTA1MDYzN0UtMDA2LAorICAgIC0xLjAzMTYxMTAwOUUtMDA1LAorICAgIC0xLjEyNDY4MDg3NUUtMDA1LAorICAgIC0xLjIyMzg1NTI3MEUtMDA1LAorICAgIC0xLjMyOTI0Mzk2OUUtMDA1LAorICAgIC0xLjQ0MDkyMTgyNEUtMDA1LAorICAgIC0xLjU1ODkyNDMwNUUtMDA1LAorICAgIC0xLjY4MzI0Mjc3MkUtMDA1LAorICAgIC0xLjgxMzgyMDM4MUUtMDA1LAorICAgIC0xLjk1MDU0NTk5M0UtMDA1LAorICAgIC0yLjA5MzI1MDQ0MUUtMDA1LAorICAgIC0yLjI0MTcwMTYyM0UtMDA1LAorICAgIC0yLjM5NTU5ODg1OEUtMDA1LAorICAgIC0yLjU1NDU2OTA3M0UtMDA1LAorICAgIC0yLjcxODE2MTcwNEUtMDA1LAorICAgIC0yLjg4NTg0NDMzM0UtMDA1LAorICAgIC0zLjA1Njk5ODY4NUUtMDA1LAorICAgIC0zLjIzMDkxNjI2M0UtMDA1LAorICAgIC0zLjQwNjc5Mzk4NUUtMDA1LAorICAgIC0zLjU4MzczMzYzM0UtMDA1LAorICAgIC0zLjc2MDczNDc2MkUtMDA1LAorICAgIC0zLjkzNjY5Njg4NUUtMDA1LAorICAgIC00LjExMDQxMjU1NkUtMDA1LAorICAgIC00LjI4MDU3MDI4M0UtMDA1LAorICAgIC00LjQ0NTc1MTI1NkUtMDA1LAorICAgIC00LjYwNDQzMDQzM0UtMDA1LAorICAgIC00Ljc1NDk3NjkwOEUtMDA1LAorICAgIC00Ljg5NTY1NTAwMkUtMDA1LAorICAgIC01LjAyNDYyNzUzNUUtMDA1LAorICAgICs1LjEzOTk1NzY0OEUtMDA1LAorICAgICs1LjIzOTYxMjA3NEUtMDA1LAorICAgICs1LjMyMTQ2OTg3MUUtMDA1LAorICAgICs1LjM4MzMyMzg3OEUtMDA1LAorICAgICs1LjQyMjg5MTI2M0UtMDA1LAorICAgICs1LjQzNzgxOTcwOUUtMDA1LAorICAgICs1LjQyNTY5NzYwMEUtMDA1LAorICAgICs1LjM4NDA2Mzg0M0UtMDA1LAorICAgICs1LjMxMDQxODQxOUUtMDA1LAorICAgICs1LjIwMjIzNjIwN0UtMDA1LAorICAgICs1LjA1Njk3OTM1M0UtMDA1LAorICAgICs0Ljg3MjExMjU0OUUtMDA1LAorICAgICs0LjY0NTExNzk1MUUtMDA1LAorICAgICs0LjM3MzUxMTU0N0UtMDA1LAorICAgICs0LjA1NDg2MjA3NUUtMDA1LAorICAgICszLjY4NjgwODg1MEUtMDA1LAorICAgICszLjI2NzA3OTk1NkUtMDA1LAorICAgICsyLjc5MzUxNTUyM0UtMDA1LAorICAgICsyLjI2NDA4NTc0MkUtMDA1LAorICAgICsxLjY3NjkxMzc4MEUtMDA1LAorICAgICsxLjAzMDI5NzY5OUUtMDA1LAorICAgICszLjIyNzMwNjcwNkUtMDA2LAorICAgIC00LjQ3MDYzMzQ4NUUtMDA2LAorICAgIC0xLjI4MDEzMDYxOEUtMDA1LAorICAgIC0yLjE3NzI0MDY0MEUtMDA1LAorICAgIC0zLjEzODg3MzU4MUUtMDA1LAorICAgIC00LjE2NTE5NTc4N0UtMDA1LAorICAgIC01LjI1NjAzNjQ1N0UtMDA1LAorICAgIC02LjQxMDg2NDQ0NEUtMDA1LAorICAgIC03LjYyODc2NjYxNkUtMDA1LAorICAgIC04LjkwODQyNzExN0UtMDA1LAorICAgIC0xLjAyNDgxMDYyNkUtMDA0LAorICAgIC0xLjE2NDU2MjEyN0UtMDA0LAorICAgIC0xLjMwOTgzMzAyNEUtMDA0LAorICAgIC0xLjQ2MDMxMTMyM0UtMDA0LAorICAgIC0xLjYxNTYzNTk5MkUtMDA0LAorICAgIC0xLjc3NTM5NTM1OEUtMDA0LAorICAgIC0xLjkzOTEyNjUyM0UtMDA0LAorICAgIC0yLjEwNjMxMzc2OEUtMDA0LAorICAgIC0yLjI3NjM4ODU1MEUtMDA0LAorICAgIC0yLjQ0ODcyODc3NEUtMDA0LAorICAgIC0yLjYyMjY1ODUwM0UtMDA0LAorICAgIC0yLjc5NzQ0OTEyNEUtMDA0LAorICAgIC0yLjk3MjMxNzc0M0UtMDA0LAorICAgIC0zLjE0NjQzMDI0NUUtMDA0LAorICAgIC0zLjMxODkwMDcwOEUtMDA0LAorICAgIC0zLjQ4ODc5MzczNkUtMDA0LAorICAgIC0zLjY1NTEyNTkxMUUtMDA0LAorICAgIC0zLjgxNjg2NzUzOEUtMDA0LAorICAgIC0zLjk3Mjk0NTg1MUUtMDA0LAorICAgIC00LjEyMjI0NzA0NkUtMDA0LAorICAgIC00LjI2MzYyMDA2N0UtMDA0LAorICAgIC00LjM5NTg3OTgwNUUtMDA0LAorICAgIC00LjUxNzgxMDU5NEUtMDA0LAorICAgIC00LjYyODE3MjAyOEUtMDA0LAorICAgIC00LjcyNTcwMjc0N0UtMDA0LAorICAgIC00LjgwOTEyMzM0OEUtMDA0LAorICAgIC00Ljg3NzE0NjI3NUUtMDA0LAorICAgIC00LjkyODQ3NzU3NEUtMDA0LAorICAgIC00Ljk2MTgyNDE2MUUtMDA0LAorICAgIC00Ljk3NTk0NDc1N0UtMDA0LAorICAgIC00Ljk2OTQ4MTk2MUUtMDA0LAorICAgIC00Ljk0MTIyODU0NEUtMDA0LAorICAgIC00Ljg4OTk2MDQwMUUtMDA0LAorICAgICs0LjgxNDQ5MjQyMkUtMDA0LAorICAgICs0LjcxMzY3ODc5MUUtMDA0LAorICAgICs0LjU4NjQyNjA3NkUtMDA0LAorICAgICs0LjQzMTcwMTA5MUUtMDA0LAorICAgICs0LjI0ODUzNjEzNEUtMDA0LAorICAgICs0LjAzNjAzNzcxN0UtMDA0LAorICAgICszLjc5MzM5Njc1NEUtMDA0LAorICAgICszLjUxOTg5NDM4MUUtMDA0LAorICAgICszLjIxNDkxMTI2N0UtMDA0LAorICAgICsyLjg3NzkzNDYwM0UtMDA0LAorICAgICsyLjUwODU2Nzk5NUUtMDA0LAorICAgICsyLjEwNjUzNzU3N0UtMDA0LAorICAgICsxLjY3MTY5OTcyMEUtMDA0LAorICAgICsxLjIwNDA0OTExM0UtMDA0LAorICAgICs3LjAzNzI1MzA5MEUtMDA1LAorICAgICsxLjcxMDE5ODAxMkUtMDA1LAorICAgIC0zLjkzNjE4MjgzOUUtMDA1LAorICAgIC05Ljg5NTc1NTY0N0UtMDA1LAorICAgIC0xLjYxNjA2OTc4NUUtMDA0LAorICAgIC0yLjI3MjE0MjU5MkUtMDA0LAorICAgIC0yLjk1NjY1OTU5MUUtMDA0LAorICAgIC0zLjY2ODMwMTIxNUUtMDA0LAorICAgIC00LjQwNTU2MzgxNEUtMDA0LAorICAgIC01LjE2Njc1NDcwOUUtMDA0LAorICAgIC01Ljk0OTk5MDAwOUUtMDA0LAorICAgIC02Ljc1MzE5NzUyMkUtMDA0LAorICAgIC03LjU3NDEwOTQ3N0UtMDA0LAorICAgIC04LjQxMDI3MTI1N0UtMDA0LAorICAgIC05LjI1OTAzNDk5NkUtMDA0LAorICAgIC0xLjAxMTc1NjU5OEUtMDAzLAorICAgIC0xLjA5ODI4NDYxNEUtMDAzLAorICAgIC0xLjE4NTE2NzM0OEUtMDAzLAorICAgIC0xLjI3MjA2NzQyOEUtMDAzLAorICAgIC0xLjM1ODYzMDAxOUUtMDAzLAorICAgIC0xLjQ0NDQ4NDIyNEUtMDAzLAorICAgIC0xLjUyOTI0MzE5M0UtMDAzLAorICAgIC0xLjYxMjUwNTUyNkUtMDAzLAorICAgIC0xLjY5Mzg1NTYyMkUtMDAzLAorICAgIC0xLjc3Mjg2NTMwNEUtMDAzLAorICAgIC0xLjg0OTA5NDUyMkUtMDAzLAorICAgIC0xLjkyMjA5MjUxN0UtMDAzLAorICAgIC0xLjk5MTM5OTU2NEUtMDAzLAorICAgIC0yLjA1NjU0NzIwOEUtMDAzLAorICAgIC0yLjExNzA2MTI4OUUtMDAzLAorICAgIC0yLjE3MjQ2MjE3N0UtMDAzLAorICAgIC0yLjIyMjI2NjUxNEUtMDAzLAorICAgIC0yLjI2NTk4OTMxNUUtMDAzLAorICAgIC0yLjMwMzE0NTM2MEUtMDAzLAorICAgIC0yLjMzMzI1MTA2MUUtMDAzLAorICAgIC0yLjM1NTgyNTYyMkUtMDAzLAorICAgIC0yLjM3MDM5NDA2OEUtMDAzLAorICAgIC0yLjM3NjQ4NzQ3OUUtMDAzLAorICAgIC0yLjM3MzY0NzE3OEUtMDAzLAorICAgIC0yLjM2MTQyMzU2OUUtMDAzLAorICAgIC0yLjMzOTM4MDc5M0UtMDAzLAorICAgIC0yLjMwNzA5NzE5NUUtMDAzLAorICAgIC0yLjI2NDE2Nzg4MUUtMDAzLAorICAgIC0yLjIxMDIwNTg4N0UtMDAzLAorICAgIC0yLjE0NDg0NDk3MEUtMDAzLAorICAgIC0yLjA2Nzc0MDc3NEUtMDAzLAorICAgIC0xLjk3ODU3MjY5MUUtMDAzLAorICAgIC0xLjg3NzA0NjE5MEUtMDAzLAorICAgIC0xLjc2Mjg5NDMzMUUtMDAzLAorICAgIC0xLjYzNTg3ODkyOUUtMDAzLAorICAgICsxLjQ5NTc5MjY0N0UtMDAzLAorICAgICsxLjM0MjQ2MDI4MEUtMDAzLAorICAgICsxLjE3NTc0MDczNEUtMDAzLAorICAgICs5Ljk1NTI3MzcwOEUtMDA0LAorICAgICs4LjAxNzUwNDU4OEUtMDA0LAorICAgICs1Ljk0Mzc3MzQzMUUtMDA0LAorICAgICszLjczNDEzOTMxOEUtMDA0LAorICAgICsxLjM4OTA1NjQxNUUtMDA0LAorICAgIC0xLjA5MDYyMDIwOEUtMDA0LAorICAgIC0zLjcwMzYyNTk4OUUtMDA0LAorICAgIC02LjQ0ODI4MjUxMUUtMDA0LAorICAgIC05LjMyMjQ5NDE1MkUtMDA0LAorICAgIC0xLjIzMjM3NDExMEUtMDAzLAorICAgIC0xLjU0NDkwODk3MEUtMDAzLAorICAgIC0xLjg2OTUxNzYxMUUtMDAzLAorICAgIC0yLjIwNTgyMjM4NEUtMDAzLAorICAgIC0yLjU1MzQwMzg0M0UtMDAzLAorICAgIC0yLjkxMTgwMTY4M0UtMDAzLAorICAgIC0zLjI4MDUxNDYxOEUtMDAzLAorICAgIC0zLjY1OTAwMjk0OUUtMDAzLAorICAgIC00LjA0NjY4NjkyNUUtMDAzLAorICAgIC00LjQ0Mjk1MDI0NUUtMDAzLAorICAgIC00Ljg0NzE0MDk4M0UtMDAzLAorICAgIC01LjI1ODU3MDg5MUUtMDAzLAorICAgIC01LjY3NjUxODY2MEUtMDAzLAorICAgIC02LjEwMDIzMzY0NEUtMDAzLAorICAgIC02LjUyODkzMzA2N0UtMDAzLAorICAgIC02Ljk2MTgwNzYwOUUtMDAzLAorICAgIC03LjM5ODAyMjMzOUUtMDAzLAorICAgIC03LjgzNjcxOTA0NEUtMDAzLAorICAgIC04LjI3NzAxNjY5MkUtMDAzLAorICAgIC04LjcxODAxOTM1MUUtMDAzLAorICAgIC05LjE1ODgxMTUzMkUtMDAzLAorICAgIC05LjU5ODQ2NTYzNkUtMDAzLAorICAgIC0xLjAwMzYwNDM4MkUtMDAyLAorICAgIC0xLjA0NzA1OTgwMEUtMDAyLAorICAgIC0xLjA5MDExNzczMEUtMDAyLAorICAgIC0xLjEzMjY4Mjg5N0UtMDAyLAorICAgIC0xLjE3NDY1OTc0OEUtMDAyLAorICAgIC0xLjIxNTk1MzM4MEUtMDAyLAorICAgIC0xLjI1NjQ2OTM1OEUtMDAyLAorICAgIC0xLjI5NjExNDE3N0UtMDAyLAorICAgIC0xLjMzNDc5NTgyMUUtMDAyLAorICAgIC0xLjM3MjQyMzQ4OUUtMDAyLAorICAgIC0xLjQwODkwODMzMEUtMDAyLAorICAgIC0xLjQ0NDE2MzM2MEUtMDAyLAorICAgIC0xLjQ3ODEwNDQ4MEUtMDAyLAorICAgIC0xLjUxMDY0OTczM0UtMDAyLAorICAgIC0xLjU0MTcyMDMzMUUtMDAyLAorICAgIC0xLjU3MTI0MDY0OUUtMDAyLAorICAgIC0xLjU5OTEzODIzMEUtMDAyLAorICAgIC0xLjYyNTM0NDcxNkUtMDAyLAorICAgIC0xLjY0OTc5NTQ3M0UtMDAyLAorICAgIC0xLjY3MjQyOTQwNUUtMDAyLAorICAgIC0xLjY5MzE5MDgyMUUtMDAyLAorICAgIC0xLjcxMjAyNzU2NUUtMDAyLAorICAgIC0xLjcyODg5MjY5OUUtMDAyLAorICAgIC0xLjc0Mzc0Mzc1NUUtMDAyLAorICAgIC0xLjc1NjU0MzQ4MEUtMDAyLAorICAgIC0xLjc2NzI2MDM5NUUtMDAyLAorICAgIC0xLjc3NTg2NTgxNkUtMDAyLAorICAgIC0xLjc4MjMzOTA2NkUtMDAyLAorICAgIC0xLjc4NjY2Mzc1NkUtMDAyLAorICAgIC0xLjc4ODgyODg5NEUtMDAyLAorICAgICsxLjc4ODgyODg5NEUtMDAyLAorICAgICsxLjc4NjY2Mzc1NkUtMDAyLAorICAgICsxLjc4MjMzOTA2NkUtMDAyLAorICAgICsxLjc3NTg2NTgxNkUtMDAyLAorICAgICsxLjc2NzI2MDM5NUUtMDAyLAorICAgICsxLjc1NjU0MzQ4MEUtMDAyLAorICAgICsxLjc0Mzc0Mzc1NUUtMDAyLAorICAgICsxLjcyODg5MjY5OUUtMDAyLAorICAgICsxLjcxMjAyNzU2NUUtMDAyLAorICAgICsxLjY5MzE5MDgyMUUtMDAyLAorICAgICsxLjY3MjQyOTQwNUUtMDAyLAorICAgICsxLjY0OTc5NTQ3M0UtMDAyLAorICAgICsxLjYyNTM0NDcxNkUtMDAyLAorICAgICsxLjU5OTEzODIzMEUtMDAyLAorICAgICsxLjU3MTI0MDY0OUUtMDAyLAorICAgICsxLjU0MTcyMDMzMUUtMDAyLAorICAgICsxLjUxMDY0OTczM0UtMDAyLAorICAgICsxLjQ3ODEwNDQ4MEUtMDAyLAorICAgICsxLjQ0NDE2MzM2MEUtMDAyLAorICAgICsxLjQwODkwODMzMEUtMDAyLAorICAgICsxLjM3MjQyMzQ4OUUtMDAyLAorICAgICsxLjMzNDc5NTgyMUUtMDAyLAorICAgICsxLjI5NjExNDE3N0UtMDAyLAorICAgICsxLjI1NjQ2OTM1OEUtMDAyLAorICAgICsxLjIxNTk1MzM4MEUtMDAyLAorICAgICsxLjE3NDY1OTc0OEUtMDAyLAorICAgICsxLjEzMjY4Mjg5N0UtMDAyLAorICAgICsxLjA5MDExNzczMEUtMDAyLAorICAgICsxLjA0NzA1OTgwMEUtMDAyLAorICAgICsxLjAwMzYwNDM4MkUtMDAyLAorICAgICs5LjU5ODQ2NTYzNkUtMDAzLAorICAgICs5LjE1ODgxMTUzMkUtMDAzLAorICAgICs4LjcxODAxOTM1MUUtMDAzLAorICAgICs4LjI3NzAxNjY5MkUtMDAzLAorICAgICs3LjgzNjcxOTA0NEUtMDAzLAorICAgICs3LjM5ODAyMjMzOUUtMDAzLAorICAgICs2Ljk2MTgwNzYwOUUtMDAzLAorICAgICs2LjUyODkzMzA2N0UtMDAzLAorICAgICs2LjEwMDIzMzY0NEUtMDAzLAorICAgICs1LjY3NjUxODY2MEUtMDAzLAorICAgICs1LjI1ODU3MDg5MUUtMDAzLAorICAgICs0Ljg0NzE0MDk4M0UtMDAzLAorICAgICs0LjQ0Mjk1MDI0NUUtMDAzLAorICAgICs0LjA0NjY4NjkyNUUtMDAzLAorICAgICszLjY1OTAwMjk0OUUtMDAzLAorICAgICszLjI4MDUxNDYxOEUtMDAzLAorICAgICsyLjkxMTgwMTY4M0UtMDAzLAorICAgICsyLjU1MzQwMzg0M0UtMDAzLAorICAgICsyLjIwNTgyMjM4NEUtMDAzLAorICAgICsxLjg2OTUxNzYxMUUtMDAzLAorICAgICsxLjU0NDkwODk3MEUtMDAzLAorICAgICsxLjIzMjM3NDExMEUtMDAzLAorICAgICs5LjMyMjQ5NDE1MkUtMDA0LAorICAgICs2LjQ0ODI4MjUxMUUtMDA0LAorICAgICszLjcwMzYyNTk4OUUtMDA0LAorICAgICsxLjA5MDYyMDIwOEUtMDA0LAorICAgIC0xLjM4OTA1NjQxNUUtMDA0LAorICAgIC0zLjczNDEzOTMxOEUtMDA0LAorICAgIC01Ljk0Mzc3MzQzMUUtMDA0LAorICAgIC04LjAxNzUwNDU4OEUtMDA0LAorICAgIC05Ljk1NTI3MzcwOEUtMDA0LAorICAgIC0xLjE3NTc0MDczNEUtMDAzLAorICAgIC0xLjM0MjQ2MDI4MEUtMDAzLAorICAgIC0xLjQ5NTc5MjY0N0UtMDAzLAorICAgICsxLjYzNTg3ODkyOUUtMDAzLAorICAgICsxLjc2Mjg5NDMzMUUtMDAzLAorICAgICsxLjg3NzA0NjE5MEUtMDAzLAorICAgICsxLjk3ODU3MjY5MUUtMDAzLAorICAgICsyLjA2Nzc0MDc3NEUtMDAzLAorICAgICsyLjE0NDg0NDk3MEUtMDAzLAorICAgICsyLjIxMDIwNTg4N0UtMDAzLAorICAgICsyLjI2NDE2Nzg4MUUtMDAzLAorICAgICsyLjMwNzA5NzE5NUUtMDAzLAorICAgICsyLjMzOTM4MDc5M0UtMDAzLAorICAgICsyLjM2MTQyMzU2OUUtMDAzLAorICAgICsyLjM3MzY0NzE3OEUtMDAzLAorICAgICsyLjM3NjQ4NzQ3OUUtMDAzLAorICAgICsyLjM3MDM5NDA2OEUtMDAzLAorICAgICsyLjM1NTgyNTYyMkUtMDAzLAorICAgICsyLjMzMzI1MTA2MUUtMDAzLAorICAgICsyLjMwMzE0NTM2MEUtMDAzLAorICAgICsyLjI2NTk4OTMxNUUtMDAzLAorICAgICsyLjIyMjI2NjUxNEUtMDAzLAorICAgICsyLjE3MjQ2MjE3N0UtMDAzLAorICAgICsyLjExNzA2MTI4OUUtMDAzLAorICAgICsyLjA1NjU0NzIwOEUtMDAzLAorICAgICsxLjk5MTM5OTU2NEUtMDAzLAorICAgICsxLjkyMjA5MjUxN0UtMDAzLAorICAgICsxLjg0OTA5NDUyMkUtMDAzLAorICAgICsxLjc3Mjg2NTMwNEUtMDAzLAorICAgICsxLjY5Mzg1NTYyMkUtMDAzLAorICAgICsxLjYxMjUwNTUyNkUtMDAzLAorICAgICsxLjUyOTI0MzE5M0UtMDAzLAorICAgICsxLjQ0NDQ4NDIyNEUtMDAzLAorICAgICsxLjM1ODYzMDAxOUUtMDAzLAorICAgICsxLjI3MjA2NzQyOEUtMDAzLAorICAgICsxLjE4NTE2NzM0OEUtMDAzLAorICAgICsxLjA5ODI4NDYxNEUtMDAzLAorICAgICsxLjAxMTc1NjU5OEUtMDAzLAorICAgICs5LjI1OTAzNDk5NkUtMDA0LAorICAgICs4LjQxMDI3MTI1N0UtMDA0LAorICAgICs3LjU3NDEwOTQ3N0UtMDA0LAorICAgICs2Ljc1MzE5NzUyMkUtMDA0LAorICAgICs1Ljk0OTk5MDAwOUUtMDA0LAorICAgICs1LjE2Njc1NDcwOUUtMDA0LAorICAgICs0LjQwNTU2MzgxNEUtMDA0LAorICAgICszLjY2ODMwMTIxNUUtMDA0LAorICAgICsyLjk1NjY1OTU5MUUtMDA0LAorICAgICsyLjI3MjE0MjU5MkUtMDA0LAorICAgICsxLjYxNjA2OTc4NUUtMDA0LAorICAgICs5Ljg5NTc1NTY0N0UtMDA1LAorICAgICszLjkzNjE4MjgzOUUtMDA1LAorICAgIC0xLjcxMDE5ODAxMkUtMDA1LAorICAgIC03LjAzNzI1MzA5MEUtMDA1LAorICAgIC0xLjIwNDA0OTExM0UtMDA0LAorICAgIC0xLjY3MTY5OTcyMEUtMDA0LAorICAgIC0yLjEwNjUzNzU3N0UtMDA0LAorICAgIC0yLjUwODU2Nzk5NUUtMDA0LAorICAgIC0yLjg3NzkzNDYwM0UtMDA0LAorICAgIC0zLjIxNDkxMTI2N0UtMDA0LAorICAgIC0zLjUxOTg5NDM4MUUtMDA0LAorICAgIC0zLjc5MzM5Njc1NEUtMDA0LAorICAgIC00LjAzNjAzNzcxN0UtMDA0LAorICAgIC00LjI0ODUzNjEzNEUtMDA0LAorICAgIC00LjQzMTcwMTA5MUUtMDA0LAorICAgIC00LjU4NjQyNjA3NkUtMDA0LAorICAgIC00LjcxMzY3ODc5MUUtMDA0LAorICAgIC00LjgxNDQ5MjQyMkUtMDA0LAorICAgICs0Ljg4OTk2MDQwMUUtMDA0LAorICAgICs0Ljk0MTIyODU0NEUtMDA0LAorICAgICs0Ljk2OTQ4MTk2MUUtMDA0LAorICAgICs0Ljk3NTk0NDc1N0UtMDA0LAorICAgICs0Ljk2MTgyNDE2MUUtMDA0LAorICAgICs0LjkyODQ3NzU3NEUtMDA0LAorICAgICs0Ljg3NzE0NjI3NUUtMDA0LAorICAgICs0LjgwOTEyMzM0OEUtMDA0LAorICAgICs0LjcyNTcwMjc0N0UtMDA0LAorICAgICs0LjYyODE3MjAyOEUtMDA0LAorICAgICs0LjUxNzgxMDU5NEUtMDA0LAorICAgICs0LjM5NTg3OTgwNUUtMDA0LAorICAgICs0LjI2MzYyMDA2N0UtMDA0LAorICAgICs0LjEyMjI0NzA0NkUtMDA0LAorICAgICszLjk3Mjk0NTg1MUUtMDA0LAorICAgICszLjgxNjg2NzUzOEUtMDA0LAorICAgICszLjY1NTEyNTkxMUUtMDA0LAorICAgICszLjQ4ODc5MzczNkUtMDA0LAorICAgICszLjMxODkwMDcwOEUtMDA0LAorICAgICszLjE0NjQzMDI0NUUtMDA0LAorICAgICsyLjk3MjMxNzc0M0UtMDA0LAorICAgICsyLjc5NzQ0OTEyNEUtMDA0LAorICAgICsyLjYyMjY1ODUwM0UtMDA0LAorICAgICsyLjQ0ODcyODc3NEUtMDA0LAorICAgICsyLjI3NjM4ODU1MEUtMDA0LAorICAgICsyLjEwNjMxMzc2OEUtMDA0LAorICAgICsxLjkzOTEyNjUyM0UtMDA0LAorICAgICsxLjc3NTM5NTM1OEUtMDA0LAorICAgICsxLjYxNTYzNTk5MkUtMDA0LAorICAgICsxLjQ2MDMxMTMyM0UtMDA0LAorICAgICsxLjMwOTgzMzAyNEUtMDA0LAorICAgICsxLjE2NDU2MjEyN0UtMDA0LAorICAgICsxLjAyNDgxMDYyNkUtMDA0LAorICAgICs4LjkwODQyNzExN0UtMDA1LAorICAgICs3LjYyODc2NjYxNkUtMDA1LAorICAgICs2LjQxMDg2NDQ0NEUtMDA1LAorICAgICs1LjI1NjAzNjQ1N0UtMDA1LAorICAgICs0LjE2NTE5NTc4N0UtMDA1LAorICAgICszLjEzODg3MzU4MUUtMDA1LAorICAgICsyLjE3NzI0MDY0MEUtMDA1LAorICAgICsxLjI4MDEzMDYxOEUtMDA1LAorICAgICs0LjQ3MDYzMzQ4NUUtMDA2LAorICAgIC0zLjIyNzMwNjcwNkUtMDA2LAorICAgIC0xLjAzMDI5NzY5OUUtMDA1LAorICAgIC0xLjY3NjkxMzc4MEUtMDA1LAorICAgIC0yLjI2NDA4NTc0MkUtMDA1LAorICAgIC0yLjc5MzUxNTUyM0UtMDA1LAorICAgIC0zLjI2NzA3OTk1NkUtMDA1LAorICAgIC0zLjY4NjgwODg1MEUtMDA1LAorICAgIC00LjA1NDg2MjA3NUUtMDA1LAorICAgIC00LjM3MzUxMTU0N0UtMDA1LAorICAgIC00LjY0NTExNzk1MUUtMDA1LAorICAgIC00Ljg3MjExMjU0OUUtMDA1LAorICAgIC01LjA1Njk3OTM1M0UtMDA1LAorICAgIC01LjIwMjIzNjIwN0UtMDA1LAorICAgIC01LjMxMDQxODQxOUUtMDA1LAorICAgIC01LjM4NDA2Mzg0M0UtMDA1LAorICAgIC01LjQyNTY5NzYwMEUtMDA1LAorICAgIC01LjQzNzgxOTcwOUUtMDA1LAorICAgIC01LjQyMjg5MTI2M0UtMDA1LAorICAgIC01LjM4MzMyMzg3OEUtMDA1LAorICAgIC01LjMyMTQ2OTg3MUUtMDA1LAorICAgIC01LjIzOTYxMjA3NEUtMDA1LAorICAgIC01LjEzOTk1NzY0OEUtMDA1LAorICAgICs1LjAyNDYyNzUzNUUtMDA1LAorICAgICs0Ljg5NTY1NTAwMkUtMDA1LAorICAgICs0Ljc1NDk3NjkwOEUtMDA1LAorICAgICs0LjYwNDQzMDQzM0UtMDA1LAorICAgICs0LjQ0NTc1MTI1NkUtMDA1LAorICAgICs0LjI4MDU3MDI4M0UtMDA1LAorICAgICs0LjExMDQxMjU1NkUtMDA1LAorICAgICszLjkzNjY5Njg4NUUtMDA1LAorICAgICszLjc2MDczNDc2MkUtMDA1LAorICAgICszLjU4MzczMzYzM0UtMDA1LAorICAgICszLjQwNjc5Mzk4NUUtMDA1LAorICAgICszLjIzMDkxNjI2M0UtMDA1LAorICAgICszLjA1Njk5ODY4NUUtMDA1LAorICAgICsyLjg4NTg0NDMzM0UtMDA1LAorICAgICsyLjcxODE2MTcwNEUtMDA1LAorICAgICsyLjU1NDU2OTA3M0UtMDA1LAorICAgICsyLjM5NTU5ODg1OEUtMDA1LAorICAgICsyLjI0MTcwMTYyM0UtMDA1LAorICAgICsyLjA5MzI1MDQ0MUUtMDA1LAorICAgICsxLjk1MDU0NTk5M0UtMDA1LAorICAgICsxLjgxMzgyMDM4MUUtMDA1LAorICAgICsxLjY4MzI0Mjc3MkUtMDA1LAorICAgICsxLjU1ODkyNDMwNUUtMDA1LAorICAgICsxLjQ0MDkyMTgyNEUtMDA1LAorICAgICsxLjMyOTI0Mzk2OUUtMDA1LAorICAgICsxLjIyMzg1NTI3MEUtMDA1LAorICAgICsxLjEyNDY4MDg3NUUtMDA1LAorICAgICsxLjAzMTYxMTAwOUUtMDA1LAorICAgICs5LjQ0NTA1MDYzN0UtMDA2LAorICAgICs4LjYzMTk2NDE5MkUtMDA2LAorICAgICs3Ljg3NDk2MDgyOUUtMDA2LAorICAgICs3LjE3MTk2NDYyNkUtMDA2LAorICAgICs2LjUyMDc1NTk2MEUtMDA2LAorICAgICs1LjkxODk5NDI0OEUtMDA2LAorICAgICs1LjM2NDI1MjUwMkUtMDA2LAorICAgICs0Ljg1NDA1MDUzMEUtMDA2LAorICAgICs0LjM4NTg3OTAzOEUtMDA2LAorICAgICszLjk1NzIyMDk5N0UtMDA2LAorICAgICszLjU2NTU3MDk3OEUtMDA2LAorICAgICszLjIwODQ1OTAyMEUtMDA2LAorICAgICsyLjg4MzQ3MDY0M0UtMDA2LAorICAgICsyLjU4ODI1NzUzMEUtMDA2LAorICAgICsyLjMyMDU1MDk0OEUtMDA2LAorICAgICsyLjA3ODE3MTc0N0UtMDA2LAorICAgICsxLjg1OTAzNDAwMUUtMDA2LAorICAgICsxLjY2MTE1OTc4NkUtMDA2LAorICAgICsxLjQ4MjY4MTExNEUtMDA2LAorICAgICsxLjMyMTg0MDYxNEUtMDA2LAorICAgICsxLjE3Njk5OTYwNEUtMDA2LAorICAgICsxLjA0NjYzNzA2N0UtMDA2LAorICAgICs5LjI5MzQxNjk1MkUtMDA3LAorICAgICs4LjIzODE2NDM1NUUtMDA3LAorICAgICs3LjI4ODczOTQyNUUtMDA3LAorICAgICs2LjQzNDMyNTQyOEUtMDA3LAorICAgICs1LjY2NTEyMDg1MkUtMDA3LAorICAgICs0Ljk3MjI3NjMxNUUtMDA3LAorICAgICs0LjM0Nzg1NTMzOEUtMDA3LAorICAgICszLjc4NDc1MjIwOUUtMDA3LAorICAgICszLjI3NjY4OTE0MkUtMDA3LAorICAgICsyLjgxODE0MzUxNEUtMDA3LAorICAgICsyLjQwNDIzODQ0NEUtMDA3LAorICAgICsyLjAzMDY3NzU2NEUtMDA3LAorICAgICsxLjY5MzczODYyNUUtMDA3LAorICAgICsxLjM5MDE5MTc4NEUtMDA3Cit9OworCisvKiBwcmUtc2NhbGUgbGZlIGZpciBjb2VmZmljaWVudHMgKi8KKyNkZWZpbmUgU0NBTEUoYykgKChjKSAvICgyNTYuMGYgKiAzMjc2OC4wZikpCitERUNMQVJFX0FMSUdORUQoMTYsIHN0YXRpYyBjb25zdCBmbG9hdCwgbGZlX2Zpcl82NClbXSA9IHsKKyAgICBTQ0FMRSgyLjY1ODQzNDM4NjgzMDc3N2UtNCksIFNDQUxFKDkuMDI5MzMwNjg1NzM0NzQ4ZS0zKSwKKyAgICBTQ0FMRSg3LjkzOTI2MzQzMzIxODAwMmUtMiksIFNDQUxFKDIuNDI1MTU4NzY4ODkyMjg4ZS0xKSwKKyAgICBTQ0FMRSgzLjQzMDE3OTM1NzUyODY4NmUtMSksIFNDQUxFKDIuMzk4MjI4OTQzMzQ3OTMxZS0xKSwKKyAgICBTQ0FMRSg3Ljc0NjQ0Mzg5NzQ4NTczM2UtMiksIFNDQUxFKDguNjIyMzIxMzAwMjA4NTY5ZS0zKSwKKyAgICBTQ0FMRSg4LjE3OTM2NTI0OTgxNjMyOGUtNSksIFNDQUxFKDkuNDUwOTUzNDUzNzc5MjIwZS0zKSwKKyAgICBTQ0FMRSg4LjEzNDg4Mjg5NzEzODU5NmUtMiksIFNDQUxFKDIuNDUxOTM4ODM3NzY2NjQ4ZS0xKSwKKyAgICBTQ0FMRSgzLjQyOTU5NzMxODE3MjQ1NWUtMSksIFNDQUxFKDIuMzcxMTU5NzkxOTQ2NDExZS0xKSwKKyAgICBTQ0FMRSg3LjU1NjQzNjIxMDg3MDc0M2UtMiksIFNDQUxFKDguMjI5NjMwOTk5MjY3MTAxZS0zKSwKKyAgICBTQ0FMRSg5LjQzOTMyMzkxMjM3NDY3NmUtNSksIFNDQUxFKDkuODg3NTYwMjcwNzI2NjgwZS0zKSwKKyAgICBTQ0FMRSg4LjMzMzI4NTg5Nzk3MDIwMGUtMiksIFNDQUxFKDIuNDc4NTU5MDE3MTgxMzk2ZS0xKSwKKyAgICBTQ0FMRSgzLjQyODQzNDEzMzUyOTY2M2UtMSksIFNDQUxFKDIuMzQzOTYxNTk2NDg4OTUyZS0xKSwKKyAgICBTQ0FMRSg3LjM2OTI1MjI5NDMwMTk4N2UtMiksIFNDQUxFKDcuODUwODY1ODMzNDYxMjg1ZS0zKSwKKyAgICBTQ0FMRSgxLjA4MjE3MDI3NDQ1Nzg5NGUtNCksIFNDQUxFKDEuMDMzOTQ5NDc5NDYwNzE2ZS0yKSwKKyAgICBTQ0FMRSg4LjUzNDQ1Njc4OTQ5MzU2MWUtMiksIFNDQUxFKDIuNTA1MDA4ODc2MzIzNzAwZS0xKSwKKyAgICBTQ0FMRSgzLjQyNjY4OTUwNTU3NzA4OGUtMSksIFNDQUxFKDIuMzE2NjQ0Nzg3Nzg4MzkxZS0xKSwKKyAgICBTQ0FMRSg3LjE4NDkwMTA4ODQ3NjE4MWUtMiksIFNDQUxFKDcuNDg1NzM2NjI3MTMxNzAxZS0zKSwKKyAgICBTQ0FMRSgxLjIzMzM3MTQ0MDMyMTIwN2UtNCksIFNDQUxFKDEuMDgwNzA4NDg1MDk2NjkzZS0yKSwKKyAgICBTQ0FMRSg4LjczODM3Njk0NTI1NzE4N2UtMiksIFNDQUxFKDIuNTMxMjc4MTMzMzkyMzM0ZS0xKSwKKyAgICBTQ0FMRSgzLjQyNDM2NDkyNDQzMDg0N2UtMSksIFNDQUxFKDIuMjg5MjE5NjQ3NjQ1OTUwZS0xKSwKKyAgICBTQ0FMRSg3LjAwMzM5MjI3OTE0ODEwMmUtMiksIFNDQUxFKDcuMTMzODgyMDI3MTE5Mzk4ZS0zKSwKKyAgICBTQ0FMRSgxLjM5NzQ4NTc1NzQ3OTQ0NGUtNCksIFNDQUxFKDEuMTI5MDY4MjQ3OTczOTE5ZS0yKSwKKyAgICBTQ0FMRSg4Ljk0NTAyNjI0ODY5MzQ2NmUtMiksIFNDQUxFKDIuNTU3MzU1NzYxNTI4MDE1ZS0xKSwKKyAgICBTQ0FMRSgzLjQyMTQ2MTI4NDE2MDYxNGUtMSksIFNDQUxFKDIuMjYxNjk2MTU5ODM5NjMwZS0xKSwKKyAgICBTQ0FMRSg2LjgyNDczMTgyNjc4MjIyN2UtMiksIFNDQUxFKDYuNzk0OTkxOTAzMDA3MDMwZS0zKSwKKyAgICBTQ0FMRSgxLjU3NTk1ODAxMjgzNjA1NGUtNCksIFNDQUxFKDEuMTc5MDY1MDg5NjcyODA0ZS0yKSwKKyAgICBTQ0FMRSg5LjE1NDM4MzgzODE3NjcyOGUtMiksIFNDQUxFKDIuNTgzMjMyMjIzOTg3NTgwZS0xKSwKKyAgICBTQ0FMRSgzLjQxNzk3OTc3Njg1OTI4NGUtMSksIFNDQUxFKDIuMjM0MDg0NjA2MTcwNjU0ZS0xKSwKKyAgICBTQ0FMRSg2LjY0ODkyMzQ1NjY2ODg1NGUtMiksIFNDQUxFKDYuNDY4NjkxMzk3NDU4MzE1ZS0zKSwKKyAgICBTQ0FMRSgxLjc2OTkyMjM4MjY2MzkzNmUtNCksIFNDQUxFKDEuMjMwNzMyMTY1Mjc3MDA0ZS0yKSwKKyAgICBTQ0FMRSg5LjM2NjQyNTEyNjc5MTAwMGUtMiksIFNDQUxFKDIuNjA4ODk2NzkxOTM0OTY3ZS0xKSwKKyAgICBTQ0FMRSgzLjQxMzkyMjE5MDY2NjE5OGUtMSksIFNDQUxFKDIuMjA2Mzk1MTE5NDI4NjM1ZS0xKSwKKyAgICBTQ0FMRSg2LjQ3NTk3MDg5NDA5ODI4MmUtMiksIFNDQUxFKDYuMTU0NzEyMjg5NTcxNzYyZS0zKSwKKyAgICBTQ0FMRSgxLjk4MTczODYwNTUzNjUyMGUtNCksIFNDQUxFKDEuMjg0MTA1OTgyNjMxNDQ1ZS0yKSwKKyAgICBTQ0FMRSg5LjU4MTEyNDAzNzUwNDE5NmUtMiksIFNDQUxFKDIuNjM0MzM5MDM0NTU3MzQyZS0xKSwKKyAgICBTQ0FMRSgzLjQwOTI5MDMxMzcyMDcwM2UtMSksIFNDQUxFKDIuMTc4NjM3OTgxNDE0Nzk1ZS0xKSwKKyAgICBTQ0FMRSg2LjMwNTg3ODYwOTQxODg2OWUtMiksIFNDQUxFKDUuODUyNjg0Mzc4NjIzOTYyZS0zKSwKKyAgICBTQ0FMRSgyLjIxMTg0NzMxMzQ0NjkyNGUtNCksIFNDQUxFKDEuMzM5MjE4NTc5MjMyNjkzZS0yKSwKKyAgICBTQ0FMRSg5Ljc5ODQ1Mzc0ODIyNjE2NmUtMiksIFNDQUxFKDIuNjU5NTQ5NDE1MTExNTQyZS0xKSwKKyAgICBTQ0FMRSgzLjQwNDA4NjUzMDIwODU4OGUtMSksIFNDQUxFKDIuMTUwODIyNzI4ODcyMjk5ZS0xKSwKKyAgICBTQ0FMRSg2LjEzODY0MzYyMjM5ODM3NmUtMiksIFNDQUxFKDUuNTYyMzQ1NDk3MzEwMTYyZS0zKSwKKyAgICBTQ0FMRSgyLjQ2MDIzMTE4OTYxNjAyNGUtNCksIFNDQUxFKDEuMzk2MTA4OTc3NDk2NjI0ZS0yKSwKKyAgICBTQ0FMRSgxLjAwMTgzODY2OTE4MDg3MGUtMSksIFNDQUxFKDIuNjg0NTE2NjA4NzE1MDU4ZS0xKSwKKyAgICBTQ0FMRSgzLjM5ODMxMjkyNjI5MjQyMGUtMSksIFNDQUxFKDIuMTIyOTU5NDk0NTkwNzU5ZS0xKSwKKyAgICBTQ0FMRSg1Ljk3NDI2NTU2MDUwNzc3NGUtMiksIFNDQUxFKDUuMjgzMjg0MDAxMDUyMzgwZS0zKSwKKyAgICBTQ0FMRSgyLjcyNjExNTkyNjYzNDUyMGUtNCksIFNDQUxFKDEuNDU0ODA4NzQ5MjU4NTE4ZS0yKSwKKyAgICBTQ0FMRSgxLjAyNDA4OTA4MzA3NTUyM2UtMSksIFNDQUxFKDIuNzA5MjMxMzc2NjQ3OTQ5ZS0xKSwKKyAgICBTQ0FMRSgzLjM5MTk3MjQ4MjIwNDQzOGUtMSksIFNDQUxFKDIuMDk1MDU4NDExMzU5Nzg3ZS0xKSwKKyAgICBTQ0FMRSg1LjgxMjc0MjE4ODU3Mjg4NGUtMiksIFNDQUxFKDUuMDE1MzExMjk3MDI5MjU3ZS0zKSwKKyAgICBTQ0FMRSgzLjAxMzg2MzE3MDA1MzgxMGUtNCksIFNDQUxFKDEuNTE1MzU1MDU0Mjg5MTAyZS0yKSwKKyAgICBTQ0FMRSgxLjA0NjU5MzI2Mzc0NTMwOGUtMSksIFNDQUxFKDIuNzMzNjgyNjkyMDUwOTM0ZS0xKSwKKyAgICBTQ0FMRSgzLjM4NTA2ODE3ODE3Njg4MGUtMSksIFNDQUxFKDIuMDY3MTI4NzE3ODk5MzIyZS0xKSwKKyAgICBTQ0FMRSg1LjY1NDA2OTQwODc3NDM3NmUtMiksIFNDQUxFKDQuNzU4MDEyMDE1MzcyNTE1ZS0zKSwKKyAgICBTQ0FMRSgzLjMyODM5NTU0MTc1NzM0NWUtNCksIFNDQUxFKDEuNTc3NzgxMTQwODA0MjkxZS0yKSwKKyAgICBTQ0FMRSgxLjA2OTM0NzkzMjkzNDc2MWUtMSksIFNDQUxFKDIuNzU3ODYwNzIwMTU3NjI0ZS0xKSwKKyAgICBTQ0FMRSgzLjM3NzYwMjk5NDQ0MTk4NmUtMSksIFNDQUxFKDIuMDM5MTgwNTQ2OTk4OTc4ZS0xKSwKKyAgICBTQ0FMRSg1LjQ5ODI0MjAwNTcwNTgzM2UtMiksIFNDQUxFKDQuNTExMTU5ODQ0Njk2NTIyZS0zKSwKKyAgICBTQ0FMRSgzLjY1ODk5MTE5MDYwNDg2NmUtNCksIFNDQUxFKDEuNjQyMTIzMDUwOTg3NzIwZS0yKSwKKyAgICBTQ0FMRSgxLjA5MjM0OTM2NTM1MzU4NGUtMSksIFNDQUxFKDIuNzgxNzU1MzI4MTc4NDA2ZS0xKSwKKyAgICBTQ0FMRSgzLjM2OTU4MDIwOTI1NTIxOGUtMSksIFNDQUxFKDIuMDExMjIzMjg2MzkwMzA0ZS0xKSwKKyAgICBTQ0FMRSg1LjM0NTI1MjUyODc4NjY1OWUtMiksIFNDQUxFKDQuMjc0NDE3MTgwNTY3OTgwZS0zKSwKKyAgICBTQ0FMRSg0LjAxODI4MTQ3MDA1Mjg5OGUtNCksIFNDQUxFKDEuNzA4NDEyOTE1NDY4MjE2ZS0yKSwKKyAgICBTQ0FMRSgxLjExNTU5MzY4NjY5OTg2N2UtMSksIFNDQUxFKDIuODA1MzU2OTc5MzcwMTE3ZS0xKSwKKyAgICBTQ0FMRSgzLjM2MTAwNDI5Mjk2NDkzNmUtMSksIFNDQUxFKDEuOTgzMjY2MTc0NzkzMjQ0ZS0xKSwKKyAgICBTQ0FMRSg1LjE5NTA5MzE1NDkwNzIyN2UtMiksIFNDQUxFKDQuMDQ3NDk5MDM4Mjc5MDU2ZS0zKSwKKyAgICBTQ0FMRSg0LjQwMTg3NTQ4NTIwMDQzNWUtNCksIFNDQUxFKDEuNzc2NjkwMjIyMzIyOTQxZS0yKSwKKyAgICBTQ0FMRSgxLjEzOTA3Njk0ODE2NTg5NGUtMSksIFNDQUxFKDIuODI4NjU1ODM4OTY2MzcwZS0xKSwKKyAgICBTQ0FMRSgzLjM1MTg3OTExOTg3MzA0N2UtMSksIFNDQUxFKDEuOTU1MzE5MTk1OTg1Nzk0ZS0xKSwKKyAgICBTQ0FMRSg1LjA0Nzc1MzQ1MzI1NDcwMGUtMiksIFNDQUxFKDMuODMwMDkxMzI5MjkxNDYzZS0zKSwKKyAgICBTQ0FMRSg0LjgxMjc3NjE2OTI3NDAwMmUtNCksIFNDQUxFKDEuODQ2OTgyNzI0OTY0NjE5ZS0yKSwKKyAgICBTQ0FMRSgxLjE2Mjc5NDk3NzQyNjUyOWUtMSksIFNDQUxFKDIuODUxNjQwODgwMTA3ODgwZS0xKSwKKyAgICBTQ0FMRSgzLjM0MjIwNzk2ODIzNTAxNmUtMSksIFNDQUxFKDEuOTI3MzkxMTQxNjUzMDYxZS0xKSwKKyAgICBTQ0FMRSg0LjkwMzIyNDExMDYwMzMzM2UtMiksIFNDQUxFKDMuNjIxOTY3Mjc2NTU4MjgwZS0zKSwKKyAgICBTQ0FMRSg1LjI1MjQ1OTY2ODU1NDM2NmUtNCksIFNDQUxFKDEuOTE5MzMwNDcwMjYzOTU4ZS0yKSwKKyAgICBTQ0FMRSgxLjE4Njc0MzQ1MzE0NTAyN2UtMSksIFNDQUxFKDIuODc0MzAzNDYwMTIxMTU1ZS0xKSwKKyAgICBTQ0FMRSgzLjMzMTk5NjIwMjQ2ODg3MmUtMSksIFNDQUxFKDEuODk5NDkxNjk3NTQ5ODIwZS0xKSwKKyAgICBTQ0FMRSg0Ljc2MTQ5MTcxNTkwODA1MWUtMiksIFNDQUxFKDMuNDIyNzc2OTM1NjIyMDk2ZS0zKSwKKyAgICBTQ0FMRSg1LjcyMTU5MjQ2MDc1ODk4NGUtNCksIFNDQUxFKDEuOTkzNzYyMzI5MjIwNzcyZS0yKSwKKyAgICBTQ0FMRSgxLjIxMDkxNzY4MTQ1NTYxMmUtMSksIFNDQUxFKDIuODk2NjMzNzQ0MjM5ODA3ZS0xKSwKKyAgICBTQ0FMRSgzLjMyMTI0ODU5MDk0NjE5OGUtMSksIFNDQUxFKDEuODcxNjI5NTA2MzQ5NTY0ZS0xKSwKKyAgICBTQ0FMRSg0LjYyMjU0NDM0ODIzOTg5OWUtMiksIFNDQUxFKDMuMjMyMjcyNTc0Njc4MDY0ZS0zKSwKKyAgICBTQ0FMRSg2LjIyMjEzMDAzMjI1NjI0NmUtNCksIFNDQUxFKDIuMDcwMzE2MTEzNTMxNTkwZS0yKSwKKyAgICBTQ0FMRSgxLjIzNTMxMzA0Mjk5ODMxNGUtMSksIFNDQUxFKDIuOTE4NjIxODk3Njk3NDQ4ZS0xKSwKKyAgICBTQ0FMRSgzLjMwOTk2OTYwNDAxNTM1MGUtMSksIFNDQUxFKDEuODQzODEzMzU5NzM3Mzk2ZS0xKSwKKyAgICBTQ0FMRSg0LjQ4NjM2NTYxNjMyMTU2NGUtMiksIFNDQUxFKDMuMDUwMTUyOTEwODczMjk0ZS0zKSwKKyAgICBTQ0FMRSg2Ljc1NTUxNTM1MDk2MDE5NWUtNCksIFNDQUxFKDIuMTQ5MDIxMjUyOTg5NzY5ZS0yKSwKKyAgICBTQ0FMRSgxLjI1OTkyNDQ3MTM3ODMyNmUtMSksIFNDQUxFKDIuOTQwMjU4OTc5Nzk3MzY0ZS0xKSwKKyAgICBTQ0FMRSgzLjI5ODE2NDMwODA3MTEzNmUtMSksIFNDQUxFKDEuODE2MDUyNDk2NDMzMjU4ZS0xKSwKKyAgICBTQ0FMRSg0LjM1Mjk0MjQ4MTYzNzAwMWUtMiksIFNDQUxFKDIuODc2MTkwNDY4NjY4OTM4ZS0zKSwKKyAgICBTQ0FMRSg3LjMyNDE0ODkwMDgwNjkwNGUtNCksIFNDQUxFKDIuMjI5OTEzODgyOTExMjA1ZS0yKSwKKyAgICBTQ0FMRSgxLjI4NDc0NjgyNTY5NTAzOGUtMSksIFNDQUxFKDIuOTYxNTM0ODU3NzQ5OTM5ZS0xKSwKKyAgICBTQ0FMRSgzLjI4NTgzODk2MTYwMTI1OGUtMSksIFNDQUxFKDEuNzg4MzU1NDEwMDk5MDMwZS0xKSwKKyAgICBTQ0FMRSg0LjIyMjI1NTIwMDE0NzYyOWUtMiksIFNDQUxFKDIuNzEwMDkzMjc4NDM3ODUzZS0zKSwKKyAgICBTQ0FMRSg3LjkyODUxNjcxNTc2NDk5OWUtNCksIFNDQUxFKDIuMzEzMDIzODA1NjE4Mjg2ZS0yKSwKKyAgICBTQ0FMRSgxLjMwOTc3NDgxNjAzNjIyNGUtMSksIFNDQUxFKDIuOTgyNDQxMTg2OTA0OTA3ZS0xKSwKKyAgICBTQ0FMRSgzLjI3Mjk5ODkyOTAyMzc0MmUtMSksIFNDQUxFKDEuNzYwNzMwODkyNDE5ODE1ZS0xKSwKKyAgICBTQ0FMRSg0LjA5NDI4ODg3MDY5MjI1M2UtMiksIFNDQUxFKDIuNTUxNTY3MDQyMjQ2NDYxZS0zKSwKKyAgICBTQ0FMRSg4LjU3MDExMDY1ODE4MzY5NGUtNCksIFNDQUxFKDIuMzk4Mzg1NjY2MzEwNzg3ZS0yKSwKKyAgICBTQ0FMRSgxLjMzNTAwMzA3Nzk4Mzg1NmUtMSksIFNDQUxFKDMuMDAyOTY3NTM2NDQ5NDMyZS0xKSwKKyAgICBTQ0FMRSgzLjI1OTY0OTU3NDc1NjYyMmUtMSksIFNDQUxFKDEuNzMzMTg2OTkwMDIyNjU5ZS0xKSwKKyAgICBTQ0FMRSgzLjk2OTAyMzAwNDE3NDIzMmUtMiksIFNDQUxFKDIuNDAwNDMzNDExODIxNzIzZS0zKSwKKyAgICBTQ0FMRSg5LjI1MTE5MjA5NTY4OTQ3NmUtNCksIFNDQUxFKDIuNDg2MDI4NTIyMjUzMDM2ZS0yKSwKKyAgICBTQ0FMRSgxLjM2MDQyNTk0OTA5NjY4MGUtMSksIFNDQUxFKDMuMDIzMTA2NzUzODI2MTQyZS0xKSwKKyAgICBTQ0FMRSgzLjI0NTc5NzE1NzI4NzU5OGUtMSksIFNDQUxFKDEuNzA1NzMyMzQ1NTgxMDU1ZS0xKSwKKyAgICBTQ0FMRSgzLjg0NjQzNzQ4NDAyNTk1NWUtMiksIFNDQUxFKDIuMjU2MzU5NjcyMTczODU4ZS0zKSwKKyAgICBTQ0FMRSg5Ljk3NDc3MDk0NjQyODE4MGUtNCksIFNDQUxFKDIuNTc1OTg2MDg3MzIyMjM1ZS0yKSwKKyAgICBTQ0FMRSgxLjM4NjAzNzYxNzkyMTgyOWUtMSksIFNDQUxFKDMuMDQyODQ5MDA0MjY4NjQ2ZS0xKSwKKyAgICBTQ0FMRSgzLjIzMTQ0ODUzMTE1MDgxOGUtMSksIFNDQUxFKDEuNjc4Mzc1MDA1NzIyMDQ2ZS0xKSwKKyAgICBTQ0FMRSgzLjcyNjUxMTA3NjA5MjcyMGUtMiksIFNDQUxFKDIuMTE5MTUxODc1Mzc2NzAxZS0zKSwKKyAgICBTQ0FMRSgxLjA3MzkzMDI5NjExNTU3N2UtMyksIFNDQUxFKDIuNjY4Mjg2MTE0OTMxMTA2ZS0yKSwKKyAgICBTQ0FMRSgxLjQxMTgzMTk3NDk4MzIxNWUtMSksIFNDQUxFKDMuMDYyMTg1MzQ3MDgwMjMwZS0xKSwKKyAgICBTQ0FMRSgzLjIxNjYwOTY1NjgxMDc2MGUtMSksIFNDQUxFKDEuNjUxMTIyNzE5MDQ5NDU0ZS0xKSwKKyAgICBTQ0FMRSgzLjYwOTIyNDAzNjMzNTk0NWUtMiksIFNDQUxFKDEuOTg4NjA0MTk5MTQxMjY0ZS0zKSwKKyAgICBTQ0FMRSgxLjE1NTAyMzU3OTQ4NTcxNGUtMyksIFNDQUxFKDIuNzYyOTYwODI4ODQwNzMyZS0yKSwKKyAgICBTQ0FMRSgxLjQzNzgwMjYxMjc4MTUyNWUtMSksIFNDQUxFKDMuMDgxMTA4MDMzNjU3MDc0ZS0xKSwKKyAgICBTQ0FMRSgzLjIwMTI4NzM4ODgwMTU3NGUtMSksIFNDQUxFKDEuNjIzOTgzNTMyMTkwMzIzZS0xKSwKKyAgICBTQ0FMRSgzLjQ5NDU1MDY2MDI1MjU3MWUtMiksIFNDQUxFKDEuODY0Mzc3NTI1NjM1MDY0ZS0zKSwKKyAgICBTQ0FMRSgxLjI0MDY3Njg1MTAxMTgxM2UtMyksIFNDQUxFKDIuODYwMDM5Mjg2MzE1NDQxZS0yKSwKKyAgICBTQ0FMRSgxLjQ2Mzk0MzcxOTg2Mzg5MmUtMSksIFNDQUxFKDMuMDk5NjA4MTIzMzAyNDYwZS0xKSwKKyAgICBTQ0FMRSgzLjE4NTQ4ODg3OTY4MDYzNGUtMSksIFNDQUxFKDEuNTk2OTY1MTkzNzQ4NDc0ZS0xKSwKKyAgICBTQ0FMRSgzLjM4MjQ2ODk2ODYyOTgzN2UtMiksIFNDQUxFKDEuNzQ2MzI3NDk5ODU5MDM1ZS0zKSwKKyAgICBTQ0FMRSgxLjMzMTI1ODkxNDQzMzQyMGUtMyksIFNDQUxFKDIuOTU5NTQ5NjEzMjk2OTg2ZS0yKSwKKyAgICBTQ0FMRSgxLjQ5MDI0ODE0MzY3Mjk0M2UtMSksIFNDQUxFKDMuMTE3Njc2OTczMzQyODk2ZS0xKSwKKyAgICBTQ0FMRSgzLjE2OTIyMTI4MjAwNTMxMGUtMSksIFNDQUxFKDEuNTcwMDc1MTU0MzA0NTA0ZS0xKSwKKyAgICBTQ0FMRSgzLjI3Mjk1MzYyOTQ5MzcxNGUtMiksIFNDQUxFKDEuNjM0MjExNTEyMjgyNDkxZS0zKSwKKyAgICBTQ0FMRSgxLjQyNjg5Mzg2ODQ4MzYwM2UtMyksIFNDQUxFKDMuMDYxNTIwNDk0NTIwNjY0ZS0yKSwKKyAgICBTQ0FMRSgxLjUxNjcwOTYyNTcyMDk3OGUtMSksIFNDQUxFKDMuMTM1MzA4MDI3MjY3NDU2ZS0xKSwKKyAgICBTQ0FMRSgzLjE1MjQ5MTc0ODMzMjk3OGUtMSksIFNDQUxFKDEuNTQzMzIwODY0NDM5MDEwZS0xKSwKKyAgICBTQ0FMRSgzLjE2NTk3OTY4MzM5OTIwMGUtMiksIFNDQUxFKDEuNTI3ODI5Nzk0MjEzMTc2ZS0zKSwKK307CisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGNvbnN0IGZsb2F0LCBsZmVfZmlyXzEyOClbXSA9IHsKKyAgICBTQ0FMRSgwLjAwMDUzMTY4NTcxKSwgU0NBTEUoMC4xNTg3ODQ5NTU3NCksIFNDQUxFKDAuNjg2MDM0NDQwOTkpLCBTQ0FMRSgwLjE1NDkyODU2NTAzKSwKKyAgICBTQ0FMRSgwLjAwMDE2MzU4NjkxKSwgU0NBTEUoMC4xNjI2OTczMzAxMiksIFNDQUxFKDAuNjg1OTE4MDMzMTIpLCBTQ0FMRSgwLjE1MTEyODQxMTI5KSwKKyAgICBTQ0FMRSgwLjAwMDE4ODc4NjA5KSwgU0NBTEUoMC4xNjY2NjUzNzUyMyksIFNDQUxFKDAuNjg1Njg1Mzk2MTkpLCBTQ0FMRSgwLjE0NzM4NDc0Nzg2KSwKKyAgICBTQ0FMRSgwLjAwMDIxNjQzMzYzKSwgU0NBTEUoMC4xNzA2ODg3OTMwNiksIFNDQUxFKDAuNjg1MzM2NTMwMjEpLCBTQ0FMRSgwLjE0MzY5NzczODY1KSwKKyAgICBTQ0FMRSgwLjAwMDI0NjY3MzgyKSwgU0NBTEUoMC4xNzQ3NjcxOTYxOCksIFNDQUxFKDAuNjg0ODcxNTU0MzcpLCBTQ0FMRSgwLjE0MDA2NzU0NzU2KSwKKyAgICBTQ0FMRSgwLjAwMDI3OTQ5NjYwKSwgU0NBTEUoMC4xNzg5MDAxODIyNSksIFNDQUxFKDAuNjg0MjkwODI2MzIpLCBTQ0FMRSgwLjEzNjQ5NDMzODUxKSwKKyAgICBTQ0FMRSgwLjAwMDMxNTE5MDk2KSwgU0NBTEUoMC4xODMwODczMTkxNCksIFNDQUxFKDAuNjgzNTk0NTI0ODYpLCBTQ0FMRSgwLjEzMjk3ODE4NjAxKSwKKyAgICBTQ0FMRSgwLjAwMDM1Mzk4Mzc1KSwgU0NBTEUoMC4xODczMjgxMTUxMSksIFNDQUxFKDAuNjgyNzgzMDA3NjIpLCBTQ0FMRSgwLjEyOTUxOTE3OTQ2KSwKKyAgICBTQ0FMRSgwLjAwMDM5NjM0NjkxKSwgU0NBTEUoMC4xOTE2MjIwOTMzMiksIFNDQUxFKDAuNjgxODU2NjkxODQpLCBTQ0FMRSgwLjEyNjExNzMwMzk3KSwKKyAgICBTQ0FMRSgwLjAwMDQ0MjM2ODU5KSwgU0NBTEUoMC4xOTU5Njg2NTc3MyksIFNDQUxFKDAuNjgwODE1ODc1NTMpLCBTQ0FMRSgwLjEyMjc3MjYxMTY4KSwKKyAgICBTQ0FMRSgwLjAwMDQ5MjA0NTI1KSwgU0NBTEUoMC4yMDAzNjczMTY2MCksIFNDQUxFKDAuNjc5NjYxMTU0NzUpLCBTQ0FMRSgwLjExOTQ4NTA1Nzg5KSwKKyAgICBTQ0FMRSgwLjAwMDU0NTIyMjA4KSwgU0NBTEUoMC4yMDQ4MTczODQ0OCksIFNDQUxFKDAuNjc4MzkzMDY1OTMpLCBTQ0FMRSgwLjExNjI1NDYyMDI1KSwKKyAgICBTQ0FMRSgwLjAwMDYwMjc3MTQxKSwgU0NBTEUoMC4yMDkzMTgyMjA2MiksIFNDQUxFKDAuNjc3MDEyMjA1MTIpLCBTQ0FMRSgwLjExMzA4MTE1NzIxKSwKKyAgICBTQ0FMRSgwLjAwMDY2NTY3NzY1KSwgU0NBTEUoMC4yMTM4NjkxNTQ0NSksIFNDQUxFKDAuNjc1NTE5MjI3OTgpLCBTQ0FMRSgwLjEwOTk2NDYwOTE1KSwKKyAgICBTQ0FMRSgwLjAwMDczMTc5Njc4KSwgU0NBTEUoMC4yMTg0Njk0MjYwNCksIFNDQUxFKDAuNjczOTE0NjcwOTQpLCBTQ0FMRSgwLjEwNjkwNDgzNDUxKSwKKyAgICBTQ0FMRSgwLjAwMDgwMzY1NDY2KSwgU0NBTEUoMC4yMjMxMTgyOTAzMSksIFNDQUxFKDAuNjcyMTk5NDg3NjkpLCBTQ0FMRSgwLjEwMzkwMTY0NzAzKSwKKyAgICBTQ0FMRSgwLjAwMDg4MDM3MzIzKSwgU0NBTEUoMC4yMjc4MTQ5Mjc3MCksIFNDQUxFKDAuNjcwMzc0MzkzNDYpLCBTQ0FMRSgwLjEwMDk1NDg2MDQ1KSwKKyAgICBTQ0FMRSgwLjAwMDk2MjU1MzE0KSwgU0NBTEUoMC4yMzI1NTg1MTg2NSksIFNDQUxFKDAuNjY4NDQwMjIyNzQpLCBTQ0FMRSgwLjA5ODA2NDI4MTA1KSwKKyAgICBTQ0FMRSgwLjAwMTA1MDQ4OTg0KSwgU0NBTEUoMC4yMzczNDgyMTM3OSksIFNDQUxFKDAuNjY2Mzk3ODY5NTkpLCBTQ0FMRSgwLjA5NTIyOTYzMzE1KSwKKyAgICBTQ0FMRSgwLjAwMTE0NDMxNjE2KSwgU0NBTEUoMC4yNDIxODMwNDQ1NSksIFNDQUxFKDAuNjY0MjQ4Mjg3NjgpLCBTQ0FMRSgwLjA5MjQ1MDcwODE1KSwKKyAgICBTQ0FMRSgwLjAwMTI0NDQyMzMzKSwgU0NBTEUoMC4yNDcwNjIwNTcyNiksIFNDQUxFKDAuNjYxOTkyNDkwMjkpLCBTQ0FMRSgwLjA4OTcyNzEzMzUxKSwKKyAgICBTQ0FMRSgwLjAwMTM1MTEwMDI4KSwgU0NBTEUoMC4yNTE5ODQzMjgwMyksIFNDQUxFKDAuNjU5NjMxNTUwMzEpLCBTQ0FMRSgwLjA4NzA1ODY3ODI3KSwKKyAgICBTQ0FMRSgwLjAwMTQ2NDgyNjg3KSwgU0NBTEUoMC4yNTY5NDg3OTg4OSksIFNDQUxFKDAuNjU3MTY2NDgxMDIpLCBTQ0FMRSgwLjA4NDQ0NDkzMjY0KSwKKyAgICBTQ0FMRSgwLjAwMTU4NTcwMDA4KSwgU0NBTEUoMC4yNjE5NTQ0MjY3NyksIFNDQUxFKDAuNjU0NTk4MzU1MjkpLCBTQ0FMRSgwLjA4MTg4NTYxMzUwKSwKKyAgICBTQ0FMRSgwLjAwMTcxNDAxODY0KSwgU0NBTEUoMC4yNjcwMDAwNzkxNSksIFNDQUxFKDAuNjUxOTI4NTQ0MDQpLCBTQ0FMRSgwLjA3OTM4MDI5NjE3KSwKKyAgICBTQ0FMRSgwLjAwMTg1MDIzNDY5KSwgU0NBTEUoMC4yNzIwODQ2MjM1OCksIFNDQUxFKDAuNjQ5MTU4MDYwNTUpLCBTQ0FMRSgwLjA3NjkyODU5MzIyKSwKKyAgICBTQ0FMRSgwLjAwMTk5NDk1MDIzKSwgU0NBTEUoMC4yNzcyMDY5Mjc1NCksIFNDQUxFKDAuNjQ2Mjg4MzM1MzIpLCBTQ0FMRSgwLjA3NDUzMDA2NTA2KSwKKyAgICBTQ0FMRSgwLjAwMjE0Nzg1NjQwKSwgU0NBTEUoMC4yODIzNjU3NjkxNSksIFNDQUxFKDAuNjQzMzIwNTYwNDYpLCBTQ0FMRSgwLjA3MjE4NDMyNDI2KSwKKyAgICBTQ0FMRSgwLjAwMjMxMDA0MjUwKSwgU0NBTEUoMC4yODc1NTk5MjY1MSksIFNDQUxFKDAuNjQwMjU2MTY2NDYpLCBTQ0FMRSgwLjA2OTg5MDg2NDE5KSwKKyAgICBTQ0FMRSgwLjAwMjQ4MTM0ODgxKSwgU0NBTEUoMC4yOTI3ODgxMTgxMiksIFNDQUxFKDAuNjM3MDk2NDY0NjMpLCBTQ0FMRSgwLjA2NzY0OTIzNzgxKSwKKyAgICBTQ0FMRSgwLjAwMjY2MjUxMjI0KSwgU0NBTEUoMC4yOTgwNDkwMDI4OSksIFNDQUxFKDAuNjMzODQyOTQ1MTApLCBTQ0FMRSgwLjA2NTQ1ODkzMTAzKSwKKyAgICBTQ0FMRSgwLjAwMjg1Mzc4MTkyKSwgU0NBTEUoMC4zMDMzNDEyNjk0OSksIFNDQUxFKDAuNjMwNDk3MDM4MzYpLCBTQ0FMRSgwLjA2MzMxOTQ1MjExKSwKKyAgICBTQ0FMRSgwLjAwMzA1NTY1MzMwKSwgU0NBTEUoMC4zMDg2NjM1MTcyNCksIFNDQUxFKDAuNjI3MDYwMjk0MTUpLCBTQ0FMRSgwLjA2MTIzMDI3OTUxKSwKKyAgICBTQ0FMRSgwLjAwMzI2ODQxNjUxKSwgU0NBTEUoMC4zMTQwMTQ0MDUwMSksIFNDQUxFKDAuNjIzNTM0MTQyOTcpLCBTQ0FMRSgwLjA1OTE5MDg2OTMzKSwKKyAgICBTQ0FMRSgwLjAwMzQ5MjY0NzU1KSwgU0NBTEUoMC4zMTkzOTIzODMxMCksIFNDQUxFKDAuNjE5OTIwMjUzNzUpLCBTQ0FMRSgwLjA1NzIwMDY3MDI0KSwKKyAgICBTQ0FMRSgwLjAwMzcyODc0NzE0KSwgU0NBTEUoMC4zMjQ3OTYwMjA5OCksIFNDQUxFKDAuNjE2MjIwMjk1NDMpLCBTQ0FMRSgwLjA1NTI1OTEwODU0KSwKKyAgICBTQ0FMRSgwLjAwMzk3NzIwMDQ4KSwgU0NBTEUoMC4zMzAyMjM4Mjg1NSksIFNDQUxFKDAuNjEyNDM1ODE3NzIpLCBTQ0FMRSgwLjA1MzM2NTYxMDU0KSwKKyAgICBTQ0FMRSgwLjAwNDIzODI5NDkwKSwgU0NBTEUoMC4zMzU2NzQyODU4OSksIFNDQUxFKDAuNjA4NTY4NDg5NTUpLCBTQ0FMRSgwLjA1MTUxOTYxMzcxKSwKKyAgICBTQ0FMRSgwLjAwNDUxMjcxMDAzKSwgU0NBTEUoMC4zNDExNDU3NTM4NiksIFNDQUxFKDAuNjA0NjIwMTU4NjcpLCBTQ0FMRSgwLjA0OTcyMDQ2NjE0KSwKKyAgICBTQ0FMRSgwLjAwNDgwMDg1NjU4KSwgU0NBTEUoMC4zNDY2MzY2ODI3NSksIFNDQUxFKDAuNjAwNTkyMzE1MjApLCBTQ0FMRSgwLjA0Nzk2NzYxMjc0KSwKKyAgICBTQ0FMRSgwLjAwNTEwMzEyMjkxKSwgU0NBTEUoMC4zNTIxNDU0NjMyMyksIFNDQUxFKDAuNTk2NDg2OTI2MDgpLCBTQ0FMRSgwLjA0NjI2MDM4Mjk4KSwKKyAgICBTQ0FMRSgwLjAwNTQyMDE3NDkyKSwgU0NBTEUoMC4zNTc2NzAzNjY3NiksIFNDQUxFKDAuNTkyMzA1Nzc5NDYpLCBTQ0FMRSgwLjA0NDU5ODE4NDUzKSwKKyAgICBTQ0FMRSgwLjAwNTc1MjM2OTMwKSwgU0NBTEUoMC4zNjMyMDk3MjQ0MyksIFNDQUxFKDAuNTg4MDUwNTQ0MjYpLCBTQ0FMRSgwLjA0Mjk4MDMzOTM4KSwKKyAgICBTQ0FMRSgwLjAwNjEwMDI5MzI1KSwgU0NBTEUoMC4zNjg3NjE5MjY4OSksIFNDQUxFKDAuNTgzNzIzMTg3NDUpLCBTQ0FMRSgwLjA0MTQwNjIzNjU5KSwKKyAgICBTQ0FMRSgwLjAwNjQ2NDUzMjExKSwgU0NBTEUoMC4zNzQzMjUwOTY2MSksIFNDQUxFKDAuNTc5MzI1NTU2NzYpLCBTQ0FMRSgwLjAzOTg3NTE2MDkwKSwKKyAgICBTQ0FMRSgwLjAwNjg0NTUzOTkwKSwgU0NBTEUoMC4zNzk4OTc1MzQ4NSksIFNDQUxFKDAuNTc0ODU5NDQwMzMpLCBTQ0FMRSgwLjAzODM4NjUyNzQ1KSwKKyAgICBTQ0FMRSgwLjAwNzI0MzkxOTE5KSwgU0NBTEUoMC4zODU0Nzc0NTM0NyksIFNDQUxFKDAuNTcwMzI2OTgzOTMpLCBTQ0FMRSgwLjAzNjkzOTU4MzcyKSwKKyAgICBTQ0FMRSgwLjAwNzY2MDE2NTg5KSwgU0NBTEUoMC4zOTEwNjMwMDQ3MyksIFNDQUxFKDAuNTY1NzI5OTE2MTApLCBTQ0FMRSgwLjAzNTUzMzcyOTk0KSwKKyAgICBTQ0FMRSgwLjAwODA5NDk4MDM4KSwgU0NBTEUoMC4zOTY2NTI0MzAzMCksIFNDQUxFKDAuNTYxMDcwMjYzMzkpLCBTQ0FMRSgwLjAzNDE2ODE5MTI1KSwKKyAgICBTQ0FMRSgwLjAwODU0ODgxNTczKSwgU0NBTEUoMC40MDIyNDM3OTMwMSksIFNDQUxFKDAuNTU2MzQ5OTkyNzUpLCBTQ0FMRSgwLjAzMjg0MjM5Mzk2KSwKKyAgICBTQ0FMRSgwLjAwOTAyMjMwMTA2KSwgU0NBTEUoMC40MDc4MzUyMTUzMyksIFNDQUxFKDAuNTUxNTcxMDExNTQpLCBTQ0FMRSgwLjAzMTU1NTU1MjA0KSwKKyAgICBTQ0FMRSgwLjAwOTUxNjAwNDQ3KSwgU0NBTEUoMC40MTM0MjQ4NzkzMSksIFNDQUxFKDAuNTQ2NzM1MzQ2MzIpLCBTQ0FMRSgwLjAzMDMwNzAzNzc2KSwKKyAgICBTQ0FMRSgwLjAxMDAzMDYwMjEwKSwgU0NBTEUoMC40MTkwMTA3ODgyMCksIFNDQUxFKDAuNTQxODQ1MDgzMjQpLCBTQ0FMRSgwLjAyOTA5NjExMzUyKSwKKyAgICBTQ0FMRSgwLjAxMDU2NjU0NTY1KSwgU0NBTEUoMC40MjQ1OTEwNjQ0NSksIFNDQUxFKDAuNTM2OTAyMjQ4ODYpLCBTQ0FMRSgwLjAyNzkyMjEyMzY3KSwKKyAgICBTQ0FMRSgwLjAxMTEyNDY2NzcxKSwgU0NBTEUoMC40MzAxNjM2MjE5MCksIFNDQUxFKDAuNTMxOTA4ODEwMTQpLCBTQ0FMRSgwLjAyNjc4NDMxMzg0KSwKKyAgICBTQ0FMRSgwLjAxMTcwNTM0NDU0KSwgU0NBTEUoMC40MzU3MjY2NzI0MSksIFNDQUxFKDAuNTI2ODY2NzkzNjMpLCBTQ0FMRSgwLjAyNTY4MjA2NTY0KSwKKyAgICBTQ0FMRSgwLjAxMjMwOTM5OTQzKSwgU0NBTEUoMC40NDEyNzgxMDAwMSksIFNDQUxFKDAuNTIxNzc4Mjg1NTApLCBTQ0FMRSgwLjAyNDYxNDU5NDg4KSwKKyAgICBTQ0FMRSgwLjAxMjkzNzM1NjcyKSwgU0NBTEUoMC40NDY4MTYwMjcxNiksIFNDQUxFKDAuNTE2NjQ1MzcxOTEpLCBTQ0FMRSgwLjAyMzU4MTI1NzA5KSwKKyAgICBTQ0FMRSgwLjAxMzU4OTk1NDk0KSwgU0NBTEUoMC40NTIzMzgzMDgxMCksIFNDQUxFKDAuNTExNDcwMTM5MDMpLCBTQ0FMRSgwLjAyMjU4MTMxNjUzKSwKKyAgICBTQ0FMRSgwLjAxNDI2NzczMzMyKSwgU0NBTEUoMC40NTc4NDI5NDYwNSksIFNDQUxFKDAuNTA2MjU0NTUzNzkpLCBTQ0FMRSgwLjAyMTYxNDEyNTAwKSwKKyAgICBTQ0FMRSgwLjAxNDk3MTQ0NDM4KSwgU0NBTEUoMC40NjMzMjgwMDM4OCksIFNDQUxFKDAuNTAxMDAwNzYxOTkpLCBTQ0FMRSgwLjAyMDY3ODk0Njc1KSwKKyAgICBTQ0FMRSgwLjAxNTcwMTcwMDAwKSwgU0NBTEUoMC40Njg3OTEzNjU2MiksIFNDQUxFKDAuNDk1NzEwODE5OTYpLCBTQ0FMRSgwLjAxOTc3NTA3NzcwKSwKKyAgICBTQ0FMRSgwLjAxNjQ1OTIyNjYxKSwgU0NBTEUoMC40NzQyMzA5NDUxMSksIFNDQUxFKDAuNDkwMzg2NzU0MjcpLCBTQ0FMRSgwLjAxODkwMTg2Nzc5KSwKKyAgICBTQ0FMRSgwLjAxNzI0NDYwNTM1KSwgU0NBTEUoMC40Nzk2NDQ4MDUxOSksIFNDQUxFKDAuNDg1MDMwNzQwNTApLCBTQ0FMRSgwLjAxODA1ODYyNDEyKSwKK307CisjdW5kZWYgU0NBTEUKKworLyoKKyAqIEQuMTEgTG9vay11cCBUYWJsZSBmb3IgRG93bm1peCBTY2FsZSBGYWN0b3JzCisgKgorICogTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB0aGUgZW50cmllcyBpbiBEbWl4VGFibGVbXSBpcyBiZXR3ZWVuIC02MCBkQiBhbmQgMCBkQgorICogd2l0aCBhZGRpdGlvbiBvZiAtaW5mICh8RE1peENvZWZmfCA9IDApLCB3aGljaCBpcyBjb2RlZCB3aXRoIGEgRG1peENvZGUgPSAwLgorICogRnVydGhlcm1vcmUsIHRoZSByYW5nZSBbLTYwIHRvIDBdIGlzIHN1YmRpdmlkZWQgaW50byAzIHJlZ2lvbnMsIGVhY2ggd2l0aCBhCisgKiBkaWZmZXJlbnQgZ3JpZCByZXNvbHV0aW9uOgorICoKKyAqIDEpIFstNjAuMDAwIHRvIC0zMF0gd2l0aCByZXNvbHV0aW9uIG9mIDAuNTAwIGRCCisgKiAyKSBbLTI5Ljc1MCB0byAtMTVdIHdpdGggcmVzb2x1dGlvbiBvZiAwLjI1MCBkQgorICogMykgWy0xNC44NzUgdG8gICAwXSB3aXRoIHJlc29sdXRpb24gb2YgMC4xMjUgZEIKKyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGRjYV9kbWl4dGFibGVbMjQyXSA9IHsKKyAgICAgICAgMCwgICAgMzMsICAgIDM1LCAgICAzNywgICAgMzksICAgIDQxLCAgICA0NCwgICAgNDYsCisgICAgICAgNDksICAgIDUyLCAgICA1NSwgICAgNTgsICAgIDYyLCAgICA2NSwgICAgNjksICAgIDczLAorICAgICAgIDc4LCAgICA4MiwgICAgODcsICAgIDkyLCAgICA5OCwgICAxMDQsICAgMTEwLCAgIDExNiwKKyAgICAgIDEyMywgICAxMzAsICAgMTM4LCAgIDE0NiwgICAxNTUsICAgMTY0LCAgIDE3NCwgICAxODQsCisgICAgICAxOTUsICAgMjA3LCAgIDIxOSwgICAyMzIsICAgMjQ2LCAgIDI2MCwgICAyNzYsICAgMjkyLAorICAgICAgMzA5LCAgIDMyOCwgICAzNDcsICAgMzY4LCAgIDM4OSwgICA0MTMsICAgNDM3LCAgIDQ2MywKKyAgICAgIDQ5MCwgICA1MTksICAgNTUwLCAgIDU4MywgICA2MTcsICAgNjU0LCAgIDY5MywgICA3MzQsCisgICAgICA3NzcsICAgODIzLCAgIDg3MiwgICA5MjQsICAgOTc4LCAgMTAzNiwgIDEwNjYsICAxMDk4LAorICAgICAxMTMwLCAgMTE2MywgIDExOTcsICAxMjMyLCAgMTI2OCwgIDEzMDUsICAxMzQzLCAgMTM4MiwKKyAgICAgMTQyMiwgIDE0NjQsICAxNTA2LCAgMTU1MCwgIDE1OTYsICAxNjQyLCAgMTY5MCwgIDE3NDAsCisgICAgIDE3OTAsICAxODQzLCAgMTg5NiwgIDE5NTIsICAyMDA5LCAgMjA2OCwgIDIxMjgsICAyMTkwLAorICAgICAyMjU0LCAgMjMyMCwgIDIzODgsICAyNDU3LCAgMjUyOSwgIDI2MDMsICAyNjc5LCAgMjc1NywKKyAgICAgMjgzOCwgIDI5MjAsICAzMDA2LCAgMzA5MywgIDMxODQsICAzMjc3LCAgMzM3MiwgIDM0NzEsCisgICAgIDM1NzIsICAzNjc3LCAgMzc4NCwgIDM4OTQsICA0MDA4LCAgNDEyNSwgIDQyNDYsICA0MzcwLAorICAgICA0NDk3LCAgNDYyOSwgIDQ3NjQsICA0OTAzLCAgNTA0NiwgIDUxOTMsICA1MzQ1LCAgNTUwMSwKKyAgICAgNTY2MiwgIDU4MjcsICA1OTEyLCAgNTk5NywgIDYwODQsICA2MTcyLCAgNjI2MiwgIDYzNTMsCisgICAgIDY0NDUsICA2NTM4LCAgNjYzMywgIDY3MjksICA2ODI3LCAgNjkyNSwgIDcwMjYsICA3MTI4LAorICAgICA3MjMxLCAgNzMzNiwgIDc0NDIsICA3NTUwLCAgNzY1OSwgIDc3NzEsICA3ODgzLCAgNzk5NywKKyAgICAgODExMywgIDgyMzEsICA4MzUwLCAgODQ3MSwgIDg1OTQsICA4NzE5LCAgODg0NSwgIDg5NzMsCisgICAgIDkxMDMsICA5MjM1LCAgOTM2OSwgIDk1MDUsICA5NjQzLCAgOTc4MywgIDk5MjQsIDEwMDY4LAorICAgIDEwMjE0LCAxMDM2MiwgMTA1MTIsIDEwNjY1LCAxMDgxOSwgMTA5NzYsIDExMTM1LCAxMTI5NywKKyAgICAxMTQ2MCwgMTE2MjcsIDExNzk1LCAxMTk2NiwgMTIxMzksIDEyMzE1LCAxMjQ5NCwgMTI2NzUsCisgICAgMTI4NTksIDEzMDQ1LCAxMzIzNCwgMTM0MjYsIDEzNjIxLCAxMzgxOCwgMTQwMTgsIDE0MjIyLAorICAgIDE0NDI4LCAxNDYzNywgMTQ4NDksIDE1MDY0LCAxNTI4MywgMTU1MDQsIDE1NzI5LCAxNTk1NywKKyAgICAxNjE4OCwgMTY0MjMsIDE2NjYxLCAxNjkwMiwgMTcxNDcsIDE3Mzk2LCAxNzY0OCwgMTc5MDQsCisgICAgMTgxNjQsIDE4NDI3LCAxODY5NCwgMTg5NjUsIDE5MjQwLCAxOTUxOSwgMTk4MDIsIDIwMDg5LAorICAgIDIwMzgwLCAyMDY3NSwgMjA5NzUsIDIxMjc5LCAyMTU4NywgMjE5MDAsIDIyMjE4LCAyMjU0MCwKKyAgICAyMjg2NywgMjMxNzAsIDIzNTM0LCAyMzg3NSwgMjQyMjEsIDI0NTczLCAyNDkyOSwgMjUyOTAsCisgICAgMjU2NTcsIDI2MDI5LCAyNjQwNiwgMjY3ODksIDI3MTc3LCAyNzU3MSwgMjc5NzAsIDI4Mzc2LAorICAgIDI4Nzg3LCAyOTIwNSwgMjk2MjgsIDMwMDU3LCAzMDQ5MywgMzA5MzUsIDMxMzgzLCAzMTgzOCwKKyAgICAzMjMwMCwgMzI3NjgsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgZGNhX2RlZmF1bHRfY29lZmZzWzEwXVs2XVsyXSA9IHsKKyAgICB7IHsgMC43MDcxMDcsIDAuNzA3MTA3IH0sIHsgMC4wMDAwMDAsIDAuMDAwMDAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIC8vIEEgW0xGRV0KKyAgICB7IHsgMS4wMDAwMDAsIDAuMDAwMDAwIH0sIHsgMC4wMDAwMDAsIDEuMDAwMDAwIH0sIHsgMC4wMDAwMDAsIDAuMDAwMDAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIC8vIEEgKyBCIChkdWFsIG1vbm8pIFtMRkVdCisgICAgeyB7IDEuMDAwMDAwLCAwLjAwMDAwMCB9LCB7IDAuMDAwMDAwLCAxLjAwMDAwMCB9LCB7IDAuMDAwMDAwLCAwLjAwMDAwMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAvLyBMICsgUiAoc3RlcmVvKSBbTEZFXQorICAgIHsgeyAxLjAwMDAwMCwgMC4wMDAwMDAgfSwgeyAwLjAwMDAwMCwgMS4wMDAwMDAgfSwgeyAwLjAwMDAwMCwgMC4wMDAwMDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgLy8gKEwrUikgKyAoTC1SKSAoc3VtLWRpZmZlcmVuY2UpIFtMRkVdCisgICAgeyB7IDEuMDAwMDAwLCAwLjAwMDAwMCB9LCB7IDAuMDAwMDAwLCAxLjAwMDAwMCB9LCB7IDAuMDAwMDAwLCAwLjAwMDAwMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAvLyBMVCArIFJUIChsZWZ0IGFuZCByaWdodCB0b3RhbCkgW0xGRV0KKyAgICB7IHsgMC41MDExODcsIDAuNTAxMTg3IH0sIHsgMC43MDcxMDcsIDAuMDAwMDAwIH0sIHsgMC4wMDAwMDAsIDAuNzA3MTA3IH0sIHsgMC4wMDAwMDAsIDAuMDAwMDAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIC8vIEMgKyBMICsgUiBbTEZFXQorICAgIHsgeyAwLjcwNzEwNywgMC4wMDAwMDAgfSwgeyAwLjAwMDAwMCwgMC43MDcxMDcgfSwgeyAwLjUwMTE4NywgMC41MDExODcgfSwgeyAwLjAwMDAwMCwgMC4wMDAwMDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgLy8gTCArIFIgKyBTIFtMRkVdCisgICAgeyB7IDAuNTAxMTg3LCAwLjUwMTE4NyB9LCB7IDAuNzA3MTA3LCAwLjAwMDAwMCB9LCB7IDAuMDAwMDAwLCAwLjcwNzEwNyB9LCB7IDAuNTAxMTg3LCAwLjUwMTE4NyB9LCB7IDAuMDAwMDAwLCAwLjAwMDAwMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICB9LCAvLyBDICsgTCArIFIgKyBTIFtMRkVdCisgICAgeyB7IDAuNzA3MTA3LCAwLjAwMDAwMCB9LCB7IDAuMDAwMDAwLCAwLjcwNzEwNyB9LCB7IDAuNTAxMTg3LCAwLjAwMDAwMCB9LCB7IDAuMDAwMDAwLCAwLjUwMTE4NyB9LCB7IDAuMDAwMDAwLCAwLjAwMDAwMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICB9LCAvLyBMICsgUiArIFNMICsgU1IgW0xGRV0KKyAgICB7IHsgMC41MDExODcsIDAuNTAxMTg3IH0sIHsgMC43MDcxMDcsIDAuMDAwMDAwIH0sIHsgMC4wMDAwMDAsIDAuNzA3MTA3IH0sIHsgMC41MDExODcsIDAuMDAwMDAwIH0sIHsgMC4wMDAwMDAsIDAuNTAxMTg3IH0sIHsgMC4wMDAwMDAsIDAuMDAwMDAwIH0sIH0sIC8vIEMgKyBMICsgUiArIFNMICsgU1IgW0xGRV0KK307CisKKy8qIGRvd25taXggY29lZmZzCisgKgorICogVEFCTEUgOQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIERvd24tbWl4IGNvZWZmaWNpZW50cyBmb3IgOC1jaGFubmVsIHNvdXJjZQorICogYXVkaW8gKDUgKyAzIGZvcm1hdCkKKyAqIGx0CisgKiBjZW4tIHJ0IGx0IGN0ciBydAorICogbHQgdGVyIGN0ciBjZW50ZXIKKyAqIHJ0IHNyZCBzcmQgc3JkCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogMSAwLjcxIDAuNzQgMS4wIDAuNzEgMC43MSAwLjU4IDAuNTggMC41OAorICogMiBsZWZ0IDEuMCAwLjg5IDAuNzEgMC40NiAwLjcxIDAuNTAKKyAqIHJ0IDAuNDUgMC43MSAwLjg5IDEuMCAwLjUwIDAuNzEKKyAqIDMgbHQgMS4wIDAuODkgMC43MSAwLjQ1CisgKiBydCAwLjQ1IDAuNzEgMC44OSAxLjAKKyAqIHNyZCAwLjcxIDAuNzEgMC43MQorICogNCBsdCAxLjAgMC44OSAwLjcxIDAuNDUKKyAqIHJ0IDAuNDUgMC43MSAwLjg5IDEuMAorICogbHQgc3JkIDEuMCAwLjcxCisgKiBydCBzcmQgMC43MSAwLjcxCisgKiA0IGx0IDEuMCAwLjUKKyAqIGN0ciAwLjg3IDEuMCAwLjg3CisgKiBydCAwLjUgMS4wCisgKiBzcmQgMC43MSAwLjcxIDAuNzEKKyAqIDUgbHQgMS4wIDAuNQorICogY3RyIDAuODcgMS4wIDAuODcKKyAqIHJ0IDAuNSAxLjAKKyAqIGx0IHNyZCAxLjAgMC43MQorICogcnQgc3JkIDAuNzEgMS4wCisgKiA2IGx0IDEuMCAwLjUKKyAqIGx0IGN0ciAwLjg3IDAuNzEKKyAqIHJ0IGN0ciAwLjcxIDAuODcKKyAqIHJ0IDAuNSAxLjAKKyAqIGx0IHNyZCAxLjAgMC43MQorICogcnQgc3JkIDAuNzEgMS4wCisgKiA2IGx0IDEuMCAwLjUKKyAqIGN0ciAwLjg2IDEuMCAwLjg2CisgKiBydCAwLjUgMS4wCisgKiBsdCBzcmQgMS4wCisgKiBjdHIgc3JkIDEuMAorICogcnQgc3JkIDEuMAorICogNyBsdCAxLjAKKyAqIGx0IGN0ciAxLjAKKyAqIGN0ciAxLjAKKyAqIHJ0IGN0ciAxLjAKKyAqIHJ0IDEuMAorICogbHQgc3JkIDEuMCAwLjcxCisgKiBydCBzcmQgMC43MSAxLjAKKyAqIDcgbHQgMS4wIDAuNQorICogbHQgY3RyIDAuODcgMC43MQorICogcnQgY3RyIDAuNzEgMC44NworICogcnQgMC41IDEuMAorICogbHQgc3JkIDEuMAorICogY3RyIHNyZCAxLjAKKyAqIHJ0IHNyZCAxLjAKKyAqIDggbHQgMS4wIDAuNQorICogbHQgY3RyIDAuODcgMC43MQorICogcnQgY3RyIDAuNzEgMC44NworICogcnQgMC41IDEuMAorICogbHQgMSBzcmQgMC44NyAwLjM1CisgKiBsdCAyIHNyZCAwLjUgMC42MQorICogcnQgMiBzcmQgMC42MSAwLjUwCisgKiBydCAyIHNyZCAwLjM1IDAuODcKKyAqCisgKiBHZW5lcmF0aW9uIG9mIEx0IFJ0CisgKgorICogSW4gdGhlIGNhc2Ugd2hlbiB0aGUgcGxheWJhY2sgc3lzdGVtIGhhcyBhbmFsb2cgb3IgZGlnaXRhbCBzdXJyb3VuZAorICogbXVsdGktY2hhbm5lbCBjYXBhYmlsaXR5LCBhIGRvd24gbWF0cml4IGZyb20gNSwgNCwgb3IgMyBjaGFubmVsIHRvCisgKiBMdCBSdCBtYXkgYmUgZGVzaXJhYmxlLiBJbiB0aGUgY2FzZSB3aGVuIHRoZSBudW1iZXIgb2YgZGVjb2RlZCBhdWRpbworICogY2hhbm5lbHMgZXhjZWVkcyA1LCA0IG9yIDMgcmVzcGVjdGl2ZWx5IGEgZmlyc3Qgc3RhZ2UgZG93biBtaXggdG8gNSwKKyAqIDQgb3IgMyBjaHMgc2hvdWxkIGJlIHVzZWQgYXMgZGVzY3JpYmVkIGFib3ZlLgorICoKKyAqIFRoZSBkb3duIG1hdHJpeGluZyBlcXVhdGlvbnMgZm9yIDUtY2hhbm5lbCBzb3VyY2UgYXVkaW8gdG8gYQorICogdHdvLWNoYW5uZWwgTHQgUnQgcGxheWJhY2sgc3lzdGVtIGFyZSBnaXZlbiBieToKKyAqCisgKiBMZWZ0ICA9IGxlZnQgICsgMC43ICogY2VudGVyIC0gMC43ICogKGx0IHN1cnJvdW5kICsgcnQgc3Vycm91bmQpCisgKgorICogUmlnaHQgPSByaWdodCArIDAuNyAqIGNlbnRlciArIDAuNyAqIChsdCBzdXJyb3VuZCArIHJ0IHN1cnJvdW5kKQorICoKKyAqIEVtYmVkZGVkIG1peGluZyB0byAyLWNoYW5uZWwKKyAqCisgKiBPbmUgY29uY2VybiBhcmlzaW5nIGZyb20gdGhlIHByb2xpZmVyYXRpb24gb2YgbXVsdGktY2hhbm5lbCBhdWRpbworICogc3lzdGVtcyBpcyB0aGF0IG1vc3QgaG9tZSBzeXN0ZW1zIHByZXNlbnRseSBoYXZlIG9ubHkgdHdvIGNoYW5uZWwKKyAqIHBsYXliYWNrIGNhcGFiaWxpdHkuIFRvIGFjY29tbW9kYXRlIHRoaXMgYSBmaXhlZCAyLWNoYW5uZWwgZG93bgorICogbWF0cml4IHByb2Nlc3NlcyBpcyBjb21tb25seSB1c2VkIGZvbGxvd2luZyB0aGUgbXVsdGktY2hhbm5lbAorICogZGVjb2Rpbmcgc3RhZ2UuIEhvd2V2ZXIsIGZvciBtdXNpYyBvbmx5IGFwcGxpY2F0aW9ucyB0aGUgaW1hZ2UKKyAqIHF1YWxpdHkgZXRjLiBvZiB0aGUgZG93biBtYXRyaXhlZCBzaWduYWwgbWF5IG5vdCBtYXRjaCB0aGF0IG9mIGFuCisgKiBlcXVpdmFsZW50IHN0ZXJlbyByZWNvcmRpbmcgZm91bmQgb24gQ0QuCisgKgorICogVGhlIGNvbmNlcHQgb2YgZW1iZWRkZWQgbWl4aW5nIGlzIHRvIGFsbG93IHRoZSBwcm9kdWNlciB0bworICogZHluYW1pY2FsbHkgc3BlY2lmeSB0aGUgbWF0cml4aW5nIGNvZWZmaWNpZW50cyB3aXRoaW4gdGhlIGF1ZGlvCisgKiBmcmFtZSBpdHNlbGYuIEluIHRoaXMgd2F5IHRoZSBzdGVyZW8gZG93biBtaXggYXQgdGhlIGRlY29kZXIgbWF5IGJlCisgKiBiZXR0ZXIgbWF0Y2hlZCB0byBhIDItY2hhbm5lbCBwbGF5YmFjayBlbnZpcm9ubWVudC4KKyAqCisgKiBDSFMqMiwgNy1iaXQgZG93biBtaXggaW5kZXhlcyAoTUNPRUZGUykgYXJlIHRyYW5zbWl0dGVkIGFsb25nIHdpdGgKKyAqIHRoZSBtdWx0aS1jaGFubmVsIGF1ZGlvIG9uY2UgaW4gZXZlcnkgZnJhbWUuIFRoZSBpbmRleGVzIGFyZQorICogY29udmVydGVkIHRvIGF0dGVudWF0aW9uIGZhY3RvcnMgdXNpbmcgYSA3IGJpdCBMVVQuIFRoZSAyLWNoIGRvd24KKyAqIG1peCBlcXVhdGlvbnMgYXJlIGFzIGZvbGxvd3MsCisgKgorICogTGVmdCBDaCAgPSBzdW0gKE1DT0VGRltuXSAgICAgICAqIENoW25dKSBmb3Igbj0xLCBDSFMKKyAqCisgKiBSaWdodCBDaCA9IHN1bSAoTUNPRUZGW24gKyBDSFNdICogQ2hbbl0pIGZvciBuPTEsIENIUworICoKKyAqIHdoZXJlIENoKG4pIHJlcHJlc2VudHMgdGhlIHN1YmJhbmQgc2FtcGxlcyBpbiB0aGUgKG4pdGggYXVkaW8gY2hhbm5lbC4KKyAqLworCisjZW5kaWYgLyogQVZDT0RFQ19EQ0FEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RjYWRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGNhZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2ZjY5YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RjYWRlYy5jCkBAIC0wLDAgKzEsMjY3NiBAQAorLyoKKyAqIERDQSBjb21wYXRpYmxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBHaWxkYXMgQmF6aW4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBab3JlcworICogQ29weXJpZ2h0IChDKSAyMDA2IEJlbmphbWluIExhcnNzb24KKyAqIENvcHlyaWdodCAoQykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZGNhLmgiCisjaW5jbHVkZSAiZGNhZGF0YS5oIgorI2luY2x1ZGUgImRjYWRzcC5oIgorI2luY2x1ZGUgImRjYWh1ZmYuaCIKKyNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJmbXRjb252ZXJ0LmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJzeW50aF9maWx0ZXIuaCIKKworI2lmIEFSQ0hfQVJNCisjICAgaW5jbHVkZSAiYXJtL2RjYS5oIgorI2VuZGlmCisKKy8vI2RlZmluZSBUUkFDRQorCisjZGVmaW5lIERDQV9QUklNX0NIQU5ORUxTX01BWCAgKDcpCisjZGVmaW5lIERDQV9BQklUU19NQVggICAgICAgICAoMzIpICAgICAgLyogU2hvdWxkIGJlIDI4ICovCisjZGVmaW5lIERDQV9TVUJTVUJGUkFNRVNfTUFYICAgKDQpCisjZGVmaW5lIERDQV9TVUJGUkFNRVNfTUFYICAgICAoMTYpCisjZGVmaW5lIERDQV9CTE9DS1NfTUFYICAgICAgICAoMTYpCisjZGVmaW5lIERDQV9MRkVfTUFYICAgICAgICAgICAgKDMpCisjZGVmaW5lIERDQV9DSFNFVFNfTUFYICAgICAgICAgKDQpCisjZGVmaW5lIERDQV9DSFNFVF9DSEFOU19NQVggICAgKDgpCisKK2VudW0gRENBTW9kZSB7CisgICAgRENBX01PTk8gPSAwLAorICAgIERDQV9DSEFOTkVMLAorICAgIERDQV9TVEVSRU8sCisgICAgRENBX1NURVJFT19TVU1ESUZGLAorICAgIERDQV9TVEVSRU9fVE9UQUwsCisgICAgRENBXzNGLAorICAgIERDQV8yRjFSLAorICAgIERDQV8zRjFSLAorICAgIERDQV8yRjJSLAorICAgIERDQV8zRjJSLAorICAgIERDQV80RjJSCit9OworCisvKiB0aGVzZSBhcmUgdW5jb25maXJtZWQgYnV0IHNob3VsZCBiZSBtb3N0bHkgY29ycmVjdCAqLworZW51bSBEQ0FFeFNTU3BlYWtlck1hc2sgeworICAgIERDQV9FWFNTX0ZST05UX0NFTlRFUiAgICAgICAgICA9IDB4MDAwMSwKKyAgICBEQ0FfRVhTU19GUk9OVF9MRUZUX1JJR0hUICAgICAgPSAweDAwMDIsCisgICAgRENBX0VYU1NfU0lERV9SRUFSX0xFRlRfUklHSFQgID0gMHgwMDA0LAorICAgIERDQV9FWFNTX0xGRSAgICAgICAgICAgICAgICAgICA9IDB4MDAwOCwKKyAgICBEQ0FfRVhTU19SRUFSX0NFTlRFUiAgICAgICAgICAgPSAweDAwMTAsCisgICAgRENBX0VYU1NfRlJPTlRfSElHSF9MRUZUX1JJR0hUID0gMHgwMDIwLAorICAgIERDQV9FWFNTX1JFQVJfTEVGVF9SSUdIVCAgICAgICA9IDB4MDA0MCwKKyAgICBEQ0FfRVhTU19GUk9OVF9ISUdIX0NFTlRFUiAgICAgPSAweDAwODAsCisgICAgRENBX0VYU1NfT1ZFUkhFQUQgICAgICAgICAgICAgID0gMHgwMTAwLAorICAgIERDQV9FWFNTX0NFTlRFUl9MRUZUX1JJR0hUICAgICA9IDB4MDIwMCwKKyAgICBEQ0FfRVhTU19XSURFX0xFRlRfUklHSFQgICAgICAgPSAweDA0MDAsCisgICAgRENBX0VYU1NfU0lERV9MRUZUX1JJR0hUICAgICAgID0gMHgwODAwLAorICAgIERDQV9FWFNTX0xGRTIgICAgICAgICAgICAgICAgICA9IDB4MTAwMCwKKyAgICBEQ0FfRVhTU19TSURFX0hJR0hfTEVGVF9SSUdIVCAgPSAweDIwMDAsCisgICAgRENBX0VYU1NfUkVBUl9ISUdIX0NFTlRFUiAgICAgID0gMHg0MDAwLAorICAgIERDQV9FWFNTX1JFQVJfSElHSF9MRUZUX1JJR0hUICA9IDB4ODAwMCwKK307CisKK2VudW0gRENBWHhjaFNwZWFrZXJNYXNrIHsKKyAgICBEQ0FfWFhDSF9GUk9OVF9DRU5URVIgICAgICAgICAgPSAweDAwMDAwMDEsCisgICAgRENBX1hYQ0hfRlJPTlRfTEVGVCAgICAgICAgICAgID0gMHgwMDAwMDAyLAorICAgIERDQV9YWENIX0ZST05UX1JJR0hUICAgICAgICAgICA9IDB4MDAwMDAwNCwKKyAgICBEQ0FfWFhDSF9TSURFX1JFQVJfTEVGVCAgICAgICAgPSAweDAwMDAwMDgsCisgICAgRENBX1hYQ0hfU0lERV9SRUFSX1JJR0hUICAgICAgID0gMHgwMDAwMDEwLAorICAgIERDQV9YWENIX0xGRTEgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAyMCwKKyAgICBEQ0FfWFhDSF9SRUFSX0NFTlRFUiAgICAgICAgICAgPSAweDAwMDAwNDAsCisgICAgRENBX1hYQ0hfU1VSUk9VTkRfUkVBUl9MRUZUICAgID0gMHgwMDAwMDgwLAorICAgIERDQV9YWENIX1NVUlJPVU5EX1JFQVJfUklHSFQgICA9IDB4MDAwMDEwMCwKKyAgICBEQ0FfWFhDSF9TSURFX1NVUlJPVU5EX0xFRlQgICAgPSAweDAwMDAyMDAsCisgICAgRENBX1hYQ0hfU0lERV9TVVJST1VORF9SSUdIVCAgID0gMHgwMDAwNDAwLAorICAgIERDQV9YWENIX0ZST05UX0NFTlRFUl9MRUZUICAgICA9IDB4MDAwMDgwMCwKKyAgICBEQ0FfWFhDSF9GUk9OVF9DRU5URVJfUklHSFQgICAgPSAweDAwMDEwMDAsCisgICAgRENBX1hYQ0hfRlJPTlRfSElHSF9MRUZUICAgICAgID0gMHgwMDAyMDAwLAorICAgIERDQV9YWENIX0ZST05UX0hJR0hfQ0VOVEVSICAgICA9IDB4MDAwNDAwMCwKKyAgICBEQ0FfWFhDSF9GUk9OVF9ISUdIX1JJR0hUICAgICAgPSAweDAwMDgwMDAsCisgICAgRENBX1hYQ0hfTEZFMiAgICAgICAgICAgICAgICAgID0gMHgwMDEwMDAwLAorICAgIERDQV9YWENIX1NJREVfRlJPTlRfTEVGVCAgICAgICA9IDB4MDAyMDAwMCwKKyAgICBEQ0FfWFhDSF9TSURFX0ZST05UX1JJR0hUICAgICAgPSAweDAwNDAwMDAsCisgICAgRENBX1hYQ0hfT1ZFUkhFQUQgICAgICAgICAgICAgID0gMHgwMDgwMDAwLAorICAgIERDQV9YWENIX1NJREVfSElHSF9MRUZUICAgICAgICA9IDB4MDEwMDAwMCwKKyAgICBEQ0FfWFhDSF9TSURFX0hJR0hfUklHSFQgICAgICAgPSAweDAyMDAwMDAsCisgICAgRENBX1hYQ0hfUkVBUl9ISUdIX0NFTlRFUiAgICAgID0gMHgwNDAwMDAwLAorICAgIERDQV9YWENIX1JFQVJfSElHSF9MRUZUICAgICAgICA9IDB4MDgwMDAwMCwKKyAgICBEQ0FfWFhDSF9SRUFSX0hJR0hfUklHSFQgICAgICAgPSAweDEwMDAwMDAsCisgICAgRENBX1hYQ0hfUkVBUl9MT1dfQ0VOVEVSICAgICAgID0gMHgyMDAwMDAwLAorICAgIERDQV9YWENIX1JFQVJfTE9XX0xFRlQgICAgICAgICA9IDB4NDAwMDAwMCwKKyAgICBEQ0FfWFhDSF9SRUFSX0xPV19SSUdIVCAgICAgICAgPSAweDgwMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgbWFwX3h4Y2hfdG9fbmF0aXZlWzI4XSA9IHsKKyAgICBBVl9DSF9GUk9OVF9DRU5URVIsCisgICAgQVZfQ0hfRlJPTlRfTEVGVCwKKyAgICBBVl9DSF9GUk9OVF9SSUdIVCwKKyAgICBBVl9DSF9TSURFX0xFRlQsCisgICAgQVZfQ0hfU0lERV9SSUdIVCwKKyAgICBBVl9DSF9MT1dfRlJFUVVFTkNZLAorICAgIEFWX0NIX0JBQ0tfQ0VOVEVSLAorICAgIEFWX0NIX0JBQ0tfTEVGVCwKKyAgICBBVl9DSF9CQUNLX1JJR0hULAorICAgIEFWX0NIX1NJREVfTEVGVCwgICAgICAgICAgIC8qIHNpZGUgc3Vycm91bmQgbGVmdCAtLSBkdXAgc3VyIHNpZGUgTCAqLworICAgIEFWX0NIX1NJREVfUklHSFQsICAgICAgICAgIC8qIHNpZGUgc3Vycm91bmQgcmlnaHQgLS0gZHVwIHN1ciBzaWRlIFIgKi8KKyAgICBBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUiwKKyAgICBBVl9DSF9GUk9OVF9SSUdIVF9PRl9DRU5URVIsCisgICAgQVZfQ0hfVE9QX0ZST05UX0xFRlQsCisgICAgQVZfQ0hfVE9QX0ZST05UX0NFTlRFUiwKKyAgICBBVl9DSF9UT1BfRlJPTlRfUklHSFQsCisgICAgQVZfQ0hfTE9XX0ZSRVFVRU5DWSwgICAgICAgIC8qIGxmZTIgLS0gZHVwbGljYXRlIGxmZTEgcG9zaXRpb24gKi8KKyAgICBBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUiwgLyogc2lkZSBmcm9udCBsZWZ0IC0tIGR1cCBmcm9udCBjbnRyIEwgKi8KKyAgICBBVl9DSF9GUk9OVF9SSUdIVF9PRl9DRU5URVIsLyogc2lkZSBmcm9udCByaWdodCAtLSBkdXAgZnJvbnQgY250ciBSICovCisgICAgQVZfQ0hfVE9QX0NFTlRFUiwgICAgICAgICAgIC8qIG92ZXJoZWFkICovCisgICAgQVZfQ0hfVE9QX0ZST05UX0xFRlQsICAgICAgIC8qIHNpZGUgaGlnaCBsZWZ0IC0tIGR1cCAqLworICAgIEFWX0NIX1RPUF9GUk9OVF9SSUdIVCwgICAgICAvKiBzaWRlIGhpZ2ggcmlnaHQgLS0gZHVwICovCisgICAgQVZfQ0hfVE9QX0JBQ0tfQ0VOVEVSLAorICAgIEFWX0NIX1RPUF9CQUNLX0xFRlQsCisgICAgQVZfQ0hfVE9QX0JBQ0tfUklHSFQsCisgICAgQVZfQ0hfQkFDS19DRU5URVIsICAgICAgICAgIC8qIHJlYXIgbG93IGNlbnRlciAtLSBkdXAgKi8KKyAgICBBVl9DSF9CQUNLX0xFRlQsICAgICAgICAgICAgLyogcmVhciBsb3cgbGVmdCAtLSBkdXAgKi8KKyAgICBBVl9DSF9CQUNLX1JJR0hUICAgICAgICAgICAgLyogcmVhZCBsb3cgcmlnaHQgLS0gZHVwICAqLworfTsKKworZW51bSBEQ0FFeHRlbnNpb25NYXNrIHsKKyAgICBEQ0FfRVhUX0NPUkUgICAgICAgPSAweDAwMSwgLy8vPCBjb3JlIGluIGNvcmUgc3Vic3RyZWFtCisgICAgRENBX0VYVF9YWENIICAgICAgID0gMHgwMDIsIC8vLzwgWFhDaCBjaGFubmVscyBleHRlbnNpb24gaW4gY29yZSBzdWJzdHJlYW0KKyAgICBEQ0FfRVhUX1g5NiAgICAgICAgPSAweDAwNCwgLy8vPCA5Ni8yNCBleHRlbnNpb24gaW4gY29yZSBzdWJzdHJlYW0KKyAgICBEQ0FfRVhUX1hDSCAgICAgICAgPSAweDAwOCwgLy8vPCBYQ2ggY2hhbm5lbCBleHRlbnNpb24gaW4gY29yZSBzdWJzdHJlYW0KKyAgICBEQ0FfRVhUX0VYU1NfQ09SRSAgPSAweDAxMCwgLy8vPCBjb3JlIGluIEV4U1MgKGV4dGVuc2lvbiBzdWJzdHJlYW0pCisgICAgRENBX0VYVF9FWFNTX1hCUiAgID0gMHgwMjAsIC8vLzwgZXh0ZW5kZWQgYml0cmF0ZSBleHRlbnNpb24gaW4gRXhTUworICAgIERDQV9FWFRfRVhTU19YWENIICA9IDB4MDQwLCAvLy88IFhYQ2ggY2hhbm5lbHMgZXh0ZW5zaW9uIGluIEV4U1MKKyAgICBEQ0FfRVhUX0VYU1NfWDk2ICAgPSAweDA4MCwgLy8vPCA5Ni8yNCBleHRlbnNpb24gaW4gRXhTUworICAgIERDQV9FWFRfRVhTU19MQlIgICA9IDB4MTAwLCAvLy88IGxvdyBiaXRyYXRlIGNvbXBvbmVudCBpbiBFeFNTCisgICAgRENBX0VYVF9FWFNTX1hMTCAgID0gMHgyMDAsIC8vLzwgbG9zc2xlc3MgZXh0ZW5zaW9uIGluIEV4U1MKK307CisKKy8qIC0xIGFyZSByZXNlcnZlZCBvciB1bmtub3duICovCitzdGF0aWMgY29uc3QgaW50IGRjYV9leHRfYXVkaW9fZGVzY3JfbWFza1tdID0geworICAgIERDQV9FWFRfWENILAorICAgIC0xLAorICAgIERDQV9FWFRfWDk2LAorICAgIERDQV9FWFRfWENIIHwgRENBX0VYVF9YOTYsCisgICAgLTEsCisgICAgLTEsCisgICAgRENBX0VYVF9YWENILAorICAgIC0xLAorfTsKKworLyogZXh0ZW5zaW9ucyB0aGF0IHJlc2lkZSBpbiBjb3JlIHN1YnN0cmVhbSAqLworI2RlZmluZSBEQ0FfQ09SRV9FWFRTIChEQ0FfRVhUX1hDSCB8IERDQV9FWFRfWFhDSCB8IERDQV9FWFRfWDk2KQorCisvKiBUYWJsZXMgZm9yIG1hcHBpbmcgZHRzIGNoYW5uZWwgY29uZmlndXJhdGlvbnMgdG8gbGliYXZjb2RlYyBtdWx0aWNoYW5uZWwgYXBpLgorICogU29tZSBjb21wcm9taXNlcyBoYXZlIGJlZW4gbWFkZSBmb3Igc3BlY2lhbCBjb25maWd1cmF0aW9ucy4gTW9zdCBjb25maWd1cmF0aW9ucworICogYXJlIG5ldmVyIHVzZWQgc28gY29tcGxldGUgYWNjdXJhY3kgaXMgbm90IG5lZWRlZC4KKyAqCisgKiBMID0gbGVmdCwgUiA9IHJpZ2h0LCBDID0gY2VudGVyLCBTID0gc3Vycm91bmQsIEYgPSBmcm9udCwgUiA9IHJlYXIsIFQgPSB0b3RhbCwgT1YgPSBvdmVyaGVhZC4KKyAqIFMgIC0+IHNpZGUsIHdoZW4gYm90aCByZWFyIGFuZCBiYWNrIGFyZSBjb25maWd1cmVkIG1vdmUgb25lIG9mIHRoZW0gdG8gdGhlIHNpZGUgY2hhbm5lbAorICogT1YgLT4gY2VudGVyIGJhY2sKKyAqIEFsbCAyIGNoYW5uZWwgY29uZmlndXJhdGlvbnMgLT4gQVZfQ0hfTEFZT1VUX1NURVJFTworICovCitzdGF0aWMgY29uc3QgdWludDY0X3QgZGNhX2NvcmVfY2hhbm5lbF9sYXlvdXRbXSA9IHsKKyAgICBBVl9DSF9GUk9OVF9DRU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IDEsIEEKKyAgICBBVl9DSF9MQVlPVVRfU1RFUkVPLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IDIsIEEgKyBCIChkdWFsIG1vbm8pCisgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCAyLCBMICsgUiAoc3RlcmVvKQorICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMiwgKEwgKyBSKSArIChMIC0gUikgKHN1bS1kaWZmZXJlbmNlKQorICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMiwgTFQgKyBSVCAobGVmdCBhbmQgcmlnaHQgdG90YWwpCisgICAgQVZfQ0hfTEFZT1VUX1NURVJFTyB8IEFWX0NIX0ZST05UX0NFTlRFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCAzLCBDICsgTCArIFIKKyAgICBBVl9DSF9MQVlPVVRfU1RFUkVPIHwgQVZfQ0hfQkFDS19DRU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IDMsIEwgKyBSICsgUworICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8gfCBBVl9DSF9GUk9OVF9DRU5URVIgfCBBVl9DSF9CQUNLX0NFTlRFUiwgICAgICAgICAgIC8vLzwgNCwgQyArIEwgKyBSICsgUworICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8gfCBBVl9DSF9TSURFX0xFRlQgfCBBVl9DSF9TSURFX1JJR0hULCAgICAgICAgICAgICAgIC8vLzwgNCwgTCArIFIgKyBTTCArIFNSCisKKyAgICBBVl9DSF9MQVlPVVRfU1RFUkVPIHwgQVZfQ0hfRlJPTlRfQ0VOVEVSIHwgQVZfQ0hfU0lERV9MRUZUIHwKKyAgICBBVl9DSF9TSURFX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IDUsIEMgKyBMICsgUiArIFNMICsgU1IKKworICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8gfCBBVl9DSF9TSURFX0xFRlQgfCBBVl9DSF9TSURFX1JJR0hUIHwKKyAgICBBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8IEFWX0NIX0ZST05UX1JJR0hUX09GX0NFTlRFUiwgICAgICAgICAgICAgICAvLy88IDYsIENMICsgQ1IgKyBMICsgUiArIFNMICsgU1IKKworICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8gfCBBVl9DSF9CQUNLX0xFRlQgfCBBVl9DSF9CQUNLX1JJR0hUIHwKKyAgICBBVl9DSF9GUk9OVF9DRU5URVIgIHwgQVZfQ0hfQkFDS19DRU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IDYsIEMgKyBMICsgUiArIExSICsgUlIgKyBPVgorCisgICAgQVZfQ0hfRlJPTlRfQ0VOVEVSIHwgQVZfQ0hfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSIHwKKyAgICBBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8IEFWX0NIX0JBQ0tfQ0VOVEVSICAgfAorICAgIEFWX0NIX0JBQ0tfTEVGVCB8IEFWX0NIX0JBQ0tfUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgNiwgQ0YgKyBDUiArIExGICsgUkYgKyBMUiArIFJSCisKKyAgICBBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8IEFWX0NIX0ZST05UX0NFTlRFUiAgIHwKKyAgICBBVl9DSF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgfCBBVl9DSF9MQVlPVVRfU1RFUkVPIHwKKyAgICBBVl9DSF9TSURFX0xFRlQgfCBBVl9DSF9TSURFX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IDcsIENMICsgQyArIENSICsgTCArIFIgKyBTTCArIFNSCisKKyAgICBBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8IEFWX0NIX0ZST05UX1JJR0hUX09GX0NFTlRFUiB8CisgICAgQVZfQ0hfTEFZT1VUX1NURVJFTyB8IEFWX0NIX1NJREVfTEVGVCB8IEFWX0NIX1NJREVfUklHSFQgfAorICAgIEFWX0NIX0JBQ0tfTEVGVCB8IEFWX0NIX0JBQ0tfUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgOCwgQ0wgKyBDUiArIEwgKyBSICsgU0wxICsgU0wyICsgU1IxICsgU1IyCisKKyAgICBBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8IEFWX0NIX0ZST05UX0NFTlRFUiAgIHwKKyAgICBBVl9DSF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgfCBBVl9DSF9MQVlPVVRfU1RFUkVPIHwKKyAgICBBVl9DSF9TSURFX0xFRlQgfCBBVl9DSF9CQUNLX0NFTlRFUiB8IEFWX0NIX1NJREVfUklHSFQsICAgICAgICAgICAgICAgICAvLy88IDgsIENMICsgQyArIENSICsgTCArIFIgKyBTTCArIFMgKyBTUgorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBkY2FfbGZlX2luZGV4W10gPSB7CisgICAgMSwgMiwgMiwgMiwgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMSwgMywgMiwgMworfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBkY2FfY2hhbm5lbF9yZW9yZGVyX2xmZVtdWzldID0geworICAgIHsgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDIsICAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsICAzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAyLCAgMCwgIDEsICA0LCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAgMywgIDQsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMiwgIDAsICAxLCAgNCwgIDUsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAzLCAgNCwgIDAsICAxLCAgNSwgIDYsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDIsICAwLCAgMSwgIDQsICA1LCAgNiwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDYsICA0LCAgNSwgIDIsICAzLCAtMSwgLTEsIC0xIH0sCisgICAgeyA0LCAgMiwgIDUsICAwLCAgMSwgIDYsICA3LCAtMSwgLTEgfSwKKyAgICB7IDUsICA2LCAgMCwgIDEsICA3LCAgMywgIDgsICA0LCAtMSB9LAorICAgIHsgNCwgIDIsICA1LCAgMCwgIDEsICA2LCAgOCwgIDcsIC0xIH0sCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGRjYV9jaGFubmVsX3Jlb3JkZXJfbGZlX3hjaFtdWzldID0geworICAgIHsgMCwgIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgIDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAgMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsICAzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgIDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDIsICAwLCAgMSwgIDQsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsICAzLCAgNCwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAyLCAgMCwgIDEsICA0LCAgNSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAgNCwgIDUsICAzLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMiwgIDAsICAxLCAgNSwgIDYsICA0LCAtMSwgLTEsIC0xIH0sCisgICAgeyAzLCAgNCwgIDAsICAxLCAgNiwgIDcsICA1LCAtMSwgLTEgfSwKKyAgICB7IDIsICAwLCAgMSwgIDQsICA1LCAgNiwgIDcsIC0xLCAtMSB9LAorICAgIHsgMCwgIDYsICA0LCAgNSwgIDIsICAzLCAgNywgLTEsIC0xIH0sCisgICAgeyA0LCAgMiwgIDUsICAwLCAgMSwgIDcsICA4LCAgNiwgLTEgfSwKKyAgICB7IDUsICA2LCAgMCwgIDEsICA4LCAgMywgIDksICA0LCAgNyB9LAorICAgIHsgNCwgIDIsICA1LCAgMCwgIDEsICA2LCAgOSwgIDgsICA3IH0sCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGRjYV9jaGFubmVsX3Jlb3JkZXJfbm9sZmVbXVs5XSA9IHsKKyAgICB7IDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAyLCAgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMiwgIDAsICAxLCAgMywgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgIDIsICAzLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDIsICAwLCAgMSwgIDMsICA0LCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMiwgIDMsICAwLCAgMSwgIDQsICA1LCAtMSwgLTEsIC0xIH0sCisgICAgeyAyLCAgMCwgIDEsICAzLCAgNCwgIDUsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICA1LCAgMywgIDQsICAxLCAgMiwgLTEsIC0xLCAtMSB9LAorICAgIHsgMywgIDIsICA0LCAgMCwgIDEsICA1LCAgNiwgLTEsIC0xIH0sCisgICAgeyA0LCAgNSwgIDAsICAxLCAgNiwgIDIsICA3LCAgMywgLTEgfSwKKyAgICB7IDMsICAyLCAgNCwgIDAsICAxLCAgNSwgIDcsICA2LCAtMSB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBkY2FfY2hhbm5lbF9yZW9yZGVyX25vbGZlX3hjaFtdWzldID0geworICAgIHsgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsICAyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDIsICAwLCAgMSwgIDMsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsICAyLCAgMywgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAyLCAgMCwgIDEsICAzLCAgNCwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAgMywgIDQsICAyLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMiwgIDAsICAxLCAgNCwgIDUsICAzLCAtMSwgLTEsIC0xIH0sCisgICAgeyAyLCAgMywgIDAsICAxLCAgNSwgIDYsICA0LCAtMSwgLTEgfSwKKyAgICB7IDIsICAwLCAgMSwgIDMsICA0LCAgNSwgIDYsIC0xLCAtMSB9LAorICAgIHsgMCwgIDUsICAzLCAgNCwgIDEsICAyLCAgNiwgLTEsIC0xIH0sCisgICAgeyAzLCAgMiwgIDQsICAwLCAgMSwgIDYsICA3LCAgNSwgLTEgfSwKKyAgICB7IDQsICA1LCAgMCwgIDEsICA3LCAgMiwgIDgsICAzLCAgNiB9LAorICAgIHsgMywgIDIsICA0LCAgMCwgIDEsICA1LCAgOCwgIDcsICA2IH0sCit9OworCisjZGVmaW5lIERDQV9ET0xCWSAgICAgICAgICAgICAgICAgIDEwMSAgICAgICAgICAgLyogRklYTUUgKi8KKworI2RlZmluZSBEQ0FfQ0hBTk5FTF9CSVRTICAgICAgICAgICAgIDYKKyNkZWZpbmUgRENBX0NIQU5ORUxfTUFTSyAgICAgICAgICAweDNGCisKKyNkZWZpbmUgRENBX0xGRSAgICAgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgSEVBREVSX1NJWkUgICAgICAgICAgICAgICAgIDE0CisKKyNkZWZpbmUgRENBX01BWF9GUkFNRV9TSVpFICAgICAgIDE2Mzg0CisjZGVmaW5lIERDQV9NQVhfRVhTU19IRUFERVJfU0laRSAgNDA5NgorCisjZGVmaW5lIERDQV9CVUZGRVJfUEFERElOR19TSVpFICAgMTAyNAorCisjZGVmaW5lIERDQV9OU1lOQ0FVWCAgICAgICAgMHg5QTExMDVBMAorCisvKiogQml0IGFsbG9jYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgb2Zmc2V0OyAgICAgICAgICAgICAgICAgLy8vPCBjb2RlIHZhbHVlcyBvZmZzZXQKKyAgICBpbnQgbWF4Yml0c1s4XTsgICAgICAgICAgICAgLy8vPCBtYXggYml0cyBpbiBWTEMKKyAgICBpbnQgd3JhcDsgICAgICAgICAgICAgICAgICAgLy8vPCB3cmFwIGZvciBnZXRfdmxjMigpCisgICAgVkxDIHZsY1s4XTsgICAgICAgICAgICAgICAgIC8vLzwgYWN0dWFsIGNvZGVzCit9IEJpdEFsbG9jOworCitzdGF0aWMgQml0QWxsb2MgZGNhX2JpdGFsbG9jX2luZGV4OyAgICAvLy88IGluZGV4ZXMgZm9yIHNhbXBsZXMgVkxDIHNlbGVjdAorc3RhdGljIEJpdEFsbG9jIGRjYV90bW9kZTsgICAgICAgICAgICAgLy8vPCB0cmFuc2l0aW9uIG1vZGUgVkxDcworc3RhdGljIEJpdEFsbG9jIGRjYV9zY2FsZWZhY3RvcjsgICAgICAgLy8vPCBzY2FsZWZhY3RvciBWTENzCitzdGF0aWMgQml0QWxsb2MgZGNhX3NtcGxfYml0YWxsb2NbMTFdOyAvLy88IHNhbXBsZXMgVkxDcworCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X2JpdGFsbG9jKEdldEJpdENvbnRleHQgKmdiLCBCaXRBbGxvYyAqYmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHgpCit7CisgICAgcmV0dXJuIGdldF92bGMyKGdiLCBiYS0+dmxjW2lkeF0udGFibGUsIGJhLT52bGNbaWR4XS5iaXRzLCBiYS0+d3JhcCkgKworICAgICAgICAgICBiYS0+b2Zmc2V0OworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7ICAgICAgIC8vLzwgY2xhc3MgZm9yIEFWT3B0aW9ucworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICAvKiBGcmFtZSBoZWFkZXIgKi8KKyAgICBpbnQgZnJhbWVfdHlwZTsgICAgICAgICAgICAgLy8vPCB0eXBlIG9mIHRoZSBjdXJyZW50IGZyYW1lCisgICAgaW50IHNhbXBsZXNfZGVmaWNpdDsgICAgICAgIC8vLzwgZGVmaWNpdCBzYW1wbGUgY291bnQKKyAgICBpbnQgY3JjX3ByZXNlbnQ7ICAgICAgICAgICAgLy8vPCBjcmMgaXMgcHJlc2VudCBpbiB0aGUgYml0c3RyZWFtCisgICAgaW50IHNhbXBsZV9ibG9ja3M7ICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIFBDTSBzYW1wbGUgYmxvY2tzCisgICAgaW50IGZyYW1lX3NpemU7ICAgICAgICAgICAgIC8vLzwgcHJpbWFyeSBmcmFtZSBieXRlIHNpemUKKyAgICBpbnQgYW1vZGU7ICAgICAgICAgICAgICAgICAgLy8vPCBhdWRpbyBjaGFubmVscyBhcnJhbmdlbWVudAorICAgIGludCBzYW1wbGVfcmF0ZTsgICAgICAgICAgICAvLy88IGF1ZGlvIHNhbXBsaW5nIHJhdGUKKyAgICBpbnQgYml0X3JhdGU7ICAgICAgICAgICAgICAgLy8vPCB0cmFuc21pc3Npb24gYml0IHJhdGUKKyAgICBpbnQgYml0X3JhdGVfaW5kZXg7ICAgICAgICAgLy8vPCB0cmFuc21pc3Npb24gYml0IHJhdGUgaW5kZXgKKworICAgIGludCBkeW5yYW5nZTsgICAgICAgICAgICAgICAvLy88IGVtYmVkZGVkIGR5bmFtaWMgcmFuZ2UgZmxhZworICAgIGludCB0aW1lc3RhbXA7ICAgICAgICAgICAgICAvLy88IGVtYmVkZGVkIHRpbWUgc3RhbXAgZmxhZworICAgIGludCBhdXhfZGF0YTsgICAgICAgICAgICAgICAvLy88IGF1eGlsaWFyeSBkYXRhIGZsYWcKKyAgICBpbnQgaGRjZDsgICAgICAgICAgICAgICAgICAgLy8vPCBzb3VyY2UgbWF0ZXJpYWwgaXMgbWFzdGVyZWQgaW4gSERDRAorICAgIGludCBleHRfZGVzY3I7ICAgICAgICAgICAgICAvLy88IGV4dGVuc2lvbiBhdWRpbyBkZXNjcmlwdG9yIGZsYWcKKyAgICBpbnQgZXh0X2NvZGluZzsgICAgICAgICAgICAgLy8vPCBleHRlbmRlZCBjb2RpbmcgZmxhZworICAgIGludCBhc3BmOyAgICAgICAgICAgICAgICAgICAvLy88IGF1ZGlvIHN5bmMgd29yZCBpbnNlcnRpb24gZmxhZworICAgIGludCBsZmU7ICAgICAgICAgICAgICAgICAgICAvLy88IGxvdyBmcmVxdWVuY3kgZWZmZWN0cyBmbGFnCisgICAgaW50IHByZWRpY3Rvcl9oaXN0b3J5OyAgICAgIC8vLzwgcHJlZGljdG9yIGhpc3RvcnkgZmxhZworICAgIGludCBoZWFkZXJfY3JjOyAgICAgICAgICAgICAvLy88IGhlYWRlciBjcmMgY2hlY2sgYnl0ZXMKKyAgICBpbnQgbXVsdGlyYXRlX2ludGVyOyAgICAgICAgLy8vPCBtdWx0aXJhdGUgaW50ZXJwb2xhdG9yIHN3aXRjaAorICAgIGludCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAvLy88IGVuY29kZXIgc29mdHdhcmUgcmV2aXNpb24KKyAgICBpbnQgY29weV9oaXN0b3J5OyAgICAgICAgICAgLy8vPCBjb3B5IGhpc3RvcnkKKyAgICBpbnQgc291cmNlX3BjbV9yZXM7ICAgICAgICAgLy8vPCBzb3VyY2UgcGNtIHJlc29sdXRpb24KKyAgICBpbnQgZnJvbnRfc3VtOyAgICAgICAgICAgICAgLy8vPCBmcm9udCBzdW0vZGlmZmVyZW5jZSBmbGFnCisgICAgaW50IHN1cnJvdW5kX3N1bTsgICAgICAgICAgIC8vLzwgc3Vycm91bmQgc3VtL2RpZmZlcmVuY2UgZmxhZworICAgIGludCBkaWFsb2dfbm9ybTsgICAgICAgICAgICAvLy88IGRpYWxvZyBub3JtYWxpc2F0aW9uIHBhcmFtZXRlcgorCisgICAgLyogUHJpbWFyeSBhdWRpbyBjb2RpbmcgaGVhZGVyICovCisgICAgaW50IHN1YmZyYW1lczsgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHN1YmZyYW1lcworICAgIGludCB0b3RhbF9jaGFubmVsczsgICAgICAgICAvLy88IG51bWJlciBvZiBjaGFubmVscyBpbmNsdWRpbmcgZXh0ZW5zaW9ucworICAgIGludCBwcmltX2NoYW5uZWxzOyAgICAgICAgICAvLy88IG51bWJlciBvZiBwcmltYXJ5IGF1ZGlvIGNoYW5uZWxzCisgICAgaW50IHN1YmJhbmRfYWN0aXZpdHlbRENBX1BSSU1fQ0hBTk5FTFNfTUFYXTsgICAgLy8vPCBzdWJiYW5kIGFjdGl2aXR5IGNvdW50CisgICAgaW50IHZxX3N0YXJ0X3N1YmJhbmRbRENBX1BSSU1fQ0hBTk5FTFNfTUFYXTsgICAgLy8vPCBoaWdoIGZyZXF1ZW5jeSB2cSBzdGFydCBzdWJiYW5kCisgICAgaW50IGpvaW50X2ludGVuc2l0eVtEQ0FfUFJJTV9DSEFOTkVMU19NQVhdOyAgICAgLy8vPCBqb2ludCBpbnRlbnNpdHkgY29kaW5nIGluZGV4CisgICAgaW50IHRyYW5zaWVudF9odWZmbWFuW0RDQV9QUklNX0NIQU5ORUxTX01BWF07ICAgLy8vPCB0cmFuc2llbnQgbW9kZSBjb2RlIGJvb2sKKyAgICBpbnQgc2NhbGVmYWN0b3JfaHVmZm1hbltEQ0FfUFJJTV9DSEFOTkVMU19NQVhdOyAvLy88IHNjYWxlIGZhY3RvciBjb2RlIGJvb2sKKyAgICBpbnQgYml0YWxsb2NfaHVmZm1hbltEQ0FfUFJJTV9DSEFOTkVMU19NQVhdOyAgICAvLy88IGJpdCBhbGxvY2F0aW9uIHF1YW50aXplciBzZWxlY3QKKyAgICBpbnQgcXVhbnRfaW5kZXhfaHVmZm1hbltEQ0FfUFJJTV9DSEFOTkVMU19NQVhdW0RDQV9BQklUU19NQVhdOyAvLy88IHF1YW50aXphdGlvbiBpbmRleCBjb2RlYm9vayBzZWxlY3QKKyAgICBmbG9hdCBzY2FsZWZhY3Rvcl9hZGpbRENBX1BSSU1fQ0hBTk5FTFNfTUFYXVtEQ0FfQUJJVFNfTUFYXTsgICAvLy88IHNjYWxlIGZhY3RvciBhZGp1c3RtZW50CisKKyAgICAvKiBQcmltYXJ5IGF1ZGlvIGNvZGluZyBzaWRlIGluZm9ybWF0aW9uICovCisgICAgaW50IHN1YnN1YmZyYW1lc1tEQ0FfU1VCRlJBTUVTX01BWF07ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHN1YnN1YmZyYW1lcworICAgIGludCBwYXJ0aWFsX3NhbXBsZXNbRENBX1NVQkZSQU1FU19NQVhdOyAgICAgICAgICAgICAgICAgICAgICAvLy88IHBhcnRpYWwgc3Vic3ViZnJhbWUgc2FtcGxlcyBjb3VudAorICAgIGludCBwcmVkaWN0aW9uX21vZGVbRENBX1BSSU1fQ0hBTk5FTFNfTUFYXVtEQ0FfU1VCQkFORFNdOyAgICAvLy88IHByZWRpY3Rpb24gbW9kZSAoQURQQ00gdXNlZCBvciBub3QpCisgICAgaW50IHByZWRpY3Rpb25fdnFbRENBX1BSSU1fQ0hBTk5FTFNfTUFYXVtEQ0FfU1VCQkFORFNdOyAgICAgIC8vLzwgcHJlZGljdGlvbiBWUSBjb2VmcworICAgIGludCBiaXRhbGxvY1tEQ0FfUFJJTV9DSEFOTkVMU19NQVhdW0RDQV9TVUJCQU5EU107ICAgICAgICAgICAvLy88IGJpdCBhbGxvY2F0aW9uIGluZGV4CisgICAgaW50IHRyYW5zaXRpb25fbW9kZVtEQ0FfUFJJTV9DSEFOTkVMU19NQVhdW0RDQV9TVUJCQU5EU107ICAgIC8vLzwgdHJhbnNpdGlvbiBtb2RlICh0cmFuc2llbnRzKQorICAgIGludDMyX3Qgc2NhbGVfZmFjdG9yW0RDQV9QUklNX0NIQU5ORUxTX01BWF1bRENBX1NVQkJBTkRTXVsyXTsvLy88IHNjYWxlIGZhY3RvcnMgKDIgaWYgdHJhbnNpZW50KQorICAgIGludCBqb2ludF9odWZmW0RDQV9QUklNX0NIQU5ORUxTX01BWF07ICAgICAgICAgICAgICAgICAgICAgICAvLy88IGpvaW50IHN1YmJhbmQgc2NhbGUgZmFjdG9ycyBjb2RlYm9vaworICAgIGludCBqb2ludF9zY2FsZV9mYWN0b3JbRENBX1BSSU1fQ0hBTk5FTFNfTUFYXVtEQ0FfU1VCQkFORFNdOyAvLy88IGpvaW50IHN1YmJhbmQgc2NhbGUgZmFjdG9ycworICAgIGZsb2F0IGRvd25taXhfY29lZltEQ0FfUFJJTV9DSEFOTkVMU19NQVggKyAxXVsyXTsgICAgICAgICAgICAvLy88IHN0ZXJlbyBkb3dubWl4IGNvZWZmaWNpZW50cworICAgIGludCBkeW5yYW5nZV9jb2VmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGR5bmFtaWMgcmFuZ2UgY29lZmZpY2llbnQKKworICAgIC8qIENvcmUgc3Vic3RyZWFtJ3MgZW1iZWRkZWQgZG93bm1peCBjb2VmZmljaWVudHMgKGNmLiBFVFNJIFRTIDEwMiAxMTQgVjEuNC4xKQorICAgICAqIElucHV0OiAgcHJpbWFyeSBhdWRpbyBjaGFubmVscyAoaW5jbC4gTEZFIGlmIHByZXNlbnQpCisgICAgICogT3V0cHV0OiBkb3dubWl4IGF1ZGlvIGNoYW5uZWxzICh1cCB0byA0LCBubyBMRkUpICovCisgICAgdWludDhfdCAgY29yZV9kb3dubWl4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZW1iZWRkZWQgZG93bm1peCBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgICAgdWludDhfdCAgY29yZV9kb3dubWl4X2Ftb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYXVkaW8gY2hhbm5lbCBhcnJhbmdlbWVudCBvZiBlbWJlZGRlZCBkb3dubWl4CisgICAgdWludDE2X3QgY29yZV9kb3dubWl4X2NvZGVzW0RDQV9QUklNX0NIQU5ORUxTX01BWCArIDFdWzRdOyAgIC8vLzwgZW1iZWRkZWQgZG93bm1peCBjb2VmZmljaWVudHMgKDktYml0IGNvZGVzKQorCisgICAgaW50MzJfdCAgaGlnaF9mcmVxX3ZxW0RDQV9QUklNX0NIQU5ORUxTX01BWF1bRENBX1NVQkJBTkRTXTsgIC8vLzwgVlEgZW5jb2RlZCBoaWdoIGZyZXF1ZW5jeSBzdWJiYW5kcworCisgICAgZmxvYXQgbGZlX2RhdGFbMiAqIERDQV9MRkVfTUFYICogKERDQV9CTE9DS1NfTUFYICsgNCldOyAgICAgIC8vLzwgTG93IGZyZXF1ZW5jeSBlZmZlY3QgZGF0YQorICAgIGludCBsZmVfc2NhbGVfZmFjdG9yOworCisgICAgLyogU3ViYmFuZCBzYW1wbGVzIGhpc3RvcnkgKGZvciBBRFBDTSkgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBzdWJiYW5kX3NhbXBsZXNfaGlzdClbRENBX1BSSU1fQ0hBTk5FTFNfTUFYXVtEQ0FfU1VCQkFORFNdWzRdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHN1YmJhbmRfZmlyX2hpc3QpW0RDQV9QUklNX0NIQU5ORUxTX01BWF1bNTEyXTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBzdWJiYW5kX2Zpcl9ub2lkZWEpW0RDQV9QUklNX0NIQU5ORUxTX01BWF1bMzJdOworICAgIGludCBoaXN0X2luZGV4W0RDQV9QUklNX0NIQU5ORUxTX01BWF07CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgcmFYaW4pWzMyXTsKKworICAgIGludCBvdXRwdXQ7ICAgICAgICAgICAgICAgICAvLy88IHR5cGUgb2Ygb3V0cHV0CisKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBzdWJiYW5kX3NhbXBsZXMpW0RDQV9CTE9DS1NfTUFYXVtEQ0FfUFJJTV9DSEFOTkVMU19NQVhdW0RDQV9TVUJCQU5EU11bOF07CisgICAgZmxvYXQgKnNhbXBsZXNfY2hhbnB0cltEQ0FfUFJJTV9DSEFOTkVMU19NQVggKyAxXTsKKyAgICBmbG9hdCAqZXh0cmFfY2hhbm5lbHNbRENBX1BSSU1fQ0hBTk5FTFNfTUFYICsgMV07CisgICAgdWludDhfdCAqZXh0cmFfY2hhbm5lbHNfYnVmZmVyOworICAgIHVuc2lnbmVkIGludCBleHRyYV9jaGFubmVsc19idWZmZXJfc2l6ZTsKKworICAgIHVpbnQ4X3QgZGNhX2J1ZmZlcltEQ0FfTUFYX0ZSQU1FX1NJWkUgKyBEQ0FfTUFYX0VYU1NfSEVBREVSX1NJWkUgKyBEQ0FfQlVGRkVSX1BBRERJTkdfU0laRV07CisgICAgaW50IGRjYV9idWZmZXJfc2l6ZTsgICAgICAgIC8vLzwgaG93IG11Y2ggZGF0YSBpcyBpbiB0aGUgZGNhX2J1ZmZlcgorCisgICAgY29uc3QgaW50OF90ICpjaGFubmVsX29yZGVyX3RhYjsgIC8vLzwgY2hhbm5lbCByZW9yZGVyaW5nIHRhYmxlLCBsZmUgYW5kIG5vbiBsZmUKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIC8qIEN1cnJlbnQgcG9zaXRpb24gaW4gRENBIGZyYW1lICovCisgICAgaW50IGN1cnJlbnRfc3ViZnJhbWU7CisgICAgaW50IGN1cnJlbnRfc3Vic3ViZnJhbWU7CisKKyAgICBpbnQgY29yZV9leHRfbWFzazsgICAgICAgICAgLy8vPCBwcmVzZW50IGV4dGVuc2lvbnMgaW4gdGhlIGNvcmUgc3Vic3RyZWFtCisKKyAgICAvKiBYQ2ggZXh0ZW5zaW9uIGluZm9ybWF0aW9uICovCisgICAgaW50IHhjaF9wcmVzZW50OyAgICAgICAgICAgIC8vLzwgWENoIGV4dGVuc2lvbiBwcmVzZW50IGFuZCB2YWxpZAorICAgIGludCB4Y2hfYmFzZV9jaGFubmVsOyAgICAgICAvLy88IGluZGV4IG9mIGZpcnN0IChvbmx5KSBjaGFubmVsIGNvbnRhaW5pbmcgWENIIGRhdGEKKyAgICBpbnQgeGNoX2Rpc2FibGU7ICAgICAgICAgICAgLy8vPCB3aGV0aGVyIHRoZSBYQ2ggZXh0ZW5zaW9uIHNob3VsZCBiZSBkZWNvZGVkIG9yIG5vdAorCisgICAgLyogWFhDSCBleHRlbnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBpbnQgeHhjaF9jaHNldDsKKyAgICBpbnQgeHhjaF9uYml0c19zcGtfbWFzazsKKyAgICB1aW50MzJfdCB4eGNoX2NvcmVfc3BrbWFzazsKKyAgICB1aW50MzJfdCB4eGNoX3Nwa19tYXNrc1s0XTsgLyogc3BlYWtlciBtYXNrcywgbGFzdCBlbGVtZW50IGlzIGNvcmUgbWFzayAqLworICAgIGludCB4eGNoX2Noc2V0X25jaFs0XTsKKyAgICBmbG9hdCB4eGNoX2RtaXhfc2ZbRENBX0NIU0VUU19NQVhdOworCisgICAgdWludDMyX3QgeHhjaF9kbWl4X2VtYmVkZGVkOyAgLyogbG93ZXIgbGF5ZXIgaGFzIG1peCBwcmUtZW1iZWRkZWQsIHBlciBjaHNldCAqLworICAgIGZsb2F0IHh4Y2hfZG1peF9jb2VmZltEQ0FfUFJJTV9DSEFOTkVMU19NQVhdWzMyXTsgLyogd29yc3QgY2FzZSBzaXppbmcgKi8KKworICAgIGludDhfdCB4eGNoX29yZGVyX3RhYlszMl07CisgICAgaW50OF90IGxmZV9pbmRleDsKKworICAgIC8qIEV4U1MgaGVhZGVyIHBhcnNlciAqLworICAgIGludCBzdGF0aWNfZmllbGRzOyAgICAgICAgICAvLy88IHN0YXRpYyBmaWVsZHMgcHJlc2VudAorICAgIGludCBtaXhfbWV0YWRhdGE7ICAgICAgICAgICAvLy88IG1peGluZyBtZXRhZGF0YSBwcmVzZW50CisgICAgaW50IG51bV9taXhfY29uZmlnczsgICAgICAgIC8vLzwgbnVtYmVyIG9mIG1peCBvdXQgY29uZmlndXJhdGlvbnMKKyAgICBpbnQgbWl4X2NvbmZpZ19udW1fY2hbNF07ICAgLy8vPCBudW1iZXIgb2YgY2hhbm5lbHMgaW4gZWFjaCBtaXggb3V0IGNvbmZpZ3VyYXRpb24KKworICAgIGludCBwcm9maWxlOworCisgICAgaW50IGRlYnVnX2ZsYWc7ICAgICAgICAgICAgIC8vLzwgdXNlZCBmb3Igc3VwcHJlc3NpbmcgcmVwZWF0ZWQgZXJyb3IgbWVzc2FnZXMgb3V0cHV0CisgICAgQVZGbG9hdERTUENvbnRleHQgKmZkc3A7CisgICAgRkZUQ29udGV4dCBpbWRjdDsKKyAgICBTeW50aEZpbHRlckNvbnRleHQgc3ludGg7CisgICAgRENBRFNQQ29udGV4dCBkY2Fkc3A7CisgICAgRm10Q29udmVydENvbnRleHQgZm10X2NvbnY7Cit9IERDQUNvbnRleHQ7CisKK3N0YXRpYyBmbG9hdCBkY2FfZG1peF9jb2RlKHVuc2lnbmVkIGNvZGUpOworCitzdGF0aWMgY29uc3QgdWludDE2X3QgZGNhX3ZsY19vZmZzW10gPSB7CisgICAgICAgIDAsICAgNTEyLCAgIDY0MCwgICA3NjgsICAxMjgyLCAgMTc5NCwgIDI0MzYsICAzMDgwLCAgMzc3MCwgIDQ0NTQsICA1MzY0LAorICAgICA1MzcyLCAgNTM4MCwgIDUzODgsICA1MzkyLCAgNTM5NiwgIDU0MTIsICA1NDIwLCAgNTQyOCwgIDU0NjAsICA1NDkyLCAgNTUwOCwKKyAgICAgNTU3MiwgIDU2MDQsICA1NjY4LCAgNTc5NiwgIDU4NjAsICA1ODkyLCAgNjQxMiwgIDY2NjgsICA2Nzk2LCAgNzMwOCwgIDc1NjQsCisgICAgIDc4MjAsICA4MDc2LCAgODYyMCwgIDkxMzIsICA5Mzg4LCAgOTkxMCwgMTAxNjYsIDEwNjgwLCAxMTE5NiwgMTE3MjYsIDEyMjQwLAorICAgIDEyNzUyLCAxMzI5OCwgMTM4MTAsIDE0MzI2LCAxNDg0MCwgMTU1MDAsIDE2MDIyLCAxNjU0MCwgMTcxNTgsIDE3Njc4LCAxODI2NCwKKyAgICAxODc5NiwgMTkzNTIsIDE5OTI2LCAyMDQ2OCwgMjE0NzIsIDIyMzk4LCAyMzAxNCwgMjM2MjIsCit9OworCitzdGF0aWMgYXZfY29sZCB2b2lkIGRjYV9pbml0X3ZsY3Modm9pZCkKK3sKKyAgICBzdGF0aWMgaW50IHZsY3NfaW5pdGlhbGl6ZWQgPSAwOworICAgIGludCBpLCBqLCBjID0gMTQ7CisgICAgc3RhdGljIFZMQ19UWVBFIGRjYV90YWJsZVsyMzYyMl1bMl07CisKKyAgICBpZiAodmxjc19pbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZGNhX2JpdGFsbG9jX2luZGV4Lm9mZnNldCA9IDE7CisgICAgZGNhX2JpdGFsbG9jX2luZGV4LndyYXAgICA9IDI7CisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICBkY2FfYml0YWxsb2NfaW5kZXgudmxjW2ldLnRhYmxlICAgICAgICAgICA9ICZkY2FfdGFibGVbZGNhX3ZsY19vZmZzW2ldXTsKKyAgICAgICAgZGNhX2JpdGFsbG9jX2luZGV4LnZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSBkY2FfdmxjX29mZnNbaSArIDFdIC0gZGNhX3ZsY19vZmZzW2ldOworICAgICAgICBpbml0X3ZsYygmZGNhX2JpdGFsbG9jX2luZGV4LnZsY1tpXSwgYml0YWxsb2NfMTJfdmxjX2JpdHNbaV0sIDEyLAorICAgICAgICAgICAgICAgICBiaXRhbGxvY18xMl9iaXRzW2ldLCAxLCAxLAorICAgICAgICAgICAgICAgICBiaXRhbGxvY18xMl9jb2Rlc1tpXSwgMiwgMiwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgIH0KKyAgICBkY2Ffc2NhbGVmYWN0b3Iub2Zmc2V0ID0gLTY0OworICAgIGRjYV9zY2FsZWZhY3Rvci53cmFwICAgPSAyOworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgZGNhX3NjYWxlZmFjdG9yLnZsY1tpXS50YWJsZSAgICAgICAgICAgPSAmZGNhX3RhYmxlW2RjYV92bGNfb2Zmc1tpICsgNV1dOworICAgICAgICBkY2Ffc2NhbGVmYWN0b3IudmxjW2ldLnRhYmxlX2FsbG9jYXRlZCA9IGRjYV92bGNfb2Zmc1tpICsgNl0gLSBkY2FfdmxjX29mZnNbaSArIDVdOworICAgICAgICBpbml0X3ZsYygmZGNhX3NjYWxlZmFjdG9yLnZsY1tpXSwgU0NBTEVTX1ZMQ19CSVRTLCAxMjksCisgICAgICAgICAgICAgICAgIHNjYWxlc19iaXRzW2ldLCAxLCAxLAorICAgICAgICAgICAgICAgICBzY2FsZXNfY29kZXNbaV0sIDIsIDIsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICB9CisgICAgZGNhX3Rtb2RlLm9mZnNldCA9IDA7CisgICAgZGNhX3Rtb2RlLndyYXAgICA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBkY2FfdG1vZGUudmxjW2ldLnRhYmxlICAgICAgICAgICA9ICZkY2FfdGFibGVbZGNhX3ZsY19vZmZzW2kgKyAxMF1dOworICAgICAgICBkY2FfdG1vZGUudmxjW2ldLnRhYmxlX2FsbG9jYXRlZCA9IGRjYV92bGNfb2Zmc1tpICsgMTFdIC0gZGNhX3ZsY19vZmZzW2kgKyAxMF07CisgICAgICAgIGluaXRfdmxjKCZkY2FfdG1vZGUudmxjW2ldLCB0bW9kZV92bGNfYml0c1tpXSwgNCwKKyAgICAgICAgICAgICAgICAgdG1vZGVfYml0c1tpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgdG1vZGVfY29kZXNbaV0sIDIsIDIsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDc7IGorKykgeworICAgICAgICAgICAgaWYgKCFiaXRhbGxvY19jb2Rlc1tpXVtqXSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRjYV9zbXBsX2JpdGFsbG9jW2kgKyAxXS5vZmZzZXQgICAgICAgICAgICAgICAgID0gYml0YWxsb2Nfb2Zmc2V0c1tpXTsKKyAgICAgICAgICAgIGRjYV9zbXBsX2JpdGFsbG9jW2kgKyAxXS53cmFwICAgICAgICAgICAgICAgICAgID0gMSArIChqID4gNCk7CisgICAgICAgICAgICBkY2Ffc21wbF9iaXRhbGxvY1tpICsgMV0udmxjW2pdLnRhYmxlICAgICAgICAgICA9ICZkY2FfdGFibGVbZGNhX3ZsY19vZmZzW2NdXTsKKyAgICAgICAgICAgIGRjYV9zbXBsX2JpdGFsbG9jW2kgKyAxXS52bGNbal0udGFibGVfYWxsb2NhdGVkID0gZGNhX3ZsY19vZmZzW2MgKyAxXSAtIGRjYV92bGNfb2Zmc1tjXTsKKworICAgICAgICAgICAgaW5pdF92bGMoJmRjYV9zbXBsX2JpdGFsbG9jW2kgKyAxXS52bGNbal0sIGJpdGFsbG9jX21heGJpdHNbaV1bal0sCisgICAgICAgICAgICAgICAgICAgICBiaXRhbGxvY19zaXplc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgIGJpdGFsbG9jX2JpdHNbaV1bal0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICBiaXRhbGxvY19jb2Rlc1tpXVtqXSwgMiwgMiwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgICAgICAgICAgYysrOworICAgICAgICB9CisgICAgdmxjc19pbml0aWFsaXplZCA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYXJyYXkoR2V0Qml0Q29udGV4dCAqZ2IsIGludCAqZHN0LCBpbnQgbGVuLCBpbnQgYml0cykKK3sKKyAgICB3aGlsZSAobGVuLS0pCisgICAgICAgICpkc3QrKyA9IGdldF9iaXRzKGdiLCBiaXRzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGNhX3h4Y2gyaW5kZXgoRENBQ29udGV4dCAqcywgaW50IHh4Y2hfY2gpCit7CisgICAgaW50IGksIGJhc2UsIG1hc2s7CisKKyAgICAvKiBsb2NhdGUgY2hhbm5lbCBzZXQgY29udGFpbmluZyB0aGUgY2hhbm5lbCAqLworICAgIGZvciAoaSA9IC0xLCBiYXNlID0gMCwgbWFzayA9IChzLT54eGNoX2NvcmVfc3BrbWFzayAmIH5EQ0FfWFhDSF9MRkUxKTsKKyAgICAgICAgIGkgPD0gcy0+eHhjaF9jaHNldCAmJiAhKG1hc2sgJiB4eGNoX2NoKTsgbWFzayA9IHMtPnh4Y2hfc3BrX21hc2tzWysraV0pCisgICAgICAgIGJhc2UgKz0gYXZfcG9wY291bnQobWFzayk7CisKKyAgICByZXR1cm4gYmFzZSArIGF2X3BvcGNvdW50KG1hc2sgJiAoeHhjaF9jaCAtIDEpKTsKK30KKworc3RhdGljIGludCBkY2FfcGFyc2VfYXVkaW9fY29kaW5nX2hlYWRlcihEQ0FDb250ZXh0ICpzLCBpbnQgYmFzZV9jaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHhjaCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgYWRqX3RhYmxlWzRdID0geyAxLjAsIDEuMTI1MCwgMS4yNTAwLCAxLjQzNzUgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGJpdGxlblsxMV0gPSB7IDAsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHRoclsxMV0gICAgPSB7IDAsIDEsIDMsIDMsIDMsIDMsIDcsIDcsIDcsIDcsIDcgfTsKKyAgICBpbnQgaGRyX3BvcyA9IDAsIGhkcl9zaXplID0gMDsKKyAgICBmbG9hdCBzY2FsZV9mYWN0b3I7CisgICAgaW50IHRoaXNfY2hhbnMsIGFjY19tYXNrOworICAgIGludCBlbWJlZGRlZF9kb3dubWl4OworICAgIGludCBuY2hhbnMsIG1hc2tbOF07CisgICAgaW50IGNvZWZmLCBpY2hhbjsKKworICAgIC8qIHh4Y2ggaGFzIGFyYml0cmFyeSBzaXplZCBhdWRpbyBjb2RpbmcgaGVhZGVycyAqLworICAgIGlmICh4eGNoKSB7CisgICAgICAgIGhkcl9wb3MgID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICAgICAgaGRyX3NpemUgPSBnZXRfYml0cygmcy0+Z2IsIDcpICsgMTsKKyAgICB9CisKKyAgICBuY2hhbnMgPSBnZXRfYml0cygmcy0+Z2IsIDMpICsgMTsKKyAgICBzLT50b3RhbF9jaGFubmVscyA9IG5jaGFucyArIGJhc2VfY2hhbm5lbDsKKyAgICBzLT5wcmltX2NoYW5uZWxzICA9IHMtPnRvdGFsX2NoYW5uZWxzOworCisgICAgLyogb2J0YWluIHNwZWFrZXIgbGF5b3V0IG1hc2sgJiBkb3dubWl4IGNvZWZmaWNpZW50cyBmb3IgWFhDSCAqLworICAgIGlmICh4eGNoKSB7CisgICAgICAgIGFjY19tYXNrID0gcy0+eHhjaF9jb3JlX3Nwa21hc2s7CisKKyAgICAgICAgdGhpc19jaGFucyA9IGdldF9iaXRzKCZzLT5nYiwgcy0+eHhjaF9uYml0c19zcGtfbWFzayAtIDYpIDw8IDY7CisgICAgICAgIHMtPnh4Y2hfc3BrX21hc2tzW3MtPnh4Y2hfY2hzZXRdID0gdGhpc19jaGFuczsKKyAgICAgICAgcy0+eHhjaF9jaHNldF9uY2hbcy0+eHhjaF9jaHNldF0gPSBuY2hhbnM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBzLT54eGNoX2Noc2V0OyBpKyspCisgICAgICAgICAgICBhY2NfbWFzayB8PSBzLT54eGNoX3Nwa19tYXNrc1tpXTsKKworICAgICAgICAvKiBjaGVjayBmb3IgZG93bm1peGluZyBpbmZvcm1hdGlvbiAqLworICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgICAgIGVtYmVkZGVkX2Rvd25taXggPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgIGNvZWZmICAgICAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDYpOworCisgICAgICAgICAgICBpZiAoY29lZmY8MSB8fCBjb2VmZj42MSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiNmJpdCBjb2VmZiAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsIGNvZWZmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2NhbGVfZmFjdG9yICAgICA9IC0xLjBmIC8gZGNhX2RtaXhfY29kZSgoY29lZmY8PDIpLTMpOworCisgICAgICAgICAgICBzLT54eGNoX2RtaXhfc2Zbcy0+eHhjaF9jaHNldF0gPSBzY2FsZV9mYWN0b3I7CisKKyAgICAgICAgICAgIGZvciAoaSA9IGJhc2VfY2hhbm5lbDsgaSA8IHMtPnByaW1fY2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgICAgIG1hc2tbaV0gPSBnZXRfYml0cygmcy0+Z2IsIHMtPnh4Y2hfbmJpdHNfc3BrX21hc2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSBiYXNlX2NoYW5uZWw7IGogPCBzLT5wcmltX2NoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQocy0+eHhjaF9kbWl4X2NvZWZmW2pdLCAwLCBzaXplb2Yocy0+eHhjaF9kbWl4X2NvZWZmWzBdKSk7CisgICAgICAgICAgICAgICAgcy0+eHhjaF9kbWl4X2VtYmVkZGVkIHw9IChlbWJlZGRlZF9kb3dubWl4IDw8IGopOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT54eGNoX25iaXRzX3Nwa19tYXNrOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2tbal0gJiAoMSA8PCBpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgxIDw8IGkpID09IERDQV9YWENIX0xGRTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRENBLVhYQ0g6IGRtaXggdG8gTEZFMSBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gZ2V0X2JpdHMoJnMtPmdiLCA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGljaGFuID0gZGNhX3h4Y2gyaW5kZXgocywgMSA8PCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY29lZmYmNjMpPDEgfHwgKGNvZWZmJjYzKT42MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiN2JpdCBjb2VmZiAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsIGNvZWZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnh4Y2hfZG1peF9jb2VmZltqXVtpY2hhbl0gPSBkY2FfZG1peF9jb2RlKChjb2VmZjw8MiktMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+cHJpbV9jaGFubmVscyA+IERDQV9QUklNX0NIQU5ORUxTX01BWCkKKyAgICAgICAgcy0+cHJpbV9jaGFubmVscyA9IERDQV9QUklNX0NIQU5ORUxTX01BWDsKKworICAgIGZvciAoaSA9IGJhc2VfY2hhbm5lbDsgaSA8IHMtPnByaW1fY2hhbm5lbHM7IGkrKykgeworICAgICAgICBzLT5zdWJiYW5kX2FjdGl2aXR5W2ldID0gZ2V0X2JpdHMoJnMtPmdiLCA1KSArIDI7CisgICAgICAgIGlmIChzLT5zdWJiYW5kX2FjdGl2aXR5W2ldID4gRENBX1NVQkJBTkRTKQorICAgICAgICAgICAgcy0+c3ViYmFuZF9hY3Rpdml0eVtpXSA9IERDQV9TVUJCQU5EUzsKKyAgICB9CisgICAgZm9yIChpID0gYmFzZV9jaGFubmVsOyBpIDwgcy0+cHJpbV9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIHMtPnZxX3N0YXJ0X3N1YmJhbmRbaV0gPSBnZXRfYml0cygmcy0+Z2IsIDUpICsgMTsKKyAgICAgICAgaWYgKHMtPnZxX3N0YXJ0X3N1YmJhbmRbaV0gPiBEQ0FfU1VCQkFORFMpCisgICAgICAgICAgICBzLT52cV9zdGFydF9zdWJiYW5kW2ldID0gRENBX1NVQkJBTkRTOworICAgIH0KKyAgICBnZXRfYXJyYXkoJnMtPmdiLCBzLT5qb2ludF9pbnRlbnNpdHkgKyBiYXNlX2NoYW5uZWwsICAgICBzLT5wcmltX2NoYW5uZWxzIC0gYmFzZV9jaGFubmVsLCAzKTsKKyAgICBnZXRfYXJyYXkoJnMtPmdiLCBzLT50cmFuc2llbnRfaHVmZm1hbiArIGJhc2VfY2hhbm5lbCwgICBzLT5wcmltX2NoYW5uZWxzIC0gYmFzZV9jaGFubmVsLCAyKTsKKyAgICBnZXRfYXJyYXkoJnMtPmdiLCBzLT5zY2FsZWZhY3Rvcl9odWZmbWFuICsgYmFzZV9jaGFubmVsLCBzLT5wcmltX2NoYW5uZWxzIC0gYmFzZV9jaGFubmVsLCAzKTsKKyAgICBnZXRfYXJyYXkoJnMtPmdiLCBzLT5iaXRhbGxvY19odWZmbWFuICsgYmFzZV9jaGFubmVsLCAgICBzLT5wcmltX2NoYW5uZWxzIC0gYmFzZV9jaGFubmVsLCAzKTsKKworICAgIC8qIEdldCBjb2RlYm9va3MgcXVhbnRpemF0aW9uIGluZGV4ZXMgKi8KKyAgICBpZiAoIWJhc2VfY2hhbm5lbCkKKyAgICAgICAgbWVtc2V0KHMtPnF1YW50X2luZGV4X2h1ZmZtYW4sIDAsIHNpemVvZihzLT5xdWFudF9pbmRleF9odWZmbWFuKSk7CisgICAgZm9yIChqID0gMTsgaiA8IDExOyBqKyspCisgICAgICAgIGZvciAoaSA9IGJhc2VfY2hhbm5lbDsgaSA8IHMtPnByaW1fY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIHMtPnF1YW50X2luZGV4X2h1ZmZtYW5baV1bal0gPSBnZXRfYml0cygmcy0+Z2IsIGJpdGxlbltqXSk7CisKKyAgICAvKiBHZXQgc2NhbGUgZmFjdG9yIGFkanVzdG1lbnQgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgMTE7IGorKykKKyAgICAgICAgZm9yIChpID0gYmFzZV9jaGFubmVsOyBpIDwgcy0+cHJpbV9jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgcy0+c2NhbGVmYWN0b3JfYWRqW2ldW2pdID0gMTsKKworICAgIGZvciAoaiA9IDE7IGogPCAxMTsgaisrKQorICAgICAgICBmb3IgKGkgPSBiYXNlX2NoYW5uZWw7IGkgPCBzLT5wcmltX2NoYW5uZWxzOyBpKyspCisgICAgICAgICAgICBpZiAocy0+cXVhbnRfaW5kZXhfaHVmZm1hbltpXVtqXSA8IHRocltqXSkKKyAgICAgICAgICAgICAgICBzLT5zY2FsZWZhY3Rvcl9hZGpbaV1bal0gPSBhZGpfdGFibGVbZ2V0X2JpdHMoJnMtPmdiLCAyKV07CisKKyAgICBpZiAoIXh4Y2gpIHsKKyAgICAgICAgaWYgKHMtPmNyY19wcmVzZW50KSB7CisgICAgICAgICAgICAvKiBBdWRpbyBoZWFkZXIgQ1JDIGNoZWNrICovCisgICAgICAgICAgICBnZXRfYml0cygmcy0+Z2IsIDE2KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFNraXAgdG8gdGhlIGVuZCBvZiB0aGUgaGVhZGVyLCBhbHNvIGlnbm9yZSBDUkMgaWYgcHJlc2VudCAgKi8KKyAgICAgICAgaSA9IGdldF9iaXRzX2NvdW50KCZzLT5nYik7CisgICAgICAgIGlmIChoZHJfcG9zICsgOCAqIGhkcl9zaXplID4gaSkKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgaGRyX3BvcyArIDggKiBoZHJfc2l6ZSAtIGkpOworICAgIH0KKworICAgIHMtPmN1cnJlbnRfc3ViZnJhbWUgICAgPSAwOworICAgIHMtPmN1cnJlbnRfc3Vic3ViZnJhbWUgPSAwOworCisjaWZkZWYgVFJBQ0UKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInN1YmZyYW1lczogJWlcbiIsIHMtPnN1YmZyYW1lcyk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJwcmltIGNoYW5uZWxzOiAlaVxuIiwgcy0+cHJpbV9jaGFubmVscyk7CisgICAgZm9yIChpID0gYmFzZV9jaGFubmVsOyBpIDwgcy0+cHJpbV9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAic3ViYmFuZCBhY3Rpdml0eTogJWlcbiIsCisgICAgICAgICAgICAgICBzLT5zdWJiYW5kX2FjdGl2aXR5W2ldKTsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJ2cSBzdGFydCBzdWJiYW5kOiAlaVxuIiwKKyAgICAgICAgICAgICAgIHMtPnZxX3N0YXJ0X3N1YmJhbmRbaV0pOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImpvaW50IGludGVuc2l0eTogJWlcbiIsCisgICAgICAgICAgICAgICBzLT5qb2ludF9pbnRlbnNpdHlbaV0pOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInRyYW5zaWVudCBtb2RlIGNvZGVib29rOiAlaVxuIiwKKyAgICAgICAgICAgICAgIHMtPnRyYW5zaWVudF9odWZmbWFuW2ldKTsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJzY2FsZSBmYWN0b3IgY29kZWJvb2s6ICVpXG4iLAorICAgICAgICAgICAgICAgcy0+c2NhbGVmYWN0b3JfaHVmZm1hbltpXSk7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiYml0IGFsbG9jYXRpb24gcXVhbnRpemVyOiAlaVxuIiwKKyAgICAgICAgICAgICAgIHMtPmJpdGFsbG9jX2h1ZmZtYW5baV0pOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInF1YW50IGluZGV4IGh1ZmY6Iik7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMTsgaisrKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICIgJWkiLCBzLT5xdWFudF9pbmRleF9odWZmbWFuW2ldW2pdKTsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInNjYWxlZmFjIGFkajoiKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDExOyBqKyspCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIiAlMS4zZiIsIHMtPnNjYWxlZmFjdG9yX2FkaltpXVtqXSk7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRjYV9wYXJzZV9mcmFtZV9oZWFkZXIoRENBQ29udGV4dCAqcykKK3sKKyAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgcy0+ZGNhX2J1ZmZlciwgcy0+ZGNhX2J1ZmZlcl9zaXplICogOCk7CisKKyAgICAvKiBTeW5jIGNvZGUgKi8KKyAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIDMyKTsKKworICAgIC8qIEZyYW1lIGhlYWRlciAqLworICAgIHMtPmZyYW1lX3R5cGUgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAxKTsKKyAgICBzLT5zYW1wbGVzX2RlZmljaXQgICA9IGdldF9iaXRzKCZzLT5nYiwgNSkgKyAxOworICAgIHMtPmNyY19wcmVzZW50ICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAxKTsKKyAgICBzLT5zYW1wbGVfYmxvY2tzICAgICA9IGdldF9iaXRzKCZzLT5nYiwgNykgKyAxOworICAgIHMtPmZyYW1lX3NpemUgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAxNCkgKyAxOworICAgIGlmIChzLT5mcmFtZV9zaXplIDwgOTUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHMtPmFtb2RlICAgICAgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsKKyAgICBzLT5zYW1wbGVfcmF0ZSAgICAgICA9IGF2cHJpdl9kY2Ffc2FtcGxlX3JhdGVzW2dldF9iaXRzKCZzLT5nYiwgNCldOworICAgIGlmICghcy0+c2FtcGxlX3JhdGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHMtPmJpdF9yYXRlX2luZGV4ICAgID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKKyAgICBzLT5iaXRfcmF0ZSAgICAgICAgICA9IGRjYV9iaXRfcmF0ZXNbcy0+Yml0X3JhdGVfaW5kZXhdOworICAgIGlmICghcy0+Yml0X3JhdGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOyAvLyBhbHdheXMgMCAocmVzZXJ2ZWQsIGNmLiBFVFNJIFRTIDEwMiAxMTQgVjEuNC4xKQorICAgIHMtPmR5bnJhbmdlICAgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAxKTsKKyAgICBzLT50aW1lc3RhbXAgICAgICAgICA9IGdldF9iaXRzKCZzLT5nYiwgMSk7CisgICAgcy0+YXV4X2RhdGEgICAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDEpOworICAgIHMtPmhkY2QgICAgICAgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAxKTsKKyAgICBzLT5leHRfZGVzY3IgICAgICAgICA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CisgICAgcy0+ZXh0X2NvZGluZyAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDEpOworICAgIHMtPmFzcGYgICAgICAgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAxKTsKKyAgICBzLT5sZmUgICAgICAgICAgICAgICA9IGdldF9iaXRzKCZzLT5nYiwgMik7CisgICAgcy0+cHJlZGljdG9yX2hpc3RvcnkgPSBnZXRfYml0cygmcy0+Z2IsIDEpOworCisgICAgaWYgKHMtPmxmZSA+IDIpIHsKKyAgICAgICAgcy0+bGZlID0gMDsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIExGRSB2YWx1ZTogJWRcbiIsIHMtPmxmZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIFRPRE86IGNoZWNrIENSQyAqLworICAgIGlmIChzLT5jcmNfcHJlc2VudCkKKyAgICAgICAgcy0+aGVhZGVyX2NyYyAgICA9IGdldF9iaXRzKCZzLT5nYiwgMTYpOworCisgICAgcy0+bXVsdGlyYXRlX2ludGVyICAgPSBnZXRfYml0cygmcy0+Z2IsIDEpOworICAgIHMtPnZlcnNpb24gICAgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsKKyAgICBzLT5jb3B5X2hpc3RvcnkgICAgICA9IGdldF9iaXRzKCZzLT5nYiwgMik7CisgICAgcy0+c291cmNlX3BjbV9yZXMgICAgPSBnZXRfYml0cygmcy0+Z2IsIDMpOworICAgIHMtPmZyb250X3N1bSAgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAxKTsKKyAgICBzLT5zdXJyb3VuZF9zdW0gICAgICA9IGdldF9iaXRzKCZzLT5nYiwgMSk7CisgICAgcy0+ZGlhbG9nX25vcm0gICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDQpOworCisgICAgLyogRklYTUU6IGNoYW5uZWxzIG1peGluZyBsZXZlbHMgKi8KKyAgICBzLT5vdXRwdXQgPSBzLT5hbW9kZTsKKyAgICBpZiAocy0+bGZlKQorICAgICAgICBzLT5vdXRwdXQgfD0gRENBX0xGRTsKKworI2lmZGVmIFRSQUNFCisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJmcmFtZSB0eXBlOiAlaVxuIiwgcy0+ZnJhbWVfdHlwZSk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJzYW1wbGVzIGRlZmljaXQ6ICVpXG4iLCBzLT5zYW1wbGVzX2RlZmljaXQpOworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiY3JjIHByZXNlbnQ6ICVpXG4iLCBzLT5jcmNfcHJlc2VudCk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJzYW1wbGUgYmxvY2tzOiAlaSAoJWkgc2FtcGxlcylcbiIsCisgICAgICAgICAgIHMtPnNhbXBsZV9ibG9ja3MsIHMtPnNhbXBsZV9ibG9ja3MgKiAzMik7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJmcmFtZSBzaXplOiAlaSBieXRlc1xuIiwgcy0+ZnJhbWVfc2l6ZSk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJhbW9kZTogJWkgKCVpIGNoYW5uZWxzKVxuIiwKKyAgICAgICAgICAgcy0+YW1vZGUsIGRjYV9jaGFubmVsc1tzLT5hbW9kZV0pOworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAic2FtcGxlIHJhdGU6ICVpIEh6XG4iLAorICAgICAgICAgICBzLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJiaXQgcmF0ZTogJWkgYml0cy9zXG4iLAorICAgICAgICAgICBzLT5iaXRfcmF0ZSk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJkeW5yYW5nZTogJWlcbiIsIHMtPmR5bnJhbmdlKTsKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInRpbWVzdGFtcDogJWlcbiIsIHMtPnRpbWVzdGFtcCk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJhdXhfZGF0YTogJWlcbiIsIHMtPmF1eF9kYXRhKTsKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImhkY2Q6ICVpXG4iLCBzLT5oZGNkKTsKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImV4dCBkZXNjcjogJWlcbiIsIHMtPmV4dF9kZXNjcik7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJleHQgY29kaW5nOiAlaVxuIiwgcy0+ZXh0X2NvZGluZyk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJhc3BmOiAlaVxuIiwgcy0+YXNwZik7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJsZmU6ICVpXG4iLCBzLT5sZmUpOworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicHJlZGljdG9yIGhpc3Rvcnk6ICVpXG4iLAorICAgICAgICAgICBzLT5wcmVkaWN0b3JfaGlzdG9yeSk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJoZWFkZXIgY3JjOiAlaVxuIiwgcy0+aGVhZGVyX2NyYyk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJtdWx0aXJhdGUgaW50ZXI6ICVpXG4iLAorICAgICAgICAgICBzLT5tdWx0aXJhdGVfaW50ZXIpOworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAidmVyc2lvbiBudW1iZXI6ICVpXG4iLCBzLT52ZXJzaW9uKTsKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImNvcHkgaGlzdG9yeTogJWlcbiIsIHMtPmNvcHlfaGlzdG9yeSk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICJzb3VyY2UgcGNtIHJlc29sdXRpb246ICVpICglaSBiaXRzL3NhbXBsZSlcbiIsCisgICAgICAgICAgIHMtPnNvdXJjZV9wY21fcmVzLCBkY2FfYml0c19wZXJfc2FtcGxlW3MtPnNvdXJjZV9wY21fcmVzXSk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJmcm9udCBzdW06ICVpXG4iLCBzLT5mcm9udF9zdW0pOworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAic3Vycm91bmQgc3VtOiAlaVxuIiwgcy0+c3Vycm91bmRfc3VtKTsKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImRpYWxvZyBub3JtOiAlaVxuIiwgcy0+ZGlhbG9nX25vcm0pOworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKKyNlbmRpZgorCisgICAgLyogUHJpbWFyeSBhdWRpbyBjb2RpbmcgaGVhZGVyICovCisgICAgcy0+c3ViZnJhbWVzID0gZ2V0X2JpdHMoJnMtPmdiLCA0KSArIDE7CisKKyAgICByZXR1cm4gZGNhX3BhcnNlX2F1ZGlvX2NvZGluZ19oZWFkZXIocywgMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9zY2FsZShHZXRCaXRDb250ZXh0ICpnYiwgaW50IGxldmVsLCBpbnQgdmFsdWUsIGludCBsb2cycmFuZ2UpCit7CisgICAgaWYgKGxldmVsIDwgNSkgeworICAgICAgICAvKiBodWZmbWFuIGVuY29kZWQgKi8KKyAgICAgICAgdmFsdWUgKz0gZ2V0X2JpdGFsbG9jKGdiLCAmZGNhX3NjYWxlZmFjdG9yLCBsZXZlbCk7CisgICAgICAgIHZhbHVlICA9IGF2X2NsaXAodmFsdWUsIDAsICgxIDw8IGxvZzJyYW5nZSkgLSAxKTsKKyAgICB9IGVsc2UgaWYgKGxldmVsIDwgOCkgeworICAgICAgICBpZiAobGV2ZWwgKyAxID4gbG9nMnJhbmdlKSB7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIGxldmVsICsgMSAtIGxvZzJyYW5nZSk7CisgICAgICAgICAgICB2YWx1ZSA9IGdldF9iaXRzKGdiLCBsb2cycmFuZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSBnZXRfYml0cyhnYiwgbGV2ZWwgKyAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgZGNhX3N1YmZyYW1lX2hlYWRlcihEQ0FDb250ZXh0ICpzLCBpbnQgYmFzZV9jaGFubmVsLCBpbnQgYmxvY2tfaW5kZXgpCit7CisgICAgLyogUHJpbWFyeSBhdWRpbyBjb2Rpbmcgc2lkZSBpbmZvcm1hdGlvbiAqLworICAgIGludCBqLCBrOworCisgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKCFiYXNlX2NoYW5uZWwpIHsKKyAgICAgICAgcy0+c3Vic3ViZnJhbWVzW3MtPmN1cnJlbnRfc3ViZnJhbWVdICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAyKSArIDE7CisgICAgICAgIHMtPnBhcnRpYWxfc2FtcGxlc1tzLT5jdXJyZW50X3N1YmZyYW1lXSA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CisgICAgfQorCisgICAgZm9yIChqID0gYmFzZV9jaGFubmVsOyBqIDwgcy0+cHJpbV9jaGFubmVsczsgaisrKSB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5zdWJiYW5kX2FjdGl2aXR5W2pdOyBrKyspCisgICAgICAgICAgICBzLT5wcmVkaWN0aW9uX21vZGVbal1ba10gPSBnZXRfYml0cygmcy0+Z2IsIDEpOworICAgIH0KKworICAgIC8qIEdldCBwcmVkaWN0aW9uIGNvZGVib29rICovCisgICAgZm9yIChqID0gYmFzZV9jaGFubmVsOyBqIDwgcy0+cHJpbV9jaGFubmVsczsgaisrKSB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5zdWJiYW5kX2FjdGl2aXR5W2pdOyBrKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5wcmVkaWN0aW9uX21vZGVbal1ba10gPiAwKSB7CisgICAgICAgICAgICAgICAgLyogKFByZWRpY3Rpb24gY29lZmZpY2llbnQgVlEgYWRkcmVzcykgKi8KKyAgICAgICAgICAgICAgICBzLT5wcmVkaWN0aW9uX3ZxW2pdW2tdID0gZ2V0X2JpdHMoJnMtPmdiLCAxMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBCaXQgYWxsb2NhdGlvbiBpbmRleCAqLworICAgIGZvciAoaiA9IGJhc2VfY2hhbm5lbDsgaiA8IHMtPnByaW1fY2hhbm5lbHM7IGorKykgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+dnFfc3RhcnRfc3ViYmFuZFtqXTsgaysrKSB7CisgICAgICAgICAgICBpZiAocy0+Yml0YWxsb2NfaHVmZm1hbltqXSA9PSA2KQorICAgICAgICAgICAgICAgIHMtPmJpdGFsbG9jW2pdW2tdID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHMtPmJpdGFsbG9jX2h1ZmZtYW5bal0gPT0gNSkKKyAgICAgICAgICAgICAgICBzLT5iaXRhbGxvY1tqXVtrXSA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisgICAgICAgICAgICBlbHNlIGlmIChzLT5iaXRhbGxvY19odWZmbWFuW2pdID09IDcpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYml0IGFsbG9jYXRpb24gaW5kZXhcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5iaXRhbGxvY1tqXVtrXSA9CisgICAgICAgICAgICAgICAgICAgIGdldF9iaXRhbGxvYygmcy0+Z2IsICZkY2FfYml0YWxsb2NfaW5kZXgsIHMtPmJpdGFsbG9jX2h1ZmZtYW5bal0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocy0+Yml0YWxsb2Nbal1ba10gPiAyNikgeworICAgICAgICAgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICJiaXRhbGxvYyBpbmRleCBbJWldWyVpXSB0b28gYmlnICglaSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBqLCBrLCBzLT5iaXRhbGxvY1tqXVtrXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUcmFuc2l0aW9uIG1vZGUgKi8KKyAgICBmb3IgKGogPSBiYXNlX2NoYW5uZWw7IGogPCBzLT5wcmltX2NoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHMtPnN1YmJhbmRfYWN0aXZpdHlbal07IGsrKykgeworICAgICAgICAgICAgcy0+dHJhbnNpdGlvbl9tb2RlW2pdW2tdID0gMDsKKyAgICAgICAgICAgIGlmIChzLT5zdWJzdWJmcmFtZXNbcy0+Y3VycmVudF9zdWJmcmFtZV0gPiAxICYmCisgICAgICAgICAgICAgICAgayA8IHMtPnZxX3N0YXJ0X3N1YmJhbmRbal0gJiYgcy0+Yml0YWxsb2Nbal1ba10gPiAwKSB7CisgICAgICAgICAgICAgICAgcy0+dHJhbnNpdGlvbl9tb2RlW2pdW2tdID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdGFsbG9jKCZzLT5nYiwgJmRjYV90bW9kZSwgcy0+dHJhbnNpZW50X2h1ZmZtYW5bal0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgZm9yIChqID0gYmFzZV9jaGFubmVsOyBqIDwgcy0+cHJpbV9jaGFubmVsczsgaisrKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90ICpzY2FsZV90YWJsZTsKKyAgICAgICAgaW50IHNjYWxlX3N1bSwgbG9nX3NpemU7CisKKyAgICAgICAgbWVtc2V0KHMtPnNjYWxlX2ZhY3RvcltqXSwgMCwKKyAgICAgICAgICAgICAgIHMtPnN1YmJhbmRfYWN0aXZpdHlbal0gKiBzaXplb2Yocy0+c2NhbGVfZmFjdG9yWzBdWzBdWzBdKSAqIDIpOworCisgICAgICAgIGlmIChzLT5zY2FsZWZhY3Rvcl9odWZmbWFuW2pdID09IDYpIHsKKyAgICAgICAgICAgIHNjYWxlX3RhYmxlID0gc2NhbGVfZmFjdG9yX3F1YW50NzsKKyAgICAgICAgICAgIGxvZ19zaXplICAgID0gNzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNjYWxlX3RhYmxlID0gc2NhbGVfZmFjdG9yX3F1YW50NjsKKyAgICAgICAgICAgIGxvZ19zaXplICAgID0gNjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFdoZW4gaHVmZm1hbiBjb2RlZCwgb25seSB0aGUgZGlmZmVyZW5jZSBpcyBlbmNvZGVkICovCisgICAgICAgIHNjYWxlX3N1bSA9IDA7CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHMtPnN1YmJhbmRfYWN0aXZpdHlbal07IGsrKykgeworICAgICAgICAgICAgaWYgKGsgPj0gcy0+dnFfc3RhcnRfc3ViYmFuZFtqXSB8fCBzLT5iaXRhbGxvY1tqXVtrXSA+IDApIHsKKyAgICAgICAgICAgICAgICBzY2FsZV9zdW0gPSBnZXRfc2NhbGUoJnMtPmdiLCBzLT5zY2FsZWZhY3Rvcl9odWZmbWFuW2pdLCBzY2FsZV9zdW0sIGxvZ19zaXplKTsKKyAgICAgICAgICAgICAgICBzLT5zY2FsZV9mYWN0b3Jbal1ba11bMF0gPSBzY2FsZV90YWJsZVtzY2FsZV9zdW1dOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoayA8IHMtPnZxX3N0YXJ0X3N1YmJhbmRbal0gJiYgcy0+dHJhbnNpdGlvbl9tb2RlW2pdW2tdKSB7CisgICAgICAgICAgICAgICAgLyogR2V0IHNlY29uZCBzY2FsZSBmYWN0b3IgKi8KKyAgICAgICAgICAgICAgICBzY2FsZV9zdW0gPSBnZXRfc2NhbGUoJnMtPmdiLCBzLT5zY2FsZWZhY3Rvcl9odWZmbWFuW2pdLCBzY2FsZV9zdW0sIGxvZ19zaXplKTsKKyAgICAgICAgICAgICAgICBzLT5zY2FsZV9mYWN0b3Jbal1ba11bMV0gPSBzY2FsZV90YWJsZVtzY2FsZV9zdW1dOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogSm9pbnQgc3ViYmFuZCBzY2FsZSBmYWN0b3IgY29kZWJvb2sgc2VsZWN0ICovCisgICAgZm9yIChqID0gYmFzZV9jaGFubmVsOyBqIDwgcy0+cHJpbV9jaGFubmVsczsgaisrKSB7CisgICAgICAgIC8qIFRyYW5zbWl0dGVkIG9ubHkgaWYgam9pbnQgc3ViYmFuZCBjb2RpbmcgZW5hYmxlZCAqLworICAgICAgICBpZiAocy0+am9pbnRfaW50ZW5zaXR5W2pdID4gMCkKKyAgICAgICAgICAgIHMtPmpvaW50X2h1ZmZbal0gPSBnZXRfYml0cygmcy0+Z2IsIDMpOworICAgIH0KKworICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIFNjYWxlIGZhY3RvcnMgZm9yIGpvaW50IHN1YmJhbmQgY29kaW5nICovCisgICAgZm9yIChqID0gYmFzZV9jaGFubmVsOyBqIDwgcy0+cHJpbV9jaGFubmVsczsgaisrKSB7CisgICAgICAgIGludCBzb3VyY2VfY2hhbm5lbDsKKworICAgICAgICAvKiBUcmFuc21pdHRlZCBvbmx5IGlmIGpvaW50IHN1YmJhbmQgY29kaW5nIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKHMtPmpvaW50X2ludGVuc2l0eVtqXSA+IDApIHsKKyAgICAgICAgICAgIGludCBzY2FsZSA9IDA7CisgICAgICAgICAgICBzb3VyY2VfY2hhbm5lbCA9IHMtPmpvaW50X2ludGVuc2l0eVtqXSAtIDE7CisKKyAgICAgICAgICAgIC8qIFdoZW4gaHVmZm1hbiBjb2RlZCwgb25seSB0aGUgZGlmZmVyZW5jZSBpcyBlbmNvZGVkCisgICAgICAgICAgICAgKiAoaXMgdGhpcyB2YWxpZCBhcyB3ZWxsIGZvciBqb2ludCBzY2FsZXMgPz8/KSAqLworCisgICAgICAgICAgICBmb3IgKGsgPSBzLT5zdWJiYW5kX2FjdGl2aXR5W2pdOyBrIDwgcy0+c3ViYmFuZF9hY3Rpdml0eVtzb3VyY2VfY2hhbm5lbF07IGsrKykgeworICAgICAgICAgICAgICAgIHNjYWxlID0gZ2V0X3NjYWxlKCZzLT5nYiwgcy0+am9pbnRfaHVmZltqXSwgNjQgLyogYmlhcyAqLywgNyk7CisgICAgICAgICAgICAgICAgcy0+am9pbnRfc2NhbGVfZmFjdG9yW2pdW2tdID0gc2NhbGU7ICAgIC8qam9pbnRfc2NhbGVfdGFibGVbc2NhbGVdOyAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIShzLT5kZWJ1Z19mbGFnICYgMHgwMikpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgIkpvaW50IHN0ZXJlbyBjb2Rpbmcgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICAgICAgcy0+ZGVidWdfZmxhZyB8PSAweDAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogRHluYW1pYyByYW5nZSBjb2VmZmljaWVudCAqLworICAgIGlmICghYmFzZV9jaGFubmVsICYmIHMtPmR5bnJhbmdlKQorICAgICAgICBzLT5keW5yYW5nZV9jb2VmID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKworICAgIC8qIFNpZGUgaW5mb3JtYXRpb24gQ1JDIGNoZWNrIHdvcmQgKi8KKyAgICBpZiAocy0+Y3JjX3ByZXNlbnQpIHsKKyAgICAgICAgZ2V0X2JpdHMoJnMtPmdiLCAxNik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQcmltYXJ5IGF1ZGlvIGRhdGEgYXJyYXlzCisgICAgICovCisKKyAgICAvKiBWUSBlbmNvZGVkIGhpZ2ggZnJlcXVlbmN5IHN1YmJhbmRzICovCisgICAgZm9yIChqID0gYmFzZV9jaGFubmVsOyBqIDwgcy0+cHJpbV9jaGFubmVsczsgaisrKQorICAgICAgICBmb3IgKGsgPSBzLT52cV9zdGFydF9zdWJiYW5kW2pdOyBrIDwgcy0+c3ViYmFuZF9hY3Rpdml0eVtqXTsgaysrKQorICAgICAgICAgICAgLyogMSB2ZWN0b3IgLT4gMzIgc2FtcGxlcyAqLworICAgICAgICAgICAgcy0+aGlnaF9mcmVxX3ZxW2pdW2tdID0gZ2V0X2JpdHMoJnMtPmdiLCAxMCk7CisKKyAgICAvKiBMb3cgZnJlcXVlbmN5IGVmZmVjdCBkYXRhICovCisgICAgaWYgKCFiYXNlX2NoYW5uZWwgJiYgcy0+bGZlKSB7CisgICAgICAgIGludCBxdWFudDc7CisgICAgICAgIC8qIExGRSBzYW1wbGVzICovCisgICAgICAgIGludCBsZmVfc2FtcGxlcyAgICA9IDIgKiBzLT5sZmUgKiAoNCArIGJsb2NrX2luZGV4KTsKKyAgICAgICAgaW50IGxmZV9lbmRfc2FtcGxlID0gMiAqIHMtPmxmZSAqICg0ICsgYmxvY2tfaW5kZXggKyBzLT5zdWJzdWJmcmFtZXNbcy0+Y3VycmVudF9zdWJmcmFtZV0pOworICAgICAgICBmbG9hdCBsZmVfc2NhbGU7CisKKyAgICAgICAgZm9yIChqID0gbGZlX3NhbXBsZXM7IGogPCBsZmVfZW5kX3NhbXBsZTsgaisrKSB7CisgICAgICAgICAgICAvKiBTaWduZWQgOCBiaXRzIGludCAqLworICAgICAgICAgICAgcy0+bGZlX2RhdGFbal0gPSBnZXRfc2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNjYWxlIGZhY3RvciBpbmRleCAqLworICAgICAgICBxdWFudDcgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICBpZiAocXVhbnQ3ID4gMTI3KSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJMRkVTY2FsZUluZGV4IGxhcmdlciB0aGFuIDEyNyIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgcy0+bGZlX3NjYWxlX2ZhY3RvciA9IHNjYWxlX2ZhY3Rvcl9xdWFudDdbcXVhbnQ3XTsKKworICAgICAgICAvKiBRdWFudGl6YXRpb24gc3RlcCBzaXplICogc2NhbGUgZmFjdG9yICovCisgICAgICAgIGxmZV9zY2FsZSA9IDAuMDM1ICogcy0+bGZlX3NjYWxlX2ZhY3RvcjsKKworICAgICAgICBmb3IgKGogPSBsZmVfc2FtcGxlczsgaiA8IGxmZV9lbmRfc2FtcGxlOyBqKyspCisgICAgICAgICAgICBzLT5sZmVfZGF0YVtqXSAqPSBsZmVfc2NhbGU7CisgICAgfQorCisjaWZkZWYgVFJBQ0UKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInN1YnN1YmZyYW1lczogJWlcbiIsCisgICAgICAgICAgIHMtPnN1YnN1YmZyYW1lc1tzLT5jdXJyZW50X3N1YmZyYW1lXSk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJwYXJ0aWFsIHNhbXBsZXM6ICVpXG4iLAorICAgICAgICAgICBzLT5wYXJ0aWFsX3NhbXBsZXNbcy0+Y3VycmVudF9zdWJmcmFtZV0pOworCisgICAgZm9yIChqID0gYmFzZV9jaGFubmVsOyBqIDwgcy0+cHJpbV9jaGFubmVsczsgaisrKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicHJlZGljdGlvbiBtb2RlOiIpOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+c3ViYmFuZF9hY3Rpdml0eVtqXTsgaysrKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICIgJWkiLCBzLT5wcmVkaWN0aW9uX21vZGVbal1ba10pOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7CisgICAgfQorICAgIGZvciAoaiA9IGJhc2VfY2hhbm5lbDsgaiA8IHMtPnByaW1fY2hhbm5lbHM7IGorKykgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+c3ViYmFuZF9hY3Rpdml0eVtqXTsgaysrKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgInByZWRpY3Rpb24gY29lZnM6ICVmLCAlZiwgJWYsICVmXG4iLAorICAgICAgICAgICAgICAgICAgIChmbG9hdCkgYWRwY21fdmJbcy0+cHJlZGljdGlvbl92cVtqXVtrXV1bMF0gLyA4MTkyLAorICAgICAgICAgICAgICAgICAgIChmbG9hdCkgYWRwY21fdmJbcy0+cHJlZGljdGlvbl92cVtqXVtrXV1bMV0gLyA4MTkyLAorICAgICAgICAgICAgICAgICAgIChmbG9hdCkgYWRwY21fdmJbcy0+cHJlZGljdGlvbl92cVtqXVtrXV1bMl0gLyA4MTkyLAorICAgICAgICAgICAgICAgICAgIChmbG9hdCkgYWRwY21fdmJbcy0+cHJlZGljdGlvbl92cVtqXVtrXV1bM10gLyA4MTkyKTsKKyAgICB9CisgICAgZm9yIChqID0gYmFzZV9jaGFubmVsOyBqIDwgcy0+cHJpbV9jaGFubmVsczsgaisrKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiYml0YWxsb2MgaW5kZXg6ICIpOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+dnFfc3RhcnRfc3ViYmFuZFtqXTsgaysrKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICIlMi4yaSAiLCBzLT5iaXRhbGxvY1tqXVtrXSk7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKKyAgICB9CisgICAgZm9yIChqID0gYmFzZV9jaGFubmVsOyBqIDwgcy0+cHJpbV9jaGFubmVsczsgaisrKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVHJhbnNpdGlvbiBtb2RlOiIpOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+c3ViYmFuZF9hY3Rpdml0eVtqXTsgaysrKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICIgJWkiLCBzLT50cmFuc2l0aW9uX21vZGVbal1ba10pOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7CisgICAgfQorICAgIGZvciAoaiA9IGJhc2VfY2hhbm5lbDsgaiA8IHMtPnByaW1fY2hhbm5lbHM7IGorKykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlNjYWxlIGZhY3RvcjoiKTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHMtPnN1YmJhbmRfYWN0aXZpdHlbal07IGsrKykgeworICAgICAgICAgICAgaWYgKGsgPj0gcy0+dnFfc3RhcnRfc3ViYmFuZFtqXSB8fCBzLT5iaXRhbGxvY1tqXVtrXSA+IDApCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICIgJWkiLCBzLT5zY2FsZV9mYWN0b3Jbal1ba11bMF0pOworICAgICAgICAgICAgaWYgKGsgPCBzLT52cV9zdGFydF9zdWJiYW5kW2pdICYmIHMtPnRyYW5zaXRpb25fbW9kZVtqXVtrXSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIiAlaSh0KSIsIHMtPnNjYWxlX2ZhY3RvcltqXVtrXVsxXSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgIH0KKyAgICBmb3IgKGogPSBiYXNlX2NoYW5uZWw7IGogPCBzLT5wcmltX2NoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgaWYgKHMtPmpvaW50X2ludGVuc2l0eVtqXSA+IDApIHsKKyAgICAgICAgICAgIGludCBzb3VyY2VfY2hhbm5lbCA9IHMtPmpvaW50X2ludGVuc2l0eVtqXSAtIDE7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkpvaW50IHNjYWxlIGZhY3RvciBpbmRleDpcbiIpOworICAgICAgICAgICAgZm9yIChrID0gcy0+c3ViYmFuZF9hY3Rpdml0eVtqXTsgayA8IHMtPnN1YmJhbmRfYWN0aXZpdHlbc291cmNlX2NoYW5uZWxdOyBrKyspCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICIgJWkiLCBzLT5qb2ludF9zY2FsZV9mYWN0b3Jbal1ba10pOworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaiA9IGJhc2VfY2hhbm5lbDsgaiA8IHMtPnByaW1fY2hhbm5lbHM7IGorKykKKyAgICAgICAgZm9yIChrID0gcy0+dnFfc3RhcnRfc3ViYmFuZFtqXTsgayA8IHMtPnN1YmJhbmRfYWN0aXZpdHlbal07IGsrKykKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVlEgaW5kZXg6ICVpXG4iLCBzLT5oaWdoX2ZyZXFfdnFbal1ba10pOworICAgIGlmICghYmFzZV9jaGFubmVsICYmIHMtPmxmZSkgeworICAgICAgICBpbnQgbGZlX3NhbXBsZXMgICAgPSAyICogcy0+bGZlICogKDQgKyBibG9ja19pbmRleCk7CisgICAgICAgIGludCBsZmVfZW5kX3NhbXBsZSA9IDIgKiBzLT5sZmUgKiAoNCArIGJsb2NrX2luZGV4ICsgcy0+c3Vic3ViZnJhbWVzW3MtPmN1cnJlbnRfc3ViZnJhbWVdKTsKKworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkxGRSBzYW1wbGVzOlxuIik7CisgICAgICAgIGZvciAoaiA9IGxmZV9zYW1wbGVzOyBqIDwgbGZlX2VuZF9zYW1wbGU7IGorKykKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiICVmIiwgcy0+bGZlX2RhdGFbal0pOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcW1mXzMyX3N1YmJhbmRzKERDQUNvbnRleHQgKnMsIGludCBjaGFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzYW1wbGVzX2luWzMyXVs4XSwgZmxvYXQgKnNhbXBsZXNfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlKQoreworICAgIGNvbnN0IGZsb2F0ICpwckNvZWZmOworCisgICAgaW50IHNiX2FjdCA9IHMtPnN1YmJhbmRfYWN0aXZpdHlbY2hhbnNdOworCisgICAgc2NhbGUgKj0gc3FydCgxIC8gOC4wKTsKKworICAgIC8qIFNlbGVjdCBmaWx0ZXIgKi8KKyAgICBpZiAoIXMtPm11bHRpcmF0ZV9pbnRlcikgICAgLyogTm9uLXBlcmZlY3QgcmVjb25zdHJ1Y3Rpb24gKi8KKyAgICAgICAgcHJDb2VmZiA9IGZpcl8zMmJhbmRzX25vbnBlcmZlY3Q7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmZlY3QgcmVjb25zdHJ1Y3Rpb24gKi8KKyAgICAgICAgcHJDb2VmZiA9IGZpcl8zMmJhbmRzX3BlcmZlY3Q7CisKKyAgICBzLT5kY2Fkc3AucW1mXzMyX3N1YmJhbmRzKHNhbXBsZXNfaW4sIHNiX2FjdCwgJnMtPnN5bnRoLCAmcy0+aW1kY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdWJiYW5kX2Zpcl9oaXN0W2NoYW5zXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5oaXN0X2luZGV4W2NoYW5zXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN1YmJhbmRfZmlyX25vaWRlYVtjaGFuc10sIHByQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzX291dCwgcy0+cmFYaW4sIHNjYWxlKTsKK30KKworc3RhdGljIHZvaWQgbGZlX2ludGVycG9sYXRpb25fZmlyKERDQUNvbnRleHQgKnMsIGludCBkZWNpbWF0aW9uX3NlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2RlY2lfc2FtcGxlLCBmbG9hdCAqc2FtcGxlc19pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqc2FtcGxlc19vdXQpCit7CisgICAgLyogc2FtcGxlc19pbjogQW4gYXJyYXkgaG9sZGluZyBkZWNpbWF0ZWQgc2FtcGxlcy4KKyAgICAgKiAgIFNhbXBsZXMgaW4gY3VycmVudCBzdWJmcmFtZSBzdGFydHMgZnJvbSBzYW1wbGVzX2luWzBdLAorICAgICAqICAgd2hpbGUgc2FtcGxlc19pblstMV0sIHNhbXBsZXNfaW5bLTJdLCAuLi4sIHN0b3JlcyBzYW1wbGVzCisgICAgICogICBmcm9tIGxhc3Qgc3ViZnJhbWUgYXMgaGlzdG9yeS4KKyAgICAgKgorICAgICAqIHNhbXBsZXNfb3V0OiBBbiBhcnJheSBob2xkaW5nIGludGVycG9sYXRlZCBzYW1wbGVzCisgICAgICovCisKKyAgICBpbnQgaWR4OworICAgIGNvbnN0IGZsb2F0ICpwckNvZWZmOworICAgIGludCBkZWNpaW5kZXg7CisKKyAgICAvKiBTZWxlY3QgZGVjaW1hdGlvbiBmaWx0ZXIgKi8KKyAgICBpZiAoZGVjaW1hdGlvbl9zZWxlY3QgPT0gMSkgeworICAgICAgICBpZHggICAgID0gMTsKKyAgICAgICAgcHJDb2VmZiA9IGxmZV9maXJfMTI4OworICAgIH0gZWxzZSB7CisgICAgICAgIGlkeCAgICAgPSAwOworICAgICAgICBwckNvZWZmID0gbGZlX2Zpcl82NDsKKyAgICB9CisgICAgLyogSW50ZXJwb2xhdGlvbiAqLworICAgIGZvciAoZGVjaWluZGV4ID0gMDsgZGVjaWluZGV4IDwgbnVtX2RlY2lfc2FtcGxlOyBkZWNpaW5kZXgrKykgeworICAgICAgICBzLT5kY2Fkc3AubGZlX2ZpcltpZHhdKHNhbXBsZXNfb3V0LCBzYW1wbGVzX2luLCBwckNvZWZmKTsKKyAgICAgICAgc2FtcGxlc19pbisrOworICAgICAgICBzYW1wbGVzX291dCArPSAyICogMzIgKiAoMSArIGlkeCk7CisgICAgfQorfQorCisvKiBkb3dubWl4aW5nIHJvdXRpbmVzICovCisjZGVmaW5lIE1JWF9SRUFSMShzYW1wbGVzLCBzMSwgcnMsIGNvZWYpICAgICAgICAgICAgXAorICAgIHNhbXBsZXNbMF1baV0gKz0gc2FtcGxlc1tzMV1baV0gKiBjb2VmW3JzXVswXTsgIFwKKyAgICBzYW1wbGVzWzFdW2ldICs9IHNhbXBsZXNbczFdW2ldICogY29lZltyc11bMV07CisKKyNkZWZpbmUgTUlYX1JFQVIyKHNhbXBsZXMsIHMxLCBzMiwgcnMsIGNvZWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNhbXBsZXNbMF1baV0gKz0gc2FtcGxlc1tzMV1baV0gKiBjb2VmW3JzXVswXSArIHNhbXBsZXNbczJdW2ldICogY29lZltycyArIDFdWzBdOyBcCisgICAgc2FtcGxlc1sxXVtpXSArPSBzYW1wbGVzW3MxXVtpXSAqIGNvZWZbcnNdWzFdICsgc2FtcGxlc1tzMl1baV0gKiBjb2VmW3JzICsgMV1bMV07CisKKyNkZWZpbmUgTUlYX0ZST05UMyhzYW1wbGVzLCBjb2VmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQgPSBzYW1wbGVzW2NdW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdSA9IHNhbXBsZXNbbF1baV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ID0gc2FtcGxlc1tyXVtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNhbXBsZXNbMF1baV0gPSB0ICogY29lZlswXVswXSArIHUgKiBjb2VmWzFdWzBdICsgdiAqIGNvZWZbMl1bMF07ICBcCisgICAgc2FtcGxlc1sxXVtpXSA9IHQgKiBjb2VmWzBdWzFdICsgdSAqIGNvZWZbMV1bMV0gKyB2ICogY29lZlsyXVsxXTsKKworI2RlZmluZSBET1dOTUlYX1RPX1NURVJFTyhvcDEsIG9wMikgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICBvcDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvcDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworc3RhdGljIHZvaWQgZGNhX2Rvd25taXgoZmxvYXQgKipzYW1wbGVzLCBpbnQgc3JjZm10LCBpbnQgbGZlX3ByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjb2VmW0RDQV9QUklNX0NIQU5ORUxTX01BWCArIDFdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpjaGFubmVsX21hcHBpbmcpCit7CisgICAgaW50IGMsIGwsIHIsIHNsLCBzciwgczsKKyAgICBpbnQgaTsKKyAgICBmbG9hdCB0LCB1LCB2OworCisgICAgc3dpdGNoIChzcmNmbXQpIHsKKyAgICBjYXNlIERDQV9NT05POgorICAgIGNhc2UgRENBXzRGMlI6CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJOb3QgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEQ0FfQ0hBTk5FTDoKKyAgICBjYXNlIERDQV9TVEVSRU86CisgICAgY2FzZSBEQ0FfU1RFUkVPX1RPVEFMOgorICAgIGNhc2UgRENBX1NURVJFT19TVU1ESUZGOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIERDQV8zRjoKKyAgICAgICAgYyA9IGNoYW5uZWxfbWFwcGluZ1swXTsKKyAgICAgICAgbCA9IGNoYW5uZWxfbWFwcGluZ1sxXTsKKyAgICAgICAgciA9IGNoYW5uZWxfbWFwcGluZ1syXTsKKyAgICAgICAgRE9XTk1JWF9UT19TVEVSRU8oTUlYX0ZST05UMyhzYW1wbGVzLCBjb2VmKSwgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEQ0FfMkYxUjoKKyAgICAgICAgcyA9IGNoYW5uZWxfbWFwcGluZ1syXTsKKyAgICAgICAgRE9XTk1JWF9UT19TVEVSRU8oTUlYX1JFQVIxKHNhbXBsZXMsIHMsIDIsIGNvZWYpLCApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERDQV8zRjFSOgorICAgICAgICBjID0gY2hhbm5lbF9tYXBwaW5nWzBdOworICAgICAgICBsID0gY2hhbm5lbF9tYXBwaW5nWzFdOworICAgICAgICByID0gY2hhbm5lbF9tYXBwaW5nWzJdOworICAgICAgICBzID0gY2hhbm5lbF9tYXBwaW5nWzNdOworICAgICAgICBET1dOTUlYX1RPX1NURVJFTyhNSVhfRlJPTlQzKHNhbXBsZXMsIGNvZWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfUkVBUjEoc2FtcGxlcywgcywgMywgY29lZikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERDQV8yRjJSOgorICAgICAgICBzbCA9IGNoYW5uZWxfbWFwcGluZ1syXTsKKyAgICAgICAgc3IgPSBjaGFubmVsX21hcHBpbmdbM107CisgICAgICAgIERPV05NSVhfVE9fU1RFUkVPKE1JWF9SRUFSMihzYW1wbGVzLCBzbCwgc3IsIDIsIGNvZWYpLCApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERDQV8zRjJSOgorICAgICAgICBjICA9IGNoYW5uZWxfbWFwcGluZ1swXTsKKyAgICAgICAgbCAgPSBjaGFubmVsX21hcHBpbmdbMV07CisgICAgICAgIHIgID0gY2hhbm5lbF9tYXBwaW5nWzJdOworICAgICAgICBzbCA9IGNoYW5uZWxfbWFwcGluZ1szXTsKKyAgICAgICAgc3IgPSBjaGFubmVsX21hcHBpbmdbNF07CisgICAgICAgIERPV05NSVhfVE9fU1RFUkVPKE1JWF9GUk9OVDMoc2FtcGxlcywgY29lZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9SRUFSMihzYW1wbGVzLCBzbCwgc3IsIDMsIGNvZWYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChsZmVfcHJlc2VudCkgeworICAgICAgICBpbnQgbGZfYnVmID0gZGNhX2xmZV9pbmRleFtzcmNmbXRdOworICAgICAgICBpbnQgbGZfaWR4ID0gIGRjYV9jaGFubmVsc1tzcmNmbXRdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICAgIHNhbXBsZXNbMF1baV0gKz0gc2FtcGxlc1tsZl9idWZdW2ldICogY29lZltsZl9pZHhdWzBdOworICAgICAgICAgICAgc2FtcGxlc1sxXVtpXSArPSBzYW1wbGVzW2xmX2J1Zl1baV0gKiBjb2VmW2xmX2lkeF1bMV07CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZm5kZWYgZGVjb2RlX2Jsb2NrY29kZXMKKy8qIFZlcnkgY29tcGFjdCB2ZXJzaW9uIG9mIHRoZSBibG9jayBjb2RlIGRlY29kZXIgdGhhdCBkb2VzIG5vdCB1c2UgdGFibGUKKyAqIGxvb2stdXAgYnV0IGlzIHNsaWdodGx5IHNsb3dlciAqLworc3RhdGljIGludCBkZWNvZGVfYmxvY2tjb2RlKGludCBjb2RlLCBpbnQgbGV2ZWxzLCBpbnQzMl90ICp2YWx1ZXMpCit7CisgICAgaW50IGk7CisgICAgaW50IG9mZnNldCA9IChsZXZlbHMgLSAxKSA+PiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpbnQgZGl2ID0gRkFTVERJVihjb2RlLCBsZXZlbHMpOworICAgICAgICB2YWx1ZXNbaV0gPSBjb2RlIC0gb2Zmc2V0IC0gZGl2ICogbGV2ZWxzOworICAgICAgICBjb2RlICAgICAgPSBkaXY7CisgICAgfQorCisgICAgcmV0dXJuIGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2Jsb2NrY29kZXMoaW50IGNvZGUxLCBpbnQgY29kZTIsIGludCBsZXZlbHMsIGludDMyX3QgKnZhbHVlcykKK3sKKyAgICByZXR1cm4gZGVjb2RlX2Jsb2NrY29kZShjb2RlMSwgbGV2ZWxzLCB2YWx1ZXMpIHwKKyAgICAgICAgICAgZGVjb2RlX2Jsb2NrY29kZShjb2RlMiwgbGV2ZWxzLCB2YWx1ZXMgKyA0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdWludDhfdCBhYml0c19zaXplc1s3XSAgPSB7IDcsIDEwLCAxMiwgMTMsIDE1LCAxNywgMTkgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGFiaXRzX2xldmVsc1s3XSA9IHsgMywgIDUsICA3LCAgOSwgMTMsIDE3LCAyNSB9OworCitzdGF0aWMgaW50IGRjYV9zdWJzdWJmcmFtZShEQ0FDb250ZXh0ICpzLCBpbnQgYmFzZV9jaGFubmVsLCBpbnQgYmxvY2tfaW5kZXgpCit7CisgICAgaW50IGssIGw7CisgICAgaW50IHN1YnN1YmZyYW1lID0gcy0+Y3VycmVudF9zdWJzdWJmcmFtZTsKKworICAgIGNvbnN0IGZsb2F0ICpxdWFudF9zdGVwX3RhYmxlOworCisgICAgLyogRklYTUUgKi8KKyAgICBmbG9hdCAoKnN1YmJhbmRfc2FtcGxlcylbRENBX1NVQkJBTkRTXVs4XSA9IHMtPnN1YmJhbmRfc2FtcGxlc1tibG9ja19pbmRleF07CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQzMl90LCBibG9jaywgWzggKiBEQ0FfU1VCQkFORFNdKTsKKworICAgIC8qCisgICAgICogQXVkaW8gZGF0YQorICAgICAqLworCisgICAgLyogU2VsZWN0IHF1YW50aXphdGlvbiBzdGVwIHNpemUgdGFibGUgKi8KKyAgICBpZiAocy0+Yml0X3JhdGVfaW5kZXggPT0gMHgxZikKKyAgICAgICAgcXVhbnRfc3RlcF90YWJsZSA9IGxvc3NsZXNzX3F1YW50X2Q7CisgICAgZWxzZQorICAgICAgICBxdWFudF9zdGVwX3RhYmxlID0gbG9zc3lfcXVhbnRfZDsKKworICAgIGZvciAoayA9IGJhc2VfY2hhbm5lbDsgayA8IHMtPnByaW1fY2hhbm5lbHM7IGsrKykgeworICAgICAgICBmbG9hdCByc2NhbGVbRENBX1NVQkJBTkRTXTsKKworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGZvciAobCA9IDA7IGwgPCBzLT52cV9zdGFydF9zdWJiYW5kW2tdOyBsKyspIHsKKyAgICAgICAgICAgIGludCBtOworCisgICAgICAgICAgICAvKiBTZWxlY3QgdGhlIG1pZC10cmVhZCBsaW5lYXIgcXVhbnRpemVyICovCisgICAgICAgICAgICBpbnQgYWJpdHMgPSBzLT5iaXRhbGxvY1trXVtsXTsKKworICAgICAgICAgICAgZmxvYXQgcXVhbnRfc3RlcF9zaXplID0gcXVhbnRfc3RlcF90YWJsZVthYml0c107CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEZXRlcm1pbmUgcXVhbnRpemF0aW9uIGluZGV4IGNvZGUgYm9vayBhbmQgaXRzIHR5cGUKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvKiBTZWxlY3QgcXVhbnRpemF0aW9uIGluZGV4IGNvZGUgYm9vayAqLworICAgICAgICAgICAgaW50IHNlbCA9IHMtPnF1YW50X2luZGV4X2h1ZmZtYW5ba11bYWJpdHNdOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRXh0cmFjdCBiaXRzIGZyb20gdGhlIGJpdCBzdHJlYW0KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFhYml0cykgeworICAgICAgICAgICAgICAgIHJzY2FsZVtsXSA9IDA7CisgICAgICAgICAgICAgICAgbWVtc2V0KGJsb2NrICsgOCAqIGwsIDAsIDggKiBzaXplb2YoYmxvY2tbMF0pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogRGVhbCB3aXRoIHRyYW5zaWVudHMgKi8KKyAgICAgICAgICAgICAgICBpbnQgc2ZpID0gcy0+dHJhbnNpdGlvbl9tb2RlW2tdW2xdICYmIHN1YnN1YmZyYW1lID49IHMtPnRyYW5zaXRpb25fbW9kZVtrXVtsXTsKKyAgICAgICAgICAgICAgICByc2NhbGVbbF0gPSBxdWFudF9zdGVwX3NpemUgKiBzLT5zY2FsZV9mYWN0b3Jba11bbF1bc2ZpXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2NhbGVmYWN0b3JfYWRqW2tdW3NlbF07CisKKyAgICAgICAgICAgICAgICBpZiAoYWJpdHMgPj0gMTEgfHwgIWRjYV9zbXBsX2JpdGFsbG9jW2FiaXRzXS52bGNbc2VsXS50YWJsZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWJpdHMgPD0gNykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2sgY29kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX2NvZGUxLCBibG9ja19jb2RlMiwgc2l6ZSwgbGV2ZWxzLCBlcnI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgICA9IGFiaXRzX3NpemVzW2FiaXRzIC0gMV07CisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBhYml0c19sZXZlbHNbYWJpdHMgLSAxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfY29kZTEgPSBnZXRfYml0cygmcy0+Z2IsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfY29kZTIgPSBnZXRfYml0cygmcy0+Z2IsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyICAgICAgICAgPSBkZWNvZGVfYmxvY2tjb2RlcyhibG9ja19jb2RlMSwgYmxvY2tfY29kZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscywgYmxvY2sgKyA4ICogbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFUlJPUjogYmxvY2sgY29kZSBsb29rLXVwIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBjb2RpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCA4OyBtKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbOCAqIGwgKyBtXSA9IGdldF9zYml0cygmcy0+Z2IsIGFiaXRzIC0gMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBIdWZmbWFuIGNvZGVkICovCisgICAgICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCA4OyBtKyspCisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1s4ICogbCArIG1dID0gZ2V0X2JpdGFsbG9jKCZzLT5nYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRjYV9zbXBsX2JpdGFsbG9jW2FiaXRzXSwgc2VsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzLT5mbXRfY29udi5pbnQzMl90b19mbG9hdF9mbXVsX2FycmF5OCgmcy0+Zm10X2NvbnYsIHN1YmJhbmRfc2FtcGxlc1trXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssIHJzY2FsZSwgOCAqIHMtPnZxX3N0YXJ0X3N1YmJhbmRba10pOworCisgICAgICAgIGZvciAobCA9IDA7IGwgPCBzLT52cV9zdGFydF9zdWJiYW5kW2tdOyBsKyspIHsKKyAgICAgICAgICAgIGludCBtOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEludmVyc2UgQURQQ00gaWYgaW4gcHJlZGljdGlvbiBtb2RlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzLT5wcmVkaWN0aW9uX21vZGVba11bbF0pIHsKKyAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICBpZiAocy0+cHJlZGljdG9yX2hpc3RvcnkpCisgICAgICAgICAgICAgICAgICAgIHN1YmJhbmRfc2FtcGxlc1trXVtsXVswXSArPSAoYWRwY21fdmJbcy0+cHJlZGljdGlvbl92cVtrXVtsXV1bMF0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN1YmJhbmRfc2FtcGxlc19oaXN0W2tdW2xdWzNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHBjbV92YltzLT5wcmVkaWN0aW9uX3ZxW2tdW2xdXVsxXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3ViYmFuZF9zYW1wbGVzX2hpc3Rba11bbF1bMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkcGNtX3ZiW3MtPnByZWRpY3Rpb25fdnFba11bbF1dWzJdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdWJiYW5kX3NhbXBsZXNfaGlzdFtrXVtsXVsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRwY21fdmJbcy0+cHJlZGljdGlvbl92cVtrXVtsXV1bM10gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN1YmJhbmRfc2FtcGxlc19oaXN0W2tdW2xdWzBdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMS4wZiAvIDgxOTIpOworICAgICAgICAgICAgICAgIGZvciAobSA9IDE7IG0gPCA4OyBtKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3VtID0gYWRwY21fdmJbcy0+cHJlZGljdGlvbl92cVtrXVtsXV1bMF0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJiYW5kX3NhbXBsZXNba11bbF1bbSAtIDFdOworICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAyOyBuIDw9IDQ7IG4rKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtID49IG4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGFkcGNtX3ZiW3MtPnByZWRpY3Rpb25fdnFba11bbF1dW24gLSAxXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmJhbmRfc2FtcGxlc1trXVtsXVttIC0gbl07CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzLT5wcmVkaWN0b3JfaGlzdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYWRwY21fdmJbcy0+cHJlZGljdGlvbl92cVtrXVtsXV1bbiAtIDFdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3ViYmFuZF9zYW1wbGVzX2hpc3Rba11bbF1bbSAtIG4gKyA0XTsKKyAgICAgICAgICAgICAgICAgICAgc3ViYmFuZF9zYW1wbGVzW2tdW2xdW21dICs9IHN1bSAqICgxLjBmIC8gODE5Mik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRGVjb2RlIFZRIGVuY29kZWQgaGlnaCBmcmVxdWVuY2llcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPnN1YmJhbmRfYWN0aXZpdHlba10gPiBzLT52cV9zdGFydF9zdWJiYW5kW2tdKSB7CisgICAgICAgICAgICBpZiAoIShzLT5kZWJ1Z19mbGFnICYgMHgwMSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgIlN0cmVhbSB3aXRoIGhpZ2ggZnJlcXVlbmNpZXMgVlEgY29kaW5nXG4iKTsKKyAgICAgICAgICAgICAgICBzLT5kZWJ1Z19mbGFnIHw9IDB4MDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5kY2Fkc3AuZGVjb2RlX2hmKHN1YmJhbmRfc2FtcGxlc1trXSwgcy0+aGlnaF9mcmVxX3ZxW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoX2ZyZXFfdnEsIHN1YnN1YmZyYW1lICogOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2NhbGVfZmFjdG9yW2tdLCBzLT52cV9zdGFydF9zdWJiYW5kW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdWJiYW5kX2FjdGl2aXR5W2tdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIGZvciBEU1lOQyBhZnRlciBzdWJzdWJmcmFtZSAqLworICAgIGlmIChzLT5hc3BmIHx8IHN1YnN1YmZyYW1lID09IHMtPnN1YnN1YmZyYW1lc1tzLT5jdXJyZW50X3N1YmZyYW1lXSAtIDEpIHsKKyAgICAgICAgaWYgKDB4RkZGRiA9PSBnZXRfYml0cygmcy0+Z2IsIDE2KSkgeyAgIC8qIDB4RkZGRiAqLworI2lmZGVmIFRSQUNFCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkdvdCBzdWJmcmFtZSBEU1lOQ1xuIik7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGlkbid0IGdldCBzdWJmcmFtZSBEU1lOQ1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEJhY2t1cCBwcmVkaWN0b3IgaGlzdG9yeSBmb3IgYWRwY20gKi8KKyAgICBmb3IgKGsgPSBiYXNlX2NoYW5uZWw7IGsgPCBzLT5wcmltX2NoYW5uZWxzOyBrKyspCisgICAgICAgIGZvciAobCA9IDA7IGwgPCBzLT52cV9zdGFydF9zdWJiYW5kW2tdOyBsKyspCisgICAgICAgICAgICBBVl9DT1BZMTI4KHMtPnN1YmJhbmRfc2FtcGxlc19oaXN0W2tdW2xdLCAmc3ViYmFuZF9zYW1wbGVzW2tdW2xdWzRdKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRjYV9maWx0ZXJfY2hhbm5lbHMoRENBQ29udGV4dCAqcywgaW50IGJsb2NrX2luZGV4KQoreworICAgIGZsb2F0ICgqc3ViYmFuZF9zYW1wbGVzKVtEQ0FfU1VCQkFORFNdWzhdID0gcy0+c3ViYmFuZF9zYW1wbGVzW2Jsb2NrX2luZGV4XTsKKyAgICBpbnQgazsKKworICAgIC8qIDMyIHN1YmJhbmRzIFFNRiAqLworICAgIGZvciAoayA9IDA7IGsgPCBzLT5wcmltX2NoYW5uZWxzOyBrKyspIHsKKyAgICAgICAgaWYgKHMtPmNoYW5uZWxfb3JkZXJfdGFiW2tdID49IDApCisgICAgICAgICAgICBxbWZfMzJfc3ViYmFuZHMocywgaywgc3ViYmFuZF9zYW1wbGVzW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNhbXBsZXNfY2hhbnB0cltzLT5jaGFubmVsX29yZGVyX3RhYltrXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTV9TUVJUMV8yIC8gMzI3NjguMCk7CisgICAgfQorCisgICAgLyogR2VuZXJhdGUgTEZFIHNhbXBsZXMgZm9yIHRoaXMgc3Vic3ViZnJhbWUgRklYTUUhISEgKi8KKyAgICBpZiAocy0+bGZlKSB7CisgICAgICAgIGxmZV9pbnRlcnBvbGF0aW9uX2ZpcihzLCBzLT5sZmUsIDIgKiBzLT5sZmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sZmVfZGF0YSArIDIgKiBzLT5sZmUgKiAoYmxvY2tfaW5kZXggKyA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNhbXBsZXNfY2hhbnB0cltzLT5sZmVfaW5kZXhdKTsKKyAgICAgICAgLyogT3V0cHV0cyAyMGJpdHMgcGNtIHNhbXBsZXMgKi8KKyAgICB9CisKKyAgICAvKiBEb3dubWl4aW5nIHRvIFN0ZXJlbyAqLworICAgIGlmIChzLT5wcmltX2NoYW5uZWxzICsgISFzLT5sZmUgPiAyICYmCisgICAgICAgIHMtPmF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ID09IEFWX0NIX0xBWU9VVF9TVEVSRU8pIHsKKyAgICAgICAgZGNhX2Rvd25taXgocy0+c2FtcGxlc19jaGFucHRyLCBzLT5hbW9kZSwgISFzLT5sZmUsIHMtPmRvd25taXhfY29lZiwKKyAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9vcmRlcl90YWIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRjYV9zdWJmcmFtZV9mb290ZXIoRENBQ29udGV4dCAqcywgaW50IGJhc2VfY2hhbm5lbCkKK3sKKyAgICBpbnQgaW4sIG91dCwgYXV4X2RhdGFfY291bnQsIGF1eF9kYXRhX2VuZCwgcmVzZXJ2ZWQ7CisgICAgdWludDMyX3QgbnN5bmNhdXg7CisKKyAgICAvKgorICAgICAqIFVucGFjayBvcHRpb25hbCBpbmZvcm1hdGlvbgorICAgICAqLworCisgICAgLyogcHJlc3VtYWJseSBvcHRpb25hbCBpbmZvcm1hdGlvbiBvbmx5IGFwcGVhcnMgaW4gdGhlIGNvcmU/ICovCisgICAgaWYgKCFiYXNlX2NoYW5uZWwpIHsKKyAgICAgICAgaWYgKHMtPnRpbWVzdGFtcCkKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgMzIpOworCisgICAgICAgIGlmIChzLT5hdXhfZGF0YSkgeworICAgICAgICAgICAgYXV4X2RhdGFfY291bnQgPSBnZXRfYml0cygmcy0+Z2IsIDYpOworCisgICAgICAgICAgICAvLyBhbGlnbiAoMzItYml0KQorICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCAoLWdldF9iaXRzX2NvdW50KCZzLT5nYikpICYgMzEpOworCisgICAgICAgICAgICBhdXhfZGF0YV9lbmQgPSA4ICogYXV4X2RhdGFfY291bnQgKyBnZXRfYml0c19jb3VudCgmcy0+Z2IpOworCisgICAgICAgICAgICBpZiAoKG5zeW5jYXV4ID0gZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIDMyKSkgIT0gRENBX05TWU5DQVVYKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJuU1lOQ0FVWCBtaXNtYXRjaCAlIyJQUkl4MzIiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBuc3luY2F1eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeyAvLyBiQVVYVGltZVN0YW1wRmxhZworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1eGlsaWFyeSBEZWNvZGUgVGltZSBTdGFtcCBGbGFnIik7CisgICAgICAgICAgICAgICAgLy8gYWxpZ24gKDQtYml0KQorICAgICAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsICgtZ2V0X2JpdHNfY291bnQoJnMtPmdiKSkgJiA0KTsKKyAgICAgICAgICAgICAgICAvLyA0NCBiaXRzOiBuTVNCeXRlICg4KSwgbk1hcmtlciAoNCksIG5MU0J5dGUgKDI4KSwgbk1hcmtlciAoNCkKKyAgICAgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIDQ0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChzLT5jb3JlX2Rvd25taXggPSBnZXRfYml0czEoJnMtPmdiKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgYW0gPSBnZXRfYml0cygmcy0+Z2IsIDMpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYW0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHMtPmNvcmVfZG93bm1peF9hbW9kZSA9IERDQV9NT05POworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHMtPmNvcmVfZG93bm1peF9hbW9kZSA9IERDQV9TVEVSRU87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgcy0+Y29yZV9kb3dubWl4X2Ftb2RlID0gRENBX1NURVJFT19UT1RBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBzLT5jb3JlX2Rvd25taXhfYW1vZGUgPSBEQ0FfM0Y7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgcy0+Y29yZV9kb3dubWl4X2Ftb2RlID0gRENBXzJGMVI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgcy0+Y29yZV9kb3dubWl4X2Ftb2RlID0gRENBXzJGMlI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgcy0+Y29yZV9kb3dubWl4X2Ftb2RlID0gRENBXzNGMVI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbW9kZSAlZCBmb3IgZW1iZWRkZWQgZG93bm1peCBjb2VmZmljaWVudHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKG91dCA9IDA7IG91dCA8IGRjYV9jaGFubmVsc1tzLT5jb3JlX2Rvd25taXhfYW1vZGVdOyBvdXQrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGluID0gMDsgaW4gPCBzLT5wcmltX2NoYW5uZWxzICsgISFzLT5sZmU7IGluKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRtcCA9IGdldF9iaXRzKCZzLT5nYiwgOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRtcCAmIDB4RkYpID4gMjQxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGRvd25taXggY29lZmZpY2llbnQgY29kZSAlIlBSSXUxNiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb3JlX2Rvd25taXhfY29kZXNbaW5dW291dF0gPSB0bXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFsaWduX2dldF9iaXRzKCZzLT5nYik7IC8vIGJ5dGUgYWxpZ24KKyAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDE2KTsgIC8vIG5BVVhDUkMxNgorCisgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIGRhdGEgKHJlc2VydmVkLCBjZi4gRVRTSSBUUyAxMDIgMTE0IFYxLjQuMSkKKyAgICAgICAgICAgIGlmICgocmVzZXJ2ZWQgPSAoYXV4X2RhdGFfZW5kIC0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKSkpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiT3ZlcnJlYWQgYXV4aWxpYXJ5IGRhdGEgYnkgJWQgYml0c1xuIiwgLXJlc2VydmVkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzZXJ2ZWQpIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3JlIGF1eGlsaWFyeSBkYXRhIHJlc2VydmVkIGNvbnRlbnQiKTsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIHJlc2VydmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5jcmNfcHJlc2VudCAmJiBzLT5keW5yYW5nZSkKKyAgICAgICAgICAgIGdldF9iaXRzKCZzLT5nYiwgMTYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSBhIGRjYSBmcmFtZSBibG9jaworICoKKyAqIEBwYXJhbSBzICAgICBwb2ludGVyIHRvIHRoZSBEQ0FDb250ZXh0CisgKi8KKworc3RhdGljIGludCBkY2FfZGVjb2RlX2Jsb2NrKERDQUNvbnRleHQgKnMsIGludCBiYXNlX2NoYW5uZWwsIGludCBibG9ja19pbmRleCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgLyogU2FuaXR5IGNoZWNrICovCisgICAgaWYgKHMtPmN1cnJlbnRfc3ViZnJhbWUgPj0gcy0+c3ViZnJhbWVzKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiY2hlY2sgZmFpbGVkOiAlaT4laSIsCisgICAgICAgICAgICAgICBzLT5jdXJyZW50X3N1YmZyYW1lLCBzLT5zdWJmcmFtZXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoIXMtPmN1cnJlbnRfc3Vic3ViZnJhbWUpIHsKKyNpZmRlZiBUUkFDRQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkRTWU5DIGRjYV9zdWJmcmFtZV9oZWFkZXJcbiIpOworI2VuZGlmCisgICAgICAgIC8qIFJlYWQgc3ViZnJhbWUgaGVhZGVyICovCisgICAgICAgIGlmICgocmV0ID0gZGNhX3N1YmZyYW1lX2hlYWRlcihzLCBiYXNlX2NoYW5uZWwsIGJsb2NrX2luZGV4KSkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIFJlYWQgc3Vic3ViZnJhbWUgKi8KKyNpZmRlZiBUUkFDRQorICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiRFNZTkMgZGNhX3N1YnN1YmZyYW1lXG4iKTsKKyNlbmRpZgorICAgIGlmICgocmV0ID0gZGNhX3N1YnN1YmZyYW1lKHMsIGJhc2VfY2hhbm5lbCwgYmxvY2tfaW5kZXgpKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIFVwZGF0ZSBzdGF0ZSAqLworICAgIHMtPmN1cnJlbnRfc3Vic3ViZnJhbWUrKzsKKyAgICBpZiAocy0+Y3VycmVudF9zdWJzdWJmcmFtZSA+PSBzLT5zdWJzdWJmcmFtZXNbcy0+Y3VycmVudF9zdWJmcmFtZV0pIHsKKyAgICAgICAgcy0+Y3VycmVudF9zdWJzdWJmcmFtZSA9IDA7CisgICAgICAgIHMtPmN1cnJlbnRfc3ViZnJhbWUrKzsKKyAgICB9CisgICAgaWYgKHMtPmN1cnJlbnRfc3ViZnJhbWUgPj0gcy0+c3ViZnJhbWVzKSB7CisjaWZkZWYgVFJBQ0UKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJEU1lOQyBkY2Ffc3ViZnJhbWVfZm9vdGVyXG4iKTsKKyNlbmRpZgorICAgICAgICAvKiBSZWFkIHN1YmZyYW1lIGZvb3RlciAqLworICAgICAgICBpZiAoKHJldCA9IGRjYV9zdWJmcmFtZV9mb290ZXIocywgYmFzZV9jaGFubmVsKSkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIGFuIEV4U1Mgc3BlYWtlciBtYXNrIChIRCkKKyAqLworc3RhdGljIGludCBkY2FfZXhzc19tYXNrMmNvdW50KGludCBtYXNrKQoreworICAgIC8qIGNvdW50IGJpdHMgdGhhdCBtZWFuIHNwZWFrZXIgcGFpcnMgdHdpY2UgKi8KKyAgICByZXR1cm4gYXZfcG9wY291bnQobWFzaykgKworICAgICAgICAgICBhdl9wb3Bjb3VudChtYXNrICYgKERDQV9FWFNTX0NFTlRFUl9MRUZUX1JJR0hUICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQV9FWFNTX0ZST05UX0xFRlRfUklHSFQgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQV9FWFNTX0ZST05UX0hJR0hfTEVGVF9SSUdIVCAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQV9FWFNTX1dJREVfTEVGVF9SSUdIVCAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQV9FWFNTX1NJREVfTEVGVF9SSUdIVCAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQV9FWFNTX1NJREVfSElHSF9MRUZUX1JJR0hUICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQV9FWFNTX1NJREVfUkVBUl9MRUZUX1JJR0hUICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQV9FWFNTX1JFQVJfTEVGVF9SSUdIVCAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQV9FWFNTX1JFQVJfSElHSF9MRUZUX1JJR0hUKSk7Cit9CisKKy8qKgorICogU2tpcCBtaXhpbmcgY29lZmZpY2llbnRzIG9mIGEgc2luZ2xlIG1peCBvdXQgY29uZmlndXJhdGlvbiAoSEQpCisgKi8KK3N0YXRpYyB2b2lkIGRjYV9leHNzX3NraXBfbWl4X2NvZWZmcyhHZXRCaXRDb250ZXh0ICpnYiwgaW50IGNoYW5uZWxzLCBpbnQgb3V0X2NoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgaW50IG1peF9tYXBfbWFzayA9IGdldF9iaXRzKGdiLCBvdXRfY2gpOworICAgICAgICBpbnQgbnVtX2NvZWZmcyA9IGF2X3BvcGNvdW50KG1peF9tYXBfbWFzayk7CisgICAgICAgIHNraXBfYml0c19sb25nKGdiLCBudW1fY29lZmZzICogNik7CisgICAgfQorfQorCisvKioKKyAqIFBhcnNlIGV4dGVuc2lvbiBzdWJzdHJlYW0gYXNzZXQgaGVhZGVyIChIRCkKKyAqLworc3RhdGljIGludCBkY2FfZXhzc19wYXJzZV9hc3NldF9oZWFkZXIoRENBQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaGVhZGVyX3BvcyA9IGdldF9iaXRzX2NvdW50KCZzLT5nYik7CisgICAgaW50IGhlYWRlcl9zaXplOworICAgIGludCBjaGFubmVscyA9IDA7CisgICAgaW50IGVtYmVkZGVkX3N0ZXJlbyA9IDA7CisgICAgaW50IGVtYmVkZGVkXzZjaCAgICA9IDA7CisgICAgaW50IGRyY19jb2RlX3ByZXNlbnQ7CisgICAgaW50IGV4dGVuc2lvbnNfbWFzayA9IDA7CisgICAgaW50IGksIGo7CisKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMTYpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIFdlIHdpbGwgcGFyc2UganVzdCBlbm91Z2ggdG8gZ2V0IHRvIHRoZSBleHRlbnNpb25zIGJpdG1hc2sgd2l0aCB3aGljaAorICAgICAqIHdlIGNhbiBzZXQgdGhlIHByb2ZpbGUgdmFsdWUuICovCisKKyAgICBoZWFkZXJfc2l6ZSA9IGdldF9iaXRzKCZzLT5nYiwgOSkgKyAxOworICAgIHNraXBfYml0cygmcy0+Z2IsIDMpOyAvLyBhc3NldCBpbmRleAorCisgICAgaWYgKHMtPnN0YXRpY19maWVsZHMpIHsKKyAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgNCk7IC8vIGFzc2V0IHR5cGUgZGVzY3JpcHRvcgorICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIDI0KTsgLy8gbGFuZ3VhZ2UgZGVzY3JpcHRvcgorCisgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgLyogSG93IGNhbiBvbmUgZml0IDEwMjQgYnl0ZXMgb2YgdGV4dCBoZXJlIGlmIHRoZSBtYXhpbXVtIHZhbHVlCisgICAgICAgICAgICAgKiBmb3IgdGhlIGFzc2V0IGhlYWRlciBzaXplIGZpZWxkIGFib3ZlIHdhcyA1MTIgYnl0ZXM/ICovCisgICAgICAgICAgICBpbnQgdGV4dF9sZW5ndGggPSBnZXRfYml0cygmcy0+Z2IsIDEwKSArIDE7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgdGV4dF9sZW5ndGggKiA4KQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgdGV4dF9sZW5ndGggKiA4KTsgLy8gaW5mbyB0ZXh0CisgICAgICAgIH0KKworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA1KTsgLy8gYml0IHJlc29sdXRpb24gLSAxCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDQpOyAvLyBtYXggc2FtcGxlIHJhdGUgY29kZQorICAgICAgICBjaGFubmVscyA9IGdldF9iaXRzKCZzLT5nYiwgOCkgKyAxOworCisgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeyAvLyAxLXRvLTEgY2hhbm5lbHMgdG8gc3BlYWtlcnMKKyAgICAgICAgICAgIGludCBzcGtyX3JlbWFwX3NldHM7CisgICAgICAgICAgICBpbnQgc3Brcl9tYXNrX3NpemUgPSAxNjsKKyAgICAgICAgICAgIGludCBudW1fc3BrcnNbN107CisKKyAgICAgICAgICAgIGlmIChjaGFubmVscyA+IDIpCisgICAgICAgICAgICAgICAgZW1iZWRkZWRfc3RlcmVvID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBpZiAoY2hhbm5lbHMgPiA2KQorICAgICAgICAgICAgICAgIGVtYmVkZGVkXzZjaCA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgICAgICAgICBzcGtyX21hc2tfc2l6ZSA9IChnZXRfYml0cygmcy0+Z2IsIDIpICsgMSkgPDwgMjsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCBzcGtyX21hc2tfc2l6ZSk7IC8vIHNwa3IgYWN0aXZpdHkgbWFzaworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcGtyX3JlbWFwX3NldHMgPSBnZXRfYml0cygmcy0+Z2IsIDMpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3Brcl9yZW1hcF9zZXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvKiBzdGQgbGF5b3V0IG1hc2sgZm9yIGVhY2ggcmVtYXAgc2V0ICovCisgICAgICAgICAgICAgICAgbnVtX3Nwa3JzW2ldID0gZGNhX2V4c3NfbWFzazJjb3VudChnZXRfYml0cygmcy0+Z2IsIHNwa3JfbWFza19zaXplKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGtyX3JlbWFwX3NldHM7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBudW1fZGVjX2NoX3JlbWFwcyA9IGdldF9iaXRzKCZzLT5nYiwgNSkgKyAxOworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3Nwa3JzW2ldOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlbWFwX2RlY19jaF9tYXNrID0gZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIG51bV9kZWNfY2hfcmVtYXBzKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kZWNfY2ggPSBhdl9wb3Bjb3VudChyZW1hcF9kZWNfY2hfbWFzayk7CisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgbnVtX2RlY19jaCAqIDUpOyAvLyByZW1hcCBjb2RlcworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMpOyAvLyByZXByZXNlbnRhdGlvbiB0eXBlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBkcmNfY29kZV9wcmVzZW50ID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgaWYgKGRyY19jb2RlX3ByZXNlbnQpCisgICAgICAgIGdldF9iaXRzKCZzLT5nYiwgOCk7IC8vIGRyYyBjb2RlCisKKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDUpOyAvLyBkaWFsb2cgbm9ybWFsaXphdGlvbiBjb2RlCisKKyAgICBpZiAoZHJjX2NvZGVfcHJlc2VudCAmJiBlbWJlZGRlZF9zdGVyZW8pCisgICAgICAgIGdldF9iaXRzKCZzLT5nYiwgOCk7IC8vIGRyYyBzdGVyZW8gY29kZQorCisgICAgaWYgKHMtPm1peF9tZXRhZGF0YSAmJiBnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxKTsgLy8gZXh0ZXJuYWwgbWl4CisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDYpOyAvLyBwb3N0IG1peCBnYWluIGNvZGUKKworICAgICAgICBpZiAoZ2V0X2JpdHMoJnMtPmdiLCAyKSAhPSAzKSAvLyBtaXhlciBkcmMgY29kZQorICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMyk7IC8vIGRyYyBsaW1pdAorICAgICAgICBlbHNlCisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA4KTsgLy8gY3VzdG9tIGRyYyBjb2RlCisKKyAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSAvLyBjaGFubmVsIHNwZWNpZmljIHNjYWxpbmcKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fbWl4X2NvbmZpZ3M7IGkrKykKKyAgICAgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIHMtPm1peF9jb25maWdfbnVtX2NoW2ldICogNik7IC8vIHNjYWxlIGNvZGVzCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgcy0+bnVtX21peF9jb25maWdzICogNik7IC8vIHNjYWxlIGNvZGVzCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9taXhfY29uZmlnczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBkY2FfZXhzc19za2lwX21peF9jb2VmZnMoJnMtPmdiLCBjaGFubmVscywgcy0+bWl4X2NvbmZpZ19udW1fY2hbaV0pOworICAgICAgICAgICAgaWYgKGVtYmVkZGVkXzZjaCkKKyAgICAgICAgICAgICAgICBkY2FfZXhzc19za2lwX21peF9jb2VmZnMoJnMtPmdiLCA2LCBzLT5taXhfY29uZmlnX251bV9jaFtpXSk7CisgICAgICAgICAgICBpZiAoZW1iZWRkZWRfc3RlcmVvKQorICAgICAgICAgICAgICAgIGRjYV9leHNzX3NraXBfbWl4X2NvZWZmcygmcy0+Z2IsIDIsIHMtPm1peF9jb25maWdfbnVtX2NoW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoZ2V0X2JpdHMoJnMtPmdiLCAyKSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZXh0ZW5zaW9uc19tYXNrID0gZ2V0X2JpdHMoJnMtPmdiLCAxMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZXh0ZW5zaW9uc19tYXNrID0gRENBX0VYVF9FWFNTX1hMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBleHRlbnNpb25zX21hc2sgPSBEQ0FfRVhUX0VYU1NfTEJSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGV4dGVuc2lvbnNfbWFzayA9IDA7IC8qIGF1eCBjb2RpbmcgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogbm90IHBhcnNlZCBmdXJ0aGVyLCB3ZSB3ZXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZXh0ZW5zaW9ucyBtYXNrICovCisKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGdldF9iaXRzX2NvdW50KCZzLT5nYikgLSBoZWFkZXJfcG9zID4gaGVhZGVyX3NpemUgKiA4KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJBc3NldCBoZWFkZXIgc2l6ZSBtaXNtYXRjaC5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgaGVhZGVyX3BvcyArIGhlYWRlcl9zaXplICogOCAtIGdldF9iaXRzX2NvdW50KCZzLT5nYikpOworCisgICAgaWYgKGV4dGVuc2lvbnNfbWFzayAmIERDQV9FWFRfRVhTU19YTEwpCisgICAgICAgIHMtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0RUU19IRF9NQTsKKyAgICBlbHNlIGlmIChleHRlbnNpb25zX21hc2sgJiAoRENBX0VYVF9FWFNTX1hCUiB8IERDQV9FWFRfRVhTU19YOTYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0FfRVhUX0VYU1NfWFhDSCkpCisgICAgICAgIHMtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0RUU19IRF9IUkE7CisKKyAgICBpZiAoIShleHRlbnNpb25zX21hc2sgJiBEQ0FfRVhUX0NPUkUpKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRFRTIGNvcmUgZGV0ZWN0aW9uIG1pc21hdGNoLlxuIik7CisgICAgaWYgKChleHRlbnNpb25zX21hc2sgJiBEQ0FfQ09SRV9FWFRTKSAhPSBzLT5jb3JlX2V4dF9tYXNrKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkRUUyBleHRlbnNpb25zIGRldGVjdGlvbiBtaXNtYXRjaCAoJWQsICVkKVxuIiwKKyAgICAgICAgICAgICAgIGV4dGVuc2lvbnNfbWFzayAmIERDQV9DT1JFX0VYVFMsIHMtPmNvcmVfZXh0X21hc2spOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGNhX3hicl9wYXJzZV9mcmFtZShEQ0FDb250ZXh0ICpzKQoreworICAgIGludCBzY2FsZV90YWJsZV9oaWdoW0RDQV9DSFNFVF9DSEFOU19NQVhdW0RDQV9TVUJCQU5EU11bMl07CisgICAgaW50IGFjdGl2ZV9iYW5kc1tEQ0FfQ0hTRVRTX01BWF1bRENBX0NIU0VUX0NIQU5TX01BWF07CisgICAgaW50IGFiaXRzX2hpZ2hbRENBX0NIU0VUX0NIQU5TX01BWF1bRENBX1NVQkJBTkRTXTsKKyAgICBpbnQgYW5jdGVtcFtEQ0FfQ0hTRVRfQ0hBTlNfTUFYXTsKKyAgICBpbnQgY2hzZXRfZnNpemVbRENBX0NIU0VUU19NQVhdOworICAgIGludCBuX3hicl9jaFtEQ0FfQ0hTRVRTX01BWF07CisgICAgaW50IGhkcl9zaXplLCBudW1fY2hzZXRzLCB4YnJfdG1vZGUsIGhkcl9wb3M7CisgICAgaW50IGksIGosIGssIGwsIGNoc2V0LCBjaGFuX2Jhc2U7CisKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkRUUy1YQlI6IGRlY29kaW5nIFhCUiBleHRlbnNpb25cbiIpOworCisgICAgLyogZ2V0IGJpdCBwb3NpdGlvbiBvZiBzeW5jIGhlYWRlciAqLworICAgIGhkcl9wb3MgPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpIC0gMzI7CisKKyAgICBoZHJfc2l6ZSA9IGdldF9iaXRzKCZzLT5nYiwgNikgKyAxOworICAgIG51bV9jaHNldHMgPSBnZXRfYml0cygmcy0+Z2IsIDIpICsgMTsKKworICAgIGZvcihpID0gMDsgaSA8IG51bV9jaHNldHM7IGkrKykKKyAgICAgICAgY2hzZXRfZnNpemVbaV0gPSBnZXRfYml0cygmcy0+Z2IsIDE0KSArIDE7CisKKyAgICB4YnJfdG1vZGUgPSBnZXRfYml0czEoJnMtPmdiKTsKKworICAgIGZvcihpID0gMDsgaSA8IG51bV9jaHNldHM7IGkrKykgeworICAgICAgICBuX3hicl9jaFtpXSA9IGdldF9iaXRzKCZzLT5nYiwgMykgKyAxOworICAgICAgICBrID0gZ2V0X2JpdHMoJnMtPmdiLCAyKSArIDU7CisgICAgICAgIGZvcihqID0gMDsgaiA8IG5feGJyX2NoW2ldOyBqKyspCisgICAgICAgICAgICBhY3RpdmVfYmFuZHNbaV1bal0gPSBnZXRfYml0cygmcy0+Z2IsIGspICsgMTsKKyAgICB9CisKKyAgICAvKiBza2lwIHRvIHRoZSBlbmQgb2YgdGhlIGhlYWRlciAqLworICAgIGkgPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpOworICAgIGlmKGhkcl9wb3MgKyBoZHJfc2l6ZSAqIDggPiBpKQorICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIGhkcl9wb3MgKyBoZHJfc2l6ZSAqIDggLSBpKTsKKworICAgIC8qIGxvb3Agb3ZlciB0aGUgY2hhbm5lbCBkYXRhIHNldHMgKi8KKyAgICAvKiBvbmx5IGRlY29kZSBhcyBtYW55IGNoYW5uZWxzIGFzIHdlJ3ZlIGRlY29kZWQgYmFzZSBkYXRhIGZvciAqLworICAgIGZvcihjaHNldCA9IDAsIGNoYW5fYmFzZSA9IDA7CisgICAgICAgIGNoc2V0IDwgbnVtX2Noc2V0cyAmJiBjaGFuX2Jhc2UgKyBuX3hicl9jaFtjaHNldF0gPD0gcy0+cHJpbV9jaGFubmVsczsKKyAgICAgICAgY2hhbl9iYXNlICs9IG5feGJyX2NoW2Noc2V0KytdKSB7CisgICAgICAgIGludCBzdGFydF9wb3NuID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICAgICAgaW50IHN1YnN1YmZyYW1lID0gMDsKKyAgICAgICAgaW50IHN1YmZyYW1lID0gMDsKKworICAgICAgICAvKiBsb29wIG92ZXIgc3ViZnJhbWVzICovCisgICAgICAgIGZvciAoayA9IDA7IGsgPCAocy0+c2FtcGxlX2Jsb2NrcyAvIDgpOyBrKyspIHsKKyAgICAgICAgICAgIC8qIHBhcnNlIGhlYWRlciBpZiB3ZSdyZSBvbiBmaXJzdCBzdWJzdWJmcmFtZSBvZiBhIGJsb2NrICovCisgICAgICAgICAgICBpZihzdWJzdWJmcmFtZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogUGFyc2Ugc3ViZnJhbWUgaGVhZGVyICovCisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbl94YnJfY2hbY2hzZXRdOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYW5jdGVtcFtpXSA9IGdldF9iaXRzKCZzLT5nYiwgMikgKyAyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IG5feGJyX2NoW2Noc2V0XTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGdldF9hcnJheSgmcy0+Z2IsIGFiaXRzX2hpZ2hbaV0sIGFjdGl2ZV9iYW5kc1tjaHNldF1baV0sIGFuY3RlbXBbaV0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IG5feGJyX2NoW2Noc2V0XTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGFuY3RlbXBbaV0gPSBnZXRfYml0cygmcy0+Z2IsIDMpOworICAgICAgICAgICAgICAgICAgICBpZihhbmN0ZW1wW2ldIDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJEVFMtWEJSOiBTWU5DIEVSUk9SXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogZ2VuZXJhdGUgc2NhbGUgZmFjdG9ycyAqLworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IG5feGJyX2NoW2Noc2V0XTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpzY2FsZV90YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5iaXRzOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5zY2FsZWZhY3Rvcl9odWZmbWFuW2NoYW5fYmFzZStpXSA9PSA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV90YWJsZSA9IHNjYWxlX2ZhY3Rvcl9xdWFudDc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV90YWJsZSA9IHNjYWxlX2ZhY3Rvcl9xdWFudDY7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBuYml0cyA9IGFuY3RlbXBbaV07CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgYWN0aXZlX2JhbmRzW2Noc2V0XVtpXTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihhYml0c19oaWdoW2ldW2pdID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3RhYmxlX2hpZ2hbaV1bal1bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV90YWJsZVtnZXRfYml0cygmcy0+Z2IsIG5iaXRzKV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih4YnJfdG1vZGUgJiYgcy0+dHJhbnNpdGlvbl9tb2RlW2ldW2pdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3RhYmxlX2hpZ2hbaV1bal1bMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfdGFibGVbZ2V0X2JpdHMoJnMtPmdiLCBuYml0cyldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZGVjb2RlIGF1ZGlvIGFycmF5IGZvciB0aGlzIGJsb2NrICovCisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBuX3hicl9jaFtjaHNldF07IGkrKykgeworICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IGFjdGl2ZV9iYW5kc1tjaHNldF1baV07IGorKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeGJyX2FiaXRzID0gYWJpdHNfaGlnaFtpXVtqXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcXVhbnRfc3RlcF9zaXplID0gbG9zc2xlc3NfcXVhbnRfZFt4YnJfYWJpdHNdOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2ZpID0geGJyX3Rtb2RlICYmIHMtPnRyYW5zaXRpb25fbW9kZVtpXVtqXSAmJiBzdWJzdWJmcmFtZSA+PSBzLT50cmFuc2l0aW9uX21vZGVbaV1bal07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJzY2FsZSA9IHF1YW50X3N0ZXBfc2l6ZSAqIHNjYWxlX3RhYmxlX2hpZ2hbaV1bal1bc2ZpXTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnN1YmJhbmRfc2FtcGxlcyA9IHMtPnN1YmJhbmRfc2FtcGxlc1trXVtjaGFuX2Jhc2UraV1bal07CisgICAgICAgICAgICAgICAgICAgIGludCBibG9ja1s4XTsKKworICAgICAgICAgICAgICAgICAgICBpZih4YnJfYWJpdHMgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIGlmKHhicl9hYml0cyA+IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hcnJheSgmcy0+Z2IsIGJsb2NrLCA4LCB4YnJfYWJpdHMgLSAzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19jb2RlMSwgYmxvY2tfY29kZTIsIHNpemUsIGxldmVscywgZXJyOworCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplICAgPSBhYml0c19zaXplc1t4YnJfYWJpdHMgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGFiaXRzX2xldmVsc1t4YnJfYWJpdHMgLSAxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfY29kZTEgPSBnZXRfYml0cygmcy0+Z2IsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfY29kZTIgPSBnZXRfYml0cygmcy0+Z2IsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZGVjb2RlX2Jsb2NrY29kZXMoYmxvY2tfY29kZTEsIGJsb2NrX2NvZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzLCBibG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFUlJPUjogRFRTLVhCUjogYmxvY2sgY29kZSBsb29rLXVwIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSAmIHN1bSBpbnRvIHN1YmJhbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yKGwgPSAwOyBsIDwgODsgbCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgc3ViYmFuZF9zYW1wbGVzW2xdICs9IChmbG9hdClibG9ja1tsXSAqIHJzY2FsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIERTWU5DIG1hcmtlciAqLworICAgICAgICAgICAgaWYocy0+YXNwZiB8fCBzdWJzdWJmcmFtZSA9PSBzLT5zdWJzdWJmcmFtZXNbc3ViZnJhbWVdIC0gMSkgeworICAgICAgICAgICAgICAgIGlmKGdldF9iaXRzKCZzLT5nYiwgMTYpICE9IDB4ZmZmZikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkRUUy1YQlI6IERpZG4ndCBnZXQgc3ViZnJhbWUgRFNZTkNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGFkdmFuY2Ugc3ViLXN1Yi1mcmFtZSBpbmRleCAqLworICAgICAgICAgICAgaWYoKytzdWJzdWJmcmFtZSA+PSBzLT5zdWJzdWJmcmFtZXNbc3ViZnJhbWVdKSB7CisgICAgICAgICAgICAgICAgc3Vic3ViZnJhbWUgPSAwOworICAgICAgICAgICAgICAgIHN1YmZyYW1lKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBza2lwIHRvIG5leHQgY2hhbm5lbCBzZXQgKi8KKyAgICAgICAgaSA9IGdldF9iaXRzX2NvdW50KCZzLT5nYik7CisgICAgICAgIGlmKHN0YXJ0X3Bvc24gKyBjaHNldF9mc2l6ZVtjaHNldF0gKiA4ICE9IGkpIHsKKyAgICAgICAgICAgIGogPSBzdGFydF9wb3NuICsgY2hzZXRfZnNpemVbY2hzZXRdICogOCAtIGk7CisgICAgICAgICAgICBpZihqIDwgMCB8fCBqID49IDgpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJEVFMtWEJSOiBlbmQgb2YgY2hhbm5lbCBzZXQsIgorICAgICAgICAgICAgICAgICAgICAgICAiIHNraXBwaW5nIGZ1cnRoZXIgdGhhbiBleHBlY3RlZCAoJWQgYml0cylcbiIsIGopOworICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCBqKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiBwYXJzZSBpbml0aWFsIGhlYWRlciBmb3IgWFhDSCBhbmQgZHVtcCBkZXRhaWxzICovCitzdGF0aWMgaW50IGRjYV94eGNoX2RlY29kZV9mcmFtZShEQ0FDb250ZXh0ICpzKQoreworICAgIGludCBoZHJfc2l6ZSwgc3BrbXNrX2JpdHMsIG51bV9jaHNldHMsIGNvcmVfc3BrLCBoZHJfcG9zOworICAgIGludCBpLCBjaHNldCwgYmFzZV9jaGFubmVsLCBjaHN0YXJ0LCBmc2l6ZVs4XTsKKworICAgIC8qIGFzc3VtZSBoZWFkZXIgd29yZCBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCAqLworICAgIGhkcl9wb3MgICAgID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKSAtIDMyOworICAgIGhkcl9zaXplICAgID0gZ2V0X2JpdHMoJnMtPmdiLCA2KSArIDE7CisgIC8qY2hoZHJfY3JjICAgPSovIHNraXBfYml0czEoJnMtPmdiKTsKKyAgICBzcGttc2tfYml0cyA9IGdldF9iaXRzKCZzLT5nYiwgNSkgKyAxOworICAgIG51bV9jaHNldHMgID0gZ2V0X2JpdHMoJnMtPmdiLCAyKSArIDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2Noc2V0czsgaSsrKQorICAgICAgICBmc2l6ZVtpXSA9IGdldF9iaXRzKCZzLT5nYiwgMTQpICsgMTsKKworICAgIGNvcmVfc3BrICAgICAgICAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIHNwa21za19iaXRzKTsKKyAgICBzLT54eGNoX2NvcmVfc3BrbWFzayAgID0gY29yZV9zcGs7CisgICAgcy0+eHhjaF9uYml0c19zcGtfbWFzayA9IHNwa21za19iaXRzOworICAgIHMtPnh4Y2hfZG1peF9lbWJlZGRlZCAgPSAwOworCisgICAgLyogc2tpcCB0byB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgKi8KKyAgICBpID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICBpZiAoaGRyX3BvcyArIGhkcl9zaXplICogOCA+IGkpCisgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgaGRyX3BvcyArIGhkcl9zaXplICogOCAtIGkpOworCisgICAgZm9yIChjaHNldCA9IDA7IGNoc2V0IDwgbnVtX2Noc2V0czsgY2hzZXQrKykgeworICAgICAgICBjaHN0YXJ0ICAgICAgID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICAgICAgYmFzZV9jaGFubmVsICA9IHMtPnByaW1fY2hhbm5lbHM7CisgICAgICAgIHMtPnh4Y2hfY2hzZXQgPSBjaHNldDsKKworICAgICAgICAvKiBYWENIIGFuZCBDb3JlIGhlYWRlcnMgZGlmZmVyLCBzZWUgNi40LjIgIlhYQ0ggQ2hhbm5lbCBTZXQgSGVhZGVyIiB2cy4KKyAgICAgICAgICAgNS4zLjIgIlByaW1hcnkgQXVkaW8gQ29kaW5nIEhlYWRlciIsIERUUyBTcGVjIDEuMy4xICovCisgICAgICAgIGRjYV9wYXJzZV9hdWRpb19jb2RpbmdfaGVhZGVyKHMsIGJhc2VfY2hhbm5lbCwgMSk7CisKKyAgICAgICAgLyogZGVjb2RlIGNoYW5uZWwgZGF0YSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHMtPnNhbXBsZV9ibG9ja3MgLyA4KTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGNhX2RlY29kZV9ibG9jayhzLCBiYXNlX2NoYW5uZWwsIGkpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBkZWNvZGluZyBEVFMtWFhDSCBleHRlbnNpb25cbiIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogc2tpcCB0byBlbmQgb2YgdGhpcyBzZWN0aW9uICovCisgICAgICAgIGkgPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpOworICAgICAgICBpZiAoY2hzdGFydCArIGZzaXplW2Noc2V0XSAqIDggPiBpKQorICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCBjaHN0YXJ0ICsgZnNpemVbY2hzZXRdICogOCAtIGkpOworICAgIH0KKyAgICBzLT54eGNoX2Noc2V0ID0gbnVtX2Noc2V0czsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFBhcnNlIGV4dGVuc2lvbiBzdWJzdHJlYW0gaGVhZGVyIChIRCkKKyAqLworc3RhdGljIHZvaWQgZGNhX2V4c3NfcGFyc2VfaGVhZGVyKERDQUNvbnRleHQgKnMpCit7CisgICAgaW50IGFzc2V0X3NpemVbOF07CisgICAgaW50IHNzX2luZGV4OworICAgIGludCBibG93bnVwOworICAgIGludCBudW1fYXVkaW9wID0gMTsKKyAgICBpbnQgbnVtX2Fzc2V0cyA9IDE7CisgICAgaW50IGFjdGl2ZV9zc19tYXNrWzhdOworICAgIGludCBpLCBqOworICAgIGludCBzdGFydF9wb3NuOworICAgIGludCBoZHJzaXplOworICAgIHVpbnQzMl90IG1rcjsKKworICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCA1MikKKyAgICAgICAgcmV0dXJuOworCisgICAgc3RhcnRfcG9zbiA9IGdldF9iaXRzX2NvdW50KCZzLT5nYikgLSAzMjsKKworICAgIHNraXBfYml0cygmcy0+Z2IsIDgpOyAvLyB1c2VyIGRhdGEKKyAgICBzc19pbmRleCA9IGdldF9iaXRzKCZzLT5nYiwgMik7CisKKyAgICBibG93bnVwID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgaGRyc2l6ZSA9IGdldF9iaXRzKCZzLT5nYiwgIDggKyA0ICogYmxvd251cCkgKyAxOyAvLyBoZWFkZXJfc2l6ZQorICAgIHNraXBfYml0cygmcy0+Z2IsIDE2ICsgNCAqIGJsb3dudXApOyAvLyBoZF9zaXplCisKKyAgICBzLT5zdGF0aWNfZmllbGRzID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgaWYgKHMtPnN0YXRpY19maWVsZHMpIHsKKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMik7IC8vIHJlZmVyZW5jZSBjbG9jayBjb2RlCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMpOyAvLyBmcmFtZSBkdXJhdGlvbiBjb2RlCisKKyAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCAzNik7IC8vIHRpbWVzdGFtcAorCisgICAgICAgIC8qIGEgc2luZ2xlIHN0cmVhbSBjYW4gY29udGFpbiBtdWx0aXBsZSBhdWRpbyBhc3NldHMgdGhhdCBjYW4gYmUKKyAgICAgICAgICogY29tYmluZWQgdG8gZm9ybSBtdWx0aXBsZSBhdWRpbyBwcmVzZW50YXRpb25zICovCisKKyAgICAgICAgbnVtX2F1ZGlvcCA9IGdldF9iaXRzKCZzLT5nYiwgMykgKyAxOworICAgICAgICBpZiAobnVtX2F1ZGlvcCA+IDEpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUgRFRTLUhEIGF1ZGlvIHByZXNlbnRhdGlvbnMiKTsKKyAgICAgICAgICAgIC8qIGlnbm9yZSBzdWNoIHN0cmVhbXMgZm9yIG5vdyAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbnVtX2Fzc2V0cyA9IGdldF9iaXRzKCZzLT5nYiwgMykgKyAxOworICAgICAgICBpZiAobnVtX2Fzc2V0cyA+IDEpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIk11bHRpcGxlIERUUy1IRCBhdWRpbyBhc3NldHMiKTsKKyAgICAgICAgICAgIC8qIGlnbm9yZSBzdWNoIHN0cmVhbXMgZm9yIG5vdyAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9hdWRpb3A7IGkrKykKKyAgICAgICAgICAgIGFjdGl2ZV9zc19tYXNrW2ldID0gZ2V0X2JpdHMoJnMtPmdiLCBzc19pbmRleCArIDEpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYXVkaW9wOyBpKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IHNzX2luZGV4OyBqKyspCisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZV9zc19tYXNrW2ldICYgKDEgPDwgaikpCisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDgpOyAvLyBhY3RpdmUgYXNzZXQgbWFzaworCisgICAgICAgIHMtPm1peF9tZXRhZGF0YSA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICBpZiAocy0+bWl4X21ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQgbWl4X291dF9tYXNrX3NpemU7CisKKyAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDIpOyAvLyBhZGp1c3RtZW50IGxldmVsCisgICAgICAgICAgICBtaXhfb3V0X21hc2tfc2l6ZSAgPSAoZ2V0X2JpdHMoJnMtPmdiLCAyKSArIDEpIDw8IDI7CisgICAgICAgICAgICBzLT5udW1fbWl4X2NvbmZpZ3MgPSAgZ2V0X2JpdHMoJnMtPmdiLCAyKSArIDE7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fbWl4X2NvbmZpZ3M7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBtaXhfb3V0X21hc2sgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCBtaXhfb3V0X21hc2tfc2l6ZSk7CisgICAgICAgICAgICAgICAgcy0+bWl4X2NvbmZpZ19udW1fY2hbaV0gPSBkY2FfZXhzc19tYXNrMmNvdW50KG1peF9vdXRfbWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9hc3NlcnQwKG51bV9hc3NldHMgPiAwKTsgLy8gc2lsZW5jZSBhIHdhcm5pbmcKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYXNzZXRzOyBpKyspCisgICAgICAgIGFzc2V0X3NpemVbaV0gPSBnZXRfYml0c19sb25nKCZzLT5nYiwgMTYgKyA0ICogYmxvd251cCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2Fzc2V0czsgaSsrKSB7CisgICAgICAgIGlmIChkY2FfZXhzc19wYXJzZV9hc3NldF9oZWFkZXIocykpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogbm90IHBhcnNlZCBmdXJ0aGVyLCB3ZSB3ZXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZXh0ZW5zaW9ucyBtYXNrCisgICAgICogZnJvbSB0aGUgYXNzZXQgaGVhZGVyICovCisKKyAgICAgICAgaiA9IGdldF9iaXRzX2NvdW50KCZzLT5nYik7CisgICAgICAgIGlmIChzdGFydF9wb3NuICsgaGRyc2l6ZSAqIDggPiBqKQorICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCBzdGFydF9wb3NuICsgaGRyc2l6ZSAqIDggLSBqKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2Fzc2V0czsgaSsrKSB7CisgICAgICAgICAgICBzdGFydF9wb3NuID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICAgICAgICAgIG1rciAgICAgICAgPSBnZXRfYml0c19sb25nKCZzLT5nYiwgMzIpOworCisgICAgICAgICAgICAvKiBwYXJzZSBleHRlbnNpb25zIHRoYXQgd2Uga25vdyBhYm91dCAqLworICAgICAgICAgICAgaWYgKG1rciA9PSAweDY1NWUzMTVlKSB7CisgICAgICAgICAgICAgICAgZGNhX3hicl9wYXJzZV9mcmFtZShzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWtyID09IDB4NDcwMDRhMDMpIHsKKyAgICAgICAgICAgICAgICBkY2FfeHhjaF9kZWNvZGVfZnJhbWUocyk7CisgICAgICAgICAgICAgICAgcy0+Y29yZV9leHRfbWFzayB8PSBEQ0FfRVhUX1hYQ0g7IC8qIHh4eCB1c2UgZm9yIGNoYW4gcmVvcmRlcmluZyAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgIkRUUy1FeFNTOiB1bmtub3duIG1hcmtlciA9IDB4JTA4eFxuIiwgbWtyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2tpcCB0byBlbmQgb2YgYmxvY2sgKi8KKyAgICAgICAgICAgIGogPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpOworICAgICAgICAgICAgaWYgKHN0YXJ0X3Bvc24gKyBhc3NldF9zaXplW2ldICogOCA+IGopCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCBzdGFydF9wb3NuICsgYXNzZXRfc2l6ZVtpXSAqIDggLSBqKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgZmxvYXQgZGNhX2RtaXhfY29kZSh1bnNpZ25lZCBjb2RlKQoreworICAgIGludCBzaWduID0gKGNvZGUgPj4gOCkgLSAxOworICAgIGNvZGUgJj0gMHhmZjsKKyAgICByZXR1cm4gKChkY2FfZG1peHRhYmxlW2NvZGVdIF4gc2lnbikgLSBzaWduKSAqICgxLjAgLyAoMSA8PCAxNSkpOworfQorCisvKioKKyAqIE1haW4gZnJhbWUgZGVjb2RpbmcgZnVuY3Rpb24KKyAqIEZJWE1FIGFkZCBhcmd1bWVudHMKKyAqLworc3RhdGljIGludCBkY2FfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIGludCBjaGFubmVsX21hc2s7CisgICAgaW50IGNoYW5uZWxfbGF5b3V0OworICAgIGludCBsZmVfc2FtcGxlczsKKyAgICBpbnQgbnVtX2NvcmVfY2hhbm5lbHMgPSAwOworICAgIGludCBpLCByZXQ7CisgICAgZmxvYXQgKipzYW1wbGVzX2ZsdDsKKyAgICBmbG9hdCAqc3JjX2NoYW47CisgICAgZmxvYXQgKmRzdF9jaGFuOworICAgIERDQUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBjb3JlX3NzX2VuZDsKKyAgICBpbnQgY2hhbm5lbHMsIGZ1bGxfY2hhbm5lbHM7CisgICAgZmxvYXQgc2NhbGU7CisgICAgaW50IGFjaGFuOworICAgIGludCBjaHNldDsKKyAgICBpbnQgbWFzazsKKyAgICBpbnQgbGF2YzsKKyAgICBpbnQgcG9zbjsKKyAgICBpbnQgaiwgazsKKyAgICBpbnQgZW5kY2g7CisKKyAgICBzLT54Y2hfcHJlc2VudCA9IDA7CisKKyAgICBzLT5kY2FfYnVmZmVyX3NpemUgPSBhdnByaXZfZGNhX2NvbnZlcnRfYml0c3RyZWFtKGJ1ZiwgYnVmX3NpemUsIHMtPmRjYV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQV9NQVhfRlJBTUVfU0laRSArIERDQV9NQVhfRVhTU19IRUFERVJfU0laRSk7CisgICAgaWYgKHMtPmRjYV9idWZmZXJfc2l6ZSA9PSBBVkVSUk9SX0lOVkFMSUREQVRBKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm90IGEgdmFsaWQgRENBIGZyYW1lXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBkY2FfcGFyc2VfZnJhbWVfaGVhZGVyKHMpKSA8IDApIHsKKyAgICAgICAgLy8gc2VlbXMgbGlrZSB0aGUgZnJhbWUgaXMgY29ycnVwdCwgdHJ5IHdpdGggdGhlIG5leHQgb25lCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIC8vIHNldCBBVkNvZGVjIHZhbHVlcyB3aXRoIHBhcnNlZCBkYXRhCisgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gcy0+c2FtcGxlX3JhdGU7CisgICAgYXZjdHgtPmJpdF9yYXRlICAgID0gcy0+Yml0X3JhdGU7CisKKyAgICBzLT5wcm9maWxlID0gRkZfUFJPRklMRV9EVFM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHMtPnNhbXBsZV9ibG9ja3MgLyA4KTsgaSsrKSB7CisgICAgICAgIGlmICgocmV0ID0gZGNhX2RlY29kZV9ibG9jayhzLCAwLCBpKSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgZGVjb2RpbmcgYmxvY2tcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlY29yZCBudW1iZXIgb2YgY29yZSBjaGFubmVscyBpbmNhc2UgbGVzcyB0aGFuIG1heCBjaGFubmVscyBhcmUgcmVxdWVzdGVkICovCisgICAgbnVtX2NvcmVfY2hhbm5lbHMgPSBzLT5wcmltX2NoYW5uZWxzOworCisgICAgaWYgKHMtPnByaW1fY2hhbm5lbHMgKyAhIXMtPmxmZSA+IDIgJiYKKyAgICAgICAgYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgPT0gQVZfQ0hfTEFZT1VUX1NURVJFTykgeworICAgICAgICAgICAgLyogU3RlcmVvIGRvd25taXggY29lZmZpY2llbnRzCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlIGRlY29kZXIgY2FuIG9ubHkgZG93bm1peCB0byAyLWNoYW5uZWwsIHNvIHdlIG5lZWQgdG8gZW5zdXJlCisgICAgICAgICAgICAgKiBlbWJlZGRlZCBkb3dubWl4IGNvZWZmaWNpZW50cyBhcmUgYWN0dWFsbHkgdGFyZ2V0aW5nIDItY2hhbm5lbC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHMtPmNvcmVfZG93bm1peCAmJiAocy0+Y29yZV9kb3dubWl4X2Ftb2RlID09IERDQV9TVEVSRU8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvcmVfZG93bm1peF9hbW9kZSA9PSBEQ0FfU1RFUkVPX1RPVEFMKSkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29yZV9jaGFubmVscyArICEhcy0+bGZlOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLyogUmFuZ2UgY2hlY2tlZCBlYXJsaWVyICovCisgICAgICAgICAgICAgICAgICAgIHMtPmRvd25taXhfY29lZltpXVswXSA9IGRjYV9kbWl4X2NvZGUocy0+Y29yZV9kb3dubWl4X2NvZGVzW2ldWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZG93bm1peF9jb2VmW2ldWzFdID0gZGNhX2RtaXhfY29kZShzLT5jb3JlX2Rvd25taXhfY29kZXNbaV1bMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT5vdXRwdXQgPSBzLT5jb3JlX2Rvd25taXhfYW1vZGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBhbSA9IHMtPmFtb2RlICYgRENBX0NIQU5ORUxfTUFTSzsKKyAgICAgICAgICAgICAgICBpZiAoYW0gPj0gRkZfQVJSQVlfRUxFTVMoZGNhX2RlZmF1bHRfY29lZmZzKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNoYW5uZWwgbW9kZSAlZFxuIiwgYW0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG51bV9jb3JlX2NoYW5uZWxzICsgISFzLT5sZmUgPgorICAgICAgICAgICAgICAgICAgICBGRl9BUlJBWV9FTEVNUyhkY2FfZGVmYXVsdF9jb2VmZnNbMF0pKSB7CisgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIkRvd25taXhpbmcgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJpbV9jaGFubmVscyArICEhcy0+bGZlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvcmVfY2hhbm5lbHMgKyAhIXMtPmxmZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmRvd25taXhfY29lZltpXVswXSA9IGRjYV9kZWZhdWx0X2NvZWZmc1thbV1baV1bMF07CisgICAgICAgICAgICAgICAgICAgIHMtPmRvd25taXhfY29lZltpXVsxXSA9IGRjYV9kZWZhdWx0X2NvZWZmc1thbV1baV1bMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgIlN0ZXJlbyBkb3dubWl4IGNvZWZmczpcbiIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb3JlX2NoYW5uZWxzICsgISFzLT5sZmU7IGkrKykgeworICAgICAgICAgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICJMLCBpbnB1dCBjaGFubmVsICVkID0gJWZcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kb3dubWl4X2NvZWZbaV1bMF0pOworICAgICAgICAgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICJSLCBpbnB1dCBjaGFubmVsICVkID0gJWZcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kb3dubWl4X2NvZWZbaV1bMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgIlxuIik7CisgICAgfQorCisgICAgaWYgKHMtPmV4dF9jb2RpbmcpCisgICAgICAgIHMtPmNvcmVfZXh0X21hc2sgPSBkY2FfZXh0X2F1ZGlvX2Rlc2NyX21hc2tbcy0+ZXh0X2Rlc2NyXTsKKyAgICBlbHNlCisgICAgICAgIHMtPmNvcmVfZXh0X21hc2sgPSAwOworCisgICAgY29yZV9zc19lbmQgPSBGRk1JTihzLT5mcmFtZV9zaXplLCBzLT5kY2FfYnVmZmVyX3NpemUpICogODsKKworICAgIC8qIG9ubHkgc2NhbiBmb3IgZXh0ZW5zaW9ucyBpZiBleHRfZGVzY3Igd2FzIHVua25vd24gb3IgaW5kaWNhdGVkIGEKKyAgICAgKiBzdXBwb3J0ZWQgWENoIGV4dGVuc2lvbiAqLworICAgIGlmIChzLT5jb3JlX2V4dF9tYXNrIDwgMCB8fCBzLT5jb3JlX2V4dF9tYXNrICYgKERDQV9FWFRfWENIIHwgRENBX0VYVF9YWENIKSkgeworICAgICAgICAvKiBpZiBleHRfZGVzY3Igd2FzIHVua25vd24sIGNsZWFyIHMtPmNvcmVfZXh0X21hc2sgc28gdGhhdCB0aGUKKyAgICAgICAgICogZXh0ZW5zaW9ucyBzY2FuIGNhbiBmaWxsIGl0IHVwICovCisgICAgICAgIHMtPmNvcmVfZXh0X21hc2sgPSBGRk1BWChzLT5jb3JlX2V4dF9tYXNrLCAwKTsKKworICAgICAgICAvKiBleHRlbnNpb25zIHN0YXJ0IGF0IDMyLWJpdCBib3VuZGFyaWVzIGludG8gYml0c3RyZWFtICovCisgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgKC1nZXRfYml0c19jb3VudCgmcy0+Z2IpKSAmIDMxKTsKKworICAgICAgICB3aGlsZSAoY29yZV9zc19lbmQgLSBnZXRfYml0c19jb3VudCgmcy0+Z2IpID49IDMyKSB7CisgICAgICAgICAgICB1aW50MzJfdCBiaXRzID0gZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIDMyKTsKKworICAgICAgICAgICAgc3dpdGNoIChiaXRzKSB7CisgICAgICAgICAgICBjYXNlIDB4NWE1YTVhNWE6IHsKKyAgICAgICAgICAgICAgICBpbnQgZXh0X2Ftb2RlLCB4Y2hfZnNpemU7CisKKyAgICAgICAgICAgICAgICBzLT54Y2hfYmFzZV9jaGFubmVsID0gcy0+cHJpbV9jaGFubmVsczsKKworICAgICAgICAgICAgICAgIC8qIHZhbGlkYXRlIHN5bmMgd29yZCB1c2luZyBYQ0hGU0laRSBmaWVsZCAqLworICAgICAgICAgICAgICAgIHhjaF9mc2l6ZSA9IHNob3dfYml0cygmcy0+Z2IsIDEwKTsKKyAgICAgICAgICAgICAgICBpZiAoKHMtPmZyYW1lX3NpemUgIT0gKGdldF9iaXRzX2NvdW50KCZzLT5nYikgPj4gMykgLSA0ICsgeGNoX2ZzaXplKSAmJgorICAgICAgICAgICAgICAgICAgICAocy0+ZnJhbWVfc2l6ZSAhPSAoZ2V0X2JpdHNfY291bnQoJnMtPmdiKSA+PiAzKSAtIDQgKyB4Y2hfZnNpemUgKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIGxlbmd0aC10by1lbmQtb2YtZnJhbWUgZmllbGQgZm9yIHRoZSBtb21lbnQgKi8KKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxMCk7CisKKyAgICAgICAgICAgICAgICBzLT5jb3JlX2V4dF9tYXNrIHw9IERDQV9FWFRfWENIOworCisgICAgICAgICAgICAgICAgLyogZXh0ZW5zaW9uIGFtb2RlKG51bWJlciBvZiBjaGFubmVscyBpbiBleHRlbnNpb24pIHNob3VsZCBiZSAxICovCisgICAgICAgICAgICAgICAgLyogQUZBSUsgWENoIGlzIG5vdCB1c2VkIGZvciBtb3JlIGNoYW5uZWxzICovCisgICAgICAgICAgICAgICAgaWYgKChleHRfYW1vZGUgPSBnZXRfYml0cygmcy0+Z2IsIDQpKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlhDaCBleHRlbnNpb24gYW1vZGUgJWQgbm90IHN1cHBvcnRlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfYW1vZGUpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocy0+eGNoX2Jhc2VfY2hhbm5lbCA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiWENoIHdpdGggZmV3ZXIgdGhhbiAyIGJhc2UgY2hhbm5lbHMiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogbXVjaCBsaWtlIGNvcmUgcHJpbWFyeSBhdWRpbyBjb2RpbmcgaGVhZGVyICovCisgICAgICAgICAgICAgICAgZGNhX3BhcnNlX2F1ZGlvX2NvZGluZ19oZWFkZXIocywgcy0+eGNoX2Jhc2VfY2hhbm5lbCwgMCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHMtPnNhbXBsZV9ibG9ja3MgLyA4KTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGRjYV9kZWNvZGVfYmxvY2socywgcy0+eGNoX2Jhc2VfY2hhbm5lbCwgaSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGRlY29kaW5nIFhDaCBleHRlbnNpb25cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHMtPnhjaF9wcmVzZW50ID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMHg0NzAwNGEwMzoKKyAgICAgICAgICAgICAgICAvKiBYWENoOiBleHRlbmRlZCBjaGFubmVscyAqLworICAgICAgICAgICAgICAgIC8qIHVzdWFsbHkgZm91bmQgZWl0aGVyIGluIGNvcmUgb3IgSEQgcGFydCBpbiBEVFMtSEQgSFJBIHN0cmVhbXMsCisgICAgICAgICAgICAgICAgICogYnV0IG5vdCBpbiBEVFMtRVMgd2hpY2ggY29udGFpbnMgWENoIGV4dGVuc2lvbnMgaW5zdGVhZCAqLworICAgICAgICAgICAgICAgIHMtPmNvcmVfZXh0X21hc2sgfD0gRENBX0VYVF9YWENIOworICAgICAgICAgICAgICAgIGRjYV94eGNoX2RlY29kZV9mcmFtZShzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDFkOTVmMjYyOiB7CisgICAgICAgICAgICAgICAgaW50IGZzaXplOTYgPSBzaG93X2JpdHMoJnMtPmdiLCAxMikgKyAxOworICAgICAgICAgICAgICAgIGlmIChzLT5mcmFtZV9zaXplICE9IChnZXRfYml0c19jb3VudCgmcy0+Z2IpID4+IDMpIC0gNCArIGZzaXplOTYpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJYOTYgZXh0ZW5zaW9uIGZvdW5kIGF0ICVkIGJpdHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzX2NvdW50KCZzLT5nYikpOworICAgICAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDEyKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkZTSVpFOTYgPSAlZCBieXRlc1xuIiwgZnNpemU5Nik7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJSRVZOTyA9ICVkXG4iLCBnZXRfYml0cygmcy0+Z2IsIDQpKTsKKworICAgICAgICAgICAgICAgIHMtPmNvcmVfZXh0X21hc2sgfD0gRENBX0VYVF9YOTY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgKC1nZXRfYml0c19jb3VudCgmcy0+Z2IpKSAmIDMxKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5vIHN1cHBvcnRlZCBleHRlbnNpb25zLCBza2lwIHRoZSByZXN0IG9mIHRoZSBjb3JlIHN1YnN0cmVhbSAqLworICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIGNvcmVfc3NfZW5kIC0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKSk7CisgICAgfQorCisgICAgaWYgKHMtPmNvcmVfZXh0X21hc2sgJiBEQ0FfRVhUX1g5NikKKyAgICAgICAgcy0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfRFRTXzk2XzI0OworICAgIGVsc2UgaWYgKHMtPmNvcmVfZXh0X21hc2sgJiAoRENBX0VYVF9YQ0ggfCBEQ0FfRVhUX1hYQ0gpKQorICAgICAgICBzLT5wcm9maWxlID0gRkZfUFJPRklMRV9EVFNfRVM7CisKKyAgICAvKiBjaGVjayBmb3IgRXhTUyAoSEQgcGFydCkgKi8KKyAgICBpZiAocy0+ZGNhX2J1ZmZlcl9zaXplIC0gcy0+ZnJhbWVfc2l6ZSA+IDMyICYmCisgICAgICAgIGdldF9iaXRzX2xvbmcoJnMtPmdiLCAzMikgPT0gRENBX0hEX01BUktFUikKKyAgICAgICAgZGNhX2V4c3NfcGFyc2VfaGVhZGVyKHMpOworCisgICAgYXZjdHgtPnByb2ZpbGUgPSBzLT5wcm9maWxlOworCisgICAgZnVsbF9jaGFubmVscyA9IGNoYW5uZWxzID0gcy0+cHJpbV9jaGFubmVscyArICEhcy0+bGZlOworCisgICAgLyogSWYgd2UgaGF2ZSBYWENIIHRoZW4gdGhlIGNoYW5uZWwgbGF5b3V0IGlzIG1hbmFnZWQgZGlmZmVyZW50bHkgKi8KKyAgICAvKiBub3RlIHRoYXQgWExMIHdpbGwgYWxzbyBoYXZlIGFub3RoZXIgd2F5IHRvIGRvIHRoaW5ncyAqLworICAgIGlmICghKHMtPmNvcmVfZXh0X21hc2sgJiBEQ0FfRVhUX1hYQ0gpCisgICAgICAgIHx8IChzLT5jb3JlX2V4dF9tYXNrICYgRENBX0VYVF9YWENIICYmIGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxzID4gMAorICAgICAgICAgICAgJiYgYXZjdHgtPnJlcXVlc3RfY2hhbm5lbHMKKyAgICAgICAgICAgIDwgbnVtX2NvcmVfY2hhbm5lbHMgKyAhIXMtPmxmZSArIHMtPnh4Y2hfY2hzZXRfbmNoWzBdKSkKKyAgICB7IC8qIHh4eCBzaG91bGQgYWxzbyBkbyBNQSBleHRlbnNpb25zICovCisgICAgICAgIGlmIChzLT5hbW9kZSA8IDE2KSB7CisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBkY2FfY29yZV9jaGFubmVsX2xheW91dFtzLT5hbW9kZV07CisKKyAgICAgICAgICAgIGlmIChzLT5wcmltX2NoYW5uZWxzICsgISFzLT5sZmUgPiAyICYmCisgICAgICAgICAgICAgICAgYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgPT0gQVZfQ0hfTEFZT1VUX1NURVJFTykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogTmVpdGhlciB0aGUgY29yZSdzIGF1eGlsaWFyeSBkYXRhIG5vciBvdXIgZGVmYXVsdCB0YWJsZXMgY29udGFpbgorICAgICAgICAgICAgICAgICAqIGRvd25taXggY29lZmZpY2llbnRzIGZvciB0aGUgYWRkaXRpb25hbCBjaGFubmVsIGNvZGVkIGluIHRoZSBYQ2gKKyAgICAgICAgICAgICAgICAgKiBleHRlbnNpb24sIHNvIHdoZW4gd2UncmUgZG9pbmcgYSBTdGVyZW8gZG93bm1peCwgZG9uJ3QgZGVjb2RlIGl0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHMtPnhjaF9kaXNhYmxlID0gMTsKKyAgICAgICAgICAgIH0KKworI2lmIEZGX0FQSV9SRVFVRVNUX0NIQU5ORUxTCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICBpZiAocy0+eGNoX3ByZXNlbnQgJiYgIXMtPnhjaF9kaXNhYmxlICYmCisgICAgICAgICAgICAgICAgKCFhdmN0eC0+cmVxdWVzdF9jaGFubmVscyB8fAorICAgICAgICAgICAgICAgICBhdmN0eC0+cmVxdWVzdF9jaGFubmVscyA+IG51bV9jb3JlX2NoYW5uZWxzICsgISFzLT5sZmUpKSB7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbHNlCisgICAgICAgICAgICBpZiAocy0+eGNoX3ByZXNlbnQgJiYgIXMtPnhjaF9kaXNhYmxlKSB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgfD0gQVZfQ0hfQkFDS19DRU5URVI7CisgICAgICAgICAgICAgICAgaWYgKHMtPmxmZSkgeworICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgfD0gQVZfQ0hfTE9XX0ZSRVFVRU5DWTsKKyAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9vcmRlcl90YWIgPSBkY2FfY2hhbm5lbF9yZW9yZGVyX2xmZV94Y2hbcy0+YW1vZGVdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfb3JkZXJfdGFiID0gZGNhX2NoYW5uZWxfcmVvcmRlcl9ub2xmZV94Y2hbcy0+YW1vZGVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9vcmRlcl90YWJbcy0+eGNoX2Jhc2VfY2hhbm5lbF0gPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbHMgICAgICAgPSBudW1fY29yZV9jaGFubmVscyArICEhcy0+bGZlOworICAgICAgICAgICAgICAgIHMtPnhjaF9wcmVzZW50ID0gMDsgLyogZGlzYWJsZSBmdXJ0aGVyIHhjaCBwcm9jZXNzaW5nICovCisgICAgICAgICAgICAgICAgaWYgKHMtPmxmZSkgeworICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgfD0gQVZfQ0hfTE9XX0ZSRVFVRU5DWTsKKyAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9vcmRlcl90YWIgPSBkY2FfY2hhbm5lbF9yZW9yZGVyX2xmZVtzLT5hbW9kZV07CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfb3JkZXJfdGFiID0gZGNhX2NoYW5uZWxfcmVvcmRlcl9ub2xmZVtzLT5hbW9kZV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGFubmVscyA+ICEhcy0+bGZlICYmCisgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9vcmRlcl90YWJbY2hhbm5lbHMgLSAxIC0gISFzLT5sZmVdIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgaWYgKGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhhdmN0eC0+Y2hhbm5lbF9sYXlvdXQpICE9IGNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJOdW1iZXIgb2YgY2hhbm5lbHMgJWQgbWlzbWF0Y2hlcyBsYXlvdXQgJWRcbiIsIGNoYW5uZWxzLCBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoYXZjdHgtPmNoYW5uZWxfbGF5b3V0KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChudW1fY29yZV9jaGFubmVscyArICEhcy0+bGZlID4gMiAmJgorICAgICAgICAgICAgICAgIGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ID09IEFWX0NIX0xBWU9VVF9TVEVSRU8pIHsKKyAgICAgICAgICAgICAgICBjaGFubmVscyAgICAgICAgICAgICAgPSAyOworICAgICAgICAgICAgICAgIHMtPm91dHB1dCAgICAgICAgICAgICA9IHMtPnByaW1fY2hhbm5lbHMgPT0gMiA/IHMtPmFtb2RlIDogRENBX1NURVJFTzsKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9MQVlPVVRfTkFUSVZFKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludDhfdCBkY2FfY2hhbm5lbF9vcmRlcl9uYXRpdmVbOV0gPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDggfTsKKyAgICAgICAgICAgICAgICBzLT5jaGFubmVsX29yZGVyX3RhYiA9IGRjYV9jaGFubmVsX29yZGVyX25hdGl2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmxmZV9pbmRleCA9IGRjYV9sZmVfaW5kZXhbcy0+YW1vZGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIk5vbiBzdGFuZGFyZCBjb25maWd1cmF0aW9uICVkICFcbiIsIHMtPmFtb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgcy0+eHhjaF9kbWl4X2VtYmVkZGVkID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiB3ZSBvbmx5IGdldCBoZXJlIGlmIGFuIFhYQ0ggY2hhbm5lbCBzZXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBtaXggKi8KKyAgICAgICAgY2hhbm5lbF9tYXNrID0gcy0+eHhjaF9jb3JlX3Nwa21hc2s7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxzID4gMAorICAgICAgICAgICAgJiYgYXZjdHgtPnJlcXVlc3RfY2hhbm5lbHMgPCBzLT5wcmltX2NoYW5uZWxzKSB7CisgICAgICAgICAgICBjaGFubmVscyA9IG51bV9jb3JlX2NoYW5uZWxzICsgISFzLT5sZmU7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+eHhjaF9jaHNldCAmJiBjaGFubmVscyArIHMtPnh4Y2hfY2hzZXRfbmNoW2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gYXZjdHgtPnJlcXVlc3RfY2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYW5uZWxzICs9IHMtPnh4Y2hfY2hzZXRfbmNoW2ldOworICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFzayB8PSBzLT54eGNoX3Nwa19tYXNrc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYW5uZWxzID0gcy0+cHJpbV9jaGFubmVscyArICEhcy0+bGZlOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnh4Y2hfY2hzZXQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFzayB8PSBzLT54eGNoX3Nwa19tYXNrc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEdpdmVuIHRoZSBEVFMgc3BlYydlZCBjaGFubmVsIG1hc2ssIGdlbmVyYXRlIGFuIGF2Y29kZWMgdmVyc2lvbiAqLworICAgICAgICBjaGFubmVsX2xheW91dCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT54eGNoX25iaXRzX3Nwa19tYXNrOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChjaGFubmVsX21hc2sgJiAoMSA8PCBpKSkgeworICAgICAgICAgICAgICAgIGNoYW5uZWxfbGF5b3V0IHw9IG1hcF94eGNoX3RvX25hdGl2ZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgbWFuYWdlZCB0byBnZXQgZXF1aXZhbGVudCBkdHMvYXZjb2RlYyBjaGFubmVsCisgICAgICAgICAqIG1hc2tzIGluIHNvbWUgc2Vuc2UgLS0gdW5mb3J0dW5hdGVseSBzb21lIGNoYW5uZWxzIGNvdWxkIG92ZXJsYXAgKi8KKyAgICAgICAgaWYgKGF2X3BvcGNvdW50KGNoYW5uZWxfbWFzaykgIT0gYXZfcG9wY291bnQoY2hhbm5lbF9sYXlvdXQpKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAiRFRTLVhYQ0g6IEluY29uc2lzdGVudCBhdmNvZGVjL2R0cyBjaGFubmVsIGxheW91dHNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBjaGFubmVsX2xheW91dDsKKworICAgICAgICBpZiAoIShhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCAmIEFWX0NIX0xBWU9VVF9OQVRJVkUpKSB7CisgICAgICAgICAgICAvKiBFc3RpbWF0ZSBEVFMgLS0+IGF2Y29kZWMgb3JkZXJpbmcgdGFibGUgKi8KKyAgICAgICAgICAgIGZvciAoY2hzZXQgPSAtMSwgaiA9IDA7IGNoc2V0IDwgcy0+eHhjaF9jaHNldDsgKytjaHNldCkgeworICAgICAgICAgICAgICAgIG1hc2sgPSBjaHNldCA+PSAwID8gcy0+eHhjaF9zcGtfbWFza3NbY2hzZXRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzLT54eGNoX2NvcmVfc3BrbWFzazsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+eHhjaF9uYml0c19zcGtfbWFzazsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrICYgfihEQ0FfWFhDSF9MRkUxIHwgRENBX1hYQ0hfTEZFMikgJiAoMSA8PCBpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGF2YyA9IG1hcF94eGNoX3RvX25hdGl2ZVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc24gPSBhdl9wb3Bjb3VudChjaGFubmVsX2xheW91dCAmIChsYXZjIC0gMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+eHhjaF9vcmRlcl90YWJbaisrXSA9IHBvc247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+bGZlX2luZGV4ID0gYXZfcG9wY291bnQoY2hhbm5lbF9sYXlvdXQgJiAoQVZfQ0hfTE9XX0ZSRVFVRU5DWS0xKSk7CisgICAgICAgIH0gZWxzZSB7IC8qIG5hdGl2ZSBvcmRlcmluZyAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspCisgICAgICAgICAgICAgICAgcy0+eHhjaF9vcmRlcl90YWJbaV0gPSBpOworCisgICAgICAgICAgICBzLT5sZmVfaW5kZXggPSBjaGFubmVscyAtIDE7CisgICAgICAgIH0KKworICAgICAgICBzLT5jaGFubmVsX29yZGVyX3RhYiA9IHMtPnh4Y2hfb3JkZXJfdGFiOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgIT0gY2hhbm5lbHMpIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscykKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJOdW1iZXIgb2YgY2hhbm5lbHMgY2hhbmdlZCBpbiBEQ0EgZGVjb2RlciAoJWQgLT4gJWQpXG4iLCBhdmN0eC0+Y2hhbm5lbHMsIGNoYW5uZWxzKTsKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgfQorCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IDI1NiAqIChzLT5zYW1wbGVfYmxvY2tzIC8gOCk7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzYW1wbGVzX2ZsdCA9IChmbG9hdCAqKikgZnJhbWUtPmV4dGVuZGVkX2RhdGE7CisKKyAgICAvKiBhbGxvY2F0ZSBidWZmZXIgZm9yIGV4dHJhIGNoYW5uZWxzIGlmIGRvd25taXhpbmcgKi8KKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDwgZnVsbF9jaGFubmVscykgeworICAgICAgICByZXQgPSBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZShOVUxMLCBmdWxsX2NoYW5uZWxzIC0gY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2ZtdCwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBhdl9mYXN0X21hbGxvYygmcy0+ZXh0cmFfY2hhbm5lbHNfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAmcy0+ZXh0cmFfY2hhbm5lbHNfYnVmZmVyX3NpemUsIHJldCk7CisgICAgICAgIGlmICghcy0+ZXh0cmFfY2hhbm5lbHNfYnVmZmVyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICByZXQgPSBhdl9zYW1wbGVzX2ZpbGxfYXJyYXlzKCh1aW50OF90ICoqKSBzLT5leHRyYV9jaGFubmVscywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5leHRyYV9jaGFubmVsc19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9jaGFubmVscyAtIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzLCBhdmN0eC0+c2FtcGxlX2ZtdCwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBmaWx0ZXIgdG8gZ2V0IGZpbmFsIG91dHB1dCAqLworICAgIGZvciAoaSA9IDA7IGkgPCAocy0+c2FtcGxlX2Jsb2NrcyAvIDgpOyBpKyspIHsKKyAgICAgICAgaW50IGNoOworCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgcy0+c2FtcGxlc19jaGFucHRyW2NoXSA9IHNhbXBsZXNfZmx0W2NoXSArIGkgKiAyNTY7CisgICAgICAgIGZvciAoOyBjaCA8IGZ1bGxfY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBzLT5zYW1wbGVzX2NoYW5wdHJbY2hdID0gcy0+ZXh0cmFfY2hhbm5lbHNbY2ggLSBjaGFubmVsc10gKyBpICogMjU2OworCisgICAgICAgIGRjYV9maWx0ZXJfY2hhbm5lbHMocywgaSk7CisKKyAgICAgICAgLyogSWYgdGhpcyB3YXMgbWFya2VkIGFzIGEgRFRTLUVTIHN0cmVhbSB3ZSBuZWVkIHRvIHN1YnRyYWN0IGJhY2stICovCisgICAgICAgIC8qIGNoYW5uZWwgZnJvbSBTTCAmIFNSIHRvIHJlbW92ZSBtYXRyaXhlZCBiYWNrLWNoYW5uZWwgc2lnbmFsICovCisgICAgICAgIGlmICgocy0+c291cmNlX3BjbV9yZXMgJiAxKSAmJiBzLT54Y2hfcHJlc2VudCkgeworICAgICAgICAgICAgZmxvYXQgKmJhY2tfY2hhbiA9IHMtPnNhbXBsZXNfY2hhbnB0cltzLT5jaGFubmVsX29yZGVyX3RhYltzLT54Y2hfYmFzZV9jaGFubmVsXV07CisgICAgICAgICAgICBmbG9hdCAqbHRfY2hhbiAgID0gcy0+c2FtcGxlc19jaGFucHRyW3MtPmNoYW5uZWxfb3JkZXJfdGFiW3MtPnhjaF9iYXNlX2NoYW5uZWwgLSAyXV07CisgICAgICAgICAgICBmbG9hdCAqcnRfY2hhbiAgID0gcy0+c2FtcGxlc19jaGFucHRyW3MtPmNoYW5uZWxfb3JkZXJfdGFiW3MtPnhjaF9iYXNlX2NoYW5uZWwgLSAxXV07CisgICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm1hY19zY2FsYXIobHRfY2hhbiwgYmFja19jaGFuLCAtTV9TUVJUMV8yLCAyNTYpOworICAgICAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtYWNfc2NhbGFyKHJ0X2NoYW4sIGJhY2tfY2hhbiwgLU1fU1FSVDFfMiwgMjU2KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHN0cmVhbSBjb250YWlucyBYWENILCB3ZSBtaWdodCBuZWVkIHRvIHVuZG8gYW4gZW1iZWRkZWQgZG93bm1peCAqLworICAgICAgICBpZiAocy0+eHhjaF9kbWl4X2VtYmVkZGVkKSB7CisgICAgICAgICAgICAvKiBMb29wIG92ZXIgY2hhbm5lbCBzZXRzIGluIHR1cm4gKi8KKyAgICAgICAgICAgIGNoID0gbnVtX2NvcmVfY2hhbm5lbHM7CisgICAgICAgICAgICBmb3IgKGNoc2V0ID0gMDsgY2hzZXQgPCBzLT54eGNoX2Noc2V0OyBjaHNldCsrKSB7CisgICAgICAgICAgICAgICAgZW5kY2ggPSBjaCArIHMtPnh4Y2hfY2hzZXRfbmNoW2Noc2V0XTsKKyAgICAgICAgICAgICAgICBtYXNrID0gcy0+eHhjaF9kbWl4X2VtYmVkZGVkOworCisgICAgICAgICAgICAgICAgLyogdW5kbyBkb3dubWl4ICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gY2g7IGogPCBlbmRjaDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrICYgKDEgPDwgaikpIHsgLyogdGhpcyBjaGFubmVsIGhhcyBiZWVuIG1peGVkLW91dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NoYW4gPSBzLT5zYW1wbGVzX2NoYW5wdHJbcy0+Y2hhbm5lbF9vcmRlcl90YWJbal1dOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGVuZGNoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2hhbiA9IHMtPmNoYW5uZWxfb3JkZXJfdGFiW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gcy0+eHhjaF9kbWl4X2NvZWZmW2pdW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2FsZSAhPSAwLjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2NoYW4gPSBzLT5zYW1wbGVzX2NoYW5wdHJbYWNoYW5dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm1hY19zY2FsYXIoZHN0X2NoYW4sIHNyY19jaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2NhbGUsIDI1Nik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogaWYgYSBkb3dubWl4IGhhcyBiZWVuIGVtYmVkZGVkIHRoZW4gdW5kbyB0aGUgcHJlLXNjYWxpbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoKG1hc2sgJiAoMSA8PCBjaCkpICYmIHMtPnh4Y2hfZG1peF9zZltjaHNldF0gIT0gMS4wZikgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHMtPnh4Y2hfZG1peF9zZltjaHNldF07CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jaGFuID0gcy0+c2FtcGxlc19jaGFucHRyW3MtPmNoYW5uZWxfb3JkZXJfdGFiW2pdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAyNTY7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY2hhbltrXSAqPSBzY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIExGRSBjaGFubmVsIGlzIGFsd2F5cyBwYXJ0IG9mIGNvcmUsIHNjYWxlIGlmIGl0IGV4aXN0cyAqLworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bGZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY2hhbiA9IHMtPnNhbXBsZXNfY2hhbnB0cltzLT5sZmVfaW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI1NjsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jaGFuW2tdICo9IHNjYWxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2ggPSBlbmRjaDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgLyogdXBkYXRlIGxmZSBoaXN0b3J5ICovCisgICAgbGZlX3NhbXBsZXMgPSAyICogcy0+bGZlICogKHMtPnNhbXBsZV9ibG9ja3MgLyA4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMiAqIHMtPmxmZSAqIDQ7IGkrKykKKyAgICAgICAgcy0+bGZlX2RhdGFbaV0gPSBzLT5sZmVfZGF0YVtpICsgbGZlX3NhbXBsZXNdOworCisgICAgLyogQVZNYXRyaXhFbmNvZGluZworICAgICAqCisgICAgICogRENBX1NURVJFT19UT1RBTCAoTHQvUnQpIGlzIGVxdWl2YWxlbnQgdG8gRG9sYnkgU3Vycm91bmQgKi8KKyAgICByZXQgPSBmZl9zaWRlX2RhdGFfdXBkYXRlX21hdHJpeF9lbmNvZGluZyhmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+b3V0cHV0ICYgfkRDQV9MRkUpID09IERDQV9TVEVSRU9fVE9UQUwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX01BVFJJWF9FTkNPRElOR19ET0xCWSA6IEFWX01BVFJJWF9FTkNPRElOR19OT05FKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworLyoqCisgKiBEQ0EgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBAcGFyYW0gYXZjdHggICAgIHBvaW50ZXIgdG8gdGhlIEFWQ29kZWNDb250ZXh0CisgKi8KKworc3RhdGljIGF2X2NvbGQgaW50IGRjYV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRENBQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIGRjYV9pbml0X3ZsY3MoKTsKKworICAgIHMtPmZkc3AgPSBhdnByaXZfZmxvYXRfZHNwX2FsbG9jKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpOworICAgIGlmICghcy0+ZmRzcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZmX21kY3RfaW5pdCgmcy0+aW1kY3QsIDYsIDEsIDEuMCk7CisgICAgZmZfc3ludGhfZmlsdGVyX2luaXQoJnMtPnN5bnRoKTsKKyAgICBmZl9kY2Fkc3BfaW5pdCgmcy0+ZGNhZHNwKTsKKyAgICBmZl9mbXRfY29udmVydF9pbml0KCZzLT5mbXRfY29udiwgYXZjdHgpOworCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX0ZMVFA7CisKKyAgICAvKiBhbGxvdyBkb3dubWl4aW5nIHRvIHN0ZXJlbyAqLworI2lmIEZGX0FQSV9SRVFVRVNUX0NIQU5ORUxTCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgaWYgKGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxzID09IDIpCisgICAgICAgIGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IDIgJiYKKyAgICAgICAgYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgPT0gQVZfQ0hfTEFZT1VUX1NURVJFTykKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxzID0gMjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGNhX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIERDQUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGZmX21kY3RfZW5kKCZzLT5pbWRjdCk7CisgICAgYXZfZnJlZXAoJnMtPmV4dHJhX2NoYW5uZWxzX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPmZkc3ApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZQcm9maWxlIHByb2ZpbGVzW10gPSB7CisgICAgeyBGRl9QUk9GSUxFX0RUUywgICAgICAgICJEVFMiICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9EVFNfRVMsICAgICAiRFRTLUVTIiAgICAgfSwKKyAgICB7IEZGX1BST0ZJTEVfRFRTXzk2XzI0LCAgIkRUUyA5Ni8yNCIgIH0sCisgICAgeyBGRl9QUk9GSUxFX0RUU19IRF9IUkEsICJEVFMtSEQgSFJBIiB9LAorICAgIHsgRkZfUFJPRklMRV9EVFNfSERfTUEsICAiRFRTLUhEIE1BIiAgfSwKKyAgICB7IEZGX1BST0ZJTEVfVU5LTk9XTiB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJkaXNhYmxlX3hjaCIsICJkaXNhYmxlIGRlY29kaW5nIG9mIHRoZSBYQ2ggZXh0ZW5zaW9uIiwgb2Zmc2V0b2YoRENBQ29udGV4dCwgeGNoX2Rpc2FibGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZGNhX2RlY29kZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiRENBIGRlY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVDT0RFUiwKK307CisKK0FWQ29kZWMgZmZfZGNhX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICA9ICJkY2EiLAorICAgIC5sb25nX25hbWUgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRENBIChEVFMgQ29oZXJlbnQgQWNvdXN0aWNzKSIpLAorICAgIC50eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0RUUywKKyAgICAucHJpdl9kYXRhX3NpemUgID0gc2l6ZW9mKERDQUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgPSBkY2FfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgICA9IGRjYV9kZWNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgICA9IGRjYV9kZWNvZGVfZW5kLAorICAgIC5jYXBhYmlsaXRpZXMgICAgPSBDT0RFQ19DQVBfQ0hBTk5FTF9DT05GIHwgQ09ERUNfQ0FQX0RSMSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLnByb2ZpbGVzICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKHByb2ZpbGVzKSwKKyAgICAucHJpdl9jbGFzcyAgICAgID0gJmRjYV9kZWNvZGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RjYWRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGNhZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyZDk2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RjYWRzcC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEdpbGRhcyBCYXppbgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2luY2x1ZGUgImRjYWRzcC5oIgorCitzdGF0aWMgdm9pZCBkZWNvZGVfaGZfYyhmbG9hdCBkc3RbRENBX1NVQkJBTkRTXVs4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnFfbnVtW0RDQV9TVUJCQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgaGZfdnFbMTAyNF1bMzJdLCBpbnRwdHJfdCB2cV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNjYWxlW0RDQV9TVUJCQU5EU11bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBzdGFydCwgaW50cHRyX3QgZW5kKQoreworICAgIGludCBpLCBsOworCisgICAgZm9yIChsID0gc3RhcnQ7IGwgPCBlbmQ7IGwrKykgeworICAgICAgICAvKiAxIHZlY3RvciAtPiAzMiBzYW1wbGVzIGJ1dCB3ZSBvbmx5IG5lZWQgdGhlIDggc2FtcGxlcworICAgICAgICAgKiBmb3IgdGhpcyBzdWJzdWJmcmFtZS4gKi8KKyAgICAgICAgY29uc3QgaW50OF90ICpwdHIgPSAmaGZfdnFbdnFfbnVtW2xdXVt2cV9vZmZzZXRdOworICAgICAgICBmbG9hdCBmc2NhbGUgPSBzY2FsZVtsXVswXSAqICgxIC8gMTYuMCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBkc3RbbF1baV0gPSBwdHJbaV0gKiBmc2NhbGU7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGNhX2xmZV9maXIoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLCBjb25zdCBmbG9hdCAqY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY2lmYWN0b3IpCit7CisgICAgZmxvYXQgKm91dDIgICAgPSBvdXQgKyAyICogZGVjaWZhY3RvciAtIDE7CisgICAgaW50IG51bV9jb2VmZnMgPSAyNTYgLyBkZWNpZmFjdG9yOworICAgIGludCBqLCBrOworCisgICAgLyogT25lIGRlY2ltYXRlZCBzYW1wbGUgZ2VuZXJhdGVzIDIqZGVjaWZhY3RvciBpbnRlcnBvbGF0ZWQgb25lcyAqLworICAgIGZvciAoayA9IDA7IGsgPCBkZWNpZmFjdG9yOyBrKyspIHsKKyAgICAgICAgZmxvYXQgdjAgPSAwLjA7CisgICAgICAgIGZsb2F0IHYxID0gMC4wOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX2NvZWZmczsgaisrLCBjb2VmcysrKSB7CisgICAgICAgICAgICB2MCArPSBpblstal0gICAgICAgICAgICAgICAgICogKmNvZWZzOworICAgICAgICAgICAgdjEgKz0gaW5baiArIDEgLSBudW1fY29lZmZzXSAqICpjb2VmczsKKyAgICAgICAgfQorICAgICAgICAqb3V0KysgID0gdjA7CisgICAgICAgICpvdXQyLS0gPSB2MTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjYV9xbWZfMzJfc3ViYmFuZHMoZmxvYXQgc2FtcGxlc19pblszMl1bOF0sIGludCBzYl9hY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRoRmlsdGVyQ29udGV4dCAqc3ludGgsIEZGVENvbnRleHQgKmltZGN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzeW50aF9idWZfcHRyWzUxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc3ludGhfYnVmX29mZnNldCwgZmxvYXQgc3ludGhfYnVmMlszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHdpbmRvd1s1MTJdLCBmbG9hdCAqc2FtcGxlc19vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJhWGluWzMyXSwgZmxvYXQgc2NhbGUpCit7CisgICAgaW50IGk7CisgICAgaW50IHN1YmluZGV4OworCisgICAgZm9yIChpID0gc2JfYWN0OyBpIDwgMzI7IGkrKykKKyAgICAgICAgcmFYaW5baV0gPSAwLjA7CisKKyAgICAvKiBSZWNvbnN0cnVjdGVkIGNoYW5uZWwgc2FtcGxlIGluZGV4ICovCisgICAgZm9yIChzdWJpbmRleCA9IDA7IHN1YmluZGV4IDwgODsgc3ViaW5kZXgrKykgeworICAgICAgICAvKiBMb2FkIGluIG9uZSBzYW1wbGUgZnJvbSBlYWNoIHN1YmJhbmQgYW5kIGNsZWFyIGluYWN0aXZlIHN1YmJhbmRzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzYl9hY3Q7IGkrKykgeworICAgICAgICAgICAgdW5zaWduZWQgc2lnbiA9IChpIC0gMSkgJiAyOworICAgICAgICAgICAgdWludDMyX3QgdiAgICA9IEFWX1JOMzJBKCZzYW1wbGVzX2luW2ldW3N1YmluZGV4XSkgXiBzaWduIDw8IDMwOworICAgICAgICAgICAgQVZfV04zMkEoJnJhWGluW2ldLCB2KTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bnRoLT5zeW50aF9maWx0ZXJfZmxvYXQoaW1kY3QsIHN5bnRoX2J1Zl9wdHIsIHN5bnRoX2J1Zl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGhfYnVmMiwgd2luZG93LCBzYW1wbGVzX291dCwgcmFYaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOworICAgICAgICBzYW1wbGVzX291dCArPSAzMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjYV9sZmVfZmlyMF9jKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgY29uc3QgZmxvYXQgKmNvZWZzKQoreworICAgIGRjYV9sZmVfZmlyKG91dCwgaW4sIGNvZWZzLCAzMik7Cit9CisKK3N0YXRpYyB2b2lkIGRjYV9sZmVfZmlyMV9jKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgY29uc3QgZmxvYXQgKmNvZWZzKQoreworICAgIGRjYV9sZmVfZmlyKG91dCwgaW4sIGNvZWZzLCA2NCk7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9kY2Fkc3BfaW5pdChEQ0FEU1BDb250ZXh0ICpzKQoreworICAgIHMtPmxmZV9maXJbMF0gICAgICA9IGRjYV9sZmVfZmlyMF9jOworICAgIHMtPmxmZV9maXJbMV0gICAgICA9IGRjYV9sZmVfZmlyMV9jOworICAgIHMtPnFtZl8zMl9zdWJiYW5kcyA9IGRjYV9xbWZfMzJfc3ViYmFuZHM7CisgICAgcy0+ZGVjb2RlX2hmICAgICAgID0gZGVjb2RlX2hmX2M7CisKKyAgICBpZiAoQVJDSF9BUk0pCisgICAgICAgIGZmX2RjYWRzcF9pbml0X2FybShzKTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2RjYWRzcF9pbml0X3g4NihzKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RjYWRzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGNhZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmNTc3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RjYWRzcC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0RDQURTUF9ICisjZGVmaW5lIEFWQ09ERUNfRENBRFNQX0gKKworI2luY2x1ZGUgImF2ZmZ0LmgiCisjaW5jbHVkZSAic3ludGhfZmlsdGVyLmgiCisKKyNkZWZpbmUgRENBX1NVQkJBTkRTIDY0CisKK3R5cGVkZWYgc3RydWN0IERDQURTUENvbnRleHQgeworICAgIHZvaWQgKCpsZmVfZmlyWzJdKShmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIGNvbnN0IGZsb2F0ICpjb2Vmcyk7CisgICAgdm9pZCAoKnFtZl8zMl9zdWJiYW5kcykoZmxvYXQgc2FtcGxlc19pblszMl1bOF0sIGludCBzYl9hY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGhGaWx0ZXJDb250ZXh0ICpzeW50aCwgRkZUQ29udGV4dCAqaW1kY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3ludGhfYnVmX3B0cls1MTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc3ludGhfYnVmX29mZnNldCwgZmxvYXQgc3ludGhfYnVmMlszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgd2luZG93WzUxMl0sIGZsb2F0ICpzYW1wbGVzX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByYVhpblszMl0sIGZsb2F0IHNjYWxlKTsKKyAgICB2b2lkICgqZGVjb2RlX2hmKShmbG9hdCBkc3RbRENBX1NVQkJBTkRTXVs4XSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZxX251bVtEQ0FfU1VCQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCBoZl92cVsxMDI0XVszMl0sIGludHB0cl90IHZxX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNjYWxlW0RDQV9TVUJCQU5EU11bMl0sCisgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgc3RhcnQsIGludHB0cl90IGVuZCk7Cit9IERDQURTUENvbnRleHQ7CisKK3ZvaWQgZmZfZGNhZHNwX2luaXQoRENBRFNQQ29udGV4dCAqcyk7Cit2b2lkIGZmX2RjYWRzcF9pbml0X2FybShEQ0FEU1BDb250ZXh0ICpzKTsKK3ZvaWQgZmZfZGNhZHNwX2luaXRfeDg2KERDQURTUENvbnRleHQgKnMpOworCisjZW5kaWYgLyogQVZDT0RFQ19EQ0FEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZGNhZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kY2FlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDVjZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGNhZW5jLmMKQEAgLTAsMCArMSw5NzUgQEAKKy8qCisgKiBEQ0EgZW5jb2RlcgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIgQWxleGFuZGVyIEUuIFBhdHJha292CisgKiAgICAgICAgICAgICAgIDIwMTAgQmVuamFtaW4gTGFyc3NvbgorICogICAgICAgICAgICAgICAyMDExIFhpYW5nIFdhbmcKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZGNhLmgiCisjaW5jbHVkZSAiZGNhZGF0YS5oIgorI2luY2x1ZGUgImRjYWVuYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisKKyNkZWZpbmUgTUFYX0NIQU5ORUxTIDYKKyNkZWZpbmUgRENBX01BWF9GUkFNRV9TSVpFIDE2Mzg0CisjZGVmaW5lIERDQV9IRUFERVJfU0laRSAxMworI2RlZmluZSBEQ0FfTEZFX1NBTVBMRVMgOAorCisjZGVmaW5lIERDQV9TVUJCQU5EUyAzMgorI2RlZmluZSBTVUJGUkFNRVMgMQorI2RlZmluZSBTVUJTVUJGUkFNRVMgMgorI2RlZmluZSBTVUJCQU5EX1NBTVBMRVMgKFNVQkZSQU1FUyAqIFNVQlNVQkZSQU1FUyAqIDgpCisjZGVmaW5lIEFVQkFORFMgMjUKKwordHlwZWRlZiBzdHJ1Y3QgRENBQ29udGV4dCB7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKyAgICBpbnQgZnJhbWVfYml0czsKKyAgICBpbnQgZnVsbGJhbmRfY2hhbm5lbHM7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBsZmVfY2hhbm5lbDsKKyAgICBpbnQgc2FtcGxlcmF0ZV9pbmRleDsKKyAgICBpbnQgYml0cmF0ZV9pbmRleDsKKyAgICBpbnQgY2hhbm5lbF9jb25maWc7CisgICAgY29uc3QgaW50MzJfdCAqYmFuZF9pbnRlcnBvbGF0aW9uOworICAgIGNvbnN0IGludDMyX3QgKmJhbmRfc3BlY3RydW07CisgICAgaW50IGxmZV9zY2FsZV9mYWN0b3I7CisgICAgc29mdGZsb2F0IGxmZV9xdWFudDsKKyAgICBpbnQzMl90IGxmZV9wZWFrX2NiOworCisgICAgaW50MzJfdCBoaXN0b3J5WzUxMl1bTUFYX0NIQU5ORUxTXTsgLyogVGhpcyBpcyBhIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgIGludDMyX3Qgc3ViYmFuZFtTVUJCQU5EX1NBTVBMRVNdW0RDQV9TVUJCQU5EU11bTUFYX0NIQU5ORUxTXTsKKyAgICBpbnQzMl90IHF1YW50aXplZFtTVUJCQU5EX1NBTVBMRVNdW0RDQV9TVUJCQU5EU11bTUFYX0NIQU5ORUxTXTsKKyAgICBpbnQzMl90IHBlYWtfY2JbRENBX1NVQkJBTkRTXVtNQVhfQ0hBTk5FTFNdOworICAgIGludDMyX3QgZG93bnNhbXBsZWRfbGZlW0RDQV9MRkVfU0FNUExFU107CisgICAgaW50MzJfdCBtYXNraW5nX2N1cnZlX2NiW1NVQlNVQkZSQU1FU11bMjU2XTsKKyAgICBpbnQgYWJpdHNbRENBX1NVQkJBTkRTXVtNQVhfQ0hBTk5FTFNdOworICAgIGludCBzY2FsZV9mYWN0b3JbRENBX1NVQkJBTkRTXVtNQVhfQ0hBTk5FTFNdOworICAgIHNvZnRmbG9hdCBxdWFudFtEQ0FfU1VCQkFORFNdW01BWF9DSEFOTkVMU107CisgICAgaW50MzJfdCBlZmZfbWFza2luZ19jdXJ2ZV9jYlsyNTZdOworICAgIGludDMyX3QgYmFuZF9tYXNraW5nX2NiWzMyXTsKKyAgICBpbnQzMl90IHdvcnN0X3F1YW50aXphdGlvbl9ub2lzZTsKKyAgICBpbnQzMl90IHdvcnN0X25vaXNlX2V2ZXI7CisgICAgaW50IGNvbnN1bWVkX2JpdHM7Cit9IERDQUNvbnRleHQ7CisKK3N0YXRpYyBpbnQzMl90IGNvc190YWJsZVsyMDQ4XTsKK3N0YXRpYyBpbnQzMl90IGJhbmRfaW50ZXJwb2xhdGlvblsyXVs1MTJdOworc3RhdGljIGludDMyX3QgYmFuZF9zcGVjdHJ1bVsyXVs4XTsKK3N0YXRpYyBpbnQzMl90IGF1Zls5XVtBVUJBTkRTXVsyNTZdOworc3RhdGljIGludDMyX3QgY2JfdG9fYWRkWzI1Nl07CitzdGF0aWMgaW50MzJfdCBjYl90b19sZXZlbFsyMDQ4XTsKK3N0YXRpYyBpbnQzMl90IGxmZV9maXJfNjRpWzUxMl07CisKKy8qIFRyYW5zZmVyIGZ1bmN0aW9uIG9mIG91dGVyIGFuZCBtaWRkbGUgZWFyLCBIeiAtPiBkQiAqLworc3RhdGljIGRvdWJsZSBob20oZG91YmxlIGYpCit7CisgICAgZG91YmxlIGYxID0gZiAvIDEwMDA7CisKKyAgICByZXR1cm4gLTMuNjQgKiBwb3coZjEsIC0wLjgpCisgICAgICAgICAgICsgNi44ICogZXhwKC0wLjYgKiAoZjEgLSAzLjQpICogKGYxIC0gMy40KSkKKyAgICAgICAgICAgLSA2LjAgKiBleHAoLTAuMTUgKiAoZjEgLSA4LjcpICogKGYxIC0gOC43KSkKKyAgICAgICAgICAgLSAwLjAwMDYgKiAoZjEgKiBmMSkgKiAoZjEgKiBmMSk7Cit9CisKK3N0YXRpYyBkb3VibGUgZ2FtbWFmaWx0ZXIoaW50IGksIGRvdWJsZSBmKQoreworICAgIGRvdWJsZSBoID0gKGYgLSBmY1tpXSkgLyBlcmJbaV07CisKKyAgICBoID0gMSArIGggKiBoOworICAgIGggPSAxIC8gKGggKiBoKTsKKyAgICByZXR1cm4gMjAgKiBsb2cxMChoKTsKK30KKworc3RhdGljIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRENBQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDY0X3QgbGF5b3V0ID0gYXZjdHgtPmNoYW5uZWxfbGF5b3V0OworICAgIGludCBpLCBtaW5fZnJhbWVfYml0czsKKworICAgIGMtPmZ1bGxiYW5kX2NoYW5uZWxzID0gYy0+Y2hhbm5lbHMgPSBhdmN0eC0+Y2hhbm5lbHM7CisgICAgYy0+bGZlX2NoYW5uZWwgPSAoYXZjdHgtPmNoYW5uZWxzID09IDMgfHwgYXZjdHgtPmNoYW5uZWxzID09IDYpOworICAgIGMtPmJhbmRfaW50ZXJwb2xhdGlvbiA9IGJhbmRfaW50ZXJwb2xhdGlvblsxXTsKKyAgICBjLT5iYW5kX3NwZWN0cnVtID0gYmFuZF9zcGVjdHJ1bVsxXTsKKyAgICBjLT53b3JzdF9xdWFudGl6YXRpb25fbm9pc2UgPSAtMjA0NzsKKyAgICBjLT53b3JzdF9ub2lzZV9ldmVyID0gLTIwNDc7CisKKyAgICBpZiAoIWxheW91dCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiTm8gY2hhbm5lbCBsYXlvdXQgc3BlY2lmaWVkLiBUaGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RlciB3aWxsIGd1ZXNzIHRoZSBsYXlvdXQsIGJ1dCBpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaWdodCBiZSBpbmNvcnJlY3QuXG4iKTsKKyAgICAgICAgbGF5b3V0ID0gYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQoYXZjdHgtPmNoYW5uZWxzKTsKKyAgICB9CisgICAgc3dpdGNoIChsYXlvdXQpIHsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF9NT05POiAgICAgICAgIGMtPmNoYW5uZWxfY29uZmlnID0gMDsgYnJlYWs7CisgICAgY2FzZSBBVl9DSF9MQVlPVVRfU1RFUkVPOiAgICAgICBjLT5jaGFubmVsX2NvbmZpZyA9IDI7IGJyZWFrOworICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzJfMjogICAgICAgICAgYy0+Y2hhbm5lbF9jb25maWcgPSA4OyBicmVhazsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF81UE9JTlQwOiAgICAgIGMtPmNoYW5uZWxfY29uZmlnID0gOTsgYnJlYWs7CisgICAgY2FzZSBBVl9DSF9MQVlPVVRfNVBPSU5UMTogICAgICBjLT5jaGFubmVsX2NvbmZpZyA9IDk7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgY2hhbm5lbCBsYXlvdXQhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGlmIChjLT5sZmVfY2hhbm5lbCkKKyAgICAgICAgYy0+ZnVsbGJhbmRfY2hhbm5lbHMtLTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKyAgICAgICAgaWYgKHNhbXBsZV9yYXRlc1tpXSA9PSBhdmN0eC0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gOSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBjLT5zYW1wbGVyYXRlX2luZGV4ID0gaTsKKworICAgIGlmIChhdmN0eC0+Yml0X3JhdGUgPCAzMjAwMCB8fCBhdmN0eC0+Yml0X3JhdGUgPiAzODQwMDAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQml0IHJhdGUgJWkgbm90IHN1cHBvcnRlZC4iLCBhdmN0eC0+Yml0X3JhdGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBkY2FfYml0X3JhdGVzW2ldIDwgYXZjdHgtPmJpdF9yYXRlOyBpKyspCisgICAgICAgIDsKKyAgICBjLT5iaXRyYXRlX2luZGV4ID0gaTsKKyAgICBhdmN0eC0+Yml0X3JhdGUgPSBkY2FfYml0X3JhdGVzW2ldOworICAgIGMtPmZyYW1lX2JpdHMgPSBGRkFMSUdOKChhdmN0eC0+Yml0X3JhdGUgKiA1MTIgKyBhdmN0eC0+c2FtcGxlX3JhdGUgLSAxKSAvIGF2Y3R4LT5zYW1wbGVfcmF0ZSwgMzIpOworICAgIG1pbl9mcmFtZV9iaXRzID0gMTMyICsgKDQ5MyArIDI4ICogMzIpICogYy0+ZnVsbGJhbmRfY2hhbm5lbHMgKyBjLT5sZmVfY2hhbm5lbCAqIDcyOworICAgIGlmIChjLT5mcmFtZV9iaXRzIDwgbWluX2ZyYW1lX2JpdHMgfHwgYy0+ZnJhbWVfYml0cyA+IChEQ0FfTUFYX0ZSQU1FX1NJWkUgPDwgMykpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBjLT5mcmFtZV9zaXplID0gKGMtPmZyYW1lX2JpdHMgKyA3KSAvIDg7CisKKyAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IDMyICogU1VCQkFORF9TQU1QTEVTOworCisgICAgaWYgKCFjb3NfdGFibGVbMF0pIHsKKyAgICAgICAgaW50IGosIGs7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIwNDg7IGkrKykgeworICAgICAgICAgICAgY29zX3RhYmxlW2ldICAgPSAoaW50MzJfdCkoMHg3ZmZmZmZmZiAqIGNvcyhNX1BJICogaSAvIDEwMjQpKTsKKyAgICAgICAgICAgIGNiX3RvX2xldmVsW2ldID0gKGludDMyX3QpKDB4N2ZmZmZmZmYgKiBwb3coMTAsIC0wLjAwNSAqIGkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZJWE1FOiBwcm9iYWJseSBpbmNvcnJlY3QgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICBsZmVfZmlyXzY0aVtpXSA9IChpbnQzMl90KSgweDAxZmZmZmZmICogbGZlX2Zpcl82NFtpXSk7CisgICAgICAgICAgICBsZmVfZmlyXzY0aVs1MTEgLSBpXSA9IChpbnQzMl90KSgweDAxZmZmZmZmICogbGZlX2Zpcl82NFtpXSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKyAgICAgICAgICAgIGJhbmRfaW50ZXJwb2xhdGlvblswXVtpXSA9IChpbnQzMl90KSgweDEwMDAwMDAwMDBVTEwgKiBmaXJfMzJiYW5kc19wZXJmZWN0W2ldKTsKKyAgICAgICAgICAgIGJhbmRfaW50ZXJwb2xhdGlvblsxXVtpXSA9IChpbnQzMl90KSgweDEwMDAwMDAwMDBVTEwgKiBmaXJfMzJiYW5kc19ub25wZXJmZWN0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBBVUJBTkRTOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjU2OyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGZyZXEgPSBzYW1wbGVfcmF0ZXNbaV0gKiAoayArIDAuNSkgLyA1MTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXVmW2ldW2pdW2tdID0gKGludDMyX3QpKDEwICogKGhvbShmcmVxKSArIGdhbW1hZmlsdGVyKGosIGZyZXEpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgYWRkID0gMSArIHBvdygxMCwgLTAuMDEgKiBpKTsKKyAgICAgICAgICAgIGNiX3RvX2FkZFtpXSA9IChpbnQzMl90KSgxMDAgKiBsb2cxMChhZGQpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgICAgICBkb3VibGUgYWNjdW0gPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIHJlY29uc3QgPSBmaXJfMzJiYW5kc19wZXJmZWN0W2ldICogKChpICYgNjQpID8gKC0xKSA6IDEpOworICAgICAgICAgICAgICAgIGFjY3VtICs9IHJlY29uc3QgKiBjb3MoMiAqIE1fUEkgKiAoaSArIDAuNSAtIDI1NikgKiAoaiArIDAuNSkgLyA1MTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmFuZF9zcGVjdHJ1bVswXVtqXSA9IChpbnQzMl90KSgyMDAgKiBsb2cxMChhY2N1bSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBhY2N1bSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcmVjb25zdCA9IGZpcl8zMmJhbmRzX25vbnBlcmZlY3RbaV0gKiAoKGkgJiA2NCkgPyAoLTEpIDogMSk7CisgICAgICAgICAgICAgICAgYWNjdW0gKz0gcmVjb25zdCAqIGNvcygyICogTV9QSSAqIChpICsgMC41IC0gMjU2KSAqIChqICsgMC41KSAvIDUxMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiYW5kX3NwZWN0cnVtWzFdW2pdID0gKGludDMyX3QpKDIwMCAqIGxvZzEwKGFjY3VtKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBjb3NfdChpbnQgeCkKK3sKKyAgICByZXR1cm4gY29zX3RhYmxlW3ggJiAyMDQ3XTsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IHNpbl90KGludCB4KQoreworICAgIHJldHVybiBjb3NfdCh4IC0gNTEyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IGhhbGYzMihpbnQzMl90IGEpCit7CisgICAgcmV0dXJuIChhICsgMSkgPj4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IG11bDMyKGludDMyX3QgYSwgaW50MzJfdCBiKQoreworICAgIGludDY0X3QgciA9IChpbnQ2NF90KWEgKiBiICsgMHg4MDAwMDAwMFVMTDsKKyAgICByZXR1cm4gciA+PiAzMjsKK30KKworc3RhdGljIHZvaWQgc3ViYmFuZF90cmFuc2Zvcm0oRENBQ29udGV4dCAqYywgY29uc3QgaW50MzJfdCAqaW5wdXQpCit7CisgICAgaW50IGNoLCBzdWJzLCBpLCBrLCBqOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+ZnVsbGJhbmRfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgLyogSGlzdG9yeSBpcyBjb3BpZWQgYmVjYXVzZSBpdCBpcyBhbHNvIG5lZWRlZCBmb3IgUFNZICovCisgICAgICAgIGludDMyX3QgaGlzdFs1MTJdOworICAgICAgICBpbnQgaGlzdF9zdGFydCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKQorICAgICAgICAgICAgaGlzdFtpXSA9IGMtPmhpc3RvcnlbaV1bY2hdOworCisgICAgICAgIGZvciAoc3VicyA9IDA7IHN1YnMgPCBTVUJCQU5EX1NBTVBMRVM7IHN1YnMrKykgeworICAgICAgICAgICAgaW50MzJfdCBhY2N1bVs2NF07CisgICAgICAgICAgICBpbnQzMl90IHJlc3A7CisgICAgICAgICAgICBpbnQgYmFuZDsKKworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBjb252b2x1dGlvbnMgYXQgb25jZSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICAgICAgYWNjdW1baV0gPSAwOworCisgICAgICAgICAgICBmb3IgKGsgPSAwLCBpID0gaGlzdF9zdGFydCwgaiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGkgPCA1MTI7IGsgPSAoayArIDEpICYgNjMsIGkrKywgaisrKQorICAgICAgICAgICAgICAgIGFjY3VtW2tdICs9IG11bDMyKGhpc3RbaV0sIGMtPmJhbmRfaW50ZXJwb2xhdGlvbltqXSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGlzdF9zdGFydDsgayA9IChrICsgMSkgJiA2MywgaSsrLCBqKyspCisgICAgICAgICAgICAgICAgYWNjdW1ba10gKz0gbXVsMzIoaGlzdFtpXSwgYy0+YmFuZF9pbnRlcnBvbGF0aW9uW2pdKTsKKworICAgICAgICAgICAgZm9yIChrID0gMTY7IGsgPCAzMjsgaysrKQorICAgICAgICAgICAgICAgIGFjY3VtW2tdID0gYWNjdW1ba10gLSBhY2N1bVszMSAtIGtdOworICAgICAgICAgICAgZm9yIChrID0gMzI7IGsgPCA0ODsgaysrKQorICAgICAgICAgICAgICAgIGFjY3VtW2tdID0gYWNjdW1ba10gKyBhY2N1bVs5NSAtIGtdOworCisgICAgICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgMzI7IGJhbmQrKykgeworICAgICAgICAgICAgICAgIHJlc3AgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDE2OyBpIDwgNDg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgcyA9ICgyICogYmFuZCArIDEpICogKDIgKiAoaSArIDE2KSArIDEpOworICAgICAgICAgICAgICAgICAgICByZXNwICs9IG11bDMyKGFjY3VtW2ldLCBjb3NfdChzIDw8IDMpKSA+PiAzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGMtPnN1YmJhbmRbc3Vic11bYmFuZF1bY2hdID0gKChiYW5kICsgMSkgJiAyKSA/IC1yZXNwIDogcmVzcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29weSBpbiAzMiBuZXcgc2FtcGxlcyBmcm9tIGlucHV0ICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICAgICAgICAgICAgICBoaXN0W2kgKyBoaXN0X3N0YXJ0XSA9IGlucHV0WyhzdWJzICogMzIgKyBpKSAqIGMtPmNoYW5uZWxzICsgY2hdOworICAgICAgICAgICAgaGlzdF9zdGFydCA9IChoaXN0X3N0YXJ0ICsgMzIpICYgNTExOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBsZmVfZG93bnNhbXBsZShEQ0FDb250ZXh0ICpjLCBjb25zdCBpbnQzMl90ICppbnB1dCkKK3sKKyAgICAvKiBGSVhNRTogbWFrZSAxMjh4IExGRSBkb3duc2FtcGxpbmcgcG9zc2libGUgKi8KKyAgICBpbnQgaSwgaiwgbGZlczsKKyAgICBpbnQzMl90IGhpc3RbNTEyXTsKKyAgICBpbnQzMl90IGFjY3VtOworICAgIGludCBoaXN0X3N0YXJ0ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykKKyAgICAgICAgaGlzdFtpXSA9IGMtPmhpc3RvcnlbaV1bYy0+Y2hhbm5lbHMgLSAxXTsKKworICAgIGZvciAobGZlcyA9IDA7IGxmZXMgPCBEQ0FfTEZFX1NBTVBMRVM7IGxmZXMrKykgeworICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIGNvbnZvbHV0aW9uICovCisgICAgICAgIGFjY3VtID0gMDsKKworICAgICAgICBmb3IgKGkgPSBoaXN0X3N0YXJ0LCBqID0gMDsgaSA8IDUxMjsgaSsrLCBqKyspCisgICAgICAgICAgICBhY2N1bSArPSBtdWwzMihoaXN0W2ldLCBsZmVfZmlyXzY0aVtqXSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0X3N0YXJ0OyBpKyssIGorKykKKyAgICAgICAgICAgIGFjY3VtICs9IG11bDMyKGhpc3RbaV0sIGxmZV9maXJfNjRpW2pdKTsKKworICAgICAgICBjLT5kb3duc2FtcGxlZF9sZmVbbGZlc10gPSBhY2N1bTsKKworICAgICAgICAvKiBDb3B5IGluIDY0IG5ldyBzYW1wbGVzIGZyb20gaW5wdXQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICBoaXN0W2kgKyBoaXN0X3N0YXJ0XSA9IGlucHV0WyhsZmVzICogNjQgKyBpKSAqIGMtPmNoYW5uZWxzICsgYy0+Y2hhbm5lbHMgLSAxXTsKKworICAgICAgICBoaXN0X3N0YXJ0ID0gKGhpc3Rfc3RhcnQgKyA2NCkgJiA1MTE7CisgICAgfQorfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCByZTsKKyAgICBpbnQzMl90IGltOworfSBjcGx4MzI7CisKK3N0YXRpYyB2b2lkIGZmdChjb25zdCBpbnQzMl90IGluWzIgKiAyNTZdLCBjcGx4MzIgb3V0WzI1Nl0pCit7CisgICAgY3BseDMyIGJ1ZlsyNTZdLCByaW5bMjU2XSwgcm91dFsyNTZdOworICAgIGludCBpLCBqLCBrLCBsOworCisgICAgLyogZG8gdHdvIHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgLyogQXBwbHkgdGhlIEhhbm4gd2luZG93ICovCisgICAgICAgIHJpbltpXS5yZSA9IG11bDMyKGluWzIgKiBpXSwgMHgzZmZmZmZmZiAtIChjb3NfdCg4ICogaSArIDIpID4+IDEpKTsKKyAgICAgICAgcmluW2ldLmltID0gbXVsMzIoaW5bMiAqIGkgKyAxXSwgMHgzZmZmZmZmZiAtIChjb3NfdCg4ICogaSArIDYpID4+IDEpKTsKKyAgICB9CisgICAgLyogcHJlLXJvdGF0aW9uICovCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGJ1ZltpXS5yZSA9IG11bDMyKGNvc190KDQgKiBpICsgMiksIHJpbltpXS5yZSkKKyAgICAgICAgICAgICAgICAgIC0gbXVsMzIoc2luX3QoNCAqIGkgKyAyKSwgcmluW2ldLmltKTsKKyAgICAgICAgYnVmW2ldLmltID0gbXVsMzIoY29zX3QoNCAqIGkgKyAyKSwgcmluW2ldLmltKQorICAgICAgICAgICAgICAgICAgKyBtdWwzMihzaW5fdCg0ICogaSArIDIpLCByaW5baV0ucmUpOworICAgIH0KKworICAgIGZvciAoaiA9IDI1NiwgbCA9IDE7IGogIT0gMTsgaiA+Pj0gMSwgbCA8PD0gMSkgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjU2OyBrICs9IGopIHsKKyAgICAgICAgICAgIGZvciAoaSA9IGs7IGkgPCBrICsgaiAvIDI7IGkrKykgeworICAgICAgICAgICAgICAgIGNwbHgzMiBzdW0sIGRpZmY7CisgICAgICAgICAgICAgICAgaW50IHQgPSA4ICogbCAqIGk7CisKKyAgICAgICAgICAgICAgICBzdW0ucmUgPSBidWZbaV0ucmUgKyBidWZbaSArIGogLyAyXS5yZTsKKyAgICAgICAgICAgICAgICBzdW0uaW0gPSBidWZbaV0uaW0gKyBidWZbaSArIGogLyAyXS5pbTsKKworICAgICAgICAgICAgICAgIGRpZmYucmUgPSBidWZbaV0ucmUgLSBidWZbaSArIGogLyAyXS5yZTsKKyAgICAgICAgICAgICAgICBkaWZmLmltID0gYnVmW2ldLmltIC0gYnVmW2kgKyBqIC8gMl0uaW07CisKKyAgICAgICAgICAgICAgICBidWZbaV0ucmUgPSBoYWxmMzIoc3VtLnJlKTsKKyAgICAgICAgICAgICAgICBidWZbaV0uaW0gPSBoYWxmMzIoc3VtLmltKTsKKworICAgICAgICAgICAgICAgIGJ1ZltpICsgaiAvIDJdLnJlID0gbXVsMzIoZGlmZi5yZSwgY29zX3QodCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtdWwzMihkaWZmLmltLCBzaW5fdCh0KSk7CisgICAgICAgICAgICAgICAgYnVmW2kgKyBqIC8gMl0uaW0gPSBtdWwzMihkaWZmLmltLCBjb3NfdCh0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG11bDMyKGRpZmYucmUsIHNpbl90KHQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBwb3N0LXJvdGF0aW9uICovCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGludCBiID0gZmZfcmV2ZXJzZVtpXTsKKyAgICAgICAgcm91dFtpXS5yZSA9IG11bDMyKGJ1ZltiXS5yZSwgY29zX3QoNCAqIGkpKQorICAgICAgICAgICAgICAgICAgIC0gbXVsMzIoYnVmW2JdLmltLCBzaW5fdCg0ICogaSkpOworICAgICAgICByb3V0W2ldLmltID0gbXVsMzIoYnVmW2JdLmltLCBjb3NfdCg0ICogaSkpCisgICAgICAgICAgICAgICAgICAgKyBtdWwzMihidWZbYl0ucmUsIHNpbl90KDQgKiBpKSk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAvKiBzZXBhcmF0ZSB0aGUgcmVzdWx0cyBvZiB0aGUgdHdvIHRyYW5zZm9ybXMgKi8KKyAgICAgICAgY3BseDMyIG8xLCBvMjsKKworICAgICAgICBvMS5yZSA9ICByb3V0W2ldLnJlIC0gcm91dFsyNTUgLSBpXS5yZTsKKyAgICAgICAgbzEuaW0gPSAgcm91dFtpXS5pbSArIHJvdXRbMjU1IC0gaV0uaW07CisKKyAgICAgICAgbzIucmUgPSAgcm91dFtpXS5pbSAtIHJvdXRbMjU1IC0gaV0uaW07CisgICAgICAgIG8yLmltID0gLXJvdXRbaV0ucmUgLSByb3V0WzI1NSAtIGldLnJlOworCisgICAgICAgIC8qIGNvbWJpbmUgdGhlbSBpbnRvIG9uZSBsb25nIHRyYW5zZm9ybSAqLworICAgICAgICBvdXRbaV0ucmUgPSBtdWwzMiggbzEucmUgKyBvMi5yZSwgY29zX3QoMiAqIGkgKyAxKSkKKyAgICAgICAgICAgICAgICAgICsgbXVsMzIoIG8xLmltIC0gbzIuaW0sIHNpbl90KDIgKiBpICsgMSkpOworICAgICAgICBvdXRbaV0uaW0gPSBtdWwzMiggbzEuaW0gKyBvMi5pbSwgY29zX3QoMiAqIGkgKyAxKSkKKyAgICAgICAgICAgICAgICAgICsgbXVsMzIoLW8xLnJlICsgbzIucmUsIHNpbl90KDIgKiBpICsgMSkpOworICAgIH0KK30KKworc3RhdGljIGludDMyX3QgZ2V0X2NiKGludDMyX3QgaW4pCit7CisgICAgaW50IGksIHJlczsKKworICAgIHJlcyA9IDA7CisgICAgaWYgKGluIDwgMCkKKyAgICAgICAgaW4gPSAtaW47CisgICAgZm9yIChpID0gMTAyNDsgaSA+IDA7IGkgPj49IDEpIHsKKyAgICAgICAgaWYgKGNiX3RvX2xldmVsW2kgKyByZXNdID49IGluKQorICAgICAgICAgICAgcmVzICs9IGk7CisgICAgfQorICAgIHJldHVybiAtcmVzOworfQorCitzdGF0aWMgaW50MzJfdCBhZGRfY2IoaW50MzJfdCBhLCBpbnQzMl90IGIpCit7CisgICAgaWYgKGEgPCBiKQorICAgICAgICBGRlNXQVAoaW50MzJfdCwgYSwgYik7CisKKyAgICBpZiAoYSAtIGIgPj0gMjU2KQorICAgICAgICByZXR1cm4gYTsKKyAgICByZXR1cm4gYSArIGNiX3RvX2FkZFthIC0gYl07Cit9CisKK3N0YXRpYyB2b2lkIGFkanVzdF9qbmQoaW50IHNhbXBsZXJhdGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaW5bNTEyXSwgaW50MzJfdCBvdXRfY2JbMjU2XSkKK3sKKyAgICBpbnQzMl90IHBvd2VyWzI1Nl07CisgICAgY3BseDMyIG91dFsyNTZdOworICAgIGludDMyX3Qgb3V0X2NiX3Vubm9ybVsyNTZdOworICAgIGludDMyX3QgZGVub207CisgICAgY29uc3QgaW50MzJfdCBjYV9jYiA9IC0xMTE0OworICAgIGNvbnN0IGludDMyX3QgY3NfY2IgPSA5Mjg7CisgICAgaW50IGksIGo7CisKKyAgICBmZnQoaW4sIG91dCk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKyAgICAgICAgcG93ZXJbal0gPSBhZGRfY2IoZ2V0X2NiKG91dFtqXS5yZSksIGdldF9jYihvdXRbal0uaW0pKTsKKyAgICAgICAgb3V0X2NiX3Vubm9ybVtqXSA9IC0yMDQ3OyAvKiBhbmQgY2FuIG9ubHkgZ3JvdyAqLworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBBVUJBTkRTOyBpKyspIHsKKyAgICAgICAgZGVub20gPSBjYV9jYjsgLyogYW5kIGNhbiBvbmx5IGdyb3cgKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQorICAgICAgICAgICAgZGVub20gPSBhZGRfY2IoZGVub20sIHBvd2VyW2pdICsgYXVmW3NhbXBsZXJhdGVfaW5kZXhdW2ldW2pdKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQorICAgICAgICAgICAgb3V0X2NiX3Vubm9ybVtqXSA9IGFkZF9jYihvdXRfY2JfdW5ub3JtW2pdLAorICAgICAgICAgICAgICAgICAgICAtZGVub20gKyBhdWZbc2FtcGxlcmF0ZV9pbmRleF1baV1bal0pOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCAyNTY7IGorKykKKyAgICAgICAgb3V0X2NiW2pdID0gYWRkX2NiKG91dF9jYltqXSwgLW91dF9jYl91bm5vcm1bal0gLSBjYV9jYiAtIGNzX2NiKTsKK30KKwordHlwZWRlZiB2b2lkICgqd2Fsa19iYW5kX3QpKERDQUNvbnRleHQgKmMsIGludCBiYW5kMSwgaW50IGJhbmQyLCBpbnQgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNwZWN0cnVtMSwgaW50MzJfdCBzcGVjdHJ1bTIsIGludCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKiBhcmcpOworCitzdGF0aWMgdm9pZCB3YWxrX2JhbmRfbG93KERDQUNvbnRleHQgKmMsIGludCBiYW5kLCBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa19iYW5kX3Qgd2FsaywgaW50MzJfdCAqYXJnKQoreworICAgIGludCBmOworCisgICAgaWYgKGJhbmQgPT0gMCkgeworICAgICAgICBmb3IgKGYgPSAwOyBmIDwgNDsgZisrKQorICAgICAgICAgICAgd2FsayhjLCAwLCAwLCBmLCAwLCAtMjA0NywgY2hhbm5lbCwgYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGYgPSAwOyBmIDwgODsgZisrKQorICAgICAgICAgICAgd2FsayhjLCBiYW5kLCBiYW5kIC0gMSwgOCAqIGJhbmQgLSA0ICsgZiwKKyAgICAgICAgICAgICAgICAgICAgYy0+YmFuZF9zcGVjdHJ1bVs3IC0gZl0sIGMtPmJhbmRfc3BlY3RydW1bZl0sIGNoYW5uZWwsIGFyZyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB3YWxrX2JhbmRfaGlnaChEQ0FDb250ZXh0ICpjLCBpbnQgYmFuZCwgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrX2JhbmRfdCB3YWxrLCBpbnQzMl90ICphcmcpCit7CisgICAgaW50IGY7CisKKyAgICBpZiAoYmFuZCA9PSAzMSkgeworICAgICAgICBmb3IgKGYgPSAwOyBmIDwgNDsgZisrKQorICAgICAgICAgICAgd2FsayhjLCAzMSwgMzEsIDI1NiAtIDQgKyBmLCAwLCAtMjA0NywgY2hhbm5lbCwgYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGYgPSAwOyBmIDwgODsgZisrKQorICAgICAgICAgICAgd2FsayhjLCBiYW5kLCBiYW5kICsgMSwgOCAqIGJhbmQgKyA0ICsgZiwKKyAgICAgICAgICAgICAgICAgICAgYy0+YmFuZF9zcGVjdHJ1bVtmXSwgYy0+YmFuZF9zcGVjdHJ1bVs3IC0gZl0sIGNoYW5uZWwsIGFyZyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfYmFuZF9tYXNraW5nKERDQUNvbnRleHQgKmMsIGludCBiYW5kMSwgaW50IGJhbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZiwgaW50MzJfdCBzcGVjdHJ1bTEsIGludDMyX3Qgc3BlY3RydW0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbCwgaW50MzJfdCAqIGFyZykKK3sKKyAgICBpbnQzMl90IHZhbHVlID0gYy0+ZWZmX21hc2tpbmdfY3VydmVfY2JbZl0gLSBzcGVjdHJ1bTE7CisKKyAgICBpZiAodmFsdWUgPCBjLT5iYW5kX21hc2tpbmdfY2JbYmFuZDFdKQorICAgICAgICBjLT5iYW5kX21hc2tpbmdfY2JbYmFuZDFdID0gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfbWFza2luZyhEQ0FDb250ZXh0ICpjLCBjb25zdCBpbnQzMl90ICppbnB1dCkKK3sKKyAgICBpbnQgaSwgaywgYmFuZCwgY2gsIHNzZjsKKyAgICBpbnQzMl90IGRhdGFbNTEyXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgZm9yIChzc2YgPSAwOyBzc2YgPCBTVUJTVUJGUkFNRVM7IHNzZisrKQorICAgICAgICAgICAgYy0+bWFza2luZ19jdXJ2ZV9jYltzc2ZdW2ldID0gLTIwNDc7CisKKyAgICBmb3IgKHNzZiA9IDA7IHNzZiA8IFNVQlNVQkZSQU1FUzsgc3NmKyspCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBrID0gMTI4ICsgMjU2ICogc3NmOyBrIDwgNTEyOyBpKyssIGsrKykKKyAgICAgICAgICAgICAgICBkYXRhW2ldID0gYy0+aGlzdG9yeVtrXVtjaF07CisgICAgICAgICAgICBmb3IgKGsgLT0gNTEyOyBpIDwgNTEyOyBpKyssIGsrKykKKyAgICAgICAgICAgICAgICBkYXRhW2ldID0gaW5wdXRbayAqIGMtPmNoYW5uZWxzICsgY2hdOworICAgICAgICAgICAgYWRqdXN0X2puZChjLT5zYW1wbGVyYXRlX2luZGV4LCBkYXRhLCBjLT5tYXNraW5nX2N1cnZlX2NiW3NzZl0pOworICAgICAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGludDMyX3QgbSA9IDIwNDg7CisKKyAgICAgICAgZm9yIChzc2YgPSAwOyBzc2YgPCBTVUJTVUJGUkFNRVM7IHNzZisrKQorICAgICAgICAgICAgaWYgKGMtPm1hc2tpbmdfY3VydmVfY2Jbc3NmXVtpXSA8IG0pCisgICAgICAgICAgICAgICAgbSA9IGMtPm1hc2tpbmdfY3VydmVfY2Jbc3NmXVtpXTsKKyAgICAgICAgYy0+ZWZmX21hc2tpbmdfY3VydmVfY2JbaV0gPSBtOworICAgIH0KKworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAzMjsgYmFuZCsrKSB7CisgICAgICAgIGMtPmJhbmRfbWFza2luZ19jYltiYW5kXSA9IDIwNDg7CisgICAgICAgIHdhbGtfYmFuZF9sb3coYywgYmFuZCwgMCwgdXBkYXRlX2JhbmRfbWFza2luZywgTlVMTCk7CisgICAgICAgIHdhbGtfYmFuZF9oaWdoKGMsIGJhbmQsIDAsIHVwZGF0ZV9iYW5kX21hc2tpbmcsIE5VTEwpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmluZF9wZWFrcyhEQ0FDb250ZXh0ICpjKQoreworICAgIGludCBiYW5kLCBjaDsKKworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAzMjsgYmFuZCsrKQorICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5mdWxsYmFuZF9jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgaW50IHNhbXBsZTsKKyAgICAgICAgICAgIGludDMyX3QgbSA9IDA7CisKKyAgICAgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgU1VCQkFORF9TQU1QTEVTOyBzYW1wbGUrKykgeworICAgICAgICAgICAgICAgIGludDMyX3QgcyA9IGFicyhjLT5zdWJiYW5kW3NhbXBsZV1bYmFuZF1bY2hdKTsKKyAgICAgICAgICAgICAgICBpZiAobSA8IHMpCisgICAgICAgICAgICAgICAgICAgIG0gPSBzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+cGVha19jYltiYW5kXVtjaF0gPSBnZXRfY2IobSk7CisgICAgICAgIH0KKworICAgIGlmIChjLT5sZmVfY2hhbm5lbCkgeworICAgICAgICBpbnQgc2FtcGxlOworICAgICAgICBpbnQzMl90IG0gPSAwOworCisgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgRENBX0xGRV9TQU1QTEVTOyBzYW1wbGUrKykKKyAgICAgICAgICAgIGlmIChtIDwgYWJzKGMtPmRvd25zYW1wbGVkX2xmZVtzYW1wbGVdKSkKKyAgICAgICAgICAgICAgICBtID0gYWJzKGMtPmRvd25zYW1wbGVkX2xmZVtzYW1wbGVdKTsKKyAgICAgICAgYy0+bGZlX3BlYWtfY2IgPSBnZXRfY2IobSk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgaW50IHNucl9mdWRnZSA9IDEyODsKKyNkZWZpbmUgVVNFRF8xQUJJVFMgMQorI2RlZmluZSBVU0VEX05BQklUUyAyCisjZGVmaW5lIFVTRURfMjZBQklUUyA0CisKK3N0YXRpYyBpbnQgaW5pdF9xdWFudGl6YXRpb25fbm9pc2UoRENBQ29udGV4dCAqYywgaW50IG5vaXNlKQoreworICAgIGludCBjaCwgYmFuZCwgcmV0ID0gMDsKKworICAgIGMtPmNvbnN1bWVkX2JpdHMgPSAxMzIgKyA0OTMgKiBjLT5mdWxsYmFuZF9jaGFubmVsczsKKyAgICBpZiAoYy0+bGZlX2NoYW5uZWwpCisgICAgICAgIGMtPmNvbnN1bWVkX2JpdHMgKz0gNzI7CisKKyAgICAvKiBhdHRlbXB0IHRvIGd1ZXNzIHRoZSBiaXQgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHRoZSBwcmV2b2l1cyBmcmFtZSAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAzMjsgYmFuZCsrKSB7CisgICAgICAgICAgICBpbnQgc25yX2NiID0gYy0+cGVha19jYltiYW5kXVtjaF0gLSBjLT5iYW5kX21hc2tpbmdfY2JbYmFuZF0gLSBub2lzZTsKKworICAgICAgICAgICAgaWYgKHNucl9jYiA+PSAxMzEyKSB7CisgICAgICAgICAgICAgICAgYy0+YWJpdHNbYmFuZF1bY2hdID0gMjY7CisgICAgICAgICAgICAgICAgcmV0IHw9IFVTRURfMjZBQklUUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc25yX2NiID49IDIyMikgeworICAgICAgICAgICAgICAgIGMtPmFiaXRzW2JhbmRdW2NoXSA9IDggKyBtdWwzMihzbnJfY2IgLSAyMjIsIDY5MDAwMDAwKTsKKyAgICAgICAgICAgICAgICByZXQgfD0gVVNFRF9OQUJJVFM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNucl9jYiA+PSAwKSB7CisgICAgICAgICAgICAgICAgYy0+YWJpdHNbYmFuZF1bY2hdID0gMiArIG11bDMyKHNucl9jYiwgMTA2MDAwMDAwKTsKKyAgICAgICAgICAgICAgICByZXQgfD0gVVNFRF9OQUJJVFM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMtPmFiaXRzW2JhbmRdW2NoXSA9IDE7CisgICAgICAgICAgICAgICAgcmV0IHw9IFVTRURfMUFCSVRTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IDMyOyBiYW5kKyspCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBjLT5jb25zdW1lZF9iaXRzICs9IGJpdF9jb25zdW1wdGlvbltjLT5hYml0c1tiYW5kXVtjaF1dOworICAgICAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhc3NpZ25fYml0cyhEQ0FDb250ZXh0ICpjKQoreworICAgIC8qIEZpbmQgdGhlIGJvdW5kcyB3aGVyZSB0aGUgYmluYXJ5IHNlYXJjaCBzaG91bGQgd29yayAqLworICAgIGludCBsb3csIGhpZ2gsIGRvd247CisgICAgaW50IHVzZWRfYWJpdHMgPSAwOworCisgICAgaW5pdF9xdWFudGl6YXRpb25fbm9pc2UoYywgYy0+d29yc3RfcXVhbnRpemF0aW9uX25vaXNlKTsKKyAgICBsb3cgPSBoaWdoID0gYy0+d29yc3RfcXVhbnRpemF0aW9uX25vaXNlOworICAgIGlmIChjLT5jb25zdW1lZF9iaXRzID4gYy0+ZnJhbWVfYml0cykgeworICAgICAgICB3aGlsZSAoYy0+Y29uc3VtZWRfYml0cyA+IGMtPmZyYW1lX2JpdHMpIHsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAodXNlZF9hYml0cyAhPSBVU0VEXzFBQklUUyk7CisgICAgICAgICAgICBsb3cgPSBoaWdoOworICAgICAgICAgICAgaGlnaCArPSBzbnJfZnVkZ2U7CisgICAgICAgICAgICB1c2VkX2FiaXRzID0gaW5pdF9xdWFudGl6YXRpb25fbm9pc2UoYywgaGlnaCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoYy0+Y29uc3VtZWRfYml0cyA8PSBjLT5mcmFtZV9iaXRzKSB7CisgICAgICAgICAgICBoaWdoID0gbG93OworICAgICAgICAgICAgaWYgKHVzZWRfYWJpdHMgPT0gVVNFRF8yNkFCSVRTKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OyAvKiBUaGUgcmVxdWVzdGVkIGJpdHJhdGUgaXMgdG9vIGhpZ2gsIHBhZCB3aXRoIHplcm9zICovCisgICAgICAgICAgICBsb3cgLT0gc25yX2Z1ZGdlOworICAgICAgICAgICAgdXNlZF9hYml0cyA9IGluaXRfcXVhbnRpemF0aW9uX25vaXNlKGMsIGxvdyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBOb3cgZG8gYSBiaW5hcnkgc2VhcmNoIGJldHdlZW4gbG93IGFuZCBoaWdoIHRvIHNlZSB3aGF0IGZpdHMgKi8KKyAgICBmb3IgKGRvd24gPSBzbnJfZnVkZ2UgPj4gMTsgZG93bjsgZG93biA+Pj0gMSkgeworICAgICAgICBpbml0X3F1YW50aXphdGlvbl9ub2lzZShjLCBoaWdoIC0gZG93bik7CisgICAgICAgIGlmIChjLT5jb25zdW1lZF9iaXRzIDw9IGMtPmZyYW1lX2JpdHMpCisgICAgICAgICAgICBoaWdoIC09IGRvd247CisgICAgfQorICAgIGluaXRfcXVhbnRpemF0aW9uX25vaXNlKGMsIGhpZ2gpOworb3V0OgorICAgIGMtPndvcnN0X3F1YW50aXphdGlvbl9ub2lzZSA9IGhpZ2g7CisgICAgaWYgKGhpZ2ggPiBjLT53b3JzdF9ub2lzZV9ldmVyKQorICAgICAgICBjLT53b3JzdF9ub2lzZV9ldmVyID0gaGlnaDsKK30KKworc3RhdGljIHZvaWQgc2hpZnRfaGlzdG9yeShEQ0FDb250ZXh0ICpjLCBjb25zdCBpbnQzMl90ICppbnB1dCkKK3sKKyAgICBpbnQgaywgY2g7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgNTEyOyBrKyspCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgYy0+aGlzdG9yeVtrXVtjaF0gPSBpbnB1dFtrICogYy0+Y2hhbm5lbHMgKyBjaF07Cit9CisKK3N0YXRpYyBpbnQzMl90IHF1YW50aXplX3ZhbHVlKGludDMyX3QgdmFsdWUsIHNvZnRmbG9hdCBxdWFudCkKK3sKKyAgICBpbnQzMl90IG9mZnNldCA9IDEgPDwgKHF1YW50LmUgLSAxKTsKKworICAgIHZhbHVlID0gbXVsMzIodmFsdWUsIHF1YW50Lm0pICsgb2Zmc2V0OworICAgIHZhbHVlID0gdmFsdWUgPj4gcXVhbnQuZTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19vbmVfc2NhbGUoaW50MzJfdCBwZWFrX2NiLCBpbnQgYWJpdHMsIHNvZnRmbG9hdCAqcXVhbnQpCit7CisgICAgaW50MzJfdCBwZWFrOworICAgIGludCBvdXJfbnNjYWxlLCB0cnlfcmVtb3ZlOworICAgIHNvZnRmbG9hdCBvdXJfcXVhbnQ7CisKKyAgICBhdl9hc3NlcnQwKHBlYWtfY2IgPD0gMCk7CisgICAgYXZfYXNzZXJ0MChwZWFrX2NiID49IC0yMDQ3KTsKKworICAgIG91cl9uc2NhbGUgPSAxMjc7CisgICAgcGVhayA9IGNiX3RvX2xldmVsWy1wZWFrX2NiXTsKKworICAgIGZvciAodHJ5X3JlbW92ZSA9IDY0OyB0cnlfcmVtb3ZlID4gMDsgdHJ5X3JlbW92ZSA+Pj0gMSkgeworICAgICAgICBpZiAoc2NhbGVmYWN0b3JfaW52W291cl9uc2NhbGUgLSB0cnlfcmVtb3ZlXS5lICsgc3RlcHNpemVfaW52W2FiaXRzXS5lIDw9IDE3KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIG91cl9xdWFudC5tID0gbXVsMzIoc2NhbGVmYWN0b3JfaW52W291cl9uc2NhbGUgLSB0cnlfcmVtb3ZlXS5tLCBzdGVwc2l6ZV9pbnZbYWJpdHNdLm0pOworICAgICAgICBvdXJfcXVhbnQuZSA9IHNjYWxlZmFjdG9yX2ludltvdXJfbnNjYWxlIC0gdHJ5X3JlbW92ZV0uZSArIHN0ZXBzaXplX2ludlthYml0c10uZSAtIDE3OworICAgICAgICBpZiAoKHF1YW50X2xldmVsc1thYml0c10gLSAxKSAvIDIgPCBxdWFudGl6ZV92YWx1ZShwZWFrLCBvdXJfcXVhbnQpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIG91cl9uc2NhbGUgLT0gdHJ5X3JlbW92ZTsKKyAgICB9CisKKyAgICBpZiAob3VyX25zY2FsZSA+PSAxMjUpCisgICAgICAgIG91cl9uc2NhbGUgPSAxMjQ7CisKKyAgICBxdWFudC0+bSA9IG11bDMyKHNjYWxlZmFjdG9yX2ludltvdXJfbnNjYWxlXS5tLCBzdGVwc2l6ZV9pbnZbYWJpdHNdLm0pOworICAgIHF1YW50LT5lID0gc2NhbGVmYWN0b3JfaW52W291cl9uc2NhbGVdLmUgKyBzdGVwc2l6ZV9pbnZbYWJpdHNdLmUgLSAxNzsKKyAgICBhdl9hc3NlcnQwKChxdWFudF9sZXZlbHNbYWJpdHNdIC0gMSkgLyAyID49IHF1YW50aXplX3ZhbHVlKHBlYWssICpxdWFudCkpOworCisgICAgcmV0dXJuIG91cl9uc2NhbGU7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfc2NhbGVzKERDQUNvbnRleHQgKmMpCit7CisgICAgaW50IGJhbmQsIGNoOworCisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IDMyOyBiYW5kKyspCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgYy0+c2NhbGVfZmFjdG9yW2JhbmRdW2NoXSA9IGNhbGNfb25lX3NjYWxlKGMtPnBlYWtfY2JbYmFuZF1bY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFiaXRzW2JhbmRdW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYy0+cXVhbnRbYmFuZF1bY2hdKTsKKworICAgIGlmIChjLT5sZmVfY2hhbm5lbCkKKyAgICAgICAgYy0+bGZlX3NjYWxlX2ZhY3RvciA9IGNhbGNfb25lX3NjYWxlKGMtPmxmZV9wZWFrX2NiLCAxMSwgJmMtPmxmZV9xdWFudCk7Cit9CisKK3N0YXRpYyB2b2lkIHF1YW50aXplX2FsbChEQ0FDb250ZXh0ICpjKQoreworICAgIGludCBzYW1wbGUsIGJhbmQsIGNoOworCisgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBTVUJCQU5EX1NBTVBMRVM7IHNhbXBsZSsrKQorICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgMzI7IGJhbmQrKykKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgIGMtPnF1YW50aXplZFtzYW1wbGVdW2JhbmRdW2NoXSA9IHF1YW50aXplX3ZhbHVlKGMtPnN1YmJhbmRbc2FtcGxlXVtiYW5kXVtjaF0sIGMtPnF1YW50W2JhbmRdW2NoXSk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9mcmFtZV9oZWFkZXIoRENBQ29udGV4dCAqYykKK3sKKyAgICAvKiBTWU5DICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCAxNiwgMHg3ZmZlKTsKKyAgICBwdXRfYml0cygmYy0+cGIsIDE2LCAweDgwMDEpOworCisgICAgLyogRnJhbWUgdHlwZTogbm9ybWFsICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCAxLCAxKTsKKworICAgIC8qIERlZmljaXQgc2FtcGxlIGNvdW50OiBub25lICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCA1LCAzMSk7CisKKyAgICAvKiBDUkMgaXMgbm90IHByZXNlbnQgKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDEsIDApOworCisgICAgLyogTnVtYmVyIG9mIFBDTSBzYW1wbGUgYmxvY2tzICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCA3LCBTVUJCQU5EX1NBTVBMRVMgLSAxKTsKKworICAgIC8qIFByaW1hcnkgZnJhbWUgYnl0ZSBzaXplICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCAxNCwgYy0+ZnJhbWVfc2l6ZSAtIDEpOworCisgICAgLyogQXVkaW8gY2hhbm5lbCBhcnJhbmdlbWVudCAqLworICAgIHB1dF9iaXRzKCZjLT5wYiwgNiwgYy0+Y2hhbm5lbF9jb25maWcpOworCisgICAgLyogQ29yZSBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDQsIGJpdHN0cmVhbV9zZnJlcVtjLT5zYW1wbGVyYXRlX2luZGV4XSk7CisKKyAgICAvKiBUcmFuc21pc3Npb24gYml0IHJhdGUgKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDUsIGMtPmJpdHJhdGVfaW5kZXgpOworCisgICAgLyogRW1iZWRkZWQgZG93biBtaXg6IGRpc2FibGVkICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCAxLCAwKTsKKworICAgIC8qIEVtYmVkZGVkIGR5bmFtaWMgcmFuZ2UgZmxhZzogbm90IHByZXNlbnQgKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDEsIDApOworCisgICAgLyogRW1iZWRkZWQgdGltZSBzdGFtcCBmbGFnOiBub3QgcHJlc2VudCAqLworICAgIHB1dF9iaXRzKCZjLT5wYiwgMSwgMCk7CisKKyAgICAvKiBBdXhpbGlhcnkgZGF0YSBmbGFnOiBub3QgcHJlc2VudCAqLworICAgIHB1dF9iaXRzKCZjLT5wYiwgMSwgMCk7CisKKyAgICAvKiBIRENEIHNvdXJjZTogbm8gKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDEsIDApOworCisgICAgLyogRXh0ZW5zaW9uIGF1ZGlvIElEOiBOL0EgKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDMsIDApOworCisgICAgLyogRXh0ZW5kZWQgYXVkaW8gZGF0YTogbm90IHByZXNlbnQgKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDEsIDApOworCisgICAgLyogQXVkaW8gc3luYyB3b3JkIGluc2VydGlvbiBmbGFnOiBhZnRlciBlYWNoIHN1Yi1mcmFtZSAqLworICAgIHB1dF9iaXRzKCZjLT5wYiwgMSwgMCk7CisKKyAgICAvKiBMb3cgZnJlcXVlbmN5IGVmZmVjdHMgZmxhZzogbm90IHByZXNlbnQgb3IgNjR4IHN1YnNhbXBsaW5nICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCAyLCBjLT5sZmVfY2hhbm5lbCA/IDIgOiAwKTsKKworICAgIC8qIFByZWRpY3RvciBoaXN0b3J5IHN3aXRjaCBmbGFnOiBvbiAqLworICAgIHB1dF9iaXRzKCZjLT5wYiwgMSwgMSk7CisKKyAgICAvKiBObyBDUkMgKi8KKyAgICAvKiBNdWx0aXJhdGUgaW50ZXJwb2xhdG9yIHN3aXRjaDogbm9uLXBlcmZlY3QgcmVjb25zdHJ1Y3Rpb24gKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDEsIDApOworCisgICAgLyogRW5jb2RlciBzb2Z0d2FyZSByZXZpc2lvbjogNyAqLworICAgIHB1dF9iaXRzKCZjLT5wYiwgNCwgNyk7CisKKyAgICAvKiBDb3B5IGhpc3Rvcnk6IDAgKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDIsIDApOworCisgICAgLyogU291cmNlIFBDTSByZXNvbHV0aW9uOiAxNiBiaXRzLCBub3QgRFRTIEVTICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCAzLCAwKTsKKworICAgIC8qIEZyb250IHN1bS9kaWZmZXJlbmNlIGNvZGluZzogbm8gKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDEsIDApOworCisgICAgLyogU3Vycm91bmRzIHN1bS9kaWZmZXJlbmNlIGNvZGluZzogbm8gKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDEsIDApOworCisgICAgLyogRGlhbG9nIG5vcm1hbGl6YXRpb246IDAgZEIgKi8KKyAgICBwdXRfYml0cygmYy0+cGIsIDQsIDApOworfQorCitzdGF0aWMgdm9pZCBwdXRfcHJpbWFyeV9hdWRpb19oZWFkZXIoRENBQ29udGV4dCAqYykKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IGJpdGxlblsxMV0gPSB7IDAsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHRoclsxMV0gICAgPSB7IDAsIDEsIDMsIDMsIDMsIDMsIDcsIDcsIDcsIDcsIDcgfTsKKworICAgIGludCBjaCwgaTsKKyAgICAvKiBOdW1iZXIgb2Ygc3ViZnJhbWVzICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCA0LCBTVUJGUkFNRVMgLSAxKTsKKworICAgIC8qIE51bWJlciBvZiBwcmltYXJ5IGF1ZGlvIGNoYW5uZWxzICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCAzLCBjLT5mdWxsYmFuZF9jaGFubmVscyAtIDEpOworCisgICAgLyogU3ViYmFuZCBhY3Rpdml0eSBjb3VudCAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICBwdXRfYml0cygmYy0+cGIsIDUsIERDQV9TVUJCQU5EUyAtIDIpOworCisgICAgLyogSGlnaCBmcmVxdWVuY3kgVlEgc3RhcnQgc3ViYmFuZCAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICBwdXRfYml0cygmYy0+cGIsIDUsIERDQV9TVUJCQU5EUyAtIDEpOworCisgICAgLyogSm9pbnQgaW50ZW5zaXR5IGNvZGluZyBpbmRleDogMCwgMCAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICBwdXRfYml0cygmYy0+cGIsIDMsIDApOworCisgICAgLyogVHJhbnNpZW50IG1vZGUgY29kZWJvb2s6IEE0LCBBNCAoYXJiaXRyYXJ5KSAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICBwdXRfYml0cygmYy0+cGIsIDIsIDApOworCisgICAgLyogU2NhbGUgZmFjdG9yIGNvZGUgYm9vazogNyBiaXQgbGluZWFyLCA3LWJpdCBzcXJ0IHRhYmxlIChmb3IgZWFjaCBjaGFubmVsKSAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICBwdXRfYml0cygmYy0+cGIsIDMsIDYpOworCisgICAgLyogQml0IGFsbG9jYXRpb24gcXVhbnRpemVyIHNlbGVjdDogbGluZWFyIDUtYml0ICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+ZnVsbGJhbmRfY2hhbm5lbHM7IGNoKyspCisgICAgICAgIHB1dF9iaXRzKCZjLT5wYiwgMywgNik7CisKKyAgICAvKiBRdWFudGl6YXRpb24gaW5kZXggY29kZWJvb2sgc2VsZWN0OiBkdW1teSBkYXRhCisgICAgICAgdG8gYXZvaWQgdHJhbnNtaXNzaW9uIG9mIHNjYWxlIGZhY3RvciBhZGp1c3RtZW50ICovCisgICAgZm9yIChpID0gMTsgaSA8IDExOyBpKyspCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgcHV0X2JpdHMoJmMtPnBiLCBiaXRsZW5baV0sIHRocltpXSk7CisKKyAgICAvKiBTY2FsZSBmYWN0b3IgYWRqdXN0bWVudCBpbmRleDogbm90IHRyYW5zbWl0dGVkICovCisgICAgLyogQXVkaW8gaGVhZGVyIENSQyBjaGVjayB3b3JkOiBub3QgdHJhbnNtaXR0ZWQgKi8KK30KKworc3RhdGljIHZvaWQgcHV0X3N1YmZyYW1lX3NhbXBsZXMoRENBQ29udGV4dCAqYywgaW50IHNzLCBpbnQgYmFuZCwgaW50IGNoKQoreworICAgIGlmIChjLT5hYml0c1tiYW5kXVtjaF0gPD0gNykgeworICAgICAgICBpbnQgc3VtLCBpLCBqOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSA0KSB7CisgICAgICAgICAgICBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChqID0gMzsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICBzdW0gKj0gcXVhbnRfbGV2ZWxzW2MtPmFiaXRzW2JhbmRdW2NoXV07CisgICAgICAgICAgICAgICAgc3VtICs9IGMtPnF1YW50aXplZFtzcyAqIDggKyBpICsgal1bYmFuZF1bY2hdOworICAgICAgICAgICAgICAgIHN1bSArPSAocXVhbnRfbGV2ZWxzW2MtPmFiaXRzW2JhbmRdW2NoXV0gLSAxKSAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIGJpdF9jb25zdW1wdGlvbltjLT5hYml0c1tiYW5kXVtjaF1dIC8gNCwgc3VtKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYml0cyA9IGJpdF9jb25zdW1wdGlvbltjLT5hYml0c1tiYW5kXVtjaF1dIC8gMTY7CisgICAgICAgICAgICBpbnQzMl90IG1hc2sgPSAoMSA8PCBiaXRzKSAtIDE7CisgICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIGJpdHMsIGMtPnF1YW50aXplZFtzcyAqIDggKyBpXVtiYW5kXVtjaF0gJiBtYXNrKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcHV0X3N1YmZyYW1lKERDQUNvbnRleHQgKmMsIGludCBzdWJmcmFtZSkKK3sKKyAgICBpbnQgaSwgYmFuZCwgc3MsIGNoOworCisgICAgLyogU3Vic3ViZnJhbWVzIGNvdW50ICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCAyLCBTVUJTVUJGUkFNRVMgLTEpOworCisgICAgLyogUGFydGlhbCBzdWJzdWJmcmFtZSBzYW1wbGUgY291bnQ6IGR1bW15ICovCisgICAgcHV0X2JpdHMoJmMtPnBiLCAzLCAwKTsKKworICAgIC8qIFByZWRpY3Rpb24gbW9kZTogbm8gQURQQ00sIGluIGVhY2ggY2hhbm5lbCBhbmQgc3ViYmFuZCAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgRENBX1NVQkJBTkRTOyBiYW5kKyspCisgICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIDEsIDApOworCisgICAgLyogUHJlZGljdGlvbiBWUSBhZGRyZXNzOiBub3QgdHJhbnNtaXR0ZWQgKi8KKyAgICAvKiBCaXQgYWxsb2NhdGlvbiBpbmRleCAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgRENBX1NVQkJBTkRTOyBiYW5kKyspCisgICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIDUsIGMtPmFiaXRzW2JhbmRdW2NoXSk7CisKKyAgICBpZiAoU1VCU1VCRlJBTUVTID4gMSkgeworICAgICAgICAvKiBUcmFuc2l0aW9uIG1vZGU6IG5vbmUgZm9yIGVhY2ggY2hhbm5lbCBhbmQgc3ViYmFuZCAqLworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5mdWxsYmFuZF9jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBEQ0FfU1VCQkFORFM7IGJhbmQrKykKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIDEsIDApOyAvKiBjb2RlYm9vayBBNCAqLworICAgIH0KKworICAgIC8qIFNjYWxlIGZhY3RvcnMgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5mdWxsYmFuZF9jaGFubmVsczsgY2grKykKKyAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IERDQV9TVUJCQU5EUzsgYmFuZCsrKQorICAgICAgICAgICAgcHV0X2JpdHMoJmMtPnBiLCA3LCBjLT5zY2FsZV9mYWN0b3JbYmFuZF1bY2hdKTsKKworICAgIC8qIEpvaW50IHN1YmJhbmQgc2NhbGUgZmFjdG9yIGNvZGVib29rIHNlbGVjdDogbm90IHRyYW5zbWl0dGVkICovCisgICAgLyogU2NhbGUgZmFjdG9ycyBmb3Igam9pbnQgc3ViYmFuZCBjb2Rpbmc6IG5vdCB0cmFuc21pdHRlZCAqLworICAgIC8qIFN0ZXJlbyBkb3duLW1peCBjb2VmZmljaWVudHM6IG5vdCB0cmFuc21pdHRlZCAqLworICAgIC8qIER5bmFtaWMgcmFuZ2UgY29lZmZpY2llbnQ6IG5vdCB0cmFuc21pdHRlZCAqLworICAgIC8qIFN0ZGUgaW5mb3JtYXRpb24gQ1JDIGNoZWNrIHdvcmQ6IG5vdCB0cmFuc21pdHRlZCAqLworICAgIC8qIFZRIGVuY29kZWQgaGlnaCBmcmVxdWVuY3kgc3ViYmFuZHM6IG5vdCB0cmFuc21pdHRlZCAqLworCisgICAgLyogTEZFIGRhdGE6IDggc2FtcGxlcyBhbmQgc2NhbGVmYWN0b3IgKi8KKyAgICBpZiAoYy0+bGZlX2NoYW5uZWwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IERDQV9MRkVfU0FNUExFUzsgaSsrKQorICAgICAgICAgICAgcHV0X2JpdHMoJmMtPnBiLCA4LCBxdWFudGl6ZV92YWx1ZShjLT5kb3duc2FtcGxlZF9sZmVbaV0sIGMtPmxmZV9xdWFudCkgJiAweGZmKTsKKyAgICAgICAgcHV0X2JpdHMoJmMtPnBiLCA4LCBjLT5sZmVfc2NhbGVfZmFjdG9yKTsKKyAgICB9CisKKyAgICAvKiBBdWRpbyBkYXRhIChzdWJzdWJmcmFtZXMpICovCisgICAgZm9yIChzcyA9IDA7IHNzIDwgU1VCU1VCRlJBTUVTIDsgc3MrKykKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+ZnVsbGJhbmRfY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgRENBX1NVQkJBTkRTOyBiYW5kKyspCisgICAgICAgICAgICAgICAgICAgIHB1dF9zdWJmcmFtZV9zYW1wbGVzKGMsIHNzLCBiYW5kLCBjaCk7CisKKyAgICAvKiBEU1lOQyAqLworICAgIHB1dF9iaXRzKCZjLT5wYiwgMTYsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCit7CisgICAgRENBQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgaW50MzJfdCAqc2FtcGxlczsKKyAgICBpbnQgcmV0LCBpOworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgYy0+ZnJhbWVfc2l6ZSApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzYW1wbGVzID0gKGNvbnN0IGludDMyX3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIHN1YmJhbmRfdHJhbnNmb3JtKGMsIHNhbXBsZXMpOworICAgIGlmIChjLT5sZmVfY2hhbm5lbCkKKyAgICAgICAgbGZlX2Rvd25zYW1wbGUoYywgc2FtcGxlcyk7CisKKyAgICBjYWxjX21hc2tpbmcoYywgc2FtcGxlcyk7CisgICAgZmluZF9wZWFrcyhjKTsKKyAgICBhc3NpZ25fYml0cyhjKTsKKyAgICBjYWxjX3NjYWxlcyhjKTsKKyAgICBxdWFudGl6ZV9hbGwoYyk7CisgICAgc2hpZnRfaGlzdG9yeShjLCBzYW1wbGVzKTsKKworICAgIGluaXRfcHV0X2JpdHMoJmMtPnBiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIHB1dF9mcmFtZV9oZWFkZXIoYyk7CisgICAgcHV0X3ByaW1hcnlfYXVkaW9faGVhZGVyKGMpOworICAgIGZvciAoaSA9IDA7IGkgPCBTVUJGUkFNRVM7IGkrKykKKyAgICAgICAgcHV0X3N1YmZyYW1lKGMsIGkpOworCisgICAgZmx1c2hfcHV0X2JpdHMoJmMtPnBiKTsKKworICAgIGF2cGt0LT5wdHMgICAgICA9IGZyYW1lLT5wdHM7CisgICAgYXZwa3QtPmR1cmF0aW9uID0gZmZfc2FtcGxlc190b190aW1lX2Jhc2UoYXZjdHgsIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICBhdnBrdC0+c2l6ZSAgICAgPSBjLT5mcmFtZV9zaXplICsgMTsKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgZGVmYXVsdHNbXSA9IHsKKyAgICB7ICJiIiwgICAgICAgICAgIjE0MTEyMDAiIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkNvZGVjIGZmX2RjYV9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAiZGNhIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRDQSAoRFRTIENvaGVyZW50IEFjb3VzdGljcykiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9EVFMsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihEQ0FDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgICAgICA9IGVuY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCwKKyAgICAuc2FtcGxlX2ZtdHMgICAgICAgICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLnN1cHBvcnRlZF9zYW1wbGVyYXRlcyA9IHNhbXBsZV9yYXRlcywKKyAgICAuY2hhbm5lbF9sYXlvdXRzICAgICAgID0gKGNvbnN0IHVpbnQ2NF90W10pIHsgQVZfQ0hfTEFZT1VUX01PTk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF8yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB9LAorICAgIC5kZWZhdWx0cyAgICAgICAgICAgICAgPSBkZWZhdWx0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kY2FlbmMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2RjYWVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDNjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kY2FlbmMuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIERDQSBlbmNvZGVyIHRhYmxlcworICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIgQWxleGFuZGVyIEUuIFBhdHJha292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19EQ0FFTkNfSAorI2RlZmluZSBBVkNPREVDX0RDQUVOQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgbTsKKyAgICBpbnQzMl90IGU7Cit9IHNvZnRmbG9hdDsKKworc3RhdGljIGNvbnN0IGludCBzYW1wbGVfcmF0ZXNbXSA9IHsKKyAgICA4MDAwLCAxNjAwMCwgMzIwMDAsIDExMDI1LCAyMjA1MCwgNDQxMDAsIDEyMDAwLCAyNDAwMCwgNDgwMDAsIDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRzdHJlYW1fc2ZyZXFbXSA9IHsgMSwgMiwgMywgNiwgNywgOCwgMTEsIDEyLCAxMyB9OworCisvKiBBdWRpdG9yeSBmaWx0ZXIgY2VudGVyIGZyZXF1ZW5jaWVzIGFuZCBiYW5kd2lkdGhzLCBpbiBIei4KKyAqIFRoZSBsYXN0IHR3byBhcmUgbWFkZSB1cCwgYmVjYXVzZSB0aGVyZSBpcyBubyBzY2llbnRpZmljIGRhdGEuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBmY1tdID0geworICAgIDUwLCAxNTAsIDI1MCwgMzUwLCA0NTAsIDU3MCwgNzAwLCA4NDAsIDEwMDAsIDExNzAsIDEzNzAsIDE2MDAsIDE4NTAsIDIxNTAsCisgICAgMjUwMCwgMjkwMCwgMzQwMCwgNDAwMCwgNDgwMCwgNTgwMCwgNzAwMCwgODUwMCwgMTA1MDAsIDEzNTAwLCAxNzAwMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGVyYltdID0geworICAgIDgwLCAxMDAsIDEwMCwgMTAwLCAxMTAsIDEyMCwgMTQwLCAxNTAsIDE2MCwgMTkwLCAyMTAsIDI0MCwgMjgwLAorICAgIDMyMCwgMzgwLCA0NTAsIDU1MCwgNzAwLCA5MDAsIDExMDAsIDEzMDAsIDE4MDAsIDI1MDAsIDM1MDAsIDQ1MDAKK307CisKK3N0YXRpYyBjb25zdCBzb2Z0ZmxvYXQgc3RlcHNpemVfaW52WzI3XSA9IHsKKyAgICB7MCwgMH0sIHsxMzQyMTc3MzYwLCAyMX0sIHsyMTQ3NDgzNjQ3LCAyMX0sIHsxMzQyMTc3MzYwLCAyMH0sCisgICAgezE4MTk5MDE2NjEsIDIwfSwgezIxNDc0ODM2NDcsIDIwfSwgezEyNzgyNjM4NDMsIDE5fSwgezE1NzkwMzI0OTIsIDE5fSwKKyAgICB7MTQxMjgxNzc2MywgMTh9LCB7MTIyMDE2MjMyNywgMTd9LCB7MTExODQ4MjEzMywgMTZ9LCB7MTkxNzM5MTQxMiwgMTZ9LAorICAgIHsxNzY2MDE3NzcyLCAxNX0sIHsxNTI1MjEyODI2LCAxNH0sIHsxMjkwNTUzOTQwLCAxM30sIHsyMDk3MTc5MDAwLCAxM30sCisgICAgezE2Nzc2ODMyMDAsIDEyfSwgezE0OTc5NzIyNDQsIDExfSwgezEzMTA4OTMxNDcsIDEwfSwgezExNjUzNTQxMzYsIDl9LAorICAgIHsxNzQ4MDMxMjA0LCA5fSwgezE1NDIwOTIwNDQsIDh9LCB7MTYzNjE3ODAxNywgN30sIHsxNjM2MTc4MDE3LCA2fSwKKyAgICB7MTYzNjE3ODAxNywgNX0sIHsxNjM2MTc4MDE3LCA0fSwgezE2MzYxNzgwMTcsIDN9LAorfTsKKworc3RhdGljIGNvbnN0IHNvZnRmbG9hdCBzY2FsZWZhY3Rvcl9pbnZbMTI4XSA9IHsKKyAgICB7MjE0NzQ4MzY0NywgMX0sIHsyMTQ3NDgzNjQ3LCAxfSwgezIxNDc0ODM2NDcsIDJ9LCB7MjE0NzQ4MzY0NywgMn0sCisgICAgezIxNDc0ODM2NDcsIDJ9LCB7MjE0NzQ4MzY0NywgMn0sIHsxNDMxNjU1NzY1LCAyfSwgezE0MzE2NTU3NjUsIDJ9LAorICAgIHsxNDMxNjU1NzY1LCAyfSwgezIxNDc0ODM2NDcsIDN9LCB7MjE0NzQ4MzY0NywgM30sIHsxNzE3OTg2OTE4LCAzfSwKKyAgICB7MTQzMTY1NTc2NSwgM30sIHsxMjI3MTMzNTEzLCAzfSwgezEyMjcxMzM1MTMsIDN9LCB7MjE0NzQ4MzY0NywgNH0sCisgICAgezE3MTc5ODY5MTgsIDR9LCB7MTU2MTgwNjI4OSwgNH0sIHsxNDMxNjU1NzY1LCA0fSwgezEyMjcxMzM1MTMsIDR9LAorICAgIHsyMTQ3NDgzNjQ3LCA1fSwgezE5MDg4NzQzNTMsIDV9LCB7MTcxNzk4NjkxOCwgNX0sIHsxNDkzOTAxNjY4LCA1fSwKKyAgICB7MTMyMTUyODM5OCwgNX0sIHsxMTQ1MzI0NjEyLCA1fSwgezIwMjExNjEwODAsIDZ9LCB7MTgwODQwNzI4MiwgNn0sCisgICAgezE1NjE4MDYyODksIDZ9LCB7MTM3NDM4OTUzNCwgNn0sIHsxMjI3MTMzNTEzLCA2fSwgezIxNDc0ODM2NDcsIDd9LAorICAgIHsxOTA4ODc0MzUzLCA3fSwgezE2NzYwODQ3OTgsIDd9LCB7MTQ3NzgzODIwOSwgN30sIHsxMjk2NTkzOTAwLCA3fSwKKyAgICB7MTE0NTMyNDYxMiwgN30sIHsyMDIxMTYxMDgwLCA4fSwgezE3NzM0MDU4NTEsIDh9LCB7MTU2MTgwNjI4OSwgOH0sCisgICAgezEzNzQzODk1MzQsIDh9LCB7MTIxNjI3MzkyNCwgOH0sIHsyMTM5MTI3NjgwLCA5fSwgezE4ODI3MjUzOTAsIDl9LAorICAgIHsxNjYwODkzNjk3LCA5fSwgezE0NjIxMTY1MjYsIDl9LCB7MTI4NzQ4NDM0MSwgOX0sIHsxMTM1ODU5MTE5LCA5fSwKKyAgICB7MTk5OTExMjA1MCwgMTB9LCB7MTc2MjAzNzg2NSwgMTB9LCB7MTU1Mjk4MjUyNSwgMTB9LCB7MTM2NzU1MTc3NSwgMTB9LAorICAgIHsxMjA1NjA0ODU1LCAxMH0sIHsyMTI0NjYwMTUwLCAxMX0sIHsxODcxNTA5MTUzLCAxMX0sIHsxNjQ4NDQzMjIwLCAxMX0sCisgICAgezE0NTI0NTkyMTcsIDExfSwgezEyNzk5OTAyNTMsIDExfSwgezExMjc3MDQyMzMsIDExfSwgezE5ODczNjg1MDksIDEyfSwKKyAgICB7MTc1MDgxNDY5MywgMTJ9LCB7MTU0MjYzMjkzOSwgMTJ9LCB7MTM1OTA5OTY2MywgMTJ9LCB7MTE5NzM5ODk5NSwgMTJ9LAorICAgIHsyMTA5ODgwNzkyLCAxM30sIHsxODU4ODUzMTMyLCAxM30sIHsxNjM4MDA2MTQ5LCAxM30sIHsxNDQzMTY1Mzg1LCAxM30sCisgICAgezEyNzE0NzkxODcsIDEzfSwgezExMjAyMzU5OTMsIDEzfSwgezE5NzM3NjcwODYsIDE0fSwgezE3MzkwNDU2NzQsIDE0fSwKKyAgICB7MTUzMjE1MzQ2MSwgMTR9LCB7MTM0OTkyMjE5NCwgMTR9LCB7MTE4OTM4NDQ5MywgMTR9LCB7MjA5NTgwNDg2NSwgMTV9LAorICAgIHsxODQ2NDY0MDI5LCAxNX0sIHsxNjI2ODcyNTI0LCAxNX0sIHsxNDMzMzQ3MTMzLCAxNX0sIHsxMjYyODUzODg0LCAxNX0sCisgICAgezExMTI2MTk2NzgsIDE1fSwgezE5NjA1NjkwNDUsIDE2fSwgezE3MjczNDkwMTUsIDE2fSwgezE1MjE4ODEyMjcsIDE2fSwKKyAgICB7MTM0MDg0MjI4OSwgMTZ9LCB7MTE4MTM1NzU1NSwgMTZ9LCB7MjA4MTY2OTE1NiwgMTd9LCB7MTgzNDA0Nzc1MiwgMTd9LAorICAgIHsxNjE1ODg5MjI5LCAxN30sIHsxNDIzNjc1OTczLCAxN30sIHsxMjU0MzIyNDU3LCAxN30sIHsxMTA1MTIzNTgzLCAxN30sCisgICAgezE5NDczMzA3NTUsIDE4fSwgezE3MTU2OTM2MDIsIDE4fSwgezE1MTE2MDc3OTksIDE4fSwgezEzMzE4MDE3OTAsIDE4fSwKKyAgICB7MTE3MzM4NDQyNywgMTh9LCB7MjA2NzYxNjUzMiwgMTl9LCB7MTgyMTY2NzY0OCwgMTl9LCB7MTYwNDk4MDAyNCwgMTl9LAorICAgIHsxNDE0MDY2OTU1LCAxOX0sIHsxMjQ1ODYxNDEwLCAxOX0sIHsxMDk3NjY1NzQ4LCAxOX0sIHsxOTM0MTkzNjE2LCAyMH0sCisgICAgezE3MDQxMTk2MjQsIDIwfSwgezE1MDE0MTIwNzUsIDIwfSwgezEzMjI4MTcxMDcsIDIwfSwgezExNjU0NjYzMjMsIDIwfSwKKyAgICB7MjA1MzY2NjIwNSwgMjF9LCB7MTgwOTM3OTQwNywgMjF9LCB7MTU5NDE1MTY3MSwgMjF9LCB7MTQwNDUyNjMyOCwgMjF9LAorICAgIHsxMjM3NDU1OTQxLCAyMX0sIHsxMDkwMjU5MzI5LCAyMX0sIHsxOTIxMTQzMjEwLCAyMn0sIHsxNjkyNjIxMjMxLCAyMn0sCisgICAgezE0OTEyODE4NTcsIDIyfSwgezEzMTM4OTIyNjksIDIyfSwgezExNTc2MDM0ODIsIDIyfSwgezIwMzk4MTA0NzAsIDIzfSwKKyAgICB7MTc5NzE3MjY0NCwgMjN9LCB7MTU4MzM5NjkxMiwgMjN9LCB7MTM5NTA1MDA1MiwgMjN9LCB7MTIyOTEwNzI3NiwgMjN9LAorICAgIHsxMDgyOTAzNDk0LCAyM30sIHsxMDgyOTAzNDk0LCAyM30sIHsxMDgyOTAzNDk0LCAyM30sIHsxMDgyOTAzNDk0LCAyM30sCit9OworCisvKiBtYW51YWxseSBkZXJpdmVkIGZyb20KKyAqIFRhYmxlIEIuNTogU2VsZWN0aW9uIG9mIHF1YW50aXphdGlvbiBsZXZlbHMgYW5kIGNvZGVib29rcworICogRklYTUU6IHdpbGwgYmVjb21lIGludmFsaWQgd2hlbiBIdWZmbWFuIGNvZGVzIGFyZSBpbnRyb2R1Y2VkLgorICovCitzdGF0aWMgY29uc3QgaW50IGJpdF9jb25zdW1wdGlvblsyN10gPSB7CisgICAgLTgsIDI4LCA0MCwgNDgsIDUyLCA2MCwgNjgsIDc2LCA4MCwgOTYsCisgICAgMTEyLCAxMjgsIDE0NCwgMTYwLCAxNzYsIDE5MiwgMjA4LCAyMjQsIDI0MCwgMjU2LAorICAgIDI3MiwgMjg4LCAzMDQsIDMyMCwgMzM2LCAzNTIsIDM2OCwKK307CisKKy8qIFRhYmxlIEIuNTogU2VsZWN0aW9uIG9mIHF1YW50aXphdGlvbiBsZXZlbHMgYW5kIGNvZGVib29rcyAqLworc3RhdGljIGNvbnN0IGludCBxdWFudF9sZXZlbHNbMjddID0geworICAgIDEsIDMsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMyLCA2NCwKKyAgICAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCA0MDk2LCA4MTkyLCAxNjM4NCwgMzI3NjgsIDY1NTM2LAorICAgIDEzMTA3MiwgMjYyMTQ0LCA1MjQyODgsIDEwNDg1NzYsIDIwOTcxNTIsIDQxOTQzMDQsIDgzODg2MDgsCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19EQ0FFTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZGNhaHVmZi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGNhaHVmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzODhiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kY2FodWZmLmgKQEAgLTAsMCArMSwxMDQxIEBACisvKgorICogRENBIGNvbXBhdGlibGUgZGVjb2RlciAtIGh1ZmZtYW4gdGFibGVzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgR2lsZGFzIEJhemluCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRENBSFVGRl9ICisjZGVmaW5lIEFWQ09ERUNfRENBSFVGRl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBUTU9ERV9DT1VOVCA0CitzdGF0aWMgY29uc3QgdWludDhfdCB0bW9kZV92bGNfYml0c1tUTU9ERV9DT1VOVF0gPSB7IDMsIDMsIDMsIDIgfTsKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB0bW9kZV9jb2Rlc1tUTU9ERV9DT1VOVF1bNF0gPSB7CisgICAgeyAweDAwMDAsIDB4MDAwMiwgMHgwMDA2LCAweDAwMDcgfSwKKyAgICB7IDB4MDAwMiwgMHgwMDA2LCAweDAwMDcsIDB4MDAwMCB9LAorICAgIHsgMHgwMDA2LCAweDAwMDcsIDB4MDAwMCwgMHgwMDAyIH0sCisgICAgeyAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdG1vZGVfYml0c1tUTU9ERV9DT1VOVF1bNF0gPSB7CisgICAgeyAxLCAyLCAzLCAzIH0sCisgICAgeyAyLCAzLCAzLCAxIH0sCisgICAgeyAzLCAzLCAxLCAyIH0sCisgICAgeyAyLCAyLCAyLCAyIH0KK307CisKKyNkZWZpbmUgQklUQUxMT0NfMTJfQ09VTlQgICAgNQorI2RlZmluZSBCSVRBTExPQ18xMl9WTENfQklUUyA5CitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xMl92bGNfYml0c1tCSVRBTExPQ18xMl9DT1VOVF0gPSB7CisgICAgOSwgNywgNywgOSwgOQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyX2NvZGVzW0JJVEFMTE9DXzEyX0NPVU5UXVsxMl0gPSB7CisgICAgeyAweDAwMDAsIDB4MDAwMiwgMHgwMDA2LCAweDAwMEUsIDB4MDAxRSwgMHgwMDNFLCAweDAwRkYsIDB4MDBGRSwKKyAgICAgIDB4MDFGQiwgMHgwMUZBLCAweDAxRjksIDB4MDFGOCwgfSwKKyAgICB7IDB4MDAwMSwgMHgwMDAwLCAweDAwMDIsIDB4MDAwRiwgMHgwMDBDLCAweDAwMUQsIDB4MDAzOSwgMHgwMDM4LAorICAgICAgMHgwMDM3LCAweDAwMzYsIDB4MDAzNSwgMHgwMDM0LCB9LAorICAgIHsgMHgwMDAwLCAweDAwMDcsIDB4MDAwNSwgMHgwMDA0LCAweDAwMDIsIDB4MDAwRCwgMHgwMDBDLCAweDAwMDYsCisgICAgICAweDAwMEYsIDB4MDAxRCwgMHgwMDM5LCAweDAwMzgsIH0sCisgICAgeyAweDAwMDMsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDIsIDB4MDAwNiwgMHgwMDBFLCAweDAwMUUsIDB4MDAzRSwKKyAgICAgIDB4MDA3RSwgMHgwMEZFLCAweDAxRkYsIDB4MDFGRSwgfSwKKyAgICB7IDB4MDAwMSwgMHgwMDAwLCAweDAwMDIsIDB4MDAwNiwgMHgwMDBFLCAweDAwM0YsIDB4MDAzRCwgMHgwMDdDLAorICAgICAgMHgwMDc5LCAweDAwNzgsIDB4MDBGQiwgMHgwMEZBLCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xMl9iaXRzW0JJVEFMTE9DXzEyX0NPVU5UXVsxMl0gPSB7CisgICAgeyAxLCAyLCAzLCA0LCA1LCA2LCA4LCA4LCA5LCA5LCAgOSwgIDkgfSwKKyAgICB7IDEsIDIsIDMsIDUsIDUsIDYsIDcsIDcsIDcsIDcsICA3LCAgNyB9LAorICAgIHsgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNSwgNiwgIDcsICA3IH0sCisgICAgeyAyLCAyLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTAgfSwKKyAgICB7IDEsIDIsIDMsIDQsIDUsIDcsIDcsIDgsIDgsIDgsICA5LCAgOSB9Cit9OworCisjZGVmaW5lIFNDQUxFU19DT1VOVCAgICA1CisjZGVmaW5lIFNDQUxFU19WTENfQklUUyA5CitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2NhbGVzX2NvZGVzW1NDQUxFU19DT1VOVF1bMTI5XSA9IHsKKyAgICB7IDB4M0FCMCwgMHgzQUIyLCAweDNBQjQsIDB4M0FCNiwgMHgzQUI4LCAweDNBQkEsIDB4M0FCQywgMHgzQUJFLAorICAgICAgMHgzQUMwLCAweDNBQzIsIDB4M0FDNCwgMHgzQUM2LCAweDNBQzgsIDB4M0FDQSwgMHgzQUNDLCAweDNBQ0UsCisgICAgICAweDNBRDAsIDB4M0FEMiwgMHgzQUQ0LCAweDNBRDYsIDB4M0FEOCwgMHgzQURBLCAweDNBREMsIDB4M0FERSwKKyAgICAgIDB4M0FFMCwgMHgzQUUyLCAweDNBRTQsIDB4M0FFNiwgMHgzQUU4LCAweDNBRUEsIDB4M0FFQywgMHgzQUVFLAorICAgICAgMHgzQUYwLCAweDNBRjIsIDB4M0FGNCwgMHgzQUY2LCAweDNBRjgsIDB4M0FGQSwgMHgzQUZDLCAweDNBRkUsCisgICAgICAweDA1NDAsIDB4MDU0MiwgMHgwNTQ0LCAweDA1NDYsIDB4MDU0OCwgMHgwNTRBLCAweDA1NEMsIDB4MDU0RSwKKyAgICAgIDB4MDU1OCwgMHgwNTVFLCAweDAyQUQsIDB4MDE1NCwgMHgwNzU0LCAweDAzQTgsIDB4MDA1NiwgMHgwMDI4LAorICAgICAgMHgwMEU4LCAweDAwNEEsIDB4MDAwQiwgMHgwMDNCLCAweDAwMTMsIDB4MDAwMywgMHgwMDBGLCAweDAwMDUsCisgICAgICAweDAwMDEsIDB4MDAwNiwgMHgwMDAwLCAweDAwMDgsIDB4MDAxQywgMHgwMDA0LCAweDAwMjQsIDB4MDA0QiwKKyAgICAgIDB4MDBFOSwgMHgwMDI5LCAweDAwNTcsIDB4MDNBOSwgMHgwNzU1LCAweDAxNTUsIDB4MDJBRSwgMHgwNTVGLAorICAgICAgMHgwNTU5LCAweDA1NEYsIDB4MDU0RCwgMHgwNTRCLCAweDA1NDksIDB4MDU0NywgMHgwNTQ1LCAweDA1NDMsCisgICAgICAweDA1NDEsIDB4M0FGRiwgMHgzQUZELCAweDNBRkIsIDB4M0FGOSwgMHgzQUY3LCAweDNBRjUsIDB4M0FGMywKKyAgICAgIDB4M0FGMSwgMHgzQUVGLCAweDNBRUQsIDB4M0FFQiwgMHgzQUU5LCAweDNBRTcsIDB4M0FFNSwgMHgzQUUzLAorICAgICAgMHgzQUUxLCAweDNBREYsIDB4M0FERCwgMHgzQURCLCAweDNBRDksIDB4M0FENywgMHgzQUQ1LCAweDNBRDMsCisgICAgICAweDNBRDEsIDB4M0FDRiwgMHgzQUNELCAweDNBQ0IsIDB4M0FDOSwgMHgzQUM3LCAweDNBQzUsIDB4M0FDMywKKyAgICAgIDB4M0FDMSwgMHgzQUJGLCAweDNBQkQsIDB4M0FCQiwgMHgzQUI5LCAweDNBQjcsIDB4M0FCNSwgMHgzQUIzLAorICAgICAgMHgzQUIxLCB9LAorICAgIHsgMHgwRjYwLCAweDBGNjIsIDB4MEY2NCwgMHgwRjY2LCAweDBGNjgsIDB4MEY2QSwgMHgwRjZDLCAweDBGNkUsCisgICAgICAweDBGNzAsIDB4MEY3MiwgMHgwRjc0LCAweDBGNzYsIDB4MEY3OCwgMHgwRjdBLCAweDBGN0MsIDB4MEY3RSwKKyAgICAgIDB4MEY4MCwgMHgwRjgyLCAweDBGODQsIDB4MEY4NiwgMHgwRjg4LCAweDBGOEEsIDB4MEY4QywgMHgwRjhFLAorICAgICAgMHgwRjkwLCAweDBGOTIsIDB4MEY5NCwgMHgwRjk2LCAweDBGOTgsIDB4MEY5QSwgMHgwRjlDLCAweDBGOUUsCisgICAgICAweDBGQTAsIDB4MEZBMiwgMHgwRkE0LCAweDBGQTYsIDB4MEZBOCwgMHgwRkFBLCAweDBGQUMsIDB4MEZBRSwKKyAgICAgIDB4MEZCMCwgMHgwRkIyLCAweDBGQjQsIDB4MEZCNiwgMHgwRkI4LCAweDBGQkEsIDB4MEZCQywgMHgwRkJFLAorICAgICAgMHgwN0EwLCAweDA3QTIsIDB4MDNEMiwgMHgwMUVBLCAweDAwRkMsIDB4MDA3RiwgMHgwMDFDLCAweDAwMEMsCisgICAgICAweDAwMDQsIDB4MDAzNCwgMHgwMDEwLCAweDAwMUIsIDB4MDAwOSwgMHgwMDBCLCAweDAwMEUsIDB4MDAwMSwKKyAgICAgIDB4MDAwMywgMHgwMDAyLCAweDAwMEYsIDB4MDAwQywgMHgwMDBBLCAweDAwMDAsIDB4MDAxMSwgMHgwMDM1LAorICAgICAgMHgwMDA1LCAweDAwMEQsIDB4MDAxRCwgMHgwMDNDLCAweDAwRkQsIDB4MDFFQiwgMHgwM0QzLCAweDA3QTMsCisgICAgICAweDA3QTEsIDB4MEZCRiwgMHgwRkJELCAweDBGQkIsIDB4MEZCOSwgMHgwRkI3LCAweDBGQjUsIDB4MEZCMywKKyAgICAgIDB4MEZCMSwgMHgwRkFGLCAweDBGQUQsIDB4MEZBQiwgMHgwRkE5LCAweDBGQTcsIDB4MEZBNSwgMHgwRkEzLAorICAgICAgMHgwRkExLCAweDBGOUYsIDB4MEY5RCwgMHgwRjlCLCAweDBGOTksIDB4MEY5NywgMHgwRjk1LCAweDBGOTMsCisgICAgICAweDBGOTEsIDB4MEY4RiwgMHgwRjhELCAweDBGOEIsIDB4MEY4OSwgMHgwRjg3LCAweDBGODUsIDB4MEY4MywKKyAgICAgIDB4MEY4MSwgMHgwRjdGLCAweDBGN0QsIDB4MEY3QiwgMHgwRjc5LCAweDBGNzcsIDB4MEY3NSwgMHgwRjczLAorICAgICAgMHgwRjcxLCAweDBGNkYsIDB4MEY2RCwgMHgwRjZCLCAweDBGNjksIDB4MEY2NywgMHgwRjY1LCAweDBGNjMsCisgICAgICAweDBGNjEsIH0sCisgICAgeyAweDUxRDAsIDB4NTFEMiwgMHg1MUQ0LCAweDUxRDYsIDB4NTFEOCwgMHg1MURBLCAweDUxREMsIDB4NTFERSwKKyAgICAgIDB4NTFFMCwgMHg1MUUyLCAweDUxRTQsIDB4NTFFNiwgMHg1MUU4LCAweDUxRUEsIDB4NTFFQywgMHg1MUVFLAorICAgICAgMHg1MUYwLCAweDUxRjIsIDB4NTFGNCwgMHg1MUY2LCAweDUxRjgsIDB4NTFGQSwgMHg1MUZDLCAweDUxRkUsCisgICAgICAweDcwQzAsIDB4NzBDMiwgMHg3MEM0LCAweDcwQzYsIDB4NzBDOCwgMHg3MENBLCAweDcwQ0MsIDB4NzBDRSwKKyAgICAgIDB4NzBFQywgMHgxMEVBLCAweDM4NjgsIDB4Mzg3NywgMHgwODc2LCAweDFDMzUsIDB4MDQzNCwgMHgwQTM0LAorICAgICAgMHgwRTFCLCAweDAyMUIsIDB4MDUxQiwgMHgwNzBGLCAweDAxMEYsIDB4MDM4MCwgMHgwMDgwLCAweDAxNDAsCisgICAgICAweDAxQzEsIDB4MDA0MSwgMHgwMEExLCAweDAwRTIsIDB4MDAyMiwgMHgwMDUyLCAweDAwNzIsIDB4MDAxMiwKKyAgICAgIDB4MDAyQSwgMHgwMDNBLCAweDAwMEEsIDB4MDAxNiwgMHgwMDFFLCAweDAwMDYsIDB4MDAwQywgMHgwMDAwLAorICAgICAgMHgwMDA0LCAweDAwMDEsIDB4MDAwRCwgMHgwMDA3LCAweDAwMUYsIDB4MDAxNywgMHgwMDBCLCAweDAwM0IsCisgICAgICAweDAwMkIsIDB4MDAxMywgMHgwMDczLCAweDAwNTMsIDB4MDAyMywgMHgwMEUzLCAweDAwQTIsIDB4MDA0MiwKKyAgICAgIDB4MDFDMiwgMHgwMTQxLCAweDAwODEsIDB4MDM4MSwgMHgwMjhDLCAweDAxMEMsIDB4MDUxQywgMHgwMjFDLAorICAgICAgMHgwRTFDLCAweDBBMzUsIDB4MDQzNSwgMHgxQzNBLCAweDA4NzcsIDB4MDg3NCwgMHgzODY5LCAweDEwRUIsCisgICAgICAweDcwRUQsIDB4NzBDRiwgMHg3MENELCAweDcwQ0IsIDB4NzBDOSwgMHg3MEM3LCAweDcwQzUsIDB4NzBDMywKKyAgICAgIDB4NzBDMSwgMHg1MUZGLCAweDUxRkQsIDB4NTFGQiwgMHg1MUY5LCAweDUxRjcsIDB4NTFGNSwgMHg1MUYzLAorICAgICAgMHg1MUYxLCAweDUxRUYsIDB4NTFFRCwgMHg1MUVCLCAweDUxRTksIDB4NTFFNywgMHg1MUU1LCAweDUxRTMsCisgICAgICAweDUxRTEsIDB4NTFERiwgMHg1MURELCAweDUxREIsIDB4NTFEOSwgMHg1MUQ3LCAweDUxRDUsIDB4NTFEMywKKyAgICAgIDB4NTFEMSwgfSwKKyAgICB7IDB4NkY2NCwgMHg2RjY2LCAweDZGNjgsIDB4NkY2QSwgMHg2RjZDLCAweDZGNkUsIDB4NkY3MCwgMHg2RjcyLAorICAgICAgMHg2Rjc0LCAweDZGNzYsIDB4NkY3OCwgMHg2RjdBLCAweDZGN0MsIDB4NkY3RSwgMHg2RjgwLCAweDZGODIsCisgICAgICAweDZGODQsIDB4NkY4NiwgMHg2Rjg4LCAweDZGOEEsIDB4NkY4QywgMHg2RjhFLCAweDZGOTAsIDB4NkY5MiwKKyAgICAgIDB4NkY5NCwgMHg2Rjk2LCAweDZGOTgsIDB4NkY5QSwgMHg2RjlDLCAweDZGOUUsIDB4NkZBMCwgMHg2RkEyLAorICAgICAgMHg2RkE0LCAweDZGQTYsIDB4NkZBOCwgMHg2RkFBLCAweDZGQUMsIDB4NkZBRSwgMHg2RkIwLCAweDZGQjIsCisgICAgICAweDZGQjQsIDB4NkZCNiwgMHgxN0I0LCAweDM3REMsIDB4MEJEQiwgMHgxQkVGLCAweDA1RUUsIDB4MERGOCwKKyAgICAgIDB4MDJGOCwgMHgwNkZELCAweDAxN0QsIDB4MDM3RiwgMHgwMEJGLCAweDAwNDAsIDB4MDBDMCwgMHgwMDIxLAorICAgICAgMHgwMDYxLCAweDAwMTEsIDB4MDAzMSwgMHgwMDA5LCAweDAwMTksIDB4MDAwNiwgMHgwMDBFLCAweDAwMDQsCisgICAgICAweDAwMDAsIDB4MDAwNSwgMHgwMDBGLCAweDAwMDcsIDB4MDAxQSwgMHgwMDBBLCAweDAwMzYsIDB4MDAxNiwKKyAgICAgIDB4MDA2RSwgMHgwMDJFLCAweDAwQzEsIDB4MDA0MSwgMHgwMUJDLCAweDAwQkMsIDB4MDM3QSwgMHgwMTdBLAorICAgICAgMHgwMkY5LCAweDBERjksIDB4MDVFRiwgMHgwNUVDLCAweDFCRDgsIDB4MzdERCwgMHgxN0I1LCAweDZGQjcsCisgICAgICAweDZGQjUsIDB4NkZCMywgMHg2RkIxLCAweDZGQUYsIDB4NkZBRCwgMHg2RkFCLCAweDZGQTksIDB4NkZBNywKKyAgICAgIDB4NkZBNSwgMHg2RkEzLCAweDZGQTEsIDB4NkY5RiwgMHg2RjlELCAweDZGOUIsIDB4NkY5OSwgMHg2Rjk3LAorICAgICAgMHg2Rjk1LCAweDZGOTMsIDB4NkY5MSwgMHg2RjhGLCAweDZGOEQsIDB4NkY4QiwgMHg2Rjg5LCAweDZGODcsCisgICAgICAweDZGODUsIDB4NkY4MywgMHg2RjgxLCAweDZGN0YsIDB4NkY3RCwgMHg2RjdCLCAweDZGNzksIDB4NkY3NywKKyAgICAgIDB4NkY3NSwgMHg2RjczLCAweDZGNzEsIDB4NkY2RiwgMHg2RjZELCAweDZGNkIsIDB4NkY2OSwgMHg2RjY3LAorICAgICAgMHg2RjY1LCB9LAorICAgIHsgMHhERjU0LCAweERGNTYsIDB4REZDOCwgMHhERkNBLCAweERGQ0MsIDB4REZDRSwgMHhERkQwLCAweERGRDIsCisgICAgICAweERGRDQsIDB4REZENiwgMHhERkQ4LCAweERGREEsIDB4REZEQywgMHhERkRFLCAweERGRTAsIDB4REZFMiwKKyAgICAgIDB4MEZFOCwgMHgyRkVBLCAweDZGQTgsIDB4NkZGNiwgMHgwN0Y1LCAweDA3RjcsIDB4MzdEMiwgMHgzN0Y5LAorICAgICAgMHgwM0Y4LCAweDBCRjgsIDB4MEJGQiwgMHgxQkVCLCAweDAxRkEsIDB4MDVGQSwgMHgwOUZBLCAweDBERkEsCisgICAgICAweDBERkYsIDB4MDBGRiwgMHgwMkZGLCAweDA2RkIsIDB4MDA3QywgMHgwMTdDLCAweDAyN0MsIDB4MDI3RiwKKyAgICAgIDB4MDAzQywgMHgwMEJDLCAweDAxM0MsIDB4MDFCQywgMHgwMDFDLCAweDAwNUMsIDB4MDA5QywgMHgwMERDLAorICAgICAgMHgwMDBDLCAweDAwMkMsIDB4MDA0QywgMHgwMDZDLCAweDAwMDQsIDB4MDAxNCwgMHgwMDI0LCAweDAwMzQsCisgICAgICAweDAwMDAsIDB4MDAwOCwgMHgwMDEwLCAweDAwMTgsIDB4MDAxRSwgMHgwMDAyLCAweDAwMDYsIDB4MDAwQSwKKyAgICAgIDB4MDAwRSwgMHgwMDBCLCAweDAwMDcsIDB4MDAwMywgMHgwMDFGLCAweDAwMTksIDB4MDAxMSwgMHgwMDA5LAorICAgICAgMHgwMDAxLCAweDAwMzUsIDB4MDAyNSwgMHgwMDE1LCAweDAwMDUsIDB4MDA2RCwgMHgwMDRELCAweDAwMkQsCisgICAgICAweDAwMEQsIDB4MDBERCwgMHgwMDlELCAweDAwNUQsIDB4MDAxRCwgMHgwMUJELCAweDAxM0QsIDB4MDBCRCwKKyAgICAgIDB4MDAzRCwgMHgwMzdDLCAweDAyN0QsIDB4MDE3RCwgMHgwMDdELCAweDA2RkMsIDB4MDRGQywgMHgwMkZDLAorICAgICAgMHgwMEZDLCAweDBERkIsIDB4MDlGQiwgMHgwNUZCLCAweDAxRkIsIDB4MUJGOCwgMHgxQkU4LCAweDBCRjksCisgICAgICAweDAzRjksIDB4MzdGQSwgMHgzN0QzLCAweDE3RjQsIDB4MDdGNiwgMHg2RkY3LCAweDZGQTksIDB4MkZFQiwKKyAgICAgIDB4MEZFOSwgMHhERkUzLCAweERGRTEsIDB4REZERiwgMHhERkRELCAweERGREIsIDB4REZEOSwgMHhERkQ3LAorICAgICAgMHhERkQ1LCAweERGRDMsIDB4REZEMSwgMHhERkNGLCAweERGQ0QsIDB4REZDQiwgMHhERkM5LCAweERGNTcsCisgICAgICAweERGNTUsIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHNjYWxlc19iaXRzW1NDQUxFU19DT1VOVF1bMTI5XSA9IHsKKyAgICB7IDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAgIDEzLCAxMywgMTIsIDExLCAxMSwgMTAsICA5LCAgOCwKKyAgICAgICA4LCAgNywgIDYsICA2LCAgNSwgIDQsICA0LCAgMywKKyAgICAgICAyLCAgMywgIDMsICA0LCAgNSwgIDUsICA2LCAgNywKKyAgICAgICA4LCAgOCwgIDksIDEwLCAxMSwgMTEsIDEyLCAxMywKKyAgICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAgIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgIDE0LCB9LAorICAgIHsgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTQsIDE0LCAxMywgMTIsIDExLCAxMCwgIDgsICA3LAorICAgICAgIDYsICA2LCAgNSwgIDUsICA0LCAgNCwgIDQsICAzLAorICAgICAgIDMsICAzLCAgNCwgIDQsICA0LCAgNCwgIDUsICA2LAorICAgICAgIDYsICA3LCAgOCwgIDksIDExLCAxMiwgMTMsIDE0LAorICAgICAgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIH0sCisgICAgeyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsCisgICAgICAxMiwgMTEsIDExLCAxMSwgMTAsIDEwLCAgOSwgIDksCisgICAgICAgOSwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIDYsCisgICAgICAgNiwgIDYsICA1LCAgNSwgIDUsICA0LCAgNCwgIDMsCisgICAgICAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsCisgICAgICAgNiwgIDYsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsCisgICAgICAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsCisgICAgICAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgfSwKKyAgICB7IDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwKKyAgICAgIDExLCAxMSwgMTAsIDEwLCAgOSwgIDgsICA4LCAgNywKKyAgICAgICA3LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgMywKKyAgICAgICAyLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwKKyAgICAgICA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwKKyAgICAgIDExLCAxMiwgMTIsIDEyLCAxMywgMTQsIDE0LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCB9LAorICAgIHsgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LAorICAgICAgMTMsIDEzLCAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLAorICAgICAgMTIsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLAorICAgICAgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LAorICAgICAgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LAorICAgICAgIDUsICA1LCAgNSwgIDUsICA1LCAgNCwgIDQsICA0LAorICAgICAgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA1LAorICAgICAgIDUsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LAorICAgICAgIDcsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LAorICAgICAgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLAorICAgICAgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgICAgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsCisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzNfY29kZXNbM10gPSB7CisgICAgMHgwMDAzLCAweDAwMDAsIDB4MDAwMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzNfYml0c1szXSA9IHsKKyAgICAyLCAgMSwgIDIsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfNV9jb2Rlc19hWzVdID0geworICAgIDB4MDAwRiwgMHgwMDA2LCAweDAwMDAsIDB4MDAwMiwgMHgwMDBFLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzVfY29kZXNfYls1XSA9IHsKKyAgICAweDAwMDcsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDAsIDB4MDAwNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY181X2NvZGVzX2NbNV0gPSB7CisgICAgMHgwMDA3LCAweDAwMDUsIDB4MDAwMCwgMHgwMDA0LCAweDAwMDYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY181X2JpdHNfYVs1XSA9IHsKKyAgICA0LCAgMywgIDEsICAyLCAgNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzVfYml0c19iWzVdID0geworICAgIDMsICAyLCAgMiwgIDIsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfNV9iaXRzX2NbNV0gPSB7CisgICAgMywgIDMsICAxLCAgMywgIDMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfN19jb2Rlc19hWzddID0geworICAgIDB4MDAxRSwgMHgwMDBFLCAweDAwMDUsIDB4MDAwMCwgMHgwMDA2LCAweDAwMDQsIDB4MDAxRiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY183X2NvZGVzX2JbN10gPSB7CisgICAgMHgwMDE0LCAweDAwMEIsIDB4MDAwMCwgMHgwMDAzLCAweDAwMDEsIDB4MDAwNCwgMHgwMDE1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzdfY29kZXNfY1s3XSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMiwgMHgwMDAxLCAweDAwMDMsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDEsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY183X2JpdHNfYVs3XSA9IHsKKyAgICA1LCAgNCwgIDMsICAxLCAgMywgIDMsICA1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfN19iaXRzX2JbN10gPSB7CisgICAgNSwgIDQsICAyLCAgMiwgIDIsICAzLCAgNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzdfYml0c19jWzddID0geworICAgIDQsICA0LCAgMiwgIDIsICAyLCAgNCwgIDQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfOV9jb2Rlc19hWzldID0geworICAgIDB4MDAzMCwgMHgwMDE5LCAweDAwMDksIDB4MDAwNSwgMHgwMDAwLCAweDAwMDcsIDB4MDAwRCwgMHgwMDA4LAorICAgIDB4MDAzMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY185X2NvZGVzX2JbOV0gPSB7CisgICAgMHgwMDE4LCAweDAwMUEsIDB4MDAwMiwgMHgwMDA3LCAweDAwMDIsIDB4MDAwMCwgMHgwMDAzLCAweDAwMUIsCisgICAgMHgwMDE5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzlfY29kZXNfY1s5XSA9IHsKKyAgICAweDAwMUMsIDB4MDAwRiwgMHgwMDAyLCAweDAwMDcsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDYsIDB4MDAwNiwKKyAgICAweDAwMUQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY185X2JpdHNfYVs5XSA9IHsKKyAgICA2LCAgNSwgIDQsICAzLCAgMSwgIDMsICA0LCAgNCwgIDYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY185X2JpdHNfYls5XSA9IHsKKyAgICA1LCAgNSwgIDMsICAzLCAgMiwgIDIsICAzLCAgNSwgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY185X2JpdHNfY1s5XSA9IHsKKyAgICA2LCAgNSwgIDMsICAzLCAgMiwgIDIsICAzLCAgNCwgIDYsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTNfY29kZXNfYVsxM10gPSB7CisgICAgMHgwMDcwLCAweDAwMkUsIDB4MDAzOSwgMHgwMDFELCAweDAwMEMsIDB4MDAwRiwgMHgwMDAwLCAweDAwMDQsCisgICAgMHgwMDBELCAweDAwMEEsIDB4MDAxNiwgMHgwMDJGLCAweDAwNzEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTNfY29kZXNfYlsxM10gPSB7CisgICAgMHgwMDM4LCAweDAwMTAsIDB4MDAxRCwgMHgwMDA3LCAweDAwMEYsIDB4MDAwNSwgMHgwMDAwLCAweDAwMDYsCisgICAgMHgwMDAyLCAweDAwMDksIDB4MDAwNiwgMHgwMDExLCAweDAwMzksCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTNfY29kZXNfY1sxM10gPSB7CisgICAgMHgwMDA0LCAweDAwMUEsIDB4MDAwMywgMHgwMDBFLCAweDAwMDAsIDB4MDAwMywgMHgwMDA1LCAweDAwMDQsCisgICAgMHgwMDAyLCAweDAwMEYsIDB4MDAwQywgMHgwMDFCLCAweDAwMDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xM19iaXRzX2FbMTNdID0geworICAgICA3LCAgNiwgIDYsICA1LCAgNCwgIDQsICAxLCAgMywgIDQsICA0LCAgNSwgIDYsICA3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTNfYml0c19iWzEzXSA9IHsKKyAgICAgNiwgIDUsICA1LCAgNCwgIDQsICAzLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzEzX2JpdHNfY1sxM10gPSB7CisgICAgIDUsICA1LCAgNCwgIDQsICAzLCAgMywgIDMsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTdfY29kZXNfYVsxN10gPSB7CisgICAgMHgwMTU0LCAweDAwQUIsIDB4MDAyQiwgMHgwMDBCLCAweDAwMDMsIDB4MDAwQSwgMHgwMDAxLCAweDAwMDYsCisgICAgMHgwMDAxLCAweDAwMDcsIDB4MDAwNCwgMHgwMDBCLCAweDAwMDAsIDB4MDAwNCwgMHgwMDE0LCAweDAwNTQsCisgICAgMHgwMTU1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzE3X2NvZGVzX2JbMTddID0geworICAgIDB4MDA3QywgMHgwMDNGLCAweDAwMTksIDB4MDAwRCwgMHgwMDFDLCAweDAwMDgsIDB4MDAwRiwgMHgwMDA1LAorICAgIDB4MDAwMCwgMHgwMDA2LCAweDAwMDIsIDB4MDAwOSwgMHgwMDFELCAweDAwMEUsIDB4MDAxRSwgMHgwMDE4LAorICAgIDB4MDA3RCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xN19jb2Rlc19jWzE3XSA9IHsKKyAgICAweDAwMkMsIDB4MDAxNywgMHgwMDA1LCAweDAwMUMsIDB4MDAwMywgMHgwMDBBLCAweDAwMEYsIDB4MDAwMywKKyAgICAweDAwMDYsIDB4MDAwNCwgMHgwMDAwLCAweDAwMEIsIDB4MDAwNCwgMHgwMDFELCAweDAwMEEsIDB4MDAwNCwKKyAgICAweDAwMkQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTdfY29kZXNfZFsxN10gPSB7CisgICAgMHgwMTAwLCAweDAxMDIsIDB4MDA4MiwgMHgwMDQyLCAweDAwMjIsIDB4MDAxMiwgMHgwMDBBLCAweDAwMDYsCisgICAgMHgwMDAwLCAweDAwMDcsIDB4MDAwQiwgMHgwMDEzLCAweDAwMjMsIDB4MDA0MywgMHgwMDgzLCAweDAxMDMsCisgICAgMHgwMTAxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzE3X2NvZGVzX2VbMTddID0geworICAgIDB4MDBFOCwgMHgwMEY2LCAweDAwNzUsIDB4MDAzNCwgMHgwMDNCLCAweDAwMUIsIDB4MDAxRiwgMHgwMDA0LAorICAgIDB4MDAwMCwgMHgwMDA1LCAweDAwMEMsIDB4MDAxQywgMHgwMDNDLCAweDAwMzUsIDB4MDA3QSwgMHgwMEY3LAorICAgIDB4MDBFOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xN19jb2Rlc19mWzE3XSA9IHsKKyAgICAweDAwMDQsIDB4MDAwMywgMHgwMDFFLCAweDAwMDEsIDB4MDAwMSwgMHgwMDBFLCAweDAwMDEsIDB4MDAwNCwKKyAgICAweDAwMDYsIDB4MDAwNSwgMHgwMDAyLCAweDAwMEYsIDB4MDAwNiwgMHgwMDBFLCAweDAwMUYsIDB4MDAwMCwKKyAgICAweDAwMDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTdfY29kZXNfZ1sxN10gPSB7CisgICAgMHgwMDYwLCAweDAwN0UsIDB4MDAzMSwgMHgwMDE5LCAweDAwMEQsIDB4MDAwNCwgMHgwMDAwLCAweDAwMDYsCisgICAgMHgwMDAyLCAweDAwMDcsIDB4MDAwMSwgMHgwMDA1LCAweDAwMEUsIDB4MDAxRSwgMHgwMDNFLCAweDAwN0YsCisgICAgMHgwMDYxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTdfYml0c19hWzE3XSA9IHsKKyAgICAxMiwgMTEsICA5LCAgNywgIDUsICA0LCAgMywgIDMsICAyLCAgMywgIDMsICA0LCAgNCwgIDYsICA4LCAxMCwKKyAgICAxMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzE3X2JpdHNfYlsxN10gPSB7CisgICAgOCwgIDcsICA2LCAgNSwgIDUsICA0LCAgNCwgIDMsICAyLCAgMywgIDMsICA0LCAgNSwgIDUsICA2LCAgNiwKKyAgICA4LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTdfYml0c19jWzE3XSA9IHsKKyAgICA3LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgMywgIDMsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA1LAorICAgIDcsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xN19iaXRzX2RbMTddID0geworICAgIDksICA5LCAgOCwgIDcsICA2LCAgNSwgIDQsICAzLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksCisgICAgOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzE3X2JpdHNfZVsxN10gPSB7CisgICAgOCwgIDgsICA3LCAgNiwgIDYsICA1LCAgNSwgIDMsICAxLCAgMywgIDQsICA1LCAgNiwgIDYsICA3LCAgOCwKKyAgICA4LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTdfYml0c19mWzE3XSA9IHsKKyAgICA4LCAgNywgIDYsICA1LCAgNCwgIDQsICAzLCAgMywgIDMsICAzLCAgMywgIDQsICA0LCAgNSwgIDYsICA2LAorICAgIDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xN19iaXRzX2dbMTddID0geworICAgIDgsICA4LCAgNywgIDYsICA1LCAgNCwgIDMsICAzLCAgMiwgIDMsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCisgICAgOCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18yNV9jb2Rlc19hWzI1XSA9IHsKKyAgICAweDI4NTQsIDB4MTQyQiwgMHgwNTBCLCAweDAxNDMsIDB4MDBBMiwgMHgwMDUyLCAweDAwMkUsIDB4MDAxNSwKKyAgICAweDAwMDQsIDB4MDAwRSwgMHgwMDAwLCAweDAwMDMsIDB4MDAwNiwgMHgwMDA0LCAweDAwMDEsIDB4MDAwRiwKKyAgICAweDAwMDUsIDB4MDAxNiwgMHgwMDJGLCAweDAwNTMsIDB4MDBBMywgMHgwMEEwLCAweDAyODQsIDB4MEExNCwKKyAgICAweDI4NTUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMjVfY29kZXNfYlsyNV0gPSB7CisgICAgMHgwMDFDLCAweDAwMEYsIDB4MDAwNSwgMHgwMDAwLCAweDAwMzAsIDB4MDAzNiwgMHgwMDBFLCAweDAwMTksCisgICAgMHgwMDAxLCAweDAwMDgsIDB4MDAwRSwgMHgwMDAxLCAweDAwMDUsIDB4MDAwMiwgMHgwMDBGLCAweDAwMDksCisgICAgMHgwMDA2LCAweDAwMUEsIDB4MDAwRiwgMHgwMDM3LCAweDAwMzEsIDB4MDAwMSwgMHgwMDA2LCAweDAwMDQsCisgICAgMHgwMDFELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzI1X2NvZGVzX2NbMjVdID0geworICAgIDB4MDA0QywgMHgwMDI3LCAweDAwNkQsIDB4MDAyOCwgMHgwMDM3LCAweDAwMEUsIDB4MDAxNSwgMHgwMDAwLAorICAgIDB4MDAwNSwgMHgwMDA4LCAweDAwMEIsIDB4MDAwRSwgMHgwMDAxLCAweDAwMEYsIDB4MDAwQywgMHgwMDA5LAorICAgIDB4MDAwNiwgMHgwMDAxLCAweDAwMUEsIDB4MDAwRiwgMHgwMDA4LCAweDAwMjksIDB4MDAxMiwgMHgwMDZDLAorICAgIDB4MDA0RCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18yNV9jb2Rlc19kWzI1XSA9IHsKKyAgICAweDA3ODAsIDB4MDc4MiwgMHgwM0MyLCAweDAxRTIsIDB4MDBGRSwgMHgwMDc5LCAweDAwM0QsIDB4MDAxQywKKyAgICAweDAwMEMsIDB4MDAwNCwgMHgwMDAwLCAweDAwMDYsIDB4MDAwMiwgMHgwMDA3LCAweDAwMDEsIDB4MDAwNSwKKyAgICAweDAwMEQsIDB4MDAxRCwgMHgwMDNFLCAweDAwN0UsIDB4MDBGRiwgMHgwMUUzLCAweDAzQzMsIDB4MDc4MywKKyAgICAweDA3ODEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMjVfY29kZXNfZVsyNV0gPSB7CisgICAgMHgwMDNDLCAweDAwOTIsIDB4MDAxOCwgMHgwMDFGLCAweDAwNEUsIDB4MDAwRCwgMHgwMDI1LCAweDAwMDQsCisgICAgMHgwMDEwLCAweDAwMDAsIDB4MDAwQSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwMywgMHgwMDBCLCAweDAwMDEsCisgICAgMHgwMDExLCAweDAwMDUsIDB4MDAyNiwgMHgwMDBFLCAweDAwNEYsIDB4MDA0OCwgMHgwMDE5LCAweDAwOTMsCisgICAgMHgwMDNELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzI1X2NvZGVzX2ZbMjVdID0geworICAgIDB4MDMyNCwgMHgwMTkzLCAweDAwQ0UsIDB4MDA2NSwgMHgwMDI0LCAweDAwMEMsIDB4MDAxMywgMHgwMDA0LAorICAgIDB4MDAwNywgMHgwMDBBLCAweDAwMEQsIDB4MDAwRiwgMHgwMDAxLCAweDAwMDAsIDB4MDAwRSwgMHgwMDBCLAorICAgIDB4MDAwOCwgMHgwMDA1LCAweDAwMTgsIDB4MDAwRCwgMHgwMDI1LCAweDAwNjYsIDB4MDBDRiwgMHgwMEM4LAorICAgIDB4MDMyNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18yNV9jb2Rlc19nWzI1XSA9IHsKKyAgICAweDAzQTgsIDB4MDNBRSwgMHgwMUQ1LCAweDAwOTQsIDB4MDAxNCwgMHgwMDRCLCAweDAwMEIsIDB4MDAzQiwKKyAgICAweDAwMTMsIDB4MDAwMywgMHgwMDBGLCAweDAwMDUsIDB4MDAwMSwgMHgwMDA2LCAweDAwMDAsIDB4MDAwOCwKKyAgICAweDAwMUMsIDB4MDAwNCwgMHgwMDI0LCAweDAwNzQsIDB4MDAxNSwgMHgwMDk1LCAweDAxRDYsIDB4MDNBRiwKKyAgICAweDAzQTksCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18yNV9iaXRzX2FbMjVdID0geworICAgIDE0LCAxMywgMTEsICA5LCAgOCwgIDcsICA2LCAgNSwgIDQsICA0LCAgMywgIDMsICAzLCAgMywgIDMsICA0LAorICAgICA0LCAgNSwgIDYsICA3LCAgOCwgIDgsIDEwLCAxMiwgMTQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18yNV9iaXRzX2JbMjVdID0geworICAgIDksICA4LCAgNywgIDYsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgMywgIDMsICAzLCAgNCwgIDQsCisgICAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsICA5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMjVfYml0c19jWzI1XSA9IHsKKyAgICA4LCAgNywgIDcsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgNCwgIDQsICAzLCAgNCwgIDQsICA0LAorICAgIDQsICA0LCAgNSwgIDUsICA1LCAgNiwgIDYsICA3LCAgOCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzI1X2JpdHNfZFsyNV0gPSB7CisgICAgMTIsIDEyLCAxMSwgMTAsICA5LCAgOCwgIDcsICA2LCAgNSwgIDQsICAzLCAgMywgIDIsICAzLCAgMywgIDQsCisgICAgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzI1X2JpdHNfZVsyNV0gPSB7CisgICAgOCwgIDgsICA3LCAgNywgIDcsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICAzLCAgMiwgIDMsICA0LCAgNCwKKyAgICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18yNV9iaXRzX2ZbMjVdID0geworICAgIDEwLCAgOSwgIDgsICA3LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgNCwgIDQsICAzLCAgMywgIDQsICA0LAorICAgICA0LCAgNCwgIDUsICA1LCAgNiwgIDcsICA4LCAgOCwgMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18yNV9iaXRzX2dbMjVdID0geworICAgIDEwLCAxMCwgIDksICA4LCAgNywgIDcsICA2LCAgNiwgIDUsICA0LCAgNCwgIDMsICAyLCAgMywgIDMsICA0LAorICAgICA1LCAgNSwgIDYsICA3LCAgNywgIDgsICA5LCAxMCwgMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMzNfY29kZXNfYVszM10gPSB7CisgICAgMHgxNTgwLCAweDE1ODIsIDB4MEFDMiwgMHgwNTYyLCAweDAyQjIsIDB4MDE1RSwgMHgwMEFELCAweDAwNTQsCisgICAgMHgwMDFDLCAweDAwM0MsIDB4MDAwRiwgMHgwMDFGLCAweDAwMDgsIDB4MDAwQiwgMHgwMDBELCAweDAwMDAsCisgICAgMHgwMDAyLCAweDAwMDEsIDB4MDAwRSwgMHgwMDBDLCAweDAwMDksIDB4MDAwNiwgMHgwMDE0LCAweDAwM0QsCisgICAgMHgwMDFELCAweDAwNTUsIDB4MDBBRSwgMHgwMTVGLCAweDAyQjMsIDB4MDU2MywgMHgwQUMzLCAweDE1ODMsCisgICAgMHgxNTgxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzMzX2NvZGVzX2JbMzNdID0geworICAgIDB4MDMwQywgMHgwMTg3LCAweDAwNkQsIDB4MDAyOCwgMHgwMDM3LCAweDAwNjYsIDB4MDAxNSwgMHgwMDMxLAorICAgIDB4MDAwMCwgMHgwMDBCLCAweDAwMTIsIDB4MDAxQSwgMHgwMDAxLCAweDAwMDcsIDB4MDAwQSwgMHgwMDBFLAorICAgIDB4MDAwMSwgMHgwMDBGLCAweDAwMEIsIDB4MDAwOCwgMHgwMDA0LCAweDAwMUIsIDB4MDAxMywgMHgwMDBDLAorICAgIDB4MDAwMSwgMHgwMDMyLCAweDAwMUEsIDB4MDA2NywgMHgwMDYwLCAweDAwMjksIDB4MDBDMiwgMHgwMDZDLAorICAgIDB4MDMwRCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18zM19jb2Rlc19jWzMzXSA9IHsKKyAgICAweDAwQ0MsIDB4MDA2NywgMHgwMDA1LCAweDAwNzAsIDB4MDAwMywgMHgwMDFBLCAweDAwMzksIDB4MDAzRiwKKyAgICAweDAwMEEsIDB4MDAxMiwgMHgwMDE4LCAweDAwMUQsIDB4MDAwMSwgMHgwMDAzLCAweDAwMDcsIDB4MDAwQSwKKyAgICAweDAwMEQsIDB4MDAwQiwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMiwgMHgwMDFFLCAweDAwMTksIDB4MDAxMywKKyAgICAweDAwMEIsIDB4MDAwMCwgMHgwMDNFLCAweDAwMUIsIDB4MDAxOCwgMHgwMDcxLCAweDAwMzIsIDB4MDAwNCwKKyAgICAweDAwQ0QsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMzNfY29kZXNfZFszM10gPSB7CisgICAgMHgzQUY4LCAweDNBRkEsIDB4MUQ3RSwgMHgwRUJDLCAweDA3NUMsIDB4MDNBQywgMHgwMUQ0LCAweDAwOTQsCisgICAgMHgwMDE0LCAweDAwNEIsIDB4MDAwQiwgMHgwMDNCLCAweDAwMTMsIDB4MDAwMywgMHgwMDBGLCAweDAwMDUsCisgICAgMHgwMDAxLCAweDAwMDYsIDB4MDAwMCwgMHgwMDA4LCAweDAwMUMsIDB4MDAwNCwgMHgwMDI0LCAweDAwNzQsCisgICAgMHgwMDE1LCAweDAwOTUsIDB4MDFENSwgMHgwM0FELCAweDA3NUQsIDB4MEVCRCwgMHgxRDdGLCAweDNBRkIsCisgICAgMHgzQUY5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzMzX2NvZGVzX2VbMzNdID0geworICAgIDB4MDFDOCwgMHgwMUU2LCAweDAwNjQsIDB4MDBFMiwgMHgwMEU1LCAweDAwMzAsIDB4MDAzMywgMHgwMDczLAorICAgIDB4MDA3QSwgMHgwMDFBLCAweDAwM0EsIDB4MDAwMiwgMHgwMDFBLCAweDAwMUYsIDB4MDAwNywgMHgwMDAxLAorICAgIDB4MDAwMiwgMHgwMDAyLCAweDAwMEMsIDB4MDAwMCwgMHgwMDFCLCAweDAwMDMsIDB4MDAzQiwgMHgwMDFCLAorICAgIDB4MDA3QiwgMHgwMDc4LCAweDAwNzAsIDB4MDAzMSwgMHgwMEYyLCAweDAwRTMsIDB4MDA2NSwgMHgwMUU3LAorICAgIDB4MDFDOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18zM19jb2Rlc19mWzMzXSA9IHsKKyAgICAweDA3MjQsIDB4MDM5MywgMHgwMUNFLCAweDAwRTUsIDB4MDAyQywgMHgwMDA4LCAweDAwMTcsIDB4MDAzRSwKKyAgICAweDAwMDUsIDB4MDAxNCwgMHgwMDFELCAweDAwMDAsIDB4MDAwMywgMHgwMDA2LCAweDAwMDgsIDB4MDAwQiwKKyAgICAweDAwMEQsIDB4MDAwQywgMHgwMDA5LCAweDAwMDcsIDB4MDAwNCwgMHgwMDAxLCAweDAwMUUsIDB4MDAxNSwKKyAgICAweDAwMEEsIDB4MDAzRiwgMHgwMDM4LCAweDAwMDksIDB4MDAyRCwgMHgwMEU2LCAweDAxQ0YsIDB4MDFDOCwKKyAgICAweDA3MjUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMzNfY29kZXNfZ1szM10gPSB7CisgICAgMHgwMjg0LCAweDAwNDIsIDB4MDE0MCwgMHgwMTQzLCAweDAwM0UsIDB4MDBCRSwgMHgwMDExLCAweDAwNTEsCisgICAgMHgwMDA5LCAweDAwMjksIDB4MDAwNSwgMHgwMDE1LCAweDAwMDAsIDB4MDAwOCwgMHgwMDBFLCAweDAwMDIsCisgICAgMHgwMDA2LCAweDAwMDMsIDB4MDAwRiwgMHgwMDA5LCAweDAwMDEsIDB4MDAxNiwgMHgwMDA2LCAweDAwMkUsCisgICAgMHgwMDBFLCAweDAwNUUsIDB4MDAxRSwgMHgwMEJGLCAweDAwM0YsIDB4MDAyMCwgMHgwMTQxLCAweDAwNDMsCisgICAgMHgwMjg1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMzNfYml0c19hWzMzXSA9IHsKKyAgICAxMywgMTMsIDEyLCAxMSwgMTAsICA5LCAgOCwgIDcsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgMywKKyAgICAgMywgIDMsICA0LCAgNCwgIDQsICA0LCAgNSwgIDYsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywKKyAgICAxMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzMzX2JpdHNfYlszM10gPSB7CisgICAgMTAsICA5LCAgOCwgIDcsICA3LCAgNywgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsCisgICAgIDMsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsCisgICAgMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18zM19iaXRzX2NbMzNdID0geworICAgIDksICA4LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsCisgICAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywKKyAgICA5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMzNfYml0c19kWzMzXSA9IHsKKyAgICAxNCwgMTQsIDEzLCAxMiwgMTEsIDEwLCAgOSwgIDgsICA3LCAgNywgIDYsICA2LCAgNSwgIDQsICA0LCAgMywKKyAgICAgMiwgIDMsICAzLCAgNCwgIDUsICA1LCAgNiwgIDcsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAxNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzMzX2JpdHNfZVszM10gPSB7CisgICAgOSwgIDksICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA1LCAgNSwgIDUsICA0LCAgMywKKyAgICAyLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LAorICAgIDksCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18zM19iaXRzX2ZbMzNdID0geworICAgIDExLCAxMCwgIDksICA4LCAgNywgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsICA0LAorICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA3LCAgOCwgIDksICA5LAorICAgIDExLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMzNfYml0c19nWzMzXSA9IHsKKyAgICAxMCwgIDksICA5LCAgOSwgIDgsICA4LCAgNywgIDcsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgMywKKyAgICAgMywgIDMsICA0LCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwKKyAgICAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY182NV9jb2Rlc19hWzY1XSA9IHsKKyAgICAweDlFNUMsIDB4OUU1RSwgMHg0RjJDLCAweDI3OTQsIDB4MTNDNCwgMHgxRTQ0LCAweDA5RTMsIDB4MEYyMywKKyAgICAweDA0RjMsIDB4MDc5MiwgMHgwMjdFLCAweDAzQ0UsIDB4MDEzRCwgMHgwMUU1LCAweDAwOUMsIDB4MDBDQywKKyAgICAweDAwNDAsIDB4MDA1OCwgMHgwMDY3LCAweDAwMUUsIDB4MDAyMSwgMHgwMDJELCAweDAwM0QsIDB4MDAwNywKKyAgICAweDAwMTEsIDB4MDAxNCwgMHgwMDE3LCAweDAwMUEsIDB4MDAxQywgMHgwMDFGLCAweDAwMDEsIDB4MDAwNCwKKyAgICAweDAwMDYsIDB4MDAwNSwgMHgwMDAyLCAweDAwMDAsIDB4MDAxRCwgMHgwMDFCLCAweDAwMTgsIDB4MDAxNSwKKyAgICAweDAwMTIsIDB4MDAwRSwgMHgwMDA2LCAweDAwMzIsIDB4MDAyNiwgMHgwMDFGLCAweDAwNzgsIDB4MDA1OSwKKyAgICAweDAwNDEsIDB4MDBDRCwgMHgwMDlELCAweDAxRTYsIDB4MDEzRSwgMHgwM0NGLCAweDAyN0YsIDB4MDc5MywKKyAgICAweDA3OTAsIDB4MDRGMCwgMHgwOUU0LCAweDFFNDUsIDB4MTNDNSwgMHgyNzk1LCAweDRGMkQsIDB4OUU1RiwKKyAgICAweDlFNUQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfNjVfY29kZXNfYls2NV0gPSB7CisgICAgMHgwQThDLCAweDA1NDcsIDB4MDFCNSwgMHgwMDA4LCAweDAwREIsIDB4MDE1MiwgMHgwMDA1LCAweDAwMEIsCisgICAgMHgwMDhFLCAweDAwQUUsIDB4MDBFNCwgMHgwMDAzLCAweDAwMzcsIDB4MDAzOSwgMHgwMDU1LCAweDAwNkMsCisgICAgMHgwMDczLCAweDAwMDMsIDB4MDAxNSwgMHgwMDFELCAweDAwMjgsIDB4MDAzMCwgMHgwMDM3LCAweDAwM0UsCisgICAgMHgwMDA2LCAweDAwMEIsIDB4MDAwRiwgMHgwMDEyLCAweDAwMTYsIDB4MDAxOSwgMHgwMDFELCAweDAwMDEsCisgICAgMHgwMDA0LCAweDAwMDIsIDB4MDAxRSwgMHgwMDFBLCAweDAwMTcsIDB4MDAxMywgMHgwMDEwLCAweDAwMEMsCisgICAgMHgwMDA3LCAweDAwM0YsIDB4MDAzOCwgMHgwMDMxLCAweDAwMjksIDB4MDAyMiwgMHgwMDFBLCAweDAwMTQsCisgICAgMHgwMDAwLCAweDAwNkQsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMzgsIDB4MDAwNCwgMHgwMEU1LCAweDAwQUYsCisgICAgMHgwMDhGLCAweDAwNkMsIDB4MDAwQSwgMHgwMTUzLCAweDAxNTAsIDB4MDAwOSwgMHgwMkEyLCAweDAxQjQsCisgICAgMHgwQThELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzY1X2NvZGVzX2NbNjVdID0geworICAgIDB4MDQ1QywgMHgwMjJGLCAweDAzRjUsIDB4MDFCQywgMHgwMUZCLCAweDAwNTksIDB4MDBEMCwgMHgwMERGLAorICAgIDB4MDAwQSwgMHgwMDJELCAweDAwMkYsIDB4MDA1MiwgMHgwMDY5LCAweDAwNzgsIDB4MDA3RiwgMHgwMDBBLAorICAgIDB4MDAxMCwgMHgwMDFDLCAweDAwMjMsIDB4MDAyQSwgMHgwMDM1LCAweDAwM0EsIDB4MDAzRCwgMHgwMDAwLAorICAgIDB4MDAwMywgMHgwMDA2LCAweDAwMDksIDB4MDAwQywgMHgwMDBGLCAweDAwMTIsIDB4MDAxNiwgMHgwMDE4LAorICAgIDB4MDAxQywgMHgwMDE5LCAweDAwMTcsIDB4MDAxMywgMHgwMDEwLCAweDAwMEQsIDB4MDAwQSwgMHgwMDA3LAorICAgIDB4MDAwNCwgMHgwMDAxLCAweDAwM0UsIDB4MDAzQiwgMHgwMDM2LCAweDAwMkIsIDB4MDAyOCwgMHgwMDFELAorICAgIDB4MDAxMSwgMHgwMDBCLCAweDAwMDQsIDB4MDA3OSwgMHgwMDZFLCAweDAwNTMsIDB4MDA0NCwgMHgwMDJFLAorICAgIDB4MDAwQiwgMHgwMEZDLCAweDAwRDEsIDB4MDA4QSwgMHgwMDU4LCAweDAxQkQsIDB4MDExNiwgMHgwM0Y0LAorICAgIDB4MDQ1RCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY182NV9jb2Rlc19kWzY1XSA9IHsKKyAgICAweDcwQjAsIDB4NzBCMiwgMHg3MEI0LCAweDI4NTIsIDB4Mzg1QiwgMHgxNDJFLCAweDFDMkUsIDB4MEExNSwKKyAgICAweDBFMTQsIDB4MDIxNCwgMHgwNzA0LCAweDAxMDQsIDB4MDEwQiwgMHgwMzgzLCAweDAwODMsIDB4MDE0MywKKyAgICAweDAxQzMsIDB4MDA0MywgMHgwMEEyLCAweDAwRTIsIDB4MDAyMiwgMHgwMDUyLCAweDAwNzIsIDB4MDAxMiwKKyAgICAweDAwMkEsIDB4MDAzQSwgMHgwMDBBLCAweDAwMTYsIDB4MDAxRSwgMHgwMDA2LCAweDAwMEMsIDB4MDAwMCwKKyAgICAweDAwMDQsIDB4MDAwMSwgMHgwMDBELCAweDAwMDcsIDB4MDAxRiwgMHgwMDE3LCAweDAwMEIsIDB4MDAzQiwKKyAgICAweDAwMkIsIDB4MDAxMywgMHgwMDczLCAweDAwNTMsIDB4MDAyMywgMHgwMEUzLCAweDAwQTMsIDB4MDBBMCwKKyAgICAweDAwNDAsIDB4MDFDMCwgMHgwMDg0LCAweDAzODQsIDB4MDI4NCwgMHgwMTA1LCAweDA3MDUsIDB4MDIxNSwKKyAgICAweDBFMTUsIDB4MEExNiwgMHgxQzJGLCAweDE0MkYsIDB4MTQyOCwgMHgyODUzLCAweDcwQjUsIDB4NzBCMywKKyAgICAweDcwQjEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfNjVfY29kZXNfZVs2NV0gPSB7CisgICAgMHgwMzJDLCAweDAzMzIsIDB4MDM3OCwgMHgwMzdFLCAweDAwOEMsIDB4MDE0QSwgMHgwMTg4LCAweDAxOTcsCisgICAgMHgwMTlFLCAweDAxQkQsIDB4MDA0NCwgMHgwMDQ3LCAweDAwQUEsIDB4MDBDNSwgMHgwMENELCAweDAwREMsCisgICAgMHgwMDFDLCAweDAwMkMsIDB4MDA1MywgMHgwMDYzLCAweDAwNjgsIDB4MDAwOCwgMHgwMDBGLCAweDAwMTcsCisgICAgMHgwMDJCLCAweDAwMzUsIDB4MDAwNSwgMHgwMDA5LCAweDAwMTYsIDB4MDAxQywgMHgwMDA2LCAweDAwMEYsCisgICAgMHgwMDA0LCAweDAwMDAsIDB4MDAwNywgMHgwMDFELCAweDAwMTcsIDB4MDAwQSwgMHgwMDA2LCAweDAwMzYsCisgICAgMHgwMDMwLCAweDAwMjgsIDB4MDAxMCwgMHgwMDA5LCAweDAwNjksIDB4MDA2NCwgMHgwMDU0LCAweDAwMkQsCisgICAgMHgwMDFELCAweDAwREQsIDB4MDBDRSwgMHgwMENBLCAweDAwQUIsIDB4MDBBNCwgMHgwMDQ1LCAweDAxQkUsCisgICAgMHgwMTlGLCAweDAxOTgsIDB4MDE4OSwgMHgwMTRCLCAweDAwOEQsIDB4MDM3RiwgMHgwMzc5LCAweDAzMzMsCisgICAgMHgwMzJELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzY1X2NvZGVzX2ZbNjVdID0geworICAgIDB4MEZFMCwgMHgwRkUyLCAweDBGRTgsIDB4MEZFQSwgMHgwRkVDLCAweDBGRUUsIDB4MEZGMCwgMHgwRkYyLAorICAgIDB4MEZGNCwgMHgyRkYyLCAweDA3RjIsIDB4MDdGQiwgMHgwM0Y2LCAweDBCRkEsIDB4MEJGRCwgMHgwMUZGLAorICAgIDB4MDVGRiwgMHgwMkZDLCAweDAwN0MsIDB4MDE3QywgMHgwMDNDLCAweDAwQkMsIDB4MDAxQywgMHgwMDVDLAorICAgIDB4MDAwQywgMHgwMDJDLCAweDAwMDQsIDB4MDAxNCwgMHgwMDAwLCAweDAwMDgsIDB4MDAwRSwgMHgwMDAyLAorICAgIDB4MDAwNiwgMHgwMDAzLCAweDAwMEYsIDB4MDAwOSwgMHgwMDAxLCAweDAwMTUsIDB4MDAwNSwgMHgwMDJELAorICAgIDB4MDAwRCwgMHgwMDVELCAweDAwMUQsIDB4MDBCRCwgMHgwMDNELCAweDAxN0QsIDB4MDA3RCwgMHgwMkZELAorICAgIDB4MDBGQywgMHgwNUZDLCAweDAxRkEsIDB4MEJGQiwgMHgwM0Y3LCAweDE3RjgsIDB4MDdGMywgMHgyRkYzLAorICAgIDB4MEZGNSwgMHgwRkYzLCAweDBGRjEsIDB4MEZFRiwgMHgwRkVELCAweDBGRUIsIDB4MEZFOSwgMHgwRkUzLAorICAgIDB4MEZFMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY182NV9jb2Rlc19nWzY1XSA9IHsKKyAgICAweDAxMEMsIDB4MDM4QSwgMHgwNjA4LCAweDA3ODYsIDB4MDA4NCwgMHgwMDg3LCAweDAzMDIsIDB4MDMwNSwKKyAgICAweDAwNDAsIDB4MDBFMCwgMHgwMEUzLCAweDAxODMsIDB4MDAxRSwgMHgwMDVFLCAweDAwOUUsIDB4MDBERSwKKyAgICAweDAwRjEsIDB4MDAxMSwgMHgwMDM5LCAweDAwNjEsIDB4MDA3OSwgMHgwMDA5LCAweDAwMUQsIDB4MDAzMSwKKyAgICAweDAwM0QsIDB4MDAwNSwgMHgwMDBGLCAweDAwMTksIDB4MDAxRiwgMHgwMDAzLCAweDAwMDYsIDB4MDAwQSwKKyAgICAweDAwMEUsIDB4MDAwQiwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwgMHgwMDFBLCAweDAwMTIsIDB4MDAwQSwKKyAgICAweDAwMDIsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4MDAwNiwgMHgwMDZFLCAweDAwNEUsIDB4MDAyRSwKKyAgICAweDAwMEUsIDB4MDBERiwgMHgwMDlGLCAweDAwNUYsIDB4MDAxRiwgMHgwMUUwLCAweDAxODAsIDB4MDBFMSwKKyAgICAweDAwNDEsIDB4MDNDMiwgMHgwMzAzLCAweDAxQzQsIDB4MDA4NSwgMHgwNzg3LCAweDA2MDksIDB4MDM4QiwKKyAgICAweDAxMEQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY182NV9iaXRzX2FbNjVdID0geworICAgIDE2LCAxNiwgMTUsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTEsIDExLCAxMCwgMTAsICA5LCAgOSwgIDgsICA4LAorICAgICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LAorICAgICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LAorICAgICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTMsIDEzLCAxNCwgMTUsIDE2LAorICAgIDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfNjVfYml0c19iWzY1XSA9IHsKKyAgICAxMiwgMTEsIDEwLCAgOSwgIDksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNCwKKyAgICAgNCwgIDQsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksIDEwLCAxMCwKKyAgICAxMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzY1X2JpdHNfY1s2NV0gPSB7CisgICAgMTEsIDEwLCAxMCwgIDksICA5LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDYsCisgICAgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsCisgICAgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsCisgICAgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgMTAsCisgICAgMTEsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY182NV9iaXRzX2RbNjVdID0geworICAgIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsIDExLCAxMSwgMTAsIDEwLCAxMCwgIDksICA5LAorICAgICA5LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNCwgIDQsICAzLAorICAgICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LAorICAgICA4LCAgOSwgIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTUsIDE1LAorICAgIDE1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfNjVfYml0c19lWzY1XSA9IHsKKyAgICAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgNywgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDUsICA0LCAgNCwKKyAgICAgMywgIDMsICA0LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwKKyAgICAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzY1X2JpdHNfZls2NV0gPSB7CisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTEsCisgICAgMTEsIDEwLCAgOSwgIDksICA4LCAgOCwgIDcsICA3LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgNCwgIDMsCisgICAgIDMsICAzLCAgNCwgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsCisgICAgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY182NV9iaXRzX2dbNjVdID0geworICAgIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNCwgIDQsICA0LAorICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LAorICAgICA3LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLAorICAgIDExLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19hWzEyOV0gPSB7CisgICAgMHgwNjYwLCAweDA2NjYsIDB4MDZFQywgMHgwNzIyLCAweDA3NjAsIDB4MDc2RSwgMHgwMDRDLCAweDAwNEUsCisgICAgMHgwMEY0LCAweDAxMEEsIDB4MDE0OCwgMHgwMTU2LCAweDAxRDQsIDB4MDFGMiwgMHgwMzMxLCAweDAzNzAsCisgICAgMHgwMzc3LCAweDAzOTYsIDB4MDNCMSwgMHgwMDI0LCAweDAwNjQsIDB4MDA3QiwgMHgwMDhBLCAweDAwQTUsCisgICAgMHgwMEQ0LCAweDAwRUIsIDB4MDBGQSwgMHgwMTlBLCAweDAxQjksIDB4MDFDOSwgMHgwMUQ5LCAweDAwMTAsCisgICAgMHgwMDMwLCAweDAwMzMsIDB4MDA0MywgMHgwMDUzLCAweDAwNkIsIDB4MDA3QSwgMHgwMENBLCAweDAwRDIsCisgICAgMHgwMERFLCAweDAwRTYsIDB4MDBGNiwgMHgwMDBFLCAweDAwMUYsIDB4MDAyMywgMHgwMDJCLCAweDAwM0IsCisgICAgMHgwMDNGLCAweDAwNjcsIDB4MDA3MCwgMHgwMDc3LCAweDAwMDUsIDB4MDAwRCwgMHgwMDEyLCAweDAwMUIsCisgICAgMHgwMDJDLCAweDAwMzUsIDB4MDAzQSwgMHgwMDA0LCAweDAwMEIsIDB4MDAxNywgMHgwMDFGLCAweDAwMDksCisgICAgMHgwMDA4LCAweDAwMEEsIDB4MDAwMCwgMHgwMDE4LCAweDAwMEMsIDB4MDAwNSwgMHgwMDNDLCAweDAwMzYsCisgICAgMHgwMDJELCAweDAwMUMsIDB4MDAxMywgMHgwMDBFLCAweDAwMDYsIDB4MDA3QSwgMHgwMDcxLCAweDAwNjgsCisgICAgMHgwMDY0LCAweDAwM0MsIDB4MDAzNCwgMHgwMDI4LCAweDAwMjAsIDB4MDAwRiwgMHgwMEY3LCAweDAwRTcsCisgICAgMHgwMERGLCAweDAwRDMsIDB4MDBDQiwgMHgwMDdCLCAweDAwNzQsIDB4MDA1NCwgMHgwMDQ0LCAweDAwM0MsCisgICAgMHgwMDMxLCAweDAwMTEsIDB4MDFEQSwgMHgwMUNBLCAweDAxQkEsIDB4MDE5QiwgMHgwMEZCLCAweDAwRjgsCisgICAgMHgwMEQ1LCAweDAwQUEsIDB4MDA4QiwgMHgwMDg0LCAweDAwNjUsIDB4MDAyNSwgMHgwM0I2LCAweDAzOTcsCisgICAgMHgwMzkwLCAweDAzNzEsIDB4MDMzMiwgMHgwMUYzLCAweDAxRDUsIDB4MDE1NywgMHgwMTQ5LCAweDAxMEIsCisgICAgMHgwMEY1LCAweDAwNEYsIDB4MDA0RCwgMHgwNzZGLCAweDA3NjEsIDB4MDcyMywgMHgwNkVELCAweDA2NjcsCisgICAgMHgwNjYxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19iWzEyOV0gPSB7CisgICAgMHgyOURDLCAweDE0RUYsIDB4MDQ1NSwgMHgwRTlDLCAweDAyMkIsIDB4MDQ4OSwgMHgwNzQwLCAweDA3NEYsCisgICAgMHgwMTcyLCAweDAyNDUsIDB4MDI0NywgMHgwMzBBLCAweDAzQTEsIDB4MDAxQywgMHgwMDhCLCAweDAwRDYsCisgICAgMHgwMTBDLCAweDAxNDgsIDB4MDE0RiwgMHgwMTg2LCAweDAxRDEsIDB4MDAwOCwgMHgwMDBGLCAweDAwNDYsCisgICAgMHgwMDVELCAweDAwNzgsIDB4MDA4NywgMHgwMDk2LCAweDAwQTUsIDB4MDBCQywgMHgwMEQ4LCAweDAwREUsCisgICAgMHgwMEY2LCAweDAwMDUsIDB4MDAxNCwgMHgwMDI0LCAweDAwMkYsIDB4MDAzQSwgMHgwMDNELCAweDAwNDksCisgICAgMHgwMDUwLCAweDAwNTgsIDB4MDA1RiwgMHgwMDY2LCAweDAwNkQsIDB4MDA3NSwgMHgwMDdDLCAweDAwMDQsCisgICAgMHgwMDBCLCAweDAwMTMsIDB4MDAxOCwgMHgwMDFCLCAweDAwMUYsIDB4MDAyMiwgMHgwMDI2LCAweDAwMkEsCisgICAgMHgwMDJELCAweDAwMzEsIDB4MDAzNCwgMHgwMDM4LCAweDAwM0IsIDB4MDAzRiwgMHgwMDAzLCAweDAwMDYsCisgICAgMHgwMDBBLCAweDAwMDcsIDB4MDAwNCwgMHgwMDAwLCAweDAwM0MsIDB4MDAzOSwgMHgwMDM1LCAweDAwMzIsCisgICAgMHgwMDJFLCAweDAwMkIsIDB4MDAyNywgMHgwMDIzLCAweDAwMjAsIDB4MDAxQywgMHgwMDE5LCAweDAwMTYsCisgICAgMHgwMDEwLCAweDAwMDUsIDB4MDA3RCwgMHgwMDdBLCAweDAwNkUsIDB4MDA2NywgMHgwMDYwLCAweDAwNTksCisgICAgMHgwMDUxLCAweDAwNEEsIDB4MDA0MiwgMHgwMDNCLCAweDAwMzQsIDB4MDAyNSwgMHgwMDE1LCAweDAwMDYsCisgICAgMHgwMEY3LCAweDAwREYsIDB4MDBEOSwgMHgwMEJELCAweDAwQTYsIDB4MDA5NywgMHgwMDkwLCAweDAwNzksCisgICAgMHgwMDZBLCAweDAwNDcsIDB4MDA0NCwgMHgwMDA5LCAweDAxRDIsIDB4MDE4NywgMHgwMTg0LCAweDAxNDksCisgICAgMHgwMTBELCAweDAwRDcsIDB4MDBCOCwgMHgwMDFELCAweDAzQTYsIDB4MDMwQiwgMHgwMjlDLCAweDAyNDYsCisgICAgMHgwMTczLCAweDAxMTQsIDB4MDc0MSwgMHgwNTNBLCAweDA0ODgsIDB4MEU5RCwgMHgwQTc2LCAweDA0NTQsCisgICAgMHgyOURELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19jWzEyOV0gPSB7CisgICAgMHgwRTVDLCAweDA3MkYsIDB4MDAxRCwgMHgwNzI0LCAweDAwMEYsIDB4MDEwRCwgMHgwMzI0LCAweDAzOTMsCisgICAgMHgwM0U5LCAweDAwODAsIDB4MDA4NywgMHgwMEZBLCAweDAxNjQsIDB4MDE5MywgMHgwMURFLCAweDAxRjUsCisgICAgMHgwMDEwLCAweDAwMkEsIDB4MDA0MSwgMHgwMDY0LCAweDAwNzMsIDB4MDA4RSwgMHgwMEE0LCAweDAwQjMsCisgICAgMHgwMEQ2LCAweDAwRTUsIDB4MDBGNCwgMHgwMEZCLCAweDAwMDIsIDB4MDAwOSwgMHgwMDEzLCAweDAwMUUsCisgICAgMHgwMDI2LCAweDAwMkMsIDB4MDAzMywgMHgwMDNGLCAweDAwNDEsIDB4MDA0QywgMHgwMDUzLCAweDAwNUUsCisgICAgMHgwMDY1LCAweDAwNzAsIDB4MDA3MywgMHgwMDc4LCAweDAwN0IsIDB4MDA3RSwgMHgwMDAyLCAweDAwMDUsCisgICAgMHgwMDA3LCAweDAwMEIsIDB4MDAwRCwgMHgwMDExLCAweDAwMTQsIDB4MDAxNywgMHgwMDFBLCAweDAwMUQsCisgICAgMHgwMDIxLCAweDAwMjQsIDB4MDAyNywgMHgwMDJBLCAweDAwMkQsIDB4MDAzMCwgMHgwMDMzLCAweDAwMzYsCisgICAgMHgwMDNBLCAweDAwMzcsIDB4MDAzNCwgMHgwMDMxLCAweDAwMkUsIDB4MDAyQiwgMHgwMDI4LCAweDAwMjUsCisgICAgMHgwMDIyLCAweDAwMUUsIDB4MDAxQiwgMHgwMDE4LCAweDAwMTUsIDB4MDAxMiwgMHgwMDBFLCAweDAwMEMsCisgICAgMHgwMDA4LCAweDAwMDYsIDB4MDAwMywgMHgwMDdGLCAweDAwN0MsIDB4MDA3OSwgMHgwMDc2LCAweDAwNzEsCisgICAgMHgwMDZBLCAweDAwNUYsIDB4MDA1OCwgMHgwMDRELCAweDAwNDYsIDB4MDA0MCwgMHgwMDM4LCAweDAwMkQsCisgICAgMHgwMDI3LCAweDAwMUYsIDB4MDAxNCwgMHgwMDEyLCAweDAwMDMsIDB4MDAwMCwgMHgwMEY1LCAweDAwRUUsCisgICAgMHgwMEQ3LCAweDAwQzgsIDB4MDBBNSwgMHgwMDhGLCAweDAwN0MsIDB4MDA2NSwgMHgwMDQyLCAweDAwMkIsCisgICAgMHgwMDExLCAweDAwMDIsIDB4MDFERiwgMHgwMUM4LCAweDAxNjUsIDB4MDBGQiwgMHgwMEU0LCAweDAwODEsCisgICAgMHgwMDA2LCAweDAzRTgsIDB4MDMyNSwgMHgwMUNBLCAweDAxMEMsIDB4MDcyNSwgMHgwMzk2LCAweDAwMUMsCisgICAgMHgwRTVELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19kWzEyOV0gPSB7CisgICAgMHhBNTk4LCAweEE1OUEsIDB4QTU5QywgMHhBNTlFLCAweEM1OTgsIDB4RTU4NiwgMHgzQUNDLCAweDUyQ0EsCisgICAgMHg2MkNELCAweDBENDgsIDB4MUQ2NywgMHgyOTc4LCAweDMxNjcsIDB4Mzk2NiwgMHgwNkE1LCAweDBFQkMsCisgICAgMHgxNEJELCAweDFDQjEsIDB4MDM1MCwgMHgwMzUzLCAweDA3NUYsIDB4MEE1RiwgMHgwQzVFLCAweDBFNUUsCisgICAgMHgwMUFFLCAweDAzQUQsIDB4MDUyRCwgMHgwNjJELCAweDA3MkQsIDB4MDBENSwgMHgwMUQ0LCAweDAyOTQsCisgICAgMHgwMzE0LCAweDAzOTQsIDB4MDAxNCwgMHgwMDk0LCAweDAxMTQsIDB4MDE3NCwgMHgwMUI0LCAweDAxRjQsCisgICAgMHgwMDBCLCAweDAwNEIsIDB4MDA4QiwgMHgwMEJCLCAweDAwREIsIDB4MDBGQiwgMHgwMDFCLCAweDAwM0IsCisgICAgMHgwMDUzLCAweDAwNjMsIDB4MDA3MywgMHgwMDAzLCAweDAwMTMsIDB4MDAyMywgMHgwMDJGLCAweDAwMzcsCisgICAgMHgwMDNGLCAweDAwMDcsIDB4MDAwRiwgMHgwMDE1LCAweDAwMTksIDB4MDAxRCwgMHgwMDAxLCAweDAwMDUsCisgICAgMHgwMDA5LCAweDAwMDYsIDB4MDAwMiwgMHgwMDFFLCAweDAwMUEsIDB4MDAxNiwgMHgwMDEwLCAweDAwMDgsCisgICAgMHgwMDAwLCAweDAwMzgsIDB4MDAzMCwgMHgwMDI4LCAweDAwMUMsIDB4MDAwQywgMHgwMDdDLCAweDAwNkMsCisgICAgMHgwMDVDLCAweDAwNDQsIDB4MDAyNCwgMHgwMDA0LCAweDAwRTQsIDB4MDBDNCwgMHgwMEE0LCAweDAwNzQsCisgICAgMHgwMDM0LCAweDAxRjUsIDB4MDFCNSwgMHgwMTc1LCAweDAxMTUsIDB4MDA5NSwgMHgwMDE1LCAweDAzOTUsCisgICAgMHgwMzE1LCAweDAyOTUsIDB4MDFENSwgMHgwMEQ2LCAweDA3MkUsIDB4MDYyRSwgMHgwNTJFLCAweDAzQUUsCisgICAgMHgwMUFGLCAweDBFNUYsIDB4MEM1RiwgMHgwQzU4LCAweDBBNTgsIDB4MDc1OCwgMHgwMzUxLCAweDFDQjIsCisgICAgMHgxOEIyLCAweDBFQkQsIDB4MEVCMiwgMHgzOTY3LCAweDM5NjAsIDB4Mjk3OSwgMHgyOTY0LCAweDBENDksCisgICAgMHg3MkMyLCAweDUyQ0IsIDB4M0FDRCwgMHhFNTg3LCAweEM1OTksIDB4QTU5RiwgMHhBNTlELCAweEE1OUIsCisgICAgMHhBNTk5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19lWzEyOV0gPSB7CisgICAgMHhBMTNDLCAweEM3MjAsIDB4QTEzRiwgMHhBMTNFLCAweEExM0QsIDB4RTcyMiwgMHg1MDkwLCAweDYzOTMsCisgICAgMHg3MzkyLCAweDI4NDksIDB4MzFDRSwgMHgzOUNFLCAweDE0MjUsIDB4MThFNSwgMHgxQ0U1LCAweDA4NDQsCisgICAgMHgwQTFDLCAweDBDN0MsIDB4MDM2QywgMHgwNDIzLCAweDA1MEYsIDB4MDYzRiwgMHgwMUI3LCAweDAyMTYsCisgICAgMHgwMjg1LCAweDAzMUQsIDB4MDM5RCwgMHgwMTA5LCAweDAxNDAsIDB4MDE4MCwgMHgwMUM4LCAweDAxQ0YsCisgICAgMHgwMDdBLCAweDAwOEEsIDB4MDBBMiwgMHgwMEMxLCAweDAwRTUsIDB4MDAxNCwgMHgwMDM3LCAweDAwNDMsCisgICAgMHgwMDRFLCAweDAwNTYsIDB4MDA2MSwgMHgwMDZDLCAweDAwN0MsIDB4MDAwQiwgMHgwMDFDLCAweDAwMUYsCisgICAgMHgwMDIzLCAweDAwMjUsIDB4MDAyOSwgMHgwMDJDLCAweDAwMkUsIDB4MDAzMiwgMHgwMDM0LCAweDAwMzcsCisgICAgMHgwMDNBLCAweDAwM0MsIDB4MDAzRiwgMHgwMDAxLCAweDAwMDMsIDB4MDAwNiwgMHgwMDA4LCAweDAwMEEsCisgICAgMHgwMDBDLCAweDAwMEIsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDQsIDB4MDAwMiwgMHgwMDAwLCAweDAwM0QsCisgICAgMHgwMDNCLCAweDAwMzgsIDB4MDAzNSwgMHgwMDMzLCAweDAwMkYsIDB4MDAyRCwgMHgwMDJBLCAweDAwMjYsCisgICAgMHgwMDI0LCAweDAwMjAsIDB4MDAxRCwgMHgwMDFBLCAweDAwN0QsIDB4MDA2RCwgMHgwMDYyLCAweDAwNTcsCisgICAgMHgwMDRGLCAweDAwNDQsIDB4MDAzQywgMHgwMDE1LCAweDAwRTYsIDB4MDBDNiwgMHgwMEEzLCAweDAwOEIsCisgICAgMHgwMDdCLCAweDAwNkMsIDB4MDFDOSwgMHgwMTgxLCAweDAxNDEsIDB4MDEwQSwgMHgwMERBLCAweDAzMUUsCisgICAgMHgwMjg2LCAweDAyMTcsIDB4MDIxMCwgMHgwNzM4LCAweDA2MzgsIDB4MDUwOCwgMHgwMzZELCAweDBDN0QsCisgICAgMHgwQTFELCAweDA4NDUsIDB4MUNFNiwgMHgxOEU2LCAweDE0MjYsIDB4MzlDRiwgMHgzMUNGLCAweDI4NEUsCisgICAgMHg3MzkzLCAweDczOTAsIDB4NTA5MSwgMHhFNzIzLCAweEM3MjQsIDB4QzcyNSwgMHhDNzIyLCAweEM3MjMsCisgICAgMHhDNzIxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19mWzEyOV0gPSB7CisgICAgMHg3NjJDLCAweDNCMTcsIDB4MTU1NSwgMHgwNjA4LCAweDBBQUIsIDB4MEZGMiwgMHgwMzA1LCAweDAzMDcsCisgICAgMHgwNzYzLCAweDAwNDYsIDB4MDEwQywgMHgwMUJDLCAweDAyQUIsIDB4MDNCNiwgMHgwM0ZELCAweDAwODAsCisgICAgMHgwMDg3LCAweDAwREYsIDB4MDE1NiwgMHgwMUQ5LCAweDAxRjgsIDB4MDFGRiwgMHgwMDJBLCAweDAwNDEsCisgICAgMHgwMDYxLCAweDAwOTQsIDB4MDBENCwgMHgwMEVBLCAweDAwRjIsIDB4MDBGRCwgMHgwMDA5LCAweDAwMEIsCisgICAgMHgwMDFBLCAweDAwMjYsIDB4MDAzMSwgMHgwMDQwLCAweDAwNEIsIDB4MDA2QiwgMHgwMDczLCAweDAwNzcsCisgICAgMHgwMDdBLCAweDAwN0MsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDYsIDB4MDAwOCwgMHgwMDBCLCAweDAwMEUsCisgICAgMHgwMDExLCAweDAwMTQsIDB4MDAxNiwgMHgwMDE5LCAweDAwMUMsIDB4MDAxRSwgMHgwMDIxLCAweDAwMjMsCisgICAgMHgwMDI2LCAweDAwMjgsIDB4MDAyQiwgMHgwMDJELCAweDAwMkYsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzYsCisgICAgMHgwMDM4LCAweDAwMzcsIDB4MDAzNCwgMHgwMDMyLCAweDAwMzAsIDB4MDAyRSwgMHgwMDJDLCAweDAwMjksCisgICAgMHgwMDI3LCAweDAwMjQsIDB4MDAyMiwgMHgwMDFGLCAweDAwMUQsIDB4MDAxQSwgMHgwMDE3LCAweDAwMTUsCisgICAgMHgwMDEyLCAweDAwMEYsIDB4MDAwQywgMHgwMDA5LCAweDAwMDcsIDB4MDAwMywgMHgwMDAxLCAweDAwN0QsCisgICAgMHgwMDdCLCAweDAwNzgsIDB4MDA3NCwgMHgwMDcyLCAweDAwNTQsIDB4MDA0MSwgMHgwMDM2LCAweDAwMjcsCisgICAgMHgwMDFCLCAweDAwMTQsIDB4MDAwQSwgMHgwMEZFLCAweDAwRjMsIDB4MDBFQiwgMHgwMEQ1LCAweDAwOTUsCisgICAgMHgwMDZFLCAweDAwNDIsIDB4MDAyQiwgMHgwMDEwLCAweDAxRjksIDB4MDFEQSwgMHgwMTU3LCAweDAxNTQsCisgICAgMHgwMEMwLCAweDAwODEsIDB4MDAyMiwgMHgwM0I3LCAweDAzQjAsIDB4MDFCRCwgMHgwMTBELCAweDAwNDcsCisgICAgMHgwN0Y4LCAweDA1NTQsIDB4MDMwNiwgMHgwRkYzLCAweDBFQzQsIDB4MDYwOSwgMHgxRDhBLCAweDE1NTQsCisgICAgMHg3NjJELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19nWzEyOV0gPSB7CisgICAgMHgxRTIwLCAweDFFNUUsIDB4MDMxQywgMHgwNTFBLCAweDA3MTgsIDB4MDkxNiwgMHgwQjE0LCAweDBEMTIsCisgICAgMHgwRjExLCAweDAwOTAsIDB4MDE4RiwgMHgwMjhFLCAweDAzOEQsIDB4MDQ4QywgMHgwNThCLCAweDA2OEEsCisgICAgMHgwNzg5LCAweDAwNDksIDB4MDBDOCwgMHgwMTQ4LCAweDAxQzcsIDB4MDI0NywgMHgwMkM2LCAweDAzNDYsCisgICAgMHgwM0M1LCAweDAwMjUsIDB4MDA2NSwgMHgwMEE1LCAweDAwRTQsIDB4MDEyNCwgMHgwMTY0LCAweDAxQTQsCisgICAgMHgwMUUzLCAweDAwMTMsIDB4MDAzMywgMHgwMDUzLCAweDAwNzMsIDB4MDA5MywgMHgwMEIzLCAweDAwRDMsCisgICAgMHgwMEYzLCAweDAwMEEsIDB4MDAxQSwgMHgwMDJBLCAweDAwM0EsIDB4MDA0QSwgMHgwMDVBLCAweDAwNkEsCisgICAgMHgwMDdBLCAweDAwMDYsIDB4MDAwRSwgMHgwMDE2LCAweDAwMUUsIDB4MDAyNiwgMHgwMDJFLCAweDAwMzYsCisgICAgMHgwMDNFLCAweDAwMDQsIDB4MDAwOCwgMHgwMDBDLCAweDAwMTAsIDB4MDAxNCwgMHgwMDE4LCAweDAwMUMsCisgICAgMHgwMDAwLCAweDAwMUQsIDB4MDAxOSwgMHgwMDE1LCAweDAwMTEsIDB4MDAwRCwgMHgwMDA5LCAweDAwMDUsCisgICAgMHgwMDNGLCAweDAwMzcsIDB4MDAyRiwgMHgwMDI3LCAweDAwMUYsIDB4MDAxNywgMHgwMDBGLCAweDAwMDcsCisgICAgMHgwMDdCLCAweDAwNkIsIDB4MDA1QiwgMHgwMDRCLCAweDAwM0IsIDB4MDAyQiwgMHgwMDFCLCAweDAwMEIsCisgICAgMHgwMDA4LCAweDAwRjAsIDB4MDBEMCwgMHgwMEIwLCAweDAwOTAsIDB4MDA3MCwgMHgwMDUwLCAweDAwMzAsCisgICAgMHgwMUU0LCAweDAxQTUsIDB4MDE2NSwgMHgwMTI1LCAweDAwRTUsIDB4MDBFMiwgMHgwMEEyLCAweDAwNjIsCisgICAgMHgwM0NBLCAweDAzNDcsIDB4MDJDNywgMHgwMkM0LCAweDAyNDQsIDB4MDE0OSwgMHgwMEM5LCAweDAwQzYsCisgICAgMHgwNzk2LCAweDA2OEIsIDB4MDY4OCwgMHgwNDhELCAweDA0OEEsIDB4MDI4RiwgMHgwMjhDLCAweDAwOTEsCisgICAgMHgwRjJFLCAweDBEMTMsIDB4MEIxNSwgMHgwOTE3LCAweDA3MTksIDB4MDUxQiwgMHgwMzFELCAweDFFNUYsCisgICAgMHgxRTIxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfYVsxMjldID0geworICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIDcsICA3LAorICAgICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDUsICA0LAorICAgICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LAorICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfYlsxMjldID0geworICAgIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LAorICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA2LAorICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDUsICA1LAorICAgICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAorICAgICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LAorICAgICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLAorICAgIDE0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfY1sxMjldID0geworICAgIDEzLCAxMiwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LAorICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDYsICA2LAorICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAorICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAorICAgICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAorICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLAorICAgIDEzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfZFsxMjldID0geworICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLAorICAgIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LAorICAgICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LAorICAgICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LAorICAgICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLAorICAgIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfZVsxMjldID0geworICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEyLAorICAgIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA5LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LAorICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDUsICA1LAorICAgICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAorICAgICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfZlsxMjldID0geworICAgIDE1LCAxNCwgMTMsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA5LAorICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LAorICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAorICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAorICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAorICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAorICAgICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LAorICAgICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLAorICAgIDE1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfZ1sxMjldID0geworICAgIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAorICAgICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAorICAgICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAorICAgICA0LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAorICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLAorICAgIDEzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2Nfc2l6ZXNbMTBdID0geworICAgIDMsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA2NSwgMTI5Cit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGJpdGFsbG9jX29mZnNldHNbMTBdID0geworICAgIC0xLCAtMiwgLTMsIC00LCAtNiwgLTgsIC0xMiwgLTE2LCAtMzIsIC02NAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfbWF4Yml0c1sxMF1bN10gPSB7CisgICAgeyAyIH0sCisgICAgeyA0LCAzLCAzIH0sCisgICAgeyA1LCA1LCA0IH0sCisgICAgeyA2LCA1LCA2IH0sCisgICAgeyA3LCA2LCA1IH0sCisgICAgeyA5LCA4LCA3LCA5LCA4LCA4LCA4IH0sCisgICAgeyA5LCA5LCA4LCA5LCA4LCA5LCA5IH0sCisgICAgeyA5LCA5LCA5LCA5LCA5LCA5LCA5IH0sCisgICAgeyA5LCA5LCA5LCA5LCA5LCA5LCA5IH0sCisgICAgeyA5LCA5LCA5LCA5LCA5LCA5LCA5IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCAqY29uc3QgYml0YWxsb2NfY29kZXNbMTBdWzhdID0geworICAgIHsgYml0YWxsb2NfM19jb2RlcywgICAgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzVfY29kZXNfYSwgICBiaXRhbGxvY181X2NvZGVzX2IsICAgYml0YWxsb2NfNV9jb2Rlc19jLCAgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzdfY29kZXNfYSwgICBiaXRhbGxvY183X2NvZGVzX2IsICAgYml0YWxsb2NfN19jb2Rlc19jLCAgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzlfY29kZXNfYSwgICBiaXRhbGxvY185X2NvZGVzX2IsICAgYml0YWxsb2NfOV9jb2Rlc19jLCAgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzEzX2NvZGVzX2EsICBiaXRhbGxvY18xM19jb2Rlc19iLCAgYml0YWxsb2NfMTNfY29kZXNfYywgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzE3X2NvZGVzX2EsICBiaXRhbGxvY18xN19jb2Rlc19iLCAgYml0YWxsb2NfMTdfY29kZXNfYywgIGJpdGFsbG9jXzE3X2NvZGVzX2QsCisgICAgICBiaXRhbGxvY18xN19jb2Rlc19lLCAgYml0YWxsb2NfMTdfY29kZXNfZiwgIGJpdGFsbG9jXzE3X2NvZGVzX2csICBOVUxMIH0sCisgICAgeyBiaXRhbGxvY18yNV9jb2Rlc19hLCAgYml0YWxsb2NfMjVfY29kZXNfYiwgIGJpdGFsbG9jXzI1X2NvZGVzX2MsICBiaXRhbGxvY18yNV9jb2Rlc19kLAorICAgICAgYml0YWxsb2NfMjVfY29kZXNfZSwgIGJpdGFsbG9jXzI1X2NvZGVzX2YsICBiaXRhbGxvY18yNV9jb2Rlc19nLCAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfMzNfY29kZXNfYSwgIGJpdGFsbG9jXzMzX2NvZGVzX2IsICBiaXRhbGxvY18zM19jb2Rlc19jLCAgYml0YWxsb2NfMzNfY29kZXNfZCwKKyAgICAgIGJpdGFsbG9jXzMzX2NvZGVzX2UsICBiaXRhbGxvY18zM19jb2Rlc19mLCAgYml0YWxsb2NfMzNfY29kZXNfZywgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzY1X2NvZGVzX2EsICBiaXRhbGxvY182NV9jb2Rlc19iLCAgYml0YWxsb2NfNjVfY29kZXNfYywgIGJpdGFsbG9jXzY1X2NvZGVzX2QsCisgICAgICBiaXRhbGxvY182NV9jb2Rlc19lLCAgYml0YWxsb2NfNjVfY29kZXNfZiwgIGJpdGFsbG9jXzY1X2NvZGVzX2csICBOVUxMIH0sCisgICAgeyBiaXRhbGxvY18xMjlfY29kZXNfYSwgYml0YWxsb2NfMTI5X2NvZGVzX2IsIGJpdGFsbG9jXzEyOV9jb2Rlc19jLCBiaXRhbGxvY18xMjlfY29kZXNfZCwKKyAgICAgIGJpdGFsbG9jXzEyOV9jb2Rlc19lLCBiaXRhbGxvY18xMjlfY29kZXNfZiwgYml0YWxsb2NfMTI5X2NvZGVzX2csIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJpdGFsbG9jX2JpdHNbMTBdWzhdID0geworICAgIHsgYml0YWxsb2NfM19iaXRzLCAgICAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfNV9iaXRzX2EsICAgYml0YWxsb2NfNV9iaXRzX2IsICAgYml0YWxsb2NfNV9iaXRzX2MsICAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfN19iaXRzX2EsICAgYml0YWxsb2NfN19iaXRzX2IsICAgYml0YWxsb2NfN19iaXRzX2MsICAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfOV9iaXRzX2EsICAgYml0YWxsb2NfOV9iaXRzX2IsICAgYml0YWxsb2NfOV9iaXRzX2MsICAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfMTNfYml0c19hLCAgYml0YWxsb2NfMTNfYml0c19iLCAgYml0YWxsb2NfMTNfYml0c19jLCAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfMTdfYml0c19hLCAgYml0YWxsb2NfMTdfYml0c19iLCAgYml0YWxsb2NfMTdfYml0c19jLCAgYml0YWxsb2NfMTdfYml0c19kLAorICAgICAgYml0YWxsb2NfMTdfYml0c19lLCAgYml0YWxsb2NfMTdfYml0c19mLCAgYml0YWxsb2NfMTdfYml0c19nLCAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfMjVfYml0c19hLCAgYml0YWxsb2NfMjVfYml0c19iLCAgYml0YWxsb2NfMjVfYml0c19jLCAgYml0YWxsb2NfMjVfYml0c19kLAorICAgICAgYml0YWxsb2NfMjVfYml0c19lLCAgYml0YWxsb2NfMjVfYml0c19mLCAgYml0YWxsb2NfMjVfYml0c19nLCAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfMzNfYml0c19hLCAgYml0YWxsb2NfMzNfYml0c19iLCAgYml0YWxsb2NfMzNfYml0c19jLCAgYml0YWxsb2NfMzNfYml0c19kLAorICAgICAgYml0YWxsb2NfMzNfYml0c19lLCAgYml0YWxsb2NfMzNfYml0c19mLCAgYml0YWxsb2NfMzNfYml0c19nLCAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfNjVfYml0c19hLCAgYml0YWxsb2NfNjVfYml0c19iLCAgYml0YWxsb2NfNjVfYml0c19jLCAgYml0YWxsb2NfNjVfYml0c19kLAorICAgICAgYml0YWxsb2NfNjVfYml0c19lLCAgYml0YWxsb2NfNjVfYml0c19mLCAgYml0YWxsb2NfNjVfYml0c19nLCAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfMTI5X2JpdHNfYSwgYml0YWxsb2NfMTI5X2JpdHNfYiwgYml0YWxsb2NfMTI5X2JpdHNfYywgYml0YWxsb2NfMTI5X2JpdHNfZCwKKyAgICAgIGJpdGFsbG9jXzEyOV9iaXRzX2UsIGJpdGFsbG9jXzEyOV9iaXRzX2YsIGJpdGFsbG9jXzEyOV9iaXRzX2csIE5VTEwgfQorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfRENBSFVGRl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kY3QtdGVzdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGN0LXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGVjYTNlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGN0LXRlc3QuYwpAQCAtMCwwICsxLDUxOCBAQAorLyoKKyAqIChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogICAgIDIwMDcgTWFyYyBIb2ZmbWFuIDxtYXJjLmhvZmZtYW5AYW5hbG9nLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRENUIHRlc3QgKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBTdGFydGVkIGZyb20gc2FtcGxlIGNvZGUgYnkgSnVhbiBKLiBTaWVycmFsdGEgUC4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorCisjaW5jbHVkZSAiZGN0LmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgInNpbXBsZV9pZGN0LmgiCisjaW5jbHVkZSAieHZpZGlkY3QuaCIKKyNpbmNsdWRlICJhYW5kY3R0YWIuaCIKKyNpbmNsdWRlICJmYWFuZGN0LmgiCisjaW5jbHVkZSAiZmFhbmlkY3QuaCIKKyNpbmNsdWRlICJkY3RyZWYuaCIKKworc3RydWN0IGFsZ28geworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgdm9pZCAoKmZ1bmMpKGludDE2X3QgKmJsb2NrKTsKKyAgICBlbnVtIGlkY3RfcGVybXV0YXRpb25fdHlwZSBwZXJtX3R5cGU7CisgICAgaW50IGNwdV9mbGFnOworICAgIGludCBub25zcGVjOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGZkY3RfdGFiW10gPSB7CisgICAgeyAiUkVGLURCTCIsICAgICBmZl9yZWZfZmRjdCwgICAgICAgICAgRkZfSURDVF9QRVJNX05PTkUgfSwKKyAgICB7ICJJSkctQUFOLUlOVCIsIGZmX2ZkY3RfaWZhc3QsICAgICAgICBGRl9JRENUX1BFUk1fTk9ORSB9LAorICAgIHsgIklKRy1MTE0tSU5UIiwgZmZfanBlZ19mZGN0X2lzbG93XzgsIEZGX0lEQ1RfUEVSTV9OT05FIH0sCisjaWYgQ09ORklHX0ZBQU5EQ1QKKyAgICB7ICJGQUFOIiwgICAgICAgIGZmX2ZhYW5kY3QsICAgICAgICAgICBGRl9JRENUX1BFUk1fTk9ORSB9LAorI2VuZGlmIC8qIENPTkZJR19GQUFORENUICovCit9OworCitzdGF0aWMgdm9pZCBmZl9wcm9yZXNfaWRjdF93cmFwKGludDE2X3QgKmRzdCl7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzdGF0aWMgaW50MTZfdCwgcW1hdClbNjRdOworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTw2NDsgaSsrKXsKKyAgICAgICAgcW1hdFtpXT00OworICAgIH0KKyAgICBmZl9wcm9yZXNfaWRjdChkc3QsIHFtYXQpOworICAgIGZvcihpPTA7IGk8NjQ7IGkrKykgeworICAgICAgICAgZHN0W2ldIC09IDUxMjsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnbyBpZGN0X3RhYltdID0geworICAgIHsgIlJFRi1EQkwiLCAgICAgZmZfcmVmX2lkY3QsICAgICAgICAgIEZGX0lEQ1RfUEVSTV9OT05FIH0sCisgICAgeyAiSU5UIiwgICAgICAgICBmZl9qX3Jldl9kY3QsICAgICAgICAgRkZfSURDVF9QRVJNX0xJQk1QRUcyIH0sCisgICAgeyAiU0lNUExFLUMiLCAgICBmZl9zaW1wbGVfaWRjdF84LCAgICAgRkZfSURDVF9QRVJNX05PTkUgfSwKKyAgICB7ICJQUi1DIiwgICAgICAgIGZmX3Byb3Jlc19pZGN0X3dyYXAsICBGRl9JRENUX1BFUk1fTk9ORSwgMCwgMSB9LAorI2lmIENPTkZJR19GQUFOSURDVAorICAgIHsgIkZBQU5JIiwgICAgICAgZmZfZmFhbmlkY3QsICAgICAgICAgIEZGX0lEQ1RfUEVSTV9OT05FIH0sCisjZW5kaWYgLyogQ09ORklHX0ZBQU5JRENUICovCisjaWYgQ09ORklHX01QRUc0X0RFQ09ERVIKKyAgICB7ICJYVklEIiwgICAgICAgIGZmX3h2aWRfaWRjdCwgICAgICAgICBGRl9JRENUX1BFUk1fTk9ORSwgMCwgMSB9LAorI2VuZGlmIC8qIENPTkZJR19NUEVHNF9ERUNPREVSICovCit9OworCisjaWYgQVJDSF9BUk0KKyNpbmNsdWRlICJhcm0vZGN0LXRlc3QuYyIKKyNlbGlmIEFSQ0hfUFBDCisjaW5jbHVkZSAicHBjL2RjdC10ZXN0LmMiCisjZWxpZiBBUkNIX1g4NgorI2luY2x1ZGUgIng4Ni9kY3QtdGVzdC5jIgorI2Vsc2UKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnbyBmZGN0X3RhYl9hcmNoW10gPSB7IHsgMCB9IH07CitzdGF0aWMgY29uc3Qgc3RydWN0IGFsZ28gaWRjdF90YWJfYXJjaFtdID0geyB7IDAgfSB9OworI2VuZGlmCisKKyNkZWZpbmUgQUFOU0NBTEVfQklUUyAxMgorCisjZGVmaW5lIE5CX0lUUyAyMDAwMAorI2RlZmluZSBOQl9JVFNfU1BFRUQgNTAwMDAKKworREVDTEFSRV9BTElHTkVEKDE2LCBzdGF0aWMgaW50MTZfdCwgYmxvY2spWzY0XTsKK0RFQ0xBUkVfQUxJR05FRCg4LCAgc3RhdGljIGludDE2X3QsIGJsb2NrMSlbNjRdOworCitzdGF0aWMgdm9pZCBpbml0X2Jsb2NrKGludDE2X3QgYmxvY2tbNjRdLCBpbnQgdGVzdCwgaW50IGlzX2lkY3QsIEFWTEZHICpwcm5nLCBpbnQgdmFscykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIG1lbXNldChibG9jaywgMCwgNjQgKiBzaXplb2YoKmJsb2NrKSk7CisKKyAgICBzd2l0Y2ggKHRlc3QpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgYmxvY2tbaV0gPSAoYXZfbGZnX2dldChwcm5nKSAlICgyKnZhbHMpKSAtdmFsczsKKyAgICAgICAgaWYgKGlzX2lkY3QpIHsKKyAgICAgICAgICAgIGZmX3JlZl9mZGN0KGJsb2NrKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgICAgIGJsb2NrW2ldID4+PSAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaiA9IGF2X2xmZ19nZXQocHJuZykgJSAxMCArIDE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgICAgIGludCBpZHggPSBhdl9sZmdfZ2V0KHBybmcpICUgNjQ7CisgICAgICAgICAgICBibG9ja1tpZHhdID0gYXZfbGZnX2dldChwcm5nKSAlICgyKnZhbHMpIC12YWxzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgYmxvY2tbIDBdID0gYXZfbGZnX2dldChwcm5nKSAlICgxNip2YWxzKSAtICg4KnZhbHMpOworICAgICAgICBibG9ja1s2M10gPSAoYmxvY2tbMF0gJiAxKSBeIDE7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcGVybXV0ZShpbnQxNl90IGRzdFs2NF0sIGNvbnN0IGludDE2X3Qgc3JjWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgZW51bSBpZGN0X3Blcm11dGF0aW9uX3R5cGUgcGVybV90eXBlKQoreworICAgIGludCBpOworCisjaWYgQVJDSF9YODYKKyAgICBpZiAocGVybXV0ZV94ODYoZHN0LCBzcmMsIHBlcm1fdHlwZSkpCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCisgICAgc3dpdGNoIChwZXJtX3R5cGUpIHsKKyAgICBjYXNlIEZGX0lEQ1RfUEVSTV9MSUJNUEVHMjoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICBkc3RbKGkgJiAweDM4KSB8ICgoaSAmIDYpID4+IDEpIHwgKChpICYgMSkgPDwgMildID0gc3JjW2ldOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZGX0lEQ1RfUEVSTV9QQVJUVFJBTlM6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgZHN0WyhpICYgMHgyNCkgfCAoKGkgJiAzKSA8PCAzKSB8ICgoaSA+PiAzKSAmIDMpXSA9IHNyY1tpXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9JRENUX1BFUk1fVFJBTlNQT1NFOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGRzdFsoaT4+MykgfCAoKGk8PDMpJjB4MzgpXSA9IHNyY1tpXTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICBkc3RbaV0gPSBzcmNbaV07CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGludCBkY3RfZXJyb3IoY29uc3Qgc3RydWN0IGFsZ28gKmRjdCwgaW50IHRlc3QsIGludCBpc19pZGN0LCBpbnQgc3BlZWQsIGNvbnN0IGludCBiaXRzKQoreworICAgIHZvaWQgKCpyZWYpKGludDE2X3QgKmJsb2NrKSA9IGlzX2lkY3QgPyBmZl9yZWZfaWRjdCA6IGZmX3JlZl9mZGN0OworICAgIGludCBpdCwgaSwgc2NhbGU7CisgICAgaW50IGVycl9pbmYsIHY7CisgICAgaW50NjRfdCBlcnIyLCB0aSwgdGkxLCBpdDEsIGVycl9zdW0gPSAwOworICAgIGludDY0X3Qgc3lzRXJyWzY0XSwgc3lzRXJyTWF4ID0gMDsKKyAgICBpbnQgbWF4b3V0ID0gMDsKKyAgICBpbnQgYmxvY2tTdW1FcnJNYXggPSAwLCBibG9ja1N1bUVycjsKKyAgICBBVkxGRyBwcm5nOworICAgIGNvbnN0IGludCB2YWxzPTE8PGJpdHM7CisgICAgZG91YmxlIG9tc2UsIG9tZTsKKyAgICBpbnQgc3BlY19lcnI7CisKKyAgICBhdl9sZmdfaW5pdCgmcHJuZywgMSk7CisKKyAgICBlcnJfaW5mID0gMDsKKyAgICBlcnIyID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgc3lzRXJyW2ldID0gMDsKKyAgICBmb3IgKGl0ID0gMDsgaXQgPCBOQl9JVFM7IGl0KyspIHsKKyAgICAgICAgaW5pdF9ibG9jayhibG9jazEsIHRlc3QsIGlzX2lkY3QsICZwcm5nLCB2YWxzKTsKKyAgICAgICAgcGVybXV0ZShibG9jaywgYmxvY2sxLCBkY3QtPnBlcm1fdHlwZSk7CisKKyAgICAgICAgZGN0LT5mdW5jKGJsb2NrKTsKKyAgICAgICAgZW1tc19jKCk7CisKKyAgICAgICAgaWYgKCFzdHJjbXAoZGN0LT5uYW1lLCAiSUpHLUFBTi1JTlQiKSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBzY2FsZSA9IDggKiAoMSA8PCAoQUFOU0NBTEVfQklUUyArIDExKSkgLyBmZl9hYW5zY2FsZXNbaV07CisgICAgICAgICAgICAgICAgYmxvY2tbaV0gPSAoYmxvY2tbaV0gKiBzY2FsZSkgPj4gQUFOU0NBTEVfQklUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlZihibG9jazEpOworICAgICAgICBpZiAoIXN0cmNtcChkY3QtPm5hbWUsICJQUi1TU0UyIikpCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgICAgICBibG9jazFbaV0gPSBhdl9jbGlwKGJsb2NrMVtpXSwgNC01MTIsIDEwMTktNTEyKTsKKworICAgICAgICBibG9ja1N1bUVyciA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgZXJyID0gYmxvY2tbaV0gLSBibG9jazFbaV07CisgICAgICAgICAgICBlcnJfc3VtICs9IGVycjsKKyAgICAgICAgICAgIHYgPSBhYnMoZXJyKTsKKyAgICAgICAgICAgIGlmICh2ID4gZXJyX2luZikKKyAgICAgICAgICAgICAgICBlcnJfaW5mID0gdjsKKyAgICAgICAgICAgIGVycjIgKz0gdiAqIHY7CisgICAgICAgICAgICBzeXNFcnJbaV0gKz0gYmxvY2tbaV0gLSBibG9jazFbaV07CisgICAgICAgICAgICBibG9ja1N1bUVyciArPSB2OworICAgICAgICAgICAgaWYgKGFicyhibG9ja1tpXSkgPiBtYXhvdXQpCisgICAgICAgICAgICAgICAgbWF4b3V0ID0gYWJzKGJsb2NrW2ldKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmxvY2tTdW1FcnJNYXggPCBibG9ja1N1bUVycikKKyAgICAgICAgICAgIGJsb2NrU3VtRXJyTWF4ID0gYmxvY2tTdW1FcnI7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICBzeXNFcnJNYXggPSBGRk1BWChzeXNFcnJNYXgsIEZGQUJTKHN5c0VycltpXSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgaWYgKGkgJSA4ID09IDApCisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIHByaW50ZigiJTdkICIsIChpbnQpIHN5c0VycltpXSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKworICAgIG9tc2UgPSAoZG91YmxlKSBlcnIyIC8gTkJfSVRTIC8gNjQ7CisgICAgb21lICA9IChkb3VibGUpIGVycl9zdW0gLyBOQl9JVFMgLyA2NDsKKworICAgIHNwZWNfZXJyID0gaXNfaWRjdCAmJiAoZXJyX2luZiA+IDEgfHwgb21zZSA+IDAuMDIgfHwgZmFicyhvbWUpID4gMC4wMDE1KTsKKworICAgIHByaW50ZigiJXMgJXM6IG1heF9lcnI9JWQgb21zZT0lMC44ZiBvbWU9JTAuOGYgc3lzZXJyPSUwLjhmIG1heG91dD0lZCBibG9ja1N1bUVycj0lZFxuIiwKKyAgICAgICAgICAgaXNfaWRjdCA/ICJJRENUIiA6ICJEQ1QiLCBkY3QtPm5hbWUsIGVycl9pbmYsCisgICAgICAgICAgIG9tc2UsIG9tZSwgKGRvdWJsZSkgc3lzRXJyTWF4IC8gTkJfSVRTLAorICAgICAgICAgICBtYXhvdXQsIGJsb2NrU3VtRXJyTWF4KTsKKworICAgIGlmIChzcGVjX2VyciAmJiAhZGN0LT5ub25zcGVjKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGlmICghc3BlZWQpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogc3BlZWQgdGVzdCAqLworCisgICAgaW5pdF9ibG9jayhibG9jaywgdGVzdCwgaXNfaWRjdCwgJnBybmcsIHZhbHMpOworICAgIHBlcm11dGUoYmxvY2sxLCBibG9jaywgZGN0LT5wZXJtX3R5cGUpOworCisgICAgdGkgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7CisgICAgaXQxID0gMDsKKyAgICBkbyB7CisgICAgICAgIGZvciAoaXQgPSAwOyBpdCA8IE5CX0lUU19TUEVFRDsgaXQrKykgeworICAgICAgICAgICAgbWVtY3B5KGJsb2NrLCBibG9jazEsIHNpemVvZihibG9jaykpOworICAgICAgICAgICAgZGN0LT5mdW5jKGJsb2NrKTsKKyAgICAgICAgfQorICAgICAgICBlbW1zX2MoKTsKKyAgICAgICAgaXQxICs9IE5CX0lUU19TUEVFRDsKKyAgICAgICAgdGkxID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gdGk7CisgICAgfSB3aGlsZSAodGkxIDwgMTAwMDAwMCk7CisKKyAgICBwcmludGYoIiVzICVzOiAlMC4xZiBrZGN0L3NcbiIsIGlzX2lkY3QgPyAiSURDVCIgOiAiRENUIiwgZGN0LT5uYW1lLAorICAgICAgICAgICAoZG91YmxlKSBpdDEgKiAxMDAwLjAgLyAoZG91YmxlKSB0aTEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0RFQ0xBUkVfQUxJR05FRCg4LCBzdGF0aWMgdWludDhfdCwgaW1nX2Rlc3QpWzY0XTsKK0RFQ0xBUkVfQUxJR05FRCg4LCBzdGF0aWMgdWludDhfdCwgaW1nX2Rlc3QxKVs2NF07CisKK3N0YXRpYyB2b2lkIGlkY3QyNDhfcmVmKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgc3RhdGljIGludCBpbml0OworICAgIHN0YXRpYyBkb3VibGUgYzhbOF1bOF07CisgICAgc3RhdGljIGRvdWJsZSBjNFs0XVs0XTsKKyAgICBkb3VibGUgYmxvY2sxWzY0XSwgYmxvY2syWzY0XSwgYmxvY2szWzY0XTsKKyAgICBkb3VibGUgcywgc3VtLCB2OworICAgIGludCBpLCBqLCBrOworCisgICAgaWYgKCFpbml0KSB7CisgICAgICAgIGluaXQgPSAxOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIHN1bSA9IDA7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgICAgICAgICAgcyA9IChpID09IDApID8gc3FydCgxLjAgLyA4LjApIDogc3FydCgxLjAgLyA0LjApOworICAgICAgICAgICAgICAgIGM4W2ldW2pdID0gcyAqIGNvcyhNX1BJICogaSAqIChqICsgMC41KSAvIDguMCk7CisgICAgICAgICAgICAgICAgc3VtICs9IGM4W2ldW2pdICogYzhbaV1bal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgIHMgPSAoaSA9PSAwKSA/IHNxcnQoMS4wIC8gNC4wKSA6IHNxcnQoMS4wIC8gMi4wKTsKKyAgICAgICAgICAgICAgICBjNFtpXVtqXSA9IHMgKiBjb3MoTV9QSSAqIGkgKiAoaiArIDAuNSkgLyA0LjApOworICAgICAgICAgICAgICAgIHN1bSArPSBjNFtpXVtqXSAqIGM0W2ldW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogYnV0dGVyZmx5ICovCisgICAgcyA9IDAuNSAqIHNxcnQoMi4wKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICAgIGJsb2NrMVs4ICogKDIgKiBpKSArIGpdID0KKyAgICAgICAgICAgICAgICAoYmxvY2tbOCAqICgyICogaSkgKyBqXSArIGJsb2NrWzggKiAoMiAqIGkgKyAxKSArIGpdKSAqIHM7CisgICAgICAgICAgICBibG9jazFbOCAqICgyICogaSArIDEpICsgal0gPQorICAgICAgICAgICAgICAgIChibG9ja1s4ICogKDIgKiBpKSArIGpdIC0gYmxvY2tbOCAqICgyICogaSArIDEpICsgal0pICogczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlkY3Q4IG9uIGxpbmVzICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgICAgICBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykKKyAgICAgICAgICAgICAgICBzdW0gKz0gYzhba11bal0gKiBibG9jazFbOCAqIGkgKyBrXTsKKyAgICAgICAgICAgIGJsb2NrMls4ICogaSArIGpdID0gc3VtOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWRjdDQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgIC8qIHRvcCAqLworICAgICAgICAgICAgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCisgICAgICAgICAgICAgICAgc3VtICs9IGM0W2tdW2pdICogYmxvY2syWzggKiAoMiAqIGspICsgaV07CisgICAgICAgICAgICBibG9jazNbOCAqICgyICogaikgKyBpXSA9IHN1bTsKKworICAgICAgICAgICAgLyogYm90dG9tICovCisgICAgICAgICAgICBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKyAgICAgICAgICAgICAgICBzdW0gKz0gYzRba11bal0gKiBibG9jazJbOCAqICgyICogayArIDEpICsgaV07CisgICAgICAgICAgICBibG9jazNbOCAqICgyICogaiArIDEpICsgaV0gPSBzdW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjbGFtcCBhbmQgc3RvcmUgdGhlIHJlc3VsdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgICAgICAgdiA9IGJsb2NrM1s4ICogaSArIGpdOworICAgICAgICAgICAgaWYgICAgICAodiA8IDApICAgdiA9IDA7CisgICAgICAgICAgICBlbHNlIGlmICh2ID4gMjU1KSB2ID0gMjU1OworICAgICAgICAgICAgZGVzdFtpICogbGluZXNpemUgKyBqXSA9IChpbnQpIHJpbnQodik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGlkY3QyNDhfZXJyb3IoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmlkY3QyNDhfcHV0KSh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwZWVkKQoreworICAgIGludCBpdCwgaSwgaXQxLCB0aSwgdGkxLCBlcnJfbWF4LCB2OworICAgIEFWTEZHIHBybmc7CisKKyAgICBhdl9sZmdfaW5pdCgmcHJuZywgMSk7CisKKyAgICAvKiBqdXN0IG9uZSB0ZXN0IHRvIHNlZSBpZiBjb2RlIGlzIGNvcnJlY3QgKHByZWNpc2lvbiBpcyBsZXNzCisgICAgICAgaW1wb3J0YW50IGhlcmUpICovCisgICAgZXJyX21heCA9IDA7CisgICAgZm9yIChpdCA9IDA7IGl0IDwgTkJfSVRTOyBpdCsrKSB7CisgICAgICAgIC8qIFhYWDogdXNlIGZvcndhcmQgdHJhbnNmb3JtIHRvIGdlbmVyYXRlIHZhbHVlcyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGJsb2NrMVtpXSA9IGF2X2xmZ19nZXQoJnBybmcpICUgMjU2IC0gMTI4OworICAgICAgICBibG9jazFbMF0gKz0gMTAyNDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGJsb2NrW2ldID0gYmxvY2sxW2ldOworICAgICAgICBpZGN0MjQ4X3JlZihpbWdfZGVzdDEsIDgsIGJsb2NrKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGJsb2NrW2ldID0gYmxvY2sxW2ldOworICAgICAgICBpZGN0MjQ4X3B1dChpbWdfZGVzdCwgOCwgYmxvY2spOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICB2ID0gYWJzKChpbnQpIGltZ19kZXN0W2ldIC0gKGludCkgaW1nX2Rlc3QxW2ldKTsKKyAgICAgICAgICAgIGlmICh2ID09IDI1NSkKKyAgICAgICAgICAgICAgICBwcmludGYoIiVkICVkXG4iLCBpbWdfZGVzdFtpXSwgaW1nX2Rlc3QxW2ldKTsKKyAgICAgICAgICAgIGlmICh2ID4gZXJyX21heCkKKyAgICAgICAgICAgICAgICBlcnJfbWF4ID0gdjsKKyAgICAgICAgfQorI2lmIDAKKyAgICAgICAgcHJpbnRmKCJyZWY9XG4iKTsKKyAgICAgICAgZm9yKGk9MDtpPDg7aSsrKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGZvcihqPTA7ajw4O2orKykgeworICAgICAgICAgICAgICAgIHByaW50ZigiICUzZCIsIGltZ19kZXN0MVtpKjgral0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCJvdXQ9XG4iKTsKKyAgICAgICAgZm9yKGk9MDtpPDg7aSsrKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGZvcihqPTA7ajw4O2orKykgeworICAgICAgICAgICAgICAgIHByaW50ZigiICUzZCIsIGltZ19kZXN0W2kqOCtqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBwcmludGYoIiVzICVzOiBlcnJfaW5mPSVkXG4iLCAxID8gIklEQ1QyNDgiIDogIkRDVDI0OCIsIG5hbWUsIGVycl9tYXgpOworCisgICAgaWYgKCFzcGVlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdGkgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7CisgICAgaXQxID0gMDsKKyAgICBkbyB7CisgICAgICAgIGZvciAoaXQgPSAwOyBpdCA8IE5CX0lUU19TUEVFRDsgaXQrKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICAgICAgYmxvY2tbaV0gPSBibG9jazFbaV07CisgICAgICAgICAgICBpZGN0MjQ4X3B1dChpbWdfZGVzdCwgOCwgYmxvY2spOworICAgICAgICB9CisgICAgICAgIGVtbXNfYygpOworICAgICAgICBpdDEgKz0gTkJfSVRTX1NQRUVEOworICAgICAgICB0aTEgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLSB0aTsKKyAgICB9IHdoaWxlICh0aTEgPCAxMDAwMDAwKTsKKworICAgIHByaW50ZigiJXMgJXM6ICUwLjFmIGtkY3Qvc1xuIiwgMSA/ICJJRENUMjQ4IiA6ICJEQ1QyNDgiLCBuYW1lLAorICAgICAgICAgICAoZG91YmxlKSBpdDEgKiAxMDAwLjAgLyAoZG91YmxlKSB0aTEpOworfQorCitzdGF0aWMgdm9pZCBoZWxwKHZvaWQpCit7CisgICAgcHJpbnRmKCJkY3QtdGVzdCBbLWldIFs8dGVzdC1udW1iZXI+XSBbPGJpdHM+XVxuIgorICAgICAgICAgICAidGVzdC1udW1iZXIgMCAtPiB0ZXN0IHdpdGggcmFuZG9tIG1hdHJpeGVzXG4iCisgICAgICAgICAgICIgICAgICAgICAgICAxIC0+IHRlc3Qgd2l0aCByYW5kb20gc3BhcnNlIG1hdHJpeGVzXG4iCisgICAgICAgICAgICIgICAgICAgICAgICAyIC0+IGRvIDMuIHRlc3QgZnJvbSBtcGVnNCBzdGRcbiIKKyAgICAgICAgICAgImJpdHMgICAgICAgIE51bWJlciBvZiB0aW1lIGRvbWFpbiBiaXRzIHRvIHVzZSwgOCBpcyBkZWZhdWx0XG4iCisgICAgICAgICAgICItaSAgICAgICAgICB0ZXN0IElEQ1QgaW1wbGVtZW50YXRpb25zXG4iCisgICAgICAgICAgICItNCAgICAgICAgICB0ZXN0IElEQ1QyNDggaW1wbGVtZW50YXRpb25zXG4iCisgICAgICAgICAgICItdCAgICAgICAgICBzcGVlZCB0ZXN0XG4iKTsKK30KKworI2lmICFIQVZFX0dFVE9QVAorI2luY2x1ZGUgImNvbXBhdC9nZXRvcHQuYyIKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IHRlc3RfaWRjdCA9IDAsIHRlc3RfMjQ4X2RjdCA9IDA7CisgICAgaW50IGMsIGk7CisgICAgaW50IHRlc3QgPSAxOworICAgIGludCBzcGVlZCA9IDA7CisgICAgaW50IGVyciA9IDA7CisgICAgaW50IGJpdHM9ODsKKworICAgIGZmX3JlZl9kY3RfaW5pdCgpOworCisgICAgZm9yICg7OykgeworICAgICAgICBjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJpaDR0Iik7CisgICAgICAgIGlmIChjID09IC0xKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgIHRlc3RfaWRjdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnNCc6CisgICAgICAgICAgICB0ZXN0XzI0OF9kY3QgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgc3BlZWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgaGVscCgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykKKyAgICAgICAgdGVzdCA9IGF0b2koYXJndltvcHRpbmRdKTsKKyAgICBpZihvcHRpbmQrMSA8IGFyZ2MpIGJpdHM9IGF0b2koYXJndltvcHRpbmQrMV0pOworCisgICAgcHJpbnRmKCJmZm1wZWcgRENUL0lEQ1QgdGVzdFxuIik7CisKKyAgICBpZiAodGVzdF8yNDhfZGN0KSB7CisgICAgICAgIGlkY3QyNDhfZXJyb3IoIlNJTVBMRS1DIiwgZmZfc2ltcGxlX2lkY3QyNDhfcHV0LCBzcGVlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKyAgICAgICAgaWYgKHRlc3RfaWRjdCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGlkY3RfdGFiKTsgaSsrKQorICAgICAgICAgICAgICAgIGVyciB8PSBkY3RfZXJyb3IoJmlkY3RfdGFiW2ldLCB0ZXN0LCB0ZXN0X2lkY3QsIHNwZWVkLCBiaXRzKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaWRjdF90YWJfYXJjaFtpXS5uYW1lOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKCEofmNwdV9mbGFncyAmIGlkY3RfdGFiX2FyY2hbaV0uY3B1X2ZsYWcpKQorICAgICAgICAgICAgICAgICAgICBlcnIgfD0gZGN0X2Vycm9yKCZpZGN0X3RhYl9hcmNoW2ldLCB0ZXN0LCB0ZXN0X2lkY3QsIHNwZWVkLCBiaXRzKTsKKyAgICAgICAgfQorI2lmIENPTkZJR19GRENURFNQCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGZkY3RfdGFiKTsgaSsrKQorICAgICAgICAgICAgICAgIGVyciB8PSBkY3RfZXJyb3IoJmZkY3RfdGFiW2ldLCB0ZXN0LCB0ZXN0X2lkY3QsIHNwZWVkLCBiaXRzKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgZmRjdF90YWJfYXJjaFtpXS5uYW1lOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKCEofmNwdV9mbGFncyAmIGZkY3RfdGFiX2FyY2hbaV0uY3B1X2ZsYWcpKQorICAgICAgICAgICAgICAgICAgICBlcnIgfD0gZGN0X2Vycm9yKCZmZGN0X3RhYl9hcmNoW2ldLCB0ZXN0LCB0ZXN0X2lkY3QsIHNwZWVkLCBiaXRzKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENPTkZJR19GRENURFNQICovCisgICAgfQorCisgICAgaWYgKGVycikKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogJWQuXG4iLCBlcnIpOworCisgICAgcmV0dXJuICEhZXJyOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZGN0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FiYzRmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGN0LmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiAoSSlEQ1QgVHJhbnNmb3JtcworICogQ29weXJpZ2h0IChjKSAyMDA5IFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFsZXggQ29udmVyc2UgPGFsZXguY29udmVyc2VAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDEwIFZpdG9yIFNlc3NhaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogKEludmVyc2UpIERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm1zLiBUaGVzZSBhcmUgYWxzbyBrbm93biBhcyB0aGUKKyAqIHR5cGUgSUkgYW5kIHR5cGUgSUlJIERDVHMgcmVzcGVjdGl2ZWx5LgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJkY3QuaCIKKyNpbmNsdWRlICJkY3QzMi5oIgorCisvKiBzaW4oKE1fUEkgKiB4IC8gKDIgKiBuKSkgKi8KKyNkZWZpbmUgU0lOKHMsIG4sIHgpIChzLT5jb3N0YWJbKG4pIC0gKHgpXSkKKworLyogY29zKChNX1BJICogeCAvICgyICogbikpICovCisjZGVmaW5lIENPUyhzLCBuLCB4KSAocy0+Y29zdGFiW3hdKQorCitzdGF0aWMgdm9pZCBkc3RfY2FsY19JX2MoRENUQ29udGV4dCAqY3R4LCBGRlRTYW1wbGUgKmRhdGEpCit7CisgICAgaW50IG4gPSAxIDw8IGN0eC0+bmJpdHM7CisgICAgaW50IGk7CisKKyAgICBkYXRhWzBdID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbiAvIDI7IGkrKykgeworICAgICAgICBmbG9hdCB0bXAxICAgPSBkYXRhW2kgICAgXTsKKyAgICAgICAgZmxvYXQgdG1wMiAgID0gZGF0YVtuIC0gaV07CisgICAgICAgIGZsb2F0IHMgICAgICA9IFNJTihjdHgsIG4sIDIgKiBpKTsKKworICAgICAgICBzICAgICAgICAgICAqPSB0bXAxICsgdG1wMjsKKyAgICAgICAgdG1wMSAgICAgICAgID0gKHRtcDEgLSB0bXAyKSAqIDAuNWY7CisgICAgICAgIGRhdGFbaV0gICAgICA9IHMgKyB0bXAxOworICAgICAgICBkYXRhW24gLSBpXSAgPSBzIC0gdG1wMTsKKyAgICB9CisKKyAgICBkYXRhW24gLyAyXSAqPSAyOworICAgIGN0eC0+cmRmdC5yZGZ0X2NhbGMoJmN0eC0+cmRmdCwgZGF0YSk7CisKKyAgICBkYXRhWzBdICo9IDAuNWY7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgbiAtIDI7IGkgKz0gMikgeworICAgICAgICBkYXRhW2kgKyAxXSArPSAgZGF0YVtpIC0gMV07CisgICAgICAgIGRhdGFbaV0gICAgICA9IC1kYXRhW2kgKyAyXTsKKyAgICB9CisKKyAgICBkYXRhW24gLSAxXSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGRjdF9jYWxjX0lfYyhEQ1RDb250ZXh0ICpjdHgsIEZGVFNhbXBsZSAqZGF0YSkKK3sKKyAgICBpbnQgbiA9IDEgPDwgY3R4LT5uYml0czsKKyAgICBpbnQgaTsKKyAgICBmbG9hdCBuZXh0ID0gLTAuNWYgKiAoZGF0YVswXSAtIGRhdGFbbl0pOworCisgICAgZm9yIChpID0gMDsgaSA8IG4gLyAyOyBpKyspIHsKKyAgICAgICAgZmxvYXQgdG1wMSA9IGRhdGFbaV07CisgICAgICAgIGZsb2F0IHRtcDIgPSBkYXRhW24gLSBpXTsKKyAgICAgICAgZmxvYXQgcyAgICA9IFNJTihjdHgsIG4sIDIgKiBpKTsKKyAgICAgICAgZmxvYXQgYyAgICA9IENPUyhjdHgsIG4sIDIgKiBpKTsKKworICAgICAgICBjICo9IHRtcDEgLSB0bXAyOworICAgICAgICBzICo9IHRtcDEgLSB0bXAyOworCisgICAgICAgIG5leHQgKz0gYzsKKworICAgICAgICB0bXAxICAgICAgICA9ICh0bXAxICsgdG1wMikgKiAwLjVmOworICAgICAgICBkYXRhW2ldICAgICA9IHRtcDEgLSBzOworICAgICAgICBkYXRhW24gLSBpXSA9IHRtcDEgKyBzOworICAgIH0KKworICAgIGN0eC0+cmRmdC5yZGZ0X2NhbGMoJmN0eC0+cmRmdCwgZGF0YSk7CisgICAgZGF0YVtuXSA9IGRhdGFbMV07CisgICAgZGF0YVsxXSA9IG5leHQ7CisKKyAgICBmb3IgKGkgPSAzOyBpIDw9IG47IGkgKz0gMikKKyAgICAgICAgZGF0YVtpXSA9IGRhdGFbaSAtIDJdIC0gZGF0YVtpXTsKK30KKworc3RhdGljIHZvaWQgZGN0X2NhbGNfSUlJX2MoRENUQ29udGV4dCAqY3R4LCBGRlRTYW1wbGUgKmRhdGEpCit7CisgICAgaW50IG4gPSAxIDw8IGN0eC0+bmJpdHM7CisgICAgaW50IGk7CisKKyAgICBmbG9hdCBuZXh0ICA9IGRhdGFbbiAtIDFdOworICAgIGZsb2F0IGludl9uID0gMS4wZiAvIG47CisKKyAgICBmb3IgKGkgPSBuIC0gMjsgaSA+PSAyOyBpIC09IDIpIHsKKyAgICAgICAgZmxvYXQgdmFsMSA9IGRhdGFbaV07CisgICAgICAgIGZsb2F0IHZhbDIgPSBkYXRhW2kgLSAxXSAtIGRhdGFbaSArIDFdOworICAgICAgICBmbG9hdCBjICAgID0gQ09TKGN0eCwgbiwgaSk7CisgICAgICAgIGZsb2F0IHMgICAgPSBTSU4oY3R4LCBuLCBpKTsKKworICAgICAgICBkYXRhW2ldICAgICA9IGMgKiB2YWwxICsgcyAqIHZhbDI7CisgICAgICAgIGRhdGFbaSArIDFdID0gcyAqIHZhbDEgLSBjICogdmFsMjsKKyAgICB9CisKKyAgICBkYXRhWzFdID0gMiAqIG5leHQ7CisKKyAgICBjdHgtPnJkZnQucmRmdF9jYWxjKCZjdHgtPnJkZnQsIGRhdGEpOworCisgICAgZm9yIChpID0gMDsgaSA8IG4gLyAyOyBpKyspIHsKKyAgICAgICAgZmxvYXQgdG1wMSA9IGRhdGFbaV0gICAgICAgICAqIGludl9uOworICAgICAgICBmbG9hdCB0bXAyID0gZGF0YVtuIC0gaSAtIDFdICogaW52X247CisgICAgICAgIGZsb2F0IGNzYyAgPSBjdHgtPmNzYzJbaV0gKiAodG1wMSAtIHRtcDIpOworCisgICAgICAgIHRtcDEgICAgICAgICAgICArPSB0bXAyOworICAgICAgICBkYXRhW2ldICAgICAgICAgID0gdG1wMSArIGNzYzsKKyAgICAgICAgZGF0YVtuIC0gaSAtIDFdICA9IHRtcDEgLSBjc2M7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkY3RfY2FsY19JSV9jKERDVENvbnRleHQgKmN0eCwgRkZUU2FtcGxlICpkYXRhKQoreworICAgIGludCBuID0gMSA8PCBjdHgtPm5iaXRzOworICAgIGludCBpOworICAgIGZsb2F0IG5leHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbiAvIDI7IGkrKykgeworICAgICAgICBmbG9hdCB0bXAxID0gZGF0YVtpXTsKKyAgICAgICAgZmxvYXQgdG1wMiA9IGRhdGFbbiAtIGkgLSAxXTsKKyAgICAgICAgZmxvYXQgcyAgICA9IFNJTihjdHgsIG4sIDIgKiBpICsgMSk7CisKKyAgICAgICAgcyAgICAqPSB0bXAxIC0gdG1wMjsKKyAgICAgICAgdG1wMSAgPSAodG1wMSArIHRtcDIpICogMC41ZjsKKworICAgICAgICBkYXRhW2ldICAgICA9IHRtcDEgKyBzOworICAgICAgICBkYXRhW24taS0xXSA9IHRtcDEgLSBzOworICAgIH0KKworICAgIGN0eC0+cmRmdC5yZGZ0X2NhbGMoJmN0eC0+cmRmdCwgZGF0YSk7CisKKyAgICBuZXh0ICAgICA9IGRhdGFbMV0gKiAwLjU7CisgICAgZGF0YVsxXSAqPSAtMTsKKworICAgIGZvciAoaSA9IG4gLSAyOyBpID49IDA7IGkgLT0gMikgeworICAgICAgICBmbG9hdCBpbnIgPSBkYXRhW2kgICAgXTsKKyAgICAgICAgZmxvYXQgaW5pID0gZGF0YVtpICsgMV07CisgICAgICAgIGZsb2F0IGMgICA9IENPUyhjdHgsIG4sIGkpOworICAgICAgICBmbG9hdCBzICAgPSBTSU4oY3R4LCBuLCBpKTsKKworICAgICAgICBkYXRhW2ldICAgICA9IGMgKiBpbnIgKyBzICogaW5pOworICAgICAgICBkYXRhW2kgKyAxXSA9IG5leHQ7CisKKyAgICAgICAgbmV4dCArPSBzICogaW5yIC0gYyAqIGluaTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjdDMyX2Z1bmMoRENUQ29udGV4dCAqY3R4LCBGRlRTYW1wbGUgKmRhdGEpCit7CisgICAgY3R4LT5kY3QzMihkYXRhLCBkYXRhKTsKK30KKworYXZfY29sZCBpbnQgZmZfZGN0X2luaXQoRENUQ29udGV4dCAqcywgaW50IG5iaXRzLCBlbnVtIERDVFRyYW5zZm9ybVR5cGUgaW52ZXJzZSkKK3sKKyAgICBpbnQgbiA9IDEgPDwgbmJpdHM7CisgICAgaW50IGk7CisKKyAgICBtZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CisKKyAgICBzLT5uYml0cyAgID0gbmJpdHM7CisgICAgcy0+aW52ZXJzZSA9IGludmVyc2U7CisKKyAgICBpZiAoaW52ZXJzZSA9PSBEQ1RfSUkgJiYgbmJpdHMgPT0gNSkgeworICAgICAgICBzLT5kY3RfY2FsYyA9IGRjdDMyX2Z1bmM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmZfaW5pdF9mZl9jb3NfdGFicyhuYml0cyArIDIpOworCisgICAgICAgIHMtPmNvc3RhYiA9IGZmX2Nvc190YWJzW25iaXRzICsgMl07CisgICAgICAgIHMtPmNzYzIgICA9IGF2X21hbGxvY19hcnJheShuIC8gMiwgc2l6ZW9mKEZGVFNhbXBsZSkpOworCisgICAgICAgIGlmIChmZl9yZGZ0X2luaXQoJnMtPnJkZnQsIG5iaXRzLCBpbnZlcnNlID09IERDVF9JSUkpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPmNzYzIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG4gLyAyOyBpKyspCisgICAgICAgICAgICBzLT5jc2MyW2ldID0gMC41IC8gc2luKChNX1BJIC8gKDIgKiBuKSAqICgyICogaSArIDEpKSk7CisKKyAgICAgICAgc3dpdGNoIChpbnZlcnNlKSB7CisgICAgICAgIGNhc2UgRENUX0kgIDogcy0+ZGN0X2NhbGMgPSBkY3RfY2FsY19JX2M7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgRENUX0lJIDogcy0+ZGN0X2NhbGMgPSBkY3RfY2FsY19JSV9jOyAgYnJlYWs7CisgICAgICAgIGNhc2UgRENUX0lJSTogcy0+ZGN0X2NhbGMgPSBkY3RfY2FsY19JSUlfYzsgYnJlYWs7CisgICAgICAgIGNhc2UgRFNUX0kgIDogcy0+ZGN0X2NhbGMgPSBkc3RfY2FsY19JX2M7ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5kY3QzMiA9IGZmX2RjdDMyX2Zsb2F0OworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfZGN0X2luaXRfeDg2KHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9kY3RfZW5kKERDVENvbnRleHQgKnMpCit7CisgICAgZmZfcmRmdF9lbmQoJnMtPnJkZnQpOworICAgIGF2X2ZyZWVwKCZzLT5jc2MyKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RjdC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyOTdiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RjdC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAoSSlEQ1QgVHJhbnNmb3JtcworICogQ29weXJpZ2h0IChjKSAyMDA5IFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFsZXggQ29udmVyc2UgPGFsZXguY29udmVyc2VAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDEwIFZpdG9yIFNlc3NhaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmICFkZWZpbmVkKEFWQ09ERUNfRENUX0gpICYmICghZGVmaW5lZChGRlRfRkxPQVQpIHx8IEZGVF9GTE9BVCkKKyNkZWZpbmUgQVZDT0RFQ19EQ1RfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJyZGZ0LmgiCisKK3N0cnVjdCBEQ1RDb250ZXh0IHsKKyAgICBpbnQgbmJpdHM7CisgICAgaW50IGludmVyc2U7CisgICAgUkRGVENvbnRleHQgcmRmdDsKKyAgICBjb25zdCBmbG9hdCAqY29zdGFiOworICAgIEZGVFNhbXBsZSAqY3NjMjsKKyAgICB2b2lkICgqZGN0X2NhbGMpKHN0cnVjdCBEQ1RDb250ZXh0ICpzLCBGRlRTYW1wbGUgKmRhdGEpOworICAgIHZvaWQgKCpkY3QzMikoRkZUU2FtcGxlICpvdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW4pOworfTsKKworLyoqCisgKiBTZXQgdXAgRENULgorICogQHBhcmFtIG5iaXRzICAgICAgICAgICBzaXplIG9mIHRoZSBpbnB1dCBhcnJheToKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgbmJpdHMpICAgICBmb3IgRENULUlJLCBEQ1QtSUlJIGFuZCBEU1QtSQorICogICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBuYml0cykgKyAxIGZvciBEQ1QtSQorICoKKyAqIEBub3RlIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBpbnB1dCBvZiBEU1QtSSBpcyBpZ25vcmVkCisgKi8KK2ludCAgZmZfZGN0X2luaXQoRENUQ29udGV4dCAqcywgaW50IG5iaXRzLCBlbnVtIERDVFRyYW5zZm9ybVR5cGUgdHlwZSk7Cit2b2lkIGZmX2RjdF9lbmQgKERDVENvbnRleHQgKnMpOworCit2b2lkIGZmX2RjdF9pbml0X3g4NihEQ1RDb250ZXh0ICpzKTsKKwordm9pZCBmZl9mZGN0X2lmYXN0KGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9mZGN0X2lmYXN0MjQ4KGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9qcGVnX2ZkY3RfaXNsb3dfOChpbnQxNl90ICpkYXRhKTsKK3ZvaWQgZmZfanBlZ19mZGN0X2lzbG93XzEwKGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9mZGN0MjQ4X2lzbG93XzgoaW50MTZfdCAqZGF0YSk7Cit2b2lkIGZmX2ZkY3QyNDhfaXNsb3dfMTAoaW50MTZfdCAqZGF0YSk7CisKK3ZvaWQgZmZfal9yZXZfZGN0KGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9qX3Jldl9kY3Q0KGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9qX3Jldl9kY3QyKGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9qX3Jldl9kY3QxKGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9qcmVmX2lkY3RfcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfanJlZl9pZGN0X2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0RDVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kY3QzMi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGN0MzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGIyNDcxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGN0MzIuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19EQ1QzMl9ICisjZGVmaW5lIEFWQ09ERUNfRENUMzJfSAorCit2b2lkIGZmX2RjdDMyX2Zsb2F0KGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMpOwordm9pZCBmZl9kY3QzMl9maXhlZChpbnQgKmRzdCwgY29uc3QgaW50ICpzcmMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RjdDMyX2ZpeGVkLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kY3QzMl9maXhlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjVkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kY3QzMl9maXhlZC5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBEQ1QzMl9GTE9BVCAwCisjaW5jbHVkZSAiZGN0MzJfdGVtcGxhdGUuYyIKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RjdDMyX2Zsb2F0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kY3QzMl9mbG9hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5N2M5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kY3QzMl9mbG9hdC5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBEQ1QzMl9GTE9BVCAxCisjaW5jbHVkZSAiZGN0MzJfdGVtcGxhdGUuYyIKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RjdDMyX3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kY3QzMl90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTNkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kY3QzMl90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogVGVtcGxhdGUgZm9yIHRoZSBEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtIGZvciAzMiBzYW1wbGVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkY3QzMi5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKworI2lmIERDVDMyX0ZMT0FUCisjICAgZGVmaW5lIGRjdDMyIGZmX2RjdDMyX2Zsb2F0CisjICAgZGVmaW5lIEZJWEhSKHgpICAgICAgICgoZmxvYXQpKHgpKQorIyAgIGRlZmluZSBNVUxIMyh4LCB5LCBzKSAoKHMpKih5KSooeCkpCisjICAgZGVmaW5lIElOVEZMT0FUIGZsb2F0CisjZWxzZQorIyAgIGRlZmluZSBkY3QzMiBmZl9kY3QzMl9maXhlZAorIyAgIGRlZmluZSBGSVhIUihhKSAgICAgICAoKGludCkoKGEpICogKDFMTDw8MzIpICsgMC41KSkKKyMgICBkZWZpbmUgTVVMSDMoeCwgeSwgcykgTVVMSCgocykqKHgpLCB5KQorIyAgIGRlZmluZSBJTlRGTE9BVCBpbnQKKyNlbmRpZgorCisKKy8qIHRhYltpXVtqXSA9IDEuMCAvICgyLjAgKiBjb3MocGkqKDIqaysxKSAvIDJeKDYgLSBqKSkpICovCisKKy8qIGNvcyhpKnBpLzY0KSAqLworCisjZGVmaW5lIENPUzBfMCAgRklYSFIoMC41MDA2MDI5OTgyMzUxOTYzMDEzNC8yKQorI2RlZmluZSBDT1MwXzEgIEZJWEhSKDAuNTA1NDcwOTU5ODk3NTQzNjU5OTgvMikKKyNkZWZpbmUgQ09TMF8yICBGSVhIUigwLjUxNTQ0NzMwOTkyMjYyNDU0Njk3LzIpCisjZGVmaW5lIENPUzBfMyAgRklYSFIoMC41MzEwNDI1OTEwODk3ODQxNzQ0Ny8yKQorI2RlZmluZSBDT1MwXzQgIEZJWEhSKDAuNTUzMTAzODk2MDM0NDQ0NTI3ODIvMikKKyNkZWZpbmUgQ09TMF81ICBGSVhIUigwLjU4MjkzNDk2ODIwNjEzMzg3MzY3LzIpCisjZGVmaW5lIENPUzBfNiAgRklYSFIoMC42MjI1MDQxMjMwMzU2NjQ4MTYxNS8yKQorI2RlZmluZSBDT1MwXzcgIEZJWEhSKDAuNjc0ODA4MzQxNDU1MDA1NzQ2MDIvMikKKyNkZWZpbmUgQ09TMF84ICBGSVhIUigwLjc0NDUzNjI3MTAwMjI5ODQ0OTc3LzIpCisjZGVmaW5lIENPUzBfOSAgRklYSFIoMC44MzkzNDk2NDU0MTU1MjcwMzg3My8yKQorI2RlZmluZSBDT1MwXzEwIEZJWEhSKDAuOTcyNTY4MjM3ODYxOTYwNjkzNjkvMikKKyNkZWZpbmUgQ09TMF8xMSBGSVhIUigxLjE2OTQzOTkzMzQzMjg4NDk1NTE1LzQpCisjZGVmaW5lIENPUzBfMTIgRklYSFIoMS40ODQxNjQ2MTYzMTQxNjYyNzcyNC80KQorI2RlZmluZSBDT1MwXzEzIEZJWEhSKDIuMDU3NzgxMDA5OTUzNDExNTUwODUvOCkKKyNkZWZpbmUgQ09TMF8xNCBGSVhIUigzLjQwNzYwODQxODQ2ODcxODc4NTcwLzgpCisjZGVmaW5lIENPUzBfMTUgRklYSFIoMTAuMTkwMDA4MTIzNTQ4MDU2ODExNTAvMzIpCisKKyNkZWZpbmUgQ09TMV8wIEZJWEhSKDAuNTAyNDE5Mjg2MTg4MTU1NzA1NTEvMikKKyNkZWZpbmUgQ09TMV8xIEZJWEhSKDAuNTIyNDk4NjE0OTM5Njg4ODgwNjIvMikKKyNkZWZpbmUgQ09TMV8yIEZJWEhSKDAuNTY2OTQ0MDM0ODE2MzU3NzAzNjgvMikKKyNkZWZpbmUgQ09TMV8zIEZJWEhSKDAuNjQ2ODIxNzgzMzU5OTkwMTI5NTQvMikKKyNkZWZpbmUgQ09TMV80IEZJWEhSKDAuNzg4MTU0NjIzNDUxMjUwMjI0NzMvMikKKyNkZWZpbmUgQ09TMV81IEZJWEhSKDEuMDYwNjc3Njg1OTkwMzQ3NDcxMzQvNCkKKyNkZWZpbmUgQ09TMV82IEZJWEhSKDEuNzIyNDQ3MDk4MjM4MzMzOTI3ODIvNCkKKyNkZWZpbmUgQ09TMV83IEZJWEhSKDUuMTAxMTQ4NjE4Njg5MTYzODU4MDIvMTYpCisKKyNkZWZpbmUgQ09TMl8wIEZJWEhSKDAuNTA5Nzk1NTc5MTA0MTU5MTY4OTQvMikKKyNkZWZpbmUgQ09TMl8xIEZJWEhSKDAuNjAxMzQ0ODg2OTM1MDQ1MjgwNTQvMikKKyNkZWZpbmUgQ09TMl8yIEZJWEhSKDAuODk5OTc2MjIzMTM2NDE1NzA0NjMvMikKKyNkZWZpbmUgQ09TMl8zIEZJWEhSKDIuNTYyOTE1NDQ3NzQxNTA2MTc4ODEvOCkKKworI2RlZmluZSBDT1MzXzAgRklYSFIoMC41NDExOTYxMDAxNDYxOTY5ODQzOS8yKQorI2RlZmluZSBDT1MzXzEgRklYSFIoMS4zMDY1NjI5NjQ4NzYzNzY1Mjc4NS80KQorCisjZGVmaW5lIENPUzRfMCBGSVhIUigwLjcwNzEwNjc4MTE4NjU0NzUyNDM5LzIpCisKKy8qIGJ1dHRlcmZseSBvcGVyYXRvciAqLworI2RlZmluZSBCRihhLCBiLCBjLCBzKVwKK3tcCisgICAgdG1wMCA9IHZhbCMjYSArIHZhbCMjYjtcCisgICAgdG1wMSA9IHZhbCMjYSAtIHZhbCMjYjtcCisgICAgdmFsIyNhID0gdG1wMDtcCisgICAgdmFsIyNiID0gTVVMSDModG1wMSwgYywgMTw8KHMpKTtcCit9CisKKyNkZWZpbmUgQkYwKGEsIGIsIGMsIHMpXAore1wKKyAgICB0bXAwID0gdGFiW2FdICsgdGFiW2JdO1wKKyAgICB0bXAxID0gdGFiW2FdIC0gdGFiW2JdO1wKKyAgICB2YWwjI2EgPSB0bXAwO1wKKyAgICB2YWwjI2IgPSBNVUxIMyh0bXAxLCBjLCAxPDwocykpO1wKK30KKworI2RlZmluZSBCRjEoYSwgYiwgYywgZClcCit7XAorICAgIEJGKGEsIGIsIENPUzRfMCwgMSk7XAorICAgIEJGKGMsIGQsLUNPUzRfMCwgMSk7XAorICAgIHZhbCMjYyArPSB2YWwjI2Q7XAorfQorCisjZGVmaW5lIEJGMihhLCBiLCBjLCBkKVwKK3tcCisgICAgQkYoYSwgYiwgQ09TNF8wLCAxKTtcCisgICAgQkYoYywgZCwtQ09TNF8wLCAxKTtcCisgICAgdmFsIyNjICs9IHZhbCMjZDtcCisgICAgdmFsIyNhICs9IHZhbCMjYztcCisgICAgdmFsIyNjICs9IHZhbCMjYjtcCisgICAgdmFsIyNiICs9IHZhbCMjZDtcCit9CisKKyNkZWZpbmUgQUREKGEsIGIpIHZhbCMjYSArPSB2YWwjI2IKKworLyogRENUMzIgd2l0aG91dCAxL3NxcnQoMikgY29lZiB6ZXJvIHNjYWxpbmcuICovCit2b2lkIGRjdDMyKElOVEZMT0FUICpvdXQsIGNvbnN0IElOVEZMT0FUICp0YWIpCit7CisgICAgSU5URkxPQVQgdG1wMCwgdG1wMTsKKworICAgIElOVEZMT0FUIHZhbDAgLCB2YWwxICwgdmFsMiAsIHZhbDMgLCB2YWw0ICwgdmFsNSAsIHZhbDYgLCB2YWw3ICwKKyAgICAgICAgICAgICB2YWw4ICwgdmFsOSAsIHZhbDEwLCB2YWwxMSwgdmFsMTIsIHZhbDEzLCB2YWwxNCwgdmFsMTUsCisgICAgICAgICAgICAgdmFsMTYsIHZhbDE3LCB2YWwxOCwgdmFsMTksIHZhbDIwLCB2YWwyMSwgdmFsMjIsIHZhbDIzLAorICAgICAgICAgICAgIHZhbDI0LCB2YWwyNSwgdmFsMjYsIHZhbDI3LCB2YWwyOCwgdmFsMjksIHZhbDMwLCB2YWwzMTsKKworICAgIC8qIHBhc3MgMSAqLworICAgIEJGMCggMCwgMzEsIENPUzBfMCAsIDEpOworICAgIEJGMCgxNSwgMTYsIENPUzBfMTUsIDUpOworICAgIC8qIHBhc3MgMiAqLworICAgIEJGKCAwLCAxNSwgQ09TMV8wICwgMSk7CisgICAgQkYoMTYsIDMxLC1DT1MxXzAgLCAxKTsKKyAgICAvKiBwYXNzIDEgKi8KKyAgICBCRjAoIDcsIDI0LCBDT1MwXzcgLCAxKTsKKyAgICBCRjAoIDgsIDIzLCBDT1MwXzggLCAxKTsKKyAgICAvKiBwYXNzIDIgKi8KKyAgICBCRiggNywgIDgsIENPUzFfNyAsIDQpOworICAgIEJGKDIzLCAyNCwtQ09TMV83ICwgNCk7CisgICAgLyogcGFzcyAzICovCisgICAgQkYoIDAsICA3LCBDT1MyXzAgLCAxKTsKKyAgICBCRiggOCwgMTUsLUNPUzJfMCAsIDEpOworICAgIEJGKDE2LCAyMywgQ09TMl8wICwgMSk7CisgICAgQkYoMjQsIDMxLC1DT1MyXzAgLCAxKTsKKyAgICAvKiBwYXNzIDEgKi8KKyAgICBCRjAoIDMsIDI4LCBDT1MwXzMgLCAxKTsKKyAgICBCRjAoMTIsIDE5LCBDT1MwXzEyLCAyKTsKKyAgICAvKiBwYXNzIDIgKi8KKyAgICBCRiggMywgMTIsIENPUzFfMyAsIDEpOworICAgIEJGKDE5LCAyOCwtQ09TMV8zICwgMSk7CisgICAgLyogcGFzcyAxICovCisgICAgQkYwKCA0LCAyNywgQ09TMF80ICwgMSk7CisgICAgQkYwKDExLCAyMCwgQ09TMF8xMSwgMik7CisgICAgLyogcGFzcyAyICovCisgICAgQkYoIDQsIDExLCBDT1MxXzQgLCAxKTsKKyAgICBCRigyMCwgMjcsLUNPUzFfNCAsIDEpOworICAgIC8qIHBhc3MgMyAqLworICAgIEJGKCAzLCAgNCwgQ09TMl8zICwgMyk7CisgICAgQkYoMTEsIDEyLC1DT1MyXzMgLCAzKTsKKyAgICBCRigxOSwgMjAsIENPUzJfMyAsIDMpOworICAgIEJGKDI3LCAyOCwtQ09TMl8zICwgMyk7CisgICAgLyogcGFzcyA0ICovCisgICAgQkYoIDAsICAzLCBDT1MzXzAgLCAxKTsKKyAgICBCRiggNCwgIDcsLUNPUzNfMCAsIDEpOworICAgIEJGKCA4LCAxMSwgQ09TM18wICwgMSk7CisgICAgQkYoMTIsIDE1LC1DT1MzXzAgLCAxKTsKKyAgICBCRigxNiwgMTksIENPUzNfMCAsIDEpOworICAgIEJGKDIwLCAyMywtQ09TM18wICwgMSk7CisgICAgQkYoMjQsIDI3LCBDT1MzXzAgLCAxKTsKKyAgICBCRigyOCwgMzEsLUNPUzNfMCAsIDEpOworCisKKworICAgIC8qIHBhc3MgMSAqLworICAgIEJGMCggMSwgMzAsIENPUzBfMSAsIDEpOworICAgIEJGMCgxNCwgMTcsIENPUzBfMTQsIDMpOworICAgIC8qIHBhc3MgMiAqLworICAgIEJGKCAxLCAxNCwgQ09TMV8xICwgMSk7CisgICAgQkYoMTcsIDMwLC1DT1MxXzEgLCAxKTsKKyAgICAvKiBwYXNzIDEgKi8KKyAgICBCRjAoIDYsIDI1LCBDT1MwXzYgLCAxKTsKKyAgICBCRjAoIDksIDIyLCBDT1MwXzkgLCAxKTsKKyAgICAvKiBwYXNzIDIgKi8KKyAgICBCRiggNiwgIDksIENPUzFfNiAsIDIpOworICAgIEJGKDIyLCAyNSwtQ09TMV82ICwgMik7CisgICAgLyogcGFzcyAzICovCisgICAgQkYoIDEsICA2LCBDT1MyXzEgLCAxKTsKKyAgICBCRiggOSwgMTQsLUNPUzJfMSAsIDEpOworICAgIEJGKDE3LCAyMiwgQ09TMl8xICwgMSk7CisgICAgQkYoMjUsIDMwLC1DT1MyXzEgLCAxKTsKKworICAgIC8qIHBhc3MgMSAqLworICAgIEJGMCggMiwgMjksIENPUzBfMiAsIDEpOworICAgIEJGMCgxMywgMTgsIENPUzBfMTMsIDMpOworICAgIC8qIHBhc3MgMiAqLworICAgIEJGKCAyLCAxMywgQ09TMV8yICwgMSk7CisgICAgQkYoMTgsIDI5LC1DT1MxXzIgLCAxKTsKKyAgICAvKiBwYXNzIDEgKi8KKyAgICBCRjAoIDUsIDI2LCBDT1MwXzUgLCAxKTsKKyAgICBCRjAoMTAsIDIxLCBDT1MwXzEwLCAxKTsKKyAgICAvKiBwYXNzIDIgKi8KKyAgICBCRiggNSwgMTAsIENPUzFfNSAsIDIpOworICAgIEJGKDIxLCAyNiwtQ09TMV81ICwgMik7CisgICAgLyogcGFzcyAzICovCisgICAgQkYoIDIsICA1LCBDT1MyXzIgLCAxKTsKKyAgICBCRigxMCwgMTMsLUNPUzJfMiAsIDEpOworICAgIEJGKDE4LCAyMSwgQ09TMl8yICwgMSk7CisgICAgQkYoMjYsIDI5LC1DT1MyXzIgLCAxKTsKKyAgICAvKiBwYXNzIDQgKi8KKyAgICBCRiggMSwgIDIsIENPUzNfMSAsIDIpOworICAgIEJGKCA1LCAgNiwtQ09TM18xICwgMik7CisgICAgQkYoIDksIDEwLCBDT1MzXzEgLCAyKTsKKyAgICBCRigxMywgMTQsLUNPUzNfMSAsIDIpOworICAgIEJGKDE3LCAxOCwgQ09TM18xICwgMik7CisgICAgQkYoMjEsIDIyLC1DT1MzXzEgLCAyKTsKKyAgICBCRigyNSwgMjYsIENPUzNfMSAsIDIpOworICAgIEJGKDI5LCAzMCwtQ09TM18xICwgMik7CisKKyAgICAvKiBwYXNzIDUgKi8KKyAgICBCRjEoIDAsICAxLCAgMiwgIDMpOworICAgIEJGMiggNCwgIDUsICA2LCAgNyk7CisgICAgQkYxKCA4LCAgOSwgMTAsIDExKTsKKyAgICBCRjIoMTIsIDEzLCAxNCwgMTUpOworICAgIEJGMSgxNiwgMTcsIDE4LCAxOSk7CisgICAgQkYyKDIwLCAyMSwgMjIsIDIzKTsKKyAgICBCRjEoMjQsIDI1LCAyNiwgMjcpOworICAgIEJGMigyOCwgMjksIDMwLCAzMSk7CisKKyAgICAvKiBwYXNzIDYgKi8KKworICAgIEFERCggOCwgMTIpOworICAgIEFERCgxMiwgMTApOworICAgIEFERCgxMCwgMTQpOworICAgIEFERCgxNCwgIDkpOworICAgIEFERCggOSwgMTMpOworICAgIEFERCgxMywgMTEpOworICAgIEFERCgxMSwgMTUpOworCisgICAgb3V0WyAwXSA9IHZhbDA7CisgICAgb3V0WzE2XSA9IHZhbDE7CisgICAgb3V0WyA4XSA9IHZhbDI7CisgICAgb3V0WzI0XSA9IHZhbDM7CisgICAgb3V0WyA0XSA9IHZhbDQ7CisgICAgb3V0WzIwXSA9IHZhbDU7CisgICAgb3V0WzEyXSA9IHZhbDY7CisgICAgb3V0WzI4XSA9IHZhbDc7CisgICAgb3V0WyAyXSA9IHZhbDg7CisgICAgb3V0WzE4XSA9IHZhbDk7CisgICAgb3V0WzEwXSA9IHZhbDEwOworICAgIG91dFsyNl0gPSB2YWwxMTsKKyAgICBvdXRbIDZdID0gdmFsMTI7CisgICAgb3V0WzIyXSA9IHZhbDEzOworICAgIG91dFsxNF0gPSB2YWwxNDsKKyAgICBvdXRbMzBdID0gdmFsMTU7CisKKyAgICBBREQoMjQsIDI4KTsKKyAgICBBREQoMjgsIDI2KTsKKyAgICBBREQoMjYsIDMwKTsKKyAgICBBREQoMzAsIDI1KTsKKyAgICBBREQoMjUsIDI5KTsKKyAgICBBREQoMjksIDI3KTsKKyAgICBBREQoMjcsIDMxKTsKKworICAgIG91dFsgMV0gPSB2YWwxNiArIHZhbDI0OworICAgIG91dFsxN10gPSB2YWwxNyArIHZhbDI1OworICAgIG91dFsgOV0gPSB2YWwxOCArIHZhbDI2OworICAgIG91dFsyNV0gPSB2YWwxOSArIHZhbDI3OworICAgIG91dFsgNV0gPSB2YWwyMCArIHZhbDI4OworICAgIG91dFsyMV0gPSB2YWwyMSArIHZhbDI5OworICAgIG91dFsxM10gPSB2YWwyMiArIHZhbDMwOworICAgIG91dFsyOV0gPSB2YWwyMyArIHZhbDMxOworICAgIG91dFsgM10gPSB2YWwyNCArIHZhbDIwOworICAgIG91dFsxOV0gPSB2YWwyNSArIHZhbDIxOworICAgIG91dFsxMV0gPSB2YWwyNiArIHZhbDIyOworICAgIG91dFsyN10gPSB2YWwyNyArIHZhbDIzOworICAgIG91dFsgN10gPSB2YWwyOCArIHZhbDE4OworICAgIG91dFsyM10gPSB2YWwyOSArIHZhbDE5OworICAgIG91dFsxNV0gPSB2YWwzMCArIHZhbDE3OworICAgIG91dFszMV0gPSB2YWwzMTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RjdHJlZi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGN0cmVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxMDE0YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RjdHJlZi5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogcmVmZXJlbmNlIGRpc2NyZXRlIGNvc2luZSB0cmFuc2Zvcm0gKGRvdWJsZSBwcmVjaXNpb24pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRHlsYW4gWXVkYWtlbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiByZWZlcmVuY2UgZGlzY3JldGUgY29zaW5lIHRyYW5zZm9ybSAoZG91YmxlIHByZWNpc2lvbikKKyAqCisgKiBAYXV0aG9yIER5bGFuIFl1ZGFrZW4gKGR5dWRha2VuIGF0IGdtYWlsKQorICoKKyAqIEBub3RlIFRoaXMgZmlsZSBjb3VsZCBiZSBvcHRpbWl6ZWQgYSBsb3QsIGJ1dCBpcyBmb3IKKyAqIHJlZmVyZW5jZSBhbmQgc28gcmVhZGFiaWxpdHkgaXMgYmV0dGVyLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJkY3RyZWYuaCIKKworc3RhdGljIGRvdWJsZSBjb2VmZmljaWVudHNbOCAqIDhdOworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGRvdWJsZSBwcmVjaXNpb24gZGlzY3JldGUgY29zaW5lIHRyYW5zZm9ybQorICogZnVuY3Rpb25zIGZkY3QgJiBpZGN0LgorICovCithdl9jb2xkIHZvaWQgZmZfcmVmX2RjdF9pbml0KHZvaWQpCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgICAgIGNvZWZmaWNpZW50c1tqXSA9IHNxcnQoMC4xMjUpOworICAgICAgICBmb3IgKGkgPSA4OyBpIDwgNjQ7IGkgKz0gOCkgeworICAgICAgICAgICAgY29lZmZpY2llbnRzW2kgKyBqXSA9IDAuNSAqIGNvcyhpICogKGogKyAwLjUpICogTV9QSSAvIDY0LjApOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIFRyYW5zZm9ybSA4eDggYmxvY2sgb2YgZGF0YSB3aXRoIGEgZG91YmxlIHByZWNpc2lvbiBmb3J3YXJkIERDVCA8YnI+CisgKiBUaGlzIGlzIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBwYXJhbSBibG9jayBwb2ludGVyIHRvIDh4OCBibG9jayBvZiBkYXRhIHRvIHRyYW5zZm9ybQorICovCit2b2lkIGZmX3JlZl9mZGN0KHNob3J0ICpibG9jaykKK3sKKyAgICAvKiBpbXBsZW1lbnQgdGhlIGVxdWF0aW9uOiBibG9jayA9IGNvZWZmaWNpZW50cyAqIGJsb2NrICogY29lZmZpY2llbnRzJyAqLworCisgICAgdW5zaWduZWQgaW50IGksIGosIGs7CisgICAgZG91YmxlIG91dFs4ICogOF07CisKKyAgICAvKiBvdXQgPSBjb2VmZmljaWVudHMgKiBibG9jayAqLworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSArPSA4KSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICAgICAgICAgIGRvdWJsZSB0bXAgPSAwOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDg7ICsraykgeworICAgICAgICAgICAgICAgIHRtcCArPSBjb2VmZmljaWVudHNbaSArIGtdICogYmxvY2tbayAqIDggKyBqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dFtpICsgal0gPSB0bXAgKiA4OworICAgICAgICB9CisgICAgfQorCisgICAgLyogYmxvY2sgPSBvdXQgKiAoY29lZmZpY2llbnRzJykgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSArPSA4KSB7CisgICAgICAgICAgICBkb3VibGUgdG1wID0gMDsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA4OyArK2spIHsKKyAgICAgICAgICAgICAgICB0bXAgKz0gb3V0W2kgKyBrXSAqIGNvZWZmaWNpZW50c1tqICogOCArIGtdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxvY2tbaSArIGpdID0gZmxvb3IodG1wICsgMC40OTk5OTk5OTk5OTkpOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIFRyYW5zZm9ybSA4eDggYmxvY2sgb2YgZGF0YSB3aXRoIGEgZG91YmxlIHByZWNpc2lvbiBpbnZlcnNlIERDVCA8YnI+CisgKiBUaGlzIGlzIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBwYXJhbSBibG9jayBwb2ludGVyIHRvIDh4OCBibG9jayBvZiBkYXRhIHRvIHRyYW5zZm9ybQorICovCit2b2lkIGZmX3JlZl9pZGN0KHNob3J0ICpibG9jaykKK3sKKyAgICAvKiBpbXBsZW1lbnQgdGhlIGVxdWF0aW9uOiBibG9jayA9IChjb2VmZmljaWVudHMnKSAqIGJsb2NrICogY29lZmZpY2llbnRzICovCisKKyAgICB1bnNpZ25lZCBpbnQgaSwgaiwgazsKKyAgICBkb3VibGUgb3V0WzggKiA4XTsKKworICAgIC8qIG91dCA9IGJsb2NrICogY29lZmZpY2llbnRzICovCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDgpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgICAgICAgICAgZG91YmxlIHRtcCA9IDA7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgODsgKytrKSB7CisgICAgICAgICAgICAgICAgdG1wICs9IGJsb2NrW2kgKyBrXSAqIGNvZWZmaWNpZW50c1trICogOCArIGpdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0W2kgKyBqXSA9IHRtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGJsb2NrID0gKGNvZWZmaWNpZW50cycpICogb3V0ICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgICAgICAgICBkb3VibGUgdG1wID0gMDsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA2NDsgayArPSA4KSB7CisgICAgICAgICAgICAgICAgdG1wICs9IGNvZWZmaWNpZW50c1trICsgaV0gKiBvdXRbayArIGpdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxvY2tbaSAqIDggKyBqXSA9IGZsb29yKHRtcCArIDAuNSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kY3RyZWYuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2RjdHJlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZmRlODgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kY3RyZWYuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogcmVmZXJlbmNlIGRpc2NyZXRlIGNvc2luZSB0cmFuc2Zvcm0gKGRvdWJsZSBwcmVjaXNpb24pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRHlsYW4gWXVkYWtlbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRENUUkVGX0gKKyNkZWZpbmUgQVZDT0RFQ19EQ1RSRUZfSAorCit2b2lkIGZmX3JlZl9mZGN0KHNob3J0ICpibG9jayk7Cit2b2lkIGZmX3JlZl9pZGN0KHNob3J0ICpibG9jayk7Cit2b2lkIGZmX3JlZl9kY3RfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfRENUUkVGX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RmYS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGZhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzMjkxZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RmYS5jCkBAIC0wLDAgKzEsNDIyIEBACisvKgorICogQ2hyb25vbWFzdGVyIERGQSBWaWRlbyBEZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgS29uc3RhbnRpbiBTaGlzaGtvdgorICogYmFzZWQgb24gd29yayBieSBWbGFkaW1pciAiVkFHIiBHbmV1c2hldgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKwordHlwZWRlZiBzdHJ1Y3QgRGZhQ29udGV4dCB7CisgICAgdWludDMyX3QgcGFsWzI1Nl07CisgICAgdWludDhfdCAqZnJhbWVfYnVmOworfSBEZmFDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgZGZhX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBEZmFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworCisgICAgaWYgKCFhdmN0eC0+d2lkdGggfHwgIWF2Y3R4LT5oZWlnaHQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYXZfYXNzZXJ0MChhdl9pbWFnZV9jaGVja19zaXplKGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgMCwgYXZjdHgpID49IDApOworCisgICAgcy0+ZnJhbWVfYnVmID0gYXZfbWFsbG9jeihhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0KTsKKyAgICBpZiAoIXMtPmZyYW1lX2J1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jb3B5KEdldEJ5dGVDb250ZXh0ICpnYiwgdWludDhfdCAqZnJhbWUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBjb25zdCBpbnQgc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoZ2IsIGZyYW1lLCBzaXplKSAhPSBzaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfdHN3MShHZXRCeXRlQ29udGV4dCAqZ2IsIHVpbnQ4X3QgKmZyYW1lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgY29uc3QgdWludDhfdCAqZnJhbWVfc3RhcnQgPSBmcmFtZTsKKyAgICBjb25zdCB1aW50OF90ICpmcmFtZV9lbmQgICA9IGZyYW1lICsgd2lkdGggKiBoZWlnaHQ7CisgICAgaW50IG1hc2sgPSAweDEwMDAwLCBiaXRidWYgPSAwOworICAgIGludCB2LCBjb3VudCwgc2VnbWVudHM7CisgICAgdW5zaWduZWQgb2Zmc2V0OworCisgICAgc2VnbWVudHMgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYik7CisgICAgb2Zmc2V0ICAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYik7CisgICAgaWYgKHNlZ21lbnRzID09IDAgJiYgb2Zmc2V0ID09IGZyYW1lX2VuZCAtIGZyYW1lKQorICAgICAgICByZXR1cm4gMDsgLy8gc2tpcCBmcmFtZQorICAgIGlmIChmcmFtZV9lbmQgLSBmcmFtZSA8PSBvZmZzZXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGZyYW1lICs9IG9mZnNldDsKKyAgICB3aGlsZSAoc2VnbWVudHMtLSkgeworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIDwgMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAobWFzayA9PSAweDEwMDAwKSB7CisgICAgICAgICAgICBiaXRidWYgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoZ2IpOworICAgICAgICAgICAgbWFzayA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYW1lX2VuZCAtIGZyYW1lIDwgMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAoYml0YnVmICYgbWFzaykgeworICAgICAgICAgICAgdiA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKTsKKyAgICAgICAgICAgIG9mZnNldCA9ICh2ICYgMHgxRkZGKSA8PCAxOworICAgICAgICAgICAgY291bnQgPSAoKHYgPj4gMTMpICsgMikgPDwgMTsKKyAgICAgICAgICAgIGlmIChmcmFtZSAtIGZyYW1lX3N0YXJ0IDwgb2Zmc2V0IHx8IGZyYW1lX2VuZCAtIGZyYW1lIDwgY291bnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBhdl9tZW1jcHlfYmFja3B0cihmcmFtZSwgb2Zmc2V0LCBjb3VudCk7CisgICAgICAgICAgICBmcmFtZSArPSBjb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpmcmFtZSsrID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgKmZyYW1lKysgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgIH0KKyAgICAgICAgbWFzayA8PD0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZHN3MShHZXRCeXRlQ29udGV4dCAqZ2IsIHVpbnQ4X3QgKmZyYW1lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgY29uc3QgdWludDhfdCAqZnJhbWVfc3RhcnQgPSBmcmFtZTsKKyAgICBjb25zdCB1aW50OF90ICpmcmFtZV9lbmQgICA9IGZyYW1lICsgd2lkdGggKiBoZWlnaHQ7CisgICAgaW50IG1hc2sgPSAweDEwMDAwLCBiaXRidWYgPSAwOworICAgIGludCB2LCBvZmZzZXQsIGNvdW50LCBzZWdtZW50czsKKworICAgIHNlZ21lbnRzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgIHdoaWxlIChzZWdtZW50cy0tKSB7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCAyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmIChtYXNrID09IDB4MTAwMDApIHsKKyAgICAgICAgICAgIGJpdGJ1ZiA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dShnYik7CisgICAgICAgICAgICBtYXNrID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJhbWVfZW5kIC0gZnJhbWUgPCAyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmIChiaXRidWYgJiBtYXNrKSB7CisgICAgICAgICAgICB2ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgICAgICAgICAgb2Zmc2V0ID0gKHYgJiAweDFGRkYpIDw8IDE7CisgICAgICAgICAgICBjb3VudCA9ICgodiA+PiAxMykgKyAyKSA8PCAxOworICAgICAgICAgICAgaWYgKGZyYW1lIC0gZnJhbWVfc3RhcnQgPCBvZmZzZXQgfHwgZnJhbWVfZW5kIC0gZnJhbWUgPCBjb3VudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGF2X21lbWNweV9iYWNrcHRyKGZyYW1lLCBvZmZzZXQsIGNvdW50KTsKKyAgICAgICAgICAgIGZyYW1lICs9IGNvdW50OworICAgICAgICB9IGVsc2UgaWYgKGJpdGJ1ZiAmIChtYXNrIDw8IDEpKSB7CisgICAgICAgICAgICBmcmFtZSArPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZnJhbWUrKyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgICpmcmFtZSsrID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICB9CisgICAgICAgIG1hc2sgPDw9IDI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2RkczEoR2V0Qnl0ZUNvbnRleHQgKmdiLCB1aW50OF90ICpmcmFtZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmZyYW1lX3N0YXJ0ID0gZnJhbWU7CisgICAgY29uc3QgdWludDhfdCAqZnJhbWVfZW5kICAgPSBmcmFtZSArIHdpZHRoICogaGVpZ2h0OworICAgIGludCBtYXNrID0gMHgxMDAwMCwgYml0YnVmID0gMDsKKyAgICBpbnQgaSwgdiwgb2Zmc2V0LCBjb3VudCwgc2VnbWVudHM7CisKKyAgICBzZWdtZW50cyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKTsKKyAgICB3aGlsZSAoc2VnbWVudHMtLSkgeworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIDwgMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAobWFzayA9PSAweDEwMDAwKSB7CisgICAgICAgICAgICBiaXRidWYgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoZ2IpOworICAgICAgICAgICAgbWFzayA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYml0YnVmICYgbWFzaykgeworICAgICAgICAgICAgdiA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKTsKKyAgICAgICAgICAgIG9mZnNldCA9ICh2ICYgMHgxRkZGKSA8PCAyOworICAgICAgICAgICAgY291bnQgPSAoKHYgPj4gMTMpICsgMikgPDwgMTsKKyAgICAgICAgICAgIGlmIChmcmFtZSAtIGZyYW1lX3N0YXJ0IDwgb2Zmc2V0IHx8IGZyYW1lX2VuZCAtIGZyYW1lIDwgY291bnQqMiArIHdpZHRoKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmcmFtZVswXSA9IGZyYW1lWzFdID0KKyAgICAgICAgICAgICAgICBmcmFtZVt3aWR0aF0gPSBmcmFtZVt3aWR0aCArIDFdID0gZnJhbWVbLW9mZnNldF07CisKKyAgICAgICAgICAgICAgICBmcmFtZSArPSAyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGJpdGJ1ZiAmIChtYXNrIDw8IDEpKSB7CisgICAgICAgICAgICB2ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpKjI7CisgICAgICAgICAgICBpZiAoZnJhbWUgLSBmcmFtZV9lbmQgPCB2KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZnJhbWUgKz0gdjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChmcmFtZV9lbmQgLSBmcmFtZSA8IHdpZHRoICsgMykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGZyYW1lWzBdID0gZnJhbWVbMV0gPQorICAgICAgICAgICAgZnJhbWVbd2lkdGhdID0gZnJhbWVbd2lkdGggKyAxXSA9ICBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICBmcmFtZSArPSAyOworICAgICAgICAgICAgZnJhbWVbMF0gPSBmcmFtZVsxXSA9CisgICAgICAgICAgICBmcmFtZVt3aWR0aF0gPSBmcmFtZVt3aWR0aCArIDFdID0gIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgIGZyYW1lICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgbWFzayA8PD0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYmRsdChHZXRCeXRlQ29udGV4dCAqZ2IsIHVpbnQ4X3QgKmZyYW1lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgdWludDhfdCAqbGluZV9wdHI7CisgICAgaW50IGNvdW50LCBsaW5lcywgc2VnbWVudHM7CisKKyAgICBjb3VudCA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKTsKKyAgICBpZiAoY291bnQgPj0gaGVpZ2h0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBmcmFtZSArPSB3aWR0aCAqIGNvdW50OworICAgIGxpbmVzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgIGlmIChjb3VudCArIGxpbmVzID4gaGVpZ2h0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHdoaWxlIChsaW5lcy0tKSB7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCAxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGxpbmVfcHRyID0gZnJhbWU7CisgICAgICAgIGZyYW1lICs9IHdpZHRoOworICAgICAgICBzZWdtZW50cyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldShnYik7CisgICAgICAgIHdoaWxlIChzZWdtZW50cy0tKSB7CisgICAgICAgICAgICBpZiAoZnJhbWUgLSBsaW5lX3B0ciA8PSBieXRlc3RyZWFtMl9wZWVrX2J5dGUoZ2IpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgbGluZV9wdHIgKz0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgY291bnQgPSAoaW50OF90KWJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lIC0gbGluZV9wdHIgPCBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoZ2IsIGxpbmVfcHRyLCBjb3VudCkgIT0gY291bnQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb3VudCA9IC1jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWUgLSBsaW5lX3B0ciA8IGNvdW50KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobGluZV9wdHIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSwgY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZV9wdHIgKz0gY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfd2RsdChHZXRCeXRlQ29udGV4dCAqZ2IsIHVpbnQ4X3QgKmZyYW1lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgY29uc3QgdWludDhfdCAqZnJhbWVfZW5kICAgPSBmcmFtZSArIHdpZHRoICogaGVpZ2h0OworICAgIHVpbnQ4X3QgKmxpbmVfcHRyOworICAgIGludCBjb3VudCwgaSwgdiwgbGluZXMsIHNlZ21lbnRzOworICAgIGludCB5ID0gMDsKKworICAgIGxpbmVzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgIGlmIChsaW5lcyA+IGhlaWdodCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB3aGlsZSAobGluZXMtLSkgeworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIDwgMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBzZWdtZW50cyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dShnYik7CisgICAgICAgIHdoaWxlICgoc2VnbWVudHMgJiAweEMwMDApID09IDB4QzAwMCkgeworICAgICAgICAgICAgdW5zaWduZWQgc2tpcF9saW5lcyA9IC0oaW50MTZfdClzZWdtZW50czsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlbHRhID0gLSgoaW50MTZfdClzZWdtZW50cyAqIHdpZHRoKTsKKyAgICAgICAgICAgIGlmIChmcmFtZV9lbmQgLSBmcmFtZSA8PSBkZWx0YSB8fCB5ICsgbGluZXMgKyBza2lwX2xpbmVzID4gaGVpZ2h0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZnJhbWUgICAgKz0gZGVsdGE7CisgICAgICAgICAgICB5ICAgICAgICArPSBza2lwX2xpbmVzOworICAgICAgICAgICAgc2VnbWVudHMgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWVfZW5kIDw9IGZyYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmIChzZWdtZW50cyAmIDB4ODAwMCkgeworICAgICAgICAgICAgZnJhbWVbd2lkdGggLSAxXSA9IHNlZ21lbnRzICYgMHhGRjsKKyAgICAgICAgICAgIHNlZ21lbnRzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgICAgICB9CisgICAgICAgIGxpbmVfcHRyID0gZnJhbWU7CisgICAgICAgIGlmIChmcmFtZV9lbmQgLSBmcmFtZSA8IHdpZHRoKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGZyYW1lICs9IHdpZHRoOworICAgICAgICB5Kys7CisgICAgICAgIHdoaWxlIChzZWdtZW50cy0tKSB7CisgICAgICAgICAgICBpZiAoZnJhbWUgLSBsaW5lX3B0ciA8PSBieXRlc3RyZWFtMl9wZWVrX2J5dGUoZ2IpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgbGluZV9wdHIgKz0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgY291bnQgPSAoaW50OF90KWJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lIC0gbGluZV9wdHIgPCBjb3VudCAqIDIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnVmZmVyKGdiLCBsaW5lX3B0ciwgY291bnQgKiAyKSAhPSBjb3VudCAqIDIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGxpbmVfcHRyICs9IGNvdW50ICogMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY291bnQgPSAtY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lIC0gbGluZV9wdHIgPCBjb3VudCAqIDIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHYgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYik7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmxpbmVfcHRyLCB2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV90ZGx0KEdldEJ5dGVDb250ZXh0ICpnYiwgdWludDhfdCAqZnJhbWUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpmcmFtZV9lbmQgPSBmcmFtZSArIHdpZHRoICogaGVpZ2h0OworICAgIHVpbnQzMl90IHNlZ21lbnRzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgIGludCBza2lwLCBjb3B5OworCisgICAgd2hpbGUgKHNlZ21lbnRzLS0pIHsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8IDIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgY29weSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldShnYikgKiAyOworICAgICAgICBza2lwID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KGdiKSAqIDI7CisgICAgICAgIGlmIChmcmFtZV9lbmQgLSBmcmFtZSA8IGNvcHkgKyBza2lwIHx8CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCBjb3B5KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGZyYW1lICs9IHNraXA7CisgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoZ2IsIGZyYW1lLCBjb3B5KTsKKyAgICAgICAgZnJhbWUgKz0gY29weTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYmxjayhHZXRCeXRlQ29udGV4dCAqZ2IsIHVpbnQ4X3QgKmZyYW1lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgbWVtc2V0KGZyYW1lLCAwLCB3aWR0aCAqIGhlaWdodCk7CisgICAgcmV0dXJuIDA7Cit9CisKKwordHlwZWRlZiBpbnQgKCpjaHVua19kZWNvZGVyKShHZXRCeXRlQ29udGV4dCAqZ2IsIHVpbnQ4X3QgKmZyYW1lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCitzdGF0aWMgY29uc3QgY2h1bmtfZGVjb2RlciBkZWNvZGVyWzhdID0geworICAgIGRlY29kZV9jb3B5LCBkZWNvZGVfdHN3MSwgZGVjb2RlX2JkbHQsIGRlY29kZV93ZGx0LAorICAgIGRlY29kZV90ZGx0LCBkZWNvZGVfZHN3MSwgZGVjb2RlX2JsY2ssIGRlY29kZV9kZHMxLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNodW5rX25hbWVbOF0gPSB7CisgICAgIkNPUFkiLCAiVFNXMSIsICJCRExUIiwgIldETFQiLCAiVERMVCIsICJEU1cxIiwgIkJMQ0siLCAiRERTMSIKK307CisKK3N0YXRpYyBpbnQgZGZhX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBEZmFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICB1aW50MzJfdCBjaHVua190eXBlLCBjaHVua19zaXplOworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBpbnQgcmV0OworICAgIGludCBpLCBwYWxfZWxlbXM7CisgICAgaW50IHZlcnNpb24gPSBhdmN0eC0+ZXh0cmFkYXRhX3NpemU9PTIgPyBBVl9STDE2KGF2Y3R4LT5leHRyYWRhdGEpIDogMDsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA+IDApIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDQpOworICAgICAgICBjaHVua19zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKKyAgICAgICAgY2h1bmtfdHlwZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgICAgIGlmICghY2h1bmtfdHlwZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSAxKSB7CisgICAgICAgICAgICBwYWxfZWxlbXMgPSBGRk1JTihjaHVua19zaXplIC8gMywgMjU2KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWxfZWxlbXM7IGkrKykgeworICAgICAgICAgICAgICAgIHMtPnBhbFtpXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0KCZnYikgPDwgMjsKKyAgICAgICAgICAgICAgICBzLT5wYWxbaV0gfD0gMHhGRlUgPDwgMjQgfCAocy0+cGFsW2ldID4+IDYpICYgMHgzMDMwMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlIDw9IDkpIHsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyW2NodW5rX3R5cGUgLSAyXSgmZ2IsIHMtPmZyYW1lX2J1ZiwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZGVjb2RpbmcgJXMgY2h1bmtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX25hbWVbY2h1bmtfdHlwZSAtIDJdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIklnbm9yaW5nIHVua25vd24gY2h1bmsgdHlwZSAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmICs9IGNodW5rX3NpemU7CisgICAgfQorCisgICAgYnVmID0gcy0+ZnJhbWVfYnVmOworICAgIGRzdCA9IGZyYW1lLT5kYXRhWzBdOworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgaWYodmVyc2lvbiA9PSAweDEwMCkgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBhdmN0eC0+d2lkdGg7IGorKykgeworICAgICAgICAgICAgICAgIGRzdFtqXSA9IGJ1ZlsgKGkmMykqKGF2Y3R4LT53aWR0aCAvNCkgKyAoai80KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaiYzKSooYXZjdHgtPmhlaWdodC80KSArIChpLzQpKSphdmN0eC0+d2lkdGhdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KGRzdCwgYnVmLCBhdmN0eC0+d2lkdGgpOworICAgICAgICAgICAgYnVmICs9IGF2Y3R4LT53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIH0KKyAgICBtZW1jcHkoZnJhbWUtPmRhdGFbMV0sIHMtPnBhbCwgc2l6ZW9mKHMtPnBhbCkpOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZmFfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRGZhQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmcy0+ZnJhbWVfYnVmKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2RmYV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJkZmEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDaHJvbm9tYXN0ZXIgREZBIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0RGQSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRGZhQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGZhX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRmYV9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRmYV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kaXJhYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RiOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWMuYwpAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXJjbyBHZXJhcmRzIDxtYXJjb0BnbnUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIENvbnJhZAorICogQ29weXJpZ2h0IChDKSAyMDExIEpvcmRpIE9ydGl6CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIERpcmFjIERlY29kZXIKKyAqIEBhdXRob3IgTWFyY28gR2VyYXJkcyA8bWFyY29AZ251Lm9yZz4sIERhdmlkIENvbnJhZCwgSm9yZGkgT3J0aXogPG5lbmpvcmRpQGdtYWlsLmNvbT4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZGlyYWMuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1wZWcxMmRhdGEuaCIKKworLyogZGVmYXVsdHMgZm9yIHNvdXJjZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgY29uc3QgZGlyYWNfc291cmNlX3BhcmFtcyBkaXJhY19zb3VyY2VfcGFyYW1ldGVyc19kZWZhdWx0c1tdID0geworICAgIHsgIDY0MCwgIDQ4MCwgMiwgMCwgMCwgIDEsIDEsICA2NDAsICA0ODAsIDAsIDAsIDEsIDAgfSwKKyAgICB7ICAxNzYsICAxMjAsIDIsIDAsIDAsICA5LCAyLCAgMTc2LCAgMTIwLCAwLCAwLCAxLCAxIH0sCisgICAgeyAgMTc2LCAgMTQ0LCAyLCAwLCAxLCAxMCwgMywgIDE3NiwgIDE0NCwgMCwgMCwgMSwgMiB9LAorICAgIHsgIDM1MiwgIDI0MCwgMiwgMCwgMCwgIDksIDIsICAzNTIsICAyNDAsIDAsIDAsIDEsIDEgfSwKKyAgICB7ICAzNTIsICAyODgsIDIsIDAsIDEsIDEwLCAzLCAgMzUyLCAgMjg4LCAwLCAwLCAxLCAyIH0sCisgICAgeyAgNzA0LCAgNDgwLCAyLCAwLCAwLCAgOSwgMiwgIDcwNCwgIDQ4MCwgMCwgMCwgMSwgMSB9LAorICAgIHsgIDcwNCwgIDU3NiwgMiwgMCwgMSwgMTAsIDMsICA3MDQsICA1NzYsIDAsIDAsIDEsIDIgfSwKKyAgICB7ICA3MjAsICA0ODAsIDEsIDEsIDAsICA0LCAyLCAgNzA0LCAgNDgwLCA4LCAwLCAzLCAxIH0sCisgICAgeyAgNzIwLCAgNTc2LCAxLCAxLCAxLCAgMywgMywgIDcwNCwgIDU3NiwgOCwgMCwgMywgMiB9LAorCisgICAgeyAxMjgwLCAgNzIwLCAxLCAwLCAxLCAgNywgMSwgMTI4MCwgIDcyMCwgMCwgMCwgMywgMyB9LAorICAgIHsgMTI4MCwgIDcyMCwgMSwgMCwgMSwgIDYsIDEsIDEyODAsICA3MjAsIDAsIDAsIDMsIDMgfSwKKyAgICB7IDE5MjAsIDEwODAsIDEsIDEsIDEsICA0LCAxLCAxOTIwLCAxMDgwLCAwLCAwLCAzLCAzIH0sCisgICAgeyAxOTIwLCAxMDgwLCAxLCAxLCAxLCAgMywgMSwgMTkyMCwgMTA4MCwgMCwgMCwgMywgMyB9LAorICAgIHsgMTkyMCwgMTA4MCwgMSwgMCwgMSwgIDcsIDEsIDE5MjAsIDEwODAsIDAsIDAsIDMsIDMgfSwKKyAgICB7IDE5MjAsIDEwODAsIDEsIDAsIDEsICA2LCAxLCAxOTIwLCAxMDgwLCAwLCAwLCAzLCAzIH0sCisgICAgeyAyMDQ4LCAxMDgwLCAwLCAwLCAxLCAgMiwgMSwgMjA0OCwgMTA4MCwgMCwgMCwgNCwgNCB9LAorICAgIHsgNDA5NiwgMjE2MCwgMCwgMCwgMSwgIDIsIDEsIDQwOTYsIDIxNjAsIDAsIDAsIDQsIDQgfSwKKworICAgIHsgMzg0MCwgMjE2MCwgMSwgMCwgMSwgIDcsIDEsIDM4NDAsIDIxNjAsIDAsIDAsIDMsIDMgfSwKKyAgICB7IDM4NDAsIDIxNjAsIDEsIDAsIDEsICA2LCAxLCAzODQwLCAyMTYwLCAwLCAwLCAzLCAzIH0sCisgICAgeyA3NjgwLCA0MzIwLCAxLCAwLCAxLCAgNywgMSwgMzg0MCwgMjE2MCwgMCwgMCwgMywgMyB9LAorICAgIHsgNzY4MCwgNDMyMCwgMSwgMCwgMSwgIDYsIDEsIDM4NDAsIDIxNjAsIDAsIDAsIDMsIDMgfSwKK307CisKKy8qIFtESVJBQ19TVERdIFRhYmxlIDEwLjQgLSBBdmFpbGFibGUgcHJlc2V0IHBpeGVsIGFzcGVjdCByYXRpbyB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCBBVlJhdGlvbmFsIGRpcmFjX3ByZXNldF9hc3BlY3RfcmF0aW9zW10gPSB7CisgICAgeyAgMSwgIDEgfSwKKyAgICB7IDEwLCAxMSB9LAorICAgIHsgMTIsIDExIH0sCisgICAgeyA0MCwgMzMgfSwKKyAgICB7IDE2LCAxMSB9LAorICAgIHsgIDQsICAzIH0sCit9OworCisvKiBbRElSQUNfU1REXSBWYWx1ZXMgOSwxMCBvZiAxMC4zLjUgRnJhbWUgUmF0ZS4KKyAqIFRhYmxlIDEwLjMgQXZhaWxhYmxlIHByZXNldCBmcmFtZSByYXRlIHZhbHVlcworICovCitzdGF0aWMgY29uc3QgQVZSYXRpb25hbCBkaXJhY19mcmFtZV9yYXRlW10gPSB7CisgICAgeyAxNTAwMCwgMTAwMSB9LAorICAgIHsgICAgMjUsICAgIDIgfSwKK307CisKKy8qIFtESVJBQ19TVERdIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gVGFibGUgMTAuNSBBdmFpbGFibGUgc2lnbmFsCisgKiByYW5nZSBwcmVzZXRzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICAgICAgICAgIGJpdGRlcHRoOworICAgIGVudW0gQVZDb2xvclJhbmdlICAgY29sb3JfcmFuZ2U7Cit9IHBpeGVsX3JhbmdlX3ByZXNldHNbXSA9IHsKKyAgICB7ICA4LCBBVkNPTF9SQU5HRV9KUEVHIH0sCisgICAgeyAgOCwgQVZDT0xfUkFOR0VfTVBFRyB9LAorICAgIHsgMTAsIEFWQ09MX1JBTkdFX01QRUcgfSwKKyAgICB7IDEyLCBBVkNPTF9SQU5HRV9NUEVHIH0sCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVkNvbG9yUHJpbWFyaWVzIGRpcmFjX3ByaW1hcmllc1tdID0geworICAgIEFWQ09MX1BSSV9CVDcwOSwKKyAgICBBVkNPTF9QUklfU01QVEUxNzBNLAorICAgIEFWQ09MX1BSSV9CVDQ3MEJHLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgZW51bSBBVkNvbG9yUHJpbWFyaWVzIGNvbG9yX3ByaW1hcmllczsKKyAgICBlbnVtIEFWQ29sb3JTcGFjZSBjb2xvcnNwYWNlOworICAgIGVudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgY29sb3JfdHJjOworfSBkaXJhY19jb2xvcl9wcmVzZXRzW10gPSB7CisgICAgeyBBVkNPTF9QUklfQlQ3MDksICAgICBBVkNPTF9TUENfQlQ3MDksICAgQVZDT0xfVFJDX0JUNzA5IH0sCisgICAgeyBBVkNPTF9QUklfU01QVEUxNzBNLCBBVkNPTF9TUENfQlQ0NzBCRywgQVZDT0xfVFJDX0JUNzA5IH0sCisgICAgeyBBVkNPTF9QUklfQlQ0NzBCRywgICBBVkNPTF9TUENfQlQ0NzBCRywgQVZDT0xfVFJDX0JUNzA5IH0sCisgICAgeyBBVkNPTF9QUklfQlQ3MDksICAgICBBVkNPTF9TUENfQlQ3MDksICAgQVZDT0xfVFJDX0JUNzA5IH0sCisgICAgeyBBVkNPTF9QUklfQlQ3MDksICAgICBBVkNPTF9TUENfQlQ3MDksICAgQVZDT0xfVFJDX1VOU1BFQ0lGSUVEIC8qIERDaW5lbWEgKi8gfSwKK307CisKKy8qIFtESVJBQ19TVERdIFRhYmxlIDEwLjIgU3VwcG9ydGVkIGNocm9tYSBzYW1wbGluZyBmb3JtYXRzICsgbHVtYSBPZmZzZXQgKi8KK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgZGlyYWNfcGl4X2ZtdFsyXVszXSA9IHsKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDQ0UCwgIEFWX1BJWF9GTVRfWVVWNDIyUCwgIEFWX1BJWF9GTVRfWVVWNDIwUCAgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQyMFAgfSwKK307CisKKy8qIFtESVJBQ19TVERdIDEwLjMgUGFyc2UgU291cmNlIFBhcmFtZXRlcnMuCisgKiBzb3VyY2VfcGFyYW1ldGVycyhiYXNlX3ZpZGVvX2Zvcm1hdCkgKi8KK3N0YXRpYyBpbnQgcGFyc2Vfc291cmNlX3BhcmFtZXRlcnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyYWNfc291cmNlX3BhcmFtcyAqc291cmNlKQoreworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZSA9IHsgMCwgMCB9OworICAgIHVuc2lnbmVkIGx1bWFfZGVwdGggPSA4LCBsdW1hX29mZnNldCA9IDE2OworICAgIGludCBpZHg7CisgICAgaW50IGNocm9tYV94X3NoaWZ0LCBjaHJvbWFfeV9zaGlmdDsKKworICAgIC8qIFtESVJBQ19TVERdIDEwLjMuMiBGcmFtZSBzaXplLiBmcmFtZV9zaXplKHZpZGVvX3BhcmFtcykgKi8KKyAgICAvKiBbRElSQUNfU1REXSBjdXN0b21fZGltZW5zaW9uc19mbGFnICovCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgc291cmNlLT53aWR0aCAgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOyAvKiBbRElSQUNfU1REXSBGUkFNRV9XSURUSCAgKi8KKyAgICAgICAgc291cmNlLT5oZWlnaHQgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOyAvKiBbRElSQUNfU1REXSBGUkFNRV9IRUlHSFQgKi8KKyAgICB9CisKKyAgICAvKiBbRElSQUNfU1REXSAxMC4zLjMgQ2hyb21hIFNhbXBsaW5nIEZvcm1hdC4KKyAgICAgKiAgY2hyb21hX3NhbXBsaW5nX2Zvcm1hdCh2aWRlb19wYXJhbXMpICovCisgICAgLyogW0RJUkFDX1NURF0gY3VzdG9tX2Nocm9tYV9mb3JtYXRfZmxhZyAqLworICAgIGlmIChnZXRfYml0czEoZ2IpKQorICAgICAgICAvKiBbRElSQUNfU1REXSBDSFJPTUFfRk9STUFUX0lOREVYICovCisgICAgICAgIHNvdXJjZS0+Y2hyb21hX2Zvcm1hdCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgaWYgKHNvdXJjZS0+Y2hyb21hX2Zvcm1hdCA+IDJVKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjaHJvbWEgZm9ybWF0ICVkXG4iLAorICAgICAgICAgICAgICAgc291cmNlLT5jaHJvbWFfZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogW0RJUkFDX1NURF0gMTAuMy40IFNjYW4gRm9ybWF0LiBzY2FuX2Zvcm1hdCh2aWRlb19wYXJhbXMpICovCisgICAgLyogW0RJUkFDX1NURF0gY3VzdG9tX3NjYW5fZm9ybWF0X2ZsYWcgKi8KKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgLyogW0RJUkFDX1NURF0gU09VUkNFX1NBTVBMSU5HICovCisgICAgICAgIHNvdXJjZS0+aW50ZXJsYWNlZCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgaWYgKHNvdXJjZS0+aW50ZXJsYWNlZCA+IDFVKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIFtESVJBQ19TVERdIDEwLjMuNSBGcmFtZSBSYXRlLiBmcmFtZV9yYXRlKHZpZGVvX3BhcmFtcykgKi8KKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvKiBbRElSQUNfU1REXSBjdXN0b21fZnJhbWVfcmF0ZV9mbGFnICovCisgICAgICAgIHNvdXJjZS0+ZnJhbWVfcmF0ZV9pbmRleCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisKKyAgICAgICAgaWYgKHNvdXJjZS0+ZnJhbWVfcmF0ZV9pbmRleCA+IDEwVSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGlmICghc291cmNlLT5mcmFtZV9yYXRlX2luZGV4KSB7CisgICAgICAgICAgICAvKiBbRElSQUNfU1REXSBGUkFNRV9SQVRFX05VTUVSICovCisgICAgICAgICAgICBmcmFtZV9yYXRlLm51bSA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgICAgICAvKiBbRElSQUNfU1REXSBGUkFNRV9SQVRFX0RFTk9NICovCisgICAgICAgICAgICBmcmFtZV9yYXRlLmRlbiA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogW0RJUkFDX1NURF0gcHJlc2V0X2ZyYW1lX3JhdGUodmlkZW9fcGFyYW1zLCBpbmRleCkgKi8KKyAgICBpZiAoc291cmNlLT5mcmFtZV9yYXRlX2luZGV4ID4gMCkgeworICAgICAgICBpZiAoc291cmNlLT5mcmFtZV9yYXRlX2luZGV4IDw9IDgpCisgICAgICAgICAgICBmcmFtZV9yYXRlID0gZmZfbXBlZzEyX2ZyYW1lX3JhdGVfdGFiW3NvdXJjZS0+ZnJhbWVfcmF0ZV9pbmRleF07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8qIFtESVJBQ19TVERdIFRhYmxlIDEwLjMgdmFsdWVzIDktMTAgKi8KKyAgICAgICAgICAgIGZyYW1lX3JhdGUgPSBkaXJhY19mcmFtZV9yYXRlW3NvdXJjZS0+ZnJhbWVfcmF0ZV9pbmRleCAtIDldOworICAgIH0KKyAgICBhdmN0eC0+ZnJhbWVyYXRlID0gZnJhbWVfcmF0ZTsKKworICAgIC8qIFtESVJBQ19TVERdIDEwLjMuNiBQaXhlbCBBc3BlY3QgUmF0aW8uCisgICAgICogcGl4ZWxfYXNwZWN0X3JhdGlvKHZpZGVvX3BhcmFtcykgKi8KKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvKiBbRElSQUNfU1REXSBjdXN0b21fcGl4ZWxfYXNwZWN0X3JhdGlvX2ZsYWcgKi8KKyAgICAgICAgLyogW0RJUkFDX1NURF0gaW5kZXggKi8KKyAgICAgICAgc291cmNlLT5hc3BlY3RfcmF0aW9faW5kZXggPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworCisgICAgICAgIGlmIChzb3VyY2UtPmFzcGVjdF9yYXRpb19pbmRleCA+IDZVKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKCFzb3VyY2UtPmFzcGVjdF9yYXRpb19pbmRleCkgeworICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogW0RJUkFDX1NURF0gVGFrZSB2YWx1ZSBmcm9tIFRhYmxlIDEwLjQgQXZhaWxhYmxlIHByZXNldCBwaXhlbAorICAgICAqICBhc3BlY3QgcmF0aW8gdmFsdWVzICovCisgICAgaWYgKHNvdXJjZS0+YXNwZWN0X3JhdGlvX2luZGV4ID4gMCkKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPQorICAgICAgICAgICAgZGlyYWNfcHJlc2V0X2FzcGVjdF9yYXRpb3Nbc291cmNlLT5hc3BlY3RfcmF0aW9faW5kZXggLSAxXTsKKworICAgIC8qIFtESVJBQ19TVERdIDEwLjMuNyBDbGVhbiBhcmVhLiBjbGVhbl9hcmVhKHZpZGVvX3BhcmFtcykgKi8KKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvKiBbRElSQUNfU1REXSBjdXN0b21fY2xlYW5fYXJlYV9mbGFnICovCisgICAgICAgIC8qIFtESVJBQ19TVERdIENMRUFOX1dJRFRIICovCisgICAgICAgIHNvdXJjZS0+Y2xlYW5fd2lkdGggPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAvKiBbRElSQUNfU1REXSBDTEVBTl9IRUlHSFQgKi8KKyAgICAgICAgc291cmNlLT5jbGVhbl9oZWlnaHQgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAvKiBbRElSQUNfU1REXSBDTEVBTl9MRUZUX09GRlNFVCAqLworICAgICAgICBzb3VyY2UtPmNsZWFuX2xlZnRfb2Zmc2V0ID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgLyogW0RJUkFDX1NURF0gQ0xFQU5fUklHSFRfT0ZGU0VUICovCisgICAgICAgIHNvdXJjZS0+Y2xlYW5fcmlnaHRfb2Zmc2V0ID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICB9CisKKyAgICAvKiBbRElSQUNfU1REXSAxMC4zLjggU2lnbmFsIHJhbmdlLiBzaWduYWxfcmFuZ2UodmlkZW9fcGFyYW1zKQorICAgICAqIFdBUk5JTkc6IFNvbWUgYWRhcHRhdGlvbiBzZWVtcyB0byBiZSBkb25lIHVzaW5nIHRoZQorICAgICAqIEFWQ09MX1JBTkdFX01QRUcvSlBFRyB2YWx1ZXMgKi8KKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvKiBbRElSQUNfU1REXSBjdXN0b21fc2lnbmFsX3JhbmdlX2ZsYWcgKi8KKyAgICAgICAgLyogW0RJUkFDX1NURF0gaW5kZXggKi8KKyAgICAgICAgc291cmNlLT5waXhlbF9yYW5nZV9pbmRleCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisKKyAgICAgICAgaWYgKHNvdXJjZS0+cGl4ZWxfcmFuZ2VfaW5kZXggPiA0VSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIC8qIFRoaXMgYXNzdW1lcyBlaXRoZXIgZnVsbHJhbmdlIG9yIE1QRUcgbGV2ZWxzIG9ubHkgKi8KKyAgICAgICAgaWYgKCFzb3VyY2UtPnBpeGVsX3JhbmdlX2luZGV4KSB7CisgICAgICAgICAgICBsdW1hX29mZnNldCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgICAgICBsdW1hX2RlcHRoICA9IGF2X2xvZzIoc3ZxM19nZXRfdWVfZ29sb21iKGdiKSkgKyAxOworICAgICAgICAgICAgc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsgLyogY2hyb21hIG9mZnNldCAgICAqLworICAgICAgICAgICAgc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsgLyogY2hyb21hIGV4Y3Vyc2lvbiAqLworICAgICAgICAgICAgYXZjdHgtPmNvbG9yX3JhbmdlID0gbHVtYV9vZmZzZXQgPyBBVkNPTF9SQU5HRV9NUEVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogW0RJUkFDX1NURF0gVGFibGUgMTAuNQorICAgICAqIEF2YWlsYWJsZSBzaWduYWwgcmFuZ2UgcHJlc2V0cyA8LS0+IHBpeGVsX3JhbmdlX3ByZXNldHMgKi8KKyAgICBpZiAoc291cmNlLT5waXhlbF9yYW5nZV9pbmRleCA+IDApIHsKKyAgICAgICAgaWR4ICAgICAgICAgICAgICAgID0gc291cmNlLT5waXhlbF9yYW5nZV9pbmRleCAtIDE7CisgICAgICAgIGx1bWFfZGVwdGggICAgICAgICA9IHBpeGVsX3JhbmdlX3ByZXNldHNbaWR4XS5iaXRkZXB0aDsKKyAgICAgICAgYXZjdHgtPmNvbG9yX3JhbmdlID0gcGl4ZWxfcmFuZ2VfcHJlc2V0c1tpZHhdLmNvbG9yX3JhbmdlOworICAgIH0KKworICAgIGlmIChsdW1hX2RlcHRoID4gOCkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkJpdGRlcHRoIGdyZWF0ZXIgdGhhbiA4XG4iKTsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gZGlyYWNfcGl4X2ZtdFshbHVtYV9vZmZzZXRdW3NvdXJjZS0+Y2hyb21hX2Zvcm1hdF07CisgICAgYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUoYXZjdHgtPnBpeF9mbXQsICZjaHJvbWFfeF9zaGlmdCwgJmNocm9tYV95X3NoaWZ0KTsKKyAgICBpZiAoKHNvdXJjZS0+d2lkdGggJSAoMTw8Y2hyb21hX3hfc2hpZnQpKSB8fCAoc291cmNlLT5oZWlnaHQgJSAoMTw8Y2hyb21hX3lfc2hpZnQpKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRpbWVuc2lvbnMgbXVzdCBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSBjaHJvbWEgc3Vic2FtcGxpbmdcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKworICAgIC8qIFtESVJBQ19TVERdIDEwLjMuOSBDb2xvdXIgc3BlY2lmaWNhdGlvbi4gY29sb3VyX3NwZWModmlkZW9fcGFyYW1zKSAqLworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7IC8qIFtESVJBQ19TVERdIGN1c3RvbV9jb2xvdXJfc3BlY19mbGFnICovCisgICAgICAgIC8qIFtESVJBQ19TVERdIGluZGV4ICovCisgICAgICAgIGlkeCA9IHNvdXJjZS0+Y29sb3Jfc3BlY19pbmRleCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisKKyAgICAgICAgaWYgKHNvdXJjZS0+Y29sb3Jfc3BlY19pbmRleCA+IDRVKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IGRpcmFjX2NvbG9yX3ByZXNldHNbaWR4XS5jb2xvcl9wcmltYXJpZXM7CisgICAgICAgIGF2Y3R4LT5jb2xvcnNwYWNlICAgICAgPSBkaXJhY19jb2xvcl9wcmVzZXRzW2lkeF0uY29sb3JzcGFjZTsKKyAgICAgICAgYXZjdHgtPmNvbG9yX3RyYyAgICAgICA9IGRpcmFjX2NvbG9yX3ByZXNldHNbaWR4XS5jb2xvcl90cmM7CisKKyAgICAgICAgaWYgKCFzb3VyY2UtPmNvbG9yX3NwZWNfaW5kZXgpIHsKKyAgICAgICAgICAgIC8qIFtESVJBQ19TVERdIDEwLjMuOS4xIENvbG91ciBwcmltYXJpZXMgKi8KKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgaWR4ID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwgM1UpCisgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgPSBkaXJhY19wcmltYXJpZXNbaWR4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFtESVJBQ19TVERdIDEwLjMuOS4yIENvbG91ciBtYXRyaXggKi8KKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgaWR4ID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlkeCkKKyAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWR4ID09IDEpCisgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNDcwQkc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBbRElSQUNfU1REXSAxMC4zLjkuMyBUcmFuc2ZlciBmdW5jdGlvbiAqLworICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikgJiYgIXN2cTNfZ2V0X3VlX2dvbG9tYihnYikpCisgICAgICAgICAgICAgICAgYXZjdHgtPmNvbG9yX3RyYyA9IEFWQ09MX1RSQ19CVDcwOTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlkeCAgICAgICAgICAgICAgICAgICAgPSBzb3VyY2UtPmNvbG9yX3NwZWNfaW5kZXg7CisgICAgICAgIGF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgPSBkaXJhY19jb2xvcl9wcmVzZXRzW2lkeF0uY29sb3JfcHJpbWFyaWVzOworICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSAgICAgID0gZGlyYWNfY29sb3JfcHJlc2V0c1tpZHhdLmNvbG9yc3BhY2U7CisgICAgICAgIGF2Y3R4LT5jb2xvcl90cmMgICAgICAgPSBkaXJhY19jb2xvcl9wcmVzZXRzW2lkeF0uY29sb3JfdHJjOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiBbRElSQUNfU1REXSAxMC4gU2VxdWVuY2UgSGVhZGVyLiBzZXF1ZW5jZV9oZWFkZXIoKSAqLworaW50IGF2cHJpdl9kaXJhY19wYXJzZV9zZXF1ZW5jZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmFjX3NvdXJjZV9wYXJhbXMgKnNvdXJjZSkKK3sKKyAgICB1bnNpZ25lZCB2ZXJzaW9uX21ham9yOworICAgIHVuc2lnbmVkIHZpZGVvX2Zvcm1hdCwgcGljdHVyZV9jb2RpbmdfbW9kZTsKKyAgICBpbnQgcmV0OworCisgICAgLyogW0RJUkFDX1NQRUNdIDEwLjEgUGFyc2UgUGFyYW1ldGVycy4gcGFyc2VfcGFyYW1ldGVycygpICovCisgICAgdmVyc2lvbl9tYWpvciAgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgIHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7IC8qIHZlcnNpb25fbWlub3IgKi8KKyAgICBhdmN0eC0+cHJvZmlsZSA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgYXZjdHgtPmxldmVsICAgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgIC8qIFtESVJBQ19TUEVDXSBzZXF1ZW5jZV9oZWFkZXIoKSAtPiBiYXNlX3ZpZGVvX2Zvcm1hdCBhcyBkZWZpbmVkIGluCisgICAgICogMTAuMiBCYXNlIFZpZGVvIEZvcm1hdCwgdGFibGUgMTAuMSBEaXJhYyBwcmVkZWZpbmVkIHZpZGVvIGZvcm1hdHMgKi8KKyAgICB2aWRlb19mb3JtYXQgICA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisKKyAgICBpZiAodmVyc2lvbl9tYWpvciA8IDIpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJTdHJlYW0gaXMgb2xkIGFuZCBtYXkgbm90IHdvcmtcbiIpOworICAgIGVsc2UgaWYgKHZlcnNpb25fbWFqb3IgPiAyKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiU3RyZWFtIG1heSBoYXZlIHVuaGFuZGxlZCBmZWF0dXJlc1xuIik7CisKKyAgICBpZiAodmlkZW9fZm9ybWF0ID4gMjBVKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIEZpbGwgaW4gZGVmYXVsdHMgZm9yIHRoZSBzb3VyY2UgcGFyYW1ldGVycy4gKi8KKyAgICAqc291cmNlID0gZGlyYWNfc291cmNlX3BhcmFtZXRlcnNfZGVmYXVsdHNbdmlkZW9fZm9ybWF0XTsKKworICAgIC8qIFtESVJBQ19TVERdIDEwLjMgU291cmNlIFBhcmFtZXRlcnMKKyAgICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdHMuICovCisgICAgaWYgKHJldCA9IHBhcnNlX3NvdXJjZV9wYXJhbWV0ZXJzKGF2Y3R4LCBnYiwgc291cmNlKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBzb3VyY2UtPndpZHRoLCBzb3VyY2UtPmhlaWdodCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZl9zZXRfc2FyKGF2Y3R4LCBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyk7CisKKyAgICAvKiBbRElSQUNfU1REXSBwaWN0dXJlX2NvZGluZ19tb2RlIHNoYWxsIGJlIDAgZm9yIGZpZWxkcyBhbmQgMSBmb3IgZnJhbWVzCisgICAgICogY3VycmVudGx5IG9ubHkgdXNlZCB0byBzaWduYWwgZmllbGQgY29kaW5nICovCisgICAgcGljdHVyZV9jb2RpbmdfbW9kZSA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgaWYgKHBpY3R1cmVfY29kaW5nX21vZGUgIT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHBpY3R1cmUgY29kaW5nIG1vZGUgJWRcbiIsCisgICAgICAgICAgICAgICBwaWN0dXJlX2NvZGluZ19tb2RlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2RpcmFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmOTU1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RpcmFjLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXJjbyBHZXJhcmRzIDxtYXJjb0BnbnUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIENvbnJhZAorICogQ29weXJpZ2h0IChDKSAyMDExIEpvcmRpIE9ydGl6CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19ESVJBQ19ICisjZGVmaW5lIEFWQ09ERUNfRElSQUNfSAorCisvKioKKyAqIEBmaWxlCisgKiBJbnRlcmZhY2UgdG8gRGlyYWMgRGVjb2Rlci9FbmNvZGVyCisgKiBAYXV0aG9yIE1hcmNvIEdlcmFyZHMgPG1hcmNvQGdudS5vcmc+CisgKiBAYXV0aG9yIERhdmlkIENvbnJhZAorICogQGF1dGhvciBKb3JkaSBPcnRpegorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgZGlyYWNfc291cmNlX3BhcmFtcyB7CisgICAgdW5zaWduZWQgd2lkdGg7CisgICAgdW5zaWduZWQgaGVpZ2h0OworICAgIHVpbnQ4X3QgY2hyb21hX2Zvcm1hdDsgICAgICAgICAgLy8vPCAwOiA0NDQgIDE6IDQyMiAgMjogNDIwCisKKyAgICB1aW50OF90IGludGVybGFjZWQ7CisgICAgdWludDhfdCB0b3BfZmllbGRfZmlyc3Q7CisKKyAgICB1aW50OF90IGZyYW1lX3JhdGVfaW5kZXg7ICAgICAgIC8vLzwgaW5kZXggaW50byBkaXJhY19mcmFtZV9yYXRlW10KKyAgICB1aW50OF90IGFzcGVjdF9yYXRpb19pbmRleDsgICAgIC8vLzwgaW5kZXggaW50byBkaXJhY19hc3BlY3RfcmF0aW9bXQorCisgICAgdWludDE2X3QgY2xlYW5fd2lkdGg7CisgICAgdWludDE2X3QgY2xlYW5faGVpZ2h0OworICAgIHVpbnQxNl90IGNsZWFuX2xlZnRfb2Zmc2V0OworICAgIHVpbnQxNl90IGNsZWFuX3JpZ2h0X29mZnNldDsKKworICAgIHVpbnQ4X3QgcGl4ZWxfcmFuZ2VfaW5kZXg7ICAgICAgLy8vPCBpbmRleCBpbnRvIGRpcmFjX3BpeGVsX3JhbmdlX3ByZXNldHNbXQorICAgIHVpbnQ4X3QgY29sb3Jfc3BlY19pbmRleDsgICAgICAgLy8vPCBpbmRleCBpbnRvIGRpcmFjX2NvbG9yX3NwZWNfcHJlc2V0c1tdCit9IGRpcmFjX3NvdXJjZV9wYXJhbXM7CisKK2ludCBhdnByaXZfZGlyYWNfcGFyc2Vfc2VxdWVuY2VfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJhY19zb3VyY2VfcGFyYW1zICpzb3VyY2UpOworCisjZW5kaWYgLyogQVZDT0RFQ19ESVJBQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kaXJhY19hcml0aC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWNfYXJpdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjkxMzkyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWNfYXJpdGguYwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXJjbyBHZXJhcmRzIDxtYXJjb0BnbnUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIENvbnJhZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBcml0aG1ldGljIGRlY29kZXIgZm9yIERpcmFjCisgKiBAYXV0aG9yIE1hcmNvIEdlcmFyZHMgPG1hcmNvQGdudS5vcmc+CisgKi8KKworI2luY2x1ZGUgImRpcmFjX2FyaXRoLmgiCisKKworY29uc3QgdWludDE2X3QgZmZfZGlyYWNfcHJvYlsyNTZdID0geworICAgIDAsICAgIDIsICAgIDUsICAgIDgsICAgIDExLCAgIDE1LCAgIDIwLCAgIDI0LAorICAgIDI5LCAgIDM1LCAgIDQxLCAgIDQ3LCAgIDUzLCAgIDYwLCAgIDY3LCAgIDc0LAorICAgIDgyLCAgIDg5LCAgIDk3LCAgIDEwNiwgIDExNCwgIDEyMywgIDEzMiwgIDE0MSwKKyAgICAxNTAsICAxNjAsICAxNzAsICAxODAsICAxOTAsICAyMDEsICAyMTEsICAyMjIsCisgICAgMjMzLCAgMjQ0LCAgMjU2LCAgMjY3LCAgMjc5LCAgMjkxLCAgMzAzLCAgMzE1LAorICAgIDMyNywgIDM0MCwgIDM1MywgIDM2NiwgIDM3OSwgIDM5MiwgIDQwNSwgIDQxOSwKKyAgICA0MzMsICA0NDcsICA0NjEsICA0NzUsICA0ODksICA1MDQsICA1MTgsICA1MzMsCisgICAgNTQ4LCAgNTYzLCAgNTc4LCAgNTkzLCAgNjA5LCAgNjI0LCAgNjQwLCAgNjU2LAorICAgIDY3MiwgIDY4OCwgIDcwNSwgIDcyMSwgIDczOCwgIDc1NCwgIDc3MSwgIDc4OCwKKyAgICA4MDUsICA4MjIsICA4NDAsICA4NTcsICA4NzUsICA4OTIsICA5MTAsICA5MjgsCisgICAgOTQ2LCAgOTY0LCAgOTgzLCAgMTAwMSwgMTAyMCwgMTAzOCwgMTA1NywgMTA3NiwKKyAgICAxMDk1LCAxMTE0LCAxMTMzLCAxMTUzLCAxMTcyLCAxMTkyLCAxMjExLCAxMjMxLAorICAgIDEyNTEsIDEyNzEsIDEyOTEsIDEzMTEsIDEzMzIsIDEzNTIsIDEzNzMsIDEzOTMsCisgICAgMTQxNCwgMTQzNSwgMTQ1NiwgMTQ3NywgMTQ5OCwgMTUyMCwgMTU0MSwgMTU2MiwKKyAgICAxNTg0LCAxNjA2LCAxNjI4LCAxNjQ5LCAxNjcxLCAxNjk0LCAxNzE2LCAxNzM4LAorICAgIDE3NjAsIDE3ODMsIDE4MDYsIDE4MjgsIDE4NTEsIDE4NzQsIDE4OTcsIDE5MjAsCisgICAgMTkzNSwgMTk0MiwgMTk0OSwgMTk1NSwgMTk2MSwgMTk2OCwgMTk3NCwgMTk4MCwKKyAgICAxOTg1LCAxOTkxLCAxOTk2LCAyMDAxLCAyMDA2LCAyMDExLCAyMDE2LCAyMDIxLAorICAgIDIwMjUsIDIwMjksIDIwMzMsIDIwMzcsIDIwNDAsIDIwNDQsIDIwNDcsIDIwNTAsCisgICAgMjA1MywgMjA1NiwgMjA1OCwgMjA2MSwgMjA2MywgMjA2NSwgMjA2NiwgMjA2OCwKKyAgICAyMDY5LCAyMDcwLCAyMDcxLCAyMDcyLCAyMDcyLCAyMDcyLCAyMDcyLCAyMDcyLAorICAgIDIwNzIsIDIwNzEsIDIwNzAsIDIwNjksIDIwNjgsIDIwNjYsIDIwNjUsIDIwNjMsCisgICAgMjA2MCwgMjA1OCwgMjA1NSwgMjA1MiwgMjA0OSwgMjA0NSwgMjA0MiwgMjAzOCwKKyAgICAyMDMzLCAyMDI5LCAyMDI0LCAyMDE5LCAyMDEzLCAyMDA4LCAyMDAyLCAxOTk2LAorICAgIDE5ODksIDE5ODIsIDE5NzUsIDE5NjgsIDE5NjAsIDE5NTIsIDE5NDMsIDE5MzQsCisgICAgMTkyNSwgMTkxNiwgMTkwNiwgMTg5NiwgMTg4NSwgMTg3NCwgMTg2MywgMTg1MSwKKyAgICAxODM5LCAxODI3LCAxODE0LCAxODAwLCAxNzg2LCAxNzcyLCAxNzU3LCAxNzQyLAorICAgIDE3MjcsIDE3MTAsIDE2OTQsIDE2NzYsIDE2NTksIDE2NDAsIDE2MjIsIDE2MDIsCisgICAgMTU4MiwgMTU2MSwgMTU0MCwgMTUxOCwgMTQ5NSwgMTQ3MSwgMTQ0NywgMTQyMiwKKyAgICAxMzk2LCAxMzY5LCAxMzQxLCAxMzEyLCAxMjgyLCAxMjUxLCAxMjE5LCAxMTg2LAorICAgIDExNTEsIDExMTQsIDEwNzcsIDEwMzcsIDk5NSwgIDk1MiwgIDkwNiwgIDg1NywKKyAgICA4MDUsICA3NTAsICA2OTAsICA2MjUsICA1NTMsICA0NzEsICAzNzYsICAyNTUKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfZGlyYWNfbmV4dF9jdHhbRElSQUNfQ1RYX0NPVU5UXSA9IHsKKyAgICBbQ1RYX1pQWk5fRjFdICAgPSBDVFhfWlBfRjIsCisgICAgW0NUWF9aUE5OX0YxXSAgID0gQ1RYX1pQX0YyLAorICAgIFtDVFhfWlBfRjJdICAgICA9IENUWF9aUF9GMywKKyAgICBbQ1RYX1pQX0YzXSAgICAgPSBDVFhfWlBfRjQsCisgICAgW0NUWF9aUF9GNF0gICAgID0gQ1RYX1pQX0Y1LAorICAgIFtDVFhfWlBfRjVdICAgICA9IENUWF9aUF9GNiwKKyAgICBbQ1RYX1pQX0Y2XSAgICAgPSBDVFhfWlBfRjYsCisgICAgW0NUWF9OUFpOX0YxXSAgID0gQ1RYX05QX0YyLAorICAgIFtDVFhfTlBOTl9GMV0gICA9IENUWF9OUF9GMiwKKyAgICBbQ1RYX05QX0YyXSAgICAgPSBDVFhfTlBfRjMsCisgICAgW0NUWF9OUF9GM10gICAgID0gQ1RYX05QX0Y0LAorICAgIFtDVFhfTlBfRjRdICAgICA9IENUWF9OUF9GNSwKKyAgICBbQ1RYX05QX0Y1XSAgICAgPSBDVFhfTlBfRjYsCisgICAgW0NUWF9OUF9GNl0gICAgID0gQ1RYX05QX0Y2LAorICAgIFtDVFhfREVMVEFfUV9GXSA9IENUWF9ERUxUQV9RX0YsCit9OworCitpbnQxNl90IGZmX2RpcmFjX3Byb2JfYnJhbmNobGVzc1syNTZdWzJdOworCit2b2lkIGZmX2RpcmFjX2luaXRfYXJpdGhfZGVjb2RlcihEaXJhY0FyaXRoICpjLCBHZXRCaXRDb250ZXh0ICpnYiwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgaTsKKyAgICBhbGlnbl9nZXRfYml0cyhnYik7CisKKyAgICBsZW5ndGggPSBGRk1JTihsZW5ndGgsIGdldF9iaXRzX2xlZnQoZ2IpLzgpOworCisgICAgYy0+Ynl0ZXN0cmVhbSAgICAgPSBnYi0+YnVmZmVyICsgZ2V0X2JpdHNfY291bnQoZ2IpLzg7CisgICAgYy0+Ynl0ZXN0cmVhbV9lbmQgPSBjLT5ieXRlc3RyZWFtICsgbGVuZ3RoOworICAgIHNraXBfYml0c19sb25nKGdiLCBsZW5ndGgqOCk7CisKKyAgICBjLT5sb3cgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgYy0+bG93IDw8PSA4OworICAgICAgICBpZiAoYy0+Ynl0ZXN0cmVhbSA8IGMtPmJ5dGVzdHJlYW1fZW5kKQorICAgICAgICAgICAgYy0+bG93IHw9ICpjLT5ieXRlc3RyZWFtKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGMtPmxvdyB8PSAweGZmOworICAgIH0KKworICAgIGMtPmNvdW50ZXIgPSAtMTY7CisgICAgYy0+cmFuZ2UgICA9IDB4ZmZmZjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBmZl9kaXJhY19wcm9iX2JyYW5jaGxlc3NbaV1bMF0gPSAgZmZfZGlyYWNfcHJvYlsyNTUtaV07CisgICAgICAgIGZmX2RpcmFjX3Byb2JfYnJhbmNobGVzc1tpXVsxXSA9IC1mZl9kaXJhY19wcm9iW2ldOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBESVJBQ19DVFhfQ09VTlQ7IGkrKykKKyAgICAgICAgYy0+Y29udGV4dHNbaV0gPSAweDgwMDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kaXJhY19hcml0aC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWNfYXJpdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDM0MzBhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWNfYXJpdGguaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXJjbyBHZXJhcmRzIDxtYXJjb0BnbnUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIENvbnJhZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBcml0aG1ldGljIGRlY29kZXIgZm9yIERpcmFjCisgKiBAYXV0aG9yIE1hcmNvIEdlcmFyZHMgPG1hcmNvQGdudS5vcmc+CisgKi8KKworI2lmbmRlZiBBVkNPREVDX0RJUkFDX0FSSVRIX0gKKyNkZWZpbmUgQVZDT0RFQ19ESVJBQ19BUklUSF9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorCitlbnVtIGRpcmFjX2FyaXRoX2NvbnRleHRzIHsKKyAgICBDVFhfWlBaTl9GMSwKKyAgICBDVFhfWlBOTl9GMSwKKyAgICBDVFhfTlBaTl9GMSwKKyAgICBDVFhfTlBOTl9GMSwKKyAgICBDVFhfWlBfRjIsCisgICAgQ1RYX1pQX0YzLAorICAgIENUWF9aUF9GNCwKKyAgICBDVFhfWlBfRjUsCisgICAgQ1RYX1pQX0Y2LAorICAgIENUWF9OUF9GMiwKKyAgICBDVFhfTlBfRjMsCisgICAgQ1RYX05QX0Y0LAorICAgIENUWF9OUF9GNSwKKyAgICBDVFhfTlBfRjYsCisgICAgQ1RYX0NPRUZGX0RBVEEsCisgICAgQ1RYX1NJR05fTkVHLAorICAgIENUWF9TSUdOX1pFUk8sCisgICAgQ1RYX1NJR05fUE9TLAorICAgIENUWF9aRVJPX0JMT0NLLAorICAgIENUWF9ERUxUQV9RX0YsCisgICAgQ1RYX0RFTFRBX1FfREFUQSwKKyAgICBDVFhfREVMVEFfUV9TSUdOLAorCisgICAgRElSQUNfQ1RYX0NPVU5UCit9OworCisvLyBEaXJhYyByZXNldHMgdGhlIGFyaXRoIGRlY29kZXIgYmV0d2VlbiBkZWNvZGluZyB2YXJpb3VzIHR5cGVzIG9mIGRhdGEsCisvLyBzbyBtYW55IGNvbnRleHRzIGFyZSBuZXZlciB1c2VkIHNpbXVsdGFuZW91c2x5LiBUaHVzLCB3ZSBjYW4gcmVkdWNlCisvLyB0aGUgbnVtYmVyIG9mIGNvbnRleHRzIG5lZWRlZCBieSByZXVzaW5nIHRoZW0uCisjZGVmaW5lIENUWF9TQl9GMSAgICAgICAgQ1RYX1pQX0Y1CisjZGVmaW5lIENUWF9TQl9EQVRBICAgICAgMAorI2RlZmluZSBDVFhfUE1PREVfUkVGMSAgIDAKKyNkZWZpbmUgQ1RYX1BNT0RFX1JFRjIgICAxCisjZGVmaW5lIENUWF9HTE9CQUxfQkxPQ0sgMgorI2RlZmluZSBDVFhfTVZfRjEgICAgICAgIENUWF9aUF9GMgorI2RlZmluZSBDVFhfTVZfREFUQSAgICAgIDAKKyNkZWZpbmUgQ1RYX0RDX0YxICAgICAgICBDVFhfWlBfRjUKKyNkZWZpbmUgQ1RYX0RDX0RBVEEgICAgICAwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBsb3c7CisgICAgdWludDE2X3QgcmFuZ2U7CisgICAgaW50MTZfdCAgY291bnRlcjsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJ5dGVzdHJlYW07CisgICAgY29uc3QgdWludDhfdCAqYnl0ZXN0cmVhbV9lbmQ7CisKKyAgICB1aW50MTZfdCBjb250ZXh0c1tESVJBQ19DVFhfQ09VTlRdOworfSBEaXJhY0FyaXRoOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9kaXJhY19uZXh0X2N0eFtESVJBQ19DVFhfQ09VTlRdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX2RpcmFjX3Byb2JbMjU2XTsKK2V4dGVybiBpbnQxNl90IGZmX2RpcmFjX3Byb2JfYnJhbmNobGVzc1syNTZdWzJdOworCitzdGF0aWMgaW5saW5lIHZvaWQgcmVub3JtKERpcmFjQXJpdGggKmMpCit7CisjaWYgSEFWRV9GQVNUX0NMWgorICAgIGludCBzaGlmdCA9IDE0IC0gYXZfbG9nMl8xNmJpdChjLT5yYW5nZS0xKSArICgoYy0+cmFuZ2UtMSk+PjE1KTsKKworICAgIGMtPmxvdyAgICA8PD0gc2hpZnQ7CisgICAgYy0+cmFuZ2UgIDw8PSBzaGlmdDsKKyAgICBjLT5jb3VudGVyICs9IHNoaWZ0OworI2Vsc2UKKyAgICB3aGlsZSAoYy0+cmFuZ2UgPD0gMHg0MDAwKSB7CisgICAgICAgIGMtPmxvdyAgIDw8PSAxOworICAgICAgICBjLT5yYW5nZSA8PD0gMTsKKyAgICAgICAgYy0+Y291bnRlcisrOworICAgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVmaWxsKERpcmFjQXJpdGggKmMpCit7CisgICAgaW50IGNvdW50ZXIgPSBjLT5jb3VudGVyOworCisgICAgaWYgKGNvdW50ZXIgPj0gMCkgeworICAgICAgICBpbnQgbmV3ID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYy0+Ynl0ZXN0cmVhbSk7CisKKyAgICAgICAgLy8gdGhlIHNwZWMgZGVmaW5lcyBvdmVycmVhZCBiaXRzIHRvIGJlIDEsIGFuZCBzdHJlYW1zIHJlbHkgb24gdGhpcworICAgICAgICBpZiAoYy0+Ynl0ZXN0cmVhbSA+IGMtPmJ5dGVzdHJlYW1fZW5kKSB7CisgICAgICAgICAgICBuZXcgfD0gMHhmZjsKKyAgICAgICAgICAgIGlmIChjLT5ieXRlc3RyZWFtID4gYy0+Ynl0ZXN0cmVhbV9lbmQrMSkKKyAgICAgICAgICAgICAgICBuZXcgfD0gMHhmZjAwOworCisgICAgICAgICAgICBjLT5ieXRlc3RyZWFtID0gYy0+Ynl0ZXN0cmVhbV9lbmQ7CisgICAgICAgIH0KKworICAgICAgICBjLT5sb3cgKz0gbmV3IDw8IGNvdW50ZXI7CisgICAgICAgIGNvdW50ZXIgLT0gMTY7CisgICAgfQorICAgIGMtPmNvdW50ZXIgPSBjb3VudGVyOworfQorCitzdGF0aWMgaW5saW5lIGludCBkaXJhY19nZXRfYXJpdGhfYml0KERpcmFjQXJpdGggKmMsIGludCBjdHgpCit7CisgICAgaW50IHByb2JfemVybyA9IGMtPmNvbnRleHRzW2N0eF07CisgICAgaW50IHJhbmdlX3RpbWVzX3Byb2IsIGJpdDsKKyAgICB1bnNpZ25lZCBsb3cgPSBjLT5sb3c7CisgICAgaW50ICAgIHJhbmdlID0gYy0+cmFuZ2U7CisKKyAgICByYW5nZV90aW1lc19wcm9iID0gKGMtPnJhbmdlICogcHJvYl96ZXJvKSA+PiAxNjsKKworI2lmIEFSQ0hfWDg2ICYmIEhBVkVfRkFTVF9DTU9WICYmIEhBVkVfSU5MSU5FX0FTTSAmJiBIQVZFXzZSRUdTCisgICAgbG93ICAgLT0gcmFuZ2VfdGltZXNfcHJvYiA8PCAxNjsKKyAgICByYW5nZSAtPSByYW5nZV90aW1lc19wcm9iOworICAgIGJpdCA9IDA7CisgICAgX19hc21fXygKKyAgICAgICAgImNtcGwgICAlNSwgJTQgXG5cdCIKKyAgICAgICAgInNldGFlICAlYjAgICAgXG5cdCIKKyAgICAgICAgImNtb3ZiICAlMywgJTIgXG5cdCIKKyAgICAgICAgImNtb3ZiICAlNSwgJTEgXG5cdCIKKyAgICAgICAgOiAiK3EiKGJpdCksICIrciIocmFuZ2UpLCAiK3IiKGxvdykKKyAgICAgICAgOiAiciIoYy0+bG93KSwgInIiKGMtPmxvdz4+MTYpLAorICAgICAgICAgICJyIihyYW5nZV90aW1lc19wcm9iKQorICAgICk7CisjZWxzZQorICAgIGJpdCA9IChsb3cgPj4gMTYpID49IHJhbmdlX3RpbWVzX3Byb2I7CisgICAgaWYgKGJpdCkgeworICAgICAgICBsb3cgICAtPSByYW5nZV90aW1lc19wcm9iIDw8IDE2OworICAgICAgICByYW5nZSAtPSByYW5nZV90aW1lc19wcm9iOworICAgIH0gZWxzZSB7CisgICAgICAgIHJhbmdlICA9IHJhbmdlX3RpbWVzX3Byb2I7CisgICAgfQorI2VuZGlmCisKKyAgICBjLT5jb250ZXh0c1tjdHhdICs9IGZmX2RpcmFjX3Byb2JfYnJhbmNobGVzc1twcm9iX3plcm8+PjhdW2JpdF07CisgICAgYy0+bG93ICAgPSBsb3c7CisgICAgYy0+cmFuZ2UgPSByYW5nZTsKKworICAgIHJlbm9ybShjKTsKKyAgICByZWZpbGwoYyk7CisgICAgcmV0dXJuIGJpdDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGlyYWNfZ2V0X2FyaXRoX3VpbnQoRGlyYWNBcml0aCAqYywgaW50IGZvbGxvd19jdHgsIGludCBkYXRhX2N0eCkKK3sKKyAgICBpbnQgcmV0ID0gMTsKKyAgICB3aGlsZSAoIWRpcmFjX2dldF9hcml0aF9iaXQoYywgZm9sbG93X2N0eCkpIHsKKyAgICAgICAgaWYgKHJldCA+PSAweDQwMDAwMDAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiZGlyYWNfZ2V0X2FyaXRoX3VpbnQgb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldCA8PD0gMTsKKyAgICAgICAgcmV0ICs9IGRpcmFjX2dldF9hcml0aF9iaXQoYywgZGF0YV9jdHgpOworICAgICAgICBmb2xsb3dfY3R4ID0gZmZfZGlyYWNfbmV4dF9jdHhbZm9sbG93X2N0eF07CisgICAgfQorICAgIHJldHVybiByZXQtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGlyYWNfZ2V0X2FyaXRoX2ludChEaXJhY0FyaXRoICpjLCBpbnQgZm9sbG93X2N0eCwgaW50IGRhdGFfY3R4KQoreworICAgIGludCByZXQgPSBkaXJhY19nZXRfYXJpdGhfdWludChjLCBmb2xsb3dfY3R4LCBkYXRhX2N0eCk7CisgICAgaWYgKHJldCAmJiBkaXJhY19nZXRfYXJpdGhfYml0KGMsIGRhdGFfY3R4KzEpKQorICAgICAgICByZXQgPSAtcmV0OworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZmZfZGlyYWNfaW5pdF9hcml0aF9kZWNvZGVyKERpcmFjQXJpdGggKmMsIEdldEJpdENvbnRleHQgKmdiLCBpbnQgbGVuZ3RoKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfRElSQUNfQVJJVEhfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWNfZHd0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kaXJhY19kd3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmQ4YmFlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWNfZHd0LmMKQEAgLTAsMCArMSw1NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkIENvbnJhZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAiZGlyYWNfZHd0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy94ODYvZGlyYWNfZHd0LmgiCisKKworc3RhdGljIGlubGluZSBpbnQgbWlycm9yKGludCB2LCBpbnQgbSkKK3sKKyAgICB3aGlsZSAoKHVuc2lnbmVkKXYgPiAodW5zaWduZWQpbSkgeworICAgICAgICB2ID0gLXY7CisgICAgICAgIGlmICh2IDwgMCkKKyAgICAgICAgICAgIHYgKz0gMiAqIG07CisgICAgfQorICAgIHJldHVybiB2OworfQorCitzdGF0aWMgdm9pZCB2ZXJ0aWNhbF9jb21wb3NlNTNpTDAoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgYjFbaV0gLT0gKGIwW2ldICsgYjJbaV0gKyAyKSA+PiAyOworfQorCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIGludGVybGVhdmUoSURXVEVMRU0gKmRzdCwgSURXVEVMRU0gKnNyYzAsIElEV1RFTEVNICpzcmMxLCBpbnQgdzIsIGludCBhZGQsIGludCBzaGlmdCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdzI7IGkrKykgeworICAgICAgICBkc3RbMippICBdID0gKHNyYzBbaV0gKyBhZGQpID4+IHNoaWZ0OworICAgICAgICBkc3RbMippKzFdID0gKHNyYzFbaV0gKyBhZGQpID4+IHNoaWZ0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgaG9yaXpvbnRhbF9jb21wb3NlX2RpcmFjNTNpKElEV1RFTEVNICpiLCBJRFdURUxFTSAqdGVtcCwgaW50IHcpCit7CisgICAgY29uc3QgaW50IHcyID0gdyA+PiAxOworICAgIGludCB4OworCisgICAgdGVtcFswXSA9IENPTVBPU0VfNTNpTDAoYlt3Ml0sIGJbMF0sIGJbdzJdKTsKKyAgICBmb3IgKHggPSAxOyB4IDwgdzI7IHgrKykgeworICAgICAgICB0ZW1wW3ggICAgIF0gPSBDT01QT1NFXzUzaUwwICAgICAoYlt4K3cyLTFdLCBiW3ggICAgIF0sIGJbeCt3Ml0pOworICAgICAgICB0ZW1wW3grdzItMV0gPSBDT01QT1NFX0RJUkFDNTNpSDAodGVtcFt4LTFdLCBiW3grdzItMV0sIHRlbXBbeF0pOworICAgIH0KKyAgICB0ZW1wW3ctMV0gPSBDT01QT1NFX0RJUkFDNTNpSDAodGVtcFt3Mi0xXSwgYlt3LTFdLCB0ZW1wW3cyLTFdKTsKKworICAgIGludGVybGVhdmUoYiwgdGVtcCwgdGVtcCt3MiwgdzIsIDEsIDEpOworfQorCitzdGF0aWMgdm9pZCBob3Jpem9udGFsX2NvbXBvc2VfZGQ5N2koSURXVEVMRU0gKmIsIElEV1RFTEVNICp0bXAsIGludCB3KQoreworICAgIGNvbnN0IGludCB3MiA9IHcgPj4gMTsKKyAgICBpbnQgeDsKKworICAgIHRtcFswXSA9IENPTVBPU0VfNTNpTDAoYlt3Ml0sIGJbMF0sIGJbdzJdKTsKKyAgICBmb3IgKHggPSAxOyB4IDwgdzI7IHgrKykKKyAgICAgICAgdG1wW3hdID0gQ09NUE9TRV81M2lMMChiW3grdzItMV0sIGJbeF0sIGJbeCt3Ml0pOworCisgICAgLy8gZXh0ZW5kIHRoZSBlZGdlcworICAgIHRtcFstMV0gICA9IHRtcFswXTsKKyAgICB0bXBbdzIrMV0gPSB0bXBbdzJdID0gdG1wW3cyLTFdOworCisgICAgZm9yICh4ID0gMDsgeCA8IHcyOyB4KyspIHsKKyAgICAgICAgYlsyKnggIF0gPSAodG1wW3hdICsgMSk+PjE7CisgICAgICAgIGJbMip4KzFdID0gKENPTVBPU0VfREQ5N2lIMCh0bXBbeC0xXSwgdG1wW3hdLCBiW3grdzJdLCB0bXBbeCsxXSwgdG1wW3grMl0pICsgMSk+PjE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBob3Jpem9udGFsX2NvbXBvc2VfZGQxMzdpKElEV1RFTEVNICpiLCBJRFdURUxFTSAqdG1wLCBpbnQgdykKK3sKKyAgICBjb25zdCBpbnQgdzIgPSB3ID4+IDE7CisgICAgaW50IHg7CisKKyAgICB0bXBbMF0gPSBDT01QT1NFX0REMTM3aUwwKGJbdzJdLCBiW3cyXSwgYlswXSwgYlt3MiAgXSwgYlt3MisxXSk7CisgICAgdG1wWzFdID0gQ09NUE9TRV9ERDEzN2lMMChiW3cyXSwgYlt3Ml0sIGJbMV0sIGJbdzIrMV0sIGJbdzIrMl0pOworICAgIGZvciAoeCA9IDI7IHggPCB3Mi0xOyB4KyspCisgICAgICAgIHRtcFt4XSA9IENPTVBPU0VfREQxMzdpTDAoYlt4K3cyLTJdLCBiW3grdzItMV0sIGJbeF0sIGJbeCt3Ml0sIGJbeCt3MisxXSk7CisgICAgdG1wW3cyLTFdID0gQ09NUE9TRV9ERDEzN2lMMChiW3ctM10sIGJbdy0yXSwgYlt3Mi0xXSwgYlt3LTFdLCBiW3ctMV0pOworCisgICAgLy8gZXh0ZW5kIHRoZSBlZGdlcworICAgIHRtcFstMV0gICA9IHRtcFswXTsKKyAgICB0bXBbdzIrMV0gPSB0bXBbdzJdID0gdG1wW3cyLTFdOworCisgICAgZm9yICh4ID0gMDsgeCA8IHcyOyB4KyspIHsKKyAgICAgICAgYlsyKnggIF0gPSAodG1wW3hdICsgMSk+PjE7CisgICAgICAgIGJbMip4KzFdID0gKENPTVBPU0VfREQ5N2lIMCh0bXBbeC0xXSwgdG1wW3hdLCBiW3grdzJdLCB0bXBbeCsxXSwgdG1wW3grMl0pICsgMSk+PjE7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZQordm9pZCBob3Jpem9udGFsX2NvbXBvc2VfaGFhcmkoSURXVEVMRU0gKmIsIElEV1RFTEVNICp0ZW1wLCBpbnQgdywgaW50IHNoaWZ0KQoreworICAgIGNvbnN0IGludCB3MiA9IHcgPj4gMTsKKyAgICBpbnQgeDsKKworICAgIGZvciAoeCA9IDA7IHggPCB3MjsgeCsrKSB7CisgICAgICAgIHRlbXBbeCAgIF0gPSBDT01QT1NFX0hBQVJpTDAoYlt4ICAgXSwgYlt4K3cyXSk7CisgICAgICAgIHRlbXBbeCt3Ml0gPSBDT01QT1NFX0hBQVJpSDAoYlt4K3cyXSwgdGVtcFt4XSk7CisgICAgfQorCisgICAgaW50ZXJsZWF2ZShiLCB0ZW1wLCB0ZW1wK3cyLCB3Miwgc2hpZnQsIHNoaWZ0KTsKK30KKworc3RhdGljIHZvaWQgaG9yaXpvbnRhbF9jb21wb3NlX2hhYXIwaShJRFdURUxFTSAqYiwgSURXVEVMRU0gKnRlbXAsIGludCB3KQoreworICAgIGhvcml6b250YWxfY29tcG9zZV9oYWFyaShiLCB0ZW1wLCB3LCAwKTsKK30KKworc3RhdGljIHZvaWQgaG9yaXpvbnRhbF9jb21wb3NlX2hhYXIxaShJRFdURUxFTSAqYiwgSURXVEVMRU0gKnRlbXAsIGludCB3KQoreworICAgIGhvcml6b250YWxfY29tcG9zZV9oYWFyaShiLCB0ZW1wLCB3LCAxKTsKK30KKworc3RhdGljIHZvaWQgaG9yaXpvbnRhbF9jb21wb3NlX2ZpZGVsaXR5aShJRFdURUxFTSAqYiwgSURXVEVMRU0gKnRtcCwgaW50IHcpCit7CisgICAgY29uc3QgaW50IHcyID0gdyA+PiAxOworICAgIGludCBpLCB4OworICAgIElEV1RFTEVNIHZbOF07CisKKyAgICBmb3IgKHggPSAwOyB4IDwgdzI7IHgrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgdltpXSA9IGJbYXZfY2xpcCh4LTMraSwgMCwgdzItMSldOworICAgICAgICB0bXBbeF0gPSBDT01QT1NFX0ZJREVMSVRZaUgwKHZbMF0sIHZbMV0sIHZbMl0sIHZbM10sIGJbeCt3Ml0sIHZbNF0sIHZbNV0sIHZbNl0sIHZbN10pOworICAgIH0KKworICAgIGZvciAoeCA9IDA7IHggPCB3MjsgeCsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICB2W2ldID0gdG1wW2F2X2NsaXAoeC00K2ksIDAsIHcyLTEpXTsKKyAgICAgICAgdG1wW3grdzJdID0gQ09NUE9TRV9GSURFTElUWWlMMCh2WzBdLCB2WzFdLCB2WzJdLCB2WzNdLCBiW3hdLCB2WzRdLCB2WzVdLCB2WzZdLCB2WzddKTsKKyAgICB9CisKKyAgICBpbnRlcmxlYXZlKGIsIHRtcCt3MiwgdG1wLCB3MiwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhvcml6b250YWxfY29tcG9zZV9kYXViOTdpKElEV1RFTEVNICpiLCBJRFdURUxFTSAqdGVtcCwgaW50IHcpCit7CisgICAgY29uc3QgaW50IHcyID0gdyA+PiAxOworICAgIGludCB4LCBiMCwgYjEsIGIyOworCisgICAgdGVtcFswXSA9IENPTVBPU0VfREFVQjk3aUwxKGJbdzJdLCBiWzBdLCBiW3cyXSk7CisgICAgZm9yICh4ID0gMTsgeCA8IHcyOyB4KyspIHsKKyAgICAgICAgdGVtcFt4ICAgICBdID0gQ09NUE9TRV9EQVVCOTdpTDEoYlt4K3cyLTFdLCBiW3ggICAgIF0sIGJbeCt3Ml0pOworICAgICAgICB0ZW1wW3grdzItMV0gPSBDT01QT1NFX0RBVUI5N2lIMSh0ZW1wW3gtMV0sIGJbeCt3Mi0xXSwgdGVtcFt4XSk7CisgICAgfQorICAgIHRlbXBbdy0xXSA9IENPTVBPU0VfREFVQjk3aUgxKHRlbXBbdzItMV0sIGJbdy0xXSwgdGVtcFt3Mi0xXSk7CisKKyAgICAvLyBzZWNvbmQgc3RhZ2UgY29tYmluZWQgd2l0aCBpbnRlcmxlYXZlIGFuZCBzaGlmdAorICAgIGIwID0gYjIgPSBDT01QT1NFX0RBVUI5N2lMMCh0ZW1wW3cyXSwgdGVtcFswXSwgdGVtcFt3Ml0pOworICAgIGJbMF0gPSAoYjAgKyAxKSA+PiAxOworICAgIGZvciAoeCA9IDE7IHggPCB3MjsgeCsrKSB7CisgICAgICAgIGIyID0gQ09NUE9TRV9EQVVCOTdpTDAodGVtcFt4K3cyLTFdLCB0ZW1wW3ggICAgIF0sIHRlbXBbeCt3Ml0pOworICAgICAgICBiMSA9IENPTVBPU0VfREFVQjk3aUgwKCAgICAgICAgICBiMCwgdGVtcFt4K3cyLTFdLCBiMiAgICAgICAgKTsKKyAgICAgICAgYlsyKngtMV0gPSAoYjEgKyAxKSA+PiAxOworICAgICAgICBiWzIqeCAgXSA9IChiMiArIDEpID4+IDE7CisgICAgICAgIGIwID0gYjI7CisgICAgfQorICAgIGJbdy0xXSA9IChDT01QT1NFX0RBVUI5N2lIMChiMiwgdGVtcFt3LTFdLCBiMikgKyAxKSA+PiAxOworfQorCitzdGF0aWMgdm9pZCB2ZXJ0aWNhbF9jb21wb3NlX2RpcmFjNTNpSDAoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSsrKXsKKyAgICAgICAgYjFbaV0gPSBDT01QT1NFX0RJUkFDNTNpSDAoYjBbaV0sIGIxW2ldLCBiMltpXSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2ZXJ0aWNhbF9jb21wb3NlX2RkOTdpSDAoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRFdURUxFTSAqYjMsIElEV1RFTEVNICpiNCwgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSsrKXsKKyAgICAgICAgYjJbaV0gPSBDT01QT1NFX0REOTdpSDAoYjBbaV0sIGIxW2ldLCBiMltpXSwgYjNbaV0sIGI0W2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZlcnRpY2FsX2NvbXBvc2VfZGQxMzdpTDAoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURXVEVMRU0gKmIzLCBJRFdURUxFTSAqYjQsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrKyl7CisgICAgICAgIGIyW2ldID0gQ09NUE9TRV9ERDEzN2lMMChiMFtpXSwgYjFbaV0sIGIyW2ldLCBiM1tpXSwgYjRbaV0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZV9oYWFyKElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBiMFtpXSA9IENPTVBPU0VfSEFBUmlMMChiMFtpXSwgYjFbaV0pOworICAgICAgICBiMVtpXSA9IENPTVBPU0VfSEFBUmlIMChiMVtpXSwgYjBbaV0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZV9maWRlbGl0eWlIMChJRFdURUxFTSAqZHN0LCBJRFdURUxFTSAqYls4XSwgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSsrKXsKKyAgICAgICAgZHN0W2ldID0gQ09NUE9TRV9GSURFTElUWWlIMChiWzBdW2ldLCBiWzFdW2ldLCBiWzJdW2ldLCBiWzNdW2ldLCBkc3RbaV0sIGJbNF1baV0sIGJbNV1baV0sIGJbNl1baV0sIGJbN11baV0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZV9maWRlbGl0eWlMMChJRFdURUxFTSAqZHN0LCBJRFdURUxFTSAqYls4XSwgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSsrKXsKKyAgICAgICAgZHN0W2ldID0gQ09NUE9TRV9GSURFTElUWWlMMChiWzBdW2ldLCBiWzFdW2ldLCBiWzJdW2ldLCBiWzNdW2ldLCBkc3RbaV0sIGJbNF1baV0sIGJbNV1baV0sIGJbNl1baV0sIGJbN11baV0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZV9kYXViOTdpSDAoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSsrKXsKKyAgICAgICAgYjFbaV0gPSBDT01QT1NFX0RBVUI5N2lIMChiMFtpXSwgYjFbaV0sIGIyW2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZlcnRpY2FsX2NvbXBvc2VfZGF1Yjk3aUgxKElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBJRFdURUxFTSAqYjIsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrKyl7CisgICAgICAgIGIxW2ldID0gQ09NUE9TRV9EQVVCOTdpSDEoYjBbaV0sIGIxW2ldLCBiMltpXSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2ZXJ0aWNhbF9jb21wb3NlX2RhdWI5N2lMMChJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgSURXVEVMRU0gKmIyLCBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKyspeworICAgICAgICBiMVtpXSA9IENPTVBPU0VfREFVQjk3aUwwKGIwW2ldLCBiMVtpXSwgYjJbaV0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZV9kYXViOTdpTDEoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSsrKXsKKyAgICAgICAgYjFbaV0gPSBDT01QT1NFX0RBVUI5N2lMMShiMFtpXSwgYjFbaV0sIGIyW2ldKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wb3NlX2RkOTdpX2R5KERXVENvbnRleHQgKmQsIGludCBsZXZlbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKQoreworICAgIHZlcnRpY2FsX2NvbXBvc2VfM3RhcCB2ZXJ0aWNhbF9jb21wb3NlX2wwID0gKHZvaWQqKWQtPnZlcnRpY2FsX2NvbXBvc2VfbDA7CisgICAgdmVydGljYWxfY29tcG9zZV81dGFwIHZlcnRpY2FsX2NvbXBvc2VfaDAgPSAodm9pZCopZC0+dmVydGljYWxfY29tcG9zZV9oMDsKKyAgICBEV1RDb21wb3NlICpjcyA9IGQtPmNzICsgbGV2ZWw7CisKKyAgICBpbnQgaSwgeSA9IGNzLT55OworICAgIElEV1RFTEVNICpiWzhdOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIGJbaV0gPSBjcy0+YltpXTsKKyAgICBiWzZdID0gZC0+YnVmZmVyICsgYXZfY2xpcCh5KzUsIDAsIGhlaWdodC0yKSpzdHJpZGU7CisgICAgYls3XSA9IGQtPmJ1ZmZlciArIGF2X2NsaXAoeSs2LCAxLCBoZWlnaHQtMSkqc3RyaWRlOworCisgICAgICAgIGlmKHkrNTwodW5zaWduZWQpaGVpZ2h0KSB2ZXJ0aWNhbF9jb21wb3NlX2wwKCAgICAgIGJbNV0sIGJbNl0sIGJbN10sICAgICAgIHdpZHRoKTsKKyAgICAgICAgaWYoeSsxPCh1bnNpZ25lZCloZWlnaHQpIHZlcnRpY2FsX2NvbXBvc2VfaDAoYlswXSwgYlsyXSwgYlszXSwgYls0XSwgYls2XSwgd2lkdGgpOworCisgICAgICAgIGlmKHktMTwodW5zaWduZWQpaGVpZ2h0KSBkLT5ob3Jpem9udGFsX2NvbXBvc2UoYlswXSwgZC0+dGVtcCwgd2lkdGgpOworICAgICAgICBpZih5KzA8KHVuc2lnbmVkKWhlaWdodCkgZC0+aG9yaXpvbnRhbF9jb21wb3NlKGJbMV0sIGQtPnRlbXAsIHdpZHRoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIGNzLT5iW2ldID0gYltpKzJdOworICAgIGNzLT55ICs9IDI7Cit9CisKK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcG9zZV9kaXJhYzUzaV9keShEV1RDb250ZXh0ICpkLCBpbnQgbGV2ZWwsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkKK3sKKyAgICB2ZXJ0aWNhbF9jb21wb3NlXzN0YXAgdmVydGljYWxfY29tcG9zZV9sMCA9ICh2b2lkKilkLT52ZXJ0aWNhbF9jb21wb3NlX2wwOworICAgIHZlcnRpY2FsX2NvbXBvc2VfM3RhcCB2ZXJ0aWNhbF9jb21wb3NlX2gwID0gKHZvaWQqKWQtPnZlcnRpY2FsX2NvbXBvc2VfaDA7CisgICAgRFdUQ29tcG9zZSAqY3MgPSBkLT5jcyArIGxldmVsOworCisgICAgaW50IHk9IGNzLT55OworICAgIElEV1RFTEVNICpiWzRdID0geyBjcy0+YlswXSwgY3MtPmJbMV0gfTsKKyAgICBiWzJdID0gZC0+YnVmZmVyICsgbWlycm9yKHkrMSwgaGVpZ2h0LTEpKnN0cmlkZTsKKyAgICBiWzNdID0gZC0+YnVmZmVyICsgbWlycm9yKHkrMiwgaGVpZ2h0LTEpKnN0cmlkZTsKKworICAgICAgICBpZih5KzE8KHVuc2lnbmVkKWhlaWdodCkgdmVydGljYWxfY29tcG9zZV9sMChiWzFdLCBiWzJdLCBiWzNdLCB3aWR0aCk7CisgICAgICAgIGlmKHkrMDwodW5zaWduZWQpaGVpZ2h0KSB2ZXJ0aWNhbF9jb21wb3NlX2gwKGJbMF0sIGJbMV0sIGJbMl0sIHdpZHRoKTsKKworICAgICAgICBpZih5LTE8KHVuc2lnbmVkKWhlaWdodCkgZC0+aG9yaXpvbnRhbF9jb21wb3NlKGJbMF0sIGQtPnRlbXAsIHdpZHRoKTsKKyAgICAgICAgaWYoeSswPCh1bnNpZ25lZCloZWlnaHQpIGQtPmhvcml6b250YWxfY29tcG9zZShiWzFdLCBkLT50ZW1wLCB3aWR0aCk7CisKKyAgICBjcy0+YlswXSA9IGJbMl07CisgICAgY3MtPmJbMV0gPSBiWzNdOworICAgIGNzLT55ICs9IDI7Cit9CisKKworc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wb3NlX2RkMTM3aV9keShEV1RDb250ZXh0ICpkLCBpbnQgbGV2ZWwsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkKK3sKKyAgICB2ZXJ0aWNhbF9jb21wb3NlXzV0YXAgdmVydGljYWxfY29tcG9zZV9sMCA9ICh2b2lkKilkLT52ZXJ0aWNhbF9jb21wb3NlX2wwOworICAgIHZlcnRpY2FsX2NvbXBvc2VfNXRhcCB2ZXJ0aWNhbF9jb21wb3NlX2gwID0gKHZvaWQqKWQtPnZlcnRpY2FsX2NvbXBvc2VfaDA7CisgICAgRFdUQ29tcG9zZSAqY3MgPSBkLT5jcyArIGxldmVsOworCisgICAgaW50IGksIHkgPSBjcy0+eTsKKyAgICBJRFdURUxFTSAqYlsxMF07CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgYltpXSA9IGNzLT5iW2ldOworICAgIGJbOF0gPSBkLT5idWZmZXIgKyBhdl9jbGlwKHkrNywgMCwgaGVpZ2h0LTIpKnN0cmlkZTsKKyAgICBiWzldID0gZC0+YnVmZmVyICsgYXZfY2xpcCh5KzgsIDEsIGhlaWdodC0xKSpzdHJpZGU7CisKKyAgICAgICAgaWYoeSs1PCh1bnNpZ25lZCloZWlnaHQpIHZlcnRpY2FsX2NvbXBvc2VfbDAoYlszXSwgYls1XSwgYls2XSwgYls3XSwgYls5XSwgd2lkdGgpOworICAgICAgICBpZih5KzE8KHVuc2lnbmVkKWhlaWdodCkgdmVydGljYWxfY29tcG9zZV9oMChiWzBdLCBiWzJdLCBiWzNdLCBiWzRdLCBiWzZdLCB3aWR0aCk7CisKKyAgICAgICAgaWYoeS0xPCh1bnNpZ25lZCloZWlnaHQpIGQtPmhvcml6b250YWxfY29tcG9zZShiWzBdLCBkLT50ZW1wLCB3aWR0aCk7CisgICAgICAgIGlmKHkrMDwodW5zaWduZWQpaGVpZ2h0KSBkLT5ob3Jpem9udGFsX2NvbXBvc2UoYlsxXSwgZC0+dGVtcCwgd2lkdGgpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgY3MtPmJbaV0gPSBiW2krMl07CisgICAgY3MtPnkgKz0gMjsKK30KKworLy8gaGFhciBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IGhlaWdodCBpcyBldmVuIChhbHdheXMgdHJ1ZSBmb3IgZGlyYWMpCitzdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBvc2VfaGFhcmlfZHkoRFdUQ29udGV4dCAqZCwgaW50IGxldmVsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpCit7CisgICAgdmVydGljYWxfY29tcG9zZV8ydGFwIHZlcnRpY2FsX2NvbXBvc2UgPSAodm9pZCopZC0+dmVydGljYWxfY29tcG9zZTsKKyAgICBpbnQgeSA9IGQtPmNzW2xldmVsXS55OworICAgIElEV1RFTEVNICpiMCA9IGQtPmJ1ZmZlciArICh5LTEpKnN0cmlkZTsKKyAgICBJRFdURUxFTSAqYjEgPSBkLT5idWZmZXIgKyAoeSAgKSpzdHJpZGU7CisKKyAgICB2ZXJ0aWNhbF9jb21wb3NlKGIwLCBiMSwgd2lkdGgpOworICAgIGQtPmhvcml6b250YWxfY29tcG9zZShiMCwgZC0+dGVtcCwgd2lkdGgpOworICAgIGQtPmhvcml6b250YWxfY29tcG9zZShiMSwgZC0+dGVtcCwgd2lkdGgpOworCisgICAgZC0+Y3NbbGV2ZWxdLnkgKz0gMjsKK30KKworLy8gRG9uJ3QgZG8gc2xpY2VkIGlkd3QgZm9yIGZpZGVsaXR5OyB0aGUgOSB0YXAgZmlsdGVyIG1ha2VzIGl0IGEgYml0IGFubm95aW5nCisvLyBGb3J0dW5hdGVseSwgdGhpcyBmaWx0ZXIgaXNuJ3QgdXNlZCBpbiBwcmFjdGljZS4KK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcG9zZV9maWRlbGl0eShEV1RDb250ZXh0ICpkLCBpbnQgbGV2ZWwsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkKK3sKKyAgICB2ZXJ0aWNhbF9jb21wb3NlXzl0YXAgdmVydGljYWxfY29tcG9zZV9sMCA9ICh2b2lkKilkLT52ZXJ0aWNhbF9jb21wb3NlX2wwOworICAgIHZlcnRpY2FsX2NvbXBvc2VfOXRhcCB2ZXJ0aWNhbF9jb21wb3NlX2gwID0gKHZvaWQqKWQtPnZlcnRpY2FsX2NvbXBvc2VfaDA7CisgICAgaW50IGksIHk7CisgICAgSURXVEVMRU0gKmJbOF07CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIGJbaV0gPSBkLT5idWZmZXIgKyBhdl9jbGlwKCh5LTcgKyAyKmkpLCAwLCBoZWlnaHQtMikqc3RyaWRlOworICAgICAgICB2ZXJ0aWNhbF9jb21wb3NlX2gwKGQtPmJ1ZmZlciArIHkqc3RyaWRlLCBiLCB3aWR0aCk7CisgICAgfQorCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBiW2ldID0gZC0+YnVmZmVyICsgYXZfY2xpcCgoeS03ICsgMippKSwgMSwgaGVpZ2h0LTEpKnN0cmlkZTsKKyAgICAgICAgdmVydGljYWxfY29tcG9zZV9sMChkLT5idWZmZXIgKyB5KnN0cmlkZSwgYiwgd2lkdGgpOworICAgIH0KKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKyAgICAgICAgZC0+aG9yaXpvbnRhbF9jb21wb3NlKGQtPmJ1ZmZlciArIHkqc3RyaWRlLCBkLT50ZW1wLCB3aWR0aCk7CisKKyAgICBkLT5jc1tsZXZlbF0ueSA9IGhlaWdodCsxOworfQorCitzdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBvc2VfZGF1Yjk3aV9keShEV1RDb250ZXh0ICpkLCBpbnQgbGV2ZWwsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkKK3sKKyAgICB2ZXJ0aWNhbF9jb21wb3NlXzN0YXAgdmVydGljYWxfY29tcG9zZV9sMCA9ICh2b2lkKilkLT52ZXJ0aWNhbF9jb21wb3NlX2wwOworICAgIHZlcnRpY2FsX2NvbXBvc2VfM3RhcCB2ZXJ0aWNhbF9jb21wb3NlX2gwID0gKHZvaWQqKWQtPnZlcnRpY2FsX2NvbXBvc2VfaDA7CisgICAgdmVydGljYWxfY29tcG9zZV8zdGFwIHZlcnRpY2FsX2NvbXBvc2VfbDEgPSAodm9pZCopZC0+dmVydGljYWxfY29tcG9zZV9sMTsKKyAgICB2ZXJ0aWNhbF9jb21wb3NlXzN0YXAgdmVydGljYWxfY29tcG9zZV9oMSA9ICh2b2lkKilkLT52ZXJ0aWNhbF9jb21wb3NlX2gxOworICAgIERXVENvbXBvc2UgKmNzID0gZC0+Y3MgKyBsZXZlbDsKKworICAgIGludCBpLCB5ID0gY3MtPnk7CisgICAgSURXVEVMRU0gKmJbNl07CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgYltpXSA9IGNzLT5iW2ldOworICAgIGJbNF0gPSBkLT5idWZmZXIgKyBtaXJyb3IoeSszLCBoZWlnaHQtMSkqc3RyaWRlOworICAgIGJbNV0gPSBkLT5idWZmZXIgKyBtaXJyb3IoeSs0LCBoZWlnaHQtMSkqc3RyaWRlOworCisgICAgICAgIGlmKHkrMzwodW5zaWduZWQpaGVpZ2h0KSB2ZXJ0aWNhbF9jb21wb3NlX2wxKGJbM10sIGJbNF0sIGJbNV0sIHdpZHRoKTsKKyAgICAgICAgaWYoeSsyPCh1bnNpZ25lZCloZWlnaHQpIHZlcnRpY2FsX2NvbXBvc2VfaDEoYlsyXSwgYlszXSwgYls0XSwgd2lkdGgpOworICAgICAgICBpZih5KzE8KHVuc2lnbmVkKWhlaWdodCkgdmVydGljYWxfY29tcG9zZV9sMChiWzFdLCBiWzJdLCBiWzNdLCB3aWR0aCk7CisgICAgICAgIGlmKHkrMDwodW5zaWduZWQpaGVpZ2h0KSB2ZXJ0aWNhbF9jb21wb3NlX2gwKGJbMF0sIGJbMV0sIGJbMl0sIHdpZHRoKTsKKworICAgICAgICBpZih5LTE8KHVuc2lnbmVkKWhlaWdodCkgZC0+aG9yaXpvbnRhbF9jb21wb3NlKGJbMF0sIGQtPnRlbXAsIHdpZHRoKTsKKyAgICAgICAgaWYoeSswPCh1bnNpZ25lZCloZWlnaHQpIGQtPmhvcml6b250YWxfY29tcG9zZShiWzFdLCBkLT50ZW1wLCB3aWR0aCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBjcy0+YltpXSA9IGJbaSsyXTsKKyAgICBjcy0+eSArPSAyOworfQorCisKK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcG9zZTk3aV9pbml0MihEV1RDb21wb3NlICpjcywgSURXVEVMRU0gKmJ1ZmZlciwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkKK3sKKyAgICBjcy0+YlswXSA9IGJ1ZmZlciArIG1pcnJvcigtMy0xLCBoZWlnaHQtMSkqc3RyaWRlOworICAgIGNzLT5iWzFdID0gYnVmZmVyICsgbWlycm9yKC0zICAsIGhlaWdodC0xKSpzdHJpZGU7CisgICAgY3MtPmJbMl0gPSBidWZmZXIgKyBtaXJyb3IoLTMrMSwgaGVpZ2h0LTEpKnN0cmlkZTsKKyAgICBjcy0+YlszXSA9IGJ1ZmZlciArIG1pcnJvcigtMysyLCBoZWlnaHQtMSkqc3RyaWRlOworICAgIGNzLT55ID0gLTM7Cit9CisKK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcG9zZTUzaV9pbml0MihEV1RDb21wb3NlICpjcywgSURXVEVMRU0gKmJ1ZmZlciwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkKK3sKKyAgICBjcy0+YlswXSA9IGJ1ZmZlciArIG1pcnJvcigtMS0xLCBoZWlnaHQtMSkqc3RyaWRlOworICAgIGNzLT5iWzFdID0gYnVmZmVyICsgbWlycm9yKC0xICAsIGhlaWdodC0xKSpzdHJpZGU7CisgICAgY3MtPnkgPSAtMTsKK30KKworc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wb3NlX2RkOTdpX2luaXQoRFdUQ29tcG9zZSAqY3MsIElEV1RFTEVNICpidWZmZXIsIGludCBoZWlnaHQsIGludCBzdHJpZGUpCit7CisgICAgY3MtPmJbMF0gPSBidWZmZXIgKyBhdl9jbGlwKC01LTEsIDAsIGhlaWdodC0yKSpzdHJpZGU7CisgICAgY3MtPmJbMV0gPSBidWZmZXIgKyBhdl9jbGlwKC01ICAsIDEsIGhlaWdodC0xKSpzdHJpZGU7CisgICAgY3MtPmJbMl0gPSBidWZmZXIgKyBhdl9jbGlwKC01KzEsIDAsIGhlaWdodC0yKSpzdHJpZGU7CisgICAgY3MtPmJbM10gPSBidWZmZXIgKyBhdl9jbGlwKC01KzIsIDEsIGhlaWdodC0xKSpzdHJpZGU7CisgICAgY3MtPmJbNF0gPSBidWZmZXIgKyBhdl9jbGlwKC01KzMsIDAsIGhlaWdodC0yKSpzdHJpZGU7CisgICAgY3MtPmJbNV0gPSBidWZmZXIgKyBhdl9jbGlwKC01KzQsIDEsIGhlaWdodC0xKSpzdHJpZGU7CisgICAgY3MtPnkgPSAtNTsKK30KKworc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wb3NlX2RkMTM3aV9pbml0KERXVENvbXBvc2UgKmNzLCBJRFdURUxFTSAqYnVmZmVyLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKQoreworICAgIGNzLT5iWzBdID0gYnVmZmVyICsgYXZfY2xpcCgtNS0xLCAwLCBoZWlnaHQtMikqc3RyaWRlOworICAgIGNzLT5iWzFdID0gYnVmZmVyICsgYXZfY2xpcCgtNSAgLCAxLCBoZWlnaHQtMSkqc3RyaWRlOworICAgIGNzLT5iWzJdID0gYnVmZmVyICsgYXZfY2xpcCgtNSsxLCAwLCBoZWlnaHQtMikqc3RyaWRlOworICAgIGNzLT5iWzNdID0gYnVmZmVyICsgYXZfY2xpcCgtNSsyLCAxLCBoZWlnaHQtMSkqc3RyaWRlOworICAgIGNzLT5iWzRdID0gYnVmZmVyICsgYXZfY2xpcCgtNSszLCAwLCBoZWlnaHQtMikqc3RyaWRlOworICAgIGNzLT5iWzVdID0gYnVmZmVyICsgYXZfY2xpcCgtNSs0LCAxLCBoZWlnaHQtMSkqc3RyaWRlOworICAgIGNzLT5iWzZdID0gYnVmZmVyICsgYXZfY2xpcCgtNSs1LCAwLCBoZWlnaHQtMikqc3RyaWRlOworICAgIGNzLT5iWzddID0gYnVmZmVyICsgYXZfY2xpcCgtNSs2LCAxLCBoZWlnaHQtMSkqc3RyaWRlOworICAgIGNzLT55ID0gLTU7Cit9CisKK2ludCBmZl9zcGF0aWFsX2lkd3RfaW5pdDIoRFdUQ29udGV4dCAqZCwgSURXVEVMRU0gKmJ1ZmZlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBlbnVtIGR3dF90eXBlIHR5cGUsIGludCBkZWNvbXBvc2l0aW9uX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBJRFdURUxFTSAqdGVtcCkKK3sKKyAgICBpbnQgbGV2ZWw7CisKKyAgICBkLT5idWZmZXIgPSBidWZmZXI7CisgICAgZC0+d2lkdGggPSB3aWR0aDsKKyAgICBkLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgZC0+c3RyaWRlID0gc3RyaWRlOworICAgIGQtPmRlY29tcG9zaXRpb25fY291bnQgPSBkZWNvbXBvc2l0aW9uX2NvdW50OworICAgIGQtPnRlbXAgPSB0ZW1wICsgODsKKworICAgIGZvcihsZXZlbD1kZWNvbXBvc2l0aW9uX2NvdW50LTE7IGxldmVsPj0wOyBsZXZlbC0tKXsKKyAgICAgICAgaW50IGhsID0gaGVpZ2h0ID4+IGxldmVsOworICAgICAgICBpbnQgc3RyaWRlX2wgPSBzdHJpZGUgPDwgbGV2ZWw7CisKKyAgICAgICAgc3dpdGNoKHR5cGUpeworICAgICAgICBjYXNlIERXVF9ESVJBQ19ERDlfNzoKKyAgICAgICAgICAgIHNwYXRpYWxfY29tcG9zZV9kZDk3aV9pbml0KGQtPmNzK2xldmVsLCBidWZmZXIsIGhsLCBzdHJpZGVfbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEV1RfRElSQUNfTEVHQUxMNV8zOgorICAgICAgICAgICAgc3BhdGlhbF9jb21wb3NlNTNpX2luaXQyKGQtPmNzK2xldmVsLCBidWZmZXIsIGhsLCBzdHJpZGVfbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEV1RfRElSQUNfREQxM183OgorICAgICAgICAgICAgc3BhdGlhbF9jb21wb3NlX2RkMTM3aV9pbml0KGQtPmNzK2xldmVsLCBidWZmZXIsIGhsLCBzdHJpZGVfbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEV1RfRElSQUNfSEFBUjA6CisgICAgICAgIGNhc2UgRFdUX0RJUkFDX0hBQVIxOgorICAgICAgICAgICAgZC0+Y3NbbGV2ZWxdLnkgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFdUX0RJUkFDX0RBVUI5Xzc6CisgICAgICAgICAgICBzcGF0aWFsX2NvbXBvc2U5N2lfaW5pdDIoZC0+Y3MrbGV2ZWwsIGJ1ZmZlciwgaGwsIHN0cmlkZV9sKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZC0+Y3NbbGV2ZWxdLnkgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIERXVF9ESVJBQ19ERDlfNzoKKyAgICAgICAgZC0+c3BhdGlhbF9jb21wb3NlID0gc3BhdGlhbF9jb21wb3NlX2RkOTdpX2R5OworICAgICAgICBkLT52ZXJ0aWNhbF9jb21wb3NlX2wwID0gKHZvaWQqKXZlcnRpY2FsX2NvbXBvc2U1M2lMMDsKKyAgICAgICAgZC0+dmVydGljYWxfY29tcG9zZV9oMCA9ICh2b2lkKil2ZXJ0aWNhbF9jb21wb3NlX2RkOTdpSDA7CisgICAgICAgIGQtPmhvcml6b250YWxfY29tcG9zZSA9IGhvcml6b250YWxfY29tcG9zZV9kZDk3aTsKKyAgICAgICAgZC0+c3VwcG9ydCA9IDc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFdUX0RJUkFDX0xFR0FMTDVfMzoKKyAgICAgICAgZC0+c3BhdGlhbF9jb21wb3NlID0gc3BhdGlhbF9jb21wb3NlX2RpcmFjNTNpX2R5OworICAgICAgICBkLT52ZXJ0aWNhbF9jb21wb3NlX2wwID0gKHZvaWQqKXZlcnRpY2FsX2NvbXBvc2U1M2lMMDsKKyAgICAgICAgZC0+dmVydGljYWxfY29tcG9zZV9oMCA9ICh2b2lkKil2ZXJ0aWNhbF9jb21wb3NlX2RpcmFjNTNpSDA7CisgICAgICAgIGQtPmhvcml6b250YWxfY29tcG9zZSA9IGhvcml6b250YWxfY29tcG9zZV9kaXJhYzUzaTsKKyAgICAgICAgZC0+c3VwcG9ydCA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFdUX0RJUkFDX0REMTNfNzoKKyAgICAgICAgZC0+c3BhdGlhbF9jb21wb3NlID0gc3BhdGlhbF9jb21wb3NlX2RkMTM3aV9keTsKKyAgICAgICAgZC0+dmVydGljYWxfY29tcG9zZV9sMCA9ICh2b2lkKil2ZXJ0aWNhbF9jb21wb3NlX2RkMTM3aUwwOworICAgICAgICBkLT52ZXJ0aWNhbF9jb21wb3NlX2gwID0gKHZvaWQqKXZlcnRpY2FsX2NvbXBvc2VfZGQ5N2lIMDsKKyAgICAgICAgZC0+aG9yaXpvbnRhbF9jb21wb3NlID0gaG9yaXpvbnRhbF9jb21wb3NlX2RkMTM3aTsKKyAgICAgICAgZC0+c3VwcG9ydCA9IDc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFdUX0RJUkFDX0hBQVIwOgorICAgIGNhc2UgRFdUX0RJUkFDX0hBQVIxOgorICAgICAgICBkLT5zcGF0aWFsX2NvbXBvc2UgPSBzcGF0aWFsX2NvbXBvc2VfaGFhcmlfZHk7CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2UgPSAodm9pZCopdmVydGljYWxfY29tcG9zZV9oYWFyOworICAgICAgICBpZiAodHlwZSA9PSBEV1RfRElSQUNfSEFBUjApCisgICAgICAgICAgICBkLT5ob3Jpem9udGFsX2NvbXBvc2UgPSBob3Jpem9udGFsX2NvbXBvc2VfaGFhcjBpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkLT5ob3Jpem9udGFsX2NvbXBvc2UgPSBob3Jpem9udGFsX2NvbXBvc2VfaGFhcjFpOworICAgICAgICBkLT5zdXBwb3J0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEV1RfRElSQUNfRklERUxJVFk6CisgICAgICAgIGQtPnNwYXRpYWxfY29tcG9zZSA9IHNwYXRpYWxfY29tcG9zZV9maWRlbGl0eTsKKyAgICAgICAgZC0+dmVydGljYWxfY29tcG9zZV9sMCA9ICh2b2lkKil2ZXJ0aWNhbF9jb21wb3NlX2ZpZGVsaXR5aUwwOworICAgICAgICBkLT52ZXJ0aWNhbF9jb21wb3NlX2gwID0gKHZvaWQqKXZlcnRpY2FsX2NvbXBvc2VfZmlkZWxpdHlpSDA7CisgICAgICAgIGQtPmhvcml6b250YWxfY29tcG9zZSA9IGhvcml6b250YWxfY29tcG9zZV9maWRlbGl0eWk7CisgICAgICAgIGQtPnN1cHBvcnQgPSAwOyAvLyBub3QgcmVhbGx5IHVzZWQKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEV1RfRElSQUNfREFVQjlfNzoKKyAgICAgICAgZC0+c3BhdGlhbF9jb21wb3NlID0gc3BhdGlhbF9jb21wb3NlX2RhdWI5N2lfZHk7CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2VfbDAgPSAodm9pZCopdmVydGljYWxfY29tcG9zZV9kYXViOTdpTDA7CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2VfaDAgPSAodm9pZCopdmVydGljYWxfY29tcG9zZV9kYXViOTdpSDA7CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2VfbDEgPSAodm9pZCopdmVydGljYWxfY29tcG9zZV9kYXViOTdpTDE7CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2VfaDEgPSAodm9pZCopdmVydGljYWxfY29tcG9zZV9kYXViOTdpSDE7CisgICAgICAgIGQtPmhvcml6b250YWxfY29tcG9zZSA9IGhvcml6b250YWxfY29tcG9zZV9kYXViOTdpOworICAgICAgICBkLT5zdXBwb3J0ID0gNTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24gd2F2ZWxldCB0eXBlICVkXG4iLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChIQVZFX01NWCkgZmZfc3BhdGlhbF9pZHd0X2luaXRfbW14KGQsIHR5cGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfc3BhdGlhbF9pZHd0X3NsaWNlMihEV1RDb250ZXh0ICpkLCBpbnQgeSkKK3sKKyAgICBpbnQgbGV2ZWwsIHN1cHBvcnQgPSBkLT5zdXBwb3J0OworCisgICAgZm9yIChsZXZlbCA9IGQtPmRlY29tcG9zaXRpb25fY291bnQtMTsgbGV2ZWwgPj0gMDsgbGV2ZWwtLSkgeworICAgICAgICBpbnQgd2wgPSBkLT53aWR0aCAgPj4gbGV2ZWw7CisgICAgICAgIGludCBobCA9IGQtPmhlaWdodCA+PiBsZXZlbDsKKyAgICAgICAgaW50IHN0cmlkZV9sID0gZC0+c3RyaWRlIDw8IGxldmVsOworCisgICAgICAgIHdoaWxlIChkLT5jc1tsZXZlbF0ueSA8PSBGRk1JTigoeT4+bGV2ZWwpK3N1cHBvcnQsIGhsKSkKKyAgICAgICAgICAgIGQtPnNwYXRpYWxfY29tcG9zZShkLCBsZXZlbCwgd2wsIGhsLCBzdHJpZGVfbCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kaXJhY19kd3QuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2RpcmFjX2R3dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTQ0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kaXJhY19kd3QuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19ESVJBQ19EV1RfSAorI2RlZmluZSBBVkNPREVDX0RJUkFDX0RXVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBpbnQgRFdURUxFTTsKK3R5cGVkZWYgc2hvcnQgSURXVEVMRU07CisKKyNkZWZpbmUgTUFYX0RXVF9TVVBQT1JUIDgKKyNkZWZpbmUgTUFYX0RFQ09NUE9TSVRJT05TIDgKKwordHlwZWRlZiBzdHJ1Y3QgRFdUQ29tcG9zZSB7CisgICAgSURXVEVMRU0gKmJbTUFYX0RXVF9TVVBQT1JUXTsKKyAgICBpbnQgeTsKK30gRFdUQ29tcG9zZTsKKworc3RydWN0IERXVENvbnRleHQ7CisKKy8vIFBvc3NpYmxlIHByb3RvdHlwZXMgZm9yIHZlcnRpY2FsX2NvbXBvc2UgZnVuY3Rpb25zCit0eXBlZGVmIHZvaWQgKCp2ZXJ0aWNhbF9jb21wb3NlXzJ0YXApKElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBpbnQgd2lkdGgpOwordHlwZWRlZiB2b2lkICgqdmVydGljYWxfY29tcG9zZV8zdGFwKShJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgSURXVEVMRU0gKmIyLCBpbnQgd2lkdGgpOwordHlwZWRlZiB2b2lkICgqdmVydGljYWxfY29tcG9zZV81dGFwKShJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgSURXVEVMRU0gKmIyLCBJRFdURUxFTSAqYjMsIElEV1RFTEVNICpiNCwgaW50IHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoKnZlcnRpY2FsX2NvbXBvc2VfOXRhcCkoSURXVEVMRU0gKmRzdCwgSURXVEVMRU0gKmJbOF0sIGludCB3aWR0aCk7CisKK3R5cGVkZWYgc3RydWN0IERXVENvbnRleHQgeworICAgIElEV1RFTEVNICpidWZmZXI7CisgICAgSURXVEVMRU0gKnRlbXA7CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgaW50IHN0cmlkZTsKKyAgICBpbnQgZGVjb21wb3NpdGlvbl9jb3VudDsKKyAgICBpbnQgc3VwcG9ydDsKKworICAgIHZvaWQgKCpzcGF0aWFsX2NvbXBvc2UpKHN0cnVjdCBEV1RDb250ZXh0ICpjcywgaW50IGxldmVsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpOworICAgIHZvaWQgKCp2ZXJ0aWNhbF9jb21wb3NlX2wwKSh2b2lkKTsKKyAgICB2b2lkICgqdmVydGljYWxfY29tcG9zZV9oMCkodm9pZCk7CisgICAgdm9pZCAoKnZlcnRpY2FsX2NvbXBvc2VfbDEpKHZvaWQpOworICAgIHZvaWQgKCp2ZXJ0aWNhbF9jb21wb3NlX2gxKSh2b2lkKTsKKyAgICB2b2lkICgqdmVydGljYWxfY29tcG9zZSkodm9pZCk7ICAgICAvLy88IG9uZSBzZXQgb2YgbG93cGFzcyBhbmQgaGlnaHBhc3MgY29tYmluZWQKKyAgICB2b2lkICgqaG9yaXpvbnRhbF9jb21wb3NlKShJRFdURUxFTSAqYiwgSURXVEVMRU0gKnRtcCwgaW50IHdpZHRoKTsKKworICAgIERXVENvbXBvc2UgY3NbTUFYX0RFQ09NUE9TSVRJT05TXTsKK30gRFdUQ29udGV4dDsKKworZW51bSBkd3RfdHlwZSB7CisgICAgRFdUX1NOT1dfREFVQjlfNywKKyAgICBEV1RfU05PV19MRUdBTEw1XzMsCisgICAgRFdUX0RJUkFDX0REOV83LAorICAgIERXVF9ESVJBQ19MRUdBTEw1XzMsCisgICAgRFdUX0RJUkFDX0REMTNfNywKKyAgICBEV1RfRElSQUNfSEFBUjAsCisgICAgRFdUX0RJUkFDX0hBQVIxLAorICAgIERXVF9ESVJBQ19GSURFTElUWSwKKyAgICBEV1RfRElSQUNfREFVQjlfNywKKyAgICBEV1RfTlVNX1RZUEVTCit9OworCisvLyAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgZS5nLiB0aGUgZHd0X3R5cGUgaXNuJ3QgcmVjb2duaXplZAoraW50IGZmX3NwYXRpYWxfaWR3dF9pbml0MihEV1RDb250ZXh0ICpkLCBJRFdURUxFTSAqYnVmZmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGVudW0gZHd0X3R5cGUgdHlwZSwgaW50IGRlY29tcG9zaXRpb25fY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElEV1RFTEVNICp0ZW1wKTsKKwordm9pZCBmZl9zcGF0aWFsX2lkd3Rfc2xpY2UyKERXVENvbnRleHQgKmQsIGludCB5KTsKKworLy8gc2hhcmVkIHN0dWZmIGZvciBzaW1kIG9wdGltaXphdGlvbnMKKyNkZWZpbmUgQ09NUE9TRV81M2lMMChiMCwgYjEsIGIyKVwKKyAgICAoYjEgLSAoKGIwICsgYjIgKyAyKSA+PiAyKSkKKworI2RlZmluZSBDT01QT1NFX0RJUkFDNTNpSDAoYjAsIGIxLCBiMilcCisgICAgKGIxICsgKChiMCArIGIyICsgMSkgPj4gMSkpCisKKyNkZWZpbmUgQ09NUE9TRV9ERDk3aUgwKGIwLCBiMSwgYjIsIGIzLCBiNClcCisgICAgKGIyICsgKCgtYjAgKyA5KmIxICsgOSpiMyAtIGI0ICsgOCkgPj4gNCkpCisKKyNkZWZpbmUgQ09NUE9TRV9ERDEzN2lMMChiMCwgYjEsIGIyLCBiMywgYjQpXAorICAgIChiMiAtICgoLWIwICsgOSpiMSArIDkqYjMgLSBiNCArIDE2KSA+PiA1KSkKKworI2RlZmluZSBDT01QT1NFX0hBQVJpTDAoYjAsIGIxKVwKKyAgICAoYjAgLSAoKGIxICsgMSkgPj4gMSkpCisKKyNkZWZpbmUgQ09NUE9TRV9IQUFSaUgwKGIwLCBiMSlcCisgICAgKGIwICsgYjEpCisKKyNkZWZpbmUgQ09NUE9TRV9GSURFTElUWWlMMChiMCwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KVwKKyAgICAoYjQgLSAoKC04KihiMCtiOCkgKyAyMSooYjErYjcpIC0gNDYqKGIyK2I2KSArIDE2MSooYjMrYjUpICsgMTI4KSA+PiA4KSkKKworI2RlZmluZSBDT01QT1NFX0ZJREVMSVRZaUgwKGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjgpXAorICAgIChiNCArICgoLTIqKGIwK2I4KSArIDEwKihiMStiNykgLSAyNSooYjIrYjYpICsgODEqKGIzK2I1KSArIDEyOCkgPj4gOCkpCisKKyNkZWZpbmUgQ09NUE9TRV9EQVVCOTdpTDEoYjAsIGIxLCBiMilcCisgICAgKGIxIC0gKCgxODE3KihiMCArIGIyKSArIDIwNDgpID4+IDEyKSkKKworI2RlZmluZSBDT01QT1NFX0RBVUI5N2lIMShiMCwgYjEsIGIyKVwKKyAgICAoYjEgLSAoKCAxMTMqKGIwICsgYjIpICsgNjQpID4+IDcpKQorCisjZGVmaW5lIENPTVBPU0VfREFVQjk3aUwwKGIwLCBiMSwgYjIpXAorICAgIChiMSArICgoIDIxNyooYjAgKyBiMikgKyAyMDQ4KSA+PiAxMikpCisKKyNkZWZpbmUgQ09NUE9TRV9EQVVCOTdpSDAoYjAsIGIxLCBiMilcCisgICAgKGIxICsgKCg2NDk3KihiMCArIGIyKSArIDIwNDgpID4+IDEyKSkKKworCisjZW5kaWYgLyogQVZDT0RFQ19EV1RfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWNfcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kaXJhY19wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWRlZDVhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWNfcGFyc2VyLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBEaXJhYyBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBNYXJjbyBHZXJhcmRzIDxtYXJjb0BnbnUub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA4IEJCQywgQW51cmFkaGEgU3VyYXBhcmFqdSA8YXN1cmFwYXJhanVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBEaXJhYyBQYXJzZXIKKyAqIEBhdXRob3IgTWFyY28gR2VyYXJkcyA8bWFyY29AZ251Lm9yZz4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaW5jbHVkZSAicGFyc2VyLmgiCisKKyNkZWZpbmUgRElSQUNfUEFSU0VfSU5GT19QUkVGSVggMHg0MjQyNDM0NAorCisvKioKKyAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZSBpbiB0aGUgYml0c3RyZWFtLgorICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQgZnJhbWUgb3IgLTEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgRGlyYWNQYXJzZUNvbnRleHQgeworICAgIGludCBzdGF0ZTsKKyAgICBpbnQgaXNfc3luY2VkOworICAgIGludCBzeW5jX29mZnNldDsKKyAgICBpbnQgaGVhZGVyX2J5dGVzX25lZWRlZDsKKyAgICBpbnQgb3ZlcnJlYWRfaW5kZXg7CisgICAgaW50IGJ1ZmZlcl9zaXplOworICAgIGludCBpbmRleDsKKyAgICB1aW50OF90ICpidWZmZXI7CisgICAgaW50IGRpcmFjX3VuaXRfc2l6ZTsKKyAgICB1aW50OF90ICpkaXJhY191bml0OworfSBEaXJhY1BhcnNlQ29udGV4dDsKKworc3RhdGljIGludCBmaW5kX2ZyYW1lX2VuZChEaXJhY1BhcnNlQ29udGV4dCAqcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIHVpbnQzMl90IHN0YXRlID0gcGMtPnN0YXRlOworICAgIGludCBpID0gMDsKKworICAgIGlmICghcGMtPmlzX3N5bmNlZCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykgeworICAgICAgICAgICAgc3RhdGUgPSAoc3RhdGUgPDwgOCkgfCBidWZbaV07CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gRElSQUNfUEFSU0VfSU5GT19QUkVGSVgpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSAgICAgICAgICAgICAgICAgICA9IC0xOworICAgICAgICAgICAgICAgIHBjLT5pc19zeW5jZWQgICAgICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBwYy0+aGVhZGVyX2J5dGVzX25lZWRlZCA9IDk7CisgICAgICAgICAgICAgICAgcGMtPnN5bmNfb2Zmc2V0ICAgICAgICAgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBjLT5pc19zeW5jZWQpIHsKKyAgICAgICAgcGMtPnN5bmNfb2Zmc2V0ID0gMDsKKyAgICAgICAgZm9yICg7IGkgPCBidWZfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gRElSQUNfUEFSU0VfSU5GT19QUkVGSVgpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJ1Zl9zaXplIC0gaSkgPj0gcGMtPmhlYWRlcl9ieXRlc19uZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcGMtPnN0YXRlID0gLTE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICsgcGMtPmhlYWRlcl9ieXRlc19uZWVkZWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGMtPmhlYWRlcl9ieXRlc19uZWVkZWQgPSA5IC0gKGJ1Zl9zaXplIC0gaSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgYnVmW2ldOworICAgICAgICB9CisgICAgfQorICAgIHBjLT5zdGF0ZSA9IHN0YXRlOworICAgIHJldHVybiAtMTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgRGlyYWNQYXJzZVVuaXQgeworICAgIGludCBuZXh0X3B1X29mZnNldDsKKyAgICBpbnQgcHJldl9wdV9vZmZzZXQ7CisgICAgdWludDhfdCBwdV90eXBlOworfSBEaXJhY1BhcnNlVW5pdDsKKworc3RhdGljIGludCB1bnBhY2tfcGFyc2VfdW5pdChEaXJhY1BhcnNlVW5pdCAqcHUsIERpcmFjUGFyc2VDb250ZXh0ICpwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCkKK3sKKyAgICB1aW50OF90ICpzdGFydCA9IHBjLT5idWZmZXIgKyBvZmZzZXQ7CisgICAgdWludDhfdCAqZW5kICAgPSBwYy0+YnVmZmVyICsgcGMtPmluZGV4OworICAgIGlmIChzdGFydCA8IHBjLT5idWZmZXIgfHwgKHN0YXJ0ICsgMTMgPiBlbmQpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBwdS0+cHVfdHlwZSA9IHN0YXJ0WzRdOworCisgICAgcHUtPm5leHRfcHVfb2Zmc2V0ID0gQVZfUkIzMihzdGFydCArIDUpOworICAgIHB1LT5wcmV2X3B1X29mZnNldCA9IEFWX1JCMzIoc3RhcnQgKyA5KTsKKworICAgIGlmIChwdS0+cHVfdHlwZSA9PSAweDEwICYmIHB1LT5uZXh0X3B1X29mZnNldCA9PSAwKQorICAgICAgICBwdS0+bmV4dF9wdV9vZmZzZXQgPSAxMzsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRpcmFjX2NvbWJpbmVfZnJhbWUoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dCwgY29uc3QgdWludDhfdCAqKmJ1ZiwgaW50ICpidWZfc2l6ZSkKK3sKKyAgICBpbnQgcGFyc2VfdGltaW5nX2luZm8gPSAocy0+cHRzID09IEFWX05PUFRTX1ZBTFVFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmR0cyA9PSBBVl9OT1BUU19WQUxVRSk7CisgICAgRGlyYWNQYXJzZUNvbnRleHQgKnBjID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKHBjLT5vdmVycmVhZF9pbmRleCkgeworICAgICAgICBtZW1jcHkocGMtPmJ1ZmZlciwgcGMtPmJ1ZmZlciArIHBjLT5vdmVycmVhZF9pbmRleCwKKyAgICAgICAgICAgICAgIHBjLT5pbmRleCAtIHBjLT5vdmVycmVhZF9pbmRleCk7CisgICAgICAgIHBjLT5pbmRleCAgICAgICAgIC09IHBjLT5vdmVycmVhZF9pbmRleDsKKyAgICAgICAgcGMtPm92ZXJyZWFkX2luZGV4ID0gMDsKKyAgICAgICAgaWYgKCpidWZfc2l6ZSA9PSAwICYmIHBjLT5idWZmZXJbNF0gPT0gMHgxMCkgeworICAgICAgICAgICAgKmJ1ZiAgICAgID0gcGMtPmJ1ZmZlcjsKKyAgICAgICAgICAgICpidWZfc2l6ZSA9IHBjLT5pbmRleDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5leHQgPT0gLTEpIHsKKyAgICAgICAgLyogRm91bmQgYSBwb3NzaWJsZSBmcmFtZSBzdGFydCBidXQgbm90IGEgZnJhbWUgZW5kICovCisgICAgICAgIHZvaWQgKm5ld19idWZmZXIgPQorICAgICAgICAgICAgYXZfZmFzdF9yZWFsbG9jKHBjLT5idWZmZXIsICZwYy0+YnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGMtPmluZGV4ICsgKCpidWZfc2l6ZSAtIHBjLT5zeW5jX29mZnNldCkpOworICAgICAgICBpZiAoIW5ld19idWZmZXIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBwYy0+YnVmZmVyID0gbmV3X2J1ZmZlcjsKKyAgICAgICAgbWVtY3B5KHBjLT5idWZmZXIgKyBwYy0+aW5kZXgsICgqYnVmICsgcGMtPnN5bmNfb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICpidWZfc2l6ZSAtIHBjLT5zeW5jX29mZnNldCk7CisgICAgICAgIHBjLT5pbmRleCArPSAqYnVmX3NpemUgLSBwYy0+c3luY19vZmZzZXQ7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBGb3VuZCBhIHBvc3NpYmxlIGZyYW1lIHN0YXJ0IGFuZCBhICBwb3NzaWJsZSBmcmFtZSBlbmQgKi8KKyAgICAgICAgRGlyYWNQYXJzZVVuaXQgcHUxLCBwdTsKKyAgICAgICAgdm9pZCAqbmV3X2J1ZmZlciA9IGF2X2Zhc3RfcmVhbGxvYyhwYy0+YnVmZmVyLCAmcGMtPmJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjLT5pbmRleCArIG5leHQpOworICAgICAgICBpZiAoIW5ld19idWZmZXIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBwYy0+YnVmZmVyID0gbmV3X2J1ZmZlcjsKKyAgICAgICAgbWVtY3B5KHBjLT5idWZmZXIgKyBwYy0+aW5kZXgsICpidWYsIG5leHQpOworICAgICAgICBwYy0+aW5kZXggKz0gbmV4dDsKKworICAgICAgICAvKiBOZWVkIHRvIGNoZWNrIGlmIHdlIGhhdmUgYSB2YWxpZCBQYXJzZSBVbml0LiBXZSBjYW4ndCBnbyBieSB0aGUKKyAgICAgICAgICogc3luYyBwYXR0ZXJuICdCQkNEJyBhbG9uZSBiZWNhdXNlIGFyaXRobWV0aWMgY29kaW5nIG9mIHRoZSByZXNpZHVhbAorICAgICAgICAgKiBhbmQgbW90aW9uIGRhdGEgY2FuIGNhdXNlIHRoZSBwYXR0ZXJuIHRyaWdnZXJpbmcgYSBmYWxzZSBzdGFydCBvZgorICAgICAgICAgKiBmcmFtZS4gU28gY2hlY2sgaWYgdGhlIHByZXZpb3VzIHBhcnNlIG9mZnNldCBvZiB0aGUgbmV4dCBwYXJzZSB1bml0CisgICAgICAgICAqIGlzIGVxdWFsIHRvIHRoZSBuZXh0IHBhcnNlIG9mZnNldCBvZiB0aGUgY3VycmVudCBwYXJzZSB1bml0IHRoZW4KKyAgICAgICAgICogd2UgY2FuIGJlIHByZXR0eSBzdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIHBhcnNlIHVuaXQgKi8KKyAgICAgICAgaWYgKCF1bnBhY2tfcGFyc2VfdW5pdCgmcHUxLCBwYywgcGMtPmluZGV4IC0gMTMpICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICF1bnBhY2tfcGFyc2VfdW5pdCgmcHUsIHBjLCBwYy0+aW5kZXggLSAxMyAtIHB1MS5wcmV2X3B1X29mZnNldCkgfHwKKyAgICAgICAgICAgIHB1Lm5leHRfcHVfb2Zmc2V0ICE9IHB1MS5wcmV2X3B1X29mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIHBjLT5pbmRleCA8IHBjLT5kaXJhY191bml0X3NpemUgKyAxM0xMICsgcHUxLnByZXZfcHVfb2Zmc2V0CisgICAgICAgICkgeworICAgICAgICAgICAgcGMtPmluZGV4ICAgICAgICAgICAgICAtPSA5OworICAgICAgICAgICAgKmJ1Zl9zaXplICAgICAgICAgICAgICAgPSBuZXh0IC0gOTsKKyAgICAgICAgICAgIHBjLT5oZWFkZXJfYnl0ZXNfbmVlZGVkID0gOTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFsbCBub24tZnJhbWUgZGF0YSBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGZyYW1lIGRhdGEuIFRoaXMgaXMgdG8KKyAgICAgICAgICogZW5zdXJlIHRoYXQgcHRzIGlzIHNldCBjb3JyZWN0bHkuIFNvIGlmIHRoZSBjdXJyZW50IHBhcnNlIHVuaXQgaXMKKyAgICAgICAgICogbm90IGZyYW1lIGRhdGEsIHdhaXQgZm9yIGZyYW1lIGRhdGEgdG8gY29tZSBhbG9uZyAqLworCisgICAgICAgIHBjLT5kaXJhY191bml0ID0gcGMtPmJ1ZmZlciArIHBjLT5pbmRleCAtIDEzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwdTEucHJldl9wdV9vZmZzZXQgLSBwYy0+ZGlyYWNfdW5pdF9zaXplOworCisgICAgICAgIHBjLT5kaXJhY191bml0X3NpemUgKz0gcHUubmV4dF9wdV9vZmZzZXQ7CisKKyAgICAgICAgaWYgKChwdS5wdV90eXBlICYgMHgwOCkgIT0gMHgwOCkgeworICAgICAgICAgICAgcGMtPmhlYWRlcl9ieXRlc19uZWVkZWQgPSA5OworICAgICAgICAgICAgKmJ1Zl9zaXplICAgICAgICAgICAgICAgPSBuZXh0OworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IHRoZSBwaWN0dXJlIG51bWJlciB0byBzZXQgdGhlIHB0cyBhbmQgZHRzKi8KKyAgICAgICAgaWYgKHBhcnNlX3RpbWluZ19pbmZvKSB7CisgICAgICAgICAgICB1aW50OF90ICpjdXJfcHUgPSBwYy0+YnVmZmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjLT5pbmRleCAtIDEzIC0gcHUxLnByZXZfcHVfb2Zmc2V0OworICAgICAgICAgICAgaW50IHB0cyA9IEFWX1JCMzIoY3VyX3B1ICsgMTMpOworICAgICAgICAgICAgaWYgKHMtPmxhc3RfcHRzID09IDAgJiYgcy0+bGFzdF9kdHMgPT0gMCkKKyAgICAgICAgICAgICAgICBzLT5kdHMgPSBwdHMgLSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHMtPmR0cyA9IHMtPmxhc3RfZHRzICsgMTsKKyAgICAgICAgICAgIHMtPnB0cyA9IHB0czsKKyAgICAgICAgICAgIGlmICghYXZjdHgtPmhhc19iX2ZyYW1lcyAmJiAoY3VyX3B1WzRdICYgMHgwMykpCisgICAgICAgICAgICAgICAgYXZjdHgtPmhhc19iX2ZyYW1lcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2Y3R4LT5oYXNfYl9mcmFtZXMgJiYgcy0+cHRzID09IHMtPmR0cykKKyAgICAgICAgICAgIHMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9COworCisgICAgICAgIC8qIEZpbmFsbHkgaGF2ZSBhIGNvbXBsZXRlIERpcmFjIGRhdGEgdW5pdCAqLworICAgICAgICAqYnVmICAgICAgPSBwYy0+ZGlyYWNfdW5pdDsKKyAgICAgICAgKmJ1Zl9zaXplID0gcGMtPmRpcmFjX3VuaXRfc2l6ZTsKKworICAgICAgICBwYy0+ZGlyYWNfdW5pdF9zaXplICAgICA9IDA7CisgICAgICAgIHBjLT5vdmVycmVhZF9pbmRleCAgICAgID0gcGMtPmluZGV4IC0gMTM7CisgICAgICAgIHBjLT5oZWFkZXJfYnl0ZXNfbmVlZGVkID0gOTsKKyAgICB9CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK3N0YXRpYyBpbnQgZGlyYWNfcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBEaXJhY1BhcnNlQ29udGV4dCAqcGMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IG5leHQ7CisKKyAgICAqcG91dGJ1ZiAgICAgID0gTlVMTDsKKyAgICAqcG91dGJ1Zl9zaXplID0gMDsKKworICAgIGlmIChzLT5mbGFncyAmIFBBUlNFUl9GTEFHX0NPTVBMRVRFX0ZSQU1FUykgeworICAgICAgICBuZXh0ICAgICAgICAgID0gYnVmX3NpemU7CisgICAgICAgICpwb3V0YnVmICAgICAgPSBidWY7CisgICAgICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICAgICAgLyogQXNzdW1lIHRoYXQgZGF0YSBoYXMgYmVlbiBwYWNrZXRpemVkIGludG8gYW4gZW5jYXBzdWxhdGlvbiB1bml0LiAqLworICAgIH0gZWxzZSB7CisgICAgICAgIG5leHQgPSBmaW5kX2ZyYW1lX2VuZChwYywgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgIGlmICghcGMtPmlzX3N5bmNlZCAmJiBuZXh0ID09IC0xKQorICAgICAgICAgICAgLyogTm8gZnJhbWUgc3RhcnQgZm91bmQgeWV0LiBTbyB0aHJvdyBhd2F5IHRoZSBlbnRpcmUgYnVmZmVyLiAqLworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworCisgICAgICAgIGlmIChkaXJhY19jb21iaW5lX2ZyYW1lKHMsIGF2Y3R4LCBuZXh0LCAmYnVmLCAmYnVmX3NpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisKKyAgICAqcG91dGJ1ZiAgICAgID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gbmV4dDsKK30KKworc3RhdGljIHZvaWQgZGlyYWNfcGFyc2VfY2xvc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMpCit7CisgICAgRGlyYWNQYXJzZUNvbnRleHQgKnBjID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKHBjLT5idWZmZXJfc2l6ZSA+IDApCisgICAgICAgIGF2X2ZyZWVwKCZwYy0+YnVmZmVyKTsKK30KKworQVZDb2RlY1BhcnNlciBmZl9kaXJhY19wYXJzZXIgPSB7CisgICAgLmNvZGVjX2lkcyAgICAgID0geyBBVl9DT0RFQ19JRF9ESVJBQyB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihEaXJhY1BhcnNlQ29udGV4dCksCisgICAgLnBhcnNlcl9wYXJzZSAgID0gZGlyYWNfcGFyc2UsCisgICAgLnBhcnNlcl9jbG9zZSAgID0gZGlyYWNfcGFyc2VfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWNkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RpcmFjZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4ZTJiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RpcmFjZGVjLmMKQEAgLTAsMCArMSwyMDAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1hcmNvIEdlcmFyZHMgPG1hcmNvQGdudS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgQ29ucmFkCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSm9yZGkgT3J0aXoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRGlyYWMgRGVjb2RlcgorICogQGF1dGhvciBNYXJjbyBHZXJhcmRzIDxtYXJjb0BnbnUub3JnPiwgRGF2aWQgQ29ucmFkLCBKb3JkaSBPcnRpeiA8bmVuam9yZGlAZ21haWwuY29tPgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJkaXJhY19hcml0aC5oIgorI2luY2x1ZGUgIm1wZWcxMmRhdGEuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWd2aWRlby5oIgorI2luY2x1ZGUgIm1wZWd2aWRlb2VuY2RzcC5oIgorI2luY2x1ZGUgImRpcmFjX2R3dC5oIgorI2luY2x1ZGUgImRpcmFjLmgiCisjaW5jbHVkZSAiZGlyYWNkc3AuaCIKKyNpbmNsdWRlICJ2aWRlb2RzcC5oIgorCisvKioKKyAqIFRoZSBzcGVjIGxpbWl0cyB0aGUgbnVtYmVyIG9mIHdhdmVsZXQgZGVjb21wb3NpdGlvbnMgdG8gNCBmb3IgYm90aAorICogbGV2ZWwgMSAoVkMtMikgYW5kIDEyOCAobG9uZy1nb3AgZGVmYXVsdCkuCisgKiA1IGRlY29tcG9zaXRpb25zIGlzIHRoZSBtYXhpbXVtIGJlZm9yZSA+MTYtYml0IGJ1ZmZlcnMgYXJlIG5lZWRlZC4KKyAqIFNjaHJvZWRpbmdlciBhbGxvd3MgdGhpcyBmb3IgREQgOSw3IGFuZCAxMyw3IHdhdmVsZXRzIG9ubHksIGxpbWl0aW5nCisgKiB0aGUgb3RoZXJzIHRvIDQgZGVjb21wb3NpdGlvbnMgKG9yIDMgZm9yIHRoZSBmaWRlbGl0eSBmaWx0ZXIpLgorICoKKyAqIFdlIHVzZSB0aGlzIGluc3RlYWQgb2YgTUFYX0RFQ09NUE9TSVRJT05TIHRvIHNhdmUgc29tZSBtZW1vcnkuCisgKi8KKyNkZWZpbmUgTUFYX0RXVF9MRVZFTFMgNQorCisvKioKKyAqIFRoZSBzcGVjIGxpbWl0cyB0aGlzIHRvIDMgZm9yIGZyYW1lIGNvZGluZywgYnV0IGluIHByYWN0aWNlIGNhbiBiZSBhcyBoaWdoIGFzIDYKKyAqLworI2RlZmluZSBNQVhfUkVGRVJFTkNFX0ZSQU1FUyA4CisjZGVmaW5lIE1BWF9ERUxBWSA1ICAgICAgICAgLyogbGltaXQgZm9yIG1haW4gcHJvZmlsZSBmb3IgZnJhbWUgY29kaW5nIChUT0RPOiBmaWVsZCBjb2RpbmcpICovCisjZGVmaW5lIE1BWF9GUkFNRVMgKE1BWF9SRUZFUkVOQ0VfRlJBTUVTICsgTUFYX0RFTEFZICsgMSkKKyNkZWZpbmUgTUFYX1FVQU5UIDY4ICAgICAgICAvKiBtYXggcXVhbnQgZm9yIFZDLTIgKi8KKyNkZWZpbmUgTUFYX0JMT0NLU0laRSAzMiAgICAvKiBtYXhpbXVtIHhibGVuL3libGVuIHdlIHN1cHBvcnQgKi8KKworLyoqCisgKiBEaXJhY0Jsb2NrLT5yZWYgZmxhZ3MsIGlmIHNldCB0aGVuIHRoZSBibG9jayBkb2VzIE1DIGZyb20gdGhlIGdpdmVuIHJlZgorICovCisjZGVmaW5lIERJUkFDX1JFRl9NQVNLX1JFRjEgICAxCisjZGVmaW5lIERJUkFDX1JFRl9NQVNLX1JFRjIgICAyCisjZGVmaW5lIERJUkFDX1JFRl9NQVNLX0dMT0JBTCA0CisKKy8qKgorICogVmFsdWUgb2YgUGljdHVyZS5yZWZlcmVuY2Ugd2hlbiBQaWN0dXJlIGlzIG5vdCBhIHJlZmVyZW5jZSBwaWN0dXJlLCBidXQKKyAqIGlzIGhlbGQgZm9yIGRlbGF5ZWQgb3V0cHV0LgorICovCisjZGVmaW5lIERFTEFZRURfUElDX1JFRiA0CisKKyNkZWZpbmUgQ0FMQ19QQURESU5HKHNpemUsIGRlcHRoKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKHNpemUgKyAoMSA8PCBkZXB0aCkgLSAxKSA+PiBkZXB0aCkgPDwgZGVwdGgpCisKKyNkZWZpbmUgRElWUk5EVVAoYSwgYikgKCgoYSkgKyAoYikgLSAxKSAvIChiKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWRnJhbWUgKmF2ZnJhbWU7CisgICAgaW50IGludGVycG9sYXRlZFszXTsgICAgLyogMSBpZiBocGVsW10gaXMgdmFsaWQgKi8KKyAgICB1aW50OF90ICpocGVsWzNdWzRdOworICAgIHVpbnQ4X3QgKmhwZWxfYmFzZVszXVs0XTsKK30gRGlyYWNGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuaW9uIHsKKyAgICAgICAgaW50MTZfdCBtdlsyXVsyXTsKKyAgICAgICAgaW50MTZfdCBkY1szXTsKKyAgICB9IHU7IC8qIGFub255bW91cyB1bmlvbnMgYXJlbid0IGluIEM5OSA6KCAqLworICAgIHVpbnQ4X3QgcmVmOworfSBEaXJhY0Jsb2NrOworCit0eXBlZGVmIHN0cnVjdCBTdWJCYW5kIHsKKyAgICBpbnQgbGV2ZWw7CisgICAgaW50IG9yaWVudGF0aW9uOworICAgIGludCBzdHJpZGU7CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgaW50IHF1YW50OworICAgIElEV1RFTEVNICppYnVmOworICAgIHN0cnVjdCBTdWJCYW5kICpwYXJlbnQ7CisKKyAgICAvKiBmb3IgbG93IGRlbGF5ICovCisgICAgdW5zaWduZWQgbGVuZ3RoOworICAgIGNvbnN0IHVpbnQ4X3QgKmNvZWZmX2RhdGE7Cit9IFN1YkJhbmQ7CisKK3R5cGVkZWYgc3RydWN0IFBsYW5lIHsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBwdHJkaWZmX3Qgc3RyaWRlOworCisgICAgaW50IGlkd3Rfd2lkdGg7CisgICAgaW50IGlkd3RfaGVpZ2h0OworICAgIGludCBpZHd0X3N0cmlkZTsKKyAgICBJRFdURUxFTSAqaWR3dF9idWY7CisgICAgSURXVEVMRU0gKmlkd3RfYnVmX2Jhc2U7CisgICAgSURXVEVMRU0gKmlkd3RfdG1wOworCisgICAgLyogYmxvY2sgbGVuZ3RoICovCisgICAgdWludDhfdCB4YmxlbjsKKyAgICB1aW50OF90IHlibGVuOworICAgIC8qIGJsb2NrIHNlcGFyYXRpb24gKGJsb2NrIG4rMSBzdGFydHMgYWZ0ZXIgdGhpcyBtYW55IHBpeGVscyBpbiBibG9jayBuKSAqLworICAgIHVpbnQ4X3QgeGJzZXA7CisgICAgdWludDhfdCB5YnNlcDsKKyAgICAvKiBhbW91bnQgb2Ygb3ZlcnNwaWxsIG9uIGVhY2ggZWRnZSAoaGFsZiBvZiB0aGUgb3ZlcmxhcCBiZXR3ZWVuIGJsb2NrcykgKi8KKyAgICB1aW50OF90IHhvZmZzZXQ7CisgICAgdWludDhfdCB5b2Zmc2V0OworCisgICAgU3ViQmFuZCBiYW5kW01BWF9EV1RfTEVWRUxTXVs0XTsKK30gUGxhbmU7CisKK3R5cGVkZWYgc3RydWN0IERpcmFjQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIE1wZWd2aWRlb0VuY0RTUENvbnRleHQgbXB2ZW5jZHNwOworICAgIFZpZGVvRFNQQ29udGV4dCB2ZHNwOworICAgIERpcmFjRFNQQ29udGV4dCBkaXJhY2RzcDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGRpcmFjX3NvdXJjZV9wYXJhbXMgc291cmNlOworICAgIGludCBzZWVuX3NlcXVlbmNlX2hlYWRlcjsKKyAgICBpbnQgZnJhbWVfbnVtYmVyOyAgICAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBuZXh0IGZyYW1lIHRvIGRpc3BsYXkgICAgICAgKi8KKyAgICBQbGFuZSBwbGFuZVszXTsKKyAgICBpbnQgY2hyb21hX3hfc2hpZnQ7CisgICAgaW50IGNocm9tYV95X3NoaWZ0OworCisgICAgaW50IHplcm9fcmVzOyAgICAgICAgICAgICAgIC8qIHplcm8gcmVzaWR1ZSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGlzX2FyaXRoOyAgICAgICAgICAgICAgIC8qIHdoZXRoZXIgY29lZmZzIHVzZSBhcml0aCBvciBnb2xvbWIgY29kaW5nICovCisgICAgaW50IGxvd19kZWxheTsgICAgICAgICAgICAgIC8qIHVzZSB0aGUgbG93IGRlbGF5IHN5bnRheCAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGdsb2JhbG1jX2ZsYWc7ICAgICAgICAgIC8qIHVzZSBnbG9iYWwgbW90aW9uIGNvbXBlbnNhdGlvbiAgICAgICAgICAgICovCisgICAgaW50IG51bV9yZWZzOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZWZlcmVuY2UgcGljdHVyZXMgICAgICAgICAgICAgICovCisKKyAgICAvKiB3YXZlbGV0IGRlY29kaW5nICovCisgICAgdW5zaWduZWQgd2F2ZWxldF9kZXB0aDsgICAgIC8qIGRlcHRoIG9mIHRoZSBJRFdUICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgd2F2ZWxldF9pZHg7CisKKyAgICAvKioKKyAgICAgKiBzY2hyb2VkaW5nZXIgb2xkZXIgdGhhbiAxLjAuOCBkb2Vzbid0IHN0b3JlCisgICAgICogcXVhbnQgZGVsdGEgaWYgb25seSBvbmUgY29kZWJvb2sgZXhpc3RzIGluIGEgYmFuZAorICAgICAqLworICAgIHVuc2lnbmVkIG9sZF9kZWx0YV9xdWFudDsKKyAgICB1bnNpZ25lZCBjb2RlYmxvY2tfbW9kZTsKKworICAgIHN0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIHdpZHRoOworICAgICAgICB1bnNpZ25lZCBoZWlnaHQ7CisgICAgfSBjb2RlYmxvY2tbTUFYX0RXVF9MRVZFTFMrMV07CisKKyAgICBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25lZCBudW1feDsgICAgICAgICAvKiBudW1iZXIgb2YgaG9yaXpvbnRhbCBzbGljZXMgICAgICAgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBudW1feTsgICAgICAgICAvKiBudW1iZXIgb2YgdmVydGljYWwgc2xpY2VzICAgICAgICAgICAgICAgICAqLworICAgICAgICBBVlJhdGlvbmFsIGJ5dGVzOyAgICAgICAvKiBhdmVyYWdlIGJ5dGVzIHBlciBzbGljZSAgICAgICAgICAgICAgICAgICAqLworICAgICAgICB1aW50OF90IHF1YW50W01BWF9EV1RfTEVWRUxTXVs0XTsgLyogW0RJUkFDX1NURF0gRS4xICovCisgICAgfSBsb3dkZWxheTsKKworICAgIHN0cnVjdCB7CisgICAgICAgIGludCBwYW5fdGlsdFsyXTsgICAgICAgIC8qIHBhbi90aWx0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGludCB6cnNbMl1bMl07ICAgICAgICAgIC8qIHpvb20vcm90YXRlL3NoZWFyIG1hdHJpeCAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGludCBwZXJzcGVjdGl2ZVsyXTsgICAgIC8qIHBlcnNwZWN0aXZlIHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIHpyc19leHA7CisgICAgICAgIHVuc2lnbmVkIHBlcnNwZWN0aXZlX2V4cDsKKyAgICB9IGdsb2JhbG1jWzJdOworCisgICAgLyogbW90aW9uIGNvbXBlbnNhdGlvbiAqLworICAgIHVpbnQ4X3QgbXZfcHJlY2lzaW9uOyAgICAgICAvKiBbRElSQUNfU1REXSBSRUZTX1dUX1BSRUNJU0lPTiAgICAgICAgICAgICAqLworICAgIGludDE2X3Qgd2VpZ2h0WzJdOyAgICAgICAgICAvKiBbRElSQUNfU1REXSBSRUYxX1dUIGFuZCBSRUYyX1dUICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIHdlaWdodF9sb2cyZGVub207ICAvKiBbRElSQUNfU1REXSBSRUZTX1dUX1BSRUNJU0lPTiAgICAgICAgICAgICAqLworCisgICAgaW50IGJsd2lkdGg7ICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKGhvcml6b250YWxseSkgICAgICAgICAgICovCisgICAgaW50IGJsaGVpZ2h0OyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKHZlcnRpY2FsbHkpICAgICAgICAgICAgICovCisgICAgaW50IHNid2lkdGg7ICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdXBlcmJsb2NrcyAoaG9yaXpvbnRhbGx5KSAgICAgICovCisgICAgaW50IHNiaGVpZ2h0OyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdXBlcmJsb2NrcyAodmVydGljYWxseSkgICAgICAgICovCisKKyAgICB1aW50OF90ICpzYnNwbGl0OworICAgIERpcmFjQmxvY2sgKmJsbW90aW9uOworCisgICAgdWludDhfdCAqZWRnZV9lbXVfYnVmZmVyWzRdOworICAgIHVpbnQ4X3QgKmVkZ2VfZW11X2J1ZmZlcl9iYXNlOworCisgICAgdWludDE2X3QgKm1jdG1wOyAgICAgICAgICAgIC8qIGJ1ZmZlciBob2xkaW5nIHRoZSBNQyBkYXRhIG11bHRpcGxpZWQgYnkgT0JNQyB3ZWlnaHRzICovCisgICAgdWludDhfdCAqbWNzY3JhdGNoOworICAgIGludCBidWZmZXJfc3RyaWRlOworCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBvYm1jX3dlaWdodClbM11bTUFYX0JMT0NLU0laRSpNQVhfQkxPQ0tTSVpFXTsKKworICAgIHZvaWQgKCpwdXRfcGl4ZWxzX3RhYls0XSkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNV0sIGludCBzdHJpZGUsIGludCBoKTsKKyAgICB2b2lkICgqYXZnX3BpeGVsc190YWJbNF0pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWzVdLCBpbnQgc3RyaWRlLCBpbnQgaCk7CisgICAgdm9pZCAoKmFkZF9vYm1jKSh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKm9ibWNfd2VpZ2h0LCBpbnQgeWJsZW4pOworICAgIGRpcmFjX3dlaWdodF9mdW5jIHdlaWdodF9mdW5jOworICAgIGRpcmFjX2Jpd2VpZ2h0X2Z1bmMgYml3ZWlnaHRfZnVuYzsKKworICAgIERpcmFjRnJhbWUgKmN1cnJlbnRfcGljdHVyZTsKKyAgICBEaXJhY0ZyYW1lICpyZWZfcGljc1syXTsKKworICAgIERpcmFjRnJhbWUgKnJlZl9mcmFtZXNbTUFYX1JFRkVSRU5DRV9GUkFNRVMrMV07CisgICAgRGlyYWNGcmFtZSAqZGVsYXlfZnJhbWVzW01BWF9ERUxBWSsxXTsKKyAgICBEaXJhY0ZyYW1lIGFsbF9mcmFtZXNbTUFYX0ZSQU1FU107Cit9IERpcmFjQ29udGV4dDsKKworLyoqCisgKiBEaXJhYyBTcGVjaWZpY2F0aW9uIC0+CisgKiBQYXJzZSBjb2RlIHZhbHVlcy4gOS42LjEgVGFibGUgOS4xCisgKi8KK2VudW0gZGlyYWNfcGFyc2VfY29kZSB7CisgICAgcGNfc2VxX2hlYWRlciAgICAgICAgID0gMHgwMCwKKyAgICBwY19lb3MgICAgICAgICAgICAgICAgPSAweDEwLAorICAgIHBjX2F1eF9kYXRhICAgICAgICAgICA9IDB4MjAsCisgICAgcGNfcGFkZGluZyAgICAgICAgICAgID0gMHgzMCwKK307CisKK2VudW0gZGlyYWNfc3ViYmFuZCB7CisgICAgc3ViYmFuZF9sbCA9IDAsCisgICAgc3ViYmFuZF9obCA9IDEsCisgICAgc3ViYmFuZF9saCA9IDIsCisgICAgc3ViYmFuZF9oaCA9IDMsCisgICAgc3ViYmFuZF9uYiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRlZmF1bHRfcW1hdFtdWzRdWzRdID0geworICAgIHsgeyA1LCAgMywgIDMsICAwfSwgeyAwLCAgNCwgIDQsICAxfSwgeyAwLCAgNSwgIDUsICAyfSwgeyAwLCAgNiwgIDYsICAzfSB9LAorICAgIHsgeyA0LCAgMiwgIDIsICAwfSwgeyAwLCAgNCwgIDQsICAyfSwgeyAwLCAgNSwgIDUsICAzfSwgeyAwLCAgNywgIDcsICA1fSB9LAorICAgIHsgeyA1LCAgMywgIDMsICAwfSwgeyAwLCAgNCwgIDQsICAxfSwgeyAwLCAgNSwgIDUsICAyfSwgeyAwLCAgNiwgIDYsICAzfSB9LAorICAgIHsgeyA4LCAgNCwgIDQsICAwfSwgeyAwLCAgNCwgIDQsICAwfSwgeyAwLCAgNCwgIDQsICAwfSwgeyAwLCAgNCwgIDQsICAwfSB9LAorICAgIHsgeyA4LCAgNCwgIDQsICAwfSwgeyAwLCAgNCwgIDQsICAwfSwgeyAwLCAgNCwgIDQsICAwfSwgeyAwLCAgNCwgIDQsICAwfSB9LAorICAgIHsgeyAwLCAgNCwgIDQsICA4fSwgeyAwLCAgOCwgIDgsIDEyfSwgeyAwLCAxMywgMTMsIDE3fSwgeyAwLCAxNywgMTcsIDIxfSB9LAorICAgIHsgeyAzLCAgMSwgIDEsICAwfSwgeyAwLCAgNCwgIDQsICAyfSwgeyAwLCAgNiwgIDYsICA1fSwgeyAwLCAgOSwgIDksICA3fSB9LAorfTsKKworc3RhdGljIGNvbnN0IGludCBxc2NhbGVfdGFiW01BWF9RVUFOVCsxXSA9IHsKKyAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgMTAsICAgIDExLCAgICAxMywKKyAgICAxNiwgICAgMTksICAgIDIzLCAgICAyNywgICAgMzIsICAgIDM4LCAgICA0NSwgICAgNTQsCisgICAgNjQsICAgIDc2LCAgICA5MSwgICAxMDgsICAgMTI4LCAgIDE1MiwgICAxODEsICAgMjE1LAorICAgIDI1NiwgICAzMDQsICAgMzYyLCAgIDQzMSwgICA1MTIsICAgNjA5LCAgIDcyNCwgICA4NjEsCisgICAgMTAyNCwgIDEyMTgsICAxNDQ4LCAgMTcyMiwgIDIwNDgsICAyNDM1LCAgMjg5NiwgIDM0NDQsCisgICAgNDA5NiwgIDQ4NzEsICA1NzkzLCAgNjg4OSwgIDgxOTIsICA5NzQyLCAxMTU4NSwgMTM3NzcsCisgICAgMTYzODQsIDE5NDg0LCAyMzE3MCwgMjc1NTQsIDMyNzY4LCAzODk2OCwgNDYzNDEsIDU1MTA5LAorICAgIDY1NTM2LCA3NzkzNgorfTsKKworc3RhdGljIGNvbnN0IGludCBxb2Zmc2V0X2ludHJhX3RhYltNQVhfUVVBTlQrMV0gPSB7CisgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsCisgICAgOCwgICAgMTAsICAgIDEyLCAgICAxNCwgICAgMTYsICAgIDE5LCAgICAyMywgICAgMjcsCisgICAgMzIsICAgIDM4LCAgICA0NiwgICAgNTQsICAgIDY0LCAgICA3NiwgICAgOTEsICAgMTA4LAorICAgIDEyOCwgICAxNTIsICAgMTgxLCAgIDIxNiwgICAyNTYsICAgMzA1LCAgIDM2MiwgICA0MzEsCisgICAgNTEyLCAgIDYwOSwgICA3MjQsICAgODYxLCAgMTAyNCwgIDEyMTgsICAxNDQ4LCAgMTcyMiwKKyAgICAyMDQ4LCAgMjQzNiwgIDI4OTcsICAzNDQ1LCAgNDA5NiwgIDQ4NzEsICA1NzkzLCAgNjg4OSwKKyAgICA4MTkyLCAgOTc0MiwgMTE1ODUsIDEzNzc3LCAxNjM4NCwgMTk0ODQsIDIzMTcxLCAyNzU1NSwKKyAgICAzMjc2OCwgMzg5NjgKK307CisKK3N0YXRpYyBjb25zdCBpbnQgcW9mZnNldF9pbnRlcl90YWJbTUFYX1FVQU5UKzFdID0geworICAgIDEsICAgICAyLCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgNCwgICAgIDQsICAgICA1LAorICAgIDYsICAgICA3LCAgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNCwgICAgMTcsICAgIDIwLAorICAgIDI0LCAgICAyOSwgICAgMzQsICAgIDQxLCAgICA0OCwgICAgNTcsICAgIDY4LCAgICA4MSwKKyAgICA5NiwgICAxMTQsICAgMTM2LCAgIDE2MiwgICAxOTIsICAgMjI4LCAgIDI3MiwgICAzMjMsCisgICAgMzg0LCAgIDQ1NywgICA1NDMsICAgNjQ2LCAgIDc2OCwgICA5MTMsICAxMDg2LCAgMTI5MiwKKyAgICAxNTM2LCAgMTgyNywgIDIxNzIsICAyNTgzLCAgMzA3MiwgIDM2NTMsICA0MzQ0LCAgNTE2NiwKKyAgICA2MTQ0LCAgNzMwNywgIDg2ODksIDEwMzMzLCAxMjI4OCwgMTQ2MTMsIDE3Mzc4LCAyMDY2NiwKKyAgICAyNDU3NiwgMjkyMjYKK307CisKKy8qIG1hZ2ljIG51bWJlciBkaXZpc2lvbiBieSAzIGZyb20gc2Nocm9lZGluZ2VyICovCitzdGF0aWMgaW5saW5lIGludCBkaXZpZGUzKGludCB4KQoreworICAgIHJldHVybiAoKHgrMSkqMjE4NDUgKyAxMDkyMikgPj4gMTY7Cit9CisKK3N0YXRpYyBEaXJhY0ZyYW1lICpyZW1vdmVfZnJhbWUoRGlyYWNGcmFtZSAqZnJhbWVsaXN0W10sIGludCBwaWNudW0pCit7CisgICAgRGlyYWNGcmFtZSAqcmVtb3ZlX3BpYyA9IE5VTEw7CisgICAgaW50IGksIHJlbW92ZV9pZHggPSAtMTsKKworICAgIGZvciAoaSA9IDA7IGZyYW1lbGlzdFtpXTsgaSsrKQorICAgICAgICBpZiAoZnJhbWVsaXN0W2ldLT5hdmZyYW1lLT5kaXNwbGF5X3BpY3R1cmVfbnVtYmVyID09IHBpY251bSkgeworICAgICAgICAgICAgcmVtb3ZlX3BpYyA9IGZyYW1lbGlzdFtpXTsKKyAgICAgICAgICAgIHJlbW92ZV9pZHggPSBpOworICAgICAgICB9CisKKyAgICBpZiAocmVtb3ZlX3BpYykKKyAgICAgICAgZm9yIChpID0gcmVtb3ZlX2lkeDsgZnJhbWVsaXN0W2ldOyBpKyspCisgICAgICAgICAgICBmcmFtZWxpc3RbaV0gPSBmcmFtZWxpc3RbaSsxXTsKKworICAgIHJldHVybiByZW1vdmVfcGljOworfQorCitzdGF0aWMgaW50IGFkZF9mcmFtZShEaXJhY0ZyYW1lICpmcmFtZWxpc3RbXSwgaW50IG1heGZyYW1lcywgRGlyYWNGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1heGZyYW1lczsgaSsrKQorICAgICAgICBpZiAoIWZyYW1lbGlzdFtpXSkgeworICAgICAgICAgICAgZnJhbWVsaXN0W2ldID0gZnJhbWU7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBhbGxvY19zZXF1ZW5jZV9idWZmZXJzKERpcmFjQ29udGV4dCAqcykKK3sKKyAgICBpbnQgc2J3aWR0aCAgPSBESVZSTkRVUChzLT5zb3VyY2Uud2lkdGgsICA0KTsKKyAgICBpbnQgc2JoZWlnaHQgPSBESVZSTkRVUChzLT5zb3VyY2UuaGVpZ2h0LCA0KTsKKyAgICBpbnQgaSwgdywgaCwgdG9wX3BhZGRpbmc7CisKKyAgICAvKiB0b2RvOiB0aGluayBtb3JlIGFib3V0IHRoaXMgLyB1c2Ugb3Igc2V0IFBsYW5lIGhlcmUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGludCBtYXhfeGJsZW4gPSBNQVhfQkxPQ0tTSVpFID4+IChpID8gcy0+Y2hyb21hX3hfc2hpZnQgOiAwKTsKKyAgICAgICAgaW50IG1heF95YmxlbiA9IE1BWF9CTE9DS1NJWkUgPj4gKGkgPyBzLT5jaHJvbWFfeV9zaGlmdCA6IDApOworICAgICAgICB3ID0gcy0+c291cmNlLndpZHRoICA+PiAoaSA/IHMtPmNocm9tYV94X3NoaWZ0IDogMCk7CisgICAgICAgIGggPSBzLT5zb3VyY2UuaGVpZ2h0ID4+IChpID8gcy0+Y2hyb21hX3lfc2hpZnQgOiAwKTsKKworICAgICAgICAvKiB3ZSBhbGxvY2F0ZSB0aGUgbWF4IHdlIHN1cHBvcnQgaGVyZSBzaW5jZSBudW0gZGVjb21wb3NpdGlvbnMgY2FuCisgICAgICAgICAqIGNoYW5nZSBmcm9tIGZyYW1lIHRvIGZyYW1lLiBTdHJpZGUgaXMgYWxpZ25lZCB0byAxNiBmb3IgU0lNRCwgYW5kCisgICAgICAgICAqIDE8PE1BWF9EV1RfTEVWRUxTIHRvcCBwYWRkaW5nIHRvIGF2b2lkIGlmKHk+MCkgaW4gYXJpdGggZGVjb2RpbmcKKyAgICAgICAgICogTUFYX0JMT0NLU0laRSBwYWRkaW5nIGZvciBNQzogYmxvY2tzIGNhbiBzcGlsbCB1cCB0byBoYWxmIG9mIHRoYXQKKyAgICAgICAgICogb24gZWFjaCBzaWRlICovCisgICAgICAgIHRvcF9wYWRkaW5nID0gRkZNQVgoMTw8TUFYX0RXVF9MRVZFTFMsIG1heF95Ymxlbi8yKTsKKyAgICAgICAgdyA9IEZGQUxJR04oQ0FMQ19QQURESU5HKHcsIE1BWF9EV1RfTEVWRUxTKSwgOCk7IC8qIEZJWE1FOiBTaG91bGQgdGhpcyBiZSAxNiBmb3IgU1NFPz8/ICovCisgICAgICAgIGggPSB0b3BfcGFkZGluZyArIENBTENfUEFERElORyhoLCBNQVhfRFdUX0xFVkVMUykgKyBtYXhfeWJsZW4vMjsKKworICAgICAgICBzLT5wbGFuZVtpXS5pZHd0X2J1Zl9iYXNlID0gYXZfbWFsbG9jel9hcnJheSgodyttYXhfeGJsZW4pLCBoICogc2l6ZW9mKElEV1RFTEVNKSk7CisgICAgICAgIHMtPnBsYW5lW2ldLmlkd3RfdG1wICAgICAgPSBhdl9tYWxsb2NfYXJyYXkoKHcrMTYpLCBzaXplb2YoSURXVEVMRU0pKTsKKyAgICAgICAgcy0+cGxhbmVbaV0uaWR3dF9idWYgICAgICA9IHMtPnBsYW5lW2ldLmlkd3RfYnVmX2Jhc2UgKyB0b3BfcGFkZGluZyp3OworICAgICAgICBpZiAoIXMtPnBsYW5lW2ldLmlkd3RfYnVmX2Jhc2UgfHwgIXMtPnBsYW5lW2ldLmlkd3RfdG1wKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICAvKiBmaXhtZTogYWxsb2NhdGUgdXNpbmcgcmVhbCBzdHJpZGUgaGVyZSAqLworICAgIHMtPnNic3BsaXQgID0gYXZfbWFsbG9jX2FycmF5KHNid2lkdGgsIHNiaGVpZ2h0KTsKKyAgICBzLT5ibG1vdGlvbiA9IGF2X21hbGxvY19hcnJheShzYndpZHRoLCBzYmhlaWdodCAqIDE2ICogc2l6ZW9mKCpzLT5ibG1vdGlvbikpOworCisgICAgaWYgKCFzLT5zYnNwbGl0IHx8ICFzLT5ibG1vdGlvbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGxvY19idWZmZXJzKERpcmFjQ29udGV4dCAqcywgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgdyA9IHMtPnNvdXJjZS53aWR0aDsKKyAgICBpbnQgaCA9IHMtPnNvdXJjZS5oZWlnaHQ7CisKKyAgICBhdl9hc3NlcnQwKHN0cmlkZSA+PSB3KTsKKyAgICBzdHJpZGUgKz0gNjQ7CisKKyAgICBpZiAocy0+YnVmZmVyX3N0cmlkZSA+PSBzdHJpZGUpCisgICAgICAgIHJldHVybiAwOworICAgIHMtPmJ1ZmZlcl9zdHJpZGUgPSAwOworCisgICAgYXZfZnJlZXAoJnMtPmVkZ2VfZW11X2J1ZmZlcl9iYXNlKTsKKyAgICBtZW1zZXQocy0+ZWRnZV9lbXVfYnVmZmVyLCAwLCBzaXplb2Yocy0+ZWRnZV9lbXVfYnVmZmVyKSk7CisgICAgYXZfZnJlZXAoJnMtPm1jdG1wKTsKKyAgICBhdl9mcmVlcCgmcy0+bWNzY3JhdGNoKTsKKworICAgIHMtPmVkZ2VfZW11X2J1ZmZlcl9iYXNlID0gYXZfbWFsbG9jX2FycmF5KHN0cmlkZSwgTUFYX0JMT0NLU0laRSk7CisKKyAgICBzLT5tY3RtcCAgICAgPSBhdl9tYWxsb2NfYXJyYXkoKHN0cmlkZStNQVhfQkxPQ0tTSVpFKSwgKGgrTUFYX0JMT0NLU0laRSkgKiBzaXplb2YoKnMtPm1jdG1wKSk7CisgICAgcy0+bWNzY3JhdGNoID0gYXZfbWFsbG9jX2FycmF5KHN0cmlkZSwgTUFYX0JMT0NLU0laRSk7CisKKyAgICBpZiAoIXMtPmVkZ2VfZW11X2J1ZmZlcl9iYXNlIHx8ICFzLT5tY3RtcCB8fCAhcy0+bWNzY3JhdGNoKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+YnVmZmVyX3N0cmlkZSA9IHN0cmlkZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9zZXF1ZW5jZV9idWZmZXJzKERpcmFjQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRlJBTUVTOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPmFsbF9mcmFtZXNbaV0uYXZmcmFtZS0+ZGF0YVswXSkgeworICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+YWxsX2ZyYW1lc1tpXS5hdmZyYW1lKTsKKyAgICAgICAgICAgIG1lbXNldChzLT5hbGxfZnJhbWVzW2ldLmludGVycG9sYXRlZCwgMCwgc2l6ZW9mKHMtPmFsbF9mcmFtZXNbaV0uaW50ZXJwb2xhdGVkKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IDQ7IGsrKykKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcy0+YWxsX2ZyYW1lc1tpXS5ocGVsX2Jhc2Vbal1ba10pOworICAgIH0KKworICAgIG1lbXNldChzLT5yZWZfZnJhbWVzLCAwLCBzaXplb2Yocy0+cmVmX2ZyYW1lcykpOworICAgIG1lbXNldChzLT5kZWxheV9mcmFtZXMsIDAsIHNpemVvZihzLT5kZWxheV9mcmFtZXMpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnBsYW5lW2ldLmlkd3RfYnVmX2Jhc2UpOworICAgICAgICBhdl9mcmVlcCgmcy0+cGxhbmVbaV0uaWR3dF90bXApOworICAgIH0KKworICAgIHMtPmJ1ZmZlcl9zdHJpZGUgPSAwOworICAgIGF2X2ZyZWVwKCZzLT5zYnNwbGl0KTsKKyAgICBhdl9mcmVlcCgmcy0+Ymxtb3Rpb24pOworICAgIGF2X2ZyZWVwKCZzLT5lZGdlX2VtdV9idWZmZXJfYmFzZSk7CisKKyAgICBhdl9mcmVlcCgmcy0+bWN0bXApOworICAgIGF2X2ZyZWVwKCZzLT5tY3NjcmF0Y2gpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGlyYWNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIERpcmFjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIHMtPmZyYW1lX251bWJlciA9IC0xOworCisgICAgZmZfZGlyYWNkc3BfaW5pdCgmcy0+ZGlyYWNkc3ApOworICAgIGZmX21wZWd2aWRlb2VuY2RzcF9pbml0KCZzLT5tcHZlbmNkc3AsIGF2Y3R4KTsKKyAgICBmZl92aWRlb2RzcF9pbml0KCZzLT52ZHNwLCA4KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRlJBTUVTOyBpKyspIHsKKyAgICAgICAgcy0+YWxsX2ZyYW1lc1tpXS5hdmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFzLT5hbGxfZnJhbWVzW2ldLmF2ZnJhbWUpIHsKKyAgICAgICAgICAgIHdoaWxlIChpID4gMCkKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5hbGxfZnJhbWVzWy0taV0uYXZmcmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRpcmFjX2RlY29kZV9mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRGlyYWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBmcmVlX3NlcXVlbmNlX2J1ZmZlcnMocyk7CisgICAgcy0+c2Vlbl9zZXF1ZW5jZV9oZWFkZXIgPSAwOworICAgIHMtPmZyYW1lX251bWJlciA9IC0xOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGlyYWNfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRGlyYWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGRpcmFjX2RlY29kZV9mbHVzaChhdmN0eCk7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9GUkFNRVM7IGkrKykKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+YWxsX2ZyYW1lc1tpXS5hdmZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFNJR05fQ1RYKHgpIChDVFhfU0lHTl9aRVJPICsgKCh4KSA+IDApIC0gKCh4KSA8IDApKQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29lZmZfdW5wYWNrX2FyaXRoKERpcmFjQXJpdGggKmMsIGludCBxZmFjdG9yLCBpbnQgcW9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViQmFuZCAqYiwgSURXVEVMRU0gKmJ1ZiwgaW50IHgsIGludCB5KQoreworICAgIGludCBjb2VmZiwgc2lnbjsKKyAgICBpbnQgc2lnbl9wcmVkID0gMDsKKyAgICBpbnQgcHJlZF9jdHggPSBDVFhfWlBaTl9GMTsKKworICAgIC8qIENoZWNrIGlmIHRoZSBwYXJlbnQgc3ViYmFuZCBoYXMgYSAwIGluIHRoZSBjb3JyZXNwb25kaW5nIHBvc2l0aW9uICovCisgICAgaWYgKGItPnBhcmVudCkKKyAgICAgICAgcHJlZF9jdHggKz0gISFiLT5wYXJlbnQtPmlidWZbYi0+cGFyZW50LT5zdHJpZGUgKiAoeT4+MSkgKyAoeD4+MSldIDw8IDE7CisKKyAgICBpZiAoYi0+b3JpZW50YXRpb24gPT0gc3ViYmFuZF9obCkKKyAgICAgICAgc2lnbl9wcmVkID0gYnVmWy1iLT5zdHJpZGVdOworCisgICAgLyogRGV0ZXJtaW5lIGlmIHRoZSBwaXhlbCBoYXMgb25seSB6ZXJvcyBpbiBpdHMgbmVpZ2hib3VyaG9vZCAqLworICAgIGlmICh4KSB7CisgICAgICAgIHByZWRfY3R4ICs9ICEoYnVmWy0xXSB8IGJ1ZlstYi0+c3RyaWRlXSB8IGJ1ZlstMS1iLT5zdHJpZGVdKTsKKyAgICAgICAgaWYgKGItPm9yaWVudGF0aW9uID09IHN1YmJhbmRfbGgpCisgICAgICAgICAgICBzaWduX3ByZWQgPSBidWZbLTFdOworICAgIH0gZWxzZSB7CisgICAgICAgIHByZWRfY3R4ICs9ICFidWZbLWItPnN0cmlkZV07CisgICAgfQorCisgICAgY29lZmYgPSBkaXJhY19nZXRfYXJpdGhfdWludChjLCBwcmVkX2N0eCwgQ1RYX0NPRUZGX0RBVEEpOworICAgIGlmIChjb2VmZikgeworICAgICAgICBjb2VmZiA9IChjb2VmZiAqIHFmYWN0b3IgKyBxb2Zmc2V0ICsgMikgPj4gMjsKKyAgICAgICAgc2lnbiAgPSBkaXJhY19nZXRfYXJpdGhfYml0KGMsIFNJR05fQ1RYKHNpZ25fcHJlZCkpOworICAgICAgICBjb2VmZiA9IChjb2VmZiBeIC1zaWduKSArIHNpZ247CisgICAgfQorICAgICpidWYgPSBjb2VmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgY29lZmZfdW5wYWNrX2dvbG9tYihHZXRCaXRDb250ZXh0ICpnYiwgaW50IHFmYWN0b3IsIGludCBxb2Zmc2V0KQoreworICAgIGludCBzaWduLCBjb2VmZjsKKworICAgIGNvZWZmID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICBpZiAoY29lZmYpIHsKKyAgICAgICAgY29lZmYgPSAoY29lZmYgKiBxZmFjdG9yICsgcW9mZnNldCArIDIpID4+IDI7CisgICAgICAgIHNpZ24gID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgY29lZmYgPSAoY29lZmYgXiAtc2lnbikgKyBzaWduOworICAgIH0KKyAgICByZXR1cm4gY29lZmY7Cit9CisKKy8qKgorICogRGVjb2RlIHRoZSBjb2VmZnMgaW4gdGhlIHJlY3RhbmdsZSBkZWZpbmVkIGJ5IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbQorICogW0RJUkFDX1NURF0gMTMuNC4zLjIgQ29kZWJsb2NrIHVucGFja2luZyBsb29wLiBjb2RlYmxvY2soKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY29kZWJsb2NrKERpcmFjQ29udGV4dCAqcywgU3ViQmFuZCAqYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsIERpcmFjQXJpdGggKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCB0b3AsIGludCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja2NudF9vbmUsIGludCBpc19hcml0aCkKK3sKKyAgICBpbnQgeCwgeSwgemVyb19ibG9jazsKKyAgICBpbnQgcW9mZnNldCwgcWZhY3RvcjsKKyAgICBJRFdURUxFTSAqYnVmOworCisgICAgLyogY2hlY2sgZm9yIGFueSBjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhpcyBjb2RlYmxvY2sgKi8KKyAgICBpZiAoIWJsb2NrY250X29uZSkgeworICAgICAgICBpZiAoaXNfYXJpdGgpCisgICAgICAgICAgICB6ZXJvX2Jsb2NrID0gZGlyYWNfZ2V0X2FyaXRoX2JpdChjLCBDVFhfWkVST19CTE9DSyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHplcm9fYmxvY2sgPSBnZXRfYml0czEoZ2IpOworCisgICAgICAgIGlmICh6ZXJvX2Jsb2NrKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzLT5jb2RlYmxvY2tfbW9kZSAmJiAhKHMtPm9sZF9kZWx0YV9xdWFudCAmJiBibG9ja2NudF9vbmUpKSB7CisgICAgICAgIGludCBxdWFudCA9IGItPnF1YW50OworICAgICAgICBpZiAoaXNfYXJpdGgpCisgICAgICAgICAgICBxdWFudCArPSBkaXJhY19nZXRfYXJpdGhfaW50KGMsIENUWF9ERUxUQV9RX0YsIENUWF9ERUxUQV9RX0RBVEEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBxdWFudCArPSBkaXJhY19nZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgaWYgKHF1YW50IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHF1YW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBiLT5xdWFudCA9IHF1YW50OworICAgIH0KKworICAgIGItPnF1YW50ID0gRkZNSU4oYi0+cXVhbnQsIE1BWF9RVUFOVCk7CisKKyAgICBxZmFjdG9yID0gcXNjYWxlX3RhYltiLT5xdWFudF07CisgICAgLyogVE9ETzogY29udGV4dCBwb2ludGVyPyAqLworICAgIGlmICghcy0+bnVtX3JlZnMpCisgICAgICAgIHFvZmZzZXQgPSBxb2Zmc2V0X2ludHJhX3RhYltiLT5xdWFudF07CisgICAgZWxzZQorICAgICAgICBxb2Zmc2V0ID0gcW9mZnNldF9pbnRlcl90YWJbYi0+cXVhbnRdOworCisgICAgYnVmID0gYi0+aWJ1ZiArIHRvcCAqIGItPnN0cmlkZTsKKyAgICBmb3IgKHkgPSB0b3A7IHkgPCBib3R0b207IHkrKykgeworICAgICAgICBmb3IgKHggPSBsZWZ0OyB4IDwgcmlnaHQ7IHgrKykgeworICAgICAgICAgICAgLyogW0RJUkFDX1NURF0gMTMuNC40IFN1YmJhbmQgY29lZmZpY2llbnRzLiBjb2VmZl91bnBhY2soKSAqLworICAgICAgICAgICAgaWYgKGlzX2FyaXRoKQorICAgICAgICAgICAgICAgIGNvZWZmX3VucGFja19hcml0aChjLCBxZmFjdG9yLCBxb2Zmc2V0LCBiLCBidWYreCwgeCwgeSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnVmW3hdID0gY29lZmZfdW5wYWNrX2dvbG9tYihnYiwgcWZhY3RvciwgcW9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgYnVmICs9IGItPnN0cmlkZTsKKyAgICB9Cit9CisKKy8qKgorICogRGlyYWMgU3BlY2lmaWNhdGlvbiAtPgorICogMTMuMyBpbnRyYV9kY19wcmVkaWN0aW9uKGJhbmQpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRyYV9kY19wcmVkaWN0aW9uKFN1YkJhbmQgKmIpCit7CisgICAgSURXVEVMRU0gKmJ1ZiA9IGItPmlidWY7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHggPSAxOyB4IDwgYi0+d2lkdGg7IHgrKykKKyAgICAgICAgYnVmW3hdICs9IGJ1Zlt4LTFdOworICAgIGJ1ZiArPSBiLT5zdHJpZGU7CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgYi0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgYnVmWzBdICs9IGJ1ZlstYi0+c3RyaWRlXTsKKworICAgICAgICBmb3IgKHggPSAxOyB4IDwgYi0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHByZWQgPSBidWZbeCAtIDFdICsgYnVmW3ggLSBiLT5zdHJpZGVdICsgYnVmW3ggLSBiLT5zdHJpZGUtMV07CisgICAgICAgICAgICBidWZbeF0gICs9IGRpdmlkZTMocHJlZCk7CisgICAgICAgIH0KKyAgICAgICAgYnVmICs9IGItPnN0cmlkZTsKKyAgICB9Cit9CisKKy8qKgorICogRGlyYWMgU3BlY2lmaWNhdGlvbiAtPgorICogMTMuNC4yIE5vbi1za2lwcGVkIHN1YmJhbmRzLiAgc3ViYmFuZF9jb2VmZnMoKQorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGRlY29kZV9zdWJiYW5kX2ludGVybmFsKERpcmFjQ29udGV4dCAqcywgU3ViQmFuZCAqYiwgaW50IGlzX2FyaXRoKQoreworICAgIGludCBjYl94LCBjYl95LCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b207CisgICAgRGlyYWNBcml0aCBjOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGNiX3dpZHRoICA9IHMtPmNvZGVibG9ja1tiLT5sZXZlbCArIChiLT5vcmllbnRhdGlvbiAhPSBzdWJiYW5kX2xsKV0ud2lkdGg7CisgICAgaW50IGNiX2hlaWdodCA9IHMtPmNvZGVibG9ja1tiLT5sZXZlbCArIChiLT5vcmllbnRhdGlvbiAhPSBzdWJiYW5kX2xsKV0uaGVpZ2h0OworICAgIGludCBibG9ja2NudF9vbmUgPSAoY2Jfd2lkdGggKyBjYl9oZWlnaHQpID09IDI7CisKKyAgICBpZiAoIWItPmxlbmd0aCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW5pdF9nZXRfYml0czgoJmdiLCBiLT5jb2VmZl9kYXRhLCBiLT5sZW5ndGgpOworCisgICAgaWYgKGlzX2FyaXRoKQorICAgICAgICBmZl9kaXJhY19pbml0X2FyaXRoX2RlY29kZXIoJmMsICZnYiwgYi0+bGVuZ3RoKTsKKworICAgIHRvcCA9IDA7CisgICAgZm9yIChjYl95ID0gMDsgY2JfeSA8IGNiX2hlaWdodDsgY2JfeSsrKSB7CisgICAgICAgIGJvdHRvbSA9IChiLT5oZWlnaHQgKiAoY2JfeSsxTEwpKSAvIGNiX2hlaWdodDsKKyAgICAgICAgbGVmdCA9IDA7CisgICAgICAgIGZvciAoY2JfeCA9IDA7IGNiX3ggPCBjYl93aWR0aDsgY2JfeCsrKSB7CisgICAgICAgICAgICByaWdodCA9IChiLT53aWR0aCAqIChjYl94KzFMTCkpIC8gY2Jfd2lkdGg7CisgICAgICAgICAgICBjb2RlYmxvY2socywgYiwgJmdiLCAmYywgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBibG9ja2NudF9vbmUsIGlzX2FyaXRoKTsKKyAgICAgICAgICAgIGxlZnQgPSByaWdodDsKKyAgICAgICAgfQorICAgICAgICB0b3AgPSBib3R0b207CisgICAgfQorCisgICAgaWYgKGItPm9yaWVudGF0aW9uID09IHN1YmJhbmRfbGwgJiYgcy0+bnVtX3JlZnMgPT0gMCkKKyAgICAgICAgaW50cmFfZGNfcHJlZGljdGlvbihiKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfc3ViYmFuZF9hcml0aChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmIpCit7CisgICAgRGlyYWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBkZWNvZGVfc3ViYmFuZF9pbnRlcm5hbChzLCBiLCAxKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfc3ViYmFuZF9nb2xvbWIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICphcmcpCit7CisgICAgRGlyYWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBTdWJCYW5kICoqYiAgICAgPSBhcmc7CisgICAgZGVjb2RlX3N1YmJhbmRfaW50ZXJuYWwocywgKmIsIDApOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERpcmFjIFNwZWNpZmljYXRpb24gLT4KKyAqIFtESVJBQ19TVERdIDEzLjQuMSBjb3JlX3RyYW5zZm9ybV9kYXRhKCkKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX2NvbXBvbmVudChEaXJhY0NvbnRleHQgKnMsIGludCBjb21wKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPmF2Y3R4OworICAgIFN1YkJhbmQgKmJhbmRzWzMqTUFYX0RXVF9MRVZFTFMrMV07CisgICAgZW51bSBkaXJhY19zdWJiYW5kIG9yaWVudGF0aW9uOworICAgIGludCBsZXZlbCwgbnVtX2JhbmRzID0gMDsKKworICAgIC8qIFVucGFjayBhbGwgc3ViYmFuZHMgYXQgYWxsIGxldmVscy4gKi8KKyAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBzLT53YXZlbGV0X2RlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgIGZvciAob3JpZW50YXRpb24gPSAhIWxldmVsOyBvcmllbnRhdGlvbiA8IDQ7IG9yaWVudGF0aW9uKyspIHsKKyAgICAgICAgICAgIFN1YkJhbmQgKmIgPSAmcy0+cGxhbmVbY29tcF0uYmFuZFtsZXZlbF1bb3JpZW50YXRpb25dOworICAgICAgICAgICAgYmFuZHNbbnVtX2JhbmRzKytdID0gYjsKKworICAgICAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJnMtPmdiKTsKKyAgICAgICAgICAgIC8qIFtESVJBQ19TVERdIDEzLjQuMiBzdWJiYW5kKCkgKi8KKyAgICAgICAgICAgIGItPmxlbmd0aCA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmcy0+Z2IpOworICAgICAgICAgICAgaWYgKGItPmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGItPnF1YW50ID0gc3ZxM19nZXRfdWVfZ29sb21iKCZzLT5nYik7CisgICAgICAgICAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBiLT5jb2VmZl9kYXRhID0gcy0+Z2IuYnVmZmVyICsgZ2V0X2JpdHNfY291bnQoJnMtPmdiKS84OworICAgICAgICAgICAgICAgIGItPmxlbmd0aCA9IEZGTUlOKGItPmxlbmd0aCwgRkZNQVgoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpLzgsIDApKTsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIGItPmxlbmd0aCo4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBhcml0aG1ldGljIGNvZGluZyBoYXMgaW50ZXItbGV2ZWwgZGVwZW5kZW5jaWVzLCBzbyB3ZSBjYW4gb25seSBleGVjdXRlIG9uZSBsZXZlbCBhdCBhIHRpbWUgKi8KKyAgICAgICAgaWYgKHMtPmlzX2FyaXRoKQorICAgICAgICAgICAgYXZjdHgtPmV4ZWN1dGUoYXZjdHgsIGRlY29kZV9zdWJiYW5kX2FyaXRoLCAmcy0+cGxhbmVbY29tcF0uYmFuZFtsZXZlbF1bISFsZXZlbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCA0LSEhbGV2ZWwsIHNpemVvZihTdWJCYW5kKSk7CisgICAgfQorICAgIC8qIGdvbG9tYiBjb2RpbmcgaGFzIG5vIGludGVyLWxldmVsIGRlcGVuZGVuY2llcywgc28gd2UgY2FuIGV4ZWN1dGUgYWxsIHN1YmJhbmRzIGluIHBhcmFsbGVsICovCisgICAgaWYgKCFzLT5pc19hcml0aCkKKyAgICAgICAgYXZjdHgtPmV4ZWN1dGUoYXZjdHgsIGRlY29kZV9zdWJiYW5kX2dvbG9tYiwgYmFuZHMsIE5VTEwsIG51bV9iYW5kcywgc2l6ZW9mKFN1YkJhbmQqKSk7Cit9CisKKy8qIFtESVJBQ19TVERdIDEzLjUuNS4yIEx1bWEgc2xpY2Ugc3ViYmFuZCBkYXRhLiBsdW1hX3NsaWNlX2JhbmQobGV2ZWwsb3JpZW50LHN4LHN5KSAtLT4gaWYgYjIgPT0gTlVMTCAqLworLyogW0RJUkFDX1NURF0gMTMuNS41LjMgQ2hyb21hIHNsaWNlIHN1YmJhbmQgZGF0YS4gY2hyb21hX3NsaWNlX2JhbmQobGV2ZWwsb3JpZW50LHN4LHN5KSAtLT4gaWYgYjIgIT0gTlVMTCAqLworc3RhdGljIHZvaWQgbG93ZGVsYXlfc3ViYmFuZChEaXJhY0NvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiLCBpbnQgcXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbGljZV94LCBpbnQgc2xpY2VfeSwgaW50IGJpdHNfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJCYW5kICpiMSwgU3ViQmFuZCAqYjIpCit7CisgICAgaW50IGxlZnQgICA9IGIxLT53aWR0aCAgKiBzbGljZV94ICAgIC8gcy0+bG93ZGVsYXkubnVtX3g7CisgICAgaW50IHJpZ2h0ICA9IGIxLT53aWR0aCAgKihzbGljZV94KzEpIC8gcy0+bG93ZGVsYXkubnVtX3g7CisgICAgaW50IHRvcCAgICA9IGIxLT5oZWlnaHQgKiBzbGljZV95ICAgIC8gcy0+bG93ZGVsYXkubnVtX3k7CisgICAgaW50IGJvdHRvbSA9IGIxLT5oZWlnaHQgKihzbGljZV95KzEpIC8gcy0+bG93ZGVsYXkubnVtX3k7CisKKyAgICBpbnQgcWZhY3RvciA9IHFzY2FsZV90YWJbRkZNSU4ocXVhbnQsIE1BWF9RVUFOVCldOworICAgIGludCBxb2Zmc2V0ID0gcW9mZnNldF9pbnRyYV90YWJbRkZNSU4ocXVhbnQsIE1BWF9RVUFOVCldOworCisgICAgSURXVEVMRU0gKmJ1ZjEgPSAgICAgIGIxLT5pYnVmICsgdG9wICogYjEtPnN0cmlkZTsKKyAgICBJRFdURUxFTSAqYnVmMiA9IGIyID8gYjItPmlidWYgKyB0b3AgKiBiMi0+c3RyaWRlIDogTlVMTDsKKyAgICBpbnQgeCwgeTsKKyAgICAvKiB3ZSBoYXZlIHRvIGNvbnN0YW50bHkgY2hlY2sgZm9yIG92ZXJyZWFkIHNpbmNlIHRoZSBzcGVjIGV4cGxpY2l0bHkKKyAgICAgICByZXF1aXJlcyB0aGlzLCB3aXRoIHRoZSBtZWFuaW5nIHRoYXQgYWxsIHJlbWFpbmluZyBjb2VmZnMgYXJlIHNldCB0byAwICovCisgICAgaWYgKGdldF9iaXRzX2NvdW50KGdiKSA+PSBiaXRzX2VuZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yICh5ID0gdG9wOyB5IDwgYm90dG9tOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gbGVmdDsgeCA8IHJpZ2h0OyB4KyspIHsKKyAgICAgICAgICAgIGJ1ZjFbeF0gPSBjb2VmZl91bnBhY2tfZ29sb21iKGdiLCBxZmFjdG9yLCBxb2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19jb3VudChnYikgPj0gYml0c19lbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKGJ1ZjIpIHsKKyAgICAgICAgICAgICAgICBidWYyW3hdID0gY29lZmZfdW5wYWNrX2dvbG9tYihnYiwgcWZhY3RvciwgcW9mZnNldCk7CisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2NvdW50KGdiKSA+PSBiaXRzX2VuZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ1ZjEgKz0gYjEtPnN0cmlkZTsKKyAgICAgICAgaWYgKGJ1ZjIpCisgICAgICAgICAgICBidWYyICs9IGIyLT5zdHJpZGU7CisgICAgfQorfQorCitzdHJ1Y3QgbG93ZGVsYXlfc2xpY2UgeworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IHNsaWNlX3g7CisgICAgaW50IHNsaWNlX3k7CisgICAgaW50IGJ5dGVzOworfTsKKworCisvKioKKyAqIERpcmFjIFNwZWNpZmljYXRpb24gLT4KKyAqIDEzLjUuMiBTbGljZXMuIHNsaWNlKHN4LHN5KQorICovCitzdGF0aWMgaW50IGRlY29kZV9sb3dkZWxheV9zbGljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmFyZykKK3sKKyAgICBEaXJhY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBsb3dkZWxheV9zbGljZSAqc2xpY2UgPSBhcmc7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmc2xpY2UtPmdiOworICAgIGVudW0gZGlyYWNfc3ViYmFuZCBvcmllbnRhdGlvbjsKKyAgICBpbnQgbGV2ZWwsIHF1YW50LCBjaHJvbWFfYml0cywgY2hyb21hX2VuZDsKKworICAgIGludCBxdWFudF9iYXNlICA9IGdldF9iaXRzKGdiLCA3KTsgLypbRElSQUNfU1REXSBxaW5kZXggKi8KKyAgICBpbnQgbGVuZ3RoX2JpdHMgPSBhdl9sb2cyKDggKiBzbGljZS0+Ynl0ZXMpKzE7CisgICAgaW50IGx1bWFfYml0cyAgID0gZ2V0X2JpdHNfbG9uZyhnYiwgbGVuZ3RoX2JpdHMpOworICAgIGludCBsdW1hX2VuZCAgICA9IGdldF9iaXRzX2NvdW50KGdiKSArIEZGTUlOKGx1bWFfYml0cywgZ2V0X2JpdHNfbGVmdChnYikpOworCisgICAgLyogW0RJUkFDX1NURF0gMTMuNS41LjIgbHVtYV9zbGljZV9iYW5kICovCisgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgcy0+d2F2ZWxldF9kZXB0aDsgbGV2ZWwrKykKKyAgICAgICAgZm9yIChvcmllbnRhdGlvbiA9ICEhbGV2ZWw7IG9yaWVudGF0aW9uIDwgNDsgb3JpZW50YXRpb24rKykgeworICAgICAgICAgICAgcXVhbnQgPSBGRk1BWChxdWFudF9iYXNlIC0gcy0+bG93ZGVsYXkucXVhbnRbbGV2ZWxdW29yaWVudGF0aW9uXSwgMCk7CisgICAgICAgICAgICBsb3dkZWxheV9zdWJiYW5kKHMsIGdiLCBxdWFudCwgc2xpY2UtPnNsaWNlX3gsIHNsaWNlLT5zbGljZV95LCBsdW1hX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnBsYW5lWzBdLmJhbmRbbGV2ZWxdW29yaWVudGF0aW9uXSwgTlVMTCk7CisgICAgICAgIH0KKworICAgIC8qIGNvbnN1bWUgYW55IHVudXNlZCBiaXRzIGZyb20gbHVtYSAqLworICAgIHNraXBfYml0c19sb25nKGdiLCBnZXRfYml0c19jb3VudChnYikgLSBsdW1hX2VuZCk7CisKKyAgICBjaHJvbWFfYml0cyA9IDgqc2xpY2UtPmJ5dGVzIC0gNyAtIGxlbmd0aF9iaXRzIC0gbHVtYV9iaXRzOworICAgIGNocm9tYV9lbmQgID0gZ2V0X2JpdHNfY291bnQoZ2IpICsgRkZNSU4oY2hyb21hX2JpdHMsIGdldF9iaXRzX2xlZnQoZ2IpKTsKKyAgICAvKiBbRElSQUNfU1REXSAxMy41LjUuMyBjaHJvbWFfc2xpY2VfYmFuZCAqLworICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IHMtPndhdmVsZXRfZGVwdGg7IGxldmVsKyspCisgICAgICAgIGZvciAob3JpZW50YXRpb24gPSAhIWxldmVsOyBvcmllbnRhdGlvbiA8IDQ7IG9yaWVudGF0aW9uKyspIHsKKyAgICAgICAgICAgIHF1YW50ID0gRkZNQVgocXVhbnRfYmFzZSAtIHMtPmxvd2RlbGF5LnF1YW50W2xldmVsXVtvcmllbnRhdGlvbl0sIDApOworICAgICAgICAgICAgbG93ZGVsYXlfc3ViYmFuZChzLCBnYiwgcXVhbnQsIHNsaWNlLT5zbGljZV94LCBzbGljZS0+c2xpY2VfeSwgY2hyb21hX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnBsYW5lWzFdLmJhbmRbbGV2ZWxdW29yaWVudGF0aW9uXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnBsYW5lWzJdLmJhbmRbbGV2ZWxdW29yaWVudGF0aW9uXSk7CisgICAgICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERpcmFjIFNwZWNpZmljYXRpb24gLT4KKyAqIDEzLjUuMSBsb3dfZGVsYXlfdHJhbnNmb3JtX2RhdGEoKQorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfbG93ZGVsYXkoRGlyYWNDb250ZXh0ICpzKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPmF2Y3R4OworICAgIGludCBzbGljZV94LCBzbGljZV95LCBieXRlcywgYnVmc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpidWY7CisgICAgc3RydWN0IGxvd2RlbGF5X3NsaWNlICpzbGljZXM7CisgICAgaW50IHNsaWNlX251bSA9IDA7CisKKyAgICBzbGljZXMgPSBhdl9tYWxsb2N6X2FycmF5KHMtPmxvd2RlbGF5Lm51bV94LCBzLT5sb3dkZWxheS5udW1feSAqIHNpemVvZihzdHJ1Y3QgbG93ZGVsYXlfc2xpY2UpKTsKKworICAgIGFsaWduX2dldF9iaXRzKCZzLT5nYik7CisgICAgLypbRElSQUNfU1REXSAxMy41LjIgU2xpY2VzLiBzbGljZShzeCxzeSkgKi8KKyAgICBidWYgPSBzLT5nYi5idWZmZXIgKyBnZXRfYml0c19jb3VudCgmcy0+Z2IpLzg7CisgICAgYnVmc2l6ZSA9IGdldF9iaXRzX2xlZnQoJnMtPmdiKTsKKworICAgIGZvciAoc2xpY2VfeSA9IDA7IGJ1ZnNpemUgPiAwICYmIHNsaWNlX3kgPCBzLT5sb3dkZWxheS5udW1feTsgc2xpY2VfeSsrKQorICAgICAgICBmb3IgKHNsaWNlX3ggPSAwOyBidWZzaXplID4gMCAmJiBzbGljZV94IDwgcy0+bG93ZGVsYXkubnVtX3g7IHNsaWNlX3grKykgeworICAgICAgICAgICAgYnl0ZXMgPSAoc2xpY2VfbnVtKzEpICogcy0+bG93ZGVsYXkuYnl0ZXMubnVtIC8gcy0+bG93ZGVsYXkuYnl0ZXMuZGVuCisgICAgICAgICAgICAgICAgLSBzbGljZV9udW0gICAgKiBzLT5sb3dkZWxheS5ieXRlcy5udW0gLyBzLT5sb3dkZWxheS5ieXRlcy5kZW47CisKKyAgICAgICAgICAgIHNsaWNlc1tzbGljZV9udW1dLmJ5dGVzICAgPSBieXRlczsKKyAgICAgICAgICAgIHNsaWNlc1tzbGljZV9udW1dLnNsaWNlX3ggPSBzbGljZV94OworICAgICAgICAgICAgc2xpY2VzW3NsaWNlX251bV0uc2xpY2VfeSA9IHNsaWNlX3k7CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZzbGljZXNbc2xpY2VfbnVtXS5nYiwgYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIHNsaWNlX251bSsrOworCisgICAgICAgICAgICBidWYgICAgICs9IGJ5dGVzOworICAgICAgICAgICAgYnVmc2l6ZSAtPSBieXRlcyo4OworICAgICAgICB9CisKKyAgICBhdmN0eC0+ZXhlY3V0ZShhdmN0eCwgZGVjb2RlX2xvd2RlbGF5X3NsaWNlLCBzbGljZXMsIE5VTEwsIHNsaWNlX251bSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGxvd2RlbGF5X3NsaWNlKSk7IC8qIFtESVJBQ19TVERdIDEzLjUuMiBTbGljZXMgKi8KKyAgICBpbnRyYV9kY19wcmVkaWN0aW9uKCZzLT5wbGFuZVswXS5iYW5kWzBdWzBdKTsgIC8qIFtESVJBQ19TVERdIDEzLjMgaW50cmFfZGNfcHJlZGljdGlvbigpICovCisgICAgaW50cmFfZGNfcHJlZGljdGlvbigmcy0+cGxhbmVbMV0uYmFuZFswXVswXSk7ICAvKiBbRElSQUNfU1REXSAxMy4zIGludHJhX2RjX3ByZWRpY3Rpb24oKSAqLworICAgIGludHJhX2RjX3ByZWRpY3Rpb24oJnMtPnBsYW5lWzJdLmJhbmRbMF1bMF0pOyAgLyogW0RJUkFDX1NURF0gMTMuMyBpbnRyYV9kY19wcmVkaWN0aW9uKCkgKi8KKyAgICBhdl9mcmVlKHNsaWNlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcGxhbmVzKERpcmFjQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgdywgaCwgbGV2ZWwsIG9yaWVudGF0aW9uOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBQbGFuZSAqcCA9ICZzLT5wbGFuZVtpXTsKKworICAgICAgICBwLT53aWR0aCAgICAgICA9IHMtPnNvdXJjZS53aWR0aCAgPj4gKGkgPyBzLT5jaHJvbWFfeF9zaGlmdCA6IDApOworICAgICAgICBwLT5oZWlnaHQgICAgICA9IHMtPnNvdXJjZS5oZWlnaHQgPj4gKGkgPyBzLT5jaHJvbWFfeV9zaGlmdCA6IDApOworICAgICAgICBwLT5pZHd0X3dpZHRoICA9IHcgPSBDQUxDX1BBRERJTkcocC0+d2lkdGggLCBzLT53YXZlbGV0X2RlcHRoKTsKKyAgICAgICAgcC0+aWR3dF9oZWlnaHQgPSBoID0gQ0FMQ19QQURESU5HKHAtPmhlaWdodCwgcy0+d2F2ZWxldF9kZXB0aCk7CisgICAgICAgIHAtPmlkd3Rfc3RyaWRlID0gRkZBTElHTihwLT5pZHd0X3dpZHRoLCA4KTsKKworICAgICAgICBmb3IgKGxldmVsID0gcy0+d2F2ZWxldF9kZXB0aC0xOyBsZXZlbCA+PSAwOyBsZXZlbC0tKSB7CisgICAgICAgICAgICB3ID0gdz4+MTsKKyAgICAgICAgICAgIGggPSBoPj4xOworICAgICAgICAgICAgZm9yIChvcmllbnRhdGlvbiA9ICEhbGV2ZWw7IG9yaWVudGF0aW9uIDwgNDsgb3JpZW50YXRpb24rKykgeworICAgICAgICAgICAgICAgIFN1YkJhbmQgKmIgPSAmcC0+YmFuZFtsZXZlbF1bb3JpZW50YXRpb25dOworCisgICAgICAgICAgICAgICAgYi0+aWJ1ZiAgID0gcC0+aWR3dF9idWY7CisgICAgICAgICAgICAgICAgYi0+bGV2ZWwgID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgYi0+c3RyaWRlID0gcC0+aWR3dF9zdHJpZGUgPDwgKHMtPndhdmVsZXRfZGVwdGggLSBsZXZlbCk7CisgICAgICAgICAgICAgICAgYi0+d2lkdGggID0gdzsKKyAgICAgICAgICAgICAgICBiLT5oZWlnaHQgPSBoOworICAgICAgICAgICAgICAgIGItPm9yaWVudGF0aW9uID0gb3JpZW50YXRpb247CisKKyAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gJiAxKQorICAgICAgICAgICAgICAgICAgICBiLT5pYnVmICs9IHc7CisgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID4gMSkKKyAgICAgICAgICAgICAgICAgICAgYi0+aWJ1ZiArPSBiLT5zdHJpZGU+PjE7CisKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwpCisgICAgICAgICAgICAgICAgICAgIGItPnBhcmVudCA9ICZwLT5iYW5kW2xldmVsLTFdW29yaWVudGF0aW9uXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgcC0+eGJsZW4gPSBzLT5wbGFuZVswXS54YmxlbiA+PiBzLT5jaHJvbWFfeF9zaGlmdDsKKyAgICAgICAgICAgIHAtPnlibGVuID0gcy0+cGxhbmVbMF0ueWJsZW4gPj4gcy0+Y2hyb21hX3lfc2hpZnQ7CisgICAgICAgICAgICBwLT54YnNlcCA9IHMtPnBsYW5lWzBdLnhic2VwID4+IHMtPmNocm9tYV94X3NoaWZ0OworICAgICAgICAgICAgcC0+eWJzZXAgPSBzLT5wbGFuZVswXS55YnNlcCA+PiBzLT5jaHJvbWFfeV9zaGlmdDsKKyAgICAgICAgfQorCisgICAgICAgIHAtPnhvZmZzZXQgPSAocC0+eGJsZW4gLSBwLT54YnNlcCkvMjsKKyAgICAgICAgcC0+eW9mZnNldCA9IChwLT55YmxlbiAtIHAtPnlic2VwKS8yOworICAgIH0KK30KKworLyoqCisgKiBVbnBhY2sgdGhlIG1vdGlvbiBjb21wZW5zYXRpb24gcGFyYW1ldGVycworICogRGlyYWMgU3BlY2lmaWNhdGlvbiAtPgorICogMTEuMiBQaWN0dXJlIHByZWRpY3Rpb24gZGF0YS4gcGljdHVyZV9wcmVkaWN0aW9uKCkKKyAqLworc3RhdGljIGludCBkaXJhY191bnBhY2tfcHJlZGljdGlvbl9wYXJhbWV0ZXJzKERpcmFjQ29udGV4dCAqcykKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkZWZhdWx0X2JsZW5bXSA9IHsgNCwgMTIsIDE2LCAyNCB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRlZmF1bHRfYnNlcFtdID0geyA0LCAgOCwgMTIsIDE2IH07CisKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICB1bnNpZ25lZCBpZHgsIHJlZjsKKworICAgIGFsaWduX2dldF9iaXRzKGdiKTsKKyAgICAvKiBbRElSQUNfU1REXSAxMS4yLjIgQmxvY2sgcGFyYW1ldGVycy4gYmxvY2tfcGFyYW1ldGVycygpICovCisgICAgLyogTHVtYSBhbmQgQ2hyb21hIGFyZSBlcXVhbC4gMTEuMi4zICovCisgICAgaWR4ID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsgLyogW0RJUkFDX1NURF0gaW5kZXggKi8KKworICAgIGlmIChpZHggPiA0KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQmxvY2sgcHJlZGljdGlvbiBpbmRleCB0b28gaGlnaFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoaWR4ID09IDApIHsKKyAgICAgICAgcy0+cGxhbmVbMF0ueGJsZW4gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT5wbGFuZVswXS55YmxlbiA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgIHMtPnBsYW5lWzBdLnhic2VwID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgcy0+cGxhbmVbMF0ueWJzZXAgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qW0RJUkFDX1NURF0gcHJlc2V0X2Jsb2NrX3BhcmFtcyhpbmRleCkuIFRhYmxlIDExLjEgKi8KKyAgICAgICAgcy0+cGxhbmVbMF0ueGJsZW4gPSBkZWZhdWx0X2JsZW5baWR4LTFdOworICAgICAgICBzLT5wbGFuZVswXS55YmxlbiA9IGRlZmF1bHRfYmxlbltpZHgtMV07CisgICAgICAgIHMtPnBsYW5lWzBdLnhic2VwID0gZGVmYXVsdF9ic2VwW2lkeC0xXTsKKyAgICAgICAgcy0+cGxhbmVbMF0ueWJzZXAgPSBkZWZhdWx0X2JzZXBbaWR4LTFdOworICAgIH0KKyAgICAvKltESVJBQ19TVERdIDExLjIuNCBtb3Rpb25fZGF0YV9kaW1lbnNpb25zKCkKKyAgICAgIENhbGN1bGF0ZWQgaW4gZnVuY3Rpb24gZGlyYWNfdW5wYWNrX2Jsb2NrX21vdGlvbl9kYXRhICovCisKKyAgICBpZiAoIXMtPnBsYW5lWzBdLnhic2VwIHx8ICFzLT5wbGFuZVswXS55YnNlcCB8fCBzLT5wbGFuZVswXS54YnNlcCA8IHMtPnBsYW5lWzBdLnhibGVuLzIgfHwgcy0+cGxhbmVbMF0ueWJzZXAgPCBzLT5wbGFuZVswXS55Ymxlbi8yKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQmxvY2sgc2VwYXJhdGlvbiB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzLT5wbGFuZVswXS54YnNlcCA+IHMtPnBsYW5lWzBdLnhibGVuIHx8IHMtPnBsYW5lWzBdLnlic2VwID4gcy0+cGxhbmVbMF0ueWJsZW4pIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJCbG9jayBzZXBhcmF0aW9uIGdyZWF0ZXIgdGhhbiBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoRkZNQVgocy0+cGxhbmVbMF0ueGJsZW4sIHMtPnBsYW5lWzBdLnlibGVuKSA+IE1BWF9CTE9DS1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBsYXJnZSBibG9jayBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qW0RJUkFDX1NURF0gMTEuMi41IE1vdGlvbiB2ZWN0b3IgcHJlY2lzaW9uLiBtb3Rpb25fdmVjdG9yX3ByZWNpc2lvbigpCisgICAgICBSZWFkIG1vdGlvbiB2ZWN0b3IgcHJlY2lzaW9uICovCisgICAgcy0+bXZfcHJlY2lzaW9uID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICBpZiAocy0+bXZfcHJlY2lzaW9uID4gMykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1WIHByZWNpc2lvbiBmaW5lciB0aGFuIGVpZ2h0aC1wZWxcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLypbRElSQUNfU1REXSAxMS4yLjYgR2xvYmFsIG1vdGlvbi4gZ2xvYmFsX21vdGlvbigpCisgICAgICBSZWFkIHRoZSBnbG9iYWwgbW90aW9uIGNvbXBlbnNhdGlvbiBwYXJhbWV0ZXJzICovCisgICAgcy0+Z2xvYmFsbWNfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKHMtPmdsb2JhbG1jX2ZsYWcpIHsKKyAgICAgICAgbWVtc2V0KHMtPmdsb2JhbG1jLCAwLCBzaXplb2Yocy0+Z2xvYmFsbWMpKTsKKyAgICAgICAgLyogW0RJUkFDX1NURF0gcGFuX3RpbHQoZ3BhcmFtcykgKi8KKyAgICAgICAgZm9yIChyZWYgPSAwOyByZWYgPCBzLT5udW1fcmVmczsgcmVmKyspIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgcy0+Z2xvYmFsbWNbcmVmXS5wYW5fdGlsdFswXSA9IGRpcmFjX2dldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgIHMtPmdsb2JhbG1jW3JlZl0ucGFuX3RpbHRbMV0gPSBkaXJhY19nZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFtESVJBQ19TVERdIHpvb21fcm90YXRlX3NoZWFyKGdwYXJhbXMpCisgICAgICAgICAgICAgICB6b29tL3JvdGF0aW9uL3NoZWFyIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgcy0+Z2xvYmFsbWNbcmVmXS56cnNfZXhwICAgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgIHMtPmdsb2JhbG1jW3JlZl0uenJzWzBdWzBdID0gZGlyYWNfZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICAgICAgcy0+Z2xvYmFsbWNbcmVmXS56cnNbMF1bMV0gPSBkaXJhY19nZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgICAgICAgICBzLT5nbG9iYWxtY1tyZWZdLnpyc1sxXVswXSA9IGRpcmFjX2dldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgIHMtPmdsb2JhbG1jW3JlZl0uenJzWzFdWzFdID0gZGlyYWNfZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPmdsb2JhbG1jW3JlZl0uenJzWzBdWzBdID0gMTsKKyAgICAgICAgICAgICAgICBzLT5nbG9iYWxtY1tyZWZdLnpyc1sxXVsxXSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBbRElSQUNfU1REXSBwZXJzcGVjdGl2ZShncGFyYW1zKSAqLworICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgICAgICBzLT5nbG9iYWxtY1tyZWZdLnBlcnNwZWN0aXZlX2V4cCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgICAgICAgICAgcy0+Z2xvYmFsbWNbcmVmXS5wZXJzcGVjdGl2ZVswXSAgPSBkaXJhY19nZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgICAgICAgICBzLT5nbG9iYWxtY1tyZWZdLnBlcnNwZWN0aXZlWzFdICA9IGRpcmFjX2dldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLypbRElSQUNfU1REXSAxMS4yLjcgUGljdHVyZSBwcmVkaWN0aW9uIG1vZGUuIHByZWRpY3Rpb25fbW9kZSgpCisgICAgICBQaWN0dXJlIHByZWRpY3Rpb24gbW9kZSwgbm90IGN1cnJlbnRseSB1c2VkLiAqLworICAgIGlmIChzdnEzX2dldF91ZV9nb2xvbWIoZ2IpKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBwaWN0dXJlIHByZWRpY3Rpb24gbW9kZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBbRElSQUNfU1REXSAxMS4yLjggUmVmZXJlbmNlIHBpY3R1cmUgd2VpZ2h0LiByZWZlcmVuY2VfcGljdHVyZV93ZWlnaHRzKCkKKyAgICAgICBqdXN0IGRhdGEgcmVhZCwgd2VpZ2h0IGNhbGN1bGF0aW9uIHdpbGwgYmUgZG9uZSBsYXRlciBvbi4gKi8KKyAgICBzLT53ZWlnaHRfbG9nMmRlbm9tID0gMTsKKyAgICBzLT53ZWlnaHRbMF0gICAgICAgID0gMTsKKyAgICBzLT53ZWlnaHRbMV0gICAgICAgID0gMTsKKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIHMtPndlaWdodF9sb2cyZGVub20gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT53ZWlnaHRbMF0gPSBkaXJhY19nZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgaWYgKHMtPm51bV9yZWZzID09IDIpCisgICAgICAgICAgICBzLT53ZWlnaHRbMV0gPSBkaXJhY19nZXRfc2VfZ29sb21iKGdiKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGlyYWMgU3BlY2lmaWNhdGlvbiAtPgorICogMTEuMyBXYXZlbGV0IHRyYW5zZm9ybSBkYXRhLiB3YXZlbGV0X3RyYW5zZm9ybSgpCisgKi8KK3N0YXRpYyBpbnQgZGlyYWNfdW5wYWNrX2lkd3RfcGFyYW1zKERpcmFjQ29udGV4dCAqcykKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICBpbnQgaSwgbGV2ZWw7CisgICAgdW5zaWduZWQgdG1wOworCisjZGVmaW5lIENIRUNLRURSRUFEKGRzdCwgY29uZCwgZXJybXNnKSBcCisgICAgdG1wID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsgXAorICAgIGlmIChjb25kKSB7IFwKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsIGVycm1zZyk7IFwKKyAgICAgICAgcmV0dXJuIC0xOyBcCisgICAgfVwKKyAgICBkc3QgPSB0bXA7CisKKyAgICBhbGlnbl9nZXRfYml0cyhnYik7CisKKyAgICBzLT56ZXJvX3JlcyA9IHMtPm51bV9yZWZzID8gZ2V0X2JpdHMxKGdiKSA6IDA7CisgICAgaWYgKHMtPnplcm9fcmVzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qW0RJUkFDX1NURF0gMTEuMy4xIFRyYW5zZm9ybSBwYXJhbWV0ZXJzLiB0cmFuc2Zvcm1fcGFyYW1ldGVycygpICovCisgICAgQ0hFQ0tFRFJFQUQocy0+d2F2ZWxldF9pZHgsIHRtcCA+IDYsICJ3YXZlbGV0X2lkeCBpcyB0b28gYmlnXG4iKQorCisgICAgQ0hFQ0tFRFJFQUQocy0+d2F2ZWxldF9kZXB0aCwgdG1wID4gTUFYX0RXVF9MRVZFTFMgfHwgdG1wIDwgMSwgImludmFsaWQgbnVtYmVyIG9mIERXVCBkZWNvbXBvc2l0aW9uc1xuIikKKworICAgIGlmICghcy0+bG93X2RlbGF5KSB7CisgICAgICAgIC8qIENvZGVibG9jayBwYXJhbWV0ZXJzIChjb3JlIHN5bnRheCBvbmx5KSAqLworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBzLT53YXZlbGV0X2RlcHRoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBDSEVDS0VEUkVBRChzLT5jb2RlYmxvY2tbaV0ud2lkdGggLCB0bXAgPCAxIHx8IHRtcCA+IChzLT5hdmN0eC0+d2lkdGggPj5zLT53YXZlbGV0X2RlcHRoLWkpLCAiY29kZWJsb2NrIHdpZHRoIGludmFsaWRcbiIpCisgICAgICAgICAgICAgICAgQ0hFQ0tFRFJFQUQocy0+Y29kZWJsb2NrW2ldLmhlaWdodCwgdG1wIDwgMSB8fCB0bXAgPiAocy0+YXZjdHgtPmhlaWdodD4+cy0+d2F2ZWxldF9kZXB0aC1pKSwgImNvZGVibG9jayBoZWlnaHQgaW52YWxpZFxuIikKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0tFRFJFQUQocy0+Y29kZWJsb2NrX21vZGUsIHRtcCA+IDEsICJ1bmtub3duIGNvZGVibG9jayBtb2RlXG4iKQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gcy0+d2F2ZWxldF9kZXB0aDsgaSsrKQorICAgICAgICAgICAgICAgIHMtPmNvZGVibG9ja1tpXS53aWR0aCA9IHMtPmNvZGVibG9ja1tpXS5oZWlnaHQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFNsaWNlIHBhcmFtZXRlcnMgKyBxdWFudGl6YXRpb24gbWF0cml4Ki8KKyAgICAgICAgLypbRElSQUNfU1REXSAxMS4zLjQgU2xpY2UgY29kaW5nIFBhcmFtZXRlcnMgKGxvdyBkZWxheSBzeW50YXggb25seSkuIHNsaWNlX3BhcmFtZXRlcnMoKSAqLworICAgICAgICBzLT5sb3dkZWxheS5udW1feCAgICAgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT5sb3dkZWxheS5udW1feSAgICAgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT5sb3dkZWxheS5ieXRlcy5udW0gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT5sb3dkZWxheS5ieXRlcy5kZW4gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworCisgICAgICAgIGlmIChzLT5sb3dkZWxheS5ieXRlcy5kZW4gPD0gMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LEFWX0xPR19FUlJPUiwiSW52YWxpZCBsb3dkZWxheS5ieXRlcy5kZW5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICAvKiBbRElSQUNfU1REXSAxMS4zLjUgUXVhbnRpc2F0aW9uIG1hdHJpY2VzIChsb3ctZGVsYXkgc3ludGF4KS4gcXVhbnRfbWF0cml4KCkgKi8KKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCxBVl9MT0dfREVCVUcsIkxvdyBEZWxheTogSGFzIEN1c3RvbSBRdWFudGl6YXRpb24gTWF0cml4IVxuIik7CisgICAgICAgICAgICAvKiBjdXN0b20gcXVhbnRpemF0aW9uIG1hdHJpeCAqLworICAgICAgICAgICAgcy0+bG93ZGVsYXkucXVhbnRbMF1bMF0gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgcy0+d2F2ZWxldF9kZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgICAgIHMtPmxvd2RlbGF5LnF1YW50W2xldmVsXVsxXSA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgICAgICAgICAgcy0+bG93ZGVsYXkucXVhbnRbbGV2ZWxdWzJdID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgICAgICAgICBzLT5sb3dkZWxheS5xdWFudFtsZXZlbF1bM10gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHMtPndhdmVsZXRfZGVwdGggPiA0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LEFWX0xPR19FUlJPUiwiTWFuZGF0b3J5IGN1c3RvbSBsb3cgZGVsYXkgbWF0cml4IG1pc3NpbmcgZm9yIGRlcHRoICVkXG4iLCBzLT53YXZlbGV0X2RlcHRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRlZmF1bHQgcXVhbnRpemF0aW9uIG1hdHJpeCAqLworICAgICAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgcy0+d2F2ZWxldF9kZXB0aDsgbGV2ZWwrKykKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmxvd2RlbGF5LnF1YW50W2xldmVsXVtpXSA9IGRlZmF1bHRfcW1hdFtzLT53YXZlbGV0X2lkeF1bbGV2ZWxdW2ldOworICAgICAgICAgICAgICAgICAgICAvKiBoYWFyIHdpdGggbm8gc2hpZnQgZGlmZmVycyBmb3IgZGlmZmVyZW50IGRlcHRocyAqLworICAgICAgICAgICAgICAgICAgICBpZiAocy0+d2F2ZWxldF9pZHggPT0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxvd2RlbGF5LnF1YW50W2xldmVsXVtpXSArPSA0KihzLT53YXZlbGV0X2RlcHRoLTEgLSBsZXZlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmVkX3Nic3BsaXQodWludDhfdCAqc2JzcGxpdCwgaW50IHN0cmlkZSwgaW50IHgsIGludCB5KQoreworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGF2Z3NwbGl0WzddID0geyAwLCAwLCAxLCAxLCAxLCAyLCAyIH07CisKKyAgICBpZiAoISh4fHkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlbHNlIGlmICgheSkKKyAgICAgICAgcmV0dXJuIHNic3BsaXRbLTFdOworICAgIGVsc2UgaWYgKCF4KQorICAgICAgICByZXR1cm4gc2JzcGxpdFstc3RyaWRlXTsKKworICAgIHJldHVybiBhdmdzcGxpdFtzYnNwbGl0Wy0xXSArIHNic3BsaXRbLXN0cmlkZV0gKyBzYnNwbGl0Wy1zdHJpZGUtMV1dOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmVkX2Jsb2NrX21vZGUoRGlyYWNCbG9jayAqYmxvY2ssIGludCBzdHJpZGUsIGludCB4LCBpbnQgeSwgaW50IHJlZm1hc2spCit7CisgICAgaW50IHByZWQ7CisKKyAgICBpZiAoISh4fHkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlbHNlIGlmICgheSkKKyAgICAgICAgcmV0dXJuIGJsb2NrWy0xXS5yZWYgJiByZWZtYXNrOworICAgIGVsc2UgaWYgKCF4KQorICAgICAgICByZXR1cm4gYmxvY2tbLXN0cmlkZV0ucmVmICYgcmVmbWFzazsKKworICAgIC8qIHJldHVybiB0aGUgbWFqb3JpdHkgKi8KKyAgICBwcmVkID0gKGJsb2NrWy0xXS5yZWYgJiByZWZtYXNrKSArIChibG9ja1stc3RyaWRlXS5yZWYgJiByZWZtYXNrKSArIChibG9ja1stc3RyaWRlLTFdLnJlZiAmIHJlZm1hc2spOworICAgIHJldHVybiAocHJlZCA+PiAxKSAmIHJlZm1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVkX2Jsb2NrX2RjKERpcmFjQmxvY2sgKmJsb2NrLCBpbnQgc3RyaWRlLCBpbnQgeCwgaW50IHkpCit7CisgICAgaW50IGksIG4gPSAwOworCisgICAgbWVtc2V0KGJsb2NrLT51LmRjLCAwLCBzaXplb2YoYmxvY2stPnUuZGMpKTsKKworICAgIGlmICh4ICYmICEoYmxvY2tbLTFdLnJlZiAmIDMpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICBibG9jay0+dS5kY1tpXSArPSBibG9ja1stMV0udS5kY1tpXTsKKyAgICAgICAgbisrOworICAgIH0KKworICAgIGlmICh5ICYmICEoYmxvY2tbLXN0cmlkZV0ucmVmICYgMykpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIGJsb2NrLT51LmRjW2ldICs9IGJsb2NrWy1zdHJpZGVdLnUuZGNbaV07CisgICAgICAgIG4rKzsKKyAgICB9CisKKyAgICBpZiAoeCAmJiB5ICYmICEoYmxvY2tbLTEtc3RyaWRlXS5yZWYgJiAzKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgYmxvY2stPnUuZGNbaV0gKz0gYmxvY2tbLTEtc3RyaWRlXS51LmRjW2ldOworICAgICAgICBuKys7CisgICAgfQorCisgICAgaWYgKG4gPT0gMikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgYmxvY2stPnUuZGNbaV0gPSAoYmxvY2stPnUuZGNbaV0rMSk+PjE7CisgICAgfSBlbHNlIGlmIChuID09IDMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIGJsb2NrLT51LmRjW2ldID0gZGl2aWRlMyhibG9jay0+dS5kY1tpXSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlZF9tdihEaXJhY0Jsb2NrICpibG9jaywgaW50IHN0cmlkZSwgaW50IHgsIGludCB5LCBpbnQgcmVmKQoreworICAgIGludDE2X3QgKnByZWRbM107CisgICAgaW50IHJlZm1hc2sgPSByZWYrMTsKKyAgICBpbnQgbWFzayA9IHJlZm1hc2sgfCBESVJBQ19SRUZfTUFTS19HTE9CQUw7IC8qICBleGNsdWRlIGdtYyBibG9ja3MgKi8KKyAgICBpbnQgbiA9IDA7CisKKyAgICBpZiAoeCAmJiAoYmxvY2tbLTFdLnJlZiAmIG1hc2spID09IHJlZm1hc2spCisgICAgICAgIHByZWRbbisrXSA9IGJsb2NrWy0xXS51Lm12W3JlZl07CisKKyAgICBpZiAoeSAmJiAoYmxvY2tbLXN0cmlkZV0ucmVmICYgbWFzaykgPT0gcmVmbWFzaykKKyAgICAgICAgcHJlZFtuKytdID0gYmxvY2tbLXN0cmlkZV0udS5tdltyZWZdOworCisgICAgaWYgKHggJiYgeSAmJiAoYmxvY2tbLXN0cmlkZS0xXS5yZWYgJiBtYXNrKSA9PSByZWZtYXNrKQorICAgICAgICBwcmVkW24rK10gPSBibG9ja1stc3RyaWRlLTFdLnUubXZbcmVmXTsKKworICAgIHN3aXRjaCAobikgeworICAgIGNhc2UgMDoKKyAgICAgICAgYmxvY2stPnUubXZbcmVmXVswXSA9IDA7CisgICAgICAgIGJsb2NrLT51Lm12W3JlZl1bMV0gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGJsb2NrLT51Lm12W3JlZl1bMF0gPSBwcmVkWzBdWzBdOworICAgICAgICBibG9jay0+dS5tdltyZWZdWzFdID0gcHJlZFswXVsxXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBibG9jay0+dS5tdltyZWZdWzBdID0gKHByZWRbMF1bMF0gKyBwcmVkWzFdWzBdICsgMSkgPj4gMTsKKyAgICAgICAgYmxvY2stPnUubXZbcmVmXVsxXSA9IChwcmVkWzBdWzFdICsgcHJlZFsxXVsxXSArIDEpID4+IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgYmxvY2stPnUubXZbcmVmXVswXSA9IG1pZF9wcmVkKHByZWRbMF1bMF0sIHByZWRbMV1bMF0sIHByZWRbMl1bMF0pOworICAgICAgICBibG9jay0+dS5tdltyZWZdWzFdID0gbWlkX3ByZWQocHJlZFswXVsxXSwgcHJlZFsxXVsxXSwgcHJlZFsyXVsxXSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2xvYmFsX212KERpcmFjQ29udGV4dCAqcywgRGlyYWNCbG9jayAqYmxvY2ssIGludCB4LCBpbnQgeSwgaW50IHJlZikKK3sKKyAgICBpbnQgZXogICAgICA9IHMtPmdsb2JhbG1jW3JlZl0uenJzX2V4cDsKKyAgICBpbnQgZXAgICAgICA9IHMtPmdsb2JhbG1jW3JlZl0ucGVyc3BlY3RpdmVfZXhwOworICAgIGludCAoKkEpWzJdID0gcy0+Z2xvYmFsbWNbcmVmXS56cnM7CisgICAgaW50ICpiICAgICAgPSBzLT5nbG9iYWxtY1tyZWZdLnBhbl90aWx0OworICAgIGludCAqYyAgICAgID0gcy0+Z2xvYmFsbWNbcmVmXS5wZXJzcGVjdGl2ZTsKKworICAgIGludCBtICAgICAgID0gKDE8PGVwKSAtIChjWzBdKnggKyBjWzFdKnkpOworICAgIGludCBteCAgICAgID0gbSAqICgoQVswXVswXSAqIHggKyBBWzBdWzFdKnkpICsgKDE8PGV6KSAqIGJbMF0pOworICAgIGludCBteSAgICAgID0gbSAqICgoQVsxXVswXSAqIHggKyBBWzFdWzFdKnkpICsgKDE8PGV6KSAqIGJbMV0pOworCisgICAgYmxvY2stPnUubXZbcmVmXVswXSA9IChteCArICgxPDwoZXorZXApKSkgPj4gKGV6K2VwKTsKKyAgICBibG9jay0+dS5tdltyZWZdWzFdID0gKG15ICsgKDE8PChleitlcCkpKSA+PiAoZXorZXApOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfYmxvY2tfcGFyYW1zKERpcmFjQ29udGV4dCAqcywgRGlyYWNBcml0aCBhcml0aFs4XSwgRGlyYWNCbG9jayAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCB4LCBpbnQgeSkKK3sKKyAgICBpbnQgaTsKKworICAgIGJsb2NrLT5yZWYgID0gcHJlZF9ibG9ja19tb2RlKGJsb2NrLCBzdHJpZGUsIHgsIHksIERJUkFDX1JFRl9NQVNLX1JFRjEpOworICAgIGJsb2NrLT5yZWYgXj0gZGlyYWNfZ2V0X2FyaXRoX2JpdChhcml0aCwgQ1RYX1BNT0RFX1JFRjEpOworCisgICAgaWYgKHMtPm51bV9yZWZzID09IDIpIHsKKyAgICAgICAgYmxvY2stPnJlZiB8PSBwcmVkX2Jsb2NrX21vZGUoYmxvY2ssIHN0cmlkZSwgeCwgeSwgRElSQUNfUkVGX01BU0tfUkVGMik7CisgICAgICAgIGJsb2NrLT5yZWYgXj0gZGlyYWNfZ2V0X2FyaXRoX2JpdChhcml0aCwgQ1RYX1BNT0RFX1JFRjIpIDw8IDE7CisgICAgfQorCisgICAgaWYgKCFibG9jay0+cmVmKSB7CisgICAgICAgIHByZWRfYmxvY2tfZGMoYmxvY2ssIHN0cmlkZSwgeCwgeSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICBibG9jay0+dS5kY1tpXSArPSBkaXJhY19nZXRfYXJpdGhfaW50KGFyaXRoKzEraSwgQ1RYX0RDX0YxLCBDVFhfRENfREFUQSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocy0+Z2xvYmFsbWNfZmxhZykgeworICAgICAgICBibG9jay0+cmVmIHw9IHByZWRfYmxvY2tfbW9kZShibG9jaywgc3RyaWRlLCB4LCB5LCBESVJBQ19SRUZfTUFTS19HTE9CQUwpOworICAgICAgICBibG9jay0+cmVmIF49IGRpcmFjX2dldF9hcml0aF9iaXQoYXJpdGgsIENUWF9HTE9CQUxfQkxPQ0spIDw8IDI7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9yZWZzOyBpKyspCisgICAgICAgIGlmIChibG9jay0+cmVmICYgKGkrMSkpIHsKKyAgICAgICAgICAgIGlmIChibG9jay0+cmVmICYgRElSQUNfUkVGX01BU0tfR0xPQkFMKSB7CisgICAgICAgICAgICAgICAgZ2xvYmFsX212KHMsIGJsb2NrLCB4LCB5LCBpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJlZF9tdihibG9jaywgc3RyaWRlLCB4LCB5LCBpKTsKKyAgICAgICAgICAgICAgICBibG9jay0+dS5tdltpXVswXSArPSBkaXJhY19nZXRfYXJpdGhfaW50KGFyaXRoICsgNCArIDIgKiBpLCBDVFhfTVZfRjEsIENUWF9NVl9EQVRBKTsKKyAgICAgICAgICAgICAgICBibG9jay0+dS5tdltpXVsxXSArPSBkaXJhY19nZXRfYXJpdGhfaW50KGFyaXRoICsgNSArIDIgKiBpLCBDVFhfTVZfRjEsIENUWF9NVl9EQVRBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCisvKioKKyAqIENvcGllcyB0aGUgY3VycmVudCBibG9jayB0byB0aGUgb3RoZXIgYmxvY2tzIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgc3VwZXJibG9jayBzcGxpdCBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIHByb3BhZ2F0ZV9ibG9ja19kYXRhKERpcmFjQmxvY2sgKmJsb2NrLCBpbnQgc3RyaWRlLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBEaXJhY0Jsb2NrICpkc3QgPSBibG9jazsKKworICAgIGZvciAoeCA9IDE7IHggPCBzaXplOyB4KyspCisgICAgICAgIGRzdFt4XSA9ICpibG9jazsKKworICAgIGZvciAoeSA9IDE7IHkgPCBzaXplOyB5KyspIHsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9ICpibG9jazsKKyAgICB9Cit9CisKKy8qKgorICogRGlyYWMgU3BlY2lmaWNhdGlvbiAtPgorICogMTIuIEJsb2NrIG1vdGlvbiBkYXRhIHN5bnRheAorICovCitzdGF0aWMgaW50IGRpcmFjX3VucGFja19ibG9ja19tb3Rpb25fZGF0YShEaXJhY0NvbnRleHQgKnMpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+Z2I7CisgICAgdWludDhfdCAqc2JzcGxpdCA9IHMtPnNic3BsaXQ7CisgICAgaW50IGksIHgsIHksIHEsIHA7CisgICAgRGlyYWNBcml0aCBhcml0aFs4XTsKKworICAgIGFsaWduX2dldF9iaXRzKGdiKTsKKworICAgIC8qIFtESVJBQ19TVERdIDExLjIuNCBhbmQgMTIuMi4xIE51bWJlciBvZiBibG9ja3MgYW5kIHN1cGVyYmxvY2tzICovCisgICAgcy0+c2J3aWR0aCAgPSBESVZSTkRVUChzLT5zb3VyY2Uud2lkdGgsICA0KnMtPnBsYW5lWzBdLnhic2VwKTsKKyAgICBzLT5zYmhlaWdodCA9IERJVlJORFVQKHMtPnNvdXJjZS5oZWlnaHQsIDQqcy0+cGxhbmVbMF0ueWJzZXApOworICAgIHMtPmJsd2lkdGggID0gNCAqIHMtPnNid2lkdGg7CisgICAgcy0+YmxoZWlnaHQgPSA0ICogcy0+c2JoZWlnaHQ7CisKKyAgICAvKiBbRElSQUNfU1REXSAxMi4zLjEgU3VwZXJibG9jayBzcGxpdHRpbmcgbW9kZXMuIHN1cGVyYmxvY2tfc3BsaXRfbW9kZXMoKQorICAgICAgIGRlY29kZSBzdXBlcmJsb2NrIHNwbGl0IG1vZGVzICovCisgICAgZmZfZGlyYWNfaW5pdF9hcml0aF9kZWNvZGVyKGFyaXRoLCBnYiwgc3ZxM19nZXRfdWVfZ29sb21iKGdiKSk7ICAgICAvKiBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpIGlzIHRoZSBsZW5ndGggKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgcy0+c2JoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+c2J3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3BsaXQgID0gZGlyYWNfZ2V0X2FyaXRoX3VpbnQoYXJpdGgsIENUWF9TQl9GMSwgQ1RYX1NCX0RBVEEpOworICAgICAgICAgICAgaWYgKHNwbGl0ID4gMikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzYnNwbGl0W3hdID0gKHNwbGl0ICsgcHJlZF9zYnNwbGl0KHNic3BsaXQreCwgcy0+c2J3aWR0aCwgeCwgeSkpICUgMzsKKyAgICAgICAgfQorICAgICAgICBzYnNwbGl0ICs9IHMtPnNid2lkdGg7CisgICAgfQorCisgICAgLyogc2V0dXAgYXJpdGggZGVjb2RpbmcgKi8KKyAgICBmZl9kaXJhY19pbml0X2FyaXRoX2RlY29kZXIoYXJpdGgsIGdiLCBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX3JlZnM7IGkrKykgeworICAgICAgICBmZl9kaXJhY19pbml0X2FyaXRoX2RlY29kZXIoYXJpdGggKyA0ICsgMiAqIGksIGdiLCBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpKTsKKyAgICAgICAgZmZfZGlyYWNfaW5pdF9hcml0aF9kZWNvZGVyKGFyaXRoICsgNSArIDIgKiBpLCBnYiwgc3ZxM19nZXRfdWVfZ29sb21iKGdiKSk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGZmX2RpcmFjX2luaXRfYXJpdGhfZGVjb2Rlcihhcml0aCsxK2ksIGdiLCBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBzLT5zYmhlaWdodDsgeSsrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+c2J3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgYmxrY250ID0gMSA8PCBzLT5zYnNwbGl0W3kgKiBzLT5zYndpZHRoICsgeF07CisgICAgICAgICAgICBpbnQgc3RlcCAgID0gNCA+PiBzLT5zYnNwbGl0W3kgKiBzLT5zYndpZHRoICsgeF07CisKKyAgICAgICAgICAgIGZvciAocSA9IDA7IHEgPCBibGtjbnQ7IHErKykKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgYmxrY250OyBwKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJ4ID0gNCAqIHggKyBwKnN0ZXA7CisgICAgICAgICAgICAgICAgICAgIGludCBieSA9IDQgKiB5ICsgcSpzdGVwOworICAgICAgICAgICAgICAgICAgICBEaXJhY0Jsb2NrICpibG9jayA9ICZzLT5ibG1vdGlvbltieSpzLT5ibHdpZHRoICsgYnhdOworICAgICAgICAgICAgICAgICAgICBkZWNvZGVfYmxvY2tfcGFyYW1zKHMsIGFyaXRoLCBibG9jaywgcy0+Ymx3aWR0aCwgYngsIGJ5KTsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGFnYXRlX2Jsb2NrX2RhdGEoYmxvY2ssIHMtPmJsd2lkdGgsIHN0ZXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2VpZ2h0KGludCBpLCBpbnQgYmxlbiwgaW50IG9mZnNldCkKK3sKKyNkZWZpbmUgUk9MTE9GRihpKSBvZmZzZXQgPT0gMSA/ICgoaSkgPyA1IDogMykgOiAgICAgICAgXAorICAgICgxICsgKDYqKGkpICsgb2Zmc2V0IC0gMSkgLyAoMipvZmZzZXQgLSAxKSkKKworICAgIGlmIChpIDwgMipvZmZzZXQpCisgICAgICAgIHJldHVybiBST0xMT0ZGKGkpOworICAgIGVsc2UgaWYgKGkgPiBibGVuLTEgLSAyKm9mZnNldCkKKyAgICAgICAgcmV0dXJuIFJPTExPRkYoYmxlbi0xIC0gaSk7CisgICAgcmV0dXJuIDg7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb2JtY193ZWlnaHRfcm93KFBsYW5lICpwLCB1aW50OF90ICpvYm1jX3dlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCB3eSkKK3sKKyAgICBpbnQgeDsKKyAgICBmb3IgKHggPSAwOyBsZWZ0ICYmIHggPCBwLT54YmxlbiA+PiAxOyB4KyspCisgICAgICAgIG9ibWNfd2VpZ2h0W3hdID0gd3kqODsKKyAgICBmb3IgKDsgeCA8IHAtPnhibGVuID4+IHJpZ2h0OyB4KyspCisgICAgICAgIG9ibWNfd2VpZ2h0W3hdID0gd3kqd2VpZ2h0KHgsIHAtPnhibGVuLCBwLT54b2Zmc2V0KTsKKyAgICBmb3IgKDsgeCA8IHAtPnhibGVuOyB4KyspCisgICAgICAgIG9ibWNfd2VpZ2h0W3hdID0gd3kqODsKKyAgICBmb3IgKDsgeCA8IHN0cmlkZTsgeCsrKQorICAgICAgICBvYm1jX3dlaWdodFt4XSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb2JtY193ZWlnaHQoUGxhbmUgKnAsIHVpbnQ4X3QgKm9ibWNfd2VpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgdG9wLCBpbnQgYm90dG9tKQoreworICAgIGludCB5OworICAgIGZvciAoeSA9IDA7IHRvcCAmJiB5IDwgcC0+eWJsZW4gPj4gMTsgeSsrKSB7CisgICAgICAgIGluaXRfb2JtY193ZWlnaHRfcm93KHAsIG9ibWNfd2VpZ2h0LCBzdHJpZGUsIGxlZnQsIHJpZ2h0LCA4KTsKKyAgICAgICAgb2JtY193ZWlnaHQgKz0gc3RyaWRlOworICAgIH0KKyAgICBmb3IgKDsgeSA8IHAtPnlibGVuID4+IGJvdHRvbTsgeSsrKSB7CisgICAgICAgIGludCB3eSA9IHdlaWdodCh5LCBwLT55YmxlbiwgcC0+eW9mZnNldCk7CisgICAgICAgIGluaXRfb2JtY193ZWlnaHRfcm93KHAsIG9ibWNfd2VpZ2h0LCBzdHJpZGUsIGxlZnQsIHJpZ2h0LCB3eSk7CisgICAgICAgIG9ibWNfd2VpZ2h0ICs9IHN0cmlkZTsKKyAgICB9CisgICAgZm9yICg7IHkgPCBwLT55YmxlbjsgeSsrKSB7CisgICAgICAgIGluaXRfb2JtY193ZWlnaHRfcm93KHAsIG9ibWNfd2VpZ2h0LCBzdHJpZGUsIGxlZnQsIHJpZ2h0LCA4KTsKKyAgICAgICAgb2JtY193ZWlnaHQgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaW5pdF9vYm1jX3dlaWdodHMoRGlyYWNDb250ZXh0ICpzLCBQbGFuZSAqcCwgaW50IGJ5KQoreworICAgIGludCB0b3AgPSAhYnk7CisgICAgaW50IGJvdHRvbSA9IGJ5ID09IHMtPmJsaGVpZ2h0LTE7CisKKyAgICAvKiBkb24ndCBib3RoZXIgcmUtaW5pdGluZyBmb3Igcm93cyAyIHRvIGJsaGVpZ2h0LTIsIHRoZSB3ZWlnaHRzIGRvbid0IGNoYW5nZSAqLworICAgIGlmICh0b3AgfHwgYm90dG9tIHx8IGJ5ID09IDEpIHsKKyAgICAgICAgaW5pdF9vYm1jX3dlaWdodChwLCBzLT5vYm1jX3dlaWdodFswXSwgTUFYX0JMT0NLU0laRSwgMSwgMCwgdG9wLCBib3R0b20pOworICAgICAgICBpbml0X29ibWNfd2VpZ2h0KHAsIHMtPm9ibWNfd2VpZ2h0WzFdLCBNQVhfQkxPQ0tTSVpFLCAwLCAwLCB0b3AsIGJvdHRvbSk7CisgICAgICAgIGluaXRfb2JtY193ZWlnaHQocCwgcy0+b2JtY193ZWlnaHRbMl0sIE1BWF9CTE9DS1NJWkUsIDAsIDEsIHRvcCwgYm90dG9tKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGVwZWxfd2VpZ2h0c1s0XVs0XVs0XSA9IHsKKyAgICB7eyAxNiwgIDAsICAwLCAgMCB9LAorICAgICB7IDEyLCAgNCwgIDAsICAwIH0sCisgICAgIHsgIDgsICA4LCAgMCwgIDAgfSwKKyAgICAgeyAgNCwgMTIsICAwLCAgMCB9fSwKKyAgICB7eyAxMiwgIDAsICA0LCAgMCB9LAorICAgICB7ICA5LCAgMywgIDMsICAxIH0sCisgICAgIHsgIDYsICA2LCAgMiwgIDIgfSwKKyAgICAgeyAgMywgIDksICAxLCAgMyB9fSwKKyAgICB7eyAgOCwgIDAsICA4LCAgMCB9LAorICAgICB7ICA2LCAgMiwgIDYsICAyIH0sCisgICAgIHsgIDQsICA0LCAgNCwgIDQgfSwKKyAgICAgeyAgMiwgIDYsICAyLCAgNiB9fSwKKyAgICB7eyAgNCwgIDAsIDEyLCAgMCB9LAorICAgICB7ICAzLCAgMSwgIDksICAzIH0sCisgICAgIHsgIDIsICAyLCAgNiwgIDYgfSwKKyAgICAgeyAgMSwgIDMsICAzLCAgOSB9fQorfTsKKworLyoqCisgKiBGb3IgYmxvY2sgeCx5LCBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlIGhwZWwgcGxhbmVzIHRvIGRvIGJpbGluZWFyCisgKiBpbnRlcnBvbGF0aW9uIGZyb20gYW5kIHNldCBzcmNbXSB0byB0aGUgbG9jYXRpb24gaW4gZWFjaCBocGVsIHBsYW5lCisgKiB0byBNQyBmcm9tLgorICoKKyAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBwdXRfZGlyYWNfcGl4ZWxzX3RhYiBmdW5jdGlvbiB0byB1c2UKKyAqICAwIGZvciAxIHBsYW5lIChmcGVsLGhwZWwpLCAxIGZvciAyIHBsYW5lcyAocXBlbCksIDIgZm9yIDQgcGxhbmVzIChxcGVsKSwgYW5kIDMgZm9yIGVwZWwKKyAqLworc3RhdGljIGludCBtY19zdWJwZWwoRGlyYWNDb250ZXh0ICpzLCBEaXJhY0Jsb2NrICpibG9jaywgY29uc3QgdWludDhfdCAqc3JjWzVdLAorICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgcmVmLCBpbnQgcGxhbmUpCit7CisgICAgUGxhbmUgKnAgPSAmcy0+cGxhbmVbcGxhbmVdOworICAgIHVpbnQ4X3QgKipyZWZfaHBlbCA9IHMtPnJlZl9waWNzW3JlZl0tPmhwZWxbcGxhbmVdOworICAgIGludCBtb3Rpb25feCA9IGJsb2NrLT51Lm12W3JlZl1bMF07CisgICAgaW50IG1vdGlvbl95ID0gYmxvY2stPnUubXZbcmVmXVsxXTsKKyAgICBpbnQgbXgsIG15LCBpLCBlcGVsLCBucGxhbmVzID0gMDsKKworICAgIGlmIChwbGFuZSkgeworICAgICAgICBtb3Rpb25feCA+Pj0gcy0+Y2hyb21hX3hfc2hpZnQ7CisgICAgICAgIG1vdGlvbl95ID4+PSBzLT5jaHJvbWFfeV9zaGlmdDsKKyAgICB9CisKKyAgICBteCAgICAgICAgID0gbW90aW9uX3ggJiB+KC0xVSA8PCBzLT5tdl9wcmVjaXNpb24pOworICAgIG15ICAgICAgICAgPSBtb3Rpb25feSAmIH4oLTFVIDw8IHMtPm12X3ByZWNpc2lvbik7CisgICAgbW90aW9uX3ggPj49IHMtPm12X3ByZWNpc2lvbjsKKyAgICBtb3Rpb25feSA+Pj0gcy0+bXZfcHJlY2lzaW9uOworICAgIC8qIG5vcm1hbGl6ZSBzdWJwZWwgY29vcmRpbmF0ZXMgdG8gZXBlbCAqLworICAgIC8qIFRPRE86IHRlbXBsYXRlIHRoaXMgZnVuY3Rpb24/ICovCisgICAgbXggICAgICA8PD0gMyAtIHMtPm12X3ByZWNpc2lvbjsKKyAgICBteSAgICAgIDw8PSAzIC0gcy0+bXZfcHJlY2lzaW9uOworCisgICAgeCArPSBtb3Rpb25feDsKKyAgICB5ICs9IG1vdGlvbl95OworICAgIGVwZWwgPSAobXh8bXkpJjE7CisKKyAgICAvKiBocGVsIHBvc2l0aW9uICovCisgICAgaWYgKCEoKG14fG15KSYzKSkgeworICAgICAgICBucGxhbmVzID0gMTsKKyAgICAgICAgc3JjWzBdID0gcmVmX2hwZWxbKG15Pj4xKSsobXg+PjIpXSArIHkqcC0+c3RyaWRlICsgeDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBxcGVsIG9yIGVwZWwgKi8KKyAgICAgICAgbnBsYW5lcyA9IDQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBzcmNbaV0gPSByZWZfaHBlbFtpXSArIHkqcC0+c3RyaWRlICsgeDsKKworICAgICAgICAvKiBpZiB3ZSdyZSBpbnRlcnBvbGF0aW5nIGluIHRoZSByaWdodC9ib3R0b20gaGFsdmVzLCBhZGp1c3QgdGhlIHBsYW5lcyBhcyBuZWVkZWQKKyAgICAgICAgICAgd2UgaW5jcmVtZW50IHgveSBiZWNhdXNlIHRoZSBlZGdlIGNoYW5nZXMgZm9yIGhhbGYgb2YgdGhlIHBpeGVscyAqLworICAgICAgICBpZiAobXggPiA0KSB7CisgICAgICAgICAgICBzcmNbMF0gKz0gMTsKKyAgICAgICAgICAgIHNyY1syXSArPSAxOworICAgICAgICAgICAgeCsrOworICAgICAgICB9CisgICAgICAgIGlmIChteSA+IDQpIHsKKyAgICAgICAgICAgIHNyY1swXSArPSBwLT5zdHJpZGU7CisgICAgICAgICAgICBzcmNbMV0gKz0gcC0+c3RyaWRlOworICAgICAgICAgICAgeSsrOworICAgICAgICB9CisKKyAgICAgICAgLyogaHBlbCBwbGFuZXMgYXJlOgorICAgICAgICAgICBbMF06IEYgIFsxXTogSAorICAgICAgICAgICBbMl06IFYgIFszXTogQyAqLworICAgICAgICBpZiAoIWVwZWwpIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIHdlIHJlYWxseSBvbmx5IG5lZWQgMiBwbGFuZXMgc2luY2UgZWl0aGVyIG14IG9yIG15IGlzCisgICAgICAgICAgICAgICBhIGhwZWwgcG9zaXRpb24uIChlcGVsIHdlaWdodHMgb2YgMCBoYW5kbGUgdGhpcyB0aGVyZSkgKi8KKyAgICAgICAgICAgIGlmICghKG14JjMpKSB7CisgICAgICAgICAgICAgICAgLyogbXggPT0gMDogYXZlcmFnZSBbMF0gYW5kIFsyXQorICAgICAgICAgICAgICAgICAgIG14ID09IDQ6IGF2ZXJhZ2UgWzFdIGFuZCBbM10gKi8KKyAgICAgICAgICAgICAgICBzcmNbIW14XSA9IHNyY1syICsgISFteF07CisgICAgICAgICAgICAgICAgbnBsYW5lcyA9IDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEobXkmMykpIHsKKyAgICAgICAgICAgICAgICBzcmNbMF0gPSBzcmNbKG15Pj4xKSAgXTsKKyAgICAgICAgICAgICAgICBzcmNbMV0gPSBzcmNbKG15Pj4xKSsxXTsKKyAgICAgICAgICAgICAgICBucGxhbmVzID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGFkanVzdCB0aGUgb3JkZXJpbmcgaWYgbmVlZGVkIHNvIHRoZSB3ZWlnaHRzIHdvcmsgKi8KKyAgICAgICAgICAgIGlmIChteCA+IDQpIHsKKyAgICAgICAgICAgICAgICBGRlNXQVAoY29uc3QgdWludDhfdCAqLCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICAgICAgICAgICAgRkZTV0FQKGNvbnN0IHVpbnQ4X3QgKiwgc3JjWzJdLCBzcmNbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG15ID4gNCkgeworICAgICAgICAgICAgICAgIEZGU1dBUChjb25zdCB1aW50OF90ICosIHNyY1swXSwgc3JjWzJdKTsKKyAgICAgICAgICAgICAgICBGRlNXQVAoY29uc3QgdWludDhfdCAqLCBzcmNbMV0sIHNyY1szXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmNbNF0gPSBlcGVsX3dlaWdodHNbbXkmM11bbXgmM107CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmaXhtZTogdi9oIF9lZGdlX3BvcyAqLworICAgIGlmICh4ICsgcC0+eGJsZW4gPiBwLT53aWR0aCArRURHRV9XSURUSC8yIHx8CisgICAgICAgIHkgKyBwLT55YmxlbiA+IHAtPmhlaWdodCtFREdFX1dJRFRILzIgfHwKKyAgICAgICAgeCA8IDAgfHwgeSA8IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5wbGFuZXM7IGkrKykgeworICAgICAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlcltpXSwgc3JjW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnN0cmlkZSwgcC0+c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnhibGVuLCBwLT55YmxlbiwgeCwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT53aWR0aCtFREdFX1dJRFRILzIsIHAtPmhlaWdodCtFREdFX1dJRFRILzIpOworICAgICAgICAgICAgc3JjW2ldID0gcy0+ZWRnZV9lbXVfYnVmZmVyW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAobnBsYW5lcz4+MSkgKyBlcGVsOworfQorCitzdGF0aWMgdm9pZCBhZGRfZGModWludDE2X3QgKmRzdCwgaW50IGRjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm9ibWNfd2VpZ2h0LCBpbnQgeGJsZW4sIGludCB5YmxlbikKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBkYyArPSAxMjg7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgeWJsZW47IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgeGJsZW47IHggKz0gMikgeworICAgICAgICAgICAgZHN0W3ggIF0gKz0gZGMgKiBvYm1jX3dlaWdodFt4ICBdOworICAgICAgICAgICAgZHN0W3grMV0gKz0gZGMgKiBvYm1jX3dlaWdodFt4KzFdOworICAgICAgICB9CisgICAgICAgIGRzdCAgICAgICAgICArPSBzdHJpZGU7CisgICAgICAgIG9ibWNfd2VpZ2h0ICArPSBNQVhfQkxPQ0tTSVpFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYmxvY2tfbWMoRGlyYWNDb250ZXh0ICpzLCBEaXJhY0Jsb2NrICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICptY3RtcCwgdWludDhfdCAqb2JtY193ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhbmUsIGludCBkc3R4LCBpbnQgZHN0eSkKK3sKKyAgICBQbGFuZSAqcCA9ICZzLT5wbGFuZVtwbGFuZV07CisgICAgY29uc3QgdWludDhfdCAqc3JjWzVdOworICAgIGludCBpZHg7CisKKyAgICBzd2l0Y2ggKGJsb2NrLT5yZWYmMykgeworICAgIGNhc2UgMDogLyogREMgKi8KKyAgICAgICAgYWRkX2RjKG1jdG1wLCBibG9jay0+dS5kY1twbGFuZV0sIHAtPnN0cmlkZSwgb2JtY193ZWlnaHQsIHAtPnhibGVuLCBwLT55Ymxlbik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgICAgICBpZHggPSBtY19zdWJwZWwocywgYmxvY2ssIHNyYywgZHN0eCwgZHN0eSwgKGJsb2NrLT5yZWYmMyktMSwgcGxhbmUpOworICAgICAgICBzLT5wdXRfcGl4ZWxzX3RhYltpZHhdKHMtPm1jc2NyYXRjaCwgc3JjLCBwLT5zdHJpZGUsIHAtPnlibGVuKTsKKyAgICAgICAgaWYgKHMtPndlaWdodF9mdW5jKQorICAgICAgICAgICAgcy0+d2VpZ2h0X2Z1bmMocy0+bWNzY3JhdGNoLCBwLT5zdHJpZGUsIHMtPndlaWdodF9sb2cyZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53ZWlnaHRbMF0gKyBzLT53ZWlnaHRbMV0sIHAtPnlibGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBpZHggPSBtY19zdWJwZWwocywgYmxvY2ssIHNyYywgZHN0eCwgZHN0eSwgMCwgcGxhbmUpOworICAgICAgICBzLT5wdXRfcGl4ZWxzX3RhYltpZHhdKHMtPm1jc2NyYXRjaCwgc3JjLCBwLT5zdHJpZGUsIHAtPnlibGVuKTsKKyAgICAgICAgaWR4ID0gbWNfc3VicGVsKHMsIGJsb2NrLCBzcmMsIGRzdHgsIGRzdHksIDEsIHBsYW5lKTsKKyAgICAgICAgaWYgKHMtPmJpd2VpZ2h0X2Z1bmMpIHsKKyAgICAgICAgICAgIC8qIGZpeG1lOiArMzIgaXMgYSBxdWljayBoYWNrICovCisgICAgICAgICAgICBzLT5wdXRfcGl4ZWxzX3RhYltpZHhdKHMtPm1jc2NyYXRjaCArIDMyLCBzcmMsIHAtPnN0cmlkZSwgcC0+eWJsZW4pOworICAgICAgICAgICAgcy0+Yml3ZWlnaHRfZnVuYyhzLT5tY3NjcmF0Y2gsIHMtPm1jc2NyYXRjaCszMiwgcC0+c3RyaWRlLCBzLT53ZWlnaHRfbG9nMmRlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53ZWlnaHRbMF0sIHMtPndlaWdodFsxXSwgcC0+eWJsZW4pOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHMtPmF2Z19waXhlbHNfdGFiW2lkeF0ocy0+bWNzY3JhdGNoLCBzcmMsIHAtPnN0cmlkZSwgcC0+eWJsZW4pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcy0+YWRkX29ibWMobWN0bXAsIHMtPm1jc2NyYXRjaCwgcC0+c3RyaWRlLCBvYm1jX3dlaWdodCwgcC0+eWJsZW4pOworfQorCitzdGF0aWMgdm9pZCBtY19yb3coRGlyYWNDb250ZXh0ICpzLCBEaXJhY0Jsb2NrICpibG9jaywgdWludDE2X3QgKm1jdG1wLCBpbnQgcGxhbmUsIGludCBkc3R5KQoreworICAgIFBsYW5lICpwID0gJnMtPnBsYW5lW3BsYW5lXTsKKyAgICBpbnQgeCwgZHN0eCA9IHAtPnhic2VwIC0gcC0+eG9mZnNldDsKKworICAgIGJsb2NrX21jKHMsIGJsb2NrLCBtY3RtcCwgcy0+b2JtY193ZWlnaHRbMF0sIHBsYW5lLCAtcC0+eG9mZnNldCwgZHN0eSk7CisgICAgbWN0bXAgKz0gcC0+eGJzZXA7CisKKyAgICBmb3IgKHggPSAxOyB4IDwgcy0+Ymx3aWR0aC0xOyB4KyspIHsKKyAgICAgICAgYmxvY2tfbWMocywgYmxvY2sreCwgbWN0bXAsIHMtPm9ibWNfd2VpZ2h0WzFdLCBwbGFuZSwgZHN0eCwgZHN0eSk7CisgICAgICAgIGRzdHggICs9IHAtPnhic2VwOworICAgICAgICBtY3RtcCArPSBwLT54YnNlcDsKKyAgICB9CisgICAgYmxvY2tfbWMocywgYmxvY2sreCwgbWN0bXAsIHMtPm9ibWNfd2VpZ2h0WzJdLCBwbGFuZSwgZHN0eCwgZHN0eSk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbGVjdF9kc3BfZnVuY3MoRGlyYWNDb250ZXh0ICpzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB4YmxlbiwgaW50IHlibGVuKQoreworICAgIGludCBpZHggPSAwOworICAgIGlmICh4YmxlbiA+IDgpCisgICAgICAgIGlkeCA9IDE7CisgICAgaWYgKHhibGVuID4gMTYpCisgICAgICAgIGlkeCA9IDI7CisKKyAgICBtZW1jcHkocy0+cHV0X3BpeGVsc190YWIsIHMtPmRpcmFjZHNwLnB1dF9kaXJhY19waXhlbHNfdGFiW2lkeF0sIHNpemVvZihzLT5wdXRfcGl4ZWxzX3RhYikpOworICAgIG1lbWNweShzLT5hdmdfcGl4ZWxzX3RhYiwgcy0+ZGlyYWNkc3AuYXZnX2RpcmFjX3BpeGVsc190YWJbaWR4XSwgc2l6ZW9mKHMtPmF2Z19waXhlbHNfdGFiKSk7CisgICAgcy0+YWRkX29ibWMgPSBzLT5kaXJhY2RzcC5hZGRfZGlyYWNfb2JtY1tpZHhdOworICAgIGlmIChzLT53ZWlnaHRfbG9nMmRlbm9tID4gMSB8fCBzLT53ZWlnaHRbMF0gIT0gMSB8fCBzLT53ZWlnaHRbMV0gIT0gMSkgeworICAgICAgICBzLT53ZWlnaHRfZnVuYyAgID0gcy0+ZGlyYWNkc3Aud2VpZ2h0X2RpcmFjX3BpeGVsc190YWJbaWR4XTsKKyAgICAgICAgcy0+Yml3ZWlnaHRfZnVuYyA9IHMtPmRpcmFjZHNwLmJpd2VpZ2h0X2RpcmFjX3BpeGVsc190YWJbaWR4XTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT53ZWlnaHRfZnVuYyAgID0gTlVMTDsKKyAgICAgICAgcy0+Yml3ZWlnaHRfZnVuYyA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpbnRlcnBvbGF0ZV9yZWZwbGFuZShEaXJhY0NvbnRleHQgKnMsIERpcmFjRnJhbWUgKnJlZiwgaW50IHBsYW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgLyogY2hyb21hIGFsbG9jYXRlcyBhbiBlZGdlIG9mIDggd2hlbiBzdWJzYW1wbGVkCisgICAgICAgd2hpY2ggZm9yIDQ6MjoyIG1lYW5zIGFuIGggZWRnZSBvZiAxNiBhbmQgdiBlZGdlIG9mIDgKKyAgICAgICBqdXN0IHVzZSA4IGZvciBldmVyeXRoaW5nIGZvciB0aGUgbW9tZW50ICovCisgICAgaW50IGksIGVkZ2UgPSBFREdFX1dJRFRILzI7CisKKyAgICByZWYtPmhwZWxbcGxhbmVdWzBdID0gcmVmLT5hdmZyYW1lLT5kYXRhW3BsYW5lXTsKKyAgICBzLT5tcHZlbmNkc3AuZHJhd19lZGdlcyhyZWYtPmhwZWxbcGxhbmVdWzBdLCByZWYtPmF2ZnJhbWUtPmxpbmVzaXplW3BsYW5lXSwgd2lkdGgsIGhlaWdodCwgZWRnZSwgZWRnZSwgRURHRV9UT1AgfCBFREdFX0JPVFRPTSk7IC8qIEVER0VfVE9QIHwgRURHRV9CT1RUT00gdmFsdWVzIGp1c3QgY29waWVkIHRvIG1ha2UgaXQgYnVpbGQsIHRoaXMgbmVlZHMgdG8gYmUgZW5zdXJlZCAqLworCisgICAgLyogbm8gbmVlZCBmb3IgaHBlbCBpZiB3ZSBvbmx5IGhhdmUgZnBlbCB2ZWN0b3JzICovCisgICAgaWYgKCFzLT5tdl9wcmVjaXNpb24pCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaWYgKCFyZWYtPmhwZWxfYmFzZVtwbGFuZV1baV0pCisgICAgICAgICAgICByZWYtPmhwZWxfYmFzZVtwbGFuZV1baV0gPSBhdl9tYWxsb2MoKGhlaWdodCsyKmVkZ2UpICogcmVmLT5hdmZyYW1lLT5saW5lc2l6ZVtwbGFuZV0gKyAzMik7CisgICAgICAgIC8qIHdlIG5lZWQgdG8gYmUgMTYtYnl0ZSBhbGlnbmVkIGV2ZW4gZm9yIGNocm9tYSAqLworICAgICAgICByZWYtPmhwZWxbcGxhbmVdW2ldID0gcmVmLT5ocGVsX2Jhc2VbcGxhbmVdW2ldICsgZWRnZSpyZWYtPmF2ZnJhbWUtPmxpbmVzaXplW3BsYW5lXSArIDE2OworICAgIH0KKworICAgIGlmICghcmVmLT5pbnRlcnBvbGF0ZWRbcGxhbmVdKSB7CisgICAgICAgIHMtPmRpcmFjZHNwLmRpcmFjX2hwZWxfZmlsdGVyKHJlZi0+aHBlbFtwbGFuZV1bMV0sIHJlZi0+aHBlbFtwbGFuZV1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+aHBlbFtwbGFuZV1bM10sIHJlZi0+aHBlbFtwbGFuZV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+YXZmcmFtZS0+bGluZXNpemVbcGxhbmVdLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcy0+bXB2ZW5jZHNwLmRyYXdfZWRnZXMocmVmLT5ocGVsW3BsYW5lXVsxXSwgcmVmLT5hdmZyYW1lLT5saW5lc2l6ZVtwbGFuZV0sIHdpZHRoLCBoZWlnaHQsIGVkZ2UsIGVkZ2UsIEVER0VfVE9QIHwgRURHRV9CT1RUT00pOworICAgICAgICBzLT5tcHZlbmNkc3AuZHJhd19lZGdlcyhyZWYtPmhwZWxbcGxhbmVdWzJdLCByZWYtPmF2ZnJhbWUtPmxpbmVzaXplW3BsYW5lXSwgd2lkdGgsIGhlaWdodCwgZWRnZSwgZWRnZSwgRURHRV9UT1AgfCBFREdFX0JPVFRPTSk7CisgICAgICAgIHMtPm1wdmVuY2RzcC5kcmF3X2VkZ2VzKHJlZi0+aHBlbFtwbGFuZV1bM10sIHJlZi0+YXZmcmFtZS0+bGluZXNpemVbcGxhbmVdLCB3aWR0aCwgaGVpZ2h0LCBlZGdlLCBlZGdlLCBFREdFX1RPUCB8IEVER0VfQk9UVE9NKTsKKyAgICB9CisgICAgcmVmLT5pbnRlcnBvbGF0ZWRbcGxhbmVdID0gMTsKK30KKworLyoqCisgKiBEaXJhYyBTcGVjaWZpY2F0aW9uIC0+CisgKiAxMy4wIFRyYW5zZm9ybSBkYXRhIHN5bnRheC4gdHJhbnNmb3JtX2RhdGEoKQorICovCitzdGF0aWMgaW50IGRpcmFjX2RlY29kZV9mcmFtZV9pbnRlcm5hbChEaXJhY0NvbnRleHQgKnMpCit7CisgICAgRFdUQ29udGV4dCBkOworICAgIGludCB5LCBpLCBjb21wLCBkc3R5OworCisgICAgaWYgKHMtPmxvd19kZWxheSkgeworICAgICAgICAvKiBbRElSQUNfU1REXSAxMy41LjEgbG93X2RlbGF5X3RyYW5zZm9ybV9kYXRhKCkgKi8KKyAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDM7IGNvbXArKykgeworICAgICAgICAgICAgUGxhbmUgKnAgPSAmcy0+cGxhbmVbY29tcF07CisgICAgICAgICAgICBtZW1zZXQocC0+aWR3dF9idWYsIDAsIHAtPmlkd3Rfc3RyaWRlICogcC0+aWR3dF9oZWlnaHQgKiBzaXplb2YoSURXVEVMRU0pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXMtPnplcm9fcmVzKQorICAgICAgICAgICAgZGVjb2RlX2xvd2RlbGF5KHMpOworICAgIH0KKworICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCAzOyBjb21wKyspIHsKKyAgICAgICAgUGxhbmUgKnAgICAgICAgPSAmcy0+cGxhbmVbY29tcF07CisgICAgICAgIHVpbnQ4X3QgKmZyYW1lID0gcy0+Y3VycmVudF9waWN0dXJlLT5hdmZyYW1lLT5kYXRhW2NvbXBdOworCisgICAgICAgIC8qIEZJWE1FOiBzbWFsbCByZXNvbHV0aW9ucyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgcy0+ZWRnZV9lbXVfYnVmZmVyW2ldID0gcy0+ZWRnZV9lbXVfYnVmZmVyX2Jhc2UgKyBpKkZGQUxJR04ocC0+d2lkdGgsIDE2KTsKKworICAgICAgICBpZiAoIXMtPnplcm9fcmVzICYmICFzLT5sb3dfZGVsYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldChwLT5pZHd0X2J1ZiwgMCwgcC0+aWR3dF9zdHJpZGUgKiBwLT5pZHd0X2hlaWdodCAqIHNpemVvZihJRFdURUxFTSkpOworICAgICAgICAgICAgZGVjb2RlX2NvbXBvbmVudChzLCBjb21wKTsgLyogW0RJUkFDX1NURF0gMTMuNC4xIGNvcmVfdHJhbnNmb3JtX2RhdGEoKSAqLworICAgICAgICB9CisgICAgICAgIGlmIChmZl9zcGF0aWFsX2lkd3RfaW5pdDIoJmQsIHAtPmlkd3RfYnVmLCBwLT5pZHd0X3dpZHRoLCBwLT5pZHd0X2hlaWdodCwgcC0+aWR3dF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+d2F2ZWxldF9pZHgrMiwgcy0+d2F2ZWxldF9kZXB0aCwgcC0+aWR3dF90bXApKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGlmICghcy0+bnVtX3JlZnMpIHsgLyogaW50cmEgKi8KKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBwLT5oZWlnaHQ7IHkgKz0gMTYpIHsKKyAgICAgICAgICAgICAgICBmZl9zcGF0aWFsX2lkd3Rfc2xpY2UyKCZkLCB5KzE2KTsgLyogZGVjb2RlICovCisgICAgICAgICAgICAgICAgcy0+ZGlyYWNkc3AucHV0X3NpZ25lZF9yZWN0X2NsYW1wZWQoZnJhbWUgKyB5KnAtPnN0cmlkZSwgcC0+c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmlkd3RfYnVmICsgeSpwLT5pZHd0X3N0cmlkZSwgcC0+aWR3dF9zdHJpZGUsIHAtPndpZHRoLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8qIGludGVyICovCisgICAgICAgICAgICBpbnQgcm93aGVpZ2h0ID0gcC0+eWJzZXAqcC0+c3RyaWRlOworCisgICAgICAgICAgICBzZWxlY3RfZHNwX2Z1bmNzKHMsIHAtPndpZHRoLCBwLT5oZWlnaHQsIHAtPnhibGVuLCBwLT55Ymxlbik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fcmVmczsgaSsrKQorICAgICAgICAgICAgICAgIGludGVycG9sYXRlX3JlZnBsYW5lKHMsIHMtPnJlZl9waWNzW2ldLCBjb21wLCBwLT53aWR0aCwgcC0+aGVpZ2h0KTsKKworICAgICAgICAgICAgbWVtc2V0KHMtPm1jdG1wLCAwLCA0KnAtPnlvZmZzZXQqcC0+c3RyaWRlKTsKKworICAgICAgICAgICAgZHN0eSA9IC1wLT55b2Zmc2V0OworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmJsaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaCAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IEZGTUFYKGRzdHksIDApOworICAgICAgICAgICAgICAgIHVpbnQxNl90ICptY3RtcCAgICA9IHMtPm1jdG1wICsgeSpyb3doZWlnaHQ7CisgICAgICAgICAgICAgICAgRGlyYWNCbG9jayAqYmxvY2tzID0gcy0+Ymxtb3Rpb24gKyB5KnMtPmJsd2lkdGg7CisKKyAgICAgICAgICAgICAgICBpbml0X29ibWNfd2VpZ2h0cyhzLCBwLCB5KTsKKworICAgICAgICAgICAgICAgIGlmICh5ID09IHMtPmJsaGVpZ2h0LTEgfHwgc3RhcnQrcC0+eWJzZXAgPiBwLT5oZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIGggPSBwLT5oZWlnaHQgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGggPSBwLT55YnNlcCAtIChzdGFydCAtIGRzdHkpOworICAgICAgICAgICAgICAgIGlmIChoIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQobWN0bXArMipwLT55b2Zmc2V0KnAtPnN0cmlkZSwgMCwgMipyb3doZWlnaHQpOworICAgICAgICAgICAgICAgIG1jX3JvdyhzLCBibG9ja3MsIG1jdG1wLCBjb21wLCBkc3R5KTsKKworICAgICAgICAgICAgICAgIG1jdG1wICs9IChzdGFydCAtIGRzdHkpKnAtPnN0cmlkZSArIHAtPnhvZmZzZXQ7CisgICAgICAgICAgICAgICAgZmZfc3BhdGlhbF9pZHd0X3NsaWNlMigmZCwgc3RhcnQgKyBoKTsgLyogZGVjb2RlICovCisgICAgICAgICAgICAgICAgcy0+ZGlyYWNkc3AuYWRkX3JlY3RfY2xhbXBlZChmcmFtZSArIHN0YXJ0KnAtPnN0cmlkZSwgbWN0bXAsIHAtPnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmlkd3RfYnVmICsgc3RhcnQqcC0+aWR3dF9zdHJpZGUsIHAtPmlkd3Rfc3RyaWRlLCBwLT53aWR0aCwgaCk7CisKKyAgICAgICAgICAgICAgICBkc3R5ICs9IHAtPnlic2VwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfYnVmZmVyX3dpdGhfZWRnZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmYsIGludCBmbGFncykKK3sKKyAgICBpbnQgcmV0LCBpOworICAgIGludCBjaHJvbWFfeF9zaGlmdCwgY2hyb21hX3lfc2hpZnQ7CisgICAgYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUoYXZjdHgtPnBpeF9mbXQsICZjaHJvbWFfeF9zaGlmdCwgJmNocm9tYV95X3NoaWZ0KTsKKworICAgIGYtPndpZHRoICA9IGF2Y3R4LT53aWR0aCAgKyAyICogRURHRV9XSURUSDsKKyAgICBmLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0ICsgMiAqIEVER0VfV0lEVEggKyAyOworICAgIHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGYsIGZsYWdzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGYtPmRhdGFbaV07IGkrKykgeworICAgICAgICBpbnQgb2Zmc2V0ID0gKEVER0VfV0lEVEggPj4gKGkgJiYgaTwzID8gY2hyb21hX3lfc2hpZnQgOiAwKSkgKgorICAgICAgICAgICAgICAgICAgICAgZi0+bGluZXNpemVbaV0gKyAzMjsKKyAgICAgICAgZi0+ZGF0YVtpXSArPSBvZmZzZXQ7CisgICAgfQorICAgIGYtPndpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICBmLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGlyYWMgU3BlY2lmaWNhdGlvbiAtPgorICogMTEuMS4xIFBpY3R1cmUgSGVhZGVyLiBwaWN0dXJlX2hlYWRlcigpCisgKi8KK3N0YXRpYyBpbnQgZGlyYWNfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKERpcmFjQ29udGV4dCAqcykKK3sKKyAgICBpbnQgcmV0aXJlLCBwaWNudW07CisgICAgaW50IGksIGosIHJlZm51bSwgcmVmZGlzdDsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKworICAgIC8qIFtESVJBQ19TVERdIDExLjEuMSBQaWN0dXJlIEhlYWRlci4gcGljdHVyZV9oZWFkZXIoKSBQSUNUVVJFX05VTSAqLworICAgIHBpY251bSA9IHMtPmN1cnJlbnRfcGljdHVyZS0+YXZmcmFtZS0+ZGlzcGxheV9waWN0dXJlX251bWJlciA9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKKworCisgICAgYXZfbG9nKHMtPmF2Y3R4LEFWX0xPR19ERUJVRywiUElDVFVSRV9OVU06ICVkXG4iLHBpY251bSk7CisKKyAgICAvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBrZXlmcmFtZSBhZnRlciBhIHNlcXVlbmNlIGhlYWRlciwgc3RhcnQgb3VyCisgICAgICAgcmVvcmRlcmluZyBmcm9tIGhlcmUgKi8KKyAgICBpZiAocy0+ZnJhbWVfbnVtYmVyIDwgMCkKKyAgICAgICAgcy0+ZnJhbWVfbnVtYmVyID0gcGljbnVtOworCisgICAgcy0+cmVmX3BpY3NbMF0gPSBzLT5yZWZfcGljc1sxXSA9IE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9yZWZzOyBpKyspIHsKKyAgICAgICAgcmVmbnVtID0gcGljbnVtICsgZGlyYWNfZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgIHJlZmRpc3QgPSBJTlRfTUFYOworCisgICAgICAgIC8qIGZpbmQgdGhlIGNsb3Nlc3QgcmVmZXJlbmNlIHRvIHRoZSBvbmUgd2Ugd2FudCAqLworICAgICAgICAvKiBKb3JkaTogdGhpcyBpcyBuZWVkZWQgaWYgdGhlIHJlZmVyZW5jZWQgcGljdHVyZSBoYXNuJ3QgeWV0IGFycml2ZWQgKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IE1BWF9SRUZFUkVOQ0VfRlJBTUVTICYmIHJlZmRpc3Q7IGorKykKKyAgICAgICAgICAgIGlmIChzLT5yZWZfZnJhbWVzW2pdCisgICAgICAgICAgICAgICAgJiYgRkZBQlMocy0+cmVmX2ZyYW1lc1tqXS0+YXZmcmFtZS0+ZGlzcGxheV9waWN0dXJlX251bWJlciAtIHJlZm51bSkgPCByZWZkaXN0KSB7CisgICAgICAgICAgICAgICAgcy0+cmVmX3BpY3NbaV0gPSBzLT5yZWZfZnJhbWVzW2pdOworICAgICAgICAgICAgICAgIHJlZmRpc3QgPSBGRkFCUyhzLT5yZWZfZnJhbWVzW2pdLT5hdmZyYW1lLT5kaXNwbGF5X3BpY3R1cmVfbnVtYmVyIC0gcmVmbnVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZiAoIXMtPnJlZl9waWNzW2ldIHx8IHJlZmRpc3QpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlJlZmVyZW5jZSBub3QgZm91bmRcbiIpOworCisgICAgICAgIC8qIGlmIHRoZXJlIHdlcmUgbm8gcmVmZXJlbmNlcyBhdCBhbGwsIGFsbG9jYXRlIG9uZSAqLworICAgICAgICBpZiAoIXMtPnJlZl9waWNzW2ldKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE1BWF9GUkFNRVM7IGorKykKKyAgICAgICAgICAgICAgICBpZiAoIXMtPmFsbF9mcmFtZXNbal0uYXZmcmFtZS0+ZGF0YVswXSkgeworICAgICAgICAgICAgICAgICAgICBzLT5yZWZfcGljc1tpXSA9ICZzLT5hbGxfZnJhbWVzW2pdOworICAgICAgICAgICAgICAgICAgICBnZXRfYnVmZmVyX3dpdGhfZWRnZShzLT5hdmN0eCwgcy0+cmVmX3BpY3NbaV0tPmF2ZnJhbWUsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgfQorCisgICAgLyogcmV0aXJlIHRoZSByZWZlcmVuY2UgZnJhbWVzIHRoYXQgYXJlIG5vdCB1c2VkIGFueW1vcmUgKi8KKyAgICBpZiAocy0+Y3VycmVudF9waWN0dXJlLT5hdmZyYW1lLT5yZWZlcmVuY2UpIHsKKyAgICAgICAgcmV0aXJlID0gcGljbnVtICsgZGlyYWNfZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgIGlmIChyZXRpcmUgIT0gcGljbnVtKSB7CisgICAgICAgICAgICBEaXJhY0ZyYW1lICpyZXRpcmVfcGljID0gcmVtb3ZlX2ZyYW1lKHMtPnJlZl9mcmFtZXMsIHJldGlyZSk7CisKKyAgICAgICAgICAgIGlmIChyZXRpcmVfcGljKQorICAgICAgICAgICAgICAgIHJldGlyZV9waWMtPmF2ZnJhbWUtPnJlZmVyZW5jZSAmPSBERUxBWUVEX1BJQ19SRUY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJGcmFtZSB0byByZXRpcmUgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIHJlZmVyZW5jZSBhcnJheSBpcyBmdWxsLCByZW1vdmUgdGhlIG9sZGVzdCBhcyBwZXIgdGhlIHNwZWMgKi8KKyAgICAgICAgd2hpbGUgKGFkZF9mcmFtZShzLT5yZWZfZnJhbWVzLCBNQVhfUkVGRVJFTkNFX0ZSQU1FUywgcy0+Y3VycmVudF9waWN0dXJlKSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZWZlcmVuY2UgZnJhbWUgb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgcmVtb3ZlX2ZyYW1lKHMtPnJlZl9mcmFtZXMsIHMtPnJlZl9mcmFtZXNbMF0tPmF2ZnJhbWUtPmRpc3BsYXlfcGljdHVyZV9udW1iZXIpLT5hdmZyYW1lLT5yZWZlcmVuY2UgJj0gREVMQVlFRF9QSUNfUkVGOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPm51bV9yZWZzKSB7CisgICAgICAgIGlmIChkaXJhY191bnBhY2tfcHJlZGljdGlvbl9wYXJhbWV0ZXJzKHMpKSAgLyogW0RJUkFDX1NURF0gMTEuMiBQaWN0dXJlIFByZWRpY3Rpb24gRGF0YS4gcGljdHVyZV9wcmVkaWN0aW9uKCkgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGRpcmFjX3VucGFja19ibG9ja19tb3Rpb25fZGF0YShzKSkgICAgICAvKiBbRElSQUNfU1REXSAxMi4gQmxvY2sgbW90aW9uIGRhdGEgc3ludGF4ICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoZGlyYWNfdW5wYWNrX2lkd3RfcGFyYW1zKHMpKSAgICAgICAgICAgICAgICAvKiBbRElSQUNfU1REXSAxMS4zIFdhdmVsZXQgdHJhbnNmb3JtIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpbml0X3BsYW5lcyhzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfZGVsYXllZF9waWMoRGlyYWNDb250ZXh0ICpzLCBBVkZyYW1lICpwaWN0dXJlLCBpbnQgKmdvdF9mcmFtZSkKK3sKKyAgICBEaXJhY0ZyYW1lICpvdXQgPSBzLT5kZWxheV9mcmFtZXNbMF07CisgICAgaW50IGksIG91dF9pZHggID0gMDsKKyAgICBpbnQgcmV0OworCisgICAgLyogZmluZCBmcmFtZSB3aXRoIGxvd2VzdCBwaWN0dXJlIG51bWJlciAqLworICAgIGZvciAoaSA9IDE7IHMtPmRlbGF5X2ZyYW1lc1tpXTsgaSsrKQorICAgICAgICBpZiAocy0+ZGVsYXlfZnJhbWVzW2ldLT5hdmZyYW1lLT5kaXNwbGF5X3BpY3R1cmVfbnVtYmVyIDwgb3V0LT5hdmZyYW1lLT5kaXNwbGF5X3BpY3R1cmVfbnVtYmVyKSB7CisgICAgICAgICAgICBvdXQgICAgID0gcy0+ZGVsYXlfZnJhbWVzW2ldOworICAgICAgICAgICAgb3V0X2lkeCA9IGk7CisgICAgICAgIH0KKworICAgIGZvciAoaSA9IG91dF9pZHg7IHMtPmRlbGF5X2ZyYW1lc1tpXTsgaSsrKQorICAgICAgICBzLT5kZWxheV9mcmFtZXNbaV0gPSBzLT5kZWxheV9mcmFtZXNbaSsxXTsKKworICAgIGlmIChvdXQpIHsKKyAgICAgICAgb3V0LT5hdmZyYW1lLT5yZWZlcmVuY2UgXj0gREVMQVlFRF9QSUNfUkVGOworICAgICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICAgICAgaWYoKHJldCA9IGF2X2ZyYW1lX3JlZihwaWN0dXJlLCBvdXQtPmF2ZnJhbWUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERpcmFjIFNwZWNpZmljYXRpb24gLT4KKyAqIDkuNiBQYXJzZSBJbmZvIEhlYWRlciBTeW50YXguIHBhcnNlX2luZm8oKQorICogNCBieXRlIHN0YXJ0IGNvZGUgKyBieXRlIHBhcnNlIGNvZGUgKyA0IGJ5dGUgc2l6ZSArIDQgYnl0ZSBwcmV2aW91cyBzaXplCisgKi8KKyNkZWZpbmUgREFUQV9VTklUX0hFQURFUl9TSVpFIDEzCisKKy8qIFtESVJBQ19TVERdIGRpcmFjX2RlY29kZV9kYXRhX3VuaXQgbWFrZXMgcmVmZXJlbmNlIHRvIHRoZSB3aGlsZSBkZWZpbmVkIGluIDkuMworICAgaW5zaWRlIHRoZSBmdW5jdGlvbiBwYXJzZV9zZXF1ZW5jZSgpICovCitzdGF0aWMgaW50IGRpcmFjX2RlY29kZV9kYXRhX3VuaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIERpcmFjQ29udGV4dCAqcyAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBEaXJhY0ZyYW1lICpwaWMgICA9IE5VTEw7CisgICAgaW50IHJldCwgaSwgcGFyc2VfY29kZSA9IGJ1Zls0XTsKKyAgICB1bnNpZ25lZCB0bXA7CisKKyAgICBpZiAoc2l6ZSA8IERBVEFfVU5JVF9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsICZidWZbMTNdLCA4KihzaXplIC0gREFUQV9VTklUX0hFQURFUl9TSVpFKSk7CisKKyAgICBpZiAocGFyc2VfY29kZSA9PSBwY19zZXFfaGVhZGVyKSB7CisgICAgICAgIGlmIChzLT5zZWVuX3NlcXVlbmNlX2hlYWRlcikKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIC8qIFtESVJBQ19TVERdIDEwLiBTZXF1ZW5jZSBoZWFkZXIgKi8KKyAgICAgICAgaWYgKGF2cHJpdl9kaXJhY19wYXJzZV9zZXF1ZW5jZV9oZWFkZXIoYXZjdHgsICZzLT5nYiwgJnMtPnNvdXJjZSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUoYXZjdHgtPnBpeF9mbXQsICZzLT5jaHJvbWFfeF9zaGlmdCwgJnMtPmNocm9tYV95X3NoaWZ0KTsKKworICAgICAgICBpZiAoYWxsb2Nfc2VxdWVuY2VfYnVmZmVycyhzKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBzLT5zZWVuX3NlcXVlbmNlX2hlYWRlciA9IDE7CisgICAgfSBlbHNlIGlmIChwYXJzZV9jb2RlID09IHBjX2VvcykgeyAvKiBbRElSQUNfU1REXSBFbmQgb2YgU2VxdWVuY2UgKi8KKyAgICAgICAgZnJlZV9zZXF1ZW5jZV9idWZmZXJzKHMpOworICAgICAgICBzLT5zZWVuX3NlcXVlbmNlX2hlYWRlciA9IDA7CisgICAgfSBlbHNlIGlmIChwYXJzZV9jb2RlID09IHBjX2F1eF9kYXRhKSB7CisgICAgICAgIGlmIChidWZbMTNdID09IDEpIHsgICAgIC8qIGVuY29kZXIgaW1wbGVtZW50YXRpb24vdmVyc2lvbiAqLworICAgICAgICAgICAgaW50IHZlclszXTsKKyAgICAgICAgICAgIC8qIHZlcnNpb25zIG9sZGVyIHRoYW4gMS4wLjggZG9uJ3Qgc3RvcmUgcXVhbnQgZGVsdGEgZm9yCisgICAgICAgICAgICAgICBzdWJiYW5kcyB3aXRoIG9ubHkgb25lIGNvZGVibG9jayAqLworICAgICAgICAgICAgaWYgKHNzY2FuZihidWYrMTQsICJTY2hyb2VkaW5nZXIgJWQuJWQuJWQiLCB2ZXIsIHZlcisxLCB2ZXIrMikgPT0gMykKKyAgICAgICAgICAgICAgICBpZiAodmVyWzBdID09IDEgJiYgdmVyWzFdID09IDAgJiYgdmVyWzJdIDw9IDcpCisgICAgICAgICAgICAgICAgICAgIHMtPm9sZF9kZWx0YV9xdWFudCA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBhcnNlX2NvZGUgJiAweDgpIHsgIC8qIHBpY3R1cmUgZGF0YSB1bml0ICovCisgICAgICAgIGlmICghcy0+c2Vlbl9zZXF1ZW5jZV9oZWFkZXIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRHJvcHBpbmcgZnJhbWUgd2l0aG91dCBzZXF1ZW5jZSBoZWFkZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogZmluZCBhbiB1bnVzZWQgZnJhbWUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9GUkFNRVM7IGkrKykKKyAgICAgICAgICAgIGlmIChzLT5hbGxfZnJhbWVzW2ldLmF2ZnJhbWUtPmRhdGFbMF0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwaWMgPSAmcy0+YWxsX2ZyYW1lc1tpXTsKKyAgICAgICAgaWYgKCFwaWMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZnJhbWVsaXN0IGZ1bGxcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYocGljLT5hdmZyYW1lKTsKKworICAgICAgICAvKiBbRElSQUNfU1REXSBEZWZpbmVkIGluIDkuNi4xIC4uLiAqLworICAgICAgICB0bXAgICAgICAgICAgICA9ICBwYXJzZV9jb2RlICYgMHgwMzsgICAgICAgICAgICAgICAgICAgLyogW0RJUkFDX1NURF0gbnVtX3JlZnMoKSAgICAgICovCisgICAgICAgIGlmICh0bXAgPiAyKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm51bV9yZWZzIG9mIDNcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHMtPm51bV9yZWZzICAgID0gdG1wOworICAgICAgICBzLT5pc19hcml0aCAgICA9IChwYXJzZV9jb2RlICYgMHg0OCkgPT0gMHgwODsgICAgICAgICAgLyogW0RJUkFDX1NURF0gdXNpbmdfYWMoKSAgICAgICovCisgICAgICAgIHMtPmxvd19kZWxheSAgID0gKHBhcnNlX2NvZGUgJiAweDg4KSA9PSAweDg4OyAgICAgICAgICAvKiBbRElSQUNfU1REXSBpc19sb3dfZGVsYXkoKSAgKi8KKyAgICAgICAgcGljLT5hdmZyYW1lLT5yZWZlcmVuY2UgPSAocGFyc2VfY29kZSAmIDB4MEMpID09IDB4MEM7ICAvKiBbRElSQUNfU1REXSAgaXNfcmVmZXJlbmNlKCkgKi8KKyAgICAgICAgcGljLT5hdmZyYW1lLT5rZXlfZnJhbWUgPSBzLT5udW1fcmVmcyA9PSAwOyAgICAgICAgICAgICAvKiBbRElSQUNfU1REXSBpc19pbnRyYSgpICAgICAgKi8KKyAgICAgICAgcGljLT5hdmZyYW1lLT5waWN0X3R5cGUgPSBzLT5udW1fcmVmcyArIDE7ICAgICAgICAgICAgICAvKiBEZWZpbml0aW9uIG9mIEFWUGljdHVyZVR5cGUgaW4gYXZ1dGlsLmggKi8KKworICAgICAgICBpZiAoKHJldCA9IGdldF9idWZmZXJfd2l0aF9lZGdlKGF2Y3R4LCBwaWMtPmF2ZnJhbWUsIChwYXJzZV9jb2RlICYgMHgwQykgPT0gMHgwQyA/IEFWX0dFVF9CVUZGRVJfRkxBR19SRUYgOiAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlID0gcGljOworICAgICAgICBzLT5wbGFuZVswXS5zdHJpZGUgPSBwaWMtPmF2ZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBzLT5wbGFuZVsxXS5zdHJpZGUgPSBwaWMtPmF2ZnJhbWUtPmxpbmVzaXplWzFdOworICAgICAgICBzLT5wbGFuZVsyXS5zdHJpZGUgPSBwaWMtPmF2ZnJhbWUtPmxpbmVzaXplWzJdOworCisgICAgICAgIGlmIChhbGxvY19idWZmZXJzKHMsIEZGTUFYMyhGRkFCUyhzLT5wbGFuZVswXS5zdHJpZGUpLCBGRkFCUyhzLT5wbGFuZVsxXS5zdHJpZGUpLCBGRkFCUyhzLT5wbGFuZVsyXS5zdHJpZGUpKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAvKiBbRElSQUNfU1REXSAxMS4xIFBpY3R1cmUgcGFyc2UuIHBpY3R1cmVfcGFyc2UoKSAqLworICAgICAgICBpZiAoZGlyYWNfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKHMpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIC8qIFtESVJBQ19TVERdIDEzLjAgVHJhbnNmb3JtIGRhdGEgc3ludGF4LiB0cmFuc2Zvcm1fZGF0YSgpICovCisgICAgICAgIGlmIChkaXJhY19kZWNvZGVfZnJhbWVfaW50ZXJuYWwocykpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpcmFjX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqcGt0KQoreworICAgIERpcmFjQ29udGV4dCAqcyAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKnBpY3R1cmUgICAgPSBkYXRhOworICAgIHVpbnQ4X3QgKmJ1ZiAgICAgICAgPSBwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgICA9IHBrdC0+c2l6ZTsKKyAgICBpbnQgaSwgZGF0YV91bml0X3NpemUsIGJ1Zl9pZHggPSAwOworICAgIGludCByZXQ7CisKKyAgICAvKiByZWxlYXNlIHVudXNlZCBmcmFtZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0ZSQU1FUzsgaSsrKQorICAgICAgICBpZiAocy0+YWxsX2ZyYW1lc1tpXS5hdmZyYW1lLT5kYXRhWzBdICYmICFzLT5hbGxfZnJhbWVzW2ldLmF2ZnJhbWUtPnJlZmVyZW5jZSkgeworICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+YWxsX2ZyYW1lc1tpXS5hdmZyYW1lKTsKKyAgICAgICAgICAgIG1lbXNldChzLT5hbGxfZnJhbWVzW2ldLmludGVycG9sYXRlZCwgMCwgc2l6ZW9mKHMtPmFsbF9mcmFtZXNbaV0uaW50ZXJwb2xhdGVkKSk7CisgICAgICAgIH0KKworICAgIHMtPmN1cnJlbnRfcGljdHVyZSA9IE5VTEw7CisgICAgKmdvdF9mcmFtZSA9IDA7CisKKyAgICAvKiBlbmQgb2Ygc3RyZWFtLCBzbyBmbHVzaCBkZWxheWVkIHBpY3MgKi8KKyAgICBpZiAoYnVmX3NpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIGdldF9kZWxheWVkX3BpYyhzLCAoQVZGcmFtZSAqKWRhdGEsIGdvdF9mcmFtZSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qW0RJUkFDX1NURF0gSGVyZSBzdGFydHMgdGhlIGNvZGUgZnJvbSBwYXJzZV9pbmZvKCkgZGVmaW5lZCBpbiA5LjYKKyAgICAgICAgICBbRElSQUNfU1REXSBQQVJTRV9JTkZPX1BSRUZJWCA9ICJCQkNEIiBhcyBkZWZpbmVkIGluIElTTy9JRUMgNjQ2CisgICAgICAgICAgQkJDRCBzdGFydCBjb2RlIHNlYXJjaCAqLworICAgICAgICBmb3IgKDsgYnVmX2lkeCArIERBVEFfVU5JVF9IRUFERVJfU0laRSA8IGJ1Zl9zaXplOyBidWZfaWR4KyspIHsKKyAgICAgICAgICAgIGlmIChidWZbYnVmX2lkeCAgXSA9PSAnQicgJiYgYnVmW2J1Zl9pZHgrMV0gPT0gJ0InICYmCisgICAgICAgICAgICAgICAgYnVmW2J1Zl9pZHgrMl0gPT0gJ0MnICYmIGJ1ZltidWZfaWR4KzNdID09ICdEJykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBCQkNEIGZvdW5kIG9yIGVuZCBvZiBkYXRhICovCisgICAgICAgIGlmIChidWZfaWR4ICsgREFUQV9VTklUX0hFQURFUl9TSVpFID49IGJ1Zl9zaXplKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGF0YV91bml0X3NpemUgPSBBVl9SQjMyKGJ1ZitidWZfaWR4KzUpOworICAgICAgICBpZiAoYnVmX2lkeCArIGRhdGFfdW5pdF9zaXplID4gYnVmX3NpemUgfHwgIWRhdGFfdW5pdF9zaXplKSB7CisgICAgICAgICAgICBpZihidWZfaWR4ICsgZGF0YV91bml0X3NpemUgPiBidWZfc2l6ZSkKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJEYXRhIHVuaXQgd2l0aCBzaXplICVkIGlzIGxhcmdlciB0aGFuIGlucHV0IGJ1ZmZlciwgZGlzY2FyZGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICBkYXRhX3VuaXRfc2l6ZSk7CisgICAgICAgICAgICBidWZfaWR4ICs9IDQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvKiBbRElSQUNfU1REXSBkaXJhY19kZWNvZGVfZGF0YV91bml0IG1ha2VzIHJlZmVyZW5jZSB0byB0aGUgd2hpbGUgZGVmaW5lZCBpbiA5LjMgaW5zaWRlIHRoZSBmdW5jdGlvbiBwYXJzZV9zZXF1ZW5jZSgpICovCisgICAgICAgIGlmIChkaXJhY19kZWNvZGVfZGF0YV91bml0KGF2Y3R4LCBidWYrYnVmX2lkeCwgZGF0YV91bml0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwiRXJyb3IgaW4gZGlyYWNfZGVjb2RlX2RhdGFfdW5pdFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnVmX2lkeCArPSBkYXRhX3VuaXRfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIXMtPmN1cnJlbnRfcGljdHVyZSkKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworCisgICAgaWYgKHMtPmN1cnJlbnRfcGljdHVyZS0+YXZmcmFtZS0+ZGlzcGxheV9waWN0dXJlX251bWJlciA+IHMtPmZyYW1lX251bWJlcikgeworICAgICAgICBEaXJhY0ZyYW1lICpkZWxheWVkX2ZyYW1lID0gcmVtb3ZlX2ZyYW1lKHMtPmRlbGF5X2ZyYW1lcywgcy0+ZnJhbWVfbnVtYmVyKTsKKworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUtPmF2ZnJhbWUtPnJlZmVyZW5jZSB8PSBERUxBWUVEX1BJQ19SRUY7CisKKyAgICAgICAgaWYgKGFkZF9mcmFtZShzLT5kZWxheV9mcmFtZXMsIE1BWF9ERUxBWSwgcy0+Y3VycmVudF9waWN0dXJlKSkgeworICAgICAgICAgICAgaW50IG1pbl9udW0gPSBzLT5kZWxheV9mcmFtZXNbMF0tPmF2ZnJhbWUtPmRpc3BsYXlfcGljdHVyZV9udW1iZXI7CisgICAgICAgICAgICAvKiBUb28gbWFueSBkZWxheWVkIGZyYW1lcywgc28gd2UgZGlzcGxheSB0aGUgZnJhbWUgd2l0aCB0aGUgbG93ZXN0IHB0cyAqLworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEZWxheSBmcmFtZSBvdmVyZmxvd1xuIik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IHMtPmRlbGF5X2ZyYW1lc1tpXTsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChzLT5kZWxheV9mcmFtZXNbaV0tPmF2ZnJhbWUtPmRpc3BsYXlfcGljdHVyZV9udW1iZXIgPCBtaW5fbnVtKQorICAgICAgICAgICAgICAgICAgICBtaW5fbnVtID0gcy0+ZGVsYXlfZnJhbWVzW2ldLT5hdmZyYW1lLT5kaXNwbGF5X3BpY3R1cmVfbnVtYmVyOworCisgICAgICAgICAgICBkZWxheWVkX2ZyYW1lID0gcmVtb3ZlX2ZyYW1lKHMtPmRlbGF5X2ZyYW1lcywgbWluX251bSk7CisgICAgICAgICAgICBhZGRfZnJhbWUocy0+ZGVsYXlfZnJhbWVzLCBNQVhfREVMQVksIHMtPmN1cnJlbnRfcGljdHVyZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVsYXllZF9mcmFtZSkgeworICAgICAgICAgICAgZGVsYXllZF9mcmFtZS0+YXZmcmFtZS0+cmVmZXJlbmNlIF49IERFTEFZRURfUElDX1JFRjsKKyAgICAgICAgICAgIGlmKChyZXQ9YXZfZnJhbWVfcmVmKGRhdGEsIGRlbGF5ZWRfZnJhbWUtPmF2ZnJhbWUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICpnb3RfZnJhbWUgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzLT5jdXJyZW50X3BpY3R1cmUtPmF2ZnJhbWUtPmRpc3BsYXlfcGljdHVyZV9udW1iZXIgPT0gcy0+ZnJhbWVfbnVtYmVyKSB7CisgICAgICAgIC8qIFRoZSByaWdodCBmcmFtZSBhdCB0aGUgcmlnaHQgdGltZSA6LSkgKi8KKyAgICAgICAgaWYoKHJldD1hdl9mcmFtZV9yZWYoZGF0YSwgcy0+Y3VycmVudF9waWN0dXJlLT5hdmZyYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgfQorCisgICAgaWYgKCpnb3RfZnJhbWUpCisgICAgICAgIHMtPmZyYW1lX251bWJlciA9IHBpY3R1cmUtPmRpc3BsYXlfcGljdHVyZV9udW1iZXIgKyAxOworCisgICAgcmV0dXJuIGJ1Zl9pZHg7Cit9CisKK0FWQ29kZWMgZmZfZGlyYWNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZGlyYWMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCQkMgRGlyYWMgVkMtMiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9ESVJBQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRGlyYWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkaXJhY19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkaXJhY19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRpcmFjX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfREVMQVksCisgICAgLmZsdXNoICAgICAgICAgID0gZGlyYWNfZGVjb2RlX2ZsdXNoLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RpcmFjZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kaXJhY2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOGMzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kaXJhY2RzcC5jCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIENvbnJhZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImRpcmFjZHNwLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy94ODYvZGlyYWNkc3BfbW14LmgiCisKKyNkZWZpbmUgRklMVEVSKHNyYywgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgyMSooKHNyYylbIDAqc3RyaWRlXSArIChzcmMpWzEqc3RyaWRlXSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgLTcqKChzcmMpWy0xKnN0cmlkZV0gKyAoc3JjKVsyKnN0cmlkZV0pICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICszKigoc3JjKVstMipzdHJpZGVdICsgKHNyYylbMypzdHJpZGVdKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAtMSooKHNyYylbLTMqc3RyaWRlXSArIChzcmMpWzQqc3RyaWRlXSkgKyAxNikgPj4gNSkKKworc3RhdGljIHZvaWQgZGlyYWNfaHBlbF9maWx0ZXIodWludDhfdCAqZHN0aCwgdWludDhfdCAqZHN0diwgdWludDhfdCAqZHN0YywgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IC0zOyB4IDwgd2lkdGgrNTsgeCsrKQorICAgICAgICAgICAgZHN0dlt4XSA9IGF2X2NsaXBfdWludDgoRklMVEVSKHNyYyt4LCBzdHJpZGUpKTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdGNbeF0gPSBhdl9jbGlwX3VpbnQ4KEZJTFRFUihkc3R2K3gsIDEpKTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdGhbeF0gPSBhdl9jbGlwX3VpbnQ4KEZJTFRFUihzcmMreCwgMSkpOworCisgICAgICAgIHNyYyAgKz0gc3RyaWRlOworICAgICAgICBkc3RoICs9IHN0cmlkZTsKKyAgICAgICAgZHN0diArPSBzdHJpZGU7CisgICAgICAgIGRzdGMgKz0gc3RyaWRlOworICAgIH0KK30KKworI2RlZmluZSBQSVhPUF9CSUxJTkVBUihQRlgsIE9QLCBXSURUSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIGZmXyAjIyBQRlggIyMgX2RpcmFjX3BpeGVscyAjIyBXSURUSCAjIyBfYmlsaW5lYXJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSwgaW50IGgpIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdWludDhfdCAqczAgPSBzcmNbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdWludDhfdCAqczEgPSBzcmNbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdWludDhfdCAqczIgPSBzcmNbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdWludDhfdCAqczMgPSBzcmNbM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdWludDhfdCAqdyAgPSBzcmNbNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKGgtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBXSURUSDsgeCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBPUChkc3RbeF0sIChzMFt4XSp3WzBdICsgczFbeF0qd1sxXSArIHMyW3hdKndbMl0gKyBzM1t4XSp3WzNdICsgOCkgPj4gNCk7IFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMwICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMxICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMyICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMzICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgT1BfUFVUKGRzdCwgdmFsKSAoZHN0KSA9ICh2YWwpCisjZGVmaW5lIE9QX0FWRyhkc3QsIHZhbCkgKGRzdCkgPSAoKChkc3QpICsgKHZhbCkgKyAxKT4+MSkKKworUElYT1BfQklMSU5FQVIocHV0LCBPUF9QVVQsIDgpCitQSVhPUF9CSUxJTkVBUihwdXQsIE9QX1BVVCwgMTYpCitQSVhPUF9CSUxJTkVBUihwdXQsIE9QX1BVVCwgMzIpCitQSVhPUF9CSUxJTkVBUihhdmcsIE9QX0FWRywgOCkKK1BJWE9QX0JJTElORUFSKGF2ZywgT1BfQVZHLCAxNikKK1BJWE9QX0JJTElORUFSKGF2ZywgT1BfQVZHLCAzMikKKworI2RlZmluZSBvcF9zY2FsZTEoeCkgIGJsb2NrW3hdID0gYXZfY2xpcF91aW50OCggKGJsb2NrW3hdKndlaWdodCArICgxPDwobG9nMl9kZW5vbS0xKSkpID4+IGxvZzJfZGVub20pCisjZGVmaW5lIG9wX3NjYWxlMih4KSAgZHN0W3hdID0gYXZfY2xpcF91aW50OCggKHNyY1t4XSp3ZWlnaHRzICsgZHN0W3hdKndlaWdodGQgKyAoMTw8KGxvZzJfZGVub20tMSkpKSA+PiBsb2cyX2Rlbm9tKQorCisjZGVmaW5lIERJUkFDX1dFSUdIVChXKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIHZvaWQgd2VpZ2h0X2RpcmFjX3BpeGVscyAjIyBXICMjIF9jKHVpbnQ4X3QgKmJsb2NrLCBpbnQgc3RyaWRlLCBpbnQgbG9nMl9kZW5vbSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBpbnQgaCkgeyAgICAgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoaC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IFc7IHgrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9wX3NjYWxlMSh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9wX3NjYWxlMSh4KzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYmxvY2sgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIGJpd2VpZ2h0X2RpcmFjX3BpeGVscyAjIyBXICMjIF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgbG9nMl9kZW5vbSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHRkLCBpbnQgd2VpZ2h0cywgaW50IGgpIHsgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoaC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IFc7IHgrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9wX3NjYWxlMih4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9wX3NjYWxlMih4KzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworRElSQUNfV0VJR0hUKDgpCitESVJBQ19XRUlHSFQoMTYpCitESVJBQ19XRUlHSFQoMzIpCisKKyNkZWZpbmUgQUREX09CTUMoeGJsZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBhZGRfb2JtYyAjIyB4YmxlbiAjIyBfYyh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpvYm1jX3dlaWdodCwgaW50IHlibGVuKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICh5Ymxlbi0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgeGJsZW47IHggKz0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3ggIF0gKz0gc3JjW3ggIF0gKiBvYm1jX3dlaWdodFt4ICBdOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3grMV0gKz0gc3JjW3grMV0gKiBvYm1jX3dlaWdodFt4KzFdOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzcmMgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYm1jX3dlaWdodCArPSAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitBRERfT0JNQyg4KQorQUREX09CTUMoMTYpCitBRERfT0JNQygzMikKKworc3RhdGljIHZvaWQgcHV0X3NpZ25lZF9yZWN0X2NsYW1wZWRfYyh1aW50OF90ICpkc3QsIGludCBkc3Rfc3RyaWRlLCBjb25zdCBpbnQxNl90ICpzcmMsIGludCBzcmNfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IHgsIHk7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCs9NCkgeworICAgICAgICAgICAgZHN0W3ggIF0gPSBhdl9jbGlwX3VpbnQ4KHNyY1t4ICBdICsgMTI4KTsKKyAgICAgICAgICAgIGRzdFt4KzFdID0gYXZfY2xpcF91aW50OChzcmNbeCsxXSArIDEyOCk7CisgICAgICAgICAgICBkc3RbeCsyXSA9IGF2X2NsaXBfdWludDgoc3JjW3grMl0gKyAxMjgpOworICAgICAgICAgICAgZHN0W3grM10gPSBhdl9jbGlwX3VpbnQ4KHNyY1t4KzNdICsgMTI4KTsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGRfcmVjdF9jbGFtcGVkX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmlkd3QsIGludCBpZHd0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4Kz0yKSB7CisgICAgICAgICAgICBkc3RbeCAgXSA9IGF2X2NsaXBfdWludDgoKChzcmNbeCAgXSszMik+PjYpICsgaWR3dFt4ICBdKTsKKyAgICAgICAgICAgIGRzdFt4KzFdID0gYXZfY2xpcF91aW50OCgoKHNyY1t4KzFdKzMyKT4+NikgKyBpZHd0W3grMV0pOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIGlkd3QgKz0gaWR3dF9zdHJpZGU7CisgICAgfQorfQorCisjZGVmaW5lIFBJWEZVTkMoUEZYLCBXSURUSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYy0+UEZYICMjIF9kaXJhY19waXhlbHNfdGFiW1dJRFRIPj40XVswXSA9IGZmXyAjIyBQRlggIyMgX2RpcmFjX3BpeGVscyAjIyBXSURUSCAjIyBfYzsgXAorICAgIGMtPlBGWCAjIyBfZGlyYWNfcGl4ZWxzX3RhYltXSURUSD4+NF1bMV0gPSBmZl8gIyMgUEZYICMjIF9kaXJhY19waXhlbHMgIyMgV0lEVEggIyMgX2wyX2M7IFwKKyAgICBjLT5QRlggIyMgX2RpcmFjX3BpeGVsc190YWJbV0lEVEg+PjRdWzJdID0gZmZfICMjIFBGWCAjIyBfZGlyYWNfcGl4ZWxzICMjIFdJRFRIICMjIF9sNF9jOyBcCisgICAgYy0+UEZYICMjIF9kaXJhY19waXhlbHNfdGFiW1dJRFRIPj40XVszXSA9IGZmXyAjIyBQRlggIyMgX2RpcmFjX3BpeGVscyAjIyBXSURUSCAjIyBfYmlsaW5lYXJfYworCit2b2lkIGZmX2RpcmFjZHNwX2luaXQoRGlyYWNEU1BDb250ZXh0ICpjKQoreworICAgIGMtPmRpcmFjX2hwZWxfZmlsdGVyID0gZGlyYWNfaHBlbF9maWx0ZXI7CisgICAgYy0+YWRkX3JlY3RfY2xhbXBlZCA9IGFkZF9yZWN0X2NsYW1wZWRfYzsKKyAgICBjLT5wdXRfc2lnbmVkX3JlY3RfY2xhbXBlZCA9IHB1dF9zaWduZWRfcmVjdF9jbGFtcGVkX2M7CisKKyAgICBjLT5hZGRfZGlyYWNfb2JtY1swXSA9IGFkZF9vYm1jOF9jOworICAgIGMtPmFkZF9kaXJhY19vYm1jWzFdID0gYWRkX29ibWMxNl9jOworICAgIGMtPmFkZF9kaXJhY19vYm1jWzJdID0gYWRkX29ibWMzMl9jOworCisgICAgYy0+d2VpZ2h0X2RpcmFjX3BpeGVsc190YWJbMF0gPSB3ZWlnaHRfZGlyYWNfcGl4ZWxzOF9jOworICAgIGMtPndlaWdodF9kaXJhY19waXhlbHNfdGFiWzFdID0gd2VpZ2h0X2RpcmFjX3BpeGVsczE2X2M7CisgICAgYy0+d2VpZ2h0X2RpcmFjX3BpeGVsc190YWJbMl0gPSB3ZWlnaHRfZGlyYWNfcGl4ZWxzMzJfYzsKKyAgICBjLT5iaXdlaWdodF9kaXJhY19waXhlbHNfdGFiWzBdID0gYml3ZWlnaHRfZGlyYWNfcGl4ZWxzOF9jOworICAgIGMtPmJpd2VpZ2h0X2RpcmFjX3BpeGVsc190YWJbMV0gPSBiaXdlaWdodF9kaXJhY19waXhlbHMxNl9jOworICAgIGMtPmJpd2VpZ2h0X2RpcmFjX3BpeGVsc190YWJbMl0gPSBiaXdlaWdodF9kaXJhY19waXhlbHMzMl9jOworCisgICAgUElYRlVOQyhwdXQsIDgpOworICAgIFBJWEZVTkMocHV0LCAxNik7CisgICAgUElYRlVOQyhwdXQsIDMyKTsKKyAgICBQSVhGVU5DKGF2ZywgOCk7CisgICAgUElYRlVOQyhhdmcsIDE2KTsKKyAgICBQSVhGVU5DKGF2ZywgMzIpOworCisgICAgaWYgKEhBVkVfTU1YICYmIEhBVkVfWUFTTSkgZmZfZGlyYWNkc3BfaW5pdF9tbXgoYyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kaXJhY2RzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWNkc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTNjYTViCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZGlyYWNkc3AuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIERhdmlkIENvbnJhZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRElSQUNEU1BfSAorI2RlZmluZSBBVkNPREVDX0RJUkFDRFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHZvaWQgKCpkaXJhY193ZWlnaHRfZnVuYykodWludDhfdCAqYmxvY2ssIGludCBzdHJpZGUsIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0LCBpbnQgaCk7Cit0eXBlZGVmIHZvaWQgKCpkaXJhY19iaXdlaWdodF9mdW5jKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHRkLCBpbnQgd2VpZ2h0cywgaW50IGgpOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAoKmRpcmFjX2hwZWxfZmlsdGVyKSh1aW50OF90ICpkc3RoLCB1aW50OF90ICpkc3R2LCB1aW50OF90ICpkc3RjLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgLyoqCisgICAgICogZGlyYWNfcGl4ZWxzX3RhYlt3aWR0aF1bc3VicGVsXQorICAgICAqIHdpZHRoIGlzIDIgZm9yIDMyLCAxIGZvciAxNiwgMCBmb3IgOAorICAgICAqIHN1YnBlbCBpcyAwIGZvciBmcGVsIGFuZCBocGVsIChvbmx5IG5lZWQgdG8gY29weSBmcm9tIHRoZSBmaXJzdCBwbGFuZSBpbiBzcmMpCisgICAgICogICAgICAgICAgIDEgaWYgYW4gYXZlcmFnZSBvZiB0aGUgZmlyc3QgMiBwbGFuZXMgaXMgbmVlZGVkIChUT0RPOiB3b3J0aCBpdD8pCisgICAgICogICAgICAgICAgIDIgZm9yIGdlbmVyYWwgcXBlbCAoYXZnIG9mIDQpCisgICAgICogICAgICAgICAgIDMgZm9yIGdlbmVyYWwgZXBlbCAoYml3ZWlnaHQgb2YgNCB1c2luZyB0aGUgd2VpZ2h0cyBpbiBzcmNbNF0pCisgICAgICogc3JjWzAtM10gaXMgZWFjaCBvZiB0aGUgaHBlbCBwbGFuZXMKKyAgICAgKiBzcmNbNF0gaXMgdGhlIDEvOCBwZWwgd2VpZ2h0cyBpZiBuZWVkZWQKKyAgICAgKi8KKyAgICB2b2lkICgqcHV0X2RpcmFjX3BpeGVsc190YWJbM11bNF0pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWzVdLCBpbnQgc3RyaWRlLCBpbnQgaCk7CisgICAgdm9pZCAoKmF2Z19kaXJhY19waXhlbHNfdGFiWzNdWzRdKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSwgaW50IGgpOworCisgICAgdm9pZCAoKnB1dF9zaWduZWRfcmVjdF9jbGFtcGVkKSh1aW50OF90ICpkc3QvKmFsaWduIDE2Ki8sIGludCBkc3Rfc3RyaWRlLCBjb25zdCBpbnQxNl90ICpzcmMvKmFsaWduIDE2Ki8sIGludCBzcmNfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQvKm1vZCAyKi8pOworICAgIHZvaWQgKCpwdXRfcmVjdF9jbGFtcGVkKSh1aW50OF90ICpkc3QvKmFsaWduIDE2Ki8sIGludCBkc3Rfc3RyaWRlLCBjb25zdCBpbnQxNl90ICpzcmMvKmFsaWduIDE2Ki8sIGludCBzcmNfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQvKm1vZCAyKi8pOworICAgIHZvaWQgKCphZGRfcmVjdF9jbGFtcGVkKSh1aW50OF90ICpkc3QvKmFsaWduIDE2Ki8sIGNvbnN0IHVpbnQxNl90ICpzcmMvKmFsaWduIDE2Ki8sIGludCBzdHJpZGUsIGNvbnN0IGludDE2X3QgKmlkd3QvKmFsaWduIDE2Ki8sIGludCBpZHd0X3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0Lyptb2QgMiovKTsKKyAgICB2b2lkICgqYWRkX2RpcmFjX29ibWNbM10pKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgY29uc3QgdWludDhfdCAqb2JtY193ZWlnaHQsIGludCB5Ymxlbik7CisKKyAgICBkaXJhY193ZWlnaHRfZnVuYyB3ZWlnaHRfZGlyYWNfcGl4ZWxzX3RhYlszXTsKKyAgICBkaXJhY19iaXdlaWdodF9mdW5jIGJpd2VpZ2h0X2RpcmFjX3BpeGVsc190YWJbM107Cit9IERpcmFjRFNQQ29udGV4dDsKKworI2RlZmluZSBERUNMX0RJUkFDX1BJWE9QKFBGWCwgRVhUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgZmZfICMjIFBGWCAjIyBfZGlyYWNfcGl4ZWxzOF8gIyMgRVhUKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWzVdLCBpbnQgc3RyaWRlLCBpbnQgaCk7IFwKKyAgICB2b2lkIGZmXyAjIyBQRlggIyMgX2RpcmFjX3BpeGVsczE2XyAjIyBFWFQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNV0sIGludCBzdHJpZGUsIGludCBoKTsgXAorICAgIHZvaWQgZmZfICMjIFBGWCAjIyBfZGlyYWNfcGl4ZWxzMzJfICMjIEVYVCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSwgaW50IGgpCisKK0RFQ0xfRElSQUNfUElYT1AocHV0LCBjKTsKK0RFQ0xfRElSQUNfUElYT1AoYXZnLCBjKTsKK0RFQ0xfRElSQUNfUElYT1AocHV0LCBsMl9jKTsKK0RFQ0xfRElSQUNfUElYT1AoYXZnLCBsMl9jKTsKK0RFQ0xfRElSQUNfUElYT1AocHV0LCBsNF9jKTsKK0RFQ0xfRElSQUNfUElYT1AoYXZnLCBsNF9jKTsKKwordm9pZCBmZl9kaXJhY2RzcF9pbml0KERpcmFjRFNQQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0RJUkFDRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RueGhkX3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZG54aGRfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmYjk4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RueGhkX3BhcnNlci5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogRE54SEQvVkMtMyBwYXJzZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlLmNvdWR1cmllckBmcmVlLmZyPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBETnhIRC9WQy0zIHBhcnNlcgorICovCisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKworI2RlZmluZSBETlhIRF9IRUFERVJfUFJFRklYIDB4MDAwMDAyODAwMTAwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQYXJzZUNvbnRleHQgcGM7CisgICAgaW50IGludGVybGFjZWQ7CisgICAgaW50IGN1cl9maWVsZDsgLyogZmlyc3QgZmllbGQgaXMgMCwgc2Vjb25kIGlzIDEgKi8KK30gRE5YSERQYXJzZXJDb250ZXh0OworCitzdGF0aWMgaW50IGRueGhkX2ZpbmRfZnJhbWVfZW5kKEROWEhEUGFyc2VyQ29udGV4dCAqZGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZkY3R4LT5wYzsKKyAgICB1aW50NjRfdCBzdGF0ZSA9IHBjLT5zdGF0ZTY0OworICAgIGludCBwaWNfZm91bmQgPSBwYy0+ZnJhbWVfc3RhcnRfZm91bmQ7CisgICAgaW50IGkgPSAwOworICAgIGludCBpbnRlcmxhY2VkID0gZGN0eC0+aW50ZXJsYWNlZDsKKyAgICBpbnQgY3VyX2ZpZWxkID0gZGN0eC0+Y3VyX2ZpZWxkOworCisgICAgaWYgKCFwaWNfZm91bmQpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgYnVmW2ldOworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIDB4ZmZmZmZmZmZmZjAwTEwpID09IEROWEhEX0hFQURFUl9QUkVGSVgpIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgcGljX2ZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBpbnRlcmxhY2VkID0gKHN0YXRlJjIpPj4xOyAvKiBieXRlIGZvbGxvd2luZyB0aGUgNS1ieXRlIGhlYWRlciBwcmVmaXggKi8KKyAgICAgICAgICAgICAgICBjdXJfZmllbGQgPSBzdGF0ZSYxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBpY19mb3VuZCkgeworICAgICAgICBpZiAoIWJ1Zl9zaXplKSAvKiBFT0YgY29uc2lkZXJlZCBhcyBlbmQgb2YgZnJhbWUgKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3IgKDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgYnVmW2ldOworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIDB4ZmZmZmZmZmZmZjAwTEwpID09IEROWEhEX0hFQURFUl9QUkVGSVgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWludGVybGFjZWQgfHwgZGN0eC0+Y3VyX2ZpZWxkKSB7CisgICAgICAgICAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBjLT5zdGF0ZTY0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGRjdHgtPmludGVybGFjZWQgPSBpbnRlcmxhY2VkOworICAgICAgICAgICAgICAgICAgICBkY3R4LT5jdXJfZmllbGQgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAtIDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY29udGludWUsIHRvIGdldCB0aGUgc2Vjb25kIGZpZWxkICovCisgICAgICAgICAgICAgICAgICAgIGRjdHgtPmludGVybGFjZWQgPSBpbnRlcmxhY2VkID0gKHN0YXRlJjIpPj4xOworICAgICAgICAgICAgICAgICAgICBkY3R4LT5jdXJfZmllbGQgPSBjdXJfZmllbGQgPSBzdGF0ZSYxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPSBwaWNfZm91bmQ7CisgICAgcGMtPnN0YXRlNjQgPSBzdGF0ZTsKKyAgICBkY3R4LT5pbnRlcmxhY2VkID0gaW50ZXJsYWNlZDsKKyAgICBkY3R4LT5jdXJfZmllbGQgPSBjdXJfZmllbGQ7CisgICAgcmV0dXJuIEVORF9OT1RfRk9VTkQ7Cit9CisKK3N0YXRpYyBpbnQgZG54aGRfcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBETlhIRFBhcnNlckNvbnRleHQgKmRjdHggPSBzLT5wcml2X2RhdGE7CisgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZkY3R4LT5wYzsKKyAgICBpbnQgbmV4dDsKKworICAgIGlmIChzLT5mbGFncyAmIFBBUlNFUl9GTEFHX0NPTVBMRVRFX0ZSQU1FUykgeworICAgICAgICBuZXh0ID0gYnVmX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbmV4dCA9IGRueGhkX2ZpbmRfZnJhbWVfZW5kKGRjdHgsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICBpZiAoZmZfY29tYmluZV9mcmFtZShwYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgICAgICpwb3V0YnVmICAgICAgPSBOVUxMOworICAgICAgICAgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBvdXRidWYgICAgICA9IGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK0FWQ29kZWNQYXJzZXIgZmZfZG54aGRfcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfRE5YSEQgfSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRE5YSERQYXJzZXJDb250ZXh0KSwKKyAgICAucGFyc2VyX3BhcnNlICAgPSBkbnhoZF9wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kbnhoZGRhdGEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RueGhkZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTkxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kbnhoZGRhdGEuYwpAQCAtMCwwICsxLDExMDEgQEAKKy8qCisgKiBWQzMvRE54SEQgZGF0YS4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBTbWFydEpvZyBTLkEuLCBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlIGRvdCBjb3VkdXJpZXIgYXQgc21hcnRqb2cgZG90IGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJkbnhoZGRhdGEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKy8qIFRoZSBxdWFudGl6YXRpb24gdGFibGVzIGJlbG93IGFyZSBpbiB6aWd6YWcgb3JkZXIhICovCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyMzVfbHVtYV93ZWlnaHRbXSA9IHsKKyAgICAgMCwgMzIsIDMyLCAzMiwgMzMsIDMyLCAzMiwgMzIsCisgICAgMzIsIDMxLCAzMiwgMzMsIDMzLCAzMywgMzMsIDM1LAorICAgIDM2LCAzNiwgMzQsIDM0LCAzNiwgMzcsIDM3LCAzNiwKKyAgICAzNiwgMzUsIDM2LCAzOCwgMzksIDM5LCAzNywgMzYsCisgICAgMzcsIDM3LCAzOSwgNDEsIDQyLCA0MSwgMzksIDM5LAorICAgIDQwLCA0MSwgNDIsIDQzLCA0MiwgNDIsIDQxLCA0MSwKKyAgICA0MSwgNDQsIDQ3LCA0NiwgNDYsIDQ4LCA1MSwgNTEsCisgICAgNTAsIDUwLCA1MywgNTUsIDU1LCA1NiwgNjAsIDYwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTIzNV9jaHJvbWFfd2VpZ2h0W10gPSB7CisgICAgIDAsIDMyLCAzMywgMzQsIDM0LCAzMywgMzQsIDM1LAorICAgIDM3LCA0MCwgNDMsIDQyLCAzOSwgMzgsIDM5LCA0MSwKKyAgICA0MywgNDQsIDQ3LCA1MCwgNTUsIDYxLCA2MywgNTYsCisgICAgNDgsIDQ2LCA0OSwgNTQsIDU5LCA1OCwgNTUsIDU4LAorICAgIDYzLCA2NSwgNjcsIDc0LCA4NCwgODIsIDc1LCA3MiwKKyAgICA3MCwgNzQsIDg0LCA4NywgODcsIDk0LCA5MywgODEsCisgICAgNzUsIDc4LCA4MywgODksIDkxLCA4NiwgODIsIDg1LAorICAgIDkwLCA5MCwgODUsIDc5LCA3MywgNzMsIDczLCA3MywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyMzdfbHVtYV93ZWlnaHRbXSA9IHsKKyAgICAgMCwgIDMyLCAgMzMsICAzNCwgMzQsIDM2LCAzNywgMzYsCisgICAgMzYsICAzNywgIDM4LCAgMzgsIDM4LCAzOSwgNDEsIDQ0LAorICAgIDQzLCAgNDEsICA0MCwgIDQxLCA0NiwgNDksIDQ3LCA0NiwKKyAgICA0NywgIDQ5LCAgNTEsICA1NCwgNjAsIDYyLCA1OSwgNTUsCisgICAgNTQsICA1NiwgIDU4LCAgNjEsIDY1LCA2NiwgNjQsIDYzLAorICAgIDY2LCAgNzMsICA3OCwgIDc5LCA4MCwgNzksIDc4LCA3OCwKKyAgICA4MiwgIDg3LCAgODksICA5MCwgOTMsIDk1LCA5NiwgOTcsCisgICAgOTcsIDEwMCwgMTA0LCAxMDIsIDk4LCA5OCwgOTksIDk5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTIzN19jaHJvbWFfd2VpZ2h0W10gPSB7CisgICAgIDAsICAzMiwgIDM2LCAgMzksIDM5LCAzOCwgMzksICA0MSwKKyAgICA0NSwgIDUxLCAgNTcsICA1OCwgNTMsIDQ4LCA0NywgIDUxLAorICAgIDU1LCAgNTgsICA2NiwgIDc1LCA4MSwgODMsIDgyLCAgNzgsCisgICAgNzMsICA3MiwgIDc0LCAgNzcsIDgzLCA4NSwgODMsICA4MiwKKyAgICA4OSwgIDk5LCAgOTYsICA5MCwgOTQsIDk3LCA5OSwgMTA1LAorICAgMTA5LCAxMDUsICA5NSwgIDg5LCA5MiwgOTUsIDk0LCAgOTMsCisgICAgOTIsICA4OCwgIDg5LCAgOTAsIDkzLCA5NSwgOTYsICA5NywKKyAgICA5NywgMTAwLCAxMDQsIDEwMiwgOTgsIDk4LCA5OSwgIDk5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTIzOF9sdW1hX3dlaWdodFtdID0geworICAgICAwLCAzMiwgMzIsIDMzLCAzNCwgMzMsIDMzLCAzMywKKyAgICAzMywgMzMsIDMzLCAzMywgMzMsIDM1LCAzNywgMzcsCisgICAgMzYsIDM2LCAzNSwgMzYsIDM4LCAzOCwgMzYsIDM1LAorICAgIDM2LCAzNywgMzgsIDQxLCA0MiwgNDEsIDM5LCAzOCwKKyAgICAzOCwgMzgsIDM5LCA0MSwgNDIsIDQxLCAzOSwgMzksCisgICAgNDAsIDQxLCA0MywgNDQsIDQ0LCA0NCwgNDQsIDQ0LAorICAgIDQ1LCA0NywgNDcsIDQ3LCA0OSwgNTAsIDUxLCA1MSwKKyAgICA1MSwgNTMsIDU1LCA1NywgNTgsIDU5LCA1NywgNTcsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjM4X2Nocm9tYV93ZWlnaHRbXSA9IHsKKyAgICAgMCwgMzIsIDM1LCAzNSwgMzUsIDM0LCAzNCwgMzUsCisgICAgMzksIDQzLCA0NSwgNDUsIDQxLCAzOSwgNDAsIDQxLAorICAgIDQyLCA0NCwgNDgsIDU1LCA1OSwgNjMsIDY1LCA1OSwKKyAgICA1MywgNTIsIDUyLCA1NSwgNjEsIDYyLCA1OCwgNTgsCisgICAgNjMsIDY2LCA2NiwgNjUsIDcwLCA3NCwgNzAsIDY2LAorICAgIDY1LCA2OCwgNzUsIDc3LCA3NCwgNzQsIDc3LCA3NiwKKyAgICA3MywgNzMsIDczLCA3MywgNzYsIDgwLCA4OSwgOTAsCisgICAgODIsIDc3LCA4MCwgODYsIDg0LCA4MiwgODIsIDgyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI0MV9sdW1hX3dlaWdodFtdID0geworICAgICAwLCAzMiwgMzMsIDM0LCAzNCwgMzUsIDM2LCAzNywKKyAgICAzNiwgMzcsIDM4LCAzOCwgMzgsIDM5LCAzOSwgNDAsCisgICAgNDAsIDM4LCAzOCwgMzksIDM4LCAzNywgMzksIDQxLAorICAgIDQxLCA0MiwgNDMsIDQ1LCA0NSwgNDYsIDQ3LCA0NiwKKyAgICA0NSwgNDMsIDM5LCAzNywgMzcsIDQwLCA0NCwgNDUsCisgICAgNDUsIDQ2LCA0NiwgNDYsIDQ3LCA0NywgNDYsIDQ0LAorICAgIDQyLCA0MywgNDUsIDQ3LCA0OCwgNDksIDUwLCA0OSwKKyAgICA0OCwgNDYsIDQ3LCA0OCwgNDgsIDQ5LCA0OSwgNDksCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjQxX2Nocm9tYV93ZWlnaHRbXSA9IHsKKyAgICAgMCwgMzIsIDM2LCAzOCwgMzcsIDM3LCA0MCwgNDEsCisgICAgNDAsIDQwLCA0MiwgNDIsIDQxLCA0MSwgNDEsIDQxLAorICAgIDQyLCA0MywgNDQsIDQ0LCA0NSwgNDYsIDQ2LCA0NSwKKyAgICA0NCwgNDUsIDQ1LCA0NSwgNDUsIDQ2LCA0NywgNDYsCisgICAgNDUsIDQ0LCA0MiwgNDEsIDQzLCA0NSwgNDUsIDQ3LAorICAgIDQ4LCA0OCwgNDgsIDQ2LCA0NywgNDcsIDQ2LCA0NywKKyAgICA0NiwgNDUsIDQ1LCA0NywgNDgsIDQ5LCA1MCwgNDksCisgICAgNDgsIDQ2LCA0OCwgNDksIDQ4LCA0OSwgNDksIDQ5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI0Ml9sdW1hX3dlaWdodFtdID0geworICAgICAwLCAzMiwgMzMsIDMzLCAzNCwgMzUsIDM2LCAzNSwKKyAgICAzMywgMzMsIDM1LCAzNiwgMzcsIDM3LCAzOCwgMzcsCisgICAgMzcsIDM3LCAzNiwgMzcsIDM3LCAzNywgMzgsIDM5LAorICAgIDM3LCAzNiwgMzcsIDQwLCA0MiwgNDUsIDQ2LCA0NCwKKyAgICA0MSwgNDIsIDQ0LCA0NSwgNDcsIDQ5LCA1MCwgNDgsCisgICAgNDYsIDQ4LCA0OSwgNTAsIDUyLCA1MiwgNTAsIDQ5LAorICAgIDQ3LCA0OCwgNTAsIDUwLCA1MSwgNTEsIDUwLCA0OSwKKyAgICA0OSwgNTEsIDUyLCA1MSwgNDksIDQ3LCA0NywgNDcsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjQyX2Nocm9tYV93ZWlnaHRbXSA9IHsKKyAgICAgMCwgMzIsIDM3LCA0MiwgNDUsIDQ1LCA0NSwgNDQsCisgICAgMzgsIDM3LCA0MCwgNDIsIDQ0LCA0OSwgNTEsIDQ3LAorICAgIDQxLCA0MCwgNDMsIDQ0LCA0NiwgNDgsIDUxLCA1NCwKKyAgICA1MSwgNDcsIDQ3LCA0NSwgNDcsIDUwLCA1MSwgNDksCisgICAgNDYsIDQ3LCA0OSwgNDcsIDUwLCA1NSwgNTUsIDUxLAorICAgIDQ4LCA0OSwgNTEsIDUxLCA1MiwgNTIsIDU0LCA1NCwKKyAgICA0OSwgNDksIDUyLCA1MywgNTQsIDU0LCA1MywgNTMsCisgICAgNTUsIDU5LCA2MywgNjIsIDYwLCA2MCwgNjAsIDYwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI0M19sdW1hX3dlaWdodFtdID0geworICAgICAwLCAzMiwgMzIsIDMzLCAzMywgMzUsIDM1LCAzNSwKKyAgICAzNSwgMzUsIDM1LCAzNSwgMzQsIDM1LCAzOCwgNDAsCisgICAgMzksIDM3LCAzNywgMzcsIDM2LCAzNSwgMzYsIDM4LAorICAgIDQwLCA0MSwgNDIsIDQ0LCA0NSwgNDQsIDQyLCA0MSwKKyAgICA0MCwgMzgsIDM2LCAzNiwgMzcsIDM4LCA0MCwgNDMsCisgICAgNDQsIDQ1LCA0NSwgNDUsIDQ1LCA0NSwgNDUsIDQxLAorICAgIDM5LCA0MSwgNDUsIDQ3LCA0NywgNDgsIDQ4LCA0OCwKKyAgICA0NiwgNDQsIDQ1LCA0NywgNDcsIDQ4LCA0NywgNDcsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjQzX2Nocm9tYV93ZWlnaHRbXSA9IHsKKyAgICAgMCwgMzIsIDM2LCAzNywgMzYsIDM3LCAzOSwgMzksCisgICAgNDEsIDQzLCA0MywgNDIsIDQxLCA0MSwgNDEsIDQyLAorICAgIDQzLCA0MywgNDMsIDQ0LCA0NCwgNDQsIDQ2LCA0NywKKyAgICA0NiwgNDUsIDQ1LCA0NSwgNDUsIDQ2LCA0NCwgNDQsCisgICAgNDUsIDQ0LCA0MiwgNDEsIDQzLCA0NiwgNDUsIDQ0LAorICAgIDQ1LCA0NSwgNDUsIDQ2LCA0NiwgNDYsIDQ1LCA0NCwKKyAgICA0NSwgNDQsIDQ1LCA0NywgNDcsIDQ4LCA0OSwgNDgsCisgICAgNDYsIDQ1LCA0NiwgNDcsIDQ3LCA0OCwgNDcsIDQ3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI1MF9sdW1hX3dlaWdodFtdID0geworICAgICAwLCAzMiwgMzIsIDMzLCAzNCwgMzUsIDM1LCAzNSwKKyAgICAzNCwgMzQsIDM1LCAzNiwgMzYsIDM2LCAzNiwgMzYsCisgICAgMzcsIDM4LCAzOCwgMzgsIDM4LCAzOCwgMzksIDM5LAorICAgIDM4LCAzOCwgMzksIDQxLCA0MywgNDMsIDQyLCA0MSwKKyAgICA0MCwgNDAsIDM5LCA0MCwgNDEsIDQxLCAzOSwgMzksCisgICAgNDAsIDQyLCA0NywgNTAsIDQ3LCA0NSwgNDYsIDQ2LAorICAgIDQ0LCA0NSwgNDYsIDQ3LCA0OSwgNTQsIDU4LCA1NCwKKyAgICA0OCwgNDksIDU0LCA1NywgNjAsIDYyLCA2MywgNjMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjUwX2Nocm9tYV93ZWlnaHRbXSA9IHsKKyAgICAgMCwgMzIsIDM1LCAzNiwgMzYsIDM1LCAzNiwgMzksCisgICAgNDEsIDQzLCA0NSwgNDQsIDQxLCAzOSwgNDAsIDQyLAorICAgIDQzLCA0MywgNDUsIDQ4LCA0OSwgNTEsIDUyLCA1MCwKKyAgICA1MCwgNTEsIDUxLCA1MSwgNTEsIDUyLCA1MywgNTQsCisgICAgNTEsIDQ5LCA1MSwgNTIsIDUyLCA1NiwgNTcsIDU1LAorICAgIDU0LCA1NCwgNTUsIDU2LCA1NSwgNTgsIDU4LCA1OCwKKyAgICA2MCwgNjEsIDYyLCA2MiwgNTksIDU3LCA1OCwgNTgsCisgICAgNjEsIDU5LCA1OSwgNTksIDYwLCA2MiwgNjMsIDYzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI1MV9sdW1hX3dlaWdodFtdID0geworICAgICAwLCAzMiwgMzIsIDM0LCAzNCwgMzQsIDM0LCAzNSwKKyAgICAzNSwgMzUsIDM2LCAzNywgMzYsIDM2LCAzNSwgMzYsCisgICAgMzgsIDM4LCAzOCwgMzgsIDM4LCAzOCwgMzgsIDM4LAorICAgIDM4LCAzOCwgMzksIDQxLCA0NCwgNDMsIDQxLCA0MCwKKyAgICA0MCwgNDAsIDQwLCAzOSwgNDAsIDQxLCA0MCwgMzksCisgICAgNDAsIDQzLCA0NiwgNDYsIDQ0LCA0NCwgNDQsIDQyLAorICAgIDQxLCA0MywgNDYsIDQ4LCA1MCwgNTUsIDU4LCA1MywKKyAgICA0OCwgNTAsIDU1LCA1OCwgNjEsIDYyLCA2MiwgNjIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjUxX2Nocm9tYV93ZWlnaHRbXSA9IHsKKyAgICAgMCwgMzIsIDM1LCAzNiwgMzYsIDM1LCAzNiwgMzksCisgICAgNDEsIDQzLCA0NSwgNDQsIDQxLCAzOSwgNDAsIDQyLAorICAgIDQzLCA0MywgNDUsIDQ4LCA0OCwgNDgsIDUwLCA1MCwKKyAgICA1MCwgNTEsIDUxLCA1MSwgNTEsIDUyLCA1MywgNTQsCisgICAgNTEsIDQ5LCA1MSwgNTIsIDUyLCA1NiwgNTcsIDU1LAorICAgIDU0LCA1NCwgNTUsIDU2LCA1NSwgNTgsIDU4LCA1OCwKKyAgICA2MCwgNjEsIDYyLCA2MiwgNTksIDU3LCA1OCwgNTgsCisgICAgNjEsIDU5LCA1OSwgNTksIDYxLCA2MiwgNjIsIDYyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI1Ml9sdW1hX3dlaWdodFtdID0geworICAgICAgMCwgIDMyLCAgMzQsIDM1LCAzNiwgMzYsIDM2LCAzNywKKyAgICAgMzYsICAzNywgIDM5LCA0MCwgNDEsIDQwLCA0MCwgNDAsCisgICAgIDQxLCAgNDEsICA0MiwgNDEsIDQxLCA0MywgNDQsIDQ0LAorICAgICA0NSwgIDQ2LCAgNDgsIDU1LCA2MCwgNTcsIDUyLCA1MCwKKyAgICAgNDksICA0OSwgIDUyLCA1MiwgNTMsIDU1LCA1OCwgNjIsCisgICAgIDY1LCAgNzMsICA4MiwgODIsIDgwLCA3OCwgNzMsIDY4LAorICAgICA3MSwgIDgyLCAgOTAsIDkwLCA4OCwgODcsIDkwLCA5NSwKKyAgICAxMDAsIDEwNywgMTAzLCA5NywgOTUsIDkzLCA5OSwgOTksCit9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI1Ml9jaHJvbWFfd2VpZ2h0W10gPSB7CisgICAgICAwLCAgMzIsICAzNSwgIDM2LCAgMzcsICAzNywgIDM4LCAgNDAsCisgICAgIDQyLCAgNDYsICA0OSwgIDUwLCAgNTAsICA0OSwgIDQ5LCAgNTMsCisgICAgIDU2LCAgNTYsICA1NywgIDU4LCAgNjAsICA2MiwgIDY0LCAgNjUsCisgICAgIDYzLCAgNjQsICA2NCwgIDY1LCAgNjYsICA2NSwgIDY3LCAgNzEsCisgICAgIDcyLCAgNzQsICA3NCwgIDc0LCAgNzQsICA3NywgIDgxLCAgNzgsCisgICAgIDcyLCAgNzMsICA4MiwgIDg1LCAgODksICA4OCwgIDg0LCAgODAsCisgICAgIDkwLCAxMDAsICA5MCwgIDkwLCAgODgsICA4NywgIDkwLCAgOTUsCisgICAgMTE0LCAxMjgsIDEyNSwgMTI5LCAxMzQsIDEyNSwgMTE2LCAxMTYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjU2X2Nocm9tYV93ZWlnaHRbXSA9IHsKKyAgICAgMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzMsCisgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDM0LAorICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMzLCAzNywKKyAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzNiwgMzksCisgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzNCwgMzksIDQ0LAorICAgIDMyLCAzNywgMzIsIDMyLCAzNSwgNDAsIDQzLCA0OSwKKyAgICAzMiwgMzMsIDM2LCAzNiwgNDAsIDQzLCA1MCwgNjAsCisgICAgMzQsIDM3LCAzOSwgNDQsIDUxLCA1NiwgNjEsIDcwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTIzN19kY19jb2Rlc1sxMl0gPSB7CisgICAgMCwgMTIsIDEzLCAxLCAyLCAzLCA0LCA1LCAxNCwgMzAsIDYyLCA2MywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyMzdfZGNfYml0c1sxMl0gPSB7CisgICAgMywgNCwgNCwgMywgMywgMywgMywgMywgNCwgNSwgNiwgNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBkbnhoZF8xMjM3X2FjX2NvZGVzWzI1N10gPSB7CisgICAgICAgIDAsICAgICAxLCAgICAgNCwgICAgIDUsICAgIDEyLCAgICAyNiwgICAgMjcsICAgIDU2LAorICAgICAgIDU3LCAgICA1OCwgICAgNTksICAgMTIwLCAgIDEyMSwgICAyNDQsICAgMjQ1LCAgIDI0NiwKKyAgICAgIDI0NywgICAyNDgsICAgNDk4LCAgIDQ5OSwgICA1MDAsICAgNTAxLCAgIDUwMiwgIDEwMDYsCisgICAgIDEwMDcsICAxMDA4LCAgMTAwOSwgIDEwMTAsICAxMDExLCAgMjAyNCwgIDIwMjUsICAyMDI2LAorICAgICAyMDI3LCAgMjAyOCwgIDIwMjksICAyMDMwLCAgMjAzMSwgIDQwNjQsICA0MDY1LCAgNDA2NiwKKyAgICAgNDA2NywgIDQwNjgsICA0MDY5LCAgNDA3MCwgIDQwNzEsICA0MDcyLCAgNDA3MywgIDgxNDgsCisgICAgIDgxNDksICA4MTUwLCAgODE1MSwgIDgxNTIsICA4MTUzLCAgODE1NCwgIDgxNTUsICA4MTU2LAorICAgICA4MTU3LCAgODE1OCwgMTYzMTgsIDE2MzE5LCAxNjMyMCwgMTYzMjEsIDE2MzIyLCAxNjMyMywKKyAgICAxNjMyNCwgMTYzMjUsIDE2MzI2LCAxNjMyNywgMTYzMjgsIDE2MzI5LCAxNjMzMCwgMTYzMzEsCisgICAgMTYzMzIsIDE2MzMzLCAzMjY2OCwgMzI2NjksIDMyNjcwLCAzMjY3MSwgMzI2NzIsIDMyNjczLAorICAgIDMyNjc0LCAzMjY3NSwgMzI2NzYsIDMyNjc3LCAzMjY3OCwgMzI2NzksIDMyNjgwLCAzMjY4MSwKKyAgICAzMjY4MiwgMzI2ODMsIDMyNjg0LCA2NTM3MCwgNjUzNzEsIDY1MzcyLCA2NTM3MywgNjUzNzQsCisgICAgNjUzNzUsIDY1Mzc2LCA2NTM3NywgNjUzNzgsIDY1Mzc5LCA2NTM4MCwgNjUzODEsIDY1MzgyLAorICAgIDY1MzgzLCA2NTM4NCwgNjUzODUsIDY1Mzg2LCA2NTM4NywgNjUzODgsIDY1Mzg5LCA2NTM5MCwKKyAgICA2NTM5MSwgNjUzOTIsIDY1MzkzLCA2NTM5NCwgNjUzOTUsIDY1Mzk2LCA2NTM5NywgNjUzOTgsCisgICAgNjUzOTksIDY1NDAwLCA2NTQwMSwgNjU0MDIsIDY1NDAzLCA2NTQwNCwgNjU0MDUsIDY1NDA2LAorICAgIDY1NDA3LCA2NTQwOCwgNjU0MDksIDY1NDEwLCA2NTQxMSwgNjU0MTIsIDY1NDEzLCA2NTQxNCwKKyAgICA2NTQxNSwgNjU0MTYsIDY1NDE3LCA2NTQxOCwgNjU0MTksIDY1NDIwLCA2NTQyMSwgNjU0MjIsCisgICAgNjU0MjMsIDY1NDI0LCA2NTQyNSwgNjU0MjYsIDY1NDI3LCA2NTQyOCwgNjU0MjksIDY1NDMwLAorICAgIDY1NDMxLCA2NTQzMiwgNjU0MzMsIDY1NDM0LCA2NTQzNSwgNjU0MzYsIDY1NDM3LCA2NTQzOCwKKyAgICA2NTQzOSwgNjU0NDAsIDY1NDQxLCA2NTQ0MiwgNjU0NDMsIDY1NDQ0LCA2NTQ0NSwgNjU0NDYsCisgICAgNjU0NDcsIDY1NDQ4LCA2NTQ0OSwgNjU0NTAsIDY1NDUxLCA2NTQ1MiwgNjU0NTMsIDY1NDU0LAorICAgIDY1NDU1LCA2NTQ1NiwgNjU0NTcsIDY1NDU4LCA2NTQ1OSwgNjU0NjAsIDY1NDYxLCA2NTQ2MiwKKyAgICA2NTQ2MywgNjU0NjQsIDY1NDY1LCA2NTQ2NiwgNjU0NjcsIDY1NDY4LCA2NTQ2OSwgNjU0NzAsCisgICAgNjU0NzEsIDY1NDcyLCA2NTQ3MywgNjU0NzQsIDY1NDc1LCA2NTQ3NiwgNjU0NzcsIDY1NDc4LAorICAgIDY1NDc5LCA2NTQ4MCwgNjU0ODEsIDY1NDgyLCA2NTQ4MywgNjU0ODQsIDY1NDg1LCA2NTQ4NiwKKyAgICA2NTQ4NywgNjU0ODgsIDY1NDg5LCA2NTQ5MCwgNjU0OTEsIDY1NDkyLCA2NTQ5MywgNjU0OTQsCisgICAgNjU0OTUsIDY1NDk2LCA2NTQ5NywgNjU0OTgsIDY1NDk5LCA2NTUwMCwgNjU1MDEsIDY1NTAyLAorICAgIDY1NTAzLCA2NTUwNCwgNjU1MDUsIDY1NTA2LCA2NTUwNywgNjU1MDgsIDY1NTA5LCA2NTUxMCwKKyAgICA2NTUxMSwgNjU1MTIsIDY1NTEzLCA2NTUxNCwgNjU1MTUsIDY1NTE2LCA2NTUxNywgNjU1MTgsCisgICAgNjU1MTksIDY1NTIwLCA2NTUyMSwgNjU1MjIsIDY1NTIzLCA2NTUyNCwgNjU1MjUsIDY1NTI2LAorICAgIDY1NTI3LCA2NTUyOCwgNjU1MjksIDY1NTMwLCA2NTUzMSwgNjU1MzIsIDY1NTMzLCA2NTUzNCwKKyAgICA2NTUzNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyMzdfYWNfYml0c1syNTddID0geworICAgICAyLCAgMiwgIDMsICAzLCAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTIzN19hY19sZXZlbFsyNTddID0geworICAgICAgMywgIDMsICA1LCAgMCwgIDcsICA5LCAgNSwgMTEsIDEzLCAxNSwgIDcsIDE3LCAxOSwgMjEsIDIzLCAyNSwKKyAgICAgIDksIDExLCAyNywgMjksIDMxLCAzMywgMTMsIDM1LCAzNywgMzksIDQxLCA0MywgMTUsIDQ1LCA0NywgNDksCisgICAgIDUxLCA1MywgNTUsIDE3LCAxOSwgNTcsIDU5LCA2MSwgNjMsIDY1LCA2NywgNjksIDIxLCAyMywgMjUsIDcxLAorICAgICA3MywgNzUsIDc3LCA3OSwgODEsIDgzLCAyNywgMjksIDMxLCAzMywgODUsIDg3LCA4OSwgOTEsIDkzLCA5NSwKKyAgICAgOTcsIDk5LDEwMSwxMDMsMTA1LCAzNSwgMzcsIDM5LCA0MSwgNDMsMTA3LDEwOSwxMTEsMTEzLDExNSwxMTcsCisgICAgMTE5LDEyMSwxMjMsMTI5LCAgMywgNDUsIDQ3LCA0OSwgNTEsIDUzLCA1NSwxMjUsMTI3LCAgNSwgIDcsICA5LAorICAgICAxMSwgMTMsIDE1LCAxNywgMTksIDIxLCAyMywgMjUsIDI3LCAyOSwgMzEsIDMzLCAzNSwgMzcsIDM5LCA0MSwKKyAgICAgNDMsIDQ1LCA0NywgNDksIDUxLCA1MywgNTUsIDU3LCA1OSwgNjEsIDYzLCA2NSwgNjcsIDY5LCA3MSwgNzMsCisgICAgIDc1LCA3NywgNzksIDgxLCA4MywgODUsIDg3LCA4OSwgOTEsIDkzLCA5NSwgOTcsIDk5LDEwMSwxMDMsMTA1LAorICAgIDEwNywxMDksMTExLDExMywxMTUsMTE3LDExOSwxMjEsMTIzLDEyNSwxMjcsMTI5LCA1NywgNTksIDYxLCA2MywKKyAgICAgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MSwgODMsIDg1LCA4NywgODksIDkxLCA5MywgOTUsCisgICAgIDk3LCA5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMSwxMTMsMTE1LDExNywxMTksMTIxLDEyMywxMjUsMTI3LAorICAgIDEyOSwgIDMsICA1LCAgNywgIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LCAzMSwKKyAgICAgMzMsIDM1LCAzNywgMzksIDQxLCA0MywgNDUsIDQ3LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MSwgNjMsCisgICAgIDY1LCA2NywgNjksIDcxLCA3MywgNzUsIDc3LCA3OSwgODEsIDgzLCA4NSwgODcsIDg5LCA5MSwgOTMsIDk1LAorICAgICA5NywgOTksMTAxLDEwMywxMDUsMTA3LDEwOSwxMTEsMTEzLDExNSwxMTcsMTE5LDEyMSwxMjMsMTI1LDEyNywKKyAgICAxMjksCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjM3X2FjX2ZsYWdzWzI1N10gPSB7CisgICAgMCwgMiwgMCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMCwgMCwKKyAgICAyLCAyLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDIsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDIsIDIsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMiwgMiwgMiwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAyLCAyLCAyLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDAsIDAsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGRueGhkXzEyMzdfcnVuX2NvZGVzWzYyXSA9IHsKKyAgICAgICAwLCAgICA0LCAgIDEwLCAgIDExLCAgIDI0LCAgIDI1LCAgIDI2LCAgIDU0LAorICAgICAgNTUsICAgNTYsICAgNTcsICAgNTgsICAxMTgsICAxMTksICAyNDAsICA0ODIsCisgICAgIDQ4MywgIDQ4NCwgIDQ4NSwgIDQ4NiwgIDQ4NywgIDQ4OCwgIDQ4OSwgIDQ5MCwKKyAgICAgNDkxLCAgNDkyLCAgNDkzLCAgNDk0LCAgOTkwLCAgOTkxLCAgOTkyLCAgOTkzLAorICAgICA5OTQsICA5OTUsICA5OTYsICA5OTcsICA5OTgsICA5OTksIDEwMDAsIDEwMDEsCisgICAgMTAwMiwgMTAwMywgMTAwNCwgMTAwNSwgMTAwNiwgMTAwNywgMTAwOCwgMTAwOSwKKyAgICAxMDEwLCAxMDExLCAxMDEyLCAxMDEzLCAxMDE0LCAxMDE1LCAxMDE2LCAxMDE3LAorICAgIDEwMTgsIDEwMTksIDEwMjAsIDEwMjEsIDEwMjIsIDEwMjMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjM3X3J1bl9iaXRzWzYyXSA9IHsKKyAgICAgMSwgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA4LCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjM3X3J1bls2Ml0gPSB7CisgICAgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCisgICAgMTcsIDE4LCAxOSwgMjAsIDIxLCA1MywgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgMjIsIDIzLCAyNCwgMjUsCisgICAgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsCisgICAgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1NCwgNTUsIDU2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTIzOF9kY19jb2Rlc1sxMl0gPSB7CisgICAgMCwgMTIsIDEzLCAxLCAyLCAzLCA0LCA1LCAxNCwgMzAsIDYyLCA2MywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyMzhfZGNfYml0c1sxMl0gPSB7CisgICAgMywgNCwgNCwgMywgMywgMywgMywgMywgNCwgNSwgNiwgNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBkbnhoZF8xMjM4X2FjX2NvZGVzWzI1N10gPSB7CisgICAgICAgIDAsICAgICAxLCAgICAgNCwgICAgMTAsICAgIDExLCAgICAyNCwgICAgMjUsICAgIDI2LAorICAgICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgIDExNiwgICAxMTcsICAgMTE4LCAgIDExOSwKKyAgICAgIDI0MCwgICAyNDEsICAgMjQyLCAgIDI0MywgICAyNDQsICAgMjQ1LCAgIDQ5MiwgICA0OTMsCisgICAgICA0OTQsICAgNDk1LCAgIDQ5NiwgICA0OTcsICAgNDk4LCAgIDQ5OSwgIDEwMDAsICAxMDAxLAorICAgICAxMDAyLCAgMTAwMywgIDEwMDQsICAxMDA1LCAgMTAwNiwgIDEwMDcsICAxMDA4LCAgMjAxOCwKKyAgICAgMjAxOSwgIDIwMjAsICAyMDIxLCAgMjAyMiwgIDIwMjMsICAyMDI0LCAgMjAyNSwgIDIwMjYsCisgICAgIDIwMjcsICA0MDU2LCAgNDA1NywgIDQwNTgsICA0MDU5LCAgNDA2MCwgIDQwNjEsICA0MDYyLAorICAgICA0MDYzLCAgNDA2NCwgIDQwNjUsICA0MDY2LCAgNDA2NywgIDQwNjgsICA0MDY5LCAgODE0MCwKKyAgICAgODE0MSwgIDgxNDIsICA4MTQzLCAgODE0NCwgIDgxNDUsICA4MTQ2LCAgODE0NywgIDgxNDgsCisgICAgIDgxNDksICA4MTUwLCAgODE1MSwgIDgxNTIsICA4MTUzLCAgODE1NCwgIDgxNTUsICA4MTU2LAorICAgIDE2MzE0LCAxNjMxNSwgMTYzMTYsIDE2MzE3LCAxNjMxOCwgMTYzMTksIDE2MzIwLCAxNjMyMSwKKyAgICAxNjMyMiwgMTYzMjMsIDE2MzI0LCAxNjMyNSwgMTYzMjYsIDE2MzI3LCAxNjMyOCwgMTYzMjksCisgICAgMTYzMzAsIDE2MzMxLCAxNjMzMiwgMTYzMzMsIDE2MzM0LCAxNjMzNSwgMTYzMzYsIDE2MzM3LAorICAgIDE2MzM4LCAzMjY3OCwgMzI2NzksIDMyNjgwLCAzMjY4MSwgMzI2ODIsIDMyNjgzLCAzMjY4NCwKKyAgICAzMjY4NSwgMzI2ODYsIDMyNjg3LCAzMjY4OCwgMzI2ODksIDMyNjkwLCAzMjY5MSwgMzI2OTIsCisgICAgMzI2OTMsIDMyNjk0LCAzMjY5NSwgMzI2OTYsIDMyNjk3LCAzMjY5OCwgMzI2OTksIDMyNzAwLAorICAgIDMyNzAxLCAzMjcwMiwgMzI3MDMsIDMyNzA0LCAzMjcwNSwgNjU0MTIsIDY1NDEzLCA2NTQxNCwKKyAgICA2NTQxNSwgNjU0MTYsIDY1NDE3LCA2NTQxOCwgNjU0MTksIDY1NDIwLCA2NTQyMSwgNjU0MjIsCisgICAgNjU0MjMsIDY1NDI0LCA2NTQyNSwgNjU0MjYsIDY1NDI3LCA2NTQyOCwgNjU0MjksIDY1NDMwLAorICAgIDY1NDMxLCA2NTQzMiwgNjU0MzMsIDY1NDM0LCA2NTQzNSwgNjU0MzYsIDY1NDM3LCA2NTQzOCwKKyAgICA2NTQzOSwgNjU0NDAsIDY1NDQxLCA2NTQ0MiwgNjU0NDMsIDY1NDQ0LCA2NTQ0NSwgNjU0NDYsCisgICAgNjU0NDcsIDY1NDQ4LCA2NTQ0OSwgNjU0NTAsIDY1NDUxLCA2NTQ1MiwgNjU0NTMsIDY1NDU0LAorICAgIDY1NDU1LCA2NTQ1NiwgNjU0NTcsIDY1NDU4LCA2NTQ1OSwgNjU0NjAsIDY1NDYxLCA2NTQ2MiwKKyAgICA2NTQ2MywgNjU0NjQsIDY1NDY1LCA2NTQ2NiwgNjU0NjcsIDY1NDY4LCA2NTQ2OSwgNjU0NzAsCisgICAgNjU0NzEsIDY1NDcyLCA2NTQ3MywgNjU0NzQsIDY1NDc1LCA2NTQ3NiwgNjU0NzcsIDY1NDc4LAorICAgIDY1NDc5LCA2NTQ4MCwgNjU0ODEsIDY1NDgyLCA2NTQ4MywgNjU0ODQsIDY1NDg1LCA2NTQ4NiwKKyAgICA2NTQ4NywgNjU0ODgsIDY1NDg5LCA2NTQ5MCwgNjU0OTEsIDY1NDkyLCA2NTQ5MywgNjU0OTQsCisgICAgNjU0OTUsIDY1NDk2LCA2NTQ5NywgNjU0OTgsIDY1NDk5LCA2NTUwMCwgNjU1MDEsIDY1NTAyLAorICAgIDY1NTAzLCA2NTUwNCwgNjU1MDUsIDY1NTA2LCA2NTUwNywgNjU1MDgsIDY1NTA5LCA2NTUxMCwKKyAgICA2NTUxMSwgNjU1MTIsIDY1NTEzLCA2NTUxNCwgNjU1MTUsIDY1NTE2LCA2NTUxNywgNjU1MTgsCisgICAgNjU1MTksIDY1NTIwLCA2NTUyMSwgNjU1MjIsIDY1NTIzLCA2NTUyNCwgNjU1MjUsIDY1NTI2LAorICAgIDY1NTI3LCA2NTUyOCwgNjU1MjksIDY1NTMwLCA2NTUzMSwgNjU1MzIsIDY1NTMzLCA2NTUzNCwKKyAgICA2NTUzNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyMzhfYWNfYml0c1syNTddID0geworICAgICAyLCAgMiwgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTIzOF9hY19sZXZlbFsyNTddID0geworICAgICAgMywgIDMsICA1LCAgNywgIDAsICA5LCAxMSwgIDUsIDEzLCAxNSwgMTcsICA3LCAxOSwgMjEsIDIzLCAgOSwKKyAgICAgMjUsIDI3LCAyOSwgMzEsIDMzLCAxMSwgMzUsIDM3LCAzOSwgNDEsIDQzLCA0NSwgMTMsIDE1LCA0NywgNDksCisgICAgIDUxLCA1MywgNTUsIDU3LCA1OSwgMTcsIDE5LCA2MSwgNjMsIDY1LCA2NywgNjksIDcxLCA3MywgNzUsIDIxLAorICAgICAyMywgNzcsIDc5LCA4MSwgODMsIDg1LCA4NywgODksIDkxLCA5MywgOTUsIDk3LCAyNSwgMjcsIDI5LCA5OSwKKyAgICAxMDEsMTAzLDEwNSwxMDcsMTA5LDExMSwxMTMsMTE1LDExNywxMTksMTIxLDEyMywgMzEsIDMzLCAzNSwgMzcsCisgICAgMTI1LDEyNywxMjksICAzLCAgNSwgIDcsICA5LCAxMSwgMTMsIDE1LCAxNywgMTksIDIxLCAyMywgMjUsIDI3LAorICAgICAyOSwgMzEsIDMzLCAzOSwgNDEsIDQzLCA0NSwgNDcsIDQ5LCAzNSwgMzcsIDM5LCA0MSwgNDMsIDQ1LCA0NywKKyAgICAgNDksIDUxLCA1MywgNTUsIDU3LCA1OSwgNjEsIDYzLCA2NSwgNjcsIDY5LCA3MSwgNzMsIDc1LCA4MSwgNTEsCisgICAgIDUzLCA1NSwgNTcsIDU5LCA2MSwgNzcsIDc5LCA4MywgODUsIDg3LCA4OSwgOTEsIDkzLCA5NSwgOTcsIDk5LAorICAgIDEwMSwxMDMsMTA1LDEwNywxMDksMTExLDExMywxMTUsMTE3LDExOSwxMjEsMTIzLDEyNSwxMjcsMTI5LCA2MywKKyAgICAgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MSwgODMsIDg1LCA4NywgODksIDkxLCA5MywgOTUsCisgICAgIDk3LCA5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMSwxMTMsMTE1LDExNywxMTksMTIxLDEyMywxMjUsMTI3LAorICAgIDEyOSwgIDMsICA1LCAgNywgIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LCAzMSwKKyAgICAgMzMsIDM1LCAzNywgMzksIDQxLCA0MywgNDUsIDQ3LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MSwgNjMsCisgICAgIDY1LCA2NywgNjksIDcxLCA3MywgNzUsIDc3LCA3OSwgODEsIDgzLCA4NSwgODcsIDg5LCA5MSwgOTMsIDk1LAorICAgICA5NywgOTksMTAxLDEwMywxMDUsMTA3LDEwOSwxMTEsMTEzLDExNSwxMTcsMTE5LDEyMSwxMjMsMTI1LDEyNywKKyAgICAxMjksCit9OyAvKiAwIGlzIEVPQiAqLworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjM4X2FjX2ZsYWdzWzI1N10gPSB7CisgICAgMCwgMiwgMCwgMCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMiwKKyAgICAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAyLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDIsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsCisgICAgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMiwgMiwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAyLCAyLCAyLAorICAgIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLAorICAgIDIsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGRueGhkXzEyMzVfMTIzOF8xMjQxX3J1bl9jb2Rlc1s2Ml0gPSB7CisgICAgICAgMCwgICAgNCwgICAxMCwgICAxMSwgICAyNCwgICAyNSwgICAyNiwgICAyNywKKyAgICAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgMTIwLCAgMjQyLCAgNDg2LCAgNDg3LAorICAgICA0ODgsICA0ODksICA5ODAsICA5ODEsICA5ODIsICA5ODMsICA5ODQsICA5ODUsCisgICAgIDk4NiwgIDk4NywgIDk4OCwgIDk4OSwgIDk5MCwgIDk5MSwgIDk5MiwgIDk5MywKKyAgICAgOTk0LCAgOTk1LCAgOTk2LCAgOTk3LCAgOTk4LCAgOTk5LCAxMDAwLCAxMDAxLAorICAgIDEwMDIsIDEwMDMsIDEwMDQsIDEwMDUsIDEwMDYsIDEwMDcsIDEwMDgsIDEwMDksCisgICAgMTAxMCwgMTAxMSwgMTAxMiwgMTAxMywgMTAxNCwgMTAxNSwgMTAxNiwgMTAxNywKKyAgICAxMDE4LCAxMDE5LCAxMDIwLCAxMDIxLCAxMDIyLCAxMDIzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTIzNV8xMjM4XzEyNDFfcnVuX2JpdHNbNjJdID0geworICAgICAxLCAgMywgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LCAgOCwgIDksICA5LAorICAgICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyMzhfcnVuWzYyXSA9IHsKKyAgICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKyAgICAyMCwgMjEsIDE3LCAxOCwgMTksIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwKKyAgICAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKKyAgICA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjM1XzEyNDFfZGNfY29kZXNbMTRdID0geworICAgIDEwLCA2MiwgMTEsIDEyLCAxMywgMCwgMSwgMiwgMywgNCwgMTQsIDMwLCAxMjYsIDEyNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyMzVfMTI0MV9kY19iaXRzWzE0XSA9IHsKKyAgICA0LCA2LCA0LCA0LCA0LCAzLCAzLCAzLCAzLCAzLCA0LCA1LCA3LCA3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGRueGhkXzEyMzVfMTI0MV9hY19jb2Rlc1syNTddID0geworICAgICAgICAwLCAgICAgMSwgICAgIDQsICAgIDEwLCAgICAxMSwgICAgMjQsICAgIDI1LCAgICAyNiwKKyAgICAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAxMTYsICAgMTE3LCAgIDExOCwgICAxMTksCisgICAgICAyNDAsICAgMjQxLCAgIDI0MiwgICAyNDMsICAgMjQ0LCAgIDI0NSwgICA0OTIsICAgNDkzLAorICAgICAgNDk0LCAgIDQ5NSwgICA0OTYsICAgNDk3LCAgIDQ5OCwgICA5OTgsICAgOTk5LCAgMTAwMCwKKyAgICAgMTAwMSwgIDEwMDIsICAxMDAzLCAgMTAwNCwgIDEwMDUsICAxMDA2LCAgMTAwNywgIDIwMTYsCisgICAgIDIwMTcsICAyMDE4LCAgMjAxOSwgIDIwMjAsICAyMDIxLCAgMjAyMiwgIDIwMjMsICAyMDI0LAorICAgICAyMDI1LCAgMjAyNiwgIDQwNTQsICA0MDU1LCAgNDA1NiwgIDQwNTcsICA0MDU4LCAgNDA1OSwKKyAgICAgNDA2MCwgIDQwNjEsICA0MDYyLCAgNDA2MywgIDQwNjQsICA0MDY1LCAgNDA2NiwgIDQwNjcsCisgICAgIDQwNjgsICA0MDY5LCAgODE0MCwgIDgxNDEsICA4MTQyLCAgODE0MywgIDgxNDQsICA4MTQ1LAorICAgICA4MTQ2LCAgODE0NywgIDgxNDgsICA4MTQ5LCAgODE1MCwgIDgxNTEsICA4MTUyLCAgODE1MywKKyAgICAgODE1NCwgIDgxNTUsICA4MTU2LCAgODE1NywgMTYzMTYsIDE2MzE3LCAxNjMxOCwgMTYzMTksCisgICAgMTYzMjAsIDE2MzIxLCAxNjMyMiwgMTYzMjMsIDE2MzI0LCAxNjMyNSwgMTYzMjYsIDE2MzI3LAorICAgIDE2MzI4LCAxNjMyOSwgMTYzMzAsIDE2MzMxLCAxNjMzMiwgMTYzMzMsIDE2MzM0LCAxNjMzNSwKKyAgICAxNjMzNiwgMTYzMzcsIDMyNjc2LCAzMjY3NywgMzI2NzgsIDMyNjc5LCAzMjY4MCwgMzI2ODEsCisgICAgMzI2ODIsIDMyNjgzLCAzMjY4NCwgMzI2ODUsIDMyNjg2LCAzMjY4NywgMzI2ODgsIDMyNjg5LAorICAgIDMyNjkwLCAzMjY5MSwgMzI2OTIsIDMyNjkzLCAzMjY5NCwgMzI2OTUsIDMyNjk2LCAzMjY5NywKKyAgICAzMjY5OCwgMzI2OTksIDMyNzAwLCAzMjcwMSwgMzI3MDIsIDMyNzAzLCAzMjcwNCwgMzI3MDUsCisgICAgMzI3MDYsIDMyNzA3LCAzMjcwOCwgNjU0MTgsIDY1NDE5LCA2NTQyMCwgNjU0MjEsIDY1NDIyLAorICAgIDY1NDIzLCA2NTQyNCwgNjU0MjUsIDY1NDI2LCA2NTQyNywgNjU0MjgsIDY1NDI5LCA2NTQzMCwKKyAgICA2NTQzMSwgNjU0MzIsIDY1NDMzLCA2NTQzNCwgNjU0MzUsIDY1NDM2LCA2NTQzNywgNjU0MzgsCisgICAgNjU0MzksIDY1NDQwLCA2NTQ0MSwgNjU0NDIsIDY1NDQzLCA2NTQ0NCwgNjU0NDUsIDY1NDQ2LAorICAgIDY1NDQ3LCA2NTQ0OCwgNjU0NDksIDY1NDUwLCA2NTQ1MSwgNjU0NTIsIDY1NDUzLCA2NTQ1NCwKKyAgICA2NTQ1NSwgNjU0NTYsIDY1NDU3LCA2NTQ1OCwgNjU0NTksIDY1NDYwLCA2NTQ2MSwgNjU0NjIsCisgICAgNjU0NjMsIDY1NDY0LCA2NTQ2NSwgNjU0NjYsIDY1NDY3LCA2NTQ2OCwgNjU0NjksIDY1NDcwLAorICAgIDY1NDcxLCA2NTQ3MiwgNjU0NzMsIDY1NDc0LCA2NTQ3NSwgNjU0NzYsIDY1NDc3LCA2NTQ3OCwKKyAgICA2NTQ3OSwgNjU0ODAsIDY1NDgxLCA2NTQ4MiwgNjU0ODMsIDY1NDg0LCA2NTQ4NSwgNjU0ODYsCisgICAgNjU0ODcsIDY1NDg4LCA2NTQ4OSwgNjU0OTAsIDY1NDkxLCA2NTQ5MiwgNjU0OTMsIDY1NDk0LAorICAgIDY1NDk1LCA2NTQ5NiwgNjU0OTcsIDY1NDk4LCA2NTQ5OSwgNjU1MDAsIDY1NTAxLCA2NTUwMiwKKyAgICA2NTUwMywgNjU1MDQsIDY1NTA1LCA2NTUwNiwgNjU1MDcsIDY1NTA4LCA2NTUwOSwgNjU1MTAsCisgICAgNjU1MTEsIDY1NTEyLCA2NTUxMywgNjU1MTQsIDY1NTE1LCA2NTUxNiwgNjU1MTcsIDY1NTE4LAorICAgIDY1NTE5LCA2NTUyMCwgNjU1MjEsIDY1NTIyLCA2NTUyMywgNjU1MjQsIDY1NTI1LCA2NTUyNiwKKyAgICA2NTUyNywgNjU1MjgsIDY1NTI5LCA2NTUzMCwgNjU1MzEsIDY1NTMyLCA2NTUzMywgNjU1MzQsCisgICAgNjU1MzUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjM1XzEyNDFfYWNfYml0c1syNTddID0geworICAgICAyLCAgMiwgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTIzNV8xMjQxX2FjX2xldmVsWzI1N10gPSB7CisgICAgICAzLCAgMywgIDUsICA3LCAgMCwgIDksIDExLCAgNSwgMTMsIDE1LCAxNywgIDcsIDE5LCAyMSwgMjMsICA5LAorICAgICAyNSwgMjcsIDI5LCAzMSwgMzMsIDExLCAzNSwgMzcsIDM5LCA0MSwgNDMsIDEzLCAxNSwgNDUsIDQ3LCA0OSwKKyAgICAgNTEsIDUzLCA1NSwgNTcsIDU5LCAxNywgMTksIDYxLCA2MywgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsCisgICAgIDIxLCAyMywgNzksIDgxLCA4MywgODUsIDg3LCA4OSwgOTEsIDkzLCA5NSwgOTcsIDk5LDEwMSwgMjUsIDI3LAorICAgICAyOSwgMzEsMTAzLDEwNSwxMDcsMTA5LDExMSwxMTMsMTE1LDExNywxMTksMTIxLDEyMywxMjUsMTI3LCAgMywKKyAgICAgMzMsIDM1LCAzNywgMzksMTI5LCAgNSwgIDcsICA5LCAxMSwgMTMsIDE1LCAxNywgMTksIDIxLCAyMywgMjUsCisgICAgIDI3LCAyOSwgMzEsIDMzLCAzNSwgNDEsIDQzLCA0NSwgNDcsIDQ5LCAzNywgMzksIDQxLCA0MywgNDUsIDQ3LAorICAgICA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MSwgNjMsIDY1LCA2NywgNjksIDcxLCA3MywgNzUsIDc3LCA3OSwKKyAgICAgODEsIDgzLCA4NSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MSwgNjMsIDY1LCA4NywgODksIDkxLCA5MywgOTUsCisgICAgIDk3LCA5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMSwxMTMsMTE1LDExNywxMTksMTIxLDEyMywxMjUsMTI3LAorICAgIDEyOSwgNjcsIDY5LCA3MSwgNzMsIDc1LCA3NywgNzksIDgxLCA4MywgODUsIDg3LCA4OSwgOTEsIDkzLCA5NSwKKyAgICAgOTcsIDk5LDEwMSwxMDMsMTA1LDEwNywxMDksMTExLDExMywxMTUsMTE3LDExOSwxMjEsMTIzLDEyNSwxMjcsCisgICAgMTI5LCAgMywgIDUsICA3LCAgOSwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMSwgMjMsIDI1LCAyNywgMjksIDMxLAorICAgICAzMywgMzUsIDM3LCAzOSwgNDEsIDQzLCA0NSwgNDcsIDQ5LCA1MSwgNTMsIDU1LCA1NywgNTksIDYxLCA2MywKKyAgICAgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MSwgODMsIDg1LCA4NywgODksIDkxLCA5MywgOTUsCisgICAgIDk3LCA5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMSwxMTMsMTE1LDExNywxMTksMTIxLDEyMywxMjUsMTI3LAorICAgIDEyOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyMzVfMTI0MV9hY19mbGFnc1syNTddID0geworICAgIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDIsCisgICAgMCwgMCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMCwgMCwgMiwgMiwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDIsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDIsCisgICAgMiwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwKKyAgICAyLCAyLCAyLCAyLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyMzVfMTI0MV9ydW5bNjJdID0geworICAgICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LAorICAgIDE4LCAyMCwgMTcsIDE5LCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLAorICAgIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LAorICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyNTBfZGNfY29kZXNbMTRdID0geworICAgIDEwLCA2MiwgMTEsIDEyLCAxMywgMCwgMSwgMiwgMywgNCwgMTQsIDMwLCAxMjYsIDEyNworfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyNTBfZGNfYml0c1sxNF0gPSB7CisgICAgNCwgNiwgNCwgNCwgNCwgMywgMywgMywgMywgMywgNCwgNSwgNywgNworfTsKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBkbnhoZF8xMjUwX2FjX2NvZGVzWzI1N10gPSB7CisgICAgICAgIDAsICAgICAxLCAgICAgNCwgICAgMTAsICAgIDExLCAgICAyNCwgICAgMjUsICAgIDI2LAorICAgICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgIDExNiwgICAxMTcsICAgMTE4LCAgIDExOSwKKyAgICAgIDI0MCwgICAyNDEsICAgMjQyLCAgIDI0MywgICAyNDQsICAgMjQ1LCAgIDQ5MiwgICA0OTMsCisgICAgICA0OTQsICAgNDk1LCAgIDQ5NiwgICA0OTcsICAgNDk4LCAgIDk5OCwgICA5OTksICAxMDAwLAorICAgICAxMDAxLCAgMTAwMiwgIDEwMDMsICAxMDA0LCAgMTAwNSwgIDEwMDYsICAyMDE0LCAgMjAxNSwKKyAgICAgMjAxNiwgIDIwMTcsICAyMDE4LCAgMjAxOSwgIDIwMjAsICAyMDIxLCAgMjAyMiwgIDIwMjMsCisgICAgIDIwMjQsICAyMDI1LCAgNDA1MiwgIDQwNTMsICA0MDU0LCAgNDA1NSwgIDQwNTYsICA0MDU3LAorICAgICA0MDU4LCAgNDA1OSwgIDQwNjAsICA0MDYxLCAgNDA2MiwgIDQwNjMsICA0MDY0LCAgNDA2NSwKKyAgICAgNDA2NiwgIDQwNjcsICA4MTM2LCAgODEzNywgIDgxMzgsICA4MTM5LCAgODE0MCwgIDgxNDEsCisgICAgIDgxNDIsICA4MTQzLCAgODE0NCwgIDgxNDUsICA4MTQ2LCAgODE0NywgIDgxNDgsICA4MTQ5LAorICAgICA4MTUwLCAgODE1MSwgIDgxNTIsICA4MTUzLCAgODE1NCwgIDgxNTUsICA4MTU2LCAxNjMxNCwKKyAgICAxNjMxNSwgMTYzMTYsIDE2MzE3LCAxNjMxOCwgMTYzMTksIDE2MzIwLCAxNjMyMSwgMTYzMjIsCisgICAgMTYzMjMsIDE2MzI0LCAxNjMyNSwgMTYzMjYsIDE2MzI3LCAxNjMyOCwgMTYzMjksIDE2MzMwLAorICAgIDE2MzMxLCAxNjMzMiwgMTYzMzMsIDE2MzM0LCAxNjMzNSwgMTYzMzYsIDE2MzM3LCAxNjMzOCwKKyAgICAzMjY3OCwgMzI2NzksIDMyNjgwLCAzMjY4MSwgMzI2ODIsIDMyNjgzLCAzMjY4NCwgMzI2ODUsCisgICAgMzI2ODYsIDMyNjg3LCAzMjY4OCwgMzI2ODksIDMyNjkwLCAzMjY5MSwgMzI2OTIsIDMyNjkzLAorICAgIDMyNjk0LCAzMjY5NSwgMzI2OTYsIDMyNjk3LCAzMjY5OCwgMzI2OTksIDMyNzAwLCAzMjcwMSwKKyAgICAzMjcwMiwgMzI3MDMsIDMyNzA0LCAzMjcwNSwgMzI3MDYsIDMyNzA3LCAzMjcwOCwgMzI3MDksCisgICAgMzI3MTAsIDMyNzExLCAzMjcxMiwgNjU0MjYsIDY1NDI3LCA2NTQyOCwgNjU0MjksIDY1NDMwLAorICAgIDY1NDMxLCA2NTQzMiwgNjU0MzMsIDY1NDM0LCA2NTQzNSwgNjU0MzYsIDY1NDM3LCA2NTQzOCwKKyAgICA2NTQzOSwgNjU0NDAsIDY1NDQxLCA2NTQ0MiwgNjU0NDMsIDY1NDQ0LCA2NTQ0NSwgNjU0NDYsCisgICAgNjU0NDcsIDY1NDQ4LCA2NTQ0OSwgNjU0NTAsIDY1NDUxLCA2NTQ1MiwgNjU0NTMsIDY1NDU0LAorICAgIDY1NDU1LCA2NTQ1NiwgNjU0NTcsIDY1NDU4LCA2NTQ1OSwgNjU0NjAsIDY1NDYxLCA2NTQ2MiwKKyAgICA2NTQ2MywgNjU0NjQsIDY1NDY1LCA2NTQ2NiwgNjU0NjcsIDY1NDY4LCA2NTQ2OSwgNjU0NzAsCisgICAgNjU0NzEsIDY1NDcyLCA2NTQ3MywgNjU0NzQsIDY1NDc1LCA2NTQ3NiwgNjU0NzcsIDY1NDc4LAorICAgIDY1NDc5LCA2NTQ4MCwgNjU0ODEsIDY1NDgyLCA2NTQ4MywgNjU0ODQsIDY1NDg1LCA2NTQ4NiwKKyAgICA2NTQ4NywgNjU0ODgsIDY1NDg5LCA2NTQ5MCwgNjU0OTEsIDY1NDkyLCA2NTQ5MywgNjU0OTQsCisgICAgNjU0OTUsIDY1NDk2LCA2NTQ5NywgNjU0OTgsIDY1NDk5LCA2NTUwMCwgNjU1MDEsIDY1NTAyLAorICAgIDY1NTAzLCA2NTUwNCwgNjU1MDUsIDY1NTA2LCA2NTUwNywgNjU1MDgsIDY1NTA5LCA2NTUxMCwKKyAgICA2NTUxMSwgNjU1MTIsIDY1NTEzLCA2NTUxNCwgNjU1MTUsIDY1NTE2LCA2NTUxNywgNjU1MTgsCisgICAgNjU1MTksIDY1NTIwLCA2NTUyMSwgNjU1MjIsIDY1NTIzLCA2NTUyNCwgNjU1MjUsIDY1NTI2LAorICAgIDY1NTI3LCA2NTUyOCwgNjU1MjksIDY1NTMwLCA2NTUzMSwgNjU1MzIsIDY1NTMzLCA2NTUzNCwKKyAgICA2NTUzNQorfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyNTBfYWNfYml0c1syNTddID0geworICAgICAyLCAgMiwgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2Cit9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI1MF9hY19sZXZlbFsyNTddID0geworICAgICAgMywgIDMsICA1LCAgNywgIDAsICA5LCAxMSwgIDUsIDEzLCAxNSwgMTcsICA3LCAxOSwgMjEsIDIzLCAgOSwKKyAgICAgMjUsIDI3LCAyOSwgMzEsIDMzLCAxMSwgMzUsIDM3LCAzOSwgNDEsIDQzLCA0NSwgMTMsIDQ3LCA0OSwgNTEsCisgICAgIDUzLCA1NSwgNTcsIDU5LCAxNSwgMTcsIDYxLCA2MywgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LAorICAgICAxOSwgMjEsIDgxLCA4MywgODUsIDg3LCA4OSwgOTEsIDkzLCA5NSwgOTcsIDk5LDEwMSwxMDMsMTA1LCAyMywKKyAgICAgMjUsIDI3LDEwNywxMDksMTExLDExMywxMTUsMTE3LDExOSwxMjEsMTIzLDEyNSwxMjcsMTI5LCAgMywgIDUsCisgICAgICA3LCAgOSwgMTEsIDI5LCAzMSwgMzMsIDM1LCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LAorICAgICAzMSwgMzMsIDM1LCAzNywgMzksIDQxLCA0MywgNDUsIDQ3LCA0OSwgNTEsIDUzLCAzNywgMzksIDQxLCA0MywKKyAgICAgNTUsIDU3LCA1OSwgNjEsIDYzLCA2NSwgNjcsIDY5LCA3MSwgNzMsIDc1LCA3NywgNzksIDgxLCA4MywgODUsCisgICAgIDg3LCA4OSwgOTEsIDkzLCA5NSwgOTcsIDk5LDEwMSwxMDMsMTA1LDEwNywxMTEsMTEzLCA0NSwgNDcsIDQ5LAorICAgICA1MSwgNTMsIDU1LDEwOSwxMTUsMTE3LDExOSwxMjEsMTIzLDEyNSwxMjcsMTI5LCA1NywgNTksIDYxLCA2MywKKyAgICAgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MSwgODMsIDg1LCA4NywgODksIDkxLCA5MywgOTUsCisgICAgIDk3LCA5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMSwxMTMsMTE1LDExNywxMTksMTIxLDEyMywxMjUsMTI3LAorICAgIDEyOSwgIDMsICA1LCAgNywgIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LCAzMSwKKyAgICAgMzMsIDM1LCAzNywgMzksIDQxLCA0MywgNDUsIDQ3LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MSwgNjMsCisgICAgIDY1LCA2NywgNjksIDcxLCA3MywgNzUsIDc3LCA3OSwgODEsIDgzLCA4NSwgODcsIDg5LCA5MSwgOTMsIDk1LAorICAgICA5NywgOTksMTAxLDEwMywxMDUsMTA3LDEwOSwxMTEsMTEzLDExNSwxMTcsMTE5LDEyMSwxMjMsMTI1LDEyNywKKyAgICAxMjkKK307CitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjUwX2FjX2ZsYWdzWzI1N10gPSB7CisgICAgMCwgMiwgMCwgMCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMiwKKyAgICAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDIsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMiwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwKKyAgICAyLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLAorICAgIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsCisgICAgMiwgMiwgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLAorfTsKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBkbnhoZF8xMjUwX3J1bl9jb2Rlc1s2Ml0gPSB7CisgICAgICAgMCwgICAgNCwgICAgNSwgICAxMiwgICAyNiwgICAyNywgICAyOCwgICA1OCwKKyAgICAgMTE4LCAgMTE5LCAgMTIwLCAgMjQyLCAgNDg2LCAgNDg3LCAgOTc2LCAgOTc3LAorICAgICA5NzgsICA5NzksICA5ODAsICA5ODEsICA5ODIsICA5ODMsICA5ODQsICA5ODUsCisgICAgIDk4NiwgIDk4NywgIDk4OCwgIDk4OSwgIDk5MCwgIDk5MSwgIDk5MiwgIDk5MywKKyAgICAgOTk0LCAgOTk1LCAgOTk2LCAgOTk3LCAgOTk4LCAgOTk5LCAxMDAwLCAxMDAxLAorICAgIDEwMDIsIDEwMDMsIDEwMDQsIDEwMDUsIDEwMDYsIDEwMDcsIDEwMDgsIDEwMDksCisgICAgMTAxMCwgMTAxMSwgMTAxMiwgMTAxMywgMTAxNCwgMTAxNSwgMTAxNiwgMTAxNywKKyAgICAxMDE4LCAxMDE5LCAxMDIwLCAxMDIxLCAxMDIyLCAxMDIzCit9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI1MF9ydW5fYml0c1s2Ml0gPSB7CisgICAgIDEsICAzLCAgMywgIDQsICA1LCAgNSwgIDUsICA2LCAgNywgIDcsICA3LCAgOCwgIDksICA5LCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwCit9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI1MF9ydW5bNjJdID0geworICAgICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LAorICAgIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLAorICAgIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LAorICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI1MV9kY19jb2Rlc1sxMl0gPSB7CisgICAgMCwgMTIsIDEzLCAxLCAyLCAzLCA0LCA1LCAxNCwgMzAsIDYyLCA2MywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyNTFfZGNfYml0c1sxMl0gPSB7CisgICAgMywgNCwgNCwgMywgMywgMywgMywgMywgNCwgNSwgNiwgNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBkbnhoZF8xMjUxX2FjX2NvZGVzWzI1N10gPSB7CisgICAgICAgIDAsICAgICAxLCAgICAgNCwgICAgMTAsICAgIDExLCAgICAyNCwgICAgMjUsICAgIDI2LAorICAgICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgIDExNiwgICAxMTcsICAgMTE4LCAgIDExOSwKKyAgICAgIDI0MCwgICAyNDEsICAgMjQyLCAgIDI0MywgICAyNDQsICAgMjQ1LCAgIDQ5MiwgICA0OTMsCisgICAgICA0OTQsICAgNDk1LCAgIDQ5NiwgICA0OTcsICAgOTk2LCAgIDk5NywgICA5OTgsICAgOTk5LAorICAgICAxMDAwLCAgMTAwMSwgIDEwMDIsICAxMDAzLCAgMTAwNCwgIDEwMDUsICAyMDEyLCAgMjAxMywKKyAgICAgMjAxNCwgIDIwMTUsICAyMDE2LCAgMjAxNywgIDIwMTgsICAyMDE5LCAgMjAyMCwgIDIwMjEsCisgICAgIDIwMjIsICAyMDIzLCAgMjAyNCwgIDIwMjUsICA0MDUyLCAgNDA1MywgIDQwNTQsICA0MDU1LAorICAgICA0MDU2LCAgNDA1NywgIDQwNTgsICA0MDU5LCAgNDA2MCwgIDQwNjEsICA0MDYyLCAgNDA2MywKKyAgICAgNDA2NCwgIDQwNjUsICA0MDY2LCAgODEzNCwgIDgxMzUsICA4MTM2LCAgODEzNywgIDgxMzgsCisgICAgIDgxMzksICA4MTQwLCAgODE0MSwgIDgxNDIsICA4MTQzLCAgODE0NCwgIDgxNDUsICA4MTQ2LAorICAgICA4MTQ3LCAgODE0OCwgIDgxNDksICA4MTUwLCAgODE1MSwgIDgxNTIsICA4MTUzLCAgODE1NCwKKyAgICAgODE1NSwgIDgxNTYsIDE2MzE0LCAxNjMxNSwgMTYzMTYsIDE2MzE3LCAxNjMxOCwgMTYzMTksCisgICAgMTYzMjAsIDE2MzIxLCAxNjMyMiwgMTYzMjMsIDE2MzI0LCAxNjMyNSwgMTYzMjYsIDE2MzI3LAorICAgIDE2MzI4LCAxNjMyOSwgMTYzMzAsIDE2MzMxLCAxNjMzMiwgMTYzMzMsIDE2MzM0LCAxNjMzNSwKKyAgICAxNjMzNiwgMTYzMzcsIDE2MzM4LCAxNjMzOSwgMzI2ODAsIDMyNjgxLCAzMjY4MiwgMzI2ODMsCisgICAgMzI2ODQsIDMyNjg1LCAzMjY4NiwgMzI2ODcsIDMyNjg4LCAzMjY4OSwgMzI2OTAsIDMyNjkxLAorICAgIDMyNjkyLCAzMjY5MywgMzI2OTQsIDMyNjk1LCAzMjY5NiwgMzI2OTcsIDMyNjk4LCAzMjY5OSwKKyAgICAzMjcwMCwgMzI3MDEsIDMyNzAyLCAzMjcwMywgMzI3MDQsIDMyNzA1LCAzMjcwNiwgMzI3MDcsCisgICAgMzI3MDgsIDMyNzA5LCAzMjcxMCwgMzI3MTEsIDMyNzEyLCAzMjcxMywgMzI3MTQsIDY1NDMwLAorICAgIDY1NDMxLCA2NTQzMiwgNjU0MzMsIDY1NDM0LCA2NTQzNSwgNjU0MzYsIDY1NDM3LCA2NTQzOCwKKyAgICA2NTQzOSwgNjU0NDAsIDY1NDQxLCA2NTQ0MiwgNjU0NDMsIDY1NDQ0LCA2NTQ0NSwgNjU0NDYsCisgICAgNjU0NDcsIDY1NDQ4LCA2NTQ0OSwgNjU0NTAsIDY1NDUxLCA2NTQ1MiwgNjU0NTMsIDY1NDU0LAorICAgIDY1NDU1LCA2NTQ1NiwgNjU0NTcsIDY1NDU4LCA2NTQ1OSwgNjU0NjAsIDY1NDYxLCA2NTQ2MiwKKyAgICA2NTQ2MywgNjU0NjQsIDY1NDY1LCA2NTQ2NiwgNjU0NjcsIDY1NDY4LCA2NTQ2OSwgNjU0NzAsCisgICAgNjU0NzEsIDY1NDcyLCA2NTQ3MywgNjU0NzQsIDY1NDc1LCA2NTQ3NiwgNjU0NzcsIDY1NDc4LAorICAgIDY1NDc5LCA2NTQ4MCwgNjU0ODEsIDY1NDgyLCA2NTQ4MywgNjU0ODQsIDY1NDg1LCA2NTQ4NiwKKyAgICA2NTQ4NywgNjU0ODgsIDY1NDg5LCA2NTQ5MCwgNjU0OTEsIDY1NDkyLCA2NTQ5MywgNjU0OTQsCisgICAgNjU0OTUsIDY1NDk2LCA2NTQ5NywgNjU0OTgsIDY1NDk5LCA2NTUwMCwgNjU1MDEsIDY1NTAyLAorICAgIDY1NTAzLCA2NTUwNCwgNjU1MDUsIDY1NTA2LCA2NTUwNywgNjU1MDgsIDY1NTA5LCA2NTUxMCwKKyAgICA2NTUxMSwgNjU1MTIsIDY1NTEzLCA2NTUxNCwgNjU1MTUsIDY1NTE2LCA2NTUxNywgNjU1MTgsCisgICAgNjU1MTksIDY1NTIwLCA2NTUyMSwgNjU1MjIsIDY1NTIzLCA2NTUyNCwgNjU1MjUsIDY1NTI2LAorICAgIDY1NTI3LCA2NTUyOCwgNjU1MjksIDY1NTMwLCA2NTUzMSwgNjU1MzIsIDY1NTMzLCA2NTUzNCwKKyAgICA2NTUzNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyNTFfYWNfYml0c1syNTddID0geworICAgICAyLCAgMiwgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI1MV9hY19sZXZlbFsyNTddID0geworICAgICAgMywgIDMsICA1LCAgNywgIDAsICA5LCAxMSwgIDUsIDEzLCAxNSwgMTcsICA3LCAxOSwgMjEsIDIzLCAgOSwKKyAgICAgMjUsIDI3LCAyOSwgMzEsIDMzLCAxMSwgMzUsIDM3LCAzOSwgNDEsIDQzLCAxMywgNDUsIDQ3LCA0OSwgNTEsCisgICAgIDUzLCA1NSwgNTcsIDU5LCAxNSwgMTcsIDYxLCA2MywgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LAorICAgICA4MSwgMTksIDIxLCAyMywgODMsIDg1LCA4NywgODksIDkxLCA5MywgOTUsIDk3LCA5OSwxMDEsMTAzLDEwNSwKKyAgICAgMjUsIDI3LCAyOSwxMDcsMTA5LDExMSwxMTMsMTE1LDExNywxMTksMTIxLDEyMywxMjUsMTI3LDEyOSwgIDMsCisgICAgICA1LCAgNywgIDksIDExLCAxMywgMTUsIDE3LCAzMSwgMzMsIDM1LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LAorICAgICAzMSwgMzMsIDM1LCAzNywgMzksIDQxLCA0MywgNDUsIDQ3LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCAzNywKKyAgICAgMzksIDQxLCA0MywgNDUsIDYxLCA2MywgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MSwgODMsCisgICAgIDg1LCA4NywgODksIDkxLCA5MywgOTUsIDk3LCA5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMSwxMTMsMTE1LAorICAgIDExNywgNDcsIDQ5LCA1MSwgNTMsIDU1LCA1NywxMTksMTIxLDEyMywxMjUsMTI3LDEyOSwgNTksIDYxLCA2MywKKyAgICAgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MSwgODMsIDg1LCA4NywgODksIDkxLCA5MywgOTUsCisgICAgIDk3LCA5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMSwxMTMsMTE1LDExNywxMTksMTIxLDEyMywxMjUsMTI3LAorICAgIDEyOSwgIDMsICA1LCAgNywgIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LCAzMSwKKyAgICAgMzMsIDM1LCAzNywgMzksIDQxLCA0MywgNDUsIDQ3LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MSwgNjMsCisgICAgIDY1LCA2NywgNjksIDcxLCA3MywgNzUsIDc3LCA3OSwgODEsIDgzLCA4NSwgODcsIDg5LCA5MSwgOTMsIDk1LAorICAgICA5NywgOTksMTAxLDEwMywxMDUsMTA3LDEwOSwxMTEsMTEzLDExNSwxMTcsMTE5LDEyMSwxMjMsMTI1LDEyNywKKyAgICAxMjksCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjUxX2FjX2ZsYWdzWzI1N10gPSB7CisgICAgMCwgMiwgMCwgMCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMiwKKyAgICAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDIsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMiwgMiwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAyLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwKKyAgICAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGRueGhkXzEyNTFfcnVuX2NvZGVzWzYyXSA9IHsKKyAgICAgICAwLCAgICA0LCAgICA1LCAgIDEyLCAgIDI2LCAgIDI3LCAgIDI4LCAgIDU4LAorICAgICAxMTgsICAxMTksICAxMjAsICAyNDIsICA0ODYsICA0ODcsICA5NzYsICA5NzcsCisgICAgIDk3OCwgIDk3OSwgIDk4MCwgIDk4MSwgIDk4MiwgIDk4MywgIDk4NCwgIDk4NSwKKyAgICAgOTg2LCAgOTg3LCAgOTg4LCAgOTg5LCAgOTkwLCAgOTkxLCAgOTkyLCAgOTkzLAorICAgICA5OTQsICA5OTUsICA5OTYsICA5OTcsICA5OTgsICA5OTksIDEwMDAsIDEwMDEsCisgICAgMTAwMiwgMTAwMywgMTAwNCwgMTAwNSwgMTAwNiwgMTAwNywgMTAwOCwgMTAwOSwKKyAgICAxMDEwLCAxMDExLCAxMDEyLCAxMDEzLCAxMDE0LCAxMDE1LCAxMDE2LCAxMDE3LAorICAgIDEwMTgsIDEwMTksIDEwMjAsIDEwMjEsIDEwMjIsIDEwMjMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjUxX3J1bl9iaXRzWzYyXSA9IHsKKyAgICAgMSwgIDMsICAzLCAgNCwgIDUsICA1LCAgNSwgIDYsICA3LCAgNywgIDcsICA4LCAgOSwgIDksIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjUxX3J1bls2Ml0gPSB7CisgICAgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCisgICAgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsCisgICAgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsCisgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI1Ml9kY19jb2Rlc1sxMl0gPSB7CisgICAgMCwgMTIsIDEzLCAxLCAyLCAzLCA0LCA1LCAxNCwgMzAsIDYyLCA2MywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyNTJfZGNfYml0c1sxMl0gPSB7CisgICAgMywgNCwgNCwgMywgMywgMywgMywgMywgNCwgNSwgNiwgNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBkbnhoZF8xMjUyX2FjX2NvZGVzWzI1N10gPSB7CisgICAgICAgIDAsICAgICAxLCAgICAgNCwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMjYsICAgIDI3LAorICAgICAgIDU2LCAgICA1NywgICAgNTgsICAgMTE4LCAgIDExOSwgICAxMjAsICAgMjQyLCAgIDI0MywKKyAgICAgIDI0NCwgICAyNDUsICAgMjQ2LCAgIDI0NywgICA0OTYsICAgNDk3LCAgIDQ5OCwgICA0OTksCisgICAgICA1MDAsICAxMDAyLCAgMTAwMywgIDEwMDQsICAxMDA1LCAgMTAwNiwgIDEwMDcsICAxMDA4LAorICAgICAxMDA5LCAgMjAyMCwgIDIwMjEsICAyMDIyLCAgMjAyMywgIDIwMjQsICAyMDI1LCAgMjAyNiwKKyAgICAgMjAyNywgIDIwMjgsICAyMDI5LCAgNDA2MCwgIDQwNjEsICA0MDYyLCAgNDA2MywgIDQwNjQsCisgICAgIDQwNjUsICA0MDY2LCAgNDA2NywgIDQwNjgsICA0MDY5LCAgNDA3MCwgIDQwNzEsICA4MTQ0LAorICAgICA4MTQ1LCAgODE0NiwgIDgxNDcsICA4MTQ4LCAgODE0OSwgIDgxNTAsICA4MTUxLCAgODE1MiwKKyAgICAgODE1MywgIDgxNTQsICA4MTU1LCAgODE1NiwgIDgxNTcsICA4MTU4LCAxNjMxOCwgMTYzMTksCisgICAgMTYzMjAsIDE2MzIxLCAxNjMyMiwgMTYzMjMsIDE2MzI0LCAxNjMyNSwgMTYzMjYsIDE2MzI3LAorICAgIDE2MzI4LCAxNjMyOSwgMTYzMzAsIDE2MzMxLCAxNjMzMiwgMTYzMzMsIDE2MzM0LCAxNjMzNSwKKyAgICAzMjY3MiwgMzI2NzMsIDMyNjc0LCAzMjY3NSwgMzI2NzYsIDMyNjc3LCAzMjY3OCwgMzI2NzksCisgICAgMzI2ODAsIDMyNjgxLCAzMjY4MiwgMzI2ODMsIDMyNjg0LCAzMjY4NSwgMzI2ODYsIDMyNjg3LAorICAgIDMyNjg4LCAzMjY4OSwgMzI2OTAsIDMyNjkxLCAzMjY5MiwgMzI2OTMsIDMyNjk0LCA2NTM5MCwKKyAgICA2NTM5MSwgNjUzOTIsIDY1MzkzLCA2NTM5NCwgNjUzOTUsIDY1Mzk2LCA2NTM5NywgNjUzOTgsCisgICAgNjUzOTksIDY1NDAwLCA2NTQwMSwgNjU0MDIsIDY1NDAzLCA2NTQwNCwgNjU0MDUsIDY1NDA2LAorICAgIDY1NDA3LCA2NTQwOCwgNjU0MDksIDY1NDEwLCA2NTQxMSwgNjU0MTIsIDY1NDEzLCA2NTQxNCwKKyAgICA2NTQxNSwgNjU0MTYsIDY1NDE3LCA2NTQxOCwgNjU0MTksIDY1NDIwLCA2NTQyMSwgNjU0MjIsCisgICAgNjU0MjMsIDY1NDI0LCA2NTQyNSwgNjU0MjYsIDY1NDI3LCA2NTQyOCwgNjU0MjksIDY1NDMwLAorICAgIDY1NDMxLCA2NTQzMiwgNjU0MzMsIDY1NDM0LCA2NTQzNSwgNjU0MzYsIDY1NDM3LCA2NTQzOCwKKyAgICA2NTQzOSwgNjU0NDAsIDY1NDQxLCA2NTQ0MiwgNjU0NDMsIDY1NDQ0LCA2NTQ0NSwgNjU0NDYsCisgICAgNjU0NDcsIDY1NDQ4LCA2NTQ0OSwgNjU0NTAsIDY1NDUxLCA2NTQ1MiwgNjU0NTMsIDY1NDU0LAorICAgIDY1NDU1LCA2NTQ1NiwgNjU0NTcsIDY1NDU4LCA2NTQ1OSwgNjU0NjAsIDY1NDYxLCA2NTQ2MiwKKyAgICA2NTQ2MywgNjU0NjQsIDY1NDY1LCA2NTQ2NiwgNjU0NjcsIDY1NDY4LCA2NTQ2OSwgNjU0NzAsCisgICAgNjU0NzEsIDY1NDcyLCA2NTQ3MywgNjU0NzQsIDY1NDc1LCA2NTQ3NiwgNjU0NzcsIDY1NDc4LAorICAgIDY1NDc5LCA2NTQ4MCwgNjU0ODEsIDY1NDgyLCA2NTQ4MywgNjU0ODQsIDY1NDg1LCA2NTQ4NiwKKyAgICA2NTQ4NywgNjU0ODgsIDY1NDg5LCA2NTQ5MCwgNjU0OTEsIDY1NDkyLCA2NTQ5MywgNjU0OTQsCisgICAgNjU0OTUsIDY1NDk2LCA2NTQ5NywgNjU0OTgsIDY1NDk5LCA2NTUwMCwgNjU1MDEsIDY1NTAyLAorICAgIDY1NTAzLCA2NTUwNCwgNjU1MDUsIDY1NTA2LCA2NTUwNywgNjU1MDgsIDY1NTA5LCA2NTUxMCwKKyAgICA2NTUxMSwgNjU1MTIsIDY1NTEzLCA2NTUxNCwgNjU1MTUsIDY1NTE2LCA2NTUxNywgNjU1MTgsCisgICAgNjU1MTksIDY1NTIwLCA2NTUyMSwgNjU1MjIsIDY1NTIzLCA2NTUyNCwgNjU1MjUsIDY1NTI2LAorICAgIDY1NTI3LCA2NTUyOCwgNjU1MjksIDY1NTMwLCA2NTUzMSwgNjU1MzIsIDY1NTMzLCA2NTUzNCwKKyAgICA2NTUzNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyNTJfYWNfYml0c1syNTddID0geworICAgICAyLCAgMiwgIDMsICA0LCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG54aGRfMTI1Ml9hY19sZXZlbFsyNTddID0geworICAgICAgMywgIDMsICA1LCAgNywgIDUsICAwLCAgOSwgMTEsIDEzLCAxNSwgIDcsIDE3LCAxOSwgMjEsIDIzLCAyNSwKKyAgICAgMjcsIDI5LCAgOSwgMTEsIDMxLCAzMywgMzUsIDM3LCAxMywgMzksIDQxLCA0MywgNDUsIDQ3LCA0OSwgMTUsCisgICAgIDE3LCA1MSwgNTMsIDU1LCA1NywgNTksIDYxLCA2MywgNjUsIDE5LCAyMSwgNjcsIDY5LCA3MSwgNzMsIDc1LAorICAgICA3NywgNzksIDgxLCA4MywgMjMsIDI1LCAyNywgODUsIDg3LCA4OSwgOTEsIDkzLCA5NSwgOTcsIDk5LDEwMSwKKyAgICAxMDMsMTA1LDEwNywgMjksIDMxLCAzMywxMDksMTExLDExMywxMTUsMTE3LDExOSwxMjEsMTIzLDEyNSwxMjcsCisgICAgMTI5LCAgMywgIDUsICA3LCAzNSwgMzcsIDM5LCA0MSwgIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLAorICAgICAyNSwgMjcsIDI5LCAzMSwgMzMsIDM1LCAzNywgMzksIDQxLCA0MywgNDMsIDQ1LCA0NywgNDksIDUxLCA0NSwKKyAgICAgNDcsIDQ5LCA1MSwgNTMsIDU1LCA1NywgNTksIDYxLCA2MywgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsCisgICAgIDc5LCA4MSwgODMsIDg1LCA4NywgODksIDkxLCA5MywgOTUsIDk3LCA5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LAorICAgIDExMSwxMTMsMTE1LDExNywxMTksMTIxLDEyMywxMjUsMTI3LDEyOSwgNTMsIDU1LCA1NywgNTksIDYxLCA2MywKKyAgICAgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MSwgODMsIDg1LCA4NywgODksIDkxLCA5MywgOTUsCisgICAgIDk3LCA5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMSwxMTMsMTE1LDExNywxMTksMTIxLDEyMywxMjUsMTI3LAorICAgIDEyOSwgIDMsICA1LCAgNywgIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LCAzMSwKKyAgICAgMzMsIDM1LCAzNywgMzksIDQxLCA0MywgNDUsIDQ3LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MSwgNjMsCisgICAgIDY1LCA2NywgNjksIDcxLCA3MywgNzUsIDc3LCA3OSwgODEsIDgzLCA4NSwgODcsIDg5LCA5MSwgOTMsIDk1LAorICAgICA5NywgOTksMTAxLDEwMywxMDUsMTA3LDEwOSwxMTEsMTEzLDExNSwxMTcsMTE5LDEyMSwxMjMsMTI1LDEyNywKKyAgICAxMjksCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjUyX2FjX2ZsYWdzWzI1N10gPSB7CisgICAgMCwgMiwgMCwgMCwgMiwgMCwgMCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAyLCAyLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAyLAorICAgIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDIsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMiwgMiwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAyLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLAorfTsKKworY29uc3QgQ0lERW50cnkgZmZfZG54aGRfY2lkX3RhYmxlW10gPSB7CisgICAgeyAxMjM1LCAxOTIwLCAxMDgwLCAwLCA5MTc1MDQsIDkxNzUwNCwgNiwgMTAsIDQsCisgICAgICBkbnhoZF8xMjM1X2x1bWFfd2VpZ2h0LCBkbnhoZF8xMjM1X2Nocm9tYV93ZWlnaHQsCisgICAgICBkbnhoZF8xMjM1XzEyNDFfZGNfY29kZXMsIGRueGhkXzEyMzVfMTI0MV9kY19iaXRzLAorICAgICAgZG54aGRfMTIzNV8xMjQxX2FjX2NvZGVzLCBkbnhoZF8xMjM1XzEyNDFfYWNfYml0cywgZG54aGRfMTIzNV8xMjQxX2FjX2xldmVsLAorICAgICAgZG54aGRfMTIzNV8xMjQxX2FjX2ZsYWdzLAorICAgICAgZG54aGRfMTIzNV8xMjM4XzEyNDFfcnVuX2NvZGVzLCBkbnhoZF8xMjM1XzEyMzhfMTI0MV9ydW5fYml0cywgZG54aGRfMTIzNV8xMjQxX3J1biwKKyAgICAgIHsgMTc1LCAxODUsIDM2NSwgNDQwIH0sCisgICAgICB7IHsgMjQwMDAsIDEwMDEgfSwgeyAyNSwgMSB9LCB7IDUwLCAxIH0sIHsgNjAwMDAsIDEwMDEgfSB9IH0sCisgICAgeyAxMjM3LCAxOTIwLCAxMDgwLCAwLCA2MDYyMDgsIDYwNjIwOCwgNCwgOCwgMywKKyAgICAgIGRueGhkXzEyMzdfbHVtYV93ZWlnaHQsIGRueGhkXzEyMzdfY2hyb21hX3dlaWdodCwKKyAgICAgIGRueGhkXzEyMzdfZGNfY29kZXMsIGRueGhkXzEyMzdfZGNfYml0cywKKyAgICAgIGRueGhkXzEyMzdfYWNfY29kZXMsIGRueGhkXzEyMzdfYWNfYml0cywgZG54aGRfMTIzN19hY19sZXZlbCwKKyAgICAgIGRueGhkXzEyMzdfYWNfZmxhZ3MsCisgICAgICBkbnhoZF8xMjM3X3J1bl9jb2RlcywgZG54aGRfMTIzN19ydW5fYml0cywgZG54aGRfMTIzN19ydW4sCisgICAgICB7IDExNSwgMTIwLCAxNDUsIDI0MCwgMjkwIH0sCisgICAgICB7IHsgMjQwMDAsIDEwMDEgfSwgeyAyNSwgMSB9LCB7IDMwMDAwLCAxMDAxIH0sIHsgNTAsIDEgfSwgeyA2MDAwMCwgMTAwMSB9IH0gfSwKKyAgICB7IDEyMzgsIDE5MjAsIDEwODAsIDAsIDkxNzUwNCwgOTE3NTA0LCA0LCA4LCA0LAorICAgICAgZG54aGRfMTIzOF9sdW1hX3dlaWdodCwgZG54aGRfMTIzOF9jaHJvbWFfd2VpZ2h0LAorICAgICAgZG54aGRfMTIzOF9kY19jb2RlcywgZG54aGRfMTIzOF9kY19iaXRzLAorICAgICAgZG54aGRfMTIzOF9hY19jb2RlcywgZG54aGRfMTIzOF9hY19iaXRzLCBkbnhoZF8xMjM4X2FjX2xldmVsLAorICAgICAgZG54aGRfMTIzOF9hY19mbGFncywKKyAgICAgIGRueGhkXzEyMzVfMTIzOF8xMjQxX3J1bl9jb2RlcywgZG54aGRfMTIzNV8xMjM4XzEyNDFfcnVuX2JpdHMsIGRueGhkXzEyMzhfcnVuLAorICAgICAgeyAxNzUsIDE4NSwgMjIwLCAzNjUsIDQ0MCB9LAorICAgICAgeyB7IDI0MDAwLCAxMDAxIH0sIHsgMjUsIDEgfSwgeyAzMDAwMCwgMTAwMSB9LCB7IDUwLCAxIH0sIHsgNjAwMDAsIDEwMDEgfSB9IH0sCisgICAgeyAxMjQxLCAxOTIwLCAxMDgwLCAxLCA5MTc1MDQsIDQ1ODc1MiwgNiwgMTAsIDQsCisgICAgICBkbnhoZF8xMjQxX2x1bWFfd2VpZ2h0LCBkbnhoZF8xMjQxX2Nocm9tYV93ZWlnaHQsCisgICAgICBkbnhoZF8xMjM1XzEyNDFfZGNfY29kZXMsIGRueGhkXzEyMzVfMTI0MV9kY19iaXRzLAorICAgICAgZG54aGRfMTIzNV8xMjQxX2FjX2NvZGVzLCBkbnhoZF8xMjM1XzEyNDFfYWNfYml0cywgZG54aGRfMTIzNV8xMjQxX2FjX2xldmVsLAorICAgICAgZG54aGRfMTIzNV8xMjQxX2FjX2ZsYWdzLAorICAgICAgZG54aGRfMTIzNV8xMjM4XzEyNDFfcnVuX2NvZGVzLCBkbnhoZF8xMjM1XzEyMzhfMTI0MV9ydW5fYml0cywgZG54aGRfMTIzNV8xMjQxX3J1biwKKyAgICAgIHsgMTg1LCAyMjAgfSwKKyAgICAgIHsgeyAyNSwgMSB9LCB7IDMwMDAwLCAxMDAxIH0gfSB9LAorICAgIHsgMTI0MiwgMTkyMCwgMTA4MCwgMSwgNjA2MjA4LCAzMDMxMDQsIDQsIDgsIDMsCisgICAgICBkbnhoZF8xMjQyX2x1bWFfd2VpZ2h0LCBkbnhoZF8xMjQyX2Nocm9tYV93ZWlnaHQsCisgICAgICBkbnhoZF8xMjM3X2RjX2NvZGVzLCBkbnhoZF8xMjM3X2RjX2JpdHMsCisgICAgICBkbnhoZF8xMjM3X2FjX2NvZGVzLCBkbnhoZF8xMjM3X2FjX2JpdHMsIGRueGhkXzEyMzdfYWNfbGV2ZWwsCisgICAgICBkbnhoZF8xMjM3X2FjX2ZsYWdzLAorICAgICAgZG54aGRfMTIzN19ydW5fY29kZXMsIGRueGhkXzEyMzdfcnVuX2JpdHMsIGRueGhkXzEyMzdfcnVuLAorICAgICAgeyAxMjAsIDE0NSB9LAorICAgICAgeyB7IDI1LCAxIH0sIHsgMzAwMDAsIDEwMDEgfSB9IH0sCisgICAgeyAxMjQzLCAxOTIwLCAxMDgwLCAxLCA5MTc1MDQsIDQ1ODc1MiwgNCwgOCwgNCwKKyAgICAgIGRueGhkXzEyNDNfbHVtYV93ZWlnaHQsIGRueGhkXzEyNDNfY2hyb21hX3dlaWdodCwKKyAgICAgIGRueGhkXzEyMzhfZGNfY29kZXMsIGRueGhkXzEyMzhfZGNfYml0cywKKyAgICAgIGRueGhkXzEyMzhfYWNfY29kZXMsIGRueGhkXzEyMzhfYWNfYml0cywgZG54aGRfMTIzOF9hY19sZXZlbCwKKyAgICAgIGRueGhkXzEyMzhfYWNfZmxhZ3MsCisgICAgICBkbnhoZF8xMjM1XzEyMzhfMTI0MV9ydW5fY29kZXMsIGRueGhkXzEyMzVfMTIzOF8xMjQxX3J1bl9iaXRzLCBkbnhoZF8xMjM4X3J1biwKKyAgICAgIHsgMTg1LCAyMjAgfSwKKyAgICAgIHsgeyAyNSwgMSB9LCB7IDMwMDAwLCAxMDAxIH0gfSB9LAorICAgIHsgMTI1MCwgMTI4MCwgIDcyMCwgMCwgNDU4NzUyLCA0NTg3NTIsIDYsIDEwLCA0LAorICAgICAgZG54aGRfMTI1MF9sdW1hX3dlaWdodCwgZG54aGRfMTI1MF9jaHJvbWFfd2VpZ2h0LAorICAgICAgZG54aGRfMTI1MF9kY19jb2RlcywgZG54aGRfMTI1MF9kY19iaXRzLAorICAgICAgZG54aGRfMTI1MF9hY19jb2RlcywgZG54aGRfMTI1MF9hY19iaXRzLCBkbnhoZF8xMjUwX2FjX2xldmVsLAorICAgICAgZG54aGRfMTI1MF9hY19mbGFncywKKyAgICAgIGRueGhkXzEyNTBfcnVuX2NvZGVzLCBkbnhoZF8xMjUwX3J1bl9iaXRzLCBkbnhoZF8xMjUwX3J1biwKKyAgICAgIHsgOTAsIDkwLCAxODAsIDIyMCB9LAorICAgICAgeyB7IDI0MDAwLCAxMDAxIH0sIHsgMjUsIDEgfSwgeyA1MCwgMSB9LCB7IDYwMDAwLCAxMDAxIH0gfSB9LAorICAgIHsgMTI1MSwgMTI4MCwgIDcyMCwgMCwgNDU4NzUyLCA0NTg3NTIsIDQsIDgsIDQsCisgICAgICBkbnhoZF8xMjUxX2x1bWFfd2VpZ2h0LCBkbnhoZF8xMjUxX2Nocm9tYV93ZWlnaHQsCisgICAgICBkbnhoZF8xMjUxX2RjX2NvZGVzLCBkbnhoZF8xMjUxX2RjX2JpdHMsCisgICAgICBkbnhoZF8xMjUxX2FjX2NvZGVzLCBkbnhoZF8xMjUxX2FjX2JpdHMsIGRueGhkXzEyNTFfYWNfbGV2ZWwsCisgICAgICBkbnhoZF8xMjUxX2FjX2ZsYWdzLAorICAgICAgZG54aGRfMTI1MV9ydW5fY29kZXMsIGRueGhkXzEyNTFfcnVuX2JpdHMsIGRueGhkXzEyNTFfcnVuLAorICAgICAgeyA5MCwgOTAsIDExMCwgMTgwLCAyMjAgfSwKKyAgICAgIHsgeyAyNDAwMCwgMTAwMSB9LCB7IDI1LCAxIH0sIHsgMzAwMDAsIDEwMDEgfSwgeyA1MCwgMSB9LCB7IDYwMDAwLCAxMDAxIH0gfSB9LAorICAgIHsgMTI1MiwgMTI4MCwgIDcyMCwgMCwgMzAzMTA0LCAzMDMxMDQsIDQsIDgsIDUsCisgICAgICBkbnhoZF8xMjUyX2x1bWFfd2VpZ2h0LCBkbnhoZF8xMjUyX2Nocm9tYV93ZWlnaHQsCisgICAgICBkbnhoZF8xMjUyX2RjX2NvZGVzLCBkbnhoZF8xMjUyX2RjX2JpdHMsCisgICAgICBkbnhoZF8xMjUyX2FjX2NvZGVzLCBkbnhoZF8xMjUyX2FjX2JpdHMsIGRueGhkXzEyNTJfYWNfbGV2ZWwsCisgICAgICBkbnhoZF8xMjUyX2FjX2ZsYWdzLAorICAgICAgZG54aGRfMTI1MV9ydW5fY29kZXMsIGRueGhkXzEyNTFfcnVuX2JpdHMsIGRueGhkXzEyNTFfcnVuLAorICAgICAgeyA2MCwgNjAsIDc1LCAxMjAsIDE0NSB9LAorICAgICAgeyB7IDI0MDAwLCAxMDAxIH0sIHsgMjUsIDEgfSwgeyAzMDAwMCwgMTAwMSB9LCB7IDUwLCAxIH0sIHsgNjAwMDAsIDEwMDEgfSB9IH0sCisgICAgeyAxMjUzLCAxOTIwLCAxMDgwLCAwLCAxODg0MTYsIDE4ODQxNiwgNCwgOCwgMywKKyAgICAgIGRueGhkXzEyMzdfbHVtYV93ZWlnaHQsIGRueGhkXzEyMzdfY2hyb21hX3dlaWdodCwKKyAgICAgIGRueGhkXzEyMzdfZGNfY29kZXMsIGRueGhkXzEyMzdfZGNfYml0cywKKyAgICAgIGRueGhkXzEyMzdfYWNfY29kZXMsIGRueGhkXzEyMzdfYWNfYml0cywgZG54aGRfMTIzN19hY19sZXZlbCwKKyAgICAgIGRueGhkXzEyMzdfYWNfZmxhZ3MsCisgICAgICBkbnhoZF8xMjM3X3J1bl9jb2RlcywgZG54aGRfMTIzN19ydW5fYml0cywgZG54aGRfMTIzN19ydW4sCisgICAgICB7IDM2LCAzNiwgNDUsIDc1LCA5MCB9LAorICAgICAgeyB7IDI0MDAwLCAxMDAxIH0sIHsgMjUsIDEgfSwgeyAzMDAwMCwgMTAwMSB9LCB7IDUwLCAxIH0sIHsgNjAwMDAsIDEwMDEgfSB9IH0sCisgICAgeyAxMjU2LCAxOTIwLCAxMDgwLCAwLCAxODM1MDA4LCAxODM1MDA4LCA2LCAxMCwgNCwKKyAgICAgIGRueGhkXzEyMzVfbHVtYV93ZWlnaHQsIGRueGhkXzEyNTZfY2hyb21hX3dlaWdodCwKKyAgICAgIGRueGhkXzEyMzVfMTI0MV9kY19jb2RlcywgZG54aGRfMTIzNV8xMjQxX2RjX2JpdHMsCisgICAgICBkbnhoZF8xMjM1XzEyNDFfYWNfY29kZXMsIGRueGhkXzEyMzVfMTI0MV9hY19iaXRzLCBkbnhoZF8xMjM1XzEyNDFfYWNfbGV2ZWwsCisgICAgICBkbnhoZF8xMjM1XzEyNDFfYWNfZmxhZ3MsCisgICAgICBkbnhoZF8xMjM1XzEyMzhfMTI0MV9ydW5fY29kZXMsIGRueGhkXzEyMzVfMTIzOF8xMjQxX3J1bl9iaXRzLCBkbnhoZF8xMjM1XzEyNDFfcnVuLAorICAgICAgeyAzNTAsIDM5MCwgNDQwLCA3MzAsIDg4MCB9LAorICAgICAgeyB7IDI0MDAwLCAxMDAxIH0sIHsgMjUsIDEgfSwgeyAzMDAwMCwgMTAwMSB9LCB7IDUwLCAxIH0sIHsgNjAwMDAsIDEwMDEgfSB9IH0sCit9OworCitpbnQgZmZfZG54aGRfZ2V0X2NpZF90YWJsZShpbnQgY2lkKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhmZl9kbnhoZF9jaWRfdGFibGUpOyBpKyspCisgICAgICAgIGlmIChmZl9kbnhoZF9jaWRfdGFibGVbaV0uY2lkID09IGNpZCkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgIHJldHVybiAtMTsKK30KKworaW50IGF2cHJpdl9kbnhoZF9nZXRfZnJhbWVfc2l6ZShpbnQgY2lkKQoreworICAgIGludCBpID0gZmZfZG54aGRfZ2V0X2NpZF90YWJsZShjaWQpOworICAgIGlmIChpPDApCisgICAgICAgIHJldHVybiBpOworICAgIHJldHVybiBmZl9kbnhoZF9jaWRfdGFibGVbaV0uZnJhbWVfc2l6ZTsKK30KKworaW50IGZmX2RueGhkX2ZpbmRfY2lkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGJpdF9kZXB0aCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgbWJzID0gYXZjdHgtPmJpdF9yYXRlIC8gMTAwMDAwMDsKKyAgICBpZiAoIW1icykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGZmX2RueGhkX2NpZF90YWJsZSk7IGkrKykgeworICAgICAgICBjb25zdCBDSURFbnRyeSAqY2lkID0gJmZmX2RueGhkX2NpZF90YWJsZVtpXTsKKyAgICAgICAgaWYgKGNpZC0+d2lkdGggPT0gYXZjdHgtPndpZHRoICYmIGNpZC0+aGVpZ2h0ID09IGF2Y3R4LT5oZWlnaHQgJiYKKyAgICAgICAgICAgIGNpZC0+aW50ZXJsYWNlZCA9PSAhIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0lOVEVSTEFDRURfRENUKSAmJgorICAgICAgICAgICAgY2lkLT5iaXRfZGVwdGggPT0gYml0X2RlcHRoKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgRkZfQVJSQVlfRUxFTVMoY2lkLT5iaXRfcmF0ZXMpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2lkLT5iaXRfcmF0ZXNbal0gPT0gbWJzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2lkLT5jaWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfZG54aGRfcHJpbnRfcHJvZmlsZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgbG9nbGV2ZWwpCit7CisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGZmX2RueGhkX2NpZF90YWJsZSk7IGkrKykgeworICAgICAgICBjb25zdCBDSURFbnRyeSAqY2lkID0gJmZmX2RueGhkX2NpZF90YWJsZVtpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IEZGX0FSUkFZX0VMRU1TKGNpZC0+Yml0X3JhdGVzKTsgaisrKSB7CisgICAgICAgICAgICBpZiAoIWNpZC0+Yml0X3JhdGVzW2pdKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIGxvZ2xldmVsLCAiRnJhbWUgc2l6ZTogJWR4JWQlYzsgYml0cmF0ZTogJWRNYnBzOyBwaXhlbCBmb3JtYXQ6ICVzOyBmcmFtZXJhdGU6ICVkLyVkXG4iLAorICAgICAgICAgICAgICAgICAgIGNpZC0+d2lkdGgsIGNpZC0+aGVpZ2h0LCBjaWQtPmludGVybGFjZWQgPyAnaScgOiAncCcsIGNpZC0+Yml0X3JhdGVzW2pdLAorICAgICAgICAgICAgICAgICAgIGNpZC0+Yml0X2RlcHRoID09IDEwID8gInl1djQyMnAxMCIgOiAieXV2NDIycCIsIGNpZC0+ZnJhbWVfcmF0ZXNbal0ubnVtLCBjaWQtPmZyYW1lX3JhdGVzW2pdLmRlbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kbnhoZGRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2RueGhkZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NjI5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kbnhoZGRhdGEuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogVkMzL0ROeEhEIGRlY29kZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgU21hcnRKb2cgUy5BLiwgQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZSBkb3QgY291ZHVyaWVyIGF0IHNtYXJ0am9nIGRvdCBjb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19ETlhIRERBVEFfSAorI2RlZmluZSBBVkNPREVDX0ROWEhEREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IENJREVudHJ5IHsKKyAgICBpbnQgY2lkOworICAgIHVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBpbnRlcmxhY2VkOworICAgIHVuc2lnbmVkIGludCBmcmFtZV9zaXplOworICAgIHVuc2lnbmVkIGludCBjb2RpbmdfdW5pdF9zaXplOworICAgIGludCBpbmRleF9iaXRzOworICAgIGludCBiaXRfZGVwdGg7CisgICAgaW50IGVvYl9pbmRleDsKKyAgICBjb25zdCB1aW50OF90ICpsdW1hX3dlaWdodCwgKmNocm9tYV93ZWlnaHQ7CisgICAgY29uc3QgdWludDhfdCAqZGNfY29kZXMsICpkY19iaXRzOworICAgIGNvbnN0IHVpbnQxNl90ICphY19jb2RlczsKKyAgICBjb25zdCB1aW50OF90ICphY19iaXRzLCAqYWNfbGV2ZWw7CisgICAgY29uc3QgdWludDhfdCAqYWNfZmxhZ3M7CisgICAgY29uc3QgdWludDE2X3QgKnJ1bl9jb2RlczsKKyAgICBjb25zdCB1aW50OF90ICpydW5fYml0cywgKnJ1bjsKKyAgICBpbnQgYml0X3JhdGVzWzVdOyAvLy88IEhlbHBlciB0byBjaG9vc2UgdmFyaWFudHMsIHJvdW5kZWQgdG8gbmVhcmVzdCA1TWIvcworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZXNbNV07Cit9IENJREVudHJ5OworCitleHRlcm4gY29uc3QgQ0lERW50cnkgZmZfZG54aGRfY2lkX3RhYmxlW107CisKK2ludCBmZl9kbnhoZF9nZXRfY2lkX3RhYmxlKGludCBjaWQpOworaW50IGZmX2RueGhkX2ZpbmRfY2lkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGJpdF9kZXB0aCk7Cit2b2lkIGZmX2RueGhkX3ByaW50X3Byb2ZpbGVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGxvZ2xldmVsKTsKKworaW50IGF2cHJpdl9kbnhoZF9nZXRfZnJhbWVfc2l6ZShpbnQgY2lkKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfRE5YSEREQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RueGhkZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kbnhoZGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ODAwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kbnhoZGRlYy5jCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogVkMzL0ROeEhEIGRlY29kZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgU21hcnRKb2cgUy5BLiwgQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZSBkb3QgY291ZHVyaWVyIGF0IHNtYXJ0am9nIGRvdCBjb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTWlycmlBZCBMdGQKKyAqCisgKiAxMCBiaXQgc3VwcG9ydCBhZGRlZCBieSBNaXJyaUFkIEx0ZCwgSm9zZXBoIEFydHNpbW92aWNoIDxqb3NlcGhAbWlycmlhZC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImRueGhkZGF0YS5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCit0eXBlZGVmIHN0cnVjdCBETlhIRENvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIEJsb2NrRFNQQ29udGV4dCBiZHNwOworICAgIGludDY0X3QgY2lkOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY29tcHJlc3Npb24gaWQKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKKyAgICB1bnNpZ25lZCBpbnQgbWJfd2lkdGgsIG1iX2hlaWdodDsKKyAgICB1aW50MzJfdCBtYl9zY2FuX2luZGV4WzY4XTsgICAgICAgICAvKiBtYXggZm9yIDEwODBwICovCisgICAgaW50IGN1cl9maWVsZDsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGludGVybGFjZWQgZmllbGQKKyAgICBWTEMgYWNfdmxjLCBkY192bGMsIHJ1bl92bGM7CisgICAgaW50IGxhc3RfZGNbM107CisgICAgSURDVERTUENvbnRleHQgaWRzcDsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrcylbMTJdWzY0XTsKKyAgICBTY2FuVGFibGUgc2NhbnRhYmxlOworICAgIGNvbnN0IENJREVudHJ5ICpjaWRfdGFibGU7CisgICAgaW50IGJpdF9kZXB0aDsgLy8gOCwgMTAgb3IgMCBpZiBub3QgaW5pdGlhbGl6ZWQgYXQgYWxsLgorICAgIGludCBpc180NDQ7CisgICAgdm9pZCAoKmRlY29kZV9kY3RfYmxvY2spKHN0cnVjdCBETlhIRENvbnRleHQgKmN0eCwgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgcXNjYWxlKTsKKyAgICBpbnQgbGFzdF9xc2NhbGU7CisgICAgaW50IGx1bWFfc2NhbGVbNjRdOworICAgIGludCBjaHJvbWFfc2NhbGVbNjRdOworfSBETlhIRENvbnRleHQ7CisKKyNkZWZpbmUgRE5YSERfVkxDX0JJVFMgOQorI2RlZmluZSBETlhIRF9EQ19WTENfQklUUyA3CisKK3N0YXRpYyB2b2lkIGRueGhkX2RlY29kZV9kY3RfYmxvY2tfOChETlhIRENvbnRleHQgKmN0eCwgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCBxc2NhbGUpOworc3RhdGljIHZvaWQgZG54aGRfZGVjb2RlX2RjdF9ibG9ja18xMChETlhIRENvbnRleHQgKmN0eCwgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgcXNjYWxlKTsKK3N0YXRpYyB2b2lkIGRueGhkX2RlY29kZV9kY3RfYmxvY2tfMTBfNDQ0KEROWEhEQ29udGV4dCAqY3R4LCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgcXNjYWxlKTsKKworc3RhdGljIGF2X2NvbGQgaW50IGRueGhkX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBETlhIRENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBjdHgtPmF2Y3R4ID0gYXZjdHg7CisgICAgY3R4LT5jaWQgPSAtMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbnhoZF9pbml0X3ZsYyhETlhIRENvbnRleHQgKmN0eCwgdWludDMyX3QgY2lkKQoreworICAgIGlmIChjaWQgIT0gY3R4LT5jaWQpIHsKKyAgICAgICAgaW50IGluZGV4OworCisgICAgICAgIGlmICgoaW5kZXggPSBmZl9kbnhoZF9nZXRfY2lkX3RhYmxlKGNpZCkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGNpZCAlZFxuIiwgY2lkKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZmX2RueGhkX2NpZF90YWJsZVtpbmRleF0uYml0X2RlcHRoICE9IGN0eC0+Yml0X2RlcHRoKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYml0IGRlcHRoIG1pc21hdGNoZXMgJWQgJWRcbiIsIGZmX2RueGhkX2NpZF90YWJsZVtpbmRleF0uYml0X2RlcHRoLCBjdHgtPmJpdF9kZXB0aCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBjdHgtPmNpZF90YWJsZSA9ICZmZl9kbnhoZF9jaWRfdGFibGVbaW5kZXhdOworCisgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPmFjX3ZsYyk7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPmRjX3ZsYyk7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPnJ1bl92bGMpOworCisgICAgICAgIGluaXRfdmxjKCZjdHgtPmFjX3ZsYywgRE5YSERfVkxDX0JJVFMsIDI1NywKKyAgICAgICAgICAgICAgICAgY3R4LT5jaWRfdGFibGUtPmFjX2JpdHMsIDEsIDEsCisgICAgICAgICAgICAgICAgIGN0eC0+Y2lkX3RhYmxlLT5hY19jb2RlcywgMiwgMiwgMCk7CisgICAgICAgIGluaXRfdmxjKCZjdHgtPmRjX3ZsYywgRE5YSERfRENfVkxDX0JJVFMsIGN0eC0+Yml0X2RlcHRoICsgNCwKKyAgICAgICAgICAgICAgICAgY3R4LT5jaWRfdGFibGUtPmRjX2JpdHMsIDEsIDEsCisgICAgICAgICAgICAgICAgIGN0eC0+Y2lkX3RhYmxlLT5kY19jb2RlcywgMSwgMSwgMCk7CisgICAgICAgIGluaXRfdmxjKCZjdHgtPnJ1bl92bGMsIEROWEhEX1ZMQ19CSVRTLCA2MiwKKyAgICAgICAgICAgICAgICAgY3R4LT5jaWRfdGFibGUtPnJ1bl9iaXRzLCAxLCAxLAorICAgICAgICAgICAgICAgICBjdHgtPmNpZF90YWJsZS0+cnVuX2NvZGVzLCAyLCAyLCAwKTsKKworICAgICAgICBmZl9pbml0X3NjYW50YWJsZShjdHgtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJmN0eC0+c2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZl96aWd6YWdfZGlyZWN0KTsKKyAgICAgICAgY3R4LT5jaWQgPSBjaWQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRueGhkX2RlY29kZV9oZWFkZXIoRE5YSERDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdF9maWVsZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBoZWFkZXJfcHJlZml4W10gICAgPSB7IDB4MDAsIDB4MDAsIDB4MDIsIDB4ODAsIDB4MDEgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBoZWFkZXJfcHJlZml4NDQ0W10gPSB7IDB4MDAsIDB4MDAsIDB4MDIsIDB4ODAsIDB4MDIgfTsKKyAgICBpbnQgaSwgY2lkLCByZXQ7CisKKyAgICBpZiAoYnVmX3NpemUgPCAweDI4MCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAobWVtY21wKGJ1ZiwgaGVhZGVyX3ByZWZpeCwgNSkgJiYgbWVtY21wKGJ1ZiwgaGVhZGVyX3ByZWZpeDQ0NCwgNSkpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGluIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoYnVmWzVdICYgMikgeyAvKiBpbnRlcmxhY2VkICovCisgICAgICAgIGN0eC0+Y3VyX2ZpZWxkID0gYnVmWzVdICYgMTsKKyAgICAgICAgZnJhbWUtPmludGVybGFjZWRfZnJhbWUgPSAxOworICAgICAgICBmcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ICA9IGZpcnN0X2ZpZWxkIF4gY3R4LT5jdXJfZmllbGQ7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiaW50ZXJsYWNlZCAlZCwgY3VyIGZpZWxkICVkXG4iLCBidWZbNV0gJiAzLCBjdHgtPmN1cl9maWVsZCk7CisgICAgfQorCisgICAgY3R4LT5oZWlnaHQgPSBBVl9SQjE2KGJ1ZiArIDB4MTgpOworICAgIGN0eC0+d2lkdGggID0gQVZfUkIxNihidWYgKyAweDFhKTsKKworICAgIGF2X2Rsb2coY3R4LT5hdmN0eCwgIndpZHRoICVkLCBoZWlnaHQgJWRcbiIsIGN0eC0+d2lkdGgsIGN0eC0+aGVpZ2h0KTsKKworICAgIGN0eC0+aXNfNDQ0ID0gMDsKKyAgICBpZiAoYnVmWzB4NF0gPT0gMHgyKSB7CisgICAgICAgIGN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDEwOworICAgICAgICBjdHgtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTA7CisgICAgICAgIGlmIChjdHgtPmJpdF9kZXB0aCAhPSAxMCkgeworICAgICAgICAgICAgZmZfYmxvY2tkc3BfaW5pdCgmY3R4LT5iZHNwLCBjdHgtPmF2Y3R4KTsKKyAgICAgICAgICAgIGZmX2lkY3Rkc3BfaW5pdCgmY3R4LT5pZHNwLCBjdHgtPmF2Y3R4KTsKKyAgICAgICAgICAgIGN0eC0+Yml0X2RlcHRoID0gMTA7CisgICAgICAgICAgICBjdHgtPmRlY29kZV9kY3RfYmxvY2sgPSBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrXzEwXzQ0NDsKKyAgICAgICAgfQorICAgICAgICBjdHgtPmlzXzQ0NCA9IDE7CisgICAgfSBlbHNlIGlmIChidWZbMHgyMV0gJiAweDQwKSB7CisgICAgICAgIGN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDEwOworICAgICAgICBjdHgtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTA7CisgICAgICAgIGlmIChjdHgtPmJpdF9kZXB0aCAhPSAxMCkgeworICAgICAgICAgICAgZmZfYmxvY2tkc3BfaW5pdCgmY3R4LT5iZHNwLCBjdHgtPmF2Y3R4KTsKKyAgICAgICAgICAgIGZmX2lkY3Rkc3BfaW5pdCgmY3R4LT5pZHNwLCBjdHgtPmF2Y3R4KTsKKyAgICAgICAgICAgIGN0eC0+Yml0X2RlcHRoID0gMTA7CisgICAgICAgICAgICBjdHgtPmRlY29kZV9kY3RfYmxvY2sgPSBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrXzEwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICBjdHgtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gODsKKyAgICAgICAgaWYgKGN0eC0+Yml0X2RlcHRoICE9IDgpIHsKKyAgICAgICAgICAgIGZmX2Jsb2NrZHNwX2luaXQoJmN0eC0+YmRzcCwgY3R4LT5hdmN0eCk7CisgICAgICAgICAgICBmZl9pZGN0ZHNwX2luaXQoJmN0eC0+aWRzcCwgY3R4LT5hdmN0eCk7CisgICAgICAgICAgICBjdHgtPmJpdF9kZXB0aCA9IDg7CisgICAgICAgICAgICBjdHgtPmRlY29kZV9kY3RfYmxvY2sgPSBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrXzg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjaWQgPSBBVl9SQjMyKGJ1ZiArIDB4MjgpOworICAgIGF2X2Rsb2coY3R4LT5hdmN0eCwgImNvbXByZXNzaW9uIGlkICVkXG4iLCBjaWQpOworCisgICAgaWYgKChyZXQgPSBkbnhoZF9pbml0X3ZsYyhjdHgsIGNpZCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChidWZfc2l6ZSA8IGN0eC0+Y2lkX3RhYmxlLT5jb2RpbmdfdW5pdF9zaXplKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbmNvcnJlY3QgZnJhbWUgc2l6ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGN0eC0+bWJfd2lkdGggID0gY3R4LT53aWR0aCA+PiA0OworICAgIGN0eC0+bWJfaGVpZ2h0ID0gYnVmWzB4MTZkXTsKKworICAgIGF2X2Rsb2coY3R4LT5hdmN0eCwKKyAgICAgICAgICAgICJtYiB3aWR0aCAlZCwgbWIgaGVpZ2h0ICVkXG4iLCBjdHgtPm1iX3dpZHRoLCBjdHgtPm1iX2hlaWdodCk7CisKKyAgICBpZiAoKGN0eC0+aGVpZ2h0ICsgMTUpID4+IDQgPT0gY3R4LT5tYl9oZWlnaHQgJiYgZnJhbWUtPmludGVybGFjZWRfZnJhbWUpCisgICAgICAgIGN0eC0+aGVpZ2h0IDw8PSAxOworCisgICAgaWYgKGN0eC0+bWJfaGVpZ2h0ID4gNjggfHwKKyAgICAgICAgKGN0eC0+bWJfaGVpZ2h0IDw8IGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lKSA+IChjdHgtPmhlaWdodCArIDE1KSA+PiA0KSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAibWIgaGVpZ2h0IHRvbyBiaWc6ICVkXG4iLCBjdHgtPm1iX2hlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm1iX2hlaWdodDsgaSsrKSB7CisgICAgICAgIGN0eC0+bWJfc2Nhbl9pbmRleFtpXSA9IEFWX1JCMzIoYnVmICsgMHgxNzAgKyAoaSA8PCAyKSk7CisgICAgICAgIGF2X2Rsb2coY3R4LT5hdmN0eCwgIm1iIHNjYW4gaW5kZXggJWRcbiIsIGN0eC0+bWJfc2Nhbl9pbmRleFtpXSk7CisgICAgICAgIGlmIChidWZfc2l6ZSA8IGN0eC0+bWJfc2Nhbl9pbmRleFtpXSArIDB4MjgwTEwpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG1iIHNjYW4gaW5kZXhcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrKEROWEhEQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbF9iaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbF9zaGlmdCkKK3sKKyAgICBpbnQgaSwgaiwgaW5kZXgxLCBpbmRleDIsIGxlbiwgZmxhZ3M7CisgICAgaW50IGxldmVsLCBjb21wb25lbnQsIHNpZ247CisgICAgY29uc3QgaW50ICpzY2FsZTsKKyAgICBjb25zdCB1aW50OF90ICp3ZWlnaHRfbWF0cml4OworICAgIGNvbnN0IHVpbnQ4X3QgKmFjX2xldmVsID0gY3R4LT5jaWRfdGFibGUtPmFjX2xldmVsOworICAgIGNvbnN0IHVpbnQ4X3QgKmFjX2ZsYWdzID0gY3R4LT5jaWRfdGFibGUtPmFjX2ZsYWdzOworICAgIGNvbnN0IGludCBlb2JfaW5kZXggICAgID0gY3R4LT5jaWRfdGFibGUtPmVvYl9pbmRleDsKKyAgICBPUEVOX1JFQURFUihicywgJmN0eC0+Z2IpOworCisgICAgaWYgKCFjdHgtPmlzXzQ0NCkgeworICAgICAgICBpZiAobiAmIDIpIHsKKyAgICAgICAgICAgIGNvbXBvbmVudCAgICAgPSAxICsgKG4gJiAxKTsKKyAgICAgICAgICAgIHNjYWxlID0gY3R4LT5jaHJvbWFfc2NhbGU7CisgICAgICAgICAgICB3ZWlnaHRfbWF0cml4ID0gY3R4LT5jaWRfdGFibGUtPmNocm9tYV93ZWlnaHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21wb25lbnQgICAgID0gMDsKKyAgICAgICAgICAgIHNjYWxlID0gY3R4LT5sdW1hX3NjYWxlOworICAgICAgICAgICAgd2VpZ2h0X21hdHJpeCA9IGN0eC0+Y2lkX3RhYmxlLT5sdW1hX3dlaWdodDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbXBvbmVudCA9IChuID4+IDEpICUgMzsKKyAgICAgICAgaWYgKGNvbXBvbmVudCkgeworICAgICAgICAgICAgc2NhbGUgPSBjdHgtPmNocm9tYV9zY2FsZTsKKyAgICAgICAgICAgIHdlaWdodF9tYXRyaXggPSBjdHgtPmNpZF90YWJsZS0+Y2hyb21hX3dlaWdodDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNjYWxlID0gY3R4LT5sdW1hX3NjYWxlOworICAgICAgICAgICAgd2VpZ2h0X21hdHJpeCA9IGN0eC0+Y2lkX3RhYmxlLT5sdW1hX3dlaWdodDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFVQREFURV9DQUNIRShicywgJmN0eC0+Z2IpOworICAgIEdFVF9WTEMobGVuLCBicywgJmN0eC0+Z2IsIGN0eC0+ZGNfdmxjLnRhYmxlLCBETlhIRF9EQ19WTENfQklUUywgMSk7CisgICAgaWYgKGxlbikgeworICAgICAgICBsZXZlbCA9IEdFVF9DQUNIRShicywgJmN0eC0+Z2IpOworICAgICAgICBMQVNUX1NLSVBfQklUUyhicywgJmN0eC0+Z2IsIGxlbik7CisgICAgICAgIHNpZ24gID0gfmxldmVsID4+IDMxOworICAgICAgICBsZXZlbCA9IChORUdfVVNSMzIoc2lnbiBeIGxldmVsLCBsZW4pIF4gc2lnbikgLSBzaWduOworICAgICAgICBjdHgtPmxhc3RfZGNbY29tcG9uZW50XSArPSBsZXZlbDsKKyAgICB9CisgICAgYmxvY2tbMF0gPSBjdHgtPmxhc3RfZGNbY29tcG9uZW50XTsKKworICAgIGkgPSAwOworCisgICAgVVBEQVRFX0NBQ0hFKGJzLCAmY3R4LT5nYik7CisgICAgR0VUX1ZMQyhpbmRleDEsIGJzLCAmY3R4LT5nYiwgY3R4LT5hY192bGMudGFibGUsCisgICAgICAgICAgICBETlhIRF9WTENfQklUUywgMik7CisKKyAgICB3aGlsZSAoaW5kZXgxICE9IGVvYl9pbmRleCkgeworICAgICAgICBsZXZlbCA9IGFjX2xldmVsW2luZGV4MV07CisgICAgICAgIGZsYWdzID0gYWNfZmxhZ3NbaW5kZXgxXTsKKworICAgICAgICBzaWduID0gU0hPV19TQklUUyhicywgJmN0eC0+Z2IsIDEpOworICAgICAgICBTS0lQX0JJVFMoYnMsICZjdHgtPmdiLCAxKTsKKworICAgICAgICBpZiAoZmxhZ3MgJiAxKSB7CisgICAgICAgICAgICBsZXZlbCArPSBTSE9XX1VCSVRTKGJzLCAmY3R4LT5nYiwgaW5kZXhfYml0cykgPDwgNzsKKyAgICAgICAgICAgIFNLSVBfQklUUyhicywgJmN0eC0+Z2IsIGluZGV4X2JpdHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYgMikgeworICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKGJzLCAmY3R4LT5nYik7CisgICAgICAgICAgICBHRVRfVkxDKGluZGV4MiwgYnMsICZjdHgtPmdiLCBjdHgtPnJ1bl92bGMudGFibGUsCisgICAgICAgICAgICAgICAgICAgIEROWEhEX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgIGkgKz0gY3R4LT5jaWRfdGFibGUtPnJ1bltpbmRleDJdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCsraSA+IDYzKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYWMgdGV4IGRhbWFnZWQgJWQsICVkXG4iLCBuLCBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaiAgICAgPSBjdHgtPnNjYW50YWJsZS5wZXJtdXRhdGVkW2ldOworICAgICAgICBsZXZlbCAqPSBzY2FsZVtpXTsKKyAgICAgICAgaWYgKGxldmVsX2JpYXMgPCAzMiB8fCB3ZWlnaHRfbWF0cml4W2ldICE9IGxldmVsX2JpYXMpCisgICAgICAgICAgICBsZXZlbCArPSBsZXZlbF9iaWFzOworICAgICAgICBsZXZlbCA+Pj0gbGV2ZWxfc2hpZnQ7CisKKyAgICAgICAgYmxvY2tbal0gPSAobGV2ZWwgXiBzaWduKSAtIHNpZ247CisKKyAgICAgICAgVVBEQVRFX0NBQ0hFKGJzLCAmY3R4LT5nYik7CisgICAgICAgIEdFVF9WTEMoaW5kZXgxLCBicywgJmN0eC0+Z2IsIGN0eC0+YWNfdmxjLnRhYmxlLAorICAgICAgICAgICAgICAgIEROWEhEX1ZMQ19CSVRTLCAyKTsKKyAgICB9CisKKyAgICBDTE9TRV9SRUFERVIoYnMsICZjdHgtPmdiKTsKK30KKworc3RhdGljIHZvaWQgZG54aGRfZGVjb2RlX2RjdF9ibG9ja184KEROWEhEQ29udGV4dCAqY3R4LCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IHFzY2FsZSkKK3sKKyAgICBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrKGN0eCwgYmxvY2ssIG4sIHFzY2FsZSwgNCwgMzIsIDYpOworfQorCitzdGF0aWMgdm9pZCBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrXzEwKEROWEhEQ29udGV4dCAqY3R4LCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCBxc2NhbGUpCit7CisgICAgZG54aGRfZGVjb2RlX2RjdF9ibG9jayhjdHgsIGJsb2NrLCBuLCBxc2NhbGUsIDYsIDgsIDQpOworfQorCitzdGF0aWMgdm9pZCBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrXzEwXzQ0NChETlhIRENvbnRleHQgKmN0eCwgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IHFzY2FsZSkKK3sKKyAgICBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrKGN0eCwgYmxvY2ssIG4sIHFzY2FsZSwgNiwgMzIsIDYpOworfQorCitzdGF0aWMgaW50IGRueGhkX2RlY29kZV9tYWNyb2Jsb2NrKEROWEhEQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KQoreworICAgIGludCBzaGlmdDEgPSBjdHgtPmJpdF9kZXB0aCA9PSAxMDsKKyAgICBpbnQgZGN0X2xpbmVzaXplX2x1bWEgICA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICBpbnQgZGN0X2xpbmVzaXplX2Nocm9tYSA9IGZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICB1aW50OF90ICpkZXN0X3ksICpkZXN0X3UsICpkZXN0X3Y7CisgICAgaW50IGRjdF95X29mZnNldCwgZGN0X3hfb2Zmc2V0OworICAgIGludCBxc2NhbGUsIGk7CisKKyAgICBxc2NhbGUgPSBnZXRfYml0cygmY3R4LT5nYiwgMTEpOworICAgIHNraXBfYml0czEoJmN0eC0+Z2IpOworCisgICAgaWYgKHFzY2FsZSAhPSBjdHgtPmxhc3RfcXNjYWxlKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICBjdHgtPmx1bWFfc2NhbGVbaV0gICA9IHFzY2FsZSAqIGN0eC0+Y2lkX3RhYmxlLT5sdW1hX3dlaWdodFtpXTsKKyAgICAgICAgICAgIGN0eC0+Y2hyb21hX3NjYWxlW2ldID0gcXNjYWxlICogY3R4LT5jaWRfdGFibGUtPmNocm9tYV93ZWlnaHRbaV07CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5sYXN0X3FzY2FsZSA9IHFzY2FsZTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGN0eC0+YmRzcC5jbGVhcl9ibG9jayhjdHgtPmJsb2Nrc1tpXSk7CisgICAgICAgIGN0eC0+ZGVjb2RlX2RjdF9ibG9jayhjdHgsIGN0eC0+YmxvY2tzW2ldLCBpLCBxc2NhbGUpOworICAgIH0KKyAgICBpZiAoY3R4LT5pc180NDQpIHsKKyAgICAgICAgZm9yICg7IGkgPCAxMjsgaSsrKSB7CisgICAgICAgICAgICBjdHgtPmJkc3AuY2xlYXJfYmxvY2soY3R4LT5ibG9ja3NbaV0pOworICAgICAgICAgICAgY3R4LT5kZWNvZGVfZGN0X2Jsb2NrKGN0eCwgY3R4LT5ibG9ja3NbaV0sIGksIHFzY2FsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWUtPmludGVybGFjZWRfZnJhbWUpIHsKKyAgICAgICAgZGN0X2xpbmVzaXplX2x1bWEgICA8PD0gMTsKKyAgICAgICAgZGN0X2xpbmVzaXplX2Nocm9tYSA8PD0gMTsKKyAgICB9CisKKyAgICBkZXN0X3kgPSBmcmFtZS0+ZGF0YVswXSArICgoeSAqIGRjdF9saW5lc2l6ZV9sdW1hKSAgIDw8IDQpICsgKHggPDwgKDQgKyBzaGlmdDEpKTsKKyAgICBkZXN0X3UgPSBmcmFtZS0+ZGF0YVsxXSArICgoeSAqIGRjdF9saW5lc2l6ZV9jaHJvbWEpIDw8IDQpICsgKHggPDwgKDMgKyBzaGlmdDEgKyBjdHgtPmlzXzQ0NCkpOworICAgIGRlc3RfdiA9IGZyYW1lLT5kYXRhWzJdICsgKCh5ICogZGN0X2xpbmVzaXplX2Nocm9tYSkgPDwgNCkgKyAoeCA8PCAoMyArIHNoaWZ0MSArIGN0eC0+aXNfNDQ0KSk7CisKKyAgICBpZiAoY3R4LT5jdXJfZmllbGQpIHsKKyAgICAgICAgZGVzdF95ICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgZGVzdF91ICs9IGZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgZGVzdF92ICs9IGZyYW1lLT5saW5lc2l6ZVsyXTsKKyAgICB9CisKKyAgICBkY3RfeV9vZmZzZXQgPSBkY3RfbGluZXNpemVfbHVtYSA8PCAzOworICAgIGRjdF94X29mZnNldCA9IDggPDwgc2hpZnQxOworICAgIGlmICghY3R4LT5pc180NDQpIHsKKyAgICAgICAgY3R4LT5pZHNwLmlkY3RfcHV0KGRlc3RfeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGN0X2xpbmVzaXplX2x1bWEsIGN0eC0+YmxvY2tzWzBdKTsKKyAgICAgICAgY3R4LT5pZHNwLmlkY3RfcHV0KGRlc3RfeSArIGRjdF94X29mZnNldCwgICAgICAgICAgICAgICAgZGN0X2xpbmVzaXplX2x1bWEsIGN0eC0+YmxvY2tzWzFdKTsKKyAgICAgICAgY3R4LT5pZHNwLmlkY3RfcHV0KGRlc3RfeSArIGRjdF95X29mZnNldCwgICAgICAgICAgICAgICAgZGN0X2xpbmVzaXplX2x1bWEsIGN0eC0+YmxvY2tzWzRdKTsKKyAgICAgICAgY3R4LT5pZHNwLmlkY3RfcHV0KGRlc3RfeSArIGRjdF95X29mZnNldCArIGRjdF94X29mZnNldCwgZGN0X2xpbmVzaXplX2x1bWEsIGN0eC0+YmxvY2tzWzVdKTsKKworICAgICAgICBpZiAoIShjdHgtPmF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgICAgIGRjdF95X29mZnNldCA9IGRjdF9saW5lc2l6ZV9jaHJvbWEgPDwgMzsKKyAgICAgICAgICAgIGN0eC0+aWRzcC5pZGN0X3B1dChkZXN0X3UsICAgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZV9jaHJvbWEsIGN0eC0+YmxvY2tzWzJdKTsKKyAgICAgICAgICAgIGN0eC0+aWRzcC5pZGN0X3B1dChkZXN0X3YsICAgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZV9jaHJvbWEsIGN0eC0+YmxvY2tzWzNdKTsKKyAgICAgICAgICAgIGN0eC0+aWRzcC5pZGN0X3B1dChkZXN0X3UgKyBkY3RfeV9vZmZzZXQsIGRjdF9saW5lc2l6ZV9jaHJvbWEsIGN0eC0+YmxvY2tzWzZdKTsKKyAgICAgICAgICAgIGN0eC0+aWRzcC5pZGN0X3B1dChkZXN0X3YgKyBkY3RfeV9vZmZzZXQsIGRjdF9saW5lc2l6ZV9jaHJvbWEsIGN0eC0+YmxvY2tzWzddKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+aWRzcC5pZGN0X3B1dChkZXN0X3ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZV9sdW1hLCBjdHgtPmJsb2Nrc1swXSk7CisgICAgICAgIGN0eC0+aWRzcC5pZGN0X3B1dChkZXN0X3kgKyBkY3RfeF9vZmZzZXQsICAgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZV9sdW1hLCBjdHgtPmJsb2Nrc1sxXSk7CisgICAgICAgIGN0eC0+aWRzcC5pZGN0X3B1dChkZXN0X3kgKyBkY3RfeV9vZmZzZXQsICAgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZV9sdW1hLCBjdHgtPmJsb2Nrc1s2XSk7CisgICAgICAgIGN0eC0+aWRzcC5pZGN0X3B1dChkZXN0X3kgKyBkY3RfeV9vZmZzZXQgKyBkY3RfeF9vZmZzZXQsIGRjdF9saW5lc2l6ZV9sdW1hLCBjdHgtPmJsb2Nrc1s3XSk7CisKKyAgICAgICAgaWYgKCEoY3R4LT5hdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgICAgICBkY3RfeV9vZmZzZXQgPSBkY3RfbGluZXNpemVfY2hyb21hIDw8IDM7CisgICAgICAgICAgICBjdHgtPmlkc3AuaWRjdF9wdXQoZGVzdF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY3RfbGluZXNpemVfY2hyb21hLCBjdHgtPmJsb2Nrc1syXSk7CisgICAgICAgICAgICBjdHgtPmlkc3AuaWRjdF9wdXQoZGVzdF91ICsgZGN0X3hfb2Zmc2V0LCAgICAgICAgICAgICAgICBkY3RfbGluZXNpemVfY2hyb21hLCBjdHgtPmJsb2Nrc1szXSk7CisgICAgICAgICAgICBjdHgtPmlkc3AuaWRjdF9wdXQoZGVzdF91ICsgZGN0X3lfb2Zmc2V0LCAgICAgICAgICAgICAgICBkY3RfbGluZXNpemVfY2hyb21hLCBjdHgtPmJsb2Nrc1s4XSk7CisgICAgICAgICAgICBjdHgtPmlkc3AuaWRjdF9wdXQoZGVzdF91ICsgZGN0X3lfb2Zmc2V0ICsgZGN0X3hfb2Zmc2V0LCBkY3RfbGluZXNpemVfY2hyb21hLCBjdHgtPmJsb2Nrc1s5XSk7CisgICAgICAgICAgICBjdHgtPmlkc3AuaWRjdF9wdXQoZGVzdF92LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY3RfbGluZXNpemVfY2hyb21hLCBjdHgtPmJsb2Nrc1s0XSk7CisgICAgICAgICAgICBjdHgtPmlkc3AuaWRjdF9wdXQoZGVzdF92ICsgZGN0X3hfb2Zmc2V0LCAgICAgICAgICAgICAgICBkY3RfbGluZXNpemVfY2hyb21hLCBjdHgtPmJsb2Nrc1s1XSk7CisgICAgICAgICAgICBjdHgtPmlkc3AuaWRjdF9wdXQoZGVzdF92ICsgZGN0X3lfb2Zmc2V0LCAgICAgICAgICAgICAgICBkY3RfbGluZXNpemVfY2hyb21hLCBjdHgtPmJsb2Nrc1sxMF0pOworICAgICAgICAgICAgY3R4LT5pZHNwLmlkY3RfcHV0KGRlc3RfdiArIGRjdF95X29mZnNldCArIGRjdF94X29mZnNldCwgZGN0X2xpbmVzaXplX2Nocm9tYSwgY3R4LT5ibG9ja3NbMTFdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRueGhkX2RlY29kZV9tYWNyb2Jsb2NrcyhETlhIRENvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgY3R4LT5tYl9oZWlnaHQ7IHkrKykgeworICAgICAgICBjdHgtPmxhc3RfZGNbMF0gPQorICAgICAgICBjdHgtPmxhc3RfZGNbMV0gPQorICAgICAgICBjdHgtPmxhc3RfZGNbMl0gPSAxIDw8IChjdHgtPmJpdF9kZXB0aCArIDIpOyAvLyBmb3IgbGV2ZWxzICsyXihiaXRkZXB0aC0xKQorICAgICAgICBpbml0X2dldF9iaXRzKCZjdHgtPmdiLCBidWYgKyBjdHgtPm1iX3NjYW5faW5kZXhbeV0sIChidWZfc2l6ZSAtIGN0eC0+bWJfc2Nhbl9pbmRleFt5XSkgPDwgMyk7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBjdHgtPm1iX3dpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIC8vU1RBUlRfVElNRVI7CisgICAgICAgICAgICBkbnhoZF9kZWNvZGVfbWFjcm9ibG9jayhjdHgsIGZyYW1lLCB4LCB5KTsKKyAgICAgICAgICAgIC8vU1RPUF9USU1FUigiZGVjb2RlIG1hY3JvYmxvY2siKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbnhoZF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBETlhIRENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVGhyZWFkRnJhbWUgZnJhbWUgPSB7IC5mID0gZGF0YSB9OworICAgIEFWRnJhbWUgKnBpY3R1cmUgPSBkYXRhOworICAgIGludCBmaXJzdF9maWVsZCA9IDE7CisgICAgaW50IHJldDsKKworICAgIGF2X2Rsb2coYXZjdHgsICJmcmFtZSBzaXplICVkXG4iLCBidWZfc2l6ZSk7CisKK2RlY29kZV9jb2RpbmdfdW5pdDoKKyAgICBpZiAoKHJldCA9IGRueGhkX2RlY29kZV9oZWFkZXIoY3R4LCBwaWN0dXJlLCBidWYsIGJ1Zl9zaXplLCBmaXJzdF9maWVsZCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgoYXZjdHgtPndpZHRoIHx8IGF2Y3R4LT5oZWlnaHQpICYmCisgICAgICAgIChjdHgtPndpZHRoICE9IGF2Y3R4LT53aWR0aCB8fCBjdHgtPmhlaWdodCAhPSBhdmN0eC0+aGVpZ2h0KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZnJhbWUgc2l6ZSBjaGFuZ2VkOiAlZHglZCAtPiAlZHglZFxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgY3R4LT53aWR0aCwgY3R4LT5oZWlnaHQpOworICAgICAgICBmaXJzdF9maWVsZCA9IDE7CisgICAgfQorICAgIGlmIChhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX05PTkUgJiYgYXZjdHgtPnBpeF9mbXQgIT0gY3R4LT5waXhfZm10KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJwaXhfZm10IGNoYW5nZWQ6ICVzIC0+ICVzXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShhdmN0eC0+cGl4X2ZtdCksIGF2X2dldF9waXhfZm10X25hbWUoY3R4LT5waXhfZm10KSk7CisgICAgICAgIGZpcnN0X2ZpZWxkID0gMTsKKyAgICB9CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IGN0eC0+cGl4X2ZtdDsKKyAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgY3R4LT53aWR0aCwgY3R4LT5oZWlnaHQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGZpcnN0X2ZpZWxkKSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHBpY3R1cmUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBwaWN0dXJlLT5rZXlfZnJhbWUgPSAxOworICAgIH0KKworICAgIGRueGhkX2RlY29kZV9tYWNyb2Jsb2NrcyhjdHgsIHBpY3R1cmUsIGJ1ZiArIDB4MjgwLCBidWZfc2l6ZSAtIDB4MjgwKTsKKworICAgIGlmIChmaXJzdF9maWVsZCAmJiBwaWN0dXJlLT5pbnRlcmxhY2VkX2ZyYW1lKSB7CisgICAgICAgIGJ1ZiAgICAgICs9IGN0eC0+Y2lkX3RhYmxlLT5jb2RpbmdfdW5pdF9zaXplOworICAgICAgICBidWZfc2l6ZSAtPSBjdHgtPmNpZF90YWJsZS0+Y29kaW5nX3VuaXRfc2l6ZTsKKyAgICAgICAgZmlyc3RfZmllbGQgPSAwOworICAgICAgICBnb3RvIGRlY29kZV9jb2RpbmdfdW5pdDsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkbnhoZF9kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEROWEhEQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGZmX2ZyZWVfdmxjKCZjdHgtPmFjX3ZsYyk7CisgICAgZmZfZnJlZV92bGMoJmN0eC0+ZGNfdmxjKTsKKyAgICBmZl9mcmVlX3ZsYygmY3R4LT5ydW5fdmxjKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9kbnhoZF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJkbnhoZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZDMy9ETnhIRCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9ETlhIRCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRE5YSERDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkbnhoZF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkbnhoZF9kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gZG54aGRfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kbnhoZGVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZG54aGRlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzEwNWExCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZG54aGRlbmMuYwpAQCAtMCwwICsxLDExNjAgQEAKKy8qCisgKiBWQzMvRE54SEQgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IEJhcHRpc3RlIENvdWR1cmllciA8YmFwdGlzdGUgZG90IGNvdWR1cmllciBhdCBzbWFydGpvZyBkb3QgY29tPgorICogQ29weXJpZ2h0IChjKSAyMDExIE1pcnJpQWQgTHRkCisgKgorICogVkMtMyBlbmNvZGVyIGZ1bmRlZCBieSB0aGUgQnJpdGlzaCBCcm9hZGNhc3RpbmcgQ29ycG9yYXRpb24KKyAqIDEwIGJpdCBzdXBwb3J0IGFkZGVkIGJ5IE1pcnJpQWQgTHRkLCBKb3NlcGggQXJ0c2ltb3ZpY2ggPGpvc2VwaEBtaXJyaWFkLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJsb2NrZHNwLmgiCisjaW5jbHVkZSAiZmRjdGRzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAicGl4YmxvY2tkc3AuaCIKKyNpbmNsdWRlICJkbnhoZGVuYy5oIgorCisKKy8vIFRoZSBsYXJnZXN0IHZhbHVlIHRoYXQgd2lsbCBub3QgbGVhZCB0byBvdmVyZmxvdyBmb3IgMTBiaXQgc2FtcGxlcy4KKyNkZWZpbmUgRE5YMTBCSVRfUU1BVF9TSElGVCAxOAorI2RlZmluZSBSQ19WQVJJQU5DRSAxIC8vIHVzZSB2YXJpYW5jZSBvciBzc2QgZm9yIGZhc3QgcmMKKyNkZWZpbmUgTEFNQkRBX0ZSQUNfQklUUyAxMAorCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAibml0cmlzX2NvbXBhdCIsICJlbmNvZGUgd2l0aCBBdmlkIE5pdHJpcyBjb21wYXRpYmlsaXR5IiwKKyAgICAgICAgb2Zmc2V0b2YoRE5YSERFbmNDb250ZXh0LCBuaXRyaXNfY29tcGF0KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGRueGhkX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImRueGhkIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyB2b2lkIGRueGhkXzhiaXRfZ2V0X3BpeGVsc184eDRfc3ltKGludDE2X3QgKmF2X3Jlc3RyaWN0IGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGJsb2NrWzBdID0gcGl4ZWxzWzBdOworICAgICAgICBibG9ja1sxXSA9IHBpeGVsc1sxXTsKKyAgICAgICAgYmxvY2tbMl0gPSBwaXhlbHNbMl07CisgICAgICAgIGJsb2NrWzNdID0gcGl4ZWxzWzNdOworICAgICAgICBibG9ja1s0XSA9IHBpeGVsc1s0XTsKKyAgICAgICAgYmxvY2tbNV0gPSBwaXhlbHNbNV07CisgICAgICAgIGJsb2NrWzZdID0gcGl4ZWxzWzZdOworICAgICAgICBibG9ja1s3XSA9IHBpeGVsc1s3XTsKKyAgICAgICAgcGl4ZWxzICArPSBsaW5lX3NpemU7CisgICAgICAgIGJsb2NrICAgKz0gODsKKyAgICB9CisgICAgbWVtY3B5KGJsb2NrLCAgICAgIGJsb2NrIC0gIDgsIHNpemVvZigqYmxvY2spICogOCk7CisgICAgbWVtY3B5KGJsb2NrICsgIDgsIGJsb2NrIC0gMTYsIHNpemVvZigqYmxvY2spICogOCk7CisgICAgbWVtY3B5KGJsb2NrICsgMTYsIGJsb2NrIC0gMjQsIHNpemVvZigqYmxvY2spICogOCk7CisgICAgbWVtY3B5KGJsb2NrICsgMjQsIGJsb2NrIC0gMzIsIHNpemVvZigqYmxvY2spICogOCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIGRueGhkXzEwYml0X2dldF9waXhlbHNfOHg0X3N5bShpbnQxNl90ICphdl9yZXN0cmljdCBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgdWludDE2X3QqIHBpeGVsczE2ID0gKGNvbnN0IHVpbnQxNl90KilwaXhlbHM7CisgICAgbGluZV9zaXplID4+PSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBibG9ja1swXSA9IHBpeGVsczE2WzBdOyBibG9ja1sxXSA9IHBpeGVsczE2WzFdOworICAgICAgICBibG9ja1syXSA9IHBpeGVsczE2WzJdOyBibG9ja1szXSA9IHBpeGVsczE2WzNdOworICAgICAgICBibG9ja1s0XSA9IHBpeGVsczE2WzRdOyBibG9ja1s1XSA9IHBpeGVsczE2WzVdOworICAgICAgICBibG9ja1s2XSA9IHBpeGVsczE2WzZdOyBibG9ja1s3XSA9IHBpeGVsczE2WzddOworICAgICAgICBwaXhlbHMxNiArPSBsaW5lX3NpemU7CisgICAgICAgIGJsb2NrICs9IDg7CisgICAgfQorICAgIG1lbWNweShibG9jaywgICAgICBibG9jayAtICA4LCBzaXplb2YoKmJsb2NrKSAqIDgpOworICAgIG1lbWNweShibG9jayArICA4LCBibG9jayAtIDE2LCBzaXplb2YoKmJsb2NrKSAqIDgpOworICAgIG1lbWNweShibG9jayArIDE2LCBibG9jayAtIDI0LCBzaXplb2YoKmJsb2NrKSAqIDgpOworICAgIG1lbWNweShibG9jayArIDI0LCBibG9jayAtIDMyLCBzaXplb2YoKmJsb2NrKSAqIDgpOworfQorCitzdGF0aWMgaW50IGRueGhkXzEwYml0X2RjdF9xdWFudGl6ZShNcGVnRW5jQ29udGV4dCAqY3R4LCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgcXNjYWxlLCBpbnQgKm92ZXJmbG93KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW50YWJsZT0gY3R4LT5pbnRyYV9zY2FudGFibGUuc2NhbnRhYmxlOworICAgIGNvbnN0IGludCAqcW1hdCA9IG48NCA/IGN0eC0+cV9pbnRyYV9tYXRyaXhbcXNjYWxlXSA6IGN0eC0+cV9jaHJvbWFfaW50cmFfbWF0cml4W3FzY2FsZV07CisgICAgaW50IGxhc3Rfbm9uX3plcm8gPSAwOworICAgIGludCBpOworCisgICAgY3R4LT5mZHNwLmZkY3QoYmxvY2spOworCisgICAgLy8gRGl2aWRlIGJ5IDQgd2l0aCByb3VuZGluZywgdG8gY29tcGVuc2F0ZSBzY2FsaW5nIG9mIERDVCBjb2VmZmljaWVudHMKKyAgICBibG9ja1swXSA9IChibG9ja1swXSArIDIpID4+IDI7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgNjQ7ICsraSkgeworICAgICAgICBpbnQgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgaW50IHNpZ24gPSBGRl9TSUdOQklUKGJsb2NrW2pdKTsKKyAgICAgICAgaW50IGxldmVsID0gKGJsb2NrW2pdIF4gc2lnbikgLSBzaWduOworICAgICAgICBsZXZlbCA9IGxldmVsICogcW1hdFtqXSA+PiBETlgxMEJJVF9RTUFUX1NISUZUOworICAgICAgICBibG9ja1tqXSA9IChsZXZlbCBeIHNpZ24pIC0gc2lnbjsKKyAgICAgICAgaWYgKGxldmVsKQorICAgICAgICAgICAgbGFzdF9ub25femVybyA9IGk7CisgICAgfQorCisgICAgcmV0dXJuIGxhc3Rfbm9uX3plcm87Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkbnhoZF9pbml0X3ZsYyhETlhIREVuY0NvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQgaSwgaiwgbGV2ZWwsIHJ1bjsKKyAgICBpbnQgbWF4X2xldmVsID0gMSA8PCAoY3R4LT5jaWRfdGFibGUtPmJpdF9kZXB0aCArIDIpOworCisgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oY3R4LT5tLmF2Y3R4LCBjdHgtPnZsY19jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICBtYXhfbGV2ZWwsIDQgKiBzaXplb2YoKmN0eC0+dmxjX2NvZGVzKSwgZmFpbCk7CisgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oY3R4LT5tLmF2Y3R4LCBjdHgtPnZsY19iaXRzLAorICAgICAgICAgICAgICAgICAgICAgIG1heF9sZXZlbCwgNCAqIHNpemVvZigqY3R4LT52bGNfYml0cyksIGZhaWwpOworICAgIEZGX0FMTE9DWl9PUl9HT1RPKGN0eC0+bS5hdmN0eCwgY3R4LT5ydW5fY29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgNjMgKiAyLCBmYWlsKTsKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhjdHgtPm0uYXZjdHgsIGN0eC0+cnVuX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgNjMsIGZhaWwpOworCisgICAgY3R4LT52bGNfY29kZXMgKz0gbWF4X2xldmVsICogMjsKKyAgICBjdHgtPnZsY19iaXRzICArPSBtYXhfbGV2ZWwgKiAyOworICAgIGZvciAobGV2ZWwgPSAtbWF4X2xldmVsOyBsZXZlbCA8IG1heF9sZXZlbDsgbGV2ZWwrKykgeworICAgICAgICBmb3IgKHJ1biA9IDA7IHJ1biA8IDI7IHJ1bisrKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAobGV2ZWwgPDwgMSkgfCBydW47CisgICAgICAgICAgICBpbnQgc2lnbiwgb2Zmc2V0ID0gMCwgYWxldmVsID0gbGV2ZWw7CisKKyAgICAgICAgICAgIE1BU0tfQUJTKHNpZ24sIGFsZXZlbCk7CisgICAgICAgICAgICBpZiAoYWxldmVsID4gNjQpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgID0gKGFsZXZlbCAtIDEpID4+IDY7CisgICAgICAgICAgICAgICAgYWxldmVsIC09IG9mZnNldCA8PCA2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NzsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+Y2lkX3RhYmxlLT5hY19sZXZlbFtqXSA+PiAxID09IGFsZXZlbCAmJgorICAgICAgICAgICAgICAgICAgICAoIW9mZnNldCB8fCAoY3R4LT5jaWRfdGFibGUtPmFjX2ZsYWdzW2pdICYgMSkgJiYgb2Zmc2V0KSAmJgorICAgICAgICAgICAgICAgICAgICAoIXJ1biAgICB8fCAoY3R4LT5jaWRfdGFibGUtPmFjX2ZsYWdzW2pdICYgMikgJiYgcnVuKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQxKCFjdHgtPnZsY19jb2Rlc1tpbmRleF0pOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZsY19jb2Rlc1tpbmRleF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdHgtPmNpZF90YWJsZS0+YWNfY29kZXNbal0gPDwgMSkgfCAoc2lnbiAmIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52bGNfYml0c1tpbmRleF0gPSBjdHgtPmNpZF90YWJsZS0+YWNfYml0c1tqXSArIDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZsY19jb2Rlc1tpbmRleF0gPSBjdHgtPmNpZF90YWJsZS0+YWNfY29kZXNbal07CisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZsY19iaXRzW2luZGV4XSAgPSBjdHgtPmNpZF90YWJsZS0+YWNfYml0c1tqXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9hc3NlcnQwKCFhbGV2ZWwgfHwgaiA8IDI1Nyk7CisgICAgICAgICAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgY3R4LT52bGNfY29kZXNbaW5kZXhdID0KKyAgICAgICAgICAgICAgICAgICAgKGN0eC0+dmxjX2NvZGVzW2luZGV4XSA8PCBjdHgtPmNpZF90YWJsZS0+aW5kZXhfYml0cykgfCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgY3R4LT52bGNfYml0c1tpbmRleF0gKz0gY3R4LT5jaWRfdGFibGUtPmluZGV4X2JpdHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDYyOyBpKyspIHsKKyAgICAgICAgaW50IHJ1biA9IGN0eC0+Y2lkX3RhYmxlLT5ydW5baV07CisgICAgICAgIGF2X2Fzc2VydDAocnVuIDwgNjMpOworICAgICAgICBjdHgtPnJ1bl9jb2Rlc1tydW5dID0gY3R4LT5jaWRfdGFibGUtPnJ1bl9jb2Rlc1tpXTsKKyAgICAgICAgY3R4LT5ydW5fYml0c1tydW5dICA9IGN0eC0+Y2lkX3RhYmxlLT5ydW5fYml0c1tpXTsKKyAgICB9CisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkbnhoZF9pbml0X3FtYXQoRE5YSERFbmNDb250ZXh0ICpjdHgsIGludCBsYmlhcywgaW50IGNiaWFzKQoreworICAgIC8vIGluaXQgZmlyc3QgZWxlbSB0byAxIHRvIGF2b2lkIGRpdiBieSAwIGluIGNvbnZlcnRfbWF0cml4CisgICAgdWludDE2X3Qgd2VpZ2h0X21hdHJpeFs2NF0gPSB7IDEsIH07IC8vIGNvbnZlcnRfbWF0cml4IG5lZWRzIHVpbnQxNl90KgorICAgIGludCBxc2NhbGUsIGk7CisgICAgY29uc3QgdWludDhfdCAqbHVtYV93ZWlnaHRfdGFibGUgICA9IGN0eC0+Y2lkX3RhYmxlLT5sdW1hX3dlaWdodDsKKyAgICBjb25zdCB1aW50OF90ICpjaHJvbWFfd2VpZ2h0X3RhYmxlID0gY3R4LT5jaWRfdGFibGUtPmNocm9tYV93ZWlnaHQ7CisKKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhjdHgtPm0uYXZjdHgsIGN0eC0+cW1hdHJpeF9sLAorICAgICAgICAgICAgICAgICAgICAgIChjdHgtPm0uYXZjdHgtPnFtYXggKyAxKSwgNjQgKiBzaXplb2YoaW50KSwgZmFpbCk7CisgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oY3R4LT5tLmF2Y3R4LCBjdHgtPnFtYXRyaXhfYywKKyAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5tLmF2Y3R4LT5xbWF4ICsgMSksIDY0ICogc2l6ZW9mKGludCksIGZhaWwpOworICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGN0eC0+bS5hdmN0eCwgY3R4LT5xbWF0cml4X2wxNiwKKyAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5tLmF2Y3R4LT5xbWF4ICsgMSksIDY0ICogMiAqIHNpemVvZih1aW50MTZfdCksCisgICAgICAgICAgICAgICAgICAgICAgZmFpbCk7CisgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oY3R4LT5tLmF2Y3R4LCBjdHgtPnFtYXRyaXhfYzE2LAorICAgICAgICAgICAgICAgICAgICAgIChjdHgtPm0uYXZjdHgtPnFtYXggKyAxKSwgNjQgKiAyICogc2l6ZW9mKHVpbnQxNl90KSwKKyAgICAgICAgICAgICAgICAgICAgICBmYWlsKTsKKworICAgIGlmIChjdHgtPmNpZF90YWJsZS0+Yml0X2RlcHRoID09IDgpIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIGludCBqID0gY3R4LT5tLmlkc3AuaWRjdF9wZXJtdXRhdGlvbltmZl96aWd6YWdfZGlyZWN0W2ldXTsKKyAgICAgICAgICAgIHdlaWdodF9tYXRyaXhbal0gPSBjdHgtPmNpZF90YWJsZS0+bHVtYV93ZWlnaHRbaV07CisgICAgICAgIH0KKyAgICAgICAgZmZfY29udmVydF9tYXRyaXgoJmN0eC0+bSwgY3R4LT5xbWF0cml4X2wsIGN0eC0+cW1hdHJpeF9sMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF9tYXRyaXgsIGN0eC0+bS5pbnRyYV9xdWFudF9iaWFzLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm0uYXZjdHgtPnFtYXgsIDEpOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgaW50IGogPSBjdHgtPm0uaWRzcC5pZGN0X3Blcm11dGF0aW9uW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworICAgICAgICAgICAgd2VpZ2h0X21hdHJpeFtqXSA9IGN0eC0+Y2lkX3RhYmxlLT5jaHJvbWFfd2VpZ2h0W2ldOworICAgICAgICB9CisgICAgICAgIGZmX2NvbnZlcnRfbWF0cml4KCZjdHgtPm0sIGN0eC0+cW1hdHJpeF9jLCBjdHgtPnFtYXRyaXhfYzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfbWF0cml4LCBjdHgtPm0uaW50cmFfcXVhbnRfYmlhcywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5tLmF2Y3R4LT5xbWF4LCAxKTsKKworICAgICAgICBmb3IgKHFzY2FsZSA9IDE7IHFzY2FsZSA8PSBjdHgtPm0uYXZjdHgtPnFtYXg7IHFzY2FsZSsrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgICAgIGN0eC0+cW1hdHJpeF9sW3FzY2FsZV1baV0gICAgICA8PD0gMjsKKyAgICAgICAgICAgICAgICBjdHgtPnFtYXRyaXhfY1txc2NhbGVdW2ldICAgICAgPDw9IDI7CisgICAgICAgICAgICAgICAgY3R4LT5xbWF0cml4X2wxNltxc2NhbGVdWzBdW2ldIDw8PSAyOworICAgICAgICAgICAgICAgIGN0eC0+cW1hdHJpeF9sMTZbcXNjYWxlXVsxXVtpXSA8PD0gMjsKKyAgICAgICAgICAgICAgICBjdHgtPnFtYXRyaXhfYzE2W3FzY2FsZV1bMF1baV0gPDw9IDI7CisgICAgICAgICAgICAgICAgY3R4LT5xbWF0cml4X2MxNltxc2NhbGVdWzFdW2ldIDw8PSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gMTAtYml0CisgICAgICAgIGZvciAocXNjYWxlID0gMTsgcXNjYWxlIDw9IGN0eC0+bS5hdmN0eC0+cW1heDsgcXNjYWxlKyspIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGogPSBjdHgtPm0uaWRzcC5pZGN0X3Blcm11dGF0aW9uW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworCisgICAgICAgICAgICAgICAgLyogVGhlIHF1YW50aXphdGlvbiBmb3JtdWxhIGZyb20gdGhlIFZDLTMgc3RhbmRhcmQgaXM6CisgICAgICAgICAgICAgICAgICogcXVhbnRpemVkID0gc2lnbihibG9ja1tpXSkgKiBmbG9vcihhYnMoYmxvY2tbaV0vcykgKiBwIC8KKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAocXNjYWxlICogd2VpZ2h0X3RhYmxlW2ldKSkKKyAgICAgICAgICAgICAgICAgKiBXaGVyZSBwIGlzIDMyIGZvciA4LWJpdCBzYW1wbGVzIGFuZCA4IGZvciAxMC1iaXQgb25lcy4KKyAgICAgICAgICAgICAgICAgKiBUaGUgcyBmYWN0b3IgY29tcGVuc2F0ZXMgc2NhbGluZyBvZiBEQ1QgY29lZmZpY2llbnRzIGRvbmUgYnkKKyAgICAgICAgICAgICAgICAgKiB0aGUgRENUIHJvdXRpbmVzLCBhbmQgdGhlcmVmb3JlIGlzIG5vdCBwcmVzZW50IGluIHN0YW5kYXJkLgorICAgICAgICAgICAgICAgICAqIEl0J3MgOCBmb3IgOC1iaXQgc2FtcGxlcyBhbmQgNCBmb3IgMTAtYml0IG9uZXMuCisgICAgICAgICAgICAgICAgICogV2Ugd2FudCB2YWx1ZXMgb2YgY3R4LT5xdG1hdHJpeF9sIGFuZCBjdHgtPnF0bWF0cml4X3IgdG8gYmU6CisgICAgICAgICAgICAgICAgICogICAgICgoMSA8PCBETlgxMEJJVF9RTUFUX1NISUZUKSAqIChwIC8gcykpIC8KKyAgICAgICAgICAgICAgICAgKiAgICAgKHFzY2FsZSAqIHdlaWdodF90YWJsZVtpXSkKKyAgICAgICAgICAgICAgICAgKiBGb3IgMTAtYml0IHNhbXBsZXMsIHAgLyBzID09IDIgKi8KKyAgICAgICAgICAgICAgICBjdHgtPnFtYXRyaXhfbFtxc2NhbGVdW2pdID0gKDEgPDwgKEROWDEwQklUX1FNQVRfU0hJRlQgKyAxKSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocXNjYWxlICogbHVtYV93ZWlnaHRfdGFibGVbaV0pOworICAgICAgICAgICAgICAgIGN0eC0+cW1hdHJpeF9jW3FzY2FsZV1bal0gPSAoMSA8PCAoRE5YMTBCSVRfUU1BVF9TSElGVCArIDEpKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxc2NhbGUgKiBjaHJvbWFfd2VpZ2h0X3RhYmxlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGN0eC0+bS5xX2Nocm9tYV9pbnRyYV9tYXRyaXgxNiA9IGN0eC0+cW1hdHJpeF9jMTY7CisgICAgY3R4LT5tLnFfY2hyb21hX2ludHJhX21hdHJpeCAgID0gY3R4LT5xbWF0cml4X2M7CisgICAgY3R4LT5tLnFfaW50cmFfbWF0cml4MTYgICAgICAgID0gY3R4LT5xbWF0cml4X2wxNjsKKyAgICBjdHgtPm0ucV9pbnRyYV9tYXRyaXggICAgICAgICAgPSBjdHgtPnFtYXRyaXhfbDsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZG54aGRfaW5pdF9yYyhETlhIREVuY0NvbnRleHQgKmN0eCkKK3sKKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhjdHgtPm0uYXZjdHgsIGN0eC0+bWJfcmMsIChjdHgtPm0uYXZjdHgtPnFtYXggKyAxKSwgODE2MCAqIHNpemVvZihSQ0VudHJ5KSwgZmFpbCk7CisgICAgaWYgKGN0eC0+bS5hdmN0eC0+bWJfZGVjaXNpb24gIT0gRkZfTUJfREVDSVNJT05fUkQpCisgICAgICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGN0eC0+bS5hdmN0eCwgY3R4LT5tYl9jbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bS5tYl9udW0sIHNpemVvZihSQ0NNUEVudHJ5KSwgZmFpbCk7CisKKyAgICBjdHgtPmZyYW1lX2JpdHMgPSAoY3R4LT5jaWRfdGFibGUtPmNvZGluZ191bml0X3NpemUgLQorICAgICAgICAgICAgICAgICAgICAgICA2NDAgLSA0IC0gY3R4LT5taW5fcGFkZGluZykgKiA4OworICAgIGN0eC0+cXNjYWxlID0gMTsKKyAgICBjdHgtPmxhbWJkYSA9IDIgPDwgTEFNQkRBX0ZSQUNfQklUUzsgLy8gcXNjYWxlIDIKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRueGhkX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBETlhIREVuY0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIGluZGV4LCBiaXRfZGVwdGgsIHJldDsKKworICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKKyAgICAgICAgYml0X2RlcHRoID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDoKKyAgICAgICAgYml0X2RlcHRoID0gMTA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInBpeGVsIGZvcm1hdCBpcyBpbmNvbXBhdGlibGUgd2l0aCBETnhIRFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgY3R4LT5jaWQgPSBmZl9kbnhoZF9maW5kX2NpZChhdmN0eCwgYml0X2RlcHRoKTsKKyAgICBpZiAoIWN0eC0+Y2lkKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInZpZGVvIHBhcmFtZXRlcnMgaW5jb21wYXRpYmxlIHdpdGggRE54SEQuIFZhbGlkIEROeEhEIHByb2ZpbGVzOlxuIik7CisgICAgICAgIGZmX2RueGhkX3ByaW50X3Byb2ZpbGVzKGF2Y3R4LCBBVl9MT0dfRVJST1IpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImNpZCAlZFxuIiwgY3R4LT5jaWQpOworCisgICAgaW5kZXggPSBmZl9kbnhoZF9nZXRfY2lkX3RhYmxlKGN0eC0+Y2lkKTsKKyAgICBhdl9hc3NlcnQwKGluZGV4ID49IDApOworCisgICAgY3R4LT5jaWRfdGFibGUgPSAmZmZfZG54aGRfY2lkX3RhYmxlW2luZGV4XTsKKworICAgIGN0eC0+bS5hdmN0eCAgICA9IGF2Y3R4OworICAgIGN0eC0+bS5tYl9pbnRyYSA9IDE7CisgICAgY3R4LT5tLmgyNjNfYWljID0gMTsKKworICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gY3R4LT5jaWRfdGFibGUtPmJpdF9kZXB0aDsKKworICAgIGZmX2Jsb2NrZHNwX2luaXQoJmN0eC0+YmRzcCwgYXZjdHgpOworICAgIGZmX2ZkY3Rkc3BfaW5pdCgmY3R4LT5tLmZkc3AsIGF2Y3R4KTsKKyAgICBmZl9tcHZfaWRjdF9pbml0KCZjdHgtPm0pOworICAgIGZmX21wZWd2aWRlb2VuY2RzcF9pbml0KCZjdHgtPm0ubXB2ZW5jZHNwLCBhdmN0eCk7CisgICAgZmZfcGl4YmxvY2tkc3BfaW5pdCgmY3R4LT5tLnBkc3AsIGF2Y3R4KTsKKyAgICBmZl9kY3RfZW5jb2RlX2luaXQoJmN0eC0+bSk7CisKKyAgICBpZiAoIWN0eC0+bS5kY3RfcXVhbnRpemUpCisgICAgICAgIGN0eC0+bS5kY3RfcXVhbnRpemUgPSBmZl9kY3RfcXVhbnRpemVfYzsKKworICAgIGlmIChjdHgtPmNpZF90YWJsZS0+Yml0X2RlcHRoID09IDEwKSB7CisgICAgICAgIGN0eC0+bS5kY3RfcXVhbnRpemUgICAgID0gZG54aGRfMTBiaXRfZGN0X3F1YW50aXplOworICAgICAgICBjdHgtPmdldF9waXhlbHNfOHg0X3N5bSA9IGRueGhkXzEwYml0X2dldF9waXhlbHNfOHg0X3N5bTsKKyAgICAgICAgY3R4LT5ibG9ja193aWR0aF9sMiAgICAgPSA0OworICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+Z2V0X3BpeGVsc184eDRfc3ltID0gZG54aGRfOGJpdF9nZXRfcGl4ZWxzXzh4NF9zeW07CisgICAgICAgIGN0eC0+YmxvY2tfd2lkdGhfbDIgICAgID0gMzsKKyAgICB9CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2RueGhkZW5jX2luaXRfeDg2KGN0eCk7CisKKyAgICBjdHgtPm0ubWJfaGVpZ2h0ID0gKGF2Y3R4LT5oZWlnaHQgKyAxNSkgLyAxNjsKKyAgICBjdHgtPm0ubWJfd2lkdGggID0gKGF2Y3R4LT53aWR0aCAgKyAxNSkgLyAxNjsKKworICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0lOVEVSTEFDRURfRENUKSB7CisgICAgICAgIGN0eC0+aW50ZXJsYWNlZCAgID0gMTsKKyAgICAgICAgY3R4LT5tLm1iX2hlaWdodCAvPSAyOworICAgIH0KKworICAgIGN0eC0+bS5tYl9udW0gPSBjdHgtPm0ubWJfaGVpZ2h0ICogY3R4LT5tLm1iX3dpZHRoOworCisgICAgaWYgKGF2Y3R4LT5pbnRyYV9xdWFudF9iaWFzICE9IEZGX0RFRkFVTFRfUVVBTlRfQklBUykKKyAgICAgICAgY3R4LT5tLmludHJhX3F1YW50X2JpYXMgPSBhdmN0eC0+aW50cmFfcXVhbnRfYmlhczsKKyAgICAvLyBYWFggdHVuZSBsYmlhcy9jYmlhcworICAgIGlmICgocmV0ID0gZG54aGRfaW5pdF9xbWF0KGN0eCwgY3R4LT5tLmludHJhX3F1YW50X2JpYXMsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBBdmlkIE5pdHJpcyBoYXJkd2FyZSBkZWNvZGVyIHJlcXVpcmVzIGEgbWluaW11bSBhbW91bnQgb2YgcGFkZGluZworICAgICAqIGluIHRoZSBjb2RpbmcgdW5pdCBwYXlsb2FkICovCisgICAgaWYgKGN0eC0+bml0cmlzX2NvbXBhdCkKKyAgICAgICAgY3R4LT5taW5fcGFkZGluZyA9IDE2MDA7CisKKyAgICBpZiAoKHJldCA9IGRueGhkX2luaXRfdmxjKGN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoKHJldCA9IGRueGhkX2luaXRfcmMoY3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgRkZfQUxMT0NaX09SX0dPVE8oY3R4LT5tLmF2Y3R4LCBjdHgtPnNsaWNlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgY3R4LT5tLm1iX2hlaWdodCAqIHNpemVvZih1aW50MzJfdCksIGZhaWwpOworICAgIEZGX0FMTE9DWl9PUl9HT1RPKGN0eC0+bS5hdmN0eCwgY3R4LT5zbGljZV9vZmZzLAorICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bS5tYl9oZWlnaHQgKiBzaXplb2YodWludDMyX3QpLCBmYWlsKTsKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhjdHgtPm0uYXZjdHgsIGN0eC0+bWJfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICBjdHgtPm0ubWJfbnVtICogc2l6ZW9mKHVpbnQxNl90KSwgZmFpbCk7CisgICAgRkZfQUxMT0NaX09SX0dPVE8oY3R4LT5tLmF2Y3R4LCBjdHgtPm1iX3FzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICBjdHgtPm0ubWJfbnVtICogc2l6ZW9mKHVpbnQ4X3QpLCBmYWlsKTsKKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIGlmIChhdmN0eC0+dGhyZWFkX2NvdW50ID4gTUFYX1RIUkVBRFMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ0b28gbWFueSB0aHJlYWRzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPnFtYXggPD0gMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInFtYXggbXVzdCBiZSBhdCBsZWFzdCAyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBjdHgtPnRocmVhZFswXSA9IGN0eDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXZjdHgtPnRocmVhZF9jb3VudDsgaSsrKSB7CisgICAgICAgIGN0eC0+dGhyZWFkW2ldID0gYXZfbWFsbG9jKHNpemVvZihETlhIREVuY0NvbnRleHQpKTsKKyAgICAgICAgbWVtY3B5KGN0eC0+dGhyZWFkW2ldLCBjdHgsIHNpemVvZihETlhIREVuY0NvbnRleHQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6ICAvLyBmb3IgRkZfQUxMT0NaX09SX0dPVE8KKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCitzdGF0aWMgaW50IGRueGhkX3dyaXRlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ4X3QgKmJ1ZikKK3sKKyAgICBETlhIREVuY0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaGVhZGVyX3ByZWZpeFs1XSA9IHsgMHgwMCwgMHgwMCwgMHgwMiwgMHg4MCwgMHgwMSB9OworCisgICAgbWVtc2V0KGJ1ZiwgMCwgNjQwKTsKKworICAgIG1lbWNweShidWYsIGhlYWRlcl9wcmVmaXgsIDUpOworICAgIGJ1Zls1XSA9IGN0eC0+aW50ZXJsYWNlZCA/IGN0eC0+Y3VyX2ZpZWxkICsgMiA6IDB4MDE7CisgICAgYnVmWzZdID0gMHg4MDsgLy8gY3JjIGZsYWcgb2ZmCisgICAgYnVmWzddID0gMHhhMDsgLy8gcmVzZXJ2ZWQKKyAgICBBVl9XQjE2KGJ1ZiArIDB4MTgsIGF2Y3R4LT5oZWlnaHQgPj4gY3R4LT5pbnRlcmxhY2VkKTsgLy8gQUxQRgorICAgIEFWX1dCMTYoYnVmICsgMHgxYSwgYXZjdHgtPndpZHRoKTsgIC8vIFNQTAorICAgIEFWX1dCMTYoYnVmICsgMHgxZCwgYXZjdHgtPmhlaWdodCA+PiBjdHgtPmludGVybGFjZWQpOyAvLyBOQUwKKworICAgIGJ1ZlsweDIxXSA9IGN0eC0+Y2lkX3RhYmxlLT5iaXRfZGVwdGggPT0gMTAgPyAweDU4IDogMHgzODsKKyAgICBidWZbMHgyMl0gPSAweDg4ICsgKGN0eC0+aW50ZXJsYWNlZCA8PCAyKTsKKyAgICBBVl9XQjMyKGJ1ZiArIDB4MjgsIGN0eC0+Y2lkKTsgLy8gQ0lECisgICAgYnVmWzB4MmNdID0gY3R4LT5pbnRlcmxhY2VkID8gMCA6IDB4ODA7CisKKyAgICBidWZbMHg1Zl0gPSAweDAxOyAvLyBVREwKKworICAgIGJ1ZlsweDE2N10gPSAweDAyOyAvLyByZXNlcnZlZAorICAgIEFWX1dCMTYoYnVmICsgMHgxNmEsIGN0eC0+bS5tYl9oZWlnaHQgKiA0ICsgNCk7IC8vIE1TSVBTCisgICAgYnVmWzB4MTZkXSA9IGN0eC0+bS5tYl9oZWlnaHQ7IC8vIE5zCisgICAgYnVmWzB4MTZmXSA9IDB4MTA7IC8vIHJlc2VydmVkCisKKyAgICBjdHgtPm1zaXAgPSBidWYgKyAweDE3MDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBkbnhoZF9lbmNvZGVfZGMoRE5YSERFbmNDb250ZXh0ICpjdHgsIGludCBkaWZmKQoreworICAgIGludCBuYml0czsKKyAgICBpZiAoZGlmZiA8IDApIHsKKyAgICAgICAgbmJpdHMgPSBhdl9sb2cyXzE2Yml0KC0yICogZGlmZik7CisgICAgICAgIGRpZmYtLTsKKyAgICB9IGVsc2UgeworICAgICAgICBuYml0cyA9IGF2X2xvZzJfMTZiaXQoMiAqIGRpZmYpOworICAgIH0KKyAgICBwdXRfYml0cygmY3R4LT5tLnBiLCBjdHgtPmNpZF90YWJsZS0+ZGNfYml0c1tuYml0c10gKyBuYml0cywKKyAgICAgICAgICAgICAoY3R4LT5jaWRfdGFibGUtPmRjX2NvZGVzW25iaXRzXSA8PCBuYml0cykgKworICAgICAgICAgICAgIChkaWZmICYgKCgxIDw8IG5iaXRzKSAtIDEpKSk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIGRueGhkX2VuY29kZV9ibG9jayhETlhIREVuY0NvbnRleHQgKmN0eCwgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdF9pbmRleCwgaW50IG4pCit7CisgICAgaW50IGxhc3Rfbm9uX3plcm8gPSAwOworICAgIGludCBzbGV2ZWwsIGksIGo7CisKKyAgICBkbnhoZF9lbmNvZGVfZGMoY3R4LCBibG9ja1swXSAtIGN0eC0+bS5sYXN0X2RjW25dKTsKKyAgICBjdHgtPm0ubGFzdF9kY1tuXSA9IGJsb2NrWzBdOworCisgICAgZm9yIChpID0gMTsgaSA8PSBsYXN0X2luZGV4OyBpKyspIHsKKyAgICAgICAgaiA9IGN0eC0+bS5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZFtpXTsKKyAgICAgICAgc2xldmVsID0gYmxvY2tbal07CisgICAgICAgIGlmIChzbGV2ZWwpIHsKKyAgICAgICAgICAgIGludCBydW5fbGV2ZWwgPSBpIC0gbGFzdF9ub25femVybyAtIDE7CisgICAgICAgICAgICBpbnQgcmxldmVsID0gKHNsZXZlbCA8PCAxKSB8ICEhcnVuX2xldmVsOworICAgICAgICAgICAgcHV0X2JpdHMoJmN0eC0+bS5wYiwgY3R4LT52bGNfYml0c1tybGV2ZWxdLCBjdHgtPnZsY19jb2Rlc1tybGV2ZWxdKTsKKyAgICAgICAgICAgIGlmIChydW5fbGV2ZWwpCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJmN0eC0+bS5wYiwgY3R4LT5ydW5fYml0c1tydW5fbGV2ZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cnVuX2NvZGVzW3J1bl9sZXZlbF0pOworICAgICAgICAgICAgbGFzdF9ub25femVybyA9IGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHV0X2JpdHMoJmN0eC0+bS5wYiwgY3R4LT52bGNfYml0c1swXSwgY3R4LT52bGNfY29kZXNbMF0pOyAvLyBFT0IKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgZG54aGRfdW5xdWFudGl6ZV9jKEROWEhERW5jQ29udGV4dCAqY3R4LCBpbnQxNl90ICpibG9jaywgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXNjYWxlLCBpbnQgbGFzdF9pbmRleCkKK3sKKyAgICBjb25zdCB1aW50OF90ICp3ZWlnaHRfbWF0cml4OworICAgIGludCBsZXZlbDsKKyAgICBpbnQgaTsKKworICAgIHdlaWdodF9tYXRyaXggPSAobiAmIDIpID8gY3R4LT5jaWRfdGFibGUtPmNocm9tYV93ZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN0eC0+Y2lkX3RhYmxlLT5sdW1hX3dlaWdodDsKKworICAgIGZvciAoaSA9IDE7IGkgPD0gbGFzdF9pbmRleDsgaSsrKSB7CisgICAgICAgIGludCBqID0gY3R4LT5tLmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkW2ldOworICAgICAgICBsZXZlbCA9IGJsb2NrW2pdOworICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9ICgxIC0gMiAqIGxldmVsKSAqIHFzY2FsZSAqIHdlaWdodF9tYXRyaXhbaV07CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+Y2lkX3RhYmxlLT5iaXRfZGVwdGggPT0gMTApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdlaWdodF9tYXRyaXhbaV0gIT0gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsICs9IDg7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID4+PSA0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZWlnaHRfbWF0cml4W2ldICE9IDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID4+PSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAoMiAqIGxldmVsICsgMSkgKiBxc2NhbGUgKiB3ZWlnaHRfbWF0cml4W2ldOworICAgICAgICAgICAgICAgIGlmIChjdHgtPmNpZF90YWJsZS0+Yml0X2RlcHRoID09IDEwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZWlnaHRfbWF0cml4W2ldICE9IDgpCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCArPSA4OworICAgICAgICAgICAgICAgICAgICBsZXZlbCA+Pj0gNDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAod2VpZ2h0X21hdHJpeFtpXSAhPSAzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsICs9IDMyOworICAgICAgICAgICAgICAgICAgICBsZXZlbCA+Pj0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZG54aGRfc3NkX2Jsb2NrKGludDE2X3QgKnFibG9jaywgaW50MTZfdCAqYmxvY2spCit7CisgICAgaW50IHNjb3JlID0gMDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgc2NvcmUgKz0gKGJsb2NrW2ldIC0gcWJsb2NrW2ldKSAqIChibG9ja1tpXSAtIHFibG9ja1tpXSk7CisgICAgcmV0dXJuIHNjb3JlOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZQoraW50IGRueGhkX2NhbGNfYWNfYml0cyhETlhIREVuY0NvbnRleHQgKmN0eCwgaW50MTZfdCAqYmxvY2ssIGludCBsYXN0X2luZGV4KQoreworICAgIGludCBsYXN0X25vbl96ZXJvID0gMDsKKyAgICBpbnQgYml0cyA9IDA7CisgICAgaW50IGksIGosIGxldmVsOworICAgIGZvciAoaSA9IDE7IGkgPD0gbGFzdF9pbmRleDsgaSsrKSB7CisgICAgICAgIGogPSBjdHgtPm0uaW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWRbaV07CisgICAgICAgIGxldmVsID0gYmxvY2tbal07CisgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgaW50IHJ1bl9sZXZlbCA9IGkgLSBsYXN0X25vbl96ZXJvIC0gMTsKKyAgICAgICAgICAgIGJpdHMgKz0gY3R4LT52bGNfYml0c1sobGV2ZWwgPDwgMSkgfAorICAgICAgICAgICAgICAgICAgICAhIXJ1bl9sZXZlbF0gKyBjdHgtPnJ1bl9iaXRzW3J1bl9sZXZlbF07CisgICAgICAgICAgICBsYXN0X25vbl96ZXJvID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYml0czsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgZG54aGRfZ2V0X2Jsb2NrcyhETlhIREVuY0NvbnRleHQgKmN0eCwgaW50IG1iX3gsIGludCBtYl95KQoreworICAgIGNvbnN0IGludCBicyA9IGN0eC0+YmxvY2tfd2lkdGhfbDI7CisgICAgY29uc3QgaW50IGJ3ID0gMSA8PCBiczsKKyAgICBjb25zdCB1aW50OF90ICpwdHJfeSA9IGN0eC0+dGhyZWFkWzBdLT5zcmNbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtYl95IDw8IDQpICogY3R4LT5tLmxpbmVzaXplKSArIChtYl94IDw8IGJzICsgMSk7CisgICAgY29uc3QgdWludDhfdCAqcHRyX3UgPSBjdHgtPnRocmVhZFswXS0+c3JjWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgobWJfeSA8PCA0KSAqIGN0eC0+bS51dmxpbmVzaXplKSArIChtYl94IDw8IGJzKTsKKyAgICBjb25zdCB1aW50OF90ICpwdHJfdiA9IGN0eC0+dGhyZWFkWzBdLT5zcmNbMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtYl95IDw8IDQpICogY3R4LT5tLnV2bGluZXNpemUpICsgKG1iX3ggPDwgYnMpOworICAgIFBpeGJsb2NrRFNQQ29udGV4dCAqcGRzcCA9ICZjdHgtPm0ucGRzcDsKKworICAgIHBkc3AtPmdldF9waXhlbHMoY3R4LT5ibG9ja3NbMF0sIHB0cl95LCAgICAgIGN0eC0+bS5saW5lc2l6ZSk7CisgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1sxXSwgcHRyX3kgKyBidywgY3R4LT5tLmxpbmVzaXplKTsKKyAgICBwZHNwLT5nZXRfcGl4ZWxzKGN0eC0+YmxvY2tzWzJdLCBwdHJfdSwgICAgICBjdHgtPm0udXZsaW5lc2l6ZSk7CisgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1szXSwgcHRyX3YsICAgICAgY3R4LT5tLnV2bGluZXNpemUpOworCisgICAgaWYgKG1iX3kgKyAxID09IGN0eC0+bS5tYl9oZWlnaHQgJiYgY3R4LT5tLmF2Y3R4LT5oZWlnaHQgPT0gMTA4MCkgeworICAgICAgICBpZiAoY3R4LT5pbnRlcmxhY2VkKSB7CisgICAgICAgICAgICBjdHgtPmdldF9waXhlbHNfOHg0X3N5bShjdHgtPmJsb2Nrc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl95ICsgY3R4LT5kY3RfeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm0ubGluZXNpemUpOworICAgICAgICAgICAgY3R4LT5nZXRfcGl4ZWxzXzh4NF9zeW0oY3R4LT5ibG9ja3NbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfeSArIGN0eC0+ZGN0X3lfb2Zmc2V0ICsgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm0ubGluZXNpemUpOworICAgICAgICAgICAgY3R4LT5nZXRfcGl4ZWxzXzh4NF9zeW0oY3R4LT5ibG9ja3NbNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfdSArIGN0eC0+ZGN0X3V2X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bS51dmxpbmVzaXplKTsKKyAgICAgICAgICAgIGN0eC0+Z2V0X3BpeGVsc184eDRfc3ltKGN0eC0+YmxvY2tzWzddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX3YgKyBjdHgtPmRjdF91dl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm0udXZsaW5lc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdHgtPmJkc3AuY2xlYXJfYmxvY2soY3R4LT5ibG9ja3NbNF0pOworICAgICAgICAgICAgY3R4LT5iZHNwLmNsZWFyX2Jsb2NrKGN0eC0+YmxvY2tzWzVdKTsKKyAgICAgICAgICAgIGN0eC0+YmRzcC5jbGVhcl9ibG9jayhjdHgtPmJsb2Nrc1s2XSk7CisgICAgICAgICAgICBjdHgtPmJkc3AuY2xlYXJfYmxvY2soY3R4LT5ibG9ja3NbN10pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfeSArIGN0eC0+ZGN0X3lfb2Zmc2V0LCBjdHgtPm0ubGluZXNpemUpOworICAgICAgICBwZHNwLT5nZXRfcGl4ZWxzKGN0eC0+YmxvY2tzWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl95ICsgY3R4LT5kY3RfeV9vZmZzZXQgKyBidywgY3R4LT5tLmxpbmVzaXplKTsKKyAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1s2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfdSArIGN0eC0+ZGN0X3V2X29mZnNldCwgY3R4LT5tLnV2bGluZXNpemUpOworICAgICAgICBwZHNwLT5nZXRfcGl4ZWxzKGN0eC0+YmxvY2tzWzddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl92ICsgY3R4LT5kY3RfdXZfb2Zmc2V0LCBjdHgtPm0udXZsaW5lc2l6ZSk7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZQoraW50IGRueGhkX3N3aXRjaF9tYXRyaXgoRE5YSERFbmNDb250ZXh0ICpjdHgsIGludCBpKQoreworICAgIGNvbnN0IHN0YXRpYyB1aW50OF90IGNvbXBvbmVudFs4XT17MCwwLDEsMiwwLDAsMSwyfTsKKyAgICByZXR1cm4gY29tcG9uZW50W2ldOworfQorCitzdGF0aWMgaW50IGRueGhkX2NhbGNfYml0c190aHJlYWQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIpCit7CisgICAgRE5YSERFbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBtYl95ID0gam9ibnIsIG1iX3g7CisgICAgaW50IHFzY2FsZSA9IGN0eC0+cXNjYWxlOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgYmxvY2ssIFs2NF0pOworICAgIGN0eCA9IGN0eC0+dGhyZWFkW3RocmVhZG5yXTsKKworICAgIGN0eC0+bS5sYXN0X2RjWzBdID0KKyAgICBjdHgtPm0ubGFzdF9kY1sxXSA9CisgICAgY3R4LT5tLmxhc3RfZGNbMl0gPSAxIDw8IChjdHgtPmNpZF90YWJsZS0+Yml0X2RlcHRoICsgMik7CisKKyAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgY3R4LT5tLm1iX3dpZHRoOyBtYl94KyspIHsKKyAgICAgICAgdW5zaWduZWQgbWIgPSBtYl95ICogY3R4LT5tLm1iX3dpZHRoICsgbWJfeDsKKyAgICAgICAgaW50IHNzZCAgICAgPSAwOworICAgICAgICBpbnQgYWNfYml0cyA9IDA7CisgICAgICAgIGludCBkY19iaXRzID0gMDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZG54aGRfZ2V0X2Jsb2NrcyhjdHgsIG1iX3gsIG1iX3kpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGludDE2X3QgKnNyY19ibG9jayA9IGN0eC0+YmxvY2tzW2ldOworICAgICAgICAgICAgaW50IG92ZXJmbG93LCBuYml0cywgZGlmZiwgbGFzdF9pbmRleDsKKyAgICAgICAgICAgIGludCBuID0gZG54aGRfc3dpdGNoX21hdHJpeChjdHgsIGkpOworCisgICAgICAgICAgICBtZW1jcHkoYmxvY2ssIHNyY19ibG9jaywgNjQgKiBzaXplb2YoKmJsb2NrKSk7CisgICAgICAgICAgICBsYXN0X2luZGV4ID0gY3R4LT5tLmRjdF9xdWFudGl6ZSgmY3R4LT5tLCBibG9jaywgNCAmICgyKmkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXNjYWxlLCAmb3ZlcmZsb3cpOworICAgICAgICAgICAgYWNfYml0cyAgICs9IGRueGhkX2NhbGNfYWNfYml0cyhjdHgsIGJsb2NrLCBsYXN0X2luZGV4KTsKKworICAgICAgICAgICAgZGlmZiA9IGJsb2NrWzBdIC0gY3R4LT5tLmxhc3RfZGNbbl07CisgICAgICAgICAgICBpZiAoZGlmZiA8IDApCisgICAgICAgICAgICAgICAgbmJpdHMgPSBhdl9sb2cyXzE2Yml0KC0yICogZGlmZik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmJpdHMgPSBhdl9sb2cyXzE2Yml0KDIgKiBkaWZmKTsKKworICAgICAgICAgICAgYXZfYXNzZXJ0MShuYml0cyA8IGN0eC0+Y2lkX3RhYmxlLT5iaXRfZGVwdGggKyA0KTsKKyAgICAgICAgICAgIGRjX2JpdHMgKz0gY3R4LT5jaWRfdGFibGUtPmRjX2JpdHNbbmJpdHNdICsgbmJpdHM7CisKKyAgICAgICAgICAgIGN0eC0+bS5sYXN0X2RjW25dID0gYmxvY2tbMF07CisKKyAgICAgICAgICAgIGlmIChhdmN0eC0+bWJfZGVjaXNpb24gPT0gRkZfTUJfREVDSVNJT05fUkQgfHwgIVJDX1ZBUklBTkNFKSB7CisgICAgICAgICAgICAgICAgZG54aGRfdW5xdWFudGl6ZV9jKGN0eCwgYmxvY2ssIGksIHFzY2FsZSwgbGFzdF9pbmRleCk7CisgICAgICAgICAgICAgICAgY3R4LT5tLmlkc3AuaWRjdChibG9jayk7CisgICAgICAgICAgICAgICAgc3NkICs9IGRueGhkX3NzZF9ibG9jayhibG9jaywgc3JjX2Jsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjdHgtPm1iX3JjW3FzY2FsZV1bbWJdLnNzZCAgPSBzc2Q7CisgICAgICAgIGN0eC0+bWJfcmNbcXNjYWxlXVttYl0uYml0cyA9IGFjX2JpdHMgKyBkY19iaXRzICsgMTIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICogY3R4LT52bGNfYml0c1swXTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG54aGRfZW5jb2RlX3RocmVhZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgam9ibnIsIGludCB0aHJlYWRucikKK3sKKyAgICBETlhIREVuY0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IG1iX3kgPSBqb2JuciwgbWJfeDsKKyAgICBjdHggPSBjdHgtPnRocmVhZFt0aHJlYWRucl07CisgICAgaW5pdF9wdXRfYml0cygmY3R4LT5tLnBiLCAodWludDhfdCAqKWFyZyArIDY0MCArIGN0eC0+c2xpY2Vfb2Zmc1tqb2Jucl0sCisgICAgICAgICAgICAgICAgICBjdHgtPnNsaWNlX3NpemVbam9ibnJdKTsKKworICAgIGN0eC0+bS5sYXN0X2RjWzBdID0KKyAgICBjdHgtPm0ubGFzdF9kY1sxXSA9CisgICAgY3R4LT5tLmxhc3RfZGNbMl0gPSAxIDw8IChjdHgtPmNpZF90YWJsZS0+Yml0X2RlcHRoICsgMik7CisgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IGN0eC0+bS5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgIHVuc2lnbmVkIG1iID0gbWJfeSAqIGN0eC0+bS5tYl93aWR0aCArIG1iX3g7CisgICAgICAgIGludCBxc2NhbGUgPSBjdHgtPm1iX3FzY2FsZVttYl07CisgICAgICAgIGludCBpOworCisgICAgICAgIHB1dF9iaXRzKCZjdHgtPm0ucGIsIDEyLCBxc2NhbGUgPDwgMSk7CisKKyAgICAgICAgZG54aGRfZ2V0X2Jsb2NrcyhjdHgsIG1iX3gsIG1iX3kpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGludDE2X3QgKmJsb2NrID0gY3R4LT5ibG9ja3NbaV07CisgICAgICAgICAgICBpbnQgb3ZlcmZsb3csIG4gPSBkbnhoZF9zd2l0Y2hfbWF0cml4KGN0eCwgaSk7CisgICAgICAgICAgICBpbnQgbGFzdF9pbmRleCA9IGN0eC0+bS5kY3RfcXVhbnRpemUoJmN0eC0+bSwgYmxvY2ssIDQgJiAoMippKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxc2NhbGUsICZvdmVyZmxvdyk7CisgICAgICAgICAgICAvLyBTVEFSVF9USU1FUjsKKyAgICAgICAgICAgIGRueGhkX2VuY29kZV9ibG9jayhjdHgsIGJsb2NrLCBsYXN0X2luZGV4LCBuKTsKKyAgICAgICAgICAgIC8vIFNUT1BfVElNRVIoImVuY29kZV9ibG9jayIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwdXRfYml0c19jb3VudCgmY3R4LT5tLnBiKSAmIDMxKQorICAgICAgICBwdXRfYml0cygmY3R4LT5tLnBiLCAzMiAtIChwdXRfYml0c19jb3VudCgmY3R4LT5tLnBiKSAmIDMxKSwgMCk7CisgICAgZmx1c2hfcHV0X2JpdHMoJmN0eC0+bS5wYik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRueGhkX3NldHVwX3RocmVhZHNfc2xpY2VzKEROWEhERW5jQ29udGV4dCAqY3R4KQoreworICAgIGludCBtYl95LCBtYl94OworICAgIGludCBvZmZzZXQgPSAwOworICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBjdHgtPm0ubWJfaGVpZ2h0OyBtYl95KyspIHsKKyAgICAgICAgaW50IHRocmVhZF9zaXplOworICAgICAgICBjdHgtPnNsaWNlX29mZnNbbWJfeV0gPSBvZmZzZXQ7CisgICAgICAgIGN0eC0+c2xpY2Vfc2l6ZVttYl95XSA9IDA7CisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBjdHgtPm0ubWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgdW5zaWduZWQgbWIgPSBtYl95ICogY3R4LT5tLm1iX3dpZHRoICsgbWJfeDsKKyAgICAgICAgICAgIGN0eC0+c2xpY2Vfc2l6ZVttYl95XSArPSBjdHgtPm1iX2JpdHNbbWJdOworICAgICAgICB9CisgICAgICAgIGN0eC0+c2xpY2Vfc2l6ZVttYl95XSAgID0gKGN0eC0+c2xpY2Vfc2l6ZVttYl95XSArIDMxKSAmIH4zMTsKKyAgICAgICAgY3R4LT5zbGljZV9zaXplW21iX3ldID4+PSAzOworICAgICAgICB0aHJlYWRfc2l6ZSA9IGN0eC0+c2xpY2Vfc2l6ZVttYl95XTsKKyAgICAgICAgb2Zmc2V0ICs9IHRocmVhZF9zaXplOworICAgIH0KK30KKworc3RhdGljIGludCBkbnhoZF9tYl92YXJfdGhyZWFkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqb2JuciwgaW50IHRocmVhZG5yKQoreworICAgIEROWEhERW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgbWJfeSA9IGpvYm5yLCBtYl94LCB4LCB5OworICAgIGludCBwYXJ0aWFsX2xhc3Rfcm93ID0gKG1iX3kgPT0gY3R4LT5tLm1iX2hlaWdodCAtIDEpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGF2Y3R4LT5oZWlnaHQgPj4gY3R4LT5pbnRlcmxhY2VkKSAmIDB4Rik7CisKKyAgICBjdHggPSBjdHgtPnRocmVhZFt0aHJlYWRucl07CisgICAgaWYgKGN0eC0+Y2lkX3RhYmxlLT5iaXRfZGVwdGggPT0gOCkgeworICAgICAgICB1aW50OF90ICpwaXggPSBjdHgtPnRocmVhZFswXS0+c3JjWzBdICsgKChtYl95IDw8IDQpICogY3R4LT5tLmxpbmVzaXplKTsKKyAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IGN0eC0+bS5tYl93aWR0aDsgKyttYl94LCBwaXggKz0gMTYpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1iID0gbWJfeSAqIGN0eC0+bS5tYl93aWR0aCArIG1iX3g7CisgICAgICAgICAgICBpbnQgc3VtOworICAgICAgICAgICAgaW50IHZhcmM7CisKKyAgICAgICAgICAgIGlmICghcGFydGlhbF9sYXN0X3JvdyAmJiBtYl94ICogMTYgPD0gYXZjdHgtPndpZHRoIC0gMTYpIHsKKyAgICAgICAgICAgICAgICBzdW0gID0gY3R4LT5tLm1wdmVuY2RzcC5waXhfc3VtKHBpeCwgY3R4LT5tLmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICB2YXJjID0gY3R4LT5tLm1wdmVuY2RzcC5waXhfbm9ybTEocGl4LCBjdHgtPm0ubGluZXNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgYncgPSBGRk1JTihhdmN0eC0+d2lkdGggLSAxNiAqIG1iX3gsIDE2KTsKKyAgICAgICAgICAgICAgICBpbnQgYmggPSBGRk1JTigoYXZjdHgtPmhlaWdodCA+PiBjdHgtPmludGVybGFjZWQpIC0gMTYgKiBtYl95LCAxNik7CisgICAgICAgICAgICAgICAgc3VtID0gdmFyYyA9IDA7CisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGJoOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGJ3OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmFsID0gcGl4W3ggKyB5ICogY3R4LT5tLmxpbmVzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSAgKz0gdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyYyArPSB2YWwgKiB2YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXJjID0gKHZhcmMgLSAoKCh1bnNpZ25lZCkgc3VtICogc3VtKSA+PiA4KSArIDEyOCkgPj4gODsKKworICAgICAgICAgICAgY3R4LT5tYl9jbXBbbWJdLnZhbHVlID0gdmFyYzsKKyAgICAgICAgICAgIGN0eC0+bWJfY21wW21iXS5tYiAgICA9IG1iOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gMTAtYml0CisgICAgICAgIGludCBjb25zdCBsaW5lc2l6ZSA9IGN0eC0+bS5saW5lc2l6ZSA+PiAxOworICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgY3R4LT5tLm1iX3dpZHRoOyArK21iX3gpIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICpwaXggPSAodWludDE2X3QgKiljdHgtPnRocmVhZFswXS0+c3JjWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1iX3kgPDwgNCkgKiBsaW5lc2l6ZSkgKyAobWJfeCA8PCA0KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1iICA9IG1iX3kgKiBjdHgtPm0ubWJfd2lkdGggKyBtYl94OworICAgICAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgICAgICBpbnQgc3FzdW0gPSAwOworICAgICAgICAgICAgaW50IG1lYW4sIHNxbWVhbjsKKyAgICAgICAgICAgIGludCBpLCBqOworICAgICAgICAgICAgLy8gTWFjcm9ibG9ja3MgYXJlIDE2eDE2IHBpeGVscywgdW5saWtlIERDVCBibG9ja3Mgd2hpY2ggYXJlIDh4OC4KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVHVybiAxNi1iaXQgcGl4ZWxzIGludG8gMTAtYml0IG9uZXMuCisgICAgICAgICAgICAgICAgICAgIGludCBjb25zdCBzYW1wbGUgPSAodW5zaWduZWQpIHBpeFtqXSA+PiA2OworICAgICAgICAgICAgICAgICAgICBzdW0gICArPSBzYW1wbGU7CisgICAgICAgICAgICAgICAgICAgIHNxc3VtICs9IHNhbXBsZSAqIHNhbXBsZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gMl4xMCAqIDJeMTAgKiAxNiAqIDE2ID0gMl4yOCwgd2hpY2ggaXMgbGVzcyB0aGFuIElOVF9NQVgKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGl4ICs9IGxpbmVzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVhbiA9IHN1bSA+PiA4OyAvLyAxNioxNiA9PSAyXjgKKyAgICAgICAgICAgIHNxbWVhbiA9IHNxc3VtID4+IDg7CisgICAgICAgICAgICBjdHgtPm1iX2NtcFttYl0udmFsdWUgPSBzcW1lYW4gLSBtZWFuICogbWVhbjsKKyAgICAgICAgICAgIGN0eC0+bWJfY21wW21iXS5tYiAgICA9IG1iOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRueGhkX2VuY29kZV9yZG8oQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBETlhIREVuY0NvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQgbGFtYmRhLCB1cF9zdGVwLCBkb3duX3N0ZXA7CisgICAgaW50IGxhc3RfbG93ZXIgPSBJTlRfTUFYLCBsYXN0X2hpZ2hlciA9IDA7CisgICAgaW50IHgsIHksIHE7CisKKyAgICBmb3IgKHEgPSAxOyBxIDwgYXZjdHgtPnFtYXg7IHErKykgeworICAgICAgICBjdHgtPnFzY2FsZSA9IHE7CisgICAgICAgIGF2Y3R4LT5leGVjdXRlMihhdmN0eCwgZG54aGRfY2FsY19iaXRzX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIGN0eC0+bS5tYl9oZWlnaHQpOworICAgIH0KKyAgICB1cF9zdGVwID0gZG93bl9zdGVwID0gMiA8PCBMQU1CREFfRlJBQ19CSVRTOworICAgIGxhbWJkYSAgPSBjdHgtPmxhbWJkYTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGJpdHMgPSAwOworICAgICAgICBpbnQgZW5kICA9IDA7CisgICAgICAgIGlmIChsYW1iZGEgPT0gbGFzdF9oaWdoZXIpIHsKKyAgICAgICAgICAgIGxhbWJkYSsrOworICAgICAgICAgICAgZW5kID0gMTsgLy8gbmVlZCB0byBzZXQgZmluYWwgcXNjYWxlcy9iaXRzCisgICAgICAgIH0KKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN0eC0+bS5tYl9oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGN0eC0+bS5tYl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbWluID0gVUlOVF9NQVg7CisgICAgICAgICAgICAgICAgaW50IHFzY2FsZSA9IDE7CisgICAgICAgICAgICAgICAgaW50IG1iICAgICA9IHkgKiBjdHgtPm0ubWJfd2lkdGggKyB4OworICAgICAgICAgICAgICAgIGZvciAocSA9IDE7IHEgPCBhdmN0eC0+cW1heDsgcSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNjb3JlID0gY3R4LT5tYl9yY1txXVttYl0uYml0cyAqIGxhbWJkYSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCkgY3R4LT5tYl9yY1txXVttYl0uc3NkIDw8IExBTUJEQV9GUkFDX0JJVFMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPCBtaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbiAgICA9IHNjb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgcXNjYWxlID0gcTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiaXRzICs9IGN0eC0+bWJfcmNbcXNjYWxlXVttYl0uYml0czsKKyAgICAgICAgICAgICAgICBjdHgtPm1iX3FzY2FsZVttYl0gPSBxc2NhbGU7CisgICAgICAgICAgICAgICAgY3R4LT5tYl9iaXRzW21iXSAgID0gY3R4LT5tYl9yY1txc2NhbGVdW21iXS5iaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYml0cyA9IChiaXRzICsgMzEpICYgfjMxOyAvLyBwYWRkaW5nCisgICAgICAgICAgICBpZiAoYml0cyA+IGN0eC0+ZnJhbWVfYml0cykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBhdl9kbG9nKGN0eC0+bS5hdmN0eCwKKyAgICAgICAgLy8gICAgICAgICAibGFtYmRhICVkLCB1cCAldSwgZG93biAldSwgYml0cyAlZCwgZnJhbWUgJWRcbiIsCisgICAgICAgIC8vICAgICAgICAgbGFtYmRhLCBsYXN0X2hpZ2hlciwgbGFzdF9sb3dlciwgYml0cywgY3R4LT5mcmFtZV9iaXRzKTsKKyAgICAgICAgaWYgKGVuZCkgeworICAgICAgICAgICAgaWYgKGJpdHMgPiBjdHgtPmZyYW1lX2JpdHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChiaXRzIDwgY3R4LT5mcmFtZV9iaXRzKSB7CisgICAgICAgICAgICBsYXN0X2xvd2VyID0gRkZNSU4obGFtYmRhLCBsYXN0X2xvd2VyKTsKKyAgICAgICAgICAgIGlmIChsYXN0X2hpZ2hlciAhPSAwKQorICAgICAgICAgICAgICAgIGxhbWJkYSA9IChsYW1iZGErbGFzdF9oaWdoZXIpPj4xOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxhbWJkYSAtPSBkb3duX3N0ZXA7CisgICAgICAgICAgICBkb3duX3N0ZXAgPSBGRk1JTigoaW50NjRfdClkb3duX3N0ZXAqNSwgSU5UX01BWCk7CisgICAgICAgICAgICB1cF9zdGVwID0gMTw8TEFNQkRBX0ZSQUNfQklUUzsKKyAgICAgICAgICAgIGxhbWJkYSA9IEZGTUFYKDEsIGxhbWJkYSk7CisgICAgICAgICAgICBpZiAobGFtYmRhID09IGxhc3RfbG93ZXIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsYXN0X2hpZ2hlciA9IEZGTUFYKGxhbWJkYSwgbGFzdF9oaWdoZXIpOworICAgICAgICAgICAgaWYgKGxhc3RfbG93ZXIgIT0gSU5UX01BWCkKKyAgICAgICAgICAgICAgICBsYW1iZGEgPSAobGFtYmRhK2xhc3RfbG93ZXIpPj4xOworICAgICAgICAgICAgZWxzZSBpZiAoKGludDY0X3QpbGFtYmRhICsgdXBfc3RlcCA+IElOVF9NQVgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsYW1iZGEgKz0gdXBfc3RlcDsKKyAgICAgICAgICAgIHVwX3N0ZXAgPSBGRk1JTigoaW50NjRfdCl1cF9zdGVwKjUsIElOVF9NQVgpOworICAgICAgICAgICAgZG93bl9zdGVwID0gMTw8TEFNQkRBX0ZSQUNfQklUUzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvL2F2X2Rsb2coY3R4LT5tLmF2Y3R4LCAib3V0IGxhbWJkYSAlZFxuIiwgbGFtYmRhKTsKKyAgICBjdHgtPmxhbWJkYSA9IGxhbWJkYTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbnhoZF9maW5kX3FzY2FsZShETlhIREVuY0NvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQgYml0cyA9IDA7CisgICAgaW50IHVwX3N0ZXAgPSAxOworICAgIGludCBkb3duX3N0ZXAgPSAxOworICAgIGludCBsYXN0X2hpZ2hlciA9IDA7CisgICAgaW50IGxhc3RfbG93ZXIgPSBJTlRfTUFYOworICAgIGludCBxc2NhbGU7CisgICAgaW50IHgsIHk7CisKKyAgICBxc2NhbGUgPSBjdHgtPnFzY2FsZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGJpdHMgPSAwOworICAgICAgICBjdHgtPnFzY2FsZSA9IHFzY2FsZTsKKyAgICAgICAgLy8gWFhYIGF2b2lkIHJlY2FsY3VsYXRpbmcgYml0cworICAgICAgICBjdHgtPm0uYXZjdHgtPmV4ZWN1dGUyKGN0eC0+bS5hdmN0eCwgZG54aGRfY2FsY19iaXRzX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBjdHgtPm0ubWJfaGVpZ2h0KTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN0eC0+bS5tYl9oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGN0eC0+bS5tYl93aWR0aDsgeCsrKQorICAgICAgICAgICAgICAgIGJpdHMgKz0gY3R4LT5tYl9yY1txc2NhbGVdW3kqY3R4LT5tLm1iX3dpZHRoK3hdLmJpdHM7CisgICAgICAgICAgICBiaXRzID0gKGJpdHMrMzEpJn4zMTsgLy8gcGFkZGluZworICAgICAgICAgICAgaWYgKGJpdHMgPiBjdHgtPmZyYW1lX2JpdHMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gYXZfZGxvZyhjdHgtPm0uYXZjdHgsCisgICAgICAgIC8vICAgICAgICAgIiVkLCBxc2NhbGUgJWQsIGJpdHMgJWQsIGZyYW1lICVkLCBoaWdoZXIgJWQsIGxvd2VyICVkXG4iLAorICAgICAgICAvLyAgICAgICAgIGN0eC0+bS5hdmN0eC0+ZnJhbWVfbnVtYmVyLCBxc2NhbGUsIGJpdHMsIGN0eC0+ZnJhbWVfYml0cywKKyAgICAgICAgLy8gICAgICAgICBsYXN0X2hpZ2hlciwgbGFzdF9sb3dlcik7CisgICAgICAgIGlmIChiaXRzIDwgY3R4LT5mcmFtZV9iaXRzKSB7CisgICAgICAgICAgICBpZiAocXNjYWxlID09IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBpZiAobGFzdF9oaWdoZXIgPT0gcXNjYWxlIC0gMSkgeworICAgICAgICAgICAgICAgIHFzY2FsZSA9IGxhc3RfaGlnaGVyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdF9sb3dlciA9IEZGTUlOKHFzY2FsZSwgbGFzdF9sb3dlcik7CisgICAgICAgICAgICBpZiAobGFzdF9oaWdoZXIgIT0gMCkKKyAgICAgICAgICAgICAgICBxc2NhbGUgPSAocXNjYWxlICsgbGFzdF9oaWdoZXIpID4+IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcXNjYWxlIC09IGRvd25fc3RlcCsrOworICAgICAgICAgICAgaWYgKHFzY2FsZSA8IDEpCisgICAgICAgICAgICAgICAgcXNjYWxlID0gMTsKKyAgICAgICAgICAgIHVwX3N0ZXAgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxhc3RfbG93ZXIgPT0gcXNjYWxlICsgMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGxhc3RfaGlnaGVyID0gRkZNQVgocXNjYWxlLCBsYXN0X2hpZ2hlcik7CisgICAgICAgICAgICBpZiAobGFzdF9sb3dlciAhPSBJTlRfTUFYKQorICAgICAgICAgICAgICAgIHFzY2FsZSA9IChxc2NhbGUgKyBsYXN0X2xvd2VyKSA+PiAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHFzY2FsZSArPSB1cF9zdGVwKys7CisgICAgICAgICAgICBkb3duX3N0ZXAgPSAxOworICAgICAgICAgICAgaWYgKHFzY2FsZSA+PSBjdHgtPm0uYXZjdHgtPnFtYXgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvL2F2X2Rsb2coY3R4LT5tLmF2Y3R4LCAib3V0IHFzY2FsZSAlZFxuIiwgcXNjYWxlKTsKKyAgICBjdHgtPnFzY2FsZSA9IHFzY2FsZTsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBCVUNLRVRfQklUUyA4CisjZGVmaW5lIFJBRElYX1BBU1NFUyA0CisjZGVmaW5lIE5CVUNLRVRTICgxIDw8IEJVQ0tFVF9CSVRTKQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfYnVja2V0KGludCB2YWx1ZSwgaW50IHNoaWZ0KQoreworICAgIHZhbHVlID4+PSBzaGlmdDsKKyAgICB2YWx1ZSAgJj0gTkJVQ0tFVFMgLSAxOworICAgIHJldHVybiBOQlVDS0VUUyAtIDEgLSB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgcmFkaXhfY291bnQoY29uc3QgUkNDTVBFbnRyeSAqZGF0YSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVja2V0c1tSQURJWF9QQVNTRVNdW05CVUNLRVRTXSkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBtZW1zZXQoYnVja2V0cywgMCwgc2l6ZW9mKGJ1Y2tldHNbMF1bMF0pICogUkFESVhfUEFTU0VTICogTkJVQ0tFVFMpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaW50IHYgPSBkYXRhW2ldLnZhbHVlOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgUkFESVhfUEFTU0VTOyBqKyspIHsKKyAgICAgICAgICAgIGJ1Y2tldHNbal1bZ2V0X2J1Y2tldCh2LCAwKV0rKzsKKyAgICAgICAgICAgIHYgPj49IEJVQ0tFVF9CSVRTOworICAgICAgICB9CisgICAgICAgIGF2X2Fzc2VydDEoIXYpOworICAgIH0KKyAgICBmb3IgKGogPSAwOyBqIDwgUkFESVhfUEFTU0VTOyBqKyspIHsKKyAgICAgICAgaW50IG9mZnNldCA9IHNpemU7CisgICAgICAgIGZvciAoaSA9IE5CVUNLRVRTIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICBidWNrZXRzW2pdW2ldID0gb2Zmc2V0IC09IGJ1Y2tldHNbal1baV07CisgICAgICAgIGF2X2Fzc2VydDEoIWJ1Y2tldHNbal1bMF0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmFkaXhfc29ydF9wYXNzKFJDQ01QRW50cnkgKmRzdCwgY29uc3QgUkNDTVBFbnRyeSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGJ1Y2tldHNbTkJVQ0tFVFNdLCBpbnQgcGFzcykKK3sKKyAgICBpbnQgc2hpZnQgPSBwYXNzICogQlVDS0VUX0JJVFM7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpbnQgdiAgID0gZ2V0X2J1Y2tldChkYXRhW2ldLnZhbHVlLCBzaGlmdCk7CisgICAgICAgIGludCBwb3MgPSBidWNrZXRzW3ZdKys7CisgICAgICAgIGRzdFtwb3NdID0gZGF0YVtpXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJhZGl4X3NvcnQoUkNDTVBFbnRyeSAqZGF0YSwgaW50IHNpemUpCit7CisgICAgaW50IGJ1Y2tldHNbUkFESVhfUEFTU0VTXVtOQlVDS0VUU107CisgICAgUkNDTVBFbnRyeSAqdG1wID0gYXZfbWFsbG9jX2FycmF5KHNpemUsIHNpemVvZigqdG1wKSk7CisgICAgcmFkaXhfY291bnQoZGF0YSwgc2l6ZSwgYnVja2V0cyk7CisgICAgcmFkaXhfc29ydF9wYXNzKHRtcCwgZGF0YSwgc2l6ZSwgYnVja2V0c1swXSwgMCk7CisgICAgcmFkaXhfc29ydF9wYXNzKGRhdGEsIHRtcCwgc2l6ZSwgYnVja2V0c1sxXSwgMSk7CisgICAgaWYgKGJ1Y2tldHNbMl1bTkJVQ0tFVFMgLSAxXSB8fCBidWNrZXRzWzNdW05CVUNLRVRTIC0gMV0pIHsKKyAgICAgICAgcmFkaXhfc29ydF9wYXNzKHRtcCwgZGF0YSwgc2l6ZSwgYnVja2V0c1syXSwgMik7CisgICAgICAgIHJhZGl4X3NvcnRfcGFzcyhkYXRhLCB0bXAsIHNpemUsIGJ1Y2tldHNbM10sIDMpOworICAgIH0KKyAgICBhdl9mcmVlKHRtcCk7Cit9CisKK3N0YXRpYyBpbnQgZG54aGRfZW5jb2RlX2Zhc3QoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBETlhIREVuY0NvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQgbWF4X2JpdHMgPSAwOworICAgIGludCByZXQsIHgsIHk7CisgICAgaWYgKChyZXQgPSBkbnhoZF9maW5kX3FzY2FsZShjdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZm9yICh5ID0gMDsgeSA8IGN0eC0+bS5tYl9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgY3R4LT5tLm1iX3dpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCBtYiA9IHkgKiBjdHgtPm0ubWJfd2lkdGggKyB4OworICAgICAgICAgICAgaW50IGRlbHRhX2JpdHM7CisgICAgICAgICAgICBjdHgtPm1iX3FzY2FsZVttYl0gPSBjdHgtPnFzY2FsZTsKKyAgICAgICAgICAgIGN0eC0+bWJfYml0c1ttYl0gPSBjdHgtPm1iX3JjW2N0eC0+cXNjYWxlXVttYl0uYml0czsKKyAgICAgICAgICAgIG1heF9iaXRzICs9IGN0eC0+bWJfcmNbY3R4LT5xc2NhbGVdW21iXS5iaXRzOworICAgICAgICAgICAgaWYgKCFSQ19WQVJJQU5DRSkgeworICAgICAgICAgICAgICAgIGRlbHRhX2JpdHMgPSBjdHgtPm1iX3JjW2N0eC0+cXNjYWxlXVttYl0uYml0cyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bWJfcmNbY3R4LT5xc2NhbGUgKyAxXVttYl0uYml0czsKKyAgICAgICAgICAgICAgICBjdHgtPm1iX2NtcFttYl0ubWIgPSBtYjsKKyAgICAgICAgICAgICAgICBjdHgtPm1iX2NtcFttYl0udmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBkZWx0YV9iaXRzID8gKChjdHgtPm1iX3JjW2N0eC0+cXNjYWxlXVttYl0uc3NkIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5tYl9yY1tjdHgtPnFzY2FsZSArIDFdW21iXS5zc2QpICogMTAwKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFfYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSU5UX01JTjsgLy8gYXZvaWQgaW5jcmVhc2luZyBxc2NhbGUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtYXhfYml0cyArPSAzMTsgLy8gd29yc3QgcGFkZGluZworICAgIH0KKyAgICBpZiAoIXJldCkgeworICAgICAgICBpZiAoUkNfVkFSSUFOQ0UpCisgICAgICAgICAgICBhdmN0eC0+ZXhlY3V0ZTIoYXZjdHgsIGRueGhkX21iX3Zhcl90aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgY3R4LT5tLm1iX2hlaWdodCk7CisgICAgICAgIHJhZGl4X3NvcnQoY3R4LT5tYl9jbXAsIGN0eC0+bS5tYl9udW0pOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgY3R4LT5tLm1iX251bSAmJiBtYXhfYml0cyA+IGN0eC0+ZnJhbWVfYml0czsgeCsrKSB7CisgICAgICAgICAgICBpbnQgbWIgPSBjdHgtPm1iX2NtcFt4XS5tYjsKKyAgICAgICAgICAgIG1heF9iaXRzIC09IGN0eC0+bWJfcmNbY3R4LT5xc2NhbGVdW21iXS5iaXRzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bWJfcmNbY3R4LT5xc2NhbGUgKyAxXVttYl0uYml0czsKKyAgICAgICAgICAgIGN0eC0+bWJfcXNjYWxlW21iXSA9IGN0eC0+cXNjYWxlICsgMTsKKyAgICAgICAgICAgIGN0eC0+bWJfYml0c1ttYl0gICA9IGN0eC0+bWJfcmNbY3R4LT5xc2NhbGUgKyAxXVttYl0uYml0czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG54aGRfbG9hZF9waWN0dXJlKEROWEhERW5jQ29udGV4dCAqY3R4LCBjb25zdCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm0uYXZjdHgtPnRocmVhZF9jb3VudDsgaSsrKSB7CisgICAgICAgIGN0eC0+dGhyZWFkW2ldLT5tLmxpbmVzaXplICAgID0gZnJhbWUtPmxpbmVzaXplWzBdIDw8IGN0eC0+aW50ZXJsYWNlZDsKKyAgICAgICAgY3R4LT50aHJlYWRbaV0tPm0udXZsaW5lc2l6ZSAgPSBmcmFtZS0+bGluZXNpemVbMV0gPDwgY3R4LT5pbnRlcmxhY2VkOworICAgICAgICBjdHgtPnRocmVhZFtpXS0+ZGN0X3lfb2Zmc2V0ICA9IGN0eC0+bS5saW5lc2l6ZSAgKjg7CisgICAgICAgIGN0eC0+dGhyZWFkW2ldLT5kY3RfdXZfb2Zmc2V0ID0gY3R4LT5tLnV2bGluZXNpemUqODsKKyAgICB9CisKKyAgICBjdHgtPm0uYXZjdHgtPmNvZGVkX2ZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lID0gZnJhbWUtPmludGVybGFjZWRfZnJhbWU7CisgICAgY3R4LT5jdXJfZmllbGQgPSBmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSAmJiAhZnJhbWUtPnRvcF9maWVsZF9maXJzdDsKK30KKworc3RhdGljIGludCBkbnhoZF9lbmNvZGVfcGljdHVyZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgRE5YSERFbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBmaXJzdF9maWVsZCA9IDE7CisgICAgaW50IG9mZnNldCwgaSwgcmV0OworICAgIHVpbnQ4X3QgKmJ1ZjsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBjdHgtPmNpZF90YWJsZS0+ZnJhbWVfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBidWYgPSBwa3QtPmRhdGE7CisKKyAgICBkbnhoZF9sb2FkX3BpY3R1cmUoY3R4LCBmcmFtZSk7CisKK2VuY29kZV9jb2RpbmdfdW5pdDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGN0eC0+c3JjW2ldID0gZnJhbWUtPmRhdGFbaV07CisgICAgICAgIGlmIChjdHgtPmludGVybGFjZWQgJiYgY3R4LT5jdXJfZmllbGQpCisgICAgICAgICAgICBjdHgtPnNyY1tpXSArPSBmcmFtZS0+bGluZXNpemVbaV07CisgICAgfQorCisgICAgZG54aGRfd3JpdGVfaGVhZGVyKGF2Y3R4LCBidWYpOworCisgICAgaWYgKGF2Y3R4LT5tYl9kZWNpc2lvbiA9PSBGRl9NQl9ERUNJU0lPTl9SRCkKKyAgICAgICAgcmV0ID0gZG54aGRfZW5jb2RlX3JkbyhhdmN0eCwgY3R4KTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IGRueGhkX2VuY29kZV9mYXN0KGF2Y3R4LCBjdHgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInBpY3R1cmUgY291bGQgbm90IGZpdCByYXRlY29udHJvbCBjb25zdHJhaW50cywgaW5jcmVhc2UgcW1heFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZG54aGRfc2V0dXBfdGhyZWFkc19zbGljZXMoY3R4KTsKKworICAgIG9mZnNldCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bS5tYl9oZWlnaHQ7IGkrKykgeworICAgICAgICBBVl9XQjMyKGN0eC0+bXNpcCArIGkgKiA0LCBvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gY3R4LT5zbGljZV9zaXplW2ldOworICAgICAgICBhdl9hc3NlcnQxKCEoY3R4LT5zbGljZV9zaXplW2ldICYgMykpOworICAgIH0KKworICAgIGF2Y3R4LT5leGVjdXRlMihhdmN0eCwgZG54aGRfZW5jb2RlX3RocmVhZCwgYnVmLCBOVUxMLCBjdHgtPm0ubWJfaGVpZ2h0KTsKKworICAgIGF2X2Fzc2VydDEoNjQwICsgb2Zmc2V0ICsgNCA8PSBjdHgtPmNpZF90YWJsZS0+Y29kaW5nX3VuaXRfc2l6ZSk7CisgICAgbWVtc2V0KGJ1ZiArIDY0MCArIG9mZnNldCwgMCwKKyAgICAgICAgICAgY3R4LT5jaWRfdGFibGUtPmNvZGluZ191bml0X3NpemUgLSA0IC0gb2Zmc2V0IC0gNjQwKTsKKworICAgIEFWX1dCMzIoYnVmICsgY3R4LT5jaWRfdGFibGUtPmNvZGluZ191bml0X3NpemUgLSA0LCAweDYwMERDMERFKTsgLy8gRU9GCisKKyAgICBpZiAoY3R4LT5pbnRlcmxhY2VkICYmIGZpcnN0X2ZpZWxkKSB7CisgICAgICAgIGZpcnN0X2ZpZWxkICAgICA9IDA7CisgICAgICAgIGN0eC0+Y3VyX2ZpZWxkIF49IDE7CisgICAgICAgIGJ1ZiAgICAgICAgICAgICs9IGN0eC0+Y2lkX3RhYmxlLT5jb2RpbmdfdW5pdF9zaXplOworICAgICAgICBnb3RvIGVuY29kZV9jb2RpbmdfdW5pdDsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnF1YWxpdHkgPSBjdHgtPnFzY2FsZSAqIEZGX1FQMkxBTUJEQTsKKworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRueGhkX2VuY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEROWEhERW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgbWF4X2xldmVsICAgICAgICA9IDEgPDwgKGN0eC0+Y2lkX3RhYmxlLT5iaXRfZGVwdGggKyAyKTsKKyAgICBpbnQgaTsKKworICAgIGF2X2ZyZWUoY3R4LT52bGNfY29kZXMgLSBtYXhfbGV2ZWwgKiAyKTsKKyAgICBhdl9mcmVlKGN0eC0+dmxjX2JpdHMgLSBtYXhfbGV2ZWwgKiAyKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5ydW5fY29kZXMpOworICAgIGF2X2ZyZWVwKCZjdHgtPnJ1bl9iaXRzKTsKKworICAgIGF2X2ZyZWVwKCZjdHgtPm1iX2JpdHMpOworICAgIGF2X2ZyZWVwKCZjdHgtPm1iX3FzY2FsZSk7CisgICAgYXZfZnJlZXAoJmN0eC0+bWJfcmMpOworICAgIGF2X2ZyZWVwKCZjdHgtPm1iX2NtcCk7CisgICAgYXZfZnJlZXAoJmN0eC0+c2xpY2Vfc2l6ZSk7CisgICAgYXZfZnJlZXAoJmN0eC0+c2xpY2Vfb2Zmcyk7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5xbWF0cml4X2MpOworICAgIGF2X2ZyZWVwKCZjdHgtPnFtYXRyaXhfbCk7CisgICAgYXZfZnJlZXAoJmN0eC0+cW1hdHJpeF9jMTYpOworICAgIGF2X2ZyZWVwKCZjdHgtPnFtYXRyaXhfbDE2KTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBhdmN0eC0+dGhyZWFkX2NvdW50OyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZjdHgtPnRocmVhZFtpXSk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjRGVmYXVsdCBkbnhoZF9kZWZhdWx0c1tdID0geworICAgIHsgInFtYXgiLCAiMTAyNCIgfSwgLyogTWF4aW11bSBxdWFudGl6YXRpb24gc2NhbGUgZmFjdG9yIGFsbG93ZWQgZm9yIFZDLTMgKi8KKyAgICB7IE5VTEwgfSwKK307CisKK0FWQ29kZWMgZmZfZG54aGRfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZG54aGQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWQzMvRE54SEQiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRE5YSEQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEROWEhERW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZG54aGRfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZG54aGRfZW5jb2RlX3BpY3R1cmUsCisgICAgLmNsb3NlICAgICAgICAgID0gZG54aGRfZW5jb2RlX2VuZCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUywKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZG54aGRfY2xhc3MsCisgICAgLmRlZmF1bHRzICAgICAgID0gZG54aGRfZGVmYXVsdHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZG54aGRlbmMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2RueGhkZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmMGI5NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RueGhkZW5jLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIFZDMy9ETnhIRCBlbmNvZGVyIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBhbmQgcHJvdG90eXBlcworICogQ29weXJpZ2h0IChjKSAyMDA3IEJhcHRpc3RlIENvdWR1cmllciA8YmFwdGlzdGUgZG90IGNvdWR1cmllciBhdCBzbWFydGpvZyBkb3QgY29tPgorICoKKyAqIFZDLTMgZW5jb2RlciBmdW5kZWQgYnkgdGhlIEJyaXRpc2ggQnJvYWRjYXN0aW5nIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19ETlhIREVOQ19ICisjZGVmaW5lIEFWQ09ERUNfRE5YSERFTkNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJkbnhoZGRhdGEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUkNDTVBFbnRyeSB7CisgICAgdWludDE2X3QgbWI7CisgICAgaW50IHZhbHVlOworfSBSQ0NNUEVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBSQ0VudHJ5IHsKKyAgICBpbnQgc3NkOworICAgIGludCBiaXRzOworfSBSQ0VudHJ5OworCit0eXBlZGVmIHN0cnVjdCBETlhIREVuY0NvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIEJsb2NrRFNQQ29udGV4dCBiZHNwOworICAgIE1wZWdFbmNDb250ZXh0IG07IC8vLzwgVXNlZCBmb3IgcXVhbnRpemF0aW9uIGRzcCBmdW5jdGlvbnMKKworICAgIGludCBjaWQ7CisgICAgY29uc3QgQ0lERW50cnkgKmNpZF90YWJsZTsKKyAgICB1aW50OF90ICptc2lwOyAvLy88IE1hY3JvYmxvY2sgU2NhbiBJbmRleGVzIFBheWxvYWQKKyAgICB1aW50MzJfdCAqc2xpY2Vfc2l6ZTsKKyAgICB1aW50MzJfdCAqc2xpY2Vfb2ZmczsKKworICAgIHN0cnVjdCBETlhIREVuY0NvbnRleHQgKnRocmVhZFtNQVhfVEhSRUFEU107CisKKyAgICAvLyBCZWNhdXNlIG91ciBzYW1wbGVzIGFyZSBlaXRoZXIgOCBvciAxNiBiaXRzIGZvciA4LWJpdCBhbmQgMTAtYml0CisgICAgLy8gZW5jb2RpbmcgcmVzcGVjdGl2ZWx5LCB0aGVzZSByZWZlciBlaXRoZXIgdG8gYnl0ZXMgb3IgdG8gdHdvLWJ5dGUgd29yZHMuCisgICAgdW5zaWduZWQgZGN0X3lfb2Zmc2V0OworICAgIHVuc2lnbmVkIGRjdF91dl9vZmZzZXQ7CisgICAgdW5zaWduZWQgYmxvY2tfd2lkdGhfbDI7CisKKyAgICBpbnQgaW50ZXJsYWNlZDsKKyAgICBpbnQgY3VyX2ZpZWxkOworCisgICAgaW50IG5pdHJpc19jb21wYXQ7CisgICAgdW5zaWduZWQgbWluX3BhZGRpbmc7CisKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrcylbOF1bNjRdOworCisgICAgaW50ICAgICAgKCpxbWF0cml4X2MpICAgICBbNjRdOworICAgIGludCAgICAgICgqcW1hdHJpeF9sKSAgICAgWzY0XTsKKyAgICB1aW50MTZfdCAoKnFtYXRyaXhfbDE2KVsyXVs2NF07CisgICAgdWludDE2X3QgKCpxbWF0cml4X2MxNilbMl1bNjRdOworCisgICAgdW5zaWduZWQgZnJhbWVfYml0czsKKyAgICB1aW50OF90ICpzcmNbM107CisKKyAgICB1aW50MzJfdCAqdmxjX2NvZGVzOworICAgIHVpbnQ4X3QgICp2bGNfYml0czsKKyAgICB1aW50MTZfdCAqcnVuX2NvZGVzOworICAgIHVpbnQ4X3QgICpydW5fYml0czsKKworICAgIC8qKiBSYXRlIGNvbnRyb2wgKi8KKyAgICB1bnNpZ25lZCBzbGljZV9iaXRzOworICAgIHVuc2lnbmVkIHFzY2FsZTsKKyAgICB1bnNpZ25lZCBsYW1iZGE7CisKKyAgICB1aW50MTZfdCAqbWJfYml0czsKKyAgICB1aW50OF90ICAqbWJfcXNjYWxlOworCisgICAgUkNDTVBFbnRyeSAqbWJfY21wOworICAgIFJDRW50cnkgICAoKm1iX3JjKVs4MTYwXTsKKworICAgIHZvaWQgKCpnZXRfcGl4ZWxzXzh4NF9zeW0pKGludDE2X3QgKiAvKiBhbGlnbiAxNiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCk7Cit9IEROWEhERW5jQ29udGV4dDsKKwordm9pZCBmZl9kbnhoZGVuY19pbml0X3g4NihETlhIREVuY0NvbnRleHQgKmN0eCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0ROWEhERU5DX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RwY20uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RwY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M3YTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHBjbS5jCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQXNzb3J0ZWQgRFBDTSBjb2RlY3MKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQXNzb3J0ZWQgRFBDTSAoZGlmZmVyZW50aWFsIHB1bHNlIGNvZGUgbW9kdWxhdGlvbikgYXVkaW8gY29kZWNzCisgKiBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQorICogWGFuIERQQ00gZGVjb2RlciBieSBNYXJpbyBCcml0byAobWJyaXRvQHN0dWRlbnQuZGVpLnVjLnB0KQorICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHNwZWNpZmljIGRhdGEgZm9ybWF0cywgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzL3NpbXBsZWF1ZGlvLmh0bWwKKyAqIFNPTCBEUENNcyBpbXBsZW1lbnRlZCBieSBLb25zdGFudGluIFNoaXNoa292CisgKgorICogTm90ZSBhYm91dCB1c2luZyB0aGUgWGFuIERQQ00gZGVjb2RlcjogWGFuIERQQ00gaXMgdXNlZCBpbiBBVkkgZmlsZXMKKyAqIGZvdW5kIGluIHRoZSBXaW5nIENvbW1hbmRlciBJViBjb21wdXRlciBnYW1lLiBUaGVzZSBBVkkgZmlsZXMgY29udGFpbgorICogV0FWRUZPUk1BVCBoZWFkZXJzIHdoaWNoIHJlcG9ydCB0aGUgYXVkaW8gZm9ybWF0IGFzIDB4MDE6IHJhdyBQQ00uCisgKiBDbGVhcmx5IGluY29ycmVjdC4gVG8gZGV0ZWN0IFhhbiBEUENNLCB5b3Ugd2lsbCBwcm9iYWJseSBoYXZlIHRvCisgKiBzcGVjaWFsLWNhc2UgeW91ciBBVkkgZGVtdXhlciB0byB1c2UgWGFuIERQQ00gaWYgdGhlIGZpbGUgdXNlcyAnWHhhbicKKyAqIChYYW4gdmlkZW8pIGZvciBpdHMgdmlkZW8gY29kZWMuIEFsdGVybmF0ZWx5LCBzdWNoIEFWSSBmaWxlcyBhbHNvIGNvbnRhaW4KKyAqIHRoZSBmb3VyY2MgJ0F4YW4nIGluIHRoZSAnYXVkcycgY2h1bmsgb2YgdGhlIEFWSSBoZWFkZXIuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCit0eXBlZGVmIHN0cnVjdCBEUENNQ29udGV4dCB7CisgICAgaW50MTZfdCByb3Ffc3F1YXJlX2FycmF5WzI1Nl07CisgICAgaW50IHNhbXBsZVsyXTsgICAgICAgICAgICAgICAgICAvLy88IHByZXZpb3VzIHNhbXBsZSAoZm9yIFNPTF9EUENNKQorICAgIGNvbnN0IGludDhfdCAqc29sX3RhYmxlOyAgICAgICAgLy8vPCBkZWx0YSB0YWJsZSBmb3IgU09MX0RQQ00KK30gRFBDTUNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGludGVycGxheV9kZWx0YV90YWJsZVtdID0geworICAgICAgICAgMCwgICAgICAxLCAgICAgIDIsICAgICAgMywgICAgICA0LCAgICAgIDUsICAgICAgNiwgICAgICA3LAorICAgICAgICAgOCwgICAgICA5LCAgICAgMTAsICAgICAxMSwgICAgIDEyLCAgICAgMTMsICAgICAxNCwgICAgIDE1LAorICAgICAgICAxNiwgICAgIDE3LCAgICAgMTgsICAgICAxOSwgICAgIDIwLCAgICAgMjEsICAgICAyMiwgICAgIDIzLAorICAgICAgICAyNCwgICAgIDI1LCAgICAgMjYsICAgICAyNywgICAgIDI4LCAgICAgMjksICAgICAzMCwgICAgIDMxLAorICAgICAgICAzMiwgICAgIDMzLCAgICAgMzQsICAgICAzNSwgICAgIDM2LCAgICAgMzcsICAgICAzOCwgICAgIDM5LAorICAgICAgICA0MCwgICAgIDQxLCAgICAgNDIsICAgICA0MywgICAgIDQ3LCAgICAgNTEsICAgICA1NiwgICAgIDYxLAorICAgICAgICA2NiwgICAgIDcyLCAgICAgNzksICAgICA4NiwgICAgIDk0LCAgICAxMDIsICAgIDExMiwgICAgMTIyLAorICAgICAgIDEzMywgICAgMTQ1LCAgICAxNTgsICAgIDE3MywgICAgMTg5LCAgICAyMDYsICAgIDIyNSwgICAgMjQ1LAorICAgICAgIDI2NywgICAgMjkyLCAgICAzMTgsICAgIDM0OCwgICAgMzc5LCAgICA0MTQsICAgIDQ1MiwgICAgNDkzLAorICAgICAgIDUzOCwgICAgNTg3LCAgICA2NDAsICAgIDY5OSwgICAgNzYzLCAgICA4MzIsICAgIDkwOCwgICAgOTkxLAorICAgICAgMTA4MSwgICAxMTgwLCAgIDEyODgsICAgMTQwNSwgICAxNTM0LCAgIDE2NzMsICAgMTgyNiwgICAxOTkzLAorICAgICAgMjE3NSwgICAyMzczLCAgIDI1OTAsICAgMjgyNiwgICAzMDg0LCAgIDMzNjUsICAgMzY3MiwgICA0MDA4LAorICAgICAgNDM3MywgICA0NzcyLCAgIDUyMDgsICAgNTY4MywgICA2MjAyLCAgIDY3NjcsICAgNzM4NSwgICA4MDU5LAorICAgICAgODc5NCwgICA5NTk3LCAgMTA0NzIsICAxMTQyOCwgIDEyNDcxLCAgMTM2MDksICAxNDg1MSwgIDE2MjA2LAorICAgICAxNzY4NSwgIDE5Mjk4LCAgMjEwNjAsICAyMjk4MSwgIDI1MDc4LCAgMjczNjcsICAyOTg2NCwgIDMyNTg5LAorICAgIC0yOTk3MywgLTI2NzI4LCAtMjMxODYsIC0xOTMyMiwgLTE1MTA1LCAtMTA1MDMsICAtNTQ4MSwgICAgIC0xLAorICAgICAgICAgMSwgICAgICAxLCAgIDU0ODEsICAxMDUwMywgIDE1MTA1LCAgMTkzMjIsICAyMzE4NiwgIDI2NzI4LAorICAgICAyOTk3MywgLTMyNTg5LCAtMjk4NjQsIC0yNzM2NywgLTI1MDc4LCAtMjI5ODEsIC0yMTA2MCwgLTE5Mjk4LAorICAgIC0xNzY4NSwgLTE2MjA2LCAtMTQ4NTEsIC0xMzYwOSwgLTEyNDcxLCAtMTE0MjgsIC0xMDQ3MiwgIC05NTk3LAorICAgICAtODc5NCwgIC04MDU5LCAgLTczODUsICAtNjc2NywgIC02MjAyLCAgLTU2ODMsICAtNTIwOCwgIC00NzcyLAorICAgICAtNDM3MywgIC00MDA4LCAgLTM2NzIsICAtMzM2NSwgIC0zMDg0LCAgLTI4MjYsICAtMjU5MCwgIC0yMzczLAorICAgICAtMjE3NSwgIC0xOTkzLCAgLTE4MjYsICAtMTY3MywgIC0xNTM0LCAgLTE0MDUsICAtMTI4OCwgIC0xMTgwLAorICAgICAtMTA4MSwgICAtOTkxLCAgIC05MDgsICAgLTgzMiwgICAtNzYzLCAgIC02OTksICAgLTY0MCwgICAtNTg3LAorICAgICAgLTUzOCwgICAtNDkzLCAgIC00NTIsICAgLTQxNCwgICAtMzc5LCAgIC0zNDgsICAgLTMxOCwgICAtMjkyLAorICAgICAgLTI2NywgICAtMjQ1LCAgIC0yMjUsICAgLTIwNiwgICAtMTg5LCAgIC0xNzMsICAgLTE1OCwgICAtMTQ1LAorICAgICAgLTEzMywgICAtMTIyLCAgIC0xMTIsICAgLTEwMiwgICAgLTk0LCAgICAtODYsICAgIC03OSwgICAgLTcyLAorICAgICAgIC02NiwgICAgLTYxLCAgICAtNTYsICAgIC01MSwgICAgLTQ3LCAgICAtNDMsICAgIC00MiwgICAgLTQxLAorICAgICAgIC00MCwgICAgLTM5LCAgICAtMzgsICAgIC0zNywgICAgLTM2LCAgICAtMzUsICAgIC0zNCwgICAgLTMzLAorICAgICAgIC0zMiwgICAgLTMxLCAgICAtMzAsICAgIC0yOSwgICAgLTI4LCAgICAtMjcsICAgIC0yNiwgICAgLTI1LAorICAgICAgIC0yNCwgICAgLTIzLCAgICAtMjIsICAgIC0yMSwgICAgLTIwLCAgICAtMTksICAgIC0xOCwgICAgLTE3LAorICAgICAgIC0xNiwgICAgLTE1LCAgICAtMTQsICAgIC0xMywgICAgLTEyLCAgICAtMTEsICAgIC0xMCwgICAgIC05LAorICAgICAgICAtOCwgICAgIC03LCAgICAgLTYsICAgICAtNSwgICAgIC00LCAgICAgLTMsICAgICAtMiwgICAgIC0xCisKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3Qgc29sX3RhYmxlX29sZFsxNl0gPSB7CisgICAgICAweDAsICAweDEsICAweDIsICAweDMsICAweDYsICAweEEsICAweEYsIDB4MTUsCisgICAgLTB4MTUsIC0weEYsIC0weEEsIC0weDYsIC0weDMsIC0weDIsIC0weDEsICAweDAKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3Qgc29sX3RhYmxlX25ld1sxNl0gPSB7CisgICAgMHgwLCAgMHgxLCAgMHgyLCAgMHgzLCAgMHg2LCAgMHhBLCAgMHhGLCAgMHgxNSwKKyAgICAweDAsIC0weDEsIC0weDIsIC0weDMsIC0weDYsIC0weEEsIC0weEYsIC0weDE1Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBzb2xfdGFibGVfMTZbMTI4XSA9IHsKKyAgICAweDAwMCwgMHgwMDgsIDB4MDEwLCAweDAyMCwgMHgwMzAsIDB4MDQwLCAweDA1MCwgMHgwNjAsIDB4MDcwLCAweDA4MCwKKyAgICAweDA5MCwgMHgwQTAsIDB4MEIwLCAweDBDMCwgMHgwRDAsIDB4MEUwLCAweDBGMCwgMHgxMDAsIDB4MTEwLCAweDEyMCwKKyAgICAweDEzMCwgMHgxNDAsIDB4MTUwLCAweDE2MCwgMHgxNzAsIDB4MTgwLCAweDE5MCwgMHgxQTAsIDB4MUIwLCAweDFDMCwKKyAgICAweDFEMCwgMHgxRTAsIDB4MUYwLCAweDIwMCwgMHgyMDgsIDB4MjEwLCAweDIxOCwgMHgyMjAsIDB4MjI4LCAweDIzMCwKKyAgICAweDIzOCwgMHgyNDAsIDB4MjQ4LCAweDI1MCwgMHgyNTgsIDB4MjYwLCAweDI2OCwgMHgyNzAsIDB4Mjc4LCAweDI4MCwKKyAgICAweDI4OCwgMHgyOTAsIDB4Mjk4LCAweDJBMCwgMHgyQTgsIDB4MkIwLCAweDJCOCwgMHgyQzAsIDB4MkM4LCAweDJEMCwKKyAgICAweDJEOCwgMHgyRTAsIDB4MkU4LCAweDJGMCwgMHgyRjgsIDB4MzAwLCAweDMwOCwgMHgzMTAsIDB4MzE4LCAweDMyMCwKKyAgICAweDMyOCwgMHgzMzAsIDB4MzM4LCAweDM0MCwgMHgzNDgsIDB4MzUwLCAweDM1OCwgMHgzNjAsIDB4MzY4LCAweDM3MCwKKyAgICAweDM3OCwgMHgzODAsIDB4Mzg4LCAweDM5MCwgMHgzOTgsIDB4M0EwLCAweDNBOCwgMHgzQjAsIDB4M0I4LCAweDNDMCwKKyAgICAweDNDOCwgMHgzRDAsIDB4M0Q4LCAweDNFMCwgMHgzRTgsIDB4M0YwLCAweDNGOCwgMHg0MDAsIDB4NDQwLCAweDQ4MCwKKyAgICAweDRDMCwgMHg1MDAsIDB4NTQwLCAweDU4MCwgMHg1QzAsIDB4NjAwLCAweDY0MCwgMHg2ODAsIDB4NkMwLCAweDcwMCwKKyAgICAweDc0MCwgMHg3ODAsIDB4N0MwLCAweDgwMCwgMHg5MDAsIDB4QTAwLCAweEIwMCwgMHhDMDAsIDB4RDAwLCAweEUwMCwKKyAgICAweEYwMCwgMHgxMDAwLCAweDE0MDAsIDB4MTgwMCwgMHgxQzAwLCAweDIwMDAsIDB4MzAwMCwgMHg0MDAwCit9OworCisKK3N0YXRpYyBhdl9jb2xkIGludCBkcGNtX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBEUENNQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDwgMSB8fCBhdmN0eC0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPnNhbXBsZVswXSA9IHMtPnNhbXBsZVsxXSA9IDA7CisKKyAgICBzd2l0Y2goYXZjdHgtPmNvZGVjLT5pZCkgeworCisgICAgY2FzZSBBVl9DT0RFQ19JRF9ST1FfRFBDTToKKyAgICAgICAgLyogaW5pdGlhbGl6ZSBzcXVhcmUgdGFibGUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgICAgICBpbnQxNl90IHNxdWFyZSA9IGkgKiBpOworICAgICAgICAgICAgcy0+cm9xX3NxdWFyZV9hcnJheVtpICAgICAgXSA9ICBzcXVhcmU7CisgICAgICAgICAgICBzLT5yb3Ffc3F1YXJlX2FycmF5W2kgKyAxMjhdID0gLXNxdWFyZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZfQ09ERUNfSURfU09MX0RQQ006CisgICAgICAgIHN3aXRjaChhdmN0eC0+Y29kZWNfdGFnKXsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcy0+c29sX3RhYmxlID0gc29sX3RhYmxlX29sZDsKKyAgICAgICAgICAgIHMtPnNhbXBsZVswXSA9IHMtPnNhbXBsZVsxXSA9IDB4ODA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcy0+c29sX3RhYmxlID0gc29sX3RhYmxlX25ldzsKKyAgICAgICAgICAgIHMtPnNhbXBsZVswXSA9IHMtPnNhbXBsZVsxXSA9IDB4ODA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gU09MIHN1YmNvZGVjXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX1NPTF9EUENNICYmIGF2Y3R4LT5jb2RlY190YWcgIT0gMykKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1U4OworICAgIGVsc2UKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZHBjbV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBEUENNQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIGludCBvdXQgPSAwLCByZXQ7CisgICAgaW50IHByZWRpY3RvclsyXTsKKyAgICBpbnQgY2ggPSAwOworICAgIGludCBzdGVyZW8gPSBhdmN0eC0+Y2hhbm5lbHMgLSAxOworICAgIGludDE2X3QgKm91dHB1dF9zYW1wbGVzLCAqc2FtcGxlc19lbmQ7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisKKyAgICBpZiAoc3RlcmVvICYmIChidWZfc2l6ZSAmIDEpKQorICAgICAgICBidWZfc2l6ZS0tOworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBhdnBrdC0+ZGF0YSwgYnVmX3NpemUpOworCisgICAgLyogY2FsY3VsYXRlIG91dHB1dCBzaXplICovCisgICAgc3dpdGNoKGF2Y3R4LT5jb2RlYy0+aWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1JPUV9EUENNOgorICAgICAgICBvdXQgPSBidWZfc2l6ZSAtIDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfSU5URVJQTEFZX0RQQ006CisgICAgICAgIG91dCA9IGJ1Zl9zaXplIC0gNiAtIGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9YQU5fRFBDTToKKyAgICAgICAgb3V0ID0gYnVmX3NpemUgLSAyICogYXZjdHgtPmNoYW5uZWxzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1NPTF9EUENNOgorICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3RhZyAhPSAzKQorICAgICAgICAgICAgb3V0ID0gYnVmX3NpemUgKiAyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQgPSBidWZfc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChvdXQgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBhY2tldCBpcyB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAob3V0ICUgYXZjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJjaGFubmVscyBoYXZlIGRpZmZlcmluZyBudW1iZXIgb2Ygc2FtcGxlc1xuIik7CisgICAgfQorCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IChvdXQgKyBhdmN0eC0+Y2hhbm5lbHMgLSAxKSAvIGF2Y3R4LT5jaGFubmVsczsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG91dHB1dF9zYW1wbGVzID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKyAgICBzYW1wbGVzX2VuZCA9IG91dHB1dF9zYW1wbGVzICsgb3V0OworCisgICAgc3dpdGNoKGF2Y3R4LT5jb2RlYy0+aWQpIHsKKworICAgIGNhc2UgQVZfQ09ERUNfSURfUk9RX0RQQ006CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgNik7CisKKyAgICAgICAgaWYgKHN0ZXJlbykgeworICAgICAgICAgICAgcHJlZGljdG9yWzFdID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYikgPDwgOCwgMTYpOworICAgICAgICAgICAgcHJlZGljdG9yWzBdID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYikgPDwgOCwgMTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJlZGljdG9yWzBdID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYiksIDE2KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRlY29kZSB0aGUgc2FtcGxlcyAqLworICAgICAgICB3aGlsZSAob3V0cHV0X3NhbXBsZXMgPCBzYW1wbGVzX2VuZCkgeworICAgICAgICAgICAgcHJlZGljdG9yW2NoXSArPSBzLT5yb3Ffc3F1YXJlX2FycmF5W2J5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpXTsKKyAgICAgICAgICAgIHByZWRpY3RvcltjaF0gID0gYXZfY2xpcF9pbnQxNihwcmVkaWN0b3JbY2hdKTsKKyAgICAgICAgICAgICpvdXRwdXRfc2FtcGxlcysrID0gcHJlZGljdG9yW2NoXTsKKworICAgICAgICAgICAgLyogdG9nZ2xlIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGNoIF49IHN0ZXJlbzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZfQ09ERUNfSURfSU5URVJQTEFZX0RQQ006CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgNik7ICAvKiBza2lwIG92ZXIgdGhlIHN0cmVhbSBtYXNrIGFuZCBzdHJlYW0gbGVuZ3RoICovCisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBwcmVkaWN0b3JbY2hdID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYiksIDE2KTsKKyAgICAgICAgICAgICpvdXRwdXRfc2FtcGxlcysrID0gcHJlZGljdG9yW2NoXTsKKyAgICAgICAgfQorCisgICAgICAgIGNoID0gMDsKKyAgICAgICAgd2hpbGUgKG91dHB1dF9zYW1wbGVzIDwgc2FtcGxlc19lbmQpIHsKKyAgICAgICAgICAgIHByZWRpY3RvcltjaF0gKz0gaW50ZXJwbGF5X2RlbHRhX3RhYmxlW2J5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpXTsKKyAgICAgICAgICAgIHByZWRpY3RvcltjaF0gID0gYXZfY2xpcF9pbnQxNihwcmVkaWN0b3JbY2hdKTsKKyAgICAgICAgICAgICpvdXRwdXRfc2FtcGxlcysrID0gcHJlZGljdG9yW2NoXTsKKworICAgICAgICAgICAgLyogdG9nZ2xlIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGNoIF49IHN0ZXJlbzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZfQ09ERUNfSURfWEFOX0RQQ006CisgICAgeworICAgICAgICBpbnQgc2hpZnRbMl0gPSB7IDQsIDQgfTsKKworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBhdmN0eC0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBwcmVkaWN0b3JbY2hdID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYiksIDE2KTsKKworICAgICAgICBjaCA9IDA7CisgICAgICAgIHdoaWxlIChvdXRwdXRfc2FtcGxlcyA8IHNhbXBsZXNfZW5kKSB7CisgICAgICAgICAgICBpbnQgZGlmZiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgaW50IG4gICAgPSBkaWZmICYgMzsKKworICAgICAgICAgICAgaWYgKG4gPT0gMykKKyAgICAgICAgICAgICAgICBzaGlmdFtjaF0rKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzaGlmdFtjaF0gLT0gKDIgKiBuKTsKKyAgICAgICAgICAgIGRpZmYgPSBzaWduX2V4dGVuZCgoZGlmZiAmfiAzKSA8PCA4LCAxNik7CisKKyAgICAgICAgICAgIC8qIHNhdHVyYXRlIHRoZSBzaGlmdGVyIHRvIGEgbG93ZXIgbGltaXQgb2YgMCAqLworICAgICAgICAgICAgaWYgKHNoaWZ0W2NoXSA8IDApCisgICAgICAgICAgICAgICAgc2hpZnRbY2hdID0gMDsKKworICAgICAgICAgICAgZGlmZiA+Pj0gc2hpZnRbY2hdOworICAgICAgICAgICAgcHJlZGljdG9yW2NoXSArPSBkaWZmOworCisgICAgICAgICAgICBwcmVkaWN0b3JbY2hdID0gYXZfY2xpcF9pbnQxNihwcmVkaWN0b3JbY2hdKTsKKyAgICAgICAgICAgICpvdXRwdXRfc2FtcGxlcysrID0gcHJlZGljdG9yW2NoXTsKKworICAgICAgICAgICAgLyogdG9nZ2xlIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGNoIF49IHN0ZXJlbzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBVl9DT0RFQ19JRF9TT0xfRFBDTToKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgIT0gMykgeworICAgICAgICAgICAgdWludDhfdCAqb3V0cHV0X3NhbXBsZXNfdTggPSBmcmFtZS0+ZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgKnNhbXBsZXNfZW5kX3U4ID0gb3V0cHV0X3NhbXBsZXNfdTggKyBvdXQ7CisgICAgICAgICAgICB3aGlsZSAob3V0cHV0X3NhbXBsZXNfdTggPCBzYW1wbGVzX2VuZF91OCkgeworICAgICAgICAgICAgICAgIGludCBuID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisKKyAgICAgICAgICAgICAgICBzLT5zYW1wbGVbMF0gKz0gcy0+c29sX3RhYmxlW24gPj4gNF07CisgICAgICAgICAgICAgICAgcy0+c2FtcGxlWzBdICA9IGF2X2NsaXBfdWludDgocy0+c2FtcGxlWzBdKTsKKyAgICAgICAgICAgICAgICAqb3V0cHV0X3NhbXBsZXNfdTgrKyA9IHMtPnNhbXBsZVswXTsKKworICAgICAgICAgICAgICAgIHMtPnNhbXBsZVtzdGVyZW9dICs9IHMtPnNvbF90YWJsZVtuICYgMHgwRl07CisgICAgICAgICAgICAgICAgcy0+c2FtcGxlW3N0ZXJlb10gID0gYXZfY2xpcF91aW50OChzLT5zYW1wbGVbc3RlcmVvXSk7CisgICAgICAgICAgICAgICAgKm91dHB1dF9zYW1wbGVzX3U4KysgPSBzLT5zYW1wbGVbc3RlcmVvXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdoaWxlIChvdXRwdXRfc2FtcGxlcyA8IHNhbXBsZXNfZW5kKSB7CisgICAgICAgICAgICAgICAgaW50IG4gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICBpZiAobiAmIDB4ODApIHMtPnNhbXBsZVtjaF0gLT0gc29sX3RhYmxlXzE2W24gJiAweDdGXTsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgIHMtPnNhbXBsZVtjaF0gKz0gc29sX3RhYmxlXzE2W24gJiAweDdGXTsKKyAgICAgICAgICAgICAgICBzLT5zYW1wbGVbY2hdID0gYXZfY2xpcF9pbnQxNihzLT5zYW1wbGVbY2hdKTsKKyAgICAgICAgICAgICAgICAqb3V0cHV0X3NhbXBsZXMrKyA9IHMtPnNhbXBsZVtjaF07CisgICAgICAgICAgICAgICAgLyogdG9nZ2xlIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICBjaCBePSBzdGVyZW87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCisjZGVmaW5lIERQQ01fREVDT0RFUihpZF8sIG5hbWVfLCBsb25nX25hbWVfKSAgICAgICAgICAgICAgICBcCitBVkNvZGVjIGZmXyAjIyBuYW1lXyAjIyBfZGVjb2RlciA9IHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm5hbWUgICAgICAgICAgID0gI25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwobG9uZ19uYW1lXyksICAgICBcCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLCAgICAgICAgICAgICAgICAgICBcCisgICAgLmlkICAgICAgICAgICAgID0gaWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKERQQ01Db250ZXh0KSwgICAgICAgICAgICAgICAgICBcCisgICAgLmluaXQgICAgICAgICAgID0gZHBjbV9kZWNvZGVfaW5pdCwgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmRlY29kZSAgICAgICAgID0gZHBjbV9kZWNvZGVfZnJhbWUsICAgICAgICAgICAgICAgICAgICBcCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0RQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9JTlRFUlBMQVlfRFBDTSwgaW50ZXJwbGF5X2RwY20sICJEUENNIEludGVycGxheSIpOworRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX1JPUV9EUENNLCAgICAgICByb3FfZHBjbSwgICAgICAgIkRQQ00gaWQgUm9RIik7CitEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfU09MX0RQQ00sICAgICAgIHNvbF9kcGNtLCAgICAgICAiRFBDTSBTb2wiKTsKK0RQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9YQU5fRFBDTSwgICAgICAgeGFuX2RwY20sICAgICAgICJEUENNIFhhbiIpOwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHB4LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kcHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc4NDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHB4LmMKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiBEUFggKC5kcHgpIGltYWdlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBKaW1teSBDaHJpc3RlbnNlbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCByZWFkMTYoY29uc3QgdWludDhfdCAqKnB0ciwgaW50IGlzX2JpZykKK3sKKyAgICB1bnNpZ25lZCBpbnQgdGVtcDsKKyAgICBpZiAoaXNfYmlnKSB7CisgICAgICAgIHRlbXAgPSBBVl9SQjE2KCpwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXAgPSBBVl9STDE2KCpwdHIpOworICAgIH0KKyAgICAqcHRyICs9IDI7CisgICAgcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZDMyKGNvbnN0IHVpbnQ4X3QgKipwdHIsIGludCBpc19iaWcpCit7CisgICAgdW5zaWduZWQgaW50IHRlbXA7CisgICAgaWYgKGlzX2JpZykgeworICAgICAgICB0ZW1wID0gQVZfUkIzMigqcHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZW1wID0gQVZfUkwzMigqcHRyKTsKKyAgICB9CisgICAgKnB0ciArPSA0OworICAgIHJldHVybiB0ZW1wOworfQorCitzdGF0aWMgdWludDE2X3QgcmVhZDEwaW4zMihjb25zdCB1aW50OF90ICoqcHRyLCB1aW50MzJfdCAqIGxidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICogbl9kYXR1bSwgaW50IGlzX2JpZykKK3sKKyAgICBpZiAoKm5fZGF0dW0pCisgICAgICAgICgqbl9kYXR1bSktLTsKKyAgICBlbHNlIHsKKyAgICAgICAgKmxidWYgPSByZWFkMzIocHRyLCBpc19iaWcpOworICAgICAgICAqbl9kYXR1bSA9IDI7CisgICAgfQorCisgICAgKmxidWYgPSAoKmxidWYgPDwgMTApIHwgKCpsYnVmID4+IDIyKTsKKworICAgIHJldHVybiAqbGJ1ZiAmIDB4M0ZGOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgQVZGcmFtZSAqY29uc3QgcCA9IGRhdGE7CisgICAgdWludDhfdCAqcHRyW0FWX05VTV9EQVRBX1BPSU5URVJTXTsKKworICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisgICAgaW50IG1hZ2ljX251bSwgZW5kaWFuOworICAgIGludCB4LCB5LCBzdHJpZGUsIGksIHJldDsKKyAgICBpbnQgdywgaCwgYml0c19wZXJfY29sb3IsIGRlc2NyaXB0b3IsIGVsZW1lbnRzLCBwYWNraW5nOworICAgIGludCBlbmNvZGluZywgbmVlZF9hbGlnbiA9IDA7CisKKyAgICB1bnNpZ25lZCBpbnQgcmdiQnVmZmVyID0gMDsKKyAgICBpbnQgbl9kYXR1bSA9IDA7CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPD0gMTYzNCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCB0b28gc21hbGwgZm9yIERQWCBoZWFkZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBtYWdpY19udW0gPSBBVl9SQjMyKGJ1Zik7CisgICAgYnVmICs9IDQ7CisKKyAgICAvKiBDaGVjayBpZiB0aGUgZmlsZXMgIm1hZ2ljIG51bWJlciIgaXMgIlNEUFgiIHdoaWNoIG1lYW5zIGl0IHVzZXMKKyAgICAgKiBiaWctZW5kaWFuIG9yIFhQRFMgd2hpY2ggaXMgZm9yIGxpdHRsZS1lbmRpYW4gZmlsZXMgKi8KKyAgICBpZiAobWFnaWNfbnVtID09IEFWX1JMMzIoIlNEUFgiKSkgeworICAgICAgICBlbmRpYW4gPSAwOworICAgIH0gZWxzZSBpZiAobWFnaWNfbnVtID09IEFWX1JCMzIoIlNEUFgiKSkgeworICAgICAgICBlbmRpYW4gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRFBYIG1hcmtlciBub3QgZm91bmRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBvZmZzZXQgPSByZWFkMzIoJmJ1ZiwgZW5kaWFuKTsKKyAgICBpZiAoYXZwa3QtPnNpemUgPD0gb2Zmc2V0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBkYXRhIHN0YXJ0IG9mZnNldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8vIENoZWNrIGVuY3J5cHRpb24KKyAgICBidWYgPSBhdnBrdC0+ZGF0YSArIDY2MDsKKyAgICByZXQgPSByZWFkMzIoJmJ1ZiwgZW5kaWFuKTsKKyAgICBpZiAocmV0ICE9IDB4RkZGRkZGRkYpIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJFbmNyeXB0aW9uIik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaGUgaW1hZ2UgaXMgZW5jcnlwdGVkIGFuZCBtYXkgIgorICAgICAgICAgICAgICAgIm5vdCBwcm9wZXJseSBkZWNvZGUuXG4iKTsKKyAgICB9CisKKyAgICAvLyBOZWVkIHRvIGVuZCBpbiAweDMwNCBvZmZzZXQgZnJvbSBzdGFydCBvZiBmaWxlCisgICAgYnVmID0gYXZwa3QtPmRhdGEgKyAweDMwNDsKKyAgICB3ID0gcmVhZDMyKCZidWYsIGVuZGlhbik7CisgICAgaCA9IHJlYWQzMigmYnVmLCBlbmRpYW4pOworCisgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgdywgaCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8vIE5lZWQgdG8gZW5kIGluIDB4MzIwIHRvIHJlYWQgdGhlIGRlc2NyaXB0b3IKKyAgICBidWYgKz0gMjA7CisgICAgZGVzY3JpcHRvciA9IGJ1ZlswXTsKKworICAgIC8vIE5lZWQgdG8gZW5kIGluIDB4MzIzIHRvIHJlYWQgdGhlIGJpdHMgcGVyIGNvbG9yCisgICAgYnVmICs9IDM7CisgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPQorICAgIGJpdHNfcGVyX2NvbG9yID0gYnVmWzBdOworICAgIGJ1ZisrOworICAgIHBhY2tpbmcgPSByZWFkMTYoJmJ1ZiwgZW5kaWFuKTsKKyAgICBlbmNvZGluZyA9IHJlYWQxNigmYnVmLCBlbmRpYW4pOworCisgICAgaWYgKHBhY2tpbmcgPiAxKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiUGFja2luZyAlZCIsIHBhY2tpbmcpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIGlmIChlbmNvZGluZykgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIkVuY29kaW5nICVkIiwgZW5jb2RpbmcpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgYnVmICs9IDgyMDsKKyAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPSByZWFkMzIoJmJ1ZiwgZW5kaWFuKTsKKyAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPSByZWFkMzIoJmJ1ZiwgZW5kaWFuKTsKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID4gMCAmJiBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPiAwKQorICAgICAgICBhdl9yZWR1Y2UoJmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgJmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgICAweDEwMDAwKTsKKyAgICBlbHNlCisgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpeyAwLCAxIH07CisKKyAgICBpZiAob2Zmc2V0ID49IDE3MjQgKyA0KSB7CisgICAgICAgIGJ1ZiA9IGF2cGt0LT5kYXRhICsgMTcyNDsKKyAgICAgICAgaSA9IHJlYWQzMigmYnVmLCBlbmRpYW4pOworICAgICAgICBpZihpKSB7CisgICAgICAgICAgICBBVlJhdGlvbmFsIHEgPSBhdl9kMnEoYXZfaW50MmZsb2F0KGkpLCA0MDk2KTsKKyAgICAgICAgICAgIGlmIChxLm51bSA+IDAgJiYgcS5kZW4gPiAwKQorICAgICAgICAgICAgICAgIGF2Y3R4LT5mcmFtZXJhdGUgPSBxOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChkZXNjcmlwdG9yKSB7CisgICAgY2FzZSA2OiAgLy8gWQorICAgICAgICBlbGVtZW50cyA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNTI6IC8vIEFCR1IKKyAgICBjYXNlIDUxOiAvLyBSR0JBCisgICAgICAgIGVsZW1lbnRzID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MDogLy8gUkdCCisgICAgICAgIGVsZW1lbnRzID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJEZXNjcmlwdG9yICVkIiwgZGVzY3JpcHRvcik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJpdHNfcGVyX2NvbG9yKSB7CisgICAgY2FzZSA4OgorICAgICAgICBzdHJpZGUgPSBhdmN0eC0+d2lkdGggKiBlbGVtZW50czsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgICAgaWYgKCFwYWNraW5nKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tpbmcgdG8gMzJiaXQgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN0cmlkZSA9IChhdmN0eC0+d2lkdGggKiBlbGVtZW50cyArIDIpIC8gMyAqIDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6CisgICAgICAgIGlmICghcGFja2luZykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWNraW5nIHRvIDE2Yml0IHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdHJpZGUgPSAyICogYXZjdHgtPndpZHRoICogZWxlbWVudHM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICAgIHN0cmlkZSA9IDIgKiBhdmN0eC0+d2lkdGggKiBlbGVtZW50czsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMzI6CisgICAgY2FzZSA2NDoKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJEZXB0aCAlZCIsIGJpdHNfcGVyX2NvbG9yKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8vIFRhYmxlIDNjOiBSdW5zIHdpbGwgYWx3YXlzIGJyZWFrIGF0IHNjYW4gbGluZSBib3VuZGFyaWVzLiBQYWNraW5nCisgICAgLy8gd2lsbCBhbHdheXMgYnJlYWsgdG8gdGhlIG5leHQgMzItYml0IHdvcmQgYXQgc2Nhbi1saW5lIGJvdW5kYXJpZXMuCisgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhlIGVuY29kZXIgcHJvZHVjZWQgaW52YWxpZCBmaWxlcywgc28gYXR0ZW1wdAorICAgIC8vIHRvIGRldGVjdCBpdAorICAgIG5lZWRfYWxpZ24gPSBGRkFMSUdOKHN0cmlkZSwgNCk7CisgICAgaWYgKG5lZWRfYWxpZ24qYXZjdHgtPmhlaWdodCArIChpbnQ2NF90KW9mZnNldCA+IGF2cGt0LT5zaXplKSB7CisgICAgICAgIC8vIEFsaWdubWVudCBzZWVtcyB1bmFwcGxpYWJsZSwgdHJ5IHdpdGhvdXQKKyAgICAgICAgaWYgKHN0cmlkZSphdmN0eC0+aGVpZ2h0ICsgKGludDY0X3Qpb2Zmc2V0ID4gYXZwa3QtPnNpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT3ZlcnJlYWQgYnVmZmVyLiBJbnZhbGlkIGhlYWRlcj9cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiRGVjb2RpbmcgRFBYIHdpdGhvdXQgc2NhbmxpbmUgIgorICAgICAgICAgICAgICAgICAgICJhbGlnbm1lbnQuXG4iKTsKKyAgICAgICAgICAgIG5lZWRfYWxpZ24gPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbmVlZF9hbGlnbiAtPSBzdHJpZGU7CisgICAgICAgIHN0cmlkZSA9IEZGQUxJR04oc3RyaWRlLCA0KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKDEwMDAgKiBkZXNjcmlwdG9yICsgMTAgKiBiaXRzX3Blcl9jb2xvciArIGVuZGlhbikgeworICAgIGNhc2UgNjA4MToKKyAgICBjYXNlIDYwODA6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MDA4MToKKyAgICBjYXNlIDUwMDgwOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNTIwODE6CisgICAgY2FzZSA1MjA4MDoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0FCR1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNTEwODE6CisgICAgY2FzZSA1MTA4MDoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQkE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNTAxMDA6CisgICAgY2FzZSA1MTEwMDoKKyAgICBjYXNlIDUwMTAxOgorICAgIGNhc2UgNTExMDE6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNTAxMjA6CisgICAgY2FzZSA1MTEyMDoKKyAgICBjYXNlIDUwMTIxOgorICAgIGNhc2UgNTExMjE6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjE2MToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVkxNkJFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDYxNjA6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTZMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MDE2MToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjQ4QkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNTAxNjA6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I0OExFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDUxMTYxOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCQTY0QkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNTExNjA6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0JBNjRMRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBmb3JtYXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgZmZfc2V0X3NhcihhdmN0eCwgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLy8gTW92ZSBwb2ludGVyIHRvIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGZpbGUKKyAgICBidWYgPSAgYXZwa3QtPmRhdGEgKyBvZmZzZXQ7CisKKyAgICBmb3IgKGk9MDsgaTxBVl9OVU1fREFUQV9QT0lOVEVSUzsgaSsrKQorICAgICAgICBwdHJbaV0gPSBwLT5kYXRhW2ldOworCisgICAgc3dpdGNoIChiaXRzX3Blcl9jb2xvcikgeworICAgIGNhc2UgMTA6CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+aGVpZ2h0OyB4KyspIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICpkc3RbM10gPSB7KHVpbnQxNl90KilwdHJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCopcHRyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QqKXB0clsyXX07CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPndpZHRoOyB5KyspIHsKKyAgICAgICAgICAgICAgICAqZHN0WzJdKysgPSByZWFkMTBpbjMyKCZidWYsICZyZ2JCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbl9kYXR1bSwgZW5kaWFuKTsKKyAgICAgICAgICAgICAgICAqZHN0WzBdKysgPSByZWFkMTBpbjMyKCZidWYsICZyZ2JCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbl9kYXR1bSwgZW5kaWFuKTsKKyAgICAgICAgICAgICAgICAqZHN0WzFdKysgPSByZWFkMTBpbjMyKCZidWYsICZyZ2JCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbl9kYXR1bSwgZW5kaWFuKTsKKyAgICAgICAgICAgICAgICAvLyBGb3IgMTAgYml0LCBpZ25vcmUgYWxwaGEKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgcmVhZDEwaW4zMigmYnVmLCAmcmdiQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuX2RhdHVtLCBlbmRpYW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbl9kYXR1bSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgIHB0cltpXSArPSBwLT5saW5lc2l6ZVtpXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPmhlaWdodDsgeCsrKSB7CisgICAgICAgICAgICB1aW50MTZfdCAqZHN0WzNdID0geyh1aW50MTZfdCopcHRyWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QqKXB0clsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KilwdHJbMl19OworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT53aWR0aDsgeSsrKSB7CisgICAgICAgICAgICAgICAgKmRzdFsyXSA9IHJlYWQxNigmYnVmLCBlbmRpYW4pID4+IDQ7CisgICAgICAgICAgICAgICAgZHN0WzJdKys7CisgICAgICAgICAgICAgICAgKmRzdFswXSA9IHJlYWQxNigmYnVmLCBlbmRpYW4pID4+IDQ7CisgICAgICAgICAgICAgICAgZHN0WzBdKys7CisgICAgICAgICAgICAgICAgKmRzdFsxXSA9IHJlYWQxNigmYnVmLCBlbmRpYW4pID4+IDQ7CisgICAgICAgICAgICAgICAgZHN0WzFdKys7CisgICAgICAgICAgICAgICAgLy8gRm9yIDEyIGJpdCwgaWdub3JlIGFscGhhCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzID09IDQpCisgICAgICAgICAgICAgICAgICAgIGJ1ZiArPSAyOworICAgICAgICAgICAgICAgIC8vIEp1bXAgdG8gbmV4dCBhbGlnbmVkIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgYnVmICs9IG5lZWRfYWxpZ247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgIHB0cltpXSArPSBwLT5saW5lc2l6ZVtpXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgICBlbGVtZW50cyAqPSAyOworICAgIGNhc2UgODoKKyAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShwdHJbMF0sIHAtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Ziwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzICogYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK0FWQ29kZWMgZmZfZHB4X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImRweCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRQWCAoRGlnaXRhbCBQaWN0dXJlIEV4Y2hhbmdlKSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9EUFgsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHB4X3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHB4X3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMmEzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kcHhfcGFyc2VyLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBEUFggcGFyc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIERQWCBwYXJzZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisKK3R5cGVkZWYgc3RydWN0IERQWFBhcnNlQ29udGV4dCB7CisgICAgUGFyc2VDb250ZXh0IHBjOworICAgIHVpbnQzMl90IGluZGV4OworICAgIHVpbnQzMl90IGZzaXplOworICAgIHVpbnQzMl90IHJlbWFpbmluZ19zaXplOworICAgIGludCBpc19iZTsKK30gRFBYUGFyc2VDb250ZXh0OworCitzdGF0aWMgaW50IGRweF9wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgRFBYUGFyc2VDb250ZXh0ICpkID0gcy0+cHJpdl9kYXRhOworICAgIHVpbnQzMl90IHN0YXRlID0gZC0+cGMuc3RhdGU7CisgICAgaW50IG5leHQgPSBFTkRfTk9UX0ZPVU5EOworICAgIGludCBpID0gMDsKKworICAgIHMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgaWYgKGJ1Zl9zaXplID09IDApCisgICAgICAgIG5leHQgPSAwOworCisgICAgaWYgKCFkLT5wYy5mcmFtZV9zdGFydF9mb3VuZCkgeworICAgICAgICBmb3IgKDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgYnVmW2ldOworICAgICAgICAgICAgaWYgKHN0YXRlID09IE1LQkVUQUcoJ1MnLCdEJywnUCcsJ1gnKSB8fAorICAgICAgICAgICAgICAgIHN0YXRlID09IE1LVEFHKCdTJywnRCcsJ1AnLCdYJykpIHsKKyAgICAgICAgICAgICAgICBkLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgZC0+aXNfYmUgPSBzdGF0ZSA9PSBNS0JFVEFHKCdTJywnRCcsJ1AnLCdYJyk7CisgICAgICAgICAgICAgICAgZC0+aW5kZXggPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGQtPnBjLnN0YXRlID0gc3RhdGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGQtPnJlbWFpbmluZ19zaXplKSB7CisgICAgICAgICAgICBpID0gRkZNSU4oZC0+cmVtYWluaW5nX3NpemUsIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIGQtPnJlbWFpbmluZ19zaXplIC09IGk7CisgICAgICAgICAgICBpZiAoZC0+cmVtYWluaW5nX3NpemUpCisgICAgICAgICAgICAgICAgZ290byBmbHVzaDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoO2QtPnBjLmZyYW1lX3N0YXJ0X2ZvdW5kICYmIGkgPCBidWZfc2l6ZTsgaSsrKSB7CisgICAgICAgIGQtPnBjLnN0YXRlID0gKGQtPnBjLnN0YXRlIDw8IDgpIHwgYnVmW2ldOworICAgICAgICBkLT5pbmRleCsrOworICAgICAgICBpZiAoZC0+aW5kZXggPT0gMTcpIHsKKyAgICAgICAgICAgIGQtPmZzaXplID0gZC0+aXNfYmUgPyBkLT5wYy5zdGF0ZSA6IGF2X2Jzd2FwMzIoZC0+cGMuc3RhdGUpOworICAgICAgICAgICAgaWYgKGQtPmZzaXplIDw9IDE2NjQpIHsKKyAgICAgICAgICAgICAgICBkLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CisgICAgICAgICAgICAgICAgZ290byBmbHVzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkLT5mc2l6ZSA+IGJ1Zl9zaXplIC0gaSArIDE5KQorICAgICAgICAgICAgICAgIGQtPnJlbWFpbmluZ19zaXplID0gZC0+ZnNpemUgLSBidWZfc2l6ZSArIGkgLSAxOTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpICs9IGQtPmZzaXplIC0gMTk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGQtPmluZGV4ID4gMTcpIHsKKyAgICAgICAgICAgIGlmIChkLT5wYy5zdGF0ZSA9PSBNS0JFVEFHKCdTJywnRCcsJ1AnLCdYJykgfHwKKyAgICAgICAgICAgICAgICBkLT5wYy5zdGF0ZSA9PSBNS1RBRygnUycsJ0QnLCdQJywnWCcpKSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IGkgLSAzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitmbHVzaDoKKyAgICBpZiAoZmZfY29tYmluZV9mcmFtZSgmZC0+cGMsIG5leHQsICZidWYsICZidWZfc2l6ZSkgPCAwKQorICAgICAgICByZXR1cm4gYnVmX3NpemU7CisKKyAgICBkLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CisKKyAgICAqcG91dGJ1ZiAgICAgID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gbmV4dDsKK30KKworQVZDb2RlY1BhcnNlciBmZl9kcHhfcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfRFBYIH0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKERQWFBhcnNlQ29udGV4dCksCisgICAgLnBhcnNlcl9wYXJzZSAgID0gZHB4X3BhcnNlLAorICAgIC5wYXJzZXJfY2xvc2UgICA9IGZmX3BhcnNlX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RweGVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHB4ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhNzQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RweGVuYy5jCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogRFBYICguZHB4KSBpbWFnZSBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGV0ZXIgUm9zcyA8cHJvc3NAeHZpZC5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBEUFhDb250ZXh0IHsKKyAgICBpbnQgYmlnX2VuZGlhbjsKKyAgICBpbnQgYml0c19wZXJfY29tcG9uZW50OworICAgIGludCBudW1fY29tcG9uZW50czsKKyAgICBpbnQgZGVzY3JpcHRvcjsKKyAgICBpbnQgcGxhbmFyOworfSBEUFhDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIERQWENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZjdHgtPnBpeF9mbXQpOworCisgICAgcy0+YmlnX2VuZGlhbiAgICAgICAgID0gISEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQkUpOworICAgIHMtPmJpdHNfcGVyX2NvbXBvbmVudCA9IGRlc2MtPmNvbXBbMF0uZGVwdGhfbWludXMxICsgMTsKKyAgICBzLT5udW1fY29tcG9uZW50cyAgICAgPSBkZXNjLT5uYl9jb21wb25lbnRzOworICAgIHMtPmRlc2NyaXB0b3IgICAgICAgICA9IChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSkgPyA1MSA6IDUwOworICAgIHMtPnBsYW5hciAgICAgICAgICAgICA9ICEhKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUik7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5waXhfZm10KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX0FCR1I6CisgICAgICAgIHMtPmRlc2NyaXB0b3IgPSA1MjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxNkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTZMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6CisgICAgICAgIHMtPmRlc2NyaXB0b3IgPSA2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTJCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQTY0TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OEJFOgorICAgICAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUpCisgICAgICAgICAgICBzLT5iaXRzX3Blcl9jb21wb25lbnQgPSBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgInVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSB3cml0ZTE2KHAsIHZhbHVlKSBcCitkbyB7IFwKKyAgICBpZiAocy0+YmlnX2VuZGlhbikgQVZfV0IxNihwLCB2YWx1ZSk7IFwKKyAgICBlbHNlICAgICAgICAgICAgICAgQVZfV0wxNihwLCB2YWx1ZSk7IFwKK30gd2hpbGUoMCkKKworI2RlZmluZSB3cml0ZTMyKHAsIHZhbHVlKSBcCitkbyB7IFwKKyAgICBpZiAocy0+YmlnX2VuZGlhbikgQVZfV0IzMihwLCB2YWx1ZSk7IFwKKyAgICBlbHNlICAgICAgICAgICAgICAgQVZfV0wzMihwLCB2YWx1ZSk7IFwKK30gd2hpbGUoMCkKKworc3RhdGljIHZvaWQgZW5jb2RlX3JnYjQ4XzEwYml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZQaWN0dXJlICpwaWMsIHVpbnQ4X3QgKmRzdCkKK3sKKyAgICBEUFhDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSBwaWMtPmRhdGFbMF07CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgICAgaWYgKHMtPmJpZ19lbmRpYW4pIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICgoQVZfUkIxNihzcmMgKyA2KnggKyA0KSAmIDB4RkZDMFUpID4+IDQpCisgICAgICAgICAgICAgICAgICAgICAgfCAoKEFWX1JCMTYoc3JjICsgNip4ICsgMikgJiAweEZGQzBVKSA8PCA2KQorICAgICAgICAgICAgICAgICAgICAgIHwgKChBVl9SQjE2KHNyYyArIDYqeCArIDApICYgMHhGRkMwVSkgPDwgMTYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICgoQVZfUkwxNihzcmMgKyA2KnggKyA0KSAmIDB4RkZDMFUpID4+IDQpCisgICAgICAgICAgICAgICAgICAgICAgfCAoKEFWX1JMMTYoc3JjICsgNip4ICsgMikgJiAweEZGQzBVKSA8PCA2KQorICAgICAgICAgICAgICAgICAgICAgIHwgKChBVl9STDE2KHNyYyArIDYqeCArIDApICYgMHhGRkMwVSkgPDwgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGUzMihkc3QsIHZhbHVlKTsKKyAgICAgICAgICAgIGRzdCArPSA0OworICAgICAgICB9CisgICAgICAgIHNyYyArPSBwaWMtPmxpbmVzaXplWzBdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZW5jb2RlX2dicnAxMChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWUGljdHVyZSAqcGljLCB1aW50OF90ICpkc3QpCit7CisgICAgRFBYQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqc3JjWzNdID0ge3BpYy0+ZGF0YVswXSwgcGljLT5kYXRhWzFdLCBwaWMtPmRhdGFbMl19OworICAgIGludCB4LCB5LCBpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICAgIGlmIChzLT5iaWdfZW5kaWFuKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAoQVZfUkIxNihzcmNbMF0gKyAyKngpIDw8IDEyKQorICAgICAgICAgICAgICAgICAgICAgIHwgKEFWX1JCMTYoc3JjWzFdICsgMip4KSA8PCAyKQorICAgICAgICAgICAgICAgICAgICAgIHwgKCh1bnNpZ25lZClBVl9SQjE2KHNyY1syXSArIDIqeCkgPDwgMjIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IChBVl9STDE2KHNyY1swXSArIDIqeCkgPDwgMTIpCisgICAgICAgICAgICAgICAgICAgICAgfCAoQVZfUkwxNihzcmNbMV0gKyAyKngpIDw8IDIpCisgICAgICAgICAgICAgICAgICAgICAgfCAoKHVuc2lnbmVkKUFWX1JMMTYoc3JjWzJdICsgMip4KSA8PCAyMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZTMyKGRzdCwgdmFsdWUpOworICAgICAgICAgICAgZHN0ICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHNyY1tpXSArPSBwaWMtPmxpbmVzaXplW2ldOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZW5jb2RlX2dicnAxMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWUGljdHVyZSAqcGljLCB1aW50MTZfdCAqZHN0KQoreworICAgIERQWENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmNbM10gPSB7KHVpbnQxNl90KilwaWMtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QqKXBpYy0+ZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCopcGljLT5kYXRhWzJdfTsKKyAgICBpbnQgeCwgeSwgaSwgcGFkOworICAgIHBhZCA9IGF2Y3R4LT53aWR0aCo2OworICAgIHBhZCA9IChGRkFMSUdOKHBhZCwgNCkgLSBwYWQpID4+IDE7CisgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHZhbHVlWzNdOworICAgICAgICAgICAgaWYgKHMtPmJpZ19lbmRpYW4pIHsKKyAgICAgICAgICAgICAgICB2YWx1ZVsxXSA9IEFWX1JCMTYoc3JjWzBdICsgeCkgPDwgNDsKKyAgICAgICAgICAgICAgICB2YWx1ZVsyXSA9IEFWX1JCMTYoc3JjWzFdICsgeCkgPDwgNDsKKyAgICAgICAgICAgICAgICB2YWx1ZVswXSA9IEFWX1JCMTYoc3JjWzJdICsgeCkgPDwgNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmFsdWVbMV0gPSBBVl9STDE2KHNyY1swXSArIHgpIDw8IDQ7CisgICAgICAgICAgICAgICAgdmFsdWVbMl0gPSBBVl9STDE2KHNyY1sxXSArIHgpIDw8IDQ7CisgICAgICAgICAgICAgICAgdmFsdWVbMF0gPSBBVl9STDE2KHNyY1syXSArIHgpIDw8IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgIHdyaXRlMTYoZHN0KyssIHZhbHVlW2ldKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFkOyBpKyspCisgICAgICAgICAgICAqZHN0KysgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgc3JjW2ldICs9IHBpYy0+bGluZXNpemVbaV0vMjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgRFBYQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHNpemUsIHJldCwgbmVlZF9hbGlnbiwgbGVuOworICAgIHVpbnQ4X3QgKmJ1ZjsKKworI2RlZmluZSBIRUFERVJfU0laRSAxNjY0ICAvKiBEUFggR2VuZXJpYyBoZWFkZXIgKi8KKyAgICBpZiAocy0+Yml0c19wZXJfY29tcG9uZW50ID09IDEwKQorICAgICAgICBzaXplID0gYXZjdHgtPmhlaWdodCAqIGF2Y3R4LT53aWR0aCAqIDQ7CisgICAgZWxzZSBpZiAocy0+Yml0c19wZXJfY29tcG9uZW50ID09IDEyKSB7CisgICAgICAgIC8vIDMgY29tcG9uZW50cywgMTIgYml0cyBwdXQgb24gMTYgYml0cworICAgICAgICBsZW4gID0gYXZjdHgtPndpZHRoKjY7CisgICAgICAgIHNpemUgPSBGRkFMSUdOKGxlbiwgNCk7CisgICAgICAgIG5lZWRfYWxpZ24gPSBzaXplIC0gbGVuOworICAgICAgICBzaXplICo9IGF2Y3R4LT5oZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTiBjb21wb25lbnRzLCBNIGJpdHMKKyAgICAgICAgbGVuID0gYXZjdHgtPndpZHRoICogcy0+bnVtX2NvbXBvbmVudHMgKiBzLT5iaXRzX3Blcl9jb21wb25lbnQgPj4gMzsKKyAgICAgICAgc2l6ZSA9IEZGQUxJR04obGVuLCA0KTsKKyAgICAgICAgbmVlZF9hbGlnbiA9IHNpemUgLSBsZW47CisgICAgICAgIHNpemUgKj0gYXZjdHgtPmhlaWdodDsKKyAgICB9CisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIHNpemUgKyBIRUFERVJfU0laRSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBidWYgPSBwa3QtPmRhdGE7CisKKyAgICBtZW1zZXQoYnVmLCAwLCBIRUFERVJfU0laRSk7CisKKyAgICAvKiBGaWxlIGluZm9ybWF0aW9uIGhlYWRlciAqLworICAgIHdyaXRlMzIoYnVmLCAgICAgICBNS0JFVEFHKCdTJywnRCcsJ1AnLCdYJykpOworICAgIHdyaXRlMzIoYnVmICsgICA0LCBIRUFERVJfU0laRSk7CisgICAgbWVtY3B5IChidWYgKyAgIDgsICJWMS4wIiwgNCk7CisgICAgd3JpdGUzMihidWYgKyAgMjAsIDEpOyAvKiBuZXcgaW1hZ2UgKi8KKyAgICB3cml0ZTMyKGJ1ZiArICAyNCwgSEVBREVSX1NJWkUpOworICAgIGlmICghKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKQorICAgICAgICBtZW1jcHkgKGJ1ZiArIDE2MCwgTElCQVZDT0RFQ19JREVOVCwgRkZNSU4oc2l6ZW9mKExJQkFWQ09ERUNfSURFTlQpLCAxMDApKTsKKyAgICB3cml0ZTMyKGJ1ZiArIDY2MCwgMHhGRkZGRkZGRik7IC8qIHVuZW5jcnlwdGVkICovCisKKyAgICAvKiBJbWFnZSBpbmZvcm1hdGlvbiBoZWFkZXIgKi8KKyAgICB3cml0ZTE2KGJ1ZiArIDc2OCwgMCk7IC8qIG9yaWVudGF0aW9uOyBsZWZ0IHRvIHJpZ2h0LCB0b3AgdG8gYm90dG9tICovCisgICAgd3JpdGUxNihidWYgKyA3NzAsIDEpOyAvKiBudW1iZXIgb2YgZWxlbWVudHMgKi8KKyAgICB3cml0ZTMyKGJ1ZiArIDc3MiwgYXZjdHgtPndpZHRoKTsKKyAgICB3cml0ZTMyKGJ1ZiArIDc3NiwgYXZjdHgtPmhlaWdodCk7CisgICAgYnVmWzgwMF0gPSBzLT5kZXNjcmlwdG9yOworICAgIGJ1Zls4MDFdID0gMjsgLyogbGluZWFyIHRyYW5zZmVyICovCisgICAgYnVmWzgwMl0gPSAyOyAvKiBsaW5lYXIgY29sb3JpbWV0cmljICovCisgICAgYnVmWzgwM10gPSBzLT5iaXRzX3Blcl9jb21wb25lbnQ7CisgICAgd3JpdGUxNihidWYgKyA4MDQsIChzLT5iaXRzX3Blcl9jb21wb25lbnQgPT0gMTAgfHwgcy0+Yml0c19wZXJfY29tcG9uZW50ID09IDEyKSA/CisgICAgICAgICAgICAgICAgICAgICAgIDEgOiAwKTsgLyogcGFja2luZyBtZXRob2QgKi8KKyAgICB3cml0ZTMyKGJ1ZiArIDgwOCwgSEVBREVSX1NJWkUpOyAvKiBkYXRhIG9mZnNldCAqLworCisgICAgLyogSW1hZ2Ugc291cmNlIGluZm9ybWF0aW9uIGhlYWRlciAqLworICAgIHdyaXRlMzIoYnVmICsgMTYyOCwgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKTsKKyAgICB3cml0ZTMyKGJ1ZiArIDE2MzIsIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisKKyAgICBzd2l0Y2gocy0+Yml0c19wZXJfY29tcG9uZW50KSB7CisgICAgY2FzZSA4OgorICAgIGNhc2UgMTY6CisgICAgICAgIGlmIChuZWVkX2FsaWduKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IGZyYW1lLT5kYXRhWzBdOworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gcGt0LT5kYXRhICsgSEVBREVSX1NJWkU7CisgICAgICAgICAgICBzaXplID0gKGxlbiArIG5lZWRfYWxpZ24pICogYXZjdHgtPmhlaWdodDsKKyAgICAgICAgICAgIGZvciAoaj0wOyBqPGF2Y3R4LT5oZWlnaHQ7IGorKykgeworICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgbGVuKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoZHN0ICsgbGVuLCAwLCBuZWVkX2FsaWduKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gbGVuICsgbmVlZF9hbGlnbjsKKyAgICAgICAgICAgICAgICBzcmMgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZSA9IGF2cGljdHVyZV9sYXlvdXQoKGNvbnN0IEFWUGljdHVyZSopZnJhbWUsIGF2Y3R4LT5waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgSEVBREVSX1NJWkUsIHBrdC0+c2l6ZSAtIEhFQURFUl9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgICAgaWYgKHMtPnBsYW5hcikKKyAgICAgICAgICAgIGVuY29kZV9nYnJwMTAoYXZjdHgsIChjb25zdCBBVlBpY3R1cmUqKWZyYW1lLCBidWYgKyBIRUFERVJfU0laRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVuY29kZV9yZ2I0OF8xMGJpdChhdmN0eCwgKGNvbnN0IEFWUGljdHVyZSopZnJhbWUsIGJ1ZiArIEhFQURFUl9TSVpFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICAgICAgZW5jb2RlX2dicnAxMihhdmN0eCwgKGNvbnN0IEFWUGljdHVyZSopZnJhbWUsICh1aW50MTZfdCopKGJ1ZiArIEhFQURFUl9TSVpFKSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgYml0IGRlcHRoOiAlZFxuIiwgcy0+Yml0c19wZXJfY29tcG9uZW50KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHNpemUgKz0gSEVBREVSX1NJWkU7CisKKyAgICB3cml0ZTMyKGJ1ZiArIDE2LCBzaXplKTsgLyogZmlsZSBzaXplICovCisKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9kcHhfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZHB4IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRFBYIChEaWdpdGFsIFBpY3R1cmUgRXhjaGFuZ2UpIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0RQWCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRFBYQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX2ZyYW1lLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7CisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCMjQsICAgIEFWX1BJWF9GTVRfUkdCQSwgQVZfUElYX0ZNVF9BQkdSLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNkxFLCBBVl9QSVhfRk1UX0dSQVkxNkJFLAorICAgICAgICBBVl9QSVhfRk1UX1JHQjQ4TEUsICBBVl9QSVhfRk1UX1JHQjQ4QkUsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQTY0TEUsIEFWX1BJWF9GTVRfUkdCQTY0QkUsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEwTEUsIEFWX1BJWF9GTVRfR0JSUDEwQkUsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyTEUsIEFWX1BJWF9GTVRfR0JSUDEyQkUsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORX0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHNkX3RhYmxlZ2VuLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kc2RfdGFibGVnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmViOWZlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHNkX3RhYmxlZ2VuLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIEdlbmVyYXRlIGEgaGVhZGVyIGZpbGUgZm9yIGhhcmRjb2RlZCBEU0QgdGFibGVzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMgMAorI2luY2x1ZGUgImRzZF90YWJsZWdlbi5oIgorI2luY2x1ZGUgInRhYmxlcHJpbnQuaCIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCitpbnQgbWFpbih2b2lkKQoreworICAgIGRzZF9jdGFibGVzX3RhYmxlaW5pdCgpOworCisgICAgd3JpdGVfZmlsZWhlYWRlcigpOworCisgICAgcHJpbnRmKCJzdGF0aWMgY29uc3QgZG91YmxlIGN0YWJsZXNbQ1RBQkxFU11bMjU2XSA9IHtcbiIpOworICAgIHdyaXRlX2Zsb2F0XzJkX2FycmF5KGN0YWJsZXMsIENUQUJMRVMsIDI1Nik7CisgICAgcHJpbnRmKCJ9O1xuIik7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RzZF90YWJsZWdlbi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHNkX3RhYmxlZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmYjQxNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RzZF90YWJsZWdlbi5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBIZWFkZXIgZmlsZSBmb3IgaGFyZGNvZGVkIERTRCB0YWJsZXMKKyAqIGJhc2VkIG9uIEJTRCBsaWNlbnNlZCBkc2QycGNtIGJ5IFNlYmFzdGlhbiBHZXNlbWFubgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIFNlYmFzdGlhbiBHZXNlbWFubi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0RTRF9UQUJMRUdFTl9ICisjZGVmaW5lIEFWQ09ERUNfRFNEX1RBQkxFR0VOX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisKKyNkZWZpbmUgSFRBUFMgICA0OCAgICAgICAgICAgICAgICAvKiogbnVtYmVyIG9mIEZJUiBjb25zdGFudHMgKi8KKyNkZWZpbmUgQ1RBQkxFUyAoKEhUQVBTICsgNykgLyA4KSAvKiogbnVtYmVyIG9mICI4IE1BQ3MiIGxvb2t1cCB0YWJsZXMgKi8KKworI2lmIENPTkZJR19IQVJEQ09ERURfVEFCTEVTCisjZGVmaW5lIGRzZF9jdGFibGVzX3RhYmxlaW5pdCgpCisjaW5jbHVkZSAibGliYXZjb2RlYy9kc2RfdGFibGVzLmgiCisjZWxzZQorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworLyoKKyAqIFByb3BlcnRpZXMgb2YgdGhpcyA5Ni10YXAgbG93cGFzcyBmaWx0ZXIgd2hlbiBhcHBsaWVkIG9uIGEgc2lnbmFsCisgKiB3aXRoIHNhbXBsaW5nIHJhdGUgb2YgNDQxMDAqNjQgSHo6CisgKgorICogKCkgaGFzIGEgZGVsYXkgb2YgMTcgbWljcm9zZWNvbmRzLgorICoKKyAqICgpIGZsYXQgcmVzcG9uc2UgdXAgdG8gNDgga0h6CisgKgorICogKCkgaWYgeW91IGRvd25zYW1wbGUgYWZ0ZXJ3YXJkcyBieSBhIGZhY3RvciBvZiA4LCB0aGUKKyAqICAgIHNwZWN0cnVtIGJlbG93IDcwIGtIeiBpcyBwcmFjdGljYWxseSBhbGlhcy1mcmVlLgorICoKKyAqICgpIHN0b3BiYW5kIHJlamVjdGlvbiBpcyBhYm91dCAxNjAgZEIKKyAqCisgKiBUaGUgY29lZmZpY2llbnQgdGFibGVzICgiY3RhYmxlcyIpIHRha2Ugb25seSA2IEtpYmkgQnl0ZXMgYW5kCisgKiBzaG91bGQgZml0IGludG8gYSBtb2Rlcm4gcHJvY2Vzc29yJ3MgZmFzdCBjYWNoZS4KKyAqLworCisvKioKKyAqIFRoZSAybmQgaGFsZiAoNDggY29lZmZzKSBvZiBhIDk2LXRhcCBzeW1tZXRyaWMgbG93cGFzcyBmaWx0ZXIKKyAqLworc3RhdGljIGNvbnN0IGRvdWJsZSBodGFwc1tIVEFQU10gPSB7CisgICAgIDAuMDk5NTA3MzE5NzQwNTY2NTgsICAgIDAuMDk1NjI4NDU3Mjc3MTQ2NjgsICAgIDAuMDg4MTk2NDcxMjY1MTY5NDQsCisgICAgIDAuMDc3ODI1NTI1MjcwNjgxNzUsICAgIDAuMDY1MzQ4NzY1MjMxNzEyOTksICAgIDAuMDUxNzI2MjkzMTE0MjcyNTcsCisgICAgIDAuMDM3OTQyOTQ4NDkxMDE4NywgICAgIDAuMDI0OTA5MjEzNTE3NjIyNjEsICAgIDAuMDEzMzc3NDc0NjI2NTg5NywKKyAgICAgMC4wMDM4ODMwNDM0MTg4MDQ0MTYsICAtMC4wMDMyODQ3MDM0MTYyMTA3MjYsICAtMC4wMDgwODAyNTAyMTI2ODc0OTcsCisgICAgLTAuMDEwNjcyNDE4MTI0NzEwMzMsICAgLTAuMDExMzk0MjcyMzUwMDA4NjMsICAgLTAuMDEwNjgxMzg3Nzk3NDU4NywKKyAgICAtMC4wMDkwMDc5MDUwNzg3NjYwNDksICAtMC4wMDY4Mjg4NTk3NjEwMTUzMzUsICAtMC4wMDQ1MzUxODQzMjIwMDE0OTYsCisgICAgLTAuMDAyNDI1MDM1OTU5MDU5NTc4LCAgLTAuMDAwNjkyMjE4NzA4MDc5MDcwOCwgIDAuMDAwNTcwMDc2MjEzMzUxNjU5MiwKKyAgICAgMC4wMDEzNTM4MzgwMDUyNjk0NDgsICAgMC4wMDE3MTM3MDkxNjk2OTA5MzcsICAgMC4wMDE3NDIwNDY4Mzk0NzI5NDgsCisgICAgIDAuMDAxNTQ1NjAxNjQ4MDEzMjM1LCAgIDAuMDAxMjI2Njk2MjI1Mjc3ODU1LCAgIDAuMDAwODcwNDMyMjY4MzU4MDIyMiwKKyAgICAgMC4wMDA1MzgxNjM2MjAwNTM1NjQ5LCAgMC4wMDAyNjY0NDYzNDU0MjUyNzYsICAgNy4wMDI5Njg3MzgzODM1MjhlLTA1LAorICAgIC01LjI3OTQwNzA1MzgxMTI2NmUtMDUsIC0wLjAwMDExNDA2MjU2NTA4NzQ2ODQsIC0wLjAwMDEzMDQ3OTYzNjEyMzE4OTUsCisgICAgLTAuMDAwMTE4OTk3MDI4NzQ5MTI4NSwgLTkuMzk2MjQ3MTU1MjY1MDczZS0wNSwgLTYuNTc3NjM0Mzc4MjcyODMyZS0wNSwKKyAgICAtNC4wNzQ5Mjg5NTg3MjUzNWUtMDUsICAtMi4xNzQwNzk1NzU1NDU4N2UtMDUsICAtOS4xNjMwNTg5MzEzOTE3MjJlLTA2LAorICAgIC0yLjAxNzQ2MDE0NTAzMjIwMWUtMDYsICAxLjI0OTcyMTg1NTIxOTAwNWUtMDYsICAyLjE2NjY1NTE5MDUzNzM5MmUtMDYsCisgICAgIDEuOTMwNTIwODkyOTkxMDgyZS0wNiwgIDEuMzE5NDAwMzM0Mzc0MTk1ZS0wNiwgIDcuNDEwMDM5NzY0OTQ5MDkxZS0wNywKKyAgICAgMy40MjMyMzA1MDk5Njc0MDllLTA3LCAgMS4yNDQxODIyMTQ3NDQ1ODhlLTA3LCAgMy4xMzA0NDEwMDUzNTkzOTZlLTA4Cit9OworCitzdGF0aWMgZmxvYXQgY3RhYmxlc1tDVEFCTEVTXVsyNTZdOworCitzdGF0aWMgYXZfY29sZCB2b2lkIGRzZF9jdGFibGVzX3RhYmxlaW5pdCh2b2lkKQoreworICAgIGludCB0LCBlLCBtLCBrOworICAgIGRvdWJsZSBhY2M7CisgICAgZm9yICh0ID0gMDsgdCA8IENUQUJMRVM7ICsrdCkgeworICAgICAgICBrID0gRkZNSU4oSFRBUFMgLSB0ICogOCwgOCk7CisgICAgICAgIGZvciAoZSA9IDA7IGUgPCAyNTY7ICsrZSkgeworICAgICAgICAgICAgYWNjID0gMC4wOworICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IGs7ICsrbSkKKyAgICAgICAgICAgICAgICBhY2MgKz0gKCgoZSA+PiAoNyAtIG0pKSAmIDEpICogMiAtIDEpICogaHRhcHNbdCAqIDggKyBtXTsKKyAgICAgICAgICAgIGN0YWJsZXNbQ1RBQkxFUyAtIDEgLSB0XVtlXSA9IChmbG9hdClhY2M7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLyogQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMgKi8KKworI2VuZGlmIC8qIEFWQ09ERUNfRFNEX1RBQkxFR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RzZGRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHNkZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkZmQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2RzZGRlYy5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogRGlyZWN0IFN0cmVhbSBEaWdpdGFsIChEU0QpIGRlY29kZXIKKyAqIGJhc2VkIG9uIEJTRCBsaWNlbnNlZCBkc2QycGNtIGJ5IFNlYmFzdGlhbiBHZXNlbWFubgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIFNlYmFzdGlhbiBHZXNlbWFubi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNCBQZXRlciBSb3NzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIERpcmVjdCBTdHJlYW0gRGlnaXRhbCAoRFNEKSBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21hdGhvcHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZHNkX3RhYmxlZ2VuLmgiCisKKyNkZWZpbmUgRklGT1NJWkUgMTYgICAgICAgICAgICAgIC8qKiBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvICovCisjZGVmaW5lIEZJRk9NQVNLIChGSUZPU0laRSAtIDEpICAvKiogYml0IG1hc2sgZm9yIEZJRk8gb2Zmc2V0cyAqLworCisjaWYgRklGT1NJWkUgKiA4IDwgSFRBUFMgKiAyCisjZXJyb3IgIkZJRk9TSVpFIHRvbyBzbWFsbCIKKyNlbmRpZgorCisvKioKKyAqIFBlci1jaGFubmVsIGJ1ZmZlcgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBidWZbRklGT1NJWkVdOworICAgIHVuc2lnbmVkIHBvczsKK30gRFNEQ29udGV4dDsKKworc3RhdGljIHZvaWQgZHNkMnBjbV90cmFuc2xhdGUoRFNEQ29udGV4dCogcywgc2l6ZV90IHNhbXBsZXMsIGludCBsc2JmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlKQoreworICAgIHVuc2lnbmVkIHBvcywgaTsKKyAgICB1bnNpZ25lZCBjaGFyKiBwOworICAgIGRvdWJsZSBzdW07CisKKyAgICBwb3MgPSBzLT5wb3M7CisKKyAgICB3aGlsZSAoc2FtcGxlcy0tID4gMCkgeworICAgICAgICBzLT5idWZbcG9zXSA9IGxzYmYgPyBmZl9yZXZlcnNlWypzcmNdIDogKnNyYzsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisKKyAgICAgICAgcCA9IHMtPmJ1ZiArICgocG9zIC0gQ1RBQkxFUykgJiBGSUZPTUFTSyk7CisgICAgICAgICpwID0gZmZfcmV2ZXJzZVsqcF07CisKKyAgICAgICAgc3VtID0gMC4wOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQ1RBQkxFUzsgaSsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGEgPSBzLT5idWZbKHBvcyAgICAgICAgICAgICAgICAgICAtIGkpICYgRklGT01BU0tdOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiID0gcy0+YnVmWyhwb3MgLSAoQ1RBQkxFUyoyIC0gMSkgKyBpKSAmIEZJRk9NQVNLXTsKKyAgICAgICAgICAgIHN1bSArPSBjdGFibGVzW2ldW2FdICsgY3RhYmxlc1tpXVtiXTsKKyAgICAgICAgfQorCisgICAgICAgICpkc3QgPSAoZmxvYXQpc3VtOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKworICAgICAgICBwb3MgPSAocG9zICsgMSkgJiBGSUZPTUFTSzsKKyAgICB9CisKKyAgICBzLT5wb3MgPSBwb3M7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgaW5pdF9zdGF0aWNfZGF0YSh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgZG9uZSA9IDA7CisgICAgaWYgKGRvbmUpCisgICAgICAgIHJldHVybjsKKyAgICBkc2RfY3RhYmxlc190YWJsZWluaXQoKTsKKyAgICBkb25lID0gMTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBEU0RDb250ZXh0ICogczsKKyAgICBpbnQgaTsKKworICAgIGluaXRfc3RhdGljX2RhdGEoKTsKKworICAgIHMgPSBhdl9tYWxsb2NfYXJyYXkoc2l6ZW9mKERTRENvbnRleHQpLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICBzW2ldLnBvcyA9IDA7CisgICAgICAgIG1lbXNldChzW2ldLmJ1ZiwgMHg2OSwgc2l6ZW9mKHNbaV0uYnVmKSk7CisKKyAgICAgICAgLyogMHg2OSA9IDAxMTAxMDAxCisgICAgICAgICAqIFRoaXMgcGF0dGVybiAib24gcmVwZWF0IiBtYWtlcyBhIGxvdyBlbmVyZ3kgMzUyLjgga0h6IHRvbmUKKyAgICAgICAgICogYW5kIGEgaGlnaCBlbmVyZ3kgMS4wNTg0IE1IeiB0b25lIHdoaWNoIHNob3VsZCBiZSBmaWx0ZXJlZAorICAgICAgICAgKiBvdXQgY29tcGxldGVseSBieSBhbnkgcGxheWJhY2sgc3lzdGVtIC0tPiBzaWxlbmNlCisgICAgICAgICAqLworICAgIH0KKworICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9GTFRQOworICAgIGF2Y3R4LT5wcml2X2RhdGEgID0gczsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgRFNEQ29udGV4dCAqIHMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcmV0LCBpOworICAgIGludCBsc2JmID0gYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RTRF9MU0JGIHx8IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EU0RfTFNCRl9QTEFOQVI7CisgICAgaW50IHNyY19uZXh0OworICAgIGludCBzcmNfc3RyaWRlOworCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBhdnBrdC0+c2l6ZSAvIGF2Y3R4LT5jaGFubmVsczsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFNEX0xTQkZfUExBTkFSIHx8IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EU0RfTVNCRl9QTEFOQVIpIHsKKyAgICAgICAgc3JjX25leHQgICA9IGZyYW1lLT5uYl9zYW1wbGVzOworICAgICAgICBzcmNfc3RyaWRlID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcmNfbmV4dCAgID0gMTsKKyAgICAgICAgc3JjX3N0cmlkZSA9IGF2Y3R4LT5jaGFubmVsczsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGZsb2F0ICogZHN0ID0gKChmbG9hdCAqKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YSlbaV07CisgICAgICAgIGRzZDJwY21fdHJhbnNsYXRlKCZzW2ldLCBmcmFtZS0+bmJfc2FtcGxlcywgbHNiZiwKKyAgICAgICAgICAgIGF2cGt0LT5kYXRhICsgaSAqIHNyY19uZXh0LCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgZHN0LCAxKTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisgICAgcmV0dXJuIGZyYW1lLT5uYl9zYW1wbGVzICogYXZjdHgtPmNoYW5uZWxzOworfQorCisjZGVmaW5lIERTRF9ERUNPREVSKGlkXywgbmFtZV8sIGxvbmdfbmFtZV8pIFwKK0FWQ29kZWMgZmZfIyNuYW1lXyMjX2RlY29kZXIgPSB7IFwKKyAgICAubmFtZSAgICAgICAgID0gI25hbWVfLCBcCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGxvbmdfbmFtZV8pLCBcCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywgXAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF8jI2lkXywgXAorICAgIC5pbml0ICAgICAgICAgPSBkZWNvZGVfaW5pdCwgXAorICAgIC5kZWNvZGUgICAgICAgPSBkZWNvZGVfZnJhbWUsIFwKKyAgICAuc2FtcGxlX2ZtdHMgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfRkxUUCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sIFwKK307CisKK0RTRF9ERUNPREVSKERTRF9MU0JGLCBkc2RfbHNiZiwgIkRTRCAoRGlyZWN0IFN0cmVhbSBEaWdpdGFsKSwgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0IikKK0RTRF9ERUNPREVSKERTRF9NU0JGLCBkc2RfbXNiZiwgIkRTRCAoRGlyZWN0IFN0cmVhbSBEaWdpdGFsKSwgbW9zdCBzaWduaWZpY2FudCBiaXQgZmlyc3QiKQorRFNEX0RFQ09ERVIoRFNEX01TQkZfUExBTkFSLCBkc2RfbXNiZl9wbGFuYXIsICJEU0QgKERpcmVjdCBTdHJlYW0gRGlnaXRhbCksIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0LCBwbGFuYXIiKQorRFNEX0RFQ09ERVIoRFNEX0xTQkZfUExBTkFSLCBkc2RfbHNiZl9wbGFuYXIsICJEU0QgKERpcmVjdCBTdHJlYW0gRGlnaXRhbCksIGxlYXN0IHNpZ25pZmljYW50IGJpdCBmaXJzdCwgcGxhbmFyIikKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RzaWNpbmF1ZGlvLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kc2ljaW5hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzZkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kc2ljaW5hdWRpby5jCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogRGVscGhpbmUgU29mdHdhcmUgSW50ZXJuYXRpb25hbCBDSU4gYXVkaW8gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA2IEdyZWdvcnkgTW9udG9pciAoY3l4QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRGVscGhpbmUgU29mdHdhcmUgSW50ZXJuYXRpb25hbCBDSU4gYXVkaW8gZGVjb2RlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisKK3R5cGVkZWYgc3RydWN0IENpbkF1ZGlvQ29udGV4dCB7CisgICAgaW50IGluaXRpYWxfZGVjb2RlX2ZyYW1lOworICAgIGludCBkZWx0YTsKK30gQ2luQXVkaW9Db250ZXh0OworCisKKy8qIHRhYmxlIGRlZmluaW5nIGEgZ2VvbWV0cmljIHNlcXVlbmNlIHdpdGggbXVsdGlwbGllciA9IDMyNzY3IF4gKDEgLyAxMjgpICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBjaW5hdWRpb19kZWx0YTE2X3RhYmxlWzI1Nl0gPSB7CisgICAgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgICAwLCAgICAgIDAsICAgICAgMCwgLTMwMjEwLCAtMjc4NTMsIC0yNTY4MCwgLTIzNjc3LCAtMjE4MjksCisgICAgLTIwMTI2LCAtMTg1NTYsIC0xNzEwOCwgLTE1Nzc0LCAtMTQ1NDMsIC0xMzQwOCwgLTEyMzYyLCAtMTEzOTgsCisgICAgLTEwNTA4LCAgLTk2ODksICAtODkzMywgIC04MjM2LCAgLTc1OTMsICAtNzAwMSwgIC02NDU1LCAgLTU5NTEsCisgICAgIC01NDg3LCAgLTUwNTksICAtNDY2NCwgIC00MzAwLCAgLTM5NjQsICAtMzY1NSwgIC0zMzcwLCAgLTMxMDcsCisgICAgIC0yODY1LCAgLTI2NDEsICAtMjQzNSwgIC0yMjQ1LCAgLTIwNzAsICAtMTkwOCwgIC0xNzU5LCAgLTE2MjIsCisgICAgIC0xNDk1LCAgLTEzNzksICAtMTI3MSwgIC0xMTcyLCAgLTEwODAsICAgLTk5NiwgICAtOTE4LCAgIC04NDcsCisgICAgICAtNzgxLCAgIC03MjAsICAgLTY2MywgICAtNjEyLCAgIC01NjQsICAgLTUyMCwgICAtNDc5LCAgIC00NDIsCisgICAgICAtNDA3LCAgIC0zNzYsICAgLTM0NiwgICAtMzE5LCAgIC0yOTQsICAgLTI3MSwgICAtMjUwLCAgIC0yMzAsCisgICAgICAtMjEyLCAgIC0xOTYsICAgLTE4MSwgICAtMTY2LCAgIC0xNTMsICAgLTE0MSwgICAtMTMwLCAgIC0xMjAsCisgICAgICAtMTExLCAgIC0xMDIsICAgIC05NCwgICAgLTg3LCAgICAtODAsICAgIC03NCwgICAgLTY4LCAgICAtNjIsCisgICAgICAgLTU4LCAgICAtNTMsICAgIC00OSwgICAgLTQ1LCAgICAtNDEsICAgIC0zOCwgICAgLTM1LCAgICAtMzIsCisgICAgICAgLTMwLCAgICAtMjcsICAgIC0yNSwgICAgLTIzLCAgICAtMjEsICAgIC0yMCwgICAgLTE4LCAgICAtMTcsCisgICAgICAgLTE1LCAgICAtMTQsICAgIC0xMywgICAgLTEyLCAgICAtMTEsICAgIC0xMCwgICAgIC05LCAgICAgLTgsCisgICAgICAgIC03LCAgICAgLTYsICAgICAtNSwgICAgIC00LCAgICAgLTMsICAgICAtMiwgICAgIC0xLCAgICAgIDAsCisgICAgICAgICAwLCAgICAgIDEsICAgICAgMiwgICAgICAzLCAgICAgIDQsICAgICAgNSwgICAgICA2LCAgICAgIDcsCisgICAgICAgICA4LCAgICAgIDksICAgICAxMCwgICAgIDExLCAgICAgMTIsICAgICAxMywgICAgIDE0LCAgICAgMTUsCisgICAgICAgIDE3LCAgICAgMTgsICAgICAyMCwgICAgIDIxLCAgICAgMjMsICAgICAyNSwgICAgIDI3LCAgICAgMzAsCisgICAgICAgIDMyLCAgICAgMzUsICAgICAzOCwgICAgIDQxLCAgICAgNDUsICAgICA0OSwgICAgIDUzLCAgICAgNTgsCisgICAgICAgIDYyLCAgICAgNjgsICAgICA3NCwgICAgIDgwLCAgICAgODcsICAgICA5NCwgICAgMTAyLCAgICAxMTEsCisgICAgICAgMTIwLCAgICAxMzAsICAgIDE0MSwgICAgMTUzLCAgICAxNjYsICAgIDE4MSwgICAgMTk2LCAgICAyMTIsCisgICAgICAgMjMwLCAgICAyNTAsICAgIDI3MSwgICAgMjk0LCAgICAzMTksICAgIDM0NiwgICAgMzc2LCAgICA0MDcsCisgICAgICAgNDQyLCAgICA0NzksICAgIDUyMCwgICAgNTY0LCAgICA2MTIsICAgIDY2MywgICAgNzIwLCAgICA3ODEsCisgICAgICAgODQ3LCAgICA5MTgsICAgIDk5NiwgICAxMDgwLCAgIDExNzIsICAgMTI3MSwgICAxMzc5LCAgIDE0OTUsCisgICAgICAxNjIyLCAgIDE3NTksICAgMTkwOCwgICAyMDcwLCAgIDIyNDUsICAgMjQzNSwgICAyNjQxLCAgIDI4NjUsCisgICAgICAzMTA3LCAgIDMzNzAsICAgMzY1NSwgICAzOTY0LCAgIDQzMDAsICAgNDY2NCwgICA1MDU5LCAgIDU0ODcsCisgICAgICA1OTUxLCAgIDY0NTUsICAgNzAwMSwgICA3NTkzLCAgIDgyMzYsICAgODkzMywgICA5Njg5LCAgMTA1MDgsCisgICAgIDExMzk4LCAgMTIzNjIsICAxMzQwOCwgIDE0NTQzLCAgMTU3NzQsICAxNzEwOCwgIDE4NTU2LCAgMjAxMjYsCisgICAgIDIxODI5LCAgMjM2NzcsICAyNTY4MCwgIDI3ODUzLCAgMzAyMTAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAKK307CisKK3N0YXRpYyBhdl9jb2xkIGludCBjaW5hdWRpb19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQ2luQXVkaW9Db250ZXh0ICpjaW4gPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgY2luLT5pbml0aWFsX2RlY29kZV9mcmFtZSA9IDE7CisgICAgY2luLT5kZWx0YSAgICAgICAgICAgICAgICA9IDA7CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgICAgICAgICA9IEFWX1NBTVBMRV9GTVRfUzE2OworICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICAgICAgPSAxOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCAgICAgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpbmF1ZGlvX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgICAgID0gYXZwa3QtPmRhdGE7CisgICAgQ2luQXVkaW9Db250ZXh0ICpjaW4gICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmX2VuZCA9IGJ1ZiArIGF2cGt0LT5zaXplOworICAgIGludDE2X3QgKnNhbXBsZXM7CisgICAgaW50IGRlbHRhLCByZXQ7CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gYXZwa3QtPnNpemUgLSBjaW4tPmluaXRpYWxfZGVjb2RlX2ZyYW1lOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgc2FtcGxlcyA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICBkZWx0YSA9IGNpbi0+ZGVsdGE7CisgICAgaWYgKGNpbi0+aW5pdGlhbF9kZWNvZGVfZnJhbWUpIHsKKyAgICAgICAgY2luLT5pbml0aWFsX2RlY29kZV9mcmFtZSA9IDA7CisgICAgICAgIGRlbHRhICAgICAgICAgICAgICAgICAgICAgPSBzaWduX2V4dGVuZChBVl9STDE2KGJ1ZiksIDE2KTsKKyAgICAgICAgYnVmICAgICAgICAgICAgICAgICAgICAgICs9IDI7CisgICAgICAgICpzYW1wbGVzKysgICAgICAgICAgICAgICAgPSBkZWx0YTsKKyAgICB9CisgICAgd2hpbGUgKGJ1ZiA8IGJ1Zl9lbmQpIHsKKyAgICAgICAgZGVsdGEgICAgICs9IGNpbmF1ZGlvX2RlbHRhMTZfdGFibGVbKmJ1ZisrXTsKKyAgICAgICAgZGVsdGEgICAgICA9IGF2X2NsaXBfaW50MTYoZGVsdGEpOworICAgICAgICAqc2FtcGxlcysrID0gZGVsdGE7CisgICAgfQorICAgIGNpbi0+ZGVsdGEgPSBkZWx0YTsKKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl9kc2ljaW5hdWRpb19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJkc2ljaW5hdWRpbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRlbHBoaW5lIFNvZnR3YXJlIEludGVybmF0aW9uYWwgQ0lOIGF1ZGlvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0RTSUNJTkFVRElPLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihDaW5BdWRpb0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGNpbmF1ZGlvX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGNpbmF1ZGlvX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2RzaWNpbnZpZGVvLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kc2ljaW52aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZmI2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kc2ljaW52aWRlby5jCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogRGVscGhpbmUgU29mdHdhcmUgSW50ZXJuYXRpb25hbCBDSU4gdmlkZW8gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA2IEdyZWdvcnkgTW9udG9pciAoY3l4QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRGVscGhpbmUgU29mdHdhcmUgSW50ZXJuYXRpb25hbCBDSU4gdmlkZW8gZGVjb2RlcgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgZW51bSBDaW5WaWRlb0JpdG1hcEluZGV4IHsKKyAgICBDSU5fQ1VSX0JNUCA9IDAsIC8qIGN1cnJlbnQgKi8KKyAgICBDSU5fUFJFX0JNUCA9IDEsIC8qIHByZXZpb3VzICovCisgICAgQ0lOX0lOVF9CTVAgPSAyICAvKiBpbnRlcm1lZGlhdGUgKi8KK30gQ2luVmlkZW9CaXRtYXBJbmRleDsKKwordHlwZWRlZiBzdHJ1Y3QgQ2luVmlkZW9Db250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgdW5zaWduZWQgaW50IGJpdG1hcF9zaXplOworICAgIHVpbnQzMl90IHBhbGV0dGVbMjU2XTsKKyAgICB1aW50OF90ICpiaXRtYXBfdGFibGVbM107Cit9IENpblZpZGVvQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgdm9pZCBkZXN0cm95X2J1ZmZlcnMoQ2luVmlkZW9Db250ZXh0ICpjaW4pCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKQorICAgICAgICBhdl9mcmVlcCgmY2luLT5iaXRtYXBfdGFibGVbaV0pOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYWxsb2NhdGVfYnVmZmVycyhDaW5WaWRlb0NvbnRleHQgKmNpbikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgY2luLT5iaXRtYXBfdGFibGVbaV0gPSBhdl9tYWxsb2N6KGNpbi0+Yml0bWFwX3NpemUpOworICAgICAgICBpZiAoIWNpbi0+Yml0bWFwX3RhYmxlW2ldKSB7CisgICAgICAgICAgICBhdl9sb2coY2luLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgYWxsb2NhdGUgYml0bWFwIGJ1ZmZlcnMuXG4iKTsKKyAgICAgICAgICAgIGRlc3Ryb3lfYnVmZmVycyhjaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgY2ludmlkZW9fZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENpblZpZGVvQ29udGV4dCAqY2luID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGNpbi0+YXZjdHggPSBhdmN0eDsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKworICAgIGNpbi0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghY2luLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGNpbi0+Yml0bWFwX3NpemUgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0OworICAgIGlmIChhbGxvY2F0ZV9idWZmZXJzKGNpbikpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2luX2FwcGx5X2RlbHRhX2RhdGEoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkKK3sKKyAgICB3aGlsZSAoc2l6ZS0tKQorICAgICAgICAqZHN0KysgKz0gKnNyYysrOworfQorCitzdGF0aWMgaW50IGNpbl9kZWNvZGVfaHVmZm1hbihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zaXplKQoreworICAgIGludCBiLCBodWZmX2NvZGUgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgaHVmZl9jb2RlX3RhYmxlWzE1XTsKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfY3VyICAgICAgID0gZHN0OworICAgIHVuc2lnbmVkIGNoYXIgKmRzdF9lbmQgICAgICAgPSBkc3QgKyBkc3Rfc2l6ZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfZW5kID0gc3JjICsgc3JjX3NpemU7CisKKyAgICBtZW1jcHkoaHVmZl9jb2RlX3RhYmxlLCBzcmMsIDE1KTsKKyAgICBzcmMgKz0gMTU7CisKKyAgICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgeworICAgICAgICBodWZmX2NvZGUgPSAqc3JjKys7CisgICAgICAgIGlmICgoaHVmZl9jb2RlID4+IDQpID09IDE1KSB7CisgICAgICAgICAgICBiICAgICAgICAgID0gaHVmZl9jb2RlIDw8IDQ7CisgICAgICAgICAgICBodWZmX2NvZGUgID0gKnNyYysrOworICAgICAgICAgICAgKmRzdF9jdXIrKyA9IGIgfCAoaHVmZl9jb2RlID4+IDQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICpkc3RfY3VyKysgPSBodWZmX2NvZGVfdGFibGVbaHVmZl9jb2RlID4+IDRdOworICAgICAgICBpZiAoZHN0X2N1ciA+PSBkc3RfZW5kKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaHVmZl9jb2RlICY9IDE1OworICAgICAgICBpZiAoaHVmZl9jb2RlID09IDE1KSB7CisgICAgICAgICAgICAqZHN0X2N1cisrID0gKnNyYysrOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICpkc3RfY3VyKysgPSBodWZmX2NvZGVfdGFibGVbaHVmZl9jb2RlXTsKKyAgICAgICAgaWYgKGRzdF9jdXIgPj0gZHN0X2VuZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBkc3RfY3VyIC0gZHN0OworfQorCitzdGF0aWMgaW50IGNpbl9kZWNvZGVfbHpzcyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zaXplKQoreworICAgIHVpbnQxNl90IGNtZDsKKyAgICBpbnQgaSwgc3osIG9mZnNldCwgY29kZTsKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfZW5kICAgICAgID0gZHN0ICsgZHN0X3NpemUsICpkc3Rfc3RhcnQgPSBkc3Q7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX2VuZCA9IHNyYyArIHNyY19zaXplOworCisgICAgd2hpbGUgKHNyYyA8IHNyY19lbmQgJiYgZHN0IDwgZHN0X2VuZCkgeworICAgICAgICBjb2RlID0gKnNyYysrOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOCAmJiBzcmMgPCBzcmNfZW5kICYmIGRzdCA8IGRzdF9lbmQ7ICsraSkgeworICAgICAgICAgICAgaWYgKGNvZGUgJiAoMSA8PCBpKSkgeworICAgICAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY21kICAgID0gQVZfUkwxNihzcmMpOworICAgICAgICAgICAgICAgIHNyYyAgICs9IDI7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gY21kID4+IDQ7CisgICAgICAgICAgICAgICAgaWYgKChpbnQpKGRzdCAtIGRzdF9zdGFydCkgPCBvZmZzZXQgKyAxKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBzeiA9IChjbWQgJiAweEYpICsgMjsKKyAgICAgICAgICAgICAgICAvKiBkb24ndCB1c2UgbWVtY3B5L21lbW1vdmUgaGVyZSBhcyB0aGUgZGVjb2Rpbmcgcm91dGluZQorICAgICAgICAgICAgICAgICAqIChhYil1c2VzIGJ1ZmZlciBvdmVybGFwcGluZ3MgdG8gcmVwZWF0IGJ5dGVzIGluIHRoZQorICAgICAgICAgICAgICAgICAqIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgc3ogPSBGRk1JTihzeiwgZHN0X2VuZCAtIGRzdCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHN6LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgKmRzdCA9ICooZHN0IC0gb2Zmc2V0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgICsrZHN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpbl9kZWNvZGVfcmxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3NpemUpCit7CisgICAgaW50IGxlbiwgY29kZTsKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RfZW5kICAgICAgID0gZHN0ICsgZHN0X3NpemU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX2VuZCA9IHNyYyArIHNyY19zaXplOworCisgICAgd2hpbGUgKHNyYyArIDEgPCBzcmNfZW5kICYmIGRzdCA8IGRzdF9lbmQpIHsKKyAgICAgICAgY29kZSA9ICpzcmMrKzsKKyAgICAgICAgaWYgKGNvZGUgJiAweDgwKSB7CisgICAgICAgICAgICBsZW4gPSBjb2RlIC0gMHg3RjsKKyAgICAgICAgICAgIG1lbXNldChkc3QsICpzcmMrKywgRkZNSU4obGVuLCBkc3RfZW5kIC0gZHN0KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZW4gPSBjb2RlICsgMTsKKyAgICAgICAgICAgIGlmIChsZW4gPiBzcmNfZW5kLXNyYykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJSTEUgb3ZlcnJlYWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBGRk1JTjMobGVuLCBkc3RfZW5kIC0gZHN0LCBzcmNfZW5kIC0gc3JjKSk7CisgICAgICAgICAgICBzcmMgKz0gbGVuOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBsZW47CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpbnZpZGVvX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgICA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgQ2luVmlkZW9Db250ZXh0ICpjaW4gPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCB5LCBwYWxldHRlX3R5cGUsIHBhbGV0dGVfY29sb3JzX2NvdW50LAorICAgICAgICBiaXRtYXBfZnJhbWVfdHlwZSwgYml0bWFwX2ZyYW1lX3NpemUsIHJlcyA9IDA7CisKKyAgICBwYWxldHRlX3R5cGUgICAgICAgICA9IGJ1ZlswXTsKKyAgICBwYWxldHRlX2NvbG9yc19jb3VudCA9IEFWX1JMMTYoYnVmICsgMSk7CisgICAgYml0bWFwX2ZyYW1lX3R5cGUgICAgPSBidWZbM107CisgICAgYnVmICAgICAgICAgICAgICAgICArPSA0OworCisgICAgYml0bWFwX2ZyYW1lX3NpemUgPSBidWZfc2l6ZSAtIDQ7CisKKyAgICAvKiBoYW5kbGUgcGFsZXR0ZSAqLworICAgIGlmIChiaXRtYXBfZnJhbWVfc2l6ZSA8IHBhbGV0dGVfY29sb3JzX2NvdW50ICogKDMgKyAocGFsZXR0ZV90eXBlICE9IDApKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKHBhbGV0dGVfdHlwZSA9PSAwKSB7CisgICAgICAgIGlmIChwYWxldHRlX2NvbG9yc19jb3VudCA+IDI1NikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFsZXR0ZV9jb2xvcnNfY291bnQ7ICsraSkgeworICAgICAgICAgICAgY2luLT5wYWxldHRlW2ldICAgID0gMHhGRlUgPDwgMjQgfCBieXRlc3RyZWFtX2dldF9sZTI0KCZidWYpOworICAgICAgICAgICAgYml0bWFwX2ZyYW1lX3NpemUgLT0gMzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWxldHRlX2NvbG9yc19jb3VudDsgKytpKSB7CisgICAgICAgICAgICBjaW4tPnBhbGV0dGVbYnVmWzBdXSA9IDB4RkZVIDw8IDI0IHwgQVZfUkwyNChidWYgKyAxKTsKKyAgICAgICAgICAgIGJ1ZiAgICAgICAgICAgICAgICAgKz0gNDsKKyAgICAgICAgICAgIGJpdG1hcF9mcmFtZV9zaXplICAgLT0gNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG5vdGU6IHRoZSBkZWNvZGluZyByb3V0aW5lcyBiZWxvdyBhc3N1bWVzIHRoYXQKKyAgICAgKiBzdXJmYWNlLndpZHRoID0gc3VyZmFjZS5waXRjaCAqLworICAgIHN3aXRjaCAoYml0bWFwX2ZyYW1lX3R5cGUpIHsKKyAgICBjYXNlIDk6CisgICAgICAgIGNpbl9kZWNvZGVfcmxlKGJ1ZiwgYml0bWFwX2ZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9DVVJfQk1QXSwgY2luLT5iaXRtYXBfc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzQ6CisgICAgICAgIGNpbl9kZWNvZGVfcmxlKGJ1ZiwgYml0bWFwX2ZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9DVVJfQk1QXSwgY2luLT5iaXRtYXBfc2l6ZSk7CisgICAgICAgIGNpbl9hcHBseV9kZWx0YV9kYXRhKGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9QUkVfQk1QXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2luLT5iaXRtYXBfdGFibGVbQ0lOX0NVUl9CTVBdLCBjaW4tPmJpdG1hcF9zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzNToKKyAgICAgICAgYml0bWFwX2ZyYW1lX3NpemUgPSBjaW5fZGVjb2RlX2h1ZmZtYW4oYnVmLCBiaXRtYXBfZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9JTlRfQk1QXSwgY2luLT5iaXRtYXBfc2l6ZSk7CisgICAgICAgIGNpbl9kZWNvZGVfcmxlKGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9JTlRfQk1QXSwgYml0bWFwX2ZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9DVVJfQk1QXSwgY2luLT5iaXRtYXBfc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzY6CisgICAgICAgIGJpdG1hcF9mcmFtZV9zaXplID0gY2luX2RlY29kZV9odWZmbWFuKGJ1ZiwgYml0bWFwX2ZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9JTlRfQk1QXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2luLT5iaXRtYXBfc2l6ZSk7CisgICAgICAgIGNpbl9kZWNvZGVfcmxlKGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9JTlRfQk1QXSwgYml0bWFwX2ZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9DVVJfQk1QXSwgY2luLT5iaXRtYXBfc2l6ZSk7CisgICAgICAgIGNpbl9hcHBseV9kZWx0YV9kYXRhKGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9QUkVfQk1QXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2luLT5iaXRtYXBfdGFibGVbQ0lOX0NVUl9CTVBdLCBjaW4tPmJpdG1hcF9zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzNzoKKyAgICAgICAgY2luX2RlY29kZV9odWZmbWFuKGJ1ZiwgYml0bWFwX2ZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaW4tPmJpdG1hcF90YWJsZVtDSU5fQ1VSX0JNUF0sIGNpbi0+Yml0bWFwX3NpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM4OgorICAgICAgICByZXMgPSBjaW5fZGVjb2RlX2x6c3MoYnVmLCBiaXRtYXBfZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9DVVJfQk1QXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3NpemUpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzk6CisgICAgICAgIHJlcyA9IGNpbl9kZWNvZGVfbHpzcyhidWYsIGJpdG1hcF9mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2luLT5iaXRtYXBfdGFibGVbQ0lOX0NVUl9CTVBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2luLT5iaXRtYXBfc2l6ZSk7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgY2luX2FwcGx5X2RlbHRhX2RhdGEoY2luLT5iaXRtYXBfdGFibGVbQ0lOX1BSRV9CTVBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaW4tPmJpdG1hcF90YWJsZVtDSU5fQ1VSX0JNUF0sIGNpbi0+Yml0bWFwX3NpemUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgY2luLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIG1lbWNweShjaW4tPmZyYW1lLT5kYXRhWzFdLCBjaW4tPnBhbGV0dGUsIHNpemVvZihjaW4tPnBhbGV0dGUpKTsKKyAgICBjaW4tPmZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgY2luLT5hdmN0eC0+aGVpZ2h0OyArK3kpCisgICAgICAgIG1lbWNweShjaW4tPmZyYW1lLT5kYXRhWzBdICsgKGNpbi0+YXZjdHgtPmhlaWdodCAtIDEgLSB5KSAqIGNpbi0+ZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgY2luLT5iaXRtYXBfdGFibGVbQ0lOX0NVUl9CTVBdICsgeSAqIGNpbi0+YXZjdHgtPndpZHRoLAorICAgICAgICAgICAgICAgY2luLT5hdmN0eC0+d2lkdGgpOworCisgICAgRkZTV0FQKHVpbnQ4X3QgKiwgY2luLT5iaXRtYXBfdGFibGVbQ0lOX0NVUl9CTVBdLAorICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9QUkVfQk1QXSk7CisKKyAgICBpZiAoKHJlcyA9IGF2X2ZyYW1lX3JlZihkYXRhLCBjaW4tPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjaW52aWRlb19kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDaW5WaWRlb0NvbnRleHQgKmNpbiA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZjaW4tPmZyYW1lKTsKKworICAgIGRlc3Ryb3lfYnVmZmVycyhjaW4pOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfZHNpY2ludmlkZW9fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZHNpY2ludmlkZW8iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEZWxwaGluZSBTb2Z0d2FyZSBJbnRlcm5hdGlvbmFsIENJTiB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9EU0lDSU5WSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ2luVmlkZW9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBjaW52aWRlb19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBjaW52aWRlb19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGNpbnZpZGVvX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2R1bXBfZXh0cmFkYXRhX2JzZi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHVtcF9leHRyYWRhdGFfYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjYmY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R1bXBfZXh0cmFkYXRhX2JzZi5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworCitzdGF0aWMgaW50IGR1bXBfZXh0cmFkYXRhKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBrZXlmcmFtZSl7CisgICAgaW50IGNtZD0gYXJncyA/ICphcmdzIDogMDsKKyAgICAvKiBjYXN0IHRvIGF2b2lkIHdhcm5pbmcgYWJvdXQgZGlzY2FyZGluZyBxdWFsaWZpZXJzICovCisgICAgaWYoYXZjdHgtPmV4dHJhZGF0YSl7CisgICAgICAgIGlmKCAgKGtleWZyYW1lICYmIChhdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfTE9DQUxfSEVBREVSKSAmJiBjbWQ9PSdhJykKKyAgICAgICAgICAgfHwoa2V5ZnJhbWUgJiYgKGNtZD09J2snIHx8ICFjbWQpKQorICAgICAgICAgICB8fChjbWQ9PSdlJykKKyAgICAgICAgICAgIC8qfHwoPyAmJiAocy0+ZmxhZ3MgJiBQQVJTRVJfRkxBR19EVU1QX0VYVFJBREFUQV9BVF9CRUdJTikqLyl7CisgICAgICAgICAgICBpbnQgc2l6ZT0gYnVmX3NpemUgKyBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgICAgICAqcG91dGJ1Zl9zaXplPSBzaXplOworICAgICAgICAgICAgKnBvdXRidWY9IGF2X21hbGxvYyhzaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICAgICAgICAgIG1lbWNweSgqcG91dGJ1ZiwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIG1lbWNweSgoKnBvdXRidWYpICsgYXZjdHgtPmV4dHJhZGF0YV9zaXplLCBidWYsIGJ1Zl9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworQVZCaXRTdHJlYW1GaWx0ZXIgZmZfZHVtcF9leHRyYWRhdGFfYnNmPXsKKyAgICAubmFtZSAgID0gImR1bXBfZXh0cmEiLAorICAgIC5maWx0ZXIgPSBkdW1wX2V4dHJhZGF0YSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kdi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmM3ZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHYuYwpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIERWIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwNCBSb21hbiBTaGFwb3NobmlrCisgKgorICogRFYgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIFJvbWFuIFNoYXBvc2huaWsKKyAqCisgKiA1MCBNYnBzIChEVkNQUk81MCkgc3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDA2IERhbmllbCBNYWFzIDxkbWFhc0BtYWFzZGlnaXRhbC5jb20+CisgKgorICogMTAwIE1icHMgKERWQ1BSTyBIRCkgc3VwcG9ydAorICogSW5pdGlhbCBjb2RlIGJ5IERhbmllbCBNYWFzIDxkbWFhc0BtYWFzZGlnaXRhbC5jb20+IChmdW5kZWQgYnkgQkJDIFImRCkKKyAqIEZpbmFsIGNvZGUgYnkgUm9tYW4gU2hhcG9zaG5paworICoKKyAqIE1hbnkgdGhhbmtzIHRvIERhbiBEZW5uZWR5IDxkYW5AZGVubmVkeS5vcmc+IGZvciBwcm92aWRpbmcgd2VhbHRoCisgKiBvZiBEViB0ZWNobmljYWwgaW5mby4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRFYgY29kZWMuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZHYuaCIKKyNpbmNsdWRlICJkdmRhdGEuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJzaW1wbGVfaWRjdC5oIgorCisvKiBYWFg6IGFsc28gaW5jbHVkZSBxdWFudGl6YXRpb24gKi8KK1JMX1ZMQ19FTEVNIGZmX2R2X3JsX3ZsY1sxNjY0XTsKKworc3RhdGljIGlubGluZSB2b2lkIGR2X2NhbGNfbWJfY29vcmRpbmF0ZXMoY29uc3QgQVZEVlByb2ZpbGUgKmQsIGludCBjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcSwgaW50IHNsb3QsIHVpbnQxNl90ICp0YmwpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb2ZmW10gICA9IHsgIDIsICA2LCAgOCwgMCwgIDQgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBzaHVmMVtdID0geyAzNiwgMTgsIDU0LCAwLCA3MiB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHNodWYyW10gPSB7IDI0LCAxMiwgMzYsIDAsIDQ4IH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2h1ZjNbXSA9IHsgMTgsICA5LCAyNywgMCwgMzYgfTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGxfc3RhcnRbXSAgICAgICAgICA9IHsgMCwgNCwgOSwgMTMsIDE4LCAyMiwgMjcsIDMxLCAzNiwgNDAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBsX3N0YXJ0X3NodWZmbGVkW10gPSB7IDksIDQsIDEzLCAwLCAxOCB9OworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2VycGVudDFbXSA9IHsKKyAgICAgICAgMCwgMSwgMiwgMiwgMSwgMCwKKyAgICAgICAgMCwgMSwgMiwgMiwgMSwgMCwKKyAgICAgICAgMCwgMSwgMiwgMiwgMSwgMCwKKyAgICAgICAgMCwgMSwgMiwgMiwgMSwgMCwKKyAgICAgICAgMCwgMSwgMgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2VycGVudDJbXSA9IHsKKyAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNSwgNCwgMywgMiwgMSwgMCwKKyAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNSwgNCwgMywgMiwgMSwgMCwKKyAgICAgICAgMCwgMSwgMiwgMywgNCwgNQorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCByZW1hcFtdWzJdID0geworICAgICAgICB7ICAwLCAgMCB9LCB7ICAwLCAgMCB9LCB7ICAwLCAgMCB9LCB7ICAwLCAgMCB9LCAvKiBkdW1teSAqLworICAgICAgICB7ICAwLCAgMCB9LCB7ICAwLCAgMSB9LCB7ICAwLCAgMiB9LCB7ICAwLCAgMyB9LCB7IDEwLCAgMCB9LAorICAgICAgICB7IDEwLCAgMSB9LCB7IDEwLCAgMiB9LCB7IDEwLCAgMyB9LCB7IDIwLCAgMCB9LCB7IDIwLCAgMSB9LAorICAgICAgICB7IDIwLCAgMiB9LCB7IDIwLCAgMyB9LCB7IDMwLCAgMCB9LCB7IDMwLCAgMSB9LCB7IDMwLCAgMiB9LAorICAgICAgICB7IDMwLCAgMyB9LCB7IDQwLCAgMCB9LCB7IDQwLCAgMSB9LCB7IDQwLCAgMiB9LCB7IDQwLCAgMyB9LAorICAgICAgICB7IDUwLCAgMCB9LCB7IDUwLCAgMSB9LCB7IDUwLCAgMiB9LCB7IDUwLCAgMyB9LCB7IDYwLCAgMCB9LAorICAgICAgICB7IDYwLCAgMSB9LCB7IDYwLCAgMiB9LCB7IDYwLCAgMyB9LCB7IDcwLCAgMCB9LCB7IDcwLCAgMSB9LAorICAgICAgICB7IDcwLCAgMiB9LCB7IDcwLCAgMyB9LCB7ICAwLCA2NCB9LCB7ICAwLCA2NSB9LCB7ICAwLCA2NiB9LAorICAgICAgICB7IDEwLCA2NCB9LCB7IDEwLCA2NSB9LCB7IDEwLCA2NiB9LCB7IDIwLCA2NCB9LCB7IDIwLCA2NSB9LAorICAgICAgICB7IDIwLCA2NiB9LCB7IDMwLCA2NCB9LCB7IDMwLCA2NSB9LCB7IDMwLCA2NiB9LCB7IDQwLCA2NCB9LAorICAgICAgICB7IDQwLCA2NSB9LCB7IDQwLCA2NiB9LCB7IDUwLCA2NCB9LCB7IDUwLCA2NSB9LCB7IDUwLCA2NiB9LAorICAgICAgICB7IDYwLCA2NCB9LCB7IDYwLCA2NSB9LCB7IDYwLCA2NiB9LCB7IDcwLCA2NCB9LCB7IDcwLCA2NSB9LAorICAgICAgICB7IDcwLCA2NiB9LCB7ICAwLCA2NyB9LCB7IDIwLCA2NyB9LCB7IDQwLCA2NyB9LCB7IDYwLCA2NyB9CisgICAgfTsKKworICAgIGludCBpLCBrLCBtOworICAgIGludCB4LCB5LCBibGs7CisKKyAgICBmb3IgKG0gPSAwOyBtIDwgNTsgbSsrKSB7CisgICAgICAgIHN3aXRjaCAoZC0+d2lkdGgpIHsKKyAgICAgICAgY2FzZSAxNDQwOgorICAgICAgICAgICAgYmxrID0gKGNoYW4gKiAxMSArIHNlcSkgKiAyNyArIHNsb3Q7CisKKyAgICAgICAgICAgIGlmIChjaGFuID09IDAgJiYgc2VxID09IDExKSB7CisgICAgICAgICAgICAgICAgeCA9IG0gKiAyNyArIHNsb3Q7CisgICAgICAgICAgICAgICAgaWYgKHggPCA5MCkgeworICAgICAgICAgICAgICAgICAgICB5ID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4ID0gKHggLSA5MCkgKiAyOworICAgICAgICAgICAgICAgICAgICB5ID0gNjc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpID0gKDQgKiBjaGFuICsgYmxrICsgb2ZmW21dKSAlIDExOworICAgICAgICAgICAgICAgIGsgPSAoYmxrIC8gMTEpICUgMjc7CisKKyAgICAgICAgICAgICAgICB4ID0gc2h1ZjFbbV0gKyAoY2hhbiAmIDEpICogOSArIGsgJSA5OworICAgICAgICAgICAgICAgIHkgPSAoaSAqIDMgKyBrIC8gOSkgKiAyICsgKGNoYW4gPj4gMSkgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGJsW21dID0gKHggPDwgMSkgfCAoeSA8PCA5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyODA6CisgICAgICAgICAgICBibGsgPSAoY2hhbiAqIDEwICsgc2VxKSAqIDI3ICsgc2xvdDsKKworICAgICAgICAgICAgaSA9ICg0ICogY2hhbiArIChzZXEgLyA1KSArIDIgKiBibGsgKyBvZmZbbV0pICUgMTA7CisgICAgICAgICAgICBrID0gKGJsayAvIDUpICUgMjc7CisKKyAgICAgICAgICAgIHggPSBzaHVmMVttXSArIChjaGFuICYgMSkgKiA5ICsgayAlIDk7CisgICAgICAgICAgICB5ID0gKGkgKiAzICsgayAvIDkpICogMiArIChjaGFuID4+IDEpICsgNDsKKworICAgICAgICAgICAgaWYgKHggPj0gODApIHsKKyAgICAgICAgICAgICAgICB4ID0gcmVtYXBbeV1bMF0gKyAoKHggLSA4MCkgPDwgKHkgPiA1OSkpOworICAgICAgICAgICAgICAgIHkgPSByZW1hcFt5XVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRibFttXSA9ICh4IDw8IDEpIHwgKHkgPDwgOSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA5NjA6CisgICAgICAgICAgICBibGsgPSAoY2hhbiAqIDEwICsgc2VxKSAqIDI3ICsgc2xvdDsKKworICAgICAgICAgICAgaSA9ICg0ICogY2hhbiArIChzZXEgLyA1KSArIDIgKiBibGsgKyBvZmZbbV0pICUgMTA7CisgICAgICAgICAgICBrID0gKGJsayAvIDUpICUgMjcgKyAoaSAmIDEpICogMzsKKworICAgICAgICAgICAgeCAgICAgID0gc2h1ZjJbbV0gICArIGsgJSA2ICsgIDYgKiAoY2hhbiAgJiAxKTsKKyAgICAgICAgICAgIHkgICAgICA9IGxfc3RhcnRbaV0gKyBrIC8gNiArIDQ1ICogKGNoYW4gPj4gMSk7CisgICAgICAgICAgICB0YmxbbV0gPSAoeCA8PCAxKSB8ICh5IDw8IDkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzIwOgorICAgICAgICAgICAgc3dpdGNoIChkLT5waXhfZm10KSB7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKKyAgICAgICAgICAgICAgICB4ID0gc2h1ZjNbbV0gKyBzbG90IC8gMzsKKyAgICAgICAgICAgICAgICB5ID0gc2VycGVudDFbc2xvdF0gKworICAgICAgICAgICAgICAgICAgICAoKCgoc2VxICsgb2ZmW21dKSAlIGQtPmRpZnNlZ19zaXplKSA8PCAxKSArIGNoYW4pICogMzsKKyAgICAgICAgICAgICAgICB0YmxbbV0gPSAoeCA8PCAxKSB8ICh5IDw8IDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgICAgICAgICAgICAgeCA9IHNodWYzW21dICsgc2xvdCAvIDM7CisgICAgICAgICAgICAgICAgeSA9IHNlcnBlbnQxW3Nsb3RdICsKKyAgICAgICAgICAgICAgICAgICAgKChzZXEgKyBvZmZbbV0pICUgZC0+ZGlmc2VnX3NpemUpICogMzsKKyAgICAgICAgICAgICAgICB0YmxbbV0gPSAoeCA8PCAxKSB8ICh5IDw8IDkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQxMVA6CisgICAgICAgICAgICAgICAgaSA9IChzZXEgKyBvZmZbbV0pICUgZC0+ZGlmc2VnX3NpemU7CisgICAgICAgICAgICAgICAgayA9IHNsb3QgKyAoKG0gPT0gMSB8fCBtID09IDIpID8gMyA6IDApOworCisgICAgICAgICAgICAgICAgeCA9IGxfc3RhcnRfc2h1ZmZsZWRbbV0gKyBrIC8gNjsKKyAgICAgICAgICAgICAgICB5ID0gc2VycGVudDJba10gKyBpICogNjsKKyAgICAgICAgICAgICAgICBpZiAoeCA+IDIxKQorICAgICAgICAgICAgICAgICAgICB5ID0geSAqIDIgLSBpICogNjsKKyAgICAgICAgICAgICAgICB0YmxbbV0gPSAoeCA8PCAyKSB8ICh5IDw8IDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIHF1YW50aXphdGlvbiBxdWFudGEgYnkgUU5PIGZvciBEVjEwMCAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZHYxMDBfcXN0ZXBbMTZdID0geworICAgIDEsIC8qIFFOTyA9IDAgYW5kIDEgYm90aCBoYXZlIG5vIHF1YW50aXphdGlvbiAqLworICAgIDEsCisgICAgMiwgMywgNCwgNSwgNiwgNywgOCwgMTYsIDE4LCAyMCwgMjIsIDI0LCAyOCwgNTIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGR2X3F1YW50X2FyZWFzWzRdID0geyA2LCAyMSwgNDMsIDY0IH07CisKK2ludCBmZl9kdl9pbml0X2R5bmFtaWNfdGFibGVzKERWVmlkZW9Db250ZXh0ICpjdHgsIGNvbnN0IEFWRFZQcm9maWxlICpkKQoreworICAgIGludCBqLCBpLCBjLCBzLCBwOworCisgICAgcCA9IGkgPSAwOworICAgIGZvciAoYyA9IDA7IGMgPCBkLT5uX2RpZmNoYW47IGMrKykgeworICAgICAgICBmb3IgKHMgPSAwOyBzIDwgZC0+ZGlmc2VnX3NpemU7IHMrKykgeworICAgICAgICAgICAgcCArPSA2OworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI3OyBqKyspIHsKKyAgICAgICAgICAgICAgICBwICs9ICEoaiAlIDMpOworICAgICAgICAgICAgICAgIGlmICghKERWX1BST0ZJTEVfSVNfMTA4MGk1MChkKSAmJiBjICE9IDAgJiYgcyA9PSAxMSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIShEVl9QUk9GSUxFX0lTXzcyMHA1MChkKSAmJiBzID4gOSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZHZfY2FsY19tYl9jb29yZGluYXRlcyhkLCBjLCBzLCBqLCAmY3R4LT53b3JrX2NodW5rc1tpXS5tYl9jb29yZGluYXRlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+d29ya19jaHVua3NbaSsrXS5idWZfb2Zmc2V0ID0gcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgaW50IGZmX2R2dmlkZW9faW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRFZWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0YXRpYyBpbnQgZG9uZSA9IDA7CisgICAgaW50IGksIGo7CisKKyAgICBpZiAoIWRvbmUpIHsKKyAgICAgICAgVkxDIGR2X3ZsYzsKKyAgICAgICAgdWludDE2X3QgIG5ld19kdl92bGNfYml0c1tOQl9EVl9WTEMgKiAyXTsKKyAgICAgICAgdWludDhfdCAgICBuZXdfZHZfdmxjX2xlbltOQl9EVl9WTEMgKiAyXTsKKyAgICAgICAgdWludDhfdCAgICBuZXdfZHZfdmxjX3J1bltOQl9EVl9WTEMgKiAyXTsKKyAgICAgICAgaW50MTZfdCAgbmV3X2R2X3ZsY19sZXZlbFtOQl9EVl9WTEMgKiAyXTsKKworICAgICAgICBkb25lID0gMTsKKworICAgICAgICAvKiBpdCdzIGZhc3RlciB0byBpbmNsdWRlIHNpZ24gYml0IGluIGEgZ2VuZXJpYyBWTEMgcGFyc2luZyBzY2hlbWUgKi8KKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBOQl9EVl9WTEM7IGkrKywgaisrKSB7CisgICAgICAgICAgICBuZXdfZHZfdmxjX2JpdHNbal0gID0gZmZfZHZfdmxjX2JpdHNbaV07CisgICAgICAgICAgICBuZXdfZHZfdmxjX2xlbltqXSAgID0gZmZfZHZfdmxjX2xlbltpXTsKKyAgICAgICAgICAgIG5ld19kdl92bGNfcnVuW2pdICAgPSBmZl9kdl92bGNfcnVuW2ldOworICAgICAgICAgICAgbmV3X2R2X3ZsY19sZXZlbFtqXSA9IGZmX2R2X3ZsY19sZXZlbFtpXTsKKworICAgICAgICAgICAgaWYgKGZmX2R2X3ZsY19sZXZlbFtpXSkgeworICAgICAgICAgICAgICAgIG5ld19kdl92bGNfYml0c1tqXSA8PD0gMTsKKyAgICAgICAgICAgICAgICBuZXdfZHZfdmxjX2xlbltqXSsrOworCisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIG5ld19kdl92bGNfYml0c1tqXSAgPSAoZmZfZHZfdmxjX2JpdHNbaV0gPDwgMSkgfCAxOworICAgICAgICAgICAgICAgIG5ld19kdl92bGNfbGVuW2pdICAgPSAgZmZfZHZfdmxjX2xlbltpXSArIDE7CisgICAgICAgICAgICAgICAgbmV3X2R2X3ZsY19ydW5bal0gICA9ICBmZl9kdl92bGNfcnVuW2ldOworICAgICAgICAgICAgICAgIG5ld19kdl92bGNfbGV2ZWxbal0gPSAtZmZfZHZfdmxjX2xldmVsW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogTk9URTogYXMgYSB0cmljaywgd2UgdXNlIHRoZSBmYWN0IHRoZSBubyBjb2RlcyBhcmUgdW51c2VkCisgICAgICAgICAqIHRvIGFjY2VsZXJhdGUgdGhlIHBhcnNpbmcgb2YgcGFydGlhbCBjb2RlcyAqLworICAgICAgICBpbml0X3ZsYygmZHZfdmxjLCBURVhfVkxDX0JJVFMsIGosIG5ld19kdl92bGNfbGVuLAorICAgICAgICAgICAgICAgICAxLCAxLCBuZXdfZHZfdmxjX2JpdHMsIDIsIDIsIDApOworICAgICAgICBhdl9hc3NlcnQxKGR2X3ZsYy50YWJsZV9zaXplID09IDE2NjQpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkdl92bGMudGFibGVfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgY29kZSA9IGR2X3ZsYy50YWJsZVtpXVswXTsKKyAgICAgICAgICAgIGludCBsZW4gID0gZHZfdmxjLnRhYmxlW2ldWzFdOworICAgICAgICAgICAgaW50IGxldmVsLCBydW47CisKKyAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IC8vIG1vcmUgYml0cyBuZWVkZWQKKyAgICAgICAgICAgICAgICBydW4gICA9IDA7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBjb2RlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW4gICA9IG5ld19kdl92bGNfcnVuW2NvZGVdICsgMTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IG5ld19kdl92bGNfbGV2ZWxbY29kZV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZl9kdl9ybF92bGNbaV0ubGVuICAgPSBsZW47CisgICAgICAgICAgICBmZl9kdl9ybF92bGNbaV0ubGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIGZmX2R2X3JsX3ZsY1tpXS5ydW4gICA9IHJ1bjsKKyAgICAgICAgfQorICAgICAgICBmZl9mcmVlX3ZsYygmZHZfdmxjKTsKKyAgICB9CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIGF2Y3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gQVZDSFJPTUFfTE9DX1RPUExFRlQ7CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHYuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyODI2MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2LmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb25zdGFudHMgZm9yIERWIGNvZGVjCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENvbnN0YW50cyBmb3IgRFYgY29kZWMuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0RWX0gKKyNkZWZpbmUgQVZDT0RFQ19EVl9ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZHZfcHJvZmlsZS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAibWVfY21wLmgiCisKK3R5cGVkZWYgc3RydWN0IERWd29ya19jaHVuayB7CisgICAgdWludDE2X3QgYnVmX29mZnNldDsKKyAgICB1aW50MTZfdCBtYl9jb29yZGluYXRlc1s1XTsKK30gRFZ3b3JrX2NodW5rOworCit0eXBlZGVmIHN0cnVjdCBEVlZpZGVvQ29udGV4dCB7CisgICAgY29uc3QgQVZEVlByb2ZpbGUgKnN5czsKKyAgICBBVkZyYW1lICAgICAgICAgKmZyYW1lOworICAgIEFWQ29kZWNDb250ZXh0ICAqYXZjdHg7CisgICAgdWludDhfdCAgICAgICAgICpidWY7CisKKyAgICB1aW50OF90IGR2X3ppZ3phZ1syXVs2NF07CisKKyAgICB2b2lkICgqZ2V0X3BpeGVscykoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CisgICAgdm9pZCAoKmZkY3RbMl0pKGludDE2X3QgKmJsb2NrKTsKKyAgICB2b2lkICgqaWRjdF9wdXRbMl0pKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKKyAgICBtZV9jbXBfZnVuYyBpbGRjdF9jbXA7CisgICAgRFZ3b3JrX2NodW5rIHdvcmtfY2h1bmtzWzQgKiAxMiAqIDI3XTsKKyAgICB1aW50MzJfdCBpZGN0X2ZhY3RvclsyICogNCAqIDE2ICogNjRdOworfSBEVlZpZGVvQ29udGV4dDsKKworZW51bSBkdl9zZWN0aW9uX3R5cGUgeworICAgIGR2X3NlY3RfaGVhZGVyICA9IDB4MWYsCisgICAgZHZfc2VjdF9zdWJjb2RlID0gMHgzZiwKKyAgICBkdl9zZWN0X3ZhdXggICAgPSAweDU2LAorICAgIGR2X3NlY3RfYXVkaW8gICA9IDB4NzYsCisgICAgZHZfc2VjdF92aWRlbyAgID0gMHg5NiwKK307CisKK2VudW0gZHZfcGFja190eXBlIHsKKyAgICBkdl9oZWFkZXI1MjUgICAgID0gMHgzZiwgIC8qIHNlZSBkdl93cml0ZV9wYWNrIGZvciBpbXBvcnRhbnQgZGV0YWlscyBvbiAqLworICAgIGR2X2hlYWRlcjYyNSAgICAgPSAweGJmLCAgLyogdGhlc2UgdHdvIHBhY2tzICovCisgICAgZHZfdGltZWNvZGUgICAgICA9IDB4MTMsCisgICAgZHZfYXVkaW9fc291cmNlICA9IDB4NTAsCisgICAgZHZfYXVkaW9fY29udHJvbCA9IDB4NTEsCisgICAgZHZfYXVkaW9fcmVjZGF0ZSA9IDB4NTIsCisgICAgZHZfYXVkaW9fcmVjdGltZSA9IDB4NTMsCisgICAgZHZfdmlkZW9fc291cmNlICA9IDB4NjAsCisgICAgZHZfdmlkZW9fY29udHJvbCA9IDB4NjEsCisgICAgZHZfdmlkZW9fcmVjZGF0ZSA9IDB4NjIsCisgICAgZHZfdmlkZW9fcmVjdGltZSA9IDB4NjMsCisgICAgZHZfdW5rbm93bl9wYWNrICA9IDB4ZmYsCit9OworCisjZGVmaW5lIERWX1BST0ZJTEVfSVNfSEQocCkgKChwKS0+dmlkZW9fc3R5cGUgJiAweDEwKQorI2RlZmluZSBEVl9QUk9GSUxFX0lTXzEwODBpNTAocCkgKCgocCktPnZpZGVvX3N0eXBlID09IDB4MTQpICYmICgocCktPmRzZiA9PSAxKSkKKyNkZWZpbmUgRFZfUFJPRklMRV9JU183MjBwNTAocCkgICgoKHApLT52aWRlb19zdHlwZSA9PSAweDE4KSAmJiAoKHApLT5kc2YgPT0gMSkpCisKKy8qKgorICogbGFyZ2VzdCBwb3NzaWJsZSBEViBmcmFtZSwgaW4gYnl0ZXMgKDEwODBpNTApCisgKi8KKyNkZWZpbmUgRFZfTUFYX0ZSQU1FX1NJWkUgNTc2MDAwCisKKy8qKgorICogbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHBlciBtYWNyb2Jsb2NrIGluIGFueSBEViBmb3JtYXQKKyAqLworI2RlZmluZSBEVl9NQVhfQlBNIDgKKworI2RlZmluZSBURVhfVkxDX0JJVFMgMTAKKworZXh0ZXJuIFJMX1ZMQ19FTEVNIGZmX2R2X3JsX3ZsY1sxNjY0XTsKKworaW50IGZmX2R2X2luaXRfZHluYW1pY190YWJsZXMoRFZWaWRlb0NvbnRleHQgKnMsIGNvbnN0IEFWRFZQcm9maWxlICpkKTsKKworaW50IGZmX2R2dmlkZW9faW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCitzdGF0aWMgaW5saW5lIGludCBkdl93b3JrX3Bvb2xfc2l6ZShjb25zdCBBVkRWUHJvZmlsZSAqZCkKK3sKKyAgICBpbnQgc2l6ZSA9IGQtPm5fZGlmY2hhbiAqIGQtPmRpZnNlZ19zaXplICogMjc7CisgICAgaWYgKERWX1BST0ZJTEVfSVNfMTA4MGk1MChkKSkKKyAgICAgICAgc2l6ZSAtPSAzICogMjc7CisgICAgaWYgKERWX1BST0ZJTEVfSVNfNzIwcDUwKGQpKQorICAgICAgICBzaXplIC09IDQgKiAyNzsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR2X2NhbGN1bGF0ZV9tYl94eShEVlZpZGVvQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFZ3b3JrX2NodW5rICp3b3JrX2NodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbSwgaW50ICptYl94LCBpbnQgKm1iX3kpCit7CisgICAgKm1iX3ggPSB3b3JrX2NodW5rLT5tYl9jb29yZGluYXRlc1ttXSAmIDB4ZmY7CisgICAgKm1iX3kgPSB3b3JrX2NodW5rLT5tYl9jb29yZGluYXRlc1ttXSA+PiA4OworCisgICAgLyogV2Ugd29yayB3aXRoIDcyMHAgZnJhbWVzIHNwbGl0IGluIGhhbGYuCisgICAgICogVGhlIG9kZCBoYWxmLWZyYW1lIChjaGFuID09IDIsMykgaXMgZGlzcGxhY2VkIDotKCAqLworICAgIGlmIChzLT5zeXMtPmhlaWdodCA9PSA3MjAgJiYgIShzLT5idWZbMV0gJiAweDBDKSkKKyAgICAgICAgLyogc2hpZnRpbmcgdGhlIFkgY29vcmRpbmF0ZSBkb3duIGJ5IDcyLzIgbWFjcm8gYmxvY2tzICovCisgICAgICAgICptYl95IC09ICgqbWJfeSA+IDE3KSA/IDE4IDogLTcyOworfQorCisjZW5kaWYgLyogQVZDT0RFQ19EVl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kdl9wcm9maWxlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kdl9wcm9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwMWNiZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2X3Byb2ZpbGUuYwpAQCAtMCwwICsxLDMyOSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZHZfcHJvZmlsZS5oIgorI2luY2x1ZGUgImR2X3Byb2ZpbGVfaW50ZXJuYWwuaCIKKworI2lmIENPTkZJR19EVlBST0ZJTEUKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZHZfYXVkaW9fc2h1ZmZsZTUyNVsxMF1bOV0gPSB7CisgICAgeyAgMCwgMzAsIDYwLCAyMCwgNTAsIDgwLCAxMCwgNDAsIDcwIH0sIC8qIDFzdCBjaGFubmVsICovCisgICAgeyAgNiwgMzYsIDY2LCAyNiwgNTYsIDg2LCAxNiwgNDYsIDc2IH0sCisgICAgeyAxMiwgNDIsIDcyLCAgMiwgMzIsIDYyLCAyMiwgNTIsIDgyIH0sCisgICAgeyAxOCwgNDgsIDc4LCAgOCwgMzgsIDY4LCAyOCwgNTgsIDg4IH0sCisgICAgeyAyNCwgNTQsIDg0LCAxNCwgNDQsIDc0LCAgNCwgMzQsIDY0IH0sCisKKyAgICB7ICAxLCAzMSwgNjEsIDIxLCA1MSwgODEsIDExLCA0MSwgNzEgfSwgLyogMm5kIGNoYW5uZWwgKi8KKyAgICB7ICA3LCAzNywgNjcsIDI3LCA1NywgODcsIDE3LCA0NywgNzcgfSwKKyAgICB7IDEzLCA0MywgNzMsICAzLCAzMywgNjMsIDIzLCA1MywgODMgfSwKKyAgICB7IDE5LCA0OSwgNzksICA5LCAzOSwgNjksIDI5LCA1OSwgODkgfSwKKyAgICB7IDI1LCA1NSwgODUsIDE1LCA0NSwgNzUsICA1LCAzNSwgNjUgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGR2X2F1ZGlvX3NodWZmbGU2MjVbMTJdWzldID0geworICAgIHsgIDAsIDM2LCAgNzIsIDI2LCA2MiwgIDk4LCAxNiwgNTIsICA4OCB9LCAvKiAxc3QgY2hhbm5lbCAqLworICAgIHsgIDYsIDQyLCAgNzgsIDMyLCA2OCwgMTA0LCAyMiwgNTgsICA5NCB9LAorICAgIHsgMTIsIDQ4LCAgODQsICAyLCAzOCwgIDc0LCAyOCwgNjQsIDEwMCB9LAorICAgIHsgMTgsIDU0LCAgOTAsICA4LCA0NCwgIDgwLCAzNCwgNzAsIDEwNiB9LAorICAgIHsgMjQsIDYwLCAgOTYsIDE0LCA1MCwgIDg2LCAgNCwgNDAsICA3NiB9LAorICAgIHsgMzAsIDY2LCAxMDIsIDIwLCA1NiwgIDkyLCAxMCwgNDYsICA4MiB9LAorCisgICAgeyAgMSwgMzcsICA3MywgMjcsIDYzLCAgOTksIDE3LCA1MywgIDg5IH0sIC8qIDJuZCBjaGFubmVsICovCisgICAgeyAgNywgNDMsICA3OSwgMzMsIDY5LCAxMDUsIDIzLCA1OSwgIDk1IH0sCisgICAgeyAxMywgNDksICA4NSwgIDMsIDM5LCAgNzUsIDI5LCA2NSwgMTAxIH0sCisgICAgeyAxOSwgNTUsICA5MSwgIDksIDQ1LCAgODEsIDM1LCA3MSwgMTA3IH0sCisgICAgeyAyNSwgNjEsICA5NywgMTUsIDUxLCAgODcsICA1LCA0MSwgIDc3IH0sCisgICAgeyAzMSwgNjcsIDEwMywgMjEsIDU3LCAgOTMsIDExLCA0NywgIDgzIH0sCit9OworCisvKiBtYWNyb2Jsb2NrIGJpdCBidWRnZXRzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBibG9ja19zaXplc19kdjI1NTBbOF0gPSB7CisgICAgMTEyLCAxMTIsIDExMiwgMTEyLCA4MCwgODAsIDAsIDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBibG9ja19zaXplc19kdjEwMFs4XSA9IHsKKyAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA2NCwgNjQsCit9OworCitzdGF0aWMgY29uc3QgQVZEVlByb2ZpbGUgZHZfcHJvZmlsZXNbXSA9IHsKKyAgICB7IC5kc2YgICAgICAgICAgICAgICAgPSAwLAorICAgICAgLnZpZGVvX3N0eXBlICAgICAgICA9IDB4MCwKKyAgICAgIC5mcmFtZV9zaXplICAgICAgICAgPSAxMjAwMDAsIC8qIElFQyA2MTgzNCwgU01QVEUtMzE0TSAtIDUyNS82MCAoTlRTQykgKi8KKyAgICAgIC5kaWZzZWdfc2l6ZSAgICAgICAgPSAxMCwKKyAgICAgIC5uX2RpZmNoYW4gICAgICAgICAgPSAxLAorICAgICAgLnRpbWVfYmFzZSAgICAgICAgICA9IHsgMTAwMSwgMzAwMDAgfSwKKyAgICAgIC5sdGNfZGl2aXNvciAgICAgICAgPSAzMCwKKyAgICAgIC5oZWlnaHQgICAgICAgICAgICAgPSA0ODAsCisgICAgICAud2lkdGggICAgICAgICAgICAgID0gNzIwLAorICAgICAgLnNhciAgICAgICAgICAgICAgICA9IHsgeyA4LCA5IH0sIHsgMzIsIDI3IH0gfSwKKyAgICAgIC5waXhfZm10ICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAuYnBtICAgICAgICAgICAgICAgID0gNiwKKyAgICAgIC5ibG9ja19zaXplcyAgICAgICAgPSBibG9ja19zaXplc19kdjI1NTAsCisgICAgICAuYXVkaW9fc3RyaWRlICAgICAgID0gOTAsCisgICAgICAuYXVkaW9fbWluX3NhbXBsZXMgID0geyAxNTgwLCAxNDUyLCAxMDUzIH0sIC8qIGZvciA0OCwgNDQuMSBhbmQgMzJrSHogKi8KKyAgICAgIC5hdWRpb19zYW1wbGVzX2Rpc3QgPSB7IDE2MDAsIDE2MDIsIDE2MDIsIDE2MDIsIDE2MDIgfSwgIC8qIHBlciBTTVBURS0zMTRNICovCisgICAgICAuYXVkaW9fc2h1ZmZsZSAgICAgID0gZHZfYXVkaW9fc2h1ZmZsZTUyNSwgfSwKKyAgICB7IC5kc2YgICAgICAgICAgICAgICAgPSAxLAorICAgICAgLnZpZGVvX3N0eXBlICAgICAgICA9IDB4MCwKKyAgICAgIC5mcmFtZV9zaXplICAgICAgICAgPSAxNDQwMDAsIC8qIElFQyA2MTgzNCAtIDYyNS81MCAoUEFMKSAqLworICAgICAgLmRpZnNlZ19zaXplICAgICAgICA9IDEyLAorICAgICAgLm5fZGlmY2hhbiAgICAgICAgICA9IDEsCisgICAgICAudGltZV9iYXNlICAgICAgICAgID0geyAxLCAyNSB9LAorICAgICAgLmx0Y19kaXZpc29yICAgICAgICA9IDI1LAorICAgICAgLmhlaWdodCAgICAgICAgICAgICA9IDU3NiwKKyAgICAgIC53aWR0aCAgICAgICAgICAgICAgPSA3MjAsCisgICAgICAuc2FyICAgICAgICAgICAgICAgID0geyB7IDE2LCAxNSB9LCB7IDY0LCA0NSB9IH0sCisgICAgICAucGl4X2ZtdCAgICAgICAgICAgID0gQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgLmJwbSAgICAgICAgICAgICAgICA9IDYsCisgICAgICAuYmxvY2tfc2l6ZXMgICAgICAgID0gYmxvY2tfc2l6ZXNfZHYyNTUwLAorICAgICAgLmF1ZGlvX3N0cmlkZSAgICAgICA9IDEwOCwKKyAgICAgIC5hdWRpb19taW5fc2FtcGxlcyAgPSB7IDE4OTYsIDE3NDIsIDEyNjQgfSwgLyogZm9yIDQ4LCA0NC4xIGFuZCAzMmtIeiAqLworICAgICAgLmF1ZGlvX3NhbXBsZXNfZGlzdCA9IHsgMTkyMCwgMTkyMCwgMTkyMCwgMTkyMCwgMTkyMCB9LAorICAgICAgLmF1ZGlvX3NodWZmbGUgICAgICA9IGR2X2F1ZGlvX3NodWZmbGU2MjUsIH0sCisgICAgeyAuZHNmICAgICAgICAgICAgICAgID0gMSwKKyAgICAgIC52aWRlb19zdHlwZSAgICAgICAgPSAweDAsCisgICAgICAuZnJhbWVfc2l6ZSAgICAgICAgID0gMTQ0MDAwLCAvKiBTTVBURS0zMTRNIC0gNjI1LzUwIChQQUwpICovCisgICAgICAuZGlmc2VnX3NpemUgICAgICAgID0gMTIsCisgICAgICAubl9kaWZjaGFuICAgICAgICAgID0gMSwKKyAgICAgIC50aW1lX2Jhc2UgICAgICAgICAgPSB7IDEsIDI1IH0sCisgICAgICAubHRjX2Rpdmlzb3IgICAgICAgID0gMjUsCisgICAgICAuaGVpZ2h0ICAgICAgICAgICAgID0gNTc2LAorICAgICAgLndpZHRoICAgICAgICAgICAgICA9IDcyMCwKKyAgICAgIC5zYXIgICAgICAgICAgICAgICAgPSB7IHsgMTYsIDE1IH0sIHsgNjQsIDQ1IH0gfSwKKyAgICAgIC5waXhfZm10ICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAuYnBtICAgICAgICAgICAgICAgID0gNiwKKyAgICAgIC5ibG9ja19zaXplcyAgICAgICAgPSBibG9ja19zaXplc19kdjI1NTAsCisgICAgICAuYXVkaW9fc3RyaWRlICAgICAgID0gMTA4LAorICAgICAgLmF1ZGlvX21pbl9zYW1wbGVzICA9IHsgMTg5NiwgMTc0MiwgMTI2NCB9LCAvKiBmb3IgNDgsIDQ0LjEgYW5kIDMya0h6ICovCisgICAgICAuYXVkaW9fc2FtcGxlc19kaXN0ID0geyAxOTIwLCAxOTIwLCAxOTIwLCAxOTIwLCAxOTIwIH0sCisgICAgICAuYXVkaW9fc2h1ZmZsZSAgICAgID0gZHZfYXVkaW9fc2h1ZmZsZTYyNSwgfSwKKyAgICB7IC5kc2YgICAgICAgICAgICAgICAgPSAwLAorICAgICAgLnZpZGVvX3N0eXBlICAgICAgICA9IDB4NCwKKyAgICAgIC5mcmFtZV9zaXplICAgICAgICAgPSAyNDAwMDAsIC8qIFNNUFRFLTMxNE0gLSA1MjUvNjAgKE5UU0MpIDUwIE1icHMgKi8KKyAgICAgIC5kaWZzZWdfc2l6ZSAgICAgICAgPSAxMCwgICAgLyogYWxzbyBrbm93biBhcyAiRFZDUFJPNTAiICovCisgICAgICAubl9kaWZjaGFuICAgICAgICAgID0gMiwKKyAgICAgIC50aW1lX2Jhc2UgICAgICAgICAgPSB7IDEwMDEsIDMwMDAwIH0sCisgICAgICAubHRjX2Rpdmlzb3IgICAgICAgID0gMzAsCisgICAgICAuaGVpZ2h0ICAgICAgICAgICAgID0gNDgwLAorICAgICAgLndpZHRoICAgICAgICAgICAgICA9IDcyMCwKKyAgICAgIC5zYXIgICAgICAgICAgICAgICAgPSB7IHsgOCwgOSB9LCB7IDMyLCAyNyB9IH0sCisgICAgICAucGl4X2ZtdCAgICAgICAgICAgID0gQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgLmJwbSAgICAgICAgICAgICAgICA9IDYsCisgICAgICAuYmxvY2tfc2l6ZXMgICAgICAgID0gYmxvY2tfc2l6ZXNfZHYyNTUwLAorICAgICAgLmF1ZGlvX3N0cmlkZSAgICAgICA9IDkwLAorICAgICAgLmF1ZGlvX21pbl9zYW1wbGVzICA9IHsgMTU4MCwgMTQ1MiwgMTA1MyB9LCAvKiBmb3IgNDgsIDQ0LjEgYW5kIDMya0h6ICovCisgICAgICAuYXVkaW9fc2FtcGxlc19kaXN0ID0geyAxNjAwLCAxNjAyLCAxNjAyLCAxNjAyLCAxNjAyIH0sICAvKiBwZXIgU01QVEUtMzE0TSAqLworICAgICAgLmF1ZGlvX3NodWZmbGUgICAgICA9IGR2X2F1ZGlvX3NodWZmbGU1MjUsIH0sCisgICAgeyAuZHNmICAgICAgICAgICAgICAgID0gMSwKKyAgICAgIC52aWRlb19zdHlwZSAgICAgICAgPSAweDQsCisgICAgICAuZnJhbWVfc2l6ZSAgICAgICAgID0gMjg4MDAwLCAvKiBTTVBURS0zMTRNIC0gNjI1LzUwIChQQUwpIDUwIE1icHMgKi8KKyAgICAgIC5kaWZzZWdfc2l6ZSAgICAgICAgPSAxMiwgICAgLyogYWxzbyBrbm93biBhcyAiRFZDUFJPNTAiICovCisgICAgICAubl9kaWZjaGFuICAgICAgICAgID0gMiwKKyAgICAgIC50aW1lX2Jhc2UgICAgICAgICAgPSB7IDEsIDI1IH0sCisgICAgICAubHRjX2Rpdmlzb3IgICAgICAgID0gMjUsCisgICAgICAuaGVpZ2h0ICAgICAgICAgICAgID0gNTc2LAorICAgICAgLndpZHRoICAgICAgICAgICAgICA9IDcyMCwKKyAgICAgIC5zYXIgICAgICAgICAgICAgICAgPSB7IHsgMTYsIDE1IH0sIHsgNjQsIDQ1IH0gfSwKKyAgICAgIC5waXhfZm10ICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAuYnBtICAgICAgICAgICAgICAgID0gNiwKKyAgICAgIC5ibG9ja19zaXplcyAgICAgICAgPSBibG9ja19zaXplc19kdjI1NTAsCisgICAgICAuYXVkaW9fc3RyaWRlICAgICAgID0gMTA4LAorICAgICAgLmF1ZGlvX21pbl9zYW1wbGVzICA9IHsgMTg5NiwgMTc0MiwgMTI2NCB9LCAvKiBmb3IgNDgsIDQ0LjEgYW5kIDMya0h6ICovCisgICAgICAuYXVkaW9fc2FtcGxlc19kaXN0ID0geyAxOTIwLCAxOTIwLCAxOTIwLCAxOTIwLCAxOTIwIH0sCisgICAgICAuYXVkaW9fc2h1ZmZsZSAgICAgID0gZHZfYXVkaW9fc2h1ZmZsZTYyNSwgfSwKKyAgICB7IC5kc2YgICAgICAgICAgICAgICAgPSAwLAorICAgICAgLnZpZGVvX3N0eXBlICAgICAgICA9IDB4MTQsCisgICAgICAuZnJhbWVfc2l6ZSAgICAgICAgID0gNDgwMDAwLCAvKiBTTVBURS0zNzBNIC0gMTA4MGk2MCAxMDAgTWJwcyAqLworICAgICAgLmRpZnNlZ19zaXplICAgICAgICA9IDEwLCAgICAvKiBhbHNvIGtub3duIGFzICJEVkNQUk8gSEQiICovCisgICAgICAubl9kaWZjaGFuICAgICAgICAgID0gNCwKKyAgICAgIC50aW1lX2Jhc2UgICAgICAgICAgPSB7IDEwMDEsIDMwMDAwIH0sCisgICAgICAubHRjX2Rpdmlzb3IgICAgICAgID0gMzAsCisgICAgICAuaGVpZ2h0ICAgICAgICAgICAgID0gMTA4MCwKKyAgICAgIC53aWR0aCAgICAgICAgICAgICAgPSAxMjgwLAorICAgICAgLnNhciAgICAgICAgICAgICAgICA9IHsgeyAxLCAxIH0sIHsgMywgMiB9IH0sCisgICAgICAucGl4X2ZtdCAgICAgICAgICAgID0gQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgLmJwbSAgICAgICAgICAgICAgICA9IDgsCisgICAgICAuYmxvY2tfc2l6ZXMgICAgICAgID0gYmxvY2tfc2l6ZXNfZHYxMDAsCisgICAgICAuYXVkaW9fc3RyaWRlICAgICAgID0gOTAsCisgICAgICAuYXVkaW9fbWluX3NhbXBsZXMgID0geyAxNTgwLCAxNDUyLCAxMDUzIH0sIC8qIGZvciA0OCwgNDQuMSBhbmQgMzJrSHogKi8KKyAgICAgIC5hdWRpb19zYW1wbGVzX2Rpc3QgPSB7IDE2MDAsIDE2MDIsIDE2MDIsIDE2MDIsIDE2MDIgfSwgIC8qIHBlciBTTVBURS0zMTRNICovCisgICAgICAuYXVkaW9fc2h1ZmZsZSAgICAgID0gZHZfYXVkaW9fc2h1ZmZsZTUyNSwgfSwKKyAgICB7IC5kc2YgICAgICAgICAgICAgICAgPSAxLAorICAgICAgLnZpZGVvX3N0eXBlICAgICAgICA9IDB4MTQsCisgICAgICAuZnJhbWVfc2l6ZSAgICAgICAgID0gNTc2MDAwLCAvKiBTTVBURS0zNzBNIC0gMTA4MGk1MCAxMDAgTWJwcyAqLworICAgICAgLmRpZnNlZ19zaXplICAgICAgICA9IDEyLCAgICAvKiBhbHNvIGtub3duIGFzICJEVkNQUk8gSEQiICovCisgICAgICAubl9kaWZjaGFuICAgICAgICAgID0gNCwKKyAgICAgIC50aW1lX2Jhc2UgICAgICAgICAgPSB7IDEsIDI1IH0sCisgICAgICAubHRjX2Rpdmlzb3IgICAgICAgID0gMjUsCisgICAgICAuaGVpZ2h0ICAgICAgICAgICAgID0gMTA4MCwKKyAgICAgIC53aWR0aCAgICAgICAgICAgICAgPSAxNDQwLAorICAgICAgLnNhciAgICAgICAgICAgICAgICA9IHsgeyAxLCAxIH0sIHsgNCwgMyB9IH0sCisgICAgICAucGl4X2ZtdCAgICAgICAgICAgID0gQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgLmJwbSAgICAgICAgICAgICAgICA9IDgsCisgICAgICAuYmxvY2tfc2l6ZXMgICAgICAgID0gYmxvY2tfc2l6ZXNfZHYxMDAsCisgICAgICAuYXVkaW9fc3RyaWRlICAgICAgID0gMTA4LAorICAgICAgLmF1ZGlvX21pbl9zYW1wbGVzICA9IHsgMTg5NiwgMTc0MiwgMTI2NCB9LCAvKiBmb3IgNDgsIDQ0LjEgYW5kIDMya0h6ICovCisgICAgICAuYXVkaW9fc2FtcGxlc19kaXN0ID0geyAxOTIwLCAxOTIwLCAxOTIwLCAxOTIwLCAxOTIwIH0sCisgICAgICAuYXVkaW9fc2h1ZmZsZSAgICAgID0gZHZfYXVkaW9fc2h1ZmZsZTYyNSwgfSwKKyAgICB7IC5kc2YgICAgICAgICAgICAgICAgPSAwLAorICAgICAgLnZpZGVvX3N0eXBlICAgICAgICA9IDB4MTgsCisgICAgICAuZnJhbWVfc2l6ZSAgICAgICAgID0gMjQwMDAwLCAvKiBTTVBURS0zNzBNIC0gNzIwcDYwIDEwMCBNYnBzICovCisgICAgICAuZGlmc2VnX3NpemUgICAgICAgID0gMTAsICAgIC8qIGFsc28ga25vd24gYXMgIkRWQ1BSTyBIRCIgKi8KKyAgICAgIC5uX2RpZmNoYW4gICAgICAgICAgPSAyLAorICAgICAgLnRpbWVfYmFzZSAgICAgICAgICA9IHsgMTAwMSwgNjAwMDAgfSwKKyAgICAgIC5sdGNfZGl2aXNvciAgICAgICAgPSA2MCwKKyAgICAgIC5oZWlnaHQgICAgICAgICAgICAgPSA3MjAsCisgICAgICAud2lkdGggICAgICAgICAgICAgID0gOTYwLAorICAgICAgLnNhciAgICAgICAgICAgICAgICA9IHsgeyAxLCAxIH0sIHsgNCwgMyB9IH0sCisgICAgICAucGl4X2ZtdCAgICAgICAgICAgID0gQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgLmJwbSAgICAgICAgICAgICAgICA9IDgsCisgICAgICAuYmxvY2tfc2l6ZXMgICAgICAgID0gYmxvY2tfc2l6ZXNfZHYxMDAsCisgICAgICAuYXVkaW9fc3RyaWRlICAgICAgID0gOTAsCisgICAgICAuYXVkaW9fbWluX3NhbXBsZXMgID0geyAxNTgwLCAxNDUyLCAxMDUzIH0sIC8qIGZvciA0OCwgNDQuMSBhbmQgMzJrSHogKi8KKyAgICAgIC5hdWRpb19zYW1wbGVzX2Rpc3QgPSB7IDE2MDAsIDE2MDIsIDE2MDIsIDE2MDIsIDE2MDIgfSwgIC8qIHBlciBTTVBURS0zMTRNICovCisgICAgICAuYXVkaW9fc2h1ZmZsZSAgICAgID0gZHZfYXVkaW9fc2h1ZmZsZTUyNSwgfSwKKyAgICB7IC5kc2YgICAgICAgICAgICAgICAgPSAxLAorICAgICAgLnZpZGVvX3N0eXBlICAgICAgICA9IDB4MTgsCisgICAgICAuZnJhbWVfc2l6ZSAgICAgICAgID0gMjg4MDAwLCAvKiBTTVBURS0zNzBNIC0gNzIwcDUwIDEwMCBNYnBzICovCisgICAgICAuZGlmc2VnX3NpemUgICAgICAgID0gMTIsICAgIC8qIGFsc28ga25vd24gYXMgIkRWQ1BSTyBIRCIgKi8KKyAgICAgIC5uX2RpZmNoYW4gICAgICAgICAgPSAyLAorICAgICAgLnRpbWVfYmFzZSAgICAgICAgICA9IHsgMSwgNTAgfSwKKyAgICAgIC5sdGNfZGl2aXNvciAgICAgICAgPSA1MCwKKyAgICAgIC5oZWlnaHQgICAgICAgICAgICAgPSA3MjAsCisgICAgICAud2lkdGggICAgICAgICAgICAgID0gOTYwLAorICAgICAgLnNhciAgICAgICAgICAgICAgICA9IHsgeyAxLCAxIH0sIHsgNCwgMyB9IH0sCisgICAgICAucGl4X2ZtdCAgICAgICAgICAgID0gQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgLmJwbSAgICAgICAgICAgICAgICA9IDgsCisgICAgICAuYmxvY2tfc2l6ZXMgICAgICAgID0gYmxvY2tfc2l6ZXNfZHYxMDAsCisgICAgICAuYXVkaW9fc3RyaWRlICAgICAgID0gOTAsCisgICAgICAuYXVkaW9fbWluX3NhbXBsZXMgID0geyAxODk2LCAxNzQyLCAxMjY0IH0sIC8qIGZvciA0OCwgNDQuMSBhbmQgMzJrSHogKi8KKyAgICAgIC5hdWRpb19zYW1wbGVzX2Rpc3QgPSB7IDE5MjAsIDE5MjAsIDE5MjAsIDE5MjAsIDE5MjAgfSwKKyAgICAgIC5hdWRpb19zaHVmZmxlICAgICAgPSBkdl9hdWRpb19zaHVmZmxlNjI1LCB9LAorICAgIHsgLmRzZiAgICAgICAgICAgICAgICA9IDEsCisgICAgICAudmlkZW9fc3R5cGUgICAgICAgID0gMHgxLAorICAgICAgLmZyYW1lX3NpemUgICAgICAgICA9IDE0NDAwMCwgLyogSUVDIDYxODgzLTUgLSA2MjUvNTAgKFBBTCkgKi8KKyAgICAgIC5kaWZzZWdfc2l6ZSAgICAgICAgPSAxMiwKKyAgICAgIC5uX2RpZmNoYW4gICAgICAgICAgPSAxLAorICAgICAgLnRpbWVfYmFzZSAgICAgICAgICA9IHsgMSwgMjUgfSwKKyAgICAgIC5sdGNfZGl2aXNvciAgICAgICAgPSAyNSwKKyAgICAgIC5oZWlnaHQgICAgICAgICAgICAgPSA1NzYsCisgICAgICAud2lkdGggICAgICAgICAgICAgID0gNzIwLAorICAgICAgLnNhciAgICAgICAgICAgICAgICA9IHsgeyAxNiwgMTUgfSwgeyA2NCwgNDUgfSB9LAorICAgICAgLnBpeF9mbXQgICAgICAgICAgICA9IEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgIC5icG0gICAgICAgICAgICAgICAgPSA2LAorICAgICAgLmJsb2NrX3NpemVzICAgICAgICA9IGJsb2NrX3NpemVzX2R2MjU1MCwKKyAgICAgIC5hdWRpb19zdHJpZGUgICAgICAgPSAxMDgsCisgICAgICAuYXVkaW9fbWluX3NhbXBsZXMgID0geyAxODk2LCAxNzQyLCAxMjY0IH0sIC8qIGZvciA0OCwgNDQuMSBhbmQgMzJrSHogKi8KKyAgICAgIC5hdWRpb19zYW1wbGVzX2Rpc3QgPSB7IDE5MjAsIDE5MjAsIDE5MjAsIDE5MjAsIDE5MjAgfSwKKyAgICAgIC5hdWRpb19zaHVmZmxlICAgICAgPSBkdl9hdWRpb19zaHVmZmxlNjI1LCB9Cit9OworCit2b2lkIGZmX2R2X3ByaW50X3Byb2ZpbGVzKHZvaWQgKmxvZ2N0eCwgaW50IGxvZ2xldmVsKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhkdl9wcm9maWxlcyk7IGkrKykgeworICAgICAgICBjb25zdCBBVkRWUHJvZmlsZSAqcCA9ICZkdl9wcm9maWxlc1tpXTsKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgbG9nbGV2ZWwsCisgICAgICAgICAgICAgICAiRnJhbWUgc2l6ZTogJWR4JWQ7IHBpeGVsIGZvcm1hdDogJXMsIGZyYW1lcmF0ZTogJWQvJWRcbiIsCisgICAgICAgICAgICAgICBwLT53aWR0aCwgcC0+aGVpZ2h0LCBhdl9nZXRfcGl4X2ZtdF9uYW1lKHAtPnBpeF9mbXQpLAorICAgICAgICAgICAgICAgcC0+dGltZV9iYXNlLmRlbiwgcC0+dGltZV9iYXNlLm51bSk7CisgICAgfQorfQorCisjZW5kaWYgLyogQ09ORklHX0RWUFJPRklMRSAqLworCitjb25zdCBBVkRWUHJvZmlsZSogZmZfZHZfZnJhbWVfcHJvZmlsZShBVkNvZGVjQ29udGV4dCogY29kZWMsIGNvbnN0IEFWRFZQcm9maWxlICpzeXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmcmFtZSwgdW5zaWduZWQgYnVmX3NpemUpCit7CisjaWYgQ09ORklHX0RWUFJPRklMRQorICAgIGludCBpLCBkc2YsIHN0eXBlOworCisgICAgaWYoYnVmX3NpemUgPCBEVl9QUk9GSUxFX0JZVEVTKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGRzZiAgID0gKGZyYW1lWzNdICYgMHg4MCkgPj4gNzsKKyAgICBzdHlwZSA9IGZyYW1lWzgwICogNSArIDQ4ICsgM10gJiAweDFmOworCisgICAgLyogNTc2aTUwIDI1TWJwcyA0OjE6MSBpcyBhIHNwZWNpYWwgY2FzZSAqLworICAgIGlmICgoZHNmID09IDEgJiYgc3R5cGUgPT0gMCAmJiBmcmFtZVs0XSAmIDB4MDcgLyogdGhlIEFQVCBmaWVsZCAqLykgfHwKKyAgICAgICAgKHN0eXBlID09IDMxICYmIGNvZGVjICYmIGNvZGVjLT5jb2RlY190YWc9PUFWX1JMMzIoIlNMMjUiKSAmJiBjb2RlYy0+Y29kZWRfd2lkdGg9PTcyMCAmJiBjb2RlYy0+Y29kZWRfaGVpZ2h0PT01NzYpKQorICAgICAgICByZXR1cm4gJmR2X3Byb2ZpbGVzWzJdOworCisgICAgaWYoICAgc3R5cGUgPT0gMAorICAgICAgICYmIGNvZGVjCisgICAgICAgJiYgKGNvZGVjLT5jb2RlY190YWc9PUFWX1JMMzIoImR2c2QiKSB8fCBjb2RlYy0+Y29kZWNfdGFnPT1BVl9STDMyKCJDRFZDIikpCisgICAgICAgJiYgY29kZWMtPmNvZGVkX3dpZHRoID09NzIwCisgICAgICAgJiYgY29kZWMtPmNvZGVkX2hlaWdodD09NTc2KQorICAgICAgICByZXR1cm4gJmR2X3Byb2ZpbGVzWzFdOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGR2X3Byb2ZpbGVzKTsgaSsrKQorICAgICAgICBpZiAoZHNmID09IGR2X3Byb2ZpbGVzW2ldLmRzZiAmJiBzdHlwZSA9PSBkdl9wcm9maWxlc1tpXS52aWRlb19zdHlwZSkKKyAgICAgICAgICAgIHJldHVybiAmZHZfcHJvZmlsZXNbaV07CisKKyAgICAvKiBjaGVjayBpZiBvbGQgc3lzIG1hdGNoZXMgYW5kIGFzc3VtZXMgY29ycnVwdGVkIGlucHV0ICovCisgICAgaWYgKHN5cyAmJiBidWZfc2l6ZSA9PSBzeXMtPmZyYW1lX3NpemUpCisgICAgICAgIHJldHVybiBzeXM7CisKKyAgICAvKiBoYWNrIGZvciB0cmFjIGlzc3VlICMyMTcsIGR2IGZpbGVzIGNyZWF0ZWQgd2l0aCBRdWlja1RpbWUgMyAqLworICAgIGlmICgoZnJhbWVbM10gJiAweDdmKSA9PSAweDNmICYmIGZyYW1lWzgwICogNSArIDQ4ICsgM10gPT0gMHhmZikKKyAgICAgICAgcmV0dXJuICZkdl9wcm9maWxlc1tkc2ZdOworI2VuZGlmCisKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2lmIEZGX0FQSV9EVl9GUkFNRV9QUk9GSUxFCitjb25zdCBBVkRWUHJvZmlsZSogYXZwcml2X2R2X2ZyYW1lX3Byb2ZpbGUyKEFWQ29kZWNDb250ZXh0KiBjb2RlYywgY29uc3QgQVZEVlByb2ZpbGUgKnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZnJhbWUsIHVuc2lnbmVkIGJ1Zl9zaXplKQoreworICAgIHJldHVybiBmZl9kdl9mcmFtZV9wcm9maWxlKGNvZGVjLCBzeXMsIGZyYW1lLCBidWZfc2l6ZSk7Cit9CisjZW5kaWYKKworY29uc3QgQVZEVlByb2ZpbGUgKmF2X2R2X2ZyYW1lX3Byb2ZpbGUoY29uc3QgQVZEVlByb2ZpbGUgKnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZyYW1lLCB1bnNpZ25lZCBidWZfc2l6ZSkKK3sKKyAgICByZXR1cm4gZmZfZHZfZnJhbWVfcHJvZmlsZShOVUxMLCBzeXMsIGZyYW1lLCBidWZfc2l6ZSk7Cit9CisKK2NvbnN0IEFWRFZQcm9maWxlICphdl9kdl9jb2RlY19wcm9maWxlKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQoreworI2lmIENPTkZJR19EVlBST0ZJTEUKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhkdl9wcm9maWxlcyk7IGkrKykKKyAgICAgICAgaWYgKGhlaWdodCAgPT0gZHZfcHJvZmlsZXNbaV0uaGVpZ2h0ICAmJgorICAgICAgICAgICAgcGl4X2ZtdCA9PSBkdl9wcm9maWxlc1tpXS5waXhfZm10ICYmCisgICAgICAgICAgICB3aWR0aCAgID09IGR2X3Byb2ZpbGVzW2ldLndpZHRoKQorICAgICAgICAgICAgcmV0dXJuICZkdl9wcm9maWxlc1tpXTsKKyNlbmRpZgorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2R2X3Byb2ZpbGUuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2X3Byb2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQzN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHZfcHJvZmlsZS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0RWX1BST0ZJTEVfSAorI2RlZmluZSBBVkNPREVDX0RWX1BST0ZJTEVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhdGlvbmFsLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCisvKiBtaW5pbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gYSBEViBzdHJlYW0gaW4gb3JkZXIgdG8KKyAqIGRldGVybWluZSB0aGUgcHJvZmlsZSAqLworI2RlZmluZSBEVl9QUk9GSUxFX0JZVEVTICg2ICogODApIC8qIDYgRElGIGJsb2NrcyAqLworCisKKy8qCisgKiBBVkRWUHJvZmlsZSBpcyB1c2VkIHRvIGV4cHJlc3MgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdmFyaW91cworICogRFYgZmxhdm9ycy4gRm9yIG5vdyBpdCdzIHByaW1hcmlseSB1c2VkIGZvciBkaWZmZXJlbnRpYXRpbmcKKyAqIDUyNS82MCBhbmQgNjI1LzUwLCBidXQgdGhlIHBsYW5zIGFyZSB0byB1c2UgaXQgZm9yIHZhcmlvdXMKKyAqIERWIHNwZWNzIGFzIHdlbGwgKGUuZy4gU01QVEUzMTRNIHZzLiBJRUMgNjE4MzQpLgorICovCit0eXBlZGVmIHN0cnVjdCBBVkRWUHJvZmlsZSB7CisgICAgaW50ICAgICAgICAgICAgICBkc2Y7ICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlIG9mIHRoZSBkc2YgaW4gdGhlIERWIGhlYWRlciAqLworICAgIGludCAgICAgICAgICAgICAgdmlkZW9fc3R5cGU7ICAgICAgICAgICAvKiBzdHlwZSBmb3IgVkFVWCBzb3VyY2UgcGFjayAqLworICAgIGludCAgICAgICAgICAgICAgZnJhbWVfc2l6ZTsgICAgICAgICAgICAvKiB0b3RhbCBzaXplIG9mIG9uZSBmcmFtZSBpbiBieXRlcyAqLworICAgIGludCAgICAgICAgICAgICAgZGlmc2VnX3NpemU7ICAgICAgICAgICAvKiBudW1iZXIgb2YgRElGIHNlZ21lbnRzIHBlciBESUYgY2hhbm5lbCAqLworICAgIGludCAgICAgICAgICAgICAgbl9kaWZjaGFuOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgRElGIGNoYW5uZWxzIHBlciBmcmFtZSAqLworICAgIEFWUmF0aW9uYWwgICAgICAgdGltZV9iYXNlOyAgICAgICAgICAgICAvKiAxL2ZyYW1lcmF0ZSAqLworICAgIGludCAgICAgICAgICAgICAgbHRjX2Rpdmlzb3I7ICAgICAgICAgICAvKiBGUFMgZnJvbSB0aGUgTFRTIHN0YW5kcG9pbnQgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGhlaWdodDsgICAgICAgICAgICAgICAgLyogcGljdHVyZSBoZWlnaHQgaW4gcGl4ZWxzICovCisgICAgaW50ICAgICAgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgIC8qIHBpY3R1cmUgd2lkdGggaW4gcGl4ZWxzICovCisgICAgQVZSYXRpb25hbCAgICAgICBzYXJbMl07ICAgICAgICAgICAgICAgIC8qIHNhbXBsZSBhc3BlY3QgcmF0aW9zIGZvciA0OjMgYW5kIDE2OjkgKi8KKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsgICAgICAgICAgICAgLyogcGljdHVyZSBwaXhlbCBmb3JtYXQgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGJwbTsgICAgICAgICAgICAgICAgICAgLyogYmxvY2tzIHBlciBtYWNyb2Jsb2NrICovCisgICAgY29uc3QgdWludDhfdCAgICpibG9ja19zaXplczsgICAgICAgICAgIC8qIEFDIGJsb2NrIHNpemVzLCBpbiBiaXRzICovCisgICAgaW50ICAgICAgICAgICAgICBhdWRpb19zdHJpZGU7ICAgICAgICAgIC8qIHNpemUgb2YgYXVkaW9fc2h1ZmZsZSB0YWJsZSAqLworICAgIGludCAgICAgICAgICAgICAgYXVkaW9fbWluX3NhbXBsZXNbM107ICAvKiBtaW4gYW1vdW50IG9mIGF1ZGlvIHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIDQ4a0h6LCA0NC4xa0h6IGFuZCAzMmtIeiAqLworICAgIGludCAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlc19kaXN0WzVdOyAvKiBob3cgbWFueSBzYW1wbGVzIGFyZSBzdXBwb3NlZCB0byBiZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiBlYWNoIGZyYW1lIGluIGEgNSBmcmFtZXMgd2luZG93ICovCisgICAgY29uc3QgdWludDhfdCAgKCphdWRpb19zaHVmZmxlKVs5XTsgICAgIC8qIFBDTSBzaHVmZmxpbmcgdGFibGUgKi8KK30gQVZEVlByb2ZpbGU7CisKKyNpZiBGRl9BUElfRFZfRlJBTUVfUFJPRklMRQorLyoqCisgKiBAZGVwcmVjYXRlZCB1c2UgYXZfZHZfZnJhbWVfcHJvZmlsZSgpCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitjb25zdCBBVkRWUHJvZmlsZSogYXZwcml2X2R2X2ZyYW1lX3Byb2ZpbGUyKEFWQ29kZWNDb250ZXh0KiBjb2RlYywgY29uc3QgQVZEVlByb2ZpbGUgKnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZnJhbWUsIHVuc2lnbmVkIGJ1Zl9zaXplKTsKKyNlbmRpZgorCisvKioKKyAqIEdldCBhIERWIHByb2ZpbGUgZm9yIHRoZSBwcm92aWRlZCBjb21wcmVzc2VkIGZyYW1lLgorICoKKyAqIEBwYXJhbSBzeXMgdGhlIHByb2ZpbGUgdXNlZCBmb3IgdGhlIHByZXZpb3VzIGZyYW1lLCBtYXkgYmUgTlVMTAorICogQHBhcmFtIGZyYW1lIHRoZSBjb21wcmVzc2VkIGRhdGEgYnVmZmVyCisgKiBAcGFyYW0gYnVmX3NpemUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzCisgKiBAcmV0dXJuIHRoZSBEViBwcm9maWxlIGZvciB0aGUgc3VwcGxpZWQgZGF0YSBvciBOVUxMIG9uIGZhaWx1cmUKKyAqLworY29uc3QgQVZEVlByb2ZpbGUgKmF2X2R2X2ZyYW1lX3Byb2ZpbGUoY29uc3QgQVZEVlByb2ZpbGUgKnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZyYW1lLCB1bnNpZ25lZCBidWZfc2l6ZSk7CisKKy8qKgorICogR2V0IGEgRFYgcHJvZmlsZSBmb3IgdGhlIHByb3ZpZGVkIHN0cmVhbSBwYXJhbWV0ZXJzLgorICovCitjb25zdCBBVkRWUHJvZmlsZSAqYXZfZHZfY29kZWNfcHJvZmlsZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfRFZfUFJPRklMRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kdl9wcm9maWxlX2ludGVybmFsLmggYi9mZm1wZWcvbGliYXZjb2RlYy9kdl9wcm9maWxlX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkM2EyYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2X3Byb2ZpbGVfaW50ZXJuYWwuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19EVl9QUk9GSUxFX0lOVEVSTkFMX0gKKyNkZWZpbmUgQVZDT0RFQ19EVl9QUk9GSUxFX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgImR2X3Byb2ZpbGUuaCIKKworLyoqCisgKiAgUHJpbnQgYWxsIGFsbG93ZWQgRFYgcHJvZmlsZXMgaW50byBsb2djdHggYXQgc3BlY2lmaWVkIGxvZ2dpbmcgbGV2ZWwuCisgKi8KK3ZvaWQgZmZfZHZfcHJpbnRfcHJvZmlsZXModm9pZCAqbG9nY3R4LCBpbnQgbG9nbGV2ZWwpOworCisvKioKKyAqIEdldCBhIERWIHByb2ZpbGUgZm9yIHRoZSBwcm92aWRlZCBjb21wcmVzc2VkIGZyYW1lLgorICovCitjb25zdCBBVkRWUHJvZmlsZSogZmZfZHZfZnJhbWVfcHJvZmlsZShBVkNvZGVjQ29udGV4dCogY29kZWMsIGNvbnN0IEFWRFZQcm9maWxlICpzeXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmcmFtZSwgdW5zaWduZWQgYnVmX3NpemUpOworCisjZW5kaWYgLyogQVZDT0RFQ19EVl9QUk9GSUxFX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2R2X3RhYmxlZ2VuLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kdl90YWJsZWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NzkzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kdl90YWJsZWdlbi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBHZW5lcmF0ZSBhIGhlYWRlciBmaWxlIGZvciBoYXJkY29kZWQgRFYgdGFibGVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMgMAorI2luY2x1ZGUgImR2X3RhYmxlZ2VuLmgiCisjaW5jbHVkZSAidGFibGVwcmludC5oIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK1dSSVRFXzFEX0ZVTkNfQVJHVihkdl92bGNfcGFpciwgNywKKyAgICAgICAgICAgICAgICAgICAiezB4JSJQUkl4MzIiLCAlIlBSSWQ4In0iLCBkYXRhW2ldLnZsYywgZGF0YVtpXS5zaXplKQorV1JJVEVfMkRfRlVOQyhkdl92bGNfcGFpcikKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBkdl92bGNfbWFwX3RhYmxlaW5pdCgpOworCisgICAgd3JpdGVfZmlsZWhlYWRlcigpOworCisgICAgcHJpbnRmKCJzdGF0aWMgY29uc3Qgc3RydWN0IGR2X3ZsY19wYWlyIGR2X3ZsY19tYXBbRFZfVkxDX01BUF9SVU5fU0laRV1bRFZfVkxDX01BUF9MRVZfU0laRV0gPSB7XG4iKTsKKyAgICB3cml0ZV9kdl92bGNfcGFpcl8yZF9hcnJheShkdl92bGNfbWFwLCBEVl9WTENfTUFQX1JVTl9TSVpFLCBEVl9WTENfTUFQX0xFVl9TSVpFKTsKKyAgICBwcmludGYoIn07XG4iKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHZfdGFibGVnZW4uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2X3RhYmxlZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxYjU1NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2X3RhYmxlZ2VuLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIEhlYWRlciBmaWxlIGZvciBoYXJkY29kZWQgRFYgdGFibGVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19EVl9UQUJMRUdFTl9ICisjZGVmaW5lIEFWQ09ERUNfRFZfVEFCTEVHRU5fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKworI2luY2x1ZGUgImR2ZGF0YS5oIgorCisjaWYgQ09ORklHX1NNQUxMCisjZGVmaW5lIERWX1ZMQ19NQVBfUlVOX1NJWkUgIDE1CisjZGVmaW5lIERWX1ZMQ19NQVBfTEVWX1NJWkUgIDIzCisjZWxzZQorI2RlZmluZSBEVl9WTENfTUFQX1JVTl9TSVpFICA2NAorI2RlZmluZSBEVl9WTENfTUFQX0xFVl9TSVpFIDUxMiAvLyBGSVhNRSBzaWduIHdhcyByZW1vdmVkIHNvIHRoaXMgc2hvdWxkIGJlIC8yIGJ1dCBuZWVkcyBjaGVjaworI2VuZGlmCisKKy8qIFZMQyBlbmNvZGluZyBsb29rdXAgdGFibGUgKi8KK3R5cGVkZWYgc3RydWN0IGR2X3ZsY19wYWlyIHsKKyAgICB1aW50MzJfdCB2bGM7CisgICAgdWludDMyX3Qgc2l6ZTsKK30gZHZfdmxjX3BhaXI7CisKKyNpZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUworI2RlZmluZSBkdl92bGNfbWFwX3RhYmxlaW5pdCgpCisjaW5jbHVkZSAibGliYXZjb2RlYy9kdl90YWJsZXMuaCIKKyNlbHNlCitzdGF0aWMgc3RydWN0IGR2X3ZsY19wYWlyIGR2X3ZsY19tYXBbRFZfVkxDX01BUF9SVU5fU0laRV1bRFZfVkxDX01BUF9MRVZfU0laRV07CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZHZfdmxjX21hcF90YWJsZWluaXQodm9pZCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkJfRFZfVkxDIC0gMTsgaSsrKSB7CisgICAgICAgIGlmIChmZl9kdl92bGNfcnVuW2ldID49IERWX1ZMQ19NQVBfUlVOX1NJWkUpCisgICAgICAgICAgICBjb250aW51ZTsKKyNpZiBDT05GSUdfU01BTEwKKyAgICAgICAgaWYgKGZmX2R2X3ZsY19sZXZlbFtpXSA+PSBEVl9WTENfTUFQX0xFVl9TSVpFKQorICAgICAgICAgICAgY29udGludWU7CisjZW5kaWYKKworICAgICAgICBpZiAoZHZfdmxjX21hcFtmZl9kdl92bGNfcnVuW2ldXVtmZl9kdl92bGNfbGV2ZWxbaV1dLnNpemUgIT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGR2X3ZsY19tYXBbZmZfZHZfdmxjX3J1bltpXV1bZmZfZHZfdmxjX2xldmVsW2ldXS52bGMgID0KKyAgICAgICAgICAgIGZmX2R2X3ZsY19iaXRzW2ldIDw8ICghIWZmX2R2X3ZsY19sZXZlbFtpXSk7CisgICAgICAgIGR2X3ZsY19tYXBbZmZfZHZfdmxjX3J1bltpXV1bZmZfZHZfdmxjX2xldmVsW2ldXS5zaXplID0KKyAgICAgICAgICAgIGZmX2R2X3ZsY19sZW5baV0gICArICghIWZmX2R2X3ZsY19sZXZlbFtpXSk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBEVl9WTENfTUFQX1JVTl9TSVpFOyBpKyspIHsKKyNpZiBDT05GSUdfU01BTEwKKyAgICAgICAgZm9yIChqID0gMTsgaiA8IERWX1ZMQ19NQVBfTEVWX1NJWkU7IGorKykgeworICAgICAgICAgICAgaWYgKGR2X3ZsY19tYXBbaV1bal0uc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZHZfdmxjX21hcFtpXVtqXS52bGMgID0gZHZfdmxjX21hcFswXVtqXS52bGMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkdl92bGNfbWFwW2kgLSAxXVswXS52bGMgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHZfdmxjX21hcFswXVtqXS5zaXplKTsKKyAgICAgICAgICAgICAgICBkdl92bGNfbWFwW2ldW2pdLnNpemUgPSBkdl92bGNfbWFwW2kgLSAxXVswXS5zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdl92bGNfbWFwWzBdW2pdLnNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZvciAoaiA9IDE7IGogPCBEVl9WTENfTUFQX0xFVl9TSVpFIC8gMjsgaisrKSB7CisgICAgICAgICAgICBpZiAoZHZfdmxjX21hcFtpXVtqXS5zaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBkdl92bGNfbWFwW2ldW2pdLnZsYyAgPSBkdl92bGNfbWFwWzBdW2pdLnZsYyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR2X3ZsY19tYXBbaSAtIDFdWzBdLnZsYyA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdl92bGNfbWFwWzBdW2pdLnNpemUpOworICAgICAgICAgICAgICAgIGR2X3ZsY19tYXBbaV1bal0uc2l6ZSA9IGR2X3ZsY19tYXBbaSAtIDFdWzBdLnNpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2X3ZsY19tYXBbMF1bal0uc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR2X3ZsY19tYXBbaV1bKCh1aW50MTZfdCkgKC1qKSkgJiAweDFmZl0udmxjICA9IGR2X3ZsY19tYXBbaV1bal0udmxjIHwgMTsKKyAgICAgICAgICAgIGR2X3ZsY19tYXBbaV1bKCh1aW50MTZfdCkgKC1qKSkgJiAweDFmZl0uc2l6ZSA9IGR2X3ZsY19tYXBbaV1bal0uc2l6ZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQorI2VuZGlmIC8qIENPTkZJR19IQVJEQ09ERURfVEFCTEVTICovCisKKyNlbmRpZiAvKiBBVkNPREVDX0RWX1RBQkxFR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2R2YnN1Yi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHZic3ViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4NGEwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2YnN1Yi5jCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogRFZCIHN1YnRpdGxlIGVuY29kaW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29sb3JzcGFjZS5oIgorCit0eXBlZGVmIHN0cnVjdCBEVkJTdWJ0aXRsZUNvbnRleHQgeworICAgIGludCBvYmplY3RfdmVyc2lvbjsKK30gRFZCU3VidGl0bGVDb250ZXh0OworCisjZGVmaW5lIFBVVEJJVFMyKHZhbClcCit7XAorICAgIGJpdGJ1ZiB8PSAodmFsKSA8PCBiaXRjbnQ7XAorICAgIGJpdGNudCAtPSAyO1wKKyAgICBpZiAoYml0Y250IDwgMCkge1wKKyAgICAgICAgYml0Y250ID0gNjtcCisgICAgICAgICpxKysgPSBiaXRidWY7XAorICAgICAgICBiaXRidWYgPSAwO1wKKyAgICB9XAorfQorCitzdGF0aWMgdm9pZCBkdmJfZW5jb2RlX3JsZTIodWludDhfdCAqKnBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpdG1hcCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICB1aW50OF90ICpxOworICAgIHVuc2lnbmVkIGludCBiaXRidWY7CisgICAgaW50IGJpdGNudDsKKyAgICBpbnQgeCwgeSwgbGVuLCB4MSwgdiwgY29sb3I7CisKKyAgICBxID0gKnBxOworCisgICAgZm9yKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICpxKysgPSAweDEwOworICAgICAgICBiaXRidWYgPSAwOworICAgICAgICBiaXRjbnQgPSA2OworCisgICAgICAgIHggPSAwOworICAgICAgICB3aGlsZSAoeCA8IHcpIHsKKyAgICAgICAgICAgIHgxID0geDsKKyAgICAgICAgICAgIGNvbG9yID0gYml0bWFwW3gxKytdOworICAgICAgICAgICAgd2hpbGUgKHgxIDwgdyAmJiBiaXRtYXBbeDFdID09IGNvbG9yKQorICAgICAgICAgICAgICAgIHgxKys7CisgICAgICAgICAgICBsZW4gPSB4MSAtIHg7CisgICAgICAgICAgICBpZiAoY29sb3IgPT0gMCAmJiBsZW4gPT0gMikgeworICAgICAgICAgICAgICAgIFBVVEJJVFMyKDApOworICAgICAgICAgICAgICAgIFBVVEJJVFMyKDApOworICAgICAgICAgICAgICAgIFBVVEJJVFMyKDEpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gPj0gMyAmJiBsZW4gPD0gMTApIHsKKyAgICAgICAgICAgICAgICB2ID0gbGVuIC0gMzsKKyAgICAgICAgICAgICAgICBQVVRCSVRTMigwKTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTMigodiA+PiAyKSB8IDIpOworICAgICAgICAgICAgICAgIFBVVEJJVFMyKHYgJiAzKTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTMihjb2xvcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+PSAxMiAmJiBsZW4gPD0gMjcpIHsKKyAgICAgICAgICAgICAgICB2ID0gbGVuIC0gMTI7CisgICAgICAgICAgICAgICAgUFVUQklUUzIoMCk7CisgICAgICAgICAgICAgICAgUFVUQklUUzIoMCk7CisgICAgICAgICAgICAgICAgUFVUQklUUzIoMik7CisgICAgICAgICAgICAgICAgUFVUQklUUzIodiA+PiAyKTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTMih2ICYgMyk7CisgICAgICAgICAgICAgICAgUFVUQklUUzIoY29sb3IpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gPj0gMjkpIHsKKyAgICAgICAgICAgICAgICAvKiBsZW5ndGggPSAyOSAuLi4gMjg0ICovCisgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDI4NCkKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gMjg0OworICAgICAgICAgICAgICAgIHYgPSBsZW4gLSAyOTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTMigwKTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTMigwKTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTMigzKTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTMigodiA+PiA2KSk7CisgICAgICAgICAgICAgICAgUFVUQklUUzIoKHYgPj4gNCkgJiAzKTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTMigodiA+PiAyKSAmIDMpOworICAgICAgICAgICAgICAgIFBVVEJJVFMyKHYgJiAzKTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTMihjb2xvcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFBVVEJJVFMyKGNvbG9yKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sb3IgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBQVVRCSVRTMigxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHggKz0gbGVuOworICAgICAgICB9CisgICAgICAgIC8qIGVuZCBvZiBsaW5lICovCisgICAgICAgIFBVVEJJVFMyKDApOworICAgICAgICBQVVRCSVRTMigwKTsKKyAgICAgICAgUFVUQklUUzIoMCk7CisgICAgICAgIGlmIChiaXRjbnQgIT0gNikgeworICAgICAgICAgICAgKnErKyA9IGJpdGJ1ZjsKKyAgICAgICAgfQorICAgICAgICAqcSsrID0gMHhmMDsKKyAgICAgICAgYml0bWFwICs9IGxpbmVzaXplOworICAgIH0KKyAgICAqcHEgPSBxOworfQorCisjZGVmaW5lIFBVVEJJVFM0KHZhbClcCit7XAorICAgIGJpdGJ1ZiB8PSAodmFsKSA8PCBiaXRjbnQ7XAorICAgIGJpdGNudCAtPSA0O1wKKyAgICBpZiAoYml0Y250IDwgMCkge1wKKyAgICAgICAgYml0Y250ID0gNDtcCisgICAgICAgICpxKysgPSBiaXRidWY7XAorICAgICAgICBiaXRidWYgPSAwO1wKKyAgICB9XAorfQorCisvKiBzb21lIERWQiBkZWNvZGVycyBvbmx5IGltcGxlbWVudCA0IGJpdHMvcGl4ZWwgKi8KK3N0YXRpYyB2b2lkIGR2Yl9lbmNvZGVfcmxlNCh1aW50OF90ICoqcHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYml0bWFwLCBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKQoreworICAgIHVpbnQ4X3QgKnE7CisgICAgdW5zaWduZWQgaW50IGJpdGJ1ZjsKKyAgICBpbnQgYml0Y250OworICAgIGludCB4LCB5LCBsZW4sIHgxLCB2LCBjb2xvcjsKKworICAgIHEgPSAqcHE7CisKKyAgICBmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgKnErKyA9IDB4MTE7CisgICAgICAgIGJpdGJ1ZiA9IDA7CisgICAgICAgIGJpdGNudCA9IDQ7CisKKyAgICAgICAgeCA9IDA7CisgICAgICAgIHdoaWxlICh4IDwgdykgeworICAgICAgICAgICAgeDEgPSB4OworICAgICAgICAgICAgY29sb3IgPSBiaXRtYXBbeDErK107CisgICAgICAgICAgICB3aGlsZSAoeDEgPCB3ICYmIGJpdG1hcFt4MV0gPT0gY29sb3IpCisgICAgICAgICAgICAgICAgeDErKzsKKyAgICAgICAgICAgIGxlbiA9IHgxIC0geDsKKyAgICAgICAgICAgIGlmIChjb2xvciA9PSAwICYmIGxlbiA9PSAyKSB7CisgICAgICAgICAgICAgICAgUFVUQklUUzQoMCk7CisgICAgICAgICAgICAgICAgUFVUQklUUzQoMHhkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sb3IgPT0gMCAmJiAobGVuID49IDMgJiYgbGVuIDw9IDkpKSB7CisgICAgICAgICAgICAgICAgUFVUQklUUzQoMCk7CisgICAgICAgICAgICAgICAgUFVUQklUUzQobGVuIC0gMik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+PSA0ICYmIGxlbiA8PSA3KSB7CisgICAgICAgICAgICAgICAgUFVUQklUUzQoMCk7CisgICAgICAgICAgICAgICAgUFVUQklUUzQoOCArIGxlbiAtIDQpOworICAgICAgICAgICAgICAgIFBVVEJJVFM0KGNvbG9yKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuID49IDkgJiYgbGVuIDw9IDI0KSB7CisgICAgICAgICAgICAgICAgUFVUQklUUzQoMCk7CisgICAgICAgICAgICAgICAgUFVUQklUUzQoMHhlKTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTNChsZW4gLSA5KTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTNChjb2xvcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+PSAyNSkgeworICAgICAgICAgICAgICAgIGlmIChsZW4gPiAyODApCisgICAgICAgICAgICAgICAgICAgIGxlbiA9IDI4MDsKKyAgICAgICAgICAgICAgICB2ID0gbGVuIC0gMjU7CisgICAgICAgICAgICAgICAgUFVUQklUUzQoMCk7CisgICAgICAgICAgICAgICAgUFVUQklUUzQoMHhmKTsKKyAgICAgICAgICAgICAgICBQVVRCSVRTNCh2ID4+IDQpOworICAgICAgICAgICAgICAgIFBVVEJJVFM0KHYgJiAweGYpOworICAgICAgICAgICAgICAgIFBVVEJJVFM0KGNvbG9yKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUFVUQklUUzQoY29sb3IpOworICAgICAgICAgICAgICAgIGlmIChjb2xvciA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFBVVEJJVFM0KDB4Yyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4ICs9IGxlbjsKKyAgICAgICAgfQorICAgICAgICAvKiBlbmQgb2YgbGluZSAqLworICAgICAgICBQVVRCSVRTNCgwKTsKKyAgICAgICAgUFVUQklUUzQoMCk7CisgICAgICAgIGlmIChiaXRjbnQgIT0gNCkgeworICAgICAgICAgICAgKnErKyA9IGJpdGJ1ZjsKKyAgICAgICAgfQorICAgICAgICAqcSsrID0gMHhmMDsKKyAgICAgICAgYml0bWFwICs9IGxpbmVzaXplOworICAgIH0KKyAgICAqcHEgPSBxOworfQorCitzdGF0aWMgdm9pZCBkdmJfZW5jb2RlX3JsZTgodWludDhfdCAqKnBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpdG1hcCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICB1aW50OF90ICpxOworICAgIGludCB4LCB5LCBsZW4sIHgxLCBjb2xvcjsKKworICAgIHEgPSAqcHE7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICpxKysgPSAweDEyOworCisgICAgICAgIHggPSAwOworICAgICAgICB3aGlsZSAoeCA8IHcpIHsKKyAgICAgICAgICAgIHgxID0geDsKKyAgICAgICAgICAgIGNvbG9yID0gYml0bWFwW3gxKytdOworICAgICAgICAgICAgd2hpbGUgKHgxIDwgdyAmJiBiaXRtYXBbeDFdID09IGNvbG9yKQorICAgICAgICAgICAgICAgIHgxKys7CisgICAgICAgICAgICBsZW4gPSB4MSAtIHg7CisgICAgICAgICAgICBpZiAobGVuID09IDEgJiYgY29sb3IpIHsKKyAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMSB0byAxMTExMTExMSAgICAgICAgICAgMSBwaXhlbCBpbiBjb2xvdXIgeAorICAgICAgICAgICAgICAgICpxKysgPSBjb2xvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IDB4MDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDAgMExMTExMTEwgICAgICAgICAgTCBwaXhlbHMgKDEtMTI3KSBpbiBjb2xvdXIgMCAoTCA+IDApCisgICAgICAgICAgICAgICAgICAgIGxlbiA9IEZGTUlOKGxlbiwgMTI3KTsKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICpxKysgPSBsZW47CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gPiAyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAwIDFMTExMTExMIENDQ0NDQ0NDIEwgcGl4ZWxzICgzLTEyNykgaW4gY29sb3VyIEMgKEwgPiAyKQorICAgICAgICAgICAgICAgICAgICBsZW4gPSBGRk1JTihsZW4sIDEyNyk7CisgICAgICAgICAgICAgICAgICAgICpxKysgPSAweDAwOworICAgICAgICAgICAgICAgICAgICAqcSsrID0gMHg4MCtsZW47CisgICAgICAgICAgICAgICAgICAgICpxKysgPSBjb2xvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGVuID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9IGNvbG9yOworICAgICAgICAgICAgICAgICAgICAqcSsrID0gY29sb3I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9IGNvbG9yOworICAgICAgICAgICAgICAgICAgICBsZW4gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHggKz0gbGVuOworICAgICAgICB9CisgICAgICAgIC8qIGVuZCBvZiBsaW5lICovCisgICAgICAgIC8vIDAwMDAwMDAwIDAwMDAwMDAwIGVuZCBvZiA4LWJpdC9waXhlbF9jb2RlX3N0cmluZworICAgICAgICAqcSsrID0gMHgwMDsKKyAgICAgICAgKnErKyA9IDB4MDA7CisgICAgICAgIGJpdG1hcCArPSBsaW5lc2l6ZTsKKyAgICB9CisgICAgKnBxID0gcTsKK30KKworc3RhdGljIGludCBlbmNvZGVfZHZiX3N1YnRpdGxlcyhEVkJTdWJ0aXRsZUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm91dGJ1ZiwgY29uc3QgQVZTdWJ0aXRsZSAqaCkKK3sKKyAgICB1aW50OF90ICpxLCAqcHNlZ19sZW47CisgICAgaW50IHBhZ2VfaWQsIHJlZ2lvbl9pZCwgY2x1dF9pZCwgb2JqZWN0X2lkLCBpLCBicHBfaW5kZXgsIHBhZ2Vfc3RhdGU7CisKKworICAgIHEgPSBvdXRidWY7CisKKyAgICBwYWdlX2lkID0gMTsKKworICAgIGlmIChoLT5udW1fcmVjdHMgJiYgIWgtPnJlY3RzKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBwYWdlIGNvbXBvc2l0aW9uIHNlZ21lbnQgKi8KKworICAgICpxKysgPSAweDBmOyAvKiBzeW5jX2J5dGUgKi8KKyAgICAqcSsrID0gMHgxMDsgLyogc2VnbWVudF90eXBlICovCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcSwgcGFnZV9pZCk7CisgICAgcHNlZ19sZW4gPSBxOworICAgIHEgKz0gMjsgLyogc2VnbWVudCBsZW5ndGggKi8KKyAgICAqcSsrID0gMzA7IC8qIHBhZ2VfdGltZW91dCAoc2Vjb25kcykgKi8KKyAgICBwYWdlX3N0YXRlID0gMjsgLyogbW9kZSBjaGFuZ2UgKi8KKyAgICAvKiBwYWdlX3ZlcnNpb24gPSAwICsgcGFnZV9zdGF0ZSAqLworICAgICpxKysgPSAocy0+b2JqZWN0X3ZlcnNpb24gPDwgNCkgfCAocGFnZV9zdGF0ZSA8PCAyKSB8IDM7CisKKyAgICBmb3IgKHJlZ2lvbl9pZCA9IDA7IHJlZ2lvbl9pZCA8IGgtPm51bV9yZWN0czsgcmVnaW9uX2lkKyspIHsKKyAgICAgICAgKnErKyA9IHJlZ2lvbl9pZDsKKyAgICAgICAgKnErKyA9IDB4ZmY7IC8qIHJlc2VydmVkICovCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnEsIGgtPnJlY3RzW3JlZ2lvbl9pZF0tPngpOyAvKiBsZWZ0IHBvcyAqLworICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZxLCBoLT5yZWN0c1tyZWdpb25faWRdLT55KTsgLyogdG9wIHBvcyAqLworICAgIH0KKworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnBzZWdfbGVuLCBxIC0gcHNlZ19sZW4gLSAyKTsKKworICAgIGlmIChoLT5udW1fcmVjdHMpIHsKKyAgICAgICAgZm9yIChjbHV0X2lkID0gMDsgY2x1dF9pZCA8IGgtPm51bV9yZWN0czsgY2x1dF9pZCsrKSB7CisKKyAgICAgICAgICAgIC8qIENMVVQgc2VnbWVudCAqLworCisgICAgICAgICAgICBpZiAoaC0+cmVjdHNbY2x1dF9pZF0tPm5iX2NvbG9ycyA8PSA0KSB7CisgICAgICAgICAgICAgICAgLyogMiBicHAsIHNvbWUgZGVjb2RlcnMgZG8gbm90IHN1cHBvcnQgaXQgY29ycmVjdGx5ICovCisgICAgICAgICAgICAgICAgYnBwX2luZGV4ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaC0+cmVjdHNbY2x1dF9pZF0tPm5iX2NvbG9ycyA8PSAxNikgeworICAgICAgICAgICAgICAgIC8qIDQgYnBwLCBzdGFuZGFyZCBlbmNvZGluZyAqLworICAgICAgICAgICAgICAgIGJwcF9pbmRleCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGgtPnJlY3RzW2NsdXRfaWRdLT5uYl9jb2xvcnMgPD0gMjU2KSB7CisgICAgICAgICAgICAgICAgLyogOCBicHAsIHN0YW5kYXJkIGVuY29kaW5nICovCisgICAgICAgICAgICAgICAgYnBwX2luZGV4ID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qIENMVVQgc2VnbWVudCAqLworICAgICAgICAgICAgKnErKyA9IDB4MGY7IC8qIHN5bmMgYnl0ZSAqLworICAgICAgICAgICAgKnErKyA9IDB4MTI7IC8qIENMVVQgZGVmaW5pdGlvbiBzZWdtZW50ICovCisgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZxLCBwYWdlX2lkKTsKKyAgICAgICAgICAgIHBzZWdfbGVuID0gcTsKKyAgICAgICAgICAgIHEgKz0gMjsgLyogc2VnbWVudCBsZW5ndGggKi8KKyAgICAgICAgICAgICpxKysgPSBjbHV0X2lkOworICAgICAgICAgICAgKnErKyA9ICgwIDw8IDQpIHwgMHhmOyAvKiB2ZXJzaW9uID0gMCAqLworCisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBoLT5yZWN0c1tjbHV0X2lkXS0+bmJfY29sb3JzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAqcSsrID0gaTsgLyogY2x1dF9lbnRyeV9pZCAqLworICAgICAgICAgICAgICAgICpxKysgPSAoMSA8PCAoNyAtIGJwcF9pbmRleCkpIHwgKDB4ZiA8PCAxKSB8IDE7IC8qIDIgYml0cy9waXhlbCBmdWxsIHJhbmdlICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYSwgciwgZywgYjsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgeD0gKCh1aW50MzJfdCopaC0+cmVjdHNbY2x1dF9pZF0tPnBpY3QuZGF0YVsxXSlbaV07CisgICAgICAgICAgICAgICAgICAgIGEgPSAoeCA+PiAyNCkgJiAweGZmOworICAgICAgICAgICAgICAgICAgICByID0gKHggPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgZyA9ICh4ID4+ICA4KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgICAgIGIgPSAoeCA+PiAgMCkgJiAweGZmOworCisgICAgICAgICAgICAgICAgICAgICpxKysgPSBSR0JfVE9fWV9DQ0lSKHIsIGcsIGIpOworICAgICAgICAgICAgICAgICAgICAqcSsrID0gUkdCX1RPX1ZfQ0NJUihyLCBnLCBiLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9IFJHQl9UT19VX0NDSVIociwgZywgYiwgMCk7CisgICAgICAgICAgICAgICAgICAgICpxKysgPSAyNTUgLSBhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcHNlZ19sZW4sIHEgLSBwc2VnX2xlbiAtIDIpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChyZWdpb25faWQgPSAwOyByZWdpb25faWQgPCBoLT5udW1fcmVjdHM7IHJlZ2lvbl9pZCsrKSB7CisKKyAgICAgICAgLyogcmVnaW9uIGNvbXBvc2l0aW9uIHNlZ21lbnQgKi8KKworICAgICAgICBpZiAoaC0+cmVjdHNbcmVnaW9uX2lkXS0+bmJfY29sb3JzIDw9IDQpIHsKKyAgICAgICAgICAgIC8qIDIgYnBwLCBzb21lIGRlY29kZXJzIGRvIG5vdCBzdXBwb3J0IGl0IGNvcnJlY3RseSAqLworICAgICAgICAgICAgYnBwX2luZGV4ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChoLT5yZWN0c1tyZWdpb25faWRdLT5uYl9jb2xvcnMgPD0gMTYpIHsKKyAgICAgICAgICAgIC8qIDQgYnBwLCBzdGFuZGFyZCBlbmNvZGluZyAqLworICAgICAgICAgICAgYnBwX2luZGV4ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgICpxKysgPSAweDBmOyAvKiBzeW5jX2J5dGUgKi8KKyAgICAgICAgKnErKyA9IDB4MTE7IC8qIHNlZ21lbnRfdHlwZSAqLworICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZxLCBwYWdlX2lkKTsKKyAgICAgICAgcHNlZ19sZW4gPSBxOworICAgICAgICBxICs9IDI7IC8qIHNlZ21lbnQgbGVuZ3RoICovCisgICAgICAgICpxKysgPSByZWdpb25faWQ7CisgICAgICAgICpxKysgPSAocy0+b2JqZWN0X3ZlcnNpb24gPDwgNCkgfCAoMCA8PCAzKSB8IDB4MDc7IC8qIHZlcnNpb24gLCBubyBmaWxsICovCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnEsIGgtPnJlY3RzW3JlZ2lvbl9pZF0tPncpOyAvKiByZWdpb24gd2lkdGggKi8KKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcSwgaC0+cmVjdHNbcmVnaW9uX2lkXS0+aCk7IC8qIHJlZ2lvbiBoZWlnaHQgKi8KKyAgICAgICAgKnErKyA9ICgoMSArIGJwcF9pbmRleCkgPDwgNSkgfCAoKDEgKyBicHBfaW5kZXgpIDw8IDIpIHwgMHgwMzsKKyAgICAgICAgKnErKyA9IHJlZ2lvbl9pZDsgLyogY2x1dF9pZCA9PSByZWdpb25faWQgKi8KKyAgICAgICAgKnErKyA9IDA7IC8qIDggYml0IGZpbGwgY29sb3JzICovCisgICAgICAgICpxKysgPSAweDAzOyAvKiA0IGJpdCBhbmQgMiBiaXQgZmlsbCBjb2xvcnMgKi8KKworICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZxLCByZWdpb25faWQpOyAvKiBvYmplY3RfaWQgPT0gcmVnaW9uX2lkICovCisgICAgICAgICpxKysgPSAoMCA8PCA2KSB8ICgwIDw8IDQpOworICAgICAgICAqcSsrID0gMDsKKyAgICAgICAgKnErKyA9IDB4ZjA7CisgICAgICAgICpxKysgPSAwOworCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnBzZWdfbGVuLCBxIC0gcHNlZ19sZW4gLSAyKTsKKyAgICB9CisKKyAgICBpZiAoaC0+bnVtX3JlY3RzKSB7CisKKyAgICAgICAgZm9yIChvYmplY3RfaWQgPSAwOyBvYmplY3RfaWQgPCBoLT5udW1fcmVjdHM7IG9iamVjdF9pZCsrKSB7CisgICAgICAgICAgICB2b2lkICgqZHZiX2VuY29kZV9ybGUpKHVpbnQ4X3QgKipwcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpdG1hcCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKTsKKworICAgICAgICAgICAgLyogYnBwX2luZGV4IG1hdGhzICovCisgICAgICAgICAgICBpZiAoaC0+cmVjdHNbb2JqZWN0X2lkXS0+bmJfY29sb3JzIDw9IDQpIHsKKyAgICAgICAgICAgICAgICAvKiAyIGJwcCwgc29tZSBkZWNvZGVycyBkbyBub3Qgc3VwcG9ydCBpdCBjb3JyZWN0bHkgKi8KKyAgICAgICAgICAgICAgICBkdmJfZW5jb2RlX3JsZSA9IGR2Yl9lbmNvZGVfcmxlMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaC0+cmVjdHNbb2JqZWN0X2lkXS0+bmJfY29sb3JzIDw9IDE2KSB7CisgICAgICAgICAgICAgICAgLyogNCBicHAsIHN0YW5kYXJkIGVuY29kaW5nICovCisgICAgICAgICAgICAgICAgZHZiX2VuY29kZV9ybGUgPSBkdmJfZW5jb2RlX3JsZTQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGgtPnJlY3RzW29iamVjdF9pZF0tPm5iX2NvbG9ycyA8PSAyNTYpIHsKKyAgICAgICAgICAgICAgICAvKiA4IGJwcCwgc3RhbmRhcmQgZW5jb2RpbmcgKi8KKyAgICAgICAgICAgICAgICBkdmJfZW5jb2RlX3JsZSA9IGR2Yl9lbmNvZGVfcmxlODsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBPYmplY3QgRGF0YSBzZWdtZW50ICovCisgICAgICAgICAgICAqcSsrID0gMHgwZjsgLyogc3luYyBieXRlICovCisgICAgICAgICAgICAqcSsrID0gMHgxMzsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnEsIHBhZ2VfaWQpOworICAgICAgICAgICAgcHNlZ19sZW4gPSBxOworICAgICAgICAgICAgcSArPSAyOyAvKiBzZWdtZW50IGxlbmd0aCAqLworCisgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZxLCBvYmplY3RfaWQpOworICAgICAgICAgICAgKnErKyA9IChzLT5vYmplY3RfdmVyc2lvbiA8PCA0KSB8ICgwIDw8IDIpIHwgKDAgPDwgMSkgfCAxOyAvKiB2ZXJzaW9uID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25qZWN0X2NvZGluZ19tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9tb2RpZnlpbmdfY29sb3JfZmxhZyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0b3BfZmllbGRfbGVuLCAqcGJvdHRvbV9maWVsZF9sZW4sICp0b3BfcHRyLCAqYm90dG9tX3B0cjsKKworICAgICAgICAgICAgICAgIHB0b3BfZmllbGRfbGVuID0gcTsKKyAgICAgICAgICAgICAgICBxICs9IDI7CisgICAgICAgICAgICAgICAgcGJvdHRvbV9maWVsZF9sZW4gPSBxOworICAgICAgICAgICAgICAgIHEgKz0gMjsKKworICAgICAgICAgICAgICAgIHRvcF9wdHIgPSBxOworICAgICAgICAgICAgICAgIGR2Yl9lbmNvZGVfcmxlKCZxLCBoLT5yZWN0c1tvYmplY3RfaWRdLT5waWN0LmRhdGFbMF0sIGgtPnJlY3RzW29iamVjdF9pZF0tPncgKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cmVjdHNbb2JqZWN0X2lkXS0+dywgaC0+cmVjdHNbb2JqZWN0X2lkXS0+aCA+PiAxKTsKKyAgICAgICAgICAgICAgICBib3R0b21fcHRyID0gcTsKKyAgICAgICAgICAgICAgICBkdmJfZW5jb2RlX3JsZSgmcSwgaC0+cmVjdHNbb2JqZWN0X2lkXS0+cGljdC5kYXRhWzBdICsgaC0+cmVjdHNbb2JqZWN0X2lkXS0+dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnJlY3RzW29iamVjdF9pZF0tPncgKiAyLCBoLT5yZWN0c1tvYmplY3RfaWRdLT53LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cmVjdHNbb2JqZWN0X2lkXS0+aCA+PiAxKTsKKworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnB0b3BfZmllbGRfbGVuLCBib3R0b21fcHRyIC0gdG9wX3B0cik7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcGJvdHRvbV9maWVsZF9sZW4sIHEgLSBib3R0b21fcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcHNlZ19sZW4sIHEgLSBwc2VnX2xlbiAtIDIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZW5kIG9mIGRpc3BsYXkgc2V0IHNlZ21lbnQgKi8KKworICAgICpxKysgPSAweDBmOyAvKiBzeW5jX2J5dGUgKi8KKyAgICAqcSsrID0gMHg4MDsgLyogc2VnbWVudF90eXBlICovCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcSwgcGFnZV9pZCk7CisgICAgcHNlZ19sZW4gPSBxOworICAgIHEgKz0gMjsgLyogc2VnbWVudCBsZW5ndGggKi8KKworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnBzZWdfbGVuLCBxIC0gcHNlZ19sZW4gLSAyKTsKKworICAgIHMtPm9iamVjdF92ZXJzaW9uID0gKHMtPm9iamVjdF92ZXJzaW9uICsgMSkgJiAweGY7CisgICAgcmV0dXJuIHEgLSBvdXRidWY7Cit9CisKK3N0YXRpYyBpbnQgZHZic3ViX2VuY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZTdWJ0aXRsZSAqc3ViKQoreworICAgIERWQlN1YnRpdGxlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGVuY29kZV9kdmJfc3VidGl0bGVzKHMsIGJ1Ziwgc3ViKTsKKyAgICByZXR1cm4gcmV0OworfQorCitBVkNvZGVjIGZmX2R2YnN1Yl9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJkdmJzdWIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEVkIgc3VidGl0bGVzIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0RWQl9TVUJUSVRMRSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRFZCU3VidGl0bGVDb250ZXh0KSwKKyAgICAuZW5jb2RlX3N1YiAgICAgPSBkdmJzdWJfZW5jb2RlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2R2YnN1Yl9wYXJzZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2YnN1Yl9wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTVjODkxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHZic3ViX3BhcnNlci5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogRFZCIHN1YnRpdGxlIHBhcnNlciBmb3IgRkZtcGVnCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSWFuIENhdWxmaWVsZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorCisvKiBQYXJzZXIgKG1vc3RseSkgY29waWVkIGZyb20gZHZkc3ViLmMgKi8KKworI2RlZmluZSBQQVJTRV9CVUZfU0laRSAgKDY1NTM2KQorCisKKy8qIHBhcnNlciBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdCBEVkJTdWJQYXJzZUNvbnRleHQgeworICAgIHVpbnQ4X3QgKnBhY2tldF9idWY7CisgICAgaW50IHBhY2tldF9zdGFydDsKKyAgICBpbnQgcGFja2V0X2luZGV4OworICAgIGludCBpbl9wYWNrZXQ7Cit9IERWQlN1YlBhcnNlQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGR2YnN1Yl9wYXJzZV9pbml0KEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzKQoreworICAgIERWQlN1YlBhcnNlQ29udGV4dCAqcGMgPSBzLT5wcml2X2RhdGE7CisgICAgcGMtPnBhY2tldF9idWYgPSBhdl9tYWxsb2MoUEFSU0VfQlVGX1NJWkUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHZic3ViX3BhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgRFZCU3ViUGFyc2VDb250ZXh0ICpwYyA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpwLCAqcF9lbmQ7CisgICAgaW50IGksIGxlbiwgYnVmX3BvcyA9IDA7CisKKyAgICBhdl9kbG9nKGF2Y3R4LCAiRFZCIHBhcnNlIHBhY2tldCBwdHM9JSJQUkl4NjQiLCBscHRzPSUiUFJJeDY0IiwgY3B0cz0lIlBSSXg2NCI6XG4iLAorICAgICAgICAgICAgcy0+cHRzLCBzLT5sYXN0X3B0cywgcy0+Y3VyX2ZyYW1lX3B0c1tzLT5jdXJfZnJhbWVfc3RhcnRfaW5kZXhdKTsKKworICAgIGZvciAoaT0wOyBpIDwgYnVmX3NpemU7IGkrKykKKyAgICB7CisgICAgICAgIGF2X2Rsb2coYXZjdHgsICIlMDJ4ICIsIGJ1ZltpXSk7CisgICAgICAgIGlmIChpICUgMTYgPT0gMTUpCisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiXG4iKTsKKyAgICB9CisKKyAgICBpZiAoaSAlIDE2ICE9IDApCisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJcbiIpOworCisgICAgKnBvdXRidWYgPSBOVUxMOworICAgICpwb3V0YnVmX3NpemUgPSAwOworCisgICAgcy0+ZmV0Y2hfdGltZXN0YW1wID0gMTsKKworICAgIGlmIChzLT5sYXN0X3B0cyAhPSBzLT5wdHMgJiYgcy0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSAvKiBTdGFydCBvZiBhIG5ldyBwYWNrZXQgKi8KKyAgICB7CisgICAgICAgIGlmIChwYy0+cGFja2V0X2luZGV4ICE9IHBjLT5wYWNrZXRfc3RhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZjdHgsICJEaXNjYXJkaW5nICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICBwYy0+cGFja2V0X2luZGV4IC0gcGMtPnBhY2tldF9zdGFydCk7CisgICAgICAgIH0KKworICAgICAgICBwYy0+cGFja2V0X3N0YXJ0ID0gMDsKKyAgICAgICAgcGMtPnBhY2tldF9pbmRleCA9IDA7CisKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgMiB8fCBidWZbMF0gIT0gMHgyMCB8fCBidWZbMV0gIT0gMHgwMCkgeworICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgIkJhZCBwYWNrZXQgaGVhZGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1Zl9wb3MgPSAyOworCisgICAgICAgIHBjLT5pbl9wYWNrZXQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwYy0+cGFja2V0X3N0YXJ0ICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYy0+cGFja2V0X2luZGV4ICE9IHBjLT5wYWNrZXRfc3RhcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtbW92ZShwYy0+cGFja2V0X2J1ZiwgcGMtPnBhY2tldF9idWYgKyBwYy0+cGFja2V0X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjLT5wYWNrZXRfaW5kZXggLSBwYy0+cGFja2V0X3N0YXJ0KTsKKworICAgICAgICAgICAgICAgIHBjLT5wYWNrZXRfaW5kZXggLT0gcGMtPnBhY2tldF9zdGFydDsKKyAgICAgICAgICAgICAgICBwYy0+cGFja2V0X3N0YXJ0ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGMtPnBhY2tldF9zdGFydCA9IDA7CisgICAgICAgICAgICAgICAgcGMtPnBhY2tldF9pbmRleCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnVmX3NpemUgLSBidWZfcG9zICsgcGMtPnBhY2tldF9pbmRleCA+IFBBUlNFX0JVRl9TSVpFKQorICAgICAgICByZXR1cm4gLTE7CisKKy8qIGlmIG5vdCBjdXJyZW50bHkgaW4gYSBwYWNrZXQsIGRpc2NhcmQgZGF0YSAqLworICAgIGlmIChwYy0+aW5fcGFja2V0ID09IDApCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKworICAgIG1lbWNweShwYy0+cGFja2V0X2J1ZiArIHBjLT5wYWNrZXRfaW5kZXgsIGJ1ZiArIGJ1Zl9wb3MsIGJ1Zl9zaXplIC0gYnVmX3Bvcyk7CisgICAgcGMtPnBhY2tldF9pbmRleCArPSBidWZfc2l6ZSAtIGJ1Zl9wb3M7CisKKyAgICBwID0gcGMtPnBhY2tldF9idWY7CisgICAgcF9lbmQgPSBwYy0+cGFja2V0X2J1ZiArIHBjLT5wYWNrZXRfaW5kZXg7CisKKyAgICB3aGlsZSAocCA8IHBfZW5kKQorICAgIHsKKyAgICAgICAgaWYgKCpwID09IDB4MGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwICsgNiA8PSBwX2VuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBBVl9SQjE2KHAgKyA0KTsKKworICAgICAgICAgICAgICAgIGlmIChwICsgbGVuICsgNiA8PSBwX2VuZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwb3V0YnVmX3NpemUgKz0gbGVuICsgNjsKKworICAgICAgICAgICAgICAgICAgICBwICs9IGxlbiArIDY7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoKnAgPT0gMHhmZikgeworICAgICAgICAgICAgaWYgKHAgKyAxIDwgcF9lbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgIkp1bmsgYXQgZW5kIG9mIHBhY2tldFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYy0+cGFja2V0X2luZGV4ID0gcCAtIHBjLT5wYWNrZXRfYnVmOworICAgICAgICAgICAgcGMtPmluX3BhY2tldCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSnVuayBpbiBwYWNrZXRcbiIpOworCisgICAgICAgICAgICBwYy0+cGFja2V0X2luZGV4ID0gcCAtIHBjLT5wYWNrZXRfYnVmOworICAgICAgICAgICAgcGMtPmluX3BhY2tldCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgqcG91dGJ1Zl9zaXplID4gMCkKKyAgICB7CisgICAgICAgICpwb3V0YnVmID0gcGMtPnBhY2tldF9idWY7CisgICAgICAgIHBjLT5wYWNrZXRfc3RhcnQgPSAqcG91dGJ1Zl9zaXplOworICAgIH0KKworICAgIGlmIChzLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHMtPnB0cyA9IHMtPmxhc3RfcHRzOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGR2YnN1Yl9wYXJzZV9jbG9zZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcykKK3sKKyAgICBEVkJTdWJQYXJzZUNvbnRleHQgKnBjID0gcy0+cHJpdl9kYXRhOworICAgIGF2X2ZyZWVwKCZwYy0+cGFja2V0X2J1Zik7Cit9CisKK0FWQ29kZWNQYXJzZXIgZmZfZHZic3ViX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX0RWQl9TVUJUSVRMRSB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihEVkJTdWJQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfaW5pdCAgICA9IGR2YnN1Yl9wYXJzZV9pbml0LAorICAgIC5wYXJzZXJfcGFyc2UgICA9IGR2YnN1Yl9wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBkdmJzdWJfcGFyc2VfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHZic3ViZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kdmJzdWJkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjFlMTYxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHZic3ViZGVjLmMKQEAgLTAsMCArMSwxNjI5IEBACisvKgorICogRFZCIHN1YnRpdGxlIGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSWFuIENhdWxmaWVsZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb2xvcnNwYWNlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjZGVmaW5lIERWQlNVQl9QQUdFX1NFR01FTlQgICAgIDB4MTAKKyNkZWZpbmUgRFZCU1VCX1JFR0lPTl9TRUdNRU5UICAgMHgxMQorI2RlZmluZSBEVkJTVUJfQ0xVVF9TRUdNRU5UICAgICAweDEyCisjZGVmaW5lIERWQlNVQl9PQkpFQ1RfU0VHTUVOVCAgIDB4MTMKKyNkZWZpbmUgRFZCU1VCX0RJU1BMQVlERUZJTklUSU9OX1NFR01FTlQgMHgxNAorI2RlZmluZSBEVkJTVUJfRElTUExBWV9TRUdNRU5UICAweDgwCisKKyNkZWZpbmUgY20gKGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QKQorCisjaWZkZWYgREVCVUcKKyNpZiAwCitzdGF0aWMgdm9pZCBwbmdfc2F2ZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdWludDhfdCAqYml0bWFwLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmdiYV9wYWxldHRlKQoreworICAgIGludCB4LCB5LCB2OworICAgIEZJTEUgKmY7CisgICAgY2hhciBmbmFtZVs0MF0sIGZuYW1lMls0MF07CisgICAgY2hhciBjb21tYW5kWzEwMjRdOworCisgICAgc25wcmludGYoZm5hbWUsIDQwLCAiJXMucHBtIiwgZmlsZW5hbWUpOworCisgICAgZiA9IGZvcGVuKGZuYW1lLCAidyIpOworICAgIGlmICghZikgeworICAgICAgICBwZXJyb3IoZm5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZwcmludGYoZiwgIlA2XG4iCisgICAgICAgICAgICAiJWQgJWRcbiIKKyAgICAgICAgICAgICIlZFxuIiwKKyAgICAgICAgICAgIHcsIGgsIDI1NSk7CisgICAgZm9yKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvcih4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgdiA9IHJnYmFfcGFsZXR0ZVtiaXRtYXBbeSAqIHcgKyB4XV07CisgICAgICAgICAgICBwdXRjKCh2ID4+IDE2KSAmIDB4ZmYsIGYpOworICAgICAgICAgICAgcHV0YygodiA+PiA4KSAmIDB4ZmYsIGYpOworICAgICAgICAgICAgcHV0YygodiA+PiAwKSAmIDB4ZmYsIGYpOworICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmKTsKKworCisgICAgc25wcmludGYoZm5hbWUyLCA0MCwgIiVzLWEucGdtIiwgZmlsZW5hbWUpOworCisgICAgZiA9IGZvcGVuKGZuYW1lMiwgInciKTsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgcGVycm9yKGZuYW1lMik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZnByaW50ZihmLCAiUDVcbiIKKyAgICAgICAgICAgICIlZCAlZFxuIgorICAgICAgICAgICAgIiVkXG4iLAorICAgICAgICAgICAgdywgaCwgMjU1KTsKKyAgICBmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICB2ID0gcmdiYV9wYWxldHRlW2JpdG1hcFt5ICogdyArIHhdXTsKKyAgICAgICAgICAgIHB1dGMoKHYgPj4gMjQpICYgMHhmZiwgZik7CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGYpOworCisgICAgc25wcmludGYoY29tbWFuZCwgMTAyNCwgInBubXRvcG5nIC1hbHBoYSAlcyAlcyA+ICVzLnBuZyAyPiAvZGV2L251bGwiLCBmbmFtZTIsIGZuYW1lLCBmaWxlbmFtZSk7CisgICAgc3lzdGVtKGNvbW1hbmQpOworCisgICAgc25wcmludGYoY29tbWFuZCwgMTAyNCwgInJtICVzICVzIiwgZm5hbWUsIGZuYW1lMik7CisgICAgc3lzdGVtKGNvbW1hbmQpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHBuZ19zYXZlMihjb25zdCBjaGFyICpmaWxlbmFtZSwgdWludDMyX3QgKmJpdG1hcCwgaW50IHcsIGludCBoKQoreworICAgIGludCB4LCB5LCB2OworICAgIEZJTEUgKmY7CisgICAgY2hhciBmbmFtZVs0MF0sIGZuYW1lMls0MF07CisgICAgY2hhciBjb21tYW5kWzEwMjRdOworCisgICAgc25wcmludGYoZm5hbWUsIHNpemVvZihmbmFtZSksICIlcy5wcG0iLCBmaWxlbmFtZSk7CisKKyAgICBmID0gZm9wZW4oZm5hbWUsICJ3Iik7CisgICAgaWYgKCFmKSB7CisgICAgICAgIHBlcnJvcihmbmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZnByaW50ZihmLCAiUDZcbiIKKyAgICAgICAgICAgICIlZCAlZFxuIgorICAgICAgICAgICAgIiVkXG4iLAorICAgICAgICAgICAgdywgaCwgMjU1KTsKKyAgICBmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICB2ID0gYml0bWFwW3kgKiB3ICsgeF07CisgICAgICAgICAgICBwdXRjKCh2ID4+IDE2KSAmIDB4ZmYsIGYpOworICAgICAgICAgICAgcHV0YygodiA+PiA4KSAmIDB4ZmYsIGYpOworICAgICAgICAgICAgcHV0YygodiA+PiAwKSAmIDB4ZmYsIGYpOworICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmKTsKKworCisgICAgc25wcmludGYoZm5hbWUyLCBzaXplb2YoZm5hbWUyKSwgIiVzLWEucGdtIiwgZmlsZW5hbWUpOworCisgICAgZiA9IGZvcGVuKGZuYW1lMiwgInciKTsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgcGVycm9yKGZuYW1lMik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZnByaW50ZihmLCAiUDVcbiIKKyAgICAgICAgICAgICIlZCAlZFxuIgorICAgICAgICAgICAgIiVkXG4iLAorICAgICAgICAgICAgdywgaCwgMjU1KTsKKyAgICBmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICB2ID0gYml0bWFwW3kgKiB3ICsgeF07CisgICAgICAgICAgICBwdXRjKCh2ID4+IDI0KSAmIDB4ZmYsIGYpOworICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmKTsKKworICAgIHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgInBubXRvcG5nIC1hbHBoYSAlcyAlcyA+ICVzLnBuZyAyPiAvZGV2L251bGwiLCBmbmFtZTIsIGZuYW1lLCBmaWxlbmFtZSk7CisgICAgc3lzdGVtKGNvbW1hbmQpOworCisgICAgc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAicm0gJXMgJXMiLCBmbmFtZSwgZm5hbWUyKTsKKyAgICBzeXN0ZW0oY29tbWFuZCk7Cit9CisjZW5kaWYKKworI2RlZmluZSBSR0JBKHIsZyxiLGEpICgoKHVuc2lnbmVkKShhKSA8PCAyNCkgfCAoKHIpIDw8IDE2KSB8ICgoZykgPDwgOCkgfCAoYikpCisKK3R5cGVkZWYgc3RydWN0IERWQlN1YkNMVVQgeworICAgIGludCBpZDsKKyAgICBpbnQgdmVyc2lvbjsKKworICAgIHVpbnQzMl90IGNsdXQ0WzRdOworICAgIHVpbnQzMl90IGNsdXQxNlsxNl07CisgICAgdWludDMyX3QgY2x1dDI1NlsyNTZdOworCisgICAgc3RydWN0IERWQlN1YkNMVVQgKm5leHQ7Cit9IERWQlN1YkNMVVQ7CisKK3N0YXRpYyBEVkJTdWJDTFVUIGRlZmF1bHRfY2x1dDsKKwordHlwZWRlZiBzdHJ1Y3QgRFZCU3ViT2JqZWN0RGlzcGxheSB7CisgICAgaW50IG9iamVjdF9pZDsKKyAgICBpbnQgcmVnaW9uX2lkOworCisgICAgaW50IHhfcG9zOworICAgIGludCB5X3BvczsKKworICAgIGludCBmZ2NvbG9yOworICAgIGludCBiZ2NvbG9yOworCisgICAgc3RydWN0IERWQlN1Yk9iamVjdERpc3BsYXkgKnJlZ2lvbl9saXN0X25leHQ7CisgICAgc3RydWN0IERWQlN1Yk9iamVjdERpc3BsYXkgKm9iamVjdF9saXN0X25leHQ7Cit9IERWQlN1Yk9iamVjdERpc3BsYXk7CisKK3R5cGVkZWYgc3RydWN0IERWQlN1Yk9iamVjdCB7CisgICAgaW50IGlkOworICAgIGludCB2ZXJzaW9uOworCisgICAgaW50IHR5cGU7CisKKyAgICBEVkJTdWJPYmplY3REaXNwbGF5ICpkaXNwbGF5X2xpc3Q7CisKKyAgICBzdHJ1Y3QgRFZCU3ViT2JqZWN0ICpuZXh0OworfSBEVkJTdWJPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IERWQlN1YlJlZ2lvbkRpc3BsYXkgeworICAgIGludCByZWdpb25faWQ7CisKKyAgICBpbnQgeF9wb3M7CisgICAgaW50IHlfcG9zOworCisgICAgc3RydWN0IERWQlN1YlJlZ2lvbkRpc3BsYXkgKm5leHQ7Cit9IERWQlN1YlJlZ2lvbkRpc3BsYXk7CisKK3R5cGVkZWYgc3RydWN0IERWQlN1YlJlZ2lvbiB7CisgICAgaW50IGlkOworICAgIGludCB2ZXJzaW9uOworCisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgaW50IGRlcHRoOworCisgICAgaW50IGNsdXQ7CisgICAgaW50IGJnY29sb3I7CisKKyAgICB1aW50OF90ICpwYnVmOworICAgIGludCBidWZfc2l6ZTsKKyAgICBpbnQgZGlydHk7CisKKyAgICBEVkJTdWJPYmplY3REaXNwbGF5ICpkaXNwbGF5X2xpc3Q7CisKKyAgICBzdHJ1Y3QgRFZCU3ViUmVnaW9uICpuZXh0OworfSBEVkJTdWJSZWdpb247CisKK3R5cGVkZWYgc3RydWN0IERWQlN1YkRpc3BsYXlEZWZpbml0aW9uIHsKKyAgICBpbnQgdmVyc2lvbjsKKworICAgIGludCB4OworICAgIGludCB5OworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworfSBEVkJTdWJEaXNwbGF5RGVmaW5pdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgRFZCU3ViQ29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IGNvbXBvc2l0aW9uX2lkOworICAgIGludCBhbmNpbGxhcnlfaWQ7CisKKyAgICBpbnQgdmVyc2lvbjsKKyAgICBpbnQgdGltZV9vdXQ7CisgICAgaW50IGNvbXB1dGVfZWR0OyAvKio8IGlmIDEgZW5kIGRpc3BsYXkgdGltZSBjYWxjdWxhdGVkIHVzaW5nIHB0cworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAwIChEZWZhdWx0KSBjYWxjdWxhdGVkIHVzaW5nIHRpbWUgb3V0ICovCisgICAgaW50NjRfdCBwcmV2X3N0YXJ0OworICAgIERWQlN1YlJlZ2lvbiAqcmVnaW9uX2xpc3Q7CisgICAgRFZCU3ViQ0xVVCAgICpjbHV0X2xpc3Q7CisgICAgRFZCU3ViT2JqZWN0ICpvYmplY3RfbGlzdDsKKworICAgIERWQlN1YlJlZ2lvbkRpc3BsYXkgKmRpc3BsYXlfbGlzdDsKKyAgICBEVkJTdWJEaXNwbGF5RGVmaW5pdGlvbiAqZGlzcGxheV9kZWZpbml0aW9uOworfSBEVkJTdWJDb250ZXh0OworCisKK3N0YXRpYyBEVkJTdWJPYmplY3QqIGdldF9vYmplY3QoRFZCU3ViQ29udGV4dCAqY3R4LCBpbnQgb2JqZWN0X2lkKQoreworICAgIERWQlN1Yk9iamVjdCAqcHRyID0gY3R4LT5vYmplY3RfbGlzdDsKKworICAgIHdoaWxlIChwdHIgJiYgcHRyLT5pZCAhPSBvYmplY3RfaWQpIHsKKyAgICAgICAgcHRyID0gcHRyLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBEVkJTdWJDTFVUKiBnZXRfY2x1dChEVkJTdWJDb250ZXh0ICpjdHgsIGludCBjbHV0X2lkKQoreworICAgIERWQlN1YkNMVVQgKnB0ciA9IGN0eC0+Y2x1dF9saXN0OworCisgICAgd2hpbGUgKHB0ciAmJiBwdHItPmlkICE9IGNsdXRfaWQpIHsKKyAgICAgICAgcHRyID0gcHRyLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBEVkJTdWJSZWdpb24qIGdldF9yZWdpb24oRFZCU3ViQ29udGV4dCAqY3R4LCBpbnQgcmVnaW9uX2lkKQoreworICAgIERWQlN1YlJlZ2lvbiAqcHRyID0gY3R4LT5yZWdpb25fbGlzdDsKKworICAgIHdoaWxlIChwdHIgJiYgcHRyLT5pZCAhPSByZWdpb25faWQpIHsKKyAgICAgICAgcHRyID0gcHRyLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBwdHI7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9yZWdpb25fZGlzcGxheV9saXN0KERWQlN1YkNvbnRleHQgKmN0eCwgRFZCU3ViUmVnaW9uICpyZWdpb24pCit7CisgICAgRFZCU3ViT2JqZWN0ICpvYmplY3QsICpvYmoyLCAqKm9iajJfcHRyOworICAgIERWQlN1Yk9iamVjdERpc3BsYXkgKmRpc3BsYXksICpvYmpfZGlzcCwgKipvYmpfZGlzcF9wdHI7CisKKyAgICB3aGlsZSAocmVnaW9uLT5kaXNwbGF5X2xpc3QpIHsKKyAgICAgICAgZGlzcGxheSA9IHJlZ2lvbi0+ZGlzcGxheV9saXN0OworCisgICAgICAgIG9iamVjdCA9IGdldF9vYmplY3QoY3R4LCBkaXNwbGF5LT5vYmplY3RfaWQpOworCisgICAgICAgIGlmIChvYmplY3QpIHsKKyAgICAgICAgICAgIG9ial9kaXNwX3B0ciA9ICZvYmplY3QtPmRpc3BsYXlfbGlzdDsKKyAgICAgICAgICAgIG9ial9kaXNwID0gKm9ial9kaXNwX3B0cjsKKworICAgICAgICAgICAgd2hpbGUgKG9ial9kaXNwICYmIG9ial9kaXNwICE9IGRpc3BsYXkpIHsKKyAgICAgICAgICAgICAgICBvYmpfZGlzcF9wdHIgPSAmb2JqX2Rpc3AtPm9iamVjdF9saXN0X25leHQ7CisgICAgICAgICAgICAgICAgb2JqX2Rpc3AgPSAqb2JqX2Rpc3BfcHRyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2JqX2Rpc3ApIHsKKyAgICAgICAgICAgICAgICAqb2JqX2Rpc3BfcHRyID0gb2JqX2Rpc3AtPm9iamVjdF9saXN0X25leHQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC0+ZGlzcGxheV9saXN0KSB7CisgICAgICAgICAgICAgICAgICAgIG9iajJfcHRyID0gJmN0eC0+b2JqZWN0X2xpc3Q7CisgICAgICAgICAgICAgICAgICAgIG9iajIgPSAqb2JqMl9wdHI7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9iajIgIT0gb2JqZWN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKG9iajIpOworICAgICAgICAgICAgICAgICAgICAgICAgb2JqMl9wdHIgPSAmb2JqMi0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iajIgPSAqb2JqMl9wdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAqb2JqMl9wdHIgPSBvYmoyLT5uZXh0OworCisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZvYmoyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZWdpb24tPmRpc3BsYXlfbGlzdCA9IGRpc3BsYXktPnJlZ2lvbl9saXN0X25leHQ7CisKKyAgICAgICAgYXZfZnJlZXAoJmRpc3BsYXkpOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZCBkZWxldGVfY2x1dHMoRFZCU3ViQ29udGV4dCAqY3R4KQoreworICAgIHdoaWxlIChjdHgtPmNsdXRfbGlzdCkgeworICAgICAgICBEVkJTdWJDTFVUICpjbHV0ID0gY3R4LT5jbHV0X2xpc3Q7CisKKyAgICAgICAgY3R4LT5jbHV0X2xpc3QgPSBjbHV0LT5uZXh0OworCisgICAgICAgIGF2X2ZyZWVwKCZjbHV0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9vYmplY3RzKERWQlN1YkNvbnRleHQgKmN0eCkKK3sKKyAgICB3aGlsZSAoY3R4LT5vYmplY3RfbGlzdCkgeworICAgICAgICBEVkJTdWJPYmplY3QgKm9iamVjdCA9IGN0eC0+b2JqZWN0X2xpc3Q7CisKKyAgICAgICAgY3R4LT5vYmplY3RfbGlzdCA9IG9iamVjdC0+bmV4dDsKKworICAgICAgICBhdl9mcmVlcCgmb2JqZWN0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9yZWdpb25zKERWQlN1YkNvbnRleHQgKmN0eCkKK3sKKyAgICB3aGlsZSAoY3R4LT5yZWdpb25fbGlzdCkgeworICAgICAgICBEVkJTdWJSZWdpb24gKnJlZ2lvbiA9IGN0eC0+cmVnaW9uX2xpc3Q7CisKKyAgICAgICAgY3R4LT5yZWdpb25fbGlzdCA9IHJlZ2lvbi0+bmV4dDsKKworICAgICAgICBkZWxldGVfcmVnaW9uX2Rpc3BsYXlfbGlzdChjdHgsIHJlZ2lvbik7CisKKyAgICAgICAgYXZfZnJlZXAoJnJlZ2lvbi0+cGJ1Zik7CisgICAgICAgIGF2X2ZyZWVwKCZyZWdpb24pOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGR2YnN1Yl9pbml0X2RlY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBpLCByLCBnLCBiLCBhID0gMDsKKyAgICBEVkJTdWJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhIHx8IChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCA0KSB8fCAoKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAlIDUgIT0gMCkgJiYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAhPSA0KSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgRFZCIHN1YnRpdGxlcyBzdHJlYW0gZXh0cmFkYXRhIVxuIik7CisgICAgICAgIGN0eC0+Y29tcG9zaXRpb25faWQgPSAtMTsKKyAgICAgICAgY3R4LT5hbmNpbGxhcnlfaWQgICA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPiA1KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRGVjb2RpbmcgZmlyc3QgRFZCIHN1YnRpdGxlcyBzdWItc3RyZWFtXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+Y29tcG9zaXRpb25faWQgPSBBVl9SQjE2KGF2Y3R4LT5leHRyYWRhdGEpOworICAgICAgICBjdHgtPmFuY2lsbGFyeV9pZCAgID0gQVZfUkIxNihhdmN0eC0+ZXh0cmFkYXRhICsgMik7CisgICAgfQorCisgICAgY3R4LT52ZXJzaW9uID0gLTE7CisgICAgY3R4LT5wcmV2X3N0YXJ0ID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBkZWZhdWx0X2NsdXQuaWQgPSAtMTsKKyAgICBkZWZhdWx0X2NsdXQubmV4dCA9IE5VTEw7CisKKyAgICBkZWZhdWx0X2NsdXQuY2x1dDRbMF0gPSBSR0JBKCAgMCwgICAwLCAgIDAsICAgMCk7CisgICAgZGVmYXVsdF9jbHV0LmNsdXQ0WzFdID0gUkdCQSgyNTUsIDI1NSwgMjU1LCAyNTUpOworICAgIGRlZmF1bHRfY2x1dC5jbHV0NFsyXSA9IFJHQkEoICAwLCAgIDAsICAgMCwgMjU1KTsKKyAgICBkZWZhdWx0X2NsdXQuY2x1dDRbM10gPSBSR0JBKDEyNywgMTI3LCAxMjcsIDI1NSk7CisKKyAgICBkZWZhdWx0X2NsdXQuY2x1dDE2WzBdID0gUkdCQSggIDAsICAgMCwgICAwLCAgIDApOworICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGlmIChpIDwgOCkgeworICAgICAgICAgICAgciA9IChpICYgMSkgPyAyNTUgOiAwOworICAgICAgICAgICAgZyA9IChpICYgMikgPyAyNTUgOiAwOworICAgICAgICAgICAgYiA9IChpICYgNCkgPyAyNTUgOiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgciA9IChpICYgMSkgPyAxMjcgOiAwOworICAgICAgICAgICAgZyA9IChpICYgMikgPyAxMjcgOiAwOworICAgICAgICAgICAgYiA9IChpICYgNCkgPyAxMjcgOiAwOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHRfY2x1dC5jbHV0MTZbaV0gPSBSR0JBKHIsIGcsIGIsIDI1NSk7CisgICAgfQorCisgICAgZGVmYXVsdF9jbHV0LmNsdXQyNTZbMF0gPSBSR0JBKCAgMCwgICAwLCAgIDAsICAgMCk7CisgICAgZm9yIChpID0gMTsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGlmIChpIDwgOCkgeworICAgICAgICAgICAgciA9IChpICYgMSkgPyAyNTUgOiAwOworICAgICAgICAgICAgZyA9IChpICYgMikgPyAyNTUgOiAwOworICAgICAgICAgICAgYiA9IChpICYgNCkgPyAyNTUgOiAwOworICAgICAgICAgICAgYSA9IDYzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChpICYgMHg4OCkgeworICAgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgICAgIHIgPSAoKGkgJiAxKSA/IDg1IDogMCkgKyAoKGkgJiAweDEwKSA/IDE3MCA6IDApOworICAgICAgICAgICAgICAgIGcgPSAoKGkgJiAyKSA/IDg1IDogMCkgKyAoKGkgJiAweDIwKSA/IDE3MCA6IDApOworICAgICAgICAgICAgICAgIGIgPSAoKGkgJiA0KSA/IDg1IDogMCkgKyAoKGkgJiAweDQwKSA/IDE3MCA6IDApOworICAgICAgICAgICAgICAgIGEgPSAyNTU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDg6CisgICAgICAgICAgICAgICAgciA9ICgoaSAmIDEpID8gODUgOiAwKSArICgoaSAmIDB4MTApID8gMTcwIDogMCk7CisgICAgICAgICAgICAgICAgZyA9ICgoaSAmIDIpID8gODUgOiAwKSArICgoaSAmIDB4MjApID8gMTcwIDogMCk7CisgICAgICAgICAgICAgICAgYiA9ICgoaSAmIDQpID8gODUgOiAwKSArICgoaSAmIDB4NDApID8gMTcwIDogMCk7CisgICAgICAgICAgICAgICAgYSA9IDEyNzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg4MDoKKyAgICAgICAgICAgICAgICByID0gMTI3ICsgKChpICYgMSkgPyA0MyA6IDApICsgKChpICYgMHgxMCkgPyA4NSA6IDApOworICAgICAgICAgICAgICAgIGcgPSAxMjcgKyAoKGkgJiAyKSA/IDQzIDogMCkgKyAoKGkgJiAweDIwKSA/IDg1IDogMCk7CisgICAgICAgICAgICAgICAgYiA9IDEyNyArICgoaSAmIDQpID8gNDMgOiAwKSArICgoaSAmIDB4NDApID8gODUgOiAwKTsKKyAgICAgICAgICAgICAgICBhID0gMjU1OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDg4OgorICAgICAgICAgICAgICAgIHIgPSAoKGkgJiAxKSA/IDQzIDogMCkgKyAoKGkgJiAweDEwKSA/IDg1IDogMCk7CisgICAgICAgICAgICAgICAgZyA9ICgoaSAmIDIpID8gNDMgOiAwKSArICgoaSAmIDB4MjApID8gODUgOiAwKTsKKyAgICAgICAgICAgICAgICBiID0gKChpICYgNCkgPyA0MyA6IDApICsgKChpICYgMHg0MCkgPyA4NSA6IDApOworICAgICAgICAgICAgICAgIGEgPSAyNTU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdF9jbHV0LmNsdXQyNTZbaV0gPSBSR0JBKHIsIGcsIGIsIGEpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZHZic3ViX2Nsb3NlX2RlY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIERWQlN1YkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgRFZCU3ViUmVnaW9uRGlzcGxheSAqZGlzcGxheTsKKworICAgIGRlbGV0ZV9yZWdpb25zKGN0eCk7CisKKyAgICBkZWxldGVfb2JqZWN0cyhjdHgpOworCisgICAgZGVsZXRlX2NsdXRzKGN0eCk7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5kaXNwbGF5X2RlZmluaXRpb24pOworCisgICAgd2hpbGUgKGN0eC0+ZGlzcGxheV9saXN0KSB7CisgICAgICAgIGRpc3BsYXkgPSBjdHgtPmRpc3BsYXlfbGlzdDsKKyAgICAgICAgY3R4LT5kaXNwbGF5X2xpc3QgPSBkaXNwbGF5LT5uZXh0OworCisgICAgICAgIGF2X2ZyZWVwKCZkaXNwbGF5KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdmJzdWJfcmVhZF8yYml0X3N0cmluZyh1aW50OF90ICpkZXN0YnVmLCBpbnQgZGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipzcmNidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vbl9tb2QsIHVpbnQ4X3QgKm1hcF90YWJsZSwgaW50IHhfcG9zKQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisKKyAgICBpbnQgYml0czsKKyAgICBpbnQgcnVuX2xlbmd0aDsKKyAgICBpbnQgcGl4ZWxzX3JlYWQgPSB4X3BvczsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCAqc3JjYnVmLCBidWZfc2l6ZSA8PCAzKTsKKworICAgIGRlc3RidWYgKz0geF9wb3M7CisKKyAgICB3aGlsZSAoZ2V0X2JpdHNfY291bnQoJmdiKSA8IGJ1Zl9zaXplIDw8IDMgJiYgcGl4ZWxzX3JlYWQgPCBkYnVmX2xlbikgeworICAgICAgICBiaXRzID0gZ2V0X2JpdHMoJmdiLCAyKTsKKworICAgICAgICBpZiAoYml0cykgeworICAgICAgICAgICAgaWYgKG5vbl9tb2QgIT0gMSB8fCBiaXRzICE9IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAobWFwX3RhYmxlKQorICAgICAgICAgICAgICAgICAgICAqZGVzdGJ1ZisrID0gbWFwX3RhYmxlW2JpdHNdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRlc3RidWYrKyA9IGJpdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwaXhlbHNfcmVhZCsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYml0cyA9IGdldF9iaXRzMSgmZ2IpOworICAgICAgICAgICAgaWYgKGJpdHMgPT0gMSkgeworICAgICAgICAgICAgICAgIHJ1bl9sZW5ndGggPSBnZXRfYml0cygmZ2IsIDMpICsgMzsKKyAgICAgICAgICAgICAgICBiaXRzID0gZ2V0X2JpdHMoJmdiLCAyKTsKKworICAgICAgICAgICAgICAgIGlmIChub25fbW9kID09IDEgJiYgYml0cyA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCArPSBydW5fbGVuZ3RoOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobWFwX3RhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgYml0cyA9IG1hcF90YWJsZVtiaXRzXTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bl9sZW5ndGgtLSA+IDAgJiYgcGl4ZWxzX3JlYWQgPCBkYnVmX2xlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RidWYrKyA9IGJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiaXRzID0gZ2V0X2JpdHMxKCZnYik7CisgICAgICAgICAgICAgICAgaWYgKGJpdHMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBiaXRzID0gZ2V0X2JpdHMoJmdiLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2xlbmd0aCA9IGdldF9iaXRzKCZnYiwgNCkgKyAxMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgPSBnZXRfYml0cygmZ2IsIDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9uX21vZCA9PSAxICYmIGJpdHMgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCArPSBydW5fbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcF90YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyA9IG1hcF90YWJsZVtiaXRzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVuX2xlbmd0aC0tID4gMCAmJiBwaXhlbHNfcmVhZCA8IGRidWZfbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0YnVmKysgPSBiaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaXRzID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9sZW5ndGggPSBnZXRfYml0cygmZ2IsIDgpICsgMjk7CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzID0gZ2V0X2JpdHMoJmdiLCAyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vbl9tb2QgPT0gMSAmJiBiaXRzID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzX3JlYWQgKz0gcnVuX2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBfdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgPSBtYXBfdGFibGVbYml0c107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bl9sZW5ndGgtLSA+IDAgJiYgcGl4ZWxzX3JlYWQgPCBkYnVmX2xlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdGJ1ZisrID0gYml0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzX3JlYWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0cyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwX3RhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgPSBtYXBfdGFibGVbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5fbGVuZ3RoID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW5fbGVuZ3RoLS0gPiAwICYmIHBpeGVsc19yZWFkIDwgZGJ1Zl9sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdGJ1ZisrID0gYml0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKCpzcmNidWYpICs9IChnZXRfYml0c19jb3VudCgmZ2IpICsgNykgPj4gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwaXhlbHNfcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXBfdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzID0gbWFwX3RhYmxlWzBdOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3RidWYrKyA9IGJpdHM7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsc19yZWFkKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdldF9iaXRzKCZnYiwgNikpCisgICAgICAgIGF2X2xvZygwLCBBVl9MT0dfRVJST1IsICJEVkJTdWIgZXJyb3I6IGxpbmUgb3ZlcmZsb3dcbiIpOworCisgICAgKCpzcmNidWYpICs9IChnZXRfYml0c19jb3VudCgmZ2IpICsgNykgPj4gMzsKKworICAgIHJldHVybiBwaXhlbHNfcmVhZDsKK30KKworc3RhdGljIGludCBkdmJzdWJfcmVhZF80Yml0X3N0cmluZyh1aW50OF90ICpkZXN0YnVmLCBpbnQgZGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipzcmNidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vbl9tb2QsIHVpbnQ4X3QgKm1hcF90YWJsZSwgaW50IHhfcG9zKQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisKKyAgICBpbnQgYml0czsKKyAgICBpbnQgcnVuX2xlbmd0aDsKKyAgICBpbnQgcGl4ZWxzX3JlYWQgPSB4X3BvczsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCAqc3JjYnVmLCBidWZfc2l6ZSA8PCAzKTsKKworICAgIGRlc3RidWYgKz0geF9wb3M7CisKKyAgICB3aGlsZSAoZ2V0X2JpdHNfY291bnQoJmdiKSA8IGJ1Zl9zaXplIDw8IDMgJiYgcGl4ZWxzX3JlYWQgPCBkYnVmX2xlbikgeworICAgICAgICBiaXRzID0gZ2V0X2JpdHMoJmdiLCA0KTsKKworICAgICAgICBpZiAoYml0cykgeworICAgICAgICAgICAgaWYgKG5vbl9tb2QgIT0gMSB8fCBiaXRzICE9IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAobWFwX3RhYmxlKQorICAgICAgICAgICAgICAgICAgICAqZGVzdGJ1ZisrID0gbWFwX3RhYmxlW2JpdHNdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRlc3RidWYrKyA9IGJpdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwaXhlbHNfcmVhZCsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYml0cyA9IGdldF9iaXRzMSgmZ2IpOworICAgICAgICAgICAgaWYgKGJpdHMgPT0gMCkgeworICAgICAgICAgICAgICAgIHJ1bl9sZW5ndGggPSBnZXRfYml0cygmZ2IsIDMpOworCisgICAgICAgICAgICAgICAgaWYgKHJ1bl9sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAoKnNyY2J1ZikgKz0gKGdldF9iaXRzX2NvdW50KCZnYikgKyA3KSA+PiAzOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGl4ZWxzX3JlYWQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnVuX2xlbmd0aCArPSAyOworCisgICAgICAgICAgICAgICAgaWYgKG1hcF90YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgYml0cyA9IG1hcF90YWJsZVswXTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJpdHMgPSAwOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bl9sZW5ndGgtLSA+IDAgJiYgcGl4ZWxzX3JlYWQgPCBkYnVmX2xlbikgeworICAgICAgICAgICAgICAgICAgICAqZGVzdGJ1ZisrID0gYml0czsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxzX3JlYWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJpdHMgPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgICAgICAgICBpZiAoYml0cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bl9sZW5ndGggPSBnZXRfYml0cygmZ2IsIDIpICsgNDsKKyAgICAgICAgICAgICAgICAgICAgYml0cyA9IGdldF9iaXRzKCZnYiwgNCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vbl9tb2QgPT0gMSAmJiBiaXRzID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCArPSBydW5fbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBfdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyA9IG1hcF90YWJsZVtiaXRzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW5fbGVuZ3RoLS0gPiAwICYmIHBpeGVsc19yZWFkIDwgZGJ1Zl9sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdGJ1ZisrID0gYml0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYml0cyA9IGdldF9iaXRzKCZnYiwgMik7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9sZW5ndGggPSBnZXRfYml0cygmZ2IsIDQpICsgOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgPSBnZXRfYml0cygmZ2IsIDQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9uX21vZCA9PSAxICYmIGJpdHMgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCArPSBydW5fbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcF90YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyA9IG1hcF90YWJsZVtiaXRzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVuX2xlbmd0aC0tID4gMCAmJiBwaXhlbHNfcmVhZCA8IGRidWZfbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0YnVmKysgPSBiaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaXRzID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9sZW5ndGggPSBnZXRfYml0cygmZ2IsIDgpICsgMjU7CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzID0gZ2V0X2JpdHMoJmdiLCA0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vbl9tb2QgPT0gMSAmJiBiaXRzID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzX3JlYWQgKz0gcnVuX2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBfdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgPSBtYXBfdGFibGVbYml0c107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bl9sZW5ndGgtLSA+IDAgJiYgcGl4ZWxzX3JlYWQgPCBkYnVmX2xlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdGJ1ZisrID0gYml0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzX3JlYWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0cyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwX3RhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgPSBtYXBfdGFibGVbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5fbGVuZ3RoID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW5fbGVuZ3RoLS0gPiAwICYmIHBpeGVsc19yZWFkIDwgZGJ1Zl9sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdGJ1ZisrID0gYml0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcF90YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzID0gbWFwX3RhYmxlWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RidWYrKyA9IGJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnZXRfYml0cygmZ2IsIDgpKQorICAgICAgICBhdl9sb2coMCwgQVZfTE9HX0VSUk9SLCAiRFZCU3ViIGVycm9yOiBsaW5lIG92ZXJmbG93XG4iKTsKKworICAgICgqc3JjYnVmKSArPSAoZ2V0X2JpdHNfY291bnQoJmdiKSArIDcpID4+IDM7CisKKyAgICByZXR1cm4gcGl4ZWxzX3JlYWQ7Cit9CisKK3N0YXRpYyBpbnQgZHZic3ViX3JlYWRfOGJpdF9zdHJpbmcodWludDhfdCAqZGVzdGJ1ZiwgaW50IGRidWZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnNyY2J1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vbl9tb2QsIHVpbnQ4X3QgKm1hcF90YWJsZSwgaW50IHhfcG9zKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnNidWZfZW5kID0gKCpzcmNidWYpICsgYnVmX3NpemU7CisgICAgaW50IGJpdHM7CisgICAgaW50IHJ1bl9sZW5ndGg7CisgICAgaW50IHBpeGVsc19yZWFkID0geF9wb3M7CisKKyAgICBkZXN0YnVmICs9IHhfcG9zOworCisgICAgd2hpbGUgKCpzcmNidWYgPCBzYnVmX2VuZCAmJiBwaXhlbHNfcmVhZCA8IGRidWZfbGVuKSB7CisgICAgICAgIGJpdHMgPSAqKCpzcmNidWYpKys7CisKKyAgICAgICAgaWYgKGJpdHMpIHsKKyAgICAgICAgICAgIGlmIChub25fbW9kICE9IDEgfHwgYml0cyAhPSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hcF90YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgKmRlc3RidWYrKyA9IG1hcF90YWJsZVtiaXRzXTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkZXN0YnVmKysgPSBiaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGl4ZWxzX3JlYWQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJpdHMgPSAqKCpzcmNidWYpKys7CisgICAgICAgICAgICBydW5fbGVuZ3RoID0gYml0cyAmIDB4N2Y7CisgICAgICAgICAgICBpZiAoKGJpdHMgJiAweDgwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHJ1bl9sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGl4ZWxzX3JlYWQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYml0cyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJpdHMgPSAqKCpzcmNidWYpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9uX21vZCA9PSAxICYmIGJpdHMgPT0gMSkKKyAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCArPSBydW5fbGVuZ3RoOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1hcF90YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgYml0cyA9IG1hcF90YWJsZVtiaXRzXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAocnVuX2xlbmd0aC0tID4gMCAmJiBwaXhlbHNfcmVhZCA8IGRidWZfbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICpkZXN0YnVmKysgPSBiaXRzOworICAgICAgICAgICAgICAgICAgICBwaXhlbHNfcmVhZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgqKCpzcmNidWYpKyspCisgICAgICAgIGF2X2xvZygwLCBBVl9MT0dfRVJST1IsICJEVkJTdWIgZXJyb3I6IGxpbmUgb3ZlcmZsb3dcbiIpOworCisgICAgcmV0dXJuIHBpeGVsc19yZWFkOworfQorCitzdGF0aWMgaW50IHNhdmVfc3VidGl0bGVfc2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZTdWJ0aXRsZSAqc3ViLCBpbnQgKmdvdF9vdXRwdXQpCit7CisgICAgRFZCU3ViQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBEVkJTdWJSZWdpb25EaXNwbGF5ICpkaXNwbGF5OworICAgIERWQlN1YkRpc3BsYXlEZWZpbml0aW9uICpkaXNwbGF5X2RlZiA9IGN0eC0+ZGlzcGxheV9kZWZpbml0aW9uOworICAgIERWQlN1YlJlZ2lvbiAqcmVnaW9uOworICAgIEFWU3VidGl0bGVSZWN0ICpyZWN0OworICAgIERWQlN1YkNMVVQgKmNsdXQ7CisgICAgdWludDMyX3QgKmNsdXRfdGFibGU7CisgICAgaW50IGk7CisgICAgaW50IG9mZnNldF94PTAsIG9mZnNldF95PTA7CisgICAgaW50IHJldCA9IDA7CisKKworICAgIGlmIChkaXNwbGF5X2RlZikgeworICAgICAgICBvZmZzZXRfeCA9IGRpc3BsYXlfZGVmLT54OworICAgICAgICBvZmZzZXRfeSA9IGRpc3BsYXlfZGVmLT55OworICAgIH0KKworICAgIC8qIE5vdCB0b3VjaGluZyBBVlN1YnRpdGxlcyBhZ2FpbiovCisgICAgaWYoc3ViLT5udW1fcmVjdHMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGN0eCwgIkRpZmZlcmVudCBWZXJzaW9uIG9mIFNlZ21lbnQgYXNrZWQgVHdpY2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIGZvciAoZGlzcGxheSA9IGN0eC0+ZGlzcGxheV9saXN0OyBkaXNwbGF5OyBkaXNwbGF5ID0gZGlzcGxheS0+bmV4dCkgeworICAgICAgICByZWdpb24gPSBnZXRfcmVnaW9uKGN0eCwgZGlzcGxheS0+cmVnaW9uX2lkKTsKKyAgICAgICAgaWYgKHJlZ2lvbiAmJiByZWdpb24tPmRpcnR5KQorICAgICAgICAgICAgc3ViLT5udW1fcmVjdHMrKzsKKyAgICB9CisKKyAgICBpZihjdHgtPmNvbXB1dGVfZWR0ID09IDApIHsKKyAgICAgICAgc3ViLT5lbmRfZGlzcGxheV90aW1lID0gY3R4LT50aW1lX291dCAqIDEwMDA7CisgICAgICAgICpnb3Rfb3V0cHV0ID0gMTsKKyAgICB9IGVsc2UgaWYgKGN0eC0+cHJldl9zdGFydCAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBzdWItPmVuZF9kaXNwbGF5X3RpbWUgPSBhdl9yZXNjYWxlX3EoKHN1Yi0+cHRzIC0gY3R4LT5wcmV2X3N0YXJ0ICksIEFWX1RJTUVfQkFTRV9RLCAoQVZSYXRpb25hbCl7IDEsIDEwMDAgfSkgLSAxOworICAgICAgICAqZ290X291dHB1dCA9IDE7CisgICAgfQorICAgIGlmIChzdWItPm51bV9yZWN0cyA+IDApIHsKKworICAgICAgICBzdWItPnJlY3RzID0gYXZfbWFsbG9jel9hcnJheShzaXplb2YoKnN1Yi0+cmVjdHMpLCBzdWItPm51bV9yZWN0cyk7CisgICAgICAgIGlmICghc3ViLT5yZWN0cykgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZm9yKGk9MDsgaTxzdWItPm51bV9yZWN0czsgaSsrKQorICAgICAgICAgICAgc3ViLT5yZWN0c1tpXSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzdWItPnJlY3RzW2ldKSk7CisKKyAgICAgICAgaSA9IDA7CisKKyAgICAgICAgZm9yIChkaXNwbGF5ID0gY3R4LT5kaXNwbGF5X2xpc3Q7IGRpc3BsYXk7IGRpc3BsYXkgPSBkaXNwbGF5LT5uZXh0KSB7CisgICAgICAgICAgICByZWdpb24gPSBnZXRfcmVnaW9uKGN0eCwgZGlzcGxheS0+cmVnaW9uX2lkKTsKKworICAgICAgICAgICAgaWYgKCFyZWdpb24pCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmICghcmVnaW9uLT5kaXJ0eSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgcmVjdCA9IHN1Yi0+cmVjdHNbaV07CisgICAgICAgICAgICByZWN0LT54ID0gZGlzcGxheS0+eF9wb3MgKyBvZmZzZXRfeDsKKyAgICAgICAgICAgIHJlY3QtPnkgPSBkaXNwbGF5LT55X3BvcyArIG9mZnNldF95OworICAgICAgICAgICAgcmVjdC0+dyA9IHJlZ2lvbi0+d2lkdGg7CisgICAgICAgICAgICByZWN0LT5oID0gcmVnaW9uLT5oZWlnaHQ7CisgICAgICAgICAgICByZWN0LT5uYl9jb2xvcnMgPSAoMSA8PCByZWdpb24tPmRlcHRoKTsKKyAgICAgICAgICAgIHJlY3QtPnR5cGUgICAgICA9IFNVQlRJVExFX0JJVE1BUDsKKyAgICAgICAgICAgIHJlY3QtPnBpY3QubGluZXNpemVbMF0gPSByZWdpb24tPndpZHRoOworCisgICAgICAgICAgICBjbHV0ID0gZ2V0X2NsdXQoY3R4LCByZWdpb24tPmNsdXQpOworCisgICAgICAgICAgICBpZiAoIWNsdXQpCisgICAgICAgICAgICAgICAgY2x1dCA9ICZkZWZhdWx0X2NsdXQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAocmVnaW9uLT5kZXB0aCkgeworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGNsdXRfdGFibGUgPSBjbHV0LT5jbHV0NDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBjbHV0X3RhYmxlID0gY2x1dC0+Y2x1dDI1NjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY2x1dF90YWJsZSA9IGNsdXQtPmNsdXQxNjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVjdC0+cGljdC5kYXRhWzFdID0gYXZfbWFsbG9jeihBVlBBTEVUVEVfU0laRSk7CisgICAgICAgICAgICBpZiAoIXJlY3QtPnBpY3QuZGF0YVsxXSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkocmVjdC0+cGljdC5kYXRhWzFdLCBjbHV0X3RhYmxlLCAoMSA8PCByZWdpb24tPmRlcHRoKSAqIHNpemVvZih1aW50MzJfdCkpOworCisgICAgICAgICAgICByZWN0LT5waWN0LmRhdGFbMF0gPSBhdl9tYWxsb2MocmVnaW9uLT5idWZfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIXJlY3QtPnBpY3QuZGF0YVswXSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbWNweShyZWN0LT5waWN0LmRhdGFbMF0sIHJlZ2lvbi0+cGJ1ZiwgcmVnaW9uLT5idWZfc2l6ZSk7CisKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBpZiAoc3ViLT5yZWN0cykgeworICAgICAgICBmb3IoaT0wOyBpPHN1Yi0+bnVtX3JlY3RzOyBpKyspIHsKKyAgICAgICAgICAgIHJlY3QgPSBzdWItPnJlY3RzW2ldOworICAgICAgICAgICAgaWYgKHJlY3QpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcmVjdC0+cGljdC5kYXRhWzBdKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcmVjdC0+cGljdC5kYXRhWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzdWItPnJlY3RzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmc3ViLT5yZWN0cyk7CisgICAgfQorICAgIHN1Yi0+bnVtX3JlY3RzID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkdmJzdWJfcGFyc2VfcGl4ZWxfZGF0YV9ibG9jayhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIERWQlN1Yk9iamVjdERpc3BsYXkgKmRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50IHRvcF9ib3R0b20sIGludCBub25fbW9kKQoreworICAgIERWQlN1YkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBEVkJTdWJSZWdpb24gKnJlZ2lvbiA9IGdldF9yZWdpb24oY3R4LCBkaXNwbGF5LT5yZWdpb25faWQpOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBidWYgKyBidWZfc2l6ZTsKKyAgICB1aW50OF90ICpwYnVmOworICAgIGludCB4X3BvcywgeV9wb3M7CisgICAgaW50IGk7CisKKyAgICB1aW50OF90IG1hcDJ0bzRbXSA9IHsgMHgwLCAgMHg3LCAgMHg4LCAgMHhmfTsKKyAgICB1aW50OF90IG1hcDJ0bzhbXSA9IHsweDAwLCAweDc3LCAweDg4LCAweGZmfTsKKyAgICB1aW50OF90IG1hcDR0bzhbXSA9IHsweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgsIDB4OTksIDB4YWEsIDB4YmIsIDB4Y2MsIDB4ZGQsIDB4ZWUsIDB4ZmZ9OworICAgIHVpbnQ4X3QgKm1hcF90YWJsZTsKKworI2lmIDAKKyAgICBhdl9kbG9nKGF2Y3R4LCAiRFZCIHBpeGVsIGJsb2NrIHNpemUgJWQsICVzIGZpZWxkOlxuIiwgYnVmX3NpemUsCisgICAgICAgICAgICB0b3BfYm90dG9tID8gImJvdHRvbSIgOiAidG9wIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykgeworICAgICAgICBpZiAoaSAlIDE2ID09IDApCisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiMHglOHA6ICIsIGJ1ZitpKTsKKworICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiJTAyeCAiLCBidWZbaV0pOworICAgICAgICBpZiAoaSAlIDE2ID09IDE1KQorICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgIlxuIik7CisgICAgfQorCisgICAgaWYgKGkgJSAxNikKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgIlxuIik7CisjZW5kaWYKKworICAgIGlmICghcmVnaW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBwYnVmID0gcmVnaW9uLT5wYnVmOworICAgIHJlZ2lvbi0+ZGlydHkgPSAxOworCisgICAgeF9wb3MgPSBkaXNwbGF5LT54X3BvczsKKyAgICB5X3BvcyA9IGRpc3BsYXktPnlfcG9zOworCisgICAgeV9wb3MgKz0gdG9wX2JvdHRvbTsKKworICAgIHdoaWxlIChidWYgPCBidWZfZW5kKSB7CisgICAgICAgIGlmICgoKmJ1ZiE9MHhmMCAmJiB4X3BvcyA+PSByZWdpb24tPndpZHRoKSB8fCB5X3BvcyA+PSByZWdpb24tPmhlaWdodCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG9iamVjdCBsb2NhdGlvbiEgJWQtJWQgJWQtJWQgJTAyeFxuIiwgeF9wb3MsIHJlZ2lvbi0+d2lkdGgsIHlfcG9zLCByZWdpb24tPmhlaWdodCwgKmJ1Zik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKCpidWYrKykgeworICAgICAgICBjYXNlIDB4MTA6CisgICAgICAgICAgICBpZiAocmVnaW9uLT5kZXB0aCA9PSA4KQorICAgICAgICAgICAgICAgIG1hcF90YWJsZSA9IG1hcDJ0bzg7CisgICAgICAgICAgICBlbHNlIGlmIChyZWdpb24tPmRlcHRoID09IDQpCisgICAgICAgICAgICAgICAgbWFwX3RhYmxlID0gbWFwMnRvNDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtYXBfdGFibGUgPSBOVUxMOworCisgICAgICAgICAgICB4X3BvcyA9IGR2YnN1Yl9yZWFkXzJiaXRfc3RyaW5nKHBidWYgKyAoeV9wb3MgKiByZWdpb24tPndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uLT53aWR0aCwgJmJ1ZiwgYnVmX2VuZCAtIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX21vZCwgbWFwX3RhYmxlLCB4X3Bvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDExOgorICAgICAgICAgICAgaWYgKHJlZ2lvbi0+ZGVwdGggPCA0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICI0LWJpdCBwaXhlbCBzdHJpbmcgaW4gJWQtYml0IHJlZ2lvbiFcbiIsIHJlZ2lvbi0+ZGVwdGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlZ2lvbi0+ZGVwdGggPT0gOCkKKyAgICAgICAgICAgICAgICBtYXBfdGFibGUgPSBtYXA0dG84OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1hcF90YWJsZSA9IE5VTEw7CisKKyAgICAgICAgICAgIHhfcG9zID0gZHZic3ViX3JlYWRfNGJpdF9zdHJpbmcocGJ1ZiArICh5X3BvcyAqIHJlZ2lvbi0+d2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24tPndpZHRoLCAmYnVmLCBidWZfZW5kIC0gYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25fbW9kLCBtYXBfdGFibGUsIHhfcG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MTI6CisgICAgICAgICAgICBpZiAocmVnaW9uLT5kZXB0aCA8IDgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIjgtYml0IHBpeGVsIHN0cmluZyBpbiAlZC1iaXQgcmVnaW9uIVxuIiwgcmVnaW9uLT5kZXB0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB4X3BvcyA9IGR2YnN1Yl9yZWFkXzhiaXRfc3RyaW5nKHBidWYgKyAoeV9wb3MgKiByZWdpb24tPndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uLT53aWR0aCwgJmJ1ZiwgYnVmX2VuZCAtIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX21vZCwgTlVMTCwgeF9wb3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDIwOgorICAgICAgICAgICAgbWFwMnRvNFswXSA9ICgqYnVmKSA+PiA0OworICAgICAgICAgICAgbWFwMnRvNFsxXSA9ICgqYnVmKyspICYgMHhmOworICAgICAgICAgICAgbWFwMnRvNFsyXSA9ICgqYnVmKSA+PiA0OworICAgICAgICAgICAgbWFwMnRvNFszXSA9ICgqYnVmKyspICYgMHhmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgyMToKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgbWFwMnRvOFtpXSA9ICpidWYrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MjI6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgICAgICBtYXA0dG84W2ldID0gKmJ1ZisrOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweGYwOgorICAgICAgICAgICAgeF9wb3MgPSBkaXNwbGF5LT54X3BvczsKKyAgICAgICAgICAgIHlfcG9zICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJVbmtub3duL3Vuc3VwcG9ydGVkIHBpeGVsIGJsb2NrIDB4JXhcbiIsICooYnVmLTEpKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCitzdGF0aWMgdm9pZCBkdmJzdWJfcGFyc2Vfb2JqZWN0X3NlZ21lbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIERWQlN1YkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisgICAgaW50IG9iamVjdF9pZDsKKyAgICBEVkJTdWJPYmplY3QgKm9iamVjdDsKKyAgICBEVkJTdWJPYmplY3REaXNwbGF5ICpkaXNwbGF5OworICAgIGludCB0b3BfZmllbGRfbGVuLCBib3R0b21fZmllbGRfbGVuOworCisgICAgaW50IGNvZGluZ19tZXRob2QsIG5vbl9tb2RpZnlpbmdfY29sb3I7CisKKyAgICBvYmplY3RfaWQgPSBBVl9SQjE2KGJ1Zik7CisgICAgYnVmICs9IDI7CisKKyAgICBvYmplY3QgPSBnZXRfb2JqZWN0KGN0eCwgb2JqZWN0X2lkKTsKKworICAgIGlmICghb2JqZWN0KQorICAgICAgICByZXR1cm47CisKKyAgICBjb2RpbmdfbWV0aG9kID0gKCgqYnVmKSA+PiAyKSAmIDM7CisgICAgbm9uX21vZGlmeWluZ19jb2xvciA9ICgoKmJ1ZisrKSA+PiAxKSAmIDE7CisKKyAgICBpZiAoY29kaW5nX21ldGhvZCA9PSAwKSB7CisgICAgICAgIHRvcF9maWVsZF9sZW4gPSBBVl9SQjE2KGJ1Zik7CisgICAgICAgIGJ1ZiArPSAyOworICAgICAgICBib3R0b21fZmllbGRfbGVuID0gQVZfUkIxNihidWYpOworICAgICAgICBidWYgKz0gMjsKKworICAgICAgICBpZiAoYnVmICsgdG9wX2ZpZWxkX2xlbiArIGJvdHRvbV9maWVsZF9sZW4gPiBidWZfZW5kKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZpZWxkIGRhdGEgc2l6ZSB0b28gbGFyZ2VcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChkaXNwbGF5ID0gb2JqZWN0LT5kaXNwbGF5X2xpc3Q7IGRpc3BsYXk7IGRpc3BsYXkgPSBkaXNwbGF5LT5vYmplY3RfbGlzdF9uZXh0KSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpibG9jayA9IGJ1ZjsKKyAgICAgICAgICAgIGludCBiZmwgPSBib3R0b21fZmllbGRfbGVuOworCisgICAgICAgICAgICBkdmJzdWJfcGFyc2VfcGl4ZWxfZGF0YV9ibG9jayhhdmN0eCwgZGlzcGxheSwgYmxvY2ssIHRvcF9maWVsZF9sZW4sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9tb2RpZnlpbmdfY29sb3IpOworCisgICAgICAgICAgICBpZiAoYm90dG9tX2ZpZWxkX2xlbiA+IDApCisgICAgICAgICAgICAgICAgYmxvY2sgPSBidWYgKyB0b3BfZmllbGRfbGVuOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJmbCA9IHRvcF9maWVsZF9sZW47CisKKyAgICAgICAgICAgIGR2YnN1Yl9wYXJzZV9waXhlbF9kYXRhX2Jsb2NrKGF2Y3R4LCBkaXNwbGF5LCBibG9jaywgYmZsLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25fbW9kaWZ5aW5nX2NvbG9yKTsKKyAgICAgICAgfQorCisvKiAgfSBlbHNlIGlmIChjb2RpbmdfbWV0aG9kID09IDEpIHsqLworCisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIG9iamVjdCBjb2RpbmcgJWRcbiIsIGNvZGluZ19tZXRob2QpOworICAgIH0KKworfQorCitzdGF0aWMgaW50IGR2YnN1Yl9wYXJzZV9jbHV0X3NlZ21lbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIERWQlN1YkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisgICAgaW50IGksIGNsdXRfaWQ7CisgICAgaW50IHZlcnNpb247CisgICAgRFZCU3ViQ0xVVCAqY2x1dDsKKyAgICBpbnQgZW50cnlfaWQsIGRlcHRoICwgZnVsbF9yYW5nZTsKKyAgICBpbnQgeSwgY3IsIGNiLCBhbHBoYTsKKyAgICBpbnQgciwgZywgYiwgcl9hZGQsIGdfYWRkLCBiX2FkZDsKKworICAgIGF2X2Rsb2coYXZjdHgsICJEVkIgY2x1dCBwYWNrZXQ6XG4iKTsKKworICAgIGZvciAoaT0wOyBpIDwgYnVmX3NpemU7IGkrKykgeworICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiJTAyeCAiLCBidWZbaV0pOworICAgICAgICBpZiAoaSAlIDE2ID09IDE1KQorICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgIlxuIik7CisgICAgfQorCisgICAgaWYgKGkgJSAxNikKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgIlxuIik7CisKKyAgICBjbHV0X2lkID0gKmJ1ZisrOworICAgIHZlcnNpb24gPSAoKCpidWYpPj40KSYxNTsKKyAgICBidWYgKz0gMTsKKworICAgIGNsdXQgPSBnZXRfY2x1dChjdHgsIGNsdXRfaWQpOworCisgICAgaWYgKCFjbHV0KSB7CisgICAgICAgIGNsdXQgPSBhdl9tYWxsb2Moc2l6ZW9mKERWQlN1YkNMVVQpKTsKKworICAgICAgICBtZW1jcHkoY2x1dCwgJmRlZmF1bHRfY2x1dCwgc2l6ZW9mKERWQlN1YkNMVVQpKTsKKworICAgICAgICBjbHV0LT5pZCA9IGNsdXRfaWQ7CisgICAgICAgIGNsdXQtPnZlcnNpb24gPSAtMTsKKworICAgICAgICBjbHV0LT5uZXh0ID0gY3R4LT5jbHV0X2xpc3Q7CisgICAgICAgIGN0eC0+Y2x1dF9saXN0ID0gY2x1dDsKKyAgICB9CisKKyAgICBpZiAoY2x1dC0+dmVyc2lvbiAhPSB2ZXJzaW9uKSB7CisKKyAgICBjbHV0LT52ZXJzaW9uID0gdmVyc2lvbjsKKworICAgIHdoaWxlIChidWYgKyA0IDwgYnVmX2VuZCkgeworICAgICAgICBlbnRyeV9pZCA9ICpidWYrKzsKKworICAgICAgICBkZXB0aCA9ICgqYnVmKSAmIDB4ZTA7CisKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjbHV0IGRlcHRoIDB4JXghXG4iLCAqYnVmKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgZnVsbF9yYW5nZSA9ICgqYnVmKyspICYgMTsKKworICAgICAgICBpZiAoZnVsbF9yYW5nZSkgeworICAgICAgICAgICAgeSA9ICpidWYrKzsKKyAgICAgICAgICAgIGNyID0gKmJ1ZisrOworICAgICAgICAgICAgY2IgPSAqYnVmKys7CisgICAgICAgICAgICBhbHBoYSA9ICpidWYrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHkgPSBidWZbMF0gJiAweGZjOworICAgICAgICAgICAgY3IgPSAoKChidWZbMF0gJiAzKSA8PCAyKSB8ICgoYnVmWzFdID4+IDYpICYgMykpIDw8IDQ7CisgICAgICAgICAgICBjYiA9IChidWZbMV0gPDwgMikgJiAweGYwOworICAgICAgICAgICAgYWxwaGEgPSAoYnVmWzFdIDw8IDYpICYgMHhjMDsKKworICAgICAgICAgICAgYnVmICs9IDI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoeSA9PSAwKQorICAgICAgICAgICAgYWxwaGEgPSAweGZmOworCisgICAgICAgIFlVVl9UT19SR0IxX0NDSVIoY2IsIGNyKTsKKyAgICAgICAgWVVWX1RPX1JHQjJfQ0NJUihyLCBnLCBiLCB5KTsKKworICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiY2x1dCAlZCA6PSAoJWQsJWQsJWQsJWQpXG4iLCBlbnRyeV9pZCwgciwgZywgYiwgYWxwaGEpOworICAgICAgICBpZiAoISEoZGVwdGggJiAweDgwKSArICEhKGRlcHRoICYgMHg0MCkgKyAhIShkZXB0aCAmIDB4MjApID4gMSkgeworICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgIk1vcmUgdGhhbiBvbmUgYml0IGxldmVsIG1hcmtlZDogJXhcbiIsIGRlcHRoKTsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID4gRkZfQ09NUExJQU5DRV9OT1JNQUwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVwdGggJiAweDgwKQorICAgICAgICAgICAgY2x1dC0+Y2x1dDRbZW50cnlfaWRdID0gUkdCQShyLGcsYiwyNTUgLSBhbHBoYSk7CisgICAgICAgIGVsc2UgaWYgKGRlcHRoICYgMHg0MCkKKyAgICAgICAgICAgIGNsdXQtPmNsdXQxNltlbnRyeV9pZF0gPSBSR0JBKHIsZyxiLDI1NSAtIGFscGhhKTsKKyAgICAgICAgZWxzZSBpZiAoZGVwdGggJiAweDIwKQorICAgICAgICAgICAgY2x1dC0+Y2x1dDI1NltlbnRyeV9pZF0gPSBSR0JBKHIsZyxiLDI1NSAtIGFscGhhKTsKKyAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGR2YnN1Yl9wYXJzZV9yZWdpb25fc2VnbWVudChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgRFZCU3ViQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBidWYgKyBidWZfc2l6ZTsKKyAgICBpbnQgcmVnaW9uX2lkLCBvYmplY3RfaWQ7CisgICAgaW50IGF2X3VudXNlZCB2ZXJzaW9uOworICAgIERWQlN1YlJlZ2lvbiAqcmVnaW9uOworICAgIERWQlN1Yk9iamVjdCAqb2JqZWN0OworICAgIERWQlN1Yk9iamVjdERpc3BsYXkgKmRpc3BsYXk7CisgICAgaW50IGZpbGw7CisKKyAgICBpZiAoYnVmX3NpemUgPCAxMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcmVnaW9uX2lkID0gKmJ1ZisrOworCisgICAgcmVnaW9uID0gZ2V0X3JlZ2lvbihjdHgsIHJlZ2lvbl9pZCk7CisKKyAgICBpZiAoIXJlZ2lvbikgeworICAgICAgICByZWdpb24gPSBhdl9tYWxsb2N6KHNpemVvZihEVkJTdWJSZWdpb24pKTsKKworICAgICAgICByZWdpb24tPmlkID0gcmVnaW9uX2lkOworICAgICAgICByZWdpb24tPnZlcnNpb24gPSAtMTsKKworICAgICAgICByZWdpb24tPm5leHQgPSBjdHgtPnJlZ2lvbl9saXN0OworICAgICAgICBjdHgtPnJlZ2lvbl9saXN0ID0gcmVnaW9uOworICAgIH0KKworICAgIHZlcnNpb24gPSAoKCpidWYpPj40KSAmIDE1OworICAgIGZpbGwgPSAoKCpidWYrKykgPj4gMykgJiAxOworCisgICAgcmVnaW9uLT53aWR0aCA9IEFWX1JCMTYoYnVmKTsKKyAgICBidWYgKz0gMjsKKyAgICByZWdpb24tPmhlaWdodCA9IEFWX1JCMTYoYnVmKTsKKyAgICBidWYgKz0gMjsKKworICAgIGlmIChyZWdpb24tPndpZHRoICogcmVnaW9uLT5oZWlnaHQgIT0gcmVnaW9uLT5idWZfc2l6ZSkgeworICAgICAgICBhdl9mcmVlKHJlZ2lvbi0+cGJ1Zik7CisKKyAgICAgICAgcmVnaW9uLT5idWZfc2l6ZSA9IHJlZ2lvbi0+d2lkdGggKiByZWdpb24tPmhlaWdodDsKKworICAgICAgICByZWdpb24tPnBidWYgPSBhdl9tYWxsb2MocmVnaW9uLT5idWZfc2l6ZSk7CisKKyAgICAgICAgZmlsbCA9IDE7CisgICAgICAgIHJlZ2lvbi0+ZGlydHkgPSAwOworICAgIH0KKworICAgIHJlZ2lvbi0+ZGVwdGggPSAxIDw8ICgoKCpidWYrKykgPj4gMikgJiA3KTsKKyAgICBpZihyZWdpb24tPmRlcHRoPDIgfHwgcmVnaW9uLT5kZXB0aD44KXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZWdpb24gZGVwdGggJWQgaXMgaW52YWxpZFxuIiwgcmVnaW9uLT5kZXB0aCk7CisgICAgICAgIHJlZ2lvbi0+ZGVwdGg9IDQ7CisgICAgfQorICAgIHJlZ2lvbi0+Y2x1dCA9ICpidWYrKzsKKworICAgIGlmIChyZWdpb24tPmRlcHRoID09IDgpIHsKKyAgICAgICAgcmVnaW9uLT5iZ2NvbG9yID0gKmJ1ZisrOworICAgICAgICBidWYgKz0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBidWYgKz0gMTsKKworICAgICAgICBpZiAocmVnaW9uLT5kZXB0aCA9PSA0KQorICAgICAgICAgICAgcmVnaW9uLT5iZ2NvbG9yID0gKCgoKmJ1ZisrKSA+PiA0KSAmIDE1KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVnaW9uLT5iZ2NvbG9yID0gKCgoKmJ1ZisrKSA+PiAyKSAmIDMpOworICAgIH0KKworICAgIGF2X2Rsb2coYXZjdHgsICJSZWdpb24gJWQsICglZHglZClcbiIsIHJlZ2lvbl9pZCwgcmVnaW9uLT53aWR0aCwgcmVnaW9uLT5oZWlnaHQpOworCisgICAgaWYgKGZpbGwpIHsKKyAgICAgICAgbWVtc2V0KHJlZ2lvbi0+cGJ1ZiwgcmVnaW9uLT5iZ2NvbG9yLCByZWdpb24tPmJ1Zl9zaXplKTsKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgIkZpbGwgcmVnaW9uICglZClcbiIsIHJlZ2lvbi0+Ymdjb2xvcik7CisgICAgfQorCisgICAgZGVsZXRlX3JlZ2lvbl9kaXNwbGF5X2xpc3QoY3R4LCByZWdpb24pOworCisgICAgd2hpbGUgKGJ1ZiArIDUgPCBidWZfZW5kKSB7CisgICAgICAgIG9iamVjdF9pZCA9IEFWX1JCMTYoYnVmKTsKKyAgICAgICAgYnVmICs9IDI7CisKKyAgICAgICAgb2JqZWN0ID0gZ2V0X29iamVjdChjdHgsIG9iamVjdF9pZCk7CisKKyAgICAgICAgaWYgKCFvYmplY3QpIHsKKyAgICAgICAgICAgIG9iamVjdCA9IGF2X21hbGxvY3ooc2l6ZW9mKERWQlN1Yk9iamVjdCkpOworCisgICAgICAgICAgICBvYmplY3QtPmlkID0gb2JqZWN0X2lkOworICAgICAgICAgICAgb2JqZWN0LT5uZXh0ID0gY3R4LT5vYmplY3RfbGlzdDsKKyAgICAgICAgICAgIGN0eC0+b2JqZWN0X2xpc3QgPSBvYmplY3Q7CisgICAgICAgIH0KKworICAgICAgICBvYmplY3QtPnR5cGUgPSAoKmJ1ZikgPj4gNjsKKworICAgICAgICBkaXNwbGF5ID0gYXZfbWFsbG9jeihzaXplb2YoRFZCU3ViT2JqZWN0RGlzcGxheSkpOworCisgICAgICAgIGRpc3BsYXktPm9iamVjdF9pZCA9IG9iamVjdF9pZDsKKyAgICAgICAgZGlzcGxheS0+cmVnaW9uX2lkID0gcmVnaW9uX2lkOworCisgICAgICAgIGRpc3BsYXktPnhfcG9zID0gQVZfUkIxNihidWYpICYgMHhmZmY7CisgICAgICAgIGJ1ZiArPSAyOworICAgICAgICBkaXNwbGF5LT55X3BvcyA9IEFWX1JCMTYoYnVmKSAmIDB4ZmZmOworICAgICAgICBidWYgKz0gMjsKKworICAgICAgICBpZiAoKG9iamVjdC0+dHlwZSA9PSAxIHx8IG9iamVjdC0+dHlwZSA9PSAyKSAmJiBidWYrMSA8IGJ1Zl9lbmQpIHsKKyAgICAgICAgICAgIGRpc3BsYXktPmZnY29sb3IgPSAqYnVmKys7CisgICAgICAgICAgICBkaXNwbGF5LT5iZ2NvbG9yID0gKmJ1ZisrOworICAgICAgICB9CisKKyAgICAgICAgZGlzcGxheS0+cmVnaW9uX2xpc3RfbmV4dCA9IHJlZ2lvbi0+ZGlzcGxheV9saXN0OworICAgICAgICByZWdpb24tPmRpc3BsYXlfbGlzdCA9IGRpc3BsYXk7CisKKyAgICAgICAgZGlzcGxheS0+b2JqZWN0X2xpc3RfbmV4dCA9IG9iamVjdC0+ZGlzcGxheV9saXN0OworICAgICAgICBvYmplY3QtPmRpc3BsYXlfbGlzdCA9IGRpc3BsYXk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkdmJzdWJfcGFyc2VfcGFnZV9zZWdtZW50KEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgQVZTdWJ0aXRsZSAqc3ViLCBpbnQgKmdvdF9vdXRwdXQpCit7CisgICAgRFZCU3ViQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBEVkJTdWJSZWdpb25EaXNwbGF5ICpkaXNwbGF5OworICAgIERWQlN1YlJlZ2lvbkRpc3BsYXkgKnRtcF9kaXNwbGF5X2xpc3QsICoqdG1wX3B0cjsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBidWYgKyBidWZfc2l6ZTsKKyAgICBpbnQgcmVnaW9uX2lkOworICAgIGludCBwYWdlX3N0YXRlOworICAgIGludCB0aW1lb3V0OworICAgIGludCB2ZXJzaW9uOworCisgICAgaWYgKGJ1Zl9zaXplIDwgMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdGltZW91dCA9ICpidWYrKzsKKyAgICB2ZXJzaW9uID0gKCgqYnVmKT4+NCkgJiAxNTsKKyAgICBwYWdlX3N0YXRlID0gKCgqYnVmKyspID4+IDIpICYgMzsKKworICAgIGlmIChjdHgtPnZlcnNpb24gPT0gdmVyc2lvbikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY3R4LT50aW1lX291dCA9IHRpbWVvdXQ7CisgICAgY3R4LT52ZXJzaW9uID0gdmVyc2lvbjsKKworICAgIGF2X2Rsb2coYXZjdHgsICJQYWdlIHRpbWUgb3V0ICVkcywgc3RhdGUgJWRcbiIsIGN0eC0+dGltZV9vdXQsIHBhZ2Vfc3RhdGUpOworCisgICAgaWYoY3R4LT5jb21wdXRlX2VkdCA9PSAxKQorICAgICAgICBzYXZlX3N1YnRpdGxlX3NldChhdmN0eCwgc3ViLCBnb3Rfb3V0cHV0KTsKKworICAgIGlmIChwYWdlX3N0YXRlID09IDEgfHwgcGFnZV9zdGF0ZSA9PSAyKSB7CisgICAgICAgIGRlbGV0ZV9yZWdpb25zKGN0eCk7CisgICAgICAgIGRlbGV0ZV9vYmplY3RzKGN0eCk7CisgICAgICAgIGRlbGV0ZV9jbHV0cyhjdHgpOworICAgIH0KKworICAgIHRtcF9kaXNwbGF5X2xpc3QgPSBjdHgtPmRpc3BsYXlfbGlzdDsKKyAgICBjdHgtPmRpc3BsYXlfbGlzdCA9IE5VTEw7CisKKyAgICB3aGlsZSAoYnVmICsgNSA8IGJ1Zl9lbmQpIHsKKyAgICAgICAgcmVnaW9uX2lkID0gKmJ1ZisrOworICAgICAgICBidWYgKz0gMTsKKworICAgICAgICBkaXNwbGF5ID0gdG1wX2Rpc3BsYXlfbGlzdDsKKyAgICAgICAgdG1wX3B0ciA9ICZ0bXBfZGlzcGxheV9saXN0OworCisgICAgICAgIHdoaWxlIChkaXNwbGF5ICYmIGRpc3BsYXktPnJlZ2lvbl9pZCAhPSByZWdpb25faWQpIHsKKyAgICAgICAgICAgIHRtcF9wdHIgPSAmZGlzcGxheS0+bmV4dDsKKyAgICAgICAgICAgIGRpc3BsYXkgPSBkaXNwbGF5LT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFkaXNwbGF5KQorICAgICAgICAgICAgZGlzcGxheSA9IGF2X21hbGxvY3ooc2l6ZW9mKERWQlN1YlJlZ2lvbkRpc3BsYXkpKTsKKworICAgICAgICBkaXNwbGF5LT5yZWdpb25faWQgPSByZWdpb25faWQ7CisKKyAgICAgICAgZGlzcGxheS0+eF9wb3MgPSBBVl9SQjE2KGJ1Zik7CisgICAgICAgIGJ1ZiArPSAyOworICAgICAgICBkaXNwbGF5LT55X3BvcyA9IEFWX1JCMTYoYnVmKTsKKyAgICAgICAgYnVmICs9IDI7CisKKyAgICAgICAgKnRtcF9wdHIgPSBkaXNwbGF5LT5uZXh0OworCisgICAgICAgIGRpc3BsYXktPm5leHQgPSBjdHgtPmRpc3BsYXlfbGlzdDsKKyAgICAgICAgY3R4LT5kaXNwbGF5X2xpc3QgPSBkaXNwbGF5OworCisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJSZWdpb24gJWQsICglZCwlZClcbiIsIHJlZ2lvbl9pZCwgZGlzcGxheS0+eF9wb3MsIGRpc3BsYXktPnlfcG9zKTsKKyAgICB9CisKKyAgICB3aGlsZSAodG1wX2Rpc3BsYXlfbGlzdCkgeworICAgICAgICBkaXNwbGF5ID0gdG1wX2Rpc3BsYXlfbGlzdDsKKworICAgICAgICB0bXBfZGlzcGxheV9saXN0ID0gZGlzcGxheS0+bmV4dDsKKworICAgICAgICBhdl9mcmVlcCgmZGlzcGxheSk7CisgICAgfQorCit9CisKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBzYXZlX2Rpc3BsYXlfc2V0KERWQlN1YkNvbnRleHQgKmN0eCkKK3sKKyAgICBEVkJTdWJSZWdpb24gKnJlZ2lvbjsKKyAgICBEVkJTdWJSZWdpb25EaXNwbGF5ICpkaXNwbGF5OworICAgIERWQlN1YkNMVVQgKmNsdXQ7CisgICAgdWludDMyX3QgKmNsdXRfdGFibGU7CisgICAgaW50IHhfcG9zLCB5X3Bvcywgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgeCwgeSwgeV9vZmYsIHhfb2ZmOworICAgIHVpbnQzMl90ICpwYnVmOworICAgIGNoYXIgZmlsZW5hbWVbMzJdOworICAgIHN0YXRpYyBpbnQgZmlsZW5vX2luZGV4ID0gMDsKKworICAgIHhfcG9zID0gLTE7CisgICAgeV9wb3MgPSAtMTsKKyAgICB3aWR0aCA9IDA7CisgICAgaGVpZ2h0ID0gMDsKKworICAgIGZvciAoZGlzcGxheSA9IGN0eC0+ZGlzcGxheV9saXN0OyBkaXNwbGF5OyBkaXNwbGF5ID0gZGlzcGxheS0+bmV4dCkgeworICAgICAgICByZWdpb24gPSBnZXRfcmVnaW9uKGN0eCwgZGlzcGxheS0+cmVnaW9uX2lkKTsKKworICAgICAgICBpZiAoeF9wb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIHhfcG9zID0gZGlzcGxheS0+eF9wb3M7CisgICAgICAgICAgICB5X3BvcyA9IGRpc3BsYXktPnlfcG9zOworICAgICAgICAgICAgd2lkdGggPSByZWdpb24tPndpZHRoOworICAgICAgICAgICAgaGVpZ2h0ID0gcmVnaW9uLT5oZWlnaHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZGlzcGxheS0+eF9wb3MgPCB4X3BvcykgeworICAgICAgICAgICAgICAgIHdpZHRoICs9ICh4X3BvcyAtIGRpc3BsYXktPnhfcG9zKTsKKyAgICAgICAgICAgICAgICB4X3BvcyA9IGRpc3BsYXktPnhfcG9zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGlzcGxheS0+eV9wb3MgPCB5X3BvcykgeworICAgICAgICAgICAgICAgIGhlaWdodCArPSAoeV9wb3MgLSBkaXNwbGF5LT55X3Bvcyk7CisgICAgICAgICAgICAgICAgeV9wb3MgPSBkaXNwbGF5LT55X3BvczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRpc3BsYXktPnhfcG9zICsgcmVnaW9uLT53aWR0aCA+IHhfcG9zICsgd2lkdGgpIHsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IGRpc3BsYXktPnhfcG9zICsgcmVnaW9uLT53aWR0aCAtIHhfcG9zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGlzcGxheS0+eV9wb3MgKyByZWdpb24tPmhlaWdodCA+IHlfcG9zICsgaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0ID0gZGlzcGxheS0+eV9wb3MgKyByZWdpb24tPmhlaWdodCAtIHlfcG9zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHhfcG9zID49IDApIHsKKworICAgICAgICBwYnVmID0gYXZfbWFsbG9jKHdpZHRoICogaGVpZ2h0ICogNCk7CisKKyAgICAgICAgZm9yIChkaXNwbGF5ID0gY3R4LT5kaXNwbGF5X2xpc3Q7IGRpc3BsYXk7IGRpc3BsYXkgPSBkaXNwbGF5LT5uZXh0KSB7CisgICAgICAgICAgICByZWdpb24gPSBnZXRfcmVnaW9uKGN0eCwgZGlzcGxheS0+cmVnaW9uX2lkKTsKKworICAgICAgICAgICAgeF9vZmYgPSBkaXNwbGF5LT54X3BvcyAtIHhfcG9zOworICAgICAgICAgICAgeV9vZmYgPSBkaXNwbGF5LT55X3BvcyAtIHlfcG9zOworCisgICAgICAgICAgICBjbHV0ID0gZ2V0X2NsdXQoY3R4LCByZWdpb24tPmNsdXQpOworCisgICAgICAgICAgICBpZiAoIWNsdXQpCisgICAgICAgICAgICAgICAgY2x1dCA9ICZkZWZhdWx0X2NsdXQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAocmVnaW9uLT5kZXB0aCkgeworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGNsdXRfdGFibGUgPSBjbHV0LT5jbHV0NDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBjbHV0X3RhYmxlID0gY2x1dC0+Y2x1dDI1NjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY2x1dF90YWJsZSA9IGNsdXQtPmNsdXQxNjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHJlZ2lvbi0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcmVnaW9uLT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBidWZbKCh5ICsgeV9vZmYpICogd2lkdGgpICsgeF9vZmYgKyB4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjbHV0X3RhYmxlW3JlZ2lvbi0+cGJ1Zlt5ICogcmVnaW9uLT53aWR0aCArIHhdXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiZHZicy4lZCIsIGZpbGVub19pbmRleCk7CisKKyAgICAgICAgcG5nX3NhdmUyKGZpbGVuYW1lLCBwYnVmLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICBhdl9mcmVlcCgmcGJ1Zik7CisgICAgfQorCisgICAgZmlsZW5vX2luZGV4Kys7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZHZic3ViX3BhcnNlX2Rpc3BsYXlfZGVmaW5pdGlvbl9zZWdtZW50KEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKQoreworICAgIERWQlN1YkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgRFZCU3ViRGlzcGxheURlZmluaXRpb24gKmRpc3BsYXlfZGVmID0gY3R4LT5kaXNwbGF5X2RlZmluaXRpb247CisgICAgaW50IGRkc192ZXJzaW9uLCBpbmZvX2J5dGU7CisKKyAgICBpZiAoYnVmX3NpemUgPCA1KQorICAgICAgICByZXR1cm47CisKKyAgICBpbmZvX2J5dGUgICA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1Zik7CisgICAgZGRzX3ZlcnNpb24gPSBpbmZvX2J5dGUgPj4gNDsKKyAgICBpZiAoZGlzcGxheV9kZWYgJiYgZGlzcGxheV9kZWYtPnZlcnNpb24gPT0gZGRzX3ZlcnNpb24pCisgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBoYXZlIHRoaXMgZGlzcGxheSBkZWZpbml0aW9uIHZlcnNpb24KKworICAgIGlmICghZGlzcGxheV9kZWYpIHsKKyAgICAgICAgZGlzcGxheV9kZWYgICAgICAgICAgICAgPSBhdl9tYWxsb2N6KHNpemVvZigqZGlzcGxheV9kZWYpKTsKKyAgICAgICAgY3R4LT5kaXNwbGF5X2RlZmluaXRpb24gPSBkaXNwbGF5X2RlZjsKKyAgICB9CisgICAgaWYgKCFkaXNwbGF5X2RlZikKKyAgICAgICAgcmV0dXJuOworCisgICAgZGlzcGxheV9kZWYtPnZlcnNpb24gPSBkZHNfdmVyc2lvbjsKKyAgICBkaXNwbGF5X2RlZi0+eCAgICAgICA9IDA7CisgICAgZGlzcGxheV9kZWYtPnkgICAgICAgPSAwOworICAgIGRpc3BsYXlfZGVmLT53aWR0aCAgID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYnVmKSArIDE7CisgICAgZGlzcGxheV9kZWYtPmhlaWdodCAgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZidWYpICsgMTsKKyAgICBpZiAoIWF2Y3R4LT53aWR0aCB8fCAhYXZjdHgtPmhlaWdodCkgeworICAgICAgICBhdmN0eC0+d2lkdGggID0gZGlzcGxheV9kZWYtPndpZHRoOworICAgICAgICBhdmN0eC0+aGVpZ2h0ID0gZGlzcGxheV9kZWYtPmhlaWdodDsKKyAgICB9CisKKyAgICBpZiAoYnVmX3NpemUgPCAxMykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGluZm9fYnl0ZSAmIDE8PDMpIHsgLy8gZGlzcGxheV93aW5kb3dfZmxhZworICAgICAgICBkaXNwbGF5X2RlZi0+eCA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmJ1Zik7CisgICAgICAgIGRpc3BsYXlfZGVmLT53aWR0aCAgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZidWYpIC0gZGlzcGxheV9kZWYtPnggKyAxOworICAgICAgICBkaXNwbGF5X2RlZi0+eSA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmJ1Zik7CisgICAgICAgIGRpc3BsYXlfZGVmLT5oZWlnaHQgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZidWYpIC0gZGlzcGxheV9kZWYtPnkgKyAxOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZHZic3ViX2Rpc3BsYXlfZW5kX3NlZ21lbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplLCBBVlN1YnRpdGxlICpzdWIsaW50ICpnb3Rfb3V0cHV0KQoreworICAgIERWQlN1YkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZihjdHgtPmNvbXB1dGVfZWR0ID09IDApCisgICAgICAgIHNhdmVfc3VidGl0bGVfc2V0KGF2Y3R4LCBzdWIsIGdvdF9vdXRwdXQpOworI2lmZGVmIERFQlVHCisgICAgc2F2ZV9kaXNwbGF5X3NldChjdHgpOworI2VuZGlmCisKK30KKworc3RhdGljIGludCBkdmJzdWJfZGVjb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgRFZCU3ViQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVlN1YnRpdGxlICpzdWIgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKnAsICpwX2VuZDsKKyAgICBpbnQgc2VnbWVudF90eXBlOworICAgIGludCBwYWdlX2lkOworICAgIGludCBzZWdtZW50X2xlbmd0aDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgZ290X3NlZ21lbnQgPSAwOworCisgICAgYXZfZGxvZyhhdmN0eCwgIkRWQiBzdWIgcGFja2V0OlxuIik7CisKKyAgICBmb3IgKGk9MDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgIiUwMnggIiwgYnVmW2ldKTsKKyAgICAgICAgaWYgKGkgJSAxNiA9PSAxNSkKKyAgICAgICAgICAgIGF2X2Rsb2coYXZjdHgsICJcbiIpOworICAgIH0KKworICAgIGlmIChpICUgMTYpCisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJcbiIpOworCisgICAgaWYgKGJ1Zl9zaXplIDw9IDYgfHwgKmJ1ZiAhPSAweDBmKSB7CisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJpbmNvbXBsZXRlIG9yIGJyb2tlbiBwYWNrZXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHAgPSBidWY7CisgICAgcF9lbmQgPSBidWYgKyBidWZfc2l6ZTsKKworICAgIHdoaWxlIChwX2VuZCAtIHAgPj0gNiAmJiAqcCA9PSAweDBmKSB7CisgICAgICAgIHAgKz0gMTsKKyAgICAgICAgc2VnbWVudF90eXBlID0gKnArKzsKKyAgICAgICAgcGFnZV9pZCA9IEFWX1JCMTYocCk7CisgICAgICAgIHAgKz0gMjsKKyAgICAgICAgc2VnbWVudF9sZW5ndGggPSBBVl9SQjE2KHApOworICAgICAgICBwICs9IDI7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1NUQVJUQ09ERSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJzZWdtZW50X3R5cGU6JWQgcGFnZV9pZDolZCBzZWdtZW50X2xlbmd0aDolZFxuIiwgc2VnbWVudF90eXBlLCBwYWdlX2lkLCBzZWdtZW50X2xlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocF9lbmQgLSBwIDwgc2VnbWVudF9sZW5ndGgpIHsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZjdHgsICJpbmNvbXBsZXRlIG9yIGJyb2tlbiBwYWNrZXQiKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFnZV9pZCA9PSBjdHgtPmNvbXBvc2l0aW9uX2lkIHx8IHBhZ2VfaWQgPT0gY3R4LT5hbmNpbGxhcnlfaWQgfHwKKyAgICAgICAgICAgIGN0eC0+Y29tcG9zaXRpb25faWQgPT0gLTEgfHwgY3R4LT5hbmNpbGxhcnlfaWQgPT0gLTEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc2VnbWVudF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIERWQlNVQl9QQUdFX1NFR01FTlQ6CisgICAgICAgICAgICAgICAgZHZic3ViX3BhcnNlX3BhZ2Vfc2VnbWVudChhdmN0eCwgcCwgc2VnbWVudF9sZW5ndGgsIHN1YiwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICBnb3Rfc2VnbWVudCB8PSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEVkJTVUJfUkVHSU9OX1NFR01FTlQ6CisgICAgICAgICAgICAgICAgZHZic3ViX3BhcnNlX3JlZ2lvbl9zZWdtZW50KGF2Y3R4LCBwLCBzZWdtZW50X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgZ290X3NlZ21lbnQgfD0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRFZCU1VCX0NMVVRfU0VHTUVOVDoKKyAgICAgICAgICAgICAgICByZXQgPSBkdmJzdWJfcGFyc2VfY2x1dF9zZWdtZW50KGF2Y3R4LCBwLCBzZWdtZW50X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIGdvdF9zZWdtZW50IHw9IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERWQlNVQl9PQkpFQ1RfU0VHTUVOVDoKKyAgICAgICAgICAgICAgICBkdmJzdWJfcGFyc2Vfb2JqZWN0X3NlZ21lbnQoYXZjdHgsIHAsIHNlZ21lbnRfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBnb3Rfc2VnbWVudCB8PSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEVkJTVUJfRElTUExBWURFRklOSVRJT05fU0VHTUVOVDoKKyAgICAgICAgICAgICAgICBkdmJzdWJfcGFyc2VfZGlzcGxheV9kZWZpbml0aW9uX3NlZ21lbnQoYXZjdHgsIHAsIHNlZ21lbnRfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRFZCU1VCX0RJU1BMQVlfU0VHTUVOVDoKKyAgICAgICAgICAgICAgICBkdmJzdWJfZGlzcGxheV9lbmRfc2VnbWVudChhdmN0eCwgcCwgc2VnbWVudF9sZW5ndGgsIHN1YiwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICBnb3Rfc2VnbWVudCB8PSAxNjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgIlN1YnRpdGxpbmcgc2VnbWVudCB0eXBlIDB4JXgsIHBhZ2UgaWQgJWQsIGxlbmd0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRfdHlwZSwgcGFnZV9pZCwgc2VnbWVudF9sZW5ndGgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcCArPSBzZWdtZW50X2xlbmd0aDsKKyAgICB9CisgICAgLy8gU29tZSBzdHJlYW1zIGRvIG5vdCBzZW5kIGEgZGlzcGxheSBzZWdtZW50IGJ1dCBpZiB3ZSBoYXZlIGFsbCB0aGUgb3RoZXIKKyAgICAvLyBzZWdtZW50cyB0aGVuIHdlIG5lZWQgbm8gZnVydGhlciBkYXRhLgorICAgIGlmIChnb3Rfc2VnbWVudCA9PSAxNSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIk1pc3NpbmcgZGlzcGxheV9lbmRfc2VnbWVudCwgZW11bGF0aW5nXG4iKTsKKyAgICAgICAgZHZic3ViX2Rpc3BsYXlfZW5kX3NlZ21lbnQoYXZjdHgsIHAsIDAsIHN1YiwgZGF0YV9zaXplKTsKKyAgICB9CisKK2VuZDoKKyAgICBpZihyZXQgPCAwKSB7CisgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICBhdnN1YnRpdGxlX2ZyZWUoc3ViKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZihjdHgtPmNvbXB1dGVfZWR0ID09IDEgKQorICAgICAgICAgICAgRkZTV0FQKGludDY0X3QsIGN0eC0+cHJldl9zdGFydCwgc3ViLT5wdHMpOworICAgIH0KKworICAgIHJldHVybiBwIC0gYnVmOworfQorCisjZGVmaW5lIERTIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIHwgQVZfT1BUX0ZMQUdfU1VCVElUTEVfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyJjb21wdXRlX2VkdCIsICJjb21wdXRlIGVuZCBvZiB0aW1lIHVzaW5nIHB0cyBvciB0aW1lb3V0Iiwgb2Zmc2V0b2YoRFZCU3ViQ29udGV4dCwgY29tcHV0ZV9lZHQpLCBGRl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIERTfSwKKyAgICB7TlVMTH0KK307CitzdGF0aWMgY29uc3QgQVZDbGFzcyBkdmJzdWJkZWNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiRFZCIFN1YiBEZWNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfZHZic3ViX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImR2YnN1YiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRWQiBzdWJ0aXRsZXMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihEVkJTdWJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkdmJzdWJfaW5pdF9kZWNvZGVyLAorICAgIC5jbG9zZSAgICAgICAgICA9IGR2YnN1Yl9jbG9zZV9kZWNvZGVyLAorICAgIC5kZWNvZGUgICAgICAgICA9IGR2YnN1Yl9kZWNvZGUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmR2YnN1YmRlY19jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kdmRfbmF2X3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHZkX25hdl9wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTIzNTJkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHZkX25hdl9wYXJzZXIuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIERWRCBuYXZpZ2F0aW9uIGJsb2NrIHBhcnNlciBmb3IgRkZtcGVnCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisKKyNkZWZpbmUgUENJX1NJWkUgIDk4MAorI2RlZmluZSBEU0lfU0laRSAxMDE4CisKKy8qIHBhcnNlciBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdCBEVkROYXZQYXJzZUNvbnRleHQgeworICAgIHVpbnQzMl90ICAgICBsYmE7CisgICAgdWludDhfdCAgICAgIGJ1ZmZlcltQQ0lfU0laRStEU0lfU0laRV07CisgICAgaW50ICAgICAgICAgIGNvcGllZDsKK30gRFZETmF2UGFyc2VDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgZHZkX25hdl9wYXJzZV9pbml0KEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzKQoreworICAgIERWRE5hdlBhcnNlQ29udGV4dCAqcGMgPSBzLT5wcml2X2RhdGE7CisKKyAgICBwYy0+bGJhICAgID0gMHhGRkZGRkZGRjsKKyAgICBwYy0+Y29waWVkID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdmRfbmF2X3BhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgRFZETmF2UGFyc2VDb250ZXh0ICpwYzEgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGxhc3RQYWNrZXQgICAgICAgICAgPSAwOworICAgIGludCB2YWxpZCAgICAgICAgICAgICAgID0gMDsKKworICAgIHMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9OT05FOworCisgICAgYXZjdHgtPnRpbWVfYmFzZS5udW0gPSAxOworICAgIGF2Y3R4LT50aW1lX2Jhc2UuZGVuID0gOTAwMDA7CisKKyAgICBpZiAoYnVmICYmIGJ1Zl9zaXplKSB7CisgICAgICAgIHN3aXRjaChidWZbMF0pIHsKKyAgICAgICAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgICAgICAgICBpZiAoYnVmX3NpemUgPT0gUENJX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogUENJICovCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxiYSAgICAgID0gQVZfUkIzMigmYnVmWzB4MDFdKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRwdHMgPSBBVl9SQjMyKCZidWZbMHgwRF0pOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBlbmRwdHMgICA9IEFWX1JCMzIoJmJ1ZlsweDExXSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHB0cyA+IHN0YXJ0cHRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYzEtPmxiYSAgICA9IGxiYTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnB0cyAgICAgID0gKGludDY0X3Qpc3RhcnRwdHM7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kdXJhdGlvbiA9IGVuZHB0cyAtIHN0YXJ0cHRzOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocGMxLT5idWZmZXIsIGJ1ZiwgUENJX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgcGMxLT5jb3BpZWQgPSBQQ0lfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgICAgIGlmICgoYnVmX3NpemUgPT0gRFNJX1NJWkUpICYmIChwYzEtPmNvcGllZCA9PSBQQ0lfU0laRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRFNJICovCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxiYSA9IEFWX1JCMzIoJmJ1ZlsweDA1XSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxiYSA9PSBwYzEtPmxiYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBjMS0+YnVmZmVyICsgcGMxLT5jb3BpZWQsIGJ1ZiwgRFNJX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBhY2tldCAgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgICAgICAgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF2YWxpZCB8fCBsYXN0UGFja2V0KSB7CisgICAgICAgIHBjMS0+Y29waWVkID0gMDsKKyAgICAgICAgcGMxLT5sYmEgICAgPSAweEZGRkZGRkZGOworICAgIH0KKworICAgIGlmIChsYXN0UGFja2V0KSB7CisgICAgICAgICpwb3V0YnVmICAgICAgPSBwYzEtPmJ1ZmZlcjsKKyAgICAgICAgKnBvdXRidWZfc2l6ZSA9IHNpemVvZihwYzEtPmJ1ZmZlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBvdXRidWYgICAgICA9IE5VTEw7CisgICAgICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgIH0KKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworQVZDb2RlY1BhcnNlciBmZl9kdmRfbmF2X3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX0RWRF9OQVYgfSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRFZETmF2UGFyc2VDb250ZXh0KSwKKyAgICAucGFyc2VyX2luaXQgICAgPSBkdmRfbmF2X3BhcnNlX2luaXQsCisgICAgLnBhcnNlcl9wYXJzZSAgID0gZHZkX25hdl9wYXJzZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kdmRhdGEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2ZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMTU2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kdmRhdGEuYwpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIENvbnN0YW50cyBmb3IgRFYgY29kZWMKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ29uc3RhbnRzIGZvciBEViBjb2RlYy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJkdmRhdGEuaCIKKworLyogU3BlY2lmaWMgemlnemFnIHNjYW4gZm9yIDI0OCBpZGN0LiBOT1RFIHRoYXQgdW5saWtlIHRoZQorICogc3BlY2lmaWNhdGlvbiwgd2UgaW50ZXJsZWF2ZSB0aGUgZmllbGRzICovCitjb25zdCB1aW50OF90IGZmX2R2X3ppZ3phZzI0OF9kaXJlY3RbNjRdID0geworICAgICAwLCAgOCwgIDEsICA5LCAxNiwgMjQsICAyLCAxMCwKKyAgICAxNywgMjUsIDMyLCA0MCwgNDgsIDU2LCAzMywgNDEsCisgICAgMTgsIDI2LCAgMywgMTEsICA0LCAxMiwgMTksIDI3LAorICAgIDM0LCA0MiwgNDksIDU3LCA1MCwgNTgsIDM1LCA0MywKKyAgICAyMCwgMjgsICA1LCAxMywgIDYsIDE0LCAyMSwgMjksCisgICAgMzYsIDQ0LCA1MSwgNTksIDUyLCA2MCwgMzcsIDQ1LAorICAgIDIyLCAzMCwgIDcsIDE1LCAyMywgMzEsIDM4LCA0NiwKKyAgICA1MywgNjEsIDU0LCA2MiwgMzksIDQ3LCA1NSwgNjMsCit9OworCisvKiB1bnF1YW50IHRhYmxlcyAobm90IHVzZWQgZGlyZWN0bHkpICovCitjb25zdCB1aW50OF90IGZmX2R2X3F1YW50X3NoaWZ0c1syMl1bNF0gPSB7CisgICAgeyAzLCAzLCA0LCA0IH0sCisgICAgeyAzLCAzLCA0LCA0IH0sCisgICAgeyAyLCAzLCAzLCA0IH0sCisgICAgeyAyLCAzLCAzLCA0IH0sCisgICAgeyAyLCAyLCAzLCAzIH0sCisgICAgeyAyLCAyLCAzLCAzIH0sCisgICAgeyAxLCAyLCAyLCAzIH0sCisgICAgeyAxLCAyLCAyLCAzIH0sCisgICAgeyAxLCAxLCAyLCAyIH0sCisgICAgeyAxLCAxLCAyLCAyIH0sCisgICAgeyAwLCAxLCAxLCAyIH0sCisgICAgeyAwLCAxLCAxLCAyIH0sCisgICAgeyAwLCAwLCAxLCAxIH0sCisgICAgeyAwLCAwLCAxLCAxIH0sCisgICAgeyAwLCAwLCAwLCAxIH0sCisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwIH0sCit9OworCitjb25zdCB1aW50OF90IGZmX2R2X3F1YW50X29mZnNldFs0XSA9IHsgNiwgMywgMCwgMSB9OworCisvKgorICogVGhlcmUncyBhIGNhdGNoIGFib3V0IHRoZSBmb2xsb3dpbmcgdGhyZWUgdGFibGVzOiB0aGUgbWFwcGluZyB0aGV5IGVzdGFibGlzaAorICogYmV0d2VlbiAocnVuLCBsZXZlbCkgYW5kIHZsYyBpcyBub3QgMS0xLiBTbyB5b3UgaGF2ZSB0byB3YXRjaCBvdXQgZm9yIHRoYXQKKyAqIHdoZW4gYnVpbGRpbmcgbWlzYy4gdGFibGVzLiBFLmcuICgxLCAwKSBjYW4gYmUgZWl0aGVyIDB4N2NmIG9yIDB4MWY4Mi4KKyAqLworY29uc3QgdWludDE2X3QgZmZfZHZfdmxjX2JpdHNbTkJfRFZfVkxDXSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMiwgMHgwMDA3LCAweDAwMDgsIDB4MDAwOSwgMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwKKyAgICAweDAwMTcsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwKKyAgICAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwgMHgwMGUwLCAweDAwZTEsIDB4MDBlMiwKKyAgICAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywgMHgwMGU4LCAweDAwZTksIDB4MDBlYSwKKyAgICAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwgMHgwMWUwLCAweDAxZTEsIDB4MDFlMiwKKyAgICAweDAxZTMsIDB4MDFlNCwgMHgwMWU1LCAweDAxZTYsIDB4MDFlNywgMHgwMWU4LCAweDAxZTksIDB4MDFlYSwKKyAgICAweDAxZWIsIDB4MDFlYywgMHgwMWVkLCAweDAxZWUsIDB4MDFlZiwgMHgwM2UwLCAweDAzZTEsIDB4MDNlMiwKKyAgICAweDAzZTMsIDB4MDNlNCwgMHgwM2U1LCAweDAzZTYsIDB4MDdjZSwgMHgwN2NmLCAweDA3ZDAsIDB4MDdkMSwKKyAgICAweDA3ZDIsIDB4MDdkMywgMHgwN2Q0LCAweDA3ZDUsIDB4MGZhYywgMHgwZmFkLCAweDBmYWUsIDB4MGZhZiwKKyAgICAweDBmYjAsIDB4MGZiMSwgMHgwZmIyLCAweDBmYjMsIDB4MGZiNCwgMHgwZmI1LCAweDBmYjYsIDB4MGZiNywKKyAgICAweDBmYjgsIDB4MGZiOSwgMHgwZmJhLCAweDBmYmIsIDB4MGZiYywgMHgwZmJkLCAweDBmYmUsIDB4MGZiZiwKKyAgICAweDFmODAsIDB4MWY4MSwgMHgxZjgyLCAweDFmODMsIDB4MWY4NCwgMHgxZjg1LCAweDFmODYsIDB4MWY4NywKKyAgICAweDFmODgsIDB4MWY4OSwgMHgxZjhhLCAweDFmOGIsIDB4MWY4YywgMHgxZjhkLCAweDFmOGUsIDB4MWY4ZiwKKyAgICAweDFmOTAsIDB4MWY5MSwgMHgxZjkyLCAweDFmOTMsIDB4MWY5NCwgMHgxZjk1LCAweDFmOTYsIDB4MWY5NywKKyAgICAweDFmOTgsIDB4MWY5OSwgMHgxZjlhLCAweDFmOWIsIDB4MWY5YywgMHgxZjlkLCAweDFmOWUsIDB4MWY5ZiwKKyAgICAweDFmYTAsIDB4MWZhMSwgMHgxZmEyLCAweDFmYTMsIDB4MWZhNCwgMHgxZmE1LCAweDFmYTYsIDB4MWZhNywKKyAgICAweDFmYTgsIDB4MWZhOSwgMHgxZmFhLCAweDFmYWIsIDB4MWZhYywgMHgxZmFkLCAweDFmYWUsIDB4MWZhZiwKKyAgICAweDFmYjAsIDB4MWZiMSwgMHgxZmIyLCAweDFmYjMsIDB4MWZiNCwgMHgxZmI1LCAweDFmYjYsIDB4MWZiNywKKyAgICAweDFmYjgsIDB4MWZiOSwgMHgxZmJhLCAweDFmYmIsIDB4MWZiYywgMHgxZmJkLCAweDFmYmUsIDB4MWZiZiwKKyAgICAweDdmMDAsIDB4N2YwMSwgMHg3ZjAyLCAweDdmMDMsIDB4N2YwNCwgMHg3ZjA1LCAweDdmMDYsIDB4N2YwNywKKyAgICAweDdmMDgsIDB4N2YwOSwgMHg3ZjBhLCAweDdmMGIsIDB4N2YwYywgMHg3ZjBkLCAweDdmMGUsIDB4N2YwZiwKKyAgICAweDdmMTAsIDB4N2YxMSwgMHg3ZjEyLCAweDdmMTMsIDB4N2YxNCwgMHg3ZjE1LCAweDdmMTYsIDB4N2YxNywKKyAgICAweDdmMTgsIDB4N2YxOSwgMHg3ZjFhLCAweDdmMWIsIDB4N2YxYywgMHg3ZjFkLCAweDdmMWUsIDB4N2YxZiwKKyAgICAweDdmMjAsIDB4N2YyMSwgMHg3ZjIyLCAweDdmMjMsIDB4N2YyNCwgMHg3ZjI1LCAweDdmMjYsIDB4N2YyNywKKyAgICAweDdmMjgsIDB4N2YyOSwgMHg3ZjJhLCAweDdmMmIsIDB4N2YyYywgMHg3ZjJkLCAweDdmMmUsIDB4N2YyZiwKKyAgICAweDdmMzAsIDB4N2YzMSwgMHg3ZjMyLCAweDdmMzMsIDB4N2YzNCwgMHg3ZjM1LCAweDdmMzYsIDB4N2YzNywKKyAgICAweDdmMzgsIDB4N2YzOSwgMHg3ZjNhLCAweDdmM2IsIDB4N2YzYywgMHg3ZjNkLCAweDdmM2UsIDB4N2YzZiwKKyAgICAweDdmNDAsIDB4N2Y0MSwgMHg3ZjQyLCAweDdmNDMsIDB4N2Y0NCwgMHg3ZjQ1LCAweDdmNDYsIDB4N2Y0NywKKyAgICAweDdmNDgsIDB4N2Y0OSwgMHg3ZjRhLCAweDdmNGIsIDB4N2Y0YywgMHg3ZjRkLCAweDdmNGUsIDB4N2Y0ZiwKKyAgICAweDdmNTAsIDB4N2Y1MSwgMHg3ZjUyLCAweDdmNTMsIDB4N2Y1NCwgMHg3ZjU1LCAweDdmNTYsIDB4N2Y1NywKKyAgICAweDdmNTgsIDB4N2Y1OSwgMHg3ZjVhLCAweDdmNWIsIDB4N2Y1YywgMHg3ZjVkLCAweDdmNWUsIDB4N2Y1ZiwKKyAgICAweDdmNjAsIDB4N2Y2MSwgMHg3ZjYyLCAweDdmNjMsIDB4N2Y2NCwgMHg3ZjY1LCAweDdmNjYsIDB4N2Y2NywKKyAgICAweDdmNjgsIDB4N2Y2OSwgMHg3ZjZhLCAweDdmNmIsIDB4N2Y2YywgMHg3ZjZkLCAweDdmNmUsIDB4N2Y2ZiwKKyAgICAweDdmNzAsIDB4N2Y3MSwgMHg3ZjcyLCAweDdmNzMsIDB4N2Y3NCwgMHg3Zjc1LCAweDdmNzYsIDB4N2Y3NywKKyAgICAweDdmNzgsIDB4N2Y3OSwgMHg3ZjdhLCAweDdmN2IsIDB4N2Y3YywgMHg3ZjdkLCAweDdmN2UsIDB4N2Y3ZiwKKyAgICAweDdmODAsIDB4N2Y4MSwgMHg3ZjgyLCAweDdmODMsIDB4N2Y4NCwgMHg3Zjg1LCAweDdmODYsIDB4N2Y4NywKKyAgICAweDdmODgsIDB4N2Y4OSwgMHg3ZjhhLCAweDdmOGIsIDB4N2Y4YywgMHg3ZjhkLCAweDdmOGUsIDB4N2Y4ZiwKKyAgICAweDdmOTAsIDB4N2Y5MSwgMHg3ZjkyLCAweDdmOTMsIDB4N2Y5NCwgMHg3Zjk1LCAweDdmOTYsIDB4N2Y5NywKKyAgICAweDdmOTgsIDB4N2Y5OSwgMHg3ZjlhLCAweDdmOWIsIDB4N2Y5YywgMHg3ZjlkLCAweDdmOWUsIDB4N2Y5ZiwKKyAgICAweDdmYTAsIDB4N2ZhMSwgMHg3ZmEyLCAweDdmYTMsIDB4N2ZhNCwgMHg3ZmE1LCAweDdmYTYsIDB4N2ZhNywKKyAgICAweDdmYTgsIDB4N2ZhOSwgMHg3ZmFhLCAweDdmYWIsIDB4N2ZhYywgMHg3ZmFkLCAweDdmYWUsIDB4N2ZhZiwKKyAgICAweDdmYjAsIDB4N2ZiMSwgMHg3ZmIyLCAweDdmYjMsIDB4N2ZiNCwgMHg3ZmI1LCAweDdmYjYsIDB4N2ZiNywKKyAgICAweDdmYjgsIDB4N2ZiOSwgMHg3ZmJhLCAweDdmYmIsIDB4N2ZiYywgMHg3ZmJkLCAweDdmYmUsIDB4N2ZiZiwKKyAgICAweDdmYzAsIDB4N2ZjMSwgMHg3ZmMyLCAweDdmYzMsIDB4N2ZjNCwgMHg3ZmM1LCAweDdmYzYsIDB4N2ZjNywKKyAgICAweDdmYzgsIDB4N2ZjOSwgMHg3ZmNhLCAweDdmY2IsIDB4N2ZjYywgMHg3ZmNkLCAweDdmY2UsIDB4N2ZjZiwKKyAgICAweDdmZDAsIDB4N2ZkMSwgMHg3ZmQyLCAweDdmZDMsIDB4N2ZkNCwgMHg3ZmQ1LCAweDdmZDYsIDB4N2ZkNywKKyAgICAweDdmZDgsIDB4N2ZkOSwgMHg3ZmRhLCAweDdmZGIsIDB4N2ZkYywgMHg3ZmRkLCAweDdmZGUsIDB4N2ZkZiwKKyAgICAweDdmZTAsIDB4N2ZlMSwgMHg3ZmUyLCAweDdmZTMsIDB4N2ZlNCwgMHg3ZmU1LCAweDdmZTYsIDB4N2ZlNywKKyAgICAweDdmZTgsIDB4N2ZlOSwgMHg3ZmVhLCAweDdmZWIsIDB4N2ZlYywgMHg3ZmVkLCAweDdmZWUsIDB4N2ZlZiwKKyAgICAweDdmZjAsIDB4N2ZmMSwgMHg3ZmYyLCAweDdmZjMsIDB4N2ZmNCwgMHg3ZmY1LCAweDdmZjYsIDB4N2ZmNywKKyAgICAweDdmZjgsIDB4N2ZmOSwgMHg3ZmZhLCAweDdmZmIsIDB4N2ZmYywgMHg3ZmZkLCAweDdmZmUsIDB4N2ZmZiwKKyAgICAweDAwMDYsCit9OworCitjb25zdCB1aW50OF90IGZmX2R2X3ZsY19sZW5bTkJfRFZfVkxDXSA9IHsKKyAgICAgMiwgIDMsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsCisgICAgIDUsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LAorICAgICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LAorICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgNCwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfZHZfdmxjX3J1bltOQl9EVl9WTENdID0geworICAgICAwLCAgMCwgIDEsICAwLCAgMCwgIDIsICAxLCAgMCwKKyAgICAgMCwgIDMsICA0LCAgMCwgIDAsICA1LCAgNiwgIDIsCisgICAgIDEsICAxLCAgMCwgIDAsICAwLCAgNywgIDgsICA5LAorICAgIDEwLCAgMywgIDQsICAyLCAgMSwgIDEsICAxLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsIDExLCAxMiwgMTMsCisgICAgMTQsICA1LCAgNiwgIDMsICA0LCAgMiwgIDIsICAxLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDUsICAzLCAgMywKKyAgICAgMiwgIDEsICAxLCAgMSwgIDAsICAxLCAgNiwgIDQsCisgICAgIDMsICAxLCAgMSwgIDEsICAyLCAgMywgIDQsICA1LAorICAgICA3LCAgOCwgIDksIDEwLCAgNywgIDgsICA0LCAgMywKKyAgICAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsCisgICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LAorICAgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsCisgICAgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAorICAgIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwKKyAgICA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisgICAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LAorICAgIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgMTI3LAorfTsKKworY29uc3QgdWludDhfdCBmZl9kdl92bGNfbGV2ZWxbTkJfRFZfVkxDXSA9IHsKKyAgICAgMSwgICAyLCAgIDEsICAgMywgICA0LCAgIDEsICAgMiwgICA1LAorICAgICA2LCAgIDEsICAgMSwgICA3LCAgIDgsICAgMSwgICAxLCAgIDIsCisgICAgIDMsICAgNCwgICA5LCAgMTAsICAxMSwgICAxLCAgIDEsICAgMSwKKyAgICAgMSwgICAyLCAgIDIsICAgMywgICA1LCAgIDYsICAgNywgIDEyLAorICAgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAgMSwgICAxLCAgIDEsCisgICAgIDEsICAgMiwgICAyLCAgIDMsICAgMywgICA0LCAgIDUsICAgOCwKKyAgICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgIDMsICAgNCwgICA1LAorICAgICA2LCAgIDksICAxMCwgIDExLCAgIDAsICAgMCwgICAzLCAgIDQsCisgICAgIDYsICAxMiwgIDEzLCAgMTQsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgMiwgICAyLCAgIDIsICAgMiwgICAzLCAgIDMsICAgNSwgICA3LAorICAgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxNSwgIDE2LCAgMTcsCisgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsCisgICAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAgICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLAorICAgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgICAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwKKyAgICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorICAgIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsCisgICAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyAgICA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLAorICAgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgICAgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywKKyAgICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorICAgIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsCisgICAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKyAgIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LAorICAgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisgICAxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwKKyAgIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorICAgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsCisgICAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwKKyAgIDE2MCwgMTYxLCAxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LAorICAgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3MywgMTc0LCAxNzUsCisgICAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywKKyAgIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLAorICAgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksCisgICAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywKKyAgIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LAorICAgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsCisgICAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwKKyAgIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LAorICAgMjQwLCAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsCisgICAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwKKyAgICAgMCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kdmRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2ZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZWQwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kdmRhdGEuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19EVkRBVEFfSAorI2RlZmluZSBBVkNPREVDX0RWREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZHZfemlnemFnMjQ4X2RpcmVjdFs2NF07CisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2R2X3F1YW50X3NoaWZ0c1syMl1bNF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9kdl9xdWFudF9vZmZzZXRbNF07CisKKyNkZWZpbmUgTkJfRFZfVkxDIDQwOQorCitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfZHZfdmxjX2JpdHNbTkJfRFZfVkxDXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2R2X3ZsY19sZW5bTkJfRFZfVkxDXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2R2X3ZsY19ydW5bTkJfRFZfVkxDXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2R2X3ZsY19sZXZlbFtOQl9EVl9WTENdOworCisjZW5kaWYgLyogQVZDT0RFQ19EVkRBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHZkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmZTFmNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R2ZGVjLmMKQEAgLTAsMCArMSw1NDQgQEAKKy8qCisgKiBEViBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgUm9tYW4gU2hhcG9zaG5paworICoKKyAqIDUwIE1icHMgKERWQ1BSTzUwKSBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGFuaWVsIE1hYXMgPGRtYWFzQG1hYXNkaWdpdGFsLmNvbT4KKyAqCisgKiAxMDAgTWJwcyAoRFZDUFJPIEhEKSBzdXBwb3J0CisgKiBJbml0aWFsIGNvZGUgYnkgRGFuaWVsIE1hYXMgPGRtYWFzQG1hYXNkaWdpdGFsLmNvbT4gKGZ1bmRlZCBieSBCQkMgUiZEKQorICogRmluYWwgY29kZSBieSBSb21hbiBTaGFwb3NobmlrCisgKgorICogTWFueSB0aGFua3MgdG8gRGFuIERlbm5lZHkgPGRhbkBkZW5uZWR5Lm9yZz4gZm9yIHByb3ZpZGluZyB3ZWFsdGgKKyAqIG9mIERWIHRlY2huaWNhbCBpbmZvLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBEViBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZHYuaCIKKyNpbmNsdWRlICJkdl9wcm9maWxlX2ludGVybmFsLmgiCisjaW5jbHVkZSAiZHZkYXRhLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgInNpbXBsZV9pZGN0LmgiCisKK3R5cGVkZWYgc3RydWN0IEJsb2NrSW5mbyB7CisgICAgY29uc3QgdWludDMyX3QgKmZhY3Rvcl90YWJsZTsKKyAgICBjb25zdCB1aW50OF90ICpzY2FuX3RhYmxlOworICAgIHVpbnQ4X3QgcG9zOyAvKiBwb3NpdGlvbiBpbiBibG9jayAqLworICAgIHZvaWQgKCppZGN0X3B1dCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHVpbnQ4X3QgcGFydGlhbF9iaXRfY291bnQ7CisgICAgdWludDMyX3QgcGFydGlhbF9iaXRfYnVmZmVyOworICAgIGludCBzaGlmdF9vZmZzZXQ7Cit9IEJsb2NrSW5mbzsKKworc3RhdGljIGNvbnN0IGludCBkdl9pd2VpZ2h0X2JpdHMgPSAxNDsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGR2X2l3ZWlnaHRfODhbNjRdID0geworICAgIDMyNzY4LCAxNjcwNSwgMTY3MDUsIDE3NzM0LCAxNzAzMiwgMTc3MzQsIDE4MjA1LCAxODA4MSwKKyAgICAxODA4MSwgMTgyMDUsIDE4NzI1LCAxODU2MiwgMTkxOTUsIDE4NTYyLCAxODcyNSwgMTkyNjYsCisgICAgMTkwOTEsIDE5NzA1LCAxOTcwNSwgMTkwOTEsIDE5MjY2LCAyMTQwNywgMTk2NDMsIDIwMjY3LAorICAgIDIwMjI4LCAyMDI2NywgMTk2NDMsIDIxNDA3LCAyMjcyNSwgMjE4MjYsIDIwODUzLCAyMDgwNiwKKyAgICAyMDgwNiwgMjA4NTMsIDIxODI2LCAyMjcyNSwgMjMxNzAsIDIzMTcwLCAyMTQwNywgMjE0MDAsCisgICAgMjE0MDcsIDIzMTcwLCAyMzE3MCwgMjQ1OTgsIDIzNzg2LCAyMjAxOCwgMjIwMTgsIDIzNzg2LAorICAgIDI0NTk4LCAyNTI1MSwgMjQ0NjUsIDIyNjU0LCAyNDQ2NSwgMjUyNTEsIDI1OTcyLCAyNTE3MiwKKyAgICAyNTE3MiwgMjU5NzIsIDI2NzIyLCAyNzk2OSwgMjY3MjIsIDI5NjkyLCAyOTY5MiwgMzE1MjEsCit9Oworc3RhdGljIGNvbnN0IHVpbnQxNl90IGR2X2l3ZWlnaHRfMjQ4WzY0XSA9IHsKKyAgICAzMjc2OCwgMTYzODQsIDE2NzA1LCAxNjcwNSwgMTc3MzQsIDE3NzM0LCAxNzczNCwgMTc3MzQsCisgICAgMTgwODEsIDE4MDgxLCAxODcyNSwgMTg3MjUsIDIxNDA3LCAyMTQwNywgMTkwOTEsIDE5MDkxLAorICAgIDE5MTk1LCAxOTE5NSwgMTgyMDUsIDE4MjA1LCAxODcyNSwgMTg3MjUsIDE5NzA1LCAxOTcwNSwKKyAgICAyMDI2NywgMjAyNjcsIDIxODI2LCAyMTgyNiwgMjMxNzAsIDIzMTcwLCAyMDgwNiwgMjA4MDYsCisgICAgMjAyNjcsIDIwMjY3LCAxOTI2NiwgMTkyNjYsIDIxNDA3LCAyMTQwNywgMjA4NTMsIDIwODUzLAorICAgIDIxNDAwLCAyMTQwMCwgMjM3ODYsIDIzNzg2LCAyNDQ2NSwgMjQ0NjUsIDIyMDE4LCAyMjAxOCwKKyAgICAyMzE3MCwgMjMxNzAsIDIyNzI1LCAyMjcyNSwgMjQ1OTgsIDI0NTk4LCAyNDQ2NSwgMjQ0NjUsCisgICAgMjUxNzIsIDI1MTcyLCAyNzk2OSwgMjc5NjksIDI1OTcyLCAyNTk3MiwgMjk2OTIsIDI5NjkyCit9OworCisvKioKKyAqIFRoZSAiaW52ZXJzZSIgRFYxMDAgd2VpZ2h0cyBhcmUgYWN0dWFsbHkganVzdCB0aGUgc3BlYyB3ZWlnaHRzICh6aWctemFnZ2VkKS4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGR2X2l3ZWlnaHRfMTA4MF95WzY0XSA9IHsKKyAgICAxMjgsICAxNiwgIDE2LCAgMTcsICAxNywgIDE3LCAgMTgsICAxOCwKKyAgICAgMTgsICAxOCwgIDE4LCAgMTgsICAxOSwgIDE4LCAgMTgsICAxOSwKKyAgICAgMTksICAxOSwgIDE5LCAgMTksICAxOSwgIDQyLCAgMzgsICA0MCwKKyAgICAgNDAsICA0MCwgIDM4LCAgNDIsICA0NCwgIDQzLCAgNDEsICA0MSwKKyAgICAgNDEsICA0MSwgIDQzLCAgNDQsICA0NSwgIDQ1LCAgNDIsICA0MiwKKyAgICAgNDIsICA0NSwgIDQ1LCAgNDgsICA0NiwgIDQzLCAgNDMsICA0NiwKKyAgICAgNDgsICA0OSwgIDQ4LCAgNDQsICA0OCwgIDQ5LCAxMDEsICA5OCwKKyAgICAgOTgsIDEwMSwgMTA0LCAxMDksIDEwNCwgMTE2LCAxMTYsIDEyMywKK307CitzdGF0aWMgY29uc3QgdWludDE2X3QgZHZfaXdlaWdodF8xMDgwX2NbNjRdID0geworICAgIDEyOCwgIDE2LCAgMTYsICAxNywgIDE3LCAgMTcsICAyNSwgIDI1LAorICAgICAyNSwgIDI1LCAgMjYsICAyNSwgIDI2LCAgMjUsICAyNiwgIDI2LAorICAgICAyNiwgIDI3LCAgMjcsICAyNiwgIDI2LCAgNDIsICAzOCwgIDQwLAorICAgICA0MCwgIDQwLCAgMzgsICA0MiwgIDQ0LCAgNDMsICA0MSwgIDQxLAorICAgICA0MSwgIDQxLCAgNDMsICA0NCwgIDkxLCAgOTEsICA4NCwgIDg0LAorICAgICA4NCwgIDkxLCAgOTEsICA5NiwgIDkzLCAgODYsICA4NiwgIDkzLAorICAgICA5NiwgMTk3LCAxOTEsIDE3NywgMTkxLCAxOTcsIDIwMywgMTk3LAorICAgIDE5NywgMjAzLCAyMDksIDIxOSwgMjA5LCAyMzIsIDIzMiwgMjQ2LAorfTsKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBkdl9pd2VpZ2h0XzcyMF95WzY0XSA9IHsKKyAgICAxMjgsICAxNiwgIDE2LCAgMTcsICAxNywgIDE3LCAgMTgsICAxOCwKKyAgICAgMTgsICAxOCwgIDE4LCAgMTgsICAxOSwgIDE4LCAgMTgsICAxOSwKKyAgICAgMTksICAxOSwgIDE5LCAgMTksICAxOSwgIDQyLCAgMzgsICA0MCwKKyAgICAgNDAsICA0MCwgIDM4LCAgNDIsICA0NCwgIDQzLCAgNDEsICA0MSwKKyAgICAgNDEsICA0MSwgIDQzLCAgNDQsICA2OCwgIDY4LCAgNjMsICA2MywKKyAgICAgNjMsICA2OCwgIDY4LCAgOTYsICA5MiwgIDg2LCAgODYsICA5MiwKKyAgICAgOTYsICA5OCwgIDk2LCAgODgsICA5NiwgIDk4LCAyMDIsIDE5NiwKKyAgICAxOTYsIDIwMiwgMjA4LCAyMTgsIDIwOCwgMjMyLCAyMzIsIDI0NiwKK307Citjb25zdCB1aW50MTZfdCBkdl9pd2VpZ2h0XzcyMF9jWzY0XSA9IHsKKyAgICAxMjgsICAyNCwgIDI0LCAgMjYsICAyNiwgIDI2LCAgMzYsICAzNiwKKyAgICAgMzYsICAzNiwgIDM2LCAgMzYsICAzOCwgIDM2LCAgMzYsICAzOCwKKyAgICAgMzgsICAzOCwgIDM4LCAgMzgsICAzOCwgIDg0LCAgNzYsICA4MCwKKyAgICAgODAsICA4MCwgIDc2LCAgODQsICA4OCwgIDg2LCAgODIsICA4MiwKKyAgICAgODIsICA4MiwgIDg2LCAgODgsIDE4MiwgMTgyLCAxNjgsIDE2OCwKKyAgICAxNjgsIDE4MiwgMTgyLCAxOTIsIDE4NiwgMTkyLCAxNzIsIDE4NiwKKyAgICAxOTIsIDM5NCwgMzgyLCAzNTQsIDM4MiwgMzk0LCA0MDYsIDM5NCwKKyAgICAzOTQsIDQwNiwgNDE4LCA0MzgsIDQxOCwgNDY0LCA0NjQsIDQ5MiwKK307CisKK3N0YXRpYyB2b2lkIGR2X2luaXRfd2VpZ2h0X3RhYmxlcyhEVlZpZGVvQ29udGV4dCAqY3R4LCBjb25zdCBBVkRWUHJvZmlsZSAqZCkKK3sKKyAgICBpbnQgaiwgaSwgYywgczsKKyAgICB1aW50MzJfdCAqZmFjdG9yMSA9ICZjdHgtPmlkY3RfZmFjdG9yWzBdLAorICAgICAgICAgICAgICpmYWN0b3IyID0gJmN0eC0+aWRjdF9mYWN0b3JbRFZfUFJPRklMRV9JU19IRChkKSA/IDQwOTYgOiAyODE2XTsKKworICAgIGlmIChEVl9QUk9GSUxFX0lTX0hEKGQpKSB7CisgICAgICAgIC8qIHF1YW50aXphdGlvbiBxdWFudGEgYnkgUU5PIGZvciBEVjEwMCAqLworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkdjEwMF9xc3RlcFsxNl0gPSB7CisgICAgICAgICAgICAxLCAvKiBRTk8gPSAwIGFuZCAxIGJvdGggaGF2ZSBubyBxdWFudGl6YXRpb24gKi8KKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAyLCAzLCA0LCA1LCA2LCA3LCA4LCAxNiwgMTgsIDIwLCAyMiwgMjQsIDI4LCA1MgorICAgICAgICB9OworICAgICAgICBjb25zdCB1aW50MTZfdCAqaXdlaWdodDEsICppd2VpZ2h0MjsKKworICAgICAgICBpZiAoZC0+aGVpZ2h0ID09IDcyMCkgeworICAgICAgICAgICAgaXdlaWdodDEgPSAmZHZfaXdlaWdodF83MjBfeVswXTsKKyAgICAgICAgICAgIGl3ZWlnaHQyID0gJmR2X2l3ZWlnaHRfNzIwX2NbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpd2VpZ2h0MSA9ICZkdl9pd2VpZ2h0XzEwODBfeVswXTsKKyAgICAgICAgICAgIGl3ZWlnaHQyID0gJmR2X2l3ZWlnaHRfMTA4MF9jWzBdOworICAgICAgICB9CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspIHsKKyAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCAxNjsgcysrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgKmZhY3RvcjErKyA9IChkdjEwMF9xc3RlcFtzXSA8PCAoYyArIDkpKSAqIGl3ZWlnaHQxW2ldOworICAgICAgICAgICAgICAgICAgICAqZmFjdG9yMisrID0gKGR2MTAwX3FzdGVwW3NdIDw8IChjICsgOSkpICogaXdlaWdodDJbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZHZfcXVhbnRfYXJlYXNbNF0gPSB7IDYsIDIxLCA0MywgNjQgfTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKml3ZWlnaHQxID0gJmR2X2l3ZWlnaHRfODhbMF07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyssIGl3ZWlnaHQxID0gJmR2X2l3ZWlnaHRfMjQ4WzBdKSB7CisgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgMjI7IHMrKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IGMgPSAwOyBjIDwgNDsgYysrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgZHZfcXVhbnRfYXJlYXNbY107IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmZhY3RvcjEgICA9IGl3ZWlnaHQxW2ldIDw8IChmZl9kdl9xdWFudF9zaGlmdHNbc11bY10gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmYWN0b3IyKysgPSAoKmZhY3RvcjErKykgPDwgMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGR2dmlkZW9fZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIERWVmlkZW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBJRENURFNQQ29udGV4dCBpZHNwOworICAgIGludCBpOworCisgICAgbWVtc2V0KCZpZHNwLDAsIHNpemVvZihpZHNwKSk7CisgICAgZmZfaWRjdGRzcF9pbml0KCZpZHNwLCBhdmN0eCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgcy0+ZHZfemlnemFnWzBdW2ldID0gaWRzcC5pZGN0X3Blcm11dGF0aW9uW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworCisgICAgaWYgKGF2Y3R4LT5sb3dyZXMpeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKyl7CisgICAgICAgICAgICBpbnQgaiA9IGZmX2R2X3ppZ3phZzI0OF9kaXJlY3RbaV07CisgICAgICAgICAgICBzLT5kdl96aWd6YWdbMV1baV0gPSBpZHNwLmlkY3RfcGVybXV0YXRpb25bKGogJiA3KSArIChqICYgOCkgKiA0ICsgKGogJiA0OCkgLyAyXTsKKyAgICAgICAgfQorICAgIH1lbHNlCisgICAgICAgIG1lbWNweShzLT5kdl96aWd6YWdbMV0sIGZmX2R2X3ppZ3phZzI0OF9kaXJlY3QsIHNpemVvZihzLT5kdl96aWd6YWdbMV0pKTsKKworICAgIHMtPmlkY3RfcHV0WzBdID0gaWRzcC5pZGN0X3B1dDsKKyAgICBzLT5pZGN0X3B1dFsxXSA9IGZmX3NpbXBsZV9pZGN0MjQ4X3B1dDsKKworICAgIHJldHVybiBmZl9kdnZpZGVvX2luaXQoYXZjdHgpOworfQorCisvKiBkZWNvZGUgQUMgY29lZmZpY2llbnRzICovCitzdGF0aWMgdm9pZCBkdl9kZWNvZGVfYWMoR2V0Qml0Q29udGV4dCAqZ2IsIEJsb2NrSW5mbyAqbWIsIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBsYXN0X2luZGV4ID0gZ2ItPnNpemVfaW5fYml0czsKKyAgICBjb25zdCB1aW50OF90ICAqc2Nhbl90YWJsZSAgID0gbWItPnNjYW5fdGFibGU7CisgICAgY29uc3QgdWludDMyX3QgKmZhY3Rvcl90YWJsZSA9IG1iLT5mYWN0b3JfdGFibGU7CisgICAgaW50IHBvcyAgICAgICAgICAgICAgICAgICAgICA9IG1iLT5wb3M7CisgICAgaW50IHBhcnRpYWxfYml0X2NvdW50ICAgICAgICA9IG1iLT5wYXJ0aWFsX2JpdF9jb3VudDsKKyAgICBpbnQgbGV2ZWwsIHJ1biwgdmxjX2xlbiwgaW5kZXg7CisKKyAgICBPUEVOX1JFQURFUl9OT1NJWkUocmUsIGdiKTsKKyAgICBVUERBVEVfQ0FDSEUocmUsIGdiKTsKKworICAgIC8qIGlmIHdlIG11c3QgcGFyc2UgYSBwYXJ0aWFsIFZMQywgd2UgZG8gaXQgaGVyZSAqLworICAgIGlmIChwYXJ0aWFsX2JpdF9jb3VudCA+IDApIHsKKyAgICAgICAgcmVfY2FjaGUgICAgICAgICAgICAgID0gcmVfY2FjaGUgPj4gcGFydGlhbF9iaXRfY291bnQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYi0+cGFydGlhbF9iaXRfYnVmZmVyOworICAgICAgICByZV9pbmRleCAgICAgICAgICAgICAtPSBwYXJ0aWFsX2JpdF9jb3VudDsKKyAgICAgICAgbWItPnBhcnRpYWxfYml0X2NvdW50ID0gMDsKKyAgICB9CisKKyAgICAvKiBnZXQgdGhlIEFDIGNvZWZmaWNpZW50cyB1bnRpbCBsYXN0X2luZGV4IGlzIHJlYWNoZWQgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGF2X2Rsb2coTlVMTCwgIiUyZDogYml0cz0lMDR4IGluZGV4PSVkXG4iLCBwb3MsIFNIT1dfVUJJVFMocmUsIGdiLCAxNiksCisgICAgICAgICAgICAgICAgcmVfaW5kZXgpOworICAgICAgICAvKiBvdXIgb3duIG9wdGltaXplZCBHRVRfUkxfVkxDICovCisgICAgICAgIGluZGV4ICAgPSBORUdfVVNSMzIocmVfY2FjaGUsIFRFWF9WTENfQklUUyk7CisgICAgICAgIHZsY19sZW4gPSBmZl9kdl9ybF92bGNbaW5kZXhdLmxlbjsKKyAgICAgICAgaWYgKHZsY19sZW4gPCAwKSB7CisgICAgICAgICAgICBpbmRleCA9IE5FR19VU1IzMigodW5zaWduZWQpIHJlX2NhY2hlIDw8IFRFWF9WTENfQklUUywgLXZsY19sZW4pICsKKyAgICAgICAgICAgICAgICAgICAgZmZfZHZfcmxfdmxjW2luZGV4XS5sZXZlbDsKKyAgICAgICAgICAgIHZsY19sZW4gPSBURVhfVkxDX0JJVFMgLSB2bGNfbGVuOworICAgICAgICB9CisgICAgICAgIGxldmVsID0gZmZfZHZfcmxfdmxjW2luZGV4XS5sZXZlbDsKKyAgICAgICAgcnVuICAgPSBmZl9kdl9ybF92bGNbaW5kZXhdLnJ1bjsKKworICAgICAgICAvKiBnb3R0YSBjaGVjayBpZiB3ZSdyZSBzdGlsbCB3aXRoaW4gZ2IgYm91bmRhcmllcyAqLworICAgICAgICBpZiAocmVfaW5kZXggKyB2bGNfbGVuID4gbGFzdF9pbmRleCkgeworICAgICAgICAgICAgLyogc2hvdWxkIGJlIDwgMTYgYml0cyBvdGhlcndpc2UgYSBjb2Rld29yZCBjb3VsZCBoYXZlIGJlZW4gcGFyc2VkICovCisgICAgICAgICAgICBtYi0+cGFydGlhbF9iaXRfY291bnQgID0gbGFzdF9pbmRleCAtIHJlX2luZGV4OworICAgICAgICAgICAgbWItPnBhcnRpYWxfYml0X2J1ZmZlciA9IHJlX2NhY2hlICYgfigtMXUgPj4gbWItPnBhcnRpYWxfYml0X2NvdW50KTsKKyAgICAgICAgICAgIHJlX2luZGV4ICAgICAgICAgICAgICAgPSBsYXN0X2luZGV4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmVfaW5kZXggKz0gdmxjX2xlbjsKKworICAgICAgICBhdl9kbG9nKE5VTEwsICJydW49JWQgbGV2ZWw9JWRcbiIsIHJ1biwgbGV2ZWwpOworICAgICAgICBwb3MgKz0gcnVuOworICAgICAgICBpZiAocG9zID49IDY0KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbGV2ZWwgPSAobGV2ZWwgKiBmYWN0b3JfdGFibGVbcG9zXSArICgxIDw8IChkdl9pd2VpZ2h0X2JpdHMgLSAxKSkpID4+CisgICAgICAgICAgICAgICAgZHZfaXdlaWdodF9iaXRzOworICAgICAgICBibG9ja1tzY2FuX3RhYmxlW3Bvc11dID0gbGV2ZWw7CisKKyAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisgICAgfQorICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOworICAgIG1iLT5wb3MgPSBwb3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiaXRfY29weShQdXRCaXRDb250ZXh0ICpwYiwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IGJpdHNfbGVmdCA9IGdldF9iaXRzX2xlZnQoZ2IpOworICAgIHdoaWxlIChiaXRzX2xlZnQgPj0gTUlOX0NBQ0hFX0JJVFMpIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIE1JTl9DQUNIRV9CSVRTLCBnZXRfYml0cyhnYiwgTUlOX0NBQ0hFX0JJVFMpKTsKKyAgICAgICAgYml0c19sZWZ0IC09IE1JTl9DQUNIRV9CSVRTOworICAgIH0KKyAgICBpZiAoYml0c19sZWZ0ID4gMCkKKyAgICAgICAgcHV0X2JpdHMocGIsIGJpdHNfbGVmdCwgZ2V0X2JpdHMoZ2IsIGJpdHNfbGVmdCkpOworfQorCisvKiBtYl94IGFuZCBtYl95IGFyZSBpbiB1bml0cyBvZiA4IHBpeGVscyAqLworc3RhdGljIGludCBkdl9kZWNvZGVfdmlkZW9fc2VnbWVudChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmFyZykKK3sKKyAgICBEVlZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgRFZ3b3JrX2NodW5rICp3b3JrX2NodW5rID0gYXJnOworICAgIGludCBxdWFudCwgZGMsIGRjdF9tb2RlLCBjbGFzczEsIGo7CisgICAgaW50IG1iX2luZGV4LCBtYl94LCBtYl95LCBsYXN0X2luZGV4OworICAgIGludCB5X3N0cmlkZSwgbGluZXNpemU7CisgICAgaW50MTZfdCAqYmxvY2ssICpibG9jazE7CisgICAgaW50IGNfb2Zmc2V0OworICAgIHVpbnQ4X3QgKnlfcHRyOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9wdHI7CisgICAgUHV0Qml0Q29udGV4dCBwYiwgdnNfcGI7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBCbG9ja0luZm8gbWJfZGF0YVs1ICogRFZfTUFYX0JQTV0sICptYiwgKm1iMTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIHNibG9jaywgWzUgKiBEVl9NQVhfQlBNXSwgWzY0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCBtYl9iaXRfYnVmZmVyLCBbODAgICAgICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV0pOyAvKiBhbGxvdyBzb21lIHNsYWNrICovCisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCB2c19iaXRfYnVmZmVyLCBbODAgKiA1ICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV0pOyAvKiBhbGxvdyBzb21lIHNsYWNrICovCisgICAgY29uc3QgaW50IGxvZzJfYmxvY2tzaXplID0gMy1zLT5hdmN0eC0+bG93cmVzOworICAgIGludCBpc19maWVsZF9tb2RlWzVdOworCisgICAgYXZfYXNzZXJ0MSgoKChpbnQpIG1iX2JpdF9idWZmZXIpICYgNykgPT0gMCk7CisgICAgYXZfYXNzZXJ0MSgoKChpbnQpIHZzX2JpdF9idWZmZXIpICYgNykgPT0gMCk7CisKKyAgICBtZW1zZXQoc2Jsb2NrLCAwLCA1ICogRFZfTUFYX0JQTSAqIHNpemVvZigqc2Jsb2NrKSk7CisKKyAgICAvKiBwYXNzIDE6IHJlYWQgREMgYW5kIEFDIGNvZWZmaWNpZW50cyBpbiBibG9ja3MgKi8KKyAgICBidWZfcHRyID0gJnMtPmJ1Zlt3b3JrX2NodW5rLT5idWZfb2Zmc2V0ICogODBdOworICAgIGJsb2NrMSAgPSAmc2Jsb2NrWzBdWzBdOworICAgIG1iMSAgICAgPSBtYl9kYXRhOworICAgIGluaXRfcHV0X2JpdHMoJnZzX3BiLCB2c19iaXRfYnVmZmVyLCA1ICogODApOworICAgIGZvciAobWJfaW5kZXggPSAwOyBtYl9pbmRleCA8IDU7IG1iX2luZGV4KyssIG1iMSArPSBzLT5zeXMtPmJwbSwgYmxvY2sxICs9IHMtPnN5cy0+YnBtICogNjQpIHsKKyAgICAgICAgLyogc2tpcCBoZWFkZXIgKi8KKyAgICAgICAgcXVhbnQgICAgPSBidWZfcHRyWzNdICYgMHgwZjsKKyAgICAgICAgYnVmX3B0ciArPSA0OworICAgICAgICBpbml0X3B1dF9iaXRzKCZwYiwgbWJfYml0X2J1ZmZlciwgODApOworICAgICAgICBtYiAgICA9IG1iMTsKKyAgICAgICAgYmxvY2sgPSBibG9jazE7CisgICAgICAgIGlzX2ZpZWxkX21vZGVbbWJfaW5kZXhdID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnN5cy0+YnBtOyBqKyspIHsKKyAgICAgICAgICAgIGxhc3RfaW5kZXggPSBzLT5zeXMtPmJsb2NrX3NpemVzW2pdOworICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1Zl9wdHIsIGxhc3RfaW5kZXgpOworCisgICAgICAgICAgICAvKiBnZXQgdGhlIERDICovCisgICAgICAgICAgICBkYyAgICAgICA9IGdldF9zYml0cygmZ2IsIDkpOworICAgICAgICAgICAgZGN0X21vZGUgPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgICAgIGNsYXNzMSAgID0gZ2V0X2JpdHMoJmdiLCAyKTsKKyAgICAgICAgICAgIGlmIChEVl9QUk9GSUxFX0lTX0hEKHMtPnN5cykpIHsKKyAgICAgICAgICAgICAgICBtYi0+aWRjdF9wdXQgICAgID0gcy0+aWRjdF9wdXRbMF07CisgICAgICAgICAgICAgICAgbWItPnNjYW5fdGFibGUgICA9IHMtPmR2X3ppZ3phZ1swXTsKKyAgICAgICAgICAgICAgICBtYi0+ZmFjdG9yX3RhYmxlID0gJnMtPmlkY3RfZmFjdG9yWyhqID49IDQpICogNCAqIDE2ICogNjQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MxICAgICAgICogMTYgKiA2NCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudCAgICAgICAgICAgICAqIDY0XTsKKyAgICAgICAgICAgICAgICBpc19maWVsZF9tb2RlW21iX2luZGV4XSB8PSAhaiAmJiBkY3RfbW9kZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWItPmlkY3RfcHV0ICAgICA9IHMtPmlkY3RfcHV0W2RjdF9tb2RlICYmIGxvZzJfYmxvY2tzaXplID09IDNdOworICAgICAgICAgICAgICAgIG1iLT5zY2FuX3RhYmxlICAgPSBzLT5kdl96aWd6YWdbZGN0X21vZGVdOworICAgICAgICAgICAgICAgIG1iLT5mYWN0b3JfdGFibGUgPQorICAgICAgICAgICAgICAgICAgICAmcy0+aWRjdF9mYWN0b3JbKGNsYXNzMSA9PSAzKSAgICAgICAgICAgICAgICogMiAqIDIyICogNjQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGN0X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAqIDIyICogNjQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHF1YW50ICsgZmZfZHZfcXVhbnRfb2Zmc2V0W2NsYXNzMV0pICogNjRdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGMgPSBkYyA8PCAyOworICAgICAgICAgICAgLyogY29udmVydCB0byB1bnNpZ25lZCBiZWNhdXNlIDEyOCBpcyBub3QgYWRkZWQgaW4gdGhlCisgICAgICAgICAgICAgKiBzdGFuZGFyZCBJRENUICovCisgICAgICAgICAgICBkYyAgICAgICAgICAgICAgICAgICArPSAxMDI0OworICAgICAgICAgICAgYmxvY2tbMF0gICAgICAgICAgICAgID0gZGM7CisgICAgICAgICAgICBidWZfcHRyICAgICAgICAgICAgICArPSBsYXN0X2luZGV4ID4+IDM7CisgICAgICAgICAgICBtYi0+cG9zICAgICAgICAgICAgICAgPSAwOworICAgICAgICAgICAgbWItPnBhcnRpYWxfYml0X2NvdW50ID0gMDsKKworICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgIk1CIGJsb2NrOiAlZCwgJWQgIiwgbWJfaW5kZXgsIGopOworICAgICAgICAgICAgZHZfZGVjb2RlX2FjKCZnYiwgbWIsIGJsb2NrKTsKKworICAgICAgICAgICAgLyogd3JpdGUgdGhlIHJlbWFpbmluZyBiaXRzIGluIGEgbmV3IGJ1ZmZlciBvbmx5IGlmIHRoZQorICAgICAgICAgICAgICogYmxvY2sgaXMgZmluaXNoZWQgKi8KKyAgICAgICAgICAgIGlmIChtYi0+cG9zID49IDY0KQorICAgICAgICAgICAgICAgIGJpdF9jb3B5KCZwYiwgJmdiKTsKKworICAgICAgICAgICAgYmxvY2sgKz0gNjQ7CisgICAgICAgICAgICBtYisrOworICAgICAgICB9CisKKyAgICAgICAgLyogcGFzcyAyOiB3ZSBjYW4gZG8gaXQganVzdCBhZnRlciAqLworICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiKioqcGFzcyAyIHNpemU9JWQgTUIjPSVkXG4iLCBwdXRfYml0c19jb3VudCgmcGIpLCBtYl9pbmRleCk7CisgICAgICAgIGJsb2NrID0gYmxvY2sxOworICAgICAgICBtYiAgICA9IG1iMTsKKyAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIG1iX2JpdF9idWZmZXIsIHB1dF9iaXRzX2NvdW50KCZwYikpOworICAgICAgICBwdXRfYml0czMyKCZwYiwgMCk7IC8vIHBhZGRpbmcgbXVzdCBiZSB6ZXJvZWQKKyAgICAgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnN5cy0+YnBtOyBqKyssIGJsb2NrICs9IDY0LCBtYisrKSB7CisgICAgICAgICAgICBpZiAobWItPnBvcyA8IDY0ICYmIGdldF9iaXRzX2xlZnQoJmdiKSA+IDApIHsKKyAgICAgICAgICAgICAgICBkdl9kZWNvZGVfYWMoJmdiLCBtYiwgYmxvY2spOworICAgICAgICAgICAgICAgIC8qIGlmIHN0aWxsIG5vdCBmaW5pc2hlZCwgbm8gbmVlZCB0byBwYXJzZSBvdGhlciBibG9ja3MgKi8KKyAgICAgICAgICAgICAgICBpZiAobWItPnBvcyA8IDY0KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBhbGwgYmxvY2tzIGFyZSBmaW5pc2hlZCwgc28gdGhlIGV4dHJhIGJ5dGVzIGNhbiBiZSB1c2VkIGF0CisgICAgICAgICAqIHRoZSB2aWRlbyBzZWdtZW50IGxldmVsICovCisgICAgICAgIGlmIChqID49IHMtPnN5cy0+YnBtKQorICAgICAgICAgICAgYml0X2NvcHkoJnZzX3BiLCAmZ2IpOworICAgIH0KKworICAgIC8qIHdlIG5lZWQgYSBwYXNzIG92ZXIgdGhlIHdob2xlIHZpZGVvIHNlZ21lbnQgKi8KKyAgICBhdl9kbG9nKGF2Y3R4LCAiKioqcGFzcyAzIHNpemU9JWRcbiIsIHB1dF9iaXRzX2NvdW50KCZ2c19wYikpOworICAgIGJsb2NrID0gJnNibG9ja1swXVswXTsKKyAgICBtYiAgICA9IG1iX2RhdGE7CisgICAgaW5pdF9nZXRfYml0cygmZ2IsIHZzX2JpdF9idWZmZXIsIHB1dF9iaXRzX2NvdW50KCZ2c19wYikpOworICAgIHB1dF9iaXRzMzIoJnZzX3BiLCAwKTsgLy8gcGFkZGluZyBtdXN0IGJlIHplcm9lZAorICAgIGZsdXNoX3B1dF9iaXRzKCZ2c19wYik7CisgICAgZm9yIChtYl9pbmRleCA9IDA7IG1iX2luZGV4IDwgNTsgbWJfaW5kZXgrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+c3lzLT5icG07IGorKykgeworICAgICAgICAgICAgaWYgKG1iLT5wb3MgPCA2NCAmJiBnZXRfYml0c19sZWZ0KCZnYikgPiAwKSB7CisgICAgICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgInN0YXJ0ICVkOiVkXG4iLCBtYl9pbmRleCwgaik7CisgICAgICAgICAgICAgICAgZHZfZGVjb2RlX2FjKCZnYiwgbWIsIGJsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYi0+cG9zID49IDY0ICYmIG1iLT5wb3MgPCAxMjcpCisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJBQyBFT0IgbWFya2VyIGlzIGFic2VudCBwb3M9JWRcbiIsIG1iLT5wb3MpOworICAgICAgICAgICAgYmxvY2sgKz0gNjQ7CisgICAgICAgICAgICBtYisrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29tcHV0ZSBpZGN0IGFuZCBwbGFjZSBibG9ja3MgKi8KKyAgICBibG9jayA9ICZzYmxvY2tbMF1bMF07CisgICAgbWIgICAgPSBtYl9kYXRhOworICAgIGZvciAobWJfaW5kZXggPSAwOyBtYl9pbmRleCA8IDU7IG1iX2luZGV4KyspIHsKKyAgICAgICAgZHZfY2FsY3VsYXRlX21iX3h5KHMsIHdvcmtfY2h1bmssIG1iX2luZGV4LCAmbWJfeCwgJm1iX3kpOworCisgICAgICAgIC8qIGlkY3RfcHV0J3RpbmcgbHVtaW5hbmNlICovCisgICAgICAgIGlmICgocy0+c3lzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIChzLT5zeXMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MTFQICYmIG1iX3ggPj0gKDcwNCAvIDgpKSB8fAorICAgICAgICAgICAgKHMtPnN5cy0+aGVpZ2h0ID49IDcyMCAmJiBtYl95ICE9IDEzNCkpIHsKKyAgICAgICAgICAgIHlfc3RyaWRlID0gKHMtPmZyYW1lLT5saW5lc2l6ZVswXSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgKCghaXNfZmllbGRfbW9kZVttYl9pbmRleF0pICogbG9nMl9ibG9ja3NpemUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHlfc3RyaWRlID0gKDIgPDwgbG9nMl9ibG9ja3NpemUpOworICAgICAgICB9CisgICAgICAgIHlfcHRyICAgID0gcy0+ZnJhbWUtPmRhdGFbMF0gKworICAgICAgICAgICAgICAgICAgICgobWJfeSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXSArIG1iX3gpIDw8IGxvZzJfYmxvY2tzaXplKTsKKyAgICAgICAgbGluZXNpemUgPSBzLT5mcmFtZS0+bGluZXNpemVbMF0gPDwgaXNfZmllbGRfbW9kZVttYl9pbmRleF07CisgICAgICAgIG1iWzBdLmlkY3RfcHV0KHlfcHRyLCBsaW5lc2l6ZSwgYmxvY2sgKyAwICogNjQpOworICAgICAgICBpZiAocy0+c3lzLT52aWRlb19zdHlwZSA9PSA0KSB7IC8qIFNEIDQyMiAqLworICAgICAgICAgICAgbWJbMl0uaWRjdF9wdXQoeV9wdHIgKyAoMSA8PCBsb2cyX2Jsb2Nrc2l6ZSksICAgICAgICAgICAgbGluZXNpemUsIGJsb2NrICsgMiAqIDY0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1iWzFdLmlkY3RfcHV0KHlfcHRyICsgKDEgPDwgbG9nMl9ibG9ja3NpemUpLCAgICAgICAgICAgIGxpbmVzaXplLCBibG9jayArIDEgKiA2NCk7CisgICAgICAgICAgICBtYlsyXS5pZGN0X3B1dCh5X3B0ciAgICAgICAgICAgICAgICAgICAgICAgICArIHlfc3RyaWRlLCBsaW5lc2l6ZSwgYmxvY2sgKyAyICogNjQpOworICAgICAgICAgICAgbWJbM10uaWRjdF9wdXQoeV9wdHIgKyAoMSA8PCBsb2cyX2Jsb2Nrc2l6ZSkgKyB5X3N0cmlkZSwgbGluZXNpemUsIGJsb2NrICsgMyAqIDY0KTsKKyAgICAgICAgfQorICAgICAgICBtYiAgICArPSA0OworICAgICAgICBibG9jayArPSA0ICogNjQ7CisKKyAgICAgICAgLyogaWRjdF9wdXQndGluZyBjaHJvbWluYW5jZSAqLworICAgICAgICBjX29mZnNldCA9ICgoKG1iX3kgPj4gIChzLT5zeXMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKSkgKiBzLT5mcmFtZS0+bGluZXNpemVbMV0gKworICAgICAgICAgICAgICAgICAgICAgKG1iX3ggPj4gKChzLT5zeXMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MTFQKSA/IDIgOiAxKSkpIDw8IGxvZzJfYmxvY2tzaXplKTsKKyAgICAgICAgZm9yIChqID0gMjsgajsgai0tKSB7CisgICAgICAgICAgICB1aW50OF90ICpjX3B0ciA9IHMtPmZyYW1lLT5kYXRhW2pdICsgY19vZmZzZXQ7CisgICAgICAgICAgICBpZiAocy0+c3lzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDExUCAmJiBtYl94ID49ICg3MDQgLyA4KSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGFsaWduZWRfcGl4ZWxzWzY0IC8gOF07CisgICAgICAgICAgICAgICAgdWludDhfdCAqcGl4ZWxzID0gKHVpbnQ4X3QgKikgYWxpZ25lZF9waXhlbHM7CisgICAgICAgICAgICAgICAgdWludDhfdCAqY19wdHIxLCAqcHRyMTsKKyAgICAgICAgICAgICAgICBpbnQgeCwgeTsKKyAgICAgICAgICAgICAgICBtYi0+aWRjdF9wdXQocGl4ZWxzLCA4LCBibG9jayk7CisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8ICgxIDw8IGxvZzJfYmxvY2tzaXplKTsgeSsrLCBjX3B0ciArPSBzLT5mcmFtZS0+bGluZXNpemVbal0sIHBpeGVscyArPSA4KSB7CisgICAgICAgICAgICAgICAgICAgIHB0cjEgICA9IHBpeGVscyArICgoMSA8PCAobG9nMl9ibG9ja3NpemUpKT4+MSk7CisgICAgICAgICAgICAgICAgICAgIGNfcHRyMSA9IGNfcHRyICsgKHMtPmZyYW1lLT5saW5lc2l6ZVtqXSA8PCBsb2cyX2Jsb2Nrc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAoMSA8PCBGRk1BWChsb2cyX2Jsb2Nrc2l6ZSAtIDEsIDApKTsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjX3B0clt4XSAgPSBwaXhlbHNbeF07CisgICAgICAgICAgICAgICAgICAgICAgICBjX3B0cjFbeF0gPSBwdHIxW3hdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJsb2NrICs9IDY0OworICAgICAgICAgICAgICAgIG1iKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHlfc3RyaWRlID0gKG1iX3kgPT0gMTM0KSA/ICgxIDw8IGxvZzJfYmxvY2tzaXplKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZS0+bGluZXNpemVbal0gPDwgKCghaXNfZmllbGRfbW9kZVttYl9pbmRleF0pICogbG9nMl9ibG9ja3NpemUpOworICAgICAgICAgICAgICAgIGxpbmVzaXplID0gcy0+ZnJhbWUtPmxpbmVzaXplW2pdIDw8IGlzX2ZpZWxkX21vZGVbbWJfaW5kZXhdOworICAgICAgICAgICAgICAgIChtYisrKS0+aWRjdF9wdXQoY19wdHIsIGxpbmVzaXplLCBibG9jayk7CisgICAgICAgICAgICAgICAgYmxvY2sgKz0gNjQ7CisgICAgICAgICAgICAgICAgaWYgKHMtPnN5cy0+YnBtID09IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgKG1iKyspLT5pZGN0X3B1dChjX3B0ciArIHlfc3RyaWRlLCBsaW5lc2l6ZSwgYmxvY2spOworICAgICAgICAgICAgICAgICAgICBibG9jayArPSA2NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIE5PVEU6IGV4YWN0bHkgb25lIGZyYW1lIG11c3QgYmUgZ2l2ZW4gKDEyMDAwMCBieXRlcyBmb3IgTlRTQywKKyAqIDE0NDAwMCBieXRlcyBmb3IgUEFMIC0gb3IgdHdpY2UgdGhvc2UgZm9yIDUwTWJwcykgKi8KK3N0YXRpYyBpbnQgZHZ2aWRlb19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIERWVmlkZW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICp2c2NfcGFjazsKKyAgICBpbnQgYXB0LCBpczE2XzksIHJldDsKKyAgICBjb25zdCBBVkRWUHJvZmlsZSAqc3lzOworCisgICAgc3lzID0gZmZfZHZfZnJhbWVfcHJvZmlsZShhdmN0eCwgcy0+c3lzLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBpZiAoIXN5cyB8fCBidWZfc2l6ZSA8IHN5cy0+ZnJhbWVfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCBmaW5kIGR2IGZyYW1lIHByb2ZpbGVcbiIpOworICAgICAgICByZXR1cm4gLTE7IC8qIE5PVEU6IHdlIG9ubHkgYWNjZXB0IHNldmVyYWwgZnVsbCBmcmFtZXMgKi8KKyAgICB9CisKKyAgICBpZiAoc3lzICE9IHMtPnN5cykgeworICAgICAgICByZXQgPSBmZl9kdl9pbml0X2R5bmFtaWNfdGFibGVzKHMsIHN5cyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyB0aGUgd29yayB0YWJsZXMuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgZHZfaW5pdF93ZWlnaHRfdGFibGVzKHMsIHN5cyk7CisgICAgICAgIHMtPnN5cyA9IHN5czsKKyAgICB9CisKKyAgICBzLT5mcmFtZSAgICAgICAgICAgID0gZGF0YTsKKyAgICBzLT5mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICBzLT5mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgYXZjdHgtPnBpeF9mbXQgICAgICA9IHMtPnN5cy0+cGl4X2ZtdDsKKyAgICBhdmN0eC0+ZnJhbWVyYXRlICAgID0gYXZfaW52X3Eocy0+c3lzLT50aW1lX2Jhc2UpOworCisgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHMtPnN5cy0+d2lkdGgsIHMtPnN5cy0+aGVpZ2h0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIERldGVybWluZSB0aGUgY29kZWMncyBzYW1wbGVfYXNwZWN0IHJhdGlvIGZyb20gdGhlIHBhY2tldCAqLworICAgIHZzY19wYWNrID0gYnVmICsgODAgKiA1ICsgNDggKyA1OworICAgIGlmICgqdnNjX3BhY2sgPT0gZHZfdmlkZW9fY29udHJvbCkgeworICAgICAgICBhcHQgICAgPSBidWZbNF0gJiAweDA3OworICAgICAgICBpczE2XzkgPSAodnNjX3BhY2tbMl0gJiAweDA3KSA9PSAweDAyIHx8CisgICAgICAgICAgICAgICAgICghYXB0ICYmICh2c2NfcGFja1syXSAmIDB4MDcpID09IDB4MDcpOworICAgICAgICBmZl9zZXRfc2FyKGF2Y3R4LCBzLT5zeXMtPnNhcltpczE2XzldKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHMtPmZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICBzLT5mcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ICA9IDA7CisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGNvZGVjJ3MgZmllbGQgb3JkZXIgZnJvbSB0aGUgcGFja2V0ICovCisgICAgaWYgKCAqdnNjX3BhY2sgPT0gZHZfdmlkZW9fY29udHJvbCApIHsKKyAgICAgICAgcy0+ZnJhbWUtPnRvcF9maWVsZF9maXJzdCA9ICEodnNjX3BhY2tbM10gJiAweDQwKTsKKyAgICB9CisKKyAgICBzLT5idWYgPSBidWY7CisgICAgYXZjdHgtPmV4ZWN1dGUoYXZjdHgsIGR2X2RlY29kZV92aWRlb19zZWdtZW50LCBzLT53b3JrX2NodW5rcywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICBkdl93b3JrX3Bvb2xfc2l6ZShzLT5zeXMpLCBzaXplb2YoRFZ3b3JrX2NodW5rKSk7CisKKyAgICBlbW1zX2MoKTsKKworICAgIC8qIHJldHVybiBpbWFnZSAqLworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIHMtPnN5cy0+ZnJhbWVfc2l6ZTsKK30KKworQVZDb2RlYyBmZl9kdnZpZGVvX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImR2dmlkZW8iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEViAoRGlnaXRhbCBWaWRlbykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRFZWSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRFZWaWRlb0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGR2dmlkZW9fZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZHZ2aWRlb19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9TTElDRV9USFJFQURTLAorICAgIC5tYXhfbG93cmVzICAgICA9IDMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHZkc3ViX3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHZkc3ViX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYTk0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9kdmRzdWJfcGFyc2VyLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIERWRCBzdWJ0aXRsZSBkZWNvZGluZworICogQ29weXJpZ2h0IChjKSAyMDA1IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKworLyogcGFyc2VyIGRlZmluaXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IERWRFN1YlBhcnNlQ29udGV4dCB7CisgICAgdWludDhfdCAqcGFja2V0OworICAgIGludCBwYWNrZXRfbGVuOworICAgIGludCBwYWNrZXRfaW5kZXg7Cit9IERWRFN1YlBhcnNlQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGR2ZHN1Yl9wYXJzZV9pbml0KEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2ZHN1Yl9wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIERWRFN1YlBhcnNlQ29udGV4dCAqcGMgPSBzLT5wcml2X2RhdGE7CisKKyAgICBpZiAocGMtPnBhY2tldF9pbmRleCA9PSAwKSB7CisgICAgICAgIGlmIChidWZfc2l6ZSA8IDIgfHwgQVZfUkIxNihidWYpICYmIGJ1Zl9zaXplIDwgNikgeworICAgICAgICAgICAgaWYgKGJ1Zl9zaXplKQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUGFyc2VyIGlucHV0ICVkIHRvbyBzbWFsbFxuIiwgYnVmX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICB9CisgICAgICAgIHBjLT5wYWNrZXRfbGVuID0gQVZfUkIxNihidWYpOworICAgICAgICBpZiAocGMtPnBhY2tldF9sZW4gPT0gMCkgLyogSEQtRFZEIHN1YnBpY3R1cmUgcGFja2V0ICovCisgICAgICAgICAgICBwYy0+cGFja2V0X2xlbiA9IEFWX1JCMzIoYnVmKzIpOworICAgICAgICBhdl9mcmVlcCgmcGMtPnBhY2tldCk7CisgICAgICAgIHBjLT5wYWNrZXQgPSBhdl9tYWxsb2MocGMtPnBhY2tldF9sZW4pOworICAgIH0KKyAgICBpZiAocGMtPnBhY2tldCkgeworICAgICAgICBpZiAocGMtPnBhY2tldF9pbmRleCArIGJ1Zl9zaXplIDw9IHBjLT5wYWNrZXRfbGVuKSB7CisgICAgICAgICAgICBtZW1jcHkocGMtPnBhY2tldCArIHBjLT5wYWNrZXRfaW5kZXgsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICAgICAgcGMtPnBhY2tldF9pbmRleCArPSBidWZfc2l6ZTsKKyAgICAgICAgICAgIGlmIChwYy0+cGFja2V0X2luZGV4ID49IHBjLT5wYWNrZXRfbGVuKSB7CisgICAgICAgICAgICAgICAgKnBvdXRidWYgPSBwYy0+cGFja2V0OworICAgICAgICAgICAgICAgICpwb3V0YnVmX3NpemUgPSBwYy0+cGFja2V0X2xlbjsKKyAgICAgICAgICAgICAgICBwYy0+cGFja2V0X2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBlcnJvbmVvdXMgc2l6ZSAqLworICAgICAgICAgICAgcGMtPnBhY2tldF9pbmRleCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBvdXRidWYgPSBOVUxMOworICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBkdmRzdWJfcGFyc2VfY2xvc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMpCit7CisgICAgRFZEU3ViUGFyc2VDb250ZXh0ICpwYyA9IHMtPnByaXZfZGF0YTsKKyAgICBhdl9mcmVlcCgmcGMtPnBhY2tldCk7Cit9CisKK0FWQ29kZWNQYXJzZXIgZmZfZHZkc3ViX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX0RWRF9TVUJUSVRMRSB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihEVkRTdWJQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfaW5pdCAgICA9IGR2ZHN1Yl9wYXJzZV9pbml0LAorICAgIC5wYXJzZXJfcGFyc2UgICA9IGR2ZHN1Yl9wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBkdmRzdWJfcGFyc2VfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHZkc3ViZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kdmRzdWJkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTYwNGYzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHZkc3ViZGVjLmMKQEAgLTAsMCArMSw3NDQgQEAKKy8qCisgKiBEVkQgc3VidGl0bGUgZGVjb2RpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwNSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb2xvcnNwYWNlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorCit0eXBlZGVmIHN0cnVjdCBEVkRTdWJDb250ZXh0Cit7CisgIEFWQ2xhc3MgKmNsYXNzOworICB1aW50MzJfdCBwYWxldHRlWzE2XTsKKyAgY2hhciAgICAqcGFsZXR0ZV9zdHI7CisgIGNoYXIgICAgKmlmb19zdHI7CisgIGludCAgICAgIGhhc19wYWxldHRlOworICB1aW50OF90ICBjb2xvcm1hcFs0XTsKKyAgdWludDhfdCAgYWxwaGFbMjU2XTsKKyAgdWludDhfdCAqYnVmOworICBpbnQgICAgICBidWZfc2l6ZTsKKyAgaW50ICAgICAgZm9yY2VkX3N1YnNfb25seTsKKyNpZmRlZiBERUJVRworICBpbnQgc3ViX2lkOworI2VuZGlmCit9IERWRFN1YkNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIHl1dl9hX3RvX3JnYmEoY29uc3QgdWludDhfdCAqeWNiY3IsIGNvbnN0IHVpbnQ4X3QgKmFscGhhLCB1aW50MzJfdCAqcmdiYSwgaW50IG51bV92YWx1ZXMpCit7CisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICB1aW50OF90IHIsIGcsIGI7CisgICAgaW50IGksIHksIGNiLCBjcjsKKyAgICBpbnQgcl9hZGQsIGdfYWRkLCBiX2FkZDsKKworICAgIGZvciAoaSA9IG51bV92YWx1ZXM7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgeSA9ICp5Y2JjcisrOworICAgICAgICBjciA9ICp5Y2JjcisrOworICAgICAgICBjYiA9ICp5Y2JjcisrOworICAgICAgICBZVVZfVE9fUkdCMV9DQ0lSKGNiLCBjcik7CisgICAgICAgIFlVVl9UT19SR0IyX0NDSVIociwgZywgYiwgeSk7CisgICAgICAgICpyZ2JhKysgPSAoKmFscGhhKysgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworICAgIH0KK30KKworc3RhdGljIGludCBkZWNvZGVfcnVuXzJiaXQoR2V0Qml0Q29udGV4dCAqZ2IsIGludCAqY29sb3IpCit7CisgICAgdW5zaWduZWQgaW50IHYsIHQ7CisKKyAgICB2ID0gMDsKKyAgICBmb3IgKHQgPSAxOyB2IDwgdCAmJiB0IDw9IDB4NDA7IHQgPDw9IDIpCisgICAgICAgIHYgPSAodiA8PCA0KSB8IGdldF9iaXRzKGdiLCA0KTsKKyAgICAqY29sb3IgPSB2ICYgMzsKKyAgICBpZiAodiA8IDQpIHsgLyogQ29kZSBmb3IgZmlsbCByZXN0IG9mIGxpbmUgKi8KKyAgICAgICAgcmV0dXJuIElOVF9NQVg7CisgICAgfQorICAgIHJldHVybiB2ID4+IDI7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3J1bl84Yml0KEdldEJpdENvbnRleHQgKmdiLCBpbnQgKmNvbG9yKQoreworICAgIGludCBsZW47CisgICAgaW50IGhhc19ydW4gPSBnZXRfYml0czEoZ2IpOworICAgIGlmIChnZXRfYml0czEoZ2IpKQorICAgICAgICAqY29sb3IgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgZWxzZQorICAgICAgICAqY29sb3IgPSBnZXRfYml0cyhnYiwgMik7CisgICAgaWYgKGhhc19ydW4pIHsKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIGxlbiA9IGdldF9iaXRzKGdiLCA3KTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgICAgICBsZW4gPSBJTlRfTUFYOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxlbiArPSA5OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGxlbiA9IGdldF9iaXRzKGdiLCAzKSArIDI7CisgICAgfSBlbHNlCisgICAgICAgIGxlbiA9IDE7CisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBkZWNvZGVfcmxlKHVpbnQ4X3QgKmJpdG1hcCwgaW50IGxpbmVzaXplLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc3RhcnQsIGludCBidWZfc2l6ZSwgaW50IGlzXzhiaXQpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgYml0X2xlbjsKKyAgICBpbnQgeCwgeSwgbGVuLCBjb2xvcjsKKyAgICB1aW50OF90ICpkOworCisgICAgYml0X2xlbiA9IChidWZfc2l6ZSAtIHN0YXJ0KSAqIDg7CisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiArIHN0YXJ0LCBiaXRfbGVuKTsKKworICAgIHggPSAwOworICAgIHkgPSAwOworICAgIGQgPSBiaXRtYXA7CisgICAgZm9yKDs7KSB7CisgICAgICAgIGlmIChnZXRfYml0c19jb3VudCgmZ2IpID4gYml0X2xlbikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGlzXzhiaXQpCisgICAgICAgICAgICBsZW4gPSBkZWNvZGVfcnVuXzhiaXQoJmdiLCAmY29sb3IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsZW4gPSBkZWNvZGVfcnVuXzJiaXQoJmdiLCAmY29sb3IpOworICAgICAgICBsZW4gPSBGRk1JTihsZW4sIHcgLSB4KTsKKyAgICAgICAgbWVtc2V0KGQgKyB4LCBjb2xvciwgbGVuKTsKKyAgICAgICAgeCArPSBsZW47CisgICAgICAgIGlmICh4ID49IHcpIHsKKyAgICAgICAgICAgIHkrKzsKKyAgICAgICAgICAgIGlmICh5ID49IGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkICs9IGxpbmVzaXplOworICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAvKiBieXRlIGFsaWduICovCisgICAgICAgICAgICBhbGlnbl9nZXRfYml0cygmZ2IpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBndWVzc19wYWxldHRlKERWRFN1YkNvbnRleHQqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJnYmFfcGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VidGl0bGVfY29sb3IpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgbGV2ZWxfbWFwWzRdWzRdID0geworICAgICAgICAvLyB0aGlzIGNvbmZpZ3VyYXRpb24gKGZ1bGwgcmFuZ2UsIGxvd2VzdCB0byBoaWdoZXN0KSBpbiB0ZXN0cworICAgICAgICAvLyBzZWVtZWQgbW9zdCBjb21tb24sIHNvIGFzc3VtZSB0aGlzCisgICAgICAgIHsweGZmfSwKKyAgICAgICAgezB4MDAsIDB4ZmZ9LAorICAgICAgICB7MHgwMCwgMHg4MCwgMHhmZn0sCisgICAgICAgIHsweDAwLCAweDU1LCAweGFhLCAweGZmfSwKKyAgICB9OworICAgIHVpbnQ4X3QgY29sb3JfdXNlZFsxNl0gPSB7IDAgfTsKKyAgICBpbnQgbmJfb3BhcXVlX2NvbG9ycywgaSwgbGV2ZWwsIGosIHIsIGcsIGI7CisgICAgdWludDhfdCAqY29sb3JtYXAgPSBjdHgtPmNvbG9ybWFwLCAqYWxwaGEgPSBjdHgtPmFscGhhOworCisgICAgaWYoY3R4LT5oYXNfcGFsZXR0ZSkgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICByZ2JhX3BhbGV0dGVbaV0gPSAoY3R4LT5wYWxldHRlW2NvbG9ybWFwW2ldXSAmIDB4MDBmZmZmZmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoYWxwaGFbaV0gKiAxN1UpIDw8IDI0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgcmdiYV9wYWxldHRlW2ldID0gMDsKKworICAgIG5iX29wYXF1ZV9jb2xvcnMgPSAwOworICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpZiAoYWxwaGFbaV0gIT0gMCAmJiAhY29sb3JfdXNlZFtjb2xvcm1hcFtpXV0pIHsKKyAgICAgICAgICAgIGNvbG9yX3VzZWRbY29sb3JtYXBbaV1dID0gMTsKKyAgICAgICAgICAgIG5iX29wYXF1ZV9jb2xvcnMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuYl9vcGFxdWVfY29sb3JzID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIGogPSAwOworICAgIG1lbXNldChjb2xvcl91c2VkLCAwLCAxNik7CisgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGlmIChhbHBoYVtpXSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIWNvbG9yX3VzZWRbY29sb3JtYXBbaV1dKSAgeworICAgICAgICAgICAgICAgIGxldmVsID0gbGV2ZWxfbWFwW25iX29wYXF1ZV9jb2xvcnNdW2pdOworICAgICAgICAgICAgICAgIHIgPSAoKChzdWJ0aXRsZV9jb2xvciA+PiAxNikgJiAweGZmKSAqIGxldmVsKSA+PiA4OworICAgICAgICAgICAgICAgIGcgPSAoKChzdWJ0aXRsZV9jb2xvciA+PiA4KSAmIDB4ZmYpICogbGV2ZWwpID4+IDg7CisgICAgICAgICAgICAgICAgYiA9ICgoKHN1YnRpdGxlX2NvbG9yID4+IDApICYgMHhmZikgKiBsZXZlbCkgPj4gODsKKyAgICAgICAgICAgICAgICByZ2JhX3BhbGV0dGVbaV0gPSBiIHwgKGcgPDwgOCkgfCAociA8PCAxNikgfCAoKGFscGhhW2ldICogMTcpIDw8IDI0KTsKKyAgICAgICAgICAgICAgICBjb2xvcl91c2VkW2NvbG9ybWFwW2ldXSA9IChpICsgMSk7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZ2JhX3BhbGV0dGVbaV0gPSAocmdiYV9wYWxldHRlW2NvbG9yX3VzZWRbY29sb3JtYXBbaV1dIC0gMV0gJiAweDAwZmZmZmZmKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGFscGhhW2ldICogMTcpIDw8IDI0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVzZXRfcmVjdHMoQVZTdWJ0aXRsZSAqc3ViX2hlYWRlcikKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChzdWJfaGVhZGVyLT5yZWN0cykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ViX2hlYWRlci0+bnVtX3JlY3RzOyBpKyspIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzdWJfaGVhZGVyLT5yZWN0c1tpXS0+cGljdC5kYXRhWzBdKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzdWJfaGVhZGVyLT5yZWN0c1tpXS0+cGljdC5kYXRhWzFdKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzdWJfaGVhZGVyLT5yZWN0c1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZXAoJnN1Yl9oZWFkZXItPnJlY3RzKTsKKyAgICAgICAgc3ViX2hlYWRlci0+bnVtX3JlY3RzID0gMDsKKyAgICB9Cit9CisKKyNkZWZpbmUgUkVBRF9PRkZTRVQoYSkgKGJpZ19vZmZzZXRzID8gQVZfUkIzMihhKSA6IEFWX1JCMTYoYSkpCisKK3N0YXRpYyBpbnQgZGVjb2RlX2R2ZF9zdWJ0aXRsZXMoRFZEU3ViQ29udGV4dCAqY3R4LCBBVlN1YnRpdGxlICpzdWJfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgY21kX3BvcywgcG9zLCBjbWQsIHgxLCB5MSwgeDIsIHkyLCBvZmZzZXQxLCBvZmZzZXQyLCBuZXh0X2NtZF9wb3M7CisgICAgaW50IGJpZ19vZmZzZXRzLCBvZmZzZXRfc2l6ZSwgaXNfOGJpdCA9IDA7CisgICAgY29uc3QgdWludDhfdCAqeXV2X3BhbGV0dGUgPSBOVUxMOworICAgIHVpbnQ4X3QgKmNvbG9ybWFwID0gY3R4LT5jb2xvcm1hcCwgKmFscGhhID0gY3R4LT5hbHBoYTsKKyAgICBpbnQgZGF0ZTsKKyAgICBpbnQgaTsKKyAgICBpbnQgaXNfbWVudSA9IDA7CisKKyAgICBpZiAoYnVmX3NpemUgPCAxMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKEFWX1JCMTYoYnVmKSA9PSAwKSB7ICAgLyogSEQgc3VicGljdHVyZSB3aXRoIDQtYnl0ZSBvZmZzZXRzICovCisgICAgICAgIGJpZ19vZmZzZXRzID0gMTsKKyAgICAgICAgb2Zmc2V0X3NpemUgPSA0OworICAgICAgICBjbWRfcG9zID0gNjsKKyAgICB9IGVsc2UgeworICAgICAgICBiaWdfb2Zmc2V0cyA9IDA7CisgICAgICAgIG9mZnNldF9zaXplID0gMjsKKyAgICAgICAgY21kX3BvcyA9IDI7CisgICAgfQorCisgICAgY21kX3BvcyA9IFJFQURfT0ZGU0VUKGJ1ZiArIGNtZF9wb3MpOworCisgICAgaWYgKGNtZF9wb3MgPCAwIHx8IGNtZF9wb3MgPiBidWZfc2l6ZSAtIDIgLSBvZmZzZXRfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKworICAgIHdoaWxlIChjbWRfcG9zID4gMCAmJiBjbWRfcG9zIDwgYnVmX3NpemUgLSAyIC0gb2Zmc2V0X3NpemUpIHsKKyAgICAgICAgZGF0ZSA9IEFWX1JCMTYoYnVmICsgY21kX3Bvcyk7CisgICAgICAgIG5leHRfY21kX3BvcyA9IFJFQURfT0ZGU0VUKGJ1ZiArIGNtZF9wb3MgKyAyKTsKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiY21kX3Bvcz0weCUwNHggbmV4dD0weCUwNHggZGF0ZT0lZFxuIiwKKyAgICAgICAgICAgICAgICBjbWRfcG9zLCBuZXh0X2NtZF9wb3MsIGRhdGUpOworICAgICAgICBwb3MgPSBjbWRfcG9zICsgMiArIG9mZnNldF9zaXplOworICAgICAgICBvZmZzZXQxID0gLTE7CisgICAgICAgIG9mZnNldDIgPSAtMTsKKyAgICAgICAgeDEgPSB5MSA9IHgyID0geTIgPSAwOworICAgICAgICB3aGlsZSAocG9zIDwgYnVmX3NpemUpIHsKKyAgICAgICAgICAgIGNtZCA9IGJ1Zltwb3MrK107CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJjbWQ9JTAyeFxuIiwgY21kKTsKKyAgICAgICAgICAgIHN3aXRjaChjbWQpIHsKKyAgICAgICAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgICAgICAgICAvKiBtZW51IHN1YnBpY3R1cmUgKi8KKyAgICAgICAgICAgICAgICBpc19tZW51ID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwMToKKyAgICAgICAgICAgICAgICAvKiBzZXQgc3RhcnQgZGF0ZSAqLworICAgICAgICAgICAgICAgIHN1Yl9oZWFkZXItPnN0YXJ0X2Rpc3BsYXlfdGltZSA9IChkYXRlIDw8IDEwKSAvIDkwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDAyOgorICAgICAgICAgICAgICAgIC8qIHNldCBlbmQgZGF0ZSAqLworICAgICAgICAgICAgICAgIHN1Yl9oZWFkZXItPmVuZF9kaXNwbGF5X3RpbWUgPSAoZGF0ZSA8PCAxMCkgLyA5MDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwMzoKKyAgICAgICAgICAgICAgICAvKiBzZXQgY29sb3JtYXAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKGJ1Zl9zaXplIC0gcG9zKSA8IDIpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICBjb2xvcm1hcFszXSA9IGJ1Zltwb3NdID4+IDQ7CisgICAgICAgICAgICAgICAgY29sb3JtYXBbMl0gPSBidWZbcG9zXSAmIDB4MGY7CisgICAgICAgICAgICAgICAgY29sb3JtYXBbMV0gPSBidWZbcG9zICsgMV0gPj4gNDsKKyAgICAgICAgICAgICAgICBjb2xvcm1hcFswXSA9IGJ1Zltwb3MgKyAxXSAmIDB4MGY7CisgICAgICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDQ6CisgICAgICAgICAgICAgICAgLyogc2V0IGFscGhhICovCisgICAgICAgICAgICAgICAgaWYgKChidWZfc2l6ZSAtIHBvcykgPCAyKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgYWxwaGFbM10gPSBidWZbcG9zXSA+PiA0OworICAgICAgICAgICAgICAgIGFscGhhWzJdID0gYnVmW3Bvc10gJiAweDBmOworICAgICAgICAgICAgICAgIGFscGhhWzFdID0gYnVmW3BvcyArIDFdID4+IDQ7CisgICAgICAgICAgICAgICAgYWxwaGFbMF0gPSBidWZbcG9zICsgMV0gJiAweDBmOworICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiYWxwaGE9JXgleCV4JXhcbiIsIGFscGhhWzBdLGFscGhhWzFdLGFscGhhWzJdLGFscGhhWzNdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwNToKKyAgICAgICAgICAgIGNhc2UgMHg4NToKKyAgICAgICAgICAgICAgICBpZiAoKGJ1Zl9zaXplIC0gcG9zKSA8IDYpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB4MSA9IChidWZbcG9zXSA8PCA0KSB8IChidWZbcG9zICsgMV0gPj4gNCk7CisgICAgICAgICAgICAgICAgeDIgPSAoKGJ1Zltwb3MgKyAxXSAmIDB4MGYpIDw8IDgpIHwgYnVmW3BvcyArIDJdOworICAgICAgICAgICAgICAgIHkxID0gKGJ1Zltwb3MgKyAzXSA8PCA0KSB8IChidWZbcG9zICsgNF0gPj4gNCk7CisgICAgICAgICAgICAgICAgeTIgPSAoKGJ1Zltwb3MgKyA0XSAmIDB4MGYpIDw8IDgpIHwgYnVmW3BvcyArIDVdOworICAgICAgICAgICAgICAgIGlmIChjbWQgJiAweDgwKQorICAgICAgICAgICAgICAgICAgICBpc184Yml0ID0gMTsKKyAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJ4MT0lZCB4Mj0lZCB5MT0lZCB5Mj0lZFxuIiwgeDEsIHgyLCB5MSwgeTIpOworICAgICAgICAgICAgICAgIHBvcyArPSA2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDA2OgorICAgICAgICAgICAgICAgIGlmICgoYnVmX3NpemUgLSBwb3MpIDwgNCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIG9mZnNldDEgPSBBVl9SQjE2KGJ1ZiArIHBvcyk7CisgICAgICAgICAgICAgICAgb2Zmc2V0MiA9IEFWX1JCMTYoYnVmICsgcG9zICsgMik7CisgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAib2Zmc2V0MT0weCUwNHggb2Zmc2V0Mj0weCUwNHhcbiIsIG9mZnNldDEsIG9mZnNldDIpOworICAgICAgICAgICAgICAgIHBvcyArPSA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDg2OgorICAgICAgICAgICAgICAgIGlmICgoYnVmX3NpemUgLSBwb3MpIDwgOCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIG9mZnNldDEgPSBBVl9SQjMyKGJ1ZiArIHBvcyk7CisgICAgICAgICAgICAgICAgb2Zmc2V0MiA9IEFWX1JCMzIoYnVmICsgcG9zICsgNCk7CisgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAib2Zmc2V0MT0weCUwNHggb2Zmc2V0Mj0weCUwNHhcbiIsIG9mZnNldDEsIG9mZnNldDIpOworICAgICAgICAgICAgICAgIHBvcyArPSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ODM6CisgICAgICAgICAgICAgICAgLyogSEQgc2V0IHBhbGV0dGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoKGJ1Zl9zaXplIC0gcG9zKSA8IDc2OCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIHl1dl9wYWxldHRlID0gYnVmICsgcG9zOworICAgICAgICAgICAgICAgIHBvcyArPSA3Njg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4ODQ6CisgICAgICAgICAgICAgICAgLyogSEQgc2V0IGNvbnRyYXN0IChhbHBoYSkgKi8KKyAgICAgICAgICAgICAgICBpZiAoKGJ1Zl9zaXplIC0gcG9zKSA8IDI1NikKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYWxwaGFbaV0gPSAweEZGIC0gYnVmW3BvcytpXTsKKyAgICAgICAgICAgICAgICBwb3MgKz0gMjU2OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY6CisgICAgICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJ1bnJlY29nbmlzZWQgc3VicGljdHVyZSBjb21tYW5kIDB4JXhcbiIsIGNtZCk7CisgICAgICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgdGhlX2VuZDoKKyAgICAgICAgaWYgKG9mZnNldDEgPj0gMCkgeworICAgICAgICAgICAgaW50IHcsIGg7CisgICAgICAgICAgICB1aW50OF90ICpiaXRtYXA7CisKKyAgICAgICAgICAgIC8qIGRlY29kZSB0aGUgYml0bWFwICovCisgICAgICAgICAgICB3ID0geDIgLSB4MSArIDE7CisgICAgICAgICAgICBpZiAodyA8IDApCisgICAgICAgICAgICAgICAgdyA9IDA7CisgICAgICAgICAgICBoID0geTIgLSB5MSArIDE7CisgICAgICAgICAgICBpZiAoaCA8IDApCisgICAgICAgICAgICAgICAgaCA9IDA7CisgICAgICAgICAgICBpZiAodyA+IDAgJiYgaCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXNldF9yZWN0cyhzdWJfaGVhZGVyKTsKKworICAgICAgICAgICAgICAgIGJpdG1hcCA9IGF2X21hbGxvYyh3ICogaCk7CisgICAgICAgICAgICAgICAgc3ViX2hlYWRlci0+cmVjdHMgPSBhdl9tYWxsb2N6KHNpemVvZigqc3ViX2hlYWRlci0+cmVjdHMpKTsKKyAgICAgICAgICAgICAgICBzdWJfaGVhZGVyLT5yZWN0c1swXSA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWU3VidGl0bGVSZWN0KSk7CisgICAgICAgICAgICAgICAgc3ViX2hlYWRlci0+bnVtX3JlY3RzID0gMTsKKyAgICAgICAgICAgICAgICBzdWJfaGVhZGVyLT5yZWN0c1swXS0+cGljdC5kYXRhWzBdID0gYml0bWFwOworICAgICAgICAgICAgICAgIGRlY29kZV9ybGUoYml0bWFwLCB3ICogMiwgdywgKGggKyAxKSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIG9mZnNldDEsIGJ1Zl9zaXplLCBpc184Yml0KTsKKyAgICAgICAgICAgICAgICBkZWNvZGVfcmxlKGJpdG1hcCArIHcsIHcgKiAyLCB3LCBoIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Ziwgb2Zmc2V0MiwgYnVmX3NpemUsIGlzXzhiaXQpOworICAgICAgICAgICAgICAgIHN1Yl9oZWFkZXItPnJlY3RzWzBdLT5waWN0LmRhdGFbMV0gPSBhdl9tYWxsb2N6KEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNfOGJpdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXl1dl9wYWxldHRlKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICAgICBzdWJfaGVhZGVyLT5yZWN0c1swXS0+bmJfY29sb3JzID0gMjU2OworICAgICAgICAgICAgICAgICAgICB5dXZfYV90b19yZ2JhKHl1dl9wYWxldHRlLCBhbHBoYSwgKHVpbnQzMl90KilzdWJfaGVhZGVyLT5yZWN0c1swXS0+cGljdC5kYXRhWzFdLCAyNTYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN1Yl9oZWFkZXItPnJlY3RzWzBdLT5uYl9jb2xvcnMgPSA0OworICAgICAgICAgICAgICAgICAgICBndWVzc19wYWxldHRlKGN0eCwgKHVpbnQzMl90KilzdWJfaGVhZGVyLT5yZWN0c1swXS0+cGljdC5kYXRhWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3ViX2hlYWRlci0+cmVjdHNbMF0tPnggPSB4MTsKKyAgICAgICAgICAgICAgICBzdWJfaGVhZGVyLT5yZWN0c1swXS0+eSA9IHkxOworICAgICAgICAgICAgICAgIHN1Yl9oZWFkZXItPnJlY3RzWzBdLT53ID0gdzsKKyAgICAgICAgICAgICAgICBzdWJfaGVhZGVyLT5yZWN0c1swXS0+aCA9IGg7CisgICAgICAgICAgICAgICAgc3ViX2hlYWRlci0+cmVjdHNbMF0tPnR5cGUgPSBTVUJUSVRMRV9CSVRNQVA7CisgICAgICAgICAgICAgICAgc3ViX2hlYWRlci0+cmVjdHNbMF0tPnBpY3QubGluZXNpemVbMF0gPSB3OworICAgICAgICAgICAgICAgIHN1Yl9oZWFkZXItPnJlY3RzWzBdLT5mbGFncyA9IGlzX21lbnUgPyBBVl9TVUJUSVRMRV9GTEFHX0ZPUkNFRCA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5leHRfY21kX3BvcyA8IGNtZF9wb3MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNvbW1hbmQgb2Zmc2V0XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChuZXh0X2NtZF9wb3MgPT0gY21kX3BvcykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjbWRfcG9zID0gbmV4dF9jbWRfcG9zOworICAgIH0KKyAgICBpZiAoc3ViX2hlYWRlci0+bnVtX3JlY3RzID4gMCkKKyAgICAgICAgcmV0dXJuIGlzX21lbnU7CisgZmFpbDoKKyAgICByZXNldF9yZWN0cyhzdWJfaGVhZGVyKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaXNfdHJhbnNwKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHBpdGNoLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRyYW5zcF9jb2xvcikKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKCF0cmFuc3BfY29sb3JbKmJ1Zl0pCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYnVmICs9IHBpdGNoOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworLyogcmV0dXJuIDAgaWYgZW1wdHkgcmVjdGFuZ2xlLCAxIGlmIG5vbiBlbXB0eSAqLworc3RhdGljIGludCBmaW5kX3NtYWxsZXN0X2JvdW5kaW5nX3JlY3RhbmdsZShBVlN1YnRpdGxlICpzKQoreworICAgIHVpbnQ4X3QgdHJhbnNwX2NvbG9yWzI1Nl0gPSB7IDAgfTsKKyAgICBpbnQgeTEsIHkyLCB4MSwgeDIsIHksIHcsIGgsIGk7CisgICAgdWludDhfdCAqYml0bWFwOworCisgICAgaWYgKHMtPm51bV9yZWN0cyA9PSAwIHx8ICFzLT5yZWN0cyB8fCBzLT5yZWN0c1swXS0+dyA8PSAwIHx8IHMtPnJlY3RzWzBdLT5oIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yKGkgPSAwOyBpIDwgcy0+cmVjdHNbMF0tPm5iX2NvbG9yczsgaSsrKSB7CisgICAgICAgIGlmICgoKCh1aW50MzJfdCopcy0+cmVjdHNbMF0tPnBpY3QuZGF0YVsxXSlbaV0gPj4gMjQpID09IDApCisgICAgICAgICAgICB0cmFuc3BfY29sb3JbaV0gPSAxOworICAgIH0KKyAgICB5MSA9IDA7CisgICAgd2hpbGUgKHkxIDwgcy0+cmVjdHNbMF0tPmggJiYgaXNfdHJhbnNwKHMtPnJlY3RzWzBdLT5waWN0LmRhdGFbMF0gKyB5MSAqIHMtPnJlY3RzWzBdLT5waWN0LmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHMtPnJlY3RzWzBdLT53LCB0cmFuc3BfY29sb3IpKQorICAgICAgICB5MSsrOworICAgIGlmICh5MSA9PSBzLT5yZWN0c1swXS0+aCkgeworICAgICAgICBhdl9mcmVlcCgmcy0+cmVjdHNbMF0tPnBpY3QuZGF0YVswXSk7CisgICAgICAgIHMtPnJlY3RzWzBdLT53ID0gcy0+cmVjdHNbMF0tPmggPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB5MiA9IHMtPnJlY3RzWzBdLT5oIC0gMTsKKyAgICB3aGlsZSAoeTIgPiAwICYmIGlzX3RyYW5zcChzLT5yZWN0c1swXS0+cGljdC5kYXRhWzBdICsgeTIgKiBzLT5yZWN0c1swXS0+cGljdC5saW5lc2l6ZVswXSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZWN0c1swXS0+dywgdHJhbnNwX2NvbG9yKSkKKyAgICAgICAgeTItLTsKKyAgICB4MSA9IDA7CisgICAgd2hpbGUgKHgxIDwgKHMtPnJlY3RzWzBdLT53IC0gMSkgJiYgaXNfdHJhbnNwKHMtPnJlY3RzWzBdLT5waWN0LmRhdGFbMF0gKyB4MSwgcy0+cmVjdHNbMF0tPnBpY3QubGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVjdHNbMF0tPmgsIHRyYW5zcF9jb2xvcikpCisgICAgICAgIHgxKys7CisgICAgeDIgPSBzLT5yZWN0c1swXS0+dyAtIDE7CisgICAgd2hpbGUgKHgyID4gMCAmJiBpc190cmFuc3Aocy0+cmVjdHNbMF0tPnBpY3QuZGF0YVswXSArIHgyLCBzLT5yZWN0c1swXS0+cGljdC5saW5lc2l6ZVswXSwgcy0+cmVjdHNbMF0tPmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwX2NvbG9yKSkKKyAgICAgICAgeDItLTsKKyAgICB3ID0geDIgLSB4MSArIDE7CisgICAgaCA9IHkyIC0geTEgKyAxOworICAgIGJpdG1hcCA9IGF2X21hbGxvYyh3ICogaCk7CisgICAgaWYgKCFiaXRtYXApCisgICAgICAgIHJldHVybiAxOworICAgIGZvcih5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBtZW1jcHkoYml0bWFwICsgdyAqIHksIHMtPnJlY3RzWzBdLT5waWN0LmRhdGFbMF0gKyB4MSArICh5MSArIHkpICogcy0+cmVjdHNbMF0tPnBpY3QubGluZXNpemVbMF0sIHcpOworICAgIH0KKyAgICBhdl9mcmVlcCgmcy0+cmVjdHNbMF0tPnBpY3QuZGF0YVswXSk7CisgICAgcy0+cmVjdHNbMF0tPnBpY3QuZGF0YVswXSA9IGJpdG1hcDsKKyAgICBzLT5yZWN0c1swXS0+cGljdC5saW5lc2l6ZVswXSA9IHc7CisgICAgcy0+cmVjdHNbMF0tPncgPSB3OworICAgIHMtPnJlY3RzWzBdLT5oID0gaDsKKyAgICBzLT5yZWN0c1swXS0+eCArPSB4MTsKKyAgICBzLT5yZWN0c1swXS0+eSArPSB5MTsKKyAgICByZXR1cm4gMTsKK30KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIEFMUEhBX01JWChBLEJBQ0ssRk9SRSkgKCgoMjU1LShBKSkgKiAoQkFDSykgKyAoQSkgKiAoRk9SRSkpIC8gMjU1KQorc3RhdGljIHZvaWQgcHBtX3NhdmUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHVpbnQ4X3QgKmJpdG1hcCwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJnYmFfcGFsZXR0ZSkKK3sKKyAgICBpbnQgeCwgeSwgYWxwaGE7CisgICAgdWludDMyX3QgdjsKKyAgICBpbnQgYmFja1szXSA9IHswLCAyNTUsIDB9OyAgLyogZ3JlZW4gYmFja2dyb3VuZCAqLworICAgIEZJTEUgKmY7CisKKyAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJ3Iik7CisgICAgaWYgKCFmKSB7CisgICAgICAgIHBlcnJvcihmaWxlbmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZnByaW50ZihmLCAiUDZcbiIKKyAgICAgICAgICAgICIlZCAlZFxuIgorICAgICAgICAgICAgIiVkXG4iLAorICAgICAgICAgICAgdywgaCwgMjU1KTsKKyAgICBmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICB2ID0gcmdiYV9wYWxldHRlW2JpdG1hcFt5ICogdyArIHhdXTsKKyAgICAgICAgICAgIGFscGhhID0gdiA+PiAyNDsKKyAgICAgICAgICAgIHB1dGMoQUxQSEFfTUlYKGFscGhhLCBiYWNrWzBdLCAodiA+PiAxNikgJiAweGZmKSwgZik7CisgICAgICAgICAgICBwdXRjKEFMUEhBX01JWChhbHBoYSwgYmFja1sxXSwgKHYgPj4gOCkgJiAweGZmKSwgZik7CisgICAgICAgICAgICBwdXRjKEFMUEhBX01JWChhbHBoYSwgYmFja1syXSwgKHYgPj4gMCkgJiAweGZmKSwgZik7CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGYpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYXBwZW5kX3RvX2NhY2hlZF9idWYoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBEVkRTdWJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGN0eC0+YnVmX3NpemUgPiAweGZmZmYgLSBidWZfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQXR0ZW1wdCB0byByZWNvbnN0cnVjdCAiCisgICAgICAgICAgICAgICAidG9vIGxhcmdlIFNQVSBwYWNrZXRzIGFib3J0ZWQuXG4iKTsKKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+YnVmKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGN0eC0+YnVmID0gYXZfcmVhbGxvYyhjdHgtPmJ1ZiwgY3R4LT5idWZfc2l6ZSArIGJ1Zl9zaXplKTsKKyAgICBpZiAoIWN0eC0+YnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG1lbWNweShjdHgtPmJ1ZiArIGN0eC0+YnVmX3NpemUsIGJ1ZiwgYnVmX3NpemUpOworICAgIGN0eC0+YnVmX3NpemUgKz0gYnVmX3NpemU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHZkc3ViX2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIERWRFN1YkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKKyAgICBpbnQgaXNfbWVudTsKKworICAgIGlmIChjdHgtPmJ1ZikgeworICAgICAgICBpbnQgcmV0ID0gYXBwZW5kX3RvX2NhY2hlZF9idWYoYXZjdHgsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGJ1ZiA9IGN0eC0+YnVmOworICAgICAgICBidWZfc2l6ZSA9IGN0eC0+YnVmX3NpemU7CisgICAgfQorCisgICAgaXNfbWVudSA9IGRlY29kZV9kdmRfc3VidGl0bGVzKGN0eCwgc3ViLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBpZiAoaXNfbWVudSA9PSBBVkVSUk9SKEVBR0FJTikpIHsKKyAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBhcHBlbmRfdG9fY2FjaGVkX2J1ZihhdmN0eCwgYnVmLCBidWZfc2l6ZSk7CisgICAgfQorCisgICAgaWYgKGlzX21lbnUgPCAwKSB7CisgICAgbm9fc3VidGl0bGU6CisgICAgICAgIHJlc2V0X3JlY3RzKHN1Yik7CisgICAgICAgICpkYXRhX3NpemUgPSAwOworCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisgICAgaWYgKCFpc19tZW51ICYmIGZpbmRfc21hbGxlc3RfYm91bmRpbmdfcmVjdGFuZ2xlKHN1YikgPT0gMCkKKyAgICAgICAgZ290byBub19zdWJ0aXRsZTsKKworICAgIGlmIChjdHgtPmZvcmNlZF9zdWJzX29ubHkgJiYgIShzdWItPnJlY3RzWzBdLT5mbGFncyAmIEFWX1NVQlRJVExFX0ZMQUdfRk9SQ0VEKSkKKyAgICAgICAgZ290byBub19zdWJ0aXRsZTsKKworI2lmIGRlZmluZWQoREVCVUcpCisgICAgeworICAgIGNoYXIgcHBtX25hbWVbMzJdOworCisgICAgc25wcmludGYocHBtX25hbWUsIHNpemVvZihwcG1fbmFtZSksICIvdG1wLyUwNWQucHBtIiwgY3R4LT5zdWJfaWQrKyk7CisgICAgYXZfZGxvZyhOVUxMLCAic3RhcnQ9JWQgbXMgZW5kID0lZCBtc1xuIiwKKyAgICAgICAgICAgIHN1Yi0+c3RhcnRfZGlzcGxheV90aW1lLAorICAgICAgICAgICAgc3ViLT5lbmRfZGlzcGxheV90aW1lKTsKKyAgICBwcG1fc2F2ZShwcG1fbmFtZSwgc3ViLT5yZWN0c1swXS0+cGljdC5kYXRhWzBdLAorICAgICAgICAgICAgIHN1Yi0+cmVjdHNbMF0tPncsIHN1Yi0+cmVjdHNbMF0tPmgsICh1aW50MzJfdCopIHN1Yi0+cmVjdHNbMF0tPnBpY3QuZGF0YVsxXSk7CisgICAgfQorI2VuZGlmCisKKyAgICBhdl9mcmVlcCgmY3R4LT5idWYpOworICAgIGN0eC0+YnVmX3NpemUgPSAwOworICAgICpkYXRhX3NpemUgPSAxOworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfcGFsZXR0ZShEVkRTdWJDb250ZXh0ICpjdHgsIGNoYXIgKnApCit7CisgICAgaW50IGk7CisKKyAgICBjdHgtPmhhc19wYWxldHRlID0gMTsKKyAgICBmb3IoaT0wO2k8MTY7aSsrKSB7CisgICAgICAgIGN0eC0+cGFsZXR0ZVtpXSA9IHN0cnRvdWwocCwgJnAsIDE2KTsKKyAgICAgICAgd2hpbGUoKnAgPT0gJywnIHx8IGF2X2lzc3BhY2UoKnApKQorICAgICAgICAgICAgcCsrOworICAgIH0KK30KKworc3RhdGljIGludCBwYXJzZV9pZm9fcGFsZXR0ZShEVkRTdWJDb250ZXh0ICpjdHgsIGNoYXIgKnApCit7CisgICAgRklMRSAqaWZvOworICAgIGNoYXIgaWZvc3RyWzEyXTsKKyAgICB1aW50MzJfdCBzcF9wZ2NpLCBwZ2NpLCBvZmZfcGdjLCBwZ2M7CisgICAgdWludDhfdCByLCBnLCBiLCB5dXZbNjVdLCAqYnVmOworICAgIGludCBpLCB5LCBjYiwgY3IsIHJfYWRkLCBnX2FkZCwgYl9hZGQ7CisgICAgaW50IHJldCA9IDA7CisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKworICAgIGN0eC0+aGFzX3BhbGV0dGUgPSAwOworICAgIGlmICgoaWZvID0gZm9wZW4ocCwgInIiKSkgPT0gTlVMTCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIlVuYWJsZSB0byBvcGVuIElGTyBmaWxlIFwiJXNcIjogJXNcbiIsIHAsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisgICAgaWYgKGZyZWFkKGlmb3N0ciwgMTIsIDEsIGlmbykgIT0gMSB8fCBtZW1jbXAoaWZvc3RyLCAiRFZEVklERU8tVlRTIiwgMTIpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiXCIlc1wiIGlzIG5vdCBhIHByb3BlciBJRk8gZmlsZVxuIiwgcCk7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZiAoZnNlZWsoaWZvLCAweENDLCBTRUVLX1NFVCkgPT0gLTEpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZiAoZnJlYWQoJnNwX3BnY2ksIDQsIDEsIGlmbykgPT0gMSkgeworICAgICAgICBwZ2NpID0gYXZfYmUybmUzMihzcF9wZ2NpKSAqIDIwNDg7CisgICAgICAgIGlmIChmc2VlayhpZm8sIHBnY2kgKyAweDBDLCBTRUVLX1NFVCkgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyZWFkKCZvZmZfcGdjLCA0LCAxLCBpZm8pID09IDEpIHsKKyAgICAgICAgICAgIHBnYyA9IHBnY2kgKyBhdl9iZTJuZTMyKG9mZl9wZ2MpOworICAgICAgICAgICAgaWYgKGZzZWVrKGlmbywgcGdjICsgMHhBNCwgU0VFS19TRVQpID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnJlYWQoeXV2LCA2NCwgMSwgaWZvKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgYnVmID0geXV2OworICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8MTY7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB5ICA9ICorK2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgY3IgPSAqKytidWY7CisgICAgICAgICAgICAgICAgICAgIGNiID0gKisrYnVmOworICAgICAgICAgICAgICAgICAgICBZVVZfVE9fUkdCMV9DQ0lSKGNiLCBjcik7CisgICAgICAgICAgICAgICAgICAgIFlVVl9UT19SR0IyX0NDSVIociwgZywgYiwgeSk7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+cGFsZXR0ZVtpXSA9IChyIDw8IDE2KSArIChnIDw8IDgpICsgYjsKKyAgICAgICAgICAgICAgICAgICAgYnVmKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN0eC0+aGFzX3BhbGV0dGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChjdHgtPmhhc19wYWxldHRlID09IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gcmVhZCBwYWxldHRlIGZyb20gSUZPIGZpbGUgXCIlc1wiXG4iLCBwKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CitlbmQ6CisgICAgZmNsb3NlKGlmbyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkdmRzdWJfcGFyc2VfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBEVkRTdWJDb250ZXh0ICpjdHggPSAoRFZEU3ViQ29udGV4dCopIGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY2hhciAqZGF0YW9yaWcsICpkYXRhOworICAgIGludCByZXQgPSAxOworCisgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhIHx8ICFhdmN0eC0+ZXh0cmFkYXRhX3NpemUpCisgICAgICAgIHJldHVybiAxOworCisgICAgZGF0YW9yaWcgPSBkYXRhID0gYXZfbWFsbG9jKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSsxKTsKKyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWVtY3B5KGRhdGEsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgZGF0YVthdmN0eC0+ZXh0cmFkYXRhX3NpemVdID0gJ1wwJzsKKworICAgIGZvcig7OykgeworICAgICAgICBpbnQgcG9zID0gc3RyY3NwbihkYXRhLCAiXG5cciIpOworICAgICAgICBpZiAocG9zPT0wICYmICpkYXRhPT0wKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKHN0cm5jbXAoInBhbGV0dGU6IiwgZGF0YSwgOCkgPT0gMCkgeworICAgICAgICAgICAgcGFyc2VfcGFsZXR0ZShjdHgsIGRhdGEgKyA4KTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCJzaXplOiIsIGRhdGEsIDUpID09IDApIHsKKyAgICAgICAgICAgIGludCB3LCBoOworICAgICAgICAgICAgaWYgKHNzY2FuZihkYXRhICsgNSwgIiVkeCVkIiwgJncsICZoKSA9PSAyKSB7CisgICAgICAgICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgdywgaCk7CisgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IHBvczsKKyAgICAgICAgZGF0YSArPSBzdHJzcG4oZGF0YSwgIlxuXHIiKTsKKyAgICB9CisKK2ZhaWw6CisgICAgYXZfZnJlZShkYXRhb3JpZyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGR2ZHN1Yl9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBEVkRTdWJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGR2ZHN1Yl9wYXJzZV9leHRyYWRhdGEoYXZjdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoY3R4LT5pZm9fc3RyKQorICAgICAgICBwYXJzZV9pZm9fcGFsZXR0ZShjdHgsIGN0eC0+aWZvX3N0cik7CisgICAgaWYgKGN0eC0+cGFsZXR0ZV9zdHIpCisgICAgICAgIHBhcnNlX3BhbGV0dGUoY3R4LCBjdHgtPnBhbGV0dGVfc3RyKTsKKyAgICBpZiAoY3R4LT5oYXNfcGFsZXR0ZSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJwYWxldHRlOiIpOworICAgICAgICBmb3IoaT0wO2k8MTY7aSsrKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgMHglMDZ4IiwgY3R4LT5wYWxldHRlW2ldKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZHZkc3ViX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBEVkRTdWJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGF2X2ZyZWVwKCZjdHgtPmJ1Zik7CisgICAgY3R4LT5idWZfc2l6ZSA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKGZpZWxkKSBvZmZzZXRvZihEVkRTdWJDb250ZXh0LCBmaWVsZCkKKyNkZWZpbmUgU0QgQVZfT1BUX0ZMQUdfU1VCVElUTEVfUEFSQU0gfCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJwYWxldHRlIiwgInNldCB0aGUgZ2xvYmFsIHBhbGV0dGUiLCBPRkZTRVQocGFsZXR0ZV9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgMCwgMCwgU0QgfSwKKyAgICB7ICJpZm9fcGFsZXR0ZSIsICJvYnRhaW4gdGhlIGdsb2JhbCBwYWxldHRlIGZyb20gLklGTyBmaWxlIiwgT0ZGU0VUKGlmb19zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgMCwgMCwgU0QgfSwKKyAgICB7ICJmb3JjZWRfc3Vic19vbmx5IiwgIk9ubHkgc2hvdyBmb3JjZWQgc3VidGl0bGVzIiwgT0ZGU0VUKGZvcmNlZF9zdWJzX29ubHkpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIFNEfSwKKyAgICB7IE5VTEwgfQorfTsKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGR2ZHN1Yl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJkdmRzdWJkZWMiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9kdmRzdWJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZHZkc3ViIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRFZEIHN1YnRpdGxlcyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEUsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKERWRFN1YkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGR2ZHN1Yl9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGR2ZHN1Yl9kZWNvZGUsCisgICAgLmNsb3NlICAgICAgICAgID0gZHZkc3ViX2Nsb3NlLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZkdmRzdWJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHZkc3ViZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9kdmRzdWJlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjVmMGFmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHZkc3ViZW5jLmMKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiBEVkQgc3VidGl0bGUgZW5jb2RpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwNSBXb2xmcmFtIEdsb2dlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgdWludDMyX3QgZ2xvYmFsX3BhbGV0dGVbMTZdOworICAgIGludCBldmVuX3Jvd3NfZml4OworfSBEVkRTdWJ0aXRsZUNvbnRleHQ7CisKKy8vIG5jbnQgaXMgdGhlIG5pYmJsZSBjb3VudGVyCisjZGVmaW5lIFBVVE5JQkJMRSh2YWwpXAorZG8ge1wKKyAgICBpZiAobmNudCsrICYgMSlcCisgICAgICAgICpxKysgPSBiaXRidWYgfCAoKHZhbCkgJiAweDBmKTtcCisgICAgZWxzZVwKKyAgICAgICAgYml0YnVmID0gKHZhbCkgPDwgNDtcCit9IHdoaWxlKDApCisKK3N0YXRpYyB2b2lkIGR2ZF9lbmNvZGVfcmxlKHVpbnQ4X3QgKipwcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpdG1hcCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNtYXBbMjU2XSkKK3sKKyAgICB1aW50OF90ICpxOworICAgIHVuc2lnbmVkIGludCBiaXRidWYgPSAwOworICAgIGludCBuY250OworICAgIGludCB4LCB5LCBsZW4sIGNvbG9yOworCisgICAgcSA9ICpwcTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICAgICAgbmNudCA9IDA7CisgICAgICAgIGZvcih4ID0gMDsgeCA8IHc7IHggKz0gbGVuKSB7CisgICAgICAgICAgICBjb2xvciA9IGJpdG1hcFt4XTsKKyAgICAgICAgICAgIGZvciAobGVuPTE7IHgrbGVuIDwgdzsgKytsZW4pCisgICAgICAgICAgICAgICAgaWYgKGJpdG1hcFt4K2xlbl0gIT0gY29sb3IpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29sb3IgPSBjbWFwW2NvbG9yXTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoY29sb3IgPCA0KTsKKyAgICAgICAgICAgIGlmIChsZW4gPCAweDA0KSB7CisgICAgICAgICAgICAgICAgUFVUTklCQkxFKChsZW4gPDwgMil8Y29sb3IpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gPCAweDEwKSB7CisgICAgICAgICAgICAgICAgUFVUTklCQkxFKGxlbiA+PiAyKTsKKyAgICAgICAgICAgICAgICBQVVROSUJCTEUoKGxlbiA8PCAyKXxjb2xvcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA8IDB4NDApIHsKKyAgICAgICAgICAgICAgICBQVVROSUJCTEUoMCk7CisgICAgICAgICAgICAgICAgUFVUTklCQkxFKGxlbiA+PiAyKTsKKyAgICAgICAgICAgICAgICBQVVROSUJCTEUoKGxlbiA8PCAyKXxjb2xvcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHgrbGVuID09IHcpIHsKKyAgICAgICAgICAgICAgICBQVVROSUJCTEUoMCk7CisgICAgICAgICAgICAgICAgUFVUTklCQkxFKDApOworICAgICAgICAgICAgICAgIFBVVE5JQkJMRSgwKTsKKyAgICAgICAgICAgICAgICBQVVROSUJCTEUoY29sb3IpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gMHhmZikKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gMHhmZjsKKyAgICAgICAgICAgICAgICBQVVROSUJCTEUoMCk7CisgICAgICAgICAgICAgICAgUFVUTklCQkxFKGxlbiA+PiA2KTsKKyAgICAgICAgICAgICAgICBQVVROSUJCTEUobGVuID4+IDIpOworICAgICAgICAgICAgICAgIFBVVE5JQkJMRSgobGVuIDw8IDIpfGNvbG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBlbmQgb2YgbGluZSAqLworICAgICAgICBpZiAobmNudCAmIDEpCisgICAgICAgICAgICBQVVROSUJCTEUoMCk7CisgICAgICAgIGJpdG1hcCArPSBsaW5lc2l6ZTsKKyAgICB9CisKKyAgICAqcHEgPSBxOworfQorCitzdGF0aWMgaW50IGNvbG9yX2Rpc3RhbmNlKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgaW50IHIgPSAwLCBkLCBpOworICAgIGludCBhbHBoYV9hID0gOCwgYWxwaGFfYiA9IDg7CisKKyAgICBmb3IgKGkgPSAyNDsgaSA+PSAwOyBpIC09IDgpIHsKKyAgICAgICAgZCA9IGFscGhhX2EgKiAoaW50KSgoYSA+PiBpKSAmIDB4RkYpIC0KKyAgICAgICAgICAgIGFscGhhX2IgKiAoaW50KSgoYiA+PiBpKSAmIDB4RkYpOworICAgICAgICByICs9IGQgKiBkOworICAgICAgICBhbHBoYV9hID0gYSA+PiAyODsKKyAgICAgICAgYWxwaGFfYiA9IGIgPj4gMjg7CisgICAgfQorICAgIHJldHVybiByOworfQorCisvKioKKyAqIENvdW50IGNvbG9ycyB1c2VkIGluIGEgcmVjdGFuZ2xlLCBxdWFudGl6aW5nIGFscGhhIGFuZCBncm91cGluZyBieQorICogbmVhcmVzdCBnbG9iYWwgcGFsZXR0ZSBlbnRyeS4KKyAqLworc3RhdGljIHZvaWQgY291bnRfY29sb3JzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdW5zaWduZWQgaGl0c1szM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZTdWJ0aXRsZVJlY3QgKnIpCit7CisgICAgRFZEU3VidGl0bGVDb250ZXh0ICpkdmRjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1bnNpZ25lZCBjb3VudFsyNTZdID0geyAwIH07CisgICAgdWludDMyX3QgKnBhbGV0dGUgPSAodWludDMyX3QgKilyLT5waWN0LmRhdGFbMV07CisgICAgdWludDMyX3QgY29sb3I7CisgICAgaW50IHgsIHksIGksIGosIG1hdGNoLCBkLCBiZXN0X2QsIGF2X3VuaW5pdChiZXN0X2opOworICAgIHVpbnQ4X3QgKnAgPSByLT5waWN0LmRhdGFbMF07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgci0+aDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCByLT53OyB4KyspCisgICAgICAgICAgICBjb3VudFsqKHArKyldKys7CisgICAgICAgIHAgKz0gci0+cGljdC5saW5lc2l6ZVswXSAtIHItPnc7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBpZiAoIWNvdW50W2ldKSAvKiBhdm9pZCB1c2VsZXNzIHNlYXJjaCAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNvbG9yID0gcGFsZXR0ZVtpXTsKKyAgICAgICAgLyogMDogdHJhbnNwYXJlbnQsIDEtMTY6IHNlbWktdHJhbnNwYXJlbnQsIDE3LTMzIG9wYXF1ZSAqLworICAgICAgICBtYXRjaCA9IGNvbG9yIDwgMHgzMzAwMDAwMCA/IDAgOiBjb2xvciA8IDB4Q0MwMDAwMDAgPyAxIDogMTc7CisgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAgICAgYmVzdF9kID0gSU5UX01BWDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisgICAgICAgICAgICAgICAgZCA9IGNvbG9yX2Rpc3RhbmNlKDB4RkYwMDAwMDAgfCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRjAwMDAwMCB8IGR2ZGMtPmdsb2JhbF9wYWxldHRlW2pdKTsKKyAgICAgICAgICAgICAgICBpZiAoZCA8IGJlc3RfZCkgeworICAgICAgICAgICAgICAgICAgICBiZXN0X2QgPSBkOworICAgICAgICAgICAgICAgICAgICBiZXN0X2ogPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoICs9IGJlc3RfajsKKyAgICAgICAgfQorICAgICAgICBoaXRzW21hdGNoXSArPSBjb3VudFtpXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNlbGVjdF9wYWxldHRlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IG91dF9wYWxldHRlWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9hbHBoYVs0XSwgdW5zaWduZWQgaGl0c1szM10pCit7CisgICAgRFZEU3VidGl0bGVDb250ZXh0ICpkdmRjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgaiwgYnJpZ2h0LCBtdWx0OworICAgIHVpbnQzMl90IGNvbG9yOworICAgIGludCBzZWxlY3RlZFs0XSA9IHsgMCB9OworICAgIHVpbnQzMl90IHBzZXVkb3BhbFszM10gPSB7IDAgfTsKKyAgICB1aW50MzJfdCByZWZjb2xvclszXSA9IHsgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRiwgMHhGRjAwMDAwMCB9OworCisgICAgLyogQm9udXMgZm9yIHRyYW5zcGFyZW50OiBpZiB0aGUgcmVjdGFuZ2xlIGZpdHMgdGlnaHRseSB0aGUgdGV4dCwgdGhlCisgICAgICAgYmFja2dyb3VuZCBjb2xvciBjYW4gYmUgcXVpdGUgcmFyZSwgYnV0IGl0IHdvdWxkIGJlIHVnbHkgd2l0aG91dCBpdCAqLworICAgIGhpdHNbMF0gKj0gMTY7CisgICAgLyogQm9udXMgZm9yIGJyaWdodCBjb2xvcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBpZiAoIShoaXRzWzEgKyBpXSArIGhpdHNbMTcgKyBpXSkpCisgICAgICAgICAgICBjb250aW51ZTsgLyogc2tpcCB1bnVzZWQgY29sb3JzIHRvIGdhaW4gdGltZSAqLworICAgICAgICBjb2xvciA9IGR2ZGMtPmdsb2JhbF9wYWxldHRlW2ldOworICAgICAgICBicmlnaHQgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrLCBjb2xvciA+Pj0gOCkKKyAgICAgICAgICAgIGJyaWdodCArPSAoY29sb3IgJiAweEZGKSA8IDB4NDAgfHwgKGNvbG9yICYgMHhGRikgPj0gMHhDMDsKKyAgICAgICAgbXVsdCA9IDIgKyBGRk1JTihicmlnaHQsIDIpOworICAgICAgICBoaXRzWyAxICsgaV0gKj0gbXVsdDsKKyAgICAgICAgaGl0c1sxNyArIGldICo9IG11bHQ7CisgICAgfQorCisgICAgLyogU2VsZWN0IGZvdXIgbW9zdCBmcmVxdWVudCBjb2xvcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAzMzsgaisrKQorICAgICAgICAgICAgaWYgKGhpdHNbal0gPiBoaXRzW3NlbGVjdGVkW2ldXSkKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFtpXSA9IGo7CisgICAgICAgIGhpdHNbc2VsZWN0ZWRbaV1dID0gMDsKKyAgICB9CisKKyAgICAvKiBPcmRlciB0aGUgY29sb3JzIGxpa2UgaW4gbW9zdCBEVkRzOgorICAgICAgIDA6IGJhY2tncm91bmQsIDE6IGZvcmVncm91bmQsIDI6IG91dGxpbmUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBwc2V1ZG9wYWxbIDEgKyBpXSA9IDB4ODAwMDAwMDAgfCBkdmRjLT5nbG9iYWxfcGFsZXR0ZVtpXTsKKyAgICAgICAgcHNldWRvcGFsWzE3ICsgaV0gPSAweEZGMDAwMDAwIHwgZHZkYy0+Z2xvYmFsX3BhbGV0dGVbaV07CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaW50IGJlc3RfZCA9IGNvbG9yX2Rpc3RhbmNlKHJlZmNvbG9yW2ldLCBwc2V1ZG9wYWxbc2VsZWN0ZWRbaV1dKTsKKyAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgIGludCBkID0gY29sb3JfZGlzdGFuY2UocmVmY29sb3JbaV0sIHBzZXVkb3BhbFtzZWxlY3RlZFtqXV0pOworICAgICAgICAgICAgaWYgKGQgPCBiZXN0X2QpIHsKKyAgICAgICAgICAgICAgICBGRlNXQVAoaW50LCBzZWxlY3RlZFtpXSwgc2VsZWN0ZWRbal0pOworICAgICAgICAgICAgICAgIGJlc3RfZCA9IGQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBPdXRwdXQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIG91dF9wYWxldHRlW2ldID0gc2VsZWN0ZWRbaV0gPyAoc2VsZWN0ZWRbaV0gLSAxKSAmIDB4RiA6IDA7CisgICAgICAgIG91dF9hbHBoYSAgW2ldID0gIXNlbGVjdGVkW2ldID8gMCA6IHNlbGVjdGVkW2ldIDwgMTcgPyAweDgwIDogMHhGRjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2NvbG9yX21hcChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBjbWFwW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcGFsZXR0ZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdXRfcGFsZXR0ZVtdLCB1bnNpZ25lZCBpbnQgY29uc3Qgb3V0X2FscGhhW10pCit7CisgICAgRFZEU3VidGl0bGVDb250ZXh0ICpkdmRjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgaiwgZCwgYmVzdF9kOworICAgIHVpbnQzMl90IHBzZXVkb3BhbFs0XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHBzZXVkb3BhbFtpXSA9IChvdXRfYWxwaGFbaV0gPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgZHZkYy0+Z2xvYmFsX3BhbGV0dGVbb3V0X3BhbGV0dGVbaV1dOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBiZXN0X2QgPSBJTlRfTUFYOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICBkID0gY29sb3JfZGlzdGFuY2UocHNldWRvcGFsW2pdLCBwYWxldHRlW2ldKTsKKyAgICAgICAgICAgIGlmIChkIDwgYmVzdF9kKSB7CisgICAgICAgICAgICAgICAgY21hcFtpXSA9IGo7CisgICAgICAgICAgICAgICAgYmVzdF9kID0gZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgY29weV9yZWN0YW5nbGUoQVZTdWJ0aXRsZVJlY3QgKmRzdCwgQVZTdWJ0aXRsZVJlY3QgKnNyYywgaW50IGNtYXBbXSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICB1aW50OF90ICpwLCAqcTsKKworICAgIHAgPSBzcmMtPnBpY3QuZGF0YVswXTsKKyAgICBxID0gZHN0LT5waWN0LmRhdGFbMF0gKyAoc3JjLT54IC0gZHN0LT54KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNyYy0+eSAtIGRzdC0+eSkgKiBkc3QtPnBpY3QubGluZXNpemVbMF07CisgICAgZm9yICh5ID0gMDsgeSA8IHNyYy0+aDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzcmMtPnc7IHgrKykKKyAgICAgICAgICAgICoocSsrKSA9IGNtYXBbKihwKyspXTsKKyAgICAgICAgcCArPSBzcmMtPnBpY3QubGluZXNpemVbMF0gLSBzcmMtPnc7CisgICAgICAgIHEgKz0gZHN0LT5waWN0LmxpbmVzaXplWzBdIC0gc3JjLT53OworICAgIH0KK30KKworc3RhdGljIGludCBlbmNvZGVfZHZkX3N1YnRpdGxlcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm91dGJ1ZiwgaW50IG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlN1YnRpdGxlICpoKQoreworICAgIERWRFN1YnRpdGxlQ29udGV4dCAqZHZkYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqcSwgKnFxOworICAgIGludCBvZmZzZXQxLCBvZmZzZXQyOworICAgIGludCBpLCByZWN0cyA9IGgtPm51bV9yZWN0cywgcmV0OworICAgIHVuc2lnbmVkIGdsb2JhbF9wYWxldHRlX2hpdHNbMzNdID0geyAwIH07CisgICAgaW50IGNtYXBbMjU2XTsKKyAgICBpbnQgb3V0X3BhbGV0dGVbNF07CisgICAgaW50IG91dF9hbHBoYVs0XTsKKyAgICBBVlN1YnRpdGxlUmVjdCB2cmVjdDsKKyAgICB1aW50OF90ICp2cmVjdF9kYXRhID0gTlVMTDsKKyAgICBpbnQgeDIsIHkyOworICAgIGludCBmb3JjZWQgPSAwOworCisgICAgaWYgKHJlY3RzID09IDAgfHwgIWgtPnJlY3RzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGZvciAoaSA9IDA7IGkgPCByZWN0czsgaSsrKQorICAgICAgICBpZiAoaC0+cmVjdHNbaV0tPnR5cGUgIT0gU1VCVElUTEVfQklUTUFQKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJpdG1hcCBzdWJ0aXRsZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgLyogTWFyayB0aGlzIHN1YnRpdGxlIGZvcmNlZCBpZiBhbnkgb2YgdGhlIHJlY3RhbmdsZXMgaXMgZm9yY2VkLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCByZWN0czsgaSsrKQorICAgICAgICBpZiAoKGgtPnJlY3RzW2ldLT5mbGFncyAmIEFWX1NVQlRJVExFX0ZMQUdfRk9SQ0VEKSAhPSAwKSB7CisgICAgICAgICAgICBmb3JjZWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB2cmVjdCA9ICpoLT5yZWN0c1swXTsKKworICAgIGlmIChyZWN0cyA+IDEpIHsKKyAgICAgICAgLyogRFZEIHN1YnRpdGxlcyBjYW4gaGF2ZSBvbmx5IG9uZSByZWN0YW5nbGU6IGJ1aWxkIGEgdmlydHVhbAorICAgICAgICAgICByZWN0YW5nbGUgY29udGFpbmluZyBhbGwgYWN0dWFsIHJlY3RhbmdsZXMuCisgICAgICAgICAgIFRoZSBkYXRhIG9mIHRoZSByZWN0YW5nbGVzIHdpbGwgYmUgY29waWVkIGxhdGVyLCB3aGVuIHRoZSBwYWxldHRlCisgICAgICAgICAgIGlzIGRlY2lkZWQsIGJlY2F1c2UgdGhlIHJlY3RhbmdsZXMgbWF5IGhhdmUgZGlmZmVyZW50IHBhbGV0dGVzLiAqLworICAgICAgICBpbnQgeG1pbiA9IGgtPnJlY3RzWzBdLT54LCB4bWF4ID0geG1pbiArIGgtPnJlY3RzWzBdLT53OworICAgICAgICBpbnQgeW1pbiA9IGgtPnJlY3RzWzBdLT55LCB5bWF4ID0geW1pbiArIGgtPnJlY3RzWzBdLT5oOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcmVjdHM7IGkrKykgeworICAgICAgICAgICAgeG1pbiA9IEZGTUlOKHhtaW4sIGgtPnJlY3RzW2ldLT54KTsKKyAgICAgICAgICAgIHltaW4gPSBGRk1JTih5bWluLCBoLT5yZWN0c1tpXS0+eSk7CisgICAgICAgICAgICB4bWF4ID0gRkZNQVgoeG1heCwgaC0+cmVjdHNbaV0tPnggKyBoLT5yZWN0c1tpXS0+dyk7CisgICAgICAgICAgICB5bWF4ID0gRkZNQVgoeW1heCwgaC0+cmVjdHNbaV0tPnkgKyBoLT5yZWN0c1tpXS0+aCk7CisgICAgICAgIH0KKyAgICAgICAgdnJlY3QueCA9IHhtaW47CisgICAgICAgIHZyZWN0LnkgPSB5bWluOworICAgICAgICB2cmVjdC53ID0geG1heCAtIHhtaW47CisgICAgICAgIHZyZWN0LmggPSB5bWF4IC0geW1pbjsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKHZyZWN0LncsIHZyZWN0LmgsIDAsIGF2Y3R4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAvKiBDb3VudCBwaXhlbHMgb3V0c2lkZSB0aGUgdmlydHVhbCByZWN0YW5nbGUgYXMgdHJhbnNwYXJlbnQgKi8KKyAgICAgICAgZ2xvYmFsX3BhbGV0dGVfaGl0c1swXSA9IHZyZWN0LncgKiB2cmVjdC5oOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVjdHM7IGkrKykKKyAgICAgICAgICAgIGdsb2JhbF9wYWxldHRlX2hpdHNbMF0gLT0gaC0+cmVjdHNbaV0tPncgKiBoLT5yZWN0c1tpXS0+aDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVjdHM7IGkrKykKKyAgICAgICAgY291bnRfY29sb3JzKGF2Y3R4LCBnbG9iYWxfcGFsZXR0ZV9oaXRzLCBoLT5yZWN0c1tpXSk7CisgICAgc2VsZWN0X3BhbGV0dGUoYXZjdHgsIG91dF9wYWxldHRlLCBvdXRfYWxwaGEsIGdsb2JhbF9wYWxldHRlX2hpdHMpOworCisgICAgaWYgKHJlY3RzID4gMSkgeworICAgICAgICBpZiAoISh2cmVjdF9kYXRhID0gYXZfY2FsbG9jKHZyZWN0LncsIHZyZWN0LmgpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHZyZWN0LnBpY3QuZGF0YSAgICBbMF0gPSB2cmVjdF9kYXRhOworICAgICAgICB2cmVjdC5waWN0LmxpbmVzaXplWzBdID0gdnJlY3QudzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlY3RzOyBpKyspIHsKKyAgICAgICAgICAgIGJ1aWxkX2NvbG9yX21hcChhdmN0eCwgY21hcCwgKHVpbnQzMl90ICopaC0+cmVjdHNbaV0tPnBpY3QuZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcGFsZXR0ZSwgb3V0X2FscGhhKTsKKyAgICAgICAgICAgIGNvcHlfcmVjdGFuZ2xlKCZ2cmVjdCwgaC0+cmVjdHNbaV0sIGNtYXApOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBjbWFwW2ldID0gaTsKKyAgICB9IGVsc2UgeworICAgICAgICBidWlsZF9jb2xvcl9tYXAoYXZjdHgsIGNtYXAsICh1aW50MzJfdCAqKWgtPnJlY3RzWzBdLT5waWN0LmRhdGFbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcGFsZXR0ZSwgb3V0X2FscGhhKTsKKyAgICB9CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlNlbGVjdGVkIHBhbGV0dGU6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgMHglMDZ4QEAlMDJ4ICgweCV4LDB4JXgpIiwKKyAgICAgICAgICAgICAgIGR2ZGMtPmdsb2JhbF9wYWxldHRlW291dF9wYWxldHRlW2ldXSwgb3V0X2FscGhhW2ldLAorICAgICAgICAgICAgICAgb3V0X3BhbGV0dGVbaV0sIG91dF9hbHBoYVtpXSA+PiA0KTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7CisKKyAgICAvLyBlbmNvZGUgZGF0YSBibG9jaworICAgIHEgPSBvdXRidWYgKyA0OworICAgIG9mZnNldDEgPSBxIC0gb3V0YnVmOworICAgIC8vIHdvcnN0IGNhc2UgbWVtb3J5IHJlcXVpcmVtZW50OiAxIG5pYmJsZSBwZXIgcGl4ZWwuLgorICAgIGlmICgocSAtIG91dGJ1ZikgKyB2cmVjdC53ICogdnJlY3QuaCAvIDIgKyAxNyArIDIxID4gb3V0YnVmX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImR2ZF9zdWJ0aXRsZSB0b28gYmlnXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGR2ZF9lbmNvZGVfcmxlKCZxLCB2cmVjdC5waWN0LmRhdGFbMF0sIHZyZWN0LncgKiAyLAorICAgICAgICAgICAgICAgICAgIHZyZWN0LncsICh2cmVjdC5oICsgMSkgPj4gMSwgY21hcCk7CisgICAgb2Zmc2V0MiA9IHEgLSBvdXRidWY7CisgICAgZHZkX2VuY29kZV9ybGUoJnEsIHZyZWN0LnBpY3QuZGF0YVswXSArIHZyZWN0LncsIHZyZWN0LncgKiAyLAorICAgICAgICAgICAgICAgICAgIHZyZWN0LncsIHZyZWN0LmggPj4gMSwgY21hcCk7CisKKyAgICBpZiAoZHZkYy0+ZXZlbl9yb3dzX2ZpeCAmJiAodnJlY3QuaCAmIDEpKSB7CisgICAgICAgIC8vIFdvcmstYXJvdW5kIGZvciBzb21lIHBsYXllcnMgdGhhdCB3YW50IHRoZSBoZWlnaHQgdG8gYmUgZXZlbi4KKyAgICAgICAgdnJlY3QuaCsrOworICAgICAgICAqcSsrID0gMHgwMDsgLy8gMHgwMCAweDAwID09IGVtcHR5IHJvdywgaS5lLiBmdWxseSB0cmFuc3BhcmVudAorICAgICAgICAqcSsrID0gMHgwMDsKKyAgICB9CisKKyAgICAvLyBzZXQgZGF0YSBwYWNrZXQgc2l6ZQorICAgIHFxID0gb3V0YnVmICsgMjsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZxcSwgcSAtIG91dGJ1Zik7CisKKyAgICAvLyBzZW5kIHN0YXJ0IGRpc3BsYXkgY29tbWFuZAorICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnEsIChoLT5zdGFydF9kaXNwbGF5X3RpbWUqOTApID4+IDEwKTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZxLCAocSAtIG91dGJ1ZikgLyotIDIgKi8gKyA4ICsgMTIgKyAyKTsKKyAgICAqcSsrID0gMHgwMzsgLy8gcGFsZXR0ZSAtIDQgbmliYmxlcworICAgICpxKysgPSAob3V0X3BhbGV0dGVbM10gPDwgNCkgfCBvdXRfcGFsZXR0ZVsyXTsKKyAgICAqcSsrID0gKG91dF9wYWxldHRlWzFdIDw8IDQpIHwgb3V0X3BhbGV0dGVbMF07CisgICAgKnErKyA9IDB4MDQ7IC8vIGFscGhhIC0gNCBuaWJibGVzCisgICAgKnErKyA9IChvdXRfYWxwaGFbM10gJiAweEYwKSB8IChvdXRfYWxwaGFbMl0gPj4gNCk7CisgICAgKnErKyA9IChvdXRfYWxwaGFbMV0gJiAweEYwKSB8IChvdXRfYWxwaGFbMF0gPj4gNCk7CisKKyAgICAvLyAxMiBieXRlcyBwZXIgcmVjdAorICAgIHgyID0gdnJlY3QueCArIHZyZWN0LncgLSAxOworICAgIHkyID0gdnJlY3QueSArIHZyZWN0LmggLSAxOworCisgICAgKnErKyA9IDB4MDU7CisgICAgLy8geDEgeDIgLT4gNiBuaWJibGVzCisgICAgKnErKyA9IHZyZWN0LnggPj4gNDsKKyAgICAqcSsrID0gKHZyZWN0LnggPDwgNCkgfCAoKHgyID4+IDgpICYgMHhmKTsKKyAgICAqcSsrID0geDI7CisgICAgLy8geTEgeTIgLT4gNiBuaWJibGVzCisgICAgKnErKyA9IHZyZWN0LnkgPj4gNDsKKyAgICAqcSsrID0gKHZyZWN0LnkgPDwgNCkgfCAoKHkyID4+IDgpICYgMHhmKTsKKyAgICAqcSsrID0geTI7CisKKyAgICAqcSsrID0gMHgwNjsKKyAgICAvLyBvZmZzZXQxLCBvZmZzZXQyCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcSwgb2Zmc2V0MSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcSwgb2Zmc2V0Mik7CisKKyAgICAqcSsrID0gZm9yY2VkID8gMHgwMCA6IDB4MDE7IC8vIHN0YXJ0IGNvbW1hbmQKKyAgICAqcSsrID0gMHhmZjsgLy8gdGVybWluYXRpbmcgY29tbWFuZAorCisgICAgLy8gc2VuZCBzdG9wIGRpc3BsYXkgY29tbWFuZCBsYXN0CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcSwgKGgtPmVuZF9kaXNwbGF5X3RpbWUqOTApID4+IDEwKTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZxLCAocSAtIG91dGJ1ZikgLSAyIC8qKyA0Ki8pOworICAgICpxKysgPSAweDAyOyAvLyBzZXQgZW5kCisgICAgKnErKyA9IDB4ZmY7IC8vIHRlcm1pbmF0aW5nIGNvbW1hbmQKKworICAgIHFxID0gb3V0YnVmOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnFxLCBxIC0gb3V0YnVmKTsKKworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJzdWJ0aXRsZV9wYWNrZXQgc2l6ZT0lIlBUUkRJRkZfU1BFQ0lGSUVSIlxuIiwgcSAtIG91dGJ1Zik7CisgICAgcmV0ID0gcSAtIG91dGJ1ZjsKKworZmFpbDoKKyAgICBhdl9mcmVlKHZyZWN0X2RhdGEpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHZkc3ViX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIERWRFN1YnRpdGxlQ29udGV4dCAqZHZkYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGRlZmF1bHRfcGFsZXR0ZVsxNl0gPSB7CisgICAgICAgIDB4MDAwMDAwLCAweDAwMDBGRiwgMHgwMEZGMDAsIDB4RkYwMDAwLAorICAgICAgICAweEZGRkYwMCwgMHhGRjAwRkYsIDB4MDBGRkZGLCAweEZGRkZGRiwKKyAgICAgICAgMHg4MDgwMDAsIDB4ODA4MEZGLCAweDgwMDA4MCwgMHg4MEZGODAsCisgICAgICAgIDB4MDA4MDgwLCAweEZGODA4MCwgMHg1NTU1NTUsIDB4QUFBQUFBLAorICAgIH07CisgICAgQVZCUHJpbnQgZXh0cmFkYXRhOworICAgIGludCBpLCByZXQ7CisKKyAgICBhdl9hc3NlcnQwKHNpemVvZihkdmRjLT5nbG9iYWxfcGFsZXR0ZSkgPT0gc2l6ZW9mKGRlZmF1bHRfcGFsZXR0ZSkpOworICAgIG1lbWNweShkdmRjLT5nbG9iYWxfcGFsZXR0ZSwgZGVmYXVsdF9wYWxldHRlLCBzaXplb2YoZHZkYy0+Z2xvYmFsX3BhbGV0dGUpKTsKKworICAgIGF2X2JwcmludF9pbml0KCZleHRyYWRhdGEsIDAsIDEpOworICAgIGlmIChhdmN0eC0+d2lkdGggJiYgYXZjdHgtPmhlaWdodCkKKyAgICAgICAgYXZfYnByaW50ZigmZXh0cmFkYXRhLCAic2l6ZTogJWR4JWRcbiIsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgYXZfYnByaW50ZigmZXh0cmFkYXRhLCAicGFsZXR0ZToiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgYXZfYnByaW50ZigmZXh0cmFkYXRhLCAiICUwNiJQUkl4MzIiJWMiLAorICAgICAgICAgICAgICAgICAgIGR2ZGMtPmdsb2JhbF9wYWxldHRlW2ldICYgMHhGRkZGRkYsIGkgPCAxNSA/ICcsJyA6ICdcbicpOworCisgICAgcmV0ID0gYXZwcml2X2JwcmludF90b19leHRyYWRhdGEoYXZjdHgsICZleHRyYWRhdGEpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHZkc3ViX2VuY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZTdWJ0aXRsZSAqc3ViKQoreworICAgIC8vRFZEU3VidGl0bGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZW5jb2RlX2R2ZF9zdWJ0aXRsZXMoYXZjdHgsIGJ1ZiwgYnVmX3NpemUsIHN1Yik7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRFZEU3VidGl0bGVDb250ZXh0LCB4KQorI2RlZmluZSBTRSBBVl9PUFRfRkxBR19TVUJUSVRMRV9QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsiZXZlbl9yb3dzX2ZpeCIsICJNYWtlIG51bWJlciBvZiByb3dzIGV2ZW4gKHdvcmthcm91bmQgZm9yIHNvbWUgcGxheWVycykiLCBPRkZTRVQoZXZlbl9yb3dzX2ZpeCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMSwgU0V9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZHZkc3ViZW5jX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlZPQlNVQiBzdWJ0aXRsZSBlbmNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfZHZkc3ViX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImR2ZHN1YiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRWRCBzdWJ0aXRsZXMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRFZEX1NVQlRJVExFLAorICAgIC5pbml0ICAgICAgICAgICA9IGR2ZHN1Yl9pbml0LAorICAgIC5lbmNvZGVfc3ViICAgICA9IGR2ZHN1Yl9lbmNvZGUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmR2ZHN1YmVuY19jbGFzcywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRFZEU3VidGl0bGVDb250ZXh0KSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9kdmVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDgxMGUzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHZlbmMuYwpAQCAtMCwwICsxLDc2NiBAQAorLyoKKyAqIERWIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBSb21hbiBTaGFwb3NobmlrCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIERWIGVuY29kZXIKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZHYuaCIKKyNpbmNsdWRlICJkdl9wcm9maWxlX2ludGVybmFsLmgiCisjaW5jbHVkZSAiZHZfdGFibGVnZW4uaCIKKyNpbmNsdWRlICJmZGN0ZHNwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZV9jbXAuaCIKKyNpbmNsdWRlICJwaXhibG9ja2RzcC5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCBkdnZpZGVvX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBEVlZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgRkRDVERTUENvbnRleHQgZmRzcDsKKyAgICBNRUNtcENvbnRleHQgbWVjYzsKKyAgICBQaXhibG9ja0RTUENvbnRleHQgcGRzcDsKKyAgICBpbnQgcmV0OworCisgICAgcy0+c3lzID0gYXZfZHZfY29kZWNfcHJvZmlsZShhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIGF2Y3R4LT5waXhfZm10KTsKKyAgICBpZiAoIXMtPnN5cykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZvdW5kIG5vIERWIHByb2ZpbGUgZm9yICVpeCVpICVzIHZpZGVvLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsaWQgRFYgcHJvZmlsZXMgYXJlOlxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgYXZfZ2V0X3BpeF9mbXRfbmFtZShhdmN0eC0+cGl4X2ZtdCkpOworICAgICAgICBmZl9kdl9wcmludF9wcm9maWxlcyhhdmN0eCwgQVZfTE9HX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKGF2Y3R4LT5oZWlnaHQgPiA1NzYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEVkNQUk8gSEQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIHJldCA9IGZmX2R2X2luaXRfZHluYW1pY190YWJsZXMocywgcy0+c3lzKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyB3b3JrIHRhYmxlcy5cbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBkdl92bGNfbWFwX3RhYmxlaW5pdCgpOworCisgICAgbWVtc2V0KCZmZHNwLDAsIHNpemVvZihmZHNwKSk7CisgICAgbWVtc2V0KCZtZWNjLDAsIHNpemVvZihtZWNjKSk7CisgICAgbWVtc2V0KCZwZHNwLDAsIHNpemVvZihwZHNwKSk7CisgICAgZmZfZmRjdGRzcF9pbml0KCZmZHNwLCBhdmN0eCk7CisgICAgZmZfbWVfY21wX2luaXQoJm1lY2MsIGF2Y3R4KTsKKyAgICBmZl9waXhibG9ja2RzcF9pbml0KCZwZHNwLCBhdmN0eCk7CisgICAgZmZfc2V0X2NtcCgmbWVjYywgbWVjYy5pbGRjdF9jbXAsIGF2Y3R4LT5pbGRjdF9jbXApOworCisgICAgcy0+Z2V0X3BpeGVscyA9IHBkc3AuZ2V0X3BpeGVsczsKKyAgICBzLT5pbGRjdF9jbXAgID0gbWVjYy5pbGRjdF9jbXBbNV07CisKKyAgICBzLT5mZGN0WzBdICAgID0gZmRzcC5mZGN0OworICAgIHMtPmZkY3RbMV0gICAgPSBmZHNwLmZkY3QyNDg7CisKKyAgICByZXR1cm4gZmZfZHZ2aWRlb19pbml0KGF2Y3R4KTsKK30KKworLyogYml0IGJ1ZGdldCBmb3IgQUMgb25seSBpbiA1IE1CcyAqLworc3RhdGljIGNvbnN0IGludCB2c190b3RhbF9hY19iaXRzID0gKDEwMCAqIDQgKyA2OCAqIDIpICogNTsKK3N0YXRpYyBjb25zdCBpbnQgbWJfYXJlYV9zdGFydFs1XSA9IHsgMSwgNiwgMjEsIDQzLCA2NCB9OworCisjaWYgQ09ORklHX1NNQUxMCisvKiBDb252ZXJ0IHJ1biBhbmQgbGV2ZWwgKHdoZXJlIGxldmVsICE9IDApIHBhaXIgaW50byBWTEMsIHJldHVybmluZyBiaXQgc2l6ZSAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGR2X3JsMnZsYyhpbnQgcnVuLCBpbnQgbGV2ZWwsIGludCBzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdmxjKQoreworICAgIGludCBzaXplOworICAgIGlmIChydW4gPCBEVl9WTENfTUFQX1JVTl9TSVpFICYmIGxldmVsIDwgRFZfVkxDX01BUF9MRVZfU0laRSkgeworICAgICAgICAqdmxjID0gZHZfdmxjX21hcFtydW5dW2xldmVsXS52bGMgfCBzaWduOworICAgICAgICBzaXplID0gZHZfdmxjX21hcFtydW5dW2xldmVsXS5zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsZXZlbCA8IERWX1ZMQ19NQVBfTEVWX1NJWkUpIHsKKyAgICAgICAgICAgICp2bGMgPSBkdl92bGNfbWFwWzBdW2xldmVsXS52bGMgfCBzaWduOworICAgICAgICAgICAgc2l6ZSA9IGR2X3ZsY19tYXBbMF1bbGV2ZWxdLnNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqdmxjID0gMHhmZTAwIHwgKGxldmVsIDw8IDEpIHwgc2lnbjsKKyAgICAgICAgICAgIHNpemUgPSAxNjsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVuKSB7CisgICAgICAgICAgICAqdmxjIHw9ICgocnVuIDwgMTYpID8gZHZfdmxjX21hcFtydW4gLSAxXVswXS52bGMgOgorICAgICAgICAgICAgICAgICAgICAgKDB4MWY4MCB8IChydW4gLSAxKSkpIDw8IHNpemU7CisgICAgICAgICAgICBzaXplICs9ICAocnVuIDwgMTYpID8gZHZfdmxjX21hcFtydW4gLSAxXVswXS5zaXplIDogMTM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGR2X3JsMnZsY19zaXplKGludCBydW4sIGludCBsZXZlbCkKK3sKKyAgICBpbnQgc2l6ZTsKKworICAgIGlmIChydW4gPCBEVl9WTENfTUFQX1JVTl9TSVpFICYmIGxldmVsIDwgRFZfVkxDX01BUF9MRVZfU0laRSkgeworICAgICAgICBzaXplID0gZHZfdmxjX21hcFtydW5dW2xldmVsXS5zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemUgPSAobGV2ZWwgPCBEVl9WTENfTUFQX0xFVl9TSVpFKSA/IGR2X3ZsY19tYXBbMF1bbGV2ZWxdLnNpemUgOiAxNjsKKyAgICAgICAgaWYgKHJ1bikKKyAgICAgICAgICAgIHNpemUgKz0gKHJ1biA8IDE2KSA/IGR2X3ZsY19tYXBbcnVuIC0gMV1bMF0uc2l6ZSA6IDEzOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKyNlbHNlCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZHZfcmwydmxjKGludCBydW4sIGludCBsLCBpbnQgc2lnbiwgdWludDMyX3QgKnZsYykKK3sKKyAgICAqdmxjID0gZHZfdmxjX21hcFtydW5dW2xdLnZsYyB8IHNpZ247CisgICAgcmV0dXJuIGR2X3ZsY19tYXBbcnVuXVtsXS5zaXplOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZHZfcmwydmxjX3NpemUoaW50IHJ1biwgaW50IGwpCit7CisgICAgcmV0dXJuIGR2X3ZsY19tYXBbcnVuXVtsXS5zaXplOworfQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEVuY0Jsb2NrSW5mbyB7CisgICAgaW50ICAgICAgYXJlYV9xWzRdOworICAgIGludCAgICAgIGJpdF9zaXplWzRdOworICAgIGludCAgICAgIHByZXZbNV07CisgICAgaW50ICAgICAgY3VyX2FjOworICAgIGludCAgICAgIGNubzsKKyAgICBpbnQgICAgICBkY3RfbW9kZTsKKyAgICBpbnQxNl90ICBtYls2NF07CisgICAgdWludDhfdCAgbmV4dFs2NF07CisgICAgdWludDhfdCAgc2lnbls2NF07CisgICAgdWludDhfdCAgcGFydGlhbF9iaXRfY291bnQ7CisgICAgdWludDMyX3QgcGFydGlhbF9iaXRfYnVmZmVyOyAvKiB3ZSBjYW4ndCB1c2UgdWludDE2X3QgaGVyZSAqLworfSBFbmNCbG9ja0luZm87CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIFB1dEJpdENvbnRleHQgKmR2X2VuY29kZV9hYyhFbmNCbG9ja0luZm8gKmJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKnBiX3Bvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqcGJfZW5kKQoreworICAgIGludCBwcmV2LCBiaXRzX2xlZnQ7CisgICAgUHV0Qml0Q29udGV4dCAqcGIgPSBwYl9wb29sOworICAgIGludCBzaXplICAgICAgICAgID0gYmktPnBhcnRpYWxfYml0X2NvdW50OworICAgIHVpbnQzMl90IHZsYyAgICAgID0gYmktPnBhcnRpYWxfYml0X2J1ZmZlcjsKKworICAgIGJpLT5wYXJ0aWFsX2JpdF9jb3VudCAgPQorICAgIGJpLT5wYXJ0aWFsX2JpdF9idWZmZXIgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogRmluZCBzdWl0YWJsZSBzdG9yYWdlIHNwYWNlICovCisgICAgICAgIGZvciAoOyBzaXplID4gKGJpdHNfbGVmdCA9IHB1dF9iaXRzX2xlZnQocGIpKTsgcGIrKykgeworICAgICAgICAgICAgaWYgKGJpdHNfbGVmdCkgeworICAgICAgICAgICAgICAgIHNpemUgLT0gYml0c19sZWZ0OworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBiaXRzX2xlZnQsIHZsYyA+PiBzaXplKTsKKyAgICAgICAgICAgICAgICB2bGMgPSB2bGMgJiAoKDEgPDwgc2l6ZSkgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYiArIDEgPj0gcGJfZW5kKSB7CisgICAgICAgICAgICAgICAgYmktPnBhcnRpYWxfYml0X2NvdW50ICA9IHNpemU7CisgICAgICAgICAgICAgICAgYmktPnBhcnRpYWxfYml0X2J1ZmZlciA9IHZsYzsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTdG9yZSBWTEMgKi8KKyAgICAgICAgcHV0X2JpdHMocGIsIHNpemUsIHZsYyk7CisKKyAgICAgICAgaWYgKGJpLT5jdXJfYWMgPj0gNjQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBDb25zdHJ1Y3QgdGhlIG5leHQgVkxDICovCisgICAgICAgIHByZXYgICAgICAgPSBiaS0+Y3VyX2FjOworICAgICAgICBiaS0+Y3VyX2FjID0gYmktPm5leHRbcHJldl07CisgICAgICAgIGlmIChiaS0+Y3VyX2FjIDwgNjQpIHsKKyAgICAgICAgICAgIHNpemUgPSBkdl9ybDJ2bGMoYmktPmN1cl9hYyAtIHByZXYgLSAxLCBiaS0+bWJbYmktPmN1cl9hY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpLT5zaWduW2JpLT5jdXJfYWNdLCAmdmxjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgPSA0OworICAgICAgICAgICAgdmxjICA9IDY7IC8qIEVuZCBPZiBCbG9jayBzdGFtcCAqLworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYjsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGR2X2d1ZXNzX2RjdF9tb2RlKERWVmlkZW9Db250ZXh0ICpzLCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSkKK3sKKyAgICBpZiAocy0+YXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVCkgeworICAgICAgICBpbnQgcHMgPSBzLT5pbGRjdF9jbXAoTlVMTCwgZGF0YSwgTlVMTCwgbGluZXNpemUsIDgpIC0gNDAwOworICAgICAgICBpZiAocHMgPiAwKSB7CisgICAgICAgICAgICBpbnQgaXMgPSBzLT5pbGRjdF9jbXAoTlVMTCwgZGF0YSwgICAgICAgICAgICBOVUxMLCBsaW5lc2l6ZSA8PCAxLCA0KSArCisgICAgICAgICAgICAgICAgICAgICBzLT5pbGRjdF9jbXAoTlVMTCwgZGF0YSArIGxpbmVzaXplLCBOVUxMLCBsaW5lc2l6ZSA8PCAxLCA0KTsKKyAgICAgICAgICAgIHJldHVybiBwcyA+IGlzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgZHZfd2VpZ2h0X2JpdHMgPSAxODsKK3N0YXRpYyBjb25zdCBpbnQgZHZfd2VpZ2h0Xzg4WzY0XSA9IHsKKyAgICAxMzEwNzIsIDI1NzEwNywgMjU3MTA3LCAyNDIxODksIDI1MjE2NywgMjQyMTg5LCAyMzU5MjMsIDIzNzUzNiwKKyAgICAyMzc1MzYsIDIzNTkyMywgMjI5Mzc2LCAyMzEzOTAsIDIyMzc1NCwgMjMxMzkwLCAyMjkzNzYsIDIyMjkzNSwKKyAgICAyMjQ5NjksIDIxNzk2NSwgMjE3OTY1LCAyMjQ5NjksIDIyMjkzNSwgMjAwNjM2LCAyMTg2NTIsIDIxMTkxNiwKKyAgICAyMTIzMjUsIDIxMTkxNiwgMjE4NjUyLCAyMDA2MzYsIDE4ODk5NSwgMTk2NzgxLCAyMDU5NjUsIDIwNjQzMywKKyAgICAyMDY0MzMsIDIwNTk2NSwgMTk2NzgxLCAxODg5OTUsIDE4NTM2NCwgMTg1MzY0LCAyMDA2MzYsIDIwMDcwNCwKKyAgICAyMDA2MzYsIDE4NTM2NCwgMTg1MzY0LCAxNzQ2MDksIDE4MDU2OCwgMTk1MDY4LCAxOTUwNjgsIDE4MDU2OCwKKyAgICAxNzQ2MDksIDE3MDA5MSwgMTc1NTU3LCAxODk1OTEsIDE3NTU1NywgMTcwMDkxLCAxNjUzNzEsIDE3MDYyNywKKyAgICAxNzA2MjcsIDE2NTM3MSwgMTYwNzI3LCAxNTM1NjAsIDE2MDcyNywgMTQ0NjUxLCAxNDQ2NTEsIDEzNjI1OCwKK307CitzdGF0aWMgY29uc3QgaW50IGR2X3dlaWdodF8yNDhbNjRdID0geworICAgIDEzMTA3MiwgMjQyMTg5LCAyNTcxMDcsIDIzNzUzNiwgMjI5Mzc2LCAyMDA2MzYsIDI0MjE4OSwgMjIzNzU0LAorICAgIDIyNDk2OSwgMTk2NzgxLCAyNjIxNDQsIDI0MjE4OSwgMjI5Mzc2LCAyMDA2MzYsIDI1NzEwNywgMjM3NTM2LAorICAgIDIxMTkxNiwgMTg1MzY0LCAyMzU5MjMsIDIxNzk2NSwgMjI5Mzc2LCAyMTE5MTYsIDIwNjQzMywgMTgwNTY4LAorICAgIDI0MjE4OSwgMjIzNzU0LCAyMjQ5NjksIDE5Njc4MSwgMjExOTE2LCAxODUzNjQsIDIzNTkyMywgMjE3OTY1LAorICAgIDIwMDcwNCwgMTc1NTU3LCAyMjI5MzUsIDIwNTk2NSwgMjAwNjM2LCAxODUzNjQsIDE5NTA2OCwgMTcwNjI3LAorICAgIDIyOTM3NiwgMjExOTE2LCAyMDY0MzMsIDE4MDU2OCwgMjAwNzA0LCAxNzU1NTcsIDIyMjkzNSwgMjA1OTY1LAorICAgIDE3NTU1NywgMTUzNTYwLCAxODg5OTUsIDE3NDYwOSwgMTY1MzcxLCAxNDQ2NTEsIDIwMDYzNiwgMTg1MzY0LAorICAgIDE5NTA2OCwgMTcwNjI3LCAxNzU1NTcsIDE1MzU2MCwgMTg4OTk1LCAxNzQ2MDksIDE2NTM3MSwgMTQ0NjUxLAorfTsKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGR2X2luaXRfZW5jX2Jsb2NrKEVuY0Jsb2NrSW5mbyAqYmksIHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLCBEVlZpZGVvQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlhcykKK3sKKyAgICBjb25zdCBpbnQgKndlaWdodDsKKyAgICBjb25zdCB1aW50OF90ICp6aWd6YWdfc2NhbjsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIGJsaywgWzY0XSk7CisgICAgaW50IGksIGFyZWE7CisgICAgLyogV2Ugb2ZmZXIgdHdvIGRpZmZlcmVudCBtZXRob2RzIGZvciBjbGFzcyBudW1iZXIgYXNzaWdubWVudDogdGhlCisgICAgICogbWV0aG9kIHN1Z2dlc3RlZCBpbiBTTVBURSAzMTRNIFRhYmxlIDIyLCBhbmQgYW4gaW1wcm92ZWQKKyAgICAgKiBtZXRob2QuIFRoZSBTTVBURSBtZXRob2QgaXMgdmVyeSBjb25zZXJ2YXRpdmU7IGl0IGFzc2lnbnMgY2xhc3MKKyAgICAgKiAzIChpLmUuIHNldmVyZSBxdWFudGl6YXRpb24pIHRvIGFueSBibG9jayB3aGVyZSB0aGUgbGFyZ2VzdCBBQworICAgICAqIGNvbXBvbmVudCBpcyBncmVhdGVyIHRoYW4gMzYuIEZGbXBlZydzIERWIGVuY29kZXIgdHJhY2tzIEFDIGJpdAorICAgICAqIGNvbnN1bXB0aW9uIHByZWNpc2VseSwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBiaWFzIG1vc3QgYmxvY2tzCisgICAgICogdG93YXJkcyBzdHJvbmdseSBsb3NzeSBjb21wcmVzc2lvbi4gSW5zdGVhZCwgd2UgYXNzaWduIGNsYXNzIDIKKyAgICAgKiB0byBtb3N0IGJsb2NrcywgYW5kIHVzZSBjbGFzcyAzIG9ubHkgd2hlbiBzdHJpY3RseSBuZWNlc3NhcnkKKyAgICAgKiAoZm9yIGJsb2NrcyB3aG9zZSBsYXJnZXN0IEFDIGNvbXBvbmVudCBleGNlZWRzIDI1NSkuICovCisKKyNpZiAwIC8qIFNNUFRFIHNwZWMgbWV0aG9kICovCisgICAgc3RhdGljIGNvbnN0IGludCBjbGFzc2VzW10gPSB7IDEyLCAyNCwgMzYsIDB4ZmZmZiB9OworI2Vsc2UgLyogaW1wcm92ZWQgRkZtcGVnIG1ldGhvZCAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgY2xhc3Nlc1tdID0geyAtMSwgLTEsIDI1NSwgMHhmZmZmIH07CisjZW5kaWYKKyAgICBpbnQgbWF4ICA9IGNsYXNzZXNbMF07CisgICAgaW50IHByZXYgPSAwOworCisgICAgYXZfYXNzZXJ0MigoKChpbnQpIGJsaykgJiAxNSkgPT0gMCk7CisKKyAgICBiaS0+YXJlYV9xWzBdICAgICAgICAgID0KKyAgICBiaS0+YXJlYV9xWzFdICAgICAgICAgID0KKyAgICBiaS0+YXJlYV9xWzJdICAgICAgICAgID0KKyAgICBiaS0+YXJlYV9xWzNdICAgICAgICAgID0gMDsKKyAgICBiaS0+cGFydGlhbF9iaXRfY291bnQgID0gMDsKKyAgICBiaS0+cGFydGlhbF9iaXRfYnVmZmVyID0gMDsKKyAgICBiaS0+Y3VyX2FjICAgICAgICAgICAgID0gMDsKKyAgICBpZiAoZGF0YSkgeworICAgICAgICBiaS0+ZGN0X21vZGUgPSBkdl9ndWVzc19kY3RfbW9kZShzLCBkYXRhLCBsaW5lc2l6ZSk7CisgICAgICAgIHMtPmdldF9waXhlbHMoYmxrLCBkYXRhLCBsaW5lc2l6ZSk7CisgICAgICAgIHMtPmZkY3RbYmktPmRjdF9tb2RlXShibGspOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBlbmNvZGluZyBhbGwgemVyb3MgbGVhZHMgdG8gYW4gaW1tZWRpYXRlCisgICAgICAgICAqIEVPQiwgd2hpY2ggaXMgcHJlY2lzZWx5IHdoYXQgdGhlIHNwZWMgY2FsbHMgZm9yIGluIHRoZSAiZHVtbXkiCisgICAgICAgICAqIGJsb2Nrcy4gKi8KKyAgICAgICAgbWVtc2V0KGJsaywgMCwgNjQgKiBzaXplb2YoKmJsaykpOworICAgICAgICBiaS0+ZGN0X21vZGUgPSAwOworICAgIH0KKyAgICBiaS0+bWJbMF0gPSBibGtbMF07CisKKyAgICB6aWd6YWdfc2NhbiA9IGJpLT5kY3RfbW9kZSA/IGZmX2R2X3ppZ3phZzI0OF9kaXJlY3QgOiBmZl96aWd6YWdfZGlyZWN0OworICAgIHdlaWdodCAgICAgID0gYmktPmRjdF9tb2RlID8gZHZfd2VpZ2h0XzI0OCA6IGR2X3dlaWdodF84ODsKKworICAgIGZvciAoYXJlYSA9IDA7IGFyZWEgPCA0OyBhcmVhKyspIHsKKyAgICAgICAgYmktPnByZXZbYXJlYV0gICAgID0gcHJldjsKKyAgICAgICAgYmktPmJpdF9zaXplW2FyZWFdID0gMTsgLy8gNCBhcmVhcyA0IGJpdHMgZm9yIEVPQiA6KQorICAgICAgICBmb3IgKGkgPSBtYl9hcmVhX3N0YXJ0W2FyZWFdOyBpIDwgbWJfYXJlYV9zdGFydFthcmVhICsgMV07IGkrKykgeworICAgICAgICAgICAgaW50IGxldmVsID0gYmxrW3ppZ3phZ19zY2FuW2ldXTsKKworICAgICAgICAgICAgaWYgKGxldmVsICsgMTUgPiAzMFUpIHsKKyAgICAgICAgICAgICAgICBiaS0+c2lnbltpXSA9IChsZXZlbCA+PiAzMSkgJiAxOworICAgICAgICAgICAgICAgIC8qIFdlaWdodCBpdCBhbmQgc2hpZnQgZG93biBpbnRvIHJhbmdlLCBhZGRpbmcgZm9yIHJvdW5kaW5nLgorICAgICAgICAgICAgICAgICAqIFRoZSBleHRyYSBkaXZpc2lvbiBieSBhIGZhY3RvciBvZiAyXjQgcmV2ZXJzZXMgdGhlIDh4CisgICAgICAgICAgICAgICAgICogZXhwYW5zaW9uIG9mIHRoZSBEQ1QgQU5EIHRoZSAyeCBkb3VibGluZyBvZiB0aGUgd2VpZ2h0cy4gKi8KKyAgICAgICAgICAgICAgICBsZXZlbCAgICAgPSAoRkZBQlMobGV2ZWwpICogd2VpZ2h0W2ldICsgKDEgPDwgKGR2X3dlaWdodF9iaXRzICsgMykpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkdl93ZWlnaHRfYml0cyArIDQpOworICAgICAgICAgICAgICAgIGJpLT5tYltpXSA9IGxldmVsOworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heCkKKyAgICAgICAgICAgICAgICAgICAgbWF4ID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgYmktPmJpdF9zaXplW2FyZWFdICs9IGR2X3JsMnZsY19zaXplKGkgLSBwcmV2IC0gMSwgbGV2ZWwpOworICAgICAgICAgICAgICAgIGJpLT5uZXh0W3ByZXZdICAgICAgPSBpOworICAgICAgICAgICAgICAgIHByZXYgICAgICAgICAgICAgICAgPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGJpLT5uZXh0W3ByZXZdID0gaTsKKyAgICBmb3IgKGJpLT5jbm8gPSAwOyBtYXggPiBjbGFzc2VzW2JpLT5jbm9dOyBiaS0+Y25vKyspCisgICAgICAgIDsKKworICAgIGJpLT5jbm8gKz0gYmlhczsKKworICAgIGlmIChiaS0+Y25vID49IDMpIHsKKyAgICAgICAgYmktPmNubyA9IDM7CisgICAgICAgIHByZXYgICAgPSAwOworICAgICAgICBpICAgICAgID0gYmktPm5leHRbcHJldl07CisgICAgICAgIGZvciAoYXJlYSA9IDA7IGFyZWEgPCA0OyBhcmVhKyspIHsKKyAgICAgICAgICAgIGJpLT5wcmV2W2FyZWFdICAgICA9IHByZXY7CisgICAgICAgICAgICBiaS0+Yml0X3NpemVbYXJlYV0gPSAxOyAvLyA0IGFyZWFzIDQgYml0cyBmb3IgRU9CIDopCisgICAgICAgICAgICBmb3IgKDsgaSA8IG1iX2FyZWFfc3RhcnRbYXJlYSArIDFdOyBpID0gYmktPm5leHRbaV0pIHsKKyAgICAgICAgICAgICAgICBiaS0+bWJbaV0gPj49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoYmktPm1iW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIGJpLT5iaXRfc2l6ZVthcmVhXSArPSBkdl9ybDJ2bGNfc2l6ZShpIC0gcHJldiAtIDEsIGJpLT5tYltpXSk7CisgICAgICAgICAgICAgICAgICAgIGJpLT5uZXh0W3ByZXZdICAgICAgPSBpOworICAgICAgICAgICAgICAgICAgICBwcmV2ICAgICAgICAgICAgICAgID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYmktPm5leHRbcHJldl0gPSBpOworICAgIH0KKworICAgIHJldHVybiBiaS0+Yml0X3NpemVbMF0gKyBiaS0+Yml0X3NpemVbMV0gKworICAgICAgICAgICBiaS0+Yml0X3NpemVbMl0gKyBiaS0+Yml0X3NpemVbM107Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdl9ndWVzc19xbm9zKEVuY0Jsb2NrSW5mbyAqYmxrcywgaW50ICpxbm9zKQoreworICAgIGludCBzaXplWzVdOworICAgIGludCBpLCBqLCBrLCBhLCBwcmV2LCBhMjsKKyAgICBFbmNCbG9ja0luZm8gKmI7CisKKyAgICBzaXplWzBdID0KKyAgICBzaXplWzFdID0KKyAgICBzaXplWzJdID0KKyAgICBzaXplWzNdID0KKyAgICBzaXplWzRdID0gMSA8PCAyNDsKKyAgICBkbyB7CisgICAgICAgIGIgPSBibGtzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXFub3NbaV0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHFub3NbaV0tLTsKKyAgICAgICAgICAgIHNpemVbaV0gPSAwOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY7IGorKywgYisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IDQ7IGErKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYi0+YXJlYV9xW2FdICE9IGZmX2R2X3F1YW50X3NoaWZ0c1txbm9zW2ldICsgZmZfZHZfcXVhbnRfb2Zmc2V0W2ItPmNub11dW2FdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiLT5iaXRfc2l6ZVthXSA9IDE7IC8vIDQgYXJlYXMgNCBiaXRzIGZvciBFT0IgOikKKyAgICAgICAgICAgICAgICAgICAgICAgIGItPmFyZWFfcVthXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IGItPnByZXZbYV07CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKGItPm5leHRbcHJldl0gPj0gbWJfYXJlYV9zdGFydFthICsgMV0gfHwgYi0+bWJbcHJldl0pOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gYi0+bmV4dFtwcmV2XTsgayA8IG1iX2FyZWFfc3RhcnRbYSArIDFdOyBrID0gYi0+bmV4dFtrXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItPm1iW2tdID4+PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLT5tYltrXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLT5iaXRfc2l6ZVthXSArPSBkdl9ybDJ2bGNfc2l6ZShrIC0gcHJldiAtIDEsIGItPm1iW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiAgICAgICAgICAgID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi0+bmV4dFtrXSA+PSBtYl9hcmVhX3N0YXJ0W2EgKyAxXSAmJiBiLT5uZXh0W2tdIDwgNjQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYTIgPSBhICsgMTsgYi0+bmV4dFtrXSA+PSBtYl9hcmVhX3N0YXJ0W2EyICsgMV07IGEyKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi0+cHJldlthMl0gPSBwcmV2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihhMiA8IDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihiLT5tYltiLT5uZXh0W2tdXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLT5iaXRfc2l6ZVthMl0gKz0gZHZfcmwydmxjX3NpemUoYi0+bmV4dFtrXSAtIHByZXYgLSAxLCBiLT5tYltiLT5uZXh0W2tdXSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2X3JsMnZsY19zaXplKGItPm5leHRba10gLSBrICAgIC0gMSwgYi0+bWJbYi0+bmV4dFtrXV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihiLT5wcmV2W2EyXSA9PSBrICYmIChhMiArIDEgPj0gNCB8fCBiLT5wcmV2W2EyICsgMV0gIT0gaykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi0+cHJldlthMl0gPSBwcmV2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItPm5leHRbcHJldl0gPSBiLT5uZXh0W2tdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGItPnByZXZbYSArIDFdID0gcHJldjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzaXplW2ldICs9IGItPmJpdF9zaXplW2FdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2c190b3RhbF9hY19iaXRzID49IHNpemVbMF0gKyBzaXplWzFdICsgc2l6ZVsyXSArIHNpemVbM10gKyBzaXplWzRdKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHFub3NbMF0gfCBxbm9zWzFdIHwgcW5vc1syXSB8IHFub3NbM10gfCBxbm9zWzRdKTsKKworICAgIGZvciAoYSA9IDI7IGEgPT0gMiB8fCB2c190b3RhbF9hY19iaXRzIDwgc2l6ZVswXTsgYSArPSBhKSB7CisgICAgICAgIGIgICAgICAgPSBibGtzOworICAgICAgICBzaXplWzBdID0gNSAqIDYgKiA0OyAvLyBFT0IKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDYgKiA1OyBqKyssIGIrKykgeworICAgICAgICAgICAgcHJldiA9IGItPnByZXZbMF07CisgICAgICAgICAgICBmb3IgKGsgPSBiLT5uZXh0W3ByZXZdOyBrIDwgNjQ7IGsgPSBiLT5uZXh0W2tdKSB7CisgICAgICAgICAgICAgICAgaWYgKGItPm1iW2tdIDwgYSAmJiBiLT5tYltrXSA+IC1hKSB7CisgICAgICAgICAgICAgICAgICAgIGItPm5leHRbcHJldl0gPSBiLT5uZXh0W2tdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVbMF0gKz0gZHZfcmwydmxjX3NpemUoayAtIHByZXYgLSAxLCBiLT5tYltrXSk7CisgICAgICAgICAgICAgICAgICAgIHByZXYgICAgID0gazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZHZfZW5jb2RlX3ZpZGVvX3NlZ21lbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICphcmcpCit7CisgICAgRFZWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIERWd29ya19jaHVuayAqd29ya19jaHVuayA9IGFyZzsKKyAgICBpbnQgbWJfaW5kZXgsIGksIGo7CisgICAgaW50IG1iX3gsIG1iX3ksIGNfb2Zmc2V0LCBsaW5lc2l6ZSwgeV9zdHJpZGU7CisgICAgdWludDhfdCAqeV9wdHI7CisgICAgdWludDhfdCAqZGlmOworICAgIExPQ0FMX0FMSUdORURfOCh1aW50OF90LCBzY3JhdGNoLCBbMTI4XSk7CisgICAgRW5jQmxvY2tJbmZvIGVuY19ibGtzWzUgKiBEVl9NQVhfQlBNXTsKKyAgICBQdXRCaXRDb250ZXh0IHBic1s1ICogRFZfTUFYX0JQTV07CisgICAgUHV0Qml0Q29udGV4dCAqcGI7CisgICAgRW5jQmxvY2tJbmZvICplbmNfYmxrOworICAgIGludCB2c19iaXRfc2l6ZSA9IDA7CisgICAgaW50IHFub3NbNV0gPSB7IDE1LCAxNSwgMTUsIDE1LCAxNSB9OyAvKiBObyBxdWFudGl6YXRpb24gKi8KKyAgICBpbnQgKnFub3NwID0gJnFub3NbMF07CisKKyAgICBkaWYgICAgID0gJnMtPmJ1Zlt3b3JrX2NodW5rLT5idWZfb2Zmc2V0ICogODBdOworICAgIGVuY19ibGsgPSAmZW5jX2Jsa3NbMF07CisgICAgZm9yIChtYl9pbmRleCA9IDA7IG1iX2luZGV4IDwgNTsgbWJfaW5kZXgrKykgeworICAgICAgICBkdl9jYWxjdWxhdGVfbWJfeHkocywgd29ya19jaHVuaywgbWJfaW5kZXgsICZtYl94LCAmbWJfeSk7CisKKyAgICAgICAgLyogaW5pdGlhbGl6aW5nIGx1bWluYW5jZSBibG9ja3MgKi8KKyAgICAgICAgaWYgKChzLT5zeXMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKSAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgKHMtPnN5cy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQxMVAgJiYgbWJfeCA+PSAoNzA0IC8gOCkpIHx8CisgICAgICAgICAgICAocy0+c3lzLT5oZWlnaHQgPj0gNzIwICYmIG1iX3kgIT0gMTM0KSkgeworICAgICAgICAgICAgeV9zdHJpZGUgPSBzLT5mcmFtZS0+bGluZXNpemVbMF0gPDwgMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHlfc3RyaWRlID0gMTY7CisgICAgICAgIH0KKyAgICAgICAgeV9wdHIgICAgPSBzLT5mcmFtZS0+ZGF0YVswXSArCisgICAgICAgICAgICAgICAgICAgKChtYl95ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdICsgbWJfeCkgPDwgMyk7CisgICAgICAgIGxpbmVzaXplID0gcy0+ZnJhbWUtPmxpbmVzaXplWzBdOworCisgICAgICAgIGlmIChzLT5zeXMtPnZpZGVvX3N0eXBlID09IDQpIHsgLyogU0QgNDIyICovCisgICAgICAgICAgICB2c19iaXRfc2l6ZSArPQorICAgICAgICAgICAgICAgIGR2X2luaXRfZW5jX2Jsb2NrKGVuY19ibGsgKyAwLCB5X3B0ciwgICAgICAgICAgICAgICAgbGluZXNpemUsIHMsIDApICsKKyAgICAgICAgICAgICAgICBkdl9pbml0X2VuY19ibG9jayhlbmNfYmxrICsgMSwgTlVMTCwgICAgICAgICAgICAgICAgIGxpbmVzaXplLCBzLCAwKSArCisgICAgICAgICAgICAgICAgZHZfaW5pdF9lbmNfYmxvY2soZW5jX2JsayArIDIsIHlfcHRyICsgOCwgICAgICAgICAgICBsaW5lc2l6ZSwgcywgMCkgKworICAgICAgICAgICAgICAgIGR2X2luaXRfZW5jX2Jsb2NrKGVuY19ibGsgKyAzLCBOVUxMLCAgICAgICAgICAgICAgICAgbGluZXNpemUsIHMsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdnNfYml0X3NpemUgKz0KKyAgICAgICAgICAgICAgICBkdl9pbml0X2VuY19ibG9jayhlbmNfYmxrICsgMCwgeV9wdHIsICAgICAgICAgICAgICAgIGxpbmVzaXplLCBzLCAwKSArCisgICAgICAgICAgICAgICAgZHZfaW5pdF9lbmNfYmxvY2soZW5jX2JsayArIDEsIHlfcHRyICsgOCwgICAgICAgICAgICBsaW5lc2l6ZSwgcywgMCkgKworICAgICAgICAgICAgICAgIGR2X2luaXRfZW5jX2Jsb2NrKGVuY19ibGsgKyAyLCB5X3B0ciArICAgICB5X3N0cmlkZSwgbGluZXNpemUsIHMsIDApICsKKyAgICAgICAgICAgICAgICBkdl9pbml0X2VuY19ibG9jayhlbmNfYmxrICsgMywgeV9wdHIgKyA4ICsgeV9zdHJpZGUsIGxpbmVzaXplLCBzLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbmNfYmxrICs9IDQ7CisKKyAgICAgICAgLyogaW5pdGlhbGl6aW5nIGNocm9taW5hbmNlIGJsb2NrcyAqLworICAgICAgICBjX29mZnNldCA9ICgoKG1iX3kgPj4gIChzLT5zeXMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKSkgKiBzLT5mcmFtZS0+bGluZXNpemVbMV0gKworICAgICAgICAgICAgICAgICAgICAgKG1iX3ggPj4gKChzLT5zeXMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MTFQKSA/IDIgOiAxKSkpIDw8IDMpOworICAgICAgICBmb3IgKGogPSAyOyBqOyBqLS0pIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmNfcHRyID0gcy0+ZnJhbWUtPmRhdGFbal0gKyBjX29mZnNldDsKKyAgICAgICAgICAgIGxpbmVzaXplID0gcy0+ZnJhbWUtPmxpbmVzaXplW2pdOworICAgICAgICAgICAgeV9zdHJpZGUgPSAobWJfeSA9PSAxMzQpID8gOCA6IChzLT5mcmFtZS0+bGluZXNpemVbal0gPDwgMyk7CisgICAgICAgICAgICBpZiAocy0+c3lzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDExUCAmJiBtYl94ID49ICg3MDQgLyA4KSkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmQ7CisgICAgICAgICAgICAgICAgdWludDhfdCAqYiA9IHNjcmF0Y2g7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkICAgICAgPSBjX3B0ciArIChsaW5lc2l6ZSA8PCAzKTsKKyAgICAgICAgICAgICAgICAgICAgYlswXSAgID0gY19wdHJbMF07CisgICAgICAgICAgICAgICAgICAgIGJbMV0gICA9IGNfcHRyWzFdOworICAgICAgICAgICAgICAgICAgICBiWzJdICAgPSBjX3B0clsyXTsKKyAgICAgICAgICAgICAgICAgICAgYlszXSAgID0gY19wdHJbM107CisgICAgICAgICAgICAgICAgICAgIGJbNF0gICA9IGRbMF07CisgICAgICAgICAgICAgICAgICAgIGJbNV0gICA9IGRbMV07CisgICAgICAgICAgICAgICAgICAgIGJbNl0gICA9IGRbMl07CisgICAgICAgICAgICAgICAgICAgIGJbN10gICA9IGRbM107CisgICAgICAgICAgICAgICAgICAgIGNfcHRyICs9IGxpbmVzaXplOworICAgICAgICAgICAgICAgICAgICBiICAgICArPSAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY19wdHIgICAgPSBzY3JhdGNoOworICAgICAgICAgICAgICAgIGxpbmVzaXplID0gMTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZzX2JpdF9zaXplICs9IGR2X2luaXRfZW5jX2Jsb2NrKGVuY19ibGsrKywgY19wdHIsIGxpbmVzaXplLCBzLCAxKTsKKyAgICAgICAgICAgIGlmIChzLT5zeXMtPmJwbSA9PSA4KQorICAgICAgICAgICAgICAgIHZzX2JpdF9zaXplICs9IGR2X2luaXRfZW5jX2Jsb2NrKGVuY19ibGsrKywgY19wdHIgKyB5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwgcywgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodnNfdG90YWxfYWNfYml0cyA8IHZzX2JpdF9zaXplKQorICAgICAgICBkdl9ndWVzc19xbm9zKCZlbmNfYmxrc1swXSwgcW5vc3ApOworCisgICAgLyogRElGIGVuY29kaW5nIHByb2Nlc3MgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgNSAqIHMtPnN5cy0+YnBtOykgeworICAgICAgICBpbnQgc3RhcnRfbWIgPSBqOworCisgICAgICAgIGRpZlszXSA9ICpxbm9zcCsrOworICAgICAgICBkaWYgICArPSA0OworCisgICAgICAgIC8qIEZpcnN0IHBhc3Mgb3ZlciBpbmRpdmlkdWFsIGNlbGxzIG9ubHkgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnN5cy0+YnBtOyBpKyssIGorKykgeworICAgICAgICAgICAgaW50IHN6ID0gcy0+c3lzLT5ibG9ja19zaXplc1tpXSA+PiAzOworCisgICAgICAgICAgICBpbml0X3B1dF9iaXRzKCZwYnNbal0sIGRpZiwgc3opOworICAgICAgICAgICAgcHV0X3NiaXRzKCZwYnNbal0sIDksICgoZW5jX2Jsa3Nbal0ubWJbMF0gPj4gMykgLSAxMDI0ICsgMikgPj4gMik7CisgICAgICAgICAgICBwdXRfYml0cygmcGJzW2pdLCAxLCBlbmNfYmxrc1tqXS5kY3RfbW9kZSk7CisgICAgICAgICAgICBwdXRfYml0cygmcGJzW2pdLCAyLCBlbmNfYmxrc1tqXS5jbm8pOworCisgICAgICAgICAgICBkdl9lbmNvZGVfYWMoJmVuY19ibGtzW2pdLCAmcGJzW2pdLCAmcGJzW2ogKyAxXSk7CisgICAgICAgICAgICBkaWYgKz0gc3o7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZWNvbmQgcGFzcyBvdmVyIGVhY2ggTUIgc3BhY2UgKi8KKyAgICAgICAgcGIgPSAmcGJzW3N0YXJ0X21iXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnN5cy0+YnBtOyBpKyspCisgICAgICAgICAgICBpZiAoZW5jX2Jsa3Nbc3RhcnRfbWIgKyBpXS5wYXJ0aWFsX2JpdF9jb3VudCkKKyAgICAgICAgICAgICAgICBwYiA9IGR2X2VuY29kZV9hYygmZW5jX2Jsa3Nbc3RhcnRfbWIgKyBpXSwgcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBic1tzdGFydF9tYiArIHMtPnN5cy0+YnBtXSk7CisgICAgfQorCisgICAgLyogVGhpcmQgYW5kIGZpbmFsIHBhc3Mgb3ZlciB0aGUgd2hvbGUgdmlkZW8gc2VnbWVudCBzcGFjZSAqLworICAgIHBiID0gJnBic1swXTsKKyAgICBmb3IgKGogPSAwOyBqIDwgNSAqIHMtPnN5cy0+YnBtOyBqKyspIHsKKyAgICAgICAgaWYgKGVuY19ibGtzW2pdLnBhcnRpYWxfYml0X2NvdW50KQorICAgICAgICAgICAgcGIgPSBkdl9lbmNvZGVfYWMoJmVuY19ibGtzW2pdLCBwYiwgJnBic1tzLT5zeXMtPmJwbSAqIDVdKTsKKyAgICAgICAgaWYgKGVuY19ibGtzW2pdLnBhcnRpYWxfYml0X2NvdW50KQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJhYyBiaXRzdHJlYW0gb3ZlcmZsb3dcbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCA1ICogcy0+c3lzLT5icG07IGorKykgeworICAgICAgICBpbnQgcG9zOworICAgICAgICBpbnQgc2l6ZSA9IHBic1tqXS5zaXplX2luX2JpdHMgPj4gMzsKKyAgICAgICAgZmx1c2hfcHV0X2JpdHMoJnBic1tqXSk7CisgICAgICAgIHBvcyA9IHB1dF9iaXRzX2NvdW50KCZwYnNbal0pID4+IDM7CisgICAgICAgIGlmIChwb3MgPiBzaXplKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiYml0c3RyZWFtIHdyaXR0ZW4gYmV5b25kIGJ1ZmZlciBzaXplXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQocGJzW2pdLmJ1ZiArIHBvcywgMHhmZiwgc2l6ZSAtIHBvcyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGR2X3dyaXRlX3BhY2soZW51bSBkdl9wYWNrX3R5cGUgcGFja19pZCwgRFZWaWRlb0NvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZikKK3sKKyAgICAvKgorICAgICAqIEhlcmUncyB3aGF0IFNNUFRFMzE0TSBzYXlzIGFib3V0IHRoZXNlIHR3bzoKKyAgICAgKiAgICAocGFnZSA2KSBBUFRuLCBBUDFuLCBBUDJuLCBBUDNuOiBUaGVzZSBkYXRhIHNoYWxsIGJlIGlkZW50aWNhbAorICAgICAqICAgICAgICAgICAgIGFzIHRyYWNrIGFwcGxpY2F0aW9uIElEcyAoQVBUbiA9IDAwMSwgQVAxbiA9CisgICAgICogICAgICAgICAgICAgMDAxLCBBUDJuID0gMDAxLCBBUDNuID0gMDAxKSwgaWYgdGhlIHNvdXJjZSBzaWduYWwKKyAgICAgKiAgICAgICAgICAgICBjb21lcyBmcm9tIGEgZGlnaXRhbCBWQ1IuIElmIHRoZSBzaWduYWwgc291cmNlIGlzCisgICAgICogICAgICAgICAgICAgdW5rbm93biwgYWxsIGJpdHMgZm9yIHRoZXNlIGRhdGEgc2hhbGwgYmUgc2V0IHRvIDEuCisgICAgICogICAgKHBhZ2UgMTIpIFNUWVBFOiBTVFlQRSBkZWZpbmVzIGEgc2lnbmFsIHR5cGUgb2YgdmlkZW8gc2lnbmFsCisgICAgICogICAgICAgICAgICAgICAgICAgICAwMDAwMGIgPSA0OjE6MSBjb21wcmVzc2lvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgMDAxMDBiID0gNDoyOjIgY29tcHJlc3Npb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIFhYWFhYWCA9IFJlc2VydmVkCisgICAgICogTm93LCBJJ3ZlIGdvdCB0d28gcHJvYmxlbXMgd2l0aCB0aGVzZSBzdGF0ZW1lbnRzOgorICAgICAqICAgMS4gaXQgbG9va3MgbGlrZSBBUFQgPT0gMTExYiBzaG91bGQgYmUgYSBzYWZlIGJldCwgYnV0IGl0IGlzbid0LgorICAgICAqICAgICAgSXQgc2VlbXMgdGhhdCBmb3IgUEFMIGFzIGRlZmluZWQgaW4gSUVDIDYxODM0IHdlIGhhdmUgdG8gc2V0CisgICAgICogICAgICBBUFQgdG8gMDAwIGFuZCBmb3IgU01QVEUzMTRNIHRvIDAwMS4KKyAgICAgKiAgIDIuIEl0IGlzIG5vdCBhdCBhbGwgY2xlYXIgd2hhdCBTVFlQRSBpcyB1c2VkIGZvciA0OjI6MCBQQUwKKyAgICAgKiAgICAgIGNvbXByZXNzaW9uIHNjaGVtZSAoaWYgYW55KS4KKyAgICAgKi8KKyAgICBpbnQgYXB0ID0gKGMtPnN5cy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAgPyAwIDogMSk7CisgICAgaW50IGZzICA9IGMtPmZyYW1lLT50b3BfZmllbGRfZmlyc3QgPyAweDAwIDogMHg0MDsKKworICAgIHVpbnQ4X3QgYXNwZWN0ID0gMDsKKyAgICBpZiAoKGludCkgKGF2X3EyZChjLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbykgKgorICAgICAgICAgICAgICAgYy0+YXZjdHgtPndpZHRoIC8gYy0+YXZjdHgtPmhlaWdodCAqIDEwKSA+PSAxNykgLyogMTY6OSAqLworICAgICAgICBhc3BlY3QgPSAweDAyOworCisgICAgYnVmWzBdID0gKHVpbnQ4X3QpIHBhY2tfaWQ7CisgICAgc3dpdGNoIChwYWNrX2lkKSB7CisgICAgY2FzZSBkdl9oZWFkZXI1MjU6IC8qIEkgY2FuJ3QgaW1hZ2luZSB3aHkgdGhlc2UgdHdvIHdlcmVuJ3QgZGVmaW5lZCBhcyByZWFsICovCisgICAgY2FzZSBkdl9oZWFkZXI2MjU6IC8qIHBhY2tzIGluIFNNUFRFMzE0TSAtLSB0aGV5IGRlZmluaXRlbHkgbG9vayBsaWtlIG9uZXMgKi8KKyAgICAgICAgYnVmWzFdID0gIDB4ZjggICAgICAgfCAvKiByZXNlcnZlZCAtLSBhbHdheXMgMSAqLworICAgICAgICAgICAgICAgICAoYXB0ICYgMHgwNyk7IC8qIEFQVDogVHJhY2sgYXBwbGljYXRpb24gSUQgKi8KKyAgICAgICAgYnVmWzJdID0gKDAgICAgPDwgNykgfCAvKiBURjE6IGF1ZGlvIGRhdGEgaXMgMCAtIHZhbGlkOyAxIC0gaW52YWxpZCAqLworICAgICAgICAgICAgICAgICAoMHgwZiA8PCAzKSB8IC8qIHJlc2VydmVkIC0tIGFsd2F5cyAxICovCisgICAgICAgICAgICAgICAgIChhcHQgJiAweDA3KTsgLyogQVAxOiBBdWRpbyBhcHBsaWNhdGlvbiBJRCAqLworICAgICAgICBidWZbM10gPSAoMCAgICA8PCA3KSB8IC8qIFRGMjogdmlkZW8gZGF0YSBpcyAwIC0gdmFsaWQ7IDEgLSBpbnZhbGlkICovCisgICAgICAgICAgICAgICAgICgweDBmIDw8IDMpIHwgLyogcmVzZXJ2ZWQgLS0gYWx3YXlzIDEgKi8KKyAgICAgICAgICAgICAgICAgKGFwdCAmIDB4MDcpOyAvKiBBUDI6IFZpZGVvIGFwcGxpY2F0aW9uIElEICovCisgICAgICAgIGJ1Zls0XSA9ICgwICAgIDw8IDcpIHwgLyogVEYzOiBzdWJjb2RlKFNTWUIpIGlzIDAgLSB2YWxpZDsgMSAtIGludmFsaWQgKi8KKyAgICAgICAgICAgICAgICAgKDB4MGYgPDwgMykgfCAvKiByZXNlcnZlZCAtLSBhbHdheXMgMSAqLworICAgICAgICAgICAgICAgICAoYXB0ICYgMHgwNyk7IC8qIEFQMzogU3ViY29kZSBhcHBsaWNhdGlvbiBJRCAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIGR2X3ZpZGVvX3NvdXJjZToKKyAgICAgICAgYnVmWzFdID0gMHhmZjsgICAgICAgICAvKiByZXNlcnZlZCAtLSBhbHdheXMgMSAqLworICAgICAgICBidWZbMl0gPSAoMSA8PCA3KSB8ICAgIC8qIEIvVzogMCAtIGIvdywgMSAtIGNvbG9yICovCisgICAgICAgICAgICAgICAgICgxIDw8IDYpIHwgICAgLyogZm9sbG93aW5nIENMRiBpcyB2YWxpZCAtIDAsIGludmFsaWQgLSAxICovCisgICAgICAgICAgICAgICAgICgzIDw8IDQpIHwgICAgLyogQ0xGOiBjb2xvciBmcmFtZXMgSUQgKHNlZSBJVFUtUiBCVC40NzAtNCkgKi8KKyAgICAgICAgICAgICAgICAgMHhmOyAgICAgICAgICAvKiByZXNlcnZlZCAtLSBhbHdheXMgMSAqLworICAgICAgICBidWZbM10gPSAoMyA8PCA2KSAgICAgICAgICAgfCAvKiByZXNlcnZlZCAtLSBhbHdheXMgMSAqLworICAgICAgICAgICAgICAgICAoYy0+c3lzLT5kc2YgPDwgNSkgfCAvKiAgc3lzdGVtOiA2MGZpZWxkcy81MGZpZWxkcyAqLworICAgICAgICAgICAgICAgICBjLT5zeXMtPnZpZGVvX3N0eXBlOyAvKiBzaWduYWwgdHlwZSB2aWRlbyBjb21wcmVzc2lvbiAqLworICAgICAgICBidWZbNF0gPSAweGZmOyAgICAgICAgIC8qIFZJU0M6IDB4ZmYgLS0gbm8gaW5mb3JtYXRpb24gKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBkdl92aWRlb19jb250cm9sOgorICAgICAgICBidWZbMV0gPSAoMCA8PCA2KSB8ICAgIC8qIENvcHkgZ2VuZXJhdGlvbiBtYW5hZ2VtZW50IChDR01TKSAwIC0tIGZyZWUgKi8KKyAgICAgICAgICAgICAgICAgMHgzZjsgICAgICAgICAvKiByZXNlcnZlZCAtLSBhbHdheXMgMSAqLworICAgICAgICBidWZbMl0gPSAweGM4IHwgICAgICAgIC8qIHJlc2VydmVkIC0tIGFsd2F5cyBiMTEwMDF4eHggKi8KKyAgICAgICAgICAgICAgICAgYXNwZWN0OworICAgICAgICBidWZbM10gPSAoMSA8PCA3KSB8ICAgIC8qIGZyYW1lL2ZpZWxkIGZsYWcgMSAtLSBmcmFtZSwgMCAtLSBmaWVsZCAqLworICAgICAgICAgICAgICAgICBmcyAgICAgICB8ICAgIC8qIGZpcnN0L3NlY29uZCBmaWVsZCBmbGFnIDAgLS0gZmllbGQgMiwgMSAtLSBmaWVsZCAxICovCisgICAgICAgICAgICAgICAgICgxIDw8IDUpIHwgICAgLyogZnJhbWUgY2hhbmdlIGZsYWcgMCAtLSBzYW1lIHBpY3R1cmUgYXMgYmVmb3JlLCAxIC0tIGRpZmZlcmVudCAqLworICAgICAgICAgICAgICAgICAoMSA8PCA0KSB8ICAgIC8qIDEgLSBpbnRlcmxhY2VkLCAwIC0gbm9uaW50ZXJsYWNlZCAqLworICAgICAgICAgICAgICAgICAweGM7ICAgICAgICAgIC8qIHJlc2VydmVkIC0tIGFsd2F5cyBiMTEwMCAqLworICAgICAgICBidWZbNF0gPSAweGZmOyAgICAgICAgIC8qIHJlc2VydmVkIC0tIGFsd2F5cyAxICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJ1ZlsxXSA9CisgICAgICAgIGJ1ZlsyXSA9CisgICAgICAgIGJ1ZlszXSA9CisgICAgICAgIGJ1Zls0XSA9IDB4ZmY7CisgICAgfQorICAgIHJldHVybiA1OworfQorCitzdGF0aWMgaW5saW5lIGludCBkdl93cml0ZV9kaWZfaWQoZW51bSBkdl9zZWN0aW9uX3R5cGUgdCwgdWludDhfdCBjaGFuX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlcV9udW0sIHVpbnQ4X3QgZGlmX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYpCit7CisgICAgYnVmWzBdID0gKHVpbnQ4X3QpIHQ7ICAgICAgLyogU2VjdGlvbiB0eXBlICovCisgICAgYnVmWzFdID0gKHNlcV9udW0gIDw8IDQpIHwgLyogRElGIHNlcSBudW1iZXIgMC05IGZvciA1MjUvNjA7IDAtMTEgZm9yIDYyNS81MCAqLworICAgICAgICAgICAgIChjaGFuX251bSA8PCAzKSB8IC8qIEZTQzogZm9yIDUwTWIvcyAwIC0gZmlyc3QgY2hhbm5lbDsgMSAtIHNlY29uZCAqLworICAgICAgICAgICAgIDc7ICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkIC0tIGFsd2F5cyAxICovCisgICAgYnVmWzJdID0gZGlmX251bTsgICAgICAgICAgLyogRElGIGJsb2NrIG51bWJlciBWaWRlbzogMC0xMzQsIEF1ZGlvOiAwLTggKi8KKyAgICByZXR1cm4gMzsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHZfd3JpdGVfc3N5Yl9pZCh1aW50OF90IHN5Yl9udW0sIHVpbnQ4X3QgZnIsIHVpbnQ4X3QgKmJ1ZikKK3sKKyAgICBpZiAoc3liX251bSA9PSAwIHx8IHN5Yl9udW0gPT0gNikgeworICAgICAgICBidWZbMF0gPSAoZnIgPDwgNykgfCAvKiBGUiBJRCAxIC0gZmlyc3QgaGFsZiBvZiBlYWNoIGNoYW5uZWw7IDAgLSBzZWNvbmQgKi8KKyAgICAgICAgICAgICAgICAgKDAgIDw8IDQpIHwgLyogQVAzIChTdWJjb2RlIGFwcGxpY2F0aW9uIElEKSAqLworICAgICAgICAgICAgICAgICAweDBmOyAgICAgICAvKiByZXNlcnZlZCAtLSBhbHdheXMgMSAqLworICAgIH0gZWxzZSBpZiAoc3liX251bSA9PSAxMSkgeworICAgICAgICBidWZbMF0gPSAoZnIgPDwgNykgfCAvKiBGUiBJRCAxIC0gZmlyc3QgaGFsZiBvZiBlYWNoIGNoYW5uZWw7IDAgLSBzZWNvbmQgKi8KKyAgICAgICAgICAgICAgICAgMHg3ZjsgICAgICAgLyogcmVzZXJ2ZWQgLS0gYWx3YXlzIDEgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBidWZbMF0gPSAoZnIgPDwgNykgfCAvKiBGUiBJRCAxIC0gZmlyc3QgaGFsZiBvZiBlYWNoIGNoYW5uZWw7IDAgLSBzZWNvbmQgKi8KKyAgICAgICAgICAgICAgICAgKDAgIDw8IDQpIHwgLyogQVBUIChUcmFjayBhcHBsaWNhdGlvbiBJRCkgKi8KKyAgICAgICAgICAgICAgICAgMHgwZjsgICAgICAgLyogcmVzZXJ2ZWQgLS0gYWx3YXlzIDEgKi8KKyAgICB9CisgICAgYnVmWzFdID0gMHhmMCB8ICAgICAgICAgICAgLyogcmVzZXJ2ZWQgLS0gYWx3YXlzIDEgKi8KKyAgICAgICAgICAgICAoc3liX251bSAmIDB4MGYpOyAvKiBTU1lCIG51bWJlciAwIC0gMTEgICAqLworICAgIGJ1ZlsyXSA9IDB4ZmY7ICAgICAgICAgICAgIC8qIHJlc2VydmVkIC0tIGFsd2F5cyAxICovCisgICAgcmV0dXJuIDM7Cit9CisKK3N0YXRpYyB2b2lkIGR2X2Zvcm1hdF9mcmFtZShEVlZpZGVvQ29udGV4dCAqYywgdWludDhfdCAqYnVmKQoreworICAgIGludCBjaGFuLCBpLCBqLCBrOworCisgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IGMtPnN5cy0+bl9kaWZjaGFuOyBjaGFuKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPnN5cy0+ZGlmc2VnX3NpemU7IGkrKykgeworICAgICAgICAgICAgbWVtc2V0KGJ1ZiwgMHhmZiwgODAgKiA2KTsgLyogZmlyc3QgNiBESUYgYmxvY2tzIGFyZSBmb3IgY29udHJvbCBkYXRhICovCisKKyAgICAgICAgICAgIC8qIERWIGhlYWRlcjogMURJRiAqLworICAgICAgICAgICAgYnVmICs9IGR2X3dyaXRlX2RpZl9pZChkdl9zZWN0X2hlYWRlciwgY2hhbiwgaSwgMCwgYnVmKTsKKyAgICAgICAgICAgIGJ1ZiArPSBkdl93cml0ZV9wYWNrKChjLT5zeXMtPmRzZiA/IGR2X2hlYWRlcjYyNSA6IGR2X2hlYWRlcjUyNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLCBidWYpOworICAgICAgICAgICAgYnVmICs9IDcyOyAvKiB1bnVzZWQgYnl0ZXMgKi8KKworICAgICAgICAgICAgLyogRFYgc3ViY29kZTogMkRJRnMgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICBidWYgKz0gZHZfd3JpdGVfZGlmX2lkKGR2X3NlY3Rfc3ViY29kZSwgY2hhbiwgaSwgaiwgYnVmKTsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNjsgaysrKQorICAgICAgICAgICAgICAgICAgICBidWYgKz0gZHZfd3JpdGVfc3N5Yl9pZChrLCAoaSA8IGMtPnN5cy0+ZGlmc2VnX3NpemUgLyAyKSwgYnVmKSArIDU7CisgICAgICAgICAgICAgICAgYnVmICs9IDI5OyAvKiB1bnVzZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRFYgVkFVWDogM0RJRlMgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBidWYgKz0gZHZfd3JpdGVfZGlmX2lkKGR2X3NlY3RfdmF1eCwgY2hhbiwgaSwgaiwgYnVmKTsKKyAgICAgICAgICAgICAgICBidWYgKz0gZHZfd3JpdGVfcGFjayhkdl92aWRlb19zb3VyY2UsICBjLCBidWYpOworICAgICAgICAgICAgICAgIGJ1ZiArPSBkdl93cml0ZV9wYWNrKGR2X3ZpZGVvX2NvbnRyb2wsIGMsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnVmICs9IDcgKiA1OworICAgICAgICAgICAgICAgIGJ1ZiArPSBkdl93cml0ZV9wYWNrKGR2X3ZpZGVvX3NvdXJjZSwgIGMsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnVmICs9IGR2X3dyaXRlX3BhY2soZHZfdmlkZW9fY29udHJvbCwgYywgYnVmKTsKKyAgICAgICAgICAgICAgICBidWYgKz0gNCAqIDUgKyAyOyAvKiB1bnVzZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRFYgQXVkaW8vVmlkZW86IDEzNSBWaWRlbyBESUZzICsgOSBBdWRpbyBESUZzICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTM1OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaiAlIDE1ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGJ1ZiwgMHhmZiwgODApOworICAgICAgICAgICAgICAgICAgICBidWYgKz0gZHZfd3JpdGVfZGlmX2lkKGR2X3NlY3RfYXVkaW8sIGNoYW4sIGksIGogLyAxNSwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmICs9IDc3OyAvKiBhdWRpbyBjb250cm9sICYgc2h1ZmZsZWQgUENNIGF1ZGlvICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZiArPSBkdl93cml0ZV9kaWZfaWQoZHZfc2VjdF92aWRlbywgY2hhbiwgaSwgaiwgYnVmKTsKKyAgICAgICAgICAgICAgICBidWYgKz0gNzc7IC8qIDEgdmlkZW8gbWFjcm9ibG9jazogMSBieXRlcyBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiA0ICogMTQgYnl0ZXMgWSA4eDggZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTAgYnl0ZXMgQ3IgOHg4IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDEwIGJ5dGVzIENiIDh4OCBkYXRhICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZHZ2aWRlb19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmMsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgRFZWaWRlb0NvbnRleHQgKnMgPSBjLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihjLCBwa3QsIHMtPnN5cy0+ZnJhbWVfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGMtPnBpeF9mbXQgICAgICAgICAgICAgICAgPSBzLT5zeXMtPnBpeF9mbXQ7CisgICAgcy0+ZnJhbWUgICAgICAgICAgICAgICAgICA9IGZyYW1lOworICAgIGMtPmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWUgPSAxOworICAgIGMtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIHMtPmJ1ZiA9IHBrdC0+ZGF0YTsKKyAgICBjLT5leGVjdXRlKGMsIGR2X2VuY29kZV92aWRlb19zZWdtZW50LCBzLT53b3JrX2NodW5rcywgTlVMTCwKKyAgICAgICAgICAgICAgIGR2X3dvcmtfcG9vbF9zaXplKHMtPnN5cyksIHNpemVvZihEVndvcmtfY2h1bmspKTsKKworICAgIGVtbXNfYygpOworCisgICAgZHZfZm9ybWF0X2ZyYW1lKHMsIHBrdC0+ZGF0YSk7CisKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdnZpZGVvX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9kdnZpZGVvX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImR2dmlkZW8iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEViAoRGlnaXRhbCBWaWRlbykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRFZWSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRFZWaWRlb0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGR2dmlkZW9fZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZHZ2aWRlb19lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZHZ2aWRlb19lbmNvZGVfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMgfCBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IENPREVDX0NBUF9JTlRSQV9PTkxZLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeworICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2R4YS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlM2Y3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R4YS5jCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogRmVlYmxlIEZpbGVzL1NjdW1tVk0gRFhBIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIERYQSBWaWRlbyBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgPHpsaWIuaD4KKworLyoKKyAqIERlY29kZXIgY29udGV4dAorICovCit0eXBlZGVmIHN0cnVjdCBEeGFEZWNDb250ZXh0IHsKKyAgICBBVkZyYW1lICpwcmV2OworCisgICAgaW50IGRzaXplOworI2RlZmluZSBERUNPTVBfQlVGX1BBRERJTkcgMTYKKyAgICB1aW50OF90ICpkZWNvbXBfYnVmOworICAgIHVpbnQzMl90IHBhbFsyNTZdOworfSBEeGFEZWNDb250ZXh0OworCitzdGF0aWMgY29uc3QgaW50IHNoaWZ0MVs2XSA9IHsgMCwgOCwgOCwgOCwgNCwgNCB9Oworc3RhdGljIGNvbnN0IGludCBzaGlmdDJbNl0gPSB7IDAsIDAsIDgsIDQsIDAsIDQgfTsKKworc3RhdGljIGludCBkZWNvZGVfMTMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBEeGFEZWNDb250ZXh0ICpjLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90ICpzcmMsIGludCBzcmNzaXplLCB1aW50OF90ICpyZWYpCit7CisgICAgdWludDhfdCAqY29kZSwgKmRhdGEsICptdiwgKm1zaywgKnRtcCwgKnRtcDI7CisgICAgdWludDhfdCAqc3JjX2VuZCA9IHNyYyArIHNyY3NpemU7CisgICAgaW50IGksIGosIGs7CisgICAgaW50IHR5cGUsIHgsIHksIGQsIGQyOworICAgIHVpbnQzMl90IG1hc2s7CisKKyAgICBpZiAoMTJVTEwgICsgKChhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0KSA+PiA0KSArIEFWX1JCMzIoc3JjICsgMCkgKyBBVl9SQjMyKHNyYyArIDQpID4gc3Jjc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBjb2RlID0gc3JjICArIDEyOworICAgIGRhdGEgPSBjb2RlICsgKChhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0KSA+PiA0KTsKKyAgICBtdiAgID0gZGF0YSArIEFWX1JCMzIoc3JjICsgMCk7CisgICAgbXNrICA9IG12ICAgKyBBVl9SQjMyKHNyYyArIDQpOworCisgICAgZm9yKGogPSAwOyBqIDwgYXZjdHgtPmhlaWdodDsgaiArPSA0KXsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgYXZjdHgtPndpZHRoOyBpICs9IDQpeworICAgICAgICAgICAgaWYgKGRhdGEgPiBzcmNfZW5kIHx8IG12ID4gc3JjX2VuZCB8fCBtc2sgPiBzcmNfZW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgdG1wICA9IGRzdCArIGk7CisgICAgICAgICAgICB0bXAyID0gcmVmICsgaTsKKyAgICAgICAgICAgIHR5cGUgPSAqY29kZSsrOworICAgICAgICAgICAgc3dpdGNoKHR5cGUpeworICAgICAgICAgICAgY2FzZSA0OiAvLyBtb3Rpb24gY29tcGVuc2F0aW9uCisgICAgICAgICAgICAgICAgeCA9ICgqbXYpID4+IDQ7ICAgIGlmKHggJiA4KSB4ID0gOCAtIHg7CisgICAgICAgICAgICAgICAgeSA9ICgqbXYrKykgJiAweEY7IGlmKHkgJiA4KSB5ID0gOCAtIHk7CisgICAgICAgICAgICAgICAgaWYgKGkgPCAteCB8fCBhdmN0eC0+d2lkdGggIC0gaSAtIDQgPCB4IHx8CisgICAgICAgICAgICAgICAgICAgIGogPCAteSB8fCBhdmN0eC0+aGVpZ2h0IC0gaiAtIDQgPCB5KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTVYgJWQgJWQgb3V0IG9mIGJvdW5kc1xuIiwgeCx5KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRtcDIgKz0geCArIHkqc3RyaWRlOworICAgICAgICAgICAgY2FzZSAwOiAvLyBza2lwCisgICAgICAgICAgICBjYXNlIDU6IC8vIHNraXAgaW4gbWV0aG9kIDEyCisgICAgICAgICAgICAgICAgZm9yKHkgPSAwOyB5IDwgNDsgeSsrKXsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRtcCwgdG1wMiwgNCk7CisgICAgICAgICAgICAgICAgICAgIHRtcCAgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICB0bXAyICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6ICAvLyBtYXNrZWQgY2hhbmdlCisgICAgICAgICAgICBjYXNlIDEwOiAvLyBtYXNrZWQgY2hhbmdlIHdpdGggb25seSBoYWxmIG9mIHBpeGVscyBjaGFuZ2VkCisgICAgICAgICAgICBjYXNlIDExOiAvLyBjYXNlcyAxMC0xNSBhcmUgZm9yIG1ldGhvZCAxMiBvbmx5CisgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIGlmKHR5cGUgPT0gMSl7CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBBVl9SQjE2KG1zayk7CisgICAgICAgICAgICAgICAgICAgIG1zayArPSAyOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICB0eXBlIC09IDEwOworICAgICAgICAgICAgICAgICAgICBtYXNrID0gKChtc2tbMF0gJiAweEYwKSA8PCBzaGlmdDFbdHlwZV0pIHwgKChtc2tbMF0gJiAweEYpIDw8IHNoaWZ0Mlt0eXBlXSk7CisgICAgICAgICAgICAgICAgICAgIG1zaysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCA0OyB5KyspeworICAgICAgICAgICAgICAgICAgICBmb3IoeCA9IDA7IHggPCA0OyB4KyspeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wW3hdID0gKG1hc2sgJiAweDgwMDApID8gKmRhdGErKyA6IHRtcDJbeF07CisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrIDw8PSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRtcCAgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICB0bXAyICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8vIGZpbGwgYmxvY2sKKyAgICAgICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCA0OyB5KyspeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQodG1wLCBkYXRhWzBdLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGF0YSsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiAvLyByYXcgYmxvY2sKKyAgICAgICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCA0OyB5KyspeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkodG1wLCBkYXRhLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSA0OworICAgICAgICAgICAgICAgICAgICB0bXAgICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6IC8vIHN1YmJsb2NrcyAtIG1ldGhvZCAxMyBvbmx5CisgICAgICAgICAgICAgICAgbWFzayA9ICptc2srKzsKKyAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCA0OyBrKyspeworICAgICAgICAgICAgICAgICAgICBkICA9ICgoayAmIDEpIDw8IDEpICsgKChrICYgMikgKiBzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICBkMiA9ICgoayAmIDEpIDw8IDEpICsgKChrICYgMikgKiBzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICB0bXAyID0gcmVmICsgaSArIGQyOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobWFzayAmIDB4QzApeworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODA6IC8vIG1vdGlvbiBjb21wZW5zYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSAoKm12KSA+PiA0OyAgICBpZih4ICYgOCkgeCA9IDggLSB4OworICAgICAgICAgICAgICAgICAgICAgICAgeSA9ICgqbXYrKykgJiAweEY7IGlmKHkgJiA4KSB5ID0gOCAtIHk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDIqKGsgJiAxKSA8IC14IHx8IGF2Y3R4LT53aWR0aCAgLSBpIC0gMiooayAmIDEpIC0gMiA8IHggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICsgICAoayAmIDIpIDwgLXkgfHwgYXZjdHgtPmhlaWdodCAtIGogLSAgIChrICYgMikgLSAyIDwgeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTVYgJWQgJWQgb3V0IG9mIGJvdW5kc1xuIiwgeCx5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgKz0geCArIHkqc3RyaWRlOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDA6IC8vIHNraXAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFtkICsgMCAgICAgICAgIF0gPSB0bXAyWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wW2QgKyAxICAgICAgICAgXSA9IHRtcDJbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBbZCArIDAgKyBzdHJpZGVdID0gdG1wMlswICsgc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFtkICsgMSArIHN0cmlkZV0gPSB0bXAyWzEgKyBzdHJpZGVdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0MDogLy8gZmlsbAorICAgICAgICAgICAgICAgICAgICAgICAgdG1wW2QgKyAwICAgICAgICAgXSA9IGRhdGFbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBbZCArIDEgICAgICAgICBdID0gZGF0YVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFtkICsgMCArIHN0cmlkZV0gPSBkYXRhWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wW2QgKyAxICsgc3RyaWRlXSA9IGRhdGFbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKys7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweEMwOiAvLyByYXcKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFtkICsgMCAgICAgICAgIF0gPSAqZGF0YSsrOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wW2QgKyAxICAgICAgICAgXSA9ICpkYXRhKys7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBbZCArIDAgKyBzdHJpZGVdID0gKmRhdGErKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFtkICsgMSArIHN0cmlkZV0gPSAqZGF0YSsrOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWFzayA8PD0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOiAvLyB2ZWN0b3IgcXVhbnRpemF0aW9uIC0gMiBjb2xvcnMKKyAgICAgICAgICAgICAgICBtYXNrID0gQVZfUkIxNihtc2spOworICAgICAgICAgICAgICAgIG1zayArPSAyOworICAgICAgICAgICAgICAgIGZvcih5ID0gMDsgeSA8IDQ7IHkrKyl7CisgICAgICAgICAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IDQ7IHgrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBbeF0gPSBkYXRhW21hc2sgJiAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPj49IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG1wICArPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYXRhICs9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzOiAvLyB2ZWN0b3IgcXVhbnRpemF0aW9uIC0gMyBvciA0IGNvbG9ycworICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICBtYXNrID0gQVZfUkIzMihtc2spOworICAgICAgICAgICAgICAgIG1zayArPSA0OworICAgICAgICAgICAgICAgIGZvcih5ID0gMDsgeSA8IDQ7IHkrKyl7CisgICAgICAgICAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IDQ7IHgrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBbeF0gPSBkYXRhW21hc2sgJiAzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPj49IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG1wICArPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYXRhICs9IHR5cGUgLSAzMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIG9wY29kZSAlZFxuIiwgdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZHN0ICs9IHN0cmlkZSAqIDQ7CisgICAgICAgIHJlZiArPSBzdHJpZGUgKiA0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBEeGFEZWNDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqb3V0cHRyLCAqc3JjcHRyLCAqdG1wcHRyOworICAgIHVuc2lnbmVkIGxvbmcgZHNpemU7CisgICAgaW50IGksIGosIGNvbXByLCByZXQ7CisgICAgaW50IHN0cmlkZTsKKyAgICBpbnQgcGMgPSAwOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisKKyAgICAvKiBtYWtlIHRoZSBwYWxldHRlIGF2YWlsYWJsZSBvbiB0aGUgd2F5IG91dCAqLworICAgIGlmIChieXRlc3RyZWFtMl9wZWVrX2xlMzIoJmdiKSA9PSBNS1RBRygnQycsJ00nLCdBJywnUCcpKSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCA0KTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspeworICAgICAgICAgICAgYy0+cGFsW2ldID0gMHhGRlUgPDwgMjQgfCBieXRlc3RyZWFtMl9nZXRfYmUyNCgmZ2IpOworICAgICAgICB9CisgICAgICAgIHBjID0gMTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG1lbWNweShmcmFtZS0+ZGF0YVsxXSwgYy0+cGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSBwYzsKKworICAgIG91dHB0ciA9IGZyYW1lLT5kYXRhWzBdOworICAgIHNyY3B0ciA9IGMtPmRlY29tcF9idWY7CisgICAgdG1wcHRyID0gYy0+cHJldi0+ZGF0YVswXTsKKyAgICBzdHJpZGUgPSBmcmFtZS0+bGluZXNpemVbMF07CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKSA9PSBNS1RBRygnTicsJ1UnLCdMJywnTCcpKQorICAgICAgICBjb21wciA9IC0xOworICAgIGVsc2UKKyAgICAgICAgY29tcHIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworCisgICAgZHNpemUgPSBjLT5kc2l6ZTsKKyAgICBpZiAoY29tcHIgIT0gNCAmJiBjb21wciAhPSAtMSkgeworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgNCk7CisgICAgICAgIGlmICh1bmNvbXByZXNzKGMtPmRlY29tcF9idWYsICZkc2l6ZSwgYXZwa3QtPmRhdGEgKyBieXRlc3RyZWFtMl90ZWxsKCZnYiksCisgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikpICE9IFpfT0spIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5jb21wcmVzcyBmYWlsZWQhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGMtPmRlY29tcF9idWYgKyBkc2l6ZSwgMCwgREVDT01QX0JVRl9QQURESU5HKTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImNvbXByOiUyZCwgZHNpemU6JWRcbiIsIGNvbXByLCAoaW50KWRzaXplKTsKKworICAgIHN3aXRjaChjb21wcil7CisgICAgY2FzZSAtMToKKyAgICAgICAgZnJhbWUtPmtleV9mcmFtZSA9IDA7CisgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgaWYgKGMtPnByZXYtPmRhdGFbMF0pCisgICAgICAgICAgICBtZW1jcHkoZnJhbWUtPmRhdGFbMF0sIGMtPnByZXYtPmRhdGFbMF0sIGZyYW1lLT5saW5lc2l6ZVswXSAqIGF2Y3R4LT5oZWlnaHQpOworICAgICAgICBlbHNleyAvLyBTaG91bGQgaGFwcGVuIG9ubHkgd2hlbiBmaXJzdCBmcmFtZSBpcyAnTlVMTCcKKyAgICAgICAgICAgIG1lbXNldChmcmFtZS0+ZGF0YVswXSwgMCwgZnJhbWUtPmxpbmVzaXplWzBdICogYXZjdHgtPmhlaWdodCk7CisgICAgICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICAgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgY2FzZSA0OgorICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPmhlaWdodDsgaisrKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG91dHB0ciwgc3JjcHRyLCBhdmN0eC0+d2lkdGgpOworICAgICAgICAgICAgb3V0cHRyICs9IHN0cmlkZTsKKyAgICAgICAgICAgIHNyY3B0ciArPSBhdmN0eC0+d2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgIGNhc2UgNToKKyAgICAgICAgaWYgKCF0bXBwdHIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyByZWZlcmVuY2UgZnJhbWUuXG4iKTsKKyAgICAgICAgICAgIGlmICghKGF2Y3R4LT5mbGFnczIgJiBDT0RFQ19GTEFHMl9TSE9XX0FMTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgZnJhbWUtPmtleV9mcmFtZSA9IDA7CisgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT5oZWlnaHQ7IGorKykgeworICAgICAgICAgICAgaWYodG1wcHRyKXsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBhdmN0eC0+d2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgb3V0cHRyW2ldID0gc3JjcHRyW2ldIF4gdG1wcHRyW2ldOworICAgICAgICAgICAgICAgIHRtcHB0ciArPSBzdHJpZGU7CisgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgIG1lbWNweShvdXRwdHIsIHNyY3B0ciwgYXZjdHgtPndpZHRoKTsKKyAgICAgICAgICAgIG91dHB0ciArPSBzdHJpZGU7CisgICAgICAgICAgICBzcmNwdHIgKz0gYXZjdHgtPndpZHRoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6IC8vIFNjdW1tVk0gY29kaW5nCisgICAgY2FzZSAxMzoKKyAgICAgICAgZnJhbWUtPmtleV9mcmFtZSA9IDA7CisgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgaWYgKCFjLT5wcmV2LT5kYXRhWzBdKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgcmVmZXJlbmNlIGZyYW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGRlY29kZV8xMyhhdmN0eCwgYywgZnJhbWUtPmRhdGFbMF0sIGZyYW1lLT5saW5lc2l6ZVswXSwgc3JjcHRyLCBkc2l6ZSwgYy0+cHJldi0+ZGF0YVswXSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93bi91bnN1cHBvcnRlZCBjb21wcmVzc2lvbiB0eXBlICVkXG4iLCBjb21wcik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2X2ZyYW1lX3VucmVmKGMtPnByZXYpOworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGMtPnByZXYsIGZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICAvKiBhbHdheXMgcmVwb3J0IHRoYXQgdGhlIGJ1ZmZlciB3YXMgY29tcGxldGVseSBjb25zdW1lZCAqLworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBEeGFEZWNDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXZjdHgtPndpZHRoJTQgfHwgYXZjdHgtPmhlaWdodCU0KSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgImRpbWVuc2lvbnMgYXJlIG5vdCBhIG11bHRpcGxlIG9mIDQiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYy0+cHJldiA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFjLT5wcmV2KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICBjLT5kc2l6ZSA9IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiAyOworICAgIGMtPmRlY29tcF9idWYgPSBhdl9tYWxsb2MoYy0+ZHNpemUgKyBERUNPTVBfQlVGX1BBRERJTkcpOworICAgIGlmICghYy0+ZGVjb21wX2J1ZikgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZjLT5wcmV2KTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW4ndCBhbGxvY2F0ZSBkZWNvbXByZXNzaW9uIGJ1ZmZlci5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRHhhRGVjQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmMtPmRlY29tcF9idWYpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmMtPnByZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfZHhhX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImR4YSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZlZWJsZSBGaWxlcy9TY3VtbVZNIERYQSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9EWEEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKER4YURlY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHh0b3J5LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9keHRvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDhiN2IyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHh0b3J5LmMKQEAgLTAsMCArMSw3NTEgQEAKKy8qCisgKiBEeHRvcnkgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKK3N0YXRpYyBpbnQgZHh0b3J5X2RlY29kZV92MV9yZ2IoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQsIGludCBicHApCit7CisgICAgaW50IGg7CisgICAgdWludDhfdCAqZHN0OworICAgIGludCByZXQ7CisKKyAgICBpZiAoc3JjX3NpemUgPCBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogKGludDY0X3QpYnBwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGFja2V0IHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2Y3R4LT5waXhfZm10ID0gaWQ7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwaWMsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBkc3QgPSBwaWMtPmRhdGFbMF07CisgICAgZm9yIChoID0gMDsgaCA8IGF2Y3R4LT5oZWlnaHQ7IGgrKykgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGF2Y3R4LT53aWR0aCAqIGJwcCk7CisgICAgICAgIHNyYyArPSBhdmN0eC0+d2lkdGggKiBicHA7CisgICAgICAgIGRzdCArPSBwaWMtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR4dG9yeV9kZWNvZGVfdjFfNDEwKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBpbnQgaCwgdzsKKyAgICB1aW50OF90ICpZMSwgKlkyLCAqWTMsICpZNCwgKlUsICpWOworICAgIGludCByZXQ7CisKKyAgICBpZiAoc3JjX3NpemUgPCBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogOUwgLyA4KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGFja2V0IHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MTBQOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgWTEgPSBwaWMtPmRhdGFbMF07CisgICAgWTIgPSBwaWMtPmRhdGFbMF0gKyBwaWMtPmxpbmVzaXplWzBdOworICAgIFkzID0gcGljLT5kYXRhWzBdICsgcGljLT5saW5lc2l6ZVswXSAqIDI7CisgICAgWTQgPSBwaWMtPmRhdGFbMF0gKyBwaWMtPmxpbmVzaXplWzBdICogMzsKKyAgICBVICA9IHBpYy0+ZGF0YVsxXTsKKyAgICBWICA9IHBpYy0+ZGF0YVsyXTsKKyAgICBmb3IgKGggPSAwOyBoIDwgYXZjdHgtPmhlaWdodDsgaCArPSA0KSB7CisgICAgICAgIGZvciAodyA9IDA7IHcgPCBhdmN0eC0+d2lkdGg7IHcgKz0gNCkgeworICAgICAgICAgICAgQVZfQ09QWTMyVShZMSArIHcsIHNyYyk7CisgICAgICAgICAgICBBVl9DT1BZMzJVKFkyICsgdywgc3JjICsgNCk7CisgICAgICAgICAgICBBVl9DT1BZMzJVKFkzICsgdywgc3JjICsgOCk7CisgICAgICAgICAgICBBVl9DT1BZMzJVKFk0ICsgdywgc3JjICsgMTIpOworICAgICAgICAgICAgVVt3ID4+IDJdID0gc3JjWzE2XSArIDB4ODA7CisgICAgICAgICAgICBWW3cgPj4gMl0gPSBzcmNbMTddICsgMHg4MDsKKyAgICAgICAgICAgIHNyYyArPSAxODsKKyAgICAgICAgfQorICAgICAgICBZMSArPSBwaWMtPmxpbmVzaXplWzBdIDw8IDI7CisgICAgICAgIFkyICs9IHBpYy0+bGluZXNpemVbMF0gPDwgMjsKKyAgICAgICAgWTMgKz0gcGljLT5saW5lc2l6ZVswXSA8PCAyOworICAgICAgICBZNCArPSBwaWMtPmxpbmVzaXplWzBdIDw8IDI7CisgICAgICAgIFUgICs9IHBpYy0+bGluZXNpemVbMV07CisgICAgICAgIFYgICs9IHBpYy0+bGluZXNpemVbMl07CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHh0b3J5X2RlY29kZV92MV80MjAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19zaXplKQoreworICAgIGludCBoLCB3OworICAgIHVpbnQ4X3QgKlkxLCAqWTIsICpVLCAqVjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHNyY19zaXplIDwgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqIDNMIC8gMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBhY2tldCB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpYywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIFkxID0gcGljLT5kYXRhWzBdOworICAgIFkyID0gcGljLT5kYXRhWzBdICsgcGljLT5saW5lc2l6ZVswXTsKKyAgICBVICA9IHBpYy0+ZGF0YVsxXTsKKyAgICBWICA9IHBpYy0+ZGF0YVsyXTsKKyAgICBmb3IgKGggPSAwOyBoIDwgYXZjdHgtPmhlaWdodDsgaCArPSAyKSB7CisgICAgICAgIGZvciAodyA9IDA7IHcgPCBhdmN0eC0+d2lkdGg7IHcgKz0gMikgeworICAgICAgICAgICAgQVZfQ09QWTE2KFkxICsgdywgc3JjKTsKKyAgICAgICAgICAgIEFWX0NPUFkxNihZMiArIHcsIHNyYyArIDIpOworICAgICAgICAgICAgVVt3ID4+IDFdID0gc3JjWzRdICsgMHg4MDsKKyAgICAgICAgICAgIFZbdyA+PiAxXSA9IHNyY1s1XSArIDB4ODA7CisgICAgICAgICAgICBzcmMgKz0gNjsKKyAgICAgICAgfQorICAgICAgICBZMSArPSBwaWMtPmxpbmVzaXplWzBdIDw8IDE7CisgICAgICAgIFkyICs9IHBpYy0+bGluZXNpemVbMF0gPDwgMTsKKyAgICAgICAgVSAgKz0gcGljLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgViAgKz0gcGljLT5saW5lc2l6ZVsyXTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeHRvcnlfZGVjb2RlX3YxXzQ0NChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3NpemUpCit7CisgICAgaW50IGgsIHc7CisgICAgdWludDhfdCAqWSwgKlUsICpWOworICAgIGludCByZXQ7CisKKyAgICBpZiAoc3JjX3NpemUgPCBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogM0wpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwYWNrZXQgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwaWMsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBZID0gcGljLT5kYXRhWzBdOworICAgIFUgPSBwaWMtPmRhdGFbMV07CisgICAgViA9IHBpYy0+ZGF0YVsyXTsKKyAgICBmb3IgKGggPSAwOyBoIDwgYXZjdHgtPmhlaWdodDsgaCsrKSB7CisgICAgICAgIGZvciAodyA9IDA7IHcgPCBhdmN0eC0+d2lkdGg7IHcrKykgeworICAgICAgICAgICAgWVt3XSA9ICpzcmMrKzsKKyAgICAgICAgICAgIFVbd10gPSAqc3JjKysgXiAweDgwOworICAgICAgICAgICAgVlt3XSA9ICpzcmMrKyBeIDB4ODA7CisgICAgICAgIH0KKyAgICAgICAgWSArPSBwaWMtPmxpbmVzaXplWzBdOworICAgICAgICBVICs9IHBpYy0+bGluZXNpemVbMV07CisgICAgICAgIFYgKz0gcGljLT5saW5lc2l6ZVsyXTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGVmX2xydVs4XSA9IHsgMHgwMCwgMHgyMCwgMHg0MCwgMHg2MCwgMHg4MCwgMHhBMCwgMHhDMCwgMHhGRiB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGVmX2xydV81NTVbOF0gPSB7IDB4MDAsIDB4MDgsIDB4MTAsIDB4MTgsIDB4MUYgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGRlZl9scnVfNTY1WzhdID0geyAweDAwLCAweDA4LCAweDEwLCAweDIwLCAweDMwLCAweDNGIH07CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBkZWNvZGVfc3ltKEdldEJpdENvbnRleHQgKmdiLCB1aW50OF90IGxydVs4XSkKK3sKKyAgICB1aW50OF90IGMsIHZhbDsKKworICAgIGMgPSBnZXRfdW5hcnkoZ2IsIDAsIDgpOworICAgIGlmICghYykgeworICAgICAgICB2YWwgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIG1lbW1vdmUobHJ1ICsgMSwgbHJ1LCBzaXplb2YoKmxydSkgKiAoOCAtIDEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWwgPSBscnVbYyAtIDFdOworICAgICAgICBtZW1tb3ZlKGxydSArIDEsIGxydSwgc2l6ZW9mKCpscnUpICogKGMgLSAxKSk7CisgICAgfQorICAgIGxydVswXSA9IHZhbDsKKworICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBkZWNvZGVfc3ltXzU2NShHZXRCaXRDb250ZXh0ICpnYiwgdWludDhfdCBscnVbOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMpCit7CisgICAgdWludDhfdCBjLCB2YWw7CisKKyAgICBjID0gZ2V0X3VuYXJ5KGdiLCAwLCBiaXRzKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgdmFsID0gZ2V0X2JpdHMoZ2IsIGJpdHMpOworICAgICAgICBtZW1tb3ZlKGxydSArIDEsIGxydSwgc2l6ZW9mKCpscnUpICogKDYgLSAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsID0gbHJ1W2MgLSAxXTsKKyAgICAgICAgbWVtbW92ZShscnUgKyAxLCBscnUsIHNpemVvZigqbHJ1KSAqIChjIC0gMSkpOworICAgIH0KKyAgICBscnVbMF0gPSB2YWw7CisKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IGR4Ml9kZWNvZGVfc2xpY2VfNTY1KEdldEJpdENvbnRleHQgKmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGlzXzU2NSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgciwgZywgYjsKKyAgICB1aW50OF90IGxydVszXVs4XTsKKworICAgIG1lbWNweShscnVbMF0sIGRlZl9scnVfNTU1LCA4ICogc2l6ZW9mKCpkZWZfbHJ1KSk7CisgICAgbWVtY3B5KGxydVsxXSwgaXNfNTY1ID8gZGVmX2xydV81NjUgOiBkZWZfbHJ1XzU1NSwgOCAqIHNpemVvZigqZGVmX2xydSkpOworICAgIG1lbWNweShscnVbMl0sIGRlZl9scnVfNTU1LCA4ICogc2l6ZW9mKCpkZWZfbHJ1KSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGIgPSBkZWNvZGVfc3ltXzU2NShnYiwgbHJ1WzBdLCA1KTsKKyAgICAgICAgICAgIGcgPSBkZWNvZGVfc3ltXzU2NShnYiwgbHJ1WzFdLCBpc181NjUgPyA2IDogNSk7CisgICAgICAgICAgICByID0gZGVjb2RlX3N5bV81NjUoZ2IsIGxydVsyXSwgNSk7CisgICAgICAgICAgICBkc3RbeCAqIDMgKyAwXSA9IChyIDw8IDMpIHwgKHIgPj4gMik7CisgICAgICAgICAgICBkc3RbeCAqIDMgKyAxXSA9IGlzXzU2NSA/IChnIDw8IDIpIHwgKGcgPj4gNCkgOiAoZyA8PCAzKSB8IChnID4+IDIpOworICAgICAgICAgICAgZHN0W3ggKiAzICsgMl0gPSAoYiA8PCAzKSB8IChiID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeHRvcnlfZGVjb2RlX3YyXzU2NShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3NpemUsIGludCBpc181NjUpCit7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgR2V0Qml0Q29udGV4dCAgZ2IyOworICAgIGludCBuc2xpY2VzLCBzbGljZSwgc2xpY2VfaGVpZ2h0OworICAgIHVpbnQzMl90IG9mZiwgc2xpY2Vfc2l6ZTsKKyAgICB1aW50OF90ICpkc3Q7CisgICAgaW50IHJldDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBzcmMsIHNyY19zaXplKTsKKyAgICBuc2xpY2VzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKyAgICBvZmYgPSBGRkFMSUdOKG5zbGljZXMgKiA0ICsgMiwgMTYpOworICAgIGlmIChzcmNfc2l6ZSA8IG9mZikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm5vIHNsaWNlIGRhdGFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoIW5zbGljZXMgfHwgYXZjdHgtPmhlaWdodCAlIG5zbGljZXMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiJWQgc2xpY2VzIGZvciAlZHglZCIsIG5zbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgc2xpY2VfaGVpZ2h0ID0gYXZjdHgtPmhlaWdodCAvIG5zbGljZXM7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjI0OworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZHN0ID0gcGljLT5kYXRhWzBdOworICAgIGZvciAoc2xpY2UgPSAwOyBzbGljZSA8IG5zbGljZXM7IHNsaWNlKyspIHsKKyAgICAgICAgc2xpY2Vfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgICAgIGlmIChzbGljZV9zaXplID4gc3JjX3NpemUgLSBvZmYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHNsaWNlIHNpemUgJSJQUkl1MzIiIChvbmx5ICUiUFJJdTMyIiBieXRlcyBsZWZ0KVxuIiwKKyAgICAgICAgICAgICAgICAgICBzbGljZV9zaXplLCBzcmNfc2l6ZSAtIG9mZik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2xpY2Vfc2l6ZSA8PSAxNikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHNsaWNlIHNpemUgJSJQUkl1MzIiXG4iLCBzbGljZV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEFWX1JMMzIoc3JjICsgb2ZmKSAhPSBzbGljZV9zaXplIC0gMTYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJTbGljZSBzaXplcyBtaXNtYXRjaDogZ290ICUiUFJJdTMyIiBpbnN0ZWFkIG9mICUiUFJJdTMyIlxuIiwKKyAgICAgICAgICAgICAgICAgICBBVl9STDMyKHNyYyArIG9mZiksIHNsaWNlX3NpemUgLSAxNik7CisgICAgICAgIH0KKyAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IyLCBzcmMgKyBvZmYgKyAxNiwgKHNsaWNlX3NpemUgLSAxNikgKiA4KTsKKyAgICAgICAgZHgyX2RlY29kZV9zbGljZV81NjUoJmdiMiwgYXZjdHgtPndpZHRoLCBzbGljZV9oZWlnaHQsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5saW5lc2l6ZVswXSwgaXNfNTY1KTsKKworICAgICAgICBkc3QgKz0gcGljLT5saW5lc2l6ZVswXSAqIHNsaWNlX2hlaWdodDsKKyAgICAgICAgb2ZmICs9IHNsaWNlX3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHgyX2RlY29kZV9zbGljZV9yZ2IoR2V0Qml0Q29udGV4dCAqZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgc3RyaWRlKQoreworICAgIGludCB4LCB5LCBpOworICAgIHVpbnQ4X3QgbHJ1WzNdWzhdOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgbWVtY3B5KGxydVtpXSwgZGVmX2xydSwgOCAqIHNpemVvZigqZGVmX2xydSkpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBkc3RbeCAqIDMgKyAwXSA9IGRlY29kZV9zeW0oZ2IsIGxydVswXSk7CisgICAgICAgICAgICBkc3RbeCAqIDMgKyAxXSA9IGRlY29kZV9zeW0oZ2IsIGxydVsxXSk7CisgICAgICAgICAgICBkc3RbeCAqIDMgKyAyXSA9IGRlY29kZV9zeW0oZ2IsIGxydVsyXSk7CisgICAgICAgIH0KKworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR4dG9yeV9kZWNvZGVfdjJfcmdiKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBHZXRCaXRDb250ZXh0ICBnYjI7CisgICAgaW50IG5zbGljZXMsIHNsaWNlLCBzbGljZV9oZWlnaHQ7CisgICAgdWludDMyX3Qgb2ZmLCBzbGljZV9zaXplOworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBpbnQgcmV0OworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIHNyYywgc3JjX3NpemUpOworICAgIG5zbGljZXMgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpOworICAgIG9mZiA9IEZGQUxJR04obnNsaWNlcyAqIDQgKyAyLCAxNik7CisgICAgaWYgKHNyY19zaXplIDwgb2ZmKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibm8gc2xpY2UgZGF0YVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICghbnNsaWNlcyB8fCBhdmN0eC0+aGVpZ2h0ICUgbnNsaWNlcykgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICIlZCBzbGljZXMgZm9yICVkeCVkIiwgbnNsaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBzbGljZV9oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0IC8gbnNsaWNlczsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQ7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwaWMsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBkc3QgPSBwaWMtPmRhdGFbMF07CisgICAgZm9yIChzbGljZSA9IDA7IHNsaWNlIDwgbnNsaWNlczsgc2xpY2UrKykgeworICAgICAgICBzbGljZV9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKKyAgICAgICAgaWYgKHNsaWNlX3NpemUgPiBzcmNfc2l6ZSAtIG9mZikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImludmFsaWQgc2xpY2Ugc2l6ZSAlIlBSSXUzMiIgKG9ubHkgJSJQUkl1MzIiIGJ5dGVzIGxlZnQpXG4iLAorICAgICAgICAgICAgICAgICAgIHNsaWNlX3NpemUsIHNyY19zaXplIC0gb2ZmKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChzbGljZV9zaXplIDw9IDE2KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc2xpY2Ugc2l6ZSAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgc2xpY2Vfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChBVl9STDMyKHNyYyArIG9mZikgIT0gc2xpY2Vfc2l6ZSAtIDE2KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiU2xpY2Ugc2l6ZXMgbWlzbWF0Y2g6IGdvdCAlIlBSSXUzMiIgaW5zdGVhZCBvZiAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgQVZfUkwzMihzcmMgKyBvZmYpLCBzbGljZV9zaXplIC0gMTYpOworICAgICAgICB9CisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiMiwgc3JjICsgb2ZmICsgMTYsIChzbGljZV9zaXplIC0gMTYpICogOCk7CisgICAgICAgIGR4Ml9kZWNvZGVfc2xpY2VfcmdiKCZnYjIsIGF2Y3R4LT53aWR0aCwgc2xpY2VfaGVpZ2h0LCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+bGluZXNpemVbMF0pOworCisgICAgICAgIGRzdCArPSBwaWMtPmxpbmVzaXplWzBdICogc2xpY2VfaGVpZ2h0OworICAgICAgICBvZmYgKz0gc2xpY2Vfc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeDJfZGVjb2RlX3NsaWNlXzQxMChHZXRCaXRDb250ZXh0ICpnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpZLCB1aW50OF90ICpVLCB1aW50OF90ICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwgaW50IHVzdHJpZGUsIGludCB2c3RyaWRlKQoreworICAgIGludCB4LCB5LCBpLCBqOworICAgIHVpbnQ4X3QgbHJ1WzNdWzhdOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgbWVtY3B5KGxydVtpXSwgZGVmX2xydSwgOCAqIHNpemVvZigqZGVmX2xydSkpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSA0KSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCArPSA0KSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIFlbeCArIGkgKyBqICogeXN0cmlkZV0gPSBkZWNvZGVfc3ltKGdiLCBscnVbMF0pOworICAgICAgICAgICAgVVt4ID4+IDJdID0gZGVjb2RlX3N5bShnYiwgbHJ1WzFdKSBeIDB4ODA7CisgICAgICAgICAgICBWW3ggPj4gMl0gPSBkZWNvZGVfc3ltKGdiLCBscnVbMl0pIF4gMHg4MDsKKyAgICAgICAgfQorCisgICAgICAgIFkgKz0geXN0cmlkZSA8PCAyOworICAgICAgICBVICs9IHVzdHJpZGU7CisgICAgICAgIFYgKz0gdnN0cmlkZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeHRvcnlfZGVjb2RlX3YyXzQxMChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3NpemUpCit7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgR2V0Qml0Q29udGV4dCAgZ2IyOworICAgIGludCBuc2xpY2VzLCBzbGljZSwgc2xpY2VfaGVpZ2h0OworICAgIGludCBjdXJfeSwgbmV4dF95OworICAgIHVpbnQzMl90IG9mZiwgc2xpY2Vfc2l6ZTsKKyAgICB1aW50OF90ICpZLCAqVSwgKlY7CisgICAgaW50IHJldDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBzcmMsIHNyY19zaXplKTsKKyAgICBuc2xpY2VzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKyAgICBvZmYgPSBGRkFMSUdOKG5zbGljZXMgKiA0ICsgMiwgMTYpOworICAgIGlmIChzcmNfc2l6ZSA8IG9mZikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm5vIHNsaWNlIGRhdGFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoIW5zbGljZXMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiJWQgc2xpY2VzIGZvciAlZHglZCIsIG5zbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKChhdmN0eC0+d2lkdGggJiAzKSB8fCAoYXZjdHgtPmhlaWdodCAmIDMpKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkZyYW1lIGRpbWVuc2lvbnMgJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICB9CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDEwUDsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpYywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIFkgPSBwaWMtPmRhdGFbMF07CisgICAgVSA9IHBpYy0+ZGF0YVsxXTsKKyAgICBWID0gcGljLT5kYXRhWzJdOworCisgICAgY3VyX3kgID0gMDsKKyAgICBmb3IgKHNsaWNlID0gMDsgc2xpY2UgPCBuc2xpY2VzOyBzbGljZSsrKSB7CisgICAgICAgIHNsaWNlX3NpemUgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgICAgIG5leHRfeSA9ICgoc2xpY2UgKyAxKSAqIGF2Y3R4LT5oZWlnaHQpIC8gbnNsaWNlczsKKyAgICAgICAgc2xpY2VfaGVpZ2h0ID0gKG5leHRfeSAmIH4zKSAtIChjdXJfeSAmIH4zKTsKKyAgICAgICAgaWYgKHNsaWNlX3NpemUgPiBzcmNfc2l6ZSAtIG9mZikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImludmFsaWQgc2xpY2Ugc2l6ZSAlIlBSSXUzMiIgKG9ubHkgJSJQUkl1MzIiIGJ5dGVzIGxlZnQpXG4iLAorICAgICAgICAgICAgICAgICAgIHNsaWNlX3NpemUsIHNyY19zaXplIC0gb2ZmKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChzbGljZV9zaXplIDw9IDE2KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc2xpY2Ugc2l6ZSAlIlBSSXUzMiJcbiIsIHNsaWNlX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQVZfUkwzMihzcmMgKyBvZmYpICE9IHNsaWNlX3NpemUgLSAxNikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlNsaWNlIHNpemVzIG1pc21hdGNoOiBnb3QgJSJQUkl1MzIiIGluc3RlYWQgb2YgJSJQUkl1MzIiXG4iLAorICAgICAgICAgICAgICAgICAgIEFWX1JMMzIoc3JjICsgb2ZmKSwgc2xpY2Vfc2l6ZSAtIDE2KTsKKyAgICAgICAgfQorICAgICAgICBpbml0X2dldF9iaXRzKCZnYjIsIHNyYyArIG9mZiArIDE2LCAoc2xpY2Vfc2l6ZSAtIDE2KSAqIDgpOworICAgICAgICBkeDJfZGVjb2RlX3NsaWNlXzQxMCgmZ2IyLCBhdmN0eC0+d2lkdGgsIHNsaWNlX2hlaWdodCwgWSwgVSwgViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5saW5lc2l6ZVswXSwgcGljLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5saW5lc2l6ZVsyXSk7CisKKyAgICAgICAgWSArPSBwaWMtPmxpbmVzaXplWzBdICogIHNsaWNlX2hlaWdodDsKKyAgICAgICAgVSArPSBwaWMtPmxpbmVzaXplWzFdICogKHNsaWNlX2hlaWdodCA+PiAyKTsKKyAgICAgICAgViArPSBwaWMtPmxpbmVzaXplWzJdICogKHNsaWNlX2hlaWdodCA+PiAyKTsKKyAgICAgICAgb2ZmICs9IHNsaWNlX3NpemU7CisgICAgICAgIGN1cl95ICAgPSBuZXh0X3k7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHgyX2RlY29kZV9zbGljZV80MjAoR2V0Qml0Q29udGV4dCAqZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqWSwgdWludDhfdCAqVSwgdWludDhfdCAqViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsIGludCB1c3RyaWRlLCBpbnQgdnN0cmlkZSkKK3sKKyAgICBpbnQgeCwgeSwgaTsKKyAgICB1aW50OF90IGxydVszXVs4XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIG1lbWNweShscnVbaV0sIGRlZl9scnUsIDggKiBzaXplb2YoKmRlZl9scnUpKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrPTIpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIFlbeCArIDAgKyAwICogeXN0cmlkZV0gPSBkZWNvZGVfc3ltKGdiLCBscnVbMF0pOworICAgICAgICAgICAgWVt4ICsgMSArIDAgKiB5c3RyaWRlXSA9IGRlY29kZV9zeW0oZ2IsIGxydVswXSk7CisgICAgICAgICAgICBZW3ggKyAwICsgMSAqIHlzdHJpZGVdID0gZGVjb2RlX3N5bShnYiwgbHJ1WzBdKTsKKyAgICAgICAgICAgIFlbeCArIDEgKyAxICogeXN0cmlkZV0gPSBkZWNvZGVfc3ltKGdiLCBscnVbMF0pOworICAgICAgICAgICAgVVt4ID4+IDFdID0gZGVjb2RlX3N5bShnYiwgbHJ1WzFdKSBeIDB4ODA7CisgICAgICAgICAgICBWW3ggPj4gMV0gPSBkZWNvZGVfc3ltKGdiLCBscnVbMl0pIF4gMHg4MDsKKyAgICAgICAgfQorCisgICAgICAgIFkgKz0geXN0cmlkZSA8PCAxOworICAgICAgICBVICs9IHVzdHJpZGU7CisgICAgICAgIFYgKz0gdnN0cmlkZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeHRvcnlfZGVjb2RlX3YyXzQyMChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3NpemUpCit7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgR2V0Qml0Q29udGV4dCAgZ2IyOworICAgIGludCBuc2xpY2VzLCBzbGljZSwgc2xpY2VfaGVpZ2h0OworICAgIGludCBjdXJfeSwgbmV4dF95OworICAgIHVpbnQzMl90IG9mZiwgc2xpY2Vfc2l6ZTsKKyAgICB1aW50OF90ICpZLCAqVSwgKlY7CisgICAgaW50IHJldDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBzcmMsIHNyY19zaXplKTsKKyAgICBuc2xpY2VzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKyAgICBvZmYgPSBGRkFMSUdOKG5zbGljZXMgKiA0ICsgMiwgMTYpOworICAgIGlmIChzcmNfc2l6ZSA8IG9mZikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm5vIHNsaWNlIGRhdGFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoIW5zbGljZXMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiJWQgc2xpY2VzIGZvciAlZHglZCIsIG5zbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKChhdmN0eC0+d2lkdGggJiAxKSB8fCAoYXZjdHgtPmhlaWdodCAmIDEpKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkZyYW1lIGRpbWVuc2lvbnMgJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICB9CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpYywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIFkgPSBwaWMtPmRhdGFbMF07CisgICAgVSA9IHBpYy0+ZGF0YVsxXTsKKyAgICBWID0gcGljLT5kYXRhWzJdOworCisgICAgY3VyX3kgID0gMDsKKyAgICBmb3IgKHNsaWNlID0gMDsgc2xpY2UgPCBuc2xpY2VzOyBzbGljZSsrKSB7CisgICAgICAgIHNsaWNlX3NpemUgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgICAgIG5leHRfeSA9ICgoc2xpY2UgKyAxKSAqIGF2Y3R4LT5oZWlnaHQpIC8gbnNsaWNlczsKKyAgICAgICAgc2xpY2VfaGVpZ2h0ID0gKG5leHRfeSAmIH4xKSAtIChjdXJfeSAmIH4xKTsKKyAgICAgICAgaWYgKHNsaWNlX3NpemUgPiBzcmNfc2l6ZSAtIG9mZikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImludmFsaWQgc2xpY2Ugc2l6ZSAlIlBSSXUzMiIgKG9ubHkgJSJQUkl1MzIiIGJ5dGVzIGxlZnQpXG4iLAorICAgICAgICAgICAgICAgICAgIHNsaWNlX3NpemUsIHNyY19zaXplIC0gb2ZmKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChzbGljZV9zaXplIDw9IDE2KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc2xpY2Ugc2l6ZSAlIlBSSXUzMiJcbiIsIHNsaWNlX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQVZfUkwzMihzcmMgKyBvZmYpICE9IHNsaWNlX3NpemUgLSAxNikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlNsaWNlIHNpemVzIG1pc21hdGNoOiBnb3QgJSJQUkl1MzIiIGluc3RlYWQgb2YgJSJQUkl1MzIiXG4iLAorICAgICAgICAgICAgICAgICAgIEFWX1JMMzIoc3JjICsgb2ZmKSwgc2xpY2Vfc2l6ZSAtIDE2KTsKKyAgICAgICAgfQorICAgICAgICBpbml0X2dldF9iaXRzKCZnYjIsIHNyYyArIG9mZiArIDE2LCAoc2xpY2Vfc2l6ZSAtIDE2KSAqIDgpOworICAgICAgICBkeDJfZGVjb2RlX3NsaWNlXzQyMCgmZ2IyLCBhdmN0eC0+d2lkdGgsIHNsaWNlX2hlaWdodCwgWSwgVSwgViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5saW5lc2l6ZVswXSwgcGljLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5saW5lc2l6ZVsyXSk7CisKKyAgICAgICAgWSArPSBwaWMtPmxpbmVzaXplWzBdICogIHNsaWNlX2hlaWdodDsKKyAgICAgICAgVSArPSBwaWMtPmxpbmVzaXplWzFdICogKHNsaWNlX2hlaWdodCA+PiAxKTsKKyAgICAgICAgViArPSBwaWMtPmxpbmVzaXplWzJdICogKHNsaWNlX2hlaWdodCA+PiAxKTsKKyAgICAgICAgb2ZmICs9IHNsaWNlX3NpemU7CisgICAgICAgIGN1cl95ICAgPSBuZXh0X3k7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHgyX2RlY29kZV9zbGljZV80NDQoR2V0Qml0Q29udGV4dCAqZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqWSwgdWludDhfdCAqVSwgdWludDhfdCAqViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsIGludCB1c3RyaWRlLCBpbnQgdnN0cmlkZSkKK3sKKyAgICBpbnQgeCwgeSwgaTsKKyAgICB1aW50OF90IGxydVszXVs4XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIG1lbWNweShscnVbaV0sIGRlZl9scnUsIDggKiBzaXplb2YoKmRlZl9scnUpKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgWVt4XSA9IGRlY29kZV9zeW0oZ2IsIGxydVswXSk7CisgICAgICAgICAgICBVW3hdID0gZGVjb2RlX3N5bShnYiwgbHJ1WzFdKSBeIDB4ODA7CisgICAgICAgICAgICBWW3hdID0gZGVjb2RlX3N5bShnYiwgbHJ1WzJdKSBeIDB4ODA7CisgICAgICAgIH0KKworICAgICAgICBZICs9IHlzdHJpZGU7CisgICAgICAgIFUgKz0gdXN0cmlkZTsKKyAgICAgICAgViArPSB2c3RyaWRlOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR4dG9yeV9kZWNvZGVfdjJfNDQ0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBHZXRCaXRDb250ZXh0ICBnYjI7CisgICAgaW50IG5zbGljZXMsIHNsaWNlLCBzbGljZV9oZWlnaHQ7CisgICAgdWludDMyX3Qgb2ZmLCBzbGljZV9zaXplOworICAgIHVpbnQ4X3QgKlksICpVLCAqVjsKKyAgICBpbnQgcmV0OworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIHNyYywgc3JjX3NpemUpOworICAgIG5zbGljZXMgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpOworICAgIG9mZiA9IEZGQUxJR04obnNsaWNlcyAqIDQgKyAyLCAxNik7CisgICAgaWYgKHNyY19zaXplIDwgb2ZmKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibm8gc2xpY2UgZGF0YVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICghbnNsaWNlcyB8fCBhdmN0eC0+aGVpZ2h0ICUgbnNsaWNlcykgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICIlZCBzbGljZXMgZm9yICVkeCVkIiwgbnNsaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBzbGljZV9oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0IC8gbnNsaWNlczsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgWSA9IHBpYy0+ZGF0YVswXTsKKyAgICBVID0gcGljLT5kYXRhWzFdOworICAgIFYgPSBwaWMtPmRhdGFbMl07CisKKyAgICBmb3IgKHNsaWNlID0gMDsgc2xpY2UgPCBuc2xpY2VzOyBzbGljZSsrKSB7CisgICAgICAgIHNsaWNlX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2IpOworICAgICAgICBpZiAoc2xpY2Vfc2l6ZSA+IHNyY19zaXplIC0gb2ZmKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBzbGljZSBzaXplICUiUFJJdTMyIiAob25seSAlIlBSSXUzMiIgYnl0ZXMgbGVmdClcbiIsCisgICAgICAgICAgICAgICAgICAgc2xpY2Vfc2l6ZSwgc3JjX3NpemUgLSBvZmYpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNsaWNlX3NpemUgPD0gMTYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBzbGljZSBzaXplICUiUFJJdTMyIlxuIiwgc2xpY2Vfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChBVl9STDMyKHNyYyArIG9mZikgIT0gc2xpY2Vfc2l6ZSAtIDE2KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiU2xpY2Ugc2l6ZXMgbWlzbWF0Y2g6IGdvdCAlIlBSSXUzMiIgaW5zdGVhZCBvZiAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgQVZfUkwzMihzcmMgKyBvZmYpLCBzbGljZV9zaXplIC0gMTYpOworICAgICAgICB9CisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiMiwgc3JjICsgb2ZmICsgMTYsIChzbGljZV9zaXplIC0gMTYpICogOCk7CisgICAgICAgIGR4Ml9kZWNvZGVfc2xpY2VfNDQ0KCZnYjIsIGF2Y3R4LT53aWR0aCwgc2xpY2VfaGVpZ2h0LCBZLCBVLCBWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMtPmxpbmVzaXplWzBdLCBwaWMtPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMtPmxpbmVzaXplWzJdKTsKKworICAgICAgICBZICs9IHBpYy0+bGluZXNpemVbMF0gKiBzbGljZV9oZWlnaHQ7CisgICAgICAgIFUgKz0gcGljLT5saW5lc2l6ZVsxXSAqIHNsaWNlX2hlaWdodDsKKyAgICAgICAgViArPSBwaWMtPmxpbmVzaXplWzJdICogc2xpY2VfaGVpZ2h0OworICAgICAgICBvZmYgKz0gc2xpY2Vfc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpwaWMgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IGF2cGt0LT5kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPCAxNikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBhY2tldCB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKEFWX1JCMzIoc3JjKSkgeworICAgIGNhc2UgMHgwMTAwMDAwMToKKyAgICAgICAgcmV0ID0gZHh0b3J5X2RlY29kZV92MV9yZ2IoYXZjdHgsIHBpYywgc3JjICsgMTYsIGF2cGt0LT5zaXplIC0gMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfQkdSMjQsIDMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDEwMDAwMDk6CisgICAgICAgIHJldCA9IGR4dG9yeV9kZWNvZGVfdjJfcmdiKGF2Y3R4LCBwaWMsIHNyYyArIDE2LCBhdnBrdC0+c2l6ZSAtIDE2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAyMDAwMDAxOgorICAgICAgICByZXQgPSBkeHRvcnlfZGVjb2RlX3YxXzQyMChhdmN0eCwgcGljLCBzcmMgKyAxNiwgYXZwa3QtPnNpemUgLSAxNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMjAwMDAwOToKKyAgICAgICAgcmV0ID0gZHh0b3J5X2RlY29kZV92Ml80MjAoYXZjdHgsIHBpYywgc3JjICsgMTYsIGF2cGt0LT5zaXplIC0gMTYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDMwMDAwMDE6CisgICAgICAgIHJldCA9IGR4dG9yeV9kZWNvZGVfdjFfNDEwKGF2Y3R4LCBwaWMsIHNyYyArIDE2LCBhdnBrdC0+c2l6ZSAtIDE2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAzMDAwMDA5OgorICAgICAgICByZXQgPSBkeHRvcnlfZGVjb2RlX3YyXzQxMChhdmN0eCwgcGljLCBzcmMgKyAxNiwgYXZwa3QtPnNpemUgLSAxNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwNDAwMDAwMToKKyAgICAgICAgcmV0ID0gZHh0b3J5X2RlY29kZV92MV80NDQoYXZjdHgsIHBpYywgc3JjICsgMTYsIGF2cGt0LT5zaXplIC0gMTYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDQwMDAwMDk6CisgICAgICAgIHJldCA9IGR4dG9yeV9kZWNvZGVfdjJfNDQ0KGF2Y3R4LCBwaWMsIHNyYyArIDE2LCBhdnBrdC0+c2l6ZSAtIDE2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDE3MDAwMDAxOgorICAgICAgICByZXQgPSBkeHRvcnlfZGVjb2RlX3YxX3JnYihhdmN0eCwgcGljLCBzcmMgKyAxNiwgYXZwa3QtPnNpemUgLSAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9SR0I1NjVMRSwgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxNzAwMDAwOToKKyAgICAgICAgcmV0ID0gZHh0b3J5X2RlY29kZV92Ml81NjUoYXZjdHgsIHBpYywgc3JjICsgMTYsIGF2cGt0LT5zaXplIC0gMTYsIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTgwMDAwMDE6CisgICAgY2FzZSAweDE5MDAwMDAxOgorICAgICAgICByZXQgPSBkeHRvcnlfZGVjb2RlX3YxX3JnYihhdmN0eCwgcGljLCBzcmMgKyAxNiwgYXZwa3QtPnNpemUgLSAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9SR0I1NTVMRSwgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxODAwMDAwOToKKyAgICBjYXNlIDB4MTkwMDAwMDk6CisgICAgICAgIHJldCA9IGR4dG9yeV9kZWNvZGVfdjJfNTY1KGF2Y3R4LCBwaWMsIHNyYyArIDE2LCBhdnBrdC0+c2l6ZSAtIDE2LCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiRnJhbWUgaGVhZGVyICUiUFJJWDMyLCBBVl9SQjMyKHNyYykpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBpYy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcGljLT5rZXlfZnJhbWUgPSAxOworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX2R4dG9yeV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJkeHRvcnkiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEeHRvcnkiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRFhUT1JZLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2R4dmEyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9keHZhMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzc2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9keHZhMi5jCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogRFhWQTIgSFcgYWNjZWxlcmF0aW9uLgorICoKKyAqIGNvcHlyaWdodCAoYykgMjAxMCBMYXVyZW50IEFpbWFyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgImR4dmEyX2ludGVybmFsLmgiCisKK3ZvaWQgKmZmX2R4dmEyX2dldF9zdXJmYWNlKGNvbnN0IEFWRnJhbWUgKmZyYW1lKQoreworICAgIHJldHVybiBmcmFtZS0+ZGF0YVszXTsKK30KKwordW5zaWduZWQgZmZfZHh2YTJfZ2V0X3N1cmZhY2VfaW5kZXgoY29uc3Qgc3RydWN0IGR4dmFfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgdm9pZCAqc3VyZmFjZSA9IGZmX2R4dmEyX2dldF9zdXJmYWNlKGZyYW1lKTsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+c3VyZmFjZV9jb3VudDsgaSsrKQorICAgICAgICBpZiAoY3R4LT5zdXJmYWNlW2ldID09IHN1cmZhY2UpCisgICAgICAgICAgICByZXR1cm4gaTsKKworICAgIGFzc2VydCgwKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2R4dmEyX2NvbW1pdF9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGR4dmFfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhWQTJfRGVjb2RlQnVmZmVyRGVzYyAqZHNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1iX2NvdW50KQoreworICAgIHZvaWQgICAgICpkeHZhX2RhdGE7CisgICAgdW5zaWduZWQgZHh2YV9zaXplOworICAgIGludCAgICAgIHJlc3VsdDsKKyAgICBIUkVTVUxUIGhyOworCisgICAgaHIgPSBJRGlyZWN0WFZpZGVvRGVjb2Rlcl9HZXRCdWZmZXIoY3R4LT5kZWNvZGVyLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkeHZhX2RhdGEsICZkeHZhX3NpemUpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBhIGJ1ZmZlciBmb3IgJXU6IDB4JWx4XG4iLAorICAgICAgICAgICAgICAgdHlwZSwgaHIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzaXplIDw9IGR4dmFfc2l6ZSkgeworICAgICAgICBtZW1jcHkoZHh2YV9kYXRhLCBkYXRhLCBzaXplKTsKKworICAgICAgICBtZW1zZXQoZHNjLCAwLCBzaXplb2YoKmRzYykpOworICAgICAgICBkc2MtPkNvbXByZXNzZWRCdWZmZXJUeXBlID0gdHlwZTsKKyAgICAgICAgZHNjLT5EYXRhU2l6ZSAgICAgICAgICAgICA9IHNpemU7CisgICAgICAgIGRzYy0+TnVtTUJzSW5CdWZmZXIgICAgICAgPSBtYl9jb3VudDsKKworICAgICAgICByZXN1bHQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQnVmZmVyIGZvciB0eXBlICV1IHdhcyB0b28gc21hbGxcbiIsIHR5cGUpOworICAgICAgICByZXN1bHQgPSAtMTsKKyAgICB9CisKKyAgICBociA9IElEaXJlY3RYVmlkZW9EZWNvZGVyX1JlbGVhc2VCdWZmZXIoY3R4LT5kZWNvZGVyLCB0eXBlKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVsZWFzZSBidWZmZXIgdHlwZSAldTogMHglbHhcbiIsCisgICAgICAgICAgICAgICB0eXBlLCBocik7CisgICAgICAgIHJlc3VsdCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgZmZfZHh2YTJfY29tbW9uX2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcHAsIHVuc2lnbmVkIHBwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpxbSwgdW5zaWduZWQgcW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNvbW1pdF9ic19zaSkoQVZDb2RlY0NvbnRleHQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhWQTJfRGVjb2RlQnVmZmVyRGVzYyAqYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYVkEyX0RlY29kZUJ1ZmZlckRlc2MgKnNsaWNlKSkKK3sKKyAgICBzdHJ1Y3QgZHh2YV9jb250ZXh0ICpjdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgYnVmZmVyX2NvdW50ID0gMDsKKyAgICBEWFZBMl9EZWNvZGVCdWZmZXJEZXNjIGJ1ZmZlcls0XTsKKyAgICBEWFZBMl9EZWNvZGVFeGVjdXRlUGFyYW1zIGV4ZWMgPSB7IDAgfTsKKyAgICBpbnQgcmVzdWx0LCBydW5zID0gMDsKKyAgICBIUkVTVUxUIGhyOworCisgICAgZG8geworICAgICAgICBociA9IElEaXJlY3RYVmlkZW9EZWNvZGVyX0JlZ2luRnJhbWUoY3R4LT5kZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfZHh2YTJfZ2V0X3N1cmZhY2UoZnJhbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGlmIChociA9PSBFX1BFTkRJTkcpCisgICAgICAgICAgICBhdl91c2xlZXAoMjAwMCk7CisgICAgfSB3aGlsZSAoaHIgPT0gRV9QRU5ESU5HICYmICsrcnVucyA8IDUwKTsKKworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGJlZ2luIGZyYW1lOiAweCVseFxuIiwgaHIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmVzdWx0ID0gZmZfZHh2YTJfY29tbWl0X2J1ZmZlcihhdmN0eCwgY3R4LCAmYnVmZmVyW2J1ZmZlcl9jb3VudF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBMl9QaWN0dXJlUGFyYW1ldGVyc0J1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcCwgcHBfc2l6ZSwgMCk7CisgICAgaWYgKHJlc3VsdCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWRkIHBpY3R1cmUgcGFyYW1ldGVyIGJ1ZmZlclxuIik7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBidWZmZXJfY291bnQrKzsKKworICAgIGlmIChxbV9zaXplID4gMCkgeworICAgICAgICByZXN1bHQgPSBmZl9keHZhMl9jb21taXRfYnVmZmVyKGF2Y3R4LCBjdHgsICZidWZmZXJbYnVmZmVyX2NvdW50XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBMl9JbnZlcnNlUXVhbnRpemF0aW9uTWF0cml4QnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbSwgcW1fc2l6ZSwgMCk7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWRkIGludmVyc2UgcXVhbnRpemF0aW9uIG1hdHJpeCBidWZmZXJcbiIpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyX2NvdW50Kys7CisgICAgfQorCisgICAgcmVzdWx0ID0gY29tbWl0X2JzX3NpKGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyW2J1ZmZlcl9jb3VudCArIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyW2J1ZmZlcl9jb3VudCArIDFdKTsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhZGQgYml0c3RyZWFtIG9yIHNsaWNlIGNvbnRyb2wgYnVmZmVyXG4iKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGJ1ZmZlcl9jb3VudCArPSAyOworCisgICAgLyogVE9ETyBGaWxtIEdyYWluIHdoZW4gcG9zc2libGUgKi8KKworICAgIGFzc2VydChidWZmZXJfY291bnQgPT0gMSArIChxbV9zaXplID4gMCkgKyAyKTsKKworICAgIGV4ZWMuTnVtQ29tcEJ1ZmZlcnMgICAgICA9IGJ1ZmZlcl9jb3VudDsKKyAgICBleGVjLnBDb21wcmVzc2VkQnVmZmVycyAgPSBidWZmZXI7CisgICAgZXhlYy5wRXh0ZW5zaW9uRGF0YSAgICAgID0gTlVMTDsKKyAgICBociA9IElEaXJlY3RYVmlkZW9EZWNvZGVyX0V4ZWN1dGUoY3R4LT5kZWNvZGVyLCAmZXhlYyk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZXhlY3V0ZTogMHglbHhcbiIsIGhyKTsKKyAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgfQorCitlbmQ6CisgICAgaHIgPSBJRGlyZWN0WFZpZGVvRGVjb2Rlcl9FbmRGcmFtZShjdHgtPmRlY29kZXIsIE5VTEwpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGVuZCBmcmFtZTogMHglbHhcbiIsIGhyKTsKKyAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2R4dmEyLmggYi9mZm1wZWcvbGliYXZjb2RlYy9keHZhMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjQ2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9keHZhMi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBEWFZBMiBIVyBhY2NlbGVyYXRpb24KKyAqCisgKiBjb3B5cmlnaHQgKGMpIDIwMDkgTGF1cmVudCBBaW1hcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRFhWQV9ICisjZGVmaW5lIEFWQ09ERUNfRFhWQV9ICisKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdmNfY29kZWNfaHdhY2NlbF9keHZhMgorICogUHVibGljIGxpYmF2Y29kZWMgRFhWQTIgaGVhZGVyLgorICovCisKKyNpZiAhZGVmaW5lZChfV0lOMzJfV0lOTlQpIHx8IF9XSU4zMl9XSU5OVCA8IDB4MDYwMAorI3VuZGVmIF9XSU4zMl9XSU5OVAorI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNjAwCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGQzZDkuaD4KKyNpbmNsdWRlIDxkeHZhMmFwaS5oPgorCisvKioKKyAqIEBkZWZncm91cCBsYXZjX2NvZGVjX2h3YWNjZWxfZHh2YTIgRFhWQTIKKyAqIEBpbmdyb3VwIGxhdmNfY29kZWNfaHdhY2NlbAorICoKKyAqIEB7CisgKi8KKworI2RlZmluZSBGRl9EWFZBMl9XT1JLQVJPVU5EX1NDQUxJTkdfTElTVF9aSUdaQUcgMSAvLy88IFdvcmsgYXJvdW5kIGZvciBEWFZBMiBhbmQgb2xkIFVWRC9VVkQrIEFUSSB2aWRlbyBjYXJkcworI2RlZmluZSBGRl9EWFZBMl9XT1JLQVJPVU5EX0lOVEVMX0NMRUFSVklERU8gICAgMiAvLy88IFdvcmsgYXJvdW5kIGZvciBEWFZBMiBhbmQgb2xkIEludGVsIEdQVXMgd2l0aCBDbGVhclZpZGVvIGludGVyZmFjZQorCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBjb25maWd1cmF0aW9ucyBhbmQgZGF0YQorICogdG8gdGhlIERYVkEyIEZGbXBlZyBIV0FjY2VsIGltcGxlbWVudGF0aW9uLgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG1ha2UgaXQgYXZhaWxhYmxlIGFzIEFWQ29kZWNDb250ZXh0Lmh3YWNjZWxfY29udGV4dC4KKyAqLworc3RydWN0IGR4dmFfY29udGV4dCB7CisgICAgLyoqCisgICAgICogRFhWQTIgZGVjb2RlciBvYmplY3QKKyAgICAgKi8KKyAgICBJRGlyZWN0WFZpZGVvRGVjb2RlciAqZGVjb2RlcjsKKworICAgIC8qKgorICAgICAqIERYVkEyIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBjcmVhdGUgdGhlIGRlY29kZXIKKyAgICAgKi8KKyAgICBjb25zdCBEWFZBMl9Db25maWdQaWN0dXJlRGVjb2RlICpjZmc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHN1cmZhY2UgaW4gdGhlIHN1cmZhY2UgYXJyYXkKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBzdXJmYWNlX2NvdW50OworCisgICAgLyoqCisgICAgICogVGhlIGFycmF5IG9mIERpcmVjdDNEIHN1cmZhY2VzIHVzZWQgdG8gY3JlYXRlIHRoZSBkZWNvZGVyCisgICAgICovCisgICAgTFBESVJFQ1QzRFNVUkZBQ0U5ICpzdXJmYWNlOworCisgICAgLyoqCisgICAgICogQSBiaXQgZmllbGQgY29uZmlndXJpbmcgdGhlIHdvcmthcm91bmRzIG5lZWRlZCBmb3IgdXNpbmcgdGhlIGRlY29kZXIKKyAgICAgKi8KKyAgICB1aW50NjRfdCB3b3JrYXJvdW5kOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSB0byB0aGUgRkZtcGVnIEFWSFdBY2NlbCBpbXBsZW1lbnRhdGlvbgorICAgICAqLworICAgIHVuc2lnbmVkIHJlcG9ydF9pZDsKK307CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZDT0RFQ19EWFZBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2R4dmEyX2gyNjQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2R4dmEyX2gyNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVjY2MzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHh2YTJfaDI2NC5jCkBAIC0wLDAgKzEsNDcyIEBACisvKgorICogRFhWQTIgSDI2NCBIVyBhY2NlbGVyYXRpb24uCisgKgorICogY29weXJpZ2h0IChjKSAyMDA5IExhdXJlbnQgQWltYXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImR4dmEyX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRkYXRhLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisKK3N0cnVjdCBkeHZhMl9waWN0dXJlX2NvbnRleHQgeworICAgIERYVkFfUGljUGFyYW1zX0gyNjQgICBwcDsKKyAgICBEWFZBX1FtYXRyaXhfSDI2NCAgICAgcW07CisgICAgdW5zaWduZWQgICAgICAgICAgICAgIHNsaWNlX2NvdW50OworICAgIERYVkFfU2xpY2VfSDI2NF9TaG9ydCBzbGljZV9zaG9ydFtNQVhfU0xJQ0VTXTsKKyAgICBEWFZBX1NsaWNlX0gyNjRfTG9uZyAgc2xpY2VfbG9uZ1tNQVhfU0xJQ0VTXTsKKyAgICBjb25zdCB1aW50OF90ICAgICAgICAgKmJpdHN0cmVhbTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgYml0c3RyZWFtX3NpemU7Cit9OworCitzdGF0aWMgdm9pZCBmaWxsX3BpY3R1cmVfZW50cnkoRFhWQV9QaWNFbnRyeV9IMjY0ICpwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgsIHVuc2lnbmVkIGZsYWcpCit7CisgICAgYXNzZXJ0KChpbmRleCYweDdmKSA9PSBpbmRleCAmJiAoZmxhZyYweDAxKSA9PSBmbGFnKTsKKyAgICBwaWMtPmJQaWNFbnRyeSA9IGluZGV4IHwgKGZsYWcgPDwgNyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfcGljdHVyZV9wYXJhbWV0ZXJzKHN0cnVjdCBkeHZhX2NvbnRleHQgKmN0eCwgY29uc3QgSDI2NENvbnRleHQgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBX1BpY1BhcmFtc19IMjY0ICpwcCkKK3sKKyAgICBjb25zdCBIMjY0UGljdHVyZSAqY3VycmVudF9waWN0dXJlID0gaC0+Y3VyX3BpY19wdHI7CisgICAgaW50IGksIGo7CisKKyAgICBtZW1zZXQocHAsIDAsIHNpemVvZigqcHApKTsKKyAgICAvKiBDb25maWd1cmUgY3VycmVudCBwaWN0dXJlICovCisgICAgZmlsbF9waWN0dXJlX2VudHJ5KCZwcC0+Q3VyclBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgZmZfZHh2YTJfZ2V0X3N1cmZhY2VfaW5kZXgoY3R4LCAmY3VycmVudF9waWN0dXJlLT5mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpOworICAgIC8qIENvbmZpZ3VyZSB0aGUgc2V0IG9mIHJlZmVyZW5jZXMgKi8KKyAgICBwcC0+VXNlZEZvclJlZmVyZW5jZUZsYWdzICA9IDA7CisgICAgcHAtPk5vbkV4aXN0aW5nRnJhbWVGbGFncyAgPSAwOworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocHAtPlJlZkZyYW1lTGlzdCk7IGkrKykgeworICAgICAgICBjb25zdCBIMjY0UGljdHVyZSAqcjsKKyAgICAgICAgaWYgKGogPCBoLT5zaG9ydF9yZWZfY291bnQpIHsKKyAgICAgICAgICAgIHIgPSBoLT5zaG9ydF9yZWZbaisrXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHIgPSBOVUxMOworICAgICAgICAgICAgd2hpbGUgKCFyICYmIGogPCBoLT5zaG9ydF9yZWZfY291bnQgKyAxNikKKyAgICAgICAgICAgICAgICByID0gaC0+bG9uZ19yZWZbaisrIC0gaC0+c2hvcnRfcmVmX2NvdW50XTsKKyAgICAgICAgfQorICAgICAgICBpZiAocikgeworICAgICAgICAgICAgZmlsbF9waWN0dXJlX2VudHJ5KCZwcC0+UmVmRnJhbWVMaXN0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2R4dmEyX2dldF9zdXJmYWNlX2luZGV4KGN0eCwgJnItPmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmxvbmdfcmVmICE9IDApOworCisgICAgICAgICAgICBpZiAoKHItPnJlZmVyZW5jZSAmIFBJQ1RfVE9QX0ZJRUxEKSAmJiByLT5maWVsZF9wb2NbMF0gIT0gSU5UX01BWCkKKyAgICAgICAgICAgICAgICBwcC0+RmllbGRPcmRlckNudExpc3RbaV1bMF0gPSByLT5maWVsZF9wb2NbMF07CisgICAgICAgICAgICBpZiAoKHItPnJlZmVyZW5jZSAmIFBJQ1RfQk9UVE9NX0ZJRUxEKSAmJiByLT5maWVsZF9wb2NbMV0gIT0gSU5UX01BWCkKKyAgICAgICAgICAgICAgICBwcC0+RmllbGRPcmRlckNudExpc3RbaV1bMV0gPSByLT5maWVsZF9wb2NbMV07CisKKyAgICAgICAgICAgIHBwLT5GcmFtZU51bUxpc3RbaV0gPSByLT5sb25nX3JlZiA/IHItPnBpY19pZCA6IHItPmZyYW1lX251bTsKKyAgICAgICAgICAgIGlmIChyLT5yZWZlcmVuY2UgJiBQSUNUX1RPUF9GSUVMRCkKKyAgICAgICAgICAgICAgICBwcC0+VXNlZEZvclJlZmVyZW5jZUZsYWdzIHw9IDEgPDwgKDIqaSArIDApOworICAgICAgICAgICAgaWYgKHItPnJlZmVyZW5jZSAmIFBJQ1RfQk9UVE9NX0ZJRUxEKQorICAgICAgICAgICAgICAgIHBwLT5Vc2VkRm9yUmVmZXJlbmNlRmxhZ3MgfD0gMSA8PCAoMippICsgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcC0+UmVmRnJhbWVMaXN0W2ldLmJQaWNFbnRyeSA9IDB4ZmY7CisgICAgICAgICAgICBwcC0+RmllbGRPcmRlckNudExpc3RbaV1bMF0gICA9IDA7CisgICAgICAgICAgICBwcC0+RmllbGRPcmRlckNudExpc3RbaV1bMV0gICA9IDA7CisgICAgICAgICAgICBwcC0+RnJhbWVOdW1MaXN0W2ldICAgICAgICAgICA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcC0+d0ZyYW1lV2lkdGhJbk1ic01pbnVzMSAgICAgICAgPSBoLT5tYl93aWR0aCAgLSAxOworICAgIHBwLT53RnJhbWVIZWlnaHRJbk1ic01pbnVzMSAgICAgICA9IGgtPm1iX2hlaWdodCAtIDE7CisgICAgcHAtPm51bV9yZWZfZnJhbWVzICAgICAgICAgICAgICAgID0gaC0+c3BzLnJlZl9mcmFtZV9jb3VudDsKKworICAgIHBwLT53Qml0RmllbGRzICAgICAgICAgICAgICAgICAgICA9ICgoaC0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRSkgPDwgIDApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGgtPnNwcy5tYl9hZmYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkpIDw8ICAxKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnNwcy5yZXNpZHVhbF9jb2xvcl90cmFuc2Zvcm1fZmxhZyA8PCAgMikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwX2Zvcl9zd2l0Y2hfZmxhZyAobm90IGltcGxlbWVudGVkIGJ5IEZGbXBlZykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICAzKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyAgICAgICAgICAgICA8PCAgNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaC0+bmFsX3JlZl9pZGMgIT0gMCkgICAgICAgICAgICAgICAgPDwgIDYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaC0+cHBzLmNvbnN0cmFpbmVkX2ludHJhX3ByZWQgICAgICAgIDw8ICA3KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnBwcy53ZWlnaHRlZF9wcmVkICAgICAgICAgICAgICAgICA8PCAgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5wcHMud2VpZ2h0ZWRfYmlwcmVkX2lkYyAgICAgICAgICAgPDwgIDkpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYnNDb25zZWN1dGl2ZUZsYWcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnNwcy5mcmFtZV9tYnNfb25seV9mbGFnICAgICAgICAgICA8PCAxMikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5wcHMudHJhbnNmb3JtXzh4OF9tb2RlICAgICAgICAgICAgPDwgMTMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGgtPnNwcy5sZXZlbF9pZGMgPj0gMzEpICAgICAgICAgICAgIDw8IDE0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW50cmFQaWNGbGFnIChNb2RpZmllZCBpZiB3ZSBkZXRlY3QgYSBub24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnRyYSBzbGljZSBpbiBkeHZhMl9oMjY0X2RlY29kZV9zbGljZSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE1KTsKKworICAgIHBwLT5iaXRfZGVwdGhfbHVtYV9taW51czggICAgICAgICA9IGgtPnNwcy5iaXRfZGVwdGhfbHVtYSAtIDg7CisgICAgcHAtPmJpdF9kZXB0aF9jaHJvbWFfbWludXM4ICAgICAgID0gaC0+c3BzLmJpdF9kZXB0aF9jaHJvbWEgLSA4OworICAgIGlmIChjdHgtPndvcmthcm91bmQgJiBGRl9EWFZBMl9XT1JLQVJPVU5EX1NDQUxJTkdfTElTVF9aSUdaQUcpCisgICAgICAgIHBwLT5SZXNlcnZlZDE2Qml0cyAgICAgICAgICAgID0gMDsKKyAgICBlbHNlIGlmIChjdHgtPndvcmthcm91bmQgJiBGRl9EWFZBMl9XT1JLQVJPVU5EX0lOVEVMX0NMRUFSVklERU8pCisgICAgICAgIHBwLT5SZXNlcnZlZDE2Qml0cyAgICAgICAgICAgID0gMHgzNGM7CisgICAgZWxzZQorICAgICAgICBwcC0+UmVzZXJ2ZWQxNkJpdHMgICAgICAgICAgICA9IDM7IC8qIEZJWE1FIGlzIHRoZXJlIGEgd2F5IHRvIGRldGVjdCB0aGUgcmlnaHQgbW9kZSA/ICovCisgICAgcHAtPlN0YXR1c1JlcG9ydEZlZWRiYWNrTnVtYmVyICAgID0gMSArIGN0eC0+cmVwb3J0X2lkKys7CisgICAgcHAtPkN1cnJGaWVsZE9yZGVyQ250WzBdID0gMDsKKyAgICBpZiAoKGgtPnBpY3R1cmVfc3RydWN0dXJlICYgUElDVF9UT1BfRklFTEQpICYmCisgICAgICAgIGN1cnJlbnRfcGljdHVyZS0+ZmllbGRfcG9jWzBdICE9IElOVF9NQVgpCisgICAgICAgIHBwLT5DdXJyRmllbGRPcmRlckNudFswXSA9IGN1cnJlbnRfcGljdHVyZS0+ZmllbGRfcG9jWzBdOworICAgIHBwLT5DdXJyRmllbGRPcmRlckNudFsxXSA9IDA7CisgICAgaWYgKChoLT5waWN0dXJlX3N0cnVjdHVyZSAmIFBJQ1RfQk9UVE9NX0ZJRUxEKSAmJgorICAgICAgICBjdXJyZW50X3BpY3R1cmUtPmZpZWxkX3BvY1sxXSAhPSBJTlRfTUFYKQorICAgICAgICBwcC0+Q3VyckZpZWxkT3JkZXJDbnRbMV0gPSBjdXJyZW50X3BpY3R1cmUtPmZpZWxkX3BvY1sxXTsKKyAgICBwcC0+cGljX2luaXRfcXNfbWludXMyNiAgICAgICAgICAgPSBoLT5wcHMuaW5pdF9xcyAtIDI2OworICAgIHBwLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ICAgICAgICA9IGgtPnBwcy5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzBdOworICAgIHBwLT5zZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldCA9IGgtPnBwcy5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzFdOworICAgIHBwLT5Db250aW51YXRpb25GbGFnICAgICAgICAgICAgICA9IDE7CisgICAgcHAtPnBpY19pbml0X3FwX21pbnVzMjYgICAgICAgICAgID0gaC0+cHBzLmluaXRfcXAgLSAyNjsKKyAgICBwcC0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSAgPSBoLT5wcHMucmVmX2NvdW50WzBdIC0gMTsKKyAgICBwcC0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSAgPSBoLT5wcHMucmVmX2NvdW50WzFdIC0gMTsKKyAgICBwcC0+UmVzZXJ2ZWQ4Qml0c0EgICAgICAgICAgICAgICAgPSAwOworICAgIHBwLT5mcmFtZV9udW0gICAgICAgICAgICAgICAgICAgICA9IGgtPmZyYW1lX251bTsKKyAgICBwcC0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCAgICAgPSBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtIC0gNDsKKyAgICBwcC0+cGljX29yZGVyX2NudF90eXBlICAgICAgICAgICAgPSBoLT5zcHMucG9jX3R5cGU7CisgICAgaWYgKGgtPnNwcy5wb2NfdHlwZSA9PSAwKQorICAgICAgICBwcC0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0gaC0+c3BzLmxvZzJfbWF4X3BvY19sc2IgLSA0OworICAgIGVsc2UgaWYgKGgtPnNwcy5wb2NfdHlwZSA9PSAxKQorICAgICAgICBwcC0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgPSBoLT5zcHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7CisgICAgcHAtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgICAgID0gaC0+c3BzLmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWc7CisgICAgcHAtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyAgICAgID0gaC0+cHBzLmNhYmFjOworICAgIHBwLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnICAgICAgICA9IGgtPnBwcy5waWNfb3JkZXJfcHJlc2VudDsKKyAgICBwcC0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgICAgICAgPSBoLT5wcHMuc2xpY2VfZ3JvdXBfY291bnQgLSAxOworICAgIHBwLT5zbGljZV9ncm91cF9tYXBfdHlwZSAgICAgICAgICA9IGgtPnBwcy5tYl9zbGljZV9ncm91cF9tYXBfdHlwZTsKKyAgICBwcC0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgPSBoLT5wcHMuZGVibG9ja2luZ19maWx0ZXJfcGFyYW1ldGVyc19wcmVzZW50OworICAgIHBwLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWc9IGgtPnBwcy5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50OworICAgIHBwLT5SZXNlcnZlZDhCaXRzQiAgICAgICAgICAgICAgICA9IDA7CisgICAgcHAtPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMT0gMDsgIC8qIFhYWCBub3QgaW1wbGVtZW50ZWQgYnkgRkZtcGVnICovCisgICAgLy9wcC0+U2xpY2VHcm91cE1hcFs4MTBdOyAgICAgICAgICAgICAgIC8qIFhYWCBub3QgaW1wbGVtZW50ZWQgYnkgRkZtcGVnICovCit9CisKK3N0YXRpYyB2b2lkIGZpbGxfc2NhbGluZ19saXN0cyhzdHJ1Y3QgZHh2YV9jb250ZXh0ICpjdHgsIGNvbnN0IEgyNjRDb250ZXh0ICpoLCBEWFZBX1FtYXRyaXhfSDI2NCAqcW0pCit7CisgICAgdW5zaWduZWQgaSwgajsKKyAgICBtZW1zZXQocW0sIDAsIHNpemVvZigqcW0pKTsKKyAgICBpZiAoY3R4LT53b3JrYXJvdW5kICYgRkZfRFhWQTJfV09SS0FST1VORF9TQ0FMSU5HX0xJU1RfWklHWkFHKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgICAgICBxbS0+YlNjYWxpbmdMaXN0czR4NFtpXVtqXSA9IGgtPnBwcy5zY2FsaW5nX21hdHJpeDRbaV1bal07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIHFtLT5iU2NhbGluZ0xpc3RzOHg4WzBdW2ldID0gaC0+cHBzLnNjYWxpbmdfbWF0cml4OFswXVtpXTsKKyAgICAgICAgICAgIHFtLT5iU2NhbGluZ0xpc3RzOHg4WzFdW2ldID0gaC0+cHBzLnNjYWxpbmdfbWF0cml4OFszXVtpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgICAgICBxbS0+YlNjYWxpbmdMaXN0czR4NFtpXVtqXSA9IGgtPnBwcy5zY2FsaW5nX21hdHJpeDRbaV1bemlnemFnX3NjYW5bal1dOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICBxbS0+YlNjYWxpbmdMaXN0czh4OFswXVtpXSA9IGgtPnBwcy5zY2FsaW5nX21hdHJpeDhbMF1bZmZfemlnemFnX2RpcmVjdFtpXV07CisgICAgICAgICAgICBxbS0+YlNjYWxpbmdMaXN0czh4OFsxXVtpXSA9IGgtPnBwcy5zY2FsaW5nX21hdHJpeDhbM11bZmZfemlnemFnX2RpcmVjdFtpXV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaXNfc2xpY2Vfc2hvcnQoc3RydWN0IGR4dmFfY29udGV4dCAqY3R4KQoreworICAgIGFzc2VydChjdHgtPmNmZy0+Q29uZmlnQml0c3RyZWFtUmF3ID09IDEgfHwKKyAgICAgICAgICAgY3R4LT5jZmctPkNvbmZpZ0JpdHN0cmVhbVJhdyA9PSAyKTsKKyAgICByZXR1cm4gY3R4LT5jZmctPkNvbmZpZ0JpdHN0cmVhbVJhdyA9PSAyOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3NsaWNlX3Nob3J0KERYVkFfU2xpY2VfSDI2NF9TaG9ydCAqc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uLCB1bnNpZ25lZCBzaXplKQoreworICAgIG1lbXNldChzbGljZSwgMCwgc2l6ZW9mKCpzbGljZSkpOworICAgIHNsaWNlLT5CU05BTHVuaXREYXRhTG9jYXRpb24gPSBwb3NpdGlvbjsKKyAgICBzbGljZS0+U2xpY2VCeXRlc0luQnVmZmVyICAgID0gc2l6ZTsKKyAgICBzbGljZS0+d0JhZFNsaWNlQ2hvcHBpbmcgICAgID0gMDsKK30KKworc3RhdGljIGludCBnZXRfcmVmcGljX2luZGV4KGNvbnN0IERYVkFfUGljUGFyYW1zX0gyNjQgKnBwLCBpbnQgc3VyZmFjZV9pbmRleCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocHAtPlJlZkZyYW1lTGlzdCk7IGkrKykgeworICAgICAgICBpZiAoKHBwLT5SZWZGcmFtZUxpc3RbaV0uYlBpY0VudHJ5ICYgMHg3ZikgPT0gc3VyZmFjZV9pbmRleCkKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIDB4N2Y7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfc2xpY2VfbG9uZyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIERYVkFfU2xpY2VfSDI2NF9Mb25nICpzbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEWFZBX1BpY1BhcmFtc19IMjY0ICpwcCwgdW5zaWduZWQgcG9zaXRpb24sIHVuc2lnbmVkIHNpemUpCit7CisgICAgY29uc3QgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkeHZhX2NvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgdW5zaWduZWQgbGlzdDsKKworICAgIG1lbXNldChzbGljZSwgMCwgc2l6ZW9mKCpzbGljZSkpOworICAgIHNsaWNlLT5CU05BTHVuaXREYXRhTG9jYXRpb24gPSBwb3NpdGlvbjsKKyAgICBzbGljZS0+U2xpY2VCeXRlc0luQnVmZmVyICAgID0gc2l6ZTsKKyAgICBzbGljZS0+d0JhZFNsaWNlQ2hvcHBpbmcgICAgID0gMDsKKworICAgIHNsaWNlLT5maXJzdF9tYl9pbl9zbGljZSAgICAgPSAoaC0+bWJfeSA+PiBGSUVMRF9PUl9NQkFGRl9QSUNUVVJFKGgpKSAqIGgtPm1iX3dpZHRoICsgaC0+bWJfeDsKKyAgICBzbGljZS0+TnVtTWJzRm9yU2xpY2UgICAgICAgID0gMDsgLyogWFhYIGl0IGlzIHNldCBvbmNlIHdlIGhhdmUgYWxsIHNsaWNlcyAqLworICAgIHNsaWNlLT5CaXRPZmZzZXRUb1NsaWNlRGF0YSAgPSBnZXRfYml0c19jb3VudCgmaC0+Z2IpOworICAgIHNsaWNlLT5zbGljZV90eXBlICAgICAgICAgICAgPSBmZl9oMjY0X2dldF9zbGljZV90eXBlKGgpOworICAgIGlmIChoLT5zbGljZV90eXBlX2ZpeGVkKQorICAgICAgICBzbGljZS0+c2xpY2VfdHlwZSArPSA1OworICAgIHNsaWNlLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tICAgICAgID0gaC0+bHVtYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICBzbGljZS0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tICAgICA9IGgtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICBpZiAoaC0+bGlzdF9jb3VudCA+IDApCisgICAgICAgIHNsaWNlLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID0gaC0+cmVmX2NvdW50WzBdIC0gMTsKKyAgICBpZiAoaC0+bGlzdF9jb3VudCA+IDEpCisgICAgICAgIHNsaWNlLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID0gaC0+cmVmX2NvdW50WzFdIC0gMTsKKyAgICBzbGljZS0+c2xpY2VfYWxwaGFfYzBfb2Zmc2V0X2RpdjIgICA9IGgtPnNsaWNlX2FscGhhX2MwX29mZnNldCAvIDI7CisgICAgc2xpY2UtPnNsaWNlX2JldGFfb2Zmc2V0X2RpdjIgICAgICAgPSBoLT5zbGljZV9iZXRhX29mZnNldCAgICAgLyAyOworICAgIHNsaWNlLT5SZXNlcnZlZDhCaXRzICAgICAgICAgICAgICAgID0gMDsKKworICAgIGZvciAobGlzdCA9IDA7IGxpc3QgPCAyOyBsaXN0KyspIHsKKyAgICAgICAgdW5zaWduZWQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHNsaWNlLT5SZWZQaWNMaXN0W2xpc3RdKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobGlzdCA8IGgtPmxpc3RfY291bnQgJiYgaSA8IGgtPnJlZl9jb3VudFtsaXN0XSkgeworICAgICAgICAgICAgICAgIGNvbnN0IEgyNjRQaWN0dXJlICpyID0gJmgtPnJlZl9saXN0W2xpc3RdW2ldOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBsYW5lOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4OworICAgICAgICAgICAgICAgIGlmIChjdHgtPndvcmthcm91bmQgJiBGRl9EWFZBMl9XT1JLQVJPVU5EX0lOVEVMX0NMRUFSVklERU8pCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZmZfZHh2YTJfZ2V0X3N1cmZhY2VfaW5kZXgoY3R4LCAmci0+Zik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGdldF9yZWZwaWNfaW5kZXgocHAsIGZmX2R4dmEyX2dldF9zdXJmYWNlX2luZGV4KGN0eCwgJnItPmYpKTsKKyAgICAgICAgICAgICAgICBmaWxsX3BpY3R1cmVfZW50cnkoJnNsaWNlLT5SZWZQaWNMaXN0W2xpc3RdW2ldLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+cmVmZXJlbmNlID09IFBJQ1RfQk9UVE9NX0ZJRUxEKTsKKyAgICAgICAgICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB3LCBvOworICAgICAgICAgICAgICAgICAgICBpZiAocGxhbmUgPT0gMCAmJiBoLT5sdW1hX3dlaWdodF9mbGFnW2xpc3RdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ID0gaC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBvID0gaC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGxhbmUgPj0gMSAmJiBoLT5jaHJvbWFfd2VpZ2h0X2ZsYWdbbGlzdF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBoLT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW3BsYW5lLTFdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGgtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bcGxhbmUtMV1bMV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ID0gMSA8PCAocGxhbmUgPT0gMCA/IGgtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20pOworICAgICAgICAgICAgICAgICAgICAgICAgbyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2xpY2UtPldlaWdodHNbbGlzdF1baV1bcGxhbmVdWzBdID0gdzsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2UtPldlaWdodHNbbGlzdF1baV1bcGxhbmVdWzFdID0gbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBsYW5lOworICAgICAgICAgICAgICAgIHNsaWNlLT5SZWZQaWNMaXN0W2xpc3RdW2ldLmJQaWNFbnRyeSA9IDB4ZmY7CisgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMzsgcGxhbmUrKykgeworICAgICAgICAgICAgICAgICAgICBzbGljZS0+V2VpZ2h0c1tsaXN0XVtpXVtwbGFuZV1bMF0gPSAwOworICAgICAgICAgICAgICAgICAgICBzbGljZS0+V2VpZ2h0c1tsaXN0XVtpXVtwbGFuZV1bMV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzbGljZS0+c2xpY2VfcXNfZGVsdGEgICAgPSAwOyAvKiBYWFggbm90IGltcGxlbWVudGVkIGJ5IEZGbXBlZyAqLworICAgIHNsaWNlLT5zbGljZV9xcF9kZWx0YSAgICA9IGgtPnFzY2FsZSAtIGgtPnBwcy5pbml0X3FwOworICAgIHNsaWNlLT5yZWR1bmRhbnRfcGljX2NudCA9IGgtPnJlZHVuZGFudF9waWNfY291bnQ7CisgICAgaWYgKGgtPnNsaWNlX3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgIHNsaWNlLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcgPSBoLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkOworICAgIHNsaWNlLT5jYWJhY19pbml0X2lkYyA9IGgtPnBwcy5jYWJhYyA/IGgtPmNhYmFjX2luaXRfaWRjIDogMDsKKyAgICBpZiAoaC0+ZGVibG9ja2luZ19maWx0ZXIgPCAyKQorICAgICAgICBzbGljZS0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgPSAxIC0gaC0+ZGVibG9ja2luZ19maWx0ZXI7CisgICAgZWxzZQorICAgICAgICBzbGljZS0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgPSBoLT5kZWJsb2NraW5nX2ZpbHRlcjsKKyAgICBzbGljZS0+c2xpY2VfaWQgPSBoLT5jdXJyZW50X3NsaWNlIC0gMTsKK30KKworc3RhdGljIGludCBjb21taXRfYml0c3RyZWFtX2FuZF9zbGljZV9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhWQTJfRGVjb2RlQnVmZmVyRGVzYyAqYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBMl9EZWNvZGVCdWZmZXJEZXNjICpzYykKK3sKKyAgICBjb25zdCBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgbWJfY291bnQgPSBoLT5tYl93aWR0aCAqIGgtPm1iX2hlaWdodDsKKyAgICBzdHJ1Y3QgZHh2YV9jb250ZXh0ICpjdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworICAgIGNvbnN0IEgyNjRQaWN0dXJlICpjdXJyZW50X3BpY3R1cmUgPSBoLT5jdXJfcGljX3B0cjsKKyAgICBzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0ICpjdHhfcGljID0gY3VycmVudF9waWN0dXJlLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKyAgICBEWFZBX1NsaWNlX0gyNjRfU2hvcnQgKnNsaWNlID0gTlVMTDsKKyAgICB2b2lkICAgICAqZHh2YV9kYXRhX3B0cjsKKyAgICB1aW50OF90ICAqZHh2YV9kYXRhLCAqY3VycmVudCwgKmVuZDsKKyAgICB1bnNpZ25lZCBkeHZhX3NpemU7CisgICAgdm9pZCAgICAgKnNsaWNlX2RhdGE7CisgICAgdW5zaWduZWQgc2xpY2Vfc2l6ZTsKKyAgICB1bnNpZ25lZCBwYWRkaW5nOworICAgIHVuc2lnbmVkIGk7CisKKyAgICAvKiBDcmVhdGUgYW4gYW5uZXggQiBiaXRzdHJlYW0gYnVmZmVyIHdpdGggb25seSBzbGljZSBOQUwgYW5kIGZpbmFsaXplIHNsaWNlICovCisgICAgaWYgKEZBSUxFRChJRGlyZWN0WFZpZGVvRGVjb2Rlcl9HZXRCdWZmZXIoY3R4LT5kZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYVkEyX0JpdFN0cmVhbURhdGVCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkeHZhX2RhdGFfcHRyLCAmZHh2YV9zaXplKSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGR4dmFfZGF0YSA9IGR4dmFfZGF0YV9wdHI7CisgICAgY3VycmVudCA9IGR4dmFfZGF0YTsKKyAgICBlbmQgPSBkeHZhX2RhdGEgKyBkeHZhX3NpemU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4X3BpYy0+c2xpY2VfY291bnQ7IGkrKykgeworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBzdGFydF9jb2RlW10gPSB7IDAsIDAsIDEgfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHN0YXJ0X2NvZGVfc2l6ZSA9IHNpemVvZihzdGFydF9jb2RlKTsKKyAgICAgICAgdW5zaWduZWQgcG9zaXRpb24sIHNpemU7CisKKyAgICAgICAgYXNzZXJ0KG9mZnNldG9mKERYVkFfU2xpY2VfSDI2NF9TaG9ydCwgQlNOQUx1bml0RGF0YUxvY2F0aW9uKSA9PQorICAgICAgICAgICAgICAgb2Zmc2V0b2YoRFhWQV9TbGljZV9IMjY0X0xvbmcsICBCU05BTHVuaXREYXRhTG9jYXRpb24pKTsKKyAgICAgICAgYXNzZXJ0KG9mZnNldG9mKERYVkFfU2xpY2VfSDI2NF9TaG9ydCwgU2xpY2VCeXRlc0luQnVmZmVyKSA9PQorICAgICAgICAgICAgICAgb2Zmc2V0b2YoRFhWQV9TbGljZV9IMjY0X0xvbmcsICBTbGljZUJ5dGVzSW5CdWZmZXIpKTsKKworICAgICAgICBpZiAoaXNfc2xpY2Vfc2hvcnQoY3R4KSkKKyAgICAgICAgICAgIHNsaWNlID0gJmN0eF9waWMtPnNsaWNlX3Nob3J0W2ldOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzbGljZSA9IChEWFZBX1NsaWNlX0gyNjRfU2hvcnQqKSZjdHhfcGljLT5zbGljZV9sb25nW2ldOworCisgICAgICAgIHBvc2l0aW9uID0gc2xpY2UtPkJTTkFMdW5pdERhdGFMb2NhdGlvbjsKKyAgICAgICAgc2l6ZSAgICAgPSBzbGljZS0+U2xpY2VCeXRlc0luQnVmZmVyOworICAgICAgICBpZiAoc3RhcnRfY29kZV9zaXplICsgc2l6ZSA+IGVuZCAtIGN1cnJlbnQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGJ1aWxkIGJpdHN0cmVhbSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzbGljZS0+QlNOQUx1bml0RGF0YUxvY2F0aW9uID0gY3VycmVudCAtIGR4dmFfZGF0YTsKKyAgICAgICAgc2xpY2UtPlNsaWNlQnl0ZXNJbkJ1ZmZlciAgICA9IHN0YXJ0X2NvZGVfc2l6ZSArIHNpemU7CisKKyAgICAgICAgaWYgKCFpc19zbGljZV9zaG9ydChjdHgpKSB7CisgICAgICAgICAgICBEWFZBX1NsaWNlX0gyNjRfTG9uZyAqc2xpY2VfbG9uZyA9IChEWFZBX1NsaWNlX0gyNjRfTG9uZyopc2xpY2U7CisgICAgICAgICAgICBpZiAoaSA8IGN0eF9waWMtPnNsaWNlX2NvdW50IC0gMSkKKyAgICAgICAgICAgICAgICBzbGljZV9sb25nLT5OdW1NYnNGb3JTbGljZSA9CisgICAgICAgICAgICAgICAgICAgIHNsaWNlX2xvbmdbMV0uZmlyc3RfbWJfaW5fc2xpY2UgLSBzbGljZV9sb25nWzBdLmZpcnN0X21iX2luX3NsaWNlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNsaWNlX2xvbmctPk51bU1ic0ZvclNsaWNlID0gbWJfY291bnQgLSBzbGljZV9sb25nLT5maXJzdF9tYl9pbl9zbGljZTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShjdXJyZW50LCBzdGFydF9jb2RlLCBzdGFydF9jb2RlX3NpemUpOworICAgICAgICBjdXJyZW50ICs9IHN0YXJ0X2NvZGVfc2l6ZTsKKworICAgICAgICBtZW1jcHkoY3VycmVudCwgJmN0eF9waWMtPmJpdHN0cmVhbVtwb3NpdGlvbl0sIHNpemUpOworICAgICAgICBjdXJyZW50ICs9IHNpemU7CisgICAgfQorICAgIHBhZGRpbmcgPSBGRk1JTigxMjggLSAoKGN1cnJlbnQgLSBkeHZhX2RhdGEpICYgMTI3KSwgZW5kIC0gY3VycmVudCk7CisgICAgaWYgKHNsaWNlICYmIHBhZGRpbmcgPiAwKSB7CisgICAgICAgIG1lbXNldChjdXJyZW50LCAwLCBwYWRkaW5nKTsKKyAgICAgICAgY3VycmVudCArPSBwYWRkaW5nOworCisgICAgICAgIHNsaWNlLT5TbGljZUJ5dGVzSW5CdWZmZXIgKz0gcGFkZGluZzsKKyAgICB9CisgICAgaWYgKEZBSUxFRChJRGlyZWN0WFZpZGVvRGVjb2Rlcl9SZWxlYXNlQnVmZmVyKGN0eC0+ZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhWQTJfQml0U3RyZWFtRGF0ZUJ1ZmZlclR5cGUpKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpIDwgY3R4X3BpYy0+c2xpY2VfY291bnQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIG1lbXNldChicywgMCwgc2l6ZW9mKCpicykpOworICAgIGJzLT5Db21wcmVzc2VkQnVmZmVyVHlwZSA9IERYVkEyX0JpdFN0cmVhbURhdGVCdWZmZXJUeXBlOworICAgIGJzLT5EYXRhU2l6ZSAgICAgICAgICAgICA9IGN1cnJlbnQgLSBkeHZhX2RhdGE7CisgICAgYnMtPk51bU1Cc0luQnVmZmVyICAgICAgID0gbWJfY291bnQ7CisKKyAgICBpZiAoaXNfc2xpY2Vfc2hvcnQoY3R4KSkgeworICAgICAgICBzbGljZV9kYXRhID0gY3R4X3BpYy0+c2xpY2Vfc2hvcnQ7CisgICAgICAgIHNsaWNlX3NpemUgPSBjdHhfcGljLT5zbGljZV9jb3VudCAqIHNpemVvZigqY3R4X3BpYy0+c2xpY2Vfc2hvcnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNsaWNlX2RhdGEgPSBjdHhfcGljLT5zbGljZV9sb25nOworICAgICAgICBzbGljZV9zaXplID0gY3R4X3BpYy0+c2xpY2VfY291bnQgKiBzaXplb2YoKmN0eF9waWMtPnNsaWNlX2xvbmcpOworICAgIH0KKyAgICBhc3NlcnQoKGJzLT5EYXRhU2l6ZSAmIDEyNykgPT0gMCk7CisgICAgcmV0dXJuIGZmX2R4dmEyX2NvbW1pdF9idWZmZXIoYXZjdHgsIGN0eCwgc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhWQTJfU2xpY2VDb250cm9sQnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZV9kYXRhLCBzbGljZV9zaXplLCBtYl9jb3VudCk7Cit9CisKKworc3RhdGljIGludCBkeHZhMl9oMjY0X3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl91bnVzZWQgY29uc3QgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3VudXNlZCB1aW50MzJfdCBzaXplKQoreworICAgIGNvbnN0IEgyNjRDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZHh2YV9jb250ZXh0ICpjdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworICAgIHN0cnVjdCBkeHZhMl9waWN0dXJlX2NvbnRleHQgKmN0eF9waWMgPSBoLT5jdXJfcGljX3B0ci0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisKKyAgICBpZiAoIWN0eC0+ZGVjb2RlciB8fCAhY3R4LT5jZmcgfHwgY3R4LT5zdXJmYWNlX2NvdW50IDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhc3NlcnQoY3R4X3BpYyk7CisKKyAgICAvKiBGaWxsIHVwIERYVkFfUGljUGFyYW1zX0gyNjQgKi8KKyAgICBmaWxsX3BpY3R1cmVfcGFyYW1ldGVycyhjdHgsIGgsICZjdHhfcGljLT5wcCk7CisKKyAgICAvKiBGaWxsIHVwIERYVkFfUW1hdHJpeF9IMjY0ICovCisgICAgZmlsbF9zY2FsaW5nX2xpc3RzKGN0eCwgaCwgJmN0eF9waWMtPnFtKTsKKworICAgIGN0eF9waWMtPnNsaWNlX2NvdW50ICAgID0gMDsKKyAgICBjdHhfcGljLT5iaXRzdHJlYW1fc2l6ZSA9IDA7CisgICAgY3R4X3BpYy0+Yml0c3RyZWFtICAgICAgPSBOVUxMOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR4dmEyX2gyNjRfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKQoreworICAgIGNvbnN0IEgyNjRDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZHh2YV9jb250ZXh0ICpjdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworICAgIGNvbnN0IEgyNjRQaWN0dXJlICpjdXJyZW50X3BpY3R1cmUgPSBoLT5jdXJfcGljX3B0cjsKKyAgICBzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0ICpjdHhfcGljID0gY3VycmVudF9waWN0dXJlLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKyAgICB1bnNpZ25lZCBwb3NpdGlvbjsKKworICAgIGlmIChjdHhfcGljLT5zbGljZV9jb3VudCA+PSBNQVhfU0xJQ0VTKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIWN0eF9waWMtPmJpdHN0cmVhbSkKKyAgICAgICAgY3R4X3BpYy0+Yml0c3RyZWFtID0gYnVmZmVyOworICAgIGN0eF9waWMtPmJpdHN0cmVhbV9zaXplICs9IHNpemU7CisKKyAgICBwb3NpdGlvbiA9IGJ1ZmZlciAtIGN0eF9waWMtPmJpdHN0cmVhbTsKKyAgICBpZiAoaXNfc2xpY2Vfc2hvcnQoY3R4KSkKKyAgICAgICAgZmlsbF9zbGljZV9zaG9ydCgmY3R4X3BpYy0+c2xpY2Vfc2hvcnRbY3R4X3BpYy0+c2xpY2VfY291bnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLCBzaXplKTsKKyAgICBlbHNlCisgICAgICAgIGZpbGxfc2xpY2VfbG9uZyhhdmN0eCwgJmN0eF9waWMtPnNsaWNlX2xvbmdbY3R4X3BpYy0+c2xpY2VfY291bnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgJmN0eF9waWMtPnBwLCBwb3NpdGlvbiwgc2l6ZSk7CisgICAgY3R4X3BpYy0+c2xpY2VfY291bnQrKzsKKworICAgIGlmIChoLT5zbGljZV90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JICYmIGgtPnNsaWNlX3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX1NJKQorICAgICAgICBjdHhfcGljLT5wcC53Qml0RmllbGRzICY9IH4oMSA8PCAxNSk7IC8qIFNldCBJbnRyYVBpY0ZsYWcgdG8gMCAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR4dmEyX2gyNjRfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCAqY3R4X3BpYyA9CisgICAgICAgIGgtPmN1cl9waWNfcHRyLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGN0eF9waWMtPnNsaWNlX2NvdW50IDw9IDAgfHwgY3R4X3BpYy0+Yml0c3RyZWFtX3NpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldCA9IGZmX2R4dmEyX2NvbW1vbl9lbmRfZnJhbWUoYXZjdHgsICZoLT5jdXJfcGljX3B0ci0+ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHhfcGljLT5wcCwgc2l6ZW9mKGN0eF9waWMtPnBwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHhfcGljLT5xbSwgc2l6ZW9mKGN0eF9waWMtPnFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdF9iaXRzdHJlYW1fYW5kX3NsaWNlX2J1ZmZlcik7CisgICAgaWYgKCFyZXQpCisgICAgICAgIGZmX2gyNjRfZHJhd19ob3Jpel9iYW5kKGgsIDAsIGgtPmF2Y3R4LT5oZWlnaHQpOworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSFdBY2NlbCBmZl9oMjY0X2R4dmEyX2h3YWNjZWwgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImgyNjRfZHh2YTIiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAorICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfRFhWQTJfVkxELAorICAgIC5zdGFydF9mcmFtZSAgICA9IGR4dmEyX2gyNjRfc3RhcnRfZnJhbWUsCisgICAgLmRlY29kZV9zbGljZSAgID0gZHh2YTJfaDI2NF9kZWNvZGVfc2xpY2UsCisgICAgLmVuZF9mcmFtZSAgICAgID0gZHh2YTJfaDI2NF9lbmRfZnJhbWUsCisgICAgLmZyYW1lX3ByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBkeHZhMl9waWN0dXJlX2NvbnRleHQpLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2R4dmEyX2ludGVybmFsLmggYi9mZm1wZWcvbGliYXZjb2RlYy9keHZhMl9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyN2MxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9keHZhMl9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBEWFZBMiBIVyBhY2NlbGVyYXRpb24KKyAqCisgKiBjb3B5cmlnaHQgKGMpIDIwMTAgTGF1cmVudCBBaW1hcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRFhWQV9JTlRFUk5BTF9ICisjZGVmaW5lIEFWQ09ERUNfRFhWQV9JTlRFUk5BTF9ICisKKyNkZWZpbmUgQ09CSk1BQ1JPUworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJkeHZhMi5oIgorI2lmIEhBVkVfRFhWQV9ICisjaW5jbHVkZSA8ZHh2YS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisKK3ZvaWQgKmZmX2R4dmEyX2dldF9zdXJmYWNlKGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKKwordW5zaWduZWQgZmZfZHh2YTJfZ2V0X3N1cmZhY2VfaW5kZXgoY29uc3Qgc3RydWN0IGR4dmFfY29udGV4dCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUpOworCitpbnQgZmZfZHh2YTJfY29tbWl0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqLCBzdHJ1Y3QgZHh2YV9jb250ZXh0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBMl9EZWNvZGVCdWZmZXJEZXNjICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB0eXBlLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWJfY291bnQpOworCisKK2ludCBmZl9keHZhMl9jb21tb25fZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICosIEFWRnJhbWUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBwLCB1bnNpZ25lZCBwcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcW0sIHVuc2lnbmVkIHFtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpjb21taXRfYnNfc2kpKEFWQ29kZWNDb250ZXh0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYVkEyX0RlY29kZUJ1ZmZlckRlc2MgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBMl9EZWNvZGVCdWZmZXJEZXNjICpzbGljZSkpOworCisjZW5kaWYgLyogQVZDT0RFQ19EWFZBX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2R4dmEyX21wZWcyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9keHZhMl9tcGVnMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZjRhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9keHZhMl9tcGVnMi5jCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogTVBFRy0yIEhXIGFjY2VsZXJhdGlvbi4KKyAqCisgKiBjb3B5cmlnaHQgKGMpIDIwMTAgTGF1cmVudCBBaW1hcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImR4dmEyX2ludGVybmFsLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisKKyNkZWZpbmUgTUFYX1NMSUNFUyAxMDI0CitzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0IHsKKyAgICBEWFZBX1BpY3R1cmVQYXJhbWV0ZXJzIHBwOworICAgIERYVkFfUW1hdHJpeERhdGEgICAgICAgcW07CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICBzbGljZV9jb3VudDsKKyAgICBEWFZBX1NsaWNlSW5mbyAgICAgICAgIHNsaWNlW01BWF9TTElDRVNdOworCisgICAgY29uc3QgdWludDhfdCAgICAgICAgICAqYml0c3RyZWFtOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgYml0c3RyZWFtX3NpemU7Cit9OworCitzdGF0aWMgdm9pZCBmaWxsX3BpY3R1cmVfcGFyYW1ldGVycyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHh2YV9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBX1BpY3R1cmVQYXJhbWV0ZXJzICpwcCkKK3sKKyAgICBjb25zdCBQaWN0dXJlICpjdXJyZW50X3BpY3R1cmUgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyOworICAgIGludCBpc19maWVsZCA9IHMtPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUU7CisKKyAgICBtZW1zZXQocHAsIDAsIHNpemVvZigqcHApKTsKKyAgICBwcC0+d0RlY29kZWRQaWN0dXJlSW5kZXggICAgICAgICA9IGZmX2R4dmEyX2dldF9zdXJmYWNlX2luZGV4KGN0eCwgY3VycmVudF9waWN0dXJlLT5mKTsKKyAgICBwcC0+d0RlYmxvY2tlZFBpY3R1cmVJbmRleCAgICAgICA9IDA7CisgICAgaWYgKHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkKKyAgICAgICAgcHAtPndGb3J3YXJkUmVmUGljdHVyZUluZGV4ICA9IGZmX2R4dmEyX2dldF9zdXJmYWNlX2luZGV4KGN0eCwgcy0+bGFzdF9waWN0dXJlLmYpOworICAgIGVsc2UKKyAgICAgICAgcHAtPndGb3J3YXJkUmVmUGljdHVyZUluZGV4ICA9IDB4ZmZmZjsKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICBwcC0+d0JhY2t3YXJkUmVmUGljdHVyZUluZGV4ID0gZmZfZHh2YTJfZ2V0X3N1cmZhY2VfaW5kZXgoY3R4LCBzLT5uZXh0X3BpY3R1cmUuZik7CisgICAgZWxzZQorICAgICAgICBwcC0+d0JhY2t3YXJkUmVmUGljdHVyZUluZGV4ID0gMHhmZmZmOworICAgIHBwLT53UGljV2lkdGhJbk1CbWludXMxICAgICAgICAgID0gcy0+bWJfd2lkdGggIC0gMTsKKyAgICBwcC0+d1BpY0hlaWdodEluTUJtaW51czEgICAgICAgICA9IChzLT5tYl9oZWlnaHQgPj4gaXNfZmllbGQpIC0gMTsKKyAgICBwcC0+Yk1hY3JvYmxvY2tXaWR0aE1pbnVzMSAgICAgICA9IDE1OworICAgIHBwLT5iTWFjcm9ibG9ja0hlaWdodE1pbnVzMSAgICAgID0gMTU7CisgICAgcHAtPmJCbG9ja1dpZHRoTWludXMxICAgICAgICAgICAgPSA3OworICAgIHBwLT5iQmxvY2tIZWlnaHRNaW51czEgICAgICAgICAgID0gNzsKKyAgICBwcC0+YkJQUG1pbnVzMSAgICAgICAgICAgICAgICAgICA9IDc7CisgICAgcHAtPmJQaWNTdHJ1Y3R1cmUgICAgICAgICAgICAgICAgPSBzLT5waWN0dXJlX3N0cnVjdHVyZTsKKyAgICBwcC0+YlNlY29uZEZpZWxkICAgICAgICAgICAgICAgICA9IGlzX2ZpZWxkICYmICFzLT5maXJzdF9maWVsZDsKKyAgICBwcC0+YlBpY0ludHJhICAgICAgICAgICAgICAgICAgICA9IHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwcC0+YlBpY0JhY2t3YXJkUHJlZGljdGlvbiAgICAgICA9IHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQjsKKyAgICBwcC0+YkJpZGlyZWN0aW9uYWxBdmVyYWdpbmdNb2RlICA9IDA7CisgICAgcHAtPmJNVnByZWNpc2lvbkFuZENocm9tYVJlbGF0aW9uPSAwOyAvKiBGSVhNRSAqLworICAgIHBwLT5iQ2hyb21hRm9ybWF0ICAgICAgICAgICAgICAgID0gcy0+Y2hyb21hX2Zvcm1hdDsKKyAgICBwcC0+YlBpY1NjYW5GaXhlZCAgICAgICAgICAgICAgICA9IDE7CisgICAgcHAtPmJQaWNTY2FuTWV0aG9kICAgICAgICAgICAgICAgPSBzLT5hbHRlcm5hdGVfc2NhbiA/IDEgOiAwOworICAgIHBwLT5iUGljUmVhZGJhY2tSZXF1ZXN0cyAgICAgICAgID0gMDsKKyAgICBwcC0+YlJjb250cm9sICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgcHAtPmJQaWNTcGF0aWFsUmVzaWQ4ICAgICAgICAgICAgPSAwOworICAgIHBwLT5iUGljT3ZlcmZsb3dCbG9ja3MgICAgICAgICAgID0gMDsKKyAgICBwcC0+YlBpY0V4dHJhcG9sYXRpb24gICAgICAgICAgICA9IDA7CisgICAgcHAtPmJQaWNEZWJsb2NrZWQgICAgICAgICAgICAgICAgPSAwOworICAgIHBwLT5iUGljRGVibG9ja0NvbmZpbmVkICAgICAgICAgID0gMDsKKyAgICBwcC0+YlBpYzRNVmFsbG93ZWQgICAgICAgICAgICAgICA9IDA7CisgICAgcHAtPmJQaWNPQk1DICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgIHBwLT5iUGljQmluUEIgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBwcC0+Yk1WX1JQUyAgICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgcHAtPmJSZXNlcnZlZEJpdHMgICAgICAgICAgICAgICAgPSAwOworICAgIHBwLT53Qml0c3RyZWFtRmNvZGVzICAgICAgICAgICAgID0gKHMtPm1wZWdfZl9jb2RlWzBdWzBdIDw8IDEyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+bXBlZ19mX2NvZGVbMF1bMV0gPDwgIDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tcGVnX2ZfY29kZVsxXVswXSA8PCAgNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1wZWdfZl9jb2RlWzFdWzFdICAgICAgKTsKKyAgICBwcC0+d0JpdHN0cmVhbVBDRWVsZW1lbnRzICAgICAgICA9IChzLT5pbnRyYV9kY19wcmVjaXNpb24gICAgICAgICA8PCAxNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnBpY3R1cmVfc3RydWN0dXJlICAgICAgICAgIDw8IDEyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+dG9wX2ZpZWxkX2ZpcnN0ICAgICAgICAgICAgPDwgMTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5mcmFtZV9wcmVkX2ZyYW1lX2RjdCAgICAgICA8PCAxMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmNvbmNlYWxtZW50X21vdGlvbl92ZWN0b3JzIDw8ICA5KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+cV9zY2FsZV90eXBlICAgICAgICAgICAgICAgPDwgIDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5pbnRyYV92bGNfZm9ybWF0ICAgICAgICAgICA8PCAgNykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmFsdGVybmF0ZV9zY2FuICAgICAgICAgICAgIDw8ICA2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+cmVwZWF0X2ZpcnN0X2ZpZWxkICAgICAgICAgPDwgIDUpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5jaHJvbWFfNDIwX3R5cGUgICAgICAgICAgICA8PCAgNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnByb2dyZXNzaXZlX2ZyYW1lICAgICAgICAgIDw8ICAzKTsKKyAgICBwcC0+YkJpdHN0cmVhbUNvbmNlYWxtZW50TmVlZCAgICA9IDA7CisgICAgcHAtPmJCaXRzdHJlYW1Db25jZWFsbWVudE1ldGhvZCAgPSAwOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3F1YW50aXphdGlvbl9tYXRyaWNlcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHh2YV9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBX1FtYXRyaXhEYXRhICpxbSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBxbS0+Yk5ld1FtYXRyaXhbaV0gPSAxOworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIGludCBuID0gcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworICAgICAgICBxbS0+UW1hdHJpeFswXVtpXSA9IHMtPmludHJhX21hdHJpeFtuXTsKKyAgICAgICAgcW0tPlFtYXRyaXhbMV1baV0gPSBzLT5pbnRlcl9tYXRyaXhbbl07CisgICAgICAgIHFtLT5RbWF0cml4WzJdW2ldID0gcy0+Y2hyb21hX2ludHJhX21hdHJpeFtuXTsKKyAgICAgICAgcW0tPlFtYXRyaXhbM11baV0gPSBzLT5jaHJvbWFfaW50ZXJfbWF0cml4W25dOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsbF9zbGljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgRFhWQV9TbGljZUluZm8gKnNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1bnNpZ25lZCBzaXplKQoreworICAgIGludCBpc19maWVsZCA9IHMtPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUU7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKworICAgIG1lbXNldChzbGljZSwgMCwgc2l6ZW9mKCpzbGljZSkpOworICAgIHNsaWNlLT53SG9yaXpvbnRhbFBvc2l0aW9uID0gcy0+bWJfeDsKKyAgICBzbGljZS0+d1ZlcnRpY2FsUG9zaXRpb24gICA9IHMtPm1iX3kgPj4gaXNfZmllbGQ7CisgICAgc2xpY2UtPmR3U2xpY2VCaXRzSW5CdWZmZXIgPSA4ICogc2l6ZTsKKyAgICBzbGljZS0+ZHdTbGljZURhdGFMb2NhdGlvbiA9IHBvc2l0aW9uOworICAgIHNsaWNlLT5iU3RhcnRDb2RlQml0T2Zmc2V0ID0gMDsKKyAgICBzbGljZS0+YlJlc2VydmVkQml0cyAgICAgICA9IDA7CisgICAgLyogWFhYIFdlIHN0b3JlIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgTUIgYW5kIGl0IHdpbGwgYmUgZml4ZWQgbGF0ZXIgKi8KKyAgICBzbGljZS0+d051bWJlck1Cc0luU2xpY2UgICA9IChzLT5tYl95ID4+IGlzX2ZpZWxkKSAqIHMtPm1iX3dpZHRoICsgcy0+bWJfeDsKKyAgICBzbGljZS0+d0JhZFNsaWNlQ2hvcHBpbmcgICA9IDA7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgJmJ1ZmZlcls0XSwgOCAqIChzaXplIC0gNCkpOworCisgICAgc2xpY2UtPndRdWFudGl6ZXJTY2FsZUNvZGUgPSBnZXRfYml0cygmZ2IsIDUpOworICAgIHNraXBfMXN0b3BfOGRhdGFfYml0cygmZ2IpOworCisgICAgc2xpY2UtPndNQmJpdE9mZnNldCAgICAgICAgPSA0ICogOCArIGdldF9iaXRzX2NvdW50KCZnYik7Cit9CitzdGF0aWMgaW50IGNvbW1pdF9iaXRzdHJlYW1fYW5kX3NsaWNlX2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBMl9EZWNvZGVCdWZmZXJEZXNjICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYVkEyX0RlY29kZUJ1ZmZlckRlc2MgKnNjKQoreworICAgIGNvbnN0IHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGR4dmFfY29udGV4dCAqY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKyAgICBzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0ICpjdHhfcGljID0KKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgY29uc3QgaW50IGlzX2ZpZWxkID0gcy0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRTsKKyAgICBjb25zdCB1bnNpZ25lZCBtYl9jb3VudCA9IHMtPm1iX3dpZHRoICogKHMtPm1iX2hlaWdodCA+PiBpc19maWVsZCk7CisgICAgdm9pZCAgICAgKmR4dmFfZGF0YV9wdHI7CisgICAgdWludDhfdCAgKmR4dmFfZGF0YSwgKmN1cnJlbnQsICplbmQ7CisgICAgdW5zaWduZWQgZHh2YV9zaXplOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBpZiAoRkFJTEVEKElEaXJlY3RYVmlkZW9EZWNvZGVyX0dldEJ1ZmZlcihjdHgtPmRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhWQTJfQml0U3RyZWFtRGF0ZUJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR4dmFfZGF0YV9wdHIsICZkeHZhX3NpemUpKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZHh2YV9kYXRhID0gZHh2YV9kYXRhX3B0cjsKKyAgICBjdXJyZW50ID0gZHh2YV9kYXRhOworICAgIGVuZCA9IGR4dmFfZGF0YSArIGR4dmFfc2l6ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHhfcGljLT5zbGljZV9jb3VudDsgaSsrKSB7CisgICAgICAgIERYVkFfU2xpY2VJbmZvICpzbGljZSA9ICZjdHhfcGljLT5zbGljZVtpXTsKKyAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBzbGljZS0+ZHdTbGljZURhdGFMb2NhdGlvbjsKKyAgICAgICAgdW5zaWduZWQgc2l6ZSAgICAgPSBzbGljZS0+ZHdTbGljZUJpdHNJbkJ1ZmZlciAvIDg7CisgICAgICAgIGlmIChzaXplID4gZW5kIC0gY3VycmVudCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYnVpbGQgYml0c3RyZWFtIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzbGljZS0+ZHdTbGljZURhdGFMb2NhdGlvbiA9IGN1cnJlbnQgLSBkeHZhX2RhdGE7CisKKyAgICAgICAgaWYgKGkgPCBjdHhfcGljLT5zbGljZV9jb3VudCAtIDEpCisgICAgICAgICAgICBzbGljZS0+d051bWJlck1Cc0luU2xpY2UgPQorICAgICAgICAgICAgICAgIHNsaWNlWzFdLndOdW1iZXJNQnNJblNsaWNlIC0gc2xpY2VbMF0ud051bWJlck1Cc0luU2xpY2U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNsaWNlLT53TnVtYmVyTUJzSW5TbGljZSA9CisgICAgICAgICAgICAgICAgbWJfY291bnQgLSBzbGljZVswXS53TnVtYmVyTUJzSW5TbGljZTsKKworICAgICAgICBtZW1jcHkoY3VycmVudCwgJmN0eF9waWMtPmJpdHN0cmVhbVtwb3NpdGlvbl0sIHNpemUpOworICAgICAgICBjdXJyZW50ICs9IHNpemU7CisgICAgfQorICAgIGlmIChGQUlMRUQoSURpcmVjdFhWaWRlb0RlY29kZXJfUmVsZWFzZUJ1ZmZlcihjdHgtPmRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYVkEyX0JpdFN0cmVhbURhdGVCdWZmZXJUeXBlKSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoaSA8IGN0eF9waWMtPnNsaWNlX2NvdW50KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBtZW1zZXQoYnMsIDAsIHNpemVvZigqYnMpKTsKKyAgICBicy0+Q29tcHJlc3NlZEJ1ZmZlclR5cGUgPSBEWFZBMl9CaXRTdHJlYW1EYXRlQnVmZmVyVHlwZTsKKyAgICBicy0+RGF0YVNpemUgICAgICAgICAgICAgPSBjdXJyZW50IC0gZHh2YV9kYXRhOworICAgIGJzLT5OdW1NQnNJbkJ1ZmZlciAgICAgICA9IG1iX2NvdW50OworCisgICAgcmV0dXJuIGZmX2R4dmEyX2NvbW1pdF9idWZmZXIoYXZjdHgsIGN0eCwgc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhWQTJfU2xpY2VDb250cm9sQnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHhfcGljLT5zbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHhfcGljLT5zbGljZV9jb3VudCAqIHNpemVvZigqY3R4X3BpYy0+c2xpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX2NvdW50KTsKK30KKworc3RhdGljIGludCBkeHZhMl9tcGVnMl9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3VudXNlZCBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3VudXNlZCB1aW50MzJfdCBzaXplKQoreworICAgIGNvbnN0IHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGR4dmFfY29udGV4dCAqY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKyAgICBzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0ICpjdHhfcGljID0KKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisKKyAgICBpZiAoIWN0eC0+ZGVjb2RlciB8fCAhY3R4LT5jZmcgfHwgY3R4LT5zdXJmYWNlX2NvdW50IDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhc3NlcnQoY3R4X3BpYyk7CisKKyAgICBmaWxsX3BpY3R1cmVfcGFyYW1ldGVycyhhdmN0eCwgY3R4LCBzLCAmY3R4X3BpYy0+cHApOworICAgIGZpbGxfcXVhbnRpemF0aW9uX21hdHJpY2VzKGF2Y3R4LCBjdHgsIHMsICZjdHhfcGljLT5xbSk7CisKKyAgICBjdHhfcGljLT5zbGljZV9jb3VudCAgICA9IDA7CisgICAgY3R4X3BpYy0+Yml0c3RyZWFtX3NpemUgPSAwOworICAgIGN0eF9waWMtPmJpdHN0cmVhbSAgICAgID0gTlVMTDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeHZhMl9tcGVnMl9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQoreworICAgIGNvbnN0IHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCAqY3R4X3BpYyA9CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIHVuc2lnbmVkIHBvc2l0aW9uOworCisgICAgaWYgKGN0eF9waWMtPnNsaWNlX2NvdW50ID49IE1BWF9TTElDRVMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiJWQgc2xpY2VzIGluIGR4dmEyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eF9waWMtPnNsaWNlX2NvdW50KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWN0eF9waWMtPmJpdHN0cmVhbSkKKyAgICAgICAgY3R4X3BpYy0+Yml0c3RyZWFtID0gYnVmZmVyOworICAgIGN0eF9waWMtPmJpdHN0cmVhbV9zaXplICs9IHNpemU7CisKKyAgICBwb3NpdGlvbiA9IGJ1ZmZlciAtIGN0eF9waWMtPmJpdHN0cmVhbTsKKyAgICBmaWxsX3NsaWNlKGF2Y3R4LCBzLCAmY3R4X3BpYy0+c2xpY2VbY3R4X3BpYy0+c2xpY2VfY291bnQrK10sIHBvc2l0aW9uLAorICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeHZhMl9tcGVnMl9lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCAqY3R4X3BpYyA9CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIGludCByZXQ7CisKKyAgICBpZiAoY3R4X3BpYy0+c2xpY2VfY291bnQgPD0gMCB8fCBjdHhfcGljLT5iaXRzdHJlYW1fc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0ID0gZmZfZHh2YTJfY29tbW9uX2VuZF9mcmFtZShhdmN0eCwgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHhfcGljLT5wcCwgc2l6ZW9mKGN0eF9waWMtPnBwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHhfcGljLT5xbSwgc2l6ZW9mKGN0eF9waWMtPnFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdF9iaXRzdHJlYW1fYW5kX3NsaWNlX2J1ZmZlcik7CisgICAgaWYgKCFyZXQpCisgICAgICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIDAsIGF2Y3R4LT5oZWlnaHQpOworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSFdBY2NlbCBmZl9tcGVnMl9keHZhMl9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVnMl9keHZhMiIsCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCisgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9EWFZBMl9WTEQsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gZHh2YTJfbXBlZzJfc3RhcnRfZnJhbWUsCisgICAgLmRlY29kZV9zbGljZSAgID0gZHh2YTJfbXBlZzJfZGVjb2RlX3NsaWNlLAorICAgIC5lbmRfZnJhbWUgICAgICA9IGR4dmEyX21wZWcyX2VuZF9mcmFtZSwKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCksCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZHh2YTJfdmMxLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9keHZhMl92YzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVlYjlmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZHh2YTJfdmMxLmMKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBEWFZBMiBXTVYzL1ZDLTEgSFcgYWNjZWxlcmF0aW9uLgorICoKKyAqIGNvcHlyaWdodCAoYykgMjAxMCBMYXVyZW50IEFpbWFyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkeHZhMl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1wZWd1dGlscy5oIgorI2luY2x1ZGUgInZjMS5oIgorI2luY2x1ZGUgInZjMWRhdGEuaCIKKworc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCB7CisgICAgRFhWQV9QaWN0dXJlUGFyYW1ldGVycyBwcDsKKyAgICBEWFZBX1NsaWNlSW5mbyAgICAgICAgIHNpOworCisgICAgY29uc3QgdWludDhfdCAgICAgICAgICAqYml0c3RyZWFtOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgYml0c3RyZWFtX3NpemU7Cit9OworCitzdGF0aWMgdm9pZCBmaWxsX3BpY3R1cmVfcGFyYW1ldGVycyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHh2YV9jb250ZXh0ICpjdHgsIGNvbnN0IFZDMUNvbnRleHQgKnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBX1BpY3R1cmVQYXJhbWV0ZXJzICpwcCkKK3sKKyAgICBjb25zdCBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIGNvbnN0IFBpY3R1cmUgKmN1cnJlbnRfcGljdHVyZSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHI7CisgICAgaW50IGludGNvbXAgPSAwOworCisgICAgLy8gZGV0ZXJtaW5lIGlmIGludGVuc2l0eSBjb21wZW5zYXRpb24gaXMgbmVlZGVkCisgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkgeworICAgICAgaWYgKCh2LT5mY20gPT0gSUxBQ0VfRlJBTUUgJiYgdi0+aW50Y29tcCkgfHwgKHYtPmZjbSAhPSBJTEFDRV9GUkFNRSAmJiB2LT5tdl9tb2RlID09IE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QKSkgeworICAgICAgICBpZiAodi0+bHVtc2NhbGUgIT0gMzIgfHwgdi0+bHVtc2hpZnQgIT0gMCB8fCAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRSAmJiAodi0+bHVtc2NhbGUyICE9IDMyIHx8IHYtPmx1bXNoaWZ0MiAhPSAwKSkpCisgICAgICAgICAgaW50Y29tcCA9IDE7CisgICAgICB9CisgICAgfQorCisgICAgbWVtc2V0KHBwLCAwLCBzaXplb2YoKnBwKSk7CisgICAgcHAtPndEZWNvZGVkUGljdHVyZUluZGV4ICAgID0KKyAgICBwcC0+d0RlYmxvY2tlZFBpY3R1cmVJbmRleCAgPSBmZl9keHZhMl9nZXRfc3VyZmFjZV9pbmRleChjdHgsIGN1cnJlbnRfcGljdHVyZS0+Zik7CisgICAgaWYgKHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSAmJiAhdi0+YmlfdHlwZSkKKyAgICAgICAgcHAtPndGb3J3YXJkUmVmUGljdHVyZUluZGV4ID0gZmZfZHh2YTJfZ2V0X3N1cmZhY2VfaW5kZXgoY3R4LCBzLT5sYXN0X3BpY3R1cmUuZik7CisgICAgZWxzZQorICAgICAgICBwcC0+d0ZvcndhcmRSZWZQaWN0dXJlSW5kZXggPSAweGZmZmY7CisgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiAhdi0+YmlfdHlwZSkKKyAgICAgICAgcHAtPndCYWNrd2FyZFJlZlBpY3R1cmVJbmRleCA9IGZmX2R4dmEyX2dldF9zdXJmYWNlX2luZGV4KGN0eCwgcy0+bmV4dF9waWN0dXJlLmYpOworICAgIGVsc2UKKyAgICAgICAgcHAtPndCYWNrd2FyZFJlZlBpY3R1cmVJbmRleCA9IDB4ZmZmZjsKKyAgICBpZiAodi0+cHJvZmlsZSA9PSBQUk9GSUxFX0FEVkFOQ0VEKSB7CisgICAgICAgIC8qIEl0IGlzIHRoZSBjcm9wcGVkIHdpZHRoL2hlaWdodCAtMSBvZiB0aGUgZnJhbWUgKi8KKyAgICAgICAgcHAtPndQaWNXaWR0aEluTUJtaW51czEgPSBhdmN0eC0+d2lkdGggIC0gMTsKKyAgICAgICAgcHAtPndQaWNIZWlnaHRJbk1CbWludXMxPSBhdmN0eC0+aGVpZ2h0IC0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBJdCBpcyB0aGUgY29kZWQgd2lkdGgvaGVpZ2h0IGluIG1hY3JvYmxvY2sgLTEgb2YgdGhlIGZyYW1lICovCisgICAgICAgIHBwLT53UGljV2lkdGhJbk1CbWludXMxID0gcy0+bWJfd2lkdGggIC0gMTsKKyAgICAgICAgcHAtPndQaWNIZWlnaHRJbk1CbWludXMxPSBzLT5tYl9oZWlnaHQgLSAxOworICAgIH0KKyAgICBwcC0+Yk1hY3JvYmxvY2tXaWR0aE1pbnVzMSAgPSAxNTsKKyAgICBwcC0+Yk1hY3JvYmxvY2tIZWlnaHRNaW51czEgPSAxNTsKKyAgICBwcC0+YkJsb2NrV2lkdGhNaW51czEgICAgICAgPSA3OworICAgIHBwLT5iQmxvY2tIZWlnaHRNaW51czEgICAgICA9IDc7CisgICAgcHAtPmJCUFBtaW51czEgICAgICAgICAgICAgID0gNzsKKyAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgJiBQSUNUX1RPUF9GSUVMRCkKKyAgICAgICAgcHAtPmJQaWNTdHJ1Y3R1cmUgICAgICB8PSAweDAxOworICAgIGlmIChzLT5waWN0dXJlX3N0cnVjdHVyZSAmIFBJQ1RfQk9UVE9NX0ZJRUxEKQorICAgICAgICBwcC0+YlBpY1N0cnVjdHVyZSAgICAgIHw9IDB4MDI7CisgICAgcHAtPmJTZWNvbmRGaWVsZCAgICAgICAgICAgID0gdi0+aW50ZXJsYWNlICYmIHYtPmZjbSA9PSBJTEFDRV9GSUVMRCAmJiB2LT5zZWNvbmRfZmllbGQ7CisgICAgcHAtPmJQaWNJbnRyYSAgICAgICAgICAgICAgID0gcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JIHx8IHYtPmJpX3R5cGU7CisgICAgcHAtPmJQaWNCYWNrd2FyZFByZWRpY3Rpb24gID0gcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmICF2LT5iaV90eXBlOworICAgIHBwLT5iQmlkaXJlY3Rpb25hbEF2ZXJhZ2luZ01vZGUgPSAoMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA3KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY3R4LT5jZmctPkNvbmZpZ0ludHJhUmVzaWRVbnNpZ25lZCAhPSAwKSAgIDw8IDYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjdHgtPmNmZy0+Q29uZmlnUmVzaWREaWZmQWNjZWxlcmF0b3IgIT0gMCkgPDwgNSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50Y29tcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodi0+cHJvZmlsZSA9PSBQUk9GSUxFX0FEVkFOQ0VEKSAgICAgICAgICAgIDw8IDMpOworICAgIHBwLT5iTVZwcmVjaXNpb25BbmRDaHJvbWFSZWxhdGlvbiA9ICgodi0+bXZfbW9kZSA9PSBNVl9QTU9ERV8xTVZfSFBFTF9CSUxJTikgPDwgMykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghcy0+cXVhcnRlcl9zYW1wbGUgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgcHAtPmJDaHJvbWFGb3JtYXQgICAgICAgICAgID0gdi0+Y2hyb21hZm9ybWF0OworICAgIGN0eC0+cmVwb3J0X2lkKys7CisgICAgaWYgKGN0eC0+cmVwb3J0X2lkID49ICgxIDw8IDE2KSkKKyAgICAgICAgY3R4LT5yZXBvcnRfaWQgPSAxOworICAgIHBwLT5iUGljU2NhbkZpeGVkICAgICAgICAgICA9IGN0eC0+cmVwb3J0X2lkID4+IDg7CisgICAgcHAtPmJQaWNTY2FuTWV0aG9kICAgICAgICAgID0gY3R4LT5yZXBvcnRfaWQgJiAweGZmOworICAgIHBwLT5iUGljUmVhZGJhY2tSZXF1ZXN0cyAgICA9IDA7CisgICAgcHAtPmJSY29udHJvbCAgICAgICAgICAgICAgID0gdi0+cm5kOworICAgIHBwLT5iUGljU3BhdGlhbFJlc2lkOCAgICAgICA9ICh2LT5wYW5zY2FuZmxhZyAgPDwgNykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2LT5yZWZkaXN0X2ZsYWcgPDwgNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5sb29wX2ZpbHRlciAgPDwgNSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2LT5mYXN0dXZtYyAgICAgPDwgNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2LT5leHRlbmRlZF9tdiAgPDwgMykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2LT5kcXVhbnQgICAgICAgPDwgMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2LT52c3RyYW5zZm9ybSAgICAgICk7CisgICAgcHAtPmJQaWNPdmVyZmxvd0Jsb2NrcyAgICAgID0gKHYtPnF1YW50aXplcl9tb2RlIDw8IDYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodi0+bXVsdGlyZXMgICAgICAgPDwgNSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2LT5yZXN5bmNfbWFya2VyICA8PCA0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYtPnJhbmdlcmVkICAgICAgIDw8IDMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+bWF4X2JfZnJhbWVzICAgICAgICk7CisgICAgcHAtPmJQaWNFeHRyYXBvbGF0aW9uICAgICAgID0gKCF2LT5pbnRlcmxhY2UgfHwgdi0+ZmNtID09IFBST0dSRVNTSVZFKSA/IDEgOiAyOworICAgIHBwLT5iUGljRGVibG9ja2VkICAgICAgICAgICA9ICgoIXBwLT5iUGljQmFja3dhcmRQcmVkaWN0aW9uICYmIHYtPm92ZXJsYXApICAgICAgICA8PCA2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2LT5wcm9maWxlICE9IFBST0ZJTEVfQURWQU5DRUQgJiYgdi0+cmFuZ2VyZWRmcm0pIDw8IDUpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+bG9vcF9maWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMSk7CisgICAgcHAtPmJQaWNEZWJsb2NrQ29uZmluZWQgICAgID0gKHYtPnBvc3Rwcm9jZmxhZyAgICAgICAgICAgICA8PCA3KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYtPmJyb2FkY2FzdCAgICAgICAgICAgICAgICA8PCA2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYtPmludGVybGFjZSAgICAgICAgICAgICAgICA8PCA1KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYtPnRmY250cmZsYWcgICAgICAgICAgICAgICA8PCA0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYtPmZpbnRlcnBmbGFnICAgICAgICAgICAgICA8PCAzKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpIDw8IDIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodi0+cHNmICAgICAgICAgICAgICAgICAgICAgIDw8IDEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodi0+ZXh0ZW5kZWRfZG12ICAgICAgICAgICAgICAgICApOworICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgIHBwLT5iUGljNE1WYWxsb3dlZCAgICAgID0gdi0+bXZfbW9kZSA9PSBNVl9QTU9ERV9NSVhFRF9NViB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2LT5tdl9tb2RlID09IE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPm12X21vZGUyID09IE1WX1BNT0RFX01JWEVEX01WKTsKKyAgICBpZiAodi0+cHJvZmlsZSA9PSBQUk9GSUxFX0FEVkFOQ0VEKQorICAgICAgICBwcC0+YlBpY09CTUMgICAgICAgICAgICA9ICh2LT5yYW5nZV9tYXB5X2ZsYWcgIDw8IDcpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodi0+cmFuZ2VfbWFweSAgICAgICA8PCA0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYtPnJhbmdlX21hcHV2X2ZsYWcgPDwgMykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2LT5yYW5nZV9tYXB1diAgICAgICAgICApOworICAgIHBwLT5iUGljQmluUEIgICAgICAgICAgICAgICA9IDA7CisgICAgcHAtPmJNVl9SUFMgICAgICAgICAgICAgICAgID0gKHYtPmZjbSA9PSBJTEFDRV9GSUVMRCAmJiBwcC0+YlBpY0JhY2t3YXJkUHJlZGljdGlvbikgPyB2LT5yZWZkaXN0ICsgOSA6IDA7CisgICAgcHAtPmJSZXNlcnZlZEJpdHMgICAgICAgICAgID0gdi0+cHE7CisgICAgaWYgKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpIHsKKyAgICAgICAgaWYgKGludGNvbXApIHsKKyAgICAgICAgICAgIHBwLT53Qml0c3RyZWFtRmNvZGVzICAgICAgPSB2LT5sdW1zY2FsZTsKKyAgICAgICAgICAgIHBwLT53Qml0c3RyZWFtUENFZWxlbWVudHMgPSB2LT5sdW1zaGlmdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBwLT53Qml0c3RyZWFtRmNvZGVzICAgICAgPSAzMjsKKyAgICAgICAgICAgIHBwLT53Qml0c3RyZWFtUENFZWxlbWVudHMgPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogU3ludGF4OiAodG9wX2ZpZWxkX3BhcmFtIDw8IDgpIHwgYm90dG9tX2ZpZWxkX3BhcmFtICovCisgICAgICAgIGlmIChpbnRjb21wKSB7CisgICAgICAgICAgICBwcC0+d0JpdHN0cmVhbUZjb2RlcyAgICAgID0gKHYtPmx1bXNjYWxlIDw8IDgpIHwgdi0+bHVtc2NhbGUyOworICAgICAgICAgICAgcHAtPndCaXRzdHJlYW1QQ0VlbGVtZW50cyA9ICh2LT5sdW1zaGlmdCA8PCA4KSB8IHYtPmx1bXNoaWZ0MjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBwLT53Qml0c3RyZWFtRmNvZGVzICAgICAgPSAoMzIgPDwgOCkgfCAzMjsKKyAgICAgICAgICAgIHBwLT53Qml0c3RyZWFtUENFZWxlbWVudHMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHBwLT5iQml0c3RyZWFtQ29uY2VhbG1lbnROZWVkICAgPSAwOworICAgIHBwLT5iQml0c3RyZWFtQ29uY2VhbG1lbnRNZXRob2QgPSAwOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgRFhWQV9TbGljZUluZm8gKnNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBjb25zdCBWQzFDb250ZXh0ICp2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworCisgICAgbWVtc2V0KHNsaWNlLCAwLCBzaXplb2YoKnNsaWNlKSk7CisgICAgc2xpY2UtPndIb3Jpem9udGFsUG9zaXRpb24gPSAwOworICAgIHNsaWNlLT53VmVydGljYWxQb3NpdGlvbiAgID0gcy0+bWJfeTsKKyAgICBzbGljZS0+ZHdTbGljZUJpdHNJbkJ1ZmZlciA9IDggKiBzaXplOworICAgIHNsaWNlLT5kd1NsaWNlRGF0YUxvY2F0aW9uID0gcG9zaXRpb247CisgICAgc2xpY2UtPmJTdGFydENvZGVCaXRPZmZzZXQgPSAwOworICAgIHNsaWNlLT5iUmVzZXJ2ZWRCaXRzICAgICAgID0gKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiAhdi0+YmlfdHlwZSkgPyB2LT5iZnJhY3Rpb25fbHV0X2luZGV4ICsgOSA6IDA7CisgICAgc2xpY2UtPndNQmJpdE9mZnNldCAgICAgICAgPSB2LT5wX2ZyYW1lX3NraXBwZWQgPyAweGZmZmYgOiBnZXRfYml0c19jb3VudCgmcy0+Z2IpICsgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEgPyAzMiA6IDApOworICAgIHNsaWNlLT53TnVtYmVyTUJzSW5TbGljZSAgID0gcy0+bWJfd2lkdGggKiBzLT5tYl9oZWlnaHQ7IC8qIFhYWCBXZSBhc3N1bWUgMSBzbGljZSAqLworICAgIHNsaWNlLT53UXVhbnRpemVyU2NhbGVDb2RlID0gdi0+cHE7CisgICAgc2xpY2UtPndCYWRTbGljZUNob3BwaW5nICAgPSAwOworfQorCitzdGF0aWMgaW50IGNvbW1pdF9iaXRzdHJlYW1fYW5kX3NsaWNlX2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBMl9EZWNvZGVCdWZmZXJEZXNjICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYVkEyX0RlY29kZUJ1ZmZlckRlc2MgKnNjKQoreworICAgIGNvbnN0IFZDMUNvbnRleHQgKnYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkeHZhX2NvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgY29uc3QgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdi0+czsKKyAgICBzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0ICpjdHhfcGljID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisKKyAgICBEWFZBX1NsaWNlSW5mbyAqc2xpY2UgPSAmY3R4X3BpYy0+c2k7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBzdGFydF9jb2RlW10gPSB7IDAsIDAsIDEsIDB4MGQgfTsKKyAgICBjb25zdCB1bnNpZ25lZCBzdGFydF9jb2RlX3NpemUgPSBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVkMxID8gc2l6ZW9mKHN0YXJ0X2NvZGUpIDogMDsKKyAgICBjb25zdCB1bnNpZ25lZCBzbGljZV9zaXplID0gc2xpY2UtPmR3U2xpY2VCaXRzSW5CdWZmZXIgLyA4OworICAgIGNvbnN0IHVuc2lnbmVkIHBhZGRpbmcgPSAxMjggLSAoKHN0YXJ0X2NvZGVfc2l6ZSArIHNsaWNlX3NpemUpICYgMTI3KTsKKyAgICBjb25zdCB1bnNpZ25lZCBkYXRhX3NpemUgPSBzdGFydF9jb2RlX3NpemUgKyBzbGljZV9zaXplICsgcGFkZGluZzsKKworICAgIHZvaWQgICAgICpkeHZhX2RhdGFfcHRyOworICAgIHVpbnQ4X3QgICpkeHZhX2RhdGE7CisgICAgdW5zaWduZWQgZHh2YV9zaXplOworICAgIGludCByZXN1bHQ7CisKKyAgICBpZiAoRkFJTEVEKElEaXJlY3RYVmlkZW9EZWNvZGVyX0dldEJ1ZmZlcihjdHgtPmRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhWQTJfQml0U3RyZWFtRGF0ZUJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR4dmFfZGF0YV9wdHIsICZkeHZhX3NpemUpKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZHh2YV9kYXRhID0gZHh2YV9kYXRhX3B0cjsKKyAgICByZXN1bHQgPSBkYXRhX3NpemUgPD0gZHh2YV9zaXplID8gMCA6IC0xOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIGlmIChzdGFydF9jb2RlX3NpemUgPiAwKSB7CisgICAgICAgICAgICBtZW1jcHkoZHh2YV9kYXRhLCBzdGFydF9jb2RlLCBzdGFydF9jb2RlX3NpemUpOworICAgICAgICAgICAgaWYgKHYtPnNlY29uZF9maWVsZCkKKyAgICAgICAgICAgICAgICBkeHZhX2RhdGFbM10gPSAweDBjOworICAgICAgICB9CisgICAgICAgIG1lbWNweShkeHZhX2RhdGEgKyBzdGFydF9jb2RlX3NpemUsCisgICAgICAgICAgICAgICBjdHhfcGljLT5iaXRzdHJlYW0gKyBzbGljZS0+ZHdTbGljZURhdGFMb2NhdGlvbiwgc2xpY2Vfc2l6ZSk7CisgICAgICAgIGlmIChwYWRkaW5nID4gMCkKKyAgICAgICAgICAgIG1lbXNldChkeHZhX2RhdGEgKyBzdGFydF9jb2RlX3NpemUgKyBzbGljZV9zaXplLCAwLCBwYWRkaW5nKTsKKyAgICAgICAgc2xpY2UtPmR3U2xpY2VCaXRzSW5CdWZmZXIgPSA4ICogZGF0YV9zaXplOworICAgIH0KKyAgICBpZiAoRkFJTEVEKElEaXJlY3RYVmlkZW9EZWNvZGVyX1JlbGVhc2VCdWZmZXIoY3R4LT5kZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBMl9CaXRTdHJlYW1EYXRlQnVmZmVyVHlwZSkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIG1lbXNldChicywgMCwgc2l6ZW9mKCpicykpOworICAgIGJzLT5Db21wcmVzc2VkQnVmZmVyVHlwZSA9IERYVkEyX0JpdFN0cmVhbURhdGVCdWZmZXJUeXBlOworICAgIGJzLT5EYXRhU2l6ZSAgICAgICAgICAgICA9IGRhdGFfc2l6ZTsKKyAgICBicy0+TnVtTUJzSW5CdWZmZXIgICAgICAgPSBzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodDsKKyAgICBhc3NlcnQoKGJzLT5EYXRhU2l6ZSAmIDEyNykgPT0gMCk7CisKKyAgICByZXR1cm4gZmZfZHh2YTJfY29tbWl0X2J1ZmZlcihhdmN0eCwgY3R4LCBzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBMl9TbGljZUNvbnRyb2xCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlLCBzaXplb2YoKnNsaWNlKSwgYnMtPk51bU1Cc0luQnVmZmVyKTsKK30KKworc3RhdGljIGludCBkeHZhMl92YzFfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3VudXNlZCB1aW50MzJfdCBzaXplKQoreworICAgIGNvbnN0IFZDMUNvbnRleHQgKnYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkeHZhX2NvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCAqY3R4X3BpYyA9IHYtPnMuY3VycmVudF9waWN0dXJlX3B0ci0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisKKyAgICBpZiAoIWN0eC0+ZGVjb2RlciB8fCAhY3R4LT5jZmcgfHwgY3R4LT5zdXJmYWNlX2NvdW50IDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhc3NlcnQoY3R4X3BpYyk7CisKKyAgICBmaWxsX3BpY3R1cmVfcGFyYW1ldGVycyhhdmN0eCwgY3R4LCB2LCAmY3R4X3BpYy0+cHApOworCisgICAgY3R4X3BpYy0+Yml0c3RyZWFtX3NpemUgPSAwOworICAgIGN0eF9waWMtPmJpdHN0cmVhbSAgICAgID0gTlVMTDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeHZhMl92YzFfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBjb25zdCBWQzFDb250ZXh0ICp2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBQaWN0dXJlICpjdXJyZW50X3BpY3R1cmUgPSB2LT5zLmN1cnJlbnRfcGljdHVyZV9wdHI7CisgICAgc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCAqY3R4X3BpYyA9IGN1cnJlbnRfcGljdHVyZS0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisKKyAgICBpZiAoY3R4X3BpYy0+Yml0c3RyZWFtX3NpemUgPiAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMSAmJgorICAgICAgICBzaXplID49IDQgJiYgSVNfTUFSS0VSKEFWX1JCMzIoYnVmZmVyKSkpIHsKKyAgICAgICAgYnVmZmVyICs9IDQ7CisgICAgICAgIHNpemUgICAtPSA0OworICAgIH0KKworICAgIGN0eF9waWMtPmJpdHN0cmVhbV9zaXplID0gc2l6ZTsKKyAgICBjdHhfcGljLT5iaXRzdHJlYW0gICAgICA9IGJ1ZmZlcjsKKworICAgIGZpbGxfc2xpY2UoYXZjdHgsICZjdHhfcGljLT5zaSwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHh2YTJfdmMxX2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkMxQ29udGV4dCAqdiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCAqY3R4X3BpYyA9IHYtPnMuY3VycmVudF9waWN0dXJlX3B0ci0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgaW50IHJldDsKKworICAgIGlmIChjdHhfcGljLT5iaXRzdHJlYW1fc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXQgPSBmZl9keHZhMl9jb21tb25fZW5kX2ZyYW1lKGF2Y3R4LCB2LT5zLmN1cnJlbnRfcGljdHVyZV9wdHItPmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4X3BpYy0+cHAsIHNpemVvZihjdHhfcGljLT5wcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0X2JpdHN0cmVhbV9hbmRfc2xpY2VfYnVmZmVyKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQoJnYtPnMsIDAsIGF2Y3R4LT5oZWlnaHQpOworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZiBDT05GSUdfV01WM19EWFZBMl9IV0FDQ0VMCitBVkhXQWNjZWwgZmZfd212M19keHZhMl9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ3bXYzX2R4dmEyIiwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV01WMywKKyAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX0RYVkEyX1ZMRCwKKyAgICAuc3RhcnRfZnJhbWUgICAgPSBkeHZhMl92YzFfc3RhcnRfZnJhbWUsCisgICAgLmRlY29kZV9zbGljZSAgID0gZHh2YTJfdmMxX2RlY29kZV9zbGljZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSBkeHZhMl92YzFfZW5kX2ZyYW1lLAorICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0KSwKK307CisjZW5kaWYKKworQVZIV0FjY2VsIGZmX3ZjMV9keHZhMl9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2YzFfZHh2YTIiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WQzEsCisgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9EWFZBMl9WTEQsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gZHh2YTJfdmMxX3N0YXJ0X2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICA9IGR4dmEyX3ZjMV9kZWNvZGVfc2xpY2UsCisgICAgLmVuZF9mcmFtZSAgICAgID0gZHh2YTJfdmMxX2VuZF9mcmFtZSwKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCksCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZWFjM19kYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9lYWMzX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTU5ZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZWFjM19kYXRhLmMKQEAgLTAsMCArMSwxMTM0IEBACisvKgorICogRS1BQy0zIHRhYmxlcworICogQ29weXJpZ2h0IChjKSAyMDA3IEJhcnRsb21pZWogV29sb3dpZWMgPGJhcnRlay53b2xvd2llY0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFRhYmxlcyB0YWtlbiBkaXJlY3RseSBmcm9tIHRoZSBFLUFDLTMgc3BlYy4KKyAqLworCisjaW5jbHVkZSAiZWFjM19kYXRhLmgiCisjaW5jbHVkZSAiYWMzLmgiCisKK2NvbnN0IHVpbnQ4X3QgZmZfZWFjM19iaXRzX3ZzX2hlYmFwWzIwXSA9IHsKKyAgICAwLCAgMiwgIDMsICA0LCAgNSwgIDcsICA4LCAgOSwgIDMsICA0LAorICAgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxNCwgMTYsCit9OworCisvKioKKyAqIFRhYmxlIEUzLjYsIEdrPTEKKyAqIE5vIGdhaW4gKEdrPTEpIGludmVyc2UgcXVhbnRpemF0aW9uLCByZW1hcHBpbmcgc2NhbGUgZmFjdG9ycworICogZmZfZWFjM19nYXFfcmVtYXBbaGViYXArOF0KKyAqLworY29uc3QgaW50MTZfdCBmZl9lYWMzX2dhcV9yZW1hcF8xWzEyXSA9IHsKKyAgICA0NjgxLCAyMTg1LCAxMDU3LCA1MjAsIDI1OCwgMTI5LCA2NCwgMzIsIDE2LCA4LCAyLCAwCit9OworCisvKioKKyAqIFRhYmxlIEUzLjYsIEdrPTIgJiBHaz00LCBBCisgKiBMYXJnZSBtYW50aXNzYSBpbnZlcnNlIHF1YW50aXphdGlvbiwgcmVtYXBwaW5nIHNjYWxlIGZhY3RvcnMKKyAqIGZmX2VhYzNfZ2FxX3JlbWFwXzJfNF9hW2hlYmFwLThdW0drPTIsNF0KKyAqLworY29uc3QgaW50MTZfdCBmZl9lYWMzX2dhcV9yZW1hcF8yXzRfYVs5XVsyXSA9IHsKKyAgICB7IC0xMDkyMywgLTQ2ODEgfSwKKyAgICB7IC0xNDA0MywgLTY1NTQgfSwKKyAgICB7IC0xNTI5MiwgLTczOTkgfSwKKyAgICB7IC0xNTg1NSwgLTc4MDIgfSwKKyAgICB7IC0xNjEyNCwgLTc5OTggfSwKKyAgICB7IC0xNjI1NSwgLTgwOTYgfSwKKyAgICB7IC0xNjMyMCwgLTgxNDQgfSwKKyAgICB7IC0xNjM1MiwgLTgxNjggfSwKKyAgICB7IC0xNjM2OCwgLTgxODAgfQorfTsKKworLyoqCisgKiBUYWJsZSBFMy42LCBHaz0yICYgR2s9NCwgQgorICogTGFyZ2UgbWFudGlzc2EgaW52ZXJzZSBxdWFudGl6YXRpb24sIG5lZ2F0aXZlIG1hbnRpc3NhIHJlbWFwcGluZyBvZmZzZXRzCisgKiBmZl9lYWMzX2dhcV9yZW1hcF8zXzRfYltoZWJhcC04XVtHaz0yLDRdCisgKi8KK2NvbnN0IGludDE2X3QgZmZfZWFjM19nYXFfcmVtYXBfMl80X2JbOV1bMl0gPSB7CisgICAgeyAgLTU0NjEsIC0xMTcwIH0sCisgICAgeyAtMTE3MDMsIC00OTE1IH0sCisgICAgeyAtMTQxOTksIC02NjA2IH0sCisgICAgeyAtMTUzMjcsIC03NDEyIH0sCisgICAgeyAtMTU4NjQsIC03ODA1IH0sCisgICAgeyAtMTYxMjYsIC03OTk5IH0sCisgICAgeyAtMTYyNTUsIC04MDk2IH0sCisgICAgeyAtMTYzMjAsIC04MTQ0IH0sCisgICAgeyAtMTYzNTIsIC04MTY4IH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZxX2hlYmFwMVs0XVs2XSA9IHsKK3sgICA3MTY3LCAgICA0NzM5LCAgICAxMTA2LCAgICA0MjY5LCAgIDEwNDEyLCAgICA0ODIwfSwKK3sgIC01NzAyLCAgIC0zMTg3LCAgLTE0NDgzLCAgIC0xMzkyLCAgIC0yMDI3LCAgICAgODQ5fSwKK3sgICAgNjMzLCAgICA2MTk5LCAgICA3MDA5LCAgLTEyNzc5LCAgIC0yMzA2LCAgIC0yNjM2fSwKK3sgIC0xNDY4LCAgIC03MDMxLCAgICA3NTkyLCAgIDEwNjE3LCAgIC01OTQ2LCAgIC0zMDYyfSwKK307CitzdGF0aWMgY29uc3QgaW50MTZfdCB2cV9oZWJhcDJbOF1bNl0gPSB7Cit7IC0xMjA3MywgICAgIDYwOCwgICAtNzAxOSwgICAgIDU5MCwgICAgNDAwMCwgICAgIDg2OX0sCit7ICAgNjY5MiwgICAxNTY4OSwgICAtNjE3OCwgICAtOTIzOSwgICAgIC03NCwgICAgIDEzM30sCit7ICAgMTg1NSwgICAgLTk4OSwgICAyMDU5NiwgICAtMjkyMCwgICAtNDQ3NSwgICAgIDIyNX0sCit7ICAtMTE5NCwgICAtMzkwMSwgICAgLTgyMSwgICAtNjU2NiwgICAgLTg3NSwgIC0yMDI5OH0sCit7ICAtMjc2MiwgICAtMzE4MSwgICAtNDA5NCwgICAtNTYyMywgIC0xNjk0NSwgICAgOTc2NX0sCit7ICAgMTU0NywgICAgNjgzOSwgICAgMTk4MCwgICAyMDIzMywgICAtMTA3MSwgICAtNDk4Nn0sCit7ICAgNjIyMSwgIC0xNzkxNSwgICAtNTUxNiwgICAgNjI2NiwgICAgIDM1OCwgICAgMTE2Mn0sCit7ICAgMzc1MywgICAtMTA2NiwgICAgNDI4MywgICAtMzIyNywgICAxNTkyOCwgICAxMDE4Nn0sCit9Oworc3RhdGljIGNvbnN0IGludDE2X3QgdnFfaGViYXAzWzE2XVs2XSA9IHsKK3sgLTEwMDI4LCAgIDIwNzc5LCAgIDEwOTgyLCAgIC00NTYwLCAgICAgNzk4LCAgICAgLTY4fSwKK3sgIDExMDUwLCAgIDIwNDkwLCAgIC02NjE3LCAgIC01MzQyLCAgIC0xNzk3LCAgIC0xNjMxfSwKK3sgICAzOTc3LCAgICAtNTQyLCAgICA3MTE4LCAgIC0xMTY2LCAgIDE4ODQ0LCAgIDE0Njc4fSwKK3sgIC00MzIwLCAgICAgLTk2LCAgIC03Mjk1LCAgICAtNDkyLCAgLTIyMDUwLCAgIC00Mjc3fSwKK3sgICAyNjkyLCAgICA1ODU2LCAgICA1NTMwLCAgIDIxODYyLCAgIC03MjEyLCAgIC01MzI1fSwKK3sgICAtMTM1LCAgLTIzMzkxLCAgICAgOTYyLCAgICA4MTE1LCAgICAtNjQ0LCAgICAgMzgyfSwKK3sgIC0xNTYzLCAgICAzNDAwLCAgIC0zMjk5LCAgICA0NjkzLCAgIC02ODkyLCAgIDIyMzk4fSwKK3sgICAzNTM1LCAgICAzMDMwLCAgICA3Mjk2LCAgICA2MjE0LCAgIDIwNDc2LCAgLTEyMDk5fSwKK3sgICAgIDU3LCAgIC02ODIzLCAgICAxODQ4LCAgLTIyMzQ5LCAgIC01OTE5LCAgICA2ODIzfSwKK3sgICAtODIxLCAgIC0zNjU1LCAgICAtMzg3LCAgIC02MjUzLCAgIC0xNzM1LCAgLTIyMzczfSwKK3sgIC02MDQ2LCAgICAxNTg2LCAgLTE4ODkwLCAgLTE0MzkyLCAgICA5MjE0LCAgICAgNzA1fSwKK3sgIC01NzE2LCAgICAgMjY0LCAgLTE3OTY0LCAgIDE0NjE4LCAgICA3OTIxLCAgICAtMzM3fSwKK3sgICAtMTEwLCAgICAgMTA4LCAgICAgICA4LCAgICAgIDc0LCAgICAgLTg5LCAgICAgLTUwfSwKK3sgICA2NjEyLCAgIC0xNTE3LCAgIDIxNjg3LCAgIC0xNjU4LCAgIC03OTQ5LCAgICAtMjQ2fSwKK3sgIDIxNjY3LCAgIC02MzM1LCAgIC04MjkwLCAgICAtMTAxLCAgIC0xMzQ5LCAgICAgLTIyfSwKK3sgLTIyMDAzLCAgIC02NDc2LCAgICA3OTc0LCAgICAgNjQ4LCAgICAyMDU0LCAgICAtMzMxfSwKK307CitzdGF0aWMgY29uc3QgaW50MTZfdCB2cV9oZWJhcDRbMzJdWzZdID0geworeyAgIDY2MzYsICAgLTQ1OTMsICAgMTQxNzMsICAtMTcyOTcsICAtMTY1MjMsICAgICA4NjR9LAoreyAgIDM2NTgsICAgMjI1NDAsICAgICAxMDQsICAgLTE3NjMsICAgICAtODQsICAgICAgIDZ9LAoreyAgMjE1ODAsICAtMTc4MTUsICAgLTcyODIsICAgLTE1NzUsICAgLTIwNzgsICAgIC0zMjB9LAoreyAgLTIyMzMsICAgMTAwMTcsICAgLTI3MjgsICAgMTQ5MzgsICAtMTM2NDAsICAtMTc2NTl9LAoreyAgLTE1NjQsICAtMTc3MzgsICAtMTkxNjEsICAgMTM3MzUsICAgIDI3NTcsICAgIDI5NTF9LAoreyAgIDQ1MjAsICAgIDU1MTAsICAgIDczOTMsICAgMTA3OTksICAgMTkyMzEsICAtMTM3NzB9LAoreyAgICAzOTksICAgIDI5NzYsICAgLTEwOTksICAgIDUwMTMsICAgLTExNTksICAgMjIwOTV9LAoreyAgIDM2MjQsICAgLTIzNTksICAgIDQ2ODAsICAgLTIyMzgsICAgMjI3MDIsICAgIDM3NjV9LAoreyAgLTQyMDEsICAgLTgyODUsICAgLTY4MTAsICAtMTIzOTAsICAtMTg0MTQsICAgMTUzODJ9LAoreyAgLTUxOTgsICAgLTY4NjksICAtMTAwNDcsICAgLTgzNjQsICAtMTYwMjIsICAtMjA1NjJ9LAoreyAgIC0xNDIsICAtMjI2NzEsICAgIC0zNjgsICAgIDQzOTEsICAgIC00NjQsICAgICAtMTN9LAoreyAgICA4MTQsICAgLTExMTgsICAgLTEwODksICAtMjIwMTksICAgICAgNzQsICAgIDE1NTN9LAoreyAgLTE2MTgsICAgMTkyMjIsICAtMTc2NDIsICAtMTM0OTAsICAgICA4NDIsICAgLTIzMDl9LAoreyAgIDQ2ODksICAgMTY0OTAsICAgMjA4MTMsICAtMTUzODcsICAgLTQxNjQsICAgLTM5Njh9LAoreyAgLTMzMDgsICAgMTEyMTQsICAtMTM1NDIsICAgMTM1OTksICAtMTk0NzMsICAgMTM3NzB9LAoreyAgIDE4MTcsICAgICA4NTQsICAgMjEyMjUsICAgIC05NjYsICAgLTE2NDMsICAgIC0yNjh9LAoreyAgLTI1ODcsICAgIC0xMDcsICAtMjAxNTQsICAgICAzNzYsICAgIDExNzQsICAgIC0zMDR9LAoreyAgLTI5MTksICAgICA0NTMsICAgLTUzOTAsICAgICA3NTAsICAtMjIwMzQsICAgIC05Nzh9LAoreyAtMTkwMTIsICAgMTY4MzksICAgMTAwMDAsICAgLTM1ODAsICAgIDIyMTEsICAgIDE0NTl9LAoreyAgIDEzNjMsICAgLTI2NTgsICAgICAtMzMsICAgLTQwNjcsICAgIDExNjUsICAtMjE5ODV9LAoreyAgLTg1OTIsICAgLTI3NjAsICAtMTc1MjAsICAtMTU5ODUsICAgMTQ4OTcsICAgIDEzMjN9LAoreyAgICA2NTIsICAgLTkzMzEsICAgIDMyNTMsICAtMTQ2MjIsICAgMTIxODEsICAgMTk2OTJ9LAoreyAgLTYzNjEsICAgIDU3NzMsICAtMTUzOTUsICAgMTcyOTEsICAgMTY1OTAsICAgLTI5MjJ9LAoreyAgIC02NjEsICAgIC02MDEsICAgIDE2MDksICAgMjI2MTAsICAgICA5OTIsICAgLTEwNDV9LAoreyAgIDQ5NjEsICAgIDkxMDcsICAgMTEyMjUsICAgIDc4MjksICAgMTYzMjAsICAgMTg2Mjd9LAoreyAtMjE4NzIsICAgLTE0MzMsICAgICAxMzgsICAgIDE0NzAsICAgLTE4OTEsICAgIC0xOTZ9LAoreyAtMTk0OTksICAtMTgyMDMsICAgMTEwNTYsICAgIC01MTYsICAgIDI1NDMsICAgLTIyNDl9LAoreyAgLTExOTYsICAtMTc1NzQsICAgMjAxNTAsICAgMTE0NjIsICAgIC00MDEsICAgIDI2MTl9LAoreyAgIDQ2MzgsICAgLTgxNTQsICAgMTE4OTEsICAtMTU3NTksICAgMTc2MTUsICAtMTQ5NTV9LAoreyAgICAtODMsICAgICAyNzgsICAgICAzMjMsICAgICAgNTUsICAgIC0xNTQsICAgICAyMzJ9LAoreyAgIDc3ODgsICAgIDE0NjIsICAgMTgzOTUsICAgMTUyOTYsICAtMTU3NjMsICAgLTExMzF9LAorfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZxX2hlYmFwNVsxMjhdWzZdID0geworeyAgLTMzOTQsICAtMTk3MzAsICAgIDI5NjMsICAgIDk1OTAsICAgIDQ2NjAsICAgMTk2NzN9LAoreyAtMTU2NjUsICAgLTY0MDUsICAgMTc2NzEsICAgIDM4NjAsICAgLTgyMzIsICAtMTk0Mjl9LAoreyAgIDQ0NjcsICAgICA0MTIsICAtMTc4NzMsICAgLTgwMzcsICAgICA2OTEsICAtMTczMDd9LAoreyAgIDM1ODAsICAgIDIzNjMsICAgIDY4ODYsICAgIDM3NjMsICAgIDYzNzksICAtMjA1MjJ9LAoreyAtMTcyMzAsICAtMTQxMzMsICAgLTEzOTYsICAtMjM5MzksICAgIDgzNzMsICAtMTI1Mzd9LAoreyAgLTgwNzMsICAtMjE0NjksICAtMTU2MzgsICAgIDMyMTQsICAgIDgxMDUsICAgLTU5NjV9LAoreyAgIDQzNDMsICAgIDUxNjksICAgIDI2ODMsICAtMTY4MjIsICAgLTUxNDYsICAtMTY1NTh9LAoreyAgIDYzNDgsICAtMTA2NjgsICAgMTI5OTUsICAtMjU1MDAsICAtMjIwOTAsICAgIDQwOTF9LAoreyAgLTI4ODAsICAgLTgzNjYsICAgLTU5NjgsICAtMTcxNTgsICAgLTI2MzgsICAgMjMxMzJ9LAoreyAgLTUwOTUsICAtMTQyODEsICAtMjIzNzEsICAgMjE3NDEsICAgIDM2ODksICAgIDI5NjF9LAoreyAgLTI0NDMsICAtMTc3MzksICAgMjUxNTUsICAgIDI3MDcsICAgIDE1OTQsICAgICAgIDd9LAoreyAtMTgzNzksICAgIDkwMTAsICAgIDQyNzAsICAgICA3MzEsICAgIC00MjYsICAgIC02NDB9LAoreyAtMjM2OTUsICAgMjQ3MzIsICAgIDU2NDIsICAgICA2MTIsICAgIC0zMDgsICAgIC05NjR9LAoreyAgIC03NjcsICAgIDEyNjgsICAgICAyMjUsICAgIDE2MzUsICAgICAxNzMsICAgICA5MTZ9LAoreyAgIDU0NTUsICAgIDY0OTMsICAgIDQ5MDIsICAgMTA1NjAsICAgMjMwNDEsICAtMTcxNDB9LAoreyAgMTcyMTksICAtMjEwNTQsICAtMTg3MTYsICAgIDQ5MzYsICAgLTM0MjAsICAgIDMzNTd9LAoreyAgLTEzOTAsICAgMTU0ODgsICAtMjE5NDYsICAtMTQ2MTEsICAgIDEzMzksICAgICA1NDJ9LAoreyAgLTY4NjYsICAgLTIyNTQsICAtMTIwNzAsICAgLTMwNzUsICAtMTk5ODEsICAtMjA2MjJ9LAoreyAgLTE4MDMsICAgMTE3NzUsICAgIDEzNDMsICAgIDg5MTcsICAgICA2OTMsICAgMjQ0OTd9LAoreyAtMjE2MTAsICAgIDk0NjIsICAgIDQ2ODEsICAgIDkyNTQsICAgLTc4MTUsICAgMTU5MDR9LAoreyAgLTU1NTksICAgLTMwMTgsICAgLTkxNjksICAgLTEzNDcsICAtMjI1NDcsICAgMTI4Njh9LAoreyAgIC0zNjYsICAgIDUwNzYsICAgLTE3MjcsICAgMjA0MjcsICAgIC0yODMsICAgLTI5MjN9LAoreyAgLTE4ODYsICAgLTYzMTMsICAgIC05MzksICAgLTIwODEsICAgLTEzOTksICAgIDM1MTN9LAoreyAgLTMxNjEsICAgIC01MzcsICAgLTUwNzUsICAgMTEyNjgsICAgMTkzOTYsICAgICA5ODl9LAoreyAgIDIzNDUsICAgIDQxNTMsICAgIDU3NjksICAgLTQyNzMsICAgICAyMzMsICAgIC0zOTl9LAoreyAtMjE4OTQsICAgLTExMzgsICAtMTY0NzQsICAgIDU5MDIsICAgIDU0ODgsICAgLTMyMTF9LAoreyAgMTAwMDcsICAtMTI1MzAsICAgMTg4MjksICAgMjA5MzIsICAgLTExNTgsICAgIDE3OTB9LAoreyAgLTExNjUsICAgIDUwMTQsICAgLTExOTksICAgIDY0MTUsICAgLTg0MTgsICAtMjEwMzh9LAoreyAgIDE4OTIsICAgLTM1MzQsICAgIDM4MTUsICAgLTU4NDYsICAgMTY0MjcsICAgMjAyODh9LAoreyAgLTI2NjQsICAtMTE2MjcsICAgLTQxNDcsICAtMTgzMTEsICAtMjI3MTAsICAgMTQ4NDh9LAoreyAgMTcyNTYsICAgMTA0MTksICAgIDc3NjQsICAgMTIwNDAsICAgMTg5NTYsICAgIDI1MjV9LAoreyAtMjE0MTksICAtMTg2ODUsICAtMTA4OTcsICAgIDQzNjgsICAgLTcwNTEsICAgIDQ1Mzl9LAoreyAgLTE1NzQsICAgIDIwNTAsICAgIDU3NjAsICAgMjQ3NTYsICAgMTU5ODMsICAgMTc2Nzh9LAoreyAgIC01MzgsICAtMjI4NjcsICAgMTEwNjcsICAgMTAzMDEsICAgICAzODUsICAgICA1Mjh9LAoreyAgLTg0NjUsICAgLTMwMjUsICAtMTYzNTcsICAtMjMyMzcsICAgMTY0OTEsICAgIDM2NTR9LAoreyAgIDU4NDAsICAgICA1NzUsICAgMTE4OTAsICAgIDE5NDcsICAgMjUxNTcsICAgIDY2NTN9LAoreyAgIDY2MjUsICAgLTM1MTYsICAgLTE5NjQsICAgIDM4NTAsICAgIC0zOTAsICAgIC0xMTZ9LAoreyAgMTgwMDUsICAgMjA5MDAsICAgMTQzMjMsICAgLTc2MjEsICAtMTA5MjIsICAgMTE4MDJ9LAoreyAgLTQ4NTcsICAgLTI5MzIsICAtMTMzMzQsICAgLTc4MTUsICAgMjE2MjIsICAgIDIyNjd9LAoreyAgIC01NzksICAgLTk0MzEsICAgIC03NDgsICAtMjEzMjEsICAgMTIzNjcsICAgIDgyNjV9LAoreyAgLTgzMTcsICAgIDEzNzUsICAtMTc4NDcsICAgIDI5MjEsICAgIDkwNjIsICAgMjIwNDZ9LAoreyAgMTgzOTgsICAgIDg2MzUsICAgLTE1MDMsICAgLTI0MTgsICAtMTgyOTUsICAtMTQ3MzR9LAoreyAgLTI5ODcsICAgMTUxMjksICAgLTMzMzEsICAgMjIzMDAsICAgMTM4NzgsICAtMTM2Mzl9LAoreyAgIDU4NzQsICAtMTkwMjYsICAgMTU1ODcsICAgMTEzNTAsICAtMjA3MzgsICAgIDE5NzF9LAoreyAgIDE1ODEsICAgLTY5NTUsICAtMjE0NDAsICAgIDI0NTUsICAgICAgNjUsICAgICA0MTR9LAoreyAgICA1MTUsICAgLTQ0NjgsICAgIC02NjUsICAgLTQ2NzIsICAgICAxMjUsICAtMTkyMjJ9LAoreyAgMjE0OTUsICAtMjAzMDEsICAgLTE4NzIsICAgLTE5MjYsICAgIC0yMTEsICAgLTEwMjJ9LAoreyAgIDUxODksICAtMTIyNTAsICAgLTE3NzUsICAtMjM1NTAsICAgLTQ1NDYsICAgIDU4MTN9LAoreyAgICAzMjEsICAgLTYzMzEsICAgMTQ2NDYsICAgIDY5NzUsICAgLTE3NzMsICAgICA4Njd9LAoreyAtMTM4MTQsICAgIDMxODAsICAgIDc5MjcsICAgICA0NDQsICAgMTk1NTIsICAgIDMxNDZ9LAoreyAgLTY2NjAsICAgMTIyNTIsICAgLTE5NzIsICAgMTc0MDgsICAtMjQyODAsICAtMTI5NTZ9LAoreyAgIC03NDUsICAgMTQzNTYsICAgLTExMDcsICAgMjM3NDIsICAgLTk2MzEsICAtMTgzNDR9LAoreyAgMTgyODQsICAgLTc5MDksICAgLTc1MzEsICAgMTkxMTgsICAgIDc3MjEsICAtMTI2NTl9LAoreyAgIDE5MjYsICAgMTUxMDEsICAtMTI4NDgsICAgIDIxNTMsICAgMjE2MzEsICAgIDE4NjR9LAoreyAgLTIxMzAsICAgMjM0MTYsICAgMTcwNTYsICAtMTU1OTcsICAgLTE1NDQsICAgICAgODd9LAoreyAgIDgzMTQsICAtMTE4MjQsICAgMTQ1ODEsICAtMjA1OTEsICAgIDc4OTEsICAgLTIwOTl9LAoreyAgMTk2MDAsICAgMjI4MTQsICAtMTczMDQsICAgLTIwNDAsICAgICAyODUsICAgLTM4NjN9LAoreyAgLTgyMTQsICAtMTgzMjIsICAgMTA3MjQsICAtMTM3NDQsICAtMTM0NjksICAgLTE2NjZ9LAoreyAgMTQzNTEsICAgIDQ4ODAsICAtMjAwMzQsICAgICA5NjQsICAgLTQyMjEsICAgIC0xODB9LAoreyAtMjQ1OTgsICAtMTY2MzUsICAgMTk3MjQsICAgIDU5MjUsICAgIDQ3NzcsICAgIDQ0MTR9LAoreyAgLTI0OTUsICAgMjM0OTMsICAtMTYxNDEsICAgIDI5MTgsICAgLTEwMzgsICAgLTIwMTB9LAoreyAgMTg5NzQsICAgLTI1NDAsICAgMTMzNDMsICAgIDE0MDUsICAgLTYxOTQsICAgLTExMzZ9LAoreyAgIDI0ODksICAgMTM2NzAsICAgMjI2MzgsICAgLTczMTEsICAgIC0xMjksICAgLTI3OTJ9LAoreyAtMTM5NjIsICAgMTY3NzUsICAgMjMwMTIsICAgICA3MjgsICAgIDMzOTcsICAgICAxNjJ9LAoreyAgIDMwMzgsICAgICA5OTMsICAgIDg3NzQsICAtMjE5NjksICAgLTY2MDksICAgICA5MTB9LAoreyAtMTI0NDQsICAtMjIzODYsICAgLTI2MjYsICAgLTUyOTUsICAgMTk1MjAsICAgIDk4NzJ9LAoreyAgLTE5MTEsICAtMTgyNzQsICAtMTg1MDYsICAtMTQ5NjIsICAgIDQ3NjAsICAgIDcxMTl9LAoreyAgIDgyOTgsICAgLTI5NzgsICAgMjU4ODYsICAgIDc2NjAsICAgLTc4OTcsICAgIDEwMjB9LAoreyAgIDYxMzIsICAgMTUxMjcsICAgMTg3NTcsICAtMjQzNzAsICAgLTY1MjksICAgLTY2Mjd9LAoreyAgIDc5MjQsICAgMTIxMjUsICAgLTk0NTksICAtMjM5NjIsICAgIDU1MDIsICAgICA5Mzd9LAoreyAtMTcwNTYsICAgLTUzNzMsICAgIDI1MjIsICAgICAzMjcsICAgIDExMjksICAgIC0zOTB9LAoreyAgMTU3NzQsICAgMTk5NTUsICAtMTAzODAsICAgMTExNzIsICAgLTMxMDcsICAgMTQ4NTN9LAoreyAtMTE5MDQsICAgLTgwOTEsICAtMTc5MjgsICAtMjIyODcsICAtMTcyMzcsICAgLTY4MDN9LAoreyAtMTI4NjIsICAgLTIxNzIsICAgLTY1MDksICAgIDU5MjcsICAgMTI0NTgsICAtMjIzNTV9LAoreyAgIC00OTcsICAgICAzMjIsICAgIDEwMzgsICAgLTY2NDMsICAgLTU0MDQsICAgMjAzMTF9LAoreyAgIDEwODMsICAtMjI5ODQsICAgLTg0OTQsICAgMTIxMzAsICAgIC03NjIsICAgIDI2MjN9LAoreyAgIDUwNjcsICAgMTk3MTIsICAgLTE5MDEsICAgICAtMzAsICAgIC0zMjUsICAgICAgODV9LAoreyAgICA5ODcsICAgLTU4MzAsICAgIDQyMTIsICAgLTkwMzAsICAgIDkxMjEsICAtMjUwMzh9LAoreyAgLTc4NjgsICAgIDcyODQsICAtMTIyOTIsICAgMTI5MTQsICAtMjE1OTIsICAgMjA5NDF9LAoreyAgLTE2MzAsICAgLTc2OTQsICAgLTIxODcsICAgLTg1MjUsICAgLTU2MDQsICAtMjUxOTZ9LAoreyAgLTY2NjgsICAgICAzODgsICAtMjI1MzUsICAgIDE1MjYsICAgIDkwODIsICAgICAxOTN9LAoreyAgLTc4NjcsICAtMjIzMDgsICAgIDUxNjMsICAgICAzNjIsICAgICA5NDQsICAgIC0yNTl9LAoreyAgIDM4MjQsICAtMTE4NTAsICAgIDc1OTEsICAtMjMxNzYsICAgMjUzNDIsICAgMjM3NzF9LAoreyAtMTA1MDQsICAgIDQxMjMsICAtMjExMTEsICAgMjExNzMsICAgMjI0MzksICAgIC04Mzh9LAoreyAgLTQ3MjMsICAgMjE3OTUsICAgIDYxODQsICAgIC0xMjIsICAgIDE2NDIsICAgIC03MTd9LAoreyAgMjQ1MDQsICAgMTk4ODcsICAgLTIwNDMsICAgICA5ODYsICAgICAgIDcsICAgICAtNTV9LAoreyAtMjczMTMsICAgIC0xMzUsICAgIDI0MzcsICAgICAyNTksICAgICAgODksICAgICAzMDd9LAoreyAgMjQ0NDYsICAgLTM4NzMsICAgLTUzOTEsICAgIC04MjAsICAgLTIzODcsICAgICAzNjF9LAoreyAgIDU1MjksICAgIDU3ODQsICAgMTg2ODIsICAgICAyNDIsICAtMjE4OTYsICAgLTQwMDN9LAoreyAgMjIzMDQsICAgIDQ0ODMsICAgICA3MjIsICAtMTIyNDIsICAgIDc1NzAsICAgMTU0NDh9LAoreyAgIDg2NzMsICAgIDMwMDksICAgMjA0MzcsICAgMjExMDgsICAtMjExMDAsICAgLTMwODB9LAoreyAgLTExMzIsICAgIDI3MDUsICAgLTE4MjUsICAgIDU0MjAsICAgIC03ODUsICAgMTg1MzJ9LAoreyAgMTY5MzIsICAtMTM1MTcsICAtMTY1MDksICAtMTQ4NTgsICAtMjAzMjcsICAtMTQyMjF9LAoreyAgIDIyMTksICAgIDEzODAsICAgMjE0NzQsICAgLTExMjgsICAgICAzMjcsICAgICAgODN9LAoreyAgLTIxNzcsICAgMjE1MTcsICAgLTM4NTYsICAtMTQxODAsICAgIC0yMDQsICAgLTIxOTF9LAoreyAgICA5NTMsICAgLTk0MjYsICAgMTU4NzQsICAtMTA3MTAsICAgLTMyMzEsICAgMjEwMzB9LAoreyAgIC00MjEsICAgLTEzNzcsICAgICA2NDAsICAgLTgyMzksICAtMjA5NzYsICAgIDIxNzR9LAoreyAgIDQzMDksICAgMTg1MTQsICAgLTkxMDAsICAtMTgzMTksICAtMTU1MTgsICAgIDM3MDR9LAoreyAgLTU5NDMsICAgICA0NDksICAgLTgzODcsICAgIDEwNzUsICAtMjIyMTAsICAgLTQ5OTJ9LAoreyAgIDI5NTMsICAgMTI3ODgsICAgMTgyODUsICAgIDE0MzAsICAgMTQ5MzcsICAgMjE3MzF9LAoreyAgLTI5MTMsICAgICA0MDEsICAgLTQ3MzksICAtMjAxMDUsICAgIDE2OTksICAgLTExNDd9LAoreyAgIDM0NDksICAgIDUyNDEsICAgIDg4NTMsICAgMjIxMzQsICAgLTc1NDcsICAgIDE0NTF9LAoreyAgLTIxNTQsICAgIDg1ODQsICAgMTgxMjAsICAtMTU2MTQsICAgMTkzMTksICAgLTU5OTF9LAoreyAgIDM1MDEsICAgIDI4NDEsICAgIDU4OTcsICAgIDYzOTcsICAgIDg2MzAsICAgMjMwMTh9LAoreyAgIDI0NjcsICAgIDI5NTYsICAgICAzNzksICAgIDU3MDMsICAtMjIwNDcsICAgLTIxODl9LAoreyAtMTY5NjMsICAgIC01OTQsICAgMTg4MjIsICAgLTUyOTUsICAgIDE2NDAsICAgICA3NzR9LAoreyAgIDI4OTYsICAgLTE0MjQsICAgIDM1ODYsICAgLTIyOTIsICAgMTk5MTAsICAgLTE4MjJ9LAoreyAtMTg1NzUsICAgMjEyMTksICAtMTQwMDEsICAtMTI1NzMsICAgMTY0NjYsICAgICA2MzV9LAoreyAgLTE5OTgsICAtMTkzMTQsICAtMTY1MjcsICAgMTIyMDgsICAtMTY1NzYsICAgLTc4NTR9LAoreyAgLTk2NzQsICAgIDEwMTIsICAtMjE2NDUsICAgIDI4ODMsICAtMTI3MTIsICAgIDIzMjF9LAoreyAgLTEwMDUsICAgICA0NzEsICAgLTM2MjksICAgIDgwNDUsICAtMTEwODcsICAgMjU1MzN9LAoreyAgIDQxNDEsICAtMjE0NzIsICAgLTI2NzMsICAgICA3NTYsICAgIC02NjMsICAgIC01MjN9LAoreyAgIDY0OTAsICAgIDg1MzEsICAgMTkyODksICAgMTg5NDksICAgIDYwOTIsICAgLTkzNDd9LAoreyAgMTY5NjUsICAgMjQ1OTksICAgMTQwMjQsICAgMTAwNzIsICAgIC01MzYsICAtMTA0Mzh9LAoreyAgLTgxNDcsICAgIDIxNDUsICAtMjMwMjgsICAtMTcwNzMsICAgIDU0NTEsICAgLTQ0MDF9LAoreyAtMTQ4NzMsICAgMjA1MjAsICAtMTgzMDMsICAgLTk3MTcsICAtMTE4ODUsICAtMTc4MzF9LAoreyAgLTIyOTAsICAtMTQxMjAsICAgIDIwNzAsICAgMjI0NjcsICAgIDE2NzEsICAgICA3MjV9LAoreyAgLTg1MzgsICAgMTQ2MjksICAgIDM1MjEsICAtMjA1NzcsICAgIDY2NzMsICAgIDgyMDB9LAoreyAgMjAyNDgsICAgIDQ0MTAsICAgLTEzNjYsICAgIC01ODUsICAgIDEyMjksICAgLTI0NDl9LAoreyAgIDc0NjcsICAgLTcxNDgsICAgMTM2NjcsICAgLTgyNDYsICAgMjIzOTIsICAtMTczMjB9LAoreyAgLTE5MzIsICAgIDM4NzUsICAgLTkwNjQsICAgLTM4MTIsICAgICA5NTgsICAgICAyNjV9LAoreyAgLTQzOTksICAgIDI5NTksICAtMTU5MTEsICAgMTk1OTgsICAgIDQ5NTQsICAgLTExMDV9LAoreyAgMTgwMDksICAgLTk5MjMsICAtMTgxMzcsICAgLTM4NjIsICAgMTExNzgsICAgIDU4MjF9LAoreyAtMTQ1OTYsICAgLTEyMjcsICAgIDk2NjAsICAgMjE2MTksICAgMTEyMjgsICAtMTE3MjF9LAoreyAgIC03MjEsICAgLTE3MDAsICAgICAxMDksICAgLTIxNDIsICAgICAgNjEsICAgLTY3NzJ9LAoreyAtMjQ2MTksICAtMjI1MjAsICAgIDU2MDgsICAgLTE5NTcsICAgLTE3NjEsICAgLTEwMTJ9LAoreyAtMjM3MjgsICAgLTQ0NTEsICAgLTI2ODgsICAtMTQ2NzksICAgLTQyNjYsICAgIDk5MTl9LAoreyAgIDg0OTUsICAgIC04OTQsICAgMjA0MzgsICAtMTM4MjAsICAtMTcyNjcsICAgICAxMzl9LAorfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZxX2hlYmFwNlsyNTZdWzZdID0geworeyAgMTAxNTQsICAgIDczNjUsICAgMTY4NjEsICAgMTg2ODEsICAtMjI4OTMsICAgLTM2MzZ9LAoreyAgLTI2MTksICAgLTM3ODgsICAgLTU1MjksICAgLTUxOTIsICAgLTkwMDksICAtMjAyOTh9LAoreyAgLTU1ODMsICAtMjI4MDAsICAgMjEyOTcsICAgIDcwMTIsICAgICA3NDUsICAgICA3MjB9LAoreyAgICA0MjgsICAgLTE0NTksICAgICAxMDksICAgLTMwODIsICAgICAzNjEsICAgLTg0MDN9LAoreyAgIDgxNjEsICAgMjI0MDEsICAgICAyNDEsICAgIDE3NTUsICAgIC04NzQsICAgLTI4MjR9LAoreyAgIDExNDAsICAgMTI2NDMsICAgIDIzMDYsICAgMjIyNjMsICAtMjUxNDYsICAtMTc1NTd9LAoreyAgLTI2MDksICAgIDMzNzksICAgMTAzMzcsICAtMTk3MzAsICAtMTU0NjgsICAtMjM5NDR9LAoreyAgLTQwNDAsICAtMTI3OTYsICAtMjU3NzIsICAgMTMwOTYsICAgIDM5MDUsICAgIDEzMTV9LAoreyAgIDQ2MjQsICAtMjM3OTksICAgMTM2MDgsICAgMjUzMTcsICAgLTExNzUsICAgIDIxNzN9LAoreyAgICAtOTcsICAgMTM3NDcsICAgLTUxMjIsICAgMjMyNTUsICAgIDQyMTQsICAtMjIxNDV9LAoreyAgIDY4NzgsICAgIC0zMjIsICAgMTgyNjQsICAgIC04NTQsICAtMTE5MTYsICAgIC03MzN9LAoreyAgMTcyODAsICAtMTI2NjksICAgLTk2OTMsICAgMjM1NjMsICAtMTYyNDAsICAgLTEzMDl9LAoreyAgIDU4MDIsICAgLTQ5NjgsICAgMTk1MjYsICAtMjExOTQsICAtMjQ2MjIsICAgIC0xODN9LAoreyAgIDU4NTEsICAtMTYxMzcsICAgMTUyMjksICAgLTk0OTYsICAgLTE1MzgsICAgICAzNzd9LAoreyAgMTQwOTYsICAgMjUwNTcsICAgMTM0MTksICAgIDgyOTAsICAgMjMzMjAsICAgMTY4MTh9LAoreyAgLTcyNjEsICAgICAxMTgsICAtMTU4NjcsICAgMTkwOTcsICAgIDk3ODEsICAgIC0yNzd9LAoreyAgLTQyODgsICAgMjE1ODksICAtMTMyODgsICAtMTYyNTksICAgMTY2MzMsICAgLTQ4NjJ9LAoreyAgIDQ5MDksICAtMTkyMTcsICAgMjM0MTEsICAgMTQ3MDUsICAgIC03MjIsICAgICAxMjV9LAoreyAgMTk0NjIsICAgLTQ3MzIsICAgLTE5MjgsICAtMTE1MjcsICAgMjA3NzAsICAgIDU0MjV9LAoreyAtMjc1NjIsICAgLTI4ODEsICAgLTQzMzEsICAgICAzODQsICAgLTIxMDMsICAgIDEzNjd9LAoreyAgIC0yNjYsICAgLTkxNzUsICAgIDU0NDEsICAgMjYzMzMsICAgLTE5MjQsICAgIDQyMjF9LAoreyAgLTI5NzAsICAtMjAxNzAsICAtMjE4MTYsICAgIDU0NTAsICAgLTc0MjYsICAgIDUzNDR9LAoreyAgIC0yMjEsICAgLTY2OTYsICAgICA2MDMsICAgLTkxNDAsICAgIDEzMDgsICAtMjc1MDZ9LAoreyAgIDk2MjEsICAgLTgzODAsICAgLTE5NjcsICAgIDk0MDMsICAgLTE2NTEsICAgMjI4MTd9LAoreyAgIDc1NjYsICAgLTUyNTAsICAgLTQxNjUsICAgIDEzODUsICAgIC05OTAsICAgICA1NjB9LAoreyAgLTEyNjIsICAgMjQ3MzgsICAtMTkwNTcsICAgMTA3NDEsICAgIDc1ODUsICAgLTcwOTh9LAoreyAgICA0NTEsICAgMjAxMzAsICAgLTk5NDksICAgLTYwMTUsICAgLTIxODgsICAgLTE0NTh9LAoreyAgMjIyNDksICAgIDkzODAsICAgIDkwOTYsICAgMTA5NTksICAgLTIzNjUsICAgLTM3MjR9LAoreyAgMTg2NjgsICAgIC02NTAsICAgLTEyMzQsICAgMTEwOTIsICAgIDc2NzgsICAgIDU5Njl9LAoreyAgMTkyMDcsICAgLTE0ODUsICAgLTEwNzYsICAgIC03MzEsICAgIC02ODQsICAgICAgNDN9LAoreyAgLTQ5NzMsICAgMTM0MzAsICAgMjAxMzksICAgICAgNjAsICAgICA0NzYsICAgIC05MzV9LAoreyAtMjAwMjksICAgIDg3MTAsICAgIDI0OTksICAgIDEwMTYsICAgLTExNTgsICAgICAzMzV9LAoreyAtMjY0MTMsICAgMTg1OTgsICAgLTIyMDEsICAgIC02NjksICAgIDM0MDksICAgICA3OTN9LAoreyAgLTQ3MjYsICAgIDg4NzUsICAtMjQ2MDcsICAgLTk2NDYsICAgIDM2NDMsICAgIC0yODN9LAoreyAgMTMzMDMsICAtMjE0MDQsICAgLTM2OTEsICAgLTExODQsICAgLTE5NzAsICAgIDE2MTJ9LAoreyAgICAxNzMsICAgICAgNjAsICAgICA5MTksICAgIDEyMjksICAgIDY5NDIsICAgIC02NjV9LAoreyAgMTYzNzcsICAgMTY5OTEsICAgIDUzNDEsICAtMTQwMTUsICAgLTIzMDQsICAtMjAzOTB9LAoreyAgMjUzMzQsICAtMTA2MDksICAgMTE5NDcsICAgLTc2NTMsICAgLTYzNjMsICAgMTQwNTh9LAoreyAgMjM5MjksICAtMTMyNTksICAgLTcyMjYsICAgIC05MzcsICAgICAyMzQsICAgIC0xODd9LAoreyAgIDYzMTEsICAgLTE4NzcsICAgMTI1MDYsICAgLTE4NzksICAgMTg3NTEsICAtMjMzNDF9LAoreyAgICA2MjEsICAgIDY0NDUsICAgIDMzNTQsICAtMjQyNzQsICAgIDg0MDYsICAgIDUzMTV9LAoreyAgLTMyOTcsICAgLTUwMzQsICAgLTQ3MDQsICAgLTUwODAsICAtMjU3MzAsICAgIDUzNDd9LAoreyAgLTEyNzUsICAtMTMyOTUsICAgIC05NjUsICAtMjMzMTgsICAgIDEyMTQsICAgMjYyNTl9LAoreyAgLTYyNTIsICAgMTAwMzUsICAtMjAxMDUsICAgMTUzMDEsICAtMTYwNzMsICAgIDUxMzZ9LAoreyAgIDk1NjIsICAgLTM5MTEsICAtMTk1MTAsICAgIDQ3NDUsICAgMjIyNzAsICAgLTQxNzF9LAoreyAgIDc5NzgsICAtMTk2MDAsICAgMTQwMjQsICAgLTU3NDUsICAtMjA4NTUsICAgIDg5Mzl9LAoreyAgICAgIDcsICAgLTQwMzksICAgICA5OTEsICAgLTYwNjUsICAgICAgNTIsICAtMTk0MjN9LAoreyAgIDM0ODUsICAgIDI5NjksICAgIDc3MzIsICAgIDc3ODYsICAgMjUzMTIsICAgIDYyMDZ9LAoreyAgIC05NTksICAtMTI4MTIsICAgLTE4NDAsICAtMjI3NDMsICAgIDczMjQsICAgMTA4MzB9LAoreyAgLTQ2ODYsICAgIDE2NzgsICAtMTAxNzIsICAgLTUyMDUsICAgIDQyOTQsICAgLTEyNzF9LAoreyAgIDM4ODksICAgIDEzMDIsICAgIDc0NTAsICAgICA2MzgsICAgMjAzNzQsICAgLTMxMzN9LAoreyAtMTI0OTYsICAgLTkxMjMsICAgMTg0NjMsICAtMTIzNDMsICAgLTcyMzgsICAgMTg1NTJ9LAoreyAgLTYxODUsICAgIDg2NDksICAgLTY5MDMsICAgIC04OTUsICAgMTcxMDksICAgMTY2MDR9LAoreyAgLTk4OTYsICAgMjg1NzksICAgIDI4NDUsICAgIDE2NDAsICAgIDI5MjUsICAgIC0yOTh9LAoreyAgMTQ5NjgsICAtMjU5ODgsICAgMTQ4NzgsICAtMjQwMTIsICAgIDE4MTUsICAgLTY0NzR9LAoreyAgMjYxMDcsICAgIDUxNjYsICAgMjEyMjUsICAgMTU4NzMsICAgMjE2MTcsICAgMTQ4MjV9LAoreyAtMjE2ODQsICAgMTY0MzgsICAgMjA1MDQsICAtMTQzNDYsICAgLTcxMTQsICAgLTQxNjJ9LAoreyAgMjg2NDcsICAgICAgOTAsICAgLTE1NzIsICAgICA3ODksICAgIC05MDIsICAgICAtNzV9LAoreyAgLTE0NzksICAgIDI0NzEsICAgLTQwNjEsICAgIDM2MTIsICAgLTIyNDAsICAgMTA5MTR9LAoreyAgIDg2MTYsICAgMTc0OTEsICAgMTcyNTUsICAtMTc0NTYsICAgMTcwMjIsICAtMTYzNTd9LAoreyAtMjA3MjIsICAtMTg1OTcsICAgMjUyNzQsICAgMTc3MjAsICAgLTM1NzMsICAgIDE2OTV9LAoreyAgIC05OTcsICAgIDYxMjksICAgLTYzMDMsICAgMTEyNTAsICAtMTEzNTksICAtMTk3Mzl9LAoreyAgICAtNzQsICAgLTQwMDEsICAgLTE1ODQsICAgMTMzODQsICAgICAxNjIsICAgIC0xNDR9LAoreyAgIC01MjksICAgMjEwNjgsICAgIDc5MjMsICAtMTEzOTYsICAgICA0MjIsICAgICAtMjZ9LAoreyAgIDcxMDIsICAtMTM1MzEsICAtMjAwNTUsICAgIDI2MjksICAgIC0xNzgsICAgIC00Mjl9LAoreyAgIDkyMDEsICAgIDEzNjgsICAtMjIyMzgsICAgIDI2MjMsICAtMjA0OTksICAgMjQ4ODl9LAoreyAgIC00MzIsICAgIDY2NzUsICAgIC0yNjYsICAgIDg3MjMsICAgICAgODAsICAgMjgwMjR9LAoreyAgMTk0OTMsICAgLTMxMDgsICAgLTkyNjEsICAgIDE5MTAsICAtMjE3NzcsICAgIDUzNDV9LAoreyAgMTQwNzksICAtMTE0ODksICAgMTI2MDQsICAgIDYwNzksICAgMTk4NzcsICAgIDEzMTV9LAoreyAgMTA5NDcsICAgIDk4MzcsICAtMTg2MTIsICAgMTU3NDIsICAgIDQ3OTIsICAgICA2MDV9LAoreyAgLTE3NzcsICAgIDM3NTgsICAgLTQwODcsICAgMjE2OTYsICAgIDYwMjQsICAgIC01NzZ9LAoreyAgIDM1NjcsICAgLTM1NzgsICAgMTYzNzksICAgIDI2ODAsICAgLTE3NTIsICAgICA3MTZ9LAoreyAgLTUwNDksICAgLTEzOTksICAgLTQ1NTAsICAgIC02NTIsICAtMTc3MjEsICAgLTMzNjZ9LAoreyAgLTM2MzUsICAgLTQzNzIsICAgLTY1MjIsICAtMjIxNTIsICAgIDczODIsICAgIDE0NTh9LAoreyAgMTIyNDIsICAgMTkxOTAsICAgIDU2NDYsICAgLTc4MTUsICAtMjAyODksICAgMjEzNDR9LAoreyAgLTc1MDgsICAgMTk5NTIsICAgMjM1NDIsICAgLTk3NTMsICAgIDU2NjksICAgLTE5OTB9LAoreyAgLTIyNzUsICAgMTU0MzgsICAgMTA5MDcsICAtMTc4NzksICAgIDY0OTcsICAgMTM1ODJ9LAoreyAtMTU4OTQsICAtMTU2NDYsICAgLTQ3MTYsICAgIDYwMTksICAgMjQyNTAsICAgLTYxNzl9LAoreyAgLTIwNDksICAgLTY4NTYsICAgLTEyMDgsICAgICA5MTgsICAgMTc3MzUsICAgICAtNjl9LAoreyAgLTM3MjEsICAgIDkwOTksICAtMTYwNjUsICAtMjM2MjEsICAgIDU5ODEsICAgLTIzNDR9LAoreyAgIDc4NjIsICAgLTg5MTgsICAgMjQwMzMsICAgMjU1MDgsICAtMTEwMzMsICAgIC03NDF9LAoreyAtMTI1ODgsICAgMTk0NjgsICAgMTQ2NDksICAgMTU0NTEsICAtMjEyMjYsICAgIDExNzF9LAoreyAgIDIxMDIsICAgIDExNDcsICAgIDI3ODksICAgIDQwOTYsICAgIDIxNzksICAgIDg3NTB9LAoreyAtMTgyMTQsICAtMTc3NTgsICAtMTAzNjYsICAgLTUyMDMsICAgLTEwNjYsICAgLTM1NDF9LAoreyAgLTI4MTksICAtMTk5NTgsICAtMTE5MjEsICAgIDYwMzIsICAgIDgzMTUsICAgMTAzNzR9LAoreyAgLTkwNzgsICAgLTIxMDAsICAgMTk0MzEsICAgICAtMTcsICAgICA3MzIsICAgIC02ODl9LAoreyAtMTQ1MTIsICAtMTkyMjQsICAgLTcwOTUsICAgMTg3MjcsICAgIDE4NzAsICAgMjI5MDZ9LAoreyAgIDM5MTIsICAgICA2NTksICAgMjU1OTcsICAgLTQwMDYsICAgIDk2MTksICAgICA4Nzd9LAoreyAgIDI2MTYsICAgMjI2OTUsICAgLTU3NzAsICAgMTc5MjAsICAgIDM4MTIsICAgMjAyMjB9LAoreyAgIDI1NjEsICAgMjY4NDcsICAgLTUyNDUsICAtMTA5MDgsICAgIDIyNTYsICAgIC01MTd9LAoreyAgLTQ5NzQsICAgICAxOTgsICAtMjE5ODMsICAgLTM2MDgsICAgMjIxNzQsICAtMTg5MjR9LAoreyAgMjEzMDgsICAgLTEyMTEsICAgMTkxNDQsICAgMTY2OTEsICAgLTE1ODgsICAgMTEzOTB9LAoreyAgLTE3OTAsICAgIDM5NTksICAgLTM0ODgsICAgIDcwMDMsICAgLTcxMDcsICAgMjA4Nzd9LAoreyAgLTYxMDgsICAtMTc5NTUsICAtMTg3MjIsICAgMjQ3NjMsICAgMTY1MDgsICAgIDMyMTF9LAoreyAgMjA0NjIsICAtMjQ5ODcsICAtMjAzNjEsICAgIDQ0ODQsICAgLTUxMTEsICAgIC00Nzh9LAoreyAgLTYzNzgsICAgLTE5OTgsICAtMTAyMjksICAgIC01NjEsICAtMjIwMzksICAtMjIzMzl9LAoreyAgIDMwNDcsICAtMTg4NTAsICAgIDc1ODYsICAgMTQ3NDMsICAtMTk4NjIsICAgIDYzNTF9LAoreyAgLTUwNDcsICAgIDE0MDUsICAgLTk2NzIsICAgIDEwNTUsICAtMjE4ODEsICAgMTExNzB9LAoreyAgIDM0ODEsICAgLTk2OTksICAgIDY1MjYsICAtMTY2NTUsICAgMjI4MTMsICAgMjE5MDd9LAoreyAtMTg1NzAsICAgMTc1MDEsICAgMTQ2NjQsICAgIDEyOTEsICAgIDUwMjYsICAgMTk2NzZ9LAoreyAgMTYxMzQsICAtMTk4MTAsICAtMTY5NTYsICAtMTc5MzksICAtMTY5MzMsICAgIDU4MDB9LAoreyAgLTgyMjQsICAgIDQ5MDgsICAgIDg5MzUsICAgIDIyNzIsICAgLTExNDAsICAtMjMyMTd9LAoreyAgIDE1NzIsICAgIDI3NTMsICAgLTE1OTgsICAgIDIxNDMsICAgLTMzNDYsICAtMjE5MjZ9LAoreyAgLTk4MzIsICAgLTEwNjAsICAtMjc4MTgsICAgIDEyMTQsICAgIDcyODksICAgICAxNTB9LAoreyAgICAgOTgsICAgIDE1MzgsICAgICA1MzUsICAgMTc0MjksICAtMjMxOTgsICAgIC05MDF9LAoreyAgMjEzNDAsICAtMjAxNDYsICAgIDMyOTcsICAgLTE3NDQsICAgLTgyMDcsICAtMjE0NjJ9LAoreyAgLTQxNjYsICAgLTQ2MzMsICAtMTc5MDIsICAgIDU0NzgsICAgIDEyODUsICAgICAxMzZ9LAoreyAgMTg3MTMsICAgMjEwMDMsICAgMjQ4MTgsICAgMTE0MjEsICAgIDEyODIsICAgLTQ2MTh9LAoreyAgLTM1MzUsICAgIDc2MzYsICAgIC0yNjUsICAgIDIxNDEsICAgIC04MjksICAgLTIwMzV9LAoreyAgLTMxODQsICAgMTk3MTMsICAgIDI3NzUsICAgICAgLTIsICAgIDEwOTAsICAgICAxMDR9LAoreyAgLTY3NzEsICAtMjAxODUsICAgIDI5MzgsICAgLTIxMjUsICAgICAtMzYsICAgIDEyNjh9LAoreyAgIDk1NjAsICAgIDk0MzAsICAgIDk1ODYsICAgMjIxMDAsICAgMTM4MjcsICAgIDYyOTZ9LAoreyAgIC01MzUsICAtMjAwMTgsICAgIDQyNzYsICAgLTE4NjgsICAgIC00NDgsICAtMTcxODN9LAoreyAtMjQzNTIsICAgMTQyNDQsICAtMTM2NDcsICAtMjEwNDAsICAgIDIyNzEsICAgMTE1NTV9LAoreyAgLTI2NDYsICAgMTU0MzcsICAgLTQ1ODksICAgMTg2MzgsICAgLTQyOTksICAgIC02MjJ9LAoreyAtMjAwNjQsICAgIDQxNjksICAgMTgxMTUsICAgLTE0MDQsICAgMTM3MjIsICAgLTE4MjV9LAoreyAtMTYzNTksICAgIDkwODAsICAgICA3NDQsICAgMjIwMjEsICAgICAxMjUsICAgMTA3OTR9LAoreyAgIDk2NDQsICAtMTQ2MDcsICAtMTg0NzksICAtMTQ3MTQsICAgMTExNzQsICAtMjA3NTR9LAoreyAgIC0zMjYsICAtMjM3NjIsICAgIDYxNDQsICAgIDc5MDksICAgICA2MDIsICAgIDE1NDB9LAoreyAgLTY2NTAsICAgIDY2MzQsICAtMTI2ODMsICAgMjEzOTYsICAgMjA3ODUsICAgLTY4Mzl9LAoreyAgIDQyNTIsICAtMjEwNDMsICAgIDU2MjgsICAgMTg2ODcsICAgMjM4NjAsICAgIDgzMjh9LAoreyAgMTc5ODYsICAgIDU3MDQsICAgLTUyNDUsICAtMTgwOTMsICAgIC01NTUsICAgIDMyMTl9LAoreyAgIDYwOTEsICAgMTQyMzIsICAgLTUxMTcsICAtMTc0NTYsICAtMTk0NTIsICAtMTE2NDl9LAoreyAtMjE1ODYsICAgMTEzMDIsICAgMTU0MzQsICAgMjU1OTAsICAgIDY3NzcsICAtMjY2ODN9LAoreyAgMjEzNTUsICAgLTgyNDQsICAgIDU4NzcsICAgLTM1NDAsICAgIDYwNzksICAgLTI1Njd9LAoreyAgIDI2MDMsICAgLTI0NTUsICAgIDU0MjEsICAtMTIyODYsICAtMTkxMDAsICAgIDU1NzR9LAoreyAgLTE3MjEsICAtMjYzOTMsICAtMjM2NjQsICAgMjI5MDQsICAgIC0zNDksICAgIDM3ODd9LAoreyAgIDIxODksICAgLTEyMDMsICAgIDUzNDAsICAgIDMyNDksICAtMjI2MTcsICAgICAxMDR9LAoreyAgLTE2NjQsICAtMTEwMjAsICAgLTI4NTcsICAtMjA3MjMsICAtMjQwNDksICAgMTk5MDB9LAoreyAgMjI4NzMsICAgLTczNDUsICAtMTg0ODEsICAtMTQ2MTYsICAgLTg0MDAsICAtMTI5NjV9LAoreyAgIDM3NzcsICAgIDM5NTgsICAgIDgyMzksICAgMjA0OTQsICAgLTY5OTEsICAgLTEyMDF9LAoreyAgIC0xNjAsICAgLTE2MTMsICAgIC03OTMsICAgLTg2ODEsICAgICA1NzMsICAgICA3NzZ9LAoreyAgIDQyOTcsICAgLTM3ODYsICAgMjAzNzMsICAgIDYwODIsICAgLTUzMjEsICAtMTg0MDB9LAoreyAgMTg3NDUsICAgIDI0NjMsICAgMTI1NDYsICAgLTc3NDksICAgLTc3MzQsICAgLTIxODN9LAoreyAgMTEwNzQsICAgLTQ3MjAsICAgMjIxMTksICAgIDE4MjUsICAtMjQzNTEsICAgIDQwODB9LAoreyAgIDE1MDMsICAtMTkxNzgsICAgLTE1NjksICAgICAgMTMsICAgIC0zMTMsICAgICAzNzV9LAoreyAgICAzMTgsICAgIC01NzUsICAgIDI1NDQsICAgICAxNzgsICAgICAxMDIsICAgICAgNDB9LAoreyAtMTU5OTYsICAtMjY4OTcsICAgIDUwMDgsICAgIDMzMjAsICAgICA2ODYsICAgIDExNTl9LAoreyAgMjU3NTUsICAgMjY4ODYsICAgICA1NzQsICAgLTU5MzAsICAgLTM5MTYsICAgIDE0MDd9LAoreyAgLTkxNDgsICAgLTc2NjUsICAgLTI4NzUsICAgLTgzODQsICAtMTg2NjMsICAgMjY0MDB9LAoreyAgLTc0NDUsICAtMTgwNDAsICAtMTgzOTYsICAgIDg4MDIsICAgLTIyNTIsICAtMjE4ODZ9LAoreyAgIDc4NTEsICAgMTE3NzMsICAgMjc0ODUsICAtMTI4NDcsICAgLTE0MTAsICAgMTk1OTB9LAoreyAgIDIyNDAsICAgIDU5NDcsICAgMTEyNDcsICAgMTU5ODAsICAgLTY0OTksICAgMjQyODB9LAoreyAgMjE2NzMsICAtMTg1MTUsICAgIDk3NzEsICAgIDY1NTAsICAgLTI3MzAsICAgICAzMzR9LAoreyAgLTQxNDksICAgIDE1NzYsICAtMTEwMTAsICAgICAgODksICAtMjQ0MjksICAgLTU3MTB9LAoreyAgIDc3MjAsICAgIDE0NzgsICAgMjE0MTIsICAtMjUwMjUsICAgLTgzODUsICAgICAgIDl9LAoreyAgLTI0NDgsICAgMTAyMTgsICAtMTI3NTYsICAtMTYwNzksICAgIDExNjEsICAtMjEyODR9LAoreyAgLTg3NTcsICAtMTQ0MjksICAtMjI5MTgsICAtMTQ4MTIsICAgIDI2MjksICAgMTM4NDR9LAoreyAgLTcyNTIsICAgIDI4NDMsICAgLTk2MzksICAgIDI4ODIsICAtMTQ2MjUsICAgMjQ0OTd9LAoreyAgIC02NzQsICAgLTY1MzAsICAgICA0MTQsICAtMjMzMzMsICAtMjEzNDMsICAgICA0NTR9LAoreyAgIDIxMDQsICAgLTYzMTIsICAgMTA4ODcsICAgMTgwODcsICAgLTExOTksICAgICAxNzV9LAoreyAgIC00OTMsICAgIC01NjIsICAgLTI3MzksICAgICAxMTgsICAgLTEwNzQsICAgICAgOTN9LAoreyAtMTAwMTEsICAgLTQwNzUsICAtMjgwNzEsICAgMjIxODAsICAgMTUwNzcsICAgIC02MzZ9LAoreyAgLTQ2MzcsICAtMTY0MDgsICAgLTkwMDMsICAtMjA0MTgsICAtMTE2MDgsICAtMjA5MzJ9LAoreyAgIDQ4MTUsICAgMTU4OTIsICAgMjQyMzgsICAtMTM2MzQsICAgLTMwNzQsICAgLTEwNTl9LAoreyAgLTY3MjQsICAgIDQ2MTAsICAtMTg3NzIsICAtMTUyODMsICAtMTY2ODUsICAgMjM5ODh9LAoreyAgMTUzNDksICAgIC02NzQsICAgLTM2ODIsICAgMjE2NzksICAgIDQ0NzUsICAtMTIwODh9LAoreyAgIDQ3NTYsICAgIDI1OTMsICAgIDUzNTQsICAgIDYwMDEsICAgMTUwNjMsICAgMjY0OTB9LAoreyAtMjM4MTUsICAtMTcyNTEsICAgIDY5NDQsICAgICAzNzgsICAgICA2OTQsICAgICA2NzB9LAoreyAgMjMzOTIsICAgLTg4MzksICAtMTQ3MTMsICAgIDc1NDQsICAgIC04NzYsICAgMTEwODh9LAoreyAgIDM2NDAsICAgIDMzMzYsICAgMjI1OTMsICAgLTM0OTUsICAgLTIzMjgsICAgIC0xMTN9LAoreyAgICAyODQsICAgIDY5MTQsICAgIDMwOTcsICAgMTAxNzEsICAgIDY2MzgsICAtMTg2MjF9LAoreyAgIDI0NzIsICAgIDU5NzYsICAgMTEwNTQsICAtMTE5MzYsICAgIC02MDMsICAgIC02NjN9LAoreyAgMTYxNzUsICAgMTY0NDEsICAgMTMxNjQsICAgLTQwNDMsICAgIDQ2NjcsICAgIDc0MzF9LAoreyAgMTkzMzgsICAgMTU1MzQsICAgLTY1MzMsICAgIDE2ODEsICAgLTQ4NTcsICAgMTcwNDh9LAoreyAgMTcwMjcsICAgICA1MzIsICAtMTkwNjQsICAgLTE0NDEsICAgLTUxMzAsICAgIDEwODV9LAoreyAtMTI2MTcsICAtMTc2MDksICAgIDIwNjIsICAtMjUzMzIsICAgMTkwMDksICAtMTYxMjF9LAoreyAgMTAwNTYsICAtMjEwMDAsICAtMTM2MzQsICAgLTI5NDksICAgMTUzNjcsICAgMTk5MzR9LAoreyAgIC02NDgsICAgLTE2MDUsICAgMTAwNDYsICAgLTE1OTIsICAgMTMyOTYsICAgMTk4MDh9LAoreyAgLTEwNTQsICAgMTA3NDQsICAgICA1MzgsICAgMjQ5MzgsICAgIDk2MzAsICAgLTkwNTJ9LAoreyAtMTAwOTksICAgIDMwNDIsICAtMjUwNzYsICAtMjQwNTIsICAgMTM5NzEsICAgICAxMDB9LAoreyAgIDY1NDcsICAgIDY5MDcsICAgIDcwMzEsICAgMTAzNDgsICAgMjM3NzUsICAtMTc4ODZ9LAoreyAtMjI3OTMsICAgLTE5ODQsICAgLTEzOTMsICAgLTMzMzAsICAgIDkyNjcsICAgMTQzMTd9LAoreyAtMTQzNDYsICAgLTM5NjcsICAgIDMwNDIsICAgMTYyNTQsICAtMTczMDMsICAgIDk2NDZ9LAoreyAtMjEzOTMsICAgMjM2MjgsICAgMTY3NzMsICAgICA3MTYsICAgIDI2NjMsICAgICAxMTR9LAoreyAtMTkwMTYsICAgLTMwMzgsICAgIDE1NzQsICAgIC0yNDUsICAgIDE0NjMsICAgIC03OTN9LAoreyAgMjI0MTAsICAgMjM0NDEsICAtMTQ2MzcsICAgIC01MzAsICAgMTczMTAsICAgMTM2MTd9LAoreyAtMTE1ODIsICAgIDc5MzUsICAtMTM5NTQsICAgMjM0NjUsICAtMjQ2MjgsICAgMjY1NTB9LAoreyAgLTEwNDUsICAgIDM2NzksICAgLTIyMTgsICAgMTA1NzIsICAgMjA5OTksICAgLTM3MDJ9LAoreyAtMTU1MTMsICAgICAxOTcsICAgMTY3MTgsICAtMjQ2MDMsICAgIDQ5NDUsICAgICAgIDV9LAoreyAgMTA3ODEsICAgIDQzMzUsICAgMjY3OTAsICAgLTkwNTksICAtMTYxNTIsICAgLTI4NDB9LAoreyAgMTYwNzUsICAtMjQxMDAsICAgLTM5MzMsICAgLTY4MzMsICAgMTI2NDUsICAgLTcwMjl9LAoreyAgIDIwOTYsICAtMjU1NzIsICAgLTgzNzAsICAgIDY4MTQsICAgICAgMTEsICAgIDExNzh9LAoreyAtMTE4NDgsICAgIC01ODMsICAgLTg4ODksICAtMjA1NDMsICAtMTA0NzEsICAgIC0zODB9LAoreyAgLTI0ODcsICAgMjQ3NzcsICAtMjE2MzksICAtMTkzNDEsICAgIDE2NjAsICAgIC03MzJ9LAoreyAgIDIzMTMsICAgMTM2NzksICAgIDQwODUsICAgMjQ1NDksICAgMjQ2OTEsICAtMjExNzl9LAoreyAgLTIzNjYsICAgIC01MDQsICAgLTQxMzAsICAtMTA1NzAsICAgMjM2NjgsICAgIDE5NjF9LAoreyAgMjAzNzksICAgMTc4MDksICAgLTk1MDYsICAgIDM3MzMsICAtMTg5NTQsICAgLTYyOTJ9LAoreyAgLTM4NTYsICAgMTY4MDIsICAgIC05MjksICAtMjAzMTAsICAtMTc3MzksICAgIDY3OTd9LAoreyAgMTI0MzEsICAgIDYwNzgsICAtMTEyNzIsICAtMTQ0NTAsICAgIDY5MTMsICAgMjM0NzZ9LAoreyAgIDc2MzYsICAgLTE2NTUsICAgMjMwMTcsICAgMTA3MTksICAgLTgyOTIsICAgICA4Mzh9LAoreyAgLTg1NTksICAgLTEyMzUsICAtMTgwOTYsICAgIDM4OTcsICAgMTYwOTMsICAgIDE0OTB9LAoreyAgLTM1ODYsICAgIDgyNzYsICAgMTUxNjUsICAgLTM3OTEsICAtMjExNDksICAgIDE3NDF9LAoreyAgLTQ0OTcsICAgMjE3MzksICAgIDIzNjYsICAgIC0yNzgsICAgLTQ3OTIsICAgMTU1NDl9LAoreyAtMjMxMjIsICAtMTM3MDgsICAgIDc2NjgsICAgMTYyMzIsICAgMjQxMjAsICAgMTUwMjV9LAoreyAtMjAwNDMsICAgMTI4MjEsICAtMjAxNjAsICAgMTY2OTEsICAtMTE2NTUsICAtMTYwODF9LAoreyAtMTI2MDEsICAgMjAyMzksICAgIDM0OTYsICAgLTI1NDksICAgLTY3NDUsICAtMTE4NTB9LAoreyAgIDQ0NDEsICAgIDc4MTIsICAgMjA3ODMsICAgMTcwODAsICAgMTE1MjMsICAgLTk2NDN9LAoreyAgMjQ3NjYsICAgIDg0OTQsICAtMjMyOTgsICAgLTMyNjIsICAgMTExMDEsICAgLTcxMjB9LAoreyAtMTAxMDcsICAgLTc2MjMsICAtMjIxNTIsICAtMTgzMDMsICAgMjY2NDUsICAgIDk1NTB9LAoreyAtMjU1NDksICAgICA0NzcsICAgIDc4NzQsICAgLTE1MzgsICAgIDExMjMsICAgIC0xNjh9LAoreyAgICA0NzAsICAgIDk4MzQsICAgIC0zNDcsICAgMjM5NDUsICAtMTAzODEsICAgLTk0Njd9LAoreyAgLTQwOTYsICAgLTk3MDIsICAgLTY4NTYsICAtMjE1NDQsICAgMjA4NDUsICAgIDcxNzR9LAoreyAgIDUzNzAsICAgIDk3NDgsICAtMjM3NjUsICAgLTExOTAsICAgICA1MTIsICAgLTE1Mzh9LAoreyAgLTEwMDYsICAtMTAwNDYsICAtMTI2NDksICAgMTkyMzQsICAgLTE3OTAsICAgIC04OTB9LAoreyAgMTUxMDgsICAgMjM2MjAsICAtMTU2NDYsICAgLTI1MjIsICAgLTEyMDMsICAgLTEzMjV9LAoreyAgLTc0MDYsICAgLTI2MDUsICAgIDEwOTUsICAgIC0yNDcsICAgIC00NzMsICAgICAxNzd9LAoreyAgIDgwODksICAgICAgIDQsICAgMTI0MjQsICAtMjIyODQsICAgMTA0MDUsICAgLTc3Mjh9LAoreyAgMjIxOTYsICAgMTA3NzUsICAgLTUwNDMsICAgICA2OTAsICAgICA1MzQsICAgIC0yMTJ9LAoreyAgLTMxNTMsICAgLTE0MTgsICAtMTY4MzUsICAgMTg0MjYsICAgMTU4MjEsICAgMjI5NTZ9LAoreyAgIDU2ODEsICAgLTIyMjksICAgIDMxOTYsICAgLTM0MTQsICAtMjE4MTcsICAtMTQ4MDd9LAoreyAgICAgMTksICAgICA3ODcsICAgIDEwMzIsICAgICAxNzAsICAgLTgyOTUsICAgIC02NDV9LAoreyAgIC04ODIsICAgLTIzMTksICAtMjcxMDUsICAgICA0MzIsICAgLTQzOTIsICAgIDE0OTl9LAoreyAgLTEzNTQsICAtMTE4MTksICAgICAtNzYsICAtMjAzODAsICAtMTAyOTMsICAgMTEzMjh9LAoreyAgICAyMTEsICAgLTQ3NTMsICAgLTQ2NzUsICAgLTY5MzMsICAtMTM1MzgsICAgMTQ0Nzl9LAoreyAgIDYwNDMsICAgIDUyNjAsICAgIC00NTksICAgIC00NjIsICAgICAxNDMsICAgICAtNjV9LAoreyAgLTI1NzIsICAgIDcyNTYsICAgLTMzMTcsICAgIDkyMTIsICAtMjMxODQsICAgLTk5OTB9LAoreyAtMjQ4ODIsICAgLTk1MzIsICAgMTg4NzQsICAgIDYxMDEsICAgIDI0MjksICAtMTQ0ODJ9LAoreyAgIDgzMTQsICAgIDIyNzcsICAgMTQxOTIsICAgIDM1MTIsICAgMjU4ODEsICAgMjIwMDB9LAoreyAgICAyMDgsICAgMjAyMTgsICAgIC0yODEsICAtMjQ3NzgsICAgICAtNjMsICAgLTExODN9LAoreyAgIDEwOTUsICAgLTYwMzQsICAgIDI3MDYsICAtMjE5MzUsICAgLTI2NTUsICAgICA1NjN9LAoreyAgICAgMjMsICAgLTU5MzAsICAgICAyNDMsICAgLTg5ODksICAgIDUzNDUsICAgMjA1NTh9LAoreyAtMTU0NjYsICAgMTI2OTksICAgIDQxNjAsICAgMTEwODcsICAgMjA2MjEsICAtMTA0MTZ9LAoreyAgMjA5OTUsICAgICAtODUsICAgLTg0NjgsICAgICAxOTQsICAgIDEwMDMsICAgLTk1MTV9LAoreyAtMTk2MzcsICAgLTMzMzUsICAtMTQwODEsICAgIDM1NzQsICAtMjMzODEsICAgIC02Njd9LAoreyAgLTIwNzYsICAgIDM0ODksICAgLTMxOTIsICAtMTkzNjcsICAgICA1MzksICAgLTE1MzB9LAoreyAgIDczNTIsICAtMTUyMTMsICAgMjI1OTYsICAgMTkzNjksICAgIDEwNDMsICAgMTY2Mjd9LAoreyAgLTE4NzIsICAgIC00MTMsICAgIDEyMzUsICAgLTUyNzYsICAgLTM1NTAsICAgMjE5MDN9LAoreyAgIDc5MzEsICAgLTIwMDgsICAgMTY5NjgsICAgLTY3OTksICAgMjkzOTMsICAgLTI0NzV9LAoreyAtMTM1ODksICAgIDgzODksICAtMjM2MzYsICAtMjIwOTEsICAtMTQxNzgsICAtMTQyOTd9LAoreyAtMTE1NzUsICAtMjAwOTAsICAgMTYwNTYsICAgLTE4NDgsICAgMTU3MjEsICAgIDQ1MDB9LAoreyAgIDM4NDksICAtMTY1ODEsICAgMjAxNjEsICAtMjExNTUsICAgIDc3NzgsICAgMTE4NjR9LAoreyAgLTY1NDcsICAgLTEyNzMsICAtMTg4MzcsICAtMTEyMTgsICAgMTE2MzYsICAgIDEwNDR9LAoreyAgIDI1MjgsICAgLTY2OTEsICAtMTc5MTcsICAtMTEzNjIsICAgLTQ4OTQsICAgLTEwMDh9LAoreyAgIDEyNDEsICAgIDQyNjAsICAgIDIzMTksICAgIDYxMTEsICAgIDM0ODUsICAgMjAyMDl9LAoreyAgIDMwMTQsICAgLTMwNDgsICAgIDUzMTYsICAgLTQ1MzksICAgMjA4MzEsICAgIDg3MDJ9LAoreyAgLTE3OTAsICAtMTQ2ODMsICAgICAyNzgsICAgMTM5NTYsICAtMTAwNjUsICAtMTA1NDd9LAoreyAtMjI3MzIsICAgLTc5NTcsICAgLTExNTQsICAgMTM4MjEsICAgLTE0ODQsICAgLTEyNDd9LAoreyAgLTczMTcsICAgIC02MTUsICAgMTMwOTQsICAgMTg5MjcsICAgIDk4OTcsICAgIDE0NTJ9LAoreyAgIDI1NTIsICAgLTIzMzgsICAgIDM0MjQsICAgLTQ2MzAsICAgMTExMjQsICAtMTk1ODR9LAoreyAtMTExMjUsICAtMjA1NTMsICAtMTA4NTUsICAtMTA3ODMsICAtMjA3NjcsICAgIDY4MzN9LAoreyAgICA5ODQsICAtMTUwOTUsICAgIDU3NzUsICAgMjUxMjUsICAgIDUzNzcsICAtMTk3OTl9LAoreyAgICA1MTcsICAgMTMyNzIsICAgLTc0NTgsICAgLTE3MTEsICAgMjA2MTIsICAgLTYwMTN9LAoreyAtMjE0MTcsICAgMTMyNTEsICAtMjA3OTUsICAgMTM0NDksICAgMTcyODEsICAgMTMxMDR9LAoreyAtMTU4MTEsICAtMTYyNDgsICAgMjMwOTMsICAgLTQwMzcsICAgLTgxOTUsICAgICA4NzF9LAoreyAgICA1ODIsICAgMTI1NzEsICAtMjExMjksICAtMTQ3NjYsICAgLTkxODcsICAgIDU2ODV9LAoreyAgIDQzMTgsICAgLTE3NzYsICAgMTE0MjUsICAtMTc3NjMsICAgLTk5MjEsICAgICA1Nzd9LAoreyAgIDYwMTMsICAgMTY4MzAsICAgMTc2NTUsICAtMjU3NjYsICAgLTQ0MDAsICAgLTM1NTB9LAoreyAtMTM3NDQsICAtMTY1NDEsICAgIDM2MzYsICAgLTMzMzAsICAtMjEwOTEsICAtMTU4ODZ9LAoreyAgIDY1NjUsICAtMTExNDcsICAgIDg2NDksICAtMTMxMTQsICAgMjMzNDUsICAtMTM1NjV9LAoreyAgLTI1NDIsICAgLTkwNDYsICAgLTc1NTgsICAgMjkyNDAsICAgIDM3MDEsICAgIC0zODN9LAoreyAtMTA2MTIsICAgMjQ5OTUsICAgIDE4OTMsICAgLTgyMTAsICAgMjA5MjAsICAtMTYyMTB9LAoreyAgIDUyNzYsICAgMTY3MjYsICAgMTA2NTksICAgMTk5NDAsICAgLTQ3OTksICAtMTkzMjR9LAoreyAgIC01MzIsICAgLTkzMDAsICAgMjc4NTYsICAgIDQ5NjUsICAgIC0yNDEsICAgICA1MzZ9LAoreyAgIC03NjUsICAtMjA3MDYsICAgLTM0MTIsICAgMTg4NzAsICAgIDI3NjUsICAgIDE0MjB9LAoreyAgLTMwNTksICAgIDI3MDgsICAtMTkwMjIsICAgIC0zMzEsICAgIDM1MzcsICAgICAxMTZ9LAorfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZxX2hlYmFwN1s1MTJdWzZdID0geworeyAtMjExNzMsICAgMjE4OTMsICAgMTAzOTAsICAgMTM2NDYsICAgMTA3MTgsICAgLTkxNzd9LAoreyAtMjI1MTksICAgLTgxOTMsICAgMTgzMjgsICAgLTY2MjksICAgMjU1MTgsICAtMTA4NDh9LAoreyAgIDY4MDAsICAtMTM3NTgsICAtMTMyNzgsICAgMjI0MTgsICAgMTQ2NjcsICAtMjA5Mzh9LAoreyAgIDIzNDcsICAgMTA1MTYsICAgIDExMjUsICAgLTM0NTUsICAgIDU1NjksICAgMjcxMzZ9LAoreyAgLTY2MTcsICAgMTE4NTEsICAtMjQ1MjQsICAgMjI5MzcsICAgMjAzNjIsICAgLTYwMTl9LAoreyAtMjE3NjgsICAgMTA2ODEsICAtMTk2MTUsICAtMTUwMjEsICAgLTg0NzgsICAgLTIwODF9LAoreyAgLTI3NDUsICAgIDg2ODQsICAgLTQ4OTUsICAgMjc3MzksICAgIDc1NTQsICAtMTE5NjF9LAoreyAgLTEwMjAsICAgIDI0NjAsICAgIC05NTQsICAgIDQ3NTQsICAgIC02MjcsICAtMTYzNjh9LAoreyAtMTk3MDIsICAgMjMwOTcsICAgICAgNzUsICAtMTM2ODQsICAgLTI2NDQsICAgIDIxMDh9LAoreyAgIDQwNDksICAgLTI4NzIsICAgIDU4NTEsICAgLTQ0NTksICAgMjIxNTAsICAgMTI1NjB9LAoreyAtMjEzMDQsICAtMTcxMjksICAgIC03MzAsICAgIDc0MTksICAtMTE2NTgsICAtMTA1MjN9LAoreyAgMTEzMzIsICAgIDE3OTIsICAgMjY2NjYsICAgMjM1MTgsICAtMTk1NjEsICAgIC00OTF9LAoreyAtMTc4MjcsICAtMTY3NzcsICAtMTM2MDYsICAtMTQzODksICAtMjIwMjksICAgLTI0NjR9LAoreyAgIDEwOTEsICAgLTU5NjcsICAgLTc5NzUsICAtMTY5NzcsICAtMjA0MzIsICAtMjE5MzF9LAoreyAgMTgzODgsICAgLTExMDMsICAgIDE5MzMsICAgMTMzNDIsICAtMTc0NjMsICAgMTgxMTR9LAoreyAgMjI2NDYsICAgMTczNDUsICAgLTk5NjYsICAgMTc5MTksICAgMTgyNzQsICAgICA2OTh9LAoreyAgIDE0ODQsICAgMjAyOTcsICAgLTU3NTQsICAtMjY1MTUsICAgIDQ5NDEsICAtMjIyNjN9LAoreyAgLTI2MDMsICAgIDQ1ODcsICAgLTU4NDIsICAgMTg0NjQsICAgIDg3NjcsICAgLTI1Njh9LAoreyAgLTI3OTcsICAgLTE2MDIsICAgMjE3MTMsICAgIDMwOTksICAtMjU2ODMsICAgIDMyMjR9LAoreyAtMTkwMjcsICAgIDQ2OTMsICAgLTUwMDcsICAgIDYwNjAsICAgIDE5NzIsICAtMTUwOTV9LAoreyAgLTIxODksICAgIDk1MTYsICAgIC01MzAsICAgMjA2NjksICAgLTQ2NjIsICAgLTgzMDF9LAoreyAtMjIzMjUsICAgLTg4ODcsICAgIDI1MjksICAtMTEzNTIsICAgIDU0NzYsICAgICA5OTh9LAoreyAgMjIxMDAsICAgLTUwNTIsICAgIDE2NTEsICAgLTI2NTcsICAgIDQ2MTUsICAgIDIzMTl9LAoreyAgMjA4NTUsICAgLTMwNzgsICAgLTMzMzAsICAgIDQxMDUsICAgMTM0NzAsICAgIDMwNjl9LAoreyAgICAgODUsICAgMTcyODksICAgMTAyNjQsICAtMTQ3NTIsICAgICAyMTQsICAgICAgOTB9LAoreyAtMjYzNjUsICAtMTg4NDksICAtMTkzNTIsICAgMTkyNDQsICAtMTAyMTgsICAgIDk5MDl9LAoreyAgLTk3MzksICAgMjA0OTcsICAgLTY1NzksICAgLTY5ODMsICAgIDI4OTEsICAgIC03Mzh9LAoreyAgMjA1NzUsICAtMTU4NjAsICAtMjI5MTMsICAgIDY4NzAsICAgICAgNzYsICAgICAzMjd9LAoreyAgIDg3NDQsICAtMTI4NzcsICAtMjI5NDUsICAgLTIzNzIsICAtMTk0MjQsICAgLTk3NzF9LAoreyAtMTI4ODYsICAgMTYxODMsICAgMjEwODQsICAgIDM4MjEsICAgICA3NDksICAtMTM3OTJ9LAoreyAtMTU5OTUsICAgMTgzOTksICAgIDIzOTEsICAtMTc2NjEsICAgMTk0ODQsICAgLTYwMTh9LAoreyAgIDE0MjMsICAgMTE3MzQsICAgIDQwNTEsICAgMTkyOTAsICAgIDY4NTcsICAtMTk2ODF9LAoreyAgLTUyMDAsICAgIDk3NjYsICAgMTgyNDYsICAgIDI0NjMsICAgMTg3NjQsICAgLTQ4NTJ9LAoreyAgIC01OTcsICAgMTk0OTgsICAgIDEzMjMsICAgLTkwOTYsICAgIC0zMDgsICAgLTExMDR9LAoreyAgLTMwOTksICAtMjU3MzEsICAtMTU2NjUsICAgMjUzMzIsICAgIDQ2MzQsICAgIDI2MzV9LAoreyAgMTk2MjMsICAgLTIzODQsICAgLTc5MTMsICAgMTE3OTYsICAgLTkzMzMsICAtMTQwODR9LAoreyAgIDI2NDIsICAgMjY0NTMsICAtMjEwOTEsICAtMTAzNTQsICAgLTE2OTMsICAgLTE3MTF9LAoreyAgMjIwMzEsICAgMjE2MjUsICAgMTE1ODAsICAtMjI5MTUsICAgLTQxNDEsICAgICAxMjl9LAoreyAgLTYxMjIsICAgIDM1NDIsICAgICA5MTUsICAgIC0yNjEsICAgICAtMTcsICAgIC0zODN9LAoreyAgIDE2OTYsICAgIDY3MDQsICAgLTE0MjUsICAgMjA4MzgsICAgICA4NTcsICAgLTQ0MTZ9LAoreyAgIDE0MjMsICAtMTUyODAsICAgLTg1NTAsICAgLTk2NjcsICAgIDUyMTAsICAgIDU2ODd9LAoreyAgLTQ1MjAsICAgIC02MTMsICAtMTE2ODMsICAgIDU2MTgsICAgIDQyMzAsICAgICA2MTl9LAoreyAgICA5MzcsICAgLTQ5NjMsICAtMTQxMDIsICAtMTcxMDQsICAgLTY5MDYsICAgLTU5NTJ9LAoreyAtMTUwNjgsICAgIC00ODEsICAgLTcyMzcsICAtMTQ4OTQsICAgMTg4NzYsICAgMjE2NzN9LAoreyAtMjU2NTgsICAgIDI5MTAsICAgIDExNDMsICAgIC0zMjcsICAgIC00NTgsICAgIC05OTV9LAoreyAgLTk2NTYsICAgIC04MTksICAtMjQ5MDAsICAgIDI4MDQsICAgMjAyMjUsICAgIDEwODN9LAoreyAgLTExMTEsICAgLTM2ODIsICAgLTE3ODgsICAtMTk0OTIsICAgICA5NjYsICAgICA4MjF9LAoreyAgIDcyOTMsICAtMjE3NTksICAgMTA3OTAsICAgLTcwNTksICAtMjMyOTMsICAgLTE3MjN9LAoreyAgIC0yODIsICAtMTEwOTMsICAgICAxNzAsICAtMjA5NTAsICAtMjg5MjYsICAgMTI2MTV9LAoreyAgMTc5MzgsICAgIDM3MTMsICAgLTE1NjMsICAgICA4ODUsICAgICAgIDUsICAgICA1NjR9LAoreyAgIDYxMTYsICAgMjI2OTYsICAgIDIyNDIsICAgLTY5NTEsICAgIDk5NzUsICAgLTYxMzJ9LAoreyAgIDQzMzgsICAgMjY4MDgsICAgLTM3MDUsICAgIDE5NzYsICAgLTEwNzksICAgLTI1NzB9LAoreyAgIC02NjEsICAgLTc5MDEsICAgLTI2NjgsICAtMTUxOTQsICAgMTc3MjIsICAgIDQzNzV9LAoreyAgLTQxNzQsICAtMTEwNTMsICAgICA3MTcsICAtMjI1MDYsICAgIDE1NjIsICAgMTIyNTJ9LAoreyAgLTY0MDUsICAgMTgzMzQsICAgIDYxMDMsICAgIDY5ODMsICAgIDU5NTYsICAgMTgxOTV9LAoreyAgIDk4NTEsICAgIDUzNzAsICAgMjM2MDQsICAgLTY4NjEsICAgLTY1NjksICAgICAtNjJ9LAoreyAgMjE5NjQsICAgMTMzNTksICAgIC02ODMsICAgIDM3ODUsICAgIDIxNjgsICAgICAyMDl9LAoreyAgLTM1NjksICAgLTExMjcsICAtMTk3MjQsICAgLTE1NDQsICAgIDEzMDgsICAgIC04MDN9LAoreyAgLTMwODMsICAgMTYwNDksICAtMTM3OTEsICAgLTMwNzcsICAgIDQyOTQsICAgMjM3MTN9LAoreyAgLTk5OTksICAgIDk5NDMsICAtMTU4NzIsICAgMTI5MzQsICAtMjM2MzEsICAgMjE2OTl9LAoreyAgIDk3MjIsICAgMjI4MzcsICAgMTIxOTIsICAgMTUwOTEsICAgIDU1MzMsICAgIDQ4Mzd9LAoreyAgIDIyNDMsICAgIDIwOTksICAgIDEyNDMsICAgIDQwODksICAgIDQ3NDgsICAgMTI5NTZ9LAoreyAgIDQwMDcsICAgLTI0NjgsICAgIDMzNTMsICAgLTMwOTIsICAgIDg4NDMsICAgMTcwMjR9LAoreyAgIDQzMzAsICAgIDYxMjcsICAgIDU1NDksICAgIDkyNDksICAgMTEyMjYsICAgMjg1OTJ9LAoreyAgLTk1ODYsICAgLTg4MjUsICAgICAyMzYsICAgIDEwMDksICAgICA0NTUsICAgIC05NjR9LAoreyAgIDY4MjksICAgMTkyOTAsICAgLTEwMTgsICAgICAyMDAsICAgIDE4MjEsICAgICA1Nzh9LAoreyAgIDUxOTYsICAgICA5NTcsICAgMTAzNzIsICAgIDMzMzAsICAtMTI4MDAsICAgIC0xMjd9LAoreyAgLTMwMjIsICAgLTgxOTMsICAtMTQ1NTcsICAgMjIwNjEsICAgIDU5MjAsICAgIDEwNTN9LAoreyAgMTA5ODIsICAgMjU5NDIsICAtMjQ1NDYsICAtMjMyNzgsICAtMTE5MDUsICAgLTY3ODl9LAoreyAgMjI2NjcsICAtMTEwMTAsICAgIDU3MzYsICAgIDI1NjcsICAgMjM3MDUsICAtMTAyNTN9LAoreyAgLTMzNDMsICAgLTQyMzMsICAgLTU0NTgsICAgMjA2NjcsICAtMTA4NDMsICAgLTM2MDV9LAoreyAgLTQxMzEsICAgLTM2MTIsICAgIDQ1NzUsICAgIC04MjksICAgIC0zNTAsICAgIC04NDd9LAoreyAgLTMzMDMsICAgIDM0NTEsICAgLTczOTgsICAtMTE2MDQsICAgIDMwMjMsICAgICA0NTV9LAoreyAgIDMyMDAsICAgLTk1NDcsICAgIDMyMDIsICAtMjI4OTMsICAgMTExODQsICAtMjY0NjZ9LAoreyAtMTQwOTMsICAgLTQxMTcsICAgMTUzODIsICAgMTQyOTUsICAtMTA5MTUsICAtMjAzNzd9LAoreyAgIDM4MDcsICAtMTEwMTYsICAgMjIwNTIsICAgMTQzNzAsICAtMTUzMjgsICAgLTc3MzN9LAoreyAgLTYyOTEsICAtMTc3MTksICAgLTE1NjAsICAgMTIwNDgsICAtMTk4MDUsICAgIC00NDN9LAoreyAgLTYxNDcsICAgLTQyMzQsICAgIC0xNjAsICAgIDgzNjMsICAgMjI2MzgsICAgMTE5MTF9LAoreyAgMTkxOTcsICAgIDExNzUsICAgIDc0MjIsICAgLTk4NzUsICAgLTQxMzYsICAgIDQ3MDR9LAoreyAgICAtNzIsICAgLTc2NTIsICAgIC0xMTIsICAtMTE5NTUsICAgLTMyMzAsICAgMjcxNzV9LAoreyAgIDMyNzQsICAgIDU5NjMsICAgIDc1MDEsICAtMTcwMTksICAgICA4NjYsICAtMjU0NTJ9LAoreyAgICA3MzcsICAgIDE4NjEsICAgIDE4MzMsICAgIDIwMjIsICAgIDIzODQsICAgIDQ3NTV9LAoreyAgLTUyMTcsICAgIDc1MTIsICAgIDMzMjMsICAgIDI3MTUsICAgIDMwNjUsICAgLTE2MDZ9LAoreyAgIDQyNDcsICAgICA1NjUsICAgIDU2MjksICAgIDI0OTcsICAgMTgwMTksICAgLTQ5MjB9LAoreyAgLTI4MzMsICAtMTc5MjAsICAgLTgwNjIsICAgMTU3MzgsICAgLTEwMTgsICAgIDIxMzZ9LAoreyAgIDMwNTAsICAtMTk0ODMsICAgMTY5MzAsICAgMjk4MzUsICAtMTAyMjIsICAgMTUxNTN9LAoreyAtMTEzNDYsICAgICAxMTgsICAtMjU3OTYsICAtMTM3NjEsICAgMTUzMjAsICAgIC00Njh9LAoreyAgLTQ4MjQsICAgIDQ5NjAsICAgLTQyNjMsICAgIDE1NzUsICAtMTA1OTMsICAgMTk1NjF9LAoreyAgLTgyMDMsICAgLTE0MDksICAgIC03NjMsICAgLTExMzksICAgIC02MDcsICAgIDE0MDh9LAoreyAgLTIyMDMsICAtMTE0MTUsICAgIDIwMjEsICAgLTYzODgsICAgLTI2MDAsICAgICA3MTF9LAoreyAgIC00MTMsICAgLTI1MTEsICAgIC0yMTYsICAgLTM1MTksICAtMjgyNjcsICAgIDE3MTl9LAoreyAtMTQ0NDYsICAgMTcwNTAsICAgMTM5MTcsICAgMTM0OTksICAtMjU3NjIsICAtMTYxMjF9LAoreyAgMTkyMjgsICAgIDczNDEsICAtMTIzMDEsICAgICA2ODIsICAgLTM3OTEsICAgIC0xOTl9LAoreyAgLTQxOTMsICAgMjA3NDYsICAtMTU2NTEsICAgMTEzNDksICAgIDU4NjAsICAgIC04MjR9LAoreyAtMjE0OTAsICAgLTM1NDYsICAgICAgLTMsICAgLTE3MDUsICAgLTM5NTksICAgIDkyMTN9LAoreyAgMTU0NDUsICAgLTE4NzYsICAgIDIwMTIsICAtMTk2MjcsICAgMTYyMjgsICAgLTQ4NDV9LAoreyAgLTI4NjcsICAgLTM3MzMsICAgLTczNTQsICAgIC0xNzUsICAtMjAxMTksICAgMTExNzR9LAoreyAgLTM1NzEsICAtMjQ1ODcsICAgMTk3MDAsICAgIDY2NTQsICAgICA5NzksICAgIC02NTR9LAoreyAgMjE4MjAsICAgLTc0MzAsICAgLTY2MzksICAtMTA3NjcsICAgLTgzNjIsICAgMTU1NDN9LAoreyAgMTQ4MjcsICAgMTc5NzcsICAgLTcyMDQsICAgLTM0MDksICAgIDE5MDYsICAtMTcyODh9LAoreyAgIDM1MjUsICAgLTM5NDcsICAgLTE0MTUsICAgLTI3OTgsICAgMTc2NDgsICAgIDIwODJ9LAoreyAgLTY1ODAsICAtMTUyNTUsICAtMTc5MTMsICAgIDEzMzcsICAgMTUzMzgsICAgMjExNTh9LAoreyAgIDYyMTAsICAgIDk2OTgsICAgMTUxNTUsICAtMjQ2NjYsICAtMjI1MDcsICAgLTM5OTl9LAoreyAgLTE3NDAsICAgIC01OTMsICAgIDEwOTUsICAgLTc3NzksICAgMjUwNTgsICAgIDU2MDF9LAoreyAgMjE0MTUsICAgIC00MzIsICAgLTE2NTgsICAgLTY4OTgsICAgLTE0MzgsICAtMTQ0NTR9LAoreyAgLTY5NDMsICAgICA3MDAsICAtMTIxMzksICAgIC03NDUsICAtMjQxODcsICAgMjI0NjZ9LAoreyAgIDYyODcsICAgIDMyODMsICAgMTEwMDYsICAgIDM4NDQsICAgMTkxODQsICAgMTQ3ODF9LAoreyAtMjI1MDIsICAgMTUyNzQsICAgIDU0NDMsICAgLTI4MDgsICAgIC05NzAsICAgLTMzNDN9LAoreyAgIDMyNTcsICAgLTM3MDgsICAgIDQ3NDQsICAgLTgzMDEsICAgMjI4MTQsICAtMTAyMDh9LAoreyAgMjQzNDYsICAtMjA5NzAsICAgMTk4NDYsICAgICA5ODcsICAtMTE5NTgsICAgLTYyNzd9LAoreyAgIDM5MDYsICAtMTk3MDEsICAgMTMwNjAsICAgLTE2MDksICAgMTg2NDEsICAgIDc0NjZ9LAoreyAtMjY0MDksICAtMjI1NDksICAgMTYzMDUsICAgIDIwMTQsICAgMTA5NzUsICAgMTgwMzJ9LAoreyAgLTcwMzksICAgIDQ2NTUsICAtMTQ4MTgsICAgMTg3MzksICAgMTU3ODksICAgIDEyOTZ9LAoreyAgIDkzMTAsICAgLTE2ODEsICAgMTQ2NjcsICAgLTMzMjYsICAgMjY1MzUsICAtMTE4NTN9LAoreyAgIDU3MjgsICAgIDU5MTcsICAgMTM0MDAsICAgMTAwMjAsICAgLTIyMzYsICAtMjQ3MDR9LAoreyAgIDE3NDEsICAgLTY3MjcsICAgMTI2OTUsICAtMjIwMDksICAgIDQwODAsICAgIDU0NTB9LAoreyAgLTI2MjEsICAgIDkzOTMsICAgMjExNDMsICAtMjU5MzgsICAgLTMxNjIsICAgLTI1Mjl9LAoreyAgMjA2NzIsICAgMTg4OTQsICAtMTM5MzksICAgIDY5OTAsICAgLTgyNjAsICAgMTU4MTF9LAoreyAtMjM4MTgsICAgMTExODMsICAtMTM2MzksICAgMTE4NjgsICAgMTYwNDUsICAgIDI2MzB9LAoreyAgMTgzNjEsICAtMTAyMjAsICAgICA4MjksICAgICA4NTYsICAgLTEwMTAsICAgICAxNTd9LAoreyAgMTQ0MDAsICAgLTQ2NzgsICAgIDUxNTMsICAtMTMyOTAsICAtMjc0MzQsICAtMTEwMjh9LAoreyAgMjE2MTMsICAgMTEyNTYsICAgMTc0NTMsICAgIDc2MDQsICAgMTMxMzAsICAgIC00ODR9LAoreyAgICAgIDcsICAgIDEyMzYsICAgICA1NzMsICAgIDQyMTQsICAgIDU1NzYsICAgLTMwODF9LAoreyAgICA5MTYsICAgLTkwOTIsICAgIDEyODUsICAgLTg5NTgsICAgIDExODUsICAtMjg2OTl9LAoreyAgMjE1ODcsICAgMjM2OTUsICAgMTkxMTYsICAgLTI4ODUsICAtMTQyODIsICAgLTg0Mzh9LAoreyAgMjM0MTQsICAgLTYxNjEsICAgMTI5NzgsICAgIDMwNjEsICAgLTkzNTEsICAgIDIyMzZ9LAoreyAgLTMwNzAsICAgLTczNDQsICAtMjAxNDAsICAgIDU3ODgsICAgICA1ODIsICAgIC01NTF9LAoreyAgLTM5OTMsICAgICAzMTUsICAgLTc3NzMsICAgIDgyMjQsICAtMjgwODIsICAtMTI0NjV9LAoreyAgMTM3NjYsICAtMTUzNTcsICAgMTkyMDUsICAtMjA2MjQsICAgMTMwNDMsICAtMTkyNDd9LAoreyAgIDM3NzcsICAgIC0xNzcsICAgIDgwMjksICAgLTEwMDEsICAgMTc4MTIsICAgIDUxNjJ9LAoreyAgLTczMDgsICAgLTQzMjcsICAtMTgwOTYsICAgIC02MjAsICAgLTEzNTAsICAgMTQ5MzJ9LAoreyAgMTQ3NTYsICAgLTEyMjEsICAtMTI4MTksICAtMTQ5MjIsICAgIC01NDcsICAgMjcxMjV9LAoreyAgIDIyMzQsICAgIDE3MDgsICAgIDI3NjQsICAgIDU0MTYsICAgIDc5ODYsICAtMjUxNjN9LAoreyAgIDI4NzMsICAgIDM2MzYsICAgIDM5OTIsICAgIDUzNDQsICAgMTAxNDIsICAgMjEyNTl9LAoreyAgIDExNTgsICAgIDUzNzksICAgICA1MDgsICAtMTA1MTQsICAgICAyOTAsICAgLTE2MTV9LAoreyAgIDExMTQsICAgMjQ3ODksICAgMTY1NzUsICAtMjUxNjgsICAgIC0yOTgsICAgLTI4MzJ9LAoreyAgLTExMDcsICAgLTYxNDQsICAgLTE5MTgsICAgLTc3OTEsICAgLTI5NzEsICAtMjMyNzZ9LAoreyAgIDQwMTYsICAgMTA3OTMsICAgMTczMTcsICAgLTQzNDIsICAtMjA5ODIsICAgLTMzODN9LAoreyAgLTQ0OTQsICAgIC0yMDcsICAgLTk5NTEsICAgLTM1NzUsICAgIDc5NDcsICAgIDExNTR9LAoreyAgLTc1NzYsICAgIDgxMTcsICAtMTQwNDcsICAgMTY5ODIsICAtMjY0NTcsICAtMjc1NDB9LAoreyAtMTUxNjQsICAgMTYwOTYsICAtMTY4NDQsICAgLTg4ODYsICAtMjM3MjAsICAgMTU5MDZ9LAoreyAgMjQ5MjIsICAgIDU2ODAsICAgLTE4NzQsICAgICA0MjAsICAgICAxMzIsICAgICAxMTd9LAoreyAgIC01MDYsICAtMTkzMTAsICAgIC0xOTgsICAgICA0MTIsICAgIC0zMTEsICAgICA3NTJ9LAoreyAgLTE5MDYsICAgIDM5ODEsICAgLTc2ODgsICAgMTY1NjYsICAtMTkyOTEsICAtMTQ3MjJ9LAoreyAgIC0zOTksICAgIC03MjksICAgLTM4MDcsICAgLTQxOTYsICAtMTIzOTUsICAgIDc2Mzl9LAoreyAgIDMzNjgsICAgIDIzMzAsICAgIDkwOTIsICAgMjM2ODYsICAtMTAyOTAsICAgLTE3MDV9LAoreyAgLTMxNDgsICAgIDI1OTYsICAgLTc5ODYsICAgMTQ2MDIsICAgLTQ4MDcsICAgMTY2Mjd9LAoreyAgIDgwNTcsICAgIDE0ODEsICAgICAgNDksICAgMTcyMDUsICAgMjQ4NjksICAgIDc0NzR9LAoreyAtMTkzMDQsICAgIC01MTMsICAgMTE5MDUsICAgIDIzNDYsICAgIDU1ODgsICAgIDMzNjV9LAoreyAgLTUwNjMsICAtMjE4MTIsICAgMTEzNzAsICAgMTA4OTYsICAgIDQ4ODEsICAgICAyNjF9LAoreyAgIDQ3OTQsICAgMjA1NzcsICAgIDUxMDksICAgLTYwMjUsICAgLTgwNDksICAgLTE1MjF9LAoreyAgIDgxMjUsICAtMTQ3NTYsICAgMjA2MzksICAtMTQ5MTgsICAgMjM5NDEsICAgLTM2NTB9LAoreyAgMTI0NTEsICAgIDEzODEsICAgIDM2MTMsICAgIDg2ODcsICAtMjQwMDIsICAgIDQ4NDh9LAoreyAgIDY3MjYsICAgMTA2NDMsICAgMTAwODYsICAgMjUyMTcsICAtMjUxNTksICAgLTEwNjV9LAoreyAgIDY1NjEsICAgMTM5NzcsICAgIDI5MTEsICAgMjE3MzcsICAgMTY0NjUsICAtMjYwNTB9LAoreyAgLTE3NzYsICAgIDI1NzUsICAtMTk2MDYsICAtMTY4MDAsICAgIDMwMzIsICAgIDY2Nzl9LAoreyAgMTUwMTIsICAtMTc5MTAsICAgLTg0MzgsICAtMjE1NTQsICAtMjcxMTEsICAgMTE4MDh9LAoreyAgIDM0NDgsICAgIC05MjQsICAtMTU5MTMsICAgLTExMzUsICAgIDUxMjYsICAtMjA2MTN9LAoreyAgIDc3MjAsICAgIDIyMjYsICAgMTc0NjMsICAgIDU0MzQsICAgMjg5NDIsICAgMTc1NTJ9LAoreyAgIDEyNDYsICAgMTU2MTQsICAtMTE3NDMsICAgMjQ2MTgsICAtMTc1MzksICAgIDMyNzJ9LAoreyAgIDMyMTUsICAgMTc5NTAsICAgIDI3ODMsICAgIC03MjIsICAtMjI2NzIsICAgIDU5Nzl9LAoreyAgLTU2NzgsICAgLTMxODQsICAtMjYwODcsICAgMjYwMzQsICAgIDY1ODMsICAgIDMzMDJ9LAoreyAgMjAzMTAsICAgLTM1NTUsICAgLTI3MTUsICAgIC00NDQsICAgLTE0ODcsICAgIDE1MjZ9LAoreyAtMjA2NDAsICAtMjE5NzAsICAtMTIyMDcsICAtMjU3OTMsICAgIDg4NjMsICAgLTEwMzZ9LAoreyAgMTc4ODgsICAgICA1NzAsICAtMTYxMDIsICAgIDgzMjksICAgLTI1NTMsICAgMTUyNzV9LAoreyAgLTI2NzcsICAgIDk5NTAsICAgLTE4NzksICAgMTY0NzcsICAtMTI3NjIsICAtMjkwMDd9LAoreyAgIC0xMjAsICAgLTIyMjEsICAgICAyMTksICAgICAgOTcsICAgICAzNjUsICAgICAgMzV9LAoreyAgIDEyNzAsICAgIC03MTgsICAgIDE0ODAsICAgLTI2ODksICAgIDE5MzAsICAgLTc1Mjd9LAoreyAgIDE4OTYsICAgIDg3NTAsICAgIDE5MDYsICAgMTgyMzUsICAtMTI2OTIsICAgLTYxNzR9LAoreyAgLTM3MzMsICAgMTM3MTMsICAgLTk4ODIsICAtMTU5NjAsICAgLTEzNzYsICAgLTcxNDZ9LAoreyAtMTA2MDAsICAgIDg0OTYsICAgMTU5NjcsICAgLTg3OTIsICAgIDc1MzIsICAgMjA0Mzl9LAoreyAgIDMwNDEsICAtMTM0NTcsICAgIDEwMzIsICAtMjY5NTIsICAgIDU3ODcsICAgMjQ5ODR9LAoreyAgLTQ1OTAsICAgLTgyMjAsICAgLTkzMjIsICAgLTYxMTIsICAtMTcyNDMsICAgMjU3NDV9LAoreyAtMTc4MDgsICAgIDY5NzAsICAgIDM3NTIsICAgICA2MjYsICAgIC0xMTQsICAgIDIxNzh9LAoreyAgIDQ0NDksICAgLTQ4NjIsICAgIDcwNTQsICAgLTU0MDQsICAgIDQ3MzgsICAgLTI4Mjd9LAoreyAgIDQ5MjIsICAgIC02NTEsICAgMTg5MzksICAgLTk4NjYsICAgICA4NDgsICAgIDE4ODZ9LAoreyAgIC0zMzYsICAgLTU0MTAsICAgIDcyMzQsICAgMjA0NDQsICAgLTk1ODMsICAgIC02MDB9LAoreyAgICA3ODEsICAtMTk0NzQsICAtMTI2NDgsICAgIDY2MzQsICAgIDE0MTQsICAgICA0NTB9LAoreyAgLTMzOTksICAtMTY3NzAsICAgMTExMDcsICAgMTMyMDAsICAgLTU0OTgsICAgMjE2NjN9LAoreyAgLTMyNjUsICAgIDQ4NTksICAgLTU5NjEsICAgIDc1MzAsICAtMTA4MzcsICAgMjgwODZ9LAoreyAgMTAzNTAsICAtMTI5MDEsICAgMjU2OTksICAgMjU2NDAsICAgIC02MzksICAgICAzNTF9LAoreyAgIDExNjMsICAgMTg3NjMsICAgLTU0NjYsICAtMTUwODcsICAgIC0xNDUsICAgLTEzNzd9LAoreyAtMTQ0NzcsICAgMjcyMjksICAtMzEzODMsICAtMzI2NTMsICAgMjE0MzksICAgLTI4OTR9LAoreyAgMTU0MjAsICAgMTg4MjMsICAgMjIxMjgsICAgMTkzOTgsICAgMjI1ODMsICAgMTM1ODd9LAoreyAtMTA2NzQsICAgMTA3MTAsICAgIDUwODksICAgLTQ3NTYsICAgICA5MDksICAtMjA3NjB9LAoreyAtMTI5NDgsICAtMjA2NjAsICAgIDc0MTAsICAgIDI3MjIsICAgIDM0MjcsICAgMTE1ODV9LAoreyAgLTExMDUsICAgMTgzNzQsICAgMTk3MzEsICAgLTk2NTAsICAgMjI0NDIsICAgMTk2MzR9LAoreyAgIC0yOTYsICAgLTY3OTgsICAtMTQ2NzcsICAgMjE2MDMsICAgMTk3OTYsICAgMjEzOTl9LAoreyAtMTkzNTAsICAgLTc1MDEsICAgMjU0NDYsICAgMTMxNDQsICAgIDg1ODgsICAtMjUyOTh9LAoreyAgIDMwOTIsICAtMTA2MTgsICAgMjA4OTYsICAgIDkyNDksICAgLTMzMjYsICAgIDE3OTZ9LAoreyAgIC04MTEsICAgIDE0NDksICAgIDMxMDYsICAgIDQ3NDgsICAgMTIwNzMsICAtMTQyNjJ9LAoreyAtMjA3MjAsICAgMTQyNzUsICAgLTQzMzIsICAtMjU4MzgsICAgLTU3ODEsICAtMjExNDl9LAoreyAgLTUxMzIsICAgMTA1NTQsICAtMTQwMjAsICAtMjIxNTAsICAgIDI4NDAsICAgIC01NTR9LAoreyAgMjU1MzMsICAgMTc2NDgsICAgMTQ4ODYsICAtMjEwNzQsICAgIDI0NTksICAgMjUxNDJ9LAoreyAgLTkzNzAsICAgLTE3ODgsICAtMTI4NjIsICAgLTU4NzAsICAtMjU4MTEsICAtMTEwMjN9LAoreyAgIDY2OTgsICAgICA4MTksICAgMTAzMTMsICAgICAxNjYsICAgMjc1ODEsICAgICA1MjN9LAoreyAgICAxMDEsICAtMTkzODgsICAgIDM0MTMsICAgIDk2MzgsICAgICAgNjQsICAgICA4MDZ9LAoreyAgLTI3NDIsICAtMTc5MzEsICAgLTI1NzYsICAgMjI4MTgsICAgIDg1NTMsICAgIDExMjZ9LAoreyAgIDI5NzIsICAgMTUyMDMsICAgIDE3OTIsICAgMjU0MzQsICAgLTU3MjgsICAtMTcyNjV9LAoreyAgLTE0MTksICAgIDE2MDQsICAgIDQzOTgsICAgMTE0NTIsICAgIDE3MzEsICAgMjM3ODd9LAoreyAgLTUxMzYsICAgIDQ2MjUsICAtMTA2NTMsICAgMjc5ODEsICAgIDk4OTcsICAgLTI1MTB9LAoreyAtMTA1MjgsICAtMjgwMzMsICAgIDI5OTksICAgLTE1MzAsICAgIC04MzIsICAgIC04MzB9LAoreyAtMTExMzMsICAtMTI1MTEsICAgMjIyMDYsICAgLTcyNDMsICAtMjM1NzgsICAtMjE2OTh9LAoreyAgMTY5MzUsICAtMjE4OTIsICAgIDE4NjEsICAgLTk2MDYsICAgIDk0MzIsICAgMTkwMjZ9LAoreyAgMTAyNzcsICAgIDk1MTYsICAgMjY4MTUsICAgIDIwMTAsICAgLTQ5NDMsICAgLTkwODB9LAoreyAgIDU1NDcsICAgLTIyMTAsICAgMTQyNzAsICAtMTUzMDAsICAtMTkzMTYsICAgIDE4MjJ9LAoreyAgLTQ4NTAsICAgIC03ODMsICAgLTg5NTksICAgLTMwNzYsICAtMjAwNTYsICAgLTMxOTd9LAoreyAgIDgyMzIsICAgLTI3OTQsICAtMTc3NTIsICAgMTMzMDgsICAgIDMyMjksICAgIC05OTF9LAoreyAtMTIyMzcsICAgLTY1ODEsICAgMTAzMTUsICAgLTk1NTIsICAgIDIyNjAsICAtMjA2NDh9LAoreyAgLTcwMDAsICAgIDU1MjksICAgLTc1NTMsICAgLTc0OTAsICAtMTAzNDIsICAtMTAyNjZ9LAoreyAgIDM2NDEsICAgMTk0NzksICAgLTU5NzIsICAtMTkwOTcsICAtMTg1NzAsICAgMTI4MDV9LAoreyAgIDEyODMsICAgLTQxNjQsICAgIDQxOTgsICAtMjg0NzMsICAgLTI0OTgsICAgIDE4NjZ9LAoreyAgMTYwNDcsICAgMjY4MjYsICAtMTMwNTMsICAgLTYzMTYsICAgICA5ODUsICAgLTE1OTd9LAoreyAgIC00MDMsICAgMTM2ODAsICAgIDY0NTcsICAgMjUwNzAsICAgMjcxMjQsICAtMjA3MTB9LAoreyAtMTgwNzAsICAgLTE3OTAsICAtMjQ5ODYsICAgIDU5NTMsICAgIC05NTQsICAgMjY2MDB9LAoreyAtMjQyMjQsICAtMTUzODMsICAgMjQ3ODgsICAgIDE5NTMsICAgLTExMzYsICAgICAxODd9LAoreyAgLTIyODksICAgMTI1MDUsICAtMjA3MzgsICAgIC05MDQsICAgMTgzMjQsICAgMjEyNTh9LAoreyAgIDI2NTgsICAgLTYxNDAsICAgMTYxNzksICAgMjIyNzYsICAgIC01NTYsICAgIDIxNTR9LAoreyAgLTYwODcsICAgMTM5NTAsICAtMjU2ODIsICAtMjc3MTMsICAgIDQwNDksICAgLTQ3OTV9LAoreyAtMjE0NTIsICAgMjY0NzMsICAgMTk0MzUsICAgLTkxMjQsICAgICA4OTUsICAgICAzMDN9LAoreyAtMjIyMDAsICAtMjYxNzcsICAgLTYwMjYsICAgMjQ3MjksICAtMjI5MjYsICAgLTkwMzB9LAoreyAtMTQyNzYsICAtMTU5ODIsICAgMjM3MzIsICAtMjI4NTEsICAgIDkyNjgsICAgLTM4NDF9LAoreyAgMjk0ODIsICAgMjE5MjMsICAgLTYyMTMsICAgIDE2NzksICAgLTIwNTksICAgLTExMjB9LAoreyAgIC00MzUsICAgIDk4MDIsICAgLTM4OTEsICAgMTIzNTksICAgLTQyODgsICAtMTg5NzF9LAoreyAgMTk3NjgsICAgICAtODYsICAgIDI0NjcsICAgIDE5OTAsICAgLTEwMjEsICAgLTUzNTR9LAoreyAgMjA5ODYsICAgLTg3ODMsICAgLTUzMjksICAtMjM1NjIsICAgLTQ3MzAsICAgIDI2NzN9LAoreyAgLTUwOTUsICAgIDU2MDUsICAgLTQ2MjksICAgMTkxNTAsICAgMjYwMzcsICAtMTIyNTl9LAoreyAgICA5NzIsICAgIDY4NTgsICAgIDQ1NTEsICAgMjc5NDksICAgLTQwMjUsICAgLTIyNzJ9LAoreyAgIDYwNzUsICAgLTMyNjAsICAgLTQ5ODksICAgIC0zNzMsICAgLTE1NzEsICAgLTM3MzB9LAoreyAgLTcyNTYsICAtMTI5OTIsICAgLTg4MjAsICAgLTUxMDksICAgMjMwNTQsICAgIDUwNTR9LAoreyAgICA5MjAsICAgIDI2MTUsICAgIDc5MTIsICAgLTczNTMsICAgLTQ5MDUsICAgMjAxODZ9LAoreyAgIC0yNTAsICAgIDU0NTQsICAgIDMxNDAsICAgIDY5MjgsICAtMTg3MjMsICAgLTIwNTF9LAoreyAtMTAyOTksICAgLTQzNzIsICAgMTk2MDgsICAgIDQ4NzksICAgIC02NjEsICAgLTE4ODV9LAoreyAgMTQ4MTYsICAgLTg2MDMsICAtMTk4MTUsICAgIDYxMzUsICAtMjEyMTAsICAgMTQxMDh9LAoreyAtMTE5NDUsICAgLTIyMjMsICAgIDUwMTgsICAgMTE4OTIsICAgMjI3NDEsICAgICA0MDZ9LAoreyAtMTMxODQsICAgLTI2MTMsICAtMTMyNTYsICAtMjI0MzMsICAtMTI0ODIsICAgLTgzODB9LAoreyAgMTcwNjYsICAgMjUyNjcsICAgLTIyNzMsICAgIDUwNTYsICAgIC0zNDIsICAgICAxNDV9LAoreyAgIDg0MDEsICAtMTc2ODMsICAgMTkxMTIsICAgMTA2MTUsICAtMTk0NTMsICAgMTcwODN9LAoreyAgMjA4MjEsICAgLTU3MDAsICAgMTIyOTgsICAtMjU1OTgsICAgMTAzOTEsICAgIDc2OTJ9LAoreyAgIDQ1NTAsICAgMTU3NzksICAgMTczMzgsICAtMTkzNzksICAgLTQ3NjgsICAgIDEyMDZ9LAoreyAgLTc3MjMsICAgMTA4MzYsICAtMjcxNjQsICAtMTE0MzksICAgIDY4MzUsICAgLTE3NzZ9LAoreyAgIDI1NDIsICAgIDMxOTksICAgIDQ0NDIsICAgMTc1MTMsICAgLTM3MTEsICAgIC05MTR9LAoreyAgMjA5NjAsICAtMTY3NzQsICAgLTU4MTQsICAgMTEwODcsICAgICAtNzAsICAgMjI5NjF9LAoreyAgIDMzMDUsICAgIDI5MTksICAgIDYyNTYsICAgLTQ4MDAsICAtMjA5NjYsICAgLTMyMzB9LAoreyAgIDU5MjQsICAtMTY1NDcsICAgIDIxODMsICAgIDI3MzMsICAgIDM0NDYsICAtMjMzMDZ9LAoreyAgLTYwNjEsICAgIC0xOTQsICAtMTM4NTIsICAtMTA5NzEsICAgMTk0ODgsICAgIDEwMjl9LAoreyAgIDQ0NjcsICAgLTU5NjQsICAtMTkwMDQsICAgIDE1MTksICAgIC0zNTksICAgICA4NTV9LAoreyAgLTE1ODEsICAgLTc2MDcsICAgMjIwNzAsICAtMTE1ODAsICAtMTAwMzIsICAgMTcxMDJ9LAoreyAtMTI0MTIsICAgIDI1NTMsICAgIDQzMjQsICAgMjI1MDAsICAgIDU3NTEsICAgMTIxNzB9LAoreyAtMjUxMjcsICAgMTc5OTYsICAgLTYzODQsICAgIDExODAsICAgIDExODIsICAgIDk2MjJ9LAoreyAgMjM0NjIsICAgLTg0NzEsICAgLTQzOTIsICAgLTI2NjksICAgIDc2MzgsICAtMTY4MzV9LAoreyAgLTU1MTEsICAgLTI4ODcsICAtMTA3NTcsICAtMjA4ODMsICAgIDcyNDYsICAgIDEwNTN9LAoreyAgIDI3MDMsICAtMjA2MDIsICAgLTc1NTQsICAgIDc1MTYsICAgLTc3NDAsICAgIDU4Njh9LAoreyAgMjA2NzAsICAgMjE5MDEsICAgICA0NTcsICAgMTQ5NjksICAtMTc2NTcsICAtMTE5MjF9LAoreyAgIDM2MDMsICAgLTE1OTUsICAgLTIxNzcsICAgIC0xNTcsICAgICAtNDMsICAgICA2MDV9LAoreyAgIDI1MTMsICAgIDg5NTQsICAgMTA1MjcsICAgMjI1NTksICAtMTYxMDAsICAtMTYwNDF9LAoreyAgIDYwMDIsICAgIDQ5NTEsICAgIDY3OTUsICAgLTQ4NjIsICAtMjI0MDAsICAgMTg4NDl9LAoreyAgIDc1OTAsICAgLTE2OTMsICAtMjQ2ODgsICAgLTM0MDQsICAgMTQxNjksICAgIDEyMTR9LAoreyAgLTQzOTgsICAgLTY2NjMsICAgLTY4NzAsICAtMTAwODMsICAtMjQ1OTYsICAgIDkyNTN9LAoreyAgMTA0NjgsICAgMTc3NTEsICAgLTc3NDgsICAgICAxNDcsICAgLTYzMTQsICAgIDQ0MTl9LAoreyAgMTYxODcsICAtMTY1NTcsICAgLTQxMTksICAgIDQzMDIsICAgIDc2MjUsICAgIDU0MDl9LAoreyAgIDMzMDMsICAgIDI3MzUsICAgIDc0NTgsICAtMTk5MDIsICAgLTIyNTQsICAgLTM3MDJ9LAoreyAgLTIwNzcsICAgMjE2MDksICAgMTQ4NzAsICAgMTI1NDUsICAgLTYwODEsICAgLTE3NjR9LAoreyAgIDQ2NzgsICAgMTE3NDAsICAgIDI4NTksICAgIDY5NTMsICAgIDE5MTksICAgLTM4NzF9LAoreyAgIDM1MjIsICAtMjE4NTMsICAgLTI0NjksICAtMTA0NTMsICAgMTg4OTMsICAtMTA3NDJ9LAoreyAgIDM3NTksICAtMTAxOTEsICAgLTQ4NjYsICAgLTI2NTksICAtMTc4MzEsICAgLTEyNDJ9LAoreyAgMTQ5OTEsICAgIDkzNTEsICAgMTE4NzAsICAgLTE1NzMsICAgLTQ4NDgsICAgMjI1NDl9LAoreyAgIDk1MDksICAtMjcxNTIsICAgMTA3MzQsICAgMjA4NTEsICAtMjYxODUsICAtMTc4Nzh9LAoreyAgLTcxNzAsICAgLTEzOTIsICAtMTk0OTUsICAgMTI3NDYsICAgIDgxOTgsICAgLTE5ODh9LAoreyAgIDE4ODMsICAgMjgxNTgsICAgIC04NDYsICAgLTcyMzUsICAgICAyNDksICAgICAyMzN9LAoreyAgLTcyMDAsICAgICA2NjksICAgIC0zNzEsICAgLTI5NDgsICAgMjMyMzQsICAgLTU2MzV9LAoreyAgIDMxNDEsICAgICAyODgsICAgIDMyMjMsICAgLTEyNTgsICAgICAtOTgsICAtMjc2MDd9LAoreyAgMTczNzMsICAtMjMyMzUsICAgIDUxMTAsICAtMTExOTksICAgLTI1NzQsICAtMTE0ODd9LAoreyAgLTQ5MjgsICAgIDE1MTgsICAgLTU0NTYsICAgICA2NzAsICAtMTgyNzgsICAgIDE5NTF9LAoreyAgMTAzMzQsICAtMTk4NjUsICAgLTQ2NDksICAgICAzNjEsICAgIC0xNjAsICAgIC05MjN9LAoreyAgMTg3MzIsICAgMTQyNjQsICAgLTMxNTUsICAgLTc0ODUsICAgLTMzMjgsICAgIDU5NTl9LAoreyAgLTM2MTQsICAgMjEwNzcsICAgIDcyNzYsICAgIDM1MzYsICAgIDgxMjEsICAgLTE1Mjh9LAoreyAgLTg0MjIsICAgICA1MDAsICAtMTkxODIsICAgMTg5MjksICAgMjYzOTIsICAgLTEwMzl9LAoreyAgMTU2MzksICAgMjU2NjgsICAgIDgzNzUsICAgIDE5MDMsICAgIDE5NDUsICAtMTE5Nzl9LAoreyAgLTI3MTYsICAgIDMzODksICAgMjY4NTAsICAgLTQ1ODcsICAgIDE4MDMsICAgICAgMjJ9LAoreyAgIDExNzcsICAgIC02NTUsICAgIDEyMzMsICAgLTIxMjgsICAgIDc4NDQsICAgIDE3Njd9LAoreyAgIC03NjEsICAgIDgyMDksICAtMTkyOTAsICAgLTQ1OTMsICAgIDE5MjMsICAgIC0zNDN9LAoreyAgIC02ODksICAgLTM1MzAsICAgLTMyNjcsICAgLTM4MDQsICAgLTI3NTMsICAgMTg1NjZ9LAoreyAgLTIxMTAsICAgIDE5NjIsICAgLTEzNTMsICAgMTY2NDMsICAgIDI3NjUsICAtMjMxMDJ9LAoreyAgIC00MzMsICAgIDQ5MDUsICAgICAzMDIsICAgMTMwMTYsICAgMTU5MzMsICAgLTU5MDV9LAoreyAgIDMyMDMsICAgIDQxMjYsICAgMTExODEsICAgLTU0OTYsICAgLTI1MjksICAgLTExNjB9LAoreyAgLTEwOTEsICAgLTY0NjksICAgLTE0MTUsICAgIDU2ODIsICAgIC0yNjgsICAgICA1ODN9LAoreyAgLTk0MDUsICAtMTk1NzIsICAgIDYyMTYsICAgIDE2NTgsICAgICA5OTMsICAgICAtNzV9LAoreyAgLTE2OTUsICAgLTQ1MDQsICAgLTIyODksICAgLTQwODgsICAgLTY1NTYsICAtMTY1Nzd9LAoreyAgIDQ3NjAsICAgIC04OTIsICAtMTA5MDIsICAgIDY1MTYsICAgMjQxOTksICAgLTYwMTF9LAoreyAgIC0yNTMsICAgIDEwMDAsICAgICAgNjMsICAgICAtODEsICAgIC0xMTUsICAgIC0zODJ9LAoreyAgLTEzMzMsICAgMjQyMjQsICAgIC02OTgsICAgLTQ2NjcsICAgLTI4MDEsICAtMTkxNDR9LAoreyAgIC04NzYsICAtMjg4NjYsICAtMjE4NzMsICAgMTI2NzcsICAgLTYzNDQsICAgIDMyMzV9LAoreyAgMTY4NDcsICAgMjExNDUsICAtMjYxNzIsICAgLTMxODMsICAgIC0zOTYsICAgICAyMzB9LAoreyAgMTgyOTYsICAgLTc3OTAsICAtMTI4NTcsICAgIC02NzksICAgLTE0NzMsICAgICAgIDV9LAoreyAtMTA0ODgsICAgMTE0MjksICAgMjU4MDUsICAgLTExMjIsICAgIDE0MDEsICAgIC00Mzh9LAoreyAgIDM3ODIsICAgLTc0MjksICAgMjY3MjAsICAgMTc1NjcsICAgMTkyNTcsICAgMTI1NDJ9LAoreyAgIDYzMzIsICAgIC03NDYsICAgMTI3ODksICAgIDkzMTYsICAtMjI1NDIsICAgLTUzNTR9LAoreyAgIDM0MTgsICAtMjI3MjgsICAgMjY5NzgsICAgMTgzMDMsICAgIDEwNzYsICAgICA5NTZ9LAoreyAtMjczMTUsICAgLTI5ODgsICAgICA5MjAsICAgICAyMzUsICAgIDIyMzMsICAgICAgODF9LAoreyAgIDYxOTksICAgIDUyOTYsICAgMTYwOTMsICAgMTQ3NjgsICAgLTg0MjksICAgLTExMTJ9LAoreyAgLTY0MzIsICAgMTkyNDQsICAgIDk5MjEsICAgLTMyNTMsICAgIDEyNzgsICAgIC05NTR9LAoreyAgMjQyMTMsICAgIDIwNDksICAtMjI5MzEsICAgIDI1ODUsICAgLTI0MTAsICAgLTQyMTZ9LAoreyAgIDkyODYsICAgMTQyODIsICAtMTk3MzUsICAgLTM5ODUsICAgLTIzNDQsICAgIDEwMjh9LAoreyAtMjAxMjgsICAgMTc5OTMsICAgLTk0NTgsICAgMjMwMTIsICAtMTY5ODMsICAgIDg2MjV9LAoreyAgLTY4OTYsICAtMjA3MzAsICAgIDM3NjIsICAgMTc0MTUsICAgMjIzNDEsICAgMTkwMjR9LAoreyAgICA4NDIsICAgMjQxODEsICAgMjUwNjIsICAgLTU4MzksICAgICAtNzgsICAgICA5Mzd9LAoreyAgIC02MjEsICAgMTk3MjIsICAtMjQyMDQsICAgLTE5NjIsICAtMTQ4NTQsICAgICAtNTZ9LAoreyAgMjI3NjYsICAgLTUxMTksICAgMTczNjUsICAgMjM4NjgsICAtMTk0ODAsICAgLTY1NTh9LAoreyAgLTIxNTgsICAgMTc0OTAsICAtMjE0MzUsICAgIDMzNDAsICAtMTI4MTksICAtMjAyOTV9LAoreyAgLTk2MjEsICAgMTczMjUsICAgICA3MTUsICAgIDIyNjUsICAgLTQxMjMsICAgIC00OTJ9LAoreyAgIDkxNTYsICAgMTI5NDcsICAgMjczMDMsICAtMjExNzUsICAgLTYwNzIsICAgLTk0NTd9LAoreyAtMTMxNjQsICAtMjMyNjksICAtMTQwMDYsICAgLTQxODQsICAgIDY5NzgsICAgICAgIDJ9LAoreyAgICA5MzgsICAtMTMzODEsICAgIDM1MjAsICAtMjQyOTcsICAgMjI5MDIsICAgMTk1ODl9LAoreyAgLTQ5MTEsICAtMTk3NzQsICAgMTk3NjQsICAgLTkzMTAsICAtMTI2NTAsICAgIDM4MTl9LAoreyAgLTU0NjIsICAgLTQyNDksICAgLTY5ODcsICAgLTYyNjAsICAtMTM5NDMsICAtMjUxNTB9LAoreyAgIDkzNDEsICAgMTAzNjksICAtMTM4NjIsICAgLTY3MDQsICAgMjI1NTYsICAgIC01MTl9LAoreyAgIDY2NTEsICAgMTg3NjgsICAgLTQ4NTUsICAgMTI1NzAsICAgMTQ3MzAsICAtMTAyMDl9LAoreyAgIC04MjMsICAgMTgxMTksICAgICAzOTgsICAgLTE1ODIsICAgIC0xMTYsICAgIC0zNjN9LAoreyAgLTY5MzUsICAtMTI2OTQsICAtMjgzOTIsICAgIDg1NTIsICAgIDY5NjEsICAgIC0yMzl9LAoreyAgLTI2MDIsICAgLTQ3MDQsICAgLTEwMjEsICAgIDIwMTUsICAgIDUxMjksICAgMjM2NzB9LAoreyAtMTI1NTksICAgLTgxOTAsICAtMjUwMjgsICAgMTg1NDQsICAgMTQxNzksICAgIDE2NjN9LAoreyAgIDM4MTMsICAgMjEwMzYsICAgLTk2MjAsICAgLTUwNTEsICAgLTE4MDAsICAgLTEwODd9LAoreyAtMjIwNTcsICAgMTY2NzUsICAgMTQ5NjAsICAgIDk0NTksICAgIDI3ODYsICAgMTY5OTF9LAoreyAtMjYwNDAsICAtMTkzMTgsICAgLTY0MTQsICAgIDExMDQsICAgIDU3OTgsICAtMTgwMzl9LAoreyAgLTE3MzcsICAgMjQ4MjUsICAgMTA0MTcsICAtMTEwODcsICAgICA4OTYsICAgLTUyNzN9LAoreyAgLTE4NTUsICAgMTE2NjEsICAgLTI4MDMsICAgMjQ4MDksICAtMjE0MzUsICAtMTk3OTJ9LAoreyAtMjM0NzMsICAtMTY3MjksICAgLTU3ODIsICAgIDU2NDMsICAgIDI2MzYsICAgIDQ5NDB9LAoreyAgLTE3MjQsICAgIDQzODgsICAtMjY2NzMsICAtMTM2OTUsICAgMTA1NzAsICAtMjU4OTV9LAoreyAgMTUzNTgsICAtMTk0OTYsICAgMjYyNDIsICAtMTg0OTMsICAgIDE3MzYsICAgIDgwNTR9LAoreyAgIDU2ODQsICAgMjA4OTAsICAgIDQwOTEsICAtMTkxMDAsICAtMTQ1ODgsICAtMTA0Njh9LAoreyAgMTcyNjAsICAtMTYyOTEsICAgMTQ4NTksICAtMTc3MTEsICAtMTkxNzQsICAgMTI0MzV9LAoreyAtMjcxODUsICAtMTI1NzMsICAgIDY3NDMsICAgIC01NjIsICAgICA5NzYsICAgIC0yNTd9LAoreyAgMTIzOTUsICAgLTg2MTgsICAtMjIyNDgsICAtMTk4NDMsICAgMTEwMTMsICAgIDc3NjJ9LAoreyAgIDM3OTksICAgMTE4NTMsICAtMjc2MjIsICAgLTg0NzMsICAgIDEwODksICAgLTE0OTV9LAoreyAgIDQxNDEsICAgLTIxODIsICAtMjY3MjAsICAgIC03MzUsICAgIC03NzQsICAgIDE0Njl9LAoreyAgIDMxMjUsICAgMTM3NjIsICAgIDQ2MDYsICAgMjkyNTcsICAgMTg3NzEsICAgLTk5NTh9LAoreyAtMTc0NjUsICAgLTk0NDUsICAtMTc1NjIsICAgLTI1MzAsICAgLTY0MzUsICAgLTM3MjZ9LAoreyAgLTE3NDIsICAgIDQzNTEsICAgLTY4NDEsICAtMTk3NzMsICAgIDk2MjcsICAtMTA2NTR9LAoreyAgIDcyNTEsICAgIDM1MjUsICAgMTA4MzUsICAgIDU2MDEsICAgMjUxOTgsICAtMjMzNDh9LAoreyAtMTAzMDAsICAtMTc4MzAsICAgICA2MzEsICAgMTE2NDAsICAgIDIwNDQsICAtMjA4Nzh9LAoreyAgIC04NzMsICAgLTg1MDIsICAgLTEwNjMsICAtMTU2NzQsICAtMTA2OTMsICAgMTQ5MzR9LAoreyAtMTU5NTcsICAgMjgxMzcsICAgIDUyNjgsICAgICA0NzcsICAgLTEwNTMsICAgIDExNTh9LAoreyAgLTE0OTUsICAgLTg4MTQsICAgLTU3NjQsICAtMjQ5NjUsICAgMjU5ODgsICAgIDc5MDd9LAoreyAgLTEwMzgsICAgIC0xMTQsICAgLTIzMDgsICAgLTEzMTksICAgLTY0ODAsICAgIDE0NzJ9LAoreyAgIDQ4OTUsICAtMTc4OTcsICAtMjU4NTAsICAgIDUzMDEsICAgIC0xODgsICAgIDE1ODF9LAoreyAgIDMyMDAsICAgMTcyMjUsICAgIDQzNDYsICAgMjIxMDEsICAtMTg1NDMsICAgMjIwMjh9LAoreyAtMTAyNTAsICAgICA1NDUsICAtMTA5MzIsICAgIDIyNzYsICAtMjgwNzAsICAgIDgxMTh9LAoreyAgMTUzNDMsICAgIDIzMjksICAgIDkzMTYsICAgMjA1MzcsICAgMTQ5MDgsICAgMjEwMjF9LAoreyAgIDYzMjksICAgIDYxMzAsICAtMjQ1MDgsICAgICA4MzcsICAgLTg2MzcsICAgLTU4NDR9LAoreyAgIDczODYsICAgIC01MDEsICAgMTA1MDMsICAgMjAxMzEsICAgMTE0MzUsICAgLTQ3NTV9LAoreyAgLTI3NDUsICAgMjQxNzQsICAgLTkyNzQsICAgMTUyNzMsICAgLTgzODksICAgLTU4MzV9LAoreyAgIDI5OTIsICAgLTI4NjQsICAgIDYwNDgsICAgLTc0NzMsICAgMTE2ODcsICAtMTk5OTZ9LAoreyAgIC04ODMsICAtMTE5NTQsICAgLTk5NzYsICAtMjE4MjksICAgLTQ0MzYsICAtMjcxNzh9LAoreyAgIDM0NTgsICAgMTk2MjYsICAgIDEyODAsICAgIDI1OTcsICAgMTk4NDksICAgIDUyNTV9LAoreyAgLTUzMTUsICAgMTkxMzMsICAtMTQ1MTgsICAgLTg5NDYsICAgMTM3NDksICAgLTEzNTJ9LAoreyAgMTg2NDIsICAgMTc2NTUsICAgMTEwMDEsICAgIDY4MTcsICAtMTg0MTgsICAgIDYzMzZ9LAoreyAgLTE2OTcsICAgIDIyNDQsICAgLTQ2NDAsICAgIDM5NDgsICAtMTI4OTAsICAgLTUyNzN9LAoreyAgMjA0MjgsICAgMTA1NDIsICAgIDQxNzAsICAgLTEwMTIsICAgMTk0MzksICAgMjE2OTF9LAoreyAgLTI5NDMsICAtMTk3MzUsICAgLTQyMDgsICAgIDEzMjAsICAgICA5MDksICAgLTg4OTd9LAoreyAgIDkzNTEsICAgLTgwNjYsICAgLTI2MTgsICAtMTI5MzMsICAgMjY1ODIsICAgIDM1MDd9LAoreyAgIDk3MDUsICAtMjI2MjgsICAgIDgzMTEsICAgIDgxNjcsICAtMTMyOTMsICAgIDU2MDh9LAoreyAgIDMyMjIsICAgIDM3NDksICAgLTE1MDgsICAgICAxNjUsICAgICAtNTIsICAgIC0xOTZ9LAoreyAgICAxMDIsICAtMjI3NDQsICAgLTg4MzIsICAgICA5MDMsICAtMTE0MjEsICAtMTQ2NjJ9LAoreyAgIC0xMjAsICAgIDU5OTgsICAgMTk3NjUsICAgMTM0MDEsICAgIDM2MjgsICAgIDUxOTd9LAoreyAgIDg1MjgsICAgIDU4MjcsICAgLTEwNjYsICAgICA3NzQsICAgICAtMzksICAgIC0xNjZ9LAoreyAgIDk0MTEsICAgLTk0NzYsICAgIDk1ODEsICAtMTMwMDQsICAgMjQ0NTYsICAgMjQ5MDB9LAoreyAgMTc4NzgsICAgIDIyMzUsICAtMjE2MzksICAgMjA0NzgsICAgIDQ3MTYsICAgLTcxOTB9LAoreyAgLTI0ODIsICAgIDk1MTEsICAgIDE2MTEsICAtMjE5NDMsICAgMTQyMzAsICAgLTEyODl9LAoreyAgIDkyODgsICAgLTIyOTEsICAgMjMyMTUsICAgLTM0NTIsICAtMTA4NDIsICAgICAgMTF9LAoreyAgIDk0OTYsICAgIDMwNDEsICAgIDUxMzAsICAgLTM4OTAsICAtMjEyMTksICAtMjI1ODl9LAoreyAgMTQyNjIsICAgLTk4MzgsICAgMjAxOTUsICAgMTQwMTksICAgICAgOTEsICAtMTcyMDB9LAoreyAtMTg1OTEsICAgICA5ODAsICAgICAgMTcsICAgICA4MjEsICAgICAxMjAsICAgIC01NzR9LAoreyAgMTIyODUsICAtMTkyNjksICAgMTM3NDIsICAgMTYzNzMsICAgIC0xNjEsICAgIDYwMjV9LAoreyAgLTMzNjQsICAgIDE1MzAsICAgLTQwMDUsICAgIDI0NTQsICAtMTA4NzIsICAtMjM4Mzl9LAoreyAgICAxMDUsICAgIDUwODUsICAgIC0yNjAsICAgIDU3OTAsICAgIC01ODgsICAgMTkxNzB9LAoreyAgIDQxMjEsICAgIDQxNjksICAgMTM0MzksICAgMTQ2NDQsICAgMjA4OTksICAgIDc0MzR9LAoreyAgIC0xNzUsICAgMTMxMDEsICAgLTM3MDQsICAgMjMyMzMsICAgIDM5MDcsICAgMTAxMDZ9LAoreyAgLTYxMDEsICAgMjM0NjcsICAgIDUyMDQsICAgLTEzNDEsICAgIDE1OTksICAgMTMxNzR9LAoreyAgLTMyMTcsICAgLTM0OTQsICAgMTUxMTcsICAgLTgzODcsICAtMTE3NjIsICAgLTQ3NTB9LAoreyAgIDExNDYsICAgIDQ2NzUsICAtMTkzNzgsICAgMTQ5MTcsICAgLTUwOTEsICAgICAyNDl9LAoreyAtMjE1MDYsICAgMTAxMzYsICAtMTY0NzMsICAtMTMzMDUsICAgMTgzODIsICAgLTg2MDF9LAoreyAgICA2MjgsICAgIDI0NDcsICAgIDMzNDQsICAgIDMxMzAsICAgLTUxMTUsICAgICAxMTl9LAoreyAgMTc5MDAsICAtMjI0MjIsICAtMTc2MzMsICAgMjE5NjcsICAtMTYyOTMsICAgLTc2NzZ9LAoreyAgMTY4NjMsICAgMjQyMTQsICAgIDU2MTIsICAgLTM4NTgsICAgIC04MDksICAgIDM4MjJ9LAoreyAgLTIyOTEsICAgMTAwOTEsICAgLTIzNjAsICAtMjUxMDksICAgLTEyMjYsICAgICAzMTJ9LAoreyAgIDI5NTcsICAgMTEyNTYsICAgMjY3NDUsICAtMTMyNjYsICAgLTM0NTUsICAgLTExMjh9LAoreyAtMTk3NjIsICAgLTI3MDgsICAgIDQ2MDQsICAgIDYzNTUsICAgIDE2MzgsICAgMjU1MDF9LAoreyAtMTk1OTMsICAgLTc3NTMsICAgIDMxNTksICAgICAtODUsICAgIC00ODksICAgLTE4NTV9LAoreyAgICA4MTQsICAgMTI1MTAsICAgMTkwNzcsICAgLTQ2ODEsICAgLTI2MTAsICAgLTE0NzR9LAoreyAtMjM0MDgsICAtMTkwMjcsICAgIDgxMzcsICAgMTk4NzgsICAgIDc5MTIsICAgIC0yODJ9LAoreyAgICA4MzksICAtMTk2NTIsICAgMTE5MjcsICAgMjcyNzgsICAgLTMyMTEsICAgIDIyNjZ9LAoreyAgIDQwMjAsICAgLTExMTAsICAgIDgyMjYsICAgLTEyNzQsICAgMjA5MjIsICAgMjUwNjB9LAoreyAgMjY1NzYsICAgICAzMjUsICAgLTg2OTMsICAgIC0yMzIsICAgLTIyMTgsICAgIC02OTl9LAoreyAtMTEyOTMsICAgLTQyMDAsICAgIDE4MDUsICAgLTY2NzMsICAtMjI5NDAsICAgLTEzMzl9LAoreyAgLTIwMDUsICAtMTU4ODYsICAgLTEwNDcsICAtMjc2ODcsICAtMTMyMzUsICAgMTQzNzB9LAoreyAtMjIwNzMsICAgIDE5NDksICAgMTMxNzUsICAtMTU2NTYsICAgLTE4NDYsICAgIDgwNTV9LAoreyAgIDMwMzksICAgMTIwMjUsICAgIDcxMzIsICAtMjQ2MzIsICAgICA0MTMsICAgLTIzNDd9LAoreyAtMjQwNDgsICAgIC0yMDYsICAgMTI0NTksICAgLTY2NTQsICAgIC00MTcsICAtMTAwOTF9LAoreyAgMTgxNzksICAtMjM2ODgsICAtMjA1MTUsICAtMTYzOTYsICAgIDcyMzAsICAgICA3NjN9LAoreyAgIDU2NTksICAgLTUwODUsICAgMTM4NzgsICAtMjM3MjksICAtMTEwNzcsICAtMTk1ODd9LAoreyAgMTEzNDAsICAgICA1MDEsICAgMjUwNDAsICAgIDc2MTYsICAtMTk2NTgsICAgIDE2MDV9LAoreyAtMjY2NTAsICAgIDg4NzgsICAgMTA1NDQsICAgICA0MTcsICAgIDEyOTksICAgICAyNjF9LAoreyAgMTQ0NjAsICAgMTEzNjksICAgLTMyNjMsICAgIDk5OTAsICAgIDgxOTQsICAgMTgxMTF9LAoreyAgIDEzNTUsICAtMjA4MzgsICAgLTkxOTYsICAtMTYwNjAsICAgLTg1NTksICAgIC03MzB9LAoreyAgLTE5MTgsICAtMjA5MzcsICAtMTgyOTMsICAgLTI0NjEsICAgLTI2NTEsICAgIDQzMTZ9LAoreyAgLTI4MTAsICAgMjQ1MjEsICAtMTA5OTYsICAtMjU3MjEsICAgICAzMDgsICAgLTEyMzR9LAoreyAgLTkwNzUsICAtMTcyODAsICAgLTE4MzMsICAtMjkzNDIsICAtMjQyMTMsICAtMTY2MzF9LAoreyAgLTI4NDMsICAgMTAxNjUsICAgLTUzMzksICAgLTI4ODgsICAgMjE4NTgsICAtMjEzNDB9LAoreyAtMTU4MzIsICAgMTQ4NDksICAtMjM3ODAsICAgIDUxODQsICAgMTAxMTMsICAtMjA2Mzl9LAoreyAtMTk1MzUsICAtMTEzNjEsICAgIDg0MTMsICAgIDE0ODYsICAtMjM2NTgsICAgLTU3NTl9LAoreyAgLTc1MTIsICAgIDEwMjcsICAtMjA3OTQsICAgMTM3MzIsICAgMTk4OTIsICAtMjE5MzR9LAoreyAtMTIxMzIsICAgLTcwMjIsICAtMTkxNzUsICAgLTg4NDAsICAgMjIxMjUsICAtMTY0OTB9LAoreyAgIDE5MzcsICAgIDUyMTAsICAgLTYzMTgsICAtMjM3ODgsICAgMTMxNDEsICAgMTEwODJ9LAoreyAgIC0yMDUsICAgIDYwMzYsICAgIC0zODAsICAgIDg2NTgsICAgIC0yMzMsICAgMjgwMjB9LAoreyAgLTU1MjMsICAgIDc0NzcsICAgIDc2MzUsICAgMjM1OTUsICAgIDk3NjMsICAgLTI1OTB9LAoreyAgMjE2NTgsICAtMjgzMTMsICAgLTMwODYsICAgIC0zMDAsICAgLTEwMzIsICAgIDE3NDR9LAoreyAtMjIzNTIsICAgMTY2NDYsICAgICAyMDgsICAgIDY2NjUsICAtMTc0MDAsICAgLTMwMjh9LAoreyAgMTg0ODIsICAgIDkzMzYsICAgLTI3MzcsICAtMTkzNzIsICAgICA0MDcsICAgLTQzODl9LAoreyAgLTQ5MTMsICAtMTczNzAsICAgMTg4MTksICAtMTc2NTQsICAgMTM0MTYsICAgMTUyMzJ9LAoreyAgIDc3NDksICAgIDYzNjgsICAgMjMxMzUsICAtMTgxNzQsICAgIDc1ODQsICAgLTQyNDh9LAoreyAgLTE0ODksICAgLTY1MjMsICAgICA1ODYsICAtMTAxNTcsICAgMTQ5NjQsICAgMjU1Njh9LAoreyAgIDM4NDQsICAgLTYxNTYsICAgIDQ4OTcsICAtMTMwNDUsICAtMjI1MjYsICAgIDU2NDd9LAoreyAgLTg0OTEsICAgLTIxMDUsICAtMjQ3NzQsICAgICA5MDUsICAgLTkzMjYsICAgIDE0NTZ9LAoreyAgLTMwNDAsICAgLTE0NzYsICAgIDExNjYsICAgLTQ0MjgsICAgMTEyMzYsICAgIDkyMDR9LAoreyAgIDMzOTcsICAgLTE0NTEsICAgMTM1OTgsICAtMTU4NDEsICAgMjQ1NDAsICAgIDU4MTl9LAoreyAgIDg0ODMsICAgLTI5OTMsICAgMjE1NDcsICAtMTY5MTYsICAgIDc3NDEsICAgMjQwMTh9LAoreyAtMTQ5MzIsICAtMjM3NTgsICAgLTUzMzIsICAgLTY2NjQsICAgLTQ0OTcsICAgMTMyNjd9LAoreyAgMTkzNzksICAgMTI5MTYsICAgLTIxNDIsICAgIC03MzcsICAgMjExMDAsICAtMjIxMDF9LAoreyAgIDMzOTMsICAgLTQ2MjksICAgIDU3MzUsICAtMTg5MTMsICAgLTY5NjksICAgIDI2ODd9LAoreyAgIDExNDgsICAtMTYxNDcsICAtMjE0MzMsICAtMjgwOTUsICAgIC02MzAsICAtMTQ0NDl9LAoreyAgIDczMDAsICAgICA2NzIsICAgMTg1MzAsICAtMTc0NTIsICAtMTAxNDksICAgICAzNTF9LAoreyAgMTEzNTYsICAtMTA5NzQsICAgMTcyMTIsICAgIDQ2MjQsICAgICAxNDUsICAgMTc3OTF9LAoreyAgIC03MTEsICAgLTM0NzksICAgLTIyMzgsICAgMTU4ODcsICAgIDIwMjcsICAgICAgIDB9LAoreyAtMjgwNDgsICAgIDE3OTQsICAgIC01OTMsICAgLTI3NTgsICAtMjE4NTIsICAgMTE1MzV9LAoreyAtMTk2ODMsICAgIDQ5MzcsICAgMjIwMDQsICAgMjE1MjMsICAgLTMxNDgsICAgIDE3OTB9LAoreyAgICA4MTMsICAgIDgyMzEsICAgIDI2MzMsICAgMTE5ODEsICAgLTMwNDMsICAgMjIyMDF9LAoreyAgIDg5NTIsICAtMjQ3NjAsICAgIC02OTAsICAgMTQ4NzMsICAgLTIzNjYsICAgLTUzNzJ9LAoreyAgIDg0MDYsICAgLTU0MzksICAgIC0yNzQsICAgIC02NDIsICAgIC0xNDUsICAgICA3Nzh9LAoreyAgLTY2MDUsICAgIDcyNTgsICAgMjA3ODAsICAtMjM1MDcsICAtMTg2MjUsICAgMjI3ODJ9LAoreyAtMjI4OTYsICAtMjU0ODgsICAgMTAwMjAsICAgLTE2MTQsICAgIDE1MDgsICAgLTEzOTN9LAoreyAgIDc2MDcsICAgICA0MDcsICAtMjQ2NzgsICAtMTYzODUsICAgLTE4MDQsICAgLTQ2OTl9LAoreyAtMTA1OTIsICAtMTkxMzksICAgMTA0NjIsICAgLTM3NDcsICAgIDg3MjEsICAgLTY5MTl9LAoreyAgMTMwMTAsICAgIDUyOTIsICAgLTYyMzAsICAgLTQ4ODQsICAtMjA5MDQsICAgLTE3OTd9LAoreyAgMTY4OTEsICAtMTM3NzAsICAgIC00NjUsICAgMTkzNDMsICAtMTA3NDEsICAtMTI5NTl9LAoreyAgMjUxOTMsICAtMTQ3OTksICAgLTU2ODEsICAgIC01MjEsICAgIC0zMjEsICAgLTEyMTF9LAoreyAgIDY5MTcsICAgLTMwOTMsICAgMjAxODMsICAtMjY5MDMsICAtMTIwMjYsICAgIDEyOTV9LAoreyAgICAzMDUsICAgIDE5OTIsICAgMTk0NTcsICAgIC05ODUsICAgICAgMjUsICAgIC01MjF9LAoreyAgIDY3MDcsICAgLTM2OTgsICAgIDgzNjUsICAgLTg2ODcsICAgMjE5MjEsICAtMjcxNjZ9LAoreyAgIDQ2NjgsICAgIDU5OTcsICAgIDcxMTcsICAgMTE2OTYsICAgMjQ0MDEsICAtMTA3OTR9LAoreyAgICA3NDQsICAgLTk0MTYsICAgMTk4OTMsICAgIDE5NjMsICAgIDc5MjIsICAgLTk4MjR9LAoreyAgIDM0MzAsICAgMjEyODIsICAgLTE3MzYsICAgMTA4NDQsICAgIDg4MjEsICAgMjcwMTV9LAoreyAgLTg4MTMsICAgIDE1MjEsICAtMjQwMzgsICAgIDE2NTEsICAgIDc4MzgsICAgLTEyMDh9LAoreyAgIDM5MTEsICAtMTEyMjEsICAgIDMyNzMsICAtMTI1NDEsICAgIDcxNjgsICAgMTg0MDJ9LAoreyAgMjE2NDIsICAgIDkxMTcsICAtMTE1MzYsICAgLTUyNTYsICAgIDcwNzcsICAgIDIzODJ9LAoreyAgICAxMDAsICAgIDM4MTcsICAgLTY3MTMsICAgIDEyNDQsICAgIDE1MTgsICAgIC0zMjF9LAoreyAgIDc5NDYsICAtMTg2NzAsICAgMTA2NjcsICAgLTQ4NjYsICAgICA3MjcsICAgICA3NzZ9LAoreyAtMTU4ODMsICAgLTgxNTAsICAgLTIwODcsICAgMjI3MzksICAgIDE1NjcsICAgLTM0ODJ9LAoreyAgIDQzODAsICAgLTI3MzUsICAgIDg0NjksICAgLTcwMjUsICAtMTE0MjQsICAgIDEzMTd9LAoreyAgMjY5NzAsICAgIDQzOTMsICAgIDc2NjUsICAgMTc1NjEsICAgIC03MTQsICAgICA2NTB9LAoreyAtMTYxOTEsICAgIC04MzUsICAgIDgzNjUsICAgIDE3OTUsICAtMTQzMTQsICAgMTYyOTd9LAoreyAgIDQ1MDQsICAtMTAwNDgsICAgIDc2NjIsICAtMjY2OTAsICAtMTc0MjgsICAgIDI1ODB9LAoreyAgICAgNDgsICAgLTM5ODQsICAgICA1NjQsICAgLTU4NzEsICAgIDI2NTgsICAtMTg2NTh9LAoreyAgMTI1NzksICAtMjYwMTYsICAtMTU2NDIsICAgIDI2NzIsICAgLTEzNDcsICAgIC04ODd9LAoreyAgLTQ5NTAsICAgIDQyMDgsICAgLTY4MTEsICAgIDI1NjksICAtMjA2MjEsICAgLTg2NTh9LAoreyAgLTE4MzYsICAtMTQ4MTgsICAgLTU1NzEsICAtMjMzMjIsICAtMTQ4MDAsICAgMjU4Njd9LAoreyAgIDU0MzQsICAtMjgxMzksICAgLTIzNTcsICAgLTI4ODMsICAgIC01NzAsICAgIDI0MzF9LAoreyAgMTMwOTYsICAgLTI3NzEsICAgMjQ5OTQsICAtMTI0OTYsICAtMjQ3MjMsICAgLTEwMjV9LAoreyAgLTU2NzYsICAgLTQzMzksICAgIDE5MDgsICAgMTg2MjgsICAtMjEzMjMsICAgMTczNjZ9LAoreyAgMjc2NjAsICAtMjc4OTcsICAtMTU0MDksICAgIDE0MzYsICAgLTcxMTIsICAgLTIyNDF9LAoreyAgIDgwMTksICAgIDM4NDcsICAgMjQ1NjgsICAgIC00NjksICAgIDk2NzQsICAgMTA2ODN9LAoreyAgIC05MDMsICAtMTAxNDksICAgIDE4MDEsICAtMjEyNjAsICAgIDQ3OTUsICAgLTg3NTF9LAoreyAgIDExMjIsICAgLTk1ODIsICAgIDI2MjUsICAgMjI3OTEsICAgICA5NTYsICAgICA4ODJ9LAoreyAgIDc4NzYsICAgMTkwNzUsICAgLTk5MDAsICAtMjQyNjYsICAgIDc0OTYsICAgIDkyNzd9LAoreyAgICA5ODAsICAtMjY3NjQsICAgLTUzODYsICAgIDUzOTYsICAgIDEwODYsICAgIDE2NDh9LAoreyAgMjg4MzgsICAgLTEyNzAsICAgIC00NDcsICAgICAgIDUsICAgIC00MjksICAgICAtMjB9LAoreyAtMTUyODMsICAgIDYxMzIsICAgMjI4MTIsICAgIDEyNTIsICAgLTk5NjMsICAgICA1MTF9LAoreyAgICA4NTEsICAgIDc5MjUsICAgIC00NTcsICAtMTIyMTAsICAgIDQyNjEsICAgIDc1Nzl9LAoreyAgLTQ1MzAsICAgIDg0NTIsICAgLTEyNDYsICAgMTQ1MDEsICAtMjQ5NTEsICAgLTU3NjB9LAoreyAtMTc4MTQsICAtMTA3MjcsICAgIDk4ODcsICAtMjM5MjksICAtMTM0MzIsICAgIDE4Nzh9LAoreyAtMTUwNDksICAgMTAxNjUsICAgMTY0OTEsICAtMTQ2MDMsICAtMTE3MTIsICAtMjExNTZ9LAoreyAgLTMzMTcsICAgICA4NDAsICAgLTU2ODMsICAgMjI0MTMsICAgIDE5OTQsICAgICA1ODZ9LAoreyAgMjMxNTgsICAgLTU3ODgsICAtMTUwNDMsICAtMTAzNzIsICAgLTkyNzEsICAtMTM1MjN9LAoreyAgIC03NzMsICAgLTk1MDksICAgLTM5OTMsICAtMjQyNjQsICAgIDg0NjMsICAgIDU4MDR9LAoreyAgLTg1NDUsICAgIC03MDMsICAtMTI0NDAsICAgLTM5ODUsICAtMjUxMjIsICAtMjgxNDd9LAoreyAtMTY2NTksICAgMTYwMDEsICAgIDI3NDYsICAgIDE2MTEsICAgIDUwOTcsICAgLTEwNDN9LAoreyAgICAgNDEsICAgLTcxODEsICAgMTk5MDMsICAgMzE1NTUsICAtMzIyMzcsICAgMTM5Mjd9LAoreyAgLTU2NTgsICAgICA4NDUsICAtMTI3NzQsICAgIDU3MDUsICAgMTY2OTUsICAgICAtODZ9LAoreyAgIDUyODIsICAgMTQ4NzUsICAgMjcwMjYsICAgMjExMjQsICAgMTU3NzYsICAtMTA0Nzd9LAoreyAgMTQ3MTIsICAgMTk2NDgsICAtMTE0ODcsICAtMTMzNjEsICAtMjAxOTYsICAtMTUyMjl9LAoreyAgIDg1OTcsICAgLTkxMzgsICAgIC02MjYsICAgMTA4OTEsICAgLTYwMTUsICAgIDYzNDZ9LAoreyAgLTE0ODgsICAgLTEyNzIsICAgLTE0NzksICAgLTEzMDMsICAgLTM3MDQsICAgLTU0ODV9LAoreyAgLTMzNzAsICAgMTc4NzEsICAgLTY2MDQsICAgMjQ5MzAsICAgMjU4ODYsICAgLTMxMjd9LAoreyAgIDg0MTYsICAgMjc3ODMsICAgLTEzODUsICAgIDUzNTAsICAgLTQyNjAsICAgMTk5OTN9LAoreyAgIDU2ODgsICAgICAzNjIsICAgMTcyNDYsICAgIDM4MDksICAgLTMyNDYsICAgIDEwODh9LAoreyAgIC0xMDUsICAtMjk2MDcsICAgIDI3NDcsICAgMTUyMjMsICAgIC0xNjcsICAgIDM3MjJ9LAoreyAgIDM1MDIsICAgLTMxOTUsICAgIDg2MDIsICAgIDc3NzIsICAgLTE1NjYsICAgIC05MTV9LAoreyAgIC00OTEsICAgIDMyNTcsICAgLTI0MjMsICAgIDU1MjIsICAgMjA2MDYsICAgIC0xMDB9LAoreyAtMTM5NDgsICAtMTEzNjgsICAtMTUzNzUsICAtMjE4NjYsICAgLTg1MjAsICAgMTIyMjF9LAoreyAgIC02MTYsICAgIDI0MjQsICAgLTIwMjMsICAgIDQzOTgsICAgLTM4MDUsICAgIDgxMDh9LAoreyAgLTcyMDQsICAgMjEwNDMsICAgMjEyMTEsICAgLTkzOTUsICAtMTkzOTEsICAgICA4OTZ9LAoreyAgLTU3MzcsICAtMTUxNjAsICAtMjEyOTgsICAgMTcwNjYsICAgLTEwMDYsICAgIC0zNjZ9LAoreyAgIDYyNjEsICAgIDMyNDAsICAtMTE5MzcsICAtMTYyMTMsICAtMTU4MjAsICAgIDY1ODF9LAoreyAgLTMxNTUsICAgMjQ3OTYsICAgIDI3MzMsICAgLTEyNTcsICAgIC04NzUsICAgLTE1OTd9LAoreyAtMjA0NjksICAgMTEwOTQsICAgMjQwNzEsICAgLTg5ODcsICAgMTQxMzYsICAgIDIyMjB9LAoreyAtMTQxMDYsICAgMTE5NTksICAtMjI0OTUsICAgIDQxMzUsICAgLTEwNTUsICAgLTU0MjB9LAoreyAgICA4MDEsICAgLTI2NTUsICAgICAgNjAsICAgLTUzMjQsICAgIC03OTAsICAgIDU5Mzd9LAoreyAgLTczNzIsICAgLTE3NjQsICAtMjI0MzMsICAtMjYwNjAsICAgMjE3MDcsICAgIDQxNzh9LAoreyAgLTU3MTUsICAgLTY2NDgsICAtMTQ5MDgsICAgIDEzMjUsICAtMjQwNDQsICAgIDE0OTN9LAoreyAgLTYwMjQsICAtMTI0ODgsICAgMjM5MzAsICAgIDI5NTAsICAgIDE2MDEsICAgIDExNzN9LAoreyAgMTkwNjcsICAgMTc2MzAsICAgMTc5MjksICAtMTA2NTQsICAgMTA5MjgsICAgLTQ5NTh9LAoreyAgIDMyMzEsICAgLTMyODQsICAgMjczMzYsICAgIDQxNzQsICAgLTE2ODMsICAgICA0OTd9LAorfTsKKworY29uc3QgaW50MTZfdCAoKiBjb25zdCBmZl9lYWMzX21hbnRpc3NhX3ZxWzhdKVs2XSA9IHsKKyAgICBOVUxMLAorICAgIHZxX2hlYmFwMSwKKyAgICB2cV9oZWJhcDIsCisgICAgdnFfaGViYXAzLAorICAgIHZxX2hlYmFwNCwKKyAgICB2cV9oZWJhcDUsCisgICAgdnFfaGViYXA2LAorICAgIHZxX2hlYmFwNywKK307CisKKy8qKgorICogVGFibGUgRTIuMTQgRnJhbWUgRXhwb25lbnQgU3RyYXRlZ3kgQ29tYmluYXRpb25zCisgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfZWFjM19mcm1fZXhwc3RyWzMyXVs2XSA9IHsKK3sgICAgRVhQX0QxNSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRX0sCit7ICAgIEVYUF9EMTUsICBFWFBfUkVVU0UsICBFWFBfUkVVU0UsICBFWFBfUkVVU0UsICBFWFBfUkVVU0UsICAgIEVYUF9ENDV9LAoreyAgICBFWFBfRDE1LCAgRVhQX1JFVVNFLCAgRVhQX1JFVVNFLCAgRVhQX1JFVVNFLCAgICBFWFBfRDI1LCAgRVhQX1JFVVNFfSwKK3sgICAgRVhQX0QxNSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRSwgICAgRVhQX0Q0NSwgICAgRVhQX0Q0NX0sCit7ICAgIEVYUF9EMjUsICBFWFBfUkVVU0UsICBFWFBfUkVVU0UsICAgIEVYUF9EMjUsICBFWFBfUkVVU0UsICBFWFBfUkVVU0V9LAoreyAgICBFWFBfRDI1LCAgRVhQX1JFVVNFLCAgRVhQX1JFVVNFLCAgICBFWFBfRDI1LCAgRVhQX1JFVVNFLCAgICBFWFBfRDQ1fSwKK3sgICAgRVhQX0QyNSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRSwgICAgRVhQX0Q0NSwgICAgRVhQX0QyNSwgIEVYUF9SRVVTRX0sCit7ICAgIEVYUF9EMjUsICBFWFBfUkVVU0UsICBFWFBfUkVVU0UsICAgIEVYUF9ENDUsICAgIEVYUF9ENDUsICAgIEVYUF9ENDV9LAoreyAgICBFWFBfRDI1LCAgRVhQX1JFVVNFLCAgICBFWFBfRDE1LCAgRVhQX1JFVVNFLCAgRVhQX1JFVVNFLCAgRVhQX1JFVVNFfSwKK3sgICAgRVhQX0QyNSwgIEVYUF9SRVVTRSwgICAgRVhQX0QyNSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRSwgICAgRVhQX0Q0NX0sCit7ICAgIEVYUF9EMjUsICBFWFBfUkVVU0UsICAgIEVYUF9EMjUsICBFWFBfUkVVU0UsICAgIEVYUF9EMjUsICBFWFBfUkVVU0V9LAoreyAgICBFWFBfRDI1LCAgRVhQX1JFVVNFLCAgICBFWFBfRDI1LCAgRVhQX1JFVVNFLCAgICBFWFBfRDQ1LCAgICBFWFBfRDQ1fSwKK3sgICAgRVhQX0QyNSwgIEVYUF9SRVVTRSwgICAgRVhQX0Q0NSwgICAgRVhQX0QyNSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRX0sCit7ICAgIEVYUF9EMjUsICBFWFBfUkVVU0UsICAgIEVYUF9ENDUsICAgIEVYUF9EMjUsICBFWFBfUkVVU0UsICAgIEVYUF9ENDV9LAoreyAgICBFWFBfRDI1LCAgRVhQX1JFVVNFLCAgICBFWFBfRDQ1LCAgICBFWFBfRDQ1LCAgICBFWFBfRDI1LCAgRVhQX1JFVVNFfSwKK3sgICAgRVhQX0QyNSwgIEVYUF9SRVVTRSwgICAgRVhQX0Q0NSwgICAgRVhQX0Q0NSwgICAgRVhQX0Q0NSwgICAgRVhQX0Q0NX0sCit7ICAgIEVYUF9ENDUsICAgIEVYUF9EMTUsICBFWFBfUkVVU0UsICBFWFBfUkVVU0UsICBFWFBfUkVVU0UsICBFWFBfUkVVU0V9LAoreyAgICBFWFBfRDQ1LCAgICBFWFBfRDE1LCAgRVhQX1JFVVNFLCAgRVhQX1JFVVNFLCAgRVhQX1JFVVNFLCAgICBFWFBfRDQ1fSwKK3sgICAgRVhQX0Q0NSwgICAgRVhQX0QyNSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRSwgICAgRVhQX0QyNSwgIEVYUF9SRVVTRX0sCit7ICAgIEVYUF9ENDUsICAgIEVYUF9EMjUsICBFWFBfUkVVU0UsICBFWFBfUkVVU0UsICAgIEVYUF9ENDUsICAgIEVYUF9ENDV9LAoreyAgICBFWFBfRDQ1LCAgICBFWFBfRDI1LCAgRVhQX1JFVVNFLCAgICBFWFBfRDI1LCAgRVhQX1JFVVNFLCAgRVhQX1JFVVNFfSwKK3sgICAgRVhQX0Q0NSwgICAgRVhQX0QyNSwgIEVYUF9SRVVTRSwgICAgRVhQX0QyNSwgIEVYUF9SRVVTRSwgICAgRVhQX0Q0NX0sCit7ICAgIEVYUF9ENDUsICAgIEVYUF9EMjUsICBFWFBfUkVVU0UsICAgIEVYUF9ENDUsICAgIEVYUF9EMjUsICBFWFBfUkVVU0V9LAoreyAgICBFWFBfRDQ1LCAgICBFWFBfRDI1LCAgRVhQX1JFVVNFLCAgICBFWFBfRDQ1LCAgICBFWFBfRDQ1LCAgICBFWFBfRDQ1fSwKK3sgICAgRVhQX0Q0NSwgICAgRVhQX0Q0NSwgICAgRVhQX0QxNSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRSwgIEVYUF9SRVVTRX0sCit7ICAgIEVYUF9ENDUsICAgIEVYUF9ENDUsICAgIEVYUF9EMjUsICBFWFBfUkVVU0UsICBFWFBfUkVVU0UsICAgIEVYUF9ENDV9LAoreyAgICBFWFBfRDQ1LCAgICBFWFBfRDQ1LCAgICBFWFBfRDI1LCAgRVhQX1JFVVNFLCAgICBFWFBfRDI1LCAgRVhQX1JFVVNFfSwKK3sgICAgRVhQX0Q0NSwgICAgRVhQX0Q0NSwgICAgRVhQX0QyNSwgIEVYUF9SRVVTRSwgICAgRVhQX0Q0NSwgICAgRVhQX0Q0NX0sCit7ICAgIEVYUF9ENDUsICAgIEVYUF9ENDUsICAgIEVYUF9ENDUsICAgIEVYUF9EMjUsICBFWFBfUkVVU0UsICBFWFBfUkVVU0V9LAoreyAgICBFWFBfRDQ1LCAgICBFWFBfRDQ1LCAgICBFWFBfRDQ1LCAgICBFWFBfRDI1LCAgRVhQX1JFVVNFLCAgICBFWFBfRDQ1fSwKK3sgICAgRVhQX0Q0NSwgICAgRVhQX0Q0NSwgICAgRVhQX0Q0NSwgICAgRVhQX0Q0NSwgICAgRVhQX0QyNSwgIEVYUF9SRVVTRX0sCit7ICAgIEVYUF9ENDUsICAgIEVYUF9ENDUsICAgIEVYUF9ENDUsICAgIEVYUF9ENDUsICAgIEVYUF9ENDUsICAgIEVYUF9ENDV9LAorfTsKKworLyoqCisgKiBUYWJsZSBFLjI1OiBTcGVjdHJhbCBFeHRlbnNpb24gQXR0ZW51YXRpb24gVGFibGUKKyAqIGZmX2VhYzNfc3B4X2F0dGVuX3RhYltjb2RlXVtiaW5dPXBvdygyLjAsKGJpbisxKSooY29kZSsxKS8tMTUuMCk7CisgKi8KK2NvbnN0IGZsb2F0IGZmX2VhYzNfc3B4X2F0dGVuX3RhYlszMl1bM10gPSB7CisgICAgeyAwLjk1NDg0MTYwMzkxMDQxNjUwM2YsIDAuOTExNzIyNDg4NTU4MjE2ODA0ZiwgMC44NzA1NTA1NjMyOTYxMjQxMjVmIH0sCisgICAgeyAwLjkxMTcyMjQ4ODU1ODIxNjgwNGYsIDAuODMxMjM3ODk2MTQyNzg3NzU4ZiwgMC43NTc4NTgyODMyNTUxOTg5OTVmIH0sCisgICAgeyAwLjg3MDU1MDU2MzI5NjEyNDEyNWYsIDAuNzU3ODU4MjgzMjU1MTk4OTk1ZiwgMC42NTk3NTM5NTUzODY0NDcxMDBmIH0sCisgICAgeyAwLjgzMTIzNzg5NjE0Mjc4Nzc1OGYsIDAuNjkwOTU2NDM5OTgzODg4MDA0ZiwgMC41NzQzNDkxNzc0OTg1MTc0MzhmIH0sCisgICAgeyAwLjc5MzcwMDUyNTk4NDA5OTc5MmYsIDAuNjI5OTYwNTI0OTQ3NDM2NTk1ZiwgMC41MDAwMDAwMDAwMDAwMDAwMDBmIH0sCisgICAgeyAwLjc1Nzg1ODI4MzI1NTE5ODk5NWYsIDAuNTc0MzQ5MTc3NDk4NTE3NDM4ZiwgMC40MzUyNzUyODE2NDgwNjIwNjJmIH0sCisgICAgeyAwLjcyMzYzNDYxODcyMDE4OTA4MmYsIDAuNTIzNjQ3MDYxNDEwMzEzMzY0ZiwgMC4zNzg5MjkxNDE2Mjc1OTk1NTNmIH0sCisgICAgeyAwLjY5MDk1NjQzOTk4Mzg4ODAwNGYsIDAuNDc3NDIwODAxOTU1MjA4MzA3ZiwgMC4zMjk4NzY5Nzc2OTMyMjM1NTBmIH0sCisgICAgeyAwLjY1OTc1Mzk1NTM4NjQ0NzEwMGYsIDAuNDM1Mjc1MjgxNjQ4MDYyMDYyZiwgMC4yODcxNzQ1ODg3NDkyNTg3MTlmIH0sCisgICAgeyAwLjYyOTk2MDUyNDk0NzQzNjU5NWYsIDAuMzk2ODUwMjYyOTkyMDQ5ODk2ZiwgMC4yNTAwMDAwMDAwMDAwMDAwMDBmIH0sCisgICAgeyAwLjYwMTUxMjUxODA0MTA1ODMxOWYsIDAuMzYxODE3MzA5MzYwMDk0NTQxZiwgMC4yMTc2Mzc2NDA4MjQwMzEwMDNmIH0sCisgICAgeyAwLjU3NDM0OTE3NzQ5ODUxNzQzOGYsIDAuMzI5ODc2OTc3NjkzMjIzNTUwZiwgMC4xODk0NjQ1NzA4MTM3OTk3NzZmIH0sCisgICAgeyAwLjU0ODQxMjQ4OTg0NzMxMjk0NWYsIDAuMzAwNzU2MjU5MDIwNTI5MTYwZiwgMC4xNjQ5Mzg0ODg4NDY2MTE3NzVmIH0sCisgICAgeyAwLjUyMzY0NzA2MTQxMDMxMzM2NGYsIDAuMjc0MjA2MjQ0OTIzNjU2NDczZiwgMC4xNDM1ODcyOTQzNzQ2MjkzODdmIH0sCisgICAgeyAwLjUwMDAwMDAwMDAwMDAwMDAwMGYsIDAuMjUwMDAwMDAwMDAwMDAwMDAwZiwgMC4xMjUwMDAwMDAwMDAwMDAwMDBmIH0sCisgICAgeyAwLjQ3NzQyMDgwMTk1NTIwODMwN2YsIDAuMjI3OTMwNjIyMTM5NTU0MjAxZiwgMC4xMDg4MTg4MjA0MTIwMTU1MDJmIH0sCisgICAgeyAwLjQ1NTg2MTI0NDI3OTEwODQwMmYsIDAuMjA3ODA5NDc0MDM1Njk2OTM5ZiwgMC4wOTQ3MzIyODU0MDY4OTk4ODhmIH0sCisgICAgeyAwLjQzNTI3NTI4MTY0ODA2MjA2MmYsIDAuMTg5NDY0NTcwODEzNzk5Nzc2ZiwgMC4wODI0NjkyNDQ0MjMzMDU4ODdmIH0sCisgICAgeyAwLjQxNTYxODk0ODA3MTM5Mzg3OWYsIDAuMTcyNzM5MTA5OTk1OTcyMDI5ZiwgMC4wNzE3OTM2NDcxODczMTQ2OTRmIH0sCisgICAgeyAwLjM5Njg1MDI2Mjk5MjA0OTg5NmYsIDAuMTU3NDkwMTMxMjM2ODU5MTQ5ZiwgMC4wNjI1MDAwMDAwMDAwMDAwMDBmIH0sCisgICAgeyAwLjM3ODkyOTE0MTYyNzU5OTU1M2YsIDAuMTQzNTg3Mjk0Mzc0NjI5Mzg3ZiwgMC4wNTQ0MDk0MTAyMDYwMDc3NTFmIH0sCisgICAgeyAwLjM2MTgxNzMwOTM2MDA5NDU0MWYsIDAuMTMwOTExNzY1MzUyNTc4MzY5ZiwgMC4wNDczNjYxNDI3MDM0NDk5MzBmIH0sCisgICAgeyAwLjM0NTQ3ODIxOTk5MTk0NDAwMmYsIDAuMTE5MzU1MjAwNDg4ODAyMDQ5ZiwgMC4wNDEyMzQ2MjIyMTE2NTI5NThmIH0sCisgICAgeyAwLjMyOTg3Njk3NzY5MzIyMzU1MGYsIDAuMTA4ODE4ODIwNDEyMDE1NTAyZiwgMC4wMzU4OTY4MjM1OTM2NTczNDdmIH0sCisgICAgeyAwLjMxNDk4MDI2MjQ3MzcxODI5OGYsIDAuMDk5MjEyNTY1NzQ4MDEyNDYwZiwgMC4wMzEyNTAwMDAwMDAwMDAwMDBmIH0sCisgICAgeyAwLjMwMDc1NjI1OTAyMDUyOTE2MGYsIDAuMDkwNDU0MzI3MzQwMDIzNjIxZiwgMC4wMjcyMDQ3MDUxMDMwMDM4NzVmIH0sCisgICAgeyAwLjI4NzE3NDU4ODc0OTI1ODcxOWYsIDAuMDgyNDY5MjQ0NDIzMzA1ODg3ZiwgMC4wMjM2ODMwNzEzNTE3MjQ5NjVmIH0sCisgICAgeyAwLjI3NDIwNjI0NDkyMzY1NjQ3M2YsIDAuMDc1MTg5MDY0NzU1MTMyMjkwZiwgMC4wMjA2MTczMTExMDU4MjY0NzlmIH0sCisgICAgeyAwLjI2MTgyMzUzMDcwNTE1NjY4MmYsIDAuMDY4NTUxNTYxMjMwOTE0MTE4ZiwgMC4wMTc5NDg0MTE3OTY4Mjg2NzNmIH0sCisgICAgeyAwLjI1MDAwMDAwMDAwMDAwMDAwMGYsIDAuMDYyNTAwMDAwMDAwMDAwMDAwZiwgMC4wMTU2MjUwMDAwMDAwMDAwMDBmIH0sCisgICAgeyAwLjIzODcxMDQwMDk3NzYwNDA5OGYsIDAuMDU2OTgyNjU1NTM0ODg4NTM2ZiwgMC4wMTM2MDIzNTI1NTE1MDE5MzhmIH0sCisgICAgeyAwLjIyNzkzMDYyMjEzOTU1NDIwMWYsIDAuMDUxOTUyMzY4NTA4OTI0MjM1ZiwgMC4wMTE4NDE1MzU2NzU4NjI0ODNmIH0KK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9lYWMzX2RhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2VhYzNfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTY3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9lYWMzX2RhdGEuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogRS1BQy0zIHRhYmxlcworICogQ29weXJpZ2h0IChjKSAyMDA3IEJhcnRsb21pZWogV29sb3dpZWMgPGJhcnRlay53b2xvd2llY0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19FQUMzX0RBVEFfSAorI2RlZmluZSBBVkNPREVDX0VBQzNfREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZWFjM19iaXRzX3ZzX2hlYmFwWzIwXTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX2VhYzNfZ2FxX3JlbWFwXzFbMTJdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfZWFjM19nYXFfcmVtYXBfMl80X2FbOV1bMl07CitleHRlcm4gY29uc3QgaW50MTZfdCBmZl9lYWMzX2dhcV9yZW1hcF8yXzRfYls5XVsyXTsKKworZXh0ZXJuIGNvbnN0IGludDE2X3QgKCogY29uc3QgZmZfZWFjM19tYW50aXNzYV92cVs4XSlbNl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9lYWMzX2ZybV9leHBzdHJbMzJdWzZdOworZXh0ZXJuIGNvbnN0IGZsb2F0ICAgZmZfZWFjM19zcHhfYXR0ZW5fdGFiWzMyXVszXTsKKworI2VuZGlmIC8qIEFWQ09ERUNfRUFDM19EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2VhYzNkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2VhYzNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTkzMWZkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZWFjM2RlYy5jCkBAIC0wLDAgKzEsNjA3IEBACisvKgorICogRS1BQy0zIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCYXJ0bG9taWVqIFdvbG93aWVjIDxiYXJ0ZWsud29sb3dpZWNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA4IEp1c3RpbiBSdWdnbGVzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCBmZWF0dXJlcyBvZiBFLUFDLTMgdGhhdCB0aGlzIGRlY29kZXIgZG9lcyBub3QgeWV0IHN1cHBvcnQuCisgKgorICogRW5oYW5jZWQgQ291cGxpbmcKKyAqICAgICBObyBrbm93biBzYW1wbGVzIGV4aXN0LiAgSWYgYW55IGV2ZXIgc3VyZmFjZSwgdGhpcyBmZWF0dXJlIHNob3VsZCBub3QgYmUKKyAqICAgICB0b28gZGlmZmljdWx0IHRvIGltcGxlbWVudC4KKyAqCisgKiBSZWR1Y2VkIFNhbXBsZSBSYXRlcworICogICAgIE5vIGtub3duIHNhbXBsZXMgZXhpc3QuICBUaGUgc3BlYyBhbHNvIGRvZXMgbm90IGdpdmUgY2xlYXIgaW5mb3JtYXRpb24KKyAqICAgICBvbiBob3cgdGhpcyBpcyB0byBiZSBpbXBsZW1lbnRlZC4KKyAqCisgKiBEZXBlbmRlbnQgU3RyZWFtcworICogICAgIE9ubHkgdGhlIGluZGVwZW5kZW50IHN0cmVhbSBpcyBjdXJyZW50bHkgZGVjb2RlZC4gQW55IGRlcGVuZGVudAorICogICAgIHN0cmVhbXMgYXJlIHNraXBwZWQuICBXZSBoYXZlIG9ubHkgY29tZSBhY3Jvc3MgdHdvIGV4YW1wbGVzIG9mIHRoaXMsIGFuZAorICogICAgIHRoZXkgYXJlIGJvdGgganVzdCB0ZXN0IHN0cmVhbXMsIG9uZSBmb3IgSEQtRFZEIGFuZCB0aGUgb3RoZXIgZm9yCisgKiAgICAgQmx1LXJheS4KKyAqCisgKiBUcmFuc2llbnQgUHJlLW5vaXNlIFByb2Nlc3NpbmcKKyAqICAgICBUaGlzIGlzIHNpZGUgaW5mb3JtYXRpb24gd2hpY2ggYSBkZWNvZGVyIHNob3VsZCB1c2UgdG8gcmVkdWNlIGFydGlmYWN0cworICogICAgIGNhdXNlZCBieSB0cmFuc2llbnRzLiAgVGhlcmUgYXJlIHNhbXBsZXMgd2hpY2ggYXJlIGtub3duIHRvIGhhdmUgdGhpcworICogICAgIGluZm9ybWF0aW9uLCBidXQgdGhpcyBkZWNvZGVyIGN1cnJlbnRseSBpZ25vcmVzIGl0LgorICovCisKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImFhY19hYzNfcGFyc2VyLmgiCisjaW5jbHVkZSAiYWMzLmgiCisjaW5jbHVkZSAiYWMzX3BhcnNlci5oIgorI2luY2x1ZGUgImFjM2RlYy5oIgorI2luY2x1ZGUgImFjM2RlY19kYXRhLmgiCisjaW5jbHVkZSAiZWFjM19kYXRhLmgiCisKKy8qKiBnYWluIGFkYXB0aXZlIHF1YW50aXphdGlvbiBtb2RlICovCit0eXBlZGVmIGVudW0geworICAgIEVBQzNfR0FRX05PID0wLAorICAgIEVBQzNfR0FRXzEyLAorICAgIEVBQzNfR0FRXzE0LAorICAgIEVBQzNfR0FRXzEyNAorfSBFQUMzR2FxTW9kZTsKKworI2RlZmluZSBFQUMzX1NSX0NPREVfUkVEVUNFRCAgMworCit2b2lkIGZmX2VhYzNfYXBwbHlfc3BlY3RyYWxfZXh0ZW5zaW9uKEFDM0RlY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGJpbiwgYm5kLCBjaCwgaTsKKyAgICB1aW50OF90IHdyYXBmbGFnW1NQWF9NQVhfQkFORFNdPXsxLDAsfSwgbnVtX2NvcHlfc2VjdGlvbnMsIGNvcHlfc2l6ZXNbU1BYX01BWF9CQU5EU107CisgICAgZmxvYXQgcm1zX2VuZXJneVtTUFhfTUFYX0JBTkRTXTsKKworICAgIC8qIFNldCBjb3B5IGluZGV4IG1hcHBpbmcgdGFibGUuIFNldCB3cmFwIGZsYWdzIHRvIGFwcGx5IGEgbm90Y2ggZmlsdGVyIGF0CisgICAgICAgd3JhcCBwb2ludHMgbGF0ZXIgb24uICovCisgICAgYmluID0gcy0+c3B4X2RzdF9zdGFydF9mcmVxOworICAgIG51bV9jb3B5X3NlY3Rpb25zID0gMDsKKyAgICBmb3IgKGJuZCA9IDA7IGJuZCA8IHMtPm51bV9zcHhfYmFuZHM7IGJuZCsrKSB7CisgICAgICAgIGludCBjb3B5c2l6ZTsKKyAgICAgICAgaW50IGJhbmRzaXplID0gcy0+c3B4X2JhbmRfc2l6ZXNbYm5kXTsKKyAgICAgICAgaWYgKGJpbiArIGJhbmRzaXplID4gcy0+c3B4X3NyY19zdGFydF9mcmVxKSB7CisgICAgICAgICAgICBjb3B5X3NpemVzW251bV9jb3B5X3NlY3Rpb25zKytdID0gYmluIC0gcy0+c3B4X2RzdF9zdGFydF9mcmVxOworICAgICAgICAgICAgYmluID0gcy0+c3B4X2RzdF9zdGFydF9mcmVxOworICAgICAgICAgICAgd3JhcGZsYWdbYm5kXSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJhbmRzaXplOyBpICs9IGNvcHlzaXplKSB7CisgICAgICAgICAgICBpZiAoYmluID09IHMtPnNweF9zcmNfc3RhcnRfZnJlcSkgeworICAgICAgICAgICAgICAgIGNvcHlfc2l6ZXNbbnVtX2NvcHlfc2VjdGlvbnMrK10gPSBiaW4gLSBzLT5zcHhfZHN0X3N0YXJ0X2ZyZXE7CisgICAgICAgICAgICAgICAgYmluID0gcy0+c3B4X2RzdF9zdGFydF9mcmVxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29weXNpemUgPSBGRk1JTihiYW5kc2l6ZSAtIGksIHMtPnNweF9zcmNfc3RhcnRfZnJlcSAtIGJpbik7CisgICAgICAgICAgICBiaW4gKz0gY29weXNpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgY29weV9zaXplc1tudW1fY29weV9zZWN0aW9ucysrXSA9IGJpbiAtIHMtPnNweF9kc3Rfc3RhcnRfZnJlcTsKKworICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKCFzLT5jaGFubmVsX3VzZXNfc3B4W2NoXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIENvcHkgY29lZmZzIGZyb20gbm9ybWFsIGJhbmRzIHRvIGV4dGVuc2lvbiBiYW5kcyAqLworICAgICAgICBiaW4gPSBzLT5zcHhfc3JjX3N0YXJ0X2ZyZXE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29weV9zZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICBtZW1jcHkoJnMtPnRyYW5zZm9ybV9jb2VmZnNbY2hdW2Jpbl0sCisgICAgICAgICAgICAgICAgICAgJnMtPnRyYW5zZm9ybV9jb2VmZnNbY2hdW3MtPnNweF9kc3Rfc3RhcnRfZnJlcV0sCisgICAgICAgICAgICAgICAgICAgY29weV9zaXplc1tpXSpzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgIGJpbiArPSBjb3B5X3NpemVzW2ldOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIFJNUyBlbmVyZ3kgZm9yIGVhY2ggU1BYIGJhbmQuICovCisgICAgICAgIGJpbiA9IHMtPnNweF9zcmNfc3RhcnRfZnJlcTsKKyAgICAgICAgZm9yIChibmQgPSAwOyBibmQgPCBzLT5udW1fc3B4X2JhbmRzOyBibmQrKykgeworICAgICAgICAgICAgaW50IGJhbmRzaXplID0gcy0+c3B4X2JhbmRfc2l6ZXNbYm5kXTsKKyAgICAgICAgICAgIGZsb2F0IGFjY3VtID0gMC4wZjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiYW5kc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgY29lZmYgPSBzLT50cmFuc2Zvcm1fY29lZmZzW2NoXVtiaW4rK107CisgICAgICAgICAgICAgICAgYWNjdW0gKz0gY29lZmYgKiBjb2VmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJtc19lbmVyZ3lbYm5kXSA9IHNxcnRmKGFjY3VtIC8gYmFuZHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLyogQXBwbHkgYSBub3RjaCBmaWx0ZXIgYXQgdHJhbnNpdGlvbnMgYmV0d2VlbiBub3JtYWwgYW5kIGV4dGVuc2lvbgorICAgICAgICAgICBiYW5kcyBhbmQgYXQgYWxsIHdyYXAgcG9pbnRzLiAqLworICAgICAgICBpZiAocy0+c3B4X2F0dGVuX2NvZGVbY2hdID49IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICphdHRlbl90YWIgPSBmZl9lYWMzX3NweF9hdHRlbl90YWJbcy0+c3B4X2F0dGVuX2NvZGVbY2hdXTsKKyAgICAgICAgICAgIGJpbiA9IHMtPnNweF9zcmNfc3RhcnRfZnJlcSAtIDI7CisgICAgICAgICAgICBmb3IgKGJuZCA9IDA7IGJuZCA8IHMtPm51bV9zcHhfYmFuZHM7IGJuZCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHdyYXBmbGFnW2JuZF0pIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvZWZmcyA9ICZzLT50cmFuc2Zvcm1fY29lZmZzW2NoXVtiaW5dOworICAgICAgICAgICAgICAgICAgICBjb2VmZnNbMF0gKj0gYXR0ZW5fdGFiWzBdOworICAgICAgICAgICAgICAgICAgICBjb2VmZnNbMV0gKj0gYXR0ZW5fdGFiWzFdOworICAgICAgICAgICAgICAgICAgICBjb2VmZnNbMl0gKj0gYXR0ZW5fdGFiWzJdOworICAgICAgICAgICAgICAgICAgICBjb2VmZnNbM10gKj0gYXR0ZW5fdGFiWzFdOworICAgICAgICAgICAgICAgICAgICBjb2VmZnNbNF0gKj0gYXR0ZW5fdGFiWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiaW4gKz0gcy0+c3B4X2JhbmRfc2l6ZXNbYm5kXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFwcGx5IG5vaXNlLWJsZW5kZWQgY29lZmZpY2llbnQgc2NhbGluZyBiYXNlZCBvbiBwcmV2aW91c2x5CisgICAgICAgICAgIGNhbGN1bGF0ZWQgUk1TIGVuZXJneSwgYmxlbmRpbmcgZmFjdG9ycywgYW5kIFNQWCBjb29yZGluYXRlcyBmb3IKKyAgICAgICAgICAgZWFjaCBiYW5kLiAqLworICAgICAgICBiaW4gPSBzLT5zcHhfc3JjX3N0YXJ0X2ZyZXE7CisgICAgICAgIGZvciAoYm5kID0gMDsgYm5kIDwgcy0+bnVtX3NweF9iYW5kczsgYm5kKyspIHsKKyAgICAgICAgICAgIGZsb2F0IG5zY2FsZSA9IHMtPnNweF9ub2lzZV9ibGVuZFtjaF1bYm5kXSAqIHJtc19lbmVyZ3lbYm5kXSAqICgxLjBmIC8gSU5UMzJfTUlOKTsKKyAgICAgICAgICAgIGZsb2F0IHNzY2FsZSA9IHMtPnNweF9zaWduYWxfYmxlbmRbY2hdW2JuZF07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c3B4X2JhbmRfc2l6ZXNbYm5kXTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgbm9pc2UgID0gbnNjYWxlICogKGludDMyX3QpYXZfbGZnX2dldCgmcy0+ZGl0aF9zdGF0ZSk7CisgICAgICAgICAgICAgICAgcy0+dHJhbnNmb3JtX2NvZWZmc1tjaF1bYmluXSAgICo9IHNzY2FsZTsKKyAgICAgICAgICAgICAgICBzLT50cmFuc2Zvcm1fY29lZmZzW2NoXVtiaW4rK10gKz0gbm9pc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoqIGxyaW50KE1fU1FSVDIqY29zKDIqTV9QSS8xMikqKDE8PDIzKSkgKi8KKyNkZWZpbmUgQ09FRkZfMCAxMDI3MzkwNUxMCisKKy8qKiBscmludChNX1NRUlQyKmNvcygwKk1fUEkvMTIpKigxPDwyMykpID0gbHJpbnQoTV9TUVJUMiooMTw8MjMpKSAqLworI2RlZmluZSBDT0VGRl8xIDExODYzMjgzTEwKKworLyoqIGxyaW50KE1fU1FSVDIqY29zKDUqTV9QSS8xMikqKDE8PDIzKSkgKi8KKyNkZWZpbmUgQ09FRkZfMiAgMzA3MDQ0NExMCisKKy8qKgorICogQ2FsY3VsYXRlIDYtcG9pbnQgSURDVCBvZiB0aGUgcHJlLW1hbnRpc3Nhcy4KKyAqIEFsbCBjYWxjdWxhdGlvbnMgYXJlIDI0LWJpdCBmaXhlZC1wb2ludC4KKyAqLworc3RhdGljIHZvaWQgaWRjdDYoaW50IHByZV9tYW50WzZdKQoreworICAgIGludCB0bXA7CisgICAgaW50IGV2ZW4wLCBldmVuMSwgZXZlbjIsIG9kZDAsIG9kZDEsIG9kZDI7CisKKyAgICBvZGQxID0gcHJlX21hbnRbMV0gLSBwcmVfbWFudFszXSAtIHByZV9tYW50WzVdOworCisgICAgZXZlbjIgPSAoIHByZV9tYW50WzJdICAgICAgICAgICAgICAgICogQ09FRkZfMCkgPj4gMjM7CisgICAgdG1wICAgPSAoIHByZV9tYW50WzRdICAgICAgICAgICAgICAgICogQ09FRkZfMSkgPj4gMjM7CisgICAgb2RkMCAgPSAoKHByZV9tYW50WzFdICsgcHJlX21hbnRbNV0pICogQ09FRkZfMikgPj4gMjM7CisKKyAgICBldmVuMCA9IHByZV9tYW50WzBdICsgKHRtcCA+PiAxKTsKKyAgICBldmVuMSA9IHByZV9tYW50WzBdIC0gdG1wOworCisgICAgdG1wID0gZXZlbjA7CisgICAgZXZlbjAgPSB0bXAgKyBldmVuMjsKKyAgICBldmVuMiA9IHRtcCAtIGV2ZW4yOworCisgICAgdG1wID0gb2RkMDsKKyAgICBvZGQwID0gdG1wICsgcHJlX21hbnRbMV0gKyBwcmVfbWFudFszXTsKKyAgICBvZGQyID0gdG1wICsgcHJlX21hbnRbNV0gLSBwcmVfbWFudFszXTsKKworICAgIHByZV9tYW50WzBdID0gZXZlbjAgKyBvZGQwOworICAgIHByZV9tYW50WzFdID0gZXZlbjEgKyBvZGQxOworICAgIHByZV9tYW50WzJdID0gZXZlbjIgKyBvZGQyOworICAgIHByZV9tYW50WzNdID0gZXZlbjIgLSBvZGQyOworICAgIHByZV9tYW50WzRdID0gZXZlbjEgLSBvZGQxOworICAgIHByZV9tYW50WzVdID0gZXZlbjAgLSBvZGQwOworfQorCit2b2lkIGZmX2VhYzNfZGVjb2RlX3RyYW5zZm9ybV9jb2VmZnNfYWh0X2NoKEFDM0RlY29kZUNvbnRleHQgKnMsIGludCBjaCkKK3sKKyAgICBpbnQgYmluLCBibGssIGdzOworICAgIGludCBlbmRfYmFwLCBnYXFfbW9kZTsKKyAgICBHZXRCaXRDb250ZXh0ICpnYmMgPSAmcy0+Z2JjOworICAgIGludCBnYXFfZ2FpbltBQzNfTUFYX0NPRUZTXTsKKworICAgIGdhcV9tb2RlID0gZ2V0X2JpdHMoZ2JjLCAyKTsKKyAgICBlbmRfYmFwID0gKGdhcV9tb2RlIDwgMikgPyAxMiA6IDE3OworCisgICAgLyogaWYgR0FRIGdhaW4gaXMgdXNlZCwgZGVjb2RlIGdhaW4gY29kZXMgZm9yIGJpbnMgd2l0aCBoZWJhcCBiZXR3ZWVuCisgICAgICAgOCBhbmQgZW5kX2JhcCAqLworICAgIGdzID0gMDsKKyAgICBpZiAoZ2FxX21vZGUgPT0gRUFDM19HQVFfMTIgfHwgZ2FxX21vZGUgPT0gRUFDM19HQVFfMTQpIHsKKyAgICAgICAgLyogcmVhZCAxLWJpdCBHQVEgZ2FpbiBjb2RlcyAqLworICAgICAgICBmb3IgKGJpbiA9IHMtPnN0YXJ0X2ZyZXFbY2hdOyBiaW4gPCBzLT5lbmRfZnJlcVtjaF07IGJpbisrKSB7CisgICAgICAgICAgICBpZiAocy0+YmFwW2NoXVtiaW5dID4gNyAmJiBzLT5iYXBbY2hdW2Jpbl0gPCBlbmRfYmFwKQorICAgICAgICAgICAgICAgIGdhcV9nYWluW2dzKytdID0gZ2V0X2JpdHMxKGdiYykgPDwgKGdhcV9tb2RlLTEpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChnYXFfbW9kZSA9PSBFQUMzX0dBUV8xMjQpIHsKKyAgICAgICAgLyogcmVhZCAxLjY3LWJpdCBHQVEgZ2FpbiBjb2RlcyAoMyBjb2RlcyBpbiA1IGJpdHMpICovCisgICAgICAgIGludCBnYyA9IDI7CisgICAgICAgIGZvciAoYmluID0gcy0+c3RhcnRfZnJlcVtjaF07IGJpbiA8IHMtPmVuZF9mcmVxW2NoXTsgYmluKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5iYXBbY2hdW2Jpbl0gPiA3ICYmIHMtPmJhcFtjaF1bYmluXSA8IDE3KSB7CisgICAgICAgICAgICAgICAgaWYgKGdjKysgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBfY29kZSA9IGdldF9iaXRzKGdiYywgNSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChncm91cF9jb2RlID4gMjYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJHQVEgZ2FpbiBncm91cCBjb2RlIG91dC1vZi1yYW5nZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9jb2RlID0gMjY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZ2FxX2dhaW5bZ3MrK10gPSBmZl9hYzNfdW5ncm91cF8zX2luXzVfYml0c190YWJbZ3JvdXBfY29kZV1bMF07CisgICAgICAgICAgICAgICAgICAgIGdhcV9nYWluW2dzKytdID0gZmZfYWMzX3VuZ3JvdXBfM19pbl81X2JpdHNfdGFiW2dyb3VwX2NvZGVdWzFdOworICAgICAgICAgICAgICAgICAgICBnYXFfZ2FpbltncysrXSA9IGZmX2FjM191bmdyb3VwXzNfaW5fNV9iaXRzX3RhYltncm91cF9jb2RlXVsyXTsKKyAgICAgICAgICAgICAgICAgICAgZ2MgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGdzPTA7CisgICAgZm9yIChiaW4gPSBzLT5zdGFydF9mcmVxW2NoXTsgYmluIDwgcy0+ZW5kX2ZyZXFbY2hdOyBiaW4rKykgeworICAgICAgICBpbnQgaGViYXAgPSBzLT5iYXBbY2hdW2Jpbl07CisgICAgICAgIGludCBiaXRzID0gZmZfZWFjM19iaXRzX3ZzX2hlYmFwW2hlYmFwXTsKKyAgICAgICAgaWYgKCFoZWJhcCkgeworICAgICAgICAgICAgLyogemVyby1tYW50aXNzYSBkaXRoZXJpbmcgKi8KKyAgICAgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgNjsgYmxrKyspIHsKKyAgICAgICAgICAgICAgICBzLT5wcmVfbWFudGlzc2FbY2hdW2Jpbl1bYmxrXSA9IChhdl9sZmdfZ2V0KCZzLT5kaXRoX3N0YXRlKSAmIDB4N0ZGRkZGKSAtIDB4NDAwMDAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGhlYmFwIDwgOCkgeworICAgICAgICAgICAgLyogVmVjdG9yIFF1YW50aXphdGlvbiAqLworICAgICAgICAgICAgaW50IHYgPSBnZXRfYml0cyhnYmMsIGJpdHMpOworICAgICAgICAgICAgZm9yIChibGsgPSAwOyBibGsgPCA2OyBibGsrKykgeworICAgICAgICAgICAgICAgIHMtPnByZV9tYW50aXNzYVtjaF1bYmluXVtibGtdID0gZmZfZWFjM19tYW50aXNzYV92cVtoZWJhcF1bdl1bYmxrXSA8PCA4OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogR2FpbiBBZGFwdGl2ZSBRdWFudGl6YXRpb24gKi8KKyAgICAgICAgICAgIGludCBnYml0cywgbG9nX2dhaW47CisgICAgICAgICAgICBpZiAoZ2FxX21vZGUgIT0gRUFDM19HQVFfTk8gJiYgaGViYXAgPCBlbmRfYmFwKSB7CisgICAgICAgICAgICAgICAgbG9nX2dhaW4gPSBnYXFfZ2FpbltncysrXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nX2dhaW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2JpdHMgPSBiaXRzIC0gbG9nX2dhaW47CisKKyAgICAgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgNjsgYmxrKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgbWFudCA9IGdldF9zYml0cyhnYmMsIGdiaXRzKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nX2dhaW4gJiYgbWFudCA9PSAtKDEgPDwgKGdiaXRzLTEpKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBsYXJnZSBtYW50aXNzYSAqLworICAgICAgICAgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1iaXRzID0gYml0cyAtICgyIC0gbG9nX2dhaW4pOworICAgICAgICAgICAgICAgICAgICBtYW50ID0gZ2V0X3NiaXRzKGdiYywgbWJpdHMpOworICAgICAgICAgICAgICAgICAgICBtYW50IDw8PSAoMjMgLSAobWJpdHMgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIC8qIHJlbWFwIG1hbnRpc3NhIHZhbHVlIHRvIGNvcnJlY3QgZm9yIGFzeW1tZXRyaWMgcXVhbnRpemF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmIChtYW50ID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICBiID0gMSA8PCAoMjMgLSBsb2dfZ2Fpbik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBmZl9lYWMzX2dhcV9yZW1hcF8yXzRfYltoZWJhcC04XVtsb2dfZ2Fpbi0xXSA8PCA4OworICAgICAgICAgICAgICAgICAgICBtYW50ICs9ICgoZmZfZWFjM19nYXFfcmVtYXBfMl80X2FbaGViYXAtOF1bbG9nX2dhaW4tMV0gKiAoaW50NjRfdCltYW50KSA+PiAxNSkgKyBiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHNtYWxsIG1hbnRpc3NhLCBubyBHQVEsIG9yIEdrPTEgKi8KKyAgICAgICAgICAgICAgICAgICAgbWFudCA8PD0gMjQgLSBiaXRzOworICAgICAgICAgICAgICAgICAgICBpZiAoIWxvZ19nYWluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1hcCBtYW50aXNzYSB2YWx1ZSBmb3Igbm8gR0FRIG9yIEdrPTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbnQgKz0gKGZmX2VhYzNfZ2FxX3JlbWFwXzFbaGViYXAtOF0gKiAoaW50NjRfdCltYW50KSA+PiAxNTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT5wcmVfbWFudGlzc2FbY2hdW2Jpbl1bYmxrXSA9IG1hbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWRjdDYocy0+cHJlX21hbnRpc3NhW2NoXVtiaW5dKTsKKyAgICB9Cit9CisKK2ludCBmZl9lYWMzX3BhcnNlX2hlYWRlcihBQzNEZWNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBpLCBibGssIGNoOworICAgIGludCBhYzNfZXhwb25lbnRfc3RyYXRlZ3ksIHBhcnNlX2FodF9pbmZvLCBwYXJzZV9zcHhfYXR0ZW5fZGF0YTsKKyAgICBpbnQgcGFyc2VfdHJhbnNpZW50X3Byb2NfaW5mbzsKKyAgICBpbnQgbnVtX2NwbF9ibG9ja3M7CisgICAgR2V0Qml0Q29udGV4dCAqZ2JjID0gJnMtPmdiYzsKKworICAgIC8qIEFuIEUtQUMtMyBzdHJlYW0gY2FuIGhhdmUgbXVsdGlwbGUgaW5kZXBlbmRlbnQgc3RyZWFtcyB3aGljaCB0aGUKKyAgICAgICBhcHBsaWNhdGlvbiBjYW4gc2VsZWN0IGZyb20uIGVhY2ggaW5kZXBlbmRlbnQgc3RyZWFtIGNhbiBhbHNvIGNvbnRhaW4KKyAgICAgICBkZXBlbmRlbnQgc3RyZWFtcyB3aGljaCBhcmUgdXNlZCB0byBhZGQgb3IgcmVwbGFjZSBjaGFubmVscy4gKi8KKyAgICBpZiAocy0+ZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfREVQRU5ERU5UKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIkRlcGVuZGVudCBzdWJzdHJlYW0gZGVjb2RpbmciKTsKKyAgICAgICAgcmV0dXJuIEFBQ19BQzNfUEFSU0VfRVJST1JfRlJBTUVfVFlQRTsKKyAgICB9IGVsc2UgaWYgKHMtPmZyYW1lX3R5cGUgPT0gRUFDM19GUkFNRV9UWVBFX1JFU0VSVkVEKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVzZXJ2ZWQgZnJhbWUgdHlwZVxuIik7CisgICAgICAgIHJldHVybiBBQUNfQUMzX1BBUlNFX0VSUk9SX0ZSQU1FX1RZUEU7CisgICAgfQorCisgICAgLyogVGhlIHN1YnN0cmVhbSBpZCBpbmRpY2F0ZXMgd2hpY2ggc3Vic3RyZWFtIHRoaXMgZnJhbWUgYmVsb25ncyB0by4gZWFjaAorICAgICAgIGluZGVwZW5kZW50IHN0cmVhbSBoYXMgaXRzIG93biBzdWJzdHJlYW0gaWQsIGFuZCB0aGUgZGVwZW5kZW50IHN0cmVhbXMKKyAgICAgICBhc3NvY2lhdGVkIHRvIGFuIGluZGVwZW5kZW50IHN0cmVhbSBoYXZlIG1hdGNoaW5nIHN1YnN0cmVhbSBpZCdzLiAqLworICAgIGlmIChzLT5zdWJzdHJlYW1pZCkgeworICAgICAgICAvKiBvbmx5IGRlY29kZSBzdWJzdHJlYW0gd2l0aCBpZD0wLiBza2lwIGFueSBhZGRpdGlvbmFsIHN1YnN0cmVhbXMuICovCisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIkFkZGl0aW9uYWwgc3Vic3RyZWFtcyIpOworICAgICAgICByZXR1cm4gQUFDX0FDM19QQVJTRV9FUlJPUl9GUkFNRV9UWVBFOworICAgIH0KKworICAgIGlmIChzLT5iaXRfYWxsb2NfcGFyYW1zLnNyX2NvZGUgPT0gRUFDM19TUl9DT0RFX1JFRFVDRUQpIHsKKyAgICAgICAgLyogVGhlIEUtQUMtMyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHRlbGwgaG93IHRvIGhhbmRsZSByZWR1Y2VkIHNhbXBsZQorICAgICAgICAgICByYXRlcyBpbiBiaXQgYWxsb2NhdGlvbi4gIFRoZSBiZXN0IGFzc3VtcHRpb24gd291bGQgYmUgdGhhdCBpdCBpcworICAgICAgICAgICBoYW5kbGVkIGxpa2UgQUMtMyBEb2xieU5ldCwgYnV0IHdlIGNhbm5vdCBiZSBzdXJlIHVudGlsIHdlIGhhdmUgYQorICAgICAgICAgICBzYW1wbGUgd2hpY2ggdXRpbGl6ZXMgdGhpcyBmZWF0dXJlLiAqLworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJSZWR1Y2VkIHNhbXBsaW5nIHJhdGUiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBza2lwX2JpdHMoZ2JjLCA1KTsgLy8gc2tpcCBiaXRzdHJlYW0gaWQKKworICAgIC8qIHZvbHVtZSBjb250cm9sIHBhcmFtcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCAocy0+Y2hhbm5lbF9tb2RlID8gMSA6IDIpOyBpKyspIHsKKyAgICAgICAgc2tpcF9iaXRzKGdiYywgNSk7IC8vIHNraXAgZGlhbG9nIG5vcm1hbGl6YXRpb24KKyAgICAgICAgaWYgKGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2JjLCA4KTsgLy8gc2tpcCBjb21wcmVzc2lvbiBnYWluIHdvcmQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGRlcGVuZGVudCBzdHJlYW0gY2hhbm5lbCBtYXAgKi8KKyAgICBpZiAocy0+ZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfREVQRU5ERU5UKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2JjKSkgeworICAgICAgICAgICAgc2tpcF9iaXRzKGdiYywgMTYpOyAvLyBza2lwIGN1c3RvbSBjaGFubmVsIG1hcAorICAgICAgICB9CisgICAgfQorCisgICAgLyogbWl4aW5nIG1ldGFkYXRhICovCisgICAgaWYgKGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgIC8qIGNlbnRlciBhbmQgc3Vycm91bmQgbWl4IGxldmVscyAqLworICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID4gQUMzX0NITU9ERV9TVEVSRU8pIHsKKyAgICAgICAgICAgIHMtPnByZWZlcnJlZF9kb3dubWl4ID0gZ2V0X2JpdHMoZ2JjLCAyKTsKKyAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX21vZGUgJiAxKSB7CisgICAgICAgICAgICAgICAgLyogaWYgdGhyZWUgZnJvbnQgY2hhbm5lbHMgZXhpc3QgKi8KKyAgICAgICAgICAgICAgICBzLT5jZW50ZXJfbWl4X2xldmVsX2x0cnQgPSBnZXRfYml0cyhnYmMsIDMpOworICAgICAgICAgICAgICAgIHMtPmNlbnRlcl9taXhfbGV2ZWwgICAgICA9IGdldF9iaXRzKGdiYywgMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlICYgNCkgeworICAgICAgICAgICAgICAgIC8qIGlmIGEgc3Vycm91bmQgY2hhbm5lbCBleGlzdHMgKi8KKyAgICAgICAgICAgICAgICBzLT5zdXJyb3VuZF9taXhfbGV2ZWxfbHRydCA9IGF2X2NsaXAoZ2V0X2JpdHMoZ2JjLCAzKSwgMywgNyk7CisgICAgICAgICAgICAgICAgcy0+c3Vycm91bmRfbWl4X2xldmVsICAgICAgPSBhdl9jbGlwKGdldF9iaXRzKGdiYywgMyksIDMsIDcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogbGZlIG1peCBsZXZlbCAqLworICAgICAgICBpZiAocy0+bGZlX29uICYmIChzLT5sZmVfbWl4X2xldmVsX2V4aXN0cyA9IGdldF9iaXRzMShnYmMpKSkgeworICAgICAgICAgICAgcy0+bGZlX21peF9sZXZlbCA9IGdldF9iaXRzKGdiYywgNSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBpbmZvIGZvciBtaXhpbmcgd2l0aCBvdGhlciBzdHJlYW1zIGFuZCBzdWJzdHJlYW1zICovCisgICAgICAgIGlmIChzLT5mcmFtZV90eXBlID09IEVBQzNfRlJBTUVfVFlQRV9JTkRFUEVOREVOVCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChzLT5jaGFubmVsX21vZGUgPyAxIDogMik7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGFwcGx5IHByb2dyYW0gc2NhbGUgZmFjdG9yCisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYmMsIDYpOyAgLy8gc2tpcCBwcm9ncmFtIHNjYWxlIGZhY3RvcgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2JjKSkgeworICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYmMsIDYpOyAgLy8gc2tpcCBleHRlcm5hbCBwcm9ncmFtIHNjYWxlIGZhY3RvcgorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogc2tpcCBtaXhpbmcgcGFyYW1ldGVyIGRhdGEgKi8KKyAgICAgICAgICAgIHN3aXRjaChnZXRfYml0cyhnYmMsIDIpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiBza2lwX2JpdHMoZ2JjLCA1KTsgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogc2tpcF9iaXRzKGdiYywgMTIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1peF9kYXRhX3NpemUgPSAoZ2V0X2JpdHMoZ2JjLCA1KSArIDIpIDw8IDM7CisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0c19sb25nKGdiYywgbWl4X2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHNraXAgcGFuIGluZm9ybWF0aW9uIGZvciBtb25vIG9yIGR1YWwgbW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX21vZGUgPCBBQzNfQ0hNT0RFX1NURVJFTykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocy0+Y2hhbm5lbF9tb2RlID8gMSA6IDIpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3RlOiB0aGlzIGlzIG5vdCBpbiB0aGUgQVRTQyBBLzUyQiBzcGVjaWZpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U6IEVUU0kgVFMgMTAyIDM2NiBWMS4xLjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogRS4xLjMuMS4yNSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiYywgOCk7ICAvLyBza2lwIHBhbiBtZWFuIGRpcmVjdGlvbiBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiYywgNik7ICAvLyBza2lwIHJlc2VydmVkIHBhbmluZm8gYml0cworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogc2tpcCBtaXhpbmcgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgICAgICAgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bnVtX2Jsb2NrcyA9PSAxIHx8IGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2JjLCA1KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGluZm9ybWF0aW9uYWwgbWV0YWRhdGEgKi8KKyAgICBpZiAoZ2V0X2JpdHMxKGdiYykpIHsKKyAgICAgICAgcy0+Yml0c3RyZWFtX21vZGUgPSBnZXRfYml0cyhnYmMsIDMpOworICAgICAgICBza2lwX2JpdHMoZ2JjLCAyKTsgLy8gc2tpcCBjb3B5cmlnaHQgYml0IGFuZCBvcmlnaW5hbCBiaXRzdHJlYW0gYml0CisgICAgICAgIGlmIChzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8pIHsKKyAgICAgICAgICAgIHMtPmRvbGJ5X3N1cnJvdW5kX21vZGUgID0gZ2V0X2JpdHMoZ2JjLCAyKTsKKyAgICAgICAgICAgIHMtPmRvbGJ5X2hlYWRwaG9uZV9tb2RlID0gZ2V0X2JpdHMoZ2JjLCAyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID49IEFDM19DSE1PREVfMkYyUikgeworICAgICAgICAgICAgcy0+ZG9sYnlfc3Vycm91bmRfZXhfbW9kZSA9IGdldF9iaXRzKGdiYywgMik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChzLT5jaGFubmVsX21vZGUgPyAxIDogMik7IGkrKykgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiYywgOCk7IC8vIHNraXAgbWl4IGxldmVsLCByb29tIHR5cGUsIGFuZCBBL0QgY29udmVydGVyIHR5cGUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocy0+Yml0X2FsbG9jX3BhcmFtcy5zcl9jb2RlICE9IEVBQzNfU1JfQ09ERV9SRURVQ0VEKSB7CisgICAgICAgICAgICBza2lwX2JpdHMxKGdiYyk7IC8vIHNraXAgc291cmNlIHNhbXBsZSByYXRlIGNvZGUKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvbnZlcnRlciBzeW5jaHJvbml6YXRpb24gZmxhZworICAgICAgIElmIGZyYW1lcyBhcmUgbGVzcyB0aGFuIHNpeCBibG9ja3MsIHRoaXMgYml0IHNob3VsZCBiZSB0dXJuZWQgb24KKyAgICAgICBvbmNlIGV2ZXJ5IDYgYmxvY2tzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIGZyYW1lIHNldC4KKyAgICAgICByZWZlcmVuY2U6IFJGQyA0NTk4LCBTZWN0aW9uIDIuMS4zICBGcmFtZSBTZXRzICovCisgICAgaWYgKHMtPmZyYW1lX3R5cGUgPT0gRUFDM19GUkFNRV9UWVBFX0lOREVQRU5ERU5UICYmIHMtPm51bV9ibG9ja3MgIT0gNikgeworICAgICAgICBza2lwX2JpdHMxKGdiYyk7IC8vIHNraXAgY29udmVydGVyIHN5bmNocm9uaXphdGlvbiBmbGFnCisgICAgfQorCisgICAgLyogb3JpZ2luYWwgZnJhbWUgc2l6ZSBjb2RlIGlmIHRoaXMgc3RyZWFtIHdhcyBjb252ZXJ0ZWQgZnJvbSBBQy0zICovCisgICAgaWYgKHMtPmZyYW1lX3R5cGUgPT0gRUFDM19GUkFNRV9UWVBFX0FDM19DT05WRVJUICYmCisgICAgICAgICAgICAocy0+bnVtX2Jsb2NrcyA9PSA2IHx8IGdldF9iaXRzMShnYmMpKSkgeworICAgICAgICBza2lwX2JpdHMoZ2JjLCA2KTsgLy8gc2tpcCBmcmFtZSBzaXplIGNvZGUKKyAgICB9CisKKyAgICAvKiBhZGRpdGlvbmFsIGJpdHN0cmVhbSBpbmZvICovCisgICAgaWYgKGdldF9iaXRzMShnYmMpKSB7CisgICAgICAgIGludCBhZGRic2lsID0gZ2V0X2JpdHMoZ2JjLCA2KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFkZGJzaWwgKyAxOyBpKyspIHsKKyAgICAgICAgICAgIHNraXBfYml0cyhnYmMsIDgpOyAvLyBza2lwIGFkZGl0aW9uYWwgYml0IHN0cmVhbSBpbmZvCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhdWRpbyBmcmFtZSBzeW50YXggZmxhZ3MsIHN0cmF0ZWd5IGRhdGEsIGFuZCBwZXItZnJhbWUgZGF0YSAqLworCisgICAgaWYgKHMtPm51bV9ibG9ja3MgPT0gNikgeworICAgICAgICBhYzNfZXhwb25lbnRfc3RyYXRlZ3kgPSBnZXRfYml0czEoZ2JjKTsKKyAgICAgICAgcGFyc2VfYWh0X2luZm8gICAgICAgID0gZ2V0X2JpdHMxKGdiYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbGVzcyB0aGFuIDYgYmxvY2tzLCBzbyB1c2UgQUMtMy1zdHlsZSBleHBvbmVudCBzdHJhdGVneSBzeW50YXgsIGFuZAorICAgICAgICAgICBkbyBub3QgdXNlIEFIVCAqLworICAgICAgICBhYzNfZXhwb25lbnRfc3RyYXRlZ3kgPSAxOworICAgICAgICBwYXJzZV9haHRfaW5mbyA9IDA7CisgICAgfQorCisgICAgcy0+c25yX29mZnNldF9zdHJhdGVneSAgICA9IGdldF9iaXRzKGdiYywgMik7CisgICAgcGFyc2VfdHJhbnNpZW50X3Byb2NfaW5mbyA9IGdldF9iaXRzMShnYmMpOworCisgICAgcy0+YmxvY2tfc3dpdGNoX3N5bnRheCA9IGdldF9iaXRzMShnYmMpOworICAgIGlmICghcy0+YmxvY2tfc3dpdGNoX3N5bnRheCkKKyAgICAgICAgbWVtc2V0KHMtPmJsb2NrX3N3aXRjaCwgMCwgc2l6ZW9mKHMtPmJsb2NrX3N3aXRjaCkpOworCisgICAgcy0+ZGl0aGVyX2ZsYWdfc3ludGF4ID0gZ2V0X2JpdHMxKGdiYyk7CisgICAgaWYgKCFzLT5kaXRoZXJfZmxhZ19zeW50YXgpIHsKKyAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IHMtPmZid19jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIHMtPmRpdGhlcl9mbGFnW2NoXSA9IDE7CisgICAgfQorICAgIHMtPmRpdGhlcl9mbGFnW0NQTF9DSF0gPSBzLT5kaXRoZXJfZmxhZ1tzLT5sZmVfY2hdID0gMDsKKworICAgIHMtPmJpdF9hbGxvY2F0aW9uX3N5bnRheCA9IGdldF9iaXRzMShnYmMpOworICAgIGlmICghcy0+Yml0X2FsbG9jYXRpb25fc3ludGF4KSB7CisgICAgICAgIC8qIHNldCBkZWZhdWx0IGJpdCBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgcy0+Yml0X2FsbG9jX3BhcmFtcy5zbG93X2RlY2F5ID0gZmZfYWMzX3Nsb3dfZGVjYXlfdGFiWzJdOworICAgICAgICBzLT5iaXRfYWxsb2NfcGFyYW1zLmZhc3RfZGVjYXkgPSBmZl9hYzNfZmFzdF9kZWNheV90YWJbMV07CisgICAgICAgIHMtPmJpdF9hbGxvY19wYXJhbXMuc2xvd19nYWluICA9IGZmX2FjM19zbG93X2dhaW5fdGFiIFsxXTsKKyAgICAgICAgcy0+Yml0X2FsbG9jX3BhcmFtcy5kYl9wZXJfYml0ID0gZmZfYWMzX2RiX3Blcl9iaXRfdGFiWzJdOworICAgICAgICBzLT5iaXRfYWxsb2NfcGFyYW1zLmZsb29yICAgICAgPSBmZl9hYzNfZmxvb3JfdGFiICAgICBbN107CisgICAgfQorCisgICAgcy0+ZmFzdF9nYWluX3N5bnRheCAgPSBnZXRfYml0czEoZ2JjKTsKKyAgICBzLT5kYmFfc3ludGF4ICAgICAgICA9IGdldF9iaXRzMShnYmMpOworICAgIHMtPnNraXBfc3ludGF4ICAgICAgID0gZ2V0X2JpdHMxKGdiYyk7CisgICAgcGFyc2Vfc3B4X2F0dGVuX2RhdGEgPSBnZXRfYml0czEoZ2JjKTsKKworICAgIC8qIGNvdXBsaW5nIHN0cmF0ZWd5IG9jY3VycmVuY2UgYW5kIGNvdXBsaW5nIHVzZSBwZXIgYmxvY2sgKi8KKyAgICBudW1fY3BsX2Jsb2NrcyA9IDA7CisgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA+IDEpIHsKKyAgICAgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICAgICAgcy0+Y3BsX3N0cmF0ZWd5X2V4aXN0c1tibGtdID0gKCFibGsgfHwgZ2V0X2JpdHMxKGdiYykpOworICAgICAgICAgICAgaWYgKHMtPmNwbF9zdHJhdGVneV9leGlzdHNbYmxrXSkgeworICAgICAgICAgICAgICAgIHMtPmNwbF9pbl91c2VbYmxrXSA9IGdldF9iaXRzMShnYmMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5jcGxfaW5fdXNlW2Jsa10gPSBzLT5jcGxfaW5fdXNlW2Jsay0xXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bV9jcGxfYmxvY2tzICs9IHMtPmNwbF9pbl91c2VbYmxrXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldChzLT5jcGxfaW5fdXNlLCAwLCBzaXplb2Yocy0+Y3BsX2luX3VzZSkpOworICAgIH0KKworICAgIC8qIGV4cG9uZW50IHN0cmF0ZWd5IGRhdGEgKi8KKyAgICBpZiAoYWMzX2V4cG9uZW50X3N0cmF0ZWd5KSB7CisgICAgICAgIC8qIEFDLTMtc3R5bGUgZXhwb25lbnQgc3RyYXRlZ3kgc3ludGF4ICovCisgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspIHsKKyAgICAgICAgICAgIGZvciAoY2ggPSAhcy0+Y3BsX2luX3VzZVtibGtdOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBzLT5leHBfc3RyYXRlZ3lbYmxrXVtjaF0gPSBnZXRfYml0cyhnYmMsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTFVULWJhc2VkIGV4cG9uZW50IHN0cmF0ZWd5IHN5bnRheCAqLworICAgICAgICBmb3IgKGNoID0gISgocy0+Y2hhbm5lbF9tb2RlID4gMSkgJiYgbnVtX2NwbF9ibG9ja3MpOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGludCBmcm1jaGV4cHN0ciA9IGdldF9iaXRzKGdiYywgNSk7CisgICAgICAgICAgICBmb3IgKGJsayA9IDA7IGJsayA8IDY7IGJsaysrKSB7CisgICAgICAgICAgICAgICAgcy0+ZXhwX3N0cmF0ZWd5W2Jsa11bY2hdID0gZmZfZWFjM19mcm1fZXhwc3RyW2ZybWNoZXhwc3RyXVtibGtdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIExGRSBleHBvbmVudCBzdHJhdGVneSAqLworICAgIGlmIChzLT5sZmVfb24pIHsKKyAgICAgICAgZm9yIChibGsgPSAwOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICAgICAgcy0+ZXhwX3N0cmF0ZWd5W2Jsa11bcy0+bGZlX2NoXSA9IGdldF9iaXRzMShnYmMpOworICAgICAgICB9CisgICAgfQorICAgIC8qIG9yaWdpbmFsIGV4cG9uZW50IHN0cmF0ZWdpZXMgaWYgdGhpcyBzdHJlYW0gd2FzIGNvbnZlcnRlZCBmcm9tIEFDLTMgKi8KKyAgICBpZiAocy0+ZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfSU5ERVBFTkRFTlQgJiYKKyAgICAgICAgICAgIChzLT5udW1fYmxvY2tzID09IDYgfHwgZ2V0X2JpdHMxKGdiYykpKSB7CisgICAgICAgIHNraXBfYml0cyhnYmMsIDUgKiBzLT5mYndfY2hhbm5lbHMpOyAvLyBza2lwIGNvbnZlcnRlciBjaGFubmVsIGV4cG9uZW50IHN0cmF0ZWd5CisgICAgfQorCisgICAgLyogZGV0ZXJtaW5lIHdoaWNoIGNoYW5uZWxzIHVzZSBBSFQgKi8KKyAgICBpZiAocGFyc2VfYWh0X2luZm8pIHsKKyAgICAgICAgLyogRm9yIEFIVCB0byBiZSB1c2VkLCBhbGwgbm9uLXplcm8gYmxvY2tzIG11c3QgcmV1c2UgZXhwb25lbnRzIGZyb20KKyAgICAgICAgICAgdGhlIGZpcnN0IGJsb2NrLiAgRnVydGhlcm1vcmUsIGZvciBBSFQgdG8gYmUgdXNlZCBpbiB0aGUgY291cGxpbmcKKyAgICAgICAgICAgY2hhbm5lbCwgYWxsIGJsb2NrcyBtdXN0IHVzZSBjb3VwbGluZyBhbmQgdXNlIHRoZSBzYW1lIGNvdXBsaW5nCisgICAgICAgICAgIHN0cmF0ZWd5LiAqLworICAgICAgICBzLT5jaGFubmVsX3VzZXNfYWh0W0NQTF9DSF09MDsKKyAgICAgICAgZm9yIChjaCA9IChudW1fY3BsX2Jsb2NrcyAhPSA2KTsgY2ggPD0gcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGludCB1c2VfYWh0ID0gMTsKKyAgICAgICAgICAgIGZvciAoYmxrID0gMTsgYmxrIDwgNjsgYmxrKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKHMtPmV4cF9zdHJhdGVneVtibGtdW2NoXSAhPSBFWFBfUkVVU0UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoIWNoICYmIHMtPmNwbF9zdHJhdGVneV9leGlzdHNbYmxrXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlX2FodCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmNoYW5uZWxfdXNlc19haHRbY2hdID0gdXNlX2FodCAmJiBnZXRfYml0czEoZ2JjKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldChzLT5jaGFubmVsX3VzZXNfYWh0LCAwLCBzaXplb2Yocy0+Y2hhbm5lbF91c2VzX2FodCkpOworICAgIH0KKworICAgIC8qIHBlci1mcmFtZSBTTlIgb2Zmc2V0ICovCisgICAgaWYgKCFzLT5zbnJfb2Zmc2V0X3N0cmF0ZWd5KSB7CisgICAgICAgIGludCBjc25yb2Zmc3QgPSAoZ2V0X2JpdHMoZ2JjLCA2KSAtIDE1KSA8PCA0OworICAgICAgICBpbnQgc25yb2Zmc3QgPSAoY3Nucm9mZnN0ICsgZ2V0X2JpdHMoZ2JjLCA0KSkgPDwgMjsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDw9IHMtPmNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgcy0+c25yX29mZnNldFtjaF0gPSBzbnJvZmZzdDsKKyAgICB9CisKKyAgICAvKiB0cmFuc2llbnQgcHJlLW5vaXNlIHByb2Nlc3NpbmcgZGF0YSAqLworICAgIGlmIChwYXJzZV90cmFuc2llbnRfcHJvY19pbmZvKSB7CisgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2JjKSkgeyAvLyBjaGFubmVsIGluIHRyYW5zaWVudCBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiYywgMTApOyAvLyBza2lwIHRyYW5zaWVudCBwcm9jZXNzaW5nIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiYywgOCk7ICAvLyBza2lwIHRyYW5zaWVudCBwcm9jZXNzaW5nIGxlbmd0aAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogc3BlY3RyYWwgZXh0ZW5zaW9uIGF0dGVudWF0aW9uIGRhdGEgKi8KKyAgICBmb3IgKGNoID0gMTsgY2ggPD0gcy0+ZmJ3X2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGlmIChwYXJzZV9zcHhfYXR0ZW5fZGF0YSAmJiBnZXRfYml0czEoZ2JjKSkgeworICAgICAgICAgICAgcy0+c3B4X2F0dGVuX2NvZGVbY2hdID0gZ2V0X2JpdHMoZ2JjLCA1KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnNweF9hdHRlbl9jb2RlW2NoXSA9IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyogYmxvY2sgc3RhcnQgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAocy0+bnVtX2Jsb2NrcyA+IDEgJiYgZ2V0X2JpdHMxKGdiYykpIHsKKyAgICAgICAgLyogcmVmZXJlbmNlOiBTZWN0aW9uIEUyLjMuMi4yNworICAgICAgICAgICBuYmxrc3RydGJpdHMgPSAobnVtYmxrcyAtIDEpICogKDQgKyBjZWlsaW5nKGxvZzIod29yZHNfcGVyX2ZyYW1lKSkpCisgICAgICAgICAgIFRoZSBzcGVjIGRvZXMgbm90IHNheSB3aGF0IHRoaXMgZGF0YSBpcyBvciB3aGF0IGl0J3MgdXNlZCBmb3IuCisgICAgICAgICAgIEl0IGlzIGxpa2VseSB0aGUgb2Zmc2V0IG9mIGVhY2ggYmxvY2sgd2l0aGluIHRoZSBmcmFtZS4gKi8KKyAgICAgICAgaW50IGJsb2NrX3N0YXJ0X2JpdHMgPSAocy0+bnVtX2Jsb2Nrcy0xKSAqICg0ICsgYXZfbG9nMihzLT5mcmFtZV9zaXplLTIpKTsKKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2JjLCBibG9ja19zdGFydF9iaXRzKTsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiQmxvY2sgc3RhcnQgaW5mbyIpOworICAgIH0KKworICAgIC8qIHN5bnRheCBzdGF0ZSBpbml0aWFsaXphdGlvbiAqLworICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgcy0+Zmlyc3Rfc3B4X2Nvb3Jkc1tjaF0gPSAxOworICAgICAgICBzLT5maXJzdF9jcGxfY29vcmRzW2NoXSA9IDE7CisgICAgfQorICAgIHMtPmZpcnN0X2NwbF9sZWFrID0gMTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZWFjM2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZWFjM2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDYxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9lYWMzZW5jLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBFLUFDLTMgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDExIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEUtQUMtMyBlbmNvZGVyCisgKi8KKworI2RlZmluZSBDT05GSUdfQUMzRU5DX0ZMT0FUIDEKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiYWMzZW5jLmgiCisjaW5jbHVkZSAiZWFjM2VuYy5oIgorI2luY2x1ZGUgImVhYzNfZGF0YS5oIgorCisKKyNkZWZpbmUgQUMzRU5DX1RZUEUgQUMzRU5DX1RZUEVfRUFDMworI2luY2x1ZGUgImFjM2VuY19vcHRzX3RlbXBsYXRlLmMiCisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGVhYzNlbmNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiRS1BQy0zIEVuY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBhYzNfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKKy8qKgorICogTFVUIGZvciBmaW5kaW5nIGEgbWF0Y2hpbmcgZnJhbWUgZXhwb25lbnQgc3RyYXRlZ3kgaW5kZXggZnJvbSBhIHNldCBvZgorICogZXhwb25lbnQgc3RyYXRlZ2llcyBmb3IgYSBzaW5nbGUgY2hhbm5lbCBhY3Jvc3MgYWxsIDYgYmxvY2tzLgorICovCitzdGF0aWMgaW50OF90IGVhYzNfZnJhbWVfZXhwc3RyX2luZGV4X3RhYlszXVs0XVs0XVs0XVs0XVs0XTsKKworCithdl9jb2xkIHZvaWQgZmZfZWFjM19leHBvbmVudF9pbml0KHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBtZW1zZXQoZWFjM19mcmFtZV9leHBzdHJfaW5kZXhfdGFiLCAtMSwgc2l6ZW9mKGVhYzNfZnJhbWVfZXhwc3RyX2luZGV4X3RhYikpOworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgIGVhYzNfZnJhbWVfZXhwc3RyX2luZGV4X3RhYltmZl9lYWMzX2ZybV9leHBzdHJbaV1bMF0tMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZmX2VhYzNfZnJtX2V4cHN0cltpXVsxXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZmX2VhYzNfZnJtX2V4cHN0cltpXVsyXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZmX2VhYzNfZnJtX2V4cHN0cltpXVszXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZmX2VhYzNfZnJtX2V4cHN0cltpXVs0XV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZmX2VhYzNfZnJtX2V4cHN0cltpXVs1XV0gPSBpOworICAgIH0KK30KKworCit2b2lkIGZmX2VhYzNfZ2V0X2ZyYW1lX2V4cF9zdHJhdGVneShBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBjaDsKKworICAgIGlmIChzLT5udW1fYmxvY2tzIDwgNikgeworICAgICAgICBzLT51c2VfZnJhbWVfZXhwX3N0cmF0ZWd5ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHMtPnVzZV9mcmFtZV9leHBfc3RyYXRlZ3kgPSAxOworICAgIGZvciAoY2ggPSAhcy0+Y3BsX29uOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaW50IGV4cHN0ciA9IGVhYzNfZnJhbWVfZXhwc3RyX2luZGV4X3RhYltzLT5leHBfc3RyYXRlZ3lbY2hdWzBdLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcy0+ZXhwX3N0cmF0ZWd5W2NoXVsxXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzLT5leHBfc3RyYXRlZ3lbY2hdWzJdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3MtPmV4cF9zdHJhdGVneVtjaF1bM11dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcy0+ZXhwX3N0cmF0ZWd5W2NoXVs0XV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzLT5leHBfc3RyYXRlZ3lbY2hdWzVdXTsKKyAgICAgICAgaWYgKGV4cHN0ciA8IDApIHsKKyAgICAgICAgICAgIHMtPnVzZV9mcmFtZV9leHBfc3RyYXRlZ3kgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy0+ZnJhbWVfZXhwX3N0cmF0ZWd5W2NoXSA9IGV4cHN0cjsKKyAgICB9Cit9CisKKworCit2b2lkIGZmX2VhYzNfc2V0X2NwbF9zdGF0ZXMoQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY2gsIGJsazsKKyAgICBpbnQgZmlyc3RfY3BsX2Nvb3Jkc1tBQzNfTUFYX0NIQU5ORUxTXTsKKworICAgIC8qIHNldCBmaXJzdCBjcGwgY29vcmRzICovCisgICAgZm9yIChjaCA9IDE7IGNoIDw9IHMtPmZid19jaGFubmVsczsgY2grKykKKyAgICAgICAgZmlyc3RfY3BsX2Nvb3Jkc1tjaF0gPSAxOworICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspIHsKKyAgICAgICAgQUMzQmxvY2sgKmJsb2NrID0gJnMtPmJsb2Nrc1tibGtdOworICAgICAgICBmb3IgKGNoID0gMTsgY2ggPD0gcy0+ZmJ3X2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBpZiAoYmxvY2stPmNoYW5uZWxfaW5fY3BsW2NoXSkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdF9jcGxfY29vcmRzW2NoXSkgeworICAgICAgICAgICAgICAgICAgICBibG9jay0+bmV3X2NwbF9jb29yZHNbY2hdID0gMjsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RfY3BsX2Nvb3Jkc1tjaF0gID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpcnN0X2NwbF9jb29yZHNbY2hdID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNldCBmaXJzdCBjcGwgbGVhayAqLworICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspIHsKKyAgICAgICAgQUMzQmxvY2sgKmJsb2NrID0gJnMtPmJsb2Nrc1tibGtdOworICAgICAgICBpZiAoYmxvY2stPmNwbF9pbl91c2UpIHsKKyAgICAgICAgICAgIGJsb2NrLT5uZXdfY3BsX2xlYWsgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCBmZl9lYWMzX291dHB1dF9mcmFtZV9oZWFkZXIoQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgYmxrLCBjaDsKKyAgICBBQzNFbmNPcHRpb25zICpvcHQgPSAmcy0+b3B0aW9uczsKKworICAgIHB1dF9iaXRzKCZzLT5wYiwgMTYsIDB4MGI3Nyk7ICAgICAgICAgICAgICAgICAgIC8qIHN5bmMgd29yZCAqLworCisgICAgLyogQlNJIGhlYWRlciAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgIDIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0cmVhbSB0eXBlID0gaW5kZXBlbmRlbnQgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsICAzLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWJzdHJlYW0gaWQgPSAwICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxMSwgKHMtPmZyYW1lX3NpemUgLyAyKSAtIDEpOyAgLyogZnJhbWUgc2l6ZSAqLworICAgIGlmIChzLT5iaXRfYWxsb2Muc3Jfc2hpZnQpIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCAweDMpOyAgICAgICAgICAgICAgICAgICAvKiBmc2NvZDIgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBzLT5iaXRfYWxsb2Muc3JfY29kZSk7ICAvKiBzYW1wbGUgcmF0ZSBjb2RlICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBzLT5iaXRfYWxsb2Muc3JfY29kZSk7ICAvKiBzYW1wbGUgcmF0ZSBjb2RlICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgcy0+bnVtX2Jsa3NfY29kZSk7ICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyAqLworICAgIH0KKyAgICBwdXRfYml0cygmcy0+cGIsIDMsIHMtPmNoYW5uZWxfbW9kZSk7ICAgICAgICAgICAvKiBhdWRpbyBjb2RpbmcgbW9kZSAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+bGZlX29uKTsgICAgICAgICAgICAgICAgIC8qIExGRSBjaGFubmVsIGluZGljYXRvciAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgcy0+Yml0c3RyZWFtX2lkKTsgICAgICAgICAgIC8qIGJpdHN0cmVhbSBpZCAoRUFDMz0xNikgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDUsIC1vcHQtPmRpYWxvZ3VlX2xldmVsKTsgICAgICAvKiBkaWFsb2d1ZSBub3JtYWxpemF0aW9uIGxldmVsICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gY29tcHJlc3Npb24gZ2FpbiAqLworICAgIC8qIG1peGluZyBtZXRhZGF0YSovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBvcHQtPmVhYzNfbWl4aW5nX21ldGFkYXRhKTsKKyAgICBpZiAob3B0LT5lYWMzX21peGluZ19tZXRhZGF0YSkgeworICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID4gQUMzX0NITU9ERV9TVEVSRU8pCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIG9wdC0+cHJlZmVycmVkX3N0ZXJlb19kb3dubWl4KTsKKyAgICAgICAgaWYgKHMtPmhhc19jZW50ZXIpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+bHRydF9jZW50ZXJfbWl4X2xldmVsKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+bG9yb19jZW50ZXJfbWl4X2xldmVsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+aGFzX3N1cnJvdW5kKSB7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDMsIHMtPmx0cnRfc3Vycm91bmRfbWl4X2xldmVsKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+bG9yb19zdXJyb3VuZF9taXhfbGV2ZWwpOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5sZmVfb24pCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHByb2dyYW0gc2NhbGUgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAgICAgICAgICAvKiBubyBleHQgcHJvZ3JhbSBzY2FsZSAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG1peGluZyBwYXJhbWV0ZXJzICovCisgICAgICAgIGlmIChzLT5jaGFubmVsX21vZGUgPCBBQzNfQ0hNT0RFX1NURVJFTykKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgICAgICAgICAvKiBubyBwYW4gaW5mbyAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGZyYW1lIG1peCBjb25maWcgaW5mbyAqLworICAgIH0KKyAgICAvKiBpbmZvIG1ldGFkYXRhKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIG9wdC0+ZWFjM19pbmZvX21ldGFkYXRhKTsKKyAgICBpZiAob3B0LT5lYWMzX2luZm9fbWV0YWRhdGEpIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCBzLT5iaXRzdHJlYW1fbW9kZSk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgb3B0LT5jb3B5cmlnaHQpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIG9wdC0+b3JpZ2luYWwpOworICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID09IEFDM19DSE1PREVfU1RFUkVPKSB7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIG9wdC0+ZG9sYnlfc3Vycm91bmRfbW9kZSk7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIG9wdC0+ZG9sYnlfaGVhZHBob25lX21vZGUpOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5jaGFubmVsX21vZGUgPj0gQUMzX0NITU9ERV8yRjJSKQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBvcHQtPmRvbGJ5X3N1cnJvdW5kX2V4X21vZGUpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIG9wdC0+YXVkaW9fcHJvZHVjdGlvbl9pbmZvKTsKKyAgICAgICAgaWYgKG9wdC0+YXVkaW9fcHJvZHVjdGlvbl9pbmZvKSB7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIG9wdC0+bWl4aW5nX2xldmVsIC0gODApOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBvcHQtPnJvb21fdHlwZSk7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIG9wdC0+YWRfY29udmVydGVyX3R5cGUpOworICAgICAgICB9CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7CisgICAgfQorICAgIGlmIChzLT5udW1fYmxvY2tzICE9IDYpCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgIShzLT5hdmN0eC0+ZnJhbWVfbnVtYmVyICUgNikpOyAvKiBjb252ZXJ0ZXIgc3luYyBmbGFnICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gYWRkaXRpb25hbCBiaXQgc3RyZWFtIGluZm8gKi8KKworICAgIC8qIGZyYW1lIGhlYWRlciAqLworICAgIGlmIChzLT5udW1fYmxvY2tzID09IDYpIHsKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsICFzLT51c2VfZnJhbWVfZXhwX3N0cmF0ZWd5KTsvKiBleHBvbmVudCBzdHJhdGVneSBzeW50YXggKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhaHQgZW5hYmxlZCA9IG5vICovCisgICAgfQorICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNuciBvZmZzZXQgc3RyYXRlZ3kgPSAxICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhbnNpZW50IHByZS1ub2lzZSBwcm9jZXNzaW5nIGVuYWJsZWQgPSBubyAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJsb2NrIHN3aXRjaCBzeW50YXggZW5hYmxlZCA9IG5vICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGl0aGVyIGZsYWcgc3ludGF4IGVuYWJsZWQgPSBubyAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdCBhbGxvY2F0aW9uIG1vZGVsIHN5bnRheCBlbmFibGVkID0gbm8gKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmYXN0IGdhaW4gY29kZXMgZW5hYmxlZCA9IG5vICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGJhIHN5bnRheCBlbmFibGVkID0gbm8gKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIGZpZWxkIHN5bnRheCBlbmFibGVkID0gbm8gKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcHggZW5hYmxlZCA9IG5vICovCisgICAgLyogY291cGxpbmcgc3RyYXRlZ3kgdXNlIGZsYWdzICovCisgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA+IEFDM19DSE1PREVfTU9OTykgeworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmJsb2Nrc1swXS5jcGxfaW5fdXNlKTsKKyAgICAgICAgZm9yIChibGsgPSAxOyBibGsgPCBzLT5udW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICAgICAgQUMzQmxvY2sgKmJsb2NrID0gJnMtPmJsb2Nrc1tibGtdOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBibG9jay0+bmV3X2NwbF9zdHJhdGVneSk7CisgICAgICAgICAgICBpZiAoYmxvY2stPm5ld19jcGxfc3RyYXRlZ3kpCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBibG9jay0+Y3BsX2luX3VzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogZXhwb25lbnQgc3RyYXRlZ3kgKi8KKyAgICBpZiAocy0+dXNlX2ZyYW1lX2V4cF9zdHJhdGVneSkgeworICAgICAgICBmb3IgKGNoID0gIXMtPmNwbF9vbjsgY2ggPD0gcy0+ZmJ3X2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA1LCBzLT5mcmFtZV9leHBfc3RyYXRlZ3lbY2hdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGJsayA9IDA7IGJsayA8IHMtPm51bV9ibG9ja3M7IGJsaysrKQorICAgICAgICAgICAgZm9yIChjaCA9ICFzLT5ibG9ja3NbYmxrXS5jcGxfaW5fdXNlOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBzLT5leHBfc3RyYXRlZ3lbY2hdW2Jsa10pOworICAgIH0KKyAgICBpZiAocy0+bGZlX29uKSB7CisgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmV4cF9zdHJhdGVneVtzLT5sZmVfY2hhbm5lbF1bYmxrXSk7CisgICAgfQorICAgIC8qIEUtQUMtMyB0byBBQy0zIGNvbnZlcnRlciBleHBvbmVudCBzdHJhdGVneSAobm90IG9wdGlvbmFsIHdoZW4gbnVtIGJsb2NrcyA9PSA2KSAqLworICAgIGlmIChzLT5udW1fYmxvY2tzICE9IDYpIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsKKyAgICB9IGVsc2UgeworICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5mYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKHMtPnVzZV9mcmFtZV9leHBfc3RyYXRlZ3kpCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIHMtPmZyYW1lX2V4cF9zdHJhdGVneVtjaF0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIDApOworICAgIH0KKyAgICB9CisgICAgLyogc25yIG9mZnNldHMgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDYsIHMtPmNvYXJzZV9zbnJfb2Zmc2V0KTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDQsIHMtPmZpbmVfc25yX29mZnNldFsxXSk7CisgICAgLyogYmxvY2sgc3RhcnQgaW5mbyAqLworICAgIGlmIChzLT5udW1fYmxvY2tzID4gMSkKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsKK30KKworCitBVkNvZGVjIGZmX2VhYzNfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgID0gImVhYzMiLAorICAgIC5sb25nX25hbWUgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVRTQyBBLzUyIEUtQUMtMyIpLAorICAgIC50eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0VBQzMsCisgICAgLnByaXZfZGF0YV9zaXplICA9IHNpemVvZihBQzNFbmNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgID0gZmZfYWMzX2Zsb2F0X2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICAgPSBmZl9hYzNfZmxvYXRfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICAgPSBmZl9hYzNfZW5jb2RlX2Nsb3NlLAorICAgIC5zYW1wbGVfZm10cyAgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgICA9ICZlYWMzZW5jX2NsYXNzLAorICAgIC5jaGFubmVsX2xheW91dHMgPSBmZl9hYzNfY2hhbm5lbF9sYXlvdXRzLAorICAgIC5kZWZhdWx0cyAgICAgICAgPSBhYzNfZGVmYXVsdHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZWFjM2VuYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZWFjM2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjE1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9lYWMzZW5jLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIEUtQUMtMyBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRS1BQy0zIGVuY29kZXIKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRUFDM0VOQ19ICisjZGVmaW5lIEFWQ09ERUNfRUFDM0VOQ19ICisKKyNpbmNsdWRlICJhYzNlbmMuaCIKKworLyoqCisgKiBJbml0aWFsaXplIEUtQUMtMyBleHBvbmVudCB0YWJsZXMuCisgKi8KK3ZvaWQgZmZfZWFjM19leHBvbmVudF9pbml0KHZvaWQpOworCisvKioKKyAqIERldGVybWluZSBmcmFtZSBleHBvbmVudCBzdHJhdGVneSB1c2UgYW5kIGluZGljZXMuCisgKi8KK3ZvaWQgZmZfZWFjM19nZXRfZnJhbWVfZXhwX3N0cmF0ZWd5KEFDM0VuY29kZUNvbnRleHQgKnMpOworCisvKioKKyAqIFNldCBjb3VwbGluZyBzdGF0ZXMuCisgKiBUaGlzIGRldGVybWluZXMgd2hldGhlciBjZXJ0YWluIGZsYWdzIG11c3QgYmUgd3JpdHRlbiB0byB0aGUgYml0c3RyZWFtIG9yCisgKiB3aGV0aGVyIHRoZXkgd2lsbCBiZSBpbXBsaWNpdGx5IGFscmVhZHkga25vd24gYnkgdGhlIGRlY29kZXIuCisgKi8KK3ZvaWQgZmZfZWFjM19zZXRfY3BsX3N0YXRlcyhBQzNFbmNvZGVDb250ZXh0ICpzKTsKKworLyoqCisgKiBXcml0ZSB0aGUgRS1BQy0zIGZyYW1lIGhlYWRlciB0byB0aGUgb3V0cHV0IGJpdHN0cmVhbS4KKyAqLwordm9pZCBmZl9lYWMzX291dHB1dF9mcmFtZV9oZWFkZXIoQUMzRW5jb2RlQ29udGV4dCAqcyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0VBQzNFTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZWFjbXYuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2VhY212LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiN2M2OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2VhY212LmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBFbGVjdHJvbmljIEFydHMgQ01WIFZpZGVvIERlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEVsZWN0cm9uaWMgQXJ0cyBDTVYgVmlkZW8gRGVjb2RlcgorICogYnkgUGV0ZXIgUm9zcyAocHJvc3NAeHZpZC5vcmcpCisgKgorICogVGVjaG5pY2FsIGRldGFpbHMgaGVyZToKKyAqIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPUVsZWN0cm9uaWNfQXJ0c19DTVYKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ212Q29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRnJhbWUgKmxhc3RfZnJhbWU7ICAgLy8vPCBsYXN0CisgICAgQVZGcmFtZSAqbGFzdDJfZnJhbWU7ICAvLy88IHNlY29uZC1sYXN0CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgdW5zaWduZWQgaW50IHBhbGV0dGVbQVZQQUxFVFRFX0NPVU5UXTsKK30gQ212Q29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGNtdl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpeworICAgIENtdkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKworICAgIHMtPmxhc3RfZnJhbWUgID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBzLT5sYXN0Ml9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5sYXN0X2ZyYW1lIHx8ICFzLT5sYXN0Ml9mcmFtZSkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5sYXN0X2ZyYW1lKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdDJfZnJhbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbXZfZGVjb2RlX2ludHJhKENtdkNvbnRleHQgKiBzLCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpidWZfZW5kKQoreworICAgIHVuc2lnbmVkIGNoYXIgKmRzdCA9IGZyYW1lLT5kYXRhWzBdOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGkgPCBzLT5hdmN0eC0+aGVpZ2h0ICYmIGJ1Zl9lbmQgLSBidWYgPj0gcy0+YXZjdHgtPndpZHRoOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgYnVmLCBzLT5hdmN0eC0+d2lkdGgpOworICAgICAgICBkc3QgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBidWYgKz0gcy0+YXZjdHgtPndpZHRoOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY212X21vdGNvbXAodW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeG9mZnNldCwgaW50IHlvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpeworICAgIGludCBpLGo7CisKKyAgICBmb3Ioaj15O2o8eSs0O2orKykKKyAgICBmb3IoaT14O2k8eCs0O2krKykKKyAgICB7CisgICAgICAgIGlmIChpK3hvZmZzZXQ+PTAgJiYgaSt4b2Zmc2V0PHdpZHRoICYmCisgICAgICAgICAgICBqK3lvZmZzZXQ+PTAgJiYgait5b2Zmc2V0PGhlaWdodCkgeworICAgICAgICAgICAgZHN0W2oqZHN0X3N0cmlkZSArIGldID0gc3JjWyhqK3lvZmZzZXQpKnNyY19zdHJpZGUgKyBpK3hvZmZzZXRdOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGRzdFtqKmRzdF9zdHJpZGUgKyBpXSA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNtdl9kZWNvZGVfaW50ZXIoQ212Q29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmX2VuZCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpyYXcgPSBidWYgKyAocy0+YXZjdHgtPndpZHRoKnMtPmF2Y3R4LT5oZWlnaHQvMTYpOworICAgIGludCB4LHksaTsKKworICAgIGkgPSAwOworICAgIGZvcih5PTA7IHk8cy0+YXZjdHgtPmhlaWdodC80OyB5KyspCisgICAgZm9yKHg9MDsgeDxzLT5hdmN0eC0+d2lkdGgvNCAmJiBidWZfZW5kIC0gYnVmID4gaTsgeCsrKSB7CisgICAgICAgIGlmIChidWZbaV09PTB4RkYpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCA9IGZyYW1lLT5kYXRhWzBdICsgKHkqNCkqZnJhbWUtPmxpbmVzaXplWzBdICsgeCo0OworICAgICAgICAgICAgaWYgKHJhdysxNjxidWZfZW5kICYmICpyYXc9PTB4RkYpIHsgLyogaW50cmEgKi8KKyAgICAgICAgICAgICAgICByYXcrKzsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCByYXcsIDQpOworICAgICAgICAgICAgICAgIG1lbWNweShkc3QgKyAgICAgZnJhbWUtPmxpbmVzaXplWzBdLCByYXcrNCwgNCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCArIDIgKiBmcmFtZS0+bGluZXNpemVbMF0sIHJhdys4LCA0KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0ICsgMyAqIGZyYW1lLT5saW5lc2l6ZVswXSwgcmF3KzEyLCA0KTsKKyAgICAgICAgICAgICAgICByYXcrPTE2OworICAgICAgICAgICAgfWVsc2UgaWYocmF3PGJ1Zl9lbmQpIHsgIC8qIGludGVyIHVzaW5nIHNlY29uZC1sYXN0IGZyYW1lIGFzIHJlZmVyZW5jZSAqLworICAgICAgICAgICAgICAgIGludCB4b2Zmc2V0ID0gKCpyYXcgJiAweEYpIC0gNzsKKyAgICAgICAgICAgICAgICBpbnQgeW9mZnNldCA9ICgoKnJhdyA+PiA0KSkgLSA3OworICAgICAgICAgICAgICAgIGlmIChzLT5sYXN0Ml9mcmFtZS0+ZGF0YVswXSkKKyAgICAgICAgICAgICAgICAgICAgY212X21vdGNvbXAoZnJhbWUtPmRhdGFbMF0sIGZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdDJfZnJhbWUtPmRhdGFbMF0sIHMtPmxhc3QyX2ZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCo0LCB5KjQsIHhvZmZzZXQsIHlvZmZzZXQsIHMtPmF2Y3R4LT53aWR0aCwgcy0+YXZjdHgtPmhlaWdodCk7CisgICAgICAgICAgICAgICAgcmF3Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleyAgLyogaW50ZXIgdXNpbmcgbGFzdCBmcmFtZSBhcyByZWZlcmVuY2UgKi8KKyAgICAgICAgICAgIGludCB4b2Zmc2V0ID0gKGJ1ZltpXSAmIDB4RikgLSA3OworICAgICAgICAgICAgaW50IHlvZmZzZXQgPSAoKGJ1ZltpXSA+PiA0KSkgLSA3OworICAgICAgICAgICAgaWYgKHMtPmxhc3RfZnJhbWUtPmRhdGFbMF0pCisgICAgICAgICAgICAgICAgY212X21vdGNvbXAoZnJhbWUtPmRhdGFbMF0sIGZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X2ZyYW1lLT5kYXRhWzBdLCBzLT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4KjQsIHkqNCwgeG9mZnNldCwgeW9mZnNldCwgcy0+YXZjdHgtPndpZHRoLCBzLT5hdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNtdl9wcm9jZXNzX2hlYWRlcihDbXZDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQpCit7CisgICAgaW50IHBhbF9zdGFydCwgcGFsX2NvdW50LCBpLCByZXQsIGZwczsKKworICAgIGlmKGJ1Zl9lbmQgLSBidWYgPCAxNikgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAidHJ1bmNhdGVkIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPndpZHRoICA9IEFWX1JMMTYoJmJ1Zls0XSk7CisgICAgcy0+aGVpZ2h0ID0gQVZfUkwxNigmYnVmWzZdKTsKKworICAgIGlmIChzLT53aWR0aCAgIT0gcy0+YXZjdHgtPndpZHRoIHx8CisgICAgICAgIHMtPmhlaWdodCAhPSBzLT5hdmN0eC0+aGVpZ2h0KSB7CisgICAgICAgIGF2X2ZyYW1lX3VucmVmKHMtPmxhc3RfZnJhbWUpOworICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5sYXN0Ml9mcmFtZSk7CisgICAgfQorCisgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMocy0+YXZjdHgsIHMtPndpZHRoLCBzLT5oZWlnaHQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZnBzID0gQVZfUkwxNigmYnVmWzEwXSk7CisgICAgaWYgKGZwcyA+IDApCisgICAgICAgIHMtPmF2Y3R4LT5mcmFtZXJhdGUgPSAoQVZSYXRpb25hbCl7IGZwcywgMSB9OworCisgICAgcGFsX3N0YXJ0ID0gQVZfUkwxNigmYnVmWzEyXSk7CisgICAgcGFsX2NvdW50ID0gQVZfUkwxNigmYnVmWzE0XSk7CisKKyAgICBidWYgKz0gMTY7CisgICAgZm9yIChpPXBhbF9zdGFydDsgaTxwYWxfc3RhcnQrcGFsX2NvdW50ICYmIGk8QVZQQUxFVFRFX0NPVU5UICYmIGJ1Zl9lbmQgLSBidWYgPj0gMzsgaSsrKSB7CisgICAgICAgIHMtPnBhbGV0dGVbaV0gPSAweEZGVSA8PCAyNCB8IEFWX1JCMjQoYnVmKTsKKyAgICAgICAgYnVmICs9IDM7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRUFfUFJFQU1CTEVfU0laRSA4CisjZGVmaW5lIE1WSWhfVEFHIE1LVEFHKCdNJywgJ1YnLCAnSScsICdoJykKKworc3RhdGljIGludCBjbXZfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgQ212Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmX2VuZCA9IGJ1ZiArIGJ1Zl9zaXplOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPCBFQV9QUkVBTUJMRV9TSVpFKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChBVl9STDMyKGJ1Zik9PU1WSWhfVEFHfHxBVl9SQjMyKGJ1Zik9PU1WSWhfVEFHKSB7CisgICAgICAgIHVuc2lnbmVkIHNpemUgPSBBVl9STDMyKGJ1ZiArIDQpOworICAgICAgICByZXQgPSBjbXZfcHJvY2Vzc19oZWFkZXIocywgYnVmK0VBX1BSRUFNQkxFX1NJWkUsIGJ1Zl9lbmQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmIChzaXplID4gYnVmX2VuZCAtIGJ1ZiAtIEVBX1BSRUFNQkxFX1NJWkUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJ1ZiArPSBzaXplOworICAgIH0KKworICAgIGlmIChhdl9pbWFnZV9jaGVja19zaXplKHMtPndpZHRoLCBzLT5oZWlnaHQsIDAsIHMtPmF2Y3R4KSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG1lbWNweShmcmFtZS0+ZGF0YVsxXSwgcy0+cGFsZXR0ZSwgQVZQQUxFVFRFX1NJWkUpOworCisgICAgYnVmICs9IEVBX1BSRUFNQkxFX1NJWkU7CisgICAgaWYgKChidWZbMF0mMSkpIHsgIC8vIHN1YnR5cGUKKyAgICAgICAgY212X2RlY29kZV9pbnRlcihzLCBmcmFtZSwgYnVmKzIsIGJ1Zl9lbmQpOworICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMDsKKyAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgIH1lbHNleworICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBjbXZfZGVjb2RlX2ludHJhKHMsIGZyYW1lLCBidWYrMiwgYnVmX2VuZCk7CisgICAgfQorCisgICAgYXZfZnJhbWVfdW5yZWYocy0+bGFzdDJfZnJhbWUpOworICAgIGF2X2ZyYW1lX21vdmVfcmVmKHMtPmxhc3QyX2ZyYW1lLCBzLT5sYXN0X2ZyYW1lKTsKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihzLT5sYXN0X2ZyYW1lLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgY212X2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KXsKKyAgICBDbXZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmxhc3RfZnJhbWUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmxhc3QyX2ZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2VhY212X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImVhY212IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRWxlY3Ryb25pYyBBcnRzIENNViB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9DTVYsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENtdkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGNtdl9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBjbXZfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBjbXZfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZWFpZGN0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9lYWlkY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDg0MGYyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZWFpZGN0LmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIEVsZWN0cm9uaWMgQXJ0cyBUR1EvVFFJL01BRCBJRENUIGFsZ29yaXRobQorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggUGV0ZXIgUm9zcyA8cHJvc3NAeHZpZC5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEVsZWN0cm9uaWMgQXJ0cyBUR1EvVFFJL01BRCBJRENUIGFsZ29yaXRobQorICogQGF1dGhvciBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqLworCisjaW5jbHVkZSAiZWFpZGN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisjZGVmaW5lIEFTUVJUIDE4MSAvKiAoMS9zcXJ0KDIpKTw8OCAqLworI2RlZmluZSBBNCAgICA2NjkgLyogY29zKHBpLzgpKnNxcnQoMik8PDkgKi8KKyNkZWZpbmUgQTIgICAgMjc3IC8qIHNpbihwaS84KSpzcXJ0KDIpPDw5ICovCisjZGVmaW5lIEE1ICAgIDE5NiAvKiBzaW4ocGkvOCk8PDkgKi8KKworI2RlZmluZSBJRENUX1RSQU5TRk9STShkZXN0LHMwLHMxLHMyLHMzLHM0LHM1LHM2LHM3LGQwLGQxLGQyLGQzLGQ0LGQ1LGQ2LGQ3LG11bmdlLHNyYykge1wKKyAgICBjb25zdCBpbnQgYTEgPSAoc3JjKVtzMV0gKyAoc3JjKVtzN107IFwKKyAgICBjb25zdCBpbnQgYTcgPSAoc3JjKVtzMV0gLSAoc3JjKVtzN107IFwKKyAgICBjb25zdCBpbnQgYTUgPSAoc3JjKVtzNV0gKyAoc3JjKVtzM107IFwKKyAgICBjb25zdCBpbnQgYTMgPSAoc3JjKVtzNV0gLSAoc3JjKVtzM107IFwKKyAgICBjb25zdCBpbnQgYTIgPSAoc3JjKVtzMl0gKyAoc3JjKVtzNl07IFwKKyAgICBjb25zdCBpbnQgYTYgPSAoQVNRUlQqKChzcmMpW3MyXSAtIChzcmMpW3M2XSkpPj44OyBcCisgICAgY29uc3QgaW50IGEwID0gKHNyYylbczBdICsgKHNyYylbczRdOyBcCisgICAgY29uc3QgaW50IGE0ID0gKHNyYylbczBdIC0gKHNyYylbczRdOyBcCisgICAgY29uc3QgaW50IGIwID0gKCgoQTQtQTUpKmE3IC0gQTUqYTMpPj45KSArIGExK2E1OyBcCisgICAgY29uc3QgaW50IGIxID0gKCgoQTQtQTUpKmE3IC0gQTUqYTMpPj45KSArICgoQVNRUlQqKGExLWE1KSk+PjgpOyBcCisgICAgY29uc3QgaW50IGIyID0gKCgoQTIrQTUpKmEzICsgQTUqYTcpPj45KSArICgoQVNRUlQqKGExLWE1KSk+PjgpOyBcCisgICAgY29uc3QgaW50IGIzID0gICgoQTIrQTUpKmEzICsgQTUqYTcpPj45OyBcCisgICAgKGRlc3QpW2QwXSA9IG11bmdlKGEwK2EyK2E2K2IwKTsgXAorICAgIChkZXN0KVtkMV0gPSBtdW5nZShhNCthNiAgICtiMSk7IFwKKyAgICAoZGVzdClbZDJdID0gbXVuZ2UoYTQtYTYgICArYjIpOyBcCisgICAgKGRlc3QpW2QzXSA9IG11bmdlKGEwLWEyLWE2K2IzKTsgXAorICAgIChkZXN0KVtkNF0gPSBtdW5nZShhMC1hMi1hNi1iMyk7IFwKKyAgICAoZGVzdClbZDVdID0gbXVuZ2UoYTQtYTYgICAtYjIpOyBcCisgICAgKGRlc3QpW2Q2XSA9IG11bmdlKGE0K2E2ICAgLWIxKTsgXAorICAgIChkZXN0KVtkN10gPSBtdW5nZShhMCthMithNi1iMCk7IFwKK30KKy8qIGVuZCBJRENUX1RSQU5TRk9STSBtYWNybyAqLworCisjZGVmaW5lIE1VTkdFX05PTkUoeCkgKHgpCisjZGVmaW5lIElEQ1RfQ09MKGRlc3Qsc3JjKSBJRENUX1RSQU5TRk9STShkZXN0LDAsOCwxNiwyNCwzMiw0MCw0OCw1NiwwLDgsMTYsMjQsMzIsNDAsNDgsNTYsTVVOR0VfTk9ORSxzcmMpCisKKyNkZWZpbmUgTVVOR0VfOEJJVCh4KSBhdl9jbGlwX3VpbnQ4KCh4KT4+NCkKKyNkZWZpbmUgSURDVF9ST1coZGVzdCxzcmMpIElEQ1RfVFJBTlNGT1JNKGRlc3QsMCwxLDIsMyw0LDUsNiw3LDAsMSwyLDMsNCw1LDYsNyxNVU5HRV84QklULHNyYykKKworc3RhdGljIGlubGluZSB2b2lkIGVhX2lkY3RfY29sKGludDE2X3QgKmRlc3QsIGNvbnN0IGludDE2X3QgKnNyYykgeworICAgIGlmICgoc3JjWzhdfHNyY1sxNl18c3JjWzI0XXxzcmNbMzJdfHNyY1s0MF18c3JjWzQ4XXxzcmNbNTZdKT09MCkgeworICAgICAgICBkZXN0WzBdICA9CisgICAgICAgIGRlc3RbOF0gID0KKyAgICAgICAgZGVzdFsxNl0gPQorICAgICAgICBkZXN0WzI0XSA9CisgICAgICAgIGRlc3RbMzJdID0KKyAgICAgICAgZGVzdFs0MF0gPQorICAgICAgICBkZXN0WzQ4XSA9CisgICAgICAgIGRlc3RbNTZdID0gc3JjWzBdOworICAgIH1lbHNlCisgICAgICAgIElEQ1RfQ09MKGRlc3QsIHNyYyk7Cit9CisKK3ZvaWQgZmZfZWFfaWRjdF9wdXRfYyh1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKSB7CisgICAgaW50IGk7CisgICAgaW50MTZfdCB0ZW1wWzY0XTsKKyAgICBibG9ja1swXSArPSA0OworICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgZWFfaWRjdF9jb2woJnRlbXBbaV0sICZibG9ja1tpXSk7CisgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICBJRENUX1JPVyggKCZkZXN0W2kqbGluZXNpemVdKSwgKCZ0ZW1wWzgqaV0pICk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9lYWlkY3QuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2VhaWRjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOWVjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9lYWlkY3QuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0VBSURDVF9ICisjZGVmaW5lIEFWQ09ERUNfRUFJRENUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIGZmX2VhX2lkY3RfcHV0X2ModWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jayk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0VBSURDVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9lYW1hZC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZWFtYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTNhMmQxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZWFtYWQuYwpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIEVsZWN0cm9uaWMgQXJ0cyBNYWRjb3cgVmlkZW8gRGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDkgUGV0ZXIgUm9zcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRWxlY3Ryb25pYyBBcnRzIE1hZGNvdyBWaWRlbyBEZWNvZGVyCisgKiBAYXV0aG9yIFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICoKKyAqIEBzZWUgdGVjaG5pY2FsIGRldGFpbHMgYXQKKyAqIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPUVsZWN0cm9uaWNfQXJ0c19NQUQKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJic3dhcGRzcC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiYWFuZGN0dGFiLmgiCisjaW5jbHVkZSAiZWFpZGN0LmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXBlZzEyLmgiCisjaW5jbHVkZSAibXBlZzEyZGF0YS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorCisjZGVmaW5lIEVBX1BSRUFNQkxFX1NJWkUgICAgOAorI2RlZmluZSBNQURrX1RBRyBNS1RBRygnTScsICdBJywgJ0QnLCAnaycpICAgIC8qIE1BRCBpLWZyYW1lICovCisjZGVmaW5lIE1BRG1fVEFHIE1LVEFHKCdNJywgJ0EnLCAnRCcsICdtJykgICAgLyogTUFEIHAtZnJhbWUgKi8KKyNkZWZpbmUgTUFEZV9UQUcgTUtUQUcoJ00nLCAnQScsICdEJywgJ2UnKSAgICAvKiBNQUQgbHFwLWZyYW1lICovCisKK3R5cGVkZWYgc3RydWN0IE1hZENvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBCbG9ja0RTUENvbnRleHQgYmRzcDsKKyAgICBCc3dhcERTUENvbnRleHQgYmJkc3A7CisgICAgSURDVERTUENvbnRleHQgaWRzcDsKKyAgICBBVkZyYW1lICpsYXN0X2ZyYW1lOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgdm9pZCAqYml0c3RyZWFtX2J1ZjsKKyAgICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX2J1Zl9zaXplOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYmxvY2spWzY0XTsKKyAgICBTY2FuVGFibGUgc2NhbnRhYmxlOworICAgIHVpbnQxNl90IHF1YW50X21hdHJpeFs2NF07CisgICAgaW50IG1iX3g7CisgICAgaW50IG1iX3k7Cit9IE1hZENvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTWFkQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICBmZl9ibG9ja2RzcF9pbml0KCZzLT5iZHNwLCBhdmN0eCk7CisgICAgZmZfYnN3YXBkc3BfaW5pdCgmcy0+YmJkc3ApOworICAgIGZmX2lkY3Rkc3BfaW5pdCgmcy0+aWRzcCwgYXZjdHgpOworICAgIGZmX2luaXRfc2NhbnRhYmxlX3Blcm11dGF0aW9uKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgRkZfSURDVF9QRVJNX05PTkUpOworICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPnNjYW50YWJsZSwgZmZfemlnemFnX2RpcmVjdCk7CisgICAgZmZfbXBlZzEyX2luaXRfdmxjcygpOworCisgICAgcy0+bGFzdF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5sYXN0X2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21wKHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfc3RyaWRlLCBpbnQgYWRkKQoreworICAgIGludCBqLCBpOworICAgIGZvciAoaj0wOyBqPDg7IGorKykKKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICAgICAgZHN0W2oqZHN0X3N0cmlkZSArIGldID0gYXZfY2xpcF91aW50OChzcmNbaipzcmNfc3RyaWRlICsgaV0gKyBhZGQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29tcF9ibG9jayhNYWRDb250ZXh0ICp0LCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl94LCBpbnQgbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqLCBpbnQgbXZfeCwgaW50IG12X3ksIGludCBhZGQpCit7CisgICAgaWYgKGogPCA0KSB7CisgICAgICAgIHVuc2lnbmVkIG9mZnNldCA9IChtYl95KjE2ICsgKChqJjIpPDwyKSArIG12X3kpKnQtPmxhc3RfZnJhbWUtPmxpbmVzaXplWzBdICsgbWJfeCoxNiArICgoaiYxKTw8MykgKyBtdl94OworICAgICAgICBpZiAob2Zmc2V0ID49ICh0LT5hdmN0eC0+aGVpZ2h0IC0gNykgKiB0LT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVswXSAtIDcpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNvbXAoZnJhbWUtPmRhdGFbMF0gKyAobWJfeSoxNiArICgoaiYyKTw8MikpKmZyYW1lLT5saW5lc2l6ZVswXSArIG1iX3gqMTYgKyAoKGomMSk8PDMpLAorICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICB0LT5sYXN0X2ZyYW1lLT5kYXRhWzBdICsgb2Zmc2V0LAorICAgICAgICAgICAgIHQtPmxhc3RfZnJhbWUtPmxpbmVzaXplWzBdLCBhZGQpOworICAgIH0gZWxzZSBpZiAoISh0LT5hdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgIGludCBpbmRleCA9IGogLSAzOworICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSAobWJfeSAqIDggKyAobXZfeS8yKSkqdC0+bGFzdF9mcmFtZS0+bGluZXNpemVbaW5kZXhdICsgbWJfeCAqIDggKyAobXZfeC8yKTsKKyAgICAgICAgaWYgKG9mZnNldCA+PSAodC0+YXZjdHgtPmhlaWdodC8yIC0gNykgKiB0LT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVtpbmRleF0gLSA3KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjb21wKGZyYW1lLT5kYXRhW2luZGV4XSArIChtYl95KjgpKmZyYW1lLT5saW5lc2l6ZVtpbmRleF0gKyBtYl94ICogOCwKKyAgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbaW5kZXhdLAorICAgICAgICAgICAgIHQtPmxhc3RfZnJhbWUtPmRhdGFbaW5kZXhdICsgb2Zmc2V0LAorICAgICAgICAgICAgIHQtPmxhc3RfZnJhbWUtPmxpbmVzaXplW2luZGV4XSwgYWRkKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGN0X3B1dChNYWRDb250ZXh0ICp0LCBBVkZyYW1lICpmcmFtZSwgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3gsIGludCBtYl95LCBpbnQgaikKK3sKKyAgICBpZiAoaiA8IDQpIHsKKyAgICAgICAgZmZfZWFfaWRjdF9wdXRfYygKKyAgICAgICAgICAgIGZyYW1lLT5kYXRhWzBdICsgKG1iX3kqMTYgKyAoKGomMik8PDIpKSpmcmFtZS0+bGluZXNpemVbMF0gKyBtYl94KjE2ICsgKChqJjEpPDwzKSwKKyAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVswXSwgYmxvY2spOworICAgIH0gZWxzZSBpZiAoISh0LT5hdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgIGludCBpbmRleCA9IGogLSAzOworICAgICAgICBmZl9lYV9pZGN0X3B1dF9jKAorICAgICAgICAgICAgZnJhbWUtPmRhdGFbaW5kZXhdICsgKG1iX3kqOCkqZnJhbWUtPmxpbmVzaXplW2luZGV4XSArIG1iX3gqOCwKKyAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVtpbmRleF0sIGJsb2NrKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlY29kZV9ibG9ja19pbnRyYShNYWRDb250ZXh0ICpzLCBpbnQxNl90ICogYmxvY2spCit7CisgICAgaW50IGxldmVsLCBpLCBqLCBydW47CisgICAgUkxUYWJsZSAqcmwgPSAmZmZfcmxfbXBlZzE7CisgICAgY29uc3QgdWludDhfdCAqc2NhbnRhYmxlID0gcy0+c2NhbnRhYmxlLnBlcm11dGF0ZWQ7CisgICAgaW50MTZfdCAqcXVhbnRfbWF0cml4ID0gcy0+cXVhbnRfbWF0cml4OworCisgICAgYmxvY2tbMF0gPSAoMTI4ICsgZ2V0X3NiaXRzKCZzLT5nYiwgOCkpICogcXVhbnRfbWF0cml4WzBdOworCisgICAgLyogVGhlIFJMIGRlY29kZXIgaXMgZGVyaXZlZCBmcm9tIG1wZWcxX2RlY29kZV9ibG9ja19pbnRyYTsKKyAgICAgICBFc2NhcGVkIGxldmVsIGFuZCBydW4gdmFsdWVzIGEgZGVjb2RlZCBkaWZmZXJlbnRseSAqLworICAgIGkgPSAwOworICAgIHsKKyAgICAgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgICAgIC8qIG5vdyBxdWFudGlmeSAmIGVuY29kZSBBQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOworICAgICAgICAgICAgR0VUX1JMX1ZMQyhsZXZlbCwgcnVuLCByZSwgJnMtPmdiLCBybC0+cmxfdmxjWzBdLCBURVhfVkxDX0JJVFMsIDIsIDApOworCisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMTI3KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsICE9IDApIHsKKyAgICAgICAgICAgICAgICBpICs9IHJ1bjsKKyAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOworICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsKnF1YW50X21hdHJpeFtqXSkgPj4gNDsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbC0xKXwxOworICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIF4gU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKSkgLSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEwKTsgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEwKTsKKworICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBydW4gPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDYpKzE7IExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDYpOworCisgICAgICAgICAgICAgICAgaSArPSBydW47CisgICAgICAgICAgICAgICAgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCpxdWFudF9tYXRyaXhbal0pID4+IDQ7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsLTEpfDE7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsKnF1YW50X21hdHJpeFtqXSkgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwtMSl8MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA+IDYzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJhYy10ZXggZGFtYWdlZCBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsOworICAgICAgICB9CisgICAgICAgIENMT1NFX1JFQURFUihyZSwgJnMtPmdiKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX21vdGlvbihHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgdmFsdWUgPSAwOworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKQorICAgICAgICAgICAgdmFsdWUgPSAtMTc7CisgICAgICAgIHZhbHVlICs9IGdldF9iaXRzKGdiLCA0KSArIDE7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBkZWNvZGVfbWIoTWFkQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCBpbnRlcikKK3sKKyAgICBpbnQgbXZfbWFwID0gMDsKKyAgICBpbnQgYXZfdW5pbml0KG12X3gpLCBhdl91bmluaXQobXZfeSk7CisgICAgaW50IGo7CisKKyAgICBpZiAoaW50ZXIpIHsKKyAgICAgICAgaW50IHYgPSBkZWNvZGUyMTAoJnMtPmdiKTsKKyAgICAgICAgaWYgKHYgPCAyKSB7CisgICAgICAgICAgICBtdl9tYXAgPSB2ID8gZ2V0X2JpdHMoJnMtPmdiLCA2KSA6IDYzOworICAgICAgICAgICAgbXZfeCA9IGRlY29kZV9tb3Rpb24oJnMtPmdiKTsKKyAgICAgICAgICAgIG12X3kgPSBkZWNvZGVfbW90aW9uKCZzLT5nYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGo9MDsgajw2OyBqKyspIHsKKyAgICAgICAgaWYgKG12X21hcCAmICgxPDxqKSkgeyAgLy8gbXZfeCBhbmQgbXZfeSBhcmUgZ3VhcmRlZCBieSBtdl9tYXAKKyAgICAgICAgICAgIGludCBhZGQgPSAyKmRlY29kZV9tb3Rpb24oJnMtPmdiKTsKKyAgICAgICAgICAgIGlmIChzLT5sYXN0X2ZyYW1lLT5kYXRhWzBdKQorICAgICAgICAgICAgICAgIGNvbXBfYmxvY2socywgZnJhbWUsIHMtPm1iX3gsIHMtPm1iX3ksIGosIG12X3gsIG12X3ksIGFkZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5iZHNwLmNsZWFyX2Jsb2NrKHMtPmJsb2NrKTsKKyAgICAgICAgICAgIGlmKGRlY29kZV9ibG9ja19pbnRyYShzLCBzLT5ibG9jaykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlkY3RfcHV0KHMsIGZyYW1lLCBzLT5ibG9jaywgcy0+bWJfeCwgcy0+bWJfeSwgaik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfcXVhbnRfbWF0cml4KE1hZENvbnRleHQgKnMsIGludCBxc2NhbGUpCit7CisgICAgaW50IGk7CisKKyAgICBzLT5xdWFudF9tYXRyaXhbMF0gPSAoZmZfaW52X2FhbnNjYWxlc1swXSpmZl9tcGVnMV9kZWZhdWx0X2ludHJhX21hdHJpeFswXSkgPj4gMTE7CisgICAgZm9yIChpPTE7IGk8NjQ7IGkrKykKKyAgICAgICAgcy0+cXVhbnRfbWF0cml4W2ldID0gKGZmX2ludl9hYW5zY2FsZXNbaV0qZmZfbXBlZzFfZGVmYXVsdF9pbnRyYV9tYXRyaXhbaV0qcXNjYWxlICsgMzIpID4+IDEwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBNYWRDb250ZXh0ICpzICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgPSBkYXRhOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBjaHVua190eXBlOworICAgIGludCBpbnRlciwgcmV0OworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGJ1ZiwgYnVmX3NpemUpOworCisgICAgY2h1bmtfdHlwZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgaW50ZXIgPSAoY2h1bmtfdHlwZSA9PSBNQURtX1RBRyB8fCBjaHVua190eXBlID09IE1BRGVfVEFHKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgMTApOworCisgICAgYXZfcmVkdWNlKCZhdmN0eC0+ZnJhbWVyYXRlLmRlbiwgJmF2Y3R4LT5mcmFtZXJhdGUubnVtLAorICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpLCAxMDAwLCAxPDwzMCk7CisKKyAgICB3aWR0aCAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpOworICAgIGhlaWdodCA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnYik7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDEpOworICAgIGNhbGNfcXVhbnRfbWF0cml4KHMsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYikpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAyKTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIklucHV0IGRhdGEgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHdpZHRoIDwgMTYgfHwgaGVpZ2h0IDwgMTYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEaW1lbnNpb25zIHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChhdmN0eC0+d2lkdGggIT0gd2lkdGggfHwgYXZjdHgtPmhlaWdodCAhPSBoZWlnaHQpIHsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+bGFzdF9mcmFtZSk7CisgICAgICAgIGlmKCh3aWR0aCAqIGhlaWdodCkvMjA0OCo3ID4gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAoKHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCB3aWR0aCwgaGVpZ2h0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGludGVyICYmICFzLT5sYXN0X2ZyYW1lLT5kYXRhWzBdKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJNaXNzaW5nIHJlZmVyZW5jZSBmcmFtZS5cbiIpOworICAgICAgICByZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBzLT5sYXN0X2ZyYW1lLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBtZW1zZXQocy0+bGFzdF9mcmFtZS0+ZGF0YVswXSwgMCwgcy0+bGFzdF9mcmFtZS0+aGVpZ2h0ICoKKyAgICAgICAgICAgICAgIHMtPmxhc3RfZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgbWVtc2V0KHMtPmxhc3RfZnJhbWUtPmRhdGFbMV0sIDB4ODAsIHMtPmxhc3RfZnJhbWUtPmhlaWdodCAvIDIgKgorICAgICAgICAgICAgICAgcy0+bGFzdF9mcmFtZS0+bGluZXNpemVbMV0pOworICAgICAgICBtZW1zZXQocy0+bGFzdF9mcmFtZS0+ZGF0YVsyXSwgMHg4MCwgcy0+bGFzdF9mcmFtZS0+aGVpZ2h0IC8gMiAqCisgICAgICAgICAgICAgICBzLT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVsyXSk7CisgICAgfQorCisgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZzLT5iaXRzdHJlYW1fYnVmLCAmcy0+Yml0c3RyZWFtX2J1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpKTsKKyAgICBpZiAoIXMtPmJpdHN0cmVhbV9idWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcy0+YmJkc3AuYnN3YXAxNl9idWYocy0+Yml0c3RyZWFtX2J1ZiwgKGNvbnN0IHVpbnQxNl90ICopKGJ1ZiArIGJ5dGVzdHJlYW0yX3RlbGwoJmdiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSAvIDIpOworICAgIG1lbXNldCgodWludDhfdCopcy0+Yml0c3RyZWFtX2J1ZiArIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYiksIDAsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBzLT5iaXRzdHJlYW1fYnVmLCA4KihieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpKSk7CisKKyAgICBmb3IgKHMtPm1iX3k9MDsgcy0+bWJfeSA8IChhdmN0eC0+aGVpZ2h0KzE1KS8xNjsgcy0+bWJfeSsrKQorICAgICAgICBmb3IgKHMtPm1iX3g9MDsgcy0+bWJfeCA8IChhdmN0eC0+d2lkdGggKzE1KS8xNjsgcy0+bWJfeCsrKQorICAgICAgICAgICAgaWYoZGVjb2RlX21iKHMsIGZyYW1lLCBpbnRlcikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICBpZiAoY2h1bmtfdHlwZSAhPSBNQURlX1RBRykgeworICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5sYXN0X2ZyYW1lKTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYocy0+bGFzdF9mcmFtZSwgZnJhbWUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1hZENvbnRleHQgKnQgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGF2X2ZyYW1lX2ZyZWUoJnQtPmxhc3RfZnJhbWUpOworICAgIGF2X2ZyZWVwKCZ0LT5iaXRzdHJlYW1fYnVmKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9lYW1hZF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJlYW1hZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkVsZWN0cm9uaWMgQXJ0cyBNYWRjb3cgVmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTUFELAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNYWRDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2VhdGdxLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9lYXRncS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MWRjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9lYXRncS5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogRWxlY3Ryb25pYyBBcnRzIFRHUSBWaWRlbyBEZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEVsZWN0cm9uaWMgQXJ0cyBUR1EgVmlkZW8gRGVjb2RlcgorICogQGF1dGhvciBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqCisgKiBUZWNobmljYWwgZGV0YWlscyBoZXJlOgorICogaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9RWxlY3Ryb25pY19BcnRzX1RHUQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAiYWFuZGN0dGFiLmgiCisjaW5jbHVkZSAiZWFpZGN0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVGdxQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIFNjYW5UYWJsZSBzY2FudGFibGU7CisgICAgaW50IHF0YWJsZVs2NF07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBibG9jaylbNl1bNjRdOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworfSBUZ3FDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgdGdxX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBUZ3FDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90IGlkY3RfcGVybXV0YXRpb25bNjRdOworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgZmZfaW5pdF9zY2FudGFibGVfcGVybXV0YXRpb24oaWRjdF9wZXJtdXRhdGlvbiwgRkZfSURDVF9QRVJNX05PTkUpOworICAgIGZmX2luaXRfc2NhbnRhYmxlKGlkY3RfcGVybXV0YXRpb24sICZzLT5zY2FudGFibGUsIGZmX3ppZ3phZ19kaXJlY3QpOworICAgIGF2Y3R4LT5mcmFtZXJhdGUgPSAoQVZSYXRpb25hbCl7IDE1LCAxIH07CisgICAgYXZjdHgtPnBpeF9mbXQgICA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGdxX2RlY29kZV9ibG9jayhUZ3FDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzY0XSwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgdWludDhfdCAqcGVybSA9IHMtPnNjYW50YWJsZS5wZXJtdXRhdGVkOworICAgIGludCBpLCBqLCB2YWx1ZTsKKyAgICBibG9ja1swXSA9IGdldF9zYml0cyhnYiwgOCkgKiBzLT5xdGFibGVbMF07CisgICAgZm9yIChpID0gMTsgaSA8IDY0OykgeworICAgICAgICBzd2l0Y2ggKHNob3dfYml0cyhnYiwgMykpIHsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgYmxvY2tbcGVybVtpKytdXSA9IDA7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGJsb2NrW3Blcm1baSsrXV0gPSAwOworICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMik7CisgICAgICAgICAgICB2YWx1ZSA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB2YWx1ZTsgaisrKQorICAgICAgICAgICAgICAgIGJsb2NrW3Blcm1baSsrXV0gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMyk7CisgICAgICAgICAgICBibG9ja1twZXJtW2ldXSA9IC1zLT5xdGFibGVbcGVybVtpXV07CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAzKTsKKyAgICAgICAgICAgIGJsb2NrW3Blcm1baV1dID0gcy0+cXRhYmxlW3Blcm1baV1dOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzogLy8gMTExYgorICAgICAgICBjYXNlIDM6IC8vIDAxMWIKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMik7CisgICAgICAgICAgICBpZiAoc2hvd19iaXRzKGdiLCA2KSA9PSAweDNGKSB7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA2KTsKKyAgICAgICAgICAgICAgICBibG9ja1twZXJtW2ldXSA9IGdldF9zYml0cyhnYiwgOCkgKiBzLT5xdGFibGVbcGVybVtpXV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJsb2NrW3Blcm1baV1dID0gZ2V0X3NiaXRzKGdiLCA2KSAqIHMtPnF0YWJsZVtwZXJtW2ldXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGJsb2NrWzBdICs9IDEyOCA8PCA0OworfQorCitzdGF0aWMgdm9pZCB0Z3FfaWRjdF9wdXRfbWIoVGdxQ29udGV4dCAqcywgaW50MTZfdCAoKmJsb2NrKVs2NF0sIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl94LCBpbnQgbWJfeSkKK3sKKyAgICBpbnQgbGluZXNpemUgPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgdWludDhfdCAqZGVzdF95ICA9IGZyYW1lLT5kYXRhWzBdICsgKG1iX3kgKiAxNiAqIGxpbmVzaXplKSAgICAgICAgICAgKyBtYl94ICogMTY7CisgICAgdWludDhfdCAqZGVzdF9jYiA9IGZyYW1lLT5kYXRhWzFdICsgKG1iX3kgKiA4ICAqIGZyYW1lLT5saW5lc2l6ZVsxXSkgKyBtYl94ICogODsKKyAgICB1aW50OF90ICpkZXN0X2NyID0gZnJhbWUtPmRhdGFbMl0gKyAobWJfeSAqIDggICogZnJhbWUtPmxpbmVzaXplWzJdKSArIG1iX3ggKiA4OworCisgICAgZmZfZWFfaWRjdF9wdXRfYyhkZXN0X3kgICAgICAgICAgICAgICAgICAgLCBsaW5lc2l6ZSwgYmxvY2tbMF0pOworICAgIGZmX2VhX2lkY3RfcHV0X2MoZGVzdF95ICAgICAgICAgICAgICAgICsgOCwgbGluZXNpemUsIGJsb2NrWzFdKTsKKyAgICBmZl9lYV9pZGN0X3B1dF9jKGRlc3RfeSArIDggKiBsaW5lc2l6ZSAgICAsIGxpbmVzaXplLCBibG9ja1syXSk7CisgICAgZmZfZWFfaWRjdF9wdXRfYyhkZXN0X3kgKyA4ICogbGluZXNpemUgKyA4LCBsaW5lc2l6ZSwgYmxvY2tbM10pOworICAgIGlmICghKHMtPmF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgIGZmX2VhX2lkY3RfcHV0X2MoZGVzdF9jYiwgZnJhbWUtPmxpbmVzaXplWzFdLCBibG9ja1s0XSk7CisgICAgICAgICBmZl9lYV9pZGN0X3B1dF9jKGRlc3RfY3IsIGZyYW1lLT5saW5lc2l6ZVsyXSwgYmxvY2tbNV0pOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRncV9kY29ubHkoVGdxQ29udGV4dCAqcywgdW5zaWduZWQgY2hhciAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUsIGludCBkYykKK3sKKyAgICBpbnQgbGV2ZWwgPSBhdl9jbGlwX3VpbnQ4KChkYypzLT5xdGFibGVbMF0gKyAyMDU2KSA+PiA0KTsKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICBtZW1zZXQoZHN0ICsgaiAqIGRzdF9zdHJpZGUsIGxldmVsLCA4KTsKK30KKworc3RhdGljIHZvaWQgdGdxX2lkY3RfcHV0X21iX2Rjb25seShUZ3FDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3gsIGludCBtYl95LCBjb25zdCBpbnQ4X3QgKmRjKQoreworICAgIGludCBsaW5lc2l6ZSA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB1aW50OF90ICpkZXN0X3kgID0gZnJhbWUtPmRhdGFbMF0gKyAobWJfeSAqIDE2ICogbGluZXNpemUpICAgICAgICAgICAgICsgbWJfeCAqIDE2OworICAgIHVpbnQ4X3QgKmRlc3RfY2IgPSBmcmFtZS0+ZGF0YVsxXSArIChtYl95ICogOCAgKiBmcmFtZS0+bGluZXNpemVbMV0pICsgbWJfeCAqIDg7CisgICAgdWludDhfdCAqZGVzdF9jciA9IGZyYW1lLT5kYXRhWzJdICsgKG1iX3kgKiA4ICAqIGZyYW1lLT5saW5lc2l6ZVsyXSkgKyBtYl94ICogODsKKyAgICB0Z3FfZGNvbmx5KHMsIGRlc3RfeSwgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplLCBkY1swXSk7CisgICAgdGdxX2Rjb25seShzLCBkZXN0X3kgICAgICAgICAgICAgICAgKyA4LCBsaW5lc2l6ZSwgZGNbMV0pOworICAgIHRncV9kY29ubHkocywgZGVzdF95ICsgOCAqIGxpbmVzaXplLCAgICAgbGluZXNpemUsIGRjWzJdKTsKKyAgICB0Z3FfZGNvbmx5KHMsIGRlc3RfeSArIDggKiBsaW5lc2l6ZSArIDgsIGxpbmVzaXplLCBkY1szXSk7CisgICAgaWYgKCEocy0+YXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkgeworICAgICAgICB0Z3FfZGNvbmx5KHMsIGRlc3RfY2IsIGZyYW1lLT5saW5lc2l6ZVsxXSwgZGNbNF0pOworICAgICAgICB0Z3FfZGNvbmx5KHMsIGRlc3RfY3IsIGZyYW1lLT5saW5lc2l6ZVsyXSwgZGNbNV0pOworICAgIH0KK30KKworc3RhdGljIGludCB0Z3FfZGVjb2RlX21iKFRncUNvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lLCBpbnQgbWJfeSwgaW50IG1iX3gpCit7CisgICAgaW50IG1vZGU7CisgICAgaW50IGk7CisgICAgaW50OF90IGRjWzZdOworCisgICAgbW9kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgaWYgKG1vZGUgPiAxMikgeworICAgICAgICBHZXRCaXRDb250ZXh0IGdiOworICAgICAgICBpbml0X2dldF9iaXRzOCgmZ2IsIHMtPmdiLmJ1ZmZlciwgRkZNSU4oYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSwgbW9kZSkpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgdGdxX2RlY29kZV9ibG9jayhzLCBzLT5ibG9ja1tpXSwgJmdiKTsKKyAgICAgICAgdGdxX2lkY3RfcHV0X21iKHMsIHMtPmJsb2NrLCBmcmFtZSwgbWJfeCwgbWJfeSk7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCBtb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobW9kZSA9PSAzKSB7CisgICAgICAgICAgICBtZW1zZXQoZGMsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYiksIDQpOworICAgICAgICAgICAgZGNbNF0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICAgICAgZGNbNV0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gNikgeworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcy0+Z2IsIGRjLCA2KTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEyKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGNbaV0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgbWIgbW9kZSAlaVxuIiwgbW9kZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdGdxX2lkY3RfcHV0X21iX2Rjb25seShzLCBmcmFtZSwgbWJfeCwgbWJfeSwgZGMpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGdxX2NhbGN1bGF0ZV9xdGFibGUoVGdxQ29udGV4dCAqcywgaW50IHF1YW50KQoreworICAgIGludCBpLCBqOworICAgIGNvbnN0IGludCBhID0gKDE0ICogKDEwMCAtIHF1YW50KSkgLyAxMDAgKyAxOworICAgIGNvbnN0IGludCBiID0gKDExICogKDEwMCAtIHF1YW50KSkgLyAxMDAgKyA0OworICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBzLT5xdGFibGVbaiAqIDggKyBpXSA9ICgoYSAqIChqICsgaSkgLyAoNyArIDcpICsgYikgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaW52X2FhbnNjYWxlc1tqICogOCArIGldKSA+PiAoMTQgLSA0KTsKK30KKworc3RhdGljIGludCB0Z3FfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgVGdxQ29udGV4dCAqcyAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGludCB4LCB5LCByZXQ7CisgICAgaW50IGJpZ19lbmRpYW47CisKKyAgICBpZiAoYnVmX3NpemUgPCAxNikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAidHJ1bmNhdGVkIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBiaWdfZW5kaWFuID0gQVZfUkwzMigmYnVmWzRdKSA+IDB4MDAwRkZGRkY7CisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+Z2IsIGJ1ZiArIDgsIGJ1Zl9zaXplIC0gOCk7CisgICAgaWYgKGJpZ19lbmRpYW4pIHsKKyAgICAgICAgcy0+d2lkdGggID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZzLT5nYik7CisgICAgICAgIHMtPmhlaWdodCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmcy0+Z2IpOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPndpZHRoICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmcy0+Z2IpOworICAgICAgICBzLT5oZWlnaHQgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJnMtPmdiKTsKKyAgICB9CisKKyAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhzLT5hdmN0eCwgcy0+d2lkdGgsIHMtPmhlaWdodCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICB0Z3FfY2FsY3VsYXRlX3F0YWJsZShzLCBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKSk7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIDMpOworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICBmcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgRkZBTElHTihhdmN0eC0+aGVpZ2h0LCAxNikgPj4gNDsgeSsrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgRkZBTElHTihhdmN0eC0+d2lkdGgsIDE2KSA+PiA0OyB4KyspCisgICAgICAgICAgICBpZiAodGdxX2RlY29kZV9tYihzLCBmcmFtZSwgeSwgeCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfZWF0Z3FfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZWF0Z3EiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJFbGVjdHJvbmljIEFydHMgVEdRIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1RHUSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVGdxQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdGdxX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IHRncV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9lYXRndi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZWF0Z3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQzZDFkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZWF0Z3YuYwpAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIEVsZWN0cm9uaWMgQXJ0cyBUR1YgVmlkZW8gRGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggUGV0ZXIgUm9zcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRWxlY3Ryb25pYyBBcnRzIFRHViBWaWRlbyBEZWNvZGVyCisgKiBieSBQZXRlciBSb3NzIChwcm9zc0B4dmlkLm9yZykKKyAqCisgKiBUZWNobmljYWwgZGV0YWlscyBoZXJlOgorICogaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9RWxlY3Ryb25pY19BcnRzX1RHVgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjZGVmaW5lIEVBX1BSRUFNQkxFX1NJWkUgICAgOAorI2RlZmluZSBrVkdUX1RBRyBNS1RBRygnaycsICdWJywgJ0cnLCAnVCcpCisKK3R5cGVkZWYgc3RydWN0IFRndkNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBVkZyYW1lICpsYXN0X2ZyYW1lOworICAgIHVpbnQ4X3QgKmZyYW1lX2J1ZmZlcjsKKyAgICBpbnQgd2lkdGgsaGVpZ2h0OworICAgIHVpbnQzMl90IHBhbGV0dGVbQVZQQUxFVFRFX0NPVU5UXTsKKworICAgIGludCAoKm12X2NvZGVib29rKVsyXTsKKyAgICB1aW50OF90ICgqYmxvY2tfY29kZWJvb2spWzE2XTsKKyAgICBpbnQgbnVtX212czsgICAgICAgICAgIC8vLzwgY3VycmVudCBsZW5ndGggb2YgbXZfY29kZWJvb2sKKyAgICBpbnQgbnVtX2Jsb2Nrc19wYWNrZWQ7IC8vLzwgY3VycmVudCBsZW5ndGggb2YgYmxvY2tfY29kZWJvb2sKK30gVGd2Q29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IHRndl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVGd2Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcy0+YXZjdHggICAgICAgICA9IGF2Y3R4OworICAgIGF2Y3R4LT5mcmFtZXJhdGUgPSAoQVZSYXRpb25hbCl7IDE1LCAxIH07CisgICAgYXZjdHgtPnBpeF9mbXQgICA9IEFWX1BJWF9GTVRfUEFMODsKKworICAgIHMtPmxhc3RfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+bGFzdF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFVucGFjayBidWZmZXIKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBjcml0aWNhbCBidWZmZXIgdW5kZXJmbG93CisgKi8KK3N0YXRpYyBpbnQgdW5wYWNrKGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqc3JjX2VuZCwKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIHVpbnQ4X3QgKmRzdF9lbmQgPSBkc3QgKyB3aWR0aCpoZWlnaHQ7CisgICAgaW50IHNpemUsIHNpemUxLCBzaXplMiwgb2Zmc2V0LCBydW47CisgICAgdWludDhfdCAqZHN0X3N0YXJ0ID0gZHN0OworCisgICAgaWYgKHNyY1swXSAmIDB4MDEpCisgICAgICAgIHNyYyArPSA1OworICAgIGVsc2UKKyAgICAgICAgc3JjICs9IDI7CisKKyAgICBpZiAoc3JjX2VuZCAtIHNyYyA8IDMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHNpemUgPSBBVl9SQjI0KHNyYyk7CisgICAgc3JjICs9IDM7CisKKyAgICB3aGlsZSAoc2l6ZSA+IDAgJiYgc3JjIDwgc3JjX2VuZCkgeworCisgICAgICAgIC8qIGRldGVybWluZSBzaXplMSBhbmQgc2l6ZTIgKi8KKyAgICAgICAgc2l6ZTEgPSAoc3JjWzBdICYgMyk7CisgICAgICAgIGlmIChzcmNbMF0gJiAweDgwKSB7ICAvLyAxCisgICAgICAgICAgICBpZiAoc3JjWzBdICYgMHg0MCApIHsgIC8vIDExCisgICAgICAgICAgICAgICAgaWYgKHNyY1swXSAmIDB4MjApIHsgIC8vIDExMQorICAgICAgICAgICAgICAgICAgICBpZiAoc3JjWzBdIDwgMHhGQykgIC8vICEoMTExMTExKQorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTEgPSAoKChzcmNbMF0gJiAzMSkgKyAxKSA8PCAyKTsKKyAgICAgICAgICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICAgICAgICAgIHNpemUyID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gMTEwCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9ICgoc3JjWzBdICYgMHgxMCkgPDwgMTIpICsgQVZfUkIxNigmc3JjWzFdKSArIDE7CisgICAgICAgICAgICAgICAgICAgIHNpemUyICA9ICgoc3JjWzBdICYgMHhDKSA8PCA2KSArIHNyY1szXSArIDU7CisgICAgICAgICAgICAgICAgICAgIHNyYyAgICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgIC8vIDEwCisgICAgICAgICAgICAgICAgc2l6ZTEgID0gKChzcmNbMV0gJiAweEMwKSA+PiA2KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAoQVZfUkIxNigmc3JjWzFdKSAmIDB4M0ZGRikgKyAxOworICAgICAgICAgICAgICAgIHNpemUyICA9IChzcmNbMF0gJiAweDNGKSArIDQ7CisgICAgICAgICAgICAgICAgc3JjICAgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgIC8vIDAKKyAgICAgICAgICAgIG9mZnNldCA9ICgoc3JjWzBdICYgMHg2MCkgPDwgMykgKyBzcmNbMV0gKyAxOworICAgICAgICAgICAgc2l6ZTIgID0gKChzcmNbMF0gJiAweDFDKSA+PiAyKSArIDM7CisgICAgICAgICAgICBzcmMgICArPSAyOworICAgICAgICB9CisKKworICAgICAgICAvKiBmZXRjaCBzdHJpcCBmcm9tIHNyYyAqLworICAgICAgICBpZiAoc2l6ZTEgPiBzcmNfZW5kIC0gc3JjKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKHNpemUxID4gMCkgeworICAgICAgICAgICAgc2l6ZSAtPSBzaXplMTsKKyAgICAgICAgICAgIHJ1biAgID0gRkZNSU4oc2l6ZTEsIGRzdF9lbmQgLSBkc3QpOworICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBydW4pOworICAgICAgICAgICAgZHN0ICs9IHJ1bjsKKyAgICAgICAgICAgIHNyYyArPSBydW47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2l6ZTIgPiAwKSB7CisgICAgICAgICAgICBpZiAoZHN0IC0gZHN0X3N0YXJ0IDwgb2Zmc2V0KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgc2l6ZSAtPSBzaXplMjsKKyAgICAgICAgICAgIHJ1biAgID0gRkZNSU4oc2l6ZTIsIGRzdF9lbmQgLSBkc3QpOworICAgICAgICAgICAgYXZfbWVtY3B5X2JhY2twdHIoZHN0LCBvZmZzZXQsIHJ1bik7CisgICAgICAgICAgICBkc3QgKz0gcnVuOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVjb2RlIGludGVyLWZyYW1lCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gY3JpdGljYWwgYnVmZmVyIHVuZGVyZmxvdworICovCitzdGF0aWMgaW50IHRndl9kZWNvZGVfaW50ZXIoVGd2Q29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpidWZfZW5kKQoreworICAgIGludCBudW1fbXZzOworICAgIGludCBudW1fYmxvY2tzX3JhdzsKKyAgICBpbnQgbnVtX2Jsb2Nrc19wYWNrZWQ7CisgICAgaW50IHZlY3Rvcl9iaXRzOworICAgIGludCBpLGoseCx5OworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IG12Yml0czsKKyAgICBjb25zdCB1aW50OF90ICpibG9ja3NfcmF3OworCisgICAgaWYoYnVmX2VuZCAtIGJ1ZiA8IDEyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIG51bV9tdnMgICAgICAgICAgID0gQVZfUkwxNigmYnVmWzBdKTsKKyAgICBudW1fYmxvY2tzX3JhdyAgICA9IEFWX1JMMTYoJmJ1ZlsyXSk7CisgICAgbnVtX2Jsb2Nrc19wYWNrZWQgPSBBVl9STDE2KCZidWZbNF0pOworICAgIHZlY3Rvcl9iaXRzICAgICAgID0gQVZfUkwxNigmYnVmWzZdKTsKKyAgICBidWYgKz0gMTI7CisKKyAgICBpZiAodmVjdG9yX2JpdHMgPiBNSU5fQ0FDSEVfQklUUyB8fCAhdmVjdG9yX2JpdHMpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBmb3IgbW90aW9uIHZlY3RvciBiaXRzOiAlZFxuIiwgdmVjdG9yX2JpdHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBjb2RlYm9vayBidWZmZXJzIGFzIG5lY2Vzc2FyeSAqLworICAgIGlmIChudW1fbXZzID4gcy0+bnVtX212cykgeworICAgICAgICBpZiAoYXZfcmVhbGxvY3BfYXJyYXkoJnMtPm12X2NvZGVib29rLCBudW1fbXZzLCBzaXplb2YoKnMtPm12X2NvZGVib29rKSkpIHsKKyAgICAgICAgICAgIHMtPm51bV9tdnMgPSAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBzLT5udW1fbXZzID0gbnVtX212czsKKyAgICB9CisKKyAgICBpZiAobnVtX2Jsb2Nrc19wYWNrZWQgPiBzLT5udW1fYmxvY2tzX3BhY2tlZCkgeworICAgICAgICBpbnQgZXJyOworICAgICAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZzLT5ibG9ja19jb2RlYm9vaywgbnVtX2Jsb2Nrc19wYWNrZWQgKiAxNikpIDwgMCkgeworICAgICAgICAgICAgcy0+bnVtX2Jsb2Nrc19wYWNrZWQgPSAwOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBzLT5udW1fYmxvY2tzX3BhY2tlZCA9IG51bV9ibG9ja3NfcGFja2VkOworICAgIH0KKworICAgIC8qIHJlYWQgbW90aW9uIHZlY3RvcnMgKi8KKyAgICBtdmJpdHMgPSAobnVtX212cyAqIDIgKiAxMCArIDMxKSAmIH4zMTsKKworICAgIGlmIChidWZfZW5kIC0gYnVmIDwgKG12Yml0cz4+MykgKyAxNipudW1fYmxvY2tzX3JhdyArIDgqbnVtX2Jsb2Nrc19wYWNrZWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgbXZiaXRzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX212czsgaSsrKSB7CisgICAgICAgIHMtPm12X2NvZGVib29rW2ldWzBdID0gZ2V0X3NiaXRzKCZnYiwgMTApOworICAgICAgICBzLT5tdl9jb2RlYm9va1tpXVsxXSA9IGdldF9zYml0cygmZ2IsIDEwKTsKKyAgICB9CisgICAgYnVmICs9IG12Yml0cyA+PiAzOworCisgICAgLyogbm90ZSBwdHIgdG8gdW5jb21wcmVzc2VkIGJsb2NrcyAqLworICAgIGJsb2Nrc19yYXcgPSBidWY7CisgICAgYnVmICAgICAgICs9IG51bV9ibG9ja3NfcmF3ICogMTY7CisKKyAgICAvKiByZWFkIGNvbXByZXNzZWQgYmxvY2tzICovCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgKGJ1Zl9lbmQgLSBidWYpIDw8IDMpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzX3BhY2tlZDsgaSsrKSB7CisgICAgICAgIGludCB0bXBbNF07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB0bXBbal0gPSBnZXRfYml0cygmZ2IsIDgpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgIHMtPmJsb2NrX2NvZGVib29rW2ldWzE1LWpdID0gdG1wW2dldF9iaXRzKCZnYiwgMildOworICAgIH0KKworICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPCB2ZWN0b3JfYml0cyAqCisgICAgICAgIChzLT5hdmN0eC0+aGVpZ2h0IC8gNCkgKiAocy0+YXZjdHgtPndpZHRoIC8gNCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLyogcmVhZCB2ZWN0b3JzIGFuZCBidWlsZCBmcmFtZSAqLworICAgIGZvciAoeSA9IDA7IHkgPCBzLT5hdmN0eC0+aGVpZ2h0IC8gNDsgeSsrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+YXZjdHgtPndpZHRoIC8gNDsgeCsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmVjdG9yID0gZ2V0X2JpdHMoJmdiLCB2ZWN0b3JfYml0cyk7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmM7CisgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZTsKKworICAgICAgICAgICAgaWYgKHZlY3RvciA8IG51bV9tdnMpIHsKKyAgICAgICAgICAgICAgICBpbnQgbXggPSB4ICogNCArIHMtPm12X2NvZGVib29rW3ZlY3Rvcl1bMF07CisgICAgICAgICAgICAgICAgaW50IG15ID0geSAqIDQgKyBzLT5tdl9jb2RlYm9va1t2ZWN0b3JdWzFdOworCisgICAgICAgICAgICAgICAgaWYgKG14IDwgMCB8fCBteCArIDQgPiBzLT5hdmN0eC0+d2lkdGggfHwKKyAgICAgICAgICAgICAgICAgICAgbXkgPCAwIHx8IG15ICsgNCA+IHMtPmF2Y3R4LT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJNViAlZCAlZCBvdXQgb2YgcGljdHVyZVxuIiwgbXgsIG15KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3JjID0gcy0+bGFzdF9mcmFtZS0+ZGF0YVswXSArIG14ICsgbXkgKiBzLT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICBzcmNfc3RyaWRlID0gcy0+bGFzdF9mcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSB2ZWN0b3IgLSBudW1fbXZzOworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBudW1fYmxvY2tzX3JhdykKKyAgICAgICAgICAgICAgICAgICAgc3JjID0gYmxvY2tzX3JhdyArIDE2Km9mZnNldDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChvZmZzZXQgLSBudW1fYmxvY2tzX3JhdyA8IG51bV9ibG9ja3NfcGFja2VkKQorICAgICAgICAgICAgICAgICAgICBzcmMgPSBzLT5ibG9ja19jb2RlYm9va1tvZmZzZXQgLSBudW1fYmxvY2tzX3Jhd107CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBzcmNfc3RyaWRlID0gNDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YVswXVsoeSAqIDQgKyBqKSAqIGZyYW1lLT5saW5lc2l6ZVswXSArICh4ICogNCArIGkpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNbaiAqIHNyY19zdHJpZGUgKyBpXTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Z3ZfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmICAgICA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBUZ3ZDb250ZXh0ICpzICAgICAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgICAgICA9IGRhdGE7CisgICAgaW50IGNodW5rX3R5cGUsIHJldDsKKworICAgIGlmIChidWZfZW5kIC0gYnVmIDwgRUFfUFJFQU1CTEVfU0laRSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBjaHVua190eXBlID0gQVZfUkwzMigmYnVmWzBdKTsKKyAgICBidWYgICAgICAgKz0gRUFfUFJFQU1CTEVfU0laRTsKKworICAgIGlmIChjaHVua190eXBlID09IGtWR1RfVEFHKSB7CisgICAgICAgIGludCBwYWxfY291bnQsIGk7CisgICAgICAgIGlmKGJ1Zl9lbmQgLSBidWYgPCAxMikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgInRydW5jYXRlZCBoZWFkZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBzLT53aWR0aCAgPSBBVl9STDE2KCZidWZbMF0pOworICAgICAgICBzLT5oZWlnaHQgPSBBVl9STDE2KCZidWZbMl0pOworICAgICAgICBpZiAocy0+YXZjdHgtPndpZHRoICE9IHMtPndpZHRoIHx8IHMtPmF2Y3R4LT5oZWlnaHQgIT0gcy0+aGVpZ2h0KSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+ZnJhbWVfYnVmZmVyKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKHMtPmxhc3RfZnJhbWUpOworICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhzLT5hdmN0eCwgcy0+d2lkdGgsIHMtPmhlaWdodCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcGFsX2NvdW50ID0gQVZfUkwxNigmYnVmWzZdKTsKKyAgICAgICAgYnVmICs9IDEyOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBwYWxfY291bnQgJiYgaSA8IEFWUEFMRVRURV9DT1VOVCAmJiBidWZfZW5kIC0gYnVmID49IDM7IGkrKykgeworICAgICAgICAgICAgcy0+cGFsZXR0ZVtpXSA9IDB4RkZVIDw8IDI0IHwgQVZfUkIyNChidWYpOworICAgICAgICAgICAgYnVmICs9IDM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzFdLCBzLT5wYWxldHRlLCBBVlBBTEVUVEVfU0laRSk7CisKKyAgICBpZiAoY2h1bmtfdHlwZSA9PSBrVkdUX1RBRykgeworICAgICAgICBpbnQgeTsKKyAgICAgICAgZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgICAgICBpZiAoIXMtPmZyYW1lX2J1ZmZlciAmJgorICAgICAgICAgICAgIShzLT5mcmFtZV9idWZmZXIgPSBhdl9tYWxsb2N6KHMtPndpZHRoICogcy0+aGVpZ2h0KSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGlmICh1bnBhY2soYnVmLCBidWZfZW5kLCBzLT5mcmFtZV9idWZmZXIsIHMtPmF2Y3R4LT53aWR0aCwgcy0+YXZjdHgtPmhlaWdodCkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAidHJ1bmNhdGVkIGludHJhIGZyYW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzLT5oZWlnaHQ7IHkrKykKKyAgICAgICAgICAgIG1lbWNweShmcmFtZS0+ZGF0YVswXSAgKyB5ICogZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lX2J1ZmZlciArIHkgKiBzLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICBzLT53aWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFzLT5sYXN0X2ZyYW1lLT5kYXRhWzBdKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiaW50ZXIgZnJhbWUgd2l0aG91dCBjb3JyZXNwb25kaW5nIGludHJhIGZyYW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMDsKKyAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICBpZiAodGd2X2RlY29kZV9pbnRlcihzLCBmcmFtZSwgYnVmLCBidWZfZW5kKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJ0cnVuY2F0ZWQgaW50ZXIgZnJhbWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9mcmFtZV91bnJlZihzLT5sYXN0X2ZyYW1lKTsKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihzLT5sYXN0X2ZyYW1lLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdGd2X2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRndkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmxhc3RfZnJhbWUpOworICAgIGF2X2ZyZWVwKCZzLT5mcmFtZV9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5tdl9jb2RlYm9vayk7CisgICAgYXZfZnJlZXAoJnMtPmJsb2NrX2NvZGVib29rKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9lYXRndl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJlYXRndiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkVsZWN0cm9uaWMgQXJ0cyBUR1YgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVEdWLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUZ3ZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB0Z3ZfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gdGd2X2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gdGd2X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2VhdHFpLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9lYXRxaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmMzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9lYXRxaS5jCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogRWxlY3Ryb25pYyBBcnRzIFRRSSBWaWRlbyBEZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEVsZWN0cm9uaWMgQXJ0cyBUUUkgVmlkZW8gRGVjb2RlcgorICogQGF1dGhvciBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqIEBzZWUgaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9RWxlY3Ryb25pY19BcnRzX1RRSQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJic3dhcGRzcC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiYWFuZGN0dGFiLmgiCisjaW5jbHVkZSAiZWFpZGN0LmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXBlZzEyLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IFRxaUNvbnRleHQgeworICAgIE1wZWdFbmNDb250ZXh0IHM7CisgICAgQnN3YXBEU1BDb250ZXh0IGJzZHNwOworICAgIHZvaWQgKmJpdHN0cmVhbV9idWY7CisgICAgdW5zaWduZWQgaW50IGJpdHN0cmVhbV9idWZfc2l6ZTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrKVs2XVs2NF07Cit9IFRxaUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCB0cWlfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRxaUNvbnRleHQgKnQgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnQtPnM7CisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBmZl9ibG9ja2RzcF9pbml0KCZzLT5iZHNwLCBhdmN0eCk7CisgICAgZmZfYnN3YXBkc3BfaW5pdCgmdC0+YnNkc3ApOworICAgIGZmX2lkY3Rkc3BfaW5pdCgmcy0+aWRzcCwgYXZjdHgpOworICAgIGZmX2luaXRfc2NhbnRhYmxlX3Blcm11dGF0aW9uKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgRkZfSURDVF9QRVJNX05PTkUpOworICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX3NjYW50YWJsZSwgZmZfemlnemFnX2RpcmVjdCk7CisgICAgcy0+cXNjYWxlID0gMTsKKyAgICBhdmN0eC0+ZnJhbWVyYXRlID0gKEFWUmF0aW9uYWwpeyAxNSwgMSB9OworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgIGZmX21wZWcxMl9pbml0X3ZsY3MoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cWlfZGVjb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICgqYmxvY2spWzY0XSkKK3sKKyAgICBpbnQgbjsKKyAgICBzLT5iZHNwLmNsZWFyX2Jsb2NrcyhibG9ja1swXSk7CisgICAgZm9yIChuPTA7IG48NjsgbisrKQorICAgICAgICBpZiAoZmZfbXBlZzFfZGVjb2RlX2Jsb2NrX2ludHJhKHMsIGJsb2NrW25dLCBuKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRxaV9pZGN0X3B1dChUcWlDb250ZXh0ICp0LCBBVkZyYW1lICpmcmFtZSwgaW50MTZfdCAoKmJsb2NrKVs2NF0pCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdC0+czsKKyAgICBpbnQgbGluZXNpemUgPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgdWludDhfdCAqZGVzdF95ICA9IGZyYW1lLT5kYXRhWzBdICsgKHMtPm1iX3kgKiAxNiogbGluZXNpemUgICAgICAgICAgICApICsgcy0+bWJfeCAqIDE2OworICAgIHVpbnQ4X3QgKmRlc3RfY2IgPSBmcmFtZS0+ZGF0YVsxXSArIChzLT5tYl95ICogOCAqIGZyYW1lLT5saW5lc2l6ZVsxXSkgKyBzLT5tYl94ICogODsKKyAgICB1aW50OF90ICpkZXN0X2NyID0gZnJhbWUtPmRhdGFbMl0gKyAocy0+bWJfeSAqIDggKiBmcmFtZS0+bGluZXNpemVbMl0pICsgcy0+bWJfeCAqIDg7CisKKyAgICBmZl9lYV9pZGN0X3B1dF9jKGRlc3RfeSAgICAgICAgICAgICAgICAgLCBsaW5lc2l6ZSwgYmxvY2tbMF0pOworICAgIGZmX2VhX2lkY3RfcHV0X2MoZGVzdF95ICAgICAgICAgICAgICArIDgsIGxpbmVzaXplLCBibG9ja1sxXSk7CisgICAgZmZfZWFfaWRjdF9wdXRfYyhkZXN0X3kgKyA4KmxpbmVzaXplICAgICwgbGluZXNpemUsIGJsb2NrWzJdKTsKKyAgICBmZl9lYV9pZGN0X3B1dF9jKGRlc3RfeSArIDgqbGluZXNpemUgKyA4LCBsaW5lc2l6ZSwgYmxvY2tbM10pOworICAgIGlmKCEocy0+YXZjdHgtPmZsYWdzJkNPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgZmZfZWFfaWRjdF9wdXRfYyhkZXN0X2NiLCBmcmFtZS0+bGluZXNpemVbMV0sIGJsb2NrWzRdKTsKKyAgICAgICAgZmZfZWFfaWRjdF9wdXRfYyhkZXN0X2NyLCBmcmFtZS0+bGluZXNpemVbMl0sIGJsb2NrWzVdKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRxaV9jYWxjdWxhdGVfcXRhYmxlKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgcXVhbnQpCit7CisgICAgY29uc3QgaW50IHFzY2FsZSA9ICgyMTUgLSAyKnF1YW50KSo1OworICAgIGludCBpOworICAgIHMtPmludHJhX21hdHJpeFswXSA9IChmZl9pbnZfYWFuc2NhbGVzWzBdKmZmX21wZWcxX2RlZmF1bHRfaW50cmFfbWF0cml4WzBdKT4+MTE7CisgICAgZm9yKGk9MTsgaTw2NDsgaSsrKQorICAgICAgICBzLT5pbnRyYV9tYXRyaXhbaV0gPSAoZmZfaW52X2FhbnNjYWxlc1tpXSpmZl9tcGVnMV9kZWZhdWx0X2ludHJhX21hdHJpeFtpXSpxc2NhbGUgKyAzMik+PjE0OworfQorCitzdGF0aWMgaW50IHRxaV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmK2J1Zl9zaXplOworICAgIFRxaUNvbnRleHQgKnQgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnQtPnM7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIGludCByZXQ7CisKKyAgICBzLT53aWR0aCAgPSBBVl9STDE2KCZidWZbMF0pOworICAgIHMtPmhlaWdodCA9IEFWX1JMMTYoJmJ1ZlsyXSk7CisgICAgdHFpX2NhbGN1bGF0ZV9xdGFibGUocywgYnVmWzRdKTsKKyAgICBidWYgKz0gODsKKworICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKHMtPmF2Y3R4LCBzLT53aWR0aCwgcy0+aGVpZ2h0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnQtPmJpdHN0cmVhbV9idWYsICZ0LT5iaXRzdHJlYW1fYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9lbmQgLSBidWYpOworICAgIGlmICghdC0+Yml0c3RyZWFtX2J1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB0LT5ic2RzcC5ic3dhcF9idWYodC0+Yml0c3RyZWFtX2J1ZiwgKGNvbnN0IHVpbnQzMl90ICopIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGJ1Zl9lbmQgLSBidWYpIC8gNCk7CisgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIHQtPmJpdHN0cmVhbV9idWYsIDgqKGJ1Zl9lbmQtYnVmKSk7CisKKyAgICBzLT5sYXN0X2RjWzBdID0gcy0+bGFzdF9kY1sxXSA9IHMtPmxhc3RfZGNbMl0gPSAwOworICAgIGZvciAocy0+bWJfeT0wOyBzLT5tYl95PChhdmN0eC0+aGVpZ2h0KzE1KS8xNjsgcy0+bWJfeSsrKQorICAgIGZvciAocy0+bWJfeD0wOyBzLT5tYl94PChhdmN0eC0+d2lkdGgrMTUpLzE2OyBzLT5tYl94KyspCisgICAgeworICAgICAgICBpZiAodHFpX2RlY29kZV9tYihzLCB0LT5ibG9jaykgPCAwKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIHRxaV9pZGN0X3B1dCh0LCBmcmFtZSwgdC0+YmxvY2spOworICAgIH0KKyAgICBlbmQ6CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB0cWlfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVHFpQ29udGV4dCAqdCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYXZfZnJlZXAoJnQtPmJpdHN0cmVhbV9idWYpOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2VhdHFpX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImVhdHFpIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRWxlY3Ryb25pYyBBcnRzIFRRSSBWaWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9UUUksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFRxaUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHRxaV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB0cWlfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSB0cWlfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZWxiZy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZWxiZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmI2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9lbGJnLmMKQEAgLTAsMCArMSw0NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVml0b3IgU2Vzc2FrIDx2aXRvcjEwMDFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDb2RlYm9vayBHZW5lcmF0b3IgdXNpbmcgdGhlIEVMQkcgYWxnb3JpdGhtCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJlbGJnLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCisjZGVmaW5lIERFTFRBX0VSUl9NQVggMC4xICAvLy88IFByZWNpc2lvbiBvZiB0aGUgRUxCRyBhbGdvcml0aG0gKGFzIHBlcmNlbnR1YWwgZXJyb3IpCisKKy8qKgorICogSW4gdGhlIEVMQkcgamFyZ29uLCBhIGNlbGwgaXMgdGhlIHNldCBvZiBwb2ludHMgdGhhdCBhcmUgY2xvc2VzdCB0byBhCisgKiBjb2RlYm9vayBlbnRyeS4gTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggYSBSb1EgVmlkZW8gY2VsbC4gKi8KK3R5cGVkZWYgc3RydWN0IGNlbGxfcyB7CisgICAgaW50IGluZGV4OworICAgIHN0cnVjdCBjZWxsX3MgKm5leHQ7Cit9IGNlbGw7CisKKy8qKgorICogRUxCRyBpbnRlcm5hbCBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0eworICAgIGludCBlcnJvcjsKKyAgICBpbnQgZGltOworICAgIGludCBudW1DQjsKKyAgICBpbnQgKmNvZGVib29rOworICAgIGNlbGwgKipjZWxsczsKKyAgICBpbnQgKnV0aWxpdHk7CisgICAgaW50NjRfdCAqdXRpbGl0eV9pbmM7CisgICAgaW50ICpuZWFyZXN0X2NiOworICAgIGludCAqcG9pbnRzOworICAgIEFWTEZHICpyYW5kX3N0YXRlOworICAgIGludCAqc2NyYXRjaGJ1ZjsKK30gZWxiZ19kYXRhOworCitzdGF0aWMgaW5saW5lIGludCBkaXN0YW5jZV9saW1pdGVkKGludCAqYSwgaW50ICpiLCBpbnQgZGltLCBpbnQgbGltaXQpCit7CisgICAgaW50IGksIGRpc3Q9MDsKKyAgICBmb3IgKGk9MDsgaTxkaW07IGkrKykgeworICAgICAgICBkaXN0ICs9IChhW2ldIC0gYltpXSkqKGFbaV0gLSBiW2ldKTsKKyAgICAgICAgaWYgKGRpc3QgPiBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiBJTlRfTUFYOworICAgIH0KKworICAgIHJldHVybiBkaXN0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmVjdF9kaXZpc2lvbihpbnQgKnJlcywgaW50ICp2ZWN0LCBpbnQgZGl2LCBpbnQgZGltKQoreworICAgIGludCBpOworICAgIGlmIChkaXYgPiAxKQorICAgICAgICBmb3IgKGk9MDsgaTxkaW07IGkrKykKKyAgICAgICAgICAgIHJlc1tpXSA9IFJPVU5ERURfRElWKHZlY3RbaV0sZGl2KTsKKyAgICBlbHNlIGlmIChyZXMgIT0gdmVjdCkKKyAgICAgICAgbWVtY3B5KHJlcywgdmVjdCwgZGltKnNpemVvZihpbnQpKTsKKworfQorCitzdGF0aWMgaW50IGV2YWxfZXJyb3JfY2VsbChlbGJnX2RhdGEgKmVsYmcsIGludCAqY2VudHJvaWQsIGNlbGwgKmNlbGxzKQoreworICAgIGludCBlcnJvcj0wOworICAgIGZvciAoOyBjZWxsczsgY2VsbHM9Y2VsbHMtPm5leHQpCisgICAgICAgIGVycm9yICs9IGRpc3RhbmNlX2xpbWl0ZWQoY2VudHJvaWQsIGVsYmctPnBvaW50cyArIGNlbGxzLT5pbmRleCplbGJnLT5kaW0sIGVsYmctPmRpbSwgSU5UX01BWCk7CisKKyAgICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Nsb3Nlc3RfY29kZWJvb2soZWxiZ19kYXRhICplbGJnLCBpbnQgaW5kZXgpCit7CisgICAgaW50IGksIHBpY2s9MCwgZGlmZiwgZGlmZl9taW4gPSBJTlRfTUFYOworICAgIGZvciAoaT0wOyBpPGVsYmctPm51bUNCOyBpKyspCisgICAgICAgIGlmIChpICE9IGluZGV4KSB7CisgICAgICAgICAgICBkaWZmID0gZGlzdGFuY2VfbGltaXRlZChlbGJnLT5jb2RlYm9vayArIGkqZWxiZy0+ZGltLCBlbGJnLT5jb2RlYm9vayArIGluZGV4KmVsYmctPmRpbSwgZWxiZy0+ZGltLCBkaWZmX21pbik7CisgICAgICAgICAgICBpZiAoZGlmZiA8IGRpZmZfbWluKSB7CisgICAgICAgICAgICAgICAgcGljayA9IGk7CisgICAgICAgICAgICAgICAgZGlmZl9taW4gPSBkaWZmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgcmV0dXJuIHBpY2s7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2hpZ2hfdXRpbGl0eV9jZWxsKGVsYmdfZGF0YSAqZWxiZykKK3sKKyAgICBpbnQgaT0wOworICAgIC8qIFVzaW5nIGxpbmVhciBzZWFyY2gsIGRvIGJpbmFyeSBpZiBpdCBldmVyIHR1cm5zIHRvIGJlIHNwZWVkIGNyaXRpY2FsICovCisgICAgdWludDY0X3QgcjsKKworICAgIGlmIChlbGJnLT51dGlsaXR5X2luY1tlbGJnLT5udW1DQi0xXSA8IElOVF9NQVgpIHsKKyAgICAgICAgciA9IGF2X2xmZ19nZXQoZWxiZy0+cmFuZF9zdGF0ZSkgJSAodW5zaWduZWQgaW50KWVsYmctPnV0aWxpdHlfaW5jW2VsYmctPm51bUNCLTFdICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICByID0gYXZfbGZnX2dldChlbGJnLT5yYW5kX3N0YXRlKTsKKyAgICAgICAgciA9IChhdl9sZmdfZ2V0KGVsYmctPnJhbmRfc3RhdGUpICsgKHI8PDMyKSkgJSBlbGJnLT51dGlsaXR5X2luY1tlbGJnLT5udW1DQi0xXSArIDE7CisgICAgfQorCisgICAgd2hpbGUgKGVsYmctPnV0aWxpdHlfaW5jW2ldIDwgcikgeworICAgICAgICBpKys7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MihlbGJnLT5jZWxsc1tpXSk7CisKKyAgICByZXR1cm4gaTsKK30KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2ltcGxlIExCRyBhbGdvcml0aG0gZm9yIGp1c3QgdHdvIGNvZGVib29rcworICovCitzdGF0aWMgaW50IHNpbXBsZV9sYmcoZWxiZ19kYXRhICplbGJnLAorICAgICAgICAgICAgICAgICAgICAgIGludCBkaW0sCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpjZW50cm9pZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3dXRpbGl0eVszXSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICBjZWxsICpjZWxscykKK3sKKyAgICBpbnQgaSwgaWR4OworICAgIGludCBudW1wb2ludHNbMl0gPSB7MCwwfTsKKyAgICBpbnQgKm5ld2NlbnRyb2lkWzJdID0geworICAgICAgICBlbGJnLT5zY3JhdGNoYnVmICsgMypkaW0sCisgICAgICAgIGVsYmctPnNjcmF0Y2hidWYgKyA0KmRpbQorICAgIH07CisgICAgY2VsbCAqdGVtcGNlbGw7CisKKyAgICBtZW1zZXQobmV3Y2VudHJvaWRbMF0sIDAsIDIgKiBkaW0gKiBzaXplb2YoKm5ld2NlbnRyb2lkWzBdKSk7CisKKyAgICBuZXd1dGlsaXR5WzBdID0KKyAgICBuZXd1dGlsaXR5WzFdID0gMDsKKworICAgIGZvciAodGVtcGNlbGwgPSBjZWxsczsgdGVtcGNlbGw7IHRlbXBjZWxsPXRlbXBjZWxsLT5uZXh0KSB7CisgICAgICAgIGlkeCA9IGRpc3RhbmNlX2xpbWl0ZWQoY2VudHJvaWRbMF0sIHBvaW50cyArIHRlbXBjZWxsLT5pbmRleCpkaW0sIGRpbSwgSU5UX01BWCk+PQorICAgICAgICAgICAgICBkaXN0YW5jZV9saW1pdGVkKGNlbnRyb2lkWzFdLCBwb2ludHMgKyB0ZW1wY2VsbC0+aW5kZXgqZGltLCBkaW0sIElOVF9NQVgpOworICAgICAgICBudW1wb2ludHNbaWR4XSsrOworICAgICAgICBmb3IgKGk9MDsgaTxkaW07IGkrKykKKyAgICAgICAgICAgIG5ld2NlbnRyb2lkW2lkeF1baV0gKz0gcG9pbnRzW3RlbXBjZWxsLT5pbmRleCpkaW0gKyBpXTsKKyAgICB9CisKKyAgICB2ZWN0X2RpdmlzaW9uKGNlbnRyb2lkWzBdLCBuZXdjZW50cm9pZFswXSwgbnVtcG9pbnRzWzBdLCBkaW0pOworICAgIHZlY3RfZGl2aXNpb24oY2VudHJvaWRbMV0sIG5ld2NlbnRyb2lkWzFdLCBudW1wb2ludHNbMV0sIGRpbSk7CisKKyAgICBmb3IgKHRlbXBjZWxsID0gY2VsbHM7IHRlbXBjZWxsOyB0ZW1wY2VsbD10ZW1wY2VsbC0+bmV4dCkgeworICAgICAgICBpbnQgZGlzdFsyXSA9IHtkaXN0YW5jZV9saW1pdGVkKGNlbnRyb2lkWzBdLCBwb2ludHMgKyB0ZW1wY2VsbC0+aW5kZXgqZGltLCBkaW0sIElOVF9NQVgpLAorICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZV9saW1pdGVkKGNlbnRyb2lkWzFdLCBwb2ludHMgKyB0ZW1wY2VsbC0+aW5kZXgqZGltLCBkaW0sIElOVF9NQVgpfTsKKyAgICAgICAgaW50IGlkeCA9IGRpc3RbMF0gPiBkaXN0WzFdOworICAgICAgICBuZXd1dGlsaXR5W2lkeF0gKz0gZGlzdFtpZHhdOworICAgIH0KKworICAgIHJldHVybiBuZXd1dGlsaXR5WzBdICsgbmV3dXRpbGl0eVsxXTsKK30KKworc3RhdGljIHZvaWQgZ2V0X25ld19jZW50cm9pZHMoZWxiZ19kYXRhICplbGJnLCBpbnQgaHVjLCBpbnQgKm5ld2NlbnRyb2lkX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5ld2NlbnRyb2lkX3ApCit7CisgICAgY2VsbCAqdGVtcGNlbGw7CisgICAgaW50ICptaW4gPSBuZXdjZW50cm9pZF9pOworICAgIGludCAqbWF4ID0gbmV3Y2VudHJvaWRfcDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaT0wOyBpPCBlbGJnLT5kaW07IGkrKykgeworICAgICAgICBtaW5baV09SU5UX01BWDsKKyAgICAgICAgbWF4W2ldPTA7CisgICAgfQorCisgICAgZm9yICh0ZW1wY2VsbCA9IGVsYmctPmNlbGxzW2h1Y107IHRlbXBjZWxsOyB0ZW1wY2VsbCA9IHRlbXBjZWxsLT5uZXh0KQorICAgICAgICBmb3IoaT0wOyBpPGVsYmctPmRpbTsgaSsrKSB7CisgICAgICAgICAgICBtaW5baV09RkZNSU4obWluW2ldLCBlbGJnLT5wb2ludHNbdGVtcGNlbGwtPmluZGV4KmVsYmctPmRpbSArIGldKTsKKyAgICAgICAgICAgIG1heFtpXT1GRk1BWChtYXhbaV0sIGVsYmctPnBvaW50c1t0ZW1wY2VsbC0+aW5kZXgqZWxiZy0+ZGltICsgaV0pOworICAgICAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxlbGJnLT5kaW07IGkrKykgeworICAgICAgICBpbnQgbmkgPSBtaW5baV0gKyAobWF4W2ldIC0gbWluW2ldKS8zOworICAgICAgICBpbnQgbnAgPSBtaW5baV0gKyAoMioobWF4W2ldIC0gbWluW2ldKSkvMzsKKyAgICAgICAgbmV3Y2VudHJvaWRfaVtpXSA9IG5pOworICAgICAgICBuZXdjZW50cm9pZF9wW2ldID0gbnA7CisgICAgfQorfQorCisvKioKKyAqIEFkZCB0aGUgcG9pbnRzIGluIHRoZSBsb3cgdXRpbGl0eSBjZWxsIHRvIGl0cyBjbG9zZXN0IGNlbGwuIFNwbGl0IHRoZSBoaWdoCisgKiB1dGlsaXR5IGNlbGwsIHB1dHRpbmcgdGhlIHNlcGFyYXRlIHBvaW50cyBpbiB0aGUgKG5vdyBlbXB0eSkgbG93IHV0aWxpdHkKKyAqIGNlbGwuCisgKgorICogQHBhcmFtIGVsYmcgICAgICAgICBJbnRlcm5hbCBlbGJnIGRhdGEKKyAqIEBwYXJhbSBpbmRleGVzICAgICAge2x1YywgaHVjLCBjbHVjfQorICogQHBhcmFtIG5ld2NlbnRyb2lkICBBIHZlY3RvciB3aXRoIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IGNlbnRyb2lkcworICovCitzdGF0aWMgdm9pZCBzaGlmdF9jb2RlYm9vayhlbGJnX2RhdGEgKmVsYmcsIGludCAqaW5kZXhlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbmV3Y2VudHJvaWRbM10pCit7CisgICAgY2VsbCAqdGVtcGRhdGE7CisgICAgY2VsbCAqKnBwID0gJmVsYmctPmNlbGxzW2luZGV4ZXNbMl1dOworCisgICAgd2hpbGUoKnBwKQorICAgICAgICBwcD0gJigqcHApLT5uZXh0OworCisgICAgKnBwID0gZWxiZy0+Y2VsbHNbaW5kZXhlc1swXV07CisKKyAgICBlbGJnLT5jZWxsc1tpbmRleGVzWzBdXSA9IE5VTEw7CisgICAgdGVtcGRhdGEgPSBlbGJnLT5jZWxsc1tpbmRleGVzWzFdXTsKKyAgICBlbGJnLT5jZWxsc1tpbmRleGVzWzFdXSA9IE5VTEw7CisKKyAgICB3aGlsZSh0ZW1wZGF0YSkgeworICAgICAgICBjZWxsICp0ZW1wY2VsbDIgPSB0ZW1wZGF0YS0+bmV4dDsKKyAgICAgICAgaW50IGlkeCA9IGRpc3RhbmNlX2xpbWl0ZWQoZWxiZy0+cG9pbnRzICsgdGVtcGRhdGEtPmluZGV4KmVsYmctPmRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2NlbnRyb2lkWzBdLCBlbGJnLT5kaW0sIElOVF9NQVgpID4KKyAgICAgICAgICAgICAgICAgIGRpc3RhbmNlX2xpbWl0ZWQoZWxiZy0+cG9pbnRzICsgdGVtcGRhdGEtPmluZGV4KmVsYmctPmRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2NlbnRyb2lkWzFdLCBlbGJnLT5kaW0sIElOVF9NQVgpOworCisgICAgICAgIHRlbXBkYXRhLT5uZXh0ID0gZWxiZy0+Y2VsbHNbaW5kZXhlc1tpZHhdXTsKKyAgICAgICAgZWxiZy0+Y2VsbHNbaW5kZXhlc1tpZHhdXSA9IHRlbXBkYXRhOworICAgICAgICB0ZW1wZGF0YSA9IHRlbXBjZWxsMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGV2YWx1YXRlX3V0aWxpdHlfaW5jKGVsYmdfZGF0YSAqZWxiZykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQ2NF90IGluYz0wOworCisgICAgZm9yIChpPTA7IGkgPCBlbGJnLT5udW1DQjsgaSsrKSB7CisgICAgICAgIGlmIChlbGJnLT5udW1DQiplbGJnLT51dGlsaXR5W2ldID4gZWxiZy0+ZXJyb3IpCisgICAgICAgICAgICBpbmMgKz0gZWxiZy0+dXRpbGl0eVtpXTsKKyAgICAgICAgZWxiZy0+dXRpbGl0eV9pbmNbaV0gPSBpbmM7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV91dGlsaXR5X2FuZF9uX2NiKGVsYmdfZGF0YSAqZWxiZywgaW50IGlkeCwgaW50IG5ld3V0aWxpdHkpCit7CisgICAgY2VsbCAqdGVtcGNlbGw7CisKKyAgICBlbGJnLT51dGlsaXR5W2lkeF0gPSBuZXd1dGlsaXR5OworICAgIGZvciAodGVtcGNlbGw9ZWxiZy0+Y2VsbHNbaWR4XTsgdGVtcGNlbGw7IHRlbXBjZWxsPXRlbXBjZWxsLT5uZXh0KQorICAgICAgICBlbGJnLT5uZWFyZXN0X2NiW3RlbXBjZWxsLT5pbmRleF0gPSBpZHg7Cit9CisKKy8qKgorICogRXZhbHVhdGUgaWYgYSBzaGlmdCBsb3dlciB0aGUgZXJyb3IuIElmIGl0IGRvZXMsIGNhbGwgc2hpZnRfY29kZWJvb2tzCisgKiBhbmQgdXBkYXRlIGVsYmctPmVycm9yLCBlbGJnLT51dGlsaXR5IGFuZCBlbGJnLT5uZWFyZXN0X2NiLgorICoKKyAqIEBwYXJhbSBlbGJnICBJbnRlcm5hbCBlbGJnIGRhdGEKKyAqIEBwYXJhbSBpZHggICB7bHVjIChsb3cgdXRpbGl0eSBjZWxsLCBodWMgKGhpZ2ggdXRpbGl0eSBjZWxsKSwgY2x1YyAoY2xvc2VzdCBjZWxsIHRvIGxvdyB1dGlsaXR5IGNlbGwpfQorICovCitzdGF0aWMgdm9pZCB0cnlfc2hpZnRfY2FuZGlkYXRlKGVsYmdfZGF0YSAqZWxiZywgaW50IGlkeFszXSkKK3sKKyAgICBpbnQgaiwgaywgb2xkZXJyb3I9MCwgbmV3ZXJyb3IsIGNvbnQ9MDsKKyAgICBpbnQgbmV3dXRpbGl0eVszXTsKKyAgICBpbnQgKm5ld2NlbnRyb2lkWzNdID0geworICAgICAgICBlbGJnLT5zY3JhdGNoYnVmLAorICAgICAgICBlbGJnLT5zY3JhdGNoYnVmICsgZWxiZy0+ZGltLAorICAgICAgICBlbGJnLT5zY3JhdGNoYnVmICsgMiplbGJnLT5kaW0KKyAgICB9OworICAgIGNlbGwgKnRlbXBjZWxsOworCisgICAgZm9yIChqPTA7IGo8MzsgaisrKQorICAgICAgICBvbGRlcnJvciArPSBlbGJnLT51dGlsaXR5W2lkeFtqXV07CisKKyAgICBtZW1zZXQobmV3Y2VudHJvaWRbMl0sIDAsIGVsYmctPmRpbSpzaXplb2YoaW50KSk7CisKKyAgICBmb3IgKGs9MDsgazwyOyBrKyspCisgICAgICAgIGZvciAodGVtcGNlbGw9ZWxiZy0+Y2VsbHNbaWR4WzIqa11dOyB0ZW1wY2VsbDsgdGVtcGNlbGw9dGVtcGNlbGwtPm5leHQpIHsKKyAgICAgICAgICAgIGNvbnQrKzsKKyAgICAgICAgICAgIGZvciAoaj0wOyBqPGVsYmctPmRpbTsgaisrKQorICAgICAgICAgICAgICAgIG5ld2NlbnRyb2lkWzJdW2pdICs9IGVsYmctPnBvaW50c1t0ZW1wY2VsbC0+aW5kZXgqZWxiZy0+ZGltICsgal07CisgICAgICAgIH0KKworICAgIHZlY3RfZGl2aXNpb24obmV3Y2VudHJvaWRbMl0sIG5ld2NlbnRyb2lkWzJdLCBjb250LCBlbGJnLT5kaW0pOworCisgICAgZ2V0X25ld19jZW50cm9pZHMoZWxiZywgaWR4WzFdLCBuZXdjZW50cm9pZFswXSwgbmV3Y2VudHJvaWRbMV0pOworCisgICAgbmV3dXRpbGl0eVsyXSAgPSBldmFsX2Vycm9yX2NlbGwoZWxiZywgbmV3Y2VudHJvaWRbMl0sIGVsYmctPmNlbGxzW2lkeFswXV0pOworICAgIG5ld3V0aWxpdHlbMl0gKz0gZXZhbF9lcnJvcl9jZWxsKGVsYmcsIG5ld2NlbnRyb2lkWzJdLCBlbGJnLT5jZWxsc1tpZHhbMl1dKTsKKworICAgIG5ld2Vycm9yID0gbmV3dXRpbGl0eVsyXTsKKworICAgIG5ld2Vycm9yICs9IHNpbXBsZV9sYmcoZWxiZywgZWxiZy0+ZGltLCBuZXdjZW50cm9pZCwgbmV3dXRpbGl0eSwgZWxiZy0+cG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxiZy0+Y2VsbHNbaWR4WzFdXSk7CisKKyAgICBpZiAob2xkZXJyb3IgPiBuZXdlcnJvcikgeworICAgICAgICBzaGlmdF9jb2RlYm9vayhlbGJnLCBpZHgsIG5ld2NlbnRyb2lkKTsKKworICAgICAgICBlbGJnLT5lcnJvciArPSBuZXdlcnJvciAtIG9sZGVycm9yOworCisgICAgICAgIGZvciAoaj0wOyBqPDM7IGorKykKKyAgICAgICAgICAgIHVwZGF0ZV91dGlsaXR5X2FuZF9uX2NiKGVsYmcsIGlkeFtqXSwgbmV3dXRpbGl0eVtqXSk7CisKKyAgICAgICAgZXZhbHVhdGVfdXRpbGl0eV9pbmMoZWxiZyk7CisgICAgfQorIH0KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRUxCRyBibG9jaworICovCitzdGF0aWMgdm9pZCBkb19zaGlmdGluZ3MoZWxiZ19kYXRhICplbGJnKQoreworICAgIGludCBpZHhbM107CisKKyAgICBldmFsdWF0ZV91dGlsaXR5X2luYyhlbGJnKTsKKworICAgIGZvciAoaWR4WzBdPTA7IGlkeFswXSA8IGVsYmctPm51bUNCOyBpZHhbMF0rKykKKyAgICAgICAgaWYgKGVsYmctPm51bUNCKmVsYmctPnV0aWxpdHlbaWR4WzBdXSA8IGVsYmctPmVycm9yKSB7CisgICAgICAgICAgICBpZiAoZWxiZy0+dXRpbGl0eV9pbmNbZWxiZy0+bnVtQ0ItMV0gPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlkeFsxXSA9IGdldF9oaWdoX3V0aWxpdHlfY2VsbChlbGJnKTsKKyAgICAgICAgICAgIGlkeFsyXSA9IGdldF9jbG9zZXN0X2NvZGVib29rKGVsYmcsIGlkeFswXSk7CisKKyAgICAgICAgICAgIGlmIChpZHhbMV0gIT0gaWR4WzBdICYmIGlkeFsxXSAhPSBpZHhbMl0pCisgICAgICAgICAgICAgICAgdHJ5X3NoaWZ0X2NhbmRpZGF0ZShlbGJnLCBpZHgpOworICAgICAgICB9Cit9CisKKyNkZWZpbmUgQklHX1BSSU1FIDQzMzQ5NDQzN0xMCisKK3ZvaWQgYXZwcml2X2luaXRfZWxiZyhpbnQgKnBvaW50cywgaW50IGRpbSwgaW50IG51bXBvaW50cywgaW50ICpjb2RlYm9vaywKKyAgICAgICAgICAgICAgICAgIGludCBudW1DQiwgaW50IG1heF9zdGVwcywgaW50ICpjbG9zZXN0X2NiLAorICAgICAgICAgICAgICAgICAgQVZMRkcgKnJhbmRfc3RhdGUpCit7CisgICAgaW50IGksIGs7CisKKyAgICBpZiAobnVtcG9pbnRzID4gMjQqbnVtQ0IpIHsKKyAgICAgICAgLyogRUxCRyBpcyB2ZXJ5IGNvc3RseSBmb3IgYSBiaWcgbnVtYmVyIG9mIHBvaW50cy4gU28gaWYgd2UgaGF2ZSBhIGxvdAorICAgICAgICAgICBvZiB0aGVtLCBnZXQgYSBnb29kIGluaXRpYWwgY29kZWJvb2sgdG8gc2F2ZSBvbiBpdGVyYXRpb25zICAgICAgICovCisgICAgICAgIGludCAqdGVtcF9wb2ludHMgPSBhdl9tYWxsb2NfYXJyYXkoZGltLCAobnVtcG9pbnRzLzgpKnNpemVvZihpbnQpKTsKKyAgICAgICAgZm9yIChpPTA7IGk8bnVtcG9pbnRzLzg7IGkrKykgeworICAgICAgICAgICAgayA9IChpKkJJR19QUklNRSkgJSBudW1wb2ludHM7CisgICAgICAgICAgICBtZW1jcHkodGVtcF9wb2ludHMgKyBpKmRpbSwgcG9pbnRzICsgaypkaW0sIGRpbSpzaXplb2YoaW50KSk7CisgICAgICAgIH0KKworICAgICAgICBhdnByaXZfaW5pdF9lbGJnKHRlbXBfcG9pbnRzLCBkaW0sIG51bXBvaW50cy84LCBjb2RlYm9vaywgbnVtQ0IsIDIqbWF4X3N0ZXBzLCBjbG9zZXN0X2NiLCByYW5kX3N0YXRlKTsKKyAgICAgICAgYXZwcml2X2RvX2VsYmcodGVtcF9wb2ludHMsIGRpbSwgbnVtcG9pbnRzLzgsIGNvZGVib29rLCBudW1DQiwgMiptYXhfc3RlcHMsIGNsb3Nlc3RfY2IsIHJhbmRfc3RhdGUpOworCisgICAgICAgIGF2X2ZyZWUodGVtcF9wb2ludHMpOworCisgICAgfSBlbHNlICAvLyBJZiBub3QsIGluaXRpYWxpemUgdGhlIGNvZGVib29rIHdpdGggcmFuZG9tIHBvc2l0aW9ucworICAgICAgICBmb3IgKGk9MDsgaSA8IG51bUNCOyBpKyspCisgICAgICAgICAgICBtZW1jcHkoY29kZWJvb2sgKyBpKmRpbSwgcG9pbnRzICsgKChpKkJJR19QUklNRSklbnVtcG9pbnRzKSpkaW0sCisgICAgICAgICAgICAgICAgICAgZGltKnNpemVvZihpbnQpKTsKKworfQorCit2b2lkIGF2cHJpdl9kb19lbGJnKGludCAqcG9pbnRzLCBpbnQgZGltLCBpbnQgbnVtcG9pbnRzLCBpbnQgKmNvZGVib29rLAorICAgICAgICAgICAgICAgIGludCBudW1DQiwgaW50IG1heF9zdGVwcywgaW50ICpjbG9zZXN0X2NiLAorICAgICAgICAgICAgICAgIEFWTEZHICpyYW5kX3N0YXRlKQoreworICAgIGludCBkaXN0OworICAgIGVsYmdfZGF0YSBlbGJnX2Q7CisgICAgZWxiZ19kYXRhICplbGJnID0gJmVsYmdfZDsKKyAgICBpbnQgaSwgaiwgaywgbGFzdF9lcnJvciwgc3RlcHM9MDsKKyAgICBpbnQgKmRpc3RfY2IgPSBhdl9tYWxsb2NfYXJyYXkobnVtcG9pbnRzLCBzaXplb2YoaW50KSk7CisgICAgaW50ICpzaXplX3BhcnQgPSBhdl9tYWxsb2NfYXJyYXkobnVtQ0IsIHNpemVvZihpbnQpKTsKKyAgICBjZWxsICpsaXN0X2J1ZmZlciA9IGF2X21hbGxvY19hcnJheShudW1wb2ludHMsIHNpemVvZihjZWxsKSk7CisgICAgY2VsbCAqZnJlZV9jZWxsczsKKyAgICBpbnQgYmVzdF9kaXN0LCBiZXN0X2lkeCA9IDA7CisKKyAgICBlbGJnLT5lcnJvciA9IElOVF9NQVg7CisgICAgZWxiZy0+ZGltID0gZGltOworICAgIGVsYmctPm51bUNCID0gbnVtQ0I7CisgICAgZWxiZy0+Y29kZWJvb2sgPSBjb2RlYm9vazsKKyAgICBlbGJnLT5jZWxscyA9IGF2X21hbGxvY19hcnJheShudW1DQiwgc2l6ZW9mKGNlbGwgKikpOworICAgIGVsYmctPnV0aWxpdHkgPSBhdl9tYWxsb2NfYXJyYXkobnVtQ0IsIHNpemVvZihpbnQpKTsKKyAgICBlbGJnLT5uZWFyZXN0X2NiID0gY2xvc2VzdF9jYjsKKyAgICBlbGJnLT5wb2ludHMgPSBwb2ludHM7CisgICAgZWxiZy0+dXRpbGl0eV9pbmMgPSBhdl9tYWxsb2NfYXJyYXkobnVtQ0IsIHNpemVvZigqZWxiZy0+dXRpbGl0eV9pbmMpKTsKKyAgICBlbGJnLT5zY3JhdGNoYnVmID0gYXZfbWFsbG9jX2FycmF5KDUqZGltLCBzaXplb2YoaW50KSk7CisKKyAgICBlbGJnLT5yYW5kX3N0YXRlID0gcmFuZF9zdGF0ZTsKKworICAgIGRvIHsKKyAgICAgICAgZnJlZV9jZWxscyA9IGxpc3RfYnVmZmVyOworICAgICAgICBsYXN0X2Vycm9yID0gZWxiZy0+ZXJyb3I7CisgICAgICAgIHN0ZXBzKys7CisgICAgICAgIG1lbXNldChlbGJnLT51dGlsaXR5LCAwLCBudW1DQipzaXplb2YoaW50KSk7CisgICAgICAgIG1lbXNldChlbGJnLT5jZWxscywgMCwgbnVtQ0Iqc2l6ZW9mKGNlbGwgKikpOworCisgICAgICAgIGVsYmctPmVycm9yID0gMDsKKworICAgICAgICAvKiBUaGlzIGxvb3AgZXZhbHVhdGUgdGhlIGFjdHVhbCBWb3Jvbm9pIHBhcnRpdGlvbi4gSXQgaXMgdGhlIG1vc3QKKyAgICAgICAgICAgY29zdGx5IHBhcnQgb2YgdGhlIGFsZ29yaXRobS4gKi8KKyAgICAgICAgZm9yIChpPTA7IGkgPCBudW1wb2ludHM7IGkrKykgeworICAgICAgICAgICAgYmVzdF9kaXN0ID0gZGlzdGFuY2VfbGltaXRlZChlbGJnLT5wb2ludHMgKyBpKmVsYmctPmRpbSwgZWxiZy0+Y29kZWJvb2sgKyBiZXN0X2lkeCplbGJnLT5kaW0sIGRpbSwgSU5UX01BWCk7CisgICAgICAgICAgICBmb3IgKGs9MDsgayA8IGVsYmctPm51bUNCOyBrKyspIHsKKyAgICAgICAgICAgICAgICBkaXN0ID0gZGlzdGFuY2VfbGltaXRlZChlbGJnLT5wb2ludHMgKyBpKmVsYmctPmRpbSwgZWxiZy0+Y29kZWJvb2sgKyBrKmVsYmctPmRpbSwgZGltLCBiZXN0X2Rpc3QpOworICAgICAgICAgICAgICAgIGlmIChkaXN0IDwgYmVzdF9kaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfZGlzdCA9IGRpc3Q7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfaWR4ID0gazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbGJnLT5uZWFyZXN0X2NiW2ldID0gYmVzdF9pZHg7CisgICAgICAgICAgICBkaXN0X2NiW2ldID0gYmVzdF9kaXN0OworICAgICAgICAgICAgZWxiZy0+ZXJyb3IgKz0gZGlzdF9jYltpXTsKKyAgICAgICAgICAgIGVsYmctPnV0aWxpdHlbZWxiZy0+bmVhcmVzdF9jYltpXV0gKz0gZGlzdF9jYltpXTsKKyAgICAgICAgICAgIGZyZWVfY2VsbHMtPmluZGV4ID0gaTsKKyAgICAgICAgICAgIGZyZWVfY2VsbHMtPm5leHQgPSBlbGJnLT5jZWxsc1tlbGJnLT5uZWFyZXN0X2NiW2ldXTsKKyAgICAgICAgICAgIGVsYmctPmNlbGxzW2VsYmctPm5lYXJlc3RfY2JbaV1dID0gZnJlZV9jZWxsczsKKyAgICAgICAgICAgIGZyZWVfY2VsbHMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGRvX3NoaWZ0aW5ncyhlbGJnKTsKKworICAgICAgICBtZW1zZXQoc2l6ZV9wYXJ0LCAwLCBudW1DQipzaXplb2YoaW50KSk7CisKKyAgICAgICAgbWVtc2V0KGVsYmctPmNvZGVib29rLCAwLCBlbGJnLT5udW1DQipkaW0qc2l6ZW9mKGludCkpOworCisgICAgICAgIGZvciAoaT0wOyBpIDwgbnVtcG9pbnRzOyBpKyspIHsKKyAgICAgICAgICAgIHNpemVfcGFydFtlbGJnLT5uZWFyZXN0X2NiW2ldXSsrOworICAgICAgICAgICAgZm9yIChqPTA7IGogPCBlbGJnLT5kaW07IGorKykKKyAgICAgICAgICAgICAgICBlbGJnLT5jb2RlYm9va1tlbGJnLT5uZWFyZXN0X2NiW2ldKmVsYmctPmRpbSArIGpdICs9CisgICAgICAgICAgICAgICAgICAgIGVsYmctPnBvaW50c1tpKmVsYmctPmRpbSArIGpdOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpPTA7IGkgPCBlbGJnLT5udW1DQjsgaSsrKQorICAgICAgICAgICAgdmVjdF9kaXZpc2lvbihlbGJnLT5jb2RlYm9vayArIGkqZWxiZy0+ZGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbGJnLT5jb2RlYm9vayArIGkqZWxiZy0+ZGltLCBzaXplX3BhcnRbaV0sIGVsYmctPmRpbSk7CisKKyAgICB9IHdoaWxlKCgobGFzdF9lcnJvciAtIGVsYmctPmVycm9yKSA+IERFTFRBX0VSUl9NQVgqZWxiZy0+ZXJyb3IpICYmCisgICAgICAgICAgICAoc3RlcHMgPCBtYXhfc3RlcHMpKTsKKworICAgIGF2X2ZyZWUoZGlzdF9jYik7CisgICAgYXZfZnJlZShzaXplX3BhcnQpOworICAgIGF2X2ZyZWUoZWxiZy0+dXRpbGl0eSk7CisgICAgYXZfZnJlZShsaXN0X2J1ZmZlcik7CisgICAgYXZfZnJlZShlbGJnLT5jZWxscyk7CisgICAgYXZfZnJlZShlbGJnLT51dGlsaXR5X2luYyk7CisgICAgYXZfZnJlZShlbGJnLT5zY3JhdGNoYnVmKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2VsYmcuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2VsYmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmZiNTNmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZWxiZy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVml0b3IgU2Vzc2FrIDx2aXRvcjEwMDFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRUxCR19ICisjZGVmaW5lIEFWQ09ERUNfRUxCR19ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIEVuaGFuY2VkIExCRyBBbGdvcml0aG0KKyAqIEJhc2VkIG9uIHRoZSBwYXBlciAiTmV1cmFsIE5ldHdvcmtzIDE0OjEyMTktMTIzNyIgdGhhdCBjYW4gYmUgZm91bmQgaW4KKyAqIGh0dHA6Ly9jaXRlc2Vlci5pc3QucHN1LmVkdS9wYXRhbjAxZW5oYW5jZWQuaHRtbCAuCisgKgorICogQHBhcmFtIHBvaW50cyBJbnB1dCBwb2ludHMuCisgKiBAcGFyYW0gZGltIERpbWVuc2lvbiBvZiB0aGUgcG9pbnRzLgorICogQHBhcmFtIG51bXBvaW50cyBOdW0gb2YgcG9pbnRzIGluICoqcG9pbnRzLgorICogQHBhcmFtIGNvZGVib29rIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBjb2RlYm9vay4gTXVzdCBiZSBhbGxvY2F0ZWQuCisgKiBAcGFyYW0gbnVtQ0IgTnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgY29kZWJvb2suCisgKiBAcGFyYW0gbnVtX3N0ZXBzIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGVwcy4gT25lIHN0ZXAgaXMgYWxyZWFkeSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIHRpbWUgYW5kIHF1YWxpdHkuCisgKiBAcGFyYW0gY2xvc2VzdF9jYiBSZXR1cm4gdGhlIGNsb3Nlc3QgY29kZWJvb2sgdG8gZWFjaCBwb2ludC4gTXVzdCBiZSBhbGxvY2F0ZWQuCisgKiBAcGFyYW0gcmFuZF9zdGF0ZSBBIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHN0YXRlLiBTaG91bGQgYmUgYWxyZWFkeSBpbml0aWFsaXplZCBieSBhdl9sZmdfaW5pdCgpLgorICovCit2b2lkIGF2cHJpdl9kb19lbGJnKGludCAqcG9pbnRzLCBpbnQgZGltLCBpbnQgbnVtcG9pbnRzLCBpbnQgKmNvZGVib29rLAorICAgICAgICAgICAgICAgIGludCBudW1DQiwgaW50IG51bV9zdGVwcywgaW50ICpjbG9zZXN0X2NiLAorICAgICAgICAgICAgICAgIEFWTEZHICpyYW5kX3N0YXRlKTsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSAqKmNvZGVib29rIHZlY3RvciBmb3IgdGhlIGVsYmcgYWxnb3JpdGhtLiBJZiB5b3UgaGF2ZSBhbHJlYWR5CisgKiBhIGNvZGVib29rIGFuZCB5b3Ugd2FudCB0byByZWZpbmUgaXQsIHlvdSBzaG91bGRuJ3QgY2FsbCB0aGlzIGZ1bmN0aW9uLgorICogSWYgbnVtcG9pbnRzIDwgOCpudW1DQiB0aGlzIGZ1bmN0aW9uIGZpbGxzICoqY29kZWJvb2sgd2l0aCByYW5kb20gbnVtYmVycy4KKyAqIElmIG5vdCwgaXQgY2FsbHMgYXZwcml2X2RvX2VsYmcgZm9yIGEgKHNtYWxsZXIpIHJhbmRvbSBzYW1wbGUgb2YgdGhlIHBvaW50cyBpbgorICogKipwb2ludHMuIEdldCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGF2cHJpdl9kb19lbGJnLgorICovCit2b2lkIGF2cHJpdl9pbml0X2VsYmcoaW50ICpwb2ludHMsIGludCBkaW0sIGludCBudW1wb2ludHMsIGludCAqY29kZWJvb2ssCisgICAgICAgICAgICAgICAgICBpbnQgbnVtQ0IsIGludCBudW1fc3RlcHMsIGludCAqY2xvc2VzdF9jYiwKKyAgICAgICAgICAgICAgICAgIEFWTEZHICpyYW5kX3N0YXRlKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfRUxCR19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9lcnJvcl9yZXNpbGllbmNlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9lcnJvcl9yZXNpbGllbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyYzU2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Vycm9yX3Jlc2lsaWVuY2UuYwpAQCAtMCwwICsxLDEzMTQgQEAKKy8qCisgKiBFcnJvciByZXNpbGllbmNlIC8gY29uY2VhbG1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBFcnJvciByZXNpbGllbmNlIC8gY29uY2VhbG1lbnQuCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImVycm9yX3Jlc2lsaWVuY2UuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJyZWN0YW5nbGUuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKy8qKgorICogQHBhcmFtIHN0cmlkZSB0aGUgbnVtYmVyIG9mIE1WcyB0byBnZXQgdG8gdGhlIG5leHQgcm93CisgKiBAcGFyYW0gbXZfc3RlcCB0aGUgbnVtYmVyIG9mIE1WcyBwZXIgcm93IG9yIGNvbHVtbiBpbiBhIG1hY3JvYmxvY2sKKyAqLworc3RhdGljIHZvaWQgc2V0X212X3N0cmlkZXMoRVJDb250ZXh0ICpzLCBpbnQgKm12X3N0ZXAsIGludCAqc3RyaWRlKQoreworICAgIGlmIChzLT5hdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgeworICAgICAgICBhdl9hc3NlcnQwKHMtPnF1YXJ0ZXJfc2FtcGxlKTsKKyAgICAgICAgKm12X3N0ZXAgPSA0OworICAgICAgICAqc3RyaWRlICA9IHMtPm1iX3dpZHRoICogNDsKKyAgICB9IGVsc2UgeworICAgICAgICAqbXZfc3RlcCA9IDI7CisgICAgICAgICpzdHJpZGUgID0gcy0+Yjhfc3RyaWRlOworICAgIH0KK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBjdXJyZW50IE1CIHdpdGggYSBmbGF0IGRjLW9ubHkgdmVyc2lvbi4KKyAqLworc3RhdGljIHZvaWQgcHV0X2RjKEVSQ29udGV4dCAqcywgdWludDhfdCAqZGVzdF95LCB1aW50OF90ICpkZXN0X2NiLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY3IsIGludCBtYl94LCBpbnQgbWJfeSkKK3sKKyAgICBpbnQgKmxpbmVzaXplID0gcy0+Y3VyX3BpYy5mLT5saW5lc2l6ZTsKKyAgICBpbnQgZGMsIGRjdSwgZGN2LCB5LCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgZGMgPSBzLT5kY192YWxbMF1bbWJfeCAqIDIgKyAoaSAmICAxKSArIChtYl95ICogMiArIChpID4+IDEpKSAqIHMtPmI4X3N0cmlkZV07CisgICAgICAgIGlmIChkYyA8IDApCisgICAgICAgICAgICBkYyA9IDA7CisgICAgICAgIGVsc2UgaWYgKGRjID4gMjA0MCkKKyAgICAgICAgICAgIGRjID0gMjA0MDsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgICAgIGRlc3RfeVt4ICsgKGkgJiAgMSkgKiA4ICsgKHkgKyAoaSA+PiAxKSAqIDgpICogbGluZXNpemVbMF1dID0gZGMgLyA4OworICAgICAgICB9CisgICAgfQorICAgIGRjdSA9IHMtPmRjX3ZhbFsxXVttYl94ICsgbWJfeSAqIHMtPm1iX3N0cmlkZV07CisgICAgZGN2ID0gcy0+ZGNfdmFsWzJdW21iX3ggKyBtYl95ICogcy0+bWJfc3RyaWRlXTsKKyAgICBpZiAoZGN1IDwgMCkKKyAgICAgICAgZGN1ID0gMDsKKyAgICBlbHNlIGlmIChkY3UgPiAyMDQwKQorICAgICAgICBkY3UgPSAyMDQwOworICAgIGlmIChkY3YgPCAwKQorICAgICAgICBkY3YgPSAwOworICAgIGVsc2UgaWYgKGRjdiA+IDIwNDApCisgICAgICAgIGRjdiA9IDIwNDA7CisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBpbnQgeDsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykgeworICAgICAgICAgICAgZGVzdF9jYlt4ICsgeSAqIGxpbmVzaXplWzFdXSA9IGRjdSAvIDg7CisgICAgICAgICAgICBkZXN0X2NyW3ggKyB5ICogbGluZXNpemVbMl1dID0gZGN2IC8gODsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyMTgxKGludDE2X3QgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIC8qIGhvcml6b250YWwgZmlsdGVyICovCisgICAgZm9yICh5ID0gMTsgeSA8IGhlaWdodCAtIDE7IHkrKykgeworICAgICAgICBpbnQgcHJldl9kYyA9IGRhdGFbMCArIHkgKiBzdHJpZGVdOworCisgICAgICAgIGZvciAoeCA9IDE7IHggPCB3aWR0aCAtIDE7IHgrKykgeworICAgICAgICAgICAgaW50IGRjOworICAgICAgICAgICAgZGMgPSAtcHJldl9kYyArCisgICAgICAgICAgICAgICAgIGRhdGFbeCAgICAgKyB5ICogc3RyaWRlXSAqIDggLQorICAgICAgICAgICAgICAgICBkYXRhW3ggKyAxICsgeSAqIHN0cmlkZV07CisgICAgICAgICAgICBkYyA9IChkYyAqIDEwOTIzICsgMzI3NjgpID4+IDE2OworICAgICAgICAgICAgcHJldl9kYyA9IGRhdGFbeCArIHkgKiBzdHJpZGVdOworICAgICAgICAgICAgZGF0YVt4ICsgeSAqIHN0cmlkZV0gPSBkYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHZlcnRpY2FsIGZpbHRlciAqLworICAgIGZvciAoeCA9IDE7IHggPCB3aWR0aCAtIDE7IHgrKykgeworICAgICAgICBpbnQgcHJldl9kYyA9IGRhdGFbeF07CisKKyAgICAgICAgZm9yICh5ID0gMTsgeSA8IGhlaWdodCAtIDE7IHkrKykgeworICAgICAgICAgICAgaW50IGRjOworCisgICAgICAgICAgICBkYyA9IC1wcmV2X2RjICsKKyAgICAgICAgICAgICAgICAgZGF0YVt4ICsgIHkgICAgICAqIHN0cmlkZV0gKiA4IC0KKyAgICAgICAgICAgICAgICAgZGF0YVt4ICsgKHkgKyAxKSAqIHN0cmlkZV07CisgICAgICAgICAgICBkYyA9IChkYyAqIDEwOTIzICsgMzI3NjgpID4+IDE2OworICAgICAgICAgICAgcHJldl9kYyA9IGRhdGFbeCArIHkgKiBzdHJpZGVdOworICAgICAgICAgICAgZGF0YVt4ICsgeSAqIHN0cmlkZV0gPSBkYzsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBndWVzcyB0aGUgZGMgb2YgYmxvY2tzIHdoaWNoIGRvIG5vdCBoYXZlIGFuIHVuZGFtYWdlZCBkYworICogQHBhcmFtIHcgICAgIHdpZHRoIGluIDggcGl4ZWwgYmxvY2tzCisgKiBAcGFyYW0gaCAgICAgaGVpZ2h0IGluIDggcGl4ZWwgYmxvY2tzCisgKi8KK3N0YXRpYyB2b2lkIGd1ZXNzX2RjKEVSQ29udGV4dCAqcywgaW50MTZfdCAqZGMsIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBzdHJpZGUsIGludCBpc19sdW1hKQoreworICAgIGludCBiX3gsIGJfeTsKKyAgICBpbnQxNl90ICAoKmNvbCApWzRdID0gYXZfbWFsbG9jX2FycmF5KHN0cmlkZSwgaCpzaXplb2YoIGludDE2X3QpKjQpOworICAgIHVpbnQzMl90ICgqZGlzdClbNF0gPSBhdl9tYWxsb2NfYXJyYXkoc3RyaWRlLCBoKnNpemVvZih1aW50MzJfdCkqNCk7CisKKyAgICBpZighY29sIHx8ICFkaXN0KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZ3Vlc3NfZGMoKSBpcyBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvcihiX3k9MDsgYl95PGg7IGJfeSsrKXsKKyAgICAgICAgaW50IGNvbG9yPSAxMDI0OworICAgICAgICBpbnQgZGlzdGFuY2U9IC0xOworICAgICAgICBmb3IoYl94PTA7IGJfeDx3OyBiX3grKyl7CisgICAgICAgICAgICBpbnQgbWJfaW5kZXhfaj0gKGJfeD4+aXNfbHVtYSkgKyAoYl95Pj5pc19sdW1hKSpzLT5tYl9zdHJpZGU7CisgICAgICAgICAgICBpbnQgZXJyb3Jfaj0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW21iX2luZGV4X2pdOworICAgICAgICAgICAgaW50IGludHJhX2ogPSBJU19JTlRSQShzLT5jdXJfcGljLm1iX3R5cGVbbWJfaW5kZXhfal0pOworICAgICAgICAgICAgaWYoaW50cmFfaj09MCB8fCAhKGVycm9yX2omRVJfRENfRVJST1IpKXsKKyAgICAgICAgICAgICAgICBjb2xvcj0gZGNbYl94ICsgYl95KnN0cmlkZV07CisgICAgICAgICAgICAgICAgZGlzdGFuY2U9IGJfeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbCBbYl94ICsgYl95KnN0cmlkZV1bMV09IGNvbG9yOworICAgICAgICAgICAgZGlzdFtiX3ggKyBiX3kqc3RyaWRlXVsxXT0gZGlzdGFuY2UgPj0gMCA/IGJfeC1kaXN0YW5jZSA6IDk5OTk7CisgICAgICAgIH0KKyAgICAgICAgY29sb3I9IDEwMjQ7CisgICAgICAgIGRpc3RhbmNlPSAtMTsKKyAgICAgICAgZm9yKGJfeD13LTE7IGJfeD49MDsgYl94LS0peworICAgICAgICAgICAgaW50IG1iX2luZGV4X2o9IChiX3g+PmlzX2x1bWEpICsgKGJfeT4+aXNfbHVtYSkqcy0+bWJfc3RyaWRlOworICAgICAgICAgICAgaW50IGVycm9yX2o9IHMtPmVycm9yX3N0YXR1c190YWJsZVttYl9pbmRleF9qXTsKKyAgICAgICAgICAgIGludCBpbnRyYV9qID0gSVNfSU5UUkEocy0+Y3VyX3BpYy5tYl90eXBlW21iX2luZGV4X2pdKTsKKyAgICAgICAgICAgIGlmKGludHJhX2o9PTAgfHwgIShlcnJvcl9qJkVSX0RDX0VSUk9SKSl7CisgICAgICAgICAgICAgICAgY29sb3I9IGRjW2JfeCArIGJfeSpzdHJpZGVdOworICAgICAgICAgICAgICAgIGRpc3RhbmNlPSBiX3g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2wgW2JfeCArIGJfeSpzdHJpZGVdWzBdPSBjb2xvcjsKKyAgICAgICAgICAgIGRpc3RbYl94ICsgYl95KnN0cmlkZV1bMF09IGRpc3RhbmNlID49IDAgPyBkaXN0YW5jZS1iX3ggOiA5OTk5OworICAgICAgICB9CisgICAgfQorICAgIGZvcihiX3g9MDsgYl94PHc7IGJfeCsrKXsKKyAgICAgICAgaW50IGNvbG9yPSAxMDI0OworICAgICAgICBpbnQgZGlzdGFuY2U9IC0xOworICAgICAgICBmb3IoYl95PTA7IGJfeTxoOyBiX3krKyl7CisgICAgICAgICAgICBpbnQgbWJfaW5kZXhfaj0gKGJfeD4+aXNfbHVtYSkgKyAoYl95Pj5pc19sdW1hKSpzLT5tYl9zdHJpZGU7CisgICAgICAgICAgICBpbnQgZXJyb3Jfaj0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW21iX2luZGV4X2pdOworICAgICAgICAgICAgaW50IGludHJhX2ogPSBJU19JTlRSQShzLT5jdXJfcGljLm1iX3R5cGVbbWJfaW5kZXhfal0pOworICAgICAgICAgICAgaWYoaW50cmFfaj09MCB8fCAhKGVycm9yX2omRVJfRENfRVJST1IpKXsKKyAgICAgICAgICAgICAgICBjb2xvcj0gZGNbYl94ICsgYl95KnN0cmlkZV07CisgICAgICAgICAgICAgICAgZGlzdGFuY2U9IGJfeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbCBbYl94ICsgYl95KnN0cmlkZV1bM109IGNvbG9yOworICAgICAgICAgICAgZGlzdFtiX3ggKyBiX3kqc3RyaWRlXVszXT0gZGlzdGFuY2UgPj0gMCA/IGJfeS1kaXN0YW5jZSA6IDk5OTk7CisgICAgICAgIH0KKyAgICAgICAgY29sb3I9IDEwMjQ7CisgICAgICAgIGRpc3RhbmNlPSAtMTsKKyAgICAgICAgZm9yKGJfeT1oLTE7IGJfeT49MDsgYl95LS0peworICAgICAgICAgICAgaW50IG1iX2luZGV4X2o9IChiX3g+PmlzX2x1bWEpICsgKGJfeT4+aXNfbHVtYSkqcy0+bWJfc3RyaWRlOworICAgICAgICAgICAgaW50IGVycm9yX2o9IHMtPmVycm9yX3N0YXR1c190YWJsZVttYl9pbmRleF9qXTsKKyAgICAgICAgICAgIGludCBpbnRyYV9qID0gSVNfSU5UUkEocy0+Y3VyX3BpYy5tYl90eXBlW21iX2luZGV4X2pdKTsKKyAgICAgICAgICAgIGlmKGludHJhX2o9PTAgfHwgIShlcnJvcl9qJkVSX0RDX0VSUk9SKSl7CisgICAgICAgICAgICAgICAgY29sb3I9IGRjW2JfeCArIGJfeSpzdHJpZGVdOworICAgICAgICAgICAgICAgIGRpc3RhbmNlPSBiX3k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2wgW2JfeCArIGJfeSpzdHJpZGVdWzJdPSBjb2xvcjsKKyAgICAgICAgICAgIGRpc3RbYl94ICsgYl95KnN0cmlkZV1bMl09IGRpc3RhbmNlID49IDAgPyBkaXN0YW5jZS1iX3kgOiA5OTk5OworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChiX3kgPSAwOyBiX3kgPCBoOyBiX3krKykgeworICAgICAgICBmb3IgKGJfeCA9IDA7IGJfeCA8IHc7IGJfeCsrKSB7CisgICAgICAgICAgICBpbnQgbWJfaW5kZXgsIGVycm9yLCBqOworICAgICAgICAgICAgaW50NjRfdCBndWVzcywgd2VpZ2h0X3N1bTsKKyAgICAgICAgICAgIG1iX2luZGV4ID0gKGJfeCA+PiBpc19sdW1hKSArIChiX3kgPj4gaXNfbHVtYSkgKiBzLT5tYl9zdHJpZGU7CisgICAgICAgICAgICBlcnJvciAgICA9IHMtPmVycm9yX3N0YXR1c190YWJsZVttYl9pbmRleF07CisKKyAgICAgICAgICAgIGlmIChJU19JTlRFUihzLT5jdXJfcGljLm1iX3R5cGVbbWJfaW5kZXhdKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaW50ZXIKKyAgICAgICAgICAgIGlmICghKGVycm9yICYgRVJfRENfRVJST1IpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBkYy1vaworCisgICAgICAgICAgICB3ZWlnaHRfc3VtID0gMDsKKyAgICAgICAgICAgIGd1ZXNzICAgICAgPSAwOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgIGludDY0X3Qgd2VpZ2h0ICA9IDI1NiAqIDI1NiAqIDI1NiAqIDE2IC8gRkZNQVgoZGlzdFtiX3ggKyBiX3kqc3RyaWRlXVtqXSwgMSk7CisgICAgICAgICAgICAgICAgZ3Vlc3MgICAgICAgICAgKz0gd2VpZ2h0KihpbnQ2NF90KWNvbFtiX3ggKyBiX3kqc3RyaWRlXVtqXTsKKyAgICAgICAgICAgICAgICB3ZWlnaHRfc3VtICAgICArPSB3ZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBndWVzcyA9IChndWVzcyArIHdlaWdodF9zdW0gLyAyKSAvIHdlaWdodF9zdW07CisgICAgICAgICAgICBkY1tiX3ggKyBiX3kgKiBzdHJpZGVdID0gZ3Vlc3M7CisgICAgICAgIH0KKyAgICB9CisKK2ZhaWw6CisgICAgYXZfZnJlZXAoJmNvbCk7CisgICAgYXZfZnJlZXAoJmRpc3QpOworfQorCisvKioKKyAqIHNpbXBsZSBob3Jpem9udGFsIGRlYmxvY2tpbmcgZmlsdGVyIHVzZWQgZm9yIGVycm9yIHJlc2lsaWVuY2UKKyAqIEBwYXJhbSB3ICAgICB3aWR0aCBpbiA4IHBpeGVsIGJsb2NrcworICogQHBhcmFtIGggICAgIGhlaWdodCBpbiA4IHBpeGVsIGJsb2NrcworICovCitzdGF0aWMgdm9pZCBoX2Jsb2NrX2ZpbHRlcihFUkNvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHN0cmlkZSwgaW50IGlzX2x1bWEpCit7CisgICAgaW50IGJfeCwgYl95LCBtdnhfc3RyaWRlLCBtdnlfc3RyaWRlOworICAgIGNvbnN0IHVpbnQ4X3QgKmNtID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgc2V0X212X3N0cmlkZXMocywgJm12eF9zdHJpZGUsICZtdnlfc3RyaWRlKTsKKyAgICBtdnhfc3RyaWRlID4+PSBpc19sdW1hOworICAgIG12eV9zdHJpZGUgKj0gbXZ4X3N0cmlkZTsKKworICAgIGZvciAoYl95ID0gMDsgYl95IDwgaDsgYl95KyspIHsKKyAgICAgICAgZm9yIChiX3ggPSAwOyBiX3ggPCB3IC0gMTsgYl94KyspIHsKKyAgICAgICAgICAgIGludCB5OworICAgICAgICAgICAgaW50IGxlZnRfc3RhdHVzICA9IHMtPmVycm9yX3N0YXR1c190YWJsZVsoIGJfeCAgICAgID4+IGlzX2x1bWEpICsgKGJfeSA+PiBpc19sdW1hKSAqIHMtPm1iX3N0cmlkZV07CisgICAgICAgICAgICBpbnQgcmlnaHRfc3RhdHVzID0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlWygoYl94ICsgMSkgPj4gaXNfbHVtYSkgKyAoYl95ID4+IGlzX2x1bWEpICogcy0+bWJfc3RyaWRlXTsKKyAgICAgICAgICAgIGludCBsZWZ0X2ludHJhICAgPSBJU19JTlRSQShzLT5jdXJfcGljLm1iX3R5cGVbKCBiX3ggICAgICA+PiBpc19sdW1hKSArIChiX3kgPj4gaXNfbHVtYSkgKiBzLT5tYl9zdHJpZGVdKTsKKyAgICAgICAgICAgIGludCByaWdodF9pbnRyYSAgPSBJU19JTlRSQShzLT5jdXJfcGljLm1iX3R5cGVbKChiX3ggKyAxKSA+PiBpc19sdW1hKSArIChiX3kgPj4gaXNfbHVtYSkgKiBzLT5tYl9zdHJpZGVdKTsKKyAgICAgICAgICAgIGludCBsZWZ0X2RhbWFnZSAgPSBsZWZ0X3N0YXR1cyAmIEVSX01CX0VSUk9SOworICAgICAgICAgICAgaW50IHJpZ2h0X2RhbWFnZSA9IHJpZ2h0X3N0YXR1cyAmIEVSX01CX0VSUk9SOworICAgICAgICAgICAgaW50IG9mZnNldCAgICAgICA9IGJfeCAqIDggKyBiX3kgKiBzdHJpZGUgKiA4OworICAgICAgICAgICAgaW50MTZfdCAqbGVmdF9tdiAgPSBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbXZ5X3N0cmlkZSAqIGJfeSArIG12eF9zdHJpZGUgKiAgYl94XTsKKyAgICAgICAgICAgIGludDE2X3QgKnJpZ2h0X212ID0gcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW212eV9zdHJpZGUgKiBiX3kgKyBtdnhfc3RyaWRlICogKGJfeCArIDEpXTsKKyAgICAgICAgICAgIGlmICghKGxlZnRfZGFtYWdlIHx8IHJpZ2h0X2RhbWFnZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGJvdGggdW5kYW1hZ2VkCisgICAgICAgICAgICBpZiAoKCFsZWZ0X2ludHJhKSAmJiAoIXJpZ2h0X2ludHJhKSAmJgorICAgICAgICAgICAgICAgIEZGQUJTKGxlZnRfbXZbMF0gLSByaWdodF9tdlswXSkgKworICAgICAgICAgICAgICAgIEZGQUJTKGxlZnRfbXZbMV0gKyByaWdodF9tdlsxXSkgPCAyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGEsIGIsIGMsIGQ7CisKKyAgICAgICAgICAgICAgICBhID0gZHN0W29mZnNldCArIDcgKyB5ICogc3RyaWRlXSAtIGRzdFtvZmZzZXQgKyA2ICsgeSAqIHN0cmlkZV07CisgICAgICAgICAgICAgICAgYiA9IGRzdFtvZmZzZXQgKyA4ICsgeSAqIHN0cmlkZV0gLSBkc3Rbb2Zmc2V0ICsgNyArIHkgKiBzdHJpZGVdOworICAgICAgICAgICAgICAgIGMgPSBkc3Rbb2Zmc2V0ICsgOSArIHkgKiBzdHJpZGVdIC0gZHN0W29mZnNldCArIDggKyB5ICogc3RyaWRlXTsKKworICAgICAgICAgICAgICAgIGQgPSBGRkFCUyhiKSAtICgoRkZBQlMoYSkgKyBGRkFCUyhjKSArIDEpID4+IDEpOworICAgICAgICAgICAgICAgIGQgPSBGRk1BWChkLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoYiA8IDApCisgICAgICAgICAgICAgICAgICAgIGQgPSAtZDsKKworICAgICAgICAgICAgICAgIGlmIChkID09IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKCEobGVmdF9kYW1hZ2UgJiYgcmlnaHRfZGFtYWdlKSkKKyAgICAgICAgICAgICAgICAgICAgZCA9IGQgKiAxNiAvIDk7CisKKyAgICAgICAgICAgICAgICBpZiAobGVmdF9kYW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIDcgKyB5ICogc3RyaWRlXSA9IGNtW2RzdFtvZmZzZXQgKyA3ICsgeSAqIHN0cmlkZV0gKyAoKGQgKiA3KSA+PiA0KV07CisgICAgICAgICAgICAgICAgICAgIGRzdFtvZmZzZXQgKyA2ICsgeSAqIHN0cmlkZV0gPSBjbVtkc3Rbb2Zmc2V0ICsgNiArIHkgKiBzdHJpZGVdICsgKChkICogNSkgPj4gNCldOworICAgICAgICAgICAgICAgICAgICBkc3Rbb2Zmc2V0ICsgNSArIHkgKiBzdHJpZGVdID0gY21bZHN0W29mZnNldCArIDUgKyB5ICogc3RyaWRlXSArICgoZCAqIDMpID4+IDQpXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIDQgKyB5ICogc3RyaWRlXSA9IGNtW2RzdFtvZmZzZXQgKyA0ICsgeSAqIHN0cmlkZV0gKyAoKGQgKiAxKSA+PiA0KV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyaWdodF9kYW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIDggKyB5ICogc3RyaWRlXSA9IGNtW2RzdFtvZmZzZXQgKyAgOCArIHkgKiBzdHJpZGVdIC0gKChkICogNykgPj4gNCldOworICAgICAgICAgICAgICAgICAgICBkc3Rbb2Zmc2V0ICsgOSArIHkgKiBzdHJpZGVdID0gY21bZHN0W29mZnNldCArICA5ICsgeSAqIHN0cmlkZV0gLSAoKGQgKiA1KSA+PiA0KV07CisgICAgICAgICAgICAgICAgICAgIGRzdFtvZmZzZXQgKyAxMCsgeSAqIHN0cmlkZV0gPSBjbVtkc3Rbb2Zmc2V0ICsgMTAgKyB5ICogc3RyaWRlXSAtICgoZCAqIDMpID4+IDQpXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIDExKyB5ICogc3RyaWRlXSA9IGNtW2RzdFtvZmZzZXQgKyAxMSArIHkgKiBzdHJpZGVdIC0gKChkICogMSkgPj4gNCldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBzaW1wbGUgdmVydGljYWwgZGVibG9ja2luZyBmaWx0ZXIgdXNlZCBmb3IgZXJyb3IgcmVzaWxpZW5jZQorICogQHBhcmFtIHcgICAgIHdpZHRoIGluIDggcGl4ZWwgYmxvY2tzCisgKiBAcGFyYW0gaCAgICAgaGVpZ2h0IGluIDggcGl4ZWwgYmxvY2tzCisgKi8KK3N0YXRpYyB2b2lkIHZfYmxvY2tfZmlsdGVyKEVSQ29udGV4dCAqcywgdWludDhfdCAqZHN0LCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaXNfbHVtYSkKK3sKKyAgICBpbnQgYl94LCBiX3ksIG12eF9zdHJpZGUsIG12eV9zdHJpZGU7CisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICBzZXRfbXZfc3RyaWRlcyhzLCAmbXZ4X3N0cmlkZSwgJm12eV9zdHJpZGUpOworICAgIG12eF9zdHJpZGUgPj49IGlzX2x1bWE7CisgICAgbXZ5X3N0cmlkZSAqPSBtdnhfc3RyaWRlOworCisgICAgZm9yIChiX3kgPSAwOyBiX3kgPCBoIC0gMTsgYl95KyspIHsKKyAgICAgICAgZm9yIChiX3ggPSAwOyBiX3ggPCB3OyBiX3grKykgeworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICBpbnQgdG9wX3N0YXR1cyAgICA9IHMtPmVycm9yX3N0YXR1c190YWJsZVsoYl94ID4+IGlzX2x1bWEpICsgIChiX3kgICAgICA+PiBpc19sdW1hKSAqIHMtPm1iX3N0cmlkZV07CisgICAgICAgICAgICBpbnQgYm90dG9tX3N0YXR1cyA9IHMtPmVycm9yX3N0YXR1c190YWJsZVsoYl94ID4+IGlzX2x1bWEpICsgKChiX3kgKyAxKSA+PiBpc19sdW1hKSAqIHMtPm1iX3N0cmlkZV07CisgICAgICAgICAgICBpbnQgdG9wX2ludHJhICAgICA9IElTX0lOVFJBKHMtPmN1cl9waWMubWJfdHlwZVsoYl94ID4+IGlzX2x1bWEpICsgKCBiX3kgICAgICA+PiBpc19sdW1hKSAqIHMtPm1iX3N0cmlkZV0pOworICAgICAgICAgICAgaW50IGJvdHRvbV9pbnRyYSAgPSBJU19JTlRSQShzLT5jdXJfcGljLm1iX3R5cGVbKGJfeCA+PiBpc19sdW1hKSArICgoYl95ICsgMSkgPj4gaXNfbHVtYSkgKiBzLT5tYl9zdHJpZGVdKTsKKyAgICAgICAgICAgIGludCB0b3BfZGFtYWdlICAgID0gdG9wX3N0YXR1cyAmIEVSX01CX0VSUk9SOworICAgICAgICAgICAgaW50IGJvdHRvbV9kYW1hZ2UgPSBib3R0b21fc3RhdHVzICYgRVJfTUJfRVJST1I7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ICAgICAgICA9IGJfeCAqIDggKyBiX3kgKiBzdHJpZGUgKiA4OworCisgICAgICAgICAgICBpbnQxNl90ICp0b3BfbXYgICAgPSBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbXZ5X3N0cmlkZSAqICBiX3kgICAgICArIG12eF9zdHJpZGUgKiBiX3hdOworICAgICAgICAgICAgaW50MTZfdCAqYm90dG9tX212ID0gcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW212eV9zdHJpZGUgKiAoYl95ICsgMSkgKyBtdnhfc3RyaWRlICogYl94XTsKKworICAgICAgICAgICAgaWYgKCEodG9wX2RhbWFnZSB8fCBib3R0b21fZGFtYWdlKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gYm90aCB1bmRhbWFnZWQKKworICAgICAgICAgICAgaWYgKCghdG9wX2ludHJhKSAmJiAoIWJvdHRvbV9pbnRyYSkgJiYKKyAgICAgICAgICAgICAgICBGRkFCUyh0b3BfbXZbMF0gLSBib3R0b21fbXZbMF0pICsKKyAgICAgICAgICAgICAgICBGRkFCUyh0b3BfbXZbMV0gKyBib3R0b21fbXZbMV0pIDwgMikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykgeworICAgICAgICAgICAgICAgIGludCBhLCBiLCBjLCBkOworCisgICAgICAgICAgICAgICAgYSA9IGRzdFtvZmZzZXQgKyB4ICsgNyAqIHN0cmlkZV0gLSBkc3Rbb2Zmc2V0ICsgeCArIDYgKiBzdHJpZGVdOworICAgICAgICAgICAgICAgIGIgPSBkc3Rbb2Zmc2V0ICsgeCArIDggKiBzdHJpZGVdIC0gZHN0W29mZnNldCArIHggKyA3ICogc3RyaWRlXTsKKyAgICAgICAgICAgICAgICBjID0gZHN0W29mZnNldCArIHggKyA5ICogc3RyaWRlXSAtIGRzdFtvZmZzZXQgKyB4ICsgOCAqIHN0cmlkZV07CisKKyAgICAgICAgICAgICAgICBkID0gRkZBQlMoYikgLSAoKEZGQUJTKGEpICsgRkZBQlMoYykgKyAxKSA+PiAxKTsKKyAgICAgICAgICAgICAgICBkID0gRkZNQVgoZCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKGIgPCAwKQorICAgICAgICAgICAgICAgICAgICBkID0gLWQ7CisKKyAgICAgICAgICAgICAgICBpZiAoZCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmICghKHRvcF9kYW1hZ2UgJiYgYm90dG9tX2RhbWFnZSkpCisgICAgICAgICAgICAgICAgICAgIGQgPSBkICogMTYgLyA5OworCisgICAgICAgICAgICAgICAgaWYgKHRvcF9kYW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIHggKyAgNyAqIHN0cmlkZV0gPSBjbVtkc3Rbb2Zmc2V0ICsgeCArICA3ICogc3RyaWRlXSArICgoZCAqIDcpID4+IDQpXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIHggKyAgNiAqIHN0cmlkZV0gPSBjbVtkc3Rbb2Zmc2V0ICsgeCArICA2ICogc3RyaWRlXSArICgoZCAqIDUpID4+IDQpXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIHggKyAgNSAqIHN0cmlkZV0gPSBjbVtkc3Rbb2Zmc2V0ICsgeCArICA1ICogc3RyaWRlXSArICgoZCAqIDMpID4+IDQpXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIHggKyAgNCAqIHN0cmlkZV0gPSBjbVtkc3Rbb2Zmc2V0ICsgeCArICA0ICogc3RyaWRlXSArICgoZCAqIDEpID4+IDQpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJvdHRvbV9kYW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIHggKyAgOCAqIHN0cmlkZV0gPSBjbVtkc3Rbb2Zmc2V0ICsgeCArICA4ICogc3RyaWRlXSAtICgoZCAqIDcpID4+IDQpXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIHggKyAgOSAqIHN0cmlkZV0gPSBjbVtkc3Rbb2Zmc2V0ICsgeCArICA5ICogc3RyaWRlXSAtICgoZCAqIDUpID4+IDQpXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIHggKyAxMCAqIHN0cmlkZV0gPSBjbVtkc3Rbb2Zmc2V0ICsgeCArIDEwICogc3RyaWRlXSAtICgoZCAqIDMpID4+IDQpXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W29mZnNldCArIHggKyAxMSAqIHN0cmlkZV0gPSBjbVtkc3Rbb2Zmc2V0ICsgeCArIDExICogc3RyaWRlXSAtICgoZCAqIDEpID4+IDQpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGd1ZXNzX212KEVSQ29udGV4dCAqcykKK3sKKyAgICB1aW50OF90ICpmaXhlZCA9IHMtPmVyX3RlbXBfYnVmZmVyOworI2RlZmluZSBNVl9GUk9aRU4gICAgMworI2RlZmluZSBNVl9DSEFOR0VEICAgMgorI2RlZmluZSBNVl9VTkNIQU5HRUQgMQorICAgIGNvbnN0IGludCBtYl9zdHJpZGUgPSBzLT5tYl9zdHJpZGU7CisgICAgY29uc3QgaW50IG1iX3dpZHRoICA9IHMtPm1iX3dpZHRoOworICAgIGNvbnN0IGludCBtYl9oZWlnaHQgPSBzLT5tYl9oZWlnaHQ7CisgICAgaW50IGksIGRlcHRoLCBudW1fYXZhaWw7CisgICAgaW50IG1iX3gsIG1iX3ksIG1vdF9zdGVwLCBtb3Rfc3RyaWRlOworCisgICAgc2V0X212X3N0cmlkZXMocywgJm1vdF9zdGVwLCAmbW90X3N0cmlkZSk7CisKKyAgICBudW1fYXZhaWwgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgeworICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBzLT5tYl9pbmRleDJ4eVtpXTsKKyAgICAgICAgaW50IGYgPSAwOworICAgICAgICBpbnQgZXJyb3IgPSBzLT5lcnJvcl9zdGF0dXNfdGFibGVbbWJfeHldOworCisgICAgICAgIGlmIChJU19JTlRSQShzLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldKSkKKyAgICAgICAgICAgIGYgPSBNVl9GUk9aRU47IC8vIGludHJhIC8vIEZJWE1FIGNoZWNrCisgICAgICAgIGlmICghKGVycm9yICYgRVJfTVZfRVJST1IpKQorICAgICAgICAgICAgZiA9IE1WX0ZST1pFTjsgLy8gaW50ZXIgd2l0aCB1bmRhbWFnZWQgTVYKKworICAgICAgICBmaXhlZFttYl94eV0gPSBmOworICAgICAgICBpZiAoZiA9PSBNVl9GUk9aRU4pCisgICAgICAgICAgICBudW1fYXZhaWwrKzsKKyAgICAgICAgZWxzZSBpZihzLT5sYXN0X3BpYy5mLT5kYXRhWzBdICYmIHMtPmxhc3RfcGljLm1vdGlvbl92YWxbMF0peworICAgICAgICAgICAgY29uc3QgaW50IG1iX3k9IG1iX3h5IC8gcy0+bWJfc3RyaWRlOworICAgICAgICAgICAgY29uc3QgaW50IG1iX3g9IG1iX3h5ICUgcy0+bWJfc3RyaWRlOworICAgICAgICAgICAgY29uc3QgaW50IG1vdF9pbmRleD0gKG1iX3ggKyBtYl95Km1vdF9zdHJpZGUpICogbW90X3N0ZXA7CisgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4XVswXT0gcy0+bGFzdF9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXhdWzBdOworICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleF1bMV09IHMtPmxhc3RfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4XVsxXTsKKyAgICAgICAgICAgIHMtPmN1cl9waWMucmVmX2luZGV4WzBdWzQqbWJfeHldICAgICAgPSBzLT5sYXN0X3BpYy5yZWZfaW5kZXhbMF1bNCptYl94eV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCEocy0+YXZjdHgtPmVycm9yX2NvbmNlYWxtZW50JkZGX0VDX0dVRVNTX01WUykpIHx8CisgICAgICAgIG51bV9hdmFpbCA8PSBtYl93aWR0aCAvIDIpIHsKKyAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IHMtPm1iX2hlaWdodDsgbWJfeSsrKSB7CisgICAgICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYl94eSA9IG1iX3ggKyBtYl95ICogcy0+bWJfc3RyaWRlOworICAgICAgICAgICAgICAgIGludCBtdl9kaXIgPSAocy0+bGFzdF9waWMuZiAmJiBzLT5sYXN0X3BpYy5mLT5kYXRhWzBdKSA/IE1WX0RJUl9GT1JXQVJEIDogTVZfRElSX0JBQ0tXQVJEOworCisgICAgICAgICAgICAgICAgaWYgKElTX0lOVFJBKHMtPmN1cl9waWMubWJfdHlwZVttYl94eV0pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoIShzLT5lcnJvcl9zdGF0dXNfdGFibGVbbWJfeHldICYgRVJfTVZfRVJST1IpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzBdID0gMDsKKyAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgcy0+ZGVjb2RlX21iKHMtPm9wYXF1ZSwgMCwgbXZfZGlyLCBNVl9UWVBFXzE2WDE2LCAmcy0+bXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3gsIG1iX3ksIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGRlcHRoID0gMDsgOyBkZXB0aCsrKSB7CisgICAgICAgIGludCBjaGFuZ2VkLCBwYXNzLCBub25lX2xlZnQ7CisKKyAgICAgICAgbm9uZV9sZWZ0ID0gMTsKKyAgICAgICAgY2hhbmdlZCAgID0gMTsKKyAgICAgICAgZm9yIChwYXNzID0gMDsgKGNoYW5nZWQgfHwgcGFzcyA8IDIpICYmIHBhc3MgPCAxMDsgcGFzcysrKSB7CisgICAgICAgICAgICBpbnQgbWJfeCwgbWJfeTsKKyAgICAgICAgICAgIGludCBzY29yZV9zdW0gPSAwOworCisgICAgICAgICAgICBjaGFuZ2VkID0gMDsKKyAgICAgICAgICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBzLT5tYl9oZWlnaHQ7IG1iX3krKykgeworICAgICAgICAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYl94eSAgICAgICAgPSBtYl94ICsgbWJfeSAqIHMtPm1iX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG12X3ByZWRpY3Rvcls4XVsyXSA9IHsgeyAwIH0gfTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlZls4XSAgICAgICAgICAgICA9IHsgMCB9OworICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZF9jb3VudCAgICAgICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgICAgIGludCBiZXN0X3Njb3JlICAgICAgICAgPSAyNTYgKiAyNTYgKiAyNTYgKiA2NDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJlc3RfcHJlZCAgICAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBtb3RfaW5kZXggICAgPSAobWJfeCArIG1iX3kgKiBtb3Rfc3RyaWRlKSAqIG1vdF9zdGVwOworICAgICAgICAgICAgICAgICAgICBpbnQgcHJldl94ID0gMCwgcHJldl95ID0gMCwgcHJldl9yZWYgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmICgobWJfeCBeIG1iX3kgXiBwYXNzKSAmIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRbbWJfeHldID09IE1WX0ZST1pFTikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQxKCFJU19JTlRSQShzLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldKSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDEocy0+bGFzdF9waWMuZiAmJiBzLT5sYXN0X3BpYy5mLT5kYXRhWzBdKTsKKworICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3ggPiAwICAgICAgICAgICAgICYmIGZpeGVkW21iX3h5IC0gMV0gICAgICAgICA9PSBNVl9GUk9aRU4pCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3ggKyAxIDwgbWJfd2lkdGggICYmIGZpeGVkW21iX3h5ICsgMV0gICAgICAgICA9PSBNVl9GUk9aRU4pCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3kgPiAwICAgICAgICAgICAgICYmIGZpeGVkW21iX3h5IC0gbWJfc3RyaWRlXSA9PSBNVl9GUk9aRU4pCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3kgKyAxIDwgbWJfaGVpZ2h0ICYmIGZpeGVkW21iX3h5ICsgbWJfc3RyaWRlXSA9PSBNVl9GUk9aRU4pCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobWJfeCA+IDAgICAgICAgICAgICAgJiYgZml4ZWRbbWJfeHkgLSAxICAgICAgICBdID09IE1WX0NIQU5HRUQpCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3ggKyAxIDwgbWJfd2lkdGggICYmIGZpeGVkW21iX3h5ICsgMSAgICAgICAgXSA9PSBNVl9DSEFOR0VEKQorICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYl95ID4gMCAgICAgICAgICAgICAmJiBmaXhlZFttYl94eSAtIG1iX3N0cmlkZV0gPT0gTVZfQ0hBTkdFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAobWJfeSArIDEgPCBtYl9oZWlnaHQgJiYgZml4ZWRbbWJfeHkgKyBtYl9zdHJpZGVdID09IE1WX0NIQU5HRUQpCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gMCAmJiBwYXNzID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIG5vbmVfbGVmdCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3ggPiAwICYmIGZpeGVkW21iX3h5IC0gMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleCAtIG1vdF9zdGVwXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleCAtIG1vdF9zdGVwXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcmVkX2NvdW50XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5yZWZfaW5kZXhbMF1bNCAqIChtYl94eSAtIDEpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWJfeCArIDEgPCBtYl93aWR0aCAmJiBmaXhlZFttYl94eSArIDFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXggKyBtb3Rfc3RlcF1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXggKyBtb3Rfc3RlcF1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJlZF9jb3VudF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMucmVmX2luZGV4WzBdWzQgKiAobWJfeHkgKyAxKV07CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkX2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3kgPiAwICYmIGZpeGVkW21iX3h5IC0gbWJfc3RyaWRlXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnRdWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4IC0gbW90X3N0cmlkZSAqIG1vdF9zdGVwXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleCAtIG1vdF9zdHJpZGUgKiBtb3Rfc3RlcF1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJlZF9jb3VudF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMucmVmX2luZGV4WzBdWzQgKiAobWJfeHkgLSBzLT5tYl9zdHJpZGUpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWJfeSArIDE8bWJfaGVpZ2h0ICYmIGZpeGVkW21iX3h5ICsgbWJfc3RyaWRlXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnRdWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4ICsgbW90X3N0cmlkZSAqIG1vdF9zdGVwXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleCArIG1vdF9zdHJpZGUgKiBtb3Rfc3RlcF1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJlZF9jb3VudF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMucmVmX2luZGV4WzBdWzQgKiAobWJfeHkgKyBzLT5tYl9zdHJpZGUpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJlZF9jb3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZWRfY291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VtX3ggPSAwLCBzdW1feSA9IDAsIHN1bV9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfeCwgbWF4X3ksIG1pbl94LCBtaW5feSwgbWF4X3IsIG1pbl9yOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcHJlZF9jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX3ggKz0gbXZfcHJlZGljdG9yW2pdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV95ICs9IG12X3ByZWRpY3RvcltqXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1fciArPSByZWZbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogJiYgcmVmW2pdICE9IHJlZltqIC0gMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcF9tZWFuX2FuZF9tZWRpYW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lYW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVswXSA9IHN1bV94IC8gajsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVsxXSA9IHN1bV95IC8gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcmVkX2NvdW50XSAgICA9IHN1bV9yIC8gajsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVkaWFuICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZF9jb3VudCA+PSAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3kgPSBtaW5feCA9IG1pbl9yID0gIDk5OTk5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF95ID0gbWF4X3ggPSBtYXhfciA9IC05OTk5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3ggPSBtaW5feSA9IG1heF94ID0gbWF4X3kgPSBtaW5fciA9IG1heF9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwcmVkX2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfeCA9IEZGTUFYKG1heF94LCBtdl9wcmVkaWN0b3Jbal1bMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF95ID0gRkZNQVgobWF4X3ksIG12X3ByZWRpY3RvcltqXVsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3IgPSBGRk1BWChtYXhfciwgcmVmW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5feCA9IEZGTUlOKG1pbl94LCBtdl9wcmVkaWN0b3Jbal1bMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl95ID0gRkZNSU4obWluX3ksIG12X3ByZWRpY3RvcltqXVsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3IgPSBGRk1JTihtaW5fciwgcmVmW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50ICsgMV1bMF0gPSBzdW1feCAtIG1heF94IC0gbWluX3g7CisgICAgICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudCArIDFdWzFdID0gc3VtX3kgLSBtYXhfeSAtIG1pbl95OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3ByZWRfY291bnQgKyAxXSAgICA9IHN1bV9yIC0gbWF4X3IgLSBtaW5fcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWRfY291bnQgPT0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50ICsgMV1bMF0gLz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudCArIDFdWzFdIC89IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3ByZWRfY291bnQgKyAxXSAgICAvPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZF9jb3VudCArPSAyOworICAgICAgICAgICAgICAgICAgICB9CisKK3NraXBfbWVhbl9hbmRfbWVkaWFuOgorICAgICAgICAgICAgICAgICAgICAvKiB6ZXJvIE1WICovCisgICAgICAgICAgICAgICAgICAgIHByZWRfY291bnQrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWZpeGVkW21iX3h5XSAmJiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3Mocy0+bGFzdF9waWMudGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3ksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzLT5sYXN0X3BpYy5tb3Rpb25fdmFsWzBdIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXMtPmxhc3RfcGljLnJlZl9pbmRleFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXBfbGFzdF9tdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfeCAgID0gcy0+bGFzdF9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXhdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgcHJldl95ICAgPSBzLT5sYXN0X3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleF1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3JlZiA9IHMtPmxhc3RfcGljLnJlZl9pbmRleFswXVs0ICogbWJfeHldOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldl94ICAgPSBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4XVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfeSAgID0gcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleF1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3JlZiA9IHMtPmN1cl9waWMucmVmX2luZGV4WzBdWzQgKiBtYl94eV07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBsYXN0IE1WICovCisgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVswXSA9IHByZXZfeDsKKyAgICAgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnRdWzFdID0gcHJldl95OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJlZF9jb3VudF0gICAgPSBwcmV2X3JlZjsKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9jb3VudCsrOworCitza2lwX2xhc3RfbXY6CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHByZWRfY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsaW5lc2l6ZSA9IHMtPmN1cl9waWMuZi0+bGluZXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NvcmUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjID0gcy0+Y3VyX3BpYy5mLT5kYXRhWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3ggKiAxNiArIG1iX3kgKiAxNiAqIGxpbmVzaXplWzBdOworCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4XVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSBtdl9wcmVkaWN0b3Jbal1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4XVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSBtdl9wcmVkaWN0b3Jbal1bMV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWRpY3RvciBpbnRyYSBvciBvdGhlcndpc2Ugbm90IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZltqXSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlY29kZV9tYihzLT5vcGFxdWUsIHJlZltqXSwgTVZfRElSX0ZPUldBUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfVFlQRV8xNlgxNiwgJnMtPm12LCBtYl94LCBtYl95LCAwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3ggPiAwICYmIGZpeGVkW21iX3h5IC0gMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gRkZBQlMoc3JjW2sgKiBsaW5lc2l6ZVswXSAtIDFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW2sgKiBsaW5lc2l6ZVswXV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3ggKyAxIDwgbWJfd2lkdGggJiYgZml4ZWRbbWJfeHkgKyAxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSArPSBGRkFCUyhzcmNbayAqIGxpbmVzaXplWzBdICsgMTVdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW2sgKiBsaW5lc2l6ZVswXSArIDE2XSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWJfeSA+IDAgJiYgZml4ZWRbbWJfeHkgLSBtYl9zdHJpZGVdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlICs9IEZGQUJTKHNyY1trIC0gbGluZXNpemVbMF1dIC0gc3JjW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYl95ICsgMSA8IG1iX2hlaWdodCAmJiBmaXhlZFttYl94eSArIG1iX3N0cmlkZV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gRkZBQlMoc3JjW2sgKyBsaW5lc2l6ZVswXSAqIDE1XSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1trICsgbGluZXNpemVbMF0gKiAxNl0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPD0gYmVzdF9zY29yZSkgeyAvLyA8PSB3aWxsIGZhdm9yIHRoZSBsYXN0IE1WCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcHJlZCAgPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNjb3JlX3N1bSArPSBiZXN0X3Njb3JlOworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9IG12X3ByZWRpY3RvcltiZXN0X3ByZWRdWzBdOworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IG12X3ByZWRpY3RvcltiZXN0X3ByZWRdWzFdOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb3Rfc3RlcDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1vdF9zdGVwOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4ICsgaSArIGogKiBtb3Rfc3RyaWRlXVswXSA9IHMtPm12WzBdWzBdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXggKyBpICsgaiAqIG1vdF9zdHJpZGVdWzFdID0gcy0+bXZbMF1bMF1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcy0+ZGVjb2RlX21iKHMtPm9wYXF1ZSwgcmVmW2Jlc3RfcHJlZF0sIE1WX0RJUl9GT1JXQVJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfVFlQRV8xNlgxNiwgJnMtPm12LCBtYl94LCBtYl95LCAwLCAwKTsKKworCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tdlswXVswXVswXSAhPSBwcmV2X3ggfHwgcy0+bXZbMF1bMF1bMV0gIT0gcHJldl95KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZFttYl94eV0gPSBNVl9DSEFOR0VEOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkW21iX3h5XSA9IE1WX1VOQ0hBTkdFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobm9uZV9sZWZ0KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgeworICAgICAgICAgICAgaW50IG1iX3h5ID0gcy0+bWJfaW5kZXgyeHlbaV07CisgICAgICAgICAgICBpZiAoZml4ZWRbbWJfeHldKQorICAgICAgICAgICAgICAgIGZpeGVkW21iX3h5XSA9IE1WX0ZST1pFTjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBpc19pbnRyYV9tb3JlX2xpa2VseShFUkNvbnRleHQgKnMpCit7CisgICAgaW50IGlzX2ludHJhX2xpa2VseSwgaSwgaiwgdW5kYW1hZ2VkX2NvdW50LCBza2lwX2Ftb3VudCwgbWJfeCwgbWJfeTsKKworICAgIGlmICghcy0+bGFzdF9waWMuZiB8fCAhcy0+bGFzdF9waWMuZi0+ZGF0YVswXSkKKyAgICAgICAgcmV0dXJuIDE7IC8vIG5vIHByZXZpb3VzIGZyYW1lIGF2YWlsYWJsZSAtPiB1c2Ugc3BhdGlhbCBwcmVkaWN0aW9uCisKKyAgICBpZiAocy0+YXZjdHgtPmVycm9yX2NvbmNlYWxtZW50ICYgRkZfRUNfRkFWT1JfSU5URVIpCisgICAgICAgIHJldHVybiAwOworCisgICAgdW5kYW1hZ2VkX2NvdW50ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bWJfbnVtOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IG1iX3h5ID0gcy0+bWJfaW5kZXgyeHlbaV07CisgICAgICAgIGNvbnN0IGludCBlcnJvciA9IHMtPmVycm9yX3N0YXR1c190YWJsZVttYl94eV07CisgICAgICAgIGlmICghKChlcnJvciAmIEVSX0RDX0VSUk9SKSAmJiAoZXJyb3IgJiBFUl9NVl9FUlJPUikpKQorICAgICAgICAgICAgdW5kYW1hZ2VkX2NvdW50Kys7CisgICAgfQorCisgICAgaWYgKHMtPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmIHMtPnJlZl9jb3VudCA8PSAwKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGlmICh1bmRhbWFnZWRfY291bnQgPCA1KQorICAgICAgICByZXR1cm4gMDsgLy8gYWxtb3N0IGFsbCBNQnMgZGFtYWdlZCAtPiB1c2UgdGVtcG9yYWwgcHJlZGljdGlvbgorCisgICAgLy8gcHJldmVudCBkc3Auc2FkKCkgY2hlY2ssIHRoYXQgcmVxdWlyZXMgYWNjZXNzIHRvIHRoZSBpbWFnZQorICAgIGlmIChDT05GSUdfWFZNQyAgICAmJgorICAgICAgICBzLT5hdmN0eC0+aHdhY2NlbCAmJiBzLT5hdmN0eC0+aHdhY2NlbC0+ZGVjb2RlX21iICYmCisgICAgICAgIHMtPmN1cl9waWMuZi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHNraXBfYW1vdW50ICAgICA9IEZGTUFYKHVuZGFtYWdlZF9jb3VudCAvIDUwLCAxKTsgLy8gY2hlY2sgb25seSB1cCB0byA1MCBNQnMKKyAgICBpc19pbnRyYV9saWtlbHkgPSAwOworCisgICAgaiA9IDA7CisgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IHMtPm1iX2hlaWdodCAtIDE7IG1iX3krKykgeworICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgaW50IGVycm9yOworICAgICAgICAgICAgY29uc3QgaW50IG1iX3h5ID0gbWJfeCArIG1iX3kgKiBzLT5tYl9zdHJpZGU7CisKKyAgICAgICAgICAgIGVycm9yID0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW21iX3h5XTsKKyAgICAgICAgICAgIGlmICgoZXJyb3IgJiBFUl9EQ19FUlJPUikgJiYgKGVycm9yICYgRVJfTVZfRVJST1IpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIGRhbWFnZWQKKworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgLy8gc2tpcCBhIGZldyB0byBzcGVlZCB0aGluZ3MgdXAKKyAgICAgICAgICAgIGlmICgoaiAlIHNraXBfYW1vdW50KSAhPSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAocy0+Y3VyX3BpYy5mLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgICAgICAgICBpbnQgKmxpbmVzaXplID0gcy0+Y3VyX3BpYy5mLT5saW5lc2l6ZTsKKyAgICAgICAgICAgICAgICB1aW50OF90ICptYl9wdHIgICAgICA9IHMtPmN1cl9waWMuZi0+ZGF0YVswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl94ICogMTYgKyBtYl95ICogMTYgKiBsaW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpsYXN0X21iX3B0ciA9IHMtPmxhc3RfcGljLmYtPmRhdGFbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfeCAqIDE2ICsgbWJfeSAqIDE2ICogbGluZXNpemVbMF07CisKKyAgICAgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3Mocy0+bGFzdF9waWMudGYsIG1iX3ksIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc19pbnRyYV9saWtlbHkgKz0gcy0+bWVjYy0+c2FkWzBdKE5VTEwsIGxhc3RfbWJfcHRyLCBtYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZVswXSwgMTYpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIG5lZWQgYXdhaXRfcHJvZ3Jlc3MoKSBoZXJlCisgICAgICAgICAgICAgICAgaXNfaW50cmFfbGlrZWx5IC09IHMtPm1lY2MtPnNhZFswXShOVUxMLCBsYXN0X21iX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbWJfcHRyICsgbGluZXNpemVbMF0gKiAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplWzBdLCAxNik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChJU19JTlRSQShzLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldKSkKKyAgICAgICAgICAgICAgICAgICBpc19pbnRyYV9saWtlbHkrKzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgaXNfaW50cmFfbGlrZWx5LS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisvLyAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJpc19pbnRyYV9saWtlbHk6ICVkIHR5cGU6JWRcbiIsIGlzX2ludHJhX2xpa2VseSwgcy0+cGljdF90eXBlKTsKKyAgICByZXR1cm4gaXNfaW50cmFfbGlrZWx5ID4gMDsKK30KKwordm9pZCBmZl9lcl9mcmFtZV9zdGFydChFUkNvbnRleHQgKnMpCit7CisgICAgaWYgKCFzLT5hdmN0eC0+ZXJyb3JfY29uY2VhbG1lbnQpCisgICAgICAgIHJldHVybjsKKworICAgIG1lbXNldChzLT5lcnJvcl9zdGF0dXNfdGFibGUsIEVSX01CX0VSUk9SIHwgVlBfU1RBUlQgfCBFUl9NQl9FTkQsCisgICAgICAgICAgIHMtPm1iX3N0cmlkZSAqIHMtPm1iX2hlaWdodCAqIHNpemVvZih1aW50OF90KSk7CisgICAgcy0+ZXJyb3JfY291bnQgICAgPSAzICogcy0+bWJfbnVtOworICAgIHMtPmVycm9yX29jY3VycmVkID0gMDsKK30KKworc3RhdGljIGludCBlcl9zdXBwb3J0ZWQoRVJDb250ZXh0ICpzKQoreworICAgIGlmKHMtPmF2Y3R4LT5od2FjY2VsICYmIHMtPmF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2UgICAgICAgICAgIHx8CisgICAgICAgcy0+YXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMmQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUgICAgICAgICAgfHwKKyAgICAgICAhcy0+Y3VyX3BpYy5mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgIHMtPmN1cl9waWMuZmllbGRfcGljdHVyZQorICAgICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQWRkIGEgc2xpY2UuCisgKiBAcGFyYW0gZW5keCAgIHggY29tcG9uZW50IG9mIHRoZSBsYXN0IG1hY3JvYmxvY2ssIGNhbiBiZSAtMQorICogICAgICAgICAgICAgICBmb3IgdGhlIGxhc3Qgb2YgdGhlIHByZXZpb3VzIGxpbmUKKyAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyBhdCB0aGUgZW5kIChFUl9NVl9FTkQsIEVSX0FDX0VSUk9SLCAuLi4pLCBpdCBpcworICogICAgICAgICAgICAgICBhc3N1bWVkIHRoYXQgbm8gZWFybGllciBlbmQgb3IgZXJyb3Igb2YgdGhlIHNhbWUgdHlwZSBvY2N1cnJlZAorICovCit2b2lkIGZmX2VyX2FkZF9zbGljZShFUkNvbnRleHQgKnMsIGludCBzdGFydHgsIGludCBzdGFydHksCisgICAgICAgICAgICAgICAgICAgICBpbnQgZW5keCwgaW50IGVuZHksIGludCBzdGF0dXMpCit7CisgICAgY29uc3QgaW50IHN0YXJ0X2kgID0gYXZfY2xpcChzdGFydHggKyBzdGFydHkgKiBzLT5tYl93aWR0aCwgMCwgcy0+bWJfbnVtIC0gMSk7CisgICAgY29uc3QgaW50IGVuZF9pICAgID0gYXZfY2xpcChlbmR4ICAgKyBlbmR5ICAgKiBzLT5tYl93aWR0aCwgMCwgcy0+bWJfbnVtKTsKKyAgICBjb25zdCBpbnQgc3RhcnRfeHkgPSBzLT5tYl9pbmRleDJ4eVtzdGFydF9pXTsKKyAgICBjb25zdCBpbnQgZW5kX3h5ICAgPSBzLT5tYl9pbmRleDJ4eVtlbmRfaV07CisgICAgaW50IG1hc2sgICAgICAgICAgID0gLTE7CisKKyAgICBpZiAocy0+YXZjdHgtPmh3YWNjZWwgJiYgcy0+YXZjdHgtPmh3YWNjZWwtPmRlY29kZV9zbGljZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHN0YXJ0X2kgPiBlbmRfaSB8fCBzdGFydF94eSA+IGVuZF94eSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJpbnRlcm5hbCBlcnJvciwgc2xpY2UgZW5kIGJlZm9yZSBzdGFydFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXMtPmF2Y3R4LT5lcnJvcl9jb25jZWFsbWVudCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbWFzayAmPSB+VlBfU1RBUlQ7CisgICAgaWYgKHN0YXR1cyAmIChFUl9BQ19FUlJPUiB8IEVSX0FDX0VORCkpIHsKKyAgICAgICAgbWFzayAgICAgICAgICAgJj0gfihFUl9BQ19FUlJPUiB8IEVSX0FDX0VORCk7CisgICAgICAgIHMtPmVycm9yX2NvdW50IC09IGVuZF9pIC0gc3RhcnRfaSArIDE7CisgICAgfQorICAgIGlmIChzdGF0dXMgJiAoRVJfRENfRVJST1IgfCBFUl9EQ19FTkQpKSB7CisgICAgICAgIG1hc2sgICAgICAgICAgICY9IH4oRVJfRENfRVJST1IgfCBFUl9EQ19FTkQpOworICAgICAgICBzLT5lcnJvcl9jb3VudCAtPSBlbmRfaSAtIHN0YXJ0X2kgKyAxOworICAgIH0KKyAgICBpZiAoc3RhdHVzICYgKEVSX01WX0VSUk9SIHwgRVJfTVZfRU5EKSkgeworICAgICAgICBtYXNrICAgICAgICAgICAmPSB+KEVSX01WX0VSUk9SIHwgRVJfTVZfRU5EKTsKKyAgICAgICAgcy0+ZXJyb3JfY291bnQgLT0gZW5kX2kgLSBzdGFydF9pICsgMTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICYgRVJfTUJfRVJST1IpIHsKKyAgICAgICAgcy0+ZXJyb3Jfb2NjdXJyZWQgPSAxOworICAgICAgICBzLT5lcnJvcl9jb3VudCAgICA9IElOVF9NQVg7CisgICAgfQorCisgICAgaWYgKG1hc2sgPT0gfjB4N0YpIHsKKyAgICAgICAgbWVtc2V0KCZzLT5lcnJvcl9zdGF0dXNfdGFibGVbc3RhcnRfeHldLCAwLAorICAgICAgICAgICAgICAgKGVuZF94eSAtIHN0YXJ0X3h5KSAqIHNpemVvZih1aW50OF90KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IHN0YXJ0X3h5OyBpIDwgZW5kX3h5OyBpKyspCisgICAgICAgICAgICBzLT5lcnJvcl9zdGF0dXNfdGFibGVbaV0gJj0gbWFzazsKKyAgICB9CisKKyAgICBpZiAoZW5kX2kgPT0gcy0+bWJfbnVtKQorICAgICAgICBzLT5lcnJvcl9jb3VudCA9IElOVF9NQVg7CisgICAgZWxzZSB7CisgICAgICAgIHMtPmVycm9yX3N0YXR1c190YWJsZVtlbmRfeHldICY9IG1hc2s7CisgICAgICAgIHMtPmVycm9yX3N0YXR1c190YWJsZVtlbmRfeHldIHw9IHN0YXR1czsKKyAgICB9CisKKyAgICBzLT5lcnJvcl9zdGF0dXNfdGFibGVbc3RhcnRfeHldIHw9IFZQX1NUQVJUOworCisgICAgaWYgKHN0YXJ0X3h5ID4gMCAmJiAhKHMtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpICYmCisgICAgICAgIGVyX3N1cHBvcnRlZChzKSAmJiBzLT5hdmN0eC0+c2tpcF90b3AgKiBzLT5tYl93aWR0aCA8IHN0YXJ0X2kpIHsKKyAgICAgICAgaW50IHByZXZfc3RhdHVzID0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW3MtPm1iX2luZGV4Mnh5W3N0YXJ0X2kgLSAxXV07CisKKyAgICAgICAgcHJldl9zdGF0dXMgJj0gfiBWUF9TVEFSVDsKKyAgICAgICAgaWYgKHByZXZfc3RhdHVzICE9IChFUl9NVl9FTkQgfCBFUl9EQ19FTkQgfCBFUl9BQ19FTkQpKSB7CisgICAgICAgICAgICBzLT5lcnJvcl9vY2N1cnJlZCA9IDE7CisgICAgICAgICAgICBzLT5lcnJvcl9jb3VudCA9IElOVF9NQVg7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZmZfZXJfZnJhbWVfZW5kKEVSQ29udGV4dCAqcykKK3sKKyAgICBpbnQgKmxpbmVzaXplID0gTlVMTDsKKyAgICBpbnQgaSwgbWJfeCwgbWJfeSwgZXJyb3IsIGVycm9yX3R5cGUsIGRjX2Vycm9yLCBtdl9lcnJvciwgYWNfZXJyb3I7CisgICAgaW50IGRpc3RhbmNlOworICAgIGludCB0aHJlc2hvbGRfcGFydFs0XSA9IHsgMTAwLCAxMDAsIDEwMCB9OworICAgIGludCB0aHJlc2hvbGQgPSA1MDsKKyAgICBpbnQgaXNfaW50cmFfbGlrZWx5OworICAgIGludCBzaXplID0gcy0+Yjhfc3RyaWRlICogMiAqIHMtPm1iX2hlaWdodDsKKworICAgIC8qIFdlIGRvIG5vdCBzdXBwb3J0IEVSIG9mIGZpZWxkIHBpY3R1cmVzIHlldCwKKyAgICAgKiB0aG91Z2ggaXQgc2hvdWxkIG5vdCBjcmFzaCBpZiBlbmFibGVkLiAqLworICAgIGlmICghcy0+YXZjdHgtPmVycm9yX2NvbmNlYWxtZW50IHx8IHMtPmVycm9yX2NvdW50ID09IDAgICAgICAgICAgICB8fAorICAgICAgICBzLT5hdmN0eC0+bG93cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAhZXJfc3VwcG9ydGVkKHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICBzLT5lcnJvcl9jb3VudCA9PSAzICogcy0+bWJfd2lkdGggKgorICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+YXZjdHgtPnNraXBfdG9wICsgcy0+YXZjdHgtPnNraXBfYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxpbmVzaXplID0gcy0+Y3VyX3BpYy5mLT5saW5lc2l6ZTsKKyAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICBpbnQgc3RhdHVzID0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW21iX3ggKyAocy0+bWJfaGVpZ2h0IC0gMSkgKiBzLT5tYl9zdHJpZGVdOworICAgICAgICBpZiAoc3RhdHVzICE9IDB4N0YpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoICAgbWJfeCA9PSBzLT5tYl93aWR0aAorICAgICAgICAmJiBzLT5hdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTworICAgICAgICAmJiAocy0+YXZjdHgtPmhlaWdodCYxNikKKyAgICAgICAgJiYgcy0+ZXJyb3JfY291bnQgPT0gMyAqIHMtPm1iX3dpZHRoICogKHMtPmF2Y3R4LT5za2lwX3RvcCArIHMtPmF2Y3R4LT5za2lwX2JvdHRvbSArIDEpCisgICAgKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiaWdub3JpbmcgbGFzdCBtaXNzaW5nIHNsaWNlXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzLT5sYXN0X3BpYy5mKSB7CisgICAgICAgIGlmIChzLT5sYXN0X3BpYy5mLT53aWR0aCAgIT0gcy0+Y3VyX3BpYy5mLT53aWR0aCAgfHwKKyAgICAgICAgICAgIHMtPmxhc3RfcGljLmYtPmhlaWdodCAhPSBzLT5jdXJfcGljLmYtPmhlaWdodCB8fAorICAgICAgICAgICAgcy0+bGFzdF9waWMuZi0+Zm9ybWF0ICE9IHMtPmN1cl9waWMuZi0+Zm9ybWF0KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQ2Fubm90IHVzZSBwcmV2aW91cyBwaWN0dXJlIGluIGVycm9yIGNvbmNlYWxtZW50XG4iKTsKKyAgICAgICAgICAgIG1lbXNldCgmcy0+bGFzdF9waWMsIDAsIHNpemVvZihzLT5sYXN0X3BpYykpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5uZXh0X3BpYy5mKSB7CisgICAgICAgIGlmIChzLT5uZXh0X3BpYy5mLT53aWR0aCAgIT0gcy0+Y3VyX3BpYy5mLT53aWR0aCAgfHwKKyAgICAgICAgICAgIHMtPm5leHRfcGljLmYtPmhlaWdodCAhPSBzLT5jdXJfcGljLmYtPmhlaWdodCB8fAorICAgICAgICAgICAgcy0+bmV4dF9waWMuZi0+Zm9ybWF0ICE9IHMtPmN1cl9waWMuZi0+Zm9ybWF0KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQ2Fubm90IHVzZSBuZXh0IHBpY3R1cmUgaW4gZXJyb3IgY29uY2VhbG1lbnRcbiIpOworICAgICAgICAgICAgbWVtc2V0KCZzLT5uZXh0X3BpYywgMCwgc2l6ZW9mKHMtPm5leHRfcGljKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXMtPmN1cl9waWMubW90aW9uX3ZhbFswXSB8fCAhcy0+Y3VyX3BpYy5yZWZfaW5kZXhbMF0pIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJXYXJuaW5nIE1WcyBub3QgYXZhaWxhYmxlXG4iKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBzLT5yZWZfaW5kZXhfYnVmW2ldICA9IGF2X2J1ZmZlcl9hbGxvY3oocy0+bWJfc3RyaWRlICogcy0+bWJfaGVpZ2h0ICogNCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICBzLT5tb3Rpb25fdmFsX2J1ZltpXSA9IGF2X2J1ZmZlcl9hbGxvY3ooKHNpemUgKyA0KSAqIDIgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgIGlmICghcy0+cmVmX2luZGV4X2J1ZltpXSB8fCAhcy0+bW90aW9uX3ZhbF9idWZbaV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzLT5jdXJfcGljLnJlZl9pbmRleFtpXSAgPSBzLT5yZWZfaW5kZXhfYnVmW2ldLT5kYXRhOworICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsW2ldID0gKGludDE2X3QgKCopWzJdKXMtPm1vdGlvbl92YWxfYnVmW2ldLT5kYXRhICsgNDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA8IDIpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnMtPnJlZl9pbmRleF9idWZbaV0pOworICAgICAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+bW90aW9uX3ZhbF9idWZbaV0pOworICAgICAgICAgICAgICAgIHMtPmN1cl9waWMucmVmX2luZGV4W2ldICA9IE5VTEw7CisgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsW2ldID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19FUikgeworICAgICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgcy0+bWJfaGVpZ2h0OyBtYl95KyspIHsKKyAgICAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXR1cyA9IHMtPmVycm9yX3N0YXR1c190YWJsZVttYl94ICsgbWJfeSAqIHMtPm1iX3N0cmlkZV07CisKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIiUyWCAiLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgICAgICB9CisgICAgfQorCisjaWYgMQorICAgIC8qIGhhbmRsZSBvdmVybGFwcGluZyBzbGljZXMgKi8KKyAgICBmb3IgKGVycm9yX3R5cGUgPSAxOyBlcnJvcl90eXBlIDw9IDM7IGVycm9yX3R5cGUrKykgeworICAgICAgICBpbnQgZW5kX29rID0gMDsKKworICAgICAgICBmb3IgKGkgPSBzLT5tYl9udW0gLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgY29uc3QgaW50IG1iX3h5ID0gcy0+bWJfaW5kZXgyeHlbaV07CisgICAgICAgICAgICBpbnQgZXJyb3IgICAgICAgPSBzLT5lcnJvcl9zdGF0dXNfdGFibGVbbWJfeHldOworCisgICAgICAgICAgICBpZiAoZXJyb3IgJiAoMSA8PCBlcnJvcl90eXBlKSkKKyAgICAgICAgICAgICAgICBlbmRfb2sgPSAxOworICAgICAgICAgICAgaWYgKGVycm9yICYgKDggPDwgZXJyb3JfdHlwZSkpCisgICAgICAgICAgICAgICAgZW5kX29rID0gMTsKKworICAgICAgICAgICAgaWYgKCFlbmRfb2spCisgICAgICAgICAgICAgICAgcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW21iX3h5XSB8PSAxIDw8IGVycm9yX3R5cGU7CisKKyAgICAgICAgICAgIGlmIChlcnJvciAmIFZQX1NUQVJUKQorICAgICAgICAgICAgICAgIGVuZF9vayA9IDA7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyNpZiAxCisgICAgLyogaGFuZGxlIHNsaWNlcyB3aXRoIHBhcnRpdGlvbnMgb2YgZGlmZmVyZW50IGxlbmd0aCAqLworICAgIGlmIChzLT5wYXJ0aXRpb25lZF9mcmFtZSkgeworICAgICAgICBpbnQgZW5kX29rID0gMDsKKworICAgICAgICBmb3IgKGkgPSBzLT5tYl9udW0gLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgY29uc3QgaW50IG1iX3h5ID0gcy0+bWJfaW5kZXgyeHlbaV07CisgICAgICAgICAgICBpbnQgZXJyb3IgICAgICAgPSBzLT5lcnJvcl9zdGF0dXNfdGFibGVbbWJfeHldOworCisgICAgICAgICAgICBpZiAoZXJyb3IgJiBFUl9BQ19FTkQpCisgICAgICAgICAgICAgICAgZW5kX29rID0gMDsKKyAgICAgICAgICAgIGlmICgoZXJyb3IgJiBFUl9NVl9FTkQpIHx8CisgICAgICAgICAgICAgICAgKGVycm9yICYgRVJfRENfRU5EKSB8fAorICAgICAgICAgICAgICAgIChlcnJvciAmIEVSX0FDX0VSUk9SKSkKKyAgICAgICAgICAgICAgICBlbmRfb2sgPSAxOworCisgICAgICAgICAgICBpZiAoIWVuZF9vaykKKyAgICAgICAgICAgICAgICBzLT5lcnJvcl9zdGF0dXNfdGFibGVbbWJfeHldfD0gRVJfQUNfRVJST1I7CisKKyAgICAgICAgICAgIGlmIChlcnJvciAmIFZQX1NUQVJUKQorICAgICAgICAgICAgICAgIGVuZF9vayA9IDA7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBoYW5kbGUgbWlzc2luZyBzbGljZXMgKi8KKyAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpIHsKKyAgICAgICAgaW50IGVuZF9vayA9IDE7CisKKyAgICAgICAgLy8gRklYTUUgKyAxMDAgaGFjaworICAgICAgICBmb3IgKGkgPSBzLT5tYl9udW0gLSAyOyBpID49IHMtPm1iX3dpZHRoICsgMTAwOyBpLS0pIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBtYl94eSA9IHMtPm1iX2luZGV4Mnh5W2ldOworICAgICAgICAgICAgaW50IGVycm9yMSA9IHMtPmVycm9yX3N0YXR1c190YWJsZVttYl94eV07CisgICAgICAgICAgICBpbnQgZXJyb3IyID0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW3MtPm1iX2luZGV4Mnh5W2kgKyAxXV07CisKKyAgICAgICAgICAgIGlmIChlcnJvcjEgJiBWUF9TVEFSVCkKKyAgICAgICAgICAgICAgICBlbmRfb2sgPSAxOworCisgICAgICAgICAgICBpZiAoZXJyb3IyID09IChWUF9TVEFSVCB8IEVSX01CX0VSUk9SIHwgRVJfTUJfRU5EKSAmJgorICAgICAgICAgICAgICAgIGVycm9yMSAhPSAoVlBfU1RBUlQgfCBFUl9NQl9FUlJPUiB8IEVSX01CX0VORCkgJiYKKyAgICAgICAgICAgICAgICAoKGVycm9yMSAmIEVSX0FDX0VORCkgfHwgKGVycm9yMSAmIEVSX0RDX0VORCkgfHwKKyAgICAgICAgICAgICAgICAoZXJyb3IxICYgRVJfTVZfRU5EKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBlbmQgJiB1bmluaXQKKyAgICAgICAgICAgICAgICBlbmRfb2sgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWVuZF9vaykKKyAgICAgICAgICAgICAgICBzLT5lcnJvcl9zdGF0dXNfdGFibGVbbWJfeHldIHw9IEVSX01CX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisjaWYgMQorICAgIC8qIGJhY2t3YXJkIG1hcmsgZXJyb3JzICovCisgICAgZGlzdGFuY2UgPSA5OTk5OTk5OworICAgIGZvciAoZXJyb3JfdHlwZSA9IDE7IGVycm9yX3R5cGUgPD0gMzsgZXJyb3JfdHlwZSsrKSB7CisgICAgICAgIGZvciAoaSA9IHMtPm1iX251bSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBzLT5tYl9pbmRleDJ4eVtpXTsKKyAgICAgICAgICAgIGludCAgICAgICBlcnJvciA9IHMtPmVycm9yX3N0YXR1c190YWJsZVttYl94eV07CisKKyAgICAgICAgICAgIGlmICghcy0+bWJza2lwX3RhYmxlW21iX3h5XSkgLy8gRklYTUUgcGFydGl0aW9uIHNwZWNpZmljCisgICAgICAgICAgICAgICAgZGlzdGFuY2UrKzsKKyAgICAgICAgICAgIGlmIChlcnJvciAmICgxIDw8IGVycm9yX3R5cGUpKQorICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gMDsKKworICAgICAgICAgICAgaWYgKHMtPnBhcnRpdGlvbmVkX2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgdGhyZXNob2xkX3BhcnRbZXJyb3JfdHlwZSAtIDFdKQorICAgICAgICAgICAgICAgICAgICBzLT5lcnJvcl9zdGF0dXNfdGFibGVbbWJfeHldIHw9IDEgPDwgZXJyb3JfdHlwZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgdGhyZXNob2xkKQorICAgICAgICAgICAgICAgICAgICBzLT5lcnJvcl9zdGF0dXNfdGFibGVbbWJfeHldIHw9IDEgPDwgZXJyb3JfdHlwZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVycm9yICYgVlBfU1RBUlQpCisgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSA5OTk5OTk5OworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBmb3J3YXJkIG1hcmsgZXJyb3JzICovCisgICAgZXJyb3IgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgeworICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBzLT5tYl9pbmRleDJ4eVtpXTsKKyAgICAgICAgaW50IG9sZF9lcnJvciAgID0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW21iX3h5XTsKKworICAgICAgICBpZiAob2xkX2Vycm9yICYgVlBfU1RBUlQpIHsKKyAgICAgICAgICAgIGVycm9yID0gb2xkX2Vycm9yICYgRVJfTUJfRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnJvciB8PSBvbGRfZXJyb3IgJiBFUl9NQl9FUlJPUjsKKyAgICAgICAgICAgIHMtPmVycm9yX3N0YXR1c190YWJsZVttYl94eV0gfD0gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisjaWYgMQorICAgIC8qIGhhbmRsZSBub3QgcGFydGl0aW9uZWQgY2FzZSAqLworICAgIGlmICghcy0+cGFydGl0aW9uZWRfZnJhbWUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm1iX251bTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBzLT5tYl9pbmRleDJ4eVtpXTsKKyAgICAgICAgICAgIGludCBlcnJvciA9IHMtPmVycm9yX3N0YXR1c190YWJsZVttYl94eV07CisgICAgICAgICAgICBpZiAoZXJyb3IgJiBFUl9NQl9FUlJPUikKKyAgICAgICAgICAgICAgICBlcnJvciB8PSBFUl9NQl9FUlJPUjsKKyAgICAgICAgICAgIHMtPmVycm9yX3N0YXR1c190YWJsZVttYl94eV0gPSBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZGNfZXJyb3IgPSBhY19lcnJvciA9IG12X2Vycm9yID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bWJfbnVtOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IG1iX3h5ID0gcy0+bWJfaW5kZXgyeHlbaV07CisgICAgICAgIGludCBlcnJvciA9IHMtPmVycm9yX3N0YXR1c190YWJsZVttYl94eV07CisgICAgICAgIGlmIChlcnJvciAmIEVSX0RDX0VSUk9SKQorICAgICAgICAgICAgZGNfZXJyb3IrKzsKKyAgICAgICAgaWYgKGVycm9yICYgRVJfQUNfRVJST1IpCisgICAgICAgICAgICBhY19lcnJvcisrOworICAgICAgICBpZiAoZXJyb3IgJiBFUl9NVl9FUlJPUikKKyAgICAgICAgICAgIG12X2Vycm9yKys7CisgICAgfQorICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJjb25jZWFsaW5nICVkIERDLCAlZCBBQywgJWQgTVYgZXJyb3JzIGluICVjIGZyYW1lXG4iLAorICAgICAgICAgICBkY19lcnJvciwgYWNfZXJyb3IsIG12X2Vycm9yLCBhdl9nZXRfcGljdHVyZV90eXBlX2NoYXIocy0+Y3VyX3BpYy5mLT5waWN0X3R5cGUpKTsKKworICAgIGlzX2ludHJhX2xpa2VseSA9IGlzX2ludHJhX21vcmVfbGlrZWx5KHMpOworCisgICAgLyogc2V0IHVua25vd24gbWItdHlwZSB0byBtb3N0IGxpa2VseSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgeworICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBzLT5tYl9pbmRleDJ4eVtpXTsKKyAgICAgICAgaW50IGVycm9yID0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW21iX3h5XTsKKyAgICAgICAgaWYgKCEoKGVycm9yICYgRVJfRENfRVJST1IpICYmIChlcnJvciAmIEVSX01WX0VSUk9SKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoaXNfaW50cmFfbGlrZWx5KQorICAgICAgICAgICAgcy0+Y3VyX3BpYy5tYl90eXBlW21iX3h5XSA9IE1CX1RZUEVfSU5UUkE0eDQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmN1cl9waWMubWJfdHlwZVttYl94eV0gPSBNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV9MMDsKKyAgICB9CisKKyAgICAvLyBjaGFuZ2UgaW50ZXIgdG8gaW50cmEgYmxvY2tzIGlmIG5vIHJlZmVyZW5jZSBmcmFtZXMgYXJlIGF2YWlsYWJsZQorICAgIGlmICghKHMtPmxhc3RfcGljLmYgJiYgcy0+bGFzdF9waWMuZi0+ZGF0YVswXSkgJiYKKyAgICAgICAgIShzLT5uZXh0X3BpYy5mICYmIHMtPm5leHRfcGljLmYtPmRhdGFbMF0pKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bWJfbnVtOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBtYl94eSA9IHMtPm1iX2luZGV4Mnh5W2ldOworICAgICAgICAgICAgaWYgKCFJU19JTlRSQShzLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldKSkKKyAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldID0gTUJfVFlQRV9JTlRSQTR4NDsKKyAgICAgICAgfQorCisgICAgLyogaGFuZGxlIGludGVyIGJsb2NrcyB3aXRoIGRhbWFnZWQgQUMgKi8KKyAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgcy0+bWJfaGVpZ2h0OyBtYl95KyspIHsKKyAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IHMtPm1iX3dpZHRoOyBtYl94KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBtYl94eSAgID0gbWJfeCArIG1iX3kgKiBzLT5tYl9zdHJpZGU7CisgICAgICAgICAgICBjb25zdCBpbnQgbWJfdHlwZSA9IHMtPmN1cl9waWMubWJfdHlwZVttYl94eV07CisgICAgICAgICAgICBjb25zdCBpbnQgZGlyICAgICA9ICEocy0+bGFzdF9waWMuZiAmJiBzLT5sYXN0X3BpYy5mLT5kYXRhWzBdKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBtdl9kaXIgID0gZGlyID8gTVZfRElSX0JBQ0tXQVJEIDogTVZfRElSX0ZPUldBUkQ7CisgICAgICAgICAgICBpbnQgbXZfdHlwZTsKKworICAgICAgICAgICAgaW50IGVycm9yID0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW21iX3h5XTsKKworICAgICAgICAgICAgaWYgKElTX0lOVFJBKG1iX3R5cGUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpbnRyYQorICAgICAgICAgICAgaWYgKGVycm9yICYgRVJfTVZfRVJST1IpCisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGludGVyIHdpdGggZGFtYWdlZCBNVgorICAgICAgICAgICAgaWYgKCEoZXJyb3IgJiBFUl9BQ19FUlJPUikpCisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHVuZGFtYWdlZCBpbnRlcgorCisgICAgICAgICAgICBpZiAoSVNfOFg4KG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgaW50IG1iX2luZGV4ID0gbWJfeCAqIDIgKyBtYl95ICogMiAqIHMtPmI4X3N0cmlkZTsKKyAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICBtdl90eXBlID0gTVZfVFlQRV84WDg7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVtqXVswXSA9IHMtPmN1cl9waWMubW90aW9uX3ZhbFtkaXJdW21iX2luZGV4ICsgKGogJiAxKSArIChqID4+IDEpICogcy0+Yjhfc3RyaWRlXVswXTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bal1bMV0gPSBzLT5jdXJfcGljLm1vdGlvbl92YWxbZGlyXVttYl9pbmRleCArIChqICYgMSkgKyAoaiA+PiAxKSAqIHMtPmI4X3N0cmlkZV1bMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtdl90eXBlICAgICA9IE1WX1RZUEVfMTZYMTY7CisgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSBzLT5jdXJfcGljLm1vdGlvbl92YWxbZGlyXVttYl94ICogMiArIG1iX3kgKiAyICogcy0+Yjhfc3RyaWRlXVswXTsKKyAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IHMtPmN1cl9waWMubW90aW9uX3ZhbFtkaXJdW21iX3ggKiAyICsgbWJfeSAqIDIgKiBzLT5iOF9zdHJpZGVdWzFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5kZWNvZGVfbWIocy0+b3BhcXVlLCAwIC8qIEZJWE1FIGgyNjQgcGFydGl0aW9uZWQgc2xpY2VzIG5lZWQgdGhpcyBzZXQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgbXZfZGlyLCBtdl90eXBlLCAmcy0+bXYsIG1iX3gsIG1iX3ksIDAsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ3Vlc3MgTVZzICovCisgICAgaWYgKHMtPmN1cl9waWMuZi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBzLT5tYl9oZWlnaHQ7IG1iX3krKykgeworICAgICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IHMtPm1iX3dpZHRoOyBtYl94KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgeHkgICAgICA9IG1iX3ggKiAyICsgbWJfeSAqIDIgKiBzLT5iOF9zdHJpZGU7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IG1iX3h5ICAgPSBtYl94ICsgbWJfeSAqIHMtPm1iX3N0cmlkZTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWJfdHlwZSA9IHMtPmN1cl9waWMubWJfdHlwZVttYl94eV07CisgICAgICAgICAgICAgICAgaW50IG12X2RpciA9IE1WX0RJUl9GT1JXQVJEIHwgTVZfRElSX0JBQ0tXQVJEOworCisgICAgICAgICAgICAgICAgaW50IGVycm9yID0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW21iX3h5XTsKKworICAgICAgICAgICAgICAgIGlmIChJU19JTlRSQShtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKCEoZXJyb3IgJiBFUl9NVl9FUlJPUikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpbnRlciB3aXRoIHVuZGFtYWdlZCBNVgorICAgICAgICAgICAgICAgIGlmICghKGVycm9yICYgRVJfQUNfRVJST1IpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gdW5kYW1hZ2VkIGludGVyCisKKyAgICAgICAgICAgICAgICBpZiAoIShzLT5sYXN0X3BpYy5mICYmIHMtPmxhc3RfcGljLmYtPmRhdGFbMF0pKQorICAgICAgICAgICAgICAgICAgICBtdl9kaXIgJj0gfk1WX0RJUl9GT1JXQVJEOworICAgICAgICAgICAgICAgIGlmICghKHMtPm5leHRfcGljLmYgJiYgcy0+bmV4dF9waWMuZi0+ZGF0YVswXSkpCisgICAgICAgICAgICAgICAgICAgIG12X2RpciAmPSB+TVZfRElSX0JBQ0tXQVJEOworCisgICAgICAgICAgICAgICAgaWYgKHMtPnBwX3RpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVfcHAgPSBzLT5wcF90aW1lOworICAgICAgICAgICAgICAgICAgICBpbnQgdGltZV9wYiA9IHMtPnBiX3RpbWU7CisKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChzLT5hdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSDI2NCk7CisgICAgICAgICAgICAgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhzLT5uZXh0X3BpYy50ZiwgbWJfeSwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSBzLT5uZXh0X3BpYy5tb3Rpb25fdmFsWzBdW3h5XVswXSAqICB0aW1lX3BiICAgICAgICAgICAgLyB0aW1lX3BwOworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IHMtPm5leHRfcGljLm1vdGlvbl92YWxbMF1beHldWzFdICogIHRpbWVfcGIgICAgICAgICAgICAvIHRpbWVfcHA7CisgICAgICAgICAgICAgICAgICAgIHMtPm12WzFdWzBdWzBdID0gcy0+bmV4dF9waWMubW90aW9uX3ZhbFswXVt4eV1bMF0gKiAodGltZV9wYiAtIHRpbWVfcHApIC8gdGltZV9wcDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMV1bMF1bMV0gPSBzLT5uZXh0X3BpYy5tb3Rpb25fdmFsWzBdW3h5XVsxXSAqICh0aW1lX3BiIC0gdGltZV9wcCkgLyB0aW1lX3BwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSAwOworICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPm12WzFdWzBdWzFdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzLT5kZWNvZGVfbWIocy0+b3BhcXVlLCAwLCBtdl9kaXIsIE1WX1RZUEVfMTZYMTYsICZzLT5tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfeCwgbWJfeSwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgZ3Vlc3NfbXYocyk7CisKKyAgICAvKiB0aGUgZmlsdGVycyBiZWxvdyBtYW5pcHVsYXRlIHJhdyBpbWFnZSwgc2tpcCB0aGVtICovCisgICAgaWYgKENPTkZJR19YVk1DICYmIHMtPmF2Y3R4LT5od2FjY2VsICYmIHMtPmF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfbWIpCisgICAgICAgIGdvdG8gZWNfY2xlYW47CisgICAgLyogZmlsbCBEQyBmb3IgaW50ZXIgYmxvY2tzICovCisgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IHMtPm1iX2hlaWdodDsgbWJfeSsrKSB7CisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICBpbnQgZGMsIGRjdSwgZGN2LCB5LCBuOworICAgICAgICAgICAgaW50MTZfdCAqZGNfcHRyOworICAgICAgICAgICAgdWludDhfdCAqZGVzdF95LCAqZGVzdF9jYiwgKmRlc3RfY3I7CisgICAgICAgICAgICBjb25zdCBpbnQgbWJfeHkgICA9IG1iX3ggKyBtYl95ICogcy0+bWJfc3RyaWRlOworICAgICAgICAgICAgY29uc3QgaW50IG1iX3R5cGUgPSBzLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldOworCisgICAgICAgICAgICAvLyBlcnJvciA9IHMtPmVycm9yX3N0YXR1c190YWJsZVttYl94eV07CisKKyAgICAgICAgICAgIGlmIChJU19JTlRSQShtYl90eXBlKSAmJiBzLT5wYXJ0aXRpb25lZF9mcmFtZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIGlmIChlcnJvciAmIEVSX01WX0VSUk9SKQorICAgICAgICAgICAgLy8gICAgIGNvbnRpbnVlOyAvLyBpbnRlciBkYXRhIGRhbWFnZWQgRklYTUUgaXMgdGhpcyBnb29kPworCisgICAgICAgICAgICBkZXN0X3kgID0gcy0+Y3VyX3BpYy5mLT5kYXRhWzBdICsgbWJfeCAqIDE2ICsgbWJfeSAqIDE2ICogbGluZXNpemVbMF07CisgICAgICAgICAgICBkZXN0X2NiID0gcy0+Y3VyX3BpYy5mLT5kYXRhWzFdICsgbWJfeCAqICA4ICsgbWJfeSAqICA4ICogbGluZXNpemVbMV07CisgICAgICAgICAgICBkZXN0X2NyID0gcy0+Y3VyX3BpYy5mLT5kYXRhWzJdICsgbWJfeCAqICA4ICsgbWJfeSAqICA4ICogbGluZXNpemVbMl07CisKKyAgICAgICAgICAgIGRjX3B0ciA9ICZzLT5kY192YWxbMF1bbWJfeCAqIDIgKyBtYl95ICogMiAqIHMtPmI4X3N0cmlkZV07CisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgNDsgbisrKSB7CisgICAgICAgICAgICAgICAgZGMgPSAwOworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICAgICAgICAgICAgIGRjICs9IGRlc3RfeVt4ICsgKG4gJiAxKSAqIDggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSArIChuID4+IDEpICogOCkgKiBsaW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRjX3B0clsobiAmIDEpICsgKG4gPj4gMSkgKiBzLT5iOF9zdHJpZGVdID0gKGRjICsgNCkgPj4gMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGN1ID0gZGN2ID0gMDsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRjdSArPSBkZXN0X2NiW3ggKyB5ICogbGluZXNpemVbMV1dOworICAgICAgICAgICAgICAgICAgICBkY3YgKz0gZGVzdF9jclt4ICsgeSAqIGxpbmVzaXplWzJdXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5kY192YWxbMV1bbWJfeCArIG1iX3kgKiBzLT5tYl9zdHJpZGVdID0gKGRjdSArIDQpID4+IDM7CisgICAgICAgICAgICBzLT5kY192YWxbMl1bbWJfeCArIG1iX3kgKiBzLT5tYl9zdHJpZGVdID0gKGRjdiArIDQpID4+IDM7CisgICAgICAgIH0KKyAgICB9CisjaWYgMQorICAgIC8qIGd1ZXNzIERDIGZvciBkYW1hZ2VkIGJsb2NrcyAqLworICAgIGd1ZXNzX2RjKHMsIHMtPmRjX3ZhbFswXSwgcy0+bWJfd2lkdGgqMiwgcy0+bWJfaGVpZ2h0KjIsIHMtPmI4X3N0cmlkZSwgMSk7CisgICAgZ3Vlc3NfZGMocywgcy0+ZGNfdmFsWzFdLCBzLT5tYl93aWR0aCAgLCBzLT5tYl9oZWlnaHQgICwgcy0+bWJfc3RyaWRlLCAwKTsKKyAgICBndWVzc19kYyhzLCBzLT5kY192YWxbMl0sIHMtPm1iX3dpZHRoICAsIHMtPm1iX2hlaWdodCAgLCBzLT5tYl9zdHJpZGUsIDApOworI2VuZGlmCisKKyAgICAvKiBmaWx0ZXIgbHVtYSBEQyAqLworICAgIGZpbHRlcjE4MShzLT5kY192YWxbMF0sIHMtPm1iX3dpZHRoICogMiwgcy0+bWJfaGVpZ2h0ICogMiwgcy0+Yjhfc3RyaWRlKTsKKworI2lmIDEKKyAgICAvKiByZW5kZXIgREMgb25seSBpbnRyYSAqLworICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBzLT5tYl9oZWlnaHQ7IG1iX3krKykgeworICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgdWludDhfdCAqZGVzdF95LCAqZGVzdF9jYiwgKmRlc3RfY3I7CisgICAgICAgICAgICBjb25zdCBpbnQgbWJfeHkgICA9IG1iX3ggKyBtYl95ICogcy0+bWJfc3RyaWRlOworICAgICAgICAgICAgY29uc3QgaW50IG1iX3R5cGUgPSBzLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldOworCisgICAgICAgICAgICBpbnQgZXJyb3IgPSBzLT5lcnJvcl9zdGF0dXNfdGFibGVbbWJfeHldOworCisgICAgICAgICAgICBpZiAoSVNfSU5URVIobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIShlcnJvciAmIEVSX0FDX0VSUk9SKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gdW5kYW1hZ2VkCisKKyAgICAgICAgICAgIGRlc3RfeSAgPSBzLT5jdXJfcGljLmYtPmRhdGFbMF0gKyBtYl94ICogMTYgKyBtYl95ICogMTYgKiBsaW5lc2l6ZVswXTsKKyAgICAgICAgICAgIGRlc3RfY2IgPSBzLT5jdXJfcGljLmYtPmRhdGFbMV0gKyBtYl94ICogIDggKyBtYl95ICogIDggKiBsaW5lc2l6ZVsxXTsKKyAgICAgICAgICAgIGRlc3RfY3IgPSBzLT5jdXJfcGljLmYtPmRhdGFbMl0gKyBtYl94ICogIDggKyBtYl95ICogIDggKiBsaW5lc2l6ZVsyXTsKKworICAgICAgICAgICAgcHV0X2RjKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgbWJfeCwgbWJfeSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmIChzLT5hdmN0eC0+ZXJyb3JfY29uY2VhbG1lbnQgJiBGRl9FQ19ERUJMT0NLKSB7CisgICAgICAgIC8qIGZpbHRlciBob3Jpem9udGFsIGJsb2NrIGJvdW5kYXJpZXMgKi8KKyAgICAgICAgaF9ibG9ja19maWx0ZXIocywgcy0+Y3VyX3BpYy5mLT5kYXRhWzBdLCBzLT5tYl93aWR0aCAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX2hlaWdodCAqIDIsIGxpbmVzaXplWzBdLCAxKTsKKyAgICAgICAgaF9ibG9ja19maWx0ZXIocywgcy0+Y3VyX3BpYy5mLT5kYXRhWzFdLCBzLT5tYl93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfaGVpZ2h0LCBsaW5lc2l6ZVsxXSwgMCk7CisgICAgICAgIGhfYmxvY2tfZmlsdGVyKHMsIHMtPmN1cl9waWMuZi0+ZGF0YVsyXSwgcy0+bWJfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX2hlaWdodCwgbGluZXNpemVbMl0sIDApOworCisgICAgICAgIC8qIGZpbHRlciB2ZXJ0aWNhbCBibG9jayBib3VuZGFyaWVzICovCisgICAgICAgIHZfYmxvY2tfZmlsdGVyKHMsIHMtPmN1cl9waWMuZi0+ZGF0YVswXSwgcy0+bWJfd2lkdGggKiAyLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5tYl9oZWlnaHQgKiAyLCBsaW5lc2l6ZVswXSwgMSk7CisgICAgICAgIHZfYmxvY2tfZmlsdGVyKHMsIHMtPmN1cl9waWMuZi0+ZGF0YVsxXSwgcy0+bWJfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX2hlaWdodCwgbGluZXNpemVbMV0sIDApOworICAgICAgICB2X2Jsb2NrX2ZpbHRlcihzLCBzLT5jdXJfcGljLmYtPmRhdGFbMl0sIHMtPm1iX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5tYl9oZWlnaHQsIGxpbmVzaXplWzJdLCAwKTsKKyAgICB9CisKK2VjX2NsZWFuOgorICAgIC8qIGNsZWFuIGEgZmV3IHRhYmxlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgeworICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBzLT5tYl9pbmRleDJ4eVtpXTsKKyAgICAgICAgaW50ICAgICAgIGVycm9yID0gcy0+ZXJyb3Jfc3RhdHVzX3RhYmxlW21iX3h5XTsKKworICAgICAgICBpZiAocy0+Y3VyX3BpYy5mLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IgJiYKKyAgICAgICAgICAgIChlcnJvciAmIChFUl9EQ19FUlJPUiB8IEVSX01WX0VSUk9SIHwgRVJfQUNfRVJST1IpKSkgeworICAgICAgICAgICAgcy0+bWJza2lwX3RhYmxlW21iX3h5XSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcy0+bWJpbnRyYV90YWJsZVttYl94eV0gPSAxOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZzLT5yZWZfaW5kZXhfYnVmW2ldKTsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZzLT5tb3Rpb25fdmFsX2J1ZltpXSk7CisgICAgICAgIHMtPmN1cl9waWMucmVmX2luZGV4W2ldICA9IE5VTEw7CisgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFtpXSA9IE5VTEw7CisgICAgfQorCisgICAgbWVtc2V0KCZzLT5jdXJfcGljLCAwLCBzaXplb2YoRVJQaWN0dXJlKSk7CisgICAgbWVtc2V0KCZzLT5sYXN0X3BpYywgMCwgc2l6ZW9mKEVSUGljdHVyZSkpOworICAgIG1lbXNldCgmcy0+bmV4dF9waWMsIDAsIHNpemVvZihFUlBpY3R1cmUpKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2Vycm9yX3Jlc2lsaWVuY2UuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2Vycm9yX3Jlc2lsaWVuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzFhZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZXJyb3JfcmVzaWxpZW5jZS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19FUlJPUl9SRVNJTElFTkNFX0gKKyNkZWZpbmUgQVZDT0RFQ19FUlJPUl9SRVNJTElFTkNFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1lX2NtcC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCisvLy88IGN1cnJlbnQgTUIgaXMgdGhlIGZpcnN0IGFmdGVyIGEgcmVzeW5jIG1hcmtlcgorI2RlZmluZSBWUF9TVEFSVCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRVJfQUNfRVJST1IgICAgICAgICAgICAyCisjZGVmaW5lIEVSX0RDX0VSUk9SICAgICAgICAgICAgNAorI2RlZmluZSBFUl9NVl9FUlJPUiAgICAgICAgICAgIDgKKyNkZWZpbmUgRVJfQUNfRU5EICAgICAgICAgICAgICAxNgorI2RlZmluZSBFUl9EQ19FTkQgICAgICAgICAgICAgIDMyCisjZGVmaW5lIEVSX01WX0VORCAgICAgICAgICAgICAgNjQKKworI2RlZmluZSBFUl9NQl9FUlJPUiAoRVJfQUNfRVJST1J8RVJfRENfRVJST1J8RVJfTVZfRVJST1IpCisjZGVmaW5lIEVSX01CX0VORCAgIChFUl9BQ19FTkR8RVJfRENfRU5EfEVSX01WX0VORCkKKwordHlwZWRlZiBzdHJ1Y3QgRVJQaWN0dXJlIHsKKyAgICBBVkZyYW1lICpmOworICAgIFRocmVhZEZyYW1lICp0ZjsKKworICAgIC8vIGl0J3MgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGFsbG9jYXRlIHRoZXNlIGJ1ZmZlcnMKKyAgICBpbnQxNl90ICgqbW90aW9uX3ZhbFsyXSlbMl07CisgICAgaW50OF90ICpyZWZfaW5kZXhbMl07CisKKyAgICB1aW50MzJfdCAqbWJfdHlwZTsKKyAgICBpbnQgZmllbGRfcGljdHVyZTsKK30gRVJQaWN0dXJlOworCit0eXBlZGVmIHN0cnVjdCBFUkNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBNRUNtcENvbnRleHQgKm1lY2M7CisKKyAgICBpbnQgKm1iX2luZGV4Mnh5OworICAgIGludCBtYl9udW07CisgICAgaW50IG1iX3dpZHRoLCBtYl9oZWlnaHQ7CisgICAgaW50IG1iX3N0cmlkZTsKKyAgICBpbnQgYjhfc3RyaWRlOworCisgICAgaW50IGVycm9yX2NvdW50LCBlcnJvcl9vY2N1cnJlZDsKKyAgICB1aW50OF90ICplcnJvcl9zdGF0dXNfdGFibGU7CisgICAgdWludDhfdCAqZXJfdGVtcF9idWZmZXI7CisgICAgaW50MTZfdCAqZGNfdmFsWzNdOworICAgIHVpbnQ4X3QgKm1ic2tpcF90YWJsZTsKKyAgICB1aW50OF90ICptYmludHJhX3RhYmxlOworICAgIGludCBtdlsyXVs0XVsyXTsKKworICAgIEVSUGljdHVyZSBjdXJfcGljOworICAgIEVSUGljdHVyZSBsYXN0X3BpYzsKKyAgICBFUlBpY3R1cmUgbmV4dF9waWM7CisKKyAgICBBVkJ1ZmZlclJlZiAqcmVmX2luZGV4X2J1ZlsyXTsKKyAgICBBVkJ1ZmZlclJlZiAqbW90aW9uX3ZhbF9idWZbMl07CisKKyAgICB1aW50MTZfdCBwcF90aW1lOworICAgIHVpbnQxNl90IHBiX3RpbWU7CisgICAgaW50IHF1YXJ0ZXJfc2FtcGxlOworICAgIGludCBwYXJ0aXRpb25lZF9mcmFtZTsKKyAgICBpbnQgcmVmX2NvdW50OworCisgICAgdm9pZCAoKmRlY29kZV9tYikodm9pZCAqb3BhcXVlLCBpbnQgcmVmLCBpbnQgbXZfZGlyLCBpbnQgbXZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKCptdilbMl1bNF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3gsIGludCBtYl95LCBpbnQgbWJfaW50cmEsIGludCBtYl9za2lwcGVkKTsKKyAgICB2b2lkICpvcGFxdWU7Cit9IEVSQ29udGV4dDsKKwordm9pZCBmZl9lcl9mcmFtZV9zdGFydChFUkNvbnRleHQgKnMpOwordm9pZCBmZl9lcl9mcmFtZV9lbmQoRVJDb250ZXh0ICpzKTsKK3ZvaWQgZmZfZXJfYWRkX3NsaWNlKEVSQ29udGV4dCAqcywgaW50IHN0YXJ0eCwgaW50IHN0YXJ0eSwgaW50IGVuZHgsIGludCBlbmR5LAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0VSUk9SX1JFU0lMSUVOQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZXNjYXBlMTI0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9lc2NhcGUxMjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODE2NzQxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZXNjYXBlMTI0LmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qCisgKiBFc2NhcGUgMTI0IFZpZGVvIERlY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBFbGkgRnJpZWRtYW4gKGVsaS5mcmllZG1hbkBnbWFpbC5jb20pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKwordHlwZWRlZiB1bmlvbiBNYWNyb0Jsb2NrIHsKKyAgICB1aW50MTZfdCBwaXhlbHNbNF07CisgICAgdWludDMyX3QgcGl4ZWxzMzJbMl07Cit9IE1hY3JvQmxvY2s7CisKK3R5cGVkZWYgdW5pb24gU3VwZXJCbG9jayB7CisgICAgdWludDE2X3QgcGl4ZWxzWzY0XTsKKyAgICB1aW50MzJfdCBwaXhlbHMzMlszMl07Cit9IFN1cGVyQmxvY2s7CisKK3R5cGVkZWYgc3RydWN0IENvZGVCb29rIHsKKyAgICB1bnNpZ25lZCBkZXB0aDsKKyAgICB1bnNpZ25lZCBzaXplOworICAgIE1hY3JvQmxvY2sqIGJsb2NrczsKK30gQ29kZUJvb2s7CisKK3R5cGVkZWYgc3RydWN0IEVzY2FwZTEyNENvbnRleHQgeworICAgIEFWRnJhbWUgKmZyYW1lOworCisgICAgdW5zaWduZWQgbnVtX3N1cGVyYmxvY2tzOworCisgICAgQ29kZUJvb2sgY29kZWJvb2tzWzNdOworfSBFc2NhcGUxMjRDb250ZXh0OworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGRlY29kZXIKKyAqIEBwYXJhbSBhdmN0eCBkZWNvZGVyIGNvbnRleHQKKyAqIEByZXR1cm4gMCBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBlcnJvcgorICovCitzdGF0aWMgYXZfY29sZCBpbnQgZXNjYXBlMTI0X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBFc2NhcGUxMjRDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTU7CisKKyAgICBzLT5udW1fc3VwZXJibG9ja3MgPSAoKHVuc2lnbmVkKWF2Y3R4LT53aWR0aCAvIDgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKWF2Y3R4LT5oZWlnaHQgLyA4KTsKKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlc2NhcGUxMjRfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIEVzY2FwZTEyNENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJnMtPmNvZGVib29rc1tpXS5ibG9ja3MpOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBDb2RlQm9vayB1bnBhY2tfY29kZWJvb2soR2V0Qml0Q29udGV4dCogZ2IsIHVuc2lnbmVkIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBpLCBqOworICAgIENvZGVCb29rIGNiID0geyAwIH07CisKKyAgICBpZiAoc2l6ZSA+PSBJTlRfTUFYIC8gMzQgfHwgZ2V0X2JpdHNfbGVmdChnYikgPCBzaXplICogMzQpCisgICAgICAgIHJldHVybiBjYjsKKworICAgIGlmIChzaXplID49IElOVF9NQVggLyBzaXplb2YoTWFjcm9CbG9jaykpCisgICAgICAgIHJldHVybiBjYjsKKyAgICBjYi5ibG9ja3MgPSBhdl9tYWxsb2Moc2l6ZSA/IHNpemUgKiBzaXplb2YoTWFjcm9CbG9jaykgOiAxKTsKKyAgICBpZiAoIWNiLmJsb2NrcykKKyAgICAgICAgcmV0dXJuIGNiOworCisgICAgY2IuZGVwdGggPSBkZXB0aDsKKyAgICBjYi5zaXplID0gc2l6ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIG1hc2tfYml0cyA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgdW5zaWduZWQgY29sb3IwID0gZ2V0X2JpdHMoZ2IsIDE1KTsKKyAgICAgICAgdW5zaWduZWQgY29sb3IxID0gZ2V0X2JpdHMoZ2IsIDE1KTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICBpZiAobWFza19iaXRzICYgKDEgPDwgaikpCisgICAgICAgICAgICAgICAgY2IuYmxvY2tzW2ldLnBpeGVsc1tqXSA9IGNvbG9yMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjYi5ibG9ja3NbaV0ucGl4ZWxzW2pdID0gY29sb3IwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjYjsKK30KKworc3RhdGljIHVuc2lnbmVkIGRlY29kZV9za2lwX2NvdW50KEdldEJpdENvbnRleHQqIGdiKQoreworICAgIHVuc2lnbmVkIHZhbHVlOworICAgIC8vIFRoaXMgZnVuY3Rpb24gcmVhZHMgYSBtYXhpbXVtIG9mIDIzIGJpdHMsCisgICAgLy8gd2hpY2ggaXMgd2l0aGluIHRoZSBwYWRkaW5nIHNwYWNlCisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHZhbHVlID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICB2YWx1ZSArPSBnZXRfYml0cyhnYiwgMyk7CisgICAgaWYgKHZhbHVlICE9ICgxICsgKCgxIDw8IDMpIC0gMSkpKQorICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICB2YWx1ZSArPSBnZXRfYml0cyhnYiwgNyk7CisgICAgaWYgKHZhbHVlICE9ICgxICsgKCgxIDw8IDMpIC0gMSkpICsgKCgxIDw8IDcpIC0gMSkpCisgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgIHJldHVybiB2YWx1ZSArIGdldF9iaXRzKGdiLCAxMik7Cit9CisKK3N0YXRpYyBNYWNyb0Jsb2NrIGRlY29kZV9tYWNyb2Jsb2NrKEVzY2FwZTEyNENvbnRleHQqIHMsIEdldEJpdENvbnRleHQqIGdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb2RlYm9va19pbmRleCwgaW50IHN1cGVyYmxvY2tfaW5kZXgpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiByZWFkcyBhIG1heGltdW0gb2YgMjIgYml0czsgdGhlIGNhbGxlcnMKKyAgICAvLyBndWFyZCB0aGlzIGZ1bmN0aW9uIGFwcHJvcHJpYXRlbHkKKyAgICB1bnNpZ25lZCBibG9ja19pbmRleCwgZGVwdGg7CisgICAgaW50IHZhbHVlID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdHJhbnNpdGlvbnNbM11bMl0gPSB7IHsyLCAxfSwgezAsIDJ9LCB7MSwgMH0gfTsKKyAgICAgICAgdmFsdWUgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAqY29kZWJvb2tfaW5kZXggPSB0cmFuc2l0aW9uc1sqY29kZWJvb2tfaW5kZXhdW3ZhbHVlXTsKKyAgICB9CisKKyAgICBkZXB0aCA9IHMtPmNvZGVib29rc1sqY29kZWJvb2tfaW5kZXhdLmRlcHRoOworCisgICAgLy8gZGVwdGggPSAwIG1lYW5zIHRoYXQgdGhpcyBzaG91bGRuJ3QgcmVhZCBhbnkgYml0czsKKyAgICAvLyBpbiB0aGVvcnksIHRoaXMgaXMgdGhlIHNhbWUgYXMgZ2V0X2JpdHMoZ2IsIDApLCBidXQKKyAgICAvLyB0aGF0IGRvZXNuJ3QgYWN0dWFsbHkgd29yay4KKyAgICBibG9ja19pbmRleCA9IGRlcHRoID8gZ2V0X2JpdHMoZ2IsIGRlcHRoKSA6IDA7CisKKyAgICBpZiAoKmNvZGVib29rX2luZGV4ID09IDEpIHsKKyAgICAgICAgYmxvY2tfaW5kZXggKz0gc3VwZXJibG9ja19pbmRleCA8PCBzLT5jb2RlYm9va3NbMV0uZGVwdGg7CisgICAgfQorCisgICAgLy8gVGhpcyBjb25kaXRpb24gY2FuIG9jY3VyIHdpdGggaW52YWxpZCBiaXRzdHJlYW1zIGFuZAorICAgIC8vICpjb2RlYm9va19pbmRleCA9PSAyCisgICAgaWYgKGJsb2NrX2luZGV4ID49IHMtPmNvZGVib29rc1sqY29kZWJvb2tfaW5kZXhdLnNpemUpCisgICAgICAgIHJldHVybiAoTWFjcm9CbG9jaykgeyB7IDAgfSB9OworCisgICAgcmV0dXJuIHMtPmNvZGVib29rc1sqY29kZWJvb2tfaW5kZXhdLmJsb2Nrc1tibG9ja19pbmRleF07Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9tYl9pbnRvX3NiKFN1cGVyQmxvY2sqIHNiLCBNYWNyb0Jsb2NrIG1iLCB1bnNpZ25lZCBpbmRleCkgeworICAgLy8gRm9ybXVsYTogKChpbmRleCAvIDQpICogMTYgKyAoaW5kZXggJSA0KSAqIDIpIC8gMgorICAgdWludDMyX3QgKmRzdCA9IHNiLT5waXhlbHMzMiArIGluZGV4ICsgKGluZGV4ICYgLTQpOworCisgICAvLyBUaGlzIHRlY2huaWNhbGx5IHZpb2xhdGVzIEM5OSBhbGlhc2luZyBydWxlcywgYnV0IGl0IHNob3VsZCBiZSBzYWZlLgorICAgZHN0WzBdID0gbWIucGl4ZWxzMzJbMF07CisgICBkc3RbNF0gPSBtYi5waXhlbHMzMlsxXTsKK30KKworc3RhdGljIHZvaWQgY29weV9zdXBlcmJsb2NrKHVpbnQxNl90KiBkZXN0LCB1bnNpZ25lZCBkZXN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogc3JjLCB1bnNpZ25lZCBzcmNfc3RyaWRlKQoreworICAgIHVuc2lnbmVkIHk7CisgICAgaWYgKHNyYykKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKKyAgICAgICAgICAgIG1lbWNweShkZXN0ICsgeSAqIGRlc3Rfc3RyaWRlLCBzcmMgKyB5ICogc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDE2X3QpICogOCk7CisgICAgZWxzZQorICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICAgICAgICAgICAgbWVtc2V0KGRlc3QgKyB5ICogZGVzdF9zdHJpZGUsIDAsIHNpemVvZih1aW50MTZfdCkgKiA4KTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG1hc2tfbWF0cml4W10gPSB7MHgxLCAgIDB4MiwgICAweDEwLCAgIDB4MjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQsICAgMHg4LCAgIDB4NDAsICAgMHg4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwLCAweDIwMCwgMHgxMDAwLCAweDIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMCwgMHg4MDAsIDB4NDAwMCwgMHg4MDAwfTsKKworc3RhdGljIGludCBlc2NhcGUxMjRfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgRXNjYXBlMTI0Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworCisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICB1bnNpZ25lZCBmcmFtZV9mbGFncywgZnJhbWVfc2l6ZTsKKyAgICB1bnNpZ25lZCBpOworCisgICAgdW5zaWduZWQgc3VwZXJibG9ja19pbmRleCwgY2JfaW5kZXggPSAxLAorICAgICAgICAgICAgIHN1cGVyYmxvY2tfY29sX2luZGV4ID0gMCwKKyAgICAgICAgICAgICBzdXBlcmJsb2Nrc19wZXJfcm93ID0gYXZjdHgtPndpZHRoIC8gOCwgc2tpcCA9IC0xOworCisgICAgdWludDE2X3QqIG9sZF9mcmFtZV9kYXRhLCAqbmV3X2ZyYW1lX2RhdGE7CisgICAgdW5zaWduZWQgb2xkX3N0cmlkZSwgbmV3X3N0cmlkZTsKKworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGluaXRfZ2V0X2JpdHM4KCZnYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLy8gVGhpcyBjYWxsIGFsc28gZ3VhcmRzIHRoZSBwb3RlbnRpYWwgZGVwdGggcmVhZHMgZm9yIHRoZQorICAgIC8vIGNvZGVib29rIHVucGFja2luZy4KKyAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmZ2IpIDwgNjQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZyYW1lX2ZsYWdzID0gZ2V0X2JpdHNfbG9uZygmZ2IsIDMyKTsKKyAgICBmcmFtZV9zaXplICA9IGdldF9iaXRzX2xvbmcoJmdiLCAzMik7CisKKyAgICAvLyBMZWF2ZSBsYXN0IGZyYW1lIHVuY2hhbmdlZAorICAgIC8vIEZJWE1FOiBJcyB0aGlzIG5lY2Vzc2FyeT8gIEkgaGF2ZW4ndCBzZWVuIGl0IGluIGFueSByZWFsIHNhbXBsZXMKKyAgICBpZiAoIShmcmFtZV9mbGFncyAmIDB4MTE0KSB8fCAhKGZyYW1lX2ZsYWdzICYgMHg3ODAwMDAwKSkgeworICAgICAgICBpZiAoIXMtPmZyYW1lLT5kYXRhWzBdKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJTa2lwcGluZyBmcmFtZVxuIik7CisKKyAgICAgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGZyYW1lLCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0dXJuIGZyYW1lX3NpemU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBpZiAoZnJhbWVfZmxhZ3MgJiAoMSA8PCAoMTcgKyBpKSkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNiX2RlcHRoLCBjYl9zaXplOworICAgICAgICAgICAgaWYgKGkgPT0gMikgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgY29kZWJvb2sgY2FuIGJlIGN1dCBvZmYgYXQgcGxhY2VzIG90aGVyIHRoYW4KKyAgICAgICAgICAgICAgICAvLyBwb3dlcnMgb2YgMiwgbGVhdmluZyBzb21lIG9mIHRoZSBlbnRyaWVzIHVuZGVmaW5lZC4KKyAgICAgICAgICAgICAgICBjYl9zaXplID0gZ2V0X2JpdHNfbG9uZygmZ2IsIDIwKTsKKyAgICAgICAgICAgICAgICBjYl9kZXB0aCA9IGF2X2xvZzIoY2Jfc2l6ZSAtIDEpICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2JfZGVwdGggPSBnZXRfYml0cygmZ2IsIDQpOworICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBjb2RlYm9vazogcG93KDIsZGVwdGgpIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGEgZGVwdGgtbGVuZ3RoIGtleQorICAgICAgICAgICAgICAgICAgICBjYl9zaXplID0gMSA8PCBjYl9kZXB0aDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNvZGVib29rIHZhcmllcyBwZXIgc3VwZXJibG9jaworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogSSBkb24ndCB0aGluayB0aGlzIGhhbmRsZXMgaW50ZWdlciBvdmVyZmxvdworICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJseQorICAgICAgICAgICAgICAgICAgICBjYl9zaXplID0gcy0+bnVtX3N1cGVyYmxvY2tzIDw8IGNiX2RlcHRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5jb2RlYm9va3NbaV0uYmxvY2tzKTsKKyAgICAgICAgICAgIHMtPmNvZGVib29rc1tpXSA9IHVucGFja19jb2RlYm9vaygmZ2IsIGNiX2RlcHRoLCBjYl9zaXplKTsKKyAgICAgICAgICAgIGlmICghcy0+Y29kZWJvb2tzW2ldLmJsb2NrcykKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgbmV3X2ZyYW1lX2RhdGEgPSAodWludDE2X3QqKWZyYW1lLT5kYXRhWzBdOworICAgIG5ld19zdHJpZGUgPSBmcmFtZS0+bGluZXNpemVbMF0gLyAyOworICAgIG9sZF9mcmFtZV9kYXRhID0gKHVpbnQxNl90KilzLT5mcmFtZS0+ZGF0YVswXTsKKyAgICBvbGRfc3RyaWRlID0gcy0+ZnJhbWUtPmxpbmVzaXplWzBdIC8gMjsKKworICAgIGZvciAoc3VwZXJibG9ja19pbmRleCA9IDA7IHN1cGVyYmxvY2tfaW5kZXggPCBzLT5udW1fc3VwZXJibG9ja3M7CisgICAgICAgICBzdXBlcmJsb2NrX2luZGV4KyspIHsKKyAgICAgICAgTWFjcm9CbG9jayBtYjsKKyAgICAgICAgU3VwZXJCbG9jayBzYjsKKyAgICAgICAgdW5zaWduZWQgbXVsdGlfbWFzayA9IDA7CisKKyAgICAgICAgaWYgKHNraXAgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNhbGwgd2lsbCBtYWtlIHVzIHNraXAgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrcworICAgICAgICAgICAgLy8gaWYgdGhlIGZyYW1lIHByZW1hdHVyZWx5IGVuZHMKKyAgICAgICAgICAgIHNraXAgPSBkZWNvZGVfc2tpcF9jb3VudCgmZ2IpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNraXApIHsKKyAgICAgICAgICAgIGNvcHlfc3VwZXJibG9jayhuZXdfZnJhbWVfZGF0YSwgbmV3X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfZnJhbWVfZGF0YSwgb2xkX3N0cmlkZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb3B5X3N1cGVyYmxvY2soc2IucGl4ZWxzLCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9mcmFtZV9kYXRhLCBvbGRfc3RyaWRlKTsKKworICAgICAgICAgICAgd2hpbGUgKGdldF9iaXRzX2xlZnQoJmdiKSA+PSAxICYmICFnZXRfYml0czEoJmdiKSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1hc2s7CisgICAgICAgICAgICAgICAgbWIgPSBkZWNvZGVfbWFjcm9ibG9jayhzLCAmZ2IsICZjYl9pbmRleCwgc3VwZXJibG9ja19pbmRleCk7CisgICAgICAgICAgICAgICAgbWFzayA9IGdldF9iaXRzKCZnYiwgMTYpOworICAgICAgICAgICAgICAgIG11bHRpX21hc2sgfD0gbWFzazsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAobWFzayAmIG1hc2tfbWF0cml4W2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRfbWJfaW50b19zYigmc2IsIG1iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFnZXRfYml0czEoJmdiKSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludl9tYXNrID0gZ2V0X2JpdHMoJmdiLCA0KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnZfbWFzayAmICgxIDw8IGkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aV9tYXNrIF49IDB4RiA8PCBpKjQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aV9tYXNrIF49IGdldF9iaXRzKCZnYiwgNCkgPDwgaSo0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpX21hc2sgJiBtYXNrX21hdHJpeFtpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWIgPSBkZWNvZGVfbWFjcm9ibG9jayhzLCAmZ2IsICZjYl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJibG9ja19pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRfbWJfaW50b19zYigmc2IsIG1iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVfZmxhZ3MgJiAoMSA8PCAxNikpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZ2V0X2JpdHNfbGVmdCgmZ2IpID49IDEgJiYgIWdldF9iaXRzMSgmZ2IpKSB7CisgICAgICAgICAgICAgICAgICAgIG1iID0gZGVjb2RlX21hY3JvYmxvY2socywgJmdiLCAmY2JfaW5kZXgsIHN1cGVyYmxvY2tfaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpbnNlcnRfbWJfaW50b19zYigmc2IsIG1iLCBnZXRfYml0cygmZ2IsIDQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvcHlfc3VwZXJibG9jayhuZXdfZnJhbWVfZGF0YSwgbmV3X3N0cmlkZSwgc2IucGl4ZWxzLCA4KTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyYmxvY2tfY29sX2luZGV4Kys7CisgICAgICAgIG5ld19mcmFtZV9kYXRhICs9IDg7CisgICAgICAgIGlmIChvbGRfZnJhbWVfZGF0YSkKKyAgICAgICAgICAgIG9sZF9mcmFtZV9kYXRhICs9IDg7CisgICAgICAgIGlmIChzdXBlcmJsb2NrX2NvbF9pbmRleCA9PSBzdXBlcmJsb2Nrc19wZXJfcm93KSB7CisgICAgICAgICAgICBuZXdfZnJhbWVfZGF0YSArPSBuZXdfc3RyaWRlICogOCAtIHN1cGVyYmxvY2tzX3Blcl9yb3cgKiA4OworICAgICAgICAgICAgaWYgKG9sZF9mcmFtZV9kYXRhKQorICAgICAgICAgICAgICAgIG9sZF9mcmFtZV9kYXRhICs9IG9sZF9zdHJpZGUgKiA4IC0gc3VwZXJibG9ja3NfcGVyX3JvdyAqIDg7CisgICAgICAgICAgICBzdXBlcmJsb2NrX2NvbF9pbmRleCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc2tpcC0tOworICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAiRXNjYXBlIHNpemVzOiAlaSwgJWksICVpXG4iLAorICAgICAgICAgICBmcmFtZV9zaXplLCBidWZfc2l6ZSwgZ2V0X2JpdHNfY291bnQoJmdiKSAvIDgpOworCisgICAgYXZfZnJhbWVfdW5yZWYocy0+ZnJhbWUpOworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKHMtPmZyYW1lLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGZyYW1lX3NpemU7Cit9CisKKworQVZDb2RlYyBmZl9lc2NhcGUxMjRfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZXNjYXBlMTI0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRXNjYXBlIDEyNCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9FU0NBUEUxMjQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEVzY2FwZTEyNENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGVzY2FwZTEyNF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBlc2NhcGUxMjRfZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGVzY2FwZTEyNF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9lc2NhcGUxMzAuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2VzY2FwZTEzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmIyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9lc2NhcGUxMzAuYwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIEVzY2FwZSAxMzAgdmlkZW8gZGVjb2RlcgorICogQ29weXJpZ2h0IChDKSAyMDA4IEVsaSBGcmllZG1hbiAoZWxpLmZyaWVkbWFuIDxhdD4gZ21haWwuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBFc2NhcGUxMzBDb250ZXh0IHsKKyAgICB1aW50OF90ICpvbGRfeV9hdmc7CisKKyAgICB1aW50OF90ICpuZXdfeSwgKm9sZF95OworICAgIHVpbnQ4X3QgKm5ld191LCAqb2xkX3U7CisgICAgdWludDhfdCAqbmV3X3YsICpvbGRfdjsKKworICAgIHVpbnQ4X3QgKmJ1ZjEsICpidWYyOworICAgIGludCAgICAgbGluZXNpemVbM107Cit9IEVzY2FwZTEzMENvbnRleHQ7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9mZnNldF90YWJsZVtdID0geyAyLCA0LCAxMCwgMjAgfTsKK3N0YXRpYyBjb25zdCBpbnQ4X3Qgc2lnbl90YWJsZVs2NF1bNF0gPSB7CisgICAgeyAgMCwgIDAsICAwLCAgMCB9LAorICAgIHsgLTEsICAxLCAgMCwgIDAgfSwKKyAgICB7ICAxLCAtMSwgIDAsICAwIH0sCisgICAgeyAtMSwgIDAsICAxLCAgMCB9LAorICAgIHsgLTEsICAxLCAgMSwgIDAgfSwKKyAgICB7ICAwLCAtMSwgIDEsICAwIH0sCisgICAgeyAgMSwgLTEsICAxLCAgMCB9LAorICAgIHsgLTEsIC0xLCAgMSwgIDAgfSwKKyAgICB7ICAxLCAgMCwgLTEsICAwIH0sCisgICAgeyAgMCwgIDEsIC0xLCAgMCB9LAorICAgIHsgIDEsICAxLCAtMSwgIDAgfSwKKyAgICB7IC0xLCAgMSwgLTEsICAwIH0sCisgICAgeyAgMSwgLTEsIC0xLCAgMCB9LAorICAgIHsgLTEsICAwLCAgMCwgIDEgfSwKKyAgICB7IC0xLCAgMSwgIDAsICAxIH0sCisgICAgeyAgMCwgLTEsICAwLCAgMSB9LAorCisgICAgeyAgMCwgIDAsICAwLCAgMCB9LAorICAgIHsgIDEsIC0xLCAgMCwgIDEgfSwKKyAgICB7IC0xLCAtMSwgIDAsICAxIH0sCisgICAgeyAtMSwgIDAsICAxLCAgMSB9LAorICAgIHsgLTEsICAxLCAgMSwgIDEgfSwKKyAgICB7ICAwLCAtMSwgIDEsICAxIH0sCisgICAgeyAgMSwgLTEsICAxLCAgMSB9LAorICAgIHsgLTEsIC0xLCAgMSwgIDEgfSwKKyAgICB7ICAwLCAgMCwgLTEsICAxIH0sCisgICAgeyAgMSwgIDAsIC0xLCAgMSB9LAorICAgIHsgLTEsICAwLCAtMSwgIDEgfSwKKyAgICB7ICAwLCAgMSwgLTEsICAxIH0sCisgICAgeyAgMSwgIDEsIC0xLCAgMSB9LAorICAgIHsgLTEsICAxLCAtMSwgIDEgfSwKKyAgICB7ICAwLCAtMSwgLTEsICAxIH0sCisgICAgeyAgMSwgLTEsIC0xLCAgMSB9LAorCisgICAgeyAgMCwgIDAsICAwLCAgMCB9LAorICAgIHsgLTEsIC0xLCAtMSwgIDEgfSwKKyAgICB7ICAxLCAgMCwgIDAsIC0xIH0sCisgICAgeyAgMCwgIDEsICAwLCAtMSB9LAorICAgIHsgIDEsICAxLCAgMCwgLTEgfSwKKyAgICB7IC0xLCAgMSwgIDAsIC0xIH0sCisgICAgeyAgMSwgLTEsICAwLCAtMSB9LAorICAgIHsgIDAsICAwLCAgMSwgLTEgfSwKKyAgICB7ICAxLCAgMCwgIDEsIC0xIH0sCisgICAgeyAtMSwgIDAsICAxLCAtMSB9LAorICAgIHsgIDAsICAxLCAgMSwgLTEgfSwKKyAgICB7ICAxLCAgMSwgIDEsIC0xIH0sCisgICAgeyAtMSwgIDEsICAxLCAtMSB9LAorICAgIHsgIDAsIC0xLCAgMSwgLTEgfSwKKyAgICB7ICAxLCAtMSwgIDEsIC0xIH0sCisgICAgeyAtMSwgLTEsICAxLCAtMSB9LAorCisgICAgeyAgMCwgIDAsICAwLCAgMCB9LAorICAgIHsgIDEsICAwLCAtMSwgLTEgfSwKKyAgICB7ICAwLCAgMSwgLTEsIC0xIH0sCisgICAgeyAgMSwgIDEsIC0xLCAtMSB9LAorICAgIHsgLTEsICAxLCAtMSwgLTEgfSwKKyAgICB7ICAxLCAtMSwgLTEsIC0xIH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbHVtYV9hZGp1c3RbXSA9IHsgLTQsIC0zLCAtMiwgLTEsIDEsIDIsIDMsIDQgfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBjaHJvbWFfYWRqdXN0WzJdWzhdID0geworICAgIHsgMSwgMSwgMCwgLTEsIC0xLCAtMSwgIDAsICAxIH0sCisgICAgeyAwLCAxLCAxLCAgMSwgIDAsIC0xLCAtMSwgLTEgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2hyb21hX3ZhbHNbXSA9IHsKKyAgICAgMjAsICAyOCwgIDM2LCAgNDQsICA1MiwgIDYwLCAgNjgsICA3NiwKKyAgICAgODQsICA5MiwgMTAwLCAxMDYsIDExMiwgMTE2LCAxMjAsIDEyNCwKKyAgICAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0NCwgMTUwLCAxNTYsIDE2NCwKKyAgICAxNzIsIDE4MCwgMTg4LCAxOTYsIDIwNCwgMjEyLCAyMjAsIDIyOAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IGVzY2FwZTEzMF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRXNjYXBlMTMwQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisKKyAgICBpZiAoKGF2Y3R4LT53aWR0aCAmIDEpIHx8IChhdmN0eC0+aGVpZ2h0ICYgMSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRGltZW5zaW9ucyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiB0d28uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+b2xkX3lfYXZnID0gYXZfbWFsbG9jKGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgLyA0KTsKKyAgICBzLT5idWYxICAgICAgPSBhdl9tYWxsb2MoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqIDMgLyAyKTsKKyAgICBzLT5idWYyICAgICAgPSBhdl9tYWxsb2MoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqIDMgLyAyKTsKKyAgICBpZiAoIXMtPm9sZF95X2F2ZyB8fCAhcy0+YnVmMSB8fCAhcy0+YnVmMikgeworICAgICAgICBhdl9mcmVlcCgmcy0+b2xkX3lfYXZnKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmJ1ZjEpOworICAgICAgICBhdl9mcmVlcCgmcy0+YnVmMik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlci5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHMtPmxpbmVzaXplWzBdID0gYXZjdHgtPndpZHRoOworICAgIHMtPmxpbmVzaXplWzFdID0KKyAgICBzLT5saW5lc2l6ZVsyXSA9IGF2Y3R4LT53aWR0aCAvIDI7CisKKyAgICBzLT5uZXdfeSA9IHMtPmJ1ZjE7CisgICAgcy0+bmV3X3UgPSBzLT5uZXdfeSArIGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQ7CisgICAgcy0+bmV3X3YgPSBzLT5uZXdfdSArIGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgLyA0OworICAgIHMtPm9sZF95ID0gcy0+YnVmMjsKKyAgICBzLT5vbGRfdSA9IHMtPm9sZF95ICsgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodDsKKyAgICBzLT5vbGRfdiA9IHMtPm9sZF91ICsgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAvIDQ7CisgICAgbWVtc2V0KHMtPm9sZF95LCAwLCAgICBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0KTsKKyAgICBtZW1zZXQocy0+b2xkX3UsIDB4MTAsIGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgLyA0KTsKKyAgICBtZW1zZXQocy0+b2xkX3YsIDB4MTAsIGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgLyA0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZXNjYXBlMTMwX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRXNjYXBlMTMwQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmcy0+b2xkX3lfYXZnKTsKKyAgICBhdl9mcmVlcCgmcy0+YnVmMSk7CisgICAgYXZfZnJlZXAoJnMtPmJ1ZjIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3NraXBfY291bnQoR2V0Qml0Q29udGV4dCogZ2IpCit7CisgICAgaW50IHZhbHVlOworCisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgMSszKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICB2YWx1ZSA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKHZhbHVlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHZhbHVlID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgIGlmICh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgdmFsdWUgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgaWYgKHZhbHVlKQorICAgICAgICByZXR1cm4gdmFsdWUgKyA3OworCisgICAgdmFsdWUgPSBnZXRfYml0cyhnYiwgMTUpOworICAgIGlmICh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHZhbHVlICsgMjYyOworCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGVzY2FwZTEzMF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgaW50IGJ1Zl9zaXplICAgICAgICA9IGF2cGt0LT5zaXplOworICAgIEVzY2FwZTEzMENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKnBpYyAgICAgICAgPSBkYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IHJldDsKKworICAgIHVpbnQ4X3QgKm9sZF95LCAqb2xkX2NiLCAqb2xkX2NyLAorICAgICAgICAgICAgKm5ld195LCAqbmV3X2NiLCAqbmV3X2NyOworICAgIHVpbnQ4X3QgKmRzdFksICpkc3RVLCAqZHN0VjsKKyAgICB1bnNpZ25lZCBvbGRfeV9zdHJpZGUsIG9sZF9jYl9zdHJpZGUsIG9sZF9jcl9zdHJpZGUsCisgICAgICAgICAgICAgbmV3X3lfc3RyaWRlLCBuZXdfY2Jfc3RyaWRlLCBuZXdfY3Jfc3RyaWRlOworICAgIHVuc2lnbmVkIHRvdGFsX2Jsb2NrcyA9IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgLyA0LAorICAgICAgICAgICAgIGJsb2NrX2luZGV4LCBibG9ja194ID0gMDsKKyAgICB1bnNpZ25lZCB5WzRdID0geyAwIH0sIGNiID0gMHgxMCwgY3IgPSAweDEwOworICAgIGludCBza2lwID0gLTEsIHlfYXZnID0gMCwgaSwgajsKKyAgICB1aW50OF90ICp5YSA9IHMtPm9sZF95X2F2ZzsKKworICAgIC8vIGZpcnN0IDE2IGJ5dGVzIGFyZSBoZWFkZXI7IG5vIHVzZWZ1bCBpbmZvcm1hdGlvbiBpbiBoZXJlCisgICAgaWYgKGJ1Zl9zaXplIDw9IDE2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGZyYW1lIGRhdGFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpYywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCAxNiAqIDgpOworCisgICAgbmV3X3kgID0gcy0+bmV3X3k7CisgICAgbmV3X2NiID0gcy0+bmV3X3U7CisgICAgbmV3X2NyID0gcy0+bmV3X3Y7CisgICAgbmV3X3lfc3RyaWRlICA9IHMtPmxpbmVzaXplWzBdOworICAgIG5ld19jYl9zdHJpZGUgPSBzLT5saW5lc2l6ZVsxXTsKKyAgICBuZXdfY3Jfc3RyaWRlID0gcy0+bGluZXNpemVbMl07CisgICAgb2xkX3kgID0gcy0+b2xkX3k7CisgICAgb2xkX2NiID0gcy0+b2xkX3U7CisgICAgb2xkX2NyID0gcy0+b2xkX3Y7CisgICAgb2xkX3lfc3RyaWRlICA9IHMtPmxpbmVzaXplWzBdOworICAgIG9sZF9jYl9zdHJpZGUgPSBzLT5saW5lc2l6ZVsxXTsKKyAgICBvbGRfY3Jfc3RyaWRlID0gcy0+bGluZXNpemVbMl07CisKKyAgICBmb3IgKGJsb2NrX2luZGV4ID0gMDsgYmxvY2tfaW5kZXggPCB0b3RhbF9ibG9ja3M7IGJsb2NrX2luZGV4KyspIHsKKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgY2FsbCB3aWxsIG1ha2UgdXMgc2tpcCB0aGUgcmVzdCBvZiB0aGUgYmxvY2tzCisgICAgICAgIC8vIGlmIHRoZSBmcmFtZSBlbmRzIHByZW1hdHVyZWx5LgorICAgICAgICBpZiAoc2tpcCA9PSAtMSkKKyAgICAgICAgICAgIHNraXAgPSBkZWNvZGVfc2tpcF9jb3VudCgmZ2IpOworICAgICAgICBpZiAoc2tpcCA9PSAtMSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBkZWNvZGluZyBza2lwIHZhbHVlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNraXApIHsKKyAgICAgICAgICAgIHlbMF0gPSBvbGRfeVswXTsKKyAgICAgICAgICAgIHlbMV0gPSBvbGRfeVsxXTsKKyAgICAgICAgICAgIHlbMl0gPSBvbGRfeVtvbGRfeV9zdHJpZGVdOworICAgICAgICAgICAgeVszXSA9IG9sZF95W29sZF95X3N0cmlkZSArIDFdOworICAgICAgICAgICAgeV9hdmcgPSB5YVswXTsKKyAgICAgICAgICAgIGNiID0gb2xkX2NiWzBdOworICAgICAgICAgICAgY3IgPSBvbGRfY3JbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZnYikpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaWduX3NlbGVjdG9yICAgICAgID0gZ2V0X2JpdHMoJmdiLCA2KTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBkaWZmZXJlbmNlX3NlbGVjdG9yID0gZ2V0X2JpdHMoJmdiLCAyKTsKKyAgICAgICAgICAgICAgICB5X2F2ZyA9IDIgKiBnZXRfYml0cygmZ2IsIDUpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgeVtpXSA9IGF2X2NsaXAoeV9hdmcgKyBvZmZzZXRfdGFibGVbZGlmZmVyZW5jZV9zZWxlY3Rvcl0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduX3RhYmxlW3NpZ25fc2VsZWN0b3JdW2ldLCAwLCA2Myk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRfYml0czEoJmdiKSkgeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJmdiKSkgeworICAgICAgICAgICAgICAgICAgICB5X2F2ZyA9IGdldF9iaXRzKCZnYiwgNik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYWRqdXN0X2luZGV4ID0gZ2V0X2JpdHMoJmdiLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgeV9hdmcgPSAoeV9hdmcgKyBsdW1hX2FkanVzdFthZGp1c3RfaW5kZXhdKSAmIDYzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB5W2ldID0geV9hdmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJmdiKSkgeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJmdiKSkgeworICAgICAgICAgICAgICAgICAgICBjYiA9IGdldF9iaXRzKCZnYiwgNSk7CisgICAgICAgICAgICAgICAgICAgIGNyID0gZ2V0X2JpdHMoJmdiLCA1KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhZGp1c3RfaW5kZXggPSBnZXRfYml0cygmZ2IsIDMpOworICAgICAgICAgICAgICAgICAgICBjYiA9IChjYiArIGNocm9tYV9hZGp1c3RbMF1bYWRqdXN0X2luZGV4XSkgJiAzMTsKKyAgICAgICAgICAgICAgICAgICAgY3IgPSAoY3IgKyBjaHJvbWFfYWRqdXN0WzFdW2FkanVzdF9pbmRleF0pICYgMzE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICp5YSsrID0geV9hdmc7CisKKyAgICAgICAgbmV3X3lbMF0gICAgICAgICAgICAgICAgPSB5WzBdOworICAgICAgICBuZXdfeVsxXSAgICAgICAgICAgICAgICA9IHlbMV07CisgICAgICAgIG5ld195W25ld195X3N0cmlkZV0gICAgID0geVsyXTsKKyAgICAgICAgbmV3X3lbbmV3X3lfc3RyaWRlICsgMV0gPSB5WzNdOworICAgICAgICAqbmV3X2NiID0gY2I7CisgICAgICAgICpuZXdfY3IgPSBjcjsKKworICAgICAgICBvbGRfeSArPSAyOworICAgICAgICBvbGRfY2IrKzsKKyAgICAgICAgb2xkX2NyKys7CisgICAgICAgIG5ld195ICs9IDI7CisgICAgICAgIG5ld19jYisrOworICAgICAgICBuZXdfY3IrKzsKKyAgICAgICAgYmxvY2tfeCsrOworICAgICAgICBpZiAoYmxvY2tfeCAqIDIgPT0gYXZjdHgtPndpZHRoKSB7CisgICAgICAgICAgICBibG9ja194ID0gMDsKKyAgICAgICAgICAgIG9sZF95ICArPSBvbGRfeV9zdHJpZGUgKiAyICAtIGF2Y3R4LT53aWR0aDsKKyAgICAgICAgICAgIG9sZF9jYiArPSBvbGRfY2Jfc3RyaWRlICAgICAtIGF2Y3R4LT53aWR0aCAvIDI7CisgICAgICAgICAgICBvbGRfY3IgKz0gb2xkX2NyX3N0cmlkZSAgICAgLSBhdmN0eC0+d2lkdGggLyAyOworICAgICAgICAgICAgbmV3X3kgICs9IG5ld195X3N0cmlkZSAqIDIgIC0gYXZjdHgtPndpZHRoOworICAgICAgICAgICAgbmV3X2NiICs9IG5ld19jYl9zdHJpZGUgICAgIC0gYXZjdHgtPndpZHRoIC8gMjsKKyAgICAgICAgICAgIG5ld19jciArPSBuZXdfY3Jfc3RyaWRlICAgICAtIGF2Y3R4LT53aWR0aCAvIDI7CisgICAgICAgIH0KKworICAgICAgICBza2lwLS07CisgICAgfQorCisgICAgbmV3X3kgID0gcy0+bmV3X3k7CisgICAgbmV3X2NiID0gcy0+bmV3X3U7CisgICAgbmV3X2NyID0gcy0+bmV3X3Y7CisgICAgZHN0WSAgID0gcGljLT5kYXRhWzBdOworICAgIGRzdFUgICA9IHBpYy0+ZGF0YVsxXTsKKyAgICBkc3RWICAgPSBwaWMtPmRhdGFbMl07CisgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT5oZWlnaHQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPndpZHRoOyBpKyspCisgICAgICAgICAgICBkc3RZW2ldID0gbmV3X3lbaV0gPDwgMjsKKyAgICAgICAgZHN0WSAgKz0gcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgbmV3X3kgKz0gbmV3X3lfc3RyaWRlOworICAgIH0KKyAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPmhlaWdodCAvIDI7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPndpZHRoIC8gMjsgaSsrKSB7CisgICAgICAgICAgICBkc3RVW2ldID0gY2hyb21hX3ZhbHNbbmV3X2NiW2ldXTsKKyAgICAgICAgICAgIGRzdFZbaV0gPSBjaHJvbWFfdmFsc1tuZXdfY3JbaV1dOworICAgICAgICB9CisgICAgICAgIGRzdFUgICArPSBwaWMtPmxpbmVzaXplWzFdOworICAgICAgICBkc3RWICAgKz0gcGljLT5saW5lc2l6ZVsyXTsKKyAgICAgICAgbmV3X2NiICs9IG5ld19jYl9zdHJpZGU7CisgICAgICAgIG5ld19jciArPSBuZXdfY3Jfc3RyaWRlOworICAgIH0KKworICAgIGF2X2Rsb2coYXZjdHgsICJGcmFtZSBkYXRhOiBwcm92aWRlZCAlZCBieXRlcywgdXNlZCAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgIGJ1Zl9zaXplLCBnZXRfYml0c19jb3VudCgmZ2IpID4+IDMpOworCisgICAgRkZTV0FQKHVpbnQ4X3QqLCBzLT5vbGRfeSwgcy0+bmV3X3kpOworICAgIEZGU1dBUCh1aW50OF90Kiwgcy0+b2xkX3UsIHMtPm5ld191KTsKKyAgICBGRlNXQVAodWludDhfdCosIHMtPm9sZF92LCBzLT5uZXdfdik7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworQVZDb2RlYyBmZl9lc2NhcGUxMzBfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZXNjYXBlMTMwIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRXNjYXBlIDEzMCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9FU0NBUEUxMzAsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEVzY2FwZTEzMENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGVzY2FwZTEzMF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBlc2NhcGUxMzBfZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGVzY2FwZTEzMF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ldnJjZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZXZyY2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2ZjMjAyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZXZyY2RhdGEuaApAQCAtMCwwICsxLDE0OTkgQEAKKy8qCisgKiBFbmhhbmNlZCBWYXJpYWJsZSBSYXRlIENvZGVjLCBTZXJ2aWNlIE9wdGlvbiAzIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0VWUkNEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19FVlJDREFUQV9ICisKKy8qKgorICogQGZpbGUKKyAqIERhdGEgdGFibGVzIGZvciB0aGUgRVZSQyBkZWNvZGVyCisgKiBAYXV0aG9yIFBhdWwgQiBNYWhvbAorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKy8qKgorICogUmF0ZSAxLzggZnJhbWUgZW5lcmd5IHF1YW50aXphdGlvbgorICoKKyAqIFRJQS9JUy0xMjcgdGFibGUgOC0xOAorICovCitzdGF0aWMgY29uc3QgZmxvYXQgZXZyY19lbmVyZ3lfcXVhbnRbXVszXSA9IHsKK3stMC4yNDY0RS0wMSwtMC40MDA1RS0wMiwtMC4xMTA3RSswMCB9LCB7IDAuODczNEUrMDAsIDAuMTAwNEUrMDEsIDAuOTkzMEUrMDAgfSwKK3sgMC40MjIyRSswMCwgMC4zODk0RSswMCwgMC41MDIwRSswMCB9LCB7IDAuMTQ1MEUrMDEsIDAuMTMyOEUrMDEsIDAuMTI3OEUrMDEgfSwKK3sgMC4xOTU3RSswMCwgMC4yMTY5RSswMCwgMC4yNzM1RSswMCB9LCB7IDAuMTE0MkUrMDEsIDAuMTI0MEUrMDEsIDAuMTE1N0UrMDEgfSwKK3sgMC43ODgxRSswMCwgMC42Nzc4RSswMCwgMC40MTg1RSswMCB9LCB7IDAuMTUwNEUrMDEsIDAuMTQ2OEUrMDEsIDAuMTUzNEUrMDEgfSwKK3sgMC4zMTczRSswMCwgMC4yNjkzRSswMCwtMC45NTI2RS0wMSB9LCB7IDAuMTE0MUUrMDEsIDAuMTE1NEUrMDEsIDAuMTA0NEUrMDEgfSwKK3sgMC41MTQ3RSswMCwgMC41Nzg0RSswMCwgMC44ODAyRSswMCB9LCB7IDAuMTUwMkUrMDEsIDAuMTQwN0UrMDEsIDAuMTQwOUUrMDEgfSwKK3sgMC4zMTYzRSswMCwgMC4zNTkyRSswMCwgMC4yODMwRSswMCB9LCB7IDAuMTIxN0UrMDEsIDAuMTIxM0UrMDEsIDAuMTIxNkUrMDEgfSwKK3sgMC4xMDIzRSswMSwgMC4xMTM5RSswMSwtMC45NTI2RS0wMSB9LCB7IDAuMTYxOUUrMDEsIDAuMTY1NUUrMDEsIDAuMTY0MkUrMDEgfSwKK3sgMC4xNDM3RSswMCwgMC4xNTA1RSswMCwgMC42ODM4RS0wMSB9LCB7IDAuOTc5NEUrMDAsIDAuMTAyMUUrMDEsIDAuMTExN0UrMDEgfSwKK3sgMC40NzAxRSswMCwgMC42NDI2RSswMCwgMC41NTE5RSswMCB9LCB7IDAuMTM2NkUrMDEsIDAuMTM5N0UrMDEsIDAuMTQwNkUrMDEgfSwKK3sgMC4yOTE4RSswMCwgMC4zMDIyRSswMCwgMC4yNDIwRSswMCB9LCB7IDAuMTMwOUUrMDEsIDAuMTI0MUUrMDEsIDAuMTIyMEUrMDEgfSwKK3sgMC43OTg5RSswMCwgMC43NjU0RSswMCwgMC43MzkxRSswMCB9LCB7IDAuMTYxMkUrMDEsIDAuMTUwMkUrMDEsIDAuMTQ0N0UrMDEgfSwKK3sgMC4yNTk0RSswMCwgMC4xOTQ4RSswMCwgMC4yNTU1RSswMCB9LCB7IDAuMTA5MUUrMDEsIDAuMTE1MEUrMDEsIDAuMTI3MkUrMDEgfSwKK3sgMC4zNDIzRSswMCwgMC40MTUwRSswMCwgMC4xMjk0RSswMSB9LCB7IDAuMTcyOUUrMDEsIDAuMTM3N0UrMDEsIDAuMTA2NUUrMDEgfSwKK3sgMC40MTAzRSswMCwgMC4zMjg3RSswMCwgMC4zMjI4RSswMCB9LCB7IDAuMTE0NEUrMDEsIDAuMTI4MUUrMDEsIDAuMTQxNkUrMDEgfSwKK3sgMC4xMDQ3RSswMSwgMC4xMTE3RSswMSwgMC42MTg4RSswMCB9LCB7IDAuMTkxNEUrMDEsIDAuMTc3N0UrMDEsIDAuMTUxNkUrMDEgfSwKK3stMC4yMTE3RS0wMSwgMC4yMTU5RSswMCwgMC4yMzUxRSswMCB9LCB7IDAuMTA5M0UrMDEsIDAuMTA4OEUrMDEsIDAuMTAyNkUrMDEgfSwKK3sgMC41NTY3RSswMCwgMC41MDkyRSswMCwgMC40NjU0RSswMCB9LCB7IDAuMTUxMEUrMDEsIDAuMTQ0OUUrMDEsIDAuMTIwMUUrMDEgfSwKK3sgMC4yMzYyRSswMCwgMC4zNDI2RSswMCwgMC4yNTQ5RSswMCB9LCB7IDAuMTM0MEUrMDEsIDAuMTIyNUUrMDEsIDAuMTExN0UrMDEgfSwKK3sgMC4xMjAzRSswMSwgMC4zODE5RSswMCwgMC4yMjY5RSswMCB9LCB7IDAuMTM3M0UrMDEsIDAuMTQwNEUrMDEsIDAuMTgzMEUrMDEgfSwKK3sgMC4yNTcwRSswMCwgMC4yNjY4RSswMCwgMC4xNjM2RSswMCB9LCB7IDAuMTIxOUUrMDEsIDAuMTA5OEUrMDEsIDAuMTEyMkUrMDEgfSwKK3sgMC42OTg1RSswMCwgMC44NDU2RSswMCwgMC4xMDY5RSswMSB9LCB7IDAuMTU1MEUrMDEsIDAuMTUwMUUrMDEsIDAuMTM4OEUrMDEgfSwKK3sgMC4yODcwRSswMCwgMC4zMDYwRSswMCwgMC4zNTk5RSswMCB9LCB7IDAuMTE3OEUrMDEsIDAuMTM0NUUrMDEsIDAuMTMwMkUrMDEgfSwKK3sgMC4xMjcwRSswMSwgMC4xMjE1RSswMSwgMC4xODEyRSswMCB9LCB7IDAuMTcyNUUrMDEsIDAuMTc3N0UrMDEsIDAuMTY5M0UrMDEgfSwKK3sgMC4yMDc0RSswMCwgMC4yMTA0RSswMCwgMC4xNTM5RSswMCB9LCB7IDAuMTEwNUUrMDEsIDAuMTAzNEUrMDEsIDAuMTEwNEUrMDEgfSwKK3sgMC42NjgzRSswMCwgMC42NjQ2RSswMCwgMC42NjM5RSswMCB9LCB7IDAuMTQwM0UrMDEsIDAuMTQ2MkUrMDEsIDAuMTQzNUUrMDEgfSwKK3sgMC4zMzg5RSswMCwgMC4zNzU0RSswMCwgMC4yMTUwRSswMCB9LCB7IDAuMTI4OEUrMDEsIDAuMTMyNUUrMDEsIDAuMTI1N0UrMDEgfSwKK3sgMC44OTMzRSswMCwgMC44MjUzRSswMCwgMC44MTMzRSswMCB9LCB7IDAuMTU1NUUrMDEsIDAuMTU3OUUrMDEsIDAuMTU2NUUrMDEgfSwKK3sgMC4zMjY0RSswMCwgMC4yNDM0RSswMCwgMC4yODUyRSswMCB9LCB7IDAuMTI0MkUrMDEsIDAuMTE4MEUrMDEsIDAuMTIwMkUrMDEgfSwKK3sgMC4xMzE0RSswMCwgMC4xNjk4RSswMCwgMC4xNjQ2RSswMSB9LCB7IDAuMTc5N0UrMDEsIDAuMTU5N0UrMDEsIDAuMTI0MUUrMDEgfSwKK3sgMC40NzIxRSswMCwgMC41MzQ2RSswMCwgMC4zMDY2RSswMCB9LCB7IDAuMTI3NEUrMDEsIDAuMTQwMUUrMDEsIDAuMTM1MUUrMDEgfSwKK3sgMC4xNDU1RSswMSwgMC4xMzg2RSswMSwgMC42NDMwRSswMCB9LCB7IDAuMTgyOEUrMDEsIDAuMTg2N0UrMDEsIDAuMTgyNUUrMDEgfSwKK3stMC4zMjY1RSswMCwtMC4yOTU2RSswMCwtMC4yNDYyRSswMCB9LCB7IDAuMTAzNUUrMDEsIDAuMTAyMEUrMDEsIDAuMTAwM0UrMDEgfSwKK3sgMC4zNzAyRSswMCwgMC40MzA3RSswMCwgMC43MDcyRSswMCB9LCB7IDAuMTQyNEUrMDEsIDAuMTM0NUUrMDEsIDAuMTM1MkUrMDEgfSwKK3sgMC4yMjY3RSswMCwgMC4yNjgwRSswMCwgMC4zMDM3RSswMCB9LCB7IDAuMTIzNUUrMDEsIDAuMTI0OUUrMDEsIDAuMTE0NkUrMDEgfSwKK3sgMC45OTQ0RSswMCwgMC42NDg1RSswMCwgMC41MjQ4RSswMCB9LCB7IDAuMTUzOUUrMDEsIDAuMTQ5MkUrMDEsIDAuMTYxMkUrMDEgfSwKK3sgMC4zODE1RSswMCwgMC4zMzYwRSswMCwtMC45NTI2RS0wMSB9LCB7IDAuMTE2M0UrMDEsIDAuMTE0NEUrMDEsIDAuMTExN0UrMDEgfSwKK3sgMC42NzM0RSswMCwgMC43NjU2RSswMCwgMC4xMDE0RSswMSB9LCB7IDAuMTU2OEUrMDEsIDAuMTQzOEUrMDEsIDAuMTQ1NUUrMDEgfSwKK3sgMC4zNDA5RSswMCwgMC4zMzE3RSswMCwgMC4zODU2RSswMCB9LCB7IDAuMTE4MEUrMDEsIDAuMTI4NEUrMDEsIDAuMTI4NEUrMDEgfSwKK3sgMC4xMjQ0RSswMSwgMC4xMjE0RSswMSwtMC45NTI2RS0wMSB9LCB7IDAuMTc1M0UrMDEsIDAuMTU5OEUrMDEsIDAuMTc0NEUrMDEgfSwKK3sgMC4xNTQ4RSswMCwgMC4xMzg4RSswMCwgMC4yMDIwRSswMCB9LCB7IDAuMTAyN0UrMDEsIDAuMTEzM0UrMDEsIDAuMTA5M0UrMDEgfSwKK3sgMC4zOTA2RSswMCwgMC43NTA1RSswMCwgMC41NzA1RSswMCB9LCB7IDAuMTQyMEUrMDEsIDAuMTM1N0UrMDEsIDAuMTU0M0UrMDEgfSwKK3sgMC4zMjUyRSswMCwgMC4zMTM2RSswMCwgMC4yODA0RSswMCB9LCB7IDAuMTM1MUUrMDEsIDAuMTMwOUUrMDEsIDAuMTIyNEUrMDEgfSwKK3sgMC44NzgxRSswMCwgMC44MDk1RSswMCwgMC43MTA5RSswMCB9LCB7IDAuMTYxNEUrMDEsIDAuMTU4MEUrMDEsIDAuMTQzM0UrMDEgfSwKK3sgMC4zMjIyRSswMCwgMC4yMjk4RSswMCwgMC4yMTU3RSswMCB9LCB7IDAuMTIxNkUrMDEsIDAuMTA3N0UrMDEsIDAuMTI0N0UrMDEgfSwKK3sgMC4xMzYzRSswMSwgMC4xMjgwRSswMSwgMC4xMzE3RSswMSB9LCB7IDAuMTc1MUUrMDEsIDAuMTQ1N0UrMDEsIDAuMTE4MkUrMDEgfSwKK3sgMC40NDI4RSswMCwgMC40MDgyRSswMCwgMC4zMTgxRSswMCB9LCB7IDAuMTE1N0UrMDEsIDAuMTIyN0UrMDEsIDAuMTYwNEUrMDEgfSwKK3sgMC4xMjg2RSswMSwgMC4xMjY4RSswMSwgMC44MTY3RSswMCB9LCB7IDAuMTk5NEUrMDEsIDAuMjAxOEUrMDEsIDAuMTMwN0UrMDEgfSwKK3sgMC4yNjcxRS0wMSwgMC4yNTk0RSswMCwgMC4zMzk3RSswMCB9LCB7IDAuMTE2NEUrMDEsIDAuMTA4MEUrMDEsIDAuOTMyMUUrMDAgfSwKK3sgMC41OTk4RSswMCwgMC42MDc2RSswMCwgMC41MDgxRSswMCB9LCB7IDAuMTQ0MkUrMDEsIDAuMTQ0MkUrMDEsIDAuMTM3NUUrMDEgfSwKK3sgMC4yMzkwRSswMCwgMC4zNTU0RSswMCwgMC4zNDI2RSswMCB9LCB7IDAuMTI4N0UrMDEsIDAuMTMwN0UrMDEsIDAuMTE0NEUrMDEgfSwKK3sgMC4xMjAwRSswMSwgMC43NDk1RSswMCwgMC4zOTY3RSswMCB9LCB7IDAuMTU2MUUrMDEsIDAuMTUxN0UrMDEsIDAuMTg5OEUrMDEgfSwKK3sgMC4zNTk4RSswMCwgMC4zNDYzRSswMCwgMC4xMjAwRSswMCB9LCB7IDAuMTI5OEUrMDEsIDAuMTEyNUUrMDEsIDAuMTA2MkUrMDEgfSwKK3sgMC43NTc3RSswMCwgMC4xMDEzRSswMSwgMC4xMTk0RSswMSB9LCB7IDAuMTUzN0UrMDEsIDAuMTUxM0UrMDEsIDAuMTQ2NEUrMDEgfSwKK3sgMC40MDQxRSswMCwgMC40MDM4RSswMCwgMC4zODk3RSswMCB9LCB7IDAuMTI5M0UrMDEsIDAuMTIxOUUrMDEsIDAuMTM3OEUrMDEgfSwKK3sgMC4xMjUwRSswMSwgMC4xMzkxRSswMSwgMC4yNDUxRSswMCB9LCB7IDAuMTU1OEUrMDEsIDAuMTc2NEUrMDEsIDAuMTcyOEUrMDEgfSwKK3sgMC4yNzAwRSswMCwgMC4xODk0RSswMCwgMC4xOTI0RSswMCB9LCB7IDAuMTExMUUrMDEsIDAuMTExMkUrMDEsIDAuMTE3M0UrMDEgfSwKK3sgMC43NTc5RSswMCwgMC44MzQyRSswMCwgMC40NzgxRSswMCB9LCB7IDAuMTQ2NEUrMDEsIDAuMTQ3N0UrMDEsIDAuMTQ2OUUrMDEgfSwKK3sgMC40MDAxRSswMCwgMC4zMTA0RSswMCwgMC4yMjE3RSswMCB9LCB7IDAuMTM0NkUrMDEsIDAuMTQyMUUrMDEsIDAuMTMxMkUrMDEgfSwKK3sgMC4xMDcxRSswMSwgMC44OTY3RSswMCwgMC43NTExRSswMCB9LCB7IDAuMTYxNkUrMDEsIDAuMTU1MUUrMDEsIDAuMTU3NEUrMDEgfSwKK3sgMC4zMzI5RSswMCwgMC4yNzg1RSswMCwgMC4zMTQwRSswMCB9LCB7IDAuMTI4MUUrMDEsIDAuMTIwOUUrMDEsIDAuMTIzOUUrMDEgfSwKK3sgMC4yODA1RSswMCwgMC4yNjg3RSswMCwgMC4xNjQ2RSswMSB9LCB7IDAuMTgxNEUrMDEsIDAuMTUxNEUrMDEsIDAuMTUxMEUrMDEgfSwKK3sgMC42MjMxRSswMCwgMC40MjAwRSswMCwgMC4zNzAxRSswMCB9LCB7IDAuMTI1NUUrMDEsIDAuMTQyOUUrMDEsIDAuMTQ1NEUrMDEgfSwKK3sgMC4xNjQyRSswMSwgMC4xNTgxRSswMSwgMC43MTEyRSswMCB9LCB7IDAuMTg0NEUrMDEsIDAuMTk2M0UrMDEsIDAuMTg5NUUrMDEgfSwKK3stMC40MjA4RS0wMSwtMC4xNDkxRSswMCwtMC43NjM5RS0wMSB9LCB7IDAuMTA0NkUrMDEsIDAuOTU5OEUrMDAsIDAuOTE3NkUrMDAgfSwKK3sgMC40NDc4RSswMCwgMC40NjA1RSswMCwgMC41MTExRSswMCB9LCB7IDAuMTUyMUUrMDEsIDAuMTI5MkUrMDEsIDAuMTM0MkUrMDEgfSwKK3sgMC4yMjIwRSswMCwgMC4yNTQ5RSswMCwgMC4yNTEwRSswMCB9LCB7IDAuMTE4NkUrMDEsIDAuMTI1NEUrMDEsIDAuMTE3MUUrMDEgfSwKK3sgMC44OTk5RSswMCwgMC40OTYwRSswMCwgMC40OTQzRSswMCB9LCB7IDAuMTQyM0UrMDEsIDAuMTQ4NEUrMDEsIDAuMTYyMEUrMDEgfSwKK3sgMC4yNzk2RSswMCwgMC4yNzc4RSswMCwtMC4yODIwRSswMCB9LCB7IDAuMTE3MEUrMDEsIDAuMTE4MUUrMDEsIDAuMTA3NkUrMDEgfSwKK3sgMC40MDY4RSswMCwgMC44NTQxRSswMCwgMC45MzUyRSswMCB9LCB7IDAuMTU4NEUrMDEsIDAuMTQxNkUrMDEsIDAuMTM4N0UrMDEgfSwKK3sgMC4zMzI1RSswMCwgMC4zNjU1RSswMCwgMC4zMzQwRSswMCB9LCB7IDAuMTIyNEUrMDEsIDAuMTI1N0UrMDEsIDAuMTI0NUUrMDEgfSwKK3sgMC4xMDYxRSswMSwgMC4xMTM4RSswMSwtMC45NTI2RS0wMSB9LCB7IDAuMTY4MUUrMDEsIDAuMTcwNEUrMDEsIDAuMTY3M0UrMDEgfSwKK3sgMC4xOTMyRSswMCwgMC4xNDg5RSswMCwgMC4xMjU4RSswMCB9LCB7IDAuMTAyM0UrMDEsIDAuMTA4OEUrMDEsIDAuMTE0NUUrMDEgfSwKK3sgMC41MTkwRSswMCwgMC42ODczRSswMCwgMC41MTcyRSswMCB9LCB7IDAuMTM4MEUrMDEsIDAuMTQwNUUrMDEsIDAuMTQ3NEUrMDEgfSwKK3sgMC4zMzkzRSswMCwgMC4zMTAwRSswMCwgMC4yMjMxRSswMCB9LCB7IDAuMTM1NEUrMDEsIDAuMTI0OUUrMDEsIDAuMTI3MEUrMDEgfSwKK3sgMC43MzYzRSswMCwgMC44NTA4RSswMCwgMC44MjQ3RSswMCB9LCB7IDAuMTYxMkUrMDEsIDAuMTUzN0UrMDEsIDAuMTUwOUUrMDEgfSwKK3sgMC4yOTUyRSswMCwgMC4yMDUzRSswMCwgMC4yNTkwRSswMCB9LCB7IDAuMTEzOEUrMDEsIDAuMTIxOUUrMDEsIDAuMTI2MkUrMDEgfSwKK3sgMC4xMzQ1RSswMSwgMC4xMjg5RSswMSwgMC4xMzM4RSswMSB9LCB7IDAuMTQzN0UrMDEsIDAuMTM2MEUrMDEsIDAuMTQ0MkUrMDEgfSwKK3sgMC40ODI2RSswMCwgMC4zMjk4RSswMCwgMC4zODQyRSswMCB9LCB7IDAuMTIxOUUrMDEsIDAuMTMxMUUrMDEsIDAuMTQxM0UrMDEgfSwKK3sgMC4xMjEyRSswMSwgMC4xMTg2RSswMSwgMC42MzU3RSswMCB9LCB7IDAuMTg3M0UrMDEsIDAuMTkzOUUrMDEsIDAuMTY3NEUrMDEgfSwKK3sgMC4xMjYwRSswMSwgMC4xMzA2RSswMSwgMC4xMzY4RSswMSB9LCB7IDAuMTE0NkUrMDEsIDAuMTA3N0UrMDEsIDAuMTAyNUUrMDEgfSwKK3sgMC42MDI5RSswMCwgMC41MDM5RSswMCwgMC41NzgxRSswMCB9LCB7IDAuMTUxNEUrMDEsIDAuMTQyMEUrMDEsIDAuMTMyNEUrMDEgfSwKK3sgMC4yNjUyRSswMCwgMC4zMTkyRSswMCwgMC4zMDQyRSswMCB9LCB7IDAuMTM2OEUrMDEsIDAuMTE5OEUrMDEsIDAuMTIwMEUrMDEgfSwKK3sgMC4xMjM0RSswMSwgMC40OTEwRSswMCwgMC4zNDY0RS0wMSB9LCB7IDAuMTM0N0UrMDEsIDAuMTU2MEUrMDEsIDAuMTg2MUUrMDEgfSwKK3sgMC4yNzY2RSswMCwgMC4yODg3RSswMCwgMC4yMDI5RSswMCB9LCB7IDAuMTI1N0UrMDEsIDAuMTEwNUUrMDEsIDAuMTE0NUUrMDEgfSwKK3sgMC4xMzUxRSswMSwgMC4xMzUzRSswMSwgMC4xNDA2RSswMSB9LCB7IDAuMTUwNkUrMDEsIDAuMTU4MEUrMDEsIDAuMTM2MkUrMDEgfSwKK3sgMC4yNzk0RSswMCwgMC4zODY4RSswMCwgMC40Mjc3RSswMCB9LCB7IDAuMTIzNEUrMDEsIDAuMTMzNEUrMDEsIDAuMTMzNkUrMDEgfSwKK3sgMC4xMjgwRSswMSwgMC4xMjUyRSswMSwgMC4xODA1RSswMCB9LCB7IDAuMTM4N0UrMDEsIDAuMTM5NkUrMDEsIDAuMTQzNEUrMDEgfSwKK3sgMC4yOTAyRSswMCwgMC4xMTcwRSswMCwgMC4xNjk4RSswMCB9LCB7IDAuMTEzNEUrMDEsIDAuMTA3N0UrMDEsIDAuMTExN0UrMDEgfSwKK3sgMC42OTg2RSswMCwgMC43MTc3RSswMCwgMC43MzY2RSswMCB9LCB7IDAuMTM3MEUrMDEsIDAuMTQ5MUUrMDEsIDAuMTQ5NUUrMDEgfSwKK3sgMC40MDMxRSswMCwgMC41MTQ0RSswMCwgMC4xNzUxRSswMCB9LCB7IDAuMTMzM0UrMDEsIDAuMTM3N0UrMDEsIDAuMTI1N0UrMDEgfSwKK3sgMC45MjEyRSswMCwgMC44OTM0RSswMCwgMC44ODk3RSswMCB9LCB7IDAuMTU4OUUrMDEsIDAuMTYxNEUrMDEsIDAuMTUyM0UrMDEgfSwKK3sgMC4zMTUyRSswMCwgMC4yMTY0RSswMCwgMC4zMjMwRSswMCB9LCB7IDAuMTMwMEUrMDEsIDAuMTE0NUUrMDEsIDAuMTIxMkUrMDEgfSwKK3sgMC4xMjY5RSswMSwgMC4xMjQ1RSswMSwgMC4xNDk3RSswMSB9LCB7IDAuMTc2M0UrMDEsIDAuMTcxNkUrMDEsIDAuMTMxMUUrMDEgfSwKK3sgMC40NzAyRSswMCwgMC41NDIyRSswMCwgMC40MzA2RSswMCB9LCB7IDAuMTM0MkUrMDEsIDAuMTQzM0UrMDEsIDAuMTQyM0UrMDEgfSwKK3sgMC4xNDcyRSswMSwgMC4xNDA0RSswMSwgMC44MzcxRSswMCB9LCB7IDAuMTkzNkUrMDEsIDAuMTg4M0UrMDEsIDAuMTgzOEUrMDEgfSwKK3sgMC4xMjY2RSswMSwgMC4xMjk1RSswMSwgMC4xMzAyRSswMSB9LCB7IDAuMTA3NEUrMDEsIDAuMTAwMkUrMDEsIDAuMTAyM0UrMDEgfSwKK3sgMC41MjA2RSswMCwgMC40MDQ1RSswMCwgMC42NTQ5RSswMCB9LCB7IDAuMTQ1N0UrMDEsIDAuMTM3OEUrMDEsIDAuMTM2M0UrMDEgfSwKK3sgMC4yNzE1RSswMCwgMC4yNjI5RSswMCwgMC4yODQxRSswMCB9LCB7IDAuMTI2NEUrMDEsIDAuMTI3MUUrMDEsIDAuMTE3NUUrMDEgfSwKK3sgMC4xMzM3RSswMSwgMC4xMzA1RSswMSwgMC4xMzA2RSswMSB9LCB7IDAuMTU1NUUrMDEsIDAuMTU3MUUrMDEsIDAuMTY1N0UrMDEgfSwKK3sgMC4zMzQxRSswMCwgMC40MTQ3RSswMCwtMC4zNjQ4RSswMCB9LCB7IDAuMTE4OEUrMDEsIDAuMTE4NUUrMDEsIDAuMTE2MUUrMDEgfSwKK3sgMC42MTk4RSswMCwgMC43MjA4RSswMCwgMC4xMTU3RSswMSB9LCB7IDAuMTU4MkUrMDEsIDAuMTQ2NUUrMDEsIDAuMTUxM0UrMDEgfSwKK3sgMC4zODM5RSswMCwgMC4zNjUxRSswMCwgMC4zODE0RSswMCB9LCB7IDAuMTIxNEUrMDEsIDAuMTI1NkUrMDEsIDAuMTI5MkUrMDEgfSwKK3sgMC4xMzYxRSswMSwgMC4xMzYzRSswMSwgMC4xMzEyRSswMSB9LCB7IDAuMTc5M0UrMDEsIDAuMTY5M0UrMDEsIDAuMTY2OUUrMDEgfSwKK3sgMC4xODg5RSswMCwgMC4xMjc1RSswMCwgMC4yNTM0RSswMCB9LCB7IDAuMTA2NkUrMDEsIDAuMTE3NEUrMDEsIDAuMTEzM0UrMDEgfSwKK3sgMC40OTk5RSswMCwgMC44MjA3RSswMCwgMC41ODEzRSswMCB9LCB7IDAuMTQ3OEUrMDEsIDAuMTQxNkUrMDEsIDAuMTQ5N0UrMDEgfSwKK3sgMC4zODE0RSswMCwgMC4zMTM4RSswMCwgMC4yODg5RSswMCB9LCB7IDAuMTM5NkUrMDEsIDAuMTI2NUUrMDEsIDAuMTIzM0UrMDEgfSwKK3sgMC45NDU4RSswMCwgMC45MTYxRSswMCwgMC41ODc1RSswMCB9LCB7IDAuMTY3MkUrMDEsIDAuMTYzMkUrMDEsIDAuMTU1M0UrMDEgfSwKK3sgMC4zNTA1RSswMCwgMC4yNTI1RSswMCwgMC4yMzY0RSswMCB9LCB7IDAuMTIxMUUrMDEsIDAuMTEzOEUrMDEsIDAuMTIzNUUrMDEgfSwKK3sgMC4xMzkxRSswMSwgMC4xMjMxRSswMSwgMC4xMzU1RSswMSB9LCB7IDAuMTc4M0UrMDEsIDAuMTUxMEUrMDEsIDAuMTE5OUUrMDEgfSwKK3sgMC40MjI3RSswMCwgMC40NTQ4RSswMCwgMC4zNjcxRSswMCB9LCB7IDAuMTI4MUUrMDEsIDAuMTI1NEUrMDEsIDAuMTY2MUUrMDEgfSwKK3sgMC4xMzM4RSswMSwgMC4xMzc5RSswMSwgMC45NTMxRSswMCB9LCB7IDAuMjE0OEUrMDEsIDAuMTk2NUUrMDEsIDAuMTU4NEUrMDEgfSwKK3sgMC45MzI0RS0wMSwgMC4zNTc1RSswMCwgMC4zNTIyRSswMCB9LCB7IDAuMTIxMkUrMDEsIDAuMTA4NkUrMDEsIDAuMTA0NEUrMDEgfSwKK3sgMC42MTI4RSswMCwgMC42MTM2RSswMCwgMC42MDYwRSswMCB9LCB7IDAuMTQ4NEUrMDEsIDAuMTUwN0UrMDEsIDAuMTM5NkUrMDEgfSwKK3sgMC4yODIwRSswMCwgMC4zODQ4RSswMCwgMC4zMTU2RSswMCB9LCB7IDAuMTM2OEUrMDEsIDAuMTI4N0UrMDEsIDAuMTEyOEUrMDEgfSwKK3sgMC4xMzY5RSswMSwgMC4xMzUyRSswMSwgMC4xMzU4RSswMSB9LCB7IDAuMTM4MUUrMDEsIDAuMTc2NUUrMDEsIDAuMjExM0UrMDEgfSwKK3sgMC4xMzE0RSswMSwgMC4xMzQ1RSswMSwgMC4xMzM0RSswMSB9LCB7IDAuMTI5MEUrMDEsIDAuMTE3MkUrMDEsIDAuMTExOUUrMDEgfSwKK3sgMC4xMzA0RSswMSwgMC4xMzc3RSswMSwgMC4xNDI3RSswMSB9LCB7IDAuMTQ5MEUrMDEsIDAuMTU0MEUrMDEsIDAuMTUzNkUrMDEgfSwKK3sgMC4zOTk0RSswMCwgMC40NDAyRSswMCwgMC40MTczRSswMCB9LCB7IDAuMTMyM0UrMDEsIDAuMTMwN0UrMDEsIDAuMTM5MkUrMDEgfSwKK3sgMC4xNDAwRSswMSwgMC4xMzg4RSswMSwgMC4xMzY5RSswMSB9LCB7IDAuMTY2OUUrMDEsIDAuMTgxOEUrMDEsIDAuMTgzNEUrMDEgfSwKK3sgMC4yNzQyRSswMCwgMC4yMjM1RSswMCwgMC4xOTg2RSswMCB9LCB7IDAuMTEzN0UrMDEsIDAuMTEzOUUrMDEsIDAuMTIwMUUrMDEgfSwKK3sgMC4xMzI0RSswMSwgMC4xMzg1RSswMSwgMC4xMzQ5RSswMSB9LCB7IDAuMTQ1NUUrMDEsIDAuMTU3NEUrMDEsIDAuMTQ1NEUrMDEgfSwKK3sgMC41MDE5RSswMCwgMC4zMjU1RSswMCwgMC4yNTU1RSswMCB9LCB7IDAuMTM4OEUrMDEsIDAuMTQzOEUrMDEsIDAuMTMwMEUrMDEgfSwKK3sgMC4xMzk0RSswMSwgMC4xMzQ5RSswMSwgMC4xNDExRSswMSB9LCB7IDAuMTYzOUUrMDEsIDAuMTU4MEUrMDEsIDAuMTY4MUUrMDEgfSwKK3sgMC4zOTIwRSswMCwgMC4yNDk4RSswMCwgMC4zNTIzRSswMCB9LCB7IDAuMTMwMUUrMDEsIDAuMTIyMUUrMDEsIDAuMTI4NUUrMDEgfSwKK3sgMC4xMzE4RSswMSwgMC4xMzQyRSswMSwgMC4xNDk0RSswMSB9LCB7IDAuMTkxMEUrMDEsIDAuMTY4MEUrMDEsIDAuMTQ3MEUrMDEgfSwKK3sgMC42MDgyRSswMCwgMC41MjcwRSswMCwgMC40MTczRSswMCB9LCB7IDAuMTI1NUUrMDEsIDAuMTQ3N0UrMDEsIDAuMTUwM0UrMDEgfSwKK3sgMC4xODA3RSswMSwgMC4xNzQyRSswMSwgMC42NTUzRSswMCB9LCB7IDAuMjAwMEUrMDEsIDAuMjA3MkUrMDEsIDAuMjA1MUUrMDEgfX07CisKKy8qKgorICogTFNQIHZlY3RvciBxdWFudGl6YXRpb24gdGFibGVzCisgKgorICogVElBL0lTLTEyNyB0YWJsZXMgOC0xIHRocm91Z2ggOC05CisgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IGV2cmNfbHNwcV9mdWxsX2NvZGVib29rMVs2NF1bMl0gPSB7Cit7MS40MjAxNjMwOEUtMiwgMS45Mzg4MTYxNkUtMn0sIHsyLjkxNjY3NTQzRS0yLCA2LjUxNzQ5MTQ5RS0yfSwKK3syLjA2NjkzMTUwRS0yLCA0Ljk3NTY0OTM0RS0yfSwgezMuOTQ3MTk4MDJFLTIsIDkuNTU4NTA5MjlFLTJ9LAorezIuMjcwMTI0NDhFLTIsIDMuOTY2MjU4MDlFLTJ9LCB7NS4zODc4OTUxOEUtMiwgNi4yODM0Nzc2OUUtMn0sCit7Mi45MDUyNTUxOEUtMiwgNS43MzQzNTc5OEUtMn0sIHs0LjQ4MjgwNjEwRS0yLCAxLjE1MzY0NjI2RS0xfSwKK3sxLjk0MTEwNjQ3RS0yLCAzLjQ2ODg5NjgyRS0yfSwgezQuMzc1MDI5NzNFLTIsIDYuNzUyMjg0NjJFLTJ9LAorezMuNTU0OTczMzhFLTIsIDQuOTQwODY3ODBFLTJ9LCB7Ni45OTIxOTg1M0UtMiwgOC42NzI3OTc2OEUtMn0sCit7Mi43Nzg4MDE1MUUtMiwgNC42NTc0ODQ5NkUtMn0sIHs1Ljc5MTExMDE3RS0yLCA2Ljc0NTQyNDg3RS0yfSwKK3s0Ljc0NjY0MzgzRS0yLCA1LjUwMjcxNDk2RS0yfSwgezcuODg4OTg5MTVFLTIsIDEuMjI0NDMwNDNFLTF9LAorezIuMjE3MTU4ODZFLTIsIDMuMDI2Mjg4MDBFLTJ9LCB7My4zOTEzNDQ4NUUtMiwgNy4xNzcwMzk5OEUtMn0sCit7My4xNzk4OTE0MUUtMiwgNC45ODk5NjExNkUtMn0sIHs2LjExNTU1OTg2RS0yLCA4LjczMzYxMjMwRS0yfSwKK3syLjY3NTA2NTAzRS0yLCAzLjk2NzM1ODU0RS0yfSwgezQuNDQxMDA5ODNFLTIsIDguMjY3MzEzMjRFLTJ9LAorezMuODkxNzI1NDdFLTIsIDUuNjU3ODg5MzJFLTJ9LCB7Ni4wNDgwMDYxOUUtMiwgMS4wNDUzNjk1MUUtMX0sCit7Mi42OTE1NjYyMEUtMiwgMy41NzE2ODg3NkUtMn0sIHs0LjExMTE3MTg5RS0yLCA3LjMzMzIyOTQ4RS0yfSwKK3s0LjEyNjYwNzI1RS0yLCA0Ljg1MTY1MjMxRS0yfSwgezcuMTgwNDk1NTZFLTIsIDEuMDYyMDIzNDlFLTF9LAorezMuMzgwMzc4NzFFLTIsIDQuMjQzMDAzOTVFLTJ9LCB7NS45MTgxODI0M0UtMiwgNy45NzQ2Nzk3N0UtMn0sCit7NC43MDEwNzkwNkUtMiwgNi4yODU2Mzc2MkUtMn0sIHs5LjQyMDExOTIzRS0yLCAxLjMwMDUzMTYzRS0xfSwKK3sxLjk0MjQ0MjczRS0yLCAyLjcyNzMyMzQwRS0yfSwgezMuNzA4MzE2NzZFLTIsIDYuNjQ4OTgxNTdFLTJ9LAorezIuODAxMzYzNTRFLTIsIDUuMTU5ODQ5MzBFLTJ9LCB7NS4zNDQ2MTAyOUUtMiwgOS4yNTkwNDIxNEUtMn0sCit7Mi41NDk1OTIwM0UtMiwgNC4zMjg0NDc5NUUtMn0sIHs1LjUxODYwNzQyRS0yLCA3LjM2MTgyMzMyRS0yfSwKK3szLjM5ODUxMTE5RS0yLCA2LjA1MzI5MTI2RS0yfSwgezYuMTgxODIxMjNFLTIsIDEuMzQ1ODEyNjhFLTF9LAorezIuMzU2NjkxNjZFLTIsIDMuNTUyNDIwMDZFLTJ9LCB7NS4xMDgwNDI0M0UtMiwgNi43OTU2MjUzOUUtMn0sCit7My44MzQ2NDk1NUUtMiwgNS4yMzQ2OTQxMUUtMn0sIHs3LjQ0Mjc1NzQ5RS0yLCA5LjY2MTA4MjkyRS0yfSwKK3szLjE4NTkxMTQ4RS0yLCA0LjYyMTIzMTE4RS0yfSwgezYuMTg5MDk4MjFFLTIsIDcuMzMyMzE3NTNFLTJ9LAorezQuNDE3MTg0MzdFLTIsIDUuNzkyNDA5MThFLTJ9LCB7Ny45MzU5NjIwOEUtMiwgMS40MTE3NzM3MUUtMX0sCit7Mi40NzQxMjI4N0UtMiwgMy4yMzYyOTM3OUUtMn0sIHszLjM2NTYzOTIyRS0yLCA4LjA0NjUwNjM1RS0yfSwKK3szLjM3OTQzNjk1RS0yLCA1LjQ0OTc3MTUxRS0yfSwgezYuNTM2NDg5NzNFLTIsIDkuNTI3NzU5MjVFLTJ9LAorezIuOTMzNjQxNTJFLTIsIDQuMjg0MTEwMjlFLTJ9LCB7NS4yNzg3MDQ2OUUtMiwgOC4xNjE1OTM5N0UtMn0sCit7NC4wMDcyNDg5NUUtMiwgNi4xODE0NDY4NEUtMn0sIHs2Ljc1ODQ4NTczRS0yLCAxLjE3MTk2MDc2RS0xfSwKK3szLjAzMDY0OTU3RS0yLCAzLjg2OTE0MDUyRS0yfSwgezQuODMxMDYyNjNFLTIsIDcuNDIzODMwMDNFLTJ9LAorezQuMzc1NDgyNzJFLTIsIDUuMjI4NDIyOTVFLTJ9LCB7OC4zMjMxMDAyMUUtMiwgMS4wOTg4MTk2N0UtMX0sCit7My43NTYwMDY0M0UtMiwgNC41MzIxNzIxNkUtMn0sIHs2LjYwMTEzMTcxRS0yLCA3Ljk3NTgwMTgzRS0yfSwKK3s1LjAzMjI1MDY2RS0yLCA1LjkwMTc2MzIyRS0yfSwgezguNzcxMzMzMTBFLTIsIDEuNjMxODc0NDRFLTF9fTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGV2cmNfbHNwcV9mdWxsX2NvZGVib29rMls2NF1bMl0gPSB7Cit7NS4yMTk1OTU1MUUtMiwgOC4zODQ0NTY0OUUtMn0sIHsxLjA1ODc0MDc2RS0xLCAxLjI4Njk0MTYyRS0xfSwKK3s1LjQ4MzIzODc3RS0yLCAxLjMzODQyODU2RS0xfSwgezEuMTc3Njg0NzRFLTEsIDEuOTQwMzcyNzRFLTF9LAorezUuMzYwODY1MjJFLTIsIDEuMTEzOTg3MzRFLTF9LCB7MS4xOTk4OTY5M0UtMSwgMS40NzQ3NDY5MUUtMX0sCit7OC4wMDM3MzU1NEUtMiwgMS40Mjk5OTcyNEUtMX0sIHsxLjY0MDg2NTk1RS0xLCAyLjA5ODIxODM1RS0xfSwKK3s1LjIxMDU5MjIzRS0yLCA5Ljk1MjI5NDA4RS0yfSwgezguNjc1Njc5NTZFLTIsIDEuODU5NjY1MDdFLTF9LAorezcuNzczNDExMjdFLTIsIDEuMzE1MDY4NDVFLTF9LCB7MS42MDU0NTUxM0UtMSwgMS44MTkzMDI4OUUtMX0sCit7Ny40MjI0MzY3N0UtMiwgMS4xMDQzNzEwM0UtMX0sIHsxLjE4NjM1MDg4RS0xLCAxLjc1MzA2NzUyRS0xfSwKK3s2LjYxNTU3NzY0RS0yLCAxLjY0NDQxOTI4RS0xfSwgezEuOTY4MTA4NTZFLTEsIDIuMTY2ODIwMDJFLTF9LAorezYuMDUzMTc4MzhFLTIsIDkuNDU0MDg1NjhFLTJ9LCB7MS4wNjI3MTM4NkUtMSwgMS40ODAxMzkzNEUtMX0sCit7NS44NzQ4NjU1MEUtMiwgMS40NzcyNDU4NEUtMX0sIHsxLjM0ODE2NDY4RS0xLCAyLjAxNTE3OTU0RS0xfSwKK3s2LjU5Njk4MzIyRS0yLCAxLjE2NDQ3Mzk3RS0xfSwgezEuMzIyOTcxNzNFLTEsIDEuNTMyNjcyNDlFLTF9LAorezkuMjY2NjA3NDZFLTIsIDEuNDY3MjU0OTFFLTF9LCB7MS43OTI4NTU0MUUtMSwgMi4xOTcwNTk1NEUtMX0sCit7Ny4wNjQ1ODQ2NEUtMiwgOS45OTkyNDQ2NkUtMn0sIHsxLjA2NTAwNDkxRS0xLCAxLjc5NDQzNDM0RS0xfSwKK3s4Ljc5MjQ5NzIyRS0yLCAxLjI1Mjg3Njk3RS0xfSwgezEuNTM2NDAxOTZFLTEsIDEuOTc4NTI3MTZFLTF9LAorezguODg0MzAxMDRFLTIsIDEuMTI0NjU2NTdFLTF9LCB7MS40ODI4NjcxNUUtMSwgMS42NzUxNzAyMUUtMX0sCit7OC4xNjU2ODEzNkUtMiwgMS42OTI3NDAxN0UtMX0sIHsyLjA3ODEwNTM2RS0xLCAyLjMxMDMzNTQ5RS0xfSwKK3s2LjE0OTI3OTcwRS0yLCA4LjM2MjYzMjI0RS0yfSwgezEuMTQ0NzMyNTNFLTEsIDEuMzY3Nzk5NzlFLTF9LAorezYuODcxMjk4NzBFLTIsIDEuMzgwOTkwNTlFLTF9LCB7MS4xMDUxMTQxNUUtMSwgMi4xNTM1Mjg3OEUtMX0sCit7NS41NTY1MjI2OEUtMiwgMS4yMjI0Mjc4NkUtMX0sIHsxLjIwNTU3NTkxRS0xLCAxLjYxMDcyNDQ4RS0xfSwKK3s4LjMyMjQ5NjcxRS0yLCAxLjU1NDc1NDgyRS0xfSwgezEuNjE2Mzg0ODNFLTEsIDIuMjgyNjg4NDdFLTF9LAorezYuMjkxNTIyODNFLTIsIDEuMDYyMjk1NjZFLTF9LCB7OC4yOTE4Njg4N0UtMiwgMi4wNjc3NDUxOEUtMX0sCit7OC44NDc1Njg5M0UtMiwgMS4zNTc5OTk1OUUtMX0sIHsxLjY5NzcyMjIzRS0xLCAxLjkzNzczOTQwRS0xfSwKK3s3Ljc3Mjk3ODQwRS0yLCAxLjIwMjg3MjMyRS0xfSwgezEuMzA2NDgwMTdFLTEsIDEuODQzMzE4MTlFLTF9LAorezYuOTE5Mzk1OTJFLTIsIDEuODQyMTgwMDRFLTF9LCB7Mi4wMzkwNDA3N0UtMSwgMi40OTcxNTE2NEUtMX0sCit7Ny4wNzY3MTcxN0UtMiwgOS4wMzE4NjEyOEUtMn0sIHsxLjA4NDcxNTU3RS0xLCAxLjYxOTY2NTE4RS0xfSwKK3s3LjE2ODg2MzcxRS0yLCAxLjUxMDkzMTcwRS0xfSwgezEuMzg3Nzk1MzZFLTEsIDIuMTg4MDE3ODJFLTF9LAorezYuNzU5MDcwNjFFLTIsIDEuMjY3NDAzMDdFLTF9LCB7MS4zMzQxMjM0NkUtMSwgMS42ODgzODg3NEUtMX0sCit7OS42MTgyMjU2OUUtMiwgMS41ODcyODcwNEUtMX0sIHsxLjg2NDg1NjMzRS0xLCAyLjM2NTYwOTI2RS0xfSwKK3s4LjIzNDQ3MTA4RS0yLCAxLjAyMTI2MDI1RS0xfSwgezEuMDAzMzY2NDFFLTEsIDEuOTQ5MTg0OThFLTF9LAorezkuOTU5ODE5OTFFLTIsIDEuMzY0MjUwOTNFLTF9LCB7MS44MjQ0ODQ2MkUtMSwgMi4wMzY1NTE5OEUtMX0sCit7OS43ODg5MDczMkUtMiwgMS4yMTE0NTQ3MkUtMX0sIHsxLjQ1NDUzMTQwRS0xLCAxLjgzNjA0NTI0RS0xfSwKK3s5LjU4Mzk1NDUxRS0yLCAxLjcyMTk0ODUzRS0xfSwgezIuMjMyOTU4NTNFLTEsIDIuNDY0MTg2MTBFLTF9fTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGV2cmNfbHNwcV9mdWxsX2NvZGVib29rM1s1MTJdWzNdID0geworezEuMzY0MjU3NzhFLTEsIDEuNjg2NTE4NDlFLTEsIDIuMDQ2ODgyMjFFLTF9LAorezEuODU3MTc2MjdFLTEsIDIuMjg3NTYxNjBFLTEsIDIuNTE5NTgwNDJFLTF9LAorezEuMjI3NjAxOTJFLTEsIDEuODU5NTA2OTZFLTEsIDIuNzk0NDY2OTFFLTF9LAorezEuOTY0Njg0NThFLTEsIDIuNjQ0ODQ0MzVFLTEsIDIuODkzMTg4ODlFLTF9LAorezEuMjU2NTM3NDRFLTEsIDEuNTA1MjkyNjVFLTEsIDIuNzYxNDQyOTZFLTF9LAorezEuOTYzMDE1NjVFLTEsIDIuNDE2OTk5OTRFLTEsIDIuODgyMzA2ODdFLTF9LAorezEuNDAwOTkzOTFFLTEsIDIuMjIzNjU1ODhFLTEsIDIuNzQ2NjY1NzhFLTF9LAorezIuNTk5NTIzMDdFLTEsIDIuNzUzOTQ5NDZFLTEsIDMuMTA5NzU5MzlFLTF9LAorezEuNTg0NTIxOThFLTEsIDEuODg1OTEwMDNFLTEsIDIuMDczMzkxOTdFLTF9LAorezEuOTU2MTYyMzBFLTEsIDIuMjEzNzk1MTlFLTEsIDIuODcwMjI5MThFLTF9LAorezEuNjk0MjQ1NzlFLTEsIDIuMDE2MTQ2NDhFLTEsIDIuNzU2NjkxODdFLTF9LAorezIuMTIzOTM3NDZFLTEsIDIuNjQyNTA2NjZFLTEsIDMuMTc5Njc1MDRFLTF9LAorezEuODI5NjUwODVFLTEsIDEuOTk1NDc1NTlFLTEsIDIuMjk1Mzg4NDNFLTF9LAorezIuMTUyMDA3MDdFLTEsIDIuNjI0MDk0MTlFLTEsIDIuODI0MzI3MDVFLTF9LAorezEuNDY0MDQ1NDlFLTEsIDIuMzY5NjY3MjlFLTEsIDIuOTAwNjcxMDZFLTF9LAorezIuNDUzMzg2MzRFLTEsIDMuMDMzNTgxMDhFLTEsIDMuNDIyNjAxNTJFLTF9LAorezEuMzc0Nzg5NjNFLTEsIDEuNTgyNzY1NThFLTEsIDIuMzkyMTcyMjJFLTF9LAorezIuMDE5OTkwMjRFLTEsIDIuMjAxMDI2MDhFLTEsIDIuNjk1NDY4OTZFLTF9LAorezEuMTgzNTAwMjlFLTEsIDIuMzAyMDY0MDBFLTEsIDIuODM1NTQ4MjJFLTF9LAorezIuMjU1MTkyNTVFLTEsIDIuNzIyNzIxNDBFLTEsIDMuMDYwNzI5ODBFLTF9LAorezEuMzU2NjE0MzhFLTEsIDEuOTE2MzM5NzBFLTEsIDIuNjU5MTIwMjZFLTF9LAorezEuOTU3MzMwODVFLTEsIDIuMzE5MjYxNzNFLTEsIDMuMTQzNzYwODZFLTF9LAorezEuNjc5OTg5ODRFLTEsIDIuMjc3MDYzMTNFLTEsIDIuNzY5NDc4MjZFLTF9LAorezIuNTAxNzA1NTlFLTEsIDMuMDE2MjcwNzBFLTEsIDMuMjEwODQyMzFFLTF9LAorezEuMzM0OTIzMDZFLTEsIDIuMDEyMjMxMDVFLTEsIDIuMzM4OTM5OTFFLTF9LAorezIuMDY0NDIxMzNFLTEsIDIuMzg3MDQxNzVFLTEsIDIuNzc1NjAxNDVFLTF9LAorezEuNzkwNDg3OTJFLTEsIDEuOTU3NzY1ODJFLTEsIDIuODA2NTY2MDZFLTF9LAorezIuMDYxOTM2NDFFLTEsIDIuNjQwNTU0MDFFLTEsIDMuMzMwOTg0NDFFLTF9LAorezEuNzUxODUyNzhFLTEsIDEuOTExNjYzNDFFLTEsIDIuNTc1NDAzMTVFLTF9LAorezIuMjgzOTg2MzZFLTEsIDIuNDUyOTY2NTdFLTEsIDMuMDg5ODA3OTNFLTF9LAorezEuODA4NTk4MTlFLTEsIDIuNDM1NzkwNjBFLTEsIDIuOTY2MzEwNjhFLTF9LAorezIuNzYxNTI5NjhFLTEsIDMuMDgyNTYwNjBFLTEsIDMuNDY4MjI1OTBFLTF9LAorezEuMzcxMTU3MzJFLTEsIDEuODAwNTc3NjRFLTEsIDIuMjA5NTM0NjVFLTF9LAorezEuODEzNzAwOTRFLTEsIDIuMjY3NzAxMDNFLTEsIDIuNzAzOTI2ODZFLTF9LAorezEuMjUyNDY1MTBFLTEsIDEuNzk2MDY5NDRFLTEsIDMuMTAzNzY0MzZFLTF9LAorezEuOTA3MDgzNTRFLTEsIDIuODc3MzQyNDBFLTEsIDMuMTM0NzYyMzVFLTF9LAorezEuMzA0ODYwODZFLTEsIDEuNjA0MzUyODlFLTEsIDMuMDAyNDM3MDZFLTF9LAorezEuOTczMTg2MjhFLTEsIDIuNTYzNzg1MDJFLTEsIDIuNzg0NzQzMDFFLTF9LAorezEuNTg1OTcwNjdFLTEsIDIuMzczODEzOTlFLTEsIDIuNjI5MTAzMzZFLTF9LAorezIuNjE4MjU5MTlFLTEsIDIuNzc3MTcyMDNFLTEsIDMuMzEzODIyNDVFLTF9LAorezEuNjQxNjA3NDNFLTEsIDEuODU4NDE1MzFFLTEsIDIuMzU2MTU4NDlFLTF9LAorezIuMDk0ODYxNDJFLTEsIDIuMjE0NTI4MDJFLTEsIDIuOTIxNTM4NjVFLTF9LAorezEuNjY4MDc4NDVFLTEsIDIuMTM2NDE3NjNFLTEsIDIuNzA2NzU5MjdFLTF9LAorezIuMjk4MzQyNzNFLTEsIDIuODgzNzQ2MzNFLTEsIDMuMDYyMzgzMjNFLTF9LAorezEuODIxNTQyNTNFLTEsIDIuMDA4MjI0NzNFLTEsIDIuNDAxNjkzNzZFLTF9LAorezIuMjQ5NDQ3MjZFLTEsIDIuNjk4MTM5MjVFLTEsIDIuOTE0MDEyMzdFLTF9LAorezEuNjM5NDA1NjRFLTEsIDIuNTAzNDExNDdFLTEsIDIuNzgzMDc3NjZFLTF9LAorezIuNTY3Mjc5OTNFLTEsIDIuOTUxMDM3NTlFLTEsIDMuNTMyOTcwODVFLTF9LAorezEuNDAyMTg4MzlFLTEsIDEuNzY2ODc2ODhFLTEsIDIuNDY3NzMyNzNFLTF9LAorezIuMTUyOTEzMDZFLTEsIDIuMjkyMTYwMDlFLTEsIDIuNjQyODM2MjdFLTF9LAorezEuMjEwMDI2NTlFLTEsIDIuMTgzMzM4NDBFLTEsIDMuMjIzNDEyOTNFLTF9LAorezIuNTQyNDMxOTVFLTEsIDIuNzM5ODYxOTFFLTEsIDIuOTYyNjI0NzNFLTF9LAorezEuNjAzODU0MTVFLTEsIDEuODM3NjI5MDhFLTEsIDIuODE1OTg3MTdFLTF9LAorezEuODc4MzIxNjJFLTEsIDIuMzc0MjAzNTBFLTEsIDMuMjk3Nzc1MDlFLTF9LAorezEuNzc3ODgzNjJFLTEsIDIuMjY3MDM0OTVFLTEsIDMuMDIzMjI1MzdFLTF9LAorezIuNzUxMDgyMThFLTEsIDIuOTM3MzA1ODdFLTEsIDMuMTIzNzM3ODdFLTF9LAorezEuNzAxMTY0MTBFLTEsIDEuODUyMzIxMDNFLTEsIDIuNDYxMjUwMjhFLTF9LAorezIuMjE3NTQ3NzRFLTEsIDIuMzk5MTIyNDJFLTEsIDIuODY4OTE5MDdFLTF9LAorezEuOTUwODM3MjJFLTEsIDIuMDgzMzc4NzNFLTEsIDIuODgzNDk3MThFLTF9LAorezIuMzc1MzY1MzVFLTEsIDIuNzUwMDQ0NzZFLTEsIDMuMzk3ODYwMjNFLTF9LAorezEuODgzNjkzMTlFLTEsIDIuMDQzNzE4NDBFLTEsIDIuNTczNzUwMzJFLTF9LAorezIuNDcyNTAxNTVFLTEsIDIuNjA1NTE4NDBFLTEsIDMuMDIxMzc1MjRFLTF9LAorezEuNjY5NDQxOTFFLTEsIDIuNDY5MTIzNjBFLTEsIDMuMTg4OTQ0MTZFLTF9LAorezIuNzgxMTg2MTBFLTEsIDMuMTMwMTExNDBFLTEsIDMuNjUzMjkyOTVFLTF9LAorezEuNDUyMTM1MjlFLTEsIDEuNjMwNTE0NTZFLTEsIDIuMjQ5MTI2MTRFLTF9LAorezIuMDU2OTI1MTVFLTEsIDIuMjA4MzE0ODRFLTEsIDIuNTI4MTc4MTBFLTF9LAorezEuMjExMjU2NjFFLTEsIDEuOTYzNzQxMThFLTEsIDMuMDAxMjI3MDhFLTF9LAorezIuMTU1NjY3OTlFLTEsIDIuNjU2NTczMzZFLTEsIDIuOTkyMDI4ODlFLTF9LAorezEuMDkxMzQyMTJFLTEsIDEuNzg0NzIxMDJFLTEsIDIuODgzMjMxOTRFLTF9LAorezIuMDM1MDg1NDFFLTEsIDIuNDAzNDc5MjJFLTEsIDIuOTYzMDk3MzlFLTF9LAorezEuNTMxMDE3ODdFLTEsIDIuMjU0MTUzMTlFLTEsIDIuODQ4NDM3MTNFLTF9LAorezIuNTAyMzM0NDJFLTEsIDIuNzc3MzY5MzJFLTEsIDMuMjQ4NDA2OTVFLTF9LAorezEuNjYzMDg5MjVFLTEsIDEuOTQxNzMzOTZFLTEsIDIuMTE2MzUzODFFLTF9LAorezIuMDEyODk0NjBFLTEsIDIuMjYwNjIxNzlFLTEsIDIuOTMyNDY0NzhFLTF9LAorezEuNDk1MTg3NzNFLTEsIDIuMTQyMDE3MTlFLTEsIDIuODM4OTQ3NDdFLTF9LAorezIuMjE4MzYxMzVFLTEsIDIuODUyMzE1MDFFLTEsIDMuMjAwODI2MzVFLTF9LAorezEuODk1NzMyMTNFLTEsIDIuMDY1Nzc2MjlFLTEsIDIuMzAzMzIzNDVFLTF9LAorezIuMzEyNDc2NDlFLTEsIDIuNDY4NjQyNTlFLTEsIDIuODk4NDY1NjlFLTF9LAorezEuMzkxMTY5MjhFLTEsIDIuNTkxODk5MzRFLTEsIDIuOTgwMTk1NThFLTF9LAorezIuNDQ1MTI1NzNFLTEsIDIuODI2NzEzNjJFLTEsIDMuNjEyNTgyOThFLTF9LAorezEuMjI1MzA5NjdFLTEsIDEuNjg1MTQ3ODhFLTEsIDIuNzA4NzkyOThFLTF9LAorezIuMDQzNzI4MzhFLTEsIDIuMzAzOTgzNTdFLTEsIDIuNzE3OTI5MThFLTF9LAorezEuNDI2NDM5NDNFLTEsIDIuMjI0MDU1ODNFLTEsIDIuOTIwNTcxODZFLTF9LAorezIuNDI2NDM2NjlFLTEsIDIuNzc0MjkzNzJFLTEsIDIuOTcxMzU1MDJFLTF9LAorezEuNTIwNDg2MDNFLTEsIDEuOTY5MjEwODBFLTEsIDIuNjEwMTMyNDBFLTF9LAorezIuMTc4NzUwMTlFLTEsIDIuNDU4NDAzNzFFLTEsIDMuMDgxMzg1NzlFLTF9LAorezEuOTAxMDkyNjhFLTEsIDIuMzEwOTkxMjlFLTEsIDIuODAxNzgxNTlFLTF9LAorezIuNTQzMTQxODRFLTEsIDIuOTQwNzk4MTBFLTEsIDMuMzk2NDkxNzFFLTF9LAorezEuNTY2OTg1OTlFLTEsIDIuMDg1OTc0NTFFLTEsIDIuMjgwMTA3NzRFLTF9LAorezIuMjUwODg3MzBFLTEsIDIuNTAwMTQ0ODRFLTEsIDIuNzYyNTAxNTRFLTF9LAorezEuNzgyMTkwMzVFLTEsIDEuOTgyMjgyNDBFLTEsIDMuMDQxOTg4OTFFLTF9LAorezIuMDg1NjcyMTdFLTEsIDIuOTIzOTUzODNFLTEsIDMuNDY3ODY4ODZFLTF9LAorezEuNzEwNTIxMTNFLTEsIDIuMDM0Mzg3NTlFLTEsIDIuNjI2NDQzMjFFLTF9LAorezIuMzAyNzU0NjdFLTEsIDIuNTg4MTc1MjRFLTEsIDMuMTE5ODY1MzZFLTF9LAorezEuODUzMzM1NjVFLTEsIDIuNDU3NjAyMDJFLTEsIDMuMTA1NTM5OThFLTF9LAorezIuODk0MTM4NjlFLTEsIDMuMTEwOTU2MjVFLTEsIDMuNDY0NzYxNjdFLTF9LAorezEuNTAzMzI0MDZFLTEsIDEuNjc1MzgyMjZFLTEsIDIuNDAxODI4NDdFLTF9LAorezEuNzk5NzE2NTBFLTEsIDIuMzcxNjg2MTBFLTEsIDIuNjA4OTk2OTNFLTF9LAorezEuNDk4NjYxNzlFLTEsIDEuOTc4OTAwNzNFLTEsIDMuMDc5MTY1NTJFLTF9LAorezIuMTA3OTk2NDlFLTEsIDIuODgxODAwODNFLTEsIDMuMjk3NDcyMzBFLTF9LAorezEuMzE3MTExNDBFLTEsIDEuNjU5MDY0NTlFLTEsIDMuMjI4OTgwMDBFLTF9LAorezIuMTQ4MzIwMjNFLTEsIDIuNTI4MjIxMzFFLTEsIDIuOTc1NDcwNzJFLTF9LAorezEuODM3NjA0MTlFLTEsIDIuMzc1MjM2MTVFLTEsIDIuNzQ2MTAwMTNFLTF9LAorezIuNTU1NzUxODBFLTEsIDIuNzU0MzkyMzNFLTEsIDMuNDYwMjE4NjFFLTF9LAorezEuODI2NjIyMDRFLTEsIDEuOTk0NzA5MDdFLTEsIDIuMTYwNTE2NTNFLTF9LAorezIuMDkyNDAzMzJFLTEsIDIuMjI0MDY3MTVFLTEsIDMuMDIzODI4NTdFLTF9LAorezEuODQwODgyNDVFLTEsIDIuMTEzMjc3OTFFLTEsIDIuODI1MzgwODZFLTF9LAorezIuNDExNzEwNzdFLTEsIDIuOTcwMzYwMjJFLTEsIDMuMTU5NzkyNzJFLTF9LAorezEuOTY4MDQ2NThFLTEsIDIuMTE4MTU4OTRFLTEsIDIuNDE2NDc2NzZFLTF9LAorezIuNDI3NjE5ODRFLTEsIDIuNTg1ODY1NTZFLTEsIDIuOTMyMDQzOTdFLTF9LAorezEuNTg5MDU0NjFFLTEsIDIuNjUwNzcwMjVFLTEsIDIuODk4ODEzMTlFLTF9LAorezIuNTgwNjA1NzVFLTEsIDMuMTg5MDMxNzhFLTEsIDMuNDc4NDY4MzZFLTF9LAorezEuNDg3NjYzODRFLTEsIDEuNjY4NTM5MzVFLTEsIDIuNjY4Mjc0MzRFLTF9LAorezIuMTU5NDIyNDlFLTEsIDIuMjk5MzgyOThFLTEsIDIuNzYwNDE1OTdFLTF9LAorezEuMzg0MTA0OTRFLTEsIDIuMzkyODM0NDJFLTEsIDMuMjc5NzIzODJFLTF9LAorezIuNDM3NjUyODBFLTEsIDIuODg0MDg0ODhFLTEsIDMuMDYwNDg3MjFFLTF9LAorezEuNzAxNTcxMjBFLTEsIDEuODk5ODYyODlFLTEsIDIuODEyMTkxNTVFLTF9LAorezIuMTkxMTcwMzFFLTEsIDIuNTgwMDUyOTFFLTEsIDMuMjY1NzE5NzFFLTF9LAorezEuOTIxNjM1NzJFLTEsIDIuMjM2MTQxODZFLTEsIDIuOTg2ODMwNzdFLTF9LAorezIuNzM1NDU0NDRFLTEsIDMuMTIwNzgwODlFLTEsIDMuMzA3NjY1ODhFLTF9LAorezEuNjI0NTIwODdFLTEsIDIuMDQ5MzA5MDJFLTEsIDIuNTMzMzc3MTFFLTF9LAorezIuMjM4NTUzMDJFLTEsIDIuMzc2NzEwNzdFLTEsIDMuMDMyMDIwMDNFLTF9LAorezEuOTM5NTUyODdFLTEsIDIuMTIzMzU1NTdFLTEsIDMuMDc1NjY4NTFFLTF9LAorezIuMjk5MTI2ODNFLTEsIDIuOTc1ODEwNDdFLTEsIDMuMzc0OTkyMzFFLTF9LAorezEuODkzMzUzOTFFLTEsIDIuMDQxNDgxNDRFLTEsIDIuNzg2MDk3ODJFLTF9LAorezIuNDIzMDM1NjVFLTEsIDIuNzMxNjMxMTBFLTEsIDMuMTUzNjE2NDlFLTF9LAorezEuNTUwMDk2NzJFLTEsIDIuODgwOTUxNDZFLTEsIDMuMzU5OTY0MTlFLTF9LAorezIuNzM3MTYxNTJFLTEsIDMuMzEyMTU0NzFFLTEsIDMuNjI1MzkwODNFLTF9LAorezEuNTIzODkzNjJFLTEsIDEuNzI2MTkxMzRFLTEsIDEuOTA1ODU2NzNFLTF9LAorezEuOTY5ODgyNzBFLTEsIDIuMjYzMDk3NDdFLTEsIDIuNDYxOTc0OTJFLTF9LAorezEuMjA1NTUxNDhFLTEsIDIuMDYzNjk3NThFLTEsIDIuODExOTk3ODNFLTF9LAorezEuOTM3MDk0MThFLTEsIDIuNzE5MDA1MDVFLTEsIDMuMDEzMzI5MjFFLTF9LAorezEuMzY3MDExNTJFLTEsIDEuNTQwOTMxNDZFLTEsIDIuODIyNTgzNjJFLTF9LAorezEuOTcyOTkxNjhFLTEsIDIuNTM2NTYyOThFLTEsIDIuOTAzMTUwNjJFLTF9LAorezEuNDM0NjM3NzZFLTEsIDIuNDM4NzI5MTFFLTEsIDIuNzU1MzM3MDZFLTF9LAorezIuNTg0NzcyNzFFLTEsIDIuNzMyNzk4NzZFLTEsIDMuMjExMTkxMDBFLTF9LAorezEuNTQ0MDYxNzVFLTEsIDEuOTM3OTM1MzVFLTEsIDIuMTU4ODQxNDlFLTF9LAorezIuMDU5Nzk0NTJFLTEsIDIuMjQyNzcwMjBFLTEsIDIuODU3MzIzNTlFLTF9LAorezEuNzQ1MzUzMTlFLTEsIDIuMDg0ODIzNTVFLTEsIDIuNzk2Njg1NDBFLTF9LAorezIuMTg4NDQ1NzhFLTEsIDIuNzI0ODYyOTlFLTEsIDMuMjcwOTU1OThFLTF9LAorezEuNzc2MDk3MjdFLTEsIDIuMTI5OTAxOTVFLTEsIDIuMzkxMTk2NDlFLTF9LAorezIuMjkxNjM3NTFFLTEsIDIuNTkxNjU5MTNFLTEsIDIuODM1MTQ2NDlFLTF9LAorezEuNTczNTMxNDhFLTEsIDIuMzk5NjEyOTZFLTEsIDMuMDQyNjMxNDVFLTF9LAorezIuNDU2MTM4MjhFLTEsIDMuMTY4MjQ1MjZFLTEsIDMuNDI5MDkzNjZFLTF9LAorezEuNDI5NTMyMzJFLTEsIDEuNjE5MDUzNDhFLTEsIDIuNTM3MTAyNDBFLTF9LAorezIuMTAxOTI4MTRFLTEsIDIuMjI4NDc3MDBFLTEsIDIuNzExMDM3NzBFLTF9LAorezEuMjY4NDM5NDRFLTEsIDIuMTY3MDkwNDhFLTEsIDIuOTc3MzQ2NDhFLTF9LAorezIuMzEwMDAxNDBFLTEsIDIuODAxMDkxMzdFLTEsIDIuOTk3MDc0NDNFLTF9LAorezEuNTI5ODA0NjJFLTEsIDEuOTM5OTY4NzZFLTEsIDIuNzI4OTU2NjRFLTF9LAorezIuMTI4NjA3MThFLTEsIDIuNDE1NDUzNDlFLTEsIDMuMTY1MTg3NTRFLTF9LAorezEuNzExNTQ2OTNFLTEsIDIuMjI0Njk2ODdFLTEsIDIuOTM3ODY0OTZFLTF9LAorezIuNTE5ODgyMzJFLTEsIDMuMDQyNTQ5NzlFLTEsIDMuMzEyNjk5NTBFLTF9LAorezEuMzMxODg5MThFLTEsIDIuMDc5MjQ5OTJFLTEsIDIuNTUzNjIwOTNFLTF9LAorezIuMTIwNDQ5MTBFLTEsIDIuNDIxODk2NDZFLTEsIDIuODg5MDM3NDNFLTF9LAorezEuODQ2MTI0NjhFLTEsIDIuMDExNDM2MjJFLTEsIDIuODYzNjA3NzBFLTF9LAorezIuMTgyODY3MDhFLTEsIDIuNzY3NTI0NDJFLTEsIDMuNDQ1ODE1MTVFLTF9LAorezEuODM1NjIxNzRFLTEsIDEuOTk0Nzg1MDdFLTEsIDIuNjIxNTY1NzZFLTF9LAorezIuMzMxMzA1MzBFLTEsIDIuNDk1OTY5MDlFLTEsIDMuMTU4NDI4MzdFLTF9LAorezEuODk4OTg5ODNFLTEsIDIuNDY4NzQ4NjlFLTEsIDIuOTcxMzI0NjJFLTF9LAorezIuNzUwMjI0NDdFLTEsIDMuMjI0OTAzMDVFLTEsIDMuNDY5Nzc2ODFFLTF9LAorezEuNDIzMDUzMjlFLTEsIDEuOTI2ODkxODBFLTEsIDIuMTYxNTU4NTdFLTF9LAorezEuOTU2NzYxNjNFLTEsIDIuMjIyNjg2NDFFLTEsIDIuNzY1ODczOTdFLTF9LAorezEuMzMyNDE0OTBFLTEsIDEuOTc3OTE3ODVFLTEsIDMuMjI4OTc5NDFFLTF9LAorezEuODQ4NjUxMzJFLTEsIDIuOTcxMDYxNzdFLTEsIDMuMjYxMDUxNDhFLTF9LAorezEuNTAyMDM2NjBFLTEsIDEuNzY3ODEyNjdFLTEsIDIuOTE1MzYxODJFLTF9LAorezIuMDMxNDQ0NDZFLTEsIDIuNTk2MTYxNjZFLTEsIDIuOTkxNTYwNDBFLTF9LAorezEuNjU0ODg5NzNFLTEsIDIuMzgzNDIwNDdFLTEsIDIuODc0OTM5MTRFLTF9LAorezIuNzEwNzEyNTVFLTEsIDIuODk1NDQ0OTNFLTEsIDMuMTk1MjEwNDBFLTF9LAorezEuNjg1OTgzNjlFLTEsIDEuOTg4MjU1NjhFLTEsIDIuMzAzNDc2MDRFLTF9LAorezIuMTM4MTE2NTFFLTEsIDIuMzQ0NzE3NjhFLTEsIDIuOTA5NTk2MjZFLTF9LAorezEuNzQ2MDU0NDRFLTEsIDIuMTcyNTYwMTBFLTEsIDIuODU2ODgwNzJFLTF9LAorezIuMjg1MDM0ODFFLTEsIDIuOTYxOTAyOTJFLTEsIDMuMTY1MzQ2NjhFLTF9LAorezEuODcxNzI2MDdFLTEsIDIuMjA1NDc0MzhFLTEsIDIuMzk2ODg3MjRFLTF9LAorezIuMjg4ODQ3NzFFLTEsIDIuNjM1ODMxNTNFLTEsIDMuMDEzMjk0NjRFLTF9LAorezEuNzc4OTcwNTFFLTEsIDIuNTgxMzE0NzRFLTEsIDIuODE0ODc2NzRFLTF9LAorezIuNTk1MTM2MTdFLTEsIDMuMDcyMDQzOTZFLTEsIDMuNDg3OTM1OTZFLTF9LAorezEuNDUyMjQ0MzdFLTEsIDEuNzg3MTU5NzRFLTEsIDIuNTkxODY5ODNFLTF9LAorezIuMTkwNjIzMTNFLTEsIDIuMzgyMjM1MjNFLTEsIDIuNjA0NjE1MzlFLTF9LAorezEuNDM2NTA4NzRFLTEsIDIuMDk3NjA3ODVFLTEsIDMuMTU4MzAyMDFFLTF9LAorezIuNTAxMjc0NjVFLTEsIDIuNzkxODIzNDVFLTEsIDMuMDUxNTM1NzlFLTF9LAorezEuNDg5ODY0NDRFLTEsIDIuMDEyMjY3NzFFLTEsIDIuODI1NDM2ODlFLTF9LAorezIuMDgzODc3NzdFLTEsIDIuMzU2MDM4OTlFLTEsIDMuNDUzNjM4ODVFLTF9LAorezEuODU4MzAzNDBFLTEsIDIuMjE2MDcyOThFLTEsIDMuMTA3NzM2NDFFLTF9LAorezIuODA5MDQ3MTBFLTEsIDIuOTU0Njk3OTFFLTEsIDMuMjU0OTk0NDVFLTF9LAorezEuNzI5NjczMDBFLTEsIDEuOTcwNzgxMDlFLTEsIDIuNDU4MDExMDZFLTF9LAorezIuMTk0OTU2OTlFLTEsIDIuNDQ3NjcxMDBFLTEsIDIuOTM1ODc3NzRFLTF9LAorezEuODM5MDk1ODBFLTEsIDIuMTUwMDQyOTVFLTEsIDMuMDAzMzQ1NDNFLTF9LAorezIuNDUzMzg2MzRFLTEsIDIuNjg1OTUyNDhFLTEsIDMuNDgzMzAzNDlFLTF9LAorezEuOTI5NTczODZFLTEsIDIuMDY2MjUwNzRFLTEsIDIuNjczMzYzOThFLTF9LAorezIuNTQ4NDU1NjBFLTEsIDIuNjg2NDIyNzdFLTEsIDMuMDM1NDc4ODlFLTF9LAorezEuNzY4NTMxMDVFLTEsIDIuNTkzMzA5NThFLTEsIDMuMTYyMDA3NjNFLTF9LAorezIuOTA5MjkxMzlFLTEsIDMuMTU2MzQ3NTdFLTEsIDMuNjg3MjM1NDFFLTF9LAorezEuNTcxMTY5OTRFLTEsIDEuNzM1NTI5MDFFLTEsIDIuMjg3MzY1MjBFLTF9LAorezIuMTI1MDkyNjBFLTEsIDIuMzA1MDEyMDVFLTEsIDIuNTIyMTc5NzhFLTF9LAorezEuNDI1MjE4NDNFLTEsIDIuMDE5Nzk5MzVFLTEsIDIuOTMwMTIyMzJFLTF9LAorezIuMTQ5MTk2NzFFLTEsIDIuNzgwNjUwNTZFLTEsIDMuMTQxNzYwNTNFLTF9LAorezEuMzU5NDcyNzJFLTEsIDEuODEwNTU5MDNFLTEsIDIuNzU0NzU0MTNFLTF9LAorezEuOTg0MTY2OTVFLTEsIDIuNDE2NzM3OTdFLTEsIDMuMDUxNzM0MjdFLTF9LAorezEuNTk1MTczMzNFLTEsIDIuMzE1ODAxMDhFLTEsIDIuOTU0MTI0NTFFLTF9LAorezIuNTgyMDM2MjZFLTEsIDIuODczNDgxMjFFLTEsIDMuMjAzNTE5ODhFLTF9LAorezEuNzQ4NDA2NzRFLTEsIDEuOTI4ODMyNTNFLTEsIDIuMTEyNTAwMDdFLTF9LAorezIuMDIxNjg1MDlFLTEsIDIuMjcwMjU2ODhFLTEsIDMuMDQ4ODQwNDZFLTF9LAorezEuNjk1MzIxMDVFLTEsIDIuMTE4MjYyMzVFLTEsIDIuOTczNTUzODRFLTF9LAorezIuMzAwMzM3NDBFLTEsIDIuOTE1MDQzNTNFLTEsIDMuMjY1ODk0MzVFLTF9LAorezEuOTUwNDYxMTJFLTEsIDIuMTE3MDkxNzJFLTEsIDIuMjc3MDU3NDdFLTF9LAorezIuMzc5MjY4ODVFLTEsIDIuNTI0MTE2MzRFLTEsIDIuOTc3NTIxNzJFLTF9LAorezEuNTM3NjI5MjJFLTEsIDIuNDY1NDE1NjBFLTEsIDMuMTQ3Njg5NDBFLTF9LAorezIuMzYwNzU3MTRFLTEsIDMuMDM1Njg5MjlFLTEsIDMuNzA2MjQ0NTNFLTF9LAorezEuMzg2NjAzMjdFLTEsIDEuNjc5NDk5NzVFLTEsIDIuNzM1MTUyNTRFLTF9LAorezIuMTM4MDYxNjdFLTEsIDIuMjcyNjcyMDZFLTEsIDIuODYyNzYyNTFFLTF9LAorezEuMjUwODA2MzBFLTEsIDIuNDQwOTgzOTVFLTEsIDMuMDI1NDg3OTZFLTF9LAorezIuMzU3MTQ4NjhFLTEsIDIuODEyMDg4NDNFLTEsIDMuMDg5MDM3MjRFLTF9LAorezEuNTE2OTEzOTJFLTEsIDIuMTA4Nzc3NDZFLTEsIDIuNjM4MTI5ODlFLTF9LAorezIuMjA3MzA0MzlFLTEsIDIuNTI3Nzc5MDRFLTEsIDMuMTY0MTM3MzBFLTF9LAorezEuODQ5MjQ3MzdFLTEsIDIuMzk0MjQ3NjVFLTEsIDIuODUxMjA4MTVFLTF9LAorezIuNTk1NDg1NDVFLTEsIDMuMDk4MDk4OTNFLTEsIDMuMjY0MjM3MzRFLTF9LAorezEuNjI5MzA3NDJFLTEsIDIuMTk5MDA4NzZFLTEsIDIuMzYxNDg2MjZFLTF9LAorezIuMzQxOTQyMzRFLTEsIDIuNDk5NDQzMjlFLTEsIDIuNzc1NDkwNThFLTF9LAorezEuNzA4NzAyMDBFLTEsIDEuOTgyOTE2MDBFLTEsIDMuMjE0MTI1OTNFLTF9LAorezIuMzE1NjY4NjFFLTEsIDIuNzUwMTUwODZFLTEsIDMuNjk3MTAzNTZFLTF9LAorezEuODAwMDI0MDZFLTEsIDIuMDY3MDEwNDBFLTEsIDIuNzEyMDQ5MTlFLTF9LAorezIuMzgwNzUyNzFFLTEsIDIuNTQwMDYyMzdFLTEsIDMuMjM4Mjc1OTVFLTF9LAorezEuOTkxNDgyNTNFLTEsIDIuNTQyNzM5MjFFLTEsIDMuMDc0Nzk3MDlFLTF9LAorezIuODc0Mjg2MTdFLTEsIDMuMjUwNDUwNzlFLTEsIDMuNDg2MzQ1NzFFLTF9LAorezEuNDUyODUwMjVFLTEsIDEuOTEzNTkxNjJFLTEsIDIuNDk2OTEzOTdFLTF9LAorezEuOTQ2NTkzMDhFLTEsIDIuNDA4MjEyNDJFLTEsIDIuNzczMDI2NTNFLTF9LAorezEuNTMxNTA5OTFFLTEsIDEuOTQzNzU2NjRFLTEsIDMuMjc1NTA0NDFFLTF9LAorezIuMDQwODU4NDJFLTEsIDIuOTg1OTU2OTdFLTEsIDMuMjE0ODAwNjZFLTF9LAorezEuNTYwMDk2ODlFLTEsIDEuODEwMTI3MjBFLTEsIDMuMDA5MzE2NjJFLTF9LAorezIuMTA5NjI0MzBFLTEsIDIuNTU3NzAyOTZFLTEsIDMuMDgwODYxMjdFLTF9LAorezEuODU0NDQwNzJFLTEsIDIuNDkwMjEzMjJFLTEsIDIuNzQwMjk4MjFFLTF9LAorezIuNzQ0OTM0NTZFLTEsIDIuODk0NDE5NzNFLTEsIDMuMzg3OTQ5MTdFLTF9LAorezEuNzY5NDE4ODdFLTEsIDEuOTQ0NzY5MzJFLTEsIDIuMjIwNzcyNjVFLTF9LAorezIuMTYzNzc1MTJFLTEsIDIuMzA3MzU3NzlFLTEsIDMuMDM2ODkyNzFFLTF9LAorezEuODk2ODM0NTJFLTEsIDIuMTQ2NjA3NjRFLTEsIDIuODg0NDUzODNFLTF9LAorezIuNDA4MjczMzdFLTEsIDIuOTgxNDE3NDhFLTEsIDMuMjczNzg0MjJFLTF9LAorezIuMDE3ODc4NDRFLTEsIDIuMTk0NDE3NzJFLTEsIDIuMzkzMjc0NDZFLTF9LAorezIuNDg4MTI1MTJFLTEsIDIuNjU4NjU4OTJFLTEsIDIuOTMzODIzNzZFLTF9LAorezEuODIwMjc4MzJFLTEsIDIuNjgyNzkwNDZFLTEsIDIuOTM5OTE0MTdFLTF9LAorezIuNTY0OTg2MzVFLTEsIDMuMTk5ODQ0NjZFLTEsIDMuNjI2NjMyMzlFLTF9LAorezEuNTg3OTkyNzZFLTEsIDEuNzU0MzM2NjZFLTEsIDIuNjczODk4NjRFLTF9LAorezIuMjQyNTkzMDJFLTEsIDIuMzY2NjgyNTlFLTEsIDIuNzc2MzkxMjFFLTF9LAorezEuNDkyMDM0MDVFLTEsIDIuMjY1ODUzMjlFLTEsIDMuNDUyNTU1ODRFLTF9LAorezIuNTA2NTU3NzBFLTEsIDIuOTIyNjQ4NDlFLTEsIDMuMTM1NzQyODRFLTF9LAorezEuNTgwOTYyOTlFLTEsIDIuMDIxOTMyMDFFLTEsIDIuOTg3MTE2ODdFLTF9LAorezIuMjg4MjA5MDVFLTEsIDIuNDg1NTczNDRFLTEsIDMuNDQ3MjY0NzNFLTF9LAorezEuODc5NzIwNTRFLTEsIDIuMzQxMDk0MzJFLTEsIDMuMDQyMzU2MDdFLTF9LAorezIuODU2NTcxMDhFLTEsIDMuMTQ4NzgxMzZFLTEsIDMuMzY5MzE0OTdFLTF9LAorezEuNjI2ODAwMTVFLTEsIDIuMTc4MjAwNDhFLTEsIDIuNTc0MzY3ODJFLTF9LAorezIuMjQwNDk3OTJFLTEsIDIuNDY3Mzk4MjBFLTEsIDMuMDA3OTU4ODNFLTF9LAorezIuMDEzNTQ1NDhFLTEsIDIuMTgyODY2NjNFLTEsIDMuMTMwMzYyOTNFLTF9LAorezIuMzgwMjg1MTFFLTEsIDIuOTgxMDM0ODJFLTEsIDMuNTM1MDM3OTNFLTF9LAorezEuOTg4Mjk5OTRFLTEsIDIuMTI4NzcxMjVFLTEsIDIuNzI5ODA4MzlFLTF9LAorezIuNTA2MTY0OTFFLTEsIDIuNjc2NTk5OTJFLTEsIDMuMjA2MTE4NjRFLTF9LAorezEuNzA5MDE4MjBFLTEsIDIuNjkzMzAzNTNFLTEsIDMuMzQ0MjgyMjFFLTF9LAorezMuMDQ5ODg4NjFFLTEsIDMuMzYxOTY2OTFFLTEsIDMuNjUyMzUzNThFLTF9LAorezEuNDc2MjQwMzFFLTEsIDEuODEyNzI4MDVFLTEsIDIuMDQ3MDc5MjFFLTF9LAorezEuOTM3NTEzNTBFLTEsIDIuMjA5NzM5NjlFLTEsIDIuNjE3NzUxNjZFLTF9LAorezEuMzIwODk4MDlFLTEsIDEuOTQ4NTE2MDdFLTEsIDIuODM1NDc2MTBFLTF9LAorezIuMDc3Mzk0MjhFLTEsIDIuNzA1OTY4MzJFLTEsIDIuOTIyNjQ3ODlFLTF9LAorezEuMjc3MzM0MjRFLTEsIDEuNjY4OTYwMTVFLTEsIDIuODM4OTEzNTBFLTF9LAorezIuMDUzMDk0MDZFLTEsIDIuNDc4MDc1MzNFLTEsIDIuODM2MzI3ODVFLTF9LAorezEuNTQyMTE4OTRFLTEsIDIuMjUwMTQwOTFFLTEsIDIuNzAwODIwMjdFLTF9LAorezIuNjc1NzQxMzFFLTEsIDIuODQ0MjY4OThFLTEsIDMuMDkzMzQ3ODVFLTF9LAorezEuNjg4NDY5MjBFLTEsIDEuODcwMDQ1MzZFLTEsIDIuMDI0MzMxNjlFLTF9LAorezIuMDI0NDExMTFFLTEsIDIuMTY3MzMwNjhFLTEsIDIuOTMwNzkyMjdFLTF9LAorezEuNjM2MjEyNjJFLTEsIDIuMTU2MTY0NjVFLTEsIDIuODI3OTI4OTZFLTF9LAorezIuMjU1MDkzMDFFLTEsIDIuNjYyODMwMDVFLTEsIDMuMTc4ODY1NjFFLTF9LAorezEuODkxMTAyOTRFLTEsIDIuMDU2MDk0NDFFLTEsIDIuMjIxMTM1ODBFLTF9LAorezIuMjEyNDAxNzhFLTEsIDIuNjAyODg4NjRFLTEsIDIuOTI1NDEwNTdFLTF9LAorezEuNTU1NjMzNjlFLTEsIDIuNDY4NTA4MThFLTEsIDIuODk2NDg4MDFFLTF9LAorezIuNDg0MDYxNTdFLTEsIDMuMDUyOTE4NjFFLTEsIDMuNTUzMTY2NjlFLTF9LAorezEuMjcxMjIxNDlFLTEsIDEuNTgwNTM3MjZFLTEsIDIuNTQxNjQzNjhFLTF9LAorezIuMDQ5OTg4MzZFLTEsIDIuMTk0NzY4NDlFLTEsIDIuNzgzNDIwMzhFLTF9LAorezEuMzMzMDIzMTZFLTEsIDIuMjk2MTQwMTlFLTEsIDIuODY5NDcxNjFFLTF9LAorezIuMzY3NzcwNTJFLTEsIDIuNjc5MTgxOTlFLTEsIDMuMDgyMzA5MDdFLTF9LAorezEuNDA4NTM1NjlFLTEsIDIuMDM0MTQ2NzlFLTEsIDIuNzMyNTcxMDdFLTF9LAorezIuMDc2ODQyNjRFLTEsIDIuMzQ1MjAwMThFLTEsIDMuMjQ1ODMyNjJFLTF9LAorezEuNzcxODE2NDZFLTEsIDIuMjk1OTUzOTNFLTEsIDIuODM1MzkxNDZFLTF9LAorezIuNjEzNzgzNDhFLTEsIDMuMDExNjAxODdFLTEsIDMuMjE3MDcxMDBFLTF9LAorezEuNDg1OTU3MzVFLTEsIDIuMDc3NzIwMTdFLTEsIDIuNDY5NDYxMjZFLTF9LAorezIuMTQzMzQ4MzFFLTEsIDIuNDgwNjEyOTlFLTEsIDIuNzIyNTkxNDZFLTF9LAorezEuNzYzODAyNjJFLTEsIDEuOTY4OTc4OTRFLTEsIDIuOTIyODY5MDNFLTF9LAorezEuOTgxOTM0NzZFLTEsIDIuNzU0ODMzNDBFLTEsIDMuNDkwMzc1NThFLTF9LAorezEuNzYxNTMxNjhFLTEsIDEuOTMyNDg5NTdFLTEsIDIuNjk1NDg1MDZFLTF9LAorezIuMzY5Njg2MjJFLTEsIDIuNTAwNjU4MDRFLTEsIDMuMDY4MjA4NDBFLTF9LAorezEuNzYwNjA3MjFFLTEsIDIuNTQwMzc2MTlFLTEsIDMuMDM1NjY3ODRFLTF9LAorezIuODI5NTI5MDVFLTEsIDMuMDE3NjUwNTRFLTEsIDMuNTM5NTYzMTJFLTF9LAorezEuNDUzNTM3MjBFLTEsIDEuODM2Nzg4MzZFLTEsIDIuMzQ3NTAwNjJFLTF9LAorezEuOTM4NDI2MzVFLTEsIDIuMzA2MzU1NTRFLTEsIDIuNjc4MTc3NjVFLTF9LAorezEuMzg5NTg5NzZFLTEsIDEuODY3NjA3ODNFLTEsIDMuMTMxMTMyNDJFLTF9LAorezEuOTk5NDQ0ODFFLTEsIDIuNzc2MjQ3NTZFLTEsIDMuMjUwNDYzMzFFLTF9LAorezEuNDI5NjYwNzdFLTEsIDEuNzEzMTA4NDJFLTEsIDMuMDMwMTM0MTRFLTF9LAorezIuMDc3NDE2NjNFLTEsIDIuNTg2OTE3NThFLTEsIDIuODg3NjY5NTBFLTF9LAorezEuNzE3NzY5MzVFLTEsIDIuNDAyNDYwODdFLTEsIDIuNzMyODQ1MjVFLTF9LAorezIuNzEwNDY2MzhFLTEsIDIuODUxNzA5NDNFLTEsIDMuMjc0MDExMzFFLTF9LAorezEuNjk4NTQ2MjZFLTEsIDEuODc1NDU3NzZFLTEsIDIuMjQ0ODQ3MTJFLTF9LAorezIuMTUyMjE5ODZFLTEsIDIuMjczMzk3NDVFLTEsIDIuOTUwMDg4MDhFLTF9LAorezEuNzU1OTY2NDBFLTEsIDIuMTc5MzY1NDZFLTEsIDIuNzQ4Nzk2MDVFLTF9LAorezIuMzQ2NjU0MzlFLTEsIDIuODk1MzA5MDNFLTEsIDMuMTY0OTQzNzVFLTF9LAorezEuODk5NDY5OTRFLTEsIDIuMDQ5NTM4MjBFLTEsIDIuNDY5NTUxNzFFLTF9LAorezIuMzcyOTc4MThFLTEsIDIuNjgzMTY3MTZFLTEsIDIuOTA2ODQzMTNFLTF9LAorezEuNjk5NjMxNjZFLTEsIDIuNTMzNjc0ODRFLTEsIDIuOTI1MzMwMTBFLTF9LAorezIuNzA2NTk4NjRFLTEsIDIuOTcxNDYxMTJFLTEsIDMuNTYxODM5NzZFLTF9LAorezEuNTI1Mzk2ODVFLTEsIDEuNzAxMzg5NTVFLTEsIDIuNTI3MDM5MzVFLTF9LAorezIuMTkxMTkyMDZFLTEsIDIuMzU5MDA3MDBFLTEsIDIuNjk3MzkxMjFFLTF9LAorezEuNDIyNDU2NjVFLTEsIDIuMTgxODQ2MjBFLTEsIDMuMjgyMTgwNzNFLTF9LAorezIuNjE0NzI4MjFFLTEsIDIuNzgwMjU2NTdFLTEsIDMuMDIzNzU4ODNFLTF9LAorezEuNTM1MjYwMjNFLTEsIDEuOTA3Mjc3NDFFLTEsIDIuOTI4MjA4NDFFLTF9LAorezIuMDkyNDA5ODhFLTEsIDIuNDk4MDg2ODRFLTEsIDMuMjQ3MDkwODhFLTF9LAorezEuNzUxNzYzOTdFLTEsIDIuMzg2NDY3NDZFLTEsIDMuMDYzOTI2OTlFLTF9LAorezIuNzMyMTg4NzBFLTEsIDMuMDM5NTQ5ODlFLTEsIDMuMjA1MTM4NzRFLTF9LAorezEuNjM5MTE1OTZFLTEsIDEuODk2MTE1ODRFLTEsIDIuNTYyNzI1MjVFLTF9LAorezIuMjY5NTM3NjBFLTEsIDIuNDAxMjAyMzJFLTEsIDIuOTI3Mjg1MTNFLTF9LAorezEuOTU1NjU3MTVFLTEsIDIuMTE5NTYyMDNFLTEsIDIuOTczNzQ2OTZFLTF9LAorezIuNDEwNDU1NTBFLTEsIDIuODg0OTcwMDFFLTEsIDMuMzYzNTIzMTlFLTF9LAorezEuOTQ5NDgzMzFFLTEsIDIuMDk0NzUyNzlFLTEsIDIuNTYzMDk2NThFLTF9LAorezIuNDc4ODQ2MzFFLTEsIDIuNjMzNTY0MTdFLTEsIDMuMTEyNzA4NjNFLTF9LAorezEuNjkxODk3MDZFLTEsIDIuMzU4NjQ1ODBFLTEsIDMuMzYyNDkzODFFLTF9LAorezIuODYwMDE1NjNFLTEsIDMuMjU0MjM3NDdFLTEsIDMuNTk2MDczNjlFLTF9LAorezEuNTYyNTg1OThFLTEsIDEuNzY3MDQ5NDNFLTEsIDIuMTQzOTM0MzdFLTF9LAorezIuMDg5OTY4NDdFLTEsIDIuMjM5Njg2ODVFLTEsIDIuNjA4ODY3NTlFLTF9LAorezEuMzU3NjUzODlFLTEsIDIuMDM1ODAwNTJFLTEsIDMuMDU1MDMyMTlFLTF9LAorezIuMTg5NjEzNzNFLTEsIDIuNzk0NjM1MDBFLTEsIDIuOTk0NTA4NDVFLTF9LAorezEuMzQwNjQ3NDlFLTEsIDEuNzgzMzIxMjBFLTEsIDIuOTAxNjk2MjZFLTF9LAorezIuMTMyOTgzOTVFLTEsIDIuNDAwMzE1MTFFLTEsIDMuMDAzNDU5MjdFLTF9LAorezEuNjQzNzM0MTNFLTEsIDIuMjY0Mzg3MDFFLTEsIDIuODcxNzExNTVFLTF9LAorezIuNTA3Mzk2MDRFLTEsIDIuODA4MTI0NzJFLTEsIDMuMzUzNDkzNTFFLTF9LAorezEuNjM2NDk1MTRFLTEsIDEuOTcxMDgwMDFFLTEsIDIuMjExNjUxODBFLTF9LAorezIuMDgxMzk2MTNFLTEsIDIuMzA4Njk4MDBFLTEsIDIuOTYxMzcwNjVFLTF9LAorezEuNTkxMTMxMjRFLTEsIDIuMTgxODkxODBFLTEsIDIuOTU1MzE5NThFLTF9LAorezIuMzk4ODM0OTdFLTEsIDIuODE4MzEyMzVFLTEsIDMuMjYwNDU2MDNFLTF9LAorezEuODkzOTQ3MjdFLTEsIDIuMDgxMjcxNDFFLTEsIDIuMzg0NDY0MTRFLTF9LAorezIuMzI5OTU3MDRFLTEsIDIuNTk2MDM0NzFFLTEsIDIuOTM0Mjc5NzRFLTF9LAorezEuNjA1NTg4MzVFLTEsIDIuNTUxNjQ4MzJFLTEsIDMuMDI4NzI5MjZFLTF9LAorezIuNTM1MDkyODNFLTEsIDIuOTYwMjg0NjVFLTEsIDMuNjc3MjE1ODdFLTF9LAorezEuMzAxMjQzNzVFLTEsIDEuNzQ4Mzg5OTBFLTEsIDIuNjA0ODYwMzdFLTF9LAorezIuMTAyMDM5OTBFLTEsIDIuMzM1NzA3ODRFLTEsIDIuODMwNjE4OTJFLTF9LAorezEuNTIzNjU0OTFFLTEsIDIuMjUzMzg3NTdFLTEsIDMuMDM3MjA5ODFFLTF9LAorezIuNDA1NTg2MDlFLTEsIDIuNzcxOTIyMDVFLTEsIDMuMDU4OTE5MDFFLTF9LAorezEuNjM3Mjg4MThFLTEsIDEuOTQ3NzkzOTZFLTEsIDIuNjkyNTM1ODJFLTF9LAorezIuMjU3MDk0MjNFLTEsIDIuNDA5MDI2OTJFLTEsIDMuMTgwNjA2MDdFLTF9LAorezEuOTIwNTUwOTFFLTEsIDIuMjk4NTc4MzJFLTEsIDIuODk4MjY3MjFFLTF9LAorezIuNjI3NTk2ODZFLTEsIDMuMDQyOTIxNzJFLTEsIDMuMzU2ODA1NzRFLTF9LAorezEuNjYwNzExNjJFLTEsIDIuMDY4MTkxNzdFLTEsIDIuMzk3MTI0NjJFLTF9LAorezIuMjM5MTU1NjJFLTEsIDIuNTAxMDY4NzFFLTEsIDIuODUyOTYyMzJFLTF9LAorezEuODg0MDIzNDBFLTEsIDIuMDM3OTM3MzRFLTEsIDMuMDMwNDExMzBFLTF9LAorezIuMzA2OTg5ODhFLTEsIDIuODcwNDQxMzhFLTEsIDMuNDk4MDI3NjJFLTF9LAorezEuODIwMjUzNThFLTEsIDIuMTQwNzM1MDlFLTEsIDIuNjM0NzAwMjRFLTF9LAorezIuMzcyOTc3NThFLTEsIDIuNjUwMjU0MDdFLTEsIDMuMTc4MTU1MTJFLTF9LAorezEuODkyNzg3MDdFLTEsIDIuNTg4MDIyMDVFLTEsIDMuMDQ4NjYxNjVFLTF9LAorezIuOTcyNDMwNTlFLTEsIDMuMTcxNTMwNjZFLTEsIDMuNTY1ODM5MjNFLTF9LAorezEuNTg2MDc0NjhFLTEsIDEuNzg2NTk3NjdFLTEsIDIuNDE5MTkzNjlFLTF9LAorezEuOTQ4ODczODVFLTEsIDIuNDE2OTU4NTFFLTEsIDIuNjIxNzY2NjNFLTF9LAorezEuNTgxMjQ0MzJFLTEsIDIuMTE3NTMwNzBFLTEsIDMuMTEzNTIxNjRFLTF9LAorezIuMTY5MDI3MThFLTEsIDIuOTg3OTY4MDNFLTEsIDMuMjA5OTQwNDlFLTF9LAorezEuNDkyNzI3ODVFLTEsIDEuNzQ5NjQxMzBFLTEsIDMuMTUzMzQ0MDlFLTF9LAorezIuMjE2MjIyNzNFLTEsIDIuNTYxNzkwNjVFLTEsIDMuMDM5MDI5NTRFLTF9LAorezEuNzU5Nzk1OTlFLTEsIDIuNDM1MDU0NDhFLTEsIDIuODU4MDE3MzlFLTF9LAorezIuNjQ1OTAzODNFLTEsIDIuODU1NDE1NjRFLTEsIDMuNDUxMDc3NjRFLTF9LAorezEuODAxMzcwODNFLTEsIDIuMDUyNzkzNTBFLTEsIDIuMjIyNTU5OTBFLTF9LAorezIuMTA3OTYyMjJFLTEsIDIuMjYzMTU0MzlFLTEsIDMuMTQ0MjY5MjlFLTF9LAorezEuNzkxNTExNjNFLTEsIDIuMDk0Mzk3MjVFLTEsIDIuOTMyODA4NzBFLTF9LAorezIuNDk3MTkwMjRFLTEsIDIuOTEyNTc2NTBFLTEsIDMuMjcxNjIyOTZFLTF9LAorezEuOTg3MDAyMzRFLTEsIDIuMTU4OTY3NTVFLTEsIDIuNDk5NjAyMTRFLTF9LAorezIuNDA3MjYzOTZFLTEsIDIuNjQ4NTc3MzlFLTEsIDIuOTk2Mzk1NTNFLTF9LAorezEuNzEyNDk3MzJFLTEsIDIuNjgxNjYxNTVFLTEsIDMuMDM1NzI3NDRFLTF9LAorezIuNjk1NTU1NjlFLTEsIDMuMTYxMDA2MjdFLTEsIDMuNTY1NzA2OTFFLTF9LAorezEuNTA1NjQ3NDVFLTEsIDEuODQxOTA4NjlFLTEsIDIuNjg2NzQ4MjFFLTF9LAorezIuMTY5NDExOTNFLTEsIDIuNDA4MTM5NzFFLTEsIDIuNzg5NDIxOThFLTF9LAorezEuMzUzOTk0NzZFLTEsIDIuNjA1ODY1MzBFLTEsIDMuMzI2MDQ4NTVFLTF9LAorezIuNTYxNTA5NjFFLTEsIDIuODc4MjI4NzJFLTEsIDMuMDYxNTYzNjdFLTF9LAorezEuNjYzOTg4MzhFLTEsIDEuODg3MjE4MDZFLTEsIDIuOTMwMjM3MzVFLTF9LAorezIuMjkyMTQwODdFLTEsIDIuNjE1NjU0MTdFLTEsIDMuMjc0OTQwNTVFLTF9LAorezEuOTgyNjY2NDBFLTEsIDIuMzI5NzA1MDZFLTEsIDIuOTkxMzQyODRFLTF9LAorezIuODcwNDYyNTRFLTEsIDMuMDcxMDM3ODNFLTEsIDMuMjcyOTgwNzVFLTF9LAorezEuNzU4OTg2ODZFLTEsIDIuMTE4OTg1OTVFLTEsIDIuNTEzMzI5MDlFLTF9LAorezIuMzIwNjc0MjFFLTEsIDIuNDQ2MjIyMDFFLTEsIDIuOTk0NDM2OTJFLTF9LAorezEuOTA3ODAwNTlFLTEsIDIuMTIwOTAwMTVFLTEsIDMuMjUwNTkyNjVFLTF9LAorezIuMzE1MzEyMThFLTEsIDMuMTQxNjYwOTlFLTEsIDMuNDI3MzU4NTdFLTF9LAorezEuOTUwOTk4NDZFLTEsIDIuMDk1NTQzMTVFLTEsIDIuNzk0ODM0NjdFLTF9LAorezIuNDA0MTYwNjVFLTEsIDIuNjk2MDQ3NzJFLTEsIDMuMjgwMTU0NzZFLTF9LAorezEuNzE4MDA4NjdFLTEsIDIuODIyMzMwODlFLTEsIDMuMTQ3NDkyNzFFLTF9LAorezIuNjkyNDM3NzdFLTEsIDMuMzg0NjI1MDJFLTEsIDMuNzk5MzU2NTJFLTF9LAorezEuNTk5MzQ2MjVFLTEsIDEuNzc5NjY3NzRFLTEsIDIuMDA4MTg2MjhFLTF9LAorezIuMDE5Nzk3MTJFLTEsIDIuMzA2Njg1NDVFLTEsIDIuNTY3NzMzMjNFLTF9LAorezEuMzQwMjQyNzdFLTEsIDIuMTA5NjE2MTBFLTEsIDIuODQ2ODc3MjhFLTF9LAorezIuMDM3MTI4OTZFLTEsIDIuODMwNTMwNzBFLTEsIDMuMDMzMDk0MTFFLTF9LAorezEuNDQ1Mjg4ODFFLTEsIDEuNjQ3MjgwNzVFLTEsIDIuODUwNzkzOTBFLTF9LAorezIuMDYyODU2MTFFLTEsIDIuNDg2NDkwMzFFLTEsIDIuOTYzODMwNTNFLTF9LAorezEuNTgxMzgxNzFFLTEsIDIuMzQzMTc3MjBFLTEsIDIuNzk2NTAwMDNFLTF9LAorezIuNjQ5OTU2MzVFLTEsIDIuNzk5MDA3MDBFLTEsIDMuMTg2MTk0MDBFLTF9LAorezEuNjY1Mzc0NzlFLTEsIDEuODQyNzk0MTJFLTEsIDIuMTQ1NDc0ODVFLTF9LAorezIuMDMwNTE4ODBFLTEsIDIuMzUxMTA0OTJFLTEsIDIuODg3NTU5ODNFLTF9LAorezEuNjg0MjI3MTRFLTEsIDIuMDM5NDYxNzNFLTEsIDIuODc0Nzg4OTRFLTF9LAorezIuMzE3MjcwMTlFLTEsIDIuNzQwODYzODZFLTEsIDMuMjQ3NTUxNjJFLTF9LAorezEuODUzNTYyMTVFLTEsIDIuMTQxMTMxMTZFLTEsIDIuMjkwMzA0MDFFLTF9LAorezIuNDI0ODI1NThFLTEsIDIuNjA2NTU0OTNFLTEsIDIuODMwMzAzMDFFLTF9LAorezEuNjc1NjIyNjFFLTEsIDIuNDIwMjc0OTFFLTEsIDIuOTk0NjE5OTFFLTF9LAorezIuMzg4MDk4OThFLTEsIDMuMTkwMDM4NTBFLTEsIDMuNTg0MTU4NzJFLTF9LAorezEuMzc5MDgyNjVFLTEsIDEuNTQ3ODc4MDlFLTEsIDIuNjU2MTEyMDJFLTF9LAorezIuMTEwMTkyNjNFLTEsIDIuMjQ2MDczMTlFLTEsIDIuNzk5NTQ3MDJFLTF9LAorezEuMzc1Njk4ODlFLTEsIDIuMjUxMjg1MzFFLTEsIDMuMDkzMTI4NTBFLTF9LAorezIuMjkyMzk4NjZFLTEsIDIuNzYxNTA5NzJFLTEsIDMuMTUyNDE4NDNFLTF9LAorezEuNjA0ODc0NThFLTEsIDEuOTU0NjEyMTRFLTEsIDIuODMxNjk0NzhFLTF9LAorezIuMTg1MDU2NjZFLTEsIDIuMzgxOTcyMDdFLTEsIDMuMzAzNDAxMTdFLTF9LAorezEuODE5OTEzMjRFLTEsIDIuMzMwMjY5NTJFLTEsIDIuOTMyNzYwNDJFLTF9LAorezIuNTQ1NTIzMDVFLTEsIDMuMTQzOTQxNDZFLTEsIDMuMzYzOTIyNTRFLTF9LAorezEuNDQwOTU3NjRFLTEsIDIuMjY2NDAxNjVFLTEsIDIuNTA1OTUwNjNFLTF9LAorezIuMTUxODgwMTJFLTEsIDIuNTE0MTcyNDlFLTEsIDIuODUwNDM5ODVFLTF9LAorezEuODc2NzQzODhFLTEsIDIuMDQ0NTg4NjNFLTEsIDIuOTQxNjg5NzlFLTF9LAorezIuMzA0OTQ4NDJFLTEsIDIuNjg0NTI0MzZFLTEsIDMuNTIzNzAwNTRFLTF9LAorezEuODUwMjIxMDFFLTEsIDEuOTkwNzUyNTJFLTEsIDIuNzE5MzA1NDZFLTF9LAorezIuNDI1NjkzNzJFLTEsIDIuNTUzODkxNTRFLTEsIDMuMTEzOTkzMTFFLTF9LAorezEuOTUxNjYwOTZFLTEsIDIuNDkxMDIwNTZFLTEsIDIuOTg5OTg0NDVFLTF9LAorezIuODM2NTQxNTNFLTEsIDMuMTQ2MDAyNTlFLTEsIDMuNTU2MTk0MDFFLTF9LAorezEuNTE0OTAwMThFLTEsIDEuOTc3Mjk3OTZFLTEsIDIuMzI0Njc0NzNFLTF9LAorezIuMDAwMjk4OTVFLTEsIDIuMzAxMDEyNThFLTEsIDIuODE5MzM5MzNFLTF9LAorezEuMzg3MTEzMThFLTEsIDEuOTE4MTY2MjhFLTEsIDMuNDU3ODA0MDJFLTF9LAorezEuOTY1ODAzOTVFLTEsIDMuMDQ3MTQ3NjlFLTEsIDMuNDA1NTM0MzNFLTF9LAorezEuMzgxNTQyNTNFLTEsIDEuODg1NDMxNDFFLTEsIDIuOTk0NjEyMTZFLTF9LAorezIuMDU2NjY0NjhFLTEsIDIuNjg5MDQ4OTVFLTEsIDMuMDU1MzcxOTRFLTF9LAorezEuNzI0NDc4NDVFLTEsIDIuMzM1NTgzODdFLTEsIDIuOTM2MjUyMDZFLTF9LAorezIuNzAxNDU0MTZFLTEsIDIuOTg2NTQ3NjVFLTEsIDMuMjg1NTYzODlFLTF9LAorezEuNzU0ODk0MTFFLTEsIDEuOTEzNjE1NDdFLTEsIDIuMzU1ODUzMzJFLTF9LAorezIuMjA1NDg3OTRFLTEsIDIuMzQ3NzM5OTNFLTEsIDIuOTUzOTc2NjlFLTF9LAorezEuODU2NTIzNjBFLTEsIDIuMjIzNDkxMzdFLTEsIDIuNzk4ODM4OTFFLTF9LAorezIuMjk0NTY5NDZFLTEsIDMuMDQ1NDYzMjZFLTEsIDMuMjQ2ODQyOTJFLTF9LAorezEuODY5MDA3ODBFLTEsIDIuMTU0NjkzOTBFLTEsIDIuNTE4NTY4MDRFLTF9LAorezIuMzQ5MTA1MzNFLTEsIDIuNzEyMTczNzZFLTEsIDIuOTk4OTQ2NjFFLTF9LAorezEuODUxNDI0NDNFLTEsIDIuNTYwNzEwMDFFLTEsIDIuOTMyOTEzMDFFLTF9LAorezIuNjM4ODM3MTBFLTEsIDMuMDcxMjc0NDZFLTEsIDMuNjI1NDY2NTNFLTF9LAorezEuNjA5OTc2NDRFLTEsIDEuNzg5Mzc4NTJFLTEsIDIuNTU4MDgzMjRFLTF9LAorezIuMjU2NzEwNjhFLTEsIDIuNDM3MzUwNzVFLTEsIDIuNjg2MjQ5OTFFLTF9LAorezEuNTUwNzYxNjFFLTEsIDIuMzAzOTYxODFFLTEsIDMuMjEwMDU1NTNFLTF9LAorezIuNTE3NjA0ODNFLTEsIDIuNzk2NTM0MDBFLTEsIDMuMTQyMDIxNjBFLTF9LAorezEuNTY5ODg4MTRFLTEsIDIuMDc0NjY5MzBFLTEsIDIuODk5MzM5NTBFLTF9LAorezIuMTc0Nzk0ODJFLTEsIDIuNTk2MjY0MThFLTEsIDMuNDA2NTkwNTJFLTF9LAorezEuNzY4MTE1MzFFLTEsIDIuMzEwODcwODlFLTEsIDMuMTc1NjI0OTFFLTF9LAorezIuODI5NTI2MDdFLTEsIDIuOTk4NDQzNTRFLTEsIDMuMzY4MjI4OTdFLTF9LAorezEuODIwNjAzMTZFLTEsIDEuOTg3MzQ3MzBFLTEsIDIuNTE5ODAzMDVFLTF9LAorezIuMjU4NzQyMDBFLTEsIDIuNTI0NjkxNTJFLTEsIDIuOTMzNTYzODlFLTF9LAorezIuMDA3OTk5NTdFLTEsIDIuMTc3ODY4NDlFLTEsIDMuMDIyMTAwNjNFLTF9LAorezIuNDc0MjM3NTNFLTEsIDIuODY4ODI4NDhFLTEsIDMuNDc4MjA2MTBFLTF9LAorezIuMDExMjgxNDBFLTEsIDIuMTQ3NDY4OTJFLTEsIDIuNjIyNjk2NDZFLTF9LAorezIuNTM5NjMzNTFFLTEsIDIuNjk0Nzc5OTNFLTEsIDMuMTIxMzM4MTlFLTF9LAorezEuOTEwMzQ4NjhFLTEsIDIuNTU3MzgxNjlFLTEsIDMuMzI1NTk2MTVFLTF9LAorezIuOTEwNTM3MTJFLTEsIDMuMzE0NTg0MjBFLTEsIDMuNjg1ODg0NzdFLTF9LAorezEuNTcyMjk5MTVFLTEsIDEuODUzNzQxNDFFLTEsIDIuMjUzNjEzMTdFLTF9LAorezIuMDgwNTEzMzlFLTEsIDIuMzgzNTA4NjhFLTEsIDIuNjQyMTI5MzZFLTF9LAorezEuNDY4NDgzMzZFLTEsIDIuMTMwMDAwODlFLTEsIDMuMDAxOTI1NjVFLTF9LAorezIuMTg2MzA1NjdFLTEsIDIuOTAyNjM4MDJFLTEsIDMuMDkwNDU3NjJFLTF9LAorezEuNDM2OTkxODRFLTEsIDEuODc4MTUxNjBFLTEsIDIuODM3Njk4NzZFLTF9LAorezIuMDczMjgwMzZFLTEsIDIuNDUwODg2OTZFLTEsIDMuMDg5NTY0MTRFLTF9LAorezEuNjQyMjgwOTdFLTEsIDIuMjc4MjY2NTVFLTEsIDMuMDg5MDc4OTZFLTF9LAorezIuNjE5MTk3MzdFLTEsIDIuOTEzMzM3MDVFLTEsIDMuMzE1Mjc5NzhFLTF9LAorezEuNzA2NDg4ODhFLTEsIDIuMDIxNTc1MjdFLTEsIDIuMTc4Mjc4MjdFLTF9LAorezIuMDc3OTYxMTJFLTEsIDIuMzQ3MDQ4MjJFLTEsIDMuMDY3ODM3NjZFLTF9LAorezEuNzIxMTg3OThFLTEsIDIuMTQwNTczODZFLTEsIDMuMTAxNTE3ODZFLTF9LAorezIuMjkxMTYxNTdFLTEsIDIuODA5NDk4NjFFLTEsIDMuMzM3NzQyOThFLTF9LAorezEuOTY2MjIyMDhFLTEsIDIuMTY2NTMwNDlFLTEsIDIuMzMyNzk3MjBFLTF9LAorezIuMzc3ODkyMjlFLTEsIDIuNTg5NzEzMDRFLTEsIDMuMDQ2MDkyMDlFLTF9LAorezEuNTUxODIwMTlFLTEsIDIuNjMwMzI1ODVFLTEsIDMuMTg5NDMwNTNFLTF9LAorezIuNDkzODg4MjlFLTEsIDMuMTY5NzA4NTVFLTEsIDMuNzc3NjI0NjdFLTF9LAorezEuNTEzNjM1OTZFLTEsIDEuNzUwMTA2NTFFLTEsIDIuNzgyNDU4MzZFLTF9LAorezIuMTk4MTAyMzNFLTEsIDIuMzIzNjAyMTRFLTEsIDIuODUwMzQ5MjVFLTF9LAorezEuNDI2MzA2MjJFLTEsIDIuNDA2MDI4NTFFLTEsIDMuMDQxMjUxMDBFLTF9LAorezIuNDI3NjQ4NzVFLTEsIDIuODM3NjIxMjdFLTEsIDMuMTU0ODEyMTZFLTF9LAorezEuNTc0Njc0NzBFLTEsIDIuMDc1MjQwNjFFLTEsIDIuNzU2NzQ5MDlFLTF9LAorezIuMjg3NTg2MThFLTEsIDIuNDkwOTIyMDZFLTEsIDMuMjgxMzkzOTVFLTF9LAorezEuOTA4NzI3MTRFLTEsIDIuMzgxMjUyMDVFLTEsIDIuOTQ4OTQ1NDZFLTF9LAorezIuNjYzODkyNTFFLTEsIDMuMTQzMjE0MjlFLTEsIDMuMzg2Njk1MDlFLTF9LAorezEuNzA2NDQyMDlFLTEsIDIuMjU5ODAwNDNFLTEsIDIuNDczNzIzODlFLTF9LAorezIuMzY0NDI3ODlFLTEsIDIuNTMwMDM0NDhFLTEsIDIuODgyMjA0MzVFLTF9LAorezEuODU0MjM3NzdFLTEsIDIuMDQ4ODg4NTBFLTEsIDMuMTQ2MDg4NDJFLTF9LAorezIuMTczNzkwMTlFLTEsIDIuOTQ1NTM1NDhFLTEsIDMuNjc4MzEwMjJFLTF9LAorezEuODg1NjM5ODhFLTEsIDIuMTUxNzQyODhFLTEsIDIuNzI5OTk3MzRFLTF9LAorezIuNDUxMDIxMjJFLTEsIDIuNTk3NzAzNjRFLTEsIDMuMjE4ODU1NTZFLTF9LAorezEuOTg0NDQxNzNFLTEsIDIuNjExNjA3MDJFLTEsIDMuMTcwOTc4NzJFLTF9LAorezIuOTkwMTM4NTNFLTEsIDMuMjg5NjUzMzZFLTEsIDMuNTY2ODExOThFLTF9LAorezEuNTgyNDg3NjdFLTEsIDEuOTIyMDU2OTdFLTEsIDIuNDYwNTkwOTBFLTF9LAorezIuMDIzODUzNTFFLTEsIDIuNDc5NjU4NDJFLTEsIDIuNzE3NDk2NDVFLTF9LAorezEuNjE3MTA3ODRFLTEsIDIuMTM3MDgxMDNFLTEsIDMuMjczODQ3NDBFLTF9LAorezIuMTQ0MTk3MDhFLTEsIDMuMDU1NTI0NTNFLTEsIDMuMzM3MjE1NDhFLTF9LAorezEuNjE4MTk5ODBFLTEsIDEuODk4OTcyOTlFLTEsIDMuMTA1MDE1NDZFLTF9LAorezIuMTk0MzYzMzNFLTEsIDIuNjUwMjk1NzlFLTEsIDMuMDkyODg4MzBFLTF9LAorezEuODgzMDM5MzNFLTEsIDIuNDk2MzMxNjNFLTEsIDIuODU0OTk1NDNFLTF9LAorezIuNjkzMjUzNzZFLTEsIDIuOTk4MDcwNDJFLTEsIDMuNDE3MjI0NTlFLTF9LAorezEuNzI0MDYwMDNFLTEsIDIuMTA5NzcyNTZFLTEsIDIuMjc3NzMyMTlFLTF9LAorezIuMjAyODE1MjZFLTEsIDIuMzQwMTU3NjNFLTEsIDMuMTI4NDYwOTRFLTF9LAorezEuODMyNTcyNjdFLTEsIDIuMjIwNjE5NjJFLTEsIDIuOTEwNTIzNzFFLTF9LAorezIuNDI1MzEyMjVFLTEsIDMuMDk1Mjc2MDZFLTEsIDMuMzAzODk2NDlFLTF9LAorezIuMDc1NDY2OTZFLTEsIDIuMjQ2NjI2MzJFLTEsIDIuNDQ0MjAxNDFFLTF9LAorezIuNDU4NTgyMDdFLTEsIDIuNzAyODU5OTRFLTEsIDMuMDUxMzIxMjFFLTF9LAorezEuODQ4NDA1NDVFLTEsIDIuNzIwOTY3ODNFLTEsIDMuMTI1MzEwODRFLTF9LAorezIuNzQyNTI1OTRFLTEsIDMuMjEyNTI0MzVFLTEsIDMuNzQ2NTgxOTdFLTF9LAorezEuNjY0MjU4MzlFLTEsIDEuODQ0OTE2MzRFLTEsIDIuNjgyNzgwOTJFLTF9LAorezIuMjg0MjM2NzBFLTEsIDIuNDMwMjU0MjJFLTEsIDIuODExODQ4ODJFLTF9LAorezEuNjAwOTEyOTZFLTEsIDIuNTI5NTMzMjFFLTEsIDMuMzU4MjIzMTRFLTF9LAorezIuNjIxMDk5OTVFLTEsIDIuOTU1ODE5MDdFLTEsIDMuMTMzNTQxMDVFLTF9LAorezEuNjc3MDI3NDlFLTEsIDIuMDE1MzY5MjRFLTEsIDMuMDE4MDE1OTJFLTF9LAorezIuMzc4MjI5NjVFLTEsIDIuNTk4OTQ3NThFLTEsIDMuMzgyMzExMTdFLTF9LAorezEuOTcyMDYyMTRFLTEsIDIuNDU0OTA5MDlFLTEsIDMuMTc4OTU0NDJFLTF9LAorezIuOTg0NTUyOThFLTEsIDMuMTkyMDk3ODRFLTEsIDMuNDA5NzE3MzhFLTF9LAorezEuNzExOTUzNDNFLTEsIDIuMjQzMjc4MzJFLTEsIDIuNjI3MzYxMTJFLTF9LAorezIuMzA2MjY4OTZFLTEsIDIuNTMzMTAyMzNFLTEsIDMuMDEyMDY3OTdFLTF9LAorezIuMDQ4MTQyMTFFLTEsIDIuMjE4ODE1NjhFLTEsIDMuMjU5NjY1NjdFLTF9LAorezIuMjI5ODc1MThFLTEsIDMuMDYzMzkxMTVFLTEsIDMuNTA3MTcxNTdFLTF9LAorezIuMDA4NTUzODlFLTEsIDIuMTUzNTk5MjZFLTEsIDIuODQxNDM0NzhFLTF9LAorezIuNTA5NTE2NDhFLTEsIDIuNjYxODkyNDdFLTEsIDMuMzMzNjA1ODNFLTF9LAorezEuNzU2MTAyNTlFLTEsIDIuOTM3OTEzMjRFLTEsIDMuNDAzMjY5MzVFLTF9LAorezIuOTE3NDUwNjdFLTEsIDMuNDA2MDI0ODdFLTEsIDMuODEzOTcxNThFLTF9fTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGV2cmNfbHNwcV9mdWxsX2NvZGVib29rNFsxMjhdWzNdID0geworezIuNzc0NjE1MjlFLTEsIDMuMTY5NzIwNzdFLTEsIDMuOTU0OTgzMzVFLTF9LAorezMuMzY1NjA0MjhFLTEsIDMuNjAxNTY5NTNFLTEsIDMuODE0NzMwMDVFLTF9LAorezMuMTA1MDkzMjRFLTEsIDMuMzE3MzIzOTJFLTEsIDMuNjY4NjQzODNFLTF9LAorezMuMzc0NzA5NDlFLTEsIDMuOTY3OTUyNzNFLTEsIDQuMTIzNTYzMTdFLTF9LAorezIuNzk2NjA0MDRFLTEsIDMuNjY1MjAxMDdFLTEsIDMuODUzMTM0NTFFLTF9LAorezMuMTYwMzg5NjZFLTEsIDMuODU2MDkzMjlFLTEsIDQuMDEzMDQ3ODFFLTF9LAorezMuMDk5NjA0MjVFLTEsIDMuNDM0MTA3MzBFLTEsIDQuMjQ3NDU1MDBFLTF9LAorezMuNTQyNDM2MzZFLTEsIDQuMDg2OTkyNzRFLTEsIDQuMjIxNjc5NTdFLTF9LAorezIuOTU1ODcyNDJFLTEsIDMuMzM3NDExMjhFLTEsIDMuODc0MjE2NjhFLTF9LAorezMuMzM0NDYzODNFLTEsIDMuODY5NzQ3NTJFLTEsIDQuMDEzNTMwNjFFLTF9LAorezMuMjM0MTI4MzZFLTEsIDMuNjUyNjk2NjFFLTEsIDMuODUxOTMyODhFLTF9LAorezMuNDI3MzE5NTNFLTEsIDQuMDMxOTI1MjBFLTEsIDQuMTk5MjAzODVFLTF9LAorezIuNzc2ODE4MjhFLTEsIDMuODI0OTQ5ODZFLTEsIDQuMDQyNzQxNjZFLTF9LAorezMuMTgyNDc5NzRFLTEsIDMuOTU5ODUzMDVFLTEsIDQuMzEzNTMxNTJFLTF9LAorezMuMDM3MTE0MTRFLTEsIDMuODAzMTk3MTVFLTEsIDQuMzcxNzM1NDVFLTF9LAorezMuNzgyODg4MDVFLTEsIDQuMDcwNzczMTJFLTEsIDQuMjI2NzkxMjZFLTF9LAorezIuMzgxMTY1MDNFLTEsIDMuNDI0NTQzMTRFLTEsIDQuMjQ2MjQ3NDFFLTF9LAorezMuNDU2MTU2ODVFLTEsIDMuNjg2ODEwNzNFLTEsIDQuMDA4MTczMzVFLTF9LAorezMuMTc2ODgxMDdFLTEsIDMuNDE5MDI2NzNFLTEsIDQuMDU2MDE3OTlFLTF9LAorezMuNjYzNjg5NDlFLTEsIDMuODkwMzk5MzRFLTEsIDQuMDYxNTQ0NTRFLTF9LAorezIuOTkzOTgwMDVFLTEsIDMuNTIwMjE2OTRFLTEsIDMuOTk5NTU2OTBFLTF9LAorezMuMjQ5OTE5NDFFLTEsIDMuOTAwMjg4MzRFLTEsIDQuMTk0Nzg3MTRFLTF9LAorezMuMjMwMjU3NjNFLTEsIDMuNjgxMTQyOTNFLTEsIDQuMDIwODc3NDhFLTF9LAorezMuNjIzMjYyNjRFLTEsIDQuMTY5Mjc5OTNFLTEsIDQuMzI3NzM2NTBFLTF9LAorezIuNzI2OTY0MzVFLTEsIDMuNTkyMDUwMDhFLTEsIDQuMjY4ODA2NThFLTF9LAorezMuNDY1Mzk4NTVFLTEsIDMuNjk2MTY2MjhFLTEsIDQuMTU2MjEyMjFFLTF9LAorezMuMzQxMDkxMjhFLTEsIDMuNTU3MzYzMTVFLTEsIDMuOTY3NDk1NTZFLTF9LAorezMuMzc0Njg5ODJFLTEsIDQuMTAzOTI3MDJFLTEsIDQuMjU5ODY4MjZFLTF9LAorezIuOTk0Njg5OTRFLTEsIDMuODA2NDgyNTVFLTEsIDQuMTgyODQxMThFLTF9LAorezMuMjEzNzgxNzFFLTEsIDQuMTExOTgwMjBFLTEsIDQuMjg3OTI1MzZFLTF9LAorezMuMjc4NDExNjNFLTEsIDMuNjkzNDUxMjlFLTEsIDQuMzQzOTU2MTFFLTF9LAorezMuODA2NjkwNTdFLTEsIDQuMjYwODYzNjZFLTEsIDQuNDI3NTQ1NjdFLTF9LAorezIuNjg5NDM2NjdFLTEsIDMuNDI5NDI5NTNFLTEsIDMuOTg2ODE0NjJFLTF9LAorezMuMzgxMDI4NzdFLTEsIDMuNzYzMzg4NDBFLTEsIDMuOTIwNDMxNzNFLTF9LAorezMuMjM1OTM0OTdFLTEsIDMuNDg3NDIwNjhFLTEsIDMuNzI1NTE5NzhFLTF9LAorezMuNDc1NTA4MDlFLTEsIDMuOTI4ODUzODdFLTEsIDQuMjExNjk5MzdFLTF9LAorezMuMDQxODI4MjdFLTEsIDMuNTk4MTY2NzBFLTEsIDMuODE2MzMzNDFFLTF9LAorezMuMTQyMjEzODJFLTEsIDQuMDIxMDg1NTBFLTEsIDQuMjAwODUyNTFFLTF9LAorezMuMDEzMDY1NDZFLTEsIDMuNjI2NjI3MzNFLTEsIDQuMjkyNjI4MTdFLTF9LAorezMuNzE3NzAyNjNFLTEsIDMuOTg2OTYzNjNFLTEsIDQuMzE0Mzg5ODJFLTF9LAorezIuNzQ1OTEyNjdFLTEsIDMuMzU1OTU0ODlFLTEsIDQuMjAwNzk2NDhFLTF9LAorezMuNDQ1NDA4MzRFLTEsIDMuOTA0NTE3ODlFLTEsIDQuMDY0MTIwNjVFLTF9LAorezMuMjUyMzk4MzdFLTEsIDMuNzgzNDQ0NzZFLTEsIDMuOTQ2NzMyODhFLTF9LAorezMuNTY2ODM0OTNFLTEsIDMuOTA1NzQxNTdFLTEsIDQuMzM4NTEwNjNFLTF9LAorezIuNjM1MDEyODdFLTEsIDMuOTUyNjAwOTZFLTEsIDQuMjMxMTYzODZFLTF9LAorezMuMzc1MjA2NTlFLTEsIDMuOTI1NjM0NjJFLTEsIDQuNDM0MTU4MjFFLTF9LAorezMuMTQ1MjIyNjZFLTEsIDMuODA5Njg2MzBFLTEsIDQuMjI2NzYzODRFLTF9LAorezMuNzYyMzUwNjhFLTEsIDQuMTcyOTg3MzRFLTEsIDQuMzE0NTEyNjFFLTF9LAorezIuNjE4NTUwMDZFLTEsIDMuNjg2NDYwODVFLTEsIDQuMDQyNjA1NzZFLTF9LAorezMuNTU1ODAxNTFFLTEsIDMuNzc5OTQ0NzhFLTEsIDMuOTU4NjgyNDJFLTF9LAorezMuMjc3NDI4MTVFLTEsIDMuNTM4NzI3NzZFLTEsIDQuMTEwNDA2MDRFLTF9LAorezMuNjI5NjA2MzdFLTEsIDMuOTk0NjY5OTFFLTEsIDQuMTQ2OTAxOTdFLTF9LAorezMuMDk0MTA4NzBFLTEsIDMuNzM3OTYwNDZFLTEsIDMuOTI2NzI0NzlFLTF9LAorezMuMzEwMTYzMDJFLTEsIDQuMDA4MDE1OTlFLTEsIDQuMzE3NTkyOThFLTF9LAorezMuMjM1NzMwNTNFLTEsIDMuNjg2MTk1NjFFLTEsIDQuMTc0NTUxMzdFLTF9LAorezMuNDkxMTU4NDlFLTEsIDQuMjY4NDAwNjdFLTEsIDQuNDM5MTM5OTZFLTF9LAorezIuODk3Mzg1OTVFLTEsIDMuNjM3NTkzMzlFLTEsIDQuMTA1MTE3OTJFLTF9LAorezMuNTUyODY0NzlFLTEsIDMuODkzMzEyODFFLTEsIDQuMTM0MzI0MTlFLTF9LAorezMuMzY1NjU5MTJFLTEsIDMuNjAyMjI0NTlFLTEsIDQuMjQxNzkwMThFLTF9LAorezMuMzk5MzI2ODBFLTEsIDQuMDkyMjg4MDJFLTEsIDQuNDAxODQ4OTFFLTF9LAorezMuMDA4ODk3MzBFLTEsIDQuMDAwODEwOThFLTEsIDQuMTc5NTU2OTdFLTF9LAorezMuMTcwNTIwNjZFLTEsIDQuMjIyODgxMjBFLTEsIDQuNDIyMjk1NjlFLTF9LAorezMuMjczMzY3ODhFLTEsIDMuODQzMTE2NzZFLTEsIDQuMzAyODg2MTNFLTF9LAorezMuOTg5OTA5MjlFLTEsIDQuMjk0OTg0MzRFLTEsIDQuNDM0NzUxODdFLTF9LAorezIuNDkxMTAxMThFLTEsIDMuMjU2OTY4ODZFLTEsIDQuMTE3MjgyNjNFLTF9LAorezMuNDU5MjkyMDVFLTEsIDMuNjg1Nzc1NDBFLTEsIDMuODg0NzMyNzJFLTF9LAorezMuMTMyMTk2NjZFLTEsIDMuMzkyMjk0NjVFLTEsIDMuODc1OTc5MTlFLTF9LAorezMuNTE0NTM5NjBFLTEsIDMuOTg3MzAyNzhFLTEsIDQuMTI2NTYxODhFLTF9LAorezIuOTM0ODcxMzJFLTEsIDMuNzU3NjMxMThFLTEsIDMuOTQ0ODgwOTZFLTF9LAorezMuMjQ0NzA3NThFLTEsIDMuOTQyMDI4ODhFLTEsIDQuMDg4ODI3MzdFLTF9LAorezMuMTI3MTA4MjJFLTEsIDMuNTc3MjAyNTZFLTEsIDQuMTQwNjExODlFLTF9LAorezMuNjY1MDcxNzNFLTEsIDQuMDgxNzEyOTZFLTEsIDQuMjM4OTE0MjVFLTF9LAorezIuOTk5NjU2ODBFLTEsIDMuMzE5OTM0MDFFLTEsIDQuMDc4NjAxNjBFLTF9LAorezMuMzQ5MjUxNzVFLTEsIDMuODYxNDMwMjlFLTEsIDQuMTE1MzgxMjRFLTF9LAorezMuMzQ3ODgwMjRFLTEsIDMuNjYxOTYxNTZFLTEsIDMuOTMzNDcxNDRFLTF9LAorezMuNDc4NDc5MzlFLTEsIDQuMDU5MjY0NjZFLTEsIDQuMzA1MDczMDJFLTF9LAorezIuODU5NTI5MjZFLTEsIDMuOTUyODMyODJFLTEsIDQuMTYxMTkzMzdFLTF9LAorezMuMjM4NjczODFFLTEsIDQuMDY0NzY2NzZFLTEsIDQuNDI0ODI4MjlFLTF9LAorezMuMTY3MTY2NzFFLTEsIDMuODQ0NTE2MjhFLTEsIDQuMzk0MTEwNDRFLTF9LAorezMuODY3NzI5MzFFLTEsIDQuMTE4MjQ1ODRFLTEsIDQuMjc4MzE1MzFFLTF9LAorezIuMzgwNzIzOTVFLTEsIDMuNjIzNDIzNThFLTEsIDQuMzA5MzE2ODdFLTF9LAorezMuNDY0NTAwMzFFLTEsIDMuNzkwODI5MThFLTEsIDQuMDY1Njc4MTJFLTF9LAorezMuMTY1NzY2MDBFLTEsIDMuNTY0Njg2MThFLTEsIDMuOTYyMTgzMDBFLTF9LAorezMuNjY1MzkxODBFLTEsIDMuODk1OTA5MTlFLTEsIDQuMjEwNTU1NTVFLTF9LAorezMuMDgyOTEzNzZFLTEsIDMuNzEzMjQzMDFFLTEsIDQuMDc4Njc0MzJFLTF9LAorezMuMzY0MzUxOTlFLTEsIDMuOTE1MTQ0MjFFLTEsIDQuMjI5NzcwOTBFLTF9LAorezMuMjMwMzU1MzhFLTEsIDMuODA0NDczMjhFLTEsIDQuMDk1NTAxOTBFLTF9LAorezMuNjUyMjgwNTdFLTEsIDQuMjc5MTAzODhFLTEsIDQuNDM2OTEyNTRFLTF9LAorezIuNzIwMzgwNDNFLTEsIDMuNzY1OTY4MDhFLTEsIDQuMzM2ODU4OTlFLTF9LAorezMuNTc2NjU3NzdFLTEsIDMuNzc3NjE2MDJFLTEsIDQuMDkxNzg5NzJFLTF9LAorezMuMzY0OTg1NTlFLTEsIDMuNjQyMTU5MTBFLTEsIDQuMDkyNTU1MDVFLTF9LAorezMuNDgwODI0MjNFLTEsIDQuMTc2MzE4MDVFLTEsIDQuMzMyODQ1MjFFLTF9LAorezMuMDI3NTQ1MjFFLTEsIDMuOTU5NzQ3NTVFLTEsIDQuMzM3MTcyNTFFLTF9LAorezMuMzE2NzYzMDRFLTEsIDQuMTc1ODcxNjFFLTEsIDQuMzYyMzk4MzlFLTF9LAorezMuMzMyODc1OTdFLTEsIDMuODA3OTkxMTVFLTEsIDQuMzk2MjA3MzNFLTF9LAorezMuODgxMTIwMDlFLTEsIDQuMzY5MzM1NzdFLTEsIDQuNTA4MjkyNjhFLTF9LAorezIuNTYwMjY2MjZFLTEsIDMuNDgwMTUxODlFLTEsIDQuMjI5MjI2MTFFLTF9LAorezMuNDU3NzM5OTVFLTEsIDMuODE3MjU3ODhFLTEsIDMuOTY3OTQwODFFLTF9LAorezMuMjU2MjM3NTFFLTEsIDMuNTAzOTE5MjRFLTEsIDMuODczMzA2NTFFLTF9LAorezMuNTY4NjgwODhFLTEsIDMuOTg1NzQ3NjlFLTEsIDQuMjMxNzcyNDJFLTF9LAorezMuMDEyMjYxOTlFLTEsIDMuODY5MDY5ODFFLTEsIDQuMDMzMzU1NzFFLTF9LAorezMuMjgxNzg0MDZFLTEsIDQuMDIwOTAxOTJFLTEsIDQuMTkzODkyNDhFLTF9LAorezMuMTQzODUzNTVFLTEsIDMuNjkwNDM4ODdFLTEsIDQuMzQzNzUyODZFLTF9LAorezMuNzIzMjExMjlFLTEsIDQuMTE2NzI0MTNFLTEsIDQuNDA1MTg3MzdFLTF9LAorezIuOTA0Nzk3MjBFLTEsIDMuNDgxMjE4ODFFLTEsIDQuMjYyMTY0ODNFLTF9LAorezMuNDQ0Mzg3OTFFLTEsIDMuODI2NjYzNDlFLTEsIDQuMTczMjEwODZFLTF9LAorezMuMzQ4NjY4MjJFLTEsIDMuNzYyMzU2NjRFLTEsIDQuMDQ0NzUyMTJFLTF9LAorezMuNTkwMjUzNTlFLTEsIDQuMDQ3MjE5MTZFLTEsIDQuMzQ4Mzg0MTRFLTF9LAorezIuNzkxMjc5NTVFLTEsIDQuMTExMDY1ODZFLTEsIDQuMzUzNjA1NTFFLTF9LAorezMuNDgxMjU1MTdFLTEsIDMuOTg3MzIwNjZFLTEsIDQuNDY5Mjc0MjhFLTF9LAorezMuMjcwMTg4NTdFLTEsIDMuOTAxMDczMzRFLTEsIDQuNDE3MDc0OTJFLTF9LAorezMuOTA4NTgzNTJFLTEsIDQuMTk4MTM5MzFFLTEsIDQuMzUxNTM0ODRFLTF9LAorezIuNTUzMTkyOTdFLTEsIDMuNzA0MDU5NzJFLTEsIDQuMzIxODg2MzBFLTF9LAorezMuNTQ2NTE5ODhFLTEsIDMuODgzMzI2NjVFLTEsIDQuMDI5NTYxMjhFLTF9LAorezMuMjE2MDgxODZFLTEsIDMuNTQ0ODk4MDNFLTEsIDQuMjgyOTk3ODVFLTF9LAorezMuNzUxNjM0OTZFLTEsIDMuOTg4MzM5OTBFLTEsIDQuMTQxNzc0MThFLTF9LAorezMuMTE5NTM2MDRFLTEsIDMuOTE0MzA2NzZFLTEsIDQuMTI1NTI0NzZFLTF9LAorezMuNDI1Mjg4MjBFLTEsIDMuOTYzNjUzNDVFLTEsIDQuMzI0OTczODJFLTF9LAorezMuMzM3NDQzNDdFLTEsIDMuNzY0MjI0MDVFLTEsIDQuMjA1MzY5OTVFLTF9LAorezMuNTM1MjkwOTZFLTEsIDQuMjkyMzEwNDhFLTEsIDQuNTk2OTkyNzNFLTF9LAorezIuODgwMTc5MjlFLTEsIDMuNzc5OTk5NjFFLTEsIDQuMzQwMTE2OThFLTF9LAorezMuNTU2ODM0NDZFLTEsIDMuODA3ODAwNDFFLTEsIDQuMjMxNDU1MzNFLTF9LAorezMuNDQzNTgyNjVFLTEsIDMuNzIxODQ4NzNFLTEsIDQuMzEyNjUzNTRFLTF9LAorezMuNTM5NjYxMTdFLTEsIDQuMTQxNjY2ODlFLTEsIDQuNDI5NDEzMDhFLTF9LAorezMuMDQ3NzAyMzFFLTEsIDQuMTI1MTc0ODhFLTEsIDQuMzQxODMxMjFFLTF9LAorezMuMzU5MTMzNjBFLTEsIDQuMjQ1OTA3NjZFLTEsIDQuNDYzNzg0NjlFLTF9LAorezMuNDM3MzgxOThFLTEsIDMuODQ3NjYyMjFFLTEsIDQuMzUyNzEzODJFLTF9LAorezQuMTA5NDEzMDNFLTEsIDQuNDA2NjI5ODBFLTEsIDQuNTIxMTMzOTBFLTF9fTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGV2cmNfbHNwcV9oYWxmX2NvZGVib29rMVsxMjhdWzNdID0geworezEuMzUyMjYzNDNFLTIsIDEuODIwODEyOTNFLTIsIDMuOTM5NDA2OTVFLTJ9LAorezIuMjkzOTI4OTBFLTIsIDMuNTc4MzExNThFLTIsIDEuMDUzNTI4ODZFLTF9LAorezIuMDkxMDY0ODZFLTIsIDMuMDQxNTkwNTZFLTIsIDguOTM5NDEwNzVFLTJ9LAorezEuODg5MDkwMDVFLTIsIDMuODI3MjIyMDZFLTIsIDEuMzc4MjA0MDhFLTF9LAorezIuMDUxNDM4MjBFLTIsIDIuODU0ODExNTlFLTIsIDcuMzk3NjIxODdFLTJ9LAorezQuNjk1MTAzMzJFLTIsIDYuODQwMzE5MTlFLTIsIDEuMDkxMjM4MTFFLTF9LAorezMuMTU1NTcxOTdFLTIsIDUuNjkxMzk5ODBFLTIsIDguNTcwNTc1NzFFLTJ9LAorezMuODExODE5MTFFLTIsIDcuNzc3ODQ2NjBFLTIsIDEuOTI1MzI4NTJFLTF9LAorezIuMTYyOTcxNTNFLTIsIDIuOTI5MDg5NDBFLTIsIDYuMjUwNDIwMjFFLTJ9LAorezMuMTE0MTQwMjJFLTIsIDUuOTkwNzkzMThFLTIsIDEuMDI4NjA2ODJFLTF9LAorezMuMDI3OTkzMDdFLTIsIDUuMzUwMTIzNzJFLTIsIDcuODA5MjU3NTFFLTJ9LAorezYuNTA4NDYyMTNFLTIsIDkuMDY2MjQ3MjBFLTIsIDEuNDI4NTA5NTBFLTF9LAorezMuMjczNDAzNjRFLTIsIDUuMDQwMjc3OTFFLTIsIDYuMjY0OTIyNzdFLTJ9LAorezUuMjc0Mzk4NjJFLTIsIDYuMjI1NzQyNzdFLTIsIDEuMjIxOTgzMzZFLTF9LAorezMuNDg4NDAzNTZFLTIsIDYuNDIyMjIzOTBFLTIsIDkuMTYwMjQ1OTVFLTJ9LAorezQuODg5ODQ0MzZFLTIsIDEuMDUwNTgwMjJFLTEsIDEuNjg4MTM0NTJFLTF9LAorezIuMzU3OTEwNzZFLTIsIDMuMjEwMzQ2NzdFLTIsIDUuNjA4OTk1NjNFLTJ9LAorezIuNzcyNTI4MTJFLTIsIDQuODcyODE3OTJFLTIsIDEuMDEyMjQxOTFFLTF9LAorezIuNzQzNDgwMTdFLTIsIDQuMDQ5NjU5MTVFLTIsIDkuMzQ5MjYxMjJFLTJ9LAorezQuMzgzNjAwNTBFLTIsIDYuMDMyNjEyOTJFLTIsIDEuNTI0MDA4NjZFLTF9LAorezIuNjg5OTQ5MjRFLTIsIDQuNTI5MDYzNzhFLTIsIDYuNDk4MDAzNzVFLTJ9LAorezUuMTYwNTg5NTJFLTIsIDYuMDgzMTIxNTJFLTIsIDEuMDg3OTk2MzZFLTF9LAorezQuMjAwNjQ5MjZFLTIsIDYuMTE4NDUxMDZFLTIsIDguNTQ0NzQwMDhFLTJ9LAorezcuMTM1MDI2OTBFLTIsIDEuMDE5NzIxMTFFLTEsIDEuNzQ2NDA5OThFLTF9LAorezIuODg5MDY2NzVFLTIsIDQuMTM5NjQzNTRFLTIsIDUuMjU5MjgwMjhFLTJ9LAorezMuMTYzNjQ0NjdFLTIsIDYuNjM1MzIwOTNFLTIsIDEuMjQ5NTAyNDVFLTF9LAorezQuMzAyODk1MDdFLTIsIDUuMTQwMjMyNjdFLTIsIDcuOTY4Nzc3NDJFLTJ9LAorezUuNzA5NzA3NzRFLTIsIDEuMDg0NDQ1MDRFLTEsIDEuNDQwNzU2MTdFLTF9LAorezMuMzg4NDAyNjFFLTIsIDUuMDQ3NDY4NDdFLTIsIDcuMjk3NjU0NDVFLTJ9LAorezYuNTQyNjU2NTdFLTIsIDcuOTA5ODc2ODVFLTIsIDEuMTU1NzA1OTBFLTF9LAorezMuODU0MjM1MjZFLTIsIDcuMzMxMjU0MzNFLTIsIDEuMDIzMDc1MTNFLTF9LAorezYuNTc4MjQ1MDFFLTIsIDEuMDI5MDk4MTFFLTEsIDIuMTE4NzQ0NDBFLTF9LAorezEuNTQ3Mjc4NjVFLTIsIDIuMDQ1NTk2OTVFLTIsIDUuNDYxMjEyNjJFLTJ9LAorezIuMjc5NTAxOTdFLTIsIDMuOTA5NTQyMDRFLTIsIDEuMTk0NDM4MjZFLTF9LAorezMuMDY4ODkxNzNFLTIsIDQuNTQ1NDAyMTVFLTIsIDguMjA0MTg4OTRFLTJ9LAorezIuMjU5NTcyNDFFLTIsIDQuNzkxMDE3MjVFLTIsIDEuNzE4NDQ0MDhFLTF9LAorezIuNzEwODgwMTVFLTIsIDQuMDE3Mzk1OTBFLTIsIDcuMDE5MjI4NDlFLTJ9LAorezQuOTU3ODkzNDlFLTIsIDcuOTI5NjMyODFFLTIsIDEuMDQ4NjI1MTFFLTF9LAorezMuMDYwOTU4NTNFLTIsIDUuNjQwNTk0MjlFLTIsIDkuNDk1ODQwOTdFLTJ9LAorezYuMzQyMjQ1NjRFLTIsIDkuMTE2NTU1MDFFLTIsIDEuODQ3MjQ0MDVFLTF9LAorezIuNDMzNDIzODhFLTIsIDMuOTE5OTgzMjhFLTIsIDYuMzE0MDYyMzNFLTJ9LAorezMuMzgwMTE5ODBFLTIsIDYuNjA4NDY0NTdFLTIsIDEuMTEwMzE1NDBFLTF9LAorezMuNTE3ODQwODBFLTIsIDUuNzkzOTcyNjlFLTIsIDcuMjA3MDI4NTdFLTJ9LAorezYuNDkwNTQwNTBFLTIsIDguNjU4MzE4OTdFLTIsIDEuNTQ2NDg3MzZFLTF9LAorezIuOTE5MzQ2NjVFLTIsIDUuMTYyMDQ1NzNFLTIsIDYuOTQ0MzczMjVFLTJ9LAorezUuOTQ1MjI4MDRFLTIsIDcuMTk4MjkyNzZFLTIsIDEuMjc0MzQ1MDdFLTF9LAorezUuMzE4ODg1MzBFLTIsIDYuMzgxODIwODlFLTIsIDkuODgyMTg0ODZFLTJ9LAorezguNjgyOTA5NjFFLTIsIDEuNDExMzUzNTBFLTEsIDEuOTE3Mjg0NThFLTF9LAorezIuNDk5OTExMzhFLTIsIDMuNjI1NTYwMThFLTIsIDUuMDM3MjQwMzFFLTJ9LAorezIuODIyNDYzNzdFLTIsIDUuNDQ1NzIyODZFLTIsIDEuMTI2NjM1MDBFLTF9LAorezMuNjI2MTgxMTlFLTIsIDQuNTkwNzMyMjNFLTIsIDkuNDMzNDM2MzlFLTJ9LAorezUuNzA0NTUzNDNFLTIsIDcuNDYzMDA0NDRFLTIsIDEuNTkxNTcxNzJFLTF9LAorezIuNzI5ODc0NjZFLTIsIDQuNTY2MjU4NTZFLTIsIDcuNTI1Mjk2NTFFLTJ9LAorezUuMTI4NjAxOTRFLTIsIDguNTExMjY5ODRFLTIsIDEuMjM1ODc5NzNFLTF9LAorezQuOTE0NTE5OTRFLTIsIDUuOTM0ODMxMTNFLTIsIDkuMjI2ODYwMTFFLTJ9LAorezcuMDY5NjE5MDBFLTIsIDEuMDU0NTE5NzlFLTEsIDEuOTI2MDIxNDNFLTF9LAorezIuODA3MzM3NjBFLTIsIDQuMTg1MDkyMDhFLTIsIDUuODcxNTk4MDVFLTJ9LAorezQuNjQ0NDkwMDNFLTIsIDcuMDY2OTg4MjBFLTIsIDEuMjYwMzg0MzJFLTF9LAorezQuMTg0NTM3MzhFLTIsIDYuMzA0NDUzMzFFLTIsIDcuNjYxNjk4NzZFLTJ9LAorezguNDI0MTY0MzVFLTIsIDEuMTMyODI4ODJFLTEsIDEuNDM2ODcxMTRFLTF9LAorezQuMTc2MTU2MjJFLTIsIDUuNTk0NzI5MjZFLTIsIDcuMDk4NzI4NDJFLTJ9LAorezUuNTUxNjEzODdFLTIsIDkuNTAxMjY3MjJFLTIsIDEuMjc3MjcxOTZFLTF9LAorezUuOTA5MzU0OThFLTIsIDcuMzY3MzAwMjRFLTIsIDkuNjU5MzU4ODZFLTJ9LAorezcuODQxMzY2NTNFLTIsIDEuNDE0MzIzNjBFLTEsIDIuMTc0Mjg2NDBFLTF9LAorezIuMTA0OTA1NDNFLTIsIDIuOTE4OTEwNDJFLTIsIDQuNjAwMzU3NjRFLTJ9LAorezMuNjQ4NjMyNzZFLTIsIDQuNjIzODcwMThFLTIsIDEuMDcwNDQxNjhFLTF9LAorezIuNjg2NTIxMjJFLTIsIDMuOTI5Mzc1NDhFLTIsIDguNDExNzk5MzdFLTJ9LAorezIuNzI5MDM5NDVFLTIsIDUuNTM4MDUwNDZFLTIsIDEuNDE1ODYxNzBFLTF9LAorezIuNDg0NzY2OTVFLTIsIDMuNjMyNzc2ODFFLTIsIDcuNjI0MzA4NzZFLTJ9LAorezUuMjU0MzA4MTNFLTIsIDcuNzU3Nzg2NjZFLTIsIDEuMTQ1Njc5NjVFLTF9LAorezQuMDc3NDE0NDJFLTIsIDUuMzk5MjM3OTVFLTIsIDkuMDc2NDA0NTdFLTJ9LAorezUuNzMwNDMzMDJFLTIsIDcuNjU4MDMwODRFLTIsIDEuNzk1Nzg5NzVFLTF9LAorezIuNDYwMzI0MjFFLTIsIDMuNDE0MDgzNjRFLTIsIDYuNzg5OTA3ODFFLTJ9LAorezQuMDgyMjAwNjhFLTIsIDYuMjk3ODM3OTRFLTIsIDkuOTUxOTEyNjFFLTJ9LAorezMuODMwMjUwMzVFLTIsIDUuNTI4NTc0ODFFLTIsIDcuOTAwMTkzMzNFLTJ9LAorezcuMjQxMTEyNzRFLTIsIDEuMDE5MDM4NjNFLTEsIDEuNDY5Nzk2NDVFLTF9LAorezMuNzM5MDIxNzJFLTIsIDQuNzA0NjM4OTRFLTIsIDYuNTQ2ODQ1MjlFLTJ9LAorezUuMjczOTc1NDNFLTIsIDYuNzI3NzAzNjZFLTIsIDEuMzk2ODA0MzBFLTF9LAorezQuMDUzNjUzNzhFLTIsIDcuMDUwODEyOTlFLTIsIDkuMjU2Njg2MjdFLTJ9LAorezQuNDM0MjUyNTNFLTIsIDEuMTAzNjcxNzFFLTEsIDEuOTk2MzYyNjZFLTF9LAorezIuNTQ5MjA3NDBFLTIsIDMuNDc2MDM5NjlFLTIsIDYuMDU5MDIwMzlFLTJ9LAorezQuMzU0NjU1MDBFLTIsIDUuMzIzNjk1MDJFLTIsIDEuMDgzMjU5NjZFLTF9LAorezIuNzk1OTk4MTlFLTIsIDQuOTEzMjQ3NzVFLTIsIDguODQyODQ1MjZFLTJ9LAorezQuOTgwNTE4NjdFLTIsIDguODE3Mjg5MDJFLTIsIDEuNTI1OTczMjNFLTF9LAorezMuMTkzNDYyNjRFLTIsIDQuNjIxNjkzMTJFLTIsIDYuODUyMDY0MjhFLTJ9LAorezUuODAyNDYzMDBFLTIsIDYuODQyNjg2OThFLTIsIDEuMTUwODUyODFFLTF9LAorezQuMzM5MDQ2NzhFLTIsIDYuOTA1NzU2MTVFLTIsIDguNDQ5ODQzNTNFLTJ9LAorezcuMzk2OTE1NTZFLTIsIDEuMTkyNDA1MTVFLTEsIDEuNzczNDAxOTVFLTF9LAorezMuMTg3Njc1MDNFLTIsIDQuNTk2OTc0MzNFLTIsIDUuNzIzNzI2MzhFLTJ9LAorezQuNTA4NzM4MjJFLTIsIDUuNjY1MDkzNjZFLTIsIDEuMzIwMDU4MjZFLTF9LAorezQuNTkwOTcwMjhFLTIsIDUuNDU1ODA0MjRFLTIsIDguNjE0MjMzMTRFLTJ9LAorezcuNDQ2ODU3NTRFLTIsIDEuMTM4MTU0MDRFLTEsIDEuNjE1NzA1OTRFLTF9LAorezMuOTc1MDk1NjBFLTIsIDQuOTUzNTk0ODhFLTIsIDcuMjI1NDIyNTZFLTJ9LAorezYuNzYyNTc3NTlFLTIsIDguMzEwMjkwNDNFLTIsIDEuMjc5OTAxMTJFLTF9LAorezUuNzYyNTgwNzhFLTIsIDYuOTUzMjY0MDNFLTIsIDEuMDUwMTI5NjhFLTF9LAorezYuODUzMTM0OTNFLTIsIDEuMjE3NTg4MjZFLTEsIDIuMjA2MjY1NDhFLTF9LAorezIuMTg0ODA0NzJFLTIsIDIuOTkxMzA5MjBFLTIsIDUuMTYyMDgwMDBFLTJ9LAorezMuNjQzNDMxNTFFLTIsIDQuOTE3OTUwNTZFLTIsIDEuMjMyNzcyMTBFLTF9LAorezMuODk2MTEyNzRFLTIsIDQuNzY2MzQ5ODdFLTIsIDguNjE3MTY1NjhFLTJ9LAorezQuMTQ2MzUxNjdFLTIsIDYuODgwMDY5NTJFLTIsIDEuNjkzNTYxNTJFLTF9LAorezMuMzU1MTQ2MjBFLTIsIDQuMTc4MTUxODZFLTIsIDcuMzcxNTk0MDFFLTJ9LAorezUuODAyMjQ2OTNFLTIsIDguNzAzMTQxNjZFLTIsIDEuMTI5MTc0OThFLTF9LAorezQuODAyNDMxMTdFLTIsIDUuNjk0ODY1MDZFLTIsIDEuMDA3NTU3MDZFLTF9LAorezUuOTg4NzMxMjRFLTIsIDguNTc5NDIzMjhFLTIsIDIuMDEzODg4NTFFLTF9LAorezIuOTkzMDk5OTVFLTIsIDMuOTQ4Mjg0MzFFLTIsIDYuNDYzNzYwODhFLTJ9LAorezMuODg2MjY2MDVFLTIsIDguMDc0NDM2MzRFLTIsIDEuMTU1MTk3ODRFLTF9LAorezMuNDk0NDQwMDJFLTIsIDYuMjg5MTEwMzNFLTIsIDguMDQ5ODIwMzZFLTJ9LAorezYuODg4MTc4NzRFLTIsIDkuOTI0MzExMTlFLTIsIDEuNjAzOTMyNTNFLTF9LAorezMuNjQyMzc2NTFFLTIsIDUuMzQwMTY0NTNFLTIsIDYuNzAxNTIwMDlFLTJ9LAorezUuODM0OTI3NDFFLTIsIDcuODUyODU3NTZFLTIsIDEuNDE3NDY3MTVFLTF9LAorezQuODY0Njk2NDFFLTIsIDcuMjY3MzY4NThFLTIsIDkuNDgzMTU4NTlFLTJ9LAorezUuODU1MzM2MDRFLTIsIDEuMzYyODk3NDZFLTEsIDEuOTg2Mzk3MzZFLTF9LAorezIuNjA4ODg1MDZFLTIsIDMuNzM0MDY4MjBFLTIsIDUuNTc4NTMxNzBFLTJ9LAorezQuNTg1MDQ0MDlFLTIsIDUuNjA1MTI1MDVFLTIsIDEuMTc5Mjc4NzJFLTF9LAorezQuMjg4MDEzMjhFLTIsIDUuMTQ3MzkxMTlFLTIsIDkuNzUzMDkwMTRFLTJ9LAorezYuMzc2MTE1OThFLTIsIDguNzM1NTI5MzNFLTIsIDEuNjgzMzQ5MTZFLTF9LAorezMuNzY3MDk5MjNFLTIsIDQuNTgyMTYwMzRFLTIsIDcuODY1MjgxNDBFLTJ9LAorezYuNzUxOTQ1NjFFLTIsIDguOTg2OTc4OThFLTIsIDEuMTk0MTgxMTRFLTF9LAorezUuNDYzNzQyNDZFLTIsIDYuNjY4MDU4NzhFLTIsIDguOTM4MTM4MTlFLTJ9LAorezcuNzMwODY1NDhFLTIsIDEuMjE3NTQ0MTVFLTEsIDEuOTk1NzkyMjRFLTF9LAorezMuMTU2MjEzMDlFLTIsIDQuNTE3MDIyMTVFLTIsIDYuMjU3Njg1MjdFLTJ9LAorezMuNzg3ODI2NzVFLTIsIDguMDM0ODY0ODFFLTIsIDEuMzg5NjE2ODhFLTF9LAorezUuMDgzMDMyNzBFLTIsIDYuMTg3NDA1ODFFLTIsIDguMzExNTM4NDBFLTJ9LAorezguOTYzMTE0MDJFLTIsIDEuMjg3NTM3NjZFLTEsIDEuNjQ4OTE1ODZFLTF9LAorezQuNzM1MDM0NzBFLTIsIDUuNzU3MjQzNTZFLTIsIDcuNjUyNjQ2MzBFLTJ9LAorezcuMTY4OTg1OTBFLTIsIDkuODk4OTU2ODdFLTIsIDEuMzAwNzgzNjBFLTF9LAorezYuMjkwODI1NDZFLTIsIDcuOTA3Nzg3NzFFLTIsIDEuMDUxMTEwNjNFLTF9LAorezguODA2NDk4MzVFLTIsIDEuNjUyMDYxNjRFLTEsIDIuMTMyMTQxNzRFLTF9fTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGV2cmNfbHNwcV9oYWxmX2NvZGVib29rMlsxMjhdWzNdID0geworezkuNzU5MTUyNjhFLTIsIDEuMjM3MDE0OTBFLTEsIDEuNjk0Mzc5NzVFLTF9LAorezkuNDk1MzYzMzhFLTIsIDIuMDEwODE3NjhFLTEsIDIuMjY4NTUyNDhFLTF9LAorezkuMDA0OTY2MTdFLTIsIDEuNDkxNjQ4NzBFLTEsIDIuMjY1MzI3ODdFLTF9LAorezEuNzAzMDI3MDRFLTEsIDEuOTcyMjI4NzRFLTEsIDIuNDk5NzQ4MzJFLTF9LAorezEuMDg3NzM2NDFFLTEsIDEuNTE5NzI0MjhFLTEsIDEuNzUxMjMzNjRFLTF9LAorezEuMzAyNzg5MzBFLTEsIDIuMTMyMjkxNjRFLTEsIDIuMjk2NDYzNTVFLTF9LAorezEuMjQ5MTc5OTFFLTEsIDEuODczNDc3NTVFLTEsIDIuMDQ3MTIwMDNFLTF9LAorezIuMDA2NzAxOThFLTEsIDIuMjg5NjM1NjlFLTEsIDIuNjk0MjA4MDNFLTF9LAorezguOTgzNzU1ODZFLTIsIDEuMjUzMzI3NThFLTEsIDIuMTA1Mzk0MzBFLTF9LAorezkuNjIzNzY2NjlFLTIsIDIuMDcxODU4NTBFLTEsIDIuNTQxNzQ0NzFFLTF9LAorezEuMDU2OTQ2MjlFLTEsIDEuNzg4NTY0MThFLTEsIDIuMDAxMjEwMTVFLTF9LAorezEuNTYwNDg5NjhFLTEsIDIuMTk1NzM3MjFFLTEsIDIuOTEwNzk0MDJFLTF9LAorezEuMzczOTIyNjhFLTEsIDEuNTk5OTMzMzZFLTEsIDEuOTQ2OTg1NDJFLTF9LAorezEuMDcyNjI1MDBFLTEsIDIuMzc3OTA5NTdFLTEsIDIuNzA3NDA4MDdFLTF9LAorezEuNDI5NzY0NDhFLTEsIDIuMDE1NTA0OTlFLTEsIDIuMTg0Njg5MzRFLTF9LAorezIuMTQyNzA0ODdFLTEsIDIuNzE4ODE0MDJFLTEsIDMuMDEyMDAyMTFFLTF9LAorezEuMTA3MjkyMTBFLTEsIDEuMzM2ODgyMjZFLTEsIDEuNTQ4NzcxNTZFLTF9LAorezEuMDY2Njc2NjBFLTEsIDEuNzY2Nzg4MjFFLTEsIDIuNjI3OTg5MDVFLTF9LAorezkuMTYzNTI5NDNFLTIsIDEuNzQ1OTI4MzhFLTEsIDIuMTkzMjkzMjdFLTF9LAorezEuODQwMzg2MjRFLTEsIDIuMjc5NjQwNTlFLTEsIDIuNDc3NjIyMDNFLTF9LAorezEuMTA1NzIzNjBFLTEsIDEuNTgyMDcxNjNFLTEsIDEuOTYwMTMwNjNFLTF9LAorezEuMzM1NDMzODdFLTEsIDIuMzIyNjk2NjBFLTEsIDIuNTE4MjgxNjRFLTF9LAorezEuNTU5MjIzMDlFLTEsIDEuNzc5NDEzMzdFLTEsIDIuMTgwOTY2NDRFLTF9LAorezEuOTIyNjAwNzJFLTEsIDIuNDk1MTI0NzlFLTEsIDIuODk5MTE1MDlFLTF9LAorezEuMTM3MDg5MDZFLTEsIDEuMzc4NzI0NDNFLTEsIDIuMDI5Mjk4ODRFLTF9LAorezEuMDI1NTc1MzJFLTEsIDEuODQ4MjAwNzFFLTEsIDIuOTIxNjQ2MjRFLTF9LAorezEuMzY1OTU2MjJFLTEsIDEuNTg2ODc0MjhFLTEsIDIuNDEzOTk1NTZFLTF9LAorezEuNzI4MTM4MThFLTEsIDIuNDkzMDM0MTVFLTEsIDMuMDA0NTg2MTBFLTF9LAorezEuMzY4NzExNzRFLTEsIDEuNTcyNDk4MjNFLTEsIDIuMTA5MTMxNTJFLTF9LAorezEuMjg5NzQ4MTBFLTEsIDIuNDUxNjc4NjZFLTEsIDIuNjc2NTM1ODRFLTF9LAorezEuNjY4MTIyNTZFLTEsIDEuODg5OTgwMjlFLTEsIDIuMzEzNDU5MjJFLTF9LAorezIuMzIyNDg0NzBFLTEsIDIuNjMxOTYwNTFFLTEsIDMuMTY3NTQ5MzdFLTF9LAorezkuMjQ1NjA5NDlFLTIsIDEuMTk5Nzc0NTJFLTEsIDEuOTEyNjIyNzVFLTF9LAorezEuMTMwODUyNjJFLTEsIDIuMDg0NjE1MzhFLTEsIDIuMjkzNjgxMjBFLTF9LAorezEuMDA3MTY0MDVFLTEsIDEuNDA2NzAwNzZFLTEsIDIuNTgwNjI5NTlFLTF9LAorezEuNjcwMTAzODJFLTEsIDIuMTgxMDU1NDBFLTEsIDIuNjI1OTI0OTRFLTF9LAorezEuMjU0ODcyMzhFLTEsIDEuNjI2ODY5NTlFLTEsIDEuODQ0MDkyMzFFLTF9LAorezEuNTI0MDY1NThFLTEsIDIuMDcxMzE3MjlFLTEsIDIuNDc1ODI0MzZFLTF9LAorezEuMzc0NDEyMDNFLTEsIDEuODAyNjIzNzJFLTEsIDIuMTc2OTg4NDJFLTF9LAorezIuMDc4NTM1MTFFLTEsIDIuNDkyMDk1MDhFLTEsIDIuNjk4MzAxMDhFLTF9LAorezkuMzUyNTczMDFFLTIsIDEuNDkxOTczNTVFLTEsIDIuMDQ2NTIwNDFFLTF9LAorezEuMTE5OTcxODBFLTEsIDIuMjUyMzMwNjNFLTEsIDIuNDcwMDMwNDlFLTF9LAorezEuMDkzMTUwMTVFLTEsIDEuOTM4MTE4NzlFLTEsIDIuMTM4MDIxODlFLTF9LAorezEuNzUxMTg1ODBFLTEsIDIuNTI1MjAyNjNFLTEsIDIuNzUwODI3NjdFLTF9LAorezEuMzY5MTg3MzhFLTEsIDEuNzc0NDA1NjlFLTEsIDEuOTc5MzExNDFFLTF9LAorezEuMzY4MTEyNDJFLTEsIDIuMzc0MjYxNzdFLTEsIDIuODQ3Mzc4MjVFLTF9LAorezEuNjA3NTk3OTJFLTEsIDIuMDA4MzMxNTdFLTEsIDIuMTgwODQ0ODRFLTF9LAorezIuMzM3MTAyNDRFLTEsIDIuNjYzNzI1NjFFLTEsIDIuOTE4MDIwNDlFLTF9LAorezEuMTkxNzEwOTBFLTEsIDEuMzk3MDMxNjlFLTEsIDEuODc3MjMyNDlFLTF9LAorezEuMzEwNDk5NDZFLTEsIDEuOTM2OTY2NjNFLTEsIDIuNjA0MjY5OThFLTF9LAorezEuMDgyNjcwNDdFLTEsIDEuNjUxOTQ3OTVFLTEsIDIuMzk1MjMwMjNFLTF9LAorezIuMDMxOTUwMjFFLTEsIDIuMjU5NDIyMDlFLTEsIDIuNDk0MDMyMzhFLTF9LAorezEuMjM4NDI5MzJFLTEsIDEuNDU3OTQ2MTVFLTEsIDIuMTU2MzU2MjhFLTF9LAorezEuNzEyMjYzMzhFLTEsIDIuMzgwNTQ1MjlFLTEsIDIuNTc5NzU2MzhFLTF9LAorezEuNjY5MjM4MzZFLTEsIDEuODg2MDQ2NjhFLTEsIDIuMTExMjQyMTJFLTF9LAorezIuMTA2MjA3NDZFLTEsIDIuNjI0NDI3MDhFLTEsIDIuODMxMjc5NjRFLTF9LAorezEuMDU3NDg4MTBFLTEsIDEuMzYyODY0ODJFLTEsIDIuMjAwNTAxODZFLTF9LAorezkuNzI5NDU3NjVFLTIsIDIuMzM0NzE1MjhFLTEsIDIuOTYxMTM5NjhFLTF9LAorezEuMzQyOTgzNjlFLTEsIDEuOTM5NTU0MzZFLTEsIDIuMzkxNDg4MjVFLTF9LAorezEuNjQyMjkzMThFLTEsIDIuNzAwNjc3NTFFLTEsIDIuOTQxNDI0ODVFLTF9LAorezEuNDI3NjAyNjJFLTEsIDEuNjUwMzMzNTVFLTEsIDIuMjQxMDAzODFFLTF9LAorezEuNDY0MTQ1MzNFLTEsIDIuNDc5NDIzMjhFLTEsIDMuMDA3MDgxMTVFLTF9LAorezEuNzQ3Nzg3NzRFLTEsIDIuMTkzNDkyNTBFLTEsIDIuMzgxNjI5NjVFLTF9LAorezIuMzYzMTExMjNFLTEsIDIuOTA2Njk2ODBFLTEsIDMuMjgwMTA5NzZFLTF9LAorezEuMTQwNzY0MjhFLTEsIDEuMzMwNzE0MDhFLTEsIDEuNzMxODE1MDRFLTF9LAorezEuMTM1NzU4MzlFLTEsIDEuOTAzMDcyNzRFLTEsIDIuNDE2ODExODhFLTF9LAorezguNTkxNjUyNjZFLTIsIDEuNjM5MjAyMzlFLTEsIDIuMzc5MzQ1MDBFLTF9LAorezEuOTI5MTY5NDVFLTEsIDIuMTUwODIzOTJFLTEsIDIuMzkxMjgxMjhFLTF9LAorezEuMzcyOTE4MzRFLTEsIDEuNTk0MjMzMDdFLTEsIDEuNzk3MjIyMjBFLTF9LAorezEuNDA0MzUzODNFLTEsIDIuMjIwOTIyNTZFLTEsIDIuNDA5NjA3NDdFLTF9LAorezEuNDAzODcxNjNFLTEsIDEuODk2MDExNjhFLTEsIDIuMDU2MzU2OTdFLTF9LAorezIuMTE2OTU1MDdFLTEsIDIuMzY1NzgzNjBFLTEsIDIuODEyNDg5MjdFLTF9LAorezkuMDMwMTA1OTJFLTIsIDEuMjcxNTc0MDVFLTEsIDIuMzM1Njc5MjNFLTF9LAorezEuMTAxMTgwNTRFLTEsIDIuMDkzMjgzOThFLTEsIDIuNzI4MzYyNjhFLTF9LAorezEuMTY3MTA0MTdFLTEsIDEuNzc4NTM5ODdFLTEsIDIuMjI4MDg3NDhFLTF9LAorezEuODE2OTE1NDJFLTEsIDIuMzIyNjUxNTlFLTEsIDIuNzQ5OTEyMTRFLTF9LAorezEuNDY1NTM0NzJFLTEsIDEuNjk0NzQ3MDZFLTEsIDEuOTAyNDU5NTZFLTF9LAorezEuMDkyMTM3OTJFLTEsIDIuNjMyOTE5NTVFLTEsIDIuODg0OTA3NzJFLTF9LAorezEuNDk4MTUxMjdFLTEsIDIuMTEzNDI3MDdFLTEsIDIuMjg4OTk0NDlFLTF9LAorezEuOTc2NDU1MDBFLTEsIDIuODMyMjk5NDdFLTEsIDMuMTQ4ODIyNzhFLTF9LAorezEuMjQ0OTU2MDNFLTEsIDEuNDYwOTc5NzNFLTEsIDEuNjYxMjUyMDhFLTF9LAorezEuMzQ4Nzg1OTFFLTEsIDEuODMwMzAwNTRFLTEsIDIuODkyODgyODJFLTF9LAorezkuMzMwMzIxMTBFLTIsIDEuODM5NjIyMTFFLTEsIDIuMzg1NDMwMDRFLTF9LAorezEuOTI4NDQyNTdFLTEsIDIuMzk1ODgzMzVFLTEsIDIuNTg0MjE1NDBFLTF9LAorezEuMjM3OTY3OThFLTEsIDEuNjU1NTY1OTVFLTEsIDIuMDg0MDgzODZFLTF9LAorezEuNTExNDQzNDFFLTEsIDIuMzU4MDExMTZFLTEsIDIuNTkyODA2MjJFLTF9LAorezEuNTA2NTc3MjhFLTEsIDEuOTAwNTI1MjRFLTEsIDIuMjgzNjI1OTBFLTF9LAorezEuOTgxODA5NTlFLTEsIDIuNTY3OTQyMTRFLTEsIDMuMDg5NzU2MzdFLTF9LAorezEuMjg0OTAwMzFFLTEsIDEuNDkwODQwMTdFLTEsIDEuOTgzNzY1MDdFLTF9LAorezkuMjA1OTU3NTBFLTIsIDIuMTIyMzEyOTNFLTEsIDIuOTI5NDg4NDJFLTF9LAorezEuNDE2OTgxMzdFLTEsIDEuNzIzNTY2ODBFLTEsIDIuNTg0NTQxNDRFLTF9LAorezEuOTY3MzM0NjBFLTEsIDIuMjk3MDk3MzBFLTEsIDIuOTU3ODAxODJFLTF9LAorezEuNDcwNjIyMjdFLTEsIDEuNjg5MTgwODhFLTEsIDIuMDczNjM2MzVFLTF9LAorezEuMzYzMDk4NzdFLTEsIDIuNjAzNzMwNTZFLTEsIDIuODI2MDczNzdFLTF9LAorezEuODEwNDEwNzdFLTEsIDIuMDE4MjYxNDBFLTEsIDIuMzg4Njc1NTFFLTF9LAorezIuNDUzMjYyNjZFLTEsIDIuODAxODMwNzdFLTEsIDMuMTE5NTQzMTlFLTF9LAorezEuMDQxMzE3NjZFLTEsIDEuMzMwNDA2NTJFLTEsIDEuODk4MzQ2ODRFLTF9LAorezEuMjMyOTgxNDZFLTEsIDIuMDk2MjEwODdFLTEsIDIuNDc4MTMyMTBFLTF9LAorezEuMjQwNDA3NzVFLTEsIDEuNTk4MjczNjZFLTEsIDIuNTg4NTYwNThFLTF9LAorezEuODcwNDg4NjdFLTEsIDIuMTI0ODgxMDBFLTEsIDIuNTk2MjkxMzBFLTF9LAorezEuMjQyNTUzMDdFLTEsIDEuNzM3Njg5NTJFLTEsIDEuOTI4NTAwMjRFLTF9LAorezEuNTg5MTc4MjlFLTEsIDIuMjUzODk4MjNFLTEsIDIuNDMyODQ3NjJFLTF9LAorezEuNTM0MjExNDlFLTEsIDEuOTE4MDczMTVFLTEsIDIuMDkyNDk1MjZFLTF9LAorezIuMjcxNTQ0NDlFLTEsIDIuNTExODExNTVFLTEsIDIuNzI2MDAzNTNFLTF9LAorezEuMDk5MjIwNTlFLTEsIDEuNTcxMDAyNzVFLTEsIDIuMjAwMjQ5NzNFLTF9LAorezEuMzI3ODIzNTVFLTEsIDIuMTk0ODU1MDZFLTEsIDIuNjcwMjg5MjhFLTF9LAorezEuMjY4NTc1MDRFLTEsIDEuOTg4MzYzMTJFLTEsIDIuMTc5Mjg0OTlFLTF9LAorezEuOTE0MTUwMjdFLTEsIDIuNTI0MjQyNDBFLTEsIDIuNzI2NTI3NDVFLTF9LAorezEuNTUyNzc2MjVFLTEsIDEuNzk1NzM1MjFFLTEsIDIuMDA3NzM2MjdFLTF9LAorezEuMTc1NDc3NDNFLTEsIDIuNDc4Njk4NjRFLTEsIDMuMDgyNzkzMzVFLTF9LAorezEuNjU3MDY5NzdFLTEsIDIuMTAzMzk1MDJFLTEsIDIuMjkxOTkzMjBFLTF9LAorezIuMjU2OTQ5MTBFLTEsIDIuODQ0MzgxOTNFLTEsIDMuMTIxMDYwNzNFLTF9LAorezEuMjk1MDMxNzZFLTEsIDEuNDg0MjAwNTFFLTEsIDEuODAxODA0MDFFLTF9LAorezEuNTQ3NTI1MDhFLTEsIDEuOTc3NDg0NjdFLTEsIDIuNjcyNzUwMzVFLTF9LAorezEuMjg1OTAyNDFFLTEsIDEuNzYxNzgzODFFLTEsIDIuMzk5MDU4NjRFLTF9LAorezIuMTQ5MjY3NjRFLTEsIDIuMzc2MzQ0MzVFLTEsIDIuNTg3OTQwMTBFLTF9LAorezEuMjgzMjIzMThFLTEsIDEuNTkzMzg1MTlFLTEsIDIuMjY2MjY2MDVFLTF9LAorezEuNTU3NDc1NDhFLTEsIDIuNDc3NDA1MjJFLTEsIDIuNzM3MjY4MjFFLTF9LAorezEuNzU3NDE2ODdFLTEsIDEuOTc5NTIzNDVFLTEsIDIuMTkxMTU5NDNFLTF9LAorezIuMTg2MjYzNjVFLTEsIDIuNDU4MDkxODNFLTEsIDMuMDA0Nzk2NTBFLTF9LAorezEuMTc3MDkwMThFLTEsIDEuNDU1MTI4NjRFLTEsIDIuMzgwNDQ0NzFFLTF9LAorezEuMTgwMDY4OTNFLTEsIDIuMjM3NzU1MjFFLTEsIDIuOTQxNzUwODhFLTF9LAorezEuNTEzNDkyMDJFLTEsIDEuODgxNTc4MTJFLTEsIDIuNDg3NDMyODFFLTF9LAorezEuODkzMTIyMDVFLTEsIDIuNjk1ODA1NDNFLTEsIDIuOTM3ODU5ODlFLTF9LAorezEuNDk4OTU1OTRFLTEsIDEuNzQ1MzcyNTZFLTEsIDIuMzc0MzAwMDZFLTF9LAorezEuMzk3NzU1MzBFLTEsIDIuNzE3MDkzODNFLTEsIDMuMDc4Mzk1MTNFLTF9LAorezEuODM5NDU3MzBFLTEsIDIuMDc3MTcxNjVFLTEsIDIuMjY3MjIxNTFFLTF9LAorezIuNTQ1NTIxNTZFLTEsIDIuOTY2NDA5MzNFLTEsIDMuMjQ4MDE0NDVFLTF9fTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGV2cmNfbHNwcV9oYWxmX2NvZGVib29rM1syNTZdWzRdID0geworezIuMzY5MDQ3MjVFLTEsIDIuNTYxMDQzNTBFLTEsIDMuMTY5NTU3NDVFLTEsIDQuMDc1MjA1MzNFLTF9LAorezIuOTc1OTY5MzFFLTEsIDMuMjM0ODI0NTRFLTEsIDMuNDc2Njc1MTVFLTEsIDMuNzQ1NTEyMzdFLTF9LAorezIuNzM3MjExNTlFLTEsIDIuOTgyOTc1MjRFLTEsIDMuMjk5MjM5MjhFLTEsIDMuODM1OTkxMDJFLTF9LAorezMuMDc4NDk1ODZFLTEsIDMuMzI4MzYyNzBFLTEsIDMuODkzNDAzNDFFLTEsIDQuMDU1NzU5OTFFLTF9LAorezIuMzM4MDM2MTVFLTEsIDIuNjAyOTY1MjRFLTEsIDMuNjczNTE5NDlFLTEsIDQuMDQzODgyNDlFLTF9LAorezIuOTc1MTM2NjRFLTEsIDMuMTUzNTY1NTNFLTEsIDMuODUxMzUyMzNFLTEsIDQuMDIxOTcxMjNFLTF9LAorezIuODU2MTg3ODJFLTEsIDMuMTA4NzI3OTNFLTEsIDMuNjUwMjIzNjFFLTEsIDMuODQ4MTY3NjZFLTF9LAorezMuMzUyNzE1OTdFLTEsIDMuNTUyMjIyMjVFLTEsIDMuODE5MjExMTNFLTEsIDMuOTg2ODU3NTNFLTF9LAorezIuMDAyNjU2MDFFLTEsIDIuNTA1MDIyODhFLTEsIDMuNzAzOTgyMjNFLTEsIDQuMzIwMTI2NzdFLTF9LAorezMuMDc5ODIwODdFLTEsIDMuMzM3Njc3MTJFLTEsIDMuNTgxOTkwNjBFLTEsIDMuNzgzODY3OTZFLTF9LAorezIuNjAwODYxMTlFLTEsIDMuMjU1MjAyNzdFLTEsIDMuNTY4NzMzMzNFLTEsIDMuODQ3Mzc3OTBFLTF9LAorezMuMDEzNTYzNzVFLTEsIDMuNDEzNjkzOTBFLTEsIDQuMDAyOTY3NDhFLTEsIDQuMTczMzcxNzlFLTF9LAorezIuNjcwODA5NjNFLTEsIDIuOTc2NzQzNThFLTEsIDMuNjk3MDIwNDFFLTEsIDMuODkxMzkyMzVFLTF9LAorezIuNzI2Njk4NTJFLTEsIDMuNDk3MDQwODdFLTEsIDMuOTE5MjUyNzVFLTEsIDQuMDYzODMyNzZFLTF9LAorezIuNTI4MjU5MTZFLTEsIDMuNDk2MzY1NTVFLTEsIDMuODQ1NTA5ODlFLTEsIDQuMDU5MzA5OTZFLTF9LAorezMuNDI5MjcwOThFLTEsIDMuNzQyNzQwMTVFLTEsIDQuMDU0NjgxNjZFLTEsIDQuMjAzNTE5MjNFLTF9LAorezIuNTI0MDg3NDNFLTEsIDIuODAzNzU4MzhFLTEsIDMuMjE0MzY1ODRFLTEsIDMuODg0MzY5MTNFLTF9LAorezIuOTY5NzAxODlFLTEsIDMuMTcxNzM2MDBFLTEsIDMuNjUzNDI1NTdFLTEsIDQuMDI3MzY4NDNFLTF9LAorezIuODE5MDUxNzRFLTEsIDMuMDE0NzkxNjFFLTEsIDMuMzQzMzU2MjVFLTEsIDQuMDc2MzM0ODNFLTF9LAorezMuMjY4NzI5NDVFLTEsIDMuNDcxNzc2ODRFLTEsIDMuNzUwMTc3MDNFLTEsIDQuMDUzNzIzODFFLTF9LAorezIuMzYzNzExNDVFLTEsIDMuMTY0NDEwNTlFLTEsIDMuNDg3MDcwMjBFLTEsIDMuODIwMzA0MjdFLTF9LAorezIuODc4MTc1OTdFLTEsIDMuMTM2MjcwMDVFLTEsIDQuMDUxMjk3MzFFLTEsIDQuMjMzNzk2NjBFLTF9LAorezIuNzc1MDI0NzdFLTEsIDMuMDE4NDM4MjJFLTEsIDMuNzIyNTA4NTVFLTEsIDQuMTkyMTI4MThFLTF9LAorezMuMjg5ODg4NTBFLTEsIDMuNjE5MDExMDRFLTEsIDQuMDIwMTU1MDdFLTEsIDQuMTkyMjk4MDVFLTF9LAorezIuMjQ5NjA0NjFFLTEsIDIuNzQ2MzYzODhFLTEsIDMuNzcwMTYxMjdFLTEsIDMuOTQ3MjY1MTVFLTF9LAorezMuMDEwNDU0NzdFLTEsIDMuNDA0ODYxNjlFLTEsIDMuNzQ4ODgxMjJFLTEsIDQuMDI1MzIxNjBFLTF9LAorezIuNTk4OTc5NDdFLTEsIDMuMzAzMzQ5NjFFLTEsIDMuNTc0OTM4MThFLTEsIDQuMDg2NTc5NjhFLTF9LAorezMuMDA5NjE4NTJFLTEsIDMuNTY0NDkwNjhFLTEsIDQuMDQ3Nzk0OTRFLTEsIDQuMjI1MDg5NTVFLTF9LAorezIuMjA5Nzk1ODZFLTEsIDMuMTY0Nzc2NTZFLTEsIDQuMDE3NDQwNjhFLTEsIDQuMjA3MzU3NzZFLTF9LAorezIuNzk3NTQ5OTZFLTEsIDMuMzA3NzYwOTVFLTEsIDQuMTExNTI4OTlFLTEsIDQuMzI2ODcwNDRFLTF9LAorezIuNjQyNDY4ODFFLTEsIDMuMTY2MTA2MzRFLTEsIDMuODM4NzY3NDFFLTEsIDQuMzY2ODM3NzRFLTF9LAorezMuNDQzODExNTRFLTEsIDMuODUzNjU2NjVFLTEsIDQuMjQ5NDk0NjdFLTEsIDQuNDE1NjAyMDlFLTF9LAorezIuMTk0ODgzMDhFLTEsIDIuMzY0NTk4ODFFLTEsIDMuNDI0NjU5OTdFLTEsIDQuMjQ5ODk5OThFLTF9LAorezIuOTE0NjUxMDRFLTEsIDMuMjIyODIwMTZFLTEsIDMuNzI4NTI4MDJFLTEsIDMuOTE2MzU4OTVFLTF9LAorezIuNzQ3OTI0MzNFLTEsIDMuMTY1MzYzMDdFLTEsIDMuNDUzOTI1ODVFLTEsIDMuNzQ1NTUyMzBFLTF9LAorezMuMTA1ODM0NzJFLTEsIDMuMzUyNjQ5MjFFLTEsIDMuODc1MjcyMjdFLTEsIDQuMjMwNzYyMTJFLTF9LAorezIuMjMyMTE1MTJFLTEsIDIuOTg0OTc2MTdFLTEsIDMuNjg0MjYyMDRFLTEsIDMuOTAyMTM3MjhFLTF9LAorezIuODkwNzg4MzJFLTEsIDMuMjY1MTI3NTRFLTEsIDMuNzYzMDg2ODBFLTEsIDQuMDk1NTM3MDdFLTF9LAorezIuNjM4MzAxMjVFLTEsIDMuMDg5NzcyNDZFLTEsIDMuODE0NTMwMzdFLTEsIDQuMDQ2NjA3NjFFLTF9LAorezMuNDcwNzM2MTVFLTEsIDMuNjQ3OTc4MzFFLTEsIDMuODY3NjM0NTNFLTEsIDQuMDQ1MTE2OTBFLTF9LAorezIuMTg0NTI3MDdFLTEsIDIuNzU2MTQwODNFLTEsIDMuNjI3MTEwNzJFLTEsIDQuMTgyNzg5OTJFLTF9LAorezMuMTUwNDI3OTRFLTEsIDMuNDA4MTMyMjBFLTEsIDMuNzg2MjcxODFFLTEsIDMuOTYzMTY3NjdFLTF9LAorezIuNzk3Mjc2OTdFLTEsIDMuMzEyNTk3MjdFLTEsIDMuNjAwNjEyODhFLTEsIDMuODExNzU1MThFLTF9LAorezMuMTg2MDI0NDNFLTEsIDMuMzgwNDQyODZFLTEsIDQuMDkwMTA3NjhFLTEsIDQuMzAzMDA0MTVFLTF9LAorezIuNjQxOTY5MzJFLTEsIDIuOTA2NzI0ODFFLTEsIDMuNjg1OTUwMDRFLTEsIDQuMzE4NTY3NTFFLTF9LAorezIuNzI2NDU1OTNFLTEsIDMuNjM1MTQ4NDFFLTEsIDMuOTY1MTg4MjZFLTEsIDQuMjAwOTEyMTJFLTF9LAorezIuMjY1NDA5NjhFLTEsIDMuNTAwNTUwOTlFLTEsIDMuOTM4NTE1MTlFLTEsIDQuMTI1OTcwMDFFLTF9LAorezMuNTMwNTM4NjhFLTEsIDMuNjk5Mjk1NTJFLTEsIDQuMDk2NTYwNDhFLTEsIDQuMjYzODczMTBFLTF9LAorezIuNjA3ODgzODFFLTEsIDIuODUxNzI0NjJFLTEsIDMuNDU5NDMzMzJFLTEsIDMuOTc1MDA2OTRFLTF9LAorezMuMDExMTMxMjlFLTEsIDMuMjgyMDE4OTBFLTEsIDMuNTYwNjgwMTVFLTEsIDQuMTA4MDM3OTVFLTF9LAorezIuODgxMDE2MTRFLTEsIDMuMDk1NTk2NDNFLTEsIDMuNDM3NTY3OTVFLTEsIDQuMjQ4NzI4NzVFLTF9LAorezMuMTA0ODkzNTdFLTEsIDMuNTE0MjE4OTNFLTEsIDMuOTM3MTc0MDhFLTEsIDQuMTU1NTA1MzBFLTF9LAorezIuMjIzMDgyNjNFLTEsIDMuMjY3OTgyMDFFLTEsIDMuNzc5ODE2NjNFLTEsIDMuOTg2MzUwMzBFLTF9LAorezMuMDI5MTU1MTRFLTEsIDMuMjI3ODE5MjBFLTEsIDMuOTg1NTg4NTVFLTEsIDQuMjU0ODk2MDRFLTF9LAorezIuNzcxMzY4MDNFLTEsIDMuMTk5OTI2MDJFLTEsIDMuNzc0OTA4NzhFLTEsIDQuMjkxNzc0NjNFLTF9LAorezMuMzg3MzE3NjZFLTEsIDMuNTgxNjQzNzBFLTEsIDQuMDgzODYzNTBFLTEsIDQuMjU0OTUzODZFLTF9LAorezIuMTg3MjYyMzNFLTEsIDIuODQzODQ5NjZFLTEsIDMuOTQwNTM2OThFLTEsIDQuMTYzNDY5NjdFLTF9LAorezMuMDEwMDU5NjBFLTEsIDMuNDQwOTM2ODBFLTEsIDMuNjkwMTM2NjdFLTEsIDQuMTUwOTEyNzZFLTF9LAorezIuODA3ODM3MTNFLTEsIDMuMzMwNTM2NDhFLTEsIDMuNzY3MjYxNTFFLTEsIDMuOTc1MjY4NjBFLTF9LAorezMuMTQzOTQwNTdFLTEsIDMuNjI2Nzg4MjZFLTEsIDQuMjM2Njg5ODFFLTEsIDQuNDE4OTkyNDBFLTF9LAorezIuNjY0NTM2MjRFLTEsIDMuMDg1MTM3NjFFLTEsIDMuOTc0MDcxNzRFLTEsIDQuMTc0NTAxOTBFLTF9LAorezIuOTQyMjI2NTNFLTEsIDMuNDE5MDQ0MDJFLTEsIDQuMTI3MjY4NzlFLTEsIDQuMzQ4ODg4OTlFLTF9LAorezIuODczMDA3MDZFLTEsIDMuMzI0MzQ1OTVFLTEsIDMuNzg4NTY2NTlFLTEsIDQuMzgyMzQwMzFFLTF9LAorezMuNTcxNDY2MjFFLTEsIDMuOTgxNDcwNDdFLTEsIDQuMjk4NzU3MzFFLTEsIDQuNDQyNDM5MDhFLTF9LAorezIuMjk2NzEzNDRFLTEsIDIuNTEwMTg2MTRFLTEsIDMuNDEwNDY1NzJFLTEsIDQuMDQzNzYzMjhFLTF9LAorezIuOTQ0NzI1NzVFLTEsIDMuMzQ5NDQ2MDZFLTEsIDMuNjA0MDk3MzdFLTEsIDMuODM2ODI4NDdFLTF9LAorezIuODgyNTA5ODNFLTEsIDMuMTE3MjI2OTZFLTEsIDMuMzE2ODAwNTlFLTEsIDMuNjUxMDQ2NzVFLTF9LAorezMuMjQ4ODE2MTNFLTEsIDMuNDU2NTY2OTNFLTEsIDMuODgzMDYzNzlFLTEsIDQuMDU5NTQ4OTdFLTF9LAorezIuNTA4MjkyMjBFLTEsIDIuNzc2MjM1MzRFLTEsIDMuNzA3OTk1NDFFLTEsIDMuOTA0NzkyMDdFLTF9LAorezIuOTM1MjMzNzFFLTEsIDMuMjgzMTkxOTJFLTEsIDMuOTIxMTIyNTVFLTEsIDQuMDk0NjQwNjFFLTF9LAorezIuODM2MDg3OTRFLTEsIDMuMDM4ODU2MzlFLTEsIDMuNzg1MDQzOTVFLTEsIDMuOTczMTA1NTVFLTF9LAorezMuMzQwMzk4MDdFLTEsIDMuNTI4MzczODRFLTEsIDMuOTcyNzI5NDRFLTEsIDQuMTQzMjIwMTlFLTF9LAorezIuMjE4OTE4OTVFLTEsIDIuNTE4Nzc0NTdFLTEsIDMuNzE3MjM1MzNFLTEsIDQuMzE3OTEwMDhFLTF9LAorezMuMTMyMDE0MjdFLTEsIDMuNDExNzU0MzdFLTEsIDMuNjU1MDM1NTBFLTEsIDMuODg1NjcyMDlFLTF9LAorezIuNzEzMzA1MzVFLTEsIDMuMzkxNjM3MjFFLTEsIDMuNjI2MTY0MjBFLTEsIDMuOTU3MzU5NzlFLTF9LAorezMuMDc1NTAxMzJFLTEsIDMuNDc3Nzc2NjVFLTEsIDQuMDEwNDk2MTRFLTEsIDQuMzI3Njc0NTFFLTF9LAorezIuNTkzODc0MzRFLTEsIDIuODcyNDM4NDNFLTEsIDMuODY4MTczMzZFLTEsIDQuMDYwNDI2OTVFLTF9LAorezIuODU0ODUyMDhFLTEsIDMuNDQwOTQ5OTJFLTEsIDQuMDIwNTA0OTVFLTEsIDQuMTk0MTM3NDVFLTF9LAorezIuNjU3ODE0MDNFLTEsIDMuNDAwODQzNzRFLTEsIDMuNjk0MDc2NTRFLTEsIDQuMjcwMzE2OTZFLTF9LAorezMuNTM3NDA5MzFFLTEsIDMuODQ0NjMyNTFFLTEsIDQuMTE3NDc4MTNFLTEsIDQuMjYxODE3OTNFLTF9LAorezIuNDM4NjY0ODhFLTEsIDIuNjgzNTAxODRFLTEsIDMuNDIyMDE5NDhFLTEsIDMuOTg0NTcyMjlFLTF9LAorezIuOTMxNDUyMzlFLTEsIDMuMzQ3NTQxNjlFLTEsIDMuNjE3MDI4MDBFLTEsIDMuOTg0MTY2MzhFLTF9LAorezIuOTEzNDI5NzRFLTEsIDMuMTMxNTUxNzRFLTEsIDMuMzY1MjU5MTdFLTEsIDMuODc3NDg1OTlFLTF9LAorezMuMDU2NTY3OTFFLTEsIDMuNjI5MDQ1NDlFLTEsIDMuODgxNTM0MzRFLTEsIDQuMDU1NDMxNDlFLTF9LAorezIuMTc0OTIzMjdFLTEsIDMuMTE3MjM1MzBFLTEsIDMuNzU5ODQ3ODhFLTEsIDQuMjg5OTc3NTVFLTF9LAorezIuOTExNDkyNTlFLTEsIDMuMjkzODA5MjlFLTEsIDQuMDM5MDAzODVFLTEsIDQuMjIzMzMxODFFLTF9LAorezIuOTAzNjIwNjBFLTEsIDMuMDk1MzA5NzNFLTEsIDMuNzg5OTQyMjZFLTEsIDQuMTM2ODgzNjJFLTF9LAorezMuMjk1NjQ4NjlFLTEsIDMuNzc0MDQ2OTBFLTEsIDQuMDY1ODQ4NTlFLTEsIDQuMjQ3Mzk3MThFLTF9LAorezIuNDY0NjE1ODVFLTEsIDIuNzE1OTMyNzNFLTEsIDMuNjYzMzgyNTNFLTEsIDQuMzA3NTM3NjdFLTF9LAorezMuMTQxMDc3MTZFLTEsIDMuMzcwMTE4NzRFLTEsIDMuODA0MDk3MThFLTEsIDQuMTEwOTk0MzRFLTF9LAorezIuNzY1Njg0MTNFLTEsIDMuMjczMjA2OTVFLTEsIDMuNTg4NDQyODBFLTEsIDQuMjg5NDk0NzVFLTF9LAorezMuMTcxNzkwODRFLTEsIDMuNTg5NzI0MzBFLTEsIDQuMDQ3NjU4NDRFLTEsIDQuNDAzNzYzNDFFLTF9LAorezIuNDI3Nzc3NTBFLTEsIDMuMzQ5NTQ3OThFLTEsIDMuOTY5NDM0NTBFLTEsIDQuMTMzMTgzOTZFLTF9LAorezIuODg4OTU0ODhFLTEsIDMuMjU2OTExNjRFLTEsIDQuMjI4NTk1NTBFLTEsIDQuNDM3NTg2NjdFLTF9LAorezIuNzc1ODMzMDFFLTEsIDMuMjU0NzkwMzFFLTEsIDMuODkxNDQ2NTlFLTEsIDQuNDEwNzU4NjFFLTF9LAorezMuNTkxMjU2NzRFLTEsIDMuOTA2OTQxNDFFLTEsIDQuMjEwMDk1NDFFLTEsIDQuMzU3MDg1MjNFLTF9LAorezIuMjAxNzIzOTBFLTEsIDIuNDc3MTkyNzNFLTEsIDMuNTQzODE4NTlFLTEsIDQuMjUzOTgxMTFFLTF9LAorezMuMDYwNDY3ODRFLTEsIDMuMjc5MjQ3MjhFLTEsIDMuNjY5OTI3NzJFLTEsIDMuOTMxOTI1ODlFLTF9LAorezIuNzA4MDU1OTdFLTEsIDMuMTY4MjY2NDJFLTEsIDMuNDU2NDg3MDZFLTEsIDQuMTE3MTc1OTRFLTF9LAorezMuMjMxODg5MDFFLTEsIDMuNDU0NjMwOTdFLTEsIDMuODk3Nzg3OTNFLTEsIDQuMjE1NzA3NzhFLTF9LAorezIuNDYxMzYxMTRFLTEsIDMuMTIzOTE5OTZFLTEsIDMuNzIxODg2MjhFLTEsIDMuOTU4NDI3MzFFLTF9LAorezMuMDM4NTY3MzBFLTEsIDMuMjQzNTQ3NjhFLTEsIDMuODU3NDcyNTRFLTEsIDQuMTQxNTUwMDZFLTF9LAorezIuODEwNzU0MThFLTEsIDMuMTg2MDg0NjNFLTEsIDMuODU2NDY4ODBFLTEsIDQuMDI3MDM2NDNFLTF9LAorezMuNTM1MTcxMTVFLTEsIDMuNzI3MDI1MzlFLTEsIDMuOTYyNjQ2MTNFLTEsIDQuMTMwNzQ5MTFFLTF9LAorezIuMDkyMjExNDBFLTEsIDIuOTUyNjIyMThFLTEsIDMuODAzMTQyOTFFLTEsIDQuMzEyNzgyMjlFLTF9LAorezMuMjUzMTM2MjhFLTEsIDMuNDY3MzU0NzdFLTEsIDMuNzA3MjQwMjJFLTEsIDMuOTEwNDU2MzBFLTF9LAorezIuODYzOTY1MDNFLTEsIDMuNDM1NjAwNDBFLTEsIDMuNjk3MTM2MDRFLTEsIDMuODk4Njc4NDJFLTF9LAorezMuMjc3OTQ2NzFFLTEsIDMuNDczNjc4MjNFLTEsIDQuMDU0NjUwNjZFLTEsIDQuMjQ1NjYxNTBFLTF9LAorezIuNTMwNTQ5NzZFLTEsIDMuMDI2NTYyOTNFLTEsIDMuODIxNjUxMzRFLTEsIDQuMjk4OTgzMjJFLTF9LAorezIuOTQ0MTg0NTRFLTEsIDMuNzA3NDU0MjBFLTEsIDMuOTU0NDMyNjFFLTEsIDQuMTk1MTQ3NzVFLTF9LAorezIuNjI4NzMxMTNFLTEsIDMuNDUwNjkyMzBFLTEsIDQuMDQxNDA4OTBFLTEsIDQuMjE5MDIwNjFFLTF9LAorezMuNjUwNjM0ODhFLTEsIDMuODI0MzUxNDNFLTEsIDQuMTM0MjQ3OTBFLTEsIDQuMzEyNDE2OTFFLTF9LAorezIuNDg3ODg1MDZFLTEsIDIuODIzNzI3NzNFLTEsIDMuNjU3NzIzMDdFLTEsIDQuMTA5ODEwNTlFLTF9LAorezMuMDcyODg3NjZFLTEsIDMuMjc4Mjg5NDRFLTEsIDMuNzc2NjQ5ODNFLTEsIDQuMzYyMjA5NDRFLTF9LAorezIuOTg1NDIzMjFFLTEsIDMuMjA2MjczMzJFLTEsIDMuNTA1Njk2NjVFLTEsIDQuMjc2MjAyMzJFLTF9LAorezMuMTYyNTgwMTNFLTEsIDMuNjI5MDM4MzNFLTEsIDMuODgyMjUxMzhFLTEsIDQuMjU2MDg4NzNFLTF9LAorezIuMzkwNzc4NjZFLTEsIDMuMzEzMTA0NTFFLTEsIDMuNzAzMTc4NzZFLTEsIDQuMTU5OTU4OTZFLTF9LAorezMuMDM3MzU3OTNFLTEsIDMuMzI4MDYwNTFFLTEsIDQuMTAyMzI4NDJFLTEsIDQuMjc3NTEwNjRFLTF9LAorezIuOTYwMDI1MDdFLTEsIDMuMTkwMTQ3ODhFLTEsIDMuODEwNjI0NDhFLTEsIDQuMjY5NTQ5ODVFLTF9LAorezMuMzI1MDg5MjJFLTEsIDMuNjI1MTY5OTlFLTEsIDQuMjMzMTUxMDhFLTEsIDQuNDA5OTUxNTdFLTF9LAorezIuMzUxMjg3MDFFLTEsIDIuNzQ3MzExMDBFLTEsIDQuMTIwNzA1NzJFLTEsIDQuMzU0Nzg4MDZFLTF9LAorezIuOTgwNzM3NjlFLTEsIDMuNTUzMzg3NTJFLTEsIDMuNzkwODc3NDZFLTEsIDQuMTUzMTg3ODdFLTF9LAorezIuODM0Mjk4MDFFLTEsIDMuNDUyNjQ5MTJFLTEsIDMuNzAzNzYyODlFLTEsIDQuMDk5MDA4NDRFLTF9LAorezMuMjM1OTMwODBFLTEsIDMuNjU0MTI4MzFFLTEsIDQuMTI4MTMxMjdFLTEsIDQuMzEwMjM0NzlFLTF9LAorezIuNzY2MjYzNDhFLTEsIDMuMDA1MDg0NDBFLTEsIDQuMDIyMzY4NzlFLTEsIDQuMjY2Mzg3ODJFLTF9LAorezIuOTQ1MTI5MjhFLTEsIDMuNjE0NDMyMjJFLTEsIDQuMTk2MzUyMzZFLTEsIDQuMzY5OTkyMDJFLTF9LAorezIuOTA4MDcyNDdFLTEsIDMuNDE2ODkzNDhFLTEsIDMuOTI3NzkyOTFFLTEsIDQuNDM0OTAyNjdFLTF9LAorezMuNTkzOTE0NTFFLTEsIDQuMDM5ODUxNDNFLTEsIDQuNDA4NDM3NjFFLTEsIDQuNTMwMjg2MTlFLTF9LAorezIuMjMyOTU0NjVFLTEsIDIuMzkxOTI0ODZFLTEsIDMuMjM3NjgwMjBFLTEsIDQuMjE2ODk0NTFFLTF9LAorezIuOTQ3NzgwNDlFLTEsIDMuMTg3OTg3MjFFLTEsIDMuNTMyMTc4NDBFLTEsIDMuOTE5MDYzODFFLTF9LAorezIuNTkwMzIxMzBFLTEsIDMuMTAyNDA1MDdFLTEsIDMuNDM1NjkwNDBFLTEsIDMuOTUwNjQyMzVFLTF9LAorezMuMTY0NzQ2NzZFLTEsIDMuMzg1NDQzNjlFLTEsIDMuOTMzMjkwMjRFLTEsIDQuMTIyMzU1NThFLTF9LAorezIuNDAxMDgyMDdFLTEsIDIuODQ2MzExOTNFLTEsIDMuNjAyODA5OTFFLTEsIDMuNzk5NzM3NjlFLTF9LAorezIuOTY5MDkwOTRFLTEsIDMuMTU3OTgzNDJFLTEsIDMuOTQ5NjQzMzdFLTEsIDQuMTUxMjc1NzVFLTF9LAorezIuODU0MzQwNjdFLTEsIDMuMDQ5MjE1MDhFLTEsIDMuNjE5NzQ3MTZFLTEsIDQuMDU3NjcyNjJFLTF9LAorezMuMzc0MDcwNTNFLTEsIDMuNTY2NzIxNjhFLTEsIDMuODUxNTUwODJFLTEsIDQuMTExODY2OTVFLTF9LAorezIuMjQwMTQ5MjNFLTEsIDIuNjAxMTYxNjBFLTEsIDMuOTQ3NzI1MzBFLTEsIDQuMTk1ODU4ODRFLTF9LAorezMuMDA2NDc5MTRFLTEsIDMuNDE2NDA2NTFFLTEsIDMuNzAyMjM1MjJFLTEsIDMuODk1MjAwNDlFLTF9LAorezIuNjU5NDYwMzFFLTEsIDMuMjUwMzkxNDhFLTEsIDMuNzQzMzk5MzhFLTEsIDMuOTIzNDYxNDRFLTF9LAorezMuMTYwMjkzMTBFLTEsIDMuNDA0OTEyOTVFLTEsIDQuMDIzNTUzMTNFLTEsIDQuMjA0ODQyNDVFLTF9LAorezIuNjk4NDE0OTJFLTEsIDIuOTQ1NjIzOTlFLTEsIDMuNjIzNDE3NjJFLTEsIDQuMDY0MTU0NjJFLTF9LAorezIuNzg4OTcyODVFLTEsIDMuNTk4MzEwMzVFLTEsIDMuODIwMjU4MzhFLTEsIDQuMTA1Nzc0NzZFLTF9LAorezIuNjA3NjA4NDRFLTEsIDMuMzEwODg1NDNFLTEsIDMuODg4MjYyNTFFLTEsIDQuMDU0ODY2NDNFLTF9LAorezMuNDMzNzIyODVFLTEsIDMuODI2NDcwMzhFLTEsIDQuMTQ3MTY2MDFFLTEsIDQuMzE1OTI5NDFFLTF9LAorezIuNDc5OTgxMDNFLTEsIDIuNzMzOTMxNTRFLTEsIDMuMzExNjA0MjZFLTEsIDQuMTg5NDMyMjZFLTF9LAorezMuMDM1Nzk1NjlFLTEsIDMuMjUyMDI0NjVFLTEsIDMuNzA5ODQ0MzVFLTEsIDQuMTQ0MjA0ODVFLTF9LAorezIuNzY4OTY4OTRFLTEsIDMuMDA0OTk0OTlFLTEsIDMuNTQxNzgxOTBFLTEsIDQuMjg4MDcwMjBFLTF9LAorezMuMjM2NTU1NDZFLTEsIDMuNTk4MTY5NjhFLTEsIDMuODk1MjU0MTRFLTEsIDQuMDkyODg3MDRFLTF9LAorezIuMzg5Mjc3OTZFLTEsIDMuMDk5MTkyMzhFLTEsIDMuNTM5MTU1NzJFLTEsIDQuMTY2MzQzMjFFLTF9LAorezIuODExNzE3MzlFLTEsIDMuMDc1MjAyNzBFLTEsIDQuMTYyNjQ4OTJFLTEsIDQuMzg1MjM4MjlFLTF9LAorezIuODg4NTg2NTJFLTEsIDMuMDk4MTA4MTdFLTEsIDMuNjc4NDUxNzhFLTEsIDQuMzYwMzU1NzNFLTF9LAorezMuMzg0MjM0OTFFLTEsIDMuNzA2MzQzNzdFLTEsIDQuMTU0NDk5NzdFLTEsIDQuMzE1MzQ1MjlFLTF9LAorezIuNDEyNjAzOTRFLTEsIDIuNzM2MTc4NjRFLTEsIDMuODk1NTQ2MjBFLTEsIDQuMTI1Mzk1NDJFLTF9LAorezIuOTgwNDY3MDhFLTEsIDMuNDAxMjIxMDRFLTEsIDMuODYxODM3MzlFLTEsIDQuMTM4MjYzNDZFLTF9LAorezIuODI0MzY0MzBFLTEsIDMuMzE1OTc1MDdFLTEsIDMuNTc5NDEzODlFLTEsIDQuMTIxMTUyMTZFLTF9LAorezMuMDM4MjAxOTNFLTEsIDMuNzA1ODg2MDFFLTEsIDQuMDU3NzQ5NTFFLTEsIDQuMzE1MTcwNjVFLTF9LAorezIuMzkwNzc3MzJFLTEsIDMuMTE2Mzg0NzRFLTEsIDQuMTM5MzU3ODFFLTEsIDQuMzUzMDQwNDZFLTF9LAorezIuNjcxMTY4NDVFLTEsIDMuNDE5Mzc5MDBFLTEsIDQuMTc0MDk0MjBFLTEsIDQuMzkxODQ4NDRFLTF9LAorezIuNjc5NDY4MzlFLTEsIDMuMzMzNDM5MjNFLTEsIDMuODY0ODE0MDRFLTEsIDQuMzc0NjI1MDlFLTF9LAorezMuNDA1MTA5NjRFLTEsIDMuOTA4NzgwMjJFLTEsIDQuMzU0ODUxMjVFLTEsIDQuNDkxMDE5MjVFLTF9LAorezIuMTAwNjk4NTBFLTEsIDIuMzI1MjQ0ODRFLTEsIDMuNjE3ODE0MThFLTEsIDQuMzEzNTc4NjFFLTF9LAorezIuOTQ1MDk4ODhFLTEsIDMuMzM3MDk3NzZFLTEsIDMuODIyNzg2MjFFLTEsIDMuOTg2Mzg5MDRFLTF9LAorezIuODA1MjUxNDhFLTEsIDMuMjU5MDUyMDRFLTEsIDMuNTA2NDcwMzJFLTEsIDMuOTI4NzM5NDNFLTF9LAorezMuMTk5OTk2MzVFLTEsIDMuNDM2NzQ2NjBFLTEsIDMuOTEwNzA1NDVFLTEsIDQuMzc1MDEwNzNFLTF9LAorezIuMjA1ODEwMTBFLTEsIDMuMDMxNTE5MDZFLTEsIDMuODE3NjU1NDRFLTEsIDQuMDQ0ODgxNDZFLTF9LAorezIuODYxMjI3MzlFLTEsIDMuMjk3NDY1NDRFLTEsIDMuODgxMDI4MjlFLTEsIDQuMjQyNDc3NDJFLTF9LAorezIuNjk4MDcxMDBFLTEsIDMuMjUzMzIyODRFLTEsIDMuNzkxNTQ1MDNFLTEsIDQuMTUxMzgyNDVFLTF9LAorezMuMzQ4NTg4OTRFLTEsIDMuNjkyNTg0MDRFLTEsIDMuOTQ3NDMxNDVFLTEsIDQuMTE5MjIxNTdFLTF9LAorezIuMDcxMDk3OTRFLTEsIDIuNzI3Nzk1MjRFLTEsIDMuNzg1NjY0NDRFLTEsIDQuMzQ1Nzk5NjhFLTF9LAorezMuMDY0NjYyMjJFLTEsIDMuNDY2OTU3MjFFLTEsIDMuODcxMzgzMDdFLTEsIDQuMDM1NTgzMTRFLTF9LAorezIuNzAxNDg1NzVFLTEsIDMuNDY2NTQ1MzRFLTEsIDMuNzc2OTY2OTNFLTEsIDMuOTY0MzQ0ODZFLTF9LAorezMuMTg3NDU5MTFFLTEsIDMuNDAyMjU2OTdFLTEsIDQuMTQ5OTE1NThFLTEsIDQuNDE1Nzg3NDZFLTF9LAorezIuNTg1OTI4NDRFLTEsIDMuMTQzNzAwOTZFLTEsIDMuNjUwODM3NTRFLTEsIDQuMjE2MTUxODNFLTF9LAorezIuODI3MTI5OTZFLTEsIDMuNTQxMzcxMjNFLTEsIDQuMDY3NDU5NzBFLTEsIDQuMjkyNjc4ODNFLTF9LAorezIuNTIwMjE3NjBFLTEsIDMuNTkxMDUxMTBFLTEsIDMuOTUxMDI5MThFLTEsIDQuMTgxNDgzOThFLTF9LAorezMuNTQ5MDYyMDFFLTEsIDMuNzQ5NTI5MTJFLTEsIDQuMTg5NjU5OTVFLTEsIDQuMzYxNDQ0MTJFLTF9LAorezIuNjQ4NDExMzlFLTEsIDIuOTI5NDE4MDlFLTEsIDMuMjc3NTE0NThFLTEsIDQuMDg3OTA0NjlFLTF9LAorezMuMDc3NzQyNDZFLTEsIDMuMzU1ODYxOTBFLTEsIDMuNjIyMDk2MThFLTEsIDQuMjUzOTQyMzdFLTF9LAorezIuODg0NjYzMzRFLTEsIDMuMTYwNzU3NDJFLTEsIDMuNjA5ODk2MzBFLTEsIDQuMTk1NTE0MzJFLTF9LAorezMuMTcxMjg0MjBFLTEsIDMuNTU3NzIxOTdFLTEsIDQuMDU4MDg3NDdFLTEsIDQuMjM5NzI5NjRFLTF9LAorezIuNDcwODk2ODRFLTEsIDMuMzgxODQ1OTVFLTEsIDMuNzE4NTk2MTBFLTEsIDMuOTU5NzE0NzdFLTF9LAorezMuMDc5ODE3MzBFLTEsIDMuMzI2OTE3ODlFLTEsIDQuMDA1MzQyMTNFLTEsIDQuMzgyNzM2NjhFLTF9LAorezIuNzk0ODQ4MDhFLTEsIDMuMTYxODM1MDdFLTEsIDMuOTcyMzc3MThFLTEsIDQuMzQ3NDY2MjNFLTF9LAorezMuNDQ0OTA0NjlFLTEsIDMuNjYxNTMxODFFLTEsIDQuMTA5NTk0MjNFLTEsIDQuNDE3MjcxMDJFLTF9LAorezIuMzU3NDE3NzlFLTEsIDIuOTQ1ODcyNTVFLTEsIDMuOTgwNzI1NDFFLTEsIDQuMTY4MzM0MDFFLTF9LAorezMuMTQwMzg0NTVFLTEsIDMuNTIyNzIwMzRFLTEsIDMuNzkxMzg4ODdFLTEsIDQuMTA5NjkwNzlFLTF9LAorezIuODMwMDI0OTZFLTEsIDMuMzgxMzYyNTZFLTEsIDMuODg2NDE4OTRFLTEsIDQuMDYxOTMzMTZFLTF9LAorezMuMjM2MjUzMjZFLTEsIDMuNTAyNDMzOTBFLTEsIDQuMjgwODk1NTlFLTEsIDQuNDY2MzAzNTlFLTF9LAorezIuNjEyNTIxMDVFLTEsIDMuMjQ5NzA5NjFFLTEsIDQuMDAyMTQ0OTNFLTEsIDQuMjUzMjE3NThFLTF9LAorezMuMDUyODQ1MDBFLTEsIDMuNDIxNjQxNTlFLTEsIDQuMjQ0NzUxMzNFLTEsIDQuNDM4MzA5NjdFLTF9LAorezIuODczNzQ3OTRFLTEsIDMuMzI1MDA2MzdFLTEsIDMuOTQzMDgyNjlFLTEsIDQuNDI1Mzg1MDBFLTF9LAorezMuNzQwNzUzNTNFLTEsIDQuMDIwMjYzNTVFLTEsIDQuMzA5MzM1MzVFLTEsIDQuNDQxNjAwNDRFLTF9LAorezIuMzQ1MDM5OTlFLTEsIDIuNTYyMTg2MTJFLTEsIDMuNDEyMzg3OTdFLTEsIDQuMjMwNDUyNzhFLTF9LAorezMuMDU0OTI1ODBFLTEsIDMuMjkxNTY5OTVFLTEsIDMuNTI3MDk4MzBFLTEsIDMuOTI0MzkwNjdFLTF9LAorezIuODEzMjM1NTJFLTEsIDMuMDMyOTIzMzRFLTEsIDMuNDg5MjU0MTJFLTEsIDMuOTMxNjM4NjBFLTF9LAorezMuMjE4OTM0NTRFLTEsIDMuNTA0MTk5MzlFLTEsIDMuOTczMTc0NjlFLTEsIDQuMTQ1NjAzMThFLTF9LAorezIuMzk2ODQ1ODJFLTEsIDIuOTI0NTE1MDFFLTEsIDMuNzg5Mzc0MjNFLTEsIDMuOTY1MzU0NTZFLTF9LAorezMuMDczMDcyNDNFLTEsIDMuMjkxMjc5MDhFLTEsIDMuOTg0NTU1NjBFLTEsIDQuMTYxNDMyOThFLTF9LAorezIuODUyNzQ1NjVFLTEsIDMuMDg3NzQ1MzFFLTEsIDMuOTI5MTY1MDFFLTEsIDQuMTQ0Mzc2NTJFLTF9LAorezMuNDQ0NDYzNjFFLTEsIDMuNjIyMDE4NjlFLTEsIDMuOTc2MTk3ODRFLTEsIDQuMTc3NDM2MjNFLTF9LAorezIuMzIwODMwNjdFLTEsIDIuNjc4MDc5NjFFLTEsIDMuNzgwNzU2NTlFLTEsIDQuMzQ1NjA4OTVFLTF9LAorezMuMDQ3Mzg3MDBFLTEsIDMuNTE4NjUyOTJFLTEsIDMuNzU5NzMxNjVFLTEsIDMuOTUyOTM2NTNFLTF9LAorezIuNjE5OTA5MDVFLTEsIDMuNDYyMDczMjFFLTEsIDMuNzEyOTY5NDJFLTEsIDQuMTI0Mzg5MjlFLTF9LAorezMuMTEwODA5MzNFLTEsIDMuNTEwNDA5MDBFLTEsIDQuMTYwODI3OTlFLTEsIDQuMzQzNDAxMTlFLTF9LAorezIuNzQ5ODA0MjZFLTEsIDIuOTY2MzE0NTVFLTEsIDMuODc1MjA0OTJFLTEsIDQuMDkyNDM3NjJFLTF9LAorezIuOTA5MzkwOTNFLTEsIDMuNTQ0NTU1OTBFLTEsIDMuOTM0MjY5NTVFLTEsIDQuMDgyMjAyOTFFLTF9LAorezIuNzE4NzE4NjVFLTEsIDMuNDU1MTA3ODFFLTEsIDMuODcxMjUzMTNFLTEsIDQuMjI1OTA2MTNFLTF9LAorezMuNjMyNDU5MDRFLTEsIDMuODE5MzIxOTlFLTEsIDQuMDQxMTQ5MDJFLTEsIDQuMTgzNzA2NjRFLTF9LAorezIuNDU3NzA3MzhFLTEsIDIuNzI5MDkzNDNFLTEsIDMuNDgzMTc5MjFFLTEsIDQuMjUxNjE4MzlFLTF9LAorezMuMTQxMzkwMDlFLTEsIDMuMzc4NzIzMjZFLTEsIDMuNjUxOTUyMTVFLTEsIDQuMDQ0MjM0MTZFLTF9LAorezIuOTQwNzU3ODdFLTEsIDMuMTY5MzU1MzlFLTEsIDMuNDMwNDcyMDJFLTEsIDQuMDYxMzAzNzNFLTF9LAorezMuMTQ2Mjc0NjlFLTEsIDMuNzI0MTMzOTdFLTEsIDQuMDA2NjA2OTRFLTEsIDQuMTc5MzA4NDFFLTF9LAorezIuMzQwMTQyNDNFLTEsIDMuMTQwMDcyMjNFLTEsIDMuODMwMDM1MzNFLTEsIDQuMzQ4MjkxNzVFLTF9LAorezIuOTM2MzU2NjZFLTEsIDMuMjA1Mjk5OTdFLTEsIDQuMTA4MzczNTJFLTEsIDQuMzYzOTMxNDJFLTF9LAorezIuODk1MDU4MzlFLTEsIDMuMTE4Mjg4NTJFLTEsIDMuODYzMTE0NzFFLTEsIDQuMzg3NzEyNDhFLTF9LAorezMuMjYzMTc0MzBFLTEsIDMuODA4NTgxODNFLTEsIDQuMTk3MjE0MjVFLTEsIDQuMzg3OTU1MDdFLTF9LAorezIuNTA4MDk1MjBFLTEsIDIuODMwMTgwNTNFLTEsIDMuODIyNDczODhFLTEsIDQuMzQyNDQzOTRFLTF9LAorezMuMTg5OTQwNDVFLTEsIDMuNDQ4NTUxMzBFLTEsIDMuNzI2OTAxNDFFLTEsIDQuMjMwNjcwMzNFLTF9LAorezIuODgzODAwODZFLTEsIDMuMzY2MjIyMzhFLTEsIDMuNjk3NDIzMzRFLTEsIDQuMjUwNTc1OTBFLTF9LAorezMuMDYxMDc3MDBFLTEsIDMuODE4NTY5MThFLTEsIDQuMTgyMDYxNTVFLTEsIDQuMzI4NjgzNjFFLTF9LAorezIuMzM4OTgzMTJFLTEsIDMuNDQ4NjE4MDVFLTEsIDQuMTIxNzY1NDlFLTEsIDQuMjkyMTYyMDZFLTF9LAorezIuODU5ODA4ODBFLTEsIDMuNDI5MDM3OTNFLTEsIDQuMjUxMTI5MDNFLTEsIDQuNDQyOTk2OThFLTF9LAorezIuNzk4NTg4MjhFLTEsIDMuMzg3ODkzNDRFLTEsIDMuOTIwODUzNzNFLTEsIDQuNDA1NDEwMjlFLTF9LAorezMuNjQ1MDkzNDRFLTEsIDMuODIyMDI3NDRFLTEsIDQuMjk4MzA2MTFFLTEsIDQuNDU4MTgzNjVFLTF9LAorezIuMzQzOTIzMDBFLTEsIDIuNTczNzczODZFLTEsIDMuNTk1NjcwNDZFLTEsIDQuMzAwODg1ODBFLTF9LAorezMuMDUwMzE4OTZFLTEsIDMuMjc1ODkzOTNFLTEsIDMuNzgzMDU1NTRFLTEsIDQuMDEwMjYxMzBFLTF9LAorezIuNzc1MjI2MjRFLTEsIDMuMTgxMzAzMTRFLTEsIDMuNjc3OTQyNzVFLTEsIDQuMDE1NDMwMjFFLTF9LAorezMuMzMwMzU3NjdFLTEsIDMuNTU4MjA5NTRFLTEsIDMuODc1NDg5MjNFLTEsIDQuMjQ2Mjg2NzVFLTF9LAorezIuNDUwMjEwMDFFLTEsIDMuMTI1NjA2NzhFLTEsIDMuOTExNDc2MTRFLTEsIDQuMDg3NjI4MTNFLTF9LAorezIuOTcwNTkxMTlFLTEsIDMuNDAyNDY5MTZFLTEsIDMuOTI5MTkzMDJFLTEsIDQuMjg4OTk3MDVFLTF9LAorezIuNzc4MzkzMDNFLTEsIDMuMjUwMTk3NzdFLTEsIDMuOTc0MzYzODBFLTEsIDQuMTU5MjA5MTNFLTF9LAorezMuNDk0NjUyNTFFLTEsIDMuNzAzNjI0NjFFLTEsIDMuOTU0ODI1NDBFLTEsIDQuMzE5MjMzODlFLTF9LAorezIuMzE0ODU1OTBFLTEsIDIuOTEwMjMzNzRFLTEsIDMuNzc5MDk1NDFFLTEsIDQuMzIyNTk3MzhFLTF9LAorezMuMTkyODM0ODVFLTEsIDMuNTM2NzEwNzRFLTEsIDMuODA5ODI4NzZFLTEsIDMuOTc4NDMzNjFFLTF9LAorezIuODk2ODkyNDNFLTEsIDMuNTAyNjU2ODJFLTEsIDMuODA3Mjk2NzVFLTEsIDMuOTc5NjkzNjVFLTF9LAorezMuMjg5ODczMDBFLTEsIDMuNTIwMDU0MjJFLTEsIDQuMTI1NTcyNDRFLTEsIDQuMzc1OTc5MzBFLTF9LAorezIuNzYyNzMyNTFFLTEsIDMuMDIyNjcxOTRFLTEsIDMuODE3MjM0MDRFLTEsIDQuMzQ5ODkwOTVFLTF9LAorezIuNzk2MjcyNjRFLTEsIDMuNzM3MjczMjJFLTEsIDQuMTIzNzQ2MTZFLTEsIDQuMzA2MjYzMzNFLTF9LAorezIuNTM0NDI3NjRFLTEsIDMuNjU5NDAwMzRFLTEsIDQuMTQ5MzcwMTlFLTEsIDQuMzI3NDM2MDlFLTF9LAorezMuNzYxMDcyMTZFLTEsIDMuOTUxNDIwMTlFLTEsIDQuMTY3ODc3NDRFLTEsIDQuMzMwMjM1NzJFLTF9LAorezIuNjI4MTU4MzNFLTEsIDIuODgyNzA1MzNFLTEsIDMuNDczOTcyMDhFLTEsIDQuMjQxODI1OTRFLTF9LAorezMuMDE5MzEzMjJFLTEsIDMuNDM2NTI1NDZFLTEsIDMuNzcwMzEzMjZFLTEsIDQuMzQyMDQ0NTlFLTF9LAorezIuOTc4MzQyNzdFLTEsIDMuMjM0OTUzODhFLTEsIDMuNjQ0OTI0MTZFLTEsIDQuMzM1NTA4MzVFLTF9LAorezMuMzE3NzQ0NzNFLTEsIDMuNjQzMjQ5MjdFLTEsIDMuOTgyNDM1NDZFLTEsIDQuMzUwNzgzMjNFLTF9LAorezIuNDkwNDk3MjNFLTEsIDMuMjc4NzA3ODZFLTEsIDMuODM1ODcwMDNFLTEsIDQuMzU1NTgwODFFLTF9LAorezMuMDQ2NTM0MDZFLTEsIDMuMjc2NzEyMzBFLTEsIDQuMTg0ODQ2ODhFLTEsIDQuNDEzNzg3NzJFLTF9LAorezIuOTY5NjA4OTBFLTEsIDMuMjM4OTg5MTFFLTEsIDMuOTA0NjM3MTBFLTEsIDQuMzk5MTU5NTVFLTF9LAorezMuNDM5MjM3NDhFLTEsIDMuNjcxMDA0NzdFLTEsIDQuMjk1MjMyMzBFLTEsIDQuNDUyMTQ5ODdFLTF9LAorezIuNTkzOTk2NTJFLTEsIDIuOTE2MDI2NzFFLTEsIDQuMDQzNzI0NTRFLTEsIDQuMzE0MTMyMzNFLTF9LAorezIuOTc1Mzc1MDZFLTEsIDMuNTc1NzM4MDdFLTEsIDMuODg5OTE4MzNFLTEsIDQuMzAwMDY5ODFFLTF9LAorezIuODQwNjg5NDJFLTEsIDMuNDk1NzQ1NjZFLTEsIDMuODEwNDI4MzhFLTEsIDQuMjk3MTI3NzJFLTF9LAorezMuMjU3MTYyNTdFLTEsIDMuNzQ4NzU5MDNFLTEsIDQuMzE5NTkyNzFFLTEsIDQuNDcyOTA4MzhFLTF9LAorezIuNjUzMDI5NTZFLTEsIDMuMTQ3NDU5NjNFLTEsIDQuMTY3MDM0NjNFLTEsIDQuMzcyOTQ3MjJFLTF9LAorezMuMDAzOTg1ODhFLTEsIDMuNTQxNDcyNTVFLTEsIDQuMjg1MzgwODRFLTEsIDQuNjAzMzYzODdFLTF9LAorezIuOTgwNzcxNjZFLTEsIDMuNDkzMDQ5MTRFLTEsIDQuMDA0MjkyNDlFLTEsIDQuNDgyMTM1MThFLTF9LAorezMuNzU1NzYxOThFLTEsIDQuMTY2NTczMjlFLTEsIDQuNDIxMzY3NjVFLTEsIDQuNTI3Mjg2MjlFLTF9fTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGV2cmNfbHNwcV9xdWFudF9jb2RlYm9vazFbMTZdWzVdID0geworezAuNDIwOTEwNjRFLTEsIDAuNjk0NzQ5NzNFLTEsIDAuMTExNjg5NDhFKzAsIDAuMTQ1NzE5NjVFKzAsIDAuMjA4OTM1ODFFKzB9LAorezAuNTQ5NDQ2NjRFLTEsIDAuOTgyNDIyNjFFLTEsIDAuMTEwMDc4ODJFKzAsIDAuMTU4OTA3NzlFKzAsIDAuMjA1NDgyNDFFKzB9LAorezAuNDUxODg1NzJFLTEsIDAuNzUxOTk0MzNFLTEsIDAuMTE0MjMzOTFFKzAsIDAuMTU0Njk3MjhFKzAsIDAuMTk3NDY3MDZFKzB9LAorezAuNDk0NzQ5OTZFLTEsIDAuNzk2Njc1MDFFLTEsIDAuMTI1NzEzNTFFKzAsIDAuMTY5NDQ3NzlFKzAsIDAuMjA3NzUzMTVFKzB9LAorezAuNDE3ODkzNzlFLTEsIDAuNjM0NTk1NjBFLTEsIDAuMTIwNjgwMjhFKzAsIDAuMTU4NTA3NjVFKzAsIDAuMjA0MDY4MTVFKzB9LAorezAuNDcxNTkyMzZFLTEsIDAuNzkxMjk1NDdFLTEsIDAuMTIxODMxMTBFKzAsIDAuMTU2NTAwNDdFKzAsIDAuMjIzMDkyMjZFKzB9LAorezAuNTQ1Mzk5MTlFLTEsIDAuODAzNDMwNDVFLTEsIDAuMTI5NDc3NjRFKzAsIDAuMTUxODYxNTNFKzAsIDAuMjAxNzE3MThFKzB9LAorezAuNTU4NTIwODJFLTEsIDAuOTQxMTQ4NDdFLTEsIDAuMTQwMTYwMjVFKzAsIDAuMTc4MDcwODRFKzAsIDAuMjI5NTU0ODlFKzB9LAorezAuNDU0NDM1MzFFLTEsIDAuNzM1NDE0MTBFLTEsIDAuMTE5Mzc2NTdFKzAsIDAuMTU0NDIwMzBFKzAsIDAuMjEwMTA3NTJFKzB9LAorezAuNjMxNzgwMTBFLTEsIDAuOTUyMzE0ODhFLTEsIDAuMTIzNjQ5ODNFKzAsIDAuMTc2NzI1NDNFKzAsIDAuMjE3NDM3MzFFKzB9LAorezAuNTI3NjUzNjlFLTEsIDAuODQzNTE0NDNFLTEsIDAuMTE1ODkwODVFKzAsIDAuMTU3OTA5MjRFKzAsIDAuMjA3MzIzNTJFKzB9LAorezAuNTE4NjU3NDVFLTEsIDAuODEzMjg1NDFFLTEsIDAuMTM3NTYyMzJFKzAsIDAuMTgzMjI4NzhFKzAsIDAuMjE2NDAwNzBFKzB9LAorezAuNDQ0MTk1MzFFLTEsIDAuNjg4NzQ0NjNFLTEsIDAuMTMxMTUyNTFFKzAsIDAuMTYyNjM1ODJFKzAsIDAuMjE2NTkxMDBFKzB9LAorezAuNDkzNzg0MzZFLTEsIDAuODE4ODI1NTFFLTEsIDAuMTMwNjcxNjhFKzAsIDAuMTY4MjE4OTZFKzAsIDAuMjMxMzYwODFFKzB9LAorezAuNTU5MDk3NzlFLTEsIDAuOTA3ODMyOThFLTEsIDAuMTMzNDg4NDhFKzAsIDAuMTYyOTg0NzRFKzAsIDAuMjA5NjE1MjNFKzB9LAorezAuNjEzNzgyMTFFLTEsIDAuOTg2MDI3NzJFLTEsIDAuMTQ3OTMzMzJFKzAsIDAuMTkyODMxOTBFKzAsIDAuMjMxNTY1MDlFKzB9fTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGV2cmNfbHNwcV9xdWFudF9jb2RlYm9vazJbMTZdWzVdID0geworezAuMjY4MjI5NjMsIDAuMzA1ODUyOTUsIDAuMzExMTAzNDksIDAuMzY4MjMzMzUsIDAuNDA3NzQ0NzR9LAorezAuMjQ0MTgwMTQsIDAuMjg5NzAxNjcsIDAuMzI1NzM3NTcsIDAuMzkwMjE0ODMsIDAuNDEzNDU4Mzh9LAorezAuMjMzNDE4MzAsIDAuMzAwNzgyOTIsIDAuMzI4OTM4OTksIDAuMzg1NTczMzAsIDAuNDEwNjg0NjJ9LAorezAuMjU5MDU4NjgsIDAuMjk3NTY4NTksIDAuMzQxOTY2MTgsIDAuMzg1MzExNzIsIDAuNDEyOTUyMjd9LAorezAuMjQyOTA0NTAsIDAuMjkyMjM2MTgsIDAuMzI3MTg1NTQsIDAuMzc3ODgxMzUsIDAuNDAzMzI5Mjh9LAorezAuMjQ2NzQxOTEsIDAuMjk3NDkzNzAsIDAuMzM2MzEyMjYsIDAuMzk0MjYwNTksIDAuNDIyNTg5NTR9LAorezAuMjEzNzc1OTUsIDAuMzMxNDA0MTgsIDAuMzQwNjc2ODcsIDAuMzgyMjIwNzcsIDAuNDA5MzkwMjF9LAorezAuMjY2NzM0ODEsIDAuMzA3OTE2NDksIDAuMzQ0MTk3MjEsIDAuMzk2MTE1MDYsIDAuNDIzODc1MjR9LAorezAuMjYxMjE0MjYsIDAuMzA0OTI1NDQsIDAuMzI5OTcyMzYsIDAuMzg0ODY4MDMsIDAuNDIwMjM3MzZ9LAorezAuMjQ5NTQ4NzAsIDAuMjkzNzI4NTYsIDAuMzMzODI3MzUsIDAuMzc4NTA2NjksIDAuNDE3MTQwNTd9LAorezAuMjQxNTg4OTEsIDAuMzAxNzM0MTUsIDAuMzQxMjgyNDYsIDAuMzg0Mjg1NzUsIDAuNDE2MTk2NTB9LAorezAuMjU4MTg5MDgsIDAuMzE3MzY0MTMsIDAuMzQ5MDQzMzcsIDAuMzg3Njk5MjUsIDAuNDE1NTEzNTh9LAorezAuMjQ0NTA1ODcsIDAuMzA2NzM0NTMsIDAuMzM1NzkzMjMsIDAuMzc4NDQ0MjgsIDAuNDA1NTcwNDh9LAorezAuMjUxNjQwMjYsIDAuMzEyMjUwNzksIDAuMzM4NDc3OTQsIDAuMzk1NTQxOTQsIDAuNDIzOTY4MDJ9LAorezAuMjI3ODc5OTAsIDAuMzE3NzkxOTcsIDAuMzM4MzE5MDksIDAuNDAwNDQxMTEsIDAuNDExODU1NjF9LAorezAuMjc4OTY4NjAsIDAuMzIyNjE5NzQsIDAuMzU2NTgxMTIsIDAuNDAyMDY3NjMsIDAuNDIzNzA0NDh9fTsKKworc3RhdGljIGNvbnN0IGZsb2F0ICogY29uc3QgZXZyY19sc3BxX2Z1bGxfY29kZWJvb2tzW10gPSB7CisgICAgZXZyY19sc3BxX2Z1bGxfY29kZWJvb2sxWzBdLCBldnJjX2xzcHFfZnVsbF9jb2RlYm9vazJbMF0sCisgICAgZXZyY19sc3BxX2Z1bGxfY29kZWJvb2szWzBdLCBldnJjX2xzcHFfZnVsbF9jb2RlYm9vazRbMF0sCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgKiBjb25zdCBldnJjX2xzcHFfaGFsZl9jb2RlYm9va3NbXSA9IHsKKyAgICBldnJjX2xzcHFfaGFsZl9jb2RlYm9vazFbMF0sIGV2cmNfbHNwcV9oYWxmX2NvZGVib29rMlswXSwKKyAgICBldnJjX2xzcHFfaGFsZl9jb2RlYm9vazNbMF0sCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgKiBjb25zdCBldnJjX2xzcHFfcXVhbnRfY29kZWJvb2tzW10gPSB7CisgICAgZXZyY19sc3BxX3F1YW50X2NvZGVib29rMVswXSwgZXZyY19sc3BxX3F1YW50X2NvZGVib29rMlswXSwKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCAqIGNvbnN0ICogY29uc3QgZXZyY19sc3BxX2NvZGVib29rc1tdID0geworICAgIDAsCisgICAgZXZyY19sc3BxX3F1YW50X2NvZGVib29rcywKKyAgICAwLAorICAgIGV2cmNfbHNwcV9oYWxmX2NvZGVib29rcywKKyAgICBldnJjX2xzcHFfZnVsbF9jb2RlYm9va3MsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBldnJjX2xzcHFfbmJfY29kZWJvb2tzW10gPSB7CisgICAgMCwKKyAgICBGRl9BUlJBWV9FTEVNUyhldnJjX2xzcHFfcXVhbnRfY29kZWJvb2tzKSwKKyAgICAwLAorICAgIEZGX0FSUkFZX0VMRU1TKGV2cmNfbHNwcV9oYWxmX2NvZGVib29rcyksCisgICAgRkZfQVJSQVlfRUxFTVMoZXZyY19sc3BxX2Z1bGxfY29kZWJvb2tzKSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGV2cmNfbHNwcV9mdWxsX2NvZGVib29rc19yb3dfc2l6ZXNbXSA9IHsKKyAgICBGRl9BUlJBWV9FTEVNUyhldnJjX2xzcHFfZnVsbF9jb2RlYm9vazFbMF0pLAorICAgIEZGX0FSUkFZX0VMRU1TKGV2cmNfbHNwcV9mdWxsX2NvZGVib29rMlswXSksCisgICAgRkZfQVJSQVlfRUxFTVMoZXZyY19sc3BxX2Z1bGxfY29kZWJvb2szWzBdKSwKKyAgICBGRl9BUlJBWV9FTEVNUyhldnJjX2xzcHFfZnVsbF9jb2RlYm9vazRbMF0pLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXZyY19sc3BxX2hhbGZfY29kZWJvb2tzX3Jvd19zaXplc1tdID0geworICAgIEZGX0FSUkFZX0VMRU1TKGV2cmNfbHNwcV9oYWxmX2NvZGVib29rMVswXSksCisgICAgRkZfQVJSQVlfRUxFTVMoZXZyY19sc3BxX2hhbGZfY29kZWJvb2syWzBdKSwKKyAgICBGRl9BUlJBWV9FTEVNUyhldnJjX2xzcHFfaGFsZl9jb2RlYm9vazNbMF0pLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXZyY19sc3BxX3F1YW50X2NvZGVib29rc19yb3dfc2l6ZXNbXSA9IHsKKyAgICBGRl9BUlJBWV9FTEVNUyhldnJjX2xzcHFfcXVhbnRfY29kZWJvb2sxWzBdKSwKKyAgICBGRl9BUlJBWV9FTEVNUyhldnJjX2xzcHFfcXVhbnRfY29kZWJvb2syWzBdKSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90KiBjb25zdCBldnJjX2xzcHFfY29kZWJvb2tzX3Jvd19zaXplc1tdID0geworICAgIE5VTEwsCisgICAgZXZyY19sc3BxX3F1YW50X2NvZGVib29rc19yb3dfc2l6ZXMsCisgICAgTlVMTCwKKyAgICBldnJjX2xzcHFfaGFsZl9jb2RlYm9va3Nfcm93X3NpemVzLAorICAgIGV2cmNfbHNwcV9mdWxsX2NvZGVib29rc19yb3dfc2l6ZXMsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcGl0Y2hfZ2Fpbl92cVtdID0geyAwLCAwLjMsIDAuNTUsIDAuNywgMC44LCAwLjksIDEsIDEuMiB9Oworc3RhdGljIGNvbnN0IGZsb2F0IGVzdGltYXRpb25fZGVsYXlbXSA9IHsgNTUuMCwgODAuMCwgMzkuMCwgNzEuMCwgMzMuMCB9OyAvLyA1LjIuMy40CitzdGF0aWMgY29uc3QgdWludDhfdCBzdWJmcmFtZV9zaXplc1tdID0geyA1MywgNTMsIDU0IH07CisjZW5kaWYgLyogQVZDT0RFQ19FVlJDREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ldnJjZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9ldnJjZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkMGZlNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2V2cmNkZWMuYwpAQCAtMCwwICsxLDkxNyBAQAorLyoKKyAqIEVuaGFuY2VkIFZhcmlhYmxlIFJhdGUgQ29kZWMsIFNlcnZpY2UgT3B0aW9uIDMgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEzIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBFbmhhbmNlZCBWYXJpYWJsZSBSYXRlIENvZGVjLCBTZXJ2aWNlIE9wdGlvbiAzIGRlY29kZXIKKyAqIEBhdXRob3IgUGF1bCBCIE1haG9sCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZXZyY2RhdGEuaCIKKyNpbmNsdWRlICJhY2VscF92ZWN0b3JzLmgiCisjaW5jbHVkZSAibHNwLmgiCisKKyNkZWZpbmUgTUlOX0xTUF9TRVAgKDAuMDUgLyAoMi4wICogTV9QSSkpCisjZGVmaW5lIE1JTl9ERUxBWSAgICAgIDIwCisjZGVmaW5lIE1BWF9ERUxBWSAgICAgMTIwCisjZGVmaW5lIE5CX1NVQkZSQU1FUyAgICAzCisjZGVmaW5lIFNVQkZSQU1FX1NJWkUgIDU0CisjZGVmaW5lIEZJTFRFUl9PUkRFUiAgIDEwCisjZGVmaW5lIEFDQl9TSVpFICAgICAgMTI4CisKK3R5cGVkZWYgZW51bSB7CisgICAgUkFURV9FUlJTID0gLTEsCisgICAgU0lMRU5DRSwKKyAgICBSQVRFX1FVQU5ULAorICAgIFJBVEVfUVVBUlRFUiwKKyAgICBSQVRFX0hBTEYsCisgICAgUkFURV9GVUxMLAorfSBldnJjX3BhY2tldF9yYXRlOworCisvKioKKyAqIEVWUkMtQSB1bnBhY2tlZCBkYXRhIGZyYW1lCisgKi8KK3R5cGVkZWYgc3RydWN0IEVWUkNBRnJhbWUgeworICAgIHVpbnQ4X3QgIGxwY19mbGFnOyAgICAgICAgLy8vPCBzcGVjdHJhbCBjaGFuZ2UgaW5kaWNhdG9yCisgICAgdWludDE2X3QgbHNwWzRdOyAgICAgICAgICAvLy88IGluZGV4IGludG8gTFNQIGNvZGVib29rCisgICAgdWludDhfdCAgcGl0Y2hfZGVsYXk7ICAgICAvLy88IHBpdGNoIGRlbGF5IGZvciBlbnRpcmUgZnJhbWUKKyAgICB1aW50OF90ICBkZWxheV9kaWZmOyAgICAgIC8vLzwgZGVsYXkgZGlmZmVyZW5jZSBmb3IgZW50aXJlIGZyYW1lCisgICAgdWludDhfdCAgYWNiX2dhaW5bM107ICAgICAvLy88IGFkYXB0aXZlIGNvZGVib29rIGdhaW4KKyAgICB1aW50MTZfdCBmY2Jfc2hhcGVbM11bNF07IC8vLzwgZml4ZWQgY29kZWJvb2sgc2hhcGUKKyAgICB1aW50OF90ICBmY2JfZ2FpblszXTsgICAgIC8vLzwgZml4ZWQgY29kZWJvb2sgZ2FpbiBpbmRleAorICAgIHVpbnQ4X3QgIGVuZXJneV9nYWluOyAgICAgLy8vPCBmcmFtZSBlbmVyZ3kgZ2FpbiBpbmRleAorICAgIHVpbnQ4X3QgIHR0eTsgICAgICAgICAgICAgLy8vPCB0dHkgYmF1ZCByYXRlIGJpdAorfSBFVlJDQUZyYW1lOworCit0eXBlZGVmIHN0cnVjdCBFVlJDQ29udGV4dCB7CisgICAgR2V0Qml0Q29udGV4dCAgICBnYjsKKyAgICBldnJjX3BhY2tldF9yYXRlIGJpdHJhdGU7CisgICAgZXZyY19wYWNrZXRfcmF0ZSBsYXN0X3ZhbGlkX2JpdHJhdGU7CisgICAgRVZSQ0FGcmFtZSAgICAgICBmcmFtZTsKKworICAgIGZsb2F0ICAgICAgICAgICAgbHNwZltGSUxURVJfT1JERVJdOworICAgIGZsb2F0ICAgICAgICAgICAgcHJldl9sc3BmW0ZJTFRFUl9PUkRFUl07CisgICAgZmxvYXQgICAgICAgICAgICBzeW50aGVzaXNbRklMVEVSX09SREVSXTsKKyAgICBmbG9hdCAgICAgICAgICAgIHBvc3RmaWx0ZXJfZmlyW0ZJTFRFUl9PUkRFUl07CisgICAgZmxvYXQgICAgICAgICAgICBwb3N0ZmlsdGVyX2lpcltGSUxURVJfT1JERVJdOworICAgIGZsb2F0ICAgICAgICAgICAgcG9zdGZpbHRlcl9yZXNpZHVhbFtBQ0JfU0laRSArIFNVQkZSQU1FX1NJWkVdOworICAgIGZsb2F0ICAgICAgICAgICAgcGl0Y2hfZGVsYXk7CisgICAgZmxvYXQgICAgICAgICAgICBwcmV2X3BpdGNoX2RlbGF5OworICAgIGZsb2F0ICAgICAgICAgICAgYXZnX2FjYl9nYWluOyAgLy8vPCBhdmVyYWdlIGFkYXB0aXZlIGNvZGVib29rIGdhaW4KKyAgICBmbG9hdCAgICAgICAgICAgIGF2Z19mY2JfZ2FpbjsgIC8vLzwgYXZlcmFnZSBmaXhlZCBjb2RlYm9vayBnYWluCisgICAgZmxvYXQgICAgICAgICAgICBwaXRjaFtBQ0JfU0laRSArIEZJTFRFUl9PUkRFUiArIFNVQkZSQU1FX1NJWkVdOworICAgIGZsb2F0ICAgICAgICAgICAgcGl0Y2hfYmFja1tBQ0JfU0laRV07CisgICAgZmxvYXQgICAgICAgICAgICBpbnRlcnBvbGF0aW9uX2NvZWZmc1sxMzZdOworICAgIGZsb2F0ICAgICAgICAgICAgZW5lcmd5X3ZlY3RvcltOQl9TVUJGUkFNRVNdOworICAgIGZsb2F0ICAgICAgICAgICAgZmFkZV9zY2FsZTsKKyAgICBmbG9hdCAgICAgICAgICAgIGxhc3Q7CisKKyAgICB1aW50OF90ICAgICAgICAgIHByZXZfZW5lcmd5X2dhaW47CisgICAgdWludDhfdCAgICAgICAgICBwcmV2X2Vycm9yX2ZsYWc7CisgICAgdWludDhfdCAgICAgICAgICB3YXJuZWRfYnVmX21pc21hdGNoX2JpdHJhdGU7Cit9IEVWUkNDb250ZXh0OworCisvKioKKyAqIEZyYW1lIHVucGFja2luZyBmb3IgUkFURV9GVUxMLCBSQVRFX0hBTEYgYW5kIFJBVEVfUVVBTlQKKyAqCisgKiBAcGFyYW0gZSB0aGUgY29udGV4dAorICoKKyAqIFRJQS9JUy0xMjcgVGFibGUgNC4yMS0xCisgKi8KK3N0YXRpYyB2b2lkIHVucGFja19mcmFtZShFVlJDQ29udGV4dCAqZSkKK3sKKyAgICBFVlJDQUZyYW1lICpmcmFtZSA9ICZlLT5mcmFtZTsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZlLT5nYjsKKworICAgIHN3aXRjaCAoZS0+Yml0cmF0ZSkgeworICAgIGNhc2UgUkFURV9GVUxMOgorICAgICAgICBmcmFtZS0+bHBjX2ZsYWcgICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgZnJhbWUtPmxzcFswXSAgICAgICAgICA9IGdldF9iaXRzKGdiLCAgNik7CisgICAgICAgIGZyYW1lLT5sc3BbMV0gICAgICAgICAgPSBnZXRfYml0cyhnYiwgIDYpOworICAgICAgICBmcmFtZS0+bHNwWzJdICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsICA5KTsKKyAgICAgICAgZnJhbWUtPmxzcFszXSAgICAgICAgICA9IGdldF9iaXRzKGdiLCAgNyk7CisgICAgICAgIGZyYW1lLT5waXRjaF9kZWxheSAgICAgPSBnZXRfYml0cyhnYiwgIDcpOworICAgICAgICBmcmFtZS0+ZGVsYXlfZGlmZiAgICAgID0gZ2V0X2JpdHMoZ2IsICA1KTsKKyAgICAgICAgZnJhbWUtPmFjYl9nYWluWzBdICAgICA9IGdldF9iaXRzKGdiLCAgMyk7CisgICAgICAgIGZyYW1lLT5mY2Jfc2hhcGVbMF1bMF0gPSBnZXRfYml0cyhnYiwgIDgpOworICAgICAgICBmcmFtZS0+ZmNiX3NoYXBlWzBdWzFdID0gZ2V0X2JpdHMoZ2IsICA4KTsKKyAgICAgICAgZnJhbWUtPmZjYl9zaGFwZVswXVsyXSA9IGdldF9iaXRzKGdiLCAgOCk7CisgICAgICAgIGZyYW1lLT5mY2Jfc2hhcGVbMF1bM10gPSBnZXRfYml0cyhnYiwgMTEpOworICAgICAgICBmcmFtZS0+ZmNiX2dhaW5bMF0gICAgID0gZ2V0X2JpdHMoZ2IsICA1KTsKKyAgICAgICAgZnJhbWUtPmFjYl9nYWluWzFdICAgICA9IGdldF9iaXRzKGdiLCAgMyk7CisgICAgICAgIGZyYW1lLT5mY2Jfc2hhcGVbMV1bMF0gPSBnZXRfYml0cyhnYiwgIDgpOworICAgICAgICBmcmFtZS0+ZmNiX3NoYXBlWzFdWzFdID0gZ2V0X2JpdHMoZ2IsICA4KTsKKyAgICAgICAgZnJhbWUtPmZjYl9zaGFwZVsxXVsyXSA9IGdldF9iaXRzKGdiLCAgOCk7CisgICAgICAgIGZyYW1lLT5mY2Jfc2hhcGVbMV1bM10gPSBnZXRfYml0cyhnYiwgMTEpOworICAgICAgICBmcmFtZS0+ZmNiX2dhaW4gICAgWzFdID0gZ2V0X2JpdHMoZ2IsICA1KTsKKyAgICAgICAgZnJhbWUtPmFjYl9nYWluICAgIFsyXSA9IGdldF9iaXRzKGdiLCAgMyk7CisgICAgICAgIGZyYW1lLT5mY2Jfc2hhcGVbMl1bMF0gPSBnZXRfYml0cyhnYiwgIDgpOworICAgICAgICBmcmFtZS0+ZmNiX3NoYXBlWzJdWzFdID0gZ2V0X2JpdHMoZ2IsICA4KTsKKyAgICAgICAgZnJhbWUtPmZjYl9zaGFwZVsyXVsyXSA9IGdldF9iaXRzKGdiLCAgOCk7CisgICAgICAgIGZyYW1lLT5mY2Jfc2hhcGVbMl1bM10gPSBnZXRfYml0cyhnYiwgMTEpOworICAgICAgICBmcmFtZS0+ZmNiX2dhaW4gICAgWzJdID0gZ2V0X2JpdHMoZ2IsICA1KTsKKyAgICAgICAgZnJhbWUtPnR0eSAgICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFURV9IQUxGOgorICAgICAgICBmcmFtZS0+bHNwICAgICAgICAgWzBdID0gZ2V0X2JpdHMoZ2IsICA3KTsKKyAgICAgICAgZnJhbWUtPmxzcCAgICAgICAgIFsxXSA9IGdldF9iaXRzKGdiLCAgNyk7CisgICAgICAgIGZyYW1lLT5sc3AgICAgICAgICBbMl0gPSBnZXRfYml0cyhnYiwgIDgpOworICAgICAgICBmcmFtZS0+cGl0Y2hfZGVsYXkgICAgID0gZ2V0X2JpdHMoZ2IsICA3KTsKKyAgICAgICAgZnJhbWUtPmFjYl9nYWluICAgIFswXSA9IGdldF9iaXRzKGdiLCAgMyk7CisgICAgICAgIGZyYW1lLT5mY2Jfc2hhcGVbMF1bMF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICBmcmFtZS0+ZmNiX2dhaW4gICAgWzBdID0gZ2V0X2JpdHMoZ2IsICA0KTsKKyAgICAgICAgZnJhbWUtPmFjYl9nYWluICAgIFsxXSA9IGdldF9iaXRzKGdiLCAgMyk7CisgICAgICAgIGZyYW1lLT5mY2Jfc2hhcGVbMV1bMF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICBmcmFtZS0+ZmNiX2dhaW4gICAgWzFdID0gZ2V0X2JpdHMoZ2IsICA0KTsKKyAgICAgICAgZnJhbWUtPmFjYl9nYWluICAgIFsyXSA9IGdldF9iaXRzKGdiLCAgMyk7CisgICAgICAgIGZyYW1lLT5mY2Jfc2hhcGVbMl1bMF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICBmcmFtZS0+ZmNiX2dhaW4gICAgWzJdID0gZ2V0X2JpdHMoZ2IsICA0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQVRFX1FVQU5UOgorICAgICAgICBmcmFtZS0+bHNwICAgICAgICAgWzBdID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBmcmFtZS0+bHNwICAgICAgICAgWzFdID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBmcmFtZS0+ZW5lcmd5X2dhaW4gICAgID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBldnJjX3BhY2tldF9yYXRlIGJ1Zl9zaXplMmJpdHJhdGUoY29uc3QgaW50IGJ1Zl9zaXplKQoreworICAgIHN3aXRjaCAoYnVmX3NpemUpIHsKKyAgICBjYXNlIDIzOiByZXR1cm4gUkFURV9GVUxMOworICAgIGNhc2UgMTE6IHJldHVybiBSQVRFX0hBTEY7CisgICAgY2FzZSAgNjogcmV0dXJuIFJBVEVfUVVBUlRFUjsKKyAgICBjYXNlICAzOiByZXR1cm4gUkFURV9RVUFOVDsKKyAgICBjYXNlICAxOiByZXR1cm4gU0lMRU5DRTsKKyAgICB9CisKKyAgICByZXR1cm4gUkFURV9FUlJTOworfQorCisvKioKKyAqIERldGVybWluZSB0aGUgYml0cmF0ZSBmcm9tIHRoZSBmcmFtZSBzaXplIGFuZC9vciB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZnJhbWUuCisgKgorICogQHBhcmFtIGF2Y3R4IHRoZSBBViBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW0gYnVmX3NpemUgbGVuZ3RoIG9mIHRoZSBidWZmZXIKKyAqIEBwYXJhbSBidWYgdGhlIGJ1ZmZmZXIKKyAqCisgKiBAcmV0dXJuIHRoZSBiaXRyYXRlIG9uIHN1Y2Nlc3MsCisgKiAgICAgICAgIFJBVEVfRVJSUyAgaWYgdGhlIGJpdHJhdGUgY2Fubm90IGJlIHNhdGlzZmFjdG9yaWx5IGRldGVybWluZWQKKyAqLworc3RhdGljIGV2cmNfcGFja2V0X3JhdGUgZGV0ZXJtaW5lX2JpdHJhdGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipidWYpCit7CisgICAgZXZyY19wYWNrZXRfcmF0ZSBiaXRyYXRlOworCisgICAgaWYgKChiaXRyYXRlID0gYnVmX3NpemUyYml0cmF0ZSgqYnVmX3NpemUpKSA+PSAwKSB7CisgICAgICAgIGlmIChiaXRyYXRlID4gKipidWYpIHsKKyAgICAgICAgICAgIEVWUkNDb250ZXh0ICplID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICAgICAgICAgIGlmICghZS0+d2FybmVkX2J1Zl9taXNtYXRjaF9iaXRyYXRlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIkNsYWltZWQgYml0cmF0ZSBhbmQgYnVmZmVyIHNpemUgbWlzbWF0Y2guXG4iKTsKKyAgICAgICAgICAgICAgICBlLT53YXJuZWRfYnVmX21pc21hdGNoX2JpdHJhdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYml0cmF0ZSA9ICoqYnVmOworICAgICAgICB9IGVsc2UgaWYgKGJpdHJhdGUgPCAqKmJ1ZikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBpcyB0b28gc21hbGwgZm9yIHRoZSBjbGFpbWVkIGJpdHJhdGUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBSQVRFX0VSUlM7CisgICAgICAgIH0KKyAgICAgICAgKCpidWYpKys7CisgICAgICAgICpidWZfc2l6ZSAtPSAxOworICAgIH0gZWxzZSBpZiAoKGJpdHJhdGUgPSBidWZfc2l6ZTJiaXRyYXRlKCpidWZfc2l6ZSArIDEpKSA+PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgIkJpdHJhdGUgYnl0ZSBpcyBtaXNzaW5nLCBndWVzc2luZyB0aGUgYml0cmF0ZSBmcm9tIHBhY2tldCBzaXplLlxuIik7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBSQVRFX0VSUlM7CisKKyAgICByZXR1cm4gYml0cmF0ZTsKK30KKworc3RhdGljIHZvaWQgd2Fybl9pbnN1ZmZpY2llbnRfZnJhbWVfcXVhbGl0eShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkZyYW1lICMlZCwgJXNcbiIsCisgICAgICAgICAgIGF2Y3R4LT5mcmFtZV9udW1iZXIsIG1lc3NhZ2UpOworfQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIHNwZWVjaCBjb2RlYyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24uCisgKgorICogVElBL0lTLTEyNyA1LjIKKyAqLworc3RhdGljIGF2X2NvbGQgaW50IGV2cmNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEVWUkNDb250ZXh0ICplID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgbiwgaWR4ID0gMDsKKyAgICBmbG9hdCBkZW5vbSA9IDIuMCAvICgyLjAgKiA4LjAgKyAxLjApOworCisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCAgICAgPSBBVl9TQU1QTEVfRk1UX0ZMVDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGSUxURVJfT1JERVI7IGkrKykgeworICAgICAgICBlLT5wcmV2X2xzcGZbaV0gPSAoaSArIDEpICogMC4wNDg7CisgICAgICAgIGUtPnN5bnRoZXNpc1tpXSA9IDAuMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQUNCX1NJWkU7IGkrKykKKyAgICAgICAgZS0+cGl0Y2hbaV0gPSBlLT5waXRjaF9iYWNrW2ldID0gMC4wOworCisgICAgZS0+bGFzdF92YWxpZF9iaXRyYXRlID0gUkFURV9RVUFOVDsKKyAgICBlLT5wcmV2X3BpdGNoX2RlbGF5ICAgPSA0MC4wOworICAgIGUtPmZhZGVfc2NhbGUgICAgICAgICA9IDEuMDsKKyAgICBlLT5wcmV2X2Vycm9yX2ZsYWcgICAgPSAwOworICAgIGUtPmF2Z19hY2JfZ2FpbiA9IGUtPmF2Z19mY2JfZ2FpbiA9IDAuMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgZmxvYXQgdHQgPSAoKGZsb2F0KWkgLSA4LjAgLyAyLjApIC8gOC4wOworCisgICAgICAgIGZvciAobiA9IC04OyBuIDw9IDg7IG4rKywgaWR4KyspIHsKKyAgICAgICAgICAgIGZsb2F0IGFyZzEgPSBNX1BJICogMC45ICogKHR0IC0gbik7CisgICAgICAgICAgICBmbG9hdCBhcmcyID0gTV9QSSAqICh0dCAtIG4pOworCisgICAgICAgICAgICBlLT5pbnRlcnBvbGF0aW9uX2NvZWZmc1tpZHhdID0gMC45OworICAgICAgICAgICAgaWYgKGFyZzEpCisgICAgICAgICAgICAgICAgZS0+aW50ZXJwb2xhdGlvbl9jb2VmZnNbaWR4XSAqPSAoMC41NCArIDAuNDYgKiBjb3MoYXJnMiAqIGRlbm9tKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbihhcmcxKSAvIGFyZzE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgdGhlIDEwIHZlY3RvciBxdWFudGl6ZWQgbGluZSBzcGVjdHJhbCBwYWlyIGZyZXF1ZW5jaWVzIGZyb20gdGhlIExTUAorICogdHJhbnNtaXNzaW9uIGNvZGVzIG9mIGFueSBiaXRyYXRlIGFuZCBjaGVjayBmb3IgYmFkbHkgcmVjZWl2ZWQgcGFja2V0cy4KKyAqCisgKiBAcGFyYW0gZSB0aGUgY29udGV4dAorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBpZiB0aGUgcGFja2V0IGlzIGJhZGx5IHJlY2VpdmVkCisgKgorICogVElBL0lTLTEyNyA1LjIuMSwgNS43LjEKKyAqLworc3RhdGljIGludCBkZWNvZGVfbHNwZihFVlJDQ29udGV4dCAqZSkKK3sKKyAgICBjb25zdCBmbG9hdCAqIGNvbnN0ICpjb2RlYm9va3MgPSBldnJjX2xzcHFfY29kZWJvb2tzW2UtPmJpdHJhdGVdOworICAgIGludCBpLCBqLCBrID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBldnJjX2xzcHFfbmJfY29kZWJvb2tzW2UtPmJpdHJhdGVdOyBpKyspIHsKKyAgICAgICAgaW50IHJvd19zaXplID0gZXZyY19sc3BxX2NvZGVib29rc19yb3dfc2l6ZXNbZS0+Yml0cmF0ZV1baV07CisgICAgICAgIGNvbnN0IGZsb2F0ICpjb2RlYm9vayA9IGNvZGVib29rc1tpXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcm93X3NpemU7IGorKykKKyAgICAgICAgICAgIGUtPmxzcGZbaysrXSA9IGNvZGVib29rW2UtPmZyYW1lLmxzcFtpXSAqIHJvd19zaXplICsgal07CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIG1vbm90b25pYyBMU1BzCisgICAgZm9yIChpID0gMTsgaSA8IEZJTFRFUl9PUkRFUjsgaSsrKQorICAgICAgICBpZiAoZS0+bHNwZltpXSA8PSBlLT5sc3BmW2kgLSAxXSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vIGNoZWNrIGZvciBtaW5pbXVtIHNlcGFyYXRpb24gb2YgTFNQcyBhdCB0aGUgc3BsaXRzCisgICAgZm9yIChpID0gMCwgayA9IDA7IGkgPCBldnJjX2xzcHFfbmJfY29kZWJvb2tzW2UtPmJpdHJhdGVdIC0gMTsgaSsrKSB7CisgICAgICAgIGsgKz0gZXZyY19sc3BxX2NvZGVib29rc19yb3dfc2l6ZXNbZS0+Yml0cmF0ZV1baV07CisgICAgICAgIGlmIChlLT5sc3BmW2tdIC0gZS0+bHNwZltrIC0gMV0gPD0gTUlOX0xTUF9TRVApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbnRlcnBvbGF0aW9uIG9mIExTUCBwYXJhbWV0ZXJzLgorICoKKyAqIFRJQS9JUy0xMjcgNS4yLjMuMSwgNS43LjMuMgorICovCitzdGF0aWMgdm9pZCBpbnRlcnBvbGF0ZV9sc3AoZmxvYXQgKmlsc3AsIGNvbnN0IGZsb2F0ICpsc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnByZXYsIGludCBpbmRleCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbHNwX2ludGVycG9sYXRpb25fZmFjdG9yc1tdID0geyAwLjE2NjcsIDAuNSwgMC44MzMzIH07CisgICAgZmZfd2VpZ2h0ZWRfdmVjdG9yX3N1bWYoaWxzcCwgcHJldiwgbHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMCAtIGxzcF9pbnRlcnBvbGF0aW9uX2ZhY3RvcnNbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzcF9pbnRlcnBvbGF0aW9uX2ZhY3RvcnNbaW5kZXhdLCBGSUxURVJfT1JERVIpOworfQorCisvKgorICogUmVjb25zdHJ1Y3Rpb24gb2YgdGhlIGRlbGF5IGNvbnRvdXIuCisgKgorICogVElBL0lTLTEyNyA1LjIuMi4zLjIKKyAqLworc3RhdGljIHZvaWQgaW50ZXJwb2xhdGVfZGVsYXkoZmxvYXQgKmRzdCwgZmxvYXQgY3VycmVudCwgZmxvYXQgcHJldiwgaW50IGluZGV4KQoreworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBkX2ludGVycG9sYXRpb25fZmFjdG9yc1tdID0geyAwLCAwLjMzMTMsIDAuNjYyNSwgMSwgMSB9OworICAgIGRzdFswXSA9ICgxLjAgLSBkX2ludGVycG9sYXRpb25fZmFjdG9yc1tpbmRleCAgICBdKSAqIHByZXYKKyAgICAgICAgICAgICAgICAgICsgZF9pbnRlcnBvbGF0aW9uX2ZhY3RvcnNbaW5kZXggICAgXSAgKiBjdXJyZW50OworICAgIGRzdFsxXSA9ICgxLjAgLSBkX2ludGVycG9sYXRpb25fZmFjdG9yc1tpbmRleCArIDFdKSAqIHByZXYKKyAgICAgICAgICAgICAgICAgICsgZF9pbnRlcnBvbGF0aW9uX2ZhY3RvcnNbaW5kZXggKyAxXSAgKiBjdXJyZW50OworICAgIGRzdFsyXSA9ICgxLjAgLSBkX2ludGVycG9sYXRpb25fZmFjdG9yc1tpbmRleCArIDJdKSAqIHByZXYKKyAgICAgICAgICAgICAgICAgICsgZF9pbnRlcnBvbGF0aW9uX2ZhY3RvcnNbaW5kZXggKyAyXSAgKiBjdXJyZW50OworfQorCisvKgorICogQ29udmVydCB0aGUgcXVhbnRpemVkLCBpbnRlcnBvbGF0ZWQgbGluZSBzcGVjdHJhbCBmcmVxdWVuY2llcywKKyAqIHRvIHByZWRpY3Rpb24gY29lZmZpY2llbnRzLgorICoKKyAqIFRJQS9JUy0xMjcgNS4yLjMuMiwgNC43LjIuMgorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfcHJlZGljdG9yX2NvZWZmcyhjb25zdCBmbG9hdCAqaWxzcGYsIGZsb2F0ICppbHBjKQoreworICAgIGRvdWJsZSBsc3BbRklMVEVSX09SREVSXTsKKyAgICBmbG9hdCBhW0ZJTFRFUl9PUkRFUiAvIDIgKyAxXSwgYltGSUxURVJfT1JERVIgLyAyICsgMV07CisgICAgZmxvYXQgYTFbRklMVEVSX09SREVSIC8gMl0gPSB7IDAgfTsKKyAgICBmbG9hdCBhMltGSUxURVJfT1JERVIgLyAyXSA9IHsgMCB9OworICAgIGZsb2F0IGIxW0ZJTFRFUl9PUkRFUiAvIDJdID0geyAwIH07CisgICAgZmxvYXQgYjJbRklMVEVSX09SREVSIC8gMl0gPSB7IDAgfTsKKyAgICBpbnQgaSwgazsKKworICAgIGZmX2FjZWxwX2xzZjJsc3BkKGxzcCwgaWxzcGYsIEZJTFRFUl9PUkRFUik7CisKKyAgICBmb3IgKGsgPSAwOyBrIDw9IEZJTFRFUl9PUkRFUjsgaysrKSB7CisgICAgICAgIGFbMF0gPSBrIDwgMiA/IDAuMjUgOiAwOworICAgICAgICBiWzBdID0gayA8IDIgPyBrIDwgMSA/IDAuMjUgOiAtMC4yNSA6IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZJTFRFUl9PUkRFUiAvIDI7IGkrKykgeworICAgICAgICAgICAgYVtpICsgMV0gPSBhW2ldIC0gMiAqIGxzcFtpICogMiAgICBdICogYTFbaV0gKyBhMltpXTsKKyAgICAgICAgICAgIGJbaSArIDFdID0gYltpXSAtIDIgKiBsc3BbaSAqIDIgKyAxXSAqIGIxW2ldICsgYjJbaV07CisgICAgICAgICAgICBhMltpXSA9IGExW2ldOworICAgICAgICAgICAgYTFbaV0gPSBhW2ldOworICAgICAgICAgICAgYjJbaV0gPSBiMVtpXTsKKyAgICAgICAgICAgIGIxW2ldID0gYltpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChrKQorICAgICAgICAgICAgaWxwY1trIC0gMV0gPSAyLjAgKiAoYVtGSUxURVJfT1JERVIgLyAyXSArIGJbRklMVEVSX09SREVSIC8gMl0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYmxfaW50cnAoRVZSQ0NvbnRleHQgKmUsIGZsb2F0ICpleCwgZmxvYXQgZGVsYXkpCit7CisgICAgZmxvYXQgKmY7CisgICAgaW50IG9mZnNldCwgaSwgY29lZl9pZHg7CisgICAgaW50MTZfdCB0OworCisgICAgb2Zmc2V0ID0gbHJpbnRmKGRlbGF5KTsKKworICAgIHQgPSAob2Zmc2V0IC0gZGVsYXkgKyAwLjUpICogOC4wICsgMC41OworICAgIGlmICh0ID09IDgpIHsKKyAgICAgICAgdCA9IDA7CisgICAgICAgIG9mZnNldC0tOworICAgIH0KKworICAgIGYgPSBleCAtIG9mZnNldCAtIDg7CisKKyAgICBjb2VmX2lkeCA9IHQgKiAoMiAqIDggKyAxKTsKKworICAgIGV4WzBdID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCAyICogOCArIDE7IGkrKykKKyAgICAgICAgZXhbMF0gKz0gZS0+aW50ZXJwb2xhdGlvbl9jb2VmZnNbY29lZl9pZHggKyBpXSAqIGZbaV07Cit9CisKKy8qCisgKiBBZGFwdGl2ZSBjb2RlYm9vayBleGNpdGF0aW9uLgorICoKKyAqIFRJQS9JUy0xMjcgNS4yLjIuMy4zLCA0LjEyLjUuMgorICovCitzdGF0aWMgdm9pZCBhY2JfZXhjaXRhdGlvbihFVlJDQ29udGV4dCAqZSwgZmxvYXQgKmV4Y2l0YXRpb24sIGZsb2F0IGdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBkZWxheVszXSwgaW50IGxlbmd0aCkKK3sKKyAgICBmbG9hdCBkZW5vbSwgbG9jZGVsYXksIGRwciwgaW52bDsKKyAgICBpbnQgaTsKKworICAgIGludmwgPSAxLjAgLyAoKGZsb2F0KSBsZW5ndGgpOworICAgIGRwciA9IGxlbmd0aDsKKworICAgIC8qIGZpcnN0IGF0LW1vc3QgZXh0cmEgc2FtcGxlcyAqLworICAgIGRlbm9tID0gKGRlbGF5WzFdIC0gZGVsYXlbMF0pICogaW52bDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHByOyBpKyspIHsKKyAgICAgICAgbG9jZGVsYXkgPSBkZWxheVswXSArIGkgKiBkZW5vbTsKKyAgICAgICAgYmxfaW50cnAoZSwgZXhjaXRhdGlvbiArIGksIGxvY2RlbGF5KTsKKyAgICB9CisKKyAgICBkZW5vbSA9IChkZWxheVsyXSAtIGRlbGF5WzFdKSAqIGludmw7CisgICAgLyogaW50ZXJwb2xhdGlvbiAqLworICAgIGZvciAoaSA9IGRwcjsgaSA8IGRwciArIDEwOyBpKyspIHsKKyAgICAgICAgbG9jZGVsYXkgPSBkZWxheVsxXSArIChpIC0gZHByKSAqIGRlbm9tOworICAgICAgICBibF9pbnRycChlLCBleGNpdGF0aW9uICsgaSwgbG9jZGVsYXkpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgZXhjaXRhdGlvbltpXSAqPSBnYWluOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfOF9wdWxzZXNfMzViaXRzKGNvbnN0IHVpbnQxNl90ICpmaXhlZF9pbmRleCwgZmxvYXQgKmNvZCkKK3sKKyAgICBpbnQgaSwgcG9zMSwgcG9zMiwgb2Zmc2V0OworCisgICAgb2Zmc2V0ID0gKGZpeGVkX2luZGV4WzNdID4+IDkpICYgMzsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgcG9zMSA9ICgoZml4ZWRfaW5kZXhbaV0gJiAweDdmKSAvIDExKSAqIDUgKyAoKGkgKyBvZmZzZXQpICUgNSk7CisgICAgICAgIHBvczIgPSAoKGZpeGVkX2luZGV4W2ldICYgMHg3ZikgJSAxMSkgKiA1ICsgKChpICsgb2Zmc2V0KSAlIDUpOworCisgICAgICAgIGNvZFtwb3MxXSA9IChmaXhlZF9pbmRleFtpXSAmIDB4ODApID8gLTEuMCA6IDEuMDsKKworICAgICAgICBpZiAocG9zMiA8IHBvczEpCisgICAgICAgICAgICBjb2RbcG9zMl0gID0gLWNvZFtwb3MxXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29kW3BvczJdICs9ICBjb2RbcG9zMV07CisgICAgfQorCisgICAgcG9zMSA9ICgoZml4ZWRfaW5kZXhbM10gJiAweDdmKSAvIDExKSAqIDUgKyAoKDMgKyBvZmZzZXQpICUgNSk7CisgICAgcG9zMiA9ICgoZml4ZWRfaW5kZXhbM10gJiAweDdmKSAlIDExKSAqIDUgKyAoKDQgKyBvZmZzZXQpICUgNSk7CisKKyAgICBjb2RbcG9zMV0gPSAoZml4ZWRfaW5kZXhbM10gJiAweDEwMCkgPyAtMS4wIDogMS4wOworICAgIGNvZFtwb3MyXSA9IChmaXhlZF9pbmRleFszXSAmIDB4ODAgKSA/IC0xLjAgOiAxLjA7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV8zX3B1bHNlc18xMGJpdHModWludDE2X3QgZml4ZWRfaW5kZXgsIGZsb2F0ICpjb2QpCit7CisgICAgZmxvYXQgc2lnbjsKKyAgICBpbnQgcG9zOworCisgICAgc2lnbiA9IChmaXhlZF9pbmRleCAmIDB4MjAwKSA/IC0xLjAgOiAxLjA7CisKKyAgICBwb3MgPSAoKGZpeGVkX2luZGV4ICAgICAgICAmIDB4NykgKiA3KSArIDQ7CisgICAgY29kW3Bvc10gKz0gc2lnbjsKKyAgICBwb3MgPSAoKChmaXhlZF9pbmRleCA+PiAzKSAmIDB4NykgKiA3KSArIDI7CisgICAgY29kW3Bvc10gLT0gc2lnbjsKKyAgICBwb3MgPSAoKChmaXhlZF9pbmRleCA+PiA2KSAmIDB4NykgKiA3KTsKKyAgICBjb2RbcG9zXSArPSBzaWduOworfQorCisvKgorICogUmVjb25zdHJ1Y3Rpb24gb2YgQUNFTFAgZml4ZWQgY29kZWJvb2sgZXhjaXRhdGlvbiBmb3IgZnVsbCBhbmQgaGFsZiByYXRlLgorICoKKyAqIFRJQS9JUy0xMjcgNS4yLjMuNworICovCitzdGF0aWMgdm9pZCBmY2JfZXhjaXRhdGlvbihFVlJDQ29udGV4dCAqZSwgY29uc3QgdWludDE2X3QgKmNvZGVib29rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmV4Y2l0YXRpb24sIGZsb2F0IHBpdGNoX2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfbGFnLCBpbnQgc3ViZnJhbWVfc2l6ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChlLT5iaXRyYXRlID09IFJBVEVfRlVMTCkKKyAgICAgICAgZGVjb2RlXzhfcHVsc2VzXzM1Yml0cyhjb2RlYm9vaywgZXhjaXRhdGlvbik7CisgICAgZWxzZQorICAgICAgICBkZWNvZGVfM19wdWxzZXNfMTBiaXRzKCpjb2RlYm9vaywgZXhjaXRhdGlvbik7CisKKyAgICBwaXRjaF9nYWluID0gYXZfY2xpcGYocGl0Y2hfZ2FpbiwgMC4yLCAwLjkpOworCisgICAgZm9yIChpID0gcGl0Y2hfbGFnOyBpIDwgc3ViZnJhbWVfc2l6ZTsgaSsrKQorICAgICAgICBleGNpdGF0aW9uW2ldICs9IHBpdGNoX2dhaW4gKiBleGNpdGF0aW9uW2kgLSBwaXRjaF9sYWddOworfQorCisvKioKKyAqIFN5bnRoZXNpcyBvZiB0aGUgZGVjb2RlciBvdXRwdXQgc2lnbmFsLgorICoKKyAqIHBhcmFtW2luXSAgICAgaW4gICAgICAgICAgICAgIGlucHV0IHNpZ25hbAorICogcGFyYW1baW5dICAgICBmaWx0ZXJfY29lZmZzICAgTFBDIGNvZWZmaWNpZW50cworICogcGFyYW1baW4vb3V0XSBtZW1vcnkgICAgICAgICAgc3ludGhlc2lzIGZpbHRlciBtZW1vcnkKKyAqIHBhcmFtICAgICAgICAgYnVmZmVyX2xlbmd0aCAgIGFtb3VudCBvZiBkYXRhIHRvIHByb2Nlc3MKKyAqIHBhcmFtW291dF0gICAgc2FtcGxlcyAgICAgICAgIG91dHB1dCBzYW1wbGVzCisgKgorICogVElBL0lTLTEyNyA1LjIuMy4xNSwgNS43LjMuNAorICovCitzdGF0aWMgdm9pZCBzeW50aGVzaXNfZmlsdGVyKGNvbnN0IGZsb2F0ICppbiwgY29uc3QgZmxvYXQgKmZpbHRlcl9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICptZW1vcnksIGludCBidWZmZXJfbGVuZ3RoLCBmbG9hdCAqc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgc2FtcGxlc1tpXSA9IGluW2ldOworICAgICAgICBmb3IgKGogPSBGSUxURVJfT1JERVIgLSAxOyBqID4gMDsgai0tKSB7CisgICAgICAgICAgICBzYW1wbGVzW2ldIC09IGZpbHRlcl9jb2VmZnNbal0gKiBtZW1vcnlbal07CisgICAgICAgICAgICBtZW1vcnlbal0gICA9IG1lbW9yeVtqIC0gMV07CisgICAgICAgIH0KKyAgICAgICAgc2FtcGxlc1tpXSAtPSBmaWx0ZXJfY29lZmZzWzBdICogbWVtb3J5WzBdOworICAgICAgICBtZW1vcnlbMF0gICA9IHNhbXBsZXNbaV07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBiYW5kd2lkdGhfZXhwYW5zaW9uKGZsb2F0ICpjb2VmZiwgY29uc3QgZmxvYXQgKmluYnVmLCBmbG9hdCBnYW1tYSkKK3sKKyAgICBkb3VibGUgZmFjID0gZ2FtbWE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgICAgY29lZmZbaV0gPSBpbmJ1ZltpXSAqIGZhYzsKKyAgICAgICAgZmFjICo9IGdhbW1hOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVzaWR1YWxfZmlsdGVyKGZsb2F0ICpvdXRwdXQsIGNvbnN0IGZsb2F0ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqY29lZiwgZmxvYXQgKm1lbW9yeSwgaW50IGxlbmd0aCkKK3sKKyAgICBmbG9hdCBzdW07CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgc3VtID0gaW5wdXRbaV07CisKKyAgICAgICAgZm9yIChqID0gRklMVEVSX09SREVSIC0gMTsgaiA+IDA7IGotLSkgeworICAgICAgICAgICAgc3VtICAgICAgKz0gY29lZltqXSAqIG1lbW9yeVtqXTsKKyAgICAgICAgICAgIG1lbW9yeVtqXSA9IG1lbW9yeVtqIC0gMV07CisgICAgICAgIH0KKyAgICAgICAgc3VtICs9IGNvZWZbMF0gKiBtZW1vcnlbMF07CisgICAgICAgIG1lbW9yeVswXSA9IGlucHV0W2ldOworICAgICAgICBvdXRwdXRbaV0gPSBzdW07CisgICAgfQorfQorCisvKgorICogVElBL0lTLTEyNyBUYWJsZSA1LjkuMS0xLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IFBmQ29lZmYgeworICAgIGZsb2F0IHRpbHQ7CisgICAgZmxvYXQgbHRnYWluOworICAgIGZsb2F0IHAxOworICAgIGZsb2F0IHAyOworfSBwb3N0ZmlsdGVyX2NvZWZmc1s1XSA9IHsKKyAgICB7IDAuMCAsIDAuMCAsIDAuMCAsIDAuMCAgfSwKKyAgICB7IDAuMCAsIDAuMCAsIDAuNTcsIDAuNTcgfSwKKyAgICB7IDAuMCAsIDAuMCAsIDAuMCAsIDAuMCAgfSwKKyAgICB7IDAuMzUsIDAuNTAsIDAuNTAsIDAuNzUgfSwKKyAgICB7IDAuMjAsIDAuNTAsIDAuNTcsIDAuNzUgfSwKK307CisKKy8qCisgKiBBZGFwdGl2ZSBwb3N0ZmlsdGVyLgorICoKKyAqIFRJQS9JUy0xMjcgNS45CisgKi8KK3N0YXRpYyB2b2lkIHBvc3RmaWx0ZXIoRVZSQ0NvbnRleHQgKmUsIGZsb2F0ICppbiwgY29uc3QgZmxvYXQgKmNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0LCBpbnQgaWR4LCBjb25zdCBzdHJ1Y3QgUGZDb2VmZiAqcGZjLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKQoreworICAgIGZsb2F0IHdjb2VmMVtGSUxURVJfT1JERVJdLCB3Y29lZjJbRklMVEVSX09SREVSXSwKKyAgICAgICAgICBzY3JhdGNoW1NVQkZSQU1FX1NJWkVdLCB0ZW1wW1NVQkZSQU1FX1NJWkVdLAorICAgICAgICAgIG1lbVtTVUJGUkFNRV9TSVpFXTsKKyAgICBmbG9hdCBzdW0xID0gMC4wLCBzdW0yID0gMC4wLCBnYW1tYSwgZ2FpbjsKKyAgICBmbG9hdCB0aWx0ID0gcGZjLT50aWx0OworICAgIGludCBpLCBuLCBiZXN0OworCisgICAgYmFuZHdpZHRoX2V4cGFuc2lvbih3Y29lZjEsIGNvZWZmLCBwZmMtPnAxKTsKKyAgICBiYW5kd2lkdGhfZXhwYW5zaW9uKHdjb2VmMiwgY29lZmYsIHBmYy0+cDIpOworCisgICAgLyogVGlsdCBjb21wZW5zYXRpb24gZmlsdGVyLCBUSUEvSVMtMTI3IDUuOS4xICovCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykKKyAgICAgICAgc3VtMiArPSBpbltpXSAqIGluW2kgKyAxXTsKKyAgICBpZiAoc3VtMiA8IDAuMCkKKyAgICAgICAgdGlsdCA9IDAuMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBzY3JhdGNoW2ldID0gaW5baV0gLSB0aWx0ICogZS0+bGFzdDsKKyAgICAgICAgZS0+bGFzdCA9IGluW2ldOworICAgIH0KKworICAgIC8qIFNob3J0IHRlcm0gcmVzaWR1YWwgZmlsdGVyLCBUSUEvSVMtMTI3IDUuOS4yICovCisgICAgcmVzaWR1YWxfZmlsdGVyKCZlLT5wb3N0ZmlsdGVyX3Jlc2lkdWFsW0FDQl9TSVpFXSwgc2NyYXRjaCwgd2NvZWYxLCBlLT5wb3N0ZmlsdGVyX2ZpciwgbGVuZ3RoKTsKKworICAgIC8qIExvbmcgdGVybSBwb3N0ZmlsdGVyICovCisgICAgYmVzdCA9IGlkeDsKKyAgICBmb3IgKGkgPSBGRk1JTihNSU5fREVMQVksIGlkeCAtIDMpOyBpIDw9IEZGTUFYKE1BWF9ERUxBWSwgaWR4ICsgMyk7IGkrKykgeworICAgICAgICBmb3IgKG4gPSBBQ0JfU0laRSwgc3VtMiA9IDA7IG4gPCBBQ0JfU0laRSArIGxlbmd0aDsgbisrKQorICAgICAgICAgICAgc3VtMiArPSBlLT5wb3N0ZmlsdGVyX3Jlc2lkdWFsW25dICogZS0+cG9zdGZpbHRlcl9yZXNpZHVhbFtuIC0gaV07CisgICAgICAgIGlmIChzdW0yID4gc3VtMSkgeworICAgICAgICAgICAgc3VtMSA9IHN1bTI7CisgICAgICAgICAgICBiZXN0ID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IEFDQl9TSVpFLCBzdW0xID0gMDsgaSA8IEFDQl9TSVpFICsgbGVuZ3RoOyBpKyspCisgICAgICAgIHN1bTEgKz0gZS0+cG9zdGZpbHRlcl9yZXNpZHVhbFtpIC0gYmVzdF0gKiBlLT5wb3N0ZmlsdGVyX3Jlc2lkdWFsW2kgLSBiZXN0XTsKKyAgICBmb3IgKGkgPSBBQ0JfU0laRSwgc3VtMiA9IDA7IGkgPCBBQ0JfU0laRSArIGxlbmd0aDsgaSsrKQorICAgICAgICBzdW0yICs9IGUtPnBvc3RmaWx0ZXJfcmVzaWR1YWxbaV0gKiBlLT5wb3N0ZmlsdGVyX3Jlc2lkdWFsW2kgLSBiZXN0XTsKKworICAgIGlmIChzdW0yICogc3VtMSA9PSAwIHx8IGUtPmJpdHJhdGUgPT0gUkFURV9RVUFOVCkgeworICAgICAgICBtZW1jcHkodGVtcCwgZS0+cG9zdGZpbHRlcl9yZXNpZHVhbCArIEFDQl9TSVpFLCBsZW5ndGggKiBzaXplb2YoZmxvYXQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnYW1tYSA9IHN1bTIgLyBzdW0xOworICAgICAgICBpZiAoZ2FtbWEgPCAwLjUpCisgICAgICAgICAgICBtZW1jcHkodGVtcCwgZS0+cG9zdGZpbHRlcl9yZXNpZHVhbCArIEFDQl9TSVpFLCBsZW5ndGggKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBnYW1tYSA9IEZGTUlOKGdhbW1hLCAxLjApOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0ZW1wW2ldID0gZS0+cG9zdGZpbHRlcl9yZXNpZHVhbFtBQ0JfU0laRSArIGldICsgZ2FtbWEgKgorICAgICAgICAgICAgICAgICAgICBwZmMtPmx0Z2FpbiAqIGUtPnBvc3RmaWx0ZXJfcmVzaWR1YWxbQUNCX1NJWkUgKyBpIC0gYmVzdF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1jcHkoc2NyYXRjaCwgdGVtcCwgbGVuZ3RoICogc2l6ZW9mKGZsb2F0KSk7CisgICAgbWVtY3B5KG1lbSwgZS0+cG9zdGZpbHRlcl9paXIsIEZJTFRFUl9PUkRFUiAqIHNpemVvZihmbG9hdCkpOworICAgIHN5bnRoZXNpc19maWx0ZXIoc2NyYXRjaCwgd2NvZWYyLCBtZW0sIGxlbmd0aCwgc2NyYXRjaCk7CisKKyAgICAvKiBHYWluIGNvbXB1dGF0aW9uLCBUSUEvSVMtMTI3IDUuOS40LTIgKi8KKyAgICBmb3IgKGkgPSAwLCBzdW0xID0gMCwgc3VtMiA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBzdW0xICs9IGluW2ldICogaW5baV07CisgICAgICAgIHN1bTIgKz0gc2NyYXRjaFtpXSAqIHNjcmF0Y2hbaV07CisgICAgfQorICAgIGdhaW4gPSBzdW0yID8gc3FydChzdW0xIC8gc3VtMikgOiAxLjA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIHRlbXBbaV0gKj0gZ2FpbjsKKworICAgIC8qIFNob3J0IHRlcm0gcG9zdGZpbHRlciAqLworICAgIHN5bnRoZXNpc19maWx0ZXIodGVtcCwgd2NvZWYyLCBlLT5wb3N0ZmlsdGVyX2lpciwgbGVuZ3RoLCBvdXQpOworCisgICAgbWVtbW92ZShlLT5wb3N0ZmlsdGVyX3Jlc2lkdWFsLAorICAgICAgICAgICBlLT5wb3N0ZmlsdGVyX3Jlc2lkdWFsICsgbGVuZ3RoLCBBQ0JfU0laRSAqIHNpemVvZihmbG9hdCkpOworfQorCitzdGF0aWMgdm9pZCBmcmFtZV9lcmFzdXJlKEVWUkNDb250ZXh0ICplLCBmbG9hdCAqc2FtcGxlcykKK3sKKyAgICBmbG9hdCBpbHNwZltGSUxURVJfT1JERVJdLCBpbHBjW0ZJTFRFUl9PUkRFUl0sIGlkZWxheVtOQl9TVUJGUkFNRVNdLAorICAgICAgICAgIHRtcFtTVUJGUkFNRV9TSVpFICsgNl0sIGY7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgICAgaWYgKGUtPmJpdHJhdGUgIT0gUkFURV9RVUFOVCkKKyAgICAgICAgICAgIGUtPmxzcGZbaV0gPSBlLT5wcmV2X2xzcGZbaV0gKiAwLjg3NSArIDAuMTI1ICogKGkgKyAxKSAqIDAuMDQ4OworICAgICAgICBlbHNlCisgICAgICAgICAgICBlLT5sc3BmW2ldID0gZS0+cHJldl9sc3BmW2ldOworICAgIH0KKworICAgIGlmIChlLT5wcmV2X2Vycm9yX2ZsYWcpCisgICAgICAgIGUtPmF2Z19hY2JfZ2FpbiAqPSAwLjc1OworICAgIGlmIChlLT5iaXRyYXRlID09IFJBVEVfRlVMTCkKKyAgICAgICAgbWVtY3B5KGUtPnBpdGNoX2JhY2ssIGUtPnBpdGNoLCBBQ0JfU0laRSAqIHNpemVvZihmbG9hdCkpOworICAgIGlmIChlLT5sYXN0X3ZhbGlkX2JpdHJhdGUgPT0gUkFURV9RVUFOVCkKKyAgICAgICAgZS0+Yml0cmF0ZSA9IFJBVEVfUVVBTlQ7CisgICAgZWxzZQorICAgICAgICBlLT5iaXRyYXRlID0gUkFURV9GVUxMOworCisgICAgaWYgKGUtPmJpdHJhdGUgPT0gUkFURV9GVUxMIHx8IGUtPmJpdHJhdGUgPT0gUkFURV9IQUxGKSB7CisgICAgICAgIGUtPnBpdGNoX2RlbGF5ID0gZS0+cHJldl9waXRjaF9kZWxheTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCBzdW0gPSAwOworCisgICAgICAgIGlkZWxheVswXSA9IGlkZWxheVsxXSA9IGlkZWxheVsyXSA9IE1JTl9ERUxBWTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJfU1VCRlJBTUVTOyBpKyspCisgICAgICAgICAgICBzdW0gKz0gZXZyY19lbmVyZ3lfcXVhbnRbZS0+cHJldl9lbmVyZ3lfZ2Fpbl1baV07CisgICAgICAgIHN1bSAvPSAoZmxvYXQpIE5CX1NVQkZSQU1FUzsKKyAgICAgICAgc3VtICA9IHBvdygxMCwgc3VtKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5CX1NVQkZSQU1FUzsgaSsrKQorICAgICAgICAgICAgZS0+ZW5lcmd5X3ZlY3RvcltpXSA9IHN1bTsKKyAgICB9CisKKyAgICBpZiAoZmFicyhlLT5waXRjaF9kZWxheSAtIGUtPnByZXZfcGl0Y2hfZGVsYXkpID4gMTUpCisgICAgICAgIGUtPnByZXZfcGl0Y2hfZGVsYXkgPSBlLT5waXRjaF9kZWxheTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOQl9TVUJGUkFNRVM7IGkrKykgeworICAgICAgICBpbnQgc3ViZnJhbWVfc2l6ZSA9IHN1YmZyYW1lX3NpemVzW2ldOworICAgICAgICBpbnQgcGl0Y2hfbGFnOworCisgICAgICAgIGludGVycG9sYXRlX2xzcChpbHNwZiwgZS0+bHNwZiwgZS0+cHJldl9sc3BmLCBpKTsKKworICAgICAgICBpZiAoZS0+Yml0cmF0ZSAhPSBSQVRFX1FVQU5UKSB7CisgICAgICAgICAgICBpZiAoZS0+YXZnX2FjYl9nYWluIDwgMC4zKSB7CisgICAgICAgICAgICAgICAgaWRlbGF5WzBdID0gZXN0aW1hdGlvbl9kZWxheVtpXTsKKyAgICAgICAgICAgICAgICBpZGVsYXlbMV0gPSBlc3RpbWF0aW9uX2RlbGF5W2kgKyAxXTsKKyAgICAgICAgICAgICAgICBpZGVsYXlbMl0gPSBlc3RpbWF0aW9uX2RlbGF5W2kgKyAyXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGVfZGVsYXkoaWRlbGF5LCBlLT5waXRjaF9kZWxheSwgZS0+cHJldl9waXRjaF9kZWxheSwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwaXRjaF9sYWcgPSBscmludGYoKGlkZWxheVsxXSArIGlkZWxheVswXSkgLyAyLjApOworICAgICAgICBkZWNvZGVfcHJlZGljdG9yX2NvZWZmcyhpbHNwZiwgaWxwYyk7CisKKyAgICAgICAgaWYgKGUtPmJpdHJhdGUgIT0gUkFURV9RVUFOVCkgeworICAgICAgICAgICAgYWNiX2V4Y2l0YXRpb24oZSwgZS0+cGl0Y2ggKyBBQ0JfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPmF2Z19hY2JfZ2FpbiwgaWRlbGF5LCBzdWJmcmFtZV9zaXplKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWJmcmFtZV9zaXplOyBqKyspCisgICAgICAgICAgICAgICAgZS0+cGl0Y2hbQUNCX1NJWkUgKyBqXSAqPSBlLT5mYWRlX3NjYWxlOworICAgICAgICAgICAgZS0+ZmFkZV9zY2FsZSA9IEZGTUFYKGUtPmZhZGVfc2NhbGUgLSAwLjA1LCAwLjApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN1YmZyYW1lX3NpemU7IGorKykKKyAgICAgICAgICAgICAgICBlLT5waXRjaFtBQ0JfU0laRSArIGpdID0gZS0+ZW5lcmd5X3ZlY3RvcltpXTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbW1vdmUoZS0+cGl0Y2gsIGUtPnBpdGNoICsgc3ViZnJhbWVfc2l6ZSwgQUNCX1NJWkUgKiBzaXplb2YoZmxvYXQpKTsKKworICAgICAgICBpZiAoZS0+Yml0cmF0ZSAhPSBSQVRFX1FVQU5UICYmIGUtPmF2Z19hY2JfZ2FpbiA8IDAuNCkgeworICAgICAgICAgICAgZiA9IDAuMSAqIGUtPmF2Z19mY2JfZ2FpbjsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWJmcmFtZV9zaXplOyBqKyspCisgICAgICAgICAgICAgICAgZS0+cGl0Y2hbQUNCX1NJWkUgKyBqXSArPSBmOworICAgICAgICB9IGVsc2UgaWYgKGUtPmJpdHJhdGUgPT0gUkFURV9RVUFOVCkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN1YmZyYW1lX3NpemU7IGorKykKKyAgICAgICAgICAgICAgICBlLT5waXRjaFtBQ0JfU0laRSArIGpdID0gZS0+ZW5lcmd5X3ZlY3RvcltpXTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bnRoZXNpc19maWx0ZXIoZS0+cGl0Y2ggKyBBQ0JfU0laRSwgaWxwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLT5zeW50aGVzaXMsIHN1YmZyYW1lX3NpemUsIHRtcCk7CisgICAgICAgIHBvc3RmaWx0ZXIoZSwgdG1wLCBpbHBjLCBzYW1wbGVzLCBwaXRjaF9sYWcsCisgICAgICAgICAgICAgICAgICAgJnBvc3RmaWx0ZXJfY29lZmZzW2UtPmJpdHJhdGVdLCBzdWJmcmFtZV9zaXplKTsKKworICAgICAgICBzYW1wbGVzICs9IHN1YmZyYW1lX3NpemU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGV2cmNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBFVlJDQ29udGV4dCAqZSAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIGZsb2F0IGlsc3BmW0ZJTFRFUl9PUkRFUl0sIGlscGNbRklMVEVSX09SREVSXSwgaWRlbGF5W05CX1NVQkZSQU1FU107CisgICAgZmxvYXQgKnNhbXBsZXM7CisgICAgaW50ICAgaSwgaiwgcmV0LCBlcnJvcl9mbGFnID0gMDsKKworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gMTYwOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgc2FtcGxlcyA9IChmbG9hdCAqKWZyYW1lLT5kYXRhWzBdOworCisgICAgaWYgKChlLT5iaXRyYXRlID0gZGV0ZXJtaW5lX2JpdHJhdGUoYXZjdHgsICZidWZfc2l6ZSwgJmJ1ZikpID09IFJBVEVfRVJSUykgeworICAgICAgICB3YXJuX2luc3VmZmljaWVudF9mcmFtZV9xdWFsaXR5KGF2Y3R4LCAiYml0cmF0ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4iKTsKKyAgICAgICAgZ290byBlcmFzdXJlOworICAgIH0KKyAgICBpZiAoZS0+Yml0cmF0ZSA8PSBTSUxFTkNFIHx8IGUtPmJpdHJhdGUgPT0gUkFURV9RVUFSVEVSKQorICAgICAgICBnb3RvIGVyYXN1cmU7CisgICAgaWYgKGUtPmJpdHJhdGUgPT0gUkFURV9RVUFOVCAmJiBlLT5sYXN0X3ZhbGlkX2JpdHJhdGUgPT0gUkFURV9GVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhZS0+cHJldl9lcnJvcl9mbGFnKQorICAgICAgICBnb3RvIGVyYXN1cmU7CisKKyAgICBpbml0X2dldF9iaXRzKCZlLT5nYiwgYnVmLCA4ICogYnVmX3NpemUpOworICAgIG1lbXNldCgmZS0+ZnJhbWUsIDAsIHNpemVvZihFVlJDQUZyYW1lKSk7CisKKyAgICB1bnBhY2tfZnJhbWUoZSk7CisKKyAgICBpZiAoZS0+Yml0cmF0ZSAhPSBSQVRFX1FVQU5UKSB7CisgICAgICAgIHVpbnQ4X3QgKnAgPSAodWludDhfdCAqKSAmZS0+ZnJhbWU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoRVZSQ0FGcmFtZSk7IGkrKykgeworICAgICAgICAgICAgaWYgKHBbaV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gc2l6ZW9mKEVWUkNBRnJhbWUpKQorICAgICAgICAgICAgZ290byBlcmFzdXJlOworICAgIH0gZWxzZSBpZiAoZS0+ZnJhbWUubHNwWzBdID09IDB4ZiAmJgorICAgICAgICAgICAgICAgZS0+ZnJhbWUubHNwWzFdID09IDB4ZiAmJgorICAgICAgICAgICAgICAgZS0+ZnJhbWUuZW5lcmd5X2dhaW4gPT0gMHhmZikgeworICAgICAgICBnb3RvIGVyYXN1cmU7CisgICAgfQorCisgICAgaWYgKGRlY29kZV9sc3BmKGUpIDwgMCkKKyAgICAgICAgZ290byBlcmFzdXJlOworCisgICAgaWYgKGUtPmJpdHJhdGUgPT0gUkFURV9GVUxMIHx8IGUtPmJpdHJhdGUgPT0gUkFURV9IQUxGKSB7CisgICAgICAgIC8qIFBpdGNoIGRlbGF5IHBhcmFtZXRlciBjaGVja2luZyBhcyBwZXIgVElBL0lTLTEyNyA1LjEuNS4xICovCisgICAgICAgIGlmIChlLT5mcmFtZS5waXRjaF9kZWxheSA+IE1BWF9ERUxBWSAtIE1JTl9ERUxBWSkKKyAgICAgICAgICAgIGdvdG8gZXJhc3VyZTsKKworICAgICAgICBlLT5waXRjaF9kZWxheSA9IGUtPmZyYW1lLnBpdGNoX2RlbGF5ICsgTUlOX0RFTEFZOworCisgICAgICAgIC8qIERlbGF5IGRpZmYgcGFyYW1ldGVyIGNoZWNraW5nIGFzIHBlciBUSUEvSVMtMTI3IDUuMS41LjIgKi8KKyAgICAgICAgaWYgKGUtPmZyYW1lLmRlbGF5X2RpZmYpIHsKKyAgICAgICAgICAgIGludCBwID0gZS0+cGl0Y2hfZGVsYXkgLSBlLT5mcmFtZS5kZWxheV9kaWZmICsgMTY7CisgICAgICAgICAgICBpZiAocCA8IE1JTl9ERUxBWSB8fCBwID4gTUFYX0RFTEFZKQorICAgICAgICAgICAgICAgIGdvdG8gZXJhc3VyZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERlbGF5IGNvbnRvdXIgcmVjb25zdHJ1Y3Rpb24gYXMgcGVyIFRJQS9JUy0xMjcgNS4yLjIuMiAqLworICAgICAgICBpZiAoZS0+ZnJhbWUuZGVsYXlfZGlmZiAmJgorICAgICAgICAgICAgZS0+Yml0cmF0ZSA9PSBSQVRFX0ZVTEwgJiYgZS0+cHJldl9lcnJvcl9mbGFnKSB7CisgICAgICAgICAgICBmbG9hdCBkZWxheTsKKworICAgICAgICAgICAgbWVtY3B5KGUtPnBpdGNoLCBlLT5waXRjaF9iYWNrLCBBQ0JfU0laRSAqIHNpemVvZihmbG9hdCkpOworCisgICAgICAgICAgICBkZWxheSA9IGUtPnByZXZfcGl0Y2hfZGVsYXk7CisgICAgICAgICAgICBlLT5wcmV2X3BpdGNoX2RlbGF5ID0gZGVsYXkgLSBlLT5mcmFtZS5kZWxheV9kaWZmICsgMTYuMDsKKworICAgICAgICAgICAgaWYgKGZhYnMoZS0+cGl0Y2hfZGVsYXkgLSBkZWxheSkgPiAxNSkKKyAgICAgICAgICAgICAgICBkZWxheSA9IGUtPnBpdGNoX2RlbGF5OworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJfU1VCRlJBTUVTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc3ViZnJhbWVfc2l6ZSA9IHN1YmZyYW1lX3NpemVzW2ldOworCisgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGVfZGVsYXkoaWRlbGF5LCBkZWxheSwgZS0+cHJldl9waXRjaF9kZWxheSwgaSk7CisgICAgICAgICAgICAgICAgYWNiX2V4Y2l0YXRpb24oZSwgZS0+cGl0Y2ggKyBBQ0JfU0laRSwgZS0+YXZnX2FjYl9nYWluLCBpZGVsYXksIHN1YmZyYW1lX3NpemUpOworICAgICAgICAgICAgICAgIG1lbW1vdmUoZS0+cGl0Y2gsIGUtPnBpdGNoICsgc3ViZnJhbWVfc2l6ZSwgQUNCX1NJWkUgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFNtb290aGluZyBvZiB0aGUgZGVjb2RlZCBkZWxheSBhcyBwZXIgVElBL0lTLTEyNyA1LjIuMi41ICovCisgICAgICAgIGlmIChmYWJzKGUtPnBpdGNoX2RlbGF5IC0gZS0+cHJldl9waXRjaF9kZWxheSkgPiAxNSkKKyAgICAgICAgICAgIGUtPnByZXZfcGl0Y2hfZGVsYXkgPSBlLT5waXRjaF9kZWxheTsKKworICAgICAgICBlLT5hdmdfYWNiX2dhaW4gPSBlLT5hdmdfZmNiX2dhaW4gPSAwLjA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWRlbGF5WzBdID0gaWRlbGF5WzFdID0gaWRlbGF5WzJdID0gTUlOX0RFTEFZOworCisgICAgICAgIC8qIERlY29kZSBmcmFtZSBlbmVyZ3kgdmVjdG9ycyBhcyBwZXIgVElBL0lTLTEyNyA1LjcuMiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJfU1VCRlJBTUVTOyBpKyspCisgICAgICAgICAgICBlLT5lbmVyZ3lfdmVjdG9yW2ldID0gcG93KDEwLCBldnJjX2VuZXJneV9xdWFudFtlLT5mcmFtZS5lbmVyZ3lfZ2Fpbl1baV0pOworICAgICAgICBlLT5wcmV2X2VuZXJneV9nYWluID0gZS0+ZnJhbWUuZW5lcmd5X2dhaW47CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE5CX1NVQkZSQU1FUzsgaSsrKSB7CisgICAgICAgIGZsb2F0IHRtcFtTVUJGUkFNRV9TSVpFICsgNl0gPSB7IDAgfTsKKyAgICAgICAgaW50IHN1YmZyYW1lX3NpemUgPSBzdWJmcmFtZV9zaXplc1tpXTsKKyAgICAgICAgaW50IHBpdGNoX2xhZzsKKworICAgICAgICBpbnRlcnBvbGF0ZV9sc3AoaWxzcGYsIGUtPmxzcGYsIGUtPnByZXZfbHNwZiwgaSk7CisKKyAgICAgICAgaWYgKGUtPmJpdHJhdGUgIT0gUkFURV9RVUFOVCkKKyAgICAgICAgICAgIGludGVycG9sYXRlX2RlbGF5KGlkZWxheSwgZS0+cGl0Y2hfZGVsYXksIGUtPnByZXZfcGl0Y2hfZGVsYXksIGkpOworCisgICAgICAgIHBpdGNoX2xhZyA9IGxyaW50ZigoaWRlbGF5WzFdICsgaWRlbGF5WzBdKSAvIDIuMCk7CisgICAgICAgIGRlY29kZV9wcmVkaWN0b3JfY29lZmZzKGlsc3BmLCBpbHBjKTsKKworICAgICAgICAvKiBCYW5kd2lkdGggZXhwYW5zaW9uIGFzIHBlciBUSUEvSVMtMTI3IDUuMi4zLjMgKi8KKyAgICAgICAgaWYgKGUtPmZyYW1lLmxwY19mbGFnICYmIGUtPnByZXZfZXJyb3JfZmxhZykKKyAgICAgICAgICAgIGJhbmR3aWR0aF9leHBhbnNpb24oaWxwYywgaWxwYywgMC43NSk7CisKKyAgICAgICAgaWYgKGUtPmJpdHJhdGUgIT0gUkFURV9RVUFOVCkgeworICAgICAgICAgICAgZmxvYXQgYWNiX3N1bSwgZjsKKworICAgICAgICAgICAgZiA9IGV4cCgoZS0+Yml0cmF0ZSA9PSBSQVRFX0hBTEYgPyAwLjUgOiAwLjI1KQorICAgICAgICAgICAgICAgICAgICAgICAgICogKGUtPmZyYW1lLmZjYl9nYWluW2ldICsgMSkpOworICAgICAgICAgICAgYWNiX3N1bSA9IHBpdGNoX2dhaW5fdnFbZS0+ZnJhbWUuYWNiX2dhaW5baV1dOworICAgICAgICAgICAgZS0+YXZnX2FjYl9nYWluICs9IGFjYl9zdW0gLyBOQl9TVUJGUkFNRVM7CisgICAgICAgICAgICBlLT5hdmdfZmNiX2dhaW4gKz0gZiAvIE5CX1NVQkZSQU1FUzsKKworICAgICAgICAgICAgYWNiX2V4Y2l0YXRpb24oZSwgZS0+cGl0Y2ggKyBBQ0JfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjYl9zdW0sIGlkZWxheSwgc3ViZnJhbWVfc2l6ZSk7CisgICAgICAgICAgICBmY2JfZXhjaXRhdGlvbihlLCBlLT5mcmFtZS5mY2Jfc2hhcGVbaV0sIHRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjYl9zdW0sIHBpdGNoX2xhZywgc3ViZnJhbWVfc2l6ZSk7CisKKyAgICAgICAgICAgIC8qIFRvdGFsIGV4Y2l0YXRpb24gZ2VuZXJhdGlvbiBhcyBwZXIgVElBL0lTLTEyNyA1LjIuMy45ICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3ViZnJhbWVfc2l6ZTsgaisrKQorICAgICAgICAgICAgICAgIGUtPnBpdGNoW0FDQl9TSVpFICsgal0gKz0gZiAqIHRtcFtqXTsKKyAgICAgICAgICAgIGUtPmZhZGVfc2NhbGUgPSBGRk1JTihlLT5mYWRlX3NjYWxlICsgMC4yLCAxLjApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN1YmZyYW1lX3NpemU7IGorKykKKyAgICAgICAgICAgICAgICBlLT5waXRjaFtBQ0JfU0laRSArIGpdID0gZS0+ZW5lcmd5X3ZlY3RvcltpXTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbW1vdmUoZS0+cGl0Y2gsIGUtPnBpdGNoICsgc3ViZnJhbWVfc2l6ZSwgQUNCX1NJWkUgKiBzaXplb2YoZmxvYXQpKTsKKworICAgICAgICBzeW50aGVzaXNfZmlsdGVyKGUtPnBpdGNoICsgQUNCX1NJWkUsIGlscGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZS0+c3ludGhlc2lzLCBzdWJmcmFtZV9zaXplLCB0bXApOworICAgICAgICBwb3N0ZmlsdGVyKGUsIHRtcCwgaWxwYywgc2FtcGxlcywgcGl0Y2hfbGFnLAorICAgICAgICAgICAgICAgICAgICZwb3N0ZmlsdGVyX2NvZWZmc1tlLT5iaXRyYXRlXSwgc3ViZnJhbWVfc2l6ZSk7CisKKyAgICAgICAgc2FtcGxlcyArPSBzdWJmcmFtZV9zaXplOworICAgIH0KKworICAgIGlmIChlcnJvcl9mbGFnKSB7CitlcmFzdXJlOgorICAgICAgICBlcnJvcl9mbGFnID0gMTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImZyYW1lIGVyYXN1cmVcbiIpOworICAgICAgICBmcmFtZV9lcmFzdXJlKGUsIHNhbXBsZXMpOworICAgIH0KKworICAgIG1lbWNweShlLT5wcmV2X2xzcGYsIGUtPmxzcGYsIHNpemVvZihlLT5wcmV2X2xzcGYpKTsKKyAgICBlLT5wcmV2X2Vycm9yX2ZsYWcgICAgPSBlcnJvcl9mbGFnOworICAgIGUtPmxhc3RfdmFsaWRfYml0cmF0ZSA9IGUtPmJpdHJhdGU7CisKKyAgICBpZiAoZS0+Yml0cmF0ZSAhPSBSQVRFX1FVQU5UKQorICAgICAgICBlLT5wcmV2X3BpdGNoX2RlbGF5ID0gZS0+cGl0Y2hfZGVsYXk7CisKKyAgICBzYW1wbGVzID0gKGZsb2F0ICopZnJhbWUtPmRhdGFbMF07CisgICAgZm9yIChpID0gMDsgaSA8IDE2MDsgaSsrKQorICAgICAgICBzYW1wbGVzW2ldIC89IDMyNzY4OworCisgICAgKmdvdF9mcmFtZV9wdHIgICA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfZXZyY19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJldnJjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRVZSQyAoRW5oYW5jZWQgVmFyaWFibGUgUmF0ZSBDb2RlYykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRVZSQywKKyAgICAuaW5pdCAgICAgICAgICAgPSBldnJjX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGV2cmNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEVWUkNDb250ZXh0KSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9leGlmLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9leGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzMGYwNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2V4aWYuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIEVYSUYgbWV0YWRhdGEgcGFyc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGhpbG8gQm9yZ21hbm4gPHRoaWxvLmJvcmdtYW5uIF9hdF8gbWFpbC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRVhJRiBtZXRhZGF0YSBwYXJzZXIKKyAqIEBhdXRob3IgVGhpbG8gQm9yZ21hbm4gPHRoaWxvLmJvcmdtYW5uIF9hdF8gbWFpbC5kZT4KKyAqLworCisjaW5jbHVkZSAiZXhpZi5oIgorCisKK3N0YXRpYyBjb25zdCBjaGFyICpleGlmX2dldF90YWdfbmFtZSh1aW50MTZfdCBpZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyh0YWdfbGlzdCk7IGkrKykgeworICAgICAgICBpZiAodGFnX2xpc3RbaV0uaWQgPT0gaWQpCisgICAgICAgICAgICByZXR1cm4gdGFnX2xpc3RbaV0ubmFtZTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgaW50IGV4aWZfYWRkX21ldGFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGNvdW50LCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCeXRlQ29udGV4dCAqZ2IsIGludCBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEpCit7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiSW52YWxpZCBUSUZGIHRhZyB0eXBlIDAgZm91bmQgZm9yICVzIHdpdGggc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgIG5hbWUsIGNvdW50KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBUSUZGX0RPVUJMRSAgIDogcmV0dXJuIGZmX3RhZGRfZG91Ymxlc19tZXRhZGF0YShjb3VudCwgbmFtZSwgc2VwLCBnYiwgbGUsIG1ldGFkYXRhKTsKKyAgICBjYXNlIFRJRkZfU1NIT1JUICAgOiByZXR1cm4gZmZfdGFkZF9zaG9ydHNfbWV0YWRhdGEoY291bnQsIG5hbWUsIHNlcCwgZ2IsIGxlLCAxLCBtZXRhZGF0YSk7CisgICAgY2FzZSBUSUZGX1NIT1JUICAgIDogcmV0dXJuIGZmX3RhZGRfc2hvcnRzX21ldGFkYXRhKGNvdW50LCBuYW1lLCBzZXAsIGdiLCBsZSwgMCwgbWV0YWRhdGEpOworICAgIGNhc2UgVElGRl9TQllURSAgICA6IHJldHVybiBmZl90YWRkX2J5dGVzX21ldGFkYXRhKGNvdW50LCBuYW1lLCBzZXAsIGdiLCBsZSwgMSwgbWV0YWRhdGEpOworICAgIGNhc2UgVElGRl9CWVRFICAgICA6CisgICAgY2FzZSBUSUZGX1VOREVGSU5FRDogcmV0dXJuIGZmX3RhZGRfYnl0ZXNfbWV0YWRhdGEoY291bnQsIG5hbWUsIHNlcCwgZ2IsIGxlLCAwLCBtZXRhZGF0YSk7CisgICAgY2FzZSBUSUZGX1NUUklORyAgIDogcmV0dXJuIGZmX3RhZGRfc3RyaW5nX21ldGFkYXRhKGNvdW50LCBuYW1lLCBnYiwgbGUsIG1ldGFkYXRhKTsKKyAgICBjYXNlIFRJRkZfU1JBVElPTkFMOgorICAgIGNhc2UgVElGRl9SQVRJT05BTCA6IHJldHVybiBmZl90YWRkX3JhdGlvbmFsX21ldGFkYXRhKGNvdW50LCBuYW1lLCBzZXAsIGdiLCBsZSwgbWV0YWRhdGEpOworICAgIGNhc2UgVElGRl9TTE9ORyAgICA6CisgICAgY2FzZSBUSUZGX0xPTkcgICAgIDogcmV0dXJuIGZmX3RhZGRfbG9uZ19tZXRhZGF0YShjb3VudCwgbmFtZSwgc2VwLCBnYiwgbGUsIG1ldGFkYXRhKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJUSUZGIHRhZyB0eXBlICgldSkiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKK30KKworCitzdGF0aWMgaW50IGV4aWZfZGVjb2RlX3RhZyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEdldEJ5dGVDb250ZXh0ICpnYnl0ZXMsIGludCBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXB0aCwgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEpCit7CisgICAgaW50IHJldCwgY3VyX3BvczsKKyAgICB1bnNpZ25lZCBpZCwgY291bnQ7CisgICAgZW51bSBUaWZmVHlwZXMgdHlwZTsKKworICAgIGlmIChkZXB0aCA+IDIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZmZfdHJlYWRfdGFnKGdieXRlcywgbGUsICZpZCwgJnR5cGUsICZjb3VudCwgJmN1cl9wb3MpOworCisgICAgaWYgKCFieXRlc3RyZWFtMl90ZWxsKGdieXRlcykpIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2VlayhnYnl0ZXMsIGN1cl9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gcmVhZCBjb3VudCB2YWx1ZXMgYW5kIGFkZCBpdCBtZXRhZGF0YQorICAgIC8vIHN0b3JlIG1ldGFkYXRhIG9yIHByb2NlZWQgd2l0aCBuZXh0IElGRAorICAgIHJldCA9IGZmX3Rpc19pZmQoaWQpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgcmV0ID0gYXZwcml2X2V4aWZfZGVjb2RlX2lmZChhdmN0eCwgZ2J5dGVzLCBsZSwgZGVwdGggKyAxLCBtZXRhZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGV4aWZfZ2V0X3RhZ19uYW1lKGlkKTsKKyAgICAgICAgY2hhciAqdXNlX25hbWUgICA9IChjaGFyKikgbmFtZTsKKworICAgICAgICBpZiAoIXVzZV9uYW1lKSB7CisgICAgICAgICAgICB1c2VfbmFtZSA9IGF2X21hbGxvYyg3KTsKKyAgICAgICAgICAgIGlmICghdXNlX25hbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc25wcmludGYodXNlX25hbWUsIDcsICIweCUwNFgiLCBpZCk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBleGlmX2FkZF9tZXRhZGF0YShhdmN0eCwgY291bnQsIHR5cGUsIHVzZV9uYW1lLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYnl0ZXMsIGxlLCBtZXRhZGF0YSk7CisKKyAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmdXNlX25hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfc2VlayhnYnl0ZXMsIGN1cl9wb3MsIFNFRUtfU0VUKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworaW50IGF2cHJpdl9leGlmX2RlY29kZV9pZmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCeXRlQ29udGV4dCAqZ2J5dGVzLCBpbnQgbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgsIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhKQoreworICAgIGludCBpLCByZXQ7CisgICAgaW50IGVudHJpZXM7CisKKyAgICBlbnRyaWVzID0gZmZfdGdldF9zaG9ydChnYnl0ZXMsIGxlKTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYnl0ZXMpIDwgZW50cmllcyAqIDEyKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSBleGlmX2RlY29kZV90YWcoYXZjdHgsIGdieXRlcywgbGUsIGRlcHRoLCBtZXRhZGF0YSkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHJldHVybiBuZXh0IElERiBvZmZzZXQgb3IgMHgwMDAwMDAwMDAgb3IgYSB2YWx1ZSA8IDAgZm9yIGZhaWx1cmUKKyAgICByZXR1cm4gZmZfdGdldF9sb25nKGdieXRlcywgbGUpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZXhpZi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZXhpZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNTA5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9leGlmLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBFWElGIG1ldGFkYXRhIHBhcnNlcgorICogQ29weXJpZ2h0IChjKSAyMDEzIFRoaWxvIEJvcmdtYW5uIDx0aGlsby5ib3JnbWFubiBfYXRfIG1haWwuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEVYSUYgbWV0YWRhdGEgcGFyc2VyCisgKiBAYXV0aG9yIFRoaWxvIEJvcmdtYW5uIDx0aGlsby5ib3JnbWFubiBfYXRfIG1haWwuZGU+CisgKi8KKworI2lmbmRlZiBBVkNPREVDX0VYSUZfSAorI2RlZmluZSBBVkNPREVDX0VYSUZfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJ0aWZmLmgiCisKKyNkZWZpbmUgRVhJRl9NQVhfSUZEX1JFQ1VSU0lPTiAyCisjZGVmaW5lIEVYSUZfVEFHX05BTUVfTEVOR1RIICAgMzIKKworc3RydWN0IGV4aWZfdGFnIHsKKyAgICBjaGFyICAgICAgbmFtZVtFWElGX1RBR19OQU1FX0xFTkdUSF07CisgICAgdWludDE2X3QgIGlkOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBleGlmX3RhZyB0YWdfbGlzdFtdID0geyAvLyBKRUlUQSBDUC0zNDUxIEVYSUYgc3BlY2lmaWNhdGlvbjoKKyAgICB7IkdQU1ZlcnNpb25JRCIsICAgICAgICAgICAgICAgMHgwMH0sIC8vIDwtIFRhYmxlIDEyIEdQUyBBdHRyaWJ1dGUgSW5mb3JtYXRpb24KKyAgICB7IkdQU0xhdGl0dWRlUmVmIiwgICAgICAgICAgICAgMHgwMX0sCisgICAgeyJHUFNMYXRpdHVkZSIsICAgICAgICAgICAgICAgIDB4MDJ9LAorICAgIHsiR1BTTG9uZ2l0dWRlUmVmIiwgICAgICAgICAgICAweDAzfSwKKyAgICB7IkdQU0xvbmdpdHVkZSIsICAgICAgICAgICAgICAgMHgwNH0sCisgICAgeyJHUFNBbHRpdHVkZVJlZiIsICAgICAgICAgICAgIDB4MDV9LAorICAgIHsiR1BTQWx0aXR1ZGUiLCAgICAgICAgICAgICAgICAweDA2fSwKKyAgICB7IkdQU1RpbWVTdGFtcCIsICAgICAgICAgICAgICAgMHgwN30sCisgICAgeyJHUFNTYXRlbGxpdGVzIiwgICAgICAgICAgICAgIDB4MDh9LAorICAgIHsiR1BTU3RhdHVzIiwgICAgICAgICAgICAgICAgICAweDA5fSwKKyAgICB7IkdQU01lYXN1cmVNb2RlIiwgICAgICAgICAgICAgMHgwQX0sCisgICAgeyJHUFNET1AiLCAgICAgICAgICAgICAgICAgICAgIDB4MEJ9LAorICAgIHsiR1BTU3BlZWRSZWYiLCAgICAgICAgICAgICAgICAweDBDfSwKKyAgICB7IkdQU1NwZWVkIiwgICAgICAgICAgICAgICAgICAgMHgwRH0sCisgICAgeyJHUFNUcmFja1JlZiIsICAgICAgICAgICAgICAgIDB4MEV9LAorICAgIHsiR1BTVHJhY2siLCAgICAgICAgICAgICAgICAgICAweDBGfSwKKyAgICB7IkdQU0ltZ0RpcmVjdGlvblJlZiIsICAgICAgICAgMHgxMH0sCisgICAgeyJHUFNJbWdEaXJlY3Rpb24iLCAgICAgICAgICAgIDB4MTF9LAorICAgIHsiR1BTTWFwRGF0dW0iLCAgICAgICAgICAgICAgICAweDEyfSwKKyAgICB7IkdQU0Rlc3RMYXRpdHVkZVJlZiIsICAgICAgICAgMHgxM30sCisgICAgeyJHUFNEZXN0TGF0aXR1ZGUiLCAgICAgICAgICAgIDB4MTR9LAorICAgIHsiR1BTRGVzdExvbmdpdHVkZVJlZiIsICAgICAgICAweDE1fSwKKyAgICB7IkdQU0Rlc3RMb25naXR1ZGUiLCAgICAgICAgICAgMHgxNn0sCisgICAgeyJHUFNEZXN0QmVhcmluZ1JlZiIsICAgICAgICAgIDB4MTd9LAorICAgIHsiR1BTRGVzdEJlYXJpbmciLCAgICAgICAgICAgICAweDE4fSwKKyAgICB7IkdQU0Rlc3REaXN0YW5jZVJlZiIsICAgICAgICAgMHgxOX0sCisgICAgeyJHUFNEZXN0RGlzdGFuY2UiLCAgICAgICAgICAgIDB4MUF9LAorICAgIHsiR1BTUHJvY2Vzc2luZ01ldGhvZCIsICAgICAgICAweDFCfSwKKyAgICB7IkdQU0FyZWFJbmZvcm1hdGlvbiIsICAgICAgICAgMHgxQ30sCisgICAgeyJHUFNEYXRlU3RhbXAiLCAgICAgICAgICAgICAgIDB4MUR9LAorICAgIHsiR1BTRGlmZmVyZW50aWFsIiwgICAgICAgICAgICAweDFFfSwKKyAgICB7IkltYWdlV2lkdGgiLCAgICAgICAgICAgICAgICAgMHgxMDB9LCAvLyA8LSBUYWJsZSAzIFRJRkYgUmV2LiA2LjAgQXR0cmlidXRlIEluZm9ybWF0aW9uIFVzZWQgaW4gRXhpZgorICAgIHsiSW1hZ2VMZW5ndGgiLCAgICAgICAgICAgICAgICAweDEwMX0sCisgICAgeyJCaXRzUGVyU2FtcGxlIiwgICAgICAgICAgICAgIDB4MTAyfSwKKyAgICB7IkNvbXByZXNzaW9uIiwgICAgICAgICAgICAgICAgMHgxMDN9LAorICAgIHsiUGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbiIsICAweDEwNn0sCisgICAgeyJPcmllbnRhdGlvbiIsICAgICAgICAgICAgICAgIDB4MTEyfSwKKyAgICB7IlNhbXBsZXNQZXJQaXhlbCIsICAgICAgICAgICAgMHgxMTV9LAorICAgIHsiUGxhbmFyQ29uZmlndXJhdGlvbiIsICAgICAgICAweDExQ30sCisgICAgeyJZQ2JDclN1YlNhbXBsaW5nIiwgICAgICAgICAgIDB4MjEyfSwKKyAgICB7IllDYkNyUG9zaXRpb25pbmciLCAgICAgICAgICAgMHgyMTN9LAorICAgIHsiWFJlc29sdXRpb24iLCAgICAgICAgICAgICAgICAweDExQX0sCisgICAgeyJZUmVzb2x1dGlvbiIsICAgICAgICAgICAgICAgIDB4MTFCfSwKKyAgICB7IlJlc29sdXRpb25Vbml0IiwgICAgICAgICAgICAgMHgxMjh9LAorICAgIHsiU3RyaXBPZmZzZXRzIiwgICAgICAgICAgICAgICAweDExMX0sCisgICAgeyJSb3dzUGVyU3RyaXAiLCAgICAgICAgICAgICAgIDB4MTE2fSwKKyAgICB7IlN0cmlwQnl0ZUNvdW50cyIsICAgICAgICAgICAgMHgxMTd9LAorICAgIHsiSlBFR0ludGVyY2hhbmdlRm9ybWF0IiwgICAgICAweDIwMX0sCisgICAgeyJKUEVHSW50ZXJjaGFuZ2VGb3JtYXRMZW5ndGgiLDB4MjAyfSwKKyAgICB7IlRyYW5zZmVyRnVuY3Rpb24iLCAgICAgICAgICAgMHgxMkR9LAorICAgIHsiV2hpdGVQb2ludCIsICAgICAgICAgICAgICAgICAweDEzRX0sCisgICAgeyJQcmltYXJ5Q2hyb21hdGljaXRpZXMiLCAgICAgIDB4MTNGfSwKKyAgICB7IllDYkNyQ29lZmZpY2llbnRzIiwgICAgICAgICAgMHgyMTF9LAorICAgIHsiUmVmZXJlbmNlQmxhY2tXaGl0ZSIsICAgICAgICAweDIxNH0sCisgICAgeyJEYXRlVGltZSIsICAgICAgICAgICAgICAgICAgIDB4MTMyfSwKKyAgICB7IkltYWdlRGVzY3JpcHRpb24iLCAgICAgICAgICAgMHgxMEV9LAorICAgIHsiTWFrZSIsICAgICAgICAgICAgICAgICAgICAgICAweDEwRn0sCisgICAgeyJNb2RlbCIsICAgICAgICAgICAgICAgICAgICAgIDB4MTEwfSwKKyAgICB7IlNvZnR3YXJlIiwgICAgICAgICAgICAgICAgICAgMHgxMzF9LAorICAgIHsiQXJ0aXN0IiwgICAgICAgICAgICAgICAgICAgICAweDEzQn0sCisgICAgeyJDb3B5cmlnaHQiLCAgICAgICAgICAgICAgICAgIDB4ODI5OH0sCisgICAgeyJFeGlmVmVyc2lvbiIsICAgICAgICAgICAgICAgIDB4OTAwMH0sIC8vIDwtIFRhYmxlIDQgRXhpZiBJRkQgQXR0cmlidXRlIEluZm9ybWF0aW9uICgxKQorICAgIHsiRmxhc2hwaXhWZXJzaW9uIiwgICAgICAgICAgICAweEEwMDB9LAorICAgIHsiQ29sb3JTcGFjZSIsICAgICAgICAgICAgICAgICAweEEwMDF9LAorICAgIHsiQ29tcG9uZW50c0NvbmZpZ3VyYXRpb24iLCAgICAweDkxMDF9LAorICAgIHsiQ29tcHJlc3NlZEJpdHNQZXJQaXhlbCIsICAgICAweDkxMDJ9LAorICAgIHsiUGl4ZWxYRGltZW5zaW9uIiwgICAgICAgICAgICAweEEwMDJ9LAorICAgIHsiUGl4ZWxZRGltZW5zaW9uIiwgICAgICAgICAgICAweEEwMDN9LAorICAgIHsiTWFrZXJOb3RlIiwgICAgICAgICAgICAgICAgICAweDkyN0N9LAorICAgIHsiVXNlckNvbW1lbnQiLCAgICAgICAgICAgICAgICAweDkyODZ9LAorICAgIHsiUmVsYXRlZFNvdW5kRmlsZSIsICAgICAgICAgICAweEEwMDR9LAorICAgIHsiRGF0ZVRpbWVPcmlnaW5hbCIsICAgICAgICAgICAweDkwMDN9LAorICAgIHsiRGF0ZVRpbWVEaWdpdGl6ZWQiLCAgICAgICAgICAweDkwMDR9LAorICAgIHsiU3ViU2VjVGltZSIsICAgICAgICAgICAgICAgICAweDkyOTB9LAorICAgIHsiU3ViU2VjVGltZU9yaWdpbmFsIiwgICAgICAgICAweDkyOTF9LAorICAgIHsiU3ViU2VjVGltZURpZ2l0aXplZCIsICAgICAgICAweDkyOTJ9LAorICAgIHsiSW1hZ2VVbmlxdWVJRCIsICAgICAgICAgICAgICAweEE0MjB9LAorICAgIHsiRXhwb3N1cmVUaW1lIiwgICAgICAgICAgICAgICAweDgyOUF9LCAvLyA8LSBUYWJsZSA1IEV4aWYgSUZEIEF0dHJpYnV0ZSBJbmZvcm1hdGlvbiAoMikKKyAgICB7IkZOdW1iZXIiLCAgICAgICAgICAgICAgICAgICAgMHg4MjlEfSwKKyAgICB7IkV4cG9zdXJlUHJvZ3JhbSIsICAgICAgICAgICAgMHg4ODIyfSwKKyAgICB7IlNwZWN0cmFsU2Vuc2l0aXZpdHkiLCAgICAgICAgMHg4ODI0fSwKKyAgICB7IklTT1NwZWVkUmF0aW5ncyIsICAgICAgICAgICAgMHg4ODI3fSwKKyAgICB7Ik9FQ0YiLCAgICAgICAgICAgICAgICAgICAgICAgMHg4ODI4fSwKKyAgICB7IlNodXR0ZXJTcGVlZFZhbHVlIiwgICAgICAgICAgMHg5MjAxfSwKKyAgICB7IkFwZXJ0dXJlVmFsdWUiLCAgICAgICAgICAgICAgMHg5MjAyfSwKKyAgICB7IkJyaWdodG5lc3NWYWx1ZSIsICAgICAgICAgICAgMHg5MjAzfSwKKyAgICB7IkV4cG9zdXJlQmlhc1ZhbHVlIiwgICAgICAgICAgMHg5MjA0fSwKKyAgICB7Ik1heEFwZXJ0dXJlVmFsdWUiLCAgICAgICAgICAgMHg5MjA1fSwKKyAgICB7IlN1YmplY3REaXN0YW5jZSIsICAgICAgICAgICAgMHg5MjA2fSwKKyAgICB7Ik1ldGVyaW5nTW9kZSIsICAgICAgICAgICAgICAgMHg5MjA3fSwKKyAgICB7IkxpZ2h0U291cmNlIiwgICAgICAgICAgICAgICAgMHg5MjA4fSwKKyAgICB7IkZsYXNoIiwgICAgICAgICAgICAgICAgICAgICAgMHg5MjA5fSwKKyAgICB7IkZvY2FsTGVuZ3RoIiwgICAgICAgICAgICAgICAgMHg5MjBBfSwKKyAgICB7IlN1YmplY3RBcmVhIiwgICAgICAgICAgICAgICAgMHg5MjE0fSwKKyAgICB7IkZsYXNoRW5lcmd5IiwgICAgICAgICAgICAgICAgMHhBMjBCfSwKKyAgICB7IlNwYXRpYWxGcmVxdWVuY3lSZXNwb25zZSIsICAgMHhBMjBDfSwKKyAgICB7IkZvY2FsUGxhbmVYUmVzb2x1dGlvbiIsICAgICAgMHhBMjBFfSwKKyAgICB7IkZvY2FsUGxhbmVZUmVzb2x1dGlvbiIsICAgICAgMHhBMjBGfSwKKyAgICB7IkZvY2FsUGxhbmVSZXNvbHV0aW9uVW5pdCIsICAgMHhBMjEwfSwKKyAgICB7IlN1YmplY3RMb2NhdGlvbiIsICAgICAgICAgICAgMHhBMjE0fSwKKyAgICB7IkV4cG9zdXJlSW5kZXgiLCAgICAgICAgICAgICAgMHhBMjE1fSwKKyAgICB7IlNlbnNpbmdNZXRob2QiLCAgICAgICAgICAgICAgMHhBMjE3fSwKKyAgICB7IkZpbGVTb3VyY2UiLCAgICAgICAgICAgICAgICAgMHhBMzAwfSwKKyAgICB7IlNjZW5lVHlwZSIsICAgICAgICAgICAgICAgICAgMHhBMzAxfSwKKyAgICB7IkNGQVBhdHRlcm4iLCAgICAgICAgICAgICAgICAgMHhBMzAyfSwKKyAgICB7IkN1c3RvbVJlbmRlcmVkIiwgICAgICAgICAgICAgMHhBNDAxfSwKKyAgICB7IkV4cG9zdXJlTW9kZSIsICAgICAgICAgICAgICAgMHhBNDAyfSwKKyAgICB7IldoaXRlQmFsYW5jZSIsICAgICAgICAgICAgICAgMHhBNDAzfSwKKyAgICB7IkRpZ2l0YWxab29tUmF0aW8iLCAgICAgICAgICAgMHhBNDA0fSwKKyAgICB7IkZvY2FsTGVuZ3RoSW4zNW1tRmlsbSIsICAgICAgMHhBNDA1fSwKKyAgICB7IlNjZW5lQ2FwdHVyZVR5cGUiLCAgICAgICAgICAgMHhBNDA2fSwKKyAgICB7IkdhaW5Db250cm9sIiwgICAgICAgICAgICAgICAgMHhBNDA3fSwKKyAgICB7IkNvbnRyYXN0IiwgICAgICAgICAgICAgICAgICAgMHhBNDA4fSwKKyAgICB7IlNhdHVyYXRpb24iLCAgICAgICAgICAgICAgICAgMHhBNDA5fSwKKyAgICB7IlNoYXJwbmVzcyIsICAgICAgICAgICAgICAgICAgMHhBNDBBfSwKKyAgICB7IkRldmljZVNldHRpbmdEZXNjcmlwdGlvbiIsICAgMHhBNDBCfSwKKyAgICB7IlN1YmplY3REaXN0YW5jZVJhbmdlIiwgICAgICAgMHhBNDBDfQorLy8gICAgeyJJbnRlcm9wZXJhYmlsaXR5SW5kZXgiLCAgICAgIDB4MX0sIC8vIDwtIFRhYmxlIDEzIEludGVyb3BlcmFiaWxpdHkgSUZEIEF0dHJpYnV0ZSBJbmZvcm1hdGlvbgorLy8gICAgeyIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MH0KK307CisKKy8qKiBSZWN1cnNpdmVseSBkZWNvZGVzIGFsbCBJRkQncyBhbmQKKyAqICBhZGRzIGluY2x1ZGVkIFRBR1MgaW50byB0aGUgbWV0YWRhdGEgZGljdGlvbmFyeS4gKi8KK2ludCBhdnByaXZfZXhpZl9kZWNvZGVfaWZkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgR2V0Qnl0ZUNvbnRleHQgKmdieXRlcywgaW50IGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoLCBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0VYSUZfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZXhyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9leHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTZmZTJlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZXhyLmMKQEAgLTAsMCArMSwxNDU1IEBACisvKgorICogT3BlbkVYUiAoLmV4cikgaW1hZ2UgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IEppbW15IENocmlzdGVuc2VuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE9wZW5FWFIgZGVjb2RlcgorICogQGF1dGhvciBKaW1teSBDaHJpc3RlbnNlbgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBPcGVuRVhSIGZvcm1hdCwgdmlzaXQ6CisgKiAgaHR0cDovL29wZW5leHIuY29tLworICoKKyAqIGV4cl9mbHQydWludCgpIGFuZCBleHJfaGFsZmx0MnVpbnQoKSBpcyBjcmVkaXRlZCB0byAgUmVpbWFyIETDtmZmaW5nZXIuCisgKiBleHJfaGFsZjJmbG9hdCgpIGlzIGNyZWRpdGVkIHRvIEFhZnRhYiBNdW5zaGk7IERhbiBHaW5zYnVyZywgRGF2ZSBTaHJlaW5lci4KKyAqCisgKi8KKworI2luY2x1ZGUgPHpsaWIuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCitlbnVtIEV4ckNvbXByIHsKKyAgICBFWFJfUkFXLAorICAgIEVYUl9STEUsCisgICAgRVhSX1pJUDEsCisgICAgRVhSX1pJUDE2LAorICAgIEVYUl9QSVosCisgICAgRVhSX1BYUjI0LAorICAgIEVYUl9CNDQsCisgICAgRVhSX0I0NEEsCisgICAgRVhSX1VOS04sCit9OworCitlbnVtIEV4clBpeGVsVHlwZSB7CisgICAgRVhSX1VJTlQsCisgICAgRVhSX0hBTEYsCisgICAgRVhSX0ZMT0FULAorICAgIEVYUl9VTktOT1dOLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgRVhSQ2hhbm5lbCB7CisgICAgaW50IHhzdWIsIHlzdWI7CisgICAgZW51bSBFeHJQaXhlbFR5cGUgcGl4ZWxfdHlwZTsKK30gRVhSQ2hhbm5lbDsKKwordHlwZWRlZiBzdHJ1Y3QgRVhSVGhyZWFkRGF0YSB7CisgICAgdWludDhfdCAqdW5jb21wcmVzc2VkX2RhdGE7CisgICAgaW50IHVuY29tcHJlc3NlZF9zaXplOworCisgICAgdWludDhfdCAqdG1wOworICAgIGludCB0bXBfc2l6ZTsKKworICAgIHVpbnQ4X3QgKmJpdG1hcDsKKyAgICB1aW50MTZfdCAqbHV0OworfSBFWFJUaHJlYWREYXRhOworCit0eXBlZGVmIHN0cnVjdCBFWFJDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBBVkZyYW1lICpwaWN0dXJlOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKworICAgIGVudW0gRXhyQ29tcHIgY29tcHJlc3Npb247CisgICAgZW51bSBFeHJQaXhlbFR5cGUgcGl4ZWxfdHlwZTsKKyAgICBpbnQgY2hhbm5lbF9vZmZzZXRzWzRdOyAvLyAwID0gcmVkLCAxID0gZ3JlZW4sIDIgPSBibHVlIGFuZCAzID0gYWxwaGEKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7CisKKyAgICBpbnQgdywgaDsKKyAgICB1aW50MzJfdCB4bWF4LCB4bWluOworICAgIHVpbnQzMl90IHltYXgsIHltaW47CisgICAgdWludDMyX3QgeGRlbHRhLCB5ZGVsdGE7CisgICAgaW50IHlzaXplOworCisgICAgdWludDY0X3Qgc2Nhbl9saW5lX3NpemU7CisgICAgaW50IHNjYW5fbGluZXNfcGVyX2Jsb2NrOworCisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgY29uc3QgdWludDhfdCAqYnVmOworICAgIGludCBidWZfc2l6ZTsKKworICAgIEVYUkNoYW5uZWwgKmNoYW5uZWxzOworICAgIGludCBuYl9jaGFubmVsczsKKworICAgIEVYUlRocmVhZERhdGEgKnRocmVhZF9kYXRhOworCisgICAgY29uc3QgY2hhciAqbGF5ZXI7CisKKyAgICBmbG9hdCBnYW1tYTsKKworICAgIHVpbnQxNl90IGdhbW1hX3RhYmxlWzY1NTM2XTsKKworfSBFWFJDb250ZXh0OworCisvKiAtMTUgc3RvcmVkIHVzaW5nIGEgc2luZ2xlIHByZWNpc2lvbiBiaWFzIG9mIDEyNyAqLworI2RlZmluZSBIQUxGX0ZMT0FUX01JTl9CSUFTRURfRVhQX0FTX1NJTkdMRV9GUF9FWFAgMHgzODAwMDAwMAorLyogbWF4IGV4cG9uZW50IHZhbHVlIGluIHNpbmdsZSBwcmVjaXNpb24gdGhhdCB3aWxsIGJlIGNvbnZlcnRlZAorICogdG8gSW5mIG9yIE5hbiB3aGVuIHN0b3JlZCBhcyBhIGhhbGYtZmxvYXQgKi8KKyNkZWZpbmUgSEFMRl9GTE9BVF9NQVhfQklBU0VEX0VYUF9BU19TSU5HTEVfRlBfRVhQIDB4NDc4MDAwMDAKKworLyogMjU1IGlzIHRoZSBtYXggZXhwb25lbnQgYmlhc2VkIHZhbHVlICovCisjZGVmaW5lIEZMT0FUX01BWF9CSUFTRURfRVhQICgweEZGIDw8IDIzKQorCisjZGVmaW5lIEhBTEZfRkxPQVRfTUFYX0JJQVNFRF9FWFAgKDB4MUYgPDwgMTApCisKKy8qCisgKiBDb252ZXJ0IGEgaGFsZiBmbG9hdCBhcyBhIHVpbnQxNl90IGludG8gYSBmdWxsIGZsb2F0LgorICoKKyAqIEBwYXJhbSBoZiBoYWxmIGZsb2F0IGFzIHVpbnQxNl90CisgKgorICogQHJldHVybiBmbG9hdCB2YWx1ZQorICovCitzdGF0aWMgdW5pb24gYXZfaW50ZmxvYXQzMiBleHJfaGFsZjJmbG9hdCh1aW50MTZfdCBoZikKK3sKKyAgICB1bnNpZ25lZCBpbnQgICAgc2lnbiA9ICh1bnNpZ25lZCBpbnQpKGhmID4+IDE1KTsKKyAgICB1bnNpZ25lZCBpbnQgICAgbWFudGlzc2EgPSAodW5zaWduZWQgaW50KShoZiAmICgoMSA8PCAxMCkgLSAxKSk7CisgICAgdW5zaWduZWQgaW50ICAgIGV4cCA9ICh1bnNpZ25lZCBpbnQpKGhmICYgSEFMRl9GTE9BVF9NQVhfQklBU0VEX0VYUCk7CisgICAgdW5pb24gYXZfaW50ZmxvYXQzMiAgIGY7CisKKyAgICBpZiAoZXhwID09IEhBTEZfRkxPQVRfTUFYX0JJQVNFRF9FWFApIHsKKyAgICAgICAgLy8gd2UgaGF2ZSBhIGhhbGYtZmxvYXQgTmFOIG9yIEluZgorICAgICAgICAvLyBoYWxmLWZsb2F0IE5hTnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzaW5nbGUgcHJlY2lzaW9uIE5hTgorICAgICAgICAvLyBoYWxmLWZsb2F0IEluZnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzaW5nbGUgcHJlY2lzaW9uIEluZgorICAgICAgICBleHAgPSBGTE9BVF9NQVhfQklBU0VEX0VYUDsKKyAgICAgICAgaWYgKG1hbnRpc3NhKQorICAgICAgICAgICAgbWFudGlzc2EgPSAoMSA8PCAyMykgLSAxOyAgICAvLyBzZXQgYWxsIGJpdHMgdG8gaW5kaWNhdGUgYSBOYU4KKyAgICB9IGVsc2UgaWYgKGV4cCA9PSAweDApIHsKKyAgICAgICAgLy8gY29udmVydCBoYWxmLWZsb2F0IHplcm8vZGVub3JtIHRvIHNpbmdsZSBwcmVjaXNpb24gdmFsdWUKKyAgICAgICAgaWYgKG1hbnRpc3NhKSB7CisgICAgICAgICAgICBtYW50aXNzYSA8PD0gMTsKKyAgICAgICAgICAgIGV4cCA9IEhBTEZfRkxPQVRfTUlOX0JJQVNFRF9FWFBfQVNfU0lOR0xFX0ZQX0VYUDsKKyAgICAgICAgICAgIC8vIGNoZWNrIGZvciBsZWFkaW5nIDEgaW4gZGVub3JtIG1hbnRpc3NhCisgICAgICAgICAgICB3aGlsZSAoKG1hbnRpc3NhICYgKDEgPDwgMTApKSkgeworICAgICAgICAgICAgICAgIC8vIGZvciBldmVyeSBsZWFkaW5nIDAsIGRlY3JlbWVudCBzaW5nbGUgcHJlY2lzaW9uIGV4cG9uZW50IGJ5IDEKKyAgICAgICAgICAgICAgICAvLyBhbmQgc2hpZnQgaGFsZi1mbG9hdCBtYW50aXNzYSB2YWx1ZSB0byB0aGUgbGVmdAorICAgICAgICAgICAgICAgIG1hbnRpc3NhIDw8PSAxOworICAgICAgICAgICAgICAgIGV4cCAtPSAoMSA8PCAyMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjbGFtcCB0aGUgbWFudGlzc2EgdG8gMTAtYml0cworICAgICAgICAgICAgbWFudGlzc2EgJj0gKCgxIDw8IDEwKSAtIDEpOworICAgICAgICAgICAgLy8gc2hpZnQgbGVmdCB0byBnZW5lcmF0ZSBzaW5nbGUtcHJlY2lzaW9uIG1hbnRpc3NhIG9mIDIzLWJpdHMKKyAgICAgICAgICAgIG1hbnRpc3NhIDw8PSAxMzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHNoaWZ0IGxlZnQgdG8gZ2VuZXJhdGUgc2luZ2xlLXByZWNpc2lvbiBtYW50aXNzYSBvZiAyMy1iaXRzCisgICAgICAgIG1hbnRpc3NhIDw8PSAxMzsKKyAgICAgICAgLy8gZ2VuZXJhdGUgc2luZ2xlIHByZWNpc2lvbiBiaWFzZWQgZXhwb25lbnQgdmFsdWUKKyAgICAgICAgZXhwID0gKGV4cCA8PCAxMykgKyBIQUxGX0ZMT0FUX01JTl9CSUFTRURfRVhQX0FTX1NJTkdMRV9GUF9FWFA7CisgICAgfQorCisgICAgZi5pID0gKHNpZ24gPDwgMzEpIHwgZXhwIHwgbWFudGlzc2E7CisKKyAgICByZXR1cm4gZjsKK30KKworCisvKioKKyAqIENvbnZlcnQgZnJvbSAzMi1iaXQgZmxvYXQgYXMgdWludDMyX3QgdG8gdWludDE2X3QuCisgKgorICogQHBhcmFtIHYgMzItYml0IGZsb2F0CisgKgorICogQHJldHVybiBub3JtYWxpemVkIDE2LWJpdCB1bnNpZ25lZCBpbnQKKyAqLworc3RhdGljIGlubGluZSB1aW50MTZfdCBleHJfZmx0MnVpbnQodWludDMyX3QgdikKK3sKKyAgICB1bnNpZ25lZCBpbnQgZXhwID0gdiA+PiAyMzsKKyAgICAvLyAiSEFDSyI6IG5lZ2F0aXZlIHZhbHVlcyByZXN1bHQgaW4gZXhwPCAgMCwgc28gY2xpcHBpbmcgdGhlbSB0byAwCisgICAgLy8gaXMgYWxzbyBoYW5kbGVkIGJ5IHRoaXMgY29uZGl0aW9uLCBhdm9pZHMgZXhwbGljaXQgY2hlY2sgZm9yIHNpZ24gYml0LgorICAgIGlmIChleHAgPD0gMTI3ICsgNyAtIDI0KSAvLyB3ZSB3b3VsZCBzaGlmdCBvdXQgYWxsIGJpdHMgYW55d2F5CisgICAgICAgIHJldHVybiAwOworICAgIGlmIChleHAgPj0gMTI3KQorICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIHYgJj0gMHgwMDdmZmZmZjsKKyAgICByZXR1cm4gKHYgKyAoMSA8PCAyMykpID4+ICgxMjcgKyA3IC0gZXhwKTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gMTYtYml0IGZsb2F0IGFzIHVpbnQxNl90IHRvIHVpbnQxNl90LgorICoKKyAqIEBwYXJhbSB2IDE2LWJpdCBmbG9hdAorICoKKyAqIEByZXR1cm4gbm9ybWFsaXplZCAxNi1iaXQgdW5zaWduZWQgaW50CisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgZXhyX2hhbGZsdDJ1aW50KHVpbnQxNl90IHYpCit7CisgICAgdW5zaWduZWQgZXhwID0gMTQgLSAodiA+PiAxMCk7CisgICAgaWYgKGV4cCA+PSAxNCkgeworICAgICAgICBpZiAoZXhwID09IDE0KQorICAgICAgICAgICAgcmV0dXJuICh2ID4+IDkpICYgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICh2ICYgMHg4MDAwKSA/IDAgOiAweGZmZmY7CisgICAgfQorICAgIHYgPDw9IDY7CisgICAgcmV0dXJuICh2ICsgKDEgPDwgMTYpKSA+PiAoZXhwICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHByZWRpY3Rvcih1aW50OF90ICpzcmMsIGludCBzaXplKQoreworICAgIHVpbnQ4X3QgKnQgICAgPSBzcmMgKyAxOworICAgIHVpbnQ4X3QgKnN0b3AgPSBzcmMgKyBzaXplOworCisgICAgd2hpbGUgKHQgPCBzdG9wKSB7CisgICAgICAgIGludCBkID0gKGludCkgdFstMV0gKyAoaW50KSB0WzBdIC0gMTI4OworICAgICAgICB0WzBdID0gZDsKKyAgICAgICAgKyt0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVvcmRlcl9waXhlbHModWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzaXplKQoreworICAgIGNvbnN0IGludDhfdCAqdDEgPSBzcmM7CisgICAgY29uc3QgaW50OF90ICp0MiA9IHNyYyArIChzaXplICsgMSkgLyAyOworICAgIGludDhfdCAqcyAgICAgICAgPSBkc3Q7CisgICAgaW50OF90ICpzdG9wICAgICA9IHMgKyBzaXplOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKHMgPCBzdG9wKQorICAgICAgICAgICAgKihzKyspID0gKih0MSsrKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKHMgPCBzdG9wKQorICAgICAgICAgICAgKihzKyspID0gKih0MisrKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW50IHppcF91bmNvbXByZXNzKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvbXByZXNzZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVuY29tcHJlc3NlZF9zaXplLCBFWFJUaHJlYWREYXRhICp0ZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGRlc3RfbGVuID0gdW5jb21wcmVzc2VkX3NpemU7CisKKyAgICBpZiAodW5jb21wcmVzcyh0ZC0+dG1wLCAmZGVzdF9sZW4sIHNyYywgY29tcHJlc3NlZF9zaXplKSAhPSBaX09LIHx8CisgICAgICAgIGRlc3RfbGVuICE9IHVuY29tcHJlc3NlZF9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHByZWRpY3Rvcih0ZC0+dG1wLCB1bmNvbXByZXNzZWRfc2l6ZSk7CisgICAgcmVvcmRlcl9waXhlbHModGQtPnRtcCwgdGQtPnVuY29tcHJlc3NlZF9kYXRhLCB1bmNvbXByZXNzZWRfc2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBybGVfdW5jb21wcmVzcyhjb25zdCB1aW50OF90ICpzcmMsIGludCBjb21wcmVzc2VkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1bmNvbXByZXNzZWRfc2l6ZSwgRVhSVGhyZWFkRGF0YSAqdGQpCit7CisgICAgdWludDhfdCAqZCAgICAgID0gdGQtPnRtcDsKKyAgICBjb25zdCBpbnQ4X3QgKnMgPSBzcmM7CisgICAgaW50IHNzaXplICAgICAgID0gY29tcHJlc3NlZF9zaXplOworICAgIGludCBkc2l6ZSAgICAgICA9IHVuY29tcHJlc3NlZF9zaXplOworICAgIHVpbnQ4X3QgKmRlbmQgICA9IGQgKyBkc2l6ZTsKKyAgICBpbnQgY291bnQ7CisKKyAgICB3aGlsZSAoc3NpemUgPiAwKSB7CisgICAgICAgIGNvdW50ID0gKnMrKzsKKworICAgICAgICBpZiAoY291bnQgPCAwKSB7CisgICAgICAgICAgICBjb3VudCA9IC1jb3VudDsKKworICAgICAgICAgICAgaWYgKChkc2l6ZSAtPSBjb3VudCkgPCAwIHx8CisgICAgICAgICAgICAgICAgKHNzaXplIC09IGNvdW50ICsgMSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkKKyAgICAgICAgICAgICAgICAqZCsrID0gKnMrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisKKyAgICAgICAgICAgIGlmICgoZHNpemUgLT0gY291bnQpIDwgMCB8fAorICAgICAgICAgICAgICAgIChzc2l6ZSAtPSAyKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICAgICAgICAgICpkKysgPSAqczsKKworICAgICAgICAgICAgcysrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRlbmQgIT0gZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBwcmVkaWN0b3IodGQtPnRtcCwgdW5jb21wcmVzc2VkX3NpemUpOworICAgIHJlb3JkZXJfcGl4ZWxzKHRkLT50bXAsIHRkLT51bmNvbXByZXNzZWRfZGF0YSwgdW5jb21wcmVzc2VkX3NpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVVNIT1JUX1JBTkdFICgxIDw8IDE2KQorI2RlZmluZSBCSVRNQVBfU0laRSAgKDEgPDwgMTMpCisKK3N0YXRpYyB1aW50MTZfdCByZXZlcnNlX2x1dChjb25zdCB1aW50OF90ICpiaXRtYXAsIHVpbnQxNl90ICpsdXQpCit7CisgICAgaW50IGksIGsgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IFVTSE9SVF9SQU5HRTsgaSsrKQorICAgICAgICBpZiAoKGkgPT0gMCkgfHwgKGJpdG1hcFtpID4+IDNdICYgKDEgPDwgKGkgJiA3KSkpKQorICAgICAgICAgICAgbHV0W2srK10gPSBpOworCisgICAgaSA9IGsgLSAxOworCisgICAgbWVtc2V0KGx1dCArIGssIDAsIChVU0hPUlRfUkFOR0UgLSBrKSAqIDIpOworCisgICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X2x1dChjb25zdCB1aW50MTZfdCAqbHV0LCB1aW50MTZfdCAqZHN0LCBpbnQgZHNpemUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHNpemU7ICsraSkKKyAgICAgICAgZHN0W2ldID0gbHV0W2RzdFtpXV07Cit9CisKKyNkZWZpbmUgSFVGX0VOQ0JJVFMgMTYgIC8vIGxpdGVyYWwgKHZhbHVlKSBiaXQgbGVuZ3RoCisjZGVmaW5lIEhVRl9ERUNCSVRTIDE0ICAvLyBkZWNvZGluZyBiaXQgc2l6ZSAoPj0gOCkKKworI2RlZmluZSBIVUZfRU5DU0laRSAoKDEgPDwgSFVGX0VOQ0JJVFMpICsgMSkgIC8vIGVuY29kaW5nIHRhYmxlIHNpemUKKyNkZWZpbmUgSFVGX0RFQ1NJWkUgKDEgPDwgSFVGX0RFQ0JJVFMpICAgICAgICAvLyBkZWNvZGluZyB0YWJsZSBzaXplCisjZGVmaW5lIEhVRl9ERUNNQVNLIChIVUZfREVDU0laRSAtIDEpCisKK3R5cGVkZWYgc3RydWN0IEh1ZkRlYyB7CisgICAgaW50IGxlbjsKKyAgICBpbnQgbGl0OworICAgIGludCAqcDsKK30gSHVmRGVjOworCitzdGF0aWMgdm9pZCBodWZfY2Fub25pY2FsX2NvZGVfdGFibGUodWludDY0X3QgKmhjb2RlKQoreworICAgIHVpbnQ2NF90IGMsIG5bNTldID0geyAwIH07CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSFVGX0VOQ1NJWkU7ICsraSkKKyAgICAgICAgbltoY29kZVtpXV0gKz0gMTsKKworICAgIGMgPSAwOworICAgIGZvciAoaSA9IDU4OyBpID4gMDsgLS1pKSB7CisgICAgICAgIHVpbnQ2NF90IG5jID0gKChjICsgbltpXSkgPj4gMSk7CisgICAgICAgIG5baV0gPSBjOworICAgICAgICBjICAgID0gbmM7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEhVRl9FTkNTSVpFOyArK2kpIHsKKyAgICAgICAgaW50IGwgPSBoY29kZVtpXTsKKworICAgICAgICBpZiAobCA+IDApCisgICAgICAgICAgICBoY29kZVtpXSA9IGwgfCAobltsXSsrIDw8IDYpOworICAgIH0KK30KKworI2RlZmluZSBTSE9SVF9aRVJPQ09ERV9SVU4gIDU5CisjZGVmaW5lIExPTkdfWkVST0NPREVfUlVOICAgNjMKKyNkZWZpbmUgU0hPUlRFU1RfTE9OR19SVU4gICAoMiArIExPTkdfWkVST0NPREVfUlVOIC0gU0hPUlRfWkVST0NPREVfUlVOKQorI2RlZmluZSBMT05HRVNUX0xPTkdfUlVOICAgICgyNTUgKyBTSE9SVEVTVF9MT05HX1JVTikKKworc3RhdGljIGludCBodWZfdW5wYWNrX2VuY190YWJsZShHZXRCeXRlQ29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW0sIGludDMyX3QgaU0sIHVpbnQ2NF90ICpoY29kZSkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiaXQ7CisgICAgaW50IHJldCA9IGluaXRfZ2V0X2JpdHM4KCZnYml0LCBnYi0+YnVmZmVyLCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yICg7IGltIDw9IGlNOyBpbSsrKSB7CisgICAgICAgIHVpbnQ2NF90IGwgPSBoY29kZVtpbV0gPSBnZXRfYml0cygmZ2JpdCwgNik7CisKKyAgICAgICAgaWYgKGwgPT0gTE9OR19aRVJPQ09ERV9SVU4pIHsKKyAgICAgICAgICAgIGludCB6ZXJ1biA9IGdldF9iaXRzKCZnYml0LCA4KSArIFNIT1JURVNUX0xPTkdfUlVOOworCisgICAgICAgICAgICBpZiAoaW0gKyB6ZXJ1biA+IGlNICsgMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgd2hpbGUgKHplcnVuLS0pCisgICAgICAgICAgICAgICAgaGNvZGVbaW0rK10gPSAwOworCisgICAgICAgICAgICBpbS0tOworICAgICAgICB9IGVsc2UgaWYgKGwgPj0gU0hPUlRfWkVST0NPREVfUlVOKSB7CisgICAgICAgICAgICBpbnQgemVydW4gPSBsIC0gU0hPUlRfWkVST0NPREVfUlVOICsgMjsKKworICAgICAgICAgICAgaWYgKGltICsgemVydW4gPiBpTSArIDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIHdoaWxlICh6ZXJ1bi0tKQorICAgICAgICAgICAgICAgIGhjb2RlW2ltKytdID0gMDsKKworICAgICAgICAgICAgaW0tLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIChnZXRfYml0c19jb3VudCgmZ2JpdCkgKyA3KSAvIDgpOworICAgIGh1Zl9jYW5vbmljYWxfY29kZV90YWJsZShoY29kZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBodWZfYnVpbGRfZGVjX3RhYmxlKGNvbnN0IHVpbnQ2NF90ICpoY29kZSwgaW50IGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpTSwgSHVmRGVjICpoZGVjb2QpCit7CisgICAgZm9yICg7IGltIDw9IGlNOyBpbSsrKSB7CisgICAgICAgIHVpbnQ2NF90IGMgPSBoY29kZVtpbV0gPj4gNjsKKyAgICAgICAgaW50IGksIGwgPSBoY29kZVtpbV0gJiA2MzsKKworICAgICAgICBpZiAoYyA+PiBsKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKGwgPiBIVUZfREVDQklUUykgeworICAgICAgICAgICAgSHVmRGVjICpwbCA9IGhkZWNvZCArIChjID4+IChsIC0gSFVGX0RFQ0JJVFMpKTsKKyAgICAgICAgICAgIGlmIChwbC0+bGVuKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBwbC0+bGl0Kys7CisKKyAgICAgICAgICAgIHBsLT5wID0gYXZfcmVhbGxvYyhwbC0+cCwgcGwtPmxpdCAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgICAgIGlmICghcGwtPnApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgcGwtPnBbcGwtPmxpdCAtIDFdID0gaW07CisgICAgICAgIH0gZWxzZSBpZiAobCkgeworICAgICAgICAgICAgSHVmRGVjICpwbCA9IGhkZWNvZCArIChjIDw8IChIVUZfREVDQklUUyAtIGwpKTsKKworICAgICAgICAgICAgZm9yIChpID0gMSA8PCAoSFVGX0RFQ0JJVFMgLSBsKTsgaSA+IDA7IGktLSwgcGwrKykgeworICAgICAgICAgICAgICAgIGlmIChwbC0+bGVuIHx8IHBsLT5wKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBwbC0+bGVuID0gbDsKKyAgICAgICAgICAgICAgICBwbC0+bGl0ID0gaW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBnZXRfY2hhcihjLCBsYywgZ2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjICAgPSAoYyA8PCA4KSB8IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsYyArPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIGdldF9jb2RlKHBvLCBybGMsIGMsIGxjLCBnYiwgb3V0LCBvZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChwbyA9PSBybGMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobGMgPCA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ2V0X2NoYXIoYywgbGMsIGdiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsYyAtPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjcyA9IGMgPj4gbGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAob3V0ICsgY3MgPiBvZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzID0gb3V0Wy0xXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3aGlsZSAoY3MtLSA+IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKm91dCsrID0gczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAob3V0IDwgb2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqb3V0KysgPSBwbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3N0YXRpYyBpbnQgaHVmX2RlY29kZShjb25zdCB1aW50NjRfdCAqaGNvZGUsIGNvbnN0IEh1ZkRlYyAqaGRlY29kLAorICAgICAgICAgICAgICAgICAgICAgIEdldEJ5dGVDb250ZXh0ICpnYiwgaW50IG5iaXRzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBybGMsIGludCBubywgdWludDE2X3QgKm91dCkKK3sKKyAgICB1aW50NjRfdCBjICAgICAgICA9IDA7CisgICAgdWludDE2X3QgKm91dGIgICAgPSBvdXQ7CisgICAgdWludDE2X3QgKm9lICAgICAgPSBvdXQgKyBubzsKKyAgICBjb25zdCB1aW50OF90ICppZSA9IGdiLT5idWZmZXIgKyAobmJpdHMgKyA3KSAvIDg7IC8vIGlucHV0IGJ5dGUgc2l6ZQorICAgIHVpbnQ4X3QgY3MsIHM7CisgICAgaW50IGksIGxjID0gMDsKKworICAgIHdoaWxlIChnYi0+YnVmZmVyIDwgaWUpIHsKKyAgICAgICAgZ2V0X2NoYXIoYywgbGMsIGdiKTsKKworICAgICAgICB3aGlsZSAobGMgPj0gSFVGX0RFQ0JJVFMpIHsKKyAgICAgICAgICAgIGNvbnN0IEh1ZkRlYyBwbCA9IGhkZWNvZFsoYyA+PiAobGMgLSBIVUZfREVDQklUUykpICYgSFVGX0RFQ01BU0tdOworCisgICAgICAgICAgICBpZiAocGwubGVuKSB7CisgICAgICAgICAgICAgICAgbGMgLT0gcGwubGVuOworICAgICAgICAgICAgICAgIGdldF9jb2RlKHBsLmxpdCwgcmxjLCBjLCBsYywgZ2IsIG91dCwgb2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgIGlmICghcGwucCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGwubGl0OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGwgPSBoY29kZVtwbC5wW2pdXSAmIDYzOworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsYyA8IGwgJiYgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jaGFyKGMsIGxjLCBnYik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxjID49IGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaGNvZGVbcGwucFtqXV0gPj4gNikgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGMgPj4gKGxjIC0gbCkpICYgKCgxTEwgPDwgbCkgLSAxKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYyAtPSBsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jb2RlKHBsLnBbal0sIHJsYywgYywgbGMsIGdiLCBvdXQsIG9lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChqID09IHBsLmxpdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpICAgPSAoOCAtIG5iaXRzKSAmIDc7CisgICAgYyA+Pj0gaTsKKyAgICBsYyAtPSBpOworCisgICAgd2hpbGUgKGxjID4gMCkgeworICAgICAgICBjb25zdCBIdWZEZWMgcGwgPSBoZGVjb2RbKGMgPDwgKEhVRl9ERUNCSVRTIC0gbGMpKSAmIEhVRl9ERUNNQVNLXTsKKworICAgICAgICBpZiAocGwubGVuKSB7CisgICAgICAgICAgICBsYyAtPSBwbC5sZW47CisgICAgICAgICAgICBnZXRfY29kZShwbC5saXQsIHJsYywgYywgbGMsIGdiLCBvdXQsIG9lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dCAtIG91dGIgIT0gbm8pCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh1Zl91bmNvbXByZXNzKEdldEJ5dGVDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRzdCwgaW50IGRzdF9zaXplKQoreworICAgIGludDMyX3Qgc3JjX3NpemUsIGltLCBpTTsKKyAgICB1aW50MzJfdCBuQml0czsKKyAgICB1aW50NjRfdCAqZnJlcTsKKyAgICBIdWZEZWMgKmhkZWM7CisgICAgaW50IHJldCwgaTsKKworICAgIHNyY19zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgIGltICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgIGlNICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIDQpOworICAgIG5CaXRzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgIGlmIChpbSA8IDAgfHwgaW0gPj0gSFVGX0VOQ1NJWkUgfHwKKyAgICAgICAgaU0gPCAwIHx8IGlNID49IEhVRl9FTkNTSVpFIHx8CisgICAgICAgIHNyY19zaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBieXRlc3RyZWFtMl9za2lwKGdiLCA0KTsKKworICAgIGZyZXEgPSBhdl9tYWxsb2N6X2FycmF5KEhVRl9FTkNTSVpFLCBzaXplb2YoKmZyZXEpKTsKKyAgICBoZGVjID0gYXZfbWFsbG9jel9hcnJheShIVUZfREVDU0laRSwgc2l6ZW9mKCpoZGVjKSk7CisgICAgaWYgKCFmcmVxIHx8ICFoZGVjKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICgocmV0ID0gaHVmX3VucGFja19lbmNfdGFibGUoZ2IsIGltLCBpTSwgZnJlcSkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKG5CaXRzID4gOCAqIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSkgeworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBodWZfYnVpbGRfZGVjX3RhYmxlKGZyZXEsIGltLCBpTSwgaGRlYykpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIHJldCA9IGh1Zl9kZWNvZGUoZnJlcSwgaGRlYywgZ2IsIG5CaXRzLCBpTSwgZHN0X3NpemUsIGRzdCk7CisKK2ZhaWw6CisgICAgZm9yIChpID0gMDsgaSA8IEhVRl9ERUNTSVpFOyBpKyspCisgICAgICAgIGlmIChoZGVjKQorICAgICAgICAgICAgYXZfZnJlZXAoJmhkZWNbaV0ucCk7CisKKyAgICBhdl9mcmVlKGZyZXEpOworICAgIGF2X2ZyZWUoaGRlYyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2RlYzE0KHVpbnQxNl90IGwsIHVpbnQxNl90IGgsIHVpbnQxNl90ICphLCB1aW50MTZfdCAqYikKK3sKKyAgICBpbnQxNl90IGxzID0gbDsKKyAgICBpbnQxNl90IGhzID0gaDsKKyAgICBpbnQgaGkgICAgID0gaHM7CisgICAgaW50IGFpICAgICA9IGxzICsgKGhpICYgMSkgKyAoaGkgPj4gMSk7CisgICAgaW50MTZfdCBhcyA9IGFpOworICAgIGludDE2X3QgYnMgPSBhaSAtIGhpOworCisgICAgKmEgPSBhczsKKyAgICAqYiA9IGJzOworfQorCisjZGVmaW5lIE5CSVRTICAgICAgMTYKKyNkZWZpbmUgQV9PRkZTRVQgICgxIDw8IChOQklUUyAtIDEpKQorI2RlZmluZSBNT0RfTUFTSyAgKCgxIDw8IE5CSVRTKSAtIDEpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3ZGVjMTYodWludDE2X3QgbCwgdWludDE2X3QgaCwgdWludDE2X3QgKmEsIHVpbnQxNl90ICpiKQoreworICAgIGludCBtICA9IGw7CisgICAgaW50IGQgID0gaDsKKyAgICBpbnQgYmIgPSAobSAtIChkID4+IDEpKSAmIE1PRF9NQVNLOworICAgIGludCBhYSA9IChkICsgYmIgLSBBX09GRlNFVCkgJiBNT0RfTUFTSzsKKyAgICAqYiA9IGJiOworICAgICphID0gYWE7Cit9CisKK3N0YXRpYyB2b2lkIHdhdl9kZWNvZGUodWludDE2X3QgKmluLCBpbnQgbngsIGludCBveCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG55LCBpbnQgb3ksIHVpbnQxNl90IG14KQoreworICAgIGludCB3MTQgPSAobXggPCAoMSA8PCAxNCkpOworICAgIGludCBuICAgPSAobnggPiBueSkgPyBueSA6IG54OworICAgIGludCBwICAgPSAxOworICAgIGludCBwMjsKKworICAgIHdoaWxlIChwIDw9IG4pCisgICAgICAgIHAgPDw9IDE7CisKKyAgICBwID4+PSAxOworICAgIHAyICA9IHA7CisgICAgcCA+Pj0gMTsKKworICAgIHdoaWxlIChwID49IDEpIHsKKyAgICAgICAgdWludDE2X3QgKnB5ID0gaW47CisgICAgICAgIHVpbnQxNl90ICpleSA9IGluICsgb3kgKiAobnkgLSBwMik7CisgICAgICAgIHVpbnQxNl90IGkwMCwgaTAxLCBpMTAsIGkxMTsKKyAgICAgICAgaW50IG95MSA9IG95ICogcDsKKyAgICAgICAgaW50IG95MiA9IG95ICogcDI7CisgICAgICAgIGludCBveDEgPSBveCAqIHA7CisgICAgICAgIGludCBveDIgPSBveCAqIHAyOworCisgICAgICAgIGZvciAoOyBweSA8PSBleTsgcHkgKz0gb3kyKSB7CisgICAgICAgICAgICB1aW50MTZfdCAqcHggPSBweTsKKyAgICAgICAgICAgIHVpbnQxNl90ICpleCA9IHB5ICsgb3ggKiAobnggLSBwMik7CisKKyAgICAgICAgICAgIGZvciAoOyBweCA8PSBleDsgcHggKz0gb3gyKSB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgKnAwMSA9IHB4ICsgb3gxOworICAgICAgICAgICAgICAgIHVpbnQxNl90ICpwMTAgPSBweCArIG95MTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqcDExID0gcDEwICsgb3gxOworCisgICAgICAgICAgICAgICAgaWYgKHcxNCkgeworICAgICAgICAgICAgICAgICAgICB3ZGVjMTQoKnB4LCAqcDEwLCAmaTAwLCAmaTEwKTsKKyAgICAgICAgICAgICAgICAgICAgd2RlYzE0KCpwMDEsICpwMTEsICZpMDEsICZpMTEpOworICAgICAgICAgICAgICAgICAgICB3ZGVjMTQoaTAwLCBpMDEsIHB4LCBwMDEpOworICAgICAgICAgICAgICAgICAgICB3ZGVjMTQoaTEwLCBpMTEsIHAxMCwgcDExKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3ZGVjMTYoKnB4LCAqcDEwLCAmaTAwLCAmaTEwKTsKKyAgICAgICAgICAgICAgICAgICAgd2RlYzE2KCpwMDEsICpwMTEsICZpMDEsICZpMTEpOworICAgICAgICAgICAgICAgICAgICB3ZGVjMTYoaTAwLCBpMDEsIHB4LCBwMDEpOworICAgICAgICAgICAgICAgICAgICB3ZGVjMTYoaTEwLCBpMTEsIHAxMCwgcDExKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChueCAmIHApIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqcDEwID0gcHggKyBveTE7CisKKyAgICAgICAgICAgICAgICBpZiAodzE0KQorICAgICAgICAgICAgICAgICAgICB3ZGVjMTQoKnB4LCAqcDEwLCAmaTAwLCBwMTApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgd2RlYzE2KCpweCwgKnAxMCwgJmkwMCwgcDEwKTsKKworICAgICAgICAgICAgICAgICpweCA9IGkwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChueSAmIHApIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICpweCA9IHB5OworICAgICAgICAgICAgdWludDE2X3QgKmV4ID0gcHkgKyBveCAqIChueCAtIHAyKTsKKworICAgICAgICAgICAgZm9yICg7IHB4IDw9IGV4OyBweCArPSBveDIpIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqcDAxID0gcHggKyBveDE7CisKKyAgICAgICAgICAgICAgICBpZiAodzE0KQorICAgICAgICAgICAgICAgICAgICB3ZGVjMTQoKnB4LCAqcDAxLCAmaTAwLCBwMDEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgd2RlYzE2KCpweCwgKnAwMSwgJmkwMCwgcDAxKTsKKworICAgICAgICAgICAgICAgICpweCA9IGkwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHAyICA9IHA7CisgICAgICAgIHAgPj49IDE7CisgICAgfQorfQorCitzdGF0aWMgaW50IHBpel91bmNvbXByZXNzKEVYUkNvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHNpemUsIEVYUlRocmVhZERhdGEgKnRkKQoreworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIHVpbnQxNl90IG1heHZhbCwgbWluX25vbl96ZXJvLCBtYXhfbm9uX3plcm87CisgICAgdWludDE2X3QgKnB0cjsKKyAgICB1aW50MTZfdCAqdG1wID0gKHVpbnQxNl90ICopdGQtPnRtcDsKKyAgICB1aW50OF90ICpvdXQ7CisgICAgaW50IHJldCwgaSwgajsKKworICAgIGlmICghdGQtPmJpdG1hcCkKKyAgICAgICAgdGQtPmJpdG1hcCA9IGF2X21hbGxvYyhCSVRNQVBfU0laRSk7CisgICAgaWYgKCF0ZC0+bHV0KQorICAgICAgICB0ZC0+bHV0ID0gYXZfbWFsbG9jKDEgPDwgMTcpOworICAgIGlmICghdGQtPmJpdG1hcCB8fCAhdGQtPmx1dCkgeworICAgICAgICBhdl9mcmVlcCgmdGQtPmJpdG1hcCk7CisgICAgICAgIGF2X2ZyZWVwKCZ0ZC0+bHV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgc3JjLCBzc2l6ZSk7CisgICAgbWluX25vbl96ZXJvID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKyAgICBtYXhfbm9uX3plcm8gPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpOworCisgICAgaWYgKG1heF9ub25femVybyA+PSBCSVRNQVBfU0laRSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBtZW1zZXQodGQtPmJpdG1hcCwgMCwgRkZNSU4obWluX25vbl96ZXJvLCBCSVRNQVBfU0laRSkpOworICAgIGlmIChtaW5fbm9uX3plcm8gPD0gbWF4X25vbl96ZXJvKQorICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnYiwgdGQtPmJpdG1hcCArIG1pbl9ub25femVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbm9uX3plcm8gLSBtaW5fbm9uX3plcm8gKyAxKTsKKyAgICBtZW1zZXQodGQtPmJpdG1hcCArIG1heF9ub25femVybywgMCwgQklUTUFQX1NJWkUgLSBtYXhfbm9uX3plcm8pOworCisgICAgbWF4dmFsID0gcmV2ZXJzZV9sdXQodGQtPmJpdG1hcCwgdGQtPmx1dCk7CisKKyAgICByZXQgPSBodWZfdW5jb21wcmVzcygmZ2IsIHRtcCwgZHNpemUgLyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcHRyID0gdG1wOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIEVYUkNoYW5uZWwgKmNoYW5uZWwgPSAmcy0+Y2hhbm5lbHNbaV07CisgICAgICAgIGludCBzaXplID0gY2hhbm5lbC0+cGl4ZWxfdHlwZTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKQorICAgICAgICAgICAgd2F2X2RlY29kZShwdHIgKyBqLCBzLT54ZGVsdGEsIHNpemUsIHMtPnlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBzLT54ZGVsdGEgKiBzaXplLCBtYXh2YWwpOworICAgICAgICBwdHIgKz0gcy0+eGRlbHRhICogcy0+eXNpemUgKiBzaXplOworICAgIH0KKworICAgIGFwcGx5X2x1dCh0ZC0+bHV0LCB0bXAsIGRzaXplIC8gc2l6ZW9mKHVpbnQxNl90KSk7CisKKyAgICBvdXQgPSB0ZC0+dW5jb21wcmVzc2VkX2RhdGE7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPnlzaXplOyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5uYl9jaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICB1aW50MTZfdCAqaW4gPSB0bXAgKyBqICogcy0+eGRlbHRhICogcy0+eXNpemUgKyBpICogcy0+eGRlbHRhOworICAgICAgICAgICAgbWVtY3B5KG91dCwgaW4sIHMtPnhkZWx0YSAqIDIpOworICAgICAgICAgICAgb3V0ICs9IHMtPnhkZWx0YSAqIDI7CisgICAgICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4cjI0X3VuY29tcHJlc3MoRVhSQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wcmVzc2VkX3NpemUsIGludCB1bmNvbXByZXNzZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFJUaHJlYWREYXRhICp0ZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGRlc3RfbGVuID0gdW5jb21wcmVzc2VkX3NpemU7CisgICAgY29uc3QgdWludDhfdCAqaW4gPSB0ZC0+dG1wOworICAgIHVpbnQ4X3QgKm91dDsKKyAgICBpbnQgYywgaSwgajsKKworICAgIGlmICh1bmNvbXByZXNzKHRkLT50bXAsICZkZXN0X2xlbiwgc3JjLCBjb21wcmVzc2VkX3NpemUpICE9IFpfT0sgfHwKKyAgICAgICAgZGVzdF9sZW4gIT0gdW5jb21wcmVzc2VkX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgb3V0ID0gdGQtPnVuY29tcHJlc3NlZF9kYXRhOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT55c2l6ZTsgaSsrKQorICAgICAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmJfY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgRVhSQ2hhbm5lbCAqY2hhbm5lbCA9ICZzLT5jaGFubmVsc1tjXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0cls0XTsKKyAgICAgICAgICAgIHVpbnQzMl90IHBpeGVsID0gMDsKKworICAgICAgICAgICAgc3dpdGNoIChjaGFubmVsLT5waXhlbF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIEVYUl9GTE9BVDoKKyAgICAgICAgICAgICAgICBwdHJbMF0gPSBpbjsKKyAgICAgICAgICAgICAgICBwdHJbMV0gPSBwdHJbMF0gKyBzLT54ZGVsdGE7CisgICAgICAgICAgICAgICAgcHRyWzJdID0gcHRyWzFdICsgcy0+eGRlbHRhOworICAgICAgICAgICAgICAgIGluICAgICA9IHB0clsyXSArIHMtPnhkZWx0YTsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT54ZGVsdGE7ICsraikgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWZmID0gKCoocHRyWzBdKyspIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKihwdHJbMV0rKykgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKHB0clsyXSsrKSA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWwgKz0gZGlmZjsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmb3V0LCBwaXhlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFWFJfSEFMRjoKKyAgICAgICAgICAgICAgICBwdHJbMF0gPSBpbjsKKyAgICAgICAgICAgICAgICBwdHJbMV0gPSBwdHJbMF0gKyBzLT54ZGVsdGE7CisgICAgICAgICAgICAgICAgaW4gICAgID0gcHRyWzFdICsgcy0+eGRlbHRhOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT54ZGVsdGE7IGorKykgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWZmID0gKCoocHRyWzBdKyspIDw8IDgpIHwgKihwdHJbMV0rKyk7CisKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWwgKz0gZGlmZjsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmb3V0LCBwaXhlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2Jsb2NrKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgam9ibnIsIGludCB0aHJlYWRucikKK3sKKyAgICBFWFJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpjb25zdCBwID0gcy0+cGljdHVyZTsKKyAgICBFWFJUaHJlYWREYXRhICp0ZCA9ICZzLT50aHJlYWRfZGF0YVt0aHJlYWRucl07CisgICAgY29uc3QgdWludDhfdCAqY2hhbm5lbF9idWZmZXJbNF0gPSB7IDAgfTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBzLT5idWY7CisgICAgdWludDY0X3QgbGluZV9vZmZzZXQsIHVuY29tcHJlc3NlZF9zaXplOworICAgIHVpbnQzMl90IHhkZWx0YSA9IHMtPnhkZWx0YTsKKyAgICB1aW50MTZfdCAqcHRyX3g7CisgICAgdWludDhfdCAqcHRyOworICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwgbGluZTsKKyAgICBjb25zdCB1aW50OF90ICpzcmM7CisgICAgaW50IGF4bWF4ID0gKGF2Y3R4LT53aWR0aCAtIChzLT54bWF4ICsgMSkpICogMiAqIHMtPmRlc2MtPm5iX2NvbXBvbmVudHM7CisgICAgaW50IGJ4bWluID0gcy0+eG1pbiAqIDIgKiBzLT5kZXNjLT5uYl9jb21wb25lbnRzOworICAgIGludCBpLCB4LCBidWZfc2l6ZSA9IHMtPmJ1Zl9zaXplOworICAgIGludCByZXQ7CisgICAgZmxvYXQgb25lX2dhbW1hID0gMS4wZiAvIHMtPmdhbW1hOworCisgICAgbGluZV9vZmZzZXQgPSBBVl9STDY0KHMtPmdiLmJ1ZmZlciArIGpvYm5yICogOCk7CisgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBoYXMgdGhlIHJlcXVpcmVkIGJ5dGVzIG5lZWRlZCBmcm9tIHRoZSBvZmZzZXQKKyAgICBpZiAobGluZV9vZmZzZXQgPiBidWZfc2l6ZSAtIDgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3JjICA9IGJ1ZiArIGxpbmVfb2Zmc2V0ICsgODsKKyAgICBsaW5lID0gQVZfUkwzMihzcmMgLSA4KTsKKyAgICBpZiAobGluZSA8IHMtPnltaW4gfHwgbGluZSA+IHMtPnltYXgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgZGF0YV9zaXplID0gQVZfUkwzMihzcmMgLSA0KTsKKyAgICBpZiAoZGF0YV9zaXplIDw9IDAgfHwgZGF0YV9zaXplID4gYnVmX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcy0+eXNpemUgICAgICAgICAgPSBGRk1JTihzLT5zY2FuX2xpbmVzX3Blcl9ibG9jaywgcy0+eW1heCAtIGxpbmUgKyAxKTsKKyAgICB1bmNvbXByZXNzZWRfc2l6ZSA9IHMtPnNjYW5fbGluZV9zaXplICogcy0+eXNpemU7CisgICAgaWYgKChzLT5jb21wcmVzc2lvbiA9PSBFWFJfUkFXICYmIChkYXRhX3NpemUgIT0gdW5jb21wcmVzc2VkX3NpemUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfb2Zmc2V0ID4gYnVmX3NpemUgLSB1bmNvbXByZXNzZWRfc2l6ZSkpIHx8CisgICAgICAgIChzLT5jb21wcmVzc2lvbiAhPSBFWFJfUkFXICYmIChkYXRhX3NpemUgPiB1bmNvbXByZXNzZWRfc2l6ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9vZmZzZXQgPiBidWZfc2l6ZSAtIGRhdGFfc2l6ZSkpKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChkYXRhX3NpemUgPCB1bmNvbXByZXNzZWRfc2l6ZSkgeworICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnRkLT51bmNvbXByZXNzZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZC0+dW5jb21wcmVzc2VkX3NpemUsIHVuY29tcHJlc3NlZF9zaXplKTsKKyAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZ0ZC0+dG1wLCAmdGQtPnRtcF9zaXplLCB1bmNvbXByZXNzZWRfc2l6ZSk7CisgICAgICAgIGlmICghdGQtPnVuY29tcHJlc3NlZF9kYXRhIHx8ICF0ZC0+dG1wKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBzd2l0Y2ggKHMtPmNvbXByZXNzaW9uKSB7CisgICAgICAgIGNhc2UgRVhSX1pJUDE6CisgICAgICAgIGNhc2UgRVhSX1pJUDE2OgorICAgICAgICAgICAgcmV0ID0gemlwX3VuY29tcHJlc3Moc3JjLCBkYXRhX3NpemUsIHVuY29tcHJlc3NlZF9zaXplLCB0ZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFWFJfUElaOgorICAgICAgICAgICAgcmV0ID0gcGl6X3VuY29tcHJlc3Mocywgc3JjLCBkYXRhX3NpemUsIHVuY29tcHJlc3NlZF9zaXplLCB0ZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFWFJfUFhSMjQ6CisgICAgICAgICAgICByZXQgPSBweHIyNF91bmNvbXByZXNzKHMsIHNyYywgZGF0YV9zaXplLCB1bmNvbXByZXNzZWRfc2l6ZSwgdGQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVhSX1JMRToKKyAgICAgICAgICAgIHJldCA9IHJsZV91bmNvbXByZXNzKHNyYywgZGF0YV9zaXplLCB1bmNvbXByZXNzZWRfc2l6ZSwgdGQpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImRlY29kZV9ibG9jaygpIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBzcmMgPSB0ZC0+dW5jb21wcmVzc2VkX2RhdGE7CisgICAgfQorCisgICAgY2hhbm5lbF9idWZmZXJbMF0gPSBzcmMgKyB4ZGVsdGEgKiBzLT5jaGFubmVsX29mZnNldHNbMF07CisgICAgY2hhbm5lbF9idWZmZXJbMV0gPSBzcmMgKyB4ZGVsdGEgKiBzLT5jaGFubmVsX29mZnNldHNbMV07CisgICAgY2hhbm5lbF9idWZmZXJbMl0gPSBzcmMgKyB4ZGVsdGEgKiBzLT5jaGFubmVsX29mZnNldHNbMl07CisgICAgaWYgKHMtPmNoYW5uZWxfb2Zmc2V0c1szXSA+PSAwKQorICAgICAgICBjaGFubmVsX2J1ZmZlclszXSA9IHNyYyArIHhkZWx0YSAqIHMtPmNoYW5uZWxfb2Zmc2V0c1szXTsKKworICAgIHB0ciA9IHAtPmRhdGFbMF0gKyBsaW5lICogcC0+bGluZXNpemVbMF07CisgICAgZm9yIChpID0gMDsKKyAgICAgICAgIGkgPCBzLT5zY2FuX2xpbmVzX3Blcl9ibG9jayAmJiBsaW5lICsgaSA8PSBzLT55bWF4OworICAgICAgICAgaSsrLCBwdHIgKz0gcC0+bGluZXNpemVbMF0pIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqciwgKmcsICpiLCAqYTsKKworICAgICAgICByID0gY2hhbm5lbF9idWZmZXJbMF07CisgICAgICAgIGcgPSBjaGFubmVsX2J1ZmZlclsxXTsKKyAgICAgICAgYiA9IGNoYW5uZWxfYnVmZmVyWzJdOworICAgICAgICBpZiAoY2hhbm5lbF9idWZmZXJbM10pCisgICAgICAgICAgICBhID0gY2hhbm5lbF9idWZmZXJbM107CisKKyAgICAgICAgcHRyX3ggPSAodWludDE2X3QgKikgcHRyOworCisgICAgICAgIC8vIFplcm8gb3V0IHRoZSBzdGFydCBpZiB4bWluIGlzIG5vdCAwCisgICAgICAgIG1lbXNldChwdHJfeCwgMCwgYnhtaW4pOworICAgICAgICBwdHJfeCArPSBzLT54bWluICogcy0+ZGVzYy0+bmJfY29tcG9uZW50czsKKyAgICAgICAgaWYgKHMtPnBpeGVsX3R5cGUgPT0gRVhSX0ZMT0FUKSB7CisgICAgICAgICAgICAvLyAzMi1iaXQKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB4ZGVsdGE7IHgrKykgeworICAgICAgICAgICAgICAgIHVuaW9uIGF2X2ludGZsb2F0MzIgdDsKKyAgICAgICAgICAgICAgICB0LmkgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZyKTsKKyAgICAgICAgICAgICAgICBpZiAoIHQuZiA+IDAuMGYgKSAgLyogYXZvaWQgbmVnYXRpdmUgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIHQuZiA9IHBvd2YodC5mLCBvbmVfZ2FtbWEpOworICAgICAgICAgICAgICAgICpwdHJfeCsrID0gZXhyX2ZsdDJ1aW50KHQuaSk7CisKKyAgICAgICAgICAgICAgICB0LmkgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZnKTsKKyAgICAgICAgICAgICAgICBpZiAoIHQuZiA+IDAuMGYgKQorICAgICAgICAgICAgICAgICAgICB0LmYgPSBwb3dmKHQuZiwgb25lX2dhbW1hKTsKKyAgICAgICAgICAgICAgICAqcHRyX3grKyA9IGV4cl9mbHQydWludCh0LmkpOworCisgICAgICAgICAgICAgICAgdC5pID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmYik7CisgICAgICAgICAgICAgICAgaWYgKCB0LmYgPiAwLjBmICkKKyAgICAgICAgICAgICAgICAgICAgdC5mID0gcG93Zih0LmYsIG9uZV9nYW1tYSk7CisgICAgICAgICAgICAgICAgKnB0cl94KysgPSBleHJfZmx0MnVpbnQodC5pKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbF9idWZmZXJbM10pCisgICAgICAgICAgICAgICAgICAgICpwdHJfeCsrID0gZXhyX2ZsdDJ1aW50KGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIDE2LWJpdAorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHhkZWx0YTsgeCsrKSB7CisgICAgICAgICAgICAgICAgKnB0cl94KysgPSBzLT5nYW1tYV90YWJsZVtieXRlc3RyZWFtX2dldF9sZTE2KCZyKV07CisgICAgICAgICAgICAgICAgKnB0cl94KysgPSBzLT5nYW1tYV90YWJsZVtieXRlc3RyZWFtX2dldF9sZTE2KCZnKV07CisgICAgICAgICAgICAgICAgKnB0cl94KysgPSBzLT5nYW1tYV90YWJsZVtieXRlc3RyZWFtX2dldF9sZTE2KCZiKV07CisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxfYnVmZmVyWzNdKQorICAgICAgICAgICAgICAgICAgICAqcHRyX3grKyA9IGV4cl9oYWxmbHQydWludChieXRlc3RyZWFtX2dldF9sZTE2KCZhKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBaZXJvIG91dCB0aGUgZW5kIGlmIHhtYXgrMSBpcyBub3QgdworICAgICAgICBtZW1zZXQocHRyX3gsIDAsIGF4bWF4KTsKKworICAgICAgICBjaGFubmVsX2J1ZmZlclswXSArPSBzLT5zY2FuX2xpbmVfc2l6ZTsKKyAgICAgICAgY2hhbm5lbF9idWZmZXJbMV0gKz0gcy0+c2Nhbl9saW5lX3NpemU7CisgICAgICAgIGNoYW5uZWxfYnVmZmVyWzJdICs9IHMtPnNjYW5fbGluZV9zaXplOworICAgICAgICBpZiAoY2hhbm5lbF9idWZmZXJbM10pCisgICAgICAgICAgICBjaGFubmVsX2J1ZmZlclszXSArPSBzLT5zY2FuX2xpbmVfc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgdmFyaWFibGUgbmFtZSBjb3JyZXNwb25kcyB0byBpdHMgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSBzICAgICAgICAgICAgICB0aGUgRVhSQ29udGV4dAorICogQHBhcmFtIHZhbHVlX25hbWUgICAgIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGNoZWNrCisgKiBAcGFyYW0gdmFsdWVfdHlwZSAgICAgdHlwZSBvZiB0aGUgdmFyaWFibGUgdG8gY2hlY2sKKyAqIEBwYXJhbSBtaW5pbXVtX2xlbmd0aCBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgdmFyaWFibGUgZGF0YQorICoKKyAqIEByZXR1cm4gYnl0ZXMgdG8gcmVhZCBjb250YWluaW5nIHZhcmlhYmxlIGRhdGEKKyAqICAgICAgICAgLTEgaWYgdmFyaWFibGUgaXMgbm90IGZvdW5kCisgKiAgICAgICAgIDAgaWYgYnVmZmVyIGVuZGVkIHByZW1hdHVyZWx5CisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaGVhZGVyX3ZhcmlhYmxlKEVYUkNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtaW5pbXVtX2xlbmd0aCkKK3sKKyAgICBpbnQgdmFyX3NpemUgPSAtMTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpID49IG1pbmltdW1fbGVuZ3RoICYmCisgICAgICAgICFzdHJjbXAocy0+Z2IuYnVmZmVyLCB2YWx1ZV9uYW1lKSkgeworICAgICAgICAvLyBmb3VuZCB2YWx1ZV9uYW1lLCBqdW1wIHRvIHZhbHVlX3R5cGUgKG51bGwgdGVybWluYXRlZCBzdHJpbmdzKQorICAgICAgICBzLT5nYi5idWZmZXIgKz0gc3RybGVuKHZhbHVlX25hbWUpICsgMTsKKyAgICAgICAgaWYgKCFzdHJjbXAocy0+Z2IuYnVmZmVyLCB2YWx1ZV90eXBlKSkgeworICAgICAgICAgICAgcy0+Z2IuYnVmZmVyICs9IHN0cmxlbih2YWx1ZV90eXBlKSArIDE7CisgICAgICAgICAgICB2YXJfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZzLT5nYik7CisgICAgICAgICAgICAvLyBkb24ndCBnbyByZWFkIHBhc3QgYm91bmRhcmllcworICAgICAgICAgICAgaWYgKHZhcl9zaXplID4gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSkKKyAgICAgICAgICAgICAgICB2YXJfc2l6ZSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB2YWx1ZV90eXBlIG5vdCBmb3VuZCwgcmVzZXQgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgcy0+Z2IuYnVmZmVyIC09IHN0cmxlbih2YWx1ZV9uYW1lKSArIDE7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJVbmtub3duIGRhdGEgdHlwZSAlcyBmb3IgaGVhZGVyIHZhcmlhYmxlICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLCB2YWx1ZV9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2YXJfc2l6ZTsKK30KKworc3RhdGljIGludCBkZWNvZGVfaGVhZGVyKEVYUkNvbnRleHQgKnMpCit7CisgICAgaW50IGN1cnJlbnRfY2hhbm5lbF9vZmZzZXQgPSAwOworICAgIGludCBtYWdpY19udW1iZXIsIHZlcnNpb24sIGZsYWdzLCBpOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCAxMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkhlYWRlciB0b28gc2hvcnQgdG8gcGFyc2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgbWFnaWNfbnVtYmVyID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnMtPmdiKTsKKyAgICBpZiAobWFnaWNfbnVtYmVyICE9IDIwMDAwNjMwKSB7CisgICAgICAgIC8qIEFzIHBlciBkb2N1bWVudGF0aW9uIG9mIE9wZW5FWFIsIGl0IGlzIHN1cHBvc2VkIHRvIGJlCisgICAgICAgICAqIGludCAyMDAwMDYzMCBsaXR0bGUtZW5kaWFuICovCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiV3JvbmcgbWFnaWMgbnVtYmVyICVkLlxuIiwgbWFnaWNfbnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgdmVyc2lvbiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgaWYgKHZlcnNpb24gIT0gMikgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIlZlcnNpb24gJWQiLCB2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGZsYWdzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMjQoJnMtPmdiKTsKKyAgICBpZiAoZmxhZ3MgJiAweDAyKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiVGlsZSBzdXBwb3J0Iik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSB0aGUgaGVhZGVyCisgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPiAwICYmICpzLT5nYi5idWZmZXIpIHsKKyAgICAgICAgaW50IHZhcl9zaXplOworICAgICAgICBpZiAoKHZhcl9zaXplID0gY2hlY2tfaGVhZGVyX3ZhcmlhYmxlKHMsICJjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNobGlzdCIsIDM4KSkgPj0gMCkgeworICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgY2hfZ2I7CisgICAgICAgICAgICBpZiAoIXZhcl9zaXplKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZjaF9nYiwgcy0+Z2IuYnVmZmVyLCB2YXJfc2l6ZSk7CisKKyAgICAgICAgICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY2hfZ2IpID49IDE5KSB7CisgICAgICAgICAgICAgICAgRVhSQ2hhbm5lbCAqY2hhbm5lbDsKKyAgICAgICAgICAgICAgICBlbnVtIEV4clBpeGVsVHlwZSBjdXJyZW50X3BpeGVsX3R5cGU7CisgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxfaW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICBpbnQgeHN1YiwgeXN1YjsKKworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAocy0+bGF5ZXIsICIiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKGNoX2diLmJ1ZmZlciwgcy0+bGF5ZXIsIHN0cmxlbihzLT5sYXllcikpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoX2diLmJ1ZmZlciArPSBzdHJsZW4ocy0+bGF5ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpjaF9nYi5idWZmZXIgPT0gJy4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoX2diLmJ1ZmZlcisrOyAgICAgICAgIC8qIHNraXAgZG90IGlmIG5vdCBnaXZlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF5ZXIgJXMuJXMgbWF0Y2hlZC5cbiIsIHMtPmxheWVyLCBjaF9nYi5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoY2hfZ2IuYnVmZmVyLCAiUiIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoY2hfZ2IuYnVmZmVyLCAiWCIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoY2hfZ2IuYnVmZmVyLCAiVSIpKQorICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGNoX2diLmJ1ZmZlciwgIkciKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoY2hfZ2IuYnVmZmVyLCAiWSIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChjaF9nYi5idWZmZXIsICJWIikpCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfaW5kZXggPSAxOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoY2hfZ2IuYnVmZmVyLCAiQiIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChjaF9nYi5idWZmZXIsICJaIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKGNoX2diLmJ1ZmZlciwgIlciKSkKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9pbmRleCA9IDI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChjaF9nYi5idWZmZXIsICJBIikpCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfaW5kZXggPSAzOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBjaGFubmVsICUuMjU2cy5cbiIsIGNoX2diLmJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIHVudGlsIHlvdSBnZXQgYSAwICovCisgICAgICAgICAgICAgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjaF9nYikgPiAwICYmCisgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjaF9nYikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjaF9nYikgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb21wbGV0ZSBoZWFkZXIuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3VycmVudF9waXhlbF90eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmNoX2diKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudF9waXhlbF90eXBlID49IEVYUl9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGl4ZWwgdHlwZSAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcGl4ZWxfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZjaF9nYiwgNCk7CisgICAgICAgICAgICAgICAgeHN1YiA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZjaF9nYik7CisgICAgICAgICAgICAgICAgeXN1YiA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZjaF9nYik7CisgICAgICAgICAgICAgICAgaWYgKHhzdWIgIT0gMSB8fCB5c3ViICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocy0+YXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJzYW1wbGluZyAlZHglZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdWIsIHlzdWIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxfaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGl4ZWxfdHlwZSAhPSBFWFJfVU5LTk9XTiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGl4ZWxfdHlwZSAhPSBjdXJyZW50X3BpeGVsX3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSR0IgY2hhbm5lbHMgbm90IG9mIHRoZSBzYW1lIGRlcHRoLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzLT5waXhlbF90eXBlICAgICAgICAgICAgICAgICAgICAgPSBjdXJyZW50X3BpeGVsX3R5cGU7CisgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfb2Zmc2V0c1tjaGFubmVsX2luZGV4XSA9IGN1cnJlbnRfY2hhbm5lbF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbHMgPSBhdl9yZWFsbG9jKHMtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3MtPm5iX2NoYW5uZWxzICogc2l6ZW9mKEVYUkNoYW5uZWwpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXMtPmNoYW5uZWxzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGNoYW5uZWwgICAgICAgICAgICAgPSAmcy0+Y2hhbm5lbHNbcy0+bmJfY2hhbm5lbHMgLSAxXTsKKyAgICAgICAgICAgICAgICBjaGFubmVsLT5waXhlbF90eXBlID0gY3VycmVudF9waXhlbF90eXBlOworICAgICAgICAgICAgICAgIGNoYW5uZWwtPnhzdWIgICAgICAgPSB4c3ViOworICAgICAgICAgICAgICAgIGNoYW5uZWwtPnlzdWIgICAgICAgPSB5c3ViOworCisgICAgICAgICAgICAgICAgY3VycmVudF9jaGFubmVsX29mZnNldCArPSAxIDw8IGN1cnJlbnRfcGl4ZWxfdHlwZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ2hlY2sgaWYgYWxsIGNoYW5uZWxzIGFyZSBzZXQgd2l0aCBhbiBvZmZzZXQgb3IgaWYgdGhlIGNoYW5uZWxzCisgICAgICAgICAgICAgKiBhcmUgY2F1c2luZyBhbiBvdmVyZmxvdyAgKi8KKyAgICAgICAgICAgIGlmIChGRk1JTjMocy0+Y2hhbm5lbF9vZmZzZXRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5jaGFubmVsX29mZnNldHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfb2Zmc2V0c1syXSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfb2Zmc2V0c1swXSA8IDApCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyByZWQgY2hhbm5lbC5cbiIpOworICAgICAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX29mZnNldHNbMV0gPCAwKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgZ3JlZW4gY2hhbm5lbC5cbiIpOworICAgICAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX29mZnNldHNbMl0gPCAwKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgYmx1ZSBjaGFubmVsLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNraXAgb25lIGxhc3QgYnl0ZSBhbmQgdXBkYXRlIG1haW4gZ2IKKyAgICAgICAgICAgIHMtPmdiLmJ1ZmZlciA9IGNoX2diLmJ1ZmZlciArIDE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmICgodmFyX3NpemUgPSBjaGVja19oZWFkZXJfdmFyaWFibGUocywgImRhdGFXaW5kb3ciLCAiYm94MmkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSkpID49IDApIHsKKyAgICAgICAgICAgIGlmICghdmFyX3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIHMtPnhtaW4gICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZzLT5nYik7CisgICAgICAgICAgICBzLT55bWluICAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+Z2IpOworICAgICAgICAgICAgcy0+eG1heCAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnMtPmdiKTsKKyAgICAgICAgICAgIHMtPnltYXggICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZzLT5nYik7CisgICAgICAgICAgICBzLT54ZGVsdGEgPSAocy0+eG1heCAtIHMtPnhtaW4pICsgMTsKKyAgICAgICAgICAgIHMtPnlkZWx0YSA9IChzLT55bWF4IC0gcy0+eW1pbikgKyAxOworCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmICgodmFyX3NpemUgPSBjaGVja19oZWFkZXJfdmFyaWFibGUocywgImRpc3BsYXlXaW5kb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm94MmkiLCAzNCkpID49IDApIHsKKyAgICAgICAgICAgIGlmICghdmFyX3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIHMtPncgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+Z2IpICsgMTsKKyAgICAgICAgICAgIHMtPmggPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+Z2IpICsgMTsKKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoKHZhcl9zaXplID0gY2hlY2tfaGVhZGVyX3ZhcmlhYmxlKHMsICJsaW5lT3JkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZU9yZGVyIiwgMjUpKSA+PSAwKSB7CisgICAgICAgICAgICBpbnQgbGluZV9vcmRlcjsKKyAgICAgICAgICAgIGlmICghdmFyX3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIGxpbmVfb3JkZXIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJsaW5lIG9yZGVyOiAlZC5cbiIsIGxpbmVfb3JkZXIpOworICAgICAgICAgICAgaWYgKGxpbmVfb3JkZXIgPiAyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGxpbmUgb3JkZXIuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoKHZhcl9zaXplID0gY2hlY2tfaGVhZGVyX3ZhcmlhYmxlKHMsICJwaXhlbEFzcGVjdFJhdGlvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IiwgMzEpKSA+PSAwKSB7CisgICAgICAgICAgICBpZiAoIXZhcl9zaXplKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBmZl9zZXRfc2FyKHMtPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICBhdl9kMnEoYXZfaW50MmZsb2F0KGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZzLT5nYikpLCAyNTUpKTsKKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoKHZhcl9zaXplID0gY2hlY2tfaGVhZGVyX3ZhcmlhYmxlKHMsICJjb21wcmVzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2lvbiIsIDI5KSkgPj0gMCkgeworICAgICAgICAgICAgaWYgKCF2YXJfc2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgaWYgKHMtPmNvbXByZXNzaW9uID09IEVYUl9VTktOKQorICAgICAgICAgICAgICAgIHMtPmNvbXByZXNzaW9uID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgbW9yZSB0aGFuIG9uZSBjb21wcmVzc2lvbiBhdHRyaWJ1dGUuXG4iKTsKKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgZW5vdWdoIGJ5dGVzIGZvciBhIGhlYWRlcgorICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8PSA5KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29tcGxldGUgaGVhZGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyB1bmtub3duIHZhcmlhYmxlcworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSAvLyB2YWx1ZV9uYW1lIGFuZCB2YWx1ZV90eXBlCisgICAgICAgICAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKSAhPSAwKTsKKworICAgICAgICAvLyBTa2lwIHZhcmlhYmxlIGxlbmd0aAorICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnMtPmdiKSk7CisgICAgfQorCisgICAgaWYgKHMtPmNvbXByZXNzaW9uID09IEVYUl9VTktOKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBjb21wcmVzc2lvbiBhdHRyaWJ1dGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHMtPnNjYW5fbGluZV9zaXplID0gcy0+eGRlbHRhICogY3VycmVudF9jaGFubmVsX29mZnNldDsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvbXBsZXRlIGZyYW1lLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8vIGFhYW5kIHdlIGFyZSBkb25lCisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIDEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEVYUkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFRocmVhZEZyYW1lIGZyYW1lID0geyAuZiA9IGRhdGEgfTsKKyAgICBBVkZyYW1lICpwaWN0dXJlID0gZGF0YTsKKyAgICB1aW50OF90ICpwdHI7CisKKyAgICBpbnQgeSwgcmV0OworICAgIGludCBvdXRfbGluZV9zaXplOworICAgIGludCBzY2FuX2xpbmVfYmxvY2tzOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+Z2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisKKyAgICBpZiAoKHJldCA9IGRlY29kZV9oZWFkZXIocykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHN3aXRjaCAocy0+cGl4ZWxfdHlwZSkgeworICAgIGNhc2UgRVhSX0ZMT0FUOgorICAgIGNhc2UgRVhSX0hBTEY6CisgICAgICAgIGlmIChzLT5jaGFubmVsX29mZnNldHNbM10gPj0gMCkKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0JBNjQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I0ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFJfVUlOVDoKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiMzItYml0IHVuc2lnbmVkIGludCIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIGNoYW5uZWwgbGlzdC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHMtPmNvbXByZXNzaW9uKSB7CisgICAgY2FzZSBFWFJfUkFXOgorICAgIGNhc2UgRVhSX1JMRToKKyAgICBjYXNlIEVYUl9aSVAxOgorICAgICAgICBzLT5zY2FuX2xpbmVzX3Blcl9ibG9jayA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVhSX1BYUjI0OgorICAgIGNhc2UgRVhSX1pJUDE2OgorICAgICAgICBzLT5zY2FuX2xpbmVzX3Blcl9ibG9jayA9IDE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYUl9QSVo6CisgICAgICAgIHMtPnNjYW5fbGluZXNfcGVyX2Jsb2NrID0gMzI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiQ29tcHJlc3Npb24gJWQiLCBzLT5jb21wcmVzc2lvbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvKiBWZXJpZnkgdGhlIHhtaW4sIHhtYXgsIHltaW4sIHltYXggYW5kIHhkZWx0YSBiZWZvcmUgc2V0dGluZworICAgICAqIHRoZSBhY3R1YWwgaW1hZ2Ugc2l6ZS4gKi8KKyAgICBpZiAocy0+eG1pbiA+IHMtPnhtYXggICAgICAgICAgICAgICAgICB8fAorICAgICAgICBzLT55bWluID4gcy0+eW1heCAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgIHMtPnhkZWx0YSAhPSBzLT54bWF4IC0gcy0+eG1pbiArIDEgfHwKKyAgICAgICAgcy0+eG1heCA+PSBzLT53ICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICBzLT55bWF4ID49IHMtPmgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJXcm9uZyBvciBtaXNzaW5nIHNpemUgaW5mb3JtYXRpb24uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgcy0+dywgcy0+aCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHMtPmRlc2MgICAgICAgICAgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKKyAgICBpZiAoIXMtPmRlc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIG91dF9saW5lX3NpemUgICAgPSBhdmN0eC0+d2lkdGggKiAyICogcy0+ZGVzYy0+bmJfY29tcG9uZW50czsKKyAgICBzY2FuX2xpbmVfYmxvY2tzID0gKHMtPnlkZWx0YSArIHMtPnNjYW5fbGluZXNfcGVyX2Jsb2NrIC0gMSkgLworICAgICAgICAgICAgICAgICAgICAgICBzLT5zY2FuX2xpbmVzX3Blcl9ibG9jazsKKworICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpIDwgc2Nhbl9saW5lX2Jsb2NrcyAqIDgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLy8gc2F2ZSBwb2ludGVyIHdlIGFyZSBnb2luZyB0byB1c2UgaW4gZGVjb2RlX2Jsb2NrCisgICAgcy0+YnVmICAgICAgPSBhdnBrdC0+ZGF0YTsKKyAgICBzLT5idWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIHB0ciAgICAgICAgID0gcGljdHVyZS0+ZGF0YVswXTsKKworICAgIC8vIFplcm8gb3V0IHRoZSBzdGFydCBpZiB5bWluIGlzIG5vdCAwCisgICAgZm9yICh5ID0gMDsgeSA8IHMtPnltaW47IHkrKykgeworICAgICAgICBtZW1zZXQocHRyLCAwLCBvdXRfbGluZV9zaXplKTsKKyAgICAgICAgcHRyICs9IHBpY3R1cmUtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIHMtPnBpY3R1cmUgPSBwaWN0dXJlOworICAgIGF2Y3R4LT5leGVjdXRlMihhdmN0eCwgZGVjb2RlX2Jsb2NrLCBzLT50aHJlYWRfZGF0YSwgTlVMTCwgc2Nhbl9saW5lX2Jsb2Nrcyk7CisKKyAgICAvLyBaZXJvIG91dCB0aGUgZW5kIGlmIHltYXgrMSBpcyBub3QgaAorICAgIGZvciAoeSA9IHMtPnltYXggKyAxOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIG1lbXNldChwdHIsIDAsIG91dF9saW5lX3NpemUpOworICAgICAgICBwdHIgKz0gcGljdHVyZS0+bGluZXNpemVbMF07CisgICAgfQorCisgICAgcGljdHVyZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgdWludDMyX3QgaTsKKyAgICB1bmlvbiBhdl9pbnRmbG9hdDMyIHQ7CisgICAgRVhSQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZmxvYXQgb25lX2dhbW1hID0gMS4wZiAvIHMtPmdhbW1hOworCisgICAgcy0+YXZjdHggICAgICAgICAgICAgID0gYXZjdHg7CisgICAgcy0+eG1pbiAgICAgICAgICAgICAgID0gfjA7CisgICAgcy0+eG1heCAgICAgICAgICAgICAgID0gfjA7CisgICAgcy0+eW1pbiAgICAgICAgICAgICAgID0gfjA7CisgICAgcy0+eW1heCAgICAgICAgICAgICAgID0gfjA7CisgICAgcy0+eGRlbHRhICAgICAgICAgICAgID0gfjA7CisgICAgcy0+eWRlbHRhICAgICAgICAgICAgID0gfjA7CisgICAgcy0+Y2hhbm5lbF9vZmZzZXRzWzBdID0gLTE7CisgICAgcy0+Y2hhbm5lbF9vZmZzZXRzWzFdID0gLTE7CisgICAgcy0+Y2hhbm5lbF9vZmZzZXRzWzJdID0gLTE7CisgICAgcy0+Y2hhbm5lbF9vZmZzZXRzWzNdID0gLTE7CisgICAgcy0+cGl4ZWxfdHlwZSAgICAgICAgID0gRVhSX1VOS05PV047CisgICAgcy0+Y29tcHJlc3Npb24gICAgICAgID0gRVhSX1VOS047CisgICAgcy0+bmJfY2hhbm5lbHMgICAgICAgID0gMDsKKyAgICBzLT53ICAgICAgICAgICAgICAgICAgPSAwOworICAgIHMtPmggICAgICAgICAgICAgICAgICA9IDA7CisKKyAgICBpZiAoIG9uZV9nYW1tYSA+IDAuOTk5OWYgJiYgb25lX2dhbW1hIDwgMS4wMDAxZiApIHsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCA2NTUzNjsgKytpICkgeworICAgICAgICAgICAgcy0+Z2FtbWFfdGFibGVbaV0gPSBleHJfaGFsZmx0MnVpbnQoaSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDY1NTM2OyArK2kgKSB7CisgICAgICAgICAgICB0ID0gZXhyX2hhbGYyZmxvYXQoaSk7CisgICAgICAgICAgICAvKiBJZiBuZWdhdGl2ZSB2YWx1ZSB3ZSByZXVzZSBoYWxmIHZhbHVlICovCisgICAgICAgICAgICBpZiAoIHQuZiA8PSAwLjBmICkgeworICAgICAgICAgICAgICAgIHMtPmdhbW1hX3RhYmxlW2ldID0gZXhyX2hhbGZsdDJ1aW50KGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0LmYgPSBwb3dmKHQuZiwgb25lX2dhbW1hKTsKKyAgICAgICAgICAgICAgICBzLT5nYW1tYV90YWJsZVtpXSA9IGV4cl9mbHQydWludCh0LmkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWxsb2NhdGUgdGhyZWFkIGRhdGEsIHVzZWQgZm9yIG5vbiBFWFJfUkFXIGNvbXByZWVzaW9uIHR5cGVzCisgICAgcy0+dGhyZWFkX2RhdGEgPSBhdl9tYWxsb2N6X2FycmF5KGF2Y3R4LT50aHJlYWRfY291bnQsIHNpemVvZihFWFJUaHJlYWREYXRhKSk7CisgICAgaWYgKCFzLT50aHJlYWRfZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7ICAgIEVYUkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgLy8gYWxsb2NhdGUgdGhyZWFkIGRhdGEsIHVzZWQgZm9yIG5vbiBFWFJfUkFXIGNvbXByZWVzaW9uIHR5cGVzCisgICAgcy0+dGhyZWFkX2RhdGEgPSBhdl9tYWxsb2N6X2FycmF5KGF2Y3R4LT50aHJlYWRfY291bnQsIHNpemVvZihFWFJUaHJlYWREYXRhKSk7CisgICAgaWYgKCFzLT50aHJlYWRfZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEVYUkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+dGhyZWFkX2NvdW50OyBpKyspIHsKKyAgICAgICAgRVhSVGhyZWFkRGF0YSAqdGQgPSAmcy0+dGhyZWFkX2RhdGFbaV07CisgICAgICAgIGF2X2ZyZWVwKCZ0ZC0+dW5jb21wcmVzc2VkX2RhdGEpOworICAgICAgICBhdl9mcmVlcCgmdGQtPnRtcCk7CisgICAgICAgIGF2X2ZyZWVwKCZ0ZC0+Yml0bWFwKTsKKyAgICAgICAgYXZfZnJlZXAoJnRkLT5sdXQpOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZzLT50aHJlYWRfZGF0YSk7CisgICAgYXZfZnJlZXAoJnMtPmNoYW5uZWxzKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihFWFJDb250ZXh0LCB4KQorI2RlZmluZSBWRCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImxheWVyIiwgIlNldCB0aGUgZGVjb2RpbmcgbGF5ZXIiLCBPRkZTRVQobGF5ZXIpLAorICAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICIiIH0sIDAsIDAsIFZEIH0sCisgICAgeyAiZ2FtbWEiLCAiU2V0IHRoZSBmbG9hdCBnYW1tYSB2YWx1ZSB3aGVuIGRlY29kaW5nIChleHBlcmltZW50YWwvdW5zdXBwb3J0ZWQpIiwgT0ZGU0VUKGdhbW1hKSwKKyAgICAgICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IDEuMGYgfSwgMC4wMDEsIEZMVF9NQVgsIFZEIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBleHJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiRVhSIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfZXhyX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAiZXhyIiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPcGVuRVhSIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9FWFIsCisgICAgLnByaXZfZGF0YV9zaXplICAgPSBzaXplb2YoRVhSQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuaW5pdF90aHJlYWRfY29weSA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKGRlY29kZV9pbml0X3RocmVhZF9jb3B5KSwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMsCisgICAgLnByaXZfY2xhc3MgICAgICAgPSAmZXhyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZhYW5kY3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZhYW5kY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDUzZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmFhbmRjdC5jCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogRmxvYXRpbmcgcG9pbnQgQUFOIERDVAorICogdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCB1cG9uIHRoZSBJSkcgaW50ZWdlciBBQU4gRENUIChzZWUgamZkY3Rmc3QuYykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAwMyBSb21hbiBTaGFwb3NobmlrCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmCisgKiAgICAgRmxvYXRpbmcgcG9pbnQgQUFOIERDVAorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlICJmYWFuZGN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKKworI2RlZmluZSBGTE9BVCBmbG9hdAorCisvL251bWJlcnMgZ2VuZXJhdGVkIGJ5IHNpbXBsZSBjIGNvZGUgKG5vdCBhcyBhY2N1cmF0ZSBhcyB0aGV5IGNvdWxkIGJlKQorLyoKK2ZvcihpPTA7IGk8ODsgaSsrKXsKKyAgICBwcmludGYoIiNkZWZpbmUgQiVkICUxLjIwbGxmXG4iLCBpLCAobG9uZyBkb3VibGUpMS4wLyhjb3NsKGkqYWNvc2woLTEuMCkvKGxvbmcgZG91YmxlKTE2LjApKnNxcnRsKDIpKSk7Cit9CisqLworI2RlZmluZSBCMCAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIEIxIDAuNzIwOTU5ODIyMDA2OTQ3OTEzODMgLy8gKGNvcyhwaSoxLzE2KXNxcnQoMikpXi0xCisjZGVmaW5lIEIyIDAuNzY1MzY2ODY0NzMwMTc5NTQzNTAgLy8gKGNvcyhwaSoyLzE2KXNxcnQoMikpXi0xCisjZGVmaW5lIEIzIDAuODUwNDMwMDk0NzY3MjU2NDQ4NzggLy8gKGNvcyhwaSozLzE2KXNxcnQoMikpXi0xCisjZGVmaW5lIEI0IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAgLy8gKGNvcyhwaSo0LzE2KXNxcnQoMikpXi0xCisjZGVmaW5lIEI1IDEuMjcyNzU4NTgwNTcyODMzOTM4NDIgLy8gKGNvcyhwaSo1LzE2KXNxcnQoMikpXi0xCisjZGVmaW5lIEI2IDEuODQ3NzU5MDY1MDIyNTczNTEyNDIgLy8gKGNvcyhwaSo2LzE2KXNxcnQoMikpXi0xCisjZGVmaW5lIEI3IDMuNjI0NTA5Nzg1NDExNTUxMzcyMTggLy8gKGNvcyhwaSo3LzE2KXNxcnQoMikpXi0xCisKKworI2RlZmluZSBBMSAwLjcwNzEwNjc4MTE4NjU0NzUyNDM4IC8vIGNvcyhwaSo0LzE2KQorI2RlZmluZSBBMiAwLjU0MTE5NjEwMDE0NjE5Njk4NDM1IC8vIGNvcyhwaSo2LzE2KXNxcnQoMikKKyNkZWZpbmUgQTUgMC4zODI2ODM0MzIzNjUwODk3NzE3MCAvLyBjb3MocGkqNi8xNikKKyNkZWZpbmUgQTQgMS4zMDY1NjI5NjQ4NzYzNzY1Mjc3NCAvLyBjb3MocGkqMi8xNilzcXJ0KDIpCisKK3N0YXRpYyBjb25zdCBGTE9BVCBwb3N0c2NhbGVbNjRdPXsKK0IwKkIwLCBCMCpCMSwgQjAqQjIsIEIwKkIzLCBCMCpCNCwgQjAqQjUsIEIwKkI2LCBCMCpCNywKK0IxKkIwLCBCMSpCMSwgQjEqQjIsIEIxKkIzLCBCMSpCNCwgQjEqQjUsIEIxKkI2LCBCMSpCNywKK0IyKkIwLCBCMipCMSwgQjIqQjIsIEIyKkIzLCBCMipCNCwgQjIqQjUsIEIyKkI2LCBCMipCNywKK0IzKkIwLCBCMypCMSwgQjMqQjIsIEIzKkIzLCBCMypCNCwgQjMqQjUsIEIzKkI2LCBCMypCNywKK0I0KkIwLCBCNCpCMSwgQjQqQjIsIEI0KkIzLCBCNCpCNCwgQjQqQjUsIEI0KkI2LCBCNCpCNywKK0I1KkIwLCBCNSpCMSwgQjUqQjIsIEI1KkIzLCBCNSpCNCwgQjUqQjUsIEI1KkI2LCBCNSpCNywKK0I2KkIwLCBCNipCMSwgQjYqQjIsIEI2KkIzLCBCNipCNCwgQjYqQjUsIEI2KkI2LCBCNipCNywKK0I3KkIwLCBCNypCMSwgQjcqQjIsIEI3KkIzLCBCNypCNCwgQjcqQjUsIEI3KkI2LCBCNypCNywKK307CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcm93X2ZkY3QoRkxPQVQgdGVtcFs2NF0sIGludDE2X3QgKmRhdGEpCit7CisgICAgRkxPQVQgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICBGTE9BVCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgICBGTE9BVCB6MiwgejQsIHoxMSwgejEzOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGk8OCo4OyBpKz04KSB7CisgICAgICAgIHRtcDA9IGRhdGFbMCArIGldICsgZGF0YVs3ICsgaV07CisgICAgICAgIHRtcDc9IGRhdGFbMCArIGldIC0gZGF0YVs3ICsgaV07CisgICAgICAgIHRtcDE9IGRhdGFbMSArIGldICsgZGF0YVs2ICsgaV07CisgICAgICAgIHRtcDY9IGRhdGFbMSArIGldIC0gZGF0YVs2ICsgaV07CisgICAgICAgIHRtcDI9IGRhdGFbMiArIGldICsgZGF0YVs1ICsgaV07CisgICAgICAgIHRtcDU9IGRhdGFbMiArIGldIC0gZGF0YVs1ICsgaV07CisgICAgICAgIHRtcDM9IGRhdGFbMyArIGldICsgZGF0YVs0ICsgaV07CisgICAgICAgIHRtcDQ9IGRhdGFbMyArIGldIC0gZGF0YVs0ICsgaV07CisKKyAgICAgICAgdG1wMTA9IHRtcDAgKyB0bXAzOworICAgICAgICB0bXAxMz0gdG1wMCAtIHRtcDM7CisgICAgICAgIHRtcDExPSB0bXAxICsgdG1wMjsKKyAgICAgICAgdG1wMTI9IHRtcDEgLSB0bXAyOworCisgICAgICAgIHRlbXBbMCArIGldPSB0bXAxMCArIHRtcDExOworICAgICAgICB0ZW1wWzQgKyBpXT0gdG1wMTAgLSB0bXAxMTsKKworICAgICAgICB0bXAxMiArPSB0bXAxMzsKKyAgICAgICAgdG1wMTIgKj0gQTE7CisgICAgICAgIHRlbXBbMiArIGldPSB0bXAxMyArIHRtcDEyOworICAgICAgICB0ZW1wWzYgKyBpXT0gdG1wMTMgLSB0bXAxMjsKKworICAgICAgICB0bXA0ICs9IHRtcDU7CisgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgdG1wNiArPSB0bXA3OworCisjaWYgMAorICAgICAgICB7CisgICAgICAgICAgICBGTE9BVCB6NTsKKyAgICAgICAgICAgIHo1ID0gKHRtcDQgLSB0bXA2KSAqIEE1OworICAgICAgICAgICAgejIgPSAgdG1wNCAgICAgICAgICogQTIgKyB6NTsKKyAgICAgICAgICAgIHo0ID0gIHRtcDYgICAgICAgICAqIEE0ICsgejU7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHoyPSB0bXA0KihBMitBNSkgLSB0bXA2KkE1OworICAgICAgICB6ND0gdG1wNiooQTQtQTUpICsgdG1wNCpBNTsKKyNlbmRpZgorICAgICAgICB0bXA1Kj1BMTsKKworICAgICAgICB6MTE9IHRtcDcgKyB0bXA1OworICAgICAgICB6MTM9IHRtcDcgLSB0bXA1OworCisgICAgICAgIHRlbXBbNSArIGldPSB6MTMgKyB6MjsKKyAgICAgICAgdGVtcFszICsgaV09IHoxMyAtIHoyOworICAgICAgICB0ZW1wWzEgKyBpXT0gejExICsgejQ7CisgICAgICAgIHRlbXBbNyArIGldPSB6MTEgLSB6NDsKKyAgICB9Cit9CisKK3ZvaWQgZmZfZmFhbmRjdChpbnQxNl90ICpkYXRhKQoreworICAgIEZMT0FUIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgRkxPQVQgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgICAgRkxPQVQgejIsIHo0LCB6MTEsIHoxMzsKKyAgICBGTE9BVCB0ZW1wWzY0XTsKKyAgICBpbnQgaTsKKworICAgIGVtbXNfYygpOworCisgICAgcm93X2ZkY3QodGVtcCwgZGF0YSk7CisKKyAgICBmb3IgKGk9MDsgaTw4OyBpKyspIHsKKyAgICAgICAgdG1wMD0gdGVtcFs4KjAgKyBpXSArIHRlbXBbOCo3ICsgaV07CisgICAgICAgIHRtcDc9IHRlbXBbOCowICsgaV0gLSB0ZW1wWzgqNyArIGldOworICAgICAgICB0bXAxPSB0ZW1wWzgqMSArIGldICsgdGVtcFs4KjYgKyBpXTsKKyAgICAgICAgdG1wNj0gdGVtcFs4KjEgKyBpXSAtIHRlbXBbOCo2ICsgaV07CisgICAgICAgIHRtcDI9IHRlbXBbOCoyICsgaV0gKyB0ZW1wWzgqNSArIGldOworICAgICAgICB0bXA1PSB0ZW1wWzgqMiArIGldIC0gdGVtcFs4KjUgKyBpXTsKKyAgICAgICAgdG1wMz0gdGVtcFs4KjMgKyBpXSArIHRlbXBbOCo0ICsgaV07CisgICAgICAgIHRtcDQ9IHRlbXBbOCozICsgaV0gLSB0ZW1wWzgqNCArIGldOworCisgICAgICAgIHRtcDEwPSB0bXAwICsgdG1wMzsKKyAgICAgICAgdG1wMTM9IHRtcDAgLSB0bXAzOworICAgICAgICB0bXAxMT0gdG1wMSArIHRtcDI7CisgICAgICAgIHRtcDEyPSB0bXAxIC0gdG1wMjsKKworICAgICAgICBkYXRhWzgqMCArIGldPSBscmludGYocG9zdHNjYWxlWzgqMCArIGldICogKHRtcDEwICsgdG1wMTEpKTsKKyAgICAgICAgZGF0YVs4KjQgKyBpXT0gbHJpbnRmKHBvc3RzY2FsZVs4KjQgKyBpXSAqICh0bXAxMCAtIHRtcDExKSk7CisKKyAgICAgICAgdG1wMTIgKz0gdG1wMTM7CisgICAgICAgIHRtcDEyICo9IEExOworICAgICAgICBkYXRhWzgqMiArIGldPSBscmludGYocG9zdHNjYWxlWzgqMiArIGldICogKHRtcDEzICsgdG1wMTIpKTsKKyAgICAgICAgZGF0YVs4KjYgKyBpXT0gbHJpbnRmKHBvc3RzY2FsZVs4KjYgKyBpXSAqICh0bXAxMyAtIHRtcDEyKSk7CisKKyAgICAgICAgdG1wNCArPSB0bXA1OworICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgIHRtcDYgKz0gdG1wNzsKKworI2lmIDAKKyAgICAgICAgeworICAgICAgICAgICAgRkxPQVQgejU7CisgICAgICAgICAgICB6NSA9ICh0bXA0IC0gdG1wNikgKiBBNTsKKyAgICAgICAgICAgIHoyID0gIHRtcDQgICAgICAgICAqIEEyICsgejU7CisgICAgICAgICAgICB6NCA9ICB0bXA2ICAgICAgICAgKiBBNCArIHo1OworICAgICAgICB9CisjZWxzZQorICAgICAgICB6Mj0gdG1wNCooQTIrQTUpIC0gdG1wNipBNTsKKyAgICAgICAgejQ9IHRtcDYqKEE0LUE1KSArIHRtcDQqQTU7CisjZW5kaWYKKyAgICAgICAgdG1wNSo9QTE7CisKKyAgICAgICAgejExPSB0bXA3ICsgdG1wNTsKKyAgICAgICAgejEzPSB0bXA3IC0gdG1wNTsKKworICAgICAgICBkYXRhWzgqNSArIGldPSBscmludGYocG9zdHNjYWxlWzgqNSArIGldICogKHoxMyArIHoyKSk7CisgICAgICAgIGRhdGFbOCozICsgaV09IGxyaW50Zihwb3N0c2NhbGVbOCozICsgaV0gKiAoejEzIC0gejIpKTsKKyAgICAgICAgZGF0YVs4KjEgKyBpXT0gbHJpbnRmKHBvc3RzY2FsZVs4KjEgKyBpXSAqICh6MTEgKyB6NCkpOworICAgICAgICBkYXRhWzgqNyArIGldPSBscmludGYocG9zdHNjYWxlWzgqNyArIGldICogKHoxMSAtIHo0KSk7CisgICAgfQorfQorCit2b2lkIGZmX2ZhYW5kY3QyNDgoaW50MTZfdCAqZGF0YSkKK3sKKyAgICBGTE9BVCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIEZMT0FUIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICAgIEZMT0FUIHRlbXBbNjRdOworICAgIGludCBpOworCisgICAgZW1tc19jKCk7CisKKyAgICByb3dfZmRjdCh0ZW1wLCBkYXRhKTsKKworICAgIGZvciAoaT0wOyBpPDg7IGkrKykgeworICAgICAgICB0bXAwID0gdGVtcFs4KjAgKyBpXSArIHRlbXBbOCoxICsgaV07CisgICAgICAgIHRtcDEgPSB0ZW1wWzgqMiArIGldICsgdGVtcFs4KjMgKyBpXTsKKyAgICAgICAgdG1wMiA9IHRlbXBbOCo0ICsgaV0gKyB0ZW1wWzgqNSArIGldOworICAgICAgICB0bXAzID0gdGVtcFs4KjYgKyBpXSArIHRlbXBbOCo3ICsgaV07CisgICAgICAgIHRtcDQgPSB0ZW1wWzgqMCArIGldIC0gdGVtcFs4KjEgKyBpXTsKKyAgICAgICAgdG1wNSA9IHRlbXBbOCoyICsgaV0gLSB0ZW1wWzgqMyArIGldOworICAgICAgICB0bXA2ID0gdGVtcFs4KjQgKyBpXSAtIHRlbXBbOCo1ICsgaV07CisgICAgICAgIHRtcDcgPSB0ZW1wWzgqNiArIGldIC0gdGVtcFs4KjcgKyBpXTsKKworICAgICAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgICAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgICAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgICAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworCisgICAgICAgIGRhdGFbOCowICsgaV0gPSBscmludGYocG9zdHNjYWxlWzgqMCArIGldICogKHRtcDEwICsgdG1wMTEpKTsKKyAgICAgICAgZGF0YVs4KjQgKyBpXSA9IGxyaW50Zihwb3N0c2NhbGVbOCo0ICsgaV0gKiAodG1wMTAgLSB0bXAxMSkpOworCisgICAgICAgIHRtcDEyICs9IHRtcDEzOworICAgICAgICB0bXAxMiAqPSBBMTsKKyAgICAgICAgZGF0YVs4KjIgKyBpXSA9IGxyaW50Zihwb3N0c2NhbGVbOCoyICsgaV0gKiAodG1wMTMgKyB0bXAxMikpOworICAgICAgICBkYXRhWzgqNiArIGldID0gbHJpbnRmKHBvc3RzY2FsZVs4KjYgKyBpXSAqICh0bXAxMyAtIHRtcDEyKSk7CisKKyAgICAgICAgdG1wMTAgPSB0bXA0ICsgdG1wNzsKKyAgICAgICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKKyAgICAgICAgdG1wMTIgPSB0bXA1IC0gdG1wNjsKKyAgICAgICAgdG1wMTMgPSB0bXA0IC0gdG1wNzsKKworICAgICAgICBkYXRhWzgqMSArIGldID0gbHJpbnRmKHBvc3RzY2FsZVs4KjAgKyBpXSAqICh0bXAxMCArIHRtcDExKSk7CisgICAgICAgIGRhdGFbOCo1ICsgaV0gPSBscmludGYocG9zdHNjYWxlWzgqNCArIGldICogKHRtcDEwIC0gdG1wMTEpKTsKKworICAgICAgICB0bXAxMiArPSB0bXAxMzsKKyAgICAgICAgdG1wMTIgKj0gQTE7CisgICAgICAgIGRhdGFbOCozICsgaV0gPSBscmludGYocG9zdHNjYWxlWzgqMiArIGldICogKHRtcDEzICsgdG1wMTIpKTsKKyAgICAgICAgZGF0YVs4KjcgKyBpXSA9IGxyaW50Zihwb3N0c2NhbGVbOCo2ICsgaV0gKiAodG1wMTMgLSB0bXAxMikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZhYW5kY3QuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZhYW5kY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWVmOTZkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmFhbmRjdC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBGbG9hdGluZyBwb2ludCBBQU4gRENUCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmCisgKiAgICAgRmxvYXRpbmcgcG9pbnQgQUFOIERDVAorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19GQUFORENUX0gKKyNkZWZpbmUgQVZDT0RFQ19GQUFORENUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIGZmX2ZhYW5kY3QoaW50MTZfdCAqZGF0YSk7Cit2b2lkIGZmX2ZhYW5kY3QyNDgoaW50MTZfdCAqZGF0YSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0ZBQU5EQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmFhbmlkY3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZhYW5pZGN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4MmY3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZhYW5pZGN0LmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBGbG9hdGluZyBwb2ludCBBQU4gSURDVAorICogQ29weXJpZ2h0IChjKSAyMDA4IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSAiZmFhbmlkY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKy8qIFRvIGFsbG93IHN3aXRjaGluZyB0byBkb3VibGUuICovCisjZGVmaW5lIEZMT0FUIGZsb2F0CisKKyNkZWZpbmUgQjAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIEIxIDEuMzg3MDM5ODQ1MzIyMTQ3NDYxODIxNiAvLyBjb3MocGkqMS8xNilzcXJ0KDIpCisjZGVmaW5lIEIyIDEuMzA2NTYyOTY0ODc2Mzc2NTI3ODU2NiAvLyBjb3MocGkqMi8xNilzcXJ0KDIpCisjZGVmaW5lIEIzIDEuMTc1ODc1NjAyNDE5MzU4NzE2OTc0NSAvLyBjb3MocGkqMy8xNilzcXJ0KDIpCisjZGVmaW5lIEI0IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAvLyBjb3MocGkqNC8xNilzcXJ0KDIpCisjZGVmaW5lIEI1IDAuNzg1Njk0OTU4Mzg3MTAyMTgxMjc3OSAvLyBjb3MocGkqNS8xNilzcXJ0KDIpCisjZGVmaW5lIEI2IDAuNTQxMTk2MTAwMTQ2MTk2OTg0Mzk5NyAvLyBjb3MocGkqNi8xNilzcXJ0KDIpCisjZGVmaW5lIEI3IDAuMjc1ODk5Mzc5MjgyOTQzMDEyMzM2MCAvLyBjb3MocGkqNy8xNilzcXJ0KDIpCisKKyNkZWZpbmUgQTQgMC43MDcxMDY3ODExODY1NDc1MjQzOCAvLyBjb3MocGkqNC8xNikKKyNkZWZpbmUgQTIgMC45MjM4Nzk1MzI1MTEyODY3NTYxMyAvLyBjb3MocGkqMi8xNikKKworc3RhdGljIGNvbnN0IEZMT0FUIHByZXNjYWxlWzY0XT17CitCMCpCMC84LCBCMCpCMS84LCBCMCpCMi84LCBCMCpCMy84LCBCMCpCNC84LCBCMCpCNS84LCBCMCpCNi84LCBCMCpCNy84LAorQjEqQjAvOCwgQjEqQjEvOCwgQjEqQjIvOCwgQjEqQjMvOCwgQjEqQjQvOCwgQjEqQjUvOCwgQjEqQjYvOCwgQjEqQjcvOCwKK0IyKkIwLzgsIEIyKkIxLzgsIEIyKkIyLzgsIEIyKkIzLzgsIEIyKkI0LzgsIEIyKkI1LzgsIEIyKkI2LzgsIEIyKkI3LzgsCitCMypCMC84LCBCMypCMS84LCBCMypCMi84LCBCMypCMy84LCBCMypCNC84LCBCMypCNS84LCBCMypCNi84LCBCMypCNy84LAorQjQqQjAvOCwgQjQqQjEvOCwgQjQqQjIvOCwgQjQqQjMvOCwgQjQqQjQvOCwgQjQqQjUvOCwgQjQqQjYvOCwgQjQqQjcvOCwKK0I1KkIwLzgsIEI1KkIxLzgsIEI1KkIyLzgsIEI1KkIzLzgsIEI1KkI0LzgsIEI1KkI1LzgsIEI1KkI2LzgsIEI1KkI3LzgsCitCNipCMC84LCBCNipCMS84LCBCNipCMi84LCBCNipCMy84LCBCNipCNC84LCBCNipCNS84LCBCNipCNi84LCBCNipCNy84LAorQjcqQjAvOCwgQjcqQjEvOCwgQjcqQjIvOCwgQjcqQjMvOCwgQjcqQjQvOCwgQjcqQjUvOCwgQjcqQjYvOCwgQjcqQjcvOCwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwOGlkY3QoaW50MTZfdCBkYXRhWzY0XSwgRkxPQVQgdGVtcFs2NF0sIHVpbnQ4X3QgKmRlc3QsIGludCBzdHJpZGUsIGludCB4LCBpbnQgeSwgaW50IHR5cGUpeworICAgIGludCBpOworICAgIEZMT0FUIHMwNCwgZDA0LCBzMTcsIGQxNywgczI2LCBkMjYsIHM1MywgZDUzOworICAgIEZMT0FUIG9zMDcsIG9zMTYsIG9zMjUsIG9zMzQ7CisgICAgRkxPQVQgb2QwNywgb2QxNiwgb2QyNSwgb2QzNDsKKworICAgIGZvcihpPTA7IGk8eSo4OyBpKz15KXsKKyAgICAgICAgczE3PSB0ZW1wWzEqeCArIGldICsgdGVtcFs3KnggKyBpXTsKKyAgICAgICAgZDE3PSB0ZW1wWzEqeCArIGldIC0gdGVtcFs3KnggKyBpXTsKKyAgICAgICAgczUzPSB0ZW1wWzUqeCArIGldICsgdGVtcFszKnggKyBpXTsKKyAgICAgICAgZDUzPSB0ZW1wWzUqeCArIGldIC0gdGVtcFszKnggKyBpXTsKKworICAgICAgICBvZDA3PSAgczE3ICsgczUzOworICAgICAgICBvZDI1PSAoczE3IC0gczUzKSooMipBNCk7CisKKyNpZiAwIC8vdGhlc2UgMiBhcmUgZXF1aXZhbGVudAorICAgICAgICB7CisgICAgICAgICAgICBGTE9BVCB0bXAwOworICAgICAgICAgICAgdG1wMCA9IChkMTcgKyBkNTMpICogICgyICogQTIpOworICAgICAgICAgICAgb2QzNCA9ICBkMTcgICAgICAgICogICgyICogQjYpIC0gdG1wMDsKKyAgICAgICAgICAgIG9kMTYgPSAgZDUzICAgICAgICAqICgtMiAqIEIyKSArIHRtcDA7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIG9kMzQ9ICBkMTcqKDIqKEI2LUEyKSkgLSBkNTMqKDIqQTIpOworICAgICAgICBvZDE2PSAgZDUzKigyKihBMi1CMikpICsgZDE3KigyKkEyKTsKKyNlbmRpZgorCisgICAgICAgIG9kMTYgLT0gb2QwNzsKKyAgICAgICAgb2QyNSAtPSBvZDE2OworICAgICAgICBvZDM0ICs9IG9kMjU7CisKKyAgICAgICAgczI2ID0gdGVtcFsyKnggKyBpXSArIHRlbXBbNip4ICsgaV07CisgICAgICAgIGQyNiA9IHRlbXBbMip4ICsgaV0gLSB0ZW1wWzYqeCArIGldOworICAgICAgICBkMjYqPSAyKkE0OworICAgICAgICBkMjYtPSBzMjY7CisKKyAgICAgICAgczA0PSB0ZW1wWzAqeCArIGldICsgdGVtcFs0KnggKyBpXTsKKyAgICAgICAgZDA0PSB0ZW1wWzAqeCArIGldIC0gdGVtcFs0KnggKyBpXTsKKworICAgICAgICBvczA3PSBzMDQgKyBzMjY7CisgICAgICAgIG9zMzQ9IHMwNCAtIHMyNjsKKyAgICAgICAgb3MxNj0gZDA0ICsgZDI2OworICAgICAgICBvczI1PSBkMDQgLSBkMjY7CisKKyAgICAgICAgaWYodHlwZT09MCl7CisgICAgICAgICAgICB0ZW1wWzAqeCArIGldPSBvczA3ICsgb2QwNzsKKyAgICAgICAgICAgIHRlbXBbNyp4ICsgaV09IG9zMDcgLSBvZDA3OworICAgICAgICAgICAgdGVtcFsxKnggKyBpXT0gb3MxNiArIG9kMTY7CisgICAgICAgICAgICB0ZW1wWzYqeCArIGldPSBvczE2IC0gb2QxNjsKKyAgICAgICAgICAgIHRlbXBbMip4ICsgaV09IG9zMjUgKyBvZDI1OworICAgICAgICAgICAgdGVtcFs1KnggKyBpXT0gb3MyNSAtIG9kMjU7CisgICAgICAgICAgICB0ZW1wWzMqeCArIGldPSBvczM0IC0gb2QzNDsKKyAgICAgICAgICAgIHRlbXBbNCp4ICsgaV09IG9zMzQgKyBvZDM0OworICAgICAgICB9ZWxzZSBpZih0eXBlPT0xKXsKKyAgICAgICAgICAgIGRhdGFbMCp4ICsgaV09IGxyaW50ZihvczA3ICsgb2QwNyk7CisgICAgICAgICAgICBkYXRhWzcqeCArIGldPSBscmludGYob3MwNyAtIG9kMDcpOworICAgICAgICAgICAgZGF0YVsxKnggKyBpXT0gbHJpbnRmKG9zMTYgKyBvZDE2KTsKKyAgICAgICAgICAgIGRhdGFbNip4ICsgaV09IGxyaW50ZihvczE2IC0gb2QxNik7CisgICAgICAgICAgICBkYXRhWzIqeCArIGldPSBscmludGYob3MyNSArIG9kMjUpOworICAgICAgICAgICAgZGF0YVs1KnggKyBpXT0gbHJpbnRmKG9zMjUgLSBvZDI1KTsKKyAgICAgICAgICAgIGRhdGFbMyp4ICsgaV09IGxyaW50ZihvczM0IC0gb2QzNCk7CisgICAgICAgICAgICBkYXRhWzQqeCArIGldPSBscmludGYob3MzNCArIG9kMzQpOworICAgICAgICB9ZWxzZSBpZih0eXBlPT0yKXsKKyAgICAgICAgICAgIGRlc3RbMCpzdHJpZGUgKyBpXT0gYXZfY2xpcF91aW50OCgoKGludClkZXN0WzAqc3RyaWRlICsgaV0pICsgbHJpbnRmKG9zMDcgKyBvZDA3KSk7CisgICAgICAgICAgICBkZXN0Wzcqc3RyaWRlICsgaV09IGF2X2NsaXBfdWludDgoKChpbnQpZGVzdFs3KnN0cmlkZSArIGldKSArIGxyaW50ZihvczA3IC0gb2QwNykpOworICAgICAgICAgICAgZGVzdFsxKnN0cmlkZSArIGldPSBhdl9jbGlwX3VpbnQ4KCgoaW50KWRlc3RbMSpzdHJpZGUgKyBpXSkgKyBscmludGYob3MxNiArIG9kMTYpKTsKKyAgICAgICAgICAgIGRlc3RbNipzdHJpZGUgKyBpXT0gYXZfY2xpcF91aW50OCgoKGludClkZXN0WzYqc3RyaWRlICsgaV0pICsgbHJpbnRmKG9zMTYgLSBvZDE2KSk7CisgICAgICAgICAgICBkZXN0WzIqc3RyaWRlICsgaV09IGF2X2NsaXBfdWludDgoKChpbnQpZGVzdFsyKnN0cmlkZSArIGldKSArIGxyaW50ZihvczI1ICsgb2QyNSkpOworICAgICAgICAgICAgZGVzdFs1KnN0cmlkZSArIGldPSBhdl9jbGlwX3VpbnQ4KCgoaW50KWRlc3RbNSpzdHJpZGUgKyBpXSkgKyBscmludGYob3MyNSAtIG9kMjUpKTsKKyAgICAgICAgICAgIGRlc3RbMypzdHJpZGUgKyBpXT0gYXZfY2xpcF91aW50OCgoKGludClkZXN0WzMqc3RyaWRlICsgaV0pICsgbHJpbnRmKG9zMzQgLSBvZDM0KSk7CisgICAgICAgICAgICBkZXN0WzQqc3RyaWRlICsgaV09IGF2X2NsaXBfdWludDgoKChpbnQpZGVzdFs0KnN0cmlkZSArIGldKSArIGxyaW50ZihvczM0ICsgb2QzNCkpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGRlc3RbMCpzdHJpZGUgKyBpXT0gYXZfY2xpcF91aW50OChscmludGYob3MwNyArIG9kMDcpKTsKKyAgICAgICAgICAgIGRlc3RbNypzdHJpZGUgKyBpXT0gYXZfY2xpcF91aW50OChscmludGYob3MwNyAtIG9kMDcpKTsKKyAgICAgICAgICAgIGRlc3RbMSpzdHJpZGUgKyBpXT0gYXZfY2xpcF91aW50OChscmludGYob3MxNiArIG9kMTYpKTsKKyAgICAgICAgICAgIGRlc3RbNipzdHJpZGUgKyBpXT0gYXZfY2xpcF91aW50OChscmludGYob3MxNiAtIG9kMTYpKTsKKyAgICAgICAgICAgIGRlc3RbMipzdHJpZGUgKyBpXT0gYXZfY2xpcF91aW50OChscmludGYob3MyNSArIG9kMjUpKTsKKyAgICAgICAgICAgIGRlc3RbNSpzdHJpZGUgKyBpXT0gYXZfY2xpcF91aW50OChscmludGYob3MyNSAtIG9kMjUpKTsKKyAgICAgICAgICAgIGRlc3RbMypzdHJpZGUgKyBpXT0gYXZfY2xpcF91aW50OChscmludGYob3MzNCAtIG9kMzQpKTsKKyAgICAgICAgICAgIGRlc3RbNCpzdHJpZGUgKyBpXT0gYXZfY2xpcF91aW50OChscmludGYob3MzNCArIG9kMzQpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl9mYWFuaWRjdChpbnQxNl90IGJsb2NrWzY0XSl7CisgICAgRkxPQVQgdGVtcFs2NF07CisgICAgaW50IGk7CisKKyAgICBlbW1zX2MoKTsKKworICAgIGZvcihpPTA7IGk8NjQ7IGkrKykKKyAgICAgICAgdGVtcFtpXSA9IGJsb2NrW2ldICogcHJlc2NhbGVbaV07CisKKyAgICBwOGlkY3QoYmxvY2ssIHRlbXAsIE5VTEwsIDAsIDEsIDgsIDApOworICAgIHA4aWRjdChibG9jaywgdGVtcCwgTlVMTCwgMCwgOCwgMSwgMSk7Cit9CisKK3ZvaWQgZmZfZmFhbmlkY3RfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgYmxvY2tbNjRdKXsKKyAgICBGTE9BVCB0ZW1wWzY0XTsKKyAgICBpbnQgaTsKKworICAgIGVtbXNfYygpOworCisgICAgZm9yKGk9MDsgaTw2NDsgaSsrKQorICAgICAgICB0ZW1wW2ldID0gYmxvY2tbaV0gKiBwcmVzY2FsZVtpXTsKKworICAgIHA4aWRjdChibG9jaywgdGVtcCwgTlVMTCwgICAgICAgICAwLCAxLCA4LCAwKTsKKyAgICBwOGlkY3QoTlVMTCAsIHRlbXAsIGRlc3QsIGxpbmVfc2l6ZSwgOCwgMSwgMik7Cit9CisKK3ZvaWQgZmZfZmFhbmlkY3RfcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgYmxvY2tbNjRdKXsKKyAgICBGTE9BVCB0ZW1wWzY0XTsKKyAgICBpbnQgaTsKKworICAgIGVtbXNfYygpOworCisgICAgZm9yKGk9MDsgaTw2NDsgaSsrKQorICAgICAgICB0ZW1wW2ldID0gYmxvY2tbaV0gKiBwcmVzY2FsZVtpXTsKKworICAgIHA4aWRjdChibG9jaywgdGVtcCwgTlVMTCwgICAgICAgICAwLCAxLCA4LCAwKTsKKyAgICBwOGlkY3QoTlVMTCAsIHRlbXAsIGRlc3QsIGxpbmVfc2l6ZSwgOCwgMSwgMyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mYWFuaWRjdC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmFhbmlkY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2QyYzc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmFhbmlkY3QuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogRmxvYXRpbmcgcG9pbnQgQUFOIElEQ1QKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRkFBTklEQ1RfSAorI2RlZmluZSBBVkNPREVDX0ZBQU5JRENUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIGZmX2ZhYW5pZGN0KGludDE2X3QgYmxvY2tbNjRdKTsKK3ZvaWQgZmZfZmFhbmlkY3RfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgYmxvY2tbNjRdKTsKK3ZvaWQgZmZfZmFhbmlkY3RfcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgYmxvY2tbNjRdKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfRkFBTklEQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmF4Y29tcHIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZheGNvbXByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1Zjc4ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZheGNvbXByLmMKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBDQ0lUVCBGYXggR3JvdXAgMyBhbmQgNCBkZWNvbXByZXNzaW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDQ0lUVCBGYXggR3JvdXAgMyBhbmQgNCBkZWNvbXByZXNzaW9uCisgKiBAYXV0aG9yIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqLworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAiZmF4Y29tcHIuaCIKKworI2RlZmluZSBDQ0lUVF9TWU1TIDEwNAorCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2NpdHRfc3ltc1tDQ0lUVF9TWU1TXSA9IHsKKyAgICAwLCAgICAxLCAgICAyLCAgICAzLCAgICA0LCAgICA1LCAgICA2LCAgICA3LCAgICA4LCAgICA5LCAgIDEwLCAgIDExLCAgIDEyLAorICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgsICAgMTksICAgMjAsICAgMjEsICAgMjIsICAgMjMsICAgMjQsICAgMjUsCisgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAzMiwgICAzMywgICAzNCwgICAzNSwgICAzNiwgICAzNywgICAzOCwKKyAgIDM5LCAgIDQwLCAgIDQxLCAgIDQyLCAgIDQzLCAgIDQ0LCAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDUwLCAgIDUxLAorICAgNTIsICAgNTMsICAgNTQsICAgNTUsICAgNTYsICAgNTcsICAgNTgsICAgNTksICAgNjAsICAgNjEsICAgNjIsICAgNjMsICAgNjQsCisgIDEyOCwgIDE5MiwgIDI1NiwgIDMyMCwgIDM4NCwgIDQ0OCwgIDUxMiwgIDU3NiwgIDY0MCwgIDcwNCwgIDc2OCwgIDgzMiwgIDg5NiwKKyAgOTYwLCAxMDI0LCAxMDg4LCAxMTUyLCAxMjE2LCAxMjgwLCAxMzQ0LCAxNDA4LCAxNDcyLCAxNTM2LCAxNjAwLCAxNjY0LCAxNzI4LAorIDE3OTIsIDE4NTYsIDE5MjAsIDE5ODQsIDIwNDgsIDIxMTIsIDIxNzYsIDIyNDAsIDIzMDQsIDIzNjgsIDI0MzIsIDI0OTYsIDI1NjAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNjaXR0X2NvZGVzX2JpdHNbMl1bQ0NJVFRfU1lNU10gPQoreworICB7CisgICAgMHgzNSwgMHgwNywgMHgwNywgMHgwOCwgMHgwQiwgMHgwQywgMHgwRSwgMHgwRiwgMHgxMywgMHgxNCwgMHgwNywgMHgwOCwgMHgwOCwKKyAgICAweDAzLCAweDM0LCAweDM1LCAweDJBLCAweDJCLCAweDI3LCAweDBDLCAweDA4LCAweDE3LCAweDAzLCAweDA0LCAweDI4LCAweDJCLAorICAgIDB4MTMsIDB4MjQsIDB4MTgsIDB4MDIsIDB4MDMsIDB4MUEsIDB4MUIsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsCisgICAgMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwgMHgyQywgMHgyRCwgMHgwNCwgMHgwNSwgMHgwQSwgMHgwQiwgMHg1MiwgMHg1MywgMHg1NCwKKyAgICAweDU1LCAweDI0LCAweDI1LCAweDU4LCAweDU5LCAweDVBLCAweDVCLCAweDRBLCAweDRCLCAweDMyLCAweDMzLCAweDM0LCAweDFCLAorICAgIDB4MTIsIDB4MTcsIDB4MzcsIDB4MzYsIDB4MzcsIDB4NjQsIDB4NjUsIDB4NjgsIDB4NjcsIDB4Q0MsIDB4Q0QsIDB4RDIsIDB4RDMsCisgICAgMHhENCwgMHhENSwgMHhENiwgMHhENywgMHhEOCwgMHhEOSwgMHhEQSwgMHhEQiwgMHg5OCwgMHg5OSwgMHg5QSwgMHgxOCwgMHg5QiwKKyAgICAweDA4LCAweDBDLCAweDBELCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDFDLCAweDFELCAweDFFLCAweDFGCisgIH0sCisgIHsKKyAgICAweDM3LCAweDAyLCAweDAzLCAweDAyLCAweDAzLCAweDAzLCAweDAyLCAweDAzLCAweDA1LCAweDA0LCAweDA0LCAweDA1LCAweDA3LAorICAgIDB4MDQsIDB4MDcsIDB4MTgsIDB4MTcsIDB4MTgsIDB4MDgsIDB4NjcsIDB4NjgsIDB4NkMsIDB4MzcsIDB4MjgsIDB4MTcsIDB4MTgsCisgICAgMHhDQSwgMHhDQiwgMHhDQywgMHhDRCwgMHg2OCwgMHg2OSwgMHg2QSwgMHg2QiwgMHhEMiwgMHhEMywgMHhENCwgMHhENSwgMHhENiwKKyAgICAweEQ3LCAweDZDLCAweDZELCAweERBLCAweERCLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDY0LCAweDY1LCAweDUyLCAweDUzLAorICAgIDB4MjQsIDB4MzcsIDB4MzgsIDB4MjcsIDB4MjgsIDB4NTgsIDB4NTksIDB4MkIsIDB4MkMsIDB4NUEsIDB4NjYsIDB4NjcsIDB4MEYsCisgICAgMHhDOCwgMHhDOSwgMHg1QiwgMHgzMywgMHgzNCwgMHgzNSwgMHg2QywgMHg2RCwgMHg0QSwgMHg0QiwgMHg0QywgMHg0RCwgMHg3MiwKKyAgICAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDVBLCAweDVCLCAweDY0LCAweDY1LAorICAgIDB4MDgsIDB4MEMsIDB4MEQsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYKKyAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2NpdHRfY29kZXNfbGVuc1syXVtDQ0lUVF9TWU1TXSA9Cit7CisgIHsKKyAgICAgOCwgIDYsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsCisgICAgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDUsICA1LCAgNiwgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDYsICA5LCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyCisgIH0sCisgIHsKKyAgICAxMCwgIDMsICAyLCAgMiwgIDMsICA0LCAgNCwgIDUsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LCAgOSwgMTAsIDEwLCAxMCwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTAsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyCisgIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNjaXR0X2dyb3VwM18yZF9iaXRzWzExXSA9IHsKKyAgICAxLCAxLCAyLCAyLCAyLCAxLCAzLCAzLCAzLCAxLCAxCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjY2l0dF9ncm91cDNfMmRfbGVuc1sxMV0gPSB7CisgICAgNCwgMywgNywgNiwgMywgMSwgMywgNiwgNywgNywgOQorfTsKKworc3RhdGljIFZMQyBjY2l0dF92bGNbMl0sIGNjaXR0X2dyb3VwM18yZF92bGM7CisKK2F2X2NvbGQgdm9pZCBmZl9jY2l0dF91bnBhY2tfaW5pdCh2b2lkKQoreworICAgIHN0YXRpYyBWTENfVFlQRSBjb2RlX3RhYmxlMVs1MjhdWzJdOworICAgIHN0YXRpYyBWTENfVFlQRSBjb2RlX3RhYmxlMls2NDhdWzJdOworICAgIGludCBpOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCisgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisgICAgY2NpdHRfdmxjWzBdLnRhYmxlID0gY29kZV90YWJsZTE7CisgICAgY2NpdHRfdmxjWzBdLnRhYmxlX2FsbG9jYXRlZCA9IDUyODsKKyAgICBjY2l0dF92bGNbMV0udGFibGUgPSBjb2RlX3RhYmxlMjsKKyAgICBjY2l0dF92bGNbMV0udGFibGVfYWxsb2NhdGVkID0gNjQ4OworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgZmZfaW5pdF92bGNfc3BhcnNlKCZjY2l0dF92bGNbaV0sIDksIENDSVRUX1NZTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2l0dF9jb2Rlc19sZW5zW2ldLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpdHRfY29kZXNfYml0c1tpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaXR0X3N5bXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgfQorICAgIElOSVRfVkxDX1NUQVRJQygmY2NpdHRfZ3JvdXAzXzJkX3ZsYywgOSwgMTEsCisgICAgICAgICAgICAgICAgICAgIGNjaXR0X2dyb3VwM18yZF9sZW5zLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICBjY2l0dF9ncm91cDNfMmRfYml0cywgMSwgMSwgNTEyKTsKKyAgICBpbml0aWFsaXplZCA9IDE7Cit9CisKKworc3RhdGljIGludCBkZWNvZGVfZ3JvdXAzXzFkX2xpbmUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaXhfbGVmdCwgaW50ICpydW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpydW5lbmQpCit7CisgICAgaW50IG1vZGUgICAgICAgICA9IDA7CisgICAgdW5zaWduZWQgaW50IHJ1biA9IDA7CisgICAgdW5zaWduZWQgaW50IHQ7CisgICAgZm9yICg7OykgeworICAgICAgICB0ICAgID0gZ2V0X3ZsYzIoZ2IsIGNjaXR0X3ZsY1ttb2RlXS50YWJsZSwgOSwgMik7CisgICAgICAgIHJ1biArPSB0OworICAgICAgICBpZiAodCA8IDY0KSB7CisgICAgICAgICAgICAqcnVucysrID0gcnVuOworICAgICAgICAgICAgaWYgKHJ1bnMgPj0gcnVuZW5kKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJSdW4gb3ZlcnJ1blxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGl4X2xlZnQgPD0gcnVuKSB7CisgICAgICAgICAgICAgICAgaWYgKHBpeF9sZWZ0ID09IHJ1bikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJSdW4gd2VudCBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpeF9sZWZ0IC09IHJ1bjsKKyAgICAgICAgICAgIHJ1biAgICAgICA9IDA7CisgICAgICAgICAgICBtb2RlICAgICAgPSAhbW9kZTsKKyAgICAgICAgfSBlbHNlIGlmICgoaW50KXQgPT0gLTEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IGNvZGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisgICAgKnJ1bnMrKyA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2dyb3VwM18yZF9saW5lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIGludCAqcnVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqcnVuZW5kLCBjb25zdCBpbnQgKnJlZikKK3sKKyAgICBpbnQgbW9kZSAgICAgICAgICA9IDAsIHNhdmVkX3J1biA9IDAsIHQ7CisgICAgaW50IHJ1bl9vZmYgICAgICAgPSAqcmVmKys7CisgICAgdW5zaWduZWQgaW50IG9mZnMgPSAwLCBydW4gPSAwOworCisgICAgd2hpbGUgKG9mZnMgPCB3aWR0aCkgeworICAgICAgICBpbnQgY21vZGUgPSBnZXRfdmxjMihnYiwgY2NpdHRfZ3JvdXAzXzJkX3ZsYy50YWJsZSwgOSwgMSk7CisgICAgICAgIGlmIChjbW9kZSA9PSAtMSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgbW9kZSBWTENcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjbW9kZSkgeyAvL3Bhc3MgbW9kZQorICAgICAgICAgICAgaWYgKHJ1bl9vZmYgPCB3aWR0aCkKKyAgICAgICAgICAgICAgICBydW5fb2ZmICs9ICpyZWYrKzsKKyAgICAgICAgICAgIHJ1biAgICAgID0gcnVuX29mZiAtIG9mZnM7CisgICAgICAgICAgICBvZmZzICAgICA9IHJ1bl9vZmY7CisgICAgICAgICAgICBpZiAocnVuX29mZiA8IHdpZHRoKQorICAgICAgICAgICAgICAgIHJ1bl9vZmYgKz0gKnJlZisrOworICAgICAgICAgICAgaWYgKG9mZnMgPiB3aWR0aCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUnVuIHdlbnQgb3V0IG9mIGJvdW5kc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYXZlZF9ydW4gKz0gcnVuOworICAgICAgICB9IGVsc2UgaWYgKGNtb2RlID09IDEpIHsgLy9ob3Jpem9udGFsIG1vZGUKKyAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworICAgICAgICAgICAgICAgIHJ1biA9IDA7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICB0ID0gZ2V0X3ZsYzIoZ2IsIGNjaXR0X3ZsY1ttb2RlXS50YWJsZSwgOSwgMik7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29ycmVjdCBjb2RlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJ1biArPSB0OworICAgICAgICAgICAgICAgICAgICBpZiAodCA8IDY0KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpydW5zKysgPSBydW4gKyBzYXZlZF9ydW47CisgICAgICAgICAgICAgICAgaWYgKHJ1bnMgPj0gcnVuZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUnVuIG92ZXJydW5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2F2ZWRfcnVuID0gMDsKKyAgICAgICAgICAgICAgICBvZmZzICAgICArPSBydW47CisgICAgICAgICAgICAgICAgaWYgKG9mZnMgPiB3aWR0aCB8fCBydW4gPiB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlJ1biB3ZW50IG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbW9kZSA9ICFtb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNtb2RlID09IDkgfHwgY21vZGUgPT0gMTApIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiU3BlY2lhbCBtb2RlcyBzdXBwb3J0Iik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0gZWxzZSB7IC8vdmVydGljYWwgbW9kZQorICAgICAgICAgICAgcnVuICAgICAgPSBydW5fb2ZmIC0gb2ZmcyArIChjbW9kZSAtIDUpOworICAgICAgICAgICAgcnVuX29mZiAtPSAqLS1yZWY7CisgICAgICAgICAgICBvZmZzICAgICs9IHJ1bjsKKyAgICAgICAgICAgIGlmIChvZmZzID4gd2lkdGggfHwgcnVuID4gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlJ1biB3ZW50IG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnJ1bnMrKyA9IHJ1biArIHNhdmVkX3J1bjsKKyAgICAgICAgICAgIGlmIChydW5zID49IHJ1bmVuZCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUnVuIG92ZXJydW5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2F2ZWRfcnVuID0gMDsKKyAgICAgICAgICAgIG1vZGUgICAgICA9ICFtb2RlOworICAgICAgICB9CisgICAgICAgIC8vc3luYyBsaW5lIHBvaW50ZXJzCisgICAgICAgIHdoaWxlIChvZmZzIDwgd2lkdGggJiYgcnVuX29mZiA8PSBvZmZzKSB7CisgICAgICAgICAgICBydW5fb2ZmICs9ICpyZWYrKzsKKyAgICAgICAgICAgIHJ1bl9vZmYgKz0gKnJlZisrOworICAgICAgICB9CisgICAgfQorICAgICpydW5zKysgPSBzYXZlZF9ydW47CisgICAgaWYgKHNhdmVkX3J1bikgeworICAgICAgICBpZiAocnVucyA+PSBydW5lbmQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUnVuIG92ZXJydW5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgICpydW5zKysgPSAwOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHV0X2xpbmUodWludDhfdCAqZHN0LCBpbnQgc2l6ZSwgaW50IHdpZHRoLCBjb25zdCBpbnQgKnJ1bnMpCit7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBpbnQgcnVuLCBtb2RlID0gfjAsIHBpeF9sZWZ0ID0gd2lkdGgsIHJ1bl9pZHggPSAwOworCisgICAgaW5pdF9wdXRfYml0cygmcGIsIGRzdCwgc2l6ZSAqIDgpOworICAgIHdoaWxlIChwaXhfbGVmdCA+IDApIHsKKyAgICAgICAgcnVuICAgICAgID0gcnVuc1tydW5faWR4KytdOworICAgICAgICBtb2RlICAgICAgPSB+bW9kZTsKKyAgICAgICAgcGl4X2xlZnQgLT0gcnVuOworICAgICAgICBmb3IgKDsgcnVuID4gMTY7IHJ1biAtPSAxNikKKyAgICAgICAgICAgIHB1dF9zYml0cygmcGIsIDE2LCBtb2RlKTsKKyAgICAgICAgaWYgKHJ1bikKKyAgICAgICAgICAgIHB1dF9zYml0cygmcGIsIHJ1biwgbW9kZSk7CisgICAgfQorICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9ncm91cDNfc3luY21hcmtlcihHZXRCaXRDb250ZXh0ICpnYiwgaW50IHNyY3NpemUpCit7CisgICAgdW5zaWduZWQgaW50IHN0YXRlID0gLTE7CisgICAgc3Jjc2l6ZSAtPSBnZXRfYml0c19jb3VudChnYik7CisgICAgd2hpbGUgKHNyY3NpemUtLSA+IDApIHsKKyAgICAgICAgc3RhdGUgKz0gc3RhdGUgKyBnZXRfYml0czEoZ2IpOworICAgICAgICBpZiAoKHN0YXRlICYgMHhGRkYpID09IDEpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgZmZfY2NpdHRfdW5wYWNrKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3Jjc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBlbnVtIFRpZmZDb21wciBjb21wciwgaW50IG9wdHMpCit7CisgICAgaW50IGo7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgKnJ1bnMsICpyZWYgPSBOVUxMLCAqcnVuZW5kOworICAgIGludCByZXQ7CisgICAgaW50IHJ1bnNpemUgPSBhdmN0eC0+d2lkdGggKyAyOworICAgIGludCBoYXNfZW9sOworCisgICAgcnVucyA9IGF2X21hbGxvY19hcnJheShydW5zaXplLCBzaXplb2YocnVuc1swXSkpOworICAgIHJlZiAgPSBhdl9tYWxsb2NfYXJyYXkocnVuc2l6ZSwgc2l6ZW9mKHJlZlswXSkpOworICAgIGlmICghcnVucyB8fCAhcmVmKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICByZWZbMF0gPSBhdmN0eC0+d2lkdGg7CisgICAgcmVmWzFdID0gMDsKKyAgICByZWZbMl0gPSAwOworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBzcmMsIHNyY3NpemUgKiA4KTsKKyAgICBoYXNfZW9sID0gc2hvd19iaXRzKCZnYiwgMTIpID09IDEgfHwgc2hvd19iaXRzKCZnYiwgMTYpID09IDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgcnVuZW5kID0gcnVucyArIHJ1bnNpemU7CisgICAgICAgIGlmIChjb21wciA9PSBUSUZGX0c0KSB7CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfZ3JvdXAzXzJkX2xpbmUoYXZjdHgsICZnYiwgYXZjdHgtPndpZHRoLCBydW5zLCBydW5lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBnM2QxID0gKGNvbXByID09IFRJRkZfRzMpICYmICEob3B0cyAmIDEpOworICAgICAgICAgICAgaWYgKGNvbXByICE9IFRJRkZfQ0NJVFRfUkxFICYmCisgICAgICAgICAgICAgICAgaGFzX2VvbCAmJgorICAgICAgICAgICAgICAgIGZpbmRfZ3JvdXAzX3N5bmNtYXJrZXIoJmdiLCBzcmNzaXplICogOCkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGNvbXByID09IFRJRkZfQ0NJVFRfUkxFIHx8IGczZDEgfHwgZ2V0X2JpdHMxKCZnYikpCisgICAgICAgICAgICAgICAgcmV0ID0gZGVjb2RlX2dyb3VwM18xZF9saW5lKGF2Y3R4LCAmZ2IsIGF2Y3R4LT53aWR0aCwgcnVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuZW5kKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXQgPSBkZWNvZGVfZ3JvdXAzXzJkX2xpbmUoYXZjdHgsICZnYiwgYXZjdHgtPndpZHRoLCBydW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5lbmQsIHJlZik7CisgICAgICAgICAgICBpZiAoY29tcHIgPT0gVElGRl9DQ0lUVF9STEUpCisgICAgICAgICAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJmdiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUgJiYgcmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcHV0X2xpbmUoZHN0LCBzdHJpZGUsIGF2Y3R4LT53aWR0aCwgcmVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB1dF9saW5lKGRzdCwgc3RyaWRlLCBhdmN0eC0+d2lkdGgsIHJ1bnMpOworICAgICAgICAgICAgRkZTV0FQKGludCAqLCBydW5zLCByZWYpOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorICAgIHJldCA9IDA7CitmYWlsOgorICAgIGF2X2ZyZWUocnVucyk7CisgICAgYXZfZnJlZShyZWYpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mYXhjb21wci5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmF4Y29tcHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2QxMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmF4Y29tcHIuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ0NJVFQgRmF4IEdyb3VwIDMgYW5kIDQgZGVjb21wcmVzc2lvbgorICogQ29weXJpZ2h0IChjKSAyMDA4IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ0NJVFQgRmF4IEdyb3VwIDMgYW5kIDQgZGVjb21wcmVzc2lvbgorICogQGF1dGhvciBLb25zdGFudGluIFNoaXNoa292CisgKi8KKyNpZm5kZWYgQVZDT0RFQ19GQVhDT01QUl9ICisjZGVmaW5lIEFWQ09ERUNfRkFYQ09NUFJfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInRpZmYuaCIKKworLyoqCisgKiBpbml0aWFsaXplIHVwYWNrZXIgY29kZQorICovCit2b2lkIGZmX2NjaXR0X3VucGFja19pbml0KHZvaWQpOworCisvKioKKyAqIHVucGFjayBkYXRhIGNvbXByZXNzZWQgd2l0aCBDQ0lUVCBHcm91cCAzIDEvMi1EIG9yIEdyb3VwIDQgbWV0aG9kCisgKi8KK2ludCBmZl9jY2l0dF91bnBhY2soQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNzaXplLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGVudW0gVGlmZkNvbXByIGNvbXByLCBpbnQgb3B0cyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0ZBWENPTVBSX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZkY3Rkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZkY3Rkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGI3MzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmRjdGRzcC5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImRjdC5oIgorI2luY2x1ZGUgImZhYW5kY3QuaCIKKyNpbmNsdWRlICJmZGN0ZHNwLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKK2F2X2NvbGQgdm9pZCBmZl9mZGN0ZHNwX2luaXQoRkRDVERTUENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBoaWdoX2JpdF9kZXB0aCA9IGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID4gODsKKworICAgIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMCkgeworICAgICAgICBjLT5mZGN0ICAgID0gZmZfanBlZ19mZGN0X2lzbG93XzEwOworICAgICAgICBjLT5mZGN0MjQ4ID0gZmZfZmRjdDI0OF9pc2xvd18xMDsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5kY3RfYWxnbyA9PSBGRl9EQ1RfRkFTVElOVCkgeworICAgICAgICBjLT5mZGN0ICAgID0gZmZfZmRjdF9pZmFzdDsKKyAgICAgICAgYy0+ZmRjdDI0OCA9IGZmX2ZkY3RfaWZhc3QyNDg7CisjaWYgQ09ORklHX0ZBQU5EQ1QKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5kY3RfYWxnbyA9PSBGRl9EQ1RfRkFBTikgeworICAgICAgICBjLT5mZGN0ICAgID0gZmZfZmFhbmRjdDsKKyAgICAgICAgYy0+ZmRjdDI0OCA9IGZmX2ZhYW5kY3QyNDg7CisjZW5kaWYgLyogQ09ORklHX0ZBQU5EQ1QgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBjLT5mZGN0ICAgID0gZmZfanBlZ19mZGN0X2lzbG93Xzg7IC8vIHNsb3cvYWNjdXJhdGUvZGVmYXVsdAorICAgICAgICBjLT5mZGN0MjQ4ID0gZmZfZmRjdDI0OF9pc2xvd184OworICAgIH0KKworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfZmRjdGRzcF9pbml0X3BwYyhjLCBhdmN0eCwgaGlnaF9iaXRfZGVwdGgpOworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfZmRjdGRzcF9pbml0X3g4NihjLCBhdmN0eCwgaGlnaF9iaXRfZGVwdGgpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmRjdGRzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmRjdGRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMWY2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mZGN0ZHNwLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRkRDVERTUF9ICisjZGVmaW5lIEFWQ09ERUNfRkRDVERTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgRkRDVERTUENvbnRleHQgeworICAgIHZvaWQgKCpmZGN0KShpbnQxNl90ICpibG9jayAvKiBhbGlnbiAxNiAqLyk7CisgICAgdm9pZCAoKmZkY3QyNDgpKGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovKTsKK30gRkRDVERTUENvbnRleHQ7CisKK3ZvaWQgZmZfZmRjdGRzcF9pbml0KEZEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl9mZGN0ZHNwX2luaXRfcHBjKEZEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpOwordm9pZCBmZl9mZGN0ZHNwX2luaXRfeDg2KEZEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpOworCisjZW5kaWYgLyogQVZDT0RFQ19GRENURFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdC1maXhlZC10ZXN0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mZnQtZml4ZWQtdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDIxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mZnQtZml4ZWQtdGVzdC5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBGRlRfRkxPQVQgMAorI2luY2x1ZGUgImZmdC10ZXN0LmMiCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mZnQtZml4ZWQzMi10ZXN0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mZnQtZml4ZWQzMi10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkMTFjZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdC1maXhlZDMyLXRlc3QuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgRkZUX0ZMT0FUIDAKKyNkZWZpbmUgRkZUX0ZJWEVEXzMyIDEKKyNpbmNsdWRlICJmZnQtdGVzdC5jIgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0LWludGVybmFsLmggYi9mZm1wZWcvbGliYXZjb2RlYy9mZnQtaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYThmN2QwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0LWludGVybmFsLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRkZUX0lOVEVSTkFMX0gKKyNkZWZpbmUgQVZDT0RFQ19GRlRfSU5URVJOQUxfSAorCisjaWYgRkZUX0ZMT0FUCisKKyNkZWZpbmUgRklYMTUodikgKHYpCisjZGVmaW5lIHNxcnRoYWxmIChmbG9hdClNX1NRUlQxXzIKKworI2RlZmluZSBCRih4LCB5LCBhLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB4ID0gYSAtIGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB5ID0gYSArIGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ01VTChkcmUsIGRpbSwgYXJlLCBhaW0sIGJyZSwgYmltKSBkbyB7IFwKKyAgICAgICAgKGRyZSkgPSAoYXJlKSAqIChicmUpIC0gKGFpbSkgKiAoYmltKTsgIFwKKyAgICAgICAgKGRpbSkgPSAoYXJlKSAqIChiaW0pICsgKGFpbSkgKiAoYnJlKTsgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZWxzZQorCisjZGVmaW5lIFNDQUxFX0ZMT0FUKGEsIGJpdHMpIGxyaW50KChhKSAqIChkb3VibGUpKDEgPDwgKGJpdHMpKSkKKworI2lmIEZGVF9GSVhFRF8zMgorCisjZGVmaW5lIENNVUwoZHJlLCBkaW0sIGFyZSwgYWltLCBicmUsIGJpbSkgZG8geyAgICAgICAgICAgICBcCisgICAgICAgIGludDY0X3QgYWNjdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoYWNjdSkgID0gKGludDY0X3QpKGJyZSkgKiAoYXJlKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGFjY3UpIC09IChpbnQ2NF90KShiaW0pICogKGFpbSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIChkcmUpICAgPSAoaW50KSgoKGFjY3UpICsgMHg0MDAwMDAwMCkgPj4gMzEpOyAgICAgICBcCisgICAgICAgIChhY2N1KSAgPSAoaW50NjRfdCkoYnJlKSAqIChhaW0pOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAoYWNjdSkgKz0gKGludDY0X3QpKGJpbSkgKiAoYXJlKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRpbSkgICA9IChpbnQpKCgoYWNjdSkgKyAweDQwMDAwMDAwKSA+PiAzMSk7ICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEZJWDE1KGEpIGF2X2NsaXAoU0NBTEVfRkxPQVQoYSwgMzEpLCAtMjE0NzQ4MzY0NywgMjE0NzQ4MzY0NykKKworI2Vsc2UgLyogRkZUX0ZJWEVEXzMyICovCisKKyNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisKK3ZvaWQgZmZfbWRjdF9jYWxjd19jKEZGVENvbnRleHQgKnMsIEZGVERvdWJsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKKworI2RlZmluZSBGSVgxNShhKSBhdl9jbGlwKFNDQUxFX0ZMT0FUKGEsIDE1KSwgLTMyNzY3LCAzMjc2NykKKworI2RlZmluZSBzcXJ0aGFsZiAoKGludDE2X3QpKCgxPDwxNSkqTV9TUVJUMV8yKSkKKworI2RlZmluZSBCRih4LCB5LCBhLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB4ID0gKGEgLSBiKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB5ID0gKGEgKyBiKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ01VTFMoZHJlLCBkaW0sIGFyZSwgYWltLCBicmUsIGJpbSwgc2gpIGRvIHsgICAgICAgICAgICBcCisgICAgICAgIChkcmUpID0gKE1VTDE2KGFyZSwgYnJlKSAtIE1VTDE2KGFpbSwgYmltKSkgPj4gc2g7ICAgICAgXAorICAgICAgICAoZGltKSA9IChNVUwxNihhcmUsIGJpbSkgKyBNVUwxNihhaW0sIGJyZSkpID4+IHNoOyAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIENNVUwoZHJlLCBkaW0sIGFyZSwgYWltLCBicmUsIGJpbSkgICAgICBcCisgICAgQ01VTFMoZHJlLCBkaW0sIGFyZSwgYWltLCBicmUsIGJpbSwgMTUpCisKKyNkZWZpbmUgQ01VTEwoZHJlLCBkaW0sIGFyZSwgYWltLCBicmUsIGJpbSkgICAgIFwKKyAgICBDTVVMUyhkcmUsIGRpbSwgYXJlLCBhaW0sIGJyZSwgYmltLCAwKQorCisjZW5kaWYgLyogRkZUX0ZJWEVEXzMyICovCisKKyNlbmRpZiAvKiBGRlRfRkxPQVQgKi8KKworI2RlZmluZSBmZl9pbWRjdF9jYWxjX2MgRkZUX05BTUUoZmZfaW1kY3RfY2FsY19jKQorI2RlZmluZSBmZl9pbWRjdF9oYWxmX2MgRkZUX05BTUUoZmZfaW1kY3RfaGFsZl9jKQorI2RlZmluZSBmZl9tZGN0X2NhbGNfYyAgRkZUX05BTUUoZmZfbWRjdF9jYWxjX2MpCisKK3ZvaWQgZmZfaW1kY3RfY2FsY19jKEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKK3ZvaWQgZmZfaW1kY3RfaGFsZl9jKEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKK3ZvaWQgZmZfbWRjdF9jYWxjX2MoRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpOworCisjZW5kaWYgLyogQVZDT0RFQ19GRlRfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0LXRlc3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdC10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyNmY4MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdC10ZXN0LmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qCisgKiAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRkZUIGFuZCBNRENUIHRlc3RzLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKworI2luY2x1ZGUgImZmdC5oIgorI2lmIEZGVF9GTE9BVAorI2luY2x1ZGUgImRjdC5oIgorI2luY2x1ZGUgInJkZnQuaCIKKyNlbmRpZgorCisvKiByZWZlcmVuY2UgZmZ0ICovCisKKyNkZWZpbmUgTVVMMTYoYSwgYikgKChhKSAqIChiKSkKKworI2RlZmluZSBDTUFDKHByZSwgcGltLCBhcmUsIGFpbSwgYnJlLCBiaW0pICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByZSArPSAoTVVMMTYoYXJlLCBicmUpIC0gTVVMMTYoYWltLCBiaW0pKTsgXAorICAgICAgICBwaW0gKz0gKE1VTDE2KGFyZSwgYmltKSArIE1VTDE2KGJyZSwgYWltKSk7IFwKKyAgICB9CisKKyNpZiBGRlRfRkxPQVQKKyNkZWZpbmUgUkFOR0UgMS4wCisjZGVmaW5lIFJFRl9TQ0FMRSh4LCBiaXRzKSAgKHgpCisjZGVmaW5lIEZNVCAiJTEwLjZmIgorI2VsaWYgRkZUX0ZJWEVEXzMyCisjZGVmaW5lIFJBTkdFIDgzODg2MDgKKyNkZWZpbmUgUkVGX1NDQUxFKHgsIGJpdHMpICh4KQorI2RlZmluZSBGTVQgIiU2ZCIKKyNlbHNlCisjZGVmaW5lIFJBTkdFIDE2Mzg0CisjZGVmaW5lIFJFRl9TQ0FMRSh4LCBiaXRzKSAoKHgpIC8gKDEgPDwgKGJpdHMpKSkKKyNkZWZpbmUgRk1UICIlNmQiCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB7CisgICAgZmxvYXQgcmUsIGltOworfSAqZXhwdGFiOworCitzdGF0aWMgaW50IGZmdF9yZWZfaW5pdChpbnQgbmJpdHMsIGludCBpbnZlcnNlKQoreworICAgIGludCBpLCBuID0gMSA8PCBuYml0czsKKworICAgIGV4cHRhYiA9IGF2X21hbGxvY19hcnJheSgobiAvIDIpLCBzaXplb2YoKmV4cHRhYikpOworICAgIGlmICghZXhwdGFiKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IChuIC8gMik7IGkrKykgeworICAgICAgICBkb3VibGUgYWxwaGEgPSAyICogTV9QSSAqIChmbG9hdCkgaSAvIChmbG9hdCkgbjsKKyAgICAgICAgZG91YmxlIGMxID0gY29zKGFscGhhKSwgczEgPSBzaW4oYWxwaGEpOworICAgICAgICBpZiAoIWludmVyc2UpCisgICAgICAgICAgICBzMSA9IC1zMTsKKyAgICAgICAgZXhwdGFiW2ldLnJlID0gYzE7CisgICAgICAgIGV4cHRhYltpXS5pbSA9IHMxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmZ0X3JlZihGRlRDb21wbGV4ICp0YWJyLCBGRlRDb21wbGV4ICp0YWIsIGludCBuYml0cykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgbiAgPSAxIDw8IG5iaXRzOworICAgIGludCBuMiA9IG4gPj4gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZG91YmxlIHRtcF9yZSA9IDAsIHRtcF9pbSA9IDA7CisgICAgICAgIEZGVENvbXBsZXggKnEgPSB0YWI7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBzLCBjOworICAgICAgICAgICAgaW50IGsgPSAoaSAqIGopICYgKG4gLSAxKTsKKyAgICAgICAgICAgIGlmIChrID49IG4yKSB7CisgICAgICAgICAgICAgICAgYyA9IC1leHB0YWJbayAtIG4yXS5yZTsKKyAgICAgICAgICAgICAgICBzID0gLWV4cHRhYltrIC0gbjJdLmltOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjID0gZXhwdGFiW2tdLnJlOworICAgICAgICAgICAgICAgIHMgPSBleHB0YWJba10uaW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDTUFDKHRtcF9yZSwgdG1wX2ltLCBjLCBzLCBxLT5yZSwgcS0+aW0pOworICAgICAgICAgICAgcSsrOworICAgICAgICB9CisgICAgICAgIHRhYnJbaV0ucmUgPSBSRUZfU0NBTEUodG1wX3JlLCBuYml0cyk7CisgICAgICAgIHRhYnJbaV0uaW0gPSBSRUZfU0NBTEUodG1wX2ltLCBuYml0cyk7CisgICAgfQorfQorCisjaWYgQ09ORklHX01EQ1QKK3N0YXRpYyB2b2lkIGltZGN0X3JlZihGRlRTYW1wbGUgKm91dCwgRkZUU2FtcGxlICppbiwgaW50IG5iaXRzKQoreworICAgIGludCBpLCBrLCBuID0gMSA8PCBuYml0czsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZG91YmxlIHN1bSA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuIC8gMjsgaysrKSB7CisgICAgICAgICAgICBpbnQgYSA9ICgyICogaSArIDEgKyAobiAvIDIpKSAqICgyICogayArIDEpOworICAgICAgICAgICAgZG91YmxlIGYgPSBjb3MoTV9QSSAqIGEgLyAoZG91YmxlKSAoMiAqIG4pKTsKKyAgICAgICAgICAgIHN1bSArPSBmICogaW5ba107CisgICAgICAgIH0KKyAgICAgICAgb3V0W2ldID0gUkVGX1NDQUxFKC1zdW0sIG5iaXRzIC0gMik7CisgICAgfQorfQorCisvKiBOT1RFOiBubyBub3JtYWxpc2F0aW9uIGJ5IDEgLyBOIGlzIGRvbmUgKi8KK3N0YXRpYyB2b2lkIG1kY3RfcmVmKEZGVFNhbXBsZSAqb3V0cHV0LCBGRlRTYW1wbGUgKmlucHV0LCBpbnQgbmJpdHMpCit7CisgICAgaW50IGksIGssIG4gPSAxIDw8IG5iaXRzOworCisgICAgLyogZG8gaXQgYnkgaGFuZCAqLworICAgIGZvciAoayA9IDA7IGsgPCBuIC8gMjsgaysrKSB7CisgICAgICAgIGRvdWJsZSBzID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgZG91YmxlIGEgPSAoMiAqIE1fUEkgKiAoMiAqIGkgKyAxICsgbiAvIDIpICogKDIgKiBrICsgMSkgLyAoNCAqIG4pKTsKKyAgICAgICAgICAgIHMgKz0gaW5wdXRbaV0gKiBjb3MoYSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0W2tdID0gUkVGX1NDQUxFKHMsIG5iaXRzIC0gMSk7CisgICAgfQorfQorI2VuZGlmIC8qIENPTkZJR19NRENUICovCisKKyNpZiBGRlRfRkxPQVQKKyNpZiBDT05GSUdfRENUCitzdGF0aWMgdm9pZCBpZGN0X3JlZihGRlRTYW1wbGUgKm91dHB1dCwgRkZUU2FtcGxlICppbnB1dCwgaW50IG5iaXRzKQoreworICAgIGludCBpLCBrLCBuID0gMSA8PCBuYml0czsKKworICAgIC8qIGRvIGl0IGJ5IGhhbmQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBzID0gMC41ICogaW5wdXRbMF07CisgICAgICAgIGZvciAoayA9IDE7IGsgPCBuOyBrKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBhID0gTV9QSSAqIGsgKiAoaSArIDAuNSkgLyBuOworICAgICAgICAgICAgcyArPSBpbnB1dFtrXSAqIGNvcyhhKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRbaV0gPSAyICogcyAvIG47CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkY3RfcmVmKEZGVFNhbXBsZSAqb3V0cHV0LCBGRlRTYW1wbGUgKmlucHV0LCBpbnQgbmJpdHMpCit7CisgICAgaW50IGksIGssIG4gPSAxIDw8IG5iaXRzOworCisgICAgLyogZG8gaXQgYnkgaGFuZCAqLworICAgIGZvciAoayA9IDA7IGsgPCBuOyBrKyspIHsKKyAgICAgICAgZG91YmxlIHMgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgYSA9IE1fUEkgKiBrICogKGkgKyAwLjUpIC8gbjsKKyAgICAgICAgICAgIHMgKz0gaW5wdXRbaV0gKiBjb3MoYSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0W2tdID0gczsKKyAgICB9Cit9CisjZW5kaWYgLyogQ09ORklHX0RDVCAqLworI2VuZGlmIC8qIEZGVF9GTE9BVCAqLworCitzdGF0aWMgRkZUU2FtcGxlIGZyYW5kb20oQVZMRkcgKnBybmcpCit7CisgICAgcmV0dXJuIChpbnQxNl90KSBhdl9sZmdfZ2V0KHBybmcpIC8gMzI3NjguMCAqIFJBTkdFOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RpZmYoRkZUU2FtcGxlICp0YWIxLCBGRlRTYW1wbGUgKnRhYjIsIGludCBuLCBkb3VibGUgc2NhbGUpCit7CisgICAgaW50IGksIGVyciA9IDA7CisgICAgZG91YmxlIGVycm9yID0gMCwgbWF4ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZG91YmxlIGUgPSBmYWJzZih0YWIxW2ldIC0gKHRhYjJbaV0gLyBzY2FsZSkpIC8gUkFOR0U7CisgICAgICAgIGlmIChlID49IDFlLTMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFUlJPUiAlNWQ6ICJGTVQiICJGTVQiXG4iLAorICAgICAgICAgICAgICAgICAgIGksIHRhYjFbaV0sIHRhYjJbaV0pOworICAgICAgICAgICAgZXJyID0gMTsKKyAgICAgICAgfQorICAgICAgICBlcnJvciArPSBlICogZTsKKyAgICAgICAgaWYgKGUgPiBtYXgpCisgICAgICAgICAgICBtYXggPSBlOworICAgIH0KKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJtYXg6JWYgZTolZ1xuIiwgbWF4LCBzcXJ0KGVycm9yIC8gbikpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGhlbHAodm9pZCkKK3sKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICJ1c2FnZTogZmZ0LXRlc3QgWy1oXSBbLXNdIFstaV0gWy1uIGJdXG4iCisgICAgICAgICAgICItaCAgICAgcHJpbnQgdGhpcyBoZWxwXG4iCisgICAgICAgICAgICItcyAgICAgc3BlZWQgdGVzdFxuIgorICAgICAgICAgICAiLW0gICAgIChJKU1EQ1QgdGVzdFxuIgorICAgICAgICAgICAiLWQgICAgIChJKURDVCB0ZXN0XG4iCisgICAgICAgICAgICItciAgICAgKEkpUkRGVCB0ZXN0XG4iCisgICAgICAgICAgICItaSAgICAgaW52ZXJzZSB0cmFuc2Zvcm0gdGVzdFxuIgorICAgICAgICAgICAiLW4gYiAgIHNldCB0aGUgdHJhbnNmb3JtIHNpemUgdG8gMl5iXG4iCisgICAgICAgICAgICItZiB4ICAgc2V0IHNjYWxlIGZhY3RvciBmb3Igb3V0cHV0IGRhdGEgb2YgKEkpTURDVCB0byB4XG4iKTsKK30KKworZW51bSB0Zl90cmFuc2Zvcm0geworICAgIFRSQU5TRk9STV9GRlQsCisgICAgVFJBTlNGT1JNX01EQ1QsCisgICAgVFJBTlNGT1JNX1JERlQsCisgICAgVFJBTlNGT1JNX0RDVCwKK307CisKKyNpZiAhSEFWRV9HRVRPUFQKKyNpbmNsdWRlICJjb21wYXQvZ2V0b3B0LmMiCisjZW5kaWYKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIEZGVENvbXBsZXggKnRhYiwgKnRhYjEsICp0YWJfcmVmOworICAgIEZGVFNhbXBsZSAqdGFiMjsKKyAgICBlbnVtIHRmX3RyYW5zZm9ybSB0cmFuc2Zvcm0gPSBUUkFOU0ZPUk1fRkZUOworICAgIEZGVENvbnRleHQgbSwgczsKKyNpZiBGRlRfRkxPQVQKKyAgICBSREZUQ29udGV4dCByOworICAgIERDVENvbnRleHQgZDsKKyNlbmRpZiAvKiBGRlRfRkxPQVQgKi8KKyAgICBpbnQgaXQsIGksIGVyciA9IDE7CisgICAgaW50IGRvX3NwZWVkID0gMCwgZG9faW52ZXJzZSA9IDA7CisgICAgaW50IGZmdF9uYml0cyA9IDksIGZmdF9zaXplOworICAgIGRvdWJsZSBzY2FsZSA9IDEuMDsKKyAgICBBVkxGRyBwcm5nOworCisgICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaHNpbXJkbjpmOmM6Iik7CisgICAgICAgIGlmIChjID09IC0xKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgIGhlbHAoKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgIGRvX3NwZWVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgIGRvX2ludmVyc2UgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgdHJhbnNmb3JtID0gVFJBTlNGT1JNX01EQ1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBUUkFOU0ZPUk1fUkRGVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IFRSQU5TRk9STV9EQ1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICBmZnRfbmJpdHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICBzY2FsZSA9IGF0b2Yob3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNwdWZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgICAgICAgICBpZiAoYXZfcGFyc2VfY3B1X2NhcHMoJmNwdWZsYWdzLCBvcHRhcmcpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgYXZfZm9yY2VfY3B1X2ZsYWdzKGNwdWZsYWdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmZnRfc2l6ZSA9IDEgPDwgZmZ0X25iaXRzOworICAgIHRhYiAgICAgID0gYXZfbWFsbG9jX2FycmF5KGZmdF9zaXplLCBzaXplb2YoRkZUQ29tcGxleCkpOworICAgIHRhYjEgICAgID0gYXZfbWFsbG9jX2FycmF5KGZmdF9zaXplLCBzaXplb2YoRkZUQ29tcGxleCkpOworICAgIHRhYl9yZWYgID0gYXZfbWFsbG9jX2FycmF5KGZmdF9zaXplLCBzaXplb2YoRkZUQ29tcGxleCkpOworICAgIHRhYjIgICAgID0gYXZfbWFsbG9jX2FycmF5KGZmdF9zaXplLCBzaXplb2YoRkZUU2FtcGxlKSk7CisKKyAgICBpZiAoISh0YWIgJiYgdGFiMSAmJiB0YWJfcmVmICYmIHRhYjIpKQorICAgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICBzd2l0Y2ggKHRyYW5zZm9ybSkgeworI2lmIENPTkZJR19NRENUCisgICAgY2FzZSBUUkFOU0ZPUk1fTURDVDoKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiU2NhbGUgZmFjdG9yIGlzIHNldCB0byAlZlxuIiwgc2NhbGUpOworICAgICAgICBpZiAoZG9faW52ZXJzZSkKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIklNRENUIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIk1EQ1QiKTsKKyAgICAgICAgZmZfbWRjdF9pbml0KCZtLCBmZnRfbmJpdHMsIGRvX2ludmVyc2UsIHNjYWxlKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX01EQ1QgKi8KKyAgICBjYXNlIFRSQU5TRk9STV9GRlQ6CisgICAgICAgIGlmIChkb19pbnZlcnNlKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiSUZGVCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJGRlQiKTsKKyAgICAgICAgZmZfZmZ0X2luaXQoJnMsIGZmdF9uYml0cywgZG9faW52ZXJzZSk7CisgICAgICAgIGlmICgoZXJyID0gZmZ0X3JlZl9pbml0KGZmdF9uYml0cywgZG9faW52ZXJzZSkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgYnJlYWs7CisjaWYgRkZUX0ZMT0FUCisjICAgIGlmIENPTkZJR19SREZUCisgICAgY2FzZSBUUkFOU0ZPUk1fUkRGVDoKKyAgICAgICAgaWYgKGRvX2ludmVyc2UpCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJJREZUX0MyUiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJERlRfUjJDIik7CisgICAgICAgIGZmX3JkZnRfaW5pdCgmciwgZmZ0X25iaXRzLCBkb19pbnZlcnNlID8gSURGVF9DMlIgOiBERlRfUjJDKTsKKyAgICAgICAgaWYgKChlcnIgPSBmZnRfcmVmX2luaXQoZmZ0X25iaXRzLCBkb19pbnZlcnNlKSkgPCAwKQorICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBicmVhazsKKyMgICAgZW5kaWYgLyogQ09ORklHX1JERlQgKi8KKyMgICAgaWYgQ09ORklHX0RDVAorICAgIGNhc2UgVFJBTlNGT1JNX0RDVDoKKyAgICAgICAgaWYgKGRvX2ludmVyc2UpCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJEQ1RfSUlJIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIkRDVF9JSSIpOworICAgICAgICBmZl9kY3RfaW5pdCgmZCwgZmZ0X25iaXRzLCBkb19pbnZlcnNlID8gRENUX0lJSSA6IERDVF9JSSk7CisgICAgICAgIGJyZWFrOworIyAgICBlbmRpZiAvKiBDT05GSUdfRENUICovCisjZW5kaWYgLyogRkZUX0ZMT0FUICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlJlcXVlc3RlZCB0cmFuc2Zvcm0gbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiICVkIHRlc3RcbiIsIGZmdF9zaXplKTsKKworICAgIC8qIGdlbmVyYXRlIHJhbmRvbSBkYXRhICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmZ0X3NpemU7IGkrKykgeworICAgICAgICB0YWIxW2ldLnJlID0gZnJhbmRvbSgmcHJuZyk7CisgICAgICAgIHRhYjFbaV0uaW0gPSBmcmFuZG9tKCZwcm5nKTsKKyAgICB9CisKKyAgICAvKiBjaGVja2luZyByZXN1bHQgKi8KKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJDaGVja2luZy4uLlxuIik7CisKKyAgICBzd2l0Y2ggKHRyYW5zZm9ybSkgeworI2lmIENPTkZJR19NRENUCisgICAgY2FzZSBUUkFOU0ZPUk1fTURDVDoKKyAgICAgICAgaWYgKGRvX2ludmVyc2UpIHsKKyAgICAgICAgICAgIGltZGN0X3JlZigmdGFiX3JlZi0+cmUsICZ0YWIxLT5yZSwgZmZ0X25iaXRzKTsKKyAgICAgICAgICAgIG0uaW1kY3RfY2FsYygmbSwgdGFiMiwgJnRhYjEtPnJlKTsKKyAgICAgICAgICAgIGVyciA9IGNoZWNrX2RpZmYoJnRhYl9yZWYtPnJlLCB0YWIyLCBmZnRfc2l6ZSwgc2NhbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWRjdF9yZWYoJnRhYl9yZWYtPnJlLCAmdGFiMS0+cmUsIGZmdF9uYml0cyk7CisgICAgICAgICAgICBtLm1kY3RfY2FsYygmbSwgdGFiMiwgJnRhYjEtPnJlKTsKKyAgICAgICAgICAgIGVyciA9IGNoZWNrX2RpZmYoJnRhYl9yZWYtPnJlLCB0YWIyLCBmZnRfc2l6ZSAvIDIsIHNjYWxlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfTURDVCAqLworICAgIGNhc2UgVFJBTlNGT1JNX0ZGVDoKKyAgICAgICAgbWVtY3B5KHRhYiwgdGFiMSwgZmZ0X3NpemUgKiBzaXplb2YoRkZUQ29tcGxleCkpOworICAgICAgICBzLmZmdF9wZXJtdXRlKCZzLCB0YWIpOworICAgICAgICBzLmZmdF9jYWxjKCZzLCB0YWIpOworCisgICAgICAgIGZmdF9yZWYodGFiX3JlZiwgdGFiMSwgZmZ0X25iaXRzKTsKKyAgICAgICAgZXJyID0gY2hlY2tfZGlmZigmdGFiX3JlZi0+cmUsICZ0YWItPnJlLCBmZnRfc2l6ZSAqIDIsIDEuMCk7CisgICAgICAgIGJyZWFrOworI2lmIEZGVF9GTE9BVAorI2lmIENPTkZJR19SREZUCisgICAgY2FzZSBUUkFOU0ZPUk1fUkRGVDoKKyAgICB7CisgICAgICAgIGludCBmZnRfc2l6ZV8yID0gZmZ0X3NpemUgPj4gMTsKKyAgICAgICAgaWYgKGRvX2ludmVyc2UpIHsKKyAgICAgICAgICAgIHRhYjFbMF0uaW0gICAgICAgICAgPSAwOworICAgICAgICAgICAgdGFiMVtmZnRfc2l6ZV8yXS5pbSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZmZ0X3NpemVfMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGFiMVtmZnRfc2l6ZV8yICsgaV0ucmUgPSAgdGFiMVtmZnRfc2l6ZV8yIC0gaV0ucmU7CisgICAgICAgICAgICAgICAgdGFiMVtmZnRfc2l6ZV8yICsgaV0uaW0gPSAtdGFiMVtmZnRfc2l6ZV8yIC0gaV0uaW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbWNweSh0YWIyLCB0YWIxLCBmZnRfc2l6ZSAqIHNpemVvZihGRlRTYW1wbGUpKTsKKyAgICAgICAgICAgIHRhYjJbMV0gPSB0YWIxW2ZmdF9zaXplXzJdLnJlOworCisgICAgICAgICAgICByLnJkZnRfY2FsYygmciwgdGFiMik7CisgICAgICAgICAgICBmZnRfcmVmKHRhYl9yZWYsIHRhYjEsIGZmdF9uYml0cyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmZ0X3NpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHRhYltpXS5yZSA9IHRhYjJbaV07CisgICAgICAgICAgICAgICAgdGFiW2ldLmltID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGNoZWNrX2RpZmYoJnRhYl9yZWYtPnJlLCAmdGFiLT5yZSwgZmZ0X3NpemUgKiAyLCAwLjUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZmdF9zaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0YWIyW2ldICAgID0gdGFiMVtpXS5yZTsKKyAgICAgICAgICAgICAgICB0YWIxW2ldLmltID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHIucmRmdF9jYWxjKCZyLCB0YWIyKTsKKyAgICAgICAgICAgIGZmdF9yZWYodGFiX3JlZiwgdGFiMSwgZmZ0X25iaXRzKTsKKyAgICAgICAgICAgIHRhYl9yZWZbMF0uaW0gPSB0YWJfcmVmW2ZmdF9zaXplXzJdLnJlOworICAgICAgICAgICAgZXJyID0gY2hlY2tfZGlmZigmdGFiX3JlZi0+cmUsIHRhYjIsIGZmdF9zaXplLCAxLjApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfUkRGVCAqLworI2lmIENPTkZJR19EQ1QKKyAgICBjYXNlIFRSQU5TRk9STV9EQ1Q6CisgICAgICAgIG1lbWNweSh0YWIsIHRhYjEsIGZmdF9zaXplICogc2l6ZW9mKEZGVENvbXBsZXgpKTsKKyAgICAgICAgZC5kY3RfY2FsYygmZCwgJnRhYi0+cmUpOworICAgICAgICBpZiAoZG9faW52ZXJzZSkKKyAgICAgICAgICAgIGlkY3RfcmVmKCZ0YWJfcmVmLT5yZSwgJnRhYjEtPnJlLCBmZnRfbmJpdHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkY3RfcmVmKCZ0YWJfcmVmLT5yZSwgJnRhYjEtPnJlLCBmZnRfbmJpdHMpOworICAgICAgICBlcnIgPSBjaGVja19kaWZmKCZ0YWJfcmVmLT5yZSwgJnRhYi0+cmUsIGZmdF9zaXplLCAxLjApOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfRENUICovCisjZW5kaWYgLyogRkZUX0ZMT0FUICovCisgICAgfQorCisgICAgLyogZG8gYSBzcGVlZCB0ZXN0ICovCisKKyAgICBpZiAoZG9fc3BlZWQpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lX3N0YXJ0LCBkdXJhdGlvbjsKKyAgICAgICAgaW50IG5iX2l0czsKKworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJTcGVlZCB0ZXN0Li4uXG4iKTsKKyAgICAgICAgLyogd2UgbWVhc3VyZSBkdXJpbmcgYWJvdXQgMSBzZWNvbmRzICovCisgICAgICAgIG5iX2l0cyA9IDE7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIHRpbWVfc3RhcnQgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7CisgICAgICAgICAgICBmb3IgKGl0ID0gMDsgaXQgPCBuYl9pdHM7IGl0KyspIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRyYW5zZm9ybSkgeworICAgICAgICAgICAgICAgIGNhc2UgVFJBTlNGT1JNX01EQ1Q6CisgICAgICAgICAgICAgICAgICAgIGlmIChkb19pbnZlcnNlKQorICAgICAgICAgICAgICAgICAgICAgICAgbS5pbWRjdF9jYWxjKCZtLCAmdGFiLT5yZSwgJnRhYjEtPnJlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbS5tZGN0X2NhbGMoJm0sICZ0YWItPnJlLCAmdGFiMS0+cmUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRSQU5TRk9STV9GRlQ6CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSh0YWIsIHRhYjEsIGZmdF9zaXplICogc2l6ZW9mKEZGVENvbXBsZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgcy5mZnRfY2FsYygmcywgdGFiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWYgRkZUX0ZMT0FUCisgICAgICAgICAgICAgICAgY2FzZSBUUkFOU0ZPUk1fUkRGVDoKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRhYjIsIHRhYjEsIGZmdF9zaXplICogc2l6ZW9mKEZGVFNhbXBsZSkpOworICAgICAgICAgICAgICAgICAgICByLnJkZnRfY2FsYygmciwgdGFiMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVFJBTlNGT1JNX0RDVDoKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRhYjIsIHRhYjEsIGZmdF9zaXplICogc2l6ZW9mKEZGVFNhbXBsZSkpOworICAgICAgICAgICAgICAgICAgICBkLmRjdF9jYWxjKCZkLCB0YWIyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogRkZUX0ZMT0FUICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVyYXRpb24gPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLSB0aW1lX3N0YXJ0OworICAgICAgICAgICAgaWYgKGR1cmF0aW9uID49IDEwMDAwMDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBuYl9pdHMgKj0gMjsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAidGltZTogJTAuMWYgdXMvdHJhbnNmb3JtIFt0b3RhbCB0aW1lPSUwLjJmIHMgaXRzPSVkXVxuIiwKKyAgICAgICAgICAgICAgIChkb3VibGUpIGR1cmF0aW9uIC8gbmJfaXRzLAorICAgICAgICAgICAgICAgKGRvdWJsZSkgZHVyYXRpb24gLyAxMDAwMDAwLjAsCisgICAgICAgICAgICAgICBuYl9pdHMpOworICAgIH0KKworICAgIHN3aXRjaCAodHJhbnNmb3JtKSB7CisjaWYgQ09ORklHX01EQ1QKKyAgICBjYXNlIFRSQU5TRk9STV9NRENUOgorICAgICAgICBmZl9tZGN0X2VuZCgmbSk7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENPTkZJR19NRENUICovCisgICAgY2FzZSBUUkFOU0ZPUk1fRkZUOgorICAgICAgICBmZl9mZnRfZW5kKCZzKTsKKyAgICAgICAgYnJlYWs7CisjaWYgRkZUX0ZMT0FUCisjICAgIGlmIENPTkZJR19SREZUCisgICAgY2FzZSBUUkFOU0ZPUk1fUkRGVDoKKyAgICAgICAgZmZfcmRmdF9lbmQoJnIpOworICAgICAgICBicmVhazsKKyMgICAgZW5kaWYgLyogQ09ORklHX1JERlQgKi8KKyMgICAgaWYgQ09ORklHX0RDVAorICAgIGNhc2UgVFJBTlNGT1JNX0RDVDoKKyAgICAgICAgZmZfZGN0X2VuZCgmZCk7CisgICAgICAgIGJyZWFrOworIyAgICBlbmRpZiAvKiBDT05GSUdfRENUICovCisjZW5kaWYgLyogRkZUX0ZMT0FUICovCisgICAgfQorCitjbGVhbnVwOgorICAgIGF2X2ZyZWUodGFiKTsKKyAgICBhdl9mcmVlKHRhYjEpOworICAgIGF2X2ZyZWUodGFiMik7CisgICAgYXZfZnJlZSh0YWJfcmVmKTsKKyAgICBhdl9mcmVlKGV4cHRhYik7CisKKyAgICBpZiAoZXJyKQorICAgICAgICBwcmludGYoIkVycm9yOiAlZC5cbiIsIGVycik7CisKKyAgICByZXR1cm4gISFlcnI7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mZnQuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZjBmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mZnQuaApAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19GRlRfSAorI2RlZmluZSBBVkNPREVDX0ZGVF9ICisKKyNpZm5kZWYgRkZUX0ZMT0FUCisjZGVmaW5lIEZGVF9GTE9BVCAxCisjZW5kaWYKKworI2lmbmRlZiBGRlRfRklYRURfMzIKKyNkZWZpbmUgRkZUX0ZJWEVEXzMyIDAKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaWYgRkZUX0ZMT0FUCisKKyNpbmNsdWRlICJhdmZmdC5oIgorCisjZGVmaW5lIEZGVF9OQU1FKHgpIHgKKwordHlwZWRlZiBmbG9hdCBGRlREb3VibGU7CisKKyNlbHNlCisKKyNpZiBGRlRfRklYRURfMzIKKworI2RlZmluZSBRMzEoeCkgKGludCkoKHgpKjIxNDc0ODM2NDguMCArIDAuNSkKKyNkZWZpbmUgRkZUX05BTUUoeCkgeCAjIyBfZml4ZWRfMzIKKwordHlwZWRlZiBpbnQzMl90IEZGVFNhbXBsZTsKKworI2Vsc2UgLyogRkZUX0ZJWEVEXzMyICovCisKKyNkZWZpbmUgRkZUX05BTUUoeCkgeCAjIyBfZml4ZWQKKwordHlwZWRlZiBpbnQxNl90IEZGVFNhbXBsZTsKKworI2VuZGlmIC8qIEZGVF9GSVhFRF8zMiAqLworCit0eXBlZGVmIHN0cnVjdCBGRlRDb21wbGV4IHsKKyAgICBGRlRTYW1wbGUgcmUsIGltOworfSBGRlRDb21wbGV4OworCit0eXBlZGVmIGludCAgICBGRlREb3VibGU7Cit0eXBlZGVmIHN0cnVjdCBGRlRDb250ZXh0IEZGVENvbnRleHQ7CisKKyNlbmRpZiAvKiBGRlRfRkxPQVQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgRkZURENvbXBsZXggeworICAgIEZGVERvdWJsZSByZSwgaW07Cit9IEZGVERDb21wbGV4OworCisvKiBGRlQgY29tcHV0YXRpb24gKi8KKworZW51bSBmZnRfcGVybXV0YXRpb25fdHlwZSB7CisgICAgRkZfRkZUX1BFUk1fREVGQVVMVCwKKyAgICBGRl9GRlRfUEVSTV9TV0FQX0xTQlMsCisgICAgRkZfRkZUX1BFUk1fQVZYLAorfTsKKworZW51bSBtZGN0X3Blcm11dGF0aW9uX3R5cGUgeworICAgIEZGX01EQ1RfUEVSTV9OT05FLAorICAgIEZGX01EQ1RfUEVSTV9JTlRFUkxFQVZFLAorfTsKKworc3RydWN0IEZGVENvbnRleHQgeworICAgIGludCBuYml0czsKKyAgICBpbnQgaW52ZXJzZTsKKyAgICB1aW50MTZfdCAqcmV2dGFiOworICAgIEZGVENvbXBsZXggKnRtcF9idWY7CisgICAgaW50IG1kY3Rfc2l6ZTsgLyogc2l6ZSBvZiBNRENUIChpLmUuIG51bWJlciBvZiBpbnB1dCBkYXRhICogMikgKi8KKyAgICBpbnQgbWRjdF9iaXRzOyAvKiBuID0gMl5uYml0cyAqLworICAgIC8qIHByZS9wb3N0IHJvdGF0aW9uIHRhYmxlcyAqLworICAgIEZGVFNhbXBsZSAqdGNvczsKKyAgICBGRlRTYW1wbGUgKnRzaW47CisgICAgLyoqCisgICAgICogRG8gdGhlIHBlcm11dGF0aW9uIG5lZWRlZCBCRUZPUkUgY2FsbGluZyBmZnRfY2FsYygpLgorICAgICAqLworICAgIHZvaWQgKCpmZnRfcGVybXV0ZSkoc3RydWN0IEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopOworICAgIC8qKgorICAgICAqIERvIGEgY29tcGxleCBGRlQgd2l0aCB0aGUgcGFyYW1ldGVycyBkZWZpbmVkIGluIGZmX2ZmdF9pbml0KCkuIFRoZQorICAgICAqIGlucHV0IGRhdGEgbXVzdCBiZSBwZXJtdXRlZCBiZWZvcmUuIE5vIDEuMC9zcXJ0KG4pIG5vcm1hbGl6YXRpb24gaXMgZG9uZS4KKyAgICAgKi8KKyAgICB2b2lkICgqZmZ0X2NhbGMpKHN0cnVjdCBGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KTsKKyAgICB2b2lkICgqaW1kY3RfY2FsYykoc3RydWN0IEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKKyAgICB2b2lkICgqaW1kY3RfaGFsZikoc3RydWN0IEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKKyAgICB2b2lkICgqbWRjdF9jYWxjKShzdHJ1Y3QgRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpOworICAgIHZvaWQgKCptZGN0X2NhbGN3KShzdHJ1Y3QgRkZUQ29udGV4dCAqcywgRkZURG91YmxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpOworICAgIGVudW0gZmZ0X3Blcm11dGF0aW9uX3R5cGUgZmZ0X3Blcm11dGF0aW9uOworICAgIGVudW0gbWRjdF9wZXJtdXRhdGlvbl90eXBlIG1kY3RfcGVybXV0YXRpb247Cit9OworCisjaWYgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKKyNkZWZpbmUgQ09TVEFCTEVfQ09OU1QgY29uc3QKKyNlbHNlCisjZGVmaW5lIENPU1RBQkxFX0NPTlNUCisjZW5kaWYKKworI2RlZmluZSBDT1NUQUJMRShzaXplKSBcCisgICAgQ09TVEFCTEVfQ09OU1QgREVDTEFSRV9BTElHTkVEKDMyLCBGRlRTYW1wbGUsIEZGVF9OQU1FKGZmX2Nvc18jI3NpemUpKVtzaXplLzJdCisKK2V4dGVybiBDT1NUQUJMRSgxNik7CitleHRlcm4gQ09TVEFCTEUoMzIpOworZXh0ZXJuIENPU1RBQkxFKDY0KTsKK2V4dGVybiBDT1NUQUJMRSgxMjgpOworZXh0ZXJuIENPU1RBQkxFKDI1Nik7CitleHRlcm4gQ09TVEFCTEUoNTEyKTsKK2V4dGVybiBDT1NUQUJMRSgxMDI0KTsKK2V4dGVybiBDT1NUQUJMRSgyMDQ4KTsKK2V4dGVybiBDT1NUQUJMRSg0MDk2KTsKK2V4dGVybiBDT1NUQUJMRSg4MTkyKTsKK2V4dGVybiBDT1NUQUJMRSgxNjM4NCk7CitleHRlcm4gQ09TVEFCTEUoMzI3NjgpOworZXh0ZXJuIENPU1RBQkxFKDY1NTM2KTsKK2V4dGVybiBDT1NUQUJMRV9DT05TVCBGRlRTYW1wbGUqIGNvbnN0IEZGVF9OQU1FKGZmX2Nvc190YWJzKVsxN107CisKKyNkZWZpbmUgZmZfaW5pdF9mZl9jb3NfdGFicyBGRlRfTkFNRShmZl9pbml0X2ZmX2Nvc190YWJzKQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGNvc2luZSB0YWJsZSBpbiBmZl9jb3NfdGFic1tpbmRleF0KKyAqIEBwYXJhbSBpbmRleCBpbmRleCBpbiBmZl9jb3NfdGFicyBhcnJheSBvZiB0aGUgdGFibGUgdG8gaW5pdGlhbGl6ZQorICovCit2b2lkIGZmX2luaXRfZmZfY29zX3RhYnMoaW50IGluZGV4KTsKKworI2RlZmluZSBmZl9mZnRfaW5pdCBGRlRfTkFNRShmZl9mZnRfaW5pdCkKKyNkZWZpbmUgZmZfZmZ0X2VuZCAgRkZUX05BTUUoZmZfZmZ0X2VuZCkKKworLyoqCisgKiBTZXQgdXAgYSBjb21wbGV4IEZGVC4KKyAqIEBwYXJhbSBuYml0cyAgICAgICAgICAgbG9nMiBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBhcnJheQorICogQHBhcmFtIGludmVyc2UgICAgICAgICBpZiAwIHBlcmZvcm0gdGhlIGZvcndhcmQgdHJhbnNmb3JtLCBpZiAxIHBlcmZvcm0gdGhlIGludmVyc2UKKyAqLworaW50IGZmX2ZmdF9pbml0KEZGVENvbnRleHQgKnMsIGludCBuYml0cywgaW50IGludmVyc2UpOworCit2b2lkIGZmX2ZmdF9pbml0X2FhcmNoNjQoRkZUQ29udGV4dCAqcyk7Cit2b2lkIGZmX2ZmdF9pbml0X3g4NihGRlRDb250ZXh0ICpzKTsKK3ZvaWQgZmZfZmZ0X2luaXRfYXJtKEZGVENvbnRleHQgKnMpOwordm9pZCBmZl9mZnRfaW5pdF9taXBzKEZGVENvbnRleHQgKnMpOwordm9pZCBmZl9mZnRfaW5pdF9wcGMoRkZUQ29udGV4dCAqcyk7CisKK3ZvaWQgZmZfZmZ0X2ZpeGVkX2luaXRfYXJtKEZGVENvbnRleHQgKnMpOworCit2b2lkIGZmX2ZmdF9lbmQoRkZUQ29udGV4dCAqcyk7CisKKyNkZWZpbmUgZmZfbWRjdF9pbml0IEZGVF9OQU1FKGZmX21kY3RfaW5pdCkKKyNkZWZpbmUgZmZfbWRjdF9lbmQgIEZGVF9OQU1FKGZmX21kY3RfZW5kKQorCitpbnQgZmZfbWRjdF9pbml0KEZGVENvbnRleHQgKnMsIGludCBuYml0cywgaW50IGludmVyc2UsIGRvdWJsZSBzY2FsZSk7Cit2b2lkIGZmX21kY3RfZW5kKEZGVENvbnRleHQgKnMpOworCisjZW5kaWYgLyogQVZDT0RFQ19GRlRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0X2ZpeGVkLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mZnRfZml4ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNiZDJmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0X2ZpeGVkLmMKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIEZGVF9GTE9BVCAwCisjZGVmaW5lIEZGVF9GSVhFRF8zMiAwCisjaW5jbHVkZSAiZmZ0X3RlbXBsYXRlLmMiCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mZnRfZml4ZWRfMzIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdF9maXhlZF8zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZGJmODQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mZnRfZml4ZWRfMzIuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyCisgKiAgICAgIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBDYWxpZm9ybmlhLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQXV0aG9yczogIFN0YW5pc2xhdiBPY292YWogKHNvY292YWpAbWlwcy5jb20pCisgKiAgICAgICAgICAgR29yYW4gQ29yZGFzaWMgICAoZ29yYW5AbWlwcy5jb20pCisgKiAgICAgICAgICAgRGpvcmRqZSBQZXN1dCAgICAoZGpvcmRqZUBtaXBzLmNvbSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBGRlRfRkxPQVQgMAorI2RlZmluZSBGRlRfRklYRURfMzIgMQorI2luY2x1ZGUgImZmdF90ZW1wbGF0ZS5jIgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0X2Zsb2F0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mZnRfZmxvYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2NjOThkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0X2Zsb2F0LmMKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIEZGVF9GTE9BVCAxCisjZGVmaW5lIEZGVF9GSVhFRF8zMiAwCisjaW5jbHVkZSAiZmZ0X3RlbXBsYXRlLmMiCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mZnRfaW5pdF90YWJsZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0X2luaXRfdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDc0ZjhhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0X2luaXRfdGFibGUuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcnM6ICBTdGFuaXNsYXYgT2NvdmFqIChzb2NvdmFqQG1pcHMuY29tKQorICogICAgICAgICAgIEdvcmFuIENvcmRhc2ljICAgKGdvcmFuQG1pcHMuY29tKQorICogICAgICAgICAgIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamVAbWlwcy5jb20pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGRlZmluaXRpb25zIGFuZCBpbml0aWFsaXphdGlvbiBvZiBMVVQgdGFibGUgZm9yIEZGVAorICovCisjaW5jbHVkZSAibGliYXZjb2RlYy9mZnRfdGFibGUuaCIKKworY29uc3QgaW50MzJfdCBmZl93X3RhYl9zcltNQVhfRkZUX1NJWkUvKDQqMTYpXSA9IHsKKyAgICAyMTQ3NDgzNjQ3LCAyMTQ3NDgxMTIxLCAyMTQ3NDczNTQyLCAyMTQ3NDYwOTA4LCAyMTQ3NDQzMjIyLCAyMTQ3NDIwNDgzLCAyMTQ3MzkyNjkwLCAyMTQ3MzU5ODQ1LAorICAgIDIxNDczMjE5NDYsIDIxNDcyNzg5OTUsIDIxNDcyMzA5OTEsIDIxNDcxNzc5MzQsIDIxNDcxMTk4MjUsIDIxNDcwNTY2NjQsIDIxNDY5ODg0NTAsIDIxNDY5MTUxODQsCisgICAgMjE0NjgzNjg2NiwgMjE0Njc1MzQ5NywgMjE0NjY2NTA3NiwgMjE0NjU3MTYwMywgMjE0NjQ3MzA4MCwgMjE0NjM2OTUwNSwgMjE0NjI2MDg4MSwgMjE0NjE0NzIwNSwKKyAgICAyMTQ2MDI4NDgwLCAyMTQ1OTA0NzA1LCAyMTQ1Nzc1ODgwLCAyMTQ1NjQyMDA2LCAyMTQ1NTAzMDgzLCAyMTQ1MzU5MTEyLCAyMTQ1MjEwMDkyLCAyMTQ1MDU2MDI1LAorICAgIDIxNDQ4OTY5MTAsIDIxNDQ3MzI3NDgsIDIxNDQ1NjM1MzksIDIxNDQzODkyODMsIDIxNDQyMDk5ODIsIDIxNDQwMjU2MzUsIDIxNDM4MzYyNDQsIDIxNDM2NDE4MDcsCisgICAgMjE0MzQ0MjMyNiwgMjE0MzIzNzgwMiwgMjE0MzAyODIzNCwgMjE0MjgxMzYyNCwgMjE0MjU5Mzk3MSwgMjE0MjM2OTI3NiwgMjE0MjEzOTU0MSwgMjE0MTkwNDc2NCwKKyAgICAyMTQxNjY0OTQ4LCAyMTQxNDIwMDkyLCAyMTQxMTcwMTk3LCAyMTQwOTE1MjY0LCAyMTQwNjU1MjkzLCAyMTQwMzkwMjg0LCAyMTQwMTIwMjQwLCAyMTM5ODQ1MTU5LAorICAgIDIxMzk1NjUwNDMsIDIxMzkyNzk4OTIsIDIxMzg5ODk3MDgsIDIxMzg2OTQ0OTAsIDIxMzgzOTQyNDAsIDIxMzgwODg5NTgsIDIxMzc3Nzg2NDQsIDIxMzc0NjMzMDEsCisgICAgMjEzNzE0MjkyNywgMjEzNjgxNzUyNSwgMjEzNjQ4NzA5NSwgMjEzNjE1MTYzNywgMjEzNTgxMTE1MywgMjEzNTQ2NTY0MiwgMjEzNTExNTEwNywgMjEzNDc1OTU0OCwKKyAgICAyMTM0Mzk4OTY2LCAyMTM0MDMzMzYxLCAyMTMzNjYyNzM0LCAyMTMzMjg3MDg3LCAyMTMyOTA2NDIwLCAyMTMyNTIwNzM0LCAyMTMyMTMwMDMwLCAyMTMxNzM0MzA5LAorICAgIDIxMzEzMzM1NzIsIDIxMzA5Mjc4MTksIDIxMzA1MTcwNTIsIDIxMzAxMDEyNzIsIDIxMjk2ODA0ODAsIDIxMjkyNTQ2NzYsIDIxMjg4MjM4NjIsIDIxMjgzODgwMzgsCisgICAgMjEyNzk0NzIwNiwgMjEyNzUwMTM2NywgMjEyNzA1MDUyMiwgMjEyNjU5NDY3MiwgMjEyNjEzMzgxNywgMjEyNTY2Nzk2MCwgMjEyNTE5NzEwMCwgMjEyNDcyMTI0MCwKKyAgICAyMTI0MjQwMzgwLCAyMTIzNzU0NTIyLCAyMTIzMjYzNjY2LCAyMTIyNzY3ODE0LCAyMTIyMjY2OTY3LCAyMTIxNzYxMTI2LCAyMTIxMjUwMjkyLCAyMTIwNzM0NDY3LAorICAgIDIxMjAyMTM2NTEsIDIxMTk2ODc4NDcsIDIxMTkxNTcwNTQsIDIxMTg2MjEyNzUsIDIxMTgwODA1MTEsIDIxMTc1MzQ3NjIsIDIxMTY5ODQwMzEsIDIxMTY0MjgzMTksCisgICAgMjExNTg2NzYyNiwgMjExNTMwMTk1NCwgMjExNDczMTMwNSwgMjExNDE1NTY4MCwgMjExMzU3NTA4MCwgMjExMjk4OTUwNiwgMjExMjM5ODk2MCwgMjExMTgwMzQ0NCwKKyAgICAyMTExMjAyOTU5LCAyMTEwNTk3NTA1LCAyMTA5OTg3MDg1LCAyMTA5MzcxNzAwLCAyMTA4NzUxMzUyLCAyMTA4MTI2MDQxLCAyMTA3NDk1NzcwLCAyMTA2ODYwNTQwLAorICAgIDIxMDYyMjAzNTIsIDIxMDU1NzUyMDgsIDIxMDQ5MjUxMDksIDIxMDQyNzAwNTcsIDIxMDM2MTAwNTQsIDIxMDI5NDUxMDEsIDIxMDIyNzUxOTksIDIxMDE2MDAzNTAsCisgICAgMjEwMDkyMDU1NiwgMjEwMDIzNTgxOSwgMjA5OTU0NjEzOSwgMjA5ODg1MTUxOSwgMjA5ODE1MTk2MCwgMjA5NzQ0NzQ2NCwgMjA5NjczODAzMiwgMjA5NjAyMzY2NywKKyAgICAyMDk1MzA0MzcwLCAyMDk0NTgwMTQyLCAyMDkzODUwOTg1LCAyMDkzMTE2OTAxLCAyMDkyMzc3ODkyLCAyMDkxNjMzOTYwLCAyMDkwODg1MTA1LCAyMDkwMTMxMzMxLAorICAgIDIwODkzNzI2MzgsIDIwODg2MDkwMjksIDIwODc4NDA1MDUsIDIwODcwNjcwNjgsIDIwODYyODg3MjAsIDIwODU1MDU0NjMsIDIwODQ3MTcyOTgsIDIwODM5MjQyMjgsCisgICAgMjA4MzEyNjI1NCwgMjA4MjMyMzM3OSwgMjA4MTUxNTYwMywgMjA4MDcwMjkzMCwgMjA3OTg4NTM2MCwgMjA3OTA2Mjg5NiwgMjA3ODIzNTU0MCwgMjA3NzQwMzI5NCwKKyAgICAyMDc2NTY2MTYwLCAyMDc1NzI0MTM5LCAyMDc0ODc3MjMzLCAyMDc0MDI1NDQ2LCAyMDczMTY4Nzc3LCAyMDcyMzA3MjMxLCAyMDcxNDQwODA4LCAyMDcwNTY5NTExLAorICAgIDIwNjk2OTMzNDIsIDIwNjg4MTIzMDIsIDIwNjc5MjYzOTQsIDIwNjcwMzU2MjEsIDIwNjYxMzk5ODMsIDIwNjUyMzk0ODQsIDIwNjQzMzQxMjQsIDIwNjM0MjM5MDgsCisgICAgMjA2MjUwODgzNSwgMjA2MTU4ODkxMCwgMjA2MDY2NDEzMywgMjA1OTczNDUwOCwgMjA1ODgwMDAzNiwgMjA1Nzg2MDcxOSwgMjA1NjkxNjU2MCwgMjA1NTk2NzU2MCwKKyAgICAyMDU1MDEzNzIzLCAyMDU0MDU1MDUwLCAyMDUzMDkxNTQ0LCAyMDUyMTIzMjA3LCAyMDUxMTUwMDQwLCAyMDUwMTcyMDQ4LCAyMDQ5MTg5MjMxLCAyMDQ4MjAxNTkyLAorICAgIDIwNDcyMDkxMzMsIDIwNDYyMTE4NTcsIDIwNDUyMDk3NjcsIDIwNDQyMDI4NjMsIDIwNDMxOTExNTAsIDIwNDIxNzQ2MjgsIDIwNDExNTMzMDEsIDIwNDAxMjcxNzIsCisgICAgMjAzOTA5NjI0MSwgMjAzODA2MDUxMiwgMjAzNzAxOTk4OCwgMjAzNTk3NDY3MCwgMjAzNDkyNDU2MiwgMjAzMzg2OTY2NSwgMjAzMjgwOTk4MiwgMjAzMTc0NTUxNiwKKyAgICAyMDMwNjc2MjY5LCAyMDI5NjAyMjQzLCAyMDI4NTIzNDQyLCAyMDI3NDM5ODY3LCAyMDI2MzUxNTIyLCAyMDI1MjU4NDA4LCAyMDI0MTYwNTI5LCAyMDIzMDU3ODg3LAorICAgIDIwMjE5NTA0ODQsIDIwMjA4MzgzMjMsIDIwMTk3MjE0MDcsIDIwMTg1OTk3MzksIDIwMTc0NzMzMjEsIDIwMTYzNDIxNTUsIDIwMTUyMDYyNDUsIDIwMTQwNjU1OTIsCisgICAgMjAxMjkyMDIwMSwgMjAxMTc3MDA3MywgMjAxMDYxNTIxMCwgMjAwOTQ1NTYxNywgMjAwODI5MTI5NSwgMjAwNzEyMjI0OCwgMjAwNTk0ODQ3OCwgMjAwNDc2OTk4NywKKyAgICAyMDAzNTg2Nzc5LCAyMDAyMzk4ODU3LCAyMDAxMjA2MjIyLCAyMDAwMDA4ODc5LCAxOTk4ODA2ODI5LCAxOTk3NjAwMDc2LCAxOTk2Mzg4NjIyLCAxOTk1MTcyNDcxLAorICAgIDE5OTM5NTE2MjUsIDE5OTI3MjYwODcsIDE5OTE0OTU4NjAsIDE5OTAyNjA5NDYsIDE5ODkwMjEzNTAsIDE5ODc3NzcwNzMsIDE5ODY1MjgxMTgsIDE5ODUyNzQ0ODksCisgICAgMTk4NDAxNjE4OSwgMTk4Mjc1MzIyMCwgMTk4MTQ4NTU4NSwgMTk4MDIxMzI4OCwgMTk3ODkzNjMzMSwgMTk3NzY1NDcxNywgMTk3NjM2ODQ1MCwgMTk3NTA3NzUzMiwKKyAgICAxOTczNzgxOTY3LCAxOTcyNDgxNzU3LCAxOTcxMTc2OTA2LCAxOTY5ODY3NDE3LCAxOTY4NTUzMjkyLCAxOTY3MjM0NTM1LCAxOTY1OTExMTQ4LCAxOTY0NTgzMTM2LAorICAgIDE5NjMyNTA1MDEsIDE5NjE5MTMyNDYsIDE5NjA1NzEzNzUsIDE5NTkyMjQ4OTAsIDE5NTc4NzM3OTYsIDE5NTY1MTgwOTMsIDE5NTUxNTc3ODgsIDE5NTM3OTI4ODEsCisgICAgMTk1MjQyMzM3NywgMTk1MTA0OTI3OSwgMTk0OTY3MDU4OSwgMTk0ODI4NzMxMiwgMTk0Njg5OTQ1MSwgMTk0NTUwNzAwOCwgMTk0NDEwOTk4NywgMTk0MjcwODM5MiwKKyAgICAxOTQxMzAyMjI1LCAxOTM5ODkxNDkwLCAxOTM4NDc2MTkwLCAxOTM3MDU2MzI5LCAxOTM1NjMxOTEwLCAxOTM0MjAyOTM2LCAxOTMyNzY5NDExLCAxOTMxMzMxMzM4LAorICAgIDE5Mjk4ODg3MjAsIDE5Mjg0NDE1NjEsIDE5MjY5ODk4NjQsIDE5MjU1MzM2MzMsIDE5MjQwNzI4NzEsIDE5MjI2MDc1ODEsIDE5MjExMzc3NjcsIDE5MTk2NjM0MzIsCisgICAgMTkxODE4NDU4MSwgMTkxNjcwMTIxNiwgMTkxNTIxMzM0MCwgMTkxMzcyMDk1OCwgMTkxMjIyNDA3MywgMTkxMDcyMjY4OCwgMTkwOTIxNjgwNiwgMTkwNzcwNjQzMywKKyAgICAxOTA2MTkxNTcwLCAxOTA0NjcyMjIyLCAxOTAzMTQ4MzkyLCAxOTAxNjIwMDg0LCAxOTAwMDg3MzAxLCAxODk4NTUwMDQ3LCAxODk3MDA4MzI1LCAxODk1NDYyMTQwLAorICAgIDE4OTM5MTE0OTQsIDE4OTIzNTYzOTIsIDE4OTA3OTY4MzcsIDE4ODkyMzI4MzIsIDE4ODc2NjQzODMsIDE4ODYwOTE0OTEsIDE4ODQ1MTQxNjEsIDE4ODI5MzIzOTcsCisgICAgMTg4MTM0NjIwMiwgMTg3OTc1NTU4MCwgMTg3ODE2MDUzNSwgMTg3NjU2MTA3MCwgMTg3NDk1NzE4OSwgMTg3MzM0ODg5NywgMTg3MTczNjE5NiwgMTg3MDExOTA5MSwKKyAgICAxODY4NDk3NTg2LCAxODY2ODcxNjgzLCAxODY1MjQxMzg4LCAxODYzNjA2NzA0LCAxODYxOTY3NjM0LCAxODYwMzI0MTgzLCAxODU4Njc2MzU1LCAxODU3MDI0MTUzLAorICAgIDE4NTUzNjc1ODEsIDE4NTM3MDY2NDMsIDE4NTIwNDEzNDMsIDE4NTAzNzE2ODYsIDE4NDg2OTc2NzQsIDE4NDcwMTkzMTIsIDE4NDUzMzY2MDQsIDE4NDM2NDk1NTMsCisgICAgMTg0MTk1ODE2NCwgMTg0MDI2MjQ0MSwgMTgzODU2MjM4OCwgMTgzNjg1ODAwOCwgMTgzNTE0OTMwNiwgMTgzMzQzNjI4NiwgMTgzMTcxODk1MSwgMTgyOTk5NzMwNywKKyAgICAxODI4MjcxMzU2LCAxODI2NTQxMTAzLCAxODI0ODA2NTUyLCAxODIzMDY3NzA3LCAxODIxMzI0NTcyLCAxODE5NTc3MTUxLCAxODE3ODI1NDQ5LCAxODE2MDY5NDY5LAorICAgIDE4MTQzMDkyMTYsIDE4MTI1NDQ2OTQsIDE4MTA3NzU5MDYsIDE4MDkwMDI4NTgsIDE4MDcyMjU1NTMsIDE4MDU0NDM5OTUsIDE4MDM2NTgxODksIDE4MDE4NjgxMzksCisgICAgMTgwMDA3Mzg0OSwgMTc5ODI3NTMyMywgMTc5NjQ3MjU2NSwgMTc5NDY2NTU4MCwgMTc5Mjg1NDM3MiwgMTc5MTAzODk0NiwgMTc4OTIxOTMwNSwgMTc4NzM5NTQ1MywKKyAgICAxNzg1NTY3Mzk2LCAxNzgzNzM1MTM3LCAxNzgxODk4NjgxLCAxNzgwMDU4MDMyLCAxNzc4MjEzMTk0LCAxNzc2MzY0MTcyLCAxNzc0NTEwOTcwLCAxNzcyNjUzNTkzLAorICAgIDE3NzA3OTIwNDQsIDE3Njg5MjYzMjgsIDE3NjcwNTY0NTAsIDE3NjUxODI0MTQsIDE3NjMzMDQyMjQsIDE3NjE0MjE4ODUsIDE3NTk1MzU0MDEsIDE3NTc2NDQ3NzcsCisgICAgMTc1NTc1MDAxNywgMTc1Mzg1MTEyNiwgMTc1MTk0ODEwNywgMTc1MDA0MDk2NiwgMTc0ODEyOTcwNywgMTc0NjIxNDMzNCwgMTc0NDI5NDg1MywgMTc0MjM3MTI2NywKKyAgICAxNzQwNDQzNTgxLCAxNzM4NTExNzk5LCAxNzM2NTc1OTI3LCAxNzM0NjM1OTY4LCAxNzMyNjkxOTI4LCAxNzMwNzQzODEwLCAxNzI4NzkxNjIwLCAxNzI2ODM1MzYxLAorICAgIDE3MjQ4NzUwNDAsIDE3MjI5MTA2NTksIDE3MjA5NDIyMjUsIDE3MTg5Njk3NDAsIDE3MTY5OTMyMTEsIDE3MTUwMTI2NDIsIDE3MTMwMjgwMzcsIDE3MTEwMzk0MDEsCisgICAgMTcwOTA0NjczOSwgMTcwNzA1MDA1NSwgMTcwNTA0OTM1NSwgMTcwMzA0NDY0MiwgMTcwMTAzNTkyMiwgMTY5OTAyMzE5OSwgMTY5NzAwNjQ3OSwgMTY5NDk4NTc2NSwKKyAgICAxNjkyOTYxMDYyLCAxNjkwOTMyMzc2LCAxNjg4ODk5NzExLCAxNjg2ODYzMDcyLCAxNjg0ODIyNDYzLCAxNjgyNzc3ODkwLCAxNjgwNzI5MzU3LCAxNjc4Njc2ODcwLAorICAgIDE2NzY2MjA0MzIsIDE2NzQ1NjAwNDksIDE2NzI0OTU3MjUsIDE2NzA0Mjc0NjYsIDE2NjgzNTUyNzYsIDE2NjYyNzkxNjEsIDE2NjQxOTkxMjQsIDE2NjIxMTUxNzIsCisgICAgMTY2MDAyNzMwOCwgMTY1NzkzNTUzOSwgMTY1NTgzOTg2NywgMTY1Mzc0MDMwMCwgMTY1MTYzNjg0MSwgMTY0OTUyOTQ5NiwgMTY0NzQxODI2OSwgMTY0NTMwMzE2NiwKKyAgICAxNjQzMTg0MTkxLCAxNjQxMDYxMzQ5LCAxNjM4OTM0NjQ2LCAxNjM2ODA0MDg3LCAxNjM0NjY5Njc2LCAxNjMyNTMxNDE4LCAxNjMwMzg5MzE5LCAxNjI4MjQzMzgzLAorICAgIDE2MjYwOTM2MTYsIDE2MjM5NDAwMjMsIDE2MjE3ODI2MDgsIDE2MTk2MjEzNzcsIDE2MTc0NTYzMzUsIDE2MTUyODc0ODcsIDE2MTMxMTQ4MzgsIDE2MTA5MzgzOTMsCisgICAgMTYwODc1ODE1NywgMTYwNjU3NDEzNiwgMTYwNDM4NjMzNSwgMTYwMjE5NDc1OCwgMTU5OTk5OTQxMSwgMTU5NzgwMDI5OSwgMTU5NTU5NzQyOCwgMTU5MzM5MDgwMSwKKyAgICAxNTkxMTgwNDI2LCAxNTg4OTY2MzA2LCAxNTg2NzQ4NDQ3LCAxNTg0NTI2ODU0LCAxNTgyMzAxNTMzLCAxNTgwMDcyNDg5LCAxNTc3ODM5NzI2LCAxNTc1NjAzMjUxLAorICAgIDE1NzMzNjMwNjgsIDE1NzExMTkxODMsIDE1Njg4NzE2MDEsIDE1NjY2MjAzMjcsIDE1NjQzNjUzNjcsIDE1NjIxMDY3MjUsIDE1NTk4NDQ0MDgsIDE1NTc1Nzg0MjEsCisgICAgMTU1NTMwODc2OCwgMTU1MzAzNTQ1NSwgMTU1MDc1ODQ4OCwgMTU0ODQ3Nzg3MiwgMTU0NjE5MzYxMiwgMTU0MzkwNTcxNCwgMTU0MTYxNDE4MywgMTUzOTMxOTAyNCwKKyAgICAxNTM3MDIwMjQ0LCAxNTM0NzE3ODQ2LCAxNTMyNDExODM3LCAxNTMwMTAyMjIyLCAxNTI3Nzg5MDA3LCAxNTI1NDcyMTk3LCAxNTIzMTUxNzk3LCAxNTIwODI3ODEzLAorICAgIDE1MTg1MDAyNTAsIDE1MTYxNjkxMTQsIDE1MTM4MzQ0MTEsIDE1MTE0OTYxNDUsIDE1MDkxNTQzMjIsIDE1MDY4MDg5NDksIDE1MDQ0NjAwMjksIDE1MDIxMDc1NzAsCisgICAgMTQ5OTc1MTU3NiwgMTQ5NzM5MjA1MywgMTQ5NTAyOTAwNiwgMTQ5MjY2MjQ0MSwgMTQ5MDI5MjM2NCwgMTQ4NzkxODc4MSwgMTQ4NTU0MTY5NiwgMTQ4MzE2MTExNSwKKyAgICAxNDgwNzc3MDQ0LCAxNDc4Mzg5NDg5LCAxNDc1OTk4NDU2LCAxNDczNjAzOTQ5LCAxNDcxMjA1OTc0LCAxNDY4ODA0NTM4LCAxNDY2Mzk5NjQ1LCAxNDYzOTkxMzAyLAorICAgIDE0NjE1Nzk1MTQsIDE0NTkxNjQyODYsIDE0NTY3NDU2MjUsIDE0NTQzMjM1MzYsIDE0NTE4OTgwMjUsIDE0NDk0NjkwOTgsIDE0NDcwMzY3NjAsIDE0NDQ2MDEwMTcsCisgICAgMTQ0MjE2MTg3NCwgMTQzOTcxOTMzOCwgMTQzNzI3MzQxNCwgMTQzNDgyNDEwOSwgMTQzMjM3MTQyNiwgMTQyOTkxNTM3NCwgMTQyNzQ1NTk1NiwgMTQyNDk5MzE4MCwKKyAgICAxNDIyNTI3MDUxLCAxNDIwMDU3NTc0LCAxNDE3NTg0NzU1LCAxNDE1MTA4NjAxLCAxNDEyNjI5MTE3LCAxNDEwMTQ2MzA5LCAxNDA3NjYwMTgzLCAxNDA1MTcwNzQ1LAorICAgIDE0MDI2NzgwMDAsIDE0MDAxODE5NTQsIDEzOTc2ODI2MTMsIDEzOTUxNzk5ODQsIDEzOTI2NzQwNzIsIDEzOTAxNjQ4ODIsIDEzODc2NTI0MjIsIDEzODUxMzY2OTYsCisgICAgMTM4MjYxNzcxMCwgMTM4MDA5NTQ3MiwgMTM3NzU2OTk4NiwgMTM3NTA0MTI1OCwgMTM3MjUwOTI5NCwgMTM2OTk3NDEwMSwgMTM2NzQzNTY4NSwgMTM2NDg5NDA1MCwKKyAgICAxMzYyMzQ5MjA0LCAxMzU5ODAxMTUyLCAxMzU3MjQ5OTAxLCAxMzU0Njk1NDU1LCAxMzUyMTM3ODIyLCAxMzQ5NTc3MDA3LCAxMzQ3MDEzMDE3LCAxMzQ0NDQ1ODU3LAorICAgIDEzNDE4NzU1MzMsIDEzMzkzMDIwNTIsIDEzMzY3MjU0MTksIDEzMzQxNDU2NDEsIDEzMzE1NjI3MjMsIDEzMjg5NzY2NzIsIDEzMjYzODc0OTQsIDEzMjM3OTUxOTUsCisgICAgMTMyMTE5OTc4MSwgMTMxODYwMTI1NywgMTMxNTk5OTYzMSwgMTMxMzM5NDkwOSwgMTMxMDc4NzA5NSwgMTMwODE3NjE5OCwgMTMwNTU2MjIyMiwgMTMwMjk0NTE3NCwKKyAgICAxMzAwMzI1MDYwLCAxMjk3NzAxODg2LCAxMjk1MDc1NjU5LCAxMjkyNDQ2Mzg0LCAxMjg5ODE0MDY4LCAxMjg3MTc4NzE3LCAxMjg0NTQwMzM3LCAxMjgxODk4OTM1LAorICAgIDEyNzkyNTQ1MTYsIDEyNzY2MDcwODYsIDEyNzM5NTY2NTMsIDEyNzEzMDMyMjIsIDEyNjg2NDY4MDAsIDEyNjU5ODczOTIsIDEyNjMzMjUwMDUsIDEyNjA2NTk2NDYsCisgICAgMTI1Nzk5MTMyMCwgMTI1NTMyMDAzNCwgMTI1MjY0NTc5NCwgMTI0OTk2ODYwNiwgMTI0NzI4ODQ3OCwgMTI0NDYwNTQxNCwgMTI0MTkxOTQyMSwgMTIzOTIzMDUwNiwKKyAgICAxMjM2NTM4Njc1LCAxMjMzODQzOTM1LCAxMjMxMTQ2MjkxLCAxMjI4NDQ1NzUwLCAxMjI1NzQyMzE4LCAxMjIzMDM2MDAyLCAxMjIwMzI2ODA5LCAxMjE3NjE0NzQzLAorICAgIDEyMTQ4OTk4MTMsIDEyMTIxODIwMjQsIDEyMDk0NjEzODIsIDEyMDY3Mzc4OTQsIDEyMDQwMTE1NjcsIDEyMDEyODI0MDcsIDExOTg1NTA0MTksIDExOTU4MTU2MTIsCisgICAgMTE5MzA3Nzk5MSwgMTE5MDMzNzU2MiwgMTE4NzU5NDMzMiwgMTE4NDg0ODMwOCwgMTE4MjA5OTQ5NiwgMTE3OTM0NzkwMiwgMTE3NjU5MzUzMywgMTE3MzgzNjM5NSwKKyAgICAxMTcxMDc2NDk1LCAxMTY4MzEzODQwLCAxMTY1NTQ4NDM1LCAxMTYyNzgwMjg4LCAxMTYwMDA5NDA1LCAxMTU3MjM1NzkyLCAxMTU0NDU5NDU2LCAxMTUxNjgwNDAzLAorICAgIDExNDg4OTg2NDAsIDExNDYxMTQxNzQsIDExNDMzMjcwMTEsIDExNDA1MzcxNTgsIDExMzc3NDQ2MjEsIDExMzQ5NDk0MDYsIDExMzIxNTE1MjEsIDExMjkzNTA5NzIsCisgICAgMTEyNjU0Nzc2NSwgMTEyMzc0MTkwOCwgMTEyMDkzMzQwNiwgMTExODEyMjI2NywgMTExNTMwODQ5NiwgMTExMjQ5MjEwMSwgMTEwOTY3MzA4OSwgMTEwNjg1MTQ2NSwKKyAgICAxMTA0MDI3MjM3LCAxMTAxMjAwNDEwLCAxMDk4MzcwOTkzLCAxMDk1NTM4OTkxLCAxMDkyNzA0NDExLCAxMDg5ODY3MjU5LCAxMDg3MDI3NTQ0LCAxMDg0MTg1MjcwLAorICAgIDEwODEzNDA0NDUsIDEwNzg0OTMwNzYsIDEwNzU2NDMxNjksIDEwNzI3OTA3MzAsIDEwNjk5MzU3NjgsIDEwNjcwNzgyODgsIDEwNjQyMTgyOTYsIDEwNjEzNTU4MDEsCisgICAgMTA1ODQ5MDgwOCwgMTA1NTYyMzMyNCwgMTA1Mjc1MzM1NywgMTA0OTg4MDkxMiwgMTA0NzAwNTk5NiwgMTA0NDEyODYxNywgMTA0MTI0ODc4MSwgMTAzODM2NjQ5NSwKKyAgICAxMDM1NDgxNzY2LCAxMDMyNTk0NjAwLCAxMDI5NzA1MDA0LCAxMDI2ODEyOTg1LCAxMDIzOTE4NTUwLCAxMDIxMDIxNzA1LCAxMDE4MTIyNDU4LCAxMDE1MjIwODE2LAorICAgIDEwMTIzMTY3ODQsIDEwMDk0MTAzNzAsIDEwMDY1MDE1ODEsIDEwMDM1OTA0MjQsIDEwMDA2NzY5MDUsICA5OTc3NjEwMzEsICA5OTQ4NDI4MTAsICA5OTE5MjIyNDgsCisgICAgIDk4ODk5OTM1MSwgIDk4NjA3NDEyNywgIDk4MzE0NjU4MywgIDk4MDIxNjcyNiwgIDk3NzI4NDU2MiwgIDk3NDM1MDA5OCwgIDk3MTQxMzM0MiwgIDk2ODQ3NDMwMCwKKyAgICAgOTY1NTMyOTc4LCAgOTYyNTg5Mzg1LCAgOTU5NjQzNTI3LCAgOTU2Njk1NDExLCAgOTUzNzQ1MDQzLCAgOTUwNzkyNDMxLCAgOTQ3ODM3NTgyLCAgOTQ0ODgwNTAzLAorICAgICA5NDE5MjEyMDAsICA5Mzg5NTk2ODEsICA5MzU5OTU5NTIsICA5MzMwMzAwMjEsICA5MzAwNjE4OTQsICA5MjcwOTE1NzksICA5MjQxMTkwODIsICA5MjExNDQ0MTEsCisgICAgIDkxODE2NzU3MiwgIDkxNTE4ODU3MiwgIDkxMjIwNzQxOSwgIDkwOTIyNDEyMCwgIDkwNjIzODY4MSwgIDkwMzI1MTExMCwgIDkwMDI2MTQxMywgIDg5NzI2OTU5NywKKyAgICAgODk0Mjc1NjcxLCAgODkxMjc5NjQwLCAgODg4MjgxNTEyLCAgODg1MjgxMjkzLCAgODgyMjc4OTkyLCAgODc5Mjc0NjE0LCAgODc2MjY4MTY3LCAgODczMjU5NjU5LAorICAgICA4NzAyNDkwOTUsICA4NjcyMzY0ODQsICA4NjQyMjE4MzIsICA4NjEyMDUxNDcsICA4NTgxODY0MzUsICA4NTUxNjU3MDMsICA4NTIxNDI5NTksICA4NDkxMTgyMTAsCisgICAgIDg0NjA5MTQ2MywgIDg0MzA2MjcyNiwgIDg0MDAzMjAwNCwgIDgzNjk5OTMwNSwgIDgzMzk2NDYzOCwgIDgzMDkyODAwNywgIDgyNzg4OTQyMiwgIDgyNDg0ODg4OCwKKyAgICAgODIxODA2NDEzLCAgODE4NzYyMDA1LCAgODE1NzE1NjcwLCAgODEyNjY3NDE1LCAgODA5NjE3MjQ5LCAgODA2NTY1MTc3LCAgODAzNTExMjA3LCAgODAwNDU1MzQ2LAorICAgICA3OTczOTc2MDIsICA3OTQzMzc5ODIsICA3OTEyNzY0OTIsICA3ODgyMTMxNDEsICA3ODUxNDc5MzQsICA3ODIwODA4ODAsICA3NzkwMTE5ODYsICA3NzU5NDEyNTksCisgICAgIDc3Mjg2ODcwNiwgIDc2OTc5NDMzNCwgIDc2NjcxODE1MSwgIDc2MzY0MDE2NCwgIDc2MDU2MDM4MCwgIDc1NzQ3ODgwNiwgIDc1NDM5NTQ0OSwgIDc1MTMxMDMxOCwKKyAgICAgNzQ4MjIzNDE4LCAgNzQ1MTM0NzU4LCAgNzQyMDQ0MzQ1LCAgNzM4OTUyMTg2LCAgNzM1ODU4Mjg3LCAgNzMyNzYyNjU3LCAgNzI5NjY1MzAzLCAgNzI2NTY2MjMyLAorICAgICA3MjM0NjU0NTEsICA3MjAzNjI5NjgsICA3MTcyNTg3OTAsICA3MTQxNTI5MjQsICA3MTEwNDUzNzcsICA3MDc5MzYxNTgsICA3MDQ4MjUyNzIsICA3MDE3MTI3MjgsCisgICAgIDY5ODU5ODUzMywgIDY5NTQ4MjY5NCwgIDY5MjM2NTIxOCwgIDY4OTI0NjExMywgIDY4NjEyNTM4NywgIDY4MzAwMzA0NSwgIDY3OTg3OTA5NywgIDY3Njc1MzU0OSwKKyAgICAgNjczNjI2NDA4LCAgNjcwNDk3NjgyLCAgNjY3MzY3Mzc5LCAgNjY0MjM1NTA1LCAgNjYxMTAyMDY4LCAgNjU3OTY3MDc1LCAgNjU0ODMwNTM1LCAgNjUxNjkyNDUzLAorICAgICA2NDg1NTI4MzgsICA2NDU0MTE2OTYsICA2NDIyNjkwMzYsICA2MzkxMjQ4NjUsICA2MzU5NzkxOTAsICA2MzI4MzIwMTgsICA2Mjk2ODMzNTcsICA2MjY1MzMyMTUsCisgICAgIDYyMzM4MTU5OCwgIDYyMDIyODUxNCwgIDYxNzA3Mzk3MSwgIDYxMzkxNzk3NSwgIDYxMDc2MDUzNiwgIDYwNzYwMTY1OCwgIDYwNDQ0MTM1MiwgIDYwMTI3OTYyMywKKyAgICAgNTk4MTE2NDc5LCAgNTk0OTUxOTI3LCAgNTkxNzg1OTc2LCAgNTg4NjE4NjMyLCAgNTg1NDQ5OTAzLCAgNTgyMjc5Nzk2LCAgNTc5MTA4MzIwLCAgNTc1OTM1NDgwLAorICAgICA1NzI3NjEyODUsICA1Njk1ODU3NDMsICA1NjY0MDg4NjAsICA1NjMyMzA2NDUsICA1NjAwNTExMDQsICA1NTY4NzAyNDUsICA1NTM2ODgwNzYsICA1NTA1MDQ2MDQsCisgICAgIDU0NzMxOTgzNiwgIDU0NDEzMzc4MSwgIDU0MDk0NjQ0NSwgIDUzNzc1NzgzNywgIDUzNDU2Nzk2MywgIDUzMTM3NjgzMSwgIDUyODE4NDQ0OSwgIDUyNDk5MDgyNCwKKyAgICAgNTIxNzk1OTYzLCAgNTE4NTk5ODc1LCAgNTE1NDAyNTY2LCAgNTEyMjA0MDQ1LCAgNTA5MDA0MzE4LCAgNTA1ODAzMzk0LCAgNTAyNjAxMjc5LCAgNDk5Mzk3OTgyLAorICAgICA0OTYxOTM1MDksICA0OTI5ODc4NjksICA0ODk3ODEwNjksICA0ODY1NzMxMTcsICA0ODMzNjQwMTksICA0ODAxNTM3ODQsICA0NzY5NDI0MTksICA0NzM3Mjk5MzIsCisgICAgIDQ3MDUxNjMzMCwgIDQ2NzMwMTYyMiwgIDQ2NDA4NTgxMywgIDQ2MDg2ODkxMiwgIDQ1NzY1MDkyNywgIDQ1NDQzMTg2NSwgIDQ1MTIxMTczNCwgIDQ0Nzk5MDU0MSwKKyAgICAgNDQ0NzY4Mjk0LCAgNDQxNTQ1MDAwLCAgNDM4MzIwNjY3LCAgNDM1MDk1MzAzLCAgNDMxODY4OTE1LCAgNDI4NjQxNTExLCAgNDI1NDEzMDk4LCAgNDIyMTgzNjg0LAorICAgICA0MTg5NTMyNzYsICA0MTU3MjE4ODMsICA0MTI0ODk1MTIsICA0MDkyNTYxNzAsICA0MDYwMjE4NjUsICA0MDI3ODY2MDQsICAzOTk1NTAzOTYsICAzOTYzMTMyNDcsCisgICAgIDM5MzA3NTE2NiwgIDM4OTgzNjE2MCwgIDM4NjU5NjIzNywgIDM4MzM1NTQwNCwgIDM4MDExMzY2OSwgIDM3Njg3MTAzOSwgIDM3MzYyNzUyMywgIDM3MDM4MzEyOCwKKyAgICAgMzY3MTM3ODYxLCAgMzYzODkxNzMwLCAgMzYwNjQ0NzQyLCAgMzU3Mzk2OTA2LCAgMzU0MTQ4MjMwLCAgMzUwODk4NzE5LCAgMzQ3NjQ4MzgzLCAgMzQ0Mzk3MjMwLAorICAgICAzNDExNDUyNjUsICAzMzc4OTI0OTgsICAzMzQ2Mzg5MzYsICAzMzEzODQ1ODYsICAzMjgxMjk0NTcsICAzMjQ4NzM1NTUsICAzMjE2MTY4ODksICAzMTgzNTk0NjYsCisgICAgIDMxNTEwMTI5NSwgIDMxMTg0MjM4MSwgIDMwODU4MjczNCwgIDMwNTMyMjM2MSwgIDMwMjA2MTI2OSwgIDI5ODc5OTQ2NiwgIDI5NTUzNjk2MSwgIDI5MjI3Mzc2MCwKKyAgICAgMjg5MDA5ODcxLCAgMjg1NzQ1MzAyLCAgMjgyNDgwMDYxLCAgMjc5MjE0MTU1LCAgMjc1OTQ3NTkyLCAgMjcyNjgwMzc5LCAgMjY5NDEyNTI1LCAgMjY2MTQ0MDM4LAorICAgICAyNjI4NzQ5MjMsICAyNTk2MDUxOTEsICAyNTYzMzQ4NDcsICAyNTMwNjM5MDAsICAyNDk3OTIzNTgsICAyNDY1MjAyMjgsICAyNDMyNDc1MTgsICAyMzk5NzQyMzUsCisgICAgIDIzNjcwMDM4OCwgIDIzMzQyNTk4NCwgIDIzMDE1MTAzMCwgIDIyNjg3NTUzNSwgIDIyMzU5OTUwNiwgIDIyMDMyMjk1MSwgIDIxNzA0NTg3OCwgIDIxMzc2ODI5MywKKyAgICAgMjEwNDkwMjA2LCAgMjA3MjExNjI0LCAgMjAzOTMyNTUzLCAgMjAwNjUzMDAzLCAgMTk3MzcyOTgxLCAgMTk0MDkyNDk1LCAgMTkwODExNTUxLCAgMTg3NTMwMTU5LAorICAgICAxODQyNDgzMjUsICAxODA5NjYwNTgsICAxNzc2ODMzNjUsICAxNzQ0MDAyNTQsICAxNzExMTY3MzMsICAxNjc4MzI4MDgsICAxNjQ1NDg0ODksICAxNjEyNjM3ODMsCisgICAgIDE1Nzk3ODY5NywgIDE1NDY5MzI0MCwgIDE1MTQwNzQxOCwgIDE0ODEyMTI0MSwgIDE0NDgzNDcxNCwgIDE0MTU0Nzg0NywgIDEzODI2MDY0NywgIDEzNDk3MzEyMiwKKyAgICAgMTMxNjg1Mjc4LCAgMTI4Mzk3MTI1LCAgMTI1MTA4NjcwLCAgMTIxODE5OTIxLCAgMTE4NTMwODg1LCAgMTE1MjQxNTcwLCAgMTExOTUxOTgzLCAgMTA4NjYyMTM0LAorICAgICAxMDUzNzIwMjgsICAxMDIwODE2NzUsICAgOTg3OTEwODEsICAgOTU1MDAyNTUsICAgOTIyMDkyMDUsICAgODg5MTc5MzcsICAgODU2MjY0NjAsICAgODIzMzQ3ODIsCisgICAgICA3OTA0MjkwOSwgICA3NTc1MDg1MSwgICA3MjQ1ODYxNSwgICA2OTE2NjIwOCwgICA2NTg3MzYzOCwgICA2MjU4MDkxNCwgICA1OTI4ODA0MiwgICA1NTk5NTAzMCwKKyAgICAgIDUyNzAxODg3LCAgIDQ5NDA4NjIwLCAgIDQ2MTE1MjM2LCAgIDQyODIxNzQ0LCAgIDM5NTI4MTUxLCAgIDM2MjM0NDY2LCAgIDMyOTQwNjk1LCAgIDI5NjQ2ODQ2LAorICAgICAgMjYzNTI5MjgsICAgMjMwNTg5NDcsICAgMTk3NjQ5MTMsICAgMTY0NzA4MzIsICAgMTMxNzY3MTIsICAgIDk4ODI1NjEsICAgIDY1ODgzODcsICAgIDMyOTQxOTcKK307CisKK3VpbnQxNl90IGZmX2ZmdF9vZmZzZXRzX2x1dFsweDJhYWJdOworCit2b2lkIGZmX2ZmdF9sdXRfaW5pdCh1aW50MTZfdCAqdGFibGUsIGludCBvZmYsIGludCBzaXplLCBpbnQgKmluZGV4KQoreworICAgIGlmIChzaXplIDwgMTYpIHsKKyAgICAgICAgdGFibGVbKmluZGV4XSA9IG9mZiA+PiAyOworICAgICAgICAoKmluZGV4KSsrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZmZfZmZ0X2x1dF9pbml0KHRhYmxlLCBvZmYsIHNpemU+PjEsIGluZGV4KTsKKyAgICAgICAgZmZfZmZ0X2x1dF9pbml0KHRhYmxlLCBvZmYrKHNpemU+PjEpLCBzaXplPj4yLCBpbmRleCk7CisgICAgICAgIGZmX2ZmdF9sdXRfaW5pdCh0YWJsZSwgb2ZmKzMqKHNpemU+PjIpLCBzaXplPj4yLCBpbmRleCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0X3RhYmxlLmggYi9mZm1wZWcvbGliYXZjb2RlYy9mZnRfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWU1NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0X3RhYmxlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcnM6ICBTdGFuaXNsYXYgT2NvdmFqIChzb2NvdmFqQG1pcHMuY29tKQorICogICAgICAgICAgIEdvcmFuIENvcmRhc2ljICAgKGdvcmFuQG1pcHMuY29tKQorICogICAgICAgICAgIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamVAbWlwcy5jb20pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGRlZmluaXRpb25zIGFuZCB0YWJsZXMgZm9yIEZGVAorICovCisjaWZuZGVmIEFWQ09ERUNfRkZUX1RBQkxFX0gKKyNkZWZpbmUgQVZDT0RFQ19GRlRfVEFCTEVfSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy9mZnQuaCIKKworI2RlZmluZSBNQVhfTE9HMl9ORkZUIDE2IC8vITwgU3BlY2lmaWVzIG1heGltdW0gYWxsb3dlZCBmZnQgc2l6ZQorI2RlZmluZSBNQVhfRkZUX1NJWkUgKDEgPDwgTUFYX0xPRzJfTkZGVCkKKworZXh0ZXJuIGNvbnN0IGludDMyX3QgZmZfd190YWJfc3JbXTsKK2V4dGVybiB1aW50MTZfdCBmZl9mZnRfb2Zmc2V0c19sdXRbXTsKK3ZvaWQgZmZfZmZ0X2x1dF9pbml0KHVpbnQxNl90ICp0YWJsZSwgaW50IG9mZiwgaW50IHNpemUsIGludCAqaW5kZXgpOworCisjZW5kaWYgLyogQVZDT0RFQ19GRlRfVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0X3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mZnRfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2VhNDUzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmZ0X3RlbXBsYXRlLmMKQEAgLTAsMCArMSw1MjggQEAKKy8qCisgKiBGRlQvSUZGVCB0cmFuc2Zvcm1zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTG9yZW4gTWVycml0dAorICogQ29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICogUGFydGx5IGJhc2VkIG9uIGxpYmRqYmZmdCBieSBELiBKLiBCZXJuc3RlaW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRkZUL0lGRlQgdHJhbnNmb3Jtcy4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAiZmZ0LmgiCisjaW5jbHVkZSAiZmZ0LWludGVybmFsLmgiCisKKyNpZiBGRlRfRklYRURfMzIKKyNpbmNsdWRlICJmZnRfdGFibGUuaCIKKyNlbHNlIC8qIEZGVF9GSVhFRF8zMiAqLworCisvKiBjb3MoMipwaSp4L24pIGZvciAwPD14PD1uLzQsIGZvbGxvd2VkIGJ5IGl0cyByZXZlcnNlICovCisjaWYgIUNPTkZJR19IQVJEQ09ERURfVEFCTEVTCitDT1NUQUJMRSgxNik7CitDT1NUQUJMRSgzMik7CitDT1NUQUJMRSg2NCk7CitDT1NUQUJMRSgxMjgpOworQ09TVEFCTEUoMjU2KTsKK0NPU1RBQkxFKDUxMik7CitDT1NUQUJMRSgxMDI0KTsKK0NPU1RBQkxFKDIwNDgpOworQ09TVEFCTEUoNDA5Nik7CitDT1NUQUJMRSg4MTkyKTsKK0NPU1RBQkxFKDE2Mzg0KTsKK0NPU1RBQkxFKDMyNzY4KTsKK0NPU1RBQkxFKDY1NTM2KTsKKyNlbmRpZgorQ09TVEFCTEVfQ09OU1QgRkZUU2FtcGxlICogY29uc3QgRkZUX05BTUUoZmZfY29zX3RhYnMpW10gPSB7CisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICBGRlRfTkFNRShmZl9jb3NfMTYpLAorICAgIEZGVF9OQU1FKGZmX2Nvc18zMiksCisgICAgRkZUX05BTUUoZmZfY29zXzY0KSwKKyAgICBGRlRfTkFNRShmZl9jb3NfMTI4KSwKKyAgICBGRlRfTkFNRShmZl9jb3NfMjU2KSwKKyAgICBGRlRfTkFNRShmZl9jb3NfNTEyKSwKKyAgICBGRlRfTkFNRShmZl9jb3NfMTAyNCksCisgICAgRkZUX05BTUUoZmZfY29zXzIwNDgpLAorICAgIEZGVF9OQU1FKGZmX2Nvc180MDk2KSwKKyAgICBGRlRfTkFNRShmZl9jb3NfODE5MiksCisgICAgRkZUX05BTUUoZmZfY29zXzE2Mzg0KSwKKyAgICBGRlRfTkFNRShmZl9jb3NfMzI3NjgpLAorICAgIEZGVF9OQU1FKGZmX2Nvc182NTUzNiksCit9OworCisjZW5kaWYgLyogRkZUX0ZJWEVEXzMyICovCisKK3N0YXRpYyB2b2lkIGZmdF9wZXJtdXRlX2MoRkZUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqeik7CitzdGF0aWMgdm9pZCBmZnRfY2FsY19jKEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopOworCitzdGF0aWMgaW50IHNwbGl0X3JhZGl4X3Blcm11dGF0aW9uKGludCBpLCBpbnQgbiwgaW50IGludmVyc2UpCit7CisgICAgaW50IG07CisgICAgaWYobiA8PSAyKSByZXR1cm4gaSYxOworICAgIG0gPSBuID4+IDE7CisgICAgaWYoIShpJm0pKSAgICAgICAgICAgIHJldHVybiBzcGxpdF9yYWRpeF9wZXJtdXRhdGlvbihpLCBtLCBpbnZlcnNlKSoyOworICAgIG0gPj49IDE7CisgICAgaWYoaW52ZXJzZSA9PSAhKGkmbSkpIHJldHVybiBzcGxpdF9yYWRpeF9wZXJtdXRhdGlvbihpLCBtLCBpbnZlcnNlKSo0ICsgMTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwbGl0X3JhZGl4X3Blcm11dGF0aW9uKGksIG0sIGludmVyc2UpKjQgLSAxOworfQorCithdl9jb2xkIHZvaWQgZmZfaW5pdF9mZl9jb3NfdGFicyhpbnQgaW5kZXgpCit7CisjaWYgKCFDT05GSUdfSEFSRENPREVEX1RBQkxFUykgJiYgKCFGRlRfRklYRURfMzIpCisgICAgaW50IGk7CisgICAgaW50IG0gPSAxPDxpbmRleDsKKyAgICBkb3VibGUgZnJlcSA9IDIqTV9QSS9tOworICAgIEZGVFNhbXBsZSAqdGFiID0gRkZUX05BTUUoZmZfY29zX3RhYnMpW2luZGV4XTsKKyAgICBmb3IoaT0wOyBpPD1tLzQ7IGkrKykKKyAgICAgICAgdGFiW2ldID0gRklYMTUoY29zKGkqZnJlcSkpOworICAgIGZvcihpPTE7IGk8bS80OyBpKyspCisgICAgICAgIHRhYlttLzItaV0gPSB0YWJbaV07CisjZW5kaWYKK30KKworc3RhdGljIGNvbnN0IGludCBhdnhfdGFiW10gPSB7CisgICAgMCwgNCwgMSwgNSwgOCwgMTIsIDksIDEzLCAyLCA2LCAzLCA3LCAxMCwgMTQsIDExLCAxNQorfTsKKworc3RhdGljIGludCBpc19zZWNvbmRfaGFsZl9vZl9mZnQzMihpbnQgaSwgaW50IG4pCit7CisgICAgaWYgKG4gPD0gMzIpCisgICAgICAgIHJldHVybiBpID49IDE2OworICAgIGVsc2UgaWYgKGkgPCBuLzIpCisgICAgICAgIHJldHVybiBpc19zZWNvbmRfaGFsZl9vZl9mZnQzMihpLCBuLzIpOworICAgIGVsc2UgaWYgKGkgPCAzKm4vNCkKKyAgICAgICAgcmV0dXJuIGlzX3NlY29uZF9oYWxmX29mX2ZmdDMyKGkgLSBuLzIsIG4vNCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gaXNfc2Vjb25kX2hhbGZfb2ZfZmZ0MzIoaSAtIDMqbi80LCBuLzQpOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGZmdF9wZXJtX2F2eChGRlRDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIGludCBuID0gMSA8PCBzLT5uYml0czsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpICs9IDE2KSB7CisgICAgICAgIGludCBrOworICAgICAgICBpZiAoaXNfc2Vjb25kX2hhbGZfb2ZfZmZ0MzIoaSwgbikpIHsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKQorICAgICAgICAgICAgICAgIHMtPnJldnRhYlstc3BsaXRfcmFkaXhfcGVybXV0YXRpb24oaSArIGssIG4sIHMtPmludmVyc2UpICYgKG4gLSAxKV0gPQorICAgICAgICAgICAgICAgICAgICBpICsgYXZ4X3RhYltrXTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaiA9IGkgKyBrOworICAgICAgICAgICAgICAgIGogPSAoaiAmIH43KSB8ICgoaiA+PiAxKSAmIDMpIHwgKChqIDw8IDIpICYgNCk7CisgICAgICAgICAgICAgICAgcy0+cmV2dGFiWy1zcGxpdF9yYWRpeF9wZXJtdXRhdGlvbihpICsgaywgbiwgcy0+aW52ZXJzZSkgJiAobiAtIDEpXSA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2F2X2NvbGQgaW50IGZmX2ZmdF9pbml0KEZGVENvbnRleHQgKnMsIGludCBuYml0cywgaW50IGludmVyc2UpCit7CisgICAgaW50IGksIGosIG47CisKKyAgICBpZiAobmJpdHMgPCAyIHx8IG5iaXRzID4gMTYpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBzLT5uYml0cyA9IG5iaXRzOworICAgIG4gPSAxIDw8IG5iaXRzOworCisgICAgcy0+cmV2dGFiID0gYXZfbWFsbG9jKG4gKiBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIXMtPnJldnRhYikKKyAgICAgICAgZ290byBmYWlsOworICAgIHMtPnRtcF9idWYgPSBhdl9tYWxsb2MobiAqIHNpemVvZihGRlRDb21wbGV4KSk7CisgICAgaWYgKCFzLT50bXBfYnVmKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcy0+aW52ZXJzZSA9IGludmVyc2U7CisgICAgcy0+ZmZ0X3Blcm11dGF0aW9uID0gRkZfRkZUX1BFUk1fREVGQVVMVDsKKworICAgIHMtPmZmdF9wZXJtdXRlID0gZmZ0X3Blcm11dGVfYzsKKyAgICBzLT5mZnRfY2FsYyAgICA9IGZmdF9jYWxjX2M7CisjaWYgQ09ORklHX01EQ1QKKyAgICBzLT5pbWRjdF9jYWxjICA9IGZmX2ltZGN0X2NhbGNfYzsKKyAgICBzLT5pbWRjdF9oYWxmICA9IGZmX2ltZGN0X2hhbGZfYzsKKyAgICBzLT5tZGN0X2NhbGMgICA9IGZmX21kY3RfY2FsY19jOworI2VuZGlmCisKKyNpZiBGRlRfRklYRURfMzIKKyAgICB7CisgICAgICAgIGludCBuPTA7CisgICAgICAgIGZmX2ZmdF9sdXRfaW5pdChmZl9mZnRfb2Zmc2V0c19sdXQsIDAsIDEgPDwgMTYsICZuKTsKKyAgICB9CisjZWxzZSAvKiBGRlRfRklYRURfMzIgKi8KKyNpZiBGRlRfRkxPQVQKKyAgICBpZiAoQVJDSF9BQVJDSDY0KSBmZl9mZnRfaW5pdF9hYXJjaDY0KHMpOworICAgIGlmIChBUkNIX0FSTSkgICAgIGZmX2ZmdF9pbml0X2FybShzKTsKKyAgICBpZiAoQVJDSF9QUEMpICAgICBmZl9mZnRfaW5pdF9wcGMocyk7CisgICAgaWYgKEFSQ0hfWDg2KSAgICAgZmZfZmZ0X2luaXRfeDg2KHMpOworICAgIGlmIChDT05GSUdfTURDVCkgIHMtPm1kY3RfY2FsY3cgPSBzLT5tZGN0X2NhbGM7CisgICAgaWYgKEhBVkVfTUlQU0ZQVSkgZmZfZmZ0X2luaXRfbWlwcyhzKTsKKyNlbHNlCisgICAgaWYgKENPTkZJR19NRENUKSAgcy0+bWRjdF9jYWxjdyA9IGZmX21kY3RfY2FsY3dfYzsKKyAgICBpZiAoQVJDSF9BUk0pICAgICBmZl9mZnRfZml4ZWRfaW5pdF9hcm0ocyk7CisjZW5kaWYKKyAgICBmb3Ioaj00OyBqPD1uYml0czsgaisrKSB7CisgICAgICAgIGZmX2luaXRfZmZfY29zX3RhYnMoaik7CisgICAgfQorI2VuZGlmIC8qIEZGVF9GSVhFRF8zMiAqLworCisKKyAgICBpZiAocy0+ZmZ0X3Blcm11dGF0aW9uID09IEZGX0ZGVF9QRVJNX0FWWCkgeworICAgICAgICBmZnRfcGVybV9hdngocyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKGk9MDsgaTxuOyBpKyspIHsKKyAgICAgICAgICAgIGogPSBpOworICAgICAgICAgICAgaWYgKHMtPmZmdF9wZXJtdXRhdGlvbiA9PSBGRl9GRlRfUEVSTV9TV0FQX0xTQlMpCisgICAgICAgICAgICAgICAgaiA9IChqJn4zKSB8ICgoaj4+MSkmMSkgfCAoKGo8PDEpJjIpOworICAgICAgICAgICAgcy0+cmV2dGFiWy1zcGxpdF9yYWRpeF9wZXJtdXRhdGlvbihpLCBuLCBzLT5pbnZlcnNlKSAmIChuLTEpXSA9IGo7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyBmYWlsOgorICAgIGF2X2ZyZWVwKCZzLT5yZXZ0YWIpOworICAgIGF2X2ZyZWVwKCZzLT50bXBfYnVmKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGZmdF9wZXJtdXRlX2MoRkZUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqeikKK3sKKyAgICBpbnQgaiwgbnA7CisgICAgY29uc3QgdWludDE2X3QgKnJldnRhYiA9IHMtPnJldnRhYjsKKyAgICBucCA9IDEgPDwgcy0+bmJpdHM7CisgICAgLyogVE9ETzogaGFuZGxlIHNwbGl0LXJhZGl4IHBlcm11dGUgaW4gYSBtb3JlIG9wdGltYWwgd2F5LCBwcm9iYWJseSBpbi1wbGFjZSAqLworICAgIGZvcihqPTA7ajxucDtqKyspIHMtPnRtcF9idWZbcmV2dGFiW2pdXSA9IHpbal07CisgICAgbWVtY3B5KHosIHMtPnRtcF9idWYsIG5wICogc2l6ZW9mKEZGVENvbXBsZXgpKTsKK30KKworYXZfY29sZCB2b2lkIGZmX2ZmdF9lbmQoRkZUQ29udGV4dCAqcykKK3sKKyAgICBhdl9mcmVlcCgmcy0+cmV2dGFiKTsKKyAgICBhdl9mcmVlcCgmcy0+dG1wX2J1Zik7Cit9CisKKyNpZiBGRlRfRklYRURfMzIKKworc3RhdGljIHZvaWQgZmZ0X2NhbGNfYyhGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KSB7CisKKyAgICBpbnQgbmJpdHMsIGksIG4sIG51bV90cmFuc2Zvcm1zLCBvZmZzZXQsIHN0ZXA7CisgICAgaW50IG40LCBuMiwgbjM0OworICAgIEZGVFNhbXBsZSB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCB0bXA4OworICAgIEZGVENvbXBsZXggKnRtcHo7CisgICAgY29uc3QgaW50IGZmdF9zaXplID0gKDEgPDwgcy0+bmJpdHMpOworICAgIGludDY0X3QgYWNjdTsKKworICAgIG51bV90cmFuc2Zvcm1zID0gKDB4MmFhYiA+PiAoMTYgLSBzLT5uYml0cykpIHwgMTsKKworICAgIGZvciAobj0wOyBuPG51bV90cmFuc2Zvcm1zOyBuKyspeworICAgICAgICBvZmZzZXQgPSBmZl9mZnRfb2Zmc2V0c19sdXRbbl0gPDwgMjsKKyAgICAgICAgdG1weiA9IHogKyBvZmZzZXQ7CisKKyAgICAgICAgdG1wMSA9IHRtcHpbMF0ucmUgKyB0bXB6WzFdLnJlOworICAgICAgICB0bXA1ID0gdG1welsyXS5yZSArIHRtcHpbM10ucmU7CisgICAgICAgIHRtcDIgPSB0bXB6WzBdLmltICsgdG1welsxXS5pbTsKKyAgICAgICAgdG1wNiA9IHRtcHpbMl0uaW0gKyB0bXB6WzNdLmltOworICAgICAgICB0bXAzID0gdG1welswXS5yZSAtIHRtcHpbMV0ucmU7CisgICAgICAgIHRtcDggPSB0bXB6WzJdLmltIC0gdG1welszXS5pbTsKKyAgICAgICAgdG1wNCA9IHRtcHpbMF0uaW0gLSB0bXB6WzFdLmltOworICAgICAgICB0bXA3ID0gdG1welsyXS5yZSAtIHRtcHpbM10ucmU7CisKKyAgICAgICAgdG1welswXS5yZSA9IHRtcDEgKyB0bXA1OworICAgICAgICB0bXB6WzJdLnJlID0gdG1wMSAtIHRtcDU7CisgICAgICAgIHRtcHpbMF0uaW0gPSB0bXAyICsgdG1wNjsKKyAgICAgICAgdG1welsyXS5pbSA9IHRtcDIgLSB0bXA2OworICAgICAgICB0bXB6WzFdLnJlID0gdG1wMyArIHRtcDg7CisgICAgICAgIHRtcHpbM10ucmUgPSB0bXAzIC0gdG1wODsKKyAgICAgICAgdG1welsxXS5pbSA9IHRtcDQgLSB0bXA3OworICAgICAgICB0bXB6WzNdLmltID0gdG1wNCArIHRtcDc7CisgICAgfQorCisgICAgaWYgKGZmdF9zaXplIDwgOCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbnVtX3RyYW5zZm9ybXMgPSAobnVtX3RyYW5zZm9ybXMgPj4gMSkgfCAxOworCisgICAgZm9yIChuPTA7IG48bnVtX3RyYW5zZm9ybXM7IG4rKyl7CisgICAgICAgIG9mZnNldCA9IGZmX2ZmdF9vZmZzZXRzX2x1dFtuXSA8PCAzOworICAgICAgICB0bXB6ID0geiArIG9mZnNldDsKKworICAgICAgICB0bXAxID0gdG1wels0XS5yZSArIHRtcHpbNV0ucmU7CisgICAgICAgIHRtcDMgPSB0bXB6WzZdLnJlICsgdG1wels3XS5yZTsKKyAgICAgICAgdG1wMiA9IHRtcHpbNF0uaW0gKyB0bXB6WzVdLmltOworICAgICAgICB0bXA0ID0gdG1wels2XS5pbSArIHRtcHpbN10uaW07CisgICAgICAgIHRtcDUgPSB0bXAxICsgdG1wMzsKKyAgICAgICAgdG1wNyA9IHRtcDEgLSB0bXAzOworICAgICAgICB0bXA2ID0gdG1wMiArIHRtcDQ7CisgICAgICAgIHRtcDggPSB0bXAyIC0gdG1wNDsKKworICAgICAgICB0bXAxID0gdG1wels0XS5yZSAtIHRtcHpbNV0ucmU7CisgICAgICAgIHRtcDIgPSB0bXB6WzRdLmltIC0gdG1wels1XS5pbTsKKyAgICAgICAgdG1wMyA9IHRtcHpbNl0ucmUgLSB0bXB6WzddLnJlOworICAgICAgICB0bXA0ID0gdG1wels2XS5pbSAtIHRtcHpbN10uaW07CisKKyAgICAgICAgdG1wels0XS5yZSA9IHRtcHpbMF0ucmUgLSB0bXA1OworICAgICAgICB0bXB6WzBdLnJlID0gdG1welswXS5yZSArIHRtcDU7CisgICAgICAgIHRtcHpbNF0uaW0gPSB0bXB6WzBdLmltIC0gdG1wNjsKKyAgICAgICAgdG1welswXS5pbSA9IHRtcHpbMF0uaW0gKyB0bXA2OworICAgICAgICB0bXB6WzZdLnJlID0gdG1welsyXS5yZSAtIHRtcDg7CisgICAgICAgIHRtcHpbMl0ucmUgPSB0bXB6WzJdLnJlICsgdG1wODsKKyAgICAgICAgdG1wels2XS5pbSA9IHRtcHpbMl0uaW0gKyB0bXA3OworICAgICAgICB0bXB6WzJdLmltID0gdG1welsyXS5pbSAtIHRtcDc7CisKKyAgICAgICAgYWNjdSA9IChpbnQ2NF90KVEzMShNX1NRUlQxXzIpKih0bXAxICsgdG1wMik7CisgICAgICAgIHRtcDUgPSAoaW50MzJfdCkoKGFjY3UgKyAweDQwMDAwMDAwKSA+PiAzMSk7CisgICAgICAgIGFjY3UgPSAoaW50NjRfdClRMzEoTV9TUVJUMV8yKSoodG1wMyAtIHRtcDQpOworICAgICAgICB0bXA3ID0gKGludDMyX3QpKChhY2N1ICsgMHg0MDAwMDAwMCkgPj4gMzEpOworICAgICAgICBhY2N1ID0gKGludDY0X3QpUTMxKE1fU1FSVDFfMikqKHRtcDIgLSB0bXAxKTsKKyAgICAgICAgdG1wNiA9IChpbnQzMl90KSgoYWNjdSArIDB4NDAwMDAwMDApID4+IDMxKTsKKyAgICAgICAgYWNjdSA9IChpbnQ2NF90KVEzMShNX1NRUlQxXzIpKih0bXAzICsgdG1wNCk7CisgICAgICAgIHRtcDggPSAoaW50MzJfdCkoKGFjY3UgKyAweDQwMDAwMDAwKSA+PiAzMSk7CisgICAgICAgIHRtcDEgPSB0bXA1ICsgdG1wNzsKKyAgICAgICAgdG1wMyA9IHRtcDUgLSB0bXA3OworICAgICAgICB0bXAyID0gdG1wNiArIHRtcDg7CisgICAgICAgIHRtcDQgPSB0bXA2IC0gdG1wODsKKworICAgICAgICB0bXB6WzVdLnJlID0gdG1welsxXS5yZSAtIHRtcDE7CisgICAgICAgIHRtcHpbMV0ucmUgPSB0bXB6WzFdLnJlICsgdG1wMTsKKyAgICAgICAgdG1wels1XS5pbSA9IHRtcHpbMV0uaW0gLSB0bXAyOworICAgICAgICB0bXB6WzFdLmltID0gdG1welsxXS5pbSArIHRtcDI7CisgICAgICAgIHRtcHpbN10ucmUgPSB0bXB6WzNdLnJlIC0gdG1wNDsKKyAgICAgICAgdG1welszXS5yZSA9IHRtcHpbM10ucmUgKyB0bXA0OworICAgICAgICB0bXB6WzddLmltID0gdG1welszXS5pbSArIHRtcDM7CisgICAgICAgIHRtcHpbM10uaW0gPSB0bXB6WzNdLmltIC0gdG1wMzsKKyAgICB9CisKKyAgICBzdGVwID0gMSA8PCAoKE1BWF9MT0cyX05GRlQtNCkgLSA0KTsKKyAgICBuNCA9IDQ7CisKKyAgICBmb3IgKG5iaXRzPTQ7IG5iaXRzPD1zLT5uYml0czsgbmJpdHMrKyl7CisgICAgICAgIG4yICA9IDIqbjQ7CisgICAgICAgIG4zNCA9IDMqbjQ7CisgICAgICAgIG51bV90cmFuc2Zvcm1zID0gKG51bV90cmFuc2Zvcm1zID4+IDEpIHwgMTsKKworICAgICAgICBmb3IgKG49MDsgbjxudW1fdHJhbnNmb3JtczsgbisrKXsKKyAgICAgICAgICAgIGNvbnN0IEZGVFNhbXBsZSAqd19yZV9wdHIgPSBmZl93X3RhYl9zciArIHN0ZXA7CisgICAgICAgICAgICBjb25zdCBGRlRTYW1wbGUgKndfaW1fcHRyID0gZmZfd190YWJfc3IgKyBNQVhfRkZUX1NJWkUvKDQqMTYpIC0gc3RlcDsKKyAgICAgICAgICAgIG9mZnNldCA9IGZmX2ZmdF9vZmZzZXRzX2x1dFtuXSA8PCBuYml0czsKKyAgICAgICAgICAgIHRtcHogPSB6ICsgb2Zmc2V0OworCisgICAgICAgICAgICB0bXA1ID0gdG1welsgbjJdLnJlICsgdG1weltuMzRdLnJlOworICAgICAgICAgICAgdG1wMSA9IHRtcHpbIG4yXS5yZSAtIHRtcHpbbjM0XS5yZTsKKyAgICAgICAgICAgIHRtcDYgPSB0bXB6WyBuMl0uaW0gKyB0bXB6W24zNF0uaW07CisgICAgICAgICAgICB0bXAyID0gdG1welsgbjJdLmltIC0gdG1weltuMzRdLmltOworCisgICAgICAgICAgICB0bXB6WyBuMl0ucmUgPSB0bXB6WyAwXS5yZSAtIHRtcDU7CisgICAgICAgICAgICB0bXB6WyAgMF0ucmUgPSB0bXB6WyAwXS5yZSArIHRtcDU7CisgICAgICAgICAgICB0bXB6WyBuMl0uaW0gPSB0bXB6WyAwXS5pbSAtIHRtcDY7CisgICAgICAgICAgICB0bXB6WyAgMF0uaW0gPSB0bXB6WyAwXS5pbSArIHRtcDY7CisgICAgICAgICAgICB0bXB6W24zNF0ucmUgPSB0bXB6W240XS5yZSAtIHRtcDI7CisgICAgICAgICAgICB0bXB6WyBuNF0ucmUgPSB0bXB6W240XS5yZSArIHRtcDI7CisgICAgICAgICAgICB0bXB6W24zNF0uaW0gPSB0bXB6W240XS5pbSArIHRtcDE7CisgICAgICAgICAgICB0bXB6WyBuNF0uaW0gPSB0bXB6W240XS5pbSAtIHRtcDE7CisKKyAgICAgICAgICAgIGZvciAoaT0xOyBpPG40OyBpKyspeworICAgICAgICAgICAgICAgIEZGVFNhbXBsZSB3X3JlID0gd19yZV9wdHJbMF07CisgICAgICAgICAgICAgICAgRkZUU2FtcGxlIHdfaW0gPSB3X2ltX3B0clswXTsKKyAgICAgICAgICAgICAgICBhY2N1ICA9IChpbnQ2NF90KXdfcmUqdG1welsgbjIraV0ucmU7CisgICAgICAgICAgICAgICAgYWNjdSArPSAoaW50NjRfdCl3X2ltKnRtcHpbIG4yK2ldLmltOworICAgICAgICAgICAgICAgIHRtcDEgPSAoaW50MzJfdCkoKGFjY3UgKyAweDQwMDAwMDAwKSA+PiAzMSk7CisgICAgICAgICAgICAgICAgYWNjdSAgPSAoaW50NjRfdCl3X3JlKnRtcHpbIG4yK2ldLmltOworICAgICAgICAgICAgICAgIGFjY3UgLT0gKGludDY0X3Qpd19pbSp0bXB6WyBuMitpXS5yZTsKKyAgICAgICAgICAgICAgICB0bXAyID0gKGludDMyX3QpKChhY2N1ICsgMHg0MDAwMDAwMCkgPj4gMzEpOworICAgICAgICAgICAgICAgIGFjY3UgID0gKGludDY0X3Qpd19yZSp0bXB6W24zNCtpXS5yZTsKKyAgICAgICAgICAgICAgICBhY2N1IC09IChpbnQ2NF90KXdfaW0qdG1weltuMzQraV0uaW07CisgICAgICAgICAgICAgICAgdG1wMyA9IChpbnQzMl90KSgoYWNjdSArIDB4NDAwMDAwMDApID4+IDMxKTsKKyAgICAgICAgICAgICAgICBhY2N1ICA9IChpbnQ2NF90KXdfcmUqdG1weltuMzQraV0uaW07CisgICAgICAgICAgICAgICAgYWNjdSArPSAoaW50NjRfdCl3X2ltKnRtcHpbbjM0K2ldLnJlOworICAgICAgICAgICAgICAgIHRtcDQgPSAoaW50MzJfdCkoKGFjY3UgKyAweDQwMDAwMDAwKSA+PiAzMSk7CisKKyAgICAgICAgICAgICAgICB0bXA1ID0gdG1wMSArIHRtcDM7CisgICAgICAgICAgICAgICAgdG1wMSA9IHRtcDEgLSB0bXAzOworICAgICAgICAgICAgICAgIHRtcDYgPSB0bXAyICsgdG1wNDsKKyAgICAgICAgICAgICAgICB0bXAyID0gdG1wMiAtIHRtcDQ7CisKKyAgICAgICAgICAgICAgICB0bXB6WyBuMitpXS5yZSA9IHRtcHpbICAgaV0ucmUgLSB0bXA1OworICAgICAgICAgICAgICAgIHRtcHpbICAgIGldLnJlID0gdG1welsgICBpXS5yZSArIHRtcDU7CisgICAgICAgICAgICAgICAgdG1welsgbjIraV0uaW0gPSB0bXB6WyAgIGldLmltIC0gdG1wNjsKKyAgICAgICAgICAgICAgICB0bXB6WyAgICBpXS5pbSA9IHRtcHpbICAgaV0uaW0gKyB0bXA2OworICAgICAgICAgICAgICAgIHRtcHpbbjM0K2ldLnJlID0gdG1weltuNCtpXS5yZSAtIHRtcDI7CisgICAgICAgICAgICAgICAgdG1welsgbjQraV0ucmUgPSB0bXB6W240K2ldLnJlICsgdG1wMjsKKyAgICAgICAgICAgICAgICB0bXB6W24zNCtpXS5pbSA9IHRtcHpbbjQraV0uaW0gKyB0bXAxOworICAgICAgICAgICAgICAgIHRtcHpbIG40K2ldLmltID0gdG1weltuNCtpXS5pbSAtIHRtcDE7CisKKyAgICAgICAgICAgICAgICB3X3JlX3B0ciArPSBzdGVwOworICAgICAgICAgICAgICAgIHdfaW1fcHRyIC09IHN0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RlcCA+Pj0gMTsKKyAgICAgICAgbjQgICA8PD0gMTsKKyAgICB9Cit9CisKKyNlbHNlIC8qIEZGVF9GSVhFRF8zMiAqLworCisjZGVmaW5lIEJVVFRFUkZMSUVTKGEwLGExLGEyLGEzKSB7XAorICAgIEJGKHQzLCB0NSwgdDUsIHQxKTtcCisgICAgQkYoYTIucmUsIGEwLnJlLCBhMC5yZSwgdDUpO1wKKyAgICBCRihhMy5pbSwgYTEuaW0sIGExLmltLCB0Myk7XAorICAgIEJGKHQ0LCB0NiwgdDIsIHQ2KTtcCisgICAgQkYoYTMucmUsIGExLnJlLCBhMS5yZSwgdDQpO1wKKyAgICBCRihhMi5pbSwgYTAuaW0sIGEwLmltLCB0Nik7XAorfQorCisvLyBmb3JjZSBsb2FkaW5nIGFsbCB0aGUgaW5wdXRzIGJlZm9yZSBzdG9yaW5nIGFueS4KKy8vIHRoaXMgaXMgc2xpZ2h0bHkgc2xvd2VyIGZvciBzbWFsbCBkYXRhLCBidXQgYXZvaWRzIHN0b3JlLT5sb2FkIGFsaWFzaW5nCisvLyBmb3IgYWRkcmVzc2VzIHNlcGFyYXRlZCBieSBsYXJnZSBwb3dlcnMgb2YgMi4KKyNkZWZpbmUgQlVUVEVSRkxJRVNfQklHKGEwLGExLGEyLGEzKSB7XAorICAgIEZGVFNhbXBsZSByMD1hMC5yZSwgaTA9YTAuaW0sIHIxPWExLnJlLCBpMT1hMS5pbTtcCisgICAgQkYodDMsIHQ1LCB0NSwgdDEpO1wKKyAgICBCRihhMi5yZSwgYTAucmUsIHIwLCB0NSk7XAorICAgIEJGKGEzLmltLCBhMS5pbSwgaTEsIHQzKTtcCisgICAgQkYodDQsIHQ2LCB0MiwgdDYpO1wKKyAgICBCRihhMy5yZSwgYTEucmUsIHIxLCB0NCk7XAorICAgIEJGKGEyLmltLCBhMC5pbSwgaTAsIHQ2KTtcCit9CisKKyNkZWZpbmUgVFJBTlNGT1JNKGEwLGExLGEyLGEzLHdyZSx3aW0pIHtcCisgICAgQ01VTCh0MSwgdDIsIGEyLnJlLCBhMi5pbSwgd3JlLCAtd2ltKTtcCisgICAgQ01VTCh0NSwgdDYsIGEzLnJlLCBhMy5pbSwgd3JlLCAgd2ltKTtcCisgICAgQlVUVEVSRkxJRVMoYTAsYTEsYTIsYTMpXAorfQorCisjZGVmaW5lIFRSQU5TRk9STV9aRVJPKGEwLGExLGEyLGEzKSB7XAorICAgIHQxID0gYTIucmU7XAorICAgIHQyID0gYTIuaW07XAorICAgIHQ1ID0gYTMucmU7XAorICAgIHQ2ID0gYTMuaW07XAorICAgIEJVVFRFUkZMSUVTKGEwLGExLGEyLGEzKVwKK30KKworLyogelswLi4uOG4tMV0sIHdbMS4uLjJuLTFdICovCisjZGVmaW5lIFBBU1MobmFtZSlcCitzdGF0aWMgdm9pZCBuYW1lKEZGVENvbXBsZXggKnosIGNvbnN0IEZGVFNhbXBsZSAqd3JlLCB1bnNpZ25lZCBpbnQgbilcCit7XAorICAgIEZGVERvdWJsZSB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2O1wKKyAgICBpbnQgbzEgPSAyKm47XAorICAgIGludCBvMiA9IDQqbjtcCisgICAgaW50IG8zID0gNipuO1wKKyAgICBjb25zdCBGRlRTYW1wbGUgKndpbSA9IHdyZStvMTtcCisgICAgbi0tO1wKK1wKKyAgICBUUkFOU0ZPUk1fWkVSTyh6WzBdLHpbbzFdLHpbbzJdLHpbbzNdKTtcCisgICAgVFJBTlNGT1JNKHpbMV0seltvMSsxXSx6W28yKzFdLHpbbzMrMV0sd3JlWzFdLHdpbVstMV0pO1wKKyAgICBkbyB7XAorICAgICAgICB6ICs9IDI7XAorICAgICAgICB3cmUgKz0gMjtcCisgICAgICAgIHdpbSAtPSAyO1wKKyAgICAgICAgVFJBTlNGT1JNKHpbMF0seltvMV0seltvMl0seltvM10sd3JlWzBdLHdpbVswXSk7XAorICAgICAgICBUUkFOU0ZPUk0oelsxXSx6W28xKzFdLHpbbzIrMV0seltvMysxXSx3cmVbMV0sd2ltWy0xXSk7XAorICAgIH0gd2hpbGUoLS1uKTtcCit9CisKK1BBU1MocGFzcykKKyN1bmRlZiBCVVRURVJGTElFUworI2RlZmluZSBCVVRURVJGTElFUyBCVVRURVJGTElFU19CSUcKK1BBU1MocGFzc19iaWcpCisKKyNkZWZpbmUgREVDTF9GRlQobixuMixuNClcCitzdGF0aWMgdm9pZCBmZnQjI24oRkZUQ29tcGxleCAqeilcCit7XAorICAgIGZmdCMjbjIoeik7XAorICAgIGZmdCMjbjQoeituNCoyKTtcCisgICAgZmZ0IyNuNCh6K240KjMpO1wKKyAgICBwYXNzKHosRkZUX05BTUUoZmZfY29zXyMjbiksbjQvMik7XAorfQorCitzdGF0aWMgdm9pZCBmZnQ0KEZGVENvbXBsZXggKnopCit7CisgICAgRkZURG91YmxlIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LCB0ODsKKworICAgIEJGKHQzLCB0MSwgelswXS5yZSwgelsxXS5yZSk7CisgICAgQkYodDgsIHQ2LCB6WzNdLnJlLCB6WzJdLnJlKTsKKyAgICBCRih6WzJdLnJlLCB6WzBdLnJlLCB0MSwgdDYpOworICAgIEJGKHQ0LCB0MiwgelswXS5pbSwgelsxXS5pbSk7CisgICAgQkYodDcsIHQ1LCB6WzJdLmltLCB6WzNdLmltKTsKKyAgICBCRih6WzNdLmltLCB6WzFdLmltLCB0NCwgdDgpOworICAgIEJGKHpbM10ucmUsIHpbMV0ucmUsIHQzLCB0Nyk7CisgICAgQkYoelsyXS5pbSwgelswXS5pbSwgdDIsIHQ1KTsKK30KKworc3RhdGljIHZvaWQgZmZ0OChGRlRDb21wbGV4ICp6KQoreworICAgIEZGVERvdWJsZSB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2OworCisgICAgZmZ0NCh6KTsKKworICAgIEJGKHQxLCB6WzVdLnJlLCB6WzRdLnJlLCAtels1XS5yZSk7CisgICAgQkYodDIsIHpbNV0uaW0sIHpbNF0uaW0sIC16WzVdLmltKTsKKyAgICBCRih0NSwgels3XS5yZSwgels2XS5yZSwgLXpbN10ucmUpOworICAgIEJGKHQ2LCB6WzddLmltLCB6WzZdLmltLCAtels3XS5pbSk7CisKKyAgICBCVVRURVJGTElFUyh6WzBdLHpbMl0sels0XSx6WzZdKTsKKyAgICBUUkFOU0ZPUk0oelsxXSx6WzNdLHpbNV0sels3XSxzcXJ0aGFsZixzcXJ0aGFsZik7Cit9CisKKyNpZiAhQ09ORklHX1NNQUxMCitzdGF0aWMgdm9pZCBmZnQxNihGRlRDb21wbGV4ICp6KQoreworICAgIEZGVERvdWJsZSB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2OworICAgIEZGVFNhbXBsZSBjb3NfMTZfMSA9IEZGVF9OQU1FKGZmX2Nvc18xNilbMV07CisgICAgRkZUU2FtcGxlIGNvc18xNl8zID0gRkZUX05BTUUoZmZfY29zXzE2KVszXTsKKworICAgIGZmdDgoeik7CisgICAgZmZ0NCh6KzgpOworICAgIGZmdDQoeisxMik7CisKKyAgICBUUkFOU0ZPUk1fWkVSTyh6WzBdLHpbNF0sels4XSx6WzEyXSk7CisgICAgVFJBTlNGT1JNKHpbMl0sels2XSx6WzEwXSx6WzE0XSxzcXJ0aGFsZixzcXJ0aGFsZik7CisgICAgVFJBTlNGT1JNKHpbMV0sels1XSx6WzldLHpbMTNdLGNvc18xNl8xLGNvc18xNl8zKTsKKyAgICBUUkFOU0ZPUk0oelszXSx6WzddLHpbMTFdLHpbMTVdLGNvc18xNl8zLGNvc18xNl8xKTsKK30KKyNlbHNlCitERUNMX0ZGVCgxNiw4LDQpCisjZW5kaWYKK0RFQ0xfRkZUKDMyLDE2LDgpCitERUNMX0ZGVCg2NCwzMiwxNikKK0RFQ0xfRkZUKDEyOCw2NCwzMikKK0RFQ0xfRkZUKDI1NiwxMjgsNjQpCitERUNMX0ZGVCg1MTIsMjU2LDEyOCkKKyNpZiAhQ09ORklHX1NNQUxMCisjZGVmaW5lIHBhc3MgcGFzc19iaWcKKyNlbmRpZgorREVDTF9GRlQoMTAyNCw1MTIsMjU2KQorREVDTF9GRlQoMjA0OCwxMDI0LDUxMikKK0RFQ0xfRkZUKDQwOTYsMjA0OCwxMDI0KQorREVDTF9GRlQoODE5Miw0MDk2LDIwNDgpCitERUNMX0ZGVCgxNjM4NCw4MTkyLDQwOTYpCitERUNMX0ZGVCgzMjc2OCwxNjM4NCw4MTkyKQorREVDTF9GRlQoNjU1MzYsMzI3NjgsMTYzODQpCisKK3N0YXRpYyB2b2lkICgqIGNvbnN0IGZmdF9kaXNwYXRjaFtdKShGRlRDb21wbGV4KikgPSB7CisgICAgZmZ0NCwgZmZ0OCwgZmZ0MTYsIGZmdDMyLCBmZnQ2NCwgZmZ0MTI4LCBmZnQyNTYsIGZmdDUxMiwgZmZ0MTAyNCwKKyAgICBmZnQyMDQ4LCBmZnQ0MDk2LCBmZnQ4MTkyLCBmZnQxNjM4NCwgZmZ0MzI3NjgsIGZmdDY1NTM2LAorfTsKKworc3RhdGljIHZvaWQgZmZ0X2NhbGNfYyhGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KQoreworICAgIGZmdF9kaXNwYXRjaFtzLT5uYml0cy0yXSh6KTsKK30KKyNlbmRpZiAvKiBGRlRfRklYRURfMzIgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdjEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjU4YTYwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmZ2MS5jCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogRkZWMSBjb2RlYyBmb3IgbGliYXZjb2RlYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDEzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEZGIFZpZGVvIENvZGVjIDEgKGEgbG9zc2xlc3MgY29kZWMpCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInJhbmdlY29kZXIuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAiZmZ2MS5oIgorCithdl9jb2xkIGludCBmZnYxX2NvbW1vbl9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGRlYxQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoIWF2Y3R4LT53aWR0aCB8fCAhYXZjdHgtPmhlaWdodCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIHMtPmZsYWdzID0gYXZjdHgtPmZsYWdzOworCisgICAgcy0+cGljdHVyZS5mID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBzLT5sYXN0X3BpY3R1cmUuZiA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5waWN0dXJlLmYgfHwgIXMtPmxhc3RfcGljdHVyZS5mKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+d2lkdGggID0gYXZjdHgtPndpZHRoOworICAgIHMtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICAvLyBkZWZhdWx0cworICAgIHMtPm51bV9oX3NsaWNlcyA9IDE7CisgICAgcy0+bnVtX3Zfc2xpY2VzID0gMTsKKworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIGludCBmZnYxX2luaXRfc2xpY2Vfc3RhdGUoRkZWMUNvbnRleHQgKmYsIEZGVjFDb250ZXh0ICpmcykKK3sKKyAgICBpbnQgajsKKworICAgIGZzLT5wbGFuZV9jb3VudCAgPSBmLT5wbGFuZV9jb3VudDsKKyAgICBmcy0+dHJhbnNwYXJlbmN5ID0gZi0+dHJhbnNwYXJlbmN5OworICAgIGZvciAoaiA9IDA7IGogPCBmLT5wbGFuZV9jb3VudDsgaisrKSB7CisgICAgICAgIFBsYW5lQ29udGV4dCAqY29uc3QgcCA9ICZmcy0+cGxhbmVbal07CisKKyAgICAgICAgaWYgKGZzLT5hYykgeworICAgICAgICAgICAgaWYgKCFwLT5zdGF0ZSkKKyAgICAgICAgICAgICAgICBwLT5zdGF0ZSA9IGF2X21hbGxvY19hcnJheShwLT5jb250ZXh0X2NvdW50LCBDT05URVhUX1NJWkUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICBpZiAoIXAtPnN0YXRlKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXAtPnZsY19zdGF0ZSkKKyAgICAgICAgICAgICAgICBwLT52bGNfc3RhdGUgPSBhdl9tYWxsb2NfYXJyYXkocC0+Y29udGV4dF9jb3VudCwgc2l6ZW9mKFZsY1N0YXRlKSk7CisgICAgICAgICAgICBpZiAoIXAtPnZsY19zdGF0ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZzLT5hYyA+IDEpIHsKKyAgICAgICAgLy9GSVhNRSBvbmx5IHJlZG8gaWYgc3RhdGVfdHJhbnNpdGlvbiBjaGFuZ2VkCisgICAgICAgIGZvciAoaiA9IDE7IGogPCAyNTY7IGorKykgeworICAgICAgICAgICAgZnMtPmMuIG9uZV9zdGF0ZVsgICAgICBqXSA9IGYtPnN0YXRlX3RyYW5zaXRpb25bal07CisgICAgICAgICAgICBmcy0+Yy56ZXJvX3N0YXRlWzI1NiAtIGpdID0gMjU2IC0gZnMtPmMub25lX3N0YXRlW2pdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgaW50IGZmdjFfaW5pdF9zbGljZXNfc3RhdGUoRkZWMUNvbnRleHQgKmYpCit7CisgICAgaW50IGksIHJldDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZi0+c2xpY2VfY291bnQ7IGkrKykgeworICAgICAgICBGRlYxQ29udGV4dCAqZnMgPSBmLT5zbGljZV9jb250ZXh0W2ldOworICAgICAgICBpZiAoKHJldCA9IGZmdjFfaW5pdF9zbGljZV9zdGF0ZShmLCBmcykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCithdl9jb2xkIGludCBmZnYxX2luaXRfc2xpY2VfY29udGV4dHMoRkZWMUNvbnRleHQgKmYpCit7CisgICAgaW50IGk7CisKKyAgICBmLT5zbGljZV9jb3VudCA9IGYtPm51bV9oX3NsaWNlcyAqIGYtPm51bV92X3NsaWNlczsKKyAgICBhdl9hc3NlcnQwKGYtPnNsaWNlX2NvdW50ID4gMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZi0+c2xpY2VfY291bnQ7IGkrKykgeworICAgICAgICBGRlYxQ29udGV4dCAqZnMgPSBhdl9tYWxsb2N6KHNpemVvZigqZnMpKTsKKyAgICAgICAgaW50IHN4ICAgICAgICAgID0gaSAlIGYtPm51bV9oX3NsaWNlczsKKyAgICAgICAgaW50IHN5ICAgICAgICAgID0gaSAvIGYtPm51bV9oX3NsaWNlczsKKyAgICAgICAgaW50IHN4cyAgICAgICAgID0gZi0+YXZjdHgtPndpZHRoICAqICBzeCAgICAgIC8gZi0+bnVtX2hfc2xpY2VzOworICAgICAgICBpbnQgc3hlICAgICAgICAgPSBmLT5hdmN0eC0+d2lkdGggICogKHN4ICsgMSkgLyBmLT5udW1faF9zbGljZXM7CisgICAgICAgIGludCBzeXMgICAgICAgICA9IGYtPmF2Y3R4LT5oZWlnaHQgKiAgc3kgICAgICAvIGYtPm51bV92X3NsaWNlczsKKyAgICAgICAgaW50IHN5ZSAgICAgICAgID0gZi0+YXZjdHgtPmhlaWdodCAqIChzeSArIDEpIC8gZi0+bnVtX3Zfc2xpY2VzOworCisgICAgICAgIGlmICghZnMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGYtPnNsaWNlX2NvbnRleHRbaV0gPSBmczsKKyAgICAgICAgbWVtY3B5KGZzLCBmLCBzaXplb2YoKmZzKSk7CisgICAgICAgIG1lbXNldChmcy0+cmNfc3RhdDIsIDAsIHNpemVvZihmcy0+cmNfc3RhdDIpKTsKKworICAgICAgICBmcy0+c2xpY2Vfd2lkdGggID0gc3hlIC0gc3hzOworICAgICAgICBmcy0+c2xpY2VfaGVpZ2h0ID0gc3llIC0gc3lzOworICAgICAgICBmcy0+c2xpY2VfeCAgICAgID0gc3hzOworICAgICAgICBmcy0+c2xpY2VfeSAgICAgID0gc3lzOworCisgICAgICAgIGZzLT5zYW1wbGVfYnVmZmVyID0gYXZfbWFsbG9jX2FycmF5KChmcy0+d2lkdGggKyA2KSwgMyAqIE1BWF9QTEFORVMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmZzLT5zYW1wbGVfYnVmZmVyKSk7CisgICAgICAgIGlmICghZnMtPnNhbXBsZV9idWZmZXIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmdjFfYWxsb2NhdGVfaW5pdGlhbF9zdGF0ZXMoRkZWMUNvbnRleHQgKmYpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZi0+cXVhbnRfdGFibGVfY291bnQ7IGkrKykgeworICAgICAgICBmLT5pbml0aWFsX3N0YXRlc1tpXSA9IGF2X21hbGxvY19hcnJheShmLT5jb250ZXh0X2NvdW50W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmYtPmluaXRpYWxfc3RhdGVzW2ldKSk7CisgICAgICAgIGlmICghZi0+aW5pdGlhbF9zdGF0ZXNbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBtZW1zZXQoZi0+aW5pdGlhbF9zdGF0ZXNbaV0sIDEyOCwKKyAgICAgICAgICAgICAgIGYtPmNvbnRleHRfY291bnRbaV0gKiBzaXplb2YoKmYtPmluaXRpYWxfc3RhdGVzW2ldKSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIGZmdjFfY2xlYXJfc2xpY2Vfc3RhdGUoRkZWMUNvbnRleHQgKmYsIEZGVjFDb250ZXh0ICpmcykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmLT5wbGFuZV9jb3VudDsgaSsrKSB7CisgICAgICAgIFBsYW5lQ29udGV4dCAqcCA9ICZmcy0+cGxhbmVbaV07CisKKyAgICAgICAgcC0+aW50ZXJsYWNlX2JpdF9zdGF0ZVswXSA9IDEyODsKKyAgICAgICAgcC0+aW50ZXJsYWNlX2JpdF9zdGF0ZVsxXSA9IDEyODsKKworICAgICAgICBpZiAoZnMtPmFjKSB7CisgICAgICAgICAgICBpZiAoZi0+aW5pdGlhbF9zdGF0ZXNbcC0+cXVhbnRfdGFibGVfaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHAtPnN0YXRlLCBmLT5pbml0aWFsX3N0YXRlc1twLT5xdWFudF90YWJsZV9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFRfU0laRSAqIHAtPmNvbnRleHRfY291bnQpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbWVtc2V0KHAtPnN0YXRlLCAxMjgsIENPTlRFWFRfU0laRSAqIHAtPmNvbnRleHRfY291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHAtPmNvbnRleHRfY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgIHAtPnZsY19zdGF0ZVtqXS5kcmlmdCAgICAgPSAwOworICAgICAgICAgICAgICAgIHAtPnZsY19zdGF0ZVtqXS5lcnJvcl9zdW0gPSA0OyAgICAvL0ZGTUFYKChSQU5HRSArIDMyKS82NCwgMik7CisgICAgICAgICAgICAgICAgcC0+dmxjX3N0YXRlW2pdLmJpYXMgICAgICA9IDA7CisgICAgICAgICAgICAgICAgcC0+dmxjX3N0YXRlW2pdLmNvdW50ICAgICA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworYXZfY29sZCBpbnQgZmZ2MV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRkZWMUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCBqOworCisgICAgaWYgKHMtPnBpY3R1cmUuZikKKyAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGF2Y3R4LCAmcy0+cGljdHVyZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+cGljdHVyZS5mKTsKKworICAgIGlmIChzLT5sYXN0X3BpY3R1cmUuZikKKyAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGF2Y3R4LCAmcy0+bGFzdF9waWN0dXJlKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5sYXN0X3BpY3R1cmUuZik7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgcy0+c2xpY2VfY291bnQ7IGorKykgeworICAgICAgICBGRlYxQ29udGV4dCAqZnMgPSBzLT5zbGljZV9jb250ZXh0W2pdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cGxhbmVfY291bnQ7IGkrKykgeworICAgICAgICAgICAgUGxhbmVDb250ZXh0ICpwID0gJmZzLT5wbGFuZVtpXTsKKworICAgICAgICAgICAgYXZfZnJlZXAoJnAtPnN0YXRlKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwLT52bGNfc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVwKCZmcy0+c2FtcGxlX2J1ZmZlcik7CisgICAgfQorCisgICAgYXZfZnJlZXAoJmF2Y3R4LT5zdGF0c19vdXQpOworICAgIGZvciAoaiA9IDA7IGogPCBzLT5xdWFudF90YWJsZV9jb3VudDsgaisrKSB7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5pbml0aWFsX3N0YXRlc1tqXSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zbGljZV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBGRlYxQ29udGV4dCAqc2YgPSBzLT5zbGljZV9jb250ZXh0W2ldOworICAgICAgICAgICAgYXZfZnJlZXAoJnNmLT5yY19zdGF0MltqXSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZXAoJnMtPnJjX3N0YXQyW2pdKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c2xpY2VfY291bnQ7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJnMtPnNsaWNlX2NvbnRleHRbaV0pOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mZnYxLmggYi9mZm1wZWcvbGliYXZjb2RlYy9mZnYxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4MTM5NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdjEuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIEZGVjEgY29kZWMgZm9yIGxpYmF2Y29kZWMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRkZWMV9ICisjZGVmaW5lIEFWQ09ERUNfRkZWMV9ICisKKy8qKgorICogQGZpbGUKKyAqIEZGIFZpZGVvIENvZGVjIDEgKGEgbG9zc2xlc3MgY29kZWMpCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgInJhbmdlY29kZXIuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKworI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyN1bmRlZiBhdl9mbGF0dGVuCisjZGVmaW5lIGF2X2ZsYXR0ZW4KKyNlbmRpZgorCisjZGVmaW5lIE1BWF9QTEFORVMgNAorI2RlZmluZSBDT05URVhUX1NJWkUgMzIKKworI2RlZmluZSBNQVhfUVVBTlRfVEFCTEVTIDgKKyNkZWZpbmUgTUFYX0NPTlRFWFRfSU5QVVRTIDUKKwordHlwZWRlZiBzdHJ1Y3QgVmxjU3RhdGUgeworICAgIGludDE2X3QgZHJpZnQ7CisgICAgdWludDE2X3QgZXJyb3Jfc3VtOworICAgIGludDhfdCBiaWFzOworICAgIHVpbnQ4X3QgY291bnQ7Cit9IFZsY1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCBQbGFuZUNvbnRleHQgeworICAgIGludDE2X3QgcXVhbnRfdGFibGVbTUFYX0NPTlRFWFRfSU5QVVRTXVsyNTZdOworICAgIGludCBxdWFudF90YWJsZV9pbmRleDsKKyAgICBpbnQgY29udGV4dF9jb3VudDsKKyAgICB1aW50OF90ICgqc3RhdGUpW0NPTlRFWFRfU0laRV07CisgICAgVmxjU3RhdGUgKnZsY19zdGF0ZTsKKyAgICB1aW50OF90IGludGVybGFjZV9iaXRfc3RhdGVbMl07Cit9IFBsYW5lQ29udGV4dDsKKworI2RlZmluZSBNQVhfU0xJQ0VTIDI1NgorCit0eXBlZGVmIHN0cnVjdCBGRlYxQ29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIFJhbmdlQ29kZXIgYzsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIFB1dEJpdENvbnRleHQgcGI7CisgICAgdWludDY0X3QgcmNfc3RhdFsyNTZdWzJdOworICAgIHVpbnQ2NF90ICgqcmNfc3RhdDJbTUFYX1FVQU5UX1RBQkxFU10pWzMyXVsyXTsKKyAgICBpbnQgdmVyc2lvbjsKKyAgICBpbnQgbWljcm9fdmVyc2lvbjsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgY2hyb21hX3BsYW5lczsKKyAgICBpbnQgY2hyb21hX2hfc2hpZnQsIGNocm9tYV92X3NoaWZ0OworICAgIGludCB0cmFuc3BhcmVuY3k7CisgICAgaW50IGZsYWdzOworICAgIGludCBwaWN0dXJlX251bWJlcjsKKyAgICBUaHJlYWRGcmFtZSBwaWN0dXJlLCBsYXN0X3BpY3R1cmU7CisgICAgc3RydWN0IEZGVjFDb250ZXh0ICpmc3JjOworCisgICAgQVZGcmFtZSAqY3VyOworICAgIGludCBwbGFuZV9jb3VudDsKKyAgICBpbnQgYWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCAxPXJhbmdlIGNvZGVyIDwtPiAwPWdvbG9tYiByaWNlCisgICAgaW50IGFjX2J5dGVfY291bnQ7ICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgZm9yIEFDIGNvZGluZworICAgIFBsYW5lQ29udGV4dCBwbGFuZVtNQVhfUExBTkVTXTsKKyAgICBpbnQxNl90IHF1YW50X3RhYmxlW01BWF9DT05URVhUX0lOUFVUU11bMjU2XTsKKyAgICBpbnQxNl90IHF1YW50X3RhYmxlc1tNQVhfUVVBTlRfVEFCTEVTXVtNQVhfQ09OVEVYVF9JTlBVVFNdWzI1Nl07CisgICAgaW50IGNvbnRleHRfY291bnRbTUFYX1FVQU5UX1RBQkxFU107CisgICAgdWludDhfdCBzdGF0ZV90cmFuc2l0aW9uWzI1Nl07CisgICAgdWludDhfdCAoKmluaXRpYWxfc3RhdGVzW01BWF9RVUFOVF9UQUJMRVNdKVszMl07CisgICAgaW50IHJ1bl9pbmRleDsKKyAgICBpbnQgY29sb3JzcGFjZTsKKyAgICBpbnQxNl90ICpzYW1wbGVfYnVmZmVyOworCisgICAgaW50IGVjOworICAgIGludCBpbnRyYTsKKyAgICBpbnQgc2xpY2VfZGFtYWdlZDsKKyAgICBpbnQga2V5X2ZyYW1lX29rOworCisgICAgaW50IGJpdHNfcGVyX3Jhd19zYW1wbGU7CisgICAgaW50IHBhY2tlZF9hdF9sc2I7CisKKyAgICBpbnQgZ29iX2NvdW50OworICAgIGludCBxdWFudF90YWJsZV9jb3VudDsKKworICAgIHN0cnVjdCBGRlYxQ29udGV4dCAqc2xpY2VfY29udGV4dFtNQVhfU0xJQ0VTXTsKKyAgICBpbnQgc2xpY2VfY291bnQ7CisgICAgaW50IG51bV92X3NsaWNlczsKKyAgICBpbnQgbnVtX2hfc2xpY2VzOworICAgIGludCBzbGljZV93aWR0aDsKKyAgICBpbnQgc2xpY2VfaGVpZ2h0OworICAgIGludCBzbGljZV94OworICAgIGludCBzbGljZV95OworICAgIGludCBzbGljZV9yZXNldF9jb250ZXh0czsKKyAgICBpbnQgc2xpY2VfY29kaW5nX21vZGU7CisgICAgaW50IHNsaWNlX3JjdF9ieV9jb2VmOworICAgIGludCBzbGljZV9yY3RfcnlfY29lZjsKK30gRkZWMUNvbnRleHQ7CisKK2ludCBmZnYxX2NvbW1vbl9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CitpbnQgZmZ2MV9pbml0X3NsaWNlX3N0YXRlKEZGVjFDb250ZXh0ICpmLCBGRlYxQ29udGV4dCAqZnMpOworaW50IGZmdjFfaW5pdF9zbGljZXNfc3RhdGUoRkZWMUNvbnRleHQgKmYpOworaW50IGZmdjFfaW5pdF9zbGljZV9jb250ZXh0cyhGRlYxQ29udGV4dCAqZik7CitpbnQgZmZ2MV9hbGxvY2F0ZV9pbml0aWFsX3N0YXRlcyhGRlYxQ29udGV4dCAqZik7Cit2b2lkIGZmdjFfY2xlYXJfc2xpY2Vfc3RhdGUoRkZWMUNvbnRleHQgKmYsIEZGVjFDb250ZXh0ICpmcyk7CitpbnQgZmZ2MV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZm9sZChpbnQgZGlmZiwgaW50IGJpdHMpCit7CisgICAgaWYgKGJpdHMgPT0gOCkKKyAgICAgICAgZGlmZiA9IChpbnQ4X3QpZGlmZjsKKyAgICBlbHNlIHsKKyAgICAgICAgZGlmZiArPSAgMSA8PCAoYml0cyAgLSAxKTsKKyAgICAgICAgZGlmZiAmPSAoMSA8PCAgYml0cykgLSAxOworICAgICAgICBkaWZmIC09ICAxIDw8IChiaXRzICAtIDEpOworICAgIH0KKworICAgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmVkaWN0KGludDE2X3QgKnNyYywgaW50MTZfdCAqbGFzdCkKK3sKKyAgICBjb25zdCBpbnQgTFQgPSBsYXN0Wy0xXTsKKyAgICBjb25zdCBpbnQgVCAgPSBsYXN0WzBdOworICAgIGNvbnN0IGludCBMICA9IHNyY1stMV07CisKKyAgICByZXR1cm4gbWlkX3ByZWQoTCwgTCArIFQgLSBMVCwgVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9jb250ZXh0KFBsYW5lQ29udGV4dCAqcCwgaW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqbGFzdCwgaW50MTZfdCAqbGFzdDIpCit7CisgICAgY29uc3QgaW50IExUID0gbGFzdFstMV07CisgICAgY29uc3QgaW50IFQgID0gbGFzdFswXTsKKyAgICBjb25zdCBpbnQgUlQgPSBsYXN0WzFdOworICAgIGNvbnN0IGludCBMICA9IHNyY1stMV07CisKKyAgICBpZiAocC0+cXVhbnRfdGFibGVbM11bMTI3XSkgeworICAgICAgICBjb25zdCBpbnQgVFQgPSBsYXN0MlswXTsKKyAgICAgICAgY29uc3QgaW50IExMID0gc3JjWy0yXTsKKyAgICAgICAgcmV0dXJuIHAtPnF1YW50X3RhYmxlWzBdWyhMIC0gTFQpICYgMHhGRl0gKworICAgICAgICAgICAgICAgcC0+cXVhbnRfdGFibGVbMV1bKExUIC0gVCkgJiAweEZGXSArCisgICAgICAgICAgICAgICBwLT5xdWFudF90YWJsZVsyXVsoVCAtIFJUKSAmIDB4RkZdICsKKyAgICAgICAgICAgICAgIHAtPnF1YW50X3RhYmxlWzNdWyhMTCAtIEwpICYgMHhGRl0gKworICAgICAgICAgICAgICAgcC0+cXVhbnRfdGFibGVbNF1bKFRUIC0gVCkgJiAweEZGXTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIHAtPnF1YW50X3RhYmxlWzBdWyhMIC0gTFQpICYgMHhGRl0gKworICAgICAgICAgICAgICAgcC0+cXVhbnRfdGFibGVbMV1bKExUIC0gVCkgJiAweEZGXSArCisgICAgICAgICAgICAgICBwLT5xdWFudF90YWJsZVsyXVsoVCAtIFJUKSAmIDB4RkZdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3ZsY19zdGF0ZShWbGNTdGF0ZSAqY29uc3Qgc3RhdGUsIGNvbnN0IGludCB2KQoreworICAgIGludCBkcmlmdCA9IHN0YXRlLT5kcmlmdDsKKyAgICBpbnQgY291bnQgPSBzdGF0ZS0+Y291bnQ7CisgICAgc3RhdGUtPmVycm9yX3N1bSArPSBGRkFCUyh2KTsKKyAgICBkcmlmdCAgICAgICAgICAgICs9IHY7CisKKyAgICBpZiAoY291bnQgPT0gMTI4KSB7IC8vIEZJWE1FOiB2YXJpYWJsZQorICAgICAgICBjb3VudCAgICAgICAgICAgID4+PSAxOworICAgICAgICBkcmlmdCAgICAgICAgICAgID4+PSAxOworICAgICAgICBzdGF0ZS0+ZXJyb3Jfc3VtID4+PSAxOworICAgIH0KKyAgICBjb3VudCsrOworCisgICAgaWYgKGRyaWZ0IDw9IC1jb3VudCkgeworICAgICAgICBpZiAoc3RhdGUtPmJpYXMgPiAtMTI4KQorICAgICAgICAgICAgc3RhdGUtPmJpYXMtLTsKKworICAgICAgICBkcmlmdCArPSBjb3VudDsKKyAgICAgICAgaWYgKGRyaWZ0IDw9IC1jb3VudCkKKyAgICAgICAgICAgIGRyaWZ0ID0gLWNvdW50ICsgMTsKKyAgICB9IGVsc2UgaWYgKGRyaWZ0ID4gMCkgeworICAgICAgICBpZiAoc3RhdGUtPmJpYXMgPCAxMjcpCisgICAgICAgICAgICBzdGF0ZS0+YmlhcysrOworCisgICAgICAgIGRyaWZ0IC09IGNvdW50OworICAgICAgICBpZiAoZHJpZnQgPiAwKQorICAgICAgICAgICAgZHJpZnQgPSAwOworICAgIH0KKworICAgIHN0YXRlLT5kcmlmdCA9IGRyaWZ0OworICAgIHN0YXRlLT5jb3VudCA9IGNvdW50OworfQorCisjZW5kaWYgLyogQVZDT0RFQ19GRlYxX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdjFkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdjFkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmJlNTFjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmZ2MWRlYy5jCkBAIC0wLDAgKzEsMTEwMSBAQAorLyoKKyAqIEZGVjEgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDEzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEZGIFZpZGVvIENvZGVjIDEgKGEgbG9zc2xlc3MgY29kZWMpIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAicmFuZ2Vjb2Rlci5oIgorI2luY2x1ZGUgImdvbG9tYi5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJmZnYxLmgiCisKK3N0YXRpYyBpbmxpbmUgYXZfZmxhdHRlbiBpbnQgZ2V0X3N5bWJvbF9pbmxpbmUoUmFuZ2VDb2RlciAqYywgdWludDhfdCAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19zaWduZWQpCit7CisgICAgaWYgKGdldF9yYWMoYywgc3RhdGUgKyAwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZSB7CisgICAgICAgIGludCBpLCBlLCBhOworICAgICAgICBlID0gMDsKKyAgICAgICAgd2hpbGUgKGdldF9yYWMoYywgc3RhdGUgKyAxICsgRkZNSU4oZSwgOSkpKSAvLyAxLi4xMAorICAgICAgICAgICAgZSsrOworCisgICAgICAgIGEgPSAxOworICAgICAgICBmb3IgKGkgPSBlIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICBhICs9IGEgKyBnZXRfcmFjKGMsIHN0YXRlICsgMjIgKyBGRk1JTihpLCA5KSk7ICAvLyAyMi4uMzEKKworICAgICAgICBlID0gLShpc19zaWduZWQgJiYgZ2V0X3JhYyhjLCBzdGF0ZSArIDExICsgRkZNSU4oZSwgMTApKSk7IC8vIDExLi4yMQorICAgICAgICByZXR1cm4gKGEgXiBlKSAtIGU7CisgICAgfQorfQorCitzdGF0aWMgYXZfbm9pbmxpbmUgaW50IGdldF9zeW1ib2woUmFuZ2VDb2RlciAqYywgdWludDhfdCAqc3RhdGUsIGludCBpc19zaWduZWQpCit7CisgICAgcmV0dXJuIGdldF9zeW1ib2xfaW5saW5lKGMsIHN0YXRlLCBpc19zaWduZWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfdmxjX3N5bWJvbChHZXRCaXRDb250ZXh0ICpnYiwgVmxjU3RhdGUgKmNvbnN0IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMpCit7CisgICAgaW50IGssIGksIHYsIHJldDsKKworICAgIGkgPSBzdGF0ZS0+Y291bnQ7CisgICAgayA9IDA7CisgICAgd2hpbGUgKGkgPCBzdGF0ZS0+ZXJyb3Jfc3VtKSB7IC8vIEZJWE1FOiBvcHRpbWl6ZQorICAgICAgICBrKys7CisgICAgICAgIGkgKz0gaTsKKyAgICB9CisKKyAgICB2ID0gZ2V0X3NyX2dvbG9tYihnYiwgaywgMTIsIGJpdHMpOworICAgIGF2X2Rsb2coTlVMTCwgInY6JWQgYmlhczolZCBlcnJvcjolZCBkcmlmdDolZCBjb3VudDolZCBrOiVkIiwKKyAgICAgICAgICAgIHYsIHN0YXRlLT5iaWFzLCBzdGF0ZS0+ZXJyb3Jfc3VtLCBzdGF0ZS0+ZHJpZnQsIHN0YXRlLT5jb3VudCwgayk7CisKKyNpZiAwIC8vIEpQRUcgTFMKKyAgICBpZiAoayA9PSAwICYmIDIgKiBzdGF0ZS0+ZHJpZnQgPD0gLXN0YXRlLT5jb3VudCkKKyAgICAgICAgdiBePSAoLTEpOworI2Vsc2UKKyAgICB2IF49ICgoMiAqIHN0YXRlLT5kcmlmdCArIHN0YXRlLT5jb3VudCkgPj4gMzEpOworI2VuZGlmCisKKyAgICByZXQgPSBmb2xkKHYgKyBzdGF0ZS0+YmlhcywgYml0cyk7CisKKyAgICB1cGRhdGVfdmxjX3N0YXRlKHN0YXRlLCB2KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZGVjb2RlX2xpbmUoRkZWMUNvbnRleHQgKnMsIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzYW1wbGVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGFuZV9pbmRleCwgaW50IGJpdHMpCit7CisgICAgUGxhbmVDb250ZXh0ICpjb25zdCBwID0gJnMtPnBsYW5lW3BsYW5lX2luZGV4XTsKKyAgICBSYW5nZUNvZGVyICpjb25zdCBjICAgPSAmcy0+YzsKKyAgICBpbnQgeDsKKyAgICBpbnQgcnVuX2NvdW50ID0gMDsKKyAgICBpbnQgcnVuX21vZGUgID0gMDsKKyAgICBpbnQgcnVuX2luZGV4ID0gcy0+cnVuX2luZGV4OworCisgICAgaWYgKHMtPnNsaWNlX2NvZGluZ19tb2RlID09IDEpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCB2ID0gMDsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPGJpdHM7IGkrKykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdGUgPSAxMjg7CisgICAgICAgICAgICAgICAgdiArPSB2ICsgZ2V0X3JhYyhjLCAmc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2FtcGxlWzFdW3hdID0gdjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICBpbnQgZGlmZiwgY29udGV4dCwgc2lnbjsKKworICAgICAgICBjb250ZXh0ID0gZ2V0X2NvbnRleHQocCwgc2FtcGxlWzFdICsgeCwgc2FtcGxlWzBdICsgeCwgc2FtcGxlWzFdICsgeCk7CisgICAgICAgIGlmIChjb250ZXh0IDwgMCkgeworICAgICAgICAgICAgY29udGV4dCA9IC1jb250ZXh0OworICAgICAgICAgICAgc2lnbiAgICA9IDE7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgc2lnbiA9IDA7CisKKyAgICAgICAgYXZfYXNzZXJ0Mihjb250ZXh0IDwgcC0+Y29udGV4dF9jb3VudCk7CisKKyAgICAgICAgaWYgKHMtPmFjKSB7CisgICAgICAgICAgICBkaWZmID0gZ2V0X3N5bWJvbF9pbmxpbmUoYywgcC0+c3RhdGVbY29udGV4dF0sIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gMCAmJiBydW5fbW9kZSA9PSAwKQorICAgICAgICAgICAgICAgIHJ1bl9tb2RlID0gMTsKKworICAgICAgICAgICAgaWYgKHJ1bl9tb2RlKSB7CisgICAgICAgICAgICAgICAgaWYgKHJ1bl9jb3VudCA9PSAwICYmIHJ1bl9tb2RlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5fY291bnQgPSAxIDw8IGZmX2xvZzJfcnVuW3J1bl9pbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCArIHJ1bl9jb3VudCA8PSB3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9pbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZmX2xvZzJfcnVuW3J1bl9pbmRleF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2NvdW50ID0gZ2V0X2JpdHMoJnMtPmdiLCBmZl9sb2cyX3J1bltydW5faW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bl9pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5faW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9tb2RlID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBydW5fY291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAocnVuX2NvdW50IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBydW5fbW9kZSAgPSAwOworICAgICAgICAgICAgICAgICAgICBydW5fY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBkaWZmICAgICAgPSBnZXRfdmxjX3N5bWJvbCgmcy0+Z2IsICZwLT52bGNfc3RhdGVbY29udGV4dF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZGlmZisrOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBkaWZmID0gMDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGRpZmYgPSBnZXRfdmxjX3N5bWJvbCgmcy0+Z2IsICZwLT52bGNfc3RhdGVbY29udGV4dF0sIGJpdHMpOworCisgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiY291bnQ6JWQgaW5kZXg6JWQsIG1vZGU6JWQsIHg6JWQgcG9zOiVkXG4iLAorICAgICAgICAgICAgICAgICAgICBydW5fY291bnQsIHJ1bl9pbmRleCwgcnVuX21vZGUsIHgsIGdldF9iaXRzX2NvdW50KCZzLT5nYikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNpZ24pCisgICAgICAgICAgICBkaWZmID0gLWRpZmY7CisKKyAgICAgICAgc2FtcGxlWzFdW3hdID0gKHByZWRpY3Qoc2FtcGxlWzFdICsgeCwgc2FtcGxlWzBdICsgeCkgKyBkaWZmKSAmCisgICAgICAgICAgICAgICAgICAgICAgICgoMSA8PCBiaXRzKSAtIDEpOworICAgIH0KKyAgICBzLT5ydW5faW5kZXggPSBydW5faW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9wbGFuZShGRlYxQ29udGV4dCAqcywgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSwgaW50IHBsYW5lX2luZGV4KQoreworICAgIGludCB4LCB5OworICAgIGludDE2X3QgKnNhbXBsZVsyXTsKKyAgICBzYW1wbGVbMF0gPSBzLT5zYW1wbGVfYnVmZmVyICsgMzsKKyAgICBzYW1wbGVbMV0gPSBzLT5zYW1wbGVfYnVmZmVyICsgdyArIDYgKyAzOworCisgICAgcy0+cnVuX2luZGV4ID0gMDsKKworICAgIG1lbXNldChzLT5zYW1wbGVfYnVmZmVyLCAwLCAyICogKHcgKyA2KSAqIHNpemVvZigqcy0+c2FtcGxlX2J1ZmZlcikpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBpbnQxNl90ICp0ZW1wID0gc2FtcGxlWzBdOyAvLyBGSVhNRTogdHJ5IGEgbm9ybWFsIGJ1ZmZlcgorCisgICAgICAgIHNhbXBsZVswXSA9IHNhbXBsZVsxXTsKKyAgICAgICAgc2FtcGxlWzFdID0gdGVtcDsKKworICAgICAgICBzYW1wbGVbMV1bLTFdID0gc2FtcGxlWzBdWzBdOworICAgICAgICBzYW1wbGVbMF1bd10gID0gc2FtcGxlWzBdW3cgLSAxXTsKKworLy8geyBTVEFSVF9USU1FUgorICAgICAgICBpZiAocy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPD0gOCkgeworICAgICAgICAgICAgZGVjb2RlX2xpbmUocywgdywgc2FtcGxlLCBwbGFuZV9pbmRleCwgOCk7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgICAgIHNyY1t4ICsgc3RyaWRlICogeV0gPSBzYW1wbGVbMV1beF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWNvZGVfbGluZShzLCB3LCBzYW1wbGUsIHBsYW5lX2luZGV4LCBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSk7CisgICAgICAgICAgICBpZiAocy0+cGFja2VkX2F0X2xzYikgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCopKHNyYyArIHN0cmlkZSp5KSlbeF0gPSBzYW1wbGVbMV1beF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QqKShzcmMgKyBzdHJpZGUqeSkpW3hdID0gc2FtcGxlWzFdW3hdIDw8ICgxNiAtIHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKy8vIFNUT1BfVElNRVIoImRlY29kZS1saW5lIikgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3JnYl9mcmFtZShGRlYxQ29udGV4dCAqcywgdWludDhfdCAqc3JjWzNdLCBpbnQgdywgaW50IGgsIGludCBzdHJpZGVbM10pCit7CisgICAgaW50IHgsIHksIHA7CisgICAgaW50MTZfdCAqc2FtcGxlWzRdWzJdOworICAgIGludCBsYmQgICAgPSBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA8PSA4OworICAgIGludCBiaXRzICAgPSBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+IDAgPyBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA6IDg7CisgICAgaW50IG9mZnNldCA9IDEgPDwgYml0czsKKworICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspIHsKKyAgICAgICAgc2FtcGxlW3hdWzBdID0gcy0+c2FtcGxlX2J1ZmZlciArICB4ICogMiAgICAgICogKHcgKyA2KSArIDM7CisgICAgICAgIHNhbXBsZVt4XVsxXSA9IHMtPnNhbXBsZV9idWZmZXIgKyAoeCAqIDIgKyAxKSAqICh3ICsgNikgKyAzOworICAgIH0KKworICAgIHMtPnJ1bl9pbmRleCA9IDA7CisKKyAgICBtZW1zZXQocy0+c2FtcGxlX2J1ZmZlciwgMCwgOCAqICh3ICsgNikgKiBzaXplb2YoKnMtPnNhbXBsZV9idWZmZXIpKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IDMgKyBzLT50cmFuc3BhcmVuY3k7IHArKykgeworICAgICAgICAgICAgaW50MTZfdCAqdGVtcCA9IHNhbXBsZVtwXVswXTsgLy8gRklYTUU6IHRyeSBhIG5vcm1hbCBidWZmZXIKKworICAgICAgICAgICAgc2FtcGxlW3BdWzBdID0gc2FtcGxlW3BdWzFdOworICAgICAgICAgICAgc2FtcGxlW3BdWzFdID0gdGVtcDsKKworICAgICAgICAgICAgc2FtcGxlW3BdWzFdWy0xXT0gc2FtcGxlW3BdWzBdWzAgIF07CisgICAgICAgICAgICBzYW1wbGVbcF1bMF1bIHddPSBzYW1wbGVbcF1bMF1bdy0xXTsKKyAgICAgICAgICAgIGlmIChsYmQgJiYgcy0+c2xpY2VfY29kaW5nX21vZGUgPT0gMCkKKyAgICAgICAgICAgICAgICBkZWNvZGVfbGluZShzLCB3LCBzYW1wbGVbcF0sIChwICsgMSkvMiwgOSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGVjb2RlX2xpbmUocywgdywgc2FtcGxlW3BdLCAocCArIDEpLzIsIGJpdHMgKyAocy0+c2xpY2VfY29kaW5nX21vZGUgIT0gMSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCBnID0gc2FtcGxlWzBdWzFdW3hdOworICAgICAgICAgICAgaW50IGIgPSBzYW1wbGVbMV1bMV1beF07CisgICAgICAgICAgICBpbnQgciA9IHNhbXBsZVsyXVsxXVt4XTsKKyAgICAgICAgICAgIGludCBhID0gc2FtcGxlWzNdWzFdW3hdOworCisgICAgICAgICAgICBpZiAocy0+c2xpY2VfY29kaW5nX21vZGUgIT0gMSkgeworICAgICAgICAgICAgICAgIGIgLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgIHIgLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgIGcgLT0gKGIgKiBzLT5zbGljZV9yY3RfYnlfY29lZiArIHIgKiBzLT5zbGljZV9yY3RfcnlfY29lZikgPj4gMjsKKyAgICAgICAgICAgICAgICBiICs9IGc7CisgICAgICAgICAgICAgICAgciArPSBnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGJkKQorICAgICAgICAgICAgICAgICooKHVpbnQzMl90Kikoc3JjWzBdICsgeCo0ICsgc3RyaWRlWzBdKnkpKSA9IGIgKyAoZzw8OCkgKyAocjw8MTYpICsgKGE8PDI0KTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICooKHVpbnQxNl90Kikoc3JjWzBdICsgeCoyICsgc3RyaWRlWzBdKnkpKSA9IGI7CisgICAgICAgICAgICAgICAgKigodWludDE2X3QqKShzcmNbMV0gKyB4KjIgKyBzdHJpZGVbMV0qeSkpID0gZzsKKyAgICAgICAgICAgICAgICAqKCh1aW50MTZfdCopKHNyY1syXSArIHgqMiArIHN0cmlkZVsyXSp5KSkgPSByOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9zbGljZV9oZWFkZXIoRkZWMUNvbnRleHQgKmYsIEZGVjFDb250ZXh0ICpmcykKK3sKKyAgICBSYW5nZUNvZGVyICpjID0gJmZzLT5jOworICAgIHVpbnQ4X3Qgc3RhdGVbQ09OVEVYVF9TSVpFXTsKKyAgICB1bnNpZ25lZCBwcywgaSwgY29udGV4dF9jb3VudDsKKyAgICBtZW1zZXQoc3RhdGUsIDEyOCwgc2l6ZW9mKHN0YXRlKSk7CisKKyAgICBhdl9hc3NlcnQwKGYtPnZlcnNpb24gPiAyKTsKKworICAgIGZzLT5zbGljZV94ICAgICAgPSAgZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCkgICAgICAqIGYtPndpZHRoIDsKKyAgICBmcy0+c2xpY2VfeSAgICAgID0gIGdldF9zeW1ib2woYywgc3RhdGUsIDApICAgICAgKiBmLT5oZWlnaHQ7CisgICAgZnMtPnNsaWNlX3dpZHRoICA9IChnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKSArIDEpICogZi0+d2lkdGggICsgZnMtPnNsaWNlX3g7CisgICAgZnMtPnNsaWNlX2hlaWdodCA9IChnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKSArIDEpICogZi0+aGVpZ2h0ICsgZnMtPnNsaWNlX3k7CisKKyAgICBmcy0+c2xpY2VfeCAvPSBmLT5udW1faF9zbGljZXM7CisgICAgZnMtPnNsaWNlX3kgLz0gZi0+bnVtX3Zfc2xpY2VzOworICAgIGZzLT5zbGljZV93aWR0aCAgPSBmcy0+c2xpY2Vfd2lkdGggL2YtPm51bV9oX3NsaWNlcyAtIGZzLT5zbGljZV94OworICAgIGZzLT5zbGljZV9oZWlnaHQgPSBmcy0+c2xpY2VfaGVpZ2h0L2YtPm51bV92X3NsaWNlcyAtIGZzLT5zbGljZV95OworICAgIGlmICgodW5zaWduZWQpZnMtPnNsaWNlX3dpZHRoID4gZi0+d2lkdGggfHwgKHVuc2lnbmVkKWZzLT5zbGljZV9oZWlnaHQgPiBmLT5oZWlnaHQpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoICAgICh1bnNpZ25lZClmcy0+c2xpY2VfeCArICh1aW50NjRfdClmcy0+c2xpY2Vfd2lkdGggID4gZi0+d2lkdGgKKyAgICAgICAgIHx8ICh1bnNpZ25lZClmcy0+c2xpY2VfeSArICh1aW50NjRfdClmcy0+c2xpY2VfaGVpZ2h0ID4gZi0+aGVpZ2h0KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZi0+cGxhbmVfY291bnQ7IGkrKykgeworICAgICAgICBQbGFuZUNvbnRleHQgKiBjb25zdCBwID0gJmZzLT5wbGFuZVtpXTsKKyAgICAgICAgaW50IGlkeCA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOworICAgICAgICBpZiAoaWR4ID4gKHVuc2lnbmVkKWYtPnF1YW50X3RhYmxlX2NvdW50KSB7CisgICAgICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInF1YW50X3RhYmxlX2luZGV4IG91dCBvZiByYW5nZVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcC0+cXVhbnRfdGFibGVfaW5kZXggPSBpZHg7CisgICAgICAgIG1lbWNweShwLT5xdWFudF90YWJsZSwgZi0+cXVhbnRfdGFibGVzW2lkeF0sIHNpemVvZihwLT5xdWFudF90YWJsZSkpOworICAgICAgICBjb250ZXh0X2NvdW50ID0gZi0+Y29udGV4dF9jb3VudFtpZHhdOworCisgICAgICAgIGlmIChwLT5jb250ZXh0X2NvdW50IDwgY29udGV4dF9jb3VudCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnAtPnN0YXRlKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwLT52bGNfc3RhdGUpOworICAgICAgICB9CisgICAgICAgIHAtPmNvbnRleHRfY291bnQgPSBjb250ZXh0X2NvdW50OworICAgIH0KKworICAgIHBzID0gZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCk7CisgICAgaWYgKHBzID09IDEpIHsKKyAgICAgICAgZi0+Y3VyLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICAgICAgZi0+Y3VyLT50b3BfZmllbGRfZmlyc3QgID0gMTsKKyAgICB9IGVsc2UgaWYgKHBzID09IDIpIHsKKyAgICAgICAgZi0+Y3VyLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICAgICAgZi0+Y3VyLT50b3BfZmllbGRfZmlyc3QgID0gMDsKKyAgICB9IGVsc2UgaWYgKHBzID09IDMpIHsKKyAgICAgICAgZi0+Y3VyLT5pbnRlcmxhY2VkX2ZyYW1lID0gMDsKKyAgICB9CisgICAgZi0+Y3VyLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOworICAgIGYtPmN1ci0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPSBnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKTsKKworICAgIGlmIChhdl9pbWFnZV9jaGVja19zYXIoZi0+d2lkdGgsIGYtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmN1ci0+c2FtcGxlX2FzcGVjdF9yYXRpbykgPCAwKSB7CisgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJpZ25vcmluZyBpbnZhbGlkIFNBUjogJXUvJXVcbiIsCisgICAgICAgICAgICAgICBmLT5jdXItPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgZi0+Y3VyLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisgICAgICAgIGYtPmN1ci0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsgMCwgMSB9OworICAgIH0KKworICAgIGlmIChmcy0+dmVyc2lvbiA+IDMpIHsKKyAgICAgICAgZnMtPnNsaWNlX3Jlc2V0X2NvbnRleHRzID0gZ2V0X3JhYyhjLCBzdGF0ZSk7CisgICAgICAgIGZzLT5zbGljZV9jb2RpbmdfbW9kZSA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOworICAgICAgICBpZiAoZnMtPnNsaWNlX2NvZGluZ19tb2RlICE9IDEpIHsKKyAgICAgICAgICAgIGZzLT5zbGljZV9yY3RfYnlfY29lZiA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOworICAgICAgICAgICAgZnMtPnNsaWNlX3JjdF9yeV9jb2VmID0gZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCk7CisgICAgICAgICAgICBpZiAoKHVpbnQ2NF90KWZzLT5zbGljZV9yY3RfYnlfY29lZiArICh1aW50NjRfdClmcy0+c2xpY2VfcmN0X3J5X2NvZWYgPiA0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzbGljZV9yY3RfeV9jb2VmIG91dCBvZiByYW5nZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmMsIHZvaWQgKmFyZykKK3sKKyAgICBGRlYxQ29udGV4dCAqZnMgICA9ICoodm9pZCAqKilhcmc7CisgICAgRkZWMUNvbnRleHQgKmYgICAgPSBmcy0+YXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgd2lkdGgsIGhlaWdodCwgeCwgeSwgcmV0OworICAgIGNvbnN0IGludCBwcyAgICAgID0gYXZfcGl4X2ZtdF9kZXNjX2dldChjLT5waXhfZm10KS0+Y29tcFswXS5zdGVwX21pbnVzMSArIDE7CisgICAgQVZGcmFtZSAqIGNvbnN0IHAgPSBmLT5jdXI7CisgICAgaW50IGksIHNpOworCisgICAgZm9yKCBzaT0wOyBmcyAhPSBmLT5zbGljZV9jb250ZXh0W3NpXTsgc2kgKyspCisgICAgICAgIDsKKworICAgIGlmKGYtPmZzcmMgJiYgIXAtPmtleV9mcmFtZSkKKyAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKCZmLT5sYXN0X3BpY3R1cmUsIHNpLCAwKTsKKworICAgIGlmKGYtPmZzcmMgJiYgIXAtPmtleV9mcmFtZSkgeworICAgICAgICBGRlYxQ29udGV4dCAqZnNzcmMgPSBmLT5mc3JjLT5zbGljZV9jb250ZXh0W3NpXTsKKyAgICAgICAgRkZWMUNvbnRleHQgKmZzZHN0ID0gZi0+c2xpY2VfY29udGV4dFtzaV07CisgICAgICAgIGF2X2Fzc2VydDEoZnNkc3QtPnBsYW5lX2NvdW50ID09IGZzc3JjLT5wbGFuZV9jb3VudCk7CisgICAgICAgIGF2X2Fzc2VydDEoZnNkc3QgPT0gZnMpOworCisgICAgICAgIGlmICghcC0+a2V5X2ZyYW1lKQorICAgICAgICAgICAgZnNkc3QtPnNsaWNlX2RhbWFnZWQgfD0gZnNzcmMtPnNsaWNlX2RhbWFnZWQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGYtPnBsYW5lX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFBsYW5lQ29udGV4dCAqcHNyYyA9ICZmc3NyYy0+cGxhbmVbaV07CisgICAgICAgICAgICBQbGFuZUNvbnRleHQgKnBkc3QgPSAmZnNkc3QtPnBsYW5lW2ldOworCisgICAgICAgICAgICBhdl9mcmVlKHBkc3QtPnN0YXRlKTsKKyAgICAgICAgICAgIGF2X2ZyZWUocGRzdC0+dmxjX3N0YXRlKTsKKyAgICAgICAgICAgIG1lbWNweShwZHN0LCBwc3JjLCBzaXplb2YoKnBkc3QpKTsKKyAgICAgICAgICAgIHBkc3QtPnN0YXRlID0gTlVMTDsKKyAgICAgICAgICAgIHBkc3QtPnZsY19zdGF0ZSA9IE5VTEw7CisKKyAgICAgICAgICAgIGlmIChmc3NyYy0+YWMpIHsKKyAgICAgICAgICAgICAgICBwZHN0LT5zdGF0ZSA9IGF2X21hbGxvY19hcnJheShDT05URVhUX1NJWkUsICBwc3JjLT5jb250ZXh0X2NvdW50KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocGRzdC0+c3RhdGUsIHBzcmMtPnN0YXRlLCBDT05URVhUX1NJWkUgKiBwc3JjLT5jb250ZXh0X2NvdW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGRzdC0+dmxjX3N0YXRlID0gYXZfbWFsbG9jX2FycmF5KHNpemVvZigqcGRzdC0+dmxjX3N0YXRlKSwgcHNyYy0+Y29udGV4dF9jb3VudCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBkc3QtPnZsY19zdGF0ZSwgcHNyYy0+dmxjX3N0YXRlLCBzaXplb2YoKnBkc3QtPnZsY19zdGF0ZSkgKiBwc3JjLT5jb250ZXh0X2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZzLT5zbGljZV9yY3RfYnlfY29lZiA9IDE7CisgICAgZnMtPnNsaWNlX3JjdF9yeV9jb2VmID0gMTsKKworICAgIGlmIChmLT52ZXJzaW9uID4gMikgeworICAgICAgICBpZiAoZmZ2MV9pbml0X3NsaWNlX3N0YXRlKGYsIGZzKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBpZiAoZGVjb2RlX3NsaWNlX2hlYWRlcihmLCBmcykgPCAwKSB7CisgICAgICAgICAgICBmcy0+c2xpY2VfZGFtYWdlZCA9IDE7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHJldCA9IGZmdjFfaW5pdF9zbGljZV9zdGF0ZShmLCBmcykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoZi0+Y3VyLT5rZXlfZnJhbWUgfHwgZnMtPnNsaWNlX3Jlc2V0X2NvbnRleHRzKQorICAgICAgICBmZnYxX2NsZWFyX3NsaWNlX3N0YXRlKGYsIGZzKTsKKworICAgIHdpZHRoICA9IGZzLT5zbGljZV93aWR0aDsKKyAgICBoZWlnaHQgPSBmcy0+c2xpY2VfaGVpZ2h0OworICAgIHggICAgICA9IGZzLT5zbGljZV94OworICAgIHkgICAgICA9IGZzLT5zbGljZV95OworCisgICAgaWYgKCFmcy0+YWMpIHsKKyAgICAgICAgaWYgKGYtPnZlcnNpb24gPT0gMyAmJiBmLT5taWNyb192ZXJzaW9uID4gMSB8fCBmLT52ZXJzaW9uID4gMykKKyAgICAgICAgICAgIGdldF9yYWMoJmZzLT5jLCAodWludDhfdFtdKSB7IDEyOSB9KTsKKyAgICAgICAgZnMtPmFjX2J5dGVfY291bnQgPSBmLT52ZXJzaW9uID4gMiB8fCAoIXggJiYgIXkpID8gZnMtPmMuYnl0ZXN0cmVhbSAtIGZzLT5jLmJ5dGVzdHJlYW1fc3RhcnQgLSAxIDogMDsKKyAgICAgICAgaW5pdF9nZXRfYml0cygmZnMtPmdiLAorICAgICAgICAgICAgICAgICAgICAgIGZzLT5jLmJ5dGVzdHJlYW1fc3RhcnQgKyBmcy0+YWNfYnl0ZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAoZnMtPmMuYnl0ZXN0cmVhbV9lbmQgLSBmcy0+Yy5ieXRlc3RyZWFtX3N0YXJ0IC0gZnMtPmFjX2J5dGVfY291bnQpICogOCk7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MSh3aWR0aCAmJiBoZWlnaHQpOworICAgIGlmIChmLT5jb2xvcnNwYWNlID09IDApIHsKKyAgICAgICAgY29uc3QgaW50IGNocm9tYV93aWR0aCAgPSBGRl9DRUlMX1JTSElGVCh3aWR0aCwgIGYtPmNocm9tYV9oX3NoaWZ0KTsKKyAgICAgICAgY29uc3QgaW50IGNocm9tYV9oZWlnaHQgPSBGRl9DRUlMX1JTSElGVChoZWlnaHQsIGYtPmNocm9tYV92X3NoaWZ0KTsKKyAgICAgICAgY29uc3QgaW50IGN4ICAgICAgICAgICAgPSB4ID4+IGYtPmNocm9tYV9oX3NoaWZ0OworICAgICAgICBjb25zdCBpbnQgY3kgICAgICAgICAgICA9IHkgPj4gZi0+Y2hyb21hX3Zfc2hpZnQ7CisgICAgICAgIGRlY29kZV9wbGFuZShmcywgcC0+ZGF0YVswXSArIHBzKnggKyB5KnAtPmxpbmVzaXplWzBdLCB3aWR0aCwgaGVpZ2h0LCBwLT5saW5lc2l6ZVswXSwgMCk7CisKKyAgICAgICAgaWYgKGYtPmNocm9tYV9wbGFuZXMpIHsKKyAgICAgICAgICAgIGRlY29kZV9wbGFuZShmcywgcC0+ZGF0YVsxXSArIHBzKmN4K2N5KnAtPmxpbmVzaXplWzFdLCBjaHJvbWFfd2lkdGgsIGNocm9tYV9oZWlnaHQsIHAtPmxpbmVzaXplWzFdLCAxKTsKKyAgICAgICAgICAgIGRlY29kZV9wbGFuZShmcywgcC0+ZGF0YVsyXSArIHBzKmN4K2N5KnAtPmxpbmVzaXplWzJdLCBjaHJvbWFfd2lkdGgsIGNocm9tYV9oZWlnaHQsIHAtPmxpbmVzaXplWzJdLCAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnMtPnRyYW5zcGFyZW5jeSkKKyAgICAgICAgICAgIGRlY29kZV9wbGFuZShmcywgcC0+ZGF0YVszXSArIHBzKnggKyB5KnAtPmxpbmVzaXplWzNdLCB3aWR0aCwgaGVpZ2h0LCBwLT5saW5lc2l6ZVszXSwgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDhfdCAqcGxhbmVzWzNdID0geyBwLT5kYXRhWzBdICsgcHMgKiB4ICsgeSAqIHAtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGFbMV0gKyBwcyAqIHggKyB5ICogcC0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVsyXSArIHBzICogeCArIHkgKiBwLT5saW5lc2l6ZVsyXSB9OworICAgICAgICBkZWNvZGVfcmdiX2ZyYW1lKGZzLCBwbGFuZXMsIHdpZHRoLCBoZWlnaHQsIHAtPmxpbmVzaXplKTsKKyAgICB9CisgICAgaWYgKGZzLT5hYyAmJiBmLT52ZXJzaW9uID4gMikgeworICAgICAgICBpbnQgdjsKKyAgICAgICAgZ2V0X3JhYygmZnMtPmMsICh1aW50OF90W10pIHsgMTI5IH0pOworICAgICAgICB2ID0gZnMtPmMuYnl0ZXN0cmVhbV9lbmQgLSBmcy0+Yy5ieXRlc3RyZWFtIC0gMiAtIDUqZi0+ZWM7CisgICAgICAgIGlmICh2KSB7CisgICAgICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImJ5dGVzdHJlYW0gZW5kIG1pc21hdGNoaW5nIGJ5ICVkXG4iLCB2KTsKKyAgICAgICAgICAgIGZzLT5zbGljZV9kYW1hZ2VkID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVtbXNfYygpOworCisgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmZi0+cGljdHVyZSwgc2ksIDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9xdWFudF90YWJsZShSYW5nZUNvZGVyICpjLCBpbnQxNl90ICpxdWFudF90YWJsZSwgaW50IHNjYWxlKQoreworICAgIGludCB2OworICAgIGludCBpID0gMDsKKyAgICB1aW50OF90IHN0YXRlW0NPTlRFWFRfU0laRV07CisKKyAgICBtZW1zZXQoc3RhdGUsIDEyOCwgc2l6ZW9mKHN0YXRlKSk7CisKKyAgICBmb3IgKHYgPSAwOyBpIDwgMTI4OyB2KyspIHsKKyAgICAgICAgdW5zaWduZWQgbGVuID0gZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCkgKyAxOworCisgICAgICAgIGlmIChsZW4gPiAxMjggLSBpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgICAgICBxdWFudF90YWJsZVtpXSA9IHNjYWxlICogdjsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDE7IGkgPCAxMjg7IGkrKykKKyAgICAgICAgcXVhbnRfdGFibGVbMjU2IC0gaV0gPSAtcXVhbnRfdGFibGVbaV07CisgICAgcXVhbnRfdGFibGVbMTI4XSA9IC1xdWFudF90YWJsZVsxMjddOworCisgICAgcmV0dXJuIDIgKiB2IC0gMTsKK30KKworc3RhdGljIGludCByZWFkX3F1YW50X3RhYmxlcyhSYW5nZUNvZGVyICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHF1YW50X3RhYmxlW01BWF9DT05URVhUX0lOUFVUU11bMjU2XSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgY29udGV4dF9jb3VudCA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIGNvbnRleHRfY291bnQgKj0gcmVhZF9xdWFudF90YWJsZShjLCBxdWFudF90YWJsZVtpXSwgY29udGV4dF9jb3VudCk7CisgICAgICAgIGlmIChjb250ZXh0X2NvdW50ID4gMzI3NjhVKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGNvbnRleHRfY291bnQgKyAxKSAvIDI7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9leHRyYV9oZWFkZXIoRkZWMUNvbnRleHQgKmYpCit7CisgICAgUmFuZ2VDb2RlciAqY29uc3QgYyA9ICZmLT5jOworICAgIHVpbnQ4X3Qgc3RhdGVbQ09OVEVYVF9TSVpFXTsKKyAgICBpbnQgaSwgaiwgaywgcmV0OworICAgIHVpbnQ4X3Qgc3RhdGUyWzMyXVtDT05URVhUX1NJWkVdOworCisgICAgbWVtc2V0KHN0YXRlMiwgMTI4LCBzaXplb2Yoc3RhdGUyKSk7CisgICAgbWVtc2V0KHN0YXRlLCAxMjgsIHNpemVvZihzdGF0ZSkpOworCisgICAgZmZfaW5pdF9yYW5nZV9kZWNvZGVyKGMsIGYtPmF2Y3R4LT5leHRyYWRhdGEsIGYtPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgZmZfYnVpbGRfcmFjX3N0YXRlcyhjLCAwLjA1ICogKDFMTCA8PCAzMiksIDI1NiAtIDgpOworCisgICAgZi0+dmVyc2lvbiA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOworICAgIGlmIChmLT52ZXJzaW9uIDwgMikgeworICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdmVyc2lvbiBpbiBnbG9iYWwgaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChmLT52ZXJzaW9uID4gMikgeworICAgICAgICBjLT5ieXRlc3RyZWFtX2VuZCAtPSA0OworICAgICAgICBmLT5taWNyb192ZXJzaW9uID0gZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCk7CisgICAgfQorICAgIGYtPmFjID0gZi0+YXZjdHgtPmNvZGVyX3R5cGUgPSBnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKTsKKyAgICBpZiAoZi0+YWMgPiAxKSB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIGYtPnN0YXRlX3RyYW5zaXRpb25baV0gPSBnZXRfc3ltYm9sKGMsIHN0YXRlLCAxKSArIGMtPm9uZV9zdGF0ZVtpXTsKKyAgICB9CisKKyAgICBmLT5jb2xvcnNwYWNlICAgICAgICAgICAgICAgICA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOyAvL1lVViBjcyB0eXBlCisgICAgZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKTsKKyAgICBmLT5jaHJvbWFfcGxhbmVzICAgICAgICAgICAgICA9IGdldF9yYWMoYywgc3RhdGUpOworICAgIGYtPmNocm9tYV9oX3NoaWZ0ICAgICAgICAgICAgID0gZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCk7CisgICAgZi0+Y2hyb21hX3Zfc2hpZnQgICAgICAgICAgICAgPSBnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKTsKKyAgICBmLT50cmFuc3BhcmVuY3kgICAgICAgICAgICAgICA9IGdldF9yYWMoYywgc3RhdGUpOworICAgIGYtPnBsYW5lX2NvdW50ICAgICAgICAgICAgICAgID0gMSArIChmLT5jaHJvbWFfcGxhbmVzIHx8IGYtPnZlcnNpb248NCkgKyBmLT50cmFuc3BhcmVuY3k7CisgICAgZi0+bnVtX2hfc2xpY2VzICAgICAgICAgICAgICAgPSAxICsgZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCk7CisgICAgZi0+bnVtX3Zfc2xpY2VzICAgICAgICAgICAgICAgPSAxICsgZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCk7CisKKyAgICBpZiAoZi0+bnVtX2hfc2xpY2VzID4gKHVuc2lnbmVkKWYtPndpZHRoICB8fCAhZi0+bnVtX2hfc2xpY2VzIHx8CisgICAgICAgIGYtPm51bV92X3NsaWNlcyA+ICh1bnNpZ25lZClmLT5oZWlnaHQgfHwgIWYtPm51bV92X3NsaWNlcworICAgICAgICkgeworICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInNsaWNlIGNvdW50IGludmFsaWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmLT5xdWFudF90YWJsZV9jb3VudCA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOworICAgIGlmIChmLT5xdWFudF90YWJsZV9jb3VudCA+ICh1bnNpZ25lZClNQVhfUVVBTlRfVEFCTEVTKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmLT5xdWFudF90YWJsZV9jb3VudDsgaSsrKSB7CisgICAgICAgIGYtPmNvbnRleHRfY291bnRbaV0gPSByZWFkX3F1YW50X3RhYmxlcyhjLCBmLT5xdWFudF90YWJsZXNbaV0pOworICAgICAgICBpZiAoZi0+Y29udGV4dF9jb3VudFtpXSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicmVhZF9xdWFudF90YWJsZSBlcnJvclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHJldCA9IGZmdjFfYWxsb2NhdGVfaW5pdGlhbF9zdGF0ZXMoZikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmLT5xdWFudF90YWJsZV9jb3VudDsgaSsrKQorICAgICAgICBpZiAoZ2V0X3JhYyhjLCBzdGF0ZSkpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmLT5jb250ZXh0X2NvdW50W2ldOyBqKyspCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IENPTlRFWFRfU0laRTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBwcmVkID0gaiA/IGYtPmluaXRpYWxfc3RhdGVzW2ldW2ogLSAxXVtrXSA6IDEyODsKKyAgICAgICAgICAgICAgICAgICAgZi0+aW5pdGlhbF9zdGF0ZXNbaV1bal1ba10gPQorICAgICAgICAgICAgICAgICAgICAgICAgKHByZWQgKyBnZXRfc3ltYm9sKGMsIHN0YXRlMltrXSwgMSkpICYgMHhGRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIGlmIChmLT52ZXJzaW9uID4gMikgeworICAgICAgICBmLT5lYyA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOworICAgICAgICBpZiAoZi0+bWljcm9fdmVyc2lvbiA+IDIpCisgICAgICAgICAgICBmLT5pbnRyYSA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOworICAgIH0KKworICAgIGlmIChmLT52ZXJzaW9uID4gMikgeworICAgICAgICB1bnNpZ25lZCB2OworICAgICAgICB2ID0gYXZfY3JjKGF2X2NyY19nZXRfdGFibGUoQVZfQ1JDXzMyX0lFRUUpLCAwLAorICAgICAgICAgICAgICAgICAgIGYtPmF2Y3R4LT5leHRyYWRhdGEsIGYtPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIGlmICh2KSB7CisgICAgICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNSQyBtaXNtYXRjaCAlWCFcbiIsIHYpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZi0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJnbG9iYWw6IHZlcjolZC4lZCwgY29kZXI6JWQsIGNvbG9yc3BhY2U6ICVkIGJwcjolZCBjaHJvbWE6JWQoJWQ6JWQpLCBhbHBoYTolZCBzbGljZXM6JWR4JWQgcXRhYnM6JWQgZWM6JWQgaW50cmE6JWRcbiIsCisgICAgICAgICAgICAgICBmLT52ZXJzaW9uLCBmLT5taWNyb192ZXJzaW9uLAorICAgICAgICAgICAgICAgZi0+YWMsCisgICAgICAgICAgICAgICBmLT5jb2xvcnNwYWNlLAorICAgICAgICAgICAgICAgZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUsCisgICAgICAgICAgICAgICBmLT5jaHJvbWFfcGxhbmVzLCBmLT5jaHJvbWFfaF9zaGlmdCwgZi0+Y2hyb21hX3Zfc2hpZnQsCisgICAgICAgICAgICAgICBmLT50cmFuc3BhcmVuY3ksCisgICAgICAgICAgICAgICBmLT5udW1faF9zbGljZXMsIGYtPm51bV92X3NsaWNlcywKKyAgICAgICAgICAgICAgIGYtPnF1YW50X3RhYmxlX2NvdW50LAorICAgICAgICAgICAgICAgZi0+ZWMsCisgICAgICAgICAgICAgICBmLT5pbnRyYQorICAgICAgICAgICAgICApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKEZGVjFDb250ZXh0ICpmKQoreworICAgIHVpbnQ4X3Qgc3RhdGVbQ09OVEVYVF9TSVpFXTsKKyAgICBpbnQgaSwgaiwgY29udGV4dF9jb3VudCA9IC0xOyAvLy0xIHRvIGF2b2lkIHdhcm5pbmcKKyAgICBSYW5nZUNvZGVyICpjb25zdCBjID0gJmYtPnNsaWNlX2NvbnRleHRbMF0tPmM7CisKKyAgICBtZW1zZXQoc3RhdGUsIDEyOCwgc2l6ZW9mKHN0YXRlKSk7CisKKyAgICBpZiAoZi0+dmVyc2lvbiA8IDIpIHsKKyAgICAgICAgaW50IGNocm9tYV9wbGFuZXMsIGNocm9tYV9oX3NoaWZ0LCBjaHJvbWFfdl9zaGlmdCwgdHJhbnNwYXJlbmN5LCBjb2xvcnNwYWNlLCBiaXRzX3Blcl9yYXdfc2FtcGxlOworICAgICAgICB1bnNpZ25lZCB2PSBnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKTsKKyAgICAgICAgaWYgKHYgPj0gMikgeworICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHZlcnNpb24gJWQgaW4gdmVyMDEgaGVhZGVyXG4iLCB2KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGYtPnZlcnNpb24gPSB2OworICAgICAgICBmLT5hYyAgICAgID0gZi0+YXZjdHgtPmNvZGVyX3R5cGUgPSBnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKTsKKyAgICAgICAgaWYgKGYtPmFjID4gMSkgeworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDI1NjsgaSsrKQorICAgICAgICAgICAgICAgIGYtPnN0YXRlX3RyYW5zaXRpb25baV0gPSBnZXRfc3ltYm9sKGMsIHN0YXRlLCAxKSArIGMtPm9uZV9zdGF0ZVtpXTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbG9yc3BhY2UgICAgICAgICAgPSBnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKTsgLy9ZVVYgY3MgdHlwZQorICAgICAgICBiaXRzX3Blcl9yYXdfc2FtcGxlID0gZi0+dmVyc2lvbiA+IDAgPyBnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKSA6IGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlOworICAgICAgICBjaHJvbWFfcGxhbmVzICAgICAgID0gZ2V0X3JhYyhjLCBzdGF0ZSk7CisgICAgICAgIGNocm9tYV9oX3NoaWZ0ICAgICAgPSBnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKTsKKyAgICAgICAgY2hyb21hX3Zfc2hpZnQgICAgICA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOworICAgICAgICB0cmFuc3BhcmVuY3kgICAgICAgID0gZ2V0X3JhYyhjLCBzdGF0ZSk7CisKKyAgICAgICAgaWYgKGYtPnBsYW5lX2NvdW50KSB7CisgICAgICAgICAgICBpZiAoY29sb3JzcGFjZSAgICAgICAgICAhPSBmLT5jb2xvcnNwYWNlICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgIGJpdHNfcGVyX3Jhd19zYW1wbGUgIT0gZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgfHwKKyAgICAgICAgICAgICAgICBjaHJvbWFfcGxhbmVzICAgICAgICE9IGYtPmNocm9tYV9wbGFuZXMgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgY2hyb21hX2hfc2hpZnQgICAgICAhPSBmLT5jaHJvbWFfaF9zaGlmdCAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgIGNocm9tYV92X3NoaWZ0ICAgICAgIT0gZi0+Y2hyb21hX3Zfc2hpZnQgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgICAgICAgICE9IGYtPnRyYW5zcGFyZW5jeSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaGFuZ2Ugb2YgZ2xvYmFsIHBhcmFtZXRlcnNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZi0+Y29sb3JzcGFjZSAgICAgICAgICAgICAgICAgPSBjb2xvcnNwYWNlOworICAgICAgICBmLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IGJpdHNfcGVyX3Jhd19zYW1wbGU7CisgICAgICAgIGYtPmNocm9tYV9wbGFuZXMgICAgICAgICAgICAgID0gY2hyb21hX3BsYW5lczsKKyAgICAgICAgZi0+Y2hyb21hX2hfc2hpZnQgICAgICAgICAgICAgPSBjaHJvbWFfaF9zaGlmdDsKKyAgICAgICAgZi0+Y2hyb21hX3Zfc2hpZnQgICAgICAgICAgICAgPSBjaHJvbWFfdl9zaGlmdDsKKyAgICAgICAgZi0+dHJhbnNwYXJlbmN5ICAgICAgICAgICAgICAgPSB0cmFuc3BhcmVuY3k7CisKKyAgICAgICAgZi0+cGxhbmVfY291bnQgICAgPSAyICsgZi0+dHJhbnNwYXJlbmN5OworICAgIH0KKworICAgIGlmIChmLT5jb2xvcnNwYWNlID09IDApIHsKKyAgICAgICAgaWYgKGYtPmF2Y3R4LT5za2lwX2FscGhhKSBmLT50cmFuc3BhcmVuY3kgPSAwOworICAgICAgICBpZiAoIWYtPnRyYW5zcGFyZW5jeSAmJiAhZi0+Y2hyb21hX3BsYW5lcykgeworICAgICAgICAgICAgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlIDw9IDgpCisgICAgICAgICAgICAgICAgZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVk4OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTY7CisgICAgICAgIH0gZWxzZSBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGU8PTggJiYgIWYtPnRyYW5zcGFyZW5jeSkgeworICAgICAgICAgICAgc3dpdGNoKDE2ICogZi0+Y2hyb21hX2hfc2hpZnQgKyBmLT5jaHJvbWFfdl9zaGlmdCkgeworICAgICAgICAgICAgY2FzZSAweDAwOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDE6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDBQOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxMDogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDExOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MjA6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MTFQOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgyMjogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQxMFA7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlIDw9IDggJiYgZi0+dHJhbnNwYXJlbmN5KSB7CisgICAgICAgICAgICBzd2l0Y2goMTYqZi0+Y2hyb21hX2hfc2hpZnQgKyBmLT5jaHJvbWFfdl9zaGlmdCkgeworICAgICAgICAgICAgY2FzZSAweDAwOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQ0NFA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDEwOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQyMlA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDExOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQyMFA7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDkgJiYgIWYtPnRyYW5zcGFyZW5jeSkgeworICAgICAgICAgICAgZi0+cGFja2VkX2F0X2xzYiA9IDE7CisgICAgICAgICAgICBzd2l0Y2goMTYgKiBmLT5jaHJvbWFfaF9zaGlmdCArIGYtPmNocm9tYV92X3NoaWZ0KSB7CisgICAgICAgICAgICBjYXNlIDB4MDA6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MTA6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MTE6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gOSAmJiBmLT50cmFuc3BhcmVuY3kpIHsKKyAgICAgICAgICAgIGYtPnBhY2tlZF9hdF9sc2IgPSAxOworICAgICAgICAgICAgc3dpdGNoKDE2ICogZi0+Y2hyb21hX2hfc2hpZnQgKyBmLT5jaHJvbWFfdl9zaGlmdCkgeworICAgICAgICAgICAgY2FzZSAweDAwOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQ0NFA5OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxMDogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0MjJQOTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MTE6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDIwUDk7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDEwICYmICFmLT50cmFuc3BhcmVuY3kpIHsKKyAgICAgICAgICAgIGYtPnBhY2tlZF9hdF9sc2IgPSAxOworICAgICAgICAgICAgc3dpdGNoKDE2ICogZi0+Y2hyb21hX2hfc2hpZnQgKyBmLT5jaHJvbWFfdl9zaGlmdCkgeworICAgICAgICAgICAgY2FzZSAweDAwOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDEwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxMDogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MTE6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQMTA7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDEwICYmIGYtPnRyYW5zcGFyZW5jeSkgeworICAgICAgICAgICAgZi0+cGFja2VkX2F0X2xzYiA9IDE7CisgICAgICAgICAgICBzd2l0Y2goMTYgKiBmLT5jaHJvbWFfaF9zaGlmdCArIGYtPmNocm9tYV92X3NoaWZ0KSB7CisgICAgICAgICAgICBjYXNlIDB4MDA6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxMDogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0MjJQMTA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDExOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQyMFAxMDsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTYgJiYgIWYtPnRyYW5zcGFyZW5jeSl7CisgICAgICAgICAgICBzd2l0Y2goMTYgKiBmLT5jaHJvbWFfaF9zaGlmdCArIGYtPmNocm9tYV92X3NoaWZ0KSB7CisgICAgICAgICAgICBjYXNlIDB4MDA6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTY7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDEwOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDE2OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxMTogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxNjsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTYgJiYgZi0+dHJhbnNwYXJlbmN5KXsKKyAgICAgICAgICAgIHN3aXRjaCgxNiAqIGYtPmNocm9tYV9oX3NoaWZ0ICsgZi0+Y2hyb21hX3Zfc2hpZnQpIHsKKyAgICAgICAgICAgIGNhc2UgMHgwMDogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0NDRQMTY7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDEwOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQyMlAxNjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MTE6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDIwUDE2OyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZi0+Y29sb3JzcGFjZSA9PSAxKSB7CisgICAgICAgIGlmIChmLT5jaHJvbWFfaF9zaGlmdCB8fCBmLT5jaHJvbWFfdl9zaGlmdCkgeworICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImNocm9tYSBzdWJzYW1wbGluZyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY29sb3JzcGFjZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICAgICB9CisgICAgICAgIGlmICggICAgIGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09ICA5KQorICAgICAgICAgICAgZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlA5OworICAgICAgICBlbHNlIGlmIChmLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMCkKKyAgICAgICAgICAgIGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTA7CisgICAgICAgIGVsc2UgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDEyKQorICAgICAgICAgICAgZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlAxMjsKKyAgICAgICAgZWxzZSBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTQpCisgICAgICAgICAgICBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDE0OworICAgICAgICBlbHNlCisgICAgICAgIGlmIChmLT50cmFuc3BhcmVuY3kpIGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IzMjsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UXzBSR0IzMjsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNvbG9yc3BhY2Ugbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorICAgIGlmIChmLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgYXZfZGxvZyhmLT5hdmN0eCwgIiVkICVkICVkXG4iLAorICAgICAgICAgICAgZi0+Y2hyb21hX2hfc2hpZnQsIGYtPmNocm9tYV92X3NoaWZ0LCBmLT5hdmN0eC0+cGl4X2ZtdCk7CisgICAgaWYgKGYtPnZlcnNpb24gPCAyKSB7CisgICAgICAgIGNvbnRleHRfY291bnQgPSByZWFkX3F1YW50X3RhYmxlcyhjLCBmLT5xdWFudF90YWJsZSk7CisgICAgICAgIGlmIChjb250ZXh0X2NvdW50IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZWFkX3F1YW50X3RhYmxlIGVycm9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmLT52ZXJzaW9uIDwgMykgeworICAgICAgICBmLT5zbGljZV9jb3VudCA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBjLT5ieXRlc3RyZWFtX2VuZDsKKyAgICAgICAgZm9yIChmLT5zbGljZV9jb3VudCA9IDA7CisgICAgICAgICAgICAgZi0+c2xpY2VfY291bnQgPCBNQVhfU0xJQ0VTICYmIDMgPCBwIC0gYy0+Ynl0ZXN0cmVhbV9zdGFydDsKKyAgICAgICAgICAgICBmLT5zbGljZV9jb3VudCsrKSB7CisgICAgICAgICAgICBpbnQgdHJhaWxlciA9IDMgKyA1KiEhZi0+ZWM7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IEFWX1JCMjQocC10cmFpbGVyKTsKKyAgICAgICAgICAgIGlmIChzaXplICsgdHJhaWxlciA+IHAgLSBjLT5ieXRlc3RyZWFtX3N0YXJ0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcCAtPSBzaXplICsgdHJhaWxlcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZi0+c2xpY2VfY291bnQgPiAodW5zaWduZWQpTUFYX1NMSUNFUyB8fCBmLT5zbGljZV9jb3VudCA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic2xpY2UgY291bnQgJWQgaXMgaW52YWxpZFxuIiwgZi0+c2xpY2VfY291bnQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgZi0+c2xpY2VfY291bnQ7IGorKykgeworICAgICAgICBGRlYxQ29udGV4dCAqZnMgPSBmLT5zbGljZV9jb250ZXh0W2pdOworICAgICAgICBmcy0+YWMgICAgICAgICAgICA9IGYtPmFjOworICAgICAgICBmcy0+cGFja2VkX2F0X2xzYiA9IGYtPnBhY2tlZF9hdF9sc2I7CisKKyAgICAgICAgZnMtPnNsaWNlX2RhbWFnZWQgPSAwOworCisgICAgICAgIGlmIChmLT52ZXJzaW9uID09IDIpIHsKKyAgICAgICAgICAgIGZzLT5zbGljZV94ICAgICAgPSAgZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCkgICAgICAqIGYtPndpZHRoIDsKKyAgICAgICAgICAgIGZzLT5zbGljZV95ICAgICAgPSAgZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCkgICAgICAqIGYtPmhlaWdodDsKKyAgICAgICAgICAgIGZzLT5zbGljZV93aWR0aCAgPSAoZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCkgKyAxKSAqIGYtPndpZHRoICArIGZzLT5zbGljZV94OworICAgICAgICAgICAgZnMtPnNsaWNlX2hlaWdodCA9IChnZXRfc3ltYm9sKGMsIHN0YXRlLCAwKSArIDEpICogZi0+aGVpZ2h0ICsgZnMtPnNsaWNlX3k7CisKKyAgICAgICAgICAgIGZzLT5zbGljZV94ICAgICAvPSBmLT5udW1faF9zbGljZXM7CisgICAgICAgICAgICBmcy0+c2xpY2VfeSAgICAgLz0gZi0+bnVtX3Zfc2xpY2VzOworICAgICAgICAgICAgZnMtPnNsaWNlX3dpZHRoICA9IGZzLT5zbGljZV93aWR0aCAgLyBmLT5udW1faF9zbGljZXMgLSBmcy0+c2xpY2VfeDsKKyAgICAgICAgICAgIGZzLT5zbGljZV9oZWlnaHQgPSBmcy0+c2xpY2VfaGVpZ2h0IC8gZi0+bnVtX3Zfc2xpY2VzIC0gZnMtPnNsaWNlX3k7CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKWZzLT5zbGljZV93aWR0aCAgPiBmLT53aWR0aCB8fAorICAgICAgICAgICAgICAgICh1bnNpZ25lZClmcy0+c2xpY2VfaGVpZ2h0ID4gZi0+aGVpZ2h0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaWYgKCAgICh1bnNpZ25lZClmcy0+c2xpY2VfeCArICh1aW50NjRfdClmcy0+c2xpY2Vfd2lkdGggID4gZi0+d2lkdGgKKyAgICAgICAgICAgICAgICB8fCAodW5zaWduZWQpZnMtPnNsaWNlX3kgKyAodWludDY0X3QpZnMtPnNsaWNlX2hlaWdodCA+IGYtPmhlaWdodCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmLT5wbGFuZV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBQbGFuZUNvbnRleHQgKmNvbnN0IHAgPSAmZnMtPnBsYW5lW2ldOworCisgICAgICAgICAgICBpZiAoZi0+dmVyc2lvbiA9PSAyKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApOworICAgICAgICAgICAgICAgIGlmIChpZHggPiAodW5zaWduZWQpZi0+cXVhbnRfdGFibGVfY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVhbnRfdGFibGVfaW5kZXggb3V0IG9mIHJhbmdlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHAtPnF1YW50X3RhYmxlX2luZGV4ID0gaWR4OworICAgICAgICAgICAgICAgIG1lbWNweShwLT5xdWFudF90YWJsZSwgZi0+cXVhbnRfdGFibGVzW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwLT5xdWFudF90YWJsZSkpOworICAgICAgICAgICAgICAgIGNvbnRleHRfY291bnQgPSBmLT5jb250ZXh0X2NvdW50W2lkeF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweShwLT5xdWFudF90YWJsZSwgZi0+cXVhbnRfdGFibGUsIHNpemVvZihwLT5xdWFudF90YWJsZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZi0+dmVyc2lvbiA8PSAyKSB7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChjb250ZXh0X2NvdW50ID49IDApOworICAgICAgICAgICAgICAgIGlmIChwLT5jb250ZXh0X2NvdW50IDwgY29udGV4dF9jb3VudCkgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcC0+c3RhdGUpOworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcC0+dmxjX3N0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcC0+Y29udGV4dF9jb3VudCA9IGNvbnRleHRfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRkZWMUNvbnRleHQgKmYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmdjFfY29tbW9uX2luaXQoYXZjdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YSAmJiAocmV0ID0gcmVhZF9leHRyYV9oZWFkZXIoZikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gZmZ2MV9pbml0X3NsaWNlX2NvbnRleHRzKGYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdmN0eC0+aW50ZXJuYWwtPmFsbG9jYXRlX3Byb2dyZXNzID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmICA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBGRlYxQ29udGV4dCAqZiAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBSYW5nZUNvZGVyICpjb25zdCBjID0gJmYtPnNsaWNlX2NvbnRleHRbMF0tPmM7CisgICAgaW50IGksIHJldDsKKyAgICB1aW50OF90IGtleXN0YXRlID0gMTI4OworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9wOworICAgIEFWRnJhbWUgKnA7CisKKyAgICBpZiAoZi0+bGFzdF9waWN0dXJlLmYpCisgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJmYtPmxhc3RfcGljdHVyZSk7CisgICAgRkZTV0FQKFRocmVhZEZyYW1lLCBmLT5waWN0dXJlLCBmLT5sYXN0X3BpY3R1cmUpOworCisgICAgZi0+Y3VyID0gcCA9IGYtPnBpY3R1cmUuZjsKKworICAgIGlmIChmLT52ZXJzaW9uIDwgMyAmJiBhdmN0eC0+ZmllbGRfb3JkZXIgPiBBVl9GSUVMRF9QUk9HUkVTU0lWRSkgeworICAgICAgICAvKiB3ZSBoYXZlIGludGVybGFjZWQgbWF0ZXJpYWwgZmxhZ2dlZCBpbiBjb250YWluZXIgKi8KKyAgICAgICAgcC0+aW50ZXJsYWNlZF9mcmFtZSA9IDE7CisgICAgICAgIGlmIChhdmN0eC0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVFQgfHwgYXZjdHgtPmZpZWxkX29yZGVyID09IEFWX0ZJRUxEX1RCKQorICAgICAgICAgICAgcC0+dG9wX2ZpZWxkX2ZpcnN0ID0gMTsKKyAgICB9CisKKyAgICBmLT5hdmN0eCA9IGF2Y3R4OworICAgIGZmX2luaXRfcmFuZ2VfZGVjb2RlcihjLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBmZl9idWlsZF9yYWNfc3RhdGVzKGMsIDAuMDUgKiAoMUxMIDw8IDMyKSwgMjU2IC0gOCk7CisKKyAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsgLy9GSVhNRSBJIHZzLiBQCisgICAgaWYgKGdldF9yYWMoYywgJmtleXN0YXRlKSkgeworICAgICAgICBwLT5rZXlfZnJhbWUgICAgPSAxOworICAgICAgICBmLT5rZXlfZnJhbWVfb2sgPSAwOworICAgICAgICBpZiAoKHJldCA9IHJlYWRfaGVhZGVyKGYpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBmLT5rZXlfZnJhbWVfb2sgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghZi0+a2V5X2ZyYW1lX29rKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGRlY29kZSBub24ta2V5ZnJhbWUgd2l0aG91dCB2YWxpZCBrZXlmcmFtZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBwLT5rZXlfZnJhbWUgPSAwOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZmLT5waWN0dXJlLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJ2ZXI6JWQga2V5ZnJhbWU6JWQgY29kZXI6JWQgZWM6JWQgc2xpY2VzOiVkIGJwczolZFxuIiwKKyAgICAgICAgICAgICAgIGYtPnZlcnNpb24sIHAtPmtleV9mcmFtZSwgZi0+YWMsIGYtPmVjLCBmLT5zbGljZV9jb3VudCwgZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUpOworCisgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChhdmN0eCk7CisKKyAgICBidWZfcCA9IGJ1ZiArIGJ1Zl9zaXplOworICAgIGZvciAoaSA9IGYtPnNsaWNlX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgRkZWMUNvbnRleHQgKmZzID0gZi0+c2xpY2VfY29udGV4dFtpXTsKKyAgICAgICAgaW50IHRyYWlsZXIgPSAzICsgNSohIWYtPmVjOworICAgICAgICBpbnQgdjsKKworICAgICAgICBpZiAoaSB8fCBmLT52ZXJzaW9uID4gMikgdiA9IEFWX1JCMjQoYnVmX3AtdHJhaWxlcikgKyB0cmFpbGVyOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgdiA9IGJ1Zl9wIC0gYy0+Ynl0ZXN0cmVhbV9zdGFydDsKKyAgICAgICAgaWYgKGJ1Zl9wIC0gYy0+Ynl0ZXN0cmVhbV9zdGFydCA8IHYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2xpY2UgcG9pbnRlciBjaGFpbiBicm9rZW5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnVmX3AgLT0gdjsKKworICAgICAgICBpZiAoZi0+ZWMpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNyYyA9IGF2X2NyYyhhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18zMl9JRUVFKSwgMCwgYnVmX3AsIHYpOworICAgICAgICAgICAgaWYgKGNyYykgeworICAgICAgICAgICAgICAgIGludDY0X3QgdHMgPSBhdnBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFID8gYXZwa3QtPnB0cyA6IGF2cGt0LT5kdHM7CisgICAgICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJDUkMgbWlzbWF0Y2ggJVghIiwgY3JjKTsKKyAgICAgICAgICAgICAgICBpZiAodHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgYXZjdHgtPnBrdF90aW1lYmFzZS5udW0pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJhdCAlZiBzZWNvbmRzXG4iLCB0cyphdl9xMmQoYXZjdHgtPnBrdF90aW1lYmFzZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJhdCAlIlBSSWQ2NCJcbiIsIHRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZzLT5zbGljZV9kYW1hZ2VkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpKSB7CisgICAgICAgICAgICBmZl9pbml0X3JhbmdlX2RlY29kZXIoJmZzLT5jLCBidWZfcCwgdik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZnMtPmMuYnl0ZXN0cmVhbV9lbmQgPSAodWludDhfdCAqKShidWZfcCArIHYpOworCisgICAgICAgIGZzLT5hdmN0eCA9IGF2Y3R4OworICAgICAgICBmcy0+Y3VyID0gcDsKKyAgICB9CisKKyAgICBhdmN0eC0+ZXhlY3V0ZShhdmN0eCwKKyAgICAgICAgICAgICAgICAgICBkZWNvZGVfc2xpY2UsCisgICAgICAgICAgICAgICAgICAgJmYtPnNsaWNlX2NvbnRleHRbMF0sCisgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICBmLT5zbGljZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCopKTsKKworICAgIGZvciAoaSA9IGYtPnNsaWNlX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgRkZWMUNvbnRleHQgKmZzID0gZi0+c2xpY2VfY29udGV4dFtpXTsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGlmIChmcy0+c2xpY2VfZGFtYWdlZCAmJiBmLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVswXSkgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWzRdOworICAgICAgICAgICAgdWludDhfdCAqZHN0WzRdOworICAgICAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKCZmLT5sYXN0X3BpY3R1cmUsIElOVF9NQVgsIDApOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCBzaCA9IChqID09IDEgfHwgaiA9PSAyKSA/IGYtPmNocm9tYV9oX3NoaWZ0IDogMDsKKyAgICAgICAgICAgICAgICBpbnQgc3YgPSAoaiA9PSAxIHx8IGogPT0gMikgPyBmLT5jaHJvbWFfdl9zaGlmdCA6IDA7CisgICAgICAgICAgICAgICAgZHN0W2pdID0gcC0+ZGF0YVtqXSArIHAtPmxpbmVzaXplW2pdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZnMtPnNsaWNlX3kgPj4gc3YpICsgKGZzLT5zbGljZV94ID4+IHNoKTsKKyAgICAgICAgICAgICAgICBzcmNbal0gPSBmLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVtqXSArIGYtPmxhc3RfcGljdHVyZS5mLT5saW5lc2l6ZVtqXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZzLT5zbGljZV95ID4+IHN2KSArIChmcy0+c2xpY2VfeCA+PiBzaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5KGRzdCwgcC0+bGluZXNpemUsIChjb25zdCB1aW50OF90ICoqKXNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+bGFzdF9waWN0dXJlLmYtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnMtPnNsaWNlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcy0+c2xpY2VfaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZmLT5waWN0dXJlLCBJTlRfTUFYLCAwKTsKKworICAgIGYtPnBpY3R1cmVfbnVtYmVyKys7CisKKyAgICBpZiAoZi0+bGFzdF9waWN0dXJlLmYpCisgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJmYtPmxhc3RfcGljdHVyZSk7CisgICAgZi0+Y3VyID0gTlVMTDsKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBmLT5waWN0dXJlLmYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGludCBpbml0X3RocmVhZF9jb3B5KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGRlYxQ29udGV4dCAqZiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIHJldDsKKworICAgIGYtPnBpY3R1cmUuZiAgICAgID0gTlVMTDsKKyAgICBmLT5sYXN0X3BpY3R1cmUuZiA9IE5VTEw7CisgICAgZi0+c2FtcGxlX2J1ZmZlciAgPSBOVUxMOworICAgIGYtPnNsaWNlX2NvdW50ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmLT5xdWFudF90YWJsZV9jb3VudDsgaSsrKSB7CisgICAgICAgIGF2X2Fzc2VydDAoZi0+dmVyc2lvbiA+IDEpOworICAgICAgICBmLT5pbml0aWFsX3N0YXRlc1tpXSA9IGF2X21lbWR1cChmLT5pbml0aWFsX3N0YXRlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Y29udGV4dF9jb3VudFtpXSAqIHNpemVvZigqZi0+aW5pdGlhbF9zdGF0ZXNbaV0pKTsKKyAgICB9CisKKyAgICBmLT5waWN0dXJlLmYgICAgICA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgZi0+bGFzdF9waWN0dXJlLmYgPSBhdl9mcmFtZV9hbGxvYygpOworCisgICAgaWYgKChyZXQgPSBmZnYxX2luaXRfc2xpY2VfY29udGV4dHMoZikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb3B5X2ZpZWxkcyhGRlYxQ29udGV4dCAqZnNkc3QsIEZGVjFDb250ZXh0ICpmc3NyYywgRkZWMUNvbnRleHQgKmZzcmMpCit7CisgICAgZnNkc3QtPnZlcnNpb24gICAgICAgICAgICAgPSBmc3JjLT52ZXJzaW9uOworICAgIGZzZHN0LT5taWNyb192ZXJzaW9uICAgICAgID0gZnNyYy0+bWljcm9fdmVyc2lvbjsKKyAgICBmc2RzdC0+Y2hyb21hX3BsYW5lcyAgICAgICA9IGZzcmMtPmNocm9tYV9wbGFuZXM7CisgICAgZnNkc3QtPmNocm9tYV9oX3NoaWZ0ICAgICAgPSBmc3JjLT5jaHJvbWFfaF9zaGlmdDsKKyAgICBmc2RzdC0+Y2hyb21hX3Zfc2hpZnQgICAgICA9IGZzcmMtPmNocm9tYV92X3NoaWZ0OworICAgIGZzZHN0LT50cmFuc3BhcmVuY3kgICAgICAgID0gZnNyYy0+dHJhbnNwYXJlbmN5OworICAgIGZzZHN0LT5wbGFuZV9jb3VudCAgICAgICAgID0gZnNyYy0+cGxhbmVfY291bnQ7CisgICAgZnNkc3QtPmFjICAgICAgICAgICAgICAgICAgPSBmc3JjLT5hYzsKKyAgICBmc2RzdC0+Y29sb3JzcGFjZSAgICAgICAgICA9IGZzcmMtPmNvbG9yc3BhY2U7CisKKyAgICBmc2RzdC0+ZWMgICAgICAgICAgICAgICAgICA9IGZzcmMtPmVjOworICAgIGZzZHN0LT5pbnRyYSAgICAgICAgICAgICAgID0gZnNyYy0+aW50cmE7CisgICAgZnNkc3QtPnNsaWNlX2RhbWFnZWQgICAgICAgPSBmc3NyYy0+c2xpY2VfZGFtYWdlZDsKKyAgICBmc2RzdC0+a2V5X2ZyYW1lX29rICAgICAgICA9IGZzcmMtPmtleV9mcmFtZV9vazsKKworICAgIGZzZHN0LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gZnNyYy0+Yml0c19wZXJfcmF3X3NhbXBsZTsKKyAgICBmc2RzdC0+cGFja2VkX2F0X2xzYiAgICAgICA9IGZzcmMtPnBhY2tlZF9hdF9sc2I7CisgICAgZnNkc3QtPnNsaWNlX2NvdW50ICAgICAgICAgPSBmc3JjLT5zbGljZV9jb3VudDsKKyAgICBpZiAoZnNyYy0+dmVyc2lvbjwzKXsKKyAgICAgICAgZnNkc3QtPnNsaWNlX3ggICAgICAgICAgICAgPSBmc3NyYy0+c2xpY2VfeDsKKyAgICAgICAgZnNkc3QtPnNsaWNlX3kgICAgICAgICAgICAgPSBmc3NyYy0+c2xpY2VfeTsKKyAgICAgICAgZnNkc3QtPnNsaWNlX3dpZHRoICAgICAgICAgPSBmc3NyYy0+c2xpY2Vfd2lkdGg7CisgICAgICAgIGZzZHN0LT5zbGljZV9oZWlnaHQgICAgICAgID0gZnNzcmMtPnNsaWNlX2hlaWdodDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3RocmVhZF9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICpkc3QsIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpzcmMpCit7CisgICAgRkZWMUNvbnRleHQgKmZzcmMgPSBzcmMtPnByaXZfZGF0YTsKKyAgICBGRlYxQ29udGV4dCAqZmRzdCA9IGRzdC0+cHJpdl9kYXRhOworICAgIGludCBpLCByZXQ7CisKKyAgICBpZiAoZHN0ID09IHNyYykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB7CisgICAgICAgIFRocmVhZEZyYW1lIHBpY3R1cmUgPSBmZHN0LT5waWN0dXJlLCBsYXN0X3BpY3R1cmUgPSBmZHN0LT5sYXN0X3BpY3R1cmU7CisgICAgICAgIHVpbnQ4X3QgKCppbml0aWFsX3N0YXRlc1tNQVhfUVVBTlRfVEFCTEVTXSlbMzJdOworICAgICAgICBzdHJ1Y3QgRkZWMUNvbnRleHQgKnNsaWNlX2NvbnRleHRbTUFYX1NMSUNFU107CisgICAgICAgIG1lbWNweShpbml0aWFsX3N0YXRlcywgZmRzdC0+aW5pdGlhbF9zdGF0ZXMsIHNpemVvZihmZHN0LT5pbml0aWFsX3N0YXRlcykpOworICAgICAgICBtZW1jcHkoc2xpY2VfY29udGV4dCwgIGZkc3QtPnNsaWNlX2NvbnRleHQgLCBzaXplb2YoZmRzdC0+c2xpY2VfY29udGV4dCkpOworCisgICAgICAgIG1lbWNweShmZHN0LCBmc3JjLCBzaXplb2YoKmZkc3QpKTsKKyAgICAgICAgbWVtY3B5KGZkc3QtPmluaXRpYWxfc3RhdGVzLCBpbml0aWFsX3N0YXRlcywgc2l6ZW9mKGZkc3QtPmluaXRpYWxfc3RhdGVzKSk7CisgICAgICAgIG1lbWNweShmZHN0LT5zbGljZV9jb250ZXh0LCAgc2xpY2VfY29udGV4dCAsIHNpemVvZihmZHN0LT5zbGljZV9jb250ZXh0KSk7CisgICAgICAgIGZkc3QtPnBpY3R1cmUgICAgICA9IHBpY3R1cmU7CisgICAgICAgIGZkc3QtPmxhc3RfcGljdHVyZSA9IGxhc3RfcGljdHVyZTsKKyAgICAgICAgZm9yIChpID0gMDsgaTxmZHN0LT5udW1faF9zbGljZXMgKiBmZHN0LT5udW1fdl9zbGljZXM7IGkrKykgeworICAgICAgICAgICAgRkZWMUNvbnRleHQgKmZzc3JjID0gZnNyYy0+c2xpY2VfY29udGV4dFtpXTsKKyAgICAgICAgICAgIEZGVjFDb250ZXh0ICpmc2RzdCA9IGZkc3QtPnNsaWNlX2NvbnRleHRbaV07CisgICAgICAgICAgICBjb3B5X2ZpZWxkcyhmc2RzdCwgZnNzcmMsIGZzcmMpOworICAgICAgICB9CisgICAgICAgIGF2X2Fzc2VydDAoIWZkc3QtPnBsYW5lWzBdLnN0YXRlKTsKKyAgICAgICAgYXZfYXNzZXJ0MCghZmRzdC0+c2FtcGxlX2J1ZmZlcik7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MShmZHN0LT5zbGljZV9jb3VudCA9PSBmc3JjLT5zbGljZV9jb3VudCk7CisKKworICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihkc3QsICZmZHN0LT5waWN0dXJlKTsKKyAgICBpZiAoZnNyYy0+cGljdHVyZS5mLT5kYXRhWzBdKSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX3JlZl9mcmFtZSgmZmRzdC0+cGljdHVyZSwgJmZzcmMtPnBpY3R1cmUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGZkc3QtPmZzcmMgPSBmc3JjOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfZmZ2MV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJmZnYxIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRkZtcGVnIHZpZGVvIGNvZGVjICMxIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0ZGVjEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGVjFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZnYxX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuaW5pdF90aHJlYWRfY29weSA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKGluaXRfdGhyZWFkX2NvcHkpLAorICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh1cGRhdGVfdGhyZWFkX2NvbnRleHQpLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgLyp8IENPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQqLyB8CisgICAgICAgICAgICAgICAgICAgICAgQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMgfCBDT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mZnYxZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mZnYxZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyYTEzZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZmdjFlbmMuYwpAQCAtMCwwICsxLDEzNjggQEAKKy8qCisgKiBGRlYxIGVuY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBGRiBWaWRlbyBDb2RlYyAxIChhIGxvc3NsZXNzIGNvZGVjKSBlbmNvZGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAicmFuZ2Vjb2Rlci5oIgorI2luY2x1ZGUgImdvbG9tYi5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJmZnYxLmgiCisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgcXVhbnQ1XzEwYml0WzI1Nl0gPSB7CisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsCisgICAgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsCisgICAgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsCisgICAgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsCisgICAgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsCisgICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsCisgICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsCisgICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsCisgICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsCisgICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTEsCisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTAsIC0wLCAtMCwgLTAsIC0wLCAtMCwgLTAsIC0wLCAtMCwgLTAsCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IHF1YW50NVsyNTZdID0geworICAgICAwLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLAorICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLAorICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLAorICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLAorICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLAorICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLAorICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLAorICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgLTEsIC0xLAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBxdWFudDlfMTBiaXRbMjU2XSA9IHsKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwKKyAgICAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAzLCAgMywgIDMsICAzLCAgMywKKyAgICAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywKKyAgICAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwKKyAgICAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwKKyAgICAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwKKyAgICAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwKKyAgICAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywKKyAgICAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywKKyAgICAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwKKyAgICAtMiwgLTIsIC0yLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMCwgLTAsIC0wLCAtMCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgcXVhbnQxMVsyNTZdID0geworICAgICAwLCAgMSwgIDIsICAyLCAgMiwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICA0LCAgNCwgIDQsICA0LAorICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAorICAgICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAorICAgICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAorICAgICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAorICAgICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAorICAgICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAorICAgICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAorICAgIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LAorICAgIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LAorICAgIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LAorICAgIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LAorICAgIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LAorICAgIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTQsIC00LAorICAgIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LAorICAgIC00LCAtNCwgLTQsIC00LCAtNCwgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0yLCAtMiwgLTIsIC0xLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdmVyMl9zdGF0ZVsyNTZdID0geworICAgICAgMCwgIDEwLCAgMTAsICAxMCwgIDEwLCAgMTYsICAxNiwgIDE2LCAyOCwgICAxNiwgIDE2LCAgMjksICA0MiwgIDQ5LCAgMjAsICA0OSwKKyAgICAgNTksICAyNSwgIDI2LCAgMjYsICAyNywgIDMxLCAgMzMsICAzMywgMzMsICAgMzQsICAzNCwgIDM3LCAgNjcsICAzOCwgIDM5LCAgMzksCisgICAgIDQwLCAgNDAsICA0MSwgIDc5LCAgNDMsICA0NCwgIDQ1LCAgNDUsIDQ4LCAgIDQ4LCAgNjQsICA1MCwgIDUxLCAgNTIsICA4OCwgIDUyLAorICAgICA1MywgIDc0LCAgNTUsICA1NywgIDU4LCAgNTgsICA3NCwgIDYwLCAxMDEsICA2MSwgIDYyLCAgODQsICA2NiwgIDY2LCAgNjgsICA2OSwKKyAgICAgODcsICA4MiwgIDcxLCAgOTcsICA3MywgIDczLCAgODIsICA3NSwgMTExLCAgNzcsICA5NCwgIDc4LCAgODcsICA4MSwgIDgzLCAgOTcsCisgICAgIDg1LCAgODMsICA5NCwgIDg2LCAgOTksICA4OSwgIDkwLCAgOTksIDExMSwgIDkyLCAgOTMsICAxMzQsIDk1LCAgOTgsICAxMDUsIDk4LAorICAgIDEwNSwgMTEwLCAxMDIsIDEwOCwgMTAyLCAxMTgsIDEwMywgMTA2LCAxMDYsIDExMywgMTA5LCAxMTIsIDExNCwgMTEyLCAxMTYsIDEyNSwKKyAgICAxMTUsIDExNiwgMTE3LCAxMTcsIDEyNiwgMTE5LCAxMjUsIDEyMSwgMTIxLCAxMjMsIDE0NSwgMTI0LCAxMjYsIDEzMSwgMTI3LCAxMjksCisgICAgMTY1LCAxMzAsIDEzMiwgMTM4LCAxMzMsIDEzNSwgMTQ1LCAxMzYsIDEzNywgMTM5LCAxNDYsIDE0MSwgMTQzLCAxNDIsIDE0NCwgMTQ4LAorICAgIDE0NywgMTU1LCAxNTEsIDE0OSwgMTUxLCAxNTAsIDE1MiwgMTU3LCAxNTMsIDE1NCwgMTU2LCAxNjgsIDE1OCwgMTYyLCAxNjEsIDE2MCwKKyAgICAxNzIsIDE2MywgMTY5LCAxNjQsIDE2NiwgMTg0LCAxNjcsIDE3MCwgMTc3LCAxNzQsIDE3MSwgMTczLCAxODIsIDE3NiwgMTgwLCAxNzgsCisgICAgMTc1LCAxODksIDE3OSwgMTgxLCAxODYsIDE4MywgMTkyLCAxODUsIDIwMCwgMTg3LCAxOTEsIDE4OCwgMTkwLCAxOTcsIDE5MywgMTk2LAorICAgIDE5NywgMTk0LCAxOTUsIDE5NiwgMTk4LCAyMDIsIDE5OSwgMjAxLCAyMTAsIDIwMywgMjA3LCAyMDQsIDIwNSwgMjA2LCAyMDgsIDIxNCwKKyAgICAyMDksIDIxMSwgMjIxLCAyMTIsIDIxMywgMjE1LCAyMjQsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjIsIDIyOCwgMjIzLCAyMjUsCisgICAgMjI2LCAyMjQsIDIyNywgMjI5LCAyNDAsIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM4LCAyMzksIDIzNywgMjQyLAorICAgIDI0MSwgMjQzLCAyNDIsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MiwgMjUzLCAyNTQsIDI1NSwKK307CisKK3N0YXRpYyB2b2lkIGZpbmRfYmVzdF9zdGF0ZSh1aW50OF90IGJlc3Rfc3RhdGVbMjU2XVsyNTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgb25lX3N0YXRlWzI1Nl0pCit7CisgICAgaW50IGksIGosIGssIG07CisgICAgZG91YmxlIGwydGFiWzI1Nl07CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgMjU2OyBpKyspCisgICAgICAgIGwydGFiW2ldID0gbG9nMihpIC8gMjU2LjApOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBiZXN0X2xlblsyNTZdOworICAgICAgICBkb3VibGUgcCA9IGkgLyAyNTYuMDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspCisgICAgICAgICAgICBiZXN0X2xlbltqXSA9IDEgPDwgMzA7CisKKyAgICAgICAgZm9yIChqID0gRkZNQVgoaSAtIDEwLCAxKTsgaiA8IEZGTUlOKGkgKyAxMSwgMjU2KTsgaisrKSB7CisgICAgICAgICAgICBkb3VibGUgb2NjWzI1Nl0gPSB7IDAgfTsKKyAgICAgICAgICAgIGRvdWJsZSBsZW4gICAgICA9IDA7CisgICAgICAgICAgICBvY2Nbal0gPSAxLjA7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjU2OyBrKyspIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgbmV3b2NjWzI1Nl0gPSB7IDAgfTsKKyAgICAgICAgICAgICAgICBmb3IgKG0gPSAxOyBtIDwgMjU2OyBtKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChvY2NbbV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPW9jY1ttXSooICAgICBwICpsMnRhYlsgICAgbV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMS1wKSpsMnRhYlsyNTYtbV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IGJlc3RfbGVuW2tdKSB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfbGVuW2tdICAgICAgPSBsZW47CisgICAgICAgICAgICAgICAgICAgIGJlc3Rfc3RhdGVbaV1ba10gPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKG0gPSAxOyBtIDwgMjU2OyBtKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChvY2NbbV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld29jY1sgICAgICBvbmVfc3RhdGVbICAgICAgbV1dICs9IG9jY1ttXSAqIHA7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdvY2NbMjU2IC0gb25lX3N0YXRlWzI1NiAtIG1dXSArPSBvY2NbbV0gKiAoMSAtIHApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KG9jYywgbmV3b2NjLCBzaXplb2Yob2NjKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2ZsYXR0ZW4gdm9pZCBwdXRfc3ltYm9sX2lubGluZShSYW5nZUNvZGVyICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnN0YXRlLCBpbnQgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHJjX3N0YXRbMjU2XVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCByY19zdGF0MlszMl1bMl0pCit7CisgICAgaW50IGk7CisKKyNkZWZpbmUgcHV0X3JhYyhDLCBTLCBCKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHJjX3N0YXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJjX3N0YXRbKihTKV1bQl0rKzsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJjX3N0YXQyWyhTKSAtIHN0YXRlXVtCXSsrOyAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHV0X3JhYyhDLCBTLCBCKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgaWYgKHYpIHsKKyAgICAgICAgY29uc3QgaW50IGEgPSBGRkFCUyh2KTsKKyAgICAgICAgY29uc3QgaW50IGUgPSBhdl9sb2cyKGEpOworICAgICAgICBwdXRfcmFjKGMsIHN0YXRlICsgMCwgMCk7CisgICAgICAgIGlmIChlIDw9IDkpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlOyBpKyspCisgICAgICAgICAgICAgICAgcHV0X3JhYyhjLCBzdGF0ZSArIDEgKyBpLCAxKTsgIC8vIDEuLjEwCisgICAgICAgICAgICBwdXRfcmFjKGMsIHN0YXRlICsgMSArIGksIDApOworCisgICAgICAgICAgICBmb3IgKGkgPSBlIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgcHV0X3JhYyhjLCBzdGF0ZSArIDIyICsgaSwgKGEgPj4gaSkgJiAxKTsgIC8vIDIyLi4zMQorCisgICAgICAgICAgICBpZiAoaXNfc2lnbmVkKQorICAgICAgICAgICAgICAgIHB1dF9yYWMoYywgc3RhdGUgKyAxMSArIGUsIHYgPCAwKTsgIC8vIDExLi4yMQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGU7IGkrKykKKyAgICAgICAgICAgICAgICBwdXRfcmFjKGMsIHN0YXRlICsgMSArIEZGTUlOKGksIDkpLCAxKTsgIC8vIDEuLjEwCisgICAgICAgICAgICBwdXRfcmFjKGMsIHN0YXRlICsgMSArIDksIDApOworCisgICAgICAgICAgICBmb3IgKGkgPSBlIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgcHV0X3JhYyhjLCBzdGF0ZSArIDIyICsgRkZNSU4oaSwgOSksIChhID4+IGkpICYgMSk7ICAvLyAyMi4uMzEKKworICAgICAgICAgICAgaWYgKGlzX3NpZ25lZCkKKyAgICAgICAgICAgICAgICBwdXRfcmFjKGMsIHN0YXRlICsgMTEgKyAxMCwgdiA8IDApOyAgLy8gMTEuLjIxCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwdXRfcmFjKGMsIHN0YXRlICsgMCwgMSk7CisgICAgfQorI3VuZGVmIHB1dF9yYWMKK30KKworc3RhdGljIGF2X25vaW5saW5lIHZvaWQgcHV0X3N5bWJvbChSYW5nZUNvZGVyICpjLCB1aW50OF90ICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYsIGludCBpc19zaWduZWQpCit7CisgICAgcHV0X3N5bWJvbF9pbmxpbmUoYywgc3RhdGUsIHYsIGlzX3NpZ25lZCwgTlVMTCwgTlVMTCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHB1dF92bGNfc3ltYm9sKFB1dEJpdENvbnRleHQgKnBiLCBWbGNTdGF0ZSAqY29uc3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYsIGludCBiaXRzKQoreworICAgIGludCBpLCBrLCBjb2RlOworICAgIHYgPSBmb2xkKHYgLSBzdGF0ZS0+YmlhcywgYml0cyk7CisKKyAgICBpID0gc3RhdGUtPmNvdW50OworICAgIGsgPSAwOworICAgIHdoaWxlIChpIDwgc3RhdGUtPmVycm9yX3N1bSkgeyAvLyBGSVhNRTogb3B0aW1pemUKKyAgICAgICAgaysrOworICAgICAgICBpICs9IGk7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MihrIDw9IDEzKTsKKworI2lmIDAgLy8gSlBFRyBMUworICAgIGlmIChrID09IDAgJiYgMiAqIHN0YXRlLT5kcmlmdCA8PSAtc3RhdGUtPmNvdW50KQorICAgICAgICBjb2RlID0gdiBeICgtMSk7CisgICAgZWxzZQorICAgICAgICBjb2RlID0gdjsKKyNlbHNlCisgICAgY29kZSA9IHYgXiAoKDIgKiBzdGF0ZS0+ZHJpZnQgKyBzdGF0ZS0+Y291bnQpID4+IDMxKTsKKyNlbmRpZgorCisgICAgYXZfZGxvZyhOVUxMLCAidjolZC8lZCBiaWFzOiVkIGVycm9yOiVkIGRyaWZ0OiVkIGNvdW50OiVkIGs6JWRcbiIsIHYsIGNvZGUsCisgICAgICAgICAgICBzdGF0ZS0+Ymlhcywgc3RhdGUtPmVycm9yX3N1bSwgc3RhdGUtPmRyaWZ0LCBzdGF0ZS0+Y291bnQsIGspOworICAgIHNldF9zcl9nb2xvbWIocGIsIGNvZGUsIGssIDEyLCBiaXRzKTsKKworICAgIHVwZGF0ZV92bGNfc3RhdGUoc3RhdGUsIHYpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZW5jb2RlX2xpbmUoRkZWMUNvbnRleHQgKnMsIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNhbXBsZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhbmVfaW5kZXgsIGludCBiaXRzKQoreworICAgIFBsYW5lQ29udGV4dCAqY29uc3QgcCA9ICZzLT5wbGFuZVtwbGFuZV9pbmRleF07CisgICAgUmFuZ2VDb2RlciAqY29uc3QgYyAgID0gJnMtPmM7CisgICAgaW50IHg7CisgICAgaW50IHJ1bl9pbmRleCA9IHMtPnJ1bl9pbmRleDsKKyAgICBpbnQgcnVuX2NvdW50ID0gMDsKKyAgICBpbnQgcnVuX21vZGUgID0gMDsKKworICAgIGlmIChzLT5hYykgeworICAgICAgICBpZiAoYy0+Ynl0ZXN0cmVhbV9lbmQgLSBjLT5ieXRlc3RyZWFtIDwgdyAqIDM1KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVuY29kZWQgZnJhbWUgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPnBiLmJ1Zl9lbmQgLSBzLT5wYi5idWYgLSAocHV0X2JpdHNfY291bnQoJnMtPnBiKSA+PiAzKSA8IHcgKiA0KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVuY29kZWQgZnJhbWUgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPnNsaWNlX2NvZGluZ19tb2RlID09IDEpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpbnQgdiA9IHNhbXBsZVswXVt4XTsKKyAgICAgICAgICAgIGZvciAoaSA9IGJpdHMtMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0ZSA9IDEyODsKKyAgICAgICAgICAgICAgICBwdXRfcmFjKGMsICZzdGF0ZSwgKHY+PmkpICYgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICBpbnQgZGlmZiwgY29udGV4dDsKKworICAgICAgICBjb250ZXh0ID0gZ2V0X2NvbnRleHQocCwgc2FtcGxlWzBdICsgeCwgc2FtcGxlWzFdICsgeCwgc2FtcGxlWzJdICsgeCk7CisgICAgICAgIGRpZmYgICAgPSBzYW1wbGVbMF1beF0gLSBwcmVkaWN0KHNhbXBsZVswXSArIHgsIHNhbXBsZVsxXSArIHgpOworCisgICAgICAgIGlmIChjb250ZXh0IDwgMCkgeworICAgICAgICAgICAgY29udGV4dCA9IC1jb250ZXh0OworICAgICAgICAgICAgZGlmZiAgICA9IC1kaWZmOworICAgICAgICB9CisKKyAgICAgICAgZGlmZiA9IGZvbGQoZGlmZiwgYml0cyk7CisKKyAgICAgICAgaWYgKHMtPmFjKSB7CisgICAgICAgICAgICBpZiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1BBU1MxKSB7CisgICAgICAgICAgICAgICAgcHV0X3N5bWJvbF9pbmxpbmUoYywgcC0+c3RhdGVbY29udGV4dF0sIGRpZmYsIDEsIHMtPnJjX3N0YXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmNfc3RhdDJbcC0+cXVhbnRfdGFibGVfaW5kZXhdW2NvbnRleHRdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHV0X3N5bWJvbF9pbmxpbmUoYywgcC0+c3RhdGVbY29udGV4dF0sIGRpZmYsIDEsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gMCkKKyAgICAgICAgICAgICAgICBydW5fbW9kZSA9IDE7CisKKyAgICAgICAgICAgIGlmIChydW5fbW9kZSkgeworICAgICAgICAgICAgICAgIGlmIChkaWZmKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW5fY291bnQgPj0gMSA8PCBmZl9sb2cyX3J1bltydW5faW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5fY291bnQgLT0gMSA8PCBmZl9sb2cyX3J1bltydW5faW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2luZGV4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxICsgZmZfbG9nMl9ydW5bcnVuX2luZGV4XSwgcnVuX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bl9pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9pbmRleC0tOworICAgICAgICAgICAgICAgICAgICBydW5fY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBydW5fbW9kZSAgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBkaWZmLS07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcnVuX2NvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiY291bnQ6JWQgaW5kZXg6JWQsIG1vZGU6JWQsIHg6JWQgcG9zOiVkXG4iLAorICAgICAgICAgICAgICAgICAgICBydW5fY291bnQsIHJ1bl9pbmRleCwgcnVuX21vZGUsIHgsCisgICAgICAgICAgICAgICAgICAgIChpbnQpcHV0X2JpdHNfY291bnQoJnMtPnBiKSk7CisKKyAgICAgICAgICAgIGlmIChydW5fbW9kZSA9PSAwKQorICAgICAgICAgICAgICAgIHB1dF92bGNfc3ltYm9sKCZzLT5wYiwgJnAtPnZsY19zdGF0ZVtjb250ZXh0XSwgZGlmZiwgYml0cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJ1bl9tb2RlKSB7CisgICAgICAgIHdoaWxlIChydW5fY291bnQgPj0gMSA8PCBmZl9sb2cyX3J1bltydW5faW5kZXhdKSB7CisgICAgICAgICAgICBydW5fY291bnQgLT0gMSA8PCBmZl9sb2cyX3J1bltydW5faW5kZXhdOworICAgICAgICAgICAgcnVuX2luZGV4Kys7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJ1bl9jb3VudCkKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7CisgICAgfQorICAgIHMtPnJ1bl9pbmRleCA9IHJ1bl9pbmRleDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9wbGFuZShGRlYxQ29udGV4dCAqcywgdWludDhfdCAqc3JjLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHBsYW5lX2luZGV4KQoreworICAgIGludCB4LCB5LCBpLCByZXQ7CisgICAgY29uc3QgaW50IHJpbmdfc2l6ZSA9IHMtPmF2Y3R4LT5jb250ZXh0X21vZGVsID8gMyA6IDI7CisgICAgaW50MTZfdCAqc2FtcGxlWzNdOworICAgIHMtPnJ1bl9pbmRleCA9IDA7CisKKyAgICBtZW1zZXQocy0+c2FtcGxlX2J1ZmZlciwgMCwgcmluZ19zaXplICogKHcgKyA2KSAqIHNpemVvZigqcy0+c2FtcGxlX2J1ZmZlcikpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmluZ19zaXplOyBpKyspCisgICAgICAgICAgICBzYW1wbGVbaV0gPSBzLT5zYW1wbGVfYnVmZmVyICsgKHcgKyA2KSAqICgoaCArIGkgLSB5KSAlIHJpbmdfc2l6ZSkgKyAzOworCisgICAgICAgIHNhbXBsZVswXVstMV09IHNhbXBsZVsxXVswICBdOworICAgICAgICBzYW1wbGVbMV1bIHddPSBzYW1wbGVbMV1bdy0xXTsKKy8vIHsgU1RBUlRfVElNRVIKKyAgICAgICAgaWYgKHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPD0gOCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKyAgICAgICAgICAgICAgICBzYW1wbGVbMF1beF0gPSBzcmNbeCArIHN0cmlkZSAqIHldOworICAgICAgICAgICAgaWYoKHJldCA9IGVuY29kZV9saW5lKHMsIHcsIHNhbXBsZSwgcGxhbmVfaW5kZXgsIDgpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzLT5wYWNrZWRfYXRfbHNiKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBzYW1wbGVbMF1beF0gPSAoKHVpbnQxNl90Kikoc3JjICsgc3RyaWRlKnkpKVt4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlWzBdW3hdID0gKCh1aW50MTZfdCopKHNyYyArIHN0cmlkZSp5KSlbeF0gPj4gKDE2IC0gcy0+Yml0c19wZXJfcmF3X3NhbXBsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoKHJldCA9IGVuY29kZV9saW5lKHMsIHcsIHNhbXBsZSwgcGxhbmVfaW5kZXgsIHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorLy8gU1RPUF9USU1FUigiZW5jb2RlIGxpbmUiKSB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9yZ2JfZnJhbWUoRkZWMUNvbnRleHQgKnMsIHVpbnQ4X3QgKnNyY1szXSwgaW50IHcsIGludCBoLCBjb25zdCBpbnQgc3RyaWRlWzNdKQoreworICAgIGludCB4LCB5LCBwLCBpOworICAgIGNvbnN0IGludCByaW5nX3NpemUgPSBzLT5hdmN0eC0+Y29udGV4dF9tb2RlbCA/IDMgOiAyOworICAgIGludDE2X3QgKnNhbXBsZVs0XVszXTsKKyAgICBpbnQgbGJkICAgID0gcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA8PSA4OworICAgIGludCBiaXRzICAgPSBzLT5iaXRzX3Blcl9yYXdfc2FtcGxlID4gMCA/IHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgOiA4OworICAgIGludCBvZmZzZXQgPSAxIDw8IGJpdHM7CisKKyAgICBzLT5ydW5faW5kZXggPSAwOworCisgICAgbWVtc2V0KHMtPnNhbXBsZV9idWZmZXIsIDAsIHJpbmdfc2l6ZSAqIE1BWF9QTEFORVMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDYpICogc2l6ZW9mKCpzLT5zYW1wbGVfYnVmZmVyKSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByaW5nX3NpemU7IGkrKykKKyAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBNQVhfUExBTkVTOyBwKyspCisgICAgICAgICAgICAgICAgc2FtcGxlW3BdW2ldPSBzLT5zYW1wbGVfYnVmZmVyICsgcCpyaW5nX3NpemUqKHcrNikgKyAoKGgraS15KSVyaW5nX3NpemUpKih3KzYpICsgMzsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBpbnQgYiwgZywgciwgYXZfdW5pbml0KGEpOworICAgICAgICAgICAgaWYgKGxiZCkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHYgPSAqKCh1aW50MzJfdCopKHNyY1swXSArIHgqNCArIHN0cmlkZVswXSp5KSk7CisgICAgICAgICAgICAgICAgYiA9ICB2ICAgICAgICAmIDB4RkY7CisgICAgICAgICAgICAgICAgZyA9ICh2ID4+ICA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgciA9ICh2ID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgYSA9ICB2ID4+IDI0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiID0gKigodWludDE2X3QqKShzcmNbMF0gKyB4KjIgKyBzdHJpZGVbMF0qeSkpOworICAgICAgICAgICAgICAgIGcgPSAqKCh1aW50MTZfdCopKHNyY1sxXSArIHgqMiArIHN0cmlkZVsxXSp5KSk7CisgICAgICAgICAgICAgICAgciA9ICooKHVpbnQxNl90Kikoc3JjWzJdICsgeCoyICsgc3RyaWRlWzJdKnkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPnNsaWNlX2NvZGluZ19tb2RlICE9IDEpIHsKKyAgICAgICAgICAgICAgICBiIC09IGc7CisgICAgICAgICAgICAgICAgciAtPSBnOworICAgICAgICAgICAgICAgIGcgKz0gKGIgKiBzLT5zbGljZV9yY3RfYnlfY29lZiArIHIgKiBzLT5zbGljZV9yY3RfcnlfY29lZikgPj4gMjsKKyAgICAgICAgICAgICAgICBiICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICByICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2FtcGxlWzBdWzBdW3hdID0gZzsKKyAgICAgICAgICAgIHNhbXBsZVsxXVswXVt4XSA9IGI7CisgICAgICAgICAgICBzYW1wbGVbMl1bMF1beF0gPSByOworICAgICAgICAgICAgc2FtcGxlWzNdWzBdW3hdID0gYTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHAgPSAwOyBwIDwgMyArIHMtPnRyYW5zcGFyZW5jeTsgcCsrKSB7CisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgc2FtcGxlW3BdWzBdWy0xXSA9IHNhbXBsZVtwXVsxXVswICBdOworICAgICAgICAgICAgc2FtcGxlW3BdWzFdWyB3XSA9IHNhbXBsZVtwXVsxXVt3LTFdOworICAgICAgICAgICAgaWYgKGxiZCAmJiBzLT5zbGljZV9jb2RpbmdfbW9kZSA9PSAwKQorICAgICAgICAgICAgICAgIHJldCA9IGVuY29kZV9saW5lKHMsIHcsIHNhbXBsZVtwXSwgKHAgKyAxKSAvIDIsIDkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IGVuY29kZV9saW5lKHMsIHcsIHNhbXBsZVtwXSwgKHAgKyAxKSAvIDIsIGJpdHMgKyAocy0+c2xpY2VfY29kaW5nX21vZGUgIT0gMSkpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfcXVhbnRfdGFibGUoUmFuZ2VDb2RlciAqYywgaW50MTZfdCAqcXVhbnRfdGFibGUpCit7CisgICAgaW50IGxhc3QgPSAwOworICAgIGludCBpOworICAgIHVpbnQ4X3Qgc3RhdGVbQ09OVEVYVF9TSVpFXTsKKyAgICBtZW1zZXQoc3RhdGUsIDEyOCwgc2l6ZW9mKHN0YXRlKSk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTI4OyBpKyspCisgICAgICAgIGlmIChxdWFudF90YWJsZVtpXSAhPSBxdWFudF90YWJsZVtpIC0gMV0pIHsKKyAgICAgICAgICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGkgLSBsYXN0IC0gMSwgMCk7CisgICAgICAgICAgICBsYXN0ID0gaTsKKyAgICAgICAgfQorICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGkgLSBsYXN0IC0gMSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3F1YW50X3RhYmxlcyhSYW5nZUNvZGVyICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgcXVhbnRfdGFibGVbTUFYX0NPTlRFWFRfSU5QVVRTXVsyNTZdKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgICAgIHdyaXRlX3F1YW50X3RhYmxlKGMsIHF1YW50X3RhYmxlW2ldKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfaGVhZGVyKEZGVjFDb250ZXh0ICpmKQoreworICAgIHVpbnQ4X3Qgc3RhdGVbQ09OVEVYVF9TSVpFXTsKKyAgICBpbnQgaSwgajsKKyAgICBSYW5nZUNvZGVyICpjb25zdCBjID0gJmYtPnNsaWNlX2NvbnRleHRbMF0tPmM7CisKKyAgICBtZW1zZXQoc3RhdGUsIDEyOCwgc2l6ZW9mKHN0YXRlKSk7CisKKyAgICBpZiAoZi0+dmVyc2lvbiA8IDIpIHsKKyAgICAgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZi0+dmVyc2lvbiwgMCk7CisgICAgICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGYtPmFjLCAwKTsKKyAgICAgICAgaWYgKGYtPmFjID4gMSkgeworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDI1NjsgaSsrKQorICAgICAgICAgICAgICAgIHB1dF9zeW1ib2woYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5zdGF0ZV90cmFuc2l0aW9uW2ldIC0gYy0+b25lX3N0YXRlW2ldLCAxKTsKKyAgICAgICAgfQorICAgICAgICBwdXRfc3ltYm9sKGMsIHN0YXRlLCBmLT5jb2xvcnNwYWNlLCAwKTsgLy9ZVVYgY3MgdHlwZQorICAgICAgICBpZiAoZi0+dmVyc2lvbiA+IDApCisgICAgICAgICAgICBwdXRfc3ltYm9sKGMsIHN0YXRlLCBmLT5iaXRzX3Blcl9yYXdfc2FtcGxlLCAwKTsKKyAgICAgICAgcHV0X3JhYyhjLCBzdGF0ZSwgZi0+Y2hyb21hX3BsYW5lcyk7CisgICAgICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGYtPmNocm9tYV9oX3NoaWZ0LCAwKTsKKyAgICAgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZi0+Y2hyb21hX3Zfc2hpZnQsIDApOworICAgICAgICBwdXRfcmFjKGMsIHN0YXRlLCBmLT50cmFuc3BhcmVuY3kpOworCisgICAgICAgIHdyaXRlX3F1YW50X3RhYmxlcyhjLCBmLT5xdWFudF90YWJsZSk7CisgICAgfSBlbHNlIGlmIChmLT52ZXJzaW9uIDwgMykgeworICAgICAgICBwdXRfc3ltYm9sKGMsIHN0YXRlLCBmLT5zbGljZV9jb3VudCwgMCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmLT5zbGljZV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBGRlYxQ29udGV4dCAqZnMgPSBmLT5zbGljZV9jb250ZXh0W2ldOworICAgICAgICAgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGZzLT5zbGljZV94ICAgICAgKyAxKSAqIGYtPm51bV9oX3NsaWNlcyAvIGYtPndpZHRoLCAwKTsKKyAgICAgICAgICAgIHB1dF9zeW1ib2woYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIChmcy0+c2xpY2VfeSAgICAgICsgMSkgKiBmLT5udW1fdl9zbGljZXMgLyBmLT5oZWlnaHQsIDApOworICAgICAgICAgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGZzLT5zbGljZV93aWR0aCAgKyAxKSAqIGYtPm51bV9oX3NsaWNlcyAvIGYtPndpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBwdXRfc3ltYm9sKGMsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAoZnMtPnNsaWNlX2hlaWdodCArIDEpICogZi0+bnVtX3Zfc2xpY2VzIC8gZi0+aGVpZ2h0IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZi0+cGxhbmVfY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGYtPnBsYW5lW2pdLnF1YW50X3RhYmxlX2luZGV4LCAwKTsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKGYtPnBsYW5lW2pdLnF1YW50X3RhYmxlX2luZGV4ID09IGYtPmF2Y3R4LT5jb250ZXh0X21vZGVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCB3cml0ZV9leHRyYWRhdGEoRkZWMUNvbnRleHQgKmYpCit7CisgICAgUmFuZ2VDb2RlciAqY29uc3QgYyA9ICZmLT5jOworICAgIHVpbnQ4X3Qgc3RhdGVbQ09OVEVYVF9TSVpFXTsKKyAgICBpbnQgaSwgaiwgazsKKyAgICB1aW50OF90IHN0YXRlMlszMl1bQ09OVEVYVF9TSVpFXTsKKyAgICB1bnNpZ25lZCB2OworCisgICAgbWVtc2V0KHN0YXRlMiwgMTI4LCBzaXplb2Yoc3RhdGUyKSk7CisgICAgbWVtc2V0KHN0YXRlLCAxMjgsIHNpemVvZihzdGF0ZSkpOworCisgICAgZi0+YXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMTAwMDAgKyA0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMSAqIDExICogNSAqIDUgKiA1ICsgMTEgKiAxMSAqIDExKSAqIDMyOworICAgIGYtPmF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2MoZi0+YXZjdHgtPmV4dHJhZGF0YV9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFmLT5hdmN0eC0+ZXh0cmFkYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX2luaXRfcmFuZ2VfZW5jb2RlcihjLCBmLT5hdmN0eC0+ZXh0cmFkYXRhLCBmLT5hdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgIGZmX2J1aWxkX3JhY19zdGF0ZXMoYywgMC4wNSAqICgxTEwgPDwgMzIpLCAyNTYgLSA4KTsKKworICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGYtPnZlcnNpb24sIDApOworICAgIGlmIChmLT52ZXJzaW9uID4gMikgeworICAgICAgICBpZiAoZi0+dmVyc2lvbiA9PSAzKSB7CisgICAgICAgICAgICBmLT5taWNyb192ZXJzaW9uID0gNDsKKyAgICAgICAgfSBlbHNlIGlmIChmLT52ZXJzaW9uID09IDQpCisgICAgICAgICAgICBmLT5taWNyb192ZXJzaW9uID0gMjsKKyAgICAgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZi0+bWljcm9fdmVyc2lvbiwgMCk7CisgICAgfQorCisgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZi0+YWMsIDApOworICAgIGlmIChmLT5hYyA+IDEpCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGYtPnN0YXRlX3RyYW5zaXRpb25baV0gLSBjLT5vbmVfc3RhdGVbaV0sIDEpOworCisgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZi0+Y29sb3JzcGFjZSwgMCk7IC8vIFlVViBjcyB0eXBlCisgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZi0+Yml0c19wZXJfcmF3X3NhbXBsZSwgMCk7CisgICAgcHV0X3JhYyhjLCBzdGF0ZSwgZi0+Y2hyb21hX3BsYW5lcyk7CisgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZi0+Y2hyb21hX2hfc2hpZnQsIDApOworICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGYtPmNocm9tYV92X3NoaWZ0LCAwKTsKKyAgICBwdXRfcmFjKGMsIHN0YXRlLCBmLT50cmFuc3BhcmVuY3kpOworICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGYtPm51bV9oX3NsaWNlcyAtIDEsIDApOworICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGYtPm51bV92X3NsaWNlcyAtIDEsIDApOworCisgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZi0+cXVhbnRfdGFibGVfY291bnQsIDApOworICAgIGZvciAoaSA9IDA7IGkgPCBmLT5xdWFudF90YWJsZV9jb3VudDsgaSsrKQorICAgICAgICB3cml0ZV9xdWFudF90YWJsZXMoYywgZi0+cXVhbnRfdGFibGVzW2ldKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmLT5xdWFudF90YWJsZV9jb3VudDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmLT5jb250ZXh0X2NvdW50W2ldICogQ09OVEVYVF9TSVpFOyBqKyspCisgICAgICAgICAgICBpZiAoZi0+aW5pdGlhbF9zdGF0ZXNbaV0gJiYgZi0+aW5pdGlhbF9zdGF0ZXNbaV1bMF1bal0gIT0gMTI4KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoaiA8IGYtPmNvbnRleHRfY291bnRbaV0gKiBDT05URVhUX1NJWkUpIHsKKyAgICAgICAgICAgIHB1dF9yYWMoYywgc3RhdGUsIDEpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGYtPmNvbnRleHRfY291bnRbaV07IGorKykKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgQ09OVEVYVF9TSVpFOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHByZWQgPSBqID8gZi0+aW5pdGlhbF9zdGF0ZXNbaV1baiAtIDFdW2tdIDogMTI4OworICAgICAgICAgICAgICAgICAgICBwdXRfc3ltYm9sKGMsIHN0YXRlMltrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50OF90KShmLT5pbml0aWFsX3N0YXRlc1tpXVtqXVtrXSAtIHByZWQpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdXRfcmFjKGMsIHN0YXRlLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmLT52ZXJzaW9uID4gMikgeworICAgICAgICBwdXRfc3ltYm9sKGMsIHN0YXRlLCBmLT5lYywgMCk7CisgICAgICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGYtPmludHJhID0gKGYtPmF2Y3R4LT5nb3Bfc2l6ZSA8IDIpLCAwKTsKKyAgICB9CisKKyAgICBmLT5hdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSBmZl9yYWNfdGVybWluYXRlKGMpOworICAgIHYgPSBhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMzJfSUVFRSksIDAsIGYtPmF2Y3R4LT5leHRyYWRhdGEsIGYtPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgQVZfV0wzMihmLT5hdmN0eC0+ZXh0cmFkYXRhICsgZi0+YXZjdHgtPmV4dHJhZGF0YV9zaXplLCB2KTsKKyAgICBmLT5hdmN0eC0+ZXh0cmFkYXRhX3NpemUgKz0gNDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvcnRfc3R0KEZGVjFDb250ZXh0ICpzLCB1aW50OF90IHN0dFsyNTZdKQoreworICAgIGludCBpLCBpMiwgY2hhbmdlZCwgcHJpbnQgPSAwOworCisgICAgZG8geworICAgICAgICBjaGFuZ2VkID0gMDsKKyAgICAgICAgZm9yIChpID0gMTI7IGkgPCAyNDQ7IGkrKykgeworICAgICAgICAgICAgZm9yIChpMiA9IGkgKyAxOyBpMiA8IDI0NSAmJiBpMiA8IGkgKyA0OyBpMisrKSB7CisKKyNkZWZpbmUgQ09TVChvbGQsIG5ldykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzLT5yY19zdGF0W29sZF1bMF0gKiAtbG9nMigoMjU2IC0gKG5ldykpIC8gMjU2LjApICsgICAgIFwKKyAgICBzLT5yY19zdGF0W29sZF1bMV0gKiAtbG9nMigobmV3KSAgICAgICAgIC8gMjU2LjApCisKKyNkZWZpbmUgQ09TVDIob2xkLCBuZXcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDT1NUKG9sZCwgbmV3KSArIENPU1QoMjU2IC0gKG9sZCksIDI1NiAtIChuZXcpKQorCisgICAgICAgICAgICAgICAgZG91YmxlIHNpemUwID0gQ09TVDIoaSwgIGkpICsgQ09TVDIoaTIsIGkyKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgc2l6ZVggPSBDT1NUMihpLCBpMikgKyBDT1NUMihpMiwgaSk7CisgICAgICAgICAgICAgICAgaWYgKHNpemUwIC0gc2l6ZVggPiBzaXplMCooMWUtMTQpICYmIGkgIT0gMTI4ICYmIGkyICE9IDEyOCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgRkZTV0FQKGludCwgc3R0W2ldLCBzdHRbaTJdKTsKKyAgICAgICAgICAgICAgICAgICAgRkZTV0FQKGludCwgcy0+cmNfc3RhdFtpXVswXSwgcy0+cmNfc3RhdFtpMl1bMF0pOworICAgICAgICAgICAgICAgICAgICBGRlNXQVAoaW50LCBzLT5yY19zdGF0W2ldWzFdLCBzLT5yY19zdGF0W2kyXVsxXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDI1NiAtIGkyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGRlNXQVAoaW50LCBzdHRbMjU2IC0gaV0sIHN0dFsyNTYgLSBpMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgRkZTV0FQKGludCwgcy0+cmNfc3RhdFsyNTYgLSBpXVswXSwgcy0+cmNfc3RhdFsyNTYgLSBpMl1bMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgRkZTV0FQKGludCwgcy0+cmNfc3RhdFsyNTYgLSBpXVsxXSwgcy0+cmNfc3RhdFsyNTYgLSBpMl1bMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCAyNTY7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0dFtqXSA9PSBpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0dFtqXSA9IGkyOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R0W2pdID09IGkyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0dFtqXSA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAyNTYgLSBpMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHRbMjU2IC0gal0gPT0gMjU2IC0gaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R0WzI1NiAtIGpdID0gMjU2IC0gaTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R0WzI1NiAtIGpdID09IDI1NiAtIGkyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHRbMjU2IC0gal0gPSAyNTYgLSBpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByaW50ID0gY2hhbmdlZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoY2hhbmdlZCk7CisgICAgcmV0dXJuIHByaW50OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZGVjFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKKyAgICBpbnQgaSwgaiwgaywgbSwgcmV0OworCisgICAgaWYgKChyZXQgPSBmZnYxX2NvbW1vbl9pbml0KGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcy0+dmVyc2lvbiA9IDA7CisKKyAgICBpZiAoKGF2Y3R4LT5mbGFncyAmIChDT0RFQ19GTEFHX1BBU1MxfENPREVDX0ZMQUdfUEFTUzIpKSB8fCBhdmN0eC0+c2xpY2VzPjEpCisgICAgICAgIHMtPnZlcnNpb24gPSBGRk1BWChzLT52ZXJzaW9uLCAyKTsKKworICAgIC8vIFVuc3BlY2lmaWVkIGxldmVsICYgc2xpY2VzLCB3ZSBjaG9vc2UgdmVyc2lvbiAxLjIrIHRvIGVuc3VyZSBtdWx0aXRocmVhZGVkIGRlY29kYWJpbGl0eQorICAgIGlmIChhdmN0eC0+c2xpY2VzID09IDAgJiYgYXZjdHgtPmxldmVsIDwgMCAmJiBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ID4gNzIwKjU3NikKKyAgICAgICAgcy0+dmVyc2lvbiA9IEZGTUFYKHMtPnZlcnNpb24sIDIpOworCisgICAgaWYgKGF2Y3R4LT5sZXZlbCA8PSAwICYmIHMtPnZlcnNpb24gPT0gMikgeworICAgICAgICBzLT52ZXJzaW9uID0gMzsKKyAgICB9CisgICAgaWYgKGF2Y3R4LT5sZXZlbCA+PSAwICYmIGF2Y3R4LT5sZXZlbCA8PSA0KQorICAgICAgICBzLT52ZXJzaW9uID0gRkZNQVgocy0+dmVyc2lvbiwgYXZjdHgtPmxldmVsKTsKKworICAgIGlmIChzLT5lYyA8IDApIHsKKyAgICAgICAgcy0+ZWMgPSAocy0+dmVyc2lvbiA+PSAzKTsKKyAgICB9CisKKyAgICBpZiAoKHMtPnZlcnNpb24gPT0gMiB8fCBzLT52ZXJzaW9uPjMpICYmIGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlZlcnNpb24gMiBuZWVkZWQgZm9yIHJlcXVlc3RlZCBmZWF0dXJlcyBidXQgdmVyc2lvbiAyIGlzIGV4cGVyaW1lbnRhbCBhbmQgbm90IGVuYWJsZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5hYyA9IGF2Y3R4LT5jb2Rlcl90eXBlID4gMCA/IDIgOiAwOworCisgICAgcy0+cGxhbmVfY291bnQgPSAzOworICAgIHN3aXRjaChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFA5OgorICAgICAgICBpZiAoIWF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKQorICAgICAgICAgICAgcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDk7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTA6CisgICAgICAgIHMtPnBhY2tlZF9hdF9sc2IgPSAxOworICAgICAgICBpZiAoIWF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICYmICFzLT5iaXRzX3Blcl9yYXdfc2FtcGxlKQorICAgICAgICAgICAgcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDEwOworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDE2OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTY6CisgICAgICAgIGlmICghYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgJiYgIXMtPmJpdHNfcGVyX3Jhd19zYW1wbGUpIHsKKyAgICAgICAgICAgIHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSAxNjsKKyAgICAgICAgfSBlbHNlIGlmICghcy0+Yml0c19wZXJfcmF3X3NhbXBsZSkgeworICAgICAgICAgICAgcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5iaXRzX3Blcl9yYXdfc2FtcGxlIDw9IDgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYml0c19wZXJfcmF3X3NhbXBsZSBpbnZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmICghcy0+YWMgJiYgYXZjdHgtPmNvZGVyX3R5cGUgPT0gLTEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJiaXRzX3Blcl9yYXdfc2FtcGxlID4gOCwgZm9yY2luZyBjb2RlciAxXG4iKTsKKyAgICAgICAgICAgIHMtPmFjID0gMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXMtPmFjKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJpdHNfcGVyX3Jhd19zYW1wbGUgb2YgbW9yZSB0aGFuIDggbmVlZHMgLWNvZGVyIDEgY3VycmVudGx5XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIH0KKyAgICAgICAgcy0+dmVyc2lvbiA9IEZGTUFYKHMtPnZlcnNpb24sIDEpOworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDExUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDEwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDoKKyAgICAgICAgcy0+Y2hyb21hX3BsYW5lcyA9IGRlc2MtPm5iX2NvbXBvbmVudHMgPCAzID8gMCA6IDE7CisgICAgICAgIHMtPmNvbG9yc3BhY2UgPSAwOworICAgICAgICBzLT50cmFuc3BhcmVuY3kgPSBkZXNjLT5uYl9jb21wb25lbnRzID09IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjoKKyAgICAgICAgcy0+Y29sb3JzcGFjZSA9IDE7CisgICAgICAgIHMtPnRyYW5zcGFyZW5jeSA9IDE7CisgICAgICAgIHMtPmNocm9tYV9wbGFuZXMgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfMFJHQjMyOgorICAgICAgICBzLT5jb2xvcnNwYWNlID0gMTsKKyAgICAgICAgcy0+Y2hyb21hX3BsYW5lcyA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOToKKyAgICAgICAgaWYgKCFhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSkKKyAgICAgICAgICAgIHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSA5OworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTA6CisgICAgICAgIGlmICghYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgJiYgIXMtPmJpdHNfcGVyX3Jhd19zYW1wbGUpCisgICAgICAgICAgICBzLT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTA7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMjoKKyAgICAgICAgaWYgKCFhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSAmJiAhcy0+Yml0c19wZXJfcmF3X3NhbXBsZSkKKyAgICAgICAgICAgIHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSAxMjsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE0OgorICAgICAgICBpZiAoIWF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICYmICFzLT5iaXRzX3Blcl9yYXdfc2FtcGxlKQorICAgICAgICAgICAgcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDE0OworICAgICAgICBlbHNlIGlmICghcy0+Yml0c19wZXJfcmF3X3NhbXBsZSkKKyAgICAgICAgICAgIHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZTsKKyAgICAgICAgcy0+Y29sb3JzcGFjZSA9IDE7CisgICAgICAgIHMtPmNocm9tYV9wbGFuZXMgPSAxOworICAgICAgICBzLT52ZXJzaW9uID0gRkZNQVgocy0+dmVyc2lvbiwgMSk7CisgICAgICAgIGlmICghcy0+YWMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYml0c19wZXJfcmF3X3NhbXBsZSBvZiBtb3JlIHRoYW4gOCBuZWVkcyAtY29kZXIgMSBjdXJyZW50bHlcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImZvcm1hdCBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisgICAgaWYgKHMtPnRyYW5zcGFyZW5jeSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiU3RvcmluZyBhbHBoYSBwbGFuZSwgdGhpcyB3aWxsIHJlcXVpcmUgYSByZWNlbnQgRkZWMSBkZWNvZGVyIHRvIHBsYXliYWNrIVxuIik7CisgICAgfQorICAgIGlmIChhdmN0eC0+Y29udGV4dF9tb2RlbCA+IDFVKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjb250ZXh0IG1vZGVsICVkLCB2YWxpZCB2YWx1ZXMgYXJlIDAgYW5kIDFcbiIsIGF2Y3R4LT5jb250ZXh0X21vZGVsKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAocy0+YWMgPiAxKQorICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBzLT5zdGF0ZV90cmFuc2l0aW9uW2ldID0gdmVyMl9zdGF0ZVtpXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBzLT5xdWFudF90YWJsZV9jb3VudCA9IDI7CisgICAgICAgIGlmIChzLT5iaXRzX3Blcl9yYXdfc2FtcGxlIDw9IDgpIHsKKyAgICAgICAgICAgIHMtPnF1YW50X3RhYmxlc1swXVswXVtpXT0gICAgICAgICAgIHF1YW50MTFbaV07CisgICAgICAgICAgICBzLT5xdWFudF90YWJsZXNbMF1bMV1baV09ICAgICAgICAxMSpxdWFudDExW2ldOworICAgICAgICAgICAgcy0+cXVhbnRfdGFibGVzWzBdWzJdW2ldPSAgICAgMTEqMTEqcXVhbnQxMVtpXTsKKyAgICAgICAgICAgIHMtPnF1YW50X3RhYmxlc1sxXVswXVtpXT0gICAgICAgICAgIHF1YW50MTFbaV07CisgICAgICAgICAgICBzLT5xdWFudF90YWJsZXNbMV1bMV1baV09ICAgICAgICAxMSpxdWFudDExW2ldOworICAgICAgICAgICAgcy0+cXVhbnRfdGFibGVzWzFdWzJdW2ldPSAgICAgMTEqMTEqcXVhbnQ1IFtpXTsKKyAgICAgICAgICAgIHMtPnF1YW50X3RhYmxlc1sxXVszXVtpXT0gICA1KjExKjExKnF1YW50NSBbaV07CisgICAgICAgICAgICBzLT5xdWFudF90YWJsZXNbMV1bNF1baV09IDUqNSoxMSoxMSpxdWFudDUgW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+cXVhbnRfdGFibGVzWzBdWzBdW2ldPSAgICAgICAgICAgcXVhbnQ5XzEwYml0W2ldOworICAgICAgICAgICAgcy0+cXVhbnRfdGFibGVzWzBdWzFdW2ldPSAgICAgICAgMTEqcXVhbnQ5XzEwYml0W2ldOworICAgICAgICAgICAgcy0+cXVhbnRfdGFibGVzWzBdWzJdW2ldPSAgICAgMTEqMTEqcXVhbnQ5XzEwYml0W2ldOworICAgICAgICAgICAgcy0+cXVhbnRfdGFibGVzWzFdWzBdW2ldPSAgICAgICAgICAgcXVhbnQ5XzEwYml0W2ldOworICAgICAgICAgICAgcy0+cXVhbnRfdGFibGVzWzFdWzFdW2ldPSAgICAgICAgMTEqcXVhbnQ5XzEwYml0W2ldOworICAgICAgICAgICAgcy0+cXVhbnRfdGFibGVzWzFdWzJdW2ldPSAgICAgMTEqMTEqcXVhbnQ1XzEwYml0W2ldOworICAgICAgICAgICAgcy0+cXVhbnRfdGFibGVzWzFdWzNdW2ldPSAgIDUqMTEqMTEqcXVhbnQ1XzEwYml0W2ldOworICAgICAgICAgICAgcy0+cXVhbnRfdGFibGVzWzFdWzRdW2ldPSA1KjUqMTEqMTEqcXVhbnQ1XzEwYml0W2ldOworICAgICAgICB9CisgICAgfQorICAgIHMtPmNvbnRleHRfY291bnRbMF0gPSAoMTEgKiAxMSAqIDExICAgICAgICArIDEpIC8gMjsKKyAgICBzLT5jb250ZXh0X2NvdW50WzFdID0gKDExICogMTEgKiA1ICogNSAqIDUgKyAxKSAvIDI7CisgICAgbWVtY3B5KHMtPnF1YW50X3RhYmxlLCBzLT5xdWFudF90YWJsZXNbYXZjdHgtPmNvbnRleHRfbW9kZWxdLAorICAgICAgICAgICBzaXplb2Yocy0+cXVhbnRfdGFibGUpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5wbGFuZV9jb3VudDsgaSsrKSB7CisgICAgICAgIFBsYW5lQ29udGV4dCAqY29uc3QgcCA9ICZzLT5wbGFuZVtpXTsKKworICAgICAgICBtZW1jcHkocC0+cXVhbnRfdGFibGUsIHMtPnF1YW50X3RhYmxlLCBzaXplb2YocC0+cXVhbnRfdGFibGUpKTsKKyAgICAgICAgcC0+cXVhbnRfdGFibGVfaW5kZXggPSBhdmN0eC0+Y29udGV4dF9tb2RlbDsKKyAgICAgICAgcC0+Y29udGV4dF9jb3VudCAgICAgPSBzLT5jb250ZXh0X2NvdW50W3AtPnF1YW50X3RhYmxlX2luZGV4XTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmdjFfYWxsb2NhdGVfaW5pdGlhbF9zdGF0ZXMocykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgaWYgKCFzLT50cmFuc3BhcmVuY3kpCisgICAgICAgIHMtPnBsYW5lX2NvdW50ID0gMjsKKyAgICBpZiAoIXMtPmNocm9tYV9wbGFuZXMgJiYgcy0+dmVyc2lvbiA+IDMpCisgICAgICAgIHMtPnBsYW5lX2NvdW50LS07CisKKyAgICBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmN0eC0+cGl4X2ZtdCwgJnMtPmNocm9tYV9oX3NoaWZ0LCAmcy0+Y2hyb21hX3Zfc2hpZnQpOworICAgIHMtPnBpY3R1cmVfbnVtYmVyID0gMDsKKworICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiAoQ09ERUNfRkxBR19QQVNTMSB8IENPREVDX0ZMQUdfUEFTUzIpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5xdWFudF90YWJsZV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBzLT5yY19zdGF0MltpXSA9IGF2X21hbGxvY3oocy0+Y29udGV4dF9jb3VudFtpXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5yY19zdGF0MltpXSkpOworICAgICAgICAgICAgaWYgKCFzLT5yY19zdGF0MltpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhdmN0eC0+c3RhdHNfaW4pIHsKKyAgICAgICAgY2hhciAqcCA9IGF2Y3R4LT5zdGF0c19pbjsKKyAgICAgICAgdWludDhfdCAoKmJlc3Rfc3RhdGUpWzI1Nl0gPSBhdl9tYWxsb2NfYXJyYXkoMjU2LCAyNTYpOworICAgICAgICBpbnQgZ29iX2NvdW50ID0gMDsKKyAgICAgICAgY2hhciAqbmV4dDsKKyAgICAgICAgaWYgKCFiZXN0X3N0YXRlKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBhdl9hc3NlcnQwKHMtPnZlcnNpb24gPj0gMik7CisKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+cmNfc3RhdFtqXVtpXSA9IHN0cnRvbChwLCAmbmV4dCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IHApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyUGFzcyBmaWxlIGludmFsaWQgYXQgJWQgJWQgWyVzXVxuIiwgaiwgaSwgcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmYmVzdF9zdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cXVhbnRfdGFibGVfY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+Y29udGV4dF9jb3VudFtpXTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAzMjsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IDI7IG0rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJjX3N0YXQyW2ldW2pdW2tdW21dID0gc3RydG9sKHAsICZuZXh0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSBwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjJQYXNzIGZpbGUgaW52YWxpZCBhdCAlZCAlZCAlZCAlZCBbJXNdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaiwgaywgbSwgcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZiZXN0X3N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvYl9jb3VudCA9IHN0cnRvbChwLCAmbmV4dCwgMCk7CisgICAgICAgICAgICBpZiAobmV4dCA9PSBwIHx8IGdvYl9jb3VudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICIyUGFzcyBmaWxlIGludmFsaWRcbiIpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZiZXN0X3N0YXRlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAgPSBuZXh0OworICAgICAgICAgICAgd2hpbGUgKCpwID09ICdcbicgfHwgKnAgPT0gJyAnKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGlmIChwWzBdID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc29ydF9zdHQocywgcy0+c3RhdGVfdHJhbnNpdGlvbik7CisKKyAgICAgICAgZmluZF9iZXN0X3N0YXRlKGJlc3Rfc3RhdGUsIHMtPnN0YXRlX3RyYW5zaXRpb24pOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5xdWFudF90YWJsZV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzI7IGsrKykgeworICAgICAgICAgICAgICAgIGRvdWJsZSBhPTAsIGI9MDsKKyAgICAgICAgICAgICAgICBpbnQganAgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5jb250ZXh0X2NvdW50W2ldOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHAgPSAxMjg7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5yY19zdGF0MltpXVtqXVtrXVswXSArIHMtPnJjX3N0YXQyW2ldW2pdW2tdWzFdID4gMjAwICYmIGogfHwgYStiID4gMjAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYStiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAyNTYuMCAqIGIgLyAoYSArIGIpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5pdGlhbF9zdGF0ZXNbaV1banBdW2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3N0YXRlW2F2X2NsaXAocm91bmQocCksIDEsIDI1NSldW2F2X2NsaXAoKGEgKyBiKSAvIGdvYl9jb3VudCwgMCwgMjU1KV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoanArKzsganA8ajsganArKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbml0aWFsX3N0YXRlc1tpXVtqcF1ba10gPSBzLT5pbml0aWFsX3N0YXRlc1tpXVtqcC0xXVtrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGE9Yj0wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGEgKz0gcy0+cmNfc3RhdDJbaV1bal1ba11bMF07CisgICAgICAgICAgICAgICAgICAgIGIgKz0gcy0+cmNfc3RhdDJbaV1bal1ba11bMV07CisgICAgICAgICAgICAgICAgICAgIGlmIChhK2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAyNTYuMCAqIGIgLyAoYSArIGIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMtPmluaXRpYWxfc3RhdGVzW2ldW2pdW2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3Rfc3RhdGVbYXZfY2xpcChyb3VuZChwKSwgMSwgMjU1KV1bYXZfY2xpcCgoYSArIGIpIC8gZ29iX2NvdW50LCAwLCAyNTUpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZXAoJmJlc3Rfc3RhdGUpOworICAgIH0KKworICAgIGlmIChzLT52ZXJzaW9uID4gMSkgeworICAgICAgICBzLT5udW1fdl9zbGljZXMgPSAoYXZjdHgtPndpZHRoID4gMzUyIHx8IGF2Y3R4LT5oZWlnaHQgPiAyODggfHwgIWF2Y3R4LT5zbGljZXMpID8gMiA6IDE7CisgICAgICAgIGZvciAoOyBzLT5udW1fdl9zbGljZXMgPCA5OyBzLT5udW1fdl9zbGljZXMrKykgeworICAgICAgICAgICAgZm9yIChzLT5udW1faF9zbGljZXMgPSBzLT5udW1fdl9zbGljZXM7IHMtPm51bV9oX3NsaWNlcyA8IDIqcy0+bnVtX3Zfc2xpY2VzOyBzLT5udW1faF9zbGljZXMrKykgeworICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+c2xpY2VzID09IHMtPm51bV9oX3NsaWNlcyAqIHMtPm51bV92X3NsaWNlcyAmJiBhdmN0eC0+c2xpY2VzIDw9IDY0IHx8ICFhdmN0eC0+c2xpY2VzKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHNsaWNlc19vazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBudW1iZXIgJWQgb2Ygc2xpY2VzIHJlcXVlc3RlZCwgcGxlYXNlIHNwZWNpZnkgYSAiCisgICAgICAgICAgICAgICAic3VwcG9ydGVkIG51bWJlciB3aXRoIC1zbGljZXMgKGV4OjQsNiw5LDEyLDE2LCAuLi4pXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPnNsaWNlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CitzbGljZXNfb2s6CisgICAgICAgIGlmICgocmV0ID0gd3JpdGVfZXh0cmFkYXRhKHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZ2MV9pbml0X3NsaWNlX2NvbnRleHRzKHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBmZnYxX2luaXRfc2xpY2VzX3N0YXRlKHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyNkZWZpbmUgU1RBVFNfT1VUX1NJWkUgMTAyNCAqIDEwMjQgKiA2CisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzEpIHsKKyAgICAgICAgYXZjdHgtPnN0YXRzX291dCA9IGF2X21hbGxvY3ooU1RBVFNfT1VUX1NJWkUpOworICAgICAgICBpZiAoIWF2Y3R4LT5zdGF0c19vdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cXVhbnRfdGFibGVfY291bnQ7IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5zbGljZV9jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgRkZWMUNvbnRleHQgKnNmID0gcy0+c2xpY2VfY29udGV4dFtqXTsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKCFzZi0+cmNfc3RhdDJbaV0pOworICAgICAgICAgICAgICAgIHNmLT5yY19zdGF0MltpXSA9IGF2X21hbGxvY3oocy0+Y29udGV4dF9jb3VudFtpXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnNmLT5yY19zdGF0MltpXSkpOworICAgICAgICAgICAgICAgIGlmICghc2YtPnJjX3N0YXQyW2ldKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfc2xpY2VfaGVhZGVyKEZGVjFDb250ZXh0ICpmLCBGRlYxQ29udGV4dCAqZnMpCit7CisgICAgUmFuZ2VDb2RlciAqYyA9ICZmcy0+YzsKKyAgICB1aW50OF90IHN0YXRlW0NPTlRFWFRfU0laRV07CisgICAgaW50IGo7CisgICAgbWVtc2V0KHN0YXRlLCAxMjgsIHNpemVvZihzdGF0ZSkpOworCisgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgKGZzLT5zbGljZV94ICAgICArMSkqZi0+bnVtX2hfc2xpY2VzIC8gZi0+d2lkdGggICAsIDApOworICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIChmcy0+c2xpY2VfeSAgICAgKzEpKmYtPm51bV92X3NsaWNlcyAvIGYtPmhlaWdodCAgLCAwKTsKKyAgICBwdXRfc3ltYm9sKGMsIHN0YXRlLCAoZnMtPnNsaWNlX3dpZHRoICsxKSpmLT5udW1faF9zbGljZXMgLyBmLT53aWR0aCAtMSwgMCk7CisgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgKGZzLT5zbGljZV9oZWlnaHQrMSkqZi0+bnVtX3Zfc2xpY2VzIC8gZi0+aGVpZ2h0LTEsIDApOworICAgIGZvciAoaj0wOyBqPGYtPnBsYW5lX2NvdW50OyBqKyspIHsKKyAgICAgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZi0+cGxhbmVbal0ucXVhbnRfdGFibGVfaW5kZXgsIDApOworICAgICAgICBhdl9hc3NlcnQwKGYtPnBsYW5lW2pdLnF1YW50X3RhYmxlX2luZGV4ID09IGYtPmF2Y3R4LT5jb250ZXh0X21vZGVsKTsKKyAgICB9CisgICAgaWYgKCFmLT5waWN0dXJlLmYtPmludGVybGFjZWRfZnJhbWUpCisgICAgICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIDMsIDApOworICAgIGVsc2UKKyAgICAgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgMSArICFmLT5waWN0dXJlLmYtPnRvcF9maWVsZF9maXJzdCwgMCk7CisgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZi0+cGljdHVyZS5mLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgMCk7CisgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZi0+cGljdHVyZS5mLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwgMCk7CisgICAgaWYgKGYtPnZlcnNpb24gPiAzKSB7CisgICAgICAgIHB1dF9yYWMoYywgc3RhdGUsIGZzLT5zbGljZV9jb2RpbmdfbW9kZSA9PSAxKTsKKyAgICAgICAgaWYgKGZzLT5zbGljZV9jb2RpbmdfbW9kZSA9PSAxKQorICAgICAgICAgICAgZmZ2MV9jbGVhcl9zbGljZV9zdGF0ZShmLCBmcyk7CisgICAgICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGZzLT5zbGljZV9jb2RpbmdfbW9kZSwgMCk7CisgICAgICAgIGlmIChmcy0+c2xpY2VfY29kaW5nX21vZGUgIT0gMSkgeworICAgICAgICAgICAgcHV0X3N5bWJvbChjLCBzdGF0ZSwgZnMtPnNsaWNlX3JjdF9ieV9jb2VmLCAwKTsKKyAgICAgICAgICAgIHB1dF9zeW1ib2woYywgc3RhdGUsIGZzLT5zbGljZV9yY3RfcnlfY29lZiwgMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNob29zZV9yY3RfcGFyYW1zKEZGVjFDb250ZXh0ICpmcywgdWludDhfdCAqc3JjWzNdLCBjb25zdCBpbnQgc3RyaWRlWzNdLCBpbnQgdywgaW50IGgpCit7CisjZGVmaW5lIE5CX1lfQ09FRkYgMTUKKyAgICBzdGF0aWMgY29uc3QgaW50IHJjdF95X2NvZWZmWzE1XVsyXSA9IHsKKyAgICAgICAgezAsIDB9LCAvLyAgICAgIDRHCisgICAgICAgIHsxLCAxfSwgLy8gIFIgKyAyRyArIEIKKyAgICAgICAgezIsIDJ9LCAvLyAyUiAgICAgICsgMkIKKyAgICAgICAgezAsIDJ9LCAvLyAgICAgIDJHICsgMkIKKyAgICAgICAgezIsIDB9LCAvLyAyUiArIDJHCisgICAgICAgIHs0LCAwfSwgLy8gNFIKKyAgICAgICAgezAsIDR9LCAvLyAgICAgICAgICAgNEIKKworICAgICAgICB7MCwgM30sIC8vICAgICAgMUcgKyAzQgorICAgICAgICB7MywgMH0sIC8vIDNSICsgMUcKKyAgICAgICAgezMsIDF9LCAvLyAzUiAgICAgICsgIEIKKyAgICAgICAgezEsIDN9LCAvLyAgUiAgICAgICsgM0IKKyAgICAgICAgezEsIDJ9LCAvLyAgUiArICBHICsgMkIKKyAgICAgICAgezIsIDF9LCAvLyAyUiArICBHICsgIEIKKyAgICAgICAgezAsIDF9LCAvLyAgICAgIDNHICsgIEIKKyAgICAgICAgezEsIDB9LCAvLyAgUiArIDNHCisgICAgfTsKKworICAgIGludCBzdGF0W05CX1lfQ09FRkZdID0gezB9OworICAgIGludCB4LCB5LCBpLCBwLCBiZXN0OworICAgIGludDE2X3QgKnNhbXBsZVszXTsKKyAgICBpbnQgbGJkID0gZnMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPD0gODsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgaW50IGxhc3RyPTAsIGxhc3RnPTAsIGxhc3RiPTA7CisgICAgICAgIGZvciAocCA9IDA7IHAgPCAzOyBwKyspCisgICAgICAgICAgICBzYW1wbGVbcF0gPSBmcy0+c2FtcGxlX2J1ZmZlciArIHAqdzsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBpbnQgYiwgZywgcjsKKyAgICAgICAgICAgIGludCBhYiwgYWcsIGFyOworICAgICAgICAgICAgaWYgKGxiZCkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHYgPSAqKCh1aW50MzJfdCopKHNyY1swXSArIHgqNCArIHN0cmlkZVswXSp5KSk7CisgICAgICAgICAgICAgICAgYiA9ICB2ICAgICAgICAmIDB4RkY7CisgICAgICAgICAgICAgICAgZyA9ICh2ID4+ICA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgciA9ICh2ID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGIgPSAqKCh1aW50MTZfdCopKHNyY1swXSArIHgqMiArIHN0cmlkZVswXSp5KSk7CisgICAgICAgICAgICAgICAgZyA9ICooKHVpbnQxNl90Kikoc3JjWzFdICsgeCoyICsgc3RyaWRlWzFdKnkpKTsKKyAgICAgICAgICAgICAgICByID0gKigodWludDE2X3QqKShzcmNbMl0gKyB4KjIgKyBzdHJpZGVbMl0qeSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhciA9IHIgLSBsYXN0cjsKKyAgICAgICAgICAgIGFnID0gZyAtIGxhc3RnOworICAgICAgICAgICAgYWIgPSBiIC0gbGFzdGI7CisgICAgICAgICAgICBpZiAoeCAmJiB5KSB7CisgICAgICAgICAgICAgICAgaW50IGJnID0gYWcgLSBzYW1wbGVbMF1beF07CisgICAgICAgICAgICAgICAgaW50IGJiID0gYWIgLSBzYW1wbGVbMV1beF07CisgICAgICAgICAgICAgICAgaW50IGJyID0gYXIgLSBzYW1wbGVbMl1beF07CisKKyAgICAgICAgICAgICAgICBiciAtPSBiZzsKKyAgICAgICAgICAgICAgICBiYiAtPSBiZzsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGk8TkJfWV9DT0VGRjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRbaV0gKz0gRkZBQlMoYmcgKyAoKGJyKnJjdF95X2NvZWZmW2ldWzBdICsgYmIqcmN0X3lfY29lZmZbaV1bMV0pPj4yKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYW1wbGVbMF1beF0gPSBhZzsKKyAgICAgICAgICAgIHNhbXBsZVsxXVt4XSA9IGFiOworICAgICAgICAgICAgc2FtcGxlWzJdW3hdID0gYXI7CisKKyAgICAgICAgICAgIGxhc3RyID0gcjsKKyAgICAgICAgICAgIGxhc3RnID0gZzsKKyAgICAgICAgICAgIGxhc3RiID0gYjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJlc3QgPSAwOworICAgIGZvciAoaT0xOyBpPE5CX1lfQ09FRkY7IGkrKykgeworICAgICAgICBpZiAoc3RhdFtpXSA8IHN0YXRbYmVzdF0pCisgICAgICAgICAgICBiZXN0ID0gaTsKKyAgICB9CisKKyAgICBmcy0+c2xpY2VfcmN0X2J5X2NvZWYgPSByY3RfeV9jb2VmZltiZXN0XVsxXTsKKyAgICBmcy0+c2xpY2VfcmN0X3J5X2NvZWYgPSByY3RfeV9jb2VmZltiZXN0XVswXTsKK30KKworc3RhdGljIGludCBlbmNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmMsIHZvaWQgKmFyZykKK3sKKyAgICBGRlYxQ29udGV4dCAqZnMgID0gKih2b2lkICoqKWFyZzsKKyAgICBGRlYxQ29udGV4dCAqZiAgID0gZnMtPmF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHdpZHRoICAgICAgICA9IGZzLT5zbGljZV93aWR0aDsKKyAgICBpbnQgaGVpZ2h0ICAgICAgID0gZnMtPnNsaWNlX2hlaWdodDsKKyAgICBpbnQgeCAgICAgICAgICAgID0gZnMtPnNsaWNlX3g7CisgICAgaW50IHkgICAgICAgICAgICA9IGZzLT5zbGljZV95OworICAgIGNvbnN0IEFWRnJhbWUgKmNvbnN0IHAgPSBmLT5waWN0dXJlLmY7CisgICAgY29uc3QgaW50IHBzICAgICA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYy0+cGl4X2ZtdCktPmNvbXBbMF0uc3RlcF9taW51czEgKyAxOworICAgIGludCByZXQ7CisgICAgUmFuZ2VDb2RlciBjX2JhayA9IGZzLT5jOworICAgIHVpbnQ4X3QgKnBsYW5lc1szXSA9IHtwLT5kYXRhWzBdICsgcHMqeCArIHkqcC0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGFbMV0gKyBwcyp4ICsgeSpwLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVsyXSArIHBzKnggKyB5KnAtPmxpbmVzaXplWzJdfTsKKworICAgIGZzLT5zbGljZV9jb2RpbmdfbW9kZSA9IDA7CisgICAgaWYgKGYtPnZlcnNpb24gPiAzKSB7CisgICAgICAgIGNob29zZV9yY3RfcGFyYW1zKGZzLCBwbGFuZXMsIHAtPmxpbmVzaXplLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcy0+c2xpY2VfcmN0X2J5X2NvZWYgPSAxOworICAgICAgICBmcy0+c2xpY2VfcmN0X3J5X2NvZWYgPSAxOworICAgIH0KKworcmV0cnk6CisgICAgaWYgKGMtPmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWUpCisgICAgICAgIGZmdjFfY2xlYXJfc2xpY2Vfc3RhdGUoZiwgZnMpOworICAgIGlmIChmLT52ZXJzaW9uID4gMikgeworICAgICAgICBlbmNvZGVfc2xpY2VfaGVhZGVyKGYsIGZzKTsKKyAgICB9CisgICAgaWYgKCFmcy0+YWMpIHsKKyAgICAgICAgaWYgKGYtPnZlcnNpb24gPiAyKQorICAgICAgICAgICAgcHV0X3JhYygmZnMtPmMsICh1aW50OF90W10pIHsgMTI5IH0sIDApOworICAgICAgICBmcy0+YWNfYnl0ZV9jb3VudCA9IGYtPnZlcnNpb24gPiAyIHx8ICgheCAmJiAheSkgPyBmZl9yYWNfdGVybWluYXRlKCZmcy0+YykgOiAwOworICAgICAgICBpbml0X3B1dF9iaXRzKCZmcy0+cGIsCisgICAgICAgICAgICAgICAgICAgICAgZnMtPmMuYnl0ZXN0cmVhbV9zdGFydCArIGZzLT5hY19ieXRlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgIGZzLT5jLmJ5dGVzdHJlYW1fZW5kIC0gZnMtPmMuYnl0ZXN0cmVhbV9zdGFydCAtIGZzLT5hY19ieXRlX2NvdW50KTsKKyAgICB9CisKKyAgICBpZiAoZi0+Y29sb3JzcGFjZSA9PSAwKSB7CisgICAgICAgIGNvbnN0IGludCBjaHJvbWFfd2lkdGggID0gRkZfQ0VJTF9SU0hJRlQod2lkdGgsICBmLT5jaHJvbWFfaF9zaGlmdCk7CisgICAgICAgIGNvbnN0IGludCBjaHJvbWFfaGVpZ2h0ID0gRkZfQ0VJTF9SU0hJRlQoaGVpZ2h0LCBmLT5jaHJvbWFfdl9zaGlmdCk7CisgICAgICAgIGNvbnN0IGludCBjeCAgICAgICAgICAgID0geCA+PiBmLT5jaHJvbWFfaF9zaGlmdDsKKyAgICAgICAgY29uc3QgaW50IGN5ICAgICAgICAgICAgPSB5ID4+IGYtPmNocm9tYV92X3NoaWZ0OworCisgICAgICAgIHJldCA9IGVuY29kZV9wbGFuZShmcywgcC0+ZGF0YVswXSArIHBzKnggKyB5KnAtPmxpbmVzaXplWzBdLCB3aWR0aCwgaGVpZ2h0LCBwLT5saW5lc2l6ZVswXSwgMCk7CisKKyAgICAgICAgaWYgKGYtPmNocm9tYV9wbGFuZXMpIHsKKyAgICAgICAgICAgIHJldCB8PSBlbmNvZGVfcGxhbmUoZnMsIHAtPmRhdGFbMV0gKyBwcypjeCtjeSpwLT5saW5lc2l6ZVsxXSwgY2hyb21hX3dpZHRoLCBjaHJvbWFfaGVpZ2h0LCBwLT5saW5lc2l6ZVsxXSwgMSk7CisgICAgICAgICAgICByZXQgfD0gZW5jb2RlX3BsYW5lKGZzLCBwLT5kYXRhWzJdICsgcHMqY3grY3kqcC0+bGluZXNpemVbMl0sIGNocm9tYV93aWR0aCwgY2hyb21hX2hlaWdodCwgcC0+bGluZXNpemVbMl0sIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChmcy0+dHJhbnNwYXJlbmN5KQorICAgICAgICAgICAgcmV0IHw9IGVuY29kZV9wbGFuZShmcywgcC0+ZGF0YVszXSArIHBzKnggKyB5KnAtPmxpbmVzaXplWzNdLCB3aWR0aCwgaGVpZ2h0LCBwLT5saW5lc2l6ZVszXSwgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gZW5jb2RlX3JnYl9mcmFtZShmcywgcGxhbmVzLCB3aWR0aCwgaGVpZ2h0LCBwLT5saW5lc2l6ZSk7CisgICAgfQorICAgIGVtbXNfYygpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfYXNzZXJ0MChmcy0+c2xpY2VfY29kaW5nX21vZGUgPT0gMCk7CisgICAgICAgIGlmIChmcy0+dmVyc2lvbiA8IDQgfHwgIWZzLT5hYykgeworICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkJ1ZmZlciB0b28gc21hbGxcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coYywgQVZfTE9HX0RFQlVHLCAiQ29kaW5nIHNsaWNlIGFzIFBDTVxuIik7CisgICAgICAgIGZzLT5zbGljZV9jb2RpbmdfbW9kZSA9IDE7CisgICAgICAgIGZzLT5jID0gY19iYWs7CisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpY3QsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBGRlYxQ29udGV4dCAqZiAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBSYW5nZUNvZGVyICpjb25zdCBjID0gJmYtPnNsaWNlX2NvbnRleHRbMF0tPmM7CisgICAgQVZGcmFtZSAqY29uc3QgcCAgICA9IGYtPnBpY3R1cmUuZjsKKyAgICBpbnQgdXNlZF9jb3VudCAgICAgID0gMDsKKyAgICB1aW50OF90IGtleXN0YXRlICAgID0gMTI4OworICAgIHVpbnQ4X3QgKmJ1Zl9wOworICAgIGludCBpLCByZXQ7CisgICAgaW50NjRfdCBtYXhzaXplID0gICBGRl9NSU5fQlVGRkVSX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICArIGF2Y3R4LT53aWR0aCphdmN0eC0+aGVpZ2h0KjM1TEwqNDsKKworICAgIGlmKCFwaWN0KSB7CisgICAgICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1BBU1MxKSB7CisgICAgICAgICAgICBpbnQgaiwgaywgbTsKKyAgICAgICAgICAgIGNoYXIgKnAgICA9IGF2Y3R4LT5zdGF0c19vdXQ7CisgICAgICAgICAgICBjaGFyICplbmQgPSBwICsgU1RBVFNfT1VUX1NJWkU7CisKKyAgICAgICAgICAgIG1lbXNldChmLT5yY19zdGF0LCAwLCBzaXplb2YoZi0+cmNfc3RhdCkpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGYtPnF1YW50X3RhYmxlX2NvdW50OyBpKyspCisgICAgICAgICAgICAgICAgbWVtc2V0KGYtPnJjX3N0YXQyW2ldLCAwLCBmLT5jb250ZXh0X2NvdW50W2ldICogc2l6ZW9mKCpmLT5yY19zdGF0MltpXSkpOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZi0+c2xpY2VfY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgIEZGVjFDb250ZXh0ICpmcyA9IGYtPnNsaWNlX2NvbnRleHRbal07CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGYtPnJjX3N0YXRbaV1bMF0gKz0gZnMtPnJjX3N0YXRbaV1bMF07CisgICAgICAgICAgICAgICAgICAgIGYtPnJjX3N0YXRbaV1bMV0gKz0gZnMtPnJjX3N0YXRbaV1bMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmLT5xdWFudF90YWJsZV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBmLT5jb250ZXh0X2NvdW50W2ldOyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgMzI7IG0rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPnJjX3N0YXQyW2ldW2tdW21dWzBdICs9IGZzLT5yY19zdGF0MltpXVtrXVttXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5yY19zdGF0MltpXVtrXVttXVsxXSArPSBmcy0+cmNfc3RhdDJbaV1ba11bbV1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihwLCBlbmQgLSBwLCAiJSIgUFJJdTY0ICIgJSIgUFJJdTY0ICIgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGYtPnJjX3N0YXRbal1bMF0sIGYtPnJjX3N0YXRbal1bMV0pOworICAgICAgICAgICAgICAgIHAgKz0gc3RybGVuKHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc25wcmludGYocCwgZW5kIC0gcCwgIlxuIik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmLT5xdWFudF90YWJsZV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGYtPmNvbnRleHRfY291bnRbaV07IGorKykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IDMyOyBtKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHAsIGVuZCAtIHAsICIlIiBQUkl1NjQgIiAlIiBQUkl1NjQgIiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5yY19zdGF0MltpXVtqXVttXVswXSwgZi0+cmNfc3RhdDJbaV1bal1bbV1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBzdHJsZW4ocCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNucHJpbnRmKHAsIGVuZCAtIHAsICIlZFxuIiwgZi0+Z29iX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZi0+dmVyc2lvbiA+IDMpCisgICAgICAgIG1heHNpemUgPSBGRl9NSU5fQlVGRkVSX1NJWkUgKyBhdmN0eC0+d2lkdGgqYXZjdHgtPmhlaWdodCozTEwqNDsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBtYXhzaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZmZfaW5pdF9yYW5nZV9lbmNvZGVyKGMsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICBmZl9idWlsZF9yYWNfc3RhdGVzKGMsIDAuMDUgKiAoMUxMIDw8IDMyKSwgMjU2IC0gOCk7CisKKyAgICBhdl9mcmFtZV91bnJlZihwKTsKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihwLCBwaWN0KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICBpZiAoYXZjdHgtPmdvcF9zaXplID09IDAgfHwgZi0+cGljdHVyZV9udW1iZXIgJSBhdmN0eC0+Z29wX3NpemUgPT0gMCkgeworICAgICAgICBwdXRfcmFjKGMsICZrZXlzdGF0ZSwgMSk7CisgICAgICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICAgICAgZi0+Z29iX2NvdW50Kys7CisgICAgICAgIHdyaXRlX2hlYWRlcihmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXRfcmFjKGMsICZrZXlzdGF0ZSwgMCk7CisgICAgICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAoZi0+YWMgPiAxKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICAgIGMtPm9uZV9zdGF0ZVtpXSAgICAgICAgPSBmLT5zdGF0ZV90cmFuc2l0aW9uW2ldOworICAgICAgICAgICAgYy0+emVyb19zdGF0ZVsyNTYgLSBpXSA9IDI1NiAtIGMtPm9uZV9zdGF0ZVtpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDE7IGkgPCBmLT5zbGljZV9jb3VudDsgaSsrKSB7CisgICAgICAgIEZGVjFDb250ZXh0ICpmcyA9IGYtPnNsaWNlX2NvbnRleHRbaV07CisgICAgICAgIHVpbnQ4X3QgKnN0YXJ0ICA9IHBrdC0+ZGF0YSArIChwa3QtPnNpemUgLSB1c2VkX2NvdW50KSAqIChpbnQ2NF90KWkgLyBmLT5zbGljZV9jb3VudDsKKyAgICAgICAgaW50IGxlbiAgICAgICAgID0gcGt0LT5zaXplIC8gZi0+c2xpY2VfY291bnQ7CisgICAgICAgIGZmX2luaXRfcmFuZ2VfZW5jb2RlcigmZnMtPmMsIHN0YXJ0LCBsZW4pOworICAgIH0KKyAgICBhdmN0eC0+ZXhlY3V0ZShhdmN0eCwgZW5jb2RlX3NsaWNlLCAmZi0+c2xpY2VfY29udGV4dFswXSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICBmLT5zbGljZV9jb3VudCwgc2l6ZW9mKHZvaWQgKikpOworCisgICAgYnVmX3AgPSBwa3QtPmRhdGE7CisgICAgZm9yIChpID0gMDsgaSA8IGYtPnNsaWNlX2NvdW50OyBpKyspIHsKKyAgICAgICAgRkZWMUNvbnRleHQgKmZzID0gZi0+c2xpY2VfY29udGV4dFtpXTsKKyAgICAgICAgaW50IGJ5dGVzOworCisgICAgICAgIGlmIChmcy0+YWMpIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdGUgPSAxMjk7CisgICAgICAgICAgICBwdXRfcmFjKCZmcy0+YywgJnN0YXRlLCAwKTsKKyAgICAgICAgICAgIGJ5dGVzID0gZmZfcmFjX3Rlcm1pbmF0ZSgmZnMtPmMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmx1c2hfcHV0X2JpdHMoJmZzLT5wYik7IC8vIEZJWE1FOiBuaWNlciBwYWRkaW5nCisgICAgICAgICAgICBieXRlcyA9IGZzLT5hY19ieXRlX2NvdW50ICsgKHB1dF9iaXRzX2NvdW50KCZmcy0+cGIpICsgNykgLyA4OworICAgICAgICB9CisgICAgICAgIGlmIChpID4gMCB8fCBmLT52ZXJzaW9uID4gMikgeworICAgICAgICAgICAgYXZfYXNzZXJ0MChieXRlcyA8IHBrdC0+c2l6ZSAvIGYtPnNsaWNlX2NvdW50KTsKKyAgICAgICAgICAgIG1lbW1vdmUoYnVmX3AsIGZzLT5jLmJ5dGVzdHJlYW1fc3RhcnQsIGJ5dGVzKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoYnl0ZXMgPCAoMSA8PCAyNCkpOworICAgICAgICAgICAgQVZfV0IyNChidWZfcCArIGJ5dGVzLCBieXRlcyk7CisgICAgICAgICAgICBieXRlcyArPSAzOworICAgICAgICB9CisgICAgICAgIGlmIChmLT5lYykgeworICAgICAgICAgICAgdW5zaWduZWQgdjsKKyAgICAgICAgICAgIGJ1Zl9wW2J5dGVzKytdID0gMDsKKyAgICAgICAgICAgIHYgPSBhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMzJfSUVFRSksIDAsIGJ1Zl9wLCBieXRlcyk7CisgICAgICAgICAgICBBVl9XTDMyKGJ1Zl9wICsgYnl0ZXMsIHYpOworICAgICAgICAgICAgYnl0ZXMgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBidWZfcCArPSBieXRlczsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19QQVNTMSkKKyAgICAgICAgYXZjdHgtPnN0YXRzX291dFswXSA9ICdcMCc7CisKKyAgICBmLT5waWN0dXJlX251bWJlcisrOworICAgIHBrdC0+c2l6ZSAgID0gYnVmX3AgLSBwa3QtPmRhdGE7CisgICAgcGt0LT5wdHMgICAgPQorICAgIHBrdC0+ZHRzICAgID0gcGljdC0+cHRzOworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZICogYXZjdHgtPmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWU7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisgICAgZmZ2MV9jbG9zZShhdmN0eCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZGVjFDb250ZXh0LCB4KQorI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInNsaWNlY3JjIiwgIlByb3RlY3Qgc2xpY2VzIHdpdGggQ1JDcyIsIE9GRlNFVChlYyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIFZFIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGZmdjFfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZmZ2MSBlbmNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjRGVmYXVsdCBmZnYxX2RlZmF1bHRzW10gPSB7CisgICAgeyAiY29kZXIiLCAiLTEiIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkNvZGVjIGZmX2ZmdjFfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZmZ2MSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZGbXBlZyB2aWRlbyBjb2RlYyAjMSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9GRlYxLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRlYxQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGVuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUyB8IENPREVDX0NBUF9ERUxBWSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsICBBVl9QSVhfRk1UX1lVVkE0MjJQLCAgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCAgQVZfUElYX0ZNVF9ZVVY0NDBQLCAgIEFWX1BJWF9GTVRfWVVWNDIyUCwgICBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgICBBVl9QSVhfRk1UXzBSR0IzMiwgICAgQVZfUElYX0ZNVF9SR0IzMiwgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxNiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsIEFWX1BJWF9GTVRfWVVWNDQ0UDksICBBVl9QSVhfRk1UX1lVVjQyMlA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFA5LCAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2LCBBVl9QSVhfRk1UX1lVVkE0MjJQMTYsIEFWX1BJWF9GTVRfWVVWQTQyMFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTAsIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0MjBQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZMTYsICAgIEFWX1BJWF9GTVRfR1JBWTgsICAgICBBVl9QSVhfRk1UX0dCUlA5LCAgICAgQVZfUElYX0ZNVF9HQlJQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyLCAgICBBVl9QSVhfRk1UX0dCUlAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisKKyAgICB9LAorICAgIC5kZWZhdWx0cyAgICAgICA9IGZmdjFfZGVmYXVsdHMsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmZmdjFfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmZ3YXZlc3ludGguYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Zmd2F2ZXN5bnRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1MDMxYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Zmd2F2ZXN5bnRoLmMKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiBXYXZlc3ludGggcHNldWRvLWNvZGVjCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKworI2RlZmluZSBTSU5fQklUUyAxNAorI2RlZmluZSBXU19NQVhfQ0hBTk5FTFMgMzIKKyNkZWZpbmUgSU5GX1RTIDB4N0ZGRkZGRkZGRkZGRkZGRgorCisjZGVmaW5lIFBJTktfVU5JVCAxMjgKKworLyoKKyAgIEZvcm1hdCBvZiB0aGUgZXh0cmFkYXRhIGFuZCBwYWNrZXRzCisKKyAgIFRISVMgSU5GT1JNQVRJT04gSVMgTk9UIFBBUlQgT0YgVEhFIFBVQkxJQyBBUEkgT1IgQUJJLgorICAgSVQgQ0FOIENIQU5HRSBXSVRIT1VUIE5PVElGSUNBVElPTi4KKworICAgQWxsIG51bWJlcnMgYXJlIGluIGxpdHRsZSBlbmRpYW4uCisKKyAgIFRoZSBjb2RlYyBleHRyYWRhdGEgZGVmaW5lIGEgc2V0IG9mIGludGVydmFscyB3aXRoIHVuaWZvcm0gY29udGVudC4KKyAgIE92ZXJsYXBwaW5nIGludGVydmFscyBhcmUgYWRkZWQgdG9nZXRoZXIuCisKKyAgIGV4dHJhZGF0YToKKyAgICAgICB1aW50MzIgICAgICBudW1iZXIgb2YgaW50ZXJ2YWxzCisgICAgICAgLi4uICAgICAgICAgaW50ZXJ2YWxzCisKKyAgIGludGVydmFsOgorICAgICAgIGludDY0ICAgICAgIHN0YXJ0IHRpbWVzdGFtcDsgdGltZV9iYXNlIG11c3QgYmUgMS9zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICBzdGFydCB0aW1lc3RhbXBzIG11c3QgYmUgaW4gYXNjZW5kaW5nIG9yZGVyCisgICAgICAgaW50NjQgICAgICAgZW5kIHRpbWVzdGFtcAorICAgICAgIHVpbnQzMiAgICAgIHR5cGUKKyAgICAgICB1aW50MzIgICAgICBjaGFubmVscyBtYXNrCisgICAgICAgLi4uICAgICAgICAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgZGVwZW5kcyBvbiB0eXBlCisKKyAgIHNpbmUgaW50ZXJ2YWwgKHR5cGUgZm91cmNjICJTSU5FIik6CisgICAgICAgaW50MzIgICAgICAgc3RhcnQgZnJlcXVlbmN5LCBpbiAxLygxPDwxNikgSHoKKyAgICAgICBpbnQzMiAgICAgICBlbmQgZnJlcXVlbmN5CisgICAgICAgaW50MzIgICAgICAgc3RhcnQgYW1wbGl0dWRlLCAxPDwxNiBpcyB0aGUgZnVsbCBhbXBsaXR1ZGUKKyAgICAgICBpbnQzMiAgICAgICBlbmQgYW1wbGl0dWRlCisgICAgICAgdWludDMyICAgICAgc3RhcnQgcGhhc2UsIDAgaXMgc2luKDApLCAweDIwMDAwMDAwIGlzIHNpbihwaS8yKSwgZXRjLjsKKyAgICAgICAgICAgICAgICAgICBuIHwgKDE8PDMxKSBtZWFucyB0byBtYXRjaCB0aGUgcGhhc2Ugb2YgcHJldmlvdXMgY2hhbm5lbCAjbgorCisgICBwaW5rIG5vaXNlIGludGVydmFsICh0eXBlIGZvdXJjYyAiTk9JUyIpOgorICAgICAgIGludDMyICAgICAgIHN0YXJ0IGFtcGxpdHVkZQorICAgICAgIGludDMyICAgICAgIGVuZCBhbXBsaXR1ZGUKKworICAgVGhlIGlucHV0IHBhY2tldHMgZW5jb2RlIHRoZSB0aW1lIGFuZCBkdXJhdGlvbiBvZiB0aGUgcmVxdWVzdGVkIHNlZ21lbnQuCisKKyAgIHBhY2tldDoKKyAgICAgICBpbnQ2NCAgICAgICBzdGFydCB0aW1lc3RhbXAKKyAgICAgICBpbnQzMiAgICAgICBkdXJhdGlvbgorCisqLworCitlbnVtIHdzX2ludGVydmFsX3R5cGUgeworICAgIFdTX1NJTkUgID0gTUtUQUcoJ1MnLCdJJywnTicsJ0UnKSwKKyAgICBXU19OT0lTRSA9IE1LVEFHKCdOJywnTycsJ0knLCdTJyksCit9OworCitzdHJ1Y3Qgd3NfaW50ZXJ2YWwgeworICAgIGludDY0X3QgdHNfc3RhcnQsIHRzX2VuZDsKKyAgICB1aW50NjRfdCBwaGkwLCBkcGhpMCwgZGRwaGk7CisgICAgdWludDY0X3QgYW1wMCwgZGFtcDsKKyAgICB1aW50NjRfdCBwaGksIGRwaGksIGFtcDsKKyAgICB1aW50MzJfdCBjaGFubmVsczsKKyAgICBlbnVtIHdzX2ludGVydmFsX3R5cGUgdHlwZTsKKyAgICBpbnQgbmV4dDsKK307CisKK3N0cnVjdCB3YXZlc3ludGhfY29udGV4dCB7CisgICAgaW50NjRfdCBjdXJfdHM7CisgICAgaW50NjRfdCBuZXh0X3RzOworICAgIGludDMyX3QgKnNpbjsKKyAgICBzdHJ1Y3Qgd3NfaW50ZXJ2YWwgKmludGVyOworICAgIHVpbnQzMl90IGRpdGhlcl9zdGF0ZTsKKyAgICB1aW50MzJfdCBwaW5rX3N0YXRlOworICAgIGludDMyX3QgcGlua19wb29sW1BJTktfVU5JVF07CisgICAgdW5zaWduZWQgcGlua19uZWVkLCBwaW5rX3BvczsKKyAgICBpbnQgbmJfaW50ZXI7CisgICAgaW50IGN1cl9pbnRlcjsKKyAgICBpbnQgbmV4dF9pbnRlcjsKK307CisKKyNkZWZpbmUgTENHX0EgMTI4NDg2NTgzNworI2RlZmluZSBMQ0dfQyA0MTUwNzU1NjYzCisjZGVmaW5lIExDR19BSSA4NDkyMjU4OTMgLyogQSpBSSA9IDEgW21vZCAxPDwzMl0gKi8KKworc3RhdGljIHVpbnQzMl90IGxjZ19uZXh0KHVpbnQzMl90ICpzKQoreworICAgICpzID0gKnMgKiBMQ0dfQSArIExDR19DOworICAgIHJldHVybiAqczsKK30KKworc3RhdGljIHZvaWQgbGNnX3NlZWsodWludDMyX3QgKnMsIGludDY0X3QgZHQpCit7CisgICAgdWludDMyX3QgYSwgYywgdCA9ICpzOworCisgICAgaWYgKGR0ID49IDApIHsKKyAgICAgICAgYSA9IExDR19BOworICAgICAgICBjID0gTENHX0M7CisgICAgfSBlbHNlIHsgLyogY29lZmZpY2llbnRzIGZvciBhIHN0ZXAgYmFja3dhcmQgKi8KKyAgICAgICAgYSA9IExDR19BSTsKKyAgICAgICAgYyA9ICh1aW50MzJfdCkoTENHX0FJICogTENHX0MpOworICAgICAgICBkdCA9IC1kdDsKKyAgICB9CisgICAgd2hpbGUgKGR0KSB7CisgICAgICAgIGlmIChkdCAmIDEpCisgICAgICAgICAgICB0ID0gYSAqIHQgKyBjOworICAgICAgICBjICo9IGEgKyAxOyAvKiBjb2VmZmljaWVudHMgZm9yIGEgZG91YmxlIHN0ZXAgKi8KKyAgICAgICAgYSAqPSBhOworICAgICAgICBkdCA+Pj0gMTsKKyAgICB9CisgICAgKnMgPSB0OworfQorCisvKiBFbXVsYXRlIHBpbmsgbm9pc2UgYnkgc3VtbWluZyB3aGl0ZSBub2lzZSBhdCB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5LAorICogd2hpdGUgbm9pc2UgYXQgaGFsZiB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5IChlYWNoIHZhbHVlIHRha2VuIHR3aWNlKSwKKyAqIGV0Yy4sIHdpdGggYSB0b3RhbCBvZiA4IG9jdGF2ZXMuCisgKiBUaGlzIGlzIGtub3duIGFzIHRoZSBWb3NzLU1jQ2FydG5leSBhbGdvcml0aG0uICovCisKK3N0YXRpYyB2b2lkIHBpbmtfZmlsbChzdHJ1Y3Qgd2F2ZXN5bnRoX2NvbnRleHQgKndzKQoreworICAgIGludDMyX3QgdnRbN10gPSB7IDAgfSwgdiA9IDA7CisgICAgaW50IGksIGo7CisKKyAgICB3cy0+cGlua19wb3MgPSAwOworICAgIGlmICghd3MtPnBpbmtfbmVlZCkKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAoaSA9IDA7IGkgPCBQSU5LX1VOSVQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNzsgaisrKSB7CisgICAgICAgICAgICBpZiAoKGkgPj4gaikgJiAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdiAtPSB2dFtqXTsKKyAgICAgICAgICAgIHZ0W2pdID0gKGludDMyX3QpbGNnX25leHQoJndzLT5waW5rX3N0YXRlKSA+PiAzOworICAgICAgICAgICAgdiArPSB2dFtqXTsKKyAgICAgICAgfQorICAgICAgICB3cy0+cGlua19wb29sW2ldID0gdiArICgoaW50MzJfdClsY2dfbmV4dCgmd3MtPnBpbmtfc3RhdGUpID4+IDMpOworICAgIH0KKyAgICBsY2dfbmV4dCgmd3MtPnBpbmtfc3RhdGUpOyAvKiBzbyB3ZSB1c2UgZXhhY3RseSAyNTYgc3RlcHMgKi8KK30KKworLyoqCisgKiBAcmV0dXJuICAoMTw8NjQpICogYSAvIGIsIHdpdGhvdXQgb3ZlcmZsb3csIGlmIGEgPCBiCisgKi8KK3N0YXRpYyB1aW50NjRfdCBmcmFjNjQodWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyAgICB1aW50NjRfdCByID0gMDsKKyAgICBpbnQgaTsKKworICAgIGlmIChiIDwgKHVpbnQ2NF90KTEgPDwgMzIpIHsgLyogYiBzbWFsbCwgdXNlIHR3byAzMi1iaXRzIHN0ZXBzICovCisgICAgICAgIGEgPDw9IDMyOworICAgICAgICByZXR1cm4gKChhIC8gYikgPDwgMzIpIHwgKChhICUgYikgPDwgMzIpIC8gYjsKKyAgICB9CisgICAgaWYgKGIgPCAodWludDY0X3QpMSA8PCA0OCkgeyAvKiBiIG1lZGl1bSwgdXNlIGZvdXIgMTYtYml0cyBzdGVwcyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBhIDw8PSAxNjsKKyAgICAgICAgICAgIHIgPSAociA8PCAxNikgfCAoYSAvIGIpOworICAgICAgICAgICAgYSAlPSBiOworICAgICAgICB9CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBmb3IgKGkgPSA2MzsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaWYgKGEgPj0gKHVpbnQ2NF90KTEgPDwgNjMgfHwgYSA8PCAxID49IGIpIHsKKyAgICAgICAgICAgIHIgfD0gKHVpbnQ2NF90KTEgPDwgaTsKKyAgICAgICAgICAgIGEgPSAoYSA8PCAxKSAtIGI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhIDw8PSAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByOworfQorCitzdGF0aWMgdWludDY0X3QgcGhpX2F0KHN0cnVjdCB3c19pbnRlcnZhbCAqaW4sIGludDY0X3QgdHMpCit7CisgICAgdWludDY0X3QgZHQgPSB0cyAtIGluLT50c19zdGFydDsKKyAgICB1aW50NjRfdCBkdDIgPSBkdCAmIDEgPyAvKiBkdCAqIChkdCAtIDEpIC8gMiB3aXRob3V0IG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgICAgZHQgKiAoKGR0IC0gMSkgPj4gMSkgOiAoZHQgPj4gMSkgKiAoZHQgLSAxKTsKKyAgICByZXR1cm4gaW4tPnBoaTAgKyBkdCAqIGluLT5kcGhpMCArIGR0MiAqIGluLT5kZHBoaTsKK30KKworc3RhdGljIHZvaWQgd2F2ZXN5bnRoX3NlZWsoc3RydWN0IHdhdmVzeW50aF9jb250ZXh0ICp3cywgaW50NjRfdCB0cykKK3sKKyAgICBpbnQgKmxhc3QsIGk7CisgICAgc3RydWN0IHdzX2ludGVydmFsICppbjsKKworICAgIGxhc3QgPSAmd3MtPmN1cl9pbnRlcjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd3MtPm5iX2ludGVyOyBpKyspIHsKKyAgICAgICAgaW4gPSAmd3MtPmludGVyW2ldOworICAgICAgICBpZiAodHMgPCBpbi0+dHNfc3RhcnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHRzID49IGluLT50c19lbmQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgKmxhc3QgPSBpOworICAgICAgICBsYXN0ID0gJmluLT5uZXh0OworICAgICAgICBpbi0+cGhpICA9IHBoaV9hdChpbiwgdHMpOworICAgICAgICBpbi0+ZHBoaSA9IGluLT5kcGhpMCArICh0cyAtIGluLT50c19zdGFydCkgKiBpbi0+ZGRwaGk7CisgICAgICAgIGluLT5hbXAgID0gaW4tPmFtcDAgICsgKHRzIC0gaW4tPnRzX3N0YXJ0KSAqIGluLT5kYW1wOworICAgIH0KKyAgICB3cy0+bmV4dF9pbnRlciA9IGk7CisgICAgd3MtPm5leHRfdHMgPSBpIDwgd3MtPm5iX2ludGVyID8gd3MtPmludGVyW2ldLnRzX3N0YXJ0IDogSU5GX1RTOworICAgICpsYXN0ID0gLTE7CisgICAgbGNnX3NlZWsoJndzLT5kaXRoZXJfc3RhdGUsIHRzIC0gd3MtPmN1cl90cyk7CisgICAgaWYgKHdzLT5waW5rX25lZWQpIHsKKyAgICAgICAgaW50NjRfdCBwaW5rX3RzX2N1ciAgPSAod3MtPmN1cl90cyArIFBJTktfVU5JVCAtIDEpICYgfihQSU5LX1VOSVQgLSAxKTsKKyAgICAgICAgaW50NjRfdCBwaW5rX3RzX25leHQgPSB0cyAmIH4oUElOS19VTklUIC0gMSk7CisgICAgICAgIGludCBwb3MgPSB0cyAmIChQSU5LX1VOSVQgLSAxKTsKKyAgICAgICAgbGNnX3NlZWsoJndzLT5waW5rX3N0YXRlLCAocGlua190c19uZXh0IC0gcGlua190c19jdXIpIDw8IDEpOworICAgICAgICBpZiAocG9zKSB7CisgICAgICAgICAgICBwaW5rX2ZpbGwod3MpOworICAgICAgICAgICAgd3MtPnBpbmtfcG9zID0gcG9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3MtPnBpbmtfcG9zID0gUElOS19VTklUOworICAgICAgICB9CisgICAgfQorICAgIHdzLT5jdXJfdHMgPSB0czsKK30KKworc3RhdGljIGludCB3YXZlc3ludGhfcGFyc2VfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmMpCit7CisgICAgc3RydWN0IHdhdmVzeW50aF9jb250ZXh0ICp3cyA9IGF2Yy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCB3c19pbnRlcnZhbCAqaW47CisgICAgdWludDhfdCAqZWRhdGEsICplZGF0YV9lbmQ7CisgICAgaW50MzJfdCBmMSwgZjIsIGExLCBhMjsKKyAgICB1aW50MzJfdCBwaGk7CisgICAgaW50NjRfdCBkcGhpMSwgZHBoaTIsIGR0LCBjdXJfdHMgPSAtMHg4MDAwMDAwMDAwMDAwMDAwOworICAgIGludCBpOworCisgICAgaWYgKGF2Yy0+ZXh0cmFkYXRhX3NpemUgPCA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGVkYXRhID0gYXZjLT5leHRyYWRhdGE7CisgICAgZWRhdGFfZW5kID0gZWRhdGEgKyBhdmMtPmV4dHJhZGF0YV9zaXplOworICAgIHdzLT5uYl9pbnRlciA9IEFWX1JMMzIoZWRhdGEpOworICAgIGVkYXRhICs9IDQ7CisgICAgaWYgKHdzLT5uYl9pbnRlciA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgd3MtPmludGVyID0gYXZfY2FsbG9jKHdzLT5uYl9pbnRlciwgc2l6ZW9mKCp3cy0+aW50ZXIpKTsKKyAgICBpZiAoIXdzLT5pbnRlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd3MtPm5iX2ludGVyOyBpKyspIHsKKyAgICAgICAgaW4gPSAmd3MtPmludGVyW2ldOworICAgICAgICBpZiAoZWRhdGFfZW5kIC0gZWRhdGEgPCAyNCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGluLT50c19zdGFydCA9IEFWX1JMNjQoZWRhdGEgKyAgMCk7CisgICAgICAgIGluLT50c19lbmQgICA9IEFWX1JMNjQoZWRhdGEgKyAgOCk7CisgICAgICAgIGluLT50eXBlICAgICA9IEFWX1JMMzIoZWRhdGEgKyAxNik7CisgICAgICAgIGluLT5jaGFubmVscyA9IEFWX1JMMzIoZWRhdGEgKyAyMCk7CisgICAgICAgIGVkYXRhICs9IDI0OworICAgICAgICBpZiAoaW4tPnRzX3N0YXJ0IDwgY3VyX3RzIHx8IGluLT50c19lbmQgPD0gaW4tPnRzX3N0YXJ0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgY3VyX3RzID0gaW4tPnRzX3N0YXJ0OworICAgICAgICBkdCA9IGluLT50c19lbmQgLSBpbi0+dHNfc3RhcnQ7CisgICAgICAgIHN3aXRjaCAoaW4tPnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgV1NfU0lORToKKyAgICAgICAgICAgICAgICBpZiAoZWRhdGFfZW5kIC0gZWRhdGEgPCAyMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBmMSAgPSBBVl9STDMyKGVkYXRhICsgIDApOworICAgICAgICAgICAgICAgIGYyICA9IEFWX1JMMzIoZWRhdGEgKyAgNCk7CisgICAgICAgICAgICAgICAgYTEgID0gQVZfUkwzMihlZGF0YSArICA4KTsKKyAgICAgICAgICAgICAgICBhMiAgPSBBVl9STDMyKGVkYXRhICsgMTIpOworICAgICAgICAgICAgICAgIHBoaSA9IEFWX1JMMzIoZWRhdGEgKyAxNik7CisgICAgICAgICAgICAgICAgZWRhdGEgKz0gMjA7CisgICAgICAgICAgICAgICAgZHBoaTEgPSBmcmFjNjQoZjEsIChpbnQ2NF90KWF2Yy0+c2FtcGxlX3JhdGUgPDwgMTYpOworICAgICAgICAgICAgICAgIGRwaGkyID0gZnJhYzY0KGYyLCAoaW50NjRfdClhdmMtPnNhbXBsZV9yYXRlIDw8IDE2KTsKKyAgICAgICAgICAgICAgICBpbi0+ZHBoaTAgPSBkcGhpMTsKKyAgICAgICAgICAgICAgICBpbi0+ZGRwaGkgPSAoZHBoaTIgLSBkcGhpMSkgLyBkdDsKKyAgICAgICAgICAgICAgICBpZiAocGhpICYgMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICAgICBwaGkgJj0gfjB4ODAwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaGkgPj0gaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgICAgIGluLT5waGkwID0gcGhpX2F0KCZ3cy0+aW50ZXJbcGhpXSwgaW4tPnRzX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbi0+cGhpMCA9ICh1aW50NjRfdClwaGkgPDwgMzM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXU19OT0lTRToKKyAgICAgICAgICAgICAgICBpZiAoZWRhdGFfZW5kIC0gZWRhdGEgPCA4KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGExICA9IEFWX1JMMzIoZWRhdGEgKyAgMCk7CisgICAgICAgICAgICAgICAgYTIgID0gQVZfUkwzMihlZGF0YSArICA0KTsKKyAgICAgICAgICAgICAgICBlZGF0YSArPSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGluLT5hbXAwID0gKGludDY0X3QpYTEgPDwgMzI7CisgICAgICAgIGluLT5kYW1wID0gKCgoaW50NjRfdClhMiA8PCAzMikgLSAoKGludDY0X3QpYTEgPDwgMzIpKSAvIGR0OworICAgIH0KKyAgICBpZiAoZWRhdGEgIT0gZWRhdGFfZW5kKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgd2F2ZXN5bnRoX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2YykKK3sKKyAgICBzdHJ1Y3Qgd2F2ZXN5bnRoX2NvbnRleHQgKndzID0gYXZjLT5wcml2X2RhdGE7CisgICAgaW50IGksIHI7CisKKyAgICBpZiAoYXZjLT5jaGFubmVscyA+IFdTX01BWF9DSEFOTkVMUykgeworICAgICAgICBhdl9sb2coYXZjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBsaW1pdGVkIHRvICVkIGNoYW5uZWxzLlxuIiwKKyAgICAgICAgICAgICAgIFdTX01BWF9DSEFOTkVMUyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHIgPSB3YXZlc3ludGhfcGFyc2VfZXh0cmFkYXRhKGF2Yyk7CisgICAgaWYgKHIgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgaW50ZXJ2YWxzIGRlZmluaXRpb25zLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgd3MtPnNpbiA9IGF2X21hbGxvYyhzaXplb2YoKndzLT5zaW4pIDw8IFNJTl9CSVRTKTsKKyAgICBpZiAoIXdzLT5zaW4pIHsKKyAgICAgICAgciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMSA8PCBTSU5fQklUUzsgaSsrKQorICAgICAgICB3cy0+c2luW2ldID0gZmxvb3IoMzI3NjcgKiBzaW4oMiAqIE1fUEkgKiBpIC8gKDEgPDwgU0lOX0JJVFMpKSk7CisgICAgd3MtPmRpdGhlcl9zdGF0ZSA9IE1LVEFHKCdEJywnSScsJ1QnLCdIJyk7CisgICAgZm9yIChpID0gMDsgaSA8IHdzLT5uYl9pbnRlcjsgaSsrKQorICAgICAgICB3cy0+cGlua19uZWVkICs9IHdzLT5pbnRlcltpXS50eXBlID09IFdTX05PSVNFOworICAgIHdzLT5waW5rX3N0YXRlID0gTUtUQUcoJ1AnLCdJJywnTicsJ0snKTsKKyAgICB3cy0+cGlua19wb3MgPSBQSU5LX1VOSVQ7CisgICAgd2F2ZXN5bnRoX3NlZWsod3MsIDApOworICAgIGF2Yy0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzE2OworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2ZyZWUod3MtPmludGVyKTsKKyAgICBhdl9mcmVlKHdzLT5zaW4pOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgdm9pZCB3YXZlc3ludGhfc3ludGhfc2FtcGxlKHN0cnVjdCB3YXZlc3ludGhfY29udGV4dCAqd3MsIGludDY0X3QgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmNoYW5uZWxzKQoreworICAgIGludDMyX3QgYW1wLCB2YWwsICpjdjsKKyAgICBzdHJ1Y3Qgd3NfaW50ZXJ2YWwgKmluOworICAgIGludCBpLCAqbGFzdCwgcGluazsKKyAgICB1aW50MzJfdCBjLCBhbGxfY2ggPSAwOworCisgICAgaSA9IHdzLT5jdXJfaW50ZXI7CisgICAgbGFzdCA9ICZ3cy0+Y3VyX2ludGVyOworICAgIGlmICh3cy0+cGlua19wb3MgPT0gUElOS19VTklUKQorICAgICAgICBwaW5rX2ZpbGwod3MpOworICAgIHBpbmsgPSB3cy0+cGlua19wb29sW3dzLT5waW5rX3BvcysrXSA+PiAxNjsKKyAgICB3aGlsZSAoaSA+PSAwKSB7CisgICAgICAgIGluID0gJndzLT5pbnRlcltpXTsKKyAgICAgICAgaSA9IGluLT5uZXh0OworICAgICAgICBpZiAodHMgPj0gaW4tPnRzX2VuZCkgeworICAgICAgICAgICAgKmxhc3QgPSBpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbGFzdCA9ICZpbi0+bmV4dDsKKyAgICAgICAgYW1wID0gaW4tPmFtcCA+PiAzMjsKKyAgICAgICAgaW4tPmFtcCAgKz0gaW4tPmRhbXA7CisgICAgICAgIHN3aXRjaCAoaW4tPnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgV1NfU0lORToKKyAgICAgICAgICAgICAgICB2YWwgPSBhbXAgKiB3cy0+c2luW2luLT5waGkgPj4gKDY0IC0gU0lOX0JJVFMpXTsKKyAgICAgICAgICAgICAgICBpbi0+cGhpICArPSBpbi0+ZHBoaTsKKyAgICAgICAgICAgICAgICBpbi0+ZHBoaSArPSBpbi0+ZGRwaGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFdTX05PSVNFOgorICAgICAgICAgICAgICAgIHZhbCA9IGFtcCAqIHBpbms7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHZhbCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYWxsX2NoIHw9IGluLT5jaGFubmVsczsKKyAgICAgICAgZm9yIChjID0gaW4tPmNoYW5uZWxzLCBjdiA9IGNoYW5uZWxzOyBjOyBjID4+PSAxLCBjdisrKQorICAgICAgICAgICAgaWYgKGMgJiAxKQorICAgICAgICAgICAgICAgICpjdiArPSB2YWw7CisgICAgfQorICAgIHZhbCA9IChpbnQzMl90KWxjZ19uZXh0KCZ3cy0+ZGl0aGVyX3N0YXRlKSA+PiAxNjsKKyAgICBmb3IgKGMgPSBhbGxfY2gsIGN2ID0gY2hhbm5lbHM7IGM7IGMgPj49IDEsIGN2KyspCisgICAgICAgIGlmIChjICYgMSkKKyAgICAgICAgICAgICpjdiArPSB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHdhdmVzeW50aF9lbnRlcl9pbnRlcnZhbHMoc3RydWN0IHdhdmVzeW50aF9jb250ZXh0ICp3cywgaW50NjRfdCB0cykKK3sKKyAgICBpbnQgKmxhc3QsIGk7CisgICAgc3RydWN0IHdzX2ludGVydmFsICppbjsKKworICAgIGxhc3QgPSAmd3MtPmN1cl9pbnRlcjsKKyAgICBmb3IgKGkgPSB3cy0+Y3VyX2ludGVyOyBpID49IDA7IGkgPSB3cy0+aW50ZXJbaV0ubmV4dCkKKyAgICAgICAgbGFzdCA9ICZ3cy0+aW50ZXJbaV0ubmV4dDsKKyAgICBmb3IgKGkgPSB3cy0+bmV4dF9pbnRlcjsgaSA8IHdzLT5uYl9pbnRlcjsgaSsrKSB7CisgICAgICAgIGluID0gJndzLT5pbnRlcltpXTsKKyAgICAgICAgaWYgKHRzIDwgaW4tPnRzX3N0YXJ0KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmICh0cyA+PSBpbi0+dHNfZW5kKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICpsYXN0ID0gaTsKKyAgICAgICAgbGFzdCA9ICZpbi0+bmV4dDsKKyAgICAgICAgaW4tPnBoaSA9IGluLT5waGkwOworICAgICAgICBpbi0+ZHBoaSA9IGluLT5kcGhpMDsKKyAgICAgICAgaW4tPmFtcCA9IGluLT5hbXAwOworICAgIH0KKyAgICB3cy0+bmV4dF9pbnRlciA9IGk7CisgICAgd3MtPm5leHRfdHMgPSBpIDwgd3MtPm5iX2ludGVyID8gd3MtPmludGVyW2ldLnRzX3N0YXJ0IDogSU5GX1RTOworICAgICpsYXN0ID0gLTE7Cit9CisKK3N0YXRpYyBpbnQgd2F2ZXN5bnRoX2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjLCB2b2lkICpyZnJhbWUsIGludCAqcmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGFja2V0KQoreworICAgIHN0cnVjdCB3YXZlc3ludGhfY29udGV4dCAqd3MgPSBhdmMtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSA9IHJmcmFtZTsKKyAgICBpbnQ2NF90IHRzOworICAgIGludCBkdXJhdGlvbjsKKyAgICBpbnQgcywgYywgcjsKKyAgICBpbnQxNl90ICpwY207CisgICAgaW50MzJfdCBjaGFubmVsc1tXU19NQVhfQ0hBTk5FTFNdOworCisgICAgKnJnb3RfZnJhbWUgPSAwOworICAgIGlmIChwYWNrZXQtPnNpemUgIT0gMTIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHRzID0gQVZfUkw2NChwYWNrZXQtPmRhdGEpOworICAgIGlmICh0cyAhPSB3cy0+Y3VyX3RzKQorICAgICAgICB3YXZlc3ludGhfc2Vlayh3cywgdHMpOworICAgIGR1cmF0aW9uID0gQVZfUkwzMihwYWNrZXQtPmRhdGEgKyA4KTsKKyAgICBpZiAoZHVyYXRpb24gPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IGR1cmF0aW9uOworICAgIHIgPSBmZl9nZXRfYnVmZmVyKGF2YywgZnJhbWUsIDApOworICAgIGlmIChyIDwgMCkKKyAgICAgICAgcmV0dXJuIHI7CisgICAgcGNtID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKyAgICBmb3IgKHMgPSAwOyBzIDwgZHVyYXRpb247IHMrKywgdHMrKykgeworICAgICAgICBtZW1zZXQoY2hhbm5lbHMsIDAsIGF2Yy0+Y2hhbm5lbHMgKiBzaXplb2YoKmNoYW5uZWxzKSk7CisgICAgICAgIGlmICh0cyA+PSB3cy0+bmV4dF90cykKKyAgICAgICAgICAgIHdhdmVzeW50aF9lbnRlcl9pbnRlcnZhbHMod3MsIHRzKTsKKyAgICAgICAgd2F2ZXN5bnRoX3N5bnRoX3NhbXBsZSh3cywgdHMsIGNoYW5uZWxzKTsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGF2Yy0+Y2hhbm5lbHM7IGMrKykKKyAgICAgICAgICAgICoocGNtKyspID0gY2hhbm5lbHNbY10gPj4gMTY7CisgICAgfQorICAgIHdzLT5jdXJfdHMgKz0gZHVyYXRpb247CisgICAgKnJnb3RfZnJhbWUgPSAxOworICAgIHJldHVybiBwYWNrZXQtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB3YXZlc3ludGhfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2YykKK3sKKyAgICBzdHJ1Y3Qgd2F2ZXN5bnRoX2NvbnRleHQgKndzID0gYXZjLT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlKHdzLT5zaW4pOworICAgIGF2X2ZyZWUod3MtPmludGVyKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9mZndhdmVzeW50aF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ3YXZlc3ludGgiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXYXZlIHN5bnRoZXNpcyBwc2V1ZG8tY29kZWMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRkZXQVZFU1lOVEgsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCB3YXZlc3ludGhfY29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gd2F2ZXN5bnRoX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gd2F2ZXN5bnRoX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IHdhdmVzeW50aF9kZWNvZGUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9maWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYzhhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9maWMuYwpAQCAtMCwwICsxLDQ2NyBAQAorLyoKKyAqIE1pcmlsbGlzIEZJQyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqIENvcHlyaWdodCAoYykgMjAxNCBEZXJlayBCdWl0ZW5odWlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgRklDVGhyZWFkQ29udGV4dCB7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBibG9jaylbNjRdOworICAgIHVpbnQ4X3QgKnNyYzsKKyAgICBpbnQgc2xpY2VfaDsKKyAgICBpbnQgc3JjX3NpemU7CisgICAgaW50IHlfb2ZmOworfSBGSUNUaHJlYWRDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBGSUNDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgQVZGcmFtZSAqZmluYWxfZnJhbWU7CisKKyAgICBGSUNUaHJlYWRDb250ZXh0ICpzbGljZV9kYXRhOworICAgIGludCBzbGljZV9kYXRhX3NpemU7CisKKyAgICBjb25zdCB1aW50OF90ICpxbWF0OworCisgICAgZW51bSBBVlBpY3R1cmVUeXBlIGN1cl9mcmFtZV90eXBlOworCisgICAgaW50IGFsaWduZWRfd2lkdGgsIGFsaWduZWRfaGVpZ2h0OworICAgIGludCBudW1fc2xpY2VzLCBzbGljZV9oOworCisgICAgdWludDhfdCBjdXJzb3JfYnVmWzQwOTZdOworfSBGSUNDb250ZXh0OworCitzdGF0aWMgY29uc3QgdWludDhfdCBmaWNfcW1hdF9ocVs2NF0gPSB7CisgICAgMSwgMiwgMiwgMiwgMywgMywgMywgNCwKKyAgICAyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LAorICAgIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsCisgICAgMiwgMiwgMywgMywgMywgNCwgNCwgNSwKKyAgICAyLCAzLCAzLCAzLCA0LCA0LCA1LCA2LAorICAgIDMsIDMsIDMsIDQsIDQsIDUsIDYsIDcsCisgICAgMywgMywgMywgNCwgNCwgNSwgNywgNywKKyAgICAzLCAzLCA0LCA0LCA1LCA3LCA3LCA3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZmljX3FtYXRfbHFbNjRdID0geworICAgIDEsICA1LCAgNiwgIDcsICA4LCAgOSwgIDksIDExLAorICAgIDUsICA1LCAgNywgIDgsICA5LCAgOSwgMTEsIDEyLAorICAgIDYsICA3LCAgOCwgIDksICA5LCAxMSwgMTEsIDEyLAorICAgIDcsICA3LCAgOCwgIDksICA5LCAxMSwgMTIsIDEzLAorICAgIDcsICA4LCAgOSwgIDksIDEwLCAxMSwgMTMsIDE2LAorICAgIDgsICA5LCAgOSwgMTAsIDExLCAxMywgMTYsIDE5LAorICAgIDgsICA5LCAgOSwgMTEsIDEyLCAxNSwgMTgsIDIzLAorICAgIDksICA5LCAxMSwgMTIsIDE1LCAxOCwgMjMsIDI3Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBmaWNfaGVhZGVyWzddID0geyAwLCAwLCAxLCAnRicsICdJJywgJ0MnLCAnVicgfTsKKworI2RlZmluZSBGSUNfSEVBREVSX1NJWkUgMjcKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmaWNfaWRjdChpbnQxNl90ICpibGssIGludCBzdGVwLCBpbnQgc2hpZnQsIGludCBybmQpCit7CisgICAgY29uc3QgaW50IHQwID0gIDI3MjQ2ICogYmxrWzMgKiBzdGVwXSArIDE4NDA1ICogYmxrWzUgKiBzdGVwXTsKKyAgICBjb25zdCBpbnQgdDEgPSAgMjcyNDYgKiBibGtbNSAqIHN0ZXBdIC0gMTg0MDUgKiBibGtbMyAqIHN0ZXBdOworICAgIGNvbnN0IGludCB0MiA9ICAgNjM5MyAqIGJsa1s3ICogc3RlcF0gKyAzMjEzOSAqIGJsa1sxICogc3RlcF07CisgICAgY29uc3QgaW50IHQzID0gICA2MzkzICogYmxrWzEgKiBzdGVwXSAtIDMyMTM5ICogYmxrWzcgKiBzdGVwXTsKKyAgICBjb25zdCBpbnQgdDQgPSA1NzkzICogKHQyICsgdDAgKyAweDgwMCA+PiAxMik7CisgICAgY29uc3QgaW50IHQ1ID0gNTc5MyAqICh0MyArIHQxICsgMHg4MDAgPj4gMTIpOworICAgIGNvbnN0IGludCB0NiA9IHQyIC0gdDA7CisgICAgY29uc3QgaW50IHQ3ID0gdDMgLSB0MTsKKyAgICBjb25zdCBpbnQgdDggPSAgMTc3MzQgKiBibGtbMiAqIHN0ZXBdIC0gNDI4MTMgKiBibGtbNiAqIHN0ZXBdOworICAgIGNvbnN0IGludCB0OSA9ICAxNzczNCAqIGJsa1s2ICogc3RlcF0gKyA0MjgxNCAqIGJsa1syICogc3RlcF07CisgICAgY29uc3QgaW50IHRBID0gKGJsa1swICogc3RlcF0gLSBibGtbNCAqIHN0ZXBdIDw8IDE1KSArIHJuZDsKKyAgICBjb25zdCBpbnQgdEIgPSAoYmxrWzAgKiBzdGVwXSArIGJsa1s0ICogc3RlcF0gPDwgMTUpICsgcm5kOworICAgIGJsa1swICogc3RlcF0gPSAoICB0NCAgICAgICArIHQ5ICsgdEIpID4+IHNoaWZ0OworICAgIGJsa1sxICogc3RlcF0gPSAoICB0NiArIHQ3ICArIHQ4ICsgdEEpID4+IHNoaWZ0OworICAgIGJsa1syICogc3RlcF0gPSAoICB0NiAtIHQ3ICAtIHQ4ICsgdEEpID4+IHNoaWZ0OworICAgIGJsa1szICogc3RlcF0gPSAoICB0NSAgICAgICAtIHQ5ICsgdEIpID4+IHNoaWZ0OworICAgIGJsa1s0ICogc3RlcF0gPSAoIC10NSAgICAgICAtIHQ5ICsgdEIpID4+IHNoaWZ0OworICAgIGJsa1s1ICogc3RlcF0gPSAoLSh0NiAtIHQ3KSAtIHQ4ICsgdEEpID4+IHNoaWZ0OworICAgIGJsa1s2ICogc3RlcF0gPSAoLSh0NiArIHQ3KSArIHQ4ICsgdEEpID4+IHNoaWZ0OworICAgIGJsa1s3ICogc3RlcF0gPSAoIC10NCAgICAgICArIHQ5ICsgdEIpID4+IHNoaWZ0OworfQorCitzdGF0aWMgdm9pZCBmaWNfaWRjdF9wdXQodWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQxNl90ICpwdHI7CisKKyAgICBwdHIgPSBibG9jazsKKyAgICBmaWNfaWRjdChwdHIrKywgOCwgMTMsICgxIDw8IDEyKSArICgxIDw8IDE3KSk7CisgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworICAgICAgICBmaWNfaWRjdChwdHIsIDgsIDEzLCAxIDw8IDEyKTsKKyAgICAgICAgcHRyKys7CisgICAgfQorCisgICAgcHRyID0gYmxvY2s7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBmaWNfaWRjdChwdHIsIDEsIDIwLCAwKTsKKyAgICAgICAgcHRyICs9IDg7CisgICAgfQorCisgICAgcHRyID0gYmxvY2s7CisgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgZHN0W2ldID0gYXZfY2xpcF91aW50OChwdHJbaV0pOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICBwdHIgKz0gODsKKyAgICB9Cit9CitzdGF0aWMgaW50IGZpY19kZWNvZGVfYmxvY2soRklDQ29udGV4dCAqY3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBpLCBudW1fY29lZmY7CisKKyAgICAvKiBJcyBpdCBhIHNraXAgYmxvY2s/ICovCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgLyogVGhpcyBpcyBhIFAtZnJhbWUuICovCisgICAgICAgIGN0eC0+ZnJhbWUtPmtleV9mcmFtZSA9IDA7CisgICAgICAgIGN0eC0+ZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG1lbXNldChibG9jaywgMCwgc2l6ZW9mKCpibG9jaykgKiA2NCk7CisKKyAgICBudW1fY29lZmYgPSBnZXRfYml0cyhnYiwgNyk7CisgICAgaWYgKG51bV9jb2VmZiA+IDY0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29lZmY7IGkrKykKKyAgICAgICAgYmxvY2tbZmZfemlnemFnX2RpcmVjdFtpXV0gPSBnZXRfc2VfZ29sb21iKGdiKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5xbWF0W2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworCisgICAgZmljX2lkY3RfcHV0KGRzdCwgc3RyaWRlLCBibG9jayk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWNfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEpCit7CisgICAgRklDQ29udGV4dCAqY3R4ICAgICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgRklDVGhyZWFkQ29udGV4dCAqdGN0eCA9IHRkYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgdWludDhfdCAqc3JjID0gdGN0eC0+c3JjOworICAgIGludCBzbGljZV9oICA9IHRjdHgtPnNsaWNlX2g7CisgICAgaW50IHNyY19zaXplID0gdGN0eC0+c3JjX3NpemU7CisgICAgaW50IHlfb2ZmICAgID0gdGN0eC0+eV9vZmY7CisgICAgaW50IHgsIHksIHA7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgc3JjLCBzcmNfc2l6ZSAqIDgpOworCisgICAgZm9yIChwID0gMDsgcCA8IDM7IHArKykgeworICAgICAgICBpbnQgc3RyaWRlICAgPSBjdHgtPmZyYW1lLT5saW5lc2l6ZVtwXTsKKyAgICAgICAgdWludDhfdCogZHN0ID0gY3R4LT5mcmFtZS0+ZGF0YVtwXSArICh5X29mZiA+PiAhIXApICogc3RyaWRlOworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCAoc2xpY2VfaCA+PiAhIXApOyB5ICs9IDgpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAoY3R4LT5hbGlnbmVkX3dpZHRoID4+ICEhcCk7IHggKz0gOCkgeworICAgICAgICAgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZpY19kZWNvZGVfYmxvY2soY3R4LCAmZ2IsIGRzdCArIHgsIHN0cmlkZSwgdGN0eC0+YmxvY2spKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3QgKz0gOCAqIHN0cmlkZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZpY19hbHBoYV9ibGVuZCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCB1aW50OF90ICphbHBoYSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIGRzdFtpXSArPSAoKHNyY1tpXSAtIGRzdFtpXSkgKiBhbHBoYVtpXSkgPj4gODsKK30KKworc3RhdGljIHZvaWQgZmljX2RyYXdfY3Vyc29yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGN1cl94LCBpbnQgY3VyX3kpCit7CisgICAgRklDQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpwdHIgICAgPSBjdHgtPmN1cnNvcl9idWY7CisgICAgdWludDhfdCAqZHN0cHRyWzNdOworICAgIHVpbnQ4X3QgcGxhbmVzWzRdWzEwMjRdOworICAgIHVpbnQ4X3QgY2hyb21hWzNdWzI1Nl07CisgICAgaW50IGksIGosIHA7CisKKyAgICAvKiBDb252ZXJ0IHRvIFlVVkE0NDQuICovCisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykgeworICAgICAgICBwbGFuZXNbMF1baV0gPSAoKCAyNSAqIHB0clswXSArIDEyOSAqIHB0clsxXSArICA2NiAqIHB0clsyXSkgLyAyNTUpICsgMTY7CisgICAgICAgIHBsYW5lc1sxXVtpXSA9ICgoLTM4ICogcHRyWzBdICsgMTEyICogcHRyWzFdICsgLTc0ICogcHRyWzJdKSAvIDI1NSkgKyAxMjg7CisgICAgICAgIHBsYW5lc1syXVtpXSA9ICgoLTE4ICogcHRyWzBdICsgMTEyICogcHRyWzFdICsgLTk0ICogcHRyWzJdKSAvIDI1NSkgKyAxMjg7CisgICAgICAgIHBsYW5lc1szXVtpXSA9IHB0clszXTsKKworICAgICAgICBwdHIgKz0gNDsKKyAgICB9CisKKyAgICAvKiBTdWJzYW1wbGUgY2hyb21hLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSArPSAyKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzI7IGogKz0gMikKKyAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCAzOyBwKyspCisgICAgICAgICAgICAgICAgY2hyb21hW3BdWzE2ICogKGkgLyAyKSArIGogLyAyXSA9IChwbGFuZXNbcCArIDFdWzMyICogIGkgICAgICArIGogICAgXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZXNbcCArIDFdWzMyICogIGkgICAgICArIGogKyAxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZXNbcCArIDFdWzMyICogKGkgKyAxKSArIGogICAgXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZXNbcCArIDFdWzMyICogKGkgKyAxKSArIGogKyAxXSkgLyA0OworCisgICAgLyogU2VlayB0byB4L3kgcG9zIG9mIGN1cnNvci4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICBkc3RwdHJbaV0gPSBjdHgtPmZpbmFsX2ZyYW1lLT5kYXRhW2ldICAgICAgICAgICAgICAgICAgICAgICAgKworICAgICAgICAgICAgICAgICAgICAoY3R4LT5maW5hbF9mcmFtZS0+bGluZXNpemVbaV0gKiAoY3VyX3kgPj4gISFpKSkgKworICAgICAgICAgICAgICAgICAgICAoY3VyX3ggPj4gISFpKSArICEhaTsKKworICAgIC8qIENvcHkuICovCisgICAgZm9yIChpID0gMDsgaSA8IEZGTUlOKDMyLCBhdmN0eC0+aGVpZ2h0IC0gY3VyX3kpIC0gMTsgaSArPSAyKSB7CisgICAgICAgIGludCBsc2l6ZSA9IEZGTUlOKDMyLCBhdmN0eC0+d2lkdGggLSBjdXJfeCk7CisgICAgICAgIGludCBjc2l6ZSA9IGxzaXplIC8gMjsKKworICAgICAgICBmaWNfYWxwaGFfYmxlbmQoZHN0cHRyWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVzWzBdICsgaSAqIDMyLCBsc2l6ZSwgcGxhbmVzWzNdICsgaSAqIDMyKTsKKyAgICAgICAgZmljX2FscGhhX2JsZW5kKGRzdHB0clswXSArIGN0eC0+ZmluYWxfZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVzWzBdICsgKGkgKyAxKSAqIDMyLCBsc2l6ZSwgcGxhbmVzWzNdICsgKGkgKyAxKSAqIDMyKTsKKyAgICAgICAgZmljX2FscGhhX2JsZW5kKGRzdHB0clsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNocm9tYVswXSArIChpIC8gMikgKiAxNiwgY3NpemUsIGNocm9tYVsyXSArIChpIC8gMikgKiAxNik7CisgICAgICAgIGZpY19hbHBoYV9ibGVuZChkc3RwdHJbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBjaHJvbWFbMV0gKyAoaSAvIDIpICogMTYsIGNzaXplLCBjaHJvbWFbMl0gKyAoaSAvIDIpICogMTYpOworCisgICAgICAgIGRzdHB0clswXSArPSBjdHgtPmZpbmFsX2ZyYW1lLT5saW5lc2l6ZVswXSAqIDI7CisgICAgICAgIGRzdHB0clsxXSArPSBjdHgtPmZpbmFsX2ZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgZHN0cHRyWzJdICs9IGN0eC0+ZmluYWxfZnJhbWUtPmxpbmVzaXplWzJdOworICAgIH0KK30KKworc3RhdGljIGludCBmaWNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEZJQ0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqc3JjID0gYXZwa3QtPmRhdGE7CisgICAgaW50IHJldDsKKyAgICBpbnQgc2xpY2UsIG5zbGljZXM7CisgICAgaW50IG1zaXplOworICAgIGludCB0c2l6ZTsKKyAgICBpbnQgY3VyX3gsIGN1cl95OworICAgIGludCBza2lwX2N1cnNvciA9IDA7CisgICAgdWludDhfdCAqc2RhdGE7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgY3R4LT5mcmFtZSkpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInJlZ2V0X2J1ZmZlcigpIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogSGVhZGVyICsgYXQgbGVhc3Qgb25lIHNsaWNlICg0KSAqLworICAgIGlmIChhdnBrdC0+c2l6ZSA8IEZJQ19IRUFERVJfU0laRSArIDQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGcmFtZSBkYXRhIGlzIHRvbyBzbWFsbC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgaGVhZGVyLiAqLworICAgIGlmIChtZW1jbXAoc3JjLCBmaWNfaGVhZGVyLCA3KSkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgRklDIEhlYWRlci5cbiIpOworCisgICAgLyogSXMgaXQgYSBza2lwIGZyYW1lPyAqLworICAgIGlmIChzcmNbMTddKSB7CisgICAgICAgIGlmICghY3R4LT5maW5hbF9mcmFtZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkluaXRpYWwgZnJhbWUgaXMgc2tpcHBlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIHNraXA7CisgICAgfQorCisgICAgbnNsaWNlcyA9IHNyY1sxM107CisgICAgaWYgKCFuc2xpY2VzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiWmVybyBzbGljZXMgZm91bmQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogSGlnaCBvciBMb3cgUXVhbGl0eSBNYXRyaXg/ICovCisgICAgY3R4LT5xbWF0ID0gc3JjWzIzXSA/IGZpY19xbWF0X2hxIDogZmljX3FtYXRfbHE7CisKKyAgICAvKiBTa2lwIGN1cnNvciBkYXRhLiAqLworICAgIHRzaXplID0gQVZfUkIyNChzcmMgKyAyNCk7CisgICAgaWYgKHRzaXplID4gYXZwa3QtPnNpemUgLSBGSUNfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiUGFja2V0IGlzIHRvbyBzbWFsbCB0byBjb250YWluIGN1cnNvciAoJWQgdnMgJWQgYnl0ZXMpLlxuIiwKKyAgICAgICAgICAgICAgIHRzaXplLCBhdnBrdC0+c2l6ZSAtIEZJQ19IRUFERVJfU0laRSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICghdHNpemUpCisgICAgICAgIHNraXBfY3Vyc29yID0gMTsKKworICAgIGlmICghc2tpcF9jdXJzb3IgJiYgdHNpemUgPCAzMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkN1cnNvciBkYXRhIHRvbyBzbWFsbC4gU2tpcHBpbmcgY3Vyc29yLlxuIik7CisgICAgICAgIHNraXBfY3Vyc29yID0gMTsKKyAgICB9CisKKyAgICAvKiBDdXJzb3IgcG9zaXRpb24uICovCisgICAgY3VyX3ggPSBBVl9STDE2KHNyYyArIDMzKTsKKyAgICBjdXJfeSA9IEFWX1JMMTYoc3JjICsgMzUpOworICAgIGlmICghc2tpcF9jdXJzb3IgJiYgKGN1cl94ID4gYXZjdHgtPndpZHRoIHx8IGN1cl95ID4gYXZjdHgtPmhlaWdodCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJJbnZhbGlkIGN1cnNvciBwb3NpdGlvbjogKCVkLCVkKS4gU2tpcHBpbmcgY3Vzb3IuXG4iLAorICAgICAgICAgICAgICAgY3VyX3gsIGN1cl95KTsKKyAgICAgICAgc2tpcF9jdXJzb3IgPSAxOworICAgIH0KKworICAgIGlmICghc2tpcF9jdXJzb3IgJiYgKEFWX1JMMTYoc3JjICsgMzcpICE9IDMyIHx8IEFWX1JMMTYoc3JjICsgMzkpICE9IDMyKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkludmFsaWQgY3Vyc29yIHNpemUuIFNraXBwaW5nIGN1cnNvci5cbiIpOworICAgICAgICBza2lwX2N1cnNvciA9IDE7CisgICAgfQorCisgICAgLyogU2xpY2UgaGVpZ2h0IGZvciBhbGwgYnV0IHRoZSBsYXN0IHNsaWNlLiAqLworICAgIGN0eC0+c2xpY2VfaCA9IDE2ICogKGN0eC0+YWxpZ25lZF9oZWlnaHQgPj4gNCkgLyBuc2xpY2VzOworICAgIGlmIChjdHgtPnNsaWNlX2ggJSAxNikKKyAgICAgICAgY3R4LT5zbGljZV9oID0gRkZBTElHTihjdHgtPnNsaWNlX2ggLSAxNiwgMTYpOworCisgICAgLyogRmlyc3Qgc2xpY2Ugb2Zmc2V0IGFuZCByZW1haW5pbmcgZGF0YS4gKi8KKyAgICBzZGF0YSA9IHNyYyArIHRzaXplICsgRklDX0hFQURFUl9TSVpFICsgNCAqIG5zbGljZXM7CisgICAgbXNpemUgPSBhdnBrdC0+c2l6ZSAtIG5zbGljZXMgKiA0IC0gdHNpemUgLSBGSUNfSEVBREVSX1NJWkU7CisKKyAgICBpZiAobXNpemUgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCBlbm91Z2ggZnJhbWUgZGF0YSB0byBkZWNvZGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGZyYW1ldHlwZSB0byBJIGluaXRpYWxseS4gSXQgd2lsbCBiZSBzZXQgdG8gUCBpZiB0aGUgZnJhbWUKKyAgICAgKiBoYXMgYW55IGRlcGVuZGVuY2llcyAoc2tpcCBibG9ja3MpLiBUaGVyZSB3aWxsIGJlIGEgcmFjZSBjb25kaXRpb24KKyAgICAgKiBpbnNpZGUgdGhlIHNsaWNlIGRlY29kZSBmdW5jdGlvbiB0byBzZXQgdGhlc2UsIGJ1dCB3ZSBkbyBub3QgY2FyZS4KKyAgICAgKiBzaW5jZSB0aGV5IHdpbGwgb25seSBldmVyIGJlIHNldCB0byAwL1AuCisgICAgICovCisgICAgY3R4LT5mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICBjdHgtPmZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIC8qIEFsbG9jYXRlIHNsaWNlIGRhdGEuICovCisgICAgYXZfZmFzdF9tYWxsb2MoJmN0eC0+c2xpY2VfZGF0YSwgJmN0eC0+c2xpY2VfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgIG5zbGljZXMgKiBzaXplb2YoY3R4LT5zbGljZV9kYXRhWzBdKSk7CisgICAgaWYgKCFjdHgtPnNsaWNlX2RhdGFfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBzbGljZSBkYXRhLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIG1lbXNldChjdHgtPnNsaWNlX2RhdGEsIDAsIG5zbGljZXMgKiBzaXplb2YoY3R4LT5zbGljZV9kYXRhWzBdKSk7CisKKyAgICBmb3IgKHNsaWNlID0gMDsgc2xpY2UgPCBuc2xpY2VzOyBzbGljZSsrKSB7CisgICAgICAgIHVuc2lnbmVkIHNsaWNlX29mZiA9IEFWX1JCMzIoc3JjICsgdHNpemUgKyBGSUNfSEVBREVSX1NJWkUgKyBzbGljZSAqIDQpOworICAgICAgICB1bnNpZ25lZCBzbGljZV9zaXplOworICAgICAgICBpbnQgeV9vZmYgICA9IGN0eC0+c2xpY2VfaCAqIHNsaWNlOworICAgICAgICBpbnQgc2xpY2VfaCA9IGN0eC0+c2xpY2VfaDsKKworICAgICAgICAvKgorICAgICAgICAgKiBFaXRoZXIgcmVhZCB0aGUgc2xpY2Ugc2l6ZSwgb3IgY29uc3VtZSBhbGwgZGF0YSBsZWZ0LgorICAgICAgICAgKiBBbHNvLCBzcGVjaWFsIGNhc2UgdGhlIGxhc3Qgc2xpZ2h0IGhlaWdodC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzbGljZSA9PSBuc2xpY2VzIC0gMSkgeworICAgICAgICAgICAgc2xpY2Vfc2l6ZSAgID0gbXNpemU7CisgICAgICAgICAgICBzbGljZV9oICAgICAgPSBGRkFMSUdOKGF2Y3R4LT5oZWlnaHQgLSBjdHgtPnNsaWNlX2ggKiAobnNsaWNlcyAtIDEpLCAxNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbGljZV9zaXplID0gQVZfUkIzMihzcmMgKyB0c2l6ZSArIEZJQ19IRUFERVJfU0laRSArIHNsaWNlICogNCArIDQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNsaWNlX3NpemUgPCBzbGljZV9vZmYgfHwgc2xpY2Vfc2l6ZSA+IG1zaXplKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgc2xpY2Vfc2l6ZSAtPSBzbGljZV9vZmY7CisKKyAgICAgICAgY3R4LT5zbGljZV9kYXRhW3NsaWNlXS5zcmMgICAgICA9IHNkYXRhICsgc2xpY2Vfb2ZmOworICAgICAgICBjdHgtPnNsaWNlX2RhdGFbc2xpY2VdLnNyY19zaXplID0gc2xpY2Vfc2l6ZTsKKyAgICAgICAgY3R4LT5zbGljZV9kYXRhW3NsaWNlXS5zbGljZV9oICA9IHNsaWNlX2g7CisgICAgICAgIGN0eC0+c2xpY2VfZGF0YVtzbGljZV0ueV9vZmYgICAgPSB5X29mZjsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2Y3R4LT5leGVjdXRlKGF2Y3R4LCBmaWNfZGVjb2RlX3NsaWNlLCBjdHgtPnNsaWNlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBuc2xpY2VzLCBzaXplb2YoY3R4LT5zbGljZV9kYXRhWzBdKSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmN0eC0+ZmluYWxfZnJhbWUpOworICAgIGN0eC0+ZmluYWxfZnJhbWUgPSBhdl9mcmFtZV9jbG9uZShjdHgtPmZyYW1lKTsKKyAgICBpZiAoIWN0eC0+ZmluYWxfZnJhbWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY2xvbmUgZnJhbWUgYnVmZmVyLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLyogTWFrZSBzdXJlIHdlIHVzZSBhIHVzZXItc3VwcGxpZWQgYnVmZmVyLiAqLworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBjdHgtPmZpbmFsX2ZyYW1lKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG1ha2UgZnJhbWUgd3JpdGFibGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBEcmF3IGN1cnNvci4gKi8KKyAgICBpZiAoIXNraXBfY3Vyc29yKSB7CisgICAgICAgIG1lbWNweShjdHgtPmN1cnNvcl9idWYsIHNyYyArIDU5LCAzMiAqIDMyICogNCk7CisgICAgICAgIGZpY19kcmF3X2N1cnNvcihhdmN0eCwgY3VyX3gsIGN1cl95KTsKKyAgICB9CisKK3NraXA6CisgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgY3R4LT5maW5hbF9mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGZpY19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZJQ0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5zbGljZV9kYXRhKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZjdHgtPmZpbmFsX2ZyYW1lKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZjdHgtPmZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZmljX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGSUNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgLyogSW5pdGlhbGl6ZSB2YXJpb3VzIGNvbnRleHQgdmFsdWVzICovCisgICAgY3R4LT5hdmN0eCAgICAgICAgICAgID0gYXZjdHg7CisgICAgY3R4LT5hbGlnbmVkX3dpZHRoICAgID0gRkZBTElHTihhdmN0eC0+d2lkdGgsICAxNik7CisgICAgY3R4LT5hbGlnbmVkX2hlaWdodCAgID0gRkZBTElHTihhdmN0eC0+aGVpZ2h0LCAxNik7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCAgICAgICAgICAgICA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDg7CisKKyAgICBjdHgtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWN0eC0+ZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9maWNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZmljIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWlyaWxsaXMgRklDIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0ZJQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRklDQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmljX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGZpY19kZWNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmljX2RlY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmlsZV9vcGVuLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9maWxlX29wZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTRhNWQzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmlsZV9vcGVuLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgImxpYmF2dXRpbC9maWxlX29wZW4uYyIKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmYwMDRlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmxhYy5jCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogRkxBQyBjb21tb24gY29kZQorICogQ29weXJpZ2h0IChjKSAyMDA5IEp1c3RpbiBSdWdnbGVzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImZsYWMuaCIKKyNpbmNsdWRlICJmbGFjZGF0YS5oIgorCitzdGF0aWMgY29uc3QgaW50OF90IHNhbXBsZV9zaXplX3RhYmxlW10gPSB7IDAsIDgsIDEyLCAwLCAxNiwgMjAsIDI0LCAwIH07CisKK3N0YXRpYyBjb25zdCB1aW50NjRfdCBmbGFjX2NoYW5uZWxfbGF5b3V0c1s4XSA9IHsKKyAgICBBVl9DSF9MQVlPVVRfTU9OTywKKyAgICBBVl9DSF9MQVlPVVRfU1RFUkVPLAorICAgIEFWX0NIX0xBWU9VVF9TVVJST1VORCwKKyAgICBBVl9DSF9MQVlPVVRfUVVBRCwKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMCwKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMSwKKyAgICBBVl9DSF9MQVlPVVRfNlBPSU5UMSwKKyAgICBBVl9DSF9MQVlPVVRfN1BPSU5UMQorfTsKKworc3RhdGljIGludDY0X3QgZ2V0X3V0ZjgoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50NjRfdCB2YWw7CisgICAgR0VUX1VURjgodmFsLCBnZXRfYml0cyhnYiwgOCksIHJldHVybiAtMTspCisgICAgcmV0dXJuIHZhbDsKK30KKworaW50IGZmX2ZsYWNfZGVjb2RlX2ZyYW1lX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFDRnJhbWVJbmZvICpmaSwgaW50IGxvZ19sZXZlbF9vZmZzZXQpCit7CisgICAgaW50IGJzX2NvZGUsIHNyX2NvZGUsIGJwc19jb2RlOworCisgICAgLyogZnJhbWUgc3luYyBjb2RlICovCisgICAgaWYgKChnZXRfYml0cyhnYiwgMTUpICYgMHg3RkZGKSAhPSAweDdGRkMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IgKyBsb2dfbGV2ZWxfb2Zmc2V0LCAiaW52YWxpZCBzeW5jIGNvZGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiB2YXJpYWJsZSBibG9jayBzaXplIHN0cmVhbSBjb2RlICovCisgICAgZmktPmlzX3Zhcl9zaXplID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIC8qIGJsb2NrIHNpemUgYW5kIHNhbXBsZSByYXRlIGNvZGVzICovCisgICAgYnNfY29kZSA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICBzcl9jb2RlID0gZ2V0X2JpdHMoZ2IsIDQpOworCisgICAgLyogY2hhbm5lbHMgYW5kIGRlY29ycmVsYXRpb24gKi8KKyAgICBmaS0+Y2hfbW9kZSA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICBpZiAoZmktPmNoX21vZGUgPCBGTEFDX01BWF9DSEFOTkVMUykgeworICAgICAgICBmaS0+Y2hhbm5lbHMgPSBmaS0+Y2hfbW9kZSArIDE7CisgICAgICAgIGZpLT5jaF9tb2RlID0gRkxBQ19DSE1PREVfSU5ERVBFTkRFTlQ7CisgICAgfSBlbHNlIGlmIChmaS0+Y2hfbW9kZSA8IEZMQUNfTUFYX0NIQU5ORUxTICsgRkxBQ19DSE1PREVfTUlEX1NJREUpIHsKKyAgICAgICAgZmktPmNoYW5uZWxzID0gMjsKKyAgICAgICAgZmktPmNoX21vZGUgLT0gRkxBQ19NQVhfQ0hBTk5FTFMgLSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SICsgbG9nX2xldmVsX29mZnNldCwKKyAgICAgICAgICAgICAgICJpbnZhbGlkIGNoYW5uZWwgbW9kZTogJWRcbiIsIGZpLT5jaF9tb2RlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogYml0cyBwZXIgc2FtcGxlICovCisgICAgYnBzX2NvZGUgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgaWYgKGJwc19jb2RlID09IDMgfHwgYnBzX2NvZGUgPT0gNykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiArIGxvZ19sZXZlbF9vZmZzZXQsCisgICAgICAgICAgICAgICAiaW52YWxpZCBzYW1wbGUgc2l6ZSBjb2RlICglZClcbiIsCisgICAgICAgICAgICAgICBicHNfY29kZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBmaS0+YnBzID0gc2FtcGxlX3NpemVfdGFibGVbYnBzX2NvZGVdOworCisgICAgLyogcmVzZXJ2ZWQgYml0ICovCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IgKyBsb2dfbGV2ZWxfb2Zmc2V0LAorICAgICAgICAgICAgICAgImJyb2tlbiBzdHJlYW0sIGludmFsaWQgcGFkZGluZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIHNhbXBsZSBvciBmcmFtZSBjb3VudCAqLworICAgIGZpLT5mcmFtZV9vcl9zYW1wbGVfbnVtID0gZ2V0X3V0ZjgoZ2IpOworICAgIGlmIChmaS0+ZnJhbWVfb3Jfc2FtcGxlX251bSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IgKyBsb2dfbGV2ZWxfb2Zmc2V0LAorICAgICAgICAgICAgICAgInNhbXBsZS9mcmFtZSBudW1iZXIgaW52YWxpZDsgdXRmOCBmc2NrZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBibG9ja3NpemUgKi8KKyAgICBpZiAoYnNfY29kZSA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SICsgbG9nX2xldmVsX29mZnNldCwKKyAgICAgICAgICAgICAgICJyZXNlcnZlZCBibG9ja3NpemUgY29kZTogMFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0gZWxzZSBpZiAoYnNfY29kZSA9PSA2KSB7CisgICAgICAgIGZpLT5ibG9ja3NpemUgPSBnZXRfYml0cyhnYiwgOCkgKyAxOworICAgIH0gZWxzZSBpZiAoYnNfY29kZSA9PSA3KSB7CisgICAgICAgIGZpLT5ibG9ja3NpemUgPSBnZXRfYml0cyhnYiwgMTYpICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaS0+YmxvY2tzaXplID0gZmZfZmxhY19ibG9ja3NpemVfdGFibGVbYnNfY29kZV07CisgICAgfQorCisgICAgLyogc2FtcGxlIHJhdGUgKi8KKyAgICBpZiAoc3JfY29kZSA8IDEyKSB7CisgICAgICAgIGZpLT5zYW1wbGVyYXRlID0gZmZfZmxhY19zYW1wbGVfcmF0ZV90YWJsZVtzcl9jb2RlXTsKKyAgICB9IGVsc2UgaWYgKHNyX2NvZGUgPT0gMTIpIHsKKyAgICAgICAgZmktPnNhbXBsZXJhdGUgPSBnZXRfYml0cyhnYiwgOCkgKiAxMDAwOworICAgIH0gZWxzZSBpZiAoc3JfY29kZSA9PSAxMykgeworICAgICAgICBmaS0+c2FtcGxlcmF0ZSA9IGdldF9iaXRzKGdiLCAxNik7CisgICAgfSBlbHNlIGlmIChzcl9jb2RlID09IDE0KSB7CisgICAgICAgIGZpLT5zYW1wbGVyYXRlID0gZ2V0X2JpdHMoZ2IsIDE2KSAqIDEwOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SICsgbG9nX2xldmVsX29mZnNldCwKKyAgICAgICAgICAgICAgICJpbGxlZ2FsIHNhbXBsZSByYXRlIGNvZGUgJWRcbiIsCisgICAgICAgICAgICAgICBzcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogaGVhZGVyIENSQy04IGNoZWNrICovCisgICAgc2tpcF9iaXRzKGdiLCA4KTsKKyAgICBpZiAoYXZfY3JjKGF2X2NyY19nZXRfdGFibGUoQVZfQ1JDXzhfQVRNKSwgMCwgZ2ItPmJ1ZmZlciwKKyAgICAgICAgICAgICAgIGdldF9iaXRzX2NvdW50KGdiKS84KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiArIGxvZ19sZXZlbF9vZmZzZXQsCisgICAgICAgICAgICAgICAiaGVhZGVyIGNyYyBtaXNtYXRjaFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfZmxhY19nZXRfbWF4X2ZyYW1lX3NpemUoaW50IGJsb2Nrc2l6ZSwgaW50IGNoLCBpbnQgYnBzKQoreworICAgIC8qIFRlY2huaWNhbGx5LCB0aGVyZSBpcyBubyBsaW1pdCB0byBGTEFDIGZyYW1lIHNpemUsIGJ1dCBhbiBlbmNvZGVyCisgICAgICAgc2hvdWxkIG5vdCB3cml0ZSBhIGZyYW1lIHRoYXQgaXMgbGFyZ2VyIHRoYW4gaWYgdmVyYmF0aW0gZW5jb2RpbmcgbW9kZQorICAgICAgIHdlcmUgdG8gYmUgdXNlZC4gKi8KKworICAgIGludCBjb3VudDsKKworICAgIGNvdW50ID0gMTY7ICAgICAgICAgICAgICAgICAgLyogZnJhbWUgaGVhZGVyICovCisgICAgY291bnQgKz0gY2ggKiAoKDcrYnBzKzcpLzgpOyAvKiBzdWJmcmFtZSBoZWFkZXJzICovCisgICAgaWYgKGNoID09IDIpIHsKKyAgICAgICAgLyogZm9yIHN0ZXJlbywgbmVlZCB0byBhY2NvdW50IGZvciB1c2luZyBkZWNvcnJlbGF0aW9uICovCisgICAgICAgIGNvdW50ICs9ICgoIDIqYnBzKzEpICogYmxvY2tzaXplICsgNykgLyA4OworICAgIH0gZWxzZSB7CisgICAgICAgIGNvdW50ICs9ICggY2gqYnBzICAgICogYmxvY2tzaXplICsgNykgLyA4OworICAgIH0KKyAgICBjb3VudCArPSAyOyAvKiBmcmFtZSBmb290ZXIgKi8KKworICAgIHJldHVybiBjb3VudDsKK30KKworaW50IGZmX2ZsYWNfaXNfZXh0cmFkYXRhX3ZhbGlkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEZMQUNFeHRyYWRhdGFGb3JtYXQgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqc3RyZWFtaW5mb19zdGFydCkKK3sKKyAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEgfHwgYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgRkxBQ19TVFJFQU1JTkZPX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJleHRyYWRhdGEgTlVMTCBvciB0b28gc21hbGwuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChBVl9STDMyKGF2Y3R4LT5leHRyYWRhdGEpICE9IE1LVEFHKCdmJywnTCcsJ2EnLCdDJykpIHsKKyAgICAgICAgLyogZXh0cmFkYXRhIGNvbnRhaW5zIFNUUkVBTUlORk8gb25seSAqLworICAgICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplICE9IEZMQUNfU1RSRUFNSU5GT19TSVpFKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZXh0cmFkYXRhIGNvbnRhaW5zICVkIGJ5dGVzIHRvbyBtYW55LlxuIiwKKyAgICAgICAgICAgICAgICAgICBGTEFDX1NUUkVBTUlORk9fU0laRS1hdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgICpmb3JtYXQgPSBGTEFDX0VYVFJBREFUQV9GT1JNQVRfU1RSRUFNSU5GTzsKKyAgICAgICAgKnN0cmVhbWluZm9fc3RhcnQgPSBhdmN0eC0+ZXh0cmFkYXRhOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCA4K0ZMQUNfU1RSRUFNSU5GT19TSVpFKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImV4dHJhZGF0YSB0b28gc21hbGwuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgICpmb3JtYXQgPSBGTEFDX0VYVFJBREFUQV9GT1JNQVRfRlVMTF9IRUFERVI7CisgICAgICAgICpzdHJlYW1pbmZvX3N0YXJ0ID0gJmF2Y3R4LT5leHRyYWRhdGFbOF07CisgICAgfQorICAgIHJldHVybiAxOworfQorCit2b2lkIGZmX2ZsYWNfc2V0X2NoYW5uZWxfbGF5b3V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDw9IEZGX0FSUkFZX0VMRU1TKGZsYWNfY2hhbm5lbF9sYXlvdXRzKSkKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gZmxhY19jaGFubmVsX2xheW91dHNbYXZjdHgtPmNoYW5uZWxzIC0gMV07CisgICAgZWxzZQorICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSAwOworfQorCit2b2lkIGZmX2ZsYWNfcGFyc2Vfc3RyZWFtaW5mbyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHN0cnVjdCBGTEFDU3RyZWFtaW5mbyAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlcikKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWZmZXIsIEZMQUNfU1RSRUFNSU5GT19TSVpFKjgpOworCisgICAgc2tpcF9iaXRzKCZnYiwgMTYpOyAvKiBza2lwIG1pbiBibG9ja3NpemUgKi8KKyAgICBzLT5tYXhfYmxvY2tzaXplID0gZ2V0X2JpdHMoJmdiLCAxNik7CisgICAgaWYgKHMtPm1heF9ibG9ja3NpemUgPCBGTEFDX01JTl9CTE9DS1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImludmFsaWQgbWF4IGJsb2Nrc2l6ZTogJWRcbiIsCisgICAgICAgICAgICAgICBzLT5tYXhfYmxvY2tzaXplKTsKKyAgICAgICAgcy0+bWF4X2Jsb2Nrc2l6ZSA9IDE2OworICAgIH0KKworICAgIHNraXBfYml0cygmZ2IsIDI0KTsgLyogc2tpcCBtaW4gZnJhbWUgc2l6ZSAqLworICAgIHMtPm1heF9mcmFtZXNpemUgPSBnZXRfYml0c19sb25nKCZnYiwgMjQpOworCisgICAgcy0+c2FtcGxlcmF0ZSA9IGdldF9iaXRzX2xvbmcoJmdiLCAyMCk7CisgICAgcy0+Y2hhbm5lbHMgPSBnZXRfYml0cygmZ2IsIDMpICsgMTsKKyAgICBzLT5icHMgPSBnZXRfYml0cygmZ2IsIDUpICsgMTsKKworICAgIGF2Y3R4LT5jaGFubmVscyA9IHMtPmNoYW5uZWxzOworICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IHMtPnNhbXBsZXJhdGU7CisgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBzLT5icHM7CisKKyAgICBpZiAoIWF2Y3R4LT5jaGFubmVsX2xheW91dCB8fAorICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoYXZjdHgtPmNoYW5uZWxfbGF5b3V0KSAhPSBhdmN0eC0+Y2hhbm5lbHMpCisgICAgICAgIGZmX2ZsYWNfc2V0X2NoYW5uZWxfbGF5b3V0KGF2Y3R4KTsKKworICAgIHMtPnNhbXBsZXMgPSBnZXRfYml0czY0KCZnYiwgMzYpOworCisgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCA2NCk7IC8qIG1kNSBzdW0gKi8KKyAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDY0KTsgLyogbWQ1IHN1bSAqLworfQorCisjaWYgTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcKK3ZvaWQgYXZwcml2X2ZsYWNfcGFyc2Vfc3RyZWFtaW5mbyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHN0cnVjdCBGTEFDU3RyZWFtaW5mbyAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlcikKK3sKKyAgICBmZl9mbGFjX3BhcnNlX3N0cmVhbWluZm8oYXZjdHgsIHMsIGJ1ZmZlcik7Cit9CisKK2ludCBhdnByaXZfZmxhY19pc19leHRyYWRhdGFfdmFsaWQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gRkxBQ0V4dHJhZGF0YUZvcm1hdCAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipzdHJlYW1pbmZvX3N0YXJ0KQoreworICAgIHJldHVybiBmZl9mbGFjX2lzX2V4dHJhZGF0YV92YWxpZChhdmN0eCwgZm9ybWF0LCBzdHJlYW1pbmZvX3N0YXJ0KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmxhYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmxhYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzA3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFjLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBGTEFDIChGcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjKSBkZWNvZGVyL2RlbXV4ZXIgY29tbW9uIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDA4IEp1c3RpbiBSdWdnbGVzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEZMQUMgKEZyZWUgTG9zc2xlc3MgQXVkaW8gQ29kZWMpIGRlY29kZXIvZGVtdXhlciBjb21tb24gZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0ZMQUNfSAorI2RlZmluZSBBVkNPREVDX0ZMQUNfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorCisjZGVmaW5lIEZMQUNfU1RSRUFNSU5GT19TSVpFICAgMzQKKyNkZWZpbmUgRkxBQ19NQVhfQ0hBTk5FTFMgICAgICAgOAorI2RlZmluZSBGTEFDX01JTl9CTE9DS1NJWkUgICAgIDE2CisjZGVmaW5lIEZMQUNfTUFYX0JMT0NLU0laRSAgNjU1MzUKKyNkZWZpbmUgRkxBQ19NSU5fRlJBTUVfU0laRSAgICAxMQorCitlbnVtIHsKKyAgICBGTEFDX0NITU9ERV9JTkRFUEVOREVOVCA9IDAsCisgICAgRkxBQ19DSE1PREVfTEVGVF9TSURFICAgPSAxLAorICAgIEZMQUNfQ0hNT0RFX1JJR0hUX1NJREUgID0gMiwKKyAgICBGTEFDX0NITU9ERV9NSURfU0lERSAgICA9IDMsCit9OworCitlbnVtIHsKKyAgICBGTEFDX01FVEFEQVRBX1RZUEVfU1RSRUFNSU5GTyA9IDAsCisgICAgRkxBQ19NRVRBREFUQV9UWVBFX1BBRERJTkcsCisgICAgRkxBQ19NRVRBREFUQV9UWVBFX0FQUExJQ0FUSU9OLAorICAgIEZMQUNfTUVUQURBVEFfVFlQRV9TRUVLVEFCTEUsCisgICAgRkxBQ19NRVRBREFUQV9UWVBFX1ZPUkJJU19DT01NRU5ULAorICAgIEZMQUNfTUVUQURBVEFfVFlQRV9DVUVTSEVFVCwKKyAgICBGTEFDX01FVEFEQVRBX1RZUEVfUElDVFVSRSwKKyAgICBGTEFDX01FVEFEQVRBX1RZUEVfSU5WQUxJRCA9IDEyNworfTsKKworZW51bSBGTEFDRXh0cmFkYXRhRm9ybWF0IHsKKyAgICBGTEFDX0VYVFJBREFUQV9GT1JNQVRfU1RSRUFNSU5GTyAgPSAwLAorICAgIEZMQUNfRVhUUkFEQVRBX0ZPUk1BVF9GVUxMX0hFQURFUiA9IDEKK307CisKKyNkZWZpbmUgRkxBQ0NPTU1PTklORk8gXAorICAgIGludCBzYW1wbGVyYXRlOyAgICAgICAgIC8qKjwgc2FtcGxlIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXAorICAgIGludCBjaGFubmVsczsgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICovXAorICAgIGludCBicHM7ICAgICAgICAgICAgICAgIC8qKjwgYml0cy1wZXItc2FtcGxlICAgICAgICAgICAgICAgICAgICAgICAgICovXAorCisvKioKKyAqIERhdGEgbmVlZGVkIGZyb20gdGhlIFN0cmVhbWluZm8gaGVhZGVyIGZvciB1c2UgYnkgdGhlIHJhdyBGTEFDIGRlbXV4ZXIKKyAqIGFuZC9vciB0aGUgRkxBQyBkZWNvZGVyLgorICovCisjZGVmaW5lIEZMQUNTVFJFQU1JTkZPIFwKKyAgICBGTEFDQ09NTU9OSU5GTyBcCisgICAgaW50IG1heF9ibG9ja3NpemU7ICAgICAgLyoqPCBtYXhpbXVtIGJsb2NrIHNpemUsIGluIHNhbXBsZXMgICAgICAgICAgKi9cCisgICAgaW50IG1heF9mcmFtZXNpemU7ICAgICAgLyoqPCBtYXhpbXVtIGZyYW1lIHNpemUsIGluIGJ5dGVzICAgICAgICAgICAgKi9cCisgICAgaW50NjRfdCBzYW1wbGVzOyAgICAgICAgLyoqPCB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyAgICAgICAgICAgICAgICAgKi9cCisKK3R5cGVkZWYgc3RydWN0IEZMQUNTdHJlYW1pbmZvIHsKKyAgICBGTEFDU1RSRUFNSU5GTworfSBGTEFDU3RyZWFtaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgRkxBQ0ZyYW1lSW5mbyB7CisgICAgRkxBQ0NPTU1PTklORk8KKyAgICBpbnQgYmxvY2tzaXplOyAgICAgICAgICAvKio8IGJsb2NrIHNpemUgb2YgdGhlIGZyYW1lICAgICAgICAgICAgICAgICAqLworICAgIGludCBjaF9tb2RlOyAgICAgICAgICAgIC8qKjwgY2hhbm5lbCBkZWNvcnJlbGF0aW9uIG1vZGUgICAgICAgICAgICAgICovCisgICAgaW50NjRfdCBmcmFtZV9vcl9zYW1wbGVfbnVtOyAgICAvKio8IGZyYW1lIG51bWJlciBvciBzYW1wbGUgbnVtYmVyICAgKi8KKyAgICBpbnQgaXNfdmFyX3NpemU7ICAgICAgICAgICAgICAgIC8qKjwgc3BlY2lmaWVzIGlmIHRoZSBzdHJlYW0gdXNlcyB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBzaXplcyBvciBhIGZpeGVkIGJsb2NrIHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsc28gZGV0ZXJtaW5lcyB0aGUgbWVhbmluZyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9vcl9zYW1wbGVfbnVtICAgICAgICAgICAgICovCit9IEZMQUNGcmFtZUluZm87CisKKy8qKgorICogUGFyc2UgdGhlIFN0cmVhbWluZm8gbWV0YWRhdGEgYmxvY2sKKyAqIEBwYXJhbVtvdXRdIGF2Y3R4ICAgY29kZWMgY29udGV4dCB0byBzZXQgYmFzaWMgc3RyZWFtIHBhcmFtZXRlcnMKKyAqIEBwYXJhbVtvdXRdIHMgICAgICAgd2hlcmUgcGFyc2VkIGluZm9ybWF0aW9uIGlzIHN0b3JlZAorICogQHBhcmFtW2luXSAgYnVmZmVyICBwb2ludGVyIHRvIHN0YXJ0IG9mIDM0LWJ5dGUgc3RyZWFtaW5mbyBkYXRhCisgKi8KK3ZvaWQgZmZfZmxhY19wYXJzZV9zdHJlYW1pbmZvKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgc3RydWN0IEZMQUNTdHJlYW1pbmZvICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyKTsKKworI2lmIExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3Cit2b2lkIGF2cHJpdl9mbGFjX3BhcnNlX3N0cmVhbWluZm8oQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBzdHJ1Y3QgRkxBQ1N0cmVhbWluZm8gKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyKTsKK2ludCBhdnByaXZfZmxhY19pc19leHRyYWRhdGFfdmFsaWQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEZMQUNFeHRyYWRhdGFGb3JtYXQgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnN0cmVhbWluZm9fc3RhcnQpOworI2VuZGlmCisKKy8qKgorICogVmFsaWRhdGUgdGhlIEZMQUMgZXh0cmFkYXRhLgorICogQHBhcmFtW2luXSAgYXZjdHggY29kZWMgY29udGV4dCBjb250YWluaW5nIHRoZSBleHRyYWRhdGEuCisgKiBAcGFyYW1bb3V0XSBmb3JtYXQgZXh0cmFkYXRhIGZvcm1hdC4KKyAqIEBwYXJhbVtvdXRdIHN0cmVhbWluZm9fc3RhcnQgcG9pbnRlciB0byBzdGFydCBvZiAzNC1ieXRlIFNUUkVBTUlORk8gZGF0YS4KKyAqIEByZXR1cm4gMSBpZiB2YWxpZCwgMCBpZiBub3QgdmFsaWQuCisgKi8KK2ludCBmZl9mbGFjX2lzX2V4dHJhZGF0YV92YWxpZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBGTEFDRXh0cmFkYXRhRm9ybWF0ICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnN0cmVhbWluZm9fc3RhcnQpOworCisvKioKKyAqIENhbGN1bGF0ZSBhbiBlc3RpbWF0ZSBmb3IgdGhlIG1heGltdW0gZnJhbWUgc2l6ZSBiYXNlZCBvbiB2ZXJiYXRpbSBtb2RlLgorICogQHBhcmFtIGJsb2Nrc2l6ZSBibG9jayBzaXplLCBpbiBzYW1wbGVzCisgKiBAcGFyYW0gY2ggbnVtYmVyIG9mIGNoYW5uZWxzCisgKiBAcGFyYW0gYnBzIGJpdHMtcGVyLXNhbXBsZQorICovCitpbnQgZmZfZmxhY19nZXRfbWF4X2ZyYW1lX3NpemUoaW50IGJsb2Nrc2l6ZSwgaW50IGNoLCBpbnQgYnBzKTsKKworLyoqCisgKiBWYWxpZGF0ZSBhbmQgZGVjb2RlIGEgZnJhbWUgaGVhZGVyLgorICogQHBhcmFtICAgICAgYXZjdHggQVZDb2RlY0NvbnRleHQgdG8gdXNlIGFzIGF2X2xvZygpIGNvbnRleHQKKyAqIEBwYXJhbSAgICAgIGdiICAgIEdldEJpdENvbnRleHQgZnJvbSB3aGljaCB0byByZWFkIGZyYW1lIGhlYWRlcgorICogQHBhcmFtW291dF0gZmkgICAgZnJhbWUgaW5mb3JtYXRpb24KKyAqIEBwYXJhbSAgICAgIGxvZ19sZXZlbF9vZmZzZXQgIGxvZyBsZXZlbCBvZmZzZXQuIGNhbiBiZSB1c2VkIHRvIHNpbGVuY2UgZXJyb3IgbWVzc2FnZXMuCisgKiBAcmV0dXJuIG5vbi16ZXJvIG9uIGVycm9yLCAwIGlmIG9rCisgKi8KK2ludCBmZl9mbGFjX2RlY29kZV9mcmFtZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBQ0ZyYW1lSW5mbyAqZmksIGludCBsb2dfbGV2ZWxfb2Zmc2V0KTsKKwordm9pZCBmZl9mbGFjX3NldF9jaGFubmVsX2xheW91dChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisvKioKKyAqIFBhcnNlIHRoZSBtZXRhZGF0YSBibG9jayBwYXJhbWV0ZXJzIGZyb20gdGhlIGhlYWRlci4KKyAqIEBwYXJhbVtpbl0gIGJsb2NrX2hlYWRlciBoZWFkZXIgZGF0YSwgYXQgbGVhc3QgNCBieXRlcworICogQHBhcmFtW291dF0gbGFzdCBpbmRpY2F0b3IgZm9yIGxhc3QgbWV0YWRhdGEgYmxvY2sKKyAqIEBwYXJhbVtvdXRdIHR5cGUgbWV0YWRhdGEgYmxvY2sgdHlwZQorICogQHBhcmFtW291dF0gc2l6ZSBtZXRhZGF0YSBibG9jayBzaXplCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmxhY19wYXJzZV9ibG9ja19oZWFkZXIoY29uc3QgdWludDhfdCAqYmxvY2tfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsYXN0LCBpbnQgKnR5cGUsIGludCAqc2l6ZSkKK3sKKyAgICBpbnQgdG1wID0gYnl0ZXN0cmVhbV9nZXRfYnl0ZSgmYmxvY2tfaGVhZGVyKTsKKyAgICBpZiAobGFzdCkKKyAgICAgICAgKmxhc3QgPSB0bXAgJiAweDgwOworICAgIGlmICh0eXBlKQorICAgICAgICAqdHlwZSA9IHRtcCAmIDB4N0Y7CisgICAgaWYgKHNpemUpCisgICAgICAgICpzaXplID0gYnl0ZXN0cmVhbV9nZXRfYmUyNCgmYmxvY2tfaGVhZGVyKTsKK30KKworI2VuZGlmIC8qIEFWQ09ERUNfRkxBQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mbGFjX3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmxhY19wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTQ1YWIwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmxhY19wYXJzZXIuYwpAQCAtMCwwICsxLDczNiBAQAorLyoKKyAqIEZMQUMgcGFyc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWljaGFlbCBDaGluZW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRkxBQyBwYXJzZXIKKyAqCisgKiBUaGUgRkxBQyBwYXJzZXIgYnVmZmVycyBpbnB1dCB1bnRpbCBGTEFDX01JTl9IRUFERVJTIGhhcyBiZWVuIGZvdW5kLgorICogRWFjaCB0aW1lIGl0IGZpbmRzIGFuZCB2ZXJpZmllcyBhIENSQy04IGhlYWRlciBpdCBzZWVzIHdoaWNoIG9mIHRoZQorICogRkxBQ19NQVhfU0VRVUVOVElBTF9IRUFERVJTIHRoYXQgY2FtZSBiZWZvcmUgaXQgaGF2ZSBhIHZhbGlkIENSQy0xNiBmb290ZXIKKyAqIHRoYXQgZW5kcyBhdCB0aGUgbmV3bHkgZm91bmQgaGVhZGVyLgorICogSGVhZGVycyBhcmUgc2NvcmVkIGJ5IEZMQUNfSEVBREVSX0JBU0VfU0NPUkUgcGx1cyB0aGUgbWF4IG9mIGl0cyBjcmMtdmVyaWZpZWQKKyAqIGNoaWxkcmVuLCBwZW5hbGl6ZWQgYnkgY2hhbmdlcyBpbiBzYW1wbGUgcmF0ZSwgZnJhbWUgbnVtYmVyLCBldGMuCisgKiBUaGUgcGFyc2VyIHJldHVybnMgdGhlIGZyYW1lIHdpdGggdGhlIGhpZ2hlc3Qgc2NvcmUuCisgKiovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlmby5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJmbGFjLmgiCisKKy8qKiBtYXhpbXVtIG51bWJlciBvZiBhZGphY2VudCBoZWFkZXJzIHRoYXQgY29tcGFyZSBDUkNzIGFnYWluc3QgZWFjaCBvdGhlciAgICovCisjZGVmaW5lIEZMQUNfTUFYX1NFUVVFTlRJQUxfSEVBREVSUyAzCisvKiogbWluaW11bSBudW1iZXIgb2YgaGVhZGVycyBidWZmZXJlZCBhbmQgY2hlY2tlZCBiZWZvcmUgcmV0dXJuaW5nIGZyYW1lcyAgICAqLworI2RlZmluZSBGTEFDX01JTl9IRUFERVJTIDEwCisvKiogZXN0aW1hdGUgZm9yIGF2ZXJhZ2Ugc2l6ZSBvZiBhIEZMQUMgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGTEFDX0FWR19GUkFNRV9TSVpFIDgxOTIKKworLyoqIHNjb3Jpbmcgc2V0dGluZ3MgZm9yIHNjb3JlX2hlYWRlciAqLworI2RlZmluZSBGTEFDX0hFQURFUl9CQVNFX1NDT1JFICAgICAgICAxMAorI2RlZmluZSBGTEFDX0hFQURFUl9DSEFOR0VEX1BFTkFMVFkgICA3CisjZGVmaW5lIEZMQUNfSEVBREVSX0NSQ19GQUlMX1BFTkFMVFkgIDUwCisjZGVmaW5lIEZMQUNfSEVBREVSX05PVF9QRU5BTElaRURfWUVUIDEwMDAwMAorI2RlZmluZSBGTEFDX0hFQURFUl9OT1RfU0NPUkVEX1lFVCAgICAtMTAwMDAwCisKKy8qKiBsYXJnZXN0IHBvc3NpYmxlIHNpemUgb2YgZmxhYyBoZWFkZXIgKi8KKyNkZWZpbmUgTUFYX0ZSQU1FX0hFQURFUl9TSVpFIDE2CisKK3R5cGVkZWYgc3RydWN0IEZMQUNIZWFkZXJNYXJrZXIgeworICAgIGludCBvZmZzZXQ7ICAgICAgIC8qKjwgYnl0ZSBvZmZzZXQgZnJvbSBzdGFydCBvZiBGTEFDUGFyc2VDb250ZXh0LT5idWZmZXIgKi8KKyAgICBpbnQgKmxpbmtfcGVuYWx0eTsgIC8qKjwgcG9pbnRlciB0byBhcnJheSBvZiBsb2NhbCBzY29yZXMgYmV0d2VlbiB0aGlzIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBvbmUgYXQgYSBkaXN0YW5jZSBlcXVhbCBhcnJheSBwb3NpdGlvbiAgICAgKi8KKyAgICBpbnQgbWF4X3Njb3JlOyAgICAvKio8IG1heGltdW0gc2NvcmUgZm91bmQgYWZ0ZXIgY2hlY2tpbmcgZWFjaCBjaGlsZCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYSB2YWxpZCBDUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEZMQUNGcmFtZUluZm8gZmk7IC8qKjwgZGVjb2RlZCBmcmFtZSBoZWFkZXIgaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzdHJ1Y3QgRkxBQ0hlYWRlck1hcmtlciAqbmV4dDsgICAgICAgLyoqPCBuZXh0IENSQy04IHZlcmlmaWVkIGhlYWRlciB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGlzIG9uZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBieXRlc3RyZWFtICAgICAgICAgICAgICAgICAgKi8KKyAgICBzdHJ1Y3QgRkxBQ0hlYWRlck1hcmtlciAqYmVzdF9jaGlsZDsgLyoqPCBmb2xsb3dpbmcgZnJhbWUgaGVhZGVyIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGlzIGZyYW1lIGhhcyB0aGUgYmVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlIHdpdGggICAgICAgICAgICAgICAgICAgICAgKi8KK30gRkxBQ0hlYWRlck1hcmtlcjsKKwordHlwZWRlZiBzdHJ1Y3QgRkxBQ1BhcnNlQ29udGV4dCB7CisgICAgQVZDb2RlY1BhcnNlckNvbnRleHQgKnBjOyAgICAgIC8qKjwgcGFyZW50IGNvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsgICAgICAgICAvKio8IGNvZGVjIGNvbnRleHQgcG9pbnRlciBmb3IgbG9nZ2luZyAgICAgKi8KKyAgICBGTEFDSGVhZGVyTWFya2VyICpoZWFkZXJzOyAgICAgLyoqPCBsaW5rZWQtbGlzdCB0aGF0IHN0YXJ0cyBhdCB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkMtOCB2ZXJpZmllZCBoZWFkZXIgd2l0aGluIGJ1ZmZlciAgICovCisgICAgRkxBQ0hlYWRlck1hcmtlciAqYmVzdF9oZWFkZXI7IC8qKjwgaGlnaGVzdCBzY29yaW5nIGhlYWRlciB3aXRoaW4gYnVmZmVyICAqLworICAgIGludCBuYl9oZWFkZXJzX2ZvdW5kOyAgICAgICAgICAvKio8IG51bWJlciBvZiBoZWFkZXJzIGZvdW5kIGluIHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhY19wYXJzZSgpIGNhbGwgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBuYl9oZWFkZXJzX2J1ZmZlcmVkOyAgICAgICAvKio8IG51bWJlciBvZiBoZWFkZXJzIHRoYXQgYXJlIGJ1ZmZlcmVkICAgKi8KKyAgICBpbnQgYmVzdF9oZWFkZXJfdmFsaWQ7ICAgICAgICAgLyoqPCBmbGFnIHNldCB3aGVuIHRoZSBwYXJzZXIgcmV0dXJucyBqdW5rOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNldCByZXR1cm4gYmVzdF9oZWFkZXIgbmV4dCB0aW1lICAgKi8KKyAgICBBVkZpZm9CdWZmZXIgKmZpZm9fYnVmOyAgICAgICAgLyoqPCBidWZmZXIgdG8gc3RvcmUgYWxsIGRhdGEgdW50aWwgaGVhZGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB2ZXJpZmllZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgZW5kX3BhZGRlZDsgICAgICAgICAgICAgICAgLyoqPCBzcGVjaWZpZXMgaWYgZmlmb19idWYncyBlbmQgaXMgcGFkZGVkICovCisgICAgdWludDhfdCAqd3JhcF9idWY7ICAgICAgICAgICAgIC8qKjwgZ2VuZXJhbCBmaWZvIHJlYWQgYnVmZmVyIHdoZW4gd3JhcHBlZCAqLworICAgIGludCB3cmFwX2J1Zl9hbGxvY2F0ZWRfc2l6ZTsgICAvKio8IGFjdHVhbCBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGUgYnVmZmVyICAgKi8KKyAgICBGTEFDRnJhbWVJbmZvIGxhc3RfZmk7ICAgICAgICAgLyoqPCBsYXN0IGRlY29kZWQgZnJhbWUgaGVhZGVyIGluZm8gICAgICAgICovCisgICAgaW50IGxhc3RfZmlfdmFsaWQ7ICAgICAgICAgICAgIC8qKjwgc2V0IGlmIGxhc3RfZmkgaXMgdmFsaWQgICAgICAgICAgICAgICAqLworfSBGTEFDUGFyc2VDb250ZXh0OworCitzdGF0aWMgaW50IGZyYW1lX2hlYWRlcl9pc192YWxpZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQUNGcmFtZUluZm8gKmZpKQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgTUFYX0ZSQU1FX0hFQURFUl9TSVpFICogOCk7CisgICAgcmV0dXJuICFmZl9mbGFjX2RlY29kZV9mcmFtZV9oZWFkZXIoYXZjdHgsICZnYiwgZmksIDEyNyk7Cit9CisKKy8qKgorICogTm9uLWRlc3RydWN0aXZlIGZhc3QgZmlmbyBwb2ludGVyIGZldGNoaW5nCisgKiBSZXR1cm5zIGEgcG9pbnRlciBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgorICogSWYgcG9zc2libGUgdGhlIHBvaW50ZXIgcG9pbnRzIHdpdGhpbiB0aGUgZmlmbyBidWZmZXIuCisgKiBPdGhlcndpc2UgKGlmIGl0IHdvdWxkIGNhdXNlIGEgd3JhcCBhcm91bmQsKSBhIHBvaW50ZXIgdG8gYSB1c2VyLXNwZWNpZmllZAorICogYnVmZmVyIGlzIHVzZWQuCisgKiBUaGUgcG9pbnRlciBjYW4gYmUgTlVMTC4gIEluIGFueSBjYXNlIGl0IHdpbGwgYmUgcmVhbGxvY2F0ZWQgdG8gaG9sZCB0aGUgc2l6ZS4KKyAqIElmIHRoZSByZXR1cm5lZCBwb2ludGVyIHdpbGwgYmUgdXNlZCBhZnRlciBzdWJzZXF1ZW50IGNhbGxzIHRvIGZsYWNfZmlmb19yZWFkX3dyYXAKKyAqIHRoZW4gdGhlIHN1YnNlcXVlbnQgY2FsbHMgc2hvdWxkIHBhc3MgaW4gYSBkaWZmZXJlbnQgd3JhcF9idWYgc28gYXMgdG8gbm90CisgKiBvdmVyd3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcmV2aW91cyB3cmFwX2J1Zi4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gYXZfZmlmb19nZW5lcmljX3JlYWQsIHdoaWNoIGlzIHdoeSB0aGVyZSBpcyBhIGNvbW1lbnQKKyAqIGFib3V0IGEgbWVtb3J5IGJhcnJpZXIgZm9yIFNNUC4KKyAqLworc3RhdGljIHVpbnQ4X3QqIGZsYWNfZmlmb19yZWFkX3dyYXAoRkxBQ1BhcnNlQ29udGV4dCAqZnBjLCBpbnQgb2Zmc2V0LCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiB3cmFwX2J1ZiwgaW50KiBhbGxvY2F0ZWRfc2l6ZSkKK3sKKyAgICBBVkZpZm9CdWZmZXIgKmYgICA9IGZwYy0+Zmlmb19idWY7CisgICAgdWludDhfdCAqc3RhcnQgICAgPSBmLT5ycHRyICsgb2Zmc2V0OworICAgIHVpbnQ4X3QgKnRtcF9idWY7CisKKyAgICBpZiAoc3RhcnQgPj0gZi0+ZW5kKQorICAgICAgICBzdGFydCAtPSBmLT5lbmQgLSBmLT5idWZmZXI7CisgICAgaWYgKGYtPmVuZCAtIHN0YXJ0ID49IGxlbikKKyAgICAgICAgcmV0dXJuIHN0YXJ0OworCisgICAgdG1wX2J1ZiA9IGF2X2Zhc3RfcmVhbGxvYygqd3JhcF9idWYsIGFsbG9jYXRlZF9zaXplLCBsZW4pOworCisgICAgaWYgKCF0bXBfYnVmKSB7CisgICAgICAgIGF2X2xvZyhmcGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiY291bGRuJ3QgcmVhbGxvY2F0ZSB3cmFwIGJ1ZmZlciBvZiBzaXplICVkIiwgbGVuKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICp3cmFwX2J1ZiA9IHRtcF9idWY7CisgICAgZG8geworICAgICAgICBpbnQgc2VnX2xlbiA9IEZGTUlOKGYtPmVuZCAtIHN0YXJ0LCBsZW4pOworICAgICAgICBtZW1jcHkodG1wX2J1Ziwgc3RhcnQsIHNlZ19sZW4pOworICAgICAgICB0bXBfYnVmID0gKHVpbnQ4X3QqKXRtcF9idWYgKyBzZWdfbGVuOworLy8gbWVtb3J5IGJhcnJpZXIgbmVlZGVkIGZvciBTTVAgaGVyZSBpbiB0aGVvcnkKKworICAgICAgICBzdGFydCArPSBzZWdfbGVuIC0gKGYtPmVuZCAtIGYtPmJ1ZmZlcik7CisgICAgICAgIGxlbiAtPSBzZWdfbGVuOworICAgIH0gd2hpbGUgKGxlbiA+IDApOworCisgICAgcmV0dXJuICp3cmFwX2J1ZjsKK30KKworLyoqCisgKiBSZXR1cm4gYSBwb2ludGVyIGluIHRoZSBmaWZvIGJ1ZmZlciB3aGVyZSB0aGUgb2Zmc2V0IHN0YXJ0cyBhdCB1bnRpbAorICogdGhlIHdyYXAgcG9pbnQgb3IgZW5kIG9mIHJlcXVlc3QuCisgKiBsZW4gd2lsbCBjb250YWluIHRoZSB2YWxpZCBsZW5ndGggb2YgdGhlIHJldHVybmVkIGJ1ZmZlci4KKyAqIEEgc2Vjb25kIGNhbGwgdG8gZmxhY19maWZvX3JlYWQgKHdpdGggbmV3IG9mZnNldCBhbmQgbGVuKSBzaG91bGQgYmUgY2FsbGVkCisgKiB0byBnZXQgdGhlIHBvc3Qtd3JhcCBidWYgaWYgdGhlIHJldHVybmVkIGxlbiBpcyBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZC4KKyAqKi8KK3N0YXRpYyB1aW50OF90KiBmbGFjX2ZpZm9fcmVhZChGTEFDUGFyc2VDb250ZXh0ICpmcGMsIGludCBvZmZzZXQsIGludCAqbGVuKQoreworICAgIEFWRmlmb0J1ZmZlciAqZiAgID0gZnBjLT5maWZvX2J1ZjsKKyAgICB1aW50OF90ICpzdGFydCAgICA9IGYtPnJwdHIgKyBvZmZzZXQ7CisKKyAgICBpZiAoc3RhcnQgPj0gZi0+ZW5kKQorICAgICAgICBzdGFydCAtPSBmLT5lbmQgLSBmLT5idWZmZXI7CisgICAgKmxlbiA9IEZGTUlOKCpsZW4sIGYtPmVuZCAtIHN0YXJ0KTsKKyAgICByZXR1cm4gc3RhcnQ7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9oZWFkZXJzX3NlYXJjaF92YWxpZGF0ZShGTEFDUGFyc2VDb250ZXh0ICpmcGMsIGludCBvZmZzZXQpCit7CisgICAgRkxBQ0ZyYW1lSW5mbyBmaTsKKyAgICB1aW50OF90ICpoZWFkZXJfYnVmOworICAgIGludCBzaXplID0gMDsKKyAgICBoZWFkZXJfYnVmID0gZmxhY19maWZvX3JlYWRfd3JhcChmcGMsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfRlJBTUVfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZwYy0+d3JhcF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZwYy0+d3JhcF9idWZfYWxsb2NhdGVkX3NpemUpOworICAgIGlmIChmcmFtZV9oZWFkZXJfaXNfdmFsaWQoZnBjLT5hdmN0eCwgaGVhZGVyX2J1ZiwgJmZpKSkgeworICAgICAgICBGTEFDSGVhZGVyTWFya2VyICoqZW5kX2hhbmRsZSA9ICZmcGMtPmhlYWRlcnM7CisgICAgICAgIGludCBpOworCisgICAgICAgIHNpemUgPSAwOworICAgICAgICB3aGlsZSAoKmVuZF9oYW5kbGUpIHsKKyAgICAgICAgICAgIGVuZF9oYW5kbGUgPSAmKCplbmRfaGFuZGxlKS0+bmV4dDsKKyAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgfQorCisgICAgICAgICplbmRfaGFuZGxlID0gYXZfbWFsbG9jeihzaXplb2YoRkxBQ0hlYWRlck1hcmtlcikpOworICAgICAgICBpZiAoISplbmRfaGFuZGxlKSB7CisgICAgICAgICAgICBhdl9sb2coZnBjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCBhbGxvY2F0ZSBGTEFDSGVhZGVyTWFya2VyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgKCplbmRfaGFuZGxlKS0+ZmkgICAgICAgICAgID0gZmk7CisgICAgICAgICgqZW5kX2hhbmRsZSktPm9mZnNldCAgICAgICA9IG9mZnNldDsKKyAgICAgICAgKCplbmRfaGFuZGxlKS0+bGlua19wZW5hbHR5ID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBQ19NQVhfU0VRVUVOVElBTF9IRUFERVJTKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZMQUNfTUFYX1NFUVVFTlRJQUxfSEVBREVSUzsgaSsrKQorICAgICAgICAgICAgKCplbmRfaGFuZGxlKS0+bGlua19wZW5hbHR5W2ldID0gRkxBQ19IRUFERVJfTk9UX1BFTkFMSVpFRF9ZRVQ7CisKKyAgICAgICAgZnBjLT5uYl9oZWFkZXJzX2ZvdW5kKys7CisgICAgICAgIHNpemUrKzsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9oZWFkZXJzX3NlYXJjaChGTEFDUGFyc2VDb250ZXh0ICpmcGMsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWFyY2hfc3RhcnQpCisKK3sKKyAgICBpbnQgc2l6ZSA9IDAsIG1vZF9vZmZzZXQgPSAoYnVmX3NpemUgLSAxKSAlIDQsIGksIGo7CisgICAgdWludDMyX3QgeDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtb2Rfb2Zmc2V0OyBpKyspIHsKKyAgICAgICAgaWYgKChBVl9SQjE2KGJ1ZiArIGkpICYgMHhGRkZFKSA9PSAweEZGRjgpCisgICAgICAgICAgICBzaXplID0gZmluZF9oZWFkZXJzX3NlYXJjaF92YWxpZGF0ZShmcGMsIHNlYXJjaF9zdGFydCArIGkpOworICAgIH0KKworICAgIGZvciAoOyBpIDwgYnVmX3NpemUgLSAxOyBpICs9IDQpIHsKKyAgICAgICAgeCA9IEFWX1JCMzIoYnVmICsgaSk7CisgICAgICAgIGlmICgoKHggJiB+KHggKyAweDAxMDEwMTAxKSkgJiAweDgwODA4MDgwKSkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgIGlmICgoQVZfUkIxNihidWYgKyBpICsgaikgJiAweEZGRkUpID09IDB4RkZGOCkKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGZpbmRfaGVhZGVyc19zZWFyY2hfdmFsaWRhdGUoZnBjLCBzZWFyY2hfc3RhcnQgKyBpICsgaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9uZXdfaGVhZGVycyhGTEFDUGFyc2VDb250ZXh0ICpmcGMsIGludCBzZWFyY2hfc3RhcnQpCit7CisgICAgRkxBQ0hlYWRlck1hcmtlciAqZW5kOworICAgIGludCBzZWFyY2hfZW5kLCBzaXplID0gMCwgcmVhZF9sZW4sIHRlbXA7CisgICAgdWludDhfdCAqYnVmOworICAgIGZwYy0+bmJfaGVhZGVyc19mb3VuZCA9IDA7CisKKyAgICAvKiBTZWFyY2ggZm9yIGEgbmV3IGhlYWRlciBvZiBhdCBtb3N0IDE2IGJ5dGVzLiAqLworICAgIHNlYXJjaF9lbmQgPSBhdl9maWZvX3NpemUoZnBjLT5maWZvX2J1ZikgLSAoTUFYX0ZSQU1FX0hFQURFUl9TSVpFIC0gMSk7CisgICAgcmVhZF9sZW4gICA9IHNlYXJjaF9lbmQgLSBzZWFyY2hfc3RhcnQgKyAxOworICAgIGJ1ZiAgICAgICAgPSBmbGFjX2ZpZm9fcmVhZChmcGMsIHNlYXJjaF9zdGFydCwgJnJlYWRfbGVuKTsKKyAgICBzaXplICAgICAgID0gZmluZF9oZWFkZXJzX3NlYXJjaChmcGMsIGJ1ZiwgcmVhZF9sZW4sIHNlYXJjaF9zdGFydCk7CisgICAgc2VhcmNoX3N0YXJ0ICs9IHJlYWRfbGVuIC0gMTsKKworICAgIC8qIElmIGZpZm8gZW5kIHdhcyBoaXQgZG8gdGhlIHdyYXAgYXJvdW5kLiAqLworICAgIGlmIChzZWFyY2hfc3RhcnQgIT0gc2VhcmNoX2VuZCkgeworICAgICAgICB1aW50OF90IHdyYXBbMl07CisKKyAgICAgICAgd3JhcFswXSAgPSBidWZbcmVhZF9sZW4gLSAxXTsKKyAgICAgICAgcmVhZF9sZW4gPSBzZWFyY2hfZW5kIC0gc2VhcmNoX3N0YXJ0ICsgMTsKKworICAgICAgICAvKiBzZWFyY2hfc3RhcnQgKyAxIGlzIHRoZSBwb3N0LXdyYXAgb2Zmc2V0IGluIHRoZSBmaWZvLiAqLworICAgICAgICBidWYgICAgICA9IGZsYWNfZmlmb19yZWFkKGZwYywgc2VhcmNoX3N0YXJ0ICsgMSwgJnJlYWRfbGVuKTsKKyAgICAgICAgd3JhcFsxXSAgPSBidWZbMF07CisKKyAgICAgICAgaWYgKChBVl9SQjE2KHdyYXApICYgMHhGRkZFKSA9PSAweEZGRjgpIHsKKyAgICAgICAgICAgIHRlbXAgPSBmaW5kX2hlYWRlcnNfc2VhcmNoX3ZhbGlkYXRlKGZwYywgc2VhcmNoX3N0YXJ0KTsKKyAgICAgICAgICAgIHNpemUgPSBGRk1BWChzaXplLCB0ZW1wKTsKKyAgICAgICAgfQorICAgICAgICBzZWFyY2hfc3RhcnQrKzsKKworICAgICAgICAvKiBDb250aW51ZSB0byBkbyB0aGUgbGFzdCBoYWxmIG9mIHRoZSB3cmFwLiAqLworICAgICAgICB0ZW1wICAgICA9IGZpbmRfaGVhZGVyc19zZWFyY2goZnBjLCBidWYsIHJlYWRfbGVuLCBzZWFyY2hfc3RhcnQpOworICAgICAgICBzaXplICAgICA9IEZGTUFYKHNpemUsIHRlbXApOworICAgICAgICBzZWFyY2hfc3RhcnQgKz0gcmVhZF9sZW4gLSAxOworICAgIH0KKworICAgIC8qIFJldHVybiB0aGUgc2l6ZSBldmVuIGlmIG5vIG5ldyBoZWFkZXJzIHdlcmUgZm91bmQuICovCisgICAgaWYgKCFzaXplICYmIGZwYy0+aGVhZGVycykKKyAgICAgICAgZm9yIChlbmQgPSBmcGMtPmhlYWRlcnM7IGVuZDsgZW5kID0gZW5kLT5uZXh0KQorICAgICAgICAgICAgc2l6ZSsrOworICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGNoZWNrX2hlYWRlcl9maV9taXNtYXRjaChGTEFDUGFyc2VDb250ZXh0ICAqZnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBQ0ZyYW1lSW5mbyAgICAgKmhlYWRlcl9maSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQUNGcmFtZUluZm8gICAgICpjaGlsZF9maSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsb2dfbGV2ZWxfb2Zmc2V0KQoreworICAgIGludCBkZWR1Y3Rpb24gPSAwOworICAgIGlmIChjaGlsZF9maS0+c2FtcGxlcmF0ZSAhPSBoZWFkZXJfZmktPnNhbXBsZXJhdGUpIHsKKyAgICAgICAgZGVkdWN0aW9uICs9IEZMQUNfSEVBREVSX0NIQU5HRURfUEVOQUxUWTsKKyAgICAgICAgYXZfbG9nKGZwYy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HICsgbG9nX2xldmVsX29mZnNldCwKKyAgICAgICAgICAgICAgICJzYW1wbGUgcmF0ZSBjaGFuZ2UgZGV0ZWN0ZWQgaW4gYWRqYWNlbnQgZnJhbWVzXG4iKTsKKyAgICB9CisgICAgaWYgKGNoaWxkX2ZpLT5icHMgIT0gaGVhZGVyX2ZpLT5icHMpIHsKKyAgICAgICAgZGVkdWN0aW9uICs9IEZMQUNfSEVBREVSX0NIQU5HRURfUEVOQUxUWTsKKyAgICAgICAgYXZfbG9nKGZwYy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HICsgbG9nX2xldmVsX29mZnNldCwKKyAgICAgICAgICAgICAgICJiaXRzIHBlciBzYW1wbGUgY2hhbmdlIGRldGVjdGVkIGluIGFkamFjZW50IGZyYW1lc1xuIik7CisgICAgfQorICAgIGlmIChjaGlsZF9maS0+aXNfdmFyX3NpemUgIT0gaGVhZGVyX2ZpLT5pc192YXJfc2l6ZSkgeworICAgICAgICAvKiBDaGFuZ2luZyBibG9ja2luZyBzdHJhdGVneSBub3QgYWxsb3dlZCBwZXIgdGhlIHNwZWMgKi8KKyAgICAgICAgZGVkdWN0aW9uICs9IEZMQUNfSEVBREVSX0JBU0VfU0NPUkU7CisgICAgICAgIGF2X2xvZyhmcGMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORyArIGxvZ19sZXZlbF9vZmZzZXQsCisgICAgICAgICAgICAgICAiYmxvY2tpbmcgc3RyYXRlZ3kgY2hhbmdlIGRldGVjdGVkIGluIGFkamFjZW50IGZyYW1lc1xuIik7CisgICAgfQorICAgIGlmIChjaGlsZF9maS0+Y2hhbm5lbHMgIT0gaGVhZGVyX2ZpLT5jaGFubmVscykgeworICAgICAgICBkZWR1Y3Rpb24gKz0gRkxBQ19IRUFERVJfQ0hBTkdFRF9QRU5BTFRZOworICAgICAgICBhdl9sb2coZnBjLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcgKyBsb2dfbGV2ZWxfb2Zmc2V0LAorICAgICAgICAgICAgICAgIm51bWJlciBvZiBjaGFubmVscyBjaGFuZ2UgZGV0ZWN0ZWQgaW4gYWRqYWNlbnQgZnJhbWVzXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIGRlZHVjdGlvbjsKK30KKworc3RhdGljIGludCBjaGVja19oZWFkZXJfbWlzbWF0Y2goRkxBQ1BhcnNlQ29udGV4dCAgKmZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQUNIZWFkZXJNYXJrZXIgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFDSGVhZGVyTWFya2VyICAqY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbG9nX2xldmVsX29mZnNldCkKK3sKKyAgICBGTEFDRnJhbWVJbmZvICAqaGVhZGVyX2ZpID0gJmhlYWRlci0+ZmksICpjaGlsZF9maSA9ICZjaGlsZC0+Zmk7CisgICAgaW50IGRlZHVjdGlvbiwgZGVkdWN0aW9uX2V4cGVjdGVkID0gMCwgaTsKKyAgICBkZWR1Y3Rpb24gPSBjaGVja19oZWFkZXJfZmlfbWlzbWF0Y2goZnBjLCBoZWFkZXJfZmksIGNoaWxkX2ZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbGV2ZWxfb2Zmc2V0KTsKKyAgICAvKiBDaGVjayBzYW1wbGUgYW5kIGZyYW1lIG51bWJlcnMuICovCisgICAgaWYgKChjaGlsZF9maS0+ZnJhbWVfb3Jfc2FtcGxlX251bSAtIGhlYWRlcl9maS0+ZnJhbWVfb3Jfc2FtcGxlX251bQorICAgICAgICAgIT0gaGVhZGVyX2ZpLT5ibG9ja3NpemUpICYmCisgICAgICAgIChjaGlsZF9maS0+ZnJhbWVfb3Jfc2FtcGxlX251bQorICAgICAgICAgIT0gaGVhZGVyX2ZpLT5mcmFtZV9vcl9zYW1wbGVfbnVtICsgMSkpIHsKKyAgICAgICAgRkxBQ0hlYWRlck1hcmtlciAqY3VycjsKKyAgICAgICAgaW50IGV4cGVjdGVkX2ZyYW1lX251bSwgZXhwZWN0ZWRfc2FtcGxlX251bTsKKyAgICAgICAgLyogSWYgdGhlcmUgYXJlIGZyYW1lcyBpbiB0aGUgbWlkZGxlIHdlIGV4cGVjdCB0aGlzIGRlZHVjdGlvbiwKKyAgICAgICAgICAgYXMgdGhleSBhcmUgcHJvYmFibHkgdmFsaWQgYW5kIHRoaXMgb25lIGZvbGxvd3MgaXQgKi8KKworICAgICAgICBleHBlY3RlZF9mcmFtZV9udW0gPSBleHBlY3RlZF9zYW1wbGVfbnVtID0gaGVhZGVyX2ZpLT5mcmFtZV9vcl9zYW1wbGVfbnVtOworICAgICAgICBjdXJyID0gaGVhZGVyOworICAgICAgICB3aGlsZSAoY3VyciAhPSBjaGlsZCkgeworICAgICAgICAgICAgLyogSWdub3JlIGZyYW1lcyB0aGF0IGZhaWxlZCBhbGwgY3JjIGNoZWNrcyAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZMQUNfTUFYX1NFUVVFTlRJQUxfSEVBREVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnItPmxpbmtfcGVuYWx0eVtpXSA8IEZMQUNfSEVBREVSX0NSQ19GQUlMX1BFTkFMVFkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZnJhbWVfbnVtKys7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3NhbXBsZV9udW0gKz0gY3Vyci0+ZmkuYmxvY2tzaXplOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyID0gY3Vyci0+bmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHBlY3RlZF9mcmFtZV9udW0gID09IGNoaWxkX2ZpLT5mcmFtZV9vcl9zYW1wbGVfbnVtIHx8CisgICAgICAgICAgICBleHBlY3RlZF9zYW1wbGVfbnVtID09IGNoaWxkX2ZpLT5mcmFtZV9vcl9zYW1wbGVfbnVtKQorICAgICAgICAgICAgZGVkdWN0aW9uX2V4cGVjdGVkID0gZGVkdWN0aW9uID8gMCA6IDE7CisKKyAgICAgICAgZGVkdWN0aW9uICs9IEZMQUNfSEVBREVSX0NIQU5HRURfUEVOQUxUWTsKKyAgICAgICAgYXZfbG9nKGZwYy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HICsgbG9nX2xldmVsX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAic2FtcGxlL2ZyYW1lIG51bWJlciBtaXNtYXRjaCBpbiBhZGphY2VudCBmcmFtZXNcbiIpOworICAgIH0KKworICAgIC8qIElmIHdlIGhhdmUgc3VzcGljaW91cyBoZWFkZXJzLCBjaGVjayB0aGUgQ1JDIGJldHdlZW4gdGhlbSAqLworICAgIGlmIChkZWR1Y3Rpb24gJiYgIWRlZHVjdGlvbl9leHBlY3RlZCkgeworICAgICAgICBGTEFDSGVhZGVyTWFya2VyICpjdXJyOworICAgICAgICBpbnQgcmVhZF9sZW47CisgICAgICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICAgICAgdWludDMyX3QgY3JjID0gMTsKKyAgICAgICAgaW50IGludmVydGVkX3Rlc3QgPSAwOworCisgICAgICAgIC8qIFNpbmNlIENSQyBpcyBleHBlbnNpdmUgb25seSBkbyBpdCBpZiB3ZSBoYXZlbid0IHlldC4KKyAgICAgICAgICAgVGhpcyBhc3N1bWVzIGEgQ1JDIHBlbmFsdHkgaXMgZ3JlYXRlciB0aGFuIGFsbCBvdGhlciBjaGVjayBwZW5hbHRpZXMgKi8KKyAgICAgICAgY3VyciA9IGhlYWRlci0+bmV4dDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZMQUNfTUFYX1NFUVVFTlRJQUxfSEVBREVSUyAmJiBjdXJyICE9IGNoaWxkOyBpKyspCisgICAgICAgICAgICBjdXJyID0gY3Vyci0+bmV4dDsKKworICAgICAgICBpZiAoaGVhZGVyLT5saW5rX3BlbmFsdHlbaV0gPCBGTEFDX0hFQURFUl9DUkNfRkFJTF9QRU5BTFRZIHx8CisgICAgICAgICAgICBoZWFkZXItPmxpbmtfcGVuYWx0eVtpXSA9PSBGTEFDX0hFQURFUl9OT1RfUEVOQUxJWkVEX1lFVCkgeworICAgICAgICAgICAgRkxBQ0hlYWRlck1hcmtlciAqc3RhcnQsICplbmQ7CisKKyAgICAgICAgICAgIC8qIEFsdGhvdWdoIG92ZXJsYXBwaW5nIGNoYWlucyBhcmUgc2NvcmVkLCB0aGUgY3JjIHNob3VsZCBuZXZlcgorICAgICAgICAgICAgICAgaGF2ZSB0byBiZSBjb21wdXRlZCB0d2ljZSBmb3IgYSBzaW5nbGUgYnl0ZS4gKi8KKyAgICAgICAgICAgIHN0YXJ0ID0gaGVhZGVyOworICAgICAgICAgICAgZW5kICAgPSBjaGlsZDsKKyAgICAgICAgICAgIGlmIChpID4gMCAmJgorICAgICAgICAgICAgICAgIGhlYWRlci0+bGlua19wZW5hbHR5W2kgLSAxXSA+PSBGTEFDX0hFQURFUl9DUkNfRkFJTF9QRU5BTFRZKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHN0YXJ0LT5uZXh0ICE9IGNoaWxkKQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0LT5uZXh0OworICAgICAgICAgICAgICAgIGludmVydGVkX3Rlc3QgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChpID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPm5leHQtPmxpbmtfcGVuYWx0eVtpLTFdID49CisgICAgICAgICAgICAgICAgICAgICAgIEZMQUNfSEVBREVSX0NSQ19GQUlMX1BFTkFMVFkgKSB7CisgICAgICAgICAgICAgICAgZW5kID0gaGVhZGVyLT5uZXh0OworICAgICAgICAgICAgICAgIGludmVydGVkX3Rlc3QgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWFkX2xlbiA9IGVuZC0+b2Zmc2V0IC0gc3RhcnQtPm9mZnNldDsKKyAgICAgICAgICAgIGJ1ZiAgICAgID0gZmxhY19maWZvX3JlYWQoZnBjLCBzdGFydC0+b2Zmc2V0LCAmcmVhZF9sZW4pOworICAgICAgICAgICAgY3JjICAgICAgPSBhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMTZfQU5TSSksIDAsIGJ1ZiwgcmVhZF9sZW4pOworICAgICAgICAgICAgcmVhZF9sZW4gPSAoZW5kLT5vZmZzZXQgLSBzdGFydC0+b2Zmc2V0KSAtIHJlYWRfbGVuOworCisgICAgICAgICAgICBpZiAocmVhZF9sZW4pIHsKKyAgICAgICAgICAgICAgICBidWYgPSBmbGFjX2ZpZm9fcmVhZChmcGMsIGVuZC0+b2Zmc2V0IC0gcmVhZF9sZW4sICZyZWFkX2xlbik7CisgICAgICAgICAgICAgICAgY3JjID0gYXZfY3JjKGF2X2NyY19nZXRfdGFibGUoQVZfQ1JDXzE2X0FOU0kpLCBjcmMsIGJ1ZiwgcmVhZF9sZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjcmMgXiAhaW52ZXJ0ZWRfdGVzdCkgeworICAgICAgICAgICAgZGVkdWN0aW9uICs9IEZMQUNfSEVBREVSX0NSQ19GQUlMX1BFTkFMVFk7CisgICAgICAgICAgICBhdl9sb2coZnBjLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcgKyBsb2dfbGV2ZWxfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICJjcmMgY2hlY2sgZmFpbGVkIGZyb20gb2Zmc2V0ICVpIChmcmFtZSAlIlBSSWQ2NCIpIHRvICVpIChmcmFtZSAlIlBSSWQ2NCIpXG4iLAorICAgICAgICAgICAgICAgICAgIGhlYWRlci0+b2Zmc2V0LCBoZWFkZXJfZmktPmZyYW1lX29yX3NhbXBsZV9udW0sCisgICAgICAgICAgICAgICAgICAgY2hpbGQtPm9mZnNldCwgY2hpbGRfZmktPmZyYW1lX29yX3NhbXBsZV9udW0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZWR1Y3Rpb247Cit9CisKKy8qKgorICogU2NvcmUgYSBoZWFkZXIuCisgKgorICogR2l2ZSBGTEFDX0hFQURFUl9CQVNFX1NDT1JFIHBvaW50cyB0byBhIGZyYW1lIGZvciBleGlzdGluZy4KKyAqIElmIGl0IGhhcyBjaGlsZHJlbiwgKHN1YnNlcXVlbnQgZnJhbWVzIG9mIHdoaWNoIHRoZSBwcmVjZWRpbmcgQ1JDIGZvb3RlcgorICogdmFsaWRhdGVzIGFnYWluc3QgdGhpcyBvbmUsKSB0aGVuIHRha2UgdGhlIG1heGltdW0gc2NvcmUgb2YgdGhlIGNoaWxkcmVuLAorICogd2l0aCBhIHBlbmFsdHkgb2YgRkxBQ19IRUFERVJfQ0hBTkdFRF9QRU5BTFRZIGFwcGxpZWQgZm9yIGVhY2ggY2hhbmdlIHRvCisgKiBicHMsIHNhbXBsZSByYXRlLCBjaGFubmVscywgYnV0IG5vdCBkZWNvcnJlbGF0aW9uIG1vZGUsIG9yIGJsb2Nrc2l6ZSwKKyAqIGJlY2F1c2UgaXQgY2FuIGNoYW5nZSBvZnRlbi4KKyAqKi8KK3N0YXRpYyBpbnQgc2NvcmVfaGVhZGVyKEZMQUNQYXJzZUNvbnRleHQgKmZwYywgRkxBQ0hlYWRlck1hcmtlciAqaGVhZGVyKQoreworICAgIEZMQUNIZWFkZXJNYXJrZXIgKmNoaWxkOworICAgIGludCBkaXN0ID0gMDsKKyAgICBpbnQgY2hpbGRfc2NvcmU7CisgICAgaW50IGJhc2Vfc2NvcmUgPSBGTEFDX0hFQURFUl9CQVNFX1NDT1JFOworICAgIGlmIChoZWFkZXItPm1heF9zY29yZSAhPSBGTEFDX0hFQURFUl9OT1RfU0NPUkVEX1lFVCkKKyAgICAgICAgcmV0dXJuIGhlYWRlci0+bWF4X3Njb3JlOworCisgICAgLyogTW9kaWZ5IHRoZSBiYXNlIHNjb3JlIHdpdGggY2hhbmdlcyBmcm9tIHRoZSBsYXN0IG91dHB1dCBoZWFkZXIgKi8KKyAgICBpZiAoZnBjLT5sYXN0X2ZpX3ZhbGlkKSB7CisgICAgICAgIC8qIFNpbGVuY2UgdGhlIGxvZyBzaW5jZSB0aGlzIHdpbGwgYmUgcmVwZWF0ZWQgaWYgc2VsZWN0ZWQgKi8KKyAgICAgICAgYmFzZV9zY29yZSAtPSBjaGVja19oZWFkZXJfZmlfbWlzbWF0Y2goZnBjLCAmZnBjLT5sYXN0X2ZpLCAmaGVhZGVyLT5maSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTE9HX0RFQlVHKTsKKyAgICB9CisKKyAgICBoZWFkZXItPm1heF9zY29yZSA9IGJhc2Vfc2NvcmU7CisKKyAgICAvKiBDaGVjayBhbmQgY29tcHV0ZSB0aGUgY2hpbGRyZW4ncyBzY29yZXMuICovCisgICAgY2hpbGQgPSBoZWFkZXItPm5leHQ7CisgICAgZm9yIChkaXN0ID0gMDsgZGlzdCA8IEZMQUNfTUFYX1NFUVVFTlRJQUxfSEVBREVSUyAmJiBjaGlsZDsgZGlzdCsrKSB7CisgICAgICAgIC8qIExvb2sgYXQgdGhlIGNoaWxkJ3MgZnJhbWUgaGVhZGVyIGluZm8gYW5kIHBlbmFsaXplIHN1c3BpY2lvdXMKKyAgICAgICAgICAgY2hhbmdlcyBiZXR3ZWVuIHRoZSBoZWFkZXJzLiAqLworICAgICAgICBpZiAoaGVhZGVyLT5saW5rX3BlbmFsdHlbZGlzdF0gPT0gRkxBQ19IRUFERVJfTk9UX1BFTkFMSVpFRF9ZRVQpIHsKKyAgICAgICAgICAgIGhlYWRlci0+bGlua19wZW5hbHR5W2Rpc3RdID0gY2hlY2tfaGVhZGVyX21pc21hdGNoKGZwYywgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQsIEFWX0xPR19ERUJVRyk7CisgICAgICAgIH0KKyAgICAgICAgY2hpbGRfc2NvcmUgPSBzY29yZV9oZWFkZXIoZnBjLCBjaGlsZCkgLSBoZWFkZXItPmxpbmtfcGVuYWx0eVtkaXN0XTsKKworICAgICAgICBpZiAoRkxBQ19IRUFERVJfQkFTRV9TQ09SRSArIGNoaWxkX3Njb3JlID4gaGVhZGVyLT5tYXhfc2NvcmUpIHsKKyAgICAgICAgICAgIC8qIEtlZXAgdGhlIGNoaWxkIGJlY2F1c2UgdGhlIGZyYW1lIHNjb3JpbmcgaXMgZHluYW1pYy4gKi8KKyAgICAgICAgICAgIGhlYWRlci0+YmVzdF9jaGlsZCA9IGNoaWxkOworICAgICAgICAgICAgaGVhZGVyLT5tYXhfc2NvcmUgID0gYmFzZV9zY29yZSArIGNoaWxkX3Njb3JlOworICAgICAgICB9CisgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIGhlYWRlci0+bWF4X3Njb3JlOworfQorCitzdGF0aWMgdm9pZCBzY29yZV9zZXF1ZW5jZXMoRkxBQ1BhcnNlQ29udGV4dCAqZnBjKQoreworICAgIEZMQUNIZWFkZXJNYXJrZXIgKmN1cnI7CisgICAgaW50IGJlc3Rfc2NvcmUgPSAwOy8vRkxBQ19IRUFERVJfTk9UX1NDT1JFRF9ZRVQ7CisgICAgLyogRmlyc3QgcGFzcyB0byBjbGVhciBhbGwgb2xkIHNjb3Jlcy4gKi8KKyAgICBmb3IgKGN1cnIgPSBmcGMtPmhlYWRlcnM7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0KQorICAgICAgICBjdXJyLT5tYXhfc2NvcmUgPSBGTEFDX0hFQURFUl9OT1RfU0NPUkVEX1lFVDsKKworICAgIC8qIERvIGEgc2Vjb25kIHBhc3MgdG8gc2NvcmUgdGhlbSBhbGwuICovCisgICAgZm9yIChjdXJyID0gZnBjLT5oZWFkZXJzOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dCkgeworICAgICAgICBpZiAoc2NvcmVfaGVhZGVyKGZwYywgY3VycikgPiBiZXN0X3Njb3JlKSB7CisgICAgICAgICAgICBmcGMtPmJlc3RfaGVhZGVyID0gY3VycjsKKyAgICAgICAgICAgIGJlc3Rfc2NvcmUgICAgICAgPSBjdXJyLT5tYXhfc2NvcmU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Jlc3RfaGVhZGVyKEZMQUNQYXJzZUNvbnRleHQqIGZwYywgY29uc3QgdWludDhfdCAqKnBvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBvdXRidWZfc2l6ZSkKK3sKKyAgICBGTEFDSGVhZGVyTWFya2VyICpoZWFkZXIgPSBmcGMtPmJlc3RfaGVhZGVyOworICAgIEZMQUNIZWFkZXJNYXJrZXIgKmNoaWxkICA9IGhlYWRlci0+YmVzdF9jaGlsZDsKKyAgICBpZiAoIWNoaWxkKSB7CisgICAgICAgICpwb3V0YnVmX3NpemUgPSBhdl9maWZvX3NpemUoZnBjLT5maWZvX2J1ZikgLSBoZWFkZXItPm9mZnNldDsKKyAgICB9IGVsc2UgeworICAgICAgICAqcG91dGJ1Zl9zaXplID0gY2hpbGQtPm9mZnNldCAtIGhlYWRlci0+b2Zmc2V0OworCisgICAgICAgIC8qIElmIHRoZSBjaGlsZCBoYXMgc3VzcGljaW91cyBjaGFuZ2VzLCBsb2cgdGhlbSAqLworICAgICAgICBjaGVja19oZWFkZXJfbWlzbWF0Y2goZnBjLCBoZWFkZXIsIGNoaWxkLCAwKTsKKyAgICB9CisKKyAgICBpZiAoaGVhZGVyLT5maS5jaGFubmVscyAhPSBmcGMtPmF2Y3R4LT5jaGFubmVscyB8fAorICAgICAgICAhZnBjLT5hdmN0eC0+Y2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgZnBjLT5hdmN0eC0+Y2hhbm5lbHMgPSBoZWFkZXItPmZpLmNoYW5uZWxzOworICAgICAgICBmZl9mbGFjX3NldF9jaGFubmVsX2xheW91dChmcGMtPmF2Y3R4KTsKKyAgICB9CisgICAgZnBjLT5hdmN0eC0+c2FtcGxlX3JhdGUgPSBoZWFkZXItPmZpLnNhbXBsZXJhdGU7CisgICAgZnBjLT5wYy0+ZHVyYXRpb24gICAgICAgPSBoZWFkZXItPmZpLmJsb2Nrc2l6ZTsKKyAgICAqcG91dGJ1ZiA9IGZsYWNfZmlmb19yZWFkX3dyYXAoZnBjLCBoZWFkZXItPm9mZnNldCwgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnBjLT53cmFwX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnBjLT53cmFwX2J1Zl9hbGxvY2F0ZWRfc2l6ZSk7CisKKworICAgIGlmIChmcGMtPnBjLT5mbGFncyAmIFBBUlNFUl9GTEFHX1VTRV9DT0RFQ19UUyl7CisgICAgICAgIGlmIChoZWFkZXItPmZpLmlzX3Zhcl9zaXplKQorICAgICAgICAgIGZwYy0+cGMtPnB0cyA9IGhlYWRlci0+ZmkuZnJhbWVfb3Jfc2FtcGxlX251bTsKKyAgICAgICAgZWxzZSBpZiAoaGVhZGVyLT5iZXN0X2NoaWxkKQorICAgICAgICAgIGZwYy0+cGMtPnB0cyA9IGhlYWRlci0+ZmkuZnJhbWVfb3Jfc2FtcGxlX251bSAqIGhlYWRlci0+ZmkuYmxvY2tzaXplOworICAgIH0KKworICAgIGZwYy0+YmVzdF9oZWFkZXJfdmFsaWQgPSAwOworICAgIGZwYy0+bGFzdF9maV92YWxpZCA9IDE7CisgICAgZnBjLT5sYXN0X2ZpID0gaGVhZGVyLT5maTsKKworICAgIC8qIFJldHVybiB0aGUgbmVnYXRpdmUgb3ZlcnJlYWQgaW5kZXggc28gdGhlIGNsaWVudCBjYW4gY29tcHV0ZSBwb3MuCisgICAgICAgVGhpcyBzaG91bGQgYmUgdGhlIGFtb3VudCBvdmVycmVhZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaGlsZCAqLworICAgIGlmIChjaGlsZCkKKyAgICAgICAgcmV0dXJuIGNoaWxkLT5vZmZzZXQgLSBhdl9maWZvX3NpemUoZnBjLT5maWZvX2J1Zik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmxhY19wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBGTEFDUGFyc2VDb250ZXh0ICpmcGMgPSBzLT5wcml2X2RhdGE7CisgICAgRkxBQ0hlYWRlck1hcmtlciAqY3VycjsKKyAgICBpbnQgbmJfaGVhZGVyczsKKyAgICBjb25zdCB1aW50OF90ICpyZWFkX2VuZCAgID0gYnVmOworICAgIGNvbnN0IHVpbnQ4X3QgKnJlYWRfc3RhcnQgPSBidWY7CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVMpIHsKKyAgICAgICAgRkxBQ0ZyYW1lSW5mbyBmaTsKKyAgICAgICAgaWYgKGZyYW1lX2hlYWRlcl9pc192YWxpZChhdmN0eCwgYnVmLCAmZmkpKSB7CisgICAgICAgICAgICBzLT5kdXJhdGlvbiA9IGZpLmJsb2Nrc2l6ZTsKKyAgICAgICAgICAgIGlmICghYXZjdHgtPnNhbXBsZV9yYXRlKQorICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IGZpLnNhbXBsZXJhdGU7CisgICAgICAgICAgICBpZiAoZnBjLT5wYy0+ZmxhZ3MgJiBQQVJTRVJfRkxBR19VU0VfQ09ERUNfVFMpeworICAgICAgICAgICAgICAgIGZwYy0+cGMtPnB0cyA9IGZpLmZyYW1lX29yX3NhbXBsZV9udW07CisgICAgICAgICAgICAgICAgaWYgKCFmaS5pc192YXJfc2l6ZSkKKyAgICAgICAgICAgICAgICAgIGZwYy0+cGMtPnB0cyAqPSBmaS5ibG9ja3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKnBvdXRidWYgICAgICA9IGJ1ZjsKKyAgICAgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgZnBjLT5hdmN0eCA9IGF2Y3R4OworICAgIGlmIChmcGMtPmJlc3RfaGVhZGVyX3ZhbGlkKQorICAgICAgICByZXR1cm4gZ2V0X2Jlc3RfaGVhZGVyKGZwYywgcG91dGJ1ZiwgcG91dGJ1Zl9zaXplKTsKKworICAgIC8qIElmIGEgYmVzdF9oZWFkZXIgd2FzIGZvdW5kIGxhc3QgY2FsbCByZW1vdmUgaXQgd2l0aCB0aGUgYnVmZmVyIGRhdGEuICovCisgICAgaWYgKGZwYy0+YmVzdF9oZWFkZXIgJiYgZnBjLT5iZXN0X2hlYWRlci0+YmVzdF9jaGlsZCkgeworICAgICAgICBGTEFDSGVhZGVyTWFya2VyICp0ZW1wOworICAgICAgICBGTEFDSGVhZGVyTWFya2VyICpiZXN0X2NoaWxkID0gZnBjLT5iZXN0X2hlYWRlci0+YmVzdF9jaGlsZDsKKworICAgICAgICAvKiBSZW1vdmUgaGVhZGVycyBpbiBsaXN0IHVudGlsIHRoZSBlbmQgb2YgdGhlIGJlc3RfaGVhZGVyLiAqLworICAgICAgICBmb3IgKGN1cnIgPSBmcGMtPmhlYWRlcnM7IGN1cnIgIT0gYmVzdF9jaGlsZDsgY3VyciA9IHRlbXApIHsKKyAgICAgICAgICAgIGlmIChjdXJyICE9IGZwYy0+YmVzdF9oZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgImRyb3BwaW5nIGxvdyBzY29yZSAlaSBmcmFtZSBoZWFkZXIgZnJvbSBvZmZzZXQgJWkgdG8gJWlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGN1cnItPm1heF9zY29yZSwgY3Vyci0+b2Zmc2V0LCBjdXJyLT5uZXh0LT5vZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcCA9IGN1cnItPm5leHQ7CisgICAgICAgICAgICBhdl9mcmVlcCgmY3Vyci0+bGlua19wZW5hbHR5KTsKKyAgICAgICAgICAgIGF2X2ZyZWUoY3Vycik7CisgICAgICAgICAgICBmcGMtPm5iX2hlYWRlcnNfYnVmZmVyZWQtLTsKKyAgICAgICAgfQorICAgICAgICAvKiBSZWxlYXNlIHJldHVybmVkIGRhdGEgZnJvbSByaW5nIGJ1ZmZlci4gKi8KKyAgICAgICAgYXZfZmlmb19kcmFpbihmcGMtPmZpZm9fYnVmLCBiZXN0X2NoaWxkLT5vZmZzZXQpOworCisgICAgICAgIC8qIEZpeCB0aGUgb2Zmc2V0IGZvciB0aGUgaGVhZGVycyByZW1haW5pbmcgdG8gbWF0Y2ggdGhlIG5ldyBidWZmZXIuICovCisgICAgICAgIGZvciAoY3VyciA9IGJlc3RfY2hpbGQtPm5leHQ7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0KQorICAgICAgICAgICAgY3Vyci0+b2Zmc2V0IC09IGJlc3RfY2hpbGQtPm9mZnNldDsKKworICAgICAgICBmcGMtPm5iX2hlYWRlcnNfYnVmZmVyZWQtLTsKKyAgICAgICAgYmVzdF9jaGlsZC0+b2Zmc2V0ID0gMDsKKyAgICAgICAgZnBjLT5oZWFkZXJzICAgICAgID0gYmVzdF9jaGlsZDsKKyAgICAgICAgaWYgKGZwYy0+bmJfaGVhZGVyc19idWZmZXJlZCA+PSBGTEFDX01JTl9IRUFERVJTKSB7CisgICAgICAgICAgICBmcGMtPmJlc3RfaGVhZGVyID0gYmVzdF9jaGlsZDsKKyAgICAgICAgICAgIHJldHVybiBnZXRfYmVzdF9oZWFkZXIoZnBjLCBwb3V0YnVmLCBwb3V0YnVmX3NpemUpOworICAgICAgICB9CisgICAgICAgIGZwYy0+YmVzdF9oZWFkZXIgICA9IE5VTEw7CisgICAgfSBlbHNlIGlmIChmcGMtPmJlc3RfaGVhZGVyKSB7CisgICAgICAgIC8qIE5vIGVuZCBmcmFtZSBubyBuZWVkIHRvIGRlbGV0ZSB0aGUgYnVmZmVyOyBwcm9iYWJseSBlb2YgKi8KKyAgICAgICAgRkxBQ0hlYWRlck1hcmtlciAqdGVtcDsKKworICAgICAgICBmb3IgKGN1cnIgPSBmcGMtPmhlYWRlcnM7IGN1cnIgIT0gZnBjLT5iZXN0X2hlYWRlcjsgY3VyciA9IHRlbXApIHsKKyAgICAgICAgICAgIHRlbXAgPSBjdXJyLT5uZXh0OworICAgICAgICAgICAgYXZfZnJlZXAoJmN1cnItPmxpbmtfcGVuYWx0eSk7CisgICAgICAgICAgICBhdl9mcmVlKGN1cnIpOworICAgICAgICB9CisgICAgICAgIGZwYy0+aGVhZGVycyA9IGZwYy0+YmVzdF9oZWFkZXItPm5leHQ7CisgICAgICAgIGF2X2ZyZWVwKCZmcGMtPmJlc3RfaGVhZGVyLT5saW5rX3BlbmFsdHkpOworICAgICAgICBhdl9mcmVlcCgmZnBjLT5iZXN0X2hlYWRlcik7CisgICAgfQorCisgICAgLyogRmluZCBhbmQgc2NvcmUgbmV3IGhlYWRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogYnVmX3NpemUgaXMgdG8gemVybyB3aGVuIHBhZGRpbmcsIHNvIGNoZWNrIGZvciB0aGlzIHNpbmNlIHdlIGRvICovCisgICAgLyogbm90IHdhbnQgdG8gdHJ5IHRvIHJlYWQgbW9yZSBpbnB1dCBvbmNlIHdlIGhhdmUgZm91bmQgdGhlIGVuZC4gICovCisgICAgLyogTm90ZSB0aGF0IGFzIChub24tbW9kaWZpZWQpIHBhcmFtZXRlcnMsIGJ1ZiBjYW4gYmUgbm9uLU5VTEwsICAgICovCisgICAgLyogd2hpbGUgYnVmX3NpemUgaXMgMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgd2hpbGUgKChidWYgJiYgYnVmX3NpemUgJiYgcmVhZF9lbmQgPCBidWYgKyBidWZfc2l6ZSAmJgorICAgICAgICAgICAgZnBjLT5uYl9oZWFkZXJzX2J1ZmZlcmVkIDwgRkxBQ19NSU5fSEVBREVSUykKKyAgICAgICAgICAgfHwgKCghYnVmIHx8ICFidWZfc2l6ZSkgJiYgIWZwYy0+ZW5kX3BhZGRlZCkpIHsKKyAgICAgICAgaW50IHN0YXJ0X29mZnNldDsKKworICAgICAgICAvKiBQYWQgdGhlIGVuZCBvbmNlIGlmIEVPRiwgdG8gY2hlY2sgdGhlIGZpbmFsIHJlZ2lvbiBmb3IgaGVhZGVycy4gKi8KKyAgICAgICAgaWYgKCFidWYgfHwgIWJ1Zl9zaXplKSB7CisgICAgICAgICAgICBmcGMtPmVuZF9wYWRkZWQgICAgICA9IDE7CisgICAgICAgICAgICBidWZfc2l6ZSA9IE1BWF9GUkFNRV9IRUFERVJfU0laRTsKKyAgICAgICAgICAgIHJlYWRfZW5kID0gcmVhZF9zdGFydCArIE1BWF9GUkFNRV9IRUFERVJfU0laRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoZSBtYXhpbXVtIHJlYWQgc2l6ZSBpcyB0aGUgdXBwZXItYm91bmQgb2Ygd2hhdCB0aGUgcGFyc2VyCisgICAgICAgICAgICAgICBuZWVkcyB0byBoYXZlIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgZnJhbWVzIGJ1ZmZlcmVkICovCisgICAgICAgICAgICBpbnQgbmJfZGVzaXJlZCA9IEZMQUNfTUlOX0hFQURFUlMgLSBmcGMtPm5iX2hlYWRlcnNfYnVmZmVyZWQgKyAxOworICAgICAgICAgICAgcmVhZF9lbmQgICAgICAgPSByZWFkX2VuZCArIEZGTUlOKGJ1ZiArIGJ1Zl9zaXplIC0gcmVhZF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfZGVzaXJlZCAqIEZMQUNfQVZHX0ZSQU1FX1NJWkUpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmlsbCB0aGUgYnVmZmVyLiAqLworICAgICAgICBpZiAoICAgYXZfZmlmb19zcGFjZShmcGMtPmZpZm9fYnVmKSA8IHJlYWRfZW5kIC0gcmVhZF9zdGFydAorICAgICAgICAgICAgJiYgYXZfZmlmb19yZWFsbG9jMihmcGMtPmZpZm9fYnVmLCAocmVhZF9lbmQgLSByZWFkX3N0YXJ0KSArIDIqYXZfZmlmb19zaXplKGZwYy0+Zmlmb19idWYpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCByZWFsbG9jYXRlIGJ1ZmZlciBvZiBzaXplICUiUFRSRElGRl9TUEVDSUZJRVIiXG4iLAorICAgICAgICAgICAgICAgICAgIChyZWFkX2VuZCAtIHJlYWRfc3RhcnQpICsgYXZfZmlmb19zaXplKGZwYy0+Zmlmb19idWYpKTsKKyAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ1ZiAmJiBidWZfc2l6ZSkgeworICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGZwYy0+Zmlmb19idWYsICh2b2lkKikgcmVhZF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2VuZCAtIHJlYWRfc3RhcnQsIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50OF90IHBhZFtNQVhfRlJBTUVfSEVBREVSX1NJWkVdID0geyAwIH07CisgICAgICAgICAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoZnBjLT5maWZvX2J1ZiwgKHZvaWQqKSBwYWQsIHNpemVvZihwYWQpLCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRhZyBoZWFkZXJzIGFuZCB1cGRhdGUgc2VxdWVuY2VzLiAqLworICAgICAgICBzdGFydF9vZmZzZXQgPSBhdl9maWZvX3NpemUoZnBjLT5maWZvX2J1ZikgLQorICAgICAgICAgICAgICAgICAgICAgICAoKHJlYWRfZW5kIC0gcmVhZF9zdGFydCkgKyAoTUFYX0ZSQU1FX0hFQURFUl9TSVpFIC0gMSkpOworICAgICAgICBzdGFydF9vZmZzZXQgPSBGRk1BWCgwLCBzdGFydF9vZmZzZXQpOworICAgICAgICBuYl9oZWFkZXJzICAgPSBmaW5kX25ld19oZWFkZXJzKGZwYywgc3RhcnRfb2Zmc2V0KTsKKworICAgICAgICBpZiAobmJfaGVhZGVycyA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJmaW5kX25ld19oZWFkZXJzIGNvdWxkbid0IGFsbG9jYXRlIEZMQUMgaGVhZGVyXG4iKTsKKyAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOworICAgICAgICB9CisKKyAgICAgICAgZnBjLT5uYl9oZWFkZXJzX2J1ZmZlcmVkID0gbmJfaGVhZGVyczsKKyAgICAgICAgLyogV2FpdCB0aWxsIEZMQUNfTUlOX0hFQURFUlMgdG8gb3V0cHV0IGEgdmFsaWQgZnJhbWUuICovCisgICAgICAgIGlmICghZnBjLT5lbmRfcGFkZGVkICYmIGZwYy0+bmJfaGVhZGVyc19idWZmZXJlZCA8IEZMQUNfTUlOX0hFQURFUlMpIHsKKyAgICAgICAgICAgIGlmIChidWYgJiYgcmVhZF9lbmQgPCBidWYgKyBidWZfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJlYWRfc3RhcnQgPSByZWFkX2VuZDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiBoZWFkZXJzIGZvdW5kLCB1cGRhdGUgdGhlIHNjb3JlcyBzaW5jZSB3ZSBoYXZlIGxvbmdlciBjaGFpbnMuICovCisgICAgICAgIGlmIChmcGMtPmVuZF9wYWRkZWQgfHwgZnBjLT5uYl9oZWFkZXJzX2ZvdW5kKQorICAgICAgICAgICAgc2NvcmVfc2VxdWVuY2VzKGZwYyk7CisKKyAgICAgICAgLyogcmVzdG9yZSB0aGUgc3RhdGUgcHJlLXBhZGRpbmcgKi8KKyAgICAgICAgaWYgKGZwYy0+ZW5kX3BhZGRlZCkgeworICAgICAgICAgICAgaW50IHdhcnAgPSBmcGMtPmZpZm9fYnVmLT53cHRyIC0gZnBjLT5maWZvX2J1Zi0+YnVmZmVyIDwgTUFYX0ZSQU1FX0hFQURFUl9TSVpFOworICAgICAgICAgICAgLyogSEFDSzogZHJhaW4gdGhlIHRhaWwgb2YgdGhlIGZpZm8gKi8KKyAgICAgICAgICAgIGZwYy0+Zmlmb19idWYtPndwdHIgLT0gTUFYX0ZSQU1FX0hFQURFUl9TSVpFOworICAgICAgICAgICAgZnBjLT5maWZvX2J1Zi0+d25keCAtPSBNQVhfRlJBTUVfSEVBREVSX1NJWkU7CisgICAgICAgICAgICBpZiAod2FycCkgeworICAgICAgICAgICAgICAgIGZwYy0+Zmlmb19idWYtPndwdHIgKz0gZnBjLT5maWZvX2J1Zi0+ZW5kIC0KKyAgICAgICAgICAgICAgICAgICAgZnBjLT5maWZvX2J1Zi0+YnVmZmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmX3NpemUgPSAwOworICAgICAgICAgICAgcmVhZF9zdGFydCA9IHJlYWRfZW5kID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY3VyciA9IGZwYy0+aGVhZGVyczsgY3VycjsgY3VyciA9IGN1cnItPm5leHQpIHsKKyAgICAgICAgaWYgKGN1cnItPm1heF9zY29yZSA+IDAgJiYKKyAgICAgICAgICAgICghZnBjLT5iZXN0X2hlYWRlciB8fCBjdXJyLT5tYXhfc2NvcmUgPiBmcGMtPmJlc3RfaGVhZGVyLT5tYXhfc2NvcmUpKSB7CisgICAgICAgICAgICBmcGMtPmJlc3RfaGVhZGVyID0gY3VycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcGMtPmJlc3RfaGVhZGVyKSB7CisgICAgICAgIGZwYy0+YmVzdF9oZWFkZXJfdmFsaWQgPSAxOworICAgICAgICBpZiAoZnBjLT5iZXN0X2hlYWRlci0+b2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgLyogT3V0cHV0IGEganVuayBmcmFtZS4gKi8KKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSnVuayBmcmFtZSB0aWxsIG9mZnNldCAlaVxuIiwKKyAgICAgICAgICAgICAgICAgICBmcGMtPmJlc3RfaGVhZGVyLT5vZmZzZXQpOworCisgICAgICAgICAgICAvKiBTZXQgZHVyYXRpb24gdG8gMC4gSXQgaXMgdW5rbm93biBvciBpbnZhbGlkIGluIGEganVuayBmcmFtZS4gKi8KKyAgICAgICAgICAgIHMtPmR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgICpwb3V0YnVmX3NpemUgICAgID0gZnBjLT5iZXN0X2hlYWRlci0+b2Zmc2V0OworICAgICAgICAgICAgKnBvdXRidWYgICAgICAgICAgPSBmbGFjX2ZpZm9fcmVhZF93cmFwKGZwYywgMCwgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnBjLT53cmFwX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnBjLT53cmFwX2J1Zl9hbGxvY2F0ZWRfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gYnVmX3NpemUgPyAocmVhZF9lbmQgLSBidWYpIDogKGZwYy0+YmVzdF9oZWFkZXItPm9mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZmlmb19zaXplKGZwYy0+Zmlmb19idWYpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWJ1Zl9zaXplKQorICAgICAgICAgICAgcmV0dXJuIGdldF9iZXN0X2hlYWRlcihmcGMsIHBvdXRidWYsIHBvdXRidWZfc2l6ZSk7CisgICAgfQorCitoYW5kbGVfZXJyb3I6CisgICAgKnBvdXRidWYgICAgICA9IE5VTEw7CisgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgcmV0dXJuIHJlYWRfZW5kIC0gYnVmOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZmxhY19wYXJzZV9pbml0KEFWQ29kZWNQYXJzZXJDb250ZXh0ICpjKQoreworICAgIEZMQUNQYXJzZUNvbnRleHQgKmZwYyA9IGMtPnByaXZfZGF0YTsKKyAgICBmcGMtPnBjID0gYzsKKyAgICAvKiBUaGVyZSB3aWxsIGdlbmVyYWxseSBiZSBGTEFDX01JTl9IRUFERVJTIGJ1ZmZlcmVkIGluIHRoZSBmaWZvIGJlZm9yZQorICAgICAgIGl0IGRyYWlucy4gIFRoaXMgaXMgYWxsb2NhdGVkIGVhcmx5IHRvIGF2b2lkIHNsb3cgcmVhbGxvY2F0aW9uLiAqLworICAgIGZwYy0+Zmlmb19idWYgPSBhdl9maWZvX2FsbG9jX2FycmF5KEZMQUNfTUlOX0hFQURFUlMgKyAzLCBGTEFDX0FWR19GUkFNRV9TSVpFKTsKKyAgICBpZiAoIWZwYy0+Zmlmb19idWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZsYWNfcGFyc2VfY2xvc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKmMpCit7CisgICAgRkxBQ1BhcnNlQ29udGV4dCAqZnBjID0gYy0+cHJpdl9kYXRhOworICAgIEZMQUNIZWFkZXJNYXJrZXIgKmN1cnIgPSBmcGMtPmhlYWRlcnMsICp0ZW1wOworCisgICAgd2hpbGUgKGN1cnIpIHsKKyAgICAgICAgdGVtcCA9IGN1cnItPm5leHQ7CisgICAgICAgIGF2X2ZyZWVwKCZjdXJyLT5saW5rX3BlbmFsdHkpOworICAgICAgICBhdl9mcmVlKGN1cnIpOworICAgICAgICBjdXJyID0gdGVtcDsKKyAgICB9CisgICAgYXZfZmlmb19mcmVlcCgmZnBjLT5maWZvX2J1Zik7CisgICAgYXZfZnJlZXAoJmZwYy0+d3JhcF9idWYpOworfQorCitBVkNvZGVjUGFyc2VyIGZmX2ZsYWNfcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfRkxBQyB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGTEFDUGFyc2VDb250ZXh0KSwKKyAgICAucGFyc2VyX2luaXQgICAgPSBmbGFjX3BhcnNlX2luaXQsCisgICAgLnBhcnNlcl9wYXJzZSAgID0gZmxhY19wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmbGFjX3BhcnNlX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYWNkYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NTRmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZGF0YS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBGTEFDIGRhdGEKKyAqIENvcHlyaWdodCAoYykgMjAwMyBBbGV4IEJlcmVnc3phc3ppCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitjb25zdCBpbnQgZmZfZmxhY19zYW1wbGVfcmF0ZV90YWJsZVsxNl0gPQoreyAwLAorICA4ODIwMCwgMTc2NDAwLCAxOTIwMDAsCisgIDgwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDk2MDAwLAorICAwLCAwLCAwLCAwIH07CisKK2NvbnN0IGludDMyX3QgZmZfZmxhY19ibG9ja3NpemVfdGFibGVbMTZdID0geworICAgICAwLCAgICAxOTIsIDU3Njw8MCwgNTc2PDwxLCA1NzY8PDIsIDU3Njw8MywgICAgICAwLCAgICAgIDAsCisyNTY8PDAsIDI1Njw8MSwgMjU2PDwyLCAyNTY8PDMsIDI1Njw8NCwgMjU2PDw1LCAyNTY8PDYsIDI1Njw8NworfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYWNkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzFlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZGF0YS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBGTEFDIGRhdGEgaGVhZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRkxBQ0RBVEFfSAorI2RlZmluZSBBVkNPREVDX0ZMQUNEQVRBX0gKKworI2luY2x1ZGUgImludGVybmFsLmgiCisKK2V4dGVybiBjb25zdCBpbnQgZmZfZmxhY19zYW1wbGVfcmF0ZV90YWJsZVsxNl07CisKK2V4dGVybiBjb25zdCBpbnQzMl90IGZmX2ZsYWNfYmxvY2tzaXplX3RhYmxlWzE2XTsKKworI2VuZGlmIC8qIEFWQ09ERUNfRkxBQ0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmxhY2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmxhY2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTBhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZGVjLmMKQEAgLTAsMCArMSw2MTUgQEAKKy8qCisgKiBGTEFDIChGcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjKSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBGTEFDIChGcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjKSBkZWNvZGVyCisgKiBAYXV0aG9yIEFsZXggQmVyZWdzemFzemkKKyAqIEBzZWUgaHR0cDovL2ZsYWMuc291cmNlZm9yZ2UubmV0LworICoKKyAqIFRoaXMgZGVjb2RlciBjYW4gYmUgdXNlZCBpbiAxIG9mIDIgd2F5czogRWl0aGVyIHJhdyBGTEFDIGRhdGEgY2FuIGJlIGZlZAorICogdGhyb3VnaCwgc3RhcnRpbmcgZnJvbSB0aGUgaW5pdGlhbCAnZkxhQycgc2lnbmF0dXJlOyBvciBieSBwYXNzaW5nIHRoZQorICogMzQtYnl0ZSBzdHJlYW1pbmZvIHN0cnVjdHVyZSB0aHJvdWdoIGF2Y3R4LT5leHRyYWRhdGFbX3NpemVdIGZvbGxvd2VkCisgKiBieSBkYXRhIHN0YXJ0aW5nIHdpdGggdGhlIDB4RkZGOCBtYXJrZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImdvbG9tYi5oIgorI2luY2x1ZGUgImZsYWMuaCIKKyNpbmNsdWRlICJmbGFjZGF0YS5oIgorI2luY2x1ZGUgImZsYWNkc3AuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorCisKK3R5cGVkZWYgc3RydWN0IEZMQUNDb250ZXh0IHsKKyAgICBGTEFDU1RSRUFNSU5GTworCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OyAgICAgICAgICAgICAgICAgIC8vLzwgcGFyZW50IEFWQ29kZWNDb250ZXh0CisgICAgR2V0Qml0Q29udGV4dCBnYjsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgR2V0Qml0Q29udGV4dCBpbml0aWFsaXplZCB0byBzdGFydCBhdCB0aGUgY3VycmVudCBmcmFtZQorCisgICAgaW50IGJsb2Nrc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBpbnQgc2FtcGxlX3NoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzaGlmdCByZXF1aXJlZCB0byBtYWtlIG91dHB1dCBzYW1wbGVzIDE2LWJpdCBvciAzMi1iaXQKKyAgICBpbnQgY2hfbW9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjaGFubmVsIGRlY29ycmVsYXRpb24gdHlwZSBpbiB0aGUgY3VycmVudCBmcmFtZQorICAgIGludCBnb3Rfc3RyZWFtaW5mbzsgICAgICAgICAgICAgICAgICAgICAvLy88IGluZGljYXRlcyBpZiB0aGUgU1RSRUFNSU5GTyBoYXMgYmVlbiByZWFkCisKKyAgICBpbnQzMl90ICpkZWNvZGVkW0ZMQUNfTUFYX0NIQU5ORUxTXTsgICAgLy8vPCBkZWNvZGVkIHNhbXBsZXMKKyAgICB1aW50OF90ICpkZWNvZGVkX2J1ZmZlcjsKKyAgICB1bnNpZ25lZCBpbnQgZGVjb2RlZF9idWZmZXJfc2l6ZTsKKworICAgIEZMQUNEU1BDb250ZXh0IGRzcDsKK30gRkxBQ0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgYWxsb2NhdGVfYnVmZmVycyhGTEFDQ29udGV4dCAqcyk7CisKK3N0YXRpYyB2b2lkIGZsYWNfc2V0X2JwcyhGTEFDQ29udGV4dCAqcykKK3sKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHJlcSA9IHMtPmF2Y3R4LT5yZXF1ZXN0X3NhbXBsZV9mbXQ7CisgICAgaW50IG5lZWQzMiA9IHMtPmJwcyA+IDE2OworICAgIGludCB3YW50MzIgPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShyZXEpID4gMjsKKyAgICBpbnQgcGxhbmFyID0gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIocmVxKTsKKworICAgIGlmIChuZWVkMzIgfHwgd2FudDMyKSB7CisgICAgICAgIGlmIChwbGFuYXIpCisgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzMyUDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MzMjsKKyAgICAgICAgcy0+c2FtcGxlX3NoaWZ0ID0gMzIgLSBzLT5icHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBsYW5hcikKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTZQOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzE2OworICAgICAgICBzLT5zYW1wbGVfc2hpZnQgPSAxNiAtIHMtPmJwczsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBmbGFjX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBlbnVtIEZMQUNFeHRyYWRhdGFGb3JtYXQgZm9ybWF0OworICAgIHVpbnQ4X3QgKnN0cmVhbWluZm87CisgICAgaW50IHJldDsKKyAgICBGTEFDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIC8qIGZvciBub3csIHRoZSByYXcgRkxBQyBoZWFkZXIgaXMgYWxsb3dlZCB0byBiZSBwYXNzZWQgdG8gdGhlIGRlY29kZXIgYXMKKyAgICAgICBmcmFtZSBkYXRhIGluc3RlYWQgb2YgZXh0cmFkYXRhLiAqLworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIWZmX2ZsYWNfaXNfZXh0cmFkYXRhX3ZhbGlkKGF2Y3R4LCAmZm9ybWF0LCAmc3RyZWFtaW5mbykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLyogaW5pdGlhbGl6ZSBiYXNlZCBvbiB0aGUgZGVtdXhlci1zdXBwbGllZCBzdHJlYW1kYXRhIGhlYWRlciAqLworICAgIGZmX2ZsYWNfcGFyc2Vfc3RyZWFtaW5mbyhhdmN0eCwgKEZMQUNTdHJlYW1pbmZvICopcywgc3RyZWFtaW5mbyk7CisgICAgcmV0ID0gYWxsb2NhdGVfYnVmZmVycyhzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBmbGFjX3NldF9icHMocyk7CisgICAgZmZfZmxhY2RzcF9pbml0KCZzLT5kc3AsIGF2Y3R4LT5zYW1wbGVfZm10LCBzLT5jaGFubmVscywgcy0+YnBzKTsKKyAgICBzLT5nb3Rfc3RyZWFtaW5mbyA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtcF9oZWFkZXJzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgRkxBQ1N0cmVhbWluZm8gKnMpCit7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgIE1heCBCbG9ja3NpemU6ICVkXG4iLCBzLT5tYXhfYmxvY2tzaXplKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAgTWF4IEZyYW1lc2l6ZTogJWRcbiIsIHMtPm1heF9mcmFtZXNpemUpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiICBTYW1wbGVyYXRlOiAlZFxuIiwgcy0+c2FtcGxlcmF0ZSk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgIENoYW5uZWxzOiAlZFxuIiwgcy0+Y2hhbm5lbHMpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiICBCaXRzOiAlZFxuIiwgcy0+YnBzKTsKK30KKworc3RhdGljIGludCBhbGxvY2F0ZV9idWZmZXJzKEZMQUNDb250ZXh0ICpzKQoreworICAgIGludCBidWZfc2l6ZTsKKyAgICBpbnQgcmV0OworCisgICAgYXZfYXNzZXJ0MChzLT5tYXhfYmxvY2tzaXplKTsKKworICAgIGJ1Zl9zaXplID0gYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoTlVMTCwgcy0+Y2hhbm5lbHMsIHMtPm1heF9ibG9ja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMlAsIDApOworICAgIGlmIChidWZfc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKworICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT5kZWNvZGVkX2J1ZmZlciwgJnMtPmRlY29kZWRfYnVmZmVyX3NpemUsIGJ1Zl9zaXplKTsKKyAgICBpZiAoIXMtPmRlY29kZWRfYnVmZmVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gYXZfc2FtcGxlc19maWxsX2FycmF5cygodWludDhfdCAqKilzLT5kZWNvZGVkLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlY29kZWRfYnVmZmVyLCBzLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYXhfYmxvY2tzaXplLCBBVl9TQU1QTEVfRk1UX1MzMlAsIDApOworICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogMDsKK30KKworLyoqCisgKiBQYXJzZSB0aGUgU1RSRUFNSU5GTyBmcm9tIGFuIGlubGluZSBoZWFkZXIuCisgKiBAcGFyYW0gcyB0aGUgZmxhYyBkZWNvZGluZyBjb250ZXh0CisgKiBAcGFyYW0gYnVmIGlucHV0IGJ1ZmZlciwgc3RhcnRpbmcgd2l0aCB0aGUgImZMYUMiIG1hcmtlcgorICogQHBhcmFtIGJ1Zl9zaXplIGJ1ZmZlciBzaXplCisgKiBAcmV0dXJuIG5vbi16ZXJvIGlmIG1ldGFkYXRhIGlzIGludmFsaWQKKyAqLworc3RhdGljIGludCBwYXJzZV9zdHJlYW1pbmZvKEZMQUNDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgbWV0YWRhdGFfdHlwZSwgbWV0YWRhdGFfc2l6ZSwgcmV0OworCisgICAgaWYgKGJ1Zl9zaXplIDwgRkxBQ19TVFJFQU1JTkZPX1NJWkUrOCkgeworICAgICAgICAvKiBuZWVkIG1vcmUgZGF0YSAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZmxhY19wYXJzZV9ibG9ja19oZWFkZXIoJmJ1Zls0XSwgTlVMTCwgJm1ldGFkYXRhX3R5cGUsICZtZXRhZGF0YV9zaXplKTsKKyAgICBpZiAobWV0YWRhdGFfdHlwZSAhPSBGTEFDX01FVEFEQVRBX1RZUEVfU1RSRUFNSU5GTyB8fAorICAgICAgICBtZXRhZGF0YV9zaXplICE9IEZMQUNfU1RSRUFNSU5GT19TSVpFKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBmZl9mbGFjX3BhcnNlX3N0cmVhbWluZm8ocy0+YXZjdHgsIChGTEFDU3RyZWFtaW5mbyAqKXMsICZidWZbOF0pOworICAgIHJldCA9IGFsbG9jYXRlX2J1ZmZlcnMocyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZmxhY19zZXRfYnBzKHMpOworICAgIGZmX2ZsYWNkc3BfaW5pdCgmcy0+ZHNwLCBzLT5hdmN0eC0+c2FtcGxlX2ZtdCwgcy0+Y2hhbm5lbHMsIHMtPmJwcyk7CisgICAgcy0+Z290X3N0cmVhbWluZm8gPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGFuIGlubGluZSBoZWFkZXIuCisgKiBAcGFyYW0gYnVmIGlucHV0IGJ1ZmZlciwgc3RhcnRpbmcgd2l0aCB0aGUgImZMYUMiIG1hcmtlcgorICogQHBhcmFtIGJ1Zl9zaXplIGJ1ZmZlciBzaXplCisgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyBpbiB0aGUgaGVhZGVyLCBvciAwIGlmIG1vcmUgZGF0YSBpcyBuZWVkZWQKKyAqLworc3RhdGljIGludCBnZXRfbWV0YWRhdGFfc2l6ZShjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgbWV0YWRhdGFfbGFzdCwgbWV0YWRhdGFfc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisKKyAgICBidWYgKz0gNDsKKyAgICBkbyB7CisgICAgICAgIGlmIChidWZfZW5kIC0gYnVmIDwgNCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmbGFjX3BhcnNlX2Jsb2NrX2hlYWRlcihidWYsICZtZXRhZGF0YV9sYXN0LCBOVUxMLCAmbWV0YWRhdGFfc2l6ZSk7CisgICAgICAgIGJ1ZiArPSA0OworICAgICAgICBpZiAoYnVmX2VuZCAtIGJ1ZiA8IG1ldGFkYXRhX3NpemUpIHsKKyAgICAgICAgICAgIC8qIG5lZWQgbW9yZSBkYXRhIGluIG9yZGVyIHRvIHJlYWQgdGhlIGNvbXBsZXRlIGhlYWRlciAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnVmICs9IG1ldGFkYXRhX3NpemU7CisgICAgfSB3aGlsZSAoIW1ldGFkYXRhX2xhc3QpOworCisgICAgcmV0dXJuIGJ1Zl9zaXplIC0gKGJ1Zl9lbmQgLSBidWYpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9yZXNpZHVhbHMoRkxBQ0NvbnRleHQgKnMsIGludDMyX3QgKmRlY29kZWQsIGludCBwcmVkX29yZGVyKQoreworICAgIGludCBpLCB0bXAsIHBhcnRpdGlvbiwgbWV0aG9kX3R5cGUsIHJpY2Vfb3JkZXI7CisgICAgaW50IHJpY2VfYml0cywgcmljZV9lc2M7CisgICAgaW50IHNhbXBsZXM7CisKKyAgICBtZXRob2RfdHlwZSA9IGdldF9iaXRzKCZzLT5nYiwgMik7CisgICAgaWYgKG1ldGhvZF90eXBlID4gMSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgcmVzaWR1YWwgY29kaW5nIG1ldGhvZCAlZFxuIiwKKyAgICAgICAgICAgICAgIG1ldGhvZF90eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmljZV9vcmRlciA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisKKyAgICBzYW1wbGVzPSBzLT5ibG9ja3NpemUgPj4gcmljZV9vcmRlcjsKKyAgICBpZiAoc2FtcGxlcyA8PCByaWNlX29yZGVyICE9IHMtPmJsb2Nrc2l6ZSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgcmljZSBvcmRlcjogJWkgYmxvY2tzaXplICVpXG4iLAorICAgICAgICAgICAgICAgcmljZV9vcmRlciwgcy0+YmxvY2tzaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHByZWRfb3JkZXIgPiBzYW1wbGVzKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBwcmVkaWN0b3Igb3JkZXI6ICVpID4gJWlcbiIsCisgICAgICAgICAgICAgICBwcmVkX29yZGVyLCBzYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmljZV9iaXRzID0gNCArIG1ldGhvZF90eXBlOworICAgIHJpY2VfZXNjICA9ICgxIDw8IHJpY2VfYml0cykgLSAxOworCisgICAgZGVjb2RlZCArPSBwcmVkX29yZGVyOworICAgIGk9IHByZWRfb3JkZXI7CisgICAgZm9yIChwYXJ0aXRpb24gPSAwOyBwYXJ0aXRpb24gPCAoMSA8PCByaWNlX29yZGVyKTsgcGFydGl0aW9uKyspIHsKKyAgICAgICAgdG1wID0gZ2V0X2JpdHMoJnMtPmdiLCByaWNlX2JpdHMpOworICAgICAgICBpZiAodG1wID09IHJpY2VfZXNjKSB7CisgICAgICAgICAgICB0bXAgPSBnZXRfYml0cygmcy0+Z2IsIDUpOworICAgICAgICAgICAgZm9yICg7IGkgPCBzYW1wbGVzOyBpKyspCisgICAgICAgICAgICAgICAgKmRlY29kZWQrKyA9IGdldF9zYml0c19sb25nKCZzLT5nYiwgdG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoOyBpIDwgc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgKmRlY29kZWQrKyA9IGdldF9zcl9nb2xvbWJfZmxhYygmcy0+Z2IsIHRtcCwgSU5UX01BWCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaT0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfc3ViZnJhbWVfZml4ZWQoRkxBQ0NvbnRleHQgKnMsIGludDMyX3QgKmRlY29kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZF9vcmRlciwgaW50IGJwcykKK3sKKyAgICBjb25zdCBpbnQgYmxvY2tzaXplID0gcy0+YmxvY2tzaXplOworICAgIGludCBhdl91bmluaXQoYSksIGF2X3VuaW5pdChiKSwgYXZfdW5pbml0KGMpLCBhdl91bmluaXQoZCksIGk7CisgICAgaW50IHJldDsKKworICAgIC8qIHdhcm0gdXAgc2FtcGxlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBwcmVkX29yZGVyOyBpKyspIHsKKyAgICAgICAgZGVjb2RlZFtpXSA9IGdldF9zYml0c19sb25nKCZzLT5nYiwgYnBzKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGRlY29kZV9yZXNpZHVhbHMocywgZGVjb2RlZCwgcHJlZF9vcmRlcikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChwcmVkX29yZGVyID4gMCkKKyAgICAgICAgYSA9IGRlY29kZWRbcHJlZF9vcmRlci0xXTsKKyAgICBpZiAocHJlZF9vcmRlciA+IDEpCisgICAgICAgIGIgPSBhIC0gZGVjb2RlZFtwcmVkX29yZGVyLTJdOworICAgIGlmIChwcmVkX29yZGVyID4gMikKKyAgICAgICAgYyA9IGIgLSBkZWNvZGVkW3ByZWRfb3JkZXItMl0gKyBkZWNvZGVkW3ByZWRfb3JkZXItM107CisgICAgaWYgKHByZWRfb3JkZXIgPiAzKQorICAgICAgICBkID0gYyAtIGRlY29kZWRbcHJlZF9vcmRlci0yXSArIDIqZGVjb2RlZFtwcmVkX29yZGVyLTNdIC0gZGVjb2RlZFtwcmVkX29yZGVyLTRdOworCisgICAgc3dpdGNoIChwcmVkX29yZGVyKSB7CisgICAgY2FzZSAwOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGZvciAoaSA9IHByZWRfb3JkZXI7IGkgPCBibG9ja3NpemU7IGkrKykKKyAgICAgICAgICAgIGRlY29kZWRbaV0gPSBhICs9IGRlY29kZWRbaV07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZm9yIChpID0gcHJlZF9vcmRlcjsgaSA8IGJsb2Nrc2l6ZTsgaSsrKQorICAgICAgICAgICAgZGVjb2RlZFtpXSA9IGEgKz0gYiArPSBkZWNvZGVkW2ldOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGZvciAoaSA9IHByZWRfb3JkZXI7IGkgPCBibG9ja3NpemU7IGkrKykKKyAgICAgICAgICAgIGRlY29kZWRbaV0gPSBhICs9IGIgKz0gYyArPSBkZWNvZGVkW2ldOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGZvciAoaSA9IHByZWRfb3JkZXI7IGkgPCBibG9ja3NpemU7IGkrKykKKyAgICAgICAgICAgIGRlY29kZWRbaV0gPSBhICs9IGIgKz0gYyArPSBkICs9IGRlY29kZWRbaV07CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBwcmVkIG9yZGVyICVkXG4iLCBwcmVkX29yZGVyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3N1YmZyYW1lX2xwYyhGTEFDQ29udGV4dCAqcywgaW50MzJfdCAqZGVjb2RlZCwgaW50IHByZWRfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwcykKK3sKKyAgICBpbnQgaSwgcmV0OworICAgIGludCBjb2VmZl9wcmVjLCBxbGV2ZWw7CisgICAgaW50IGNvZWZmc1szMl07CisKKyAgICAvKiB3YXJtIHVwIHNhbXBsZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcHJlZF9vcmRlcjsgaSsrKSB7CisgICAgICAgIGRlY29kZWRbaV0gPSBnZXRfc2JpdHNfbG9uZygmcy0+Z2IsIGJwcyk7CisgICAgfQorCisgICAgY29lZmZfcHJlYyA9IGdldF9iaXRzKCZzLT5nYiwgNCkgKyAxOworICAgIGlmIChjb2VmZl9wcmVjID09IDE2KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBjb2VmZiBwcmVjaXNpb25cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcWxldmVsID0gZ2V0X3NiaXRzKCZzLT5nYiwgNSk7CisgICAgaWYgKHFsZXZlbCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJxbGV2ZWwgJWQgbm90IHN1cHBvcnRlZCwgbWF5YmUgYnVnZ3kgc3RyZWFtXG4iLAorICAgICAgICAgICAgICAgcWxldmVsKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHByZWRfb3JkZXI7IGkrKykgeworICAgICAgICBjb2VmZnNbcHJlZF9vcmRlciAtIGkgLSAxXSA9IGdldF9zYml0cygmcy0+Z2IsIGNvZWZmX3ByZWMpOworICAgIH0KKworICAgIGlmICgocmV0ID0gZGVjb2RlX3Jlc2lkdWFscyhzLCBkZWNvZGVkLCBwcmVkX29yZGVyKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcy0+ZHNwLmxwYyhkZWNvZGVkLCBjb2VmZnMsIHByZWRfb3JkZXIsIHFsZXZlbCwgcy0+YmxvY2tzaXplKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfc3ViZnJhbWUoRkxBQ0NvbnRleHQgKnMsIGludCBjaGFubmVsKQoreworICAgIGludDMyX3QgKmRlY29kZWQgPSBzLT5kZWNvZGVkW2NoYW5uZWxdOworICAgIGludCB0eXBlLCB3YXN0ZWQgPSAwOworICAgIGludCBicHMgPSBzLT5icHM7CisgICAgaW50IGksIHRtcCwgcmV0OworCisgICAgaWYgKGNoYW5uZWwgPT0gMCkgeworICAgICAgICBpZiAocy0+Y2hfbW9kZSA9PSBGTEFDX0NITU9ERV9SSUdIVF9TSURFKQorICAgICAgICAgICAgYnBzKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPmNoX21vZGUgPT0gRkxBQ19DSE1PREVfTEVGVF9TSURFIHx8IHMtPmNoX21vZGUgPT0gRkxBQ19DSE1PREVfTUlEX1NJREUpCisgICAgICAgICAgICBicHMrKzsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHN1YmZyYW1lIHBhZGRpbmdcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgdHlwZSA9IGdldF9iaXRzKCZzLT5nYiwgNik7CisKKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgaW50IGxlZnQgPSBnZXRfYml0c19sZWZ0KCZzLT5nYik7CisgICAgICAgIGlmICggbGVmdCA8PSAwIHx8CisgICAgICAgICAgICAobGVmdCA8IGJwcyAmJiAhc2hvd19iaXRzX2xvbmcoJnMtPmdiLCBsZWZ0KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICFzaG93X2JpdHNfbG9uZygmcy0+Z2IsIGJwcykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiB3YXN0ZWQgYml0cyA+IGF2YWlsYWJsZSBiaXRzICglZCkgLSBsZWZ0PSVkXG4iLAorICAgICAgICAgICAgICAgICAgIGJwcywgbGVmdCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICB3YXN0ZWQgPSAxICsgZ2V0X3VuYXJ5KCZzLT5nYiwgMSwgZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpKTsKKyAgICAgICAgYnBzIC09IHdhc3RlZDsKKyAgICB9CisgICAgaWYgKGJwcyA+IDMyKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiRGVjb3JyZWxhdGVkIGJpdCBkZXB0aCA+IDMyIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKy8vRklYTUUgdXNlIGF2X2xvZzIgZm9yIHR5cGVzCisgICAgaWYgKHR5cGUgPT0gMCkgeworICAgICAgICB0bXAgPSBnZXRfc2JpdHNfbG9uZygmcy0+Z2IsIGJwcyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ibG9ja3NpemU7IGkrKykKKyAgICAgICAgICAgIGRlY29kZWRbaV0gPSB0bXA7CisgICAgfSBlbHNlIGlmICh0eXBlID09IDEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmJsb2Nrc2l6ZTsgaSsrKQorICAgICAgICAgICAgZGVjb2RlZFtpXSA9IGdldF9zYml0c19sb25nKCZzLT5nYiwgYnBzKTsKKyAgICB9IGVsc2UgaWYgKCh0eXBlID49IDgpICYmICh0eXBlIDw9IDEyKSkgeworICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9zdWJmcmFtZV9maXhlZChzLCBkZWNvZGVkLCB0eXBlICYgfjB4OCwgYnBzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPj0gMzIpIHsKKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfc3ViZnJhbWVfbHBjKHMsIGRlY29kZWQsICh0eXBlICYgfjB4MjApKzEsIGJwcykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGNvZGluZyB0eXBlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHdhc3RlZCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmJsb2Nrc2l6ZTsgaSsrKQorICAgICAgICAgICAgZGVjb2RlZFtpXSA8PD0gd2FzdGVkOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShGTEFDQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgcmV0OworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOworICAgIEZMQUNGcmFtZUluZm8gZmk7CisKKyAgICBpZiAoKHJldCA9IGZmX2ZsYWNfZGVjb2RlX2ZyYW1lX2hlYWRlcihzLT5hdmN0eCwgZ2IsICZmaSwgMCkpIDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgZnJhbWUgaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAocy0+Y2hhbm5lbHMgJiYgZmkuY2hhbm5lbHMgIT0gcy0+Y2hhbm5lbHMgJiYgcy0+Z290X3N0cmVhbWluZm8pIHsKKyAgICAgICAgcy0+Y2hhbm5lbHMgPSBzLT5hdmN0eC0+Y2hhbm5lbHMgPSBmaS5jaGFubmVsczsKKyAgICAgICAgZmZfZmxhY19zZXRfY2hhbm5lbF9sYXlvdXQocy0+YXZjdHgpOworICAgICAgICByZXQgPSBhbGxvY2F0ZV9idWZmZXJzKHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHMtPmNoYW5uZWxzID0gcy0+YXZjdHgtPmNoYW5uZWxzID0gZmkuY2hhbm5lbHM7CisgICAgaWYgKCFzLT5hdmN0eC0+Y2hhbm5lbF9sYXlvdXQpCisgICAgICAgIGZmX2ZsYWNfc2V0X2NoYW5uZWxfbGF5b3V0KHMtPmF2Y3R4KTsKKyAgICBzLT5jaF9tb2RlID0gZmkuY2hfbW9kZTsKKworICAgIGlmICghcy0+YnBzICYmICFmaS5icHMpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJicHMgbm90IGZvdW5kIGluIFNUUkVBTUlORk8gb3IgZnJhbWUgaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICghZmkuYnBzKSB7CisgICAgICAgIGZpLmJwcyA9IHMtPmJwczsKKyAgICB9IGVsc2UgaWYgKHMtPmJwcyAmJiBmaS5icHMgIT0gcy0+YnBzKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic3dpdGNoaW5nIGJwcyBtaWQtc3RyZWFtIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCFzLT5icHMpIHsKKyAgICAgICAgcy0+YnBzID0gcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBmaS5icHM7CisgICAgICAgIGZsYWNfc2V0X2JwcyhzKTsKKyAgICB9CisKKyAgICBpZiAoIXMtPm1heF9ibG9ja3NpemUpCisgICAgICAgIHMtPm1heF9ibG9ja3NpemUgPSBGTEFDX01BWF9CTE9DS1NJWkU7CisgICAgaWYgKGZpLmJsb2Nrc2l6ZSA+IHMtPm1heF9ibG9ja3NpemUpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJibG9ja3NpemUgJWQgPiAlZFxuIiwgZmkuYmxvY2tzaXplLAorICAgICAgICAgICAgICAgcy0+bWF4X2Jsb2Nrc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzLT5ibG9ja3NpemUgPSBmaS5ibG9ja3NpemU7CisKKyAgICBpZiAoIXMtPnNhbXBsZXJhdGUgJiYgIWZpLnNhbXBsZXJhdGUpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzYW1wbGUgcmF0ZSBub3QgZm91bmQgaW4gU1RSRUFNSU5GTyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9yIGZyYW1lIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoZmkuc2FtcGxlcmF0ZSA9PSAwKQorICAgICAgICBmaS5zYW1wbGVyYXRlID0gcy0+c2FtcGxlcmF0ZTsKKyAgICBzLT5zYW1wbGVyYXRlID0gcy0+YXZjdHgtPnNhbXBsZV9yYXRlID0gZmkuc2FtcGxlcmF0ZTsKKworICAgIGlmICghcy0+Z290X3N0cmVhbWluZm8pIHsKKyAgICAgICAgcmV0ID0gYWxsb2NhdGVfYnVmZmVycyhzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBzLT5nb3Rfc3RyZWFtaW5mbyA9IDE7CisgICAgICAgIGR1bXBfaGVhZGVycyhzLT5hdmN0eCwgKEZMQUNTdHJlYW1pbmZvICopcyk7CisgICAgfQorICAgIGZmX2ZsYWNkc3BfaW5pdCgmcy0+ZHNwLCBzLT5hdmN0eC0+c2FtcGxlX2ZtdCwgcy0+Y2hhbm5lbHMsIHMtPmJwcyk7CisKKy8vICAgIGR1bXBfaGVhZGVycyhzLT5hdmN0eCwgKEZMQUNTdHJlYW1pbmZvICopcyk7CisKKyAgICAvKiBzdWJmcmFtZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9zdWJmcmFtZShzLCBpKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBhbGlnbl9nZXRfYml0cyhnYik7CisKKyAgICAvKiBmcmFtZSBmb290ZXIgKi8KKyAgICBza2lwX2JpdHMoZ2IsIDE2KTsgLyogZGF0YSBjcmMgKi8KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsYWNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBUaHJlYWRGcmFtZSB0ZnJhbWUgPSB7IC5mID0gZGF0YSB9OworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIEZMQUNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgYnl0ZXNfcmVhZCA9IDA7CisgICAgaW50IHJldDsKKworICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKworICAgIGlmIChzLT5tYXhfZnJhbWVzaXplID09IDApIHsKKyAgICAgICAgcy0+bWF4X2ZyYW1lc2l6ZSA9CisgICAgICAgICAgICBmZl9mbGFjX2dldF9tYXhfZnJhbWVfc2l6ZShzLT5tYXhfYmxvY2tzaXplID8gcy0+bWF4X2Jsb2Nrc2l6ZSA6IEZMQUNfTUFYX0JMT0NLU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQUNfTUFYX0NIQU5ORUxTLCAzMik7CisgICAgfQorCisgICAgaWYgKGJ1Zl9zaXplID4gNSAmJiAhbWVtY21wKGJ1ZiwgIlwxNzdGTEFDIiwgNSkpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJza2lwcGluZyBmbGFjIGhlYWRlciBwYWNrZXQgMVxuIik7CisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoYnVmX3NpemUgPiAwICYmICgqYnVmICYgMHg3RikgPT0gRkxBQ19NRVRBREFUQV9UWVBFX1ZPUkJJU19DT01NRU5UKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAic2tpcHBpbmcgdm9yYmlzIGNvbW1lbnRcbiIpOworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgLyogY2hlY2sgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCB0aGUgc21hbGxlc3QgZGVjb2RhYmxlIGFtb3VudCBvZiBkYXRhLgorICAgICAgIHRoaXMgYW1vdW50IGNvcnJlc3BvbmRzIHRvIHRoZSBzbWFsbGVzdCB2YWxpZCBGTEFDIGZyYW1lIHBvc3NpYmxlLgorICAgICAgIEZGIEY4IDY5IDAyIDAwIDAwIDlBIDAwIDAwIDM0IDQ2ICovCisgICAgaWYgKGJ1Zl9zaXplIDwgRkxBQ19NSU5fRlJBTUVfU0laRSkKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworCisgICAgLyogY2hlY2sgZm9yIGlubGluZSBoZWFkZXIgKi8KKyAgICBpZiAoQVZfUkIzMihidWYpID09IE1LQkVUQUcoJ2YnLCdMJywnYScsJ0MnKSkgeworICAgICAgICBpZiAoIXMtPmdvdF9zdHJlYW1pbmZvICYmIChyZXQgPSBwYXJzZV9zdHJlYW1pbmZvKHMsIGJ1ZiwgYnVmX3NpemUpKSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGhlYWRlclxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRfbWV0YWRhdGFfc2l6ZShidWYsIGJ1Zl9zaXplKTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgZnJhbWUgKi8KKyAgICBpZiAoKHJldCA9IGluaXRfZ2V0X2JpdHM4KCZzLT5nYiwgYnVmLCBidWZfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoKHJldCA9IGRlY29kZV9mcmFtZShzKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlX2ZyYW1lKCkgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgYnl0ZXNfcmVhZCA9IGdldF9iaXRzX2NvdW50KCZzLT5nYikvODsKKworICAgIGlmICgocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9DUkNDSEVDS3xBVl9FRl9DT01QTElBTlQpKSAmJgorICAgICAgICBhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMTZfQU5TSSksCisgICAgICAgICAgICAgICAwLCBidWYsIGJ5dGVzX3JlYWQpKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ1JDIGVycm9yIGF0IFBUUyAlIlBSSWQ2NCJcbiIsIGF2cGt0LT5wdHMpOworICAgICAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gcy0+YmxvY2tzaXplOworICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZ0ZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5kc3AuZGVjb3JyZWxhdGVbcy0+Y2hfbW9kZV0oZnJhbWUtPmRhdGEsIHMtPmRlY29kZWQsIHMtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja3NpemUsIHMtPnNhbXBsZV9zaGlmdCk7CisKKyAgICBpZiAoYnl0ZXNfcmVhZCA+IGJ1Zl9zaXplKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAib3ZlcnJlYWQ6ICVkXG4iLCBieXRlc19yZWFkIC0gYnVmX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGJ5dGVzX3JlYWQgPCBidWZfc2l6ZSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInVuZGVycmVhZDogJWQgb3JpZyBzaXplOiAlZFxuIiwKKyAgICAgICAgICAgICAgIGJ1Zl9zaXplIC0gYnl0ZXNfcmVhZCwgYnVmX3NpemUpOworICAgIH0KKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgaW50IGluaXRfdGhyZWFkX2NvcHkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZMQUNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzLT5kZWNvZGVkX2J1ZmZlciA9IE5VTEw7CisgICAgcy0+ZGVjb2RlZF9idWZmZXJfc2l6ZSA9IDA7CisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBpZiAocy0+bWF4X2Jsb2Nrc2l6ZSkKKyAgICAgICAgcmV0dXJuIGFsbG9jYXRlX2J1ZmZlcnMocyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBmbGFjX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRkxBQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJnMtPmRlY29kZWRfYnVmZmVyKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2ZsYWNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZmxhYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZMQUMgKEZyZWUgTG9zc2xlc3MgQXVkaW8gQ29kZWMpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0ZMQUMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZMQUNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmbGFjX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGZsYWNfZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGZsYWNfZGVjb2RlX2ZyYW1lLAorICAgIC5pbml0X3RocmVhZF9jb3B5ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoaW5pdF90aHJlYWRfY29weSksCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzMyUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYWNkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYWNkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODNlYjgzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmxhY2RzcC5jCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAiZmxhY2RzcC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisjZGVmaW5lIFNBTVBMRV9TSVpFIDE2CisjZGVmaW5lIFBMQU5BUiAwCisjaW5jbHVkZSAiZmxhY2RzcF90ZW1wbGF0ZS5jIgorI2luY2x1ZGUgImZsYWNkc3BfbHBjX3RlbXBsYXRlLmMiCisKKyN1bmRlZiAgUExBTkFSCisjZGVmaW5lIFBMQU5BUiAxCisjaW5jbHVkZSAiZmxhY2RzcF90ZW1wbGF0ZS5jIgorCisjdW5kZWYgIFNBTVBMRV9TSVpFCisjdW5kZWYgIFBMQU5BUgorI2RlZmluZSBTQU1QTEVfU0laRSAzMgorI2RlZmluZSBQTEFOQVIgMAorI2luY2x1ZGUgImZsYWNkc3BfdGVtcGxhdGUuYyIKKyNpbmNsdWRlICJmbGFjZHNwX2xwY190ZW1wbGF0ZS5jIgorCisjdW5kZWYgIFBMQU5BUgorI2RlZmluZSBQTEFOQVIgMQorI2luY2x1ZGUgImZsYWNkc3BfdGVtcGxhdGUuYyIKKworc3RhdGljIHZvaWQgZmxhY19scGNfMTZfYyhpbnQzMl90ICpkZWNvZGVkLCBjb25zdCBpbnQgY29lZmZzWzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRfb3JkZXIsIGludCBxbGV2ZWwsIGludCBsZW4pCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSBwcmVkX29yZGVyOyBpIDwgbGVuIC0gMTsgaSArPSAyLCBkZWNvZGVkICs9IDIpIHsKKyAgICAgICAgaW50IGMgPSBjb2VmZnNbMF07CisgICAgICAgIGludCBkID0gZGVjb2RlZFswXTsKKyAgICAgICAgaW50IHMwID0gMCwgczEgPSAwOworICAgICAgICBmb3IgKGogPSAxOyBqIDwgcHJlZF9vcmRlcjsgaisrKSB7CisgICAgICAgICAgICBzMCArPSBjKmQ7CisgICAgICAgICAgICBkID0gZGVjb2RlZFtqXTsKKyAgICAgICAgICAgIHMxICs9IGMqZDsKKyAgICAgICAgICAgIGMgPSBjb2VmZnNbal07CisgICAgICAgIH0KKyAgICAgICAgczAgKz0gYypkOworICAgICAgICBkID0gZGVjb2RlZFtqXSArPSBzMCA+PiBxbGV2ZWw7CisgICAgICAgIHMxICs9IGMqZDsKKyAgICAgICAgZGVjb2RlZFtqICsgMV0gKz0gczEgPj4gcWxldmVsOworICAgIH0KKyAgICBpZiAoaSA8IGxlbikgeworICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHByZWRfb3JkZXI7IGorKykKKyAgICAgICAgICAgIHN1bSArPSBjb2VmZnNbal0gKiBkZWNvZGVkW2pdOworICAgICAgICBkZWNvZGVkW2pdICs9IHN1bSA+PiBxbGV2ZWw7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmbGFjX2xwY18zMl9jKGludDMyX3QgKmRlY29kZWQsIGNvbnN0IGludCBjb2VmZnNbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZF9vcmRlciwgaW50IHFsZXZlbCwgaW50IGxlbikKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IHByZWRfb3JkZXI7IGkgPCBsZW47IGkrKywgZGVjb2RlZCsrKSB7CisgICAgICAgIGludDY0X3Qgc3VtID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHByZWRfb3JkZXI7IGorKykKKyAgICAgICAgICAgIHN1bSArPSAoaW50NjRfdCljb2VmZnNbal0gKiBkZWNvZGVkW2pdOworICAgICAgICBkZWNvZGVkW2pdICs9IHN1bSA+PiBxbGV2ZWw7CisgICAgfQorCit9CisKK2F2X2NvbGQgdm9pZCBmZl9mbGFjZHNwX2luaXQoRkxBQ0RTUENvbnRleHQgKmMsIGVudW0gQVZTYW1wbGVGb3JtYXQgZm10LCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicHMpCit7CisgICAgaWYgKGJwcyA+IDE2KSB7CisgICAgICAgIGMtPmxwYyAgICAgICAgICAgID0gZmxhY19scGNfMzJfYzsKKyAgICAgICAgYy0+bHBjX2VuY29kZSAgICAgPSBmbGFjX2xwY19lbmNvZGVfY18zMjsKKyAgICB9IGVsc2UgeworICAgICAgICBjLT5scGMgICAgICAgICAgICA9IGZsYWNfbHBjXzE2X2M7CisgICAgICAgIGMtPmxwY19lbmNvZGUgICAgID0gZmxhY19scGNfZW5jb2RlX2NfMTY7CisgICAgfQorCisgICAgc3dpdGNoIChmbXQpIHsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyOgorICAgICAgICBjLT5kZWNvcnJlbGF0ZVswXSA9IGZsYWNfZGVjb3JyZWxhdGVfaW5kZXBfY18zMjsKKyAgICAgICAgYy0+ZGVjb3JyZWxhdGVbMV0gPSBmbGFjX2RlY29ycmVsYXRlX2xzX2NfMzI7CisgICAgICAgIGMtPmRlY29ycmVsYXRlWzJdID0gZmxhY19kZWNvcnJlbGF0ZV9yc19jXzMyOworICAgICAgICBjLT5kZWNvcnJlbGF0ZVszXSA9IGZsYWNfZGVjb3JyZWxhdGVfbXNfY18zMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyUDoKKyAgICAgICAgYy0+ZGVjb3JyZWxhdGVbMF0gPSBmbGFjX2RlY29ycmVsYXRlX2luZGVwX2NfMzJwOworICAgICAgICBjLT5kZWNvcnJlbGF0ZVsxXSA9IGZsYWNfZGVjb3JyZWxhdGVfbHNfY18zMnA7CisgICAgICAgIGMtPmRlY29ycmVsYXRlWzJdID0gZmxhY19kZWNvcnJlbGF0ZV9yc19jXzMycDsKKyAgICAgICAgYy0+ZGVjb3JyZWxhdGVbM10gPSBmbGFjX2RlY29ycmVsYXRlX21zX2NfMzJwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6CisgICAgICAgIGMtPmRlY29ycmVsYXRlWzBdID0gZmxhY19kZWNvcnJlbGF0ZV9pbmRlcF9jXzE2OworICAgICAgICBjLT5kZWNvcnJlbGF0ZVsxXSA9IGZsYWNfZGVjb3JyZWxhdGVfbHNfY18xNjsKKyAgICAgICAgYy0+ZGVjb3JyZWxhdGVbMl0gPSBmbGFjX2RlY29ycmVsYXRlX3JzX2NfMTY7CisgICAgICAgIGMtPmRlY29ycmVsYXRlWzNdID0gZmxhY19kZWNvcnJlbGF0ZV9tc19jXzE2OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOgorICAgICAgICBjLT5kZWNvcnJlbGF0ZVswXSA9IGZsYWNfZGVjb3JyZWxhdGVfaW5kZXBfY18xNnA7CisgICAgICAgIGMtPmRlY29ycmVsYXRlWzFdID0gZmxhY19kZWNvcnJlbGF0ZV9sc19jXzE2cDsKKyAgICAgICAgYy0+ZGVjb3JyZWxhdGVbMl0gPSBmbGFjX2RlY29ycmVsYXRlX3JzX2NfMTZwOworICAgICAgICBjLT5kZWNvcnJlbGF0ZVszXSA9IGZsYWNfZGVjb3JyZWxhdGVfbXNfY18xNnA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChBUkNIX0FSTSkKKyAgICAgICAgZmZfZmxhY2RzcF9pbml0X2FybShjLCBmbXQsIGNoYW5uZWxzLCBicHMpOworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfZmxhY2RzcF9pbml0X3g4NihjLCBmbXQsIGNoYW5uZWxzLCBicHMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmxhY2RzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmxhY2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzM4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZHNwLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRkxBQ0RTUF9ICisjZGVmaW5lIEFWQ09ERUNfRkxBQ0RTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisKK3R5cGVkZWYgc3RydWN0IEZMQUNEU1BDb250ZXh0IHsKKyAgICB2b2lkICgqZGVjb3JyZWxhdGVbNF0pKHVpbnQ4X3QgKipvdXQsIGludDMyX3QgKippbiwgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHNoaWZ0KTsKKyAgICB2b2lkICgqbHBjKShpbnQzMl90ICpzYW1wbGVzLCBjb25zdCBpbnQgY29lZmZzWzMyXSwgaW50IG9yZGVyLAorICAgICAgICAgICAgICAgIGludCBxbGV2ZWwsIGludCBsZW4pOworICAgIHZvaWQgKCpscGNfZW5jb2RlKShpbnQzMl90ICpyZXMsIGNvbnN0IGludDMyX3QgKnNtcCwgaW50IGxlbiwgaW50IG9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGNvZWZzWzMyXSwgaW50IHNoaWZ0KTsKK30gRkxBQ0RTUENvbnRleHQ7CisKK3ZvaWQgZmZfZmxhY2RzcF9pbml0KEZMQUNEU1BDb250ZXh0ICpjLCBlbnVtIEFWU2FtcGxlRm9ybWF0IGZtdCwgaW50IGNoYW5uZWxzLCBpbnQgYnBzKTsKK3ZvaWQgZmZfZmxhY2RzcF9pbml0X2FybShGTEFDRFNQQ29udGV4dCAqYywgZW51bSBBVlNhbXBsZUZvcm1hdCBmbXQsIGludCBjaGFubmVscywgaW50IGJwcyk7Cit2b2lkIGZmX2ZsYWNkc3BfaW5pdF94ODYoRkxBQ0RTUENvbnRleHQgKmMsIGVudW0gQVZTYW1wbGVGb3JtYXQgZm10LCBpbnQgY2hhbm5lbHMsIGludCBicHMpOworCisjZW5kaWYgLyogQVZDT0RFQ19GTEFDRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYWNkc3BfbHBjX3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZHNwX2xwY190ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTMyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZHNwX2xwY190ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCisjdW5kZWYgRlVOQworI3VuZGVmIHN1bV90eXBlCisjdW5kZWYgTVVMCisjdW5kZWYgQ0xJUAorI3VuZGVmIEZTVUYKKworI2RlZmluZSBGVU5DKG4pIEFWX0pPSU4obiAjIyBfLCBTQU1QTEVfU0laRSkKKworI2lmIFNBTVBMRV9TSVpFID09IDMyCisjICAgZGVmaW5lIHN1bV90eXBlICBpbnQ2NF90CisjICAgZGVmaW5lIE1VTChhLCBiKSBNVUw2NChhLCBiKQorIyAgIGRlZmluZSBDTElQKHgpIGF2X2NsaXBsX2ludDMyKHgpCisjZWxzZQorIyAgIGRlZmluZSBzdW1fdHlwZSAgaW50MzJfdAorIyAgIGRlZmluZSBNVUwoYSwgYikgKChhKSAqIChiKSkKKyMgICBkZWZpbmUgQ0xJUCh4KSAoeCkKKyNlbmRpZgorCisjZGVmaW5lIExQQzEoeCkgeyAgICAgICAgICAgXAorICAgIGludCBjID0gY29lZnNbKHgpLTFdOyAgIFwKKyAgICBwMCAgICs9IE1VTChjLCBzKTsgICAgICBcCisgICAgcyAgICAgPSBzbXBbaS0oeCkrMV07ICAgXAorICAgIHAxICAgKz0gTVVMKGMsIHMpOyAgICAgIFwKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKGxwY19lbmNvZGVfdW5yb2xsZWQpKGludDMyX3QgKnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpzbXAsIGludCBsZW4sIGludCBvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpjb2VmcywgaW50IHNoaWZ0LCBpbnQgYmlnKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IG9yZGVyOyBpIDwgbGVuOyBpICs9IDIpIHsKKyAgICAgICAgaW50IHMgID0gc21wW2ktb3JkZXJdOworICAgICAgICBzdW1fdHlwZSBwMCA9IDAsIHAxID0gMDsKKyAgICAgICAgaWYgKGJpZykgeworICAgICAgICAgICAgc3dpdGNoIChvcmRlcikgeworICAgICAgICAgICAgY2FzZSAzMjogTFBDMSgzMikKKyAgICAgICAgICAgIGNhc2UgMzE6IExQQzEoMzEpCisgICAgICAgICAgICBjYXNlIDMwOiBMUEMxKDMwKQorICAgICAgICAgICAgY2FzZSAyOTogTFBDMSgyOSkKKyAgICAgICAgICAgIGNhc2UgMjg6IExQQzEoMjgpCisgICAgICAgICAgICBjYXNlIDI3OiBMUEMxKDI3KQorICAgICAgICAgICAgY2FzZSAyNjogTFBDMSgyNikKKyAgICAgICAgICAgIGNhc2UgMjU6IExQQzEoMjUpCisgICAgICAgICAgICBjYXNlIDI0OiBMUEMxKDI0KQorICAgICAgICAgICAgY2FzZSAyMzogTFBDMSgyMykKKyAgICAgICAgICAgIGNhc2UgMjI6IExQQzEoMjIpCisgICAgICAgICAgICBjYXNlIDIxOiBMUEMxKDIxKQorICAgICAgICAgICAgY2FzZSAyMDogTFBDMSgyMCkKKyAgICAgICAgICAgIGNhc2UgMTk6IExQQzEoMTkpCisgICAgICAgICAgICBjYXNlIDE4OiBMUEMxKDE4KQorICAgICAgICAgICAgY2FzZSAxNzogTFBDMSgxNykKKyAgICAgICAgICAgIGNhc2UgMTY6IExQQzEoMTYpCisgICAgICAgICAgICBjYXNlIDE1OiBMUEMxKDE1KQorICAgICAgICAgICAgY2FzZSAxNDogTFBDMSgxNCkKKyAgICAgICAgICAgIGNhc2UgMTM6IExQQzEoMTMpCisgICAgICAgICAgICBjYXNlIDEyOiBMUEMxKDEyKQorICAgICAgICAgICAgY2FzZSAxMTogTFBDMSgxMSkKKyAgICAgICAgICAgIGNhc2UgMTA6IExQQzEoMTApCisgICAgICAgICAgICBjYXNlICA5OiBMUEMxKCA5KQorICAgICAgICAgICAgICAgICAgICAgTFBDMSggOCkKKyAgICAgICAgICAgICAgICAgICAgIExQQzEoIDcpCisgICAgICAgICAgICAgICAgICAgICBMUEMxKCA2KQorICAgICAgICAgICAgICAgICAgICAgTFBDMSggNSkKKyAgICAgICAgICAgICAgICAgICAgIExQQzEoIDQpCisgICAgICAgICAgICAgICAgICAgICBMUEMxKCAzKQorICAgICAgICAgICAgICAgICAgICAgTFBDMSggMikKKyAgICAgICAgICAgICAgICAgICAgIExQQzEoIDEpCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9yZGVyKSB7CisgICAgICAgICAgICBjYXNlICA4OiBMUEMxKCA4KQorICAgICAgICAgICAgY2FzZSAgNzogTFBDMSggNykKKyAgICAgICAgICAgIGNhc2UgIDY6IExQQzEoIDYpCisgICAgICAgICAgICBjYXNlICA1OiBMUEMxKCA1KQorICAgICAgICAgICAgY2FzZSAgNDogTFBDMSggNCkKKyAgICAgICAgICAgIGNhc2UgIDM6IExQQzEoIDMpCisgICAgICAgICAgICBjYXNlICAyOiBMUEMxKCAyKQorICAgICAgICAgICAgY2FzZSAgMTogTFBDMSggMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXNbaSAgXSA9IHNtcFtpICBdIC0gQ0xJUChwMCA+PiBzaGlmdCk7CisgICAgICAgIHJlc1tpKzFdID0gc21wW2krMV0gLSBDTElQKHAxID4+IHNoaWZ0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMoZmxhY19scGNfZW5jb2RlX2MpKGludDMyX3QgKnJlcywgY29uc3QgaW50MzJfdCAqc21wLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yZGVyLCBjb25zdCBpbnQzMl90ICpjb2VmcywgaW50IHNoaWZ0KQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlcjsgaSsrKQorICAgICAgICByZXNbaV0gPSBzbXBbaV07CisjaWYgQ09ORklHX1NNQUxMCisgICAgZm9yIChpID0gb3JkZXI7IGkgPCBsZW47IGkgKz0gMikgeworICAgICAgICBpbnQgajsKKyAgICAgICAgaW50IHMgID0gc21wW2ldOworICAgICAgICBzdW1fdHlwZSBwMCA9IDAsIHAxID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG9yZGVyOyBqKyspIHsKKyAgICAgICAgICAgIGludCBjID0gY29lZnNbal07CisgICAgICAgICAgICBwMSAgICs9IE1VTChjLCBzKTsKKyAgICAgICAgICAgIHMgICAgID0gc21wW2ktai0xXTsKKyAgICAgICAgICAgIHAwICAgKz0gTVVMKGMsIHMpOworICAgICAgICB9CisgICAgICAgIHJlc1tpICBdID0gc21wW2kgIF0gLSBDTElQKHAwID4+IHNoaWZ0KTsKKyAgICAgICAgcmVzW2krMV0gPSBzbXBbaSsxXSAtIENMSVAocDEgPj4gc2hpZnQpOworICAgIH0KKyNlbHNlCisgICAgc3dpdGNoIChvcmRlcikgeworICAgIGNhc2UgIDE6IEZVTkMobHBjX2VuY29kZV91bnJvbGxlZCkocmVzLCBzbXAsIGxlbiwgICAgIDEsIGNvZWZzLCBzaGlmdCwgMCk7IGJyZWFrOworICAgIGNhc2UgIDI6IEZVTkMobHBjX2VuY29kZV91bnJvbGxlZCkocmVzLCBzbXAsIGxlbiwgICAgIDIsIGNvZWZzLCBzaGlmdCwgMCk7IGJyZWFrOworICAgIGNhc2UgIDM6IEZVTkMobHBjX2VuY29kZV91bnJvbGxlZCkocmVzLCBzbXAsIGxlbiwgICAgIDMsIGNvZWZzLCBzaGlmdCwgMCk7IGJyZWFrOworICAgIGNhc2UgIDQ6IEZVTkMobHBjX2VuY29kZV91bnJvbGxlZCkocmVzLCBzbXAsIGxlbiwgICAgIDQsIGNvZWZzLCBzaGlmdCwgMCk7IGJyZWFrOworICAgIGNhc2UgIDU6IEZVTkMobHBjX2VuY29kZV91bnJvbGxlZCkocmVzLCBzbXAsIGxlbiwgICAgIDUsIGNvZWZzLCBzaGlmdCwgMCk7IGJyZWFrOworICAgIGNhc2UgIDY6IEZVTkMobHBjX2VuY29kZV91bnJvbGxlZCkocmVzLCBzbXAsIGxlbiwgICAgIDYsIGNvZWZzLCBzaGlmdCwgMCk7IGJyZWFrOworICAgIGNhc2UgIDc6IEZVTkMobHBjX2VuY29kZV91bnJvbGxlZCkocmVzLCBzbXAsIGxlbiwgICAgIDcsIGNvZWZzLCBzaGlmdCwgMCk7IGJyZWFrOworICAgIGNhc2UgIDg6IEZVTkMobHBjX2VuY29kZV91bnJvbGxlZCkocmVzLCBzbXAsIGxlbiwgICAgIDgsIGNvZWZzLCBzaGlmdCwgMCk7IGJyZWFrOworICAgIGRlZmF1bHQ6IEZVTkMobHBjX2VuY29kZV91bnJvbGxlZCkocmVzLCBzbXAsIGxlbiwgb3JkZXIsIGNvZWZzLCBzaGlmdCwgMSk7IGJyZWFrOworICAgIH0KKyNlbmRpZgorfQorCisvKiBDb21tZW50IGZvciBjbGFyaXR5L2RlLW9iZnVzY2F0aW9uLgorICoKKyAqIGZvciAoaW50IGkgPSBvcmRlcjsgaSA8IGxlbjsgaSsrKSB7CisgKiAgICAgaW50MzJfdCBwID0gMDsKKyAqICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9yZGVyOyBqKyspIHsKKyAqICAgICAgICAgaW50IGMgPSBjb2Vmc1tqXTsKKyAqICAgICAgICAgaW50IHMgPSBzbXBbKGktMSktal07CisgKiAgICAgICAgIHAgICAgKz0gYypzOworICogICAgIH0KKyAqICAgICByZXNbaV0gPSBzbXBbaV0gLSAocCA+PiBzaGlmdCk7CisgKiB9CisgKgorICogVGhlIENPTkZJR19TTUFMTCBjb2RlIGFib3ZlIHNpbXBsaWZpZXMgdG8gdGhpcywgaW4gdGhlIGNhc2Ugb2YgU0FNUExFX1NJWkUKKyAqIG5vdCBiZWluZyBlcXVhbCB0byAzMiAoYXQgdGhlIHByZXNlbnQgdGltZSB0aGF0IG1lYW5zIGZvciAxNi1iaXQgYXVkaW8pLiBUaGUKKyAqIGNvZGUgYWJvdmUgZG9lcyAyIHNhbXBsZXMgcGVyIGl0ZXJhdGlvbi4gIENvbW1pdCBiZmRkNWJjIChtYWRlIGFsbCB0aGUgd2F5CisgKiBiYWNrIGluIDIwMDcpIHNheXMgdGhhdCB3YXkgaXMgZmFzdGVyLgorICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZHNwX3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZHNwX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjMGExNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYWNkc3BfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKKworI3VuZGVmIEZVTkMKKyN1bmRlZiBGU1VGCisjdW5kZWYgc2FtcGxlCisjdW5kZWYgc2FtcGxlX3R5cGUKKyN1bmRlZiBPVVQKKyN1bmRlZiBTCisKKyNpZiBTQU1QTEVfU0laRSA9PSAzMgorIyAgIGRlZmluZSBzYW1wbGVfdHlwZSAgaW50MzJfdAorI2Vsc2UKKyMgICBkZWZpbmUgc2FtcGxlX3R5cGUgIGludDE2X3QKKyNlbmRpZgorCisjaWYgUExBTkFSCisjICAgZGVmaW5lIEZTVUYgICBBVl9KT0lOKFNBTVBMRV9TSVpFLCBwKQorIyAgIGRlZmluZSBzYW1wbGUgc2FtcGxlX3R5cGUgKgorIyAgIGRlZmluZSBPVVQobikgbgorIyAgIGRlZmluZSBTKHMsIGMsIGkpIChzW2NdW2ldKQorI2Vsc2UKKyMgICBkZWZpbmUgRlNVRiAgIFNBTVBMRV9TSVpFCisjICAgZGVmaW5lIHNhbXBsZSBzYW1wbGVfdHlwZQorIyAgIGRlZmluZSBPVVQobikgblswXQorIyAgIGRlZmluZSBTKHMsIGMsIGkpICgqcysrKQorI2VuZGlmCisKKyNkZWZpbmUgRlVOQyhuKSBBVl9KT0lOKG4gIyMgXywgRlNVRikKKworc3RhdGljIHZvaWQgRlVOQyhmbGFjX2RlY29ycmVsYXRlX2luZGVwX2MpKHVpbnQ4X3QgKipvdXQsIGludDMyX3QgKippbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGludCBsZW4sIGludCBzaGlmdCkKK3sKKyAgICBzYW1wbGUgKnNhbXBsZXMgPSAoc2FtcGxlICopIE9VVChvdXQpOworICAgIGludCBpLCBqOworCisgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIFMoc2FtcGxlcywgaSwgaikgPSBpbltpXVtqXSA8PCBzaGlmdDsKK30KKworc3RhdGljIHZvaWQgRlVOQyhmbGFjX2RlY29ycmVsYXRlX2xzX2MpKHVpbnQ4X3QgKipvdXQsIGludDMyX3QgKippbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGludCBsZW4sIGludCBzaGlmdCkKK3sKKyAgICBzYW1wbGUgKnNhbXBsZXMgPSAoc2FtcGxlICopIE9VVChvdXQpOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGludCBhID0gaW5bMF1baV07CisgICAgICAgIGludCBiID0gaW5bMV1baV07CisgICAgICAgIFMoc2FtcGxlcywgMCwgaSkgPSAgYSAgICAgIDw8IHNoaWZ0OworICAgICAgICBTKHNhbXBsZXMsIDEsIGkpID0gKGEgLSBiKSA8PCBzaGlmdDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMoZmxhY19kZWNvcnJlbGF0ZV9yc19jKSh1aW50OF90ICoqb3V0LCBpbnQzMl90ICoqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBpbnQgbGVuLCBpbnQgc2hpZnQpCit7CisgICAgc2FtcGxlICpzYW1wbGVzID0gKHNhbXBsZSAqKSBPVVQob3V0KTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpbnQgYSA9IGluWzBdW2ldOworICAgICAgICBpbnQgYiA9IGluWzFdW2ldOworICAgICAgICBTKHNhbXBsZXMsIDAsIGkpID0gKGEgKyBiKSA8PCBzaGlmdDsKKyAgICAgICAgUyhzYW1wbGVzLCAxLCBpKSA9ICBiICAgICAgPDwgc2hpZnQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKGZsYWNfZGVjb3JyZWxhdGVfbXNfYykodWludDhfdCAqKm91dCwgaW50MzJfdCAqKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywgaW50IGxlbiwgaW50IHNoaWZ0KQoreworICAgIHNhbXBsZSAqc2FtcGxlcyA9IChzYW1wbGUgKikgT1VUKG91dCk7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaW50IGEgPSBpblswXVtpXTsKKyAgICAgICAgaW50IGIgPSBpblsxXVtpXTsKKyAgICAgICAgYSAtPSBiID4+IDE7CisgICAgICAgIFMoc2FtcGxlcywgMCwgaSkgPSAoYSArIGIpIDw8IHNoaWZ0OworICAgICAgICBTKHNhbXBsZXMsIDEsIGkpID0gIGEgICAgICA8PCBzaGlmdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFjZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2ZWYzZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYWNlbmMuYwpAQCAtMCwwICsxLDEzNzggQEAKKy8qCisgKiBGTEFDIGF1ZGlvIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiAgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50bWF0aC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZDUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxwYy5oIgorI2luY2x1ZGUgImZsYWMuaCIKKyNpbmNsdWRlICJmbGFjZGF0YS5oIgorI2luY2x1ZGUgImZsYWNkc3AuaCIKKworI2RlZmluZSBGTEFDX1NVQkZSQU1FX0NPTlNUQU5UICAwCisjZGVmaW5lIEZMQUNfU1VCRlJBTUVfVkVSQkFUSU0gIDEKKyNkZWZpbmUgRkxBQ19TVUJGUkFNRV9GSVhFRCAgICAgOAorI2RlZmluZSBGTEFDX1NVQkZSQU1FX0xQQyAgICAgIDMyCisKKyNkZWZpbmUgTUFYX0ZJWEVEX09SREVSICAgICA0CisjZGVmaW5lIE1BWF9QQVJUSVRJT05fT1JERVIgOAorI2RlZmluZSBNQVhfUEFSVElUSU9OUyAgICAgKDEgPDwgTUFYX1BBUlRJVElPTl9PUkRFUikKKyNkZWZpbmUgTUFYX0xQQ19QUkVDSVNJT04gIDE1CisjZGVmaW5lIE1BWF9MUENfU0hJRlQgICAgICAxNQorCitlbnVtIENvZGluZ01vZGUgeworICAgIENPRElOR19NT0RFX1JJQ0UgID0gNCwKKyAgICBDT0RJTkdfTU9ERV9SSUNFMiA9IDUsCit9OworCit0eXBlZGVmIHN0cnVjdCBDb21wcmVzc2lvbk9wdGlvbnMgeworICAgIGludCBjb21wcmVzc2lvbl9sZXZlbDsKKyAgICBpbnQgYmxvY2tfdGltZV9tczsKKyAgICBlbnVtIEZGTFBDVHlwZSBscGNfdHlwZTsKKyAgICBpbnQgbHBjX3Bhc3NlczsKKyAgICBpbnQgbHBjX2NvZWZmX3ByZWNpc2lvbjsKKyAgICBpbnQgbWluX3ByZWRpY3Rpb25fb3JkZXI7CisgICAgaW50IG1heF9wcmVkaWN0aW9uX29yZGVyOworICAgIGludCBwcmVkaWN0aW9uX29yZGVyX21ldGhvZDsKKyAgICBpbnQgbWluX3BhcnRpdGlvbl9vcmRlcjsKKyAgICBpbnQgbWF4X3BhcnRpdGlvbl9vcmRlcjsKKyAgICBpbnQgY2hfbW9kZTsKK30gQ29tcHJlc3Npb25PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBSaWNlQ29udGV4dCB7CisgICAgZW51bSBDb2RpbmdNb2RlIGNvZGluZ19tb2RlOworICAgIGludCBwb3JkZXI7CisgICAgaW50IHBhcmFtc1tNQVhfUEFSVElUSU9OU107Cit9IFJpY2VDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBGbGFjU3ViZnJhbWUgeworICAgIGludCB0eXBlOworICAgIGludCB0eXBlX2NvZGU7CisgICAgaW50IG9iaXRzOworICAgIGludCB3YXN0ZWQ7CisgICAgaW50IG9yZGVyOworICAgIGludDMyX3QgY29lZnNbTUFYX0xQQ19PUkRFUl07CisgICAgaW50IHNoaWZ0OworICAgIFJpY2VDb250ZXh0IHJjOworICAgIGludDMyX3Qgc2FtcGxlc1tGTEFDX01BWF9CTE9DS1NJWkVdOworICAgIGludDMyX3QgcmVzaWR1YWxbRkxBQ19NQVhfQkxPQ0tTSVpFKzExXTsKK30gRmxhY1N1YmZyYW1lOworCit0eXBlZGVmIHN0cnVjdCBGbGFjRnJhbWUgeworICAgIEZsYWNTdWJmcmFtZSBzdWJmcmFtZXNbRkxBQ19NQVhfQ0hBTk5FTFNdOworICAgIGludCBibG9ja3NpemU7CisgICAgaW50IGJzX2NvZGVbMl07CisgICAgdWludDhfdCBjcmM4OworICAgIGludCBjaF9tb2RlOworICAgIGludCB2ZXJiYXRpbV9vbmx5OworfSBGbGFjRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IEZsYWNFbmNvZGVDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIGludCBjaGFubmVsczsKKyAgICBpbnQgc2FtcGxlcmF0ZTsKKyAgICBpbnQgc3JfY29kZVsyXTsKKyAgICBpbnQgYnBzX2NvZGU7CisgICAgaW50IG1heF9ibG9ja3NpemU7CisgICAgaW50IG1pbl9mcmFtZXNpemU7CisgICAgaW50IG1heF9mcmFtZXNpemU7CisgICAgaW50IG1heF9lbmNvZGVkX2ZyYW1lc2l6ZTsKKyAgICB1aW50MzJfdCBmcmFtZV9jb3VudDsKKyAgICB1aW50NjRfdCBzYW1wbGVfY291bnQ7CisgICAgdWludDhfdCBtZDVzdW1bMTZdOworICAgIEZsYWNGcmFtZSBmcmFtZTsKKyAgICBDb21wcmVzc2lvbk9wdGlvbnMgb3B0aW9uczsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgTFBDQ29udGV4dCBscGNfY3R4OworICAgIHN0cnVjdCBBVk1ENSAqbWQ1Y3R4OworICAgIHVpbnQ4X3QgKm1kNV9idWZmZXI7CisgICAgdW5zaWduZWQgaW50IG1kNV9idWZmZXJfc2l6ZTsKKyAgICBCc3dhcERTUENvbnRleHQgYmRzcDsKKyAgICBGTEFDRFNQQ29udGV4dCBmbGFjX2RzcDsKKworICAgIGludCBmbHVzaGVkOworICAgIGludDY0X3QgbmV4dF9wdHM7Cit9IEZsYWNFbmNvZGVDb250ZXh0OworCisKKy8qKgorICogV3JpdGUgc3RyZWFtaW5mbyBtZXRhZGF0YSBibG9jayB0byBieXRlIGFycmF5LgorICovCitzdGF0aWMgdm9pZCB3cml0ZV9zdHJlYW1pbmZvKEZsYWNFbmNvZGVDb250ZXh0ICpzLCB1aW50OF90ICpoZWFkZXIpCit7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKworICAgIG1lbXNldChoZWFkZXIsIDAsIEZMQUNfU1RSRUFNSU5GT19TSVpFKTsKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgaGVhZGVyLCBGTEFDX1NUUkVBTUlORk9fU0laRSk7CisKKyAgICAvKiBzdHJlYW1pbmZvIG1ldGFkYXRhIGJsb2NrICovCisgICAgcHV0X2JpdHMoJnBiLCAxNiwgcy0+bWF4X2Jsb2Nrc2l6ZSk7CisgICAgcHV0X2JpdHMoJnBiLCAxNiwgcy0+bWF4X2Jsb2Nrc2l6ZSk7CisgICAgcHV0X2JpdHMoJnBiLCAyNCwgcy0+bWluX2ZyYW1lc2l6ZSk7CisgICAgcHV0X2JpdHMoJnBiLCAyNCwgcy0+bWF4X2ZyYW1lc2l6ZSk7CisgICAgcHV0X2JpdHMoJnBiLCAyMCwgcy0+c2FtcGxlcmF0ZSk7CisgICAgcHV0X2JpdHMoJnBiLCAzLCBzLT5jaGFubmVscy0xKTsKKyAgICBwdXRfYml0cygmcGIsICA1LCBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSAtIDEpOworICAgIC8qIHdyaXRlIDM2LWJpdCBzYW1wbGUgY291bnQgaW4gMiBwdXRfYml0cygpIGNhbGxzICovCisgICAgcHV0X2JpdHMoJnBiLCAyNCwgKHMtPnNhbXBsZV9jb3VudCAmIDB4RkZGRkZGMDAwTEwpID4+IDEyKTsKKyAgICBwdXRfYml0cygmcGIsIDEyLCAgcy0+c2FtcGxlX2NvdW50ICYgMHgwMDAwMDBGRkZMTCk7CisgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKyAgICBtZW1jcHkoJmhlYWRlclsxOF0sIHMtPm1kNXN1bSwgMTYpOworfQorCisKKy8qKgorICogU2V0IGJsb2Nrc2l6ZSBiYXNlZCBvbiBzYW1wbGVyYXRlLgorICogQ2hvb3NlIHRoZSBjbG9zZXN0IHByZWRlZmluZWQgYmxvY2tzaXplID49IEJMT0NLX1RJTUVfTVMgbWlsbGlzZWNvbmRzLgorICovCitzdGF0aWMgaW50IHNlbGVjdF9ibG9ja3NpemUoaW50IHNhbXBsZXJhdGUsIGludCBibG9ja190aW1lX21zKQoreworICAgIGludCBpOworICAgIGludCB0YXJnZXQ7CisgICAgaW50IGJsb2Nrc2l6ZTsKKworICAgIGF2X2Fzc2VydDAoc2FtcGxlcmF0ZSA+IDApOworICAgIGJsb2Nrc2l6ZSA9IGZmX2ZsYWNfYmxvY2tzaXplX3RhYmxlWzFdOworICAgIHRhcmdldCAgICA9IChzYW1wbGVyYXRlICogYmxvY2tfdGltZV9tcykgLyAxMDAwOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGlmICh0YXJnZXQgPj0gZmZfZmxhY19ibG9ja3NpemVfdGFibGVbaV0gJiYKKyAgICAgICAgICAgIGZmX2ZsYWNfYmxvY2tzaXplX3RhYmxlW2ldID4gYmxvY2tzaXplKSB7CisgICAgICAgICAgICBibG9ja3NpemUgPSBmZl9mbGFjX2Jsb2Nrc2l6ZV90YWJsZVtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmxvY2tzaXplOworfQorCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZHByaW50X2NvbXByZXNzaW9uX29wdGlvbnMoRmxhY0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgQVZDb2RlY0NvbnRleHQgICAgICphdmN0eCA9IHMtPmF2Y3R4OworICAgIENvbXByZXNzaW9uT3B0aW9ucyAqb3B0ICAgPSAmcy0+b3B0aW9uczsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiIGNvbXByZXNzaW9uOiAlZFxuIiwgb3B0LT5jb21wcmVzc2lvbl9sZXZlbCk7CisKKyAgICBzd2l0Y2ggKG9wdC0+bHBjX3R5cGUpIHsKKyAgICBjYXNlIEZGX0xQQ19UWVBFX05PTkU6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiIGxwYyB0eXBlOiBOb25lXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9MUENfVFlQRV9GSVhFRDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgbHBjIHR5cGU6IEZpeGVkIHByZS1kZWZpbmVkIGNvZWZmaWNpZW50c1xuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfTFBDX1RZUEVfTEVWSU5TT046CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiIGxwYyB0eXBlOiBMZXZpbnNvbi1EdXJiaW4gcmVjdXJzaW9uIHdpdGggV2VsY2ggd2luZG93XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9MUENfVFlQRV9DSE9MRVNLWToKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgbHBjIHR5cGU6IENob2xlc2t5IGZhY3Rvcml6YXRpb24sICVkIHBhc3Mlc1xuIiwKKyAgICAgICAgICAgICAgIG9wdC0+bHBjX3Bhc3Nlcywgb3B0LT5scGNfcGFzc2VzID09IDEgPyAiIiA6ICJlcyIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiBwcmVkaWN0aW9uIG9yZGVyOiAlZCwgJWRcbiIsCisgICAgICAgICAgIG9wdC0+bWluX3ByZWRpY3Rpb25fb3JkZXIsIG9wdC0+bWF4X3ByZWRpY3Rpb25fb3JkZXIpOworCisgICAgc3dpdGNoIChvcHQtPnByZWRpY3Rpb25fb3JkZXJfbWV0aG9kKSB7CisgICAgY2FzZSBPUkRFUl9NRVRIT0RfRVNUOgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiBvcmRlciBtZXRob2Q6ICVzXG4iLCAiZXN0aW1hdGUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUkRFUl9NRVRIT0RfMkxFVkVMOgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiBvcmRlciBtZXRob2Q6ICVzXG4iLCAiMi1sZXZlbCIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9SREVSX01FVEhPRF80TEVWRUw6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiIG9yZGVyIG1ldGhvZDogJXNcbiIsICI0LWxldmVsIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1JERVJfTUVUSE9EXzhMRVZFTDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgb3JkZXIgbWV0aG9kOiAlc1xuIiwgIjgtbGV2ZWwiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUkRFUl9NRVRIT0RfU0VBUkNIOgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiBvcmRlciBtZXRob2Q6ICVzXG4iLCAiZnVsbCBzZWFyY2giKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUkRFUl9NRVRIT0RfTE9HOgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiBvcmRlciBtZXRob2Q6ICVzXG4iLCAibG9nIHNlYXJjaCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiIHBhcnRpdGlvbiBvcmRlcjogJWQsICVkXG4iLAorICAgICAgICAgICBvcHQtPm1pbl9wYXJ0aXRpb25fb3JkZXIsIG9wdC0+bWF4X3BhcnRpdGlvbl9vcmRlcik7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiBibG9jayBzaXplOiAlZFxuIiwgYXZjdHgtPmZyYW1lX3NpemUpOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgbHBjIHByZWNpc2lvbjogJWRcbiIsCisgICAgICAgICAgIG9wdC0+bHBjX2NvZWZmX3ByZWNpc2lvbik7Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IGZsYWNfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBmcmVxID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIGludCBjaGFubmVscyA9IGF2Y3R4LT5jaGFubmVsczsKKyAgICBGbGFjRW5jb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIGxldmVsLCByZXQ7CisgICAgdWludDhfdCAqc3RyZWFtaW5mbzsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5zYW1wbGVfZm10KSB7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNjoKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSAxNjsKKyAgICAgICAgcy0+YnBzX2NvZGUgICAgICAgICAgICAgICAgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyOgorICAgICAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgIT0gMjQpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZW5jb2RpbmcgYXMgMjQgYml0cy1wZXItc2FtcGxlXG4iKTsKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSAyNDsKKyAgICAgICAgcy0+YnBzX2NvZGUgICAgICAgICAgICAgICAgPSA2OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoY2hhbm5lbHMgPCAxIHx8IGNoYW5uZWxzID4gRkxBQ19NQVhfQ0hBTk5FTFMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICIlZCBjaGFubmVscyBub3Qgc3VwcG9ydGVkIChtYXggJWQpXG4iLAorICAgICAgICAgICAgICAgY2hhbm5lbHMsIEZMQUNfTUFYX0NIQU5ORUxTKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKworICAgIC8qIGZpbmQgc2FtcGxlcmF0ZSBpbiB0YWJsZSAqLworICAgIGlmIChmcmVxIDwgMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGZvciAoaSA9IDQ7IGkgPCAxMjsgaSsrKSB7CisgICAgICAgIGlmIChmcmVxID09IGZmX2ZsYWNfc2FtcGxlX3JhdGVfdGFibGVbaV0pIHsKKyAgICAgICAgICAgIHMtPnNhbXBsZXJhdGUgPSBmZl9mbGFjX3NhbXBsZV9yYXRlX3RhYmxlW2ldOworICAgICAgICAgICAgcy0+c3JfY29kZVswXSA9IGk7CisgICAgICAgICAgICBzLT5zcl9jb2RlWzFdID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIC8qIGlmIG5vdCBpbiB0YWJsZSwgc2FtcGxlcmF0ZSBpcyBub24tc3RhbmRhcmQgKi8KKyAgICBpZiAoaSA9PSAxMikgeworICAgICAgICBpZiAoZnJlcSAlIDEwMDAgPT0gMCAmJiBmcmVxIDwgMjU1MDAwKSB7CisgICAgICAgICAgICBzLT5zcl9jb2RlWzBdID0gMTI7CisgICAgICAgICAgICBzLT5zcl9jb2RlWzFdID0gZnJlcSAvIDEwMDA7CisgICAgICAgIH0gZWxzZSBpZiAoZnJlcSAlIDEwID09IDAgJiYgZnJlcSA8IDY1NTM1MCkgeworICAgICAgICAgICAgcy0+c3JfY29kZVswXSA9IDE0OworICAgICAgICAgICAgcy0+c3JfY29kZVsxXSA9IGZyZXEgLyAxMDsKKyAgICAgICAgfSBlbHNlIGlmIChmcmVxIDwgNjU1MzUpIHsKKyAgICAgICAgICAgIHMtPnNyX2NvZGVbMF0gPSAxMzsKKyAgICAgICAgICAgIHMtPnNyX2NvZGVbMV0gPSBmcmVxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICIlZCBIeiBub3Qgc3VwcG9ydGVkXG4iLCBmcmVxKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgcy0+c2FtcGxlcmF0ZSA9IGZyZXE7CisgICAgfQorCisgICAgLyogc2V0IGNvbXByZXNzaW9uIG9wdGlvbiBkZWZhdWx0cyBiYXNlZCBvbiBhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgKi8KKyAgICBpZiAoYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsIDwgMCkKKyAgICAgICAgcy0+b3B0aW9ucy5jb21wcmVzc2lvbl9sZXZlbCA9IDU7CisgICAgZWxzZQorICAgICAgICBzLT5vcHRpb25zLmNvbXByZXNzaW9uX2xldmVsID0gYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsOworCisgICAgbGV2ZWwgPSBzLT5vcHRpb25zLmNvbXByZXNzaW9uX2xldmVsOworICAgIGlmIChsZXZlbCA+IDEyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBjb21wcmVzc2lvbiBsZXZlbDogJWRcbiIsCisgICAgICAgICAgICAgICBzLT5vcHRpb25zLmNvbXByZXNzaW9uX2xldmVsKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzLT5vcHRpb25zLmJsb2NrX3RpbWVfbXMgPSAoKGludFtdKXsgMjcsIDI3LCAyNywxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDV9KVtsZXZlbF07CisKKyAgICBpZiAocy0+b3B0aW9ucy5scGNfdHlwZSA9PSBGRl9MUENfVFlQRV9ERUZBVUxUKQorICAgICAgICBzLT5vcHRpb25zLmxwY190eXBlICA9ICgoaW50W10peyBGRl9MUENfVFlQRV9GSVhFRCwgICAgRkZfTFBDX1RZUEVfRklYRUQsICAgIEZGX0xQQ19UWVBFX0ZJWEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9MUENfVFlQRV9MRVZJTlNPTiwgRkZfTFBDX1RZUEVfTEVWSU5TT04sIEZGX0xQQ19UWVBFX0xFVklOU09OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9MUENfVFlQRV9MRVZJTlNPTiwgRkZfTFBDX1RZUEVfTEVWSU5TT04sIEZGX0xQQ19UWVBFX0xFVklOU09OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9MUENfVFlQRV9MRVZJTlNPTiwgRkZfTFBDX1RZUEVfTEVWSU5TT04sIEZGX0xQQ19UWVBFX0xFVklOU09OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9MUENfVFlQRV9MRVZJTlNPTn0pW2xldmVsXTsKKworICAgIHMtPm9wdGlvbnMubWluX3ByZWRpY3Rpb25fb3JkZXIgPSAoKGludFtdKXsgIDIsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDF9KVtsZXZlbF07CisgICAgcy0+b3B0aW9ucy5tYXhfcHJlZGljdGlvbl9vcmRlciA9ICgoaW50W10peyAgMywgIDQsICA0LCAgNiwgIDgsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDMyLCAzMn0pW2xldmVsXTsKKworICAgIGlmIChzLT5vcHRpb25zLnByZWRpY3Rpb25fb3JkZXJfbWV0aG9kIDwgMCkKKyAgICAgICAgcy0+b3B0aW9ucy5wcmVkaWN0aW9uX29yZGVyX21ldGhvZCA9ICgoaW50W10peyBPUkRFUl9NRVRIT0RfRVNULCAgICBPUkRFUl9NRVRIT0RfRVNULCAgICBPUkRFUl9NRVRIT0RfRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9SREVSX01FVEhPRF9FU1QsICAgIE9SREVSX01FVEhPRF9FU1QsICAgIE9SREVSX01FVEhPRF9FU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1JERVJfTUVUSE9EXzRMRVZFTCwgT1JERVJfTUVUSE9EX0xPRywgICAgT1JERVJfTUVUSE9EXzRMRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUkRFUl9NRVRIT0RfTE9HLCAgICBPUkRFUl9NRVRIT0RfU0VBUkNILCBPUkRFUl9NRVRIT0RfTE9HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9SREVSX01FVEhPRF9TRUFSQ0h9KVtsZXZlbF07CisKKyAgICBpZiAocy0+b3B0aW9ucy5taW5fcGFydGl0aW9uX29yZGVyID4gcy0+b3B0aW9ucy5tYXhfcGFydGl0aW9uX29yZGVyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBwYXJ0aXRpb24gb3JkZXJzOiBtaW49JWQgbWF4PSVkXG4iLAorICAgICAgICAgICAgICAgcy0+b3B0aW9ucy5taW5fcGFydGl0aW9uX29yZGVyLCBzLT5vcHRpb25zLm1heF9wYXJ0aXRpb25fb3JkZXIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAocy0+b3B0aW9ucy5taW5fcGFydGl0aW9uX29yZGVyIDwgMCkKKyAgICAgICAgcy0+b3B0aW9ucy5taW5fcGFydGl0aW9uX29yZGVyID0gKChpbnRbXSl7ICAyLCAgMiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSlbbGV2ZWxdOworICAgIGlmIChzLT5vcHRpb25zLm1heF9wYXJ0aXRpb25fb3JkZXIgPCAwKQorICAgICAgICBzLT5vcHRpb25zLm1heF9wYXJ0aXRpb25fb3JkZXIgPSAoKGludFtdKXsgIDIsICAyLCAgMywgIDMsICAzLCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDh9KVtsZXZlbF07CisKKyAgICBpZiAocy0+b3B0aW9ucy5scGNfdHlwZSA9PSBGRl9MUENfVFlQRV9OT05FKSB7CisgICAgICAgIHMtPm9wdGlvbnMubWluX3ByZWRpY3Rpb25fb3JkZXIgPSAwOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPm1pbl9wcmVkaWN0aW9uX29yZGVyID49IDApIHsKKyAgICAgICAgaWYgKHMtPm9wdGlvbnMubHBjX3R5cGUgPT0gRkZfTFBDX1RZUEVfRklYRUQpIHsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+bWluX3ByZWRpY3Rpb25fb3JkZXIgPiBNQVhfRklYRURfT1JERVIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbWluIHByZWRpY3Rpb24gb3JkZXI6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+bWluX3ByZWRpY3Rpb25fb3JkZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPm1pbl9wcmVkaWN0aW9uX29yZGVyIDwgTUlOX0xQQ19PUkRFUiB8fAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5taW5fcHJlZGljdGlvbl9vcmRlciA+IE1BWF9MUENfT1JERVIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBtaW4gcHJlZGljdGlvbiBvcmRlcjogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPm1pbl9wcmVkaWN0aW9uX29yZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgcy0+b3B0aW9ucy5taW5fcHJlZGljdGlvbl9vcmRlciA9IGF2Y3R4LT5taW5fcHJlZGljdGlvbl9vcmRlcjsKKyAgICB9CisgICAgaWYgKHMtPm9wdGlvbnMubHBjX3R5cGUgPT0gRkZfTFBDX1RZUEVfTk9ORSkgeworICAgICAgICBzLT5vcHRpb25zLm1heF9wcmVkaWN0aW9uX29yZGVyID0gMDsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5tYXhfcHJlZGljdGlvbl9vcmRlciA+PSAwKSB7CisgICAgICAgIGlmIChzLT5vcHRpb25zLmxwY190eXBlID09IEZGX0xQQ19UWVBFX0ZJWEVEKSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPm1heF9wcmVkaWN0aW9uX29yZGVyID4gTUFYX0ZJWEVEX09SREVSKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG1heCBwcmVkaWN0aW9uIG9yZGVyOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPm1heF9wcmVkaWN0aW9uX29yZGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5tYXhfcHJlZGljdGlvbl9vcmRlciA8IE1JTl9MUENfT1JERVIgfHwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+bWF4X3ByZWRpY3Rpb25fb3JkZXIgPiBNQVhfTFBDX09SREVSKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbWF4IHByZWRpY3Rpb24gb3JkZXI6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5tYXhfcHJlZGljdGlvbl9vcmRlcik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIHMtPm9wdGlvbnMubWF4X3ByZWRpY3Rpb25fb3JkZXIgPSBhdmN0eC0+bWF4X3ByZWRpY3Rpb25fb3JkZXI7CisgICAgfQorICAgIGlmIChzLT5vcHRpb25zLm1heF9wcmVkaWN0aW9uX29yZGVyIDwgcy0+b3B0aW9ucy5taW5fcHJlZGljdGlvbl9vcmRlcikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgcHJlZGljdGlvbiBvcmRlcnM6IG1pbj0lZCBtYXg9JWRcbiIsCisgICAgICAgICAgICAgICBzLT5vcHRpb25zLm1pbl9wcmVkaWN0aW9uX29yZGVyLCBzLT5vcHRpb25zLm1heF9wcmVkaWN0aW9uX29yZGVyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmZyYW1lX3NpemUgPiAwKSB7CisgICAgICAgIGlmIChhdmN0eC0+ZnJhbWVfc2l6ZSA8IEZMQUNfTUlOX0JMT0NLU0laRSB8fAorICAgICAgICAgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplID4gRkxBQ19NQVhfQkxPQ0tTSVpFKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgYmxvY2sgc2l6ZTogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPmZyYW1lX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmF2Y3R4LT5mcmFtZV9zaXplID0gc2VsZWN0X2Jsb2Nrc2l6ZShzLT5zYW1wbGVyYXRlLCBzLT5vcHRpb25zLmJsb2NrX3RpbWVfbXMpOworICAgIH0KKyAgICBzLT5tYXhfYmxvY2tzaXplID0gcy0+YXZjdHgtPmZyYW1lX3NpemU7CisKKyAgICAvKiBzZXQgbWF4aW11bSBlbmNvZGVkIGZyYW1lIHNpemUgaW4gdmVyYmF0aW0gbW9kZSAqLworICAgIHMtPm1heF9mcmFtZXNpemUgPSBmZl9mbGFjX2dldF9tYXhfZnJhbWVfc2l6ZShzLT5hdmN0eC0+ZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKTsKKworICAgIC8qIGluaXRpYWxpemUgTUQ1IGNvbnRleHQgKi8KKyAgICBzLT5tZDVjdHggPSBhdl9tZDVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPm1kNWN0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdl9tZDVfaW5pdChzLT5tZDVjdHgpOworCisgICAgc3RyZWFtaW5mbyA9IGF2X21hbGxvYyhGTEFDX1NUUkVBTUlORk9fU0laRSk7CisgICAgaWYgKCFzdHJlYW1pbmZvKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHdyaXRlX3N0cmVhbWluZm8ocywgc3RyZWFtaW5mbyk7CisgICAgYXZjdHgtPmV4dHJhZGF0YSA9IHN0cmVhbWluZm87CisgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gRkxBQ19TVFJFQU1JTkZPX1NJWkU7CisKKyAgICBzLT5mcmFtZV9jb3VudCAgID0gMDsKKyAgICBzLT5taW5fZnJhbWVzaXplID0gcy0+bWF4X2ZyYW1lc2l6ZTsKKworICAgIGlmIChjaGFubmVscyA9PSAzICYmCisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgIT0gKEFWX0NIX0xBWU9VVF9TVEVSRU98QVZfQ0hfRlJPTlRfQ0VOVEVSKSB8fAorICAgICAgICBjaGFubmVscyA9PSA0ICYmCisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgIT0gQVZfQ0hfTEFZT1VUXzJfMiAmJgorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ICE9IEFWX0NIX0xBWU9VVF9RVUFEIHx8CisgICAgICAgIGNoYW5uZWxzID09IDUgJiYKKyAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCAhPSBBVl9DSF9MQVlPVVRfNVBPSU5UMCAmJgorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ICE9IEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0sgfHwKKyAgICAgICAgY2hhbm5lbHMgPT0gNiAmJgorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ICE9IEFWX0NIX0xBWU9VVF81UE9JTlQxICYmCisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgIT0gQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSykgeworICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNoYW5uZWwgbGF5b3V0IG5vdCBzdXBwb3J0ZWQgYnkgRmxhYywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBzdHJlYW0gd2lsbCBoYXZlIGluY29ycmVjdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbCBsYXlvdXQuXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJObyBjaGFubmVsIGxheW91dCBzcGVjaWZpZWQuIFRoZSBlbmNvZGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpbGwgdXNlIEZsYWMgY2hhbm5lbCBsYXlvdXQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIGNoYW5uZWxzLlxuIiwgY2hhbm5lbHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gZmZfbHBjX2luaXQoJnMtPmxwY19jdHgsIGF2Y3R4LT5mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIHMtPm9wdGlvbnMubWF4X3ByZWRpY3Rpb25fb3JkZXIsIEZGX0xQQ19UWVBFX0xFVklOU09OKTsKKworICAgIGZmX2Jzd2FwZHNwX2luaXQoJnMtPmJkc3ApOworICAgIGZmX2ZsYWNkc3BfaW5pdCgmcy0+ZmxhY19kc3AsIGF2Y3R4LT5zYW1wbGVfZm10LCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUpOworCisgICAgZHByaW50X2NvbXByZXNzaW9uX29wdGlvbnMocyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIGluaXRfZnJhbWUoRmxhY0VuY29kZUNvbnRleHQgKnMsIGludCBuYl9zYW1wbGVzKQoreworICAgIGludCBpLCBjaDsKKyAgICBGbGFjRnJhbWUgKmZyYW1lOworCisgICAgZnJhbWUgPSAmcy0+ZnJhbWU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBpZiAobmJfc2FtcGxlcyA9PSBmZl9mbGFjX2Jsb2Nrc2l6ZV90YWJsZVtpXSkgeworICAgICAgICAgICAgZnJhbWUtPmJsb2Nrc2l6ZSAgPSBmZl9mbGFjX2Jsb2Nrc2l6ZV90YWJsZVtpXTsKKyAgICAgICAgICAgIGZyYW1lLT5ic19jb2RlWzBdID0gaTsKKyAgICAgICAgICAgIGZyYW1lLT5ic19jb2RlWzFdID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IDE2KSB7CisgICAgICAgIGZyYW1lLT5ibG9ja3NpemUgPSBuYl9zYW1wbGVzOworICAgICAgICBpZiAoZnJhbWUtPmJsb2Nrc2l6ZSA8PSAyNTYpIHsKKyAgICAgICAgICAgIGZyYW1lLT5ic19jb2RlWzBdID0gNjsKKyAgICAgICAgICAgIGZyYW1lLT5ic19jb2RlWzFdID0gZnJhbWUtPmJsb2Nrc2l6ZS0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJhbWUtPmJzX2NvZGVbMF0gPSA3OworICAgICAgICAgICAgZnJhbWUtPmJzX2NvZGVbMV0gPSBmcmFtZS0+YmxvY2tzaXplLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBGbGFjU3ViZnJhbWUgKnN1YiA9ICZmcmFtZS0+c3ViZnJhbWVzW2NoXTsKKworICAgICAgICBzdWItPndhc3RlZCA9IDA7CisgICAgICAgIHN1Yi0+b2JpdHMgID0gcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGU7CisKKyAgICAgICAgaWYgKHN1Yi0+b2JpdHMgPiAxNikKKyAgICAgICAgICAgIHN1Yi0+cmMuY29kaW5nX21vZGUgPSBDT0RJTkdfTU9ERV9SSUNFMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3ViLT5yYy5jb2RpbmdfbW9kZSA9IENPRElOR19NT0RFX1JJQ0U7CisgICAgfQorCisgICAgZnJhbWUtPnZlcmJhdGltX29ubHkgPSAwOworfQorCisKKy8qKgorICogQ29weSBjaGFubmVsLWludGVybGVhdmVkIGlucHV0IHNhbXBsZXMgaW50byBzZXBhcmF0ZSBzdWJmcmFtZXMuCisgKi8KK3N0YXRpYyB2b2lkIGNvcHlfc2FtcGxlcyhGbGFjRW5jb2RlQ29udGV4dCAqcywgY29uc3Qgdm9pZCAqc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgaiwgY2g7CisgICAgRmxhY0ZyYW1lICpmcmFtZTsKKyAgICBpbnQgc2hpZnQgPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShzLT5hdmN0eC0+c2FtcGxlX2ZtdCkgKiA4IC0KKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZTsKKworI2RlZmluZSBDT1BZX1NBTVBMRVMoYml0cykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50ICMjIGJpdHMgIyMgX3QgKnNhbXBsZXMwID0gc2FtcGxlczsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcmFtZSA9ICZzLT5mcmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgZnJhbWUtPmJsb2Nrc2l6ZTsgaSsrKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmNoYW5uZWxzOyBjaCsrLCBqKyspICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZyYW1lLT5zdWJmcmFtZXNbY2hdLnNhbXBsZXNbaV0gPSBzYW1wbGVzMFtqXSA+PiBzaGlmdDsgXAorfSB3aGlsZSAoMCkKKworICAgIGlmIChzLT5hdmN0eC0+c2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNikKKyAgICAgICAgQ09QWV9TQU1QTEVTKDE2KTsKKyAgICBlbHNlCisgICAgICAgIENPUFlfU0FNUExFUygzMik7Cit9CisKKworc3RhdGljIHVpbnQ2NF90IHJpY2VfY291bnRfZXhhY3QoaW50MzJfdCAqcmVzLCBpbnQgbiwgaW50IGspCit7CisgICAgaW50IGk7CisgICAgdWludDY0X3QgY291bnQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQzMl90IHYgPSAtMiAqIHJlc1tpXSAtIDE7CisgICAgICAgIHYgXj0gdiA+PiAzMTsKKyAgICAgICAgY291bnQgKz0gKHYgPj4gaykgKyAxICsgazsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCisKK3N0YXRpYyB1aW50NjRfdCBzdWJmcmFtZV9jb3VudF9leGFjdChGbGFjRW5jb2RlQ29udGV4dCAqcywgRmxhY1N1YmZyYW1lICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRfb3JkZXIpCit7CisgICAgaW50IHAsIHBvcmRlciwgcHNpemU7CisgICAgaW50IGksIHBhcnRfZW5kOworICAgIHVpbnQ2NF90IGNvdW50ID0gMDsKKworICAgIC8qIHN1YmZyYW1lIGhlYWRlciAqLworICAgIGNvdW50ICs9IDg7CisKKyAgICAvKiBzdWJmcmFtZSAqLworICAgIGlmIChzdWItPnR5cGUgPT0gRkxBQ19TVUJGUkFNRV9DT05TVEFOVCkgeworICAgICAgICBjb3VudCArPSBzdWItPm9iaXRzOworICAgIH0gZWxzZSBpZiAoc3ViLT50eXBlID09IEZMQUNfU1VCRlJBTUVfVkVSQkFUSU0pIHsKKyAgICAgICAgY291bnQgKz0gcy0+ZnJhbWUuYmxvY2tzaXplICogc3ViLT5vYml0czsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiB3YXJtLXVwIHNhbXBsZXMgKi8KKyAgICAgICAgY291bnQgKz0gcHJlZF9vcmRlciAqIHN1Yi0+b2JpdHM7CisKKyAgICAgICAgLyogTFBDIGNvZWZmaWNpZW50cyAqLworICAgICAgICBpZiAoc3ViLT50eXBlID09IEZMQUNfU1VCRlJBTUVfTFBDKQorICAgICAgICAgICAgY291bnQgKz0gNCArIDUgKyBwcmVkX29yZGVyICogcy0+b3B0aW9ucy5scGNfY29lZmZfcHJlY2lzaW9uOworCisgICAgICAgIC8qIHJpY2UtZW5jb2RlZCBibG9jayAqLworICAgICAgICBjb3VudCArPSAyOworCisgICAgICAgIC8qIHBhcnRpdGlvbiBvcmRlciAqLworICAgICAgICBwb3JkZXIgPSBzdWItPnJjLnBvcmRlcjsKKyAgICAgICAgcHNpemUgID0gcy0+ZnJhbWUuYmxvY2tzaXplID4+IHBvcmRlcjsKKyAgICAgICAgY291bnQgKz0gNDsKKworICAgICAgICAvKiByZXNpZHVhbCAqLworICAgICAgICBpICAgICAgICA9IHByZWRfb3JkZXI7CisgICAgICAgIHBhcnRfZW5kID0gcHNpemU7CisgICAgICAgIGZvciAocCA9IDA7IHAgPCAxIDw8IHBvcmRlcjsgcCsrKSB7CisgICAgICAgICAgICBpbnQgayA9IHN1Yi0+cmMucGFyYW1zW3BdOworICAgICAgICAgICAgY291bnQgKz0gc3ViLT5yYy5jb2RpbmdfbW9kZTsKKyAgICAgICAgICAgIGNvdW50ICs9IHJpY2VfY291bnRfZXhhY3QoJnN1Yi0+cmVzaWR1YWxbaV0sIHBhcnRfZW5kIC0gaSwgayk7CisgICAgICAgICAgICBpID0gcGFydF9lbmQ7CisgICAgICAgICAgICBwYXJ0X2VuZCA9IEZGTUlOKHMtPmZyYW1lLmJsb2Nrc2l6ZSwgcGFydF9lbmQgKyBwc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKworI2RlZmluZSByaWNlX2VuY29kZV9jb3VudChzdW0sIG4sIGspICgoKG4pKigoaykrMSkpKygoc3VtLShuPj4xKSk+PihrKSkpCisKKy8qKgorICogU29sdmUgZm9yIGQvZGsocmljZV9lbmNvZGVfY291bnQpID0gbi0oKHN1bS0obj4+MSkpPj4oaysxKSkgPSAwLgorICovCitzdGF0aWMgaW50IGZpbmRfb3B0aW1hbF9wYXJhbSh1aW50NjRfdCBzdW0sIGludCBuLCBpbnQgbWF4X3BhcmFtKQoreworICAgIGludCBrOworICAgIHVpbnQ2NF90IHN1bTI7CisKKyAgICBpZiAoc3VtIDw9IG4gPj4gMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3VtMiA9IHN1bSAtIChuID4+IDEpOworICAgIGsgICAgPSBhdl9sb2cyKGF2X2NsaXBsX2ludDMyKHN1bTIgLyBuKSk7CisgICAgcmV0dXJuIEZGTUlOKGssIG1heF9wYXJhbSk7Cit9CisKKworc3RhdGljIHVpbnQ2NF90IGNhbGNfb3B0aW1hbF9yaWNlX3BhcmFtcyhSaWNlQ29udGV4dCAqcmMsIGludCBwb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpzdW1zLCBpbnQgbiwgaW50IHByZWRfb3JkZXIpCit7CisgICAgaW50IGk7CisgICAgaW50IGssIGNudCwgcGFydCwgbWF4X3BhcmFtOworICAgIHVpbnQ2NF90IGFsbF9iaXRzOworCisgICAgbWF4X3BhcmFtID0gKDEgPDwgcmMtPmNvZGluZ19tb2RlKSAtIDI7CisKKyAgICBwYXJ0ICAgICA9ICgxIDw8IHBvcmRlcik7CisgICAgYWxsX2JpdHMgPSA0ICogcGFydDsKKworICAgIGNudCA9IChuID4+IHBvcmRlcikgLSBwcmVkX29yZGVyOworICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0OyBpKyspIHsKKyAgICAgICAgayA9IGZpbmRfb3B0aW1hbF9wYXJhbShzdW1zW2ldLCBjbnQsIG1heF9wYXJhbSk7CisgICAgICAgIHJjLT5wYXJhbXNbaV0gPSBrOworICAgICAgICBhbGxfYml0cyArPSByaWNlX2VuY29kZV9jb3VudChzdW1zW2ldLCBjbnQsIGspOworICAgICAgICBjbnQgPSBuID4+IHBvcmRlcjsKKyAgICB9CisKKyAgICByYy0+cG9yZGVyID0gcG9yZGVyOworCisgICAgcmV0dXJuIGFsbF9iaXRzOworfQorCisKK3N0YXRpYyB2b2lkIGNhbGNfc3VtcyhpbnQgcG1pbiwgaW50IHBtYXgsIHVpbnQzMl90ICpkYXRhLCBpbnQgbiwgaW50IHByZWRfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3Vtc1tdW01BWF9QQVJUSVRJT05TXSkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgcGFydHM7CisgICAgdWludDMyX3QgKnJlcywgKnJlc19lbmQ7CisKKyAgICAvKiBzdW1zIGZvciBoaWdoZXN0IGxldmVsICovCisgICAgcGFydHMgICA9ICgxIDw8IHBtYXgpOworICAgIHJlcyAgICAgPSAmZGF0YVtwcmVkX29yZGVyXTsKKyAgICByZXNfZW5kID0gJmRhdGFbbiA+PiBwbWF4XTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHM7IGkrKykgeworICAgICAgICB1aW50NjRfdCBzdW0gPSAwOworICAgICAgICB3aGlsZSAocmVzIDwgcmVzX2VuZCkKKyAgICAgICAgICAgIHN1bSArPSAqKHJlcysrKTsKKyAgICAgICAgc3Vtc1twbWF4XVtpXSA9IHN1bTsKKyAgICAgICAgcmVzX2VuZCArPSBuID4+IHBtYXg7CisgICAgfQorICAgIC8qIHN1bXMgZm9yIGxvd2VyIGxldmVscyAqLworICAgIGZvciAoaSA9IHBtYXggLSAxOyBpID49IHBtaW47IGktLSkgeworICAgICAgICBwYXJ0cyA9ICgxIDw8IGkpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGFydHM7IGorKykKKyAgICAgICAgICAgIHN1bXNbaV1bal0gPSBzdW1zW2krMV1bMipqXSArIHN1bXNbaSsxXVsyKmorMV07CisgICAgfQorfQorCisKK3N0YXRpYyB1aW50NjRfdCBjYWxjX3JpY2VfcGFyYW1zKFJpY2VDb250ZXh0ICpyYywgaW50IHBtaW4sIGludCBwbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqZGF0YSwgaW50IG4sIGludCBwcmVkX29yZGVyKQoreworICAgIGludCBpOworICAgIHVpbnQ2NF90IGJpdHNbTUFYX1BBUlRJVElPTl9PUkRFUisxXTsKKyAgICBpbnQgb3B0X3BvcmRlcjsKKyAgICBSaWNlQ29udGV4dCB0bXBfcmM7CisgICAgdWludDMyX3QgKnVkYXRhOworICAgIHVpbnQ2NF90IHN1bXNbTUFYX1BBUlRJVElPTl9PUkRFUisxXVtNQVhfUEFSVElUSU9OU107CisKKyAgICBhdl9hc3NlcnQxKHBtaW4gPj0gMCAmJiBwbWluIDw9IE1BWF9QQVJUSVRJT05fT1JERVIpOworICAgIGF2X2Fzc2VydDEocG1heCA+PSAwICYmIHBtYXggPD0gTUFYX1BBUlRJVElPTl9PUkRFUik7CisgICAgYXZfYXNzZXJ0MShwbWluIDw9IHBtYXgpOworCisgICAgdG1wX3JjLmNvZGluZ19tb2RlID0gcmMtPmNvZGluZ19tb2RlOworCisgICAgdWRhdGEgPSBhdl9tYWxsb2NfYXJyYXkobiwgIHNpemVvZih1aW50MzJfdCkpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHVkYXRhW2ldID0gKDIqZGF0YVtpXSkgXiAoZGF0YVtpXT4+MzEpOworCisgICAgY2FsY19zdW1zKHBtaW4sIHBtYXgsIHVkYXRhLCBuLCBwcmVkX29yZGVyLCBzdW1zKTsKKworICAgIG9wdF9wb3JkZXIgPSBwbWluOworICAgIGJpdHNbcG1pbl0gPSBVSU5UMzJfTUFYOworICAgIGZvciAoaSA9IHBtaW47IGkgPD0gcG1heDsgaSsrKSB7CisgICAgICAgIGJpdHNbaV0gPSBjYWxjX29wdGltYWxfcmljZV9wYXJhbXMoJnRtcF9yYywgaSwgc3Vtc1tpXSwgbiwgcHJlZF9vcmRlcik7CisgICAgICAgIGlmIChiaXRzW2ldIDw9IGJpdHNbb3B0X3BvcmRlcl0pIHsKKyAgICAgICAgICAgIG9wdF9wb3JkZXIgPSBpOworICAgICAgICAgICAgKnJjID0gdG1wX3JjOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJlZXAoJnVkYXRhKTsKKyAgICByZXR1cm4gYml0c1tvcHRfcG9yZGVyXTsKK30KKworCitzdGF0aWMgaW50IGdldF9tYXhfcF9vcmRlcihpbnQgbWF4X3BvcmRlciwgaW50IG4sIGludCBvcmRlcikKK3sKKyAgICBpbnQgcG9yZGVyID0gRkZNSU4obWF4X3BvcmRlciwgYXZfbG9nMihuXihuLTEpKSk7CisgICAgaWYgKG9yZGVyID4gMCkKKyAgICAgICAgcG9yZGVyID0gRkZNSU4ocG9yZGVyLCBhdl9sb2cyKG4vb3JkZXIpKTsKKyAgICByZXR1cm4gcG9yZGVyOworfQorCisKK3N0YXRpYyB1aW50NjRfdCBmaW5kX3N1YmZyYW1lX3JpY2VfcGFyYW1zKEZsYWNFbmNvZGVDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhY1N1YmZyYW1lICpzdWIsIGludCBwcmVkX29yZGVyKQoreworICAgIGludCBwbWluID0gZ2V0X21heF9wX29yZGVyKHMtPm9wdGlvbnMubWluX3BhcnRpdGlvbl9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZS5ibG9ja3NpemUsIHByZWRfb3JkZXIpOworICAgIGludCBwbWF4ID0gZ2V0X21heF9wX29yZGVyKHMtPm9wdGlvbnMubWF4X3BhcnRpdGlvbl9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZS5ibG9ja3NpemUsIHByZWRfb3JkZXIpOworCisgICAgdWludDY0X3QgYml0cyA9IDggKyBwcmVkX29yZGVyICogc3ViLT5vYml0cyArIDIgKyBzdWItPnJjLmNvZGluZ19tb2RlOworICAgIGlmIChzdWItPnR5cGUgPT0gRkxBQ19TVUJGUkFNRV9MUEMpCisgICAgICAgIGJpdHMgKz0gNCArIDUgKyBwcmVkX29yZGVyICogcy0+b3B0aW9ucy5scGNfY29lZmZfcHJlY2lzaW9uOworICAgIGJpdHMgKz0gY2FsY19yaWNlX3BhcmFtcygmc3ViLT5yYywgcG1pbiwgcG1heCwgc3ViLT5yZXNpZHVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWUuYmxvY2tzaXplLCBwcmVkX29yZGVyKTsKKyAgICByZXR1cm4gYml0czsKK30KKworCitzdGF0aWMgdm9pZCBlbmNvZGVfcmVzaWR1YWxfZml4ZWQoaW50MzJfdCAqcmVzLCBjb25zdCBpbnQzMl90ICpzbXAsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRlcikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlcjsgaSsrKQorICAgICAgICByZXNbaV0gPSBzbXBbaV07CisKKyAgICBpZiAob3JkZXIgPT0gMCkgeworICAgICAgICBmb3IgKGkgPSBvcmRlcjsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHJlc1tpXSA9IHNtcFtpXTsKKyAgICB9IGVsc2UgaWYgKG9yZGVyID09IDEpIHsKKyAgICAgICAgZm9yIChpID0gb3JkZXI7IGkgPCBuOyBpKyspCisgICAgICAgICAgICByZXNbaV0gPSBzbXBbaV0gLSBzbXBbaS0xXTsKKyAgICB9IGVsc2UgaWYgKG9yZGVyID09IDIpIHsKKyAgICAgICAgaW50IGEgPSBzbXBbb3JkZXItMV0gLSBzbXBbb3JkZXItMl07CisgICAgICAgIGZvciAoaSA9IG9yZGVyOyBpIDwgbjsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgYiAgICA9IHNtcFtpICBdIC0gc21wW2ktMV07CisgICAgICAgICAgICByZXNbaV0gICA9IGIgLSBhOworICAgICAgICAgICAgYSAgICAgICAgPSBzbXBbaSsxXSAtIHNtcFtpICBdOworICAgICAgICAgICAgcmVzW2krMV0gPSBhIC0gYjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob3JkZXIgPT0gMykgeworICAgICAgICBpbnQgYSA9IHNtcFtvcmRlci0xXSAtICAgc21wW29yZGVyLTJdOworICAgICAgICBpbnQgYyA9IHNtcFtvcmRlci0xXSAtIDIqc21wW29yZGVyLTJdICsgc21wW29yZGVyLTNdOworICAgICAgICBmb3IgKGkgPSBvcmRlcjsgaSA8IG47IGkgKz0gMikgeworICAgICAgICAgICAgaW50IGIgICAgPSBzbXBbaSAgXSAtIHNtcFtpLTFdOworICAgICAgICAgICAgaW50IGQgICAgPSBiIC0gYTsKKyAgICAgICAgICAgIHJlc1tpXSAgID0gZCAtIGM7CisgICAgICAgICAgICBhICAgICAgICA9IHNtcFtpKzFdIC0gc21wW2kgIF07CisgICAgICAgICAgICBjICAgICAgICA9IGEgLSBiOworICAgICAgICAgICAgcmVzW2krMV0gPSBjIC0gZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBhID0gc21wW29yZGVyLTFdIC0gICBzbXBbb3JkZXItMl07CisgICAgICAgIGludCBjID0gc21wW29yZGVyLTFdIC0gMipzbXBbb3JkZXItMl0gKyAgIHNtcFtvcmRlci0zXTsKKyAgICAgICAgaW50IGUgPSBzbXBbb3JkZXItMV0gLSAzKnNtcFtvcmRlci0yXSArIDMqc21wW29yZGVyLTNdIC0gc21wW29yZGVyLTRdOworICAgICAgICBmb3IgKGkgPSBvcmRlcjsgaSA8IG47IGkgKz0gMikgeworICAgICAgICAgICAgaW50IGIgICAgPSBzbXBbaSAgXSAtIHNtcFtpLTFdOworICAgICAgICAgICAgaW50IGQgICAgPSBiIC0gYTsKKyAgICAgICAgICAgIGludCBmICAgID0gZCAtIGM7CisgICAgICAgICAgICByZXNbaSAgXSA9IGYgLSBlOworICAgICAgICAgICAgYSAgICAgICAgPSBzbXBbaSsxXSAtIHNtcFtpICBdOworICAgICAgICAgICAgYyAgICAgICAgPSBhIC0gYjsKKyAgICAgICAgICAgIGUgICAgICAgID0gYyAtIGQ7CisgICAgICAgICAgICByZXNbaSsxXSA9IGUgLSBmOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQgZW5jb2RlX3Jlc2lkdWFsX2NoKEZsYWNFbmNvZGVDb250ZXh0ICpzLCBpbnQgY2gpCit7CisgICAgaW50IGksIG47CisgICAgaW50IG1pbl9vcmRlciwgbWF4X29yZGVyLCBvcHRfb3JkZXIsIG9tZXRob2Q7CisgICAgRmxhY0ZyYW1lICpmcmFtZTsKKyAgICBGbGFjU3ViZnJhbWUgKnN1YjsKKyAgICBpbnQzMl90IGNvZWZzW01BWF9MUENfT1JERVJdW01BWF9MUENfT1JERVJdOworICAgIGludCBzaGlmdFtNQVhfTFBDX09SREVSXTsKKyAgICBpbnQzMl90ICpyZXMsICpzbXA7CisKKyAgICBmcmFtZSA9ICZzLT5mcmFtZTsKKyAgICBzdWIgICA9ICZmcmFtZS0+c3ViZnJhbWVzW2NoXTsKKyAgICByZXMgICA9IHN1Yi0+cmVzaWR1YWw7CisgICAgc21wICAgPSBzdWItPnNhbXBsZXM7CisgICAgbiAgICAgPSBmcmFtZS0+YmxvY2tzaXplOworCisgICAgLyogQ09OU1RBTlQgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKQorICAgICAgICBpZihzbXBbaV0gIT0gc21wWzBdKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGkgPT0gbikgeworICAgICAgICBzdWItPnR5cGUgPSBzdWItPnR5cGVfY29kZSA9IEZMQUNfU1VCRlJBTUVfQ09OU1RBTlQ7CisgICAgICAgIHJlc1swXSA9IHNtcFswXTsKKyAgICAgICAgcmV0dXJuIHN1YmZyYW1lX2NvdW50X2V4YWN0KHMsIHN1YiwgMCk7CisgICAgfQorCisgICAgLyogVkVSQkFUSU0gKi8KKyAgICBpZiAoZnJhbWUtPnZlcmJhdGltX29ubHkgfHwgbiA8IDUpIHsKKyAgICAgICAgc3ViLT50eXBlID0gc3ViLT50eXBlX2NvZGUgPSBGTEFDX1NVQkZSQU1FX1ZFUkJBVElNOworICAgICAgICBtZW1jcHkocmVzLCBzbXAsIG4gKiBzaXplb2YoaW50MzJfdCkpOworICAgICAgICByZXR1cm4gc3ViZnJhbWVfY291bnRfZXhhY3Qocywgc3ViLCAwKTsKKyAgICB9CisKKyAgICBtaW5fb3JkZXIgID0gcy0+b3B0aW9ucy5taW5fcHJlZGljdGlvbl9vcmRlcjsKKyAgICBtYXhfb3JkZXIgID0gcy0+b3B0aW9ucy5tYXhfcHJlZGljdGlvbl9vcmRlcjsKKyAgICBvbWV0aG9kICAgID0gcy0+b3B0aW9ucy5wcmVkaWN0aW9uX29yZGVyX21ldGhvZDsKKworICAgIC8qIEZJWEVEICovCisgICAgc3ViLT50eXBlID0gRkxBQ19TVUJGUkFNRV9GSVhFRDsKKyAgICBpZiAocy0+b3B0aW9ucy5scGNfdHlwZSA9PSBGRl9MUENfVFlQRV9OT05FICB8fAorICAgICAgICBzLT5vcHRpb25zLmxwY190eXBlID09IEZGX0xQQ19UWVBFX0ZJWEVEIHx8IG4gPD0gbWF4X29yZGVyKSB7CisgICAgICAgIHVpbnQ2NF90IGJpdHNbTUFYX0ZJWEVEX09SREVSKzFdOworICAgICAgICBpZiAobWF4X29yZGVyID4gTUFYX0ZJWEVEX09SREVSKQorICAgICAgICAgICAgbWF4X29yZGVyID0gTUFYX0ZJWEVEX09SREVSOworICAgICAgICBvcHRfb3JkZXIgPSAwOworICAgICAgICBiaXRzWzBdICAgPSBVSU5UMzJfTUFYOworICAgICAgICBmb3IgKGkgPSBtaW5fb3JkZXI7IGkgPD0gbWF4X29yZGVyOyBpKyspIHsKKyAgICAgICAgICAgIGVuY29kZV9yZXNpZHVhbF9maXhlZChyZXMsIHNtcCwgbiwgaSk7CisgICAgICAgICAgICBiaXRzW2ldID0gZmluZF9zdWJmcmFtZV9yaWNlX3BhcmFtcyhzLCBzdWIsIGkpOworICAgICAgICAgICAgaWYgKGJpdHNbaV0gPCBiaXRzW29wdF9vcmRlcl0pCisgICAgICAgICAgICAgICAgb3B0X29yZGVyID0gaTsKKyAgICAgICAgfQorICAgICAgICBzdWItPm9yZGVyICAgICA9IG9wdF9vcmRlcjsKKyAgICAgICAgc3ViLT50eXBlX2NvZGUgPSBzdWItPnR5cGUgfCBzdWItPm9yZGVyOworICAgICAgICBpZiAoc3ViLT5vcmRlciAhPSBtYXhfb3JkZXIpIHsKKyAgICAgICAgICAgIGVuY29kZV9yZXNpZHVhbF9maXhlZChyZXMsIHNtcCwgbiwgc3ViLT5vcmRlcik7CisgICAgICAgICAgICBmaW5kX3N1YmZyYW1lX3JpY2VfcGFyYW1zKHMsIHN1Yiwgc3ViLT5vcmRlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1YmZyYW1lX2NvdW50X2V4YWN0KHMsIHN1Yiwgc3ViLT5vcmRlcik7CisgICAgfQorCisgICAgLyogTFBDICovCisgICAgc3ViLT50eXBlID0gRkxBQ19TVUJGUkFNRV9MUEM7CisgICAgb3B0X29yZGVyID0gZmZfbHBjX2NhbGNfY29lZnMoJnMtPmxwY19jdHgsIHNtcCwgbiwgbWluX29yZGVyLCBtYXhfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+b3B0aW9ucy5scGNfY29lZmZfcHJlY2lzaW9uLCBjb2Vmcywgc2hpZnQsIHMtPm9wdGlvbnMubHBjX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+b3B0aW9ucy5scGNfcGFzc2VzLCBvbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9MUENfU0hJRlQsIDApOworCisgICAgaWYgKG9tZXRob2QgPT0gT1JERVJfTUVUSE9EXzJMRVZFTCB8fAorICAgICAgICBvbWV0aG9kID09IE9SREVSX01FVEhPRF80TEVWRUwgfHwKKyAgICAgICAgb21ldGhvZCA9PSBPUkRFUl9NRVRIT0RfOExFVkVMKSB7CisgICAgICAgIGludCBsZXZlbHMgPSAxIDw8IG9tZXRob2Q7CisgICAgICAgIHVpbnQ2NF90IGJpdHNbMSA8PCBPUkRFUl9NRVRIT0RfOExFVkVMXTsKKyAgICAgICAgaW50IG9yZGVyICAgICAgID0gLTE7CisgICAgICAgIGludCBvcHRfaW5kZXggICA9IGxldmVscy0xOworICAgICAgICBvcHRfb3JkZXIgICAgICAgPSBtYXhfb3JkZXItMTsKKyAgICAgICAgYml0c1tvcHRfaW5kZXhdID0gVUlOVDMyX01BWDsKKyAgICAgICAgZm9yIChpID0gbGV2ZWxzLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBpbnQgbGFzdF9vcmRlciA9IG9yZGVyOworICAgICAgICAgICAgb3JkZXIgPSBtaW5fb3JkZXIgKyAoKChtYXhfb3JkZXItbWluX29yZGVyKzEpICogKGkrMSkpIC8gbGV2ZWxzKS0xOworICAgICAgICAgICAgb3JkZXIgPSBhdl9jbGlwKG9yZGVyLCBtaW5fb3JkZXIgLSAxLCBtYXhfb3JkZXIgLSAxKTsKKyAgICAgICAgICAgIGlmIChvcmRlciA9PSBsYXN0X29yZGVyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcy0+ZmxhY19kc3AubHBjX2VuY29kZShyZXMsIHNtcCwgbiwgb3JkZXIrMSwgY29lZnNbb3JkZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdFtvcmRlcl0pOworICAgICAgICAgICAgYml0c1tpXSA9IGZpbmRfc3ViZnJhbWVfcmljZV9wYXJhbXMocywgc3ViLCBvcmRlcisxKTsKKyAgICAgICAgICAgIGlmIChiaXRzW2ldIDwgYml0c1tvcHRfaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgb3B0X2luZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBvcHRfb3JkZXIgPSBvcmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvcHRfb3JkZXIrKzsKKyAgICB9IGVsc2UgaWYgKG9tZXRob2QgPT0gT1JERVJfTUVUSE9EX1NFQVJDSCkgeworICAgICAgICAvLyBicnV0ZS1mb3JjZSBvcHRpbWFsIG9yZGVyIHNlYXJjaAorICAgICAgICB1aW50NjRfdCBiaXRzW01BWF9MUENfT1JERVJdOworICAgICAgICBvcHRfb3JkZXIgPSAwOworICAgICAgICBiaXRzWzBdICAgPSBVSU5UMzJfTUFYOworICAgICAgICBmb3IgKGkgPSBtaW5fb3JkZXItMTsgaSA8IG1heF9vcmRlcjsgaSsrKSB7CisgICAgICAgICAgICBzLT5mbGFjX2RzcC5scGNfZW5jb2RlKHJlcywgc21wLCBuLCBpKzEsIGNvZWZzW2ldLCBzaGlmdFtpXSk7CisgICAgICAgICAgICBiaXRzW2ldID0gZmluZF9zdWJmcmFtZV9yaWNlX3BhcmFtcyhzLCBzdWIsIGkrMSk7CisgICAgICAgICAgICBpZiAoYml0c1tpXSA8IGJpdHNbb3B0X29yZGVyXSkKKyAgICAgICAgICAgICAgICBvcHRfb3JkZXIgPSBpOworICAgICAgICB9CisgICAgICAgIG9wdF9vcmRlcisrOworICAgIH0gZWxzZSBpZiAob21ldGhvZCA9PSBPUkRFUl9NRVRIT0RfTE9HKSB7CisgICAgICAgIHVpbnQ2NF90IGJpdHNbTUFYX0xQQ19PUkRFUl07CisgICAgICAgIGludCBzdGVwOworCisgICAgICAgIG9wdF9vcmRlciA9IG1pbl9vcmRlciAtIDEgKyAobWF4X29yZGVyLW1pbl9vcmRlcikvMzsKKyAgICAgICAgbWVtc2V0KGJpdHMsIC0xLCBzaXplb2YoYml0cykpOworCisgICAgICAgIGZvciAoc3RlcCA9IDE2OyBzdGVwOyBzdGVwID4+PSAxKSB7CisgICAgICAgICAgICBpbnQgbGFzdCA9IG9wdF9vcmRlcjsKKyAgICAgICAgICAgIGZvciAoaSA9IGxhc3Qtc3RlcDsgaSA8PSBsYXN0K3N0ZXA7IGkgKz0gc3RlcCkgeworICAgICAgICAgICAgICAgIGlmIChpIDwgbWluX29yZGVyLTEgfHwgaSA+PSBtYXhfb3JkZXIgfHwgYml0c1tpXSA8IFVJTlQzMl9NQVgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHMtPmZsYWNfZHNwLmxwY19lbmNvZGUocmVzLCBzbXAsIG4sIGkrMSwgY29lZnNbaV0sIHNoaWZ0W2ldKTsKKyAgICAgICAgICAgICAgICBiaXRzW2ldID0gZmluZF9zdWJmcmFtZV9yaWNlX3BhcmFtcyhzLCBzdWIsIGkrMSk7CisgICAgICAgICAgICAgICAgaWYgKGJpdHNbaV0gPCBiaXRzW29wdF9vcmRlcl0pCisgICAgICAgICAgICAgICAgICAgIG9wdF9vcmRlciA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3B0X29yZGVyKys7CisgICAgfQorCisgICAgc3ViLT5vcmRlciAgICAgPSBvcHRfb3JkZXI7CisgICAgc3ViLT50eXBlX2NvZGUgPSBzdWItPnR5cGUgfCAoc3ViLT5vcmRlci0xKTsKKyAgICBzdWItPnNoaWZ0ICAgICA9IHNoaWZ0W3N1Yi0+b3JkZXItMV07CisgICAgZm9yIChpID0gMDsgaSA8IHN1Yi0+b3JkZXI7IGkrKykKKyAgICAgICAgc3ViLT5jb2Vmc1tpXSA9IGNvZWZzW3N1Yi0+b3JkZXItMV1baV07CisKKyAgICBzLT5mbGFjX2RzcC5scGNfZW5jb2RlKHJlcywgc21wLCBuLCBzdWItPm9yZGVyLCBzdWItPmNvZWZzLCBzdWItPnNoaWZ0KTsKKworICAgIGZpbmRfc3ViZnJhbWVfcmljZV9wYXJhbXMocywgc3ViLCBzdWItPm9yZGVyKTsKKworICAgIHJldHVybiBzdWJmcmFtZV9jb3VudF9leGFjdChzLCBzdWIsIHN1Yi0+b3JkZXIpOworfQorCisKK3N0YXRpYyBpbnQgY291bnRfZnJhbWVfaGVhZGVyKEZsYWNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIHVpbnQ4X3QgYXZfdW51c2VkIHRtcDsKKyAgICBpbnQgY291bnQ7CisKKyAgICAvKgorICAgIDwxND4gU3luYyBjb2RlCisgICAgPDE+ICBSZXNlcnZlZAorICAgIDwxPiAgQmxvY2tpbmcgc3RyYXRlZ3kKKyAgICA8ND4gIEJsb2NrIHNpemUgaW4gaW50ZXItY2hhbm5lbCBzYW1wbGVzCisgICAgPDQ+ICBTYW1wbGUgcmF0ZQorICAgIDw0PiAgQ2hhbm5lbCBhc3NpZ25tZW50CisgICAgPDM+ICBTYW1wbGUgc2l6ZSBpbiBiaXRzCisgICAgPDE+ICBSZXNlcnZlZAorICAgICovCisgICAgY291bnQgPSAzMjsKKworICAgIC8qIGNvZGVkIGZyYW1lIG51bWJlciAqLworICAgIFBVVF9VVEY4KHMtPmZyYW1lX2NvdW50LCB0bXAsIGNvdW50ICs9IDg7KQorCisgICAgLyogZXhwbGljaXQgYmxvY2sgc2l6ZSAqLworICAgIGlmIChzLT5mcmFtZS5ic19jb2RlWzBdID09IDYpCisgICAgICAgIGNvdW50ICs9IDg7CisgICAgZWxzZSBpZiAocy0+ZnJhbWUuYnNfY29kZVswXSA9PSA3KQorICAgICAgICBjb3VudCArPSAxNjsKKworICAgIC8qIGV4cGxpY2l0IHNhbXBsZSByYXRlICovCisgICAgY291bnQgKz0gKChzLT5zcl9jb2RlWzBdID09IDEyKSArIChzLT5zcl9jb2RlWzBdID4gMTIpKSAqIDg7CisKKyAgICAvKiBmcmFtZSBoZWFkZXIgQ1JDLTggKi8KKyAgICBjb3VudCArPSA4OworCisgICAgcmV0dXJuIGNvdW50OworfQorCisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEZsYWNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBjaDsKKyAgICB1aW50NjRfdCBjb3VudDsKKworICAgIGNvdW50ID0gY291bnRfZnJhbWVfaGVhZGVyKHMpOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgIGNvdW50ICs9IGVuY29kZV9yZXNpZHVhbF9jaChzLCBjaCk7CisKKyAgICBjb3VudCArPSAoOCAtIChjb3VudCAmIDcpKSAmIDc7IC8vIGJ5dGUgYWxpZ25tZW50CisgICAgY291bnQgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAvLyBDUkMtMTYKKworICAgIGNvdW50ID4+PSAzOworICAgIGlmIChjb3VudCA+IElOVF9NQVgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIHZvaWQgcmVtb3ZlX3dhc3RlZF9iaXRzKEZsYWNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBjaCwgaTsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIEZsYWNTdWJmcmFtZSAqc3ViID0gJnMtPmZyYW1lLnN1YmZyYW1lc1tjaF07CisgICAgICAgIGludDMyX3QgdiAgICAgICAgID0gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZnJhbWUuYmxvY2tzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHYgfD0gc3ViLT5zYW1wbGVzW2ldOworICAgICAgICAgICAgaWYgKHYgJiAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHYgJiYgISh2ICYgMSkpIHsKKyAgICAgICAgICAgIHYgPSBhdl9jdHoodik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZS5ibG9ja3NpemU7IGkrKykKKyAgICAgICAgICAgICAgICBzdWItPnNhbXBsZXNbaV0gPj49IHY7CisKKyAgICAgICAgICAgIHN1Yi0+d2FzdGVkID0gdjsKKyAgICAgICAgICAgIHN1Yi0+b2JpdHMgLT0gdjsKKworICAgICAgICAgICAgLyogZm9yIDI0LWJpdCwgY2hlY2sgaWYgcmVtb3Zpbmcgd2FzdGVkIGJpdHMgbWFrZXMgdGhlIHJhbmdlIGJldHRlcgorICAgICAgICAgICAgICAgc3VpdGVkIGZvciB1c2luZyBSSUNFIGluc3RlYWQgb2YgUklDRTIgZm9yIGVudHJvcHkgY29kaW5nICovCisgICAgICAgICAgICBpZiAoc3ViLT5vYml0cyA8PSAxNykKKyAgICAgICAgICAgICAgICBzdWItPnJjLmNvZGluZ19tb2RlID0gQ09ESU5HX01PREVfUklDRTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgaW50IGVzdGltYXRlX3N0ZXJlb19tb2RlKGludDMyX3QgKmxlZnRfY2gsIGludDMyX3QgKnJpZ2h0X2NoLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9yaWNlX3BhcmFtKQoreworICAgIGludCBpLCBiZXN0OworICAgIGludDMyX3QgbHQsIHJ0OworICAgIHVpbnQ2NF90IHN1bVs0XTsKKyAgICB1aW50NjRfdCBzY29yZVs0XTsKKyAgICBpbnQgazsKKworICAgIC8qIGNhbGN1bGF0ZSBzdW0gb2YgMm5kIG9yZGVyIHJlc2lkdWFsIGZvciBlYWNoIGNoYW5uZWwgKi8KKyAgICBzdW1bMF0gPSBzdW1bMV0gPSBzdW1bMl0gPSBzdW1bM10gPSAwOworICAgIGZvciAoaSA9IDI7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgbHQgPSBsZWZ0X2NoW2ldICAtIDIqbGVmdF9jaFtpLTFdICArIGxlZnRfY2hbaS0yXTsKKyAgICAgICAgcnQgPSByaWdodF9jaFtpXSAtIDIqcmlnaHRfY2hbaS0xXSArIHJpZ2h0X2NoW2ktMl07CisgICAgICAgIHN1bVsyXSArPSBGRkFCUygobHQgKyBydCkgPj4gMSk7CisgICAgICAgIHN1bVszXSArPSBGRkFCUyhsdCAtIHJ0KTsKKyAgICAgICAgc3VtWzBdICs9IEZGQUJTKGx0KTsKKyAgICAgICAgc3VtWzFdICs9IEZGQUJTKHJ0KTsKKyAgICB9CisgICAgLyogZXN0aW1hdGUgYml0IGNvdW50cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgayAgICAgID0gZmluZF9vcHRpbWFsX3BhcmFtKDIgKiBzdW1baV0sIG4sIG1heF9yaWNlX3BhcmFtKTsKKyAgICAgICAgc3VtW2ldID0gcmljZV9lbmNvZGVfY291bnQoIDIgKiBzdW1baV0sIG4sIGspOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBzY29yZSBmb3IgZWFjaCBtb2RlICovCisgICAgc2NvcmVbMF0gPSBzdW1bMF0gKyBzdW1bMV07CisgICAgc2NvcmVbMV0gPSBzdW1bMF0gKyBzdW1bM107CisgICAgc2NvcmVbMl0gPSBzdW1bMV0gKyBzdW1bM107CisgICAgc2NvcmVbM10gPSBzdW1bMl0gKyBzdW1bM107CisKKyAgICAvKiByZXR1cm4gbW9kZSB3aXRoIGxvd2VzdCBzY29yZSAqLworICAgIGJlc3QgPSAwOworICAgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspCisgICAgICAgIGlmIChzY29yZVtpXSA8IHNjb3JlW2Jlc3RdKQorICAgICAgICAgICAgYmVzdCA9IGk7CisKKyAgICByZXR1cm4gYmVzdDsKK30KKworCisvKioKKyAqIFBlcmZvcm0gc3RlcmVvIGNoYW5uZWwgZGVjb3JyZWxhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgY2hhbm5lbF9kZWNvcnJlbGF0aW9uKEZsYWNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIEZsYWNGcmFtZSAqZnJhbWU7CisgICAgaW50MzJfdCAqbGVmdCwgKnJpZ2h0OworICAgIGludCBpLCBuOworCisgICAgZnJhbWUgPSAmcy0+ZnJhbWU7CisgICAgbiAgICAgPSBmcmFtZS0+YmxvY2tzaXplOworICAgIGxlZnQgID0gZnJhbWUtPnN1YmZyYW1lc1swXS5zYW1wbGVzOworICAgIHJpZ2h0ID0gZnJhbWUtPnN1YmZyYW1lc1sxXS5zYW1wbGVzOworCisgICAgaWYgKHMtPmNoYW5uZWxzICE9IDIpIHsKKyAgICAgICAgZnJhbWUtPmNoX21vZGUgPSBGTEFDX0NITU9ERV9JTkRFUEVOREVOVDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzLT5vcHRpb25zLmNoX21vZGUgPCAwKSB7CisgICAgICAgIGludCBtYXhfcmljZV9wYXJhbSA9ICgxIDw8IGZyYW1lLT5zdWJmcmFtZXNbMF0ucmMuY29kaW5nX21vZGUpIC0gMjsKKyAgICAgICAgZnJhbWUtPmNoX21vZGUgPSBlc3RpbWF0ZV9zdGVyZW9fbW9kZShsZWZ0LCByaWdodCwgbiwgbWF4X3JpY2VfcGFyYW0pOworICAgIH0gZWxzZQorICAgICAgICBmcmFtZS0+Y2hfbW9kZSA9IHMtPm9wdGlvbnMuY2hfbW9kZTsKKworICAgIC8qIHBlcmZvcm0gZGVjb3JyZWxhdGlvbiBhbmQgYWRqdXN0IGJpdHMtcGVyLXNhbXBsZSAqLworICAgIGlmIChmcmFtZS0+Y2hfbW9kZSA9PSBGTEFDX0NITU9ERV9JTkRFUEVOREVOVCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChmcmFtZS0+Y2hfbW9kZSA9PSBGTEFDX0NITU9ERV9NSURfU0lERSkgeworICAgICAgICBpbnQzMl90IHRtcDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdG1wICAgICAgPSBsZWZ0W2ldOworICAgICAgICAgICAgbGVmdFtpXSAgPSAodG1wICsgcmlnaHRbaV0pID4+IDE7CisgICAgICAgICAgICByaWdodFtpXSA9ICB0bXAgLSByaWdodFtpXTsKKyAgICAgICAgfQorICAgICAgICBmcmFtZS0+c3ViZnJhbWVzWzFdLm9iaXRzKys7CisgICAgfSBlbHNlIGlmIChmcmFtZS0+Y2hfbW9kZSA9PSBGTEFDX0NITU9ERV9MRUZUX1NJREUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHJpZ2h0W2ldID0gbGVmdFtpXSAtIHJpZ2h0W2ldOworICAgICAgICBmcmFtZS0+c3ViZnJhbWVzWzFdLm9iaXRzKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIGxlZnRbaV0gLT0gcmlnaHRbaV07CisgICAgICAgIGZyYW1lLT5zdWJmcmFtZXNbMF0ub2JpdHMrKzsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgd3JpdGVfdXRmOChQdXRCaXRDb250ZXh0ICpwYiwgdWludDMyX3QgdmFsKQoreworICAgIHVpbnQ4X3QgdG1wOworICAgIFBVVF9VVEY4KHZhbCwgdG1wLCBwdXRfYml0cyhwYiwgOCwgdG1wKTspCit9CisKKworc3RhdGljIHZvaWQgd3JpdGVfZnJhbWVfaGVhZGVyKEZsYWNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIEZsYWNGcmFtZSAqZnJhbWU7CisgICAgaW50IGNyYzsKKworICAgIGZyYW1lID0gJnMtPmZyYW1lOworCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgMHhGRkY4KTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDQsIGZyYW1lLT5ic19jb2RlWzBdKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDQsIHMtPnNyX2NvZGVbMF0pOworCisgICAgaWYgKGZyYW1lLT5jaF9tb2RlID09IEZMQUNfQ0hNT0RFX0lOREVQRU5ERU5UKQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDQsIHMtPmNoYW5uZWxzLTEpOworICAgIGVsc2UKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCBmcmFtZS0+Y2hfbW9kZSArIEZMQUNfTUFYX0NIQU5ORUxTIC0gMSk7CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDMsIHMtPmJwc19jb2RlKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOworICAgIHdyaXRlX3V0ZjgoJnMtPnBiLCBzLT5mcmFtZV9jb3VudCk7CisKKyAgICBpZiAoZnJhbWUtPmJzX2NvZGVbMF0gPT0gNikKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCBmcmFtZS0+YnNfY29kZVsxXSk7CisgICAgZWxzZSBpZiAoZnJhbWUtPmJzX2NvZGVbMF0gPT0gNykKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgZnJhbWUtPmJzX2NvZGVbMV0pOworCisgICAgaWYgKHMtPnNyX2NvZGVbMF0gPT0gMTIpCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgcy0+c3JfY29kZVsxXSk7CisgICAgZWxzZSBpZiAocy0+c3JfY29kZVswXSA+IDEyKQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDE2LCBzLT5zcl9jb2RlWzFdKTsKKworICAgIGZsdXNoX3B1dF9iaXRzKCZzLT5wYik7CisgICAgY3JjID0gYXZfY3JjKGF2X2NyY19nZXRfdGFibGUoQVZfQ1JDXzhfQVRNKSwgMCwgcy0+cGIuYnVmLAorICAgICAgICAgICAgICAgICBwdXRfYml0c19jb3VudCgmcy0+cGIpID4+IDMpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgY3JjKTsKK30KKworCitzdGF0aWMgdm9pZCB3cml0ZV9zdWJmcmFtZXMoRmxhY0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGNoOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgRmxhY1N1YmZyYW1lICpzdWIgPSAmcy0+ZnJhbWUuc3ViZnJhbWVzW2NoXTsKKyAgICAgICAgaW50IGksIHAsIHBvcmRlciwgcHNpemU7CisgICAgICAgIGludDMyX3QgKnBhcnRfZW5kOworICAgICAgICBpbnQzMl90ICpyZXMgICAgICAgPSAgc3ViLT5yZXNpZHVhbDsKKyAgICAgICAgaW50MzJfdCAqZnJhbWVfZW5kID0gJnN1Yi0+cmVzaWR1YWxbcy0+ZnJhbWUuYmxvY2tzaXplXTsKKworICAgICAgICAvKiBzdWJmcmFtZSBoZWFkZXIgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA2LCBzdWItPnR5cGVfY29kZSk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgISFzdWItPndhc3RlZCk7CisgICAgICAgIGlmIChzdWItPndhc3RlZCkKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgc3ViLT53YXN0ZWQsIDEpOworCisgICAgICAgIC8qIHN1YmZyYW1lICovCisgICAgICAgIGlmIChzdWItPnR5cGUgPT0gRkxBQ19TVUJGUkFNRV9DT05TVEFOVCkgeworICAgICAgICAgICAgcHV0X3NiaXRzKCZzLT5wYiwgc3ViLT5vYml0cywgcmVzWzBdKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdWItPnR5cGUgPT0gRkxBQ19TVUJGUkFNRV9WRVJCQVRJTSkgeworICAgICAgICAgICAgd2hpbGUgKHJlcyA8IGZyYW1lX2VuZCkKKyAgICAgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCBzdWItPm9iaXRzLCAqcmVzKyspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogd2FybS11cCBzYW1wbGVzICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ViLT5vcmRlcjsgaSsrKQorICAgICAgICAgICAgICAgIHB1dF9zYml0cygmcy0+cGIsIHN1Yi0+b2JpdHMsICpyZXMrKyk7CisKKyAgICAgICAgICAgIC8qIExQQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgICAgIGlmIChzdWItPnR5cGUgPT0gRkxBQ19TVUJGUkFNRV9MUEMpIHsKKyAgICAgICAgICAgICAgICBpbnQgY2JpdHMgPSBzLT5vcHRpb25zLmxwY19jb2VmZl9wcmVjaXNpb247CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoICZzLT5wYiwgNCwgY2JpdHMtMSk7CisgICAgICAgICAgICAgICAgcHV0X3NiaXRzKCZzLT5wYiwgNSwgc3ViLT5zaGlmdCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1Yi0+b3JkZXI7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcHV0X3NiaXRzKCZzLT5wYiwgY2JpdHMsIHN1Yi0+Y29lZnNbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiByaWNlLWVuY29kZWQgYmxvY2sgKi8KKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgc3ViLT5yYy5jb2RpbmdfbW9kZSAtIDQpOworCisgICAgICAgICAgICAvKiBwYXJ0aXRpb24gb3JkZXIgKi8KKyAgICAgICAgICAgIHBvcmRlciAgPSBzdWItPnJjLnBvcmRlcjsKKyAgICAgICAgICAgIHBzaXplICAgPSBzLT5mcmFtZS5ibG9ja3NpemUgPj4gcG9yZGVyOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCBwb3JkZXIpOworCisgICAgICAgICAgICAvKiByZXNpZHVhbCAqLworICAgICAgICAgICAgcGFydF9lbmQgID0gJnN1Yi0+cmVzaWR1YWxbcHNpemVdOworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IDEgPDwgcG9yZGVyOyBwKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgayA9IHN1Yi0+cmMucGFyYW1zW3BdOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgc3ViLT5yYy5jb2RpbmdfbW9kZSwgayk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHJlcyA8IHBhcnRfZW5kKQorICAgICAgICAgICAgICAgICAgICBzZXRfc3JfZ29sb21iX2ZsYWMoJnMtPnBiLCAqcmVzKyssIGssIElOVDMyX01BWCwgMCk7CisgICAgICAgICAgICAgICAgcGFydF9lbmQgPSBGRk1JTihmcmFtZV9lbmQsIHBhcnRfZW5kICsgcHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIHdyaXRlX2ZyYW1lX2Zvb3RlcihGbGFjRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3JjOworICAgIGZsdXNoX3B1dF9iaXRzKCZzLT5wYik7CisgICAgY3JjID0gYXZfYnN3YXAxNihhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMTZfQU5TSSksIDAsIHMtPnBiLmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0c19jb3VudCgmcy0+cGIpPj4zKSk7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgY3JjKTsKKyAgICBmbHVzaF9wdXRfYml0cygmcy0+cGIpOworfQorCisKK3N0YXRpYyBpbnQgd3JpdGVfZnJhbWUoRmxhY0VuY29kZUNvbnRleHQgKnMsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICB3cml0ZV9mcmFtZV9oZWFkZXIocyk7CisgICAgd3JpdGVfc3ViZnJhbWVzKHMpOworICAgIHdyaXRlX2ZyYW1lX2Zvb3RlcihzKTsKKyAgICByZXR1cm4gcHV0X2JpdHNfY291bnQoJnMtPnBiKSA+PiAzOworfQorCisKK3N0YXRpYyBpbnQgdXBkYXRlX21kNV9zdW0oRmxhY0VuY29kZUNvbnRleHQgKnMsIGNvbnN0IHZvaWQgKnNhbXBsZXMpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmOworICAgIGludCBidWZfc2l6ZSA9IHMtPmZyYW1lLmJsb2Nrc2l6ZSAqIHMtPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAoKHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICsgNykgLyA4KTsKKworICAgIGlmIChzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+IDE2IHx8IEhBVkVfQklHRU5ESUFOKSB7CisgICAgICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT5tZDVfYnVmZmVyLCAmcy0+bWQ1X2J1ZmZlcl9zaXplLCBidWZfc2l6ZSk7CisgICAgICAgIGlmICghcy0+bWQ1X2J1ZmZlcikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaWYgKHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlIDw9IDE2KSB7CisgICAgICAgIGJ1ZiA9IChjb25zdCB1aW50OF90ICopc2FtcGxlczsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICBzLT5iZHNwLmJzd2FwMTZfYnVmKCh1aW50MTZfdCAqKSBzLT5tZDVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50MTZfdCAqKSBzYW1wbGVzLCBidWZfc2l6ZSAvIDIpOworICAgICAgICBidWYgPSBzLT5tZDVfYnVmZmVyOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGNvbnN0IGludDMyX3QgKnNhbXBsZXMwID0gc2FtcGxlczsKKyAgICAgICAgdWludDhfdCAqdG1wICAgICAgICAgICAgPSBzLT5tZDVfYnVmZmVyOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZS5ibG9ja3NpemUgKiBzLT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IHYgPSBzYW1wbGVzMFtpXSA+PiA4OworICAgICAgICAgICAgKnRtcCsrICAgID0gKHYgICAgICApICYgMHhGRjsKKyAgICAgICAgICAgICp0bXArKyAgICA9ICh2ID4+ICA4KSAmIDB4RkY7CisgICAgICAgICAgICAqdG1wKysgICAgPSAodiA+PiAxNikgJiAweEZGOworICAgICAgICB9CisgICAgICAgIGJ1ZiA9IHMtPm1kNV9idWZmZXI7CisgICAgfQorICAgIGF2X21kNV91cGRhdGUocy0+bWQ1Y3R4LCBidWYsIGJ1Zl9zaXplKTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZmxhY19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIEZsYWNFbmNvZGVDb250ZXh0ICpzOworICAgIGludCBmcmFtZV9ieXRlcywgb3V0X2J5dGVzLCByZXQ7CisKKyAgICBzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIC8qIHdoZW4gdGhlIGxhc3QgYmxvY2sgaXMgcmVhY2hlZCwgdXBkYXRlIHRoZSBoZWFkZXIgaW4gZXh0cmFkYXRhICovCisgICAgaWYgKCFmcmFtZSkgeworICAgICAgICBzLT5tYXhfZnJhbWVzaXplID0gcy0+bWF4X2VuY29kZWRfZnJhbWVzaXplOworICAgICAgICBhdl9tZDVfZmluYWwocy0+bWQ1Y3R4LCBzLT5tZDVzdW0pOworICAgICAgICB3cml0ZV9zdHJlYW1pbmZvKHMsIGF2Y3R4LT5leHRyYWRhdGEpOworCisgICAgICAgIGlmIChhdmN0eC0+c2lkZV9kYXRhX29ubHlfcGFja2V0cyAmJiAhcy0+Zmx1c2hlZCkgeworICAgICAgICAgICAgdWludDhfdCAqc2lkZV9kYXRhID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKCFzaWRlX2RhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG1lbWNweShzaWRlX2RhdGEsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisKKyAgICAgICAgICAgIGF2cGt0LT5wdHMgPSBzLT5uZXh0X3B0czsKKworICAgICAgICAgICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKKyAgICAgICAgICAgIHMtPmZsdXNoZWQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogY2hhbmdlIG1heF9mcmFtZXNpemUgZm9yIHNtYWxsIGZpbmFsIGZyYW1lICovCisgICAgaWYgKGZyYW1lLT5uYl9zYW1wbGVzIDwgcy0+ZnJhbWUuYmxvY2tzaXplKSB7CisgICAgICAgIHMtPm1heF9mcmFtZXNpemUgPSBmZl9mbGFjX2dldF9tYXhfZnJhbWVfc2l6ZShmcmFtZS0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUpOworICAgIH0KKworICAgIGluaXRfZnJhbWUocywgZnJhbWUtPm5iX3NhbXBsZXMpOworCisgICAgY29weV9zYW1wbGVzKHMsIGZyYW1lLT5kYXRhWzBdKTsKKworICAgIGNoYW5uZWxfZGVjb3JyZWxhdGlvbihzKTsKKworICAgIHJlbW92ZV93YXN0ZWRfYml0cyhzKTsKKworICAgIGZyYW1lX2J5dGVzID0gZW5jb2RlX2ZyYW1lKHMpOworCisgICAgLyogRmFsbCBiYWNrIG9uIHZlcmJhdGltIG1vZGUgaWYgdGhlIGNvbXByZXNzZWQgZnJhbWUgaXMgbGFyZ2VyIHRoYW4gaXQKKyAgICAgICB3b3VsZCBiZSBpZiBlbmNvZGVkIHVuY29tcHJlc3NlZC4gKi8KKyAgICBpZiAoZnJhbWVfYnl0ZXMgPCAwIHx8IGZyYW1lX2J5dGVzID4gcy0+bWF4X2ZyYW1lc2l6ZSkgeworICAgICAgICBzLT5mcmFtZS52ZXJiYXRpbV9vbmx5ID0gMTsKKyAgICAgICAgZnJhbWVfYnl0ZXMgPSBlbmNvZGVfZnJhbWUocyk7CisgICAgICAgIGlmIChmcmFtZV9ieXRlcyA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQmFkIGZyYW1lIGNvdW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBmcmFtZV9ieXRlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIGZyYW1lX2J5dGVzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgb3V0X2J5dGVzID0gd3JpdGVfZnJhbWUocywgYXZwa3QpOworCisgICAgcy0+ZnJhbWVfY291bnQrKzsKKyAgICBzLT5zYW1wbGVfY291bnQgKz0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgaWYgKChyZXQgPSB1cGRhdGVfbWQ1X3N1bShzLCBmcmFtZS0+ZGF0YVswXSkpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHVwZGF0aW5nIE1ENSBjaGVja3N1bVxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChvdXRfYnl0ZXMgPiBzLT5tYXhfZW5jb2RlZF9mcmFtZXNpemUpCisgICAgICAgIHMtPm1heF9lbmNvZGVkX2ZyYW1lc2l6ZSA9IG91dF9ieXRlczsKKyAgICBpZiAob3V0X2J5dGVzIDwgcy0+bWluX2ZyYW1lc2l6ZSkKKyAgICAgICAgcy0+bWluX2ZyYW1lc2l6ZSA9IG91dF9ieXRlczsKKworICAgIGF2cGt0LT5wdHMgICAgICA9IGZyYW1lLT5wdHM7CisgICAgYXZwa3QtPmR1cmF0aW9uID0gZmZfc2FtcGxlc190b190aW1lX2Jhc2UoYXZjdHgsIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICBhdnBrdC0+c2l6ZSAgICAgPSBvdXRfYnl0ZXM7CisKKyAgICBzLT5uZXh0X3B0cyA9IGF2cGt0LT5wdHMgKyBhdnBrdC0+ZHVyYXRpb247CisKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBhdl9jb2xkIGludCBmbGFjX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKGF2Y3R4LT5wcml2X2RhdGEpIHsKKyAgICAgICAgRmxhY0VuY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgICAgICBhdl9mcmVlcCgmcy0+bWQ1Y3R4KTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPm1kNV9idWZmZXIpOworICAgICAgICBmZl9scGNfZW5kKCZzLT5scGNfY3R4KTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5leHRyYWRhdGEpOworICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19BVURJT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKK3sgImxwY19jb2VmZl9wcmVjaXNpb24iLCAiTFBDIGNvZWZmaWNpZW50IHByZWNpc2lvbiIsIG9mZnNldG9mKEZsYWNFbmNvZGVDb250ZXh0LCBvcHRpb25zLmxwY19jb2VmZl9wcmVjaXNpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMTUgfSwgMCwgTUFYX0xQQ19QUkVDSVNJT04sIEZMQUdTIH0sCit7ICJscGNfdHlwZSIsICJMUEMgYWxnb3JpdGhtIiwgb2Zmc2V0b2YoRmxhY0VuY29kZUNvbnRleHQsIG9wdGlvbnMubHBjX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gRkZfTFBDX1RZUEVfREVGQVVMVCB9LCBGRl9MUENfVFlQRV9ERUZBVUxULCBGRl9MUENfVFlQRV9OQi0xLCBGTEFHUywgImxwY190eXBlIiB9LAoreyAibm9uZSIsICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9MUENfVFlQRV9OT05FIH0sICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImxwY190eXBlIiB9LAoreyAiZml4ZWQiLCAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9MUENfVFlQRV9GSVhFRCB9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImxwY190eXBlIiB9LAoreyAibGV2aW5zb24iLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9MUENfVFlQRV9MRVZJTlNPTiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImxwY190eXBlIiB9LAoreyAiY2hvbGVza3kiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9MUENfVFlQRV9DSE9MRVNLWSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImxwY190eXBlIiB9LAoreyAibHBjX3Bhc3NlcyIsICJOdW1iZXIgb2YgcGFzc2VzIHRvIHVzZSBmb3IgQ2hvbGVza3kgZmFjdG9yaXphdGlvbiBkdXJpbmcgTFBDIGFuYWx5c2lzIiwgb2Zmc2V0b2YoRmxhY0VuY29kZUNvbnRleHQsIG9wdGlvbnMubHBjX3Bhc3NlcyksICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMiB9LCAxLCBJTlRfTUFYLCBGTEFHUyB9LAoreyAibWluX3BhcnRpdGlvbl9vcmRlciIsICBOVUxMLCBvZmZzZXRvZihGbGFjRW5jb2RlQ29udGV4dCwgb3B0aW9ucy5taW5fcGFydGl0aW9uX29yZGVyKSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMSB9LCAgICAgIC0xLCBNQVhfUEFSVElUSU9OX09SREVSLCBGTEFHUyB9LAoreyAibWF4X3BhcnRpdGlvbl9vcmRlciIsICBOVUxMLCBvZmZzZXRvZihGbGFjRW5jb2RlQ29udGV4dCwgb3B0aW9ucy5tYXhfcGFydGl0aW9uX29yZGVyKSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMSB9LCAgICAgIC0xLCBNQVhfUEFSVElUSU9OX09SREVSLCBGTEFHUyB9LAoreyAicHJlZGljdGlvbl9vcmRlcl9tZXRob2QiLCAiU2VhcmNoIG1ldGhvZCBmb3Igc2VsZWN0aW5nIHByZWRpY3Rpb24gb3JkZXIiLCBvZmZzZXRvZihGbGFjRW5jb2RlQ29udGV4dCwgb3B0aW9ucy5wcmVkaWN0aW9uX29yZGVyX21ldGhvZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMSB9LCAtMSwgT1JERVJfTUVUSE9EX0xPRywgRkxBR1MsICJwcmVkbSIgfSwKK3sgImVzdGltYXRpb24iLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBPUkRFUl9NRVRIT0RfRVNUIH0sICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAicHJlZG0iIH0sCit7ICIybGV2ZWwiLCAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gT1JERVJfTUVUSE9EXzJMRVZFTCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInByZWRtIiB9LAoreyAiNGxldmVsIiwgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE9SREVSX01FVEhPRF80TEVWRUwgfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJwcmVkbSIgfSwKK3sgIjhsZXZlbCIsICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBPUkRFUl9NRVRIT0RfOExFVkVMIH0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAicHJlZG0iIH0sCit7ICJzZWFyY2giLCAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gT1JERVJfTUVUSE9EX1NFQVJDSCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInByZWRtIiB9LAoreyAibG9nIiwgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE9SREVSX01FVEhPRF9MT0cgfSwgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJwcmVkbSIgfSwKK3sgImNoX21vZGUiLCAiU3RlcmVvIGRlY29ycmVsYXRpb24gbW9kZSIsIG9mZnNldG9mKEZsYWNFbmNvZGVDb250ZXh0LCBvcHRpb25zLmNoX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sIC0xLCBGTEFDX0NITU9ERV9NSURfU0lERSwgRkxBR1MsICJjaF9tb2RlIiB9LAoreyAiYXV0byIsICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAtMSAgICAgICAgICAgICAgICAgICAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImNoX21vZGUiIH0sCit7ICJpbmRlcCIsICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZMQUNfQ0hNT0RFX0lOREVQRU5ERU5UIH0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiY2hfbW9kZSIgfSwKK3sgImxlZnRfc2lkZSIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRkxBQ19DSE1PREVfTEVGVF9TSURFICAgfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJjaF9tb2RlIiB9LAoreyAicmlnaHRfc2lkZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGTEFDX0NITU9ERV9SSUdIVF9TSURFICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImNoX21vZGUiIH0sCit7ICJtaWRfc2lkZSIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZMQUNfQ0hNT0RFX01JRF9TSURFICAgIH0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiY2hfbW9kZSIgfSwKK3sgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZmxhY19lbmNvZGVyX2NsYXNzID0geworICAgICJGTEFDIGVuY29kZXIiLAorICAgIGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIG9wdGlvbnMsCisgICAgTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9mbGFjX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImZsYWMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGTEFDIChGcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9GTEFDLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGbGFjRW5jb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmxhY19lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBmbGFjX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmbGFjX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSB8IENPREVDX0NBUF9ERUxBWSB8IENPREVDX0NBUF9MT1NTTEVTUywKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZmxhY19lbmNvZGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYXNoc3YuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYXNoc3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzkxYTJkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmxhc2hzdi5jCkBAIC0wLDAgKzEsNTc4IEBACisvKgorICogRmxhc2ggU2NyZWVuIFZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBBbGV4IEJlcmVnc3phc3ppCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQmVuamFtaW4gTGFyc3NvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBGbGFzaCBTY3JlZW4gVmlkZW8gZGVjb2RlcgorICogQGF1dGhvciBBbGV4IEJlcmVnc3phc3ppCisgKiBAYXV0aG9yIEJlbmphbWluIExhcnNzb24KKyAqIEBhdXRob3IgRGFuaWVsIFZlcmthbXAKKyAqIEBhdXRob3IgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGJpdHN0cmVhbSBmb3JtYXQgZm9yIEZsYXNoIFNjcmVlbiBWaWRlbyB2ZXJzaW9uIDEvMgorICogaXMgcGFydCBvZiB0aGUgU1dGIEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24gKHZlcnNpb24gMTApLCB3aGljaCBjYW4gYmUKKyAqIGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3LmFkb2JlLmNvbS9kZXZuZXQvc3dmLmh0bWwuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBCbG9ja0luZm8geworICAgIHVpbnQ4X3QgKnBvczsKKyAgICBpbnQgICAgICBzaXplOworfSBCbG9ja0luZm87CisKK3R5cGVkZWYgc3RydWN0IEZsYXNoU1ZDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAgICAgICAgKmZyYW1lOworICAgIGludCAgICAgICAgICAgICBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0OworICAgIGludCAgICAgICAgICAgICBibG9ja193aWR0aCwgYmxvY2tfaGVpZ2h0OworICAgIHVpbnQ4X3QgICAgICAgICp0bXBibG9jazsKKyAgICBpbnQgICAgICAgICAgICAgYmxvY2tfc2l6ZTsKKyAgICB6X3N0cmVhbSAgICAgICAgenN0cmVhbTsKKyAgICBpbnQgICAgICAgICAgICAgdmVyOworICAgIGNvbnN0IHVpbnQzMl90ICpwYWw7CisgICAgaW50ICAgICAgICAgICAgIGlzX2tleWZyYW1lOworICAgIHVpbnQ4X3QgICAgICAgICprZXlmcmFtZWRhdGE7CisgICAgdWludDhfdCAgICAgICAgKmtleWZyYW1lOworICAgIEJsb2NrSW5mbyAgICAgICpibG9ja3M7CisgICAgdWludDhfdCAgICAgICAgKmRlZmxhdGVfYmxvY2s7CisgICAgaW50ICAgICAgICAgICAgIGRlZmxhdGVfYmxvY2tfc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgY29sb3JfZGVwdGg7CisgICAgaW50ICAgICAgICAgICAgIHpsaWJwcmltZV9jdXJyLCB6bGlicHJpbWVfcHJldjsKKyAgICBpbnQgICAgICAgICAgICAgZGlmZl9zdGFydCwgZGlmZl9oZWlnaHQ7Cit9IEZsYXNoU1ZDb250ZXh0OworCitzdGF0aWMgaW50IGRlY29kZV9oeWJyaWQoY29uc3QgdWludDhfdCAqc3B0ciwgY29uc3QgdWludDhfdCAqc3B0cl9lbmQsIHVpbnQ4X3QgKmRwdHIsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgdywgaW50IHN0cmlkZSwgY29uc3QgdWludDMyX3QgKnBhbCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBjb25zdCB1aW50OF90ICpvcmlnX3NyYyA9IHNwdHI7CisKKyAgICBmb3IgKHkgPSBkeCArIGg7IHkgPiBkeDsgeS0tKSB7CisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGRwdHIgKyAoeSAqIHN0cmlkZSkgKyBkeSAqIDM7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGlmIChzcHRyID49IHNwdHJfZW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaWYgKCpzcHRyICYgMHg4MCkgeworICAgICAgICAgICAgICAgIC8qIDE1LWJpdCBjb2xvciAqLworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGMgPSBBVl9SQjE2KHNwdHIpICYgfjB4ODAwMDsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBiID0gIGMgICAgICAgICYgMHgxRjsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBnID0gKGMgPj4gIDUpICYgMHgxRjsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCByID0gIGMgPj4gMTA7CisgICAgICAgICAgICAgICAgLyogMDAwYWFhYmIgLT4gYWFhYmJhYWEgICovCisgICAgICAgICAgICAgICAgKmRzdCsrID0gKGIgPDwgMykgfCAoYiA+PiAyKTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSAoZyA8PCAzKSB8IChnID4+IDIpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IChyIDw8IDMpIHwgKHIgPj4gMik7CisgICAgICAgICAgICAgICAgc3B0ciArPSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBwYWxldHRlIGluZGV4ICovCisgICAgICAgICAgICAgICAgdWludDMyX3QgYyA9IHBhbFsqc3B0cisrXTsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTI0KCZkc3QsIGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzcHRyIC0gb3JpZ19zcmM7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBmbGFzaHN2X2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZsYXNoU1ZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbmZsYXRlRW5kKCZzLT56c3RyZWFtKTsKKyAgICAvKiByZWxlYXNlIHRoZSBmcmFtZSBpZiBuZWVkZWQgKi8KKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZSk7CisKKyAgICAvKiBmcmVlIHRoZSB0bXBibG9jayAqLworICAgIGF2X2ZyZWVwKCZzLT50bXBibG9jayk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGZsYXNoc3ZfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZsYXNoU1ZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgenJldDsgLy8gWmxpYiByZXR1cm4gY29kZQorCisgICAgcy0+YXZjdHggICAgICAgICAgPSBhdmN0eDsKKyAgICBzLT56c3RyZWFtLnphbGxvYyA9IFpfTlVMTDsKKyAgICBzLT56c3RyZWFtLnpmcmVlICA9IFpfTlVMTDsKKyAgICBzLT56c3RyZWFtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICB6cmV0ID0gaW5mbGF0ZUluaXQoJnMtPnpzdHJlYW0pOworICAgIGlmICh6cmV0ICE9IFpfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmZsYXRlIGluaXQgZXJyb3I6ICVkXG4iLCB6cmV0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IyNDsKKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKSB7CisgICAgICAgIGZsYXNoc3ZfZGVjb2RlX2VuZChhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmxhc2hzdjJfcHJpbWUoRmxhc2hTVkNvbnRleHQgKnMsIHVpbnQ4X3QgKnNyYywgaW50IHNpemUpCit7CisgICAgel9zdHJlYW0genM7CisgICAgaW50IHpyZXQ7IC8vIFpsaWIgcmV0dXJuIGNvZGUKKworICAgIGlmICghc3JjKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHpzLnphbGxvYyA9IE5VTEw7CisgICAgenMuemZyZWUgID0gTlVMTDsKKyAgICB6cy5vcGFxdWUgPSBOVUxMOworCisgICAgcy0+enN0cmVhbS5uZXh0X2luICAgPSBzcmM7CisgICAgcy0+enN0cmVhbS5hdmFpbF9pbiAgPSBzaXplOworICAgIHMtPnpzdHJlYW0ubmV4dF9vdXQgID0gcy0+dG1wYmxvY2s7CisgICAgcy0+enN0cmVhbS5hdmFpbF9vdXQgPSBzLT5ibG9ja19zaXplICogMzsKKyAgICBpbmZsYXRlKCZzLT56c3RyZWFtLCBaX1NZTkNfRkxVU0gpOworCisgICAgaWYgKGRlZmxhdGVJbml0KCZ6cywgMCkgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHpzLm5leHRfaW4gICA9IHMtPnRtcGJsb2NrOworICAgIHpzLmF2YWlsX2luICA9IHMtPmJsb2NrX3NpemUgKiAzIC0gcy0+enN0cmVhbS5hdmFpbF9vdXQ7CisgICAgenMubmV4dF9vdXQgID0gcy0+ZGVmbGF0ZV9ibG9jazsKKyAgICB6cy5hdmFpbF9vdXQgPSBzLT5kZWZsYXRlX2Jsb2NrX3NpemU7CisgICAgZGVmbGF0ZSgmenMsIFpfU1lOQ19GTFVTSCk7CisgICAgZGVmbGF0ZUVuZCgmenMpOworCisgICAgaWYgKCh6cmV0ID0gaW5mbGF0ZVJlc2V0KCZzLT56c3RyZWFtKSkgIT0gWl9PSykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkluZmxhdGUgcmVzZXQgZXJyb3I6ICVkXG4iLCB6cmV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBzLT56c3RyZWFtLm5leHRfaW4gICA9IHMtPmRlZmxhdGVfYmxvY2s7CisgICAgcy0+enN0cmVhbS5hdmFpbF9pbiAgPSBzLT5kZWZsYXRlX2Jsb2NrX3NpemUgLSB6cy5hdmFpbF9vdXQ7CisgICAgcy0+enN0cmVhbS5uZXh0X291dCAgPSBzLT50bXBibG9jazsKKyAgICBzLT56c3RyZWFtLmF2YWlsX291dCA9IHMtPmJsb2NrX3NpemUgKiAzOworICAgIGluZmxhdGUoJnMtPnpzdHJlYW0sIFpfU1lOQ19GTFVTSCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbGFzaHN2X2RlY29kZV9ibG9jayhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB4X3BvcywgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrX2lkeCkKK3sKKyAgICBzdHJ1Y3QgRmxhc2hTVkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKmxpbmUgPSBzLT50bXBibG9jazsKKyAgICBpbnQgazsKKyAgICBpbnQgcmV0ID0gaW5mbGF0ZVJlc2V0KCZzLT56c3RyZWFtKTsKKyAgICBpZiAocmV0ICE9IFpfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmZsYXRlIHJlc2V0IGVycm9yOiAlZFxuIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgaWYgKHMtPnpsaWJwcmltZV9jdXJyIHx8IHMtPnpsaWJwcmltZV9wcmV2KSB7CisgICAgICAgIHJldCA9IGZsYXNoc3YyX3ByaW1lKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2Nrc1tibGtfaWR4XS5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2Nrc1tibGtfaWR4XS5zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBzLT56c3RyZWFtLm5leHRfaW4gICA9IGF2cGt0LT5kYXRhICsgZ2V0X2JpdHNfY291bnQoZ2IpIC8gODsKKyAgICBzLT56c3RyZWFtLmF2YWlsX2luICA9IGJsb2NrX3NpemU7CisgICAgcy0+enN0cmVhbS5uZXh0X291dCAgPSBzLT50bXBibG9jazsKKyAgICBzLT56c3RyZWFtLmF2YWlsX291dCA9IHMtPmJsb2NrX3NpemUgKiAzOworICAgIHJldCA9IGluZmxhdGUoJnMtPnpzdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAocmV0ID09IFpfREFUQV9FUlJPUikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlpsaWIgcmVzeW5jIG9jY3VycmVkXG4iKTsKKyAgICAgICAgaW5mbGF0ZVN5bmMoJnMtPnpzdHJlYW0pOworICAgICAgICByZXQgPSBpbmZsYXRlKCZzLT56c3RyZWFtLCBaX0ZJTklTSCk7CisgICAgfQorCisgICAgaWYgKHJldCAhPSBaX09LICYmIHJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgLy9yZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHMtPmlzX2tleWZyYW1lKSB7CisgICAgICAgIHMtPmJsb2Nrc1tibGtfaWR4XS5wb3MgID0gcy0+a2V5ZnJhbWVkYXRhICsgKGdldF9iaXRzX2NvdW50KGdiKSAvIDgpOworICAgICAgICBzLT5ibG9ja3NbYmxrX2lkeF0uc2l6ZSA9IGJsb2NrX3NpemU7CisgICAgfQorCisgICAgeV9wb3MgKz0gcy0+ZGlmZl9zdGFydDsKKworICAgIGlmICghcy0+Y29sb3JfZGVwdGgpIHsKKyAgICAgICAgLyogRmxhc2ggU2NyZWVuIFZpZGVvIHN0b3JlcyB0aGUgaW1hZ2UgdXBzaWRlIGRvd24sIHNvIGNvcHkKKyAgICAgICAgICogbGluZXMgdG8gZGVzdGluYXRpb24gaW4gcmV2ZXJzZSBvcmRlci4gKi8KKyAgICAgICAgZm9yIChrID0gMTsgayA8PSBzLT5kaWZmX2hlaWdodDsgaysrKSB7CisgICAgICAgICAgICBtZW1jcHkocy0+ZnJhbWUtPmRhdGFbMF0gKyB4X3BvcyAqIDMgKworICAgICAgICAgICAgICAgICAgIChzLT5pbWFnZV9oZWlnaHQgLSB5X3BvcyAtIGspICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgIGxpbmUsIHdpZHRoICogMyk7CisgICAgICAgICAgICAvKiBhZHZhbmNlIHNvdXJjZSBwb2ludGVyIHRvIG5leHQgbGluZSAqLworICAgICAgICAgICAgbGluZSArPSB3aWR0aCAqIDM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBoeWJyaWQgMTUtYml0L3BhbGV0dGUgbW9kZSAqLworICAgICAgICByZXQgPSBkZWNvZGVfaHlicmlkKHMtPnRtcGJsb2NrLCBzLT56c3RyZWFtLm5leHRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lLT5kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgIHMtPmltYWdlX2hlaWdodCAtICh5X3BvcyArIDEgKyBzLT5kaWZmX2hlaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgeF9wb3MsIHMtPmRpZmZfaGVpZ2h0LCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZS0+bGluZXNpemVbMF0sIHMtPnBhbCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImRlY29kZV9oeWJyaWQgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDggKiBibG9ja19zaXplKTsgLyogc2tpcCB0aGUgY29uc3VtZWQgYml0cyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbGNfZGVmbGF0ZV9ibG9ja19zaXplKGludCB0bXBibG9ja19zaXplKQoreworICAgIHpfc3RyZWFtIHpzdHJlYW07CisgICAgaW50IHNpemU7CisKKyAgICB6c3RyZWFtLnphbGxvYyA9IFpfTlVMTDsKKyAgICB6c3RyZWFtLnpmcmVlICA9IFpfTlVMTDsKKyAgICB6c3RyZWFtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICBpZiAoZGVmbGF0ZUluaXQoJnpzdHJlYW0sIDApICE9IFpfT0spCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzaXplID0gZGVmbGF0ZUJvdW5kKCZ6c3RyZWFtLCB0bXBibG9ja19zaXplKTsKKyAgICBkZWZsYXRlRW5kKCZ6c3RyZWFtKTsKKworICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGZsYXNoc3ZfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBGbGFzaFNWQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGhfYmxvY2tzLCB2X2Jsb2NrcywgaF9wYXJ0LCB2X3BhcnQsIGksIGosIHJldDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBsYXN0X2Jsb2Nrd2lkdGggPSBzLT5ibG9ja193aWR0aDsKKyAgICBpbnQgbGFzdF9ibG9ja2hlaWdodD0gcy0+YmxvY2tfaGVpZ2h0OworCisgICAgLyogbm8gc3VwcGxlbWVudGFyeSBwaWN0dXJlICovCisgICAgaWYgKGJ1Zl9zaXplID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChidWZfc2l6ZSA8IDQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBhdnBrdC0+ZGF0YSwgYnVmX3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBzdGFydCB0byBwYXJzZSB0aGUgYml0c3RyZWFtICovCisgICAgcy0+YmxvY2tfd2lkdGggID0gMTYgKiAoZ2V0X2JpdHMoJmdiLCA0KSArIDEpOworICAgIHMtPmltYWdlX3dpZHRoICA9IGdldF9iaXRzKCZnYiwgMTIpOworICAgIHMtPmJsb2NrX2hlaWdodCA9IDE2ICogKGdldF9iaXRzKCZnYiwgNCkgKyAxKTsKKyAgICBzLT5pbWFnZV9oZWlnaHQgPSBnZXRfYml0cygmZ2IsIDEyKTsKKworICAgIGlmICggICBsYXN0X2Jsb2Nrd2lkdGggIT0gcy0+YmxvY2tfd2lkdGgKKyAgICAgICAgfHwgbGFzdF9ibG9ja2hlaWdodCE9IHMtPmJsb2NrX2hlaWdodCkKKyAgICAgICAgYXZfZnJlZXAoJnMtPmJsb2Nrcyk7CisKKyAgICBpZiAocy0+dmVyID09IDIpIHsKKyAgICAgICAgc2tpcF9iaXRzKCZnYiwgNik7CisgICAgICAgIGlmIChnZXRfYml0czEoJmdiKSkgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiaWZyYW1lIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldF9iaXRzMSgmZ2IpKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJDdXN0b20gcGFsZXR0ZSIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgYW5kIHNpemUgb2YgYm9yZGVyIChwYXJ0aWFsKSBibG9ja3MgKi8KKyAgICBoX2Jsb2NrcyA9IHMtPmltYWdlX3dpZHRoICAvIHMtPmJsb2NrX3dpZHRoOworICAgIGhfcGFydCAgID0gcy0+aW1hZ2Vfd2lkdGggICUgcy0+YmxvY2tfd2lkdGg7CisgICAgdl9ibG9ja3MgPSBzLT5pbWFnZV9oZWlnaHQgLyBzLT5ibG9ja19oZWlnaHQ7CisgICAgdl9wYXJ0ICAgPSBzLT5pbWFnZV9oZWlnaHQgJSBzLT5ibG9ja19oZWlnaHQ7CisKKyAgICAvKiB0aGUgYmxvY2sgc2l6ZSBjb3VsZCBjaGFuZ2UgYmV0d2VlbiBmcmFtZXMsIG1ha2Ugc3VyZSB0aGUgYnVmZmVyCisgICAgICogaXMgbGFyZ2UgZW5vdWdoLCBpZiBub3QsIGdldCBhIGxhcmdlciBvbmUgKi8KKyAgICBpZiAocy0+YmxvY2tfc2l6ZSA8IHMtPmJsb2NrX3dpZHRoICogcy0+YmxvY2tfaGVpZ2h0KSB7CisgICAgICAgIGludCB0bXBibG9ja19zaXplID0gMyAqIHMtPmJsb2NrX3dpZHRoICogcy0+YmxvY2tfaGVpZ2h0LCBlcnI7CisKKyAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmcy0+dG1wYmxvY2ssIHRtcGJsb2NrX3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgIHMtPmJsb2NrX3NpemUgPSAwOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBhbGxvY2F0ZSBkZWNvbXByZXNzaW9uIGJ1ZmZlci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+dmVyID09IDIpIHsKKyAgICAgICAgICAgIHMtPmRlZmxhdGVfYmxvY2tfc2l6ZSA9IGNhbGNfZGVmbGF0ZV9ibG9ja19zaXplKHRtcGJsb2NrX3NpemUpOworICAgICAgICAgICAgaWYgKHMtPmRlZmxhdGVfYmxvY2tfc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZGV0ZXJtaW5lIGRlZmxhdGUgYnVmZmVyIHNpemUuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZzLT5kZWZsYXRlX2Jsb2NrLCBzLT5kZWZsYXRlX2Jsb2NrX3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBzLT5ibG9ja19zaXplID0gMDsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSBkZWZsYXRlIGJ1ZmZlci5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+YmxvY2tfc2l6ZSA9IHMtPmJsb2NrX3dpZHRoICogcy0+YmxvY2tfaGVpZ2h0OworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgaW1hZ2Ugc2l6ZSBvbmNlICovCisgICAgaWYgKGF2Y3R4LT53aWR0aCA9PSAwICYmIGF2Y3R4LT5oZWlnaHQgPT0gMCkgeworICAgICAgICBpZiAoKHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBzLT5pbWFnZV93aWR0aCwgcy0+aW1hZ2VfaGVpZ2h0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBjaGVjayBmb3IgY2hhbmdlcyBvZiBpbWFnZSB3aWR0aCBhbmQgaW1hZ2UgaGVpZ2h0ICovCisgICAgaWYgKGF2Y3R4LT53aWR0aCAhPSBzLT5pbWFnZV93aWR0aCB8fCBhdmN0eC0+aGVpZ2h0ICE9IHMtPmltYWdlX2hlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGcmFtZSB3aWR0aCBvciBoZWlnaHQgZGlmZmVycyBmcm9tIGZpcnN0IGZyYW1lIVxuIik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZmggPSAlZCwgZnYgJWQgIHZzICBjaCA9ICVkLCBjdiA9ICVkXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPmhlaWdodCwgYXZjdHgtPndpZHRoLCBzLT5pbWFnZV9oZWlnaHQsIHMtPmltYWdlX3dpZHRoKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogd2UgY2FyZSBmb3Iga2V5ZnJhbWVzIG9ubHkgaW4gU2NyZWVuIFZpZGVvIHYyICovCisgICAgcy0+aXNfa2V5ZnJhbWUgPSAoYXZwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSAmJiAocy0+dmVyID09IDIpOworICAgIGlmIChzLT5pc19rZXlmcmFtZSkgeworICAgICAgICBpbnQgZXJyOworICAgICAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZzLT5rZXlmcmFtZWRhdGEsIGF2cGt0LT5zaXplKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgbWVtY3B5KHMtPmtleWZyYW1lZGF0YSwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICB9CisgICAgaWYocy0+dmVyID09IDIgJiYgIXMtPmJsb2NrcykKKyAgICAgICAgcy0+YmxvY2tzID0gYXZfbWFsbG9jeigodl9ibG9ja3MgKyAhIXZfcGFydCkgKiAoaF9ibG9ja3MgKyAhIWhfcGFydCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzLT5ibG9ja3NbMF0pKTsKKworICAgIGF2X2Rsb2coYXZjdHgsICJpbWFnZTogJWR4JWQgYmxvY2s6ICVkeCVkIG51bTogJWR4JWQgcGFydDogJWR4JWRcbiIsCisgICAgICAgICAgICBzLT5pbWFnZV93aWR0aCwgcy0+aW1hZ2VfaGVpZ2h0LCBzLT5ibG9ja193aWR0aCwgcy0+YmxvY2tfaGVpZ2h0LAorICAgICAgICAgICAgaF9ibG9ja3MsIHZfYmxvY2tzLCBoX3BhcnQsIHZfcGFydCk7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBsb29wIG92ZXIgYWxsIGJsb2NrIGNvbHVtbnMgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgdl9ibG9ja3MgKyAodl9wYXJ0ID8gMSA6IDApOyBqKyspIHsKKworICAgICAgICBpbnQgeV9wb3MgID0gaiAqIHMtPmJsb2NrX2hlaWdodDsgLy8gdmVydGljYWwgcG9zaXRpb24gaW4gZnJhbWUKKyAgICAgICAgaW50IGN1cl9ibGtfaGVpZ2h0ID0gKGogPCB2X2Jsb2NrcykgPyBzLT5ibG9ja19oZWlnaHQgOiB2X3BhcnQ7CisKKyAgICAgICAgLyogbG9vcCBvdmVyIGFsbCBibG9jayByb3dzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoX2Jsb2NrcyArIChoX3BhcnQgPyAxIDogMCk7IGkrKykgeworICAgICAgICAgICAgaW50IHhfcG9zID0gaSAqIHMtPmJsb2NrX3dpZHRoOyAvLyBob3Jpem9udGFsIHBvc2l0aW9uIGluIGZyYW1lCisgICAgICAgICAgICBpbnQgY3VyX2Jsa193aWR0aCA9IChpIDwgaF9ibG9ja3MpID8gcy0+YmxvY2tfd2lkdGggOiBoX3BhcnQ7CisgICAgICAgICAgICBpbnQgaGFzX2RpZmYgPSAwOworCisgICAgICAgICAgICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgemxpYiBjaHVuayAqLworICAgICAgICAgICAgaW50IHNpemUgPSBnZXRfYml0cygmZ2IsIDE2KTsKKworICAgICAgICAgICAgcy0+Y29sb3JfZGVwdGggICAgPSAwOworICAgICAgICAgICAgcy0+emxpYnByaW1lX2N1cnIgPSAwOworICAgICAgICAgICAgcy0+emxpYnByaW1lX3ByZXYgPSAwOworICAgICAgICAgICAgcy0+ZGlmZl9zdGFydCAgICAgPSAwOworICAgICAgICAgICAgcy0+ZGlmZl9oZWlnaHQgICAgPSBjdXJfYmxrX2hlaWdodDsKKworICAgICAgICAgICAgaWYgKDggKiBzaXplID4gZ2V0X2JpdHNfbGVmdCgmZ2IpKSB7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+ZnJhbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocy0+dmVyID09IDIgJiYgc2l6ZSkgeworICAgICAgICAgICAgICAgIHNraXBfYml0cygmZ2IsIDMpOworICAgICAgICAgICAgICAgIHMtPmNvbG9yX2RlcHRoICAgID0gZ2V0X2JpdHMoJmdiLCAyKTsKKyAgICAgICAgICAgICAgICBoYXNfZGlmZiAgICAgICAgICA9IGdldF9iaXRzMSgmZ2IpOworICAgICAgICAgICAgICAgIHMtPnpsaWJwcmltZV9jdXJyID0gZ2V0X2JpdHMxKCZnYik7CisgICAgICAgICAgICAgICAgcy0+emxpYnByaW1lX3ByZXYgPSBnZXRfYml0czEoJmdiKTsKKworICAgICAgICAgICAgICAgIGlmIChzLT5jb2xvcl9kZXB0aCAhPSAwICYmIHMtPmNvbG9yX2RlcHRoICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWR4JWQgaW52YWxpZCBjb2xvciBkZXB0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIHMtPmNvbG9yX2RlcHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGhhc19kaWZmKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcy0+a2V5ZnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlciBmcmFtZSB3aXRob3V0IGtleWZyYW1lXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMtPmRpZmZfc3RhcnQgID0gZ2V0X2JpdHMoJmdiLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZGlmZl9oZWlnaHQgPSBnZXRfYml0cygmZ2IsIDgpOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+ZGlmZl9zdGFydCArIHMtPmRpZmZfaGVpZ2h0ID4gY3VyX2Jsa19oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCbG9jayBwYXJhbWV0ZXJzIGludmFsaWQ6ICVkICsgJWQgPiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kaWZmX3N0YXJ0LCBzLT5kaWZmX2hlaWdodCwgY3VyX2Jsa19oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWR4JWQgZGlmZiBzdGFydCAlZCBoZWlnaHQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBqLCBzLT5kaWZmX3N0YXJ0LCBzLT5kaWZmX2hlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gMjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocy0+emxpYnByaW1lX3ByZXYpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiJWR4JWQgemxpYnByaW1lX3ByZXZcbiIsIGksIGopOworCisgICAgICAgICAgICAgICAgaWYgKHMtPnpsaWJwcmltZV9jdXJyKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb2wgPSBnZXRfYml0cygmZ2IsIDgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcm93ID0gZ2V0X2JpdHMoJmdiLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIlZHglZCB6bGlicHJpbWVfY3VyciAlZHglZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIGNvbCwgcm93KTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSAtPSAyOworICAgICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJ6bGlicHJpbWVfY3VyciIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghcy0+YmxvY2tzICYmIChzLT56bGlicHJpbWVfY3VyciB8fCBzLT56bGlicHJpbWVfcHJldikpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gZGF0YSBhdmFpbGFibGUgZm9yIHpsaWIgcHJpbWluZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplLS07IC8vIGFjY291bnQgZm9yIGZsYWdzIGJ5dGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhhc19kaWZmKSB7CisgICAgICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICAgICAgaW50IG9mZiA9IChzLT5pbWFnZV9oZWlnaHQgLSB5X3BvcyAtIDEpICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdOworCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGN1cl9ibGtfaGVpZ2h0OyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHggPSBvZmYgLSBrICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdICsgeF9wb3MgKiAzOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkocy0+ZnJhbWUtPmRhdGFbMF0gKyB4LCBzLT5rZXlmcmFtZSArIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfYmxrX3dpZHRoICogMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBza2lwIHVuY2hhbmdlZCBibG9ja3MsIHdoaWNoIGhhdmUgc2l6ZSAwICovCisgICAgICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChmbGFzaHN2X2RlY29kZV9ibG9jayhhdmN0eCwgYXZwa3QsICZnYiwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2Jsa193aWR0aCwgY3VyX2Jsa19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfcG9zLCB5X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIGogKiAoaF9ibG9ja3MgKyAhIWhfcGFydCkpKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBpbiBkZWNvbXByZXNzaW9uIG9mIGJsb2NrICVkeCVkXG4iLCBpLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+aXNfa2V5ZnJhbWUgJiYgcy0+dmVyID09IDIpIHsKKyAgICAgICAgaWYgKCFzLT5rZXlmcmFtZSkgeworICAgICAgICAgICAgcy0+a2V5ZnJhbWUgPSBhdl9tYWxsb2Mocy0+ZnJhbWUtPmxpbmVzaXplWzBdICogYXZjdHgtPmhlaWdodCk7CisgICAgICAgICAgICBpZiAoIXMtPmtleWZyYW1lKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgaW1hZ2UgZGF0YVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocy0+a2V5ZnJhbWUsIHMtPmZyYW1lLT5kYXRhWzBdLAorICAgICAgICAgICAgICAgcy0+ZnJhbWUtPmxpbmVzaXplWzBdICogYXZjdHgtPmhlaWdodCk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIGlmICgoZ2V0X2JpdHNfY291bnQoJmdiKSAvIDgpICE9IGJ1Zl9zaXplKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJ1ZmZlciBub3QgZnVsbHkgY29uc3VtZWQgKCVkICE9ICVkKVxuIiwKKyAgICAgICAgICAgICAgIGJ1Zl9zaXplLCAoZ2V0X2JpdHNfY291bnQoJmdiKSAvIDgpKTsKKworICAgIC8qIHJlcG9ydCB0aGF0IHRoZSBidWZmZXIgd2FzIGNvbXBsZXRlbHkgY29uc3VtZWQgKi8KKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKKyNpZiBDT05GSUdfRkxBU0hTVl9ERUNPREVSCitBVkNvZGVjIGZmX2ZsYXNoc3ZfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZmxhc2hzdiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZsYXNoIFNjcmVlbiBWaWRlbyB2MSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9GTEFTSFNWLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGbGFzaFNWQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmxhc2hzdl9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmbGFzaHN2X2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZmxhc2hzdl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9CR1IyNCwgQVZfUElYX0ZNVF9OT05FIH0sCit9OworI2VuZGlmIC8qIENPTkZJR19GTEFTSFNWX0RFQ09ERVIgKi8KKworI2lmIENPTkZJR19GTEFTSFNWMl9ERUNPREVSCitzdGF0aWMgY29uc3QgdWludDMyX3QgZmZfZmxhc2hzdjJfZGVmYXVsdF9wYWxldHRlWzEyOF0gPSB7CisgICAgMHgwMDAwMDAsIDB4MzMzMzMzLCAweDY2NjY2NiwgMHg5OTk5OTksIDB4Q0NDQ0NDLCAweEZGRkZGRiwKKyAgICAweDMzMDAwMCwgMHg2NjAwMDAsIDB4OTkwMDAwLCAweENDMDAwMCwgMHhGRjAwMDAsIDB4MDAzMzAwLAorICAgIDB4MDA2NjAwLCAweDAwOTkwMCwgMHgwMENDMDAsIDB4MDBGRjAwLCAweDAwMDAzMywgMHgwMDAwNjYsCisgICAgMHgwMDAwOTksIDB4MDAwMENDLCAweDAwMDBGRiwgMHgzMzMzMDAsIDB4NjY2NjAwLCAweDk5OTkwMCwKKyAgICAweENDQ0MwMCwgMHhGRkZGMDAsIDB4MDAzMzMzLCAweDAwNjY2NiwgMHgwMDk5OTksIDB4MDBDQ0NDLAorICAgIDB4MDBGRkZGLCAweDMzMDAzMywgMHg2NjAwNjYsIDB4OTkwMDk5LCAweENDMDBDQywgMHhGRjAwRkYsCisgICAgMHhGRkZGMzMsIDB4RkZGRjY2LCAweEZGRkY5OSwgMHhGRkZGQ0MsIDB4RkYzM0ZGLCAweEZGNjZGRiwKKyAgICAweEZGOTlGRiwgMHhGRkNDRkYsIDB4MzNGRkZGLCAweDY2RkZGRiwgMHg5OUZGRkYsIDB4Q0NGRkZGLAorICAgIDB4Q0NDQzMzLCAweENDQ0M2NiwgMHhDQ0NDOTksIDB4Q0NDQ0ZGLCAweENDMzNDQywgMHhDQzY2Q0MsCisgICAgMHhDQzk5Q0MsIDB4Q0NGRkNDLCAweDMzQ0NDQywgMHg2NkNDQ0MsIDB4OTlDQ0NDLCAweEZGQ0NDQywKKyAgICAweDk5OTkzMywgMHg5OTk5NjYsIDB4OTk5OUNDLCAweDk5OTlGRiwgMHg5OTMzOTksIDB4OTk2Njk5LAorICAgIDB4OTlDQzk5LCAweDk5RkY5OSwgMHgzMzk5OTksIDB4NjY5OTk5LCAweENDOTk5OSwgMHhGRjk5OTksCisgICAgMHg2NjY2MzMsIDB4NjY2Njk5LCAweDY2NjZDQywgMHg2NjY2RkYsIDB4NjYzMzY2LCAweDY2OTk2NiwKKyAgICAweDY2Q0M2NiwgMHg2NkZGNjYsIDB4MzM2NjY2LCAweDk5NjY2NiwgMHhDQzY2NjYsIDB4RkY2NjY2LAorICAgIDB4MzMzMzY2LCAweDMzMzM5OSwgMHgzMzMzQ0MsIDB4MzMzM0ZGLCAweDMzNjYzMywgMHgzMzk5MzMsCisgICAgMHgzM0NDMzMsIDB4MzNGRjMzLCAweDY2MzMzMywgMHg5OTMzMzMsIDB4Q0MzMzMzLCAweEZGMzMzMywKKyAgICAweDAwMzM2NiwgMHgzMzY2MDAsIDB4NjYwMDMzLCAweDAwNjYzMywgMHgzMzAwNjYsIDB4NjYzMzAwLAorICAgIDB4MzM2Njk5LCAweDY2OTkzMywgMHg5OTMzNjYsIDB4MzM5OTY2LCAweDY2MzM5OSwgMHg5OTY2MzMsCisgICAgMHg2Njk5Q0MsIDB4OTlDQzY2LCAweENDNjY5OSwgMHg2NkNDOTksIDB4OTk2NkNDLCAweENDOTk2NiwKKyAgICAweDk5Q0NGRiwgMHhDQ0ZGOTksIDB4RkY5OUNDLCAweDk5RkZDQywgMHhDQzk5RkYsIDB4RkZDQzk5LAorICAgIDB4MTExMTExLCAweDIyMjIyMiwgMHg0NDQ0NDQsIDB4NTU1NTU1LCAweEFBQUFBQSwgMHhCQkJCQkIsCisgICAgMHhEREREREQsIDB4RUVFRUVFCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgZmxhc2hzdjJfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZsYXNoU1ZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBmbGFzaHN2X2RlY29kZV9pbml0KGF2Y3R4KTsKKyAgICBzLT5wYWwgPSBmZl9mbGFzaHN2Ml9kZWZhdWx0X3BhbGV0dGU7CisgICAgcy0+dmVyID0gMjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZmxhc2hzdjJfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRmxhc2hTVkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJnMtPmtleWZyYW1lZGF0YSk7CisgICAgYXZfZnJlZXAoJnMtPmJsb2Nrcyk7CisgICAgYXZfZnJlZXAoJnMtPmtleWZyYW1lKTsKKyAgICBhdl9mcmVlcCgmcy0+ZGVmbGF0ZV9ibG9jayk7CisgICAgZmxhc2hzdl9kZWNvZGVfZW5kKGF2Y3R4KTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2ZsYXNoc3YyX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImZsYXNoc3YyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmxhc2ggU2NyZWVuIFZpZGVvIHYyIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0ZMQVNIU1YyLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGbGFzaFNWQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmxhc2hzdjJfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmxhc2hzdjJfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBmbGFzaHN2X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeyBBVl9QSVhfRk1UX0JHUjI0LCBBVl9QSVhfRk1UX05PTkUgfSwKK307CisjZW5kaWYgLyogQ09ORklHX0ZMQVNIU1YyX0RFQ09ERVIgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZsYXNoc3YyZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFzaHN2MmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMDE2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFzaHN2MmVuYy5jCkBAIC0wLDAgKzEsOTIwIEBACisvKgorICogRmxhc2ggU2NyZWVuIFZpZGVvIFZlcnNpb24gMiBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSm9zaHVhIFdhcm5lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBGbGFzaCBTY3JlZW4gVmlkZW8gVmVyc2lvbiAyIGVuY29kZXIKKyAqIEBhdXRob3IgSm9zaHVhIFdhcm5lcgorICovCisKKy8qIERpZmZlcmVuY2VzIGZyb20gdmVyc2lvbiAxIHN0cmVhbToKKyAqIE5PVEU6IEN1cnJlbnRseSwgdGhlIG9ubHkgcGxheWVyIHRoYXQgc3VwcG9ydHMgdmVyc2lvbiAyIHN0cmVhbXMgaXMgQWRvYmUgRmxhc2ggUGxheWVyIGl0c2VsZi4KKyAqICogU3VwcG9ydHMgc2VuZGluZyBvbmx5IGEgcmFuZ2Ugb2Ygc2NhbmxpbmVzIGluIGEgYmxvY2ssCisgKiAgIGluZGljYXRpbmcgYSBkaWZmZXJlbmNlIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaW4gdGhlIGxhc3Qga2V5ZnJhbWUuCisgKiAqIFN1cHBvcnRzIGluaXRpYWxpemluZyB0aGUgemxpYiBkaWN0aW9uYXJ5IHdpdGggZGF0YSBmcm9tIHRoZSBjb3JyZXNwb25kaW5nCisgKiAgIGJsb2NrIGluIHRoZSBsYXN0IGtleWZyYW1lLCB0byBpbXByb3ZlIGNvbXByZXNzaW9uLgorICogKiBTdXBwb3J0cyBhIGh5YnJpZCAxNS1iaXQgcmdiIC8gNy1iaXQgcGFsZXR0ZSBjb2xvciBzcGFjZS4KKyAqLworCisvKiBUT0RPOgorICogRG9uJ3Qga2VlcCBCbG9jayBzdHJ1Y3R1cmVzIGZvciBib3RoIGN1cnJlbnQgZnJhbWUgYW5kIGtleWZyYW1lLgorICogTWFrZSBiZXR0ZXIgaGV1cmlzdGljcyBmb3IgZGVjaWRpbmcgc3RyZWFtIHBhcmFtZXRlcnMgKG9wdGltdW1fKiBmdW5jdGlvbnMpLiAgQ3VycmVudGx5IHRoZXNlIHJldHVybiBjb25zdGFudHMuCisgKiBGaWd1cmUgb3V0IGhvdyB0byBlbmNvZGUgcGFsZXR0ZSBpbmZvcm1hdGlvbiBpbiB0aGUgc3RyZWFtLCBjaG9vc2UgYW4gb3B0aW11bSBwYWxldHRlIGF0IGVhY2gga2V5ZnJhbWUuCisgKiBGaWd1cmUgb3V0IGhvdyB0aGUgemxpYlByaW1lQ29tcHJlc3NDdXJyZW50IGZsYWcgd29ya3MsIGltcGxlbWVudCBzdXBwb3J0LgorICogRmluZCBvdGhlciBzYW1wbGUgZmlsZXMgKHRoYXQgd2VyZW4ndCBnZW5lcmF0ZWQgaGVyZSksIGRldmVsb3AgYSBkZWNvZGVyLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorCisjZGVmaW5lIEhBU19JRlJBTUVfSU1BR0UgMHgwMgorI2RlZmluZSBIQVNfUEFMTEVUX0lORk8gMHgwMQorCisjZGVmaW5lIENPTE9SU1BBQ0VfQkdSIDB4MDAKKyNkZWZpbmUgQ09MT1JTUEFDRV8xNV83IDB4MTAKKyNkZWZpbmUgSEFTX0RJRkZfQkxPQ0tTIDB4MDQKKyNkZWZpbmUgWkxJQl9QUklNRV9DT01QUkVTU19DVVJSRU5UIDB4MDIKKyNkZWZpbmUgWkxJQl9QUklNRV9DT01QUkVTU19QUkVWSU9VUyAweDAxCisKKy8vIERpc2FibGVzIGV4cGVyaW1lbnRhbCAic21hcnQiIHBhcmFtZXRlci1jaG9vc2luZyBjb2RlLCBhcyB3ZWxsIGFzIHRoZSBzdGF0aXN0aWNzIHRoYXQgaXQgZGVwZW5kcyBvbi4KKy8vIEF0IHRoZSBtb21lbnQsIHRoZSAic21hcnQiIGNvZGUgaXMgYSBncmVhdCBleGFtcGxlIG9mIGhvdyB0aGUgcGFyYW1ldGVycyAqc2hvdWxkbid0KiBiZSBjaG9zZW4uCisjZGVmaW5lIEZMQVNIU1YyX0RVTUIKKwordHlwZWRlZiBzdHJ1Y3QgQmxvY2sgeworICAgIHVpbnQ4X3QgKmVuYzsKKyAgICB1aW50OF90ICpzbF9iZWdpbiwgKnNsX2VuZDsKKyAgICBpbnQgZW5jX3NpemU7CisgICAgdWludDhfdCAqZGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZTsKKworICAgIHVpbnQ4X3Qgc3RhcnQsIGxlbjsKKyAgICB1aW50OF90IGRpcnR5OworICAgIHVpbnQ4X3QgY29sLCByb3csIHdpZHRoLCBoZWlnaHQ7CisgICAgdWludDhfdCBmbGFnczsKK30gQmxvY2s7CisKK3R5cGVkZWYgc3RydWN0IFBhbGV0dGUgeworICAgIHVuc2lnbmVkIGNvbG9yc1sxMjhdOworICAgIHVpbnQ4X3QgaW5kZXhbMSA8PCAxNV07Cit9IFBhbGV0dGU7CisKK3R5cGVkZWYgc3RydWN0IEZsYXNoU1YyQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIHVpbnQ4X3QgKmN1cnJlbnRfZnJhbWU7CisgICAgdWludDhfdCAqa2V5X2ZyYW1lOworICAgIHVpbnQ4X3QgKmVuY2J1ZmZlcjsKKyAgICB1aW50OF90ICprZXlidWZmZXI7CisgICAgdWludDhfdCAqZGF0YWJ1ZmZlcjsKKworICAgIHVpbnQ4X3QgKmJsb2NrYnVmZmVyOworICAgIGludCBibG9ja2J1ZmZlcl9zaXplOworCisgICAgQmxvY2sgKmZyYW1lX2Jsb2NrczsKKyAgICBCbG9jayAqa2V5X2Jsb2NrczsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKyAgICBpbnQgYmxvY2tzX3NpemU7CisKKyAgICBpbnQgdXNlMTVfNywgZGlzdCwgY29tcDsKKworICAgIGludCByb3dzLCBjb2xzOworCisgICAgaW50IGxhc3Rfa2V5X2ZyYW1lOworCisgICAgaW50IGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQ7CisgICAgaW50IGJsb2NrX3dpZHRoLCBibG9ja19oZWlnaHQ7CisgICAgdWludDhfdCBmbGFnczsKKyAgICB1aW50OF90IHVzZV9jdXN0b21fcGFsZXR0ZTsKKyAgICB1aW50OF90IHBhbGV0dGVfdHlwZTsgICAgICAgLy8vPCAwPT5kZWZhdWx0LCAxPT5jdXN0b20gLSBjaGFuZ2VkIHdoZW4gcGFsZXR0ZSByZWdlbmVyYXRlZC4KKyAgICBQYWxldHRlIHBhbGV0dGU7CisjaWZuZGVmIEZMQVNIU1YyX0RVTUIKKyAgICBkb3VibGUgdG90X2Jsb2NrczsgICAgICAgICAgLy8vPCBibG9ja3MgZW5jb2RlZCBzaW5jZSBsYXN0IGtleWZyYW1lCisgICAgZG91YmxlIGRpZmZfYmxvY2tzOyAgICAgICAgIC8vLzwgYmxvY2tzIHRoYXQgd2VyZSBkaWZmZXJlbnQgc2luY2UgbGFzdCBrZXlmcmFtZQorICAgIGRvdWJsZSB0b3RfbGluZXM7ICAgICAgICAgICAvLy88IHRvdGFsIHNjYW5saW5lcyBpbiBpbWFnZSBzaW5jZSBsYXN0IGtleWZyYW1lCisgICAgZG91YmxlIGRpZmZfbGluZXM7ICAgICAgICAgIC8vLzwgc2NhbmxpbmVzIHRoYXQgd2VyZSBkaWZmZXJlbnQgc2luY2UgbGFzdCBrZXlmcmFtZQorICAgIGRvdWJsZSByYXdfc2l6ZTsgICAgICAgICAgICAvLy88IHNpemUgb2YgcmF3IGZyYW1lcyBzaW5jZSBsYXN0IGtleWZyYW1lCisgICAgZG91YmxlIGNvbXBfc2l6ZTsgICAgICAgICAgIC8vLzwgc2l6ZSBvZiBjb21wcmVzc2VkIGRhdGEgc2luY2UgbGFzdCBrZXlmcmFtZQorICAgIGRvdWJsZSB1bmNvbXBfc2l6ZTsgICAgICAgICAvLy88IHNpemUgb2YgdW5jb21wcmVzc2VkIGRhdGEgc2luY2UgbGFzdCBrZXlmcmFtZQorCisgICAgZG91YmxlIHRvdGFsX2JpdHM7ICAgICAgICAgIC8vLzwgdG90YWwgYml0cyB3cml0dGVuIHRvIHN0cmVhbSBzbyBmYXIKKyNlbmRpZgorfSBGbGFzaFNWMkNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgY2xlYW51cChGbGFzaFNWMkNvbnRleHQgKiBzKQoreworICAgIGF2X2ZyZWVwKCZzLT5lbmNidWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5rZXlidWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5kYXRhYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmcy0+YmxvY2tidWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5jdXJyZW50X2ZyYW1lKTsKKyAgICBhdl9mcmVlcCgmcy0+a2V5X2ZyYW1lKTsKKworICAgIGF2X2ZyZWVwKCZzLT5mcmFtZV9ibG9ja3MpOworICAgIGF2X2ZyZWVwKCZzLT5rZXlfYmxvY2tzKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9ibG9ja3MoRmxhc2hTVjJDb250ZXh0ICogcywgQmxvY2sgKiBibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICogZW5jYnVmLCB1aW50OF90ICogZGF0YWJ1ZikKK3sKKyAgICBpbnQgcm93LCBjb2w7CisgICAgQmxvY2sgKmI7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBzLT5jb2xzOyBjb2wrKykgeworICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IHMtPnJvd3M7IHJvdysrKSB7CisgICAgICAgICAgICBiID0gYmxvY2tzICsgKGNvbCArIHJvdyAqIHMtPmNvbHMpOworICAgICAgICAgICAgYi0+d2lkdGggPSAoY29sIDwgcy0+Y29scyAtIDEpID8KKyAgICAgICAgICAgICAgICBzLT5ibG9ja193aWR0aCA6CisgICAgICAgICAgICAgICAgcy0+aW1hZ2Vfd2lkdGggLSBjb2wgKiBzLT5ibG9ja193aWR0aDsKKworICAgICAgICAgICAgYi0+aGVpZ2h0ID0gKHJvdyA8IHMtPnJvd3MgLSAxKSA/CisgICAgICAgICAgICAgICAgcy0+YmxvY2tfaGVpZ2h0IDoKKyAgICAgICAgICAgICAgICBzLT5pbWFnZV9oZWlnaHQgLSByb3cgKiBzLT5ibG9ja19oZWlnaHQ7CisKKyAgICAgICAgICAgIGItPnJvdyAgID0gcm93OworICAgICAgICAgICAgYi0+Y29sICAgPSBjb2w7CisgICAgICAgICAgICBiLT5lbmMgICA9IGVuY2J1ZjsKKyAgICAgICAgICAgIGItPmRhdGEgID0gZGF0YWJ1ZjsKKyAgICAgICAgICAgIGVuY2J1ZiAgKz0gYi0+d2lkdGggKiBiLT5oZWlnaHQgKiAzOworICAgICAgICAgICAgZGF0YWJ1ZiArPSAhZGF0YWJ1ZiA/IDAgOiBiLT53aWR0aCAqIGItPmhlaWdodCAqIDY7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3N0YXRzKEZsYXNoU1YyQ29udGV4dCAqIHMpCit7CisjaWZuZGVmIEZMQVNIU1YyX0RVTUIKKyAgICBzLT5kaWZmX2Jsb2NrcyA9IDAuMTsKKyAgICBzLT50b3RfYmxvY2tzID0gMTsKKyAgICBzLT5kaWZmX2xpbmVzID0gMC4xOworICAgIHMtPnRvdF9saW5lcyA9IDE7CisgICAgcy0+cmF3X3NpemUgPSBzLT5jb21wX3NpemUgPSBzLT51bmNvbXBfc2l6ZSA9IDEwOworI2VuZGlmCit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBmbGFzaHN2Ml9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqIGF2Y3R4KQoreworICAgIEZsYXNoU1YyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworCisgICAgcy0+Y29tcCA9IGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbDsKKyAgICBpZiAocy0+Y29tcCA9PSAtMSkKKyAgICAgICAgcy0+Y29tcCA9IDk7CisgICAgaWYgKHMtPmNvbXAgPCAwIHx8IHMtPmNvbXAgPiA5KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvbXByZXNzaW9uIGxldmVsIHNob3VsZCBiZSAwLTksIG5vdCAlZFxuIiwgcy0+Y29tcCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKworICAgIGlmICgoYXZjdHgtPndpZHRoID4gNDA5NSkgfHwgKGF2Y3R4LT5oZWlnaHQgPiA0MDk1KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnB1dCBkaW1lbnNpb25zIHRvbyBsYXJnZSwgaW5wdXQgbXVzdCBiZSBtYXggNDA5NXg0MDk1ICFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoYXZjdHgtPndpZHRoIDwgMTYpIHx8IChhdmN0eC0+aGVpZ2h0IDwgMTYpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIklucHV0IGRpbWVuc2lvbnMgdG9vIHNtYWxsLCBpbnB1dCBtdXN0IGJlIGF0IGxlYXN0IDE2eDE2ICFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCAwLCBhdmN0eCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKworICAgIHMtPmxhc3Rfa2V5X2ZyYW1lID0gMDsKKworICAgIHMtPmltYWdlX3dpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICBzLT5pbWFnZV9oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgcy0+YmxvY2tfd2lkdGggID0gKHMtPmltYWdlX3dpZHRoIC8gIDEyKSAmIH4xNTsKKyAgICBzLT5ibG9ja19oZWlnaHQgPSAocy0+aW1hZ2VfaGVpZ2h0IC8gMTIpICYgfjE1OworCisgICAgaWYoIXMtPmJsb2NrX3dpZHRoKQorICAgICAgICBzLT5ibG9ja193aWR0aCA9IDE7CisgICAgaWYoIXMtPmJsb2NrX2hlaWdodCkKKyAgICAgICAgcy0+YmxvY2tfaGVpZ2h0ID0gMTsKKworICAgIHMtPnJvd3MgPSAocy0+aW1hZ2VfaGVpZ2h0ICsgcy0+YmxvY2tfaGVpZ2h0IC0gMSkgLyBzLT5ibG9ja19oZWlnaHQ7CisgICAgcy0+Y29scyA9IChzLT5pbWFnZV93aWR0aCArICBzLT5ibG9ja193aWR0aCAtICAxKSAvIHMtPmJsb2NrX3dpZHRoOworCisgICAgcy0+ZnJhbWVfc2l6ZSAgPSBzLT5pbWFnZV93aWR0aCAqIHMtPmltYWdlX2hlaWdodCAqIDM7CisgICAgcy0+YmxvY2tzX3NpemUgPSBzLT5yb3dzICogcy0+Y29scyAqIHNpemVvZihCbG9jayk7CisKKyAgICBzLT5lbmNidWZmZXIgICAgID0gYXZfbWFsbG9jeihzLT5mcmFtZV9zaXplKTsKKyAgICBzLT5rZXlidWZmZXIgICAgID0gYXZfbWFsbG9jeihzLT5mcmFtZV9zaXplKTsKKyAgICBzLT5kYXRhYnVmZmVyICAgID0gYXZfbWFsbG9jeihzLT5mcmFtZV9zaXplICogNik7CisgICAgcy0+Y3VycmVudF9mcmFtZSA9IGF2X21hbGxvY3oocy0+ZnJhbWVfc2l6ZSk7CisgICAgcy0+a2V5X2ZyYW1lICAgICA9IGF2X21hbGxvY3oocy0+ZnJhbWVfc2l6ZSk7CisgICAgcy0+ZnJhbWVfYmxvY2tzICA9IGF2X21hbGxvY3oocy0+YmxvY2tzX3NpemUpOworICAgIHMtPmtleV9ibG9ja3MgICAgPSBhdl9tYWxsb2N6KHMtPmJsb2Nrc19zaXplKTsKKworICAgIHMtPmJsb2NrYnVmZmVyICAgICAgPSBOVUxMOworICAgIHMtPmJsb2NrYnVmZmVyX3NpemUgPSAwOworCisgICAgaW5pdF9ibG9ja3Mocywgcy0+ZnJhbWVfYmxvY2tzLCBzLT5lbmNidWZmZXIsIHMtPmRhdGFidWZmZXIpOworICAgIGluaXRfYmxvY2tzKHMsIHMtPmtleV9ibG9ja3MsICAgcy0+a2V5YnVmZmVyLCAwKTsKKyAgICByZXNldF9zdGF0cyhzKTsKKyNpZm5kZWYgRkxBU0hTVjJfRFVNQgorICAgIHMtPnRvdGFsX2JpdHMgPSAxOworI2VuZGlmCisKKyAgICBzLT51c2VfY3VzdG9tX3BhbGV0dGUgPSAgMDsKKyAgICBzLT5wYWxldHRlX3R5cGUgICAgICAgPSAtMTsgICAgICAgIC8vIHNvIHRoYXQgdGhlIHBhbGV0dGUgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gcmVjb25maWd1cmVfYXRfa2V5ZnJhbWUKKworICAgIGlmICghcy0+ZW5jYnVmZmVyIHx8ICFzLT5rZXlidWZmZXIgfHwgIXMtPmRhdGFidWZmZXIKKyAgICAgICAgfHwgIXMtPmN1cnJlbnRfZnJhbWUgfHwgIXMtPmtleV9mcmFtZSB8fCAhcy0+a2V5X2Jsb2NrcworICAgICAgICB8fCAhcy0+ZnJhbWVfYmxvY2tzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxuIik7CisgICAgICAgIGNsZWFudXAocyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXdfa2V5X2ZyYW1lKEZsYXNoU1YyQ29udGV4dCAqIHMpCit7CisgICAgaW50IGk7CisgICAgbWVtY3B5KHMtPmtleV9ibG9ja3MsIHMtPmZyYW1lX2Jsb2Nrcywgcy0+YmxvY2tzX3NpemUpOworICAgIG1lbWNweShzLT5rZXlfZnJhbWUsIHMtPmN1cnJlbnRfZnJhbWUsIHMtPmZyYW1lX3NpemUpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPnJvd3MgKiBzLT5jb2xzOyBpKyspIHsKKyAgICAgICAgcy0+a2V5X2Jsb2Nrc1tpXS5lbmMgKz0gKHMtPmtleWJ1ZmZlciAtIHMtPmVuY2J1ZmZlcik7CisgICAgICAgIHMtPmtleV9ibG9ja3NbaV0uc2xfYmVnaW4gPSAwOworICAgICAgICBzLT5rZXlfYmxvY2tzW2ldLnNsX2VuZCAgID0gMDsKKyAgICAgICAgcy0+a2V5X2Jsb2Nrc1tpXS5kYXRhICAgICA9IDA7CisgICAgfQorICAgIG1lbWNweShzLT5rZXlidWZmZXIsIHMtPmVuY2J1ZmZlciwgcy0+ZnJhbWVfc2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9wYWxldHRlKEZsYXNoU1YyQ29udGV4dCAqIHMsIHVpbnQ4X3QgKiBidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICAvL3RoaXMgaXNuJ3QgaW1wbGVtZW50ZWQgeWV0ISAgRGVmYXVsdCBwYWxldHRlIG9ubHkhCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHdyaXRlX2hlYWRlcihGbGFzaFNWMkNvbnRleHQgKiBzLCB1aW50OF90ICogYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBpbnQgYnVmX3BvcywgbGVuOworCisgICAgaWYgKGJ1Zl9zaXplIDwgNSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaW5pdF9wdXRfYml0cygmcGIsIGJ1ZiwgYnVmX3NpemUgKiA4KTsKKworICAgIHB1dF9iaXRzKCZwYiwgNCwgKHMtPmJsb2NrX3dpZHRoICA+PiA0KSAtIDEpOworICAgIHB1dF9iaXRzKCZwYiwgMTIsIHMtPmltYWdlX3dpZHRoKTsKKyAgICBwdXRfYml0cygmcGIsIDQsIChzLT5ibG9ja19oZWlnaHQgPj4gNCkgLSAxKTsKKyAgICBwdXRfYml0cygmcGIsIDEyLCBzLT5pbWFnZV9oZWlnaHQpOworCisgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKyAgICBidWZfcG9zID0gNDsKKworICAgIGJ1ZltidWZfcG9zKytdID0gcy0+ZmxhZ3M7CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBIQVNfUEFMTEVUX0lORk8pIHsKKyAgICAgICAgbGVuID0gd3JpdGVfcGFsZXR0ZShzLCBidWYgKyBidWZfcG9zLCBidWZfc2l6ZSAtIGJ1Zl9wb3MpOworICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnVmX3BvcyArPSBsZW47CisgICAgfQorCisgICAgcmV0dXJuIGJ1Zl9wb3M7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfYmxvY2soQmxvY2sgKiBiLCB1aW50OF90ICogYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgaW50IGJ1Zl9wb3MgPSAwOworICAgIHVuc2lnbmVkIGJsb2NrX3NpemUgPSBiLT5kYXRhX3NpemU7CisKKyAgICBpZiAoYi0+ZmxhZ3MgJiBIQVNfRElGRl9CTE9DS1MpCisgICAgICAgIGJsb2NrX3NpemUgKz0gMjsKKyAgICBpZiAoYi0+ZmxhZ3MgJiBaTElCX1BSSU1FX0NPTVBSRVNTX0NVUlJFTlQpCisgICAgICAgIGJsb2NrX3NpemUgKz0gMjsKKyAgICBpZiAoYmxvY2tfc2l6ZSA+IDApCisgICAgICAgIGJsb2NrX3NpemUgKz0gMTsKKyAgICBpZiAoYnVmX3NpemUgPCBibG9ja19zaXplICsgMikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYnVmW2J1Zl9wb3MrK10gPSBibG9ja19zaXplID4+IDg7CisgICAgYnVmW2J1Zl9wb3MrK10gPSBibG9ja19zaXplOworCisgICAgaWYgKGJsb2NrX3NpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIGJ1Zl9wb3M7CisKKyAgICBidWZbYnVmX3BvcysrXSA9IGItPmZsYWdzOworCisgICAgaWYgKGItPmZsYWdzICYgSEFTX0RJRkZfQkxPQ0tTKSB7CisgICAgICAgIGJ1ZltidWZfcG9zKytdID0gKGItPnN0YXJ0KTsKKyAgICAgICAgYnVmW2J1Zl9wb3MrK10gPSAoYi0+bGVuKTsKKyAgICB9CisKKyAgICBpZiAoYi0+ZmxhZ3MgJiBaTElCX1BSSU1FX0NPTVBSRVNTX0NVUlJFTlQpIHsKKyAgICAgICAgLy9UaGlzIGZlYXR1cmUgb2YgdGhlIGZvcm1hdCBpcyBwb29ybHkgdW5kZXJzdG9vZCwgYW5kIGFzIG9mIG5vdywgdW51c2VkLgorICAgICAgICBidWZbYnVmX3BvcysrXSA9IChiLT5jb2wpOworICAgICAgICBidWZbYnVmX3BvcysrXSA9IChiLT5yb3cpOworICAgIH0KKworICAgIG1lbWNweShidWYgKyBidWZfcG9zLCBiLT5kYXRhLCBiLT5kYXRhX3NpemUpOworCisgICAgYnVmX3BvcyArPSBiLT5kYXRhX3NpemU7CisKKyAgICByZXR1cm4gYnVmX3BvczsKK30KKworc3RhdGljIGludCBlbmNvZGVfemxpYihCbG9jayAqIGIsIHVpbnQ4X3QgKiBidWYsIHVuc2lnbmVkIGxvbmcgKmJ1Zl9zaXplLCBpbnQgY29tcCkKK3sKKyAgICBpbnQgcmVzID0gY29tcHJlc3MyKGJ1ZiwgYnVmX3NpemUsIGItPnNsX2JlZ2luLCBiLT5zbF9lbmQgLSBiLT5zbF9iZWdpbiwgY29tcCk7CisgICAgcmV0dXJuIHJlcyA9PSBaX09LID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IGVuY29kZV96bGlicHJpbWUoQmxvY2sgKiBiLCBCbG9jayAqIHByaW1lLCB1aW50OF90ICogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnVmX3NpemUsIGludCBjb21wKQoreworICAgIHpfc3RyZWFtIHM7CisgICAgaW50IHJlczsKKyAgICBzLnphbGxvYyA9IE5VTEw7CisgICAgcy56ZnJlZSAgPSBOVUxMOworICAgIHMub3BhcXVlID0gTlVMTDsKKyAgICByZXMgPSBkZWZsYXRlSW5pdCgmcywgY29tcCk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHMubmV4dF9pbiAgPSBwcmltZS0+ZW5jOworICAgIHMuYXZhaWxfaW4gPSBwcmltZS0+ZW5jX3NpemU7CisgICAgd2hpbGUgKHMuYXZhaWxfaW4gPiAwKSB7CisgICAgICAgIHMubmV4dF9vdXQgID0gYnVmOworICAgICAgICBzLmF2YWlsX291dCA9ICpidWZfc2l6ZTsKKyAgICAgICAgcmVzID0gZGVmbGF0ZSgmcywgWl9TWU5DX0ZMVVNIKTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcy5uZXh0X2luICAgPSBiLT5zbF9iZWdpbjsKKyAgICBzLmF2YWlsX2luICA9IGItPnNsX2VuZCAtIGItPnNsX2JlZ2luOworICAgIHMubmV4dF9vdXQgID0gYnVmOworICAgIHMuYXZhaWxfb3V0ID0gKmJ1Zl9zaXplOworICAgIHJlcyA9IGRlZmxhdGUoJnMsIFpfRklOSVNIKTsKKyAgICBkZWZsYXRlRW5kKCZzKTsKKyAgICAqYnVmX3NpemUgLT0gcy5hdmFpbF9vdXQ7CisgICAgaWYgKHJlcyAhPSBaX1NUUkVBTV9FTkQpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfYmdyKEJsb2NrICogYiwgY29uc3QgdWludDhfdCAqIHNyYywgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90ICpwdHIgPSBiLT5lbmM7CisgICAgZm9yIChpID0gMDsgaSA8IGItPnN0YXJ0OyBpKyspCisgICAgICAgIG1lbWNweShwdHIgKyBpICogYi0+d2lkdGggKiAzLCBzcmMgKyBpICogc3RyaWRlLCBiLT53aWR0aCAqIDMpOworICAgIGItPnNsX2JlZ2luID0gcHRyICsgaSAqIGItPndpZHRoICogMzsKKyAgICBmb3IgKDsgaSA8IGItPnN0YXJ0ICsgYi0+bGVuOyBpKyspCisgICAgICAgIG1lbWNweShwdHIgKyBpICogYi0+d2lkdGggKiAzLCBzcmMgKyBpICogc3RyaWRlLCBiLT53aWR0aCAqIDMpOworICAgIGItPnNsX2VuZCA9IHB0ciArIGkgKiBiLT53aWR0aCAqIDM7CisgICAgZm9yICg7IGkgPCBiLT5oZWlnaHQ7IGkrKykKKyAgICAgICAgbWVtY3B5KHB0ciArIGkgKiBiLT53aWR0aCAqIDMsIHNyYyArIGkgKiBzdHJpZGUsIGItPndpZHRoICogMyk7CisgICAgYi0+ZW5jX3NpemUgPSBwdHIgKyBpICogYi0+d2lkdGggKiAzIC0gYi0+ZW5jOworICAgIHJldHVybiBiLT5lbmNfc2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBwaXhlbF9jb2xvcjE1KGNvbnN0IHVpbnQ4X3QgKiBzcmMpCit7CisgICAgcmV0dXJuIChzcmNbMF0gPj4gMykgfCAoKHNyY1sxXSAmIDB4ZjgpIDw8IDIpIHwgKChzcmNbMl0gJiAweGY4KSA8PCA3KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2hyb21hX2RpZmYodW5zaWduZWQgaW50IGMxLCB1bnNpZ25lZCBpbnQgYzIpCit7CisgICAgdW5zaWduZWQgaW50IHQxID0gKGMxICYgMHgwMDAwMDBmZikgKyAoKGMxICYgMHgwMDAwZmYwMCkgPj4gOCkgKyAoKGMxICYgMHgwMGZmMDAwMCkgPj4gMTYpOworICAgIHVuc2lnbmVkIGludCB0MiA9IChjMiAmIDB4MDAwMDAwZmYpICsgKChjMiAmIDB4MDAwMGZmMDApID4+IDgpICsgKChjMiAmIDB4MDBmZjAwMDApID4+IDE2KTsKKworICAgIHJldHVybiBhYnModDEgLSB0MikgKyBhYnMoKGMxICYgMHgwMDAwMDBmZikgLSAoYzIgJiAweDAwMDAwMGZmKSkgKworICAgICAgICBhYnMoKChjMSAmIDB4MDAwMGZmMDApID4+IDgpIC0gKChjMiAmIDB4MDAwMGZmMDApID4+IDgpKSArCisgICAgICAgIGFicygoKGMxICYgMHgwMGZmMDAwMCkgPj4gMTYpIC0gKChjMiAmIDB4MDBmZjAwMDApID4+IDE2KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBpeGVsX2NvbG9yN19mYXN0KFBhbGV0dGUgKiBwYWxldHRlLCB1bnNpZ25lZCBjMTUpCit7CisgICAgcmV0dXJuIHBhbGV0dGUtPmluZGV4W2MxNV07Cit9CisKK3N0YXRpYyBpbnQgcGl4ZWxfY29sb3I3X3Nsb3coUGFsZXR0ZSAqIHBhbGV0dGUsIHVuc2lnbmVkIGNvbG9yKQoreworICAgIGludCBpLCBtaW4gPSAweDdmZmZmZmZmOworICAgIGludCBtaW5jID0gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgIGludCBjMSA9IHBhbGV0dGUtPmNvbG9yc1tpXTsKKyAgICAgICAgaW50IGRpZmYgPSBjaHJvbWFfZGlmZihjMSwgY29sb3IpOworICAgICAgICBpZiAoZGlmZiA8IG1pbikgeworICAgICAgICAgICAgbWluID0gZGlmZjsKKyAgICAgICAgICAgIG1pbmMgPSBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtaW5jOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHBpeGVsX2Jncihjb25zdCB1aW50OF90ICogc3JjKQoreworICAgIHJldHVybiAoc3JjWzBdKSB8IChzcmNbMV0gPDwgOCkgfCAoc3JjWzJdIDw8IDE2KTsKK30KKworc3RhdGljIGludCB3cml0ZV9waXhlbF8xNV83KFBhbGV0dGUgKiBwYWxldHRlLCB1aW50OF90ICogZGVzdCwgY29uc3QgdWludDhfdCAqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdCkKK3sKKyAgICB1bnNpZ25lZCBjMTUgPSBwaXhlbF9jb2xvcjE1KHNyYyk7CisgICAgdW5zaWduZWQgY29sb3IgPSBwaXhlbF9iZ3Ioc3JjKTsKKyAgICBpbnQgZDE1ID0gY2hyb21hX2RpZmYoY29sb3IsIGNvbG9yICYgMHgwMGY4ZjhmOCk7CisgICAgaW50IGM3ID0gcGl4ZWxfY29sb3I3X2Zhc3QocGFsZXR0ZSwgYzE1KTsKKyAgICBpbnQgZDcgPSBjaHJvbWFfZGlmZihjb2xvciwgcGFsZXR0ZS0+Y29sb3JzW2M3XSk7CisgICAgaWYgKGRpc3QgKyBkMTUgPj0gZDcpIHsKKyAgICAgICAgZGVzdFswXSA9IGM3OworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXN0WzBdID0gMHg4MCB8IChjMTUgPj4gOCk7CisgICAgICAgIGRlc3RbMV0gPSBjMTUgJiAweGZmOworICAgICAgICByZXR1cm4gMjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3BhbGV0dGVfaW5kZXgoUGFsZXR0ZSAqIHBhbGV0dGUpCit7CisgICAgaW50IHIsIGcsIGI7CisgICAgdW5zaWduZWQgaW50IGJnciwgYzE1LCBpbmRleDsKKyAgICBmb3IgKHIgPSA0OyByIDwgMjU2OyByICs9IDgpIHsKKyAgICAgICAgZm9yIChnID0gNDsgZyA8IDI1NjsgZyArPSA4KSB7CisgICAgICAgICAgICBmb3IgKGIgPSA0OyBiIDwgMjU2OyBiICs9IDgpIHsKKyAgICAgICAgICAgICAgICBiZ3IgPSBiIHwgKGcgPDwgOCkgfCAociA8PCAxNik7CisgICAgICAgICAgICAgICAgYzE1ID0gKGIgPj4gMykgfCAoKGcgJiAweGY4KSA8PCAyKSB8ICgociAmIDB4ZjgpIDw8IDcpOworICAgICAgICAgICAgICAgIGluZGV4ID0gcGl4ZWxfY29sb3I3X3Nsb3cocGFsZXR0ZSwgYmdyKTsKKworICAgICAgICAgICAgICAgIHBhbGV0dGUtPmluZGV4W2MxNV0gPSBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkZWZhdWx0X3NjcmVlbl92aWRlb192Ml9wYWxldHRlWzEyOF0gPSB7CisgICAgMHgwMDAwMDAwMCwgMHgwMDMzMzMzMywgMHgwMDY2NjY2NiwgMHgwMDk5OTk5OSwgMHgwMENDQ0NDQywgMHgwMEZGRkZGRiwKKyAgICAweDAwMzMwMDAwLCAweDAwNjYwMDAwLCAweDAwOTkwMDAwLCAweDAwQ0MwMDAwLCAweDAwRkYwMDAwLCAweDAwMDAzMzAwLAorICAgIDB4MDAwMDY2MDAsIDB4MDAwMDk5MDAsIDB4MDAwMENDMDAsIDB4MDAwMEZGMDAsIDB4MDAwMDAwMzMsIDB4MDAwMDAwNjYsCisgICAgMHgwMDAwMDA5OSwgMHgwMDAwMDBDQywgMHgwMDAwMDBGRiwgMHgwMDMzMzMwMCwgMHgwMDY2NjYwMCwgMHgwMDk5OTkwMCwKKyAgICAweDAwQ0NDQzAwLCAweDAwRkZGRjAwLCAweDAwMDAzMzMzLCAweDAwMDA2NjY2LCAweDAwMDA5OTk5LCAweDAwMDBDQ0NDLAorICAgIDB4MDAwMEZGRkYsIDB4MDAzMzAwMzMsIDB4MDA2NjAwNjYsIDB4MDA5OTAwOTksIDB4MDBDQzAwQ0MsIDB4MDBGRjAwRkYsCisgICAgMHgwMEZGRkYzMywgMHgwMEZGRkY2NiwgMHgwMEZGRkY5OSwgMHgwMEZGRkZDQywgMHgwMEZGMzNGRiwgMHgwMEZGNjZGRiwKKyAgICAweDAwRkY5OUZGLCAweDAwRkZDQ0ZGLCAweDAwMzNGRkZGLCAweDAwNjZGRkZGLCAweDAwOTlGRkZGLCAweDAwQ0NGRkZGLAorICAgIDB4MDBDQ0NDMzMsIDB4MDBDQ0NDNjYsIDB4MDBDQ0NDOTksIDB4MDBDQ0NDRkYsIDB4MDBDQzMzQ0MsIDB4MDBDQzY2Q0MsCisgICAgMHgwMENDOTlDQywgMHgwMENDRkZDQywgMHgwMDMzQ0NDQywgMHgwMDY2Q0NDQywgMHgwMDk5Q0NDQywgMHgwMEZGQ0NDQywKKyAgICAweDAwOTk5OTMzLCAweDAwOTk5OTY2LCAweDAwOTk5OUNDLCAweDAwOTk5OUZGLCAweDAwOTkzMzk5LCAweDAwOTk2Njk5LAorICAgIDB4MDA5OUNDOTksIDB4MDA5OUZGOTksIDB4MDAzMzk5OTksIDB4MDA2Njk5OTksIDB4MDBDQzk5OTksIDB4MDBGRjk5OTksCisgICAgMHgwMDY2NjYzMywgMHgwMDY2NjY5OSwgMHgwMDY2NjZDQywgMHgwMDY2NjZGRiwgMHgwMDY2MzM2NiwgMHgwMDY2OTk2NiwKKyAgICAweDAwNjZDQzY2LCAweDAwNjZGRjY2LCAweDAwMzM2NjY2LCAweDAwOTk2NjY2LCAweDAwQ0M2NjY2LCAweDAwRkY2NjY2LAorICAgIDB4MDAzMzMzNjYsIDB4MDAzMzMzOTksIDB4MDAzMzMzQ0MsIDB4MDAzMzMzRkYsIDB4MDAzMzY2MzMsIDB4MDAzMzk5MzMsCisgICAgMHgwMDMzQ0MzMywgMHgwMDMzRkYzMywgMHgwMDY2MzMzMywgMHgwMDk5MzMzMywgMHgwMENDMzMzMywgMHgwMEZGMzMzMywKKyAgICAweDAwMDAzMzY2LCAweDAwMzM2NjAwLCAweDAwNjYwMDMzLCAweDAwMDA2NjMzLCAweDAwMzMwMDY2LCAweDAwNjYzMzAwLAorICAgIDB4MDAzMzY2OTksIDB4MDA2Njk5MzMsIDB4MDA5OTMzNjYsIDB4MDAzMzk5NjYsIDB4MDA2NjMzOTksIDB4MDA5OTY2MzMsCisgICAgMHgwMDY2OTlDQywgMHgwMDk5Q0M2NiwgMHgwMENDNjY5OSwgMHgwMDY2Q0M5OSwgMHgwMDk5NjZDQywgMHgwMENDOTk2NiwKKyAgICAweDAwOTlDQ0ZGLCAweDAwQ0NGRjk5LCAweDAwRkY5OUNDLCAweDAwOTlGRkNDLCAweDAwQ0M5OUZGLCAweDAwRkZDQzk5LAorICAgIDB4MDAxMTExMTEsIDB4MDAyMjIyMjIsIDB4MDA0NDQ0NDQsIDB4MDA1NTU1NTUsIDB4MDBBQUFBQUEsIDB4MDBCQkJCQkIsCisgICAgMHgwMERERERERCwgMHgwMEVFRUVFRQorfTsKKworc3RhdGljIGludCBnZW5lcmF0ZV9kZWZhdWx0X3BhbGV0dGUoUGFsZXR0ZSAqIHBhbGV0dGUpCit7CisgICAgbWVtY3B5KHBhbGV0dGUtPmNvbG9ycywgZGVmYXVsdF9zY3JlZW5fdmlkZW9fdjJfcGFsZXR0ZSwKKyAgICAgICAgICAgc2l6ZW9mKGRlZmF1bHRfc2NyZWVuX3ZpZGVvX3YyX3BhbGV0dGUpKTsKKworICAgIHJldHVybiB1cGRhdGVfcGFsZXR0ZV9pbmRleChwYWxldHRlKTsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9vcHRpbXVtX3BhbGV0dGUoUGFsZXR0ZSAqIHBhbGV0dGUsIGNvbnN0IHVpbnQ4X3QgKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKQoreworICAgIC8vdGhpcyBpc24ndCBpbXBsZW1lbnRlZCB5ZXQhICBEZWZhdWx0IHBhbGV0dGUgb25seSEKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVuY29kZV8xNV83X3NsKFBhbGV0dGUgKiBwYWxldHRlLCB1aW50OF90ICogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBzcmMsIGludCB3aWR0aCwgaW50IGRpc3QpCit7CisgICAgaW50IGxlbiA9IDAsIHg7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgbGVuICs9IHdyaXRlX3BpeGVsXzE1XzcocGFsZXR0ZSwgZGVzdCArIGxlbiwgc3JjICsgMyAqIHgsIGRpc3QpOworICAgIH0KKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGVuY29kZV8xNV83KFBhbGV0dGUgKiBwYWxldHRlLCBCbG9jayAqIGIsIGNvbnN0IHVpbnQ4X3QgKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBkaXN0KQoreworICAgIGludCBpOworICAgIHVpbnQ4X3QgKnB0ciA9IGItPmVuYzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYi0+c3RhcnQ7IGkrKykKKyAgICAgICAgcHRyICs9IGVuY29kZV8xNV83X3NsKHBhbGV0dGUsIHB0ciwgc3JjICsgaSAqIHN0cmlkZSwgYi0+d2lkdGgsIGRpc3QpOworICAgIGItPnNsX2JlZ2luID0gcHRyOworICAgIGZvciAoOyBpIDwgYi0+c3RhcnQgKyBiLT5sZW47IGkrKykKKyAgICAgICAgcHRyICs9IGVuY29kZV8xNV83X3NsKHBhbGV0dGUsIHB0ciwgc3JjICsgaSAqIHN0cmlkZSwgYi0+d2lkdGgsIGRpc3QpOworICAgIGItPnNsX2VuZCA9IHB0cjsKKyAgICBmb3IgKDsgaSA8IGItPmhlaWdodDsgaSsrKQorICAgICAgICBwdHIgKz0gZW5jb2RlXzE1Xzdfc2wocGFsZXR0ZSwgcHRyLCBzcmMgKyBpICogc3RyaWRlLCBiLT53aWR0aCwgZGlzdCk7CisgICAgYi0+ZW5jX3NpemUgPSBwdHIgLSBiLT5lbmM7CisgICAgcmV0dXJuIGItPmVuY19zaXplOworfQorCitzdGF0aWMgaW50IGVuY29kZV9ibG9jayhGbGFzaFNWMkNvbnRleHQgKnMsIFBhbGV0dGUgKiBwYWxldHRlLCBCbG9jayAqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICBCbG9jayAqIHByZXYsIGNvbnN0IHVpbnQ4X3QgKiBzcmMsIGludCBzdHJpZGUsIGludCBjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3QsIGludCBrZXlmcmFtZSkKK3sKKyAgICB1bnNpZ25lZCBidWZfc2l6ZSA9IGItPndpZHRoICogYi0+aGVpZ2h0ICogNjsKKyAgICB1aW50OF90ICpidWYgPSBzLT5ibG9ja2J1ZmZlcjsKKyAgICBpbnQgcmVzOworCisgICAgaWYgKGItPmZsYWdzICYgQ09MT1JTUEFDRV8xNV83KSB7CisgICAgICAgIGVuY29kZV8xNV83KHBhbGV0dGUsIGIsIHNyYywgc3RyaWRlLCBkaXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbmNvZGVfYmdyKGIsIHNyYywgc3RyaWRlKTsKKyAgICB9CisKKyAgICBpZiAoYi0+bGVuID4gMCkgeworICAgICAgICBiLT5kYXRhX3NpemUgPSBidWZfc2l6ZTsKKyAgICAgICAgcmVzID0gZW5jb2RlX3psaWIoYiwgYi0+ZGF0YSwgJmItPmRhdGFfc2l6ZSwgY29tcCk7CisgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICByZXR1cm4gcmVzOworCisgICAgICAgIGlmICgha2V5ZnJhbWUpIHsKKyAgICAgICAgICAgIHJlcyA9IGVuY29kZV96bGlicHJpbWUoYiwgcHJldiwgYnVmLCAmYnVmX3NpemUsIGNvbXApOworICAgICAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworCisgICAgICAgICAgICBpZiAoYnVmX3NpemUgPCBiLT5kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBiLT5kYXRhX3NpemUgPSBidWZfc2l6ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYi0+ZGF0YSwgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgYi0+ZmxhZ3MgfD0gWkxJQl9QUklNRV9DT01QUkVTU19QUkVWSU9VUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGItPmRhdGFfc2l6ZSA9IDA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfc2woRmxhc2hTVjJDb250ZXh0ICogcywgQmxvY2sgKiBiLCBjb25zdCB1aW50OF90ICogc3JjLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKiBmcmFtZSwgdWludDhfdCAqIGtleSwgaW50IHksIGludCBrZXlmcmFtZSkKK3sKKyAgICBpZiAobWVtY21wKHNyYywgZnJhbWUsIGItPndpZHRoICogMykgIT0gMCkgeworICAgICAgICBiLT5kaXJ0eSA9IDE7CisgICAgICAgIG1lbWNweShmcmFtZSwgc3JjLCBiLT53aWR0aCAqIDMpOworI2lmbmRlZiBGTEFTSFNWMl9EVU1CCisgICAgICAgIHMtPmRpZmZfbGluZXMrKzsKKyNlbmRpZgorICAgIH0KKyAgICBpZiAobWVtY21wKHNyYywga2V5LCBiLT53aWR0aCAqIDMpICE9IDApIHsKKyAgICAgICAgaWYgKGItPmxlbiA9PSAwKQorICAgICAgICAgICAgYi0+c3RhcnQgPSB5OworICAgICAgICBiLT5sZW4gPSB5ICsgMSAtIGItPnN0YXJ0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXJrX2FsbF9ibG9ja3MoRmxhc2hTVjJDb250ZXh0ICogcywgY29uc3QgdWludDhfdCAqIHNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlmcmFtZSkKK3sKKyAgICBpbnQgc2wsIHJzbCwgY29sLCBwb3MsIHBvc3NsOworICAgIEJsb2NrICpiOworICAgIGZvciAoc2wgPSBzLT5pbWFnZV9oZWlnaHQgLSAxOyBzbCA+PSAwOyBzbC0tKSB7CisgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgcy0+Y29sczsgY29sKyspIHsKKyAgICAgICAgICAgIHJzbCA9IHMtPmltYWdlX2hlaWdodCAtIHNsIC0gMTsKKyAgICAgICAgICAgIGIgPSBzLT5mcmFtZV9ibG9ja3MgKyBjb2wgKyByc2wgLyBzLT5ibG9ja19oZWlnaHQgKiBzLT5jb2xzOworICAgICAgICAgICAgcG9zc2wgPSBzdHJpZGUgKiBzbCArIGNvbCAqIHMtPmJsb2NrX3dpZHRoICogMzsKKyAgICAgICAgICAgIHBvcyA9IHMtPmltYWdlX3dpZHRoICogcnNsICogMyArIGNvbCAqIHMtPmJsb2NrX3dpZHRoICogMzsKKyAgICAgICAgICAgIGNvbXBhcmVfc2wocywgYiwgc3JjICsgcG9zc2wsIHMtPmN1cnJlbnRfZnJhbWUgKyBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmtleV9mcmFtZSArIHBvcywgcnNsICUgcy0+YmxvY2tfaGVpZ2h0LCBrZXlmcmFtZSk7CisgICAgICAgIH0KKyAgICB9CisjaWZuZGVmIEZMQVNIU1YyX0RVTUIKKyAgICBzLT50b3RfbGluZXMgKz0gcy0+aW1hZ2VfaGVpZ2h0ICogcy0+Y29sczsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9hbGxfYmxvY2tzKEZsYXNoU1YyQ29udGV4dCAqIHMsIGludCBrZXlmcmFtZSkKK3sKKyAgICBpbnQgcm93LCBjb2wsIHJlczsKKyAgICB1aW50OF90ICpkYXRhOworICAgIEJsb2NrICpiLCAqcHJldjsKKyAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IHMtPnJvd3M7IHJvdysrKSB7CisgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgcy0+Y29sczsgY29sKyspIHsKKyAgICAgICAgICAgIGIgPSBzLT5mcmFtZV9ibG9ja3MgKyAocm93ICogcy0+Y29scyArIGNvbCk7CisgICAgICAgICAgICBwcmV2ID0gcy0+a2V5X2Jsb2NrcyArIChyb3cgKiBzLT5jb2xzICsgY29sKTsKKyAgICAgICAgICAgIGItPmZsYWdzID0gcy0+dXNlMTVfNyA/IENPTE9SU1BBQ0VfMTVfNyA6IDA7CisgICAgICAgICAgICBpZiAoa2V5ZnJhbWUpIHsKKyAgICAgICAgICAgICAgICBiLT5zdGFydCA9IDA7CisgICAgICAgICAgICAgICAgYi0+bGVuID0gYi0+aGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIGlmICghYi0+ZGlydHkpIHsKKyAgICAgICAgICAgICAgICBiLT5zdGFydCA9IDA7CisgICAgICAgICAgICAgICAgYi0+bGVuID0gMDsKKyAgICAgICAgICAgICAgICBiLT5kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChiLT5zdGFydCAhPSAwIHx8IGItPmxlbiAhPSBiLT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBiLT5mbGFncyB8PSBIQVNfRElGRl9CTE9DS1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhID0gcy0+Y3VycmVudF9mcmFtZSArIHMtPmltYWdlX3dpZHRoICogMyAqIHMtPmJsb2NrX2hlaWdodCAqIHJvdyArIHMtPmJsb2NrX3dpZHRoICogY29sICogMzsKKyAgICAgICAgICAgIHJlcyA9IGVuY29kZV9ibG9jayhzLCAmcy0+cGFsZXR0ZSwgYiwgcHJldiwgZGF0YSwgcy0+aW1hZ2Vfd2lkdGggKiAzLCBzLT5jb21wLCBzLT5kaXN0LCBrZXlmcmFtZSk7CisjaWZuZGVmIEZMQVNIU1YyX0RVTUIKKyAgICAgICAgICAgIGlmIChiLT5kaXJ0eSkKKyAgICAgICAgICAgICAgICBzLT5kaWZmX2Jsb2NrcysrOworICAgICAgICAgICAgcy0+Y29tcF9zaXplICs9IGItPmRhdGFfc2l6ZTsKKyAgICAgICAgICAgIHMtPnVuY29tcF9zaXplICs9IGItPmVuY19zaXplOworI2VuZGlmCisgICAgICAgICAgICBpZiAocmVzKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisjaWZuZGVmIEZMQVNIU1YyX0RVTUIKKyAgICBzLT5yYXdfc2l6ZSArPSBzLT5pbWFnZV93aWR0aCAqIHMtPmltYWdlX2hlaWdodCAqIDM7CisgICAgcy0+dG90X2Jsb2NrcyArPSBzLT5yb3dzICogcy0+Y29sczsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2FsbF9ibG9ja3MoRmxhc2hTVjJDb250ZXh0ICogcywgdWludDhfdCAqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUpCit7CisgICAgaW50IHJvdywgY29sLCBidWZfcG9zID0gMCwgbGVuOworICAgIEJsb2NrICpiOworICAgIGZvciAocm93ID0gMDsgcm93IDwgcy0+cm93czsgcm93KyspIHsKKyAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBzLT5jb2xzOyBjb2wrKykgeworICAgICAgICAgICAgYiA9IHMtPmZyYW1lX2Jsb2NrcyArIHJvdyAqIHMtPmNvbHMgKyBjb2w7CisgICAgICAgICAgICBsZW4gPSB3cml0ZV9ibG9jayhiLCBidWYgKyBidWZfcG9zLCBidWZfc2l6ZSAtIGJ1Zl9wb3MpOworICAgICAgICAgICAgYi0+c3RhcnQgPSBiLT5sZW4gPSBiLT5kaXJ0eSA9IDA7CisgICAgICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICAgICAgYnVmX3BvcyArPSBsZW47CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1Zl9wb3M7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfYml0c3RyZWFtKEZsYXNoU1YyQ29udGV4dCAqIHMsIGNvbnN0IHVpbnQ4X3QgKiBzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICogYnVmLCBpbnQgYnVmX3NpemUsIGludCBrZXlmcmFtZSkKK3sKKyAgICBpbnQgYnVmX3BvcywgcmVzOworCisgICAgcmVzID0gbWFya19hbGxfYmxvY2tzKHMsIHNyYywgc3RyaWRlLCBrZXlmcmFtZSk7CisgICAgaWYgKHJlcykKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICByZXMgPSBlbmNvZGVfYWxsX2Jsb2NrcyhzLCBrZXlmcmFtZSk7CisgICAgaWYgKHJlcykKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIHJlcyA9IHdyaXRlX2hlYWRlcihzLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1Zl9wb3MgPSByZXM7CisgICAgfQorICAgIHJlcyA9IHdyaXRlX2FsbF9ibG9ja3MocywgYnVmICsgYnVmX3BvcywgYnVmX3NpemUgLSBidWZfcG9zKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBidWZfcG9zICs9IHJlczsKKyNpZm5kZWYgRkxBU0hTVjJfRFVNQgorICAgIHMtPnRvdGFsX2JpdHMgKz0gKChkb3VibGUpIGJ1Zl9wb3MpICogOC4wOworI2VuZGlmCisKKyAgICByZXR1cm4gYnVmX3BvczsKK30KKworc3RhdGljIHZvaWQgcmVjb21tZW5kX2tleWZyYW1lKEZsYXNoU1YyQ29udGV4dCAqIHMsIGludCAqa2V5ZnJhbWUpCit7CisjaWZuZGVmIEZMQVNIU1YyX0RVTUIKKyAgICBkb3VibGUgYmxvY2tfcmF0aW8sIGxpbmVfcmF0aW8sIGVuY19yYXRpbywgY29tcF9yYXRpbywgZGF0YV9yYXRpbzsKKyAgICBpZiAocy0+YXZjdHgtPmdvcF9zaXplID4gMCkgeworICAgICAgICBibG9ja19yYXRpbyA9IHMtPmRpZmZfYmxvY2tzIC8gcy0+dG90X2Jsb2NrczsKKyAgICAgICAgbGluZV9yYXRpbyA9IHMtPmRpZmZfbGluZXMgLyBzLT50b3RfbGluZXM7CisgICAgICAgIGVuY19yYXRpbyA9IHMtPnVuY29tcF9zaXplIC8gcy0+cmF3X3NpemU7CisgICAgICAgIGNvbXBfcmF0aW8gPSBzLT5jb21wX3NpemUgLyBzLT51bmNvbXBfc2l6ZTsKKyAgICAgICAgZGF0YV9yYXRpbyA9IHMtPmNvbXBfc2l6ZSAvIHMtPnJhd19zaXplOworCisgICAgICAgIGlmICgoYmxvY2tfcmF0aW8gPj0gMC41ICYmIGxpbmVfcmF0aW8gLyBibG9ja19yYXRpbyA8PSAwLjUpIHx8IGxpbmVfcmF0aW8gPj0gMC45NSkgeworICAgICAgICAgICAgKmtleWZyYW1lID0gMTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgcmV0dXJuOworI2VuZGlmCit9CisKKyNpZm5kZWYgRkxBU0hTVjJfRFVNQgorc3RhdGljIGNvbnN0IGRvdWJsZSBibG9ja19zaXplX2ZyYWN0aW9uID0gMS4wIC8gMzAwOworc3RhdGljIGNvbnN0IGRvdWJsZSB1c2UxNV83X3RocmVzaG9sZCA9IDgxOTI7CitzdGF0aWMgY29uc3QgZG91YmxlIGNvbG9yMTVfN19mYWN0b3IgPSAxMDA7CisjZW5kaWYKK3N0YXRpYyBpbnQgb3B0aW11bV9ibG9ja193aWR0aChGbGFzaFNWMkNvbnRleHQgKiBzKQoreworI2lmbmRlZiBGTEFTSFNWMl9EVU1CCisgICAgZG91YmxlIHNhdmUgPSAoMS1wb3cocy0+ZGlmZl9saW5lcy9zLT5kaWZmX2Jsb2Nrcy9zLT5ibG9ja19oZWlnaHQsIDAuNSkpICogcy0+Y29tcF9zaXplL3MtPnRvdF9ibG9ja3M7CisgICAgZG91YmxlIHdpZHRoID0gYmxvY2tfc2l6ZV9mcmFjdGlvbiAqIHNxcnQoMC41ICogc2F2ZSAqIHMtPnJvd3MgKiBzLT5jb2xzKSAqIHMtPmltYWdlX3dpZHRoOworICAgIGludCBwd2lkdGggPSAoKGludCkgd2lkdGgpOworICAgIHJldHVybiBGRkNMSVAocHdpZHRoICYgfjE1LCAyNTYsIDE2KTsKKyNlbHNlCisgICAgcmV0dXJuIDY0OworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgb3B0aW11bV9ibG9ja19oZWlnaHQoRmxhc2hTVjJDb250ZXh0ICogcykKK3sKKyNpZm5kZWYgRkxBU0hTVjJfRFVNQgorICAgIGRvdWJsZSBzYXZlID0gKDEtcG93KHMtPmRpZmZfbGluZXMvcy0+ZGlmZl9ibG9ja3Mvcy0+YmxvY2tfaGVpZ2h0LCAwLjUpKSAqIHMtPmNvbXBfc2l6ZS9zLT50b3RfYmxvY2tzOworICAgIGRvdWJsZSBoZWlnaHQgPSBibG9ja19zaXplX2ZyYWN0aW9uICogc3FydCgwLjUgKiBzYXZlICogcy0+cm93cyAqIHMtPmNvbHMpICogcy0+aW1hZ2VfaGVpZ2h0OworICAgIGludCBwaGVpZ2h0ID0gKChpbnQpIGhlaWdodCk7CisgICAgcmV0dXJuIEZGQ0xJUChwaGVpZ2h0ICYgfjE1LCAyNTYsIDE2KTsKKyNlbHNlCisgICAgcmV0dXJuIDY0OworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgb3B0aW11bV91c2UxNV83KEZsYXNoU1YyQ29udGV4dCAqIHMpCit7CisjaWZuZGVmIEZMQVNIU1YyX0RVTUIKKyAgICBkb3VibGUgaWRlYWwgPSAoKGRvdWJsZSkocy0+YXZjdHgtPmJpdF9yYXRlICogcy0+YXZjdHgtPnRpbWVfYmFzZS5kZW4gKiBzLT5hdmN0eC0+dGlja3NfcGVyX2ZyYW1lKSkgLworICAgICAgICAoKGRvdWJsZSkgcy0+YXZjdHgtPnRpbWVfYmFzZS5udW0pICogcy0+YXZjdHgtPmZyYW1lX251bWJlcjsKKyAgICBpZiAoaWRlYWwgKyB1c2UxNV83X3RocmVzaG9sZCA8IHMtPnRvdGFsX2JpdHMpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorI2Vsc2UKKyAgICByZXR1cm4gcy0+YXZjdHgtPmdsb2JhbF9xdWFsaXR5ID09IDA7CisjZW5kaWYKK30KKworc3RhdGljIGludCBvcHRpbXVtX2Rpc3QoRmxhc2hTVjJDb250ZXh0ICogcykKK3sKKyNpZm5kZWYgRkxBU0hTVjJfRFVNQgorICAgIGRvdWJsZSBpZGVhbCA9CisgICAgICAgIHMtPmF2Y3R4LT5iaXRfcmF0ZSAqIHMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuICoKKyAgICAgICAgcy0+YXZjdHgtPnRpY2tzX3Blcl9mcmFtZTsKKyAgICBpbnQgZGlzdCA9IHBvdygocy0+dG90YWxfYml0cyAvIGlkZWFsKSAqIGNvbG9yMTVfN19mYWN0b3IsIDMpOworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiZGlzdDogJWRcbiIsIGRpc3QpOworICAgIHJldHVybiBkaXN0OworI2Vsc2UKKyAgICByZXR1cm4gMTU7CisjZW5kaWYKK30KKworCitzdGF0aWMgaW50IHJlY29uZmlndXJlX2F0X2tleWZyYW1lKEZsYXNoU1YyQ29udGV4dCAqIHMsIGNvbnN0IHVpbnQ4X3QgKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgdXBkYXRlX3BhbGV0dGUgPSAwOworICAgIGludCByZXM7CisgICAgaW50IGJsb2NrX3dpZHRoICA9IG9wdGltdW1fYmxvY2tfd2lkdGggKHMpOworICAgIGludCBibG9ja19oZWlnaHQgPSBvcHRpbXVtX2Jsb2NrX2hlaWdodChzKTsKKworICAgIHMtPnJvd3MgPSAocy0+aW1hZ2VfaGVpZ2h0ICsgYmxvY2tfaGVpZ2h0IC0gMSkgLyBibG9ja19oZWlnaHQ7CisgICAgcy0+Y29scyA9IChzLT5pbWFnZV93aWR0aCAgKyBibG9ja193aWR0aCAgLSAxKSAvIGJsb2NrX3dpZHRoOworCisgICAgaWYgKGJsb2NrX3dpZHRoICE9IHMtPmJsb2NrX3dpZHRoIHx8IGJsb2NrX2hlaWdodCAhPSBzLT5ibG9ja19oZWlnaHQpIHsKKyAgICAgICAgcy0+YmxvY2tfd2lkdGggID0gYmxvY2tfd2lkdGg7CisgICAgICAgIHMtPmJsb2NrX2hlaWdodCA9IGJsb2NrX2hlaWdodDsKKyAgICAgICAgaWYgKHMtPnJvd3MgKiBzLT5jb2xzID4gcy0+YmxvY2tzX3NpemUgLyBzaXplb2YoQmxvY2spKSB7CisgICAgICAgICAgICBzLT5mcmFtZV9ibG9ja3MgPSBhdl9yZWFsbG9jKHMtPmZyYW1lX2Jsb2Nrcywgcy0+cm93cyAqIHMtPmNvbHMgKiBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgICAgIHMtPmtleV9ibG9ja3MgPSBhdl9yZWFsbG9jKHMtPmtleV9ibG9ja3MsIHMtPmNvbHMgKiBzLT5yb3dzICogc2l6ZW9mKEJsb2NrKSk7CisgICAgICAgICAgICBpZiAoIXMtPmZyYW1lX2Jsb2NrcyB8fCAhcy0+a2V5X2Jsb2NrcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+YmxvY2tzX3NpemUgPSBzLT5yb3dzICogcy0+Y29scyAqIHNpemVvZihCbG9jayk7CisgICAgICAgIH0KKyAgICAgICAgaW5pdF9ibG9ja3Mocywgcy0+ZnJhbWVfYmxvY2tzLCBzLT5lbmNidWZmZXIsIHMtPmRhdGFidWZmZXIpOworICAgICAgICBpbml0X2Jsb2NrcyhzLCBzLT5rZXlfYmxvY2tzLCBzLT5rZXlidWZmZXIsIDApOworCisgICAgICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT5ibG9ja2J1ZmZlciwgJnMtPmJsb2NrYnVmZmVyX3NpemUsIGJsb2NrX3dpZHRoICogYmxvY2tfaGVpZ2h0ICogNik7CisgICAgICAgIGlmICghcy0+YmxvY2tidWZmZXIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIGJsb2NrIGJ1ZmZlci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPnVzZTE1XzcgPSBvcHRpbXVtX3VzZTE1Xzcocyk7CisgICAgaWYgKHMtPnVzZTE1XzcpIHsKKyAgICAgICAgaWYgKChzLT51c2VfY3VzdG9tX3BhbGV0dGUgJiYgcy0+cGFsZXR0ZV90eXBlICE9IDEpIHx8IHVwZGF0ZV9wYWxldHRlKSB7CisgICAgICAgICAgICByZXMgPSBnZW5lcmF0ZV9vcHRpbXVtX3BhbGV0dGUoJnMtPnBhbGV0dGUsIGltYWdlLCBzLT5pbWFnZV93aWR0aCwgcy0+aW1hZ2VfaGVpZ2h0LCBzdHJpZGUpOworICAgICAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgcy0+cGFsZXR0ZV90eXBlID0gMTsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiR2VuZXJhdGVkIG9wdGltdW0gcGFsZXR0ZVxuIik7CisgICAgICAgIH0gZWxzZSBpZiAoIXMtPnVzZV9jdXN0b21fcGFsZXR0ZSAmJiBzLT5wYWxldHRlX3R5cGUgIT0gMCkgeworICAgICAgICAgICAgcmVzID0gZ2VuZXJhdGVfZGVmYXVsdF9wYWxldHRlKCZzLT5wYWxldHRlKTsKKyAgICAgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIHMtPnBhbGV0dGVfdHlwZSA9IDA7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkdlbmVyYXRlZCBkZWZhdWx0IHBhbGV0dGVcbiIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICByZXNldF9zdGF0cyhzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsYXNoc3YyX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgRmxhc2hTVjJDb250ZXh0ICpjb25zdCBzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmVzOworICAgIGludCBrZXlmcmFtZSA9IDA7CisKKyAgICBpZiAoKHJlcyA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgcy0+ZnJhbWVfc2l6ZSArIEZGX01JTl9CVUZGRVJfU0laRSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIC8qIEZpcnN0IGZyYW1lIG5lZWRzIHRvIGJlIGEga2V5ZnJhbWUgKi8KKyAgICBpZiAoYXZjdHgtPmZyYW1lX251bWJlciA9PSAwKQorICAgICAgICBrZXlmcmFtZSA9IDE7CisKKyAgICAvKiBDaGVjayB0aGUgcGxhY2VtZW50IG9mIGtleWZyYW1lcyAqLworICAgIGlmIChhdmN0eC0+Z29wX3NpemUgPiAwKSB7CisgICAgICAgIGlmIChhdmN0eC0+ZnJhbWVfbnVtYmVyID49IHMtPmxhc3Rfa2V5X2ZyYW1lICsgYXZjdHgtPmdvcF9zaXplKQorICAgICAgICAgICAga2V5ZnJhbWUgPSAxOworICAgIH0KKworICAgIGlmICgha2V5ZnJhbWUKKyAgICAgICAgJiYgYXZjdHgtPmZyYW1lX251bWJlciA+IHMtPmxhc3Rfa2V5X2ZyYW1lICsgYXZjdHgtPmtleWludF9taW4pIHsKKyAgICAgICAgcmVjb21tZW5kX2tleWZyYW1lKHMsICZrZXlmcmFtZSk7CisgICAgICAgIGlmIChrZXlmcmFtZSkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUmVjb21tZW5kaW5nIGtleSBmcmFtZSBhdCBmcmFtZSAlZFxuIiwgYXZjdHgtPmZyYW1lX251bWJlcik7CisgICAgfQorCisgICAgaWYgKGtleWZyYW1lKSB7CisgICAgICAgIHJlcyA9IHJlY29uZmlndXJlX2F0X2tleWZyYW1lKHMsIHAtPmRhdGFbMF0sIHAtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKHMtPnVzZTE1XzcpCisgICAgICAgIHMtPmRpc3QgPSBvcHRpbXVtX2Rpc3Qocyk7CisKKyAgICByZXMgPSB3cml0ZV9iaXRzdHJlYW0ocywgcC0+ZGF0YVswXSwgcC0+bGluZXNpemVbMF0sIHBrdC0+ZGF0YSwgcGt0LT5zaXplLCBrZXlmcmFtZSk7CisKKyAgICBpZiAoa2V5ZnJhbWUpIHsKKyAgICAgICAgbmV3X2tleV9mcmFtZShzKTsKKyAgICAgICAgcy0+bGFzdF9rZXlfZnJhbWUgPSBhdmN0eC0+ZnJhbWVfbnVtYmVyOworICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJJbnNlcnRpbmcga2V5IGZyYW1lIGF0IGZyYW1lICVkXG4iLCBhdmN0eC0+ZnJhbWVfbnVtYmVyKTsKKyAgICB9CisKKyAgICBwa3QtPnNpemUgPSByZXM7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBmbGFzaHN2Ml9lbmNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICogYXZjdHgpCit7CisgICAgRmxhc2hTVjJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGNsZWFudXAocyk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9mbGFzaHN2Ml9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJmbGFzaHN2MiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZsYXNoIFNjcmVlbiBWaWRlbyBWZXJzaW9uIDIiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRkxBU0hTVjIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZsYXNoU1YyQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmxhc2hzdjJfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZmxhc2hzdjJfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGZsYXNoc3YyX2VuY29kZV9lbmQsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9CR1IyNCwgQVZfUElYX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmxhc2hzdmVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmxhc2hzdmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZDdjYWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mbGFzaHN2ZW5jLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBGbGFzaCBTY3JlZW4gVmlkZW8gZW5jb2RlcgorICogQ29weXJpZ2h0IChDKSAyMDA0IEFsZXggQmVyZWdzemFzemkKKyAqIENvcHlyaWdodCAoQykgMjAwNiBCZW5qYW1pbiBMYXJzc29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qIEVuY29kaW5nIGRldmVsb3BtZW50IHNwb25zb3JlZCBieSBodHRwOi8vZmgtY2FtcHVzd2llbi5hYy5hdCAqLworCisvKioKKyAqIEBmaWxlCisgKiBGbGFzaCBTY3JlZW4gVmlkZW8gZW5jb2RlcgorICogQGF1dGhvciBBbGV4IEJlcmVnc3phc3ppCisgKiBAYXV0aG9yIEJlbmphbWluIExhcnNzb24KKyAqCisgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBiaXRzdHJlYW0gZm9ybWF0IGZvciBGbGFzaCBTY3JlZW4gVmlkZW8gdmVyc2lvbiAxLzIKKyAqIGlzIHBhcnQgb2YgdGhlIFNXRiBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICh2ZXJzaW9uIDEwKSwgd2hpY2ggY2FuIGJlCisgKiBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5hZG9iZS5jb20vZGV2bmV0L3N3Zi5odG1sLgorICovCisKKy8qCisgKiBFbmNvZGluZyBpZGVhczogQSBiYXNpYyBlbmNvZGVyIHdvdWxkIGp1c3QgdXNlIGEgZml4ZWQgYmxvY2sgc2l6ZS4KKyAqIEJsb2NrIHNpemVzIGNhbiBiZSBtdWx0aXBsZXMgb2YgMTYsIGZyb20gMTYgdG8gMjU2LiBUaGUgYmxvY2tzIGRvbid0CisgKiBoYXZlIHRvIGJlIHF1YWRyYXRpYy4gQSBicnV0ZSBmb3JjZSBzZWFyY2ggd2l0aCBhIHNldCBvZiBkaWZmZXJlbnQKKyAqIGJsb2NrIHNpemVzIHNob3VsZCBnaXZlIGEgYmV0dGVyIHJlc3VsdCB0aGFuIHRvIGp1c3QgdXNlIGEgZml4ZWQgc2l6ZS4KKyAqCisgKiBUT0RPOgorICogRG9uJ3QgcmVlbmNvZGUgdGhlIGZyYW1lIGluIGJydXRlIGZvcmNlIG1vZGUgaWYgdGhlIGZyYW1lIGlzIGEgZHVwZS4KKyAqIFNwZWVkIHVwLiBNYWtlIHRoZSBkaWZmZXJlbmNlIGNoZWNrIGZhc3Rlci4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKworCit0eXBlZGVmIHN0cnVjdCBGbGFzaFNWQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIHVpbnQ4X3QgICAgICAgICpwcmV2aW91c19mcmFtZTsKKyAgICBpbnQgICAgICAgICAgICAgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodDsKKyAgICBpbnQgICAgICAgICAgICAgYmxvY2tfd2lkdGgsIGJsb2NrX2hlaWdodDsKKyAgICB1aW50OF90ICAgICAgICAqdG1wYmxvY2s7CisgICAgdWludDhfdCAgICAgICAgKmVuY2J1ZmZlcjsKKyAgICBpbnQgICAgICAgICAgICAgYmxvY2tfc2l6ZTsKKyAgICB6X3N0cmVhbSAgICAgICAgenN0cmVhbTsKKyAgICBpbnQgICAgICAgICAgICAgbGFzdF9rZXlfZnJhbWU7Cit9IEZsYXNoU1ZDb250ZXh0OworCitzdGF0aWMgaW50IGNvcHlfcmVnaW9uX2VuYyh1aW50OF90ICpzcHRyLCB1aW50OF90ICpkcHRyLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgdywgaW50IHN0cmlkZSwgdWludDhfdCAqcGZwdHIpCit7CisgICAgaW50IGksIGo7CisgICAgdWludDhfdCAqbnNwdHI7CisgICAgdWludDhfdCAqbnBmcHRyOworICAgIGludCBkaWZmID0gMDsKKworICAgIGZvciAoaSA9IGR4ICsgaDsgaSA+IGR4OyBpLS0pIHsKKyAgICAgICAgbnNwdHIgID0gc3B0ciAgKyBpICogc3RyaWRlICsgZHkgKiAzOworICAgICAgICBucGZwdHIgPSBwZnB0ciArIGkgKiBzdHJpZGUgKyBkeSAqIDM7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3ICogMzsgaisrKSB7CisgICAgICAgICAgICBkaWZmICAgIHw9IG5wZnB0cltqXSBeIG5zcHRyW2pdOworICAgICAgICAgICAgZHB0cltqXSAgPSBuc3B0cltqXTsKKyAgICAgICAgfQorICAgICAgICBkcHRyICs9IHcgKiAzOworICAgIH0KKyAgICBpZiAoZGlmZikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBmbGFzaHN2X2VuY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZsYXNoU1ZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGRlZmxhdGVFbmQoJnMtPnpzdHJlYW0pOworCisgICAgYXZfZnJlZXAoJnMtPmVuY2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPnByZXZpb3VzX2ZyYW1lKTsKKyAgICBhdl9mcmVlcCgmcy0+dG1wYmxvY2spOworCisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZmxhc2hzdl9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRmxhc2hTVkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIGlmIChhdmN0eC0+d2lkdGggPiA0MDk1IHx8IGF2Y3R4LT5oZWlnaHQgPiA0MDk1KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIklucHV0IGRpbWVuc2lvbnMgdG9vIGxhcmdlLCBpbnB1dCBtdXN0IGJlIG1heCA0MDk2eDQwOTYgIVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8vIE5lZWRlZCBpZiB6bGliIHVudXNlZCBvciBpbml0IGFib3J0ZWQgYmVmb3JlIGRlZmxhdGVJbml0CisgICAgbWVtc2V0KCZzLT56c3RyZWFtLCAwLCBzaXplb2Yoel9zdHJlYW0pKTsKKworICAgIHMtPmxhc3Rfa2V5X2ZyYW1lID0gMDsKKworICAgIHMtPmltYWdlX3dpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICBzLT5pbWFnZV9oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgcy0+dG1wYmxvY2sgID0gYXZfbWFsbG9jeigzICogMjU2ICogMjU2KTsKKyAgICBzLT5lbmNidWZmZXIgPSBhdl9tYWxsb2N6KHMtPmltYWdlX3dpZHRoICogcy0+aW1hZ2VfaGVpZ2h0ICogMyk7CisKKyAgICBpZiAoIXMtPnRtcGJsb2NrIHx8ICFzLT5lbmNidWZmZXIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKSB7CisgICAgICAgIGZsYXNoc3ZfZW5jb2RlX2VuZChhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBlbmNvZGVfYml0c3RyZWFtKEZsYXNoU1ZDb250ZXh0ICpzLCBjb25zdCBBVkZyYW1lICpwLCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplLCBpbnQgYmxvY2tfd2lkdGgsIGludCBibG9ja19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHJldmlvdXNfZnJhbWUsIGludCAqSV9mcmFtZSkKK3sKKworICAgIFB1dEJpdENvbnRleHQgcGI7CisgICAgaW50IGhfYmxvY2tzLCB2X2Jsb2NrcywgaF9wYXJ0LCB2X3BhcnQsIGksIGo7CisgICAgaW50IGJ1Zl9wb3MsIHJlczsKKyAgICBpbnQgcHJlZF9ibG9ja3MgPSAwOworCisgICAgaW5pdF9wdXRfYml0cygmcGIsIGJ1ZiwgYnVmX3NpemUgKiA4KTsKKworICAgIHB1dF9iaXRzKCZwYiwgIDQsIGJsb2NrX3dpZHRoIC8gMTYgLSAxKTsKKyAgICBwdXRfYml0cygmcGIsIDEyLCBzLT5pbWFnZV93aWR0aCk7CisgICAgcHV0X2JpdHMoJnBiLCAgNCwgYmxvY2tfaGVpZ2h0IC8gMTYgLSAxKTsKKyAgICBwdXRfYml0cygmcGIsIDEyLCBzLT5pbWFnZV9oZWlnaHQpOworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgYnVmX3BvcyA9IDQ7CisKKyAgICBoX2Jsb2NrcyA9IHMtPmltYWdlX3dpZHRoICAvIGJsb2NrX3dpZHRoOworICAgIGhfcGFydCAgID0gcy0+aW1hZ2Vfd2lkdGggICUgYmxvY2tfd2lkdGg7CisgICAgdl9ibG9ja3MgPSBzLT5pbWFnZV9oZWlnaHQgLyBibG9ja19oZWlnaHQ7CisgICAgdl9wYXJ0ICAgPSBzLT5pbWFnZV9oZWlnaHQgJSBibG9ja19oZWlnaHQ7CisKKyAgICAvKiBsb29wIG92ZXIgYWxsIGJsb2NrIGNvbHVtbnMgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgdl9ibG9ja3MgKyAodl9wYXJ0ID8gMSA6IDApOyBqKyspIHsKKworICAgICAgICBpbnQgeV9wb3MgPSBqICogYmxvY2tfaGVpZ2h0OyAvLyB2ZXJ0aWNhbCBwb3NpdGlvbiBpbiBmcmFtZQorICAgICAgICBpbnQgY3VyX2Jsa19oZWlnaHQgPSAoaiA8IHZfYmxvY2tzKSA/IGJsb2NrX2hlaWdodCA6IHZfcGFydDsKKworICAgICAgICAvKiBsb29wIG92ZXIgYWxsIGJsb2NrIHJvd3MgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhfYmxvY2tzICsgKGhfcGFydCA/IDEgOiAwKTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgeF9wb3MgPSBpICogYmxvY2tfd2lkdGg7IC8vIGhvcml6b250YWwgcG9zaXRpb24gaW4gZnJhbWUKKyAgICAgICAgICAgIGludCBjdXJfYmxrX3dpZHRoID0gKGkgPCBoX2Jsb2NrcykgPyBibG9ja193aWR0aCA6IGhfcGFydDsKKyAgICAgICAgICAgIGludCByZXQgPSBaX09LOworICAgICAgICAgICAgdWludDhfdCAqcHRyID0gYnVmICsgYnVmX3BvczsKKworICAgICAgICAgICAgLyogY29weSB0aGUgYmxvY2sgdG8gdGhlIHRlbXAgYnVmZmVyIGJlZm9yZSBjb21wcmVzc2lvbgorICAgICAgICAgICAgICogKGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUncyBibG9jaykgKi8KKyAgICAgICAgICAgIHJlcyA9IGNvcHlfcmVnaW9uX2VuYyhwLT5kYXRhWzBdLCBzLT50bXBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbWFnZV9oZWlnaHQgLSAoeV9wb3MgKyBjdXJfYmxrX2hlaWdodCArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfcG9zLCBjdXJfYmxrX2hlaWdodCwgY3VyX2Jsa193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5saW5lc2l6ZVswXSwgcHJldmlvdXNfZnJhbWUpOworCisgICAgICAgICAgICBpZiAocmVzIHx8ICpJX2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB6c2l6ZSA9IDMgKiBibG9ja193aWR0aCAqIGJsb2NrX2hlaWdodDsKKyAgICAgICAgICAgICAgICByZXQgPSBjb21wcmVzczIocHRyICsgMiwgJnpzaXplLCBzLT50bXBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAqIGN1cl9ibGtfd2lkdGggKiBjdXJfYmxrX2hlaWdodCwgOSk7CisKKyAgICAgICAgICAgICAgICAvL3JldCA9IGRlZmxhdGVSZXNldCgmcy0+enN0cmVhbSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciB3aGlsZSBjb21wcmVzc2luZyBibG9jayAlZHglZFxuIiwgaSwgaik7CisKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZwdHIsIHpzaXplKTsKKyAgICAgICAgICAgICAgICBidWZfcG9zICs9IHpzaXplICsgMjsKKyAgICAgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiYnVmX3BvcyA9ICVkXG4iLCBidWZfcG9zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJlZF9ibG9ja3MrKzsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZwdHIsIDApOworICAgICAgICAgICAgICAgIGJ1Zl9wb3MgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmVkX2Jsb2NrcykKKyAgICAgICAgKklfZnJhbWUgPSAwOworICAgIGVsc2UKKyAgICAgICAgKklfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGJ1Zl9wb3M7Cit9CisKKworc3RhdGljIGludCBmbGFzaHN2X2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpY3QsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBGbGFzaFNWQ29udGV4dCAqIGNvbnN0IHMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEFWRnJhbWUgKiBjb25zdCBwID0gcGljdDsKKyAgICB1aW50OF90ICpwZnB0cjsKKyAgICBpbnQgcmVzOworICAgIGludCBJX2ZyYW1lID0gMDsKKyAgICBpbnQgb3B0X3cgPSA0LCBvcHRfaCA9IDQ7CisKKyAgICAvKiBGaXJzdCBmcmFtZSBuZWVkcyB0byBiZSBhIGtleWZyYW1lICovCisgICAgaWYgKGF2Y3R4LT5mcmFtZV9udW1iZXIgPT0gMCkgeworICAgICAgICBzLT5wcmV2aW91c19mcmFtZSA9IGF2X21hbGxvY3ooRkZBQlMocC0+bGluZXNpemVbMF0pICogcy0+aW1hZ2VfaGVpZ2h0KTsKKyAgICAgICAgaWYgKCFzLT5wcmV2aW91c19mcmFtZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgSV9mcmFtZSA9IDE7CisgICAgfQorCisgICAgaWYgKHAtPmxpbmVzaXplWzBdIDwgMCkKKyAgICAgICAgcGZwdHIgPSBzLT5wcmV2aW91c19mcmFtZSAtIChzLT5pbWFnZV9oZWlnaHQgLSAxKSAqIHAtPmxpbmVzaXplWzBdOworICAgIGVsc2UKKyAgICAgICAgcGZwdHIgPSBzLT5wcmV2aW91c19mcmFtZTsKKworICAgIC8qIENoZWNrIHRoZSBwbGFjZW1lbnQgb2Yga2V5ZnJhbWVzICovCisgICAgaWYgKGF2Y3R4LT5nb3Bfc2l6ZSA+IDAgJiYKKyAgICAgICAgYXZjdHgtPmZyYW1lX251bWJlciA+PSBzLT5sYXN0X2tleV9mcmFtZSArIGF2Y3R4LT5nb3Bfc2l6ZSkgeworICAgICAgICBJX2ZyYW1lID0gMTsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgcy0+aW1hZ2Vfd2lkdGggKiBzLT5pbWFnZV9oZWlnaHQgKiAzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgcGt0LT5zaXplID0gZW5jb2RlX2JpdHN0cmVhbShzLCBwLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwgb3B0X3cgKiAxNiwgb3B0X2ggKiAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmcHRyLCAmSV9mcmFtZSk7CisKKyAgICAvL3NhdmUgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBpZiAocC0+bGluZXNpemVbMF0gPiAwKQorICAgICAgICBtZW1jcHkocy0+cHJldmlvdXNfZnJhbWUsIHAtPmRhdGFbMF0sIHMtPmltYWdlX2hlaWdodCAqIHAtPmxpbmVzaXplWzBdKTsKKyAgICBlbHNlCisgICAgICAgIG1lbWNweShzLT5wcmV2aW91c19mcmFtZSwKKyAgICAgICAgICAgICAgIHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSAqIChzLT5pbWFnZV9oZWlnaHQgLSAxKSwKKyAgICAgICAgICAgICAgIHMtPmltYWdlX2hlaWdodCAqIEZGQUJTKHAtPmxpbmVzaXplWzBdKSk7CisKKyAgICAvL21hcmsgdGhlIGZyYW1lIHR5cGUgc28gdGhlIG11eGVyIGNhbiBtdXggaXQgY29ycmVjdGx5CisgICAgaWYgKElfZnJhbWUpIHsKKyAgICAgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgICAgICA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSAgICAgID0gMTsKKyAgICAgICAgcy0+bGFzdF9rZXlfZnJhbWUgPSBhdmN0eC0+ZnJhbWVfbnVtYmVyOworICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiSW5zZXJ0aW5nIGtleWZyYW1lIGF0IGZyYW1lICVkXG4iLCBhdmN0eC0+ZnJhbWVfbnVtYmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDA7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lKQorICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9mbGFzaHN2X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImZsYXNoc3YiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGbGFzaCBTY3JlZW4gVmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRkxBU0hTViwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRmxhc2hTVkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZsYXNoc3ZfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZmxhc2hzdl9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmxhc2hzdl9lbmNvZGVfZW5kLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfQkdSMjQsIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZsaWN2aWRlby5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmxpY3ZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkNWZiNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZsaWN2aWRlby5jCkBAIC0wLDAgKzEsODE4IEBACisvKgorICogRkxJL0ZMQyBBbmltYXRpb24gVmlkZW8gRGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBdXRvZGVzayBBbmltYXRvciBGTEkvRkxDIFZpZGVvIERlY29kZXIKKyAqIGJ5IE1pa2UgTWVsYW5zb24gKG1lbGFuc29uQHBjaXN5cy5uZXQpCisgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgLmZsaS8uZmxjIGZpbGUgZm9ybWF0IGFuZCBhbGwgb2YgaXRzIG1hbnkKKyAqIHZhcmlhdGlvbnMsIHZpc2l0OgorICogICBodHRwOi8vd3d3LmNvbXB1cGhhc2UuY29tL2ZsaWMuaHRtCisgKgorICogVGhpcyBkZWNvZGVyIG91dHB1dHMgUEFMOC9SR0I1NTUvUkdCNTY1IGFuZCBtYXliZSBvbmUgZGF5IFJHQjI0CisgKiBjb2xvcnNwYWNlIGRhdGEsIGRlcGVuZGluZyBvbiB0aGUgRkxDLiBUbyB1c2UgdGhpcyBkZWNvZGVyLCBiZQorICogc3VyZSB0aGF0IHlvdXIgZGVtdXhlciBzZW5kcyB0aGUgRkxJIGZpbGUgaGVhZGVyIHRvIHRoZSBkZWNvZGVyIHZpYQorICogdGhlIGV4dHJhZGF0YSBjaHVuayBpbiBBVkNvZGVjQ29udGV4dC4gVGhlIGNodW5rIHNob3VsZCBiZSAxMjggYnl0ZXMKKyAqIGxhcmdlLiBUaGUgb25seSBleGNlcHRpb24gaXMgZm9yIEZMSSBmaWxlcyBmcm9tIHRoZSBnYW1lICJNYWdpYyBDYXJwZXQiLAorICogaW4gd2hpY2ggdGhlIGhlYWRlciBpcyBvbmx5IDEyIGJ5dGVzLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisKKyNkZWZpbmUgRkxJXzI1Nl9DT0xPUiA0CisjZGVmaW5lIEZMSV9ERUxUQSAgICAgNworI2RlZmluZSBGTElfQ09MT1IgICAgIDExCisjZGVmaW5lIEZMSV9MQyAgICAgICAgMTIKKyNkZWZpbmUgRkxJX0JMQUNLICAgICAxMworI2RlZmluZSBGTElfQlJVTiAgICAgIDE1CisjZGVmaW5lIEZMSV9DT1BZICAgICAgMTYKKyNkZWZpbmUgRkxJX01JTkkgICAgICAxOAorI2RlZmluZSBGTElfRFRBX0JSVU4gIDI1CisjZGVmaW5lIEZMSV9EVEFfQ09QWSAgMjYKKyNkZWZpbmUgRkxJX0RUQV9MQyAgICAyNworCisjZGVmaW5lIEZMSV9UWVBFX0NPREUgICAgICgweEFGMTEpCisjZGVmaW5lIEZMQ19GTFhfVFlQRV9DT0RFICgweEFGMTIpCisjZGVmaW5lIEZMQ19EVEFfVFlQRV9DT0RFICgweEFGNDQpIC8qIE1hcmtzIGFuICJFeHRlbmRlZCBGTEMiIGNvbWVzIGZyb20gRGF2ZSdzIFRhcmdhIEFuaW1hdG9yIChEVEEpICovCisjZGVmaW5lIEZMQ19NQUdJQ19DQVJQRVRfU1lOVEhFVElDX1RZUEVfQ09ERSAoMHhBRjEzKQorCisjZGVmaW5lIENIRUNLX1BJWEVMX1BUUihuKSBcCisgICAgaWYgKHBpeGVsX3B0ciArIG4gPiBwaXhlbF9saW1pdCkgeyBcCisgICAgICAgIGF2X2xvZyAocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGl4ZWxfcHRyID0gJWQgPiBwaXhlbF9saW1pdCA9ICVkXG4iLCBcCisgICAgICAgIHBpeGVsX3B0ciArIG4sIHBpeGVsX2xpbWl0KTsgXAorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgXAorICAgIH0gXAorCit0eXBlZGVmIHN0cnVjdCBGbGljRGVjb2RlQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRnJhbWUgKmZyYW1lOworCisgICAgdW5zaWduZWQgaW50IHBhbGV0dGVbMjU2XTsKKyAgICBpbnQgbmV3X3BhbGV0dGU7CisgICAgaW50IGZsaV90eXBlOyAgLyogZWl0aGVyIDB4QUYxMSBvciAweEFGMTIsIGFmZmVjdHMgcGFsZXR0ZSByZXNvbHV0aW9uICovCit9IEZsaWNEZWNvZGVDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgZmxpY19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRmxpY0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKmZsaV9oZWFkZXIgPSAodW5zaWduZWQgY2hhciAqKWF2Y3R4LT5leHRyYWRhdGE7CisgICAgaW50IGRlcHRoOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAhPSAwICYmCisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAhPSAxMiAmJgorICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgIT0gMTI4ICYmCisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAhPSAyNTYgJiYKKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplICE9IDkwNCAmJgorICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgIT0gMTAyNCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuZXhwZWN0ZWQgZXh0cmFkYXRhIHNpemUgJWRcbiIsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICBpZiAocy0+YXZjdHgtPmV4dHJhZGF0YV9zaXplID09IDEyKSB7CisgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgbWFnaWMgY2FycGV0IEZMSXMgKi8KKyAgICAgICAgcy0+ZmxpX3R5cGUgPSBGTENfTUFHSUNfQ0FSUEVUX1NZTlRIRVRJQ19UWVBFX0NPREU7CisgICAgICAgIGRlcHRoID0gODsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9PSAxMDI0KSB7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IGF2Y3R4LT5leHRyYWRhdGE7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgICAgcy0+cGFsZXR0ZVtpXSA9IEFWX1JMMzIocHRyKTsKKyAgICAgICAgICAgIHB0ciArPSA0OworICAgICAgICB9CisgICAgICAgIGRlcHRoID0gODsKKyAgICAgICAgLyogRkxJIGluIE1PViwgc2VlIGUuZy4gRkZtcGVnIHRyYWMgaXNzdWUgIzYyNiAqLworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID09IDAgfHwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9PSAyNTYgfHwKKyAgICAgICAgLyogc2VlIEZGbXBlZyB0aWNrZXQgIzEyMzQgKi8KKyAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9PSA5MDQpIHsKKyAgICAgICAgcy0+ZmxpX3R5cGUgPSBGTElfVFlQRV9DT0RFOworICAgICAgICBkZXB0aCA9IDg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+ZmxpX3R5cGUgPSBBVl9STDE2KCZmbGlfaGVhZGVyWzRdKTsKKyAgICAgICAgZGVwdGggPSBBVl9STDE2KCZmbGlfaGVhZGVyWzEyXSk7CisgICAgfQorCisgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgZGVwdGggPSA4OyAvKiBTb21lIEZMQyBnZW5lcmF0b3JzIHNldCBkZXB0aCB0byB6ZXJvLCB3aGVuIHRoZXkgbWVhbiA4QnBwLiBGaXggdXAgaGVyZSAqLworICAgIH0KKworICAgIGlmICgocy0+ZmxpX3R5cGUgPT0gRkxDX0ZMWF9UWVBFX0NPREUpICYmIChkZXB0aCA9PSAxNikpIHsKKyAgICAgICAgZGVwdGggPSAxNTsgLyogT3JpZ2luYWwgQXV0b2Rlc2sgRkxYJ3Mgc2F5IHRoZSBkZXB0aCBpcyAxNkJwcCB3aGVuIGl0IGlzIHJlYWxseSAxNUJwcCAqLworICAgIH0KKworICAgIHN3aXRjaCAoZGVwdGgpIHsKKyAgICAgICAgY2FzZSA4ICA6IGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OyBicmVhazsKKyAgICAgICAgY2FzZSAxNSA6IGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTU7IGJyZWFrOworICAgICAgICBjYXNlIDE2IDogYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU2NTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjQgOiBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQ7IC8qIFN1cHBvc2VkbHkgQkdSLCBidXQgaGF2ZW50IGFueSBmaWxlcyB0byB0ZXN0IHdpdGggKi8KKyAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIjI0QnBwIEZMQy9GTFgiKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gRkxDL0ZMWCBkZXB0aCBvZiAlZCBCcHAgaXMgdW5zdXBwb3J0ZWQuXG4iLGRlcHRoKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+bmV3X3BhbGV0dGUgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmxpY19kZWNvZGVfZnJhbWVfOEJQUChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgRmxpY0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgR2V0Qnl0ZUNvbnRleHQgZzI7CisgICAgaW50IHBpeGVsX3B0cjsKKyAgICBpbnQgcGFsZXR0ZV9wdHI7CisgICAgdW5zaWduZWQgY2hhciBwYWxldHRlX2lkeDE7CisgICAgdW5zaWduZWQgY2hhciBwYWxldHRlX2lkeDI7CisKKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZTsKKyAgICBpbnQgbnVtX2NodW5rczsKKworICAgIHVuc2lnbmVkIGludCBjaHVua19zaXplOworICAgIGludCBjaHVua190eXBlOworCisgICAgaW50IGksIGosIHJldDsKKworICAgIGludCBjb2xvcl9wYWNrZXRzOworICAgIGludCBjb2xvcl9jaGFuZ2VzOworICAgIGludCBjb2xvcl9zaGlmdDsKKyAgICB1bnNpZ25lZCBjaGFyIHIsIGcsIGI7CisKKyAgICBpbnQgbGluZXM7CisgICAgaW50IGNvbXByZXNzZWRfbGluZXM7CisgICAgaW50IHN0YXJ0aW5nX2xpbmU7CisgICAgc2lnbmVkIHNob3J0IGxpbmVfcGFja2V0czsKKyAgICBpbnQgeV9wdHI7CisgICAgaW50IGJ5dGVfcnVuOworICAgIGludCBwaXhlbF9za2lwOworICAgIGludCBwaXhlbF9jb3VudGRvd247CisgICAgdW5zaWduZWQgY2hhciAqcGl4ZWxzOworICAgIHVuc2lnbmVkIGludCBwaXhlbF9saW1pdDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmcyLCBidWYsIGJ1Zl9zaXplKTsKKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBpeGVscyA9IHMtPmZyYW1lLT5kYXRhWzBdOworICAgIHBpeGVsX2xpbWl0ID0gcy0+YXZjdHgtPmhlaWdodCAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICBpZiAoYnVmX3NpemUgPCAxNiB8fCBidWZfc2l6ZSA+IElOVF9NQVggLSAoMyAqIDI1NiArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBmcmFtZV9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmcyKTsKKyAgICBpZiAoZnJhbWVfc2l6ZSA+IGJ1Zl9zaXplKQorICAgICAgICBmcmFtZV9zaXplID0gYnVmX3NpemU7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZzIsIDIpOyAvKiBza2lwIHRoZSBtYWdpYyBudW1iZXIgKi8KKyAgICBudW1fY2h1bmtzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgOCk7ICAvKiBza2lwIHBhZGRpbmcgKi8KKworICAgIGZyYW1lX3NpemUgLT0gMTY7CisKKyAgICAvKiBpdGVyYXRlIHRocm91Z2ggdGhlIGNodW5rcyAqLworICAgIHdoaWxlICgoZnJhbWVfc2l6ZSA+PSA2KSAmJiAobnVtX2NodW5rcyA+IDApICYmCisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZzIpID49IDQpIHsKKyAgICAgICAgaW50IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bms7CisgICAgICAgIGNodW5rX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZzIpOworICAgICAgICBpZiAoY2h1bmtfc2l6ZSA+IGZyYW1lX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2h1bmtfc2l6ZSA9ICV1ID4gZnJhbWVfc2l6ZSA9ICV1XG4iLCBjaHVua19zaXplLCBmcmFtZV9zaXplKTsKKyAgICAgICAgICAgIGNodW5rX3NpemUgPSBmcmFtZV9zaXplOworICAgICAgICB9CisgICAgICAgIHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmsgPSBieXRlc3RyZWFtMl90ZWxsKCZnMikgLSA0ICsgY2h1bmtfc2l6ZTsKKworICAgICAgICBjaHVua190eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKworICAgICAgICBzd2l0Y2ggKGNodW5rX3R5cGUpIHsKKyAgICAgICAgY2FzZSBGTElfMjU2X0NPTE9SOgorICAgICAgICBjYXNlIEZMSV9DT0xPUjoKKyAgICAgICAgICAgIC8qIGNoZWNrIHNwZWNpYWwgY2FzZTogSWYgdGhpcyBmaWxlIGlzIGZyb20gdGhlIE1hZ2ljIENhcnBldAorICAgICAgICAgICAgICogZ2FtZSBhbmQgdXNlcyA2LWJpdCBjb2xvcnMgZXZlbiB0aG91Z2ggaXQgcmVwb3J0cyAyNTYtY29sb3IKKyAgICAgICAgICAgICAqIGNodW5rcyBpbiBhIDB4QUYxMi10eXBlIGZpbGUgKGZsaV90eXBlIGlzIHNldCB0byAweEFGMTMgZHVyaW5nCisgICAgICAgICAgICAgKiBpbml0aWFsaXphdGlvbikgKi8KKyAgICAgICAgICAgIGlmICgoY2h1bmtfdHlwZSA9PSBGTElfMjU2X0NPTE9SKSAmJiAocy0+ZmxpX3R5cGUgIT0gRkxDX01BR0lDX0NBUlBFVF9TWU5USEVUSUNfVFlQRV9DT0RFKSkKKyAgICAgICAgICAgICAgICBjb2xvcl9zaGlmdCA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29sb3Jfc2hpZnQgPSAyOworICAgICAgICAgICAgLyogc2V0IHVwIHRoZSBwYWxldHRlICovCisgICAgICAgICAgICBjb2xvcl9wYWNrZXRzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKyAgICAgICAgICAgIHBhbGV0dGVfcHRyID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvcl9wYWNrZXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBieXRlIGlzIGhvdyBtYW55IGNvbG9ycyB0byBza2lwICovCisgICAgICAgICAgICAgICAgcGFsZXR0ZV9wdHIgKz0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcyKTsKKworICAgICAgICAgICAgICAgIC8qIG5leHQgYnl0ZSBpbmRpY2F0ZXMgaG93IG1hbnkgZW50cmllcyB0byBjaGFuZ2UgKi8KKyAgICAgICAgICAgICAgICBjb2xvcl9jaGFuZ2VzID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcyKTsKKworICAgICAgICAgICAgICAgIC8qIGlmIHRoZXJlIGFyZSAwIGNvbG9yIGNoYW5nZXMsIHRoZXJlIGFyZSBhY3R1YWxseSAyNTYgKi8KKyAgICAgICAgICAgICAgICBpZiAoY29sb3JfY2hhbmdlcyA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb2xvcl9jaGFuZ2VzID0gMjU2OworCisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSArIGNvbG9yX2NoYW5nZXMgKiAzID4gc3RyZWFtX3B0cl9hZnRlcl9jaHVuaykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29sb3JfY2hhbmdlczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBlbnRyeTsKKworICAgICAgICAgICAgICAgICAgICAvKiB3cmFwIGFyb3VuZCwgZm9yIGdvb2QgbWVhc3VyZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXBhbGV0dGVfcHRyID49IDI1NikKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVfcHRyID0gMDsKKworICAgICAgICAgICAgICAgICAgICByID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcyKSA8PCBjb2xvcl9zaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgZyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnMikgPDwgY29sb3Jfc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZzIpIDw8IGNvbG9yX3NoaWZ0OworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IDB4RkZVIDw8IDI0IHwgciA8PCAxNiB8IGcgPDwgOCB8IGI7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvcl9zaGlmdCA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgfD0gZW50cnkgPj4gNiAmIDB4MzAzMDM7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wYWxldHRlW3BhbGV0dGVfcHRyXSAhPSBlbnRyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5ld19wYWxldHRlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcy0+cGFsZXR0ZVtwYWxldHRlX3B0cisrXSA9IGVudHJ5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkxJX0RFTFRBOgorICAgICAgICAgICAgeV9wdHIgPSAwOworICAgICAgICAgICAgY29tcHJlc3NlZF9saW5lcyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnMik7CisgICAgICAgICAgICB3aGlsZSAoY29tcHJlc3NlZF9saW5lcyA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfdGVsbCgmZzIpICsgMiA+IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmspCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGxpbmVfcGFja2V0cyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnMik7CisgICAgICAgICAgICAgICAgaWYgKChsaW5lX3BhY2tldHMgJiAweEMwMDApID09IDB4QzAwMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBsaW5lIHNraXAgb3Bjb2RlCisgICAgICAgICAgICAgICAgICAgIGxpbmVfcGFja2V0cyA9IC1saW5lX3BhY2tldHM7CisgICAgICAgICAgICAgICAgICAgIHlfcHRyICs9IGxpbmVfcGFja2V0cyAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChsaW5lX3BhY2tldHMgJiAweEMwMDApID09IDB4NDAwMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuZGVmaW5lZCBvcGNvZGUgKCV4KSBpbiBERUxUQV9GTElcbiIsIGxpbmVfcGFja2V0cyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgobGluZV9wYWNrZXRzICYgMHhDMDAwKSA9PSAweDgwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gImxhc3QgYnl0ZSIgb3Bjb2RlCisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0cj0geV9wdHIgKyBzLT5mcmFtZS0+bGluZXNpemVbMF0gLSAxOworICAgICAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoMCk7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsc1twaXhlbF9wdHJdID0gbGluZV9wYWNrZXRzICYgMHhmZjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkX2xpbmVzLS07CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciA9IHlfcHRyOworICAgICAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoMCk7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93biA9IHMtPmF2Y3R4LT53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmVfcGFja2V0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfdGVsbCgmZzIpICsgMiA+IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY2NvdW50IGZvciB0aGUgc2tpcCBieXRlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfc2tpcCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnMik7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gcGl4ZWxfc2tpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93biAtPSBwaXhlbF9za2lwOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9ydW4gPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZzIpLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlX3J1biA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3J1biA9IC1ieXRlX3J1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlX2lkeDEgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVfaWR4MiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKGJ5dGVfcnVuICogMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJ5dGVfcnVuOyBqKyssIHBpeGVsX2NvdW50ZG93biAtPSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1twaXhlbF9wdHIrK10gPSBwYWxldHRlX2lkeDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1twaXhlbF9wdHIrK10gPSBwYWxldHRlX2lkeDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoYnl0ZV9ydW4gKiAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfdGVsbCgmZzIpICsgYnl0ZV9ydW4gKiAyID4gc3RyZWFtX3B0cl9hZnRlcl9jaHVuaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJ5dGVfcnVuICogMjsgaisrLCBwaXhlbF9jb3VudGRvd24tLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNbcGl4ZWxfcHRyKytdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB5X3B0ciArPSBzLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGTElfTEM6CisgICAgICAgICAgICAvKiBsaW5lIGNvbXByZXNzZWQgKi8KKyAgICAgICAgICAgIHN0YXJ0aW5nX2xpbmUgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZzIpOworICAgICAgICAgICAgeV9wdHIgPSAwOworICAgICAgICAgICAgeV9wdHIgKz0gc3RhcnRpbmdfbGluZSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKworICAgICAgICAgICAgY29tcHJlc3NlZF9saW5lcyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnMik7CisgICAgICAgICAgICB3aGlsZSAoY29tcHJlc3NlZF9saW5lcyA+IDApIHsKKyAgICAgICAgICAgICAgICBwaXhlbF9wdHIgPSB5X3B0cjsKKyAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoMCk7CisgICAgICAgICAgICAgICAgcGl4ZWxfY291bnRkb3duID0gcy0+YXZjdHgtPndpZHRoOworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsKCZnMikgKyAxID4gc3RyZWFtX3B0cl9hZnRlcl9jaHVuaykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbGluZV9wYWNrZXRzID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcyKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZV9wYWNrZXRzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZV9wYWNrZXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjY291bnQgZm9yIHRoZSBza2lwIGJ5dGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfdGVsbCgmZzIpICsgMSA+IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9za2lwID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSBwaXhlbF9za2lwOworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfY291bnRkb3duIC09IHBpeGVsX3NraXA7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3J1biA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnMiksOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZV9ydW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKGJ5dGVfcnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfdGVsbCgmZzIpICsgYnl0ZV9ydW4gPiBzdHJlYW1fcHRyX2FmdGVyX2NodW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYnl0ZV9ydW47IGorKywgcGl4ZWxfY291bnRkb3duLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3BpeGVsX3B0cisrXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlX3J1biA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3J1biA9IC1ieXRlX3J1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlX2lkeDEgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX1BJWEVMX1BUUihieXRlX3J1bik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJ5dGVfcnVuOyBqKyssIHBpeGVsX2NvdW50ZG93bi0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1twaXhlbF9wdHIrK10gPSBwYWxldHRlX2lkeDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeV9wdHIgKz0gcy0+ZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgICAgIGNvbXByZXNzZWRfbGluZXMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkxJX0JMQUNLOgorICAgICAgICAgICAgLyogc2V0IHRoZSB3aG9sZSBmcmFtZSB0byBjb2xvciAwICh3aGljaCBpcyB1c3VhbGx5IGJsYWNrKSAqLworICAgICAgICAgICAgbWVtc2V0KHBpeGVscywgMCwKKyAgICAgICAgICAgICAgICBzLT5mcmFtZS0+bGluZXNpemVbMF0gKiBzLT5hdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkxJX0JSVU46CisgICAgICAgICAgICAvKiBCeXRlIHJ1biBjb21wcmVzc2lvbjogVGhpcyBjaHVuayB0eXBlIG9ubHkgb2NjdXJzIGluIHRoZSBmaXJzdAorICAgICAgICAgICAgICogRkxJIGZyYW1lIGFuZCBpdCB3aWxsIHVwZGF0ZSB0aGUgZW50aXJlIGZyYW1lLiAqLworICAgICAgICAgICAgeV9wdHIgPSAwOworICAgICAgICAgICAgZm9yIChsaW5lcyA9IDA7IGxpbmVzIDwgcy0+YXZjdHgtPmhlaWdodDsgbGluZXMrKykgeworICAgICAgICAgICAgICAgIHBpeGVsX3B0ciA9IHlfcHRyOworICAgICAgICAgICAgICAgIC8qIGRpc3JlZ2FyZCB0aGUgbGluZSBwYWNrZXRzOyBpbnN0ZWFkLCBpdGVyYXRlIHRocm91Z2ggYWxsCisgICAgICAgICAgICAgICAgICogcGl4ZWxzIG9uIGEgcm93ICovCisgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmcyLCAxKTsKKyAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24gPSBzLT5hdmN0eC0+d2lkdGg7CisgICAgICAgICAgICAgICAgd2hpbGUgKHBpeGVsX2NvdW50ZG93biA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSArIDEgPiBzdHJlYW1fcHRyX2FmdGVyX2NodW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVfcnVuID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcyKSwgOCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghYnl0ZV9ydW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBieXRlIHJ1biB2YWx1ZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZV9ydW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlX2lkeDEgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZzIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKGJ5dGVfcnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBieXRlX3J1bjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3BpeGVsX3B0cisrXSA9IHBhbGV0dGVfaWR4MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfY291bnRkb3duIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwaXhlbF9jb3VudGRvd24gPCAwICglZCkgYXQgbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93biwgbGluZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLyogY29weSBieXRlcyBpZiBieXRlX3J1biA8IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfcnVuID0gLWJ5dGVfcnVuOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKGJ5dGVfcnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsKCZnMikgKyBieXRlX3J1biA+IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYnl0ZV9ydW47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1twaXhlbF9wdHIrK10gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93bi0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbF9jb3VudGRvd24gPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBpeGVsX2NvdW50ZG93biA8IDAgKCVkKSBhdCBsaW5lICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfY291bnRkb3duLCBsaW5lcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB5X3B0ciArPSBzLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZMSV9DT1BZOgorICAgICAgICAgICAgLyogY29weSB0aGUgY2h1bmsgKHVuY29tcHJlc3NlZCBmcmFtZSkgKi8KKyAgICAgICAgICAgIGlmIChjaHVua19zaXplIC0gNiAhPSBzLT5hdmN0eC0+d2lkdGggKiBzLT5hdmN0eC0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbiBjaHVuayBGTElfQ09QWSA6IHNvdXJjZSBkYXRhICglZCBieXRlcykgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICJoYXMgaW5jb3JyZWN0IHNpemUsIHNraXBwaW5nIGNodW5rXG4iLCBjaHVua19zaXplIC0gNik7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZzIsIGNodW5rX3NpemUgLSA2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICh5X3B0ciA9IDA7IHlfcHRyIDwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdICogcy0+YXZjdHgtPmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgIHlfcHRyICs9IHMtPmZyYW1lLT5saW5lc2l6ZVswXSkgeworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnMiwgJnBpeGVsc1t5X3B0cl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPndpZHRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZMSV9NSU5JOgorICAgICAgICAgICAgLyogc29tZSBzb3J0IG9mIGEgdGh1bWJuYWlsPyBkaXNyZWdhcmQgdGhpcyBjaHVuay4uLiAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5yZWNvZ25pemVkIGNodW5rIHR5cGU6ICVkXG4iLCBjaHVua190eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmsgLSBieXRlc3RyZWFtMl90ZWxsKCZnMikgPiAwKQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZzIsIHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmsgLSBieXRlc3RyZWFtMl90ZWxsKCZnMikpOworCisgICAgICAgIGZyYW1lX3NpemUgLT0gY2h1bmtfc2l6ZTsKKyAgICAgICAgbnVtX2NodW5rcy0tOworICAgIH0KKworICAgIC8qIGJ5IHRoZSBlbmQgb2YgdGhlIGNodW5rLCB0aGUgc3RyZWFtIHB0ciBzaG91bGQgZXF1YWwgdGhlIGZyYW1lCisgICAgICogc2l6ZSAobWludXMgMSBvciAyLCBwb3NzaWJseSk7IGlmIGl0IGRvZXNuJ3QsIGlzc3VlIGEgd2FybmluZyAqLworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZzIpID4gMikKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcm9jZXNzZWQgRkxJIGNodW5rIHdoZXJlIGNodW5rIHNpemUgPSAlZCAiIFwKKyAgICAgICAgICAgICAgICJhbmQgZmluYWwgY2h1bmsgcHRyID0gJWRcbiIsIGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgYnVmX3NpemUgLSBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZzIpKTsKKworICAgIC8qIG1ha2UgdGhlIHBhbGV0dGUgYXZhaWxhYmxlIG9uIHRoZSB3YXkgb3V0ICovCisgICAgbWVtY3B5KHMtPmZyYW1lLT5kYXRhWzFdLCBzLT5wYWxldHRlLCBBVlBBTEVUVEVfU0laRSk7CisgICAgaWYgKHMtPm5ld19wYWxldHRlKSB7CisgICAgICAgIHMtPmZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKKyAgICAgICAgcy0+bmV3X3BhbGV0dGUgPSAwOworICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgZmxpY19kZWNvZGVfZnJhbWVfMTVfMTZCUFAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgLyogTm90ZSwgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAxNUJwcCBhbmQgMTZCcHAgKi8KKyAgICAvKiBGb3JtYXQgaXMgdGhlIHBpeGVsIGZvcm1hdCwgdGhlIHBhY2tldHMgYXJlIHByb2Nlc3NlZCB0aGUgc2FtZS4gKi8KKyAgICBGbGljRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBHZXRCeXRlQ29udGV4dCBnMjsKKyAgICBpbnQgcGl4ZWxfcHRyOworICAgIHVuc2lnbmVkIGNoYXIgcGFsZXR0ZV9pZHgxOworCisgICAgdW5zaWduZWQgaW50IGZyYW1lX3NpemU7CisgICAgaW50IG51bV9jaHVua3M7CisKKyAgICB1bnNpZ25lZCBpbnQgY2h1bmtfc2l6ZTsKKyAgICBpbnQgY2h1bmtfdHlwZTsKKworICAgIGludCBpLCBqLCByZXQ7CisKKyAgICBpbnQgbGluZXM7CisgICAgaW50IGNvbXByZXNzZWRfbGluZXM7CisgICAgc2lnbmVkIHNob3J0IGxpbmVfcGFja2V0czsKKyAgICBpbnQgeV9wdHI7CisgICAgaW50IGJ5dGVfcnVuOworICAgIGludCBwaXhlbF9za2lwOworICAgIGludCBwaXhlbF9jb3VudGRvd247CisgICAgdW5zaWduZWQgY2hhciAqcGl4ZWxzOworICAgIGludCBwaXhlbDsKKyAgICB1bnNpZ25lZCBpbnQgcGl4ZWxfbGltaXQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnMiwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwaXhlbHMgPSBzLT5mcmFtZS0+ZGF0YVswXTsKKyAgICBwaXhlbF9saW1pdCA9IHMtPmF2Y3R4LT5oZWlnaHQgKiBzLT5mcmFtZS0+bGluZXNpemVbMF07CisKKyAgICBmcmFtZV9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmcyKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgMik7ICAvKiBza2lwIHRoZSBtYWdpYyBudW1iZXIgKi8KKyAgICBudW1fY2h1bmtzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgOCk7ICAvKiBza2lwIHBhZGRpbmcgKi8KKyAgICBpZiAoZnJhbWVfc2l6ZSA+IGJ1Zl9zaXplKQorICAgICAgICBmcmFtZV9zaXplID0gYnVmX3NpemU7CisKKyAgICBmcmFtZV9zaXplIC09IDE2OworCisgICAgLyogaXRlcmF0ZSB0aHJvdWdoIHRoZSBjaHVua3MgKi8KKyAgICB3aGlsZSAoKGZyYW1lX3NpemUgPiAwKSAmJiAobnVtX2NodW5rcyA+IDApICYmCisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZzIpID49IDQpIHsKKyAgICAgICAgaW50IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bms7CisgICAgICAgIGNodW5rX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZzIpOworICAgICAgICBpZiAoY2h1bmtfc2l6ZSA+IGZyYW1lX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2h1bmtfc2l6ZSA9ICV1ID4gZnJhbWVfc2l6ZSA9ICV1XG4iLCBjaHVua19zaXplLCBmcmFtZV9zaXplKTsKKyAgICAgICAgICAgIGNodW5rX3NpemUgPSBmcmFtZV9zaXplOworICAgICAgICB9CisgICAgICAgIHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmsgPSBieXRlc3RyZWFtMl90ZWxsKCZnMikgLSA0ICsgY2h1bmtfc2l6ZTsKKworICAgICAgICBjaHVua190eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKworCisgICAgICAgIHN3aXRjaCAoY2h1bmtfdHlwZSkgeworICAgICAgICBjYXNlIEZMSV8yNTZfQ09MT1I6CisgICAgICAgIGNhc2UgRkxJX0NPTE9SOgorICAgICAgICAgICAgLyogRm9yIHNvbWUgcmVhc29uLCBpdCBzZWVtcyB0aGF0IG5vbi1wYWxldHRpemVkIGZsaWNzIGRvCisgICAgICAgICAgICAgKiBpbmNsdWRlIG9uZSBvZiB0aGVzZSBjaHVua3MgaW4gdGhlaXIgZmlyc3QgZnJhbWUuCisgICAgICAgICAgICAgKiBXaHkgSSBkbyBub3Qga25vdywgaXQgc2VlbXMgcmF0aGVyIGV4dHJhbmVvdXMuICovCisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBQYWxldHRlIGNodW5rICVkIGluIG5vbi1wYWxldHRpemVkIEZMQ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSk7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgY2h1bmtfc2l6ZSAtIDYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGTElfREVMVEE6CisgICAgICAgIGNhc2UgRkxJX0RUQV9MQzoKKyAgICAgICAgICAgIHlfcHRyID0gMDsKKyAgICAgICAgICAgIGNvbXByZXNzZWRfbGluZXMgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZzIpOworICAgICAgICAgICAgd2hpbGUgKGNvbXByZXNzZWRfbGluZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSArIDIgPiBzdHJlYW1fcHRyX2FmdGVyX2NodW5rKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBsaW5lX3BhY2tldHMgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZzIpOworICAgICAgICAgICAgICAgIGlmIChsaW5lX3BhY2tldHMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVfcGFja2V0cyA9IC1saW5lX3BhY2tldHM7CisgICAgICAgICAgICAgICAgICAgIHlfcHRyICs9IGxpbmVfcGFja2V0cyAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkX2xpbmVzLS07CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciA9IHlfcHRyOworICAgICAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoMCk7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93biA9IHMtPmF2Y3R4LT53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmVfcGFja2V0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY2NvdW50IGZvciB0aGUgc2tpcCBieXRlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSArIDIgPiBzdHJlYW1fcHRyX2FmdGVyX2NodW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfc2tpcCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnMik7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gKHBpeGVsX3NraXAqMik7IC8qIFBpeGVsIGlzIDIgYnl0ZXMgd2lkZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfY291bnRkb3duIC09IHBpeGVsX3NraXA7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3J1biA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnMiksIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVfcnVuIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfcnVuID0gLWJ5dGVfcnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoMiAqIGJ5dGVfcnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYnl0ZV9ydW47IGorKywgcGl4ZWxfY291bnRkb3duIC09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoc2lnbmVkIHNob3J0KikoJnBpeGVsc1twaXhlbF9wdHJdKSkgPSBwaXhlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfdGVsbCgmZzIpICsgMipieXRlX3J1biA+IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX1BJWEVMX1BUUigyICogYnl0ZV9ydW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBieXRlX3J1bjsgaisrLCBwaXhlbF9jb3VudGRvd24tLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChzaWduZWQgc2hvcnQqKSgmcGl4ZWxzW3BpeGVsX3B0cl0pKSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHlfcHRyICs9IHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZMSV9MQzoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5leHBlY3RlZCBGTElfTEMgY2h1bmsgaW4gbm9uLXBhbGV0dGl6ZWQgRkxDXG4iKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmcyLCBjaHVua19zaXplIC0gNik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZMSV9CTEFDSzoKKyAgICAgICAgICAgIC8qIHNldCB0aGUgd2hvbGUgZnJhbWUgdG8gMHgwMDAwIHdoaWNoIGlzIGJsYWNrIGluIGJvdGggMTVCcHAgYW5kIDE2QnBwIG1vZGVzLiAqLworICAgICAgICAgICAgbWVtc2V0KHBpeGVscywgMHgwMDAwLAorICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lLT5saW5lc2l6ZVswXSAqIHMtPmF2Y3R4LT5oZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGTElfQlJVTjoKKyAgICAgICAgICAgIHlfcHRyID0gMDsKKyAgICAgICAgICAgIGZvciAobGluZXMgPSAwOyBsaW5lcyA8IHMtPmF2Y3R4LT5oZWlnaHQ7IGxpbmVzKyspIHsKKyAgICAgICAgICAgICAgICBwaXhlbF9wdHIgPSB5X3B0cjsKKyAgICAgICAgICAgICAgICAvKiBkaXNyZWdhcmQgdGhlIGxpbmUgcGFja2V0czsgaW5zdGVhZCwgaXRlcmF0ZSB0aHJvdWdoIGFsbAorICAgICAgICAgICAgICAgICAqIHBpeGVscyBvbiBhIHJvdyAqLworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmcyLCAxKTsKKyAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24gPSAocy0+YXZjdHgtPndpZHRoICogMik7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAocGl4ZWxfY291bnRkb3duID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfdGVsbCgmZzIpICsgMSA+IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmspCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZV9ydW4gPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZzIpLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVfcnVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZV9pZHgxID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX1BJWEVMX1BUUihieXRlX3J1bik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYnl0ZV9ydW47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1twaXhlbF9wdHIrK10gPSBwYWxldHRlX2lkeDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfY291bnRkb3duLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsX2NvdW50ZG93biA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGl4ZWxfY291bnRkb3duIDwgMCAoJWQpIChsaW5lYSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93biwgbGluZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLyogY29weSBieXRlcyBpZiBieXRlX3J1biA8IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfcnVuID0gLWJ5dGVfcnVuOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSArIGJ5dGVfcnVuID4gc3RyZWFtX3B0cl9hZnRlcl9jaHVuaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX1BJWEVMX1BUUihieXRlX3J1bik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYnl0ZV9ydW47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVfaWR4MSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3BpeGVsX3B0cisrXSA9IHBhbGV0dGVfaWR4MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfY291bnRkb3duIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwaXhlbF9jb3VudGRvd24gPCAwICglZCkgYXQgbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93biwgbGluZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTm93IEZMWCBpcyBzdHJhbmdlLCBpbiB0aGF0IGl0IGlzICJieXRlIiBhcyBvcHBvc2VkIHRvICJwaXhlbCIgcnVuIGxlbmd0aCBjb21wcmVzc2VkLgorICAgICAgICAgICAgICAgICAqIFRoaXMgZG9lcyBub3QgZ2l2ZSB1cyBhbnkgZ29vZCBvcHBvcnR1bml0eSB0byBwZXJmb3JtIHdvcmQgZW5kaWFuIGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICAgKiBkdXJpbmcgZGVjb21wcmVzc2lvbi4gU28gaWYgaXQgaXMgcmVxdWlyZWQgKGkuZS4sIHRoaXMgaXMgbm90IGEgTEUgdGFyZ2V0LCB3ZSBkbworICAgICAgICAgICAgICAgICAqIGEgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgbGluZSBoZXJlLCBzd2FwcGluZyB0aGUgYnl0ZXMuCisgICAgICAgICAgICAgICAgICovCisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICAgICAgICAgICAgICBwaXhlbF9wdHIgPSB5X3B0cjsKKyAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24gPSBzLT5hdmN0eC0+d2lkdGg7CisgICAgICAgICAgICAgICAgd2hpbGUgKHBpeGVsX2NvdW50ZG93biA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKigoc2lnbmVkIHNob3J0KikoJnBpeGVsc1twaXhlbF9wdHJdKSkgPSBBVl9STDE2KCZidWZbcGl4ZWxfcHRyXSk7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAyOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIHlfcHRyICs9IHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkxJX0RUQV9CUlVOOgorICAgICAgICAgICAgeV9wdHIgPSAwOworICAgICAgICAgICAgZm9yIChsaW5lcyA9IDA7IGxpbmVzIDwgcy0+YXZjdHgtPmhlaWdodDsgbGluZXMrKykgeworICAgICAgICAgICAgICAgIHBpeGVsX3B0ciA9IHlfcHRyOworICAgICAgICAgICAgICAgIC8qIGRpc3JlZ2FyZCB0aGUgbGluZSBwYWNrZXRzOyBpbnN0ZWFkLCBpdGVyYXRlIHRocm91Z2ggYWxsCisgICAgICAgICAgICAgICAgICogcGl4ZWxzIG9uIGEgcm93ICovCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZzIsIDEpOworICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93biA9IHMtPmF2Y3R4LT53aWR0aDsgLyogV2lkdGggaXMgaW4gcGl4ZWxzLCBub3QgYnl0ZXMgKi8KKworICAgICAgICAgICAgICAgIHdoaWxlIChwaXhlbF9jb3VudGRvd24gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsKCZnMikgKyAxID4gc3RyZWFtX3B0cl9hZnRlcl9jaHVuaykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBieXRlX3J1biA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnMiksIDgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZV9ydW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnMik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoMiAqIGJ5dGVfcnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBieXRlX3J1bjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoc2lnbmVkIHNob3J0KikoJnBpeGVsc1twaXhlbF9wdHJdKSkgPSBwaXhlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfY291bnRkb3duIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwaXhlbF9jb3VudGRvd24gPCAwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLyogY29weSBwaXhlbHMgaWYgYnl0ZV9ydW4gPCAwICovCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3J1biA9IC1ieXRlX3J1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsKCZnMikgKyAyICogYnl0ZV9ydW4gPiBzdHJlYW1fcHRyX2FmdGVyX2NodW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKDIgKiBieXRlX3J1bik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYnl0ZV9ydW47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKHNpZ25lZCBzaG9ydCopKCZwaXhlbHNbcGl4ZWxfcHRyXSkpID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfY291bnRkb3duLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsX2NvdW50ZG93biA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGl4ZWxfY291bnRkb3duIDwgMCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfY291bnRkb3duKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHlfcHRyICs9IHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkxJX0NPUFk6CisgICAgICAgIGNhc2UgRkxJX0RUQV9DT1BZOgorICAgICAgICAgICAgLyogY29weSB0aGUgY2h1bmsgKHVuY29tcHJlc3NlZCBmcmFtZSkgKi8KKyAgICAgICAgICAgIGlmIChjaHVua19zaXplIC0gNiA+ICh1bnNpZ25lZCBpbnQpKHMtPmF2Y3R4LT53aWR0aCAqIHMtPmF2Y3R4LT5oZWlnaHQpKjIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluIGNodW5rIEZMSV9DT1BZIDogc291cmNlIGRhdGEgKCVkIGJ5dGVzKSAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgImJpZ2dlciB0aGFuIGltYWdlLCBza2lwcGluZyBjaHVua1xuIiwgY2h1bmtfc2l6ZSAtIDYpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmcyLCBjaHVua19zaXplIC0gNik7CisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgZm9yICh5X3B0ciA9IDA7IHlfcHRyIDwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdICogcy0+YXZjdHgtPmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgIHlfcHRyICs9IHMtPmZyYW1lLT5saW5lc2l6ZVswXSkgeworCisgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93biA9IHMtPmF2Y3R4LT53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBpeGVsX2NvdW50ZG93biA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAqKChzaWduZWQgc2hvcnQqKSgmcGl4ZWxzW3lfcHRyICsgcGl4ZWxfcHRyXSkpID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKyAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24tLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkxJX01JTkk6CisgICAgICAgICAgICAvKiBzb21lIHNvcnQgb2YgYSB0aHVtYm5haWw/IGRpc3JlZ2FyZCB0aGlzIGNodW5rLi4uICovCisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgY2h1bmtfc2l6ZSAtIDYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5yZWNvZ25pemVkIGNodW5rIHR5cGU6ICVkXG4iLCBjaHVua190eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZnJhbWVfc2l6ZSAtPSBjaHVua19zaXplOworICAgICAgICBudW1fY2h1bmtzLS07CisgICAgfQorCisgICAgLyogYnkgdGhlIGVuZCBvZiB0aGUgY2h1bmssIHRoZSBzdHJlYW0gcHRyIHNob3VsZCBlcXVhbCB0aGUgZnJhbWUKKyAgICAgKiBzaXplIChtaW51cyAxLCBwb3NzaWJseSk7IGlmIGl0IGRvZXNuJ3QsIGlzc3VlIGEgd2FybmluZyAqLworICAgIGlmICgoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmcyKSAhPSAwKSAmJiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmcyKSAhPSAxKSkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcm9jZXNzZWQgRkxJIGNodW5rIHdoZXJlIGNodW5rIHNpemUgPSAlZCAiIFwKKyAgICAgICAgICAgICAgICJhbmQgZmluYWwgY2h1bmsgcHRyID0gJWRcbiIsIGJ1Zl9zaXplLCBieXRlc3RyZWFtMl90ZWxsKCZnMikpOworCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGludCBmbGljX2RlY29kZV9mcmFtZV8yNEJQUChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICIyNEJwcCBGTEMgVW5zdXBwb3J0ZWQgZHVlIHRvIGxhY2sgb2YgdGVzdCBmaWxlcy5cbiIpOworICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7Cit9CisKK3N0YXRpYyBpbnQgZmxpY19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpIHsKKyAgICAgIHJldHVybiBmbGljX2RlY29kZV9mcmFtZV84QlBQKGF2Y3R4LCBkYXRhLCBnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1Zl9zaXplKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCNTU1KSB8fAorICAgICAgICAgICAgIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjU2NSkpIHsKKyAgICAgIHJldHVybiBmbGljX2RlY29kZV9mcmFtZV8xNV8xNkJQUChhdmN0eCwgZGF0YSwgZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX3NpemUpOworICAgIH0KKyAgICBlbHNlIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjI0KSB7CisgICAgICByZXR1cm4gZmxpY19kZWNvZGVfZnJhbWVfMjRCUFAoYXZjdHgsIGRhdGEsIGdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1Zl9zaXplKTsKKyAgICB9CisKKyAgICAvKiBTaG91bGQgbm90IGdldCAgaGVyZSwgZXZlciBhcyB0aGUgcGl4X2ZtdCBpcyBwcm9jZXNzZWQgKi8KKyAgICAvKiBpbiBmbGljX2RlY29kZV9pbml0IGFuZCB0aGUgYWJvdmUgaWYgc2hvdWxkIGRlYWwgd2l0aCAqLworICAgIC8qIHRoZSBmaW5pdGUgc2V0IG9mIHBvc3NpYmlsaXRlcyBhbGxvd2FibGUgYnkgaGVyZS4gKi8KKyAgICAvKiBCdXQgaW4gY2FzZSB3ZSBkbywganVzdCBlcnJvciBvdXQuICovCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIEZMQyBmb3JtYXQsIG15IHNjaWVuY2UgY2Fubm90IGV4cGxhaW4gaG93IHRoaXMgaGFwcGVuZWQuXG4iKTsKKyAgICByZXR1cm4gQVZFUlJPUl9CVUc7Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IGZsaWNfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRmxpY0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfZmxpY19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJmbGljIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXV0b2Rlc2sgQW5pbWF0b3IgRmxpYyB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9GTElDLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGbGljRGVjb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmxpY19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmbGljX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZmxpY19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mbHYuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2Zsdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MWNmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mbHYuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogRkxWIHNwZWNpZmljIHByaXZhdGUgaGVhZGVyLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRkxWX0gKKyNkZWZpbmUgQVZDT0RFQ19GTFZfSAorCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCit2b2lkIGZmX2Zsdl9lbmNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBwaWN0dXJlX251bWJlcik7Cit2b2lkIGZmX2ZsdjJfZW5jb2RlX2FjX2VzYyhQdXRCaXRDb250ZXh0ICpwYiwgaW50IHNsZXZlbCwgaW50IGxldmVsLCBpbnQgcnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3QpOworCitpbnQgZmZfZmx2X2RlY29kZV9waWN0dXJlX2hlYWRlcihNcGVnRW5jQ29udGV4dCAqcyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0ZMVl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mbHZkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZsdmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMmJlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mbHZkZWMuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIEZMViBkZWNvZGluZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorCisjaW5jbHVkZSAiZmx2LmgiCisjaW5jbHVkZSAiaDI2My5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorCitpbnQgZmZfZmx2X2RlY29kZV9waWN0dXJlX2hlYWRlcihNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0OworCisgICAgLyogcGljdHVyZSBoZWFkZXIgKi8KKyAgICBpZiAoZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIDE3KSAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQmFkIHBpY3R1cmUgc3RhcnQgY29kZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBmb3JtYXQgPSBnZXRfYml0cygmcy0+Z2IsIDUpOworICAgIGlmIChmb3JtYXQgIT0gMCAmJiBmb3JtYXQgIT0gMSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkJhZCBwaWN0dXJlIGZvcm1hdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzLT5oMjYzX2ZsdiAgICAgICA9IGZvcm1hdCArIDE7CisgICAgcy0+cGljdHVyZV9udW1iZXIgPSBnZXRfYml0cygmcy0+Z2IsIDgpOyAvKiBwaWN0dXJlIHRpbWVzdGFtcCAqLworICAgIGZvcm1hdCAgICAgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgd2lkdGggID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgaGVpZ2h0ID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICB3aWR0aCAgPSBnZXRfYml0cygmcy0+Z2IsIDE2KTsKKyAgICAgICAgaGVpZ2h0ID0gZ2V0X2JpdHMoJnMtPmdiLCAxNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgd2lkdGggID0gMzUyOworICAgICAgICBoZWlnaHQgPSAyODg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgd2lkdGggID0gMTc2OworICAgICAgICBoZWlnaHQgPSAxNDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgd2lkdGggID0gMTI4OworICAgICAgICBoZWlnaHQgPSA5NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICB3aWR0aCAgPSAzMjA7CisgICAgICAgIGhlaWdodCA9IDI0MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICB3aWR0aCAgPSAxNjA7CisgICAgICAgIGhlaWdodCA9IDEyMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgd2lkdGggPSBoZWlnaHQgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUod2lkdGgsIGhlaWdodCwgMCwgcy0+YXZjdHgpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIHMtPndpZHRoICA9IHdpZHRoOworICAgIHMtPmhlaWdodCA9IGhlaWdodDsKKworICAgIHMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JICsgZ2V0X2JpdHMoJnMtPmdiLCAyKTsKKyAgICBzLT5kcm9wcGFibGUgPSBzLT5waWN0X3R5cGUgPiBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICBpZiAocy0+ZHJvcHBhYmxlKQorICAgICAgICBzLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKworICAgIHNraXBfYml0czEoJnMtPmdiKTsgLyogZGVibG9ja2luZyBmbGFnICovCisgICAgcy0+Y2hyb21hX3FzY2FsZSA9IHMtPnFzY2FsZSA9IGdldF9iaXRzKCZzLT5nYiwgNSk7CisKKyAgICBzLT5oMjYzX3BsdXMgPSAwOworCisgICAgcy0+dW5yZXN0cmljdGVkX212ICAgPSAxOworICAgIHMtPmgyNjNfbG9uZ192ZWN0b3JzID0gMDsKKworICAgIC8qIFBFSSAqLworICAgIGlmIChza2lwXzFzdG9wXzhkYXRhX2JpdHMoJnMtPmdiKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcy0+Zl9jb2RlID0gMTsKKworICAgIGlmIChzLT5laGNfbW9kZSkKKyAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW89IChBVlJhdGlvbmFsKXsxLDJ9OworCisgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIiVjIGVzY190eXBlOiVkLCBxcDolZCBudW06JWRcbiIsCisgICAgICAgICAgICAgICBzLT5kcm9wcGFibGUgPyAnRCcgOiBhdl9nZXRfcGljdHVyZV90eXBlX2NoYXIocy0+cGljdF90eXBlKSwKKyAgICAgICAgICAgICAgIHMtPmgyNjNfZmx2IC0gMSwgcy0+cXNjYWxlLCBzLT5waWN0dXJlX251bWJlcik7CisgICAgfQorCisgICAgcy0+eV9kY19zY2FsZV90YWJsZSA9IHMtPmNfZGNfc2NhbGVfdGFibGUgPSBmZl9tcGVnMV9kY19zY2FsZV90YWJsZTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2Zsdl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJmbHYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGTFYgLyBTb3JlbnNvbiBTcGFyayAvIFNvcmVuc29uIEguMjYzIChGbGFzaCBWaWRlbykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRkxWMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ0VuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBDT0RFQ19DQVBfRFIxLAorICAgIC5tYXhfbG93cmVzICAgICA9IDMsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZmx2ZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mbHZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzBiNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZmx2ZW5jLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBGTFYgRW5jb2Rpbmcgc3BlY2lmaWMgY29kZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImZsdi5oIgorI2luY2x1ZGUgImgyNjMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKwordm9pZCBmZl9mbHZfZW5jb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgcGljdHVyZV9udW1iZXIpCit7CisgICAgaW50IGZvcm1hdDsKKworICAgIGF2cHJpdl9hbGlnbl9wdXRfYml0cygmcy0+cGIpOworCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNywgMSk7CisgICAgLyogMDogaDI2MyBlc2NhcGUgY29kZXMgMTogMTEtYml0IGVzY2FwZSBjb2RlcyAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgKHMtPmgyNjNfZmx2IC0gMSkpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwKKyAgICAgICAgICAgICAoKChpbnQ2NF90KSBzLT5waWN0dXJlX251bWJlciAqIDMwICogcy0+YXZjdHgtPnRpbWVfYmFzZS5udW0pIC8gICAvLyBGSVhNRSB1c2UgdGltZXN0YW1wCisgICAgICAgICAgICAgIHMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuKSAmIDB4ZmYpOyAgIC8qIFRlbXBvcmFsUmVmZXJlbmNlICovCisgICAgaWYgKHMtPndpZHRoID09IDM1MiAmJiBzLT5oZWlnaHQgPT0gMjg4KQorICAgICAgICBmb3JtYXQgPSAyOworICAgIGVsc2UgaWYgKHMtPndpZHRoID09IDE3NiAmJiBzLT5oZWlnaHQgPT0gMTQ0KQorICAgICAgICBmb3JtYXQgPSAzOworICAgIGVsc2UgaWYgKHMtPndpZHRoID09IDEyOCAmJiBzLT5oZWlnaHQgPT0gOTYpCisgICAgICAgIGZvcm1hdCA9IDQ7CisgICAgZWxzZSBpZiAocy0+d2lkdGggPT0gMzIwICYmIHMtPmhlaWdodCA9PSAyNDApCisgICAgICAgIGZvcm1hdCA9IDU7CisgICAgZWxzZSBpZiAocy0+d2lkdGggPT0gMTYwICYmIHMtPmhlaWdodCA9PSAxMjApCisgICAgICAgIGZvcm1hdCA9IDY7CisgICAgZWxzZSBpZiAocy0+d2lkdGggPD0gMjU1ICYmIHMtPmhlaWdodCA8PSAyNTUpCisgICAgICAgIGZvcm1hdCA9IDA7ICAgLyogdXNlIDEgYnl0ZSB3aWR0aCAmIGhlaWdodCAqLworICAgIGVsc2UKKyAgICAgICAgZm9ybWF0ID0gMTsgICAvKiB1c2UgMiBieXRlcyB3aWR0aCAmIGhlaWdodCAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgZm9ybWF0KTsgICAvKiBQaWN0dXJlU2l6ZSAqLworICAgIGlmIChmb3JtYXQgPT0gMCkgeworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIHMtPndpZHRoKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCBzLT5oZWlnaHQpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IDEpIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgcy0+d2lkdGgpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDE2LCBzLT5oZWlnaHQpOworICAgIH0KKyAgICBwdXRfYml0cygmcy0+cGIsIDIsIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCk7ICAgLyogUGljdHVyZVR5cGUgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOyAgIC8qIERlYmxvY2tpbmdGbGFnOiBvbiAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgcy0+cXNjYWxlKTsgICAvKiBRdWFudGl6ZXIgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgIC8qIEV4dHJhSW5mb3JtYXRpb24gKi8KKworICAgIGlmIChzLT5oMjYzX2FpYykgeworICAgICAgICBzLT55X2RjX3NjYWxlX3RhYmxlID0KKyAgICAgICAgcy0+Y19kY19zY2FsZV90YWJsZSA9IGZmX2FpY19kY19zY2FsZV90YWJsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT55X2RjX3NjYWxlX3RhYmxlID0KKyAgICAgICAgcy0+Y19kY19zY2FsZV90YWJsZSA9IGZmX21wZWcxX2RjX3NjYWxlX3RhYmxlOworICAgIH0KK30KKwordm9pZCBmZl9mbHYyX2VuY29kZV9hY19lc2MoUHV0Qml0Q29udGV4dCAqcGIsIGludCBzbGV2ZWwsIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBydW4sIGludCBsYXN0KQoreworICAgIGlmIChsZXZlbCA8IDY0KSB7IC8vIDctYml0IGxldmVsCisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIGxhc3QpOworICAgICAgICBwdXRfYml0cyhwYiwgNiwgcnVuKTsKKworICAgICAgICBwdXRfc2JpdHMocGIsIDcsIHNsZXZlbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogMTEtYml0IGxldmVsICovCisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAxKTsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIGxhc3QpOworICAgICAgICBwdXRfYml0cyhwYiwgNiwgcnVuKTsKKworICAgICAgICBwdXRfc2JpdHMocGIsIDExLCBzbGV2ZWwpOworICAgIH0KK30KKworRkZfTVBWX0dFTkVSSUNfQ0xBU1MoZmx2KQorCitBVkNvZGVjIGZmX2Zsdl9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJmbHYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGTFYgLyBTb3JlbnNvbiBTcGFyayAvIFNvcmVuc29uIEguMjYzIChGbGFzaCBWaWRlbykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRkxWMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ0VuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX21wdl9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBmZl9tcHZfZW5jb2RlX3BpY3R1cmUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9lbmQsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZmx2X2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZtdGNvbnZlcnQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZtdGNvbnZlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQzMDJjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZm10Y29udmVydC5jCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogRm9ybWF0IENvbnZlcnNpb24gVXRpbHMKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZm10Y29udmVydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworc3RhdGljIHZvaWQgaW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXJfYyhmbG9hdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG11bCwgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoaT0wOyBpPGxlbjsgaSsrKQorICAgICAgICBkc3RbaV0gPSBzcmNbaV0gKiBtdWw7Cit9CisKK3N0YXRpYyB2b2lkIGludDMyX3RvX2Zsb2F0X2ZtdWxfYXJyYXk4X2MoRm10Q29udmVydENvbnRleHQgKmMsIGZsb2F0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKnNyYywgY29uc3QgZmxvYXQgKm11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpCisgICAgICAgIGMtPmludDMyX3RvX2Zsb2F0X2ZtdWxfc2NhbGFyKCZkc3RbaV0sICZzcmNbaV0sICptdWwrKywgOCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBmbG9hdF90b19pbnQxNl9vbmUoY29uc3QgZmxvYXQgKnNyYyl7CisgICAgcmV0dXJuIGF2X2NsaXBfaW50MTYobHJpbnRmKCpzcmMpKTsKK30KKworc3RhdGljIHZvaWQgZmxvYXRfdG9faW50MTZfYyhpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGxvbmcgbGVuKQoreworICAgIGludCBpOworICAgIGZvcihpPTA7IGk8bGVuOyBpKyspCisgICAgICAgIGRzdFtpXSA9IGZsb2F0X3RvX2ludDE2X29uZShzcmMraSk7Cit9CisKK3N0YXRpYyB2b2lkIGZsb2F0X3RvX2ludDE2X2ludGVybGVhdmVfYyhpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVuLCBpbnQgY2hhbm5lbHMpCit7CisgICAgaW50IGksaixjOworICAgIGlmKGNoYW5uZWxzPT0yKXsKKyAgICAgICAgZm9yKGk9MDsgaTxsZW47IGkrKyl7CisgICAgICAgICAgICBkc3RbMippXSAgID0gZmxvYXRfdG9faW50MTZfb25lKHNyY1swXStpKTsKKyAgICAgICAgICAgIGRzdFsyKmkrMV0gPSBmbG9hdF90b19pbnQxNl9vbmUoc3JjWzFdK2kpOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIGZvcihjPTA7IGM8Y2hhbm5lbHM7IGMrKykKKyAgICAgICAgICAgIGZvcihpPTAsIGo9YzsgaTxsZW47IGkrKywgais9Y2hhbm5lbHMpCisgICAgICAgICAgICAgICAgZHN0W2pdID0gZmxvYXRfdG9faW50MTZfb25lKHNyY1tjXStpKTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfZmxvYXRfaW50ZXJsZWF2ZV9jKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCB1bnNpZ25lZCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKQoreworICAgIGludCBqLCBjOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGlmIChjaGFubmVscyA9PSAyKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgZHN0WzIqaV0gICA9IHNyY1swXVtpXTsKKyAgICAgICAgICAgIGRzdFsyKmkrMV0gPSBzcmNbMV1baV07CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNoYW5uZWxzID09IDEgJiYgbGVuIDwgSU5UX01BWCAvIHNpemVvZihmbG9hdCkpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjWzBdLCBsZW4gKiBzaXplb2YoZmxvYXQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIGogPSBjOyBpIDwgbGVuOyBpKyssIGogKz0gY2hhbm5lbHMpCisgICAgICAgICAgICAgICAgZHN0W2pdID0gc3JjW2NdW2ldOworICAgIH0KK30KKworYXZfY29sZCB2b2lkIGZmX2ZtdF9jb252ZXJ0X2luaXQoRm10Q29udmVydENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBjLT5pbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhciA9IGludDMyX3RvX2Zsb2F0X2ZtdWxfc2NhbGFyX2M7CisgICAgYy0+aW50MzJfdG9fZmxvYXRfZm11bF9hcnJheTggPSBpbnQzMl90b19mbG9hdF9mbXVsX2FycmF5OF9jOworICAgIGMtPmZsb2F0X3RvX2ludDE2ICAgICAgICAgICAgID0gZmxvYXRfdG9faW50MTZfYzsKKyAgICBjLT5mbG9hdF90b19pbnQxNl9pbnRlcmxlYXZlICA9IGZsb2F0X3RvX2ludDE2X2ludGVybGVhdmVfYzsKKyAgICBjLT5mbG9hdF9pbnRlcmxlYXZlICAgICAgICAgICA9IGZmX2Zsb2F0X2ludGVybGVhdmVfYzsKKworICAgIGlmIChBUkNIX0FSTSkgZmZfZm10X2NvbnZlcnRfaW5pdF9hcm0oYywgYXZjdHgpOworICAgIGlmIChBUkNIX1BQQykgZmZfZm10X2NvbnZlcnRfaW5pdF9wcGMoYywgYXZjdHgpOworICAgIGlmIChBUkNIX1g4NikgZmZfZm10X2NvbnZlcnRfaW5pdF94ODYoYywgYXZjdHgpOworICAgIGlmIChIQVZFX01JUFNGUFUpIGZmX2ZtdF9jb252ZXJ0X2luaXRfbWlwcyhjKTsKK30KKworLyogZmZkc2hvdyBjdXN0b20gY29kZSAqLwordm9pZCBmbG9hdF9pbnRlcmxlYXZlKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCBsb25nIGxlbiwgaW50IGNoYW5uZWxzKQoreworICAgIGludCBpLGosYzsKKyAgICBpZihjaGFubmVscz09Mil7CisgICAgICAgIGZvcihpPTA7IGk8bGVuOyBpKyspeworICAgICAgICAgICAgZHN0WzIqaV0gICA9IHNyY1swXVtpXSAvIDMyNzY4LjBmOworICAgICAgICAgICAgZHN0WzIqaSsxXSA9IHNyY1sxXVtpXSAvIDMyNzY4LjBmOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIGZvcihjPTA7IGM8Y2hhbm5lbHM7IGMrKykKKyAgICAgICAgICAgIGZvcihpPTAsIGo9YzsgaTxsZW47IGkrKywgais9Y2hhbm5lbHMpCisgICAgICAgICAgICAgICAgZHN0W2pdID0gc3JjW2NdW2ldIC8gMzI3NjguMGY7CisgICAgfQorfQorCit2b2lkIGZsb2F0X2ludGVybGVhdmVfbm9zY2FsZShmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqKnNyYywgbG9uZyBsZW4sIGludCBjaGFubmVscykKK3sKKyAgICBpbnQgaSxqLGM7CisgICAgaWYoY2hhbm5lbHM9PTIpeworICAgICAgICBmb3IoaT0wOyBpPGxlbjsgaSsrKXsKKyAgICAgICAgICAgIGRzdFsyKmldICAgPSBzcmNbMF1baV07CisgICAgICAgICAgICBkc3RbMippKzFdID0gc3JjWzFdW2ldOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIGZvcihjPTA7IGM8Y2hhbm5lbHM7IGMrKykKKyAgICAgICAgICAgIGZvcihpPTAsIGo9YzsgaTxsZW47IGkrKywgais9Y2hhbm5lbHMpCisgICAgICAgICAgICAgICAgZHN0W2pdID0gc3JjW2NdW2ldOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZtdGNvbnZlcnQuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2ZtdGNvbnZlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFiY2MzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZm10Y29udmVydC5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogRm9ybWF0IENvbnZlcnNpb24gVXRpbHMKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19GTVRDT05WRVJUX0gKKyNkZWZpbmUgQVZDT0RFQ19GTVRDT05WRVJUX0gKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgRm10Q29udmVydENvbnRleHQgeworICAgIC8qKgorICAgICAqIENvbnZlcnQgYW4gYXJyYXkgb2YgaW50MzJfdCB0byBmbG9hdCBhbmQgbXVsdGlwbHkgYnkgYSBmbG9hdCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZHN0IGRlc3RpbmF0aW9uIGFycmF5IG9mIGZsb2F0LgorICAgICAqICAgICAgICAgICAgY29uc3RyYWludHM6IDE2LWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBzcmMgc291cmNlIGFycmF5IG9mIGludDMyX3QuCisgICAgICogICAgICAgICAgICBjb25zdHJhaW50czogMTYtYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIGxlbiBudW1iZXIgb2YgZWxlbWVudHMgdG8gY29udmVydC4KKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBtdWx0aXBsZSBvZiA4CisgICAgICovCisgICAgdm9pZCAoKmludDMyX3RvX2Zsb2F0X2ZtdWxfc2NhbGFyKShmbG9hdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtdWwsIGludCBsZW4pOworCisgICAgLyoqCisgICAgICogQ29udmVydCBhbiBhcnJheSBvZiBpbnQzMl90IHRvIGZsb2F0IGFuZCBtdWx0aXBseSBieSBhIGZsb2F0IHZhbHVlIGZyb20gYW5vdGhlciBhcnJheSwKKyAgICAgKiBzdGVwcGluZyBhbG9uZyB0aGUgZmxvYXQgYXJyYXkgb25jZSBmb3IgZWFjaCA4IGludGVnZXJzLgorICAgICAqIEBwYXJhbSBjICAgcG9pbnRlciB0byBGbXRDb252ZXJ0Q29udGV4dC4KKyAgICAgKiBAcGFyYW0gZHN0IGRlc3RpbmF0aW9uIGFycmF5IG9mIGZsb2F0LgorICAgICAqICAgICAgICAgICAgY29uc3RyYWludHM6IDE2LWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBzcmMgc291cmNlIGFycmF5IG9mIGludDMyX3QuCisgICAgICogICAgICAgICAgICBjb25zdHJhaW50czogMTYtYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIG11bCBzb3VyY2UgYXJyYXkgb2YgZmxvYXQgbXVsdGlwbGllcnMuCisgICAgICogQHBhcmFtIGxlbiBudW1iZXIgb2YgZWxlbWVudHMgdG8gY29udmVydC4KKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBtdWx0aXBsZSBvZiA4CisgICAgICovCisgICAgdm9pZCAoKmludDMyX3RvX2Zsb2F0X2ZtdWxfYXJyYXk4KShzdHJ1Y3QgRm10Q29udmVydENvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbXVsLCBpbnQgbGVuKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYW4gYXJyYXkgb2YgZmxvYXQgdG8gYW4gYXJyYXkgb2YgaW50MTZfdC4KKyAgICAgKgorICAgICAqIENvbnZlcnQgZmxvYXRzIGZyb20gaW4gdGhlIHJhbmdlIFstMzI3NjguMCwzMjc2Ny4wXSB0byBpbnRzCisgICAgICogd2l0aG91dCByZXNjYWxpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gYXJyYXkgb2YgaW50MTZfdC4KKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gc3JjIHNvdXJjZSBhcnJheSBvZiBmbG9hdC4KKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBlbGVtZW50cyB0byBjb252ZXJ0LgorICAgICAqICAgICAgICAgICAgY29uc3RyYWludHM6IG11bHRpcGxlIG9mIDgKKyAgICAgKi8KKyAgICB2b2lkICgqZmxvYXRfdG9faW50MTYpKGludDE2X3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgbG9uZyBsZW4pOworCisgICAgLyoqCisgICAgICogQ29udmVydCBtdWx0aXBsZSBhcnJheXMgb2YgZmxvYXQgdG8gYW4gaW50ZXJsZWF2ZWQgYXJyYXkgb2YgaW50MTZfdC4KKyAgICAgKgorICAgICAqIENvbnZlcnQgZmxvYXRzIGZyb20gaW4gdGhlIHJhbmdlIFstMzI3NjguMCwzMjc2Ny4wXSB0byBpbnRzCisgICAgICogd2l0aG91dCByZXNjYWxpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gYXJyYXkgb2YgaW50ZXJsZWF2ZWQgaW50MTZfdC4KKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gc3JjIHNvdXJjZSBhcnJheSBvZiBmbG9hdCBhcnJheXMsIG9uZSBmb3IgZWFjaCBjaGFubmVsLgorICAgICAqICAgICAgICAgICAgY29uc3RyYWludHM6IDE2LWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvbnZlcnQuCisgICAgICogICAgICAgICAgICBjb25zdHJhaW50czogbXVsdGlwbGUgb2YgOAorICAgICAqIEBwYXJhbSBjaGFubmVscyBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgKi8KKyAgICB2b2lkICgqZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZSkoaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsZW4sIGludCBjaGFubmVscyk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IG11bHRpcGxlIGFycmF5cyBvZiBmbG9hdCB0byBhbiBhcnJheSBvZiBpbnRlcmxlYXZlZCBmbG9hdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gYXJyYXkgb2YgaW50ZXJsZWF2ZWQgZmxvYXQuCisgICAgICogICAgICAgICAgICBjb25zdHJhaW50czogMTYtYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIHNyYyBzb3VyY2UgYXJyYXkgb2YgZmxvYXQgYXJyYXlzLCBvbmUgZm9yIGVhY2ggY2hhbm5lbC4KKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBlbGVtZW50cyB0byBjb252ZXJ0LgorICAgICAqICAgICAgICAgICAgY29uc3RyYWludHM6IG11bHRpcGxlIG9mIDgKKyAgICAgKiBAcGFyYW0gY2hhbm5lbHMgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICovCisgICAgdm9pZCAoKmZsb2F0X2ludGVybGVhdmUpKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCB1bnNpZ25lZCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOworfSBGbXRDb252ZXJ0Q29udGV4dDsKKwordm9pZCBmZl9mbG9hdF9pbnRlcmxlYXZlX2MoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKipzcmMsIHVuc2lnbmVkIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOworCit2b2lkIGZmX2ZtdF9jb252ZXJ0X2luaXQoRm10Q29udmVydENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK3ZvaWQgZmZfZm10X2NvbnZlcnRfaW5pdF9hcm0oRm10Q29udmVydENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cit2b2lkIGZmX2ZtdF9jb252ZXJ0X2luaXRfcHBjKEZtdENvbnZlcnRDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl9mbXRfY29udmVydF9pbml0X3g4NihGbXRDb252ZXJ0Q29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK3ZvaWQgZmZfZm10X2NvbnZlcnRfaW5pdF9taXBzKEZtdENvbnZlcnRDb250ZXh0ICpjKTsKKworLyogZmZkc2hvdyBjdXN0b20gY29kZSAqLwordm9pZCBmbG9hdF9pbnRlcmxlYXZlKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCBsb25nIGxlbiwgaW50IGNoYW5uZWxzKTsKK3ZvaWQgZmxvYXRfaW50ZXJsZWF2ZV9ub3NjYWxlKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCBsb25nIGxlbiwgaW50IGNoYW5uZWxzKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfRk1UQ09OVkVSVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mcmFtZV90aHJlYWRfZW5jb2Rlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZnJhbWVfdGhyZWFkX2VuY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFlOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZnJhbWVfdGhyZWFkX2VuY29kZXIuYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZnJhbWVfdGhyZWFkX2VuY29kZXIuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9maWZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisKKyNpZiBIQVZFX1BUSFJFQURTCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VsaWYgSEFWRV9XMzJUSFJFQURTCisjaW5jbHVkZSAiY29tcGF0L3czMnB0aHJlYWRzLmgiCisjZWxpZiBIQVZFX09TMlRIUkVBRFMKKyNpbmNsdWRlICJjb21wYXQvb3MydGhyZWFkcy5oIgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX1RIUkVBRFMgNjQKKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDIqTUFYX1RIUkVBRFMpCisKK3R5cGVkZWYgc3RydWN0eworICAgIHZvaWQgKmluZGF0YTsKKyAgICB2b2lkICpvdXRkYXRhOworICAgIGludDY0X3QgcmV0dXJuX2NvZGU7CisgICAgdW5zaWduZWQgaW5kZXg7Cit9IFRhc2s7CisKK3R5cGVkZWYgc3RydWN0eworICAgIEFWQ29kZWNDb250ZXh0ICpwYXJlbnRfYXZjdHg7CisgICAgcHRocmVhZF9tdXRleF90IGJ1ZmZlcl9tdXRleDsKKworICAgIEFWRmlmb0J1ZmZlciAqdGFza19maWZvOworICAgIHB0aHJlYWRfbXV0ZXhfdCB0YXNrX2ZpZm9fbXV0ZXg7CisgICAgcHRocmVhZF9jb25kX3QgdGFza19maWZvX2NvbmQ7CisKKyAgICBUYXNrIGZpbmlzaGVkX3Rhc2tzW0JVRkZFUl9TSVpFXTsKKyAgICBwdGhyZWFkX211dGV4X3QgZmluaXNoZWRfdGFza19tdXRleDsKKyAgICBwdGhyZWFkX2NvbmRfdCBmaW5pc2hlZF90YXNrX2NvbmQ7CisKKyAgICB1bnNpZ25lZCB0YXNrX2luZGV4OworICAgIHVuc2lnbmVkIGZpbmlzaGVkX3Rhc2tfaW5kZXg7CisKKyAgICBwdGhyZWFkX3Qgd29ya2VyW01BWF9USFJFQURTXTsKKyAgICBpbnQgZXhpdDsKK30gVGhyZWFkQ29udGV4dDsKKworc3RhdGljIHZvaWQgKiBhdHRyaWJ1dGVfYWxpZ25fYXJnIHdvcmtlcih2b2lkICp2KXsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSB2OworICAgIFRocmVhZENvbnRleHQgKmMgPSBhdmN0eC0+aW50ZXJuYWwtPmZyYW1lX3RocmVhZF9lbmNvZGVyOworICAgIEFWUGFja2V0ICpwa3QgPSBOVUxMOworCisgICAgd2hpbGUoIWMtPmV4aXQpeworICAgICAgICBpbnQgZ290X3BhY2tldCwgcmV0OworICAgICAgICBBVkZyYW1lICpmcmFtZTsKKyAgICAgICAgVGFzayB0YXNrOworCisgICAgICAgIGlmKCFwa3QpIHBrdD0gYXZfbWFsbG9jeihzaXplb2YoKnBrdCkpOworICAgICAgICBpZighcGt0KSBjb250aW51ZTsKKyAgICAgICAgYXZfaW5pdF9wYWNrZXQocGt0KTsKKworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmMtPnRhc2tfZmlmb19tdXRleCk7CisgICAgICAgIHdoaWxlIChhdl9maWZvX3NpemUoYy0+dGFza19maWZvKSA8PSAwIHx8IGMtPmV4aXQpIHsKKyAgICAgICAgICAgIGlmKGMtPmV4aXQpeworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjLT50YXNrX2ZpZm9fbXV0ZXgpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmMtPnRhc2tfZmlmb19jb25kLCAmYy0+dGFza19maWZvX211dGV4KTsKKyAgICAgICAgfQorICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChjLT50YXNrX2ZpZm8sICZ0YXNrLCBzaXplb2YodGFzayksIE5VTEwpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYy0+dGFza19maWZvX211dGV4KTsKKyAgICAgICAgZnJhbWUgPSB0YXNrLmluZGF0YTsKKworICAgICAgICByZXQgPSBhdmNvZGVjX2VuY29kZV92aWRlbzIoYXZjdHgsIHBrdCwgZnJhbWUsICZnb3RfcGFja2V0KTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjLT5idWZmZXJfbXV0ZXgpOworICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjLT5idWZmZXJfbXV0ZXgpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgIGlmKGdvdF9wYWNrZXQpIHsKKyAgICAgICAgICAgIGF2X2R1cF9wYWNrZXQocGt0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBrdC0+ZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBwa3QtPnNpemUgPSAwOworICAgICAgICB9CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+ZmluaXNoZWRfdGFza19tdXRleCk7CisgICAgICAgIGMtPmZpbmlzaGVkX3Rhc2tzW3Rhc2suaW5kZXhdLm91dGRhdGEgPSBwa3Q7IHBrdCA9IE5VTEw7CisgICAgICAgIGMtPmZpbmlzaGVkX3Rhc2tzW3Rhc2suaW5kZXhdLnJldHVybl9jb2RlID0gcmV0OworICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZjLT5maW5pc2hlZF90YXNrX2NvbmQpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYy0+ZmluaXNoZWRfdGFza19tdXRleCk7CisgICAgfQorZW5kOgorICAgIGF2X2ZyZWUocGt0KTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmMtPmJ1ZmZlcl9tdXRleCk7CisgICAgYXZjb2RlY19jbG9zZShhdmN0eCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPmJ1ZmZlcl9tdXRleCk7CisgICAgYXZfZnJlZXAoJmF2Y3R4KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IGZmX2ZyYW1lX3RocmVhZF9lbmNvZGVyX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkRpY3Rpb25hcnkgKm9wdGlvbnMpeworICAgIGludCBpPTA7CisgICAgVGhyZWFkQ29udGV4dCAqYzsKKworCisgICAgaWYoICAgIShhdmN0eC0+dGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpCisgICAgICAgfHwgIShhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIENPREVDX0NBUF9JTlRSQV9PTkxZKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiggICAhYXZjdHgtPnRocmVhZF9jb3VudAorICAgICAgICYmIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRworICAgICAgICYmICEoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgIkZvcmNpbmcgdGhyZWFkIGNvdW50IHRvIDEgZm9yIE1KUEVHIGVuY29kaW5nLCB1c2UgLXRocmVhZF90eXBlIHNsaWNlICIKKyAgICAgICAgICAgICAgICJvciBhIGNvbnN0YW50IHF1YW50aXplciBpZiB5b3Ugd2FudCB0byB1c2UgbXVsdGlwbGUgY3B1IGNvcmVzXG4iKTsKKyAgICAgICAgYXZjdHgtPnRocmVhZF9jb3VudCA9IDE7CisgICAgfQorICAgIGlmKCAgIGF2Y3R4LT50aHJlYWRfY291bnQgPiAxCisgICAgICAgJiYgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01KUEVHCisgICAgICAgJiYgIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FTQ0FMRSkpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiTUpQRUcgQ0JSIGVuY29kaW5nIHdvcmtzIGJhZGx5IHdpdGggZnJhbWUgbXVsdGktdGhyZWFkaW5nLCBjb25zaWRlciAiCisgICAgICAgICAgICAgICAidXNpbmcgLXRocmVhZHMgMSwgLXRocmVhZF90eXBlIHNsaWNlIG9yIGEgY29uc3RhbnQgcXVhbnRpemVyLlxuIik7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0hVRkZZVVYgfHwKKyAgICAgICAgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZGVkhVRkYpIHsKKyAgICAgICAgaW50IHdhcm4gPSAwOworICAgICAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19QQVNTMSkKKyAgICAgICAgICAgIHdhcm4gPSAxOworICAgICAgICBlbHNlIGlmKGF2Y3R4LT5jb250ZXh0X21vZGVsID4gMCkgeworICAgICAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBhdl9kaWN0X2dldChvcHRpb25zLCAibm9uX2RldGVybWluaXN0aWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBBVl9ESUNUX01BVENIX0NBU0UpOworICAgICAgICAgICAgd2FybiA9ICF0IHx8ICF0LT52YWx1ZSB8fCAhYXRvaSh0LT52YWx1ZSkgPyAxIDogMDsKKyAgICAgICAgfQorICAgICAgICAvLyBodWZmeXV2IGRvZXMgbm90IHN1cHBvcnQgdGhlc2Ugd2l0aCBtdWx0aXBsZSBmcmFtZSB0aHJlYWRzIGN1cnJlbnRseQorICAgICAgICBpZiAod2FybikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJGb3JjaW5nIHRocmVhZCBjb3VudCB0byAxIGZvciBodWZmeXV2IGVuY29kaW5nIHdpdGggZmlyc3QgcGFzcyBvciBjb250ZXh0IDFcbiIpOworICAgICAgICAgICAgYXZjdHgtPnRocmVhZF9jb3VudCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZighYXZjdHgtPnRocmVhZF9jb3VudCkgeworICAgICAgICBhdmN0eC0+dGhyZWFkX2NvdW50ID0gYXZfY3B1X2NvdW50KCk7CisgICAgICAgIGF2Y3R4LT50aHJlYWRfY291bnQgPSBGRk1JTihhdmN0eC0+dGhyZWFkX2NvdW50LCBNQVhfVEhSRUFEUyk7CisgICAgfQorCisgICAgaWYoYXZjdHgtPnRocmVhZF9jb3VudCA8PSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmKGF2Y3R4LT50aHJlYWRfY291bnQgPiBNQVhfVEhSRUFEUykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGF2X2Fzc2VydDAoIWF2Y3R4LT5pbnRlcm5hbC0+ZnJhbWVfdGhyZWFkX2VuY29kZXIpOworICAgIGMgPSBhdmN0eC0+aW50ZXJuYWwtPmZyYW1lX3RocmVhZF9lbmNvZGVyID0gYXZfbWFsbG9jeihzaXplb2YoVGhyZWFkQ29udGV4dCkpOworICAgIGlmKCFjKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYy0+cGFyZW50X2F2Y3R4ID0gYXZjdHg7CisKKyAgICBjLT50YXNrX2ZpZm8gPSBhdl9maWZvX2FsbG9jX2FycmF5KEJVRkZFUl9TSVpFLCBzaXplb2YoVGFzaykpOworICAgIGlmKCFjLT50YXNrX2ZpZm8pCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmYy0+dGFza19maWZvX211dGV4LCBOVUxMKTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmMtPmZpbmlzaGVkX3Rhc2tfbXV0ZXgsIE5VTEwpOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmYy0+YnVmZmVyX211dGV4LCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmYy0+dGFza19maWZvX2NvbmQsIE5VTEwpOworICAgIHB0aHJlYWRfY29uZF9pbml0KCZjLT5maW5pc2hlZF90YXNrX2NvbmQsIE5VTEwpOworCisgICAgZm9yKGk9MDsgaTxhdmN0eC0+dGhyZWFkX2NvdW50IDsgaSsrKXsKKyAgICAgICAgQVZEaWN0aW9uYXJ5ICp0bXAgPSBOVUxMOworICAgICAgICB2b2lkICp0bXB2OworICAgICAgICBBVkNvZGVjQ29udGV4dCAqdGhyZWFkX2F2Y3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhhdmN0eC0+Y29kZWMpOworICAgICAgICBpZighdGhyZWFkX2F2Y3R4KQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB0bXB2ID0gdGhyZWFkX2F2Y3R4LT5wcml2X2RhdGE7CisgICAgICAgICp0aHJlYWRfYXZjdHggPSAqYXZjdHg7CisgICAgICAgIHRocmVhZF9hdmN0eC0+cHJpdl9kYXRhID0gdG1wdjsKKyAgICAgICAgdGhyZWFkX2F2Y3R4LT5pbnRlcm5hbCA9IE5VTEw7CisgICAgICAgIG1lbWNweSh0aHJlYWRfYXZjdHgtPnByaXZfZGF0YSwgYXZjdHgtPnByaXZfZGF0YSwgYXZjdHgtPmNvZGVjLT5wcml2X2RhdGFfc2l6ZSk7CisgICAgICAgIHRocmVhZF9hdmN0eC0+dGhyZWFkX2NvdW50ID0gMTsKKyAgICAgICAgdGhyZWFkX2F2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJj0gfkZGX1RIUkVBRF9GUkFNRTsKKworICAgICAgICBhdl9kaWN0X2NvcHkoJnRtcCwgb3B0aW9ucywgMCk7CisgICAgICAgIGF2X2RpY3Rfc2V0KCZ0bXAsICJ0aHJlYWRzIiwgIjEiLCAwKTsKKyAgICAgICAgaWYoYXZjb2RlY19vcGVuMih0aHJlYWRfYXZjdHgsIGF2Y3R4LT5jb2RlYywgJnRtcCkgPCAwKSB7CisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJnRtcCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgYXZfZGljdF9mcmVlKCZ0bXApOworICAgICAgICBhdl9hc3NlcnQwKCF0aHJlYWRfYXZjdHgtPmludGVybmFsLT5mcmFtZV90aHJlYWRfZW5jb2Rlcik7CisgICAgICAgIHRocmVhZF9hdmN0eC0+aW50ZXJuYWwtPmZyYW1lX3RocmVhZF9lbmNvZGVyID0gYzsKKyAgICAgICAgaWYocHRocmVhZF9jcmVhdGUoJmMtPndvcmtlcltpXSwgTlVMTCwgd29ya2VyLCB0aHJlYWRfYXZjdHgpKSB7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlID0gRkZfVEhSRUFEX0ZSQU1FOworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGF2Y3R4LT50aHJlYWRfY291bnQgPSBpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZmZfZnJhbWVfdGhyZWFkX2VuY29kZXJfaW5pdCBmYWlsZWRcbiIpOworICAgIGZmX2ZyYW1lX3RocmVhZF9lbmNvZGVyX2ZyZWUoYXZjdHgpOworICAgIHJldHVybiAtMTsKK30KKwordm9pZCBmZl9mcmFtZV90aHJlYWRfZW5jb2Rlcl9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCl7CisgICAgaW50IGk7CisgICAgVGhyZWFkQ29udGV4dCAqYz0gYXZjdHgtPmludGVybmFsLT5mcmFtZV90aHJlYWRfZW5jb2RlcjsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+dGFza19maWZvX211dGV4KTsKKyAgICBjLT5leGl0ID0gMTsKKyAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZjLT50YXNrX2ZpZm9fY29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPnRhc2tfZmlmb19tdXRleCk7CisKKyAgICBmb3IgKGk9MDsgaTxhdmN0eC0+dGhyZWFkX2NvdW50OyBpKyspIHsKKyAgICAgICAgIHB0aHJlYWRfam9pbihjLT53b3JrZXJbaV0sIE5VTEwpOworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmYy0+dGFza19maWZvX211dGV4KTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmMtPmZpbmlzaGVkX3Rhc2tfbXV0ZXgpOworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmYy0+YnVmZmVyX211dGV4KTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmYy0+dGFza19maWZvX2NvbmQpOworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZjLT5maW5pc2hlZF90YXNrX2NvbmQpOworICAgIGF2X2ZpZm9fZnJlZXAoJmMtPnRhc2tfZmlmbyk7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5pbnRlcm5hbC0+ZnJhbWVfdGhyZWFkX2VuY29kZXIpOworfQorCitpbnQgZmZfdGhyZWFkX3ZpZGVvX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKXsKKyAgICBUaHJlYWRDb250ZXh0ICpjID0gYXZjdHgtPmludGVybmFsLT5mcmFtZV90aHJlYWRfZW5jb2RlcjsKKyAgICBUYXNrIHRhc2s7CisgICAgaW50IHJldDsKKworICAgIGF2X2Fzc2VydDEoISpnb3RfcGFja2V0X3B0cik7CisKKyAgICBpZihmcmFtZSl7CisgICAgICAgIGlmKCEoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19JTlBVVF9QUkVTRVJWRUQpKXsKKyAgICAgICAgICAgIEFWRnJhbWUgKm5ldyA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgICAgICBpZighbmV3KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmMtPmJ1ZmZlcl9tdXRleCk7CisgICAgICAgICAgICByZXQgPSBmZl9nZXRfYnVmZmVyKGMtPnBhcmVudF9hdmN0eCwgbmV3LCAwKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjLT5idWZmZXJfbXV0ZXgpOworICAgICAgICAgICAgaWYocmV0PDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIG5ldy0+cHRzID0gZnJhbWUtPnB0czsKKyAgICAgICAgICAgIG5ldy0+cXVhbGl0eSA9IGZyYW1lLT5xdWFsaXR5OworICAgICAgICAgICAgbmV3LT5waWN0X3R5cGUgPSBmcmFtZS0+cGljdF90eXBlOworICAgICAgICAgICAgYXZfaW1hZ2VfY29weShuZXctPmRhdGEsIG5ldy0+bGluZXNpemUsIChjb25zdCB1aW50OF90ICoqKWZyYW1lLT5kYXRhLCBmcmFtZS0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworICAgICAgICAgICAgZnJhbWUgPSBuZXc7CisgICAgICAgIH0KKworICAgICAgICB0YXNrLmluZGV4ID0gYy0+dGFza19pbmRleDsKKyAgICAgICAgdGFzay5pbmRhdGEgPSAodm9pZCopZnJhbWU7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+dGFza19maWZvX211dGV4KTsKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGMtPnRhc2tfZmlmbywgJnRhc2ssIHNpemVvZih0YXNrKSwgTlVMTCk7CisgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmMtPnRhc2tfZmlmb19jb25kKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPnRhc2tfZmlmb19tdXRleCk7CisKKyAgICAgICAgYy0+dGFza19pbmRleCA9IChjLT50YXNrX2luZGV4KzEpICUgQlVGRkVSX1NJWkU7CisKKyAgICAgICAgaWYoIWMtPmZpbmlzaGVkX3Rhc2tzW2MtPmZpbmlzaGVkX3Rhc2tfaW5kZXhdLm91dGRhdGEgJiYgKGMtPnRhc2tfaW5kZXggLSBjLT5maW5pc2hlZF90YXNrX2luZGV4KSAlIEJVRkZFUl9TSVpFIDw9IGF2Y3R4LT50aHJlYWRfY291bnQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZihjLT50YXNrX2luZGV4ID09IGMtPmZpbmlzaGVkX3Rhc2tfaW5kZXgpCisgICAgICAgIHJldHVybiAwOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjLT5maW5pc2hlZF90YXNrX211dGV4KTsKKyAgICB3aGlsZSAoIWMtPmZpbmlzaGVkX3Rhc2tzW2MtPmZpbmlzaGVkX3Rhc2tfaW5kZXhdLm91dGRhdGEpIHsKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmMtPmZpbmlzaGVkX3Rhc2tfY29uZCwgJmMtPmZpbmlzaGVkX3Rhc2tfbXV0ZXgpOworICAgIH0KKyAgICB0YXNrID0gYy0+ZmluaXNoZWRfdGFza3NbYy0+ZmluaXNoZWRfdGFza19pbmRleF07CisgICAgKnBrdCA9ICooQVZQYWNrZXQqKSh0YXNrLm91dGRhdGEpOworICAgIGlmKHBrdC0+ZGF0YSkKKyAgICAgICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKKyAgICBhdl9mcmVlcCgmYy0+ZmluaXNoZWRfdGFza3NbYy0+ZmluaXNoZWRfdGFza19pbmRleF0ub3V0ZGF0YSk7CisgICAgYy0+ZmluaXNoZWRfdGFza19pbmRleCA9IChjLT5maW5pc2hlZF90YXNrX2luZGV4KzEpICUgQlVGRkVSX1NJWkU7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPmZpbmlzaGVkX3Rhc2tfbXV0ZXgpOworCisgICAgcmV0dXJuIHRhc2sucmV0dXJuX2NvZGU7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mcmFtZV90aHJlYWRfZW5jb2Rlci5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZnJhbWVfdGhyZWFkX2VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGEwY2UxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZnJhbWVfdGhyZWFkX2VuY29kZXIuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKK2ludCBmZl9mcmFtZV90aHJlYWRfZW5jb2Rlcl9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZEaWN0aW9uYXJ5ICpvcHRpb25zKTsKK3ZvaWQgZmZfZnJhbWVfdGhyZWFkX2VuY29kZXJfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworaW50IGZmX3RocmVhZF92aWRlb19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LCBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cik7CisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ZyYXBzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mcmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTg2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9mcmFwcy5jCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogRnJhcHMgRlBTMSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgUm9pbmUgR3VzdGFmc3NvbgorICogQ29weXJpZ2h0IChjKSAyMDA2IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTG9zc2xlc3MgRnJhcHMgJ0ZQUzEnIGRlY29kZXIKKyAqIEBhdXRob3IgUm9pbmUgR3VzdGFmc3NvbiAocm9pbmUgYXQgdXNlcnMgc2YgbmV0KQorICogQGF1dGhvciBLb25zdGFudGluIFNoaXNoa292CisgKgorICogQ29kZWMgYWxnb3JpdGhtIGZvciB2ZXJzaW9uIDAgaXMgdGFrZW4gZnJvbSBUcmFuc2NvZGUgPHd3dy50cmFuc2NvZGluZy5vcmc+CisgKgorICogVmVyc2lvbiAyIGZpbGVzIHN1cHBvcnQgYnkgS29uc3RhbnRpbiBTaGlzaGtvdgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJodWZmbWFuLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKworI2RlZmluZSBGUFNfVEFHIE1LVEFHKCdGJywgJ1AnLCAnUycsICd4JykKKyNkZWZpbmUgVkxDX0JJVFMgMTEKKworLyoqCisgKiBsb2NhbCB2YXJpYWJsZSBzdG9yYWdlCisgKi8KK3R5cGVkZWYgc3RydWN0IEZyYXBzQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEJzd2FwRFNQQ29udGV4dCBiZHNwOworICAgIHVpbnQ4X3QgKnRtcGJ1ZjsKKyAgICBpbnQgdG1wYnVmX3NpemU7Cit9IEZyYXBzQ29udGV4dDsKKworCisvKioKKyAqIGluaXRpYWxpemVzIGRlY29kZXIKKyAqIEBwYXJhbSBhdmN0eCBjb2RlYyBjb250ZXh0CisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBpZiBmYWlscworICovCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZyYXBzQ29udGV4dCAqIGNvbnN0IHMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggID0gYXZjdHg7CisgICAgcy0+dG1wYnVmID0gTlVMTDsKKworICAgIGZmX2Jzd2FwZHNwX2luaXQoJnMtPmJkc3ApOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29tcGFyYXRvciAtIG91ciBub2RlcyBzaG91bGQgYXNjZW5kIGJ5IGNvdW50CisgKiBidXQgd2l0aCBwcmVzZXJ2ZWQgc3ltYm9sIG9yZGVyCisgKi8KK3N0YXRpYyBpbnQgaHVmZl9jbXAoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQoreworICAgIGNvbnN0IE5vZGUgKmEgPSB2YSwgKmIgPSB2YjsKKyAgICByZXR1cm4gKGEtPmNvdW50IC0gYi0+Y291bnQpKjI1NiArIGEtPnN5bSAtIGItPnN5bTsKK30KKworLyoqCisgKiBkZWNvZGUgRnJhcHMgdjIgcGFja2VkIHBsYW5lCisgKi8KK3N0YXRpYyBpbnQgZnJhcHMyX2RlY29kZV9wbGFuZShGcmFwc0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNpemUsIGludCBVb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdGVwKQoreworICAgIGludCBpLCBqLCByZXQ7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBWTEMgdmxjOworICAgIE5vZGUgbm9kZXNbNTEyXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgbm9kZXNbaV0uY291bnQgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZzcmMpOworICAgIHNpemUgLT0gMTAyNDsKKyAgICBpZiAoKHJldCA9IGZmX2h1ZmZfYnVpbGRfdHJlZShzLT5hdmN0eCwgJnZsYywgMjU2LCBWTENfQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlcywgaHVmZl9jbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSFVGRk1BTl9GTEFHX1pFUk9fQ09VTlQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgLyogd2UgaGF2ZSBidWlsdCBIdWZmbWFuIHRhYmxlIGFuZCBhcmUgcmVhZHkgdG8gZGVjb2RlIHBsYW5lICovCisKKyAgICAvKiBjb252ZXJ0IGJpdHMgc28gdGhleSBtYXkgYmUgdXNlZCBieSBzdGFuZGFyZCBiaXRyZWFkZXIgKi8KKyAgICBzLT5iZHNwLmJzd2FwX2J1ZigodWludDMyX3QgKikgcy0+dG1wYnVmLAorICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50MzJfdCAqKSBzcmMsIHNpemUgPj4gMik7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgcy0+dG1wYnVmLCBzaXplICogOCk7CisgICAgZm9yIChqID0gMDsgaiA8IGg7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdypzdGVwOyBpICs9IHN0ZXApIHsKKyAgICAgICAgICAgIGRzdFtpXSA9IGdldF92bGMyKCZnYiwgdmxjLnRhYmxlLCBWTENfQklUUywgMyk7CisgICAgICAgICAgICAvKiBsaW5lcyBhcmUgc3RvcmVkIGFzIGRlbHRhcyBiZXR3ZWVuIHByZXZpb3VzIGxpbmVzCisgICAgICAgICAgICAgKiBhbmQgd2UgbmVlZCB0byBhZGQgMHg4MCB0byB0aGUgZmlyc3QgbGluZXMgb2YgY2hyb21hIHBsYW5lcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoaikKKyAgICAgICAgICAgICAgICBkc3RbaV0gKz0gZHN0W2kgLSBzdHJpZGVdOworICAgICAgICAgICAgZWxzZSBpZiAoVW9mZikKKyAgICAgICAgICAgICAgICBkc3RbaV0gKz0gMHg4MDsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPCAwKSB7CisgICAgICAgICAgICAgICAgZmZfZnJlZV92bGMoJnZsYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9CisgICAgZmZfZnJlZV92bGMoJnZsYyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEZyYXBzQ29udGV4dCAqIGNvbnN0IHMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiAgICAgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgVGhyZWFkRnJhbWUgZnJhbWUgPSB7IC5mID0gZGF0YSB9OworICAgIEFWRnJhbWUgKiBjb25zdCBmID0gZGF0YTsKKyAgICB1aW50MzJfdCBoZWFkZXI7CisgICAgdW5zaWduZWQgaW50IHZlcnNpb24saGVhZGVyX3NpemU7CisgICAgdW5zaWduZWQgaW50IHgsIHk7CisgICAgY29uc3QgdWludDMyX3QgKmJ1ZjMyOworICAgIHVpbnQzMl90ICpsdW1hMSwqbHVtYTIsKmNiLCpjcjsKKyAgICB1aW50MzJfdCBvZmZzWzRdOworICAgIGludCBpLCBqLCByZXQsIGlzX2Nocm9tYTsKKyAgICBjb25zdCBpbnQgcGxhbmVzID0gMzsKKyAgICB1aW50OF90ICpvdXQ7CisKKyAgICBpZiAoYnVmX3NpemUgPCA0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGlzIHRvbyBzaG9ydFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGhlYWRlciAgICAgID0gQVZfUkwzMihidWYpOworICAgIHZlcnNpb24gICAgID0gaGVhZGVyICYgMHhmZjsKKyAgICBoZWFkZXJfc2l6ZSA9IChoZWFkZXIgJiAoMTw8MzApKT8gOCA6IDQ7IC8qIGJpdCAzMCBtZWFucyBwYWQgdG8gOCBieXRlcyAqLworCisgICAgaWYgKHZlcnNpb24gPiA1KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoaXMgZmlsZSBpcyBlbmNvZGVkIHdpdGggRnJhcHMgdmVyc2lvbiAlZC4gIiBcCisgICAgICAgICAgICAgICAiVGhpcyBjb2RlYyBjYW4gb25seSBkZWNvZGUgdmVyc2lvbnMgPD0gNS5cbiIsIHZlcnNpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgYnVmICs9IGhlYWRlcl9zaXplOworCisgICAgaWYgKHZlcnNpb24gPCAyKSB7CisgICAgICAgIHVuc2lnbmVkIG5lZWRlZF9zaXplID0gYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqIDM7CisgICAgICAgIGlmICh2ZXJzaW9uID09IDApIG5lZWRlZF9zaXplIC89IDI7CisgICAgICAgIG5lZWRlZF9zaXplICs9IGhlYWRlcl9zaXplOworICAgICAgICAvKiBiaXQgMzEgbWVhbnMgc2FtZSBhcyBwcmV2aW91cyBwaWMgKi8KKyAgICAgICAgaWYgKGhlYWRlciAmICgxVTw8MzEpKSB7CisgICAgICAgICAgICAqZ290X2ZyYW1lID0gMDsKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmX3NpemUgIT0gbmVlZGVkX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZyYW1lIGxlbmd0aCAlZCAoc2hvdWxkIGJlICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSwgbmVlZGVkX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBza2lwIGZyYW1lICovCisgICAgICAgIGlmIChidWZfc2l6ZSA9PSA4KSB7CisgICAgICAgICAgICAqZ290X2ZyYW1lID0gMDsKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQVZfUkwzMihidWYpICE9IEZQU19UQUcgfHwgYnVmX3NpemUgPCBwbGFuZXMqMTAyNCArIDI0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZyYXBzOiBlcnJvciBpbiBkYXRhIHN0cmVhbVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIG9mZnNbaV0gPSBBVl9STDMyKGJ1ZiArIDQgKyBpICogNCk7CisgICAgICAgICAgICBpZiAob2Zmc1tpXSA+PSBidWZfc2l6ZSAtIGhlYWRlcl9zaXplIHx8IChpICYmIG9mZnNbaV0gPD0gb2Zmc1tpIC0gMV0gKyAxMDI0KSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRnJhcHM6IHBsYW5lICVpIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzXG4iLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvZmZzW3BsYW5lc10gPSBidWZfc2l6ZSAtIGhlYWRlcl9zaXplOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcy0+dG1wYnVmLCAmcy0+dG1wYnVmX3NpemUsIG9mZnNbaSArIDFdIC0gb2Zmc1tpXSAtIDEwMjQpOworICAgICAgICAgICAgaWYgKCFzLT50bXBidWYpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGYtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGYtPmtleV9mcmFtZSA9IDE7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IHZlcnNpb24gJiAxID8gQVZfUElYX0ZNVF9CR1IyNCA6IEFWX1BJWF9GTVRfWVVWSjQyMFA7CisgICAgYXZjdHgtPmNvbG9yX3JhbmdlID0gdmVyc2lvbiAmIDEgPyBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZDT0xfUkFOR0VfSlBFRzsKKyAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IHZlcnNpb24gJiAxID8gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEIDogQVZDT0xfU1BDX0JUNzA5OworCisgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJmZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgY2FzZSAwOgorICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIEZyYXBzIHYwIGlzIGEgcmVvcmRlcmVkIFlVVjQyMCAqLworICAgICAgICBpZiAoKChhdmN0eC0+d2lkdGggJSA4KSAhPSAwKSB8fCAoKGF2Y3R4LT5oZWlnaHQgJSAyKSAhPSAwKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGZyYW1lIHNpemUgJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgYnVmMzIgPSAoY29uc3QgdWludDMyX3QqKWJ1ZjsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQgLyAyOyB5KyspIHsKKyAgICAgICAgICAgIGx1bWExID0gKHVpbnQzMl90KikmZi0+ZGF0YVswXVsgIHkgKiAyICAgICAgKiBmLT5saW5lc2l6ZVswXSBdOworICAgICAgICAgICAgbHVtYTIgPSAodWludDMyX3QqKSZmLT5kYXRhWzBdWyAoeSAqIDIgKyAxKSAqIGYtPmxpbmVzaXplWzBdIF07CisgICAgICAgICAgICBjciAgICA9ICh1aW50MzJfdCopJmYtPmRhdGFbMV1bICB5ICAgICAgICAgICogZi0+bGluZXNpemVbMV0gXTsKKyAgICAgICAgICAgIGNiICAgID0gKHVpbnQzMl90KikmZi0+ZGF0YVsyXVsgIHkgICAgICAgICAgKiBmLT5saW5lc2l6ZVsyXSBdOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSA4KSB7CisgICAgICAgICAgICAgICAgKmx1bWExKysgPSAqYnVmMzIrKzsKKyAgICAgICAgICAgICAgICAqbHVtYTErKyA9ICpidWYzMisrOworICAgICAgICAgICAgICAgICpsdW1hMisrID0gKmJ1ZjMyKys7CisgICAgICAgICAgICAgICAgKmx1bWEyKysgPSAqYnVmMzIrKzsKKyAgICAgICAgICAgICAgICAqY3IrKyAgICA9ICpidWYzMisrOworICAgICAgICAgICAgICAgICpjYisrICAgID0gKmJ1ZjMyKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICAgIC8qIEZyYXBzIHYxIGlzIGFuIHVwc2lkZS1kb3duIEJHUjI0ICovCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5PGF2Y3R4LT5oZWlnaHQ7IHkrKykKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmYtPmRhdGFbMF1bKGF2Y3R4LT5oZWlnaHQgLSB5IC0gMSkgKiBmLT5saW5lc2l6ZVswXV0sCisgICAgICAgICAgICAgICAgICAgICAgICZidWZbeSAqIGF2Y3R4LT53aWR0aCAqIDNdLAorICAgICAgICAgICAgICAgICAgICAgICAzICogYXZjdHgtPndpZHRoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgY2FzZSA0OgorICAgICAgICAvKioKKyAgICAgICAgICogRnJhcHMgdjIgaXMgSHVmZm1hbi1jb2RlZCBZVVY0MjAgcGxhbmVzCisgICAgICAgICAqIEZyYXBzIHY0IGlzIHZpcnR1YWxseSB0aGUgc2FtZQorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lczsgaSsrKSB7CisgICAgICAgICAgICBpc19jaHJvbWEgPSAhIWk7CisgICAgICAgICAgICBpZiAoKHJldCA9IGZyYXBzMl9kZWNvZGVfcGxhbmUocywgZi0+ZGF0YVtpXSwgZi0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoICA+PiBpc19jaHJvbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmhlaWdodCA+PiBpc19jaHJvbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgb2Zmc1tpXSwgb2Zmc1tpICsgMV0gLSBvZmZzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Nocm9tYSwgMSkpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZGVjb2RpbmcgcGxhbmUgJWlcbiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgIGNhc2UgNToKKyAgICAgICAgLyogVmlydHVhbGx5IHRoZSBzYW1lIGFzIHZlcnNpb24gNCwgYnV0IGlzIGZvciBSR0IyNCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZnJhcHMyX2RlY29kZV9wbGFuZShzLCBmLT5kYXRhWzBdICsgaSArIChmLT5saW5lc2l6ZVswXSAqIChhdmN0eC0+aGVpZ2h0IC0gMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1mLT5saW5lc2l6ZVswXSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArIG9mZnNbaV0sIG9mZnNbaSArIDFdIC0gb2Zmc1tpXSwgMCwgMykpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZGVjb2RpbmcgcGxhbmUgJWlcbiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3V0ID0gZi0+ZGF0YVswXTsKKyAgICAgICAgLy8gY29udmVydCBwc2V1ZG8tWVVWIGludG8gcmVhbCBSR0IKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT5oZWlnaHQ7IGorKykgeworICAgICAgICAgICAgdWludDhfdCAqbGluZV9lbmQgPSBvdXQgKyAzKmF2Y3R4LT53aWR0aDsKKyAgICAgICAgICAgIHdoaWxlIChvdXQgPCBsaW5lX2VuZCkgeworICAgICAgICAgICAgICAgIG91dFswXSAgKz0gb3V0WzFdOworICAgICAgICAgICAgICAgIG91dFsyXSAgKz0gb3V0WzFdOworICAgICAgICAgICAgICAgIG91dCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0ICs9IGYtPmxpbmVzaXplWzBdIC0gMyphdmN0eC0+d2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKKworLyoqCisgKiBjbG9zZXMgZGVjb2RlcgorICogQHBhcmFtIGF2Y3R4IGNvZGVjIGNvbnRleHQKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGlmIGZhaWxzCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGcmFwc0NvbnRleHQgKnMgPSAoRnJhcHNDb250ZXh0KilhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJnMtPnRtcGJ1Zik7CisgICAgcmV0dXJuIDA7Cit9CisKKworQVZDb2RlYyBmZl9mcmFwc19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJmcmFwcyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZyYXBzIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0ZSQVBTLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGcmFwc0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9mcnd1LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9mcnd1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3OGRiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2Zyd3UuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIEZvcndhcmQgVW5jb21wcmVzc2VkCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQVZDbGFzcyAqYXZfY2xhc3M7CisgICAgaW50IGNoYW5nZV9maWVsZF9vcmRlcjsKK30gRlJXVUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKGF2Y3R4LT53aWR0aCAmIDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmcnd1IG5lZWRzIGV2ZW4gd2lkdGhcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfVVlWWTQyMjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEZSV1VDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgZmllbGQsIHJldDsKKyAgICBBVkZyYW1lICpwaWMgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBidWYgKyBhdnBrdC0+c2l6ZTsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8IGF2Y3R4LT53aWR0aCAqIDIgKiBhdmN0eC0+aGVpZ2h0ICsgNCArIDIqOCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCBpcyB0b28gc21hbGwuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChieXRlc3RyZWFtX2dldF9sZTMyKCZidWYpICE9IE1LVEFHKCdGJywgJ1InLCAnVycsICcxJykpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbmNvcnJlY3QgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwaWMsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwaWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIHBpYy0+a2V5X2ZyYW1lID0gMTsKKworICAgIGZvciAoZmllbGQgPSAwOyBmaWVsZCA8IDI7IGZpZWxkKyspIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBmaWVsZF9oID0gKGF2Y3R4LT5oZWlnaHQgKyAhZmllbGQpID4+IDE7CisgICAgICAgIGludCBmaWVsZF9zaXplLCBtaW5fZmllbGRfc2l6ZSA9IGF2Y3R4LT53aWR0aCAqIDIgKiBmaWVsZF9oOworICAgICAgICB1aW50OF90ICpkc3QgPSBwaWMtPmRhdGFbMF07CisgICAgICAgIGlmIChidWZfZW5kIC0gYnVmIDwgOCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBidWYgKz0gNDsgLy8gZmxhZ3M/IDB4ODAgPT0gYm90dG9tIGZpZWxkIG1heWJlPworICAgICAgICBmaWVsZF9zaXplID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmYnVmKTsKKyAgICAgICAgaWYgKGZpZWxkX3NpemUgPCBtaW5fZmllbGRfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGaWVsZCBzaXplICVpIGlzIHRvbyBzbWFsbCAocmVxdWlyZWQgJWkpXG4iLCBmaWVsZF9zaXplLCBtaW5fZmllbGRfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmX2VuZCAtIGJ1ZiA8IGZpZWxkX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGlzIHRvbyBzbWFsbCwgbmVlZCAlaSwgaGF2ZSAlaVxuIiwgZmllbGRfc2l6ZSwgKGludCkoYnVmX2VuZCAtIGJ1ZikpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpZWxkIF4gcy0+Y2hhbmdlX2ZpZWxkX29yZGVyKSB7CisgICAgICAgICAgICBkc3QgKz0gcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5jaGFuZ2VfZmllbGRfb3JkZXIpIHsKKyAgICAgICAgICAgIGRzdCArPSAyICogcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmllbGRfaDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+Y2hhbmdlX2ZpZWxkX29yZGVyICYmIGZpZWxkICYmIGkgPT0gZmllbGRfaCAtIDEpCisgICAgICAgICAgICAgICAgZHN0ID0gcGljLT5kYXRhWzBdOworICAgICAgICAgICAgbWVtY3B5KGRzdCwgYnVmLCBhdmN0eC0+d2lkdGggKiAyKTsKKyAgICAgICAgICAgIGJ1ZiArPSBhdmN0eC0+d2lkdGggKiAyOworICAgICAgICAgICAgZHN0ICs9IHBpYy0+bGluZXNpemVbMF0gPDwgMTsKKyAgICAgICAgfQorICAgICAgICBidWYgKz0gZmllbGRfc2l6ZSAtIG1pbl9maWVsZF9zaXplOworICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZnJ3dV9vcHRpb25zW10gPSB7CisgICAgeyJjaGFuZ2VfZmllbGRfb3JkZXIiLCAiQ2hhbmdlIGZpZWxkIG9yZGVyIiwgb2Zmc2V0b2YoRlJXVUNvbnRleHQsIGNoYW5nZV9maWVsZF9vcmRlciksIEZGX09QVF9UWVBFX0lOVCwKKyAgICAgey5pNjQgPSAwfSwgMCwgMSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19WSURFT19QQVJBTX0sCisgICAge05VTEx9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmcnd1X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImZyd3UgRGVjb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGZyd3Vfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfZnJ3dV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJmcnd1IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRm9yd2FyZCBVbmNvbXByZXNzZWQiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRlJXVSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRlJXVUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZmcnd1X2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2cybWVldC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZzJtZWV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkNTAyYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2cybWVldC5jCkBAIC0wLDAgKzEsOTIxIEBACisvKgorICogR28yV2ViaW5hciBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBHbzJXZWJpbmFyIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJsb2NrZHNwLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWpwZWcuaCIKKworZW51bSBDaHVua1R5cGUgeworICAgIERJU1BMQVlfSU5GTyA9IDB4QzgsCisgICAgVElMRV9EQVRBLAorICAgIENVUlNPUl9QT1MsCisgICAgQ1VSU09SX1NIQVBFLAorICAgIENIVU5LX0NDLAorICAgIENIVU5LX0NECit9OworCitlbnVtIENvbXByZXNzaW9uIHsKKyAgICBDT01QUl9FUElDX0pfQiA9IDIsCisgICAgQ09NUFJfS0VNUEZfSl9CLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbHVtYV9xdWFudFs2NF0gPSB7CisgICAgIDgsICA2LCAgNSwgIDgsIDEyLCAyMCwgMjYsIDMxLAorICAgICA2LCAgNiwgIDcsIDEwLCAxMywgMjksIDMwLCAyOCwKKyAgICAgNywgIDcsICA4LCAxMiwgMjAsIDI5LCAzNSwgMjgsCisgICAgIDcsICA5LCAxMSwgMTUsIDI2LCA0NCwgNDAsIDMxLAorICAgICA5LCAxMSwgMTksIDI4LCAzNCwgNTUsIDUyLCAzOSwKKyAgICAxMiwgMTgsIDI4LCAzMiwgNDEsIDUyLCA1NywgNDYsCisgICAgMjUsIDMyLCAzOSwgNDQsIDUyLCA2MSwgNjAsIDUxLAorICAgIDM2LCA0NiwgNDgsIDQ5LCA1NiwgNTAsIDUyLCA1MAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2hyb21hX3F1YW50WzY0XSA9IHsKKyAgICAgOSwgIDksIDEyLCAyNCwgNTAsIDUwLCA1MCwgNTAsCisgICAgIDksIDExLCAxMywgMzMsIDUwLCA1MCwgNTAsIDUwLAorICAgIDEyLCAxMywgMjgsIDUwLCA1MCwgNTAsIDUwLCA1MCwKKyAgICAyNCwgMzMsIDUwLCA1MCwgNTAsIDUwLCA1MCwgNTAsCisgICAgNTAsIDUwLCA1MCwgNTAsIDUwLCA1MCwgNTAsIDUwLAorICAgIDUwLCA1MCwgNTAsIDUwLCA1MCwgNTAsIDUwLCA1MCwKKyAgICA1MCwgNTAsIDUwLCA1MCwgNTAsIDUwLCA1MCwgNTAsCisgICAgNTAsIDUwLCA1MCwgNTAsIDUwLCA1MCwgNTAsIDUwLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgSlBHQ29udGV4dCB7CisgICAgQmxvY2tEU1BDb250ZXh0IGJkc3A7CisgICAgSURDVERTUENvbnRleHQgaWRzcDsKKyAgICBTY2FuVGFibGUgIHNjYW50YWJsZTsKKworICAgIFZMQyAgICAgICAgZGNfdmxjWzJdLCBhY192bGNbMl07CisgICAgaW50ICAgICAgICBwcmV2X2RjWzNdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYmxvY2spWzZdWzY0XTsKKworICAgIHVpbnQ4X3QgICAgKmJ1ZjsKK30gSlBHQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgRzJNQ29udGV4dCB7CisgICAgSlBHQ29udGV4dCBqYzsKKyAgICBpbnQgICAgICAgIHZlcnNpb247CisKKyAgICBpbnQgICAgICAgIGNvbXByZXNzaW9uOworICAgIGludCAgICAgICAgd2lkdGgsIGhlaWdodCwgYnBwOworICAgIGludCAgICAgICAgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQ7CisgICAgaW50ICAgICAgICB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodDsKKyAgICBpbnQgICAgICAgIHRpbGVzX3gsIHRpbGVzX3ksIHRpbGVfeCwgdGlsZV95OworCisgICAgaW50ICAgICAgICBnb3RfaGVhZGVyOworCisgICAgdWludDhfdCAgICAqZnJhbWVidWY7CisgICAgaW50ICAgICAgICBmcmFtZWJ1Zl9zdHJpZGUsIG9sZF93aWR0aCwgb2xkX2hlaWdodDsKKworICAgIHVpbnQ4X3QgICAgKnN5bnRoX3RpbGUsICpqcGVnX3RpbGU7CisgICAgaW50ICAgICAgICB0aWxlX3N0cmlkZSwgb2xkX3RpbGVfdywgb2xkX3RpbGVfaDsKKworICAgIHVpbnQ4X3QgICAgKmtlbXBmX2J1ZiwgKmtlbXBmX2ZsYWdzOworCisgICAgdWludDhfdCAgICAqY3Vyc29yOworICAgIGludCAgICAgICAgY3Vyc29yX3N0cmlkZTsKKyAgICBpbnQgICAgICAgIGN1cnNvcl9mbXQ7CisgICAgaW50ICAgICAgICBjdXJzb3JfdywgY3Vyc29yX2gsIGN1cnNvcl94LCBjdXJzb3JfeTsKKyAgICBpbnQgICAgICAgIGN1cnNvcl9ob3RfeCwgY3Vyc29yX2hvdF95OworfSBHMk1Db250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgYnVpbGRfdmxjKFZMQyAqdmxjLCBjb25zdCB1aW50OF90ICpiaXRzX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp2YWxfdGFibGUsIGludCBuYl9jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2FjKQoreworICAgIHVpbnQ4X3QgIGh1ZmZfc2l6ZVsyNTZdID0geyAwIH07CisgICAgdWludDE2X3QgaHVmZl9jb2RlWzI1Nl07CisgICAgdWludDE2X3QgaHVmZl9zeW1bMjU2XTsKKyAgICBpbnQgaTsKKworICAgIGZmX21qcGVnX2J1aWxkX2h1ZmZtYW5fY29kZXMoaHVmZl9zaXplLCBodWZmX2NvZGUsIGJpdHNfdGFibGUsIHZhbF90YWJsZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgIGh1ZmZfc3ltW2ldID0gaSArIDE2ICogaXNfYWM7CisKKyAgICBpZiAoaXNfYWMpCisgICAgICAgIGh1ZmZfc3ltWzBdID0gMTYgKiAyNTY7CisKKyAgICByZXR1cm4gZmZfaW5pdF92bGNfc3BhcnNlKHZsYywgOSwgbmJfY29kZXMsIGh1ZmZfc2l6ZSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZfY29kZSwgMiwgMiwgaHVmZl9zeW0sIDIsIDIsIDApOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQganBnX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBKUEdDb250ZXh0ICpjKQoreworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBidWlsZF92bGMoJmMtPmRjX3ZsY1swXSwgYXZwcml2X21qcGVnX2JpdHNfZGNfbHVtaW5hbmNlLAorICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2RjLCAxMiwgMCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXQgPSBidWlsZF92bGMoJmMtPmRjX3ZsY1sxXSwgYXZwcml2X21qcGVnX2JpdHNfZGNfY2hyb21pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfZGMsIDEyLCAwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldCA9IGJ1aWxkX3ZsYygmYy0+YWNfdmxjWzBdLCBhdnByaXZfbWpwZWdfYml0c19hY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfYWNfbHVtaW5hbmNlLCAyNTEsIDEpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gYnVpbGRfdmxjKCZjLT5hY192bGNbMV0sIGF2cHJpdl9tanBlZ19iaXRzX2FjX2Nocm9taW5hbmNlLAorICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2FjX2Nocm9taW5hbmNlLCAyNTEsIDEpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZl9ibG9ja2RzcF9pbml0KCZjLT5iZHNwLCBhdmN0eCk7CisgICAgZmZfaWRjdGRzcF9pbml0KCZjLT5pZHNwLCBhdmN0eCk7CisgICAgZmZfaW5pdF9zY2FudGFibGUoYy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmYy0+c2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIGZmX3ppZ3phZ19kaXJlY3QpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQganBnX2ZyZWVfY29udGV4dChKUEdDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPmRjX3ZsY1tpXSk7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPmFjX3ZsY1tpXSk7CisgICAgfQorCisgICAgYXZfZnJlZXAoJmN0eC0+YnVmKTsKK30KKworc3RhdGljIHZvaWQganBnX3VuZXNjYXBlKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50ICpkc3Rfc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpzcmNfZW5kID0gc3JjICsgc3JjX3NpemU7CisgICAgdWludDhfdCAqZHN0X3N0YXJ0ID0gZHN0OworCisgICAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKKyAgICAgICAgdWludDhfdCB4ID0gKnNyYysrOworCisgICAgICAgICpkc3QrKyA9IHg7CisKKyAgICAgICAgaWYgKHggPT0gMHhGRiAmJiAhKnNyYykKKyAgICAgICAgICAgIHNyYysrOworICAgIH0KKyAgICAqZHN0X3NpemUgPSBkc3QgLSBkc3Rfc3RhcnQ7Cit9CisKK3N0YXRpYyBpbnQganBnX2RlY29kZV9ibG9jayhKUEdDb250ZXh0ICpjLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhbmUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBkYywgdmFsLCBwb3M7CisgICAgY29uc3QgaW50IGlzX2Nocm9tYSA9ICEhcGxhbmU7CisgICAgY29uc3QgdWludDhfdCAqcW1hdCA9IGlzX2Nocm9tYSA/IGNocm9tYV9xdWFudCA6IGx1bWFfcXVhbnQ7CisKKyAgICBjLT5iZHNwLmNsZWFyX2Jsb2NrKGJsb2NrKTsKKyAgICBkYyA9IGdldF92bGMyKGdiLCBjLT5kY192bGNbaXNfY2hyb21hXS50YWJsZSwgOSwgMyk7CisgICAgaWYgKGRjIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKGRjKQorICAgICAgICBkYyA9IGdldF94Yml0cyhnYiwgZGMpOworICAgIGRjICAgICAgICAgICAgICAgID0gZGMgKiBxbWF0WzBdICsgYy0+cHJldl9kY1twbGFuZV07CisgICAgYmxvY2tbMF0gICAgICAgICAgPSBkYzsKKyAgICBjLT5wcmV2X2RjW3BsYW5lXSA9IGRjOworCisgICAgcG9zID0gMDsKKyAgICB3aGlsZSAocG9zIDwgNjMpIHsKKyAgICAgICAgdmFsID0gZ2V0X3ZsYzIoZ2IsIGMtPmFjX3ZsY1tpc19jaHJvbWFdLnRhYmxlLCA5LCAzKTsKKyAgICAgICAgaWYgKHZhbCA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgcG9zICs9IHZhbCA+PiA0OworICAgICAgICB2YWwgJj0gMHhGOworICAgICAgICBpZiAocG9zID4gNjMpCisgICAgICAgICAgICByZXR1cm4gdmFsID8gQVZFUlJPUl9JTlZBTElEREFUQSA6IDA7CisgICAgICAgIGlmICh2YWwpIHsKKyAgICAgICAgICAgIGludCBuYml0cyA9IHZhbDsKKworICAgICAgICAgICAgdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRfeGJpdHMoZ2IsIG5iaXRzKTsKKyAgICAgICAgICAgIHZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKj0gcW1hdFtmZl96aWd6YWdfZGlyZWN0W3Bvc11dOworICAgICAgICAgICAgYmxvY2tbYy0+c2NhbnRhYmxlLnBlcm11dGF0ZWRbcG9zXV0gPSB2YWw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB5dXYycmdiKHVpbnQ4X3QgKm91dCwgaW50IFksIGludCBVLCBpbnQgVikKK3sKKyAgICBvdXRbMF0gPSBhdl9jbGlwX3VpbnQ4KFkgKyAoICAgICAgICAgICAgIDkxODgxICogViArIDMyNzY4ID4+IDE2KSk7CisgICAgb3V0WzFdID0gYXZfY2xpcF91aW50OChZICsgKC0yMjU1NCAqIFUgLSA0NjgwMiAqIFYgKyAzMjc2OCA+PiAxNikpOworICAgIG91dFsyXSA9IGF2X2NsaXBfdWludDgoWSArICgxMTYxMzAgKiBVICAgICAgICAgICAgICsgMzI3NjggPj4gMTYpKTsKK30KKworc3RhdGljIGludCBqcGdfZGVjb2RlX2RhdGEoSlBHQ29udGV4dCAqYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFzaywgaW50IG1hc2tfc3RyaWRlLCBpbnQgbnVtX21icywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzd2FwdXYpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgbWJfdywgbWJfaCwgbWJfeCwgbWJfeSwgaSwgajsKKyAgICBpbnQgYngsIGJ5OworICAgIGludCB1bmVzY19zaXplOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGF2X3JlYWxsb2NwKCZjLT5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAganBnX3VuZXNjYXBlKHNyYywgc3JjX3NpemUsIGMtPmJ1ZiwgJnVuZXNjX3NpemUpOworICAgIG1lbXNldChjLT5idWYgKyB1bmVzY19zaXplLCAwLCBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgYy0+YnVmLCB1bmVzY19zaXplICogOCk7CisKKyAgICB3aWR0aCA9IEZGQUxJR04od2lkdGgsIDE2KTsKKyAgICBtYl93ICA9ICB3aWR0aCAgICAgICAgPj4gNDsKKyAgICBtYl9oICA9IChoZWlnaHQgKyAxNSkgPj4gNDsKKworICAgIGlmICghbnVtX21icykKKyAgICAgICAgbnVtX21icyA9IG1iX3cgKiBtYl9oICogNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGMtPnByZXZfZGNbaV0gPSAxMDI0OworICAgIGJ4ID0gYnkgPSAwOworICAgIGMtPmJkc3AuY2xlYXJfYmxvY2tzKGMtPmJsb2NrWzBdKTsKKyAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgbWJfaDsgbWJfeSsrKSB7CisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBtYl93OyBtYl94KyspIHsKKyAgICAgICAgICAgIGlmIChtYXNrICYmICFtYXNrW21iX3ggKiAyXSAmJiAhbWFza1ttYl94ICogMiArIDFdICYmCisgICAgICAgICAgICAgICAgIW1hc2tbbWJfeCAqIDIgKyAgICAgbWFza19zdHJpZGVdICYmCisgICAgICAgICAgICAgICAgIW1hc2tbbWJfeCAqIDIgKyAxICsgbWFza19zdHJpZGVdKSB7CisgICAgICAgICAgICAgICAgYnggKz0gMTY7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAobWFzayAmJiAhbWFza1ttYl94ICogMiArIGkgKyBqICogbWFza19zdHJpZGVdKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIG51bV9tYnMtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBqcGdfZGVjb2RlX2Jsb2NrKGMsICZnYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmJsb2NrW2kgKyBqICogMl0pKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgYy0+aWRzcC5pZGN0KGMtPmJsb2NrW2kgKyBqICogMl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGpwZ19kZWNvZGVfYmxvY2soYywgJmdiLCBpLCBjLT5ibG9ja1tpICsgM10pKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGMtPmlkc3AuaWRjdChjLT5ibG9ja1tpICsgM10pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm91dCA9IGRzdCArIGJ4ICogMyArIChieSArIGopICogZHN0X3N0cmlkZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgWSwgVSwgVjsKKworICAgICAgICAgICAgICAgICAgICBZID0gYy0+YmxvY2tbKGogPj4gMykgKiAyICsgKGkgPj4gMyldWyhpICYgNykgKyAoaiAmIDcpICogOF07CisgICAgICAgICAgICAgICAgICAgIFUgPSBjLT5ibG9ja1s0IF4gc3dhcHV2XVsoaSA+PiAxKSArIChqID4+IDEpICogOF0gLSAxMjg7CisgICAgICAgICAgICAgICAgICAgIFYgPSBjLT5ibG9ja1s1IF4gc3dhcHV2XVsoaSA+PiAxKSArIChqID4+IDEpICogOF0gLSAxMjg7CisgICAgICAgICAgICAgICAgICAgIHl1djJyZ2Iob3V0ICsgaSAqIDMsIFksIFUsIFYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFudW1fbWJzKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgYnggKz0gMTY7CisgICAgICAgIH0KKyAgICAgICAgYnggID0gMDsKKyAgICAgICAgYnkgKz0gMTY7CisgICAgICAgIGlmIChtYXNrKQorICAgICAgICAgICAgbWFzayArPSBtYXNrX3N0cmlkZSAqIDI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGtlbXBmX3Jlc3RvcmVfYnVmKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmpwZWdfdGlsZSwgaW50IHRpbGVfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGFsLCBpbnQgbnBhbCwgaW50IHRpZHgpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgaSwgaiwgbmIsIGNvbDsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBzcmMsIGxlbiAqIDgpOworCisgICAgaWYgKG5wYWwgPD0gMikgICAgICAgbmIgPSAxOworICAgIGVsc2UgaWYgKG5wYWwgPD0gNCkgIG5iID0gMjsKKyAgICBlbHNlIGlmIChucGFsIDw9IDE2KSBuYiA9IDQ7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgbmIgPSA4OworCisgICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaisrLCBkc3QgKz0gc3RyaWRlLCBqcGVnX3RpbGUgKz0gdGlsZV9zdHJpZGUpIHsKKyAgICAgICAgaWYgKGdldF9iaXRzKCZnYiwgOCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbCA9IGdldF9iaXRzKCZnYiwgbmIpOworICAgICAgICAgICAgaWYgKGNvbCAhPSB0aWR4KQorICAgICAgICAgICAgICAgIG1lbWNweShkc3QgKyBpICogMywgcGFsICsgY29sICogMywgMyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCArIGkgKiAzLCBqcGVnX3RpbGUgKyBpICogMywgMyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQga2VtcGZfZGVjb2RlX3RpbGUoRzJNQ29udGV4dCAqYywgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3NpemUpCit7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGhkciwgenNpemUsIG5wYWwsIHRpZHggPSAtMSwgcmV0OworICAgIGludCBpLCBqOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19lbmQgPSBzcmMgKyBzcmNfc2l6ZTsKKyAgICB1aW50OF90IHBhbFs3NjhdLCB0cmFuc3BbM107CisgICAgdUxvbmdmIGRsZW4gPSAoYy0+dGlsZV93aWR0aCArIDEpICogYy0+dGlsZV9oZWlnaHQ7CisgICAgaW50IHN1Yl90eXBlOworICAgIGludCBuYmxvY2tzLCBjYmxvY2tzLCBic3RyaWRlOworICAgIGludCBiaXRzLCBiaXRidWYsIGNvZGVkOworICAgIHVpbnQ4X3QgKmRzdCA9IGMtPmZyYW1lYnVmICsgdGlsZV94ICogYy0+dGlsZV93aWR0aCAqIDMgKworICAgICAgICAgICAgICAgICAgIHRpbGVfeSAqIGMtPnRpbGVfaGVpZ2h0ICogYy0+ZnJhbWVidWZfc3RyaWRlOworCisgICAgaWYgKHNyY19zaXplIDwgMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB3aWR0aCAgPSBGRk1JTihjLT53aWR0aCAgLSB0aWxlX3ggKiBjLT50aWxlX3dpZHRoLCAgYy0+dGlsZV93aWR0aCk7CisgICAgaGVpZ2h0ID0gRkZNSU4oYy0+aGVpZ2h0IC0gdGlsZV95ICogYy0+dGlsZV9oZWlnaHQsIGMtPnRpbGVfaGVpZ2h0KTsKKworICAgIGhkciAgICAgID0gKnNyYysrOworICAgIHN1Yl90eXBlID0gaGRyID4+IDU7CisgICAgaWYgKHN1Yl90eXBlID09IDApIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIG1lbWNweSh0cmFuc3AsIHNyYywgMyk7CisgICAgICAgIHNyYyArPSAzOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyssIGRzdCArPSBjLT5mcmFtZWJ1Zl9zdHJpZGUpCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0ICsgaSAqIDMsIHRyYW5zcCwgMyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gMSkgeworICAgICAgICByZXR1cm4ganBnX2RlY29kZV9kYXRhKCZjLT5qYywgd2lkdGgsIGhlaWdodCwgc3JjLCBzcmNfZW5kIC0gc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgYy0+ZnJhbWVidWZfc3RyaWRlLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisKKyAgICBpZiAoc3ViX3R5cGUgIT0gMikgeworICAgICAgICBtZW1jcHkodHJhbnNwLCBzcmMsIDMpOworICAgICAgICBzcmMgKz0gMzsKKyAgICB9CisgICAgbnBhbCA9ICpzcmMrKyArIDE7CisgICAgaWYgKHNyY19lbmQgLSBzcmMgPCBucGFsICogMykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgbWVtY3B5KHBhbCwgc3JjLCBucGFsICogMyk7CisgICAgc3JjICs9IG5wYWwgKiAzOworICAgIGlmIChzdWJfdHlwZSAhPSAyKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucGFsOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghbWVtY21wKHBhbCArIGkgKiAzLCB0cmFuc3AsIDMpKSB7CisgICAgICAgICAgICAgICAgdGlkeCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3JjX2VuZCAtIHNyYyA8IDIpCisgICAgICAgIHJldHVybiAwOworICAgIHpzaXplID0gKHNyY1swXSA8PCA4KSB8IHNyY1sxXTsKKyAgICBzcmMgICs9IDI7CisKKyAgICBpZiAoc3JjX2VuZCAtIHNyYyA8IHpzaXplICsgKHN1Yl90eXBlICE9IDIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHJldCA9IHVuY29tcHJlc3MoYy0+a2VtcGZfYnVmLCAmZGxlbiwgc3JjLCB6c2l6ZSk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgc3JjICs9IHpzaXplOworCisgICAgaWYgKHN1Yl90eXBlID09IDIpIHsKKyAgICAgICAga2VtcGZfcmVzdG9yZV9idWYoYy0+a2VtcGZfYnVmLCBkbGVuLCBkc3QsIGMtPmZyYW1lYnVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgd2lkdGgsIGhlaWdodCwgcGFsLCBucGFsLCB0aWR4KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbmJsb2NrcyA9ICpzcmMrKyArIDE7CisgICAgY2Jsb2NrcyA9IDA7CisgICAgYnN0cmlkZSA9IEZGQUxJR04od2lkdGgsIDE2KSA+PiAzOworICAgIC8vIGJsb2NrcyBhcmUgY29kZWQgTFNCIGFuZCB3ZSBuZWVkIG5vcm1hbCBiaXRyZWFkZXIgZm9yIEpQRUcgZGF0YQorICAgIGJpdHMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAoRkZBTElHTihoZWlnaHQsIDE2KSA+PiA0KTsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAoRkZBTElHTih3aWR0aCwgMTYpID4+IDQpOyBqKyspIHsKKyAgICAgICAgICAgIGlmICghYml0cykgeworICAgICAgICAgICAgICAgIGlmIChzcmMgPj0gc3JjX2VuZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgYml0YnVmID0gKnNyYysrOworICAgICAgICAgICAgICAgIGJpdHMgICA9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlZCA9IGJpdGJ1ZiAmIDE7CisgICAgICAgICAgICBiaXRzLS07CisgICAgICAgICAgICBiaXRidWYgPj49IDE7CisgICAgICAgICAgICBjYmxvY2tzICs9IGNvZGVkOworICAgICAgICAgICAgaWYgKGNibG9ja3MgPiBuYmxvY2tzKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYy0+a2VtcGZfZmxhZ3NbaiAqIDIgKyAgICAgIGkgKiAyICAgICAgKiBic3RyaWRlXSA9CisgICAgICAgICAgICBjLT5rZW1wZl9mbGFnc1tqICogMiArIDEgKyAgaSAqIDIgICAgICAqIGJzdHJpZGVdID0KKyAgICAgICAgICAgIGMtPmtlbXBmX2ZsYWdzW2ogKiAyICsgICAgIChpICogMiArIDEpICogYnN0cmlkZV0gPQorICAgICAgICAgICAgYy0+a2VtcGZfZmxhZ3NbaiAqIDIgKyAxICsgKGkgKiAyICsgMSkgKiBic3RyaWRlXSA9IGNvZGVkOworICAgICAgICB9CisgICAgfQorCisgICAgbWVtc2V0KGMtPmpwZWdfdGlsZSwgMCwgYy0+dGlsZV9zdHJpZGUgKiBoZWlnaHQpOworICAgIGpwZ19kZWNvZGVfZGF0YSgmYy0+amMsIHdpZHRoLCBoZWlnaHQsIHNyYywgc3JjX2VuZCAtIHNyYywKKyAgICAgICAgICAgICAgICAgICAgYy0+anBlZ190aWxlLCBjLT50aWxlX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgYy0+a2VtcGZfZmxhZ3MsIGJzdHJpZGUsIG5ibG9ja3MgKiA0LCAwKTsKKworICAgIGtlbXBmX3Jlc3RvcmVfYnVmKGMtPmtlbXBmX2J1ZiwgZGxlbiwgZHN0LCBjLT5mcmFtZWJ1Zl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgYy0+anBlZ190aWxlLCBjLT50aWxlX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwYWwsIG5wYWwsIHRpZHgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZzJtX2luaXRfYnVmZmVycyhHMk1Db250ZXh0ICpjKQoreworICAgIGludCBhbGlnbmVkX2hlaWdodDsKKworICAgIGlmICghYy0+ZnJhbWVidWYgfHwgYy0+b2xkX3dpZHRoIDwgYy0+d2lkdGggfHwgYy0+b2xkX2hlaWdodCA8IGMtPmhlaWdodCkgeworICAgICAgICBjLT5mcmFtZWJ1Zl9zdHJpZGUgPSBGRkFMSUdOKGMtPndpZHRoICsgMTUsIDE2KSAqIDM7CisgICAgICAgIGFsaWduZWRfaGVpZ2h0ICAgICA9IGMtPmhlaWdodCArIDE1OworICAgICAgICBhdl9mcmVlKGMtPmZyYW1lYnVmKTsKKyAgICAgICAgYy0+ZnJhbWVidWYgPSBhdl9tYWxsb2N6KGMtPmZyYW1lYnVmX3N0cmlkZSAqIGFsaWduZWRfaGVpZ2h0KTsKKyAgICAgICAgaWYgKCFjLT5mcmFtZWJ1ZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGlmICghYy0+c3ludGhfdGlsZSB8fCAhYy0+anBlZ190aWxlIHx8CisgICAgICAgIGMtPm9sZF90aWxlX3cgPCBjLT50aWxlX3dpZHRoIHx8CisgICAgICAgIGMtPm9sZF90aWxlX2ggPCBjLT50aWxlX2hlaWdodCkgeworICAgICAgICBjLT50aWxlX3N0cmlkZSA9IEZGQUxJR04oYy0+dGlsZV93aWR0aCwgMTYpICogMzsKKyAgICAgICAgYWxpZ25lZF9oZWlnaHQgPSBGRkFMSUdOKGMtPnRpbGVfaGVpZ2h0LCAgICAxNik7CisgICAgICAgIGF2X2ZyZWUoYy0+c3ludGhfdGlsZSk7CisgICAgICAgIGF2X2ZyZWUoYy0+anBlZ190aWxlKTsKKyAgICAgICAgYXZfZnJlZShjLT5rZW1wZl9idWYpOworICAgICAgICBhdl9mcmVlKGMtPmtlbXBmX2ZsYWdzKTsKKyAgICAgICAgYy0+c3ludGhfdGlsZSAgPSBhdl9tYWxsb2N6KGMtPnRpbGVfc3RyaWRlICAgICAgKiBhbGlnbmVkX2hlaWdodCk7CisgICAgICAgIGMtPmpwZWdfdGlsZSAgID0gYXZfbWFsbG9jeihjLT50aWxlX3N0cmlkZSAgICAgICogYWxpZ25lZF9oZWlnaHQpOworICAgICAgICBjLT5rZW1wZl9idWYgICA9IGF2X21hbGxvY3ooKGMtPnRpbGVfd2lkdGggKyAxKSAqIGFsaWduZWRfaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBjLT5rZW1wZl9mbGFncyA9IGF2X21hbGxvY3ooIGMtPnRpbGVfd2lkdGggICAgICAqIGFsaWduZWRfaGVpZ2h0KTsKKyAgICAgICAgaWYgKCFjLT5zeW50aF90aWxlIHx8ICFjLT5qcGVnX3RpbGUgfHwKKyAgICAgICAgICAgICFjLT5rZW1wZl9idWYgfHwgIWMtPmtlbXBmX2ZsYWdzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnMm1fbG9hZF9jdXJzb3IoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHMk1Db250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgKmdiKQoreworICAgIGludCBpLCBqLCBrOworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICB1aW50MzJfdCBiaXRzOworICAgIHVpbnQzMl90IGN1cl9zaXplLCBjdXJzb3JfdywgY3Vyc29yX2gsIGN1cnNvcl9zdHJpZGU7CisgICAgdWludDMyX3QgY3Vyc29yX2hvdF94LCBjdXJzb3JfaG90X3k7CisgICAgaW50IGN1cnNvcl9mbXQsIGVycjsKKworICAgIGN1cl9zaXplICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKGdiKTsKKyAgICBjdXJzb3JfdyAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgY3Vyc29yX2ggICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgIGN1cnNvcl9ob3RfeCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICBjdXJzb3JfaG90X3kgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgY3Vyc29yX2ZtdCAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworCisgICAgY3Vyc29yX3N0cmlkZSA9IEZGQUxJR04oY3Vyc29yX3csIGN1cnNvcl9mbXQ9PTEgPyAzMiA6IDEpICogNDsKKworICAgIGlmIChjdXJzb3JfdyA8IDEgfHwgY3Vyc29yX3cgPiAyNTYgfHwKKyAgICAgICAgY3Vyc29yX2ggPCAxIHx8IGN1cnNvcl9oID4gMjU2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjdXJzb3IgZGltZW5zaW9ucyAlIlBSSXUzMiJ4JSJQUkl1MzIiXG4iLAorICAgICAgICAgICAgICAgY3Vyc29yX3csIGN1cnNvcl9oKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChjdXJzb3JfaG90X3ggPiBjdXJzb3JfdyB8fCBjdXJzb3JfaG90X3kgPiBjdXJzb3JfaCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBob3RzcG90IHBvc2l0aW9uICUiUFJJdTMyIiwlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICBjdXJzb3JfaG90X3gsIGN1cnNvcl9ob3RfeSk7CisgICAgICAgIGN1cnNvcl9ob3RfeCA9IEZGTUlOKGN1cnNvcl9ob3RfeCwgY3Vyc29yX3cgLSAxKTsKKyAgICAgICAgY3Vyc29yX2hvdF95ID0gRkZNSU4oY3Vyc29yX2hvdF95LCBjdXJzb3JfaCAtIDEpOworICAgIH0KKyAgICBpZiAoY3VyX3NpemUgLSA5ID4gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIHx8CisgICAgICAgIGMtPmN1cnNvcl93ICogYy0+Y3Vyc29yX2ggLyA0ID4gY3VyX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGN1cnNvciBkYXRhIHNpemUgJSJQUkl1MzIiLyV1XG4iLAorICAgICAgICAgICAgICAgY3VyX3NpemUsIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoY3Vyc29yX2ZtdCAhPSAxICYmIGN1cnNvcl9mbXQgIT0gMzIpIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJDdXJzb3IgZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yX2ZtdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZjLT5jdXJzb3IsIGN1cnNvcl9zdHJpZGUgKiBjdXJzb3JfaCkpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSBjdXJzb3IgYnVmZmVyXG4iKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBjLT5jdXJzb3JfdyAgICAgID0gY3Vyc29yX3c7CisgICAgYy0+Y3Vyc29yX2ggICAgICA9IGN1cnNvcl9oOworICAgIGMtPmN1cnNvcl9ob3RfeCAgPSBjdXJzb3JfaG90X3g7CisgICAgYy0+Y3Vyc29yX2hvdF95ICA9IGN1cnNvcl9ob3RfeTsKKyAgICBjLT5jdXJzb3JfZm10ICAgID0gY3Vyc29yX2ZtdDsKKyAgICBjLT5jdXJzb3Jfc3RyaWRlID0gY3Vyc29yX3N0cmlkZTsKKworICAgIGRzdCA9IGMtPmN1cnNvcjsKKyAgICBzd2l0Y2ggKGMtPmN1cnNvcl9mbXQpIHsKKyAgICBjYXNlIDE6IC8vIG9sZCBtb25vY2hyb21lCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjLT5jdXJzb3JfaDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+Y3Vyc29yX3c7IGkgKz0gMzIpIHsKKyAgICAgICAgICAgICAgICBiaXRzID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoZ2IpOworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAzMjsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFswXSA9ICEhKGJpdHMgJiAweDgwMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0ICAgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgYml0cyA8PD0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkc3QgPSBjLT5jdXJzb3I7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjLT5jdXJzb3JfaDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+Y3Vyc29yX3c7IGkgKz0gMzIpIHsKKyAgICAgICAgICAgICAgICBiaXRzID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoZ2IpOworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAzMjsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2JpdCA9ICEhKGJpdHMgJiAweDgwMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkc3RbMF0gKiAyICsgbWFza19iaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFsxXSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMl0gPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzNdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMF0gPSAweEZGOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFsyXSA9IDB4RkY7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbM10gPSAweEZGOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMF0gPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFsyXSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbM10gPSAweDAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRzdCAgICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGJpdHMgPDw9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6IC8vIGZ1bGwgY29sb3VyCisgICAgICAgIC8qIHNraXAgbW9ub2Nocm9tZSB2ZXJzaW9uIG9mIHRoZSBjdXJzb3IgYW5kIGRlY29kZSBSR0JBIGluc3RlYWQgKi8KKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgYy0+Y3Vyc29yX2ggKiAoRkZBTElHTihjLT5jdXJzb3JfdywgMzIpID4+IDMpKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGMtPmN1cnNvcl9oOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5jdXJzb3JfdzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHZhbCA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKGdiKTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSB2YWwgPj4gIDA7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gdmFsID4+ICA4OworICAgICAgICAgICAgICAgICpkc3QrKyA9IHZhbCA+PiAxNjsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSB2YWwgPj4gMjQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBBUFBMWV9BTFBIQShzcmMsIG5ldywgYWxwaGEpIFwKKyAgICBzcmMgPSAoc3JjICogKDI1NiAtIGFscGhhKSArIG5ldyAqIGFscGhhKSA+PiA4CisKK3N0YXRpYyB2b2lkIGcybV9wYWludF9jdXJzb3IoRzJNQ29udGV4dCAqYywgdWludDhfdCAqZHN0LCBpbnQgc3RyaWRlKQoreworICAgIGludCBpLCBqOworICAgIGludCB4LCB5LCB3LCBoOworICAgIGNvbnN0IHVpbnQ4X3QgKmN1cnNvcjsKKworICAgIGlmICghYy0+Y3Vyc29yKQorICAgICAgICByZXR1cm47CisKKyAgICB4ID0gYy0+Y3Vyc29yX3ggLSBjLT5jdXJzb3JfaG90X3g7CisgICAgeSA9IGMtPmN1cnNvcl95IC0gYy0+Y3Vyc29yX2hvdF95OworCisgICAgY3Vyc29yID0gYy0+Y3Vyc29yOworICAgIHcgICAgICA9IGMtPmN1cnNvcl93OworICAgIGggICAgICA9IGMtPmN1cnNvcl9oOworCisgICAgaWYgKHggKyB3ID4gYy0+d2lkdGgpCisgICAgICAgIHcgPSBjLT53aWR0aCAtIHg7CisgICAgaWYgKHkgKyBoID4gYy0+aGVpZ2h0KQorICAgICAgICBoID0gYy0+aGVpZ2h0IC0geTsKKyAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgdyAgICAgICs9ICB4OworICAgICAgICBjdXJzb3IgKz0gLXggKiA0OworICAgIH0gZWxzZSB7CisgICAgICAgIGRzdCAgICArPSAgeCAqIDM7CisgICAgfQorICAgIGlmICh5IDwgMCkgeworICAgICAgICBoICAgICAgKz0gIHk7CisgICAgICAgIGN1cnNvciArPSAteSAqIGMtPmN1cnNvcl9zdHJpZGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0ICAgICs9ICB5ICogc3RyaWRlOworICAgIH0KKyAgICBpZiAodyA8IDAgfHwgaCA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaiA9IDA7IGogPCBoOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICAgICAgdWludDhfdCBhbHBoYSA9IGN1cnNvcltpICogNF07CisgICAgICAgICAgICBBUFBMWV9BTFBIQShkc3RbaSAqIDMgKyAwXSwgY3Vyc29yW2kgKiA0ICsgMV0sIGFscGhhKTsKKyAgICAgICAgICAgIEFQUExZX0FMUEhBKGRzdFtpICogMyArIDFdLCBjdXJzb3JbaSAqIDQgKyAyXSwgYWxwaGEpOworICAgICAgICAgICAgQVBQTFlfQUxQSEEoZHN0W2kgKiAzICsgMl0sIGN1cnNvcltpICogNCArIDNdLCBhbHBoYSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0ICAgICs9IHN0cmlkZTsKKyAgICAgICAgY3Vyc29yICs9IGMtPmN1cnNvcl9zdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGcybV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3BpY3R1cmVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgRzJNQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqcGljID0gZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCBiYywgdGJjOworICAgIGludCBtYWdpYzsKKyAgICBpbnQgZ290X2hlYWRlciA9IDA7CisgICAgdWludDMyX3QgY2h1bmtfc2l6ZSwgcl9tYXNrLCBnX21hc2ssIGJfbWFzazsKKyAgICBpbnQgY2h1bmtfdHlwZSwgY2h1bmtfc3RhcnQ7CisgICAgaW50IGk7CisgICAgaW50IHJldDsKKworICAgIGlmIChidWZfc2l6ZSA8IDEyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkZyYW1lIHNob3VsZCBoYXZlIGF0IGxlYXN0IDEyIGJ5dGVzLCBnb3QgJWQgaW5zdGVhZFxuIiwKKyAgICAgICAgICAgICAgIGJ1Zl9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmYmMsIGJ1ZiwgYnVmX3NpemUpOworCisgICAgbWFnaWMgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmYmMpOworICAgIGlmICgobWFnaWMgJiB+MHhGKSAhPSBNS0JFVEFHKCdHJywgJzInLCAnTScsICcwJykgfHwKKyAgICAgICAgKG1hZ2ljICYgMHhGKSA8IDIgfHwgKG1hZ2ljICYgMHhGKSA+IDUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJXcm9uZyBtYWdpYyAlMDhYXG4iLCBtYWdpYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgobWFnaWMgJiAweEYpIDwgNCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkcyTTIgYW5kIEcyTTMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmJjKSA+IDUpIHsKKyAgICAgICAgY2h1bmtfc2l6ZSAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmYmMpIC0gMTsKKyAgICAgICAgY2h1bmtfdHlwZSAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmYmMpOworICAgICAgICBjaHVua19zdGFydCA9IGJ5dGVzdHJlYW0yX3RlbGwoJmJjKTsKKyAgICAgICAgaWYgKGNodW5rX3NpemUgPiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmYmMpKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY2h1bmsgc2l6ZSAlIlBSSXUzMiIgdHlwZSAlMDJYXG4iLAorICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUsIGNodW5rX3R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjaHVua190eXBlKSB7CisgICAgICAgIGNhc2UgRElTUExBWV9JTkZPOgorICAgICAgICAgICAgZ290X2hlYWRlciA9CisgICAgICAgICAgICBjLT5nb3RfaGVhZGVyID0gMDsKKyAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMjEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZGlzcGxheSBpbmZvIHNpemUgJSJQUkl1MzIiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjaHVua19zaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMtPndpZHRoICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZiYyk7CisgICAgICAgICAgICBjLT5oZWlnaHQgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmYmMpOworICAgICAgICAgICAgaWYgKGMtPndpZHRoICA8IDE2IHx8IGMtPndpZHRoICA+IGMtPm9yaWdfd2lkdGggfHwKKyAgICAgICAgICAgICAgICBjLT5oZWlnaHQgPCAxNiB8fCBjLT5oZWlnaHQgPiBjLT5vcmlnX2hlaWdodCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmcmFtZSBkaW1lbnNpb25zICVkeCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjLT53aWR0aCwgYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gaGVhZGVyX2ZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYy0+d2lkdGggIT0gYXZjdHgtPndpZHRoIHx8IGMtPmhlaWdodCAhPSBhdmN0eC0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIGMtPndpZHRoLCBjLT5oZWlnaHQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGhlYWRlcl9mYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+Y29tcHJlc3Npb24gPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmYmMpOworICAgICAgICAgICAgaWYgKGMtPmNvbXByZXNzaW9uICE9IDIgJiYgYy0+Y29tcHJlc3Npb24gIT0gMykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGMtPmNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICBnb3RvIGhlYWRlcl9mYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+dGlsZV93aWR0aCAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmYmMpOworICAgICAgICAgICAgYy0+dGlsZV9oZWlnaHQgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmYmMpOworICAgICAgICAgICAgaWYgKGMtPnRpbGVfd2lkdGggPD0gMCB8fCBjLT50aWxlX2hlaWdodCA8PSAwIHx8CisgICAgICAgICAgICAgICAgKChjLT50aWxlX3dpZHRoIHwgYy0+dGlsZV9oZWlnaHQpICYgMHhGKSB8fAorICAgICAgICAgICAgICAgIGMtPnRpbGVfd2lkdGggKiA0TEwgKiBjLT50aWxlX2hlaWdodCA+PSBJTlRfTUFYCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdGlsZSBkaW1lbnNpb25zICVkeCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjLT50aWxlX3dpZHRoLCBjLT50aWxlX2hlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGhlYWRlcl9mYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+dGlsZXNfeCA9IChjLT53aWR0aCAgKyBjLT50aWxlX3dpZHRoICAtIDEpIC8gYy0+dGlsZV93aWR0aDsKKyAgICAgICAgICAgIGMtPnRpbGVzX3kgPSAoYy0+aGVpZ2h0ICsgYy0+dGlsZV9oZWlnaHQgLSAxKSAvIGMtPnRpbGVfaGVpZ2h0OworICAgICAgICAgICAgYy0+YnBwICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZiYyk7CisgICAgICAgICAgICBpZiAoYy0+YnBwID09IDMyKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZiYykgPCAxNiB8fAorICAgICAgICAgICAgICAgICAgICAoY2h1bmtfc2l6ZSAtIDIxKSA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc3BsYXkgaW5mbzogbWlzc2luZyBiaXRtYXNrcyFcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICBnb3RvIGhlYWRlcl9mYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByX21hc2sgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmYmMpOworICAgICAgICAgICAgICAgIGdfbWFzayA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZiYyk7CisgICAgICAgICAgICAgICAgYl9tYXNrID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmJjKTsKKyAgICAgICAgICAgICAgICBpZiAocl9tYXNrICE9IDB4RkYwMDAwIHx8IGdfbWFzayAhPSAweEZGMDAgfHwgYl9tYXNrICE9IDB4RkYpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvciB1bnN1cHBvcnRlZCBiaXRtYXNrczogUj0lIlBSSVgzMiIsIEc9JSJQUklYMzIiLCBCPSUiUFJJWDMyIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfbWFzaywgZ19tYXNrLCBiX21hc2spOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBoZWFkZXJfZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgImJwcD0lZCIsIGMtPmJwcCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgZ290byBoZWFkZXJfZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnMm1faW5pdF9idWZmZXJzKGMpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gaGVhZGVyX2ZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RfaGVhZGVyID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRJTEVfREFUQToKKyAgICAgICAgICAgIGlmICghYy0+dGlsZXNfeCB8fCAhYy0+dGlsZXNfeSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJObyBkaXNwbGF5IGluZm8gLSBza2lwcGluZyB0aWxlXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCB0aWxlIGRhdGEgc2l6ZSAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+dGlsZV94ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmJjKTsKKyAgICAgICAgICAgIGMtPnRpbGVfeSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZiYyk7CisgICAgICAgICAgICBpZiAoYy0+dGlsZV94ID49IGMtPnRpbGVzX3ggfHwgYy0+dGlsZV95ID49IGMtPnRpbGVzX3kpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdGlsZSBwb3MgJWQsJWQgKGluICVkeCVkIGdyaWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjLT50aWxlX3gsIGMtPnRpbGVfeSwgYy0+dGlsZXNfeCwgYy0+dGlsZXNfeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgc3dpdGNoIChjLT5jb21wcmVzc2lvbikgeworICAgICAgICAgICAgY2FzZSBDT01QUl9FUElDX0pfQjoKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImVQSUMgai1iIGNvbXByZXNzaW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgICAgICBjYXNlIENPTVBSX0tFTVBGX0pfQjoKKyAgICAgICAgICAgICAgICByZXQgPSBrZW1wZl9kZWNvZGVfdGlsZShjLCBjLT50aWxlX3gsIGMtPnRpbGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgKyBieXRlc3RyZWFtMl90ZWxsKCZiYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSAtIDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCAmJiBjLT5mcmFtZWJ1ZikKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGRlY29kaW5nIHRpbGUgJWQsJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGMtPnRpbGVfeCwgYy0+dGlsZV95KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENVUlNPUl9QT1M6CisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY3Vyc29yIHBvcyBzaXplICUiUFJJdTMyIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLT5jdXJzb3JfeCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZiYyk7CisgICAgICAgICAgICBjLT5jdXJzb3JfeSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZiYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVVJTT1JfU0hBUEU6CisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY3Vyc29yIGRhdGEgc2l6ZSAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmdGJjLCBidWYgKyBieXRlc3RyZWFtMl90ZWxsKCZiYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUgLSA0KTsKKyAgICAgICAgICAgIGcybV9sb2FkX2N1cnNvcihhdmN0eCwgYywgJnRiYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSFVOS19DQzoKKyAgICAgICAgY2FzZSBDSFVOS19DRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlNraXBwaW5nIGNodW5rIHR5cGUgJTAyZFxuIiwKKyAgICAgICAgICAgICAgICAgICBjaHVua190eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5hdmlnYXRlIHRvIG5leHQgY2h1bmsgKi8KKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmYmMsIGNodW5rX3N0YXJ0ICsgY2h1bmtfc2l6ZSAtIGJ5dGVzdHJlYW0yX3RlbGwoJmJjKSk7CisgICAgfQorICAgIGlmIChnb3RfaGVhZGVyKQorICAgICAgICBjLT5nb3RfaGVhZGVyID0gMTsKKworICAgIGlmIChjLT53aWR0aCAmJiBjLT5oZWlnaHQgJiYgYy0+ZnJhbWVidWYpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwaWMsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHBpYy0+a2V5X2ZyYW1lID0gZ290X2hlYWRlcjsKKyAgICAgICAgcGljLT5waWN0X3R5cGUgPSBnb3RfaGVhZGVyID8gQVZfUElDVFVSRV9UWVBFX0kgOiBBVl9QSUNUVVJFX1RZUEVfUDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKQorICAgICAgICAgICAgbWVtY3B5KHBpYy0+ZGF0YVswXSArIGkgKiBwaWMtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgIGMtPmZyYW1lYnVmICsgaSAqIGMtPmZyYW1lYnVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICBjLT53aWR0aCAqIDMpOworICAgICAgICBnMm1fcGFpbnRfY3Vyc29yKGMsIHBpYy0+ZGF0YVswXSwgcGljLT5saW5lc2l6ZVswXSk7CisKKyAgICAgICAgKmdvdF9waWN0dXJlX3B0ciA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGJ1Zl9zaXplOworCitoZWFkZXJfZmFpbDoKKyAgICBjLT53aWR0aCAgID0KKyAgICBjLT5oZWlnaHQgID0gMDsKKyAgICBjLT50aWxlc194ID0KKyAgICBjLT50aWxlc195ID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZzJtX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBHMk1Db250ZXh0ICpjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBqcGdfaW5pdChhdmN0eCwgJmMtPmpjKSkgIT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBpbml0aWFsaXNlIFZMQ3NcbiIpOworICAgICAgICBqcGdfZnJlZV9jb250ZXh0KCZjLT5qYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjI0OworCisgICAgLy8gc3RvcmUgb3JpZ2luYWwgc2l6ZXMgYW5kIGNoZWNrIGFnYWluc3QgdGhvc2UgaWYgcmVzaXplIGhhcHBlbnMKKyAgICBjLT5vcmlnX3dpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICBjLT5vcmlnX2hlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGcybV9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBHMk1Db250ZXh0ICpjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGpwZ19mcmVlX2NvbnRleHQoJmMtPmpjKTsKKworICAgIGF2X2ZyZWVwKCZjLT5rZW1wZl9idWYpOworICAgIGF2X2ZyZWVwKCZjLT5rZW1wZl9mbGFncyk7CisgICAgYXZfZnJlZXAoJmMtPnN5bnRoX3RpbGUpOworICAgIGF2X2ZyZWVwKCZjLT5qcGVnX3RpbGUpOworICAgIGF2X2ZyZWVwKCZjLT5jdXJzb3IpOworICAgIGF2X2ZyZWVwKCZjLT5mcmFtZWJ1Zik7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9nMm1fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZzJtIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR28yTWVldGluZyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9HMk0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEcyTUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGcybV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBnMm1fZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBnMm1fZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZzcyMi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZzcyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMDRjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9nNzIyLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBHLjcyMiBBRFBDTSBhdWRpbyBlbmNvZGVyL2RlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIENNVSAxOTkzIENvbXB1dGVyIFNjaWVuY2UsIFNwZWVjaCBHcm91cAorICogICAgICAgICAgICAgICAgICAgICAgICBDaGVuZ3hpYW5nIEx1IGFuZCBBbGV4IEhhdXB0bWFubgorICogQ29weXJpZ2h0IChjKSAyMDA1IFN0ZXZlIFVuZGVyd29vZCA8c3RldmV1IGF0IGNvcHBpY2Uub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA5IEtlbmFuIEdpbGxldAorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEcuNzIyIEFEUENNIGF1ZGlvIGNvZGVjCisgKgorICogVGhpcyBHLjcyMiBkZWNvZGVyIGlzIGEgYml0LWV4YWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJVFUgRy43MjIKKyAqIHNwZWNpZmljYXRpb24gZm9yIGFsbCB0aHJlZSBzcGVjaWZpZWQgYml0cmF0ZXMgLSA2NDAwMGJwcywgNTYwMDBicHMKKyAqIGFuZCA0ODAwMGJwcy4gSXQgcGFzc2VzIHRoZSBJVFUgdGVzdHMuCisgKgorICogQG5vdGUgRm9yIHRoZSA1NjAwMGJwcyBhbmQgNDgwMDBicHMgYml0cmF0ZXMsIHRoZSBsb3dlc3QgMSBvciAyIGJpdHMKKyAqICAgICAgIHJlc3BlY3RpdmVseSBvZiBlYWNoIGJ5dGUgYXJlIGlnbm9yZWQuCisgKi8KKworI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJnNzIyLmgiCisKK3N0YXRpYyBjb25zdCBpbnQ4X3Qgc2lnbl9sb29rdXBbMl0gPSB7IC0xLCAxIH07CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGludl9sb2cyX3RhYmxlWzMyXSA9IHsKKyAgICAyMDQ4LCAyMDkzLCAyMTM5LCAyMTg2LCAyMjMzLCAyMjgyLCAyMzMyLCAyMzgzLAorICAgIDI0MzUsIDI0ODksIDI1NDMsIDI1OTksIDI2NTYsIDI3MTQsIDI3NzQsIDI4MzQsCisgICAgMjg5NiwgMjk2MCwgMzAyNSwgMzA5MSwgMzE1OCwgMzIyOCwgMzI5OCwgMzM3MSwKKyAgICAzNDQ0LCAzNTIwLCAzNTk3LCAzNjc2LCAzNzU2LCAzODM4LCAzOTIyLCA0MDA4Cit9Oworc3RhdGljIGNvbnN0IGludDE2X3QgaGlnaF9sb2dfZmFjdG9yX3N0ZXBbMl0gPSB7IDc5OCwgLTIxNCB9OworY29uc3QgaW50MTZfdCBmZl9nNzIyX2hpZ2hfaW52X3F1YW50WzRdID0geyAtOTI2LCAtMjAyLCA5MjYsIDIwMiB9OworLyoqCisgKiBsb3dfbG9nX2ZhY3Rvcl9zdGVwW2luZGV4XSA9PSB3bFtybDQyW2luZGV4XV0KKyAqLworc3RhdGljIGNvbnN0IGludDE2X3QgbG93X2xvZ19mYWN0b3Jfc3RlcFsxNl0gPSB7CisgICAgIC02MCwgMzA0MiwgMTE5OCwgNTM4LCAzMzQsIDE3MiwgIDU4LCAtMzAsCisgICAgMzA0MiwgMTE5OCwgIDUzOCwgMzM0LCAxNzIsICA1OCwgLTMwLCAtNjAKK307Citjb25zdCBpbnQxNl90IGZmX2c3MjJfbG93X2ludl9xdWFudDRbMTZdID0geworICAgICAgIDAsIC0yNTU3LCAtMTYxMiwgLTExMjEsICAtNzg2LCAgLTUzMCwgIC0zMjMsICAtMTUwLAorICAgIDI1NTcsICAxNjEyLCAgMTEyMSwgICA3ODYsICAgNTMwLCAgIDMyMywgICAxNTAsICAgICAwCit9OworY29uc3QgaW50MTZfdCBmZl9nNzIyX2xvd19pbnZfcXVhbnQ2WzY0XSA9IHsKKyAgICAgLTE3LCAgIC0xNywgICAtMTcsICAgLTE3LCAtMzEwMSwgLTI3MzgsIC0yMzc2LCAtMjA4OCwKKyAgIC0xODczLCAtMTY4OSwgLTE1MzUsIC0xMzk5LCAtMTI3OSwgLTExNzAsIC0xMDcyLCAgLTk4MiwKKyAgICAtODk5LCAgLTgyMiwgIC03NTAsICAtNjgyLCAgLTYxOCwgIC01NTgsICAtNTAxLCAgLTQ0NywKKyAgICAtMzk2LCAgLTM0NywgIC0zMDAsICAtMjU0LCAgLTIxMSwgIC0xNzAsICAtMTMwLCAgIC05MSwKKyAgICAzMTAxLCAgMjczOCwgIDIzNzYsICAyMDg4LCAgMTg3MywgIDE2ODksICAxNTM1LCAgMTM5OSwKKyAgICAxMjc5LCAgMTE3MCwgIDEwNzIsICAgOTgyLCAgIDg5OSwgICA4MjIsICAgNzUwLCAgIDY4MiwKKyAgICAgNjE4LCAgIDU1OCwgICA1MDEsICAgNDQ3LCAgIDM5NiwgICAzNDcsICAgMzAwLCAgIDI1NCwKKyAgICAgMjExLCAgIDE3MCwgICAxMzAsICAgIDkxLCAgICA1NCwgICAgMTcsICAgLTU0LCAgIC0xNworfTsKKworLyoqCisgKiBxdWFkcmF0dXJlIG1pcnJvciBmaWx0ZXIgKFFNRikgY29lZmZpY2llbnRzCisgKgorICogSVRVLVQgRy43MjIgVGFibGUgMTEKKyAqLworc3RhdGljIGNvbnN0IGludDE2X3QgcW1mX2NvZWZmc1sxMl0gPSB7CisgICAgMywgLTExLCAxMiwgMzIsIC0yMTAsIDk1MSwgMzg3NiwgLTgwNSwgMzYyLCAtMTU2LCA1MywgLTExLAorfTsKKworCisvKioKKyAqIGFkYXB0aXZlIHByZWRpY3RvcgorICoKKyAqIEBwYXJhbSBjdXJfZGlmZiB0aGUgZGVxdWFudGl6ZWQgYW5kIHNjYWxlZCBkZWx0YSBjYWxjdWxhdGVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICAgY3VycmVudCBjb2Rld29yZAorICovCitzdGF0aWMgdm9pZCBkb19hZGFwdGl2ZV9wcmVkaWN0aW9uKHN0cnVjdCBHNzIyQmFuZCAqYmFuZCwgY29uc3QgaW50IGN1cl9kaWZmKQoreworICAgIGludCBzZ1syXSwgbGltaXQsIGksIGN1cl9xdHpkX3JlY29uc3Q7CisKKyAgICBjb25zdCBpbnQgY3VyX3BhcnRfcmVjb25zdCA9IGJhbmQtPnNfemVybyArIGN1cl9kaWZmIDwgMDsKKworICAgIHNnWzBdID0gc2lnbl9sb29rdXBbY3VyX3BhcnRfcmVjb25zdCAhPSBiYW5kLT5wYXJ0X3JlY29uc3RfbWVtWzBdXTsKKyAgICBzZ1sxXSA9IHNpZ25fbG9va3VwW2N1cl9wYXJ0X3JlY29uc3QgPT0gYmFuZC0+cGFydF9yZWNvbnN0X21lbVsxXV07CisgICAgYmFuZC0+cGFydF9yZWNvbnN0X21lbVsxXSA9IGJhbmQtPnBhcnRfcmVjb25zdF9tZW1bMF07CisgICAgYmFuZC0+cGFydF9yZWNvbnN0X21lbVswXSA9IGN1cl9wYXJ0X3JlY29uc3Q7CisKKyAgICBiYW5kLT5wb2xlX21lbVsxXSA9IGF2X2NsaXAoKHNnWzBdICogYXZfY2xpcChiYW5kLT5wb2xlX21lbVswXSwgLTgxOTEsIDgxOTEpID4+IDUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNnWzFdIDw8IDcpICsgKGJhbmQtPnBvbGVfbWVtWzFdICogMTI3ID4+IDcpLCAtMTIyODgsIDEyMjg4KTsKKworICAgIGxpbWl0ID0gMTUzNjAgLSBiYW5kLT5wb2xlX21lbVsxXTsKKyAgICBiYW5kLT5wb2xlX21lbVswXSA9IGF2X2NsaXAoLTE5MiAqIHNnWzBdICsgKGJhbmQtPnBvbGVfbWVtWzBdICogMjU1ID4+IDgpLCAtbGltaXQsIGxpbWl0KTsKKworCisgICAgaWYgKGN1cl9kaWZmKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICBiYW5kLT56ZXJvX21lbVtpXSA9ICgoYmFuZC0+emVyb19tZW1baV0qMjU1KSA+PiA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmFuZC0+ZGlmZl9tZW1baV1eY3VyX2RpZmYpIDwgMCA/IC0xMjggOiAxMjgpOworICAgIH0gZWxzZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgYmFuZC0+emVyb19tZW1baV0gPSAoYmFuZC0+emVyb19tZW1baV0qMjU1KSA+PiA4OworCisgICAgZm9yIChpID0gNTsgaSA+IDA7IGktLSkKKyAgICAgICAgYmFuZC0+ZGlmZl9tZW1baV0gPSBiYW5kLT5kaWZmX21lbVtpLTFdOworICAgIGJhbmQtPmRpZmZfbWVtWzBdID0gYXZfY2xpcF9pbnQxNihjdXJfZGlmZiA8PCAxKTsKKworICAgIGJhbmQtPnNfemVybyA9IDA7CisgICAgZm9yIChpID0gNTsgaSA+PSAwOyBpLS0pCisgICAgICAgIGJhbmQtPnNfemVybyArPSAoYmFuZC0+emVyb19tZW1baV0qYmFuZC0+ZGlmZl9tZW1baV0pID4+IDE1OworCisKKyAgICBjdXJfcXR6ZF9yZWNvbnN0ID0gYXZfY2xpcF9pbnQxNigoYmFuZC0+c19wcmVkaWN0b3IgKyBjdXJfZGlmZikgPDwgMSk7CisgICAgYmFuZC0+c19wcmVkaWN0b3IgPSBhdl9jbGlwX2ludDE2KGJhbmQtPnNfemVybyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYW5kLT5wb2xlX21lbVswXSAqIGN1cl9xdHpkX3JlY29uc3QgPj4gMTUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhbmQtPnBvbGVfbWVtWzFdICogYmFuZC0+cHJldl9xdHpkX3JlY29uc3QgPj4gMTUpKTsKKyAgICBiYW5kLT5wcmV2X3F0emRfcmVjb25zdCA9IGN1cl9xdHpkX3JlY29uc3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmVhcl9zY2FsZV9mYWN0b3IoY29uc3QgaW50IGxvZ19mYWN0b3IpCit7CisgICAgY29uc3QgaW50IHdkMSA9IGludl9sb2cyX3RhYmxlWyhsb2dfZmFjdG9yID4+IDYpICYgMzFdOworICAgIGNvbnN0IGludCBzaGlmdCA9IGxvZ19mYWN0b3IgPj4gMTE7CisgICAgcmV0dXJuIHNoaWZ0IDwgMCA/IHdkMSA+PiAtc2hpZnQgOiB3ZDEgPDwgc2hpZnQ7Cit9CisKK3ZvaWQgZmZfZzcyMl91cGRhdGVfbG93X3ByZWRpY3RvcihzdHJ1Y3QgRzcyMkJhbmQgKmJhbmQsIGNvbnN0IGludCBpbG93KQoreworICAgIGRvX2FkYXB0aXZlX3ByZWRpY3Rpb24oYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPnNjYWxlX2ZhY3RvciAqIGZmX2c3MjJfbG93X2ludl9xdWFudDRbaWxvd10gPj4gMTApOworCisgICAgLy8gcXVhbnRpemVyIGFkYXB0YXRpb24KKyAgICBiYW5kLT5sb2dfZmFjdG9yICAgPSBhdl9jbGlwKChiYW5kLT5sb2dfZmFjdG9yICogMTI3ID4+IDcpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19sb2dfZmFjdG9yX3N0ZXBbaWxvd10sIDAsIDE4NDMyKTsKKyAgICBiYW5kLT5zY2FsZV9mYWN0b3IgPSBsaW5lYXJfc2NhbGVfZmFjdG9yKGJhbmQtPmxvZ19mYWN0b3IgLSAoOCA8PCAxMSkpOworfQorCit2b2lkIGZmX2c3MjJfdXBkYXRlX2hpZ2hfcHJlZGljdG9yKHN0cnVjdCBHNzIyQmFuZCAqYmFuZCwgY29uc3QgaW50IGRoaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpaGlnaCkKK3sKKyAgICBkb19hZGFwdGl2ZV9wcmVkaWN0aW9uKGJhbmQsIGRoaWdoKTsKKworICAgIC8vIHF1YW50aXplciBhZGFwdGF0aW9uCisgICAgYmFuZC0+bG9nX2ZhY3RvciAgID0gYXZfY2xpcCgoYmFuZC0+bG9nX2ZhY3RvciAqIDEyNyA+PiA3KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoX2xvZ19mYWN0b3Jfc3RlcFtpaGlnaCYxXSwgMCwgMjI1MjgpOworICAgIGJhbmQtPnNjYWxlX2ZhY3RvciA9IGxpbmVhcl9zY2FsZV9mYWN0b3IoYmFuZC0+bG9nX2ZhY3RvciAtICgxMCA8PCAxMSkpOworfQorCit2b2lkIGZmX2c3MjJfYXBwbHlfcW1mKGNvbnN0IGludDE2X3QgKnByZXZfc2FtcGxlcywgaW50ICp4b3V0MSwgaW50ICp4b3V0MikKK3sKKyAgICBpbnQgaTsKKworICAgICp4b3V0MSA9IDA7CisgICAgKnhvdXQyID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworICAgICAgICBNQUMxNigqeG91dDIsIHByZXZfc2FtcGxlc1syKmkgIF0sIHFtZl9jb2VmZnNbaSAgIF0pOworICAgICAgICBNQUMxNigqeG91dDEsIHByZXZfc2FtcGxlc1syKmkrMV0sIHFtZl9jb2VmZnNbMTEtaV0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2c3MjIuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3MjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjg5ODI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZzcyMi5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIENNVSAxOTkzIENvbXB1dGVyIFNjaWVuY2UsIFNwZWVjaCBHcm91cAorICogICAgICAgICAgICAgICAgICAgICAgICBDaGVuZ3hpYW5nIEx1IGFuZCBBbGV4IEhhdXB0bWFubgorICogQ29weXJpZ2h0IChjKSAyMDA1IFN0ZXZlIFVuZGVyd29vZCA8c3RldmV1IGF0IGNvcHBpY2Uub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA5IEtlbmFuIEdpbGxldAorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19HNzIyX0gKKyNkZWZpbmUgQVZDT0RFQ19HNzIyX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKworI2RlZmluZSBQUkVWX1NBTVBMRVNfQlVGX1NJWkUgMTAyNAorCit0eXBlZGVmIHN0cnVjdCBHNzIyQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50ICAgICBiaXRzX3Blcl9jb2Rld29yZDsKKyAgICBpbnQxNl90IHByZXZfc2FtcGxlc1tQUkVWX1NBTVBMRVNfQlVGX1NJWkVdOyAvLy88IG1lbW9yeSBvZiBwYXN0IGRlY29kZWQgc2FtcGxlcworICAgIGludCAgICAgcHJldl9zYW1wbGVzX3BvczsgICAgICAgIC8vLzwgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gcHJldl9zYW1wbGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFuZFswXSBhbmQgYmFuZFsxXSBjb3JyZXNwb25kIHJlc3BlY3RpdmVseSB0byB0aGUgbG93ZXIgYmFuZCBhbmQgaGlnaGVyIGJhbmQuCisgICAgICovCisgICAgc3RydWN0IEc3MjJCYW5kIHsKKyAgICAgICAgaW50MTZfdCBzX3ByZWRpY3RvcjsgICAgICAgICAvLy88IHByZWRpY3RvciBvdXRwdXQgdmFsdWUKKyAgICAgICAgaW50MzJfdCBzX3plcm87ICAgICAgICAgICAgICAvLy88IHByZXZpb3VzIG91dHB1dCBzaWduYWwgZnJvbSB6ZXJvIHByZWRpY3RvcgorICAgICAgICBpbnQ4X3QgIHBhcnRfcmVjb25zdF9tZW1bMl07IC8vLzwgc2lnbnMgb2YgcHJldmlvdXMgcGFydGlhbGx5IHJlY29uc3RydWN0ZWQgc2lnbmFscworICAgICAgICBpbnQxNl90IHByZXZfcXR6ZF9yZWNvbnN0OyAgIC8vLzwgcHJldmlvdXMgcXVhbnRpemVkIHJlY29uc3RydWN0ZWQgc2lnbmFsIChpbnRlcm5hbCB2YWx1ZSwgdXNpbmcgbG93X2ludl9xdWFudDQpCisgICAgICAgIGludDE2X3QgcG9sZV9tZW1bMl07ICAgICAgICAgLy8vPCBzZWNvbmQtb3JkZXIgcG9sZSBzZWN0aW9uIGNvZWZmaWNpZW50IGJ1ZmZlcgorICAgICAgICBpbnQzMl90IGRpZmZfbWVtWzZdOyAgICAgICAgIC8vLzwgcXVhbnRpemVyIGRpZmZlcmVuY2Ugc2lnbmFsIG1lbW9yeQorICAgICAgICBpbnQxNl90IHplcm9fbWVtWzZdOyAgICAgICAgIC8vLzwgU2V2ZW50aC1vcmRlciB6ZXJvIHNlY3Rpb24gY29lZmZpY2llbnQgYnVmZmVyCisgICAgICAgIGludDE2X3QgbG9nX2ZhY3RvcjsgICAgICAgICAgLy8vPCBkZWxheWVkIDItbG9nYXJpdGhtaWMgcXVhbnRpemVyIGZhY3RvcgorICAgICAgICBpbnQxNl90IHNjYWxlX2ZhY3RvcjsgICAgICAgIC8vLzwgZGVsYXllZCBxdWFudGl6ZXIgc2NhbGUgZmFjdG9yCisgICAgfSBiYW5kWzJdOworCisgICAgc3RydWN0IFRyZWxsaXNOb2RlIHsKKyAgICAgICAgc3RydWN0IEc3MjJCYW5kIHN0YXRlOworICAgICAgICB1aW50MzJfdCBzc2Q7CisgICAgICAgIGludCBwYXRoOworICAgIH0gKm5vZGVfYnVmWzJdLCAqKm5vZGVwX2J1ZlsyXTsKKworICAgIHN0cnVjdCBUcmVsbGlzUGF0aCB7CisgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgaW50IHByZXY7CisgICAgfSAqcGF0aHNbMl07Cit9IEc3MjJDb250ZXh0OworCitleHRlcm4gY29uc3QgaW50MTZfdCBmZl9nNzIyX2hpZ2hfaW52X3F1YW50WzRdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfZzcyMl9sb3dfaW52X3F1YW50NFsxNl07CitleHRlcm4gY29uc3QgaW50MTZfdCBmZl9nNzIyX2xvd19pbnZfcXVhbnQ2WzY0XTsKKwordm9pZCBmZl9nNzIyX3VwZGF0ZV9sb3dfcHJlZGljdG9yKHN0cnVjdCBHNzIyQmFuZCAqYmFuZCwgY29uc3QgaW50IGlsb3cpOworCit2b2lkIGZmX2c3MjJfdXBkYXRlX2hpZ2hfcHJlZGljdG9yKHN0cnVjdCBHNzIyQmFuZCAqYmFuZCwgY29uc3QgaW50IGRoaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaWhpZ2gpOworCit2b2lkIGZmX2c3MjJfYXBwbHlfcW1mKGNvbnN0IGludDE2X3QgKnByZXZfc2FtcGxlcywgaW50ICp4b3V0MSwgaW50ICp4b3V0Mik7CisKKyNlbmRpZiAvKiBBVkNPREVDX0c3MjJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZzcyMmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZzcyMmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YmQ2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9nNzIyZGVjLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIENNVSAxOTkzIENvbXB1dGVyIFNjaWVuY2UsIFNwZWVjaCBHcm91cAorICogICAgICAgICAgICAgICAgICAgICAgICBDaGVuZ3hpYW5nIEx1IGFuZCBBbGV4IEhhdXB0bWFubgorICogQ29weXJpZ2h0IChjKSAyMDA1IFN0ZXZlIFVuZGVyd29vZCA8c3RldmV1IGF0IGNvcHBpY2Uub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA5IEtlbmFuIEdpbGxldAorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEcuNzIyIEFEUENNIGF1ZGlvIGRlY29kZXIKKyAqCisgKiBUaGlzIEcuNzIyIGRlY29kZXIgaXMgYSBiaXQtZXhhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIElUVSBHLjcyMgorICogc3BlY2lmaWNhdGlvbiBmb3IgYWxsIHRocmVlIHNwZWNpZmllZCBiaXRyYXRlcyAtIDY0MDAwYnBzLCA1NjAwMGJwcworICogYW5kIDQ4MDAwYnBzLiBJdCBwYXNzZXMgdGhlIElUVSB0ZXN0cy4KKyAqCisgKiBAbm90ZSBGb3IgdGhlIDU2MDAwYnBzIGFuZCA0ODAwMGJwcyBiaXRyYXRlcywgdGhlIGxvd2VzdCAxIG9yIDIgYml0cworICogICAgICAgcmVzcGVjdGl2ZWx5IG9mIGVhY2ggYnl0ZSBhcmUgaWdub3JlZC4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImc3MjIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihHNzIyQ29udGV4dCwgeCkKKyNkZWZpbmUgQUQgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJiaXRzX3Blcl9jb2Rld29yZCIsICJCaXRzIHBlciBHNzIyIGNvZGV3b3JkIiwgT0ZGU0VUKGJpdHNfcGVyX2NvZGV3b3JkKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSA4IH0sIDYsIDgsIEFEIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGc3MjJfZGVjb2Rlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJnNzIyIGRlY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IGc3MjJfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCkKK3sKKyAgICBHNzIyQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdmN0eC0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIGF2Y3R4LT5zYW1wbGVfZm10ICAgICA9IEFWX1NBTVBMRV9GTVRfUzE2OworCisgICAgYy0+YmFuZFswXS5zY2FsZV9mYWN0b3IgPSA4OworICAgIGMtPmJhbmRbMV0uc2NhbGVfZmFjdG9yID0gMjsKKyAgICBjLT5wcmV2X3NhbXBsZXNfcG9zID0gMjI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGludDE2X3QgbG93X2ludl9xdWFudDVbMzJdID0geworICAgICAtMzUsICAgLTM1LCAtMjkxOSwgLTIxOTUsIC0xNzY1LCAtMTQ1OCwgLTEyMTksIC0xMDIzLAorICAgIC04NTgsICAtNzE0LCAgLTU4NywgIC00NzMsICAtMzcwLCAgLTI3NiwgIC0xOTAsICAtMTEwLAorICAgIDI5MTksICAyMTk1LCAgMTc2NSwgIDE0NTgsICAxMjE5LCAgMTAyMywgICA4NTgsICAgNzE0LAorICAgICA1ODcsICAgNDczLCAgIDM3MCwgICAyNzYsICAgMTkwLCAgIDExMCwgICAgMzUsICAgLTM1Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCAqIGNvbnN0IGxvd19pbnZfcXVhbnRzWzNdID0geyBmZl9nNzIyX2xvd19pbnZfcXVhbnQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19pbnZfcXVhbnQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9nNzIyX2xvd19pbnZfcXVhbnQ0IH07CisKK3N0YXRpYyBpbnQgZzcyMl9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBHNzIyQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIGludDE2X3QgKm91dF9idWY7CisgICAgaW50IGosIHJldDsKKyAgICBjb25zdCBpbnQgc2tpcCA9IDggLSBjLT5iaXRzX3Blcl9jb2Rld29yZDsKKyAgICBjb25zdCBpbnQxNl90ICpxdWFudGl6ZXJfdGFibGUgPSBsb3dfaW52X3F1YW50c1tza2lwXTsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IGF2cGt0LT5zaXplICogMjsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG91dF9idWYgPSAoaW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdOworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSAqIDgpOworCisgICAgZm9yIChqID0gMDsgaiA8IGF2cGt0LT5zaXplOyBqKyspIHsKKyAgICAgICAgaW50IGlsb3csIGloaWdoLCBybG93LCByaGlnaCwgZGhpZ2g7CisgICAgICAgIGludCB4b3V0MSwgeG91dDI7CisKKyAgICAgICAgaWhpZ2ggPSBnZXRfYml0cygmZ2IsIDIpOworICAgICAgICBpbG93ID0gZ2V0X2JpdHMoJmdiLCA2IC0gc2tpcCk7CisgICAgICAgIHNraXBfYml0cygmZ2IsIHNraXApOworCisgICAgICAgIHJsb3cgPSBhdl9jbGlwKChjLT5iYW5kWzBdLnNjYWxlX2ZhY3RvciAqIHF1YW50aXplcl90YWJsZVtpbG93XSA+PiAxMCkKKyAgICAgICAgICAgICAgICAgICAgICArIGMtPmJhbmRbMF0uc19wcmVkaWN0b3IsIC0xNjM4NCwgMTYzODMpOworCisgICAgICAgIGZmX2c3MjJfdXBkYXRlX2xvd19wcmVkaWN0b3IoJmMtPmJhbmRbMF0sIGlsb3cgPj4gKDIgLSBza2lwKSk7CisKKyAgICAgICAgZGhpZ2ggPSBjLT5iYW5kWzFdLnNjYWxlX2ZhY3RvciAqIGZmX2c3MjJfaGlnaF9pbnZfcXVhbnRbaWhpZ2hdID4+IDEwOworICAgICAgICByaGlnaCA9IGF2X2NsaXAoZGhpZ2ggKyBjLT5iYW5kWzFdLnNfcHJlZGljdG9yLCAtMTYzODQsIDE2MzgzKTsKKworICAgICAgICBmZl9nNzIyX3VwZGF0ZV9oaWdoX3ByZWRpY3RvcigmYy0+YmFuZFsxXSwgZGhpZ2gsIGloaWdoKTsKKworICAgICAgICBjLT5wcmV2X3NhbXBsZXNbYy0+cHJldl9zYW1wbGVzX3BvcysrXSA9IHJsb3cgKyByaGlnaDsKKyAgICAgICAgYy0+cHJldl9zYW1wbGVzW2MtPnByZXZfc2FtcGxlc19wb3MrK10gPSBybG93IC0gcmhpZ2g7CisgICAgICAgIGZmX2c3MjJfYXBwbHlfcW1mKGMtPnByZXZfc2FtcGxlcyArIGMtPnByZXZfc2FtcGxlc19wb3MgLSAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnhvdXQxLCAmeG91dDIpOworICAgICAgICAqb3V0X2J1ZisrID0gYXZfY2xpcF9pbnQxNih4b3V0MSA+PiAxMSk7CisgICAgICAgICpvdXRfYnVmKysgPSBhdl9jbGlwX2ludDE2KHhvdXQyID4+IDExKTsKKyAgICAgICAgaWYgKGMtPnByZXZfc2FtcGxlc19wb3MgPj0gUFJFVl9TQU1QTEVTX0JVRl9TSVpFKSB7CisgICAgICAgICAgICBtZW1tb3ZlKGMtPnByZXZfc2FtcGxlcywgYy0+cHJldl9zYW1wbGVzICsgYy0+cHJldl9zYW1wbGVzX3BvcyAtIDIyLAorICAgICAgICAgICAgICAgICAgICAyMiAqIHNpemVvZihjLT5wcmV2X3NhbXBsZXNbMF0pKTsKKyAgICAgICAgICAgIGMtPnByZXZfc2FtcGxlc19wb3MgPSAyMjsKKyAgICAgICAgfQorICAgIH0KKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl9hZHBjbV9nNzIyX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImc3MjIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHLjcyMiBBRFBDTSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9HNzIyLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihHNzIyQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZzcyMl9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBnNzIyX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZnNzIyX2RlY29kZXJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZzcyMmVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZzcyMmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYzdjODcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9nNzIyZW5jLmMKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIENNVSAxOTkzIENvbXB1dGVyIFNjaWVuY2UsIFNwZWVjaCBHcm91cAorICogICAgICAgICAgICAgICAgICAgICAgICBDaGVuZ3hpYW5nIEx1IGFuZCBBbGV4IEhhdXB0bWFubgorICogQ29weXJpZ2h0IChjKSAyMDA1IFN0ZXZlIFVuZGVyd29vZCA8c3RldmV1IGF0IGNvcHBpY2Uub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA5IEtlbmFuIEdpbGxldAorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEcuNzIyIEFEUENNIGF1ZGlvIGVuY29kZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZzcyMi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworI2RlZmluZSBGUkVFWkVfSU5URVJWQUwgMTI4CisKKy8qIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IHZhbHVlLiBBbGxvd2luZyBpbnNhbmVseSBsYXJnZSB2YWx1ZXMgbGVhZHMgdG8gc3RyYW5nZQorICAgcHJvYmxlbXMsIHNvIHdlIGxpbWl0IGl0IHRvIGEgcmVhc29uYWJsZSB2YWx1ZSAqLworI2RlZmluZSBNQVhfRlJBTUVfU0laRSAzMjc2OAorCisvKiBXZSBjbGlwIHRoZSB2YWx1ZSBvZiBhdmN0eC0+dHJlbGxpcyB0byBwcmV2ZW50IGRhdGEgdHlwZSBvdmVyZmxvd3MgYW5kCisgICB1bmRlZmluZWQgYmVoYXZpb3IuIFVzaW5nIGxhcmdlciB2YWx1ZXMgaXMgaW5zYW5lbHkgc2xvdyBhbnl3YXkuICovCisjZGVmaW5lIE1JTl9UUkVMTElTIDAKKyNkZWZpbmUgTUFYX1RSRUxMSVMgMTYKKworc3RhdGljIGF2X2NvbGQgaW50IGc3MjJfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBHNzIyQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmYy0+cGF0aHNbaV0pOworICAgICAgICBhdl9mcmVlcCgmYy0+bm9kZV9idWZbaV0pOworICAgICAgICBhdl9mcmVlcCgmYy0+bm9kZXBfYnVmW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBnNzIyX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICogYXZjdHgpCit7CisgICAgRzcyMkNvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IG1vbm8gdHJhY2tzIGFyZSBhbGxvd2VkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGMtPmJhbmRbMF0uc2NhbGVfZmFjdG9yID0gODsKKyAgICBjLT5iYW5kWzFdLnNjYWxlX2ZhY3RvciA9IDI7CisgICAgYy0+cHJldl9zYW1wbGVzX3BvcyA9IDIyOworCisgICAgaWYgKGF2Y3R4LT50cmVsbGlzKSB7CisgICAgICAgIGludCBmcm9udGllciA9IDEgPDwgYXZjdHgtPnRyZWxsaXM7CisgICAgICAgIGludCBtYXhfcGF0aHMgPSBmcm9udGllciAqIEZSRUVaRV9JTlRFUlZBTDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGMtPnBhdGhzW2ldID0gYXZfbWFsbG9jeihtYXhfcGF0aHMgKiBzaXplb2YoKipjLT5wYXRocykpOworICAgICAgICAgICAgYy0+bm9kZV9idWZbaV0gPSBhdl9tYWxsb2N6KDIgKiBmcm9udGllciAqIHNpemVvZigqKmMtPm5vZGVfYnVmKSk7CisgICAgICAgICAgICBjLT5ub2RlcF9idWZbaV0gPSBhdl9tYWxsb2N6KDIgKiBmcm9udGllciAqIHNpemVvZigqKmMtPm5vZGVwX2J1ZikpOworICAgICAgICAgICAgaWYgKCFjLT5wYXRoc1tpXSB8fCAhYy0+bm9kZV9idWZbaV0gfHwgIWMtPm5vZGVwX2J1ZltpXSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5mcmFtZV9zaXplKSB7CisgICAgICAgIC8qIHZhbGlkYXRlIGZyYW1lIHNpemUgKi8KKyAgICAgICAgaWYgKGF2Y3R4LT5mcmFtZV9zaXplICYgMSB8fCBhdmN0eC0+ZnJhbWVfc2l6ZSA+IE1BWF9GUkFNRV9TSVpFKSB7CisgICAgICAgICAgICBpbnQgbmV3X2ZyYW1lX3NpemU7CisKKyAgICAgICAgICAgIGlmIChhdmN0eC0+ZnJhbWVfc2l6ZSA9PSAxKQorICAgICAgICAgICAgICAgIG5ld19mcmFtZV9zaXplID0gMjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5mcmFtZV9zaXplID4gTUFYX0ZSQU1FX1NJWkUpCisgICAgICAgICAgICAgICAgbmV3X2ZyYW1lX3NpemUgPSBNQVhfRlJBTUVfU0laRTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuZXdfZnJhbWVfc2l6ZSA9IGF2Y3R4LT5mcmFtZV9zaXplIC0gMTsKKworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlJlcXVlc3RlZCBmcmFtZSBzaXplIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgImFsbG93ZWQuIFVzaW5nICVkIGluc3RlYWQgb2YgJWRcbiIsIG5ld19mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplKTsKKyAgICAgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gbmV3X2ZyYW1lX3NpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGlzIGlzIGFyYml0cmFyeS4gV2UgdXNlIDMyMCBiZWNhdXNlIGl0J3MgMjBtcyBAIDE2a0h6LCB3aGljaCBpcworICAgICAgICAgICBhIGNvbW1vbiBwYWNrZXQgc2l6ZSBmb3IgVm9JUCBhcHBsaWNhdGlvbnMgKi8KKyAgICAgICAgYXZjdHgtPmZyYW1lX3NpemUgPSAzMjA7CisgICAgfQorICAgIGF2Y3R4LT5pbml0aWFsX3BhZGRpbmcgPSAyMjsKKworICAgIGlmIChhdmN0eC0+dHJlbGxpcykgeworICAgICAgICAvKiB2YWxpZGF0ZSB0cmVsbGlzICovCisgICAgICAgIGlmIChhdmN0eC0+dHJlbGxpcyA8IE1JTl9UUkVMTElTIHx8IGF2Y3R4LT50cmVsbGlzID4gTUFYX1RSRUxMSVMpIHsKKyAgICAgICAgICAgIGludCBuZXdfdHJlbGxpcyA9IGF2X2NsaXAoYXZjdHgtPnRyZWxsaXMsIE1JTl9UUkVMTElTLCBNQVhfVFJFTExJUyk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiUmVxdWVzdGVkIHRyZWxsaXMgdmFsdWUgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAiYWxsb3dlZC4gVXNpbmcgJWQgaW5zdGVhZCBvZiAlZFxuIiwgbmV3X3RyZWxsaXMsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnRyZWxsaXMpOworICAgICAgICAgICAgYXZjdHgtPnRyZWxsaXMgPSBuZXdfdHJlbGxpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworZXJyb3I6CisgICAgZzcyMl9lbmNvZGVfY2xvc2UoYXZjdHgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGxvd19xdWFudFszM10gPSB7CisgICAgICAzNSwgICA3MiwgIDExMCwgIDE1MCwgIDE5MCwgIDIzMywgIDI3NiwgIDMyMywKKyAgICAgMzcwLCAgNDIyLCAgNDczLCAgNTMwLCAgNTg3LCAgNjUwLCAgNzE0LCAgNzg2LAorICAgICA4NTgsICA5NDAsIDEwMjMsIDExMjEsIDEyMTksIDEzMzksIDE0NTgsIDE2MTIsCisgICAgMTc2NSwgMTk4MCwgMjE5NSwgMjU1NywgMjkxOQorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGZpbHRlcl9zYW1wbGVzKEc3MjJDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqeGxvdywgaW50ICp4aGlnaCkKK3sKKyAgICBpbnQgeG91dDEsIHhvdXQyOworICAgIGMtPnByZXZfc2FtcGxlc1tjLT5wcmV2X3NhbXBsZXNfcG9zKytdID0gc2FtcGxlc1swXTsKKyAgICBjLT5wcmV2X3NhbXBsZXNbYy0+cHJldl9zYW1wbGVzX3BvcysrXSA9IHNhbXBsZXNbMV07CisgICAgZmZfZzcyMl9hcHBseV9xbWYoYy0+cHJldl9zYW1wbGVzICsgYy0+cHJldl9zYW1wbGVzX3BvcyAtIDI0LCAmeG91dDEsICZ4b3V0Mik7CisgICAgKnhsb3cgID0geG91dDEgKyB4b3V0MiA+PiAxNDsKKyAgICAqeGhpZ2ggPSB4b3V0MSAtIHhvdXQyID4+IDE0OworICAgIGlmIChjLT5wcmV2X3NhbXBsZXNfcG9zID49IFBSRVZfU0FNUExFU19CVUZfU0laRSkgeworICAgICAgICBtZW1tb3ZlKGMtPnByZXZfc2FtcGxlcywKKyAgICAgICAgICAgICAgICBjLT5wcmV2X3NhbXBsZXMgKyBjLT5wcmV2X3NhbXBsZXNfcG9zIC0gMjIsCisgICAgICAgICAgICAgICAgMjIgKiBzaXplb2YoYy0+cHJldl9zYW1wbGVzWzBdKSk7CisgICAgICAgIGMtPnByZXZfc2FtcGxlc19wb3MgPSAyMjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVuY29kZV9oaWdoKGNvbnN0IHN0cnVjdCBHNzIyQmFuZCAqc3RhdGUsIGludCB4aGlnaCkKK3sKKyAgICBpbnQgZGlmZiA9IGF2X2NsaXBfaW50MTYoeGhpZ2ggLSBzdGF0ZS0+c19wcmVkaWN0b3IpOworICAgIGludCBwcmVkID0gMTQxICogc3RhdGUtPnNjYWxlX2ZhY3RvciA+PiA4OworICAgICAgICAgICAvKiA9IGRpZmYgPj0gMCA/IChkaWZmIDwgcHJlZCkgKyAyIDogZGlmZiA+PSAtcHJlZCAqLworICAgIHJldHVybiAoKGRpZmYgXiAoZGlmZiA+PiAoc2l6ZW9mKGRpZmYpKjgtMSkpKSA8IHByZWQpICsgMiooZGlmZiA+PSAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZW5jb2RlX2xvdyhjb25zdCBzdHJ1Y3QgRzcyMkJhbmQqIHN0YXRlLCBpbnQgeGxvdykKK3sKKyAgICBpbnQgZGlmZiAgPSBhdl9jbGlwX2ludDE2KHhsb3cgLSBzdGF0ZS0+c19wcmVkaWN0b3IpOworICAgICAgICAgICAvKiA9IGRpZmYgPj0gMCA/IGRpZmYgOiAtKGRpZmYgKyAxKSAqLworICAgIGludCBsaW1pdCA9IGRpZmYgXiAoZGlmZiA+PiAoc2l6ZW9mKGRpZmYpKjgtMSkpOworICAgIGludCBpID0gMDsKKyAgICBsaW1pdCA9IGxpbWl0ICsgMSA8PCAxMDsKKyAgICBpZiAobGltaXQgPiBsb3dfcXVhbnRbOF0gKiBzdGF0ZS0+c2NhbGVfZmFjdG9yKQorICAgICAgICBpID0gOTsKKyAgICB3aGlsZSAoaSA8IDI5ICYmIGxpbWl0ID4gbG93X3F1YW50W2ldICogc3RhdGUtPnNjYWxlX2ZhY3RvcikKKyAgICAgICAgaSsrOworICAgIHJldHVybiAoZGlmZiA8IDAgPyAoaSA8IDIgPyA2MyA6IDMzKSA6IDYxKSAtIGk7Cit9CisKK3N0YXRpYyB2b2lkIGc3MjJfZW5jb2RlX3RyZWxsaXMoRzcyMkNvbnRleHQgKmMsIGludCB0cmVsbGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpzYW1wbGVzKQoreworICAgIGludCBpLCBqLCBrOworICAgIGludCBmcm9udGllciA9IDEgPDwgdHJlbGxpczsKKyAgICBzdHJ1Y3QgVHJlbGxpc05vZGUgKipub2Rlc1syXTsKKyAgICBzdHJ1Y3QgVHJlbGxpc05vZGUgKipub2Rlc19uZXh0WzJdOworICAgIGludCBwYXRoblsyXSA9IHswLCAwfSwgZnJvemUgPSAtMTsKKyAgICBzdHJ1Y3QgVHJlbGxpc1BhdGggKnBbMl07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIG5vZGVzW2ldID0gYy0+bm9kZXBfYnVmW2ldOworICAgICAgICBub2Rlc19uZXh0W2ldID0gYy0+bm9kZXBfYnVmW2ldICsgZnJvbnRpZXI7CisgICAgICAgIG1lbXNldChjLT5ub2RlcF9idWZbaV0sIDAsIDIgKiBmcm9udGllciAqIHNpemVvZigqYy0+bm9kZXBfYnVmW2ldKSk7CisgICAgICAgIG5vZGVzW2ldWzBdID0gYy0+bm9kZV9idWZbaV0gKyBmcm9udGllcjsKKyAgICAgICAgbm9kZXNbaV1bMF0tPnNzZCA9IDA7CisgICAgICAgIG5vZGVzW2ldWzBdLT5wYXRoID0gMDsKKyAgICAgICAgbm9kZXNbaV1bMF0tPnN0YXRlID0gYy0+YmFuZFtpXTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlcyA+PiAxOyBpKyspIHsKKyAgICAgICAgaW50IHhsb3csIHhoaWdoOworICAgICAgICBzdHJ1Y3QgVHJlbGxpc05vZGUgKm5leHRbMl07CisgICAgICAgIGludCBoZWFwX3Bvc1syXSA9IHswLCAwfTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICBuZXh0W2pdID0gYy0+bm9kZV9idWZbal0gKyBmcm9udGllciooaSAmIDEpOworICAgICAgICAgICAgbWVtc2V0KG5vZGVzX25leHRbal0sIDAsIGZyb250aWVyICogc2l6ZW9mKCoqbm9kZXNfbmV4dCkpOworICAgICAgICB9CisKKyAgICAgICAgZmlsdGVyX3NhbXBsZXMoYywgJnNhbXBsZXNbMippXSwgJnhsb3csICZ4aGlnaCk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGZyb250aWVyICYmIG5vZGVzWzBdW2pdOyBqKyspIHsKKyAgICAgICAgICAgIC8qIE9ubHkgayA+PiAyIGFmZmVjdHMgdGhlIGZ1dHVyZSBhZGFwdGl2ZSBzdGF0ZSwgdGhlcmVmb3JlIHRlc3RpbmcKKyAgICAgICAgICAgICAqIHNtYWxsIHN0ZXBzIHRoYXQgZG9uJ3QgY2hhbmdlIGsgPj4gMiBpcyB1c2VsZXNzLCB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgICAqIHZhbHVlIGZyb20gZW5jb2RlX2xvdyBpcyBiZXR0ZXIgdGhhbiB0aGVtLiBTaW5jZSB3ZSBzdGVwIGsKKyAgICAgICAgICAgICAqIGluIHN0ZXBzIG9mIDQsIG1ha2Ugc3VyZSByYW5nZSBpcyBhIG11bHRpcGxlIG9mIDQsIHNvIHRoYXQKKyAgICAgICAgICAgICAqIHdlIGRvbid0IG1pc3MgdGhlIG9yaWdpbmFsIHZhbHVlIGZyb20gZW5jb2RlX2xvdy4gKi8KKyAgICAgICAgICAgIGludCByYW5nZSA9IGogPCBmcm9udGllci8yID8gNCA6IDA7CisgICAgICAgICAgICBzdHJ1Y3QgVHJlbGxpc05vZGUgKmN1cl9ub2RlID0gbm9kZXNbMF1bal07CisKKyAgICAgICAgICAgIGludCBpbG93ID0gZW5jb2RlX2xvdygmY3VyX25vZGUtPnN0YXRlLCB4bG93KTsKKworICAgICAgICAgICAgZm9yIChrID0gaWxvdyAtIHJhbmdlOyBrIDw9IGlsb3cgKyByYW5nZSAmJiBrIDw9IDYzOyBrICs9IDQpIHsKKyAgICAgICAgICAgICAgICBpbnQgZGVjb2RlZCwgZGVjX2RpZmYsIHBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzc2Q7CisgICAgICAgICAgICAgICAgc3RydWN0IFRyZWxsaXNOb2RlKiBub2RlOworCisgICAgICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGRlY29kZWQgPSBhdl9jbGlwKChjdXJfbm9kZS0+c3RhdGUuc2NhbGVfZmFjdG9yICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9nNzIyX2xvd19pbnZfcXVhbnQ2W2tdID4+IDEwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1cl9ub2RlLT5zdGF0ZS5zX3ByZWRpY3RvciwgLTE2Mzg0LCAxNjM4Myk7CisgICAgICAgICAgICAgICAgZGVjX2RpZmYgPSB4bG93IC0gZGVjb2RlZDsKKworI2RlZmluZSBTVE9SRV9OT0RFKGluZGV4LCBVUERBVEUsIFZBTFVFKVwKKyAgICAgICAgICAgICAgICBzc2QgPSBjdXJfbm9kZS0+c3NkICsgZGVjX2RpZmYqZGVjX2RpZmY7XAorICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciB3cmFwYXJvdW5kLiBVc2luZyA2NCBiaXQgc3NkIGNvdW50ZXJzIHdvdWxkIFwKKyAgICAgICAgICAgICAgICAgKiBiZSBzaW1wbGVyLCBidXQgaXMgc2xvd2VyIG9uIHg4NiAzMiBiaXQuICovXAorICAgICAgICAgICAgICAgIGlmIChzc2QgPCBjdXJfbm9kZS0+c3NkKVwKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7XAorICAgICAgICAgICAgICAgIGlmIChoZWFwX3Bvc1tpbmRleF0gPCBmcm9udGllcikge1wKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gaGVhcF9wb3NbaW5kZXhdKys7XAorICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKHBhdGhuW2luZGV4XSA8IEZSRUVaRV9JTlRFUlZBTCAqIGZyb250aWVyKTtcCisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2Rlc19uZXh0W2luZGV4XVtwb3NdID0gbmV4dFtpbmRleF0rKztcCisgICAgICAgICAgICAgICAgICAgIG5vZGUtPnBhdGggPSBwYXRobltpbmRleF0rKztcCisgICAgICAgICAgICAgICAgfSBlbHNlIHtcCisgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZXBsYWNlIG9uZSBvZiB0aGUgbGVhZiBub2RlcyB3aXRoIHRoZSBuZXcgXAorICAgICAgICAgICAgICAgICAgICAgKiBvbmUsIGJ1dCBub3QgYWx3YXlzIHRlc3RpbmcgdGhlIHNhbWUgbGVhZiBwb3NpdGlvbiAqL1wKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gKGZyb250aWVyPj4xKSArIChoZWFwX3Bvc1tpbmRleF0gJiAoKGZyb250aWVyPj4xKSAtIDEpKTtcCisgICAgICAgICAgICAgICAgICAgIGlmIChzc2QgPj0gbm9kZXNfbmV4dFtpbmRleF1bcG9zXS0+c3NkKVwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1wKKyAgICAgICAgICAgICAgICAgICAgaGVhcF9wb3NbaW5kZXhdKys7XAorICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZXNfbmV4dFtpbmRleF1bcG9zXTtcCisgICAgICAgICAgICAgICAgfVwKKyAgICAgICAgICAgICAgICBub2RlLT5zc2QgPSBzc2Q7XAorICAgICAgICAgICAgICAgIG5vZGUtPnN0YXRlID0gY3VyX25vZGUtPnN0YXRlO1wKKyAgICAgICAgICAgICAgICBVUERBVEU7XAorICAgICAgICAgICAgICAgIGMtPnBhdGhzW2luZGV4XVtub2RlLT5wYXRoXS52YWx1ZSA9IFZBTFVFO1wKKyAgICAgICAgICAgICAgICBjLT5wYXRoc1tpbmRleF1bbm9kZS0+cGF0aF0ucHJldiA9IGN1cl9ub2RlLT5wYXRoO1wKKyAgICAgICAgICAgICAgICAvKiBTaWZ0IHRoZSBuZXdseSBpbnNlcnRlZCBub2RlIHVwIGluIHRoZSBoZWFwIHRvIHJlc3RvcmUgXAorICAgICAgICAgICAgICAgICAqIHRoZSBoZWFwIHByb3BlcnR5ICovXAorICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPiAwKSB7XAorICAgICAgICAgICAgICAgICAgICBpbnQgcGFyZW50ID0gKHBvcyAtIDEpID4+IDE7XAorICAgICAgICAgICAgICAgICAgICBpZiAobm9kZXNfbmV4dFtpbmRleF1bcGFyZW50XS0+c3NkIDw9IHNzZClcCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcCisgICAgICAgICAgICAgICAgICAgIEZGU1dBUChzdHJ1Y3QgVHJlbGxpc05vZGUqLCBub2Rlc19uZXh0W2luZGV4XVtwYXJlbnRdLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzX25leHRbaW5kZXhdW3Bvc10pO1wKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gcGFyZW50O1wKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU1RPUkVfTk9ERSgwLCBmZl9nNzIyX3VwZGF0ZV9sb3dfcHJlZGljdG9yKCZub2RlLT5zdGF0ZSwgayA+PiAyKSwgayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZnJvbnRpZXIgJiYgbm9kZXNbMV1bal07IGorKykgeworICAgICAgICAgICAgaW50IGloaWdoOworICAgICAgICAgICAgc3RydWN0IFRyZWxsaXNOb2RlICpjdXJfbm9kZSA9IG5vZGVzWzFdW2pdOworCisgICAgICAgICAgICAvKiBXZSBkb24ndCB0cnkgdG8gZ2V0IGFueSBpbml0aWFsIGd1ZXNzIGZvciBpaGlnaCB2aWEKKyAgICAgICAgICAgICAqIGVuY29kZV9oaWdoIC0gc2luY2UgdGhlcmUncyBvbmx5IDQgcG9zc2libGUgdmFsdWVzLCB0ZXN0CisgICAgICAgICAgICAgKiB0aGVtIGFsbC4gVGVzdGluZyBhbGwgb2YgdGhlc2UgZ2l2ZXMgYSBtdWNoLCBtdWNoIGxhcmdlcgorICAgICAgICAgICAgICogZ2FpbiB0aGFuIHRlc3RpbmcgYSBsYXJnZXIgcmFuZ2UgYXJvdW5kIGlsb3cuICovCisgICAgICAgICAgICBmb3IgKGloaWdoID0gMDsgaWhpZ2ggPCA0OyBpaGlnaCsrKSB7CisgICAgICAgICAgICAgICAgaW50IGRoaWdoLCBkZWNvZGVkLCBkZWNfZGlmZiwgcG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNzZDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgVHJlbGxpc05vZGUqIG5vZGU7CisKKyAgICAgICAgICAgICAgICBkaGlnaCA9IGN1cl9ub2RlLT5zdGF0ZS5zY2FsZV9mYWN0b3IgKgorICAgICAgICAgICAgICAgICAgICAgICAgZmZfZzcyMl9oaWdoX2ludl9xdWFudFtpaGlnaF0gPj4gMTA7CisgICAgICAgICAgICAgICAgZGVjb2RlZCA9IGF2X2NsaXAoZGhpZ2ggKyBjdXJfbm9kZS0+c3RhdGUuc19wcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE2Mzg0LCAxNjM4Myk7CisgICAgICAgICAgICAgICAgZGVjX2RpZmYgPSB4aGlnaCAtIGRlY29kZWQ7CisKKyAgICAgICAgICAgICAgICBTVE9SRV9OT0RFKDEsIGZmX2c3MjJfdXBkYXRlX2hpZ2hfcHJlZGljdG9yKCZub2RlLT5zdGF0ZSwgZGhpZ2gsIGloaWdoKSwgaWhpZ2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgRkZTV0FQKHN0cnVjdCBUcmVsbGlzTm9kZSoqLCBub2Rlc1tqXSwgbm9kZXNfbmV4dFtqXSk7CisKKyAgICAgICAgICAgIGlmIChub2Rlc1tqXVswXS0+c3NkID4gKDEgPDwgMTYpKSB7CisgICAgICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IGZyb250aWVyICYmIG5vZGVzW2pdW2tdOyBrKyspCisgICAgICAgICAgICAgICAgICAgIG5vZGVzW2pdW2tdLT5zc2QgLT0gbm9kZXNbal1bMF0tPnNzZDsKKyAgICAgICAgICAgICAgICBub2Rlc1tqXVswXS0+c3NkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpID09IGZyb3plICsgRlJFRVpFX0lOVEVSVkFMKSB7CisgICAgICAgICAgICBwWzBdID0gJmMtPnBhdGhzWzBdW25vZGVzWzBdWzBdLT5wYXRoXTsKKyAgICAgICAgICAgIHBbMV0gPSAmYy0+cGF0aHNbMV1bbm9kZXNbMV1bMF0tPnBhdGhdOworICAgICAgICAgICAgZm9yIChqID0gaTsgaiA+IGZyb3plOyBqLS0pIHsKKyAgICAgICAgICAgICAgICBkc3Rbal0gPSBwWzFdLT52YWx1ZSA8PCA2IHwgcFswXS0+dmFsdWU7CisgICAgICAgICAgICAgICAgcFswXSA9ICZjLT5wYXRoc1swXVtwWzBdLT5wcmV2XTsKKyAgICAgICAgICAgICAgICBwWzFdID0gJmMtPnBhdGhzWzFdW3BbMV0tPnByZXZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJvemUgPSBpOworICAgICAgICAgICAgcGF0aG5bMF0gPSBwYXRoblsxXSA9IDA7CisgICAgICAgICAgICBtZW1zZXQobm9kZXNbMF0gKyAxLCAwLCAoZnJvbnRpZXIgLSAxKSpzaXplb2YoKipub2RlcykpOworICAgICAgICAgICAgbWVtc2V0KG5vZGVzWzFdICsgMSwgMCwgKGZyb250aWVyIC0gMSkqc2l6ZW9mKCoqbm9kZXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBbMF0gPSAmYy0+cGF0aHNbMF1bbm9kZXNbMF1bMF0tPnBhdGhdOworICAgIHBbMV0gPSAmYy0+cGF0aHNbMV1bbm9kZXNbMV1bMF0tPnBhdGhdOworICAgIGZvciAoaiA9IGk7IGogPiBmcm96ZTsgai0tKSB7CisgICAgICAgIGRzdFtqXSA9IHBbMV0tPnZhbHVlIDw8IDYgfCBwWzBdLT52YWx1ZTsKKyAgICAgICAgcFswXSA9ICZjLT5wYXRoc1swXVtwWzBdLT5wcmV2XTsKKyAgICAgICAgcFsxXSA9ICZjLT5wYXRoc1sxXVtwWzFdLT5wcmV2XTsKKyAgICB9CisgICAgYy0+YmFuZFswXSA9IG5vZGVzWzBdWzBdLT5zdGF0ZTsKKyAgICBjLT5iYW5kWzFdID0gbm9kZXNbMV1bMF0tPnN0YXRlOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGVuY29kZV9ieXRlKEc3MjJDb250ZXh0ICpjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnNhbXBsZXMpCit7CisgICAgaW50IHhsb3csIHhoaWdoLCBpbG93LCBpaGlnaDsKKyAgICBmaWx0ZXJfc2FtcGxlcyhjLCBzYW1wbGVzLCAmeGxvdywgJnhoaWdoKTsKKyAgICBpaGlnaCA9IGVuY29kZV9oaWdoKCZjLT5iYW5kWzFdLCB4aGlnaCk7CisgICAgaWxvdyAgPSBlbmNvZGVfbG93ICgmYy0+YmFuZFswXSwgeGxvdyk7CisgICAgZmZfZzcyMl91cGRhdGVfaGlnaF9wcmVkaWN0b3IoJmMtPmJhbmRbMV0sIGMtPmJhbmRbMV0uc2NhbGVfZmFjdG9yICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfZzcyMl9oaWdoX2ludl9xdWFudFtpaGlnaF0gPj4gMTAsIGloaWdoKTsKKyAgICBmZl9nNzIyX3VwZGF0ZV9sb3dfcHJlZGljdG9yKCZjLT5iYW5kWzBdLCBpbG93ID4+IDIpOworICAgICpkc3QgPSBpaGlnaCA8PCA2IHwgaWxvdzsKK30KKworc3RhdGljIHZvaWQgZzcyMl9lbmNvZGVfbm9fdHJlbGxpcyhHNzIyQ29udGV4dCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgbmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqc2FtcGxlcykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSArPSAyKQorICAgICAgICBlbmNvZGVfYnl0ZShjLCBkc3QrKywgJnNhbXBsZXNbaV0pOworfQorCitzdGF0aWMgaW50IGc3MjJfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBHNzIyQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgaW50MTZfdCAqc2FtcGxlcyA9IChjb25zdCBpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisgICAgaW50IG5iX3NhbXBsZXMsIG91dF9zaXplLCByZXQ7CisKKyAgICBvdXRfc2l6ZSA9IChmcmFtZS0+bmJfc2FtcGxlcyArIDEpIC8gMjsKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBvdXRfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG5iX3NhbXBsZXMgPSBmcmFtZS0+bmJfc2FtcGxlcyAtIChmcmFtZS0+bmJfc2FtcGxlcyAmIDEpOworCisgICAgaWYgKGF2Y3R4LT50cmVsbGlzKQorICAgICAgICBnNzIyX2VuY29kZV90cmVsbGlzKGMsIGF2Y3R4LT50cmVsbGlzLCBhdnBrdC0+ZGF0YSwgbmJfc2FtcGxlcywgc2FtcGxlcyk7CisgICAgZWxzZQorICAgICAgICBnNzIyX2VuY29kZV9ub190cmVsbGlzKGMsIGF2cGt0LT5kYXRhLCBuYl9zYW1wbGVzLCBzYW1wbGVzKTsKKworICAgIC8qIGhhbmRsZSBsYXN0IGZyYW1lIHdpdGggb2RkIGZyYW1lX3NpemUgKi8KKyAgICBpZiAobmJfc2FtcGxlcyA8IGZyYW1lLT5uYl9zYW1wbGVzKSB7CisgICAgICAgIGludDE2X3QgbGFzdF9zYW1wbGVzWzJdID0geyBzYW1wbGVzW25iX3NhbXBsZXNdLCBzYW1wbGVzW25iX3NhbXBsZXNdIH07CisgICAgICAgIGVuY29kZV9ieXRlKGMsICZhdnBrdC0+ZGF0YVtuYl9zYW1wbGVzID4+IDFdLCBsYXN0X3NhbXBsZXMpOworICAgIH0KKworICAgIGlmIChmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBhdnBrdC0+cHRzID0gZnJhbWUtPnB0cyAtIGZmX3NhbXBsZXNfdG9fdGltZV9iYXNlKGF2Y3R4LCBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nKTsKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2FkcGNtX2c3MjJfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZzcyMiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkcuNzIyIEFEUENNIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0c3MjIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEc3MjJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBnNzIyX2VuY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGc3MjJfZW5jb2RlX2Nsb3NlLAorICAgIC5lbmNvZGUyICAgICAgICA9IGc3MjJfZW5jb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZzcyM18xLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9nNzIzXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmFmZDZhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZzcyM18xLmMKQEAgLTAsMCArMSwyNDg0IEBACisvKgorICogRy43MjMuMSBjb21wYXRpYmxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBCZW5qYW1pbiBMYXJzc29uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTW9oYW1lZCBOYXVmYWwgQmFzaGVlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBHLjcyMy4xIGNvbXBhdGlibGUgZGVjb2RlcgorICovCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiYWNlbHBfdmVjdG9ycy5oIgorI2luY2x1ZGUgImNlbHBfZmlsdGVycy5oIgorI2luY2x1ZGUgImNlbHBfbWF0aC5oIgorI2luY2x1ZGUgImc3MjNfMV9kYXRhLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBDTkdfUkFORE9NX1NFRUQgMTIzNDUKKwordHlwZWRlZiBzdHJ1Y3QgZzcyM18xX2NvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworCisgICAgRzcyM18xX1N1YmZyYW1lIHN1YmZyYW1lWzRdOworICAgIGVudW0gRnJhbWVUeXBlIGN1cl9mcmFtZV90eXBlOworICAgIGVudW0gRnJhbWVUeXBlIHBhc3RfZnJhbWVfdHlwZTsKKyAgICBlbnVtIFJhdGUgY3VyX3JhdGU7CisgICAgdWludDhfdCBsc3BfaW5kZXhbTFNQX0JBTkRTXTsKKyAgICBpbnQgcGl0Y2hfbGFnWzJdOworICAgIGludCBlcmFzZWRfZnJhbWVzOworCisgICAgaW50MTZfdCBwcmV2X2xzcFtMUENfT1JERVJdOworICAgIGludDE2X3Qgc2lkX2xzcFtMUENfT1JERVJdOworICAgIGludDE2X3QgcHJldl9leGNpdGF0aW9uW1BJVENIX01BWF07CisgICAgaW50MTZfdCBleGNpdGF0aW9uW1BJVENIX01BWCArIEZSQU1FX0xFTiArIDRdOworICAgIGludDE2X3Qgc3ludGhfbWVtW0xQQ19PUkRFUl07CisgICAgaW50MTZfdCBmaXJfbWVtW0xQQ19PUkRFUl07CisgICAgaW50ICAgICBpaXJfbWVtW0xQQ19PUkRFUl07CisKKyAgICBpbnQgcmFuZG9tX3NlZWQ7CisgICAgaW50IGNuZ19yYW5kb21fc2VlZDsKKyAgICBpbnQgaW50ZXJwX2luZGV4OworICAgIGludCBpbnRlcnBfZ2FpbjsKKyAgICBpbnQgc2lkX2dhaW47CisgICAgaW50IGN1cl9nYWluOworICAgIGludCByZWZsZWN0aW9uX2NvZWY7CisgICAgaW50IHBmX2dhaW47ICAgICAgICAgICAgICAgICAvLy88IGZvcm1hbnQgcG9zdGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBnYWluIHNjYWxpbmcgdW5pdCBtZW1vcnkKKyAgICBpbnQgcG9zdGZpbHRlcjsKKworICAgIGludDE2X3QgYXVkaW9bRlJBTUVfTEVOICsgTFBDX09SREVSICsgUElUQ0hfTUFYICsgNF07CisgICAgaW50MTZfdCBwcmV2X2RhdGFbSEFMRl9GUkFNRV9MRU5dOworICAgIGludDE2X3QgcHJldl93ZWlnaHRfc2lnW1BJVENIX01BWF07CisKKworICAgIGludDE2X3QgaHBmX2Zpcl9tZW07ICAgICAgICAgICAgICAgICAgIC8vLzwgaGlnaHBhc3MgZmlsdGVyIGZpcgorICAgIGludCAgICAgaHBmX2lpcl9tZW07ICAgICAgICAgICAgICAgICAgIC8vLzwgYW5kIGlpciBtZW1vcmllcworICAgIGludDE2X3QgcGVyZl9maXJfbWVtW0xQQ19PUkRFUl07ICAgICAgIC8vLzwgcGVyY2VwdHVhbCBmaWx0ZXIgZmlyCisgICAgaW50MTZfdCBwZXJmX2lpcl9tZW1bTFBDX09SREVSXTsgICAgICAgLy8vPCBhbmQgaWlyIG1lbW9yaWVzCisKKyAgICBpbnQxNl90IGhhcm1vbmljX21lbVtQSVRDSF9NQVhdOworfSBHNzIzXzFfQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGc3MjNfMV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRzcyM18xX0NvbnRleHQgKnAgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgICAgID0gQVZfU0FNUExFX0ZNVF9TMTY7CisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICBwLT5wZl9nYWluICAgICAgICAgICAgPSAxIDw8IDEyOworCisgICAgbWVtY3B5KHAtPnByZXZfbHNwLCBkY19sc3AsIExQQ19PUkRFUiAqIHNpemVvZigqcC0+cHJldl9sc3ApKTsKKyAgICBtZW1jcHkocC0+c2lkX2xzcCwgIGRjX2xzcCwgTFBDX09SREVSICogc2l6ZW9mKCpwLT5zaWRfbHNwKSk7CisKKyAgICBwLT5jbmdfcmFuZG9tX3NlZWQgPSBDTkdfUkFORE9NX1NFRUQ7CisgICAgcC0+cGFzdF9mcmFtZV90eXBlID0gU0lEX0ZSQU1FOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogVW5wYWNrIHRoZSBmcmFtZSBpbnRvIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIHAgICAgICAgICAgIHRoZSBjb250ZXh0CisgKiBAcGFyYW0gYnVmICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyCisgKiBAcGFyYW0gYnVmX3NpemUgICAgc2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgdW5wYWNrX2JpdHN0cmVhbShHNzIzXzFfQ29udGV4dCAqcCwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBhZF9jYl9sZW47CisgICAgaW50IHRlbXAsIGluZm9fYml0cywgaTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJ1Zl9zaXplICogOCk7CisKKyAgICAvKiBFeHRyYWN0IGZyYW1lIHR5cGUgYW5kIHJhdGUgaW5mbyAqLworICAgIGluZm9fYml0cyA9IGdldF9iaXRzKCZnYiwgMik7CisKKyAgICBpZiAoaW5mb19iaXRzID09IDMpIHsKKyAgICAgICAgcC0+Y3VyX2ZyYW1lX3R5cGUgPSBVTlRSQU5TTUlUVEVEX0ZSQU1FOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBFeHRyYWN0IDI0IGJpdCBsc3AgaW5kaWNlcywgOCBiaXQgZm9yIGVhY2ggYmFuZCAqLworICAgIHAtPmxzcF9pbmRleFsyXSA9IGdldF9iaXRzKCZnYiwgOCk7CisgICAgcC0+bHNwX2luZGV4WzFdID0gZ2V0X2JpdHMoJmdiLCA4KTsKKyAgICBwLT5sc3BfaW5kZXhbMF0gPSBnZXRfYml0cygmZ2IsIDgpOworCisgICAgaWYgKGluZm9fYml0cyA9PSAyKSB7CisgICAgICAgIHAtPmN1cl9mcmFtZV90eXBlID0gU0lEX0ZSQU1FOworICAgICAgICBwLT5zdWJmcmFtZVswXS5hbXBfaW5kZXggPSBnZXRfYml0cygmZ2IsIDYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBFeHRyYWN0IHRoZSBpbmZvIGNvbW1vbiB0byBib3RoIHJhdGVzICovCisgICAgcC0+Y3VyX3JhdGUgICAgICAgPSBpbmZvX2JpdHMgPyBSQVRFXzUzMDAgOiBSQVRFXzYzMDA7CisgICAgcC0+Y3VyX2ZyYW1lX3R5cGUgPSBBQ1RJVkVfRlJBTUU7CisKKyAgICBwLT5waXRjaF9sYWdbMF0gPSBnZXRfYml0cygmZ2IsIDcpOworICAgIGlmIChwLT5waXRjaF9sYWdbMF0gPiAxMjMpICAgICAgIC8qIHRlc3QgaWYgZm9yYmlkZGVuIGNvZGUgKi8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIHAtPnBpdGNoX2xhZ1swXSArPSBQSVRDSF9NSU47CisgICAgcC0+c3ViZnJhbWVbMV0uYWRfY2JfbGFnID0gZ2V0X2JpdHMoJmdiLCAyKTsKKworICAgIHAtPnBpdGNoX2xhZ1sxXSA9IGdldF9iaXRzKCZnYiwgNyk7CisgICAgaWYgKHAtPnBpdGNoX2xhZ1sxXSA+IDEyMykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHAtPnBpdGNoX2xhZ1sxXSArPSBQSVRDSF9NSU47CisgICAgcC0+c3ViZnJhbWVbM10uYWRfY2JfbGFnID0gZ2V0X2JpdHMoJmdiLCAyKTsKKyAgICBwLT5zdWJmcmFtZVswXS5hZF9jYl9sYWcgPSAxOworICAgIHAtPnN1YmZyYW1lWzJdLmFkX2NiX2xhZyA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgU1VCRlJBTUVTOyBpKyspIHsKKyAgICAgICAgLyogRXh0cmFjdCBjb21iaW5lZCBnYWluICovCisgICAgICAgIHRlbXAgPSBnZXRfYml0cygmZ2IsIDEyKTsKKyAgICAgICAgYWRfY2JfbGVuID0gMTcwOworICAgICAgICBwLT5zdWJmcmFtZVtpXS5kaXJhY190cmFpbiA9IDA7CisgICAgICAgIGlmIChwLT5jdXJfcmF0ZSA9PSBSQVRFXzYzMDAgJiYgcC0+cGl0Y2hfbGFnW2kgPj4gMV0gPCBTVUJGUkFNRV9MRU4gLSAyKSB7CisgICAgICAgICAgICBwLT5zdWJmcmFtZVtpXS5kaXJhY190cmFpbiA9IHRlbXAgPj4gMTE7CisgICAgICAgICAgICB0ZW1wICY9IDB4N0ZGOworICAgICAgICAgICAgYWRfY2JfbGVuID0gODU7CisgICAgICAgIH0KKyAgICAgICAgcC0+c3ViZnJhbWVbaV0uYWRfY2JfZ2FpbiA9IEZBU1RESVYodGVtcCwgR0FJTl9MRVZFTFMpOworICAgICAgICBpZiAocC0+c3ViZnJhbWVbaV0uYWRfY2JfZ2FpbiA8IGFkX2NiX2xlbikgeworICAgICAgICAgICAgcC0+c3ViZnJhbWVbaV0uYW1wX2luZGV4ID0gdGVtcCAtIHAtPnN1YmZyYW1lW2ldLmFkX2NiX2dhaW4gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FJTl9MRVZFTFM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwLT5zdWJmcmFtZVswXS5ncmlkX2luZGV4ID0gZ2V0X2JpdHMxKCZnYik7CisgICAgcC0+c3ViZnJhbWVbMV0uZ3JpZF9pbmRleCA9IGdldF9iaXRzMSgmZ2IpOworICAgIHAtPnN1YmZyYW1lWzJdLmdyaWRfaW5kZXggPSBnZXRfYml0czEoJmdiKTsKKyAgICBwLT5zdWJmcmFtZVszXS5ncmlkX2luZGV4ID0gZ2V0X2JpdHMxKCZnYik7CisKKyAgICBpZiAocC0+Y3VyX3JhdGUgPT0gUkFURV82MzAwKSB7CisgICAgICAgIHNraXBfYml0czEoJmdiKTsgIC8qIHNraXAgcmVzZXJ2ZWQgYml0ICovCisKKyAgICAgICAgLyogQ29tcHV0ZSBwdWxzZV9wb3MgaW5kZXggdXNpbmcgdGhlIDEzLWJpdCBjb21iaW5lZCBwb3NpdGlvbiBpbmRleCAqLworICAgICAgICB0ZW1wID0gZ2V0X2JpdHMoJmdiLCAxMyk7CisgICAgICAgIHAtPnN1YmZyYW1lWzBdLnB1bHNlX3BvcyA9IHRlbXAgLyA4MTA7CisKKyAgICAgICAgdGVtcCAtPSBwLT5zdWJmcmFtZVswXS5wdWxzZV9wb3MgKiA4MTA7CisgICAgICAgIHAtPnN1YmZyYW1lWzFdLnB1bHNlX3BvcyA9IEZBU1RESVYodGVtcCwgOTApOworCisgICAgICAgIHRlbXAgLT0gcC0+c3ViZnJhbWVbMV0ucHVsc2VfcG9zICogOTA7CisgICAgICAgIHAtPnN1YmZyYW1lWzJdLnB1bHNlX3BvcyA9IEZBU1RESVYodGVtcCwgOSk7CisgICAgICAgIHAtPnN1YmZyYW1lWzNdLnB1bHNlX3BvcyA9IHRlbXAgLSBwLT5zdWJmcmFtZVsyXS5wdWxzZV9wb3MgKiA5OworCisgICAgICAgIHAtPnN1YmZyYW1lWzBdLnB1bHNlX3BvcyA9IChwLT5zdWJmcmFtZVswXS5wdWxzZV9wb3MgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHMoJmdiLCAxNik7CisgICAgICAgIHAtPnN1YmZyYW1lWzFdLnB1bHNlX3BvcyA9IChwLT5zdWJmcmFtZVsxXS5wdWxzZV9wb3MgPDwgMTQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHMoJmdiLCAxNCk7CisgICAgICAgIHAtPnN1YmZyYW1lWzJdLnB1bHNlX3BvcyA9IChwLT5zdWJmcmFtZVsyXS5wdWxzZV9wb3MgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHMoJmdiLCAxNik7CisgICAgICAgIHAtPnN1YmZyYW1lWzNdLnB1bHNlX3BvcyA9IChwLT5zdWJmcmFtZVszXS5wdWxzZV9wb3MgPDwgMTQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHMoJmdiLCAxNCk7CisKKyAgICAgICAgcC0+c3ViZnJhbWVbMF0ucHVsc2Vfc2lnbiA9IGdldF9iaXRzKCZnYiwgNik7CisgICAgICAgIHAtPnN1YmZyYW1lWzFdLnB1bHNlX3NpZ24gPSBnZXRfYml0cygmZ2IsIDUpOworICAgICAgICBwLT5zdWJmcmFtZVsyXS5wdWxzZV9zaWduID0gZ2V0X2JpdHMoJmdiLCA2KTsKKyAgICAgICAgcC0+c3ViZnJhbWVbM10ucHVsc2Vfc2lnbiA9IGdldF9iaXRzKCZnYiwgNSk7CisgICAgfSBlbHNlIHsgLyogNTMwMCBicHMgKi8KKyAgICAgICAgcC0+c3ViZnJhbWVbMF0ucHVsc2VfcG9zICA9IGdldF9iaXRzKCZnYiwgMTIpOworICAgICAgICBwLT5zdWJmcmFtZVsxXS5wdWxzZV9wb3MgID0gZ2V0X2JpdHMoJmdiLCAxMik7CisgICAgICAgIHAtPnN1YmZyYW1lWzJdLnB1bHNlX3BvcyAgPSBnZXRfYml0cygmZ2IsIDEyKTsKKyAgICAgICAgcC0+c3ViZnJhbWVbM10ucHVsc2VfcG9zICA9IGdldF9iaXRzKCZnYiwgMTIpOworCisgICAgICAgIHAtPnN1YmZyYW1lWzBdLnB1bHNlX3NpZ24gPSBnZXRfYml0cygmZ2IsIDQpOworICAgICAgICBwLT5zdWJmcmFtZVsxXS5wdWxzZV9zaWduID0gZ2V0X2JpdHMoJmdiLCA0KTsKKyAgICAgICAgcC0+c3ViZnJhbWVbMl0ucHVsc2Vfc2lnbiA9IGdldF9iaXRzKCZnYiwgNCk7CisgICAgICAgIHAtPnN1YmZyYW1lWzNdLnB1bHNlX3NpZ24gPSBnZXRfYml0cygmZ2IsIDQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEJpdGV4YWN0IGltcGxlbWVudGF0aW9uIG9mIHNxcnQodmFsLzIpLgorICovCitzdGF0aWMgaW50MTZfdCBzcXVhcmVfcm9vdCh1bnNpZ25lZCB2YWwpCit7CisgICAgYXZfYXNzZXJ0MighKHZhbCAmIDB4ODAwMDAwMDApKTsKKworICAgIHJldHVybiAoZmZfc3FydCh2YWwgPDwgMSkgPj4gMSkgJiAofjEpOworfQorCisvKioKKyAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGxlZnQtc2hpZnRzIHJlcXVpcmVkIGZvciBub3JtYWxpemluZyB0aGUgaW5wdXQuCisgKgorICogQHBhcmFtIG51bSAgIGlucHV0IG51bWJlcgorICogQHBhcmFtIHdpZHRoIHdpZHRoIG9mIHRoZSBpbnB1dCwgMTUgb3IgMzEgYml0cworICovCitzdGF0aWMgaW50IG5vcm1hbGl6ZV9iaXRzKGludCBudW0sIGludCB3aWR0aCkKK3sKKyAgICByZXR1cm4gd2lkdGggLSBhdl9sb2cyKG51bSkgLSAxOworfQorCisjZGVmaW5lIG5vcm1hbGl6ZV9iaXRzX2ludDE2KG51bSkgbm9ybWFsaXplX2JpdHMobnVtLCAxNSkKKyNkZWZpbmUgbm9ybWFsaXplX2JpdHNfaW50MzIobnVtKSBub3JtYWxpemVfYml0cyhudW0sIDMxKQorCisvKioKKyAqIFNjYWxlIHZlY3RvciBjb250ZW50cyBiYXNlZCBvbiB0aGUgbGFyZ2VzdCBvZiB0aGVpciBhYnNvbHV0ZXMuCisgKi8KK3N0YXRpYyBpbnQgc2NhbGVfdmVjdG9yKGludDE2X3QgKmRzdCwgY29uc3QgaW50MTZfdCAqdmVjdG9yLCBpbnQgbGVuZ3RoKQoreworICAgIGludCBiaXRzLCBtYXggPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBtYXggfD0gRkZBQlModmVjdG9yW2ldKTsKKworICAgIGJpdHM9IDE0IC0gYXZfbG9nMl8xNmJpdChtYXgpOworICAgIGJpdHM9IEZGTUFYKGJpdHMsIDApOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBkc3RbaV0gPSB2ZWN0b3JbaV0gPDwgYml0cyA+PiAzOworCisgICAgcmV0dXJuIGJpdHMgLSAzOworfQorCisvKioKKyAqIFBlcmZvcm0gaW52ZXJzZSBxdWFudGl6YXRpb24gb2YgTFNQIGZyZXF1ZW5jaWVzLgorICoKKyAqIEBwYXJhbSBjdXJfbHNwICAgIHRoZSBjdXJyZW50IExTUCB2ZWN0b3IKKyAqIEBwYXJhbSBwcmV2X2xzcCAgIHRoZSBwcmV2aW91cyBMU1AgdmVjdG9yCisgKiBAcGFyYW0gbHNwX2luZGV4ICBWUSBpbmRpY2VzCisgKiBAcGFyYW0gYmFkX2ZyYW1lICBiYWQgZnJhbWUgZmxhZworICovCitzdGF0aWMgdm9pZCBpbnZlcnNlX3F1YW50KGludDE2X3QgKmN1cl9sc3AsIGludDE2X3QgKnByZXZfbHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpsc3BfaW5kZXgsIGludCBiYWRfZnJhbWUpCit7CisgICAgaW50IG1pbl9kaXN0LCBwcmVkOworICAgIGludCBpLCBqLCB0ZW1wLCBzdGFibGU7CisKKyAgICAvKiBDaGVjayBmb3IgZnJhbWUgZXJhc3VyZSAqLworICAgIGlmICghYmFkX2ZyYW1lKSB7CisgICAgICAgIG1pbl9kaXN0ICAgICA9IDB4MTAwOworICAgICAgICBwcmVkICAgICAgICAgPSAxMjI4ODsKKyAgICB9IGVsc2UgeworICAgICAgICBtaW5fZGlzdCAgICAgPSAweDIwMDsKKyAgICAgICAgcHJlZCAgICAgICAgID0gMjM1NTI7CisgICAgICAgIGxzcF9pbmRleFswXSA9IGxzcF9pbmRleFsxXSA9IGxzcF9pbmRleFsyXSA9IDA7CisgICAgfQorCisgICAgLyogR2V0IHRoZSBWUSB0YWJsZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc21pdHRlZCBpbmRleCAqLworICAgIGN1cl9sc3BbMF0gPSBsc3BfYmFuZDBbbHNwX2luZGV4WzBdXVswXTsKKyAgICBjdXJfbHNwWzFdID0gbHNwX2JhbmQwW2xzcF9pbmRleFswXV1bMV07CisgICAgY3VyX2xzcFsyXSA9IGxzcF9iYW5kMFtsc3BfaW5kZXhbMF1dWzJdOworICAgIGN1cl9sc3BbM10gPSBsc3BfYmFuZDFbbHNwX2luZGV4WzFdXVswXTsKKyAgICBjdXJfbHNwWzRdID0gbHNwX2JhbmQxW2xzcF9pbmRleFsxXV1bMV07CisgICAgY3VyX2xzcFs1XSA9IGxzcF9iYW5kMVtsc3BfaW5kZXhbMV1dWzJdOworICAgIGN1cl9sc3BbNl0gPSBsc3BfYmFuZDJbbHNwX2luZGV4WzJdXVswXTsKKyAgICBjdXJfbHNwWzddID0gbHNwX2JhbmQyW2xzcF9pbmRleFsyXV1bMV07CisgICAgY3VyX2xzcFs4XSA9IGxzcF9iYW5kMltsc3BfaW5kZXhbMl1dWzJdOworICAgIGN1cl9sc3BbOV0gPSBsc3BfYmFuZDJbbHNwX2luZGV4WzJdXVszXTsKKworICAgIC8qIEFkZCBwcmVkaWN0ZWQgdmVjdG9yICYgREMgY29tcG9uZW50IHRvIHRoZSBwcmV2aW91c2x5IHF1YW50aXplZCB2ZWN0b3IgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBDX09SREVSOyBpKyspIHsKKyAgICAgICAgdGVtcCAgICAgICAgPSAoKHByZXZfbHNwW2ldIC0gZGNfbHNwW2ldKSAqIHByZWQgKyAoMSA8PCAxNCkpID4+IDE1OworICAgICAgICBjdXJfbHNwW2ldICs9IGRjX2xzcFtpXSArIHRlbXA7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUjsgaSsrKSB7CisgICAgICAgIGN1cl9sc3BbMF0gICAgICAgICAgICAgPSBGRk1BWChjdXJfbHNwWzBdLCAgMHgxODApOworICAgICAgICBjdXJfbHNwW0xQQ19PUkRFUiAtIDFdID0gRkZNSU4oY3VyX2xzcFtMUENfT1JERVIgLSAxXSwgMHg3ZTAwKTsKKworICAgICAgICAvKiBTdGFiaWxpdHkgY2hlY2sgKi8KKyAgICAgICAgZm9yIChqID0gMTsgaiA8IExQQ19PUkRFUjsgaisrKSB7CisgICAgICAgICAgICB0ZW1wID0gbWluX2Rpc3QgKyBjdXJfbHNwW2ogLSAxXSAtIGN1cl9sc3Bbal07CisgICAgICAgICAgICBpZiAodGVtcCA+IDApIHsKKyAgICAgICAgICAgICAgICB0ZW1wID4+PSAxOworICAgICAgICAgICAgICAgIGN1cl9sc3BbaiAtIDFdIC09IHRlbXA7CisgICAgICAgICAgICAgICAgY3VyX2xzcFtqXSAgICAgKz0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGFibGUgPSAxOworICAgICAgICBmb3IgKGogPSAxOyBqIDwgTFBDX09SREVSOyBqKyspIHsKKyAgICAgICAgICAgIHRlbXAgPSBjdXJfbHNwW2ogLSAxXSArIG1pbl9kaXN0IC0gY3VyX2xzcFtqXSAtIDQ7CisgICAgICAgICAgICBpZiAodGVtcCA+IDApIHsKKyAgICAgICAgICAgICAgICBzdGFibGUgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdGFibGUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFzdGFibGUpCisgICAgICAgIG1lbWNweShjdXJfbHNwLCBwcmV2X2xzcCwgTFBDX09SREVSICogc2l6ZW9mKCpjdXJfbHNwKSk7Cit9CisKKy8qKgorICogQml0ZXhhY3QgaW1wbGVtZW50YXRpb24gb2YgMmFiIHNjYWxlZCBieSAxLzJeMTYuCisgKgorICogQHBhcmFtIGEgMzIgYml0IG11bHRpcGxpY2FuZAorICogQHBhcmFtIGIgMTYgYml0IG11bHRpcGxpZXIKKyAqLworI2RlZmluZSBNVUxMMihhLCBiKSBcCisgICAgICAgIE1VTEwoYSxiLDE1KQorCisvKioKKyAqIENvbnZlcnQgTFNQIGZyZXF1ZW5jaWVzIHRvIExQQyBjb2VmZmljaWVudHMuCisgKgorICogQHBhcmFtIGxwYyBidWZmZXIgZm9yIExQQyBjb2VmZmljaWVudHMKKyAqLworc3RhdGljIHZvaWQgbHNwMmxwYyhpbnQxNl90ICpscGMpCit7CisgICAgaW50IGYxW0xQQ19PUkRFUiAvIDIgKyAxXTsKKyAgICBpbnQgZjJbTFBDX09SREVSIC8gMiArIDFdOworICAgIGludCBpLCBqOworCisgICAgLyogQ2FsY3VsYXRlIG5lZ2F0aXZlIGNvc2luZSAqLworICAgIGZvciAoaiA9IDA7IGogPCBMUENfT1JERVI7IGorKykgeworICAgICAgICBpbnQgaW5kZXggICAgID0gKGxwY1tqXSA+PiA3KSAmIDB4MUZGOworICAgICAgICBpbnQgb2Zmc2V0ICAgID0gbHBjW2pdICYgMHg3ZjsKKyAgICAgICAgaW50IHRlbXAxICAgICA9IGNvc190YWJbaW5kZXhdIDw8IDE2OworICAgICAgICBpbnQgdGVtcDIgICAgID0gKGNvc190YWJbaW5kZXggKyAxXSAtIGNvc190YWJbaW5kZXhdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICgob2Zmc2V0IDw8IDgpICsgMHg4MCkgPDwgMTsKKworICAgICAgICBscGNbal0gPSAtKGF2X3NhdF9kYWRkMzIoMSA8PCAxNSwgdGVtcDEgKyB0ZW1wMikgPj4gMTYpOworICAgIH0KKworICAgIC8qCisgICAgICogQ29tcHV0ZSBzdW0gYW5kIGRpZmZlcmVuY2UgcG9seW5vbWlhbCBjb2VmZmljaWVudHMKKyAgICAgKiAoYml0ZXhhY3QgYWx0ZXJuYXRpdmUgdG8gbHNwMnBvbHkoKSBpbiBsc3AuYykKKyAgICAgKi8KKyAgICAvKiBJbml0aWFsaXplIHdpdGggdmFsdWVzIGluIFEyOCAqLworICAgIGYxWzBdID0gMSA8PCAyODsKKyAgICBmMVsxXSA9IChscGNbMF0gPDwgMTQpICsgKGxwY1syXSA8PCAxNCk7CisgICAgZjFbMl0gPSBscGNbMF0gKiBscGNbMl0gKyAoMiA8PCAyOCk7CisKKyAgICBmMlswXSA9IDEgPDwgMjg7CisgICAgZjJbMV0gPSAobHBjWzFdIDw8IDE0KSArIChscGNbM10gPDwgMTQpOworICAgIGYyWzJdID0gbHBjWzFdICogbHBjWzNdICsgKDIgPDwgMjgpOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgYW5kIHNjYWxlIHRoZSBjb2VmZmljaWVudHMgYnkgMS8yIGluCisgICAgICogZWFjaCBpdGVyYXRpb24gZm9yIGEgZmluYWwgc2NhbGluZyBmYWN0b3Igb2YgUTI1CisgICAgICovCisgICAgZm9yIChpID0gMjsgaSA8IExQQ19PUkRFUiAvIDI7IGkrKykgeworICAgICAgICBmMVtpICsgMV0gPSBmMVtpIC0gMV0gKyBNVUxMMihmMVtpXSwgbHBjWzIgKiBpXSk7CisgICAgICAgIGYyW2kgKyAxXSA9IGYyW2kgLSAxXSArIE1VTEwyKGYyW2ldLCBscGNbMiAqIGkgKyAxXSk7CisKKyAgICAgICAgZm9yIChqID0gaTsgaiA+PSAyOyBqLS0pIHsKKyAgICAgICAgICAgIGYxW2pdID0gTVVMTDIoZjFbaiAtIDFdLCBscGNbMiAqIGldKSArCisgICAgICAgICAgICAgICAgICAgIChmMVtqXSA+PiAxKSArIChmMVtqIC0gMl0gPj4gMSk7CisgICAgICAgICAgICBmMltqXSA9IE1VTEwyKGYyW2ogLSAxXSwgbHBjWzIgKiBpICsgMV0pICsKKyAgICAgICAgICAgICAgICAgICAgKGYyW2pdID4+IDEpICsgKGYyW2ogLSAyXSA+PiAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGYxWzBdID4+PSAxOworICAgICAgICBmMlswXSA+Pj0gMTsKKyAgICAgICAgZjFbMV0gPSAoKGxwY1syICogaV0gICAgIDw8IDE2ID4+IGkpICsgZjFbMV0pID4+IDE7CisgICAgICAgIGYyWzFdID0gKChscGNbMiAqIGkgKyAxXSA8PCAxNiA+PiBpKSArIGYyWzFdKSA+PiAxOworICAgIH0KKworICAgIC8qIENvbnZlcnQgcG9seW5vbWlhbCBjb2VmZmljaWVudHMgdG8gTFBDIGNvZWZmaWNpZW50cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMUENfT1JERVIgLyAyOyBpKyspIHsKKyAgICAgICAgaW50NjRfdCBmZjEgPSBmMVtpICsgMV0gKyBmMVtpXTsKKyAgICAgICAgaW50NjRfdCBmZjIgPSBmMltpICsgMV0gLSBmMltpXTsKKworICAgICAgICBscGNbaV0gPSBhdl9jbGlwbF9pbnQzMigoKGZmMSArIGZmMikgPDwgMykgKyAoMSA8PCAxNSkpID4+IDE2OworICAgICAgICBscGNbTFBDX09SREVSIC0gaSAtIDFdID0gYXZfY2xpcGxfaW50MzIoKChmZjEgLSBmZjIpIDw8IDMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE1KSkgPj4gMTY7CisgICAgfQorfQorCisvKioKKyAqIFF1YW50aXplIExTUCBmcmVxdWVuY2llcyBieSBpbnRlcnBvbGF0aW9uIGFuZCBjb252ZXJ0IHRoZW0gdG8KKyAqIHRoZSBjb3JyZXNwb25kaW5nIExQQyBjb2VmZmljaWVudHMuCisgKgorICogQHBhcmFtIGxwYyAgICAgIGJ1ZmZlciBmb3IgTFBDIGNvZWZmaWNpZW50cworICogQHBhcmFtIGN1cl9sc3AgIHRoZSBjdXJyZW50IExTUCB2ZWN0b3IKKyAqIEBwYXJhbSBwcmV2X2xzcCB0aGUgcHJldmlvdXMgTFNQIHZlY3RvcgorICovCitzdGF0aWMgdm9pZCBsc3BfaW50ZXJwb2xhdGUoaW50MTZfdCAqbHBjLCBpbnQxNl90ICpjdXJfbHNwLCBpbnQxNl90ICpwcmV2X2xzcCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQxNl90ICpscGNfcHRyID0gbHBjOworCisgICAgLyogY3VyX2xzcCAqIDAuMjUgKyBwcmV2X2xzcCAqIDAuNzUgKi8KKyAgICBmZl9hY2VscF93ZWlnaHRlZF92ZWN0b3Jfc3VtKGxwYywgY3VyX2xzcCwgcHJldl9sc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LCAxMjI4OCwgMSA8PCAxMywgMTQsIExQQ19PUkRFUik7CisgICAgZmZfYWNlbHBfd2VpZ2h0ZWRfdmVjdG9yX3N1bShscGMgKyBMUENfT1JERVIsIGN1cl9sc3AsIHByZXZfbHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODE5MiwgODE5MiwgMSA8PCAxMywgMTQsIExQQ19PUkRFUik7CisgICAgZmZfYWNlbHBfd2VpZ2h0ZWRfdmVjdG9yX3N1bShscGMgKyAyICogTFBDX09SREVSLCBjdXJfbHNwLCBwcmV2X2xzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMjg4LCA0MDk2LCAxIDw8IDEzLCAxNCwgTFBDX09SREVSKTsKKyAgICBtZW1jcHkobHBjICsgMyAqIExQQ19PUkRFUiwgY3VyX2xzcCwgTFBDX09SREVSICogc2l6ZW9mKCpscGMpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBTVUJGUkFNRVM7IGkrKykgeworICAgICAgICBsc3AybHBjKGxwY19wdHIpOworICAgICAgICBscGNfcHRyICs9IExQQ19PUkRFUjsKKyAgICB9Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSB0cmFpbiBvZiBkaXJhYyBmdW5jdGlvbnMgd2l0aCBwZXJpb2QgYXMgcGl0Y2ggbGFnLgorICovCitzdGF0aWMgdm9pZCBnZW5fZGlyYWNfdHJhaW4oaW50MTZfdCAqYnVmLCBpbnQgcGl0Y2hfbGFnKQoreworICAgIGludDE2X3QgdmVjdG9yW1NVQkZSQU1FX0xFTl07CisgICAgaW50IGksIGo7CisKKyAgICBtZW1jcHkodmVjdG9yLCBidWYsIFNVQkZSQU1FX0xFTiAqIHNpemVvZigqdmVjdG9yKSk7CisgICAgZm9yIChpID0gcGl0Y2hfbGFnOyBpIDwgU1VCRlJBTUVfTEVOOyBpICs9IHBpdGNoX2xhZykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgU1VCRlJBTUVfTEVOIC0gaTsgaisrKQorICAgICAgICAgICAgYnVmW2kgKyBqXSArPSB2ZWN0b3Jbal07CisgICAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlIGZpeGVkIGNvZGVib29rIGV4Y2l0YXRpb24gdmVjdG9yLgorICoKKyAqIEBwYXJhbSB2ZWN0b3IgICAgZGVjb2RlZCBleGNpdGF0aW9uIHZlY3RvcgorICogQHBhcmFtIHN1YmZybSAgICBjdXJyZW50IHN1YmZyYW1lCisgKiBAcGFyYW0gY3VyX3JhdGUgIGN1cnJlbnQgYml0cmF0ZQorICogQHBhcmFtIHBpdGNoX2xhZyBjbG9zZWQgbG9vcCBwaXRjaCBsYWcKKyAqIEBwYXJhbSBpbmRleCAgICAgY3VycmVudCBzdWJmcmFtZSBpbmRleAorICovCitzdGF0aWMgdm9pZCBnZW5fZmNiX2V4Y2l0YXRpb24oaW50MTZfdCAqdmVjdG9yLCBHNzIzXzFfU3ViZnJhbWUgKnN1YmZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFJhdGUgY3VyX3JhdGUsIGludCBwaXRjaF9sYWcsIGludCBpbmRleCkKK3sKKyAgICBpbnQgdGVtcCwgaSwgajsKKworICAgIG1lbXNldCh2ZWN0b3IsIDAsIFNVQkZSQU1FX0xFTiAqIHNpemVvZigqdmVjdG9yKSk7CisKKyAgICBpZiAoY3VyX3JhdGUgPT0gUkFURV82MzAwKSB7CisgICAgICAgIGlmIChzdWJmcm0tPnB1bHNlX3BvcyA+PSBtYXhfcG9zW2luZGV4XSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvKiBEZWNvZGUgYW1wbGl0dWRlcyBhbmQgcG9zaXRpb25zICovCisgICAgICAgIGogPSBQVUxTRV9NQVggLSBwdWxzZXNbaW5kZXhdOworICAgICAgICB0ZW1wID0gc3ViZnJtLT5wdWxzZV9wb3M7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTVUJGUkFNRV9MRU4gLyBHUklEX1NJWkU7IGkrKykgeworICAgICAgICAgICAgdGVtcCAtPSBjb21iaW5hdG9yaWFsX3RhYmxlW2pdW2ldOworICAgICAgICAgICAgaWYgKHRlbXAgPj0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHRlbXAgKz0gY29tYmluYXRvcmlhbF90YWJsZVtqKytdW2ldOworICAgICAgICAgICAgaWYgKHN1YmZybS0+cHVsc2Vfc2lnbiAmICgxIDw8IChQVUxTRV9NQVggLSBqKSkpIHsKKyAgICAgICAgICAgICAgICB2ZWN0b3Jbc3ViZnJtLT5ncmlkX2luZGV4ICsgR1JJRF9TSVpFICogaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1maXhlZF9jYl9nYWluW3N1YmZybS0+YW1wX2luZGV4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmVjdG9yW3N1YmZybS0+Z3JpZF9pbmRleCArIEdSSURfU0laRSAqIGldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfY2JfZ2FpbltzdWJmcm0tPmFtcF9pbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA9PSBQVUxTRV9NQVgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1YmZybS0+ZGlyYWNfdHJhaW4gPT0gMSkKKyAgICAgICAgICAgIGdlbl9kaXJhY190cmFpbih2ZWN0b3IsIHBpdGNoX2xhZyk7CisgICAgfSBlbHNlIHsgLyogNTMwMCBicHMgKi8KKyAgICAgICAgaW50IGNiX2dhaW4gID0gZml4ZWRfY2JfZ2FpbltzdWJmcm0tPmFtcF9pbmRleF07CisgICAgICAgIGludCBjYl9zaGlmdCA9IHN1YmZybS0+Z3JpZF9pbmRleDsKKyAgICAgICAgaW50IGNiX3NpZ24gID0gc3ViZnJtLT5wdWxzZV9zaWduOworICAgICAgICBpbnQgY2JfcG9zICAgPSBzdWJmcm0tPnB1bHNlX3BvczsKKyAgICAgICAgaW50IG9mZnNldCwgYmV0YSwgbGFnOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDIpIHsKKyAgICAgICAgICAgIG9mZnNldCAgICAgICAgID0gKChjYl9wb3MgJiA3KSA8PCAzKSArIGNiX3NoaWZ0ICsgaTsKKyAgICAgICAgICAgIHZlY3RvcltvZmZzZXRdID0gKGNiX3NpZ24gJiAxKSA/IGNiX2dhaW4gOiAtY2JfZ2FpbjsKKyAgICAgICAgICAgIGNiX3BvcyAgPj49IDM7CisgICAgICAgICAgICBjYl9zaWduID4+PSAxOworICAgICAgICB9CisKKyAgICAgICAgLyogRW5oYW5jZSBoYXJtb25pYyBjb21wb25lbnRzICovCisgICAgICAgIGxhZyAgPSBwaXRjaF9jb250cmliW3N1YmZybS0+YWRfY2JfZ2FpbiA8PCAxXSArIHBpdGNoX2xhZyArCisgICAgICAgICAgICAgICBzdWJmcm0tPmFkX2NiX2xhZyAtIDE7CisgICAgICAgIGJldGEgPSBwaXRjaF9jb250cmliWyhzdWJmcm0tPmFkX2NiX2dhaW4gPDwgMSkgKyAxXTsKKworICAgICAgICBpZiAobGFnIDwgU1VCRlJBTUVfTEVOIC0gMikgeworICAgICAgICAgICAgZm9yIChpID0gbGFnOyBpIDwgU1VCRlJBTUVfTEVOOyBpKyspCisgICAgICAgICAgICAgICAgdmVjdG9yW2ldICs9IGJldGEgKiB2ZWN0b3JbaSAtIGxhZ10gPj4gMTU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogR2V0IGRlbGF5ZWQgY29udHJpYnV0aW9uIGZyb20gdGhlIHByZXZpb3VzIGV4Y2l0YXRpb24gdmVjdG9yLgorICovCitzdGF0aWMgdm9pZCBnZXRfcmVzaWR1YWwoaW50MTZfdCAqcmVzaWR1YWwsIGludDE2X3QgKnByZXZfZXhjaXRhdGlvbiwgaW50IGxhZykKK3sKKyAgICBpbnQgb2Zmc2V0ID0gUElUQ0hfTUFYIC0gUElUQ0hfT1JERVIgLyAyIC0gbGFnOworICAgIGludCBpOworCisgICAgcmVzaWR1YWxbMF0gPSBwcmV2X2V4Y2l0YXRpb25bb2Zmc2V0XTsKKyAgICByZXNpZHVhbFsxXSA9IHByZXZfZXhjaXRhdGlvbltvZmZzZXQgKyAxXTsKKworICAgIG9mZnNldCArPSAyOworICAgIGZvciAoaSA9IDI7IGkgPCBTVUJGUkFNRV9MRU4gKyBQSVRDSF9PUkRFUiAtIDE7IGkrKykKKyAgICAgICAgcmVzaWR1YWxbaV0gPSBwcmV2X2V4Y2l0YXRpb25bb2Zmc2V0ICsgKGkgLSAyKSAlIGxhZ107Cit9CisKK3N0YXRpYyBpbnQgZG90X3Byb2R1Y3QoY29uc3QgaW50MTZfdCAqYSwgY29uc3QgaW50MTZfdCAqYiwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgc3VtID0gZmZfZG90X3Byb2R1Y3QoYSxiLGxlbmd0aCk7CisgICAgcmV0dXJuIGF2X3NhdF9hZGQzMihzdW0sIHN1bSk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYWRhcHRpdmUgY29kZWJvb2sgZXhjaXRhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZ2VuX2FjYl9leGNpdGF0aW9uKGludDE2X3QgKnZlY3RvciwgaW50MTZfdCAqcHJldl9leGNpdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9sYWcsIEc3MjNfMV9TdWJmcmFtZSAqc3ViZnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gUmF0ZSBjdXJfcmF0ZSkKK3sKKyAgICBpbnQxNl90IHJlc2lkdWFsW1NVQkZSQU1FX0xFTiArIFBJVENIX09SREVSIC0gMV07CisgICAgY29uc3QgaW50MTZfdCAqY2JfcHRyOworICAgIGludCBsYWcgPSBwaXRjaF9sYWcgKyBzdWJmcm0tPmFkX2NiX2xhZyAtIDE7CisKKyAgICBpbnQgaTsKKyAgICBpbnQgc3VtOworCisgICAgZ2V0X3Jlc2lkdWFsKHJlc2lkdWFsLCBwcmV2X2V4Y2l0YXRpb24sIGxhZyk7CisKKyAgICAvKiBTZWxlY3QgcXVhbnRpemF0aW9uIHRhYmxlICovCisgICAgaWYgKGN1cl9yYXRlID09IFJBVEVfNjMwMCAmJiBwaXRjaF9sYWcgPCBTVUJGUkFNRV9MRU4gLSAyKSB7CisgICAgICAgIGNiX3B0ciA9IGFkYXB0aXZlX2NiX2dhaW44NTsKKyAgICB9IGVsc2UKKyAgICAgICAgY2JfcHRyID0gYWRhcHRpdmVfY2JfZ2FpbjE3MDsKKworICAgIC8qIENhbGN1bGF0ZSBhZGFwdGl2ZSB2ZWN0b3IgKi8KKyAgICBjYl9wdHIgKz0gc3ViZnJtLT5hZF9jYl9nYWluICogMjA7CisgICAgZm9yIChpID0gMDsgaSA8IFNVQkZSQU1FX0xFTjsgaSsrKSB7CisgICAgICAgIHN1bSA9IGZmX2RvdF9wcm9kdWN0KHJlc2lkdWFsICsgaSwgY2JfcHRyLCBQSVRDSF9PUkRFUik7CisgICAgICAgIHZlY3RvcltpXSA9IGF2X3NhdF9kYWRkMzIoMSA8PCAxNSwgYXZfc2F0X2FkZDMyKHN1bSwgc3VtKSkgPj4gMTY7CisgICAgfQorfQorCisvKioKKyAqIEVzdGltYXRlIG1heGltdW0gYXV0by1jb3JyZWxhdGlvbiBhcm91bmQgcGl0Y2ggbGFnLgorICoKKyAqIEBwYXJhbSBidWYgICAgICAgYnVmZmVyIHdpdGggb2Zmc2V0IGFwcGxpZWQKKyAqIEBwYXJhbSBvZmZzZXQgICAgb2Zmc2V0IG9mIHRoZSBleGNpdGF0aW9uIHZlY3RvcgorICogQHBhcmFtIGNjcl9tYXggICBwb2ludGVyIHRvIHRoZSBtYXhpbXVtIGF1dG8tY29ycmVsYXRpb24KKyAqIEBwYXJhbSBwaXRjaF9sYWcgZGVjb2RlZCBwaXRjaCBsYWcKKyAqIEBwYXJhbSBsZW5ndGggICAgbGVuZ3RoIG9mIGF1dG9jb3JyZWxhdGlvbgorICogQHBhcmFtIGRpciAgICAgICBmb3J3YXJkIGxhZygxKSAvIGJhY2t3YXJkIGxhZygtMSkKKyAqLworc3RhdGljIGludCBhdXRvY29ycl9tYXgoY29uc3QgaW50MTZfdCAqYnVmLCBpbnQgb2Zmc2V0LCBpbnQgKmNjcl9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfbGFnLCBpbnQgbGVuZ3RoLCBpbnQgZGlyKQoreworICAgIGludCBsaW1pdCwgY2NyLCBsYWcgPSAwOworICAgIGludCBpOworCisgICAgcGl0Y2hfbGFnID0gRkZNSU4oUElUQ0hfTUFYIC0gMywgcGl0Y2hfbGFnKTsKKyAgICBpZiAoZGlyID4gMCkKKyAgICAgICAgbGltaXQgPSBGRk1JTihGUkFNRV9MRU4gKyBQSVRDSF9NQVggLSBvZmZzZXQgLSBsZW5ndGgsIHBpdGNoX2xhZyArIDMpOworICAgIGVsc2UKKyAgICAgICAgbGltaXQgPSBwaXRjaF9sYWcgKyAzOworCisgICAgZm9yIChpID0gcGl0Y2hfbGFnIC0gMzsgaSA8PSBsaW1pdDsgaSsrKSB7CisgICAgICAgIGNjciA9IGRvdF9wcm9kdWN0KGJ1ZiwgYnVmICsgZGlyICogaSwgbGVuZ3RoKTsKKworICAgICAgICBpZiAoY2NyID4gKmNjcl9tYXgpIHsKKyAgICAgICAgICAgICpjY3JfbWF4ID0gY2NyOworICAgICAgICAgICAgbGFnID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGFnOworfQorCisvKioKKyAqIENhbGN1bGF0ZSBwaXRjaCBwb3N0ZmlsdGVyIG9wdGltYWwgYW5kIHNjYWxpbmcgZ2FpbnMuCisgKgorICogQHBhcmFtIGxhZyAgICAgIHBpdGNoIHBvc3RmaWx0ZXIgZm9yd2FyZC9iYWNrd2FyZCBsYWcKKyAqIEBwYXJhbSBwcGYgICAgICBwaXRjaCBwb3N0ZmlsdGVyIHBhcmFtZXRlcnMKKyAqIEBwYXJhbSBjdXJfcmF0ZSBjdXJyZW50IGJpdHJhdGUKKyAqIEBwYXJhbSB0Z3RfZW5nICB0YXJnZXQgZW5lcmd5CisgKiBAcGFyYW0gY2NyICAgICAgY3Jvc3MtY29ycmVsYXRpb24KKyAqIEBwYXJhbSByZXNfZW5nICByZXNpZHVhbCBlbmVyZ3kKKyAqLworc3RhdGljIHZvaWQgY29tcF9wcGZfZ2FpbnMoaW50IGxhZywgUFBGUGFyYW0gKnBwZiwgZW51bSBSYXRlIGN1cl9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRndF9lbmcsIGludCBjY3IsIGludCByZXNfZW5nKQoreworICAgIGludCBwZl9yZXNpZHVhbDsgICAgIC8qIHNxdWFyZSBvZiBwb3N0ZmlsdGVyZWQgcmVzaWR1YWwgKi8KKyAgICBpbnQgdGVtcDEsIHRlbXAyOworCisgICAgcHBmLT5pbmRleCA9IGxhZzsKKworICAgIHRlbXAxID0gdGd0X2VuZyAqIHJlc19lbmcgPj4gMTsKKyAgICB0ZW1wMiA9IGNjciAqIGNjciA8PCAxOworCisgICAgaWYgKHRlbXAyID4gdGVtcDEpIHsKKyAgICAgICAgaWYgKGNjciA+PSByZXNfZW5nKSB7CisgICAgICAgICAgICBwcGYtPm9wdF9nYWluID0gcHBmX2dhaW5fd2VpZ2h0W2N1cl9yYXRlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBwZi0+b3B0X2dhaW4gPSAoY2NyIDw8IDE1KSAvIHJlc19lbmcgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwZl9nYWluX3dlaWdodFtjdXJfcmF0ZV0gPj4gMTU7CisgICAgICAgIH0KKyAgICAgICAgLyogcGZfcmVzXjIgPSB0Z3RfZW5nICsgMipjY3IqZ2FpbiArIHJlc19lbmcqZ2Fpbl4yICovCisgICAgICAgIHRlbXAxICAgICAgID0gKHRndF9lbmcgPDwgMTUpICsgKGNjciAqIHBwZi0+b3B0X2dhaW4gPDwgMSk7CisgICAgICAgIHRlbXAyICAgICAgID0gKHBwZi0+b3B0X2dhaW4gKiBwcGYtPm9wdF9nYWluID4+IDE1KSAqIHJlc19lbmc7CisgICAgICAgIHBmX3Jlc2lkdWFsID0gYXZfc2F0X2FkZDMyKHRlbXAxLCB0ZW1wMiArICgxIDw8IDE1KSkgPj4gMTY7CisKKyAgICAgICAgaWYgKHRndF9lbmcgPj0gcGZfcmVzaWR1YWwgPDwgMSkgeworICAgICAgICAgICAgdGVtcDEgPSAweDdmZmY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZW1wMSA9ICh0Z3RfZW5nIDw8IDE0KSAvIHBmX3Jlc2lkdWFsOworICAgICAgICB9CisKKyAgICAgICAgLyogc2NhbGluZ19nYWluID0gc3FydCh0Z3RfZW5nL3BmX3Jlc14yKSAqLworICAgICAgICBwcGYtPnNjX2dhaW4gPSBzcXVhcmVfcm9vdCh0ZW1wMSA8PCAxNik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHBmLT5vcHRfZ2FpbiA9IDA7CisgICAgICAgIHBwZi0+c2NfZ2FpbiAgPSAweDdmZmY7CisgICAgfQorCisgICAgcHBmLT5vcHRfZ2FpbiA9IGF2X2NsaXBfaW50MTYocHBmLT5vcHRfZ2FpbiAqIHBwZi0+c2NfZ2FpbiA+PiAxNSk7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIHBpdGNoIHBvc3RmaWx0ZXIgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gcCAgICAgICAgIHRoZSBjb250ZXh0CisgKiBAcGFyYW0gb2Zmc2V0ICAgIG9mZnNldCBvZiB0aGUgZXhjaXRhdGlvbiB2ZWN0b3IKKyAqIEBwYXJhbSBwaXRjaF9sYWcgZGVjb2RlZCBwaXRjaCBsYWcKKyAqIEBwYXJhbSBwcGYgICAgICAgcGl0Y2ggcG9zdGZpbHRlciBwYXJhbWV0ZXJzCisgKiBAcGFyYW0gY3VyX3JhdGUgIGN1cnJlbnQgYml0cmF0ZQorICovCitzdGF0aWMgdm9pZCBjb21wX3BwZl9jb2VmZihHNzIzXzFfQ29udGV4dCAqcCwgaW50IG9mZnNldCwgaW50IHBpdGNoX2xhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQRlBhcmFtICpwcGYsIGVudW0gUmF0ZSBjdXJfcmF0ZSkKK3sKKworICAgIGludDE2X3Qgc2NhbGU7CisgICAgaW50IGk7CisgICAgaW50IHRlbXAxLCB0ZW1wMjsKKworICAgIC8qCisgICAgICogMCAtIHRhcmdldCBlbmVyZ3kKKyAgICAgKiAxIC0gZm9yd2FyZCBjcm9zcy1jb3JyZWxhdGlvbgorICAgICAqIDIgLSBmb3J3YXJkIHJlc2lkdWFsIGVuZXJneQorICAgICAqIDMgLSBiYWNrd2FyZCBjcm9zcy1jb3JyZWxhdGlvbgorICAgICAqIDQgLSBiYWNrd2FyZCByZXNpZHVhbCBlbmVyZ3kKKyAgICAgKi8KKyAgICBpbnQgZW5lcmd5WzVdID0gezAsIDAsIDAsIDAsIDB9OworICAgIGludDE2X3QgKmJ1ZiAgPSBwLT5hdWRpbyArIExQQ19PUkRFUiArIG9mZnNldDsKKyAgICBpbnQgZndkX2xhZyAgID0gYXV0b2NvcnJfbWF4KGJ1Ziwgb2Zmc2V0LCAmZW5lcmd5WzFdLCBwaXRjaF9sYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJGUkFNRV9MRU4sIDEpOworICAgIGludCBiYWNrX2xhZyAgPSBhdXRvY29ycl9tYXgoYnVmLCBvZmZzZXQsICZlbmVyZ3lbM10sIHBpdGNoX2xhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQkZSQU1FX0xFTiwgLTEpOworCisgICAgcHBmLT5pbmRleCAgICA9IDA7CisgICAgcHBmLT5vcHRfZ2FpbiA9IDA7CisgICAgcHBmLT5zY19nYWluICA9IDB4N2ZmZjsKKworICAgIC8qIENhc2UgMCwgU2VjdGlvbiAzLjYgKi8KKyAgICBpZiAoIWJhY2tfbGFnICYmICFmd2RfbGFnKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBDb21wdXRlIHRhcmdldCBlbmVyZ3kgKi8KKyAgICBlbmVyZ3lbMF0gPSBkb3RfcHJvZHVjdChidWYsIGJ1ZiwgU1VCRlJBTUVfTEVOKTsKKworICAgIC8qIENvbXB1dGUgZm9yd2FyZCByZXNpZHVhbCBlbmVyZ3kgKi8KKyAgICBpZiAoZndkX2xhZykKKyAgICAgICAgZW5lcmd5WzJdID0gZG90X3Byb2R1Y3QoYnVmICsgZndkX2xhZywgYnVmICsgZndkX2xhZywgU1VCRlJBTUVfTEVOKTsKKworICAgIC8qIENvbXB1dGUgYmFja3dhcmQgcmVzaWR1YWwgZW5lcmd5ICovCisgICAgaWYgKGJhY2tfbGFnKQorICAgICAgICBlbmVyZ3lbNF0gPSBkb3RfcHJvZHVjdChidWYgLSBiYWNrX2xhZywgYnVmIC0gYmFja19sYWcsIFNVQkZSQU1FX0xFTik7CisKKyAgICAvKiBOb3JtYWxpemUgYW5kIHNob3J0ZW4gKi8KKyAgICB0ZW1wMSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgdGVtcDEgPSBGRk1BWChlbmVyZ3lbaV0sIHRlbXAxKTsKKworICAgIHNjYWxlID0gbm9ybWFsaXplX2JpdHModGVtcDEsIDMxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICBlbmVyZ3lbaV0gPSAoZW5lcmd5W2ldIDw8IHNjYWxlKSA+PiAxNjsKKworICAgIGlmIChmd2RfbGFnICYmICFiYWNrX2xhZykgeyAgLyogQ2FzZSAxICovCisgICAgICAgIGNvbXBfcHBmX2dhaW5zKGZ3ZF9sYWcsICBwcGYsIGN1cl9yYXRlLCBlbmVyZ3lbMF0sIGVuZXJneVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgZW5lcmd5WzJdKTsKKyAgICB9IGVsc2UgaWYgKCFmd2RfbGFnKSB7ICAgICAgIC8qIENhc2UgMiAqLworICAgICAgICBjb21wX3BwZl9nYWlucygtYmFja19sYWcsIHBwZiwgY3VyX3JhdGUsIGVuZXJneVswXSwgZW5lcmd5WzNdLAorICAgICAgICAgICAgICAgICAgICAgICBlbmVyZ3lbNF0pOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgLyogQ2FzZSAzICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VsZWN0IHRoZSBsYXJnZXN0IG9mIGVuZXJneVsxXV4yL2VuZXJneVsyXQorICAgICAgICAgKiBhbmQgZW5lcmd5WzNdXjIvZW5lcmd5WzRdCisgICAgICAgICAqLworICAgICAgICB0ZW1wMSA9IGVuZXJneVs0XSAqICgoZW5lcmd5WzFdICogZW5lcmd5WzFdICsgKDEgPDwgMTQpKSA+PiAxNSk7CisgICAgICAgIHRlbXAyID0gZW5lcmd5WzJdICogKChlbmVyZ3lbM10gKiBlbmVyZ3lbM10gKyAoMSA8PCAxNCkpID4+IDE1KTsKKyAgICAgICAgaWYgKHRlbXAxID49IHRlbXAyKSB7CisgICAgICAgICAgICBjb21wX3BwZl9nYWlucyhmd2RfbGFnLCBwcGYsIGN1cl9yYXRlLCBlbmVyZ3lbMF0sIGVuZXJneVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZXJneVsyXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21wX3BwZl9nYWlucygtYmFja19sYWcsIHBwZiwgY3VyX3JhdGUsIGVuZXJneVswXSwgZW5lcmd5WzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5lcmd5WzRdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBDbGFzc2lmeSBmcmFtZXMgYXMgdm9pY2VkL3Vudm9pY2VkLgorICoKKyAqIEBwYXJhbSBwICAgICAgICAgdGhlIGNvbnRleHQKKyAqIEBwYXJhbSBwaXRjaF9sYWcgZGVjb2RlZCBwaXRjaF9sYWcKKyAqIEBwYXJhbSBleGNfZW5nICAgZXhjaXRhdGlvbiBlbmVyZ3kgZXN0aW1hdGlvbgorICogQHBhcmFtIHNjYWxlICAgICBzY2FsaW5nIGZhY3RvciBvZiBleGNfZW5nCisgKgorICogQHJldHVybiByZXNpZHVhbCBpbnRlcnBvbGF0aW9uIGluZGV4IGlmIHZvaWNlZCwgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBjb21wX2ludGVycF9pbmRleChHNzIzXzFfQ29udGV4dCAqcCwgaW50IHBpdGNoX2xhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpleGNfZW5nLCBpbnQgKnNjYWxlKQoreworICAgIGludCBvZmZzZXQgPSBQSVRDSF9NQVggKyAyICogU1VCRlJBTUVfTEVOOworICAgIGludDE2X3QgKmJ1ZiA9IHAtPmF1ZGlvICsgTFBDX09SREVSOworCisgICAgaW50IGluZGV4LCBjY3IsIHRndF9lbmcsIGJlc3RfZW5nLCB0ZW1wOworCisgICAgKnNjYWxlID0gc2NhbGVfdmVjdG9yKGJ1ZiwgcC0+ZXhjaXRhdGlvbiwgRlJBTUVfTEVOICsgUElUQ0hfTUFYKTsKKyAgICBidWYgICArPSBvZmZzZXQ7CisKKyAgICAvKiBDb21wdXRlIG1heGltdW0gYmFja3dhcmQgY3Jvc3MtY29ycmVsYXRpb24gKi8KKyAgICBjY3IgICA9IDA7CisgICAgaW5kZXggPSBhdXRvY29ycl9tYXgoYnVmLCBvZmZzZXQsICZjY3IsIHBpdGNoX2xhZywgU1VCRlJBTUVfTEVOICogMiwgLTEpOworICAgIGNjciAgID0gYXZfc2F0X2FkZDMyKGNjciwgMSA8PCAxNSkgPj4gMTY7CisKKyAgICAvKiBDb21wdXRlIHRhcmdldCBlbmVyZ3kgKi8KKyAgICB0Z3RfZW5nICA9IGRvdF9wcm9kdWN0KGJ1ZiwgYnVmLCBTVUJGUkFNRV9MRU4gKiAyKTsKKyAgICAqZXhjX2VuZyA9IGF2X3NhdF9hZGQzMih0Z3RfZW5nLCAxIDw8IDE1KSA+PiAxNjsKKworICAgIGlmIChjY3IgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBDb21wdXRlIGJlc3QgZW5lcmd5ICovCisgICAgYmVzdF9lbmcgPSBkb3RfcHJvZHVjdChidWYgLSBpbmRleCwgYnVmIC0gaW5kZXgsIFNVQkZSQU1FX0xFTiAqIDIpOworICAgIGJlc3RfZW5nID0gYXZfc2F0X2FkZDMyKGJlc3RfZW5nLCAxIDw8IDE1KSA+PiAxNjsKKworICAgIHRlbXAgPSBiZXN0X2VuZyAqICpleGNfZW5nID4+IDM7CisKKyAgICBpZiAodGVtcCA8IGNjciAqIGNjcikgeworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFBlZm9ybSByZXNpZHVhbCBpbnRlcnBvbGF0aW9uIGJhc2VkIG9uIGZyYW1lIGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIEBwYXJhbSBidWYgICBkZWNvZGVkIGV4Y2l0YXRpb24gdmVjdG9yCisgKiBAcGFyYW0gb3V0ICAgb3V0cHV0IHZlY3RvcgorICogQHBhcmFtIGxhZyAgIGRlY29kZWQgcGl0Y2ggbGFnCisgKiBAcGFyYW0gZ2FpbiAgaW50ZXJwb2xhdGVkIGdhaW4KKyAqIEBwYXJhbSByc2VlZCBzZWVkIGZvciByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICovCitzdGF0aWMgdm9pZCByZXNpZHVhbF9pbnRlcnAoaW50MTZfdCAqYnVmLCBpbnQxNl90ICpvdXQsIGludCBsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdhaW4sIGludCAqcnNlZWQpCit7CisgICAgaW50IGk7CisgICAgaWYgKGxhZykgeyAvKiBWb2ljZWQgKi8KKyAgICAgICAgaW50MTZfdCAqdmVjdG9yX3B0ciA9IGJ1ZiArIFBJVENIX01BWDsKKyAgICAgICAgLyogQXR0ZW51YXRlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsYWc7IGkrKykKKyAgICAgICAgICAgIG91dFtpXSA9IHZlY3Rvcl9wdHJbaSAtIGxhZ10gKiAzID4+IDI7CisgICAgICAgIGF2X21lbWNweV9iYWNrcHRyKCh1aW50OF90Kikob3V0ICsgbGFnKSwgbGFnICogc2l6ZW9mKCpvdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlJBTUVfTEVOIC0gbGFnKSAqIHNpemVvZigqb3V0KSk7CisgICAgfSBlbHNlIHsgIC8qIFVudm9pY2VkICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGUkFNRV9MRU47IGkrKykgeworICAgICAgICAgICAgKnJzZWVkID0gKnJzZWVkICogNTIxICsgMjU5OworICAgICAgICAgICAgb3V0W2ldID0gZ2FpbiAqICpyc2VlZCA+PiAxNTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQoYnVmLCAwLCAoRlJBTUVfTEVOICsgUElUQ0hfTUFYKSAqIHNpemVvZigqYnVmKSk7CisgICAgfQorfQorCisvKioKKyAqIFBlcmZvcm0gSUlSIGZpbHRlcmluZy4KKyAqCisgKiBAcGFyYW0gZmlyX2NvZWYgRklSIGNvZWZmaWNpZW50cworICogQHBhcmFtIGlpcl9jb2VmIElJUiBjb2VmZmljaWVudHMKKyAqIEBwYXJhbSBzcmMgICAgICBzb3VyY2UgdmVjdG9yCisgKiBAcGFyYW0gZGVzdCAgICAgZGVzdGluYXRpb24gdmVjdG9yCisgKiBAcGFyYW0gd2lkdGggICAgd2lkdGggb2YgdGhlIG91dHB1dCwgMTYgYml0cygwKSAvIDMyIGJpdHMoMSkKKyAqLworI2RlZmluZSBpaXJfZmlsdGVyKGZpcl9jb2VmLCBpaXJfY29lZiwgc3JjLCBkZXN0LCB3aWR0aClcCit7XAorICAgIGludCBtLCBuO1wKKyAgICBpbnQgcmVzX3NoaWZ0ID0gMTYgJiB+LSh3aWR0aCk7XAorICAgIGludCBpbl9zaGlmdCAgPSAxNiAtIHJlc19zaGlmdDtcCitcCisgICAgZm9yIChtID0gMDsgbSA8IFNVQkZSQU1FX0xFTjsgbSsrKSB7XAorICAgICAgICBpbnQ2NF90IGZpbHRlciA9IDA7XAorICAgICAgICBmb3IgKG4gPSAxOyBuIDw9IExQQ19PUkRFUjsgbisrKSB7XAorICAgICAgICAgICAgZmlsdGVyIC09IChmaXJfY29lZilbbiAtIDFdICogKHNyYylbbSAtIG5dIC1cCisgICAgICAgICAgICAgICAgICAgICAgKGlpcl9jb2VmKVtuIC0gMV0gKiAoKGRlc3QpW20gLSBuXSA+PiBpbl9zaGlmdCk7XAorICAgICAgICB9XAorXAorICAgICAgICAoZGVzdClbbV0gPSBhdl9jbGlwbF9pbnQzMigoKHNyYylbbV0gPDwgMTYpICsgKGZpbHRlciA8PCAzKSArXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkpID4+IHJlc19zaGlmdDtcCisgICAgfVwKK30KKworLyoqCisgKiBBZGp1c3QgZ2FpbiBvZiBwb3N0ZmlsdGVyZWQgc2lnbmFsLgorICoKKyAqIEBwYXJhbSBwICAgICAgdGhlIGNvbnRleHQKKyAqIEBwYXJhbSBidWYgICAgcG9zdGZpbHRlcmVkIG91dHB1dCB2ZWN0b3IKKyAqIEBwYXJhbSBlbmVyZ3kgaW5wdXQgZW5lcmd5IGNvZWZmaWNpZW50CisgKi8KK3N0YXRpYyB2b2lkIGdhaW5fc2NhbGUoRzcyM18xX0NvbnRleHQgKnAsIGludDE2X3QgKiBidWYsIGludCBlbmVyZ3kpCit7CisgICAgaW50IG51bSwgZGVub20sIGdhaW4sIGJpdHMxLCBiaXRzMjsKKyAgICBpbnQgaTsKKworICAgIG51bSAgID0gZW5lcmd5OworICAgIGRlbm9tID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU1VCRlJBTUVfTEVOOyBpKyspIHsKKyAgICAgICAgaW50IHRlbXAgPSBidWZbaV0gPj4gMjsKKyAgICAgICAgdGVtcCAqPSB0ZW1wOworICAgICAgICBkZW5vbSA9IGF2X3NhdF9kYWRkMzIoZGVub20sIHRlbXApOworICAgIH0KKworICAgIGlmIChudW0gJiYgZGVub20pIHsKKyAgICAgICAgYml0czEgICA9IG5vcm1hbGl6ZV9iaXRzKG51bSwgICAzMSk7CisgICAgICAgIGJpdHMyICAgPSBub3JtYWxpemVfYml0cyhkZW5vbSwgMzEpOworICAgICAgICBudW0gICAgID0gbnVtIDw8IGJpdHMxID4+IDE7CisgICAgICAgIGRlbm9tIDw8PSBiaXRzMjsKKworICAgICAgICBiaXRzMiA9IDUgKyBiaXRzMSAtIGJpdHMyOworICAgICAgICBiaXRzMiA9IEZGTUFYKDAsIGJpdHMyKTsKKworICAgICAgICBnYWluID0gKG51bSA+PiAxKSAvIChkZW5vbSA+PiAxNik7CisgICAgICAgIGdhaW4gPSBzcXVhcmVfcm9vdChnYWluIDw8IDE2ID4+IGJpdHMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnYWluID0gMSA8PCAxMjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgU1VCRlJBTUVfTEVOOyBpKyspIHsKKyAgICAgICAgcC0+cGZfZ2FpbiA9ICgxNSAqIHAtPnBmX2dhaW4gKyBnYWluICsgKDEgPDwgMykpID4+IDQ7CisgICAgICAgIGJ1ZltpXSAgICAgPSBhdl9jbGlwX2ludDE2KChidWZbaV0gKiAocC0+cGZfZ2FpbiArIChwLT5wZl9nYWluID4+IDQpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEwKSkgPj4gMTEpOworICAgIH0KK30KKworLyoqCisgKiBQZXJmb3JtIGZvcm1hbnQgZmlsdGVyaW5nLgorICoKKyAqIEBwYXJhbSBwICAgdGhlIGNvbnRleHQKKyAqIEBwYXJhbSBscGMgcXVhbnRpemVkIGxwYyBjb2VmZmljaWVudHMKKyAqIEBwYXJhbSBidWYgaW5wdXQgYnVmZmVyCisgKiBAcGFyYW0gZHN0IG91dHB1dCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgZm9ybWFudF9wb3N0ZmlsdGVyKEc3MjNfMV9Db250ZXh0ICpwLCBpbnQxNl90ICpscGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYnVmLCBpbnQxNl90ICpkc3QpCit7CisgICAgaW50MTZfdCBmaWx0ZXJfY29lZlsyXVtMUENfT1JERVJdOworICAgIGludCBmaWx0ZXJfc2lnbmFsW0xQQ19PUkRFUiArIEZSQU1FX0xFTl0sICpzaWduYWxfcHRyOworICAgIGludCBpLCBqLCBrOworCisgICAgbWVtY3B5KGJ1ZiwgcC0+ZmlyX21lbSwgTFBDX09SREVSICogc2l6ZW9mKCpidWYpKTsKKyAgICBtZW1jcHkoZmlsdGVyX3NpZ25hbCwgcC0+aWlyX21lbSwgTFBDX09SREVSICogc2l6ZW9mKCpmaWx0ZXJfc2lnbmFsKSk7CisKKyAgICBmb3IgKGkgPSBMUENfT1JERVIsIGogPSAwOyBqIDwgU1VCRlJBTUVTOyBpICs9IFNVQkZSQU1FX0xFTiwgaisrKSB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBMUENfT1JERVI7IGsrKykgeworICAgICAgICAgICAgZmlsdGVyX2NvZWZbMF1ba10gPSAoLWxwY1trXSAqIHBvc3RmaWx0ZXJfdGJsWzBdW2tdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE0KSkgPj4gMTU7CisgICAgICAgICAgICBmaWx0ZXJfY29lZlsxXVtrXSA9ICgtbHBjW2tdICogcG9zdGZpbHRlcl90YmxbMV1ba10gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTQpKSA+PiAxNTsKKyAgICAgICAgfQorICAgICAgICBpaXJfZmlsdGVyKGZpbHRlcl9jb2VmWzBdLCBmaWx0ZXJfY29lZlsxXSwgYnVmICsgaSwKKyAgICAgICAgICAgICAgICAgICBmaWx0ZXJfc2lnbmFsICsgaSwgMSk7CisgICAgICAgIGxwYyArPSBMUENfT1JERVI7CisgICAgfQorCisgICAgbWVtY3B5KHAtPmZpcl9tZW0sIGJ1ZiArIEZSQU1FX0xFTiwgTFBDX09SREVSICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICBtZW1jcHkocC0+aWlyX21lbSwgZmlsdGVyX3NpZ25hbCArIEZSQU1FX0xFTiwgTFBDX09SREVSICogc2l6ZW9mKGludCkpOworCisgICAgYnVmICs9IExQQ19PUkRFUjsKKyAgICBzaWduYWxfcHRyID0gZmlsdGVyX3NpZ25hbCArIExQQ19PUkRFUjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU1VCRlJBTUVTOyBpKyspIHsKKyAgICAgICAgaW50IHRlbXA7CisgICAgICAgIGludCBhdXRvX2NvcnJbMl07CisgICAgICAgIGludCBzY2FsZSwgZW5lcmd5OworCisgICAgICAgIC8qIE5vcm1hbGl6ZSAqLworICAgICAgICBzY2FsZSA9IHNjYWxlX3ZlY3Rvcihkc3QsIGJ1ZiwgU1VCRlJBTUVfTEVOKTsKKworICAgICAgICAvKiBDb21wdXRlIGF1dG8gY29ycmVsYXRpb24gY29lZmZpY2llbnRzICovCisgICAgICAgIGF1dG9fY29yclswXSA9IGRvdF9wcm9kdWN0KGRzdCwgZHN0ICsgMSwgU1VCRlJBTUVfTEVOIC0gMSk7CisgICAgICAgIGF1dG9fY29yclsxXSA9IGRvdF9wcm9kdWN0KGRzdCwgZHN0LCAgICAgU1VCRlJBTUVfTEVOKTsKKworICAgICAgICAvKiBDb21wdXRlIHJlZmxlY3Rpb24gY29lZmZpY2llbnQgKi8KKyAgICAgICAgdGVtcCA9IGF1dG9fY29yclsxXSA+PiAxNjsKKyAgICAgICAgaWYgKHRlbXApIHsKKyAgICAgICAgICAgIHRlbXAgPSAoYXV0b19jb3JyWzBdID4+IDIpIC8gdGVtcDsKKyAgICAgICAgfQorICAgICAgICBwLT5yZWZsZWN0aW9uX2NvZWYgPSAoMyAqIHAtPnJlZmxlY3Rpb25fY29lZiArIHRlbXAgKyAyKSA+PiAyOworICAgICAgICB0ZW1wID0gLXAtPnJlZmxlY3Rpb25fY29lZiA+PiAxICYgfjM7CisKKyAgICAgICAgLyogQ29tcGVuc2F0aW9uIGZpbHRlciAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgU1VCRlJBTUVfTEVOOyBqKyspIHsKKyAgICAgICAgICAgIGRzdFtqXSA9IGF2X3NhdF9kYWRkMzIoc2lnbmFsX3B0cltqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpZ25hbF9wdHJbaiAtIDFdID4+IDE2KSAqIHRlbXApID4+IDE2OworICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcHV0ZSBub3JtYWxpemVkIHNpZ25hbCBlbmVyZ3kgKi8KKyAgICAgICAgdGVtcCA9IDIgKiBzY2FsZSArIDQ7CisgICAgICAgIGlmICh0ZW1wIDwgMCkgeworICAgICAgICAgICAgZW5lcmd5ID0gYXZfY2xpcGxfaW50MzIoKGludDY0X3QpYXV0b19jb3JyWzFdIDw8IC10ZW1wKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBlbmVyZ3kgPSBhdXRvX2NvcnJbMV0gPj4gdGVtcDsKKworICAgICAgICBnYWluX3NjYWxlKHAsIGRzdCwgZW5lcmd5KTsKKworICAgICAgICBidWYgICAgICAgICs9IFNVQkZSQU1FX0xFTjsKKyAgICAgICAgc2lnbmFsX3B0ciArPSBTVUJGUkFNRV9MRU47CisgICAgICAgIGRzdCAgICAgICAgKz0gU1VCRlJBTUVfTEVOOworICAgIH0KK30KKworc3RhdGljIGludCBzaWRfZ2Fpbl90b19sc3BfaW5kZXgoaW50IGdhaW4pCit7CisgICAgaWYgKGdhaW4gPCAweDEwKQorICAgICAgICByZXR1cm4gZ2FpbiA8PCA2OworICAgIGVsc2UgaWYgKGdhaW4gPCAweDIwKQorICAgICAgICByZXR1cm4gZ2FpbiAtIDggPDwgNzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBnYWluIC0gMjAgPDwgODsKK30KKworc3RhdGljIGlubGluZSBpbnQgY25nX3JhbmQoaW50ICpzdGF0ZSwgaW50IGJhc2UpCit7CisgICAgKnN0YXRlID0gKCpzdGF0ZSAqIDUyMSArIDI1OSkgJiAweEZGRkY7CisgICAgcmV0dXJuICgqc3RhdGUgJiAweDdGRkYpICogYmFzZSA+PiAxNTsKK30KKworc3RhdGljIGludCBlc3RpbWF0ZV9zaWRfZ2FpbihHNzIzXzFfQ29udGV4dCAqcCkKK3sKKyAgICBpbnQgaSwgc2hpZnQsIHNlZywgc2VnMiwgdCwgdmFsLCB2YWxfYWRkLCB4LCB5OworCisgICAgc2hpZnQgPSAxNiAtIHAtPmN1cl9nYWluICogMjsKKyAgICBpZiAoc2hpZnQgPiAwKQorICAgICAgICB0ID0gcC0+c2lkX2dhaW4gPDwgc2hpZnQ7CisgICAgZWxzZQorICAgICAgICB0ID0gcC0+c2lkX2dhaW4gPj4gLXNoaWZ0OworICAgIHggPSB0ICogY25nX2ZpbHRbMF0gPj4gMTY7CisKKyAgICBpZiAoeCA+PSBjbmdfYnNlZ1syXSkKKyAgICAgICAgcmV0dXJuIDB4M0Y7CisKKyAgICBpZiAoeCA+PSBjbmdfYnNlZ1sxXSkgeworICAgICAgICBzaGlmdCA9IDQ7CisgICAgICAgIHNlZyAgID0gMzsKKyAgICB9IGVsc2UgeworICAgICAgICBzaGlmdCA9IDM7CisgICAgICAgIHNlZyAgID0gKHggPj0gY25nX2JzZWdbMF0pOworICAgIH0KKyAgICBzZWcyID0gRkZNSU4oc2VnLCAzKTsKKworICAgIHZhbCAgICAgPSAxIDw8IHNoaWZ0OworICAgIHZhbF9hZGQgPSB2YWwgPj4gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2hpZnQ7IGkrKykgeworICAgICAgICB0ID0gc2VnICogMzIgKyAodmFsIDw8IHNlZzIpOworICAgICAgICB0ICo9IHQ7CisgICAgICAgIGlmICh4ID49IHQpCisgICAgICAgICAgICB2YWwgKz0gdmFsX2FkZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsIC09IHZhbF9hZGQ7CisgICAgICAgIHZhbF9hZGQgPj49IDE7CisgICAgfQorCisgICAgdCA9IHNlZyAqIDMyICsgKHZhbCA8PCBzZWcyKTsKKyAgICB5ID0gdCAqIHQgLSB4OworICAgIGlmICh5IDw9IDApIHsKKyAgICAgICAgdCA9IHNlZyAqIDMyICsgKHZhbCArIDEgPDwgc2VnMik7CisgICAgICAgIHQgPSB0ICogdCAtIHg7CisgICAgICAgIHZhbCA9IChzZWcyIC0gMSA8PCA0KSArIHZhbDsKKyAgICAgICAgaWYgKHQgPj0geSkKKyAgICAgICAgICAgIHZhbCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIHQgPSBzZWcgKiAzMiArICh2YWwgLSAxIDw8IHNlZzIpOworICAgICAgICB0ID0gdCAqIHQgLSB4OworICAgICAgICB2YWwgPSAoc2VnMiAtIDEgPDwgNCkgKyB2YWw7CisgICAgICAgIGlmICh0ID49IHkpCisgICAgICAgICAgICB2YWwtLTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9ub2lzZShHNzIzXzFfQ29udGV4dCAqcCkKK3sKKyAgICBpbnQgaSwgaiwgaWR4LCB0OworICAgIGludCBvZmZbU1VCRlJBTUVTXTsKKyAgICBpbnQgc2lnbnNbU1VCRlJBTUVTIC8gMiAqIDExXSwgcG9zW1NVQkZSQU1FUyAvIDIgKiAxMV07CisgICAgaW50IHRtcFtTVUJGUkFNRV9MRU4gKiAyXTsKKyAgICBpbnQxNl90ICp2ZWN0b3JfcHRyOworICAgIGludDY0X3Qgc3VtOworICAgIGludCBiMCwgYywgZGVsdGEsIHgsIHNoaWZ0OworCisgICAgcC0+cGl0Y2hfbGFnWzBdID0gY25nX3JhbmQoJnAtPmNuZ19yYW5kb21fc2VlZCwgMjEpICsgMTIzOworICAgIHAtPnBpdGNoX2xhZ1sxXSA9IGNuZ19yYW5kKCZwLT5jbmdfcmFuZG9tX3NlZWQsIDE5KSArIDEyMzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBTVUJGUkFNRVM7IGkrKykgeworICAgICAgICBwLT5zdWJmcmFtZVtpXS5hZF9jYl9nYWluID0gY25nX3JhbmQoJnAtPmNuZ19yYW5kb21fc2VlZCwgNTApICsgMTsKKyAgICAgICAgcC0+c3ViZnJhbWVbaV0uYWRfY2JfbGFnICA9IGNuZ19hZGFwdGl2ZV9jYl9sYWdbaV07CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IFNVQkZSQU1FUyAvIDI7IGkrKykgeworICAgICAgICB0ID0gY25nX3JhbmQoJnAtPmNuZ19yYW5kb21fc2VlZCwgMSA8PCAxMyk7CisgICAgICAgIG9mZltpICogMl0gICAgID0gICB0ICAgICAgICYgMTsKKyAgICAgICAgb2ZmW2kgKiAyICsgMV0gPSAoKHQgPj4gMSkgJiAxKSArIFNVQkZSQU1FX0xFTjsKKyAgICAgICAgdCA+Pj0gMjsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDExOyBqKyspIHsKKyAgICAgICAgICAgIHNpZ25zW2kgKiAxMSArIGpdID0gKHQgJiAxKSAqIDIgLSAxIDw8IDE0OworICAgICAgICAgICAgdCA+Pj0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlkeCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IFNVQkZSQU1FUzsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBTVUJGUkFNRV9MRU4gLyAyOyBqKyspCisgICAgICAgICAgICB0bXBbal0gPSBqOworICAgICAgICB0ID0gU1VCRlJBTUVfTEVOIC8gMjsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHB1bHNlc1tpXTsgaisrLCBpZHgrKykgeworICAgICAgICAgICAgaW50IGlkeDIgPSBjbmdfcmFuZCgmcC0+Y25nX3JhbmRvbV9zZWVkLCB0KTsKKworICAgICAgICAgICAgcG9zW2lkeF0gID0gdG1wW2lkeDJdICogMiArIG9mZltpXTsKKyAgICAgICAgICAgIHRtcFtpZHgyXSA9IHRtcFstLXRdOworICAgICAgICB9CisgICAgfQorCisgICAgdmVjdG9yX3B0ciA9IHAtPmF1ZGlvICsgTFBDX09SREVSOworICAgIG1lbWNweSh2ZWN0b3JfcHRyLCBwLT5wcmV2X2V4Y2l0YXRpb24sCisgICAgICAgICAgIFBJVENIX01BWCAqIHNpemVvZigqcC0+ZXhjaXRhdGlvbikpOworICAgIGZvciAoaSA9IDA7IGkgPCBTVUJGUkFNRVM7IGkgKz0gMikgeworICAgICAgICBnZW5fYWNiX2V4Y2l0YXRpb24odmVjdG9yX3B0ciwgdmVjdG9yX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBpdGNoX2xhZ1tpID4+IDFdLCAmcC0+c3ViZnJhbWVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5jdXJfcmF0ZSk7CisgICAgICAgIGdlbl9hY2JfZXhjaXRhdGlvbih2ZWN0b3JfcHRyICsgU1VCRlJBTUVfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yX3B0ciArIFNVQkZSQU1FX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBpdGNoX2xhZ1tpID4+IDFdLCAmcC0+c3ViZnJhbWVbaSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Y3VyX3JhdGUpOworCisgICAgICAgIHQgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgU1VCRlJBTUVfTEVOICogMjsgaisrKQorICAgICAgICAgICAgdCB8PSBGRkFCUyh2ZWN0b3JfcHRyW2pdKTsKKyAgICAgICAgdCA9IEZGTUlOKHQsIDB4N0ZGRik7CisgICAgICAgIGlmICghdCkgeworICAgICAgICAgICAgc2hpZnQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hpZnQgPSAtMTAgKyBhdl9sb2cyKHQpOworICAgICAgICAgICAgaWYgKHNoaWZ0IDwgLTIpCisgICAgICAgICAgICAgICAgc2hpZnQgPSAtMjsKKyAgICAgICAgfQorICAgICAgICBzdW0gPSAwOworICAgICAgICBpZiAoc2hpZnQgPCAwKSB7CisgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBTVUJGUkFNRV9MRU4gKiAyOyBqKyspIHsKKyAgICAgICAgICAgICAgIHQgICAgICA9IHZlY3Rvcl9wdHJbal0gPDwgLXNoaWZ0OworICAgICAgICAgICAgICAgc3VtICAgKz0gdCAqIHQ7CisgICAgICAgICAgICAgICB0bXBbal0gPSB0OworICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBTVUJGUkFNRV9MRU4gKiAyOyBqKyspIHsKKyAgICAgICAgICAgICAgIHQgICAgICA9IHZlY3Rvcl9wdHJbal0gPj4gc2hpZnQ7CisgICAgICAgICAgICAgICBzdW0gICArPSB0ICogdDsKKyAgICAgICAgICAgICAgIHRtcFtqXSA9IHQ7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGIwID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDExOyBqKyspCisgICAgICAgICAgICBiMCArPSB0bXBbcG9zWyhpIC8gMikgKiAxMSArIGpdXSAqIHNpZ25zWyhpIC8gMikgKiAxMSArIGpdOworICAgICAgICBiMCA9IGIwICogMiAqIDI5NzlMTCArICgxIDw8IDI5KSA+PiAzMDsgLy8gYXBwcm94aW1hdGVkIGRpdmlzaW9uIGJ5IDExCisKKyAgICAgICAgYyA9IHAtPmN1cl9nYWluICogKHAtPmN1cl9nYWluICogU1VCRlJBTUVfTEVOID4+IDUpOworICAgICAgICBpZiAoc2hpZnQgKiAyICsgMyA+PSAwKQorICAgICAgICAgICAgYyA+Pj0gc2hpZnQgKiAyICsgMzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYyA8PD0gLShzaGlmdCAqIDIgKyAzKTsKKyAgICAgICAgYyA9IChhdl9jbGlwbF9pbnQzMihzdW0gPDwgMSkgLSBjKSAqIDI5NzlMTCA+PiAxNTsKKworICAgICAgICBkZWx0YSA9IGIwICogYjAgKiAyIC0gYzsKKyAgICAgICAgaWYgKGRlbHRhIDw9IDApIHsKKyAgICAgICAgICAgIHggPSAtYjA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWx0YSA9IHNxdWFyZV9yb290KGRlbHRhKTsKKyAgICAgICAgICAgIHggICAgID0gZGVsdGEgLSBiMDsKKyAgICAgICAgICAgIHQgICAgID0gZGVsdGEgKyBiMDsKKyAgICAgICAgICAgIGlmIChGRkFCUyh0KSA8IEZGQUJTKHgpKQorICAgICAgICAgICAgICAgIHggPSAtdDsKKyAgICAgICAgfQorICAgICAgICBzaGlmdCsrOworICAgICAgICBpZiAoc2hpZnQgPCAwKQorICAgICAgICAgICB4ID4+PSAtc2hpZnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgeCA8PD0gc2hpZnQ7CisgICAgICAgIHggPSBhdl9jbGlwKHgsIC0xMDAwMCwgMTAwMDApOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMTsgaisrKSB7CisgICAgICAgICAgICBpZHggPSAoaSAvIDIpICogMTEgKyBqOworICAgICAgICAgICAgdmVjdG9yX3B0cltwb3NbaWR4XV0gPSBhdl9jbGlwX2ludDE2KHZlY3Rvcl9wdHJbcG9zW2lkeF1dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeCAqIHNpZ25zW2lkeF0gPj4gMTUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvcHkgZGVjb2RlZCBkYXRhIHRvIHNlcnZlIGFzIGEgaGlzdG9yeSBmb3IgdGhlIG5leHQgZGVjb2RlZCBzdWJmcmFtZXMgKi8KKyAgICAgICAgbWVtY3B5KHZlY3Rvcl9wdHIgKyBQSVRDSF9NQVgsIHZlY3Rvcl9wdHIsCisgICAgICAgICAgICAgICBzaXplb2YoKnZlY3Rvcl9wdHIpICogU1VCRlJBTUVfTEVOICogMik7CisgICAgICAgIHZlY3Rvcl9wdHIgKz0gU1VCRlJBTUVfTEVOICogMjsKKyAgICB9CisgICAgLyogU2F2ZSB0aGUgZXhjaXRhdGlvbiBmb3IgdGhlIG5leHQgZnJhbWUgKi8KKyAgICBtZW1jcHkocC0+cHJldl9leGNpdGF0aW9uLCBwLT5hdWRpbyArIExQQ19PUkRFUiArIEZSQU1FX0xFTiwKKyAgICAgICAgICAgUElUQ0hfTUFYICogc2l6ZW9mKCpwLT5leGNpdGF0aW9uKSk7Cit9CisKK3N0YXRpYyBpbnQgZzcyM18xX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgRzcyM18xX0NvbnRleHQgKnAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIGludCBkZWNfbW9kZSAgICAgICA9IGJ1ZlswXSAmIDM7CisKKyAgICBQUEZQYXJhbSBwcGZbU1VCRlJBTUVTXTsKKyAgICBpbnQxNl90IGN1cl9sc3BbTFBDX09SREVSXTsKKyAgICBpbnQxNl90IGxwY1tTVUJGUkFNRVMgKiBMUENfT1JERVJdOworICAgIGludDE2X3QgYWNiX3ZlY3RvcltTVUJGUkFNRV9MRU5dOworICAgIGludDE2X3QgKm91dDsKKyAgICBpbnQgYmFkX2ZyYW1lID0gMCwgaSwgaiwgcmV0OworICAgIGludDE2X3QgKmF1ZGlvID0gcC0+YXVkaW87CisKKyAgICBpZiAoYnVmX3NpemUgPCBmcmFtZV9zaXplW2RlY19tb2RlXSkgeworICAgICAgICBpZiAoYnVmX3NpemUpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAlZCBieXRlcywgZ290ICVkIC0gc2tpcHBpbmcgcGFja2V0XG4iLAorICAgICAgICAgICAgICAgICAgIGZyYW1lX3NpemVbZGVjX21vZGVdLCBidWZfc2l6ZSk7CisgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKworICAgIGlmICh1bnBhY2tfYml0c3RyZWFtKHAsIGJ1ZiwgYnVmX3NpemUpIDwgMCkgeworICAgICAgICBiYWRfZnJhbWUgPSAxOworICAgICAgICBpZiAocC0+cGFzdF9mcmFtZV90eXBlID09IEFDVElWRV9GUkFNRSkKKyAgICAgICAgICAgIHAtPmN1cl9mcmFtZV90eXBlID0gQUNUSVZFX0ZSQU1FOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwLT5jdXJfZnJhbWVfdHlwZSA9IFVOVFJBTlNNSVRURURfRlJBTUU7CisgICAgfQorCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBGUkFNRV9MRU47CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG91dCA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICBpZiAocC0+Y3VyX2ZyYW1lX3R5cGUgPT0gQUNUSVZFX0ZSQU1FKSB7CisgICAgICAgIGlmICghYmFkX2ZyYW1lKQorICAgICAgICAgICAgcC0+ZXJhc2VkX2ZyYW1lcyA9IDA7CisgICAgICAgIGVsc2UgaWYgKHAtPmVyYXNlZF9mcmFtZXMgIT0gMykKKyAgICAgICAgICAgIHAtPmVyYXNlZF9mcmFtZXMrKzsKKworICAgICAgICBpbnZlcnNlX3F1YW50KGN1cl9sc3AsIHAtPnByZXZfbHNwLCBwLT5sc3BfaW5kZXgsIGJhZF9mcmFtZSk7CisgICAgICAgIGxzcF9pbnRlcnBvbGF0ZShscGMsIGN1cl9sc3AsIHAtPnByZXZfbHNwKTsKKworICAgICAgICAvKiBTYXZlIHRoZSBsc3BfdmVjdG9yIGZvciB0aGUgbmV4dCBmcmFtZSAqLworICAgICAgICBtZW1jcHkocC0+cHJldl9sc3AsIGN1cl9sc3AsIExQQ19PUkRFUiAqIHNpemVvZigqcC0+cHJldl9sc3ApKTsKKworICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgZXhjaXRhdGlvbiBmb3IgdGhlIGZyYW1lICovCisgICAgICAgIG1lbWNweShwLT5leGNpdGF0aW9uLCBwLT5wcmV2X2V4Y2l0YXRpb24sCisgICAgICAgICAgICAgICBQSVRDSF9NQVggKiBzaXplb2YoKnAtPmV4Y2l0YXRpb24pKTsKKyAgICAgICAgaWYgKCFwLT5lcmFzZWRfZnJhbWVzKSB7CisgICAgICAgICAgICBpbnQxNl90ICp2ZWN0b3JfcHRyID0gcC0+ZXhjaXRhdGlvbiArIFBJVENIX01BWDsKKworICAgICAgICAgICAgLyogVXBkYXRlIGludGVycG9sYXRpb24gZ2FpbiBtZW1vcnkgKi8KKyAgICAgICAgICAgIHAtPmludGVycF9nYWluID0gZml4ZWRfY2JfZ2FpblsocC0+c3ViZnJhbWVbMl0uYW1wX2luZGV4ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+c3ViZnJhbWVbM10uYW1wX2luZGV4KSA+PiAxXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTVUJGUkFNRVM7IGkrKykgeworICAgICAgICAgICAgICAgIGdlbl9mY2JfZXhjaXRhdGlvbih2ZWN0b3JfcHRyLCAmcC0+c3ViZnJhbWVbaV0sIHAtPmN1cl9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5waXRjaF9sYWdbaSA+PiAxXSwgaSk7CisgICAgICAgICAgICAgICAgZ2VuX2FjYl9leGNpdGF0aW9uKGFjYl92ZWN0b3IsICZwLT5leGNpdGF0aW9uW1NVQkZSQU1FX0xFTiAqIGldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5waXRjaF9sYWdbaSA+PiAxXSwgJnAtPnN1YmZyYW1lW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5jdXJfcmF0ZSk7CisgICAgICAgICAgICAgICAgLyogR2V0IHRoZSB0b3RhbCBleGNpdGF0aW9uICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IFNVQkZSQU1FX0xFTjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2ID0gYXZfY2xpcF9pbnQxNih2ZWN0b3JfcHRyW2pdIDw8IDEpOworICAgICAgICAgICAgICAgICAgICB2ZWN0b3JfcHRyW2pdID0gYXZfY2xpcF9pbnQxNih2ICsgYWNiX3ZlY3RvcltqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZlY3Rvcl9wdHIgKz0gU1VCRlJBTUVfTEVOOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2ZWN0b3JfcHRyID0gcC0+ZXhjaXRhdGlvbiArIFBJVENIX01BWDsKKworICAgICAgICAgICAgcC0+aW50ZXJwX2luZGV4ID0gY29tcF9pbnRlcnBfaW5kZXgocCwgcC0+cGl0Y2hfbGFnWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnNpZF9nYWluLCAmcC0+Y3VyX2dhaW4pOworCisgICAgICAgICAgICAvKiBQZWZvcm0gcGl0Y2ggcG9zdGZpbHRlcmluZyAqLworICAgICAgICAgICAgaWYgKHAtPnBvc3RmaWx0ZXIpIHsKKyAgICAgICAgICAgICAgICBpID0gUElUQ0hfTUFYOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBTVUJGUkFNRVM7IGkgKz0gU1VCRlJBTUVfTEVOLCBqKyspCisgICAgICAgICAgICAgICAgICAgIGNvbXBfcHBmX2NvZWZmKHAsIGksIHAtPnBpdGNoX2xhZ1tqID4+IDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcGYgKyBqLCBwLT5jdXJfcmF0ZSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaiA8IFNVQkZSQU1FUzsgaSArPSBTVUJGUkFNRV9MRU4sIGorKykKKyAgICAgICAgICAgICAgICAgICAgZmZfYWNlbHBfd2VpZ2h0ZWRfdmVjdG9yX3N1bShwLT5hdWRpbyArIExQQ19PUkRFUiArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yX3B0ciArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yX3B0ciArIGkgKyBwcGZbal0uaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBmW2pdLnNjX2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBmW2pdLm9wdF9nYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgMTQsIDE1LCBTVUJGUkFNRV9MRU4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdWRpbyA9IHZlY3Rvcl9wdHIgLSBMUENfT1JERVI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNhdmUgdGhlIGV4Y2l0YXRpb24gZm9yIHRoZSBuZXh0IGZyYW1lICovCisgICAgICAgICAgICBtZW1jcHkocC0+cHJldl9leGNpdGF0aW9uLCBwLT5leGNpdGF0aW9uICsgRlJBTUVfTEVOLAorICAgICAgICAgICAgICAgICAgIFBJVENIX01BWCAqIHNpemVvZigqcC0+ZXhjaXRhdGlvbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcC0+aW50ZXJwX2dhaW4gPSAocC0+aW50ZXJwX2dhaW4gKiAzICsgMikgPj4gMjsKKyAgICAgICAgICAgIGlmIChwLT5lcmFzZWRfZnJhbWVzID09IDMpIHsKKyAgICAgICAgICAgICAgICAvKiBNdXRlIG91dHB1dCAqLworICAgICAgICAgICAgICAgIG1lbXNldChwLT5leGNpdGF0aW9uLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAoRlJBTUVfTEVOICsgUElUQ0hfTUFYKSAqIHNpemVvZigqcC0+ZXhjaXRhdGlvbikpOworICAgICAgICAgICAgICAgIG1lbXNldChwLT5wcmV2X2V4Y2l0YXRpb24sIDAsCisgICAgICAgICAgICAgICAgICAgICAgIFBJVENIX01BWCAqIHNpemVvZigqcC0+ZXhjaXRhdGlvbikpOworICAgICAgICAgICAgICAgIG1lbXNldChmcmFtZS0+ZGF0YVswXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZSQU1FX0xFTiArIExQQ19PUkRFUikgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQxNl90ICpidWYgPSBwLT5hdWRpbyArIExQQ19PUkRFUjsKKworICAgICAgICAgICAgICAgIC8qIFJlZ2VuZXJhdGUgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICByZXNpZHVhbF9pbnRlcnAocC0+ZXhjaXRhdGlvbiwgYnVmLCBwLT5pbnRlcnBfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmludGVycF9nYWluLCAmcC0+cmFuZG9tX3NlZWQpOworCisgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgZXhjaXRhdGlvbiBmb3IgdGhlIG5leHQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkocC0+cHJldl9leGNpdGF0aW9uLCBidWYgKyAoRlJBTUVfTEVOIC0gUElUQ0hfTUFYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUElUQ0hfTUFYICogc2l6ZW9mKCpwLT5leGNpdGF0aW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcC0+Y25nX3JhbmRvbV9zZWVkID0gQ05HX1JBTkRPTV9TRUVEOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwLT5jdXJfZnJhbWVfdHlwZSA9PSBTSURfRlJBTUUpIHsKKyAgICAgICAgICAgIHAtPnNpZF9nYWluID0gc2lkX2dhaW5fdG9fbHNwX2luZGV4KHAtPnN1YmZyYW1lWzBdLmFtcF9pbmRleCk7CisgICAgICAgICAgICBpbnZlcnNlX3F1YW50KHAtPnNpZF9sc3AsIHAtPnByZXZfbHNwLCBwLT5sc3BfaW5kZXgsIDApOworICAgICAgICB9IGVsc2UgaWYgKHAtPnBhc3RfZnJhbWVfdHlwZSA9PSBBQ1RJVkVfRlJBTUUpIHsKKyAgICAgICAgICAgIHAtPnNpZF9nYWluID0gZXN0aW1hdGVfc2lkX2dhaW4ocCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocC0+cGFzdF9mcmFtZV90eXBlID09IEFDVElWRV9GUkFNRSkKKyAgICAgICAgICAgIHAtPmN1cl9nYWluID0gcC0+c2lkX2dhaW47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHAtPmN1cl9nYWluID0gKHAtPmN1cl9nYWluICogNyArIHAtPnNpZF9nYWluKSA+PiAzOworICAgICAgICBnZW5lcmF0ZV9ub2lzZShwKTsKKyAgICAgICAgbHNwX2ludGVycG9sYXRlKGxwYywgcC0+c2lkX2xzcCwgcC0+cHJldl9sc3ApOworICAgICAgICAvKiBTYXZlIHRoZSBsc3BfdmVjdG9yIGZvciB0aGUgbmV4dCBmcmFtZSAqLworICAgICAgICBtZW1jcHkocC0+cHJldl9sc3AsIHAtPnNpZF9sc3AsIExQQ19PUkRFUiAqIHNpemVvZigqcC0+cHJldl9sc3ApKTsKKyAgICB9CisKKyAgICBwLT5wYXN0X2ZyYW1lX3R5cGUgPSBwLT5jdXJfZnJhbWVfdHlwZTsKKworICAgIG1lbWNweShwLT5hdWRpbywgcC0+c3ludGhfbWVtLCBMUENfT1JERVIgKiBzaXplb2YoKnAtPmF1ZGlvKSk7CisgICAgZm9yIChpID0gTFBDX09SREVSLCBqID0gMDsgaiA8IFNVQkZSQU1FUzsgaSArPSBTVUJGUkFNRV9MRU4sIGorKykKKyAgICAgICAgZmZfY2VscF9scF9zeW50aGVzaXNfZmlsdGVyKHAtPmF1ZGlvICsgaSwgJmxwY1tqICogTFBDX09SREVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvICsgaSwgU1VCRlJBTUVfTEVOLCBMUENfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAxIDw8IDEyKTsKKyAgICBtZW1jcHkocC0+c3ludGhfbWVtLCBwLT5hdWRpbyArIEZSQU1FX0xFTiwgTFBDX09SREVSICogc2l6ZW9mKCpwLT5hdWRpbykpOworCisgICAgaWYgKHAtPnBvc3RmaWx0ZXIpIHsKKyAgICAgICAgZm9ybWFudF9wb3N0ZmlsdGVyKHAsIGxwYywgcC0+YXVkaW8sIG91dCk7CisgICAgfSBlbHNlIHsgLy8gaWYgb3V0cHV0IGlzIG5vdCBwb3N0ZmlsdGVyZWQgaXQgc2hvdWxkIGJlIHNjYWxlZCBieSAyCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGUkFNRV9MRU47IGkrKykKKyAgICAgICAgICAgIG91dFtpXSA9IGF2X2NsaXBfaW50MTYocC0+YXVkaW9bTFBDX09SREVSICsgaV0gPDwgMSk7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGZyYW1lX3NpemVbZGVjX21vZGVdOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihHNzIzXzFfQ29udGV4dCwgeCkKKyNkZWZpbmUgQUQgICAgIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJwb3N0ZmlsdGVyIiwgInBvc3RmaWx0ZXIgb24vb2ZmIiwgT0ZGU0VUKHBvc3RmaWx0ZXIpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICB7IC5pNjQgPSAxIH0sIDAsIDEsIEFEIH0sCisgICAgeyBOVUxMIH0KK307CisKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZzcyM18xZGVjX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIkcuNzIzLjEgZGVjb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2c3MjNfMV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJnNzIzXzEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHLjcyMy4xIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0c3MjNfMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRzcyM18xX0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGc3MjNfMV9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBnNzIzXzFfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9TVUJGUkFNRVMgfCBDT0RFQ19DQVBfRFIxLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZnNzIzXzFkZWNfY2xhc3MsCit9OworCisjaWYgQ09ORklHX0c3MjNfMV9FTkNPREVSCisjZGVmaW5lIEJJVFNUUkVBTV9XUklURVJfTEUKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgZzcyM18xX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBHNzIzXzFfQ29udGV4dCAqcCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlICE9IDgwMDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IDgwMDBIeiBzYW1wbGUgcmF0ZSBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBtb25vIHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA9PSA2MzAwKSB7CisgICAgICAgIHAtPmN1cl9yYXRlID0gUkFURV82MzAwOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmJpdF9yYXRlID09IDUzMDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCaXRyYXRlIG5vdCBzdXBwb3J0ZWQgeWV0LCB1c2UgNi4za1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJCaXRyYXRlIG5vdCBzdXBwb3J0ZWQsIHVzZSA2LjNrXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXZjdHgtPmZyYW1lX3NpemUgPSAyNDA7CisgICAgbWVtY3B5KHAtPnByZXZfbHNwLCBkY19sc3AsIExQQ19PUkRFUiAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSZW1vdmUgREMgY29tcG9uZW50IGZyb20gdGhlIGlucHV0IHNpZ25hbC4KKyAqCisgKiBAcGFyYW0gYnVmIGlucHV0IHNpZ25hbAorICogQHBhcmFtIGZpciB6ZXJvIG1lbW9yeQorICogQHBhcmFtIGlpciBwb2xlIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBoaWdocGFzc19maWx0ZXIoaW50MTZfdCAqYnVmLCBpbnQxNl90ICpmaXIsIGludCAqaWlyKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBGUkFNRV9MRU47IGkrKykgeworICAgICAgICAqaWlyICAgPSAoYnVmW2ldIDw8IDE1KSArICgoLSpmaXIpIDw8IDE1KSArIE1VTEwyKCppaXIsIDB4N2YwMCk7CisgICAgICAgICpmaXIgICA9IGJ1ZltpXTsKKyAgICAgICAgYnVmW2ldID0gYXZfY2xpcGxfaW50MzIoKGludDY0X3QpKmlpciArICgxIDw8IDE1KSkgPj4gMTY7CisgICAgfQorfQorCisvKioKKyAqIEVzdGltYXRlIGF1dG9jb3JyZWxhdGlvbiBvZiB0aGUgaW5wdXQgdmVjdG9yLgorICoKKyAqIEBwYXJhbSBidWYgICAgICBpbnB1dCBidWZmZXIKKyAqIEBwYXJhbSBhdXRvY29yciBhdXRvY29ycmVsYXRpb24gY29lZmZpY2llbnRzIHZlY3RvcgorICovCitzdGF0aWMgdm9pZCBjb21wX2F1dG9jb3JyKGludDE2X3QgKmJ1ZiwgaW50MTZfdCAqYXV0b2NvcnIpCit7CisgICAgaW50IGksIHNjYWxlLCB0ZW1wOworICAgIGludDE2X3QgdmVjdG9yW0xQQ19GUkFNRV07CisKKyAgICBzY2FsZV92ZWN0b3IodmVjdG9yLCBidWYsIExQQ19GUkFNRSk7CisKKyAgICAvKiBBcHBseSB0aGUgSGFtbWluZyB3aW5kb3cgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBDX0ZSQU1FOyBpKyspCisgICAgICAgIHZlY3RvcltpXSA9ICh2ZWN0b3JbaV0gKiBoYW1taW5nX3dpbmRvd1tpXSArICgxIDw8IDE0KSkgPj4gMTU7CisKKyAgICAvKiBDb21wdXRlIHRoZSBmaXJzdCBhdXRvY29ycmVsYXRpb24gY29lZmZpY2llbnQgKi8KKyAgICB0ZW1wID0gZmZfZG90X3Byb2R1Y3QodmVjdG9yLCB2ZWN0b3IsIExQQ19GUkFNRSk7CisKKyAgICAvKiBBcHBseSBhIHdoaXRlIG5vaXNlIGNvcnJlbGF0aW9uIGZhY3RvciBvZiAoMTAyNS8xMDI0KSAqLworICAgIHRlbXAgKz0gdGVtcCA+PiAxMDsKKworICAgIC8qIE5vcm1hbGl6ZSAqLworICAgIHNjYWxlID0gbm9ybWFsaXplX2JpdHNfaW50MzIodGVtcCk7CisgICAgYXV0b2NvcnJbMF0gPSBhdl9jbGlwbF9pbnQzMigoaW50NjRfdCkodGVtcCA8PCBzY2FsZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTUpKSA+PiAxNjsKKworICAgIC8qIENvbXB1dGUgdGhlIHJlbWFpbmluZyBjb2VmZmljaWVudHMgKi8KKyAgICBpZiAoIWF1dG9jb3JyWzBdKSB7CisgICAgICAgIG1lbXNldChhdXRvY29yciArIDEsIDAsIExQQ19PUkRFUiAqIHNpemVvZihpbnQxNl90KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBMUENfT1JERVI7IGkrKykgeworICAgICAgICAgICB0ZW1wID0gZmZfZG90X3Byb2R1Y3QodmVjdG9yLCB2ZWN0b3IgKyBpLCBMUENfRlJBTUUgLSBpKTsKKyAgICAgICAgICAgdGVtcCA9IE1VTEwyKCh0ZW1wIDw8IHNjYWxlKSwgYmlub21pYWxfd2luZG93W2kgLSAxXSk7CisgICAgICAgICAgIGF1dG9jb3JyW2ldID0gYXZfY2xpcGxfaW50MzIoKGludDY0X3QpdGVtcCArICgxIDw8IDE1KSkgPj4gMTY7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogVXNlIExldmluc29uLUR1cmJpbiByZWN1cnNpb24gdG8gY29tcHV0ZSBMUEMgY29lZmZpY2llbnRzIGZyb20KKyAqIGF1dG9jb3JyZWxhdGlvbiB2YWx1ZXMuCisgKgorICogQHBhcmFtIGxwYyAgICAgIExQQyBjb2VmZmljaWVudHMgdmVjdG9yCisgKiBAcGFyYW0gYXV0b2NvcnIgYXV0b2NvcnJlbGF0aW9uIGNvZWZmaWNpZW50cyB2ZWN0b3IKKyAqIEBwYXJhbSBlcnJvciAgICBwcmVkaWN0aW9uIGVycm9yCisgKi8KK3N0YXRpYyB2b2lkIGxldmluc29uX2R1cmJpbihpbnQxNl90ICpscGMsIGludDE2X3QgKmF1dG9jb3JyLCBpbnQxNl90IGVycm9yKQoreworICAgIGludDE2X3QgdmVjdG9yW0xQQ19PUkRFUl07CisgICAgaW50MTZfdCBwYXJ0aWFsX2NvcnI7CisgICAgaW50IGksIGosIHRlbXA7CisKKyAgICBtZW1zZXQobHBjLCAwLCBMUENfT1JERVIgKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUjsgaSsrKSB7CisgICAgICAgIC8qIENvbXB1dGUgdGhlIHBhcnRpYWwgY29ycmVsYXRpb24gY29lZmZpY2llbnQgKi8KKyAgICAgICAgdGVtcCA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgICAgICAgICB0ZW1wIC09IGxwY1tqXSAqIGF1dG9jb3JyW2kgLSBqIC0gMV07CisgICAgICAgIHRlbXAgPSAoKGF1dG9jb3JyW2ldIDw8IDEzKSArIHRlbXApIDw8IDM7CisKKyAgICAgICAgaWYgKEZGQUJTKHRlbXApID49IChlcnJvciA8PCAxNikpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBwYXJ0aWFsX2NvcnIgPSB0ZW1wIC8gKGVycm9yIDw8IDEpOworCisgICAgICAgIGxwY1tpXSA9IGF2X2NsaXBsX2ludDMyKChpbnQ2NF90KShwYXJ0aWFsX2NvcnIgPDwgMTQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTUpKSA+PiAxNjsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIHByZWRpY3Rpb24gZXJyb3IgKi8KKyAgICAgICAgdGVtcCAgPSBNVUxMMih0ZW1wLCBwYXJ0aWFsX2NvcnIpOworICAgICAgICBlcnJvciA9IGF2X2NsaXBsX2ludDMyKChpbnQ2NF90KShlcnJvciA8PCAxNikgLSB0ZW1wICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTUpKSA+PiAxNjsKKworICAgICAgICBtZW1jcHkodmVjdG9yLCBscGMsIGkgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICB0ZW1wID0gcGFydGlhbF9jb3JyICogdmVjdG9yW2kgLSBqIC0gMV0gPDwgMTsKKyAgICAgICAgICAgIGxwY1tqXSA9IGF2X2NsaXBsX2ludDMyKChpbnQ2NF90KShscGNbal0gPDwgMTYpIC0gdGVtcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkpID4+IDE2OworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIENhbGN1bGF0ZSBMUEMgY29lZmZpY2llbnRzIGZvciB0aGUgY3VycmVudCBmcmFtZS4KKyAqCisgKiBAcGFyYW0gYnVmICAgICAgIGN1cnJlbnQgZnJhbWUKKyAqIEBwYXJhbSBwcmV2X2RhdGEgMiB0cmFpbGluZyBzdWJmcmFtZXMgb2YgdGhlIHByZXZpb3VzIGZyYW1lCisgKiBAcGFyYW0gbHBjICAgICAgIExQQyBjb2VmZmljaWVudHMgdmVjdG9yCisgKi8KK3N0YXRpYyB2b2lkIGNvbXBfbHBjX2NvZWZmKGludDE2X3QgKmJ1ZiwgaW50MTZfdCAqbHBjKQoreworICAgIGludDE2X3QgYXV0b2NvcnJbKExQQ19PUkRFUiArIDEpICogU1VCRlJBTUVTXTsKKyAgICBpbnQxNl90ICphdXRvY29ycl9wdHIgPSBhdXRvY29ycjsKKyAgICBpbnQxNl90ICpscGNfcHRyICAgICAgPSBscGM7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaiA8IFNVQkZSQU1FUzsgaSArPSBTVUJGUkFNRV9MRU4sIGorKykgeworICAgICAgICBjb21wX2F1dG9jb3JyKGJ1ZiArIGksIGF1dG9jb3JyX3B0cik7CisgICAgICAgIGxldmluc29uX2R1cmJpbihscGNfcHRyLCBhdXRvY29ycl9wdHIgKyAxLCBhdXRvY29ycl9wdHJbMF0pOworCisgICAgICAgIGxwY19wdHIgKz0gTFBDX09SREVSOworICAgICAgICBhdXRvY29ycl9wdHIgKz0gTFBDX09SREVSICsgMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGxwYzJsc3AoaW50MTZfdCAqbHBjLCBpbnQxNl90ICpwcmV2X2xzcCwgaW50MTZfdCAqbHNwKQoreworICAgIGludCBmW0xQQ19PUkRFUiArIDJdOyAvLy88IGNvZWZmaWNpZW50cyBvZiB0aGUgc3VtIGFuZCBkaWZmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcG9seW5vbWlhbHMgKEYxLCBGMikgb3JkZXJlZCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGYxWzBdLCBmMlswXSwgLi4uLiwgZjFbNV0sIGYyWzVdCisKKyAgICBpbnQgbWF4LCBzaGlmdCwgY3VyX3ZhbCwgcHJldl92YWwsIGNvdW50LCBwOworICAgIGludCBpLCBqOworICAgIGludDY0X3QgdGVtcDsKKworICAgIC8qIEluaXRpYWxpemUgZjFbMF0gYW5kIGYyWzBdIHRvIDEgaW4gUTI1ICovCisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUjsgaSsrKQorICAgICAgICBsc3BbaV0gPSAobHBjW2ldICogYmFuZHdpZHRoX2V4cGFuZFtpXSArICgxIDw8IDE0KSkgPj4gMTU7CisKKyAgICAvKiBBcHBseSBiYW5kd2lkdGggZXhwYW5zaW9uIG9uIHRoZSBMUEMgY29lZmZpY2llbnRzICovCisgICAgZlswXSA9IGZbMV0gPSAxIDw8IDI1OworCisgICAgLyogQ29tcHV0ZSB0aGUgcmVtYWluaW5nIGNvZWZmaWNpZW50cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMUENfT1JERVIgLyAyOyBpKyspIHsKKyAgICAgICAgLyogZjEgKi8KKyAgICAgICAgZlsyICogaSArIDJdID0gLWZbMiAqIGldIC0gKChsc3BbaV0gKyBsc3BbTFBDX09SREVSIC0gMSAtIGldKSA8PCAxMik7CisgICAgICAgIC8qIGYyICovCisgICAgICAgIGZbMiAqIGkgKyAzXSA9IGZbMiAqIGkgKyAxXSAtICgobHNwW2ldIC0gbHNwW0xQQ19PUkRFUiAtIDEgLSBpXSkgPDwgMTIpOworICAgIH0KKworICAgIC8qIERpdmlkZSBmMVs1XSBhbmQgZjJbNV0gYnkgMiBmb3IgdXNlIGluIHBvbHlub21pYWwgZXZhbHVhdGlvbiAqLworICAgIGZbTFBDX09SREVSXSA+Pj0gMTsKKyAgICBmW0xQQ19PUkRFUiArIDFdID4+PSAxOworCisgICAgLyogTm9ybWFsaXplIGFuZCBzaG9ydGVuICovCisgICAgbWF4ID0gRkZBQlMoZlswXSk7CisgICAgZm9yIChpID0gMTsgaSA8IExQQ19PUkRFUiArIDI7IGkrKykKKyAgICAgICAgbWF4ID0gRkZNQVgobWF4LCBGRkFCUyhmW2ldKSk7CisKKyAgICBzaGlmdCA9IG5vcm1hbGl6ZV9iaXRzX2ludDMyKG1heCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBDX09SREVSICsgMjsgaSsrKQorICAgICAgICBmW2ldID0gYXZfY2xpcGxfaW50MzIoKGludDY0X3QpKGZbaV0gPDwgc2hpZnQpICsgKDEgPDwgMTUpKSA+PiAxNjsKKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlIEYxIGFuZCBGMiBhdCB1bmlmb3JtIGludGVydmFscyBvZiBwaS8yNTYgYWxvbmcgdGhlCisgICAgICogdW5pdCBjaXJjbGUgYW5kIGNoZWNrIGZvciB6ZXJvIGNyb3NzaW5ncy4KKyAgICAgKi8KKyAgICBwICAgID0gMDsKKyAgICB0ZW1wID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IExQQ19PUkRFUiAvIDI7IGkrKykKKyAgICAgICAgdGVtcCArPSBmWzIgKiBpXSAqIGNvc190YWJbMF07CisgICAgcHJldl92YWwgPSBhdl9jbGlwbF9pbnQzMih0ZW1wIDw8IDEpOworICAgIGNvdW50ICAgID0gMDsKKyAgICBmb3IgKCBpID0gMTsgaSA8IENPU19UQkxfU0laRSAvIDI7IGkrKykgeworICAgICAgICAvKiBFdmFsdWF0ZSAqLworICAgICAgICB0ZW1wID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8PSBMUENfT1JERVIgLyAyOyBqKyspCisgICAgICAgICAgICB0ZW1wICs9IGZbTFBDX09SREVSIC0gMiAqIGogKyBwXSAqIGNvc190YWJbaSAqIGogJSBDT1NfVEJMX1NJWkVdOworICAgICAgICBjdXJfdmFsID0gYXZfY2xpcGxfaW50MzIodGVtcCA8PCAxKTsKKworICAgICAgICAvKiBDaGVjayBmb3Igc2lnbiBjaGFuZ2UsIGluZGljYXRpbmcgYSB6ZXJvIGNyb3NzaW5nICovCisgICAgICAgIGlmICgoY3VyX3ZhbCBeIHByZXZfdmFsKSA8IDApIHsKKyAgICAgICAgICAgIGludCBhYnNfY3VyICA9IEZGQUJTKGN1cl92YWwpOworICAgICAgICAgICAgaW50IGFic19wcmV2ID0gRkZBQlMocHJldl92YWwpOworICAgICAgICAgICAgaW50IHN1bSAgICAgID0gYWJzX2N1ciArIGFic19wcmV2OworCisgICAgICAgICAgICBzaGlmdCAgICAgICAgPSBub3JtYWxpemVfYml0c19pbnQzMihzdW0pOworICAgICAgICAgICAgc3VtICAgICAgICAgIDw8PSBzaGlmdDsKKyAgICAgICAgICAgIGFic19wcmV2ICAgICA9IGFic19wcmV2IDw8IHNoaWZ0ID4+IDg7CisgICAgICAgICAgICBsc3BbY291bnQrK10gPSAoKGkgLSAxKSA8PCA3KSArIChhYnNfcHJldiA+PiAxKSAvIChzdW0gPj4gMTYpOworCisgICAgICAgICAgICBpZiAoY291bnQgPT0gTFBDX09SREVSKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBTd2l0Y2ggYmV0d2VlbiBzdW0gYW5kIGRpZmZlcmVuY2UgcG9seW5vbWlhbHMgKi8KKyAgICAgICAgICAgIHAgXj0gMTsKKworICAgICAgICAgICAgLyogRXZhbHVhdGUgKi8KKyAgICAgICAgICAgIHRlbXAgPSAwOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBMUENfT1JERVIgLyAyOyBqKyspeworICAgICAgICAgICAgICAgIHRlbXAgKz0gZltMUENfT1JERVIgLSAyICogaiArIHBdICoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvc190YWJbaSAqIGogJSBDT1NfVEJMX1NJWkVdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyX3ZhbCA9IGF2X2NsaXBsX2ludDMyKHRlbXA8PDEpOworICAgICAgICB9CisgICAgICAgIHByZXZfdmFsID0gY3VyX3ZhbDsKKyAgICB9CisKKyAgICBpZiAoY291bnQgIT0gTFBDX09SREVSKQorICAgICAgICBtZW1jcHkobHNwLCBwcmV2X2xzcCwgTFBDX09SREVSICogc2l6ZW9mKGludDE2X3QpKTsKK30KKworLyoqCisgKiBRdWFudGl6ZSB0aGUgY3VycmVudCBMU1Agc3VidmVjdG9yLgorICoKKyAqIEBwYXJhbSBudW0gICAgYmFuZCBudW1iZXIKKyAqIEBwYXJhbSBvZmZzZXQgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHN1YnZlY3RvciBpbiBhbiBMUENfT1JERVIgdmVjdG9yCisgKiBAcGFyYW0gc2l6ZSAgIHNpemUgb2YgdGhlIGN1cnJlbnQgc3VidmVjdG9yCisgKi8KKyNkZWZpbmUgZ2V0X2luZGV4KG51bSwgb2Zmc2V0LCBzaXplKSBcCit7XAorICAgIGludCBlcnJvciwgbWF4ID0gLTE7XAorICAgIGludDE2X3QgdGVtcFs0XTtcCisgICAgaW50IGksIGo7XAorICAgIGZvciAoaSA9IDA7IGkgPCBMU1BfQ0JfU0laRTsgaSsrKSB7XAorICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKXtcCisgICAgICAgICAgICB0ZW1wW2pdID0gKHdlaWdodFtqICsgKG9mZnNldCldICogbHNwX2JhbmQjI251bVtpXVtqXSArXAorICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE0KSkgPj4gMTU7XAorICAgICAgICB9XAorICAgICAgICBlcnJvciA9ICBkb3RfcHJvZHVjdChsc3AgKyAob2Zmc2V0KSwgdGVtcCwgc2l6ZSkgPDwgMTtcCisgICAgICAgIGVycm9yIC09IGRvdF9wcm9kdWN0KGxzcF9iYW5kIyNudW1baV0sIHRlbXAsIHNpemUpO1wKKyAgICAgICAgaWYgKGVycm9yID4gbWF4KSB7XAorICAgICAgICAgICAgbWF4ID0gZXJyb3I7XAorICAgICAgICAgICAgbHNwX2luZGV4W251bV0gPSBpO1wKKyAgICAgICAgfVwKKyAgICB9XAorfQorCisvKioKKyAqIFZlY3RvciBxdWFudGl6ZSB0aGUgTFNQIGZyZXF1ZW5jaWVzLgorICoKKyAqIEBwYXJhbSBsc3AgICAgICB0aGUgY3VycmVudCBsc3AgdmVjdG9yCisgKiBAcGFyYW0gcHJldl9sc3AgdGhlIHByZXZpb3VzIGxzcCB2ZWN0b3IKKyAqLworc3RhdGljIHZvaWQgbHNwX3F1YW50aXplKHVpbnQ4X3QgKmxzcF9pbmRleCwgaW50MTZfdCAqbHNwLCBpbnQxNl90ICpwcmV2X2xzcCkKK3sKKyAgICBpbnQxNl90IHdlaWdodFtMUENfT1JERVJdOworICAgIGludDE2X3QgbWluLCBtYXg7CisgICAgaW50IHNoaWZ0LCBpOworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBWUSB3ZWlnaHRpbmcgdmVjdG9yICovCisgICAgd2VpZ2h0WzBdID0gKDEgPDwgMjApIC8gKGxzcFsxXSAtIGxzcFswXSk7CisgICAgd2VpZ2h0W0xQQ19PUkRFUiAtIDFdID0gKDEgPDwgMjApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobHNwW0xQQ19PUkRFUiAtIDFdIC0gbHNwW0xQQ19PUkRFUiAtIDJdKTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBMUENfT1JERVIgLSAxOyBpKyspIHsKKyAgICAgICAgbWluICA9IEZGTUlOKGxzcFtpXSAtIGxzcFtpIC0gMV0sIGxzcFtpICsgMV0gLSBsc3BbaV0pOworICAgICAgICBpZiAobWluID4gMHgyMCkKKyAgICAgICAgICAgIHdlaWdodFtpXSA9ICgxIDw8IDIwKSAvIG1pbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd2VpZ2h0W2ldID0gSU5UMTZfTUFYOworICAgIH0KKworICAgIC8qIE5vcm1hbGl6ZSAqLworICAgIG1heCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUjsgaSsrKQorICAgICAgICBtYXggPSBGRk1BWCh3ZWlnaHRbaV0sIG1heCk7CisKKyAgICBzaGlmdCA9IG5vcm1hbGl6ZV9iaXRzX2ludDE2KG1heCk7CisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUjsgaSsrKSB7CisgICAgICAgIHdlaWdodFtpXSA8PD0gc2hpZnQ7CisgICAgfQorCisgICAgLyogQ29tcHV0ZSB0aGUgVlEgdGFyZ2V0IHZlY3RvciAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMUENfT1JERVI7IGkrKykgeworICAgICAgICBsc3BbaV0gLT0gZGNfbHNwW2ldICsKKyAgICAgICAgICAgICAgICAgICgoKHByZXZfbHNwW2ldIC0gZGNfbHNwW2ldKSAqIDEyMjg4ICsgKDEgPDwgMTQpKSA+PiAxNSk7CisgICAgfQorCisgICAgZ2V0X2luZGV4KDAsIDAsIDMpOworICAgIGdldF9pbmRleCgxLCAzLCAzKTsKKyAgICBnZXRfaW5kZXgoMiwgNiwgNCk7Cit9CisKKy8qKgorICogQXBwbHkgdGhlIGZvcm1hbnQgcGVyY2VwdHVhbCB3ZWlnaHRpbmcgZmlsdGVyLgorICoKKyAqIEBwYXJhbSBmbHRfY29lZiBmaWx0ZXIgY29lZmZpY2llbnRzCisgKiBAcGFyYW0gdW5xX2xwYyAgdW5xdWFudGl6ZWQgbHBjIHZlY3RvcgorICovCitzdGF0aWMgdm9pZCBwZXJjZXB0dWFsX2ZpbHRlcihHNzIzXzFfQ29udGV4dCAqcCwgaW50MTZfdCAqZmx0X2NvZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICp1bnFfbHBjLCBpbnQxNl90ICpidWYpCit7CisgICAgaW50MTZfdCB2ZWN0b3JbRlJBTUVfTEVOICsgTFBDX09SREVSXTsKKyAgICBpbnQgaSwgaiwgaywgbCA9IDA7CisKKyAgICBtZW1jcHkoYnVmLCBwLT5paXJfbWVtLCBzaXplb2YoaW50MTZfdCkgKiBMUENfT1JERVIpOworICAgIG1lbWNweSh2ZWN0b3IsIHAtPmZpcl9tZW0sIHNpemVvZihpbnQxNl90KSAqIExQQ19PUkRFUik7CisgICAgbWVtY3B5KHZlY3RvciArIExQQ19PUkRFUiwgYnVmICsgTFBDX09SREVSLCBzaXplb2YoaW50MTZfdCkgKiBGUkFNRV9MRU4pOworCisgICAgZm9yIChpID0gTFBDX09SREVSLCBqID0gMDsgaiA8IFNVQkZSQU1FUzsgaSArPSBTVUJGUkFNRV9MRU4sIGorKykgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTFBDX09SREVSOyBrKyspIHsKKyAgICAgICAgICAgIGZsdF9jb2VmW2sgKyAyICogbF0gPSAodW5xX2xwY1trICsgbF0gKiBwZXJjZXB0X2ZsdF90YmxbMF1ba10gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE0KSkgPj4gMTU7CisgICAgICAgICAgICBmbHRfY29lZltrICsgMiAqIGwgKyBMUENfT1JERVJdID0gKHVucV9scGNbayArIGxdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlcHRfZmx0X3RibFsxXVtrXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNCkpID4+IDE1OworICAgICAgICB9CisgICAgICAgIGlpcl9maWx0ZXIoZmx0X2NvZWYgKyAyICogbCwgZmx0X2NvZWYgKyAyICogbCArIExQQ19PUkRFUiwgdmVjdG9yICsgaSwKKyAgICAgICAgICAgICAgICAgICBidWYgKyBpLCAwKTsKKyAgICAgICAgbCArPSBMUENfT1JERVI7CisgICAgfQorICAgIG1lbWNweShwLT5paXJfbWVtLCBidWYgKyBGUkFNRV9MRU4sIHNpemVvZihpbnQxNl90KSAqIExQQ19PUkRFUik7CisgICAgbWVtY3B5KHAtPmZpcl9tZW0sIHZlY3RvciArIEZSQU1FX0xFTiwgc2l6ZW9mKGludDE2X3QpICogTFBDX09SREVSKTsKK30KKworLyoqCisgKiBFc3RpbWF0ZSB0aGUgb3BlbiBsb29wIHBpdGNoIHBlcmlvZC4KKyAqCisgKiBAcGFyYW0gYnVmICAgcGVyY2VwdHVhbGx5IHdlaWdodGVkIHNwZWVjaAorICogQHBhcmFtIHN0YXJ0IGVzdGltYXRpb24gaXMgY2FycmllZCBvdXQgZnJvbSB0aGlzIHBvc2l0aW9uCisgKi8KK3N0YXRpYyBpbnQgZXN0aW1hdGVfcGl0Y2goaW50MTZfdCAqYnVmLCBpbnQgc3RhcnQpCit7CisgICAgaW50IG1heF9leHAgPSAzMjsKKyAgICBpbnQgbWF4X2NjciA9IDB4NDAwMDsKKyAgICBpbnQgbWF4X2VuZyA9IDB4N2ZmZjsKKyAgICBpbnQgaW5kZXggICA9IFBJVENIX01JTjsKKyAgICBpbnQgb2Zmc2V0ICA9IHN0YXJ0IC0gUElUQ0hfTUlOICsgMTsKKworICAgIGludCBjY3IsIGVuZywgb3JpZ19lbmcsIGNjcl9lbmcsIGV4cDsKKyAgICBpbnQgZGlmZiwgdGVtcDsKKworICAgIGludCBpOworCisgICAgb3JpZ19lbmcgPSBmZl9kb3RfcHJvZHVjdChidWYgKyBvZmZzZXQsIGJ1ZiArIG9mZnNldCwgSEFMRl9GUkFNRV9MRU4pOworCisgICAgZm9yIChpID0gUElUQ0hfTUlOOyBpIDw9IFBJVENIX01BWCAtIDM7IGkrKykgeworICAgICAgICBvZmZzZXQtLTsKKworICAgICAgICAvKiBVcGRhdGUgZW5lcmd5IGFuZCBjb21wdXRlIGNvcnJlbGF0aW9uICovCisgICAgICAgIG9yaWdfZW5nICs9IGJ1ZltvZmZzZXRdICogYnVmW29mZnNldF0gLQorICAgICAgICAgICAgICAgICAgICBidWZbb2Zmc2V0ICsgSEFMRl9GUkFNRV9MRU5dICogYnVmW29mZnNldCArIEhBTEZfRlJBTUVfTEVOXTsKKyAgICAgICAgY2NyICAgICAgPSAgZmZfZG90X3Byb2R1Y3QoYnVmICsgc3RhcnQsIGJ1ZiArIG9mZnNldCwgSEFMRl9GUkFNRV9MRU4pOworICAgICAgICBpZiAoY2NyIDw9IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBTcGxpdCBpbnRvIG1hbnRpc3NhIGFuZCBleHBvbmVudCB0byBtYWludGFpbiBwcmVjaXNpb24gKi8KKyAgICAgICAgZXhwICA9ICAgbm9ybWFsaXplX2JpdHNfaW50MzIoY2NyKTsKKyAgICAgICAgY2NyICA9ICAgYXZfY2xpcGxfaW50MzIoKGludDY0X3QpKGNjciA8PCBleHApICsgKDEgPDwgMTUpKSA+PiAxNjsKKyAgICAgICAgZXhwICA8PD0gMTsKKyAgICAgICAgY2NyICAqPSAgY2NyOworICAgICAgICB0ZW1wID0gICBub3JtYWxpemVfYml0c19pbnQzMihjY3IpOworICAgICAgICBjY3IgID0gICBjY3IgPDwgdGVtcCA+PiAxNjsKKyAgICAgICAgZXhwICArPSAgdGVtcDsKKworICAgICAgICB0ZW1wID0gICBub3JtYWxpemVfYml0c19pbnQzMihvcmlnX2VuZyk7CisgICAgICAgIGVuZyAgPSAgIGF2X2NsaXBsX2ludDMyKChpbnQ2NF90KShvcmlnX2VuZyA8PCB0ZW1wKSArICgxIDw8IDE1KSkgPj4gMTY7CisgICAgICAgIGV4cCAgLT0gIHRlbXA7CisKKyAgICAgICAgaWYgKGNjciA+PSBlbmcpIHsKKyAgICAgICAgICAgIGV4cC0tOworICAgICAgICAgICAgY2NyID4+PSAxOworICAgICAgICB9CisgICAgICAgIGlmIChleHAgPiBtYXhfZXhwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGV4cCArIDEgPCBtYXhfZXhwKQorICAgICAgICAgICAgZ290byB1cGRhdGU7CisKKyAgICAgICAgLyogRXF1YWxpemUgZXhwb25lbnRzIGJlZm9yZSBjb21wYXJpc29uICovCisgICAgICAgIGlmIChleHAgKyAxID09IG1heF9leHApCisgICAgICAgICAgICB0ZW1wID0gbWF4X2NjciA+PiAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZW1wID0gbWF4X2NjcjsKKyAgICAgICAgY2NyX2VuZyA9IGNjciAqIG1heF9lbmc7CisgICAgICAgIGRpZmYgICAgPSBjY3JfZW5nIC0gZW5nICogdGVtcDsKKyAgICAgICAgaWYgKGRpZmYgPiAwICYmIChpIC0gaW5kZXggPCBQSVRDSF9NSU4gfHwgZGlmZiA+IGNjcl9lbmcgPj4gMikpIHsKK3VwZGF0ZToKKyAgICAgICAgICAgIGluZGV4ICAgPSBpOworICAgICAgICAgICAgbWF4X2V4cCA9IGV4cDsKKyAgICAgICAgICAgIG1heF9jY3IgPSBjY3I7CisgICAgICAgICAgICBtYXhfZW5nID0gZW5nOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmRleDsKK30KKworLyoqCisgKiBDb21wdXRlIGhhcm1vbmljIG5vaXNlIGZpbHRlciBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSBidWYgICAgICAgcGVyY2VwdHVhbGx5IHdlaWdodGVkIHNwZWVjaAorICogQHBhcmFtIHBpdGNoX2xhZyBvcGVuIGxvb3AgcGl0Y2ggcGVyaW9kCisgKiBAcGFyYW0gaGYgICAgICAgIGhhcm1vbmljIGZpbHRlciBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIGNvbXBfaGFybW9uaWNfY29lZmYoaW50MTZfdCAqYnVmLCBpbnQxNl90IHBpdGNoX2xhZywgSEZQYXJhbSAqaGYpCit7CisgICAgaW50IGNjciwgZW5nLCBtYXhfY2NyLCBtYXhfZW5nOworICAgIGludCBleHAsIG1heCwgZGlmZjsKKyAgICBpbnQgZW5lcmd5WzE1XTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDAsIGogPSBwaXRjaF9sYWcgLSAzOyBqIDw9IHBpdGNoX2xhZyArIDM7IGkrKywgaisrKSB7CisgICAgICAgIC8qIENvbXB1dGUgcmVzaWR1YWwgZW5lcmd5ICovCisgICAgICAgIGVuZXJneVtpIDw8IDFdID0gZmZfZG90X3Byb2R1Y3QoYnVmIC0gaiwgYnVmIC0gaiwgU1VCRlJBTUVfTEVOKTsKKyAgICAgICAgLyogQ29tcHV0ZSBjb3JyZWxhdGlvbiAqLworICAgICAgICBlbmVyZ3lbKGkgPDwgMSkgKyAxXSA9IGZmX2RvdF9wcm9kdWN0KGJ1ZiwgYnVmIC0gaiwgU1VCRlJBTUVfTEVOKTsKKyAgICB9CisKKyAgICAvKiBDb21wdXRlIHRhcmdldCBlbmVyZ3kgKi8KKyAgICBlbmVyZ3lbMTRdID0gZmZfZG90X3Byb2R1Y3QoYnVmLCBidWYsIFNVQkZSQU1FX0xFTik7CisKKyAgICAvKiBOb3JtYWxpemUgKi8KKyAgICBtYXggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorICAgICAgICBtYXggPSBGRk1BWChtYXgsIEZGQUJTKGVuZXJneVtpXSkpOworCisgICAgZXhwID0gbm9ybWFsaXplX2JpdHNfaW50MzIobWF4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgeworICAgICAgICBlbmVyZ3lbaV0gPSBhdl9jbGlwbF9pbnQzMigoaW50NjRfdCkoZW5lcmd5W2ldIDw8IGV4cCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkpID4+IDE2OworICAgIH0KKworICAgIGhmLT5pbmRleCA9IC0xOworICAgIGhmLT5nYWluICA9ICAwOworICAgIG1heF9jY3IgICA9ICAxOworICAgIG1heF9lbmcgICA9ICAweDdmZmY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IDY7IGkrKykgeworICAgICAgICBlbmcgPSBlbmVyZ3lbaSA8PCAxXTsKKyAgICAgICAgY2NyID0gZW5lcmd5WyhpIDw8IDEpICsgMV07CisKKyAgICAgICAgaWYgKGNjciA8PSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgY2NyICA9IChjY3IgKiBjY3IgKyAoMSA8PCAxNCkpID4+IDE1OworICAgICAgICBkaWZmID0gY2NyICogbWF4X2VuZyAtIGVuZyAqIG1heF9jY3I7CisgICAgICAgIGlmIChkaWZmID4gMCkgeworICAgICAgICAgICAgbWF4X2NjciAgID0gY2NyOworICAgICAgICAgICAgbWF4X2VuZyAgID0gZW5nOworICAgICAgICAgICAgaGYtPmluZGV4ID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoZi0+aW5kZXggPT0gLTEpIHsKKyAgICAgICAgaGYtPmluZGV4ID0gcGl0Y2hfbGFnOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZW5nID0gZW5lcmd5WzE0XSAqIG1heF9lbmc7CisgICAgZW5nID0gKGVuZyA+PiAyKSArIChlbmcgPj4gMyk7CisgICAgY2NyID0gZW5lcmd5WyhoZi0+aW5kZXggPDwgMSkgKyAxXSAqIGVuZXJneVsoaGYtPmluZGV4IDw8IDEpICsgMV07CisgICAgaWYgKGVuZyA8IGNjcikgeworICAgICAgICBlbmcgPSBlbmVyZ3lbKGhmLT5pbmRleCA8PCAxKSArIDFdOworCisgICAgICAgIGlmIChlbmcgPj0gbWF4X2VuZykKKyAgICAgICAgICAgIGhmLT5nYWluID0gMHgyODAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoZi0+Z2FpbiA9ICgoZW5nIDw8IDE1KSAvIG1heF9lbmcgKiAweDI4MDAgKyAoMSA8PCAxNCkpID4+IDE1OworICAgIH0KKyAgICBoZi0+aW5kZXggKz0gcGl0Y2hfbGFnIC0gMzsKK30KKworLyoqCisgKiBBcHBseSB0aGUgaGFybW9uaWMgbm9pc2Ugc2hhcGluZyBmaWx0ZXIuCisgKgorICogQHBhcmFtIGhmIGZpbHRlciBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIGhhcm1vbmljX2ZpbHRlcihIRlBhcmFtICpoZiwgY29uc3QgaW50MTZfdCAqc3JjLCBpbnQxNl90ICpkZXN0KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IFNVQkZSQU1FX0xFTjsgaSsrKSB7CisgICAgICAgIGludDY0X3QgdGVtcCA9IGhmLT5nYWluICogc3JjW2kgLSBoZi0+aW5kZXhdIDw8IDE7CisgICAgICAgIGRlc3RbaV0gPSBhdl9jbGlwbF9pbnQzMigoc3JjW2ldIDw8IDE2KSAtIHRlbXAgKyAoMSA8PCAxNSkpID4+IDE2OworICAgIH0KK30KKworc3RhdGljIHZvaWQgaGFybW9uaWNfbm9pc2Vfc3ViKEhGUGFyYW0gKmhmLCBjb25zdCBpbnQxNl90ICpzcmMsIGludDE2X3QgKmRlc3QpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IFNVQkZSQU1FX0xFTjsgaSsrKSB7CisgICAgICAgIGludDY0X3QgdGVtcCA9IGhmLT5nYWluICogc3JjW2kgLSBoZi0+aW5kZXhdIDw8IDE7CisgICAgICAgIGRlc3RbaV0gPSBhdl9jbGlwbF9pbnQzMigoKGRlc3RbaV0gLSBzcmNbaV0pIDw8IDE2KSArIHRlbXAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTUpKSA+PiAxNjsKKworICAgIH0KK30KKworLyoqCisgKiBDb21iaW5lZCBzeW50aGVzaXMgYW5kIGZvcm1hbnQgcGVyY2VwdHVhbCB3ZWlnaHRpbmcgZmlsZXIuCisgKgorICogQHBhcmFtIHFudF9scGMgIHF1YW50aXplZCBscGMgY29lZmZpY2llbnRzCisgKiBAcGFyYW0gcGVyZl9scGMgcGVyY2VwdHVhbCBmaWx0ZXIgY29lZmZpY2llbnRzCisgKiBAcGFyYW0gcGVyZl9maXIgcGVyY2VwdHVhbCBmaWx0ZXIgZmlyIG1lbW9yeQorICogQHBhcmFtIHBlcmZfaWlyIHBlcmNlcHR1YWwgZmlsdGVyIGlpciBtZW1vcnkKKyAqIEBwYXJhbSBzY2FsZSAgICB0aGUgZmlsdGVyIG91dHB1dCB3aWxsIGJlIHNjYWxlZCBieSAyXnNjYWxlCisgKi8KK3N0YXRpYyB2b2lkIHN5bnRoX3BlcmNlcHRfZmlsdGVyKGludDE2X3QgKnFudF9scGMsIGludDE2X3QgKnBlcmZfbHBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqcGVyZl9maXIsIGludDE2X3QgKnBlcmZfaWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqc3JjLCBpbnQxNl90ICpkZXN0LCBpbnQgc2NhbGUpCit7CisgICAgaW50IGksIGo7CisgICAgaW50MTZfdCBidWZfMTZbU1VCRlJBTUVfTEVOICsgTFBDX09SREVSXTsKKyAgICBpbnQ2NF90IGJ1ZltTVUJGUkFNRV9MRU5dOworCisgICAgaW50MTZfdCAqYnB0cl8xNiA9IGJ1Zl8xNiArIExQQ19PUkRFUjsKKworICAgIG1lbWNweShidWZfMTYsIHBlcmZfZmlyLCBzaXplb2YoaW50MTZfdCkgKiBMUENfT1JERVIpOworICAgIG1lbWNweShkZXN0IC0gTFBDX09SREVSLCBwZXJmX2lpciwgc2l6ZW9mKGludDE2X3QpICogTFBDX09SREVSKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBTVUJGUkFNRV9MRU47IGkrKykgeworICAgICAgICBpbnQ2NF90IHRlbXAgPSAwOworICAgICAgICBmb3IgKGogPSAxOyBqIDw9IExQQ19PUkRFUjsgaisrKQorICAgICAgICAgICAgdGVtcCAtPSBxbnRfbHBjW2ogLSAxXSAqIGJwdHJfMTZbaSAtIGpdOworCisgICAgICAgIGJ1ZltpXSAgICAgPSAoc3JjW2ldIDw8IDE1KSArICh0ZW1wIDw8IDMpOworICAgICAgICBicHRyXzE2W2ldID0gYXZfY2xpcGxfaW50MzIoYnVmW2ldICsgKDEgPDwgMTUpKSA+PiAxNjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgU1VCRlJBTUVfTEVOOyBpKyspIHsKKyAgICAgICAgaW50NjRfdCBmaXIgPSAwLCBpaXIgPSAwOworICAgICAgICBmb3IgKGogPSAxOyBqIDw9IExQQ19PUkRFUjsgaisrKSB7CisgICAgICAgICAgICBmaXIgLT0gcGVyZl9scGNbaiAtIDFdICogYnB0cl8xNltpIC0gal07CisgICAgICAgICAgICBpaXIgKz0gcGVyZl9scGNbaiArIExQQ19PUkRFUiAtIDFdICogZGVzdFtpIC0gal07CisgICAgICAgIH0KKyAgICAgICAgZGVzdFtpXSA9IGF2X2NsaXBsX2ludDMyKCgoYnVmW2ldICsgKGZpciA8PCAzKSkgPDwgc2NhbGUpICsgKGlpciA8PCAzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkpID4+IDE2OworICAgIH0KKyAgICBtZW1jcHkocGVyZl9maXIsIGJ1Zl8xNiArIFNVQkZSQU1FX0xFTiwgc2l6ZW9mKGludDE2X3QpICogTFBDX09SREVSKTsKKyAgICBtZW1jcHkocGVyZl9paXIsIGRlc3QgKyBTVUJGUkFNRV9MRU4gLSBMUENfT1JERVIsCisgICAgICAgICAgIHNpemVvZihpbnQxNl90KSAqIExQQ19PUkRFUik7Cit9CisKKy8qKgorICogQ29tcHV0ZSB0aGUgYWRhcHRpdmUgY29kZWJvb2sgY29udHJpYnV0aW9uLgorICoKKyAqIEBwYXJhbSBidWYgICBpbnB1dCBzaWduYWwKKyAqIEBwYXJhbSBpbmRleCB0aGUgY3VycmVudCBzdWJmcmFtZSBpbmRleAorICovCitzdGF0aWMgdm9pZCBhY2Jfc2VhcmNoKEc3MjNfMV9Db250ZXh0ICpwLCBpbnQxNl90ICpyZXNpZHVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqaW1wdWxzZV9yZXNwLCBjb25zdCBpbnQxNl90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkKK3sKKworICAgIGludDE2X3QgZmx0X2J1ZltQSVRDSF9PUkRFUl1bU1VCRlJBTUVfTEVOXTsKKworICAgIGNvbnN0IGludDE2X3QgKmNiX3RibCA9IGFkYXB0aXZlX2NiX2dhaW44NTsKKworICAgIGludCBjY3JfYnVmW1BJVENIX09SREVSICogU1VCRlJBTUVTIDw8IDJdOworCisgICAgaW50IHBpdGNoX2xhZyA9IHAtPnBpdGNoX2xhZ1tpbmRleCA+PiAxXTsKKyAgICBpbnQgYWNiX2xhZyAgID0gMTsKKyAgICBpbnQgYWNiX2dhaW4gID0gMDsKKyAgICBpbnQgb2RkX2ZyYW1lID0gaW5kZXggJiAxOworICAgIGludCBpdGVyICAgICAgPSAzICsgb2RkX2ZyYW1lOworICAgIGludCBjb3VudCAgICAgPSAwOworICAgIGludCB0Ymxfc2l6ZSAgPSA4NTsKKworICAgIGludCBpLCBqLCBrLCBsLCBtYXg7CisgICAgaW50NjRfdCB0ZW1wOworCisgICAgaWYgKCFvZGRfZnJhbWUpIHsKKyAgICAgICAgaWYgKHBpdGNoX2xhZyA9PSBQSVRDSF9NSU4pCisgICAgICAgICAgICBwaXRjaF9sYWcrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGl0Y2hfbGFnID0gRkZNSU4ocGl0Y2hfbGFnLCBQSVRDSF9NQVggLSA1KTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaXRlcjsgaSsrKSB7CisgICAgICAgIGdldF9yZXNpZHVhbChyZXNpZHVhbCwgcC0+cHJldl9leGNpdGF0aW9uLCBwaXRjaF9sYWcgKyBpIC0gMSk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFNVQkZSQU1FX0xFTjsgaisrKSB7CisgICAgICAgICAgICB0ZW1wID0gMDsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPD0gajsgaysrKQorICAgICAgICAgICAgICAgIHRlbXAgKz0gcmVzaWR1YWxbUElUQ0hfT1JERVIgLSAxICsga10gKiBpbXB1bHNlX3Jlc3BbaiAtIGtdOworICAgICAgICAgICAgZmx0X2J1ZltQSVRDSF9PUkRFUiAtIDFdW2pdID0gYXZfY2xpcGxfaW50MzIoKHRlbXAgPDwgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTUpKSA+PiAxNjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IFBJVENIX09SREVSIC0gMjsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgIGZsdF9idWZbal1bMF0gPSAoKHJlc2lkdWFsW2pdIDw8IDEzKSArICgxIDw8IDE0KSkgPj4gMTU7CisgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgU1VCRlJBTUVfTEVOOyBrKyspIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKGZsdF9idWZbaiArIDFdW2sgLSAxXSA8PCAxNSkgKworICAgICAgICAgICAgICAgICAgICAgICByZXNpZHVhbFtqXSAqIGltcHVsc2VfcmVzcFtrXTsKKyAgICAgICAgICAgICAgICBmbHRfYnVmW2pdW2tdID0gYXZfY2xpcGxfaW50MzIoKHRlbXAgPDwgMSkgKyAoMSA8PCAxNSkpID4+IDE2OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcHV0ZSBjcm9zc2NvcnJlbGF0aW9uIHdpdGggdGhlIHNpZ25hbCAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgUElUQ0hfT1JERVI7IGorKykgeworICAgICAgICAgICAgdGVtcCA9IGZmX2RvdF9wcm9kdWN0KGJ1ZiwgZmx0X2J1ZltqXSwgU1VCRlJBTUVfTEVOKTsKKyAgICAgICAgICAgIGNjcl9idWZbY291bnQrK10gPSBhdl9jbGlwbF9pbnQzMih0ZW1wIDw8IDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcHV0ZSBlbmVyZ2llcyAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgUElUQ0hfT1JERVI7IGorKykgeworICAgICAgICAgICAgY2NyX2J1Zltjb3VudCsrXSA9IGRvdF9wcm9kdWN0KGZsdF9idWZbal0sIGZsdF9idWZbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCRlJBTUVfTEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IDE7IGogPCBQSVRDSF9PUkRFUjsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgajsgaysrKSB7CisgICAgICAgICAgICAgICAgdGVtcCA9IGZmX2RvdF9wcm9kdWN0KGZsdF9idWZbal0sIGZsdF9idWZba10sIFNVQkZSQU1FX0xFTik7CisgICAgICAgICAgICAgICAgY2NyX2J1Zltjb3VudCsrXSA9IGF2X2NsaXBsX2ludDMyKHRlbXA8PDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogTm9ybWFsaXplIGFuZCBzaG9ydGVuICovCisgICAgbWF4ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjAgKiBpdGVyOyBpKyspCisgICAgICAgIG1heCA9IEZGTUFYKG1heCwgRkZBQlMoY2NyX2J1ZltpXSkpOworCisgICAgdGVtcCA9IG5vcm1hbGl6ZV9iaXRzX2ludDMyKG1heCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjAgKiBpdGVyOyBpKyspeworICAgICAgICBjY3JfYnVmW2ldID0gYXZfY2xpcGxfaW50MzIoKGludDY0X3QpKGNjcl9idWZbaV0gPDwgdGVtcCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTUpKSA+PiAxNjsKKyAgICB9CisKKyAgICBtYXggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBpdGVyOyBpKyspIHsKKyAgICAgICAgLyogU2VsZWN0IHF1YW50aXphdGlvbiB0YWJsZSAqLworICAgICAgICBpZiAoIW9kZF9mcmFtZSAmJiBwaXRjaF9sYWcgKyBpIC0gMSA+PSBTVUJGUkFNRV9MRU4gLSAyIHx8CisgICAgICAgICAgICBvZGRfZnJhbWUgJiYgcGl0Y2hfbGFnID49IFNVQkZSQU1FX0xFTiAtIDIpIHsKKyAgICAgICAgICAgIGNiX3RibCA9IGFkYXB0aXZlX2NiX2dhaW4xNzA7CisgICAgICAgICAgICB0Ymxfc2l6ZSA9IDE3MDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IDAsIGsgPSAwOyBqIDwgdGJsX3NpemU7IGorKywgayArPSAyMCkgeworICAgICAgICAgICAgdGVtcCA9IDA7CisgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgMjA7IGwrKykKKyAgICAgICAgICAgICAgICB0ZW1wICs9IGNjcl9idWZbMjAgKiBpICsgbF0gKiBjYl90YmxbayArIGxdOworICAgICAgICAgICAgdGVtcCA9ICBhdl9jbGlwbF9pbnQzMih0ZW1wKTsKKworICAgICAgICAgICAgaWYgKHRlbXAgPiBtYXgpIHsKKyAgICAgICAgICAgICAgICBtYXggICAgICA9IHRlbXA7CisgICAgICAgICAgICAgICAgYWNiX2dhaW4gPSBqOworICAgICAgICAgICAgICAgIGFjYl9sYWcgID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghb2RkX2ZyYW1lKSB7CisgICAgICAgIHBpdGNoX2xhZyArPSBhY2JfbGFnIC0gMTsKKyAgICAgICAgYWNiX2xhZyAgID0gIDE7CisgICAgfQorCisgICAgcC0+cGl0Y2hfbGFnW2luZGV4ID4+IDFdICAgICAgPSBwaXRjaF9sYWc7CisgICAgcC0+c3ViZnJhbWVbaW5kZXhdLmFkX2NiX2xhZyAgPSBhY2JfbGFnOworICAgIHAtPnN1YmZyYW1lW2luZGV4XS5hZF9jYl9nYWluID0gYWNiX2dhaW47Cit9CisKKy8qKgorICogU3VidHJhY3QgdGhlIGFkYXB0aXZlIGNvZGVib29rIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBpbnB1dAorICogdG8gb2J0YWluIHRoZSByZXNpZHVhbC4KKyAqCisgKiBAcGFyYW0gYnVmIHRhcmdldCB2ZWN0b3IKKyAqLworc3RhdGljIHZvaWQgc3ViX2FjYl9jb250cmliKGNvbnN0IGludDE2X3QgKnJlc2lkdWFsLCBjb25zdCBpbnQxNl90ICppbXB1bHNlX3Jlc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYnVmKQoreworICAgIGludCBpLCBqOworICAgIC8qIFN1YnRyYWN0IGFkYXB0aXZlIENCIGNvbnRyaWJ1dGlvbiB0byBvYnRhaW4gdGhlIHJlc2lkdWFsICovCisgICAgZm9yIChpID0gMDsgaSA8IFNVQkZSQU1FX0xFTjsgaSsrKSB7CisgICAgICAgIGludDY0X3QgdGVtcCA9IGJ1ZltpXSA8PCAxNDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8PSBpOyBqKyspCisgICAgICAgICAgICB0ZW1wIC09IHJlc2lkdWFsW2pdICogaW1wdWxzZV9yZXNwW2kgLSBqXTsKKworICAgICAgICBidWZbaV0gPSBhdl9jbGlwbF9pbnQzMigodGVtcCA8PCAyKSArICgxIDw8IDE1KSkgPj4gMTY7CisgICAgfQorfQorCisvKioKKyAqIFF1YW50aXplIHRoZSByZXNpZHVhbCBzaWduYWwgdXNpbmcgdGhlIGZpeGVkIGNvZGVib29rIChNUC1NTFEpLgorICoKKyAqIEBwYXJhbSBvcHRpbSBvcHRpbWl6ZWQgZml4ZWQgY29kZWJvb2sgcGFyYW1ldGVycworICogQHBhcmFtIGJ1ZiAgIGV4Y2l0YXRpb24gdmVjdG9yCisgKi8KK3N0YXRpYyB2b2lkIGdldF9mY2JfcGFyYW0oRkNCUGFyYW0gKm9wdGltLCBpbnQxNl90ICppbXB1bHNlX3Jlc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJ1ZiwgaW50IHB1bHNlX2NudCwgaW50IHBpdGNoX2xhZykKK3sKKyAgICBGQ0JQYXJhbSBwYXJhbTsKKyAgICBpbnQxNl90IGltcHVsc2VfcltTVUJGUkFNRV9MRU5dOworICAgIGludDE2X3QgdGVtcF9jb3JyW1NVQkZSQU1FX0xFTl07CisgICAgaW50MTZfdCBpbXB1bHNlX2NvcnJbU1VCRlJBTUVfTEVOXTsKKworICAgIGludCBjY3IxW1NVQkZSQU1FX0xFTl07CisgICAgaW50IGNjcjJbU1VCRlJBTUVfTEVOXTsKKyAgICBpbnQgYW1wLCBlcnIsIG1heCwgbWF4X2FtcF9pbmRleCwgbWluLCBzY2FsZSwgaSwgaiwgaywgbDsKKworICAgIGludDY0X3QgdGVtcDsKKworICAgIC8qIFVwZGF0ZSBpbXB1bHNlIHJlc3BvbnNlICovCisgICAgbWVtY3B5KGltcHVsc2VfciwgaW1wdWxzZV9yZXNwLCBzaXplb2YoaW50MTZfdCkgKiBTVUJGUkFNRV9MRU4pOworICAgIHBhcmFtLmRpcmFjX3RyYWluID0gMDsKKyAgICBpZiAocGl0Y2hfbGFnIDwgU1VCRlJBTUVfTEVOIC0gMikgeworICAgICAgICBwYXJhbS5kaXJhY190cmFpbiA9IDE7CisgICAgICAgIGdlbl9kaXJhY190cmFpbihpbXB1bHNlX3IsIHBpdGNoX2xhZyk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IFNVQkZSQU1FX0xFTjsgaSsrKQorICAgICAgICB0ZW1wX2NvcnJbaV0gPSBpbXB1bHNlX3JbaV0gPj4gMTsKKworICAgIC8qIENvbXB1dGUgaW1wdWxzZSByZXNwb25zZSBhdXRvY29ycmVsYXRpb24gKi8KKyAgICB0ZW1wID0gZG90X3Byb2R1Y3QodGVtcF9jb3JyLCB0ZW1wX2NvcnIsIFNVQkZSQU1FX0xFTik7CisKKyAgICBzY2FsZSA9IG5vcm1hbGl6ZV9iaXRzX2ludDMyKHRlbXApOworICAgIGltcHVsc2VfY29yclswXSA9IGF2X2NsaXBsX2ludDMyKCh0ZW1wIDw8IHNjYWxlKSArICgxIDw8IDE1KSkgPj4gMTY7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgU1VCRlJBTUVfTEVOOyBpKyspIHsKKyAgICAgICAgdGVtcCA9IGRvdF9wcm9kdWN0KHRlbXBfY29yciArIGksIHRlbXBfY29yciwgU1VCRlJBTUVfTEVOIC0gaSk7CisgICAgICAgIGltcHVsc2VfY29ycltpXSA9IGF2X2NsaXBsX2ludDMyKCh0ZW1wIDw8IHNjYWxlKSArICgxIDw8IDE1KSkgPj4gMTY7CisgICAgfQorCisgICAgLyogQ29tcHV0ZSBjcm9zc2NvcnJlbGF0aW9uIG9mIGltcHVsc2UgcmVzcG9uc2Ugd2l0aCByZXNpZHVhbCBzaWduYWwgKi8KKyAgICBzY2FsZSAtPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCBTVUJGUkFNRV9MRU47IGkrKyl7CisgICAgICAgIHRlbXAgPSBkb3RfcHJvZHVjdChidWYgKyBpLCBpbXB1bHNlX3IsIFNVQkZSQU1FX0xFTiAtIGkpOworICAgICAgICBpZiAoc2NhbGUgPCAwKQorICAgICAgICAgICAgY2NyMVtpXSA9IHRlbXAgPj4gLXNjYWxlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjY3IxW2ldID0gYXZfY2xpcGxfaW50MzIodGVtcCA8PCBzY2FsZSk7CisgICAgfQorCisgICAgLyogU2VhcmNoIGxvb3AgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgR1JJRF9TSVpFOyBpKyspIHsKKyAgICAgICAgLyogTWF4aW1pemUgdGhlIGNyb3NzY29ycmVsYXRpb24gKi8KKyAgICAgICAgbWF4ID0gMDsKKyAgICAgICAgZm9yIChqID0gaTsgaiA8IFNVQkZSQU1FX0xFTjsgaiArPSBHUklEX1NJWkUpIHsKKyAgICAgICAgICAgIHRlbXAgPSBGRkFCUyhjY3IxW2pdKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID49IG1heCkgeworICAgICAgICAgICAgICAgIG1heCA9IHRlbXA7CisgICAgICAgICAgICAgICAgcGFyYW0ucHVsc2VfcG9zWzBdID0gajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFF1YW50aXplIHRoZSBnYWluIChtYXggY3Jvc3Njb3JyZWxhdGlvbi9pbXB1bHNlX2NvcnJbMF0pICovCisgICAgICAgIGFtcCA9IG1heDsKKyAgICAgICAgbWluID0gMSA8PCAzMDsKKyAgICAgICAgbWF4X2FtcF9pbmRleCA9IEdBSU5fTEVWRUxTIC0gMjsKKyAgICAgICAgZm9yIChqID0gbWF4X2FtcF9pbmRleDsgaiA+PSAyOyBqLS0pIHsKKyAgICAgICAgICAgIHRlbXAgPSBhdl9jbGlwbF9pbnQzMigoaW50NjRfdClmaXhlZF9jYl9nYWluW2pdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXB1bHNlX2NvcnJbMF0gPDwgMSk7CisgICAgICAgICAgICB0ZW1wID0gRkZBQlModGVtcCAtIGFtcCk7CisgICAgICAgICAgICBpZiAodGVtcCA8IG1pbikgeworICAgICAgICAgICAgICAgIG1pbiA9IHRlbXA7CisgICAgICAgICAgICAgICAgbWF4X2FtcF9pbmRleCA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtYXhfYW1wX2luZGV4LS07CisgICAgICAgIC8qIFNlbGVjdCBhZGRpdGlvbmFsIGdhaW4gdmFsdWVzICovCisgICAgICAgIGZvciAoaiA9IDE7IGogPCA1OyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoayA9IGk7IGsgPCBTVUJGUkFNRV9MRU47IGsgKz0gR1JJRF9TSVpFKSB7CisgICAgICAgICAgICAgICAgdGVtcF9jb3JyW2tdID0gMDsKKyAgICAgICAgICAgICAgICBjY3IyW2tdICAgICAgPSBjY3IxW2tdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyYW0uYW1wX2luZGV4ID0gbWF4X2FtcF9pbmRleCArIGogLSAyOworICAgICAgICAgICAgYW1wID0gZml4ZWRfY2JfZ2FpbltwYXJhbS5hbXBfaW5kZXhdOworCisgICAgICAgICAgICBwYXJhbS5wdWxzZV9zaWduWzBdID0gKGNjcjJbcGFyYW0ucHVsc2VfcG9zWzBdXSA8IDApID8gLWFtcCA6IGFtcDsKKyAgICAgICAgICAgIHRlbXBfY29ycltwYXJhbS5wdWxzZV9wb3NbMF1dID0gMTsKKworICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IHB1bHNlX2NudDsgaysrKSB7CisgICAgICAgICAgICAgICAgbWF4ID0gLTEgPDwgMzA7CisgICAgICAgICAgICAgICAgZm9yIChsID0gaTsgbCA8IFNVQkZSQU1FX0xFTjsgbCArPSBHUklEX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBfY29ycltsXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gaW1wdWxzZV9jb3JyW0ZGQUJTKGwgLSBwYXJhbS5wdWxzZV9wb3NbayAtIDFdKV07CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBhdl9jbGlwbF9pbnQzMigoaW50NjRfdCl0ZW1wICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnB1bHNlX3NpZ25bayAtIDFdIDw8IDEpOworICAgICAgICAgICAgICAgICAgICBjY3IyW2xdIC09IHRlbXA7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBGRkFCUyhjY3IyW2xdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgPiBtYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IHRlbXA7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5wdWxzZV9wb3Nba10gPSBsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGFyYW0ucHVsc2Vfc2lnbltrXSA9IChjY3IyW3BhcmFtLnB1bHNlX3Bvc1trXV0gPCAwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1hbXAgOiBhbXA7CisgICAgICAgICAgICAgICAgdGVtcF9jb3JyW3BhcmFtLnB1bHNlX3Bvc1trXV0gPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDcmVhdGUgdGhlIGVycm9yIHZlY3RvciAqLworICAgICAgICAgICAgbWVtc2V0KHRlbXBfY29yciwgMCwgc2l6ZW9mKGludDE2X3QpICogU1VCRlJBTUVfTEVOKTsKKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHB1bHNlX2NudDsgaysrKQorICAgICAgICAgICAgICAgIHRlbXBfY29ycltwYXJhbS5wdWxzZV9wb3Nba11dID0gcGFyYW0ucHVsc2Vfc2lnbltrXTsKKworICAgICAgICAgICAgZm9yIChrID0gU1VCRlJBTUVfTEVOIC0gMTsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDw9IGs7IGwrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgcHJvZCA9IGF2X2NsaXBsX2ludDMyKChpbnQ2NF90KXRlbXBfY29ycltsXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wdWxzZV9yW2sgLSBsXSA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCAgICAgPSBhdl9jbGlwbF9pbnQzMih0ZW1wICsgcHJvZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlbXBfY29ycltrXSA9IHRlbXAgPDwgMiA+PiAxNjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29tcHV0ZSBzcXVhcmUgb2YgZXJyb3IgKi8KKyAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgU1VCRlJBTUVfTEVOOyBrKyspIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHByb2Q7CisgICAgICAgICAgICAgICAgcHJvZCA9IGF2X2NsaXBsX2ludDMyKChpbnQ2NF90KWJ1ZltrXSAqIHRlbXBfY29ycltrXSA8PCAxKTsKKyAgICAgICAgICAgICAgICBlcnIgID0gYXZfY2xpcGxfaW50MzIoZXJyIC0gcHJvZCk7CisgICAgICAgICAgICAgICAgcHJvZCA9IGF2X2NsaXBsX2ludDMyKChpbnQ2NF90KXRlbXBfY29ycltrXSAqIHRlbXBfY29ycltrXSk7CisgICAgICAgICAgICAgICAgZXJyICA9IGF2X2NsaXBsX2ludDMyKGVyciArIHByb2QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBNaW5pbWl6ZSAqLworICAgICAgICAgICAgaWYgKGVyciA8IG9wdGltLT5taW5fZXJyKSB7CisgICAgICAgICAgICAgICAgb3B0aW0tPm1pbl9lcnIgICAgID0gZXJyOworICAgICAgICAgICAgICAgIG9wdGltLT5ncmlkX2luZGV4ICA9IGk7CisgICAgICAgICAgICAgICAgb3B0aW0tPmFtcF9pbmRleCAgID0gcGFyYW0uYW1wX2luZGV4OworICAgICAgICAgICAgICAgIG9wdGltLT5kaXJhY190cmFpbiA9IHBhcmFtLmRpcmFjX3RyYWluOworCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHB1bHNlX2NudDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIG9wdGltLT5wdWxzZV9zaWduW2tdID0gcGFyYW0ucHVsc2Vfc2lnbltrXTsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW0tPnB1bHNlX3Bvc1trXSAgPSBwYXJhbS5wdWxzZV9wb3Nba107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEVuY29kZSB0aGUgcHVsc2UgcG9zaXRpb24gYW5kIGdhaW4gb2YgdGhlIGN1cnJlbnQgc3ViZnJhbWUuCisgKgorICogQHBhcmFtIG9wdGltIG9wdGltaXplZCBmaXhlZCBDQiBwYXJhbWV0ZXJzCisgKiBAcGFyYW0gYnVmICAgZXhjaXRhdGlvbiB2ZWN0b3IKKyAqLworc3RhdGljIHZvaWQgcGFja19mY2JfcGFyYW0oRzcyM18xX1N1YmZyYW1lICpzdWJmcm0sIEZDQlBhcmFtICpvcHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJ1ZiwgaW50IHB1bHNlX2NudCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGogPSBQVUxTRV9NQVggLSBwdWxzZV9jbnQ7CisKKyAgICBzdWJmcm0tPnB1bHNlX3NpZ24gPSAwOworICAgIHN1YmZybS0+cHVsc2VfcG9zICA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgU1VCRlJBTUVfTEVOID4+IDE7IGkrKykgeworICAgICAgICBpbnQgdmFsID0gYnVmW29wdGltLT5ncmlkX2luZGV4ICsgKGkgPDwgMSldOworICAgICAgICBpZiAoIXZhbCkgeworICAgICAgICAgICAgc3ViZnJtLT5wdWxzZV9wb3MgKz0gY29tYmluYXRvcmlhbF90YWJsZVtqXVtpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1YmZybS0+cHVsc2Vfc2lnbiA8PD0gMTsKKyAgICAgICAgICAgIGlmICh2YWwgPCAwKSBzdWJmcm0tPnB1bHNlX3NpZ24rKzsKKyAgICAgICAgICAgIGorKzsKKworICAgICAgICAgICAgaWYgKGogPT0gUFVMU0VfTUFYKSBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdWJmcm0tPmFtcF9pbmRleCAgID0gb3B0aW0tPmFtcF9pbmRleDsKKyAgICBzdWJmcm0tPmdyaWRfaW5kZXggID0gb3B0aW0tPmdyaWRfaW5kZXg7CisgICAgc3ViZnJtLT5kaXJhY190cmFpbiA9IG9wdGltLT5kaXJhY190cmFpbjsKK30KKworLyoqCisgKiBDb21wdXRlIHRoZSBmaXhlZCBjb2RlYm9vayBleGNpdGF0aW9uLgorICoKKyAqIEBwYXJhbSBidWYgICAgICAgICAgdGFyZ2V0IHZlY3RvcgorICogQHBhcmFtIGltcHVsc2VfcmVzcCBpbXB1bHNlIHJlc3BvbnNlIG9mIHRoZSBjb21iaW5lZCBmaWx0ZXIKKyAqLworc3RhdGljIHZvaWQgZmNiX3NlYXJjaChHNzIzXzFfQ29udGV4dCAqcCwgaW50MTZfdCAqaW1wdWxzZV9yZXNwLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpidWYsIGludCBpbmRleCkKK3sKKyAgICBGQ0JQYXJhbSBvcHRpbTsKKyAgICBpbnQgcHVsc2VfY250ID0gcHVsc2VzW2luZGV4XTsKKyAgICBpbnQgaTsKKworICAgIG9wdGltLm1pbl9lcnIgPSAxIDw8IDMwOworICAgIGdldF9mY2JfcGFyYW0oJm9wdGltLCBpbXB1bHNlX3Jlc3AsIGJ1ZiwgcHVsc2VfY250LCBTVUJGUkFNRV9MRU4pOworCisgICAgaWYgKHAtPnBpdGNoX2xhZ1tpbmRleCA+PiAxXSA8IFNVQkZSQU1FX0xFTiAtIDIpIHsKKyAgICAgICAgZ2V0X2ZjYl9wYXJhbSgmb3B0aW0sIGltcHVsc2VfcmVzcCwgYnVmLCBwdWxzZV9jbnQsCisgICAgICAgICAgICAgICAgICAgICAgcC0+cGl0Y2hfbGFnW2luZGV4ID4+IDFdKTsKKyAgICB9CisKKyAgICAvKiBSZWNvbnN0cnVjdCB0aGUgZXhjaXRhdGlvbiAqLworICAgIG1lbXNldChidWYsIDAsIHNpemVvZihpbnQxNl90KSAqIFNVQkZSQU1FX0xFTik7CisgICAgZm9yIChpID0gMDsgaSA8IHB1bHNlX2NudDsgaSsrKQorICAgICAgICBidWZbb3B0aW0ucHVsc2VfcG9zW2ldXSA9IG9wdGltLnB1bHNlX3NpZ25baV07CisKKyAgICBwYWNrX2ZjYl9wYXJhbSgmcC0+c3ViZnJhbWVbaW5kZXhdLCAmb3B0aW0sIGJ1ZiwgcHVsc2VfY250KTsKKworICAgIGlmIChvcHRpbS5kaXJhY190cmFpbikKKyAgICAgICAgZ2VuX2RpcmFjX3RyYWluKGJ1ZiwgcC0+cGl0Y2hfbGFnW2luZGV4ID4+IDFdKTsKK30KKworLyoqCisgKiBQYWNrIHRoZSBmcmFtZSBwYXJhbWV0ZXJzIGludG8gb3V0cHV0IGJpdHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gZnJhbWUgb3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtIHNpemUgIHNpemUgb2YgdGhlIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IHBhY2tfYml0c3RyZWFtKEc3MjNfMV9Db250ZXh0ICpwLCB1bnNpZ25lZCBjaGFyICpmcmFtZSwgaW50IHNpemUpCit7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBpbnQgaW5mb19iaXRzLCBpLCB0ZW1wOworCisgICAgaW5pdF9wdXRfYml0cygmcGIsIGZyYW1lLCBzaXplKTsKKworICAgIGlmIChwLT5jdXJfcmF0ZSA9PSBSQVRFXzYzMDApIHsKKyAgICAgICAgaW5mb19iaXRzID0gMDsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAyLCBpbmZvX2JpdHMpOworICAgIH1lbHNlCisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisKKyAgICBwdXRfYml0cygmcGIsIDgsIHAtPmxzcF9pbmRleFsyXSk7CisgICAgcHV0X2JpdHMoJnBiLCA4LCBwLT5sc3BfaW5kZXhbMV0pOworICAgIHB1dF9iaXRzKCZwYiwgOCwgcC0+bHNwX2luZGV4WzBdKTsKKworICAgIHB1dF9iaXRzKCZwYiwgNywgcC0+cGl0Y2hfbGFnWzBdIC0gUElUQ0hfTUlOKTsKKyAgICBwdXRfYml0cygmcGIsIDIsIHAtPnN1YmZyYW1lWzFdLmFkX2NiX2xhZyk7CisgICAgcHV0X2JpdHMoJnBiLCA3LCBwLT5waXRjaF9sYWdbMV0gLSBQSVRDSF9NSU4pOworICAgIHB1dF9iaXRzKCZwYiwgMiwgcC0+c3ViZnJhbWVbM10uYWRfY2JfbGFnKTsKKworICAgIC8qIFdyaXRlIDEyIGJpdCBjb21iaW5lZCBnYWluICovCisgICAgZm9yIChpID0gMDsgaSA8IFNVQkZSQU1FUzsgaSsrKSB7CisgICAgICAgIHRlbXAgPSBwLT5zdWJmcmFtZVtpXS5hZF9jYl9nYWluICogR0FJTl9MRVZFTFMgKworICAgICAgICAgICAgICAgcC0+c3ViZnJhbWVbaV0uYW1wX2luZGV4OworICAgICAgICBpZiAocC0+Y3VyX3JhdGUgPT0gIFJBVEVfNjMwMCkKKyAgICAgICAgICAgIHRlbXAgKz0gcC0+c3ViZnJhbWVbaV0uZGlyYWNfdHJhaW4gPDwgMTE7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgMTIsIHRlbXApOworICAgIH0KKworICAgIHB1dF9iaXRzKCZwYiwgMSwgcC0+c3ViZnJhbWVbMF0uZ3JpZF9pbmRleCk7CisgICAgcHV0X2JpdHMoJnBiLCAxLCBwLT5zdWJmcmFtZVsxXS5ncmlkX2luZGV4KTsKKyAgICBwdXRfYml0cygmcGIsIDEsIHAtPnN1YmZyYW1lWzJdLmdyaWRfaW5kZXgpOworICAgIHB1dF9iaXRzKCZwYiwgMSwgcC0+c3ViZnJhbWVbM10uZ3JpZF9pbmRleCk7CisKKyAgICBpZiAocC0+Y3VyX3JhdGUgPT0gUkFURV82MzAwKSB7CisgICAgICAgIHNraXBfcHV0X2JpdHMoJnBiLCAxKTsgLyogcmVzZXJ2ZWQgYml0ICovCisKKyAgICAgICAgLyogV3JpdGUgMTMgYml0IGNvbWJpbmVkIHBvc2l0aW9uIGluZGV4ICovCisgICAgICAgIHRlbXAgPSAocC0+c3ViZnJhbWVbMF0ucHVsc2VfcG9zID4+IDE2KSAqIDgxMCArCisgICAgICAgICAgICAgICAocC0+c3ViZnJhbWVbMV0ucHVsc2VfcG9zID4+IDE0KSAqICA5MCArCisgICAgICAgICAgICAgICAocC0+c3ViZnJhbWVbMl0ucHVsc2VfcG9zID4+IDE2KSAqICAgOSArCisgICAgICAgICAgICAgICAocC0+c3ViZnJhbWVbM10ucHVsc2VfcG9zID4+IDE0KTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxMywgdGVtcCk7CisKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxNiwgcC0+c3ViZnJhbWVbMF0ucHVsc2VfcG9zICYgMHhmZmZmKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxNCwgcC0+c3ViZnJhbWVbMV0ucHVsc2VfcG9zICYgMHgzZmZmKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxNiwgcC0+c3ViZnJhbWVbMl0ucHVsc2VfcG9zICYgMHhmZmZmKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxNCwgcC0+c3ViZnJhbWVbM10ucHVsc2VfcG9zICYgMHgzZmZmKTsKKworICAgICAgICBwdXRfYml0cygmcGIsIDYsIHAtPnN1YmZyYW1lWzBdLnB1bHNlX3NpZ24pOworICAgICAgICBwdXRfYml0cygmcGIsIDUsIHAtPnN1YmZyYW1lWzFdLnB1bHNlX3NpZ24pOworICAgICAgICBwdXRfYml0cygmcGIsIDYsIHAtPnN1YmZyYW1lWzJdLnB1bHNlX3NpZ24pOworICAgICAgICBwdXRfYml0cygmcGIsIDUsIHAtPnN1YmZyYW1lWzNdLnB1bHNlX3NpZ24pOworICAgIH0KKworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgcmV0dXJuIGZyYW1lX3NpemVbaW5mb19iaXRzXTsKK30KKworc3RhdGljIGludCBnNzIzXzFfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIEc3MjNfMV9Db250ZXh0ICpwID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQxNl90IHVucV9scGNbTFBDX09SREVSICogU1VCRlJBTUVTXTsKKyAgICBpbnQxNl90IHFudF9scGNbTFBDX09SREVSICogU1VCRlJBTUVTXTsKKyAgICBpbnQxNl90IGN1cl9sc3BbTFBDX09SREVSXTsKKyAgICBpbnQxNl90IHdlaWdodGVkX2xwY1tMUENfT1JERVIgKiBTVUJGUkFNRVMgPDwgMV07CisgICAgaW50MTZfdCB2ZWN0b3JbRlJBTUVfTEVOICsgUElUQ0hfTUFYXTsKKyAgICBpbnQgb2Zmc2V0LCByZXQ7CisgICAgaW50MTZfdCAqaW5fb3JpZyA9IGF2X21lbWR1cChmcmFtZS0+ZGF0YVswXSwgZnJhbWUtPm5iX3NhbXBsZXMgKiBzaXplb2YoaW50MTZfdCkpOworICAgIGludDE2X3QgKmluID0gaW5fb3JpZzsKKworICAgIEhGUGFyYW0gaGZbNF07CisgICAgaW50IGksIGo7CisKKyAgICBpZiAoIWluKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaGlnaHBhc3NfZmlsdGVyKGluLCAmcC0+aHBmX2Zpcl9tZW0sICZwLT5ocGZfaWlyX21lbSk7CisKKyAgICBtZW1jcHkodmVjdG9yLCBwLT5wcmV2X2RhdGEsIEhBTEZfRlJBTUVfTEVOICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICBtZW1jcHkodmVjdG9yICsgSEFMRl9GUkFNRV9MRU4sIGluLCBGUkFNRV9MRU4gKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgY29tcF9scGNfY29lZmYodmVjdG9yLCB1bnFfbHBjKTsKKyAgICBscGMybHNwKCZ1bnFfbHBjW0xQQ19PUkRFUiAqIDNdLCBwLT5wcmV2X2xzcCwgY3VyX2xzcCk7CisgICAgbHNwX3F1YW50aXplKHAtPmxzcF9pbmRleCwgY3VyX2xzcCwgcC0+cHJldl9sc3ApOworCisgICAgLyogVXBkYXRlIG1lbW9yeSAqLworICAgIG1lbWNweSh2ZWN0b3IgKyBMUENfT1JERVIsIHAtPnByZXZfZGF0YSArIFNVQkZSQU1FX0xFTiwKKyAgICAgICAgICAgc2l6ZW9mKGludDE2X3QpICogU1VCRlJBTUVfTEVOKTsKKyAgICBtZW1jcHkodmVjdG9yICsgTFBDX09SREVSICsgU1VCRlJBTUVfTEVOLCBpbiwKKyAgICAgICAgICAgc2l6ZW9mKGludDE2X3QpICogKEhBTEZfRlJBTUVfTEVOICsgU1VCRlJBTUVfTEVOKSk7CisgICAgbWVtY3B5KHAtPnByZXZfZGF0YSwgaW4gKyBIQUxGX0ZSQU1FX0xFTiwKKyAgICAgICAgICAgc2l6ZW9mKGludDE2X3QpICogSEFMRl9GUkFNRV9MRU4pOworICAgIG1lbWNweShpbiwgdmVjdG9yICsgTFBDX09SREVSLCBzaXplb2YoaW50MTZfdCkgKiBGUkFNRV9MRU4pOworCisgICAgcGVyY2VwdHVhbF9maWx0ZXIocCwgd2VpZ2h0ZWRfbHBjLCB1bnFfbHBjLCB2ZWN0b3IpOworCisgICAgbWVtY3B5KGluLCB2ZWN0b3IgKyBMUENfT1JERVIsIHNpemVvZihpbnQxNl90KSAqIEZSQU1FX0xFTik7CisgICAgbWVtY3B5KHZlY3RvciwgcC0+cHJldl93ZWlnaHRfc2lnLCBzaXplb2YoaW50MTZfdCkgKiBQSVRDSF9NQVgpOworICAgIG1lbWNweSh2ZWN0b3IgKyBQSVRDSF9NQVgsIGluLCBzaXplb2YoaW50MTZfdCkgKiBGUkFNRV9MRU4pOworCisgICAgc2NhbGVfdmVjdG9yKHZlY3RvciwgdmVjdG9yLCBGUkFNRV9MRU4gKyBQSVRDSF9NQVgpOworCisgICAgcC0+cGl0Y2hfbGFnWzBdID0gZXN0aW1hdGVfcGl0Y2godmVjdG9yLCBQSVRDSF9NQVgpOworICAgIHAtPnBpdGNoX2xhZ1sxXSA9IGVzdGltYXRlX3BpdGNoKHZlY3RvciwgUElUQ0hfTUFYICsgSEFMRl9GUkFNRV9MRU4pOworCisgICAgZm9yIChpID0gUElUQ0hfTUFYLCBqID0gMDsgaiA8IFNVQkZSQU1FUzsgaSArPSBTVUJGUkFNRV9MRU4sIGorKykKKyAgICAgICAgY29tcF9oYXJtb25pY19jb2VmZih2ZWN0b3IgKyBpLCBwLT5waXRjaF9sYWdbaiA+PiAxXSwgaGYgKyBqKTsKKworICAgIG1lbWNweSh2ZWN0b3IsIHAtPnByZXZfd2VpZ2h0X3NpZywgc2l6ZW9mKGludDE2X3QpICogUElUQ0hfTUFYKTsKKyAgICBtZW1jcHkodmVjdG9yICsgUElUQ0hfTUFYLCBpbiwgc2l6ZW9mKGludDE2X3QpICogRlJBTUVfTEVOKTsKKyAgICBtZW1jcHkocC0+cHJldl93ZWlnaHRfc2lnLCB2ZWN0b3IgKyBGUkFNRV9MRU4sIHNpemVvZihpbnQxNl90KSAqIFBJVENIX01BWCk7CisKKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaiA8IFNVQkZSQU1FUzsgaSArPSBTVUJGUkFNRV9MRU4sIGorKykKKyAgICAgICAgaGFybW9uaWNfZmlsdGVyKGhmICsgaiwgdmVjdG9yICsgUElUQ0hfTUFYICsgaSwgaW4gKyBpKTsKKworICAgIGludmVyc2VfcXVhbnQoY3VyX2xzcCwgcC0+cHJldl9sc3AsIHAtPmxzcF9pbmRleCwgMCk7CisgICAgbHNwX2ludGVycG9sYXRlKHFudF9scGMsIGN1cl9sc3AsIHAtPnByZXZfbHNwKTsKKworICAgIG1lbWNweShwLT5wcmV2X2xzcCwgY3VyX2xzcCwgc2l6ZW9mKGludDE2X3QpICogTFBDX09SREVSKTsKKworICAgIG9mZnNldCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IFNVQkZSQU1FUzsgaSsrKSB7CisgICAgICAgIGludDE2X3QgaW1wdWxzZV9yZXNwW1NVQkZSQU1FX0xFTl07CisgICAgICAgIGludDE2X3QgcmVzaWR1YWxbU1VCRlJBTUVfTEVOICsgUElUQ0hfT1JERVIgLSAxXTsKKyAgICAgICAgaW50MTZfdCBmbHRfaW5bU1VCRlJBTUVfTEVOXTsKKyAgICAgICAgaW50MTZfdCB6ZXJvW0xQQ19PUkRFUl0sIGZpcltMUENfT1JERVJdLCBpaXJbTFBDX09SREVSXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcHV0ZSB0aGUgY29tYmluZWQgaW1wdWxzZSByZXNwb25zZSBvZiB0aGUgc3ludGhlc2lzIGZpbHRlciwKKyAgICAgICAgICogZm9ybWFudCBwZXJjZXB0dWFsIHdlaWdodGluZyBmaWx0ZXIgYW5kIGhhcm1vbmljIG5vaXNlIHNoYXBpbmcgZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBtZW1zZXQoemVybywgMCwgc2l6ZW9mKGludDE2X3QpICogTFBDX09SREVSKTsKKyAgICAgICAgbWVtc2V0KHZlY3RvciwgMCwgc2l6ZW9mKGludDE2X3QpICogUElUQ0hfTUFYKTsKKyAgICAgICAgbWVtc2V0KGZsdF9pbiwgMCwgc2l6ZW9mKGludDE2X3QpICogU1VCRlJBTUVfTEVOKTsKKworICAgICAgICBmbHRfaW5bMF0gPSAxIDw8IDEzOyAvKiBVbml0IGltcHVsc2UgKi8KKyAgICAgICAgc3ludGhfcGVyY2VwdF9maWx0ZXIocW50X2xwYyArIG9mZnNldCwgd2VpZ2h0ZWRfbHBjICsgKG9mZnNldCA8PCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybywgemVybywgZmx0X2luLCB2ZWN0b3IgKyBQSVRDSF9NQVgsIDEpOworICAgICAgICBoYXJtb25pY19maWx0ZXIoaGYgKyBpLCB2ZWN0b3IgKyBQSVRDSF9NQVgsIGltcHVsc2VfcmVzcCk7CisKKyAgICAgICAgIC8qIENvbXB1dGUgdGhlIGNvbWJpbmVkIHplcm8gaW5wdXQgcmVzcG9uc2UgKi8KKyAgICAgICAgZmx0X2luWzBdID0gMDsKKyAgICAgICAgbWVtY3B5KGZpciwgcC0+cGVyZl9maXJfbWVtLCBzaXplb2YoaW50MTZfdCkgKiBMUENfT1JERVIpOworICAgICAgICBtZW1jcHkoaWlyLCBwLT5wZXJmX2lpcl9tZW0sIHNpemVvZihpbnQxNl90KSAqIExQQ19PUkRFUik7CisKKyAgICAgICAgc3ludGhfcGVyY2VwdF9maWx0ZXIocW50X2xwYyArIG9mZnNldCwgd2VpZ2h0ZWRfbHBjICsgKG9mZnNldCA8PCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyLCBpaXIsIGZsdF9pbiwgdmVjdG9yICsgUElUQ0hfTUFYLCAwKTsKKyAgICAgICAgbWVtY3B5KHZlY3RvciwgcC0+aGFybW9uaWNfbWVtLCBzaXplb2YoaW50MTZfdCkgKiBQSVRDSF9NQVgpOworICAgICAgICBoYXJtb25pY19ub2lzZV9zdWIoaGYgKyBpLCB2ZWN0b3IgKyBQSVRDSF9NQVgsIGluKTsKKworICAgICAgICBhY2Jfc2VhcmNoKHAsIHJlc2lkdWFsLCBpbXB1bHNlX3Jlc3AsIGluLCBpKTsKKyAgICAgICAgZ2VuX2FjYl9leGNpdGF0aW9uKHJlc2lkdWFsLCBwLT5wcmV2X2V4Y2l0YXRpb24scC0+cGl0Y2hfbGFnW2kgPj4gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+c3ViZnJhbWVbaV0sIHAtPmN1cl9yYXRlKTsKKyAgICAgICAgc3ViX2FjYl9jb250cmliKHJlc2lkdWFsLCBpbXB1bHNlX3Jlc3AsIGluKTsKKworICAgICAgICBmY2Jfc2VhcmNoKHAsIGltcHVsc2VfcmVzcCwgaW4sIGkpOworCisgICAgICAgIC8qIFJlY29uc3RydWN0IHRoZSBleGNpdGF0aW9uICovCisgICAgICAgIGdlbl9hY2JfZXhjaXRhdGlvbihpbXB1bHNlX3Jlc3AsIHAtPnByZXZfZXhjaXRhdGlvbiwgcC0+cGl0Y2hfbGFnW2kgPj4gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+c3ViZnJhbWVbaV0sIFJBVEVfNjMwMCk7CisKKyAgICAgICAgbWVtbW92ZShwLT5wcmV2X2V4Y2l0YXRpb24sIHAtPnByZXZfZXhjaXRhdGlvbiArIFNVQkZSQU1FX0xFTiwKKyAgICAgICAgICAgICAgIHNpemVvZihpbnQxNl90KSAqIChQSVRDSF9NQVggLSBTVUJGUkFNRV9MRU4pKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFNVQkZSQU1FX0xFTjsgaisrKQorICAgICAgICAgICAgaW5bal0gPSBhdl9jbGlwX2ludDE2KChpbltqXSA8PCAxKSArIGltcHVsc2VfcmVzcFtqXSk7CisgICAgICAgIG1lbWNweShwLT5wcmV2X2V4Y2l0YXRpb24gKyBQSVRDSF9NQVggLSBTVUJGUkFNRV9MRU4sIGluLAorICAgICAgICAgICAgICAgc2l6ZW9mKGludDE2X3QpICogU1VCRlJBTUVfTEVOKTsKKworICAgICAgICAvKiBVcGRhdGUgZmlsdGVyIG1lbW9yaWVzICovCisgICAgICAgIHN5bnRoX3BlcmNlcHRfZmlsdGVyKHFudF9scGMgKyBvZmZzZXQsIHdlaWdodGVkX2xwYyArIChvZmZzZXQgPDwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBlcmZfZmlyX21lbSwgcC0+cGVyZl9paXJfbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiwgdmVjdG9yICsgUElUQ0hfTUFYLCAwKTsKKyAgICAgICAgbWVtbW92ZShwLT5oYXJtb25pY19tZW0sIHAtPmhhcm1vbmljX21lbSArIFNVQkZSQU1FX0xFTiwKKyAgICAgICAgICAgICAgICBzaXplb2YoaW50MTZfdCkgKiAoUElUQ0hfTUFYIC0gU1VCRlJBTUVfTEVOKSk7CisgICAgICAgIG1lbWNweShwLT5oYXJtb25pY19tZW0gKyBQSVRDSF9NQVggLSBTVUJGUkFNRV9MRU4sIHZlY3RvciArIFBJVENIX01BWCwKKyAgICAgICAgICAgICAgIHNpemVvZihpbnQxNl90KSAqIFNVQkZSQU1FX0xFTik7CisKKyAgICAgICAgaW4gKz0gU1VCRlJBTUVfTEVOOworICAgICAgICBvZmZzZXQgKz0gTFBDX09SREVSOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZpbl9vcmlnKTsgaW4gPSBOVUxMOworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgMjQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIGF2cGt0LT5zaXplID0gcGFja19iaXRzdHJlYW0ocCwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9nNzIzXzFfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZzcyM18xIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRy43MjMuMSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9HNzIzXzEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEc3MjNfMV9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBnNzIzXzFfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZzcyM18xX2VuY29kZV9mcmFtZSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXtBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkV9LAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZzcyM18xX2RhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3MjNfMV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhNmM1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3MjNfMV9kYXRhLmgKQEAgLTAsMCArMSwxMzI5IEBACisvKgorICogRzcyMy4xIGNvbXBhdGlibGUgZGVjb2RlciBkYXRhIHRhYmxlcy4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBCZW5qYW1pbiBMYXJzc29uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTW9oYW1lZCBOYXVmYWwgQmFzaGVlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBHNzIzLjEgY29tcGF0aWJsZSBkZWNvZGVyIGRhdGEgdGFibGVzCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0c3MjNfMV9EQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19HNzIzXzFfREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBTVUJGUkFNRVMgICAgICAgNAorI2RlZmluZSBTVUJGUkFNRV9MRU4gICAgNjAKKyNkZWZpbmUgRlJBTUVfTEVOICAgICAgIChTVUJGUkFNRV9MRU4gPDwgMikKKyNkZWZpbmUgSEFMRl9GUkFNRV9MRU4gIChGUkFNRV9MRU4gLyAyKQorI2RlZmluZSBMUENfRlJBTUUgICAgICAgKEhBTEZfRlJBTUVfTEVOICsgU1VCRlJBTUVfTEVOKQorI2RlZmluZSBMUENfT1JERVIgICAgICAgMTAKKyNkZWZpbmUgTFNQX0JBTkRTICAgICAgIDMKKyNkZWZpbmUgTFNQX0NCX1NJWkUgICAgIDI1NgorI2RlZmluZSBQSVRDSF9NSU4gICAgICAgMTgKKyNkZWZpbmUgUElUQ0hfTUFYICAgICAgIChQSVRDSF9NSU4gKyAxMjcpCisjZGVmaW5lIFBJVENIX09SREVSICAgICA1CisjZGVmaW5lIEdSSURfU0laRSAgICAgICAyCisjZGVmaW5lIFBVTFNFX01BWCAgICAgICA2CisjZGVmaW5lIEdBSU5fTEVWRUxTICAgICAyNAorI2RlZmluZSBDT1NfVEJMX1NJWkUgICAgNTEyCisKKy8qKgorICogRzcyMy4xIGZyYW1lIHR5cGVzCisgKi8KK3R5cGVkZWYgZW51bSBGcmFtZVR5cGUgeworICAgIEFDVElWRV9GUkFNRSwgICAgICAgIC8vLzwgQWN0aXZlIHNwZWVjaAorICAgIFNJRF9GUkFNRSwgICAgICAgICAgIC8vLzwgU2lsZW5jZSBJbnNlcnRpb24gRGVzY3JpcHRvciBmcmFtZQorICAgIFVOVFJBTlNNSVRURURfRlJBTUUKK30gRnJhbWVUeXBlOworCitzdGF0aWMgY29uc3QgdWludDhfdCBmcmFtZV9zaXplWzRdID0geyAyNCwgMjAsIDQsIDEgfTsKKwordHlwZWRlZiBlbnVtIFJhdGUgeworICAgIFJBVEVfNjMwMCwKKyAgICBSQVRFXzUzMDAKK30gUmF0ZTsKKworLyoqCisgKiBHNzIzLjEgdW5wYWNrZWQgZGF0YSBzdWJmcmFtZQorICovCit0eXBlZGVmIHN0cnVjdCBHNzIzXzFfU3ViZnJhbWUgeworICAgIGludCBhZF9jYl9sYWc7ICAgICAvLy88IGFkYXB0aXZlIGNvZGVib29rIGxhZworICAgIGludCBhZF9jYl9nYWluOworICAgIGludCBkaXJhY190cmFpbjsKKyAgICBpbnQgcHVsc2Vfc2lnbjsKKyAgICBpbnQgZ3JpZF9pbmRleDsKKyAgICBpbnQgYW1wX2luZGV4OworICAgIGludCBwdWxzZV9wb3M7Cit9IEc3MjNfMV9TdWJmcmFtZTsKKworLyoqCisgKiBQaXRjaCBwb3N0ZmlsdGVyIHBhcmFtZXRlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgaW5kZXg7ICAgIC8vLzwgcG9zdGZpbHRlciBiYWNrd2FyZC9mb3J3YXJkIGxhZworICAgIGludDE2X3Qgb3B0X2dhaW47IC8vLzwgb3B0aW1hbCBnYWluCisgICAgaW50MTZfdCBzY19nYWluOyAgLy8vPCBzY2FsaW5nIGdhaW4KK30gUFBGUGFyYW07CisKKy8qKgorICogSGFybW9uaWMgZmlsdGVyIHBhcmFtZXRlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBpbmRleDsKKyAgICBpbnQgZ2FpbjsKK30gSEZQYXJhbTsKKworLyoqCisgKiBPcHRpbWl6ZWQgZml4ZWQgY29kZWJvb2sgZXhjaXRhdGlvbiBwYXJhbWV0ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgbWluX2VycjsKKyAgICBpbnQgYW1wX2luZGV4OworICAgIGludCBncmlkX2luZGV4OworICAgIGludCBkaXJhY190cmFpbjsKKyAgICBpbnQgcHVsc2VfcG9zW1BVTFNFX01BWF07CisgICAgaW50IHB1bHNlX3NpZ25bUFVMU0VfTUFYXTsKK30gRkNCUGFyYW07CisKKy8qKgorICogUG9zdGZpbHRlciBnYWluIHdlaWdodGluZyBmYWN0b3JzIHNjYWxlZCBieSAyXjE1CisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IHBwZl9nYWluX3dlaWdodFsyXSA9IHsweDE4MDAsIDB4MjAwMH07CisKKy8qKgorICogTFNQIERDIGNvbXBvbmVudAorICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBkY19sc3BbTFBDX09SREVSXSA9IHsKKyAgICAweDBjM2IsCisgICAgMHgxMjcxLAorICAgIDB4MWUwYSwKKyAgICAweDJhMzYsCisgICAgMHgzNjMwLAorICAgIDB4NDA2ZiwKKyAgICAweDRkMjgsCisgICAgMHg1NmY0LAorICAgIDB4NjM4YywKKyAgICAweDZjNDYKK307CisKKy8qKgorICogQ29zaW5lIHRhYmxlIHNjYWxlZCBieSAyXjE0CisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGNvc190YWJbQ09TX1RCTF9TSVpFKzFdID0geworICAgIDE2Mzg0LCAgMTYzODMsICAxNjM3OSwgIDE2MzczLCAgMTYzNjQsICAxNjM1MywgIDE2MzQwLCAgMTYzMjQsCisgICAgMTYzMDUsICAxNjI4NCwgIDE2MjYxLCAgMTYyMzUsICAxNjIwNywgIDE2MTc2LCAgMTYxNDMsICAxNjEwNywKKyAgICAxNjA2OSwgIDE2MDI5LCAgMTU5ODYsICAxNTk0MSwgIDE1ODkzLCAgMTU4NDMsICAxNTc5MSwgIDE1NzM2LAorICAgIDE1Njc5LCAgMTU2MTksICAxNTU1NywgIDE1NDkzLCAgMTU0MjYsICAxNTM1NywgIDE1Mjg2LCAgMTUyMTMsCisgICAgMTUxMzcsICAxNTA1OSwgIDE0OTc4LCAgMTQ4OTYsICAxNDgxMSwgIDE0NzI0LCAgMTQ2MzUsICAxNDU0MywKKyAgICAxNDQ0OSwgIDE0MzU0LCAgMTQyNTYsICAxNDE1NSwgIDE0MDUzLCAgMTM5NDksICAxMzg0MiwgIDEzNzMzLAorICAgIDEzNjIzLCAgMTM1MTAsICAxMzM5NSwgIDEzMjc5LCAgMTMxNjAsICAxMzAzOSwgIDEyOTE2LCAgMTI3OTIsCisgICAgMTI2NjUsICAxMjUzNywgIDEyNDA2LCAgMTIyNzQsICAxMjE0MCwgIDEyMDA0LCAgMTE4NjYsICAxMTcyNywKKyAgICAxMTU4NSwgIDExNDQyLCAgMTEyOTcsICAxMTE1MSwgIDExMDAzLCAgMTA4NTMsICAxMDcwMiwgIDEwNTQ5LAorICAgIDEwMzk0LCAgMTAyMzgsICAxMDA4MCwgICA5OTIxLCAgIDk3NjAsICAgOTU5OCwgICA5NDM0LCAgIDkyNjksCisgICAgIDkxMDIsICAgODkzNSwgICA4NzY1LCAgIDg1OTUsICAgODQyMywgICA4MjUwLCAgIDgwNzYsICAgNzkwMCwKKyAgICAgNzcyMywgICA3NTQ1LCAgIDczNjYsICAgNzE4NiwgICA3MDA1LCAgIDY4MjMsICAgNjYzOSwgICA2NDU1LAorICAgICA2MjcwLCAgIDYwODQsICAgNTg5NywgICA1NzA4LCAgIDU1MjAsICAgNTMzMCwgICA1MTM5LCAgIDQ5NDgsCisgICAgIDQ3NTYsICAgNDU2MywgICA0MzcwLCAgIDQxNzYsICAgMzk4MSwgICAzNzg2LCAgIDM1OTAsICAgMzM5MywKKyAgICAgMzE5NiwgICAyOTk5LCAgIDI4MDEsICAgMjYwMywgICAyNDA0LCAgIDIyMDUsICAgMjAwNiwgICAxODA2LAorICAgICAxNjA2LCAgIDE0MDYsICAgMTIwNSwgICAxMDA1LCAgICA4MDQsICAgIDYwMywgICAgNDAyLCAgICAyMDEsCisgICAgICAgIDAsICAgLTIwMSwgICAtNDAyLCAgIC02MDMsICAgLTgwNCwgIC0xMDA1LCAgLTEyMDUsICAtMTQwNiwKKyAgICAtMTYwNiwgIC0xODA2LCAgLTIwMDYsICAtMjIwNSwgIC0yNDA0LCAgLTI2MDMsICAtMjgwMSwgIC0yOTk5LAorICAgIC0zMTk2LCAgLTMzOTMsICAtMzU5MCwgIC0zNzg2LCAgLTM5ODEsICAtNDE3NiwgIC00MzcwLCAgLTQ1NjMsCisgICAgLTQ3NTYsICAtNDk0OCwgIC01MTM5LCAgLTUzMzAsICAtNTUyMCwgIC01NzA4LCAgLTU4OTcsICAtNjA4NCwKKyAgICAtNjI3MCwgIC02NDU1LCAgLTY2MzksICAtNjgyMywgIC03MDA1LCAgLTcxODYsICAtNzM2NiwgIC03NTQ1LAorICAgIC03NzIzLCAgLTc5MDAsICAtODA3NiwgIC04MjUwLCAgLTg0MjMsICAtODU5NSwgIC04NzY1LCAgLTg5MzUsCisgICAgLTkxMDIsICAtOTI2OSwgIC05NDM0LCAgLTk1OTgsICAtOTc2MCwgIC05OTIxLCAtMTAwODAsIC0xMDIzOCwKKyAgIC0xMDM5NCwgLTEwNTQ5LCAtMTA3MDIsIC0xMDg1MywgLTExMDAzLCAtMTExNTEsIC0xMTI5NywgLTExNDQyLAorICAgLTExNTg1LCAtMTE3MjcsIC0xMTg2NiwgLTEyMDA0LCAtMTIxNDAsIC0xMjI3NCwgLTEyNDA2LCAtMTI1MzcsCisgICAtMTI2NjUsIC0xMjc5MiwgLTEyOTE2LCAtMTMwMzksIC0xMzE2MCwgLTEzMjc5LCAtMTMzOTUsIC0xMzUxMCwKKyAgIC0xMzYyMywgLTEzNzMzLCAtMTM4NDIsIC0xMzk0OSwgLTE0MDUzLCAtMTQxNTUsIC0xNDI1NiwgLTE0MzU0LAorICAgLTE0NDQ5LCAtMTQ1NDMsIC0xNDYzNSwgLTE0NzI0LCAtMTQ4MTEsIC0xNDg5NiwgLTE0OTc4LCAtMTUwNTksCisgICAtMTUxMzcsIC0xNTIxMywgLTE1Mjg2LCAtMTUzNTcsIC0xNTQyNiwgLTE1NDkzLCAtMTU1NTcsIC0xNTYxOSwKKyAgIC0xNTY3OSwgLTE1NzM2LCAtMTU3OTEsIC0xNTg0MywgLTE1ODkzLCAtMTU5NDEsIC0xNTk4NiwgLTE2MDI5LAorICAgLTE2MDY5LCAtMTYxMDcsIC0xNjE0MywgLTE2MTc2LCAtMTYyMDcsIC0xNjIzNSwgLTE2MjYxLCAtMTYyODQsCisgICAtMTYzMDUsIC0xNjMyNCwgLTE2MzQwLCAtMTYzNTMsIC0xNjM2NCwgLTE2MzczLCAtMTYzNzksIC0xNjM4MywKKyAgIC0xNjM4NCwgLTE2MzgzLCAtMTYzNzksIC0xNjM3MywgLTE2MzY0LCAtMTYzNTMsIC0xNjM0MCwgLTE2MzI0LAorICAgLTE2MzA1LCAtMTYyODQsIC0xNjI2MSwgLTE2MjM1LCAtMTYyMDcsIC0xNjE3NiwgLTE2MTQzLCAtMTYxMDcsCisgICAtMTYwNjksIC0xNjAyOSwgLTE1OTg2LCAtMTU5NDEsIC0xNTg5MywgLTE1ODQzLCAtMTU3OTEsIC0xNTczNiwKKyAgIC0xNTY3OSwgLTE1NjE5LCAtMTU1NTcsIC0xNTQ5MywgLTE1NDI2LCAtMTUzNTcsIC0xNTI4NiwgLTE1MjEzLAorICAgLTE1MTM3LCAtMTUwNTksIC0xNDk3OCwgLTE0ODk2LCAtMTQ4MTEsIC0xNDcyNCwgLTE0NjM1LCAtMTQ1NDMsCisgICAtMTQ0NDksIC0xNDM1NCwgLTE0MjU2LCAtMTQxNTUsIC0xNDA1MywgLTEzOTQ5LCAtMTM4NDIsIC0xMzczMywKKyAgIC0xMzYyMywgLTEzNTEwLCAtMTMzOTUsIC0xMzI3OSwgLTEzMTYwLCAtMTMwMzksIC0xMjkxNiwgLTEyNzkyLAorICAgLTEyNjY1LCAtMTI1MzcsIC0xMjQwNiwgLTEyMjc0LCAtMTIxNDAsIC0xMjAwNCwgLTExODY2LCAtMTE3MjcsCisgICAtMTE1ODUsIC0xMTQ0MiwgLTExMjk3LCAtMTExNTEsIC0xMTAwMywgLTEwODUzLCAtMTA3MDIsIC0xMDU0OSwKKyAgIC0xMDM5NCwgLTEwMjM4LCAtMTAwODAsICAtOTkyMSwgIC05NzYwLCAgLTk1OTgsICAtOTQzNCwgIC05MjY5LAorICAgIC05MTAyLCAgLTg5MzUsICAtODc2NSwgIC04NTk1LCAgLTg0MjMsICAtODI1MCwgIC04MDc2LCAgLTc5MDAsCisgICAgLTc3MjMsICAtNzU0NSwgIC03MzY2LCAgLTcxODYsICAtNzAwNSwgIC02ODIzLCAgLTY2MzksICAtNjQ1NSwKKyAgICAtNjI3MCwgIC02MDg0LCAgLTU4OTcsICAtNTcwOCwgIC01NTIwLCAgLTUzMzAsICAtNTEzOSwgIC00OTQ4LAorICAgIC00NzU2LCAgLTQ1NjMsICAtNDM3MCwgIC00MTc2LCAgLTM5ODEsICAtMzc4NiwgIC0zNTkwLCAgLTMzOTMsCisgICAgLTMxOTYsICAtMjk5OSwgIC0yODAxLCAgLTI2MDMsICAtMjQwNCwgIC0yMjA1LCAgLTIwMDYsICAtMTgwNiwKKyAgICAtMTYwNiwgIC0xNDA2LCAgLTEyMDUsICAtMTAwNSwgICAtODA0LCAgIC02MDMsICAgLTQwMiwgICAtMjAxLAorICAgICAgICAwLCAgICAyMDEsICAgIDQwMiwgICAgNjAzLCAgICA4MDQsICAgMTAwNSwgICAxMjA1LCAgIDE0MDYsCisgICAgIDE2MDYsICAgMTgwNiwgICAyMDA2LCAgIDIyMDUsICAgMjQwNCwgICAyNjAzLCAgIDI4MDEsICAgMjk5OSwKKyAgICAgMzE5NiwgICAzMzkzLCAgIDM1OTAsICAgMzc4NiwgICAzOTgxLCAgIDQxNzYsICAgNDM3MCwgICA0NTYzLAorICAgICA0NzU2LCAgIDQ5NDgsICAgNTEzOSwgICA1MzMwLCAgIDU1MjAsICAgNTcwOCwgICA1ODk3LCAgIDYwODQsCisgICAgIDYyNzAsICAgNjQ1NSwgICA2NjM5LCAgIDY4MjMsICAgNzAwNSwgICA3MTg2LCAgIDczNjYsICAgNzU0NSwKKyAgICAgNzcyMywgICA3OTAwLCAgIDgwNzYsICAgODI1MCwgICA4NDIzLCAgIDg1OTUsICAgODc2NSwgICA4OTM1LAorICAgICA5MTAyLCAgIDkyNjksICAgOTQzNCwgICA5NTk4LCAgIDk3NjAsICAgOTkyMSwgIDEwMDgwLCAgMTAyMzgsCisgICAgMTAzOTQsICAxMDU0OSwgIDEwNzAyLCAgMTA4NTMsICAxMTAwMywgIDExMTUxLCAgMTEyOTcsICAxMTQ0MiwKKyAgICAxMTU4NSwgIDExNzI3LCAgMTE4NjYsICAxMjAwNCwgIDEyMTQwLCAgMTIyNzQsICAxMjQwNiwgIDEyNTM3LAorICAgIDEyNjY1LCAgMTI3OTIsICAxMjkxNiwgIDEzMDM5LCAgMTMxNjAsICAxMzI3OSwgIDEzMzk1LCAgMTM1MTAsCisgICAgMTM2MjMsICAxMzczMywgIDEzODQyLCAgMTM5NDksICAxNDA1MywgIDE0MTU1LCAgMTQyNTYsICAxNDM1NCwKKyAgICAxNDQ0OSwgIDE0NTQzLCAgMTQ2MzUsICAxNDcyNCwgIDE0ODExLCAgMTQ4OTYsICAxNDk3OCwgIDE1MDU5LAorICAgIDE1MTM3LCAgMTUyMTMsICAxNTI4NiwgIDE1MzU3LCAgMTU0MjYsICAxNTQ5MywgIDE1NTU3LCAgMTU2MTksCisgICAgMTU2NzksICAxNTczNiwgIDE1NzkxLCAgMTU4NDMsICAxNTg5MywgIDE1OTQxLCAgMTU5ODYsICAxNjAyOSwKKyAgICAxNjA2OSwgIDE2MTA3LCAgMTYxNDMsICAxNjE3NiwgIDE2MjA3LCAgMTYyMzUsICAxNjI2MSwgIDE2Mjg0LAorICAgIDE2MzA1LCAgMTYzMjQsICAxNjM0MCwgIDE2MzUzLCAgMTYzNjQsICAxNjM3MywgIDE2Mzc5LCAgMTYzODMsCisgICAgMTYzODQKK307CisKKy8qKgorICogIExTUCBWUSB0YWJsZXMKKyAqLworc3RhdGljIGNvbnN0IGludDE2X3QgbHNwX2JhbmQwW0xTUF9DQl9TSVpFXVszXSA9IHsKKyAgICB7ICAgIDAsICAgICAgMCwgICAgICAwfSwgeyAtMjcwLCAgLTEzNzIsICAtMTAzMn0sIHsgLTU0MSwgIC0xNjUwLCAgLTEzODJ9LAorICAgIHsgLTcyMywgIC0yMDExLCAgLTIyMTN9LCB7IC05NDEsICAtMTEyMiwgIC0xOTQyfSwgeyAtNzgwLCAgLTExNDUsICAtMjQ1NH0sCisgICAgeyAtODg0LCAgLTEzMDksICAtMTM3M30sIHstMTA1MSwgIC0xNTIzLCAgLTE3NjZ9LCB7LTEwODMsICAtMTYyMiwgIC0yMzAwfSwKKyAgICB7IC03NzcsICAtMTM3NywgIC0yMTQ3fSwgeyAtOTM1LCAgLTE0NjcsICAtMjc2M30sIHsgLTgwMiwgIC0xMzI3LCAgLTM0NzF9LAorICAgIHsgLTkzNSwgIC0xOTU5LCAgLTM5OTl9LCB7IC0yNDAsICAgIC04OSwgICAgMjIyfSwgeyAtNjYxLCAgIC0yNTcsICAgLTE2MH0sCisgICAgeyAtOTk0LCAgIC00NjYsICAgLTQxOX0sIHsgLTE4OCwgICAtMTY0LCAgIC0yNzh9LCB7IC0zNDIsICAgLTUxMiwgICAtNDE1fSwKKyAgICB7IC02MDcsICAgLTUxMSwgICAtNzk3fSwgeyAgIDE2LCAgICAgMTksICAgLTcxNn0sIHsgIDM3NCwgICAgNDI1LCAgIC05NzJ9LAorICAgIHsgLTM0NiwgICAgMjQ1LCAgIC0yODJ9LCB7IC0yNjUsICAgIDUwNiwgICAtNzU0fSwgeyAtNjIwLCAgIC0xNDcsICAgMTk1NX0sCisgICAgeyAtNzQyLCAgIC04NjAsICAgMjU5N30sIHsgLTE1MCwgICAtMzUyLCAgIDI3MDR9LCB7ICAzMDUsICAgIDg4MCwgICAxOTU0fSwKKyAgICB7ICAxMjMsICAgIDczMSwgICAyNzY2fSwgeyAtMzQ4LCAgICA3NjUsICAgMzMyN30sIHsgIDYxOCwgICAgMjIxLCAgIDMyNTh9LAorICAgIHsgLTE3OCwgICAgLTQ3LCAgIDQyMTl9LCB7ICAzOTMsICAgMTMwNCwgICAzODQyfSwgeyAgNjk4LCAgIDE3MDIsICAgNDgwMX0sCisgICAgeyAgIDYzLCAgIC01ODQsICAgMTIyOX0sIHsgLTIxNSwgICAtNzMyLCAgIDE3MDR9LCB7ICAxNzIsICAgLTMzNSwgICAxOTA5fSwKKyAgICB7ICAgLTIsICAgIDIxNiwgICAxNzk3fSwgeyAgMzUzLCAgICAxMjcsICAgMjIwNX0sIHstMTIwOCwgICAgMTg4LCAgICAgMTF9LAorICAgIHsgLTUxMywgICAgLTc1LCAgIC02ODN9LCB7IC05NzMsICAgIDIyMiwgICAtNjQ2fSwgeyAtNjE2LCAgIC04NDMsICAgLTM4OH0sCisgICAgeyAtOTUwLCAgLTExMTMsICAgLTM1OX0sIHstMTQzMSwgICAtNjIzLCAgIC03MDV9LCB7LTEzOTgsICAtMTA2MywgICAtMTc4fSwKKyAgICB7ICAtNDUsICAgLTQ2MSwgICAgIDM1fSwgeyAgIC05LCAgIC02NTcsICAgLTIxNn0sIHsgIDEyNywgIC0xMDc4LCAgICAgOTV9LAorICAgIHsgLTk1MCwgIC0xMTU2LCAgICA1ODR9LCB7LTE0ODAsICAtMTQ5NCwgICAgNDQ5fSwgeyAtMTIwLCAgIC03MDUsICAgIDUxNn0sCisgICAgeyAtMzY4LCAgIC05NjEsICAgIDcyN30sIHsgLTM3OCwgICAtNTI2LCAgICA5NzN9LCB7IC03OTMsICAgLTYxNCwgICAgNjc2fSwKKyAgICB7IC04MDEsICAgLTc1NSwgICAxMjg3fSwgey0xNDc2LCAgIC0zNDAsICAgMTYzNn0sIHsgLTUwNSwgIC0xMjU0LCAgIDE1NDN9LAorICAgIHstMTI0MywgIC0xNjIyLCAgIDE1MzJ9LCB7IC03NzYsICAtMTQ3NywgICAtNjU1fSwgey0xMTUxLCAgLTEyOTYsICAgLTgyM30sCisgICAgey0xMTUzLCAgLTE2NzIsICAtMTEyNH0sIHstMTI5MSwgIC0yMDAzLCAgLTE3MDJ9LCB7IC02MjIsICAtMTI4MywgICAgIDU3fSwKKyAgICB7IC00NzEsICAtMTYxMSwgICAgNTA5fSwgey0xMDYwLCAgLTE1NzAsICAgLTEzOX0sIHsgLTg3MywgIC0yMTU2LCAgIC01MzZ9LAorICAgIHstMTcxNiwgIC0yMDIxLCAgIC0zNjR9LCB7LTIxNTAsICAtMzIxOCwgIC0xMjkxfSwgey0xMjQ4LCAgLTE5NDUsICAtMjkwNH0sCisgICAgey0xMjE1LCAgLTI2MzMsICAtMjg1NX0sIHsgIDE2NywgICAtMjQ0LCAgICAgODR9LCB7ICAzNDksICAgLTQxMiwgICAtMjE3fSwKKyAgICB7ICAtNDAsICAgLTM1MiwgICAgNjMyfSwgeyAgMjI3LCAgIC01MjksICAgIDQwNX0sIHsgICA2OCwgICAtMzgzLCAgIC00NDN9LAorICAgIHsgIDE2NywgICAtNTU4LCAgIC03MDZ9LCB7IC0yNzUsICAgLTg1NCwgICAgLTE0fSwgeyAtMzUxLCAgLTEwODksICAgLTQ0OX0sCisgICAgeyAgMzQxLCAgICAtNzIsICAgLTI4OX0sIHsgIDYwMywgICAtMTA2LCAgIC00NzR9LCB7ICAzMjIsICAgLTIxOSwgICAtNjQ5fSwKKyAgICB7ICAxNzksICAgLTMxNywgICAtOTk4fSwgeyAgNDUwLCAgIC0yOTEsICAgLTk5Nn0sIHsgIDU1NSwgICAgMTk1LCAgIC01MjV9LAorICAgIHsgIDc4NCwgICAgMjcyLCAgIC04MzF9LCB7IC0xNDgsICAgLTM4NCwgICAtODQ5fSwgeyAgIDgyLCAgIC01MzYsICAtMTM1N30sCisgICAgeyAgMjM4LCAgIC0xNzIsICAtMTM1NH0sIHsgIDQyMiwgICAtMjY4LCAgLTE4NDF9LCB7ICAyOTcsICAgLTczNywgIC0yMDc5fSwKKyAgICB7IC0xMTEsICAgLTgwMSwgICAtNTk4fSwgeyAgICAxLCAgIC02NjgsICAgLTk4NH0sIHsgLTEzMSwgICAtODE4LCAgLTEyOTl9LAorICAgIHsgLTMyOSwgICAtNTIxLCAgLTEzMTB9LCB7IC0xNTEsICAgLTc3OCwgIC0xODM0fSwgeyAgLTkzLCAgIC0zNTIsICAtMTc0Nn0sCisgICAgeyAtNTY4LCAgIC02NDAsICAtMTgyMX0sIHsgLTUwOSwgICAtOTQxLCAgLTIxODN9LCB7ICA0NjQsICAgLTgxNSwgIC0xMjUwfSwKKyAgICB7ICAgNzksICAtMTEzMywgIC0xNTk3fSwgeyAtMTg0LCAgLTEzNTMsICAtMjEyM30sIHsgLTE5NiwgICAtNDEwLCAgLTI0Mjd9LAorICAgIHsgLTE5MiwgICAtODMzLCAgLTI4MTB9LCB7IC0yNTksICAtMTM4MiwgIC0zMDQ1fSwgeyAtMjE3LCAgICAgIDQsICAtMTE2Nn0sCisgICAgeyAtODAwLCAgIC0zMjUsICAtMTIxOX0sIHsgLTM2MywgICAtODMwLCAgIC04OTh9LCB7IC02NjEsICAtMTEzNCwgICAtOTYwfSwKKyAgICB7IC0zODYsICAgLTk4MCwgIC0xNTAxfSwgeyAtNjI3LCAgLTExNTksICAtMTcyMn0sIHsgLTkwMywgICAtODI5LCAgIC04NTV9LAorICAgIHsgLTY4NSwgICAtODI5LCAgLTEzMTN9LCB7LTEwNjUsICAgLTk1OSwgIC0xNDA1fSwgeyAgNDQxLCAgICAgMjUsICAgLTg0N30sCisgICAgeyAgNjU1LCAgICAtMjcsICAtMTE4MX0sIHsgMTE1OSwgICAtMTEwLCAgIC03MDV9LCB7ICA4NTYsICAgIDI1MywgIC0xNjcxfSwKKyAgICB7ICA0MTUsICAgIDQwNCwgICAgIC0xfSwgeyAgMzIyLCAgICA5MDMsICAgLTM5OH0sIHsgIDY3MCwgICAgNDk5LCAgIC0yOTJ9LAorICAgIHsgIDgwMywgICAgNTkxLCAgIC02MTB9LCB7IDExNDQsICAgIDU5MSwgICAtODE0fSwgeyAgNzE3LCAgICAxODMsICAgIDM5M30sCisgICAgeyAgODU3LCAgICAzODEsICAgIDEwNn0sIHsgIDYwOSwgICAgIDYyLCAgICAtMjd9LCB7ICA3OTIsICAgIDE5OCwgICAtMzI1fSwKKyAgICB7ICA3MzUsICAgIDgwNSwgICAgIDg4fSwgeyAxMTQyLCAgICA4MTIsICAgICA3OH0sIHsgMTAyOCwgICAgMzY2LCAgIC0yOTJ9LAorICAgIHsgMTMwOSwgICAgNzQzLCAgIC0yMzd9LCB7IDE2MTUsICAgIDU4OSwgICAgLTc5fSwgeyAxMDEwLCAgICA2MzksICAgLTI0M30sCisgICAgeyAgOTk5LCAgICA5NjQsICAgLTMxMX0sIHsgMTUwMCwgICAxMTM3LCAgIC02MTV9LCB7ICA5ODgsICAgIDM1NywgICAgNjQ2fSwKKyAgICB7IDEyMjcsICAgIDY2NywgICAgNjgzfSwgeyAxMTY0LCAgIDE1NjUsICAgIDg5NH0sIHsgMTM5MiwgICAyMDE1LCAgICA0Nzd9LAorICAgIHsgMTEzOCwgICAgNTMzLCAgICAyNTB9LCB7IDE0MzcsICAgIDg5NiwgICAgMzkxfSwgeyAxNzY1LCAgIDExMTgsICAgICA5OX0sCisgICAgeyAxMTEyLCAgIDEwOTAsICAgIDgwMn0sIHsgMTU5NiwgICAgODQ2LCAgIDExMzR9LCB7ICA5MzcsICAgMTE2MSwgICAgMjc5fSwKKyAgICB7IDE3MTksICAgMTI1NCwgICAgNjgzfSwgeyAxMzM4LCAgIDEwODYsICAgICAzNX0sIHsgMTQxOSwgICAxMzI0LCAgICA0Mjh9LAorICAgIHsgMTQyOCwgICAxNTI0LCAgICAgNDB9LCB7IDIxMDgsICAgMTU5NCwgICAgIDg5fSwgeyAxMDE1LCAgICA1NDQsICAgMTIyMn0sCisgICAgeyAxMTIxLCAgICA5MjUsICAgMTI2M30sIHsgMTAzMCwgICAxMzE4LCAgIDE0ODV9LCB7IDEyOTUsICAgIDc4OSwgICAxODE3fSwKKyAgICB7IDEzMjMsICAgMTI3MiwgICAxOTA5fSwgeyAxNzI0LCAgIDEyMzcsICAgMTgwM30sIHsgMTc5NywgICAxNjg5LCAgICA4NTh9LAorICAgIHsgMjE0OSwgICAxMzY3LCAgIDEzMDF9LCB7IDIzMDIsICAgMTg2NywgICAgNzYxfSwgeyAyODYzLCAgIDIzNTEsICAgMTA1M30sCisgICAgeyAgIDUyLCAgICAxNjMsICAgIC03Nn0sIHsgIDIzMCwgICAgMzA5LCAgIC00OTJ9LCB7ICAtNzEsICAgIDYxOSwgICAgIDM5fSwKKyAgICB7IC0yMTgsICAgIDg1NiwgICAgNDk5fSwgeyAtNjU0LCAgICA3MzYsICAgLTIwN30sIHsgLTUzNSwgICAxMjU5LCAgICAxNTV9LAorICAgIHsgLTQ4MCwgICAxNDc2LCAgICA2NDN9LCB7ICAyNjIsICAgMTA4MSwgICAgMTAyfSwgeyAgMzA5LCAgIDE1OTIsICAgLTE4Mn0sCisgICAgeyAgNjI3LCAgIDE2MjksICAgIDUzNH0sIHsgIDMzNywgICAgNjQzLCAgICA0NTZ9LCB7ICA3NTgsICAgIDY3MCwgICAgNzEzfSwKKyAgICB7ICAyMDIsICAgMTEyNiwgICAgNjU4fSwgeyAgNjEyLCAgIDExMzEsICAgIDY2Nn0sIHsgIDY4NiwgICAxMjIzLCAgIDExMzZ9LAorICAgIHsgLTEzMSwgICAgMzc3LCAgICA1MjV9LCB7ICAgNDIsICAgIDcwOCwgICAgOTA3fSwgeyAgIDg3LCAgIDE0ODgsICAgMTAzNX0sCisgICAgeyAgNDMyLCAgIDIxMTcsICAgIDkwNH0sIHsgIDEzNywgICAgOTgxLCAgIDEzMzJ9LCB7IC00NDcsICAgMTAxNCwgICAxMTM2fSwKKyAgICB7IC04MzksICAgMTc5MywgICAxMjQ2fSwgeyAtNTU5LCAgICAyOTcsICAgIDE5OH0sIHsgLTg1MCwgICAgNjg1LCAgICA0NDZ9LAorICAgIHstMTI3MywgICAgNjMyLCAgICA4MjZ9LCB7IC00MDEsICAgLTU0NCwgICAgMTczfSwgeyAtNzUzLCAgIC03OTMsICAgIDE0NH0sCisgICAgeyAtNDM2LCAgICAgLTksICAgIDc3Mn0sIHsgLTExNSwgICAtMjQzLCAgIDEzMTB9LCB7IC02NzAsICAgLTI2OSwgICAgMzc0fSwKKyAgICB7LTEwMjcsICAgIC0xMywgICAgNjM5fSwgeyAtODg3LCAgICAtODEsICAgMTEzN30sIHstMTI3NywgICAtNDU1LCAgICAxNTh9LAorICAgIHstMTQxMSwgICAtNzIwLCAgICA3MzZ9LCB7ICAxNzIsICAgICA4OCwgICAgNDAzfSwgeyAgMzg2LCAgICAyNTUsICAgIDc1Nn0sCisgICAgeyAtNTAwLCAgICA1MjIsICAgIDkxMH0sIHsgLTk1OCwgICAgNjU5LCAgIDEzODh9LCB7IC0zOTUsICAgIDMwMSwgICAxMzQ0fSwKKyAgICB7IC0zNTYsICAgIDc2OCwgICAxODEzfSwgeyAtNjEzLCAgICA4NDEsICAgMjQxOX0sIHsgIDQ0NSwgICAtMTIyLCAgICAyNTJ9LAorICAgIHsgIDYyOSwgICAgLTg3LCAgICA3MjN9LCB7ICAyODMsICAgLTI1MywgICAgODcwfSwgeyAgNDU2LCAgIC0xMTYsICAgMTM4MX0sCisgICAgeyAgNzU3LCAgICAxODAsICAgMTA1OX0sIHsgIDUzMiwgICAgNDA4LCAgIDE1MDl9LCB7ICA5NDcsICAgIDI4OCwgICAxODA2fSwKKyAgICB7IDEzMjUsICAgIDk5NCwgICAyNTI0fSwgeyAgODkyLCAgIDEyMTksICAgMzAyM30sIHsgMTM5NywgICAxNTk2LCAgIDM0MDZ9LAorICAgIHsgMTE0MywgICAxNTUyLCAgIDI1NDZ9LCB7IDE4NTAsICAgMTQzMywgICAyNzEwfSwgeyAgLTEwLCAgICAxMzQsICAgMTAwMn0sCisgICAgeyAgMTU0LCAgICA0OTksICAgMTMyM30sIHsgIDUwOCwgICAgNzkyLCAgIDExMTd9LCB7ICA1MDksICAgMTM0MCwgICAxNjE2fSwKKyAgICB7ICA3NjIsICAgIDg2MiwgICAxNjA4fSwgeyAgNzg3LCAgICA3NDAsICAgMjMyMH0sIHsgIDc5NCwgICAxNzI3LCAgIDEyODN9LAorICAgIHsgIDQ2NSwgICAyMTA4LCAgIDE2NjB9LCB7IC0xMjAsICAgMTQ1MSwgICAxNjEzfSwgeyAtMzg2LCAgIDIwMTYsICAgMjE2OX0sCisgICAgeyAgODkxLCAgIDEyMjUsICAgMjA1MH0sIHsgIDQ1NiwgICAxNDgwLCAgIDIxODV9LCB7IDE0OTMsICAgMTI4MywgICAxMjA5fSwKKyAgICB7IDEzOTcsICAgMTYzNiwgICAxNTE4fSwgeyAxNzc2LCAgIDE3MzgsICAgMTU1Mn0sIHsgMTU3MiwgICAxNjk4LCAgIDIxNDF9LAorICAgIHsgMTM4OSwgICAyMTI2LCAgIDEyNzF9LCB7IDE5NTksICAgMjQxMywgICAxMTE5fSwgeyAxMzY1LCAgIDI4OTIsICAgMTUwNX0sCisgICAgeyAyMjA2LCAgIDE5NzEsICAgMTYyM30sIHsgMjA3NiwgICAxOTUwLCAgIDIyODB9LCB7IDE3MTcsICAgMjI5MSwgICAxODY3fSwKKyAgICB7IDIzNjYsICAgMjUxNSwgICAxOTUzfSwgeyAyODY1LCAgIDI4MzgsICAgMjUyMn0sIHsgMjUzNSwgICAzNDY1LCAgIDIwMTF9LAorICAgIHsgMzM4MSwgICA0MTI3LCAgIDI2Mzh9LCB7ICA4MzYsICAgMjY2NywgICAyMjg5fSwgeyAxNzYxLCAgIDI3NzMsICAgMjMzN30sCisgICAgeyAxNDE1LCAgIDMzMjUsICAgMjkxMX0sIHsgMjM1NCwgICAzMTM4LCAgIDMxMjZ9LCB7IDI2NTksICAgNDE5MiwgICA0MDEwfSwKKyAgICB7IDEwNDgsICAgMTc4NiwgICAxODE4fSwgeyAxMjQyLCAgIDIxMTEsICAgMjI0MH0sIHsgMTUxMiwgICAyMDc5LCAgIDI3ODB9LAorICAgIHsgMTU3MywgICAyNDkxLCAgIDMxMzh9LCB7IDIyMzAsICAgMjM3NywgICAyNzgyfSwgeyAgNDE2LCAgIDE3NzMsICAgMjcwNH0sCisgICAgeyAgNzI1LCAgIDIzMzYsICAgMzI5N30sIHsgMTI1MiwgICAyMzczLCAgIDM5Nzh9LCB7IDIwOTQsICAgMjI2OCwgICAzNTY4fSwKKyAgICB7IDIwMTEsICAgMjcxMiwgICA0NTI4fSwgeyAxMzQxLCAgIDM1MDcsICAgMzg3Nn0sIHsgMTIxNiwgICAzOTE5LCAgIDQ5MjJ9LAorICAgIHsgMTY5MywgICA0NzkzLCAgIDYwMTJ9Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBsc3BfYmFuZDFbTFNQX0NCX1NJWkVdWzNdID0geworICAgIHsgICAgMCwgICAgICAwLCAgICAgIDB9LCB7LTIxMTQsICAtMTMwMiwgICAgIDc2fSwgey0yNjUyLCAgLTEyNzgsICAtMTM2OH0sCisgICAgey0yODQ3LCAgIC04MjgsICAgLTM0OX0sIHstMzgxMiwgIC0yMTkwLCAgIC0zNDl9LCB7LTM5NDYsICAgLTM2NCwgICAtNDQ5fSwKKyAgICB7LTI3MjUsICAtNDQ5MiwgIC0zNjA3fSwgey0zNDk1LCAgLTQ3NjQsICAtMTc0NH0sIHsgIC01MSwgICAtNzU2LCAgICAgODR9LAorICAgIHsgLTE1MywgIC0xMTkxLCAgICA1MDR9LCB7ICAxMDgsICAtMTQxOCwgICAxMTY3fSwgeyAtODM1LCAgIC04OTYsICAgIDM5MH0sCisgICAgeyAtNTY5LCAgLTE3MDIsICAgICA4N30sIHstMTE1MSwgIC0xODE4LCAgICA5MzN9LCB7LTE4MjYsICAtMjU0NywgICAgNDExfSwKKyAgICB7LTE4NDIsICAtMTgxOCwgICAxNDUxfSwgey0yNDM4LCAgLTE2MTEsICAgIDc4MX0sIHstMjc0NywgIC0yNDc3LCAgIDEzMTF9LAorICAgIHsgLTk0MCwgICAxMjUyLCAgICA0Nzd9LCB7LTE2MjksICAgMTY4OCwgICAgNjAyfSwgey0xMjAyLCAgICA2MTcsICAgIDI4MH0sCisgICAgey0xNzM3LCAgICAzOTMsICAgIDU4MH0sIHstMTUyOCwgICAxMDc3LCAgIDExOTl9LCB7LTIxNjUsICAgLTE2MSwgICAxNDA4fSwKKyAgICB7LTI1MDQsICAtMTA4NywgICAyMzcxfSwgey0zNDU4LCAgIC0xNzUsICAgMTM5NX0sIHstMTM5NywgICAgLTk4LCAgIC04NDN9LAorICAgIHstMjI1MiwgICAtMTc3LCAgLTExNDl9LCB7LTE0ODksICAgLTcyNiwgIC0xMjgzfSwgey0xNTU4LCAgIC0yNjUsICAtMTc0NH0sCisgICAgey0xODY3LCAgIC04MjEsICAtMTg5N30sIHstMjA2MiwgIC0xNTE2LCAgLTIzNDB9LCB7LTI1OTUsICAtMTE0MiwgIC0yODYxfSwKKyAgICB7ICAxNzAsICAgICA0NiwgICAtODE5fSwgeyAtMTkzLCAgIC0yMDQsICAtMTE1MX0sIHsgIDMyNiwgICAtMTk2LCAgLTE1MzJ9LAorICAgIHsgIDc4MCwgICAgMzI5LCAgIC04MTZ9LCB7ICAyMDEsICAgIDM2OSwgIC0xMjQzfSwgeyAgNjUwLCAgIC0yMDksICAtMTA2MH0sCisgICAgeyAxMTQ0LCAgICAtMTUsICAtMTIxNn0sIHsgMTIwMywgICAtMjU5LCAgLTE4Njd9LCB7IC04OTAsICAgLTU2NCwgIC0xNDMwfSwKKyAgICB7IC02MzgsICAgLTg1MiwgIC0xOTIxfSwgeyAgMTc3LCAgIC03MzksICAtMTM1OH0sIHsgLTI2MSwgICAtNTI2LCAgLTE2NjZ9LAorICAgIHsgIDIwNiwgICAtNDA3LCAgLTIyNTV9LCB7ICAzMzgsICAgLTUyNiwgICAtODIyfSwgeyAgNDIxLCAgLTEwOTUsICAtMTAwOX0sCisgICAgeyAgNzY1LCAgIC02MDcsICAtMTQwOH0sIHsgIDgyNSwgIC0xMjk1LCAgLTIwMDR9LCB7ICAzNTcsICAgLTkwNSwgIC0xODE1fSwKKyAgICB7ICAtNTgsICAtMTI0OCwgIC0xNTg4fSwgeyAtNTk2LCAgLTE0MzYsICAtMjA0Nn0sIHsgIC03MywgIC0xMTU5LCAgLTIxMTZ9LAorICAgIHsgLTExNSwgIC0xMzgyLCAgLTI1ODF9LCB7IC0xNjAsICAtMTcyMywgIC0xOTUyfSwgeyAgIC02LCAgLTIxOTYsICAtMjk1NH0sCisgICAgeyAtNjQ5LCAgLTE3MDUsICAtMjYwM30sIHsgLTYxNywgIC0xNDUzLCAgLTMyODJ9LCB7IC05NDksICAtMjAxOSwgIC0zMTAyfSwKKyAgICB7IC04MTIsICAgMTU0NCwgICAxOTM3fSwgey0xODU0LCAgICA1NzQsICAgMjAwMH0sIHstMTQ2MywgICAxMTQwLCAgIDI2NDl9LAorICAgIHstMjY4MywgICAxNzQ4LCAgIDE0NTJ9LCB7LTI0ODYsICAgMjI0MSwgICAyNTIzfSwgeyAgNzgzLCAgIDE5MTAsICAgMTQzNX0sCisgICAgeyAgNTgxLCAgIDI2ODIsICAgMTM3Nn0sIHsgIDIzNiwgICAyMTk3LCAgIDE4ODV9LCB7IC00NTMsICAgMjk0MywgICAyMDU3fSwKKyAgICB7IC02ODIsICAgMjE3OCwgICAyNTY1fSwgey0xMzQyLCAgIDMyMDEsICAgMzMyOH0sIHsgLTI4OCwgICAtMTg0LCAgICAyNjJ9LAorICAgIHsgIDEyMSwgICAtMTQ5LCAgIC0xODN9LCB7ICA3NTgsICAgLTQxMiwgICAgMjA2fSwgeyAxMDM4LCAgIC0yMDQsICAgIDg1M30sCisgICAgeyAxNTc3LCAgIC00NTcsICAgIDcwMH0sIHsgIDkzNywgICAtNjQwLCAgIC01Njd9LCB7IDE1MDgsICAgLTUyOCwgIC0xMDI0fSwKKyAgICB7IC0yMjUsICAgLTUyNywgICAtNDI3fSwgeyAtNTY0LCAgLTEwOTUsICAgLTMzMn0sIHsgLTc0MiwgICAtMzUzLCAgIC0xODZ9LAorICAgIHstMTI4OCwgICAtNDU5LCAgICAgODR9LCB7LTE4NTMsICAgLTQ4NCwgICAtMjc0fSwgey0xNTU0LCAgIC03MzEsICAgIDgyNX0sCisgICAgey0yNDI1LCAgIC0yMzQsICAgIDM4Mn0sIHstMTcyMiwgICAgMjkzLCAgIC0yNzF9LCB7LTI1MTUsICAgIDQyNSwgICAtNTY0fSwKKyAgICB7LTI1OTksICAgIDgxOCwgICAgNDY0fSwgeyAtMzU4LCAgICAxMTgsICAgLTM3NX0sIHsgLTYxMywgICAgMTk4LCAgIC04NzR9LAorICAgIHsgLTY5MCwgICAgNjgzLCAgIC0zMjR9LCB7LTEzNTIsICAgMTE1NSwgICAtMTY4fSwgey0xMDkzLCAgICAxMjksICAgLTMyNH0sCisgICAgey0xMTg0LCAgICA2MTEsICAgLTg1OH0sIHsgIDQzMywgICAgMzg2LCAgIC0zNzJ9LCB7IC0xMjAsICAgIDQ4NiwgICAtNjM0fSwKKyAgICB7ICAyMzQsICAgIDg1MSwgICAtNjMxfSwgeyAgNjAyLCAgICAxMjgsICAgICA0Nn0sIHsgMTA5OSwgICAgNDEwLCAgICAxNTl9LAorICAgIHsgIDcxNSwgICAtMTQ1LCAgIC00MjR9LCB7IDExOTgsICAgIC04NSwgICAtNTkzfSwgeyAxMzkwLCAgICAzNjcsICAgLTM1OH0sCisgICAgeyAxNjgzLCAgICAzNjIsICAgLTk2NH0sIHsgMTcxMSwgICAgNjIyLCAgICAgNDV9LCB7IDIwMzMsICAgIDgzMywgICAtMzgzfSwKKyAgICB7IDI4OTAsICAgIDU0OSwgICAtNTA2fSwgeyAgICA3LCAgICA0MDEsICAgICA1Mn0sIHsgICA3MiwgICAgODExLCAgICA0MTV9LAorICAgIHsgIDU2NiwgICAgNjY4LCAgICAgNDF9LCB7ICA0NjcsICAgMTIxOCwgICAgMTMwfSwgeyAgIDY4LCAgICA5NTcsICAgLTE4N30sCisgICAgeyAgLTI1LCAgIDE2NDksICAgLTEwM30sIHsgLTY2MSwgICAgMjYwLCAgICAyMTR9LCB7IC05MjUsICAgIC05NCwgICAgNjEyfSwKKyAgICB7IC0zMjEsICAgLTQyMiwgICAgOTY1fSwgeyAtNzg4LCAgIC02NzIsICAgMTc4M30sIHsgIDQwMCwgICAtNjczLCAgICA3Nzl9LAorICAgIHsgIDc0MSwgICAtNTk1LCAgIDE2MzV9LCB7IC0xNjEsICAgIDMwNywgICAgNjU3fSwgeyAtMzgyLCAgICA4MzYsICAgIDg3MX0sCisgICAgeyAtODE0LCAgICA0MDAsICAgMTIyM30sIHsgIDM2NCwgICAgNjA2LCAgIDEyNDd9LCB7ICAgNTcsICAgICA3NSwgICAxNTcxfSwKKyAgICB7ICAxNTEsICAgIDQ3MSwgICAyMjg3fSwgeyAgLTgxLCAgIDEwMjEsICAgMTUwMn0sIHsgIDIyNywgICAxNDcwLCAgIDEwOTd9LAorICAgIHsgIDY1OCwgICAxMjc1LCAgIDE2NTN9LCB7ICA2NjQsICAgMTQ3OCwgICAyMzc3fSwgeyAgMjYzLCAgIC0xMjcsICAgIDQ0NH0sCisgICAgeyAgMjY0LCAgICAgODksICAgIDk2OX0sIHsgIDc5NCwgICAgMTcxLCAgICA1NzZ9LCB7ICA4MjEsICAgIDE4NiwgICAxMjI2fSwKKyAgICB7ICA0MDQsICAgIDQ2MiwgICAgNTE3fSwgeyAgMzM5LCAgICA5MTgsICAgIDc5NH0sIHsgMTI4MCwgICAxNDIzLCAgICAxOTZ9LAorICAgIHsgMTQ1MywgICAyMDE5LCAgICAzNjV9LCB7IDE2MTUsICAgMTQ4MSwgICAgNjcyfSwgeyAyMzk0LCAgIDE3MDgsICAgIDUwOH0sCisgICAgeyAgODA2LCAgIDEyMzgsICAgIDU3M30sIHsgIDcxMywgICAxMTU4LCAgIDEwNzh9LCB7IDEyODUsICAgMTQzNiwgICAxMjMyfSwKKyAgICB7IDE3OTAsICAgMTE4OCwgICAxMTQxfSwgeyAgNzY1LCAgICA2NDMsICAgIDg2NH0sIHsgMTAzMiwgICAgNzk3LCAgIDEyNzl9LAorICAgIHsgIDkwMCwgICAgNTYzLCAgIDE4Mjd9LCB7IDE1MTQsICAgIDY3MywgICAyMzEyfSwgeyAxNTQ0LCAgIDExMjksICAgMzI0MH0sCisgICAgeyAxNDY5LCAgIDEwNTAsICAgMTU5NH0sIHsgMTk0NSwgICAxMzE4LCAgIDE5ODh9LCB7IDIzOTcsICAgMjAyNiwgICAyMDYwfSwKKyAgICB7IDM1MzgsICAgMjA1NywgICAyNjIwfSwgeyAxMjQ5LCAgIC0xMTgsICAgICA3NH0sIHsgMTcyNywgICAgMTk0LCAgICA0MjF9LAorICAgIHsgMjA3OCwgICAgLTUwLCAgIC00NjN9LCB7ICA5NzAsICAgIDY4OCwgICAtNDMyfSwgeyAxMTQ5LCAgICA5NTIsICAgLTExMH0sCisgICAgeyAxMjU0LCAgIDEyNzUsICAgLTY1MX0sIHsgMTM4NiwgICAgOTI5LCAgICA0MDF9LCB7IDE5NjAsICAgMTE2NywgICAgMjMyfSwKKyAgICB7ICA0MDcsICAgLTc1MiwgICAtMjQzfSwgeyAgODU5LCAgLTExMTgsICAgIDE3Mn0sIHsgLTIyNywgICAtODYwLCAgIC05OTJ9LAorICAgIHsgLTc5NiwgIC0xMTc1LCAgLTEzODB9LCB7ICAgIDgsICAtMTI4MiwgICAtMzg4fSwgeyAgMzUzLCAgLTE3ODEsICAtMTAzN30sCisgICAgeyAtNzMyLCAgIC0zOTcsICAgLTgwN30sIHsgLTg1MywgICAgLTI4LCAgLTEzNDJ9LCB7LTEyMjksICAtMTIwNywgIC0xOTU5fSwKKyAgICB7LTEwMTUsICAtMTEyNSwgIC0yNTQzfSwgey0xNDUyLCAgLTE3OTEsICAtMjcyNX0sIHstMTg5MSwgIC0yNDE2LCAgLTMyNjl9LAorICAgIHsgLTkxOCwgIC0xNjI5LCAgIC03ODN9LCB7IC01ODAsICAtMjE1NSwgICAtNjk4fSwgey0xMDk3LCAgLTIzNjQsICAgIC05Nn0sCisgICAgey0xMzg3LCAgLTE1MTMsICAgICAgN30sIHstMTU4OCwgIC0yMDc2LCAgIC02NjR9LCB7LTE0NzMsICAtMjc0MCwgICAtNzg0fSwKKyAgICB7LTIzNzgsICAtMzE0OSwgICAgLTU2fSwgey0yODU2LCAgLTIwOTIsICAgLTE2OX0sIHstMzM5MSwgIC0zNzA4LCAgICAzMTZ9LAorICAgIHstMTE3NiwgICAtODkwLCAgIC02MTR9LCB7LTE5NDQsICAtMTA2MSwgICAtODAwfSwgeyAtMjk5LCAgLTE1MTcsICAtMTAwMH0sCisgICAgeyAtNjQwLCAgLTE4NTAsICAtMTUyNn0sIHstMTQ1NCwgIC0xNTM2LCAgLTEyMzN9LCB7LTE4OTAsICAtMTk1NSwgIC0xNzU2fSwKKyAgICB7LTEwODYsICAtMTkyMSwgIC0yMTIyfSwgeyAtNzUwLCAgLTIzMjUsICAtMjI2MH0sIHstMTMyNSwgIC0yNDEzLCAgLTI2NzN9LAorICAgIHstMTExNCwgIC0yNTQyLCAgLTM0NTl9LCB7LTEzNDEsICAtMjkwMSwgIC0zOTYzfSwgey0xMTYwLCAgLTIyMjYsICAtMTM5M30sCisgICAgey0xMDAxLCAgLTI3NzIsICAtMTU3M30sIHstMTU5NCwgIC0yNjQxLCAgLTE5Nzh9LCB7LTE1MzQsICAtMzA0NiwgIC0yNjI0fSwKKyAgICB7LTIyMjQsICAtMjE5NiwgICAtNjc1fSwgey0yODA3LCAgLTMwNTQsICAtMTEwMn0sIHstMjAwOCwgIC0yODQwLCAgLTExODZ9LAorICAgIHstMTk4MCwgIC0zMzMyLCAgLTE2OTV9LCB7LTE3MTUsICAtMzU2MiwgICAtNTA1fSwgey0yNTI3LCAgLTQwMDAsICAtMTg4N30sCisgICAgey0yMzMzLCAgLTI3MzQsICAtMjI5Nn0sIHstMzQ0MCwgIC0yNDAxLCAgLTMyMTF9LCB7LTIwMDgsICAtMzUyOCwgIC0zMzM3fSwKKyAgICB7LTIyNDcsICAtMzI5MSwgIC00NTEwfSwgeyAtNDc1LCAgICA5NDksICAgIDE1NX0sIHsgLTE0OSwgICAxMzY1LCAgICA1NDV9LAorICAgIHsgLTc1NywgICAxNjQ0LCAgIDEwODN9LCB7IC0yMTcsICAgMjA1MywgICAxMzUzfSwgey0xNDMzLCAgIDIzMDEsICAgMTQ2Mn0sCisgICAgeyAgNDk1LCAgIDE2NjEsICAgIDUyOX0sIHsgICAxMCwgICAyMDM3LCAgICA3NDB9LCB7IDIwODIsICAgMTg5OCwgICAgOTc4fSwKKyAgICB7IDI4MzEsICAgMjI5NCwgICAgOTExfSwgeyAgODQyLCAgICA3OTMsICAgIDQyMH0sIHsgMTIyMywgICAxMDIzLCAgICA4NjN9LAorICAgIHsgMTIzNywgICAgNDUxLCAgICA3ODB9LCB7IDE3NDQsICAgIDcwOCwgICAgODIyfSwgeyAxNTMzLCAgICAyODQsICAgMTM4NH0sCisgICAgeyAyMTM1LCAgICA2MDksICAgMTUzOH0sIHsgMjMwNSwgICAgNjI2LCAgICA1NDB9LCB7IDIzNjgsICAgMTE4NywgICAgOTU1fSwKKyAgICB7IDI1ODYsICAgMTI1NSwgICAgIC03fSwgeyAzMTE2LCAgIDExMzEsICAgIDcyNn0sIHsgMzQzMSwgICAxNzMwLCAgICA0Mjh9LAorICAgIHsgMjczNCwgICAxNjQ4LCAgIDEzMDd9LCB7IDI5ODgsICAgMTIzMSwgICAyMDEwfSwgeyAzNTIzLCAgIDIwMjQsICAgMTQ4OH0sCisgICAgeyAxMDM0LCAgIDE2NTcsICAgIDg3MX0sIHsgMTIwNiwgICAyMTYzLCAgIDEwMzZ9LCB7IDE4MDcsICAgMjM3MiwgICAxMjMzfSwKKyAgICB7IDE4MDgsICAgMTc2OSwgICAxNDkzfSwgeyAxNTczLCAgIDIzMzIsICAgMTc3OX0sIHsgMTIxNiwgICAxNjA5LCAgIDE4NjZ9LAorICAgIHsgMTQ4MCwgICAxODk4LCAgIDI1MTN9LCB7ICA0NjUsICAgMjcwOCwgICAyNzc2fSwgeyAgNzcxLCAgIDM2MzgsICAgMzMzOH0sCisgICAgeyAxODY5LCAgIDI1OTksICAgMjYyM30sIHsgMjgyNSwgICAyNzQ1LCAgIDI0Njh9LCB7IDI2MzgsICAgMjQzOSwgICAxNTg1fSwKKyAgICB7IDIwOTQsICAgMjk3MCwgICAxMzA4fSwgeyAyMDIyLCAgIDMwNTcsICAgMTk5OX0sIHsgMzQyOCwgICAyOTEyLCAgIDE4MTZ9LAorICAgIHsgNDUzNiwgICAyOTc0LCAgIDIxMjl9LCB7IDEwNDYsICAgMjU2MywgICAyMDg2fSwgeyAxMzYzLCAgIDM1NjIsICAgMjMxOH0sCisgICAgeyAyNTExLCAgIDE4OTEsICAgMjk4NH0sIHsgMTg2NiwgICAyMzA2LCAgIDM5ODZ9LCB7IDMyNzIsICAgMjkyNCwgICAzNjgyfSwKKyAgICB7IDMxNDYsICAgMzU2NCwgICAyMjcyfSwgeyAzNTkyLCAgIDM5NjgsICAgMjgyMn0sIHsgMjQzMSwgICAzMzY5LCAgIDMwNjl9LAorICAgIHsgMTkzMSwgICA0NzA5LCAgIDMwOTB9LCB7IDI2MjksICAgNDIyMCwgICAzOTg2fSwgeyA0NjM5LCAgIDQwNTYsICAgMzY2NH0sCisgICAgeyA0MDM1LCAgIDUzMzQsICAgNDkxMn0KK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGxzcF9iYW5kMltMU1BfQ0JfU0laRV1bNF0gPSB7CisgICAgeyAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwgeyAgNjAxLCAgICA1MTIsICAgLTU0MiwgICAgMzM0fSwKKyAgICB7ICA0MjgsICAgMTA4NywgICAtNDg0LCAgIC0xMzJ9LCB7ICA2NTIsICAgIDYyMiwgICAtMzkxLCAgIC01NzJ9LAorICAgIHsgIDM3OCwgICAgNzk5LCAgICAxNDEsICAgLTg2MH0sIHsgMTA0MCwgICAgNDA5LCAgICAxMTIsICAgLTU1NH0sCisgICAgeyAxMTIzLCAgICA2NzAsICAgIC03NSwgICAtODQ3fSwgeyAxNDIxLCAgICA0OTQsICAgLTMxNSwgIC0xMDk1fSwKKyAgICB7ICA3ODcsICAgMTAwMSwgICAgMTE0LCAgIC00NjB9LCB7ICA5ODgsICAgMTY3MiwgICAgMjE2LCAgIC02ODF9LAorICAgIHsgMTAwNywgICAxMjQxLCAgIC0xMzIsICAtMTI0N30sIHsgMTA3MywgICAgMzk5LCAgICAxODYsICAgICAtNX0sCisgICAgeyAxMjYyLCAgICAxOTMsICAgLTY5NCwgICAtMTI5fSwgeyAgMzI1LCAgICAxOTYsICAgICA1MSwgICAtNjQxfSwKKyAgICB7ICA4NjEsICAgIC01OSwgICAgMzUwLCAgIC00NTh9LCB7IDEyNjEsICAgIDU2NywgICAgNTg2LCAgIC0zNDZ9LAorICAgIHsgMTUzMiwgICAgODg1LCAgICAyMTAsICAgLTUxN30sIHsgMjAyNywgICAgOTM3LCAgICAxMTMsICAgLTc5Mn0sCisgICAgeyAxMzgzLCAgIDEwNjQsICAgIDMzNCwgICAgIDM4fSwgeyAxOTY0LCAgIDE0NjgsICAgIDQ1OSwgICAgMTMzfSwKKyAgICB7IDIwNjIsICAgMTE4NiwgICAgLTk4LCAgIC0xMjF9LCB7IDI1NzcsICAgMTQ0NSwgICAgNTA2LCAgIC0zNzN9LAorICAgIHsgMjMxMCwgICAxNjgyLCAgICAgLTIsICAgLTk2MH0sIHsgMjg3NiwgICAxOTM5LCAgICA3NjUsICAgIDEzOH0sCisgICAgeyAzNTgxLCAgIDIzNjAsICAgIDY0OSwgICAtNDE0fSwgeyAgMjE5LCAgICAxNzYsICAgLTM5OCwgICAtMzA5fSwKKyAgICB7ICA0MzQsICAgIC03OCwgICAtNDM1LCAgIC04ODB9LCB7IC0zNDQsICAgIDMwMSwgICAgMjY1LCAgIC01NTJ9LAorICAgIHsgLTkxNSwgICAgNDcwLCAgICA2NTcsICAgLTM4MH0sIHsgIDQxOSwgICAtNDMyLCAgIC0xNjMsICAgLTQ1M30sCisgICAgeyAgMzUxLCAgIC05NTMsICAgICAgOCwgICAtNTYyfSwgeyAgNzg5LCAgICAtNDMsICAgICAyMCwgICAtOTU4fSwKKyAgICB7ICAzMDIsICAgLTU5NCwgICAtMzUyLCAgLTExNTl9LCB7IDEwNDAsICAgIDEwOCwgICAtNjY4LCAgIC05MjR9LAorICAgIHsgMTMzMywgICAgMjEwLCAgLTEyMTcsICAtMTY2M30sIHsgIDQ4MywgICAgNTg5LCAgIC0zNTAsICAtMTE0MH0sCisgICAgeyAxMDAzLCAgICA4MjQsICAgLTgwMiwgIC0xMTg0fSwgeyAgNzQ1LCAgICAgNTgsICAgLTU4OSwgIC0xNDQzfSwKKyAgICB7ICAzNDYsICAgIDI0NywgICAtOTE1LCAgLTE2ODN9LCB7ICAyNzAsICAgIDc5NiwgICAtNzIwLCAgLTIwNDN9LAorICAgIHsgMTIwOCwgICAgNzIyLCAgIC0yMjIsICAgLTE5M30sIHsgMTQ4NiwgICAxMTgwLCAgIC00MTIsICAgLTY3Mn0sCisgICAgeyAxNzIyLCAgICAxNzksICAgIC02OSwgICAtNTIxfSwgeyAyMDQ3LCAgICA4NjAsICAgLTY2NiwgIC0xNDEwfSwKKyAgICB7IC0xNDYsICAgIDIyMiwgICAtMjgxLCAgIC04MDV9LCB7IC0xODksICAgICA5MCwgICAtMTE0LCAgLTEzMDd9LAorICAgIHsgLTE1MiwgICAxMDg2LCAgIC0yNDEsICAgLTc2NH0sIHsgLTQzOSwgICAgNzMzLCAgIC02MDEsICAtMTMwMn0sCisgICAgeyAtODMzLCAgIC0xNjcsICAgLTM1MSwgICAtNjAxfSwgeyAtODU2LCAgIC00MjIsICAgLTQxMSwgIC0xMDU5fSwKKyAgICB7IC03NDcsICAgLTM1NSwgICAtNTgyLCAgLTE2NDR9LCB7IC04MzcsICAgIDIxMCwgICAtOTE2LCAgLTExNDR9LAorICAgIHstMTgwMCwgICAgIDMyLCAgIC04NzgsICAtMTY4N30sIHsgIC00OCwgICAgLTIzLCAgLTExNDYsICAgICA1Mn0sCisgICAgeyAtMzUwLCAgIC00MDksICAtMTY1NiwgICAtMzY0fSwgeyAgMjY1LCAgIC03MjgsICAgLTg1OCwgICAtNTc3fSwKKyAgICB7ICA0NTgsICAgLTI0NywgIC0xMTQxLCAgIC05OTd9LCB7ICA2OTEsICAgLTQwNywgIC0xOTg4LCAgLTExNjF9LAorICAgIHsgIC02NiwgICAtMTA0LCAgIC03MDUsICAtMTI0OX0sIHsgLTQzMSwgICAgLTkzLCAgLTExOTEsICAtMTg0NH0sCisgICAgeyAgMjAzLCAgIC03MzIsICAtMTAwMCwgIC0xNjkzfSwgeyAgIDEwLCAgIC04MzIsICAtMTg0NiwgIC0xODE5fSwKKyAgICB7ICA0OTMsICAgLTEyOCwgIC0xNDM2LCAgLTE3Njh9LCB7ICA0ODgsICAgLTMxMSwgIC0xNzMwLCAgLTI1NDB9LAorICAgIHsgLTY1MywgICAtNTMyLCAgLTExNTAsICAtMTE3Mn0sIHstMTA4NiwgICAtMjg5LCAgLTE3MDYsICAtMTUzM30sCisgICAgeyAtNjk5LCAgLTEyMDUsICAtMTIxNiwgIC0xNzY2fSwgey0xMDMyLCAgLTE0ODEsICAtMjA3NCwgIC0xNTIzfSwKKyAgICB7IC03MjEsICAtMTIyMCwgIC0yMjc3LCAgLTI2MDB9LCB7ICAgMTIsICAgLTUzOSwgIC0xNDg0LCAgLTExMzF9LAorICAgIHsgIC00MCwgICAtOTExLCAgLTIxMDYsICAgLTQ0MX0sIHsgLTQ3MSwgICAtNDg0LCAgLTIyNjcsICAtMTU0OX0sCisgICAgeyAtMTQxLCAgIC05ODgsICAtMzAwNiwgIC0xNzIxfSwgey0xNTQ1LCAgLTIxMDIsICAgLTU4MywgICAgMzQyfSwKKyAgICB7LTEzODMsICAtMjc3MiwgICAtMzg2LCAgICAtMTN9LCB7LTIxMTgsICAtMjU4OSwgIC0xMjA1LCAgICAgNzJ9LAorICAgIHstMjE0NywgIC0zMjMxLCAgIC05NjUsICAgIDM5MH0sIHstMjk0OSwgIC0zMzAwLCAgIC02MjEsICAgIDYzN30sCisgICAgey0zOTA3LCAgLTQxMzgsICAgLTg2NSwgICAgODAzfSwgey0xMjg3LCAgIC04NDUsICAgLTM3NSwgICAtNTQ4fSwKKyAgICB7LTE0MTYsICAtMTE2OSwgICAtNDg3LCAgLTEyNzd9LCB7LTE0MDAsICAtMTY5MCwgIC0xMDI3LCAgIC00MTh9LAorICAgIHstMjAxOCwgIC0xOTA5LCAgLTExODgsICAtMTI2MH0sIHstMTQxOCwgIC0yMjIyLCAgLTIwMjksICAgLTEyOH0sCisgICAgey0yMDY3LCAgLTI5OTgsICAtMjY5MywgICAtMzEwfSwgeyAtOTUwLCAgLTEwMjgsICAtMTUzOCwgICAgMTg1fSwKKyAgICB7LTE2MTYsICAgLTkxNSwgIC0yMjA1LCAgIC01NDl9LCB7ICAgMTksICAgLTgyMSwgIC0xMTQ1LCAgICAzNTJ9LAorICAgIHsgIDE4NCwgIC0xMTc1LCAgLTEzNTYsICAgLTYyN30sIHsgLTU0NywgIC0xMDg4LCAgLTE2NjEsICAgLTkxMX0sCisgICAgeyAtMjE2LCAgLTE1MDIsICAtMjE5NywgICAtOTQ4fSwgeyAtNzk1LCAgLTEzMDYsICAtMjM3NCwgICAtNDUxfSwKKyAgICB7IC05MjQsICAtMTg4OSwgIC0yNzk2LCAgIC02ODB9LCB7IC02MDAsICAtMTYxNCwgIC0zNjA5LCAgIC04ODV9LAorICAgIHstMjM5MiwgIC0yNTI4LCAgICAzMTksICAgIDMwM30sIHstMjkwOCwgIC0yMDk1LCAgIC0zMTAsICAgIDU3M30sCisgICAgey0zNDYwLCAgLTIxNDEsICAgICA0OSwgICAtMTEzfSwgey0yMjMxLCAgIC00NDgsICAgIDY3NSwgICAtMTQ2fSwKKyAgICB7LTI4MDUsICAgLTUzMiwgICAxMjMxLCAgICA0Nzl9LCB7LTI2ODQsICAgLTQ4NiwgICAtMjAwLCAgICA2MTF9LAorICAgIHstMzUyNSwgICAtOTcxLCAgIC0xOTgsICAgIDcwNH0sIHstMzcwNywgICAgMTczLCAgICAzNDksICAgIDI1NH0sCisgICAgey00NzM0LCAgLTE0NDcsICAgIC0zNCwgICAgODgwfSwgeyAgNzc3LCAgIC01MTIsICAgIDExNCwgICAgLTEwfSwKKyAgICB7IDEyNTAsICAgIC02NiwgICAgNDQyLCAgICAgLTV9LCB7ICA2MDQsICAgIDYxMywgICAgNDUyLCAgIC0zNTJ9LAorICAgIHsgMTIyNCwgICAgNzc3LCAgICA2NzUsICAtMTAxNH0sIHstMTM3MiwgICAgLTc5LCAgLTEyMDgsICAgLTIzOH0sCisgICAgey0yMzg5LCAgICAtMTcsICAtMTE1NywgICAtODE4fSwgey0xNTA0LCAgIC02NzMsICAtMTEzMywgIC0xMDYwfSwKKyAgICB7LTE5ODQsICAgLTc5OSwgIC0yMDA1LCAgLTE5NzN9LCB7LTIwMzcsICAgLTc5OCwgIC0xMDY4LCAgIC0xMDV9LAorICAgIHstMzE5MCwgICAtODk5LCAgLTE4MTcsICAgLTE5NH0sIHsgLTE1NiwgICAtODg2LCAgICAzOTQsICAgLTMxOH0sCisgICAgeyAtMjU4LCAgLTEyODMsICAgIDU1MSwgICAgMjAyfSwgeyAtNTM2LCAgLTE3MjksICAgIDkxMCwgICAgMzMxfSwKKyAgICB7IC04NDcsICAtMTEwOSwgICAgNzk1LCAgIC0xNjN9LCB7LTExNzEsICAtMTEyOCwgICAgNzE1LCAgICA1MTl9LAorICAgIHstMTA4MCwgIC0xMzE5LCAgIDE2ODUsICAgIDY2OH0sIHstMTAwMCwgIC0xOTIxLCAgICAgOTYsICAgIDIxMX0sCisgICAgey0xNDg3LCAgLTIxNDgsICAgIDgzMSwgICAgMTc0fSwgey0xMTM5LCAgIC0zNzQsICAgIDQxNCwgICAgIC00fSwKKyAgICB7LTE1MTcsICAtMTM4MywgICAgMzk2LCAgIC0zNTJ9LCB7LTEwMTIsICAgIDQzOSwgICAgLTU5LCAgIC05Njd9LAorICAgIHstMTgxMiwgICAgNzA2LCAgIC00NDAsICAtMTAzMH0sIHstMTk3MSwgICAtMzI5LCAgICAtMzQsICAgLTgyN30sCisgICAgey0yNDcyLCAgLTE1ODgsICAgLTE1MSwgICAtNjA2fSwgey0yMTYxLCAgICAzNzQsICAgLTI4MSwgICAgIDc2fSwKKyAgICB7LTMwMTIsICAgIDIzMSwgICAgLTE1LCAgIC02OTB9LCB7IDExMDQsICAgIDU2NiwgICAgNzIxLCAgICAyMDl9LAorICAgIHsgMTY4NSwgICAgNTY0LCAgICAzODMsICAgICA5OH0sIHsgMTg5OCwgICAgNzUwLCAgICA3OTIsICAgIC05N30sCisgICAgeyAgNTU2LCAgICAtNjQsICAgIDU2MSwgICAgLTkzfSwgeyAgODc2LCAgICAxNjIsICAgIDkxMywgICAgLTIyfSwKKyAgICB7ICA5NjEsICAgIDY3NSwgICAxMjk2LCAgICAxNDB9LCB7ICA3NTYsICAgLTM5NiwgICAgODUxLCAgICA1NDR9LAorICAgIHsgIDM2MCwgICAtMzAzLCAgIDEzNDEsICAgIDM5Nn0sIHsgIDg3OCwgICAgLTIyLCAgIDE0NjQsICAgIDg2M30sCisgICAgeyAtMzA5LCAgIC0yNzMsICAgIDY0MiwgICAtMTI5fSwgeyAtNjg2LCAgICAtODIsICAgIDg0MiwgICAgNDU0fSwKKyAgICB7ICAgLTUsICAgIC00NywgICAxMDY5LCAgICA5OTh9LCB7ICAtOTQsICAgIDk2NywgICAxMjc3LCAgICAyOTh9LAorICAgIHsgLTQ4OSwgICAgMzg1LCAgIDE0NzMsICAgIDc0Nn0sIHsgLTM2OSwgICAtNzE3LCAgIDEzMzMsICAgIDI0Mn0sCisgICAgeyAgMjgxLCAgIC05OTMsICAgMTcyNiwgICAgOTI0fSwgeyAgNDY0LCAgICA2MDEsICAgMTU3NSwgICAxMzc2fSwKKyAgICB7IC0yNTAsICAgIDIwNiwgICAyMzM5LCAgIDExNzV9LCB7IC00MzgsICAgIDM3NywgICAtNTk3LCAgIC0yODV9LAorICAgIHstMTAyMCwgICAgNzg3LCAgIC03OTAsICAgLTI4N30sIHsgLTQ1OCwgICAtNDEwLCAgICAyMTUsICAgIDI5NX0sCisgICAgeyAtNTg5LCAgIC04NjAsICAgLTEyMSwgICAgNzk3fSwgey0xMTc1LCAgICAxMjIsICAgLTQzNywgICAgNDY2fSwKKyAgICB7LTE0ODAsICAgLTEyMSwgICAgMzY3LCAgICA5MjR9LCB7ICAyMzQsICAgIDMyMywgICAgNzcwLCAgIC01NTV9LAorICAgIHsgIDE0NSwgICAgIDMwLCAgICA5OTYsICAgICAyNn0sIHsgICA2NiwgICAgODQ5LCAgICAgOTMsICAgLTE0NX0sCisgICAgeyAtMTE3LCAgIDEyNjEsICAgIDQ3NCwgICAtMzk5fSwgey0xNDk1LCAgIDEwNTEsICAgIDIxOCwgICAtNTA2fSwKKyAgICB7LTEzOTAsICAgIDY5NCwgICAgOTk0LCAgICAgODh9LCB7ICA2MTYsICAgICAgNywgICAgIDc4LCAgICAzMDR9LAorICAgIHsgMTA2MCwgICAgIDUyLCAgICAtNjIsICAgIDgzNX0sIHsgIDgzMywgICAgNDU0LCAgICA2NDksICAgMTM1OX0sCisgICAgeyAtNzcwLCAgICA0NjQsICAgICA0NywgICAgIDkzfSwgeyAtNTc0LCAgIDExOTksICAgIC0zOSwgICAgMzc5fSwKKyAgICB7ICAxMTQsICAgIC05OCwgICAgNDg4LCAgICA0ODV9LCB7ICA3MjcsICAgIDI0NCwgICAgNjA2LCAgICA2OTZ9LAorICAgIHsgIC03NiwgICAgNDU1LCAgICA2NzEsICAgIDU0Nn0sIHsgLTU2NSwgICAgLTEzLCAgICAxNDUsICAgIDgxOX0sCisgICAgeyAtMzc2LCAgICA1NjksICAgIDQ0OCwgICAxMTI4fSwgeyAgMjE4LCAgICAxMjIsICAgIDI2NSwgICAxMTY3fSwKKyAgICB7ICAyMzAsICAgIDczOCwgICAgOTMyLCAgIDEwMDN9LCB7ICAxMzgsICAgIDQ3NywgICAgIDM2LCAgICA0NTB9LAorICAgIHsgIDQwNCwgICAgNzg3LCAgICAtNzMsICAgMTAwMH0sIHsgIDQ5NywgICAxMjU5LCAgICAzODcsICAgMTIzMX0sCisgICAgeyAgIDE3LCAgICAyMDcsICAgIDE5NSwgICAgLTc5fSwgeyAgNTYyLCAgICAzNTgsICAgICA1MywgICAtMTU4fSwKKyAgICB7ICA0OTMsICAgIDM4NywgICAgNDc4LCAgICAxODl9LCB7ICA2NzgsICAgIDgzMSwgICAgNjQwLCAgICA1NTh9LAorICAgIHsgLTE5NywgICAgNTIzLCAgICA2MTMsICAgICA1N30sIHsgIDQyOSwgICAgODk0LCAgICA3NjksICAgIDExMX0sCisgICAgeyAgIDY3LCAgIDExNzQsICAgIDU2OCwgICAgNTExfSwgeyAxMjQyLCAgICA4MjQsICAgIDI1MSwgICAgODQwfSwKKyAgICB7IDE0MTksICAgMTA3NCwgICAgODY0LCAgICA0ODF9LCB7ICA5MjQsICAgMTQ3NCwgICAgNjY5LCAgICA3MjR9LAorICAgIHsgMTUzOSwgICAxODc5LCAgICA2NTQsICAgMTU5MH0sIHsgIDQ0NSwgICAgMzM3LCAgIDExMTEsICAgIDU0MX0sCisgICAgeyAgNDcyLCAgIDE0MjEsICAgMTI2NCwgICAxMDk0fSwgeyAgNzk0LCAgICA3MzUsICAgMTEwMywgICAgNjY4fSwKKyAgICB7IDEwNTUsICAgIDg2MywgICAxMTkyLCAgIDEwMjB9LCB7ICA3NzgsICAgMTEwNSwgICAgODA2LCAgIDE3OTh9LAorICAgIHsgMTA1MiwgICAxNTI3LCAgIDE1ODcsICAgMjE1MX0sIHsgIDg4MSwgICAxNTUyLCAgIDEyNjUsICAgIDM5MX0sCisgICAgeyAgNzI2LCAgICA4NzIsICAgMTgxMiwgICAgNjAxfSwgeyAxNDY5LCAgICAyODAsICAgMTAwOCwgICAgNjE2fSwKKyAgICB7IDE0MDMsICAgIDU3NywgICAxODAzLCAgIDEyNDR9LCB7IDE2NTAsICAgMTMxNCwgICAxMTQ4LCAgIDEwNzJ9LAorICAgIHsgMTI5NywgICAxNjY5LCAgIDE5MTEsICAgMTAyNn0sIHsgMjA5MywgICAxMDQ0LCAgIDIxMTUsICAgMTE4OX0sCisgICAgeyAxNjQ0LCAgIDE5NjEsICAgMjU4NywgICAxNTEyfSwgeyAgIDI1LCAgIC0zMTUsICAgICAtOSwgICAtMTA2fSwKKyAgICB7ICAyOTAsICAgLTMzOSwgICAgNDI4LCAgIC00NDR9LCB7ICAtNjgsICAgLTc4MywgICAgNzM1LCAgICA3NzJ9LAorICAgIHsgIDI0NSwgICAtNTU1LCAgICA0NjgsICAgICA0N30sIHsgIDMzNCwgICAtODk1LCAgICA4MTQsICAgIDE0Nn0sCisgICAgeyAgMjM1LCAgICAzNjgsICAgLTk2NCwgICAtOTU5fSwgeyAtMjAzLCAgICAzMTUsICAtMTU2NiwgIC0xMjE3fSwKKyAgICB7ICA4MDEsICAgICAxNywgICAtMjc2LCAgIC0zNTR9LCB7ICA4OTQsICAgLTQ5NSwgICAtNzg5LCAgIC02MzV9LAorICAgIHsgIDcxNiwgICAgMjkxLCAgLTExODksICAgLTM1N30sIHsgIDU2MCwgICAtMjYwLCAgIC03MzMsICAgICAtMn0sCisgICAgeyAgNjc5LCAgIC01MDgsICAtMTQyOSwgICAgMjExfSwgeyAgLTUxLCAgICAtNjIsICAgLTQyOCwgICAgNTU3fSwKKyAgICB7ICAzMjIsICAgLTYzOCwgICAtMjExLCAgICA2MTR9LCB7IC04NzgsICAtMTA1NywgICAgLTg0LCAgICAtNzF9LAorICAgIHsgLTM4OCwgIC0xNDE1LCAgIC0xNjcsICAgLTMxOH0sIHsgLTc1NCwgIC0xNTc0LCAgICAyMTQsICAgLTUzOX0sCisgICAgey0xNDE5LCAgLTIwMDQsICAgIC05MiwgICAtNzg3fSwgeyAgLTQ3LCAgIC04NTYsICAgLTM0NywgICAtMjU1fSwKKyAgICB7ICAgMjMsICAtMTIxMSwgICAtMTczLCAgICAzMjB9LCB7IC02NTgsICAgLTQ4NywgICAtODkzLCAgICAzNTN9LAorICAgIHsgLTc4MywgIC0xNTg3LCAgIC01ODQsICAgIDUwN30sIHstMTQyMCwgICAtODU5LCAgIC0zNzgsICAgIDQ0MX0sCisgICAgey0yMDk1LCAgLTE0OTEsICAgLTEzNywgICAgNDM5fSwgeyAtMzIxLCAgLTE0NTAsICAtMTI4OCwgICAgLTEyfSwKKyAgICB7IC0zNTksICAtMjExMywgICAtNTUzLCAgICAgLTh9LCB7IC04MzEsICAtMTkxOCwgIC0xNTYxLCAgICAgMzJ9LAorICAgIHstMTAxNCwgIC0yNDg3LCAgLTEzNTksICAgLTkzOX0sIHsgLTQ3NSwgICAtMzExLCAgIC0xNjksICAgLTIzNn0sCisgICAgeyAtOTA3LCAgIC00MjYsICAgIDI3NiwgICAtNjExfSwgeyAgLTk2LCAgIC00MDAsICAgICA1MCwgICAtNzEwfSwKKyAgICB7IC00MjYsICAtMTAyMiwgICAgLTEwLCAgIC05ODV9LCB7IC0xOTcsICAgLTI1OCwgICAtNzQ0LCAgIC01NzV9LAorICAgIHsgLTYxMSwgICAtOTMwLCAgIC03NzEsICAgLTM5NH0sIHsgLTI2NywgICAtNzc2LCAgIC02MTIsICAgLTkzOX0sCisgICAgeyAtMjU2LCAgLTEzNDYsICAgLTgwMiwgIC0xMTIyfSwgeyAtNzk2LCAgLTE1NzAsICAgLTgyNSwgICAtNzU0fSwKKyAgICB7ICA3MTIsICAgIDg3NiwgICAgMTQxLCAgICAyMjd9LCB7ICA5ODEsICAgMTUwOSwgICAgIDg1LCAgICAxMjR9LAorICAgIHsgMTQ2MiwgICAxMjI4LCAgICA5NzksICAgIC0zOX0sIHsgMTczNCwgICAgOTk5LCAgIDE0ODEsICAgIDQ0MH0sCisgICAgeyAyMjkzLCAgIDExMTYsICAgIDc2OSwgICAgNDQwfSwgeyAyNTA0LCAgIDE0ODAsICAgMTI0MSwgICAgMzU2fSwKKyAgICB7IDI0NzQsICAgMTkwOSwgICAxNTU4LCAgICA4MTB9LCB7ICA5MTcsICAgMTEzNCwgICAgNjA3LCAgIC0xMzR9LAorICAgIHsgIDUwOSwgICAxODA5LCAgICA3ODEsICAgLTEyM30sIHsgMTcxMiwgICAxNTA2LCAgICA1NTksICAgLTQyM30sCisgICAgeyAyMDM3LCAgIDIzMTcsICAgIDcyNiwgICAtMTU1fSwgeyAzMDMxLCAgIDI2NzYsICAgMTIwMywgICAgMzMxfSwKKyAgICB7IDM2NjQsICAgMzI3NCwgICAxNzY4LCAgICA1MzF9LCB7IDE2MTAsICAgMTgzOSwgICAgODY3LCAgICAxODN9LAorICAgIHsgMTc3NCwgICAxOTcyLCAgIDE1MzgsICAgICA5N30sIHsgMTgyMiwgICAyMTU4LCAgIDEyODIsICAgIDY1OX0sCisgICAgeyAyMjIyLCAgIDI3NTgsICAgMTgxOCwgICAgOTAwfSwgeyAzMjUxLCAgIDIxMjQsICAgMTcyMywgICAgOTk2fSwKKyAgICB7IDM2MzMsICAgMjMzNiwgICAyNDA4LCAgIDE0NTN9LCB7IDI5MjMsICAgMzUxNywgICAyNTY3LCAgIDEzMTh9LAorfTsKKworLyoqCisgKiBVc2VkIGZvciB0aGUgY29kaW5nL2RlY29kaW5nIG9mIHRoZSBwdWxzZXMgcG9zaXRpb25zCisgKiBmb3IgdGhlIE1QLU1MUSBjb2RlYm9vaworICovCitzdGF0aWMgY29uc3QgaW50MzJfdCBjb21iaW5hdG9yaWFsX3RhYmxlW1BVTFNFX01BWF1bU1VCRlJBTUVfTEVOL0dSSURfU0laRV0gPSB7CisgICAgezExODc1NSwgOTgyODAsIDgwNzMwLCAgNjU3ODAsIDUzMTMwLAorICAgICAgNDI1MDQsIDMzNjQ5LCAyNjMzNCwgIDIwMzQ5LCAxNTUwNCwKKyAgICAgIDExNjI4LCAgODU2OCwgIDYxODgsICAgNDM2OCwgIDMwMDMsCisgICAgICAgMjAwMiwgIDEyODcsICAgNzkyLCAgICA0NjIsICAgMjUyLAorICAgICAgICAxMjYsICAgIDU2LCAgICAyMSwgICAgICA2LCAgICAgMSwKKyAgICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAgMCwgICAgIDB9LAorCisgICAgeyAyMzc1MSwgMjA0NzUsIDE3NTUwLCAgMTQ5NTAsIDEyNjUwLAorICAgICAgMTA2MjYsICA4ODU1LCAgNzMxNSwgICA1OTg1LCAgNDg0NSwKKyAgICAgICAzODc2LCAgMzA2MCwgIDIzODAsICAgMTgyMCwgIDEzNjUsCisgICAgICAgMTAwMSwgICA3MTUsICAgNDk1LCAgICAzMzAsICAgMjEwLAorICAgICAgICAxMjYsICAgIDcwLCAgICAzNSwgICAgIDE1LCAgICAgNSwKKyAgICAgICAgICAxLCAgICAgMCwgICAgIDAsICAgICAgMCwgICAgIDB9LAorCisgICAgeyAgMzY1NCwgIDMyNzYsICAyOTI1LCAgIDI2MDAsICAyMzAwLAorICAgICAgIDIwMjQsICAxNzcxLCAgMTU0MCwgICAxMzMwLCAgMTE0MCwKKyAgICAgICAgOTY5LCAgIDgxNiwgICA2ODAsICAgIDU2MCwgICA0NTUsCisgICAgICAgIDM2NCwgICAyODYsICAgMjIwLCAgICAxNjUsICAgMTIwLAorICAgICAgICAgODQsICAgIDU2LCAgICAzNSwgICAgIDIwLCAgICAxMCwKKyAgICAgICAgICA0LCAgICAgMSwgICAgIDAsICAgICAgMCwgICAgIDB9LAorCisgICAgeyAgIDQwNiwgICAzNzgsICAgMzUxLCAgICAzMjUsICAgMzAwLAorICAgICAgICAyNzYsICAgMjUzLCAgIDIzMSwgICAgMjEwLCAgIDE5MCwKKyAgICAgICAgMTcxLCAgIDE1MywgICAxMzYsICAgIDEyMCwgICAxMDUsCisgICAgICAgICA5MSwgICAgNzgsICAgIDY2LCAgICAgNTUsICAgIDQ1LAorICAgICAgICAgMzYsICAgIDI4LCAgICAyMSwgICAgIDE1LCAgICAxMCwKKyAgICAgICAgICA2LCAgICAgMywgICAgIDEsICAgICAgMCwgICAgIDB9LAorCisgICAgeyAgICAyOSwgICAgMjgsICAgIDI3LCAgICAgMjYsICAgIDI1LAorICAgICAgICAgMjQsICAgIDIzLCAgICAyMiwgICAgIDIxLCAgICAyMCwKKyAgICAgICAgIDE5LCAgICAxOCwgICAgMTcsICAgICAxNiwgICAgMTUsCisgICAgICAgICAxNCwgICAgMTMsICAgIDEyLCAgICAgMTEsICAgIDEwLAorICAgICAgICAgIDksICAgICA4LCAgICAgNywgICAgICA2LCAgICAgNSwKKyAgICAgICAgICA0LCAgICAgMywgICAgIDIsICAgICAgMSwgICAgIDB9LAorCisgICAgeyAgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLAorICAgICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwKKyAgICAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAgMSwgICAgIDEsCisgICAgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLAorICAgICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwKKyAgICAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAgMSwgICAgIDF9LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgcGl0Y2hfY29udHJpYlszNDBdID0geworICAgIDYwLCAgICAgMCwgIDAsICAyNDg5LCA2MCwgICAgIDAsICAwLCAgNTIxNywKKyAgICAgMSwgIDYxNzEsICAwLCAgMzk1MywgIDAsIDEwMzY0LCAgMSwgIDkzNTcsCisgICAgLTEsICA4ODQzLCAgMSwgIDkzOTYsICAwLCAgNTc5NCwgLTEsIDEwODE2LAorICAgICAyLCAxMTYwNiwgLTIsIDEyMDcyLCAgMCwgIDg2MTYsICAxLCAxMjE3MCwKKyAgICAgMCwgMTQ0NDAsICAwLCAgNzc4NywgLTEsIDEzNzIxLCAgMCwgMTgyMDUsCisgICAgIDAsIDE0NDcxLCAgMCwgMTU4MDcsICAxLCAxNTI3NSwgIDAsIDEzNDgwLAorICAgIC0xLCAxODM3NSwgLTEsICAgICAwLCAgMSwgMTExOTQsIC0xLCAxMzAxMCwKKyAgICAgMSwgMTg4MzYsIC0yLCAyMDM1NCwgIDEsIDE2MjMzLCAtMSwgICAgIDAsCisgICAgNjAsICAgICAwLCAgMCwgMTIxMzAsICAwLCAxMzM4NSwgIDEsIDE3ODM0LAorICAgICAxLCAyMDg3NSwgIDAsIDIxOTk2LCAgMSwgICAgIDAsICAxLCAxODI3NywKKyAgICAtMSwgMjEzMjEsICAxLCAxMzczOCwgLTEsIDE5MDk0LCAtMSwgMjAzODcsCisgICAgLTEsICAgICAwLCAgMCwgMjEwMDgsIDYwLCAgICAgMCwgLTIsIDIyODA3LAorICAgICAwLCAxNTkwMCwgIDEsICAgICAwLCAgMCwgMTc5ODksIC0xLCAyMjI1OSwKKyAgICAgMSwgMjQzOTUsICAxLCAyMzEzOCwgIDAsIDIzOTQ4LCAgMSwgMjI5OTcsCisgICAgIDIsIDIyNjA0LCAtMSwgMjU5NDIsICAwLCAyNjI0NiwgIDEsIDI1MzIxLAorICAgICAwLCAyNjQyMywgIDAsIDI0MDYxLCAgMCwgMjcyNDcsIDYwLCAgICAgMCwKKyAgICAtMSwgMjU1NzIsICAxLCAyMzkxOCwgIDEsIDI1OTMwLCAgMiwgMjY0MDgsCisgICAgLTEsIDE5MDQ5LCAgMSwgMjczNTcsIC0xLCAyNDUzOCwgNjAsICAgICAwLAorICAgIC0xLCAyNTA5MywgIDAsIDI4NTQ5LCAgMSwgICAgIDAsICAwLCAyMjc5MywKKyAgICAtMSwgMjU2NTksICAwLCAyOTM3NywgIDAsIDMwMjc2LCAgMCwgMjYxOTgsCisgICAgIDEsIDIyNTIxLCAtMSwgMjg5MTksICAwLCAyNzM4NCwgIDEsIDMwMTYyLAorICAgIC0xLCAgICAgMCwgIDAsIDI0MjM3LCAtMSwgMzAwNjIsICAwLCAyMTc2MywKKyAgICAgMSwgMzA5MTcsIDYwLCAgICAgMCwgIDAsIDMxMjg0LCAgMCwgMjk0MzMsCisgICAgIDEsIDI2ODIxLCAgMSwgMjg2NTUsICAwLCAzMTMyNywgIDIsIDMwNzk5LAorICAgICAxLCAzMTM4OSwgIDAsIDMyMzIyLCAgMSwgMzE3NjAsIC0yLCAzMTgzMCwKKyAgICAgMCwgMjY5MzYsIC0xLCAzMTE4MCwgIDEsIDMwODc1LCAgMCwgMjc4NzMsCisgICAgLTEsIDMwNDI5LCAgMSwgMzEwNTAsICAwLCAgICAgMCwgIDAsIDMxOTEyLAorICAgICAxLCAzMTYxMSwgIDAsIDMxNTY1LCAgMCwgMjU1NTcsICAwLCAzMTM1NywKKyAgICA2MCwgICAgIDAsICAxLCAyOTUzNiwgIDEsIDI4OTg1LCAtMSwgMjY5ODQsCisgICAgLTEsIDMxNTg3LCAgMiwgMzA4MzYsIC0yLCAzMTEzMywgIDAsIDMwMjQzLAorICAgIC0xLCAzMDc0MiwgLTEsIDMyMDkwLCA2MCwgICAgIDAsICAyLCAzMDkwMiwKKyAgICA2MCwgICAgIDAsICAwLCAzMDAyNywgIDAsIDI5MDQyLCA2MCwgICAgIDAsCisgICAgIDAsIDMxNzU2LCAgMCwgMjQ1NTMsICAwLCAyNTYzNiwgLTIsIDMwNTAxLAorICAgIDYwLCAgICAgMCwgLTEsIDI5NjE3LCAgMCwgMzA2NDksIDYwLCAgICAgMCwKKyAgICAgMCwgMjkyNzQsICAyLCAzMDQxNSwgIDAsIDI3NDgwLCAgMCwgMzEyMTMsCisgICAgLTEsIDI4MTQ3LCAgMCwgMzA2MDAsICAxLCAzMTY1MiwgIDIsIDI5MDY4LAorICAgIDYwLCAgICAgMCwgIDEsIDI4NTcxLCAgMSwgMjg3MzAsICAxLCAzMTQyMiwKKyAgICAgMCwgMjgyNTcsICAwLCAyNDc5NywgNjAsICAgICAwLCAgMCwgICAgIDAsCisgICAgNjAsICAgICAwLCAgMCwgMjIxMDUsICAwLCAyNzg1MiwgNjAsICAgICAwLAorICAgIDYwLCAgICAgMCwgLTEsIDI0MjE0LCAgMCwgMjQ2NDIsICAwLCAyMzMwNSwKKyAgICA2MCwgICAgIDAsIDYwLCAgICAgMCwgIDEsIDIyODgzLCAgMCwgMjE2MDEsCisgICAgNjAsICAgICAwLCAgMiwgMjU2NTAsIDYwLCAgICAgMCwgLTIsIDMxMjUzLAorICAgIC0yLCAyNTE0NCwgIDAsIDE3OTk4Cit9OworCisvKioKKyAqIE51bWJlciBvZiBub24temVybyBwdWxzZXMgaW4gdGhlIE1QLU1MUSBleGNpdGF0aW9uCisgKi8KK3N0YXRpYyBjb25zdCBpbnQ4X3QgcHVsc2VzWzRdID0gezYsIDUsIDYsIDV9OworCisvKioKKyAqIFNpemUgb2YgdGhlIE1QLU1MUSBmaXhlZCBleGNpdGF0aW9uIGNvZGVib29rcworICovCitzdGF0aWMgY29uc3QgaW50MzJfdCBtYXhfcG9zWzRdID0gezU5Mzc3NSwgMTQyNTA2LCA1OTM3NzUsIDE0MjUwNn07CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGZpeGVkX2NiX2dhaW5bR0FJTl9MRVZFTFNdID0geworICAgICAgMSwgICAgMiwgICAgMywgICAgNCwgICAgNiwgICAgOSwgICAxMywgICAxOCwKKyAgICAgMjYsICAgMzgsICAgNTUsICAgODAsICAxMTUsICAxNjYsICAyNDAsICAzNDgsCisgICAgNTAyLCAgNzI2LCAxMDUwLCAxNTE3LCAyMTkzLCAzMTcwLCA0NTgyLCA2NjIzLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgYWRhcHRpdmVfY2JfZ2Fpbjg1Wzg1ICogMjBdID0geworICAgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgODAwLCAgIDE0OTYsICAgIDE2NywgICAtMjU2LAorICAgICAtMzM4LCAgICAtMzksICAgLTEzNiwgICAgIC0xLCAgICAgLTQsICAgICAtNiwgICAgLTczLCAgICAgLTgsCisgICAgICAtMTUsICAgICAxMiwgICAgIDIzLCAgICAgIDIsICAgICAxNiwgICAgIDMwLCAgICAgIDMsICAgICAtNSwKKyAgICAgLTQ2MiwgICAtNjg2LCAgICA0OTMsICAgMjU3NSwgICAgMzExLCAgICAtMTMsICAgIC0yOCwgICAgLTE0LAorICAgICAtNDA0LCAgICAgLTUsICAgIC0xOSwgICAgIDEzLCAgICAgMjAsICAgICA3MiwgICAgMTA3LCAgICAtNzcsCisgICAgICAgIDgsICAgICAxMywgICAgIC05LCAgICAtNDgsICAgMTQ4MywgICAgMTQ0LCAgICA3ODQsICAgIDkyOCwKKyAgICAgMTI0MywgICAtMTM0LCAgICAgLTEsICAgIC0zNywgICAgLTUyLCAgICAtOTQsICAgIC0xMywgICAgLTcxLAorICAgICAgIC02LCAgICAtODQsICAgICAtOCwgICAgLTQ0LCAgIC0xMTIsICAgIC0xMCwgICAgLTU5LCAgICAtNzAsCisgICAgICAtNzcsICAgIDI3NSwgICAzNTIyLCAgIDEwNTYsICAtMTI1NCwgICAgICAwLCAgICAgLTQsICAgLTc1NywKKyAgICAgIC02OCwgICAgLTk1LCAgICAgIDEsICAgICAxNiwgICAgLTU5LCAgICAgIDQsICAgIC0xNywgICAtMjI3LAorICAgICAgIC01LCAgICAgMjEsICAgIDI2OSwgICAgIDgwLCAgIC0xMjUsICAgIC00MCwgICAtMjY0LCAgICAzODEsCisgICAgIDUwMjcsICAgICAgMCwgICAgICAwLCAgICAgLTQsICAgICAtOCwgIC0xNTQyLCAgICAgIDAsICAgICAtMiwKKyAgICAgICAgMCwgICAgICAyLCAgICAgIDAsICAgICAgNiwgICAgIDM4LCAgICAgMTIsICAgICA4MSwgICAtMTE3LAorICAgICAgMTM4LCAgICAzMzIsICAgMjIxNSwgICAyNTc0LCAgIDEzMzksICAgICAtMSwgICAgIC02LCAgIC0yOTksCisgICAgIC00MDQsICAgLTEwOSwgICAgIC0yLCAgICAtMTgsICAgIC00NCwgICAgLTIxLCAgICAtNTIsICAgLTM0OCwKKyAgICAgIC0xMSwgICAgLTI3LCAgIC0xODEsICAgLTIxMCwgICAzNjg1LCAgIDI4ODMsICAgLTg4NywgICAgODY2LAorICAgIC0xNjM5LCAgIC04MjgsICAgLTUwNywgICAgLTQ4LCAgICAtNDUsICAgLTE2NCwgICAtNjQ4LCAgICAxOTksCisgICAgICAxNTYsICAgLTE5NCwgICAtMTUyLCAgICAgNDYsICAgIDM2OCwgICAgMjg4LCAgICAtODgsICAgICA4NiwKKyAgICAgMTM5NiwgICAyMTQ2LCAgIDIyMzUsICAgIDM0NSwgICAgOTQyLCAgIC0xMTgsICAgLTI4MSwgICAtMzA1LAorICAgICAgIC03LCAgICAtNTQsICAgLTE4MiwgICAtMTkwLCAgIC0yOTIsICAgIC0yOSwgICAgLTQ1LCAgICAtNDcsCisgICAgICAtODAsICAgLTEyMywgICAtMTI4LCAgICAtMTksICAgICAxMywgICA0NDc1LCAgIDM1NDksICAgLTgwNCwKKyAgICAgLTY1NSwgICAgICAwLCAgLTEyMjIsICAgLTc2OCwgICAgLTM5LCAgICAtMjYsICAgICAtMywgICAgIC0yLAorICAgICAtOTY5LCAgICAgIDAsICAgIDIxOSwgICAgMTc0LCAgICAgIDAsICAgIDE3OSwgICAgMTQxLCAgICAtMzIsCisgICAgIC03MjQsICAgIDI1NCwgICAgMjQyLCAgIDYwNDksICAgMjQ2MiwgICAgLTMyLCAgICAgLTMsICAgICAtMywKKyAgICAtMjIzMywgICAtMzcwLCAgICAgMTEsICAgICAxMCwgICAgIC0zLCAgICAyNjcsICAgIC05NCwgICAgLTg5LAorICAgICAgMTA4LCAgICAtMzgsICAgIC0zNiwgICAtOTA5LCAgICA2MjYsICAtMTcxMywgICA2MTIxLCAgIDQ1NjEsCisgICAgLTEwNjEsICAgIC0yMywgICAtMTc5LCAgLTIyODcsICAtMTI3MCwgICAgLTY4LCAgICAgNjUsICAgLTIzMywKKyAgICAgIDY0MCwgICAtMTc0LCAgICA0NzcsICAtMTcwNCwgICAgIDQwLCAgIC0xMTEsICAgIDM5NiwgICAgMjk1LAorICAgICAtMzUwLCAgIDEzOTEsICAgNzk4NSwgICAgNTExLCAgIC00MDUsICAgICAtNywgICAtMTE4LCAgLTM4OTIsCisgICAgICAtMTUsICAgIC0xMCwgICAgIDI5LCAgICAxNzAsICAgLTY3OCwgICAgIDEwLCAgICAtNDMsICAgLTI0OSwKKyAgICAgICAtOCwgICAgIDM0LCAgICAxOTcsICAgICAxMiwgICAzMTQ0LCAgIC01MjksICAgIDYwOCwgICAyNTMwLAorICAgICAzODc4LCAgIC02MDMsICAgIC0xNywgICAgLTIyLCAgIC0zOTAsICAgLTkxOCwgICAgMTAxLCAgIC0xMTYsCisgICAgICAgMTksICAgLTQ4NSwgICAgIDgxLCAgICAtOTMsICAgLTc0NCwgICAgMTI1LCAgIC0xNDQsICAgLTU5OSwKKyAgICAgMjU4OSwgICAtNjg5LCAgIDMwNDUsICAgNTYwMywgICAtNDA0LCAgIC00MDksICAgIC0yOSwgICAtNTY2LAorICAgIC0xOTE2LCAgICAtMTAsICAgIDEwOCwgICAtNDgxLCAgICAxMjgsICAgLTg4NSwgICAgMjM1LCAgLTEwNDEsCisgICAgICAgNjMsICAgIC0xNywgICAgIDc1LCAgICAxMzgsICAgMzEwNywgICAgNTEzLCAgIDEzNzQsICAtMzU5NCwKKyAgICAtNDkyMiwgICAtNTg5LCAgICAtMTYsICAgLTExNSwgICAtNzg4LCAgLTE0NzgsICAgIC05NywgICAtMjYwLAorICAgICAgLTQzLCAgICA2ODEsICAgIDExMiwgICAgMzAxLCAgICA5MzMsICAgIDE1NCwgICAgNDEzLCAgLTEwNzksCisgICAgIDI0NjgsICAgNjAxMCwgICAxMTA3LCAgIC0zOTAsICAgMTk2MSwgICAtMzcyLCAgLTIyMDQsICAgIC03NCwKKyAgICAgICAtOSwgICAtMjM0LCAgIC05MDUsICAgLTE2NiwgICAtNDA2LCAgICAgNTgsICAgIDE0MywgICAgIDI2LAorICAgICAtMjk1LCAgIC03MTksICAgLTEzMiwgICAgIDQ2LCAgIDQ3NzMsICAgMjc2NiwgICAyMzY4LCAgIDQ4NjIsCisgICAgLTQwNDQsICAtMTM5MCwgICAtNDY3LCAgIC0zNDIsICAtMTQ0MywgICAtOTk4LCAgIC04MDYsICAgLTY5MCwKKyAgICAgLTM5OSwgIC0xNDE2LCAgIC04MjEsICAgLTcwMiwgICAxMTc4LCAgICA2ODIsICAgIDU4NCwgICAxMjAwLAorICAgICAxNjY1LCAgLTE4NzksICAgMTQ0MywgICAxNzAxLCAgIDg1NjIsICAgLTE2OSwgICAtMjE1LCAgIC0xMjcsCisgICAgIC0xNzYsICAtNDQ3NSwgICAgMTkwLCAgIC0xNDYsICAgIDE2NSwgICAtMTcyLCAgICAxOTUsICAgLTE0OSwKKyAgICAgLTg3MCwgICAgOTgyLCAgIC03NTQsICAgLTg4OSwgICAyNzE2LCAgIDkwMTEsICAtMTAwNywgICAgNzU1LAorICAgIC0xNzg1LCAgIC00NTAsICAtNDk1NiwgICAgLTYxLCAgICAtMzQsICAgLTE5NCwgIC0xNDkzLCAgICAxNjcsCisgICAgICA1NTQsICAgLTEyNSwgICAtNDE1LCAgICAgNDYsICAgIDI5NiwgICAgOTgyLCAgIC0xMDksICAgICA4MiwKKyAgICAtMjcyNywgICA3NTQ4LCAgIDEyODUsICAgIDkzOCwgICAzNDIwLCAgIC00NTMsICAtMzQ3OCwgICAtMTAwLAorICAgICAgLTUzLCAgIC03MTQsICAgMTI1NiwgICAgMjEzLCAgIC01OTIsICAgIDE1NiwgICAtNDMyLCAgICAtNzMsCisgICAgICA1NjksICAtMTU3NiwgICAtMjY4LCAgIC0xOTYsICAgMzY3NywgICAgODgyLCAgIDQwNTAsICAgMTIwMiwKKyAgICAgMjMyMywgICAtODI1LCAgICAtNDcsICAtMTAwMSwgICAgLTg4LCAgIC0zMjksICAgLTE5OCwgICAtOTA5LAorICAgICAtMjE4LCAgIC0yNjksICAgIC02NCwgICAtMjk3LCAgIC01MjEsICAgLTEyNSwgICAtNTc0LCAgIC0xNzAsCisgICAgIDIwNDYsICAgLTc1MywgICAgMTIyLCAgMTAxMDIsICAgIDYwMywgICAtMjU1LCAgICAtMzQsICAgICAgMCwKKyAgICAtNjIyOSwgICAgLTIyLCAgICAgOTQsICAgIC0xNSwgICAgICA1LCAgLTEyNjEsICAgIDQ2NCwgICAgLTc1LAorICAgICAgLTc1LCAgICAgMjcsICAgICAtNCwgICAtMzcyLCAgICA0NDksICAtMTgxNSwgIDEwNjkwLCAgIDM4NzAsCisgICAgIC01MjcsICAgIC0xMiwgICAtMjAxLCAgLTY5NzYsICAgLTkxNCwgICAgLTE2LCAgICAgNDksICAgLTI5MywKKyAgICAgMTE4NCwgICAtMTA2LCAgICA0MjgsICAtMjUyNSwgICAgIDE0LCAgICAtNTgsICAgIDM0NCwgICAgMTI0LAorICAgICAtOTQxLCAgIDIzNTIsICAgNTA0OSwgICAzNjUwLCAgIDI2MzcsICAgIC01NCwgICAtMzM3LCAgLTE1NTYsCisgICAgIC04MTMsICAgLTQyNCwgICAgMTM1LCAgICAyOTAsICAgLTcyNSwgICAgMjA5LCAgIC01MjQsICAtMTEyNSwKKyAgICAgIDE1MSwgICAtMzc4LCAgIC04MTIsICAgLTU4NywgIC0xODc5LCAgICA3OTYsICAgMzExNywgICA5NTY5LAorICAgICAtNDA0LCAgIC0yMTUsICAgIC0zOCwgICAtNTkzLCAgLTU1ODksICAgICAtOSwgICAgIDkxLCAgICAzNTcsCisgICAgIC0xNTEsICAgMTA5NywgICAtNDY0LCAgLTE4MjEsICAgIC00NiwgICAgIDE5LCAgICAgNzYsICAgIDIzNiwKKyAgICAtMTcxNSwgICAyMDQzLCAgLTIwOTYsICAgOTk0NiwgICA0MDAxLCAgIC0xNzksICAgLTI1NCwgICAtMjY4LAorICAgIC02MDM4LCAgIC05NzcsICAgIDIxMywgICAtMjE5LCAgICAyNjEsICAgMTA0MSwgIC0xMjQwLCAgIDEyNzIsCisgICAgICA0MTgsICAgLTQ5OCwgICAgNTExLCAgLTI0MjksICAtNTc3MiwgICAtNjE4LCAgLTM5MjEsICAgIDI4NCwKKyAgICAtMzE1NSwgIC0yMDMzLCAgICAtMjMsICAgLTkzOCwgICAgIC00LCAgIC02MDcsICAgLTIxOCwgIC0xMzgxLAorICAgICAtMTQ4LCAgICAxMDAsICAgICAxMCwgICAgIDY4LCAgLTExMTEsICAgLTExOSwgICAtNzU1LCAgICAgNTQsCisgICAgICAzODIsICAgNDc0OCwgICA4MDAzLCAgLTIwNjQsICAgMjE5OCwgICAgIC04LCAgLTEzNzYsICAtMzkwOSwKKyAgICAgLTI2MCwgICAtMjk0LCAgIC0xMTAsICAgLTE4NiwgIC0yMzE5LCAgICAgNDgsICAgIDU5OCwgICAxMDA4LAorICAgICAgLTUxLCAgIC02MzcsICAtMTA3MywgICAgMjc3LCAgIC04NjcsICAgMzAxNSwgIDExOTI2LCAgLTE2NzUsCisgICAgICA5NDcsICAgIC00NSwgICAtNTU1LCAgLTg2ODEsICAgLTE3MSwgICAgLTU0LCAgICAxNTksICAgIDYzMSwKKyAgICAtMjE5NSwgICAgLTg4LCAgICAzMDgsICAgMTIxOSwgICAgIDUwLCAgIC0xNzQsICAgLTY5MCwgICAgIDk2LAorICAgIC00OTMzLCAgIC00MzIsICAgNjc1NywgICAzNzcxLCAgIDEzNTIsICAtMTQ4NSwgICAgLTExLCAgLTI3ODYsCisgICAgIC04NjcsICAgLTExMSwgICAtMTMwLCAgIDIwMzQsICAgIDE3OCwgICAxMTM1LCAgICAgOTksICAtMTU1NSwKKyAgICAgIDQwNywgICAgIDM1LCAgIC01NTcsICAgLTMxMSwgICAgMTUyLCAgIDk3MjYsICAgNDIzMSwgIC0xOTI4LAorICAgICAxNDkwLCAgICAgLTEsICAtNTc3NCwgIC0xMDkyLCAgIC0yMjYsICAgLTEzNSwgICAgLTkwLCAgICAtMzksCisgICAgLTI1MTEsICAgICAxNywgICAxMTQ0LCAgICA0OTgsICAgIC0xMywgICAtODg0LCAgIC0zODQsICAgIDE3NSwKKyAgICAgMjUxMiwgICAgMTkzLCAgIDkwMzMsICAgNTM2MSwgIC0zMTQ4LCAgIC0zODUsICAgICAtMiwgIC00OTgwLAorICAgIC0xNzU0LCAgIC02MDUsICAgIC0yOSwgIC0xMzg1LCAgIC0xMDYsICAgLTgyMiwgICAgLTYzLCAgLTI5NTYsCisgICAgICA0ODIsICAgICAzNywgICAxNzM1LCAgIDEwMzAsICAgODQ2NCwgICAyODQ0LCAgICAgMTIsICAgIDU0OSwKKyAgICAgMjEzMiwgIC00MzczLCAgIC00OTMsICAgICAgMCwgICAgLTE4LCAgIC0yNzcsICAtMTQ2OSwgICAgIC02LAorICAgICAgIC0yLCAgIC0yODQsICAgIC05NSwgICAgICAwLCAgLTExMDEsICAgLTM3MCwgICAgIC0xLCAgICAtNzEsCisgICAgIDIxNDEsICAtMjYwMiwgICA3MTY2LCAgIDkwNDYsICAtMTM1MCwgICAtMjc5LCAgIC00MTMsICAtMzEzNCwKKyAgICAtNDk5NCwgICAtMTExLCAgICAzNDAsICAgLTkzNiwgICAxMTM4LCAgLTExODIsICAgMTQzNiwgIC0zOTU3LAorICAgICAgMTc2LCAgIC0yMTQsICAgIDU5MCwgICAgNzQ1LCAgIC0yNDQsICAgIDI3OCwgIDEzMzA3LCAgIDEyMjcsCisgICAgIC0xNjEsICAgICAtMywgICAgIC00LCAtMTA4MDgsICAgIC05MSwgICAgIC0xLCAgICAgIDQsICAgIDE5OCwKKyAgICAgLTIyNiwgICAgIDE4LCAgICAtMjAsICAgLTk5NywgICAgIC0yLCAgICAgIDIsICAgIDEzMSwgICAgIDEyLAorICAgIC0xOTQ3LCAgIDgyMTcsICAgNjI2OSwgICAgOTE3LCAgLTI1NTksICAgLTIzMSwgIC00MTIxLCAgLTIzOTksCisgICAgICAtNTEsICAgLTM5OSwgICAgOTc2LCAgICA3NDUsICAtMzE0NCwgICAgMTA4LCAgIC00NjAsICAgLTM1MCwKKyAgICAgLTMwNCwgICAxMjgzLCAgICA5NzksICAgIDE0MywgIC0xODEwLCAgIDIwNjEsICAtMjc4MSwgICA2MDU2LAorICAgIDEwMDU4LCAgIC0yMDAsICAgLTI1OSwgICAtNDcyLCAgLTIyMzgsICAtNjE3NCwgICAgMjI3LCAgIC0zMDcsCisgICAgICAzNDksICAgIDY2OSwgICAtNzYxLCAgIDEwMjgsICAgMTExMSwgIC0xMjY1LCAgIDE3MDcsICAtMzcxNywKKyAgICAgNzgyNywgICA5MTYxLCAgLTM0MDksICAgMjQ3MywgIC0xNTEwLCAgLTM3MzksICAtNTEyMiwgICAtNzA5LAorICAgICAtMzczLCAgIC0xMzksICAtNDM3NiwgICAxNjI4LCAgIDE5MDYsICAtMTE4MSwgIC0xMzgyLCAgICA1MTQsCisgICAgICA3MjEsICAgIDg0NCwgICAtMzE0LCAgICAyMjgsICAtMTQzMCwgICA4MzEzLCAgIDk1NDEsICAtMjk1NSwKKyAgICAgMTYyNiwgICAtMTI0LCAgLTQyMTgsICAtNTU1NiwgICAtNTMzLCAgIC0xNjEsICAgIDcyNSwgICAgODMyLAorICAgIC00ODQxLCAgIC0yNTcsICAgMTQ5OSwgICAxNzIxLCAgICAxNDIsICAgLTgyNSwgICAtOTQ3LCAgICAyOTMsCisgICAgIDI4MTksICAtNDI0NywgICA1MzkxLCAgIDg2NzMsICAgMjc1NiwgICAtNDg1LCAgLTExMDEsICAtMTc3NCwKKyAgICAtNDU5MSwgICAtNDYzLCAgICA3MzAsICAgLTkyNywgICAxMzk3LCAgLTE0OTIsICAgMjI0OCwgIC0yODU0LAorICAgICAtNDc0LCAgICA3MTQsICAgLTkwNywgIC0xNDU5LCAgICAxNDEsICAxNDU1MiwgICAgNjkwLCAgICAyNTcsCisgICAgIC0xMTIsICAgICAtMSwgLTEyOTI2LCAgICAtMjksICAgICAtNCwgICAgICAwLCAgIC0xMjUsICAgICAtNSwKKyAgICAgLTYxMywgICAgIC0yLCAgIC0yMjgsICAgIC0xMCwgICAgICAwLCAgICAgOTksICAgICAgNCwgICAgICAxLAorICAgIDExOTM4LCAgLTE4NTksICAgMTgwNiwgICAtOTYyLCAgIC04ODQsICAtODY5OSwgICAtMjExLCAgIC0xOTksCisgICAgICAtNTYsICAgIC00NywgICAxMzU1LCAgLTEzMTYsICAgIDIwNSwgICAgNzAxLCAgIC0xMDksICAgIDEwNiwKKyAgICAgIDY0NCwgICAtMTAwLCAgICAgOTcsICAgIC01MSwgICAzNzI4LCAgIDE5ODIsICAgMjI2NCwgICA0NTg0LAorICAgICAzMTMxLCAgIC04NDgsICAgLTIzOSwgICAtMzEyLCAgLTEyODIsICAgLTU5OCwgICAtNDUxLCAgIC01MTUsCisgICAgIC0yNzMsICAtMTA0MywgICAtNTU0LCAgIC02MzMsICAgLTcxMiwgICAtMzc4LCAgIC00MzIsICAgLTg3NiwKKyAgICAtMTE4MSwgICAgNzY2LCAgICA3MjAsICAxNDMwMywgICAtMjE2LCAgICAtODUsICAgIC0zNSwgICAgLTMxLAorICAgLTEyNDg2LCAgICAgLTIsICAgICA1NSwgICAgIDUxLCAgICAtMzMsICAgMTAzMSwgICAtNjY4LCAgIC02MjgsCisgICAgICAtMTUsICAgICAxMCwgICAgICA5LCAgICAxODksICAtNDM4NSwgICA0ODI2LCAgMTAxMTIsICAgMTU2OSwKKyAgICAgMzM4OCwgIC0xMTczLCAgLTE0MjEsICAtNjI0MiwgICAtMTUwLCAgIC03MDAsICAgMTI5MSwgICAyNzA2LAorICAgIC0yOTc5LCAgICA0MjAsICAgLTQ2MiwgICAtOTY5LCAgICA5MDYsICAgLTk5OCwgIC0yMDkxLCAgIC0zMjQsCisgICAgIC00NDgsICAgMTkzMiwgIDE1NTkxLCAgLTE4NDIsICAgIDY1NywgICAgLTEyLCAgIC0yMjcsIC0xNDgzNywKKyAgICAgLTIwNywgICAgLTI2LCAgICAgNTIsICAgIDQyNywgIC0xODM4LCAgICAtNTAsICAgIDIxNywgICAxNzUzLAorICAgICAgIDE4LCAgICAtNzcsICAgLTYyNiwgICAgIDc0LCAgLTQxNDEsICAgMTg0NCwgICAzOTYyLCAgIDU1MTcsCisgICAgIDYyMjAsICAtMTA0NiwgICAtMjA3LCAgIC05NTgsICAtMTg1OCwgIC0yMzYxLCAgICA0NjYsICAgMTAwMSwKKyAgICAgLTQ0NiwgICAxMzk0LCAgIC02MjEsICAtMTMzNCwgICAxNTcyLCAgIC03MDAsICAtMTUwNCwgIC0yMDk0LAorICAgICAgNzI5LCAgLTIyOTksICAxNDc1NSwgICAzNjU3LCAgIC05NTIsICAgIC0zMiwgICAtMzIyLCAtMTMyODgsCisgICAgIC04MTYsICAgIC01NSwgICAgMTAyLCAgIC02NTYsICAgMjA3MSwgICAtMTYyLCAgICA1MTMsICAtMzI5NCwKKyAgICAgICA0MiwgICAtMTMzLCAgICA4NTcsICAgIDIxMiwgIC0xMzg1LCAgIDU4MDEsICAxMzMzOSwgIC0zMTM3LAorICAgICAxMzQ0LCAgIC0xMTcsICAtMjA1NCwgLTEwODYxLCAgIC02MDAsICAgLTExMCwgICAgNDkwLCAgIDExMjcsCisgICAgLTQ3MjMsICAgLTI2NSwgICAxMTExLCAgIDI1NTQsICAgIDExMywgICAtNDc2LCAgLTEwOTQsICAgIDI1NywKKyAgICAgNDcxMCwgICA5NjYxLCAgIDEwNzMsICAtMjQ2NywgICAzMjc0LCAgLTEzNTQsICAtNTY5NywgICAgLTcwLAorICAgICAtMzcxLCAgIC02NTQsICAtMjc3NywgICAtMzA4LCAgIC02MzMsICAgIDcwOSwgICAxNDU1LCAgICAxNjEsCisgICAgIC05NDEsICAtMTkzMCwgICAtMjE0LCAgICA0OTMsICAgMTg0MywgIC0zNjI0LCAgMTI0MjIsICAgNjg5OCwKKyAgICAtMTU1OSwgICAtMjA3LCAgIC04MDIsICAtOTQxOSwgIC0yOTA0LCAgIC0xNDgsICAgIDQwNywgIC0xMzk3LAorICAgICAyNzQ4LCAgIC03NzUsICAgMTUyNiwgIC01MjMwLCAgICAxNzUsICAgLTM0NCwgICAxMTgyLCAgICA2NTYsCisgICAgIDE0MzMsICAgMjM5NCwgICAyNTA3LCAgIDEzODAsICAgODc4MCwgICAtMTI1LCAgIC0zNDksICAgLTM4MywKKyAgICAgLTExNiwgIC00NzA1LCAgIC0yMDksICAgLTIxOSwgICAtMzY2LCAgIC0xMjAsICAgLTIwMSwgICAtMjExLAorICAgICAtNzY4LCAgLTEyODMsICAtMTM0MywgICAtNzQwLCAgLTE3MTIsICAxMjkxNSwgICA1ODgzLCAgLTIxOTcsCisgICAgICA5OTEsICAgLTE3OSwgLTEwMTgxLCAgLTIxMTIsICAgLTI5NCwgICAgLTYwLCAgIDEzNTAsICAgIDYxNSwKKyAgICAtNDYzOCwgICAtMjI5LCAgIDE3MzIsICAgIDc4OSwgICAgMTAzLCAgIC03ODEsICAgLTM1NiwgICAgMTMzLAorICAgIDE1MDcyLCAgIDIxNTgsICAtMTI0NSwgICAgOTEwLCAgIC00OTYsIC0xMzg2NSwgICAtMjg0LCAgICAtOTQsCisgICAgICAtNTAsICAgIC0xNSwgIC0xOTg2LCAgIDExNDUsICAgIDE2NCwgICAtODM3LCAgIC0xMTksICAgICA2OSwKKyAgICAgIDQ1NiwgICAgIDY1LCAgICAtMzcsICAgICAyNywgICA0NjU1LCAgIDczMTksICAgNDkxNiwgICAgNTg2LAorICAgIC0zMzgxLCAgLTEzMjIsICAtMzI3MCwgIC0xNDc1LCAgICAtMjAsICAgLTY5NywgIC0yMDc5LCAgLTEzOTYsCisgICAgLTIxOTYsICAgLTE2NiwgICAtMjYxLCAgIC0xNzUsICAgIDk2MCwgICAxNTEwLCAgIDEwMTQsICAgIDEyMCwKKyAgICAgMTE5MSwgIC0yMTQwLCAgIDUxMjAsICAxMzQ5OCwgIC0xNDE4LCAgICAtODYsICAgLTI3OSwgIC0xNjAwLAorICAgLTExMTIxLCAgIC0xMjIsICAgIDE1NSwgICAtMzcyLCAgICA2NjksICAgLTk4MSwgICAxNzYzLCAgLTQyMTgsCisgICAgICAxMDMsICAgLTE4NSwgICAgNDQzLCAgIDExNjgsICAtMTUzMCwgICAtODE3LCAgIDgxOTEsICAgOTYzMiwKKyAgICAtMTQ1MiwgICAtMTQzLCAgICAtNDAsICAtNDA5NSwgIC01NjYzLCAgIC0xMjgsICAgIC03NiwgICAgNzY1LAorICAgICAgNDA4LCAgICA5MDAsICAgIDQ4MCwgIC00ODE1LCAgIC0xMzUsICAgIC03MiwgICAgNzI2LCAgICA4NTQsCisgICAgLTMyMzYsICAgIDYwNywgICAxNjk2LCAgLTIxMDYsICAxMTQ4NSwgICAtNjM5LCAgICAtMjIsICAgLTE3NSwKKyAgICAgLTI3MCwgIC04MDUxLCAgICAxMTksICAgIDMzNSwgICAgLTYyLCAgIC00MTYsICAgICA3OCwgICAgMjE4LAorICAgICAyMjY4LCAgIC00MjUsICAtMTE4OSwgICAxNDc2LCAgIDMyMDMsICAtMTkwMywgICAtODM3LCAgIDk2NzksCisgICAgIDcwNTcsICAgLTYyNiwgICAtMjIxLCAgICAtNDIsICAtNTcxOCwgIC0zMDM5LCAgICAzNzIsICAgIDE2MywKKyAgICAgIC05NywgIC0xODkyLCAgIDExMjQsICAgIDQ5NCwgIC0xMzgwLCAgICA4MTksICAgIDM2MCwgIC00MTY5LAorICAgICAgMjEzLCAgIC02NTUsICAxNzAxNSwgICAgNjIwLCAgIC0zODQsICAgICAtMiwgICAgLTI2LCAtMTc2NzEsCisgICAgICAtMjMsICAgICAtOSwgICAgICA4LCAgIC0yMjEsICAgIDY4MSwgICAgIC04LCAgICAgMjQsICAgLTY0NCwKKyAgICAgICAgNSwgICAgLTE1LCAgICAzOTksICAgICAxNCwgICA1MDg4LCAgICAgMzUsICAtMzMzOSwgICAzNzI2LAorICAgICA4NDg4LCAgLTE1ODAsICAgICAgMCwgICAtNjgwLCAgIC04NDcsICAtNDM5NywgICAgLTEwLCAgIDEwMzcsCisgICAgICAgIDcsICAtMTE1NywgICAgIC04LCAgICA3NTksICAtMjYzNiwgICAgLTE4LCAgIDE3MzAsICAtMTkzMCwKKyAgICAgLTk4OCwgICAxNDU0LCAgLTI2ODgsICAxNTAzOSwgICAyNjgyLCAgICAtNTksICAgLTEyOSwgICAtNDQxLAorICAgLTEzODA1LCAgIC00MzksICAgICA4NywgICAtMTYyLCAgICAyMzgsICAgIDkwNywgIC0xMzM1LCAgIDI0NjcsCisgICAgICAxNjEsICAgLTIzOCwgICAgNDQwLCAgLTI0NjIsICAtNDg2NSwgIC0yODQyLCAgICAtNTMsICAgNTQ5NSwKKyAgICAgNjUyMywgIC0xNDQ1LCAgIC00OTMsICAgICAgMCwgIC0xODQzLCAgLTI1OTcsICAgLTg0NCwgICAgLTE2LAorICAgICAgIC05LCAgIDE2MzIsICAgIDk1MywgICAgIDE4LCAgIDE5MzcsICAgMTEzMSwgICAgIDIxLCAgLTIxODgsCisgICAgIDMwNzYsICAxNTA2OSwgIC0yOTE0LCAgIDE4MTAsICAgLTk3MSwgICAtNTc3LCAtMTM4NjAsICAgLTUxOCwKKyAgICAgLTIwMCwgICAgLTU3LCAgLTI4MjksICAgIDU0NywgICAyNjgwLCAgIC0zMzksICAtMTY2NSwgICAgMzIyLAorICAgICAgMTgyLCAgICA4OTMsICAgLTE3MiwgICAgMTA3LCAgIDEzMTEsICAgNTM1NSwgIDExMDU0LCAgIDIyOTksCisgICAgLTM2NTQsICAgLTEwNSwgIC0xNzUwLCAgLTc0NTgsICAgLTMyMiwgICAtODE0LCAgIC00MjgsICAgLTg4NSwKKyAgICAtMzYxMywgICAtMTg0LCAgIC03NTEsICAtMTU1MSwgICAgMjkyLCAgIDExOTQsICAgMjQ2NSwgICAgNTEyLAorICAgICA0MDM1LCAgIDU2MTksICAgNDYxOCwgICAxODE1LCAgIDE5MTIsICAgLTk5NCwgIC0xOTI3LCAgLTEzMDEsCisgICAgIC0yMDEsICAgLTIyMywgIC0xMzg0LCAgLTExMzcsICAtMTU4MywgICAtNDQ3LCAgIC02MjIsICAgLTUxMSwKKyAgICAgLTQ3MSwgICAtNjU2LCAgIC01MzksICAgLTIxMSwgIC0yMTMxLCAgIDI3NTQsICAtNDUwMSwgIDEyODc5LAorICAgICA3NDMyLCAgIC0yNzcsICAgLTQ2MywgIC0xMjM2LCAtMTAxMjQsICAtMzM3MSwgICAgMzU4LCAgIC01ODUsCisgICAgICA3NTYsICAgMTY3NSwgIC0yMTY1LCAgIDM1MzgsICAgIDk2NywgIC0xMjQ5LCAgIDIwNDIsICAtNTg0MiwKKyAgICAgNTYxOCwgICAtNTE1LCAgIDMyMTksICAtNDE0OSwgICA0ODU3LCAgLTE5MjYsICAgIC0xNiwgICAtNjMyLAorICAgIC0xMDUwLCAgLTE0NDAsICAgIDE3NiwgIC0xMTA0LCAgICAxMDEsICAgMTQyMiwgICAtMTMwLCAgICA4MTUsCisgICAgLTE2NjYsICAgIDE1MiwgICAtOTU0LCAgIDEyMzAsICAgMTgzOCwgIC0xNzA5LCAgIDExMzksICAxNjg2NywKKyAgICAgIDcxNiwgICAtMjA2LCAgIC0xNzgsICAgIC03OSwgLTE3MzY2LCAgICAtMzEsICAgIDE5MSwgICAtMTI3LAorICAgICAgMTE4LCAgLTE4OTIsICAgMTc1OSwgIC0xMTczLCAgICAtODAsICAgICA3NCwgICAgLTQ5LCAgIC03MzcsCisgICAgIDE5NzgsICAtMzg0NSwgIDEwMDUwLCAgMTE4NTQsICAtMjQ5MiwgICAtMjM4LCAgIC05MDIsICAtNjE2NCwKKyAgICAtODU3NiwgICAtMzc5LCAgICA0NjQsICAtMTIxMywgICAyMzU4LCAgLTE0MzEsICAgMjc4MiwgIC03MjcxLAorICAgICAgMzAxLCAgIC01ODUsICAgMTUyOSwgICAxODAzLCAgLTI2MDAsICAxMTI0NiwgIDExMjg5LCAgLTM2NDcsCisgICAgIDE0NjMsICAgLTQxMiwgIC03NzIwLCAgLTc3NzgsICAgLTgxMiwgICAtMTMwLCAgIDE3ODQsICAgMTc5MSwKKyAgICAtNzc0OSwgICAtNTc4LCAgIDI1MDQsICAgMjUxMywgICAgMjMyLCAgLTEwMDQsICAtMTAwOCwgICAgMzI1LAorICAgICAzNDQyLCAgICA5MDcsICAgMjcyNSwgICA4OTcwLCAgIDM2MzgsICAgLTcyMywgICAgLTUwLCAgIC00NTMsCisgICAgLTQ5MTEsICAgLTgwOCwgICAtMTkwLCAgIC01NzIsICAgLTE1MCwgIC0xODg0LCAgIC00OTYsICAtMTQ5MiwKKyAgICAgLTc2NCwgICAtMjAxLCAgIC02MDUsICAtMTk5MiwgICAtMTI2LCAgMTc0OTgsICAgMzQ4MSwgIC0yMDAzLAorICAgICAxMDkwLCAgICAgIDAsIC0xODY4OSwgICAtNzM5LCAgIC0yNDQsICAgIC03MiwgICAgMTM1LCAgICAgMjYsCisgICAgLTM3MTcsICAgIC0xNSwgICAyMTM5LCAgICA0MjUsICAgICAgOCwgIC0xMTY1LCAgIC0yMzEsICAgIDEzMywKKyAgICAtMTgxNCwgICAxMDQ4LCAgLTIxNjQsICAgNDA3MCwgIDE2MjcyLCAgIC0yMDAsICAgIC02NywgICAtMjg1LAorICAgIC0xMDExLCAtMTYxNjAsICAgIDExNiwgICAtMjM5LCAgICAxMzgsICAgIDQ1MCwgICAtMjYwLCAgICA1MzcsCisgICAgIDE4MDEsICAtMTA0MSwgICAyMTQ5LCAgLTQwNDIsICAgOTM1NCwgIDEyNTgwLCAgLTE4ODMsICAgIDk2MiwKKyAgICAgLTYxNywgIC01MzQxLCAgLTk2NjAsICAgLTIxNiwgICAgLTU2LCAgICAtMjMsICAtNzE4MywgICAxMDc1LAorICAgICAxNDQ2LCAgIC01NDksICAgLTczOCwgICAgMTEwLCAgICAzNTIsICAgIDQ3NCwgICAgLTcxLCAgICAgMzYsCisgICAgIDE3MDgsICAgNDE5OSwgICA3Mzg3LCAgIDYzMzUsICAgMTAwMywgICAtMTc4LCAgLTEwNzYsICAtMzMzMCwKKyAgICAtMjQ0OSwgICAgLTYxLCAgIC00MzcsICAgLTc3MCwgIC0xODkzLCAgIC02NjAsICAtMTYyMywgIC0yODU2LAorICAgICAtMTA0LCAgIC0yNTcsICAgLTQ1MiwgICAtMzg4LCAgLTI2MjQsICAgNTYyMywgIDE3MzEwLCAgLTIzNTMsCisgICAgICA1OTIsICAgLTQyMCwgIC0xOTMwLCAtMTgyODgsICAgLTMzOCwgICAgLTIxLCAgICA5MDAsICAgMjc3MiwKKyAgICAtNTk0MSwgICAtMzc2LCAgICA4MDcsICAgMjQ4NiwgICAgIDk0LCAgIC0yMDMsICAgLTYyNSwgICAgIDg1LAorICAgICAxMjExLCAgIC04NTAsICAgMTE5MywgIC0xOTI2LCAgMTU5OTIsICAgIC04OSwgICAgLTQ0LCAgICAtODYsCisgICAgIC0yMjYsIC0xNTYwOSwgICAgIDYyLCAgICAtODgsICAgICA2MSwgICAgMTQyLCAgIC0xMDAsICAgIDE0MCwKKyAgICAtMTE4MiwgICAgODMwLCAgLTExNjUsICAgMTg4MCwgICAzOTgzLCAgLTIwNTQsICAxMTUwNiwgICAgLTE5LAorICAgICAzNjIyLCAgIC05NjgsICAgLTI1NywgIC04MDgwLCAgICAgIDAsICAgLTgwMSwgICAgNDk5LCAgLTI3OTcsCisgICAgIDE0NDIsICAgICAgNCwgICAgIC0yLCAgICAgMTMsICAgLTg4MCwgICAgNDU0LCAgLTI1NDQsICAgICAgNCwKKyAgICAgLTc4NiwgIC0xMzU0LCAgMTYwOTIsICAgNzI0NiwgIC0xNjY1LCAgICAtMzcsICAgLTExMSwgLTE1ODA1LAorICAgIC0zMjA1LCAgIC0xNjksICAgIC02NSwgICAgNzcyLCAgIDEzMzAsICAgIDM0OCwgICAgNTk5LCAgLTcxMTcsCisgICAgICAtODAsICAgLTEzNywgICAxNjM2LCAgICA3MzYsICAtNDMxNiwgICAtNTExLCAgIDY2NzQsICAxMTY2NSwKKyAgICAgNDYzMywgIC0xMTM3LCAgICAtMTUsICAtMjcxOSwgIC04MzA1LCAgLTEzMTAsICAgLTEzNCwgICAxNzU4LAorICAgICAgMjA4LCAgIDMwNzMsICAgIDM2NCwgIC00NzUyLCAgIDEyMjAsICAgIDE0NCwgIC0xODg3LCAgLTMyOTksCisgICAgIDc5MTIsICAgNDU1NywgICAxOTM3LCAgIDE4ODUsICAgNzAzNywgIC0zODIxLCAgLTEyNjcsICAgLTIyOSwKKyAgICAgLTIxNiwgIC0zMDIyLCAgLTIyMDAsICAgLTkzNSwgICAtNTM4LCAgIC05MTAsICAgLTUyNCwgICAtMjIyLAorICAgIC0zMzk4LCAgLTE5NTcsICAgLTgzMiwgICAtODA5LCAgIDM0MzQsICAgMjk2NywgICA1ODY3LCAgIDgxOTYsCisgICAgIDg3NjYsICAgLTcyMCwgICAtNTM3LCAgLTIxMDEsICAtNDEwMCwgIC00NjkwLCAgIC02MjIsICAtMTIzMCwKKyAgICAtMTA2MiwgIC0xNzE4LCAgLTE0ODQsICAtMjkzNSwgIC0xODM3LCAgLTE1ODgsICAtMzEzOSwgIC00Mzg1LAorICAgICA1ODgxLCAgIDkxNzYsICAgODExOSwgICAzOTM0LCAgIDMzNTUsICAtMjExMSwgIC01MTM5LCAgLTQwMjMsCisgICAgIC05NDQsICAgLTY4NywgIC0zMjk0LCAgLTI5MTQsICAtNDU0NywgIC0xNDEyLCAgLTIyMDMsICAtMTk0OSwKKyAgICAtMTIwNCwgIC0xODc5LCAgLTE2NjIsICAgLTgwNQorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgYWRhcHRpdmVfY2JfZ2FpbjE3MFsxNzAgKiAyMF0gPSB7CisgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICA3NzYsICAgIDIxMiwgICAgNzE1LCAgICA2NzAsCisgICAgICA4MDksICAgIC0zNiwgICAgIC0yLCAgICAtMzEsICAgIC0yNywgICAgLTM5LCAgICAtMTAsICAgIC0zMywKKyAgICAgICAtOSwgICAgLTMxLCAgICAgLTgsICAgIC0yOSwgICAgLTM4LCAgICAtMTAsICAgIC0zNSwgICAgLTMzLAorICAgICAxMjk2LCAgIDEzMTYsICAgLTE2OCwgICAtMzIwLCAgIC04MTUsICAgLTEwMiwgICAtMTA1LCAgICAgLTEsCisgICAgICAgLTYsICAgIC00MCwgICAtMTA0LCAgICAgMTMsICAgICAxMywgICAgIDI1LCAgICAgMjUsICAgICAtMywKKyAgICAgICA2NCwgICAgIDY1LCAgICAgLTgsICAgIC0xNSwgICAtNTg5LCAgICA2ODAsICAgMjQ3OCwgICAgMzA4LAorICAgICAtNTk2LCAgICAtMjEsICAgIC0yOCwgICAtMzc1LCAgICAgLTUsICAgIC0yMSwgICAgIDI0LCAgICAgODksCisgICAgIC0xMDIsICAgICAxMSwgICAgLTEyLCAgICAtNDYsICAgIC0yMSwgICAgIDI0LCAgICAgOTAsICAgICAxMSwKKyAgICAgLTczNSwgICAtNDg3LCAgICAgLTUsICAgMjk0OCwgICAgNDY4LCAgICAtMzMsICAgIC0xNCwgICAgICAwLAorICAgICAtNTMwLCAgICAtMTMsICAgIC0yMSwgICAgICAwLCAgICAgIDAsICAgIDEzMiwgICAgIDg3LCAgICAgIDAsCisgICAgICAgMjEsICAgICAxMywgICAgICAwLCAgICAtODQsICAgMTA0MiwgICAxNzMwLCAgIDEwNjgsICAgIDMzMywKKyAgICAgIDYyNiwgICAgLTY2LCAgIC0xODIsICAgIC02OSwgICAgIC02LCAgICAtMjMsICAgLTExMCwgICAgLTY3LAorICAgICAtMTEyLCAgICAtMjEsICAgIC0zNSwgICAgLTIxLCAgICAtMzksICAgIC02NiwgICAgLTQwLCAgICAtMTIsCisgICAgICA0ODYsICAgLTc2OSwgICA0MDc0LCAgIDI4MjUsICAtMTEwNywgICAgLTE0LCAgICAtMzYsICAtMTAxMywKKyAgICAgLTQ4NywgICAgLTc0LCAgICAgMjIsICAgLTEyMCwgICAgMTkxLCAgICAtODMsICAgIDEzMiwgICAtNzAyLAorICAgICAgIDMyLCAgICAtNTIsICAgIDI3NSwgICAgMTkxLCAgIDE1MjEsICAgLTc2NywgICAtMTI0LCAgIDQzMjAsCisgICAgIDEwMjYsICAgLTE0MSwgICAgLTM1LCAgICAgIDAsICAtMTEzOSwgICAgLTY0LCAgICAgNzEsICAgICAxMSwKKyAgICAgICAtNSwgICAtNDAxLCAgICAyMDIsICAgICAzMiwgICAgLTk1LCAgICAgNDgsICAgICAgNywgICAtMjcwLAorICAgICAyNDI1LCAgIDEyNjcsICAgMzQzOSwgICAgLTkxLCAgLTExNjYsICAgLTM1OSwgICAgLTk4LCAgIC03MjIsCisgICAgICAgIDAsICAgIC04MywgICAtMTg3LCAgIC01MDksICAgLTI2NiwgICAgIDEzLCAgICAgIDcsICAgICAxOSwKKyAgICAgIDE3MiwgICAgIDkwLCAgICAyNDQsICAgICAtNiwgIC0xMjUxLCAgICA5NzUsICAgIDE3MywgICA0MDM5LAorICAgICAyMDA1LCAgICAtOTUsICAgIC01OCwgICAgIC0xLCAgIC05OTYsICAgLTI0NSwgICAgIDc0LCAgICAgMTMsCisgICAgICAtMTAsICAgIDMwOCwgICAtMjQwLCAgICAtNDIsICAgIDE1MywgICAtMTE5LCAgICAtMjEsICAgLTQ5NCwKKyAgICAgMTgyMCwgICAgNjMyLCAgIDEzMjIsICAgMjA2MiwgICAxMDMxLCAgIC0yMDIsICAgIC0yNCwgICAtMTA2LAorICAgICAtMjU5LCAgICAtNjQsICAgIC03MCwgICAtMTQ2LCAgICAtNTEsICAgLTIyOSwgICAgLTc5LCAgIC0xNjYsCisgICAgIC0xMTQsICAgIC0zOSwgICAgLTgzLCAgIC0xMjksICAgLTQ0NywgICA0OTA0LCAgICAyNDQsICAgLTMxNSwKKyAgICAtMjAzOCwgICAgLTEyLCAgLTE0NjcsICAgICAtMywgICAgIC02LCAgIC0yNTMsICAgIDEzNCwgICAgICA2LAorICAgICAgLTczLCAgICAgLTgsICAgICA5NCwgICAgICA0LCAgICAtNTUsICAgIDYxMCwgICAgIDMwLCAgICAtMzksCisgICAgIC0yMDgsICAtMTEwMiwgICAgNDYzLCAgIC00NDgsICAgNTY1MywgICAgIC0yLCAgICAtNzQsICAgIC0xMywKKyAgICAgIC0xMiwgIC0xOTUwLCAgICAtMTQsICAgICAgNSwgICAgIDMxLCAgICAgLTUsICAgIC0zMCwgICAgIDEyLAorICAgICAgIDcxLCAgICAzODAsICAgLTE1OSwgICAgMTU0LCAgIDQ3MzksICAgMjYwMCwgIC0xODY0LCAgICA4NTYsCisgICAgLTE1NTQsICAtMTM3MSwgICAtNDEyLCAgIC0yMTIsICAgIC00NCwgICAtMTQ3LCAgIC03NTIsICAgIDUzOSwKKyAgICAgIDI5NSwgICAtMjQ3LCAgIC0xMzUsICAgICA5NywgICAgNDQ5LCAgICAyNDYsICAgLTE3NiwgICAgIDgxLAorICAgICAxODk0LCAgIDM1MzMsICAgICAzNSwgICAgLTI2LCAgIDIxNDUsICAgLTIxOSwgICAtNzYyLCAgICAgIDAsCisgICAgICAgIDAsICAgLTI4MCwgICAtNDA4LCAgICAgLTQsICAgICAtNywgICAgICAzLCAgICAgIDUsICAgICAgMCwKKyAgICAgLTI0OCwgICAtNDYyLCAgICAgLTQsICAgICAgMywgIC0yNjk5LCAgIDE4NDEsICAgNDA3MiwgICAyNDQzLAorICAgICAxNTgyLCAgIC00NDQsICAgLTIwNywgIC0xMDEyLCAgIC0zNjQsICAgLTE1MiwgICAgMzAzLCAgICA2NzAsCisgICAgIC00NTcsICAgIDQwMiwgICAtMjc0LCAgIC02MDcsICAgIDI2MCwgICAtMTc3LCAgIC0zOTMsICAgLTIzNiwKKyAgICAgLTg0NCwgICAzMzU4LCAgIDYxMDYsICAtMTA1OSwgICAtNTM3LCAgICAtNDMsICAgLTY4OCwgIC0yMjc1LAorICAgICAgLTY4LCAgICAtMTcsICAgIDE3MywgICAgMzE0LCAgLTEyNTEsICAgIC01NCwgICAgMjE3LCAgICAzOTUsCisgICAgICAtMjcsICAgIDExMCwgICAgMjAwLCAgICAtMzQsICAgMTI1MSwgICAxMDE2LCAgIDMwMjAsICAgMjIxMCwKKyAgICAgMTQ0NSwgICAgLTk1LCAgICAtNjMsICAgLTU1NiwgICAtMjk4LCAgIC0xMjcsICAgIC03NywgICAtMjMwLAorICAgICAtMTg3LCAgIC0xNjgsICAgLTEzNywgICAtNDA3LCAgIC0xMTAsICAgIC04OSwgICAtMjY2LCAgIC0xOTQsCisgICAgIDIwOTksICAgMjI3NywgICA0MDM4LCAgIDM1MzMsICAtMjg3MCwgICAtMjY5LCAgIC0zMTYsICAgLTk5NSwKKyAgICAgLTc2MiwgICAtNTAzLCAgIC0yOTEsICAgLTUxNywgICAtNTYxLCAgIC00NTIsICAgLTQ5MSwgICAtODcxLAorICAgICAgMzY3LCAgICAzOTksICAgIDcwNywgICAgNjE5LCAgICA0MDAsICAtMTExNCwgICA4NTE2LCAgIDI0MjIsCisgICAgLTExMTcsICAgICAtOSwgICAgLTc1LCAgLTQ0MjYsICAgLTM1OCwgICAgLTc2LCAgICAgMjcsICAgLTIwOCwKKyAgICAgIDU3OSwgICAgLTU5LCAgICAxNjQsICAtMTI1OSwgICAgIDI3LCAgICAtNzUsICAgIDU4MCwgICAgMTY1LAorICAgIC00Mzk4LCAgLTIwMTEsICAgMzkxMiwgIC0yNDA3LCAgIDIyNTgsICAtMTE4MCwgICAtMjQ3LCAgIC05MzQsCisgICAgIC0zNTMsICAgLTMxMSwgICAtNTQwLCAgIDEwNTAsICAgIDQ4MCwgICAtNjQ2LCAgIC0yOTUsICAgIDU3NSwKKyAgICAgIDYwNiwgICAgMjc3LCAgIC01MzksICAgIDMzMSwgICAxNzY3LCAgLTE0NDcsICAgNDI0MCwgICA2MTYwLAorICAgICAtNzU3LCAgIC0xOTAsICAgLTEyNywgIC0xMDk3LCAgLTIzMTYsICAgIC0zNSwgICAgMTU2LCAgIC00NTcsCisgICAgICAzNzQsICAgLTY2NCwgICAgNTQ0LCAgLTE1OTQsICAgICA4MSwgICAgLTY2LCAgICAxOTUsICAgIDI4NCwKKyAgICAgMTU5NCwgIC0xNDYzLCAgIDEwMzUsICAgNjkzOCwgICAxOTIwLCAgIC0xNTUsICAgLTEzMCwgICAgLTY1LAorICAgIC0yOTM4LCAgIC0yMjUsICAgIDE0MiwgICAtMTAwLCAgICAgOTIsICAgLTY3NSwgICAgNjE5LCAgIC00MzgsCisgICAgIC0xODYsICAgIDE3MSwgICAtMTIxLCAgIC04MTMsICAgLTU2MiwgICA0NzE2LCAgIDQwODUsICAgLTU5MSwKKyAgICAgMjQyMSwgICAgLTE5LCAgLTEzNTcsICAtMTAxOCwgICAgLTIxLCAgIC0zNTcsICAgIDE2MiwgICAgMTQwLAorICAgIC0xMTc1LCAgICAtMjAsICAgIDE3MCwgICAgMTQ3LCAgICAgODMsICAgLTY5NiwgICAtNjAzLCAgICAgODcsCisgICAgIDE1NTIsICAgODc3OCwgICAtOTM1LCAgICAzNTQsICAtMTQyNCwgICAtMTQ3LCAgLTQ3MDMsICAgIC01MywKKyAgICAgICAtNywgICAtMTIzLCAgIC04MzEsICAgICA4OCwgICAgNTAxLCAgICAtMzMsICAgLTE4OSwgICAgIDIwLAorICAgICAgMTM0LCAgICA3NjMsICAgIC04MSwgICAgIDMwLCAgIDQ4MzEsICAtNDQzMSwgICAgIDQxLCAgLTE0NzksCisgICAgLTI5NzYsICAtMTQyNCwgIC0xMTk4LCAgICAgIDAsICAgLTEzMywgICAtNTQwLCAgIDEzMDYsICAgIC0xMiwKKyAgICAgICAxMSwgICAgNDM2LCAgIC00MDAsICAgICAgMywgICAgODc3LCAgIC04MDQsICAgICAgNywgICAtMjY4LAorICAgICAyMDkwLCAgIDExOTIsICAgMTAwNiwgICAxNjQ1LCAgIDQ4NTMsICAgLTI2NiwgICAgLTg2LCAgICAtNjEsCisgICAgIC0xNjUsICAtMTQzNywgICAtMTUyLCAgIC0xMjgsICAgIC03MywgICAtMjEwLCAgIC0xMTksICAgLTEwMSwKKyAgICAgLTYxOSwgICAtMzUzLCAgIC0yOTgsICAgLTQ4NywgICAyMzg2LCAgIDU3MTIsICAgMTQyNiwgICAgLTk0LAorICAgICAxMzUwLCAgIC0zNDcsICAtMTk5MSwgICAtMTI0LCAgICAgIDAsICAgLTExMSwgICAtODMyLCAgIC0yMDcsCisgICAgIC00OTcsICAgICAxMywgICAgIDMyLCAgICAgIDgsICAgLTE5NiwgICAtNDcwLCAgIC0xMTcsICAgICAgNywKKyAgICAtMTM0OSwgICAxMDkxLCAgIDE2NTksICAgODg5MSwgICAgMzEzLCAgIC0xMTEsICAgIC03MiwgICAtMTY4LAorICAgIC00ODI1LCAgICAgLTUsICAgICA4OSwgICAgMTM2LCAgIC0xMTAsICAgIDczMiwgICAtNTkyLCAgIC05MDAsCisgICAgICAgMjUsICAgIC0yMCwgICAgLTMxLCAgIC0xNzAsICAgOTk4MCwgICAgOTE2LCAgIC0zODEsICAgLTgwOCwKKyAgICAgICA4OCwgIC02MDgwLCAgICAtNTEsICAgICAtOCwgICAgLTM5LCAgICAgIDAsICAgLTU1OCwgICAgMjMyLAorICAgICAgIDIxLCAgICA0OTIsICAgICA0NSwgICAgLTE4LCAgICAtNTMsICAgICAtNCwgICAgICAyLCAgICAgIDQsCisgICAgIDIzMzgsICAtMTAzMSwgICAtMjQ4LCAgIDM5MjgsICAgNjQ4NCwgICAtMzMzLCAgICAtNjQsICAgICAtMywKKyAgICAgLTk0MiwgIC0yNTY2LCAgICAxNDcsICAgICAzNSwgICAgLTE1LCAgIC01NjAsICAgIDI0NywgICAgIDU5LAorICAgICAtOTI1LCAgICA0MDgsICAgICA5OCwgIC0xNTU1LCAgIDYxNjYsICAtMTI0MCwgICAtMzM3LCAgIDM2NzIsCisgICAgLTEyNzcsICAtMjMyMCwgICAgLTkzLCAgICAgLTYsICAgLTgyMywgICAgLTk5LCAgICA0NjYsICAgIDEyNiwKKyAgICAgIC0yNSwgIC0xMzgyLCAgICAyNzgsICAgICA3NSwgICAgNDgwLCAgICAtOTYsICAgIC0yNiwgICAgMjg2LAorICAgICA0Mzc3LCAgIC0xMzIsICAtMjU4OCwgICAxNzAxLCAgIDQ4NjUsICAtMTE2OSwgICAgIC0xLCAgIC00MDksCisgICAgIC0xNzYsICAtMTQ0NCwgICAgIDM1LCAgICA2OTEsICAgIC0yMCwgICAtNDU0LCAgICAgMTMsICAgIDI2OCwKKyAgICAtMTI5OSwgICAgIDM5LCAgICA3NjgsICAgLTUwNSwgICAyNTk0LCAgIDMyOTUsICAgMzk0NCwgICAxNDgxLAorICAgICAgNjgyLCAgIC00MTAsICAgLTY2MiwgICAtOTQ5LCAgIC0xMzMsICAgIC0yOCwgICAtNTIxLCAgIC02MjQsCisgICAgIC03OTMsICAgLTIzNCwgICAtMjk3LCAgIC0zNTYsICAgLTEwOCwgICAtMTM3LCAgIC0xNjQsICAgIC02MSwKKyAgICAgNDE1MSwgICAgNjI0LCAgICA4MTUsICAgNDQ4NSwgICAyMjI5LCAgLTEwNTIsICAgIC0yMywgICAgLTQwLAorICAgIC0xMjI4LCAgIC0zMDMsICAgLTE1OCwgICAtMjA2LCAgICAtMzEsICAtMTEzNiwgICAtMTcwLCAgIC0yMjMsCisgICAgIC01NjUsICAgIC04NCwgICAtMTExLCAgIC02MTAsICAtMzU3NSwgICAtMzYxLCAgIDQ5MjQsICAgMjc5MSwKKyAgICAgNDY5OCwgICAtNzgwLCAgICAgLTcsICAtMTQ4MCwgICAtNDc1LCAgLTEzNDcsICAgIC03OCwgICAxMDc0LAorICAgICAgMTA4LCAgICA2MDksICAgICA2MSwgICAtODM5LCAgIDEwMjUsICAgIDEwMywgIC0xNDEyLCAgIC04MDAsCisgICAgLTI1MTgsICAgMzc5MSwgICA4NjIzLCAgICAzMTUsICAgMjQ2NSwgICAtMzg3LCAgIC04NzcsICAtNDUzOCwKKyAgICAgICAtNiwgICAtMzcwLCAgICA1ODIsICAgMTMyNSwgIC0xOTk1LCAgICAgNDgsICAgIC03MywgICAtMTY2LAorICAgICAgMzc4LCAgIC01NzAsICAtMTI5NywgICAgLTQ3LCAgIC02OTEsICAgMjk4OSwgICA5OTU3LCAgIC00MjEsCisgICAgLTExNDIsICAgIC0yOSwgICAtNTQ1LCAgLTYwNTEsICAgIC0xMCwgICAgLTc5LCAgICAxMjYsICAgIDQyMCwKKyAgICAtMTgxNywgICAgLTE3LCAgICAgNzYsICAgIDI1NiwgICAgLTQ4LCAgICAyMDgsICAgIDY5NCwgICAgLTI5LAorICAgIC0xOTE4LCAgICAxMDQsICAtMzE5MCwgIC0zNDEwLCAgLTQ0NDAsICAgLTIyNCwgICAgICAwLCAgIC02MjEsCisgICAgIC03MDksICAtMTIwMywgICAgIDEyLCAgIC0zNzMsICAgICAyMCwgICAtMzk5LCAgICAgMjEsICAgLTY2NCwKKyAgICAgLTUxOSwgICAgIDI4LCAgIC04NjQsICAgLTkyNCwgIC0zMzU5LCAgLTE2NjgsICAgMTg1NCwgICA2OTM5LAorICAgICAxNDMwLCAgIC02ODgsICAgLTE2OSwgICAtMjA5LCAgLTI5MzksICAgLTEyNCwgICAtMzQxLCAgICAzODAsCisgICAgICAxODgsICAgMTQyMiwgICAgNzA2LCAgIC03ODUsICAgIDI5MywgICAgMTQ1LCAgIC0xNjEsICAgLTYwNiwKKyAgICAgICA0MiwgICA5NzA2LCAgIDMxNjQsICAgLTk1MiwgICAgOTA3LCAgICAgIDAsICAtNTc1MCwgICAtNjExLAorICAgICAgLTU1LCAgICAtNTAsICAgIC0yNSwgICAgIC04LCAgLTE4NzQsICAgICAgMiwgICAgNTY0LCAgICAxODMsCisgICAgICAgLTIsICAgLTUzNywgICAtMTc1LCAgICAgNTIsICAgMTYwNywgICAgNzg1LCAgIDI4NjIsICAgNDMyNywKKyAgICAgMzMwNywgICAtMTU3LCAgICAtMzcsICAgLTUwMCwgIC0xMTQzLCAgIC02NjcsICAgIC03NywgICAtMjgwLAorICAgICAtMTM3LCAgIC00MjQsICAgLTIwNywgICAtNzU2LCAgIC0zMjQsICAgLTE1OCwgICAtNTc3LCAgIC04NzMsCisgICAgIDY4MDEsICAgMzQxNiwgICAyMjI3LCAgIDE2ODIsICAtMzIxNywgIC0yODIzLCAgIC03MTIsICAgLTMwMiwKKyAgICAgLTE3MiwgICAtNjMxLCAgLTE0MTgsICAgLTkyNCwgICAtNDY0LCAgIC02OTgsICAgLTM1MCwgICAtMjI4LAorICAgICAxMzM1LCAgICA2NzAsICAgIDQzNywgICAgMzMwLCAgIDM0NTksICAgMzg5OCwgICAgMzY0LCAgIDc4NDEsCisgICAgLTI2NDAsICAgLTczMCwgICAtOTI3LCAgICAgLTgsICAtMzc1MywgICAtNDI1LCAgIC04MjMsICAgIC03NiwKKyAgICAgIC04NiwgIC0xNjU1LCAgLTE4NjUsICAgLTE3NCwgICAgNTU3LCAgICA2MjgsICAgICA1OCwgICAxMjYzLAorICAgIC01OTAyLCAgLTM0NTgsICAtMjQ2NSwgIC0xODg2LCAgIDQzMzQsICAtMjEyNiwgICAtNzMwLCAgIC0zNzEsCisgICAgIC0yMTcsICAtMTE0NiwgIC0xMjQ1LCAgIC04ODgsICAgLTUyMCwgICAtNjc5LCAgIC0zOTgsICAgLTI4MywKKyAgICAgMTU2MSwgICAgOTE1LCAgICA2NTIsICAgIDQ5OSwgIC0zNzEwLCAgIDExMzMsICAgNzg0OSwgICAzNDQzLAorICAgICAtMjE1LCAgIC04NDAsICAgIC03OCwgIC0zNzYwLCAgIC03MjMsICAgICAtMiwgICAgMjU2LCAgIDE3NzcsCisgICAgIC01NDMsICAgIDc3OSwgICAtMjM4LCAgLTE2NDksICAgIC00OCwgICAgIDE0LCAgICAxMDMsICAgICA0NSwKKyAgICAgNDEzMiwgICAyODI4LCAgICAgIDIsICAtNDIxMiwgIC00MTE2LCAgLTEwNDIsICAgLTQ4OCwgICAgICAwLAorICAgIC0xMDgzLCAgLTEwMzQsICAgLTcxMywgICAgICAwLCAgICAgIDAsICAgMTA2MiwgICAgNzI3LCAgICAgIDAsCisgICAgIDEwMzgsICAgIDcxMCwgICAgICAwLCAgLTEwNTgsICAgNTg3NSwgICA4NDk2LCAgLTE3OTYsICAgMTM3NiwKKyAgICAtMTc4NiwgIC0yMTA3LCAgLTQ0MDYsICAgLTE5NywgICAtMTE1LCAgIC0xOTQsICAtMzA0NywgICAgNjQ0LAorICAgICAgOTMxLCAgIC00OTMsICAgLTcxMywgICAgMTUwLCAgICA2NDAsICAgIDkyNiwgICAtMTk1LCAgICAxNTAsCisgICAgIDMxNDMsICAgMzQ4MywgICAzNTQ2LCAgIC03OTMsICAgNDQ4OSwgICAtNjAzLCAgIC03NDAsICAgLTc2NywKKyAgICAgIC0zOCwgIC0xMjMwLCAgIC02NjgsICAgLTY4MCwgICAtNzU0LCAgICAxNTIsICAgIDE2OCwgICAgMTcxLAorICAgICAtODYxLCAgIC05NTQsICAgLTk3MSwgICAgMjE3LCAgIDI4NDUsICAgNzk2NSwgICAzNjk1LCAgLTU0MzIsCisgICAgIDM5NzgsICAgLTQ5NCwgIC0zODczLCAgIC04MzMsICAtMTgwMSwgICAtOTY2LCAgLTEzODMsICAgLTY0MSwKKyAgICAtMTc5NiwgICAgOTQzLCAgIDI2NDEsICAgMTIyNSwgICAtNjkxLCAgLTE5MzQsICAgLTg5NywgICAxMzE5LAorICAgICAxNTM4LCAgICAxNTAsICAgNzEzOSwgICAyMDQ5LCAgIDMwOTcsICAgLTE0NCwgICAgIC0xLCAgLTMxMTAsCisgICAgIC0yNTYsICAgLTU4NSwgICAgLTE0LCAgIC02NzAsICAgIC02NSwgICAtMTkyLCAgICAtMTgsICAgLTg5MiwKKyAgICAgLTI5MCwgICAgLTI4LCAgLTEzNDksICAgLTM4NywgICAgNjE4LCAgIDc1MjAsICAgNDcyOSwgICAtMjM4LAorICAgIC0zMzczLCAgICAtMjMsICAtMzQ1MiwgIC0xMzY1LCAgICAgLTMsICAgLTY5NCwgICAtMjgzLCAgIC0xNzgsCisgICAgLTIxNzAsICAgICAgOCwgICAgMTA5LCAgICAgNjgsICAgIDEyNywgICAxNTQ4LCAgICA5NzMsICAgIC00OSwKKyAgICAgMjk2NSwgIC0zMDEzLCAgIDc5MTIsICAgNzA3NiwgIC0xOTk3LCAgIC01MzYsICAgLTU1NCwgIC0zODIxLAorICAgIC0zMDU2LCAgIC0yNDMsICAgIDU0NSwgIC0xNDMxLCAgIDE0NTUsICAtMTI4MCwgICAxMzAxLCAgLTM0MTcsCisgICAgICAzNjEsICAgLTM2NywgICAgOTY0LCAgICA4NjIsICAgMjQ0MywgICAtOTI5LCAgLTExMTMsICAgOTY3NywKKyAgICAgNDEzOCwgICAtMzY0LCAgICAtNTIsICAgIC03NSwgIC01NzE2LCAgLTEwNDUsICAgIDEzOCwgICAgMTY2LAorICAgICAgLTYzLCAgLTE0NDMsICAgIDU0OSwgICAgNjU3LCAgIC02MTcsICAgIDIzNCwgICAgMjgxLCAgLTI0NDQsCisgICAgIDE5NjYsICAgMzMwOSwgIDEwMDg1LCAgLTMzOTksICAgMjEwNSwgICAtMjM2LCAgIC02NjgsICAtNjIwNywKKyAgICAgLTcwNSwgICAtMjcwLCAgIC0zOTcsICAtMTIxMCwgIC0yMDM3LCAgICA0MDgsICAgIDY4NiwgICAyMDkyLAorICAgICAtMjUyLCAgIC00MjUsICAtMTI5NSwgICAgNDM2LCAgIC0xMTIsICAtMTM2OCwgICA4ODY4LCAgIDQ4MjIsCisgICAgIDIwNDgsICAgICAgMCwgICAtMTE0LCAgLTQ4MDAsICAtMTQxOSwgICAtMjU2LCAgICAgLTksICAgICA2MSwKKyAgICAgIDc0MCwgICAgIDMzLCAgICA0MDIsICAtMjYxMCwgICAgIDE0LCAgICAxNzEsICAtMTEwOCwgICAtNjAyLAorICAgIC0yNTk3LCAgICA0MzgsICAtMTgzOSwgICA2MjI5LCAgIDcyNjYsICAgLTQxMSwgICAgLTExLCAgIC0yMDYsCisgICAgLTIzNjgsICAtMzIyMywgICAgIDY5LCAgIC0yOTEsICAgICA0OSwgICAgOTg3LCAgIC0xNjYsICAgIDY5OSwKKyAgICAgMTE1MiwgICAtMTk0LCAgICA4MTYsICAtMjc2MywgICAzNDU0LCAgICA1NTMsICAgOTEyNywgICA0OTQ2LAorICAgIC01NTk2LCAgIC03MjgsICAgIC0xOCwgIC01MDg0LCAgLTE0OTMsICAtMTkxMSwgICAtMTE2LCAgLTE5MjQsCisgICAgIC0zMDgsICAtMTA0MiwgICAtMTY2LCAgLTI3NTUsICAgMTE3OSwgICAgMTg4LCAgIDMxMTcsICAgMTY4OSwKKyAgICAgLTUzMiwgICAtNjYzLCAgMTIyNjIsICAgMjQ5NSwgIC0xMDA0LCAgICAtMTcsICAgIC0yNiwgIC05MTc3LAorICAgICAtMzgwLCAgICAtNjEsICAgIC0yMSwgICAgMzk4LCAgICA0OTYsICAgICA4MSwgICAgMTAxLCAgLTE4NjcsCisgICAgICAtMzIsICAgIC00MCwgICAgNzUxLCAgICAxNTIsICAtMjEwMCwgICAxMzE3LCAgLTE1MDksICAxMTQyNSwKKyAgICAgMjk5NywgICAtMjY5LCAgIC0xMDUsICAgLTEzOSwgIC03OTY3LCAgIC01NDgsICAgIDE2OCwgICAtMTkzLAorICAgICAgMTIxLCAgIDE0NjQsICAgLTkxOCwgICAxMDUyLCAgICAzODQsICAgLTI0MCwgICAgMjc2LCAgLTIwOTAsCisgICAgIDExOTMsICAtMjY5NywgIDExMjU5LCAgIDUzNzMsICAgLTc2MywgICAgLTg2LCAgIC00NDQsICAtNzczNywKKyAgICAtMTc2MiwgICAgLTM1LCAgICAxOTYsICAgLTgxOSwgICAxODUzLCAgIC0zOTEsICAgIDg4NCwgIC0zNjkyLAorICAgICAgIDU1LCAgIC0xMjUsICAgIDUyNSwgICAgMjUwLCAgIDI0MDUsICAgLTQ3MSwgIDExMDc5LCAgICAyMDMsCisgICAgICA3ODIsICAgLTM1MywgICAgLTEzLCAgLTc0OTEsICAgICAtMiwgICAgLTM3LCAgICAgNjksICAtMTYyNiwKKyAgICAgIDMxOCwgICAgLTI5LCAgICAgIDUsICAgLTEzNywgICAtMTE0LCAgICAgMjIsICAgLTUyOSwgICAgIC05LAorICAgIC0xODcxLCAgIDU2ODUsICAxMTI5MCwgIC0yNjYyLCAgIDEzNTMsICAgLTIxMywgIC0xOTcyLCAgLTc3ODAsCisgICAgIC00MzIsICAgLTExMSwgICAgNjQ5LCAgIDEyODksICAtMzkxNywgICAtMzA0LCAgICA5MjMsICAgMTgzNCwKKyAgICAgIDE1NCwgICAtNDY5LCAgIC05MzIsICAgIDIyMCwgIC0zNzY4LCAgIDU5MjcsICAtMzA5MywgICA1MDQxLAorICAgICA1MjEyLCAgIC04NjYsICAtMjE0NCwgICAtNTg0LCAgLTE1NTEsICAtMTY1OCwgICAxMzYzLCAgIC03MTEsCisgICAgIDExMTksICAgMTE1OSwgIC0xODI0LCAgICA5NTEsICAgMTE5OCwgIC0xODg1LCAgICA5ODQsICAtMTYwMywKKyAgICAtMjU0NiwgICA5NTAyLCAgIDU5NjksICAtMjQ0MCwgICAxOTI4LCAgIC0zOTUsICAtNTUxMSwgIC0yMTc1LAorICAgICAtMzYzLCAgIC0yMjYsICAgMTQ3NywgICAgOTI3LCAgLTM0NjIsICAgLTM3OSwgICAxNDE1LCAgICA4ODksCisgICAgICAyOTksICAtMTExOCwgICAtNzAyLCAgICAyODcsICAtNDk2MywgICAzNTY4LCAgIDQ1OTIsICAgNTUwOCwKKyAgICAgMzQ1MSwgIC0xNTAzLCAgIC03NzcsICAtMTI4NywgIC0xODUxLCAgIC03MjcsICAgMTA4MCwgICAxMzkxLAorICAgIC0xMDAwLCAgIDE2NjgsICAtMTE5OSwgIC0xNTQzLCAgIDEwNDUsICAgLTc1MSwgICAtOTY3LCAgLTExNjAsCisgICAgIDE3NDUsICAtMjU4NiwgICAzOTgzLCAgMTA4OTksICAtMTU1MSwgICAtMTg2LCAgIC00MDgsICAgLTk2OCwKKyAgICAtNzI1MCwgICAtMTQ2LCAgICAyNzUsICAgLTQyNCwgICAgNjI4LCAgLTExNjEsICAgMTcyMCwgIC0yNjQ5LAorICAgICAgMTY1LCAgIC0yNDQsICAgIDM3NywgICAxMDMyLCAgICA4NjcsICAgLTQ1NiwgICAtNzI3LCAgIDMzNjksCisgICAgMTE4MjIsICAgIC00NSwgICAgLTEyLCAgICAtMzIsICAgLTY5MiwgIC04NTMxLCAgICAgMjQsICAgICAzOCwKKyAgICAgIC0yMCwgICAtMTc4LCAgICAgOTMsICAgIDE0OSwgICAtNjI1LCAgICAzMjksICAgIDUyNSwgIC0yNDMxLAorICAgICA3NTM1LCAgIDI0MjIsICAgMTkyNiwgICAxNDA1LCAgIDE1OTksICAtMzQ2NiwgICAtMzU4LCAgIC0yMjYsCisgICAgIC0xMjAsICAgLTE1NiwgIC0xMTE0LCAgIC04ODYsICAgLTI4NCwgICAtNjQ2LCAgIC0yMDcsICAgLTE2NSwKKyAgICAgLTczNSwgICAtMjM2LCAgIC0xODgsICAgLTEzNywgICAxMDQxLCAgIC03MzUsICAgLTE0MiwgIDEzMjA5LAorICAgICAxNTE1LCAgICAtNjYsICAgIC0zMywgICAgIC0xLCAtMTA2NDksICAgLTE0MCwgICAgIDQ2LCAgICAgIDksCisgICAgICAgLTYsICAgLTgzOSwgICAgNTkzLCAgICAxMTQsICAgIC05NiwgICAgIDY4LCAgICAgMTMsICAtMTIyMiwKKyAgICAgNzk1MCwgICA2NzQ1LCAgLTE0NDQsICAtMTAwOCwgICAyNzIxLCAgLTM4NTcsICAtMjc3NywgICAtMTI3LAorICAgICAgLTYyLCAgIC00NTIsICAtMzI3MywgICAgNzAwLCAgICA1OTQsICAgIDQ4OSwgICAgNDE1LCAgICAtODgsCisgICAgLTEzMjAsICAtMTEyMCwgICAgMjM5LCAgICAxNjcsICAtNDc1NCwgIC0xMzc5LCAgIDQ1MjIsICAgLTU3OCwKKyAgICAtNTczMywgIC0xMzc5LCAgIC0xMTYsICAtMTI0OCwgICAgLTIwLCAgLTIwMDYsICAgLTQwMCwgICAxMzEyLAorICAgICAgMzgwLCAgIC0xNjcsICAgIC00OCwgICAgMTU5LCAgLTE2NjMsICAgLTQ4MiwgICAxNTgyLCAgIC0yMDIsCisgICAgIDMyMjAsICAgNTk3OCwgICA1OTIzLCAgIDI0MzAsICAtMjY4OSwgICAtNjMzLCAgLTIxODEsICAtMjE0MSwKKyAgICAgLTM2MCwgICAtNDQxLCAgLTExNzUsICAtMTE2NCwgIC0yMTYxLCAgIC00NzcsICAgLTg4NiwgICAtODc4LAorICAgICAgNTI4LCAgICA5ODEsICAgIDk3MiwgICAgMzk4LCAgICAzNzcsICAgMTMxMiwgIDEzOTc4LCAgLTE0NzAsCisgICAgICA2NzcsICAgICAtOCwgICAtMTA1LCAtMTE5MjUsICAgLTEzMiwgICAgLTI4LCAgICAtMzAsICAgLTMyMSwKKyAgICAtMTExOSwgICAgIDMzLCAgICAxMTcsICAgMTI1NCwgICAgLTE1LCAgICAtNTQsICAgLTU3NywgICAgIDYwLAorICAgIC0zNDM1LCAgIDY3NzAsICAgIDMxNCwgICAtODg1LCAgIDU2ODYsICAgLTcyMCwgIC0yNzk3LCAgICAgLTYsCisgICAgICAtNDcsICAtMTk3MywgICAxNDE5LCAgICAgNjUsICAgLTEyOSwgICAtMTg1LCAgICAzNjYsICAgICAxNiwKKyAgICAgMTE5MiwgIC0yMzQ5LCAgIC0xMDksICAgIDMwNywgICAzMTcxLCAgIDg3NzQsICAtMjI2MCwgICAyNjc5LAorICAgICAzMDY5LCAgIC02MTMsICAtNDY5OSwgICAtMzEyLCAgIC00MzgsICAgLTU3NSwgIC0xNjk4LCAgICA0MzcsCisgICAgIDEyMTAsICAgLTUxOCwgIC0xNDM1LCAgICAzNjksICAgLTU5NCwgIC0xNjQzLCAgICA0MjMsICAgLTUwMSwKKyAgICAgNTU1NywgICAxNTA5LCAgIDU0MDcsICAgLTEyNSwgIC03Mzg2LCAgLTE4ODQsICAgLTEzOSwgIC0xNzg0LAorICAgICAgICAwLCAgLTMzMzAsICAgLTUxMSwgIC0xODM0LCAgIC00OTgsICAgICA0MiwgICAgIDExLCAgICAgNDEsCisgICAgIDI1MDUsICAgIDY4MCwgICAyNDM4LCAgICAtNTYsICAtMjgzOCwgICAyNTk1LCAgMTMyMjgsICAgIDI3MSwKKyAgICAgMTc5MywgICAtNDkxLCAgIC00MTEsIC0xMDY4MCwgICAgIC00LCAgIC0xOTYsICAgIDQ0OSwgICAyMjkxLAorICAgIC0yMDk1LCAgICAgNDcsICAgIC00MiwgICAtMjE5LCAgICAzMTAsICAgLTI4NCwgIC0xNDQ3LCAgICAtMjksCisgICAgICA2NjQsICAgLTI3OCwgIDE0OTY2LCAgICA5NTEsICAgLTcxMSwgICAgLTI2LCAgICAgLTQsIC0xMzY3MiwKKyAgICAgIC01NSwgICAgLTMwLCAgICAgMTEsICAgLTYwNiwgICAgMjUzLCAgICAtMzgsICAgICAxNiwgICAtODY5LAorICAgICAgIDI4LCAgICAtMTIsICAgIDY1MCwgICAgIDQxLCAgICA4MDgsICAgMTc3MCwgICA4NjU4LCAgIDU4NjMsCisgICAgLTE0ODYsICAgIC0zOSwgICAtMTkxLCAgLTQ1NzYsICAtMjA5OCwgICAtMTM0LCAgICAtODcsICAgLTQyNywKKyAgICAgLTkzNSwgICAtMjg5LCAgIC02MzMsICAtMzA5OCwgICAgIDczLCAgICAxNjAsICAgIDc4NSwgICAgNTMxLAorICAgICAzMDYzLCAgIDE1MzksICAgMjAwMCwgICAtNTQyLCAgIDk1NzYsICAgLTU3MiwgICAtMTQ0LCAgIC0yNDQsCisgICAgICAtMTcsICAtNTU5NywgICAtMjg3LCAgIC0zNzQsICAgLTE4OCwgICAgMTAxLCAgICAgNTEsICAgICA2NiwKKyAgICAtMTc5MCwgICAtOTAwLCAgLTExNjksICAgIDMxNywgICAgNTE0LCAgMTQwODMsICAgLTMyMywgICAgODk2LAorICAgICAtODkxLCAgICAtMTYsIC0xMjEwNiwgICAgIC02LCAgICAtNDksICAgIC00OCwgICAtNDQyLCAgICAgMTAsCisgICAgICAyNzcsICAgIC0yOCwgICAtNzcwLCAgICAgMTcsICAgICAyNywgICAgNzY2LCAgICAtMTcsICAgICA0OCwKKyAgICAgIDg5MiwgICAgMTU4LCAgIDUyMzcsICAxMTA1NywgIC0xNjAzLCAgICAtNDgsICAgICAtMSwgIC0xNjc0LAorICAgIC03NDYyLCAgIC0xNTYsICAgICAtOCwgICAtMjg1LCAgICAtNTAsICAgLTYwMiwgICAtMTA2LCAgLTM1MzQsCisgICAgICAgODcsICAgICAxNSwgICAgNTEyLCAgIDEwODIsICAtMTYxMiwgICAyNTY0LCAgLTQyOTYsICAxMjUyNiwKKyAgICAgNTcxMCwgICAtMTU4LCAgIC00MDEsICAtMTEyNiwgIC05NTc2LCAgLTE5OTAsICAgIDI1MiwgICAtNDIyLAorICAgICAgNjcyLCAgIDEyMzIsICAtMTk2MCwgICAzMjg0LCAgICA1NjEsICAgLTg5MywgICAxNDk3LCAgLTQzNjUsCisgICAgIDQ4ODksICAtNjg3OCwgICAgNjEyLCAgIDYxMDksICAgNDc1MywgIC0xNDU5LCAgLTI4ODcsICAgIC0yMiwKKyAgICAtMjI3NywgIC0xMzc5LCAgIDIwNTIsICAgLTE4MiwgICAgMjU3LCAgLTE4MjMsICAgMjU2NCwgICAtMjI4LAorICAgIC0xNDE4LCAgIDE5OTUsICAgLTE3NywgIC0xNzcyLCAgIDMwNTMsICAgLTUwNiwgICAyNDAzLCAgIDk2MjUsCisgICAgIDEzMjIsICAgLTU2OSwgICAgLTE1LCAgIC0zNTIsICAtNTY1NSwgICAtMTA2LCAgICAgOTQsICAgLTQ0OCwKKyAgICAgICA3NCwgIC0xNzk0LCAgICAyOTcsICAtMTQxMiwgICAtMjQ2LCAgICAgNDAsICAgLTE5NCwgICAtNzc3LAorICAgICAtNzU0LCAgMTI5MDQsICAgNDQ4MCwgIC0yMTEzLCAgIDE0NzEsICAgIC0zNCwgLTEwMTYzLCAgLTEyMjUsCisgICAgIC0yNzIsICAgLTEzMiwgICAgNTk0LCAgICAyMDYsICAtMzUyOSwgICAgLTk3LCAgIDE2NjQsICAgIDU3NywKKyAgICAgICA2NywgIC0xMTU5LCAgIC00MDIsICAgIDE4OSwgICA0MjU1LCAgIDE0NzYsICAgNTA1NSwgICAyMzkzLAorICAgICAyOTEyLCAgLTExMDUsICAgLTEzMiwgIC0xNTU5LCAgIC0zNDksICAgLTUxNywgICAtMzgzLCAgLTEzMTMsCisgICAgIC00NTUsICAgLTYyMSwgICAtMjE1LCAgIC03MzgsICAgLTc1NiwgICAtMjYyLCAgIC04OTgsICAgLTQyNSwKKyAgICAtMTM3MSwgICAgNTM1LCAgIDE0MTcsICAxNDYwNCwgICAtOTk3LCAgIC0xMTQsICAgIC0xNywgICAtMTIyLAorICAgLTEzMDE3LCAgICAtNjAsICAgICA0NCwgICAgMTE4LCAgICAtNDYsICAgMTIyMiwgICAtNDc3LCAgLTEyNjMsCisgICAgICAtODMsICAgICAzMiwgICAgIDg2LCAgICA4ODgsICAgNTM2OCwgIC0xNzQ0LCAgIDQwODMsICAtMTIzNiwKKyAgICAgMzc1MywgIC0xNzU4LCAgIC0xODUsICAtMTAxNywgICAgLTkzLCAgIC04NjAsICAgIDU3MSwgIC0xMzM4LAorICAgICAgNDM0LCAgICA0MDUsICAgLTEzMSwgICAgMzA4LCAgLTEyMjksICAgIDM5OSwgICAtOTM1LCAgICAyODMsCisgICAgIDE1ODgsICAtMzA5NywgIDE0NDE1LCAgIDM2OTksICAtMTE3MSwgICAtMTU0LCAgIC01ODUsIC0xMjY4MywKKyAgICAgLTgzNSwgICAgLTgzLCAgICAzMDAsICAtMTM5NywgICAyNzI1LCAgIC0zNTgsICAgIDY5OSwgIC0zMjU1LAorICAgICAgMTEzLCAgIC0yMjEsICAgMTAzMCwgICAgMjY0LCAgICAyMTIsICAgNzk4OSwgICA5NDcxLCAgLTMzNDQsCisgICAgIDIwMDksICAgICAtMiwgIC0zODk1LCAgLTU0NzUsICAgLTY4MiwgICAtMjQ2LCAgIC0xMDMsICAgLTEyMywKKyAgICAtNDYxOCwgICAgIDQzLCAgIDE2MzAsICAgMTkzMywgICAgLTI2LCAgIC05NzksICAtMTE2MSwgICAgNDEwLAorICAgICAgODU2LCAgIDIyOTQsICAgLTYyNywgICA2OTMwLCAgIDY5MjksICAgIC00NCwgICAtMzIxLCAgICAtMjQsCisgICAgLTI5MzEsICAtMjkzMCwgICAtMTE5LCAgICAgMzIsICAgICA4NywgICAtMzYyLCAgIC05NzAsICAgIDI2NSwKKyAgICAgLTM2MiwgICAtOTcwLCAgICAyNjUsICAtMjkzMSwgICAyMzU3LCAgLTQxODcsICAgNzE2MiwgICA3NjgzLAorICAgICAzMzcxLCAgIC0zMzksICAtMTA3MCwgIC0zMTMxLCAgLTM2MDMsICAgLTY5MywgICAgNjAyLCAgLTEwMzAsCisgICAgIDE4MzAsICAtMTEwNSwgICAxOTYzLCAgLTMzNTksICAgLTQ4NSwgICAgODYxLCAgLTE0NzQsICAtMTU4MSwKKyAgICAgIDM1MCwgICA0NTg1LCAgMTQwNTMsICAtMzgxOSwgICAxMjE4LCAgICAgLTcsICAtMTI4MywgLTEyMDU0LAorICAgICAtODkwLCAgICAtOTAsICAgIC05NywgICAtMzAwLCAgLTM5MzMsICAgICA4MSwgICAxMDY4LCAgIDMyNzUsCisgICAgICAtMjYsICAgLTM0MSwgIC0xMDQ1LCAgICAyODQsICAtMzI0OCwgICAzNTMxLCAgICA0NzUsICAgMjEzNywKKyAgICAxMTcxMSwgICAtNjQ0LCAgIC03NjEsICAgIC0xMywgICAtMjc4LCAgLTgzNzIsICAgIDcwMCwgICAgIDk0LAorICAgICAtMTAyLCAgICA0MjMsICAgLTQ2MCwgICAgLTYyLCAgIDIzMjIsICAtMjUyNCwgICAtMzQwLCAgLTE1MjgsCisgICAgLTMwMTcsICAgMzg1MiwgICAxNzI1LCAgIDg0NDAsICAgNTI1NywgICAtNTU1LCAgIC05MDUsICAgLTE4MSwKKyAgICAtNDM0OCwgIC0xNjg2LCAgICA3MDksICAgIDMxNywgICAtNDA1LCAgIDE1NTQsICAtMTk4NCwgICAtODg5LAorICAgICAgOTY4LCAgLTEyMzYsICAgLTU1MywgIC0yNzA4LCAgIC05MDksICAgMzE5NiwgIDE1NTEyLCAgLTI1MjgsCisgICAgIDEwNjYsICAgIC01MCwgICAtNjIzLCAtMTQ2ODYsICAgLTM5MCwgICAgLTY5LCAgICAxNzcsICAgIDg2MSwKKyAgICAtMzAyNiwgICAtMTQwLCAgICA0OTMsICAgMjM5MywgICAgIDU5LCAgIC0yMDgsICAtMTAwOSwgICAgMTY0LAorICAgICAgOTU5LCAgLTMzNzAsICAgOTYxNywgICA5NTQ1LCAgLTE3NjEsICAgIC01NiwgICAtNjkzLCAgLTU2NDUsCisgICAgLTU1NjEsICAgLTE4OSwgICAgMTk3LCAgIC01NjMsICAgMTk3OCwgICAtNTU4LCAgIDE5NjMsICAtNTYwMywKKyAgICAgIDEwMywgICAtMzYyLCAgIDEwMzQsICAgMTAyNiwgICA3NTc1LCAgMTE3OTYsICAtNDg0NSwgICAzMjUyLAorICAgIC0xNzAzLCAgLTM1MDIsICAtODQ5MywgIC0xNDMzLCAgIC02NDUsICAgLTE3NywgIC01NDU0LCAgIDIyNDAsCisgICAgIDM0ODgsICAtMTUwMywgIC0yMzQxLCAgICA5NjEsICAgIDc4NywgICAxMjI2LCAgIC01MDMsICAgIDMzOCwKKyAgICAgNjQwOSwgICAxNzIyLCAgIDE3NjQsICAtNDE5MSwgICA2MDE1LCAgLTI1MDcsICAgLTE4MSwgICAtMTg5LAorICAgIC0xMDcyLCAgLTIyMDgsICAgLTY3MywgICAtNjkwLCAgIC0xODUsICAgMTYzOSwgICAgNDQwLCAgICA0NTEsCisgICAgLTIzNTMsICAgLTYzMiwgICAtNjQ3LCAgIDE1MzgsICAtMjQyMCwgIDEyMTYxLCAgIDUwMzgsICAgMTI4NiwKKyAgICAtMjA5OCwgICAtMzU3LCAgLTkwMjcsICAtMTU0OSwgICAtMTAwLCAgIC0yNjgsICAgMTc5NiwgICAgNzQ0LAorICAgIC0zNzQwLCAgICAxOTAsICAgLTk1NCwgICAtMzk1LCAgIC0zMTAsICAgMTU1NywgICAgNjQ1LCAgICAxNjQsCisgICAgLTIyMzIsICAtMTM0MSwgICA3MjQ2LCAgIDk0NzAsICAtMTk3NywgICAtMzA0LCAgIC0xMDksICAtMzIwNCwKKyAgICAtNTQ3NCwgICAtMjM4LCAgIC0xODIsICAgIDk4NywgICAgNTkzLCAgIDEyOTAsICAgIDc3NSwgIC00MTg4LAorICAgICAtMjY5LCAgIC0xNjEsICAgIDg3NCwgICAxMTQzLCAgIDEwMzAsICAgNzAzNCwgICA0MjMxLCAgIDE1NTEsCisgICAgIDMwNzcsICAgIC02NCwgIC0zMDE5LCAgLTEwOTMsICAgLTE0NiwgICAtNTc3LCAgIC00NDIsICAgLTI2NiwKKyAgICAtMTgxNiwgICAgLTk3LCAgIC02NjYsICAgLTQwMCwgICAtMTkzLCAgLTEzMjEsICAgLTc5NCwgICAtMjkxLAorICAgICA1MTIxLCAgMTE4MzUsICAgLTQ3NywgIC0xNzQ5LCAgIDIyOTgsICAtMTYwMSwgIC04NTQ5LCAgICAtMTMsCisgICAgIC0xODYsICAgLTMyMiwgIC0zNjk5LCAgICAxNDksICAgIDM0NCwgICAgNTQ2LCAgIDEyNjQsICAgIC01MCwKKyAgICAgLTcxOCwgIC0xNjYwLCAgICAgNjYsICAgIDI0NSwgIC0zMzI4LCAgIDM4MjcsICAgNTkyMSwgICA5OTc2LAorICAgIC0xMDQ1LCAgIC02NzYsICAgLTg5NCwgIC0yMTQwLCAgLTYwNzUsICAgIC02NiwgICAgNzc3LCAgIDEyMDMsCisgICAgLTEzODMsICAgMjAyNywgIC0yMzMwLCAgLTM2MDUsICAgLTIxMiwgICAgMjQ0LCAgICAzNzcsICAgIDYzNiwKKyAgICAgMzgxMywgICA1NzE4LCAgLTQ2NjYsICAtMzQxMiwgICA1Njc0LCAgIC04ODcsICAtMTk5NSwgIC0xMzI5LAorICAgICAtNzEwLCAgLTE5NjUsICAtMTMzMSwgICAxMDg2LCAgIDE2MjgsICAgIDc5NCwgICAxMTkxLCAgIC05NzIsCisgICAgLTEzMjAsICAtMTk4MCwgICAxNjE2LCAgIDExODEsICAgMTM0OCwgIC0zNjcyLCAgMTMxNTQsICAgNjkzOCwKKyAgICAtMTY5MCwgICAtMTEwLCAgIC04MjMsIC0xMDU2MSwgIC0yOTM4LCAgIC0xNzQsICAgIDMwMiwgIC0xMDgyLAorICAgICAyOTQ4LCAgIC01NzAsICAgMTU1NSwgIC01NTcwLCAgICAxMzksICAgLTM3OSwgICAxMzU3LCAgICA3MTYsCisgICAgIDIxNTEsICAtMzU4NiwgICA2OTQ5LCAgMTIxMzEsICAtMTIyNCwgICAtMjgyLCAgIC03ODUsICAtMjk0NywKKyAgICAtODk4MiwgICAgLTkxLCAgICA0NzAsICAgLTkxMiwgICAxNTIxLCAgLTE1OTIsICAgMjY1NSwgIC01MTQ1LAorICAgICAgMTYwLCAgIC0yNjgsICAgIDUxOSwgICAgOTA2LCAgLTI4ODksICAgOTY0NywgIDEwMjc2LCAgLTI3MjgsCisgICAgICA5OTUsICAgLTUwOSwgIC01NjgwLCAgLTY0NDUsICAgLTQ1NCwgICAgLTYwLCAgIDE3MDEsICAgMTgxMiwKKyAgICAtNjA1MSwgICAtNDgxLCAgIDE2MDYsICAgMTcxMSwgICAgMTc1LCAgIC01ODYsICAgLTYyNCwgICAgMTY1LAorICAgICA2MTc3LCAgIDIxODQsICAgIDU1NSwgICAxOTg1LCAgIDY1ODksICAtMjMyOSwgICAtMjkxLCAgICAtMTgsCisgICAgIC0yNDAsICAtMjY1MCwgICAtODIzLCAgIC0yMDksICAgIC03NCwgICAtNzQ4LCAgIC0yNjQsICAgIC02NywKKyAgICAtMjQ4NCwgICAtODc4LCAgIC0yMjMsICAgLTc5OCwgICAtNDkyLCAgICAzOTEsICAxNzE2NiwgICAtNjgxLAorICAgICAgMjQwLCAgICAtMTQsICAgICAtOSwgLTE3OTg3LCAgICAtMjgsICAgICAtMywgICAgIDExLCAgICA1MTUsCisgICAgIC00MTAsICAgIC0yMCwgICAgIDE2LCAgICA3MTMsICAgICAgNywgICAgIC01LCAgIC0yNTIsICAgICAxMCwKKyAgICAxMjYyOCwgICA1NDQ4LCAgLTI2MzAsICAgMzAxMSwgIC0yNjk1LCAgLTk3MzMsICAtMTgxMSwgICAtNDIyLAorICAgICAtNTUzLCAgIC00NDMsICAtNDE5OSwgICAyMDI3LCAgICA4NzQsICAtMjMyMSwgIC0xMDAxLCAgICA0ODMsCisgICAgIDIwNzcsICAgIDg5NiwgICAtNDMyLCAgICA0OTUsICAtMzYyOCwgICAtNTM0LCAgIDM0NDcsICAgNzAwMiwKKyAgICAgNjc1MSwgICAtODAzLCAgICAtMTcsICAgLTcyNSwgIC0yOTkyLCAgLTI3ODIsICAgLTExOCwgICAgNzYzLAorICAgICAgMTEyLCAgIDE1NTAsICAgIDIyOCwgIC0xNDczLCAgIDE0OTUsICAgIDIyMCwgIC0xNDIwLCAgLTI4ODUsCisgICAgLTUyMzksICAgNTkwMSwgICA4MTA3LCAgIDM2NTAsICAgNDg0NiwgIC0xNjc1LCAgLTIxMjUsICAtNDAxMiwKKyAgICAgLTgxMywgIC0xNDMzLCAgIDE4ODcsICAgMjU5MiwgIC0yOTIwLCAgIDExNjcsICAtMTMxNSwgIC0xODA2LAorICAgICAxNTUwLCAgLTE3NDUsICAtMjM5OCwgIC0xMDgwLCAgIDYxNTcsICAgNjY3OCwgICA0MDk5LCAgLTEwNzQsCisgICAgIDIzNDgsICAtMjMxNCwgIC0yNzIyLCAgLTEwMjUsICAgIC03MCwgICAtMzM2LCAgLTI1MDksICAtMTU0MCwKKyAgICAtMTY3MCwgICAgNDAzLCAgICA0MzcsICAgIDI2OCwgICAtODgyLCAgIC05NTcsICAgLTU4NywgICAgMTUzLAorICAgICAxMDc5LCAgMTYwOTksICAgIDI0MiwgICAtODgxLCAgIDE2OTAsICAgIC03MSwgLTE1ODIwLCAgICAgLTMsCisgICAgICAtNDcsICAgLTE3NCwgIC0xMDYwLCAgICAtMTYsICAgLTIzOCwgICAgIDU4LCAgICA4NjUsICAgICAxMywKKyAgICAgLTExMSwgIC0xNjYxLCAgICAtMjUsICAgICA5MCwgICAtMjc4LCAgICAyMjcsICAtMTAzOSwgICAxNjM2LAorICAgIDE2OTQ1LCAgICAgLTQsICAgICAtMywgICAgLTY1LCAgIC0xNjMsIC0xNzUyNiwgICAgICAzLCAgICAtMTcsCisgICAgICAgMTQsICAgICAyNywgICAgLTIyLCAgICAxMDMsICAgIDI4NywgICAtMjM0LCAgIDEwNzQsICAtMTY5MywKKyAgICAxNTc3OCwgIC0xNDU0LCAgICA1NzQsICAgLTYwMywgICAtMTA3LCAtMTUxOTUsICAgLTEyOSwgICAgLTIwLAorICAgICAgLTIyLCAgICAgIDAsICAgMTQwMCwgICAtNTUzLCAgICAgNTEsICAgIDU4MSwgICAgLTUzLCAgICAgMjEsCisgICAgICAxMDMsICAgICAtOSwgICAgICAzLCAgICAgLTMsICAgMjQwNiwgICAtODM2LCAgMTMyMjQsICAgNzk5MywKKyAgICAtNDI2NiwgICAtMzUzLCAgICAtNDIsIC0xMDY3MywgIC0zODk5LCAgLTExMTEsICAgIDEyMiwgIC0xOTQyLAorICAgICAgNjc0LCAgLTExNzQsICAgIDQwNywgIC02NDUxLCAgICA2MjYsICAgLTIxNywgICAzNDQzLCAgIDIwODEsCisgICAgIDMxODQsICAxNDM2OCwgIC0zMzM2LCAgIDIyNTUsICAtMTgwMSwgICAtNjE5LCAtMTI2MDAsICAgLTY3OSwKKyAgICAgLTMxMCwgICAtMTk4LCAgLTI3OTMsICAgIDY0OCwgICAyOTI2LCAgIC00MzgsICAtMTk3NywgICAgNDU5LAorICAgICAgMzUwLCAgIDE1ODAsICAgLTM2NiwgICAgMjQ3LCAgLTE2OTgsICAxNzA3NiwgICAyNTA0LCAgIC01MzksCisgICAgIC02NDYsICAgLTE3NiwgLTE3Nzk4LCAgIC0zODIsICAgIC0xNywgICAgLTI1LCAgIDE3NzAsICAgIDI1OSwKKyAgICAtMjYxMCwgICAgLTU1LCAgICA1NjEsICAgICA4MiwgICAgLTY3LCAgICA2NzMsICAgICA5OCwgICAgLTIxLAorICAgICAyMzc1LCAgIC03OTcsICAtMjY5NiwgIDE0NDgzLCAgIDUzODMsICAgLTM0NCwgICAgLTM4LCAgIC00NDMsCisgICAtMTI4MDMsICAtMTc2OSwgICAgMTE1LCAgICAzOTEsICAgLTEzMSwgIC0yMTAwLCAgICA3MDUsICAgMjM4NCwKKyAgICAgLTc4MCwgICAgMjYyLCAgICA4ODYsICAtNDc1OSwgIC0yNjkxLCAgIDI1NTQsICAtNDUyMCwgICA5NTczLAorICAgIDEwNjU1LCAgIC00NDIsICAgLTM5OCwgIC0xMjQ3LCAgLTU1OTQsICAtNjkzMCwgICAgNDE5LCAgIC03NDIsCisgICAgICA3MDQsICAgMTU3MiwgIC0xNDkyLCAgIDI2NDEsICAgMTc1MCwgIC0xNjYxLCAgIDI5MzksICAtNjIyNiwKKyAgICAtNDMzMiwgIC00Mzk5LCAgLTE2NTcsICAgNDg4MCwgICA3Mzc1LCAgLTExNDUsICAtMTE4MSwgICAtMTY3LAorICAgIC0xNDUzLCAgLTMzMTksICAtMTE2MywgICAtNDM4LCAgIC00NDQsICAgMTI5MCwgICAxMzEwLCAgICA0OTMsCisgICAgIDE5NTAsICAgMTk4MCwgICAgNzQ1LCAgLTIxOTYsICAtMzQ5OCwgICA3NDA1LCAgIDk5NTUsICAgMjY5MywKKyAgICAtMjk3MSwgICAtNzQ2LCAgLTMzNDcsICAtNjA0OSwgICAtNDQyLCAgIC01MzgsICAgMTU4MSwgICAyMTI1LAorICAgIC00NDk5LCAgICA1NzUsICAtMTIxNywgIC0xNjM2LCAgIC02MzQsICAgMTM0MiwgICAxODA1LCAgICA0ODgsCisgICAgIDY3MTcsICAtMzc5MiwgICA3NzM5LCAgIDI3OTgsICAgMzQ4OSwgIC0yNzU0LCAgIC04NzcsICAtMzY1NSwKKyAgICAgLTQ3NywgICAtNzQzLCAgIDE1NTQsICAtMzE3MywgICAxNzkxLCAgLTExNDcsICAgIDY0NywgIC0xMzIxLAorICAgIC0xNDMwLCAgICA4MDcsICAtMTY0OCwgICAtNTk1LCAgIDUyNjMsICAgOTc3MCwgICAzNDYzLCAgIDEwNjksCisgICAgLTM5NzEsICAtMTY5MCwgIC01ODI2LCAgIC03MzIsICAgIC02OSwgICAtOTYyLCAgLTMxMzgsICAtMTExMiwKKyAgICAtMjA2NSwgICAtMzQzLCAgIC02MzcsICAgLTIyNiwgICAxMjc1LCAgIDIzNjgsICAgIDgzOSwgICAgMjU5LAorICAgICAxMjQzLCAgLTI2MzQsICAxNjc3MiwgICAxODcxLCAgICAzMzIsICAgIC05NCwgICAtNDIzLCAtMTcxNjksCisgICAgIC0yMTMsICAgICAtNiwgICAgMTk5LCAgLTEyNzMsICAgMjY5NiwgICAtMTQyLCAgICAzMDAsICAtMTkxNSwKKyAgICAgIC0yNSwgICAgIDUzLCAgIC0zMzksICAgIC0zNywgICAyNjkxLCAgIDI4MzYsICAgMzEwNSwgICA1NzExLAorICAgICA0ODE3LCAgIC00NDIsICAgLTQ5MSwgICAtNTg4LCAgLTE5OTEsICAtMTQxNiwgICAtNDY1LCAgIC01MTAsCisgICAgIC01MzcsICAgLTkzOCwgICAtOTg4LCAgLTEwODIsICAgLTc5MSwgICAtODM0LCAgIC05MTMsICAtMTY3OSwKKyAgICAgNDM2NiwgICAyOTQ0LCAgIDcyMTAsICAgMzYyNywgICAxMTYxLCAgLTExNjMsICAgLTUyOSwgIC0zMTcyLAorICAgICAtODAzLCAgICAtODIsICAgLTc4NCwgIC0xOTIxLCAgLTEyOTUsICAgLTk2NiwgICAtNjUxLCAgLTE1OTYsCisgICAgIC0zMDksICAgLTIwOCwgICAtNTExLCAgIC0yNTcsICAxMzg4OCwgICAzOTUxLCAgIC02NzEsICAtMjMwNSwKKyAgICAgMzM1NCwgLTExNzczLCAgIC05NTMsICAgIC0yNywgICAtMzI0LCAgIC02ODYsICAtMzM0OSwgICAgNTY5LAorICAgICAgMTYxLCAgIDE5NTQsICAgIDU1NiwgICAgLTk0LCAgLTI4NDMsICAgLTgwOSwgICAgMTM3LCAgICA0NzIsCisgICAgIDcwNTMsICAgNTg0NywgICAyOTI5LCAgIDgzNzgsICAtNDc5NCwgIC0zMDM2LCAgLTIwODYsICAgLTUyMywKKyAgICAtNDI4NCwgIC0xNDAzLCAgLTI1MTcsICAtMTI2MSwgIC0xMDQ1LCAgLTM2MDcsICAtMjk5MCwgIC0xNDk4LAorICAgICAyMDY0LCAgIDE3MTEsICAgIDg1NywgICAyNDUxLCAgLTIxOTEsICAxMjgzOCwgICA5MTgyLCAgLTM5MTUsCisgICAgIDE2MTcsICAgLTI5MywgLTEwMDU5LCAgLTUxNDYsICAgLTkzNSwgICAtMTU5LCAgIDE3MTcsICAgMTIyOCwKKyAgICAtNzE5NSwgICAtNTIzLCAgIDMwNjgsICAgMjE5NCwgICAgMjE2LCAgLTEyNjcsICAgLTkwNiwgICAgMzg2LAorICAgIC00ODgxLCAgMTMxMTQsICAgNTc2NywgICAtNDM1LCAgIDQxNTUsICAtMTQ1NCwgLTEwNDk4LCAgLTIwMzAsCisgICAgICAtMTEsICAtMTA1NCwgICAzOTA3LCAgIDE3MTgsICAtNDYxNiwgICAtMTI5LCAgICAzNDgsICAgIDE1MywKKyAgICAgMTIzOCwgIC0zMzI2LCAgLTE0NjIsICAgIDExMCwgICA3ODQzLCAgLTEyNTAsICAgIDIxMCwgICA3MTA2LAorICAgIC01MjAzLCAgLTM3NTQsICAgIC05NSwgICAgIC0yLCAgLTMwODIsICAtMTY1MiwgICAgNTk4LCAgIC0xMDAsCisgICAgICAgMTYsICAtMzQwMiwgICAgNTQyLCAgICAtOTEsICAgMjQ5MSwgICAtMzk3LCAgICAgNjYsICAgMjI1NywKKyAgICAtMjQ2MywgICA4MTY4LCAgMTQ1NTEsICAtMzkwOCwgICAxODI4LCAgIC0zNzAsICAtNDA3MiwgLTEyOTIzLAorICAgICAtOTMyLCAgIC0yMDQsICAgMTIyOCwgICAyMTg4LCAgLTcyNTQsICAgLTU4NywgICAxOTQ4LCAgIDM0NzEsCisgICAgICAyNzQsICAgLTkxMSwgIC0xNjIzLCAgICA0MzYsICAtMTU3OSwgICAgMzQ3LCAgIC0yNzIsICAtMjczNSwKKyAgICAxNjAzMSwgICAtMTUyLCAgICAgLTcsICAgICAtNCwgICAtNDU2LCAtMTU2ODYsICAgICAzMywgICAgLTI2LAorICAgICAgICA1LCAgIC0yNjMsICAgICA1OCwgICAgLTQ1LCAgIDE1NDUsICAgLTM0MCwgICAgMjY2LCAgIDI2NzYsCisgICAgLTYzMjcsICAgMTMyOCwgICA1MDkzLCAgLTUwNzksICAgNzYxNywgIC0yNDQzLCAgIC0xMDcsICAtMTU4MywKKyAgICAtMTU3NCwgIC0zNTQxLCAgICA1MTMsICAgMTk2NywgICAtNDEzLCAgLTE5NjEsICAgIDQxMSwgICAxNTc4LAorICAgICAyOTQxLCAgIC02MTcsICAtMjM2NywgICAyMzYxLCAgIDMyODYsICAtNDUwOSwgIDExMzA2LCAgMTEwMjUsCisgICAgLTI2MjMsICAgLTY1OSwgIC0xMjQxLCAgLTc4MDIsICAtNzQxOSwgICAtNDIwLCAgICA5MDQsICAtMjI2NywKKyAgICAgMzExMiwgIC0yMjExLCAgIDMwMzQsICAtNzYwOCwgICAgNTI2LCAgIC03MjIsICAgMTgxMCwgICAxNzY1LAorICAgICA1NTY3LCAgMTc4NTMsICAtMzc1NCwgICAxMTY2LCAgIC01MTksICAtMTg5MiwgLTE5NDU1LCAgIC04NjAsCisgICAgICAtODMsICAgIC0xNiwgIC02MDY3LCAgIDEyNzUsICAgNDA5MCwgICAtMzk2LCAgLTEyNzEsICAgIDI2NywKKyAgICAgIDE3NiwgICAgNTY2LCAgIC0xMTksICAgICAzNywgIC0yMTM2LCAgIC00MjQsICAxNTI5MiwgICA1MTA4LAorICAgIC0xNjQ4LCAgIC0yNzgsICAgIC0xMCwgLTE0MjczLCAgLTE1OTMsICAgLTE2NSwgICAgLTU1LCAgIDE5OTMsCisgICAgICAzOTYsICAgIDY2NiwgICAgMTMyLCAgLTQ3NjgsICAgLTIxNCwgICAgLTQyLCAgIDE1MzgsICAgIDUxNCwKKyAgICAgMjI2NywgIC0zMjk3LCAgIDI1NDksICAxNjU2MywgICAtNzkxLCAgIC0zMTMsICAgLTY2MywgICAtMzk2LAorICAgLTE2NzQ1LCAgICAtMzgsICAgIDQ1NiwgICAtMzUyLCAgICA1MTMsICAtMjI5MSwgICAzMzMzLCAgLTI1NzYsCisgICAgICAxMDksICAgLTE1OSwgICAgMTIzLCAgICA3OTksICAgMzY1NSwgICAxODk5LCAgLTMzNjQsICAgNjI3OSwKKyAgICAxMjUxMCwgICAtODE1LCAgIC0yMjAsICAgLTY5MCwgIC0yNDA2LCAgLTk1NTIsICAgLTQyMywgICAgNzUwLAorICAgICAgMzkwLCAgLTE0MDAsICAgLTcyOCwgICAxMjg5LCAgLTI3OTEsICAtMTQ1MCwgICAyNTY4LCAgLTQ3OTQsCisgICAgIDgwNTIsICAgMjI4NSwgIC02MTkzLCAgIDUxMzgsICAgNjAwMywgIC0zOTU3LCAgIC0zMTgsICAtMjM0MSwKKyAgICAtMTYxMSwgIC0yMTk5LCAgLTExMjMsICAgMzA0NCwgICAgODY0LCAgLTI1MjUsICAgLTcxNiwgICAxOTQyLAorICAgIC0yOTUwLCAgIC04MzcsICAgMjI2OSwgIC0xODgyLCAgIC0zODYsICAtMjI5MSwgICA3Njc5LCAgMTUzODcsCisgICAgLTI3MjMsICAgICAtOSwgICAtMzIwLCAgLTM1OTksIC0xNDQ1MiwgICAtNDUyLCAgICAtNTQsICAgIDE4MSwKKyAgICAgMTA3NCwgICAgMzYyLCAgIDIxNTIsICAtNzIxMiwgICAgLTY0LCAgIC0zODAsICAgMTI3NiwgICAyNTU3LAorICAgICAyNzc3LCAgLTExNzMsICAgMzk4NCwgIDEzMDc5LCAgIDI1MDgsICAgLTQ3MCwgICAgLTg0LCAgIC05NjksCisgICAtMTA0NDAsICAgLTM4NCwgICAgMTk4LCAgIC02NzUsICAgIDI4NSwgIC0yMjE3LCAgICA5MzYsICAtMzE4MCwKKyAgICAgLTQyNSwgICAgMTc5LCAgIC02MTAsICAtMjAwMiwgIC0xODc5LCAgIDE3NzEsICAtMjY4NCwgIDE2NzA1LAorICAgICAxODMzLCAgIC0yMTUsICAgLTE5MSwgICAtNDM5LCAtMTcwMzIsICAgLTIwNSwgICAgMjAzLCAgIC0zMDgsCisgICAgICAyOTAsICAgMTkxNiwgIC0xODA1LCAgIDI3MzYsICAgIDIxMCwgICAtMTk4LCAgICAzMDAsICAtMTg2OSwKKyAgICAgMTA1MiwgICA0NDk1LCAgMTU1MTksICAgMTQ2NywgIC00MDMyLCAgICAtNjcsICAtMTIzMywgLTE0NzAwLAorICAgICAtMTMxLCAgIC05OTIsICAgLTI4OCwgICAtOTk3LCAgLTQyNTcsICAgIC05NCwgICAtNDAyLCAgLTEzODksCisgICAgICAyNTksICAgMTEwNiwgICAzODE5LCAgICAzNjEsICAgMzAxMCwgICAyNTQ0LCAgIDY5NjksICAgNzU1OSwKKyAgICAgMTk5NiwgICAtNTUzLCAgIC0zOTUsICAtMjk2NCwgIC0zNDg3LCAgIC0yNDMsICAgLTQ2NywgIC0xMjgwLAorICAgIC0xMDgyLCAgLTEzODgsICAtMTE3NCwgIC0zMjE1LCAgIC0zNjYsICAgLTMxMCwgICAtODQ5LCAgIC05MjEsCisgICAgLTUyMDksICAtMTg2NywgICA4NzEzLCAgMTAzNTEsICAgMTU0OSwgIC0xNjU2LCAgIC0yMTIsICAtNDYzNCwKKyAgICAtNjU0MCwgICAtMTQ2LCAgIC01OTMsICAgMjc3MCwgICAgOTkzLCAgIDMyOTEsICAgMTE4MCwgIC01NTA1LAorICAgICAgNDkyLCAgICAxNzYsICAgLTgyNCwgICAtOTc5LCAgLTQzMTQsICAgODUxMywgICAgOTEzLCAgIDc1NDcsCisgICAgLTI3MjMsICAtMTEzNSwgIC00NDIzLCAgICAtNTAsICAtMzQ3NiwgICAtNDUyLCAgIDIyNDEsICAgIDI0MCwKKyAgICAgLTQ3NCwgICAxOTg3LCAgLTM5MjEsICAgLTQyMCwgICAtNzE3LCAgIDE0MTUsICAgIDE1MSwgICAxMjU0LAorICAgIDEyOTI5LCAgLTEyMTksICAgMjQ0OCwgICAxNzU3LCAgIDYzMDMsIC0xMDIwNCwgICAgLTkwLCAgIC0zNjUsCisgICAgIC0xODgsICAtMjQyNSwgICAgOTYyLCAgLTE5MzIsICAgIDE4MiwgIC0xMzg2LCAgICAxMzAsICAgLTI2MiwKKyAgICAtNDk3NCwgICAgNDY5LCAgIC05NDEsICAgLTY3NiwgICA2NDY1LCAgIDQxMzIsICAgMzE2NywgICAzMTYwLAorICAgICA1Njk3LCAgLTI1NTEsICAtMTA0MiwgICAtNjEyLCAgIC02MDksICAtMTk4MSwgIC0xNjMwLCAgLTEyNDksCisgICAgIC03OTgsICAtMTI0NywgICAtNzk3LCAgIC02MTEsICAtMjI0OCwgIC0xNDM3LCAgLTExMDEsICAtMTA5OSwKKyAgICAtMzYzNiwgICA0ODU5LCAgMTg5MTQsICAtMTMzNSwgICAgODEwLCAgIC04MDcsICAtMTQ0MSwgLTIxODM2LAorICAgICAtMTA4LCAgICAtNDAsICAgMTA3OCwgICA0MTk4LCAgLTU2MDksICAgLTI5NiwgICAgMzk2LCAgIDE1NDEsCisgICAgICAxNzksICAgLTI0MCwgICAtOTM2LCAgICAgNjYsICAgODg0NCwgICA3ODY0LCAgICA2NTQsICAtNDA2MywKKyAgICAtNTY4MCwgIC00Nzc0LCAgLTM3NzQsICAgIC0yNiwgIC0xMDA3LCAgLTE5NjksICAtNDI0NSwgICAtMzUzLAorICAgICAtMzE0LCAgIDIxOTMsICAgMTk1MCwgICAgMTYyLCAgIDMwNjYsICAgMjcyNiwgICAgMjI2LCAgLTE0MDgsCisgICAgIDE4NTksICAgMjYzNCwgICA5MjI4LCAgICA5OTYsICAgOTQ2NCwgICAtMjExLCAgIC00MjMsICAtNTE5NywKKyAgICAgIC02MCwgIC01NDY3LCAgIC0yOTksICAtMTA0NywgIC0xNDgzLCAgIC0xMTMsICAgLTE2MCwgICAtNTYxLAorICAgIC0xMDc0LCAgLTE1MjEsICAtNTMzMCwgICAtNTc1LCAgIDI5NDksICAxMjI2MCwgIDEwMjkwLCAgIC00OTcsCisgICAgLTM5NDMsICAgLTUzMCwgIC05MTc0LCAgLTY0NjMsICAgIC0xNSwgICAtOTQ5LCAgLTIyMDYsICAtMTg1MiwKKyAgICAtNzcwMCwgICAgIDg5LCAgICAzNzIsICAgIDMxMiwgICAgNzA5LCAgIDI5NTAsICAgMjQ3NiwgICAtMTE5LAorICAgIC0yOTAzLCAgIDE1NTIsICAxNDg2NywgICA5OTcwLCAgIC00OTYsICAgLTUxNCwgICAtMTQ3LCAtMTM0OTEsCisgICAgLTYwNjgsICAgIC0xNSwgICAgMjc1LCAgIDI2MzQsICAtMTQwOCwgICAxNzY2LCAgIC05NDQsICAtOTA0NywKKyAgICAgIC04NywgICAgIDQ3LCAgICA0NTAsICAgIDMwMiwgICAzMjQzLCAgIDgyMzQsICAgNzU4NiwgICAzMzczLAorICAgICAyMTUxLCAgIC02NDIsICAtNDEzOCwgIC0zNTEyLCAgIC02OTQsICAgLTI4MiwgIC0xNjMwLCAgLTE1MDEsCisgICAgLTM4MTIsICAgLTY2NywgIC0xNjk1LCAgLTE1NjEsICAgLTQyNSwgIC0xMDgxLCAgIC05OTYsICAgLTQ0MiwKKyAgICAtOTYzMSwgICAgIDYwLCAgIDM1MDEsICAgNTM1OSwgIDEwMTUwLCAgLTU2NjIsICAgICAgMCwgICAtNzQ4LAorICAgIC0xNzUyLCAgLTYyODgsICAgICAzNSwgICAyMDU4LCAgICAtMTIsICAgMzE1MCwgICAgLTE5LCAgLTExNDUsCisgICAgIDU5NjcsICAgIC0zNywgIC0yMTY5LCAgLTMzMjAsICAtNjg3NCwgIC0yNTUzLCAgLTU0NDYsICAtMjE5NSwKKyAgICAtNzg0MSwgIC0yODg0LCAgIC0zOTcsICAtMTgxMCwgICAtMjk0LCAgLTM3NTMsICAtMTA3MSwgIC0yMjg1LAorICAgICAtODQ4LCAgIC05MjEsICAgLTM0MiwgICAtNzI5LCAgLTMyOTAsICAtMTIyMSwgIC0yNjA2LCAgLTEwNTAsCisgICAgLTM0MTMsICAtMTE0MSwgICA0NjMwLCAgMTM2MTIsICAgNzg5NywgICAtNzExLCAgICAtNzksICAtMTMwOCwKKyAgIC0xMTMxMCwgIC0zODA2LCAgIC0yMzcsICAgIDk2NCwgICAgMzIyLCAgIDI4MzYsICAgIDk0OCwgIC0zODQ3LAorICAgICAxNjQ1LCAgICA1NTAsICAtMjIzMSwgIC02NTYxLCAgIDQ0MTAsICAtNTY3OCwgICA4MDA2LCAgLTM5OTIsCisgICAgIDM4MTEsICAtMTE4NywgIC0xOTY4LCAgLTM5MTIsICAgLTk3MywgICAtODg2LCAgIDE1MjgsICAtMjE1NSwKKyAgICAgMjc3NSwgICAxMDc0LCAgLTEzODMsICAgMTk1MSwgIC0xMDI1LCAgIDEzMjEsICAtMTg2MiwgICAgOTI4LAorICAgICA1NjU5LCAgMTE1MzUsICAgMjIwMywgICAtNDUyLCAgIDcxNjksICAtMTk1NCwgIC04MTIxLCAgIC0yOTYsCisgICAgICAtMTIsICAtMzEzNywgIC0zOTg0LCAgIC03NjEsICAtMTU1MSwgICAgMTU2LCAgICAzMTgsICAgICA2MCwKKyAgICAtMjQ3NiwgIC01MDQ4LCAgIC05NjQsICAgIDE5NywgICAyOTE0LCAgLTI5MTQsICAgMzQ4NSwgIC0zOTY1LAorICAgIDEzNjc1LCAgIC01MTgsICAgLTUxOCwgICAtNzQxLCAgIC05NTksIC0xMTQxNCwgICAgNTE4LCAgIC02MjAsCisgICAgICA2MjAsICAgIDcwNSwgICAtNzA1LCAgICA4NDMsICAtMjQzMywgICAyNDMyLCAgLTI5MDksICAgMzMxMCwKKyAgICAgNzg0MywgICAxOTA3LCAgIDEwMjIsICAgODg4MiwgICA3OTcyLCAgLTM3NTUsICAgLTIyMiwgICAgLTYzLAorICAgIC00ODE1LCAgLTM4NzksICAgLTkxMywgICAtNDg5LCAgIC0xMTksICAtNDI1MiwgIC0xMDM0LCAgIC01NTQsCisgICAgLTM4MTYsICAgLTkyOCwgICAtNDk3LCAgLTQzMjIsICAxMzgwNywgICA5NTMxLCAgIDE0MzYsICAgMTYxMiwKKyAgICAgMTc3OSwgLTExNjM2LCAgLTU1NDQsICAgLTEyNSwgICAtMTU4LCAgIC0xOTMsICAtODAzMiwgIC0xMjEwLAorICAgICAtODM1LCAgLTEzNTgsICAgLTkzOCwgICAtMTQxLCAgLTE0OTksICAtMTAzNSwgICAtMTU2LCAgIC0xNzUsCisgICAgMTM2MjAsICAtNTMzNywgICA1NDUwLCAgLTIyNjMsICAgMTcyMywgLTExMzIyLCAgLTE3MzgsICAtMTgxMywKKyAgICAgLTMxMiwgICAtMTgxLCAgIDQ0MzYsICAtNDUzMSwgICAxNzc1LCAgIDE4ODEsICAgLTczNywgICAgNzUyLAorICAgIC0xNDMyLCAgICA1NjEsICAgLTU3MywgICAgMjM4LCAgIDUyOTcsICAgODM3NCwgICA4ODcyLCAgIDc2OTQsCisgICAgIDY1MzgsICAtMTcxMiwgIC00MjgwLCAgLTQ4MDQsICAtMzYxMywgIC0yNjA5LCAgLTI3MDcsICAtMjg2OCwKKyAgICAtNDUzNCwgIC0yNDg3LCAgLTM5MzIsICAtNDE2NiwgIC0yMTEzLCAgLTMzNDEsICAtMzU0MCwgIC0zMDcwCit9OworCisvKioKKyAqIDAuNjVeaSAoWmVybyBwYXJ0KSBhbmQgMC43NV5pIChQb2xlIHBhcnQpIHNjYWxlZCBieSAyXjE1CisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IHBvc3RmaWx0ZXJfdGJsWzJdW0xQQ19PUkRFUl0gPSB7CisgICAgLyogWmVybyAqLworICAgIHsyMTI5OSwgMTM4NDQsICA4OTk5LCAgNTg0OSwgMzgwMiwgMjQ3MSwgMTYwNiwgMTA0NCwgIDY3OSwgIDQ0MX0sCisgICAgLyogUG9sZSAqLworICAgIHsyNDU3NiwgMTg0MzIsIDEzODI0LCAxMDM2OCwgNzc3NiwgNTgzMiwgNDM3NCwgMzI4MSwgMjQ2MCwgMTg0NX0KK307CisKKy8qKgorICogSGFtbWluZyB3aW5kb3cgY29lZmZpY2llbnRzIHNjYWxlZCBieSAyXjE1CisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGhhbW1pbmdfd2luZG93W0xQQ19GUkFNRV0gPSB7CisgICAgIDI2MjEsICAyNjMxLCAgMjY1OSwgIDI3MDUsICAyNzcwLCAgMjg1MywgIDI5NTUsICAzMDc0LCAgMzIxMiwgIDMzNjcsCisgICAgIDM1NDEsICAzNzMxLCAgMzkzOSwgIDQxNjQsICA0NDA1LCAgNDY2MywgIDQ5MzcsICA1MjI2LCAgNTUzMSwgIDU4NTEsCisgICAgIDYxODYsICA2NTM0LCAgNjg5NywgIDcyNzMsICA3NjYxLCAgODA2MiwgIDg0NzUsICA4ODk5LCAgOTMzNCwgIDk3ODAsCisgICAgMTAyMzUsIDEwNjk5LCAxMTE3MiwgMTE2NTMsIDEyMTQxLCAxMjYzNiwgMTMxMzgsIDEzNjQ1LCAxNDE1NywgMTQ2NzMsCisgICAgMTUxOTMsIDE1NzE2LCAxNjI0MiwgMTY3NjksIDE3Mjk4LCAxNzgyNywgMTgzNTYsIDE4ODg0LCAxOTQxMSwgMTk5MzUsCisgICAgMjA0NTcsIDIwOTc1LCAyMTQ4OSwgMjE5OTksIDIyNTAzLCAyMzAwMiwgMjM0OTQsIDIzOTc4LCAyNDQ1NSwgMjQ5MjQsCisgICAgMjUzODQsIDI1ODM0LCAyNjI3NCwgMjY3MDQsIDI3MTIyLCAyNzUyOSwgMjc5MjQsIDI4MzA2LCAyODY3NSwgMjkwMzEsCisgICAgMjkzNzMsIDI5NzAwLCAzMDAxMiwgMzAzMTAsIDMwNTkyLCAzMDg1NywgMzExMDcsIDMxMzQwLCAzMTU1NywgMzE3NTYsCisgICAgMzE5MzgsIDMyMTAyLCAzMjI0OSwgMzIzNzcsIDMyNDg4LCAzMjU4MCwgMzI2NTQsIDMyNzEwLCAzMjc0NywgMzI3NjYsCisgICAgMzI3NjYsIDMyNzQ3LCAzMjcxMCwgMzI2NTQsIDMyNTgwLCAzMjQ4OCwgMzIzNzcsIDMyMjQ5LCAzMjEwMiwgMzE5MzgsCisgICAgMzE3NTYsIDMxNTU3LCAzMTM0MCwgMzExMDcsIDMwODU3LCAzMDU5MiwgMzAzMTAsIDMwMDEyLCAyOTcwMCwgMjkzNzMsCisgICAgMjkwMzEsIDI4Njc1LCAyODMwNiwgMjc5MjQsIDI3NTI5LCAyNzEyMiwgMjY3MDQsIDI2Mjc0LCAyNTgzNCwgMjUzODQsCisgICAgMjQ5MjQsIDI0NDU1LCAyMzk3OCwgMjM0OTQsIDIzMDAyLCAyMjUwMywgMjE5OTksIDIxNDg5LCAyMDk3NSwgMjA0NTcsCisgICAgMTk5MzUsIDE5NDExLCAxODg4NCwgMTgzNTYsIDE3ODI3LCAxNzI5OCwgMTY3NjksIDE2MjQyLCAxNTcxNiwgMTUxOTMsCisgICAgMTQ2NzMsIDE0MTU3LCAxMzY0NSwgMTMxMzgsIDEyNjM2LCAxMjE0MSwgMTE2NTMsIDExMTcyLCAxMDY5OSwgMTAyMzUsCisgICAgIDk3ODAsIDkzMzQsICAgODg5OSwgIDg0NzUsICA4MDYyLCAgNzY2MSwgIDcyNzMsICA2ODk3LCAgNjUzNCwgIDYxODYsCisgICAgIDU4NTEsIDU1MzEsICAgNTIyNiwgIDQ5MzcsICA0NjYzLCAgNDQwNSwgIDQxNjQsICAzOTM5LCAgMzczMSwgIDM1NDEsCisgICAgIDMzNjcsIDMyMTIsICAgMzA3NCwgIDI5NTUsICAyODUzLCAgMjc3MCwgIDI3MDUsICAyNjU5LCAgMjYzMSwgIDI2MjEKK307CisKKy8qKgorICogQmlub21pYWwgd2luZG93IGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgMl4xNQorICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBiaW5vbWlhbF93aW5kb3dbTFBDX09SREVSXSA9IHsKKyAgICAzMjc0OSwgMzI2OTUsIDMyNjA0LCAzMjQ3NywgMzIzMTUsIDMyMTE4LCAzMTg4NywgMzE2MjIsIDMxMzI0LCAzMDk5NQorfTsKKworLyoqCisgKiAwLjk5NF5pIHNjYWxlZCBieSAyXjE1CisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGJhbmR3aWR0aF9leHBhbmRbTFBDX09SREVSXSA9IHsKKyAgICAzMjU3MSwgMzIzNzYsIDMyMTgyLCAzMTk4OSwgMzE3OTcsIDMxNjA2LCAzMTQxNiwgMzEyMjgsIDMxMDQwLCAzMDg1NAorfTsKKworLyoqCisgKiAwLjVeaSBzY2FsZWQgYnkgMl4xNQorICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBwZXJjZXB0X2ZsdF90YmxbMl1bTFBDX09SREVSXSA9IHsKKyAgICAvKiBaZXJvIHBhcnQgKi8KKyAgICB7Mjk0OTEsIDI2NTQyLCAyMzg4OCwgMjE0OTksIDE5MzQ5LCAxNzQxNCwgMTU2NzMsIDE0MTA2LCAxMjY5NSwgMTE0MjV9LAorICAgIC8qIFBvbGUgcGFydCAqLworICAgIHsxNjM4NCwgIDgxOTIsICA0MDk2LCAgMjA0OCwgIDEwMjQsICAgNTEyLCAgIDI1NiwgICAxMjgsICAgIDY0LCAgICAzMn0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgY25nX2FkYXB0aXZlX2NiX2xhZ1s0XSA9IHsgMSwgMCwgMSwgMyB9OworCitzdGF0aWMgY29uc3QgaW50IGNuZ19maWx0WzRdID0geyAyNzMsIDk5OCwgNDk5LCAzMzMgfTsKKworc3RhdGljIGNvbnN0IGludCBjbmdfYnNlZ1szXSA9IHsgMjA0OCwgMTg0MzIsIDIzMTIzMyB9OworCisjZW5kaWYgLyogQVZDT0RFQ19HNzIzXzFfREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9nNzI2LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9nNzI2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMzFkOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3MjYuYwpAQCAtMCwwICsxLDQ5MyBAQAorLyoKKyAqIEcuNzI2IEFEUENNIGF1ZGlvIGNvZGVjCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgUm9tYW4gU2hhcG9zaG5paworICoKKyAqIFRoaXMgaXMgYSB2ZXJ5IHN0cmFpZ2h0Zm9yd2FyZCByZW5kaXRpb24gb2YgdGhlIEcuNzI2CisgKiBTZWN0aW9uIDQgIkNvbXB1dGF0aW9uYWwgRGV0YWlscyIuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCisvKioKKyAqIEcuNzI2IDExYml0IGZsb2F0LgorICogRy43MjYgU3RhbmRhcmQgdXNlcyByYXRoZXIgb2RkIDExYml0IGZsb2F0aW5nIHBvaW50IGFyaXRobWVudGljIGZvcgorICogbnVtZXJvdXMgb2NjYXNpb25zLiBJdCdzIGEgbXlzdGVyeSB0byBtZSB3aHkgdGhleSBkaWQgaXQgdGhpcyB3YXkKKyAqIGluc3RlYWQgb2Ygc2ltcGx5IHVzaW5nIDMyYml0IGludGVnZXIgYXJpdGhtZXRpYy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRmxvYXQxMSB7CisgICAgdWludDhfdCBzaWduOyAgIC8qKjwgMWJpdCBzaWduICovCisgICAgdWludDhfdCBleHA7ICAgIC8qKjwgNGJpdCBleHBvbmVudCAqLworICAgIHVpbnQ4X3QgbWFudDsgICAvKio8IDZiaXQgbWFudGlzc2EgKi8KK30gRmxvYXQxMTsKKworc3RhdGljIGlubGluZSBGbG9hdDExKiBpMmYoaW50IGksIEZsb2F0MTEqIGYpCit7CisgICAgZi0+c2lnbiA9IChpIDwgMCk7CisgICAgaWYgKGYtPnNpZ24pCisgICAgICAgIGkgPSAtaTsKKyAgICBmLT5leHAgPSBhdl9sb2cyXzE2Yml0KGkpICsgISFpOworICAgIGYtPm1hbnQgPSBpPyAoaTw8NikgPj4gZi0+ZXhwIDogMTw8NTsKKyAgICByZXR1cm4gZjsKK30KKworc3RhdGljIGlubGluZSBpbnQxNl90IG11bHQoRmxvYXQxMSogZjEsIEZsb2F0MTEqIGYyKQoreworICAgICAgICBpbnQgcmVzLCBleHA7CisKKyAgICAgICAgZXhwID0gZjEtPmV4cCArIGYyLT5leHA7CisgICAgICAgIHJlcyA9ICgoKGYxLT5tYW50ICogZjItPm1hbnQpICsgMHgzMCkgPj4gNCk7CisgICAgICAgIHJlcyA9IGV4cCA+IDE5ID8gcmVzIDw8IChleHAgLSAxOSkgOiByZXMgPj4gKDE5IC0gZXhwKTsKKyAgICAgICAgcmV0dXJuIChmMS0+c2lnbiBeIGYyLT5zaWduKSA/IC1yZXMgOiByZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNnbihpbnQgdmFsdWUpCit7CisgICAgcmV0dXJuICh2YWx1ZSA8IDApID8gLTEgOiAxOworfQorCit0eXBlZGVmIHN0cnVjdCBHNzI2VGFibGVzIHsKKyAgICBjb25zdCBpbnQqIHF1YW50OyAgICAgICAgIC8qKjwgcXVhbnRpemF0aW9uIHRhYmxlICovCisgICAgY29uc3QgaW50MTZfdCogaXF1YW50OyAgICAvKio8IGludmVyc2UgcXVhbnRpemF0aW9uIHRhYmxlICovCisgICAgY29uc3QgaW50MTZfdCogVzsgICAgICAgICAvKio8IHNwZWNpYWwgdGFibGUgIzEgOy0pICovCisgICAgY29uc3QgdWludDhfdCogRjsgICAgICAgICAvKio8IHNwZWNpYWwgdGFibGUgIzIgKi8KK30gRzcyNlRhYmxlczsKKwordHlwZWRlZiBzdHJ1Y3QgRzcyNkNvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIEc3MjZUYWJsZXMgdGJsczsgICAgLyoqPCBzdGF0aWMgdGFibGVzIG5lZWRlZCBmb3IgY29tcHV0YXRpb24gKi8KKworICAgIEZsb2F0MTEgc3JbMl07ICAgICAgLyoqPCBwcmV2LiByZWNvbnN0cnVjdGVkIHNhbXBsZXMgKi8KKyAgICBGbG9hdDExIGRxWzZdOyAgICAgIC8qKjwgcHJldi4gZGlmZmVyZW5jZSAqLworICAgIGludCBhWzJdOyAgICAgICAgICAgLyoqPCBzZWNvbmQgb3JkZXIgcHJlZGljdG9yIGNvZWZmcyAqLworICAgIGludCBiWzZdOyAgICAgICAgICAgLyoqPCBzaXh0aCBvcmRlciBwcmVkaWN0b3IgY29lZmZzICovCisgICAgaW50IHBrWzJdOyAgICAgICAgICAvKio8IHNpZ25zIG9mIHByZXYuIDIgc2V6ICsgZHEgKi8KKworICAgIGludCBhcDsgICAgICAgICAgICAgLyoqPCBzY2FsZSBmYWN0b3IgY29udHJvbCAqLworICAgIGludCB5dTsgICAgICAgICAgICAgLyoqPCBmYXN0IHNjYWxlIGZhY3RvciAqLworICAgIGludCB5bDsgICAgICAgICAgICAgLyoqPCBzbG93IHNjYWxlIGZhY3RvciAqLworICAgIGludCBkbXM7ICAgICAgICAgICAgLyoqPCBzaG9ydCBhdmVyYWdlIG1hZ25pdHVkZSBvZiBGW2ldICovCisgICAgaW50IGRtbDsgICAgICAgICAgICAvKio8IGxvbmcgYXZlcmFnZSBtYWduaXR1ZGUgb2YgRltpXSAqLworICAgIGludCB0ZDsgICAgICAgICAgICAgLyoqPCB0b25lIGRldGVjdCAqLworCisgICAgaW50IHNlOyAgICAgICAgICAgICAvKio8IGVzdGltYXRlZCBzaWduYWwgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiAqLworICAgIGludCBzZXo7ICAgICAgICAgICAgLyoqPCBlc3RpbWF0ZWQgc2Vjb25kIG9yZGVyIHByZWRpY3Rpb24gKi8KKyAgICBpbnQgeTsgICAgICAgICAgICAgIC8qKjwgcXVhbnRpemVyIHNjYWxpbmcgZmFjdG9yIGZvciB0aGUgbmV4dCBpdGVyYXRpb24gKi8KKyAgICBpbnQgY29kZV9zaXplOworICAgIGludCBsaXR0bGVfZW5kaWFuOyAgLyoqPCBsaXR0bGUtZW5kaWFuIGJpdHN0cmVhbSBhcyB1c2VkIGluIGFpZmYgYW5kIFN1biBBVSAqLworfSBHNzI2Q29udGV4dDsKKworc3RhdGljIGNvbnN0IGludCBxdWFudF90YmwxNltdID0gICAgICAgICAgICAgICAgICAvKio8IDE2a2JpdC9zIDJiaXRzIHBlciBzYW1wbGUgKi8KKyAgICAgICAgICAgeyAyNjAsIElOVF9NQVggfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGlxdWFudF90YmwxNltdID0KKyAgICAgICAgICAgeyAxMTYsIDM2NSwgMzY1LCAxMTYgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IFdfdGJsMTZbXSA9CisgICAgICAgICAgIHsgLTIyLCA0MzksIDQzOSwgLTIyIH07CitzdGF0aWMgY29uc3QgdWludDhfdCBGX3RibDE2W10gPQorICAgICAgICAgICB7IDAsIDcsIDcsIDAgfTsKKworc3RhdGljIGNvbnN0IGludCBxdWFudF90YmwyNFtdID0gICAgICAgICAgICAgICAgICAvKio8IDI0a2JpdC9zIDNiaXRzIHBlciBzYW1wbGUgKi8KKyAgICAgICAgICAgeyAgNywgMjE3LCAzMzAsIElOVF9NQVggfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGlxdWFudF90YmwyNFtdID0KKyAgICAgICAgICAgeyBJTlQxNl9NSU4sIDEzNSwgMjczLCAzNzMsIDM3MywgMjczLCAxMzUsIElOVDE2X01JTiB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgV190YmwyNFtdID0KKyAgICAgICAgICAgeyAtNCwgIDMwLCAxMzcsIDU4MiwgNTgyLCAxMzcsICAzMCwgLTQgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IEZfdGJsMjRbXSA9CisgICAgICAgICAgIHsgMCwgMSwgMiwgNywgNywgMiwgMSwgMCB9OworCitzdGF0aWMgY29uc3QgaW50IHF1YW50X3RibDMyW10gPSAgICAgICAgICAgICAgICAgIC8qKjwgMzJrYml0L3MgNGJpdHMgcGVyIHNhbXBsZSAqLworICAgICAgICAgICB7IC0xMjUsICA3OSwgMTc3LCAyNDUsIDI5OSwgMzQ4LCAzOTksIElOVF9NQVggfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGlxdWFudF90YmwzMltdID0KKyAgICAgICAgIHsgSU5UMTZfTUlOLCAgIDQsIDEzNSwgMjEzLCAyNzMsIDMyMywgMzczLCA0MjUsCisgICAgICAgICAgICAgICAgIDQyNSwgMzczLCAzMjMsIDI3MywgMjEzLCAxMzUsICAgNCwgSU5UMTZfTUlOIH07CitzdGF0aWMgY29uc3QgaW50MTZfdCBXX3RibDMyW10gPQorICAgICAgICAgICB7IC0xMiwgIDE4LCAgNDEsICA2NCwgMTEyLCAxOTgsIDM1NSwgMTEyMiwKKyAgICAgICAgICAgIDExMjIsIDM1NSwgMTk4LCAxMTIsICA2NCwgIDQxLCAgMTgsIC0xMn07CitzdGF0aWMgY29uc3QgdWludDhfdCBGX3RibDMyW10gPQorICAgICAgICAgICB7IDAsIDAsIDAsIDEsIDEsIDEsIDMsIDcsIDcsIDMsIDEsIDEsIDEsIDAsIDAsIDAgfTsKKworc3RhdGljIGNvbnN0IGludCBxdWFudF90Ymw0MFtdID0gICAgICAgICAgICAgICAgICAvKio8IDQwa2JpdC9zIDViaXRzIHBlciBzYW1wbGUgKi8KKyAgICAgICAgICAgeyAtMTIyLCAtMTYsICA2NywgMTM4LCAxOTcsIDI0OSwgMjk3LCAzMzgsCisgICAgICAgICAgICAgIDM3NywgNDEyLCA0NDQsIDQ3NCwgNTAxLCA1MjcsIDU1MiwgSU5UX01BWCB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgaXF1YW50X3RibDQwW10gPQorICAgICAgICAgeyBJTlQxNl9NSU4sIC02NiwgIDI4LCAxMDQsIDE2OSwgMjI0LCAyNzQsIDMxOCwKKyAgICAgICAgICAgICAgICAgMzU4LCAzOTUsIDQyOSwgNDU5LCA0ODgsIDUxNCwgNTM5LCA1NjYsCisgICAgICAgICAgICAgICAgIDU2NiwgNTM5LCA1MTQsIDQ4OCwgNDU5LCA0MjksIDM5NSwgMzU4LAorICAgICAgICAgICAgICAgICAzMTgsIDI3NCwgMjI0LCAxNjksIDEwNCwgIDI4LCAtNjYsIElOVDE2X01JTiB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgV190Ymw0MFtdID0KKyAgICAgICAgICAgeyAgIDE0LCAgMTQsICAyNCwgIDM5LCAgNDAsICA0MSwgICA1OCwgIDEwMCwKKyAgICAgICAgICAgICAgMTQxLCAxNzksIDIxOSwgMjgwLCAzNTgsIDQ0MCwgIDUyOSwgIDY5NiwKKyAgICAgICAgICAgICAgNjk2LCA1MjksIDQ0MCwgMzU4LCAyODAsIDIxOSwgIDE3OSwgIDE0MSwKKyAgICAgICAgICAgICAgMTAwLCAgNTgsICA0MSwgIDQwLCAgMzksICAyNCwgICAxNCwgICAxNCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgRl90Ymw0MFtdID0KKyAgICAgICAgICAgeyAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAyLCAzLCA0LCA1LCA2LCA2LAorICAgICAgICAgICAgIDYsIDYsIDUsIDQsIDMsIDIsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgfTsKKworc3RhdGljIGNvbnN0IEc3MjZUYWJsZXMgRzcyNlRhYmxlc19wb29sW10gPQorICAgICAgICAgICB7eyBxdWFudF90YmwxNiwgaXF1YW50X3RibDE2LCBXX3RibDE2LCBGX3RibDE2IH0sCisgICAgICAgICAgICB7IHF1YW50X3RibDI0LCBpcXVhbnRfdGJsMjQsIFdfdGJsMjQsIEZfdGJsMjQgfSwKKyAgICAgICAgICAgIHsgcXVhbnRfdGJsMzIsIGlxdWFudF90YmwzMiwgV190YmwzMiwgRl90YmwzMiB9LAorICAgICAgICAgICAgeyBxdWFudF90Ymw0MCwgaXF1YW50X3RibDQwLCBXX3RibDQwLCBGX3RibDQwIH19OworCisKKy8qKgorICogUGFyYSA0LjIuMiBwYWdlIDE4OiBBZGFwdGl2ZSBxdWFudGl6ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBxdWFudChHNzI2Q29udGV4dCogYywgaW50IGQpCit7CisgICAgaW50IHNpZ24sIGV4cCwgaSwgZGxuOworCisgICAgc2lnbiA9IGkgPSAwOworICAgIGlmIChkIDwgMCkgeworICAgICAgICBzaWduID0gMTsKKyAgICAgICAgZCA9IC1kOworICAgIH0KKyAgICBleHAgPSBhdl9sb2cyXzE2Yml0KGQpOworICAgIGRsbiA9ICgoZXhwPDw3KSArICgoKGQ8PDcpPj5leHApJjB4N2YpKSAtIChjLT55Pj4yKTsKKworICAgIHdoaWxlIChjLT50YmxzLnF1YW50W2ldIDwgSU5UX01BWCAmJiBjLT50YmxzLnF1YW50W2ldIDwgZGxuKQorICAgICAgICArK2k7CisKKyAgICBpZiAoc2lnbikKKyAgICAgICAgaSA9IH5pOworICAgIGlmIChjLT5jb2RlX3NpemUgIT0gMiAmJiBpID09IDApIC8qIEknbSBub3Qgc3VyZSB0aGlzIGlzIGEgZ29vZCBpZGVhICovCisgICAgICAgIGkgPSAweGZmOworCisgICAgcmV0dXJuIGk7Cit9CisKKy8qKgorICogUGFyYSA0LjIuMyBwYWdlIDIyOiBJbnZlcnNlIGFkYXB0aXZlIHF1YW50aXplci4KKyAqLworc3RhdGljIGlubGluZSBpbnQxNl90IGludmVyc2VfcXVhbnQoRzcyNkNvbnRleHQqIGMsIGludCBpKQoreworICAgIGludCBkcWwsIGRleCwgZHF0OworCisgICAgZHFsID0gYy0+dGJscy5pcXVhbnRbaV0gKyAoYy0+eSA+PiAyKTsKKyAgICBkZXggPSAoZHFsPj43KSAmIDB4ZjsgICAgICAgIC8qIDRiaXQgZXhwb25lbnQgKi8KKyAgICBkcXQgPSAoMTw8NykgKyAoZHFsICYgMHg3Zik7IC8qIGxvZzIgLT4gbGluZWFyICovCisgICAgcmV0dXJuIChkcWwgPCAwKSA/IDAgOiAoKGRxdDw8ZGV4KSA+PiA3KTsKK30KKworc3RhdGljIGludDE2X3QgZzcyNl9kZWNvZGUoRzcyNkNvbnRleHQqIGMsIGludCBJKQoreworICAgIGludCBkcSwgcmVfc2lnbmFsLCBwazAsIGZhMSwgaSwgdHIsIHlsaW50LCB5bGZyYWMsIHRocjIsIGFsLCBkcTA7CisgICAgRmxvYXQxMSBmOworICAgIGludCBJX3NpZz0gSSA+PiAoYy0+Y29kZV9zaXplIC0gMSk7CisKKyAgICBkcSA9IGludmVyc2VfcXVhbnQoYywgSSk7CisKKyAgICAvKiBUcmFuc2l0aW9uIGRldGVjdCAqLworICAgIHlsaW50ID0gKGMtPnlsID4+IDE1KTsKKyAgICB5bGZyYWMgPSAoYy0+eWwgPj4gMTApICYgMHgxZjsKKyAgICB0aHIyID0gKHlsaW50ID4gOSkgPyAweDFmIDw8IDEwIDogKDB4MjAgKyB5bGZyYWMpIDw8IHlsaW50OworICAgIHRyPSAoYy0+dGQgPT0gMSAmJiBkcSA+ICgoMyp0aHIyKT4+MikpOworCisgICAgaWYgKElfc2lnKSAgLyogZ2V0IHRoZSBzaWduICovCisgICAgICAgIGRxID0gLWRxOworICAgIHJlX3NpZ25hbCA9IGMtPnNlICsgZHE7CisKKyAgICAvKiBVcGRhdGUgc2Vjb25kIG9yZGVyIHByZWRpY3RvciBjb2VmZmljaWVudCBBMiBhbmQgQTEgKi8KKyAgICBwazAgPSAoYy0+c2V6ICsgZHEpID8gc2duKGMtPnNleiArIGRxKSA6IDA7CisgICAgZHEwID0gZHEgPyBzZ24oZHEpIDogMDsKKyAgICBpZiAodHIpIHsKKyAgICAgICAgYy0+YVswXSA9IDA7CisgICAgICAgIGMtPmFbMV0gPSAwOworICAgICAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisgICAgICAgICAgICBjLT5iW2ldID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGlzIGlzIGEgYml0IGNyYXp5LCBidXQgaXQgcmVhbGx5IGlzICsyNTUgbm90ICsyNTYgKi8KKyAgICAgICAgZmExID0gYXZfY2xpcCgoLWMtPmFbMF0qYy0+cGtbMF0qcGswKT4+NSwgLTI1NiwgMjU1KTsKKworICAgICAgICBjLT5hWzFdICs9IDEyOCpwazAqYy0+cGtbMV0gKyBmYTEgLSAoYy0+YVsxXT4+Nyk7CisgICAgICAgIGMtPmFbMV0gPSBhdl9jbGlwKGMtPmFbMV0sIC0xMjI4OCwgMTIyODgpOworICAgICAgICBjLT5hWzBdICs9IDY0KjMqcGswKmMtPnBrWzBdIC0gKGMtPmFbMF0gPj4gOCk7CisgICAgICAgIGMtPmFbMF0gPSBhdl9jbGlwKGMtPmFbMF0sIC0oMTUzNjAgLSBjLT5hWzFdKSwgMTUzNjAgLSBjLT5hWzFdKTsKKworICAgICAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisgICAgICAgICAgICBjLT5iW2ldICs9IDEyOCpkcTAqc2duKC1jLT5kcVtpXS5zaWduKSAtIChjLT5iW2ldPj44KTsKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgRHEgYW5kIFNyIGFuZCBQayAqLworICAgIGMtPnBrWzFdID0gYy0+cGtbMF07CisgICAgYy0+cGtbMF0gPSBwazAgPyBwazAgOiAxOworICAgIGMtPnNyWzFdID0gYy0+c3JbMF07CisgICAgaTJmKHJlX3NpZ25hbCwgJmMtPnNyWzBdKTsKKyAgICBmb3IgKGk9NTsgaT4wOyBpLS0pCisgICAgICAgIGMtPmRxW2ldID0gYy0+ZHFbaS0xXTsKKyAgICBpMmYoZHEsICZjLT5kcVswXSk7CisgICAgYy0+ZHFbMF0uc2lnbiA9IElfc2lnOyAvKiBJc24ndCBpdCBjcmF6eSA/IT8hICovCisKKyAgICBjLT50ZCA9IGMtPmFbMV0gPCAtMTE3NzY7CisKKyAgICAvKiBVcGRhdGUgQXAgKi8KKyAgICBjLT5kbXMgKz0gKGMtPnRibHMuRltJXTw8NCkgKyAoKC0gYy0+ZG1zKSA+PiA1KTsKKyAgICBjLT5kbWwgKz0gKGMtPnRibHMuRltJXTw8NCkgKyAoKC0gYy0+ZG1sKSA+PiA3KTsKKyAgICBpZiAodHIpCisgICAgICAgIGMtPmFwID0gMjU2OworICAgIGVsc2UgeworICAgICAgICBjLT5hcCArPSAoLWMtPmFwKSA+PiA0OworICAgICAgICBpZiAoYy0+eSA8PSAxNTM1IHx8IGMtPnRkIHx8IGFicygoYy0+ZG1zIDw8IDIpIC0gYy0+ZG1sKSA+PSAoYy0+ZG1sID4+IDMpKQorICAgICAgICAgICAgYy0+YXAgKz0gMHgyMDsKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgWXUgYW5kIFlsICovCisgICAgYy0+eXUgPSBhdl9jbGlwKGMtPnkgKyBjLT50YmxzLldbSV0gKyAoKC1jLT55KT4+NSksIDU0NCwgNTEyMCk7CisgICAgYy0+eWwgKz0gYy0+eXUgKyAoKC1jLT55bCk+PjYpOworCisgICAgLyogTmV4dCBpdGVyYXRpb24gZm9yIFkgKi8KKyAgICBhbCA9IChjLT5hcCA+PSAyNTYpID8gMTw8NiA6IGMtPmFwID4+IDI7CisgICAgYy0+eSA9IChjLT55bCArIChjLT55dSAtIChjLT55bD4+NikpKmFsKSA+PiA2OworCisgICAgLyogTmV4dCBpdGVyYXRpb24gZm9yIFNFIGFuZCBTRVogKi8KKyAgICBjLT5zZSA9IDA7CisgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorICAgICAgICBjLT5zZSArPSBtdWx0KGkyZihjLT5iW2ldID4+IDIsICZmKSwgJmMtPmRxW2ldKTsKKyAgICBjLT5zZXogPSBjLT5zZSA+PiAxOworICAgIGZvciAoaT0wOyBpPDI7IGkrKykKKyAgICAgICAgYy0+c2UgKz0gbXVsdChpMmYoYy0+YVtpXSA+PiAyLCAmZiksICZjLT5zcltpXSk7CisgICAgYy0+c2UgPj49IDE7CisKKyAgICByZXR1cm4gYXZfY2xpcChyZV9zaWduYWwgPDwgMiwgLTB4ZmZmZiwgMHhmZmZmKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGc3MjZfcmVzZXQoRzcyNkNvbnRleHQgKmMpCit7CisgICAgaW50IGk7CisKKyAgICBjLT50YmxzID0gRzcyNlRhYmxlc19wb29sW2MtPmNvZGVfc2l6ZSAtIDJdOworICAgIGZvciAoaT0wOyBpPDI7IGkrKykgeworICAgICAgICBjLT5zcltpXS5tYW50ID0gMTw8NTsKKyAgICAgICAgYy0+cGtbaV0gPSAxOworICAgIH0KKyAgICBmb3IgKGk9MDsgaTw2OyBpKyspIHsKKyAgICAgICAgYy0+ZHFbaV0ubWFudCA9IDE8PDU7CisgICAgfQorICAgIGMtPnl1ID0gNTQ0OworICAgIGMtPnlsID0gMzQ4MTY7CisKKyAgICBjLT55ID0gNTQ0OworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfQURQQ01fRzcyNl9FTkNPREVSCitzdGF0aWMgaW50MTZfdCBnNzI2X2VuY29kZShHNzI2Q29udGV4dCogYywgaW50MTZfdCBzaWcpCit7CisgICAgdWludDhfdCBpOworCisgICAgaSA9IHF1YW50KGMsIHNpZy80IC0gYy0+c2UpICYgKCgxPDxjLT5jb2RlX3NpemUpIC0gMSk7CisgICAgZzcyNl9kZWNvZGUoYywgaSk7CisgICAgcmV0dXJuIGk7Cit9CisKKy8qIEludGVyZmFjaW5nIHRvIHRoZSBsaWJhdmNvZGVjICovCisKK3N0YXRpYyBhdl9jb2xkIGludCBnNzI2X2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBHNzI2Q29udGV4dCogYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfVU5PRkZJQ0lBTCAmJgorICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgIT0gODAwMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNhbXBsZSByYXRlcyBvdGhlciB0aGFuIDhrSHogYXJlIG5vdCAiCisgICAgICAgICAgICAgICAiYWxsb3dlZCB3aGVuIHRoZSBjb21wbGlhbmNlIGxldmVsIGlzIGhpZ2hlciB0aGFuIHVub2ZmaWNpYWwuICIKKyAgICAgICAgICAgICAgICJSZXNhbXBsZSBvciByZWR1Y2UgdGhlIGNvbXBsaWFuY2UgbGV2ZWwuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXZfYXNzZXJ0MChhdmN0eC0+c2FtcGxlX3JhdGUgPiAwKTsKKworICAgIGlmKGF2Y3R4LT5jaGFubmVscyAhPSAxKXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IG1vbm8gaXMgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmJpdF9yYXRlKQorICAgICAgICBjLT5jb2RlX3NpemUgPSAoYXZjdHgtPmJpdF9yYXRlICsgYXZjdHgtPnNhbXBsZV9yYXRlLzIpIC8gYXZjdHgtPnNhbXBsZV9yYXRlOworCisgICAgYy0+Y29kZV9zaXplID0gYXZfY2xpcChjLT5jb2RlX3NpemUsIDIsIDUpOworICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IGMtPmNvZGVfc2l6ZSAqIGF2Y3R4LT5zYW1wbGVfcmF0ZTsKKyAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYy0+Y29kZV9zaXplOworCisgICAgZzcyNl9yZXNldChjKTsKKworICAgIC8qIHNlbGVjdCBhIGZyYW1lIHNpemUgdGhhdCB3aWxsIGVuZCBvbiBhIGJ5dGUgYm91bmRhcnkgYW5kIGhhdmUgYSBzaXplIG9mCisgICAgICAgYXBwcm94aW1hdGVseSAxMDI0IGJ5dGVzICovCisgICAgYXZjdHgtPmZyYW1lX3NpemUgPSAoKGludFtdKXsgNDA5NiwgMjczNiwgMjA0OCwgMTY0MCB9KVtjLT5jb2RlX3NpemUgLSAyXTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGc3MjZfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBHNzI2Q29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgaW50MTZfdCAqc2FtcGxlcyA9IChjb25zdCBpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBpbnQgaSwgcmV0LCBvdXRfc2l6ZTsKKworICAgIG91dF9zaXplID0gKGZyYW1lLT5uYl9zYW1wbGVzICogYy0+Y29kZV9zaXplICsgNykgLyA4OworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIG91dF9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGluaXRfcHV0X2JpdHMoJnBiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworCisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5uYl9zYW1wbGVzOyBpKyspCisgICAgICAgIHB1dF9iaXRzKCZwYiwgYy0+Y29kZV9zaXplLCBnNzI2X2VuY29kZShjLCAqc2FtcGxlcysrKSk7CisKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworCisgICAgYXZwa3QtPnNpemUgPSBvdXRfc2l6ZTsKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihHNzI2Q29udGV4dCwgeCkKKyNkZWZpbmUgQUUgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJjb2RlX3NpemUiLCAiQml0cyBwZXIgY29kZSIsIE9GRlNFVChjb2RlX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDQgfSwgMiwgNSwgQUUgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGc3MjZfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZzcyNiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgZGVmYXVsdHNbXSA9IHsKKyAgICB7ICJiIiwgIjAiIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkNvZGVjIGZmX2FkcGNtX2c3MjZfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZzcyNiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkcuNzI2IEFEUENNIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0c3MjYsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEc3MjZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBnNzI2X2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGc3MjZfZW5jb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJmc3MjZfY2xhc3MsCisgICAgLmRlZmF1bHRzICAgICAgID0gZGVmYXVsdHMsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfQURQQ01fRzcyNl9ERUNPREVSIHx8IENPTkZJR19BRFBDTV9HNzI2TEVfREVDT0RFUgorc3RhdGljIGF2X2NvbGQgaW50IGc3MjZfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEc3MjZDb250ZXh0KiBjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmKGF2Y3R4LT5jaGFubmVscyA+IDEpeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJEZWNvZGluZyBtb3JlIHRoYW4gb25lIGNoYW5uZWwiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBhdmN0eC0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworCisgICAgYy0+bGl0dGxlX2VuZGlhbiA9ICFzdHJjbXAoYXZjdHgtPmNvZGVjLT5uYW1lLCAiZzcyNmxlIik7CisKKyAgICBjLT5jb2RlX3NpemUgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgIGlmIChjLT5jb2RlX3NpemUgPCAyIHx8IGMtPmNvZGVfc2l6ZSA+IDUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBiaXRzICVkXG4iLCBjLT5jb2RlX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBnNzI2X3Jlc2V0KGMpOworCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGc3MjZfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBHNzI2Q29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50MTZfdCAqc2FtcGxlczsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBvdXRfc2FtcGxlcywgcmV0OworCisgICAgb3V0X3NhbXBsZXMgPSBidWZfc2l6ZSAqIDggLyBjLT5jb2RlX3NpemU7CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gb3V0X3NhbXBsZXM7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzYW1wbGVzID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJ1Zl9zaXplICogOCk7CisKKyAgICB3aGlsZSAob3V0X3NhbXBsZXMtLSkKKyAgICAgICAgKnNhbXBsZXMrKyA9IGc3MjZfZGVjb2RlKGMsIGMtPmxpdHRsZV9lbmRpYW4gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHNfbGUoJmdiLCBjLT5jb2RlX3NpemUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzKCZnYiwgYy0+Y29kZV9zaXplKSk7CisKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmZ2IpID4gMCkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGcmFtZSBpbnZhbGlkbHkgc3BsaXQsIG1pc3NpbmcgcGFyc2VyP1xuIik7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIGc3MjZfZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBHNzI2Q29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZzcyNl9yZXNldChjKTsKK30KKyNlbmRpZgorCisjaWYgQ09ORklHX0FEUENNX0c3MjZfREVDT0RFUgorQVZDb2RlYyBmZl9hZHBjbV9nNzI2X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImc3MjYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHLjcyNiBBRFBDTSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihHNzI2Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZzcyNl9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBnNzI2X2RlY29kZV9mcmFtZSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBnNzI2X2RlY29kZV9mbHVzaCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0FEUENNX0c3MjZMRV9ERUNPREVSCitBVkNvZGVjIGZmX2FkcGNtX2c3MjZsZV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJnNzI2bGUiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2TEUsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEc3MjZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBnNzI2X2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGc3MjZfZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IGc3MjZfZGVjb2RlX2ZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkcuNzI2IEFEUENNIGxpdHRsZS1lbmRpYW4iKSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2c3MjkuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3MjkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTY4MzEzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZzcyOS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBHLjcyOSwgRzcyOSBBbm5leCBEIGRlY29kZXJzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2lmbmRlZiBBVkNPREVDX0c3MjlfSAorI2RlZmluZSBBVkNPREVDX0c3MjlfSAorCisvKioKKyAqIHN1YmZyYW1lIHNpemUKKyAqLworI2RlZmluZSBTVUJGUkFNRV9TSVpFIDQwCisKKyNlbmRpZiAvLyBBVkNPREVDX0c3MjlfSApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZzcyOWRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3MjlkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1Y2E0NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3MjlkYXRhLmgKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBkYXRhIGZvciBHLjcyOSwgRzcyOSBBbm5leCBEIGRlY29kZXJzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVmxhZGltaXIgVm9yb3NoaWxvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRzcyOURBVEFfSAorI2RlZmluZSBBVkNPREVDX0c3MjlEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIE1BX05QICAgICAgICAgICAgICAgIDQgIC8vLzwgTW92aW5nIEF2ZXJhZ2UgKE1BKSBwcmVkaWN0aW9uIG9yZGVyCisKKyNkZWZpbmUgVlFfMVNUX0JJVFMgICAgICAgICAgNyAgLy8vPCBmaXJzdCBzdGFnZSB2ZWN0b3Igb2YgcXVhbnRpemVyIChzaXplIGluIGJpdHMpCisjZGVmaW5lIFZRXzJORF9CSVRTICAgICAgICAgIDUgIC8vLzwgc2Vjb25kIHN0YWdlIHZlY3RvciBvZiBxdWFudGl6ZXIgKHNpemUgaW4gYml0cykKKworI2RlZmluZSBHQ18xU1RfSURYX0JJVFNfOEsgICAzICAvLy88IGdhaW4gY29kZWJvb2sgKGZpcnN0IHN0YWdlKSBpbmRleCwgOGsgbW9kZSAoc2l6ZSBpbiBiaXRzKQorI2RlZmluZSBHQ18yTkRfSURYX0JJVFNfOEsgICA0ICAvLy88IGdhaW4gY29kZWJvb2sgKHNlY29uZCBzdGFnZSkgaW5kZXgsIDhrIG1vZGUgKHNpemUgaW4gYml0cykKKworI2RlZmluZSBHQ18xU1RfSURYX0JJVFNfNks0ICAzICAvLy88IGdhaW4gY29kZWJvb2sgKGZpcnN0IHN0YWdlKSBpbmRleCwgNi40ayBtb2RlIChzaXplIGluIGJpdHMpCisjZGVmaW5lIEdDXzJORF9JRFhfQklUU182SzQgIDMgIC8vLzwgZ2FpbiBjb2RlYm9vayAoc2Vjb25kIHN0YWdlKSBpbmRleCwgNi40ayBtb2RlIChzaXplIGluIGJpdHMpCisKKy8qKgorICogZmlyc3Qgc3RhZ2UgTFNQIGNvZGVib29rCisgKiAoMTAtZGltZW5zaW9uYWwsIHdpdGggMTI4IGVudHJpZXMgKDMuMjQgb2YgRy43MjkpCisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiX2xzcF8xc3RbMTw8VlFfMVNUX0JJVFNdWzEwXSA9IHsgLyogKDIuMTMpICovCisgIHsgMTQ4NiwgIDIxNjgsICAzNzUxLCAgOTA3NCwgMTIxMzQsIDEzOTQ0LCAxNzk4MywgMTkxNzMsIDIxMTkwLCAyMTgyMH0sCisgIHsgMTczMCwgIDI2NDAsICAzNDUwLCAgNDg3MCwgIDYxMjYsICA3ODc2LCAxNTY0NCwgMTc4MTcsIDIwMjk0LCAyMTkwMn0sCisgIHsgMTU2OCwgIDIyNTYsICAzMDg4LCAgNDg3NCwgMTEwNjMsIDEzMzkzLCAxODMwNywgMTkyOTMsIDIxMTA5LCAyMTc0MX0sCisgIHsgMTczMywgIDI1MTIsICAzMzU3LCAgNDcwOCwgIDY5NzcsIDEwMjk2LCAxNzAyNCwgMTc5NTYsIDE5MTQ1LCAyMDM1MH0sCisgIHsgMTc0NCwgIDI0MzYsICAzMzA4LCAgODczMSwgMTA0MzIsIDEyMDA3LCAxNTYxNCwgMTY2MzksIDIxMzU5LCAyMTkxM30sCisgIHsgMTc4NiwgIDIzNjksICAzMzcyLCAgNDUyMSwgIDY3OTUsIDEyOTYzLCAxNzY3NCwgMTg5ODgsIDIwODU1LCAyMTY0MH0sCisgIHsgMTYzMSwgIDI0MzMsICAzMzYxLCAgNjMyOCwgMTA3MDksIDEyMDEzLCAxMzI3NywgMTM5MDQsIDE5NDQxLCAyMTA4OH0sCisgIHsgMTQ4OSwgIDIzNjQsICAzMjkxLCAgNjI1MCwgIDkyMjcsIDEwNDAzLCAxMzg0MywgMTUyNzgsIDE3NzIxLCAyMTQ1MX0sCisgIHsgMTg2OSwgIDI1MzMsICAzNDc1LCAgNDM2NSwgIDkxNTIsIDE0NTEzLCAxNTkwOCwgMTcwMjIsIDIwNjExLCAyMTQxMX0sCisgIHsgMjA3MCwgIDMwMjUsICA0MzMzLCAgNTg1NCwgIDc4MDUsICA5MjMxLCAxMDU5NywgMTYwNDcsIDIwMTA5LCAyMTgzNH0sCisgIHsgMTkxMCwgIDI2NzMsICAzNDE5LCAgNDI2MSwgMTExNjgsIDE1MTExLCAxNjU3NywgMTc1OTEsIDE5MzEwLCAyMDI2NX0sCisgIHsgMTE0MSwgIDE4MTUsICAyNjI0LCAgNDYyMywgIDY0OTUsICA5NTg4LCAxMzk2OCwgMTY0MjgsIDE5MzUxLCAyMTI4Nn0sCisgIHsgMjE5MiwgIDMxNzEsICA0NzA3LCAgNTgwOCwgMTA5MDQsIDEyNTAwLCAxNDE2MiwgMTU2NjQsIDIxMTI0LCAyMTc4OX0sCisgIHsgMTI4NiwgIDE5MDcsICAyNTQ4LCAgMzQ1MywgIDk1NzQsIDExOTY0LCAxNTk3OCwgMTczNDQsIDE5NjkxLCAyMjQ5NX0sCisgIHsgMTkyMSwgIDI3MjAsICA0NjA0LCAgNjY4NCwgMTE1MDMsIDEyOTkyLCAxNDM1MCwgMTUyNjIsIDE2OTk3LCAyMDc5MX0sCisgIHsgMjA1MiwgIDI3NTksICAzODk3LCAgNTI0NiwgIDY2MzgsIDEwMjY3LCAxNTgzNCwgMTY4MTQsIDE4MTQ5LCAyMTY3NX0sCisgIHsgMTc5OCwgIDI0OTcsICA1NjE3LCAxMTQ0OSwgMTMxODksIDE0NzExLCAxNzA1MCwgMTgxOTUsIDIwMzA3LCAyMTE4Mn0sCisgIHsgMTAwOSwgIDE2NDcsICAyODg5LCAgNTcwOSwgIDk1NDEsIDEyMzU0LCAxNTIzMSwgMTg0OTQsIDIwOTY2LCAyMjAzM30sCisgIHsgMzAxNiwgIDM3OTQsICA1NDA2LCAgNzQ2OSwgMTI0ODgsIDEzOTg0LCAxNTMyOCwgMTYzMzQsIDE5OTUyLCAyMDc5MX0sCisgIHsgMjIwMywgIDMwNDAsICAzNzk2LCAgNTQ0MiwgMTE5ODcsIDEzNTEyLCAxNDkzMSwgMTYzNzAsIDE3ODU2LCAxODgwM30sCisgIHsgMjkxMiwgIDQyOTIsICA3OTg4LCAgOTU3MiwgMTE1NjIsIDEzMjQ0LCAxNDU1NiwgMTY1MjksIDIwMDA0LCAyMTA3M30sCisgIHsgMjg2MSwgIDM2MDcsICA1OTIzLCAgNzAzNCwgIDkyMzQsIDEyMDU0LCAxMzcyOSwgMTgwNTYsIDIwMjYyLCAyMDk3NH0sCisgIHsgMzA2OSwgIDQzMTEsICA1OTY3LCAgNzM2NywgMTE0ODIsIDEyNjk5LCAxNDMwOSwgMTYyMzMsIDE4MzMzLCAxOTE3Mn0sCisgIHsgMjQzNCwgIDM2NjEsICA0ODY2LCAgNTc5OCwgMTAzODMsIDExNzIyLCAxMzA0OSwgMTU2NjgsIDE4ODYyLCAxOTgzMX0sCisgIHsgMjAyMCwgIDI2MDUsICAzODYwLCAgOTI0MSwgMTMyNzUsIDE0NjQ0LCAxNjAxMCwgMTcwOTksIDE5MjY4LCAyMDI1MX0sCisgIHsgMTg3NywgIDI4MDksICAzNTkwLCAgNDcwNywgMTEwNTYsIDEyNDQxLCAxNTYyMiwgMTcxNjgsIDE4NzYxLCAxOTkwN30sCisgIHsgMjEwNywgIDI4NzMsICAzNjczLCAgNTc5OSwgMTM1NzksIDE0Njg3LCAxNTkzOCwgMTcwNzcsIDE4ODkwLCAxOTgzMX0sCisgIHsgMTYxMiwgIDIyODQsICAyOTQ0LCAgMzU3MiwgIDgyMTksIDEzOTU5LCAxNTkyNCwgMTcyMzksIDE4NTkyLCAyMDExN30sCisgIHsgMjQyMCwgIDMxNTYsICA2NTQyLCAxMDIxNSwgMTIwNjEsIDEzNTM0LCAxNTMwNSwgMTY0NTIsIDE4NzE3LCAxOTg4MH0sCisgIHsgMTY2NywgIDI2MTIsICAzNTM0LCAgNTIzNywgMTA1MTMsIDExNjk2LCAxMjk0MCwgMTY3OTgsIDE4MDU4LCAxOTM3OH0sCisgIHsgMjM4OCwgIDMwMTcsICA0ODM5LCAgOTMzMywgMTE0MTMsIDEyNzMwLCAxNTAyNCwgMTYyNDgsIDE3NDQ5LCAxODY3N30sCisgIHsgMTg3NSwgIDI3ODYsICA0MjMxLCAgNjMyMCwgIDg2OTQsIDEwMTQ5LCAxMTc4NSwgMTcwMTMsIDE4NjA4LCAxOTk2MH0sCisgIHsgIDY3OSwgIDE0MTEsICA0NjU0LCAgODAwNiwgMTE0NDYsIDEzMjQ5LCAxNTc2MywgMTgxMjcsIDIwMzYxLCAyMTU2N30sCisgIHsgMTgzOCwgIDI1OTYsICAzNTc4LCAgNDYwOCwgIDU2NTAsIDExMjc0LCAxNDM1NSwgMTU4ODYsIDIwNTc5LCAyMTc1NH0sCisgIHsgMTMwMywgIDE5NTUsICAyMzk1LCAgMzMyMiwgMTIwMjMsIDEzNzY0LCAxNTg4MywgMTgwNzcsIDIwMTgwLCAyMTIzMn0sCisgIHsgMTQzOCwgIDIxMDIsICAyNjYzLCAgMzQ2MiwgIDgzMjgsIDEwMzYyLCAxMzc2MywgMTcyNDgsIDE5NzMyLCAyMjM0NH0sCisgIHsgIDg2MCwgIDE5MDQsICA2MDk4LCAgNzc3NSwgIDk4MTUsIDEyMDA3LCAxNDgyMSwgMTY3MDksIDE5Nzg3LCAyMTEzMn0sCisgIHsgMTY3MywgIDI3MjMsICAzNzA0LCAgNjEyNSwgIDc2NjgsICA5NDQ3LCAxMzY4MywgMTQ0NDMsIDIwNTM4LCAyMTczMX0sCisgIHsgMTI0NiwgIDE4NDksICAyOTAyLCAgNDUwOCwgIDcyMjEsIDEyNzEwLCAxNDgzNSwgMTYzMTQsIDE5MzM1LCAyMjcyMH0sCisgIHsgMTUyNSwgIDIyNjAsICAzODYyLCAgNTY1OSwgIDczNDIsIDExNzQ4LCAxMzM3MCwgMTQ0NDIsIDE4MDQ0LCAyMTMzNH0sCisgIHsgMTE5NiwgIDE4NDYsICAzMTA0LCAgNzA2MywgMTA5NzIsIDEyOTA1LCAxNDgxNCwgMTcwMzcsIDE5OTIyLCAyMjYzNn0sCisgIHsgMjE0NywgIDMxMDYsICA0NDc1LCAgNjUxMSwgIDgyMjcsICA5NzY1LCAxMDk4NCwgMTIxNjEsIDE4OTcxLCAyMTMwMH0sCisgIHsgMTU4NSwgIDI0MDUsICAyOTk0LCAgNDAzNiwgMTE0ODEsIDEzMTc3LCAxNDUxOSwgMTU0MzEsIDE5OTY3LCAyMTI3NX0sCisgIHsgMTc3OCwgIDI2ODgsICAzNjE0LCAgNDY4MCwgIDk0NjUsIDExMDY0LCAxMjQ3MywgMTYzMjAsIDE5NzQyLCAyMDgwMH0sCisgIHsgMTg2MiwgIDI1ODYsICAzNDkyLCAgNjcxOSwgMTE3MDgsIDEzMDEyLCAxNDM2NCwgMTYxMjgsIDE5NjEwLCAyMDQyNX0sCisgIHsgMTM5NSwgIDIxNTYsICAyNjY5LCAgMzM4NiwgMTA2MDcsIDEyMTI1LCAxMzYxNCwgMTY3MDUsIDE4OTc2LCAyMTM2N30sCisgIHsgMTQ0NCwgIDIxMTcsICAzMjg2LCAgNjIzMywgIDk0MjMsIDEyOTgxLCAxNDk5OCwgMTU4NTMsIDE3MTg4LCAyMTg1N30sCisgIHsgMjAwNCwgIDI4OTUsICAzNzgzLCAgNDg5NywgIDYxNjgsICA3Mjk3LCAxMjYwOSwgMTY0NDUsIDE5Mjk3LCAyMTQ2NX0sCisgIHsgMTQ5NSwgIDI4NjMsICA2MzYwLCAgODEwMCwgMTEzOTksIDE0MjcxLCAxNTkwMiwgMTc3MTEsIDIwNDc5LCAyMjA2MX0sCisgIHsgMjQ4NCwgIDMxMTQsICA1NzE4LCAgNzA5NywgIDg0MDAsIDEyNjE2LCAxNDA3MywgMTQ4NDcsIDIwNTM1LCAyMTM5Nn0sCisgIHsgMjQyNCwgIDMyNzcsICA1Mjk2LCAgNjI4NCwgMTEyOTAsIDEyOTAzLCAxNjAyMiwgMTc1MDgsIDE5MzMzLCAyMDI4M30sCisgIHsgMjU2NSwgIDM3NzgsICA1MzYwLCAgNjk4OSwgIDg3ODIsIDEwNDI4LCAxNDM5MCwgMTU3NDIsIDE3NzcwLCAyMTczNH0sCisgIHsgMjcyNywgIDMzODQsICA2NjEzLCAgOTI1NCwgMTA1NDIsIDEyMjM2LCAxNDY1MSwgMTU2ODcsIDIwMDc0LCAyMTEwMn0sCisgIHsgMTkxNiwgIDI5NTMsICA2Mjc0LCAgODA4OCwgIDk3MTAsIDEwOTI1LCAxMjM5MiwgMTY0MzQsIDIwMDEwLCAyMTE4M30sCisgIHsgMzM4NCwgIDQzNjYsICA1MzQ5LCAgNzY2NywgMTExODAsIDEyNjA1LCAxMzkyMSwgMTUzMjQsIDE5OTAxLCAyMDc1NH0sCisgIHsgMzA3NSwgIDQyODMsICA1OTUxLCAgNzYxOSwgIDk2MDQsIDExMDEwLCAxMjM4NCwgMTQwMDYsIDIwNjU4LCAyMTQ5N30sCisgIHsgMTc1MSwgIDI0NTUsICA1MTQ3LCAgOTk2NiwgMTE2MjEsIDEzMTc2LCAxNDczOSwgMTY0NzAsIDIwNzg4LCAyMTc1Nn0sCisgIHsgMTQ0MiwgIDIxODgsICAzMzMwLCAgNjgxMywgIDg5MjksIDEyMTM1LCAxNDQ3NiwgMTUzMDYsIDE5NjM1LCAyMDU0NH0sCisgIHsgMjI5NCwgIDI4OTUsICA0MDcwLCAgODAzNSwgMTIyMzMsIDEzNDE2LCAxNDc2MiwgMTczNjcsIDE4OTUyLCAxOTY4OH0sCisgIHsgMTkzNywgIDI2NTksICA0NjAyLCAgNjY5NywgIDkwNzEsIDEyODYzLCAxNDE5NywgMTUyMzAsIDE2MDQ3LCAxODg3N30sCisgIHsgMjA3MSwgIDI2NjMsICA0MjE2LCAgOTQ0NSwgMTA4ODcsIDEyMjkyLCAxMzk0OSwgMTQ5MDksIDE5MjM2LCAyMDM0MX0sCisgIHsgMTc0MCwgIDI0OTEsICAzNDg4LCAgODEzOCwgIDk2NTYsIDExMTUzLCAxMzIwNiwgMTQ2ODgsIDIwODk2LCAyMTkwN30sCisgIHsgMjE5OSwgIDI4ODEsICA0Njc1LCAgODUyNywgMTAwNTEsIDExNDA4LCAxNDQzNSwgMTU0NjMsIDE3MTkwLCAyMDU5N30sCisgIHsgMTk0MywgIDI5ODgsICA0MTc3LCAgNjAzOSwgIDc0NzgsICA4NTM2LCAxNDE4MSwgMTU1NTEsIDE3NjIyLCAyMTU3OX0sCisgIHsgMTgyNSwgIDMxNzUsICA3MDYyLCAgOTgxOCwgMTI4MjQsIDE1NDUwLCAxODMzMCwgMTk4NTYsIDIxODMwLCAyMjQxMn0sCisgIHsgMjQ2NCwgIDMwNDYsICA0ODIyLCAgNTk3NywgIDc2OTYsIDE1Mzk4LCAxNjczMCwgMTc2NDYsIDIwNTg4LCAyMTMyMH0sCisgIHsgMjU1MCwgIDMzOTMsICA1MzA1LCAgNjkyMCwgMTAyMzUsIDE0MDgzLCAxODE0MywgMTkxOTUsIDIwNjgxLCAyMTMzNn0sCisgIHsgMzAwMywgIDM3OTksICA1MzIxLCAgNjQzNywgIDc5MTksIDExNjQzLCAxNTgxMCwgMTY4NDYsIDE4MTE5LCAxODk4MH0sCisgIHsgMzQ1NSwgIDQxNTcsICA2ODM4LCAgODE5OSwgIDk4NzcsIDEyMzE0LCAxNTkwNSwgMTY4MjYsIDE5OTQ5LCAyMDg5Mn0sCisgIHsgMzA1MiwgIDM3NjksICA0ODkxLCAgNTgxMCwgIDY5NzcsIDEwMTI2LCAxNDc4OCwgMTU5OTAsIDE5NzczLCAyMDkwNH0sCisgIHsgMzY3MSwgIDQzNTYsICA1ODI3LCAgNjk5NywgIDg0NjAsIDEyMDg0LCAxNDE1NCwgMTQ5MzksIDE5MjQ3LCAyMDQyM30sCisgIHsgMjcxNiwgIDM2ODQsICA1MjQ2LCAgNjY4NiwgIDg0NjMsIDEwMDAxLCAxMjM5NCwgMTQxMzEsIDE2MTUwLCAxOTc3Nn0sCisgIHsgMTk0NSwgIDI2MzgsICA0MTMwLCAgNzk5NSwgMTQzMzgsIDE1NTc2LCAxNzA1NywgMTgyMDYsIDIwMjI1LCAyMDk5N30sCisgIHsgMjMwNCwgIDI5MjgsICA0MTIyLCAgNDgyNCwgIDU2NDAsIDEzMTM5LCAxNTgyNSwgMTY5MzgsIDIwMTA4LCAyMTA1NH0sCisgIHsgMTgwMCwgIDI1MTYsICAzMzUwLCAgNTIxOSwgMTM0MDYsIDE1OTQ4LCAxNzYxOCwgMTg1NDAsIDIwNTMxLCAyMTI1Mn0sCisgIHsgMTQzNiwgIDIyMjQsICAyNzUzLCAgNDU0NiwgIDk2NTcsIDExMjQ1LCAxNTE3NywgMTYzMTcsIDE3NDg5LCAxOTEzNX0sCisgIHsgMjMxOSwgIDI4OTksICA0OTgwLCAgNjkzNiwgIDg0MDQsIDEzNDg5LCAxNTU1NCwgMTYyODEsIDIwMjcwLCAyMDkxMX0sCisgIHsgMjE4NywgIDI5MTksICA0NjEwLCAgNTg3NSwgIDczOTAsIDEyNTU2LCAxNDAzMywgMTY3OTQsIDIwOTk4LCAyMTc2OX0sCisgIHsgMjIzNSwgIDI5MjMsICA1MTIxLCAgNjI1OSwgIDgwOTksIDEzNTg5LCAxNTM0MCwgMTYzNDAsIDE3OTI3LCAyMDE1OX0sCisgIHsgMTc2NSwgIDI2MzgsICAzNzUxLCAgNTczMCwgIDc4ODMsIDEwMTA4LCAxMzYzMywgMTU0MTksIDE2ODA4LCAxODU3NH0sCisgIHsgMzQ2MCwgIDU3NDEsICA5NTk2LCAxMTc0MiwgMTQ0MTMsIDE2MDgwLCAxODE3MywgMTkwOTAsIDIwODQ1LCAyMTYwMX0sCisgIHsgMzczNSwgIDQ0MjYsICA2MTk5LCAgNzM2MywgIDkyNTAsIDE0NDg5LCAxNjAzNSwgMTcwMjYsIDE5ODczLCAyMDg3Nn0sCisgIHsgMzUyMSwgIDQ3NzgsICA2ODg3LCAgODY4MCwgMTI3MTcsIDE0MzIyLCAxNTk1MCwgMTgwNTAsIDIwMTY2LCAyMTE0NX0sCisgIHsgMjE0MSwgIDI5NjgsICA2ODY1LCAgODA1MSwgMTAwMTAsIDEzMTU5LCAxNDgxMywgMTU4NjEsIDE3NTI4LCAxODY1NX0sCisgIHsgNDE0OCwgIDYxMjgsICA5MDI4LCAxMDg3MSwgMTI2ODYsIDE0MDA1LCAxNTk3NiwgMTcyMDgsIDE5NTg3LCAyMDU5NX0sCisgIHsgNDQwMywgIDUzNjcsICA2NjM0LCAgODM3MSwgMTAxNjMsIDExNTk5LCAxNDk2MywgMTYzMzEsIDE3OTgyLCAxODc2OH0sCisgIHsgNDA5MSwgIDUzODYsICA2ODUyLCAgODc3MCwgMTE1NjMsIDEzMjkwLCAxNTcyOCwgMTY5MzAsIDE5MDU2LCAyMDEwMn0sCisgIHsgMjc0NiwgIDM2MjUsICA1Mjk5LCAgNzUwNCwgMTAyNjIsIDExNDMyLCAxMzE3MiwgMTU0OTAsIDE2ODc1LCAxNzUxNH0sCisgIHsgMjI0OCwgIDM1NTYsICA4NTM5LCAxMDU5MCwgMTI2NjUsIDE0Njk2LCAxNjUxNSwgMTc4MjQsIDIwMjY4LCAyMTI0N30sCisgIHsgMTI3OSwgIDE5NjAsICAzOTIwLCAgNzc5MywgMTAxNTMsIDE0NzUzLCAxNjY0NiwgMTgxMzksIDIwNjc5LCAyMTQ2Nn0sCisgIHsgMjQ0MCwgIDM0NzUsICA2NzM3LCAgODY1NCwgMTIxOTAsIDE0NTg4LCAxNzExOSwgMTc5MjUsIDE5MTEwLCAxOTk3OX0sCisgIHsgMTg3OSwgIDI1MTQsICA0NDk3LCAgNzU3MiwgMTAwMTcsIDE0OTQ4LCAxNjE0MSwgMTY4OTcsIDE4Mzk3LCAxOTM3Nn0sCisgIHsgMjgwNCwgIDM2ODgsICA3NDkwLCAxMDA4NiwgMTEyMTgsIDEyNzExLCAxNjMwNywgMTc0NzAsIDIwMDc3LCAyMTEyNn0sCisgIHsgMjAyMywgIDI2ODIsICAzODczLCAgODI2OCwgMTAyNTUsIDExNjQ1LCAxNTE4NywgMTcxMDIsIDE4OTY1LCAxOTc4OH0sCisgIHsgMjgyMywgIDM2MDUsICA1ODE1LCAgODU5NSwgMTAwODUsIDExNDY5LCAxNjU2OCwgMTc0NjIsIDE4NzU0LCAxOTg3Nn0sCisgIHsgMjg1MSwgIDM2ODEsICA1MjgwLCAgNzY0OCwgIDkxNzMsIDEwMzM4LCAxNDk2MSwgMTYxNDgsIDE3NTU5LCAxODQ3NH0sCisgIHsgMTM0OCwgIDI2NDUsICA1ODI2LCAgODc4NSwgMTA2MjAsIDEyODMxLCAxNjI1NSwgMTgzMTksIDIxMTMzLCAyMjU4Nn0sCisgIHsgMjE0MSwgIDMwMzYsICA0MjkzLCAgNjA4MiwgIDc1OTMsIDEwNjI5LCAxNzE1OCwgMTgwMzMsIDIxNDY2LCAyMjA4NH0sCisgIHsgMTYwOCwgIDIzNzUsICAzMzg0LCAgNjg3OCwgIDk5NzAsIDExMjI3LCAxNjkyOCwgMTc2NTAsIDIwMTg1LCAyMTEyMH0sCisgIHsgMjc3NCwgIDM2MTYsICA1MDE0LCAgNjU1NywgIDc3ODgsICA4OTU5LCAxNzA2OCwgMTgzMDIsIDE5NTM3LCAyMDU0Mn0sCisgIHsgMTkzNCwgIDQ4MTMsICA2MjA0LCAgNzIxMiwgIDg5NzksIDExNjY1LCAxNTk4OSwgMTc4MTEsIDIwNDI2LCAyMTcwM30sCisgIHsgMjI4OCwgIDM1MDcsICA1MDM3LCAgNjg0MSwgIDgyNzgsICA5NjM4LCAxNTA2NiwgMTY0ODEsIDIxNjUzLCAyMjIxNH0sCisgIHsgMjk1MSwgIDM3NzEsICA0ODc4LCAgNzU3OCwgIDkwMTYsIDEwMjk4LCAxNDQ5MCwgMTUyNDIsIDIwMjIzLCAyMDk5MH0sCisgIHsgMzI1NiwgIDQ3OTEsICA2NjAxLCAgNzUyMSwgIDg2NDQsICA5NzA3LCAxMzM5OCwgMTYwNzgsIDE5MTAyLCAyMDI0OX0sCisgIHsgMTgyNywgIDI2MTQsICAzNDg2LCAgNjAzOSwgMTIxNDksIDEzODIzLCAxNjE5MSwgMTcyODIsIDIxNDIzLCAyMjA0MX0sCisgIHsgMTAwMCwgIDE3MDQsICAzMDAyLCAgNjMzNSwgIDg0NzEsIDEwNTAwLCAxNDg3OCwgMTY5NzksIDIwMDI2LCAyMjQyN30sCisgIHsgMTY0NiwgIDIyODYsICAzMTA5LCAgNzI0NSwgMTE0OTMsIDEyNzkxLCAxNjgyNCwgMTc2NjcsIDE4OTgxLCAyMDIyMn0sCisgIHsgMTcwOCwgIDI1MDEsICAzMzE1LCAgNjczNywgIDg3MjksICA5OTI0LCAxNjA4OSwgMTcwOTcsIDE4Mzc0LCAxOTkxN30sCisgIHsgMjYyMywgIDM1MTAsICA0NDc4LCAgNTY0NSwgIDk4NjIsIDExMTE1LCAxNTIxOSwgMTgwNjcsIDE5NTgzLCAyMDM4Mn0sCisgIHsgMjUxOCwgIDM0MzQsICA0NzI4LCAgNjM4OCwgIDgwODIsICA5Mjg1LCAxMzE2MiwgMTgzODMsIDE5ODE5LCAyMDU1Mn0sCisgIHsgMTcyNiwgIDIzODMsICA0MDkwLCAgNjMwMywgIDc4MDUsIDEyODQ1LCAxNDYxMiwgMTc2MDgsIDE5MjY5LCAyMDE4MX0sCisgIHsgMjg2MCwgIDM3MzUsICA0ODM4LCAgNjA0NCwgIDcyNTQsICA4NDAyLCAxNDAzMSwgMTYzODEsIDE4MDM3LCAxOTQxMH0sCisgIHsgNDI0NywgIDU5OTMsICA3OTUyLCAgOTc5MiwgMTIzNDIsIDE0NjUzLCAxNzUyNywgMTg3NzQsIDIwODMxLCAyMTY5OX0sCisgIHsgMzUwMiwgIDQwNTEsICA1NjgwLCAgNjgwNSwgIDgxNDYsIDExOTQ1LCAxNjY0OSwgMTc0NDQsIDIwMzkwLCAyMTU2NH0sCisgIHsgMzE1MSwgIDQ4OTMsICA1ODk5LCAgNzE5OCwgMTE0MTgsIDEzMDczLCAxNTEyNCwgMTc2NzMsIDIwNTIwLCAyMTg2MX0sCisgIHsgMzk2MCwgIDQ4NDgsICA1OTI2LCAgNzI1OSwgIDg4MTEsIDEwNTI5LCAxNTY2MSwgMTY1NjAsIDE4MTk2LCAyMDE4M30sCisgIHsgNDQ5OSwgIDY2MDQsICA4MDM2LCAgOTI1MSwgMTA4MDQsIDEyNjI3LCAxNTg4MCwgMTc1MTIsIDIwMDIwLCAyMTA0Nn0sCisgIHsgNDI1MSwgIDU1NDEsICA2NjU0LCAgODMxOCwgIDk5MDAsIDExNjg2LCAxNTEwMCwgMTcwOTMsIDIwNTcyLCAyMTY4N30sCisgIHsgMzc2OSwgIDUzMjcsICA3ODY1LCAgOTM2MCwgMTA2ODQsIDExODE4LCAxMzY2MCwgMTUzNjYsIDE4NzMzLCAxOTg4Mn0sCisgIHsgMzA4MywgIDM5NjksICA2MjQ4LCAgODEyMSwgIDk3OTgsIDEwOTk0LCAxMjM5MywgMTM2ODYsIDE3ODg4LCAxOTEwNX0sCisgIHsgMjczMSwgIDQ2NzAsICA3MDYzLCAgOTIwMSwgMTEzNDYsIDEzNzM1LCAxNjg3NSwgMTg3OTcsIDIwNzg3LCAyMjM2MH0sCisgIHsgMTE4NywgIDIyMjcsICA0NzM3LCAgNzIxNCwgIDk2MjIsIDEyNjMzLCAxNTQwNCwgMTc5NjgsIDIwMjYyLCAyMzUzM30sCisgIHsgMTkxMSwgIDI0NzcsICAzOTE1LCAxMDA5OCwgMTE2MTYsIDEyOTU1LCAxNjIyMywgMTcxMzgsIDE5MjcwLCAyMDcyOX0sCisgIHsgMTc2NCwgIDI1MTksICAzODg3LCAgNjk0NCwgIDkxNTAsIDEyNTkwLCAxNjI1OCwgMTY5ODQsIDE3OTI0LCAxODQzNX0sCisgIHsgMTQwMCwgIDM2NzQsICA3MTMxLCAgODcxOCwgMTA2ODgsIDEyNTA4LCAxNTcwOCwgMTc3MTEsIDE5NzIwLCAyMTA2OH0sCisgIHsgMjMyMiwgIDMwNzMsICA0Mjg3LCAgODEwOCwgIDk0MDcsIDEwNjI4LCAxNTg2MiwgMTY2OTMsIDE5NzE0LCAyMTQ3NH0sCisgIHsgMjYzMCwgIDMzMzksICA0NzU4LCAgODM2MCwgMTAyNzQsIDExMzMzLCAxMjg4MCwgMTczNzQsIDE5MjIxLCAxOTkzNn0sCisgIHsgMTcyMSwgIDI1NzcsICA1NTUzLCAgNzE5NSwgIDg2NTEsIDEwNjg2LCAxNTA2OSwgMTY5NTMsIDE4NzAzLCAxOTkyOX0KK307CisKKy8qKgorICogc2Vjb25kIHN0YWdlIExTUCBjb2RlYm9vaywgaGlnaCBhbmQgbG93IHBhcnRzCisgICAoYm90aCA1LWRpbWVuc2lvbmFsLCB3aXRoIDMyIGVudHJpZXMgKDMuMi40IG9mIEcuNzI5KQorICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYl9sc3BfMm5kWzE8PFZRXzJORF9CSVRTXVsxMF0gPSB7IC8qICgyLjEzKSAqLworICB7IC00MzUsICAtODE1LCAgLTc0MiwgIDEwMzMsICAtNTE4LCAgIDU4MiwgLTEyMDEsICAgODI5LCAgICA4NiwgICAzODV9LAorICB7IC04MzMsICAtODkxLCAgIDQ2MywgICAgLTgsIC0xMjUxLCAgMTQ1MCwgICAgNzIsICAtMjMxLCAgIDg2NCwgICA2NjF9LAorICB7LTEwMjEsICAgMjMxLCAgLTMwNiwgICAzMjEsICAtMjIwLCAgLTE2MywgIC01MjYsICAtNzU0LCAtMTYzMywgICAyNjd9LAorICB7ICAgNTcsICAtMTk4LCAgLTMzOSwgICAtMzMsIC0xNDY4LCAgIDU3MywgICA3OTYsICAtMTY5LCAgLTYzMSwgICA4MTZ9LAorICB7ICAxNzEsICAtMzUwLCAgIDI5NCwgIDE2NjAsICAgNDUzLCAgIDUxOSwgICAyOTEsICAgMTU5LCAgLTY0MCwgLTEyOTZ9LAorICB7IC03MDEsICAtODQyLCAgIC01OCwgICA5NTAsICAgODkyLCAgMTU0OSwgICA3MTUsICAgNTI3LCAgLTcxNCwgIC0xOTN9LAorICB7ICA1ODQsICAgIDMxLCAgLTI4OSwgICAzNTYsICAtMzMzLCAgLTQ1NywgICA2MTIsICAtMjgzLCAtMTM4MSwgIC03NDF9LAorICB7IC0xMDksICAtODA4LCAgIDIzMSwgICAgNzcsICAgLTg3LCAgLTM0NCwgIDEzNDEsICAxMDg3LCAgLTY1NCwgIC01Njl9LAorICB7IC04NTksICAxMjM2LCAgIDU1MCwgICA4NTQsICAgNzE0LCAgLTU0MywgLTE3NTIsICAtMTk1LCAgIC05OCwgIC0yNzZ9LAorICB7IC04NzcsICAtOTU0LCAtMTI0OCwgIC0yOTksICAgMjEyLCAgLTIzNSwgIC03MjgsICAgOTQ5LCAgMTUxNywgICA4OTV9LAorICB7ICAtNzcsICAgMzQ0LCAgLTYyMCwgICA3NjMsICAgNDEzLCAgIDUwMiwgIC0zNjIsICAtOTYwLCAgLTQ4MywgIDEzODZ9LAorICB7IC0zMTQsICAtMzA3LCAgLTI1NiwgLTEyNjAsICAtNDI5LCAgIDQ1MCwgIC00NjYsICAtMTA4LCAgMTAxMCwgIDIyMjN9LAorICB7ICA3MTEsICAgNjkzLCAgIDUyMSwgICA2NTAsICAxMzA1LCAgIC0yOCwgIC0zNzgsICAgNzQ0LCAtMTAwNSwgICAyNDB9LAorICB7IC0xMTIsICAtMjcxLCAgLTUwMCwgICA5NDYsICAxNzMzLCAgIDI3MSwgICAtMTUsICAgOTA5LCAgLTI1OSwgIDE2ODh9LAorICB7ICA1NzUsICAgLTEwLCAgLTQ2OCwgIC0xOTksICAxMTAxLCAtMTAxMSwgICA1ODEsICAgLTUzLCAgLTc0NywgICA4Nzh9LAorICB7ICAxNDUsICAtMjg1LCAtMTI4MCwgIC0zOTgsICAgIDM2LCAgLTQ5OCwgLTEzNzcsICAgIDE4LCAgLTQ0NCwgIDE0ODN9LAorICB7LTExMzMsICAtODM1LCAgMTM1MCwgIDEyODQsICAgLTk1LCAgMTAxNSwgIC0yMjIsICAgNDQzLCAgIDM3MiwgIC0zNTR9LAorICB7LTE0NTksIC0xMjM3LCAgIDQxNiwgIC0yMTMsICAgNDY2LCAgIDY2OSwgICA2NTksICAxNjQwLCAgIDkzMiwgICA1MzR9LAorICB7ICAtMTUsICAgIDY2LCAgIDQ2OCwgIDEwMTksICAtNzQ4LCAgMTM4NSwgIC0xODIsICAtOTA3LCAgLTcyMSwgIC0yNjJ9LAorICB7IC0zMzgsICAgMTQ4LCAgMTQ0NSwgICAgNzUsICAtNzYwLCAgIDU2OSwgIDEyNDcsICAgMzM3LCAgIDQxNiwgIC0xMjF9LAorICB7ICAzODksICAgMjM5LCAgMTU2OCwgICA5ODEsICAgMTEzLCAgIDM2OSwgLTEwMDMsICAtNTA3LCAgLTU4NywgIC05MDR9LAorICB7IC0zMTIsICAgLTk4LCAgIDk0OSwgICAgMzEsICAxMTA0LCAgICA3MiwgIC0xNDEsICAxNDY1LCAgICA2MywgIC03ODV9LAorICB7IDExMjcsICAgNTg0LCAgIDgzNSwgICAyNzcsIC0xMTU5LCAgIDIwOCwgICAzMDEsICAtODgyLCAgIDExNywgIC00MDR9LAorICB7ICA1MzksICAtMTE0LCAgIDg1NiwgIC00OTMsICAgMjIzLCAgLTkxMiwgICA2MjMsICAgLTc2LCAgIDI3NiwgIC00NDB9LAorICB7IDIxOTcsICAyMzM3LCAgMTI2OCwgICA2NzAsICAgMzA0LCAgLTI2NywgIC01MjUsICAgMTQwLCAgIDg4MiwgIC0xMzl9LAorICB7LTE1OTYsICAgNTUwLCAgIDgwMSwgIC00NTYsICAgLTU2LCAgLTY5NywgICA4NjUsICAxMDYwLCAgIDQxMywgICA0NDZ9LAorICB7IDExNTQsICAgNTkzLCAgIC03NywgIDEyMzcsICAgLTMxLCAgIDU4MSwgLTEwMzcsICAtODk1LCAgIDY2OSwgICAyOTd9LAorICB7ICAzOTcsICAgNTU4LCAgIDIwMywgIC03OTcsICAtOTE5LCAgICAgMywgICA2OTIsICAtMjkyLCAgMTA1MCwgICA3ODJ9LAorICB7ICAzMzQsICAxNDc1LCAgIDYzMiwgICAtODAsICAgIDQ4LCAtMTA2MSwgIC00ODQsICAgMzYyLCAgLTU5NywgIC04NTJ9LAorICB7IC01NDUsICAtMzMwLCAgLTQyOSwgIC02ODAsICAxMTMzLCAtMTE4MiwgIC03NDQsICAxMzQwLCAgIDI2MiwgICAgNjN9LAorICB7IDEzMjAsICAgODI3LCAgLTM5OCwgIC01NzYsICAgMzQxLCAgLTc3NCwgIC00ODMsIC0xMjQ3LCAgIC03MCwgICAgOTh9LAorICB7IC0xNjMsICAgNjc0LCAgIC0xMSwgIC04ODYsICAgNTMxLCAtMTEyNSwgIC0yNjUsICAtMjQyLCAgIDcyNCwgICA5MzR9Cit9OworCisvKioKKyAqIGdhaW4gY29kZWJvb2sgKGZpcnN0IHN0YWdlKSwgOGsgbW9kZSAoMy45LjIgb2YgRy43MjkpCisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiX2dhaW5fMXN0XzhrWzE8PEdDXzFTVF9JRFhfQklUU184S11bMl0gPSB7IC8qKDAuMTQpICgyLjEzKSAqLworICB7IDMyNDIgLCAgOTk0OSB9LAorICB7IDE1NTEgLCAgMjQyNSB9LAorICB7IDI2NzggLCAyNzE2MiB9LAorICB7IDE5MjEgLCAgOTI5MSB9LAorICB7IDE4MzEgLCAgNTAyMiB9LAorICB7ICAgIDEgLCAgMTUxNiB9LAorICB7ICAzNTYgLCAxNDc1NiB9LAorICB7ICAgNTcgLCAgNTQwNCB9LAorfTsKKworLyoqCisgKiBnYWluIGNvZGVib29rIChzZWNvbmQgc3RhZ2UpLCA4ayBtb2RlICgzLjkuMiBvZiBHLjcyOSkKKyAqLworc3RhdGljIGNvbnN0IGludDE2X3QgY2JfZ2Fpbl8ybmRfOGtbMTw8R0NfMk5EX0lEWF9CSVRTXzhLXVsyXSA9IHsgLyooMS4xNCkgKDEuMTMpICovCisgIHsgIDUxNDIgLCAgIDU5MiB9LAorICB7IDE3Mjk5ICwgIDE4NjEgfSwKKyAgeyAgNjE2MCAsICAyMzk1IH0sCisgIHsgMTYxMTIgLCAgMzM5MiB9LAorICB7ICAgODI2ICwgIDIwMDUgfSwKKyAgeyAxODk3MyAsICA1OTM1IH0sCisgIHsgIDE5OTQgLCAgICAgMCB9LAorICB7IDE1NDM0ICwgICAyMzcgfSwKKyAgeyAxMDU3MyAsICAyOTY2IH0sCisgIHsgMTUxMzIgLCAgNDkxNCB9LAorICB7IDExNTY5ICwgIDExOTYgfSwKKyAgeyAxNDE5NCAsICAxNjMwIH0sCisgIHsgIDgwOTEgLCAgNDg2MSB9LAorICB7IDE1MTYxICwgMTQyNzYgfSwKKyAgeyAgOTEyMCAsICAgNTI1IH0sCisgIHsgMTMyNjAgLCAgMzI1NiB9LAorfTsKKworLyoqCisgKiBnYWluIGNvZGVib29rIChmaXJzdCBzdGFnZSksIDYuNGsgbW9kZSAoRC4zLjkuMiBvZiBHLjcyOSkKKyAqLworc3RhdGljIGNvbnN0IGludDE2X3QgY2JfZ2Fpbl8xc3RfNms0WzE8PEdDXzFTVF9JRFhfQklUU182SzRdWzJdID0KK3sgLyooMC4xNCkgKDEuMTQpKi8KKyB7IDU4NDksICAgICAwIH0sCisgeyAzMTcxLCAgOTI4MCB9LAorIHsgMzYxNywgIDY3NDcgfSwKKyB7IDQ5ODcsIDIyMjk0IH0sCisgeyAyOTI5LCAgMTA3OCB9LAorIHsgNjA2OCwgIDYwOTMgfSwKKyB7IDk0MjUsICAyNzMxIH0sCisgeyAzOTE1LCAxMjg3MiB9LAorfTsKKworLyoqCisgKiBnYWluIGNvZGVib29rIChzZWNvbmQgc3RhZ2UpLCA2LjRrIG1vZGUgKEQuMy45LjIgb2YgRy43MjkpCisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiX2dhaW5fMm5kXzZrNFsxPDxHQ18yTkRfSURYX0JJVFNfNks0XVsyXSA9Cit7IC8qKDEuMTQpICgxLjE0KSovCisgeyAgICAwLCAgNDE3NSB9LAorIHsxMDgyOCwgMjc2MDIgfSwKKyB7MTY0MjMsIDE1NzI0IH0sCisgeyA0NDc4LCAgNzMyNCB9LAorIHsgMzk4OCwgICAgIDAgfSwKKyB7MTAyOTEsIDExMzg1IH0sCisgezExOTU2LCAxMDczNSB9LAorIHsgNzg3NiwgIDc4MjEgfSwKK307CisKKy8qKgorICogNHRoIG9yZGVyIE1vdmluZyBBdmVyYWdlIChNQSkgUHJlZGljdG9yIGNvZGVib29rICgzLjIuNCBvZiBHLjcyOSkKKyAqCisgKiBmbG9hdCBjYl9tYV9wcmVkaWN0b3JfZmxvYXRbMl1bTUFfTlBdWzEwXSA9IHsKKyAqICAgeworICogICAgIHswLjI1NzAsIDAuMjc4MCwgMC4yODAwLCAwLjI3MzYsIDAuMjc1NywgMC4yNzY0LCAwLjI2NzUsIDAuMjY3OCwgMC4yNzc5LCAwLjI2NDd9LAorICogICAgIHswLjIxNDIsIDAuMjE5NCwgMC4yMzMxLCAwLjIyMzAsIDAuMjI3MiwgMC4yMjUyLCAwLjIxNDgsIDAuMjEyMywgMC4yMTE1LCAwLjIwOTZ9LAorICogICAgIHswLjE2NzAsIDAuMTUyMywgMC4xNTY3LCAwLjE1ODAsIDAuMTYwMSwgMC4xNTY5LCAwLjE1ODksIDAuMTU1NSwgMC4xNDc0LCAwLjE1NzF9LAorICogICAgIHswLjEyMzgsIDAuMDkyNSwgMC4wNzk4LCAwLjA5MjMsIDAuMDg5MCwgMC4wODI4LCAwLjEwMTAsIDAuMDk4OCwgMC4wODcyLCAwLjEwNjB9LAorICogICB9LAorICogICB7CisgKiAgICAgezAuMjM2MCwgMC4yNDA1LCAwLjI0OTksIDAuMjQ5NSwgMC4yNTE3LCAwLjI1OTEsIDAuMjYzNiwgMC4yNjI1LCAwLjI1NTEsIDAuMjMxMH0sCisgKiAgICAgezAuMTI4NSwgMC4wOTI1LCAwLjA3NzksIDAuMTA2MCwgMC4xMTgzLCAwLjExNzYsIDAuMTI3NywgMC4xMjY4LCAwLjExOTMsIDAuMTIxMX0sCisgKiAgICAgezAuMDk4MSwgMC4wNTg5LCAwLjA0MDEsIDAuMDY1NCwgMC4wNzYxLCAwLjA3MjgsIDAuMDg0MSwgMC4wODI2LCAwLjA3NzYsIDAuMDg5MX0sCisgKiAgICAgezAuMDkyMywgMC4wNDg2LCAwLjAyODcsIDAuMDQ5OCwgMC4wNTI2LCAwLjA0ODIsIDAuMDYyMSwgMC4wNjM2LCAwLjA1ODQsIDAuMDc5NH0sCisgKiAgIH0sCisgKiB9OworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorICogY2JfbWFfcHJlZGljdG9yW2pdW2tdW2ldID0gZmxvb3IoIDIgKiBjYl9tYV9wcmVkaWN0b3JfZmxvYXRbal1ba11baV0gKQorICoKKyAqIGo9MC4uMSwgaT0wLi45LCBrPTAuLk1BX05QLTEKKyAqLworc3RhdGljIGNvbnN0IGludDE2X3QgY2JfbWFfcHJlZGljdG9yWzJdW01BX05QXVsxMF0gPSB7IC8qICgwLjE1KSAqLworICB7CisgICAgeyA4NDIxLCAgOTEwOSwgIDkxNzUsICA4OTY1LCAgOTAzNCwgIDkwNTcsICA4NzY1LCAgODc3NSwgIDkxMDYsICA4NjczfSwKKyAgICB7IDcwMTgsICA3MTg5LCAgNzYzOCwgIDczMDcsICA3NDQ0LCAgNzM3OSwgIDcwMzgsICA2OTU2LCAgNjkzMCwgIDY4Njh9LAorICAgIHsgNTQ3MiwgIDQ5OTAsICA1MTM0LCAgNTE3NywgIDUyNDYsICA1MTQxLCAgNTIwNiwgIDUwOTUsICA0ODMwLCAgNTE0N30sCisgICAgeyA0MDU2LCAgMzAzMSwgIDI2MTQsICAzMDI0LCAgMjkxNiwgIDI3MTMsICAzMzA5LCAgMzIzNywgIDI4NTcsICAzNDczfQorICB9LAorICB7CisgICAgeyA3NzMzLCAgNzg4MCwgIDgxODgsICA4MTc1LCAgODI0NywgIDg0OTAsICA4NjM3LCAgODYwMSwgIDgzNTksICA3NTY5fSwKKyAgICB7IDQyMTAsICAzMDMxLCAgMjU1MiwgIDM0NzMsICAzODc2LCAgMzg1MywgIDQxODQsICA0MTU0LCAgMzkwOSwgIDM5Njh9LAorICAgIHsgMzIxNCwgIDE5MzAsICAxMzEzLCAgMjE0MywgIDI0OTMsICAyMzg1LCAgMjc1NSwgIDI3MDYsICAyNTQyLCAgMjkxOX0sCisgICAgeyAzMDI0LCAgMTU5MiwgICA5NDAsICAxNjMxLCAgMTcyMywgIDE1NzksICAyMDM0LCAgMjA4NCwgIDE5MTMsICAyNjAxfQorICB9Cit9OworCisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgMworICogY2JfbWFfcHJlZGljdG9yX3N1bVtqXVtpXSA9IGZsb29yKCAyICogKDEuMCAtIHN1bSAoIGNiX21hX3ByZWRpY3Rvcl9mbG9hdFtqXVtrXVtpXSApICkgKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs9MAorICogaj0wLi4xLCBpPTAuLjkKKyAqLworc3RhdGljIGNvbnN0IGludDE2X3QgY2JfbWFfcHJlZGljdG9yX3N1bVsyXVsxMF0gPSB7IC8qICgwLjE1KSAqLworICB7IDc3OTgsICA4NDQ3LCAgODIwNSwgIDgyOTMsICA4MTI2LCAgODQ3NywgIDg0NDcsICA4NzAzLCAgOTA0MywgIDg2MDR9LAorICB7MTQ1ODUsIDE4MzMzLCAxOTc3MiwgMTczNDQsIDE2NDI2LCAxNjQ1OSwgMTUxNTUsIDE1MjIwLCAxNjA0MywgMTU3MDh9Cit9OworCisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorICogY2JfbWFfcHJlZGljdG9yX3N1bV9pbnZbal1baV0gPSBmbG9vcigtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0pCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wIC0gc3VtICggY2JfbWFfcHJlZGljdG9yX2Zsb2F0W2pdW2tdW2ldICkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs9MAorICogaj0wLi4xLCBpPTAuLjkKKyAqLworc3RhdGljIGNvbnN0IGludDE2X3QgY2JfbWFfcHJlZGljdG9yX3N1bV9pbnZbMl1bMTBdID0geyAvKiAoMy4xMikgKi8KKyAgezE3MjEwLCAxNTg4OCwgMTYzNTcsIDE2MTgzLCAxNjUxNiwgMTU4MzMsIDE1ODg4LCAxNTQyMSwgMTQ4NDAsIDE1NTk3fSwKKyAgeyA5MjAyLCAgNzMyMCwgIDY3ODgsICA3NzM4LCAgODE3MCwgIDgxNTQsICA4ODU2LCAgODgxOCwgIDgzNjYsICA4NTQ0fQorfTsKKworLyoqCisgKiBNQSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAoMy45LjEgb2YgRy43MjksIG5lYXIgRXF1YXRpb24gNjkpCisgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBtYV9wcmVkaWN0aW9uX2NvZWZmWzRdID0geyAvKiAoMC4xMykgKi8KKyAgNTU3MSwgNDc1MSwgMjc4NSwgMTU1NgorfTsKKworLyoqCisgKiBpbml0aWFsIExTUCBjb2VmZmljaWVudHMgYmVsb25ncyB0byB2aXJ0dWFsIGZyYW1lIHByZWNlZGluZyAgdGhlCisgKiBmaXJzdCBmcmFtZSBvZiB0aGUgc3RyZWFtCisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGxzcF9pbml0WzEwXT0geyAvKiAoMC4xNSkgKi8KKyAgIDMwMDAwLCAyNjAwMCwgMjEwMDAsIDE1MDAwLCA4MDAwLCAwLCAtODAwMCwtMTUwMDAsLTIxMDAwLC0yNjAwMAorfTsKKworLyoqCisgKiBhZGRpdGlvbmFsICJwaGFzZSIgcG9zdC1wcm9jZXNzaW5nIGZpbHRlciBpbXB1bHNlIHJlc3BvbnNlIChELjYuMiBvZiBHLjcyOSkKKyAqCisgKiBUYWJsZSBjb250YWlucyB0aHJlZSBpbXB1bHNlIHJlc3BvbnNlcywgY29ycmVzcG9uZCB0bworICogZGlmZmVyZW50IGFtb3VudHMgb2Ygc3ByZWFkaW5nLgorICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBwaGFzZV9maWx0ZXJbM11bNDBdID0KK3sKKyAgeyAvLyBtYXhpbXVtIHNwcmVhZGluZyAoZm9yIG5vaXNlLWxpa2Ugc2VnbWVudHMpCisgICAgMTQ2OTAsIDExNTE4LCAgMTI2OCwgLTI3NjIsIC01NjcyLCAgNzUxNCwgIC0zNiwgLTI4MDgsIC0zMDQxLCAgNDgyMywKKyAgICAgMjk1MiwgLTg0MjUsICAzNzg1LCAgMTQ1NSwgIDIxNzksIC04NjM4LCA4MDUxLCAtMjEwNCwgLTE0NTUsICAgNzc3LAorICAgICAxMTA4LCAtMjM4NiwgIDIyNTQsICAtMzY0LCAgLTY3NSwgLTIxMDQsIDYwNDYsIC01NjgyLCAgMTA3MiwgIDMxMjMsCisgICAgLTUwNTksICA1MzEyLCAtMjMzMCwgLTM3MjksICA2OTI0LCAtMzg5MCwgIDY3NSwgLTE3NzYsICAgIDI5LCAxMDE0NSwKKyAgfSwKKyAgeyAvLyBtZWRpdW0gc3ByZWFkaW5nCisgICAgMzAyNzQsICAzODMxLCAtNDAzNywgIDI5NzIsIC0xMDQ5LCAtMTAwMywgIDI0NzcsIC0zMDQ0LCAgMjgxNSwgLTIyMzIsCisgICAgIDE3NTMsIC0xNjEyLCAgMTcxNCwgLTE3NzYsICAxNTQzLCAtMTAwOSwgICA0MjksICAtMTcwLCAgIDQ3MiwgLTEyNjUsCisgICAgIDIxNzYsIC0yNzA3LCAgMjUyMywgLTE2MjIsICAgMzQ0LCAgIDgyNiwgLTE1MzAsICAxNzI0LCAtMTY1OCwgIDE3MDEsCisgICAgLTIwNjQsICAyNjQ0LCAtMzA2MSwgIDI4OTcsIC0xOTc5LCAgIDU1NywgICA3ODAsIC0xMzcwLCAgIDg0MiwgICA2NTUsCisgIH0sCisgIHsgLy8gbm8gc3ByZWFkaW5nIChmb3Igdm9pY2VkIHNwZWVjaCkKKyAgICAzMjc2NywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgfQorfTsKKyNlbmRpZiAvKiBBVkNPREVDX0c3MjlEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2c3MjlkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3MjlkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWIwNTdmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZzcyOWRlYy5jCkBAIC0wLDAgKzEsNzI2IEBACisvKgorICogRy43MjksIEc3MjkgQW5uZXggRCBkZWNvZGVycworICogQ29weXJpZ2h0IChjKSAyMDA4IFZsYWRpbWlyIFZvcm9zaGlsb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiYXVkaW9kc3AuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKKyNpbmNsdWRlICJnNzI5LmgiCisjaW5jbHVkZSAibHNwLmgiCisjaW5jbHVkZSAiY2VscF9tYXRoLmgiCisjaW5jbHVkZSAiY2VscF9maWx0ZXJzLmgiCisjaW5jbHVkZSAiYWNlbHBfZmlsdGVycy5oIgorI2luY2x1ZGUgImFjZWxwX3BpdGNoX2RlbGF5LmgiCisjaW5jbHVkZSAiYWNlbHBfdmVjdG9ycy5oIgorI2luY2x1ZGUgImc3MjlkYXRhLmgiCisjaW5jbHVkZSAiZzcyOXBvc3RmaWx0ZXIuaCIKKworLyoqCisgKiBtaW5pbXVtIHF1YW50aXplZCBMU0YgdmFsdWUgKDMuMi40KQorICogMC4wMDUgaW4gUTEzCisgKi8KKyNkZWZpbmUgTFNGUV9NSU4gICAgICAgICAgICAgICAgICAgNDAKKworLyoqCisgKiBtYXhpbXVtIHF1YW50aXplZCBMU0YgdmFsdWUgKDMuMi40KQorICogMy4xMzUgaW4gUTEzCisgKi8KKyNkZWZpbmUgTFNGUV9NQVggICAgICAgICAgICAgICAgICAgMjU2ODEKKworLyoqCisgKiBtaW5pbXVtIExTRiBkaXN0YW5jZSAoMy4yLjQpCisgKiAwLjAzOTEgaW4gUTEzCisgKi8KKyNkZWZpbmUgTFNGUV9ESUZGX01JTiAgICAgICAgICAgICAgMzIxCisKKy8vLyBpbnRlcnBvbGF0aW9uIGZpbHRlciBsZW5ndGgKKyNkZWZpbmUgSU5URVJQT0xfTEVOICAgICAgICAgICAgICAxMQorCisvKioKKyAqIG1pbmltdW0gZ2FpbiBwaXRjaCB2YWx1ZSAoMy44LCBFcXVhdGlvbiA0NykKKyAqIDAuMiBpbiAoMS4xNCkKKyAqLworI2RlZmluZSBTSEFSUF9NSU4gICAgICAgICAgICAgICAgICAzMjc3CisKKy8qKgorICogbWF4aW11bSBnYWluIHBpdGNoIHZhbHVlICgzLjgsIEVxdWF0aW9uIDQ3KQorICogKEVFKSBUaGlzIGRvZXMgbm90IGNvbXBseSB3aXRoIHRoZSBzcGVjaWZpY2F0aW9uLgorICogU3BlY2lmaWNhdGlvbiBzYXlzIGFib3V0IDAuOCwgd2hpY2ggc2hvdWxkIGJlCisgKiAxMzEwNyBpbiAoMS4xNCksIGJ1dCByZWZlcmVuY2UgQyBjb2RlIHVzZXMKKyAqIDEzMDE3IChlcXVhbHMgdG8gMC43OTQ1KSBpbnN0ZWFkIG9mIGl0LgorICovCisjZGVmaW5lIFNIQVJQX01BWCAgICAgICAgICAgICAgICAgIDEzMDE3CisKKy8qKgorICogTVJfRU5FUkdZIChtZWFuIHJlbW92ZWQgZW5lcmd5KSA9IG1lYW5fZW5lcmd5ICsgMTAgKiBsb2cxMCgyXjI2ICAqIHN1YmZyYW1lX3NpemUpIGluICg3LjEzKQorICovCisjZGVmaW5lIE1SX0VORVJHWSAxMDE4MTU2CisKKyNkZWZpbmUgREVDSVNJT05fTk9JU0UgICAgICAgIDAKKyNkZWZpbmUgREVDSVNJT05fSU5URVJNRURJQVRFIDEKKyNkZWZpbmUgREVDSVNJT05fVk9JQ0UgICAgICAgIDIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBGT1JNQVRfRzcyOV84SyA9IDAsCisgICAgRk9STUFUX0c3MjlEXzZLNCwKKyAgICBGT1JNQVRfQ09VTlQsCit9IEc3MjlGb3JtYXRzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBhY19pbmRleF9iaXRzWzJdOyAgIC8vLzwgYWRhcHRpdmUgY29kZWJvb2sgaW5kZXggZm9yIHNlY29uZCBzdWJmcmFtZSAoc2l6ZSBpbiBiaXRzKQorICAgIHVpbnQ4X3QgcGFyaXR5X2JpdDsgICAgICAgICAvLy88IHBhcml0eSBiaXQgZm9yIHBpdGNoIGRlbGF5CisgICAgdWludDhfdCBnY18xc3RfaW5kZXhfYml0czsgIC8vLzwgZ2FpbiBjb2RlYm9vayAoZmlyc3Qgc3RhZ2UpIGluZGV4IChzaXplIGluIGJpdHMpCisgICAgdWludDhfdCBnY18ybmRfaW5kZXhfYml0czsgIC8vLzwgZ2FpbiBjb2RlYm9vayAoc2Vjb25kIHN0YWdlKSBpbmRleCAoc2l6ZSBpbiBiaXRzKQorICAgIHVpbnQ4X3QgZmNfc2lnbnNfYml0czsgICAgICAvLy88IG51bWJlciBvZiBwdWxzZXMgaW4gZml4ZWQtY29kZWJvb2sgdmVjdG9yCisgICAgdWludDhfdCBmY19pbmRleGVzX2JpdHM7ICAgIC8vLzwgc2l6ZSAoaW4gYml0cykgb2YgZml4ZWQtY29kZWJvb2sgaW5kZXggZW50cnkKK30gRzcyOUZvcm1hdERlc2NyaXB0aW9uOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQXVkaW9EU1BDb250ZXh0IGFkc3A7CisKKyAgICAvLy8gcGFzdCBleGNpdGF0aW9uIHNpZ25hbCBidWZmZXIKKyAgICBpbnQxNl90IGV4Y19iYXNlWzIqU1VCRlJBTUVfU0laRStQSVRDSF9ERUxBWV9NQVgrSU5URVJQT0xfTEVOXTsKKworICAgIGludDE2X3QqIGV4YzsgICAgICAgICAgICAgICAvLy88IHN0YXJ0IG9mIHBhc3QgZXhjaXRhdGlvbiBkYXRhIGluIGJ1ZmZlcgorICAgIGludCBwaXRjaF9kZWxheV9pbnRfcHJldjsgICAvLy88IGludGVnZXIgcGFydCBvZiBwcmV2aW91cyBzdWJmcmFtZSdzIHBpdGNoIGRlbGF5ICg0LjEuMykKKworICAgIC8vLyAoMi4xMykgTFNQIHF1YW50aXplciBvdXRwdXRzCisgICAgaW50MTZfdCAgcGFzdF9xdWFudGl6ZXJfb3V0cHV0X2J1ZltNQV9OUCArIDFdWzEwXTsKKyAgICBpbnQxNl90KiBwYXN0X3F1YW50aXplcl9vdXRwdXRzW01BX05QICsgMV07CisKKyAgICBpbnQxNl90IGxzZnFbMTBdOyAgICAgICAgICAgLy8vPCAoMi4xMykgcXVhbnRpemVkIExTRiBjb2VmZmljaWVudHMgZnJvbSBwcmV2aW91cyBmcmFtZQorICAgIGludDE2X3QgbHNwX2J1ZlsyXVsxMF07ICAgICAvLy88ICgwLjE1KSBMU1AgY29lZmZpY2llbnRzIChwcmV2aW91cyBhbmQgY3VycmVudCBmcmFtZXMpICgzLjIuNSkKKyAgICBpbnQxNl90ICpsc3BbMl07ICAgICAgICAgICAgLy8vPCBwb2ludGVycyB0byBsc3BfYnVmCisKKyAgICBpbnQxNl90IHF1YW50X2VuZXJneVs0XTsgICAgLy8vPCAoNS4xMCkgcGFzdCBxdWFudGl6ZWQgZW5lcmd5CisKKyAgICAvLy8gcHJldmlvdXMgc3BlZWNoIGRhdGEgZm9yIExQIHN5bnRoZXNpcyBmaWx0ZXIKKyAgICBpbnQxNl90IHN5bl9maWx0ZXJfZGF0YVsxMF07CisKKworICAgIC8vLyByZXNpZHVhbCBzaWduYWwgYnVmZmVyICh1c2VkIGluIGxvbmctdGVybSBwb3N0ZmlsdGVyKQorICAgIGludDE2X3QgcmVzaWR1YWxbU1VCRlJBTUVfU0laRSArIFJFU19QUkVWX0RBVEFfU0laRV07CisKKyAgICAvLy8gcHJldmlvdXMgc3BlZWNoIGRhdGEgZm9yIHJlc2lkdWFsIGNhbGN1bGF0aW9uIGZpbHRlcgorICAgIGludDE2X3QgcmVzX2ZpbHRlcl9kYXRhW1NVQkZSQU1FX1NJWkUrMTBdOworCisgICAgLy8vIHByZXZpb3VzIHNwZWVjaCBkYXRhIGZvciBzaG9ydC10ZXJtIHBvc3RmaWx0ZXIKKyAgICBpbnQxNl90IHBvc19maWx0ZXJfZGF0YVtTVUJGUkFNRV9TSVpFKzEwXTsKKworICAgIC8vLyAoMS4xNCkgcGl0Y2ggZ2FpbiBvZiBjdXJyZW50IGFuZCBmaXZlIHByZXZpb3VzIHN1YmZyYW1lcworICAgIGludDE2X3QgcGFzdF9nYWluX3BpdGNoWzZdOworCisgICAgLy8vICgxNC4xKSBnYWluIGNvZGUgZnJvbSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdWJmcmFtZQorICAgIGludDE2X3QgcGFzdF9nYWluX2NvZGVbMl07CisKKyAgICAvLy8gdm9pY2UgZGVjaXNpb24gb24gcHJldmlvdXMgc3ViZnJhbWUgKDAtbm9pc2UsIDEtaW50ZXJtZWRpYXRlLCAyLXZvaWNlKSwgRy43MjlECisgICAgaW50MTZfdCB2b2ljZV9kZWNpc2lvbjsKKworICAgIGludDE2X3Qgb25zZXQ7ICAgICAgICAgICAgICAvLy88IGRldGVjdGVkIG9uc2V0IGxldmVsICgwLTIpCisgICAgaW50MTZfdCB3YXNfcGVyaW9kaWM7ICAgICAgIC8vLzwgd2hldGhlciBwcmV2aW91cyBmcmFtZSB3YXMgZGVjbGFyZWQgYXMgcGVyaW9kaWMgb3Igbm90ICg0LjQpCisgICAgaW50MTZfdCBodF9wcmV2X2RhdGE7ICAgICAgIC8vLzwgcHJldmlvdXMgZGF0YSBmb3IgNC4yLjMsIGVxdWF0aW9uIDg2CisgICAgaW50IGdhaW5fY29lZmY7ICAgICAgICAgICAgIC8vLzwgKDEuMTQpIGdhaW4gY29lZmZpY2llbnQgKDQuMi40KQorICAgIHVpbnQxNl90IHJhbmRfdmFsdWU7ICAgICAgICAvLy88IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHZhbHVlICg0LjQuNCkKKyAgICBpbnQgbWFfcHJlZGljdG9yX3ByZXY7ICAgICAgLy8vPCBzd2l0Y2hlZCBNQSBwcmVkaWN0b3Igb2YgTFNQIHF1YW50aXplciBmcm9tIGxhc3QgZ29vZCBmcmFtZQorCisgICAgLy8vICgxNC4xNCkgaGlnaC1wYXNzIGZpbHRlciBkYXRhIChwYXN0IGlucHV0KQorICAgIGludCBocGZfZlsyXTsKKworICAgIC8vLyBoaWdoLXBhc3MgZmlsdGVyIGRhdGEgKHBhc3Qgb3V0cHV0KQorICAgIGludDE2X3QgaHBmX3pbMl07Cit9ICBHNzI5Q29udGV4dDsKKworc3RhdGljIGNvbnN0IEc3MjlGb3JtYXREZXNjcmlwdGlvbiBmb3JtYXRfZzcyOV84ayA9IHsKKyAgICAuYWNfaW5kZXhfYml0cyAgICAgPSB7OCw1fSwKKyAgICAucGFyaXR5X2JpdCAgICAgICAgPSAxLAorICAgIC5nY18xc3RfaW5kZXhfYml0cyA9IEdDXzFTVF9JRFhfQklUU184SywKKyAgICAuZ2NfMm5kX2luZGV4X2JpdHMgPSBHQ18yTkRfSURYX0JJVFNfOEssCisgICAgLmZjX3NpZ25zX2JpdHMgICAgID0gNCwKKyAgICAuZmNfaW5kZXhlc19iaXRzICAgPSAxMywKK307CisKK3N0YXRpYyBjb25zdCBHNzI5Rm9ybWF0RGVzY3JpcHRpb24gZm9ybWF0X2c3MjlkXzZrNCA9IHsKKyAgICAuYWNfaW5kZXhfYml0cyAgICAgPSB7OCw0fSwKKyAgICAucGFyaXR5X2JpdCAgICAgICAgPSAwLAorICAgIC5nY18xc3RfaW5kZXhfYml0cyA9IEdDXzFTVF9JRFhfQklUU182SzQsCisgICAgLmdjXzJuZF9pbmRleF9iaXRzID0gR0NfMk5EX0lEWF9CSVRTXzZLNCwKKyAgICAuZmNfc2lnbnNfYml0cyAgICAgPSAyLAorICAgIC5mY19pbmRleGVzX2JpdHMgICA9IDksCit9OworCisvKioKKyAqIEBicmllZiBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAqLworc3RhdGljIGlubGluZSB1aW50MTZfdCBnNzI5X3BybmcodWludDE2X3QgdmFsdWUpCit7CisgICAgcmV0dXJuIDMxODIxICogdmFsdWUgKyAxMzg0OTsKK30KKworLyoqCisgKiBHZXQgcGFyaXR5IGJpdCBvZiBiaXQgMi4uNworICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfcGFyaXR5KHVpbnQ4X3QgdmFsdWUpCit7CisgICByZXR1cm4gKDB4Njk5Njk2Njk5NjY5Njk5NlVMTCA+PiAodmFsdWUgPj4gMikpICYgMTsKK30KKworLyoqCisgKiBEZWNvZGVzIExTRiAoTGluZSBTcGVjdHJhbCBGcmVxdWVuY2llcykgZnJvbSBMMC1MMyAoMy4yLjQpLgorICogQHBhcmFtW291dF0gbHNmcSAoMi4xMykgcXVhbnRpemVkIExTRiBjb2VmZmljaWVudHMKKyAqIEBwYXJhbVtpbixvdXRdIHBhc3RfcXVhbnRpemVyX291dHB1dHMgKDIuMTMpIHF1YW50aXplciBvdXRwdXRzIGZyb20gcHJldmlvdXMgZnJhbWVzCisgKiBAcGFyYW0gbWFfcHJlZGljdG9yIHN3aXRjaGVkIE1BIHByZWRpY3RvciBvZiBMU1AgcXVhbnRpemVyCisgKiBAcGFyYW0gdnFfMXN0IGZpcnN0IHN0YWdlIHZlY3RvciBvZiBxdWFudGl6ZXIKKyAqIEBwYXJhbSB2cV8ybmRfbG93IHNlY29uZCBzdGFnZSBsb3dlciB2ZWN0b3Igb2YgTFNQIHF1YW50aXplcgorICogQHBhcmFtIHZxXzJuZF9oaWdoIHNlY29uZCBzdGFnZSBoaWdoZXIgdmVjdG9yIG9mIExTUCBxdWFudGl6ZXIKKyAqLworc3RhdGljIHZvaWQgbHNmX2RlY29kZShpbnQxNl90KiBsc2ZxLCBpbnQxNl90KiBwYXN0X3F1YW50aXplcl9vdXRwdXRzW01BX05QICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgbWFfcHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHZxXzFzdCwgaW50MTZfdCB2cV8ybmRfbG93LCBpbnQxNl90IHZxXzJuZF9oaWdoKQoreworICAgIGludCBpLGo7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgbWluX2Rpc3RhbmNlWzJdPXsxMCwgNX07IC8vKDIuMTMpCisgICAgaW50MTZfdCogcXVhbnRpemVyX291dHB1dCA9IHBhc3RfcXVhbnRpemVyX291dHB1dHNbTUFfTlBdOworCisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICBxdWFudGl6ZXJfb3V0cHV0W2ldICAgICA9IGNiX2xzcF8xc3RbdnFfMXN0XVtpICAgIF0gKyBjYl9sc3BfMm5kW3ZxXzJuZF9sb3cgXVtpICAgIF07CisgICAgICAgIHF1YW50aXplcl9vdXRwdXRbaSArIDVdID0gY2JfbHNwXzFzdFt2cV8xc3RdW2kgKyA1XSArIGNiX2xzcF8ybmRbdnFfMm5kX2hpZ2hdW2kgKyA1XTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgZGlmZiA9IChxdWFudGl6ZXJfb3V0cHV0W2kgLSAxXSAtIHF1YW50aXplcl9vdXRwdXRbaV0gKyBtaW5fZGlzdGFuY2Vbal0pID4+IDE7CisgICAgICAgICAgICBpZiAoZGlmZiA+IDApIHsKKyAgICAgICAgICAgICAgICBxdWFudGl6ZXJfb3V0cHV0W2kgLSAxXSAtPSBkaWZmOworICAgICAgICAgICAgICAgIHF1YW50aXplcl9vdXRwdXRbaSAgICBdICs9IGRpZmY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICBpbnQgc3VtID0gcXVhbnRpemVyX291dHB1dFtpXSAqIGNiX21hX3ByZWRpY3Rvcl9zdW1bbWFfcHJlZGljdG9yXVtpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IE1BX05QOyBqKyspCisgICAgICAgICAgICBzdW0gKz0gcGFzdF9xdWFudGl6ZXJfb3V0cHV0c1tqXVtpXSAqIGNiX21hX3ByZWRpY3RvclttYV9wcmVkaWN0b3JdW2pdW2ldOworCisgICAgICAgIGxzZnFbaV0gPSBzdW0gPj4gMTU7CisgICAgfQorCisgICAgZmZfYWNlbHBfcmVvcmRlcl9sc2YobHNmcSwgTFNGUV9ESUZGX01JTiwgTFNGUV9NSU4sIExTRlFfTUFYLCAxMCk7Cit9CisKKy8qKgorICogUmVzdG9yZXMgcGFzdCBMU1AgcXVhbnRpemVyIG91dHB1dCB1c2luZyBMU0YgZnJvbSBwcmV2aW91cyBmcmFtZQorICogQHBhcmFtW2luLG91dF0gbHNmcSAoMi4xMykgcXVhbnRpemVkIExTRiBjb2VmZmljaWVudHMKKyAqIEBwYXJhbVtpbixvdXRdIHBhc3RfcXVhbnRpemVyX291dHB1dHMgKDIuMTMpIHF1YW50aXplciBvdXRwdXRzIGZyb20gcHJldmlvdXMgZnJhbWVzCisgKiBAcGFyYW0gbWFfcHJlZGljdG9yX3ByZXYgTUEgcHJlZGljdG9yIGZyb20gcHJldmlvdXMgZnJhbWUKKyAqIEBwYXJhbSBsc2ZxX3ByZXYgKDIuMTMpIHF1YW50aXplZCBMU0YgY29lZmZpY2llbnRzIGZyb20gcHJldmlvdXMgZnJhbWUKKyAqLworc3RhdGljIHZvaWQgbHNmX3Jlc3RvcmVfZnJvbV9wcmV2aW91cyhpbnQxNl90KiBsc2ZxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBwYXN0X3F1YW50aXplcl9vdXRwdXRzW01BX05QICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYV9wcmVkaWN0b3JfcHJldikKK3sKKyAgICBpbnQxNl90KiBxdWFudGl6ZXJfb3V0cHV0ID0gcGFzdF9xdWFudGl6ZXJfb3V0cHV0c1tNQV9OUF07CisgICAgaW50IGksazsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgIGludCB0bXAgPSBsc2ZxW2ldIDw8IDE1OworCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBNQV9OUDsgaysrKQorICAgICAgICAgICAgdG1wIC09IHBhc3RfcXVhbnRpemVyX291dHB1dHNba11baV0gKiBjYl9tYV9wcmVkaWN0b3JbbWFfcHJlZGljdG9yX3ByZXZdW2tdW2ldOworCisgICAgICAgIHF1YW50aXplcl9vdXRwdXRbaV0gPSAoKHRtcCA+PiAxNSkgKiBjYl9tYV9wcmVkaWN0b3Jfc3VtX2ludlttYV9wcmVkaWN0b3JfcHJldl1baV0pID4+IDEyOworICAgIH0KK30KKworLyoqCisgKiBDb25zdHJ1Y3RzIG5ldyBleGNpdGF0aW9uIHNpZ25hbCBhbmQgYXBwbGllcyBwaGFzZSBmaWx0ZXIgdG8gaXQKKyAqIEBwYXJhbVtvdXRdIG91dCBjb25zdHJ1Y3RlZCBzcGVlY2ggc2lnbmFsCisgKiBAcGFyYW0gaW4gb3JpZ2luYWwgZXhjaXRhdGlvbiBzaWduYWwKKyAqIEBwYXJhbSBmY19jdXIgKDIuMTMpIG9yaWdpbmFsIGZpeGVkLWNvZGVib29rIHZlY3RvcgorICogQHBhcmFtIGdhaW5fY29kZSAoMTQuMSkgZ2FpbiBjb2RlCisgKiBAcGFyYW0gc3ViZnJhbWVfc2l6ZSBsZW5ndGggb2YgdGhlIHN1YmZyYW1lCisgKi8KK3N0YXRpYyB2b2lkIGc3MjlkX2dldF9uZXdfZXhjKAorICAgICAgICBpbnQxNl90KiBvdXQsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGluLAorICAgICAgICBjb25zdCBpbnQxNl90KiBmY19jdXIsCisgICAgICAgIGludCBkc3RhdGUsCisgICAgICAgIGludCBnYWluX2NvZGUsCisgICAgICAgIGludCBzdWJmcmFtZV9zaXplKQoreworICAgIGludCBpOworICAgIGludDE2X3QgZmNfbmV3W1NVQkZSQU1FX1NJWkVdOworCisgICAgZmZfY2VscF9jb252b2x2ZV9jaXJjKGZjX25ldywgZmNfY3VyLCBwaGFzZV9maWx0ZXJbZHN0YXRlXSwgc3ViZnJhbWVfc2l6ZSk7CisKKyAgICBmb3IoaT0wOyBpPHN1YmZyYW1lX3NpemU7IGkrKykKKyAgICB7CisgICAgICAgIG91dFtpXSAgPSBpbltpXTsKKyAgICAgICAgb3V0W2ldIC09IChnYWluX2NvZGUgKiBmY19jdXJbaV0gKyAweDIwMDApID4+IDE0OworICAgICAgICBvdXRbaV0gKz0gKGdhaW5fY29kZSAqIGZjX25ld1tpXSArIDB4MjAwMCkgPj4gMTQ7CisgICAgfQorfQorCisvKioKKyAqIE1ha2VzIGRlY2lzaW9uIGFib3V0IG9uc2V0IGluIGN1cnJlbnQgc3ViZnJhbWUKKyAqIEBwYXJhbSBwYXN0X29uc2V0IGRlY2lzaW9uIHJlc3VsdCBvZiBwcmV2aW91cyBzdWJmcmFtZQorICogQHBhcmFtIHBhc3RfZ2Fpbl9jb2RlIGdhaW4gY29kZSBvZiBjdXJyZW50IGFuZCBwcmV2aW91cyBzdWJmcmFtZQorICoKKyAqIEByZXR1cm4gb25zZXQgZGVjaXNpb24gcmVzdWx0IGZvciBjdXJyZW50IHN1YmZyYW1lCisgKi8KK3N0YXRpYyBpbnQgZzcyOWRfb25zZXRfZGVjaXNpb24oaW50IHBhc3Rfb25zZXQsIGNvbnN0IGludDE2X3QqIHBhc3RfZ2Fpbl9jb2RlKQoreworICAgIGlmKChwYXN0X2dhaW5fY29kZVswXSA+PiAxKSA+IHBhc3RfZ2Fpbl9jb2RlWzFdKQorICAgICAgICByZXR1cm4gMjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGRk1BWChwYXN0X29uc2V0LTEsIDApOworfQorCisvKioKKyAqIE1ha2VzIGRlY2lzaW9uIGFib3V0IHZvaWNlIHByZXNlbmNlIGluIGN1cnJlbnQgc3ViZnJhbWUKKyAqIEBwYXJhbSBvbnNldCBvbnNldCBsZXZlbAorICogQHBhcmFtIHByZXZfdm9pY2VfZGVjaXNpb24gdm9pY2UgZGVjaXNpb24gcmVzdWx0IGZyb20gcHJldmlvdXMgc3ViZnJhbWUKKyAqIEBwYXJhbSBwYXN0X2dhaW5fcGl0Y2ggcGl0Y2ggZ2FpbiBvZiBjdXJyZW50IGFuZCBwcmV2aW91cyBzdWJmcmFtZXMKKyAqCisgKiBAcmV0dXJuIHZvaWNlIGRlY2lzaW9uIHJlc3VsdCBmb3IgY3VycmVudCBzdWJmcmFtZQorICovCitzdGF0aWMgaW50MTZfdCBnNzI5ZF92b2ljZV9kZWNpc2lvbihpbnQgb25zZXQsIGludCBwcmV2X3ZvaWNlX2RlY2lzaW9uLCBjb25zdCBpbnQxNl90KiBwYXN0X2dhaW5fcGl0Y2gpCit7CisgICAgaW50IGksIGxvd19nYWluX3BpdGNoX2NudCwgdm9pY2VfZGVjaXNpb247CisKKyAgICBpZihwYXN0X2dhaW5fcGl0Y2hbMF0gPj0gMTQ3NDUpICAgICAgLy8gMC45CisgICAgICAgIHZvaWNlX2RlY2lzaW9uID0gREVDSVNJT05fVk9JQ0U7CisgICAgZWxzZSBpZiAocGFzdF9nYWluX3BpdGNoWzBdIDw9IDk4MzApIC8vIDAuNgorICAgICAgICB2b2ljZV9kZWNpc2lvbiA9IERFQ0lTSU9OX05PSVNFOworICAgIGVsc2UKKyAgICAgICAgdm9pY2VfZGVjaXNpb24gPSBERUNJU0lPTl9JTlRFUk1FRElBVEU7CisKKyAgICBmb3IoaT0wLCBsb3dfZ2Fpbl9waXRjaF9jbnQ9MDsgaTw2OyBpKyspCisgICAgICAgIGlmKHBhc3RfZ2Fpbl9waXRjaFtpXSA8IDk4MzApCisgICAgICAgICAgICBsb3dfZ2Fpbl9waXRjaF9jbnQrKzsKKworICAgIGlmKGxvd19nYWluX3BpdGNoX2NudCA+IDIgJiYgIW9uc2V0KQorICAgICAgICB2b2ljZV9kZWNpc2lvbiA9IERFQ0lTSU9OX05PSVNFOworCisgICAgaWYoIW9uc2V0ICYmIHZvaWNlX2RlY2lzaW9uID4gcHJldl92b2ljZV9kZWNpc2lvbiArIDEpCisgICAgICAgIHZvaWNlX2RlY2lzaW9uLS07CisKKyAgICBpZihvbnNldCAmJiB2b2ljZV9kZWNpc2lvbiA8IERFQ0lTSU9OX1ZPSUNFKQorICAgICAgICB2b2ljZV9kZWNpc2lvbisrOworCisgICAgcmV0dXJuIHZvaWNlX2RlY2lzaW9uOworfQorCitzdGF0aWMgaW50MzJfdCBzY2FsYXJwcm9kdWN0X2ludDE2X2MoY29uc3QgaW50MTZfdCAqIHYxLCBjb25zdCBpbnQxNl90ICogdjIsIGludCBvcmRlcikKK3sKKyAgICBpbnQgcmVzID0gMDsKKworICAgIHdoaWxlIChvcmRlci0tKQorICAgICAgICByZXMgKz0gKnYxKysgKiAqdjIrKzsKKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVyX2luaXQoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCkKK3sKKyAgICBHNzI5Q29udGV4dCogY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSxrOworCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBtb25vIHNvdW5kIGlzIHN1cHBvcnRlZCAocmVxdWVzdGVkIGNoYW5uZWxzOiAlZCkuXG4iLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzE2OworCisgICAgLyogQm90aCA4a2JpdC9zIGFuZCA2LjRrYml0L3MgbW9kZXMgdXNlcyB0d28gc3ViZnJhbWVzIHBlciBmcmFtZS4gKi8KKyAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IFNVQkZSQU1FX1NJWkUgPDwgMTsKKworICAgIGN0eC0+Z2Fpbl9jb2VmZiA9IDE2Mzg0OyAvLyAxLjAgaW4gKDEuMTQpCisKKyAgICBmb3IgKGsgPSAwOyBrIDwgTUFfTlAgKyAxOyBrKyspIHsKKyAgICAgICAgY3R4LT5wYXN0X3F1YW50aXplcl9vdXRwdXRzW2tdID0gY3R4LT5wYXN0X3F1YW50aXplcl9vdXRwdXRfYnVmW2tdOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMTE7IGkrKykKKyAgICAgICAgICAgIGN0eC0+cGFzdF9xdWFudGl6ZXJfb3V0cHV0c1trXVtpIC0gMV0gPSAoMTg3MTcgKiBpKSA+PiAzOworICAgIH0KKworICAgIGN0eC0+bHNwWzBdID0gY3R4LT5sc3BfYnVmWzBdOworICAgIGN0eC0+bHNwWzFdID0gY3R4LT5sc3BfYnVmWzFdOworICAgIG1lbWNweShjdHgtPmxzcFswXSwgbHNwX2luaXQsIDEwICogc2l6ZW9mKGludDE2X3QpKTsKKworICAgIGN0eC0+ZXhjID0gJmN0eC0+ZXhjX2Jhc2VbUElUQ0hfREVMQVlfTUFYK0lOVEVSUE9MX0xFTl07CisKKyAgICBjdHgtPnBpdGNoX2RlbGF5X2ludF9wcmV2ID0gUElUQ0hfREVMQVlfTUlOOworCisgICAgLyogcmFuZG9tIHNlZWQgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBjdHgtPnJhbmRfdmFsdWUgPSAyMTg0NTsKKworICAgIC8qIHF1YW50aXplZCBwcmVkaWN0aW9uIGVycm9yICovCisgICAgZm9yKGk9MDsgaTw0OyBpKyspCisgICAgICAgIGN0eC0+cXVhbnRfZW5lcmd5W2ldID0gLTE0MzM2OyAvLyAtMTQgaW4gKDUuMTApCisKKyAgICBmZl9hdWRpb2RzcF9pbml0KCZjdHgtPmFkc3ApOworICAgIGN0eC0+YWRzcC5zY2FsYXJwcm9kdWN0X2ludDE2ID0gc2NhbGFycHJvZHVjdF9pbnQxNl9jOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIGludDE2X3QgKm91dF9mcmFtZTsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGNvbnN0IEc3MjlGb3JtYXREZXNjcmlwdGlvbiAqZm9ybWF0OworICAgIGludCBmcmFtZV9lcmFzdXJlID0gMDsgICAgLy8vPCBmcmFtZSBlcmFzdXJlIGRldGVjdGVkIGR1cmluZyBkZWNvZGluZworICAgIGludCBiYWRfcGl0Y2ggPSAwOyAgICAgICAgLy8vPCBwYXJpdHkgY2hlY2sgZmFpbGVkCisgICAgaW50IGk7CisgICAgaW50MTZfdCAqdG1wOworICAgIEc3MjlGb3JtYXRzIHBhY2tldF90eXBlOworICAgIEc3MjlDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludDE2X3QgbHBbMl1bMTFdOyAgICAgICAgICAgLy8gKDMuMTIpCisgICAgdWludDhfdCBtYV9wcmVkaWN0b3I7ICAgICAvLy88IHN3aXRjaGVkIE1BIHByZWRpY3RvciBvZiBMU1AgcXVhbnRpemVyCisgICAgdWludDhfdCBxdWFudGl6ZXJfMXN0OyAgICAvLy88IGZpcnN0IHN0YWdlIHZlY3RvciBvZiBxdWFudGl6ZXIKKyAgICB1aW50OF90IHF1YW50aXplcl8ybmRfbG87IC8vLzwgc2Vjb25kIHN0YWdlIGxvd2VyIHZlY3RvciBvZiBxdWFudGl6ZXIgKHNpemUgaW4gYml0cykKKyAgICB1aW50OF90IHF1YW50aXplcl8ybmRfaGk7IC8vLzwgc2Vjb25kIHN0YWdlIGhpZ2hlciB2ZWN0b3Igb2YgcXVhbnRpemVyIChzaXplIGluIGJpdHMpCisKKyAgICBpbnQgcGl0Y2hfZGVsYXlfaW50WzJdOyAgICAgIC8vIHBpdGNoIGRlbGF5LCBpbnRlZ2VyIHBhcnQKKyAgICBpbnQgcGl0Y2hfZGVsYXlfM3g7ICAgICAgICAgIC8vIHBpdGNoIGRlbGF5LCBtdWx0aXBsaWVkIGJ5IDMKKyAgICBpbnQxNl90IGZjW1NVQkZSQU1FX1NJWkVdOyAgIC8vIGZpeGVkLWNvZGVib29rIHZlY3RvcgorICAgIGludDE2X3Qgc3ludGhbU1VCRlJBTUVfU0laRSsxMF07IC8vIGZpeGVkLWNvZGVib29rIHZlY3RvcgorICAgIGludCBqLCByZXQ7CisgICAgaW50IGdhaW5fYmVmb3JlLCBnYWluX2FmdGVyOworICAgIGludCBpc19wZXJpb2RpYyA9IDA7ICAgICAgICAgLy8gd2hldGhlciBvbmUgb2YgdGhlIHN1YmZyYW1lcyBpcyBkZWNsYXJlZCBhcyBwZXJpb2RpYyBvciBub3QKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IFNVQkZSQU1FX1NJWkU8PDE7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBvdXRfZnJhbWUgPSAoaW50MTZfdCopIGZyYW1lLT5kYXRhWzBdOworCisgICAgaWYgKGJ1Zl9zaXplID09IDEwKSB7CisgICAgICAgIHBhY2tldF90eXBlID0gRk9STUFUX0c3MjlfOEs7CisgICAgICAgIGZvcm1hdCA9ICZmb3JtYXRfZzcyOV84azsKKyAgICAgICAgLy9SZXNldCB2b2ljZSBkZWNpc2lvbgorICAgICAgICBjdHgtPm9uc2V0ID0gMDsKKyAgICAgICAgY3R4LT52b2ljZV9kZWNpc2lvbiA9IERFQ0lTSU9OX1ZPSUNFOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlBhY2tldCB0eXBlOiAlc1xuIiwgIkcuNzI5IEAgOGtiaXQvcyIpOworICAgIH0gZWxzZSBpZiAoYnVmX3NpemUgPT0gOCkgeworICAgICAgICBwYWNrZXRfdHlwZSA9IEZPUk1BVF9HNzI5RF82SzQ7CisgICAgICAgIGZvcm1hdCA9ICZmb3JtYXRfZzcyOWRfNms0OworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlBhY2tldCB0eXBlOiAlc1xuIiwgIkcuNzI5RCBAIDYuNGtiaXQvcyIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IHNpemUgJWQgaXMgdW5rbm93bi5cbiIsIGJ1Zl9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZm9yIChpPTA7IGkgPCBidWZfc2l6ZTsgaSsrKQorICAgICAgICBmcmFtZV9lcmFzdXJlIHw9IGJ1ZltpXTsKKyAgICBmcmFtZV9lcmFzdXJlID0gIWZyYW1lX2VyYXN1cmU7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCA4KmJ1Zl9zaXplKTsKKworICAgIG1hX3ByZWRpY3RvciAgICAgPSBnZXRfYml0cygmZ2IsIDEpOworICAgIHF1YW50aXplcl8xc3QgICAgPSBnZXRfYml0cygmZ2IsIFZRXzFTVF9CSVRTKTsKKyAgICBxdWFudGl6ZXJfMm5kX2xvID0gZ2V0X2JpdHMoJmdiLCBWUV8yTkRfQklUUyk7CisgICAgcXVhbnRpemVyXzJuZF9oaSA9IGdldF9iaXRzKCZnYiwgVlFfMk5EX0JJVFMpOworCisgICAgaWYoZnJhbWVfZXJhc3VyZSkKKyAgICAgICAgbHNmX3Jlc3RvcmVfZnJvbV9wcmV2aW91cyhjdHgtPmxzZnEsIGN0eC0+cGFzdF9xdWFudGl6ZXJfb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm1hX3ByZWRpY3Rvcl9wcmV2KTsKKyAgICBlbHNlIHsKKyAgICAgICAgbHNmX2RlY29kZShjdHgtPmxzZnEsIGN0eC0+cGFzdF9xdWFudGl6ZXJfb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICBtYV9wcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgcXVhbnRpemVyXzFzdCwgcXVhbnRpemVyXzJuZF9sbywgcXVhbnRpemVyXzJuZF9oaSk7CisgICAgICAgIGN0eC0+bWFfcHJlZGljdG9yX3ByZXYgPSBtYV9wcmVkaWN0b3I7CisgICAgfQorCisgICAgdG1wID0gY3R4LT5wYXN0X3F1YW50aXplcl9vdXRwdXRzW01BX05QXTsKKyAgICBtZW1tb3ZlKGN0eC0+cGFzdF9xdWFudGl6ZXJfb3V0cHV0cyArIDEsIGN0eC0+cGFzdF9xdWFudGl6ZXJfb3V0cHV0cywKKyAgICAgICAgICAgIE1BX05QICogc2l6ZW9mKGludDE2X3QqKSk7CisgICAgY3R4LT5wYXN0X3F1YW50aXplcl9vdXRwdXRzWzBdID0gdG1wOworCisgICAgZmZfYWNlbHBfbHNmMmxzcChjdHgtPmxzcFsxXSwgY3R4LT5sc2ZxLCAxMCk7CisKKyAgICBmZl9hY2VscF9scF9kZWNvZGUoJmxwWzBdWzBdLCAmbHBbMV1bMF0sIGN0eC0+bHNwWzFdLCBjdHgtPmxzcFswXSwgMTApOworCisgICAgRkZTV0FQKGludDE2X3QqLCBjdHgtPmxzcFsxXSwgY3R4LT5sc3BbMF0pOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpbnQgZ2Fpbl9jb3JyX2ZhY3RvcjsKKworICAgICAgICB1aW50OF90IGFjX2luZGV4OyAgICAgIC8vLzwgYWRhcHRpdmUgY29kZWJvb2sgaW5kZXgKKyAgICAgICAgdWludDhfdCBwdWxzZXNfc2lnbnM7ICAvLy88IGZpeGVkLWNvZGVib29rIHZlY3RvciBwdWxzZSBzaWducworICAgICAgICBpbnQgZmNfaW5kZXhlczsgICAgICAgIC8vLzwgZml4ZWQtY29kZWJvb2sgaW5kZXhlcworICAgICAgICB1aW50OF90IGdjXzFzdF9pbmRleDsgIC8vLzwgZ2FpbiBjb2RlYm9vayAoZmlyc3Qgc3RhZ2UpIGluZGV4CisgICAgICAgIHVpbnQ4X3QgZ2NfMm5kX2luZGV4OyAgLy8vPCBnYWluIGNvZGVib29rIChzZWNvbmQgc3RhZ2UpIGluZGV4CisKKyAgICAgICAgYWNfaW5kZXggICAgICA9IGdldF9iaXRzKCZnYiwgZm9ybWF0LT5hY19pbmRleF9iaXRzW2ldKTsKKyAgICAgICAgaWYoIWkgJiYgZm9ybWF0LT5wYXJpdHlfYml0KQorICAgICAgICAgICAgYmFkX3BpdGNoID0gZ2V0X3Bhcml0eShhY19pbmRleCkgPT0gZ2V0X2JpdHMxKCZnYik7CisgICAgICAgIGZjX2luZGV4ZXMgICAgPSBnZXRfYml0cygmZ2IsIGZvcm1hdC0+ZmNfaW5kZXhlc19iaXRzKTsKKyAgICAgICAgcHVsc2VzX3NpZ25zICA9IGdldF9iaXRzKCZnYiwgZm9ybWF0LT5mY19zaWduc19iaXRzKTsKKyAgICAgICAgZ2NfMXN0X2luZGV4ICA9IGdldF9iaXRzKCZnYiwgZm9ybWF0LT5nY18xc3RfaW5kZXhfYml0cyk7CisgICAgICAgIGdjXzJuZF9pbmRleCAgPSBnZXRfYml0cygmZ2IsIGZvcm1hdC0+Z2NfMm5kX2luZGV4X2JpdHMpOworCisgICAgICAgIGlmIChmcmFtZV9lcmFzdXJlKQorICAgICAgICAgICAgcGl0Y2hfZGVsYXlfM3ggICA9IDMgKiBjdHgtPnBpdGNoX2RlbGF5X2ludF9wcmV2OworICAgICAgICBlbHNlIGlmKCFpKSB7CisgICAgICAgICAgICBpZiAoYmFkX3BpdGNoKQorICAgICAgICAgICAgICAgIHBpdGNoX2RlbGF5XzN4ICAgPSAzICogY3R4LT5waXRjaF9kZWxheV9pbnRfcHJldjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwaXRjaF9kZWxheV8zeCA9IGZmX2FjZWxwX2RlY29kZV84Yml0X3RvXzFzdF9kZWxheTMoYWNfaW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHBpdGNoX2RlbGF5X21pbiA9IGF2X2NsaXAoY3R4LT5waXRjaF9kZWxheV9pbnRfcHJldiAtIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVRDSF9ERUxBWV9NSU4sIFBJVENIX0RFTEFZX01BWCAtIDkpOworCisgICAgICAgICAgICBpZihwYWNrZXRfdHlwZSA9PSBGT1JNQVRfRzcyOURfNks0KQorICAgICAgICAgICAgICAgIHBpdGNoX2RlbGF5XzN4ID0gZmZfYWNlbHBfZGVjb2RlXzRiaXRfdG9fMm5kX2RlbGF5MyhhY19pbmRleCwgcGl0Y2hfZGVsYXlfbWluKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwaXRjaF9kZWxheV8zeCA9IGZmX2FjZWxwX2RlY29kZV81XzZfYml0X3RvXzJuZF9kZWxheTMoYWNfaW5kZXgsIHBpdGNoX2RlbGF5X21pbik7CisgICAgICAgIH0KKworICAgICAgICAvKiBSb3VuZCBwaXRjaCBkZWxheSB0byBuZWFyZXN0ICh1c2VkIGV2ZXJ5d2hlcmUgZXhjZXB0IGZmX2FjZWxwX2ludGVycG9sYXRlKS4gKi8KKyAgICAgICAgcGl0Y2hfZGVsYXlfaW50W2ldICA9IChwaXRjaF9kZWxheV8zeCArIDEpIC8gMzsKKyAgICAgICAgaWYgKHBpdGNoX2RlbGF5X2ludFtpXSA+IFBJVENIX0RFTEFZX01BWCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgInBpdGNoX2RlbGF5X2ludCAlZCBpcyB0b28gbGFyZ2VcbiIsIHBpdGNoX2RlbGF5X2ludFtpXSk7CisgICAgICAgICAgICBwaXRjaF9kZWxheV9pbnRbaV0gPSBQSVRDSF9ERUxBWV9NQVg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWVfZXJhc3VyZSkgeworICAgICAgICAgICAgY3R4LT5yYW5kX3ZhbHVlID0gZzcyOV9wcm5nKGN0eC0+cmFuZF92YWx1ZSk7CisgICAgICAgICAgICBmY19pbmRleGVzICAgPSBjdHgtPnJhbmRfdmFsdWUgJiAoKDEgPDwgZm9ybWF0LT5mY19pbmRleGVzX2JpdHMpIC0gMSk7CisKKyAgICAgICAgICAgIGN0eC0+cmFuZF92YWx1ZSA9IGc3MjlfcHJuZyhjdHgtPnJhbmRfdmFsdWUpOworICAgICAgICAgICAgcHVsc2VzX3NpZ25zID0gY3R4LT5yYW5kX3ZhbHVlOworICAgICAgICB9CisKKworICAgICAgICBtZW1zZXQoZmMsIDAsIHNpemVvZihpbnQxNl90KSAqIFNVQkZSQU1FX1NJWkUpOworICAgICAgICBzd2l0Y2ggKHBhY2tldF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9HNzI5XzhLOgorICAgICAgICAgICAgICAgIGZmX2FjZWxwX2ZjX3B1bHNlX3Blcl90cmFjayhmYywgZmZfZmNfNHB1bHNlc184Yml0c190cmFja3NfMTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2ZjXzRwdWxzZXNfOGJpdHNfdHJhY2tfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNfaW5kZXhlcywgcHVsc2VzX3NpZ25zLCAzLCAzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0c3MjlEXzZLNDoKKyAgICAgICAgICAgICAgICBmZl9hY2VscF9mY19wdWxzZV9wZXJfdHJhY2soZmMsIGZmX2ZjXzJwdWxzZXNfOWJpdHNfdHJhY2sxX2dyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2ZjXzJwdWxzZXNfOWJpdHNfdHJhY2syX2dyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjX2luZGV4ZXMsIHB1bHNlc19zaWducywgMSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgIFRoaXMgZmlsdGVyIGVuaGFuY2VzIGhhcm1vbmljIGNvbXBvbmVudHMgb2YgdGhlIGZpeGVkLWNvZGVib29rIHZlY3RvciB0bworICAgICAgICAgIGltcHJvdmUgdGhlIHF1YWxpdHkgb2YgdGhlIHJlY29uc3RydWN0ZWQgc3BlZWNoLgorCisgICAgICAgICAgICAgICAgICAgICAvIGZjX3ZbaV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA8IHBpdGNoX2RlbGF5CisgICAgICAgICAgZmNfdltpXSA9IDwKKyAgICAgICAgICAgICAgICAgICAgIFwgZmNfdltpXSArIGdhaW5fcGl0Y2ggKiBmY192W2ktcGl0Y2hfZGVsYXldLCBpID49IHBpdGNoX2RlbGF5CisgICAgICAgICovCisgICAgICAgIGZmX2FjZWxwX3dlaWdodGVkX3ZlY3Rvcl9zdW0oZmMgKyBwaXRjaF9kZWxheV9pbnRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmMgKyBwaXRjaF9kZWxheV9pbnRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmMsIDEgPDwgMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfY2xpcChjdHgtPnBhc3RfZ2Fpbl9waXRjaFswXSwgU0hBUlBfTUlOLCBTSEFSUF9NQVgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQkZSQU1FX1NJWkUgLSBwaXRjaF9kZWxheV9pbnRbaV0pOworCisgICAgICAgIG1lbW1vdmUoY3R4LT5wYXN0X2dhaW5fcGl0Y2grMSwgY3R4LT5wYXN0X2dhaW5fcGl0Y2gsIDUgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBjdHgtPnBhc3RfZ2Fpbl9jb2RlWzFdID0gY3R4LT5wYXN0X2dhaW5fY29kZVswXTsKKworICAgICAgICBpZiAoZnJhbWVfZXJhc3VyZSkgeworICAgICAgICAgICAgY3R4LT5wYXN0X2dhaW5fcGl0Y2hbMF0gPSAoMjk0OTEgKiBjdHgtPnBhc3RfZ2Fpbl9waXRjaFswXSkgPj4gMTU7IC8vIDAuOTAgKDAuMTUpCisgICAgICAgICAgICBjdHgtPnBhc3RfZ2Fpbl9jb2RlWzBdICA9ICggMjAwNyAqIGN0eC0+cGFzdF9nYWluX2NvZGVbMF0gKSA+PiAxMTsgLy8gMC45OCAoMC4xMSkKKworICAgICAgICAgICAgZ2Fpbl9jb3JyX2ZhY3RvciA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocGFja2V0X3R5cGUgPT0gRk9STUFUX0c3MjlEXzZLNCkgeworICAgICAgICAgICAgICAgIGN0eC0+cGFzdF9nYWluX3BpdGNoWzBdICA9IGNiX2dhaW5fMXN0XzZrNFtnY18xc3RfaW5kZXhdWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9nYWluXzJuZF82azRbZ2NfMm5kX2luZGV4XVswXTsKKyAgICAgICAgICAgICAgICBnYWluX2NvcnJfZmFjdG9yID0gY2JfZ2Fpbl8xc3RfNms0W2djXzFzdF9pbmRleF1bMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9nYWluXzJuZF82azRbZ2NfMm5kX2luZGV4XVsxXTsKKworICAgICAgICAgICAgICAgIC8qIFdpdGhvdXQgY2hlY2sgYmVsb3cgb3ZlcmZsb3cgY2FuIG9jY3VyIGluIGZmX2FjZWxwX3VwZGF0ZV9wYXN0X2dhaW4uCisgICAgICAgICAgICAgICAgICAgSXQgaXMgbm90IGlzc3VlIGZvciBHLjcyOSwgYmVjYXVzZSBnYWluX2NvcnJfZmFjdG9yIGluIGl0J3MgY2FzZSBpcyBhbHdheXMKKyAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gMTAyNCwgd2hpbGUgaW4gRy43MjlEIGl0IGNhbiBiZSBldmVuIHplcm8uICovCisgICAgICAgICAgICAgICAgZ2Fpbl9jb3JyX2ZhY3RvciA9IEZGTUFYKGdhaW5fY29ycl9mYWN0b3IsIDEwMjQpOworI2lmbmRlZiBHNzI5X0JJVEVYQUNUCisgICAgICAgICAgICAgICAgZ2Fpbl9jb3JyX2ZhY3RvciA+Pj0gMTsKKyNlbmRpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdHgtPnBhc3RfZ2Fpbl9waXRjaFswXSAgPSBjYl9nYWluXzFzdF84a1tnY18xc3RfaW5kZXhdWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9nYWluXzJuZF84a1tnY18ybmRfaW5kZXhdWzBdOworICAgICAgICAgICAgICAgIGdhaW5fY29ycl9mYWN0b3IgPSBjYl9nYWluXzFzdF84a1tnY18xc3RfaW5kZXhdWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JfZ2Fpbl8ybmRfOGtbZ2NfMm5kX2luZGV4XVsxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRGVjb2RlIHRoZSBmaXhlZC1jb2RlYm9vayBnYWluLiAqLworICAgICAgICAgICAgY3R4LT5wYXN0X2dhaW5fY29kZVswXSA9IGZmX2FjZWxwX2RlY29kZV9nYWluX2NvZGUoJmN0eC0+YWRzcCwgZ2Fpbl9jb3JyX2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjLCBNUl9FTkVSR1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnF1YW50X2VuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hX3ByZWRpY3Rpb25fY29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJGUkFNRV9TSVpFLCA0KTsKKyNpZmRlZiBHNzI5X0JJVEVYQUNUCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICBUaGlzIGNvcnJlY3Rpb24gcmVxdWlyZWQgdG8gZ2V0IGJpdC1leGFjdCByZXN1bHQgd2l0aAorICAgICAgICAgICAgICByZWZlcmVuY2UgY29kZSwgYmVjYXVzZSBnYWluX2NvcnJfZmFjdG9yIGluIEcuNzI5RCBpcworICAgICAgICAgICAgICB0d28gdGltZXMgbGFyZ2VyIHRoYW4gaW4gb3JpZ2luYWwgRy43MjkuCisKKyAgICAgICAgICAgICAgSWYgYml0LWV4YWN0IHJlc3VsdCBpcyBub3QgaXNzdWUgdGhlbiBnYWluX2NvcnJfZmFjdG9yCisgICAgICAgICAgICAgIGNhbiBiZSBzaW1wbGVyIGRpdmlkZWQgYnkgMiBiZWZvcmUgY2FsbCB0byBnNzI5X2dldF9nYWluX2NvZGUKKyAgICAgICAgICAgICAgaW5zdGVhZCBvZiB1c2luZyBjb3JyZWN0aW9uIGJlbG93LgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwYWNrZXRfdHlwZSA9PSBGT1JNQVRfRzcyOURfNks0KSB7CisgICAgICAgICAgICAgICAgZ2Fpbl9jb3JyX2ZhY3RvciA+Pj0gMTsKKyAgICAgICAgICAgICAgICBjdHgtPnBhc3RfZ2Fpbl9jb2RlWzBdID4+PSAxOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZmZfYWNlbHBfdXBkYXRlX3Bhc3RfZ2FpbihjdHgtPnF1YW50X2VuZXJneSwgZ2Fpbl9jb3JyX2ZhY3RvciwgMiwgZnJhbWVfZXJhc3VyZSk7CisKKyAgICAgICAgLyogUm91dGluZSByZXF1aXJlcyByb3VuZGluZyB0byBsb3dlc3QuICovCisgICAgICAgIGZmX2FjZWxwX2ludGVycG9sYXRlKGN0eC0+ZXhjICsgaSAqIFNVQkZSQU1FX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZXhjICsgaSAqIFNVQkZSQU1FX1NJWkUgLSBwaXRjaF9kZWxheV8zeCAvIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FjZWxwX2ludGVycF9maWx0ZXIsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwaXRjaF9kZWxheV8zeCAlIDMpIDw8IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCBTVUJGUkFNRV9TSVpFKTsKKworICAgICAgICBmZl9hY2VscF93ZWlnaHRlZF92ZWN0b3Jfc3VtKGN0eC0+ZXhjICsgaSAqIFNVQkZSQU1FX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5leGMgKyBpICogU1VCRlJBTUVfU0laRSwgZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFjdHgtPndhc19wZXJpb2RpYyAmJiBmcmFtZV9lcmFzdXJlKSA/IDAgOiBjdHgtPnBhc3RfZ2Fpbl9waXRjaFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGN0eC0+d2FzX3BlcmlvZGljICYmIGZyYW1lX2VyYXN1cmUpID8gMCA6IGN0eC0+cGFzdF9nYWluX2NvZGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCAxMywgMTQsIFNVQkZSQU1FX1NJWkUpOworCisgICAgICAgIG1lbWNweShzeW50aCwgY3R4LT5zeW5fZmlsdGVyX2RhdGEsIDEwICogc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICBpZiAoZmZfY2VscF9scF9zeW50aGVzaXNfZmlsdGVyKAorICAgICAgICAgICAgc3ludGgrMTAsCisgICAgICAgICAgICAmbHBbaV1bMV0sCisgICAgICAgICAgICBjdHgtPmV4YyAgKyBpICogU1VCRlJBTUVfU0laRSwKKyAgICAgICAgICAgIFNVQkZSQU1FX1NJWkUsCisgICAgICAgICAgICAxMCwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMHg4MDApKQorICAgICAgICAgICAgLyogT3ZlcmZsb3cgb2NjdXJyZWQsIGRvd25zY2FsZSBleGNpdGF0aW9uIHNpZ25hbC4uLiAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDIgKiBTVUJGUkFNRV9TSVpFICsgUElUQ0hfREVMQVlfTUFYICsgSU5URVJQT0xfTEVOOyBqKyspCisgICAgICAgICAgICAgICAgY3R4LT5leGNfYmFzZVtqXSA+Pj0gMjsKKworICAgICAgICAvKiAuLi4gYW5kIG1ha2Ugc3ludGhlc2lzIGFnYWluLiAqLworICAgICAgICBpZiAocGFja2V0X3R5cGUgPT0gRk9STUFUX0c3MjlEXzZLNCkgeworICAgICAgICAgICAgaW50MTZfdCBleGNfbmV3W1NVQkZSQU1FX1NJWkVdOworCisgICAgICAgICAgICBjdHgtPm9uc2V0ID0gZzcyOWRfb25zZXRfZGVjaXNpb24oY3R4LT5vbnNldCwgY3R4LT5wYXN0X2dhaW5fY29kZSk7CisgICAgICAgICAgICBjdHgtPnZvaWNlX2RlY2lzaW9uID0gZzcyOWRfdm9pY2VfZGVjaXNpb24oY3R4LT5vbnNldCwgY3R4LT52b2ljZV9kZWNpc2lvbiwgY3R4LT5wYXN0X2dhaW5fcGl0Y2gpOworCisgICAgICAgICAgICBnNzI5ZF9nZXRfbmV3X2V4YyhleGNfbmV3LCBjdHgtPmV4YyAgKyBpICogU1VCRlJBTUVfU0laRSwgZmMsIGN0eC0+dm9pY2VfZGVjaXNpb24sIGN0eC0+cGFzdF9nYWluX2NvZGVbMF0sIFNVQkZSQU1FX1NJWkUpOworCisgICAgICAgICAgICBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXIoCisgICAgICAgICAgICAgICAgICAgIHN5bnRoKzEwLAorICAgICAgICAgICAgICAgICAgICAmbHBbaV1bMV0sCisgICAgICAgICAgICAgICAgICAgIGV4Y19uZXcsCisgICAgICAgICAgICAgICAgICAgIFNVQkZSQU1FX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIDEwLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAweDgwMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXIoCisgICAgICAgICAgICAgICAgICAgIHN5bnRoKzEwLAorICAgICAgICAgICAgICAgICAgICAmbHBbaV1bMV0sCisgICAgICAgICAgICAgICAgICAgIGN0eC0+ZXhjICArIGkgKiBTVUJGUkFNRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICBTVUJGUkFNRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAxMCwKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgMHg4MDApOworICAgICAgICB9CisgICAgICAgIC8qIFNhdmUgZGF0YSAod2l0aG91dCBwb3N0ZmlsdGVyKSBmb3IgdXNlIGluIG5leHQgc3ViZnJhbWUuICovCisgICAgICAgIG1lbWNweShjdHgtPnN5bl9maWx0ZXJfZGF0YSwgc3ludGgrU1VCRlJBTUVfU0laRSwgMTAgKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgICAgIC8qIENhbGN1bGF0ZSBnYWluIG9mIHVuZmlsdGVyZWQgc2lnbmFsIGZvciB1c2UgaW4gQUdDLiAqLworICAgICAgICBnYWluX2JlZm9yZSA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBTVUJGUkFNRV9TSVpFOyBqKyspCisgICAgICAgICAgICBnYWluX2JlZm9yZSArPSBGRkFCUyhzeW50aFtqKzEwXSk7CisKKyAgICAgICAgLyogQ2FsbCBwb3N0ZmlsdGVyIGFuZCBhbHNvIHVwZGF0ZSB2b2ljaW5nIGRlY2lzaW9uIGZvciB1c2UgaW4gbmV4dCBmcmFtZS4gKi8KKyAgICAgICAgZmZfZzcyOV9wb3N0ZmlsdGVyKAorICAgICAgICAgICAgICAgICZjdHgtPmFkc3AsCisgICAgICAgICAgICAgICAgJmN0eC0+aHRfcHJldl9kYXRhLAorICAgICAgICAgICAgICAgICZpc19wZXJpb2RpYywKKyAgICAgICAgICAgICAgICAmbHBbaV1bMF0sCisgICAgICAgICAgICAgICAgcGl0Y2hfZGVsYXlfaW50WzBdLAorICAgICAgICAgICAgICAgIGN0eC0+cmVzaWR1YWwsCisgICAgICAgICAgICAgICAgY3R4LT5yZXNfZmlsdGVyX2RhdGEsCisgICAgICAgICAgICAgICAgY3R4LT5wb3NfZmlsdGVyX2RhdGEsCisgICAgICAgICAgICAgICAgc3ludGgrMTAsCisgICAgICAgICAgICAgICAgU1VCRlJBTUVfU0laRSk7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIGdhaW4gb2YgZmlsdGVyZWQgc2lnbmFsIGZvciB1c2UgaW4gQUdDLiAqLworICAgICAgICBnYWluX2FmdGVyID0gMDsKKyAgICAgICAgZm9yKGo9MDsgajxTVUJGUkFNRV9TSVpFOyBqKyspCisgICAgICAgICAgICBnYWluX2FmdGVyICs9IEZGQUJTKHN5bnRoW2orMTBdKTsKKworICAgICAgICBjdHgtPmdhaW5fY29lZmYgPSBmZl9nNzI5X2FkYXB0aXZlX2dhaW5fY29udHJvbCgKKyAgICAgICAgICAgICAgICBnYWluX2JlZm9yZSwKKyAgICAgICAgICAgICAgICBnYWluX2FmdGVyLAorICAgICAgICAgICAgICAgIHN5bnRoKzEwLAorICAgICAgICAgICAgICAgIFNVQkZSQU1FX1NJWkUsCisgICAgICAgICAgICAgICAgY3R4LT5nYWluX2NvZWZmKTsKKworICAgICAgICBpZiAoZnJhbWVfZXJhc3VyZSkKKyAgICAgICAgICAgIGN0eC0+cGl0Y2hfZGVsYXlfaW50X3ByZXYgPSBGRk1JTihjdHgtPnBpdGNoX2RlbGF5X2ludF9wcmV2ICsgMSwgUElUQ0hfREVMQVlfTUFYKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3R4LT5waXRjaF9kZWxheV9pbnRfcHJldiA9IHBpdGNoX2RlbGF5X2ludFtpXTsKKworICAgICAgICBtZW1jcHkoc3ludGgrOCwgY3R4LT5ocGZfeiwgMipzaXplb2YoaW50MTZfdCkpOworICAgICAgICBmZl9hY2VscF9oaWdoX3Bhc3NfZmlsdGVyKAorICAgICAgICAgICAgICAgIG91dF9mcmFtZSArIGkqU1VCRlJBTUVfU0laRSwKKyAgICAgICAgICAgICAgICBjdHgtPmhwZl9mLAorICAgICAgICAgICAgICAgIHN5bnRoKzEwLAorICAgICAgICAgICAgICAgIFNVQkZSQU1FX1NJWkUpOworICAgICAgICBtZW1jcHkoY3R4LT5ocGZfeiwgc3ludGgrOCtTVUJGUkFNRV9TSVpFLCAyKnNpemVvZihpbnQxNl90KSk7CisgICAgfQorCisgICAgY3R4LT53YXNfcGVyaW9kaWMgPSBpc19wZXJpb2RpYzsKKworICAgIC8qIFNhdmUgc2lnbmFsIGZvciB1c2UgaW4gbmV4dCBmcmFtZS4gKi8KKyAgICBtZW1tb3ZlKGN0eC0+ZXhjX2Jhc2UsIGN0eC0+ZXhjX2Jhc2UgKyAyICogU1VCRlJBTUVfU0laRSwgKFBJVENIX0RFTEFZX01BWCtJTlRFUlBPTF9MRU4pKnNpemVvZihpbnQxNl90KSk7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitBVkNvZGVjIGZmX2c3MjlfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZzcyOSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkcuNzI5IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0c3MjksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEc3MjlDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVyX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZzcyOXBvc3RmaWx0ZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3Mjlwb3N0ZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3NzVjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3Mjlwb3N0ZmlsdGVyLmMKQEAgLTAsMCArMSw2MTAgQEAKKy8qCisgKiBHLjcyOSwgRzcyOSBBbm5leCBEIHBvc3RmaWx0ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCBWbGFkaW1pciBWb3Jvc2hpbG92CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnNzI5LmgiCisjaW5jbHVkZSAiYWNlbHBfcGl0Y2hfZGVsYXkuaCIKKyNpbmNsdWRlICJnNzI5cG9zdGZpbHRlci5oIgorI2luY2x1ZGUgImNlbHBfbWF0aC5oIgorI2luY2x1ZGUgImFjZWxwX2ZpbHRlcnMuaCIKKyNpbmNsdWRlICJhY2VscF92ZWN0b3JzLmgiCisjaW5jbHVkZSAiY2VscF9maWx0ZXJzLmgiCisKKyNkZWZpbmUgRlJBQ19CSVRTIDE1CisjaW5jbHVkZSAibWF0aG9wcy5oIgorCisvKioKKyAqIHNob3J0IGludGVycG9sYXRpb24gZmlsdGVyIChvZiBsZW5ndGggMzMsIGFjY29yZGluZyB0byBzcGVjKQorICogZm9yIGNvbXB1dGluZyBzaWduYWwgd2l0aCBub24taW50ZWdlciBkZWxheQorICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBmZl9nNzI5X2ludGVycF9maWx0X3Nob3J0WyhBTkFMWVpFRF9GUkFDX0RFTEFZUysxKSpTSE9SVF9JTlRfRklMVF9MRU5dID0geworICAgICAgMCwgMzE2NTAsIDI4NDY5LCAyMzcwNSwgMTgwNTAsIDEyMjY2LCAgNzA0MSwgIDI4NzMsCisgICAgICAwLCAtMTU5NywgLTIxNDcsIC0xOTkyLCAtMTQ5MiwgIC05MzMsICAtNDg0LCAgLTE4OCwKK307CisKKy8qKgorICogbG9uZyBpbnRlcnBvbGF0aW9uIGZpbHRlciAob2YgbGVuZ3RoIDEyOSwgYWNjb3JkaW5nIHRvIHNwZWMpCisgKiBmb3IgY29tcHV0aW5nIHNpZ25hbCB3aXRoIG5vbi1pbnRlZ2VyIGRlbGF5CisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGZmX2c3MjlfaW50ZXJwX2ZpbHRfbG9uZ1soQU5BTFlaRURfRlJBQ19ERUxBWVMrMSkqTE9OR19JTlRfRklMVF9MRU5dID0geworICAgMCwgMzE5MTUsIDI5NDM2LCAyNTU2OSwgMjA2NzYsIDE1MjA2LCAgOTYzOSwgIDQ0MzksCisgICAwLCAtMzM5MCwgLTU1NzksIC02NTQ5LCAtNjQxNCwgLTUzOTIsIC0zNzczLCAtMTg3NCwKKyAgIDAsICAxNTk1LCAgMjcyNywgIDMzMDMsICAzMzE5LCAgMjg1MCwgIDIwMzAsICAxMDIzLAorICAgMCwgIC04ODcsIC0xNTI3LCAtMTg2MCwgLTE4NzYsIC0xNjE0LCAtMTE1MCwgIC01NzksCisgICAwLCAgIDUwMSwgICA4NTksICAxMDQxLCAgMTA0NCwgICA4OTIsICAgNjMxLCAgIDMxNSwKKyAgIDAsICAtMjY2LCAgLTQ1MywgIC01NDMsICAtNTM4LCAgLTQ1NSwgIC0zMTcsICAtMTU2LAorICAgMCwgICAxMzAsICAgMjE4LCAgIDI1OCwgICAyNTMsICAgMjEyLCAgIDE0NywgICAgNzIsCisgICAwLCAgIC01OSwgIC0xMDEsICAtMTIyLCAgLTEyMywgIC0xMDYsICAgLTc3LCAgIC00MCwKK307CisKKy8qKgorICogZm9ybWFudF9wcF9mYWN0b3JfbnVtX3Bvd1tpXSA9IEZPUk1BTlRfUFBfRkFDVE9SX05VTV4oaSsxKQorICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBmb3JtYW50X3BwX2ZhY3Rvcl9udW1fcG93WzEwXT0geworICAvKiAoMC4xNSkgKi8KKyAgMTgwMjIsIDk5MTIsIDU0NTEsIDI5OTgsIDE2NDksIDkwNywgNDk5LCAyNzQsIDE1MSwgODMKK307CisKKy8qKgorICogZm9ybWFudF9wcF9mYWN0b3JfZGVuX3Bvd1tpXSA9IEZPUk1BTlRfUFBfRkFDVE9SX0RFTl4oaSsxKQorICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBmb3JtYW50X3BwX2ZhY3Rvcl9kZW5fcG93WzEwXSA9IHsKKyAgLyogKDAuMTUpICovCisgIDIyOTM4LCAxNjA1NywgMTEyNDAsIDc4NjgsIDU1MDgsIDM4NTYsIDI2OTksIDE4ODksIDEzMjIsIDkyNQorfTsKKworLyoqCisgKiBcYnJpZWYgUmVzaWR1YWwgc2lnbmFsIGNhbGN1bGF0aW9uICg0LjIuMSBpZiBHLjcyOSkKKyAqIFxwYXJhbSBvdXQgW291dF0gb3V0cHV0IGRhdGEgZmlsdGVyZWQgdGhyb3VnaCBBKHovRk9STUFOVF9QUF9GQUNUT1JfTlVNKQorICogXHBhcmFtIGZpbHRlcl9jb2VmZnMgKDMuMTIpIEEoei9GT1JNQU5UX1BQX0ZBQ1RPUl9OVU0pIGZpbHRlciBjb2VmZmljaWVudHMKKyAqIFxwYXJhbSBpbiBpbnB1dCBzcGVlY2ggZGF0YSB0byBwcm9jZXNzCisgKiBccGFyYW0gc3ViZnJhbWVfc2l6ZSBzaXplIG9mIG9uZSBzdWJmcmFtZQorICoKKyAqIFxub3RlIGluIGJ1ZmZlciBtdXN0IGNvbnRhaW4gMTAgaXRlbXMgb2YgcHJldmlvdXMgc3BlZWNoIGRhdGEgYmVmb3JlIHRvcCBvZiB0aGUgYnVmZmVyCisgKiBccmVtYXJrIEl0IGlzIHNhZmUgdG8gcGFzcyB0aGUgc2FtZSBidWZmZXIgZm9yIGlucHV0IGFuZCBvdXRwdXQuCisgKi8KK3N0YXRpYyB2b2lkIHJlc2lkdWFsX2ZpbHRlcihpbnQxNl90KiBvdXQsIGNvbnN0IGludDE2X3QqIGZpbHRlcl9jb2VmZnMsIGNvbnN0IGludDE2X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJmcmFtZV9zaXplKQoreworICAgIGludCBpLCBuOworCisgICAgZm9yIChuID0gc3ViZnJhbWVfc2l6ZSAtIDE7IG4gPj0gMDsgbi0tKSB7CisgICAgICAgIGludCBzdW0gPSAweDgwMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisgICAgICAgICAgICBzdW0gKz0gZmlsdGVyX2NvZWZmc1tpXSAqIGluW24gLSBpIC0gMV07CisKKyAgICAgICAgb3V0W25dID0gaW5bbl0gKyAoc3VtID4+IDEyKTsKKyAgICB9Cit9CisKKy8qKgorICogXGJyaWVmIGxvbmctdGVybSBwb3N0ZmlsdGVyICg0LjIuMSkKKyAqIFxwYXJhbSBkc3AgaW5pdGlhbGl6ZWQgRFNQIGNvbnRleHQKKyAqIFxwYXJhbSBwaXRjaF9kZWxheV9pbnQgaW50ZWdlciBwYXJ0IG9mIHRoZSBwaXRjaCBkZWxheSBpbiB0aGUgZmlyc3Qgc3ViZnJhbWUKKyAqIFxwYXJhbSByZXNpZHVhbCBmaWx0ZXJpbmcgaW5wdXQgZGF0YQorICogXHBhcmFtIHJlc2lkdWFsX2ZpbHQgW291dF0gc3BlZWNoIHNpZ25hbCB3aXRoIGFwcGxpZWQgQSh6L0ZPUk1BTlRfUFBfRkFDVE9SX05VTSkgZmlsdGVyCisgKiBccGFyYW0gc3ViZnJhbWVfc2l6ZSBzaXplIG9mIHN1YmZyYW1lCisgKgorICogXHJldHVybiAwIGlmIGxvbmctdGVybSBwcmVkaWN0aW9uIGdhaW4gaXMgbGVzcyB0aGFuIDNkQiwgMSAtICBvdGhlcndpc2UKKyAqLworc3RhdGljIGludDE2X3QgbG9uZ190ZXJtX2ZpbHRlcihBdWRpb0RTUENvbnRleHQgKmFkc3AsIGludCBwaXRjaF9kZWxheV9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIHJlc2lkdWFsLCBpbnQxNl90ICpyZXNpZHVhbF9maWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViZnJhbWVfc2l6ZSkKK3sKKyAgICBpbnQgaSwgaywgdG1wLCB0bXAyOworICAgIGludCBzdW07CisgICAgaW50IExfdGVtcDA7CisgICAgaW50IExfdGVtcDE7CisgICAgaW50NjRfdCBMNjRfdGVtcDA7CisgICAgaW50NjRfdCBMNjRfdGVtcDE7CisgICAgaW50MTZfdCBzaGlmdDsKKyAgICBpbnQgY29ycl9pbnRfbnVtLCBjb3JyX2ludF9kZW47CisKKyAgICBpbnQgZW5lcjsKKyAgICBpbnQxNl90IHNoX2VuZXI7CisKKyAgICBpbnQxNl90IGdhaW5fbnVtLGdhaW5fZGVuOyAvL3NlbGVjdGVkIHNpZ25hbCdzIGdhaW4gbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvcgorICAgIGludDE2X3Qgc2hfZ2Fpbl9udW0sIHNoX2dhaW5fZGVuOworICAgIGludCBnYWluX251bV9zcXVhcmU7CisKKyAgICBpbnQxNl90IGdhaW5fbG9uZ19udW0sZ2Fpbl9sb25nX2RlbjsgLy9maWx0ZXJlZCB0aHJvdWdoIGxvbmcgaW50ZXJwb2xhdGlvbiBmaWx0ZXIgc2lnbmFsJ3MgZ2FpbiBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yCisgICAgaW50MTZfdCBzaF9nYWluX2xvbmdfbnVtLCBzaF9nYWluX2xvbmdfZGVuOworCisgICAgaW50MTZfdCBiZXN0X2RlbGF5X2ludCwgYmVzdF9kZWxheV9mcmFjOworCisgICAgaW50MTZfdCBkZWxheWVkX3NpZ25hbF9vZmZzZXQ7CisgICAgaW50IGx0X2ZpbHRfZmFjdG9yX2EsIGx0X2ZpbHRfZmFjdG9yX2I7CisKKyAgICBpbnQxNl90ICogc2VsZWN0ZWRfc2lnbmFsOworICAgIGNvbnN0IGludDE2X3QgKiBzZWxlY3RlZF9zaWduYWxfY29uc3Q7IC8vTmVjZXNzYXJ5IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcKKworICAgIGludDE2X3Qgc2lnX3NjYWxlZFtTVUJGUkFNRV9TSVpFICsgUkVTX1BSRVZfREFUQV9TSVpFXTsKKyAgICBpbnQxNl90IGRlbGF5ZWRfc2lnbmFsW0FOQUxZWkVEX0ZSQUNfREVMQVlTXVtTVUJGUkFNRV9TSVpFKzFdOworICAgIGludCBjb3JyX2RlbltBTkFMWVpFRF9GUkFDX0RFTEFZU11bMl07CisKKyAgICB0bXAgPSAwOworICAgIGZvcihpPTA7IGk8c3ViZnJhbWVfc2l6ZSArIFJFU19QUkVWX0RBVEFfU0laRTsgaSsrKQorICAgICAgICB0bXAgfD0gRkZBQlMocmVzaWR1YWxbaV0pOworCisgICAgaWYoIXRtcCkKKyAgICAgICAgc2hpZnQgPSAzOworICAgIGVsc2UKKyAgICAgICAgc2hpZnQgPSBhdl9sb2cyKHRtcCkgLSAxMTsKKworICAgIGlmIChzaGlmdCA+IDApCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdWJmcmFtZV9zaXplICsgUkVTX1BSRVZfREFUQV9TSVpFOyBpKyspCisgICAgICAgICAgICBzaWdfc2NhbGVkW2ldID0gcmVzaWR1YWxbaV0gPj4gc2hpZnQ7CisgICAgZWxzZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ViZnJhbWVfc2l6ZSArIFJFU19QUkVWX0RBVEFfU0laRTsgaSsrKQorICAgICAgICAgICAgc2lnX3NjYWxlZFtpXSA9IHJlc2lkdWFsW2ldIDw8IC1zaGlmdDsKKworICAgIC8qIFN0YXJ0IG9mIGJlc3QgZGVsYXkgc2VhcmNoaW5nIGNvZGUgKi8KKyAgICBnYWluX251bSA9IDA7CisKKyAgICBlbmVyID0gYWRzcC0+c2NhbGFycHJvZHVjdF9pbnQxNihzaWdfc2NhbGVkICsgUkVTX1BSRVZfREFUQV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnX3NjYWxlZCArIFJFU19QUkVWX0RBVEFfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmZyYW1lX3NpemUpOworICAgIGlmIChlbmVyKSB7CisgICAgICAgIHNoX2VuZXIgPSBGRk1BWChhdl9sb2cyKGVuZXIpIC0gMTQsIDApOworICAgICAgICBlbmVyID4+PSBzaF9lbmVyOworICAgICAgICAvKiBTZWFyY2ggZm9yIGJlc3QgcGl0Y2ggZGVsYXkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgc3VteyByKG4pICogcihrLG4pIF0gfV4yCisgICAgICAgICAgIFInKGspXjIgOj0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICBzdW17IHIoayxuKSAqIHIoayxuKSB9CisKKworICAgICAgICAgICBSKFQpICAgIDo9ICBzdW17IHIobikgKiByKG4tVCkgXSB9CisKKworICAgICAgICAgICB3aGVyZQorICAgICAgICAgICByKG4tVCkgaXMgaW50ZWdlciBkZWxheWVkIHNpZ25hbCB3aXRoIGRlbGF5IFQKKyAgICAgICAgICAgcihrLG4pIGlzIG5vbi1pbnRlZ2VyIGRlbGF5ZWQgc2lnbmFsIHdpdGggaW50ZWdlciBkZWxheSBiZXN0X2RlbGF5CisgICAgICAgICAgIGFuZCBmcmFjdGlvbmFsIGRlbGF5IGsgKi8KKworICAgICAgICAvKiBGaW5kIGludGVnZXIgZGVsYXkgYmVzdF9kZWxheSB3aGljaCBtYXhpbWl6ZXMgY29ycmVsYXRpb24gUihUKS4KKworICAgICAgICAgICBUaGlzIGlzIGFsc28gZXF1YWxzIHRvIG51bWVyYXRvciBvZiBSJygwKSwKKyAgICAgICAgICAgc2luY2UgdGhlIGZpbmUgc2VhcmNoIChzZWNvbmQgc3RlcCkgaXMgZG9uZSB3aXRoIDEvOAorICAgICAgICAgICBwcmVjaXNpb24gYXJvdW5kIGJlc3RfZGVsYXkuICovCisgICAgICAgIGNvcnJfaW50X251bSA9IDA7CisgICAgICAgIGJlc3RfZGVsYXlfaW50ID0gcGl0Y2hfZGVsYXlfaW50IC0gMTsKKyAgICAgICAgZm9yIChpID0gcGl0Y2hfZGVsYXlfaW50IC0gMTsgaSA8PSBwaXRjaF9kZWxheV9pbnQgKyAxOyBpKyspIHsKKyAgICAgICAgICAgIHN1bSA9IGFkc3AtPnNjYWxhcnByb2R1Y3RfaW50MTYoc2lnX3NjYWxlZCArIFJFU19QUkVWX0RBVEFfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdfc2NhbGVkICsgUkVTX1BSRVZfREFUQV9TSVpFIC0gaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJmcmFtZV9zaXplKTsKKyAgICAgICAgICAgIGlmIChzdW0gPiBjb3JyX2ludF9udW0pIHsKKyAgICAgICAgICAgICAgICBjb3JyX2ludF9udW0gPSBzdW07CisgICAgICAgICAgICAgICAgYmVzdF9kZWxheV9pbnQgPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb3JyX2ludF9udW0pIHsKKyAgICAgICAgICAgIC8qIENvbXB1dGUgZGVub21pbmF0b3Igb2YgcHNldWRvLW5vcm1hbGl6ZWQgY29ycmVsYXRpb24gUicoMCkuICovCisgICAgICAgICAgICBjb3JyX2ludF9kZW4gPSBhZHNwLT5zY2FsYXJwcm9kdWN0X2ludDE2KHNpZ19zY2FsZWQgLSBiZXN0X2RlbGF5X2ludCArIFJFU19QUkVWX0RBVEFfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdfc2NhbGVkIC0gYmVzdF9kZWxheV9pbnQgKyBSRVNfUFJFVl9EQVRBX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZnJhbWVfc2l6ZSk7CisKKyAgICAgICAgICAgIC8qIENvbXB1dGUgc2lnbmFscyB3aXRoIG5vbi1pbnRlZ2VyIGRlbGF5IGsgKHdpdGggMS84IHByZWNpc2lvbiksCisgICAgICAgICAgICAgICB3aGVyZSBrIGlzIGluIFswOzZdIHJhbmdlLgorICAgICAgICAgICAgICAgRW50aXJlIGRlbGF5IGlzIHF1YWwgdG8gYmVzdF9kZWxheSsoaysxKS84CisgICAgICAgICAgICAgICBUaGlzIGlzIGFyY2hpZXZlZCBieSBhcHBseWluZyBhbiBpbnRlcnBvbGF0aW9uIGZpbHRlciBvZgorICAgICAgICAgICAgICAgbGVndGggMzMgdG8gc291cmNlIHNpZ25hbC4gKi8KKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBBTkFMWVpFRF9GUkFDX0RFTEFZUzsgaysrKSB7CisgICAgICAgICAgICAgICAgZmZfYWNlbHBfaW50ZXJwb2xhdGUoJmRlbGF5ZWRfc2lnbmFsW2tdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWdfc2NhbGVkW1JFU19QUkVWX0RBVEFfU0laRSAtIGJlc3RfZGVsYXlfaW50XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9nNzI5X2ludGVycF9maWx0X3Nob3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOQUxZWkVEX0ZSQUNfREVMQVlTKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAtIGsgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUX0lOVF9GSUxUX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJmcmFtZV9zaXplICsgMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENvbXB1dGUgZGVub21pbmF0b3Igb2YgcHNldWRvLW5vcm1hbGl6ZWQgY29ycmVsYXRpb24gUicoaykuCisKKyAgICAgICAgICAgICAgICAgY29ycl9kZW5ba11bMF0gaXMgc3F1YXJlIHJvb3Qgb2YgUicoaykgZGVub21pbmF0b3IsIGZvciBpbnQoVCkgPT0gaW50KFQwKQorICAgICAgICAgICAgICAgICBjb3JyX2RlbltrXVsxXSBpcyBzcXVhcmUgcm9vdCBvZiBSJyhrKSBkZW5vbWluYXRvciwgZm9yIGludChUKSA9PSBpbnQoVDApKzEKKworICAgICAgICAgICAgICBBbHNvIGNvbXB1dGUgbWF4aW11bSB2YWx1ZSBvZiBhYm92ZSBkZW5vbWluYXRvcnMgb3ZlciBhbGwgay4gKi8KKyAgICAgICAgICAgIHRtcCA9IGNvcnJfaW50X2RlbjsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBBTkFMWVpFRF9GUkFDX0RFTEFZUzsgaysrKSB7CisgICAgICAgICAgICAgICAgc3VtID0gYWRzcC0+c2NhbGFycHJvZHVjdF9pbnQxNigmZGVsYXllZF9zaWduYWxba11bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWxheWVkX3NpZ25hbFtrXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZnJhbWVfc2l6ZSAtIDEpOworICAgICAgICAgICAgICAgIGNvcnJfZGVuW2tdWzBdID0gc3VtICsgZGVsYXllZF9zaWduYWxba11bMCAgICAgICAgICAgIF0gKiBkZWxheWVkX3NpZ25hbFtrXVswICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICBjb3JyX2RlbltrXVsxXSA9IHN1bSArIGRlbGF5ZWRfc2lnbmFsW2tdW3N1YmZyYW1lX3NpemVdICogZGVsYXllZF9zaWduYWxba11bc3ViZnJhbWVfc2l6ZV07CisKKyAgICAgICAgICAgICAgICB0bXAgPSBGRk1BWDModG1wLCBjb3JyX2RlbltrXVswXSwgY29ycl9kZW5ba11bMV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaF9nYWluX2RlbiA9IGF2X2xvZzIodG1wKSAtIDE0OworICAgICAgICAgICAgaWYgKHNoX2dhaW5fZGVuID49IDApIHsKKworICAgICAgICAgICAgICAgIHNoX2dhaW5fbnVtID0gIEZGTUFYKHNoX2dhaW5fZGVuLCBzaF9lbmVyKTsKKyAgICAgICAgICAgICAgICAvKiBMb29wIHRocm91Z2ggYWxsIGsgYW5kIGZpbmQgZGVsYXkgdGhhdCBtYXhpbWl6ZXMKKyAgICAgICAgICAgICAgICAgICBSJyhrKSBjb3JyZWxhdGlvbi4KKyAgICAgICAgICAgICAgICAgICBTZWFyY2ggaXMgZG9uZSBpbiBbaW50KFQwKS0xOyBpbnRUKDApKzFdIHJhbmdlCisgICAgICAgICAgICAgICAgICAgd2l0aCAxLzggcHJlY2lzaW9uLiAqLworICAgICAgICAgICAgICAgIGRlbGF5ZWRfc2lnbmFsX29mZnNldCA9IDE7CisgICAgICAgICAgICAgICAgYmVzdF9kZWxheV9mcmFjID0gMDsKKyAgICAgICAgICAgICAgICBnYWluX2RlbiA9IGNvcnJfaW50X2RlbiA+PiBzaF9nYWluX2RlbjsKKyAgICAgICAgICAgICAgICBnYWluX251bSA9IGNvcnJfaW50X251bSA+PiBzaF9nYWluX251bTsKKyAgICAgICAgICAgICAgICBnYWluX251bV9zcXVhcmUgPSBnYWluX251bSAqIGdhaW5fbnVtOworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBBTkFMWVpFRF9GUkFDX0RFTEFZUzsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgZ2Fpbl9udW1fc2hvcnQsIGdhaW5fZGVuX3Nob3J0OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdhaW5fbnVtX3Nob3J0X3NxdWFyZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgbnVtZXJhdG9yIG9mIHBzZXVkby1ub3JtYWxpemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiBSJyhrKS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IGFkc3AtPnNjYWxhcnByb2R1Y3RfaW50MTYoJmRlbGF5ZWRfc2lnbmFsW2tdW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ19zY2FsZWQgKyBSRVNfUFJFVl9EQVRBX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZnJhbWVfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnYWluX251bV9zaG9ydCA9IEZGTUFYKHN1bSA+PiBzaF9nYWluX251bSwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5fbnVtX3Nob3J0X3NxdWFyZSAgICAgICAgICAgICAgICBnYWluX251bV9zcXVhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFInKFQpXjIgPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSwgbWF4IFInKFQpXjI9IC0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl9kZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBnYWluX251bV9zaG9ydF9zcXVhcmUgPSBnYWluX251bV9zaG9ydCAqIGdhaW5fbnVtX3Nob3J0OworICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl9kZW5fc2hvcnQgPSBjb3JyX2RlbltrXVtpXSA+PiBzaF9nYWluX2RlbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gTVVMTChnYWluX251bV9zaG9ydF9zcXVhcmUsIGdhaW5fZGVuLCBGUkFDX0JJVFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTEwoZ2Fpbl9udW1fc3F1YXJlLCBnYWluX2Rlbl9zaG9ydCwgRlJBQ19CSVRTKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUicoVCleMiA+IG1heCBSJyhUKV4yCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gdG1wMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5fbnVtID0gZ2Fpbl9udW1fc2hvcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl9kZW4gPSBnYWluX2Rlbl9zaG9ydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluX251bV9zcXVhcmUgPSBnYWluX251bV9zaG9ydF9zcXVhcmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXllZF9zaWduYWxfb2Zmc2V0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2RlbGF5X2ZyYWMgPSBrICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgIFInKFQpXjIKKyAgICAgICAgICAgICAgICAgIDIgKiAtLS0tLS0tLS0gPCAxCisgICAgICAgICAgICAgICAgICAgICAgICBSKDApCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMNjRfdGVtcDAgPSAgKGludDY0X3QpZ2Fpbl9udW1fc3F1YXJlICA8PCAoKHNoX2dhaW5fbnVtIDw8IDEpICsgMSk7CisgICAgICAgICAgICAgICAgTDY0X3RlbXAxID0gKChpbnQ2NF90KWdhaW5fZGVuICogZW5lcikgPDwgKHNoX2dhaW5fZGVuICsgc2hfZW5lcik7CisgICAgICAgICAgICAgICAgaWYgKEw2NF90ZW1wMCA8IEw2NF90ZW1wMSkKKyAgICAgICAgICAgICAgICAgICAgZ2Fpbl9udW0gPSAwOworICAgICAgICAgICAgfSAvLyBpZihzaF9nYWluX2RlbiA+PSAwKQorICAgICAgICB9IC8vIGlmKGNvcnJfaW50X251bSkKKyAgICB9IC8vIGlmKGVuZXIpCisgICAgLyogRW5kIG9mIGJlc3QgZGVsYXkgc2VhcmNoaW5nIGNvZGUgICovCisKKyAgICBpZiAoIWdhaW5fbnVtKSB7CisgICAgICAgIG1lbWNweShyZXNpZHVhbF9maWx0LCByZXNpZHVhbCArIFJFU19QUkVWX0RBVEFfU0laRSwgc3ViZnJhbWVfc2l6ZSAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgLyogTG9uZy10ZXJtIHByZWRpY3Rpb24gZ2FpbiBpcyBsZXNzIHRoYW4gM2RCLiBMb25nLXRlcm0gcG9zdGZpbHRlciBpcyBkaXNhYmxlZC4gKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChiZXN0X2RlbGF5X2ZyYWMpIHsKKyAgICAgICAgLyogUmVjb21wdXRlIGRlbGF5ZWQgc2lnbmFsIHdpdGggYW4gaW50ZXJwb2xhdGlvbiBmaWx0ZXIgb2YgbGVuZ3RoIDEyOS4gKi8KKyAgICAgICAgZmZfYWNlbHBfaW50ZXJwb2xhdGUocmVzaWR1YWxfZmlsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ19zY2FsZWRbUkVTX1BSRVZfREFUQV9TSVpFIC0gYmVzdF9kZWxheV9pbnQgKyBkZWxheWVkX3NpZ25hbF9vZmZzZXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9nNzI5X2ludGVycF9maWx0X2xvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOQUxZWkVEX0ZSQUNfREVMQVlTICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAtIGJlc3RfZGVsYXlfZnJhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9OR19JTlRfRklMVF9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmZyYW1lX3NpemUgKyAxKTsKKyAgICAgICAgLyogQ29tcHV0ZSBSJyhrKSBjb3JyZWxhdGlvbidzIG51bWVyYXRvci4gKi8KKyAgICAgICAgc3VtID0gYWRzcC0+c2NhbGFycHJvZHVjdF9pbnQxNihyZXNpZHVhbF9maWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnX3NjYWxlZCArIFJFU19QUkVWX0RBVEFfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmZyYW1lX3NpemUpOworCisgICAgICAgIGlmIChzdW0gPCAwKSB7CisgICAgICAgICAgICBnYWluX2xvbmdfbnVtID0gMDsKKyAgICAgICAgICAgIHNoX2dhaW5fbG9uZ19udW0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG1wID0gRkZNQVgoYXZfbG9nMihzdW0pIC0gMTQsIDApOworICAgICAgICAgICAgc3VtID4+PSB0bXA7CisgICAgICAgICAgICBnYWluX2xvbmdfbnVtID0gc3VtOworICAgICAgICAgICAgc2hfZ2Fpbl9sb25nX251bSA9IHRtcDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXB1dGUgUicoaykgY29ycmVsYXRpb24ncyBkZW5vbWluYXRvci4gKi8KKyAgICAgICAgc3VtID0gYWRzcC0+c2NhbGFycHJvZHVjdF9pbnQxNihyZXNpZHVhbF9maWx0LCByZXNpZHVhbF9maWx0LCBzdWJmcmFtZV9zaXplKTsKKworICAgICAgICB0bXAgPSBGRk1BWChhdl9sb2cyKHN1bSkgLSAxNCwgMCk7CisgICAgICAgIHN1bSA+Pj0gdG1wOworICAgICAgICBnYWluX2xvbmdfZGVuID0gc3VtOworICAgICAgICBzaF9nYWluX2xvbmdfZGVuID0gdG1wOworCisgICAgICAgIC8qIFNlbGVjdCBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBkZWxheWVkIHNpZ25hbC4KKyAgICAgICAgICAgRGVsYXllZCBzaWduYWwgd2lsbCBiZSBzZWxlY3RlZCBpZiBpdCBpbmNyZWFzZXMgUicoaykKKyAgICAgICAgICAgY29ycmVsYXRpb24uICovCisgICAgICAgIExfdGVtcDAgPSBnYWluX251bSAqIGdhaW5fbnVtOworICAgICAgICBMX3RlbXAwID0gTVVMTChMX3RlbXAwLCBnYWluX2xvbmdfZGVuLCBGUkFDX0JJVFMpOworCisgICAgICAgIExfdGVtcDEgPSBnYWluX2xvbmdfbnVtICogZ2Fpbl9sb25nX251bTsKKyAgICAgICAgTF90ZW1wMSA9IE1VTEwoTF90ZW1wMSwgZ2Fpbl9kZW4sIEZSQUNfQklUUyk7CisKKyAgICAgICAgdG1wID0gKChzaF9nYWluX2xvbmdfbnVtIC0gc2hfZ2Fpbl9udW0pIDw8IDEpIC0gKHNoX2dhaW5fbG9uZ19kZW4gLSBzaF9nYWluX2Rlbik7CisgICAgICAgIGlmICh0bXAgPiAwKQorICAgICAgICAgICAgTF90ZW1wMCA+Pj0gdG1wOworICAgICAgICBlbHNlCisgICAgICAgICAgICBMX3RlbXAxID4+PSAtdG1wOworCisgICAgICAgIC8qIENoZWNrIGlmIGxvbmdlciBmaWx0ZXIgaW5jcmVhc2VzIHRoZSB2YWx1ZXMgb2YgUicoaykuICovCisgICAgICAgIGlmIChMX3RlbXAxID4gTF90ZW1wMCkgeworICAgICAgICAgICAgLyogU2VsZWN0IGxvbmcgZmlsdGVyLiAqLworICAgICAgICAgICAgc2VsZWN0ZWRfc2lnbmFsID0gcmVzaWR1YWxfZmlsdDsKKyAgICAgICAgICAgIGdhaW5fbnVtID0gZ2Fpbl9sb25nX251bTsKKyAgICAgICAgICAgIGdhaW5fZGVuID0gZ2Fpbl9sb25nX2RlbjsKKyAgICAgICAgICAgIHNoX2dhaW5fbnVtID0gc2hfZ2Fpbl9sb25nX251bTsKKyAgICAgICAgICAgIHNoX2dhaW5fZGVuID0gc2hfZ2Fpbl9sb25nX2RlbjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAvKiBTZWxlY3Qgc2hvcnQgZmlsdGVyLiAqLworICAgICAgICAgICAgc2VsZWN0ZWRfc2lnbmFsID0gJmRlbGF5ZWRfc2lnbmFsW2Jlc3RfZGVsYXlfZnJhYy0xXVtkZWxheWVkX3NpZ25hbF9vZmZzZXRdOworCisgICAgICAgIC8qIFJlc2NhbGUgc2VsZWN0ZWQgc2lnbmFsIHRvIG9yaWdpbmFsIHZhbHVlLiAqLworICAgICAgICBpZiAoc2hpZnQgPiAwKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1YmZyYW1lX3NpemU7IGkrKykKKyAgICAgICAgICAgICAgICBzZWxlY3RlZF9zaWduYWxbaV0gPDw9IHNoaWZ0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ViZnJhbWVfc2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgIHNlbGVjdGVkX3NpZ25hbFtpXSA+Pj0gLXNoaWZ0OworCisgICAgICAgIC8qIG5lY2Vzc2FyeSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nICovCisgICAgICAgIHNlbGVjdGVkX3NpZ25hbF9jb25zdCA9IHNlbGVjdGVkX3NpZ25hbDsKKyAgICB9IC8vIGlmKGJlc3RfZGVsYXlfZnJhYykKKyAgICBlbHNlCisgICAgICAgIHNlbGVjdGVkX3NpZ25hbF9jb25zdCA9IHJlc2lkdWFsICsgUkVTX1BSRVZfREFUQV9TSVpFIC0gKGJlc3RfZGVsYXlfaW50ICsgMSAtIGRlbGF5ZWRfc2lnbmFsX29mZnNldCk7CisjaWZkZWYgRzcyOV9CSVRFWEFDVAorICAgIHRtcCA9IHNoX2dhaW5fbnVtIC0gc2hfZ2Fpbl9kZW47CisgICAgaWYgKHRtcCA+IDApCisgICAgICAgIGdhaW5fZGVuID4+PSB0bXA7CisgICAgZWxzZQorICAgICAgICBnYWluX251bSA+Pj0gLXRtcDsKKworICAgIGlmIChnYWluX251bSA+IGdhaW5fZGVuKQorICAgICAgICBsdF9maWx0X2ZhY3Rvcl9hID0gTUlOX0xUX0ZJTFRfRkFDVE9SX0E7CisgICAgZWxzZSB7CisgICAgICAgIGdhaW5fbnVtID4+PSAyOworICAgICAgICBnYWluX2RlbiA+Pj0gMTsKKyAgICAgICAgbHRfZmlsdF9mYWN0b3JfYSA9IChnYWluX2RlbiA8PCAxNSkgLyAoZ2Fpbl9kZW4gKyBnYWluX251bSk7CisgICAgfQorI2Vsc2UKKyAgICBMNjRfdGVtcDAgPSAoKChpbnQ2NF90KWdhaW5fbnVtKSA8PCBzaF9nYWluX251bSkgPj4gMTsKKyAgICBMNjRfdGVtcDEgPSAoKGludDY0X3QpZ2Fpbl9kZW4pIDw8IHNoX2dhaW5fZGVuOworICAgIGx0X2ZpbHRfZmFjdG9yX2EgPSBGRk1BWCgoTDY0X3RlbXAxIDw8IDE1KSAvIChMNjRfdGVtcDEgKyBMNjRfdGVtcDApLCBNSU5fTFRfRklMVF9GQUNUT1JfQSk7CisjZW5kaWYKKworICAgIC8qIEZpbHRlciB0aHJvdWdoIHNlbGVjdGVkIGZpbHRlci4gKi8KKyAgICBsdF9maWx0X2ZhY3Rvcl9iID0gMzI3NjcgLSBsdF9maWx0X2ZhY3Rvcl9hICsgMTsKKworICAgIGZmX2FjZWxwX3dlaWdodGVkX3ZlY3Rvcl9zdW0ocmVzaWR1YWxfZmlsdCwgcmVzaWR1YWwgKyBSRVNfUFJFVl9EQVRBX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZF9zaWduYWxfY29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdF9maWx0X2ZhY3Rvcl9hLCBsdF9maWx0X2ZhY3Rvcl9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTw8MTQsIDE1LCBzdWJmcmFtZV9zaXplKTsKKworICAgIC8vIExvbmctdGVybSBwcmVkaWN0aW9uIGdhaW4gaXMgbGFyZ2VyIHRoYW4gM2RCLgorICAgIHJldHVybiAxOworfQorCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgcmVmbGVjdGlvbiBjb2VmZmljaWVudCBmb3IgdGlsdCBjb21wZW5zYXRpb24gZmlsdGVyICg0LjIuMykuCisgKiBccGFyYW0gZHNwIGluaXRpYWxpemVkIERTUCBjb250ZXh0CisgKiBccGFyYW0gbHBfZ24gKDMuMTIpIGNvZWZmaWNpZW50cyBvZiBBKHovRk9STUFOVF9QUF9GQUNUT1JfTlVNKSBmaWx0ZXIKKyAqIFxwYXJhbSBscF9nZCAoMy4xMikgY29lZmZpY2llbnRzIG9mIEEoei9GT1JNQU5UX1BQX0ZBQ1RPUl9ERU4pIGZpbHRlcgorICogXHBhcmFtIHNwZWVjaCBzcGVlY2ggdG8gdXBkYXRlCisgKiBccGFyYW0gc3ViZnJhbWVfc2l6ZSBzaXplIG9mIHN1YmZyYW1lCisgKgorICogXHJldHVybiAoMy4xMikgcmVmbGVjdGlvbiBjb2VmZmljaWVudAorICoKKyAqIFxyZW1hcmsgVGhlIHJvdXRpbmUgYWxzbyBjYWxjdWxhdGVzIHRoZSBnYWluIHRlcm0gZm9yIHRoZSBzaG9ydC10ZXJtCisgKiAgICAgICAgIGZpbHRlciAoZ2YpIGFuZCBtdWx0aXBsaWVzIHRoZSBzcGVlY2ggZGF0YSBieSAxL2dmLgorICoKKyAqIFxub3RlIEFsbCBtZW1iZXJzIG9mIGxwX2duLCBleGNlcHQgMTAtMTkgbXVzdCBiZSBlcXVhbCB0byB6ZXJvLgorICovCitzdGF0aWMgaW50MTZfdCBnZXRfdGlsdF9jb21wKEF1ZGlvRFNQQ29udGV4dCAqYWRzcCwgaW50MTZfdCAqbHBfZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmxwX2dkLCBpbnQxNl90KiBzcGVlY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJmcmFtZV9zaXplKQoreworICAgIGludCByaDEscmgwOyAvLyAoMy4xMikKKyAgICBpbnQgdGVtcDsKKyAgICBpbnQgaTsKKyAgICBpbnQgZ2Fpbl90ZXJtOworCisgICAgbHBfZ25bMTBdID0gNDA5NjsgLy8xLjAgaW4gKDMuMTIpCisKKyAgICAvKiBBcHBseSAxL0Eoei9GT1JNQU5UX1BQX0ZBQ1RPUl9ERU4pIGZpbHRlciB0byBoZi4gKi8KKyAgICBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXIobHBfZ24gKyAxMSwgbHBfZ2QgKyAxLCBscF9nbiArIDExLCAyMiwgMTAsIDAsIDAsIDB4ODAwKTsKKyAgICAvKiBOb3cgbHBfZ24gKHN0YXJ0aW5nIHdpdGggMTApIGNvbnRhaW5zIGltcHVsc2UgcmVzcG9uc2UKKyAgICAgICBvZiBBKHovRk9STUFOVF9QUF9GQUNUT1JfTlVNKS9BKHovRk9STUFOVF9QUF9GQUNUT1JfREVOKSBmaWx0ZXIuICovCisKKyAgICByaDAgPSBhZHNwLT5zY2FsYXJwcm9kdWN0X2ludDE2KGxwX2duICsgMTAsIGxwX2duICsgMTAsIDIwKTsKKyAgICByaDEgPSBhZHNwLT5zY2FsYXJwcm9kdWN0X2ludDE2KGxwX2duICsgMTAsIGxwX2duICsgMTEsIDIwKTsKKworICAgIC8qIGRvd25zY2FsZSB0byBhdm9pZCBvdmVyZmxvdyAqLworICAgIHRlbXAgPSBhdl9sb2cyKHJoMCkgLSAxNDsKKyAgICBpZiAodGVtcCA+IDApIHsKKyAgICAgICAgcmgwID4+PSB0ZW1wOworICAgICAgICByaDEgPj49IHRlbXA7CisgICAgfQorCisgICAgaWYgKEZGQUJTKHJoMSkgPiByaDAgfHwgIXJoMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBnYWluX3Rlcm0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKQorICAgICAgICBnYWluX3Rlcm0gKz0gRkZBQlMobHBfZ25baSArIDEwXSk7CisgICAgZ2Fpbl90ZXJtID4+PSAyOyAvLyAoMy4xMikgLT4gKDUuMTApCisKKyAgICBpZiAoZ2Fpbl90ZXJtID4gMHg0MDApIHsgLy8gMS4wIGluICg1LjEwKQorICAgICAgICB0ZW1wID0gMHgyMDAwMDAwIC8gZ2Fpbl90ZXJtOyAvLyAxLjAvZ2Fpbl90ZXJtIGluICgwLjE1KQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ViZnJhbWVfc2l6ZTsgaSsrKQorICAgICAgICAgICAgc3BlZWNoW2ldID0gKHNwZWVjaFtpXSAqIHRlbXAgKyAweDQwMDApID4+IDE1OworICAgIH0KKworICAgIHJldHVybiAtKHJoMSA8PCAxNSkgLyByaDA7Cit9CisKKy8qKgorICogXGJyaWVmIEFwcGx5IHRpbHQgY29tcGVuc2F0aW9uIGZpbHRlciAoNC4yLjMpLgorICogXHBhcmFtIHJlc19wc3QgW2luL291dF0gcmVzaWR1YWwgc2lnbmFsIChwYXJ0aWFsbHkgZmlsdGVyZWQpCisgKiBccGFyYW0gazEgKDMuMTIpIHJlZmxlY3Rpb24gY29lZmZpY2llbnQKKyAqIFxwYXJhbSBzdWJmcmFtZV9zaXplIHNpemUgb2Ygc3ViZnJhbWUKKyAqIFxwYXJhbSBodF9wcmV2X2RhdGEgcHJldmlvdXMgZGF0YSBmb3IgNC4yLjMsIGVxdWF0aW9uIDg2CisgKgorICogXHJldHVybiBuZXcgdmFsdWUgZm9yIGh0X3ByZXZfZGF0YQorKi8KK3N0YXRpYyBpbnQxNl90IGFwcGx5X3RpbHRfY29tcChpbnQxNl90KiBvdXQsIGludDE2X3QqIHJlc19wc3QsIGludCByZWZsX2NvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJmcmFtZV9zaXplLCBpbnQxNl90IGh0X3ByZXZfZGF0YSkKK3sKKyAgICBpbnQgdG1wLCB0bXAyOworICAgIGludCBpOworICAgIGludCBndCwgZ2E7CisgICAgaW50IGZhY3QsIHNoX2ZhY3Q7CisKKyAgICBpZiAocmVmbF9jb2VmZiA+IDApIHsKKyAgICAgICAgZ3QgPSAocmVmbF9jb2VmZiAqIEc3MjlfVElMVF9GQUNUT1JfUExVUyArIDB4NDAwMCkgPj4gMTU7CisgICAgICAgIGZhY3QgPSAweDQwMDA7IC8vIDAuNSBpbiAoMC4xNSkKKyAgICAgICAgc2hfZmFjdCA9IDE1OworICAgIH0gZWxzZSB7CisgICAgICAgIGd0ID0gKHJlZmxfY29lZmYgKiBHNzI5X1RJTFRfRkFDVE9SX01JTlVTICsgMHg0MDAwKSA+PiAxNTsKKyAgICAgICAgZmFjdCA9IDB4ODAwOyAvLyAwLjUgaW4gKDMuMTIpCisgICAgICAgIHNoX2ZhY3QgPSAxMjsKKyAgICB9CisgICAgZ2EgPSAoZmFjdCA8PCAxNSkgLyBhdl9jbGlwX2ludDE2KDMyNzY4IC0gRkZBQlMoZ3QpKTsKKyAgICBndCA+Pj0gMTsKKworICAgIC8qIEFwcGx5IHRpbHQgY29tcGVuc2F0aW9uIGZpbHRlciB0byBzaWduYWwuICovCisgICAgdG1wID0gcmVzX3BzdFtzdWJmcmFtZV9zaXplIC0gMV07CisKKyAgICBmb3IgKGkgPSBzdWJmcmFtZV9zaXplIC0gMTsgaSA+PSAxOyBpLS0pIHsKKyAgICAgICAgdG1wMiA9IChyZXNfcHN0W2ldIDw8IDE1KSArICgoZ3QgKiByZXNfcHN0W2ktMV0pIDw8IDEpOworICAgICAgICB0bXAyID0gKHRtcDIgKyAweDQwMDApID4+IDE1OworCisgICAgICAgIHRtcDIgPSAodG1wMiAqIGdhICogMiArIGZhY3QpID4+IHNoX2ZhY3Q7CisgICAgICAgIG91dFtpXSA9IHRtcDI7CisgICAgfQorICAgIHRtcDIgPSAocmVzX3BzdFswXSA8PCAxNSkgKyAoKGd0ICogaHRfcHJldl9kYXRhKSA8PCAxKTsKKyAgICB0bXAyID0gKHRtcDIgKyAweDQwMDApID4+IDE1OworICAgIHRtcDIgPSAodG1wMiAqIGdhICogMiArIGZhY3QpID4+IHNoX2ZhY3Q7CisgICAgb3V0WzBdID0gdG1wMjsKKworICAgIHJldHVybiB0bXA7Cit9CisKK3ZvaWQgZmZfZzcyOV9wb3N0ZmlsdGVyKEF1ZGlvRFNQQ29udGV4dCAqYWRzcCwgaW50MTZfdCogaHRfcHJldl9kYXRhLCBpbnQqIHZvaWNpbmcsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpscF9maWx0ZXJfY29lZmZzLCBpbnQgcGl0Y2hfZGVsYXlfaW50LAorICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogcmVzaWR1YWwsIGludDE2X3QqIHJlc19maWx0ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIHBvc19maWx0ZXJfZGF0YSwgaW50MTZfdCAqc3BlZWNoLCBpbnQgc3ViZnJhbWVfc2l6ZSkKK3sKKyAgICBpbnQxNl90IHJlc2lkdWFsX2ZpbHRfYnVmW1NVQkZSQU1FX1NJWkUrMTFdOworICAgIGludDE2X3QgbHBfZ25bMzNdOyAvLyAoMy4xMikKKyAgICBpbnQxNl90IGxwX2dkWzExXTsgLy8gKDMuMTIpCisgICAgaW50IHRpbHRfY29tcF9jb2VmZjsKKyAgICBpbnQgaTsKKworICAgIC8qIFplcm8tZmlsbGluZyBpcyBuZWNlc3NhcnkgZm9yIHRpbHQtY29tcGVuc2F0aW9uIGZpbHRlci4gKi8KKyAgICBtZW1zZXQobHBfZ24sIDAsIDMzICogc2l6ZW9mKGludDE2X3QpKTsKKworICAgIC8qIENhbGN1bGF0ZSBBKHovRk9STUFOVF9QUF9GQUNUT1JfTlVNKSBmaWx0ZXIgY29lZmZpY2llbnRzLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorICAgICAgICBscF9nbltpICsgMTFdID0gKGxwX2ZpbHRlcl9jb2VmZnNbaSArIDFdICogZm9ybWFudF9wcF9mYWN0b3JfbnVtX3Bvd1tpXSArIDB4NDAwMCkgPj4gMTU7CisKKyAgICAvKiBDYWxjdWxhdGUgQSh6L0ZPUk1BTlRfUFBfRkFDVE9SX0RFTikgZmlsdGVyIGNvZWZmaWNpZW50cy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgbHBfZ2RbaSArIDFdID0gKGxwX2ZpbHRlcl9jb2VmZnNbaSArIDFdICogZm9ybWFudF9wcF9mYWN0b3JfZGVuX3Bvd1tpXSArIDB4NDAwMCkgPj4gMTU7CisKKyAgICAvKiByZXNpZHVhbCBzaWduYWwgY2FsY3VsYXRpb24gKG9uZS1oYWxmIG9mIHNob3J0LXRlcm0gcG9zdGZpbHRlcikgKi8KKyAgICBtZW1jcHkoc3BlZWNoIC0gMTAsIHJlc19maWx0ZXJfZGF0YSwgMTAgKiBzaXplb2YoaW50MTZfdCkpOworICAgIHJlc2lkdWFsX2ZpbHRlcihyZXNpZHVhbCArIFJFU19QUkVWX0RBVEFfU0laRSwgbHBfZ24gKyAxMSwgc3BlZWNoLCBzdWJmcmFtZV9zaXplKTsKKyAgICAvKiBTYXZlIGRhdGEgdG8gdXNlIGl0IGluIHRoZSBuZXh0IHN1YmZyYW1lLiAqLworICAgIG1lbWNweShyZXNfZmlsdGVyX2RhdGEsIHNwZWVjaCArIHN1YmZyYW1lX3NpemUgLSAxMCwgMTAgKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgLyogbG9uZy10ZXJtIGZpbHRlci4gSWYgbG9uZy10ZXJtIHByZWRpY3Rpb24gZ2FpbiBpcyBsYXJnZXIgdGhhbiAzZEIgKHJldHVybmVkIHZhbHVlIGlzCisgICAgICAgbm9uemVybykgdGhlbiBkZWNsYXJlIGN1cnJlbnQgc3ViZnJhbWUgYXMgcGVyaW9kaWMuICovCisgICAgKnZvaWNpbmcgPSBGRk1BWCgqdm9pY2luZywgbG9uZ190ZXJtX2ZpbHRlcihhZHNwLCBwaXRjaF9kZWxheV9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpZHVhbCwgcmVzaWR1YWxfZmlsdF9idWYgKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmZyYW1lX3NpemUpKTsKKworICAgIC8qIHNoaWZ0IHJlc2lkdWFsIGZvciB1c2luZyBpbiBuZXh0IHN1YmZyYW1lICovCisgICAgbWVtbW92ZShyZXNpZHVhbCwgcmVzaWR1YWwgKyBzdWJmcmFtZV9zaXplLCBSRVNfUFJFVl9EQVRBX1NJWkUgKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgLyogc2hvcnQtdGVybSBmaWx0ZXIgdGlsdCBjb21wZW5zYXRpb24gKi8KKyAgICB0aWx0X2NvbXBfY29lZmYgPSBnZXRfdGlsdF9jb21wKGFkc3AsIGxwX2duLCBscF9nZCwgcmVzaWR1YWxfZmlsdF9idWYgKyAxMCwgc3ViZnJhbWVfc2l6ZSk7CisKKyAgICAvKiBBcHBseSBzZWNvbmQgaGFsZiBvZiBzaG9ydC10ZXJtIHBvc3RmaWx0ZXI6IDEvQSh6L0ZPUk1BTlRfUFBfRkFDVE9SX0RFTikgKi8KKyAgICBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXIocG9zX2ZpbHRlcl9kYXRhICsgMTAsIGxwX2dkICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaWR1YWxfZmlsdF9idWYgKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZnJhbWVfc2l6ZSwgMTAsIDAsIDAsIDB4ODAwKTsKKyAgICBtZW1jcHkocG9zX2ZpbHRlcl9kYXRhLCBwb3NfZmlsdGVyX2RhdGEgKyBzdWJmcmFtZV9zaXplLCAxMCAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAqaHRfcHJldl9kYXRhID0gYXBwbHlfdGlsdF9jb21wKHNwZWVjaCwgcG9zX2ZpbHRlcl9kYXRhICsgMTAsIHRpbHRfY29tcF9jb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmZyYW1lX3NpemUsICpodF9wcmV2X2RhdGEpOworfQorCisvKioKKyAqIFxicmllZiBBZGFwdGl2ZSBnYWluIGNvbnRyb2wgKDQuMi40KQorICogXHBhcmFtIGdhaW5fYmVmb3JlIGdhaW4gb2Ygc3BlZWNoIGJlZm9yZSBhcHBseWluZyBwb3N0ZmlsdGVycworICogXHBhcmFtIGdhaW5fYWZ0ZXIgIGdhaW4gb2Ygc3BlZWNoIGFmdGVyIGFwcGx5aW5nIHBvc3RmaWx0ZXJzCisgKiBccGFyYW0gc3BlZWNoIFtpbi9vdXRdIHNpZ25hbCBidWZmZXIKKyAqIFxwYXJhbSBzdWJmcmFtZV9zaXplIGxlbmd0aCBvZiBzdWJmcmFtZQorICogXHBhcmFtIGdhaW5fcHJldiAoMy4xMikgcHJldmlvdXMgdmFsdWUgb2YgZ2FpbiBjb2VmZmljaWVudAorICoKKyAqIFxyZXR1cm4gKDMuMTIpIGxhc3QgdmFsdWUgb2YgZ2FpbiBjb2VmZmljaWVudAorICovCitpbnQxNl90IGZmX2c3MjlfYWRhcHRpdmVfZ2Fpbl9jb250cm9sKGludCBnYWluX2JlZm9yZSwgaW50IGdhaW5fYWZ0ZXIsIGludDE2X3QgKnNwZWVjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmZyYW1lX3NpemUsIGludDE2X3QgZ2Fpbl9wcmV2KQoreworICAgIGludCBnYWluOyAvLyAoMy4xMikKKyAgICBpbnQgbjsKKyAgICBpbnQgZXhwX2JlZm9yZSwgZXhwX2FmdGVyOworCisgICAgaWYoIWdhaW5fYWZ0ZXIgJiYgZ2Fpbl9iZWZvcmUpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGdhaW5fYmVmb3JlKSB7CisKKyAgICAgICAgZXhwX2JlZm9yZSAgPSAxNCAtIGF2X2xvZzIoZ2Fpbl9iZWZvcmUpOworICAgICAgICBnYWluX2JlZm9yZSA9IGJpZGlyX3NhbChnYWluX2JlZm9yZSwgZXhwX2JlZm9yZSk7CisKKyAgICAgICAgZXhwX2FmdGVyICA9IDE0IC0gYXZfbG9nMihnYWluX2FmdGVyKTsKKyAgICAgICAgZ2Fpbl9hZnRlciA9IGJpZGlyX3NhbChnYWluX2FmdGVyLCBleHBfYWZ0ZXIpOworCisgICAgICAgIGlmIChnYWluX2JlZm9yZSA8IGdhaW5fYWZ0ZXIpIHsKKyAgICAgICAgICAgIGdhaW4gPSAoZ2Fpbl9iZWZvcmUgPDwgMTUpIC8gZ2Fpbl9hZnRlcjsKKyAgICAgICAgICAgIGdhaW4gPSBiaWRpcl9zYWwoZ2FpbiwgZXhwX2FmdGVyIC0gZXhwX2JlZm9yZSAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2FpbiA9ICgoZ2Fpbl9iZWZvcmUgLSBnYWluX2FmdGVyKSA8PCAxNCkgLyBnYWluX2FmdGVyICsgMHg0MDAwOworICAgICAgICAgICAgZ2FpbiA9IGJpZGlyX3NhbChnYWluLCBleHBfYWZ0ZXIgLSBleHBfYmVmb3JlKTsKKyAgICAgICAgfQorICAgICAgICBnYWluID0gKGdhaW4gKiBHNzI5X0FHQ19GQUMxICsgMHg0MDAwKSA+PiAxNTsgLy8gZ2FpbiAqICgxLTAuOTg3NSkKKyAgICB9IGVsc2UKKyAgICAgICAgZ2FpbiA9IDA7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgc3ViZnJhbWVfc2l6ZTsgbisrKSB7CisgICAgICAgIC8vIGdhaW5fcHJldiA9IGdhaW4gKyAwLjk4NzUgKiBnYWluX3ByZXYKKyAgICAgICAgZ2Fpbl9wcmV2ID0gKEc3MjlfQUdDX0ZBQ1RPUiAqIGdhaW5fcHJldiArIDB4NDAwMCkgPj4gMTU7CisgICAgICAgIGdhaW5fcHJldiA9IGF2X2NsaXBfaW50MTYoZ2FpbiArIGdhaW5fcHJldik7CisgICAgICAgIHNwZWVjaFtuXSA9IGF2X2NsaXBfaW50MTYoKHNwZWVjaFtuXSAqIGdhaW5fcHJldiArIDB4MjAwMCkgPj4gMTQpOworICAgIH0KKyAgICByZXR1cm4gZ2Fpbl9wcmV2OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZzcyOXBvc3RmaWx0ZXIuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3Mjlwb3N0ZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllM2U0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2c3Mjlwb3N0ZmlsdGVyLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBHLjcyOSwgRzcyOSBBbm5leCBEIHBvc3RmaWx0ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCBWbGFkaW1pciBWb3Jvc2hpbG92CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaWZuZGVmIEZGTVBFR19HNzI5UE9TVEZJTFRFUl9ICisjZGVmaW5lIEZGTVBFR19HNzI5UE9TVEZJTFRFUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdWRpb2RzcC5oIgorCisvKioKKyAqIHRpbHQgY29tcGVuc2F0aW9uIGZhY3RvciAoRy43MjksIGsxPjApCisgKiAwLjIgaW4gUTE1CisgKi8KKyNkZWZpbmUgRzcyOV9USUxUX0ZBQ1RPUl9QTFVTICAgICAgIDY1NTQKKworLyoqCisgKiB0aWx0IGNvbXBlbnNhdGlvbiBmYWN0b3IgKEcuNzI5LCBrMTwwKQorICogMC45IGluIFExNQorICovCisjZGVmaW5lIEc3MjlfVElMVF9GQUNUT1JfTUlOVVMgICAgIDI5NDkxCisKKy8qIDQuMi4yICovCisjZGVmaW5lIEZPUk1BTlRfUFBfRkFDVE9SX05VTSAgMTgwMjIgICAgICAgICAgICAgLy8wLjU1IGluIFExNQorI2RlZmluZSBGT1JNQU5UX1BQX0ZBQ1RPUl9ERU4gIDIyOTM4ICAgICAgICAgICAgIC8vMC43MCBpbiBRMTUKKworLyoqCisgKiBnYWluIGFkanVzdG1lbnQgZmFjdG9yIChHLjcyOSwgNC4yLjQpCisgKiAwLjk4NzUgaW4gUTE1CisgKi8KKyNkZWZpbmUgRzcyOV9BR0NfRkFDVE9SICAgICAgICAgICAgMzIzNTgKKyNkZWZpbmUgRzcyOV9BR0NfRkFDMSAoMzI3NjgtRzcyOV9BR0NfRkFDVE9SKQorCisvKioKKyAqIDEuMCAvICgxLjAgKyAwLjUpIGluIFExNQorICogd2hlcmUgMC41IGlzIHRoZSBtaW5pbXVtIHZhbHVlIG9mCisgKiB3ZWlnaHQgZmFjdG9yLCBjb250cm9sbGluZyBhbW91bnQgb2YgbG9uZy10ZXJtIHBvc3RmaWx0ZXJpbmcKKyAqLworI2RlZmluZSBNSU5fTFRfRklMVF9GQUNUT1JfQSAgICAgICAyMTg0NQorCisvKioKKyAqIFNob3J0IGludGVycG9sYXRpb24gZmlsdGVyIGxlbmd0aAorICovCisjZGVmaW5lIFNIT1JUX0lOVF9GSUxUX0xFTiAgICAgICAgIDIKKworLyoqCisgKiBMb25nIGludGVycG9sYXRpb24gZmlsdGVyIGxlbmd0aAorICovCisjZGVmaW5lIExPTkdfSU5UX0ZJTFRfTEVOICAgICAgICAgIDgKKworLyoqCisgKiBOdW1iZXIgb2YgYW5hbHl6ZWQgZnJhY3Rpb25hbCBwaXRjaCBkZWxheXMgaW4gc2Vjb25kIHN0YWdlIG9mIGxvbmctdGVybQorICogcG9zdGZpbHRlcgorICovCisjZGVmaW5lIEFOQUxZWkVEX0ZSQUNfREVMQVlTICAgICAgIDcKKworLyoqCisgKiBBbW91bnQgb2YgcGFzdCByZXNpZHVhbCBzaWduYWwgZGF0YSBzdG9yZWQgaW4gYnVmZmVyCisgKi8KKyNkZWZpbmUgUkVTX1BSRVZfREFUQV9TSVpFIChQSVRDSF9ERUxBWV9NQVggKyBMT05HX0lOVF9GSUxUX0xFTiArIDEpCisKKy8qKgorICogXGJyaWVmIFNpZ25hbCBwb3N0ZmlsdGVyaW5nICg0LjIpCisgKiBccGFyYW0gZHNwIGluaXRpYWxpemVkIERTUCBjb250ZXh0CisgKiBccGFyYW0gaHRfcHJldl9kYXRhIFtpbi9vdXRdIChRMTIpIHBvaW50ZXIgdG8gdmFyaWFibGUgcmVjZWl2aW5nIHRpbHQKKyAqICAgICAgICAgICAgICAgICAgICAgY29tcGVuc2F0aW9uIGZpbHRlciBkYXRhIGZyb20gcHJldmlvdXMgc3ViZnJhbWUKKyAqIFxwYXJhbSB2b2ljaW5nIFtpbi9vdXRdIChRMCkgcG9pbnRlciB0byB2YXJpYWJsZSByZWNlaXZpbmcgdm9pY2luZyBkZWNpc2lvbgorICogXHBhcmFtIGxwX2ZpbHRlcl9jb2VmZnMgKFExMikgTFAgZmlsdGVyIGNvZWZmaWNpZW50cworICogXHBhcmFtIHBpdGNoX2RlbGF5X2ludCBpbnRlZ2VyIHBhcnQgb2YgdGhlIHBpdGNoIGRlbGF5CisgKiBccGFyYW0gcmVzaWR1YWwgW2luL291dF0gKFEwKSByZXNpZHVhbCBzaWduYWwgYnVmZmVyICh1c2VkIGluIGxvbmctdGVybSBwb3N0ZmlsdGVyKQorICogXHBhcmFtIHJlc19maWx0ZXJfZGF0YSBbaW4vb3V0XSAoUTApIHNwZWVjaCBkYXRhIG9mIHByZXZpb3VzIHN1YmZyYW1lCisgKiBccGFyYW0gcG9zX2ZpbHRlcl9kYXRhIFtpbi9vdXRdIChRMCkgcHJldmlvdXMgc3BlZWNoIGRhdGEgZm9yIHNob3J0LXRlcm0gcG9zdGZpbHRlcgorICogXHBhcmFtIHNwZWVjaCBbaW4vb3V0XSAoUTApIHNpZ25hbCBidWZmZXIKKyAqIFxwYXJhbSBzdWJmcmFtZV9zaXplIHNpemUgb2Ygc3ViZnJhbWUKKyAqCisgKiBGaWx0ZXJpbmcgaGFzIHRoZSBmb2xsb3dpbmcgIHN0YWdlczoKKyAqICAgTG9uZy10ZXJtIHBvc3RmaWx0ZXIgKDQuMi4xKQorICogICBTaG9ydC10ZXJtIHBvc3RmaWx0ZXIgKDQuMi4yKS4KKyAqICAgVGlsdC1jb21wZW5zYXRpb24gKDQuMi4zKQorICovCit2b2lkIGZmX2c3MjlfcG9zdGZpbHRlcihBdWRpb0RTUENvbnRleHQgKmFkc3AsIGludDE2X3QqIGh0X3ByZXZfZGF0YSwgaW50KiB2b2ljaW5nLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqbHBfZmlsdGVyX2NvZWZmcywgaW50IHBpdGNoX2RlbGF5X2ludCwKKyAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIHJlc2lkdWFsLCBpbnQxNl90KiByZXNfZmlsdGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBwb3NfZmlsdGVyX2RhdGEsIGludDE2X3QgKnNwZWVjaCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdWJmcmFtZV9zaXplKTsKKworLyoqCisgKiBcYnJpZWYgQWRhcHRpdmUgZ2FpbiBjb250cm9sICg0LjIuNCkKKyAqIFxwYXJhbSBnYWluX2JlZm9yZSAoUTApIGdhaW4gb2Ygc3BlZWNoIGJlZm9yZSBhcHBseWluZyBwb3N0ZmlsdGVycworICogXHBhcmFtIGdhaW5fYWZ0ZXIgIChRMCkgZ2FpbiBvZiBzcGVlY2ggYWZ0ZXIgYXBwbHlpbmcgcG9zdGZpbHRlcnMKKyAqIFxwYXJhbSBzcGVlY2ggW2luL291dF0gKFEwKSBzaWduYWwgYnVmZmVyCisgKiBccGFyYW0gc3ViZnJhbWVfc2l6ZSBsZW5ndGggb2Ygc3ViZnJhbWUKKyAqIFxwYXJhbSBnYWluX3ByZXYgKFExMikgcHJldmlvdXMgdmFsdWUgb2YgZ2FpbiBjb2VmZmljaWVudAorICoKKyAqIFxyZXR1cm4gKFExMikgbGFzdCB2YWx1ZSBvZiBnYWluIGNvZWZmaWNpZW50CisgKi8KK2ludDE2X3QgZmZfZzcyOV9hZGFwdGl2ZV9nYWluX2NvbnRyb2woaW50IGdhaW5fYmVmb3JlLCBpbnQgZ2Fpbl9hZnRlciwgaW50MTZfdCAqc3BlZWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViZnJhbWVfc2l6ZSwgaW50MTZfdCBnYWluX3ByZXYpOworCisjZW5kaWYgLy8gRkZNUEVHX0c3MjlQT1NURklMVEVSX0gKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2dldF9iaXRzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9nZXRfYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZGVjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9nZXRfYml0cy5oCkBAIC0wLDAgKzEsNjk2IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGJpdHN0cmVhbSByZWFkZXIgQVBJIGhlYWRlci4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfR0VUX0JJVFNfSAorI2RlZmluZSBBVkNPREVDX0dFVF9CSVRTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCisvKgorICogU2FmZSBiaXRzdHJlYW0gcmVhZGluZzoKKyAqIG9wdGlvbmFsbHksIHRoZSBnZXRfYml0cyBBUEkgY2FuIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHdlCisgKiBkb24ndCByZWFkIHBhc3QgaW5wdXQgYnVmZmVyIGJvdW5kYXJpZXMuIFRoaXMgaXMgcHJvdGVjdGVkCisgKiB3aXRoIENPTkZJR19TQUZFX0JJVFNUUkVBTV9SRUFERVIgYXQgdGhlIGdsb2JhbCBsZXZlbCwgYW5kCisgKiB0aGVuIGJlbG93IHRoYXQgd2l0aCBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUiBhdCB0aGUgcGVyLQorICogZGVjb2RlciBsZXZlbC4gVGhpcyBtZWFucyB0aGF0IGRlY29kZXJzIHRoYXQgY2hlY2sgaW50ZXJuYWxseQorICogY2FuICIjZGVmaW5lIFVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSIDEiIHRvIGRpc2FibGUKKyAqIG92ZXJyZWFkIGNoZWNrcy4KKyAqIEJvdW5kYXJ5IGNoZWNraW5nIGNhdXNlcyBhIG1pbm9yIHBlcmZvcm1hbmNlIHBlbmFsdHkgc28gZm9yCisgKiBhcHBsaWNhdGlvbnMgdGhhdCB3b24ndCB3YW50L25lZWQgdGhpcywgaXQgY2FuIGJlIGRpc2FibGVkCisgKiBnbG9iYWxseSB1c2luZyAiI2RlZmluZSBDT05GSUdfU0FGRV9CSVRTVFJFQU1fUkVBREVSIDAiLgorICovCisjaWZuZGVmIFVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSCisjZGVmaW5lIFVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSICFDT05GSUdfU0FGRV9CSVRTVFJFQU1fUkVBREVSCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgR2V0Qml0Q29udGV4dCB7CisgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLCAqYnVmZmVyX2VuZDsKKyAgICBpbnQgaW5kZXg7CisgICAgaW50IHNpemVfaW5fYml0czsKKyAgICBpbnQgc2l6ZV9pbl9iaXRzX3BsdXM4OworfSBHZXRCaXRDb250ZXh0OworCisjZGVmaW5lIFZMQ19UWVBFIGludDE2X3QKKwordHlwZWRlZiBzdHJ1Y3QgVkxDIHsKKyAgICBpbnQgYml0czsKKyAgICBWTENfVFlQRSAoKnRhYmxlKVsyXTsgLy8vPCBjb2RlLCBiaXRzCisgICAgaW50IHRhYmxlX3NpemUsIHRhYmxlX2FsbG9jYXRlZDsKK30gVkxDOworCit0eXBlZGVmIHN0cnVjdCBSTF9WTENfRUxFTSB7CisgICAgaW50MTZfdCBsZXZlbDsKKyAgICBpbnQ4X3QgbGVuOworICAgIHVpbnQ4X3QgcnVuOworfSBSTF9WTENfRUxFTTsKKworLyogQml0c3RyZWFtIHJlYWRlciBBUEkgZG9jczoKKyAqIG5hbWUKKyAqICAgYXJiaXRyYXJ5IG5hbWUgd2hpY2ggaXMgdXNlZCBhcyBwcmVmaXggZm9yIHRoZSBpbnRlcm5hbCB2YXJpYWJsZXMKKyAqCisgKiBnYgorICogICBnZXRiaXRjb250ZXh0CisgKgorICogT1BFTl9SRUFERVIobmFtZSwgZ2IpCisgKiAgIGxvYWQgZ2IgaW50byBsb2NhbCB2YXJpYWJsZXMKKyAqCisgKiBDTE9TRV9SRUFERVIobmFtZSwgZ2IpCisgKiAgIHN0b3JlIGxvY2FsIHZhcnMgaW4gZ2IKKyAqCisgKiBVUERBVEVfQ0FDSEUobmFtZSwgZ2IpCisgKiAgIFJlZmlsbCB0aGUgaW50ZXJuYWwgY2FjaGUgZnJvbSB0aGUgYml0c3RyZWFtLgorICogICBBZnRlciB0aGlzIGNhbGwgYXQgbGVhc3QgTUlOX0NBQ0hFX0JJVFMgd2lsbCBiZSBhdmFpbGFibGUuCisgKgorICogR0VUX0NBQ0hFKG5hbWUsIGdiKQorICogICBXaWxsIG91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIGludGVybmFsIGNhY2hlLAorICogICBuZXh0IGJpdCBpcyBNU0Igb2YgMzIgb3IgNjQgYml0IChGSVhNRSA2NGJpdCkuCisgKgorICogU0hPV19VQklUUyhuYW1lLCBnYiwgbnVtKQorICogICBXaWxsIHJldHVybiB0aGUgbmV4dCBudW0gYml0cy4KKyAqCisgKiBTSE9XX1NCSVRTKG5hbWUsIGdiLCBudW0pCisgKiAgIFdpbGwgcmV0dXJuIHRoZSBuZXh0IG51bSBiaXRzIGFuZCBkbyBzaWduIGV4dGVuc2lvbi4KKyAqCisgKiBTS0lQX0JJVFMobmFtZSwgZ2IsIG51bSkKKyAqICAgV2lsbCBza2lwIG92ZXIgdGhlIG5leHQgbnVtIGJpdHMuCisgKiAgIE5vdGUsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBTS0lQX0NBQ0hFOyBTS0lQX0NPVU5URVIuCisgKgorICogU0tJUF9DQUNIRShuYW1lLCBnYiwgbnVtKQorICogICBXaWxsIHJlbW92ZSB0aGUgbmV4dCBudW0gYml0cyBmcm9tIHRoZSBjYWNoZSAobm90ZSBTS0lQX0NPVU5URVIKKyAqICAgTVVTVCBiZSBjYWxsZWQgYmVmb3JlIFVQREFURV9DQUNIRSAvIENMT1NFX1JFQURFUikuCisgKgorICogU0tJUF9DT1VOVEVSKG5hbWUsIGdiLCBudW0pCisgKiAgIFdpbGwgaW5jcmVtZW50IHRoZSBpbnRlcm5hbCBiaXQgY291bnRlciAoc2VlIFNLSVBfQ0FDSEUgJiBTS0lQX0JJVFMpLgorICoKKyAqIExBU1RfU0tJUF9CSVRTKG5hbWUsIGdiLCBudW0pCisgKiAgIExpa2UgU0tJUF9CSVRTLCB0byBiZSB1c2VkIGlmIG5leHQgY2FsbCBpcyBVUERBVEVfQ0FDSEUgb3IgQ0xPU0VfUkVBREVSLgorICoKKyAqIEJJVFNfTEVGVChuYW1lLCBnYikKKyAqICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBsZWZ0CisgKgorICogRm9yIGV4YW1wbGVzIHNlZSBnZXRfYml0cywgc2hvd19iaXRzLCBza2lwX2JpdHMsIGdldF92bGMuCisgKi8KKworI2lmZGVmIExPTkdfQklUU1RSRUFNX1JFQURFUgorIyAgIGRlZmluZSBNSU5fQ0FDSEVfQklUUyAzMgorI2Vsc2UKKyMgICBkZWZpbmUgTUlOX0NBQ0hFX0JJVFMgMjUKKyNlbmRpZgorCisjZGVmaW5lIE9QRU5fUkVBREVSX05PU0laRShuYW1lLCBnYikgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgaW50IG5hbWUgIyMgX2luZGV4ID0gKGdiKS0+aW5kZXg7ICBcCisgICAgdW5zaWduZWQgaW50IGF2X3VudXNlZCBuYW1lICMjIF9jYWNoZQorCisjaWYgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIKKyNkZWZpbmUgT1BFTl9SRUFERVIobmFtZSwgZ2IpIE9QRU5fUkVBREVSX05PU0laRShuYW1lLCBnYikKKworI2RlZmluZSBCSVRTX0FWQUlMQUJMRShuYW1lLCBnYikgMQorI2Vsc2UKKyNkZWZpbmUgT1BFTl9SRUFERVIobmFtZSwgZ2IpICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUEVOX1JFQURFUl9OT1NJWkUobmFtZSwgZ2IpOyAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBpbnQgbmFtZSAjIyBfc2l6ZV9wbHVzOCA9IChnYiktPnNpemVfaW5fYml0c19wbHVzOAorCisjZGVmaW5lIEJJVFNfQVZBSUxBQkxFKG5hbWUsIGdiKSBuYW1lICMjIF9pbmRleCA8IG5hbWUgIyMgX3NpemVfcGx1czgKKyNlbmRpZgorCisjZGVmaW5lIENMT1NFX1JFQURFUihuYW1lLCBnYikgKGdiKS0+aW5kZXggPSBuYW1lICMjIF9pbmRleAorCisjIGlmZGVmIExPTkdfQklUU1RSRUFNX1JFQURFUgorCisjIGRlZmluZSBVUERBVEVfQ0FDSEVfTEUobmFtZSwgZ2IpIG5hbWUgIyMgX2NhY2hlID0gXAorICAgICAgQVZfUkw2NCgoZ2IpLT5idWZmZXIgKyAobmFtZSAjIyBfaW5kZXggPj4gMykpID4+IChuYW1lICMjIF9pbmRleCAmIDcpCisKKyMgZGVmaW5lIFVQREFURV9DQUNIRV9CRShuYW1lLCBnYikgbmFtZSAjIyBfY2FjaGUgPSBcCisgICAgICBBVl9SQjY0KChnYiktPmJ1ZmZlciArIChuYW1lICMjIF9pbmRleCA+PiAzKSkgPj4gKDMyIC0gKG5hbWUgIyMgX2luZGV4ICYgNykpCisKKyNlbHNlCisKKyMgZGVmaW5lIFVQREFURV9DQUNIRV9MRShuYW1lLCBnYikgbmFtZSAjIyBfY2FjaGUgPSBcCisgICAgICBBVl9STDMyKChnYiktPmJ1ZmZlciArIChuYW1lICMjIF9pbmRleCA+PiAzKSkgPj4gKG5hbWUgIyMgX2luZGV4ICYgNykKKworIyBkZWZpbmUgVVBEQVRFX0NBQ0hFX0JFKG5hbWUsIGdiKSBuYW1lICMjIF9jYWNoZSA9IFwKKyAgICAgIEFWX1JCMzIoKGdiKS0+YnVmZmVyICsgKG5hbWUgIyMgX2luZGV4ID4+IDMpKSA8PCAobmFtZSAjIyBfaW5kZXggJiA3KQorCisjZW5kaWYKKworCisjaWZkZWYgQklUU1RSRUFNX1JFQURFUl9MRQorCisjIGRlZmluZSBVUERBVEVfQ0FDSEUobmFtZSwgZ2IpIFVQREFURV9DQUNIRV9MRShuYW1lLCBnYikKKworIyBkZWZpbmUgU0tJUF9DQUNIRShuYW1lLCBnYiwgbnVtKSBuYW1lICMjIF9jYWNoZSA+Pj0gKG51bSkKKworI2Vsc2UKKworIyBkZWZpbmUgVVBEQVRFX0NBQ0hFKG5hbWUsIGdiKSBVUERBVEVfQ0FDSEVfQkUobmFtZSwgZ2IpCisKKyMgZGVmaW5lIFNLSVBfQ0FDSEUobmFtZSwgZ2IsIG51bSkgbmFtZSAjIyBfY2FjaGUgPDw9IChudW0pCisKKyNlbmRpZgorCisjaWYgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIKKyMgICBkZWZpbmUgU0tJUF9DT1VOVEVSKG5hbWUsIGdiLCBudW0pIG5hbWUgIyMgX2luZGV4ICs9IChudW0pCisjZWxzZQorIyAgIGRlZmluZSBTS0lQX0NPVU5URVIobmFtZSwgZ2IsIG51bSkgXAorICAgIG5hbWUgIyMgX2luZGV4ID0gRkZNSU4obmFtZSAjIyBfc2l6ZV9wbHVzOCwgbmFtZSAjIyBfaW5kZXggKyAobnVtKSkKKyNlbmRpZgorCisjZGVmaW5lIEJJVFNfTEVGVChuYW1lLCBnYikgKChpbnQpKChnYiktPnNpemVfaW5fYml0cyAtIG5hbWUgIyMgX2luZGV4KSkKKworI2RlZmluZSBTS0lQX0JJVFMobmFtZSwgZ2IsIG51bSkgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTS0lQX0NBQ0hFKG5hbWUsIGdiLCBudW0pOyAgICAgICAgICAgICAgXAorICAgICAgICBTS0lQX0NPVU5URVIobmFtZSwgZ2IsIG51bSk7ICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTEFTVF9TS0lQX0JJVFMobmFtZSwgZ2IsIG51bSkgU0tJUF9DT1VOVEVSKG5hbWUsIGdiLCBudW0pCisKKyNkZWZpbmUgU0hPV19VQklUU19MRShuYW1lLCBnYiwgbnVtKSB6ZXJvX2V4dGVuZChuYW1lICMjIF9jYWNoZSwgbnVtKQorI2RlZmluZSBTSE9XX1NCSVRTX0xFKG5hbWUsIGdiLCBudW0pIHNpZ25fZXh0ZW5kKG5hbWUgIyMgX2NhY2hlLCBudW0pCisKKyNkZWZpbmUgU0hPV19VQklUU19CRShuYW1lLCBnYiwgbnVtKSBORUdfVVNSMzIobmFtZSAjIyBfY2FjaGUsIG51bSkKKyNkZWZpbmUgU0hPV19TQklUU19CRShuYW1lLCBnYiwgbnVtKSBORUdfU1NSMzIobmFtZSAjIyBfY2FjaGUsIG51bSkKKworI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKyMgICBkZWZpbmUgU0hPV19VQklUUyhuYW1lLCBnYiwgbnVtKSBTSE9XX1VCSVRTX0xFKG5hbWUsIGdiLCBudW0pCisjICAgZGVmaW5lIFNIT1dfU0JJVFMobmFtZSwgZ2IsIG51bSkgU0hPV19TQklUU19MRShuYW1lLCBnYiwgbnVtKQorI2Vsc2UKKyMgICBkZWZpbmUgU0hPV19VQklUUyhuYW1lLCBnYiwgbnVtKSBTSE9XX1VCSVRTX0JFKG5hbWUsIGdiLCBudW0pCisjICAgZGVmaW5lIFNIT1dfU0JJVFMobmFtZSwgZ2IsIG51bSkgU0hPV19TQklUU19CRShuYW1lLCBnYiwgbnVtKQorI2VuZGlmCisKKyNkZWZpbmUgR0VUX0NBQ0hFKG5hbWUsIGdiKSAoKHVpbnQzMl90KSBuYW1lICMjIF9jYWNoZSkKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2JpdHNfY291bnQoY29uc3QgR2V0Qml0Q29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gcy0+aW5kZXg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2lwX2JpdHNfbG9uZyhHZXRCaXRDb250ZXh0ICpzLCBpbnQgbikKK3sKKyNpZiBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUgorICAgIHMtPmluZGV4ICs9IG47CisjZWxzZQorICAgIHMtPmluZGV4ICs9IGF2X2NsaXAobiwgLXMtPmluZGV4LCBzLT5zaXplX2luX2JpdHNfcGx1czggLSBzLT5pbmRleCk7CisjZW5kaWYKK30KKworLyoqCisgKiByZWFkIG1wZWcxIGRjIHN0eWxlIHZsYyAoc2lnbiBiaXQgKyBtYW50aXNzYSB3aXRoIG5vIE1TQikuCisgKiBpZiBNU0Igbm90IHNldCBpdCBpcyBuZWdhdGl2ZQorICogQHBhcmFtIG4gbGVuZ3RoIGluIGJpdHMKKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3hiaXRzKEdldEJpdENvbnRleHQgKnMsIGludCBuKQoreworICAgIHJlZ2lzdGVyIGludCBzaWduOworICAgIHJlZ2lzdGVyIGludDMyX3QgY2FjaGU7CisgICAgT1BFTl9SRUFERVIocmUsIHMpOworICAgIGF2X2Fzc2VydDIobj4wICYmIG48PTI1KTsKKyAgICBVUERBVEVfQ0FDSEUocmUsIHMpOworICAgIGNhY2hlID0gR0VUX0NBQ0hFKHJlLCBzKTsKKyAgICBzaWduICA9IH5jYWNoZSA+PiAzMTsKKyAgICBMQVNUX1NLSVBfQklUUyhyZSwgcywgbik7CisgICAgQ0xPU0VfUkVBREVSKHJlLCBzKTsKKyAgICByZXR1cm4gKE5FR19VU1IzMihzaWduIF4gY2FjaGUsIG4pIF4gc2lnbikgLSBzaWduOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfc2JpdHMoR2V0Qml0Q29udGV4dCAqcywgaW50IG4pCit7CisgICAgcmVnaXN0ZXIgaW50IHRtcDsKKyAgICBPUEVOX1JFQURFUihyZSwgcyk7CisgICAgYXZfYXNzZXJ0MihuPjAgJiYgbjw9MjUpOworICAgIFVQREFURV9DQUNIRShyZSwgcyk7CisgICAgdG1wID0gU0hPV19TQklUUyhyZSwgcywgbik7CisgICAgTEFTVF9TS0lQX0JJVFMocmUsIHMsIG4pOworICAgIENMT1NFX1JFQURFUihyZSwgcyk7CisgICAgcmV0dXJuIHRtcDsKK30KKworLyoqCisgKiBSZWFkIDEtMjUgYml0cy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2JpdHMoR2V0Qml0Q29udGV4dCAqcywgaW50IG4pCit7CisgICAgcmVnaXN0ZXIgaW50IHRtcDsKKyAgICBPUEVOX1JFQURFUihyZSwgcyk7CisgICAgYXZfYXNzZXJ0MihuPjAgJiYgbjw9MjUpOworICAgIFVQREFURV9DQUNIRShyZSwgcyk7CisgICAgdG1wID0gU0hPV19VQklUUyhyZSwgcywgbik7CisgICAgTEFTVF9TS0lQX0JJVFMocmUsIHMsIG4pOworICAgIENMT1NFX1JFQURFUihyZSwgcyk7CisgICAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2JpdHNfbGUoR2V0Qml0Q29udGV4dCAqcywgaW50IG4pCit7CisgICAgcmVnaXN0ZXIgaW50IHRtcDsKKyAgICBPUEVOX1JFQURFUihyZSwgcyk7CisgICAgYXZfYXNzZXJ0MihuPjAgJiYgbjw9MjUpOworICAgIFVQREFURV9DQUNIRV9MRShyZSwgcyk7CisgICAgdG1wID0gU0hPV19VQklUU19MRShyZSwgcywgbik7CisgICAgTEFTVF9TS0lQX0JJVFMocmUsIHMsIG4pOworICAgIENMT1NFX1JFQURFUihyZSwgcyk7CisgICAgcmV0dXJuIHRtcDsKK30KKworLyoqCisgKiBTaG93IDEtMjUgYml0cy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2hvd19iaXRzKEdldEJpdENvbnRleHQgKnMsIGludCBuKQoreworICAgIHJlZ2lzdGVyIGludCB0bXA7CisgICAgT1BFTl9SRUFERVJfTk9TSVpFKHJlLCBzKTsKKyAgICBhdl9hc3NlcnQyKG4+MCAmJiBuPD0yNSk7CisgICAgVVBEQVRFX0NBQ0hFKHJlLCBzKTsKKyAgICB0bXAgPSBTSE9XX1VCSVRTKHJlLCBzLCBuKTsKKyAgICByZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tpcF9iaXRzKEdldEJpdENvbnRleHQgKnMsIGludCBuKQoreworICAgIE9QRU5fUkVBREVSKHJlLCBzKTsKKyAgICBMQVNUX1NLSVBfQklUUyhyZSwgcywgbik7CisgICAgQ0xPU0VfUkVBREVSKHJlLCBzKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2JpdHMxKEdldEJpdENvbnRleHQgKnMpCit7CisgICAgdW5zaWduZWQgaW50IGluZGV4ID0gcy0+aW5kZXg7CisgICAgdWludDhfdCByZXN1bHQgICAgID0gcy0+YnVmZmVyW2luZGV4ID4+IDNdOworI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKyAgICByZXN1bHQgPj49IGluZGV4ICYgNzsKKyAgICByZXN1bHQgICY9IDE7CisjZWxzZQorICAgIHJlc3VsdCA8PD0gaW5kZXggJiA3OworICAgIHJlc3VsdCA+Pj0gOCAtIDE7CisjZW5kaWYKKyNpZiAhVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIKKyAgICBpZiAocy0+aW5kZXggPCBzLT5zaXplX2luX2JpdHNfcGx1czgpCisjZW5kaWYKKyAgICAgICAgaW5kZXgrKzsKKyAgICBzLT5pbmRleCA9IGluZGV4OworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2hvd19iaXRzMShHZXRCaXRDb250ZXh0ICpzKQoreworICAgIHJldHVybiBzaG93X2JpdHMocywgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2lwX2JpdHMxKEdldEJpdENvbnRleHQgKnMpCit7CisgICAgc2tpcF9iaXRzKHMsIDEpOworfQorCisvKioKKyAqIFJlYWQgMC0zMiBiaXRzLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfYml0c19sb25nKEdldEJpdENvbnRleHQgKnMsIGludCBuKQoreworICAgIGlmICghbikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKG4gPD0gTUlOX0NBQ0hFX0JJVFMpIHsKKyAgICAgICAgcmV0dXJuIGdldF9iaXRzKHMsIG4pOworICAgIH0gZWxzZSB7CisjaWZkZWYgQklUU1RSRUFNX1JFQURFUl9MRQorICAgICAgICB1bnNpZ25lZCByZXQgPSBnZXRfYml0cyhzLCAxNik7CisgICAgICAgIHJldHVybiByZXQgfCAoZ2V0X2JpdHMocywgbiAtIDE2KSA8PCAxNik7CisjZWxzZQorICAgICAgICB1bnNpZ25lZCByZXQgPSBnZXRfYml0cyhzLCAxNikgPDwgKG4gLSAxNik7CisgICAgICAgIHJldHVybiByZXQgfCBnZXRfYml0cyhzLCBuIC0gMTYpOworI2VuZGlmCisgICAgfQorfQorCisvKioKKyAqIFJlYWQgMC02NCBiaXRzLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGdldF9iaXRzNjQoR2V0Qml0Q29udGV4dCAqcywgaW50IG4pCit7CisgICAgaWYgKG4gPD0gMzIpIHsKKyAgICAgICAgcmV0dXJuIGdldF9iaXRzX2xvbmcocywgbik7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBCSVRTVFJFQU1fUkVBREVSX0xFCisgICAgICAgIHVpbnQ2NF90IHJldCA9IGdldF9iaXRzX2xvbmcocywgMzIpOworICAgICAgICByZXR1cm4gcmV0IHwgKHVpbnQ2NF90KSBnZXRfYml0c19sb25nKHMsIG4gLSAzMikgPDwgMzI7CisjZWxzZQorICAgICAgICB1aW50NjRfdCByZXQgPSAodWludDY0X3QpIGdldF9iaXRzX2xvbmcocywgbiAtIDMyKSA8PCAzMjsKKyAgICAgICAgcmV0dXJuIHJldCB8IGdldF9iaXRzX2xvbmcocywgMzIpOworI2VuZGlmCisgICAgfQorfQorCisvKioKKyAqIFJlYWQgMC0zMiBiaXRzIGFzIGEgc2lnbmVkIGludGVnZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9zYml0c19sb25nKEdldEJpdENvbnRleHQgKnMsIGludCBuKQoreworICAgIHJldHVybiBzaWduX2V4dGVuZChnZXRfYml0c19sb25nKHMsIG4pLCBuKTsKK30KKworLyoqCisgKiBTaG93IDAtMzIgYml0cy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2hvd19iaXRzX2xvbmcoR2V0Qml0Q29udGV4dCAqcywgaW50IG4pCit7CisgICAgaWYgKG4gPD0gTUlOX0NBQ0hFX0JJVFMpIHsKKyAgICAgICAgcmV0dXJuIHNob3dfYml0cyhzLCBuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBHZXRCaXRDb250ZXh0IGdiID0gKnM7CisgICAgICAgIHJldHVybiBnZXRfYml0c19sb25nKCZnYiwgbik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBjaGVja19tYXJrZXIoR2V0Qml0Q29udGV4dCAqcywgY29uc3QgY2hhciAqbXNnKQoreworICAgIGludCBiaXQgPSBnZXRfYml0czEocyk7CisgICAgaWYgKCFiaXQpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIk1hcmtlciBiaXQgbWlzc2luZyAlc1xuIiwgbXNnKTsKKworICAgIHJldHVybiBiaXQ7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBHZXRCaXRDb250ZXh0LgorICogQHBhcmFtIGJ1ZmZlciBiaXRzdHJlYW0gYnVmZmVyLCBtdXN0IGJlIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgYnl0ZXMKKyAqICAgICAgICBsYXJnZXIgdGhhbiB0aGUgYWN0dWFsIHJlYWQgYml0cyBiZWNhdXNlIHNvbWUgb3B0aW1pemVkIGJpdHN0cmVhbQorICogICAgICAgIHJlYWRlcnMgcmVhZCAzMiBvciA2NCBiaXQgYXQgb25jZSBhbmQgY291bGQgcmVhZCBvdmVyIHRoZSBlbmQKKyAqIEBwYXJhbSBiaXRfc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJpdHMKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBBVkVSUk9SX0lOVkFMSUREQVRBIGlmIHRoZSBidWZmZXJfc2l6ZSB3b3VsZCBvdmVyZmxvdy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaW5pdF9nZXRfYml0cyhHZXRCaXRDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRfc2l6ZSkKK3sKKyAgICBpbnQgYnVmZmVyX3NpemU7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoYml0X3NpemUgPj0gSU5UX01BWCAtIDcgfHwgYml0X3NpemUgPCAwIHx8ICFidWZmZXIpIHsKKyAgICAgICAgYml0X3NpemUgICAgPSAwOworICAgICAgICBidWZmZXIgICAgICA9IE5VTEw7CisgICAgICAgIHJldCAgICAgICAgID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBidWZmZXJfc2l6ZSA9IChiaXRfc2l6ZSArIDcpID4+IDM7CisKKyAgICBzLT5idWZmZXIgICAgICAgICAgICAgPSBidWZmZXI7CisgICAgcy0+c2l6ZV9pbl9iaXRzICAgICAgID0gYml0X3NpemU7CisgICAgcy0+c2l6ZV9pbl9iaXRzX3BsdXM4ID0gYml0X3NpemUgKyA4OworICAgIHMtPmJ1ZmZlcl9lbmQgICAgICAgICA9IGJ1ZmZlciArIGJ1ZmZlcl9zaXplOworICAgIHMtPmluZGV4ICAgICAgICAgICAgICA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEluaXRpYWxpemUgR2V0Qml0Q29udGV4dC4KKyAqIEBwYXJhbSBidWZmZXIgYml0c3RyZWFtIGJ1ZmZlciwgbXVzdCBiZSBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFIGJ5dGVzCisgKiAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIGFjdHVhbCByZWFkIGJpdHMgYmVjYXVzZSBzb21lIG9wdGltaXplZCBiaXRzdHJlYW0KKyAqICAgICAgICByZWFkZXJzIHJlYWQgMzIgb3IgNjQgYml0IGF0IG9uY2UgYW5kIGNvdWxkIHJlYWQgb3ZlciB0aGUgZW5kCisgKiBAcGFyYW0gYnl0ZV9zaXplIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBBVkVSUk9SX0lOVkFMSUREQVRBIGlmIHRoZSBidWZmZXJfc2l6ZSB3b3VsZCBvdmVyZmxvdy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaW5pdF9nZXRfYml0czgoR2V0Qml0Q29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVfc2l6ZSkKK3sKKyAgICBpZiAoYnl0ZV9zaXplID4gSU5UX01BWCAvIDggfHwgYnl0ZV9zaXplIDwgMCkKKyAgICAgICAgYnl0ZV9zaXplID0gLTE7CisgICAgcmV0dXJuIGluaXRfZ2V0X2JpdHMocywgYnVmZmVyLCBieXRlX3NpemUgKiA4KTsKK30KKworc3RhdGljIGlubGluZSBjb25zdCB1aW50OF90ICphbGlnbl9nZXRfYml0cyhHZXRCaXRDb250ZXh0ICpzKQoreworICAgIGludCBuID0gLWdldF9iaXRzX2NvdW50KHMpICYgNzsKKyAgICBpZiAobikKKyAgICAgICAgc2tpcF9iaXRzKHMsIG4pOworICAgIHJldHVybiBzLT5idWZmZXIgKyAocy0+aW5kZXggPj4gMyk7Cit9CisKKyNkZWZpbmUgaW5pdF92bGModmxjLCBuYl9iaXRzLCBuYl9jb2RlcywgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBiaXRzLCBiaXRzX3dyYXAsIGJpdHNfc2l6ZSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGNvZGVzLCBjb2Rlc193cmFwLCBjb2Rlc19zaXplLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgZmxhZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZmX2luaXRfdmxjX3NwYXJzZSh2bGMsIG5iX2JpdHMsIG5iX2NvZGVzLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIGJpdHMsIGJpdHNfd3JhcCwgYml0c19zaXplLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgY29kZXMsIGNvZGVzX3dyYXAsIGNvZGVzX3NpemUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBmbGFncykKKworaW50IGZmX2luaXRfdmxjX3NwYXJzZShWTEMgKnZsYywgaW50IG5iX2JpdHMsIGludCBuYl9jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYml0cywgaW50IGJpdHNfd3JhcCwgaW50IGJpdHNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29kZXMsIGludCBjb2Rlc193cmFwLCBpbnQgY29kZXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3ltYm9scywgaW50IHN5bWJvbHNfd3JhcCwgaW50IHN5bWJvbHNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKK3ZvaWQgZmZfZnJlZV92bGMoVkxDICp2bGMpOworCisjZGVmaW5lIElOSVRfVkxDX0xFICAgICAgICAgICAgIDIKKyNkZWZpbmUgSU5JVF9WTENfVVNFX05FV19TVEFUSUMgNAorCisjZGVmaW5lIElOSVRfVkxDX1NUQVRJQyh2bGMsIGJpdHMsIGEsIGIsIGMsIGQsIGUsIGYsIGcsIHN0YXRpY19zaXplKSAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyBWTENfVFlQRSB0YWJsZVtzdGF0aWNfc2l6ZV1bMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh2bGMpLT50YWJsZSAgICAgICAgICAgPSB0YWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh2bGMpLT50YWJsZV9hbGxvY2F0ZWQgPSBzdGF0aWNfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGluaXRfdmxjKHZsYywgYml0cywgYSwgYiwgYywgZCwgZSwgZiwgZywgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBJZiB0aGUgdmxjIGNvZGUgaXMgaW52YWxpZCBhbmQgbWF4X2RlcHRoPTEsIHRoZW4gbm8gYml0cyB3aWxsIGJlIHJlbW92ZWQuCisgKiBJZiB0aGUgdmxjIGNvZGUgaXMgaW52YWxpZCBhbmQgbWF4X2RlcHRoPjEsIHRoZW4gdGhlIG51bWJlciBvZiBiaXRzIHJlbW92ZWQKKyAqIGlzIHVuZGVmaW5lZC4KKyAqLworI2RlZmluZSBHRVRfVkxDKGNvZGUsIG5hbWUsIGdiLCB0YWJsZSwgYml0cywgbWF4X2RlcHRoKSAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBuLCBuYl9iaXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGluZGV4ID0gU0hPV19VQklUUyhuYW1lLCBnYiwgYml0cyk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb2RlICA9IHRhYmxlW2luZGV4XVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbiAgICAgPSB0YWJsZVtpbmRleF1bMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobWF4X2RlcHRoID4gMSAmJiBuIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKG5hbWUsIGdiLCBiaXRzKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBVUERBVEVfQ0FDSEUobmFtZSwgZ2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5iX2JpdHMgPSAtbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW5kZXggPSBTSE9XX1VCSVRTKG5hbWUsIGdiLCBuYl9iaXRzKSArIGNvZGU7ICAgICAgIFwKKyAgICAgICAgICAgIGNvZGUgID0gdGFibGVbaW5kZXhdWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuICAgICA9IHRhYmxlW2luZGV4XVsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG1heF9kZXB0aCA+IDIgJiYgbiA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhuYW1lLCBnYiwgbmJfYml0cyk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKG5hbWUsIGdiKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBuYl9iaXRzID0gLW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGluZGV4ID0gU0hPV19VQklUUyhuYW1lLCBnYiwgbmJfYml0cykgKyBjb2RlOyAgIFwKKyAgICAgICAgICAgICAgICBjb2RlICA9IHRhYmxlW2luZGV4XVswXTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbiAgICAgPSB0YWJsZVtpbmRleF1bMV07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNLSVBfQklUUyhuYW1lLCBnYiwgbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VUX1JMX1ZMQ19JTlRFUk5BTChsZXZlbCwgcnVuLCBuYW1lLCBnYiwgdGFibGUsIGJpdHMsICBcCisgICAgICAgICAgICAgICAgICAgbWF4X2RlcHRoLCBuZWVkX3VwZGF0ZSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IG4sIG5iX2JpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGludCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW5kZXggPSBTSE9XX1VCSVRTKG5hbWUsIGdiLCBiaXRzKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxldmVsID0gdGFibGVbaW5kZXhdLmxldmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuICAgICA9IHRhYmxlW2luZGV4XS5sZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChtYXhfZGVwdGggPiAxICYmIG4gPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgU0tJUF9CSVRTKG5hbWUsIGdiLCBiaXRzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChuZWVkX3VwZGF0ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKG5hbWUsIGdiKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuYl9iaXRzID0gLW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGluZGV4ID0gU0hPV19VQklUUyhuYW1lLCBnYiwgbmJfYml0cykgKyBsZXZlbDsgICAgICBcCisgICAgICAgICAgICBsZXZlbCA9IHRhYmxlW2luZGV4XS5sZXZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbiAgICAgPSB0YWJsZVtpbmRleF0ubGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJ1biA9IHRhYmxlW2luZGV4XS5ydW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTS0lQX0JJVFMobmFtZSwgZ2IsIG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisvKioKKyAqIFBhcnNlIGEgdmxjIGNvZGUuCisgKiBAcGFyYW0gYml0cyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgd2hpY2ggd2lsbCBiZSByZWFkIGF0IG9uY2UsIG11c3QgYmUKKyAqICAgICAgICAgICAgIGlkZW50aWNhbCB0byBuYl9iaXRzIGluIGluaXRfdmxjKCkKKyAqIEBwYXJhbSBtYXhfZGVwdGggaXMgdGhlIG51bWJlciBvZiB0aW1lcyBiaXRzIGJpdHMgbXVzdCBiZSByZWFkIHRvIGNvbXBsZXRlbHkKKyAqICAgICAgICAgICAgICAgICAgcmVhZCB0aGUgbG9uZ2VzdCB2bGMgY29kZQorICogICAgICAgICAgICAgICAgICA9IChtYXhfdmxjX2xlbmd0aCArIGJpdHMgLSAxKSAvIGJpdHMKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF92bGMyKEdldEJpdENvbnRleHQgKnMsIFZMQ19UWVBFICgqdGFibGUpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLCBpbnQgbWF4X2RlcHRoKQoreworICAgIGludCBjb2RlOworCisgICAgT1BFTl9SRUFERVIocmUsIHMpOworICAgIFVQREFURV9DQUNIRShyZSwgcyk7CisKKyAgICBHRVRfVkxDKGNvZGUsIHJlLCBzLCB0YWJsZSwgYml0cywgbWF4X2RlcHRoKTsKKworICAgIENMT1NFX1JFQURFUihyZSwgcyk7CisKKyAgICByZXR1cm4gY29kZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlMDEyKEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBuOworICAgIG4gPSBnZXRfYml0czEoZ2IpOworICAgIGlmIChuID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGdldF9iaXRzMShnYikgKyAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGUyMTAoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaWYgKGdldF9iaXRzMShnYikpCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDIgLSBnZXRfYml0czEoZ2IpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfYml0c19sZWZ0KEdldEJpdENvbnRleHQgKmdiKQoreworICAgIHJldHVybiBnYi0+c2l6ZV9pbl9iaXRzIC0gZ2V0X2JpdHNfY291bnQoZ2IpOworfQorCitzdGF0aWMgaW5saW5lIGludCBza2lwXzFzdG9wXzhkYXRhX2JpdHMoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgd2hpbGUgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgc2tpcF9iaXRzKGdiLCA4KTsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDw9IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLy8jZGVmaW5lIFRSQUNFCisKKyNpZmRlZiBUUkFDRQorc3RhdGljIGlubGluZSB2b2lkIHByaW50X2JpbihpbnQgYml0cywgaW50IG4pCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIlZCIsIChiaXRzID4+IGkpICYgMSk7CisgICAgZm9yIChpID0gbjsgaSA8IDI0OyBpKyspCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIgIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9iaXRzX3RyYWNlKEdldEJpdENvbnRleHQgKnMsIGludCBuLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCit7CisgICAgaW50IHIgPSBnZXRfYml0cyhzLCBuKTsKKworICAgIHByaW50X2JpbihyLCBuKTsKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiJTVkICUyZCAlM2QgYml0IEAlNWQgaW4gJXMgJXM6JWRcbiIsCisgICAgICAgICAgIHIsIG4sIHIsIGdldF9iaXRzX2NvdW50KHMpIC0gbiwgZmlsZSwgZnVuYywgbGluZSk7CisKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3ZsY190cmFjZShHZXRCaXRDb250ZXh0ICpzLCBWTENfVFlQRSAoKnRhYmxlKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMsIGludCBtYXhfZGVwdGgsIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQoreworICAgIGludCBzaG93ICA9IHNob3dfYml0cyhzLCAyNCk7CisgICAgaW50IHBvcyAgID0gZ2V0X2JpdHNfY291bnQocyk7CisgICAgaW50IHIgICAgID0gZ2V0X3ZsYzIocywgdGFibGUsIGJpdHMsIG1heF9kZXB0aCk7CisgICAgaW50IGxlbiAgID0gZ2V0X2JpdHNfY291bnQocykgLSBwb3M7CisgICAgaW50IGJpdHMyID0gc2hvdyA+PiAoMjQgLSBsZW4pOworCisgICAgcHJpbnRfYmluKGJpdHMyLCBsZW4pOworCisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiU1ZCAlMmQgJTNkIHZsYyBAJTVkIGluICVzICVzOiVkXG4iLAorICAgICAgICAgICBiaXRzMiwgbGVuLCByLCBwb3MsIGZpbGUsIGZ1bmMsIGxpbmUpOworCisgICAgcmV0dXJuIHI7Cit9CisKKyNkZWZpbmUgR0VUX1JMX1ZMQyhsZXZlbCwgcnVuLCBuYW1lLCBnYiwgdGFibGUsIGJpdHMsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgbWF4X2RlcHRoLCBuZWVkX3VwZGF0ZSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHNob3cgID0gU0hPV19VQklUUyhuYW1lLCBnYiwgMjQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgcG9zID0gbmFtZSAjIyBfaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVF9STF9WTENfSU5URVJOQUwobGV2ZWwsIHJ1biwgbmFtZSwgZ2IsIHRhYmxlLCBiaXRzLG1heF9kZXB0aCwgbmVlZF91cGRhdGUpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsZW4gPSBuYW1lICMjIF9pbmRleCAtIHBvcyArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2hvdyA9IHNob3cgPj4gKDI0IC0gbGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludF9iaW4oc2hvdywgbGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIlNWQgJTJkICUzZC8lLTNkIHJsdiBAJTVkIGluICVzICVzOiVkXG4iLFwKKyAgICAgICAgICAgICAgIHNob3csIGxlbiwgcnVuLTEsIGxldmVsLCBwb3MsIF9fRklMRV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXyk7XAorICAgIH0gd2hpbGUgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworCitzdGF0aWMgaW5saW5lIGludCBnZXRfeGJpdHNfdHJhY2UoR2V0Qml0Q29udGV4dCAqcywgaW50IG4sIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCit7CisgICAgaW50IHNob3cgPSBzaG93X2JpdHMocywgbik7CisgICAgaW50IHIgICAgPSBnZXRfeGJpdHMocywgbik7CisKKyAgICBwcmludF9iaW4oc2hvdywgbik7CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiU1ZCAlMmQgJTNkIHhidCBAJTVkIGluICVzICVzOiVkXG4iLAorICAgICAgICAgICBzaG93LCBuLCByLCBnZXRfYml0c19jb3VudChzKSAtIG4sIGZpbGUsIGZ1bmMsIGxpbmUpOworCisgICAgcmV0dXJuIHI7Cit9CisKKyNkZWZpbmUgZ2V0X2JpdHMocywgbikgIGdldF9iaXRzX3RyYWNlKHMgLCBuLCBfX0ZJTEVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18pCisjZGVmaW5lIGdldF9iaXRzMShzKSAgICBnZXRfYml0c190cmFjZShzLCAgMSwgX19GSUxFX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fKQorI2RlZmluZSBnZXRfeGJpdHMocywgbikgZ2V0X3hiaXRzX3RyYWNlKHMsIG4sIF9fRklMRV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXykKKworI2RlZmluZSBnZXRfdmxjKHMsIHZsYykgICAgICAgICAgICAgZ2V0X3ZsY190cmFjZShzLCAodmxjKS0+dGFibGUsICh2bGMpLT5iaXRzLCAgIDMsIF9fRklMRV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNkZWZpbmUgZ2V0X3ZsYzIocywgdGFiLCBiaXRzLCBtYXgpIGdldF92bGNfdHJhY2UocywgICAgICAgICAgdGFiLCAgICAgICAgYml0cywgbWF4LCBfX0ZJTEVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18pCisKKyNkZWZpbmUgdHByaW50ZihwLCAuLi4pIGF2X2xvZyhwLCBBVl9MT0dfREVCVUcsIF9fVkFfQVJHU19fKQorCisjZWxzZSAvL1RSQUNFCisjZGVmaW5lIHRwcmludGYocCwgLi4uKSB7IH0KKyNkZWZpbmUgR0VUX1JMX1ZMQyBHRVRfUkxfVkxDX0lOVEVSTkFMCisjZW5kaWYKKworI2VuZGlmIC8qIEFWQ09ERUNfR0VUX0JJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZ2lmLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9naWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QwNTRlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZ2lmLmMKQEAgLTAsMCArMSwzMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRnJhbmNvaXMgUmV2b2wKKyAqIENvcHlyaWdodCAoYykgMjAwNiBCYXB0aXN0ZSBDb3VkdXJpZXIKKyAqCisgKiBmaXJzdCB2ZXJzaW9uIGJ5IEZyYW5jb2lzIFJldm9sIDxyZXZvbEBmcmVlLmZyPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBHSUYgZW5jb2RlcgorICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9HSUYvc3BlYy1naWY4OWEudHh0CisgKi8KKworI2RlZmluZSBCSVRTVFJFQU1fV1JJVEVSX0xFCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsencuaCIKKyNpbmNsdWRlICJnaWYuaCIKKworI2luY2x1ZGUgInB1dF9iaXRzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBMWldTdGF0ZSAqbHp3OworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICBBVkZyYW1lICpsYXN0X2ZyYW1lOworICAgIGludCBmbGFnczsKKyAgICB1aW50MzJfdCBwYWxldHRlW0FWUEFMRVRURV9DT1VOVF07ICAvLy88IGxvY2FsIHJlZmVyZW5jZSBwYWxldHRlIGZvciAhcGFsOAorICAgIHVpbnQ4X3QgKnRtcGw7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdGVtcG9yYXJ5IGxpbmUgYnVmZmVyCit9IEdJRkNvbnRleHQ7CisKK2VudW0geworICAgIEdGX09GRlNFVFRJTkcgPSAxPDwwLAorICAgIEdGX1RSQU5TRElGRiAgPSAxPDwxLAorfTsKKworc3RhdGljIGludCBwaWNrX3BhbGV0dGVfZW50cnkoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGluZXNpemUsIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgaGlzdG9ncmFtW0FWUEFMRVRURV9DT1VOVF0gPSB7MH07CisgICAgaW50IHgsIHksIGk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICBoaXN0b2dyYW1bYnVmW3hdXSsrOworICAgICAgICBidWYgKz0gbGluZXNpemU7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhoaXN0b2dyYW0pOyBpKyspCisgICAgICAgIGlmICghaGlzdG9ncmFtW2ldKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGdpZl9pbWFnZV93cml0ZV9pbWFnZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqYnl0ZXN0cmVhbSwgdWludDhfdCAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKnBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGNvbnN0IGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgR0lGQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGxlbiA9IDAsIGhlaWdodCA9IGF2Y3R4LT5oZWlnaHQsIHdpZHRoID0gYXZjdHgtPndpZHRoLCB4LCB5OworICAgIGludCB4X3N0YXJ0ID0gMCwgeV9zdGFydCA9IDAsIHRyYW5zID0gLTE7CisgICAgY29uc3QgdWludDhfdCAqcHRyOworCisgICAgLyogQ3JvcCBpbWFnZSAqLworICAgIC8vIFRPRE8gc3VwcG9ydCB3aXRoIHBhbGV0dGUgY2hhbmdlCisgICAgaWYgKChzLT5mbGFncyAmIEdGX09GRlNFVFRJTkcpICYmIHMtPmxhc3RfZnJhbWUgJiYgIXBhbGV0dGUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcmVmID0gcy0+bGFzdF9mcmFtZS0+ZGF0YVswXTsKKyAgICAgICAgY29uc3QgaW50IHJlZl9saW5lc2l6ZSA9IHMtPmxhc3RfZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBpbnQgeF9lbmQgPSBhdmN0eC0+d2lkdGggIC0gMSwKKyAgICAgICAgICAgIHlfZW5kID0gYXZjdHgtPmhlaWdodCAtIDE7CisKKyAgICAgICAgLyogc2tpcCBjb21tb24gbGluZXMgKi8KKyAgICAgICAgd2hpbGUgKHlfc3RhcnQgPCB5X2VuZCkgeworICAgICAgICAgICAgaWYgKG1lbWNtcChyZWYgKyB5X3N0YXJ0KnJlZl9saW5lc2l6ZSwgYnVmICsgeV9zdGFydCpsaW5lc2l6ZSwgd2lkdGgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgeV9zdGFydCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlICh5X2VuZCA+IHlfc3RhcnQpIHsKKyAgICAgICAgICAgIGlmIChtZW1jbXAocmVmICsgeV9lbmQqcmVmX2xpbmVzaXplLCBidWYgKyB5X2VuZCpsaW5lc2l6ZSwgd2lkdGgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgeV9lbmQtLTsKKyAgICAgICAgfQorICAgICAgICBoZWlnaHQgPSB5X2VuZCArIDEgLSB5X3N0YXJ0OworCisgICAgICAgIC8qIHNraXAgY29tbW9uIGNvbHVtbnMgKi8KKyAgICAgICAgd2hpbGUgKHhfc3RhcnQgPCB4X2VuZCkgeworICAgICAgICAgICAgaW50IHNhbWVfY29sdW1uID0gMTsKKyAgICAgICAgICAgIGZvciAoeSA9IHlfc3RhcnQ7IHkgPCB5X2VuZDsgeSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlZlt5KnJlZl9saW5lc2l6ZSArIHhfc3RhcnRdICE9IGJ1Zlt5KmxpbmVzaXplICsgeF9zdGFydF0pIHsKKyAgICAgICAgICAgICAgICAgICAgc2FtZV9jb2x1bW4gPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNhbWVfY29sdW1uKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgeF9zdGFydCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlICh4X2VuZCA+IHhfc3RhcnQpIHsKKyAgICAgICAgICAgIGludCBzYW1lX2NvbHVtbiA9IDE7CisgICAgICAgICAgICBmb3IgKHkgPSB5X3N0YXJ0OyB5IDwgeV9lbmQ7IHkrKykgeworICAgICAgICAgICAgICAgIGlmIChyZWZbeSpyZWZfbGluZXNpemUgKyB4X2VuZF0gIT0gYnVmW3kqbGluZXNpemUgKyB4X2VuZF0pIHsKKyAgICAgICAgICAgICAgICAgICAgc2FtZV9jb2x1bW4gPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNhbWVfY29sdW1uKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgeF9lbmQtLTsKKyAgICAgICAgfQorICAgICAgICB3aWR0aCA9IHhfZW5kICsgMSAtIHhfc3RhcnQ7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsIiVkeCVkIGltYWdlIGF0IHBvcyAoJWQ7JWQpIFthcmVhOiVkeCVkXVxuIiwKKyAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHhfc3RhcnQsIHlfc3RhcnQsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgfQorCisgICAgLyogaW1hZ2UgYmxvY2sgKi8KKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKGJ5dGVzdHJlYW0sIEdJRl9JTUFHRV9TRVBBUkFUT1IpOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoYnl0ZXN0cmVhbSwgeF9zdGFydCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNihieXRlc3RyZWFtLCB5X3N0YXJ0KTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KGJ5dGVzdHJlYW0sIHdpZHRoKTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KGJ5dGVzdHJlYW0sIGhlaWdodCk7CisKKyAgICBpZiAoIXBhbGV0dGUpIHsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZShieXRlc3RyZWFtLCAweDAwKTsgLyogZmxhZ3MgKi8KKyAgICB9IGVsc2UgeworICAgICAgICB1bnNpZ25lZCBpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKGJ5dGVzdHJlYW0sIDE8PDcgfCAweDcpOyAvKiBmbGFncyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVZQQUxFVFRFX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHYgPSBwYWxldHRlW2ldOworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUyNChieXRlc3RyZWFtLCB2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRPRE86IHN1cHBvcnQgd2l0aCBwYWxldHRlIGNoYW5nZSAocGFsOCkgKi8KKyAgICBpZiAoKHMtPmZsYWdzICYgR0ZfVFJBTlNESUZGKSAmJiBzLT5sYXN0X2ZyYW1lICYmICFwYWxldHRlKSB7CisgICAgICAgIHRyYW5zID0gcGlja19wYWxldHRlX2VudHJ5KGJ1ZiArIHlfc3RhcnQqbGluZXNpemUgKyB4X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmICh0cmFucyA8IDApIHsgLy8gVE9ETywgcGF0Y2ggd2VsY29tZQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJObyBhdmFpbGFibGUgY29sb3IsIGNhbiBub3QgdXNlIHRyYW5zcGFyZW5jeVxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50OF90ICpwYWxfZXhkYXRhID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgICAgICBpZiAoIXBhbF9leGRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG1lbWNweShwYWxfZXhkYXRhLCBzLT5wYWxldHRlLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgICAgICBwYWxfZXhkYXRhW3RyYW5zKjQgKyAzKiFIQVZFX0JJR0VORElBTl0gPSAweDAwOworICAgICAgICB9CisgICAgfQorCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZShieXRlc3RyZWFtLCAweDA4KTsKKworICAgIGZmX2x6d19lbmNvZGVfaW5pdChzLT5sencsIHMtPmJ1ZiwgMiAqIHdpZHRoICogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAxMiwgRkZfTFpXX0dJRiwgcHV0X2JpdHMpOworCisgICAgcHRyID0gYnVmICsgeV9zdGFydCpsaW5lc2l6ZSArIHhfc3RhcnQ7CisgICAgaWYgKHRyYW5zID49IDApIHsKKyAgICAgICAgY29uc3QgaW50IHJlZl9saW5lc2l6ZSA9IHMtPmxhc3RfZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBjb25zdCB1aW50OF90ICpyZWYgPSBzLT5sYXN0X2ZyYW1lLT5kYXRhWzBdICsgeV9zdGFydCpyZWZfbGluZXNpemUgKyB4X3N0YXJ0OworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgbWVtY3B5KHMtPnRtcGwsIHB0ciwgd2lkdGgpOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICAgICAgaWYgKHJlZlt4XSA9PSBwdHJbeF0pCisgICAgICAgICAgICAgICAgICAgIHMtPnRtcGxbeF0gPSB0cmFuczsKKyAgICAgICAgICAgIGxlbiArPSBmZl9sendfZW5jb2RlKHMtPmx6dywgcy0+dG1wbCwgd2lkdGgpOworICAgICAgICAgICAgcHRyICs9IGxpbmVzaXplOworICAgICAgICAgICAgcmVmICs9IHJlZl9saW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgbGVuICs9IGZmX2x6d19lbmNvZGUocy0+bHp3LCBwdHIsIHdpZHRoKTsKKyAgICAgICAgICAgIHB0ciArPSBsaW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBsZW4gKz0gZmZfbHp3X2VuY29kZV9mbHVzaChzLT5sencsIGZsdXNoX3B1dF9iaXRzKTsKKworICAgIHB0ciA9IHMtPmJ1ZjsKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBpbnQgc2l6ZSA9IEZGTUlOKDI1NSwgbGVuKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZShieXRlc3RyZWFtLCBzaXplKTsKKyAgICAgICAgaWYgKGVuZCAtICpieXRlc3RyZWFtIDwgc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKGJ5dGVzdHJlYW0sIHB0ciwgc2l6ZSk7CisgICAgICAgIHB0ciArPSBzaXplOworICAgICAgICBsZW4gLT0gc2l6ZTsKKyAgICB9CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZShieXRlc3RyZWFtLCAweDAwKTsgLyogZW5kIG9mIGltYWdlIGJsb2NrICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBnaWZfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEdJRkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGF2Y3R4LT53aWR0aCA+IDY1NTM1IHx8IGF2Y3R4LT5oZWlnaHQgPiA2NTUzNSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkdJRiBkb2VzIG5vdCBzdXBwb3J0IHJlc29sdXRpb25zIGFib3ZlIDY1NTM1eDY1NTM1XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDE7CisKKyAgICBzLT5sencgPSBhdl9tYWxsb2N6KGZmX2x6d19lbmNvZGVfc3RhdGVfc2l6ZSk7CisgICAgcy0+YnVmID0gYXZfbWFsbG9jKGF2Y3R4LT53aWR0aCphdmN0eC0+aGVpZ2h0KjIpOworICAgIHMtPnRtcGwgPSBhdl9tYWxsb2MoYXZjdHgtPndpZHRoKTsKKyAgICBpZiAoIXMtPnRtcGwgfHwgIXMtPmJ1ZiB8fCAhcy0+bHp3KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKGF2cHJpdl9zZXRfc3lzdGVtYXRpY19wYWwyKHMtPnBhbGV0dGUsIGF2Y3R4LT5waXhfZm10KSA8IDApCisgICAgICAgIGF2X2Fzc2VydDAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpZl9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpY3QsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBHSUZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpvdXRidWZfcHRyLCAqZW5kOworICAgIGNvbnN0IHVpbnQzMl90ICpwYWxldHRlID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIGF2Y3R4LT53aWR0aCphdmN0eC0+aGVpZ2h0KjcvNSArIEZGX01JTl9CVUZGRVJfU0laRSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBvdXRidWZfcHRyID0gcGt0LT5kYXRhOworICAgIGVuZCAgICAgICAgPSBwa3QtPmRhdGEgKyBwa3QtPnNpemU7CisKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7CisgICAgICAgIHVpbnQ4X3QgKnBhbF9leGRhdGEgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgaWYgKCFwYWxfZXhkYXRhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KHBhbF9leGRhdGEsIHBpY3QtPmRhdGFbMV0sIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgcGFsZXR0ZSA9ICh1aW50MzJfdCopcGljdC0+ZGF0YVsxXTsKKyAgICB9CisKKyAgICBnaWZfaW1hZ2Vfd3JpdGVfaW1hZ2UoYXZjdHgsICZvdXRidWZfcHRyLCBlbmQsIHBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmRhdGFbMF0sIHBpY3QtPmxpbmVzaXplWzBdLCBwa3QpOworICAgIGlmICghcy0+bGFzdF9mcmFtZSkgeworICAgICAgICBzLT5sYXN0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFzLT5sYXN0X2ZyYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfdW5yZWYocy0+bGFzdF9mcmFtZSk7CisgICAgcmV0ID0gYXZfZnJhbWVfcmVmKHMtPmxhc3RfZnJhbWUsIChBVkZyYW1lKilwaWN0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBrdC0+c2l6ZSAgID0gb3V0YnVmX3B0ciAtIHBrdC0+ZGF0YTsKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaWZfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBHSUZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisKKyAgICBhdl9mcmVlcCgmcy0+bHp3KTsKKyAgICBhdl9mcmVlcCgmcy0+YnVmKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5sYXN0X2ZyYW1lKTsKKyAgICBhdl9mcmVlcCgmcy0+dG1wbCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEdJRkNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBnaWZfb3B0aW9uc1tdID0geworICAgIHsgImdpZmZsYWdzIiwgInNldCBHSUYgZmxhZ3MiLCBPRkZTRVQoZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSBHRl9PRkZTRVRUSU5HfEdGX1RSQU5TRElGRn0sIDAsIElOVF9NQVgsIEZMQUdTLCAiZmxhZ3MiIH0sCisgICAgICAgIHsgIm9mZnNldHRpbmciLCAiZW5hYmxlIHBpY3R1cmUgb2Zmc2V0dGluZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1HRl9PRkZTRVRUSU5HfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJmbGFncyIgfSwKKyAgICAgICAgeyAidHJhbnNkaWZmIiwgImVuYWJsZSB0cmFuc3BhcmVuY3kgZGV0ZWN0aW9uIGJldHdlZW4gZnJhbWVzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUdGX1RSQU5TRElGRn0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiZmxhZ3MiIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGdpZl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJHSUYgZW5jb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGdpZl9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9naWZfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZ2lmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR0lGIChHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0dJRiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoR0lGQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZ2lmX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGdpZl9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZ2lmX2VuY29kZV9jbG9zZSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peworICAgICAgICBBVl9QSVhfRk1UX1JHQjgsIEFWX1BJWF9GTVRfQkdSOCwgQVZfUElYX0ZNVF9SR0I0X0JZVEUsIEFWX1BJWF9GTVRfQkdSNF9CWVRFLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX1BBTDgsIEFWX1BJWF9GTVRfTk9ORQorICAgIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJmdpZl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9naWYuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2dpZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Y2Y2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9naWYuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogR0lGIGZvcm1hdCBkZWZpbml0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA2IEJhcHRpc3RlIENvdWR1cmllcgorICogQ29weXJpZ2h0IChjKSAyMDEyIFZpdGFsaXkgRSBTdWdyb2JvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBHSUYgZm9ybWF0IGRlZmluaXRpb25zLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19HSUZERUZTX0gKKyNkZWZpbmUgQVZDT0RFQ19HSUZERUZTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdGF0aWMgY29uc3QgdWludDhfdCBnaWY4N2Ffc2lnWzZdID0gIkdJRjg3YSI7CitzdGF0aWMgY29uc3QgdWludDhfdCBnaWY4OWFfc2lnWzZdID0gIkdJRjg5YSI7CisKKyNkZWZpbmUgR0NFX0RJU1BPU0FMX05PTkUgICAgICAgMAorI2RlZmluZSBHQ0VfRElTUE9TQUxfSU5QTEFDRSAgICAxCisjZGVmaW5lIEdDRV9ESVNQT1NBTF9CQUNLR1JPVU5EIDIKKyNkZWZpbmUgR0NFX0RJU1BPU0FMX1JFU1RPUkUgICAgMworCisjZGVmaW5lIEdJRl9UUkFJTEVSICAgICAgICAgICAgICAgICAweDNiCisjZGVmaW5lIEdJRl9FWFRFTlNJT05fSU5UUk9EVUNFUiAgICAweDIxCisjZGVmaW5lIEdJRl9JTUFHRV9TRVBBUkFUT1IgICAgICAgICAweDJjCisjZGVmaW5lIEdJRl9HQ0VfRVhUX0xBQkVMICAgICAgICAgICAweGY5CisjZGVmaW5lIEdJRl9BUFBfRVhUX0xBQkVMICAgICAgICAgICAweGZmCisjZGVmaW5lIE5FVFNDQVBFX0VYVF9TVFIgICAgICAgICAgICAiTkVUU0NBUEUyLjAiCisKKyNlbmRpZiAvKiBBVkNPREVDX0dJRkRFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZ2lmZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9naWZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGRlMzhiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZ2lmZGVjLmMKQEAgLTAsMCArMSw1NTggQEAKKy8qCisgKiBHSUYgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA2IEJhcHRpc3RlIENvdWR1cmllcgorICogQ29weXJpZ2h0IChjKSAyMDEyIFZpdGFsaXkgRSBTdWdyb2JvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsencuaCIKKyNpbmNsdWRlICJnaWYuaCIKKworLyogVGhpcyB2YWx1ZSBpcyBpbnRlbnRpb25hbGx5IHNldCB0byAidHJhbnNwYXJlbnQgd2hpdGUiIGNvbG9yLgorICogSXQgaXMgbXVjaCBiZXR0ZXIgdG8gaGF2ZSB3aGl0ZSBiYWNrZ3JvdW5kIGluc3RlYWQgb2YgYmxhY2sKKyAqIHdoZW4gZ2lmIGltYWdlIGNvbnZlcnRlZCB0byBmb3JtYXQgd2hpY2ggbm90IHN1cHBvcnQgdHJhbnNwYXJlbmN5LgorICovCisjZGVmaW5lIEdJRl9UUkFOU1BBUkVOVF9DT0xPUiAgICAweDAwZmZmZmZmCisKK3R5cGVkZWYgc3RydWN0IEdpZlN0YXRlIHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBpbnQgc2NyZWVuX3dpZHRoOworICAgIGludCBzY3JlZW5faGVpZ2h0OworICAgIGludCBoYXNfZ2xvYmFsX3BhbGV0dGU7CisgICAgaW50IGJpdHNfcGVyX3BpeGVsOworICAgIHVpbnQzMl90IGJnX2NvbG9yOworICAgIGludCBiYWNrZ3JvdW5kX2NvbG9yX2luZGV4OworICAgIGludCB0cmFuc3BhcmVudF9jb2xvcl9pbmRleDsKKyAgICBpbnQgY29sb3JfcmVzb2x1dGlvbjsKKyAgICAvKiBpbnRlcm1lZGlhdGUgYnVmZmVyIGZvciBzdG9yaW5nIGNvbG9yIGluZGljZXMKKyAgICAgKiBvYnRhaW5lZCBmcm9tIGx6dy1lbmNvZGVkIGRhdGEgc3RyZWFtICovCisgICAgdWludDhfdCAqaWR4X2xpbmU7CisgICAgaW50IGlkeF9saW5lX3NpemU7CisKKyAgICAvKiBhZnRlciB0aGUgZnJhbWUgaXMgZGlzcGxheWVkLCB0aGUgZGlzcG9zYWwgbWV0aG9kIGlzIHVzZWQgKi8KKyAgICBpbnQgZ2NlX3ByZXZfZGlzcG9zYWw7CisgICAgaW50IGdjZV9kaXNwb3NhbDsKKyAgICAvKiByZWN0YW5nbGUgZGVzY3JpYmluZyBhcmVhIHRoYXQgbXVzdCBiZSBkaXNwb3NlZCAqLworICAgIGludCBnY2VfbCwgZ2NlX3QsIGdjZV93LCBnY2VfaDsKKyAgICAvKiBkZXBlbmRpbmcgb24gZGlzcG9zYWwgbWV0aG9kIHdlIHN0b3JlIGVpdGhlciBwYXJ0IG9mIHRoZSBpbWFnZQorICAgICAqIGRyYXduIG9uIHRoZSBjYW52YXMgb3IgYmFja2dyb3VuZCBjb2xvciB0aGF0CisgICAgICogc2hvdWxkIGJlIHVzZWQgdXBvbiBkaXNwb3NhbCAqLworICAgIHVpbnQzMl90ICogc3RvcmVkX2ltZzsKKyAgICBpbnQgc3RvcmVkX2ltZ19zaXplOworICAgIGludCBzdG9yZWRfYmdfY29sb3I7CisKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBMWldTdGF0ZSAqbHp3OworCisgICAgLyogYXV4IGJ1ZmZlcnMgKi8KKyAgICB1aW50MzJfdCBnbG9iYWxfcGFsZXR0ZVsyNTZdOworICAgIHVpbnQzMl90IGxvY2FsX3BhbGV0dGVbMjU2XTsKKworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBpbnQga2V5ZnJhbWU7CisgICAgaW50IGtleWZyYW1lX29rOworICAgIGludCB0cmFuc19jb2xvcjsgICAgLyoqPCBjb2xvciB2YWx1ZSB0aGF0IGlzIHVzZWQgaW5zdGVhZCBvZiB0cmFuc3BhcmVudCBjb2xvciAqLworfSBHaWZTdGF0ZTsKKworc3RhdGljIHZvaWQgZ2lmX3JlYWRfcGFsZXR0ZShHaWZTdGF0ZSAqcywgdWludDMyX3QgKnBhbCwgaW50IG5iKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iOyBpKyssIHBhbCsrKQorICAgICAgICAqcGFsID0gKDB4ZmZ1IDw8IDI0KSB8IGJ5dGVzdHJlYW0yX2dldF9iZTI0dSgmcy0+Z2IpOworfQorCitzdGF0aWMgdm9pZCBnaWZfZmlsbChBVkZyYW1lICpwaWN0dXJlLCB1aW50MzJfdCBjb2xvcikKK3sKKyAgICB1aW50MzJfdCAqcCA9ICh1aW50MzJfdCAqKXBpY3R1cmUtPmRhdGFbMF07CisgICAgdWludDMyX3QgKnBfZW5kID0gcCArIChwaWN0dXJlLT5saW5lc2l6ZVswXSAvIHNpemVvZih1aW50MzJfdCkpICogcGljdHVyZS0+aGVpZ2h0OworCisgICAgZm9yICg7IHAgPCBwX2VuZDsgcCsrKQorICAgICAgICAqcCA9IGNvbG9yOworfQorCitzdGF0aWMgdm9pZCBnaWZfZmlsbF9yZWN0KEFWRnJhbWUgKnBpY3R1cmUsIHVpbnQzMl90IGNvbG9yLCBpbnQgbCwgaW50IHQsIGludCB3LCBpbnQgaCkKK3sKKyAgICBjb25zdCBpbnQgbGluZXNpemUgPSBwaWN0dXJlLT5saW5lc2l6ZVswXSAvIHNpemVvZih1aW50MzJfdCk7CisgICAgY29uc3QgdWludDMyX3QgKnB5ID0gKHVpbnQzMl90ICopcGljdHVyZS0+ZGF0YVswXSArIHQgKiBsaW5lc2l6ZTsKKyAgICBjb25zdCB1aW50MzJfdCAqcHIsICpwYiA9IHB5ICsgaCAqIGxpbmVzaXplOworICAgIHVpbnQzMl90ICpweDsKKworICAgIGZvciAoOyBweSA8IHBiOyBweSArPSBsaW5lc2l6ZSkgeworICAgICAgICBweCA9ICh1aW50MzJfdCAqKXB5ICsgbDsKKyAgICAgICAgcHIgPSBweCArIHc7CisKKyAgICAgICAgZm9yICg7IHB4IDwgcHI7IHB4KyspCisgICAgICAgICAgICAqcHggPSBjb2xvcjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdpZl9jb3B5X2ltZ19yZWN0KGNvbnN0IHVpbnQzMl90ICpzcmMsIHVpbnQzMl90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZXNpemUsIGludCBsLCBpbnQgdCwgaW50IHcsIGludCBoKQoreworICAgIGNvbnN0IGludCB5X3N0YXJ0ID0gdCAqIGxpbmVzaXplOworICAgIGNvbnN0IHVpbnQzMl90ICpzcmNfcHgsCisgICAgICAgICAgICAgICAgICAgKnNyY19weSA9IHNyYyArIHlfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgKmRzdF9weSA9IGRzdCArIHlfc3RhcnQ7CisgICAgY29uc3QgdWludDMyX3QgKnNyY19wYiA9IHNyY19weSArIGggKiBsaW5lc2l6ZTsKKyAgICB1aW50MzJfdCAqZHN0X3B4OworCisgICAgZm9yICg7IHNyY19weSA8IHNyY19wYjsgc3JjX3B5ICs9IGxpbmVzaXplLCBkc3RfcHkgKz0gbGluZXNpemUpIHsKKyAgICAgICAgc3JjX3B4ID0gc3JjX3B5ICsgbDsKKyAgICAgICAgZHN0X3B4ID0gKHVpbnQzMl90ICopZHN0X3B5ICsgbDsKKworICAgICAgICBtZW1jcHkoZHN0X3B4LCBzcmNfcHgsIHcgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2lmX3JlYWRfaW1hZ2UoR2lmU3RhdGUgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIGJpdHNfcGVyX3BpeGVsLCBjb2RlX3NpemUsIGZsYWdzLCBwdzsKKyAgICBpbnQgaXNfaW50ZXJsZWF2ZWQsIGhhc19sb2NhbF9wYWxldHRlLCB5LCBwYXNzLCB5MSwgbGluZXNpemUsIHBhbF9zaXplOworICAgIHVpbnQzMl90ICpwdHIsICpwYWwsICpweCwgKnByLCAqcHRyMTsKKyAgICBpbnQgcmV0OworICAgIHVpbnQ4X3QgKmlkeDsKKworICAgIC8qIEF0IGxlYXN0IDkgYnl0ZXMgb2YgSW1hZ2UgRGVzY3JpcHRvci4gKi8KKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IDkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgbGVmdCAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZzLT5nYik7CisgICAgdG9wICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZzLT5nYik7CisgICAgd2lkdGggID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZzLT5nYik7CisgICAgaGVpZ2h0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZzLT5nYik7CisgICAgZmxhZ3MgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nYik7CisgICAgaXNfaW50ZXJsZWF2ZWQgPSBmbGFncyAmIDB4NDA7CisgICAgaGFzX2xvY2FsX3BhbGV0dGUgPSBmbGFncyAmIDB4ODA7CisgICAgYml0c19wZXJfcGl4ZWwgPSAoZmxhZ3MgJiAweDA3KSArIDE7CisKKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiaW1hZ2UgeD0lZCB5PSVkIHc9JWQgaD0lZFxuIiwgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGlmIChoYXNfbG9jYWxfcGFsZXR0ZSkgeworICAgICAgICBwYWxfc2l6ZSA9IDEgPDwgYml0c19wZXJfcGl4ZWw7CisKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCBwYWxfc2l6ZSAqIDMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBnaWZfcmVhZF9wYWxldHRlKHMsIHMtPmxvY2FsX3BhbGV0dGUsIHBhbF9zaXplKTsKKyAgICAgICAgcGFsID0gcy0+bG9jYWxfcGFsZXR0ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXMtPmhhc19nbG9iYWxfcGFsZXR0ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJwaWN0dXJlIGRvZXNuJ3QgaGF2ZSBlaXRoZXIgZ2xvYmFsIG9yIGxvY2FsIHBhbGV0dGUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgcGFsID0gcy0+Z2xvYmFsX3BhbGV0dGU7CisgICAgfQorCisgICAgaWYgKHMtPmtleWZyYW1lKSB7CisgICAgICAgIGlmIChzLT50cmFuc3BhcmVudF9jb2xvcl9pbmRleCA9PSAtMSAmJiBzLT5oYXNfZ2xvYmFsX3BhbGV0dGUpIHsKKyAgICAgICAgICAgIC8qIHRyYW5zcGFyZW5jeSB3YXNuJ3Qgc2V0IGJlZm9yZSB0aGUgZmlyc3QgZnJhbWUsIGZpbGwgd2l0aCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgICAgICAgICBnaWZfZmlsbChmcmFtZSwgcy0+YmdfY29sb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogb3RoZXJ3aXNlIGZpbGwgd2l0aCB0cmFuc3BhcmVudCBjb2xvci4KKyAgICAgICAgICAgICAqIHRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGJ5IGRlZmF1bHQgcGljdHVyZSBmaWxsZWQgd2l0aCAweDgwODA4MDgwLiAqLworICAgICAgICAgICAgZ2lmX2ZpbGwoZnJhbWUsIHMtPnRyYW5zX2NvbG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHZlcmlmeSB0aGF0IGFsbCB0aGUgaW1hZ2UgaXMgaW5zaWRlIHRoZSBzY3JlZW4gZGltZW5zaW9ucyAqLworICAgIGlmICghd2lkdGggfHwgd2lkdGggPiBzLT5zY3JlZW5fd2lkdGggfHwgbGVmdCA+PSBzLT5zY3JlZW5fd2lkdGgpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGltYWdlIHdpZHRoLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoIWhlaWdodCB8fCBoZWlnaHQgPiBzLT5zY3JlZW5faGVpZ2h0IHx8IHRvcCA+PSBzLT5zY3JlZW5faGVpZ2h0KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBpbWFnZSBoZWlnaHQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChsZWZ0ICsgd2lkdGggPiBzLT5zY3JlZW5fd2lkdGgpIHsKKyAgICAgICAgLyogd2lkdGggbXVzdCBiZSBrZXB0IGFyb3VuZCB0byBhdm9pZCBsencgdnMgbGluZSBkZXN5bmMgKi8KKyAgICAgICAgcHcgPSBzLT5zY3JlZW5fd2lkdGggLSBsZWZ0OworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW1hZ2UgdG9vIHdpZGUgYnkgJWQsIHRydW5jYXRpbmcuXG4iLAorICAgICAgICAgICAgICAgbGVmdCArIHdpZHRoIC0gcy0+c2NyZWVuX3dpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdyA9IHdpZHRoOworICAgIH0KKyAgICBpZiAodG9wICsgaGVpZ2h0ID4gcy0+c2NyZWVuX2hlaWdodCkgeworICAgICAgICAvKiB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBleHRyYSBpbnZpc2libGUgbGluZXMgKi8KKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkltYWdlIHRvbyBoaWdoIGJ5ICVkLCB0cnVuY2F0aW5nLlxuIiwKKyAgICAgICAgICAgICAgIHRvcCArIGhlaWdodCAtIHMtPnNjcmVlbl9oZWlnaHQpOworICAgICAgICBoZWlnaHQgPSBzLT5zY3JlZW5faGVpZ2h0IC0gdG9wOworICAgIH0KKworICAgIC8qIHByb2Nlc3MgZGlzcG9zYWwgbWV0aG9kICovCisgICAgaWYgKHMtPmdjZV9wcmV2X2Rpc3Bvc2FsID09IEdDRV9ESVNQT1NBTF9CQUNLR1JPVU5EKSB7CisgICAgICAgIGdpZl9maWxsX3JlY3QoZnJhbWUsIHMtPnN0b3JlZF9iZ19jb2xvciwgcy0+Z2NlX2wsIHMtPmdjZV90LCBzLT5nY2Vfdywgcy0+Z2NlX2gpOworICAgIH0gZWxzZSBpZiAocy0+Z2NlX3ByZXZfZGlzcG9zYWwgPT0gR0NFX0RJU1BPU0FMX1JFU1RPUkUpIHsKKyAgICAgICAgZ2lmX2NvcHlfaW1nX3JlY3Qocy0+c3RvcmVkX2ltZywgKHVpbnQzMl90ICopZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbMF0gLyBzaXplb2YodWludDMyX3QpLCBzLT5nY2VfbCwgcy0+Z2NlX3QsIHMtPmdjZV93LCBzLT5nY2VfaCk7CisgICAgfQorCisgICAgcy0+Z2NlX3ByZXZfZGlzcG9zYWwgPSBzLT5nY2VfZGlzcG9zYWw7CisKKyAgICBpZiAocy0+Z2NlX2Rpc3Bvc2FsICE9IEdDRV9ESVNQT1NBTF9OT05FKSB7CisgICAgICAgIHMtPmdjZV9sID0gbGVmdDsgIHMtPmdjZV90ID0gdG9wOworICAgICAgICBzLT5nY2VfdyA9IHB3OyAgICBzLT5nY2VfaCA9IGhlaWdodDsKKworICAgICAgICBpZiAocy0+Z2NlX2Rpc3Bvc2FsID09IEdDRV9ESVNQT1NBTF9CQUNLR1JPVU5EKSB7CisgICAgICAgICAgICBpZiAocy0+dHJhbnNwYXJlbnRfY29sb3JfaW5kZXggPj0gMCkKKyAgICAgICAgICAgICAgICBzLT5zdG9yZWRfYmdfY29sb3IgPSBzLT50cmFuc19jb2xvcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzLT5zdG9yZWRfYmdfY29sb3IgPSBzLT5iZ19jb2xvcjsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5nY2VfZGlzcG9zYWwgPT0gR0NFX0RJU1BPU0FMX1JFU1RPUkUpIHsKKyAgICAgICAgICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT5zdG9yZWRfaW1nLCAmcy0+c3RvcmVkX2ltZ19zaXplLCBmcmFtZS0+bGluZXNpemVbMF0gKiBmcmFtZS0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGlmICghcy0+c3RvcmVkX2ltZykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBnaWZfY29weV9pbWdfcmVjdCgodWludDMyX3QgKilmcmFtZS0+ZGF0YVswXSwgcy0+c3RvcmVkX2ltZywKKyAgICAgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbMF0gLyBzaXplb2YodWludDMyX3QpLCBsZWZ0LCB0b3AsIHB3LCBoZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRXhwZWN0IGF0IGxlYXN0IDIgYnl0ZXM6IDEgZm9yIGx6dyBjb2RlIHNpemUgYW5kIDEgZm9yIGJsb2NrIHNpemUuICovCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCAyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIG5vdyBnZXQgdGhlIGltYWdlIGRhdGEgKi8KKyAgICBjb2RlX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKTsKKyAgICBpZiAoKHJldCA9IGZmX2x6d19kZWNvZGVfaW5pdChzLT5sencsIGNvZGVfc2l6ZSwgcy0+Z2IuYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYiksIEZGX0xaV19HSUYpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJMWlcgaW5pdCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIHJlYWQgYWxsIHRoZSBpbWFnZSAqLworICAgIGxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplWzBdIC8gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBwdHIxID0gKHVpbnQzMl90ICopZnJhbWUtPmRhdGFbMF0gKyB0b3AgKiBsaW5lc2l6ZSArIGxlZnQ7CisgICAgcHRyID0gcHRyMTsKKyAgICBwYXNzID0gMDsKKyAgICB5MSA9IDA7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGludCBjb3VudCA9IGZmX2x6d19kZWNvZGUocy0+bHp3LCBzLT5pZHhfbGluZSwgd2lkdGgpOworICAgICAgICBpZiAoY291bnQgIT0gd2lkdGgpIHsKKyAgICAgICAgICAgIGlmIChjb3VudCkKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkxaVyBkZWNvZGUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZGVjb2RlX3RhaWw7CisgICAgICAgIH0KKworICAgICAgICBwciA9IHB0ciArIHB3OworCisgICAgICAgIGZvciAocHggPSBwdHIsIGlkeCA9IHMtPmlkeF9saW5lOyBweCA8IHByOyBweCsrLCBpZHgrKykgeworICAgICAgICAgICAgaWYgKCppZHggIT0gcy0+dHJhbnNwYXJlbnRfY29sb3JfaW5kZXgpCisgICAgICAgICAgICAgICAgKnB4ID0gcGFsWyppZHhdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzX2ludGVybGVhdmVkKSB7CisgICAgICAgICAgICBzd2l0Y2gocGFzcykgeworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICB5MSArPSA4OworICAgICAgICAgICAgICAgIHB0ciArPSBsaW5lc2l6ZSAqIDg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgeTEgKz0gNDsKKyAgICAgICAgICAgICAgICBwdHIgKz0gbGluZXNpemUgKiA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHkxICs9IDI7CisgICAgICAgICAgICAgICAgcHRyICs9IGxpbmVzaXplICogMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICh5MSA+PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICB5MSA9IDQgPj4gcGFzczsKKyAgICAgICAgICAgICAgICBwdHIgPSBwdHIxICsgbGluZXNpemUgKiB5MTsKKyAgICAgICAgICAgICAgICBwYXNzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdHIgKz0gbGluZXNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyBkZWNvZGVfdGFpbDoKKyAgICAvKiByZWFkIHRoZSBnYXJiYWdlIGRhdGEgdW50aWwgZW5kIG1hcmtlciBpcyBmb3VuZCAqLworICAgIGZmX2x6d19kZWNvZGVfdGFpbChzLT5sencpOworCisgICAgLyogR3JhcGhpYyBDb250cm9sIEV4dGVuc2lvbidzIHNjb3BlIGlzIHNpbmdsZSBmcmFtZS4KKyAgICAgKiBSZW1vdmUgaXRzIGluZmx1ZW5jZS4gKi8KKyAgICBzLT50cmFuc3BhcmVudF9jb2xvcl9pbmRleCA9IC0xOworICAgIHMtPmdjZV9kaXNwb3NhbCA9IEdDRV9ESVNQT1NBTF9OT05FOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2lmX3JlYWRfZXh0ZW5zaW9uKEdpZlN0YXRlICpzKQoreworICAgIGludCBleHRfY29kZSwgZXh0X2xlbiwgZ2NlX2ZsYWdzLCBnY2VfdHJhbnNwYXJlbnRfaW5kZXg7CisKKyAgICAvKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IDIgYnl0ZXM6CisgICAgICogMSBmb3IgZXh0ZW5zaW9uIGxhYmVsIGFuZCAxIGZvciBleHRlbnNpb24gbGVuZ3RoLiAqLworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpIDwgMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBleHRfY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Z2IpOworICAgIGV4dF9sZW4gID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nYik7CisKKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiZXh0X2NvZGU9MHgleCBsZW49JWRcbiIsIGV4dF9jb2RlLCBleHRfbGVuKTsKKworICAgIHN3aXRjaChleHRfY29kZSkgeworICAgIGNhc2UgR0lGX0dDRV9FWFRfTEFCRUw6CisgICAgICAgIGlmIChleHRfbGVuICE9IDQpCisgICAgICAgICAgICBnb3RvIGRpc2NhcmRfZXh0OworCisgICAgICAgIC8qIFdlIG5lZWQgYXQgbGVhc3QgNSBieXRlcyBtb3JlOiA0IGlzIGZvciBleHRlbnNpb24gYm9keQorICAgICAgICAgKiBhbmQgMSBmb3IgbmV4dCBibG9jayBzaXplLiAqLworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IDUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBnY2VfZmxhZ3MgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJnMtPmdiLCAyKTsgICAgLy8gZGVsYXkgZHVyaW5nIHdoaWNoIHRoZSBmcmFtZSBpcyBzaG93bgorICAgICAgICBnY2VfdHJhbnNwYXJlbnRfaW5kZXggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKTsKKyAgICAgICAgaWYgKGdjZV9mbGFncyAmIDB4MDEpCisgICAgICAgICAgICBzLT50cmFuc3BhcmVudF9jb2xvcl9pbmRleCA9IGdjZV90cmFuc3BhcmVudF9pbmRleDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+dHJhbnNwYXJlbnRfY29sb3JfaW5kZXggPSAtMTsKKyAgICAgICAgcy0+Z2NlX2Rpc3Bvc2FsID0gKGdjZV9mbGFncyA+PiAyKSAmIDB4NzsKKworICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiZ2NlX2ZsYWdzPSV4IHRjb2xvcj0lZCBkaXNwb3NhbD0lZFxuIiwKKyAgICAgICAgICAgICAgIGdjZV9mbGFncywKKyAgICAgICAgICAgICAgIHMtPnRyYW5zcGFyZW50X2NvbG9yX2luZGV4LCBzLT5nY2VfZGlzcG9zYWwpOworCisgICAgICAgIGlmIChzLT5nY2VfZGlzcG9zYWwgPiAzKSB7CisgICAgICAgICAgICBzLT5nY2VfZGlzcG9zYWwgPSBHQ0VfRElTUE9TQUxfTk9ORTsKKyAgICAgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICJpbnZhbGlkIHZhbHVlIGluIGdjZV9kaXNwb3NhbCAoJWQpLiBVc2luZyBkZWZhdWx0IHZhbHVlIG9mIDAuXG4iLCBleHRfbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIGV4dF9sZW4gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogTk9URTogbWFueSBleHRlbnNpb24gYmxvY2tzIGNhbiBjb21lIGFmdGVyICovCisgZGlzY2FyZF9leHQ6CisgICAgd2hpbGUgKGV4dF9sZW4pIHsKKyAgICAgICAgLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBleHRfbGVuIGJ5dGVzIGFuZCAxIGZvciBuZXh0IGJsb2NrIHNpemUgYnl0ZS4gKi8KKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCBleHRfbGVuICsgMSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZzLT5nYiwgZXh0X2xlbik7CisgICAgICAgIGV4dF9sZW4gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKTsKKworICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiZXh0X2xlbjE9JWRcbiIsIGV4dF9sZW4pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaWZfcmVhZF9oZWFkZXIxKEdpZlN0YXRlICpzKQoreworICAgIHVpbnQ4X3Qgc2lnWzZdOworICAgIGludCB2LCBuOworICAgIGludCBiYWNrZ3JvdW5kX2NvbG9yX2luZGV4OworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCAxMykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiByZWFkIGdpZiBzaWduYXR1cmUgKi8KKyAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVydSgmcy0+Z2IsIHNpZywgNik7CisgICAgaWYgKG1lbWNtcChzaWcsIGdpZjg3YV9zaWcsIDYpICYmCisgICAgICAgIG1lbWNtcChzaWcsIGdpZjg5YV9zaWcsIDYpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIHJlYWQgc2NyZWVuIGhlYWRlciAqLworICAgIHMtPnRyYW5zcGFyZW50X2NvbG9yX2luZGV4ID0gLTE7CisgICAgcy0+c2NyZWVuX3dpZHRoICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmcy0+Z2IpOworICAgIHMtPnNjcmVlbl9oZWlnaHQgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJnMtPmdiKTsKKworICAgIHYgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKTsKKyAgICBzLT5jb2xvcl9yZXNvbHV0aW9uID0gKCh2ICYgMHg3MCkgPj4gNCkgKyAxOworICAgIHMtPmhhc19nbG9iYWxfcGFsZXR0ZSA9ICh2ICYgMHg4MCk7CisgICAgcy0+Yml0c19wZXJfcGl4ZWwgPSAodiAmIDB4MDcpICsgMTsKKyAgICBiYWNrZ3JvdW5kX2NvbG9yX2luZGV4ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nYik7CisgICAgbiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Z2IpOworICAgIGlmIChuKSB7CisgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA9IG4gKyAxNTsKKyAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gNjQ7CisgICAgfQorCisgICAgYXZfZGxvZyhzLT5hdmN0eCwgInNjcmVlbl93PSVkIHNjcmVlbl9oPSVkIGJwcD0lZCBnbG9iYWxfcGFsZXR0ZT0lZFxuIiwKKyAgICAgICAgICAgcy0+c2NyZWVuX3dpZHRoLCBzLT5zY3JlZW5faGVpZ2h0LCBzLT5iaXRzX3Blcl9waXhlbCwKKyAgICAgICAgICAgcy0+aGFzX2dsb2JhbF9wYWxldHRlKTsKKworICAgIGlmIChzLT5oYXNfZ2xvYmFsX3BhbGV0dGUpIHsKKyAgICAgICAgcy0+YmFja2dyb3VuZF9jb2xvcl9pbmRleCA9IGJhY2tncm91bmRfY29sb3JfaW5kZXg7CisgICAgICAgIG4gPSAxIDw8IHMtPmJpdHNfcGVyX3BpeGVsOworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IG4gKiAzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgZ2lmX3JlYWRfcGFsZXR0ZShzLCBzLT5nbG9iYWxfcGFsZXR0ZSwgbik7CisgICAgICAgIHMtPmJnX2NvbG9yID0gcy0+Z2xvYmFsX3BhbGV0dGVbcy0+YmFja2dyb3VuZF9jb2xvcl9pbmRleF07CisgICAgfSBlbHNlCisgICAgICAgIHMtPmJhY2tncm91bmRfY29sb3JfaW5kZXggPSAtMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpZl9wYXJzZV9uZXh0X2ltYWdlKEdpZlN0YXRlICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA+IDApIHsKKyAgICAgICAgaW50IGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiY29kZT0lMDJ4ICclYydcbiIsIGNvZGUsIGNvZGUpOworCisgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIEdJRl9JTUFHRV9TRVBBUkFUT1I6CisgICAgICAgICAgICByZXR1cm4gZ2lmX3JlYWRfaW1hZ2UocywgZnJhbWUpOworICAgICAgICBjYXNlIEdJRl9FWFRFTlNJT05fSU5UUk9EVUNFUjoKKyAgICAgICAgICAgIGlmICgocmV0ID0gZ2lmX3JlYWRfZXh0ZW5zaW9uKHMpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdJRl9UUkFJTEVSOgorICAgICAgICAgICAgLyogZW5kIG9mIGltYWdlICovCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBlcnJvbmVvdXMgYmxvY2sgbGFiZWwgKi8KKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBVkVSUk9SX0VPRjsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGdpZl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgR2lmU3RhdGUgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IzMjsKKyAgICBzLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9sendfZGVjb2RlX29wZW4oJnMtPmx6dyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2lmX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgR2lmU3RhdGUgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZzLT5nYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIHMtPmZyYW1lLT5wdHMgICAgID0gYXZwa3QtPnB0czsKKyAgICBzLT5mcmFtZS0+cGt0X3B0cyA9IGF2cGt0LT5wdHM7CisgICAgcy0+ZnJhbWUtPnBrdF9kdHMgPSBhdnBrdC0+ZHRzOworICAgIGF2X2ZyYW1lX3NldF9wa3RfZHVyYXRpb24ocy0+ZnJhbWUsIGF2cGt0LT5kdXJhdGlvbik7CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPj0gNikgeworICAgICAgICBzLT5rZXlmcmFtZSA9IG1lbWNtcChhdnBrdC0+ZGF0YSwgZ2lmODdhX3NpZywgNikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgIG1lbWNtcChhdnBrdC0+ZGF0YSwgZ2lmODlhX3NpZywgNikgPT0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5rZXlmcmFtZSA9IDA7CisgICAgfQorCisgICAgaWYgKHMtPmtleWZyYW1lKSB7CisgICAgICAgIHMtPmtleWZyYW1lX29rID0gMDsKKyAgICAgICAgcy0+Z2NlX3ByZXZfZGlzcG9zYWwgPSBHQ0VfRElTUE9TQUxfTk9ORTsKKyAgICAgICAgaWYgKChyZXQgPSBnaWZfcmVhZF9oZWFkZXIxKHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmICgocmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHMtPnNjcmVlbl93aWR0aCwgcy0+c2NyZWVuX2hlaWdodCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+ZnJhbWUpOworICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lLCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBhdl9mYXN0X21hbGxvYygmcy0+aWR4X2xpbmUsICZzLT5pZHhfbGluZV9zaXplLCBzLT5zY3JlZW5fd2lkdGgpOworICAgICAgICBpZiAoIXMtPmlkeF9saW5lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBzLT5mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIHMtPmZyYW1lLT5rZXlfZnJhbWUgPSAxOworICAgICAgICBzLT5rZXlmcmFtZV9vayA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFzLT5rZXlmcmFtZV9vaykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJjYW5ub3QgZGVjb2RlIGZyYW1lIHdpdGhvdXQga2V5ZnJhbWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHMtPmZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgcy0+ZnJhbWUtPmtleV9mcmFtZSA9IDA7CisgICAgfQorCisgICAgcmV0ID0gZ2lmX3BhcnNlX25leHRfaW1hZ2Uocywgcy0+ZnJhbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYnl0ZXN0cmVhbTJfdGVsbCgmcy0+Z2IpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZ2lmX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgR2lmU3RhdGUgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmZfbHp3X2RlY29kZV9jbG9zZSgmcy0+bHp3KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZSk7CisgICAgYXZfZnJlZXAoJnMtPmlkeF9saW5lKTsKKyAgICBhdl9mcmVlcCgmcy0+c3RvcmVkX2ltZyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJ0cmFuc19jb2xvciIsICJjb2xvciB2YWx1ZSAoQVJHQikgdGhhdCBpcyB1c2VkIGluc3RlYWQgb2YgdHJhbnNwYXJlbnQgY29sb3IiLAorICAgICAgb2Zmc2V0b2YoR2lmU3RhdGUsIHRyYW5zX2NvbG9yKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgey5pNjQgPSBHSUZfVFJBTlNQQVJFTlRfQ09MT1J9LCAwLCAweGZmZmZmZmZmLAorICAgICAgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGRlY29kZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZ2lmIGRlY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVDT0RFUiwKK307CisKK0FWQ29kZWMgZmZfZ2lmX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImdpZiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdJRiAoR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0KSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9HSUYsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEdpZlN0YXRlKSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBnaWZfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZ2lmX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBnaWZfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmRlY29kZXJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZ29sb21iLXRlc3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2dvbG9tYi10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmZTkxNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2dvbG9tYi10ZXN0LmMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKworI2RlZmluZSBDT1VOVCA4MTkxCisjZGVmaW5lIFNJWkUgKENPVU5UICogNCkKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgaSwgcmV0ID0gMDsKKyAgICB1aW50OF90ICp0ZW1wOworICAgIFB1dEJpdENvbnRleHQgcGI7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKworICAgIHRlbXAgPSBhdl9tYWxsb2MoU0laRSk7CisgICAgaWYgKCF0ZW1wKQorICAgICAgICByZXR1cm4gMjsKKworICAgIGluaXRfcHV0X2JpdHMoJnBiLCB0ZW1wLCBTSVpFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykKKyAgICAgICAgc2V0X3VlX2dvbG9tYigmcGIsIGkpOworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgdGVtcCwgOCAqIFNJWkUpOworICAgIGZvciAoaSA9IDA7IGkgPCBDT1VOVDsgaSsrKSB7CisgICAgICAgIGludCBqLCBzID0gc2hvd19iaXRzKCZnYiwgMjUpOworCisgICAgICAgIGogPSBnZXRfdWVfZ29sb21iKCZnYik7CisgICAgICAgIGlmIChqICE9IGkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0X3VlX2dvbG9tYjogZXhwZWN0ZWQgJWQsIGdvdCAlZC4gYml0czogJTd4XG4iLAorICAgICAgICAgICAgICAgICAgICBpLCBqLCBzKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyNkZWZpbmUgRVhURU5EKGkpICgoaSkgPDwgMyB8IChpKSAmIDcpCisgICAgaW5pdF9wdXRfYml0cygmcGIsIHRlbXAsIFNJWkUpOworICAgIGZvciAoaSA9IDA7IGkgPCBDT1VOVDsgaSsrKQorICAgICAgICBzZXRfdWVfZ29sb21iKCZwYiwgRVhURU5EKGkpKTsKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIHRlbXAsIDggKiBTSVpFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykgeworICAgICAgICBpbnQgaiwgcyA9IHNob3dfYml0c19sb25nKCZnYiwgMzIpOworCisgICAgICAgIGogPSBnZXRfdWVfZ29sb21iX2xvbmcoJmdiKTsKKyAgICAgICAgaWYgKGogIT0gRVhURU5EKGkpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdldF91ZV9nb2xvbWJfbG9uZzogZXhwZWN0ZWQgJWQsIGdvdCAlZC4gIgorICAgICAgICAgICAgICAgICAgICAiYml0czogJTh4XG4iLCBFWFRFTkQoaSksIGosIHMpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluaXRfcHV0X2JpdHMoJnBiLCB0ZW1wLCBTSVpFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykKKyAgICAgICAgc2V0X3NlX2dvbG9tYigmcGIsIGkgLSBDT1VOVCAvIDIpOworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgdGVtcCwgOCAqIFNJWkUpOworICAgIGZvciAoaSA9IDA7IGkgPCBDT1VOVDsgaSsrKSB7CisgICAgICAgIGludCBqLCBzID0gc2hvd19iaXRzKCZnYiwgMjUpOworCisgICAgICAgIGogPSBnZXRfc2VfZ29sb21iKCZnYik7CisgICAgICAgIGlmIChqICE9IGkgLSBDT1VOVCAvIDIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0X3NlX2dvbG9tYjogZXhwZWN0ZWQgJWQsIGdvdCAlZC4gYml0czogJTd4XG4iLAorICAgICAgICAgICAgICAgICAgICBpIC0gQ09VTlQgLyAyLCBqLCBzKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9mcmVlKHRlbXApOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2dvbG9tYi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvZ29sb21iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3YWMyMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2dvbG9tYi5jCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogZXhwIGdvbG9tYiB2bGMgc3R1ZmYKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYKKyAqICAgICBleHAgZ29sb21iIHZsYyBzdHVmZgorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKK2NvbnN0IHVpbnQ4X3QgZmZfZ29sb21iX3ZsY19sZW5bNTEyXT17CisxOSwxNywxNSwxNSwxMywxMywxMywxMywxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAorNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LAorNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LAorMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLAorMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLAorMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLAorMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxCit9OworCitjb25zdCB1aW50OF90IGZmX3VlX2dvbG9tYl92bGNfY29kZVs1MTJdPXsKKzMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMxLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLAorIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDksIDksIDksIDksMTAsMTAsMTAsMTAsMTEsMTEsMTEsMTEsMTIsMTIsMTIsMTIsMTMsMTMsMTMsMTMsMTQsMTQsMTQsMTQsCisgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitjb25zdCBpbnQ4X3QgZmZfc2VfZ29sb21iX3ZsY19jb2RlWzUxMl09eworIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTYsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAgOCwgLTgsICA5LCAtOSwgMTAsLTEwLCAxMSwtMTEsIDEyLC0xMiwgMTMsLTEzLCAxNCwtMTQsIDE1LC0xNSwKKyAgNCwgIDQsICA0LCAgNCwgLTQsIC00LCAtNCwgLTQsICA1LCAgNSwgIDUsICA1LCAtNSwgLTUsIC01LCAtNSwgIDYsICA2LCAgNiwgIDYsIC02LCAtNiwgLTYsIC02LCAgNywgIDcsICA3LCAgNywgLTcsIC03LCAtNywgLTcsCisgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLAorICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywKKyAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKK307CisKKworY29uc3QgdWludDhfdCBmZl91ZV9nb2xvbWJfbGVuWzI1Nl09eworIDEsIDMsIDMsIDUsIDUsIDUsIDUsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksMTEsCisxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMywKKzEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLAorMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTUsCisxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKzE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNywKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfaW50ZXJsZWF2ZWRfZ29sb21iX3ZsY19sZW5bMjU2XT17Cis5LDksNyw3LDksOSw3LDcsNSw1LDUsNSw1LDUsNSw1LAorOSw5LDcsNyw5LDksNyw3LDUsNSw1LDUsNSw1LDUsNSwKKzMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsCiszLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLAorOSw5LDcsNyw5LDksNyw3LDUsNSw1LDUsNSw1LDUsNSwKKzksOSw3LDcsOSw5LDcsNyw1LDUsNSw1LDUsNSw1LDUsCiszLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLAorMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywKKzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorfTsKKworY29uc3QgdWludDhfdCBmZl9pbnRlcmxlYXZlZF91ZV9nb2xvbWJfdmxjX2NvZGVbMjU2XT17CisgMTUsMTYsNywgNywgMTcsMTgsOCwgOCwgMywgMywgMywgMywgMywgMywgMywgMywKKyAxOSwyMCw5LCA5LCAyMSwyMiwxMCwxMCw0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAyMywyNCwxMSwxMSwyNSwyNiwxMiwxMiw1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorIDI3LDI4LDEzLDEzLDI5LDMwLDE0LDE0LDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKK307CisKK2NvbnN0IGludDhfdCBmZl9pbnRlcmxlYXZlZF9zZV9nb2xvbWJfdmxjX2NvZGVbMjU2XT17CisgIDgsIC04LCAgNCwgIDQsICA5LCAtOSwgLTQsIC00LCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsCisgMTAsLTEwLCAgNSwgIDUsIDExLC0xMSwgLTUsIC01LCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgMTIsLTEyLCAgNiwgIDYsIDEzLC0xMywgLTYsIC02LCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsCisgMTQsLTE0LCAgNywgIDcsIDE1LC0xNSwgLTcsIC03LCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsCisgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCit9OworCitjb25zdCB1aW50OF90IGZmX2ludGVybGVhdmVkX2RpcmFjX2dvbG9tYl92bGNfY29kZVsyNTZdPXsKKzAsIDEsIDAsIDAsIDIsIDMsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCis0LCA1LCAyLCAyLCA2LCA3LCAzLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCis4LCA5LCA0LCA0LCAxMCwxMSw1LCA1LCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorMTIsMTMsNiwgNiwgMTQsMTUsNywgNywgMywgMywgMywgMywgMywgMywgMywgMywKKzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2dvbG9tYi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvZ29sb21iLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkOGFlZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2dvbG9tYi5oCkBAIC0wLDAgKzEsNjA1IEBACisvKgorICogZXhwIGdvbG9tYiB2bGMgc3R1ZmYKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFsZXggQmVyZWdzemFzemkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmCisgKiAgICAgZXhwIGdvbG9tYiB2bGMgc3R1ZmYKKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4gYW5kIEFsZXggQmVyZWdzemFzemkKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfR09MT01CX0gKKyNkZWZpbmUgQVZDT0RFQ19HT0xPTUJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisKKyNkZWZpbmUgSU5WQUxJRF9WTEMgICAgICAgICAgIDB4ODAwMDAwMDAKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZ29sb21iX3ZsY19sZW5bNTEyXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3VlX2dvbG9tYl92bGNfY29kZVs1MTJdOworZXh0ZXJuIGNvbnN0ICBpbnQ4X3QgZmZfc2VfZ29sb21iX3ZsY19jb2RlWzUxMl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl91ZV9nb2xvbWJfbGVuWzI1Nl07CisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2ludGVybGVhdmVkX2dvbG9tYl92bGNfbGVuWzI1Nl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9pbnRlcmxlYXZlZF91ZV9nb2xvbWJfdmxjX2NvZGVbMjU2XTsKK2V4dGVybiBjb25zdCAgaW50OF90IGZmX2ludGVybGVhdmVkX3NlX2dvbG9tYl92bGNfY29kZVsyNTZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaW50ZXJsZWF2ZWRfZGlyYWNfZ29sb21iX3ZsY19jb2RlWzI1Nl07CisKKy8qKgorICogcmVhZCB1bnNpZ25lZCBleHAgZ29sb21iIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF91ZV9nb2xvbWIoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZjsKKworICAgIE9QRU5fUkVBREVSKHJlLCBnYik7CisgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisgICAgYnVmID0gR0VUX0NBQ0hFKHJlLCBnYik7CisKKyAgICBpZiAoYnVmID49ICgxIDw8IDI3KSkgeworICAgICAgICBidWYgPj49IDMyIC0gOTsKKyAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsIGdiLCBmZl9nb2xvbWJfdmxjX2xlbltidWZdKTsKKyAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CisKKyAgICAgICAgcmV0dXJuIGZmX3VlX2dvbG9tYl92bGNfY29kZVtidWZdOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBsb2cgPSAyICogYXZfbG9nMihidWYpIC0gMzE7CisgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgMzIgLSBsb2cpOworICAgICAgICBDTE9TRV9SRUFERVIocmUsIGdiKTsKKyAgICAgICAgaWYgKENPTkZJR19GVFJBUFYgJiYgbG9nIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKDAsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgVUUgZ29sb21iIGNvZGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnVmID4+PSBsb2c7CisgICAgICAgIGJ1Zi0tOworCisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorfQorCisvKioKKyAqIFJlYWQgYW4gdW5zaWduZWQgRXhwLUdvbG9tYiBjb2RlIGluIHRoZSByYW5nZSAwIHRvIFVJTlQzMl9NQVgtMS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRfdWVfZ29sb21iX2xvbmcoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgdW5zaWduZWQgYnVmLCBsb2c7CisKKyAgICBidWYgPSBzaG93X2JpdHNfbG9uZyhnYiwgMzIpOworICAgIGxvZyA9IDMxIC0gYXZfbG9nMihidWYpOworICAgIHNraXBfYml0c19sb25nKGdiLCBsb2cpOworCisgICAgcmV0dXJuIGdldF9iaXRzX2xvbmcoZ2IsIGxvZyArIDEpIC0gMTsKK30KKworLyoqCisgKiByZWFkIHVuc2lnbmVkIGV4cCBnb2xvbWIgY29kZSwgY29uc3RyYWludCB0byBhIG1heCBvZiAzMS4KKyAqIHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkIGlmIHRoZSBzdG9yZWQgdmFsdWUgZXhjZWVkcyAzMS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3VlX2dvbG9tYl8zMShHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICB1bnNpZ25lZCBpbnQgYnVmOworCisgICAgT1BFTl9SRUFERVIocmUsIGdiKTsKKyAgICBVUERBVEVfQ0FDSEUocmUsIGdiKTsKKyAgICBidWYgPSBHRVRfQ0FDSEUocmUsIGdiKTsKKworICAgIGJ1ZiA+Pj0gMzIgLSA5OworICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgZmZfZ29sb21iX3ZsY19sZW5bYnVmXSk7CisgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CisKKyAgICByZXR1cm4gZmZfdWVfZ29sb21iX3ZsY19jb2RlW2J1Zl07Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc3ZxM19nZXRfdWVfZ29sb21iKEdldEJpdENvbnRleHQgKmdiKQoreworICAgIHVpbnQzMl90IGJ1ZjsKKworICAgIE9QRU5fUkVBREVSKHJlLCBnYik7CisgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisgICAgYnVmID0gR0VUX0NBQ0hFKHJlLCBnYik7CisKKyAgICBpZiAoYnVmICYgMHhBQTgwMDAwMCkgeworICAgICAgICBidWYgPj49IDMyIC0gODsKKyAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsIGdiLCBmZl9pbnRlcmxlYXZlZF9nb2xvbWJfdmxjX2xlbltidWZdKTsKKyAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CisKKyAgICAgICAgcmV0dXJuIGZmX2ludGVybGVhdmVkX3VlX2dvbG9tYl92bGNfY29kZVtidWZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIHJldCA9IDE7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgYnVmID4+PSAzMiAtIDg7CisgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihmZl9pbnRlcmxlYXZlZF9nb2xvbWJfdmxjX2xlbltidWZdLCA4KSk7CisKKyAgICAgICAgICAgIGlmIChmZl9pbnRlcmxlYXZlZF9nb2xvbWJfdmxjX2xlbltidWZdICE9IDkpIHsKKyAgICAgICAgICAgICAgICByZXQgPDw9IChmZl9pbnRlcmxlYXZlZF9nb2xvbWJfdmxjX2xlbltidWZdIC0gMSkgPj4gMTsKKyAgICAgICAgICAgICAgICByZXQgIHw9IGZmX2ludGVybGVhdmVkX2RpcmFjX2dvbG9tYl92bGNfY29kZVtidWZdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gKHJldCA8PCA0KSB8IGZmX2ludGVybGVhdmVkX2RpcmFjX2dvbG9tYl92bGNfY29kZVtidWZdOworICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisgICAgICAgICAgICBidWYgPSBHRVRfQ0FDSEUocmUsIGdiKTsKKyAgICAgICAgfSB3aGlsZSAocmV0PDB4ODAwMDAwMFUgJiYgQklUU19BVkFJTEFCTEUocmUsIGdiKSk7CisKKyAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CisgICAgICAgIHJldHVybiByZXQgLSAxOworICAgIH0KK30KKworLyoqCisgKiByZWFkIHVuc2lnbmVkIHRydW5jYXRlZCBleHAgZ29sb21iIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF90ZTBfZ29sb21iKEdldEJpdENvbnRleHQgKmdiLCBpbnQgcmFuZ2UpCit7CisgICAgYXZfYXNzZXJ0MihyYW5nZSA+PSAxKTsKKworICAgIGlmIChyYW5nZSA9PSAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlbHNlIGlmIChyYW5nZSA9PSAyKQorICAgICAgICByZXR1cm4gZ2V0X2JpdHMxKGdiKSBeIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZ2V0X3VlX2dvbG9tYihnYik7Cit9CisKKy8qKgorICogcmVhZCB1bnNpZ25lZCB0cnVuY2F0ZWQgZXhwIGdvbG9tYiBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfdGVfZ29sb21iKEdldEJpdENvbnRleHQgKmdiLCBpbnQgcmFuZ2UpCit7CisgICAgYXZfYXNzZXJ0MihyYW5nZSA+PSAxKTsKKworICAgIGlmIChyYW5nZSA9PSAyKQorICAgICAgICByZXR1cm4gZ2V0X2JpdHMxKGdiKSBeIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZ2V0X3VlX2dvbG9tYihnYik7Cit9CisKKy8qKgorICogcmVhZCBzaWduZWQgZXhwIGdvbG9tYiBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfc2VfZ29sb21iKEdldEJpdENvbnRleHQgKmdiKQoreworICAgIHVuc2lnbmVkIGludCBidWY7CisKKyAgICBPUEVOX1JFQURFUihyZSwgZ2IpOworICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOworICAgIGJ1ZiA9IEdFVF9DQUNIRShyZSwgZ2IpOworCisgICAgaWYgKGJ1ZiA+PSAoMSA8PCAyNykpIHsKKyAgICAgICAgYnVmID4+PSAzMiAtIDk7CisgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgZmZfZ29sb21iX3ZsY19sZW5bYnVmXSk7CisgICAgICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOworCisgICAgICAgIHJldHVybiBmZl9zZV9nb2xvbWJfdmxjX2NvZGVbYnVmXTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgbG9nID0gYXZfbG9nMihidWYpOworICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIDMxIC0gbG9nKTsKKyAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisgICAgICAgIGJ1ZiA9IEdFVF9DQUNIRShyZSwgZ2IpOworCisgICAgICAgIGJ1ZiA+Pj0gbG9nOworCisgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgMzIgLSBsb2cpOworICAgICAgICBDTE9TRV9SRUFERVIocmUsIGdiKTsKKworICAgICAgICBpZiAoYnVmICYgMSkKKyAgICAgICAgICAgIGJ1ZiA9IC0oYnVmID4+IDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBidWYgPSAoYnVmID4+IDEpOworCisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfc2VfZ29sb21iX2xvbmcoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZiA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisKKyAgICBpZiAoYnVmICYgMSkKKyAgICAgICAgYnVmID0gKGJ1ZiArIDEpID4+IDE7CisgICAgZWxzZQorICAgICAgICBidWYgPSAtKGJ1ZiA+PiAxKTsKKworICAgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN2cTNfZ2V0X3NlX2dvbG9tYihHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICB1bnNpZ25lZCBpbnQgYnVmOworCisgICAgT1BFTl9SRUFERVIocmUsIGdiKTsKKyAgICBVUERBVEVfQ0FDSEUocmUsIGdiKTsKKyAgICBidWYgPSBHRVRfQ0FDSEUocmUsIGdiKTsKKworICAgIGlmIChidWYgJiAweEFBODAwMDAwKSB7CisgICAgICAgIGJ1ZiA+Pj0gMzIgLSA4OworICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIGZmX2ludGVybGVhdmVkX2dvbG9tYl92bGNfbGVuW2J1Zl0pOworICAgICAgICBDTE9TRV9SRUFERVIocmUsIGdiKTsKKworICAgICAgICByZXR1cm4gZmZfaW50ZXJsZWF2ZWRfc2VfZ29sb21iX3ZsY19jb2RlW2J1Zl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGxvZzsKKyAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsIGdiLCA4KTsKKyAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisgICAgICAgIGJ1ZiB8PSAxIHwgKEdFVF9DQUNIRShyZSwgZ2IpID4+IDgpOworCisgICAgICAgIGlmICgoYnVmICYgMHhBQUFBQUFBQSkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX1ZMQzsKKworICAgICAgICBmb3IgKGxvZyA9IDMxOyAoYnVmICYgMHg4MDAwMDAwMCkgPT0gMDsgbG9nLS0pCisgICAgICAgICAgICBidWYgPSAoYnVmIDw8IDIpIC0gKChidWYgPDwgbG9nKSA+PiAobG9nIC0gMSkpICsgKGJ1ZiA+PiAzMCk7CisKKyAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsIGdiLCA2MyAtIDIgKiBsb2cgLSA4KTsKKyAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CisKKyAgICAgICAgcmV0dXJuIChzaWduZWQpICgoKCgoYnVmIDw8IGxvZykgPj4gbG9nKSAtIDEpIF4gLShidWYgJiAweDEpKSArIDEpID4+IDE7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBkaXJhY19nZXRfc2VfZ29sb21iKEdldEJpdENvbnRleHQgKmdiKQoreworICAgIHVpbnQzMl90IHJldCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisKKyAgICBpZiAocmV0KSB7CisgICAgICAgIHVpbnQzMl90IGJ1ZjsKKyAgICAgICAgT1BFTl9SRUFERVIocmUsIGdiKTsKKyAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisgICAgICAgIGJ1ZiA9IFNIT1dfU0JJVFMocmUsIGdiLCAxKTsKKyAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsIGdiLCAxKTsKKyAgICAgICAgcmV0ID0gKHJldCBeIGJ1ZikgLSBidWY7CisgICAgICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogcmVhZCB1bnNpZ25lZCBnb2xvbWIgcmljZSBjb2RlIChmZnYxKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3VyX2dvbG9tYihHZXRCaXRDb250ZXh0ICpnYiwgaW50IGssIGludCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVzY19sZW4pCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZjsKKyAgICBpbnQgbG9nOworCisgICAgT1BFTl9SRUFERVIocmUsIGdiKTsKKyAgICBVUERBVEVfQ0FDSEUocmUsIGdiKTsKKyAgICBidWYgPSBHRVRfQ0FDSEUocmUsIGdiKTsKKworICAgIGxvZyA9IGF2X2xvZzIoYnVmKTsKKworICAgIGlmIChsb2cgPiAzMSAtIGxpbWl0KSB7CisgICAgICAgIGJ1ZiA+Pj0gbG9nIC0gazsKKyAgICAgICAgYnVmICArPSAoMzAgLSBsb2cpIDw8IGs7CisgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgMzIgKyBrIC0gbG9nKTsKKyAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CisKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9IGVsc2UgeworICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIGxpbWl0KTsKKyAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisKKyAgICAgICAgYnVmID0gU0hPV19VQklUUyhyZSwgZ2IsIGVzY19sZW4pOworCisgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgZXNjX2xlbik7CisgICAgICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOworCisgICAgICAgIHJldHVybiBidWYgKyBsaW1pdCAtIDE7CisgICAgfQorfQorCisvKioKKyAqIHJlYWQgdW5zaWduZWQgZ29sb21iIHJpY2UgY29kZSAoanBlZ2xzKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3VyX2dvbG9tYl9qcGVnbHMoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBrLCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXNjX2xlbikKK3sKKyAgICB1bnNpZ25lZCBpbnQgYnVmOworICAgIGludCBsb2c7CisKKyAgICBPUEVOX1JFQURFUihyZSwgZ2IpOworICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOworICAgIGJ1ZiA9IEdFVF9DQUNIRShyZSwgZ2IpOworCisgICAgbG9nID0gYXZfbG9nMihidWYpOworCisgICAgaWYgKGxvZyAtIGsgPj0gMzIgLSBNSU5fQ0FDSEVfQklUUyArIChNSU5fQ0FDSEVfQklUUyA9PSAzMikgJiYKKyAgICAgICAgMzIgLSBsb2cgPCBsaW1pdCkgeworICAgICAgICBidWYgPj49IGxvZyAtIGs7CisgICAgICAgIGJ1ZiAgKz0gKDMwIC0gbG9nKSA8PCBrOworICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIDMyICsgayAtIGxvZyk7CisgICAgICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOworCisgICAgICAgIHJldHVybiBidWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdCAmJiBTSE9XX1VCSVRTKHJlLCBnYiwgMSkgPT0gMDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZ2ItPnNpemVfaW5fYml0cyA8PSByZV9pbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIDEpOworICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9CSVRTKHJlLCBnYiwgMSk7CisKKyAgICAgICAgaWYgKGkgPCBsaW1pdCAtIDEpIHsKKyAgICAgICAgICAgIGlmIChrKSB7CisgICAgICAgICAgICAgICAgYnVmID0gU0hPV19VQklUUyhyZSwgZ2IsIGspOworICAgICAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgayk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZiA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZiArIChpIDw8IGspOworICAgICAgICB9IGVsc2UgaWYgKGkgPT0gbGltaXQgLSAxKSB7CisgICAgICAgICAgICBidWYgPSBTSE9XX1VCSVRTKHJlLCBnYiwgZXNjX2xlbik7CisgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIGVzY19sZW4pOworICAgICAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CisKKyAgICAgICAgICAgIHJldHVybiBidWYgKyAxOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKKy8qKgorICogcmVhZCBzaWduZWQgZ29sb21iIHJpY2UgY29kZSAoZmZ2MSkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9zcl9nb2xvbWIoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBrLCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlc2NfbGVuKQoreworICAgIGludCB2ID0gZ2V0X3VyX2dvbG9tYihnYiwgaywgbGltaXQsIGVzY19sZW4pOworCisgICAgdisrOworICAgIGlmICh2ICYgMSkKKyAgICAgICAgcmV0dXJuIHYgPj4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtKHYgPj4gMSk7CisKKy8vICAgIHJldHVybiAodj4+MSkgXiAtKHYmMSk7Cit9CisKKy8qKgorICogcmVhZCBzaWduZWQgZ29sb21iIHJpY2UgY29kZSAoZmxhYykuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9zcl9nb2xvbWJfZmxhYyhHZXRCaXRDb250ZXh0ICpnYiwgaW50IGssIGludCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXNjX2xlbikKK3sKKyAgICBpbnQgdiA9IGdldF91cl9nb2xvbWJfanBlZ2xzKGdiLCBrLCBsaW1pdCwgZXNjX2xlbik7CisgICAgcmV0dXJuICh2ID4+IDEpIF4gLSh2ICYgMSk7Cit9CisKKy8qKgorICogcmVhZCB1bnNpZ25lZCBnb2xvbWIgcmljZSBjb2RlIChzaG9ydGVuKS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X3VyX2dvbG9tYl9zaG9ydGVuKEdldEJpdENvbnRleHQgKmdiLCBpbnQgaykKK3sKKyAgICByZXR1cm4gZ2V0X3VyX2dvbG9tYl9qcGVnbHMoZ2IsIGssIElOVF9NQVgsIDApOworfQorCisvKioKKyAqIHJlYWQgc2lnbmVkIGdvbG9tYiByaWNlIGNvZGUgKHNob3J0ZW4pLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfc3JfZ29sb21iX3Nob3J0ZW4oR2V0Qml0Q29udGV4dCAqZ2IsIGludCBrKQoreworICAgIGludCB1dmFyID0gZ2V0X3VyX2dvbG9tYl9qcGVnbHMoZ2IsIGsgKyAxLCBJTlRfTUFYLCAwKTsKKyAgICBpZiAodXZhciAmIDEpCisgICAgICAgIHJldHVybiB+KHV2YXIgPj4gMSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gdXZhciA+PiAxOworfQorCisjaWZkZWYgVFJBQ0UKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3VlKEdldEJpdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpCit7CisgICAgaW50IHNob3cgPSBzaG93X2JpdHMocywgMjQpOworICAgIGludCBwb3MgID0gZ2V0X2JpdHNfY291bnQocyk7CisgICAgaW50IGkgICAgPSBnZXRfdWVfZ29sb21iKHMpOworICAgIGludCBsZW4gID0gZ2V0X2JpdHNfY291bnQocykgLSBwb3M7CisgICAgaW50IGJpdHMgPSBzaG93ID4+ICgyNCAtIGxlbik7CisKKyAgICBwcmludF9iaW4oYml0cywgbGVuKTsKKworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIlNWQgJTJkICUzZCB1ZSAgQCU1ZCBpbiAlcyAlczolZFxuIiwKKyAgICAgICAgICAgYml0cywgbGVuLCBpLCBwb3MsIGZpbGUsIGZ1bmMsIGxpbmUpOworCisgICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9zZShHZXRCaXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKQoreworICAgIGludCBzaG93ID0gc2hvd19iaXRzKHMsIDI0KTsKKyAgICBpbnQgcG9zICA9IGdldF9iaXRzX2NvdW50KHMpOworICAgIGludCBpICAgID0gZ2V0X3NlX2dvbG9tYihzKTsKKyAgICBpbnQgbGVuICA9IGdldF9iaXRzX2NvdW50KHMpIC0gcG9zOworICAgIGludCBiaXRzID0gc2hvdyA+PiAoMjQgLSBsZW4pOworCisgICAgcHJpbnRfYmluKGJpdHMsIGxlbik7CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiJTVkICUyZCAlM2Qgc2UgIEAlNWQgaW4gJXMgJXM6JWRcbiIsCisgICAgICAgICAgIGJpdHMsIGxlbiwgaSwgcG9zLCBmaWxlLCBmdW5jLCBsaW5lKTsKKworICAgIHJldHVybiBpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfdGUoR2V0Qml0Q29udGV4dCAqcywgaW50IHIsIGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpCit7CisgICAgaW50IHNob3cgPSBzaG93X2JpdHMocywgMjQpOworICAgIGludCBwb3MgID0gZ2V0X2JpdHNfY291bnQocyk7CisgICAgaW50IGkgICAgPSBnZXRfdGUwX2dvbG9tYihzLCByKTsKKyAgICBpbnQgbGVuICA9IGdldF9iaXRzX2NvdW50KHMpIC0gcG9zOworICAgIGludCBiaXRzID0gc2hvdyA+PiAoMjQgLSBsZW4pOworCisgICAgcHJpbnRfYmluKGJpdHMsIGxlbik7CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiJTVkICUyZCAlM2QgdGUgIEAlNWQgaW4gJXMgJXM6JWRcbiIsCisgICAgICAgICAgIGJpdHMsIGxlbiwgaSwgcG9zLCBmaWxlLCBmdW5jLCBsaW5lKTsKKworICAgIHJldHVybiBpOworfQorCisjZGVmaW5lIGdldF91ZV9nb2xvbWIoYSkgZ2V0X3VlKGEsIF9fRklMRV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNkZWZpbmUgZ2V0X3NlX2dvbG9tYihhKSBnZXRfc2UoYSwgX19GSUxFX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fKQorI2RlZmluZSBnZXRfdGVfZ29sb21iKGEsIHIpICBnZXRfdGUoYSwgciwgX19GSUxFX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fKQorI2RlZmluZSBnZXRfdGUwX2dvbG9tYihhLCByKSBnZXRfdGUoYSwgciwgX19GSUxFX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fKQorCisjZW5kaWYgLyogVFJBQ0UgKi8KKworLyoqCisgKiB3cml0ZSB1bnNpZ25lZCBleHAgZ29sb21iIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdWVfZ29sb21iKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgaSkKK3sKKyAgICBhdl9hc3NlcnQyKGkgPj0gMCk7CisKKyNpZiAwCisgICAgaWYgKGkgPSAwKSB7CisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIGlmIChpIDwgMjU2KQorICAgICAgICBwdXRfYml0cyhwYiwgZmZfdWVfZ29sb21iX2xlbltpXSwgaSArIDEpOworICAgIGVsc2UgeworICAgICAgICBpbnQgZSA9IGF2X2xvZzIoaSArIDEpOworICAgICAgICBwdXRfYml0cyhwYiwgMiAqIGUgKyAxLCBpICsgMSk7CisgICAgfQorfQorCisvKioKKyAqIHdyaXRlIHRydW5jYXRlZCB1bnNpZ25lZCBleHAgZ29sb21iIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdGVfZ29sb21iKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgaSwgaW50IHJhbmdlKQoreworICAgIGF2X2Fzc2VydDIocmFuZ2UgPj0gMSk7CisgICAgYXZfYXNzZXJ0MihpIDw9IHJhbmdlKTsKKworICAgIGlmIChyYW5nZSA9PSAyKQorICAgICAgICBwdXRfYml0cyhwYiwgMSwgaSBeIDEpOworICAgIGVsc2UKKyAgICAgICAgc2V0X3VlX2dvbG9tYihwYiwgaSk7Cit9CisKKy8qKgorICogd3JpdGUgc2lnbmVkIGV4cCBnb2xvbWIgY29kZS4gMTYgYml0cyBhdCBtb3N0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NlX2dvbG9tYihQdXRCaXRDb250ZXh0ICpwYiwgaW50IGkpCit7CisjaWYgMAorICAgIGlmIChpIDw9IDApCisgICAgICAgIGkgPSAtMiAqIGk7CisgICAgZWxzZQorICAgICAgICBpID0gMiAqIGkgLSAxOworI2VsaWYgMQorICAgIGkgPSAyICogaSAtIDE7CisgICAgaWYgKGkgPCAwKQorICAgICAgICBpIF49IC0xOyAgICAvL0ZJWE1FIGNoZWNrIGlmIGdjYyBkb2VzIHRoZSByaWdodCB0aGluZworI2Vsc2UKKyAgICBpICA9IDIgKiBpIC0gMTsKKyAgICBpIF49IChpID4+IDMxKTsKKyNlbmRpZgorICAgIHNldF91ZV9nb2xvbWIocGIsIGkpOworfQorCisvKioKKyAqIHdyaXRlIHVuc2lnbmVkIGdvbG9tYiByaWNlIGNvZGUgKGZmdjEpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3VyX2dvbG9tYihQdXRCaXRDb250ZXh0ICpwYiwgaW50IGksIGludCBrLCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXNjX2xlbikKK3sKKyAgICBpbnQgZTsKKworICAgIGF2X2Fzc2VydDIoaSA+PSAwKTsKKworICAgIGUgPSBpID4+IGs7CisgICAgaWYgKGUgPCBsaW1pdCkKKyAgICAgICAgcHV0X2JpdHMocGIsIGUgKyBrICsgMSwgKDEgPDwgaykgKyAoaSAmICgoMSA8PCBrKSAtIDEpKSk7CisgICAgZWxzZQorICAgICAgICBwdXRfYml0cyhwYiwgbGltaXQgKyBlc2NfbGVuLCBpIC0gbGltaXQgKyAxKTsKK30KKworLyoqCisgKiB3cml0ZSB1bnNpZ25lZCBnb2xvbWIgcmljZSBjb2RlIChqcGVnbHMpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3VyX2dvbG9tYl9qcGVnbHMoUHV0Qml0Q29udGV4dCAqcGIsIGludCBpLCBpbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGltaXQsIGludCBlc2NfbGVuKQoreworICAgIGludCBlOworCisgICAgYXZfYXNzZXJ0MihpID49IDApOworCisgICAgZSA9IChpID4+IGspICsgMTsKKyAgICBpZiAoZSA8IGxpbWl0KSB7CisgICAgICAgIHdoaWxlIChlID4gMzEpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAzMSwgMCk7CisgICAgICAgICAgICBlIC09IDMxOworICAgICAgICB9CisgICAgICAgIHB1dF9iaXRzKHBiLCBlLCAxKTsKKyAgICAgICAgaWYgKGspCisgICAgICAgICAgICBwdXRfc2JpdHMocGIsIGssIGkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChsaW1pdCA+IDMxKSB7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgMzEsIDApOworICAgICAgICAgICAgbGltaXQgLT0gMzE7CisgICAgICAgIH0KKyAgICAgICAgcHV0X2JpdHMocGIsIGxpbWl0LCAxKTsKKyAgICAgICAgcHV0X2JpdHMocGIsIGVzY19sZW4sIGkgLSAxKTsKKyAgICB9Cit9CisKKy8qKgorICogd3JpdGUgc2lnbmVkIGdvbG9tYiByaWNlIGNvZGUgKGZmdjEpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NyX2dvbG9tYihQdXRCaXRDb250ZXh0ICpwYiwgaW50IGksIGludCBrLCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXNjX2xlbikKK3sKKyAgICBpbnQgdjsKKworICAgIHYgID0gLTIgKiBpIC0gMTsKKyAgICB2IF49ICh2ID4+IDMxKTsKKworICAgIHNldF91cl9nb2xvbWIocGIsIHYsIGssIGxpbWl0LCBlc2NfbGVuKTsKK30KKworLyoqCisgKiB3cml0ZSBzaWduZWQgZ29sb21iIHJpY2UgY29kZSAoZmxhYykuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc3JfZ29sb21iX2ZsYWMoUHV0Qml0Q29udGV4dCAqcGIsIGludCBpLCBpbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbWl0LCBpbnQgZXNjX2xlbikKK3sKKyAgICBpbnQgdjsKKworICAgIHYgID0gLTIgKiBpIC0gMTsKKyAgICB2IF49ICh2ID4+IDMxKTsKKworICAgIHNldF91cl9nb2xvbWJfanBlZ2xzKHBiLCB2LCBrLCBsaW1pdCwgZXNjX2xlbik7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX0dPTE9NQl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9nc20uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2dzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZDY1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9nc20uaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogR1NNIGNvbW1vbiBoZWFkZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0dTTV9ICisjZGVmaW5lIEFWQ09ERUNfR1NNX0gKKworLyogYnl0ZXMgcGVyIGJsb2NrICovCisjZGVmaW5lIEdTTV9CTE9DS19TSVpFICAgICAzMworI2RlZmluZSBHU01fTVNfQkxPQ0tfU0laRSAgNjUKKyNkZWZpbmUgTVNOX01JTl9CTE9DS19TSVpFIDQxCisKKy8qIHNhbXBsZXMgcGVyIGJsb2NrICovCisjZGVmaW5lIEdTTV9GUkFNRV9TSVpFIDE2MAorCitlbnVtIEdTTU1vZGVzIHsKKyAgICBHU01fMTMwMDAgPSAwLAorICAgIE1TTl8xMjQwMCwKKyAgICBNU05fMTE4MDAsCisgICAgTVNOXzExMjAwLAorICAgIE1TTl8xMDYwMCwKKyAgICBNU05fMTAwMDAsCisgICAgTVNOXzk0MDAsCisgICAgTVNOXzg4MDAsCisgICAgTVNOXzgyMDAsCisgICAgTlVNX0dTTV9NT0RFUworfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfR1NNX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2dzbV9wYXJzZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2dzbV9wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTNiOTRlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZ3NtX3BhcnNlci5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgIEp1c3RpbiBSdWdnbGVzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEdTTSBhdWRpbyBwYXJzZXIKKyAqCisgKiBTcGxpdHMgcGFja2V0cyBpbnRvIGluZGl2aWR1YWwgYmxvY2tzLgorICovCisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJnc20uaCIKKwordHlwZWRlZiBzdHJ1Y3QgR1NNUGFyc2VDb250ZXh0IHsKKyAgICBQYXJzZUNvbnRleHQgcGM7CisgICAgaW50IGJsb2NrX3NpemU7CisgICAgaW50IGR1cmF0aW9uOworICAgIGludCByZW1haW5pbmc7Cit9IEdTTVBhcnNlQ29udGV4dDsKKworc3RhdGljIGludCBnc21fcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMxLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBHU01QYXJzZUNvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIFBhcnNlQ29udGV4dCAqcGMgPSAmcy0+cGM7CisgICAgaW50IG5leHQ7CisKKyAgICBpZiAoIXMtPmJsb2NrX3NpemUpIHsKKyAgICAgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfaWQpIHsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9HU006CisgICAgICAgICAgICBzLT5ibG9ja19zaXplID0gR1NNX0JMT0NLX1NJWkU7CisgICAgICAgICAgICBzLT5kdXJhdGlvbiAgID0gR1NNX0ZSQU1FX1NJWkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9HU01fTVM6CisgICAgICAgICAgICBzLT5ibG9ja19zaXplID0gYXZjdHgtPmJsb2NrX2FsaWduID8gYXZjdHgtPmJsb2NrX2FsaWduCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR1NNX01TX0JMT0NLX1NJWkU7CisgICAgICAgICAgICBzLT5kdXJhdGlvbiAgID0gR1NNX0ZSQU1FX1NJWkUgKiAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqcG91dGJ1ZiAgICAgID0gYnVmOworICAgICAgICAgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNvZGVjX2lkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcy0+cmVtYWluaW5nKQorICAgICAgICBzLT5yZW1haW5pbmcgPSBzLT5ibG9ja19zaXplOworICAgIGlmIChzLT5yZW1haW5pbmcgPD0gYnVmX3NpemUpIHsKKyAgICAgICAgbmV4dCA9IHMtPnJlbWFpbmluZzsKKyAgICAgICAgcy0+cmVtYWluaW5nID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXh0ID0gRU5EX05PVF9GT1VORDsKKyAgICAgICAgcy0+cmVtYWluaW5nIC09IGJ1Zl9zaXplOworICAgIH0KKworICAgIGlmIChmZl9jb21iaW5lX2ZyYW1lKHBjLCBuZXh0LCAmYnVmLCAmYnVmX3NpemUpIDwgMCB8fCAhYnVmX3NpemUpIHsKKyAgICAgICAgKnBvdXRidWYgICAgICA9IE5VTEw7CisgICAgICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgczEtPmR1cmF0aW9uID0gcy0+ZHVyYXRpb247CisKKyAgICAqcG91dGJ1ZiAgICAgID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gbmV4dDsKK30KKworQVZDb2RlY1BhcnNlciBmZl9nc21fcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfR1NNLCBBVl9DT0RFQ19JRF9HU01fTVMgfSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoR1NNUGFyc2VDb250ZXh0KSwKKyAgICAucGFyc2VyX3BhcnNlICAgPSBnc21fcGFyc2UsCisgICAgLnBhcnNlcl9jbG9zZSAgID0gZmZfcGFyc2VfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZ3NtZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9nc21kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGNkZTkyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZ3NtZGVjLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBnc20gMDYuMTAgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEdTTSBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXNnc21kZWMuaCIKKworI2luY2x1ZGUgImdzbWRlY190ZW1wbGF0ZS5jIgorCitzdGF0aWMgYXZfY29sZCBpbnQgZ3NtX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICA9IDE7CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgaWYgKCFhdmN0eC0+c2FtcGxlX3JhdGUpCisgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgICAgID0gQVZfU0FNUExFX0ZNVF9TMTY7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfR1NNOgorICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSAgPSBHU01fRlJBTUVfU0laRTsKKyAgICAgICAgYXZjdHgtPmJsb2NrX2FsaWduID0gR1NNX0JMT0NLX1NJWkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfR1NNX01TOgorICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSAgPSAyICogR1NNX0ZSQU1FX1NJWkU7CisgICAgICAgIGlmICghYXZjdHgtPmJsb2NrX2FsaWduKQorICAgICAgICAgICAgYXZjdHgtPmJsb2NrX2FsaWduID0gR1NNX01TX0JMT0NLX1NJWkU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChhdmN0eC0+YmxvY2tfYWxpZ24gPCBNU05fTUlOX0JMT0NLX1NJWkUgfHwKKyAgICAgICAgICAgICAgICBhdmN0eC0+YmxvY2tfYWxpZ24gPiBHU01fTVNfQkxPQ0tfU0laRSAgfHwKKyAgICAgICAgICAgICAgICAoYXZjdHgtPmJsb2NrX2FsaWduIC0gTVNOX01JTl9CTE9DS19TSVpFKSAlIDMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYmxvY2sgYWxpZ25tZW50ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+YmxvY2tfYWxpZ24pOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcmVzOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgaW50MTZfdCAqc2FtcGxlczsKKworICAgIGlmIChidWZfc2l6ZSA8IGF2Y3R4LT5ibG9ja19hbGlnbikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCBpcyB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gYXZjdHgtPmZyYW1lX3NpemU7CisgICAgaWYgKChyZXMgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBzYW1wbGVzID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9HU006CisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJ1Zl9zaXplICogOCk7CisgICAgICAgIGlmIChnZXRfYml0cygmZ2IsIDQpICE9IDB4ZCkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJNaXNzaW5nIEdTTSBtYWdpYyFcbiIpOworICAgICAgICByZXMgPSBnc21fZGVjb2RlX2Jsb2NrKGF2Y3R4LCBzYW1wbGVzLCAmZ2IsIEdTTV8xMzAwMCk7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9HU01fTVM6CisgICAgICAgIHJlcyA9IGZmX21zZ3NtX2RlY29kZV9ibG9jayhhdmN0eCwgc2FtcGxlcywgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdTTV9NU19CTE9DS19TSVpFIC0gYXZjdHgtPmJsb2NrX2FsaWduKSAvIDMpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGF2Y3R4LT5ibG9ja19hbGlnbjsKK30KKworc3RhdGljIHZvaWQgZ3NtX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBHU01Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBtZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7Cit9CisKKyNpZiBDT05GSUdfR1NNX0RFQ09ERVIKK0FWQ29kZWMgZmZfZ3NtX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImdzbSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdTTSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9HU00sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEdTTUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGdzbV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGdzbV9kZWNvZGVfZnJhbWUsCisgICAgLmZsdXNoICAgICAgICAgID0gZ3NtX2ZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCisjaWYgQ09ORklHX0dTTV9NU19ERUNPREVSCitBVkNvZGVjIGZmX2dzbV9tc19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJnc21fbXMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHU00gTWljcm9zb2Z0IHZhcmlhbnQiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfR1NNX01TLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihHU01Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBnc21faW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBnc21fZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IGdzbV9mbHVzaCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZ3NtZGVjX2RhdGEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2dzbWRlY19kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwYzY5YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2dzbWRlY19kYXRhLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBnc20gMDYuMTAgZGVjb2RlciBkYXRhCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImdzbWRlY19kYXRhLmgiCisKK2NvbnN0IHVpbnQxNl90IGZmX2dzbV9sb25nX3Rlcm1fZ2Fpbl90YWJbNF0gPSB7CisgICAgMzI3NywgMTE0NjksIDIxMjk5LCAzMjc2NworfTsKKworY29uc3QgaW50MTZfdCBmZl9nc21fZGVxdWFudF90YWJbNjRdWzhdID0geworICAgIHsgICAtMjgsICAgIC0yMCwgICAgLTEyLCAgICAgLTQsICAgICAgNCwgICAgIDEyLCAgICAgMjAsICAgICAyOH0sCisgICAgeyAgIC01NiwgICAgLTQwLCAgICAtMjQsICAgICAtOCwgICAgICA4LCAgICAgMjQsICAgICA0MCwgICAgIDU2fSwKKyAgICB7ICAgLTg0LCAgICAtNjAsICAgIC0zNiwgICAgLTEyLCAgICAgMTIsICAgICAzNiwgICAgIDYwLCAgICAgODR9LAorICAgIHsgIC0xMTIsICAgIC04MCwgICAgLTQ4LCAgICAtMTYsICAgICAxNiwgICAgIDQ4LCAgICAgODAsICAgIDExMn0sCisgICAgeyAgLTE0MCwgICAtMTAwLCAgICAtNjAsICAgIC0yMCwgICAgIDIwLCAgICAgNjAsICAgIDEwMCwgICAgMTQwfSwKKyAgICB7ICAtMTY4LCAgIC0xMjAsICAgIC03MiwgICAgLTI0LCAgICAgMjQsICAgICA3MiwgICAgMTIwLCAgICAxNjh9LAorICAgIHsgIC0xOTYsICAgLTE0MCwgICAgLTg0LCAgICAtMjgsICAgICAyOCwgICAgIDg0LCAgICAxNDAsICAgIDE5Nn0sCisgICAgeyAgLTIyNCwgICAtMTYwLCAgICAtOTYsICAgIC0zMiwgICAgIDMyLCAgICAgOTYsICAgIDE2MCwgICAgMjI0fSwKKyAgICB7ICAtMjUyLCAgIC0xODAsICAgLTEwOCwgICAgLTM2LCAgICAgMzYsICAgIDEwOCwgICAgMTgwLCAgICAyNTJ9LAorICAgIHsgIC0yODAsICAgLTIwMCwgICAtMTIwLCAgICAtNDAsICAgICA0MCwgICAgMTIwLCAgICAyMDAsICAgIDI4MH0sCisgICAgeyAgLTMwOCwgICAtMjIwLCAgIC0xMzIsICAgIC00NCwgICAgIDQ0LCAgICAxMzIsICAgIDIyMCwgICAgMzA4fSwKKyAgICB7ICAtMzM2LCAgIC0yNDAsICAgLTE0NCwgICAgLTQ4LCAgICAgNDgsICAgIDE0NCwgICAgMjQwLCAgICAzMzZ9LAorICAgIHsgIC0zNjQsICAgLTI2MCwgICAtMTU2LCAgICAtNTIsICAgICA1MiwgICAgMTU2LCAgICAyNjAsICAgIDM2NH0sCisgICAgeyAgLTM5MiwgICAtMjgwLCAgIC0xNjgsICAgIC01NiwgICAgIDU2LCAgICAxNjgsICAgIDI4MCwgICAgMzkyfSwKKyAgICB7ICAtNDIwLCAgIC0zMDAsICAgLTE4MCwgICAgLTYwLCAgICAgNjAsICAgIDE4MCwgICAgMzAwLCAgICA0MjB9LAorICAgIHsgIC00NDgsICAgLTMyMCwgICAtMTkyLCAgICAtNjQsICAgICA2NCwgICAgMTkyLCAgICAzMjAsICAgIDQ0OH0sCisgICAgeyAgLTUwNCwgICAtMzYwLCAgIC0yMTYsICAgIC03MiwgICAgIDcyLCAgICAyMTYsICAgIDM2MCwgICAgNTA0fSwKKyAgICB7ICAtNTYwLCAgIC00MDAsICAgLTI0MCwgICAgLTgwLCAgICAgODAsICAgIDI0MCwgICAgNDAwLCAgICA1NjB9LAorICAgIHsgIC02MTYsICAgLTQ0MCwgICAtMjY0LCAgICAtODgsICAgICA4OCwgICAgMjY0LCAgICA0NDAsICAgIDYxNn0sCisgICAgeyAgLTY3MiwgICAtNDgwLCAgIC0yODgsICAgIC05NiwgICAgIDk2LCAgICAyODgsICAgIDQ4MCwgICAgNjcyfSwKKyAgICB7ICAtNzI4LCAgIC01MjAsICAgLTMxMiwgICAtMTA0LCAgICAxMDQsICAgIDMxMiwgICAgNTIwLCAgICA3Mjh9LAorICAgIHsgIC03ODQsICAgLTU2MCwgICAtMzM2LCAgIC0xMTIsICAgIDExMiwgICAgMzM2LCAgICA1NjAsICAgIDc4NH0sCisgICAgeyAgLTg0MCwgICAtNjAwLCAgIC0zNjAsICAgLTEyMCwgICAgMTIwLCAgICAzNjAsICAgIDYwMCwgICAgODQwfSwKKyAgICB7ICAtODk2LCAgIC02NDAsICAgLTM4NCwgICAtMTI4LCAgICAxMjgsICAgIDM4NCwgICAgNjQwLCAgICA4OTZ9LAorICAgIHsgLTEwMDgsICAgLTcyMCwgICAtNDMyLCAgIC0xNDQsICAgIDE0NCwgICAgNDMyLCAgICA3MjAsICAgMTAwOH0sCisgICAgeyAtMTEyMCwgICAtODAwLCAgIC00ODAsICAgLTE2MCwgICAgMTYwLCAgICA0ODAsICAgIDgwMCwgICAxMTIwfSwKKyAgICB7IC0xMjMyLCAgIC04ODAsICAgLTUyOCwgICAtMTc2LCAgICAxNzYsICAgIDUyOCwgICAgODgwLCAgIDEyMzJ9LAorICAgIHsgLTEzNDQsICAgLTk2MCwgICAtNTc2LCAgIC0xOTIsICAgIDE5MiwgICAgNTc2LCAgICA5NjAsICAgMTM0NH0sCisgICAgeyAtMTQ1NiwgIC0xMDQwLCAgIC02MjQsICAgLTIwOCwgICAgMjA4LCAgICA2MjQsICAgMTA0MCwgICAxNDU2fSwKKyAgICB7IC0xNTY4LCAgLTExMjAsICAgLTY3MiwgICAtMjI0LCAgICAyMjQsICAgIDY3MiwgICAxMTIwLCAgIDE1Njh9LAorICAgIHsgLTE2ODAsICAtMTIwMCwgICAtNzIwLCAgIC0yNDAsICAgIDI0MCwgICAgNzIwLCAgIDEyMDAsICAgMTY4MH0sCisgICAgeyAtMTc5MiwgIC0xMjgwLCAgIC03NjgsICAgLTI1NiwgICAgMjU2LCAgICA3NjgsICAgMTI4MCwgICAxNzkyfSwKKyAgICB7IC0yMDE2LCAgLTE0NDAsICAgLTg2NCwgICAtMjg4LCAgICAyODgsICAgIDg2NCwgICAxNDQwLCAgIDIwMTZ9LAorICAgIHsgLTIyNDAsICAtMTYwMCwgICAtOTYwLCAgIC0zMjAsICAgIDMyMCwgICAgOTYwLCAgIDE2MDAsICAgMjI0MH0sCisgICAgeyAtMjQ2NCwgIC0xNzYwLCAgLTEwNTYsICAgLTM1MiwgICAgMzUyLCAgIDEwNTYsICAgMTc2MCwgICAyNDY0fSwKKyAgICB7IC0yNjg4LCAgLTE5MjAsICAtMTE1MiwgICAtMzg0LCAgICAzODQsICAgMTE1MiwgICAxOTIwLCAgIDI2ODh9LAorICAgIHsgLTI5MTIsICAtMjA4MCwgIC0xMjQ4LCAgIC00MTYsICAgIDQxNiwgICAxMjQ4LCAgIDIwODAsICAgMjkxMn0sCisgICAgeyAtMzEzNiwgIC0yMjQwLCAgLTEzNDQsICAgLTQ0OCwgICAgNDQ4LCAgIDEzNDQsICAgMjI0MCwgICAzMTM2fSwKKyAgICB7IC0zMzYwLCAgLTI0MDAsICAtMTQ0MCwgICAtNDgwLCAgICA0ODAsICAgMTQ0MCwgICAyNDAwLCAgIDMzNjB9LAorICAgIHsgLTM1ODQsICAtMjU2MCwgIC0xNTM2LCAgIC01MTIsICAgIDUxMiwgICAxNTM2LCAgIDI1NjAsICAgMzU4NH0sCisgICAgeyAtNDAzMiwgIC0yODgwLCAgLTE3MjgsICAgLTU3NiwgICAgNTc2LCAgIDE3MjgsICAgMjg4MCwgICA0MDMyfSwKKyAgICB7IC00NDgwLCAgLTMyMDAsICAtMTkyMCwgICAtNjQwLCAgICA2NDAsICAgMTkyMCwgICAzMjAwLCAgIDQ0ODB9LAorICAgIHsgLTQ5MjgsICAtMzUyMCwgIC0yMTEyLCAgIC03MDQsICAgIDcwNCwgICAyMTEyLCAgIDM1MjAsICAgNDkyOH0sCisgICAgeyAtNTM3NiwgIC0zODQwLCAgLTIzMDQsICAgLTc2OCwgICAgNzY4LCAgIDIzMDQsICAgMzg0MCwgICA1Mzc2fSwKKyAgICB7IC01ODI0LCAgLTQxNjAsICAtMjQ5NiwgICAtODMyLCAgICA4MzIsICAgMjQ5NiwgICA0MTYwLCAgIDU4MjR9LAorICAgIHsgLTYyNzIsICAtNDQ4MCwgIC0yNjg4LCAgIC04OTYsICAgIDg5NiwgICAyNjg4LCAgIDQ0ODAsICAgNjI3Mn0sCisgICAgeyAtNjcyMCwgIC00ODAwLCAgLTI4ODAsICAgLTk2MCwgICAgOTYwLCAgIDI4ODAsICAgNDgwMCwgICA2NzIwfSwKKyAgICB7IC03MTY4LCAgLTUxMjAsICAtMzA3MiwgIC0xMDI0LCAgIDEwMjQsICAgMzA3MiwgICA1MTIwLCAgIDcxNjh9LAorICAgIHsgLTgwNjMsICAtNTc1OSwgIC0zNDU2LCAgLTExNTIsICAgMTE1MiwgICAzNDU2LCAgIDU3NjAsICAgODA2NH0sCisgICAgeyAtODk1OSwgIC02Mzk5LCAgLTM4NDAsICAtMTI4MCwgICAxMjgwLCAgIDM4NDAsICAgNjQwMCwgICA4OTYwfSwKKyAgICB7IC05ODU1LCAgLTcwMzksICAtNDIyNCwgIC0xNDA4LCAgIDE0MDgsICAgNDIyNCwgICA3MDQwLCAgIDk4NTZ9LAorICAgIHstMTA3NTEsICAtNzY3OSwgIC00NjA4LCAgLTE1MzYsICAgMTUzNiwgICA0NjA4LCAgIDc2ODAsICAxMDc1Mn0sCisgICAgey0xMTY0NywgIC04MzE5LCAgLTQ5OTIsICAtMTY2NCwgICAxNjY0LCAgIDQ5OTIsICAgODMyMCwgIDExNjQ4fSwKKyAgICB7LTEyNTQzLCAgLTg5NTksICAtNTM3NiwgIC0xNzkyLCAgIDE3OTIsICAgNTM3NiwgICA4OTYwLCAgMTI1NDR9LAorICAgIHstMTM0MzksICAtOTU5OSwgIC01NzYwLCAgLTE5MjAsICAgMTkyMCwgICA1NzYwLCAgIDk2MDAsICAxMzQ0MH0sCisgICAgey0xNDMzNSwgLTEwMjM5LCAgLTYxNDQsICAtMjA0OCwgICAyMDQ4LCAgIDYxNDQsICAxMDI0MCwgIDE0MzM2fSwKKyAgICB7LTE2MTI3LCAtMTE1MTksICAtNjkxMiwgIC0yMzA0LCAgIDIzMDQsICAgNjkxMiwgIDExNTE5LCAgMTYxMjd9LAorICAgIHstMTc5MTksIC0xMjc5OSwgIC03NjgwLCAgLTI1NjAsICAgMjU2MCwgICA3NjgwLCAgMTI3OTksICAxNzkxOX0sCisgICAgey0xOTcxMSwgLTE0MDc5LCAgLTg0NDgsICAtMjgxNiwgICAyODE2LCAgIDg0NDgsICAxNDA3OSwgIDE5NzExfSwKKyAgICB7LTIxNTAzLCAtMTUzNTksICAtOTIxNiwgIC0zMDcyLCAgIDMwNzIsICAgOTIxNiwgIDE1MzU5LCAgMjE1MDN9LAorICAgIHstMjMyOTUsIC0xNjYzOSwgIC05OTg0LCAgLTMzMjgsICAgMzMyOCwgICA5OTg0LCAgMTY2MzksICAyMzI5NX0sCisgICAgey0yNTA4NywgLTE3OTE5LCAtMTA3NTIsICAtMzU4NCwgICAzNTg0LCAgMTA3NTIsICAxNzkxOSwgIDI1MDg3fSwKKyAgICB7LTI2ODc5LCAtMTkxOTksIC0xMTUyMCwgIC0zODQwLCAgIDM4NDAsICAxMTUyMCwgIDE5MTk5LCAgMjY4Nzl9LAorICAgIHstMjg2NzEsIC0yMDQ3OSwgLTEyMjg4LCAgLTQwOTYsICAgNDA5NiwgIDEyMjg4LCAgMjA0NzksICAyODY3MX0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgYXBjbV9iaXRzWzExXVsxM10gPSB7CisgICAgeyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH0sCisgICAgeyAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH0sCisgICAgeyAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH0sCisgICAgeyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxIH0sCisgICAgeyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxIH0sCisgICAgeyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyIH0sCisgICAgeyAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyIH0sCisgICAgeyAzLCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyIH0sCisgICAgeyAzLCAzLCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyIH0sCisgICAgeyAzLCAzLCAzLCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyIH0sCisgICAgeyAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0KK307CisKK2NvbnN0IGludCogY29uc3QgZmZfZ3NtX2FwY21fYml0c1tdWzRdID0geworICAgIHsgYXBjbV9iaXRzWzEwXSwgYXBjbV9iaXRzWzEwXSwgYXBjbV9iaXRzWzEwXSwgYXBjbV9iaXRzWzEwXSB9LCAvLyAxMzAwMAorICAgIHsgYXBjbV9iaXRzWzEwXSwgYXBjbV9iaXRzWzEwXSwgYXBjbV9iaXRzWzEwXSwgYXBjbV9iaXRzWyA2XSB9LCAvLyAxMjQwMAorICAgIHsgYXBjbV9iaXRzWzEwXSwgYXBjbV9iaXRzWzEwXSwgYXBjbV9iaXRzWyA3XSwgYXBjbV9iaXRzWyA1XSB9LCAvLyAxMTgwMAorICAgIHsgYXBjbV9iaXRzWzEwXSwgYXBjbV9iaXRzWyA4XSwgYXBjbV9iaXRzWyA1XSwgYXBjbV9iaXRzWyA1XSB9LCAvLyAxMTIwMAorICAgIHsgYXBjbV9iaXRzWyA5XSwgYXBjbV9iaXRzWyA1XSwgYXBjbV9iaXRzWyA1XSwgYXBjbV9iaXRzWyA1XSB9LCAvLyAxMDYwMAorICAgIHsgYXBjbV9iaXRzWyA1XSwgYXBjbV9iaXRzWyA1XSwgYXBjbV9iaXRzWyA1XSwgYXBjbV9iaXRzWyAxXSB9LCAvLyAxMDAwMAorICAgIHsgYXBjbV9iaXRzWyA1XSwgYXBjbV9iaXRzWyA1XSwgYXBjbV9iaXRzWyAyXSwgYXBjbV9iaXRzWyAwXSB9LCAvLyAgOTQwMAorICAgIHsgYXBjbV9iaXRzWyA1XSwgYXBjbV9iaXRzWyAzXSwgYXBjbV9iaXRzWyAwXSwgYXBjbV9iaXRzWyAwXSB9LCAvLyAgODgwMAorICAgIHsgYXBjbV9iaXRzWyA0XSwgYXBjbV9iaXRzWyAwXSwgYXBjbV9iaXRzWyAwXSwgYXBjbV9iaXRzWyAwXSB9LCAvLyAgODIwMAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2dzbWRlY19kYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9nc21kZWNfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzE5NGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9nc21kZWNfZGF0YS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBnc20gMDYuMTAgZGVjb2RlciBkYXRhCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0dTTURFQ19EQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19HU01ERUNfREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKK3R5cGVkZWYgc3RydWN0IEdTTUNvbnRleHQgeworICAgIC8vIENvbnRhaW5zIGZpcnN0IDEyMCBlbGVtZW50cyBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZQorICAgIC8vICh1c2VkIGJ5IGxvbmdfdGVybV9zeW50aCBhY2NvcmRpbmcgdG8gdGhlICJsYWciKSwKKyAgICAvLyB0aGVuIGluIHRoZSBmb2xsb3dpbmcgMTYwIGVsZW1lbnRzIHRoZSBjdXJyZW50CisgICAgLy8gZnJhbWUgaXMgY29uc3RydWN0ZWQuCisgICAgaW50MTZfdCByZWZfYnVmWzI4MF07CisgICAgaW50IHZbOV07CisgICAgaW50IGxhclsyXVs4XTsKKyAgICBpbnQgbGFyX2lkeDsKKyAgICBpbnQgbXNyOworfSBHU01Db250ZXh0OworCitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfZ3NtX2xvbmdfdGVybV9nYWluX3RhYls0XTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX2dzbV9kZXF1YW50X3RhYls2NF1bOF07CisKK2V4dGVybiBjb25zdCBpbnQqIGNvbnN0IGZmX2dzbV9hcGNtX2JpdHNbXVs0XTsKKworI2VuZGlmIC8qIEFWQ09ERUNfR1NNREVDX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvZ3NtZGVjX3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9nc21kZWNfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzYwODEzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvZ3NtZGVjX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBnc20gMDYuMTAgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEdTTSBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZ3NtLmgiCisjaW5jbHVkZSAiZ3NtZGVjX2RhdGEuaCIKKworc3RhdGljIGNvbnN0IGludCByZXF1YW50X3RhYls0XVs4XSA9IHsKKyAgICB7IDAgfSwKKyAgICB7IDAsIDcgfSwKKyAgICB7IDAsIDIsIDUsIDcgfSwKKyAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcgfQorfTsKKworc3RhdGljIHZvaWQgYXBjbV9kZXF1YW50X2FkZChHZXRCaXRDb250ZXh0ICpnYiwgaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKmZyYW1lX2JpdHMpCit7CisgICAgaW50IGksIHZhbDsKKyAgICBpbnQgbWF4aWR4ID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgIGNvbnN0IGludDE2X3QgKnRhYiA9IGZmX2dzbV9kZXF1YW50X3RhYlttYXhpZHhdOworICAgIGZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKSB7CisgICAgICAgIHZhbCA9IGdldF9iaXRzKGdiLCBmcmFtZV9iaXRzW2ldKTsKKyAgICAgICAgZHN0WzMqaV0gKz0gdGFiW3JlcXVhbnRfdGFiW2ZyYW1lX2JpdHNbaV1dW3ZhbF1dOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgZ3NtX211bHQoaW50IGEsIGludCBiKQoreworICAgIHJldHVybiAoYSAqIGIgKyAoMSA8PCAxNCkpID4+IDE1OworfQorCitzdGF0aWMgdm9pZCBsb25nX3Rlcm1fc3ludGgoaW50MTZfdCAqZHN0LCBpbnQgbGFnLCBpbnQgZ2Fpbl9pZHgpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgaW50MTZfdCAqc3JjID0gZHN0IC0gbGFnOworICAgIHVpbnQxNl90IGdhaW4gPSBmZl9nc21fbG9uZ190ZXJtX2dhaW5fdGFiW2dhaW5faWR4XTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykKKyAgICAgICAgZHN0W2ldID0gZ3NtX211bHQoZ2Fpbiwgc3JjW2ldKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX2xvZ19hcmVhKGludCBjb2RlZCwgaW50IGZhY3RvciwgaW50IG9mZnNldCkKK3sKKyAgICBjb2RlZCA8PD0gMTA7CisgICAgY29kZWQgLT0gb2Zmc2V0OworICAgIHJldHVybiBnc21fbXVsdChjb2RlZCwgZmFjdG9yKSA8PCAxOworfQorCitzdGF0aWMgYXZfbm9pbmxpbmUgaW50IGdldF9ycnAoaW50IGZpbHRlcmVkKQoreworICAgIGludCBhYnMgPSBGRkFCUyhmaWx0ZXJlZCk7CisgICAgaWYgICAgICAoYWJzIDwgMTEwNTkpIGFicyA8PD0gMTsKKyAgICBlbHNlIGlmIChhYnMgPCAyMDA3MCkgYWJzICs9IDExMDU5OworICAgIGVsc2UgICAgICAgICAgICAgICAgICBhYnMgPSAoYWJzID4+IDIpICsgMjYxMTI7CisgICAgcmV0dXJuIGZpbHRlcmVkIDwgMCA/IC1hYnMgOiBhYnM7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX3ZhbHVlKGludCBpbiwgaW50IHJycFs4XSwgaW50IHZbOV0pCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaW4gLT0gZ3NtX211bHQocnJwW2ldLCB2W2ldKTsKKyAgICAgICAgdltpICsgMV0gPSB2W2ldICsgZ3NtX211bHQocnJwW2ldLCBpbik7CisgICAgfQorICAgIHZbMF0gPSBpbjsKKyAgICByZXR1cm4gaW47Cit9CisKK3N0YXRpYyB2b2lkIHNob3J0X3Rlcm1fc3ludGgoR1NNQ29udGV4dCAqY3R4LCBpbnQxNl90ICpkc3QsIGNvbnN0IGludDE2X3QgKnNyYykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcnJwWzhdOworICAgIGludCAqbGFyID0gY3R4LT5sYXJbY3R4LT5sYXJfaWR4XTsKKyAgICBpbnQgKmxhcl9wcmV2ID0gY3R4LT5sYXJbY3R4LT5sYXJfaWR4IF4gMV07CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgcnJwW2ldID0gZ2V0X3JycCgobGFyX3ByZXZbaV0gPj4gMikgKyAobGFyX3ByZXZbaV0gPj4gMSkgKyAobGFyW2ldID4+IDIpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykKKyAgICAgICAgZHN0W2ldID0gZmlsdGVyX3ZhbHVlKHNyY1tpXSwgcnJwLCBjdHgtPnYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgcnJwW2ldID0gZ2V0X3JycCgobGFyX3ByZXZbaV0gPj4gMSkgKyAobGFyICAgICBbaV0gPj4gMSkpOworICAgIGZvciAoaSA9IDEzOyBpIDwgMjc7IGkrKykKKyAgICAgICAgZHN0W2ldID0gZmlsdGVyX3ZhbHVlKHNyY1tpXSwgcnJwLCBjdHgtPnYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgcnJwW2ldID0gZ2V0X3JycCgobGFyX3ByZXZbaV0gPj4gMikgKyAobGFyICAgICBbaV0gPj4gMSkgKyAobGFyW2ldID4+IDIpKTsKKyAgICBmb3IgKGkgPSAyNzsgaSA8IDQwOyBpKyspCisgICAgICAgIGRzdFtpXSA9IGZpbHRlcl92YWx1ZShzcmNbaV0sIHJycCwgY3R4LT52KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHJycFtpXSA9IGdldF9ycnAobGFyW2ldKTsKKyAgICBmb3IgKGkgPSA0MDsgaSA8IDE2MDsgaSsrKQorICAgICAgICBkc3RbaV0gPSBmaWx0ZXJfdmFsdWUoc3JjW2ldLCBycnAsIGN0eC0+dik7CisKKyAgICBjdHgtPmxhcl9pZHggXj0gMTsKK30KKworc3RhdGljIGludCBwb3N0cHJvY2VzcyhpbnQxNl90ICpkYXRhLCBpbnQgbXNyKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjA7IGkrKykgeworICAgICAgICBtc3IgPSBhdl9jbGlwX2ludDE2KGRhdGFbaV0gKyBnc21fbXVsdChtc3IsIDI4MTgwKSk7CisgICAgICAgIGRhdGFbaV0gPSBhdl9jbGlwX2ludDE2KG1zciA8PCAxKSAmIH43OworICAgIH0KKyAgICByZXR1cm4gbXNyOworfQorCitzdGF0aWMgaW50IGdzbV9kZWNvZGVfYmxvY2soQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQxNl90ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiLCBpbnQgbW9kZSkKK3sKKyAgICBHU01Db250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworICAgIGludDE2X3QgKnJlZl9kc3QgPSBjdHgtPnJlZl9idWYgKyAxMjA7CisgICAgaW50ICpsYXIgPSBjdHgtPmxhcltjdHgtPmxhcl9pZHhdOworICAgIGxhclswXSA9IGRlY29kZV9sb2dfYXJlYShnZXRfYml0cyhnYiwgNiksIDEzMTA3LCAgMSA8PCAxNSk7CisgICAgbGFyWzFdID0gZGVjb2RlX2xvZ19hcmVhKGdldF9iaXRzKGdiLCA2KSwgMTMxMDcsICAxIDw8IDE1KTsKKyAgICBsYXJbMl0gPSBkZWNvZGVfbG9nX2FyZWEoZ2V0X2JpdHMoZ2IsIDUpLCAxMzEwNywgKDEgPDwgMTQpICsgMjA0OCoyKTsKKyAgICBsYXJbM10gPSBkZWNvZGVfbG9nX2FyZWEoZ2V0X2JpdHMoZ2IsIDUpLCAxMzEwNywgKDEgPDwgMTQpIC0gMjU2MCoyKTsKKyAgICBsYXJbNF0gPSBkZWNvZGVfbG9nX2FyZWEoZ2V0X2JpdHMoZ2IsIDQpLCAxOTIyMywgKDEgPDwgMTMpICsgICA5NCoyKTsKKyAgICBsYXJbNV0gPSBkZWNvZGVfbG9nX2FyZWEoZ2V0X2JpdHMoZ2IsIDQpLCAxNzQ3NiwgKDEgPDwgMTMpIC0gMTc5MioyKTsKKyAgICBsYXJbNl0gPSBkZWNvZGVfbG9nX2FyZWEoZ2V0X2JpdHMoZ2IsIDMpLCAzMTQ1NCwgKDEgPDwgMTIpIC0gIDM0MSoyKTsKKyAgICBsYXJbN10gPSBkZWNvZGVfbG9nX2FyZWEoZ2V0X2JpdHMoZ2IsIDMpLCAyOTcwOCwgKDEgPDwgMTIpIC0gMTE0NCoyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaW50IGxhZyAgICAgID0gZ2V0X2JpdHMoZ2IsIDcpOworICAgICAgICBpbnQgZ2Fpbl9pZHggPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIGludCBvZmZzZXQgICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgbGFnID0gYXZfY2xpcChsYWcsIDQwLCAxMjApOworICAgICAgICBsb25nX3Rlcm1fc3ludGgocmVmX2RzdCwgbGFnLCBnYWluX2lkeCk7CisgICAgICAgIGFwY21fZGVxdWFudF9hZGQoZ2IsIHJlZl9kc3QgKyBvZmZzZXQsIGZmX2dzbV9hcGNtX2JpdHNbbW9kZV1baV0pOworICAgICAgICByZWZfZHN0ICs9IDQwOworICAgIH0KKyAgICBtZW1jcHkoY3R4LT5yZWZfYnVmLCBjdHgtPnJlZl9idWYgKyAxNjAsIDEyMCAqIHNpemVvZigqY3R4LT5yZWZfYnVmKSk7CisgICAgc2hvcnRfdGVybV9zeW50aChjdHgsIHNhbXBsZXMsIGN0eC0+cmVmX2J1ZiArIDEyMCk7CisgICAgLy8gZm9yIG9wdGltYWwgc3BlZWQgdGhpcyBjb3VsZCBiZSBtZXJnZWQgd2l0aCBzaG9ydF90ZXJtX3N5bnRoLAorICAgIC8vIG5vdCBkb25lIHlldCBiZWNhdXNlIGl0IGlzIGEgYml0IHVnbHkKKyAgICBjdHgtPm1zciA9IHBvc3Rwcm9jZXNzKHNhbXBsZXMsIGN0eC0+bXNyKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODM2OTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2MS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBIMjYxIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDA0IE1hYXJ0ZW4gRGFuaWVscworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBoMjYxY29kZWMuCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJoMjYxLmgiCisKKyNkZWZpbmUgSVNfRklMKGEpICAgICgoYSkgJiBNQl9UWVBFX0gyNjFfRklMKQorCit1aW50OF90IGZmX2gyNjFfcmxfdGFibGVfc3RvcmVbMl1bMiAqIE1BWF9SVU4gKyBNQVhfTEVWRUwgKyAzXTsKKworc3RhdGljIHZvaWQgaDI2MV9sb29wX2ZpbHRlcih1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCit7CisgICAgaW50IHgsIHksIHh5LCB5ejsKKyAgICBpbnQgdGVtcFs2NF07CisKKyAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7CisgICAgICAgIHRlbXBbeF0gICAgICAgICA9IDQgKiBzcmNbeF07CisgICAgICAgIHRlbXBbeCArIDcgKiA4XSA9IDQgKiBzcmNbeCArIDcgKiBzdHJpZGVdOworICAgIH0KKyAgICBmb3IgKHkgPSAxOyB5IDwgNzsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKyAgICAgICAgICAgIHh5ICAgICAgID0geSAqIHN0cmlkZSArIHg7CisgICAgICAgICAgICB5eiAgICAgICA9IHkgKiA4ICAgICAgKyB4OworICAgICAgICAgICAgdGVtcFt5el0gPSBzcmNbeHkgLSBzdHJpZGVdICsgMiAqIHNyY1t4eV0gKyBzcmNbeHkgKyBzdHJpZGVdOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBzcmNbeSAqIHN0cmlkZV0gICAgID0gKHRlbXBbeSAqIDhdICAgICArIDIpID4+IDI7CisgICAgICAgIHNyY1t5ICogc3RyaWRlICsgN10gPSAodGVtcFt5ICogOCArIDddICsgMikgPj4gMjsKKyAgICAgICAgZm9yICh4ID0gMTsgeCA8IDc7IHgrKykgeworICAgICAgICAgICAgeHkgICAgICA9IHkgKiBzdHJpZGUgKyB4OworICAgICAgICAgICAgeXogICAgICA9IHkgKiA4ICAgICAgKyB4OworICAgICAgICAgICAgc3JjW3h5XSA9ICh0ZW1wW3l6IC0gMV0gKyAyICogdGVtcFt5el0gKyB0ZW1wW3l6ICsgMV0gKyA4KSA+PiA0OworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZmX2gyNjFfbG9vcF9maWx0ZXIoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgSDI2MUNvbnRleHQgKmggICAgICAgPSAoSDI2MUNvbnRleHQgKilzOworICAgIGNvbnN0IGludCBsaW5lc2l6ZSAgID0gcy0+bGluZXNpemU7CisgICAgY29uc3QgaW50IHV2bGluZXNpemUgPSBzLT51dmxpbmVzaXplOworICAgIHVpbnQ4X3QgKmRlc3RfeSAgICAgID0gcy0+ZGVzdFswXTsKKyAgICB1aW50OF90ICpkZXN0X2NiICAgICA9IHMtPmRlc3RbMV07CisgICAgdWludDhfdCAqZGVzdF9jciAgICAgPSBzLT5kZXN0WzJdOworCisgICAgaWYgKCEoSVNfRklMKGgtPm10eXBlKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGgyNjFfbG9vcF9maWx0ZXIoZGVzdF95LCAgICAgICAgICAgICAgICAgICAgbGluZXNpemUpOworICAgIGgyNjFfbG9vcF9maWx0ZXIoZGVzdF95ICsgOCwgICAgICAgICAgICAgICAgbGluZXNpemUpOworICAgIGgyNjFfbG9vcF9maWx0ZXIoZGVzdF95ICsgOCAqIGxpbmVzaXplLCAgICAgbGluZXNpemUpOworICAgIGgyNjFfbG9vcF9maWx0ZXIoZGVzdF95ICsgOCAqIGxpbmVzaXplICsgOCwgbGluZXNpemUpOworICAgIGgyNjFfbG9vcF9maWx0ZXIoZGVzdF9jYiwgdXZsaW5lc2l6ZSk7CisgICAgaDI2MV9sb29wX2ZpbHRlcihkZXN0X2NyLCB1dmxpbmVzaXplKTsKK30KKworYXZfY29sZCB2b2lkIGZmX2gyNjFfY29tbW9uX2luaXQodm9pZCkKK3sKKyAgICBzdGF0aWMgaW50IGRvbmUgPSAwOworCisgICAgaWYgKGRvbmUpCisgICAgICAgIHJldHVybjsKKworICAgIGZmX2luaXRfcmwoJmZmX2gyNjFfcmxfdGNvZWZmLCBmZl9oMjYxX3JsX3RhYmxlX3N0b3JlKTsKKyAgICBkb25lID0gMTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTg2NDYyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2MS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBIMjYxIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWFhcnRlbiBEYW5pZWxzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGgyNjFjb2RlYy4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSDI2MV9ICisjZGVmaW5lIEFWQ09ERUNfSDI2MV9ICisKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJybC5oIgorCisvKioKKyAqIEgyNjFDb250ZXh0CisgKi8KK3R5cGVkZWYgc3RydWN0IEgyNjFDb250ZXh0IHsKKyAgICBNcGVnRW5jQ29udGV4dCBzOworCisgICAgaW50IGN1cnJlbnRfbWJhOworICAgIGludCBtYmFfZGlmZjsKKyAgICBpbnQgbXR5cGU7CisgICAgaW50IGN1cnJlbnRfbXZfeDsKKyAgICBpbnQgY3VycmVudF9tdl95OworICAgIGludCBnb2JfbnVtYmVyOworICAgIGludCBnb2Jfc3RhcnRfY29kZV9za2lwcGVkOyAvLyAxIGlmIGdvYiBzdGFydCBjb2RlIGlzIGFscmVhZHkgcmVhZCBiZWZvcmUgZ29iIGhlYWRlciBpcyByZWFkCit9IEgyNjFDb250ZXh0OworCisjZGVmaW5lIE1CX1RZUEVfSDI2MV9GSUwgMHg4MDAwMDAKKworZXh0ZXJuIHVpbnQ4X3QgZmZfaDI2MV9ybF90YWJsZV9zdG9yZVsyXVsyICogTUFYX1JVTiArIE1BWF9MRVZFTCArIDNdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oMjYxX21iYV9jb2RlWzM1XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2gyNjFfbWJhX2JpdHNbMzVdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaDI2MV9tdHlwZV9jb2RlWzEwXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2gyNjFfbXR5cGVfYml0c1sxMF07CitleHRlcm4gY29uc3QgaW50ICAgICBmZl9oMjYxX210eXBlX21hcFsxMF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oMjYxX212X3RhYlsxN11bMl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oMjYxX2NicF90YWJbNjNdWzJdOworZXh0ZXJuIFJMVGFibGUgZmZfaDI2MV9ybF90Y29lZmY7CisKK3ZvaWQgZmZfaDI2MV9sb29wX2ZpbHRlcihNcGVnRW5jQ29udGV4dCAqcyk7Cit2b2lkIGZmX2gyNjFfY29tbW9uX2luaXQodm9pZCk7CisKK2ludCBmZl9oMjYxX2dldF9waWN0dXJlX2Zvcm1hdChpbnQgd2lkdGgsIGludCBoZWlnaHQpOwordm9pZCBmZl9oMjYxX3Jlb3JkZXJfbWJfaW5kZXgoTXBlZ0VuY0NvbnRleHQgKnMpOwordm9pZCBmZl9oMjYxX2VuY29kZV9tYihNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1s2XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feCwgaW50IG1vdGlvbl95KTsKK3ZvaWQgZmZfaDI2MV9lbmNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBwaWN0dXJlX251bWJlcik7Cit2b2lkIGZmX2gyNjFfZW5jb2RlX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpOworCisjZW5kaWYgLyogQVZDT0RFQ19IMjYxX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjFfcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjYxX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMzE1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjYxX3BhcnNlci5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBIMjYxIHBhcnNlcgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAwNCBNYWFydGVuIERhbmllbHMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaDI2MWNvZGVjLgorICovCisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKworc3RhdGljIGludCBoMjYxX2ZpbmRfZnJhbWVfZW5kKFBhcnNlQ29udGV4dCAqcGMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgdm9wX2ZvdW5kLCBpLCBqOworICAgIHVpbnQzMl90IHN0YXRlOworCisgICAgdm9wX2ZvdW5kID0gcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kOworICAgIHN0YXRlICAgICA9IHBjLT5zdGF0ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBidWZfc2l6ZSAmJiAhdm9wX2ZvdW5kOyBpKyspIHsKKyAgICAgICAgc3RhdGUgPSAoc3RhdGUgPDwgOCkgfCBidWZbaV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICAgIGlmICgoKHN0YXRlID4+IGopICYgMHhGRkZGRjApID09IDB4MDAwMTAwKSB7CisgICAgICAgICAgICAgICAgdm9wX2ZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodm9wX2ZvdW5kKSB7CisgICAgICAgIGZvciAoOyBpIDwgYnVmX3NpemU7IGkrKykgeworICAgICAgICAgICAgc3RhdGUgPSAoc3RhdGUgPDwgOCkgfCBidWZbaV07CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKCgoc3RhdGUgPj4gaikgJiAweEZGRkZGMCkgPT0gMHgwMDAxMDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcGMtPnN0YXRlICAgICAgICAgICAgID0gKHN0YXRlID4+ICgzICogOCkpICsgMHhGRjAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAtIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gdm9wX2ZvdW5kOworICAgIHBjLT5zdGF0ZSAgICAgICAgICAgICA9IHN0YXRlOworICAgIHJldHVybiBFTkRfTk9UX0ZPVU5EOworfQorCitzdGF0aWMgaW50IGgyNjFfcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBQYXJzZUNvbnRleHQgKnBjID0gcy0+cHJpdl9kYXRhOworICAgIGludCBuZXh0OworCisgICAgaWYgKHMtPmZsYWdzICYgUEFSU0VSX0ZMQUdfQ09NUExFVEVfRlJBTUVTKSB7CisgICAgICAgIG5leHQgPSBidWZfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXh0ID0gaDI2MV9maW5kX2ZyYW1lX2VuZChwYywgYXZjdHgsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICBpZiAoZmZfY29tYmluZV9mcmFtZShwYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgICAgICpwb3V0YnVmICAgICAgPSBOVUxMOworICAgICAgICAgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBvdXRidWYgICAgICA9IGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK0FWQ29kZWNQYXJzZXIgZmZfaDI2MV9wYXJzZXIgPSB7CisgICAgLmNvZGVjX2lkcyAgICAgID0geyBBVl9DT0RFQ19JRF9IMjYxIH0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFBhcnNlQ29udGV4dCksCisgICAgLnBhcnNlcl9wYXJzZSAgID0gaDI2MV9wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjYxZGF0YS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2MWRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg5MWVkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2MWRhdGEuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiBjb3B5cmlnaHQgKGMpIDIwMDQgTWFhcnRlbiBEYW5pZWxzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjYxIHRhYmxlcy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJybC5oIgorI2luY2x1ZGUgImgyNjEuaCIKKworLy8gSC4yNjEgVkxDIHRhYmxlIGZvciBtYWNyb2Jsb2NrIGFkZHJlc3NpbmcKK2NvbnN0IHVpbnQ4X3QgZmZfaDI2MV9tYmFfY29kZVszNV0gPSB7CisgICAgIDEsICAzLCAgMiwgIDMsCisgICAgIDIsICAzLCAgMiwgIDcsCisgICAgIDYsIDExLCAxMCwgIDksCisgICAgIDgsICA3LCAgNiwgMjMsCisgICAgMjIsIDIxLCAyMCwgMTksCisgICAgMTgsIDM1LCAzNCwgMzMsCisgICAgMzIsIDMxLCAzMCwgMjksCisgICAgMjgsIDI3LCAyNiwgMjUsCisgICAgMjQsCisgICAgMTUsIC8vIChNQkEgc3R1ZmZpbmcpCisgICAgIDEgIC8vIChzdGFydCBjb2RlKQorfTsKKworY29uc3QgdWludDhfdCBmZl9oMjYxX21iYV9iaXRzWzM1XSA9IHsKKyAgICAgMSwgIDMsICAzLCAgNCwKKyAgICAgNCwgIDUsICA1LCAgNywKKyAgICAgNywgIDgsICA4LCAgOCwKKyAgICAgOCwgIDgsICA4LCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwKKyAgICAxMSwgLy8gKE1CQSBzdHVmZmluZykKKyAgICAxNiAgLy8gKHN0YXJ0IGNvZGUpCit9OworCisvLyBILjI2MSBWTEMgdGFibGUgZm9yIG1hY3JvYmxvY2sgdHlwZQorY29uc3QgdWludDhfdCBmZl9oMjYxX210eXBlX2NvZGVbMTBdID0geworICAgIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwKKyAgICAxLCAxCit9OworCitjb25zdCB1aW50OF90IGZmX2gyNjFfbXR5cGVfYml0c1sxMF0gPSB7CisgICAgNCwgNywgIDEsIDUsCisgICAgOSwgOCwgMTAsIDMsCisgICAgMiwgNgorfTsKKworY29uc3QgaW50IGZmX2gyNjFfbXR5cGVfbWFwWzEwXSA9IHsKKyAgICBNQl9UWVBFX0lOVFJBNHg0LAorICAgIE1CX1RZUEVfSU5UUkE0eDQgfCBNQl9UWVBFX1FVQU5ULAorICAgIE1CX1RZUEVfQ0JQLAorICAgIE1CX1RZUEVfQ0JQIHwgTUJfVFlQRV9RVUFOVCwKKyAgICBNQl9UWVBFXzE2eDE2LAorICAgIE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0NCUCwKKyAgICBNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV9DQlAgfCBNQl9UWVBFX1FVQU5ULAorICAgIE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0gyNjFfRklMLAorICAgIE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0gyNjFfRklMIHwgTUJfVFlQRV9DQlAsCisgICAgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfSDI2MV9GSUwgfCBNQl9UWVBFX0NCUCB8IE1CX1RZUEVfUVVBTlQKK307CisKKy8vIEguMjYxIFZMQyB0YWJsZSBmb3IgbW90aW9uIHZlY3RvcnMKK2NvbnN0IHVpbnQ4X3QgZmZfaDI2MV9tdl90YWJbMTddWzJdID0geworICAgIHsgIDEsIDEgfSwgeyAgMSwgMiB9LCB7IDEsIDMgfSwgeyAgMSwgIDQgfSwgeyAgMywgIDYgfSwgeyAgNSwgIDcgfSwgeyAgNCwgIDcgfSwgeyAgMywgIDcgfSwKKyAgICB7IDExLCA5IH0sIHsgMTAsIDkgfSwgeyA5LCA5IH0sIHsgMTcsIDEwIH0sIHsgMTYsIDEwIH0sIHsgMTUsIDEwIH0sIHsgMTQsIDEwIH0sIHsgMTMsIDEwIH0sIHsgMTIsIDEwIH0KK307CisKKy8vIEguMjYxIFZMQyB0YWJsZSBmb3IgY29kZWQgYmxvY2sgcGF0dGVybgorY29uc3QgdWludDhfdCBmZl9oMjYxX2NicF90YWJbNjNdWzJdID0geworICAgIHsgMTEsIDUgfSwgeyAgOSwgNSB9LCB7IDEzLCA2IH0sIHsgMTMsIDQgfSwgeyAyMywgNyB9LCB7IDE5LCA3IH0sIHsgMzEsIDggfSwgeyAxMiwgNCB9LAorICAgIHsgMjIsIDcgfSwgeyAxOCwgNyB9LCB7IDMwLCA4IH0sIHsgMTksIDUgfSwgeyAyNywgOCB9LCB7IDIzLCA4IH0sIHsgMTksIDggfSwgeyAxMSwgNCB9LAorICAgIHsgMjEsIDcgfSwgeyAxNywgNyB9LCB7IDI5LCA4IH0sIHsgMTcsIDUgfSwgeyAyNSwgOCB9LCB7IDIxLCA4IH0sIHsgMTcsIDggfSwgeyAxNSwgNiB9LAorICAgIHsgMTUsIDggfSwgeyAxMywgOCB9LCB7ICAzLCA5IH0sIHsgMTUsIDUgfSwgeyAxMSwgOCB9LCB7ICA3LCA4IH0sIHsgIDcsIDkgfSwgeyAxMCwgNCB9LAorICAgIHsgMjAsIDcgfSwgeyAxNiwgNyB9LCB7IDI4LCA4IH0sIHsgMTQsIDYgfSwgeyAxNCwgOCB9LCB7IDEyLCA4IH0sIHsgIDIsIDkgfSwgeyAxNiwgNSB9LAorICAgIHsgMjQsIDggfSwgeyAyMCwgOCB9LCB7IDE2LCA4IH0sIHsgMTQsIDUgfSwgeyAxMCwgOCB9LCB7ICA2LCA4IH0sIHsgIDYsIDkgfSwgeyAxOCwgNSB9LAorICAgIHsgMjYsIDggfSwgeyAyMiwgOCB9LCB7IDE4LCA4IH0sIHsgMTMsIDUgfSwgeyAgOSwgOCB9LCB7ICA1LCA4IH0sIHsgIDUsIDkgfSwgeyAxMiwgNSB9LAorICAgIHsgIDgsIDggfSwgeyAgNCwgOCB9LCB7ICA0LCA5IH0sIHsgIDcsIDMgfSwgeyAxMCwgNSB9LCB7ICA4LCA1IH0sIHsgMTIsIDYgfQorfTsKKworLy8gSC4yNjEgVkxDIHRhYmxlIGZvciB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCitzdGF0aWMgY29uc3QgdWludDE2X3QgaDI2MV90Y29lZmZfdmxjWzY1XVsyXSA9IHsKKyAgICB7ICAweDIsICAyIH0sIHsgIDB4MywgIDIgfSwgeyAgMHg0LCAgNCB9LCB7ICAweDUsICA1IH0sCisgICAgeyAgMHg2LCAgNyB9LCB7IDB4MjYsICA4IH0sIHsgMHgyMSwgIDggfSwgeyAgMHhhLCAxMCB9LAorICAgIHsgMHgxZCwgMTIgfSwgeyAweDE4LCAxMiB9LCB7IDB4MTMsIDEyIH0sIHsgMHgxMCwgMTIgfSwKKyAgICB7IDB4MWEsIDEzIH0sIHsgMHgxOSwgMTMgfSwgeyAweDE4LCAxMyB9LCB7IDB4MTcsIDEzIH0sCisgICAgeyAgMHgzLCAgMyB9LCB7ICAweDYsICA2IH0sIHsgMHgyNSwgIDggfSwgeyAgMHhjLCAxMCB9LAorICAgIHsgMHgxYiwgMTIgfSwgeyAweDE2LCAxMyB9LCB7IDB4MTUsIDEzIH0sIHsgIDB4NSwgIDQgfSwKKyAgICB7ICAweDQsICA3IH0sIHsgIDB4YiwgMTAgfSwgeyAweDE0LCAxMiB9LCB7IDB4MTQsIDEzIH0sCisgICAgeyAgMHg3LCAgNSB9LCB7IDB4MjQsICA4IH0sIHsgMHgxYywgMTIgfSwgeyAweDEzLCAxMyB9LAorICAgIHsgIDB4NiwgIDUgfSwgeyAgMHhmLCAxMCB9LCB7IDB4MTIsIDEyIH0sIHsgIDB4NywgIDYgfSwKKyAgICB7ICAweDksIDEwIH0sIHsgMHgxMiwgMTMgfSwgeyAgMHg1LCAgNiB9LCB7IDB4MWUsIDEyIH0sCisgICAgeyAgMHg0LCAgNiB9LCB7IDB4MTUsIDEyIH0sIHsgIDB4NywgIDcgfSwgeyAweDExLCAxMiB9LAorICAgIHsgIDB4NSwgIDcgfSwgeyAweDExLCAxMyB9LCB7IDB4MjcsICA4IH0sIHsgMHgxMCwgMTMgfSwKKyAgICB7IDB4MjMsICA4IH0sIHsgMHgyMiwgIDggfSwgeyAweDIwLCAgOCB9LCB7ICAweGUsIDEwIH0sCisgICAgeyAgMHhkLCAxMCB9LCB7ICAweDgsIDEwIH0sIHsgMHgxZiwgMTIgfSwgeyAweDFhLCAxMiB9LAorICAgIHsgMHgxOSwgMTIgfSwgeyAweDE3LCAxMiB9LCB7IDB4MTYsIDEyIH0sIHsgMHgxZiwgMTMgfSwKKyAgICB7IDB4MWUsIDEzIH0sIHsgMHgxZCwgMTMgfSwgeyAweDFjLCAxMyB9LCB7IDB4MWIsIDEzIH0sCisgICAgeyAgMHgxLCAgNiB9ICAvLyBlc2NhcGUKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgaDI2MV90Y29lZmZfbGV2ZWxbNjRdID0geworICAgIDAsIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsCisgICAgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgICAxLCAyLCAgMywgIDQsICA1LCAgNiwgIDcsICAxLAorICAgIDIsIDMsICA0LCAgNSwgIDEsICAyLCAgMywgIDQsCisgICAgMSwgMiwgIDMsICAxLCAgMiwgIDMsICAxLCAgMiwKKyAgICAxLCAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLAorICAgIDEsIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgMSwgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMQorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBoMjYxX3Rjb2VmZl9ydW5bNjRdID0geworICAgICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsICAyLAorICAgICAyLCAgMiwgIDIsICAzLCAgMywgIDMsICAzLCAgNCwKKyAgICAgNCwgIDQsICA1LCAgNSwgIDUsICA2LCAgNiwgIDcsCisgICAgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLAorICAgIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwKKyAgICAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNgorfTsKKworUkxUYWJsZSBmZl9oMjYxX3JsX3Rjb2VmZiA9IHsKKyAgICA2NCwKKyAgICA2NCwKKyAgICBoMjYxX3Rjb2VmZl92bGMsCisgICAgaDI2MV90Y29lZmZfcnVuLAorICAgIGgyNjFfdGNvZWZmX2xldmVsLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjFkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjFkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDY0ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2MWRlYy5jCkBAIC0wLDAgKzEsNjg1IEBACisvKgorICogSDI2MSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDA0IE1hYXJ0ZW4gRGFuaWVscworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2MSBkZWNvZGVyLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibXBlZ19lci5oIgorI2luY2x1ZGUgIm1wZWd1dGlscy5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgImgyNjMuaCIKKyNpbmNsdWRlICJoMjYxLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBIMjYxX01CQV9WTENfQklUUyA5CisjZGVmaW5lIEgyNjFfTVRZUEVfVkxDX0JJVFMgNgorI2RlZmluZSBIMjYxX01WX1ZMQ19CSVRTIDcKKyNkZWZpbmUgSDI2MV9DQlBfVkxDX0JJVFMgOQorI2RlZmluZSBUQ09FRkZfVkxDX0JJVFMgOQorI2RlZmluZSBNQkFfU1RVRkZJTkcgMzMKKyNkZWZpbmUgTUJBX1NUQVJUQ09ERSAzNAorCitzdGF0aWMgVkxDIGgyNjFfbWJhX3ZsYzsKK3N0YXRpYyBWTEMgaDI2MV9tdHlwZV92bGM7CitzdGF0aWMgVkxDIGgyNjFfbXZfdmxjOworc3RhdGljIFZMQyBoMjYxX2NicF92bGM7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgaDI2MV9kZWNvZGVfaW5pdF92bGMoSDI2MUNvbnRleHQgKmgpCit7CisgICAgc3RhdGljIGludCBkb25lID0gMDsKKworICAgIGlmICghZG9uZSkgeworICAgICAgICBkb25lID0gMTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZoMjYxX21iYV92bGMsIEgyNjFfTUJBX1ZMQ19CSVRTLCAzNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjFfbWJhX2JpdHMsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9oMjYxX21iYV9jb2RlLCAxLCAxLCA2NjIpOworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmgyNjFfbXR5cGVfdmxjLCBIMjYxX01UWVBFX1ZMQ19CSVRTLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjFfbXR5cGVfYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjFfbXR5cGVfY29kZSwgMSwgMSwgODApOworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmgyNjFfbXZfdmxjLCBIMjYxX01WX1ZMQ19CSVRTLCAxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9oMjYxX212X3RhYlswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9oMjYxX212X3RhYlswXVswXSwgMiwgMSwgMTQ0KTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZoMjYxX2NicF92bGMsIEgyNjFfQ0JQX1ZMQ19CSVRTLCA2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9oMjYxX2NicF90YWJbMF1bMV0sIDIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAmZmZfaDI2MV9jYnBfdGFiWzBdWzBdLCAyLCAxLCA1MTIpOworICAgICAgICBJTklUX1ZMQ19STChmZl9oMjYxX3JsX3Rjb2VmZiwgNTUyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBoMjYxX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIMjYxQ29udGV4dCAqaCAgICAgICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTXBlZ0VuY0NvbnRleHQgKmNvbnN0IHMgPSAmaC0+czsKKworICAgIC8vIHNldCBkZWZhdWx0cworICAgIGZmX21wdl9kZWNvZGVfZGVmYXVsdHMocyk7CisgICAgZmZfbXB2X2RlY29kZV9pbml0KHMsIGF2Y3R4KTsKKworICAgIHMtPm91dF9mb3JtYXQgID0gRk1UX0gyNjE7CisgICAgcy0+bG93X2RlbGF5ICAgPSAxOworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworCisgICAgZmZfaDI2MV9jb21tb25faW5pdCgpOworICAgIGgyNjFfZGVjb2RlX2luaXRfdmxjKGgpOworCisgICAgaC0+Z29iX3N0YXJ0X2NvZGVfc2tpcHBlZCA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgdGhlIGdyb3VwIG9mIGJsb2NrcyBoZWFkZXIgb3Igc2xpY2UgaGVhZGVyLgorICogQHJldHVybiA8MCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitzdGF0aWMgaW50IGgyNjFfZGVjb2RlX2dvYl9oZWFkZXIoSDI2MUNvbnRleHQgKmgpCit7CisgICAgdW5zaWduZWQgaW50IHZhbDsKKyAgICBNcGVnRW5jQ29udGV4dCAqY29uc3QgcyA9ICZoLT5zOworCisgICAgaWYgKCFoLT5nb2Jfc3RhcnRfY29kZV9za2lwcGVkKSB7CisgICAgICAgIC8qIENoZWNrIGZvciBHT0IgU3RhcnQgQ29kZSAqLworICAgICAgICB2YWwgPSBzaG93X2JpdHMoJnMtPmdiLCAxNSk7CisgICAgICAgIGlmICh2YWwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgLyogV2UgaGF2ZSBhIEdCU0MgKi8KKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMTYpOworICAgIH0KKworICAgIGgtPmdvYl9zdGFydF9jb2RlX3NraXBwZWQgPSAwOworCisgICAgaC0+Z29iX251bWJlciA9IGdldF9iaXRzKCZzLT5nYiwgNCk7IC8qIEdOICovCisgICAgcy0+cXNjYWxlICAgICA9IGdldF9iaXRzKCZzLT5nYiwgNSk7IC8qIEdRVUFOVCAqLworCisgICAgLyogQ2hlY2sgaWYgZ29iX251bWJlciBpcyB2YWxpZCAqLworICAgIGlmIChzLT5tYl9oZWlnaHQgPT0gMTgpIHsgLy8gQ0lGCisgICAgICAgIGlmICgoaC0+Z29iX251bWJlciA8PSAwKSB8fCAoaC0+Z29iX251bWJlciA+IDEyKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeyAvLyBRQ0lGCisgICAgICAgIGlmICgoaC0+Z29iX251bWJlciAhPSAxKSAmJiAoaC0+Z29iX251bWJlciAhPSAzKSAmJgorICAgICAgICAgICAgKGgtPmdvYl9udW1iZXIgIT0gNSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogR0VJICovCisgICAgaWYgKHNraXBfMXN0b3BfOGRhdGFfYml0cygmcy0+Z2IpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAocy0+cXNjYWxlID09IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJxc2NhbGUgaGFzIGZvcmJpZGRlbiAwIHZhbHVlXG4iKTsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiAoQVZfRUZfQklUU1RSRUFNIHwgQVZfRUZfQ09NUExJQU5UKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBGb3IgdGhlIGZpcnN0IHRyYW5zbWl0dGVkIG1hY3JvYmxvY2sgaW4gYSBHT0IsIE1CQSBpcyB0aGUgYWJzb2x1dGUKKyAgICAgKiBhZGRyZXNzLiBGb3Igc3Vic2VxdWVudCBtYWNyb2Jsb2NrcywgTUJBIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAgKiB0aGUgYWJzb2x1dGUgYWRkcmVzc2VzIG9mIHRoZSBtYWNyb2Jsb2NrIGFuZCB0aGUgbGFzdCB0cmFuc21pdHRlZAorICAgICAqIG1hY3JvYmxvY2suICovCisgICAgaC0+Y3VycmVudF9tYmEgPSAwOworICAgIGgtPm1iYV9kaWZmICAgID0gMDsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSB0aGUgZ3JvdXAgb2YgYmxvY2tzIC8gdmlkZW8gcGFja2V0IGhlYWRlci4KKyAqIEByZXR1cm4gPDAgaWYgbm8gcmVzeW5jIGZvdW5kCisgKi8KK3N0YXRpYyBpbnQgaDI2MV9yZXN5bmMoSDI2MUNvbnRleHQgKmgpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKmNvbnN0IHMgPSAmaC0+czsKKyAgICBpbnQgbGVmdCwgcmV0OworCisgICAgaWYgKGgtPmdvYl9zdGFydF9jb2RlX3NraXBwZWQpIHsKKyAgICAgICAgcmV0ID0gaDI2MV9kZWNvZGVfZ29iX2hlYWRlcihoKTsKKyAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNob3dfYml0cygmcy0+Z2IsIDE1KSA9PSAwKSB7CisgICAgICAgICAgICByZXQgPSBoMjYxX2RlY29kZV9nb2JfaGVhZGVyKGgpOworICAgICAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8vIE9LLCBpdCBpcyBub3Qgd2hlcmUgaXQgaXMgc3VwcG9zZWQgdG8gYmUgLi4uCisgICAgICAgIHMtPmdiID0gcy0+bGFzdF9yZXN5bmNfZ2I7CisgICAgICAgIGFsaWduX2dldF9iaXRzKCZzLT5nYik7CisgICAgICAgIGxlZnQgPSBnZXRfYml0c19sZWZ0KCZzLT5nYik7CisKKyAgICAgICAgZm9yICg7IGxlZnQgPiAxNSArIDEgKyA0ICsgNTsgbGVmdCAtPSA4KSB7CisgICAgICAgICAgICBpZiAoc2hvd19iaXRzKCZzLT5nYiwgMTUpID09IDApIHsKKyAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0IGJhayA9IHMtPmdiOworCisgICAgICAgICAgICAgICAgcmV0ID0gaDI2MV9kZWNvZGVfZ29iX2hlYWRlcihoKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgcy0+Z2IgPSBiYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworLyoqCisgKiBEZWNvZGUgc2tpcHBlZCBtYWNyb2Jsb2Nrcy4KKyAqIEByZXR1cm4gMAorICovCitzdGF0aWMgaW50IGgyNjFfZGVjb2RlX21iX3NraXBwZWQoSDI2MUNvbnRleHQgKmgsIGludCBtYmExLCBpbnQgbWJhMikKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqY29uc3QgcyA9ICZoLT5zOworICAgIGludCBpOworCisgICAgcy0+bWJfaW50cmEgPSAwOworCisgICAgZm9yIChpID0gbWJhMTsgaSA8IG1iYTI7IGkrKykgeworICAgICAgICBpbnQgaiwgeHk7CisKKyAgICAgICAgcy0+bWJfeCA9ICgoaC0+Z29iX251bWJlciAtIDEpICUgMikgKiAxMSArIGkgJSAxMTsKKyAgICAgICAgcy0+bWJfeSA9ICgoaC0+Z29iX251bWJlciAtIDEpIC8gMikgKiAzICsgaSAvIDExOworICAgICAgICB4eSAgICAgID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisgICAgICAgIGZmX2luaXRfYmxvY2tfaW5kZXgocyk7CisgICAgICAgIGZmX3VwZGF0ZV9ibG9ja19pbmRleChzKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtqXSA9IC0xOworCisgICAgICAgIHMtPm12X2RpciAgICAgICAgICAgICAgICAgICAgICA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICBzLT5tdl90eXBlICAgICAgICAgICAgICAgICAgICAgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0gPSBNQl9UWVBFX1NLSVAgfCBNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV9MMDsKKyAgICAgICAgcy0+bXZbMF1bMF1bMF0gICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgcy0+bXZbMF1bMF1bMV0gICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgcy0+bWJfc2tpcHBlZCAgICAgICAgICAgICAgICAgID0gMTsKKyAgICAgICAgaC0+bXR5cGUgICAgICAgICAgICAgICAgICAgICAgJj0gfk1CX1RZUEVfSDI2MV9GSUw7CisKKyAgICAgICAgZmZfbXB2X2RlY29kZV9tYihzLCBzLT5ibG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgbXZtYXBbMTddID0geworICAgIDAsIC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtOCwgLTksIC0xMCwgLTExLCAtMTIsIC0xMywgLTE0LCAtMTUsIC0xNgorfTsKKworc3RhdGljIGludCBkZWNvZGVfbXZfY29tcG9uZW50KEdldEJpdENvbnRleHQgKmdiLCBpbnQgdikKK3sKKyAgICBpbnQgbXZfZGlmZiA9IGdldF92bGMyKGdiLCBoMjYxX212X3ZsYy50YWJsZSwgSDI2MV9NVl9WTENfQklUUywgMik7CisKKyAgICAvKiBjaGVjayBpZiBtdl9kaWZmIGlzIHZhbGlkICovCisgICAgaWYgKG12X2RpZmYgPCAwKQorICAgICAgICByZXR1cm4gdjsKKworICAgIG12X2RpZmYgPSBtdm1hcFttdl9kaWZmXTsKKworICAgIGlmIChtdl9kaWZmICYmICFnZXRfYml0czEoZ2IpKQorICAgICAgICBtdl9kaWZmID0gLW12X2RpZmY7CisKKyAgICB2ICs9IG12X2RpZmY7CisgICAgaWYgKHYgPD0gLTE2KQorICAgICAgICB2ICs9IDMyOworICAgIGVsc2UgaWYgKHYgPj0gMTYpCisgICAgICAgIHYgLT0gMzI7CisKKyAgICByZXR1cm4gdjsKK30KKworLyoqCisgKiBEZWNvZGUgYSBtYWNyb2Jsb2NrLgorICogQHJldHVybiA8MCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitzdGF0aWMgaW50IGgyNjFfZGVjb2RlX2Jsb2NrKEgyNjFDb250ZXh0ICpoLCBpbnQxNl90ICpibG9jaywgaW50IG4sIGludCBjb2RlZCkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqY29uc3QgcyA9ICZoLT5zOworICAgIGludCBsZXZlbCwgaSwgaiwgcnVuOworICAgIFJMVGFibGUgKnJsID0gJmZmX2gyNjFfcmxfdGNvZWZmOworICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW5fdGFibGU7CisKKyAgICAvKiBGb3IgdGhlIHZhcmlhYmxlIGxlbmd0aCBlbmNvZGluZyB0aGVyZSBhcmUgdHdvIGNvZGUgdGFibGVzLCBvbmUgYmVpbmcKKyAgICAgKiB1c2VkIGZvciB0aGUgZmlyc3QgdHJhbnNtaXR0ZWQgTEVWRUwgaW4gSU5URVIsIElOVEVSICsgTUMgYW5kCisgICAgICogSU5URVIgKyBNQyArIEZJTCBibG9ja3MsIHRoZSBzZWNvbmQgZm9yIGFsbCBvdGhlciBMRVZFTHMgZXhjZXB0IHRoZQorICAgICAqIGZpcnN0IG9uZSBpbiBJTlRSQSBibG9ja3Mgd2hpY2ggaXMgZml4ZWQgbGVuZ3RoIGNvZGVkIHdpdGggOCBiaXRzLgorICAgICAqIE5PVEU6IFRoZSB0d28gY29kZSB0YWJsZXMgb25seSBkaWZmZXIgaW4gb25lIFZMQyBzbyB3ZSBoYW5kbGUgdGhhdAorICAgICAqIG1hbnVhbGx5LiAqLworICAgIHNjYW5fdGFibGUgPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZDsKKyAgICBpZiAocy0+bWJfaW50cmEpIHsKKyAgICAgICAgLyogREMgY29lZiAqLworICAgICAgICBsZXZlbCA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgIC8vIDAgKDAwMDAwMDAwYikgYW5kIC0xMjggKDEwMDAwMDAwYikgYXJlIEZPUkJJRERFTgorICAgICAgICBpZiAoKGxldmVsICYgMHg3RikgPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIGRjICVkIGF0ICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGxldmVsLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvKiBUaGUgY29kZSAxMDAwIDAwMDAgaXMgbm90IHVzZWQsIHRoZSByZWNvbnN0cnVjdGlvbiBsZXZlbCBvZiAxMDI0CisgICAgICAgICAqIGJlaW5nIGNvZGVkIGFzIDExMTEgMTExMS4gKi8KKyAgICAgICAgaWYgKGxldmVsID09IDI1NSkKKyAgICAgICAgICAgIGxldmVsID0gMTI4OworICAgICAgICBibG9ja1swXSA9IGxldmVsOworICAgICAgICBpICAgICAgICA9IDE7CisgICAgfSBlbHNlIGlmIChjb2RlZCkgeworICAgICAgICAvLyBSdW4gIExldmVsICAgQ29kZQorICAgICAgICAvLyBFT0IgICAgICAgICAgTm90IHBvc3NpYmxlIGZvciBmaXJzdCBsZXZlbCB3aGVuIGNicCBpcyBhdmFpbGFibGUgKHRoYXQncyB3aHkgdGhlIHRhYmxlIGlzIGRpZmZlcmVudCkKKyAgICAgICAgLy8gMCAgICAxICAgICAgIDFzCisgICAgICAgIC8vICogICAgKiAgICAgICAwKgorICAgICAgICBpbnQgY2hlY2sgPSBzaG93X2JpdHMoJnMtPmdiLCAyKTsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGlmIChjaGVjayAmIDB4MikgeworICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMik7CisgICAgICAgICAgICBibG9ja1swXSA9IChjaGVjayAmIDB4MSkgPyAtMSA6IDE7CisgICAgICAgICAgICBpICAgICAgICA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpID0gMDsKKyAgICB9CisgICAgaWYgKCFjb2RlZCkgeworICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaSAtIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB7CisgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgaS0tOyAvLyBvZmZzZXQgYnkgLTEgdG8gYWxsb3cgZGlyZWN0IGluZGV4aW5nIG9mIHNjYW5fdGFibGUKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgR0VUX1JMX1ZMQyhsZXZlbCwgcnVuLCByZSwgJnMtPmdiLCBybC0+cmxfdmxjWzBdLCBUQ09FRkZfVkxDX0JJVFMsIDIsIDApOworICAgICAgICBpZiAocnVuID09IDY2KSB7CisgICAgICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBDTE9TRV9SRUFERVIocmUsICZzLT5nYik7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIGFjIHZsYyBjb2RlIGF0ICVkeCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBlc2NhcGUgKi8KKyAgICAgICAgICAgIC8qIFRoZSByZW1haW5pbmcgY29tYmluYXRpb25zIG9mIChydW4sIGxldmVsKSBhcmUgZW5jb2RlZCB3aXRoIGEKKyAgICAgICAgICAgICAqIDIwLWJpdCB3b3JkIGNvbnNpc3Rpbmcgb2YgNiBiaXRzIGVzY2FwZSwgNiBiaXRzIHJ1biBhbmQgOCBiaXRzCisgICAgICAgICAgICAgKiBsZXZlbC4gKi8KKyAgICAgICAgICAgIHJ1biAgID0gU0hPV19VQklUUyhyZSwgJnMtPmdiLCA2KSArIDE7CisgICAgICAgICAgICBTS0lQX0NBQ0hFKHJlLCAmcy0+Z2IsIDYpOworICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDgpOworICAgICAgICAgICAgU0tJUF9DT1VOVEVSKHJlLCAmcy0+Z2IsIDYgKyA4KTsKKyAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDEpKQorICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgU0tJUF9DT1VOVEVSKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICB9CisgICAgICAgIGkgKz0gcnVuOworICAgICAgICBpZiAoaSA+PSA2NCkgeworICAgICAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJydW4gb3ZlcmZsb3cgYXQgJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaiAgICAgICAgPSBzY2FuX3RhYmxlW2ldOworICAgICAgICBibG9ja1tqXSA9IGxldmVsOworICAgIH0KKyAgICBDTE9TRV9SRUFERVIocmUsICZzLT5nYik7CisgICAgfQorICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gPSBpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgyNjFfZGVjb2RlX21iKEgyNjFDb250ZXh0ICpoKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpjb25zdCBzID0gJmgtPnM7CisgICAgaW50IGksIGNicCwgeHk7CisKKyAgICBjYnAgPSA2MzsKKyAgICAvLyBSZWFkIG1iYQorICAgIGRvIHsKKyAgICAgICAgaC0+bWJhX2RpZmYgPSBnZXRfdmxjMigmcy0+Z2IsIGgyNjFfbWJhX3ZsYy50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjYxX01CQV9WTENfQklUUywgMik7CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIHNsaWNlIGVuZCAqLworICAgICAgICAvKiBOT1RFOiBHT0IgY2FuIGJlIGVtcHR5IChubyBNQiBkYXRhKSBvciBleGlzdCBvbmx5IG9mIE1CQV9zdHVmZmluZyAqLworICAgICAgICBpZiAoaC0+bWJhX2RpZmYgPT0gTUJBX1NUQVJUQ09ERSkgeyAvLyBzdGFydCBjb2RlCisgICAgICAgICAgICBoLT5nb2Jfc3RhcnRfY29kZV9za2lwcGVkID0gMTsKKyAgICAgICAgICAgIHJldHVybiBTTElDRV9FTkQ7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChoLT5tYmFfZGlmZiA9PSBNQkFfU1RVRkZJTkcpOyAvLyBzdHVmZmluZworCisgICAgaWYgKGgtPm1iYV9kaWZmIDwgMCkgeworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDw9IDcpCisgICAgICAgICAgICByZXR1cm4gU0xJQ0VfRU5EOworCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBtYmEgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICByZXR1cm4gU0xJQ0VfRVJST1I7CisgICAgfQorCisgICAgaC0+bWJhX2RpZmYgICAgKz0gMTsKKyAgICBoLT5jdXJyZW50X21iYSArPSBoLT5tYmFfZGlmZjsKKworICAgIGlmIChoLT5jdXJyZW50X21iYSA+IE1CQV9TVFVGRklORykKKyAgICAgICAgcmV0dXJuIFNMSUNFX0VSUk9SOworCisgICAgcy0+bWJfeCA9ICgoaC0+Z29iX251bWJlciAtIDEpICUgMikgKiAxMSArICgoaC0+Y3VycmVudF9tYmEgLSAxKSAlIDExKTsKKyAgICBzLT5tYl95ID0gKChoLT5nb2JfbnVtYmVyIC0gMSkgLyAyKSAqIDMgKyAoKGgtPmN1cnJlbnRfbWJhIC0gMSkgLyAxMSk7CisgICAgeHkgICAgICA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOworICAgIGZmX2luaXRfYmxvY2tfaW5kZXgocyk7CisgICAgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KHMpOworCisgICAgLy8gUmVhZCBtdHlwZQorICAgIGgtPm10eXBlID0gZ2V0X3ZsYzIoJnMtPmdiLCBoMjYxX210eXBlX3ZsYy50YWJsZSwgSDI2MV9NVFlQRV9WTENfQklUUywgMik7CisgICAgaWYgKGgtPm10eXBlIDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbXR5cGUgaW5kZXggJWRcbiIsCisgICAgICAgICAgICAgICBoLT5tdHlwZSk7CisgICAgICAgIHJldHVybiBTTElDRV9FUlJPUjsKKyAgICB9CisgICAgYXZfYXNzZXJ0MChoLT5tdHlwZSA8IEZGX0FSUkFZX0VMRU1TKGZmX2gyNjFfbXR5cGVfbWFwKSk7CisgICAgaC0+bXR5cGUgPSBmZl9oMjYxX210eXBlX21hcFtoLT5tdHlwZV07CisKKyAgICAvLyBSZWFkIG1xdWFudAorICAgIGlmIChJU19RVUFOVChoLT5tdHlwZSkpCisgICAgICAgIGZmX3NldF9xc2NhbGUocywgZ2V0X2JpdHMoJnMtPmdiLCA1KSk7CisKKyAgICBzLT5tYl9pbnRyYSA9IElTX0lOVFJBNHg0KGgtPm10eXBlKTsKKworICAgIC8vIFJlYWQgbXYKKyAgICBpZiAoSVNfMTZYMTYoaC0+bXR5cGUpKSB7CisgICAgICAgIC8qIE1vdGlvbiB2ZWN0b3IgZGF0YSBpcyBpbmNsdWRlZCBmb3IgYWxsIE1DIG1hY3JvYmxvY2tzLiBNVkQgaXMKKyAgICAgICAgICogb2J0YWluZWQgZnJvbSB0aGUgbWFjcm9ibG9jayB2ZWN0b3IgYnkgc3VidHJhY3RpbmcgdGhlIHZlY3RvcgorICAgICAgICAgKiBvZiB0aGUgcHJlY2VkaW5nIG1hY3JvYmxvY2suIEZvciB0aGlzIGNhbGN1bGF0aW9uIHRoZSB2ZWN0b3IKKyAgICAgICAgICogb2YgdGhlIHByZWNlZGluZyBtYWNyb2Jsb2NrIGlzIHJlZ2FyZGVkIGFzIHplcm8gaW4gdGhlCisgICAgICAgICAqIGZvbGxvd2luZyB0aHJlZSBzaXR1YXRpb25zOgorICAgICAgICAgKiAxKSBldmFsdWF0aW5nIE1WRCBmb3IgbWFjcm9ibG9ja3MgMSwgMTIgYW5kIDIzOworICAgICAgICAgKiAyKSBldmFsdWF0aW5nIE1WRCBmb3IgbWFjcm9ibG9ja3MgaW4gd2hpY2ggTUJBIGRvZXMgbm90IHJlcHJlc2VudCBhIGRpZmZlcmVuY2Ugb2YgMTsKKyAgICAgICAgICogMykgTVRZUEUgb2YgdGhlIHByZXZpb3VzIG1hY3JvYmxvY2sgd2FzIG5vdCBNQy4gKi8KKyAgICAgICAgaWYgKChoLT5jdXJyZW50X21iYSA9PSAgMSkgfHwgKGgtPmN1cnJlbnRfbWJhID09IDEyKSB8fAorICAgICAgICAgICAgKGgtPmN1cnJlbnRfbWJhID09IDIzKSB8fCAoaC0+bWJhX2RpZmYgIT0gMSkpIHsKKyAgICAgICAgICAgIGgtPmN1cnJlbnRfbXZfeCA9IDA7CisgICAgICAgICAgICBoLT5jdXJyZW50X212X3kgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaC0+Y3VycmVudF9tdl94ID0gZGVjb2RlX212X2NvbXBvbmVudCgmcy0+Z2IsIGgtPmN1cnJlbnRfbXZfeCk7CisgICAgICAgIGgtPmN1cnJlbnRfbXZfeSA9IGRlY29kZV9tdl9jb21wb25lbnQoJnMtPmdiLCBoLT5jdXJyZW50X212X3kpOworICAgIH0gZWxzZSB7CisgICAgICAgIGgtPmN1cnJlbnRfbXZfeCA9IDA7CisgICAgICAgIGgtPmN1cnJlbnRfbXZfeSA9IDA7CisgICAgfQorCisgICAgLy8gUmVhZCBjYnAKKyAgICBpZiAoSEFTX0NCUChoLT5tdHlwZSkpCisgICAgICAgIGNicCA9IGdldF92bGMyKCZzLT5nYiwgaDI2MV9jYnBfdmxjLnRhYmxlLCBIMjYxX0NCUF9WTENfQklUUywgMikgKyAxOworCisgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IE1CX1RZUEVfSU5UUkE7CisgICAgICAgIGdvdG8gaW50cmE7CisgICAgfQorCisgICAgLy9zZXQgbW90aW9uIHZlY3RvcnMKKyAgICBzLT5tdl9kaXIgICAgICAgICAgICAgICAgICAgICAgPSBNVl9ESVJfRk9SV0FSRDsKKyAgICBzLT5tdl90eXBlICAgICAgICAgICAgICAgICAgICAgPSBNVl9UWVBFXzE2WDE2OworICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0wwOworICAgIHMtPm12WzBdWzBdWzBdICAgICAgICAgICAgICAgICA9IGgtPmN1cnJlbnRfbXZfeCAqIDI7IC8vIGdldHMgZGl2aWRlZCBieSAyIGluIG1vdGlvbiBjb21wZW5zYXRpb24KKyAgICBzLT5tdlswXVswXVsxXSAgICAgICAgICAgICAgICAgPSBoLT5jdXJyZW50X212X3kgKiAyOworCisgICAgaWYgKHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdKSB7CisgICAgICAgIGludCBiX3N0cmlkZSA9IDIqcy0+bWJfd2lkdGggKyAxOworICAgICAgICBpbnQgYl94eSAgICAgPSAyICogcy0+bWJfeCArICgyICogcy0+bWJfeSkgKiBiX3N0cmlkZTsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bYl94eV1bMF0gPSBzLT5tdlswXVswXVswXTsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bYl94eV1bMV0gPSBzLT5tdlswXVswXVsxXTsKKyAgICB9CisKK2ludHJhOgorICAgIC8qIGRlY29kZSBlYWNoIGJsb2NrICovCisgICAgaWYgKHMtPm1iX2ludHJhIHx8IEhBU19DQlAoaC0+bXR5cGUpKSB7CisgICAgICAgIHMtPmJkc3AuY2xlYXJfYmxvY2tzKHMtPmJsb2NrWzBdKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgaWYgKGgyNjFfZGVjb2RlX2Jsb2NrKGgsIHMtPmJsb2NrW2ldLCBpLCBjYnAgJiAzMikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBTTElDRV9FUlJPUjsKKyAgICAgICAgICAgIGNicCArPSBjYnA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9IC0xOworICAgIH0KKworICAgIGZmX21wdl9kZWNvZGVfbWIocywgcy0+YmxvY2spOworCisgICAgcmV0dXJuIFNMSUNFX09LOworfQorCisvKioKKyAqIERlY29kZSB0aGUgSC4yNjEgcGljdHVyZSBoZWFkZXIuCisgKiBAcmV0dXJuIDwwIGlmIG5vIHN0YXJ0Y29kZSBmb3VuZAorICovCitzdGF0aWMgaW50IGgyNjFfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKEgyNjFDb250ZXh0ICpoKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpjb25zdCBzID0gJmgtPnM7CisgICAgaW50IGZvcm1hdCwgaTsKKyAgICB1aW50MzJfdCBzdGFydGNvZGUgPSAwOworCisgICAgZm9yIChpID0gZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpOyBpID4gMjQ7IGkgLT0gMSkgeworICAgICAgICBzdGFydGNvZGUgPSAoKHN0YXJ0Y29kZSA8PCAxKSB8IGdldF9iaXRzKCZzLT5nYiwgMSkpICYgMHgwMDBGRkZGRjsKKworICAgICAgICBpZiAoc3RhcnRjb2RlID09IDB4MTApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc3RhcnRjb2RlICE9IDB4MTApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJCYWQgcGljdHVyZSBzdGFydCBjb2RlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHRlbXBvcmFsIHJlZmVyZW5jZSAqLworICAgIGkgPSBnZXRfYml0cygmcy0+Z2IsIDUpOyAvKiBwaWN0dXJlIHRpbWVzdGFtcCAqLworICAgIGlmIChpIDwgKHMtPnBpY3R1cmVfbnVtYmVyICYgMzEpKQorICAgICAgICBpICs9IDMyOworICAgIHMtPnBpY3R1cmVfbnVtYmVyID0gKHMtPnBpY3R1cmVfbnVtYmVyICYgfjMxKSArIGk7CisKKyAgICBzLT5hdmN0eC0+ZnJhbWVyYXRlID0gKEFWUmF0aW9uYWwpIHsgMzAwMDAsIDEwMDEgfTsKKworICAgIC8qIFBUWVBFIHN0YXJ0cyBoZXJlICovCisgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOyAvKiBzcGxpdCBzY3JlZW4gb2ZmICovCisgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOyAvKiBjYW1lcmEgIG9mZiAqLworICAgIHNraXBfYml0czEoJnMtPmdiKTsgLyogZnJlZXplIHBpY3R1cmUgcmVsZWFzZSBvZmYgKi8KKworICAgIGZvcm1hdCA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgLy8gb25seSAyIGZvcm1hdHMgcG9zc2libGUKKyAgICBpZiAoZm9ybWF0ID09IDApIHsgLy8gUUNJRgorICAgICAgICBzLT53aWR0aCAgICAgPSAxNzY7CisgICAgICAgIHMtPmhlaWdodCAgICA9IDE0NDsKKyAgICAgICAgcy0+bWJfd2lkdGggID0gMTE7CisgICAgICAgIHMtPm1iX2hlaWdodCA9IDk7CisgICAgfSBlbHNlIHsgLy8gQ0lGCisgICAgICAgIHMtPndpZHRoICAgICA9IDM1MjsKKyAgICAgICAgcy0+aGVpZ2h0ICAgID0gMjg4OworICAgICAgICBzLT5tYl93aWR0aCAgPSAyMjsKKyAgICAgICAgcy0+bWJfaGVpZ2h0ID0gMTg7CisgICAgfQorCisgICAgcy0+bWJfbnVtID0gcy0+bWJfd2lkdGggKiBzLT5tYl9oZWlnaHQ7CisKKyAgICBza2lwX2JpdHMxKCZzLT5nYik7IC8qIHN0aWxsIGltYWdlIG1vZGUgb2ZmICovCisgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOyAvKiBSZXNlcnZlZCAqLworCisgICAgLyogUEVJICovCisgICAgaWYgKHNraXBfMXN0b3BfOGRhdGFfYml0cygmcy0+Z2IpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiBILjI2MSBoYXMgbm8gSS1mcmFtZXMsIGJ1dCBpZiB3ZSBwYXNzIEFWX1BJQ1RVUkVfVFlQRV9JIGZvciB0aGUgZmlyc3QKKyAgICAgKiBmcmFtZSwgdGhlIGNvZGVjIGNyYXNoZXMgaWYgaXQgZG9lcyBub3QgY29udGFpbiBhbGwgSS1ibG9ja3MKKyAgICAgKiAoZS5nLiB3aGVuIGEgcGFja2V0IGlzIGxvc3QpLiAqLworICAgIHMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworCisgICAgaC0+Z29iX251bWJlciA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDI2MV9kZWNvZGVfZ29iKEgyNjFDb250ZXh0ICpoKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpjb25zdCBzID0gJmgtPnM7CisKKyAgICBmZl9zZXRfcXNjYWxlKHMsIHMtPnFzY2FsZSk7CisKKyAgICAvKiBkZWNvZGUgbWIncyAqLworICAgIHdoaWxlIChoLT5jdXJyZW50X21iYSA8PSBNQkFfU1RVRkZJTkcpIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgLyogRENUICYgcXVhbnRpemUgKi8KKyAgICAgICAgcmV0ID0gaDI2MV9kZWNvZGVfbWIoaCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAocmV0ID09IFNMSUNFX0VORCkgeworICAgICAgICAgICAgICAgIGgyNjFfZGVjb2RlX21iX3NraXBwZWQoaCwgaC0+Y3VycmVudF9tYmEsIDMzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYXQgTUI6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGgyNjFfZGVjb2RlX21iX3NraXBwZWQoaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5jdXJyZW50X21iYSAtIGgtPm1iYV9kaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmN1cnJlbnRfbWJhIC0gMSk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCisvKioKKyAqIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBmb3IgYnVpbGRpbmcgdGhlIGN1cnJlbnQgZnJhbWUKKyAqLworc3RhdGljIGludCBnZXRfY29uc3VtZWRfYnl0ZXMoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgcG9zID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKSA+PiAzOworICAgIGlmIChwb3MgPT0gMCkKKyAgICAgICAgcG9zID0gMTsgICAgICAvLyBhdm9pZCBpbmZpbml0ZSBsb29wcyAoaSBkb3VidCB0aGF0IGlzIG5lZWRlZCBidXQgLi4uKQorICAgIGlmIChwb3MgKyAxMCA+IGJ1Zl9zaXplKQorICAgICAgICBwb3MgPSBidWZfc2l6ZTsgICAgICAgICAgICAgICAvLyBvb3BzIDspCisKKyAgICByZXR1cm4gcG9zOworfQorCitzdGF0aWMgaW50IGgyNjFfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBIMjYxQ29udGV4dCAqaCAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzICA9ICZoLT5zOworICAgIGludCByZXQ7CisgICAgQVZGcmFtZSAqcGljdCA9IGRhdGE7CisKKyAgICBhdl9kbG9nKGF2Y3R4LCAiKioqKipmcmFtZSAlZCBzaXplPSVkXG4iLCBhdmN0eC0+ZnJhbWVfbnVtYmVyLCBidWZfc2l6ZSk7CisgICAgYXZfZGxvZyhhdmN0eCwgImJ5dGVzPSV4ICV4ICV4ICV4XG4iLCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10pOworICAgIHMtPmZsYWdzICA9IGF2Y3R4LT5mbGFnczsKKyAgICBzLT5mbGFnczIgPSBhdmN0eC0+ZmxhZ3MyOworCisgICAgaC0+Z29iX3N0YXJ0X2NvZGVfc2tpcHBlZCA9IDA7CisKK3JldHJ5OgorICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBidWYsIGJ1Zl9zaXplICogOCk7CisKKyAgICBpZiAoIXMtPmNvbnRleHRfaW5pdGlhbGl6ZWQpCisgICAgICAgIC8vIHdlIG5lZWQgdGhlIElEQ1QgcGVybXV0YXRvbiBmb3IgcmVhZGluZyBhIGN1c3RvbSBtYXRyaXgKKyAgICAgICAgZmZfbXB2X2lkY3RfaW5pdChzKTsKKworICAgIHJldCA9IGgyNjFfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKGgpOworCisgICAgLyogc2tpcCBpZiB0aGUgaGVhZGVyIHdhcyB0aHJhc2hlZCAqLworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaGVhZGVyIGRhbWFnZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHMtPndpZHRoICE9IGF2Y3R4LT5jb2RlZF93aWR0aCB8fCBzLT5oZWlnaHQgIT0gYXZjdHgtPmNvZGVkX2hlaWdodCkgeworICAgICAgICBQYXJzZUNvbnRleHQgcGMgPSBzLT5wYXJzZV9jb250ZXh0OyAvLyBGSVhNRSBtb3ZlIHRoaXMgZGVtdXhpbmcgaGFjayB0byBsaWJhdmZvcm1hdAorICAgICAgICBzLT5wYXJzZV9jb250ZXh0LmJ1ZmZlciA9IDA7CisgICAgICAgIGZmX21wdl9jb21tb25fZW5kKHMpOworICAgICAgICBzLT5wYXJzZV9jb250ZXh0ID0gcGM7CisgICAgfQorCisgICAgaWYgKCFzLT5jb250ZXh0X2luaXRpYWxpemVkKSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfbXB2X2NvbW1vbl9pbml0KHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBzLT53aWR0aCwgcy0+aGVpZ2h0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorCisgICAgLy8gZm9yIHNraXBwaW5nIHRoZSBmcmFtZQorICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5waWN0X3R5cGUgPSBzLT5waWN0X3R5cGU7CisgICAgcy0+Y3VycmVudF9waWN0dXJlLmYtPmtleV9mcmFtZSA9IHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIGlmICgoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiAmJiBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHx8CisgICAgICAgIChhdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfTk9OS0VZICYmIHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkgfHwKKyAgICAgICAgIGF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9BTEwpCisgICAgICAgIHJldHVybiBnZXRfY29uc3VtZWRfYnl0ZXMocywgYnVmX3NpemUpOworCisgICAgaWYgKGZmX21wdl9mcmFtZV9zdGFydChzLCBhdmN0eCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmZl9tcGVnX2VyX2ZyYW1lX3N0YXJ0KHMpOworCisgICAgLyogZGVjb2RlIGVhY2ggbWFjcm9ibG9jayAqLworICAgIHMtPm1iX3ggPSAwOworICAgIHMtPm1iX3kgPSAwOworCisgICAgd2hpbGUgKGgtPmdvYl9udW1iZXIgPCAocy0+bWJfaGVpZ2h0ID09IDE4ID8gMTIgOiA1KSkgeworICAgICAgICBpZiAoaDI2MV9yZXN5bmMoaCkgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGgyNjFfZGVjb2RlX2dvYihoKTsKKyAgICB9CisgICAgZmZfbXB2X2ZyYW1lX2VuZChzKTsKKworICAgIGF2X2Fzc2VydDAocy0+Y3VycmVudF9waWN0dXJlLmYtPnBpY3RfdHlwZSA9PSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5waWN0X3R5cGUpOworICAgIGF2X2Fzc2VydDAocy0+Y3VycmVudF9waWN0dXJlLmYtPnBpY3RfdHlwZSA9PSBzLT5waWN0X3R5cGUpOworCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYocGljdCwgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+ZikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBmZl9wcmludF9kZWJ1Z19pbmZvKHMsIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIsIHBpY3QpOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gZ2V0X2NvbnN1bWVkX2J5dGVzKHMsIGJ1Zl9zaXplKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGgyNjFfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSDI2MUNvbnRleHQgKmggICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmgtPnM7CisKKyAgICBmZl9tcHZfY29tbW9uX2VuZChzKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9oMjYxX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImgyNjEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJILjI2MSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYxLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihIMjYxQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gaDI2MV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBoMjYxX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gaDI2MV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAubWF4X2xvd3JlcyAgICAgPSAzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjFlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjFlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTIxMWEwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2MWVuYy5jCkBAIC0wLDAgKzEsMzkxIEBACisvKgorICogSDI2MSBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDA0IE1hYXJ0ZW4gRGFuaWVscworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2MSBlbmNvZGVyLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJoMjYzLmgiCisjaW5jbHVkZSAiaDI2MS5oIgorCitzdGF0aWMgdWludDhfdCB1bmlfaDI2MV9ybF9sZW4gWzY0KjY0KjIqMl07CisjZGVmaW5lIFVOSV9FTkNfSU5ERVgobGFzdCxydW4sbGV2ZWwpICgobGFzdCkqMTI4KjY0ICsgKHJ1bikqMTI4ICsgKGxldmVsKSkKKworaW50IGZmX2gyNjFfZ2V0X3BpY3R1cmVfZm9ybWF0KGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICAvLyBRQ0lGCisgICAgaWYgKHdpZHRoID09IDE3NiAmJiBoZWlnaHQgPT0gMTQ0KQorICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBDSUYKKyAgICBlbHNlIGlmICh3aWR0aCA9PSAzNTIgJiYgaGVpZ2h0ID09IDI4OCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgLy8gRVJST1IKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKwordm9pZCBmZl9oMjYxX2VuY29kZV9waWN0dXJlX2hlYWRlcihNcGVnRW5jQ29udGV4dCAqcywgaW50IHBpY3R1cmVfbnVtYmVyKQoreworICAgIEgyNjFDb250ZXh0ICpoID0gKEgyNjFDb250ZXh0ICopczsKKyAgICBpbnQgZm9ybWF0LCB0ZW1wX3JlZjsKKworICAgIGF2cHJpdl9hbGlnbl9wdXRfYml0cygmcy0+cGIpOworCisgICAgLyogVXBkYXRlIHRoZSBwb2ludGVyIHRvIGxhc3QgR09CICovCisgICAgcy0+cHRyX2xhc3Rnb2IgPSBwdXRfYml0c19wdHIoJnMtPnBiKTsKKworICAgIHB1dF9iaXRzKCZzLT5wYiwgMjAsIDB4MTApOyAvKiBQU0MgKi8KKworICAgIHRlbXBfcmVmID0gcy0+cGljdHVyZV9udW1iZXIgKiAoaW50NjRfdCkzMDAwMCAqIHMtPmF2Y3R4LT50aW1lX2Jhc2UubnVtIC8KKyAgICAgICAgICAgICAgICgxMDAxICogKGludDY0X3Qpcy0+YXZjdHgtPnRpbWVfYmFzZS5kZW4pOyAgIC8vIEZJWE1FIG1heWJlIHRoaXMgc2hvdWxkIHVzZSBhIHRpbWVzdGFtcAorICAgIHB1dF9zYml0cygmcy0+cGIsIDUsIHRlbXBfcmVmKTsgLyogVGVtcG9yYWxSZWZlcmVuY2UgKi8KKworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7IC8qIHNwbGl0IHNjcmVlbiBvZmYgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAvKiBjYW1lcmEgIG9mZiAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7IC8qIGZyZWV6ZSBwaWN0dXJlIHJlbGVhc2Ugb2ZmICovCisKKyAgICBmb3JtYXQgPSBmZl9oMjYxX2dldF9waWN0dXJlX2Zvcm1hdChzLT53aWR0aCwgcy0+aGVpZ2h0KTsKKworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgZm9ybWF0KTsgLyogMCA9PSBRQ0lGLCAxID09IENJRiAqLworCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgLyogc3RpbGwgaW1hZ2UgbW9kZSAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7IC8qIHJlc2VydmVkICovCisKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAvKiBubyBQRUkgKi8KKyAgICBpZiAoZm9ybWF0ID09IDApCisgICAgICAgIGgtPmdvYl9udW1iZXIgPSAtMTsKKyAgICBlbHNlCisgICAgICAgIGgtPmdvYl9udW1iZXIgPSAwOworICAgIHMtPm1iX3NraXBfcnVuID0gMDsKK30KKworLyoqCisgKiBFbmNvZGUgYSBncm91cCBvZiBibG9ja3MgaGVhZGVyLgorICovCitzdGF0aWMgdm9pZCBoMjYxX2VuY29kZV9nb2JfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgbWJfbGluZSkKK3sKKyAgICBIMjYxQ29udGV4dCAqaCA9IChIMjYxQ29udGV4dCAqKXM7CisgICAgaWYgKGZmX2gyNjFfZ2V0X3BpY3R1cmVfZm9ybWF0KHMtPndpZHRoLCBzLT5oZWlnaHQpID09IDApIHsKKyAgICAgICAgaC0+Z29iX251bWJlciArPSAyOyAvLyBRQ0lGCisgICAgfSBlbHNlIHsKKyAgICAgICAgaC0+Z29iX251bWJlcisrOyAgICAvLyBDSUYKKyAgICB9CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgMSk7ICAgICAgICAgICAgLyogR0JTQyAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgaC0+Z29iX251bWJlcik7IC8qIEdOICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCA1LCBzLT5xc2NhbGUpOyAgICAgLyogR1FVQU5UICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAgLyogbm8gR0VJICovCisgICAgcy0+bWJfc2tpcF9ydW4gPSAwOworICAgIHMtPmxhc3RfbXZbMF1bMF1bMF0gPSAwOworICAgIHMtPmxhc3RfbXZbMF1bMF1bMV0gPSAwOworfQorCit2b2lkIGZmX2gyNjFfcmVvcmRlcl9tYl9pbmRleChNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaW5kZXggPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3dpZHRoOworCisgICAgaWYgKGluZGV4ICUgMTEgPT0gMCkgeworICAgICAgICBpZiAoaW5kZXggJSAzMyA9PSAwKQorICAgICAgICAgICAgaDI2MV9lbmNvZGVfZ29iX2hlYWRlcihzLCAwKTsKKyAgICAgICAgcy0+bGFzdF9tdlswXVswXVswXSA9IDA7CisgICAgICAgIHMtPmxhc3RfbXZbMF1bMF1bMV0gPSAwOworICAgIH0KKworICAgIC8qIGZvciBDSUYgdGhlIEdPQidzIGFyZSBmcmFnbWVudGVkIGluIHRoZSBtaWRkbGUgb2YgYSBzY2FubGluZQorICAgICAqIHRoYXQncyB3aHkgd2UgbmVlZCB0byBhZGp1c3QgdGhlIHggYW5kIHkgaW5kZXggb2YgdGhlIG1hY3JvYmxvY2tzICovCisgICAgaWYgKGZmX2gyNjFfZ2V0X3BpY3R1cmVfZm9ybWF0KHMtPndpZHRoLCBzLT5oZWlnaHQpID09IDEpIHsgLy8gQ0lGCisgICAgICAgIHMtPm1iX3ggID0gaW5kZXggJSAxMTsKKyAgICAgICAgaW5kZXggICAvPSAxMTsKKyAgICAgICAgcy0+bWJfeSAgPSBpbmRleCAlIDM7CisgICAgICAgIGluZGV4ICAgLz0gMzsKKyAgICAgICAgcy0+bWJfeCArPSAxMSAqIChpbmRleCAlIDIpOworICAgICAgICBpbmRleCAgIC89IDI7CisgICAgICAgIHMtPm1iX3kgKz0gMyAqIGluZGV4OworCisgICAgICAgIGZmX2luaXRfYmxvY2tfaW5kZXgocyk7CisgICAgICAgIGZmX3VwZGF0ZV9ibG9ja19pbmRleChzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGgyNjFfZW5jb2RlX21vdGlvbihIMjYxQ29udGV4dCAqaCwgaW50IHZhbCkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqY29uc3QgcyA9ICZoLT5zOworICAgIGludCBzaWduLCBjb2RlOworICAgIGlmICh2YWwgPT0gMCkgeworICAgICAgICBjb2RlID0gMDsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBmZl9oMjYxX212X3RhYltjb2RlXVsxXSwgZmZfaDI2MV9tdl90YWJbY29kZV1bMF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh2YWwgPiAxNSkKKyAgICAgICAgICAgIHZhbCAtPSAzMjsKKyAgICAgICAgaWYgKHZhbCA8IC0xNikKKyAgICAgICAgICAgIHZhbCArPSAzMjsKKyAgICAgICAgc2lnbiA9IHZhbCA8IDA7CisgICAgICAgIGNvZGUgPSBzaWduID8gLXZhbCA6IHZhbDsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBmZl9oMjYxX212X3RhYltjb2RlXVsxXSwgZmZfaDI2MV9tdl90YWJbY29kZV1bMF0pOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHNpZ24pOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2NicChNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1s2XVs2NF0pCit7CisgICAgaW50IGksIGNicDsKKyAgICBjYnAgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIGlmIChzLT5ibG9ja19sYXN0X2luZGV4W2ldID49IDApCisgICAgICAgICAgICBjYnAgfD0gMSA8PCAoNSAtIGkpOworICAgIHJldHVybiBjYnA7Cit9CisKKy8qKgorICogRW5jb2RlIGFuIDh4OCBibG9jay4KKyAqIEBwYXJhbSBibG9jayB0aGUgOHg4IGJsb2NrCisgKiBAcGFyYW0gbiBibG9jayBpbmRleCAoMC0zIGFyZSBsdW1hLCA0LTUgYXJlIGNocm9tYSkKKyAqLworc3RhdGljIHZvaWQgaDI2MV9lbmNvZGVfYmxvY2soSDI2MUNvbnRleHQgKmgsIGludDE2X3QgKmJsb2NrLCBpbnQgbikKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqY29uc3QgcyA9ICZoLT5zOworICAgIGludCBsZXZlbCwgcnVuLCBpLCBqLCBsYXN0X2luZGV4LCBsYXN0X25vbl96ZXJvLCBzaWduLCBzbGV2ZWwsIGNvZGU7CisgICAgUkxUYWJsZSAqcmw7CisKKyAgICBybCA9ICZmZl9oMjYxX3JsX3Rjb2VmZjsKKyAgICBpZiAocy0+bWJfaW50cmEpIHsKKyAgICAgICAgLyogREMgY29lZiAqLworICAgICAgICBsZXZlbCA9IGJsb2NrWzBdOworICAgICAgICAvKiAyNTUgY2Fubm90IGJlIHJlcHJlc2VudGVkLCBzbyB3ZSBjbGFtcCAqLworICAgICAgICBpZiAobGV2ZWwgPiAyNTQpIHsKKyAgICAgICAgICAgIGxldmVsICAgID0gMjU0OworICAgICAgICAgICAgYmxvY2tbMF0gPSAyNTQ7CisgICAgICAgIH0KKyAgICAgICAgLyogMCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYWxzbyAqLworICAgICAgICBlbHNlIGlmIChsZXZlbCA8IDEpIHsKKyAgICAgICAgICAgIGxldmVsICAgID0gMTsKKyAgICAgICAgICAgIGJsb2NrWzBdID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGV2ZWwgPT0gMTI4KQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCAweGZmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCBsZXZlbCk7CisgICAgICAgIGkgPSAxOworICAgIH0gZWxzZSBpZiAoKGJsb2NrWzBdID09IDEgfHwgYmxvY2tbMF0gPT0gLTEpICYmCisgICAgICAgICAgICAgICAocy0+YmxvY2tfbGFzdF9pbmRleFtuXSA+IC0xKSkgeworICAgICAgICAvLyBzcGVjaWFsIGNhc2UKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBibG9ja1swXSA+IDAgPyAyIDogMyk7CisgICAgICAgIGkgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGkgPSAwOworICAgIH0KKworICAgIC8qIEFDIGNvZWZzICovCisgICAgbGFzdF9pbmRleCAgICA9IHMtPmJsb2NrX2xhc3RfaW5kZXhbbl07CisgICAgbGFzdF9ub25femVybyA9IGkgLSAxOworICAgIGZvciAoOyBpIDw9IGxhc3RfaW5kZXg7IGkrKykgeworICAgICAgICBqICAgICA9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkW2ldOworICAgICAgICBsZXZlbCA9IGJsb2NrW2pdOworICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgIHJ1biAgICA9IGkgLSBsYXN0X25vbl96ZXJvIC0gMTsKKyAgICAgICAgICAgIHNpZ24gICA9IDA7CisgICAgICAgICAgICBzbGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICBzaWduICA9IDE7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlID0gZ2V0X3JsX2luZGV4KHJsLCAwIC8qbm8gbGFzdCBpbiBILjI2MSwgRU9CIGlzIHVzZWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLCBsZXZlbCk7CisgICAgICAgICAgICBpZiAocnVuID09IDAgJiYgbGV2ZWwgPCAxNikKKyAgICAgICAgICAgICAgICBjb2RlICs9IDE7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIHJsLT50YWJsZV92bGNbY29kZV1bMV0sIHJsLT50YWJsZV92bGNbY29kZV1bMF0pOworICAgICAgICAgICAgaWYgKGNvZGUgPT0gcmwtPm4pIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDYsIHJ1bik7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MShzbGV2ZWwgIT0gMCk7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MShsZXZlbCA8PSAxMjcpOworICAgICAgICAgICAgICAgIHB1dF9zYml0cygmcy0+cGIsIDgsIHNsZXZlbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgc2lnbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0X25vbl96ZXJvID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobGFzdF9pbmRleCA+IC0xKQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIHJsLT50YWJsZV92bGNbMF1bMV0sIHJsLT50YWJsZV92bGNbMF1bMF0pOyAvLyBFT0IKK30KKwordm9pZCBmZl9oMjYxX2VuY29kZV9tYihNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1s2XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feCwgaW50IG1vdGlvbl95KQoreworICAgIEgyNjFDb250ZXh0ICpoID0gKEgyNjFDb250ZXh0ICopczsKKyAgICBpbnQgbXZkLCBtdl9kaWZmX3gsIG12X2RpZmZfeSwgaSwgY2JwOworICAgIGNicCA9IDYzOyAvLyBhdm9pZCB3YXJuaW5nCisgICAgbXZkID0gMDsKKworICAgIGgtPm10eXBlID0gMDsKKworICAgIGlmICghcy0+bWJfaW50cmEpIHsKKyAgICAgICAgLyogY29tcHV0ZSBjYnAgKi8KKyAgICAgICAgY2JwID0gZ2V0X2NicChzLCBibG9jayk7CisKKyAgICAgICAgLyogbXZkIGluZGljYXRlcyBpZiB0aGlzIGJsb2NrIGlzIG1vdGlvbiBjb21wZW5zYXRlZCAqLworICAgICAgICBtdmQgPSBtb3Rpb25feCB8IG1vdGlvbl95OworCisgICAgICAgIGlmICgoY2JwIHwgbXZkIHwgcy0+ZHF1YW50KSA9PSAwKSB7CisgICAgICAgICAgICAvKiBza2lwIG1hY3JvYmxvY2sgKi8KKyAgICAgICAgICAgIHMtPnNraXBfY291bnQrKzsKKyAgICAgICAgICAgIHMtPm1iX3NraXBfcnVuKys7CisgICAgICAgICAgICBzLT5sYXN0X212WzBdWzBdWzBdID0gMDsKKyAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMF1bMV0gPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTUIgaXMgbm90IHNraXBwZWQsIGVuY29kZSBNQkEgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgZmZfaDI2MV9tYmFfYml0c1tzLT5tYl9za2lwX3J1bl0sCisgICAgICAgICAgICAgZmZfaDI2MV9tYmFfY29kZVtzLT5tYl9za2lwX3J1bl0pOworICAgIHMtPm1iX3NraXBfcnVuID0gMDsKKworICAgIC8qIGNhbGN1bGF0ZSBNVFlQRSAqLworICAgIGlmICghcy0+bWJfaW50cmEpIHsKKyAgICAgICAgaC0+bXR5cGUrKzsKKworICAgICAgICBpZiAobXZkIHx8IHMtPmxvb3BfZmlsdGVyKQorICAgICAgICAgICAgaC0+bXR5cGUgKz0gMzsKKyAgICAgICAgaWYgKHMtPmxvb3BfZmlsdGVyKQorICAgICAgICAgICAgaC0+bXR5cGUgKz0gMzsKKyAgICAgICAgaWYgKGNicCB8fCBzLT5kcXVhbnQpCisgICAgICAgICAgICBoLT5tdHlwZSsrOworICAgICAgICBhdl9hc3NlcnQxKGgtPm10eXBlID4gMSk7CisgICAgfQorCisgICAgaWYgKHMtPmRxdWFudCkKKyAgICAgICAgaC0+bXR5cGUrKzsKKworICAgIHB1dF9iaXRzKCZzLT5wYiwKKyAgICAgICAgICAgICBmZl9oMjYxX210eXBlX2JpdHNbaC0+bXR5cGVdLAorICAgICAgICAgICAgIGZmX2gyNjFfbXR5cGVfY29kZVtoLT5tdHlwZV0pOworCisgICAgaC0+bXR5cGUgPSBmZl9oMjYxX210eXBlX21hcFtoLT5tdHlwZV07CisKKyAgICBpZiAoSVNfUVVBTlQoaC0+bXR5cGUpKSB7CisgICAgICAgIGZmX3NldF9xc2NhbGUocywgcy0+cXNjYWxlICsgcy0+ZHF1YW50KTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA1LCBzLT5xc2NhbGUpOworICAgIH0KKworICAgIGlmIChJU18xNlgxNihoLT5tdHlwZSkpIHsKKyAgICAgICAgbXZfZGlmZl94ICAgICAgID0gKG1vdGlvbl94ID4+IDEpIC0gcy0+bGFzdF9tdlswXVswXVswXTsKKyAgICAgICAgbXZfZGlmZl95ICAgICAgID0gKG1vdGlvbl95ID4+IDEpIC0gcy0+bGFzdF9tdlswXVswXVsxXTsKKyAgICAgICAgcy0+bGFzdF9tdlswXVswXVswXSA9IChtb3Rpb25feCA+PiAxKTsKKyAgICAgICAgcy0+bGFzdF9tdlswXVswXVsxXSA9IChtb3Rpb25feSA+PiAxKTsKKyAgICAgICAgaDI2MV9lbmNvZGVfbW90aW9uKGgsIG12X2RpZmZfeCk7CisgICAgICAgIGgyNjFfZW5jb2RlX21vdGlvbihoLCBtdl9kaWZmX3kpOworICAgIH0KKworICAgIGlmIChIQVNfQ0JQKGgtPm10eXBlKSkgeworICAgICAgICBhdl9hc3NlcnQxKGNicCA+IDApOworICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgIGZmX2gyNjFfY2JwX3RhYltjYnAgLSAxXVsxXSwKKyAgICAgICAgICAgICAgICAgZmZfaDI2MV9jYnBfdGFiW2NicCAtIDFdWzBdKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgLyogZW5jb2RlIGVhY2ggYmxvY2sgKi8KKyAgICAgICAgaDI2MV9lbmNvZGVfYmxvY2soaCwgYmxvY2tbaV0sIGkpOworCisgICAgaWYgKCFJU18xNlgxNihoLT5tdHlwZSkpIHsKKyAgICAgICAgcy0+bGFzdF9tdlswXVswXVswXSA9IDA7CisgICAgICAgIHMtPmxhc3RfbXZbMF1bMF1bMV0gPSAwOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X3VuaV9oMjYxX3JsX3RhYihSTFRhYmxlICpybCwgdWludDMyX3QgKmJpdHNfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpsZW5fdGFiKQoreworICAgIGludCBzbGV2ZWwsIHJ1biwgbGFzdDsKKworICAgIGF2X2Fzc2VydDAoTUFYX0xFVkVMID49IDY0KTsKKyAgICBhdl9hc3NlcnQwKE1BWF9SVU4gICA+PSA2Myk7CisKKyAgICBmb3Ioc2xldmVsPS02NDsgc2xldmVsPDY0OyBzbGV2ZWwrKyl7CisgICAgICAgIGlmKHNsZXZlbD09MCkgY29udGludWU7CisgICAgICAgIGZvcihydW49MDsgcnVuPDY0OyBydW4rKyl7CisgICAgICAgICAgICBmb3IobGFzdD0wOyBsYXN0PD0xOyBsYXN0KyspeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleD0gVU5JX0VOQ19JTkRFWChsYXN0LCBydW4sIHNsZXZlbCs2NCk7CisgICAgICAgICAgICAgICAgaW50IGxldmVsPSBzbGV2ZWwgPCAwID8gLXNsZXZlbCA6IHNsZXZlbDsKKyAgICAgICAgICAgICAgICBpbnQgbGVuLCBjb2RlOworCisgICAgICAgICAgICAgICAgbGVuX3RhYltpbmRleF09IDEwMDsKKworICAgICAgICAgICAgICAgIC8qIEVTQzAgKi8KKyAgICAgICAgICAgICAgICBjb2RlPSBnZXRfcmxfaW5kZXgocmwsIDAsIHJ1biwgbGV2ZWwpOworICAgICAgICAgICAgICAgIGxlbj0gIHJsLT50YWJsZV92bGNbY29kZV1bMV0gKyAxOworICAgICAgICAgICAgICAgIGlmKGxhc3QpCisgICAgICAgICAgICAgICAgICAgIGxlbiArPSAyOworCisgICAgICAgICAgICAgICAgaWYoY29kZSE9cmwtPm4gJiYgbGVuIDwgbGVuX3RhYltpbmRleF0peworICAgICAgICAgICAgICAgICAgICBsZW5fdGFiIFtpbmRleF09IGxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRVNDICovCisgICAgICAgICAgICAgICAgbGVuID0gcmwtPnRhYmxlX3ZsY1tybC0+bl1bMV07CisgICAgICAgICAgICAgICAgaWYobGFzdCkKKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IDI7CisKKyAgICAgICAgICAgICAgICBpZihsZW4gPCBsZW5fdGFiW2luZGV4XSl7CisgICAgICAgICAgICAgICAgICAgIGxlbl90YWIgW2luZGV4XT0gbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworYXZfY29sZCB2b2lkIGZmX2gyNjFfZW5jb2RlX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgZmZfaDI2MV9jb21tb25faW5pdCgpOworCisgICAgcy0+bWluX3Fjb2VmZiAgICAgICA9IC0xMjc7CisgICAgcy0+bWF4X3Fjb2VmZiAgICAgICA9IDEyNzsKKyAgICBzLT55X2RjX3NjYWxlX3RhYmxlID0KKyAgICBzLT5jX2RjX3NjYWxlX3RhYmxlID0gZmZfbXBlZzFfZGNfc2NhbGVfdGFibGU7CisgICAgcy0+YWNfZXNjX2xlbmd0aCAgICA9IDYrNis4OworCisgICAgaW5pdF91bmlfaDI2MV9ybF90YWIoJmZmX2gyNjFfcmxfdGNvZWZmLCBOVUxMLCB1bmlfaDI2MV9ybF9sZW4pOworCisgICAgcy0+aW50cmFfYWNfdmxjX2xlbmd0aCAgICAgID0gcy0+aW50ZXJfYWNfdmxjX2xlbmd0aCAgICAgID0gdW5pX2gyNjFfcmxfbGVuOworICAgIHMtPmludHJhX2FjX3ZsY19sYXN0X2xlbmd0aCA9IHMtPmludGVyX2FjX3ZsY19sYXN0X2xlbmd0aCA9IHVuaV9oMjYxX3JsX2xlbiArIDEyOCo2NDsKK30KKworRkZfTVBWX0dFTkVSSUNfQ0xBU1MoaDI2MSkKKworQVZDb2RlYyBmZl9oMjYxX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImgyNjEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJILjI2MSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYxLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihIMjYxQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGZmX21wdl9lbmNvZGVfcGljdHVyZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl9tcHZfZW5jb2RlX2VuZCwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmaDI2MV9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjYzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4ZTMyZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjMuYwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIEgyNjMvTVBFRzQgYmFja2VuZCBmb3IgZW5jb2RlciBhbmQgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBIMjYzKyBzdXBwb3J0LgorICogQ29weXJpZ2h0IChjKSAyMDAxIEp1YW4gSi4gU2llcnJhbHRhIFAKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGgyNjMvbXBlZzQgY29kZWMuCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgImgyNjMuaCIKKyNpbmNsdWRlICJoMjYzZGF0YS5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorI2luY2x1ZGUgImZsdi5oIgorI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKKworCit1aW50OF90IGZmX2gyNjNfc3RhdGljX3JsX3RhYmxlX3N0b3JlWzJdWzJdWzIqTUFYX1JVTiArIE1BWF9MRVZFTCArIDNdOworCisKK3ZvaWQgZmZfaDI2M191cGRhdGVfbW90aW9uX3ZhbChNcGVnRW5jQ29udGV4dCAqIHMpeworICAgIGNvbnN0IGludCBtYl94eSA9IHMtPm1iX3kgKiBzLT5tYl9zdHJpZGUgKyBzLT5tYl94OworICAgICAgICAgICAgICAgLy9GSVhNRSBhIGxvdCBvZiB0aGF0IGlzIG9ubHkgbmVlZGVkIGZvciAhbG93X2RlbGF5CisgICAgY29uc3QgaW50IHdyYXAgPSBzLT5iOF9zdHJpZGU7CisgICAgY29uc3QgaW50IHh5ID0gcy0+YmxvY2tfaW5kZXhbMF07CisKKyAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJza2lwX3RhYmxlW21iX3h5XSA9IHMtPm1iX3NraXBwZWQ7CisKKyAgICBpZihzLT5tdl90eXBlICE9IE1WX1RZUEVfOFg4KXsKKyAgICAgICAgaW50IG1vdGlvbl94LCBtb3Rpb25feTsKKyAgICAgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgICAgICBtb3Rpb25feCA9IDA7CisgICAgICAgICAgICBtb3Rpb25feSA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAocy0+bXZfdHlwZSA9PSBNVl9UWVBFXzE2WDE2KSB7CisgICAgICAgICAgICBtb3Rpb25feCA9IHMtPm12WzBdWzBdWzBdOworICAgICAgICAgICAgbW90aW9uX3kgPSBzLT5tdlswXVswXVsxXTsKKyAgICAgICAgfSBlbHNlIC8qaWYgKHMtPm12X3R5cGUgPT0gTVZfVFlQRV9GSUVMRCkqLyB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIG1vdGlvbl94ID0gcy0+bXZbMF1bMF1bMF0gKyBzLT5tdlswXVsxXVswXTsKKyAgICAgICAgICAgIG1vdGlvbl95ID0gcy0+bXZbMF1bMF1bMV0gKyBzLT5tdlswXVsxXVsxXTsKKyAgICAgICAgICAgIG1vdGlvbl94ID0gKG1vdGlvbl94Pj4xKSB8IChtb3Rpb25feCYxKTsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8MjsgaSsrKXsKKyAgICAgICAgICAgICAgICBzLT5wX2ZpZWxkX212X3RhYmxlW2ldWzBdW21iX3h5XVswXT0gcy0+bXZbMF1baV1bMF07CisgICAgICAgICAgICAgICAgcy0+cF9maWVsZF9tdl90YWJsZVtpXVswXVttYl94eV1bMV09IHMtPm12WzBdW2ldWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnJlZl9pbmRleFswXVs0Km1iX3h5ICAgIF0gPQorICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnJlZl9pbmRleFswXVs0Km1iX3h5ICsgMV0gPSBzLT5maWVsZF9zZWxlY3RbMF1bMF07CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUucmVmX2luZGV4WzBdWzQqbWJfeHkgKyAyXSA9CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUucmVmX2luZGV4WzBdWzQqbWJfeHkgKyAzXSA9IHMtPmZpZWxkX3NlbGVjdFswXVsxXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5vIHVwZGF0ZSBpZiA4WDggYmVjYXVzZSBpdCBoYXMgYmVlbiBkb25lIGR1cmluZyBwYXJzaW5nICovCisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5XVswXSAgICAgICAgICAgID0gbW90aW9uX3g7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5XVsxXSAgICAgICAgICAgID0gbW90aW9uX3k7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5ICsgMV1bMF0gICAgICAgID0gbW90aW9uX3g7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5ICsgMV1bMV0gICAgICAgID0gbW90aW9uX3k7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5ICsgd3JhcF1bMF0gICAgID0gbW90aW9uX3g7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5ICsgd3JhcF1bMV0gICAgID0gbW90aW9uX3k7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5ICsgMSArIHdyYXBdWzBdID0gbW90aW9uX3g7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5ICsgMSArIHdyYXBdWzFdID0gbW90aW9uX3k7CisgICAgfQorCisgICAgaWYocy0+ZW5jb2RpbmcpeyAvL0ZJWE1FIGVuY29kaW5nIE1VU1QgYmUgY2xlYW5lZCB1cAorICAgICAgICBpZiAocy0+bXZfdHlwZSA9PSBNVl9UWVBFXzhYOCkKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW21iX3h5XSA9IE1CX1RZUEVfTDAgfCBNQl9UWVBFXzh4ODsKKyAgICAgICAgZWxzZSBpZihzLT5tYl9pbnRyYSkKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW21iX3h5XSA9IE1CX1RZUEVfSU5UUkE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW21iX3h5XSA9IE1CX1RZUEVfTDAgfCBNQl9UWVBFXzE2eDE2OworICAgIH0KK30KKworaW50IGZmX2gyNjNfcHJlZF9kYyhNcGVnRW5jQ29udGV4dCAqIHMsIGludCBuLCBpbnQxNl90ICoqZGNfdmFsX3B0cikKK3sKKyAgICBpbnQgeCwgeSwgd3JhcCwgYSwgYywgcHJlZF9kYzsKKyAgICBpbnQxNl90ICpkY192YWw7CisKKyAgICAvKiBmaW5kIHByZWRpY3Rpb24gKi8KKyAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgeCA9IDIgKiBzLT5tYl94ICsgKG4gJiAxKTsKKyAgICAgICAgeSA9IDIgKiBzLT5tYl95ICsgKChuICYgMikgPj4gMSk7CisgICAgICAgIHdyYXAgPSBzLT5iOF9zdHJpZGU7CisgICAgICAgIGRjX3ZhbCA9IHMtPmRjX3ZhbFswXTsKKyAgICB9IGVsc2UgeworICAgICAgICB4ID0gcy0+bWJfeDsKKyAgICAgICAgeSA9IHMtPm1iX3k7CisgICAgICAgIHdyYXAgPSBzLT5tYl9zdHJpZGU7CisgICAgICAgIGRjX3ZhbCA9IHMtPmRjX3ZhbFtuIC0gNCArIDFdOworICAgIH0KKyAgICAvKiBCIEMKKyAgICAgKiBBIFgKKyAgICAgKi8KKyAgICBhID0gZGNfdmFsWyh4IC0gMSkgKyAoeSkgKiB3cmFwXTsKKyAgICBjID0gZGNfdmFsWyh4KSArICh5IC0gMSkgKiB3cmFwXTsKKworICAgIC8qIE5vIHByZWRpY3Rpb24gb3V0c2lkZSBHT0IgYm91bmRhcnkgKi8KKyAgICBpZihzLT5maXJzdF9zbGljZV9saW5lICYmIG4hPTMpeworICAgICAgICBpZihuIT0yKSBjPSAxMDI0OworICAgICAgICBpZihuIT0xICYmIHMtPm1iX3ggPT0gcy0+cmVzeW5jX21iX3gpIGE9IDEwMjQ7CisgICAgfQorICAgIC8qIGp1c3QgREMgcHJlZGljdGlvbiAqLworICAgIGlmIChhICE9IDEwMjQgJiYgYyAhPSAxMDI0KQorICAgICAgICBwcmVkX2RjID0gKGEgKyBjKSA+PiAxOworICAgIGVsc2UgaWYgKGEgIT0gMTAyNCkKKyAgICAgICAgcHJlZF9kYyA9IGE7CisgICAgZWxzZQorICAgICAgICBwcmVkX2RjID0gYzsKKworICAgIC8qIHdlIGFzc3VtZSBwcmVkIGlzIHBvc2l0aXZlICovCisgICAgKmRjX3ZhbF9wdHIgPSAmZGNfdmFsW3ggKyB5ICogd3JhcF07CisgICAgcmV0dXJuIHByZWRfZGM7Cit9CisKK3ZvaWQgZmZfaDI2M19sb29wX2ZpbHRlcihNcGVnRW5jQ29udGV4dCAqIHMpeworICAgIGludCBxcF9jOworICAgIGNvbnN0IGludCBsaW5lc2l6ZSAgPSBzLT5saW5lc2l6ZTsKKyAgICBjb25zdCBpbnQgdXZsaW5lc2l6ZT0gcy0+dXZsaW5lc2l6ZTsKKyAgICBjb25zdCBpbnQgeHkgPSBzLT5tYl95ICogcy0+bWJfc3RyaWRlICsgcy0+bWJfeDsKKyAgICB1aW50OF90ICpkZXN0X3kgPSBzLT5kZXN0WzBdOworICAgIHVpbnQ4X3QgKmRlc3RfY2I9IHMtPmRlc3RbMV07CisgICAgdWludDhfdCAqZGVzdF9jcj0gcy0+ZGVzdFsyXTsKKworLy8gICAgaWYocy0+cGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfQiAmJiAhcy0+cmVhZGFibGUpIHJldHVybjsKKworICAgIC8qCisgICAgICAgRGlhZyBUb3AKKyAgICAgICBMZWZ0IENlbnRlcgorICAgICovCisgICAgaWYgKCFJU19TS0lQKHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSkpIHsKKyAgICAgICAgcXBfYz0gcy0+cXNjYWxlOworICAgICAgICBzLT5oMjYzZHNwLmgyNjNfdl9sb29wX2ZpbHRlcihkZXN0X3kgKyA4ICogbGluZXNpemUsICAgICBsaW5lc2l6ZSwgcXBfYyk7CisgICAgICAgIHMtPmgyNjNkc3AuaDI2M192X2xvb3BfZmlsdGVyKGRlc3RfeSArIDggKiBsaW5lc2l6ZSArIDgsIGxpbmVzaXplLCBxcF9jKTsKKyAgICB9ZWxzZQorICAgICAgICBxcF9jPSAwOworCisgICAgaWYocy0+bWJfeSl7CisgICAgICAgIGludCBxcF9kdCwgcXBfdHQsIHFwX3RjOworCisgICAgICAgIGlmIChJU19TS0lQKHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5IC0gcy0+bWJfc3RyaWRlXSkpCisgICAgICAgICAgICBxcF90dD0wOworICAgICAgICBlbHNlCisgICAgICAgICAgICBxcF90dCA9IHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbeHkgLSBzLT5tYl9zdHJpZGVdOworCisgICAgICAgIGlmKHFwX2MpCisgICAgICAgICAgICBxcF90Yz0gcXBfYzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcXBfdGM9IHFwX3R0OworCisgICAgICAgIGlmKHFwX3RjKXsKKyAgICAgICAgICAgIGNvbnN0IGludCBjaHJvbWFfcXA9IHMtPmNocm9tYV9xc2NhbGVfdGFibGVbcXBfdGNdOworICAgICAgICAgICAgcy0+aDI2M2RzcC5oMjYzX3ZfbG9vcF9maWx0ZXIoZGVzdF95LCAgICAgbGluZXNpemUsIHFwX3RjKTsKKyAgICAgICAgICAgIHMtPmgyNjNkc3AuaDI2M192X2xvb3BfZmlsdGVyKGRlc3RfeSArIDgsIGxpbmVzaXplLCBxcF90Yyk7CisKKyAgICAgICAgICAgIHMtPmgyNjNkc3AuaDI2M192X2xvb3BfZmlsdGVyKGRlc3RfY2IsIHV2bGluZXNpemUsIGNocm9tYV9xcCk7CisgICAgICAgICAgICBzLT5oMjYzZHNwLmgyNjNfdl9sb29wX2ZpbHRlcihkZXN0X2NyLCB1dmxpbmVzaXplLCBjaHJvbWFfcXApOworICAgICAgICB9CisKKyAgICAgICAgaWYocXBfdHQpCisgICAgICAgICAgICBzLT5oMjYzZHNwLmgyNjNfaF9sb29wX2ZpbHRlcihkZXN0X3kgLSA4ICogbGluZXNpemUgKyA4LCBsaW5lc2l6ZSwgcXBfdHQpOworCisgICAgICAgIGlmKHMtPm1iX3gpeworICAgICAgICAgICAgaWYgKHFwX3R0IHx8IElTX1NLSVAocy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbeHkgLSAxIC0gcy0+bWJfc3RyaWRlXSkpCisgICAgICAgICAgICAgICAgcXBfZHQ9IHFwX3R0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHFwX2R0ID0gcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVt4eSAtIDEgLSBzLT5tYl9zdHJpZGVdOworCisgICAgICAgICAgICBpZihxcF9kdCl7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGNocm9tYV9xcD0gcy0+Y2hyb21hX3FzY2FsZV90YWJsZVtxcF9kdF07CisgICAgICAgICAgICAgICAgcy0+aDI2M2RzcC5oMjYzX2hfbG9vcF9maWx0ZXIoZGVzdF95ICAtIDggKiBsaW5lc2l6ZSwgICBsaW5lc2l6ZSwgICBxcF9kdCk7CisgICAgICAgICAgICAgICAgcy0+aDI2M2RzcC5oMjYzX2hfbG9vcF9maWx0ZXIoZGVzdF9jYiAtIDggKiB1dmxpbmVzaXplLCB1dmxpbmVzaXplLCBjaHJvbWFfcXApOworICAgICAgICAgICAgICAgIHMtPmgyNjNkc3AuaDI2M19oX2xvb3BfZmlsdGVyKGRlc3RfY3IgLSA4ICogdXZsaW5lc2l6ZSwgdXZsaW5lc2l6ZSwgY2hyb21hX3FwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHFwX2MpeworICAgICAgICBzLT5oMjYzZHNwLmgyNjNfaF9sb29wX2ZpbHRlcihkZXN0X3kgKyA4LCBsaW5lc2l6ZSwgcXBfYyk7CisgICAgICAgIGlmKHMtPm1iX3kgKyAxID09IHMtPm1iX2hlaWdodCkKKyAgICAgICAgICAgIHMtPmgyNjNkc3AuaDI2M19oX2xvb3BfZmlsdGVyKGRlc3RfeSArIDggKiBsaW5lc2l6ZSArIDgsIGxpbmVzaXplLCBxcF9jKTsKKyAgICB9CisKKyAgICBpZihzLT5tYl94KXsKKyAgICAgICAgaW50IHFwX2xjOworICAgICAgICBpZiAocXBfYyB8fCBJU19TS0lQKHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5IC0gMV0pKQorICAgICAgICAgICAgcXBfbGM9IHFwX2M7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHFwX2xjID0gcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVt4eSAtIDFdOworCisgICAgICAgIGlmKHFwX2xjKXsKKyAgICAgICAgICAgIHMtPmgyNjNkc3AuaDI2M19oX2xvb3BfZmlsdGVyKGRlc3RfeSwgbGluZXNpemUsIHFwX2xjKTsKKyAgICAgICAgICAgIGlmKHMtPm1iX3kgKyAxID09IHMtPm1iX2hlaWdodCl7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGNocm9tYV9xcD0gcy0+Y2hyb21hX3FzY2FsZV90YWJsZVtxcF9sY107CisgICAgICAgICAgICAgICAgcy0+aDI2M2RzcC5oMjYzX2hfbG9vcF9maWx0ZXIoZGVzdF95ICsgOCAqIGxpbmVzaXplLCBsaW5lc2l6ZSwgcXBfbGMpOworICAgICAgICAgICAgICAgIHMtPmgyNjNkc3AuaDI2M19oX2xvb3BfZmlsdGVyKGRlc3RfY2IsIHV2bGluZXNpemUsIGNocm9tYV9xcCk7CisgICAgICAgICAgICAgICAgcy0+aDI2M2RzcC5oMjYzX2hfbG9vcF9maWx0ZXIoZGVzdF9jciwgdXZsaW5lc2l6ZSwgY2hyb21hX3FwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl9oMjYzX3ByZWRfYWNkYyhNcGVnRW5jQ29udGV4dCAqIHMsIGludDE2X3QgKmJsb2NrLCBpbnQgbikKK3sKKyAgICBpbnQgeCwgeSwgd3JhcCwgYSwgYywgcHJlZF9kYywgc2NhbGUsIGk7CisgICAgaW50MTZfdCAqZGNfdmFsLCAqYWNfdmFsLCAqYWNfdmFsMTsKKworICAgIC8qIGZpbmQgcHJlZGljdGlvbiAqLworICAgIGlmIChuIDwgNCkgeworICAgICAgICB4ID0gMiAqIHMtPm1iX3ggKyAobiAmIDEpOworICAgICAgICB5ID0gMiAqIHMtPm1iX3kgKyAobj4+IDEpOworICAgICAgICB3cmFwID0gcy0+Yjhfc3RyaWRlOworICAgICAgICBkY192YWwgPSBzLT5kY192YWxbMF07CisgICAgICAgIGFjX3ZhbCA9IHMtPmFjX3ZhbFswXVswXTsKKyAgICAgICAgc2NhbGUgPSBzLT55X2RjX3NjYWxlOworICAgIH0gZWxzZSB7CisgICAgICAgIHggPSBzLT5tYl94OworICAgICAgICB5ID0gcy0+bWJfeTsKKyAgICAgICAgd3JhcCA9IHMtPm1iX3N0cmlkZTsKKyAgICAgICAgZGNfdmFsID0gcy0+ZGNfdmFsW24gLSA0ICsgMV07CisgICAgICAgIGFjX3ZhbCA9IHMtPmFjX3ZhbFtuIC0gNCArIDFdWzBdOworICAgICAgICBzY2FsZSA9IHMtPmNfZGNfc2NhbGU7CisgICAgfQorCisgICAgYWNfdmFsICs9ICgoeSkgKiB3cmFwICsgKHgpKSAqIDE2OworICAgIGFjX3ZhbDEgPSBhY192YWw7CisKKyAgICAvKiBCIEMKKyAgICAgKiBBIFgKKyAgICAgKi8KKyAgICBhID0gZGNfdmFsWyh4IC0gMSkgKyAoeSkgKiB3cmFwXTsKKyAgICBjID0gZGNfdmFsWyh4KSArICh5IC0gMSkgKiB3cmFwXTsKKworICAgIC8qIE5vIHByZWRpY3Rpb24gb3V0c2lkZSBHT0IgYm91bmRhcnkgKi8KKyAgICBpZihzLT5maXJzdF9zbGljZV9saW5lICYmIG4hPTMpeworICAgICAgICBpZihuIT0yKSBjPSAxMDI0OworICAgICAgICBpZihuIT0xICYmIHMtPm1iX3ggPT0gcy0+cmVzeW5jX21iX3gpIGE9IDEwMjQ7CisgICAgfQorCisgICAgaWYgKHMtPmFjX3ByZWQpIHsKKyAgICAgICAgcHJlZF9kYyA9IDEwMjQ7CisgICAgICAgIGlmIChzLT5oMjYzX2FpY19kaXIpIHsKKyAgICAgICAgICAgIC8qIGxlZnQgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgaWYgKGEgIT0gMTAyNCkgeworICAgICAgICAgICAgICAgIGFjX3ZhbCAtPSAxNjsKKyAgICAgICAgICAgICAgICBmb3IoaT0xO2k8ODtpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2kgPDwgM11dICs9IGFjX3ZhbFtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJlZF9kYyA9IGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiB0b3AgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgaWYgKGMgIT0gMTAyNCkgeworICAgICAgICAgICAgICAgIGFjX3ZhbCAtPSAxNiAqIHdyYXA7CisgICAgICAgICAgICAgICAgZm9yKGk9MTtpPDg7aSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrW3MtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltpXV0gKz0gYWNfdmFsW2kgKyA4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJlZF9kYyA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBqdXN0IERDIHByZWRpY3Rpb24gKi8KKyAgICAgICAgaWYgKGEgIT0gMTAyNCAmJiBjICE9IDEwMjQpCisgICAgICAgICAgICBwcmVkX2RjID0gKGEgKyBjKSA+PiAxOworICAgICAgICBlbHNlIGlmIChhICE9IDEwMjQpCisgICAgICAgICAgICBwcmVkX2RjID0gYTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJlZF9kYyA9IGM7CisgICAgfQorCisgICAgLyogd2UgYXNzdW1lIHByZWQgaXMgcG9zaXRpdmUgKi8KKyAgICBibG9ja1swXT1ibG9ja1swXSpzY2FsZSArIHByZWRfZGM7CisKKyAgICBpZiAoYmxvY2tbMF0gPCAwKQorICAgICAgICBibG9ja1swXSA9IDA7CisgICAgZWxzZQorICAgICAgICBibG9ja1swXSB8PSAxOworCisgICAgLyogVXBkYXRlIEFDL0RDIHRhYmxlcyAqLworICAgIGRjX3ZhbFsoeCkgKyAoeSkgKiB3cmFwXSA9IGJsb2NrWzBdOworCisgICAgLyogbGVmdCBjb3B5ICovCisgICAgZm9yKGk9MTtpPDg7aSsrKQorICAgICAgICBhY192YWwxW2ldICAgICA9IGJsb2NrW3MtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltpIDw8IDNdXTsKKyAgICAvKiB0b3AgY29weSAqLworICAgIGZvcihpPTE7aTw4O2krKykKKyAgICAgICAgYWNfdmFsMVs4ICsgaV0gPSBibG9ja1tzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV1dOworfQorCitpbnQxNl90ICpmZl9oMjYzX3ByZWRfbW90aW9uKE1wZWdFbmNDb250ZXh0ICogcywgaW50IGJsb2NrLCBpbnQgZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnB4LCBpbnQgKnB5KQoreworICAgIGludCB3cmFwOworICAgIGludDE2X3QgKkEsICpCLCAqQywgKCptb3RfdmFsKVsyXTsKKyAgICBzdGF0aWMgY29uc3QgaW50IG9mZls0XT0gezIsIDEsIDEsIC0xfTsKKworICAgIHdyYXAgPSBzLT5iOF9zdHJpZGU7CisgICAgbW90X3ZhbCA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl0gKyBzLT5ibG9ja19pbmRleFtibG9ja107CisKKyAgICBBID0gbW90X3ZhbFsgLSAxXTsKKyAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGZpcnN0IChzbGljZSkgbGluZSAqLworICAgIGlmIChzLT5maXJzdF9zbGljZV9saW5lICYmIGJsb2NrPDMpIHsKKyAgICAgICAgLy8gd2UgY2FuJ3QganVzdCBjaGFuZ2Ugc29tZSBNVnMgdG8gc2ltdWxhdGUgdGhhdCBhcyB3ZSBuZWVkIHRoZW0gZm9yIHRoZSBCIGZyYW1lcyAoYW5kIE1FKQorICAgICAgICAvLyBhbmQgaWYgd2UgZXZlciBzdXBwb3J0IG5vbiByZWN0YW5ndWxhciBvYmplY3RzIHRoYW4gd2UgbmVlZCB0byBkbyBhIGZldyBpZnMgaGVyZSBhbnl3YXkgOigKKyAgICAgICAgaWYoYmxvY2s9PTApeyAvL21vc3QgY29tbW9uIGNhc2UKKyAgICAgICAgICAgIGlmKHMtPm1iX3ggID09IHMtPnJlc3luY19tYl94KXsgLy9yYXJlCisgICAgICAgICAgICAgICAgKnB4PSAqcHkgPSAwOworICAgICAgICAgICAgfWVsc2UgaWYocy0+bWJfeCArIDEgPT0gcy0+cmVzeW5jX21iX3ggJiYgcy0+aDI2M19wcmVkKXsgLy9yYXJlCisgICAgICAgICAgICAgICAgQyA9IG1vdF92YWxbb2ZmW2Jsb2NrXSAtIHdyYXBdOworICAgICAgICAgICAgICAgIGlmKHMtPm1iX3g9PTApeworICAgICAgICAgICAgICAgICAgICAqcHggPSBDWzBdOworICAgICAgICAgICAgICAgICAgICAqcHkgPSBDWzFdOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAqcHggPSBtaWRfcHJlZChBWzBdLCAwLCBDWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgKnB5ID0gbWlkX3ByZWQoQVsxXSwgMCwgQ1sxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgKnB4ID0gQVswXTsKKyAgICAgICAgICAgICAgICAqcHkgPSBBWzFdOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZSBpZihibG9jaz09MSl7CisgICAgICAgICAgICBpZihzLT5tYl94ICsgMSA9PSBzLT5yZXN5bmNfbWJfeCAmJiBzLT5oMjYzX3ByZWQpeyAvL3JhcmUKKyAgICAgICAgICAgICAgICBDID0gbW90X3ZhbFtvZmZbYmxvY2tdIC0gd3JhcF07CisgICAgICAgICAgICAgICAgKnB4ID0gbWlkX3ByZWQoQVswXSwgMCwgQ1swXSk7CisgICAgICAgICAgICAgICAgKnB5ID0gbWlkX3ByZWQoQVsxXSwgMCwgQ1sxXSk7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAqcHggPSBBWzBdOworICAgICAgICAgICAgICAgICpweSA9IEFbMV07CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleyAvKiBibG9jaz09MiovCisgICAgICAgICAgICBCID0gbW90X3ZhbFsgLSB3cmFwXTsKKyAgICAgICAgICAgIEMgPSBtb3RfdmFsW29mZltibG9ja10gLSB3cmFwXTsKKyAgICAgICAgICAgIGlmKHMtPm1iX3ggPT0gcy0+cmVzeW5jX21iX3gpIC8vcmFyZQorICAgICAgICAgICAgICAgIEFbMF09QVsxXT0wOworCisgICAgICAgICAgICAqcHggPSBtaWRfcHJlZChBWzBdLCBCWzBdLCBDWzBdKTsKKyAgICAgICAgICAgICpweSA9IG1pZF9wcmVkKEFbMV0sIEJbMV0sIENbMV0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQiA9IG1vdF92YWxbIC0gd3JhcF07CisgICAgICAgIEMgPSBtb3RfdmFsW29mZltibG9ja10gLSB3cmFwXTsKKyAgICAgICAgKnB4ID0gbWlkX3ByZWQoQVswXSwgQlswXSwgQ1swXSk7CisgICAgICAgICpweSA9IG1pZF9wcmVkKEFbMV0sIEJbMV0sIENbMV0pOworICAgIH0KKyAgICByZXR1cm4gKm1vdF92YWw7Cit9CisKKworLyoqCisgKiBHZXQgdGhlIEdPQiBoZWlnaHQgYmFzZWQgb24gcGljdHVyZSBoZWlnaHQuCisgKi8KK2ludCBmZl9oMjYzX2dldF9nb2JfaGVpZ2h0KE1wZWdFbmNDb250ZXh0ICpzKXsKKyAgICBpZiAocy0+aGVpZ2h0IDw9IDQwMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZSBpZiAocy0+aGVpZ2h0IDw9IDgwMCkKKyAgICAgICAgcmV0dXJuICAyOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjYzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9oMjYzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3OThiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjMuaApAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIEgyNjMgaW50ZXJuYWwgaGVhZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaWZuZGVmIEFWQ09ERUNfSDI2M19ICisjZGVmaW5lIEFWQ09ERUNfSDI2M19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvcmF0aW9uYWwuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgInJsLmgiCisKKyNpZiAhRkZfQVBJX0FTUEVDVF9FWFRFTkRFRAorI2RlZmluZSBGRl9BU1BFQ1RfRVhURU5ERUQgMTUKKyNlbmRpZgorI2RlZmluZSBJTlRfQklUIChDSEFSX0JJVCAqIHNpemVvZihpbnQpKQorCisvLyBUaGUgZGVmaW5lcyBiZWxvdyBkZWZpbmUgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgYXJlIHJlYWQgYXQgb25jZSBmb3IKKy8vIHJlYWRpbmcgdmxjIHZhbHVlcy4gQ2hhbmdpbmcgdGhlc2UgbWF5IGltcHJvdmUgc3BlZWQgYW5kIGRhdGEgY2FjaGUgbmVlZHMKKy8vIGJlIGF3YXJlIHRob3VnaCB0aGF0IGRlY3JlYXNpbmcgdGhlbSBtYXkgbmVlZCB0aGUgbnVtYmVyIG9mIHN0YWdlcyB0aGF0IGlzCisvLyBwYXNzZWQgdG8gZ2V0X3ZsYyogdG8gYmUgaW5jcmVhc2VkLgorI2RlZmluZSBJTlRSQV9NQ0JQQ19WTENfQklUUyA2CisjZGVmaW5lIElOVEVSX01DQlBDX1ZMQ19CSVRTIDcKKyNkZWZpbmUgQ0JQWV9WTENfQklUUyA2CisjZGVmaW5lIFRFWF9WTENfQklUUyA5CisKK2V4dGVybiBjb25zdCBBVlJhdGlvbmFsIGZmX2gyNjNfcGl4ZWxfYXNwZWN0WzE2XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2gyNjNfY2JweV90YWJbMTZdWzJdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9jYnBjX2JfdGFiWzRdWzJdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9tdnRhYlszM11bMl07CisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2gyNjNfaW50cmFfTUNCUENfY29kZVs5XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2gyNjNfaW50cmFfTUNCUENfYml0c1s5XTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaDI2M19pbnRlcl9NQ0JQQ19jb2RlWzI4XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2gyNjNfaW50ZXJfTUNCUENfYml0c1syOF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oMjYzX21idHlwZV9iX3RhYlsxNV1bMl07CisKK2V4dGVybiBWTEMgZmZfaDI2M19pbnRyYV9NQ0JQQ192bGM7CitleHRlcm4gVkxDIGZmX2gyNjNfaW50ZXJfTUNCUENfdmxjOworZXh0ZXJuIFZMQyBmZl9oMjYzX2NicHlfdmxjOworCitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfaW50ZXJfdmxjWzEwM11bMl07CitleHRlcm4gY29uc3QgaW50OF90IGZmX2ludGVyX2xldmVsWzEwMl07CitleHRlcm4gY29uc3QgaW50OF90IGZmX2ludGVyX3J1blsxMDJdOworCitleHRlcm4gUkxUYWJsZSBmZl9oMjYzX3JsX2ludGVyOworCitleHRlcm4gUkxUYWJsZSBmZl9ybF9pbnRyYV9haWM7CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9oMjYzX2Zvcm1hdFs4XVsyXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX21vZGlmaWVkX3F1YW50X3RhYlsyXVszMl07CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfbWJhX21heFs2XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX21iYV9sZW5ndGhbN107CisKK2V4dGVybiB1aW50OF90IGZmX2gyNjNfc3RhdGljX3JsX3RhYmxlX3N0b3JlWzJdWzJdWzIqTUFYX1JVTiArIE1BWF9MRVZFTCArIDNdOworCitleHRlcm4gY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGZmX2gyNjNfaHdhY2NlbF9waXhmbXRfbGlzdF80MjBbXTsKKworCitpbnQgZmZfaDI2M19kZWNvZGVfbW90aW9uKE1wZWdFbmNDb250ZXh0ICogcywgaW50IHByZWQsIGludCBmX2NvZGUpOworYXZfY29uc3QgaW50IGZmX2gyNjNfYXNwZWN0X3RvX2luZm8oQVZSYXRpb25hbCBhc3BlY3QpOworaW50IGZmX2gyNjNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK2ludCBmZl9oMjYzX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpOworaW50IGZmX2gyNjNfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl9oMjYzX2VuY29kZV9tYihNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBibG9ja1s2XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feCwgaW50IG1vdGlvbl95KTsKK3ZvaWQgZmZfaDI2M19lbmNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBwaWN0dXJlX251bWJlcik7Cit2b2lkIGZmX2gyNjNfZW5jb2RlX2dvYl9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgbWJfbGluZSk7CitpbnQxNl90ICpmZl9oMjYzX3ByZWRfbW90aW9uKE1wZWdFbmNDb250ZXh0ICogcywgaW50IGJsb2NrLCBpbnQgZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnB4LCBpbnQgKnB5KTsKK3ZvaWQgZmZfaDI2M19lbmNvZGVfaW5pdChNcGVnRW5jQ29udGV4dCAqcyk7Cit2b2lkIGZmX2gyNjNfZGVjb2RlX2luaXRfdmxjKHZvaWQpOworaW50IGZmX2gyNjNfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzKTsKK2ludCBmZl9oMjYzX2RlY29kZV9nb2JfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfaDI2M191cGRhdGVfbW90aW9uX3ZhbChNcGVnRW5jQ29udGV4dCAqIHMpOwordm9pZCBmZl9oMjYzX2xvb3BfZmlsdGVyKE1wZWdFbmNDb250ZXh0ICogcyk7CitpbnQgZmZfaDI2M19kZWNvZGVfbWJhKE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfaDI2M19lbmNvZGVfbWJhKE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfaW5pdF9xc2NhbGVfdGFiKE1wZWdFbmNDb250ZXh0ICpzKTsKK2ludCBmZl9oMjYzX3ByZWRfZGMoTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgbiwgaW50MTZfdCAqKmRjX3ZhbF9wdHIpOwordm9pZCBmZl9oMjYzX3ByZWRfYWNkYyhNcGVnRW5jQ29udGV4dCAqIHMsIGludDE2X3QgKmJsb2NrLCBpbnQgbik7CisKKworLyoqCisgKiBQcmludCBwaWN0dXJlIGluZm8gaWYgRkZfREVCVUdfUElDVF9JTkZPIGlzIHNldC4KKyAqLwordm9pZCBmZl9oMjYzX3Nob3dfcGljdF9pbmZvKE1wZWdFbmNDb250ZXh0ICpzKTsKKworaW50IGZmX2ludGVsX2gyNjNfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzKTsKK2ludCBmZl9oMjYzX2RlY29kZV9tYihNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGJsb2NrWzZdWzY0XSk7CisKKy8qKgorICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgM2JpdCAic291cmNlIGZvcm1hdCIgc3ludGF4IGVsZW1lbnQuCisgKiBUaGlzIHJlcHJlc2VudHMgc29tZSBzdGFuZGFyZCBwaWN0dXJlIGRpbWVuc2lvbnMgb3IgaW5kaWNhdGVzIHRoYXQKKyAqIHdpZHRoJmhlaWdodCBhcmUgZXhwbGljaXRseSBzdG9yZWQgbGF0ZXIuCisgKi8KK2ludCBhdl9jb25zdCBoMjYzX2dldF9waWN0dXJlX2Zvcm1hdChpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCit2b2lkIGZmX2NsZWFuX2gyNjNfcXNjYWxlcyhNcGVnRW5jQ29udGV4dCAqcyk7CitpbnQgZmZfaDI2M19yZXN5bmMoTXBlZ0VuY0NvbnRleHQgKnMpOworaW50IGZmX2gyNjNfZ2V0X2dvYl9oZWlnaHQoTXBlZ0VuY0NvbnRleHQgKnMpOwordm9pZCBmZl9oMjYzX2VuY29kZV9tb3Rpb24oTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgdmFsLCBpbnQgZl9jb2RlKTsKKworCitzdGF0aWMgaW5saW5lIGludCBoMjYzX2dldF9tb3Rpb25fbGVuZ3RoKE1wZWdFbmNDb250ZXh0ICogcywgaW50IHZhbCwgaW50IGZfY29kZSl7CisgICAgaW50IGwsIGJpdF9zaXplLCBjb2RlOworCisgICAgaWYgKHZhbCA9PSAwKSB7CisgICAgICAgIHJldHVybiBmZl9tdnRhYlswXVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgICBiaXRfc2l6ZSA9IGZfY29kZSAtIDE7CisgICAgICAgIC8qIG1vZHVsbyBlbmNvZGluZyAqLworICAgICAgICBsPSBJTlRfQklUIC0gNiAtIGJpdF9zaXplOworICAgICAgICB2YWwgPSAodmFsPDxsKT4+bDsKKyAgICAgICAgdmFsLS07CisgICAgICAgIGNvZGUgPSAodmFsID4+IGJpdF9zaXplKSArIDE7CisKKyAgICAgICAgcmV0dXJuIGZmX212dGFiW2NvZGVdWzFdICsgMSArIGJpdF9zaXplOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGZmX2gyNjNfZW5jb2RlX21vdGlvbl92ZWN0b3IoTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgeCwgaW50IHksIGludCBmX2NvZGUpeworICAgIGlmKHMtPmZsYWdzMiAmIENPREVDX0ZMQUcyX05PX09VVFBVVCl7CisgICAgICAgIHNraXBfcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgaDI2M19nZXRfbW90aW9uX2xlbmd0aChzLCB4LCBmX2NvZGUpCisgICAgICAgICAgICtoMjYzX2dldF9tb3Rpb25fbGVuZ3RoKHMsIHksIGZfY29kZSkpOworICAgIH1lbHNleworICAgICAgICBmZl9oMjYzX2VuY29kZV9tb3Rpb24ocywgeCwgZl9jb2RlKTsKKyAgICAgICAgZmZfaDI2M19lbmNvZGVfbW90aW9uKHMsIHksIGZfY29kZSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfcF9jYnAoTXBlZ0VuY0NvbnRleHQgKiBzLAorICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgYmxvY2tbNl1bNjRdLAorICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feCwgaW50IG1vdGlvbl95KXsKKyAgICBpbnQgY2JwLCBpOworCisgICAgaWYgKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX0NCUF9SRCkgeworICAgICAgICBpbnQgYmVzdF9jYnB5X3Njb3JlPSBJTlRfTUFYOworICAgICAgICBpbnQgYmVzdF9jYnBjX3Njb3JlPSBJTlRfTUFYOworICAgICAgICBpbnQgY2JwYyA9ICgtMSksIGNicHk9ICgtMSk7CisgICAgICAgIGNvbnN0IGludCBvZmZzZXQ9IChzLT5tdl90eXBlPT1NVl9UWVBFXzE2WDE2ID8gMCA6IDE2KSArIChzLT5kcXVhbnQgPyA4IDogMCk7CisgICAgICAgIGNvbnN0IGludCBsYW1iZGE9IHMtPmxhbWJkYTIgPj4gKEZGX0xBTUJEQV9TSElGVCAtIDYpOworCisgICAgICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgICAgIGludCBzY29yZT0gZmZfaDI2M19pbnRlcl9NQ0JQQ19iaXRzW2kgKyBvZmZzZXRdICogbGFtYmRhOworICAgICAgICAgICAgaWYoaSYxKSBzY29yZSArPSBzLT5jb2RlZF9zY29yZVs1XTsKKyAgICAgICAgICAgIGlmKGkmMikgc2NvcmUgKz0gcy0+Y29kZWRfc2NvcmVbNF07CisKKyAgICAgICAgICAgIGlmKHNjb3JlIDwgYmVzdF9jYnBjX3Njb3JlKXsKKyAgICAgICAgICAgICAgICBiZXN0X2NicGNfc2NvcmU9IHNjb3JlOworICAgICAgICAgICAgICAgIGNicGM9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoaT0wOyBpPDE2OyBpKyspeworICAgICAgICAgICAgaW50IHNjb3JlPSBmZl9oMjYzX2NicHlfdGFiW2kgXiAweEZdWzFdICogbGFtYmRhOworICAgICAgICAgICAgaWYoaSYxKSBzY29yZSArPSBzLT5jb2RlZF9zY29yZVszXTsKKyAgICAgICAgICAgIGlmKGkmMikgc2NvcmUgKz0gcy0+Y29kZWRfc2NvcmVbMl07CisgICAgICAgICAgICBpZihpJjQpIHNjb3JlICs9IHMtPmNvZGVkX3Njb3JlWzFdOworICAgICAgICAgICAgaWYoaSY4KSBzY29yZSArPSBzLT5jb2RlZF9zY29yZVswXTsKKworICAgICAgICAgICAgaWYoc2NvcmUgPCBiZXN0X2NicHlfc2NvcmUpeworICAgICAgICAgICAgICAgIGJlc3RfY2JweV9zY29yZT0gc2NvcmU7CisgICAgICAgICAgICAgICAgY2JweT0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYnA9IGNicGMgKyA0KmNicHk7CisgICAgICAgIGlmICgobW90aW9uX3ggfCBtb3Rpb25feSB8IHMtPmRxdWFudCkgPT0gMCAmJiBzLT5tdl90eXBlPT1NVl9UWVBFXzE2WDE2KXsKKyAgICAgICAgICAgIGlmKGJlc3RfY2JweV9zY29yZSArIGJlc3RfY2JwY19zY29yZSArIDIqbGFtYmRhID49IDApCisgICAgICAgICAgICAgICAgY2JwPSAwOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgaWYgKHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPj0gMCAmJiAoKGNicCA+PiAoNSAtIGkpKSYxKT09MCApeworICAgICAgICAgICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbaV09IC0xOworICAgICAgICAgICAgICAgIHMtPmJkc3AuY2xlYXJfYmxvY2socy0+YmxvY2tbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIGNicD0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgaWYgKHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPj0gMCkKKyAgICAgICAgICAgICAgICBjYnAgfD0gMSA8PCAoNSAtIGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjYnA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1zZXR3KHNob3J0ICp0YWIsIGludCB2YWwsIGludCBuKQoreworICAgIGludCBpOworICAgIGZvcihpPTA7aTxuO2krKykKKyAgICAgICAgdGFiW2ldID0gdmFsOworfQorCisjZW5kaWYgLyogQVZDT0RFQ19IMjYzX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjNfcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjYzX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlN2Q0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjYzX3BhcnNlci5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBILjI2MyBwYXJzZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjYzIHBhcnNlcgorICovCisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJoMjYzX3BhcnNlci5oIgorCitpbnQgZmZfaDI2M19maW5kX2ZyYW1lX2VuZChQYXJzZUNvbnRleHQgKnBjLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSl7CisgICAgaW50IHZvcF9mb3VuZCwgaTsKKyAgICB1aW50MzJfdCBzdGF0ZTsKKworICAgIHZvcF9mb3VuZD0gcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kOworICAgIHN0YXRlPSBwYy0+c3RhdGU7CisKKyAgICBpPTA7CisgICAgaWYoIXZvcF9mb3VuZCl7CisgICAgICAgIGZvcihpPTA7IGk8YnVmX3NpemU7IGkrKyl7CisgICAgICAgICAgICBzdGF0ZT0gKHN0YXRlPDw4KSB8IGJ1ZltpXTsKKyAgICAgICAgICAgIGlmKHN0YXRlPj4oMzItMjIpID09IDB4MjApeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB2b3BfZm91bmQ9MTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHZvcF9mb3VuZCl7CisgICAgICBmb3IoOyBpPGJ1Zl9zaXplOyBpKyspeworICAgICAgICBzdGF0ZT0gKHN0YXRlPDw4KSB8IGJ1ZltpXTsKKyAgICAgICAgaWYoc3RhdGU+PigzMi0yMikgPT0gMHgyMCl7CisgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQ9MDsKKyAgICAgICAgICAgIHBjLT5zdGF0ZT0tMTsKKyAgICAgICAgICAgIHJldHVybiBpLTM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kPSB2b3BfZm91bmQ7CisgICAgcGMtPnN0YXRlPSBzdGF0ZTsKKworICAgIHJldHVybiBFTkRfTk9UX0ZPVU5EOworfQorCitzdGF0aWMgaW50IGgyNjNfcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBQYXJzZUNvbnRleHQgKnBjID0gcy0+cHJpdl9kYXRhOworICAgIGludCBuZXh0OworCisgICAgaWYgKHMtPmZsYWdzICYgUEFSU0VSX0ZMQUdfQ09NUExFVEVfRlJBTUVTKSB7CisgICAgICAgIG5leHQgPSBidWZfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXh0PSBmZl9oMjYzX2ZpbmRfZnJhbWVfZW5kKHBjLCBidWYsIGJ1Zl9zaXplKTsKKworICAgICAgICBpZiAoZmZfY29tYmluZV9mcmFtZShwYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgICAgICpwb3V0YnVmID0gTlVMTDsKKyAgICAgICAgICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgKnBvdXRidWYgPSBidWY7CisgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIHJldHVybiBuZXh0OworfQorCitBVkNvZGVjUGFyc2VyIGZmX2gyNjNfcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfSDI2MyB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfcGFyc2UgICA9IGgyNjNfcGFyc2UsCisgICAgLnBhcnNlcl9jbG9zZSAgID0gZmZfcGFyc2VfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2M19wYXJzZXIuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjNfcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1YTIyMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjNfcGFyc2VyLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIEguMjYzIHBhcnNlcgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0gyNjNfUEFSU0VSX0gKKyNkZWZpbmUgQVZDT0RFQ19IMjYzX1BBUlNFUl9ICisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKworaW50IGZmX2gyNjNfZmluZF9mcmFtZV9lbmQoUGFyc2VDb250ZXh0ICpwYywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpOworCisjZW5kaWYgLyogQVZDT0RFQ19IMjYzX1BBUlNFUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjYzZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2M2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Q5NjVmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2M2RhdGEuaApAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogSDI2Mysgc3VwcG9ydAorICogY29weXJpZ2h0IChjKSAyMDAxIEp1YW4gSi4gU2llcnJhbHRhIFAKKyAqIGNvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjYzIHRhYmxlcy4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSDI2M0RBVEFfSAorI2RlZmluZSBBVkNPREVDX0gyNjNEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorCisvKiBpbnRyYSBNQ0JQQywgbWJfdHlwZSA9IChpbnRyYSksIHRoZW4gKGludHJhcSkgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfaDI2M19pbnRyYV9NQ0JQQ19jb2RlWzldID0geyAxLCAxLCAyLCAzLCAxLCAxLCAyLCAzLCAxIH07Citjb25zdCB1aW50OF90IGZmX2gyNjNfaW50cmFfTUNCUENfYml0c1s5XSA9IHsgMSwgMywgMywgMywgNCwgNiwgNiwgNiwgOSB9OworCisvKiBpbnRlciBNQ0JQQywgbWJfdHlwZSA9IChpbnRlciksIChpbnRyYSksIChpbnRlcnEpLCAoaW50cmFxKSwgKGludGVyNHYpICovCisvKiBDaGFuZ2VkIHRoZSB0YWJsZXMgZm9yIGludGVycSBhbmQgaW50ZXI0ditxLCBmb2xsb3dpbmcgdGhlIHN0YW5kYXJkICoqIEp1YW5qbyAqKiAqLworY29uc3QgdWludDhfdCBmZl9oMjYzX2ludGVyX01DQlBDX2NvZGVbMjhdID0geworICAgIDEsIDMsIDIsIDUsCisgICAgMywgNCwgMywgMywKKyAgICAzLCA3LCA2LCA1LAorICAgIDQsIDQsIDMsIDIsCisgICAgMiwgNSwgNCwgNSwKKyAgICAxLCAwLCAwLCAwLCAvKiBTdHVmZmluZyAqLworICAgIDIsIDEyLCAxNCwgMTUsCit9OworY29uc3QgdWludDhfdCBmZl9oMjYzX2ludGVyX01DQlBDX2JpdHNbMjhdID0geworICAgIDEsIDQsIDQsIDYsIC8qIGludGVyICAqLworICAgIDUsIDgsIDgsIDcsIC8qIGludHJhICAqLworICAgIDMsIDcsIDcsIDksIC8qIGludGVyUSAqLworICAgIDYsIDksIDksIDksIC8qIGludHJhUSAqLworICAgIDMsIDcsIDcsIDgsIC8qIGludGVyNCAqLworICAgIDksIDAsIDAsIDAsIC8qIFN0dWZmaW5nICovCisgICAgMTEsIDEzLCAxMywgMTMsLyogaW50ZXI0USovCit9OworCitjb25zdCB1aW50OF90IGZmX2gyNjNfbWJ0eXBlX2JfdGFiWzE1XVsyXSA9IHsKKyB7MSwgMX0sCisgezMsIDN9LAorIHsxLCA1fSwKKyB7NCwgNH0sCisgezUsIDR9LAorIHs2LCA2fSwKKyB7MiwgNH0sCisgezMsIDR9LAorIHs3LCA2fSwKKyB7NCwgNn0sCisgezUsIDZ9LAorIHsxLCA2fSwKKyB7MSwxMH0sCisgezEsIDd9LAorIHsxLCA4fSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfY2JwY19iX3RhYls0XVsyXSA9IHsKK3swLCAxfSwKK3syLCAyfSwKK3s3LCAzfSwKK3s2LCAzfSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfaDI2M19jYnB5X3RhYlsxNl1bMl0gPQoreworICB7Myw0fSwgezUsNX0sIHs0LDV9LCB7OSw0fSwgezMsNX0sIHs3LDR9LCB7Miw2fSwgezExLDR9LAorICB7Miw1fSwgezMsNn0sIHs1LDR9LCB7MTAsNH0sIHs0LDR9LCB7OCw0fSwgezYsNH0sIHszLDJ9Cit9OworCitjb25zdCB1aW50OF90IGZmX212dGFiWzMzXVsyXSA9Cit7CisgIHsxLDF9LCB7MSwyfSwgezEsM30sIHsxLDR9LCB7Myw2fSwgezUsN30sIHs0LDd9LCB7Myw3fSwKKyAgezExLDl9LCB7MTAsOX0sIHs5LDl9LCB7MTcsMTB9LCB7MTYsMTB9LCB7MTUsMTB9LCB7MTQsMTB9LCB7MTMsMTB9LAorICB7MTIsMTB9LCB7MTEsMTB9LCB7MTAsMTB9LCB7OSwxMH0sIHs4LDEwfSwgezcsMTB9LCB7NiwxMH0sIHs1LDEwfSwKKyAgezQsMTB9LCB7NywxMX0sIHs2LDExfSwgezUsMTF9LCB7NCwxMX0sIHszLDExfSwgezIsMTF9LCB7MywxMn0sCisgIHsyLDEyfQorfTsKKworLyogdGhpcmQgbm9uIGludHJhIHRhYmxlICovCitjb25zdCB1aW50MTZfdCBmZl9pbnRlcl92bGNbMTAzXVsyXSA9IHsKK3sgMHgyLCAyIH0seyAweGYsIDQgfSx7IDB4MTUsIDYgfSx7IDB4MTcsIDcgfSwKK3sgMHgxZiwgOCB9LHsgMHgyNSwgOSB9LHsgMHgyNCwgOSB9LHsgMHgyMSwgMTAgfSwKK3sgMHgyMCwgMTAgfSx7IDB4NywgMTEgfSx7IDB4NiwgMTEgfSx7IDB4MjAsIDExIH0sCit7IDB4NiwgMyB9LHsgMHgxNCwgNiB9LHsgMHgxZSwgOCB9LHsgMHhmLCAxMCB9LAoreyAweDIxLCAxMSB9LHsgMHg1MCwgMTIgfSx7IDB4ZSwgNCB9LHsgMHgxZCwgOCB9LAoreyAweGUsIDEwIH0seyAweDUxLCAxMiB9LHsgMHhkLCA1IH0seyAweDIzLCA5IH0sCit7IDB4ZCwgMTAgfSx7IDB4YywgNSB9LHsgMHgyMiwgOSB9LHsgMHg1MiwgMTIgfSwKK3sgMHhiLCA1IH0seyAweGMsIDEwIH0seyAweDUzLCAxMiB9LHsgMHgxMywgNiB9LAoreyAweGIsIDEwIH0seyAweDU0LCAxMiB9LHsgMHgxMiwgNiB9LHsgMHhhLCAxMCB9LAoreyAweDExLCA2IH0seyAweDksIDEwIH0seyAweDEwLCA2IH0seyAweDgsIDEwIH0sCit7IDB4MTYsIDcgfSx7IDB4NTUsIDEyIH0seyAweDE1LCA3IH0seyAweDE0LCA3IH0sCit7IDB4MWMsIDggfSx7IDB4MWIsIDggfSx7IDB4MjEsIDkgfSx7IDB4MjAsIDkgfSwKK3sgMHgxZiwgOSB9LHsgMHgxZSwgOSB9LHsgMHgxZCwgOSB9LHsgMHgxYywgOSB9LAoreyAweDFiLCA5IH0seyAweDFhLCA5IH0seyAweDIyLCAxMSB9LHsgMHgyMywgMTEgfSwKK3sgMHg1NiwgMTIgfSx7IDB4NTcsIDEyIH0seyAweDcsIDQgfSx7IDB4MTksIDkgfSwKK3sgMHg1LCAxMSB9LHsgMHhmLCA2IH0seyAweDQsIDExIH0seyAweGUsIDYgfSwKK3sgMHhkLCA2IH0seyAweGMsIDYgfSx7IDB4MTMsIDcgfSx7IDB4MTIsIDcgfSwKK3sgMHgxMSwgNyB9LHsgMHgxMCwgNyB9LHsgMHgxYSwgOCB9LHsgMHgxOSwgOCB9LAoreyAweDE4LCA4IH0seyAweDE3LCA4IH0seyAweDE2LCA4IH0seyAweDE1LCA4IH0sCit7IDB4MTQsIDggfSx7IDB4MTMsIDggfSx7IDB4MTgsIDkgfSx7IDB4MTcsIDkgfSwKK3sgMHgxNiwgOSB9LHsgMHgxNSwgOSB9LHsgMHgxNCwgOSB9LHsgMHgxMywgOSB9LAoreyAweDEyLCA5IH0seyAweDExLCA5IH0seyAweDcsIDEwIH0seyAweDYsIDEwIH0sCit7IDB4NSwgMTAgfSx7IDB4NCwgMTAgfSx7IDB4MjQsIDExIH0seyAweDI1LCAxMSB9LAoreyAweDI2LCAxMSB9LHsgMHgyNywgMTEgfSx7IDB4NTgsIDEyIH0seyAweDU5LCAxMiB9LAoreyAweDVhLCAxMiB9LHsgMHg1YiwgMTIgfSx7IDB4NWMsIDEyIH0seyAweDVkLCAxMiB9LAoreyAweDVlLCAxMiB9LHsgMHg1ZiwgMTIgfSx7IDB4MywgNyB9LAorfTsKKworY29uc3QgaW50OF90IGZmX2ludGVyX2xldmVsWzEwMl0gPSB7CisgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LAorICA5LCAxMCwgMTEsIDEyLCAgMSwgIDIsICAzLCAgNCwKKyAgNSwgIDYsICAxLCAgMiwgIDMsICA0LCAgMSwgIDIsCisgIDMsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsICAxLAorICAyLCAgMywgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwKKyAgMSwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAxLCAgMSwgIDEsICAyLCAgMywgIDEsICAyLCAgMSwKKyAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKK307CisKK2NvbnN0IGludDhfdCBmZl9pbnRlcl9ydW5bMTAyXSA9IHsKKyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLAorICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAzLCAgMywKKyAgMywgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsCisgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDksICA5LAorIDEwLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKyAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisgMjUsIDI2LCAgMCwgIDAsICAwLCAgMSwgIDEsICAyLAorICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwKKyAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsCisgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LAorIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwKKyAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLAorfTsKKworUkxUYWJsZSBmZl9oMjYzX3JsX2ludGVyID0geworICAgIDEwMiwKKyAgICA1OCwKKyAgICBmZl9pbnRlcl92bGMsCisgICAgZmZfaW50ZXJfcnVuLAorICAgIGZmX2ludGVyX2xldmVsLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGludHJhX3ZsY19haWNbMTAzXVsyXSA9IHsKK3sgIDB4MiwgIDIgfSwgeyAgMHg2LCAgMyB9LCB7ICAweGUsICA0IH0sIHsgIDB4YywgIDUgfSwKK3sgIDB4ZCwgIDUgfSwgeyAweDEwLCAgNiB9LCB7IDB4MTEsICA2IH0sIHsgMHgxMiwgIDYgfSwKK3sgMHgxNiwgIDcgfSwgeyAweDFiLCAgOCB9LCB7IDB4MjAsICA5IH0sIHsgMHgyMSwgIDkgfSwKK3sgMHgxYSwgIDkgfSwgeyAweDFiLCAgOSB9LCB7IDB4MWMsICA5IH0sIHsgMHgxZCwgIDkgfSwKK3sgMHgxZSwgIDkgfSwgeyAweDFmLCAgOSB9LCB7IDB4MjMsIDExIH0sIHsgMHgyMiwgMTEgfSwKK3sgMHg1NywgMTIgfSwgeyAweDU2LCAxMiB9LCB7IDB4NTUsIDEyIH0sIHsgMHg1NCwgMTIgfSwKK3sgMHg1MywgMTIgfSwgeyAgMHhmLCAgNCB9LCB7IDB4MTQsICA2IH0sIHsgMHgxNCwgIDcgfSwKK3sgMHgxZSwgIDggfSwgeyAgMHhmLCAxMCB9LCB7IDB4MjEsIDExIH0sIHsgMHg1MCwgMTIgfSwKK3sgIDB4YiwgIDUgfSwgeyAweDE1LCAgNyB9LCB7ICAweGUsIDEwIH0sIHsgIDB4OSwgMTAgfSwKK3sgMHgxNSwgIDYgfSwgeyAweDFkLCAgOCB9LCB7ICAweGQsIDEwIH0sIHsgMHg1MSwgMTIgfSwKK3sgMHgxMywgIDYgfSwgeyAweDIzLCAgOSB9LCB7ICAweDcsIDExIH0sIHsgMHgxNywgIDcgfSwKK3sgMHgyMiwgIDkgfSwgeyAweDUyLCAxMiB9LCB7IDB4MWMsICA4IH0sIHsgIDB4YywgMTAgfSwKK3sgMHgxZiwgIDggfSwgeyAgMHhiLCAxMCB9LCB7IDB4MjUsICA5IH0sIHsgIDB4YSwgMTAgfSwKK3sgMHgyNCwgIDkgfSwgeyAgMHg2LCAxMSB9LCB7IDB4MjEsIDEwIH0sIHsgMHgyMCwgMTAgfSwKK3sgIDB4OCwgMTAgfSwgeyAweDIwLCAxMSB9LCB7ICAweDcsICA0IH0sIHsgIDB4YywgIDYgfSwKK3sgMHgxMCwgIDcgfSwgeyAweDEzLCAgOCB9LCB7IDB4MTEsICA5IH0sIHsgMHgxMiwgIDkgfSwKK3sgIDB4NCwgMTAgfSwgeyAweDI3LCAxMSB9LCB7IDB4MjYsIDExIH0sIHsgMHg1ZiwgMTIgfSwKK3sgIDB4ZiwgIDYgfSwgeyAweDEzLCAgOSB9LCB7ICAweDUsIDEwIH0sIHsgMHgyNSwgMTEgfSwKK3sgIDB4ZSwgIDYgfSwgeyAweDE0LCAgOSB9LCB7IDB4MjQsIDExIH0sIHsgIDB4ZCwgIDYgfSwKK3sgIDB4NiwgMTAgfSwgeyAweDVlLCAxMiB9LCB7IDB4MTEsICA3IH0sIHsgIDB4NywgMTAgfSwKK3sgMHgxMywgIDcgfSwgeyAweDVkLCAxMiB9LCB7IDB4MTIsICA3IH0sIHsgMHg1YywgMTIgfSwKK3sgMHgxNCwgIDggfSwgeyAweDViLCAxMiB9LCB7IDB4MTUsICA4IH0sIHsgMHgxYSwgIDggfSwKK3sgMHgxOSwgIDggfSwgeyAweDE4LCAgOCB9LCB7IDB4MTcsICA4IH0sIHsgMHgxNiwgIDggfSwKK3sgMHgxOSwgIDkgfSwgeyAweDE1LCAgOSB9LCB7IDB4MTYsICA5IH0sIHsgMHgxOCwgIDkgfSwKK3sgMHgxNywgIDkgfSwgeyAgMHg0LCAxMSB9LCB7ICAweDUsIDExIH0sIHsgMHg1OCwgMTIgfSwKK3sgMHg1OSwgMTIgfSwgeyAweDVhLCAxMiB9LCB7ICAweDMsICA3IH0sCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGludHJhX3J1bl9haWNbMTAyXSA9IHsKKyAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAyLCAgMiwgIDIsICAyLCAgMywgIDMsICAzLCAgMywKKyA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA2LCAgNiwKKyA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMSwKKzEyLCAxMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwKKyAyLCAgMiwgIDIsICAzLCAgMywgIDMsICA0LCAgNCwKKyA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA4LCAgOSwKKzEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywKKzE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGludHJhX2xldmVsX2FpY1sxMDJdID0geworIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LAorIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LAorMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAorMjUsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LAorIDEsICAyLCAgMywgIDQsICAxLCAgMiwgIDMsICA0LAorIDEsICAyLCAgMywgIDEsICAyLCAgMywgIDEsICAyLAorIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAxLAorIDEsICAxLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LAorIDcsICA4LCAgOSwgMTAsICAxLCAgMiwgIDMsICA0LAorIDEsICAyLCAgMywgIDEsICAyLCAgMywgIDEsICAyLAorIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAxLAorIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKK307CisKK1JMVGFibGUgZmZfcmxfaW50cmFfYWljID0geworICAgIDEwMiwKKyAgICA1OCwKKyAgICBpbnRyYV92bGNfYWljLAorICAgIGludHJhX3J1bl9haWMsCisgICAgaW50cmFfbGV2ZWxfYWljLAorfTsKKworY29uc3QgdWludDE2X3QgZmZfaDI2M19mb3JtYXRbOF1bMl0gPSB7CisgICAgeyAwLCAwIH0sCisgICAgeyAxMjgsIDk2IH0sCisgICAgeyAxNzYsIDE0NCB9LAorICAgIHsgMzUyLCAyODggfSwKKyAgICB7IDcwNCwgNTc2IH0sCisgICAgeyAxNDA4LCAxMTUyIH0sCit9OworCitjb25zdCB1aW50OF90IGZmX2FpY19kY19zY2FsZV90YWJsZVszMl09eworLy8gIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEKKyAgICAwLCAyLCA0LCA2LCA4LDEwLDEyLDE0LDE2LDE4LDIwLDIyLDI0LDI2LDI4LDMwLDMyLDM0LDM2LDM4LDQwLDQyLDQ0LDQ2LDQ4LDUwLDUyLDU0LDU2LDU4LDYwLDYyCit9OworCitjb25zdCB1aW50OF90IGZmX21vZGlmaWVkX3F1YW50X3RhYlsyXVszMl09eworLy8gIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEKK3sKKyAgICAwLCAzLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCA5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4Cit9LHsKKyAgICAwLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LDEwLDExLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMxLDMxLDI2Cit9Cit9OworCitjb25zdCB1aW50OF90IGZmX2gyNjNfY2hyb21hX3FzY2FsZV90YWJsZVszMl09eworLy8gIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEKKyAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA2LCA3LCA4LCA5LCA5LDEwLDEwLDExLDExLDEyLDEyLDEyLDEzLDEzLDEzLDE0LDE0LDE0LDE0LDE0LDE1LDE1LDE1LDE1LDE1Cit9OworCitjb25zdCB1aW50MTZfdCBmZl9tYmFfbWF4WzZdPXsKKyAgICAgNDcsICA5OCwgMzk1LDE1ODMsNjMzNSw5MjE1Cit9OworCitjb25zdCB1aW50OF90IGZmX21iYV9sZW5ndGhbN109eworICAgICAgNiwgICA3LCAgIDksICAxMSwgIDEzLCAgMTQsICAxNAorfTsKKworY29uc3QgQVZSYXRpb25hbCBmZl9oMjYzX3BpeGVsX2FzcGVjdFsxNl09eworIHswLCAxfSwKKyB7MSwgMX0sCisgezEyLCAxMX0sCisgezEwLCAxMX0sCisgezE2LCAxMX0sCisgezQwLCAzM30sCisgezAsIDF9LAorIHswLCAxfSwKKyB7MCwgMX0sCisgezAsIDF9LAorIHswLCAxfSwKKyB7MCwgMX0sCisgezAsIDF9LAorIHswLCAxfSwKKyB7MCwgMX0sCisgezAsIDF9LAorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSDI2M0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2M2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2M2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZjc4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjYzZGVjLmMKQEAgLTAsMCArMSw3NTQgQEAKKy8qCisgKiBILjI2MyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2MyBkZWNvZGVyLgorICovCisKKyNkZWZpbmUgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIgMQorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCisjaW5jbHVkZSAiZmx2LmgiCisjaW5jbHVkZSAiaDI2My5oIgorI2luY2x1ZGUgImgyNjNfcGFyc2VyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtcGVnX2VyLmgiCisjaW5jbHVkZSAibXBlZzR2aWRlby5oIgorI2luY2x1ZGUgIm1wZWc0dmlkZW9fcGFyc2VyLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAibXNtcGVnNC5oIgorI2luY2x1ZGUgInFwZWxkc3AuaCIKKyNpbmNsdWRlICJ2ZHBhdV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCitzdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IGgyNjNfZ2V0X2Zvcm1hdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfTVNTMikKKyAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfWVVWNDIwUDsKKworICAgIHJldHVybiBhdmN0eC0+cGl4X2ZtdCA9IGZmX2dldF9mb3JtYXQoYXZjdHgsIGF2Y3R4LT5jb2RlYy0+cGl4X2ZtdHMpOworfQorCithdl9jb2xkIGludCBmZl9oMjYzX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIHMtPm91dF9mb3JtYXQgICAgICA9IEZNVF9IMjYzOworCisgICAgLy8gc2V0IGRlZmF1bHRzCisgICAgZmZfbXB2X2RlY29kZV9kZWZhdWx0cyhzKTsKKyAgICBmZl9tcHZfZGVjb2RlX2luaXQocywgYXZjdHgpOworCisgICAgcy0+cXVhbnRfcHJlY2lzaW9uID0gNTsKKyAgICBzLT5kZWNvZGVfbWIgICAgICAgPSBmZl9oMjYzX2RlY29kZV9tYjsKKyAgICBzLT5sb3dfZGVsYXkgICAgICAgPSAxOworICAgIHMtPnVucmVzdHJpY3RlZF9tdiA9IDE7CisKKyAgICAvKiBzZWxlY3Qgc3ViIGNvZGVjICovCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWMtPmlkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzOgorICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2M1A6CisgICAgICAgIHMtPnVucmVzdHJpY3RlZF9tdiA9IDA7CisgICAgICAgIGF2Y3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gQVZDSFJPTUFfTE9DX0NFTlRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHNDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NU01QRUc0VjE6CisgICAgICAgIHMtPmgyNjNfcHJlZCAgICAgICA9IDE7CisgICAgICAgIHMtPm1zbXBlZzRfdmVyc2lvbiA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVNNUEVHNFYyOgorICAgICAgICBzLT5oMjYzX3ByZWQgICAgICAgPSAxOworICAgICAgICBzLT5tc21wZWc0X3ZlcnNpb24gPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01TTVBFRzRWMzoKKyAgICAgICAgcy0+aDI2M19wcmVkICAgICAgID0gMTsKKyAgICAgICAgcy0+bXNtcGVnNF92ZXJzaW9uID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9XTVYxOgorICAgICAgICBzLT5oMjYzX3ByZWQgICAgICAgPSAxOworICAgICAgICBzLT5tc21wZWc0X3ZlcnNpb24gPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1dNVjI6CisgICAgICAgIHMtPmgyNjNfcHJlZCAgICAgICA9IDE7CisgICAgICAgIHMtPm1zbXBlZzRfdmVyc2lvbiA9IDU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfVkMxOgorICAgIGNhc2UgQVZfQ09ERUNfSURfV01WMzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1ZDMUlNQUdFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfV01WM0lNQUdFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVNTMjoKKyAgICAgICAgcy0+aDI2M19wcmVkICAgICAgID0gMTsKKyAgICAgICAgcy0+bXNtcGVnNF92ZXJzaW9uID0gNjsKKyAgICAgICAgYXZjdHgtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24gPSBBVkNIUk9NQV9MT0NfTEVGVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzSToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9GTFYxOgorICAgICAgICBzLT5oMjYzX2ZsdiA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgY29kZWMgJWRcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWMtPmlkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisgICAgcy0+Y29kZWNfaWQgICAgPSBhdmN0eC0+Y29kZWMtPmlkOworCisgICAgaWYgKGF2Y3R4LT5zdHJlYW1fY29kZWNfdGFnID09IEFWX1JMMzIoImwyNjMiKSAmJiBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPT0gNTYgJiYgYXZjdHgtPmV4dHJhZGF0YVswXSA9PSAxKQorICAgICAgICBzLT5laGNfbW9kZSA9IDE7CisKKyAgICAvKiBmb3IgaDI2Mywgd2UgYWxsb2NhdGUgdGhlIGltYWdlcyBhZnRlciBoYXZpbmcgcmVhZCB0aGUgaGVhZGVyICovCisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgIT0gQVZfQ09ERUNfSURfSDI2MyAmJgorICAgICAgICBhdmN0eC0+Y29kZWMtPmlkICE9IEFWX0NPREVDX0lEX0gyNjNQICYmCisgICAgICAgIGF2Y3R4LT5jb2RlYy0+aWQgIT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBoMjYzX2dldF9mb3JtYXQoYXZjdHgpOworICAgICAgICBmZl9tcHZfaWRjdF9pbml0KHMpOworICAgICAgICBpZiAoKHJldCA9IGZmX21wdl9jb21tb25faW5pdChzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmZl9oMjYzZHNwX2luaXQoJnMtPmgyNjNkc3ApOworICAgIGZmX3FwZWxkc3BfaW5pdCgmcy0+cWRzcCk7CisgICAgZmZfaDI2M19kZWNvZGVfaW5pdF92bGMoKTsKKworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIGludCBmZl9oMjYzX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGZmX21wdl9jb21tb25fZW5kKHMpOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZvciBidWlsZGluZyB0aGUgY3VycmVudCBmcmFtZS4KKyAqLworc3RhdGljIGludCBnZXRfY29uc3VtZWRfYnl0ZXMoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgcG9zID0gKGdldF9iaXRzX2NvdW50KCZzLT5nYikgKyA3KSA+PiAzOworCisgICAgaWYgKHMtPmRpdnhfcGFja2VkIHx8IHMtPmF2Y3R4LT5od2FjY2VsKSB7CisgICAgICAgIC8qIFdlIHdvdWxkIGhhdmUgdG8gc2NhbiB0aHJvdWdoIHRoZSB3aG9sZSBidWYgdG8gaGFuZGxlIHRoZSB3ZWlyZAorICAgICAgICAgKiByZW9yZGVyaW5nIC4uLiAqLworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfSBlbHNlIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfVFJVTkNBVEVEKSB7CisgICAgICAgIHBvcyAtPSBzLT5wYXJzZV9jb250ZXh0Lmxhc3RfaW5kZXg7CisgICAgICAgIC8vIHBhZGRpbmcgaXMgbm90IHJlYWxseSByZWFkIHNvIHRoaXMgbWlnaHQgYmUgLTEKKyAgICAgICAgaWYgKHBvcyA8IDApCisgICAgICAgICAgICBwb3MgPSAwOworICAgICAgICByZXR1cm4gcG9zOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGF2b2lkIGluZmluaXRlIGxvb3BzIChtYXliZSBub3QgbmVlZGVkLi4uKQorICAgICAgICBpZiAocG9zID09IDApCisgICAgICAgICAgICBwb3MgPSAxOworICAgICAgICAvLyBvb3BzIDspCisgICAgICAgIGlmIChwb3MgKyAxMCA+IGJ1Zl9zaXplKQorICAgICAgICAgICAgcG9zID0gYnVmX3NpemU7CisKKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3NsaWNlKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGNvbnN0IGludCBwYXJ0X21hc2sgPSBzLT5wYXJ0aXRpb25lZF9mcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICA/IChFUl9BQ19FTkQgfCBFUl9BQ19FUlJPUikgOiAweDdGOworICAgIGNvbnN0IGludCBtYl9zaXplICAgPSAxNiA+PiBzLT5hdmN0eC0+bG93cmVzOworICAgIGludCByZXQ7CisKKyAgICBzLT5sYXN0X3Jlc3luY19nYiAgID0gcy0+Z2I7CisgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZSA9IDE7CisgICAgcy0+cmVzeW5jX21iX3ggICAgICA9IHMtPm1iX3g7CisgICAgcy0+cmVzeW5jX21iX3kgICAgICA9IHMtPm1iX3k7CisKKyAgICBmZl9zZXRfcXNjYWxlKHMsIHMtPnFzY2FsZSk7CisKKyAgICBpZiAocy0+YXZjdHgtPmh3YWNjZWwpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3RhcnQgPSBzLT5nYi5idWZmZXIgKyBnZXRfYml0c19jb3VudCgmcy0+Z2IpIC8gODsKKyAgICAgICAgcmV0ID0gcy0+YXZjdHgtPmh3YWNjZWwtPmRlY29kZV9zbGljZShzLT5hdmN0eCwgc3RhcnQsIHMtPmdiLmJ1ZmZlcl9lbmQgLSBzdGFydCk7CisgICAgICAgIC8vIGVuc3VyZSB3ZSBleGl0IGRlY29kZSBsb29wCisgICAgICAgIHMtPm1iX3kgPSBzLT5tYl9oZWlnaHQ7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKHMtPnBhcnRpdGlvbmVkX2ZyYW1lKSB7CisgICAgICAgIGNvbnN0IGludCBxc2NhbGUgPSBzLT5xc2NhbGU7CisKKyAgICAgICAgaWYgKENPTkZJR19NUEVHNF9ERUNPREVSICYmIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KQorICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9tcGVnNF9kZWNvZGVfcGFydGl0aW9ucyhzLT5hdmN0eC0+cHJpdl9kYXRhKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgLyogcmVzdG9yZSB2YXJpYWJsZXMgd2hpY2ggd2VyZSBtb2RpZmllZCAqLworICAgICAgICBzLT5maXJzdF9zbGljZV9saW5lID0gMTsKKyAgICAgICAgcy0+bWJfeCAgICAgICAgICAgICA9IHMtPnJlc3luY19tYl94OworICAgICAgICBzLT5tYl95ICAgICAgICAgICAgID0gcy0+cmVzeW5jX21iX3k7CisgICAgICAgIGZmX3NldF9xc2NhbGUocywgcXNjYWxlKTsKKyAgICB9CisKKyAgICBmb3IgKDsgcy0+bWJfeSA8IHMtPm1iX2hlaWdodDsgcy0+bWJfeSsrKSB7CisgICAgICAgIC8qIHBlci1yb3cgZW5kIG9mIHNsaWNlIGNoZWNrcyAqLworICAgICAgICBpZiAocy0+bXNtcGVnNF92ZXJzaW9uKSB7CisgICAgICAgICAgICBpZiAocy0+cmVzeW5jX21iX3kgKyBzLT5zbGljZV9oZWlnaHQgPT0gcy0+bWJfeSkgeworICAgICAgICAgICAgICAgIGZmX2VyX2FkZF9zbGljZSgmcy0+ZXIsIHMtPnJlc3luY19tYl94LCBzLT5yZXN5bmNfbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfeCAtIDEsIHMtPm1iX3ksIEVSX01CX0VORCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5tc21wZWc0X3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgcy0+bGFzdF9kY1swXSA9CisgICAgICAgICAgICBzLT5sYXN0X2RjWzFdID0KKyAgICAgICAgICAgIHMtPmxhc3RfZGNbMl0gPSAxMjg7CisgICAgICAgIH0KKworICAgICAgICBmZl9pbml0X2Jsb2NrX2luZGV4KHMpOworICAgICAgICBmb3IgKDsgcy0+bWJfeCA8IHMtPm1iX3dpZHRoOyBzLT5tYl94KyspIHsKKyAgICAgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgICAgIGZmX3VwZGF0ZV9ibG9ja19pbmRleChzKTsKKworICAgICAgICAgICAgaWYgKHMtPnJlc3luY19tYl94ID09IHMtPm1iX3ggJiYgcy0+cmVzeW5jX21iX3kgKyAxID09IHMtPm1iX3kpCisgICAgICAgICAgICAgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZSA9IDA7CisKKyAgICAgICAgICAgIC8qIERDVCAmIHF1YW50aXplICovCisKKyAgICAgICAgICAgIHMtPm12X2RpciAgPSBNVl9ESVJfRk9SV0FSRDsKKyAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgYXZfZGxvZyhzLCAiJWQgJWQgJTA2WFxuIiwKKyAgICAgICAgICAgICAgICAgICAgcmV0LCBnZXRfYml0c19jb3VudCgmcy0+Z2IpLCBzaG93X2JpdHMoJnMtPmdiLCAyNCkpOworCisgICAgICAgICAgICB0cHJpbnRmKE5VTEwsICJEZWNvZGluZyBNQiBhdCAlZHglZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICByZXQgPSBzLT5kZWNvZGVfbWIocywgcy0+YmxvY2spOworCisgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgICAgIGZmX2gyNjNfdXBkYXRlX21vdGlvbl92YWwocyk7CisKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHh5ID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBTTElDRV9FTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmZfbXB2X2RlY29kZV9tYihzLCBzLT5ibG9jayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5sb29wX2ZpbHRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfbG9vcF9maWx0ZXIocyk7CisKKyAgICAgICAgICAgICAgICAgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgcy0+cmVzeW5jX21iX3gsIHMtPnJlc3luY19tYl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfeCwgcy0+bWJfeSwgRVJfTUJfRU5EICYgcGFydF9tYXNrKTsKKworICAgICAgICAgICAgICAgICAgICBzLT5wYWRkaW5nX2J1Z19zY29yZS0tOworCisgICAgICAgICAgICAgICAgICAgIGlmICgrK3MtPm1iX3ggPj0gcy0+bWJfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3ggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQocywgcy0+bWJfeSAqIG1iX3NpemUsIG1iX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXB2X3JlcG9ydF9kZWNvZGVfcHJvZ3Jlc3Mocyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYl95Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gU0xJQ0VfTk9FTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xpY2UgbWlzbWF0Y2ggYXQgTUI6ICVkXG4iLCB4eSk7CisgICAgICAgICAgICAgICAgICAgIGZmX2VyX2FkZF9zbGljZSgmcy0+ZXIsIHMtPnJlc3luY19tYl94LCBzLT5yZXN5bmNfbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3ggKyAxLCBzLT5tYl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJfTUJfRU5EICYgcGFydF9tYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYXQgTUI6ICVkXG4iLCB4eSk7CisgICAgICAgICAgICAgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgcy0+cmVzeW5jX21iX3gsIHMtPnJlc3luY19tYl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYl94LCBzLT5tYl95LCBFUl9NQl9FUlJPUiAmIHBhcnRfbWFzayk7CisKKyAgICAgICAgICAgICAgICBpZiAocy0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfSUdOT1JFX0VSUikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZmX21wdl9kZWNvZGVfbWIocywgcy0+YmxvY2spOworICAgICAgICAgICAgaWYgKHMtPmxvb3BfZmlsdGVyKQorICAgICAgICAgICAgICAgIGZmX2gyNjNfbG9vcF9maWx0ZXIocyk7CisgICAgICAgIH0KKworICAgICAgICBmZl9tcGVnX2RyYXdfaG9yaXpfYmFuZChzLCBzLT5tYl95ICogbWJfc2l6ZSwgbWJfc2l6ZSk7CisgICAgICAgIGZmX21wdl9yZXBvcnRfZGVjb2RlX3Byb2dyZXNzKHMpOworCisgICAgICAgIHMtPm1iX3ggPSAwOworICAgIH0KKworICAgIGF2X2Fzc2VydDEocy0+bWJfeCA9PSAwICYmIHMtPm1iX3kgPT0gcy0+bWJfaGVpZ2h0KTsKKworICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCAgICAgICAgICYmCisgICAgICAgIChzLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfQVVUT0RFVEVDVCkgJiYKKyAgICAgICAgZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpID49IDQ4ICAgICAgICAgICAgICAmJgorICAgICAgICBzaG93X2JpdHMoJnMtPmdiLCAyNCkgPT0gMHg0MDEwICAgICAgICAgICYmCisgICAgICAgICFzLT5kYXRhX3BhcnRpdGlvbmluZykKKyAgICAgICAgcy0+cGFkZGluZ19idWdfc2NvcmUgKz0gMzI7CisKKyAgICAvKiB0cnkgdG8gZGV0ZWN0IHRoZSBwYWRkaW5nIGJ1ZyAqLworICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCAgICAgICAgICYmCisgICAgICAgIChzLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfQVVUT0RFVEVDVCkgJiYKKyAgICAgICAgZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpID49IDAgICAgICAgICAgICAgICAmJgorICAgICAgICBnZXRfYml0c19sZWZ0KCZzLT5nYikgPCAxMzcgICAgICAgICAgICAgICYmCisgICAgICAgICFzLT5kYXRhX3BhcnRpdGlvbmluZykgeworICAgICAgICBjb25zdCBpbnQgYml0c19jb3VudCA9IGdldF9iaXRzX2NvdW50KCZzLT5nYik7CisgICAgICAgIGNvbnN0IGludCBiaXRzX2xlZnQgID0gcy0+Z2Iuc2l6ZV9pbl9iaXRzIC0gYml0c19jb3VudDsKKworICAgICAgICBpZiAoYml0c19sZWZ0ID09IDApIHsKKyAgICAgICAgICAgIHMtPnBhZGRpbmdfYnVnX3Njb3JlICs9IDE2OworICAgICAgICB9IGVsc2UgaWYgKGJpdHNfbGVmdCAhPSAxKSB7CisgICAgICAgICAgICBpbnQgdiA9IHNob3dfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgdiB8PSAweDdGID4+ICg3IC0gKGJpdHNfY291bnQgJiA3KSk7CisKKyAgICAgICAgICAgIGlmICh2ID09IDB4N0YgJiYgYml0c19sZWZ0IDw9IDgpCisgICAgICAgICAgICAgICAgcy0+cGFkZGluZ19idWdfc2NvcmUtLTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHYgPT0gMHg3RiAmJiAoKGdldF9iaXRzX2NvdW50KCZzLT5nYikgKyA4KSAmIDgpICYmCisgICAgICAgICAgICAgICAgICAgICBiaXRzX2xlZnQgPD0gMTYpCisgICAgICAgICAgICAgICAgcy0+cGFkZGluZ19idWdfc2NvcmUgKz0gNDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzLT5wYWRkaW5nX2J1Z19zY29yZSsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjMgICAgICAgICAgJiYKKyAgICAgICAgKHMtPndvcmthcm91bmRfYnVncyAmIEZGX0JVR19BVVRPREVURUNUKSAmJgorICAgICAgICBnZXRfYml0c19sZWZ0KCZzLT5nYikgPj0gOCAgICAgICAgICAgICAgICYmCisgICAgICAgIGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8IDMwMCAgICAgICAgICAgICAgJiYKKyAgICAgICAgcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JICAgICAgICAmJgorICAgICAgICBzaG93X2JpdHMoJnMtPmdiLCA4KSA9PSAwICAgICAgICAgICAgICAgICYmCisgICAgICAgICFzLT5kYXRhX3BhcnRpdGlvbmluZykgeworCisgICAgICAgIHMtPnBhZGRpbmdfYnVnX3Njb3JlICs9IDMyOworICAgIH0KKworICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzICAgICAgICAgICYmCisgICAgICAgIChzLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfQVVUT0RFVEVDVCkgJiYKKyAgICAgICAgZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpID49IDY0ICAgICAgICAgICAgICAmJgorICAgICAgICBBVl9SQjY0KHMtPmdiLmJ1ZmZlcl9lbmQgLSA4KSA9PSAweENEQ0RDRENERkM3RjAwMDApIHsKKworICAgICAgICBzLT5wYWRkaW5nX2J1Z19zY29yZSArPSAzMjsKKyAgICB9CisKKyAgICBpZiAocy0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX0FVVE9ERVRFQ1QpIHsKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgKHMtPnBhZGRpbmdfYnVnX3Njb3JlID4gLTIgJiYgIXMtPmRhdGFfcGFydGl0aW9uaW5nKSkKKyAgICAgICAgICAgIHMtPndvcmthcm91bmRfYnVncyB8PSBGRl9CVUdfTk9fUEFERElORzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+d29ya2Fyb3VuZF9idWdzICY9IH5GRl9CVUdfTk9fUEFERElORzsKKyAgICB9CisKKyAgICAvLyBoYW5kbGUgZm9ybWF0cyB3aGljaCBkb24ndCBoYXZlIHVuaXF1ZSBlbmQgbWFya2VycworICAgIGlmIChzLT5tc21wZWc0X3ZlcnNpb24gfHwgKHMtPndvcmthcm91bmRfYnVncyAmIEZGX0JVR19OT19QQURESU5HKSkgeyAvLyBGSVhNRSBwZXJoYXBzIHNvbHZlIHRoaXMgbW9yZSBjbGVhbmx5CisgICAgICAgIGludCBsZWZ0ICAgICAgPSBnZXRfYml0c19sZWZ0KCZzLT5nYik7CisgICAgICAgIGludCBtYXhfZXh0cmEgPSA3OworCisgICAgICAgIC8qIG5vIG1hcmtlcnMgaW4gTSQgY3JhcCAqLworICAgICAgICBpZiAocy0+bXNtcGVnNF92ZXJzaW9uICYmIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkKKyAgICAgICAgICAgIG1heF9leHRyYSArPSAxNzsKKworICAgICAgICAvKiBidWdneSBwYWRkaW5nIGJ1dCB0aGUgZnJhbWUgc2hvdWxkIHN0aWxsIGVuZCBhcHByb3hpbWF0ZWx5IGF0CisgICAgICAgICAqIHRoZSBiaXRzdHJlYW0gZW5kICovCisgICAgICAgIGlmICgocy0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX05PX1BBRERJTkcpICYmCisgICAgICAgICAgICAocy0+ZXJyX3JlY29nbml0aW9uICYgKEFWX0VGX0JVRkZFUnxBVl9FRl9BR0dSRVNTSVZFKSkpCisgICAgICAgICAgICBtYXhfZXh0cmEgKz0gNDg7CisgICAgICAgIGVsc2UgaWYgKChzLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfTk9fUEFERElORykpCisgICAgICAgICAgICBtYXhfZXh0cmEgKz0gMjU2ICogMjU2ICogMjU2ICogNjQ7CisKKyAgICAgICAgaWYgKGxlZnQgPiBtYXhfZXh0cmEpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiZGlzY2FyZGluZyAlZCBqdW5rIGJpdHMgYXQgZW5kLCBuZXh0IHdvdWxkIGJlICVYXG4iLAorICAgICAgICAgICAgICAgICAgIGxlZnQsIHNob3dfYml0cygmcy0+Z2IsIDI0KSk7CisgICAgICAgIGVsc2UgaWYgKGxlZnQgPCAwKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJvdmVycmVhZGluZyAlZCBiaXRzXG4iLCAtbGVmdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZmX2VyX2FkZF9zbGljZSgmcy0+ZXIsIHMtPnJlc3luY19tYl94LCBzLT5yZXN5bmNfbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYl94IC0gMSwgcy0+bWJfeSwgRVJfTUJfRU5EKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgInNsaWNlIGVuZCBub3QgcmVhY2hlZCBidXQgc2NyZWVuc3BhY2UgZW5kICglZCBsZWZ0ICUwNlgsIHNjb3JlPSAlZClcbiIsCisgICAgICAgICAgIGdldF9iaXRzX2xlZnQoJnMtPmdiKSwgc2hvd19iaXRzKCZzLT5nYiwgMjQpLCBzLT5wYWRkaW5nX2J1Z19zY29yZSk7CisKKyAgICBmZl9lcl9hZGRfc2xpY2UoJnMtPmVyLCBzLT5yZXN5bmNfbWJfeCwgcy0+cmVzeW5jX21iX3ksIHMtPm1iX3gsIHMtPm1iX3ksCisgICAgICAgICAgICAgICAgICAgIEVSX01CX0VORCAmIHBhcnRfbWFzayk7CisKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworaW50IGZmX2gyNjNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIE1wZWdFbmNDb250ZXh0ICpzICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKyAgICBpbnQgc2xpY2VfcmV0ID0gMDsKKyAgICBBVkZyYW1lICpwaWN0ID0gZGF0YTsKKworICAgIHMtPmZsYWdzICA9IGF2Y3R4LT5mbGFnczsKKyAgICBzLT5mbGFnczIgPSBhdmN0eC0+ZmxhZ3MyOworCisgICAgLyogbm8gc3VwcGxlbWVudGFyeSBwaWN0dXJlICovCisgICAgaWYgKGJ1Zl9zaXplID09IDApIHsKKyAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciBsYXN0IHBpY3R1cmUgKi8KKyAgICAgICAgaWYgKHMtPmxvd19kZWxheSA9PSAwICYmIHMtPm5leHRfcGljdHVyZV9wdHIpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKHBpY3QsIHMtPm5leHRfcGljdHVyZV9wdHItPmYpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHMtPm5leHRfcGljdHVyZV9wdHIgPSBOVUxMOworCisgICAgICAgICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfVFJVTkNBVEVEKSB7CisgICAgICAgIGludCBuZXh0OworCisgICAgICAgIGlmIChDT05GSUdfTVBFRzRfREVDT0RFUiAmJiBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgeworICAgICAgICAgICAgbmV4dCA9IGZmX21wZWc0X2ZpbmRfZnJhbWVfZW5kKCZzLT5wYXJzZV9jb250ZXh0LCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChDT05GSUdfSDI2M19ERUNPREVSICYmIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjMpIHsKKyAgICAgICAgICAgIG5leHQgPSBmZl9oMjYzX2ZpbmRfZnJhbWVfZW5kKCZzLT5wYXJzZV9jb250ZXh0LCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChDT05GSUdfSDI2M1BfREVDT0RFUiAmJiBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzUCkgeworICAgICAgICAgICAgbmV4dCA9IGZmX2gyNjNfZmluZF9mcmFtZV9lbmQoJnMtPnBhcnNlX2NvbnRleHQsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgInRoaXMgY29kZWMgZG9lcyBub3Qgc3VwcG9ydCB0cnVuY2F0ZWQgYml0c3RyZWFtc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUoJnMtPnBhcnNlX2NvbnRleHQsIG5leHQsIChjb25zdCB1aW50OF90ICoqKSZidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKworcmV0cnk6CisgICAgaWYgKHMtPmRpdnhfcGFja2VkICYmIHMtPmJpdHN0cmVhbV9idWZmZXJfc2l6ZSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKGk9MDsgaSA8IGJ1Zl9zaXplLTM7IGkrKykgeworICAgICAgICAgICAgaWYgKGJ1ZltpXT09MCAmJiBidWZbaSsxXT09MCAmJiBidWZbaSsyXT09MSkgeworICAgICAgICAgICAgICAgIGlmIChidWZbaSszXT09MHhCMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRGlzY2FyZGluZyBleGNlc3NpdmUgYml0c3RyZWFtIGluIHBhY2tlZCB4dmlkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+Yml0c3RyZWFtX2J1ZmZlcl9zaXplID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+Yml0c3RyZWFtX2J1ZmZlcl9zaXplICYmIChzLT5kaXZ4X3BhY2tlZCB8fCBidWZfc2l6ZSA8IDIwKSkgLy8gZGl2eCA1LjAxKy94dmlkIGZyYW1lIHJlb3JkZXIKKyAgICAgICAgcmV0ID0gaW5pdF9nZXRfYml0czgoJnMtPmdiLCBzLT5iaXRzdHJlYW1fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5iaXRzdHJlYW1fYnVmZmVyX3NpemUpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gaW5pdF9nZXRfYml0czgoJnMtPmdiLCBidWYsIGJ1Zl9zaXplKTsKKworICAgIHMtPmJpdHN0cmVhbV9idWZmZXJfc2l6ZSA9IDA7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIXMtPmNvbnRleHRfaW5pdGlhbGl6ZWQpCisgICAgICAgIC8vIHdlIG5lZWQgdGhlIGlkY3QgcGVybXV0YXRvbiBmb3IgcmVhZGluZyBhIGN1c3RvbSBtYXRyaXgKKyAgICAgICAgZmZfbXB2X2lkY3RfaW5pdChzKTsKKworICAgIC8qIGxldCdzIGdvIDotKSAqLworICAgIGlmIChDT05GSUdfV01WMl9ERUNPREVSICYmIHMtPm1zbXBlZzRfdmVyc2lvbiA9PSA1KSB7CisgICAgICAgIHJldCA9IGZmX3dtdjJfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKHMpOworICAgIH0gZWxzZSBpZiAoQ09ORklHX01TTVBFRzRfREVDT0RFUiAmJiBzLT5tc21wZWc0X3ZlcnNpb24pIHsKKyAgICAgICAgcmV0ID0gZmZfbXNtcGVnNF9kZWNvZGVfcGljdHVyZV9oZWFkZXIocyk7CisgICAgfSBlbHNlIGlmIChDT05GSUdfTVBFRzRfREVDT0RFUiAmJiBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAmJiBzLT5waWN0dXJlX251bWJlciA9PSAwKSB7CisgICAgICAgICAgICBHZXRCaXRDb250ZXh0IGdiOworCisgICAgICAgICAgICBpZiAoaW5pdF9nZXRfYml0czgoJmdiLCBzLT5hdmN0eC0+ZXh0cmFkYXRhLCBzLT5hdmN0eC0+ZXh0cmFkYXRhX3NpemUpID49IDAgKQorICAgICAgICAgICAgICAgIGZmX21wZWc0X2RlY29kZV9waWN0dXJlX2hlYWRlcihhdmN0eC0+cHJpdl9kYXRhLCAmZ2IpOworICAgICAgICB9CisgICAgICAgIHJldCA9IGZmX21wZWc0X2RlY29kZV9waWN0dXJlX2hlYWRlcihhdmN0eC0+cHJpdl9kYXRhLCAmcy0+Z2IpOworICAgIH0gZWxzZSBpZiAoQ09ORklHX0gyNjNJX0RFQ09ERVIgJiYgcy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2M0kpIHsKKyAgICAgICAgcmV0ID0gZmZfaW50ZWxfaDI2M19kZWNvZGVfcGljdHVyZV9oZWFkZXIocyk7CisgICAgfSBlbHNlIGlmIChDT05GSUdfRkxWX0RFQ09ERVIgJiYgcy0+aDI2M19mbHYpIHsKKyAgICAgICAgcmV0ID0gZmZfZmx2X2RlY29kZV9waWN0dXJlX2hlYWRlcihzKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBmZl9oMjYzX2RlY29kZV9waWN0dXJlX2hlYWRlcihzKTsKKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCB8fCByZXQgPT0gRlJBTUVfU0tJUFBFRCkgeworICAgICAgICBpZiAoICAgcy0+d2lkdGggICE9IGF2Y3R4LT5jb2RlZF93aWR0aAorICAgICAgICAgICAgfHwgcy0+aGVpZ2h0ICE9IGF2Y3R4LT5jb2RlZF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiUmV2ZXJ0aW5nIHBpY3R1cmUgZGltZW5zaW9ucyBjaGFuZ2UgZHVlIHRvIGhlYWRlciBkZWNvZGluZyBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgICAgICBzLT53aWR0aCA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICAgICAgICAgICAgICBzLT5oZWlnaHQ9IGF2Y3R4LT5jb2RlZF9oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJldCA9PSBGUkFNRV9TS0lQUEVEKQorICAgICAgICByZXR1cm4gZ2V0X2NvbnN1bWVkX2J5dGVzKHMsIGJ1Zl9zaXplKTsKKworICAgIC8qIHNraXAgaWYgdGhlIGhlYWRlciB3YXMgdGhyYXNoZWQgKi8KKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImhlYWRlciBkYW1hZ2VkXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoIXMtPmNvbnRleHRfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBoMjYzX2dldF9mb3JtYXQoYXZjdHgpOworICAgICAgICBpZiAoKHJldCA9IGZmX21wdl9jb21tb25faW5pdChzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoIXMtPmN1cnJlbnRfcGljdHVyZV9wdHIgfHwgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVswXSkgeworICAgICAgICBpbnQgaSA9IGZmX2ZpbmRfdW51c2VkX3BpY3R1cmUocywgMCk7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyID0gJnMtPnBpY3R1cmVbaV07CisgICAgfQorCisgICAgYXZjdHgtPmhhc19iX2ZyYW1lcyA9ICFzLT5sb3dfZGVsYXk7CisKKyAgICBpZiAoQ09ORklHX01QRUc0X0RFQ09ERVIgJiYgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KSB7CisgICAgICAgIGlmIChmZl9tcGVnNF93b3JrYXJvdW5kX2J1Z3MoYXZjdHgpID09IDEpCisgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKworICAgIC8qIEFmdGVyIEgyNjMgJiBtcGVnNCBoZWFkZXIgZGVjb2RlIHdlIGhhdmUgdGhlIGhlaWdodCwgd2lkdGgsCisgICAgICogYW5kIG90aGVyIHBhcmFtZXRlcnMuIFNvIHRoZW4gd2UgY291bGQgaW5pdCB0aGUgcGljdHVyZS4KKyAgICAgKiBGSVhNRTogQnkgdGhlIHdheSBIMjYzIGRlY29kZXIgaXMgZXZvbHZpbmcgaXQgc2hvdWxkIGhhdmUKKyAgICAgKiBhbiBIMjYzRW5jQ29udGV4dCAqLworICAgIGlmIChzLT53aWR0aCAgIT0gYXZjdHgtPmNvZGVkX3dpZHRoICB8fAorICAgICAgICBzLT5oZWlnaHQgIT0gYXZjdHgtPmNvZGVkX2hlaWdodCB8fAorICAgICAgICBzLT5jb250ZXh0X3JlaW5pdCkgeworICAgICAgICAvKiBILjI2MyBjb3VsZCBjaGFuZ2UgcGljdHVyZSBzaXplIGFueSB0aW1lICovCisgICAgICAgIHMtPmNvbnRleHRfcmVpbml0ID0gMDsKKworICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgcy0+d2lkdGgsIHMtPmhlaWdodCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBmZl9zZXRfc2FyKGF2Y3R4LCBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyk7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9tcHZfY29tbW9uX2ZyYW1lX3NpemVfY2hhbmdlKHMpKSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ICE9IGgyNjNfZ2V0X2Zvcm1hdChhdmN0eCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZm9ybWF0IGNoYW5nZSBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzICB8fAorICAgICAgICBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzUCB8fAorICAgICAgICBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzSSkKKyAgICAgICAgcy0+Z29iX2luZGV4ID0gZmZfaDI2M19nZXRfZ29iX2hlaWdodChzKTsKKworICAgIC8vIGZvciBza2lwcGluZyB0aGUgZnJhbWUKKyAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+cGljdF90eXBlID0gcy0+cGljdF90eXBlOworICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5rZXlfZnJhbWUgPSBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICAvKiBza2lwIEItZnJhbWVzIGlmIHdlIGRvbid0IGhhdmUgcmVmZXJlbmNlIGZyYW1lcyAqLworICAgIGlmICghcy0+bGFzdF9waWN0dXJlX3B0ciAmJgorICAgICAgICAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CIHx8IHMtPmRyb3BwYWJsZSkpCisgICAgICAgIHJldHVybiBnZXRfY29uc3VtZWRfYnl0ZXMocywgYnVmX3NpemUpOworICAgIGlmICgoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiAmJgorICAgICAgICAgcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSAgICB8fAorICAgICAgICAoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTktFWSAmJgorICAgICAgICAgcy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JKSAgICB8fAorICAgICAgICBhdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfQUxMKQorICAgICAgICByZXR1cm4gZ2V0X2NvbnN1bWVkX2J5dGVzKHMsIGJ1Zl9zaXplKTsKKworICAgIGlmIChzLT5uZXh0X3BfZnJhbWVfZGFtYWdlZCkgeworICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgcmV0dXJuIGdldF9jb25zdW1lZF9ieXRlcyhzLCBidWZfc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPm5leHRfcF9mcmFtZV9kYW1hZ2VkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKCFzLT5ub19yb3VuZGluZykgfHwgcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIHMtPm1lLnFwZWxfcHV0ID0gcy0+cWRzcC5wdXRfcXBlbF9waXhlbHNfdGFiOworICAgICAgICBzLT5tZS5xcGVsX2F2ZyA9IHMtPnFkc3AuYXZnX3FwZWxfcGl4ZWxzX3RhYjsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5tZS5xcGVsX3B1dCA9IHMtPnFkc3AucHV0X25vX3JuZF9xcGVsX3BpeGVsc190YWI7CisgICAgICAgIHMtPm1lLnFwZWxfYXZnID0gcy0+cWRzcC5hdmdfcXBlbF9waXhlbHNfdGFiOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfbXB2X2ZyYW1lX3N0YXJ0KHMsIGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCFzLT5kaXZ4X3BhY2tlZCAmJiAhYXZjdHgtPmh3YWNjZWwpCisgICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoYXZjdHgpOworCisgICAgaWYgKENPTkZJR19NUEVHNF9WRFBBVV9ERUNPREVSICYmIChzLT5hdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIENPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVKSkgeworICAgICAgICBmZl92ZHBhdV9tcGVnNF9kZWNvZGVfcGljdHVyZShhdmN0eC0+cHJpdl9kYXRhLCBzLT5nYi5idWZmZXIsIHMtPmdiLmJ1ZmZlcl9lbmQgLSBzLT5nYi5idWZmZXIpOworICAgICAgICBnb3RvIGZyYW1lX2VuZDsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmh3YWNjZWwpIHsKKyAgICAgICAgcmV0ID0gYXZjdHgtPmh3YWNjZWwtPnN0YXJ0X2ZyYW1lKGF2Y3R4LCBzLT5nYi5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5nYi5idWZmZXJfZW5kIC0gcy0+Z2IuYnVmZmVyKTsKKyAgICAgICAgaWYgKHJldCA8IDAgKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmZl9tcGVnX2VyX2ZyYW1lX3N0YXJ0KHMpOworCisgICAgLyogdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSB3bXYyIGhlYWRlciBjb250YWlucyB0aGUgTUIgc2tpcCBiaXRzIHdoaWNoCisgICAgICogYXJlIHN0b3JlZCBpbiBjdXJyZW50X3BpY3R1cmUtPm1iX3R5cGUgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBiZWZvcmUKKyAgICAgKiBmZl9tcHZfZnJhbWVfc3RhcnQoKSAqLworICAgIGlmIChDT05GSUdfV01WMl9ERUNPREVSICYmIHMtPm1zbXBlZzRfdmVyc2lvbiA9PSA1KSB7CisgICAgICAgIHJldCA9IGZmX3dtdjJfZGVjb2RlX3NlY29uZGFyeV9waWN0dXJlX2hlYWRlcihzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAocmV0ID09IDEpCisgICAgICAgICAgICBnb3RvIGZyYW1lX2VuZDsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgZWFjaCBtYWNyb2Jsb2NrICovCisgICAgcy0+bWJfeCA9IDA7CisgICAgcy0+bWJfeSA9IDA7CisKKyAgICBzbGljZV9yZXQgPSBkZWNvZGVfc2xpY2Uocyk7CisgICAgd2hpbGUgKHMtPm1iX3kgPCBzLT5tYl9oZWlnaHQpIHsKKyAgICAgICAgaWYgKHMtPm1zbXBlZzRfdmVyc2lvbikgeworICAgICAgICAgICAgaWYgKHMtPnNsaWNlX2hlaWdodCA9PSAwIHx8IHMtPm1iX3ggIT0gMCB8fAorICAgICAgICAgICAgICAgIChzLT5tYl95ICUgcy0+c2xpY2VfaGVpZ2h0KSAhPSAwIHx8IGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcHJldl94ID0gcy0+bWJfeCwgcHJldl95ID0gcy0+bWJfeTsKKyAgICAgICAgICAgIGlmIChmZl9oMjYzX3Jlc3luYyhzKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocHJldl95ICogcy0+bWJfd2lkdGggKyBwcmV2X3ggPCBzLT5tYl95ICogcy0+bWJfd2lkdGggKyBzLT5tYl94KQorICAgICAgICAgICAgICAgIHMtPmVyLmVycm9yX29jY3VycmVkID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5tc21wZWc0X3ZlcnNpb24gPCA0ICYmIHMtPmgyNjNfcHJlZCkKKyAgICAgICAgICAgIGZmX21wZWc0X2NsZWFuX2J1ZmZlcnMocyk7CisKKyAgICAgICAgaWYgKGRlY29kZV9zbGljZShzKSA8IDApCisgICAgICAgICAgICBzbGljZV9yZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzLT5tc21wZWc0X3ZlcnNpb24gJiYgcy0+bXNtcGVnNF92ZXJzaW9uIDwgNCAmJgorICAgICAgICBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgIGlmICghQ09ORklHX01TTVBFRzRfREVDT0RFUiB8fAorICAgICAgICAgICAgZmZfbXNtcGVnNF9kZWNvZGVfZXh0X2hlYWRlcihzLCBidWZfc2l6ZSkgPCAwKQorICAgICAgICAgICAgcy0+ZXIuZXJyb3Jfc3RhdHVzX3RhYmxlW3MtPm1iX251bSAtIDFdID0gRVJfTUJfRVJST1I7CisKKyAgICBhdl9hc3NlcnQxKHMtPmJpdHN0cmVhbV9idWZmZXJfc2l6ZSA9PSAwKTsKK2ZyYW1lX2VuZDoKKyAgICBmZl9lcl9mcmFtZV9lbmQoJnMtPmVyKTsKKworICAgIGlmIChhdmN0eC0+aHdhY2NlbCkgeworICAgICAgICByZXQgPSBhdmN0eC0+aHdhY2NlbC0+ZW5kX2ZyYW1lKGF2Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGZmX21wdl9mcmFtZV9lbmQocyk7CisKKyAgICBpZiAoQ09ORklHX01QRUc0X0RFQ09ERVIgJiYgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KQorICAgICAgICBmZl9tcGVnNF9mcmFtZV9lbmQoYXZjdHgsIGJ1ZiwgYnVmX3NpemUpOworCisgICAgaWYgKCFzLT5kaXZ4X3BhY2tlZCAmJiBhdmN0eC0+aHdhY2NlbCkKKyAgICAgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChhdmN0eCk7CisKKyAgICBhdl9hc3NlcnQxKHMtPmN1cnJlbnRfcGljdHVyZS5mLT5waWN0X3R5cGUgPT0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+cGljdF90eXBlKTsKKyAgICBhdl9hc3NlcnQxKHMtPmN1cnJlbnRfcGljdHVyZS5mLT5waWN0X3R5cGUgPT0gcy0+cGljdF90eXBlKTsKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CIHx8IHMtPmxvd19kZWxheSkgeworICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihwaWN0LCBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZmZfcHJpbnRfZGVidWdfaW5mbyhzLCBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLCBwaWN0KTsKKyAgICAgICAgZmZfbXB2X2V4cG9ydF9xcF90YWJsZShzLCBwaWN0LCBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLCBGRl9RU0NBTEVfVFlQRV9NUEVHMSk7CisgICAgfSBlbHNlIGlmIChzLT5sYXN0X3BpY3R1cmVfcHRyKSB7CisgICAgICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKHBpY3QsIHMtPmxhc3RfcGljdHVyZV9wdHItPmYpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBmZl9wcmludF9kZWJ1Z19pbmZvKHMsIHMtPmxhc3RfcGljdHVyZV9wdHIsIHBpY3QpOworICAgICAgICBmZl9tcHZfZXhwb3J0X3FwX3RhYmxlKHMsIHBpY3QsIHMtPmxhc3RfcGljdHVyZV9wdHIsIEZGX1FTQ0FMRV9UWVBFX01QRUcxKTsKKyAgICB9CisKKyAgICBpZiAocy0+bGFzdF9waWN0dXJlX3B0ciB8fCBzLT5sb3dfZGVsYXkpIHsKKyAgICAgICAgaWYgKCAgIHBpY3QtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAKKyAgICAgICAgICAgICYmIChzLT5jb2RlY190YWcgPT0gQVZfUkwzMigiR0VPViIpIHx8IHMtPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJHRU9YIikpKSB7CisgICAgICAgICAgICBpbnQgeCwgeSwgcDsKKyAgICAgICAgICAgIGF2X2ZyYW1lX21ha2Vfd3JpdGFibGUocGljdCk7CisgICAgICAgICAgICBmb3IgKHA9MDsgcDwzOyBwKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgdyA9IEZGX0NFSUxfUlNISUZUKHBpY3QtPiB3aWR0aCwgISFwKTsKKyAgICAgICAgICAgICAgICBpbnQgaCA9IEZGX0NFSUxfUlNISUZUKHBpY3QtPmhlaWdodCwgISFwKTsKKyAgICAgICAgICAgICAgICBpbnQgbGluZXNpemUgPSBwaWN0LT5saW5lc2l6ZVtwXTsKKyAgICAgICAgICAgICAgICBmb3IgKHk9MDsgeTwoaD4+MSk7IHkrKykKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4PTA7IHg8dzsgeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgRkZTV0FQKGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5kYXRhW3BdW3ggKyB5KmxpbmVzaXplXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5kYXRhW3BdW3ggKyAoaC0xLXkpKmxpbmVzaXplXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgfQorCisgICAgaWYgKHNsaWNlX3JldCA8IDAgJiYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBnZXRfY29uc3VtZWRfYnl0ZXMocywgYnVmX3NpemUpOworfQorCitjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfaDI2M19od2FjY2VsX3BpeGZtdF9saXN0XzQyMFtdID0geworI2lmIENPTkZJR19IMjYzX1ZBQVBJX0hXQUNDRUwgfHwgQ09ORklHX01QRUc0X1ZBQVBJX0hXQUNDRUwKKyAgICBBVl9QSVhfRk1UX1ZBQVBJX1ZMRCwKKyNlbmRpZgorI2lmIENPTkZJR19IMjYzX1ZEUEFVX0hXQUNDRUwgfHwgQ09ORklHX01QRUc0X1ZEUEFVX0hXQUNDRUwKKyAgICBBVl9QSVhfRk1UX1ZEUEFVLAorI2VuZGlmCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKworQVZDb2RlYyBmZl9oMjYzX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImgyNjMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJILjI2MyAvIEguMjYzLTE5OTYsIEguMjYzKyAvIEguMjYzLTE5OTggLyBILjI2MyB2ZXJzaW9uIDIiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2MywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ0VuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBDT0RFQ19DQVBfRFIxIHwKKyAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfVFJVTkNBVEVEIHwgQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5mbHVzaCAgICAgICAgICA9IGZmX21wZWdfZmx1c2gsCisgICAgLm1heF9sb3dyZXMgICAgID0gMywKKyAgICAucGl4X2ZtdHMgICAgICAgPSBmZl9oMjYzX2h3YWNjZWxfcGl4Zm10X2xpc3RfNDIwLAorfTsKKworQVZDb2RlYyBmZl9oMjYzcF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoMjYzcCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkguMjYzIC8gSC4yNjMtMTk5NiwgSC4yNjMrIC8gSC4yNjMtMTk5OCAvIEguMjYzIHZlcnNpb24gMiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYzUCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ0VuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBDT0RFQ19DQVBfRFIxIHwKKyAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfVFJVTkNBVEVEIHwgQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5mbHVzaCAgICAgICAgICA9IGZmX21wZWdfZmx1c2gsCisgICAgLm1heF9sb3dyZXMgICAgID0gMywKKyAgICAucGl4X2ZtdHMgICAgICAgPSBmZl9oMjYzX2h3YWNjZWxfcGl4Zm10X2xpc3RfNDIwLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjNkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjNkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBmZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2M2RzcC5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImgyNjNkc3AuaCIKKworY29uc3QgdWludDhfdCBmZl9oMjYzX2xvb3BfZmlsdGVyX3N0cmVuZ3RoWzMyXSA9IHsKKyAgICAwLCAxLCAxLCAyLCAyLCAzLCAzLCAgNCwgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsIDcsCisgICAgNywgOCwgOCwgOCwgOSwgOSwgOSwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMgorfTsKKworc3RhdGljIHZvaWQgaDI2M19oX2xvb3BfZmlsdGVyX2ModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcXNjYWxlKQoreworICAgIGludCB5OworICAgIGNvbnN0IGludCBzdHJlbmd0aCA9IGZmX2gyNjNfbG9vcF9maWx0ZXJfc3RyZW5ndGhbcXNjYWxlXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgaW50IGQxLCBkMiwgYWQxOworICAgICAgICBpbnQgcDAgPSBzcmNbeSAqIHN0cmlkZSAtIDJdOworICAgICAgICBpbnQgcDEgPSBzcmNbeSAqIHN0cmlkZSAtIDFdOworICAgICAgICBpbnQgcDIgPSBzcmNbeSAqIHN0cmlkZSArIDBdOworICAgICAgICBpbnQgcDMgPSBzcmNbeSAqIHN0cmlkZSArIDFdOworICAgICAgICBpbnQgZCAgPSAocDAgLSBwMyArIDQgKiAocDIgLSBwMSkpIC8gODsKKworICAgICAgICBpZiAoZCA8IC0yICogc3RyZW5ndGgpCisgICAgICAgICAgICBkMSA9IDA7CisgICAgICAgIGVsc2UgaWYgKGQgPCAtc3RyZW5ndGgpCisgICAgICAgICAgICBkMSA9IC0yICogc3RyZW5ndGggLSBkOworICAgICAgICBlbHNlIGlmIChkIDwgc3RyZW5ndGgpCisgICAgICAgICAgICBkMSA9IGQ7CisgICAgICAgIGVsc2UgaWYgKGQgPCAyICogc3RyZW5ndGgpCisgICAgICAgICAgICBkMSA9IDIgKiBzdHJlbmd0aCAtIGQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGQxID0gMDsKKworICAgICAgICBwMSArPSBkMTsKKyAgICAgICAgcDIgLT0gZDE7CisgICAgICAgIGlmIChwMSAmIDI1NikKKyAgICAgICAgICAgIHAxID0gfihwMSA+PiAzMSk7CisgICAgICAgIGlmIChwMiAmIDI1NikKKyAgICAgICAgICAgIHAyID0gfihwMiA+PiAzMSk7CisKKyAgICAgICAgc3JjW3kgKiBzdHJpZGUgLSAxXSA9IHAxOworICAgICAgICBzcmNbeSAqIHN0cmlkZSArIDBdID0gcDI7CisKKyAgICAgICAgYWQxID0gRkZBQlMoZDEpID4+IDE7CisKKyAgICAgICAgZDIgPSBhdl9jbGlwKChwMCAtIHAzKSAvIDQsIC1hZDEsIGFkMSk7CisKKyAgICAgICAgc3JjW3kgKiBzdHJpZGUgLSAyXSA9IHAwIC0gZDI7CisgICAgICAgIHNyY1t5ICogc3RyaWRlICsgMV0gPSBwMyArIGQyOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaDI2M192X2xvb3BfZmlsdGVyX2ModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcXNjYWxlKQoreworICAgIGludCB4OworICAgIGNvbnN0IGludCBzdHJlbmd0aCA9IGZmX2gyNjNfbG9vcF9maWx0ZXJfc3RyZW5ndGhbcXNjYWxlXTsKKworICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKyAgICAgICAgaW50IGQxLCBkMiwgYWQxOworICAgICAgICBpbnQgcDAgPSBzcmNbeCAtIDIgKiBzdHJpZGVdOworICAgICAgICBpbnQgcDEgPSBzcmNbeCAtIDEgKiBzdHJpZGVdOworICAgICAgICBpbnQgcDIgPSBzcmNbeCArIDAgKiBzdHJpZGVdOworICAgICAgICBpbnQgcDMgPSBzcmNbeCArIDEgKiBzdHJpZGVdOworICAgICAgICBpbnQgZCAgPSAocDAgLSBwMyArIDQgKiAocDIgLSBwMSkpIC8gODsKKworICAgICAgICBpZiAoZCA8IC0yICogc3RyZW5ndGgpCisgICAgICAgICAgICBkMSA9IDA7CisgICAgICAgIGVsc2UgaWYgKGQgPCAtc3RyZW5ndGgpCisgICAgICAgICAgICBkMSA9IC0yICogc3RyZW5ndGggLSBkOworICAgICAgICBlbHNlIGlmIChkIDwgc3RyZW5ndGgpCisgICAgICAgICAgICBkMSA9IGQ7CisgICAgICAgIGVsc2UgaWYgKGQgPCAyICogc3RyZW5ndGgpCisgICAgICAgICAgICBkMSA9IDIgKiBzdHJlbmd0aCAtIGQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGQxID0gMDsKKworICAgICAgICBwMSArPSBkMTsKKyAgICAgICAgcDIgLT0gZDE7CisgICAgICAgIGlmIChwMSAmIDI1NikKKyAgICAgICAgICAgIHAxID0gfihwMSA+PiAzMSk7CisgICAgICAgIGlmIChwMiAmIDI1NikKKyAgICAgICAgICAgIHAyID0gfihwMiA+PiAzMSk7CisKKyAgICAgICAgc3JjW3ggLSAxICogc3RyaWRlXSA9IHAxOworICAgICAgICBzcmNbeCArIDAgKiBzdHJpZGVdID0gcDI7CisKKyAgICAgICAgYWQxID0gRkZBQlMoZDEpID4+IDE7CisKKyAgICAgICAgZDIgPSBhdl9jbGlwKChwMCAtIHAzKSAvIDQsIC1hZDEsIGFkMSk7CisKKyAgICAgICAgc3JjW3ggLSAyICogc3RyaWRlXSA9IHAwIC0gZDI7CisgICAgICAgIHNyY1t4ICsgc3RyaWRlXSAgICAgPSBwMyArIGQyOworICAgIH0KK30KKworYXZfY29sZCB2b2lkIGZmX2gyNjNkc3BfaW5pdChIMjYzRFNQQ29udGV4dCAqY3R4KQoreworICAgIGN0eC0+aDI2M19oX2xvb3BfZmlsdGVyID0gaDI2M19oX2xvb3BfZmlsdGVyX2M7CisgICAgY3R4LT5oMjYzX3ZfbG9vcF9maWx0ZXIgPSBoMjYzX3ZfbG9vcF9maWx0ZXJfYzsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfaDI2M2RzcF9pbml0X3g4NihjdHgpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2M2RzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2M2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyY2MyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjYzZHNwLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSDI2M0RTUF9ICisjZGVmaW5lIEFWQ09ERUNfSDI2M0RTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaDI2M19sb29wX2ZpbHRlcl9zdHJlbmd0aFszMl07CisKK3R5cGVkZWYgc3RydWN0IEgyNjNEU1BDb250ZXh0IHsKKyAgICB2b2lkICgqaDI2M19oX2xvb3BfZmlsdGVyKSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBxc2NhbGUpOworICAgIHZvaWQgKCpoMjYzX3ZfbG9vcF9maWx0ZXIpKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHFzY2FsZSk7Cit9IEgyNjNEU1BDb250ZXh0OworCit2b2lkIGZmX2gyNjNkc3BfaW5pdChIMjYzRFNQQ29udGV4dCAqY3R4KTsKK3ZvaWQgZmZfaDI2M2RzcF9pbml0X3g4NihIMjYzRFNQQ29udGV4dCAqY3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSDI2M0RTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjY0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyYmY1OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjQuYwpAQCAtMCwwICsxLDIwMjAgQEAKKy8qCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgY29kZWMuCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2RlZmluZSBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUiAxCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGlzcGxheS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc3RlcmVvM2QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImNhYmFjLmgiCisjaW5jbHVkZSAiY2FiYWNfZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiZXJyb3JfcmVzaWxpZW5jZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAiaDI2NGRhdGEuaCIKKyNpbmNsdWRlICJoMjY0Y2hyb21hLmgiCisjaW5jbHVkZSAiaDI2NF9tdnByZWQuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAibWVfY21wLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSAicmVjdGFuZ2xlLmgiCisjaW5jbHVkZSAic3ZxMy5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgInZkcGF1X2ludGVybmFsLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworY29uc3QgdWludDE2X3QgZmZfaDI2NF9tYl9zaXplc1s0XSA9IHsgMjU2LCAzODQsIDUxMiwgNzY4IH07CisKK2ludCBhdnByaXZfaDI2NF9oYXNfbnVtX3Jlb3JkZXJfZnJhbWVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGggPyBoLT5zcHMubnVtX3Jlb3JkZXJfZnJhbWVzIDogMDsKK30KKworc3RhdGljIHZvaWQgaDI2NF9lcl9kZWNvZGVfbWIodm9pZCAqb3BhcXVlLCBpbnQgcmVmLCBpbnQgbXZfZGlyLCBpbnQgbXZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKm12KVsyXVs0XVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl94LCBpbnQgbWJfeSwgaW50IG1iX2ludHJhLCBpbnQgbWJfc2tpcHBlZCkKK3sKKyAgICBIMjY0Q29udGV4dCAqaCA9IG9wYXF1ZTsKKworICAgIGgtPm1iX3ggID0gbWJfeDsKKyAgICBoLT5tYl95ICA9IG1iX3k7CisgICAgaC0+bWJfeHkgPSBtYl94ICsgbWJfeSAqIGgtPm1iX3N0cmlkZTsKKyAgICBtZW1zZXQoaC0+bm9uX3plcm9fY291bnRfY2FjaGUsIDAsIHNpemVvZihoLT5ub25femVyb19jb3VudF9jYWNoZSkpOworICAgIGF2X2Fzc2VydDEocmVmID49IDApOworICAgIC8qIEZJWE1FOiBJdCBpcyBwb3NzaWJsZSBhbGJlaXQgdW5jb21tb24gdGhhdCBzbGljZSByZWZlcmVuY2VzCisgICAgICogZGlmZmVyIGJldHdlZW4gc2xpY2VzLiBXZSB0YWtlIHRoZSBlYXN5IGFwcHJvYWNoIGFuZCBpZ25vcmUKKyAgICAgKiBpdCBmb3Igbm93LiBJZiB0aGlzIHR1cm5zIG91dCB0byBoYXZlIGFueSByZWxldmFuY2UgaW4KKyAgICAgKiBwcmFjdGljZSB0aGVuIGNvcnJlY3QgcmVtYXBwaW5nIHNob3VsZCBiZSBhZGRlZC4gKi8KKyAgICBpZiAocmVmID49IGgtPnJlZl9jb3VudFswXSkKKyAgICAgICAgcmVmID0gMDsKKyAgICBpZiAoIWgtPnJlZl9saXN0WzBdW3JlZl0uZi5kYXRhWzBdKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiUmVmZXJlbmNlIG5vdCBhdmFpbGFibGUgZm9yIGVycm9yIGNvbmNlYWxpbmdcbiIpOworICAgICAgICByZWYgPSAwOworICAgIH0KKyAgICBpZiAoKGgtPnJlZl9saXN0WzBdW3JlZl0ucmVmZXJlbmNlJjMpICE9IDMpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJSZWZlcmVuY2UgaW52YWxpZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmlsbF9yZWN0YW5nbGUoJmgtPmN1cl9waWMucmVmX2luZGV4WzBdWzQgKiBoLT5tYl94eV0sCisgICAgICAgICAgICAgICAgICAgMiwgMiwgMiwgcmVmLCAxKTsKKyAgICBmaWxsX3JlY3RhbmdsZSgmaC0+cmVmX2NhY2hlWzBdW3NjYW44WzBdXSwgNCwgNCwgOCwgcmVmLCAxKTsKKyAgICBmaWxsX3JlY3RhbmdsZShoLT5tdl9jYWNoZVswXVtzY2FuOFswXV0sIDQsIDQsIDgsCisgICAgICAgICAgICAgICAgICAgcGFjazE2dG8zMigoKm12KVswXVswXVswXSwgKCptdilbMF1bMF1bMV0pLCA0KTsKKyAgICBoLT5tYl9tYmFmZiA9CisgICAgaC0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZyA9IDA7CisgICAgZmZfaDI2NF9obF9kZWNvZGVfbWIoaCk7Cit9CisKK3ZvaWQgZmZfaDI2NF9kcmF3X2hvcml6X2JhbmQoSDI2NENvbnRleHQgKmgsIGludCB5LCBpbnQgaGVpZ2h0KQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IGgtPmF2Y3R4OworICAgIEFWRnJhbWUgKmN1ciAgPSAmaC0+Y3VyX3BpYy5mOworICAgIEFWRnJhbWUgKmxhc3QgPSBoLT5yZWZfbGlzdFswXVswXS5mLmRhdGFbMF0gPyAmaC0+cmVmX2xpc3RbMF1bMF0uZiA6IE5VTEw7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCk7CisgICAgaW50IHZzaGlmdCA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgY29uc3QgaW50IGZpZWxkX3BpYyA9IGgtPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUU7CisgICAgaWYgKGZpZWxkX3BpYykgeworICAgICAgICBoZWlnaHQgPDw9IDE7CisgICAgICAgIHkgICAgICA8PD0gMTsKKyAgICB9CisKKyAgICBoZWlnaHQgPSBGRk1JTihoZWlnaHQsIGF2Y3R4LT5oZWlnaHQgLSB5KTsKKworICAgIGlmIChmaWVsZF9waWMgJiYgaC0+Zmlyc3RfZmllbGQgJiYgIShhdmN0eC0+c2xpY2VfZmxhZ3MgJiBTTElDRV9GTEFHX0FMTE9XX0ZJRUxEKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGF2Y3R4LT5kcmF3X2hvcml6X2JhbmQpIHsKKyAgICAgICAgQVZGcmFtZSAqc3JjOworICAgICAgICBpbnQgb2Zmc2V0W0FWX05VTV9EQVRBX1BPSU5URVJTXTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYgKGN1ci0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CIHx8IGgtPmxvd19kZWxheSB8fAorICAgICAgICAgICAgKGF2Y3R4LT5zbGljZV9mbGFncyAmIFNMSUNFX0ZMQUdfQ09ERURfT1JERVIpKQorICAgICAgICAgICAgc3JjID0gY3VyOworICAgICAgICBlbHNlIGlmIChsYXN0KQorICAgICAgICAgICAgc3JjID0gbGFzdDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIG9mZnNldFswXSA9IHkgKiBzcmMtPmxpbmVzaXplWzBdOworICAgICAgICBvZmZzZXRbMV0gPQorICAgICAgICBvZmZzZXRbMl0gPSAoeSA+PiB2c2hpZnQpICogc3JjLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgZm9yIChpID0gMzsgaSA8IEFWX05VTV9EQVRBX1BPSU5URVJTOyBpKyspCisgICAgICAgICAgICBvZmZzZXRbaV0gPSAwOworCisgICAgICAgIGVtbXNfYygpOworCisgICAgICAgIGF2Y3R4LT5kcmF3X2hvcml6X2JhbmQoYXZjdHgsIHNyYywgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksIGgtPnBpY3R1cmVfc3RydWN0dXJlLCBoZWlnaHQpOworICAgIH0KK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgdG9wICYgbGVmdCBibG9ja3MgYXJlIGF2YWlsYWJsZSBpZiBuZWVkZWQgYW5kCisgKiBjaGFuZ2UgdGhlIGRjIG1vZGUgc28gaXQgb25seSB1c2VzIHRoZSBhdmFpbGFibGUgYmxvY2tzLgorICovCitpbnQgZmZfaDI2NF9jaGVja19pbnRyYTR4NF9wcmVkX21vZGUoSDI2NENvbnRleHQgKmgpCit7CisgICAgc3RhdGljIGNvbnN0IGludDhfdCB0b3BbMTJdID0geworICAgICAgICAtMSwgMCwgTEVGVF9EQ19QUkVELCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgbGVmdFsxMl0gPSB7CisgICAgICAgIDAsIC0xLCBUT1BfRENfUFJFRCwgMCwgLTEsIC0xLCAtMSwgMCwgLTEsIERDXzEyOF9QUkVECisgICAgfTsKKyAgICBpbnQgaTsKKworICAgIGlmICghKGgtPnRvcF9zYW1wbGVzX2F2YWlsYWJsZSAmIDB4ODAwMCkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgaW50IHN0YXR1cyA9IHRvcFtoLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbMF0gKyBpXV07CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAidG9wIGJsb2NrIHVuYXZhaWxhYmxlIGZvciByZXF1ZXN0ZWQgaW50cmE0eDQgbW9kZSAlZCBhdCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBoLT5tYl94LCBoLT5tYl95KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgaC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW3NjYW44WzBdICsgaV0gPSBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGgtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgJiAweDg4ODgpICE9IDB4ODg4OCkgeworICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1hc2tbNF0gPSB7IDB4ODAwMCwgMHgyMDAwLCAweDgwLCAweDIwIH07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBpZiAoIShoLT5sZWZ0X3NhbXBsZXNfYXZhaWxhYmxlICYgbWFza1tpXSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gbGVmdFtoLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbMF0gKyA4ICogaV1dOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlZnQgYmxvY2sgdW5hdmFpbGFibGUgZm9yIHJlcXVlc3RlZCBpbnRyYTR4NCBtb2RlICVkIGF0ICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBoLT5tYl94LCBoLT5tYl95KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW3NjYW44WzBdICsgOCAqIGldID0gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30gLy8gRklYTUUgY2xlYW51cCBsaWtlIGZmX2gyNjRfY2hlY2tfaW50cmFfcHJlZF9tb2RlCisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHRvcCAmIGxlZnQgYmxvY2tzIGFyZSBhdmFpbGFibGUgaWYgbmVlZGVkIGFuZAorICogY2hhbmdlIHRoZSBkYyBtb2RlIHNvIGl0IG9ubHkgdXNlcyB0aGUgYXZhaWxhYmxlIGJsb2Nrcy4KKyAqLworaW50IGZmX2gyNjRfY2hlY2tfaW50cmFfcHJlZF9tb2RlKEgyNjRDb250ZXh0ICpoLCBpbnQgbW9kZSwgaW50IGlzX2Nocm9tYSkKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50OF90IHRvcFs0XSAgPSB7IExFRlRfRENfUFJFRDh4OCwgMSwgLTEsIC0xIH07CisgICAgc3RhdGljIGNvbnN0IGludDhfdCBsZWZ0WzVdID0geyBUT1BfRENfUFJFRDh4OCwgLTEsICAyLCAtMSwgRENfMTI4X1BSRUQ4eDggfTsKKworICAgIGlmIChtb2RlID4gM1UpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAib3V0IG9mIHJhbmdlIGludHJhIGNocm9tYSBwcmVkIG1vZGUgYXQgJWQgJWRcbiIsCisgICAgICAgICAgICAgICBoLT5tYl94LCBoLT5tYl95KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCEoaC0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlICYgMHg4MDAwKSkgeworICAgICAgICBtb2RlID0gdG9wW21vZGVdOworICAgICAgICBpZiAobW9kZSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJ0b3AgYmxvY2sgdW5hdmFpbGFibGUgZm9yIHJlcXVlc3RlZCBpbnRyYSBtb2RlIGF0ICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGgtPm1iX3gsIGgtPm1iX3kpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGgtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgJiAweDgwODApICE9IDB4ODA4MCkgeworICAgICAgICBtb2RlID0gbGVmdFttb2RlXTsKKyAgICAgICAgaWYgKG1vZGUgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAibGVmdCBibG9jayB1bmF2YWlsYWJsZSBmb3IgcmVxdWVzdGVkIGludHJhIG1vZGUgYXQgJWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgaC0+bWJfeCwgaC0+bWJfeSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNfY2hyb21hICYmIChoLT5sZWZ0X3NhbXBsZXNfYXZhaWxhYmxlICYgMHg4MDgwKSkgeworICAgICAgICAgICAgLy8gbWFkIGNvdyBkaXNlYXNlIG1vZGUsIGFrYSBNQkFGRiArIGNvbnN0cmFpbmVkX2ludHJhX3ByZWQKKyAgICAgICAgICAgIG1vZGUgPSBBTFpIRUlNRVJfRENfTDBUX1BSRUQ4eDggKworICAgICAgICAgICAgICAgICAgICghKGgtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgJiAweDgwMDApKSArCisgICAgICAgICAgICAgICAgICAgMiAqIChtb2RlID09IERDXzEyOF9QUkVEOHg4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtb2RlOworfQorCitjb25zdCB1aW50OF90ICpmZl9oMjY0X2RlY29kZV9uYWwoSDI2NENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRzdF9sZW5ndGgsIGludCAqY29uc3VtZWQsIGludCBsZW5ndGgpCit7CisgICAgaW50IGksIHNpLCBkaTsKKyAgICB1aW50OF90ICpkc3Q7CisgICAgaW50IGJ1ZmlkeDsKKworICAgIC8vIHNyY1swXSYweDgwOyAvLyBmb3JiaWRkZW4gYml0CisgICAgaC0+bmFsX3JlZl9pZGMgICA9IHNyY1swXSA+PiA1OworICAgIGgtPm5hbF91bml0X3R5cGUgPSBzcmNbMF0gJiAweDFGOworCisgICAgc3JjKys7CisgICAgbGVuZ3RoLS07CisKKyNkZWZpbmUgU1RBUlRDT0RFX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoaSArIDIgPCBsZW5ndGggJiYgc3JjW2kgKyAxXSA9PSAwICYmIHNyY1tpICsgMl0gPD0gMykgeyAgICAgICAgIFwKKyAgICAgICAgaWYgKHNyY1tpICsgMl0gIT0gMyAmJiBzcmNbaSArIDJdICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIHN0YXJ0Y29kZSwgc28gd2UgbXVzdCBiZSBwYXN0IHRoZSBlbmQgKi8gICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxlbmd0aCA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNpZiBIQVZFX0ZBU1RfVU5BTElHTkVECisjZGVmaW5lIEZJTkRfRklSU1RfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGkgPiAwICYmICFzcmNbaV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGktLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKHNyY1tpXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkrKworCisjaWYgSEFWRV9GQVNUXzY0QklUCisgICAgZm9yIChpID0gMDsgaSArIDEgPCBsZW5ndGg7IGkgKz0gOSkgeworICAgICAgICBpZiAoISgofkFWX1JONjRBKHNyYyArIGkpICYKKyAgICAgICAgICAgICAgIChBVl9STjY0QShzcmMgKyBpKSAtIDB4MDEwMDAxMDAwMTAwMDEwMVVMTCkpICYKKyAgICAgICAgICAgICAgMHg4MDAwODAwMDgwMDA4MDgwVUxMKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBGSU5EX0ZJUlNUX1pFUk87CisgICAgICAgIFNUQVJUQ09ERV9URVNUOworICAgICAgICBpIC09IDc7CisgICAgfQorI2Vsc2UKKyAgICBmb3IgKGkgPSAwOyBpICsgMSA8IGxlbmd0aDsgaSArPSA1KSB7CisgICAgICAgIGlmICghKCh+QVZfUk4zMkEoc3JjICsgaSkgJgorICAgICAgICAgICAgICAgKEFWX1JOMzJBKHNyYyArIGkpIC0gMHgwMTAwMDEwMVUpKSAmCisgICAgICAgICAgICAgIDB4ODAwMDgwODBVKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBGSU5EX0ZJUlNUX1pFUk87CisgICAgICAgIFNUQVJUQ09ERV9URVNUOworICAgICAgICBpIC09IDM7CisgICAgfQorI2VuZGlmCisjZWxzZQorICAgIGZvciAoaSA9IDA7IGkgKyAxIDwgbGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgaWYgKHNyY1tpXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoaSA+IDAgJiYgc3JjW2kgLSAxXSA9PSAwKQorICAgICAgICAgICAgaS0tOworICAgICAgICBTVEFSVENPREVfVEVTVDsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIHVzZSBzZWNvbmQgZXNjYXBlIGJ1ZmZlciBmb3IgaW50ZXIgZGF0YQorICAgIGJ1ZmlkeCA9IGgtPm5hbF91bml0X3R5cGUgPT0gTkFMX0RQQyA/IDEgOiAwOworCisgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZoLT5yYnNwX2J1ZmZlcltidWZpZHhdLCAmaC0+cmJzcF9idWZmZXJfc2l6ZVtidWZpZHhdLCBsZW5ndGgrTUFYX01CUEFJUl9TSVpFKTsKKyAgICBkc3QgPSBoLT5yYnNwX2J1ZmZlcltidWZpZHhdOworCisgICAgaWYgKCFkc3QpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoaT49bGVuZ3RoLTEpeyAvL25vIGVzY2FwZWQgMAorICAgICAgICAqZHN0X2xlbmd0aD0gbGVuZ3RoOworICAgICAgICAqY29uc3VtZWQ9IGxlbmd0aCsxOyAvLysxIGZvciB0aGUgaGVhZGVyCisgICAgICAgIGlmKGgtPmF2Y3R4LT5mbGFnczIgJiBDT0RFQ19GTEFHMl9GQVNUKXsKKyAgICAgICAgICAgIHJldHVybiBzcmM7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIGRzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1lbWNweShkc3QsIHNyYywgaSk7CisgICAgc2kgPSBkaSA9IGk7CisgICAgd2hpbGUgKHNpICsgMiA8IGxlbmd0aCkgeworICAgICAgICAvLyByZW1vdmUgZXNjYXBlcyAodmVyeSByYXJlIDE6Ml4yMikKKyAgICAgICAgaWYgKHNyY1tzaSArIDJdID4gMykgeworICAgICAgICAgICAgZHN0W2RpKytdID0gc3JjW3NpKytdOworICAgICAgICAgICAgZHN0W2RpKytdID0gc3JjW3NpKytdOworICAgICAgICB9IGVsc2UgaWYgKHNyY1tzaV0gPT0gMCAmJiBzcmNbc2kgKyAxXSA9PSAwICYmIHNyY1tzaSArIDJdICE9IDApIHsKKyAgICAgICAgICAgIGlmIChzcmNbc2kgKyAyXSA9PSAzKSB7IC8vIGVzY2FwZQorICAgICAgICAgICAgICAgIGRzdFtkaSsrXSAgPSAwOworICAgICAgICAgICAgICAgIGRzdFtkaSsrXSAgPSAwOworICAgICAgICAgICAgICAgIHNpICAgICAgICArPSAzOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIC8vIG5leHQgc3RhcnQgY29kZQorICAgICAgICAgICAgICAgIGdvdG8gbnNjOworICAgICAgICB9CisKKyAgICAgICAgZHN0W2RpKytdID0gc3JjW3NpKytdOworICAgIH0KKyAgICB3aGlsZSAoc2kgPCBsZW5ndGgpCisgICAgICAgIGRzdFtkaSsrXSA9IHNyY1tzaSsrXTsKKworbnNjOgorICAgIG1lbXNldChkc3QgKyBkaSwgMCwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICAqZHN0X2xlbmd0aCA9IGRpOworICAgICpjb25zdW1lZCAgID0gc2kgKyAxOyAvLyArMSBmb3IgdGhlIGhlYWRlcgorICAgIC8qIEZJWE1FIHN0b3JlIGV4YWN0IG51bWJlciBvZiBiaXRzIGluIHRoZSBnZXRiaXRjb250ZXh0CisgICAgICogKGl0IGlzIG5lZWRlZCBmb3IgZGVjb2RpbmcpICovCisgICAgcmV0dXJuIGRzdDsKK30KKworLyoqCisgKiBJZGVudGlmeSB0aGUgZXhhY3QgZW5kIG9mIHRoZSBiaXRzdHJlYW0KKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgdHJhaWxpbmcsIG9yIDAgaWYgZGFtYWdlZAorICovCitzdGF0aWMgaW50IGRlY29kZV9yYnNwX3RyYWlsaW5nKEgyNjRDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpzcmMpCit7CisgICAgaW50IHYgPSAqc3JjOworICAgIGludCByOworCisgICAgdHByaW50ZihoLT5hdmN0eCwgInJic3AgdHJhaWxpbmcgJVhcbiIsIHYpOworCisgICAgZm9yIChyID0gMTsgciA8IDk7IHIrKykgeworICAgICAgICBpZiAodiAmIDEpCisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgdiA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfaDI2NF9mcmVlX3RhYmxlcyhIMjY0Q29udGV4dCAqaCwgaW50IGZyZWVfcmJzcCkKK3sKKyAgICBpbnQgaTsKKyAgICBIMjY0Q29udGV4dCAqaHg7CisKKyAgICBhdl9mcmVlcCgmaC0+aW50cmE0eDRfcHJlZF9tb2RlKTsKKyAgICBhdl9mcmVlcCgmaC0+Y2hyb21hX3ByZWRfbW9kZV90YWJsZSk7CisgICAgYXZfZnJlZXAoJmgtPmNicF90YWJsZSk7CisgICAgYXZfZnJlZXAoJmgtPm12ZF90YWJsZVswXSk7CisgICAgYXZfZnJlZXAoJmgtPm12ZF90YWJsZVsxXSk7CisgICAgYXZfZnJlZXAoJmgtPmRpcmVjdF90YWJsZSk7CisgICAgYXZfZnJlZXAoJmgtPm5vbl96ZXJvX2NvdW50KTsKKyAgICBhdl9mcmVlcCgmaC0+c2xpY2VfdGFibGVfYmFzZSk7CisgICAgaC0+c2xpY2VfdGFibGUgPSBOVUxMOworICAgIGF2X2ZyZWVwKCZoLT5saXN0X2NvdW50cyk7CisKKyAgICBhdl9mcmVlcCgmaC0+bWIyYl94eSk7CisgICAgYXZfZnJlZXAoJmgtPm1iMmJyX3h5KTsKKworICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmaC0+cXNjYWxlX3RhYmxlX3Bvb2wpOworICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmaC0+bWJfdHlwZV9wb29sKTsKKyAgICBhdl9idWZmZXJfcG9vbF91bmluaXQoJmgtPm1vdGlvbl92YWxfcG9vbCk7CisgICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZoLT5yZWZfaW5kZXhfcG9vbCk7CisKKyAgICBpZiAoZnJlZV9yYnNwICYmIGgtPkRQQikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSDI2NF9NQVhfUElDVFVSRV9DT1VOVDsgaSsrKQorICAgICAgICAgICAgZmZfaDI2NF91bnJlZl9waWN0dXJlKGgsICZoLT5EUEJbaV0pOworICAgICAgICBhdl9mcmVlcCgmaC0+RFBCKTsKKyAgICB9IGVsc2UgaWYgKGgtPkRQQikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSDI2NF9NQVhfUElDVFVSRV9DT1VOVDsgaSsrKQorICAgICAgICAgICAgaC0+RFBCW2ldLm5lZWRzX3JlYWxsb2MgPSAxOworICAgIH0KKworICAgIGgtPmN1cl9waWNfcHRyID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBIMjY0X01BWF9USFJFQURTOyBpKyspIHsKKyAgICAgICAgaHggPSBoLT50aHJlYWRfY29udGV4dFtpXTsKKyAgICAgICAgaWYgKCFoeCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBhdl9mcmVlcCgmaHgtPnRvcF9ib3JkZXJzWzFdKTsKKyAgICAgICAgYXZfZnJlZXAoJmh4LT50b3BfYm9yZGVyc1swXSk7CisgICAgICAgIGF2X2ZyZWVwKCZoeC0+YmlwcmVkX3NjcmF0Y2hwYWQpOworICAgICAgICBhdl9mcmVlcCgmaHgtPmVkZ2VfZW11X2J1ZmZlcik7CisgICAgICAgIGF2X2ZyZWVwKCZoeC0+ZGNfdmFsX2Jhc2UpOworICAgICAgICBhdl9mcmVlcCgmaHgtPmVyLm1iX2luZGV4Mnh5KTsKKyAgICAgICAgYXZfZnJlZXAoJmh4LT5lci5lcnJvcl9zdGF0dXNfdGFibGUpOworICAgICAgICBhdl9mcmVlcCgmaHgtPmVyLmVyX3RlbXBfYnVmZmVyKTsKKyAgICAgICAgYXZfZnJlZXAoJmh4LT5lci5tYmludHJhX3RhYmxlKTsKKyAgICAgICAgYXZfZnJlZXAoJmh4LT5lci5tYnNraXBfdGFibGUpOworCisgICAgICAgIGlmIChmcmVlX3Jic3ApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZoeC0+cmJzcF9idWZmZXJbMV0pOworICAgICAgICAgICAgYXZfZnJlZXAoJmh4LT5yYnNwX2J1ZmZlclswXSk7CisgICAgICAgICAgICBoeC0+cmJzcF9idWZmZXJfc2l6ZVswXSA9IDA7CisgICAgICAgICAgICBoeC0+cmJzcF9idWZmZXJfc2l6ZVsxXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkpCisgICAgICAgICAgICBhdl9mcmVlcCgmaC0+dGhyZWFkX2NvbnRleHRbaV0pOworICAgIH0KK30KKworaW50IGZmX2gyNjRfYWxsb2NfdGFibGVzKEgyNjRDb250ZXh0ICpoKQoreworICAgIGNvbnN0IGludCBiaWdfbWJfbnVtID0gaC0+bWJfc3RyaWRlICogKGgtPm1iX2hlaWdodCArIDEpOworICAgIGNvbnN0IGludCByb3dfbWJfbnVtID0gMipoLT5tYl9zdHJpZGUqRkZNQVgoaC0+YXZjdHgtPnRocmVhZF9jb3VudCwgMSk7CisgICAgaW50IHgsIHksIGk7CisKKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhoLT5hdmN0eCwgaC0+aW50cmE0eDRfcHJlZF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgIHJvd19tYl9udW0sIDggKiBzaXplb2YodWludDhfdCksIGZhaWwpCisgICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIGgtPm5vbl96ZXJvX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgIGJpZ19tYl9udW0gKiA0OCAqIHNpemVvZih1aW50OF90KSwgZmFpbCkKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgaC0+c2xpY2VfdGFibGVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAoYmlnX21iX251bSArIGgtPm1iX3N0cmlkZSkgKiBzaXplb2YoKmgtPnNsaWNlX3RhYmxlX2Jhc2UpLCBmYWlsKQorICAgIEZGX0FMTE9DWl9PUl9HT1RPKGgtPmF2Y3R4LCBoLT5jYnBfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgYmlnX21iX251bSAqIHNpemVvZih1aW50MTZfdCksIGZhaWwpCisgICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIGgtPmNocm9tYV9wcmVkX21vZGVfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgYmlnX21iX251bSAqIHNpemVvZih1aW50OF90KSwgZmFpbCkKKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhoLT5hdmN0eCwgaC0+bXZkX3RhYmxlWzBdLAorICAgICAgICAgICAgICAgICAgICAgIHJvd19tYl9udW0sIDE2ICogc2l6ZW9mKHVpbnQ4X3QpLCBmYWlsKTsKKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhoLT5hdmN0eCwgaC0+bXZkX3RhYmxlWzFdLAorICAgICAgICAgICAgICAgICAgICAgIHJvd19tYl9udW0sIDE2ICogc2l6ZW9mKHVpbnQ4X3QpLCBmYWlsKTsKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgaC0+ZGlyZWN0X3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIDQgKiBiaWdfbWJfbnVtICogc2l6ZW9mKHVpbnQ4X3QpLCBmYWlsKTsKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgaC0+bGlzdF9jb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgYmlnX21iX251bSAqIHNpemVvZih1aW50OF90KSwgZmFpbCkKKworICAgIG1lbXNldChoLT5zbGljZV90YWJsZV9iYXNlLCAtMSwKKyAgICAgICAgICAgKGJpZ19tYl9udW0gKyBoLT5tYl9zdHJpZGUpICogc2l6ZW9mKCpoLT5zbGljZV90YWJsZV9iYXNlKSk7CisgICAgaC0+c2xpY2VfdGFibGUgPSBoLT5zbGljZV90YWJsZV9iYXNlICsgaC0+bWJfc3RyaWRlICogMiArIDE7CisKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgaC0+bWIyYl94eSwKKyAgICAgICAgICAgICAgICAgICAgICBiaWdfbWJfbnVtICogc2l6ZW9mKHVpbnQzMl90KSwgZmFpbCk7CisgICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIGgtPm1iMmJyX3h5LAorICAgICAgICAgICAgICAgICAgICAgIGJpZ19tYl9udW0gKiBzaXplb2YodWludDMyX3QpLCBmYWlsKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaC0+bWJfaGVpZ2h0OyB5KyspCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBoLT5tYl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSB4ICsgeSAqIGgtPm1iX3N0cmlkZTsKKyAgICAgICAgICAgIGNvbnN0IGludCBiX3h5ICA9IDQgKiB4ICsgNCAqIHkgKiBoLT5iX3N0cmlkZTsKKworICAgICAgICAgICAgaC0+bWIyYl94eVttYl94eV0gID0gYl94eTsKKyAgICAgICAgICAgIGgtPm1iMmJyX3h5W21iX3h5XSA9IDggKiAoRk1PID8gbWJfeHkgOiAobWJfeHkgJSAoMiAqIGgtPm1iX3N0cmlkZSkpKTsKKyAgICAgICAgfQorCisgICAgaWYgKCFoLT5kZXF1YW50NF9jb2VmZlswXSkKKyAgICAgICAgaDI2NF9pbml0X2RlcXVhbnRfdGFibGVzKGgpOworCisgICAgaWYgKCFoLT5EUEIpIHsKKyAgICAgICAgaC0+RFBCID0gYXZfbWFsbG9jel9hcnJheShIMjY0X01BWF9QSUNUVVJFX0NPVU5ULCBzaXplb2YoKmgtPkRQQikpOworICAgICAgICBpZiAoIWgtPkRQQikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEgyNjRfTUFYX1BJQ1RVUkVfQ09VTlQ7IGkrKykKKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKCZoLT5EUEJbaV0uZik7CisgICAgICAgIGF2X2ZyYW1lX3VucmVmKCZoLT5jdXJfcGljLmYpOworICAgIH0KKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGZmX2gyNjRfZnJlZV90YWJsZXMoaCwgMSk7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworLyoqCisgKiBJbml0IGNvbnRleHQKKyAqIEFsbG9jYXRlIGJ1ZmZlcnMgd2hpY2ggYXJlIG5vdCBzaGFyZWQgYW1vbmdzdCBtdWx0aXBsZSB0aHJlYWRzLgorICovCitpbnQgZmZfaDI2NF9jb250ZXh0X2luaXQoSDI2NENvbnRleHQgKmgpCit7CisgICAgRVJDb250ZXh0ICplciA9ICZoLT5lcjsKKyAgICBpbnQgbWJfYXJyYXlfc2l6ZSA9IGgtPm1iX2hlaWdodCAqIGgtPm1iX3N0cmlkZTsKKyAgICBpbnQgeV9zaXplICA9ICgyICogaC0+bWJfd2lkdGggKyAxKSAqICgyICogaC0+bWJfaGVpZ2h0ICsgMSk7CisgICAgaW50IGNfc2l6ZSAgPSBoLT5tYl9zdHJpZGUgKiAoaC0+bWJfaGVpZ2h0ICsgMSk7CisgICAgaW50IHljX3NpemUgPSB5X3NpemUgKyAyICAgKiBjX3NpemU7CisgICAgaW50IHgsIHksIGk7CisKKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhoLT5hdmN0eCwgaC0+dG9wX2JvcmRlcnNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgaC0+bWJfd2lkdGgsIDE2ICogMyAqIHNpemVvZih1aW50OF90KSAqIDIsIGZhaWwpCisgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oaC0+YXZjdHgsIGgtPnRvcF9ib3JkZXJzWzFdLAorICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX3dpZHRoLCAxNiAqIDMgKiBzaXplb2YodWludDhfdCkgKiAyLCBmYWlsKQorCisgICAgaC0+cmVmX2NhY2hlWzBdW3NjYW44WzVdICArIDFdID0KKyAgICBoLT5yZWZfY2FjaGVbMF1bc2NhbjhbN10gICsgMV0gPQorICAgIGgtPnJlZl9jYWNoZVswXVtzY2FuOFsxM10gKyAxXSA9CisgICAgaC0+cmVmX2NhY2hlWzFdW3NjYW44WzVdICArIDFdID0KKyAgICBoLT5yZWZfY2FjaGVbMV1bc2NhbjhbN10gICsgMV0gPQorICAgIGgtPnJlZl9jYWNoZVsxXVtzY2FuOFsxM10gKyAxXSA9IFBBUlRfTk9UX0FWQUlMQUJMRTsKKworICAgIGlmIChDT05GSUdfRVJST1JfUkVTSUxJRU5DRSkgeworICAgICAgICAvKiBpbml0IEVSICovCisgICAgICAgIGVyLT5hdmN0eCAgICAgICAgICA9IGgtPmF2Y3R4OworICAgICAgICBlci0+bWVjYyAgICAgICAgICAgPSAmaC0+bWVjYzsKKyAgICAgICAgZXItPmRlY29kZV9tYiAgICAgID0gaDI2NF9lcl9kZWNvZGVfbWI7CisgICAgICAgIGVyLT5vcGFxdWUgICAgICAgICA9IGg7CisgICAgICAgIGVyLT5xdWFydGVyX3NhbXBsZSA9IDE7CisKKyAgICAgICAgZXItPm1iX251bSAgICAgID0gaC0+bWJfbnVtOworICAgICAgICBlci0+bWJfd2lkdGggICAgPSBoLT5tYl93aWR0aDsKKyAgICAgICAgZXItPm1iX2hlaWdodCAgID0gaC0+bWJfaGVpZ2h0OworICAgICAgICBlci0+bWJfc3RyaWRlICAgPSBoLT5tYl9zdHJpZGU7CisgICAgICAgIGVyLT5iOF9zdHJpZGUgICA9IGgtPm1iX3dpZHRoICogMiArIDE7CisKKyAgICAgICAgLy8gZXJyb3IgcmVzaWxpZW5jZSBjb2RlIGxvb2tzIGNsZWFuZXIgd2l0aCB0aGlzCisgICAgICAgIEZGX0FMTE9DWl9PUl9HT1RPKGgtPmF2Y3R4LCBlci0+bWJfaW5kZXgyeHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5tYl9udW0gKyAxKSAqIHNpemVvZihpbnQpLCBmYWlsKTsKKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaC0+bWJfaGVpZ2h0OyB5KyspCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaC0+bWJfd2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICBlci0+bWJfaW5kZXgyeHlbeCArIHkgKiBoLT5tYl93aWR0aF0gPSB4ICsgeSAqIGgtPm1iX3N0cmlkZTsKKworICAgICAgICBlci0+bWJfaW5kZXgyeHlbaC0+bWJfaGVpZ2h0ICogaC0+bWJfd2lkdGhdID0gKGgtPm1iX2hlaWdodCAtIDEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX3N0cmlkZSArIGgtPm1iX3dpZHRoOworCisgICAgICAgIEZGX0FMTE9DWl9PUl9HT1RPKGgtPmF2Y3R4LCBlci0+ZXJyb3Jfc3RhdHVzX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYl9hcnJheV9zaXplICogc2l6ZW9mKHVpbnQ4X3QpLCBmYWlsKTsKKworICAgICAgICBGRl9BTExPQ19PUl9HT1RPKGgtPmF2Y3R4LCBlci0+bWJpbnRyYV90YWJsZSwgbWJfYXJyYXlfc2l6ZSwgZmFpbCk7CisgICAgICAgIG1lbXNldChlci0+bWJpbnRyYV90YWJsZSwgMSwgbWJfYXJyYXlfc2l6ZSk7CisKKyAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIGVyLT5tYnNraXBfdGFibGUsIG1iX2FycmF5X3NpemUgKyAyLCBmYWlsKTsKKworICAgICAgICBGRl9BTExPQ19PUl9HT1RPKGgtPmF2Y3R4LCBlci0+ZXJfdGVtcF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWJfaGVpZ2h0ICogaC0+bWJfc3RyaWRlLCBmYWlsKTsKKworICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgaC0+ZGNfdmFsX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHljX3NpemUgKiBzaXplb2YoaW50MTZfdCksIGZhaWwpOworICAgICAgICBlci0+ZGNfdmFsWzBdID0gaC0+ZGNfdmFsX2Jhc2UgKyBoLT5tYl93aWR0aCAqIDIgKyAyOworICAgICAgICBlci0+ZGNfdmFsWzFdID0gaC0+ZGNfdmFsX2Jhc2UgKyB5X3NpemUgKyBoLT5tYl9zdHJpZGUgKyAxOworICAgICAgICBlci0+ZGNfdmFsWzJdID0gZXItPmRjX3ZhbFsxXSArIGNfc2l6ZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHljX3NpemU7IGkrKykKKyAgICAgICAgICAgIGgtPmRjX3ZhbF9iYXNlW2ldID0gMTAyNDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOyAvLyBmZl9oMjY0X2ZyZWVfdGFibGVzIHdpbGwgY2xlYW4gdXAgZm9yIHVzCit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25hbF91bml0cyhIMjY0Q29udGV4dCAqaCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcnNlX2V4dHJhZGF0YSk7CisKK2ludCBmZl9oMjY0X2RlY29kZV9leHRyYWRhdGEoSDI2NENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gaC0+YXZjdHg7CisgICAgaW50IHJldDsKKworICAgIGlmICghYnVmIHx8IHNpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGJ1ZlswXSA9PSAxKSB7CisgICAgICAgIGludCBpLCBjbnQsIG5hbHNpemU7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBidWY7CisKKyAgICAgICAgaC0+aXNfYXZjID0gMTsKKworICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJhdmNDICVkIHRvbyBzaG9ydFxuIiwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICAvKiBzcHMgYW5kIHBwcyBpbiB0aGUgYXZjQyBhbHdheXMgaGF2ZSBsZW5ndGggY29kZWQgd2l0aCAyIGJ5dGVzLAorICAgICAgICAgKiBzbyBwdXQgYSBmYWtlIG5hbF9sZW5ndGhfc2l6ZSA9IDIgd2hpbGUgcGFyc2luZyB0aGVtICovCisgICAgICAgIGgtPm5hbF9sZW5ndGhfc2l6ZSA9IDI7CisgICAgICAgIC8vIERlY29kZSBzcHMgZnJvbSBhdmNDCisgICAgICAgIGNudCA9ICoocCArIDUpICYgMHgxZjsgLy8gTnVtYmVyIG9mIHNwcworICAgICAgICBwICArPSA2OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgICAgIG5hbHNpemUgPSBBVl9SQjE2KHApICsgMjsKKyAgICAgICAgICAgIGlmKG5hbHNpemUgPiBzaXplIC0gKHAtYnVmKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9uYWxfdW5pdHMoaCwgcCwgbmFsc2l6ZSwgMSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRGVjb2Rpbmcgc3BzICVkIGZyb20gYXZjQyBmYWlsZWRcbiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwICs9IG5hbHNpemU7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVjb2RlIHBwcyBmcm9tIGF2Y0MKKyAgICAgICAgY250ID0gKihwKyspOyAvLyBOdW1iZXIgb2YgcHBzCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICAgICAgbmFsc2l6ZSA9IEFWX1JCMTYocCkgKyAyOworICAgICAgICAgICAgaWYobmFsc2l6ZSA+IHNpemUgLSAocC1idWYpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX25hbF91bml0cyhoLCBwLCBuYWxzaXplLCAxKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJEZWNvZGluZyBwcHMgJWQgZnJvbSBhdmNDIGZhaWxlZFxuIiwgaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAgKz0gbmFsc2l6ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBTdG9yZSByaWdodCBuYWwgbGVuZ3RoIHNpemUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcGFyc2UgYWxsIG90aGVyIG5hbHMKKyAgICAgICAgaC0+bmFsX2xlbmd0aF9zaXplID0gKGJ1Zls0XSAmIDB4MDMpICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICBoLT5pc19hdmMgPSAwOworICAgICAgICByZXQgPSBkZWNvZGVfbmFsX3VuaXRzKGgsIGJ1Ziwgc2l6ZSwgMSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK2F2X2NvbGQgaW50IGZmX2gyNjRfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEgyNjRDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0OworCisgICAgaC0+YXZjdHggPSBhdmN0eDsKKworICAgIGgtPmJpdF9kZXB0aF9sdW1hICAgID0gODsKKyAgICBoLT5jaHJvbWFfZm9ybWF0X2lkYyA9IDE7CisKKyAgICBoLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDg7CisgICAgaC0+Y3VyX2Nocm9tYV9mb3JtYXRfaWRjID0gMTsKKworICAgIGZmX2gyNjRkc3BfaW5pdCgmaC0+aDI2NGRzcCwgOCwgMSk7CisgICAgYXZfYXNzZXJ0MChoLT5zcHMuYml0X2RlcHRoX2Nocm9tYSA9PSAwKTsKKyAgICBmZl9oMjY0Y2hyb21hX2luaXQoJmgtPmgyNjRjaHJvbWEsIGgtPnNwcy5iaXRfZGVwdGhfY2hyb21hKTsKKyAgICBmZl9oMjY0cXBlbF9pbml0KCZoLT5oMjY0cXBlbCwgOCk7CisgICAgZmZfaDI2NF9wcmVkX2luaXQoJmgtPmhwYywgaC0+YXZjdHgtPmNvZGVjX2lkLCA4LCAxKTsKKworICAgIGgtPmRlcXVhbnRfY29lZmZfcHBzID0gLTE7CisgICAgaC0+Y3VycmVudF9zcHNfaWQgPSAtMTsKKworICAgIC8qIG5lZWRlZCBzbyB0aGF0IElEQ1QgcGVybXV0YXRpb24gaXMga25vd24gZWFybHkgKi8KKyAgICBpZiAoQ09ORklHX0VSUk9SX1JFU0lMSUVOQ0UpCisgICAgICAgIGZmX21lX2NtcF9pbml0KCZoLT5tZWNjLCBoLT5hdmN0eCk7CisgICAgZmZfdmlkZW9kc3BfaW5pdCgmaC0+dmRzcCwgOCk7CisKKyAgICBtZW1zZXQoaC0+cHBzLnNjYWxpbmdfbWF0cml4NCwgMTYsIDYgKiAxNiAqIHNpemVvZih1aW50OF90KSk7CisgICAgbWVtc2V0KGgtPnBwcy5zY2FsaW5nX21hdHJpeDgsIDE2LCAyICogNjQgKiBzaXplb2YodWludDhfdCkpOworCisgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgICA9IFBJQ1RfRlJBTUU7CisgICAgaC0+c2xpY2VfY29udGV4dF9jb3VudCA9IDE7CisgICAgaC0+d29ya2Fyb3VuZF9idWdzICAgICA9IGF2Y3R4LT53b3JrYXJvdW5kX2J1Z3M7CisgICAgaC0+ZmxhZ3MgICAgICAgICAgICAgICA9IGF2Y3R4LT5mbGFnczsKKworICAgIC8qIHNldCBkZWZhdWx0cyAqLworICAgIC8vIHMtPmRlY29kZV9tYiA9IGZmX2gyNjNfZGVjb2RlX21iOworICAgIGlmICghYXZjdHgtPmhhc19iX2ZyYW1lcykKKyAgICAgICAgaC0+bG93X2RlbGF5ID0gMTsKKworICAgIGF2Y3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gQVZDSFJPTUFfTE9DX0xFRlQ7CisKKyAgICBmZl9oMjY0X2RlY29kZV9pbml0X3ZsYygpOworCisgICAgZmZfaW5pdF9jYWJhY19zdGF0ZXMoKTsKKworICAgIGgtPnBpeGVsX3NoaWZ0ICAgICAgICA9IDA7CisgICAgaC0+c3BzLmJpdF9kZXB0aF9sdW1hID0gYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSA4OworCisgICAgaC0+dGhyZWFkX2NvbnRleHRbMF0gPSBoOworICAgIGgtPm91dHB1dGVkX3BvYyAgICAgID0gaC0+bmV4dF9vdXRwdXRlZF9wb2MgPSBJTlRfTUlOOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfREVMQVlFRF9QSUNfQ09VTlQ7IGkrKykKKyAgICAgICAgaC0+bGFzdF9wb2NzW2ldID0gSU5UX01JTjsKKyAgICBoLT5wcmV2X3BvY19tc2IgPSAxIDw8IDE2OworICAgIGgtPnByZXZfZnJhbWVfbnVtID0gLTE7CisgICAgaC0+eDI2NF9idWlsZCAgID0gLTE7CisgICAgaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2NhbmNlbF9mbGFnID0gLTE7CisgICAgZmZfaDI2NF9yZXNldF9zZWkoaCk7CisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgICAgIGlmIChhdmN0eC0+dGlja3NfcGVyX2ZyYW1lID09IDEpIHsKKyAgICAgICAgICAgIGlmKGgtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuIDwgSU5UX01BWC8yKSB7CisgICAgICAgICAgICAgICAgaC0+YXZjdHgtPnRpbWVfYmFzZS5kZW4gKj0gMjsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGgtPmF2Y3R4LT50aW1lX2Jhc2UubnVtIC89IDI7CisgICAgICAgIH0KKyAgICAgICAgYXZjdHgtPnRpY2tzX3Blcl9mcmFtZSA9IDI7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYgYXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9leHRyYWRhdGEoaCwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZmX2gyNjRfZnJlZV9jb250ZXh0KGgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoLT5zcHMuYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgJiYKKyAgICAgICAgaC0+YXZjdHgtPmhhc19iX2ZyYW1lcyA8IGgtPnNwcy5udW1fcmVvcmRlcl9mcmFtZXMpIHsKKyAgICAgICAgaC0+YXZjdHgtPmhhc19iX2ZyYW1lcyA9IGgtPnNwcy5udW1fcmVvcmRlcl9mcmFtZXM7CisgICAgICAgIGgtPmxvd19kZWxheSAgICAgICAgICAgPSAwOworICAgIH0KKworICAgIGF2Y3R4LT5pbnRlcm5hbC0+YWxsb2NhdGVfcHJvZ3Jlc3MgPSAxOworCisgICAgZmZfaDI2NF9mbHVzaF9jaGFuZ2UoaCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKCFhdmN0eC0+aW50ZXJuYWwtPmlzX2NvcHkpCisgICAgICAgIHJldHVybiAwOworICAgIG1lbXNldChoLT5zcHNfYnVmZmVycywgMCwgc2l6ZW9mKGgtPnNwc19idWZmZXJzKSk7CisgICAgbWVtc2V0KGgtPnBwc19idWZmZXJzLCAwLCBzaXplb2YoaC0+cHBzX2J1ZmZlcnMpKTsKKworICAgIGgtPnJic3BfYnVmZmVyWzBdID0gTlVMTDsKKyAgICBoLT5yYnNwX2J1ZmZlclsxXSA9IE5VTEw7CisgICAgaC0+cmJzcF9idWZmZXJfc2l6ZVswXSA9IDA7CisgICAgaC0+cmJzcF9idWZmZXJfc2l6ZVsxXSA9IDA7CisgICAgaC0+Y29udGV4dF9pbml0aWFsaXplZCA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSdW4gc2V0dXAgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgcnVuIGFmdGVyIHNsaWNlIGhlYWRlciBkZWNvZGluZy4KKyAqIFRoaXMgaW5jbHVkZXMgZmluZGluZyB0aGUgbmV4dCBkaXNwbGF5ZWQgZnJhbWUuCisgKgorICogQHBhcmFtIGggaDI2NCBtYXN0ZXIgY29udGV4dAorICogQHBhcmFtIHNldHVwX2ZpbmlzaGVkIGVub3VnaCBOQUxzIGhhdmUgYmVlbiByZWFkIHRoYXQgd2UgY2FuIGNhbGwKKyAqIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoKQorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfcG9zdGluaXQoSDI2NENvbnRleHQgKmgsIGludCBzZXR1cF9maW5pc2hlZCkKK3sKKyAgICBIMjY0UGljdHVyZSAqb3V0ID0gaC0+Y3VyX3BpY19wdHI7CisgICAgSDI2NFBpY3R1cmUgKmN1ciA9IGgtPmN1cl9waWNfcHRyOworICAgIGludCBpLCBwaWNzLCBvdXRfb2Zfb3JkZXIsIG91dF9pZHg7CisKKyAgICBoLT5jdXJfcGljX3B0ci0+Zi5waWN0X3R5cGUgPSBoLT5waWN0X3R5cGU7CisKKyAgICBpZiAoaC0+bmV4dF9vdXRwdXRfcGljKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoY3VyLT5maWVsZF9wb2NbMF0gPT0gSU5UX01BWCB8fCBjdXItPmZpZWxkX3BvY1sxXSA9PSBJTlRfTUFYKSB7CisgICAgICAgIC8qIEZJWE1FOiBpZiB3ZSBoYXZlIHR3byBQQUZGIGZpZWxkcyBpbiBvbmUgcGFja2V0LCB3ZSBjYW4ndCBzdGFydAorICAgICAgICAgKiB0aGUgbmV4dCB0aHJlYWQgaGVyZS4gSWYgd2UgaGF2ZSBvbmUgZmllbGQgcGVyIHBhY2tldCwgd2UgY2FuLgorICAgICAgICAgKiBUaGUgY2hlY2sgaW4gZGVjb2RlX25hbF91bml0cygpIGlzIG5vdCBnb29kIGVub3VnaCB0byBmaW5kIHRoaXMKKyAgICAgICAgICogeWV0LCBzbyB3ZSBhc3N1bWUgdGhlIHdvcnN0IGZvciBub3cuICovCisgICAgICAgIC8vIGlmIChzZXR1cF9maW5pc2hlZCkKKyAgICAgICAgLy8gICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChoLT5hdmN0eCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjdXItPmYuaW50ZXJsYWNlZF9mcmFtZSA9IDA7CisgICAgY3VyLT5mLnJlcGVhdF9waWN0ICAgICAgPSAwOworCisgICAgLyogU2lnbmFsIGludGVybGFjaW5nIGluZm9ybWF0aW9uIGV4dGVybmFsbHkuICovCisgICAgLyogUHJpb3JpdGl6ZSBwaWN0dXJlIHRpbWluZyBTRUkgaW5mb3JtYXRpb24gb3ZlciB1c2VkCisgICAgICogZGVjb2RpbmcgcHJvY2VzcyBpZiBpdCBleGlzdHMuICovCisKKyAgICBpZiAoaC0+c3BzLnBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnKSB7CisgICAgICAgIHN3aXRjaCAoaC0+c2VpX3BpY19zdHJ1Y3QpIHsKKyAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9GUkFNRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX1RPUF9GSUVMRDoKKyAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9CT1RUT01fRklFTEQ6CisgICAgICAgICAgICBjdXItPmYuaW50ZXJsYWNlZF9mcmFtZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NOgorICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX0JPVFRPTV9UT1A6CisgICAgICAgICAgICBpZiAoRklFTERfT1JfTUJBRkZfUElDVFVSRShoKSkKKyAgICAgICAgICAgICAgICBjdXItPmYuaW50ZXJsYWNlZF9mcmFtZSA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZsYWcgc29mdCB0ZWxlY2luZSBwcm9ncmVzc2l2ZQorICAgICAgICAgICAgICAgIGN1ci0+Zi5pbnRlcmxhY2VkX2ZyYW1lID0gaC0+cHJldl9pbnRlcmxhY2VkX2ZyYW1lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfVE9QX0JPVFRPTV9UT1A6CisgICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfQk9UVE9NX1RPUF9CT1RUT006CisgICAgICAgICAgICAvKiBTaWduYWwgdGhlIHBvc3NpYmlsaXR5IG9mIHRlbGVjaW5lZCBmaWxtIGV4dGVybmFsbHkKKyAgICAgICAgICAgICAqIChwaWNfc3RydWN0IDUsNikuIEZyb20gdGhlc2UgaGludHMsIGxldCB0aGUgYXBwbGljYXRpb25zCisgICAgICAgICAgICAgKiBkZWNpZGUgaWYgdGhleSBhcHBseSBkZWludGVybGFjaW5nLiAqLworICAgICAgICAgICAgY3VyLT5mLnJlcGVhdF9waWN0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX0ZSQU1FX0RPVUJMSU5HOgorICAgICAgICAgICAgY3VyLT5mLnJlcGVhdF9waWN0ID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX0ZSQU1FX1RSSVBMSU5HOgorICAgICAgICAgICAgY3VyLT5mLnJlcGVhdF9waWN0ID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChoLT5zZWlfY3RfdHlwZSAmIDMpICYmCisgICAgICAgICAgICBoLT5zZWlfcGljX3N0cnVjdCA8PSBTRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QKQorICAgICAgICAgICAgY3VyLT5mLmludGVybGFjZWRfZnJhbWUgPSAoaC0+c2VpX2N0X3R5cGUgJiAoMSA8PCAxKSkgIT0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBEZXJpdmUgaW50ZXJsYWNpbmcgZmxhZyBmcm9tIHVzZWQgZGVjb2RpbmcgcHJvY2Vzcy4gKi8KKyAgICAgICAgY3VyLT5mLmludGVybGFjZWRfZnJhbWUgPSBGSUVMRF9PUl9NQkFGRl9QSUNUVVJFKGgpOworICAgIH0KKyAgICBoLT5wcmV2X2ludGVybGFjZWRfZnJhbWUgPSBjdXItPmYuaW50ZXJsYWNlZF9mcmFtZTsKKworICAgIGlmIChjdXItPmZpZWxkX3BvY1swXSAhPSBjdXItPmZpZWxkX3BvY1sxXSkgeworICAgICAgICAvKiBEZXJpdmUgdG9wX2ZpZWxkX2ZpcnN0IGZyb20gZmllbGQgcG9jcy4gKi8KKyAgICAgICAgY3VyLT5mLnRvcF9maWVsZF9maXJzdCA9IGN1ci0+ZmllbGRfcG9jWzBdIDwgY3VyLT5maWVsZF9wb2NbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGN1ci0+Zi5pbnRlcmxhY2VkX2ZyYW1lIHx8IGgtPnNwcy5waWNfc3RydWN0X3ByZXNlbnRfZmxhZykgeworICAgICAgICAgICAgLyogVXNlIHBpY3R1cmUgdGltaW5nIFNFSSBpbmZvcm1hdGlvbi4gRXZlbiBpZiBpdCBpcyBhCisgICAgICAgICAgICAgKiBpbmZvcm1hdGlvbiBvZiBhIHBhc3QgZnJhbWUsIGJldHRlciB0aGFuIG5vdGhpbmcuICovCisgICAgICAgICAgICBpZiAoaC0+c2VpX3BpY19zdHJ1Y3QgPT0gU0VJX1BJQ19TVFJVQ1RfVE9QX0JPVFRPTSB8fAorICAgICAgICAgICAgICAgIGgtPnNlaV9waWNfc3RydWN0ID09IFNFSV9QSUNfU1RSVUNUX1RPUF9CT1RUT01fVE9QKQorICAgICAgICAgICAgICAgIGN1ci0+Zi50b3BfZmllbGRfZmlyc3QgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN1ci0+Zi50b3BfZmllbGRfZmlyc3QgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTW9zdCBsaWtlbHkgcHJvZ3Jlc3NpdmUgKi8KKyAgICAgICAgICAgIGN1ci0+Zi50b3BfZmllbGRfZmlyc3QgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGgtPnNlaV9mcmFtZV9wYWNraW5nX3ByZXNlbnQgJiYKKyAgICAgICAgaC0+ZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlID49IDAgJiYKKyAgICAgICAgaC0+ZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlIDw9IDYgJiYKKyAgICAgICAgaC0+Y29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID4gMCAmJgorICAgICAgICBoLT5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPCAzKSB7CisgICAgICAgIEFWU3RlcmVvM0QgKnN0ZXJlbyA9IGF2X3N0ZXJlbzNkX2NyZWF0ZV9zaWRlX2RhdGEoJmN1ci0+Zik7CisgICAgICAgIGlmIChzdGVyZW8pIHsKKyAgICAgICAgc3dpdGNoIChoLT5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfQ0hFQ0tFUkJPQVJEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX0NPTFVNTlM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfTElORVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKGgtPnF1aW5jdW54X3N1YnNhbXBsaW5nKQorICAgICAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX1NJREVCWVNJREVfUVVJTkNVTlg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfU0lERUJZU0lERTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF9UT1BCT1RUT007CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfRlJBTUVTRVFVRU5DRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF8yRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGgtPmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA9PSAyKQorICAgICAgICAgICAgc3RlcmVvLT5mbGFncyA9IEFWX1NURVJFTzNEX0ZMQUdfSU5WRVJUOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGgtPnNlaV9kaXNwbGF5X29yaWVudGF0aW9uX3ByZXNlbnQgJiYKKyAgICAgICAgKGgtPnNlaV9hbnRpY2xvY2t3aXNlX3JvdGF0aW9uIHx8IGgtPnNlaV9oZmxpcCB8fCBoLT5zZWlfdmZsaXApKSB7CisgICAgICAgIGRvdWJsZSBhbmdsZSA9IGgtPnNlaV9hbnRpY2xvY2t3aXNlX3JvdGF0aW9uICogMzYwIC8gKGRvdWJsZSkgKDEgPDwgMTYpOworICAgICAgICBBVkZyYW1lU2lkZURhdGEgKnJvdGF0aW9uID0gYXZfZnJhbWVfbmV3X3NpZGVfZGF0YSgmY3VyLT5mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9GUkFNRV9EQVRBX0RJU1BMQVlNQVRSSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQzMl90KSAqIDkpOworICAgICAgICBpZiAocm90YXRpb24pIHsKKyAgICAgICAgICAgIGF2X2Rpc3BsYXlfcm90YXRpb25fc2V0KChpbnQzMl90ICopcm90YXRpb24tPmRhdGEsIGFuZ2xlKTsKKyAgICAgICAgICAgIGF2X2Rpc3BsYXlfbWF0cml4X2ZsaXAoKGludDMyX3QgKilyb3RhdGlvbi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c2VpX2hmbGlwLCBoLT5zZWlfdmZsaXApOworICAgICAgICB9CisgICAgfQorCisgICAgY3VyLT5tbWNvX3Jlc2V0ID0gaC0+bW1jb19yZXNldDsKKyAgICBoLT5tbWNvX3Jlc2V0ID0gMDsKKworICAgIC8vIEZJWE1FIGRvIHNvbWV0aGluZyB3aXRoIHVuYXZhaWxhYmxlIHJlZmVyZW5jZSBmcmFtZXMKKworICAgIC8qIFNvcnQgQi1mcmFtZXMgaW50byBkaXNwbGF5IG9yZGVyICovCisKKyAgICBpZiAoaC0+c3BzLmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnICYmCisgICAgICAgIGgtPmF2Y3R4LT5oYXNfYl9mcmFtZXMgPCBoLT5zcHMubnVtX3Jlb3JkZXJfZnJhbWVzKSB7CisgICAgICAgIGgtPmF2Y3R4LT5oYXNfYl9mcmFtZXMgPSBoLT5zcHMubnVtX3Jlb3JkZXJfZnJhbWVzOworICAgICAgICBoLT5sb3dfZGVsYXkgICAgICAgICAgID0gMDsKKyAgICB9CisKKyAgICBpZiAoaC0+YXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+PSBGRl9DT01QTElBTkNFX1NUUklDVCAmJgorICAgICAgICAhaC0+c3BzLmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnKSB7CisgICAgICAgIGgtPmF2Y3R4LT5oYXNfYl9mcmFtZXMgPSBNQVhfREVMQVlFRF9QSUNfQ09VTlQgLSAxOworICAgICAgICBoLT5sb3dfZGVsYXkgICAgICAgICAgID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyAxOyBpKyspIHsKKyAgICAgICAgaWYoaSA9PSBNQVhfREVMQVlFRF9QSUNfQ09VTlQgfHwgY3VyLT5wb2MgPCBoLT5sYXN0X3BvY3NbaV0peworICAgICAgICAgICAgaWYoaSkKKyAgICAgICAgICAgICAgICBoLT5sYXN0X3BvY3NbaS0xXSA9IGN1ci0+cG9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZihpKSB7CisgICAgICAgICAgICBoLT5sYXN0X3BvY3NbaS0xXT0gaC0+bGFzdF9wb2NzW2ldOworICAgICAgICB9CisgICAgfQorICAgIG91dF9vZl9vcmRlciA9IE1BWF9ERUxBWUVEX1BJQ19DT1VOVCAtIGk7CisgICAgaWYoICAgY3VyLT5mLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQgorICAgICAgIHx8IChoLT5sYXN0X3BvY3NbTUFYX0RFTEFZRURfUElDX0NPVU5ULTJdID4gSU5UX01JTiAmJiBoLT5sYXN0X3BvY3NbTUFYX0RFTEFZRURfUElDX0NPVU5ULTFdIC0gaC0+bGFzdF9wb2NzW01BWF9ERUxBWUVEX1BJQ19DT1VOVC0yXSA+IDIpKQorICAgICAgICBvdXRfb2Zfb3JkZXIgPSBGRk1BWChvdXRfb2Zfb3JkZXIsIDEpOworICAgIGlmIChvdXRfb2Zfb3JkZXIgPT0gTUFYX0RFTEFZRURfUElDX0NPVU5UKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJJbnZhbGlkIFBPQyAlZDwlZFxuIiwgY3VyLT5wb2MsIGgtPmxhc3RfcG9jc1swXSk7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfREVMQVlFRF9QSUNfQ09VTlQ7IGkrKykKKyAgICAgICAgICAgIGgtPmxhc3RfcG9jc1tpXSA9IElOVF9NSU47CisgICAgICAgIGgtPmxhc3RfcG9jc1swXSA9IGN1ci0+cG9jOworICAgICAgICBjdXItPm1tY29fcmVzZXQgPSAxOworICAgIH0gZWxzZSBpZihoLT5hdmN0eC0+aGFzX2JfZnJhbWVzIDwgb3V0X29mX29yZGVyICYmICFoLT5zcHMuYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcpeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiSW5jcmVhc2luZyByZW9yZGVyIGJ1ZmZlciB0byAlZFxuIiwgb3V0X29mX29yZGVyKTsKKyAgICAgICAgaC0+YXZjdHgtPmhhc19iX2ZyYW1lcyA9IG91dF9vZl9vcmRlcjsKKyAgICAgICAgaC0+bG93X2RlbGF5ID0gMDsKKyAgICB9CisKKyAgICBwaWNzID0gMDsKKyAgICB3aGlsZSAoaC0+ZGVsYXllZF9waWNbcGljc10pCisgICAgICAgIHBpY3MrKzsKKworICAgIGF2X2Fzc2VydDAocGljcyA8PSBNQVhfREVMQVlFRF9QSUNfQ09VTlQpOworCisgICAgaC0+ZGVsYXllZF9waWNbcGljcysrXSA9IGN1cjsKKyAgICBpZiAoY3VyLT5yZWZlcmVuY2UgPT0gMCkKKyAgICAgICAgY3VyLT5yZWZlcmVuY2UgPSBERUxBWUVEX1BJQ19SRUY7CisKKyAgICBvdXQgICAgID0gaC0+ZGVsYXllZF9waWNbMF07CisgICAgb3V0X2lkeCA9IDA7CisgICAgZm9yIChpID0gMTsgaC0+ZGVsYXllZF9waWNbaV0gJiYKKyAgICAgICAgICAgICAgICAhaC0+ZGVsYXllZF9waWNbaV0tPmYua2V5X2ZyYW1lICYmCisgICAgICAgICAgICAgICAgIWgtPmRlbGF5ZWRfcGljW2ldLT5tbWNvX3Jlc2V0OworICAgICAgICAgaSsrKQorICAgICAgICBpZiAoaC0+ZGVsYXllZF9waWNbaV0tPnBvYyA8IG91dC0+cG9jKSB7CisgICAgICAgICAgICBvdXQgICAgID0gaC0+ZGVsYXllZF9waWNbaV07CisgICAgICAgICAgICBvdXRfaWR4ID0gaTsKKyAgICAgICAgfQorICAgIGlmIChoLT5hdmN0eC0+aGFzX2JfZnJhbWVzID09IDAgJiYKKyAgICAgICAgKGgtPmRlbGF5ZWRfcGljWzBdLT5mLmtleV9mcmFtZSB8fCBoLT5kZWxheWVkX3BpY1swXS0+bW1jb19yZXNldCkpCisgICAgICAgIGgtPm5leHRfb3V0cHV0ZWRfcG9jID0gSU5UX01JTjsKKyAgICBvdXRfb2Zfb3JkZXIgPSBvdXQtPnBvYyA8IGgtPm5leHRfb3V0cHV0ZWRfcG9jOworCisgICAgaWYgKG91dF9vZl9vcmRlciB8fCBwaWNzID4gaC0+YXZjdHgtPmhhc19iX2ZyYW1lcykgeworICAgICAgICBvdXQtPnJlZmVyZW5jZSAmPSB+REVMQVlFRF9QSUNfUkVGOworICAgICAgICAvLyBmb3IgZnJhbWUgdGhyZWFkaW5nLCB0aGUgb3duZXIgbXVzdCBiZSB0aGUgc2Vjb25kIGZpZWxkJ3MgdGhyZWFkIG9yCisgICAgICAgIC8vIGVsc2UgdGhlIGZpcnN0IHRocmVhZCBjYW4gcmVsZWFzZSB0aGUgcGljdHVyZSBhbmQgcmV1c2UgaXQgdW5zYWZlbHkKKyAgICAgICAgZm9yIChpID0gb3V0X2lkeDsgaC0+ZGVsYXllZF9waWNbaV07IGkrKykKKyAgICAgICAgICAgIGgtPmRlbGF5ZWRfcGljW2ldID0gaC0+ZGVsYXllZF9waWNbaSArIDFdOworICAgIH0KKyAgICBpZiAoIW91dF9vZl9vcmRlciAmJiBwaWNzID4gaC0+YXZjdHgtPmhhc19iX2ZyYW1lcykgeworICAgICAgICBoLT5uZXh0X291dHB1dF9waWMgPSBvdXQ7CisgICAgICAgIGlmIChvdXRfaWR4ID09IDAgJiYgaC0+ZGVsYXllZF9waWNbMF0gJiYgKGgtPmRlbGF5ZWRfcGljWzBdLT5mLmtleV9mcmFtZSB8fCBoLT5kZWxheWVkX3BpY1swXS0+bW1jb19yZXNldCkpIHsKKyAgICAgICAgICAgIGgtPm5leHRfb3V0cHV0ZWRfcG9jID0gSU5UX01JTjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBoLT5uZXh0X291dHB1dGVkX3BvYyA9IG91dC0+cG9jOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAibm8gcGljdHVyZSAlc1xuIiwgb3V0X29mX29yZGVyID8gIm9vbyIgOiAiIik7CisgICAgfQorCisgICAgaWYgKGgtPm5leHRfb3V0cHV0X3BpYykgeworICAgICAgICBpZiAoaC0+bmV4dF9vdXRwdXRfcGljLT5yZWNvdmVyZWQpIHsKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgcmVhY2hlZCBhbiByZWNvdmVyeSBwb2ludCBhbmQgYWxsIGZyYW1lcyBhZnRlciBpdCBpbgorICAgICAgICAgICAgLy8gZGlzcGxheSBvcmRlciBhcmUgInJlY292ZXJlZCIuCisgICAgICAgICAgICBoLT5mcmFtZV9yZWNvdmVyZWQgfD0gRlJBTUVfUkVDT1ZFUkVEX1NFSTsKKyAgICAgICAgfQorICAgICAgICBoLT5uZXh0X291dHB1dF9waWMtPnJlY292ZXJlZCB8PSAhIShoLT5mcmFtZV9yZWNvdmVyZWQgJiBGUkFNRV9SRUNPVkVSRURfU0VJKTsKKyAgICB9CisKKyAgICBpZiAoc2V0dXBfZmluaXNoZWQgJiYgIWgtPmF2Y3R4LT5od2FjY2VsKQorICAgICAgICBmZl90aHJlYWRfZmluaXNoX3NldHVwKGgtPmF2Y3R4KTsKK30KKworaW50IGZmX3ByZWRfd2VpZ2h0X3RhYmxlKEgyNjRDb250ZXh0ICpoKQoreworICAgIGludCBsaXN0LCBpOworICAgIGludCBsdW1hX2RlZiwgY2hyb21hX2RlZjsKKworICAgIGgtPnVzZV93ZWlnaHQgICAgICAgICAgICAgPSAwOworICAgIGgtPnVzZV93ZWlnaHRfY2hyb21hICAgICAgPSAwOworICAgIGgtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20gPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7CisgICAgaWYgKGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYykKKyAgICAgICAgaC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgIGx1bWFfZGVmICAgPSAxIDw8IGgtPmx1bWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgY2hyb21hX2RlZiA9IDEgPDwgaC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tOworCisgICAgZm9yIChsaXN0ID0gMDsgbGlzdCA8IDI7IGxpc3QrKykgeworICAgICAgICBoLT5sdW1hX3dlaWdodF9mbGFnW2xpc3RdICAgPSAwOworICAgICAgICBoLT5jaHJvbWFfd2VpZ2h0X2ZsYWdbbGlzdF0gPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaC0+cmVmX2NvdW50W2xpc3RdOyBpKyspIHsKKyAgICAgICAgICAgIGludCBsdW1hX3dlaWdodF9mbGFnLCBjaHJvbWFfd2VpZ2h0X2ZsYWc7CisKKyAgICAgICAgICAgIGx1bWFfd2VpZ2h0X2ZsYWcgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICAgICAgICAgIGlmIChsdW1hX3dlaWdodF9mbGFnKSB7CisgICAgICAgICAgICAgICAgaC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMF0gPSBnZXRfc2VfZ29sb21iKCZoLT5nYik7CisgICAgICAgICAgICAgICAgaC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMV0gPSBnZXRfc2VfZ29sb21iKCZoLT5nYik7CisgICAgICAgICAgICAgICAgaWYgKGgtPmx1bWFfd2VpZ2h0W2ldW2xpc3RdWzBdICE9IGx1bWFfZGVmIHx8CisgICAgICAgICAgICAgICAgICAgIGgtPmx1bWFfd2VpZ2h0W2ldW2xpc3RdWzFdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+dXNlX3dlaWdodCAgICAgICAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgICAgIGgtPmx1bWFfd2VpZ2h0X2ZsYWdbbGlzdF0gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMF0gPSBsdW1hX2RlZjsKKyAgICAgICAgICAgICAgICBoLT5sdW1hX3dlaWdodFtpXVtsaXN0XVsxXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMpIHsKKyAgICAgICAgICAgICAgICBjaHJvbWFfd2VpZ2h0X2ZsYWcgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hyb21hX3dlaWdodF9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoLT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW2pdWzBdID0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICAgICAgICAgICAgICAgICAgaC0+Y2hyb21hX3dlaWdodFtpXVtsaXN0XVtqXVsxXSA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoLT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW2pdWzBdICE9IGNocm9tYV9kZWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW2pdWzFdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT51c2Vfd2VpZ2h0X2Nocm9tYSAgICAgICAgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmNocm9tYV93ZWlnaHRfZmxhZ1tsaXN0XSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaC0+Y2hyb21hX3dlaWdodFtpXVtsaXN0XVtqXVswXSA9IGNocm9tYV9kZWY7CisgICAgICAgICAgICAgICAgICAgICAgICBoLT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW2pdWzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaC0+c2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaC0+dXNlX3dlaWdodCA9IGgtPnVzZV93ZWlnaHQgfHwgaC0+dXNlX3dlaWdodF9jaHJvbWE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW5zdGFudGFuZW91cyBkZWNvZGVyIHJlZnJlc2guCisgKi8KK3N0YXRpYyB2b2lkIGlkcihIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBpbnQgaTsKKyAgICBmZl9oMjY0X3JlbW92ZV9hbGxfcmVmcyhoKTsKKyAgICBoLT5wcmV2X2ZyYW1lX251bSAgICAgICAgPQorICAgIGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCA9IDA7CisgICAgaC0+cHJldl9wb2NfbXNiICAgICAgICAgID0gMTw8MTY7CisgICAgaC0+cHJldl9wb2NfbHNiICAgICAgICAgID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RFTEFZRURfUElDX0NPVU5UOyBpKyspCisgICAgICAgIGgtPmxhc3RfcG9jc1tpXSA9IElOVF9NSU47Cit9CisKKy8qIGZvcmdldCBvbGQgcGljcyBhZnRlciBhIHNlZWsgKi8KK3ZvaWQgZmZfaDI2NF9mbHVzaF9jaGFuZ2UoSDI2NENvbnRleHQgKmgpCit7CisgICAgaW50IGksIGo7CisKKyAgICBoLT5vdXRwdXRlZF9wb2MgICAgICAgICAgPSBoLT5uZXh0X291dHB1dGVkX3BvYyA9IElOVF9NSU47CisgICAgaC0+cHJldl9pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICBpZHIoaCk7CisKKyAgICBoLT5wcmV2X2ZyYW1lX251bSA9IC0xOworICAgIGlmIChoLT5jdXJfcGljX3B0cikgeworICAgICAgICBoLT5jdXJfcGljX3B0ci0+cmVmZXJlbmNlID0gMDsKKyAgICAgICAgZm9yIChqPWk9MDsgaC0+ZGVsYXllZF9waWNbaV07IGkrKykKKyAgICAgICAgICAgIGlmIChoLT5kZWxheWVkX3BpY1tpXSAhPSBoLT5jdXJfcGljX3B0cikKKyAgICAgICAgICAgICAgICBoLT5kZWxheWVkX3BpY1tqKytdID0gaC0+ZGVsYXllZF9waWNbaV07CisgICAgICAgIGgtPmRlbGF5ZWRfcGljW2pdID0gTlVMTDsKKyAgICB9CisgICAgaC0+Zmlyc3RfZmllbGQgPSAwOworICAgIG1lbXNldChoLT5yZWZfbGlzdFswXSwgMCwgc2l6ZW9mKGgtPnJlZl9saXN0WzBdKSk7CisgICAgbWVtc2V0KGgtPnJlZl9saXN0WzFdLCAwLCBzaXplb2YoaC0+cmVmX2xpc3RbMV0pKTsKKyAgICBtZW1zZXQoaC0+ZGVmYXVsdF9yZWZfbGlzdFswXSwgMCwgc2l6ZW9mKGgtPmRlZmF1bHRfcmVmX2xpc3RbMF0pKTsKKyAgICBtZW1zZXQoaC0+ZGVmYXVsdF9yZWZfbGlzdFsxXSwgMCwgc2l6ZW9mKGgtPmRlZmF1bHRfcmVmX2xpc3RbMV0pKTsKKyAgICBmZl9oMjY0X3Jlc2V0X3NlaShoKTsKKyAgICBoLT5yZWNvdmVyeV9mcmFtZSA9IC0xOworICAgIGgtPmZyYW1lX3JlY292ZXJlZCA9IDA7CisgICAgaC0+bGlzdF9jb3VudCA9IDA7CisgICAgaC0+Y3VycmVudF9zbGljZSA9IDA7CisgICAgaC0+bW1jb19yZXNldCA9IDE7Cit9CisKKy8qIGZvcmdldCBvbGQgcGljcyBhZnRlciBhIHNlZWsgKi8KK3N0YXRpYyB2b2lkIGZsdXNoX2RwYihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8PSBNQVhfREVMQVlFRF9QSUNfQ09VTlQ7IGkrKykgeworICAgICAgICBpZiAoaC0+ZGVsYXllZF9waWNbaV0pCisgICAgICAgICAgICBoLT5kZWxheWVkX3BpY1tpXS0+cmVmZXJlbmNlID0gMDsKKyAgICAgICAgaC0+ZGVsYXllZF9waWNbaV0gPSBOVUxMOworICAgIH0KKworICAgIGZmX2gyNjRfZmx1c2hfY2hhbmdlKGgpOworCisgICAgaWYgKGgtPkRQQikKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEgyNjRfTUFYX1BJQ1RVUkVfQ09VTlQ7IGkrKykKKyAgICAgICAgICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCAmaC0+RFBCW2ldKTsKKyAgICBoLT5jdXJfcGljX3B0ciA9IE5VTEw7CisgICAgZmZfaDI2NF91bnJlZl9waWN0dXJlKGgsICZoLT5jdXJfcGljKTsKKworICAgIGgtPm1iX3ggPSBoLT5tYl95ID0gMDsKKworICAgIGgtPnBhcnNlX2NvbnRleHQuc3RhdGUgICAgICAgICAgICAgPSAtMTsKKyAgICBoLT5wYXJzZV9jb250ZXh0LmZyYW1lX3N0YXJ0X2ZvdW5kID0gMDsKKyAgICBoLT5wYXJzZV9jb250ZXh0Lm92ZXJyZWFkICAgICAgICAgID0gMDsKKyAgICBoLT5wYXJzZV9jb250ZXh0Lm92ZXJyZWFkX2luZGV4ICAgID0gMDsKKyAgICBoLT5wYXJzZV9jb250ZXh0LmluZGV4ICAgICAgICAgICAgID0gMDsKKyAgICBoLT5wYXJzZV9jb250ZXh0Lmxhc3RfaW5kZXggICAgICAgID0gMDsKKworICAgIGZmX2gyNjRfZnJlZV90YWJsZXMoaCwgMSk7CisgICAgaC0+Y29udGV4dF9pbml0aWFsaXplZCA9IDA7Cit9CisKK2ludCBmZl9pbml0X3BvYyhIMjY0Q29udGV4dCAqaCwgaW50IHBpY19maWVsZF9wb2NbMl0sIGludCAqcGljX3BvYykKK3sKKyAgICBjb25zdCBpbnQgbWF4X2ZyYW1lX251bSA9IDEgPDwgaC0+c3BzLmxvZzJfbWF4X2ZyYW1lX251bTsKKyAgICBpbnQgZmllbGRfcG9jWzJdOworCisgICAgaC0+ZnJhbWVfbnVtX29mZnNldCA9IGgtPnByZXZfZnJhbWVfbnVtX29mZnNldDsKKyAgICBpZiAoaC0+ZnJhbWVfbnVtIDwgaC0+cHJldl9mcmFtZV9udW0pCisgICAgICAgIGgtPmZyYW1lX251bV9vZmZzZXQgKz0gbWF4X2ZyYW1lX251bTsKKworICAgIGlmIChoLT5zcHMucG9jX3R5cGUgPT0gMCkgeworICAgICAgICBjb25zdCBpbnQgbWF4X3BvY19sc2IgPSAxIDw8IGgtPnNwcy5sb2cyX21heF9wb2NfbHNiOworCisgICAgICAgIGlmIChoLT5wb2NfbHNiIDwgaC0+cHJldl9wb2NfbHNiICYmCisgICAgICAgICAgICBoLT5wcmV2X3BvY19sc2IgLSBoLT5wb2NfbHNiID49IG1heF9wb2NfbHNiIC8gMikKKyAgICAgICAgICAgIGgtPnBvY19tc2IgPSBoLT5wcmV2X3BvY19tc2IgKyBtYXhfcG9jX2xzYjsKKyAgICAgICAgZWxzZSBpZiAoaC0+cG9jX2xzYiA+IGgtPnByZXZfcG9jX2xzYiAmJgorICAgICAgICAgICAgICAgICBoLT5wcmV2X3BvY19sc2IgLSBoLT5wb2NfbHNiIDwgLW1heF9wb2NfbHNiIC8gMikKKyAgICAgICAgICAgIGgtPnBvY19tc2IgPSBoLT5wcmV2X3BvY19tc2IgLSBtYXhfcG9jX2xzYjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaC0+cG9jX21zYiA9IGgtPnByZXZfcG9jX21zYjsKKyAgICAgICAgZmllbGRfcG9jWzBdID0KKyAgICAgICAgZmllbGRfcG9jWzFdID0gaC0+cG9jX21zYiArIGgtPnBvY19sc2I7CisgICAgICAgIGlmIChoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKQorICAgICAgICAgICAgZmllbGRfcG9jWzFdICs9IGgtPmRlbHRhX3BvY19ib3R0b207CisgICAgfSBlbHNlIGlmIChoLT5zcHMucG9jX3R5cGUgPT0gMSkgeworICAgICAgICBpbnQgYWJzX2ZyYW1lX251bSwgZXhwZWN0ZWRfZGVsdGFfcGVyX3BvY19jeWNsZSwgZXhwZWN0ZWRwb2M7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmIChoLT5zcHMucG9jX2N5Y2xlX2xlbmd0aCAhPSAwKQorICAgICAgICAgICAgYWJzX2ZyYW1lX251bSA9IGgtPmZyYW1lX251bV9vZmZzZXQgKyBoLT5mcmFtZV9udW07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFic19mcmFtZV9udW0gPSAwOworCisgICAgICAgIGlmIChoLT5uYWxfcmVmX2lkYyA9PSAwICYmIGFic19mcmFtZV9udW0gPiAwKQorICAgICAgICAgICAgYWJzX2ZyYW1lX251bS0tOworCisgICAgICAgIGV4cGVjdGVkX2RlbHRhX3Blcl9wb2NfY3ljbGUgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaC0+c3BzLnBvY19jeWNsZV9sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIC8vIEZJWE1FIGludGVncmF0ZSBkdXJpbmcgc3BzIHBhcnNlCisgICAgICAgICAgICBleHBlY3RlZF9kZWx0YV9wZXJfcG9jX2N5Y2xlICs9IGgtPnNwcy5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXTsKKworICAgICAgICBpZiAoYWJzX2ZyYW1lX251bSA+IDApIHsKKyAgICAgICAgICAgIGludCBwb2NfY3ljbGVfY250ICAgICAgICAgID0gKGFic19mcmFtZV9udW0gLSAxKSAvIGgtPnNwcy5wb2NfY3ljbGVfbGVuZ3RoOworICAgICAgICAgICAgaW50IGZyYW1lX251bV9pbl9wb2NfY3ljbGUgPSAoYWJzX2ZyYW1lX251bSAtIDEpICUgaC0+c3BzLnBvY19jeWNsZV9sZW5ndGg7CisKKyAgICAgICAgICAgIGV4cGVjdGVkcG9jID0gcG9jX2N5Y2xlX2NudCAqIGV4cGVjdGVkX2RlbHRhX3Blcl9wb2NfY3ljbGU7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGZyYW1lX251bV9pbl9wb2NfY3ljbGU7IGkrKykKKyAgICAgICAgICAgICAgICBleHBlY3RlZHBvYyA9IGV4cGVjdGVkcG9jICsgaC0+c3BzLm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGV4cGVjdGVkcG9jID0gMDsKKworICAgICAgICBpZiAoaC0+bmFsX3JlZl9pZGMgPT0gMCkKKyAgICAgICAgICAgIGV4cGVjdGVkcG9jID0gZXhwZWN0ZWRwb2MgKyBoLT5zcHMub2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKKworICAgICAgICBmaWVsZF9wb2NbMF0gPSBleHBlY3RlZHBvYyArIGgtPmRlbHRhX3BvY1swXTsKKyAgICAgICAgZmllbGRfcG9jWzFdID0gZmllbGRfcG9jWzBdICsgaC0+c3BzLm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKKworICAgICAgICBpZiAoaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkKKyAgICAgICAgICAgIGZpZWxkX3BvY1sxXSArPSBoLT5kZWx0YV9wb2NbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHBvYyA9IDIgKiAoaC0+ZnJhbWVfbnVtX29mZnNldCArIGgtPmZyYW1lX251bSk7CisKKyAgICAgICAgaWYgKCFoLT5uYWxfcmVmX2lkYykKKyAgICAgICAgICAgIHBvYy0tOworCisgICAgICAgIGZpZWxkX3BvY1swXSA9IHBvYzsKKyAgICAgICAgZmllbGRfcG9jWzFdID0gcG9jOworICAgIH0KKworICAgIGlmIChoLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0JPVFRPTV9GSUVMRCkKKyAgICAgICAgcGljX2ZpZWxkX3BvY1swXSA9IGZpZWxkX3BvY1swXTsKKyAgICBpZiAoaC0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9UT1BfRklFTEQpCisgICAgICAgIHBpY19maWVsZF9wb2NbMV0gPSBmaWVsZF9wb2NbMV07CisgICAgKnBpY19wb2MgPSBGRk1JTihwaWNfZmllbGRfcG9jWzBdLCBwaWNfZmllbGRfcG9jWzFdKTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIENvbXB1dGUgcHJvZmlsZSBmcm9tIHByb2ZpbGVfaWRjIGFuZCBjb25zdHJhaW50X3NldD9fZmxhZ3MuCisgKgorICogQHBhcmFtIHNwcyBTUFMKKyAqCisgKiBAcmV0dXJuIHByb2ZpbGUgYXMgZGVmaW5lZCBieSBGRl9QUk9GSUxFX0gyNjRfKgorICovCitpbnQgZmZfaDI2NF9nZXRfcHJvZmlsZShTUFMgKnNwcykKK3sKKyAgICBpbnQgcHJvZmlsZSA9IHNwcy0+cHJvZmlsZV9pZGM7CisKKyAgICBzd2l0Y2ggKHNwcy0+cHJvZmlsZV9pZGMpIHsKKyAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9CQVNFTElORToKKyAgICAgICAgLy8gY29uc3RyYWludF9zZXQxX2ZsYWcgc2V0IHRvIDEKKyAgICAgICAgcHJvZmlsZSB8PSAoc3BzLT5jb25zdHJhaW50X3NldF9mbGFncyAmIDEgPDwgMSkgPyBGRl9QUk9GSUxFX0gyNjRfQ09OU1RSQUlORUQgOiAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzEwOgorICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDIyOgorICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDQ0X1BSRURJQ1RJVkU6CisgICAgICAgIC8vIGNvbnN0cmFpbnRfc2V0M19mbGFnIHNldCB0byAxCisgICAgICAgIHByb2ZpbGUgfD0gKHNwcy0+Y29uc3RyYWludF9zZXRfZmxhZ3MgJiAxIDw8IDMpID8gRkZfUFJPRklMRV9IMjY0X0lOVFJBIDogMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHByb2ZpbGU7Cit9CisKK2ludCBmZl9oMjY0X3NldF9wYXJhbWV0ZXJfZnJvbV9zcHMoSDI2NENvbnRleHQgKmgpCit7CisgICAgaWYgKGgtPmZsYWdzICYgQ09ERUNfRkxBR19MT1dfREVMQVkgfHwKKyAgICAgICAgKGgtPnNwcy5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyAmJgorICAgICAgICAgIWgtPnNwcy5udW1fcmVvcmRlcl9mcmFtZXMpKSB7CisgICAgICAgIGlmIChoLT5hdmN0eC0+aGFzX2JfZnJhbWVzID4gMSB8fCBoLT5kZWxheWVkX3BpY1swXSkKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJEZWxheWVkIGZyYW1lcyBzZWVuLiAiCisgICAgICAgICAgICAgICAgICAgIlJlZW5hYmxpbmcgbG93IGRlbGF5IHJlcXVpcmVzIGEgY29kZWMgZmx1c2guXG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaC0+bG93X2RlbGF5ID0gMTsKKyAgICB9CisKKyAgICBpZiAoaC0+YXZjdHgtPmhhc19iX2ZyYW1lcyA8IDIpCisgICAgICAgIGgtPmF2Y3R4LT5oYXNfYl9mcmFtZXMgPSAhaC0+bG93X2RlbGF5OworCisgICAgaWYgKGgtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICE9IGgtPnNwcy5iaXRfZGVwdGhfbHVtYSB8fAorICAgICAgICBoLT5jdXJfY2hyb21hX2Zvcm1hdF9pZGMgICAgICAhPSBoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMpIHsKKyAgICAgICAgaWYgKGgtPmF2Y3R4LT5jb2RlYyAmJgorICAgICAgICAgICAgaC0+YXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVSAmJgorICAgICAgICAgICAgKGgtPnNwcy5iaXRfZGVwdGhfbHVtYSAhPSA4IHx8IGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA+IDEpKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVkRQQVUgZGVjb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjb2xvcnNwYWNlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaC0+c3BzLmJpdF9kZXB0aF9sdW1hID49IDggJiYgaC0+c3BzLmJpdF9kZXB0aF9sdW1hIDw9IDE0ICYmCisgICAgICAgICAgICBoLT5zcHMuYml0X2RlcHRoX2x1bWEgIT0gMTEgJiYgaC0+c3BzLmJpdF9kZXB0aF9sdW1hICE9IDEzKSB7CisgICAgICAgICAgICBoLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IGgtPnNwcy5iaXRfZGVwdGhfbHVtYTsKKyAgICAgICAgICAgIGgtPmN1cl9jaHJvbWFfZm9ybWF0X2lkYyAgICAgID0gaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjOworICAgICAgICAgICAgaC0+cGl4ZWxfc2hpZnQgICAgICAgICAgICAgICAgPSBoLT5zcHMuYml0X2RlcHRoX2x1bWEgPiA4OworCisgICAgICAgICAgICBmZl9oMjY0ZHNwX2luaXQoJmgtPmgyNjRkc3AsIGgtPnNwcy5iaXRfZGVwdGhfbHVtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMpOworICAgICAgICAgICAgZmZfaDI2NGNocm9tYV9pbml0KCZoLT5oMjY0Y2hyb21hLCBoLT5zcHMuYml0X2RlcHRoX2Nocm9tYSk7CisgICAgICAgICAgICBmZl9oMjY0cXBlbF9pbml0KCZoLT5oMjY0cXBlbCwgaC0+c3BzLmJpdF9kZXB0aF9sdW1hKTsKKyAgICAgICAgICAgIGZmX2gyNjRfcHJlZF9pbml0KCZoLT5ocGMsIGgtPmF2Y3R4LT5jb2RlY19pZCwgaC0+c3BzLmJpdF9kZXB0aF9sdW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjKTsKKworICAgICAgICAgICAgaWYgKENPTkZJR19FUlJPUl9SRVNJTElFTkNFKQorICAgICAgICAgICAgICAgIGZmX21lX2NtcF9pbml0KCZoLT5tZWNjLCBoLT5hdmN0eCk7CisgICAgICAgICAgICBmZl92aWRlb2RzcF9pbml0KCZoLT52ZHNwLCBoLT5zcHMuYml0X2RlcHRoX2x1bWEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBiaXQgZGVwdGggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgaC0+c3BzLmJpdF9kZXB0aF9sdW1hKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgZmZfc2V0X3JlZl9jb3VudChIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBpbnQgcmVmX2NvdW50WzJdLCBsaXN0X2NvdW50OworICAgIGludCBudW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZzsKKworICAgIC8vIHNldCBkZWZhdWx0cywgbWlnaHQgYmUgb3ZlcnJpZGRlbiBhIGZldyBsaW5lcyBsYXRlcgorICAgIHJlZl9jb3VudFswXSA9IGgtPnBwcy5yZWZfY291bnRbMF07CisgICAgcmVmX2NvdW50WzFdID0gaC0+cHBzLnJlZl9jb3VudFsxXTsKKworICAgIGlmIChoLT5zbGljZV90eXBlX25vcyAhPSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICB1bnNpZ25lZCBtYXhbMl07CisgICAgICAgIG1heFswXSA9IG1heFsxXSA9IGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUgPyAxNSA6IDMxOworCisgICAgICAgIGlmIChoLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgICAgIGgtPmRpcmVjdF9zcGF0aWFsX212X3ByZWQgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICAgICAgbnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcgPSBnZXRfYml0czEoJmgtPmdiKTsKKworICAgICAgICBpZiAobnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcpIHsKKyAgICAgICAgICAgIHJlZl9jb3VudFswXSA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKSArIDE7CisgICAgICAgICAgICBpZiAoaC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgICAgICByZWZfY291bnRbMV0gPSBnZXRfdWVfZ29sb21iKCZoLT5nYikgKyAxOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgLy8gZnVsbCByYW5nZSBpcyBzcGVjLW9rIGluIHRoaXMgY2FzZSwgZXZlbiBmb3IgZnJhbWVzCisgICAgICAgICAgICAgICAgcmVmX2NvdW50WzFdID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWZfY291bnRbMF0tMSA+IG1heFswXSB8fCByZWZfY291bnRbMV0tMSA+IG1heFsxXSl7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJlZmVyZW5jZSBvdmVyZmxvdyAldSA+ICV1IG9yICV1ID4gJXVcbiIsIHJlZl9jb3VudFswXS0xLCBtYXhbMF0sIHJlZl9jb3VudFsxXS0xLCBtYXhbMV0pOworICAgICAgICAgICAgaC0+cmVmX2NvdW50WzBdID0gaC0+cmVmX2NvdW50WzFdID0gMDsKKyAgICAgICAgICAgIGgtPmxpc3RfY291bnQgICA9IDA7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgICAgIGxpc3RfY291bnQgPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaXN0X2NvdW50ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBsaXN0X2NvdW50ICAgPSAwOworICAgICAgICByZWZfY291bnRbMF0gPSByZWZfY291bnRbMV0gPSAwOworICAgIH0KKworICAgIGlmIChsaXN0X2NvdW50ICE9IGgtPmxpc3RfY291bnQgfHwKKyAgICAgICAgcmVmX2NvdW50WzBdICE9IGgtPnJlZl9jb3VudFswXSB8fAorICAgICAgICByZWZfY291bnRbMV0gIT0gaC0+cmVmX2NvdW50WzFdKSB7CisgICAgICAgIGgtPnJlZl9jb3VudFswXSA9IHJlZl9jb3VudFswXTsKKyAgICAgICAgaC0+cmVmX2NvdW50WzFdID0gcmVmX2NvdW50WzFdOworICAgICAgICBoLT5saXN0X2NvdW50ICAgPSBsaXN0X2NvdW50OworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3RhcnRfY29kZVtdID0geyAweDAwLCAweDAwLCAweDAxIH07CisKK3N0YXRpYyBpbnQgZ2V0X2JpdF9sZW5ndGgoSDI2NENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyLCBpbnQgZHN0X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBuZXh0X2F2YykKK3sKKyAgICBpZiAoKGgtPndvcmthcm91bmRfYnVncyAmIEZGX0JVR19BVVRPREVURUNUKSAmJiBpICsgMyA8IG5leHRfYXZjICYmCisgICAgICAgIGJ1ZltpXSAgICAgPT0gMHgwMCAmJiBidWZbaSArIDFdID09IDB4MDAgJiYKKyAgICAgICAgYnVmW2kgKyAyXSA9PSAweDAxICYmIGJ1ZltpICsgM10gPT0gMHhFMCkKKyAgICAgICAgaC0+d29ya2Fyb3VuZF9idWdzIHw9IEZGX0JVR19UUlVOQ0FURUQ7CisKKyAgICBpZiAoIShoLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfVFJVTkNBVEVEKSkKKyAgICAgICAgd2hpbGUgKGRzdF9sZW5ndGggPiAwICYmIHB0cltkc3RfbGVuZ3RoIC0gMV0gPT0gMCkKKyAgICAgICAgICAgIGRzdF9sZW5ndGgtLTsKKworICAgIGlmICghZHN0X2xlbmd0aCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gOCAqIGRzdF9sZW5ndGggLSBkZWNvZGVfcmJzcF90cmFpbGluZyhoLCBwdHIgKyBkc3RfbGVuZ3RoIC0gMSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2xhc3RfbmVlZGVkX25hbChIMjY0Q29udGV4dCAqaCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgaW50IG5leHRfYXZjICAgID0gaC0+aXNfYXZjID8gMCA6IGJ1Zl9zaXplOworICAgIGludCBuYWxfaW5kZXggICA9IDA7CisgICAgaW50IGJ1Zl9pbmRleCAgID0gMDsKKyAgICBpbnQgbmFsc19uZWVkZWQgPSAwOworICAgIGludCBmaXJzdF9zbGljZSA9IDA7CisKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIGludCBuYWxzaXplID0gMDsKKyAgICAgICAgaW50IGRzdF9sZW5ndGgsIGJpdF9sZW5ndGgsIGNvbnN1bWVkOworICAgICAgICBjb25zdCB1aW50OF90ICpwdHI7CisKKyAgICAgICAgaWYgKGJ1Zl9pbmRleCA+PSBuZXh0X2F2YykgeworICAgICAgICAgICAgbmFsc2l6ZSA9IGdldF9hdmNfbmFsc2l6ZShoLCBidWYsIGJ1Zl9zaXplLCAmYnVmX2luZGV4KTsKKyAgICAgICAgICAgIGlmIChuYWxzaXplIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG5leHRfYXZjID0gYnVmX2luZGV4ICsgbmFsc2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1Zl9pbmRleCA9IGZpbmRfc3RhcnRfY29kZShidWYsIGJ1Zl9zaXplLCBidWZfaW5kZXgsIG5leHRfYXZjKTsKKyAgICAgICAgICAgIGlmIChidWZfaW5kZXggPj0gYnVmX3NpemUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoYnVmX2luZGV4ID49IG5leHRfYXZjKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcHRyID0gZmZfaDI2NF9kZWNvZGVfbmFsKGgsIGJ1ZiArIGJ1Zl9pbmRleCwgJmRzdF9sZW5ndGgsICZjb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfYXZjIC0gYnVmX2luZGV4KTsKKworICAgICAgICBpZiAoIXB0ciB8fCBkc3RfbGVuZ3RoIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGJ1Zl9pbmRleCArPSBjb25zdW1lZDsKKworICAgICAgICBiaXRfbGVuZ3RoID0gZ2V0X2JpdF9sZW5ndGgoaCwgYnVmLCBwdHIsIGRzdF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfaW5kZXgsIG5leHRfYXZjKTsKKyAgICAgICAgbmFsX2luZGV4Kys7CisKKyAgICAgICAgLyogcGFja2V0cyBjYW4gc29tZXRpbWVzIGNvbnRhaW4gbXVsdGlwbGUgUFBTL1NQUywKKyAgICAgICAgICogZS5nLiB0d28gUEFGRiBmaWVsZCBwaWN0dXJlcyBpbiBvbmUgcGFja2V0LCBvciBhIGRlbXV4ZXIKKyAgICAgICAgICogd2hpY2ggc3BsaXRzIE5BTHMgc3RyYW5nZWx5IGlmIHNvLCB3aGVuIGZyYW1lIHRocmVhZGluZyB3ZQorICAgICAgICAgKiBjYW4ndCBzdGFydCB0aGUgbmV4dCB0aHJlYWQgdW50aWwgd2UndmUgcmVhZCBhbGwgb2YgdGhlbSAqLworICAgICAgICBzd2l0Y2ggKGgtPm5hbF91bml0X3R5cGUpIHsKKyAgICAgICAgY2FzZSBOQUxfU1BTOgorICAgICAgICBjYXNlIE5BTF9QUFM6CisgICAgICAgICAgICBuYWxzX25lZWRlZCA9IG5hbF9pbmRleDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5BTF9EUEE6CisgICAgICAgIGNhc2UgTkFMX0lEUl9TTElDRToKKyAgICAgICAgY2FzZSBOQUxfU0xJQ0U6CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZoLT5nYiwgcHRyLCBiaXRfbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICghZ2V0X3VlX2dvbG9tYigmaC0+Z2IpIHx8CisgICAgICAgICAgICAgICAgIWZpcnN0X3NsaWNlIHx8CisgICAgICAgICAgICAgICAgZmlyc3Rfc2xpY2UgIT0gaC0+bmFsX3VuaXRfdHlwZSkKKyAgICAgICAgICAgICAgICBuYWxzX25lZWRlZCA9IG5hbF9pbmRleDsKKyAgICAgICAgICAgIGlmICghZmlyc3Rfc2xpY2UpCisgICAgICAgICAgICAgICAgZmlyc3Rfc2xpY2UgPSBoLT5uYWxfdW5pdF90eXBlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5hbHNfbmVlZGVkOworfQorCitzdGF0aWMgaW50IGRlY29kZV9uYWxfdW5pdHMoSDI2NENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJzZV9leHRyYWRhdGEpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvbnN0IGF2Y3R4ID0gaC0+YXZjdHg7CisgICAgSDI2NENvbnRleHQgKmh4OyAvLy88IHRocmVhZCBjb250ZXh0CisgICAgaW50IGJ1Zl9pbmRleDsKKyAgICB1bnNpZ25lZCBjb250ZXh0X2NvdW50OworICAgIGludCBuZXh0X2F2YzsKKyAgICBpbnQgbmFsc19uZWVkZWQgPSAwOyAvLy88IG51bWJlciBvZiBOQUxzIHRoYXQgbmVlZCBkZWNvZGluZyBiZWZvcmUgdGhlIG5leHQgZnJhbWUgdGhyZWFkIHN0YXJ0cworICAgIGludCBuYWxfaW5kZXg7CisgICAgaW50IGlkcl9jbGVhcmVkPTA7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBoLT5uYWxfdW5pdF90eXBlPSAwOworCisgICAgaWYoIWgtPnNsaWNlX2NvbnRleHRfY291bnQpCisgICAgICAgICBoLT5zbGljZV9jb250ZXh0X2NvdW50PSAxOworICAgIGgtPm1heF9jb250ZXh0cyA9IGgtPnNsaWNlX2NvbnRleHRfY291bnQ7CisgICAgaWYgKCEoYXZjdHgtPmZsYWdzMiAmIENPREVDX0ZMQUcyX0NIVU5LUykpIHsKKyAgICAgICAgaC0+Y3VycmVudF9zbGljZSA9IDA7CisgICAgICAgIGlmICghaC0+Zmlyc3RfZmllbGQpCisgICAgICAgICAgICBoLT5jdXJfcGljX3B0ciA9IE5VTEw7CisgICAgICAgIGZmX2gyNjRfcmVzZXRfc2VpKGgpOworICAgIH0KKworICAgIGlmIChoLT5uYWxfbGVuZ3RoX3NpemUgPT0gNCkgeworICAgICAgICBpZiAoYnVmX3NpemUgPiA4ICYmIEFWX1JCMzIoYnVmKSA9PSAxICYmIEFWX1JCMzIoYnVmKzUpID4gKHVuc2lnbmVkKWJ1Zl9zaXplKSB7CisgICAgICAgICAgICBoLT5pc19hdmMgPSAwOworICAgICAgICB9ZWxzZSBpZihidWZfc2l6ZSA+IDMgJiYgQVZfUkIzMihidWYpID4gMSAmJiBBVl9SQjMyKGJ1ZikgPD0gKHVuc2lnbmVkKWJ1Zl9zaXplKQorICAgICAgICAgICAgaC0+aXNfYXZjID0gMTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkKKyAgICAgICAgbmFsc19uZWVkZWQgPSBnZXRfbGFzdF9uZWVkZWRfbmFsKGgsIGJ1ZiwgYnVmX3NpemUpOworCisgICAgeworICAgICAgICBidWZfaW5kZXggICAgID0gMDsKKyAgICAgICAgY29udGV4dF9jb3VudCA9IDA7CisgICAgICAgIG5leHRfYXZjICAgICAgPSBoLT5pc19hdmMgPyAwIDogYnVmX3NpemU7CisgICAgICAgIG5hbF9pbmRleCAgICAgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBpbnQgY29uc3VtZWQ7CisgICAgICAgICAgICBpbnQgZHN0X2xlbmd0aDsKKyAgICAgICAgICAgIGludCBiaXRfbGVuZ3RoOworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyOworICAgICAgICAgICAgaW50IG5hbHNpemUgPSAwOworICAgICAgICAgICAgaW50IGVycjsKKworICAgICAgICAgICAgaWYgKGJ1Zl9pbmRleCA+PSBuZXh0X2F2YykgeworICAgICAgICAgICAgICAgIG5hbHNpemUgPSBnZXRfYXZjX25hbHNpemUoaCwgYnVmLCBidWZfc2l6ZSwgJmJ1Zl9pbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbHNpemUgPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBuZXh0X2F2YyA9IGJ1Zl9pbmRleCArIG5hbHNpemU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zl9pbmRleCA9IGZpbmRfc3RhcnRfY29kZShidWYsIGJ1Zl9zaXplLCBidWZfaW5kZXgsIG5leHRfYXZjKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmX2luZGV4ID49IGJ1Zl9zaXplKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoYnVmX2luZGV4ID49IG5leHRfYXZjKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHggPSBoLT50aHJlYWRfY29udGV4dFtjb250ZXh0X2NvdW50XTsKKworICAgICAgICAgICAgcHRyID0gZmZfaDI2NF9kZWNvZGVfbmFsKGh4LCBidWYgKyBidWZfaW5kZXgsICZkc3RfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25zdW1lZCwgbmV4dF9hdmMgLSBidWZfaW5kZXgpOworICAgICAgICAgICAgaWYgKCFwdHIgfHwgZHN0X2xlbmd0aCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYml0X2xlbmd0aCA9IGdldF9iaXRfbGVuZ3RoKGgsIGJ1ZiwgcHRyLCBkc3RfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmRleCArIGNvbnN1bWVkLCBuZXh0X2F2Yyk7CisKKyAgICAgICAgICAgIGlmIChoLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19TVEFSVENPREUpCisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICJOQUwgJWQvJWQgYXQgJWQvJWQgbGVuZ3RoICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBoeC0+bmFsX3VuaXRfdHlwZSwgaHgtPm5hbF9yZWZfaWRjLCBidWZfaW5kZXgsIGJ1Zl9zaXplLCBkc3RfbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGgtPmlzX2F2YyAmJiAobmFsc2l6ZSAhPSBjb25zdW1lZCkgJiYgbmFsc2l6ZSkKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgIkFWQzogQ29uc3VtZWQgb25seSAlZCBieXRlcyBpbnN0ZWFkIG9mICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lZCwgbmFsc2l6ZSk7CisKKyAgICAgICAgICAgIGJ1Zl9pbmRleCArPSBjb25zdW1lZDsKKyAgICAgICAgICAgIG5hbF9pbmRleCsrOworCisgICAgICAgICAgICBpZiAoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiAmJgorICAgICAgICAgICAgICAgIGgtPm5hbF9yZWZfaWRjID09IDAgJiYKKyAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9TRUkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKK2FnYWluOgorICAgICAgICAgICAgaWYgKCAgICEoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkKKyAgICAgICAgICAgICAgICB8fCBuYWxzX25lZWRlZCA+PSBuYWxfaW5kZXgpCisgICAgICAgICAgICAgICAgaC0+YXVfcHBzX2lkID0gLTE7CisgICAgICAgICAgICAvKiBJZ25vcmUgcGVyIGZyYW1lIE5BTCB1bml0IHR5cGUgZHVyaW5nIGV4dHJhZGF0YQorICAgICAgICAgICAgICogcGFyc2luZy4gRGVjb2Rpbmcgc2xpY2VzIGlzIG5vdCBwb3NzaWJsZSBpbiBjb2RlYyBpbml0CisgICAgICAgICAgICAgKiB3aXRoIGZyYW1lLW10ICovCisgICAgICAgICAgICBpZiAocGFyc2VfZXh0cmFkYXRhKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChoeC0+bmFsX3VuaXRfdHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgTkFMX0lEUl9TTElDRToKKyAgICAgICAgICAgICAgICBjYXNlIE5BTF9TTElDRToKKyAgICAgICAgICAgICAgICBjYXNlIE5BTF9EUEE6CisgICAgICAgICAgICAgICAgY2FzZSBOQUxfRFBCOgorICAgICAgICAgICAgICAgIGNhc2UgTkFMX0RQQzoKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyBOQUwgJWQgaW4gZ2xvYmFsIGhlYWRlci9leHRyYWRhdGFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoeC0+bmFsX3VuaXRfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBuZXh0IGNhc2UKKyAgICAgICAgICAgICAgICBjYXNlIE5BTF9BVVhJTElBUllfU0xJQ0U6CisgICAgICAgICAgICAgICAgICAgIGh4LT5uYWxfdW5pdF90eXBlID0gTkFMX0ZGX0lHTk9SRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVyciA9IDA7CisKKyAgICAgICAgICAgIHN3aXRjaCAoaHgtPm5hbF91bml0X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTkFMX0lEUl9TTElDRToKKyAgICAgICAgICAgICAgICBpZiAoKHB0clswXSAmIDB4RkMpID09IDB4OTgpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGludGVyIElEUiBmcmFtZVxuIik7CisgICAgICAgICAgICAgICAgICAgIGgtPm5leHRfb3V0cHV0ZWRfcG9jID0gSU5UX01JTjsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaC0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfSURSX1NMSUNFKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbWl4IG9mIGlkciBhbmQgbm9uLWlkciBzbGljZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCFpZHJfY2xlYXJlZCkKKyAgICAgICAgICAgICAgICAgICAgaWRyKGgpOyAvLyBGSVhNRSBlbnN1cmUgd2UgZG9uJ3QgbG9zZSBzb21lIGZyYW1lcyBpZiB0aGVyZSBpcyByZW9yZGVyaW5nCisgICAgICAgICAgICAgICAgaWRyX2NsZWFyZWQgPSAxOworICAgICAgICAgICAgICAgIGgtPmhhc19yZWNvdmVyeV9wb2ludCA9IDE7CisgICAgICAgICAgICBjYXNlIE5BTF9TTElDRToKKyAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZoeC0+Z2IsIHB0ciwgYml0X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgaHgtPmludHJhX2diX3B0ciAgICAgID0KKyAgICAgICAgICAgICAgICBoeC0+aW50ZXJfZ2JfcHRyICAgICAgPSAmaHgtPmdiOworICAgICAgICAgICAgICAgIGh4LT5kYXRhX3BhcnRpdGlvbmluZyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoKGVyciA9IGZmX2gyNjRfZGVjb2RlX3NsaWNlX2hlYWRlcihoeCwgaCkpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGlmIChoLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGgtPmZyYW1lX251bSAhPSBoLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250IHx8IGh4LT5zbGljZV90eXBlX25vcyAhPSBBVl9QSUNUVVJFX1RZUEVfSSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPnZhbGlkX3JlY292ZXJ5X3BvaW50ID0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICAgaC0+cmVjb3ZlcnlfZnJhbWUgPCAwCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGgtPnJlY292ZXJ5X2ZyYW1lIC0gaC0+ZnJhbWVfbnVtKSAmICgoMSA8PCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtKS0xKSkgPiBoLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoLT5yZWNvdmVyeV9mcmFtZSA9IChoLT5mcmFtZV9udW0gKyBoLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250KSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMSA8PCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtKSAtIDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWgtPnZhbGlkX3JlY292ZXJ5X3BvaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnJlY292ZXJ5X2ZyYW1lID0gaC0+ZnJhbWVfbnVtOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPmYua2V5X2ZyYW1lIHw9CisgICAgICAgICAgICAgICAgICAgIChoeC0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfSURSX1NMSUNFKTsKKworICAgICAgICAgICAgICAgIGlmIChoeC0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfSURSX1NMSUNFIHx8CisgICAgICAgICAgICAgICAgICAgIGgtPnJlY292ZXJ5X2ZyYW1lID09IGgtPmZyYW1lX251bSkgeworICAgICAgICAgICAgICAgICAgICBoLT5yZWNvdmVyeV9mcmFtZSAgICAgICAgID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGgtPmN1cl9waWNfcHRyLT5yZWNvdmVyZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIElEUiwgYWxsIGZyYW1lcyBhZnRlciBpdCBpbiBkZWNvZGVkIG9yZGVyIGFyZQorICAgICAgICAgICAgICAgIC8vICJyZWNvdmVyZWQiLgorICAgICAgICAgICAgICAgIGlmIChoeC0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfSURSX1NMSUNFKQorICAgICAgICAgICAgICAgICAgICBoLT5mcmFtZV9yZWNvdmVyZWQgfD0gRlJBTUVfUkVDT1ZFUkVEX0lEUjsKKyAgICAgICAgICAgICAgICBoLT5mcmFtZV9yZWNvdmVyZWQgfD0gMyohIShhdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfU0hPV19BTEwpOworICAgICAgICAgICAgICAgIGgtPmZyYW1lX3JlY292ZXJlZCB8PSAzKiEhKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfT1VUUFVUX0NPUlJVUFQpOworI2lmIDEKKyAgICAgICAgICAgICAgICBoLT5jdXJfcGljX3B0ci0+cmVjb3ZlcmVkIHw9IGgtPmZyYW1lX3JlY292ZXJlZDsKKyNlbHNlCisgICAgICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPnJlY292ZXJlZCB8PSAhIShoLT5mcmFtZV9yZWNvdmVyZWQgJiBGUkFNRV9SRUNPVkVSRURfSURSKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgaWYgKGgtPmN1cnJlbnRfc2xpY2UgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIShhdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfQ0hVTktTKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9wb3N0aW5pdChoLCBuYWxfaW5kZXggPj0gbmFsc19uZWVkZWQpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChoLT5hdmN0eC0+aHdhY2NlbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHJldCA9IGgtPmF2Y3R4LT5od2FjY2VsLT5zdGFydF9mcmFtZShoLT5hdmN0eCwgTlVMTCwgMCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChDT05GSUdfSDI2NF9WRFBBVV9ERUNPREVSICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoLT5hdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIENPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVKQorICAgICAgICAgICAgICAgICAgICAgICAgZmZfdmRwYXVfaDI2NF9waWN0dXJlX3N0YXJ0KGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChoeC0+cmVkdW5kYW50X3BpY19jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+aHdhY2NlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZjdHgtPmh3YWNjZWwtPmRlY29kZV9zbGljZShhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZltidWZfaW5kZXggLSBjb25zdW1lZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ09ORklHX0gyNjRfVkRQQVVfREVDT0RFUiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX3ZkcGF1X2FkZF9kYXRhX2NodW5rKGgtPmN1cl9waWNfcHRyLT5mLmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0YXJ0X2NvZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX3ZkcGF1X2FkZF9kYXRhX2NodW5rKGgtPmN1cl9waWNfcHRyLT5mLmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmW2J1Zl9pbmRleCAtIGNvbnN1bWVkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2NvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOQUxfRFBBOgorICAgICAgICAgICAgICAgIGlmIChoLT5hdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHMl9DSFVOS1MpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVjb2RpbmcgaW4gY2h1bmtzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0aXRpb25lZCBzbGljZXMuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZoeC0+Z2IsIHB0ciwgYml0X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgaHgtPmludHJhX2diX3B0ciA9CisgICAgICAgICAgICAgICAgaHgtPmludGVyX2diX3B0ciA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBpZiAoKGVyciA9IGZmX2gyNjRfZGVjb2RlX3NsaWNlX2hlYWRlcihoeCwgaCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBkYXRhX3BhcnRpdGlvbmluZyBpcyBjbGVhcmVkIGlmIGl0IHdhcyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICogYmVmb3JlLCBzbyB3ZSBkb24ndCB0cnkgZGVjb2RpbmcgYSBzbGljZSB3aXRob3V0IGEgdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICogc2xpY2UgaGVhZGVyIGxhdGVyICovCisgICAgICAgICAgICAgICAgICAgIGgtPmRhdGFfcGFydGl0aW9uaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaHgtPmRhdGFfcGFydGl0aW9uaW5nID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkFMX0RQQjoKKyAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZoeC0+aW50cmFfZ2IsIHB0ciwgYml0X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgaHgtPmludHJhX2diX3B0ciA9ICZoeC0+aW50cmFfZ2I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5BTF9EUEM6CisgICAgICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmaHgtPmludGVyX2diLCBwdHIsIGJpdF9sZW5ndGgpOworICAgICAgICAgICAgICAgIGh4LT5pbnRlcl9nYl9wdHIgPSAmaHgtPmludGVyX2diOworCisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYXJ0aXRpb25lZCBILjI2NCBzdXBwb3J0IGlzIGluY29tcGxldGVcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgaWYgKGh4LT5yZWR1bmRhbnRfcGljX2NvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgaHgtPmludHJhX2diX3B0ciAmJgorICAgICAgICAgICAgICAgICAgICBoeC0+ZGF0YV9wYXJ0aXRpb25pbmcgJiYKKyAgICAgICAgICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHIgJiYgaC0+Y29udGV4dF9pbml0aWFsaXplZCAmJgorICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPnNraXBfZnJhbWUgPCBBVkRJU0NBUkRfTk9OUkVGIHx8IGh4LT5uYWxfcmVmX2lkYykgJiYKKyAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5za2lwX2ZyYW1lIDwgQVZESVNDQVJEX0JJRElSICB8fAorICAgICAgICAgICAgICAgICAgICAgaHgtPnNsaWNlX3R5cGVfbm9zICE9IEFWX1BJQ1RVUkVfVFlQRV9CKSAmJgorICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPnNraXBfZnJhbWUgPCBBVkRJU0NBUkRfTk9OSU5UUkEgfHwKKyAgICAgICAgICAgICAgICAgICAgIGh4LT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgJiYKKyAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNraXBfZnJhbWUgPCBBVkRJU0NBUkRfQUxMKQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2NvdW50Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5BTF9TRUk6CisgICAgICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmaC0+Z2IsIHB0ciwgYml0X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfaDI2NF9kZWNvZGVfc2VpKGgpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwICYmIChoLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOQUxfU1BTOgorICAgICAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmgtPmdiLCBwdHIsIGJpdF9sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChmZl9oMjY0X2RlY29kZV9zZXFfcGFyYW1ldGVyX3NldChoKSA8IDAgJiYgKGgtPmlzX2F2YyA/IG5hbHNpemUgOiAxKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTUFMgZGVjb2RpbmcgZmFpbHVyZSwgdHJ5aW5nIGFnYWluIHdpdGggdGhlIGNvbXBsZXRlIE5BTFxuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChoLT5pc19hdmMpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKG5leHRfYXZjIC0gYnVmX2luZGV4ICsgY29uc3VtZWQgPT0gbmFsc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgobmV4dF9hdmMgLSBidWZfaW5kZXggKyBjb25zdW1lZCAtIDEpID49IElOVF9NQVgvOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZoLT5nYiwgJmJ1ZltidWZfaW5kZXggKyAxIC0gY29uc3VtZWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgqKG5leHRfYXZjIC0gYnVmX2luZGV4ICsgY29uc3VtZWQgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIGZmX2gyNjRfZGVjb2RlX3NlcV9wYXJhbWV0ZXJfc2V0KGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOQUxfUFBTOgorICAgICAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmgtPmdiLCBwdHIsIGJpdF9sZW5ndGgpOworICAgICAgICAgICAgICAgIHJldCA9IGZmX2gyNjRfZGVjb2RlX3BpY3R1cmVfcGFyYW1ldGVyX3NldChoLCBiaXRfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCAmJiAoaC0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkFMX0FVRDoKKyAgICAgICAgICAgIGNhc2UgTkFMX0VORF9TRVFVRU5DRToKKyAgICAgICAgICAgIGNhc2UgTkFMX0VORF9TVFJFQU06CisgICAgICAgICAgICBjYXNlIE5BTF9GSUxMRVJfREFUQToKKyAgICAgICAgICAgIGNhc2UgTkFMX1NQU19FWFQ6CisgICAgICAgICAgICBjYXNlIE5BTF9BVVhJTElBUllfU0xJQ0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5BTF9GRl9JR05PUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVW5rbm93biBOQUwgY29kZTogJWQgKCVkIGJpdHMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBoeC0+bmFsX3VuaXRfdHlwZSwgYml0X2xlbmd0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb250ZXh0X2NvdW50ID09IGgtPm1heF9jb250ZXh0cykgeworICAgICAgICAgICAgICAgIHJldCA9IGZmX2gyNjRfZXhlY3V0ZV9kZWNvZGVfc2xpY2VzKGgsIGNvbnRleHRfY291bnQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwICYmIChoLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIGNvbnRleHRfY291bnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyIDwgMCB8fCBlcnIgPT0gU0xJQ0VfU0tJUEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlX3NsaWNlX2hlYWRlciBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgaC0+cmVmX2NvdW50WzBdID0gaC0+cmVmX2NvdW50WzFdID0gaC0+bGlzdF9jb3VudCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBTTElDRV9TSU5HTEVUSFJFQUQpIHsKKyAgICAgICAgICAgICAgICAvKiBTbGljZSBjb3VsZCBub3QgYmUgZGVjb2RlZCBpbiBwYXJhbGxlbCBtb2RlLCBjb3B5IGRvd24KKyAgICAgICAgICAgICAgICAgKiBOQUwgdW5pdCBzdHVmZiB0byBjb250ZXh0IDAgYW5kIHJlc3RhcnQuIE5vdGUgdGhhdAorICAgICAgICAgICAgICAgICAqIHJic3BfYnVmZmVyIGlzIG5vdCB0cmFuc2ZlcnJlZCwgYnV0IHNpbmNlIHdlIG5vIGxvbmdlcgorICAgICAgICAgICAgICAgICAqIHJ1biBpbiBwYXJhbGxlbCBtb2RlIHRoaXMgc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZS4gKi8KKyAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlID0gaHgtPm5hbF91bml0X3R5cGU7CisgICAgICAgICAgICAgICAgaC0+bmFsX3JlZl9pZGMgICA9IGh4LT5uYWxfcmVmX2lkYzsKKyAgICAgICAgICAgICAgICBoeCAgICAgICAgICAgICAgID0gaDsKKyAgICAgICAgICAgICAgICBnb3RvIGFnYWluOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChjb250ZXh0X2NvdW50KSB7CisgICAgICAgIHJldCA9IGZmX2gyNjRfZXhlY3V0ZV9kZWNvZGVfc2xpY2VzKGgsIGNvbnRleHRfY291bnQpOworICAgICAgICBpZiAocmV0IDwgMCAmJiAoaC0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgcmV0ID0gMDsKK2VuZDoKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIGlmIChoLT5jdXJfcGljX3B0ciAmJiAhaC0+ZHJvcHBhYmxlKSB7CisgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJmgtPmN1cl9waWNfcHRyLT50ZiwgSU5UX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0JPVFRPTV9GSUVMRCk7CisgICAgfQorCisgICAgcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IGJ1Zl9pbmRleDsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBmb3IgYnVpbGRpbmcgdGhlIGN1cnJlbnQgZnJhbWUuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2NvbnN1bWVkX2J5dGVzKGludCBwb3MsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpZiAocG9zID09IDApCisgICAgICAgIHBvcyA9IDE7ICAgICAgICAvLyBhdm9pZCBpbmZpbml0ZSBsb29wcyAoSSBkb3VidCB0aGF0IGlzIG5lZWRlZCBidXQuLi4pCisgICAgaWYgKHBvcyArIDEwID4gYnVmX3NpemUpCisgICAgICAgIHBvcyA9IGJ1Zl9zaXplOyAvLyBvb3BzIDspCisKKyAgICByZXR1cm4gcG9zOworfQorCitzdGF0aWMgaW50IG91dHB1dF9mcmFtZShIMjY0Q29udGV4dCAqaCwgQVZGcmFtZSAqZHN0LCBIMjY0UGljdHVyZSAqc3JjcCkKK3sKKyAgICBBVkZyYW1lICpzcmMgPSAmc3JjcC0+ZjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHNyYy0+Zm9ybWF0KTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0ID0gYXZfZnJhbWVfcmVmKGRzdCwgc3JjKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2X2RpY3Rfc2V0KCZkc3QtPm1ldGFkYXRhLCAic3RlcmVvX21vZGUiLCBmZl9oMjY0X3NlaV9zdGVyZW9fbW9kZShoKSwgMCk7CisKKyAgICBpZiAoc3JjcC0+c2VpX3JlY292ZXJ5X2ZyYW1lX2NudCA9PSAwKQorICAgICAgICBkc3QtPmtleV9mcmFtZSA9IDE7CisgICAgaWYgKCFzcmNwLT5jcm9wKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5uYl9jb21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgaW50IGhzaGlmdCA9IChpID4gMCkgPyBkZXNjLT5sb2cyX2Nocm9tYV93IDogMDsKKyAgICAgICAgaW50IHZzaGlmdCA9IChpID4gMCkgPyBkZXNjLT5sb2cyX2Nocm9tYV9oIDogMDsKKyAgICAgICAgaW50IG9mZiAgICA9ICgoc3JjcC0+Y3JvcF9sZWZ0ID4+IGhzaGlmdCkgPDwgaC0+cGl4ZWxfc2hpZnQpICsKKyAgICAgICAgICAgICAgICAgICAgICAoc3JjcC0+Y3JvcF90b3AgID4+IHZzaGlmdCkgKiBkc3QtPmxpbmVzaXplW2ldOworICAgICAgICBkc3QtPmRhdGFbaV0gKz0gb2ZmOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19leHRyYShjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgY250PSBidWZbNV0mMHgxZjsKKyAgICBjb25zdCB1aW50OF90ICpwPSBidWYrNjsKKyAgICB3aGlsZShjbnQtLSl7CisgICAgICAgIGludCBuYWxzaXplPSBBVl9SQjE2KHApICsgMjsKKyAgICAgICAgaWYobmFsc2l6ZSA+IGJ1Zl9zaXplIC0gKHAtYnVmKSB8fCBwWzJdIT0weDY3KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHAgKz0gbmFsc2l6ZTsKKyAgICB9CisgICAgY250ID0gKihwKyspOworICAgIGlmKCFjbnQpCisgICAgICAgIHJldHVybiAwOworICAgIHdoaWxlKGNudC0tKXsKKyAgICAgICAgaW50IG5hbHNpemU9IEFWX1JCMTYocCkgKyAyOworICAgICAgICBpZihuYWxzaXplID4gYnVmX3NpemUgLSAocC1idWYpIHx8IHBbMl0hPTB4NjgpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcCArPSBuYWxzaXplOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoMjY0X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgSDI2NENvbnRleHQgKmggICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpwaWN0ICAgICAgPSBkYXRhOworICAgIGludCBidWZfaW5kZXggICAgICA9IDA7CisgICAgSDI2NFBpY3R1cmUgKm91dDsKKyAgICBpbnQgaSwgb3V0X2lkeDsKKyAgICBpbnQgcmV0OworCisgICAgaC0+ZmxhZ3MgPSBhdmN0eC0+ZmxhZ3M7CisgICAgLyogcmVzZXQgZGF0YSBwYXJ0aXRpb25pbmcgaGVyZSwgdG8gZW5zdXJlIEdldEJpdENvbnRleHRzIGZyb20gcHJldmlvdXMKKyAgICAgKiBwYWNrZXRzIGRvIG5vdCBnZXQgdXNlZC4gKi8KKyAgICBoLT5kYXRhX3BhcnRpdGlvbmluZyA9IDA7CisKKyAgICAvKiBlbmQgb2Ygc3RyZWFtLCBvdXRwdXQgd2hhdCBpcyBzdGlsbCBpbiB0aGUgYnVmZmVycyAqLworICAgIGlmIChidWZfc2l6ZSA9PSAwKSB7Cisgb3V0OgorCisgICAgICAgIGgtPmN1cl9waWNfcHRyID0gTlVMTDsKKyAgICAgICAgaC0+Zmlyc3RfZmllbGQgPSAwOworCisgICAgICAgIC8vIEZJWE1FIGZhY3Rvcml6ZSB0aGlzIHdpdGggdGhlIG91dHB1dCBjb2RlIGJlbG93CisgICAgICAgIG91dCAgICAgPSBoLT5kZWxheWVkX3BpY1swXTsKKyAgICAgICAgb3V0X2lkeCA9IDA7CisgICAgICAgIGZvciAoaSA9IDE7CisgICAgICAgICAgICAgaC0+ZGVsYXllZF9waWNbaV0gJiYKKyAgICAgICAgICAgICAhaC0+ZGVsYXllZF9waWNbaV0tPmYua2V5X2ZyYW1lICYmCisgICAgICAgICAgICAgIWgtPmRlbGF5ZWRfcGljW2ldLT5tbWNvX3Jlc2V0OworICAgICAgICAgICAgIGkrKykKKyAgICAgICAgICAgIGlmIChoLT5kZWxheWVkX3BpY1tpXS0+cG9jIDwgb3V0LT5wb2MpIHsKKyAgICAgICAgICAgICAgICBvdXQgICAgID0gaC0+ZGVsYXllZF9waWNbaV07CisgICAgICAgICAgICAgICAgb3V0X2lkeCA9IGk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gb3V0X2lkeDsgaC0+ZGVsYXllZF9waWNbaV07IGkrKykKKyAgICAgICAgICAgIGgtPmRlbGF5ZWRfcGljW2ldID0gaC0+ZGVsYXllZF9waWNbaSArIDFdOworCisgICAgICAgIGlmIChvdXQpIHsKKyAgICAgICAgICAgIG91dC0+cmVmZXJlbmNlICY9IH5ERUxBWUVEX1BJQ19SRUY7CisgICAgICAgICAgICByZXQgPSBvdXRwdXRfZnJhbWUoaCwgcGljdCwgb3V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWZfaW5kZXg7CisgICAgfQorICAgIGlmIChoLT5pc19hdmMgJiYgYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsIE5VTEwpKSB7CisgICAgICAgIGludCBzaWRlX3NpemU7CisgICAgICAgIHVpbnQ4X3QgKnNpZGUgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQSwgJnNpZGVfc2l6ZSk7CisgICAgICAgIGlmIChpc19leHRyYShzaWRlLCBzaWRlX3NpemUpKQorICAgICAgICAgICAgZmZfaDI2NF9kZWNvZGVfZXh0cmFkYXRhKGgsIHNpZGUsIHNpZGVfc2l6ZSk7CisgICAgfQorICAgIGlmKGgtPmlzX2F2YyAmJiBidWZfc2l6ZSA+PSA5ICYmIGJ1ZlswXT09MSAmJiBidWZbMl09PTAgJiYgKGJ1Zls0XSYweEZDKT09MHhGQyAmJiAoYnVmWzVdJjB4MUYpICYmIGJ1Zls4XT09MHg2Nyl7CisgICAgICAgIGlmIChpc19leHRyYShidWYsIGJ1Zl9zaXplKSkKKyAgICAgICAgICAgIHJldHVybiBmZl9oMjY0X2RlY29kZV9leHRyYWRhdGEoaCwgYnVmLCBidWZfc2l6ZSk7CisgICAgfQorCisgICAgYnVmX2luZGV4ID0gZGVjb2RlX25hbF91bml0cyhoLCBidWYsIGJ1Zl9zaXplLCAwKTsKKyAgICBpZiAoYnVmX2luZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoIWgtPmN1cl9waWNfcHRyICYmIGgtPm5hbF91bml0X3R5cGUgPT0gTkFMX0VORF9TRVFVRU5DRSkgeworICAgICAgICBhdl9hc3NlcnQwKGJ1Zl9pbmRleCA8PSBidWZfc2l6ZSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmICghKGF2Y3R4LT5mbGFnczIgJiBDT0RFQ19GTEFHMl9DSFVOS1MpICYmICFoLT5jdXJfcGljX3B0cikgeworICAgICAgICBpZiAoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiB8fAorICAgICAgICAgICAgYnVmX3NpemUgPj0gNCAmJiAhbWVtY21wKCJRMjY0IiwgYnVmLCA0KSkKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJubyBmcmFtZSFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoIShhdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfQ0hVTktTKSB8fAorICAgICAgICAoaC0+bWJfeSA+PSBoLT5tYl9oZWlnaHQgJiYgaC0+bWJfaGVpZ2h0KSkgeworICAgICAgICBpZiAoYXZjdHgtPmZsYWdzMiAmIENPREVDX0ZMQUcyX0NIVU5LUykKKyAgICAgICAgICAgIGRlY29kZV9wb3N0aW5pdChoLCAxKTsKKworICAgICAgICBmZl9oMjY0X2ZpZWxkX2VuZChoLCAwKTsKKworICAgICAgICAvKiBXYWl0IGZvciBzZWNvbmQgZmllbGQuICovCisgICAgICAgICpnb3RfZnJhbWUgPSAwOworICAgICAgICBpZiAoaC0+bmV4dF9vdXRwdXRfcGljICYmICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bmV4dF9vdXRwdXRfcGljLT5yZWNvdmVyZWQpKSB7CisgICAgICAgICAgICBpZiAoIWgtPm5leHRfb3V0cHV0X3BpYy0+cmVjb3ZlcmVkKQorICAgICAgICAgICAgICAgIGgtPm5leHRfb3V0cHV0X3BpYy0+Zi5mbGFncyB8PSBBVl9GUkFNRV9GTEFHX0NPUlJVUFQ7CisKKyAgICAgICAgICAgIHJldCA9IG91dHB1dF9mcmFtZShoLCBwaWN0LCBoLT5uZXh0X291dHB1dF9waWMpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICpnb3RfZnJhbWUgPSAxOworICAgICAgICAgICAgaWYgKENPTkZJR19NUEVHVklERU8pIHsKKyAgICAgICAgICAgICAgICBmZl9wcmludF9kZWJ1Z19pbmZvMihoLT5hdmN0eCwgcGljdCwgaC0+ZXIubWJza2lwX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bmV4dF9vdXRwdXRfcGljLT5tYl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bmV4dF9vdXRwdXRfcGljLT5xc2NhbGVfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5uZXh0X291dHB1dF9waWMtPm1vdGlvbl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+bG93X2RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWJfd2lkdGgsIGgtPm1iX2hlaWdodCwgaC0+bWJfc3RyaWRlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChwaWN0LT5idWZbMF0gfHwgISpnb3RfZnJhbWUpOworCisgICAgcmV0dXJuIGdldF9jb25zdW1lZF9ieXRlcyhidWZfaW5kZXgsIGJ1Zl9zaXplKTsKK30KKworYXZfY29sZCB2b2lkIGZmX2gyNjRfZnJlZV9jb250ZXh0KEgyNjRDb250ZXh0ICpoKQoreworICAgIGludCBpOworCisgICAgZmZfaDI2NF9mcmVlX3RhYmxlcyhoLCAxKTsgLy8gRklYTUUgY2xlYW51cCBpbml0IHN0dWZmIHBlcmhhcHMKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfU1BTX0NPVU5UOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKGgtPnNwc19idWZmZXJzICsgaSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BQU19DT1VOVDsgaSsrKQorICAgICAgICBhdl9mcmVlcChoLT5wcHNfYnVmZmVycyArIGkpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaDI2NF9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmZl9oMjY0X3JlbW92ZV9hbGxfcmVmcyhoKTsKKyAgICBmZl9oMjY0X2ZyZWVfY29udGV4dChoKTsKKworICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCAmaC0+Y3VyX3BpYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWUHJvZmlsZSBwcm9maWxlc1tdID0geworICAgIHsgRkZfUFJPRklMRV9IMjY0X0JBU0VMSU5FLCAgICAgICAgICAgICAiQmFzZWxpbmUiICAgICAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAiQ29uc3RyYWluZWQgQmFzZWxpbmUiICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X01BSU4sICAgICAgICAgICAgICAgICAiTWFpbiIgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X0VYVEVOREVELCAgICAgICAgICAgICAiRXh0ZW5kZWQiICAgICAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0gsICAgICAgICAgICAgICAgICAiSGlnaCIgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfMTAsICAgICAgICAgICAgICAiSGlnaCAxMCIgICAgICAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfMTBfSU5UUkEsICAgICAgICAiSGlnaCAxMCBJbnRyYSIgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDIyLCAgICAgICAgICAgICAiSGlnaCA0OjI6MiIgICAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDIyX0lOVFJBLCAgICAgICAiSGlnaCA0OjI6MiBJbnRyYSIgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDQ0LCAgICAgICAgICAgICAiSGlnaCA0OjQ6NCIgICAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDQ0X1BSRURJQ1RJVkUsICAiSGlnaCA0OjQ6NCBQcmVkaWN0aXZlIiB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDQ0X0lOVFJBLCAgICAgICAiSGlnaCA0OjQ6NCBJbnRyYSIgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X0NBVkxDXzQ0NCwgICAgICAgICAgICAiQ0FWTEMgNDo0OjQiICAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9VTktOT1dOIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaDI2NF9vcHRpb25zW10gPSB7CisgICAgeyJpc19hdmMiLCAiaXMgYXZjIiwgb2Zmc2V0b2YoSDI2NENvbnRleHQsIGlzX2F2YyksIEZGX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMSwgMH0sCisgICAgeyJuYWxfbGVuZ3RoX3NpemUiLCAibmFsX2xlbmd0aF9zaXplIiwgb2Zmc2V0b2YoSDI2NENvbnRleHQsIG5hbF9sZW5ndGhfc2l6ZSksIEZGX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgNCwgMH0sCisgICAge05VTEx9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBoMjY0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIkgyNjQgRGVjb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGgyNjRfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfaDI2NF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAiaDI2NCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJILjI2NCAvIEFWQyAvIE1QRUctNCBBVkMgLyBNUEVHLTQgcGFydCAxMCIpLAorICAgIC50eXBlICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihIMjY0Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgICA9IGZmX2gyNjRfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgICAgICAgICA9IGgyNjRfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgICAgICAgID0gaDI2NF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgICAgICA9IC8qQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8Ki8gQ09ERUNfQ0FQX0RSMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVDX0NBUF9ERUxBWSB8IENPREVDX0NBUF9TTElDRV9USFJFQURTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCisgICAgLmZsdXNoICAgICAgICAgICAgICAgICA9IGZsdXNoX2RwYiwKKyAgICAuaW5pdF90aHJlYWRfY29weSAgICAgID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoZGVjb2RlX2luaXRfdGhyZWFkX2NvcHkpLAorICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChmZl9oMjY0X3VwZGF0ZV90aHJlYWRfY29udGV4dCksCisgICAgLnByb2ZpbGVzICAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKHByb2ZpbGVzKSwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgICAgID0gJmgyNjRfY2xhc3MsCit9OworCisjaWYgQ09ORklHX0gyNjRfVkRQQVVfREVDT0RFUgorc3RhdGljIGNvbnN0IEFWQ2xhc3MgaDI2NF92ZHBhdV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJIMjY0IFZEUEFVIERlY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBoMjY0X29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2gyNjRfdmRwYXVfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaDI2NF92ZHBhdSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkguMjY0IC8gQVZDIC8gTVBFRy00IEFWQyAvIE1QRUctNCBwYXJ0IDEwIChWRFBBVSBhY2NlbGVyYXRpb24pIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEgyNjRDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9oMjY0X2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGgyNjRfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBoMjY0X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0RFTEFZIHwgQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUsCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2hfZHBiLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeyBBVl9QSVhfRk1UX1ZEUEFVX0gyNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORX0sCisgICAgLnByb2ZpbGVzICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwocHJvZmlsZXMpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZoMjY0X3ZkcGF1X2NsYXNzLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NGYwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0LmgKQEAgLTAsMCArMSwxMTUxIEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZW5jb2Rlci9kZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgY29kZWMuCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2lmbmRlZiBBVkNPREVDX0gyNjRfSAorI2RlZmluZSBBVkNPREVDX0gyNjRfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImNhYmFjLmgiCisjaW5jbHVkZSAiZXJyb3JfcmVzaWxpZW5jZS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaDI2NGNocm9tYS5oIgorI2luY2x1ZGUgImgyNjRkc3AuaCIKKyNpbmNsdWRlICJoMjY0cHJlZC5oIgorI2luY2x1ZGUgImgyNjRxcGVsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIgLy8gZm9yIGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUoKQorI2luY2x1ZGUgIm1lX2NtcC5oIgorI2luY2x1ZGUgIm1wZWd1dGlscy5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInFwZWxkc3AuaCIKKyNpbmNsdWRlICJyZWN0YW5nbGUuaCIKKyNpbmNsdWRlICJ2aWRlb2RzcC5oIgorCisjZGVmaW5lIEgyNjRfTUFYX1BJQ1RVUkVfQ09VTlQgMzYKKyNkZWZpbmUgSDI2NF9NQVhfVEhSRUFEUyAgICAgICAzMgorCisjZGVmaW5lIE1BWF9TUFNfQ09VTlQgICAgICAgICAgMzIKKyNkZWZpbmUgTUFYX1BQU19DT1VOVCAgICAgICAgIDI1NgorCisjZGVmaW5lIE1BWF9NTUNPX0NPVU5UICAgICAgICAgNjYKKworI2RlZmluZSBNQVhfREVMQVlFRF9QSUNfQ09VTlQgIDE2CisKKyNkZWZpbmUgTUFYX01CUEFJUl9TSVpFICgyNTYqMTAyNCkgLy8gYSB0aWdodGVyIGJvdW5kIGNvdWxkIGJlIGNhbGN1bGF0ZWQgaWYgc29tZW9uZSBjYXJlcyBhYm91dCBhIGZldyBieXRlcworCisvKiBDb21waWxpbmcgaW4gaW50ZXJsYWNlZCBzdXBwb3J0IHJlZHVjZXMgdGhlIHNwZWVkCisgKiBvZiBwcm9ncmVzc2l2ZSBkZWNvZGluZyBieSBhYm91dCAyJS4gKi8KKyNkZWZpbmUgQUxMT1dfSU5URVJMQUNFCisKKyNkZWZpbmUgRk1PIDAKKworLyoqCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2xpY2VzIHN1cHBvcnRlZCBieSB0aGUgZGVjb2Rlci4KKyAqIG11c3QgYmUgYSBwb3dlciBvZiAyCisgKi8KKyNkZWZpbmUgTUFYX1NMSUNFUyAxNgorCisjaWZkZWYgQUxMT1dfSU5URVJMQUNFCisjZGVmaW5lIE1CX01CQUZGKGgpICAgIChoKS0+bWJfbWJhZmYKKyNkZWZpbmUgTUJfRklFTEQoaCkgICAgKGgpLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnCisjZGVmaW5lIEZSQU1FX01CQUZGKGgpIChoKS0+bWJfYWZmX2ZyYW1lCisjZGVmaW5lIEZJRUxEX1BJQ1RVUkUoaCkgKChoKS0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRSkKKyNkZWZpbmUgTEVGVF9NQlMgMgorI2RlZmluZSBMVE9QICAgICAwCisjZGVmaW5lIExCT1QgICAgIDEKKyNkZWZpbmUgTEVGVChpKSAgKGkpCisjZWxzZQorI2RlZmluZSBNQl9NQkFGRihoKSAgICAgIDAKKyNkZWZpbmUgTUJfRklFTEQoaCkgICAgICAwCisjZGVmaW5lIEZSQU1FX01CQUZGKGgpICAgMAorI2RlZmluZSBGSUVMRF9QSUNUVVJFKGgpIDAKKyN1bmRlZiAgSVNfSU5URVJMQUNFRAorI2RlZmluZSBJU19JTlRFUkxBQ0VEKG1iX3R5cGUpIDAKKyNkZWZpbmUgTEVGVF9NQlMgMQorI2RlZmluZSBMVE9QICAgICAwCisjZGVmaW5lIExCT1QgICAgIDAKKyNkZWZpbmUgTEVGVChpKSAgMAorI2VuZGlmCisjZGVmaW5lIEZJRUxEX09SX01CQUZGX1BJQ1RVUkUoaCkgKEZSQU1FX01CQUZGKGgpIHx8IEZJRUxEX1BJQ1RVUkUoaCkpCisKKyNpZm5kZWYgQ0FCQUMKKyNkZWZpbmUgQ0FCQUMoaCkgKGgpLT5wcHMuY2FiYWMKKyNlbmRpZgorCisjZGVmaW5lIENIUk9NQShoKSAgICAoKGgpLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMpCisjZGVmaW5lIENIUk9NQTQyMihoKSAoKGgpLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMgPT0gMikKKyNkZWZpbmUgQ0hST01BNDQ0KGgpICgoaCktPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKQorCisjZGVmaW5lIEVYVEVOREVEX1NBUiAgICAgICAyNTUKKworI2RlZmluZSBNQl9UWVBFX1JFRjAgICAgICAgTUJfVFlQRV9BQ1BSRUQgLy8gZGlydHkgYnV0IGl0IGZpdHMgaW4gMTYgYml0CisjZGVmaW5lIE1CX1RZUEVfOHg4RENUICAgICAweDAxMDAwMDAwCisjZGVmaW5lIElTX1JFRjAoYSkgICAgICAgICAoKGEpICYgTUJfVFlQRV9SRUYwKQorI2RlZmluZSBJU184eDhEQ1QoYSkgICAgICAgKChhKSAmIE1CX1RZUEVfOHg4RENUKQorCisjZGVmaW5lIFFQX01BWF9OVU0gKDUxICsgNio2KSAgICAgICAgICAgLy8gVGhlIG1heGltdW0gc3VwcG9ydGVkIHFwCisKKy8qIE5BTCB1bml0IHR5cGVzICovCitlbnVtIHsKKyAgICBOQUxfU0xJQ0UgICAgICAgICAgID0gMSwKKyAgICBOQUxfRFBBICAgICAgICAgICAgID0gMiwKKyAgICBOQUxfRFBCICAgICAgICAgICAgID0gMywKKyAgICBOQUxfRFBDICAgICAgICAgICAgID0gNCwKKyAgICBOQUxfSURSX1NMSUNFICAgICAgID0gNSwKKyAgICBOQUxfU0VJICAgICAgICAgICAgID0gNiwKKyAgICBOQUxfU1BTICAgICAgICAgICAgID0gNywKKyAgICBOQUxfUFBTICAgICAgICAgICAgID0gOCwKKyAgICBOQUxfQVVEICAgICAgICAgICAgID0gOSwKKyAgICBOQUxfRU5EX1NFUVVFTkNFICAgID0gMTAsCisgICAgTkFMX0VORF9TVFJFQU0gICAgICA9IDExLAorICAgIE5BTF9GSUxMRVJfREFUQSAgICAgPSAxMiwKKyAgICBOQUxfU1BTX0VYVCAgICAgICAgID0gMTMsCisgICAgTkFMX0FVWElMSUFSWV9TTElDRSA9IDE5LAorICAgIE5BTF9GRl9JR05PUkUgICAgICAgPSAweGZmMGYwMDEsCit9OworCisvKioKKyAqIFNFSSBtZXNzYWdlIHR5cGVzCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgU0VJX1RZUEVfQlVGRkVSSU5HX1BFUklPRCAgICAgICA9IDAsICAgLy8vPCBidWZmZXJpbmcgcGVyaW9kIChILjI2NCwgRC4xLjEpCisgICAgU0VJX1RZUEVfUElDX1RJTUlORyAgICAgICAgICAgICA9IDEsICAgLy8vPCBwaWN0dXJlIHRpbWluZworICAgIFNFSV9UWVBFX1VTRVJfREFUQV9JVFVfVF9UMzUgICAgPSA0LCAgIC8vLzwgdXNlciBkYXRhIHJlZ2lzdGVyZWQgYnkgSVRVLVQgUmVjb21tZW5kYXRpb24gVC4zNQorICAgIFNFSV9UWVBFX1VTRVJfREFUQV9VTlJFR0lTVEVSRUQgPSA1LCAgIC8vLzwgdW5yZWdpc3RlcmVkIHVzZXIgZGF0YQorICAgIFNFSV9UWVBFX1JFQ09WRVJZX1BPSU5UICAgICAgICAgPSA2LCAgIC8vLzwgcmVjb3ZlcnkgcG9pbnQgKGZyYW1lICMgdG8gZGVjb2RlciBzeW5jKQorICAgIFNFSV9UWVBFX0ZSQU1FX1BBQ0tJTkcgICAgICAgICAgPSA0NSwgIC8vLzwgZnJhbWUgcGFja2luZyBhcnJhbmdlbWVudAorICAgIFNFSV9UWVBFX0RJU1BMQVlfT1JJRU5UQVRJT04gICAgPSA0NywgIC8vLzwgZGlzcGxheSBvcmllbnRhdGlvbgorfSBTRUlfVHlwZTsKKworLyoqCisgKiBwaWNfc3RydWN0IGluIHBpY3R1cmUgdGltaW5nIFNFSSBtZXNzYWdlCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgU0VJX1BJQ19TVFJVQ1RfRlJBTUUgICAgICAgICAgICAgPSAwLCAvLy88ICAwOiAlZnJhbWUKKyAgICBTRUlfUElDX1NUUlVDVF9UT1BfRklFTEQgICAgICAgICA9IDEsIC8vLzwgIDE6IHRvcCBmaWVsZAorICAgIFNFSV9QSUNfU1RSVUNUX0JPVFRPTV9GSUVMRCAgICAgID0gMiwgLy8vPCAgMjogYm90dG9tIGZpZWxkCisgICAgU0VJX1BJQ19TVFJVQ1RfVE9QX0JPVFRPTSAgICAgICAgPSAzLCAvLy88ICAzOiB0b3AgZmllbGQsIGJvdHRvbSBmaWVsZCwgaW4gdGhhdCBvcmRlcgorICAgIFNFSV9QSUNfU1RSVUNUX0JPVFRPTV9UT1AgICAgICAgID0gNCwgLy8vPCAgNDogYm90dG9tIGZpZWxkLCB0b3AgZmllbGQsIGluIHRoYXQgb3JkZXIKKyAgICBTRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NX1RPUCAgICA9IDUsIC8vLzwgIDU6IHRvcCBmaWVsZCwgYm90dG9tIGZpZWxkLCB0b3AgZmllbGQgcmVwZWF0ZWQsIGluIHRoYXQgb3JkZXIKKyAgICBTRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QX0JPVFRPTSA9IDYsIC8vLzwgIDY6IGJvdHRvbSBmaWVsZCwgdG9wIGZpZWxkLCBib3R0b20gZmllbGQgcmVwZWF0ZWQsIGluIHRoYXQgb3JkZXIKKyAgICBTRUlfUElDX1NUUlVDVF9GUkFNRV9ET1VCTElORyAgICA9IDcsIC8vLzwgIDc6ICVmcmFtZSBkb3VibGluZworICAgIFNFSV9QSUNfU1RSVUNUX0ZSQU1FX1RSSVBMSU5HICAgID0gOCAgLy8vPCAgODogJWZyYW1lIHRyaXBsaW5nCit9IFNFSV9QaWNTdHJ1Y3RUeXBlOworCisvKioKKyAqIGZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnQgdHlwZXMKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBTRUlfRlBBX1RZUEVfQ0hFQ0tFUkJPQVJEICAgICAgICA9IDAsCisgICAgU0VJX0ZQQV9UWVBFX0lOVEVSTEVBVkVfQ09MVU1OICAgPSAxLAorICAgIFNFSV9GUEFfVFlQRV9JTlRFUkxFQVZFX1JPVyAgICAgID0gMiwKKyAgICBTRUlfRlBBX1RZUEVfU0lERV9CWV9TSURFICAgICAgICA9IDMsCisgICAgU0VJX0ZQQV9UWVBFX1RPUF9CT1RUT00gICAgICAgICAgPSA0LAorICAgIFNFSV9GUEFfVFlQRV9JTlRFUkxFQVZFX1RFTVBPUkFMID0gNSwKKyAgICBTRUlfRlBBX1RZUEVfMkQgICAgICAgICAgICAgICAgICA9IDYsCit9IFNFSV9GcGFUeXBlOworCisvKioKKyAqIFNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgU1BTIHsKKyAgICB1bnNpZ25lZCBpbnQgc3BzX2lkOworICAgIGludCBwcm9maWxlX2lkYzsKKyAgICBpbnQgbGV2ZWxfaWRjOworICAgIGludCBjaHJvbWFfZm9ybWF0X2lkYzsKKyAgICBpbnQgdHJhbnNmb3JtX2J5cGFzczsgICAgICAgICAgICAgIC8vLzwgcXBwcmltZV95X3plcm9fdHJhbnNmb3JtX2J5cGFzc19mbGFnCisgICAgaW50IGxvZzJfbWF4X2ZyYW1lX251bTsgICAgICAgICAgICAvLy88IGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0CisgICAgaW50IHBvY190eXBlOyAgICAgICAgICAgICAgICAgICAgICAvLy88IHBpY19vcmRlcl9jbnRfdHlwZQorICAgIGludCBsb2cyX21heF9wb2NfbHNiOyAgICAgICAgICAgICAgLy8vPCBsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQKKyAgICBpbnQgZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7CisgICAgaW50IG9mZnNldF9mb3Jfbm9uX3JlZl9waWM7CisgICAgaW50IG9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKKyAgICBpbnQgcG9jX2N5Y2xlX2xlbmd0aDsgICAgICAgICAgICAgIC8vLzwgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZQorICAgIGludCByZWZfZnJhbWVfY291bnQ7ICAgICAgICAgICAgICAgLy8vPCBudW1fcmVmX2ZyYW1lcworICAgIGludCBnYXBzX2luX2ZyYW1lX251bV9hbGxvd2VkX2ZsYWc7CisgICAgaW50IG1iX3dpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvLy88IHBpY193aWR0aF9pbl9tYnNfbWludXMxICsgMQorICAgIGludCBtYl9oZWlnaHQ7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBwaWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgKyAxCisgICAgaW50IGZyYW1lX21ic19vbmx5X2ZsYWc7CisgICAgaW50IG1iX2FmZjsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcKKyAgICBpbnQgZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKKyAgICBpbnQgY3JvcDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZnJhbWVfY3JvcHBpbmdfZmxhZworCisgICAgLyogdGhvc2UgNCBhcmUgYWxyZWFkeSBpbiBsdW1hIHNhbXBsZXMgKi8KKyAgICB1bnNpZ25lZCBpbnQgY3JvcF9sZWZ0OyAgICAgICAgICAgIC8vLzwgZnJhbWVfY3JvcHBpbmdfcmVjdF9sZWZ0X29mZnNldAorICAgIHVuc2lnbmVkIGludCBjcm9wX3JpZ2h0OyAgICAgICAgICAgLy8vPCBmcmFtZV9jcm9wcGluZ19yZWN0X3JpZ2h0X29mZnNldAorICAgIHVuc2lnbmVkIGludCBjcm9wX3RvcDsgICAgICAgICAgICAgLy8vPCBmcmFtZV9jcm9wcGluZ19yZWN0X3RvcF9vZmZzZXQKKyAgICB1bnNpZ25lZCBpbnQgY3JvcF9ib3R0b207ICAgICAgICAgIC8vLzwgZnJhbWVfY3JvcHBpbmdfcmVjdF9ib3R0b21fb2Zmc2V0CisgICAgaW50IHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKKyAgICBBVlJhdGlvbmFsIHNhcjsKKyAgICBpbnQgdmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnOworICAgIGludCBmdWxsX3JhbmdlOworICAgIGludCBjb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnOworICAgIGVudW0gQVZDb2xvclByaW1hcmllcyBjb2xvcl9wcmltYXJpZXM7CisgICAgZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyBjb2xvcl90cmM7CisgICAgZW51bSBBVkNvbG9yU3BhY2UgY29sb3JzcGFjZTsKKyAgICBpbnQgdGltaW5nX2luZm9fcHJlc2VudF9mbGFnOworICAgIHVpbnQzMl90IG51bV91bml0c19pbl90aWNrOworICAgIHVpbnQzMl90IHRpbWVfc2NhbGU7CisgICAgaW50IGZpeGVkX2ZyYW1lX3JhdGVfZmxhZzsKKyAgICBzaG9ydCBvZmZzZXRfZm9yX3JlZl9mcmFtZVsyNTZdOyAvLyBGSVhNRSBkeW4gYWxvYz8KKyAgICBpbnQgYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWc7CisgICAgaW50IG51bV9yZW9yZGVyX2ZyYW1lczsKKyAgICBpbnQgc2NhbGluZ19tYXRyaXhfcHJlc2VudDsKKyAgICB1aW50OF90IHNjYWxpbmdfbWF0cml4NFs2XVsxNl07CisgICAgdWludDhfdCBzY2FsaW5nX21hdHJpeDhbNl1bNjRdOworICAgIGludCBuYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOworICAgIGludCB2Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOworICAgIGludCBwaWNfc3RydWN0X3ByZXNlbnRfZmxhZzsKKyAgICBpbnQgdGltZV9vZmZzZXRfbGVuZ3RoOworICAgIGludCBjcGJfY250OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBTZWUgSC4yNjQgRS4xLjIKKyAgICBpbnQgaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGg7IC8vLzwgaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICsgMQorICAgIGludCBjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGg7ICAgICAgICAgLy8vPCBjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICsgMQorICAgIGludCBkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aDsgICAgICAgICAgLy8vPCBkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEgKyAxCisgICAgaW50IGJpdF9kZXB0aF9sdW1hOyAgICAgICAgICAgICAgICAgICAvLy88IGJpdF9kZXB0aF9sdW1hX21pbnVzOCArIDgKKyAgICBpbnQgYml0X2RlcHRoX2Nocm9tYTsgICAgICAgICAgICAgICAgIC8vLzwgYml0X2RlcHRoX2Nocm9tYV9taW51czggKyA4CisgICAgaW50IHJlc2lkdWFsX2NvbG9yX3RyYW5zZm9ybV9mbGFnOyAgICAvLy88IHJlc2lkdWFsX2NvbG91cl90cmFuc2Zvcm1fZmxhZworICAgIGludCBjb25zdHJhaW50X3NldF9mbGFnczsgICAgICAgICAgICAgLy8vPCBjb25zdHJhaW50X3NldFswLTNdX2ZsYWcKKyAgICBpbnQgbmV3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZmxhZyB0byBrZWVwIHRyYWNrIGlmIHRoZSBkZWNvZGVyIGNvbnRleHQgbmVlZHMgcmUtaW5pdCBkdWUgdG8gY2hhbmdlZCBTUFMKK30gU1BTOworCisvKioKKyAqIFBpY3R1cmUgcGFyYW1ldGVyIHNldAorICovCit0eXBlZGVmIHN0cnVjdCBQUFMgeworICAgIHVuc2lnbmVkIGludCBzcHNfaWQ7CisgICAgaW50IGNhYmFjOyAgICAgICAgICAgICAgICAgIC8vLzwgZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnCisgICAgaW50IHBpY19vcmRlcl9wcmVzZW50OyAgICAgIC8vLzwgcGljX29yZGVyX3ByZXNlbnRfZmxhZworICAgIGludCBzbGljZV9ncm91cF9jb3VudDsgICAgICAvLy88IG51bV9zbGljZV9ncm91cHNfbWludXMxICsgMQorICAgIGludCBtYl9zbGljZV9ncm91cF9tYXBfdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgcmVmX2NvdW50WzJdOyAgLy8vPCBudW1fcmVmX2lkeF9sMC8xX2FjdGl2ZV9taW51czEgKyAxCisgICAgaW50IHdlaWdodGVkX3ByZWQ7ICAgICAgICAgIC8vLzwgd2VpZ2h0ZWRfcHJlZF9mbGFnCisgICAgaW50IHdlaWdodGVkX2JpcHJlZF9pZGM7CisgICAgaW50IGluaXRfcXA7ICAgICAgICAgICAgICAgIC8vLzwgcGljX2luaXRfcXBfbWludXMyNiArIDI2CisgICAgaW50IGluaXRfcXM7ICAgICAgICAgICAgICAgIC8vLzwgcGljX2luaXRfcXNfbWludXMyNiArIDI2CisgICAgaW50IGNocm9tYV9xcF9pbmRleF9vZmZzZXRbMl07CisgICAgaW50IGRlYmxvY2tpbmdfZmlsdGVyX3BhcmFtZXRlcnNfcHJlc2VudDsgLy8vPCBkZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZworICAgIGludCBjb25zdHJhaW5lZF9pbnRyYV9wcmVkOyAgICAgLy8vPCBjb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcKKyAgICBpbnQgcmVkdW5kYW50X3BpY19jbnRfcHJlc2VudDsgIC8vLzwgcmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnCisgICAgaW50IHRyYW5zZm9ybV84eDhfbW9kZTsgICAgICAgICAvLy88IHRyYW5zZm9ybV84eDhfbW9kZV9mbGFnCisgICAgdWludDhfdCBzY2FsaW5nX21hdHJpeDRbNl1bMTZdOworICAgIHVpbnQ4X3Qgc2NhbGluZ19tYXRyaXg4WzZdWzY0XTsKKyAgICB1aW50OF90IGNocm9tYV9xcF90YWJsZVsyXVtRUF9NQVhfTlVNKzFdOyAgLy8vPCBwcmUtc2NhbGVkICh3aXRoIGNocm9tYV9xcF9pbmRleF9vZmZzZXQpIHZlcnNpb24gb2YgcXBfdGFibGUKKyAgICBpbnQgY2hyb21hX3FwX2RpZmY7Cit9IFBQUzsKKworLyoqCisgKiBGcmFtZSBQYWNraW5nIEFycmFuZ2VtZW50IFR5cGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgRlBBIHsKKyAgICBpbnQgICAgICAgICBmcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2lkOworICAgIGludCAgICAgICAgIGZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfY2FuY2VsX2ZsYWc7IC8vLzwgaXMgcHJldmlvdXMgYXJyYW5nZW1lbnQgY2FuY2VsZWQsIC0xIGlmIG5ldmVyIHJlY2VpdmVkCisgICAgU0VJX0ZwYVR5cGUgZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlOworICAgIGludCAgICAgICAgIGZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfcmVwZXRpdGlvbl9wZXJpb2Q7CisgICAgaW50ICAgICAgICAgY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlOworICAgIGludCAgICAgICAgIHF1aW5jdW54X3NhbXBsaW5nX2ZsYWc7Cit9IEZQQTsKKworLyoqCisgKiBNZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbiBvcGNvZGUuCisgKi8KK3R5cGVkZWYgZW51bSBNTUNPT3Bjb2RlIHsKKyAgICBNTUNPX0VORCA9IDAsCisgICAgTU1DT19TSE9SVDJVTlVTRUQsCisgICAgTU1DT19MT05HMlVOVVNFRCwKKyAgICBNTUNPX1NIT1JUMkxPTkcsCisgICAgTU1DT19TRVRfTUFYX0xPTkcsCisgICAgTU1DT19SRVNFVCwKKyAgICBNTUNPX0xPTkcsCit9IE1NQ09PcGNvZGU7CisKKy8qKgorICogTWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IE1NQ08geworICAgIE1NQ09PcGNvZGUgb3Bjb2RlOworICAgIGludCBzaG9ydF9waWNfbnVtOyAgLy8vPCBwaWNfbnVtIHdpdGhvdXQgd3JhcHBpbmcgKHBpY19udW0gJiBtYXhfcGljX251bSkKKyAgICBpbnQgbG9uZ19hcmc7ICAgICAgIC8vLzwgaW5kZXgsIHBpY19udW0sIG9yIG51bSBsb25nIHJlZnMgZGVwZW5kaW5nIG9uIG9wY29kZQorfSBNTUNPOworCit0eXBlZGVmIHN0cnVjdCBIMjY0UGljdHVyZSB7CisgICAgc3RydWN0IEFWRnJhbWUgZjsKKyAgICB1aW50OF90IGF2ZnJhbWVfcGFkZGluZ1sxMDI0XTsgLy8gaGFjayB0byBhbGxvdyBsaW5raW5nIHRvIGEgYXZ1dGlsIHdpdGggbGFyZ2VyIEFWRnJhbWUKKyAgICBUaHJlYWRGcmFtZSB0ZjsKKworICAgIEFWQnVmZmVyUmVmICpxc2NhbGVfdGFibGVfYnVmOworICAgIGludDhfdCAqcXNjYWxlX3RhYmxlOworCisgICAgQVZCdWZmZXJSZWYgKm1vdGlvbl92YWxfYnVmWzJdOworICAgIGludDE2X3QgKCptb3Rpb25fdmFsWzJdKVsyXTsKKworICAgIEFWQnVmZmVyUmVmICptYl90eXBlX2J1ZjsKKyAgICB1aW50MzJfdCAqbWJfdHlwZTsKKworICAgIEFWQnVmZmVyUmVmICpod2FjY2VsX3ByaXZfYnVmOworICAgIHZvaWQgKmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOyAvLy88IGhhcmR3YXJlIGFjY2VsZXJhdG9yIHByaXZhdGUgZGF0YQorCisgICAgQVZCdWZmZXJSZWYgKnJlZl9pbmRleF9idWZbMl07CisgICAgaW50OF90ICpyZWZfaW5kZXhbMl07CisKKyAgICBpbnQgZmllbGRfcG9jWzJdOyAgICAgICAvLy88IHRvcC9ib3R0b20gUE9DCisgICAgaW50IHBvYzsgICAgICAgICAgICAgICAgLy8vPCBmcmFtZSBQT0MKKyAgICBpbnQgZnJhbWVfbnVtOyAgICAgICAgICAvLy88IGZyYW1lX251bSAocmF3IGZyYW1lX251bSBmcm9tIHNsaWNlIGhlYWRlcikKKyAgICBpbnQgbW1jb19yZXNldDsgICAgICAgICAvKio8IE1NQ09fUkVTRVQgc2V0IHRoaXMgMS4gUmVvcmRlcmluZyBjb2RlIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtaXggcGljdHVyZXMgYmVmb3JlIGFuZCBhZnRlciBNTUNPX1JFU0VULiAqLworICAgIGludCBwaWNfaWQ7ICAgICAgICAgICAgIC8qKjwgcGljX251bSAoc2hvcnQgLT4gbm8gd3JhcCB2ZXJzaW9uIG9mIHBpY19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfbnVtICYgbWF4X3BpY19udW07IGxvbmcgLT4gbG9uZ19waWNfbnVtKSAqLworICAgIGludCBsb25nX3JlZjsgICAgICAgICAgIC8vLzwgMS0+bG9uZyB0ZXJtIHJlZmVyZW5jZSAwLT5zaG9ydCB0ZXJtIHJlZmVyZW5jZQorICAgIGludCByZWZfcG9jWzJdWzJdWzMyXTsgIC8vLzwgUE9DcyBvZiB0aGUgZnJhbWVzL2ZpZWxkcyB1c2VkIGFzIHJlZmVyZW5jZSAoRklYTUUgbmVlZCBwZXIgc2xpY2UpCisgICAgaW50IHJlZl9jb3VudFsyXVsyXTsgICAgLy8vPCBudW1iZXIgb2YgZW50cmllcyBpbiByZWZfcG9jICAgICAgICAgKEZJWE1FIG5lZWQgcGVyIHNsaWNlKQorICAgIGludCBtYmFmZjsgICAgICAgICAgICAgIC8vLzwgMSAtPiBNQkFGRiBmcmFtZSAwLT4gbm90IE1CQUZGCisgICAgaW50IGZpZWxkX3BpY3R1cmU7ICAgICAgLy8vPCB3aGV0aGVyIG9yIG5vdCBwaWN0dXJlIHdhcyBlbmNvZGVkIGluIHNlcGFyYXRlIGZpZWxkcworCisgICAgaW50IG5lZWRzX3JlYWxsb2M7ICAgICAgLy8vPCBwaWN0dXJlIG5lZWRzIHRvIGJlIHJlYWxsb2NhdGVkIChlZyBkdWUgdG8gYSBmcmFtZSBzaXplIGNoYW5nZSkKKyAgICBpbnQgcmVmZXJlbmNlOworICAgIGludCByZWNvdmVyZWQ7ICAgICAgICAgIC8vLzwgcGljdHVyZSBhdCBJRFIgb3IgcmVjb3ZlcnkgcG9pbnQgKyByZWNvdmVyeSBjb3VudAorICAgIGludCBpbnZhbGlkX2dhcDsKKyAgICBpbnQgc2VpX3JlY292ZXJ5X2ZyYW1lX2NudDsKKworICAgIGludCBjcm9wOworICAgIGludCBjcm9wX2xlZnQ7CisgICAgaW50IGNyb3BfdG9wOworfSBIMjY0UGljdHVyZTsKKworLyoqCisgKiBIMjY0Q29udGV4dAorICovCit0eXBlZGVmIHN0cnVjdCBIMjY0Q29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIE1FQ21wQ29udGV4dCBtZWNjOworICAgIFZpZGVvRFNQQ29udGV4dCB2ZHNwOworICAgIEgyNjREU1BDb250ZXh0IGgyNjRkc3A7CisgICAgSDI2NENocm9tYUNvbnRleHQgaDI2NGNocm9tYTsKKyAgICBIMjY0UXBlbENvbnRleHQgaDI2NHFwZWw7CisgICAgUGFyc2VDb250ZXh0IHBhcnNlX2NvbnRleHQ7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBFUkNvbnRleHQgZXI7CisKKyAgICBIMjY0UGljdHVyZSAqRFBCOworICAgIEgyNjRQaWN0dXJlICpjdXJfcGljX3B0cjsKKyAgICBIMjY0UGljdHVyZSBjdXJfcGljOworCisgICAgaW50IHBpeGVsX3NoaWZ0OyAgICAvLy88IDAgZm9yIDgtYml0IEgyNjQsIDEgZm9yIGhpZ2gtYml0LWRlcHRoIEgyNjQKKyAgICBpbnQgY2hyb21hX3FwWzJdOyAgIC8vIFFQYworCisgICAgaW50IHFwX3RocmVzaDsgICAgICAvLy88IFFQIHRocmVzaG9sZCB0byBza2lwIGxvb3BmaWx0ZXIKKworICAgIC8qIGNvZGVkIGRpbWVuc2lvbnMgLS0gMTYgKiBtYiB3L2ggKi8KKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBwdHJkaWZmX3QgbGluZXNpemUsIHV2bGluZXNpemU7CisgICAgaW50IGNocm9tYV94X3NoaWZ0LCBjaHJvbWFfeV9zaGlmdDsKKworICAgIGludCBxc2NhbGU7CisgICAgaW50IGRyb3BwYWJsZTsKKyAgICBpbnQgZGF0YV9wYXJ0aXRpb25pbmc7CisgICAgaW50IGNvZGVkX3BpY3R1cmVfbnVtYmVyOworICAgIGludCBsb3dfZGVsYXk7CisKKyAgICBpbnQgY29udGV4dF9pbml0aWFsaXplZDsKKyAgICBpbnQgZmxhZ3M7CisgICAgaW50IHdvcmthcm91bmRfYnVnczsKKworICAgIGludCBwcmV2X21iX3NraXBwZWQ7CisgICAgaW50IG5leHRfbWJfc2tpcHBlZDsKKworICAgIC8vIHByZWRpY3Rpb24gc3R1ZmYKKyAgICBpbnQgY2hyb21hX3ByZWRfbW9kZTsKKyAgICBpbnQgaW50cmExNngxNl9wcmVkX21vZGU7CisKKyAgICBpbnQgdG9wbGVmdF9tYl94eTsKKyAgICBpbnQgdG9wX21iX3h5OworICAgIGludCB0b3ByaWdodF9tYl94eTsKKyAgICBpbnQgbGVmdF9tYl94eVtMRUZUX01CU107CisKKyAgICBpbnQgdG9wbGVmdF90eXBlOworICAgIGludCB0b3BfdHlwZTsKKyAgICBpbnQgdG9wcmlnaHRfdHlwZTsKKyAgICBpbnQgbGVmdF90eXBlW0xFRlRfTUJTXTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnRfYmxvY2s7CisgICAgaW50IHRvcGxlZnRfcGFydGl0aW9uOworCisgICAgaW50OF90IGludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs1ICogOF07CisgICAgaW50OF90KCppbnRyYTR4NF9wcmVkX21vZGUpOworICAgIEgyNjRQcmVkQ29udGV4dCBocGM7CisgICAgdW5zaWduZWQgaW50IHRvcGxlZnRfc2FtcGxlc19hdmFpbGFibGU7CisgICAgdW5zaWduZWQgaW50IHRvcF9zYW1wbGVzX2F2YWlsYWJsZTsKKyAgICB1bnNpZ25lZCBpbnQgdG9wcmlnaHRfc2FtcGxlc19hdmFpbGFibGU7CisgICAgdW5zaWduZWQgaW50IGxlZnRfc2FtcGxlc19hdmFpbGFibGU7CisgICAgdWludDhfdCAoKnRvcF9ib3JkZXJzWzJdKVsoMTYgKiAzKSAqIDJdOworCisgICAgLyoqCisgICAgICogbm9uIHplcm8gY29lZmYgY291bnQgY2FjaGUuCisgICAgICogaXMgNjQgaWYgbm90IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbm9uX3plcm9fY291bnRfY2FjaGUpWzE1ICogOF07CisKKyAgICB1aW50OF90ICgqbm9uX3plcm9fY291bnQpWzQ4XTsKKworICAgIC8qKgorICAgICAqIE1vdGlvbiB2ZWN0b3IgY2FjaGUuCisgICAgICovCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBtdl9jYWNoZSlbMl1bNSAqIDhdWzJdOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCBpbnQ4X3QsIHJlZl9jYWNoZSlbMl1bNSAqIDhdOworI2RlZmluZSBMSVNUX05PVF9VU0VEIC0xIC8vIEZJWE1FIHJlbmFtZT8KKyNkZWZpbmUgUEFSVF9OT1RfQVZBSUxBQkxFIC0yCisKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2YgbmVpZ2hib3JzICh0b3AgYW5kL29yIGxlZnQpIHRoYXQgdXNlZCA4eDggZGN0CisgICAgICovCisgICAgaW50IG5laWdoYm9yX3RyYW5zZm9ybV9zaXplOworCisgICAgLyoqCisgICAgICogYmxvY2tfb2Zmc2V0WyAwLi4yM10gZm9yIGZyYW1lIG1hY3JvYmxvY2tzCisgICAgICogYmxvY2tfb2Zmc2V0WzI0Li40N10gZm9yIGZpZWxkIG1hY3JvYmxvY2tzCisgICAgICovCisgICAgaW50IGJsb2NrX29mZnNldFsyICogKDE2ICogMyldOworCisgICAgdWludDMyX3QgKm1iMmJfeHk7ICAvLyBGSVhNRSBhcmUgdGhlc2UgNCBhIGdvb2QgaWRlYT8KKyAgICB1aW50MzJfdCAqbWIyYnJfeHk7CisgICAgaW50IGJfc3RyaWRlOyAgICAgICAvLyBGSVhNRSB1c2Ugcy0+YjRfc3RyaWRlCisKKyAgICBwdHJkaWZmX3QgbWJfbGluZXNpemU7ICAvLy88IG1heSBiZSBlcXVhbCB0byBzLT5saW5lc2l6ZSBvciBzLT5saW5lc2l6ZSAqIDIsIGZvciBtYmFmZgorICAgIHB0cmRpZmZfdCBtYl91dmxpbmVzaXplOworCisgICAgdW5zaWduZWQgY3VycmVudF9zcHNfaWQ7IC8vLzwgaWQgb2YgdGhlIGN1cnJlbnQgU1BTCisgICAgU1BTIHNwczsgLy8vPCBjdXJyZW50IHNwcworICAgIFBQUyBwcHM7IC8vLzwgY3VycmVudCBwcHMKKworICAgIGludCBhdV9wcHNfaWQ7IC8vLzwgcHBzX2lkIG9mIGN1cnJlbnQgYWNjZXNzIHVuaXQKKworICAgIHVpbnQzMl90IGRlcXVhbnQ0X2J1ZmZlcls2XVtRUF9NQVhfTlVNICsgMV1bMTZdOyAvLyBGSVhNRSBzaG91bGQgdGhlc2UgYmUgbW92ZWQgZG93bj8KKyAgICB1aW50MzJfdCBkZXF1YW50OF9idWZmZXJbNl1bUVBfTUFYX05VTSArIDFdWzY0XTsKKyAgICB1aW50MzJfdCgqZGVxdWFudDRfY29lZmZbNl0pWzE2XTsKKyAgICB1aW50MzJfdCgqZGVxdWFudDhfY29lZmZbNl0pWzY0XTsKKworICAgIGludCBzbGljZV9udW07CisgICAgdWludDE2X3QgKnNsaWNlX3RhYmxlOyAgICAgIC8vLzwgc2xpY2VfdGFibGVfYmFzZSArIDIqbWJfc3RyaWRlICsgMQorICAgIGludCBzbGljZV90eXBlOworICAgIGludCBzbGljZV90eXBlX25vczsgICAgICAgICAvLy88IFMgZnJlZSBzbGljZSB0eXBlIChTSS9TUCBhcmUgcmVtYXBwZWQgdG8gSS9QKQorICAgIGludCBzbGljZV90eXBlX2ZpeGVkOworCisgICAgLy8gaW50ZXJsYWNpbmcgc3BlY2lmaWMgZmxhZ3MKKyAgICBpbnQgbWJfYWZmX2ZyYW1lOworICAgIGludCBtYl9maWVsZF9kZWNvZGluZ19mbGFnOworICAgIGludCBtYl9tYmFmZjsgICAgICAgICAgICAgICAvLy88IG1iX2FmZl9mcmFtZSAmJiBtYl9maWVsZF9kZWNvZGluZ19mbGFnCisgICAgaW50IHBpY3R1cmVfc3RydWN0dXJlOworICAgIGludCBmaXJzdF9maWVsZDsKKworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50MTZfdCwgc3ViX21iX3R5cGUpWzRdOworCisgICAgLy8gV2VpZ2h0ZWQgcHJlZCBzdHVmZgorICAgIGludCB1c2Vfd2VpZ2h0OworICAgIGludCB1c2Vfd2VpZ2h0X2Nocm9tYTsKKyAgICBpbnQgbHVtYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICBpbnQgY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tOworICAgIC8vIFRoZSBmb2xsb3dpbmcgMiBjYW4gYmUgY2hhbmdlZCB0byBpbnQ4X3QgYnV0IHRoYXQgY2F1c2VzIDEwY3B1IGN5Y2xlcyBzcGVlZGxvc3MKKyAgICBpbnQgbHVtYV93ZWlnaHRbNDhdWzJdWzJdOworICAgIGludCBjaHJvbWFfd2VpZ2h0WzQ4XVsyXVsyXVsyXTsKKyAgICBpbnQgaW1wbGljaXRfd2VpZ2h0WzQ4XVs0OF1bMl07CisKKyAgICBpbnQgZGlyZWN0X3NwYXRpYWxfbXZfcHJlZDsKKyAgICBpbnQgY29sX3Bhcml0eTsKKyAgICBpbnQgY29sX2ZpZWxkb2ZmOworICAgIGludCBkaXN0X3NjYWxlX2ZhY3RvclszMl07CisgICAgaW50IGRpc3Rfc2NhbGVfZmFjdG9yX2ZpZWxkWzJdWzMyXTsKKyAgICBpbnQgbWFwX2NvbF90b19saXN0MFsyXVsxNiArIDMyXTsKKyAgICBpbnQgbWFwX2NvbF90b19saXN0MF9maWVsZFsyXVsyXVsxNiArIDMyXTsKKworICAgIC8qKgorICAgICAqIG51bV9yZWZfaWR4X2wwLzFfYWN0aXZlX21pbnVzMSArIDEKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgcmVmX2NvdW50WzJdOyAgICAgICAgICAvLy88IGNvdW50cyBmcmFtZXMgb3IgZmllbGRzLCBkZXBlbmRpbmcgb24gY3VycmVudCBtYiBtb2RlCisgICAgdW5zaWduZWQgaW50IGxpc3RfY291bnQ7CisgICAgdWludDhfdCAqbGlzdF9jb3VudHM7ICAgICAgICAgICAgICAgLy8vPCBBcnJheSBvZiBsaXN0X2NvdW50IHBlciBNQiBzcGVjaWZ5aW5nIHRoZSBzbGljZSB0eXBlCisgICAgSDI2NFBpY3R1cmUgcmVmX2xpc3RbMl1bNDhdOyAgICAgICAgLyoqPCAwLi4xNTogZnJhbWUgcmVmcywgMTYuLjQ3OiBtYmFmZiBmaWVsZCByZWZzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgUmVvcmRlcmVkIHZlcnNpb24gb2YgZGVmYXVsdF9yZWZfbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYWNjb3JkaW5nIHRvIHBpY3R1cmUgcmVvcmRlcmluZyBpbiBzbGljZSBoZWFkZXIgKi8KKyAgICBpbnQgcmVmMmZybVtNQVhfU0xJQ0VTXVsyXVs2NF07ICAgICAvLy88IHJlZmVyZW5jZSB0byBmcmFtZSBudW1iZXIgbGlzdHMsIHVzZWQgaW4gdGhlIGxvb3AgZmlsdGVyLCB0aGUgZmlyc3QgMiBhcmUgZm9yIC0yLC0xCisKKyAgICAvLyBkYXRhIHBhcnRpdGlvbmluZworICAgIEdldEJpdENvbnRleHQgaW50cmFfZ2I7CisgICAgR2V0Qml0Q29udGV4dCBpbnRlcl9nYjsKKyAgICBHZXRCaXRDb250ZXh0ICppbnRyYV9nYl9wdHI7CisgICAgR2V0Qml0Q29udGV4dCAqaW50ZXJfZ2JfcHRyOworCisgICAgY29uc3QgdWludDhfdCAqaW50cmFfcGNtX3B0cjsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIG1iKVsxNiAqIDQ4ICogMl07IC8vLzwgYXMgYSBkY3QgY29lZmZpY2llbnQgaXMgaW50MzJfdCBpbiBoaWdoIGRlcHRoLCB3ZSBuZWVkIHRvIHJlc2VydmUgdHdpY2UgdGhlIHNwYWNlLgorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgbWJfbHVtYV9kYylbM11bMTYgKiAyXTsKKyAgICBpbnQxNl90IG1iX3BhZGRpbmdbMjU2ICogMl07ICAgICAgICAvLy88IGFzIG1iIGlzIGFkZHJlc3NlZCBieSBzY2FudGFibGVbaV0gYW5kIHNjYW50YWJsZSBpcyB1aW50OF90IHdlIGNhbiBlaXRoZXIgY2hlY2sgdGhhdCBpIGlzIG5vdCB0b28gbGFyZ2Ugb3IgZW5zdXJlIHRoYXQgdGhlcmUgaXMgc29tZSB1bnVzZWQgc3R1ZmYgYWZ0ZXIgbWIKKworICAgIC8qKgorICAgICAqIENhYmFjCisgICAgICovCisgICAgQ0FCQUNDb250ZXh0IGNhYmFjOworICAgIHVpbnQ4X3QgY2FiYWNfc3RhdGVbMTAyNF07CisKKyAgICAvKiAweDEwMCAtPiBub24gbnVsbCBsdW1hX2RjLCAweDgwLzB4NDAgLT4gbm9uIG51bGwgY2hyb21hX2RjIChjYi9jciksIDB4PzAgLT4gY2hyb21hX2NicCgwLCAxLCAyKSwgMHgwPyBsdW1hX2NicCAqLworICAgIHVpbnQxNl90ICpjYnBfdGFibGU7CisgICAgaW50IGNicDsKKyAgICBpbnQgdG9wX2NicDsKKyAgICBpbnQgbGVmdF9jYnA7CisgICAgLyogY2hyb21hX3ByZWRfbW9kZSBmb3IgaTR4NCBvciBpMTZ4MTYsIGVsc2UgMCAqLworICAgIHVpbnQ4X3QgKmNocm9tYV9wcmVkX21vZGVfdGFibGU7CisgICAgaW50IGxhc3RfcXNjYWxlX2RpZmY7CisgICAgdWludDhfdCAoKm12ZF90YWJsZVsyXSlbMl07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBtdmRfY2FjaGUpWzJdWzUgKiA4XVsyXTsKKyAgICB1aW50OF90ICpkaXJlY3RfdGFibGU7CisgICAgdWludDhfdCBkaXJlY3RfY2FjaGVbNSAqIDhdOworCisgICAgdWludDhfdCB6aWd6YWdfc2NhblsxNl07CisgICAgdWludDhfdCB6aWd6YWdfc2Nhbjh4OFs2NF07CisgICAgdWludDhfdCB6aWd6YWdfc2Nhbjh4OF9jYXZsY1s2NF07CisgICAgdWludDhfdCBmaWVsZF9zY2FuWzE2XTsKKyAgICB1aW50OF90IGZpZWxkX3NjYW44eDhbNjRdOworICAgIHVpbnQ4X3QgZmllbGRfc2Nhbjh4OF9jYXZsY1s2NF07CisgICAgdWludDhfdCB6aWd6YWdfc2Nhbl9xMFsxNl07CisgICAgdWludDhfdCB6aWd6YWdfc2Nhbjh4OF9xMFs2NF07CisgICAgdWludDhfdCB6aWd6YWdfc2Nhbjh4OF9jYXZsY19xMFs2NF07CisgICAgdWludDhfdCBmaWVsZF9zY2FuX3EwWzE2XTsKKyAgICB1aW50OF90IGZpZWxkX3NjYW44eDhfcTBbNjRdOworICAgIHVpbnQ4X3QgZmllbGRfc2Nhbjh4OF9jYXZsY19xMFs2NF07CisKKyAgICBpbnQgeDI2NF9idWlsZDsKKworICAgIGludCBtYl94LCBtYl95OworICAgIGludCByZXN5bmNfbWJfeDsKKyAgICBpbnQgcmVzeW5jX21iX3k7CisgICAgaW50IG1iX3NraXBfcnVuOworICAgIGludCBtYl9oZWlnaHQsIG1iX3dpZHRoOworICAgIGludCBtYl9zdHJpZGU7CisgICAgaW50IG1iX251bTsKKyAgICBpbnQgbWJfeHk7CisKKyAgICBpbnQgaXNfY29tcGxleDsKKworICAgIC8vIGRlYmxvY2sKKyAgICBpbnQgZGVibG9ja2luZ19maWx0ZXI7ICAgICAgICAgIC8vLzwgZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgd2l0aCAxIDwtPiAwCisgICAgaW50IHNsaWNlX2FscGhhX2MwX29mZnNldDsKKyAgICBpbnQgc2xpY2VfYmV0YV9vZmZzZXQ7CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gVGhpbmdzIGJlbG93IGFyZSBub3QgdXNlZCBpbiB0aGUgTUIgb3IgbW9yZSBpbm5lciBjb2RlCisKKyAgICBpbnQgbmFsX3JlZl9pZGM7CisgICAgaW50IG5hbF91bml0X3R5cGU7CisgICAgdWludDhfdCAqcmJzcF9idWZmZXJbMl07CisgICAgdW5zaWduZWQgaW50IHJic3BfYnVmZmVyX3NpemVbMl07CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHBhcnNlIEFWQyB2YXJpYW50IG9mIGgyNjQKKyAgICAgKi8KKyAgICBpbnQgaXNfYXZjOyAgICAgICAgICAgLy8vPCB0aGlzIGZsYWcgaXMgIT0gMCBpZiBjb2RlYyBpcyBhdmMxCisgICAgaW50IG5hbF9sZW5ndGhfc2l6ZTsgIC8vLzwgTnVtYmVyIG9mIGJ5dGVzIHVzZWQgZm9yIG5hbCBsZW5ndGggKDEsIDIgb3IgNCkKKyAgICBpbnQgZ290X2ZpcnN0OyAgICAgICAgLy8vPCB0aGlzIGZsYWcgaXMgIT0gMCBpZiB3ZSd2ZSBwYXJzZWQgYSBmcmFtZQorCisgICAgaW50IGJpdF9kZXB0aF9sdW1hOyAgICAgICAgIC8vLzwgbHVtYSBiaXQgZGVwdGggZnJvbSBzcHMgdG8gZGV0ZWN0IGNoYW5nZXMKKyAgICBpbnQgY2hyb21hX2Zvcm1hdF9pZGM7ICAgICAgLy8vPCBjaHJvbWEgZm9ybWF0IGZyb20gc3BzIHRvIGRldGVjdCBjaGFuZ2VzCisKKyAgICBTUFMgKnNwc19idWZmZXJzW01BWF9TUFNfQ09VTlRdOworICAgIFBQUyAqcHBzX2J1ZmZlcnNbTUFYX1BQU19DT1VOVF07CisKKyAgICBpbnQgZGVxdWFudF9jb2VmZl9wcHM7ICAgICAgLy8vPCByZWluaXQgdGFibGVzIHdoZW4gcHBzIGNoYW5nZXMKKworICAgIHVpbnQxNl90ICpzbGljZV90YWJsZV9iYXNlOworCisgICAgLy8gUE9DIHN0dWZmCisgICAgaW50IHBvY19sc2I7CisgICAgaW50IHBvY19tc2I7CisgICAgaW50IGRlbHRhX3BvY19ib3R0b207CisgICAgaW50IGRlbHRhX3BvY1syXTsKKyAgICBpbnQgZnJhbWVfbnVtOworICAgIGludCBwcmV2X3BvY19tc2I7ICAgICAgICAgICAvLy88IHBvY19tc2Igb2YgdGhlIGxhc3QgcmVmZXJlbmNlIHBpYyBmb3IgUE9DIHR5cGUgMAorICAgIGludCBwcmV2X3BvY19sc2I7ICAgICAgICAgICAvLy88IHBvY19sc2Igb2YgdGhlIGxhc3QgcmVmZXJlbmNlIHBpYyBmb3IgUE9DIHR5cGUgMAorICAgIGludCBmcmFtZV9udW1fb2Zmc2V0OyAgICAgICAvLy88IGZvciBQT0MgdHlwZSAyCisgICAgaW50IHByZXZfZnJhbWVfbnVtX29mZnNldDsgIC8vLzwgZm9yIFBPQyB0eXBlIDIKKyAgICBpbnQgcHJldl9mcmFtZV9udW07ICAgICAgICAgLy8vPCBmcmFtZV9udW0gb2YgdGhlIGxhc3QgcGljIGZvciBQT0MgdHlwZSAxLzIKKworICAgIC8qKgorICAgICAqIGZyYW1lX251bSBmb3IgZnJhbWVzIG9yIDIgKiBmcmFtZV9udW0gKyAxIGZvciBmaWVsZCBwaWNzLgorICAgICAqLworICAgIGludCBjdXJyX3BpY19udW07CisKKyAgICAvKioKKyAgICAgKiBtYXhfZnJhbWVfbnVtIG9yIDIgKiBtYXhfZnJhbWVfbnVtIGZvciBmaWVsZCBwaWNzLgorICAgICAqLworICAgIGludCBtYXhfcGljX251bTsKKworICAgIGludCByZWR1bmRhbnRfcGljX2NvdW50OworCisgICAgSDI2NFBpY3R1cmUgZGVmYXVsdF9yZWZfbGlzdFsyXVszMl07IC8vLzwgYmFzZSByZWZlcmVuY2UgbGlzdCBmb3IgYWxsIHNsaWNlcyBvZiBhIGNvZGVkIHBpY3R1cmUKKyAgICBIMjY0UGljdHVyZSAqc2hvcnRfcmVmWzMyXTsKKyAgICBIMjY0UGljdHVyZSAqbG9uZ19yZWZbMzJdOworICAgIEgyNjRQaWN0dXJlICpkZWxheWVkX3BpY1tNQVhfREVMQVlFRF9QSUNfQ09VTlQgKyAyXTsgLy8gRklYTUUgc2l6ZT8KKyAgICBpbnQgbGFzdF9wb2NzW01BWF9ERUxBWUVEX1BJQ19DT1VOVF07CisgICAgSDI2NFBpY3R1cmUgKm5leHRfb3V0cHV0X3BpYzsKKyAgICBpbnQgb3V0cHV0ZWRfcG9jOworICAgIGludCBuZXh0X291dHB1dGVkX3BvYzsKKworICAgIC8qKgorICAgICAqIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9ucyBidWZmZXIuCisgICAgICovCisgICAgTU1DTyBtbWNvW01BWF9NTUNPX0NPVU5UXTsKKyAgICBpbnQgbW1jb19pbmRleDsKKyAgICBpbnQgbW1jb19yZXNldDsKKworICAgIGludCBsb25nX3JlZl9jb3VudDsgICAgIC8vLzwgbnVtYmVyIG9mIGFjdHVhbCBsb25nIHRlcm0gcmVmZXJlbmNlcworICAgIGludCBzaG9ydF9yZWZfY291bnQ7ICAgIC8vLzwgbnVtYmVyIG9mIGFjdHVhbCBzaG9ydCB0ZXJtIHJlZmVyZW5jZXMKKworICAgIGludCBjYWJhY19pbml0X2lkYzsKKworICAgIC8qKgorICAgICAqIEBuYW1lIE1lbWJlcnMgZm9yIHNsaWNlIGJhc2VkIG11bHRpdGhyZWFkaW5nCisgICAgICogQHsKKyAgICAgKi8KKyAgICBzdHJ1Y3QgSDI2NENvbnRleHQgKnRocmVhZF9jb250ZXh0W0gyNjRfTUFYX1RIUkVBRFNdOworCisgICAgLyoqCisgICAgICogY3VycmVudCBzbGljZSBudW1iZXIsIHVzZWQgdG8gaW5pdGlhbGl6ZSBzbGljZV9udW0gb2YgZWFjaCB0aHJlYWQvY29udGV4dAorICAgICAqLworICAgIGludCBjdXJyZW50X3NsaWNlOworCisgICAgLyoqCisgICAgICogTWF4IG51bWJlciBvZiB0aHJlYWRzIC8gY29udGV4dHMuCisgICAgICogVGhpcyBpcyBlcXVhbCB0byBBVkNvZGVjQ29udGV4dC50aHJlYWRfY291bnQgdW5sZXNzCisgICAgICogbXVsdGl0aHJlYWRlZCBkZWNvZGluZyBpcyBpbXBvc3NpYmxlLCBpbiB3aGljaCBjYXNlIGl0IGlzCisgICAgICogcmVkdWNlZCB0byAxLgorICAgICAqLworICAgIGludCBtYXhfY29udGV4dHM7CisKKyAgICBpbnQgc2xpY2VfY29udGV4dF9jb3VudDsKKworICAgIC8qKgorICAgICAqICAxIGlmIHRoZSBzaW5nbGUgdGhyZWFkIGZhbGxiYWNrIHdhcm5pbmcgaGFzIGFscmVhZHkgYmVlbgorICAgICAqICBkaXNwbGF5ZWQsIDAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIGludCBzaW5nbGVfZGVjb2RlX3dhcm5pbmc7CisKKyAgICBlbnVtIEFWUGljdHVyZVR5cGUgcGljdF90eXBlOworCisgICAgaW50IGxhc3Rfc2xpY2VfdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgbGFzdF9yZWZfY291bnRbMl07CisgICAgLyoqIEB9ICovCisKKyAgICAvKioKKyAgICAgKiBwaWNfc3RydWN0IGluIHBpY3R1cmUgdGltaW5nIFNFSSBtZXNzYWdlCisgICAgICovCisgICAgU0VJX1BpY1N0cnVjdFR5cGUgc2VpX3BpY19zdHJ1Y3Q7CisKKyAgICAvKioKKyAgICAgKiBDb21wbGVtZW50IHNlaV9waWNfc3RydWN0CisgICAgICogU0VJX1BJQ19TVFJVQ1RfVE9QX0JPVFRPTSBhbmQgU0VJX1BJQ19TVFJVQ1RfQk9UVE9NX1RPUCBpbmRpY2F0ZSBpbnRlcmxhY2VkIGZyYW1lcy4KKyAgICAgKiBIb3dldmVyLCBzb2Z0IHRlbGVjaW5lZCBmcmFtZXMgbWF5IGhhdmUgdGhlc2UgdmFsdWVzLgorICAgICAqIFRoaXMgaXMgdXNlZCBpbiBhbiBhdHRlbXB0IHRvIGZsYWcgc29mdCB0ZWxlY2luZSBwcm9ncmVzc2l2ZS4KKyAgICAgKi8KKyAgICBpbnQgcHJldl9pbnRlcmxhY2VkX2ZyYW1lOworCisgICAgLyoqCisgICAgICogZnJhbWVfcGFja2luZ19hcnJhbmdtZW50IFNFSSBtZXNzYWdlCisgICAgICovCisgICAgaW50IHNlaV9mcmFtZV9wYWNraW5nX3ByZXNlbnQ7CisgICAgaW50IGZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfdHlwZTsKKyAgICBpbnQgY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlOworICAgIGludCBxdWluY3VueF9zdWJzYW1wbGluZzsKKworICAgIC8qKgorICAgICAqIGRpc3BsYXkgb3JpZW50YXRpb24gU0VJIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBpbnQgc2VpX2Rpc3BsYXlfb3JpZW50YXRpb25fcHJlc2VudDsKKyAgICBpbnQgc2VpX2FudGljbG9ja3dpc2Vfcm90YXRpb247CisgICAgaW50IHNlaV9oZmxpcCwgc2VpX3ZmbGlwOworCisgICAgLyoqCisgICAgICogQml0IHNldCBvZiBjbG9jayB0eXBlcyBmb3IgZmllbGRzL2ZyYW1lcyBpbiBwaWN0dXJlIHRpbWluZyBTRUkgbWVzc2FnZS4KKyAgICAgKiBGb3IgZWFjaCBmb3VuZCBjdF90eXBlLCBhcHByb3ByaWF0ZSBiaXQgaXMgc2V0IChlLmcuLCBiaXQgMSBmb3IKKyAgICAgKiBpbnRlcmxhY2VkKS4KKyAgICAgKi8KKyAgICBpbnQgc2VpX2N0X3R5cGU7CisKKyAgICAvKioKKyAgICAgKiBkcGJfb3V0cHV0X2RlbGF5IGluIHBpY3R1cmUgdGltaW5nIFNFSSBtZXNzYWdlLCBzZWUgSC4yNjQgQy4yLjIKKyAgICAgKi8KKyAgICBpbnQgc2VpX2RwYl9vdXRwdXRfZGVsYXk7CisKKyAgICAvKioKKyAgICAgKiBjcGJfcmVtb3ZhbF9kZWxheSBpbiBwaWN0dXJlIHRpbWluZyBTRUkgbWVzc2FnZSwgc2VlIEguMjY0IEMuMS4yCisgICAgICovCisgICAgaW50IHNlaV9jcGJfcmVtb3ZhbF9kZWxheTsKKworICAgIC8qKgorICAgICAqIHJlY292ZXJ5X2ZyYW1lX2NudCBmcm9tIFNFSSBtZXNzYWdlCisgICAgICoKKyAgICAgKiBTZXQgdG8gLTEgaWYgbm8gcmVjb3ZlcnkgcG9pbnQgU0VJIG1lc3NhZ2UgZm91bmQgb3IgdG8gbnVtYmVyIG9mIGZyYW1lcworICAgICAqIGJlZm9yZSBwbGF5YmFjayBzeW5jaHJvbml6ZXMuIEZyYW1lcyBoYXZpbmcgcmVjb3ZlcnkgcG9pbnQgYXJlIGtleQorICAgICAqIGZyYW1lcy4KKyAgICAgKi8KKyAgICBpbnQgc2VpX3JlY292ZXJ5X2ZyYW1lX2NudDsKKworICAgIC8qKgorICAgICAqIEFyZSB0aGUgU0VJIHJlY292ZXJ5IHBvaW50cyBsb29raW5nIHZhbGlkLgorICAgICAqLworICAgIGludCB2YWxpZF9yZWNvdmVyeV9wb2ludDsKKworICAgIEZQQSBzZWlfZnBhOworCisgICAgLyoqCisgICAgICogcmVjb3ZlcnlfZnJhbWUgaXMgdGhlIGZyYW1lX251bSBhdCB3aGljaCB0aGUgbmV4dCBmcmFtZSBzaG91bGQKKyAgICAgKiBiZSBmdWxseSBjb25zdHJ1Y3RlZC4KKyAgICAgKgorICAgICAqIFNldCB0byAtMSB3aGVuIG5vdCBleHBlY3RpbmcgYSByZWNvdmVyeSBwb2ludC4KKyAgICAgKi8KKyAgICBpbnQgcmVjb3ZlcnlfZnJhbWU7CisKKy8qKgorICogV2UgaGF2ZSBzZWVuIGFuIElEUiwgc28gYWxsIHRoZSBmb2xsb3dpbmcgZnJhbWVzIGluIGNvZGVkIG9yZGVyIGFyZSBjb3JyZWN0bHkKKyAqIGRlY29kYWJsZS4KKyAqLworI2RlZmluZSBGUkFNRV9SRUNPVkVSRURfSURSICAoMSA8PCAwKQorLyoqCisgKiBTdWZmaWNpZW50IG51bWJlciBvZiBmcmFtZXMgaGF2ZSBiZWVuIGRlY29kZWQgc2luY2UgYSBTRUkgcmVjb3ZlcnkgcG9pbnQsCisgKiBzbyBhbGwgdGhlIGZvbGxvd2luZyBmcmFtZXMgaW4gcHJlc2VudGF0aW9uIG9yZGVyIGFyZSBjb3JyZWN0LgorICovCisjZGVmaW5lIEZSQU1FX1JFQ09WRVJFRF9TRUkgICgxIDw8IDEpCisKKyAgICBpbnQgZnJhbWVfcmVjb3ZlcmVkOyAgICAvLy88IEluaXRpYWwgZnJhbWUgaGFzIGJlZW4gY29tcGxldGVseSByZWNvdmVyZWQKKworICAgIGludCBoYXNfcmVjb3ZlcnlfcG9pbnQ7CisKKyAgICBpbnQgbHVtYV93ZWlnaHRfZmxhZ1syXTsgICAgLy8vPCA3LjQuMy4yIGx1bWFfd2VpZ2h0X2xYX2ZsYWcKKyAgICBpbnQgY2hyb21hX3dlaWdodF9mbGFnWzJdOyAgLy8vPCA3LjQuMy4yIGNocm9tYV93ZWlnaHRfbFhfZmxhZworCisgICAgLy8gVGltZXN0YW1wIHN0dWZmCisgICAgaW50IHNlaV9idWZmZXJpbmdfcGVyaW9kX3ByZXNlbnQ7ICAgLy8vPCBCdWZmZXJpbmcgcGVyaW9kIFNFSSBmbGFnCisgICAgaW50IGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlbMzJdOyAgLy8vPCBJbml0aWFsIHRpbWVzdGFtcHMgZm9yIENQQnMKKworICAgIGludCBjdXJfY2hyb21hX2Zvcm1hdF9pZGM7CisgICAgdWludDhfdCAqYmlwcmVkX3NjcmF0Y2hwYWQ7CisKKyAgICBpbnQxNl90IHNsaWNlX3Jvd1tNQVhfU0xJQ0VTXTsgLy8vPCB0byBkZXRlY3Qgd2hlbiBNQVhfU0xJQ0VTIGlzIHRvbyBsb3cKKworICAgIHVpbnQ4X3QgcGFyc2VfaGlzdG9yeVs2XTsKKyAgICBpbnQgcGFyc2VfaGlzdG9yeV9jb3VudDsKKyAgICBpbnQgcGFyc2VfbGFzdF9tYjsKKyAgICB1aW50OF90ICplZGdlX2VtdV9idWZmZXI7CisgICAgaW50MTZfdCAqZGNfdmFsX2Jhc2U7CisKKyAgICBBVkJ1ZmZlclBvb2wgKnFzY2FsZV90YWJsZV9wb29sOworICAgIEFWQnVmZmVyUG9vbCAqbWJfdHlwZV9wb29sOworICAgIEFWQnVmZmVyUG9vbCAqbW90aW9uX3ZhbF9wb29sOworICAgIEFWQnVmZmVyUG9vbCAqcmVmX2luZGV4X3Bvb2w7CisKKyAgICAvKiBNb3Rpb24gRXN0aW1hdGlvbiAqLworICAgIHFwZWxfbWNfZnVuYyAoKnFwZWxfcHV0KVsxNl07CisgICAgcXBlbF9tY19mdW5jICgqcXBlbF9hdmcpWzE2XTsKK30gSDI2NENvbnRleHQ7CisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2gyNjRfY2hyb21hX3FwWzddW1FQX01BWF9OVU0gKyAxXTsgLy8vPCBPbmUgY2hyb21hIHFwIHRhYmxlIGZvciBlYWNoIHBvc3NpYmxlIGJpdCBkZXB0aCAoOC0xNCkuCitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfaDI2NF9tYl9zaXplc1s0XTsKKworLyoqCisgKiBEZWNvZGUgU0VJCisgKi8KK2ludCBmZl9oMjY0X2RlY29kZV9zZWkoSDI2NENvbnRleHQgKmgpOworCisvKioKKyAqIERlY29kZSBTUFMKKyAqLworaW50IGZmX2gyNjRfZGVjb2RlX3NlcV9wYXJhbWV0ZXJfc2V0KEgyNjRDb250ZXh0ICpoKTsKKworLyoqCisgKiBjb21wdXRlIHByb2ZpbGUgZnJvbSBzcHMKKyAqLworaW50IGZmX2gyNjRfZ2V0X3Byb2ZpbGUoU1BTICpzcHMpOworCisvKioKKyAqIERlY29kZSBQUFMKKyAqLworaW50IGZmX2gyNjRfZGVjb2RlX3BpY3R1cmVfcGFyYW1ldGVyX3NldChIMjY0Q29udGV4dCAqaCwgaW50IGJpdF9sZW5ndGgpOworCisvKioKKyAqIERlY29kZSBhIG5ldHdvcmsgYWJzdHJhY3Rpb24gbGF5ZXIgdW5pdC4KKyAqIEBwYXJhbSBjb25zdW1lZCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYXMgaW5wdXQKKyAqIEBwYXJhbSBsZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkKKyAqIEBwYXJhbSBkc3RfbGVuZ3RoIGlzIHRoZSBudW1iZXIgb2YgZGVjb2RlZCBieXRlcyBGSVhNRSBoZXJlCisgKiAgICAgICAgICAgICAgICAgICBvciBhIGRlY29kZSByYnNwIHRhaWxpbmc/CisgKiBAcmV0dXJuIGRlY29kZWQgYnl0ZXMsIG1pZ2h0IGJlIHNyYysxIGlmIG5vIGVzY2FwZXMKKyAqLworY29uc3QgdWludDhfdCAqZmZfaDI2NF9kZWNvZGVfbmFsKEgyNjRDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkc3RfbGVuZ3RoLCBpbnQgKmNvbnN1bWVkLCBpbnQgbGVuZ3RoKTsKKworLyoqCisgKiBGcmVlIGFueSBkYXRhIHRoYXQgbWF5IGhhdmUgYmVlbiBhbGxvY2F0ZWQgaW4gdGhlIEgyNjQgY29udGV4dAorICogbGlrZSBTUFMsIFBQUyBldGMuCisgKi8KK3ZvaWQgZmZfaDI2NF9mcmVlX2NvbnRleHQoSDI2NENvbnRleHQgKmgpOworCisvKioKKyAqIFJlY29uc3RydWN0IGJpdHN0cmVhbSBzbGljZV90eXBlLgorICovCitpbnQgZmZfaDI2NF9nZXRfc2xpY2VfdHlwZShjb25zdCBIMjY0Q29udGV4dCAqaCk7CisKKy8qKgorICogQWxsb2NhdGUgdGFibGVzLgorICogbmVlZHMgd2lkdGgvaGVpZ2h0CisgKi8KK2ludCBmZl9oMjY0X2FsbG9jX3RhYmxlcyhIMjY0Q29udGV4dCAqaCk7CisKKy8qKgorICogRmlsbCB0aGUgZGVmYXVsdF9yZWZfbGlzdC4KKyAqLworaW50IGZmX2gyNjRfZmlsbF9kZWZhdWx0X3JlZl9saXN0KEgyNjRDb250ZXh0ICpoKTsKKworaW50IGZmX2gyNjRfZGVjb2RlX3JlZl9waWNfbGlzdF9yZW9yZGVyaW5nKEgyNjRDb250ZXh0ICpoKTsKK3ZvaWQgZmZfaDI2NF9maWxsX21iYWZmX3JlZl9saXN0KEgyNjRDb250ZXh0ICpoKTsKK3ZvaWQgZmZfaDI2NF9yZW1vdmVfYWxsX3JlZnMoSDI2NENvbnRleHQgKmgpOworCisvKioKKyAqIEV4ZWN1dGUgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgKG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9ucykuCisgKi8KK2ludCBmZl9oMjY0X2V4ZWN1dGVfcmVmX3BpY19tYXJraW5nKEgyNjRDb250ZXh0ICpoLCBNTUNPICptbWNvLCBpbnQgbW1jb19jb3VudCk7CisKK2ludCBmZl9oMjY0X2RlY29kZV9yZWZfcGljX21hcmtpbmcoSDI2NENvbnRleHQgKmgsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3Rfc2xpY2UpOworCitpbnQgZmZfZ2VuZXJhdGVfc2xpZGluZ193aW5kb3dfbW1jb3MoSDI2NENvbnRleHQgKmgsIGludCBmaXJzdF9zbGljZSk7CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHRvcCAmIGxlZnQgYmxvY2tzIGFyZSBhdmFpbGFibGUgaWYgbmVlZGVkICYgY2hhbmdlIHRoZQorICogZGMgbW9kZSBzbyBpdCBvbmx5IHVzZXMgdGhlIGF2YWlsYWJsZSBibG9ja3MuCisgKi8KK2ludCBmZl9oMjY0X2NoZWNrX2ludHJhNHg0X3ByZWRfbW9kZShIMjY0Q29udGV4dCAqaCk7CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHRvcCAmIGxlZnQgYmxvY2tzIGFyZSBhdmFpbGFibGUgaWYgbmVlZGVkICYgY2hhbmdlIHRoZQorICogZGMgbW9kZSBzbyBpdCBvbmx5IHVzZXMgdGhlIGF2YWlsYWJsZSBibG9ja3MuCisgKi8KK2ludCBmZl9oMjY0X2NoZWNrX2ludHJhX3ByZWRfbW9kZShIMjY0Q29udGV4dCAqaCwgaW50IG1vZGUsIGludCBpc19jaHJvbWEpOworCit2b2lkIGZmX2gyNjRfaGxfZGVjb2RlX21iKEgyNjRDb250ZXh0ICpoKTsKK2ludCBmZl9oMjY0X2RlY29kZV9leHRyYWRhdGEoSDI2NENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpOworaW50IGZmX2gyNjRfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK3ZvaWQgZmZfaDI2NF9kZWNvZGVfaW5pdF92bGModm9pZCk7CisKKy8qKgorICogRGVjb2RlIGEgbWFjcm9ibG9jaworICogQHJldHVybiAwIGlmIE9LLCBFUl9BQ19FUlJPUiAvIEVSX0RDX0VSUk9SIC8gRVJfTVZfRVJST1Igb24gZXJyb3IKKyAqLworaW50IGZmX2gyNjRfZGVjb2RlX21iX2NhdmxjKEgyNjRDb250ZXh0ICpoKTsKKworLyoqCisgKiBEZWNvZGUgYSBDQUJBQyBjb2RlZCBtYWNyb2Jsb2NrCisgKiBAcmV0dXJuIDAgaWYgT0ssIEVSX0FDX0VSUk9SIC8gRVJfRENfRVJST1IgLyBFUl9NVl9FUlJPUiBvbiBlcnJvcgorICovCitpbnQgZmZfaDI2NF9kZWNvZGVfbWJfY2FiYWMoSDI2NENvbnRleHQgKmgpOworCit2b2lkIGZmX2gyNjRfaW5pdF9jYWJhY19zdGF0ZXMoSDI2NENvbnRleHQgKmgpOworCit2b2lkIGgyNjRfaW5pdF9kZXF1YW50X3RhYmxlcyhIMjY0Q29udGV4dCAqaCk7CisKK3ZvaWQgZmZfaDI2NF9kaXJlY3RfZGlzdF9zY2FsZV9mYWN0b3IoSDI2NENvbnRleHQgKmNvbnN0IGgpOwordm9pZCBmZl9oMjY0X2RpcmVjdF9yZWZfbGlzdF9pbml0KEgyNjRDb250ZXh0ICpjb25zdCBoKTsKK3ZvaWQgZmZfaDI2NF9wcmVkX2RpcmVjdF9tb3Rpb24oSDI2NENvbnRleHQgKmNvbnN0IGgsIGludCAqbWJfdHlwZSk7CisKK3ZvaWQgZmZfaDI2NF9maWx0ZXJfbWJfZmFzdChIMjY0Q29udGV4dCAqaCwgaW50IG1iX3gsIGludCBtYl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmltZ195LCB1aW50OF90ICppbWdfY2IsIHVpbnQ4X3QgKmltZ19jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGluZXNpemUsIHVuc2lnbmVkIGludCB1dmxpbmVzaXplKTsKK3ZvaWQgZmZfaDI2NF9maWx0ZXJfbWIoSDI2NENvbnRleHQgKmgsIGludCBtYl94LCBpbnQgbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaW1nX3ksIHVpbnQ4X3QgKmltZ19jYiwgdWludDhfdCAqaW1nX2NyLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGluZXNpemUsIHVuc2lnbmVkIGludCB1dmxpbmVzaXplKTsKKworLyoqCisgKiBSZXNldCBTRUkgdmFsdWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lLgorICoKKyAqIEBwYXJhbSBoIEguMjY0IGNvbnRleHQuCisgKi8KK3ZvaWQgZmZfaDI2NF9yZXNldF9zZWkoSDI2NENvbnRleHQgKmgpOworCisvKioKKyAqIEdldCBzdGVyZW9fbW9kZSBzdHJpbmcgZnJvbSB0aGUgaDI2NCBmcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50CisgKiBAcGFyYW0gaCBILjI2NCBjb250ZXh0LgorICovCitjb25zdCBjaGFyKiBmZl9oMjY0X3NlaV9zdGVyZW9fbW9kZShIMjY0Q29udGV4dCAqaCk7CisKKy8qCisgKiBvLW8gby1vCisgKiAgLyAvIC8KKyAqIG8tbyBvLW8KKyAqICAsLS0tJworICogby1vIG8tbworICogIC8gLyAvCisgKiBvLW8gby1vCisgKi8KKworLyogU2Nhbjggb3JnYW5pemF0aW9uOgorICogICAgMCAxIDIgMyA0IDUgNiA3CisgKiAwICBEWSAgICB5IHkgeSB5IHkKKyAqIDEgICAgICAgIHkgWSBZIFkgWQorICogMiAgICAgICAgeSBZIFkgWSBZCisgKiAzICAgICAgICB5IFkgWSBZIFkKKyAqIDQgICAgICAgIHkgWSBZIFkgWQorICogNSAgRFUgICAgdSB1IHUgdSB1CisgKiA2ICAgICAgICB1IFUgVSBVIFUKKyAqIDcgICAgICAgIHUgVSBVIFUgVQorICogOCAgICAgICAgdSBVIFUgVSBVCisgKiA5ICAgICAgICB1IFUgVSBVIFUKKyAqIDEwIERWICAgIHYgdiB2IHYgdgorICogMTEgICAgICAgdiBWIFYgViBWCisgKiAxMiAgICAgICB2IFYgViBWIFYKKyAqIDEzICAgICAgIHYgViBWIFYgVgorICogMTQgICAgICAgdiBWIFYgViBWCisgKiBEWS9EVS9EViBhcmUgZm9yIGx1bWEvY2hyb21hIERDLgorICovCisKKyNkZWZpbmUgTFVNQV9EQ19CTE9DS19JTkRFWCAgIDQ4CisjZGVmaW5lIENIUk9NQV9EQ19CTE9DS19JTkRFWCA0OQorCisvLyBUaGlzIHRhYmxlIG11c3QgYmUgaGVyZSBiZWNhdXNlIHNjYW44W2NvbnN0YW50XSBtdXN0IGJlIGtub3duIGF0IGNvbXBpbGV0aW1lCitzdGF0aWMgY29uc3QgdWludDhfdCBzY2FuOFsxNiAqIDMgKyAzXSA9IHsKKyAgICA0ICsgIDEgKiA4LCA1ICsgIDEgKiA4LCA0ICsgIDIgKiA4LCA1ICsgIDIgKiA4LAorICAgIDYgKyAgMSAqIDgsIDcgKyAgMSAqIDgsIDYgKyAgMiAqIDgsIDcgKyAgMiAqIDgsCisgICAgNCArICAzICogOCwgNSArICAzICogOCwgNCArICA0ICogOCwgNSArICA0ICogOCwKKyAgICA2ICsgIDMgKiA4LCA3ICsgIDMgKiA4LCA2ICsgIDQgKiA4LCA3ICsgIDQgKiA4LAorICAgIDQgKyAgNiAqIDgsIDUgKyAgNiAqIDgsIDQgKyAgNyAqIDgsIDUgKyAgNyAqIDgsCisgICAgNiArICA2ICogOCwgNyArICA2ICogOCwgNiArICA3ICogOCwgNyArICA3ICogOCwKKyAgICA0ICsgIDggKiA4LCA1ICsgIDggKiA4LCA0ICsgIDkgKiA4LCA1ICsgIDkgKiA4LAorICAgIDYgKyAgOCAqIDgsIDcgKyAgOCAqIDgsIDYgKyAgOSAqIDgsIDcgKyAgOSAqIDgsCisgICAgNCArIDExICogOCwgNSArIDExICogOCwgNCArIDEyICogOCwgNSArIDEyICogOCwKKyAgICA2ICsgMTEgKiA4LCA3ICsgMTEgKiA4LCA2ICsgMTIgKiA4LCA3ICsgMTIgKiA4LAorICAgIDQgKyAxMyAqIDgsIDUgKyAxMyAqIDgsIDQgKyAxNCAqIDgsIDUgKyAxNCAqIDgsCisgICAgNiArIDEzICogOCwgNyArIDEzICogOCwgNiArIDE0ICogOCwgNyArIDE0ICogOCwKKyAgICAwICsgIDAgKiA4LCAwICsgIDUgKiA4LCAwICsgMTAgKiA4Cit9OworCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50MzJfdCBwYWNrMTZ0bzMyKGludCBhLCBpbnQgYikKK3sKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIHJldHVybiAoYiAmIDB4RkZGRikgKyAoYSA8PCAxNik7CisjZWxzZQorICAgIHJldHVybiAoYSAmIDB4RkZGRikgKyAoYiA8PCAxNik7CisjZW5kaWYKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDE2X3QgcGFjazh0bzE2KGludCBhLCBpbnQgYikKK3sKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIHJldHVybiAoYiAmIDB4RkYpICsgKGEgPDwgOCk7CisjZWxzZQorICAgIHJldHVybiAoYSAmIDB4RkYpICsgKGIgPDwgOCk7CisjZW5kaWYKK30KKworLyoqCisgKiBHZXQgdGhlIGNocm9tYSBxcC4KKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF9jaHJvbWFfcXAoSDI2NENvbnRleHQgKmgsIGludCB0LCBpbnQgcXNjYWxlKQoreworICAgIHJldHVybiBoLT5wcHMuY2hyb21hX3FwX3RhYmxlW3RdW3FzY2FsZV07Cit9CisKKy8qKgorICogR2V0IHRoZSBwcmVkaWN0ZWQgaW50cmE0eDQgcHJlZGljdGlvbiBtb2RlLgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgcHJlZF9pbnRyYV9tb2RlKEgyNjRDb250ZXh0ICpoLCBpbnQgbikKK3sKKyAgICBjb25zdCBpbnQgaW5kZXg4ID0gc2Nhbjhbbl07CisgICAgY29uc3QgaW50IGxlZnQgICA9IGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtpbmRleDggLSAxXTsKKyAgICBjb25zdCBpbnQgdG9wICAgID0gaC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW2luZGV4OCAtIDhdOworICAgIGNvbnN0IGludCBtaW4gICAgPSBGRk1JTihsZWZ0LCB0b3ApOworCisgICAgdHByaW50ZihoLT5hdmN0eCwgIm1vZGU6JWQgJWQgbWluOiVkXG4iLCBsZWZ0LCB0b3AsIG1pbik7CisKKyAgICBpZiAobWluIDwgMCkKKyAgICAgICAgcmV0dXJuIERDX1BSRUQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gbWluOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHdyaXRlX2JhY2tfaW50cmFfcHJlZF9tb2RlKEgyNjRDb250ZXh0ICpoKQoreworICAgIGludDhfdCAqaTR4NCAgICAgICA9IGgtPmludHJhNHg0X3ByZWRfbW9kZSArIGgtPm1iMmJyX3h5W2gtPm1iX3h5XTsKKyAgICBpbnQ4X3QgKmk0eDRfY2FjaGUgPSBoLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGU7CisKKyAgICBBVl9DT1BZMzIoaTR4NCwgaTR4NF9jYWNoZSArIDQgKyA4ICogNCk7CisgICAgaTR4NFs0XSA9IGk0eDRfY2FjaGVbNyArIDggKiAzXTsKKyAgICBpNHg0WzVdID0gaTR4NF9jYWNoZVs3ICsgOCAqIDJdOworICAgIGk0eDRbNl0gPSBpNHg0X2NhY2hlWzcgKyA4ICogMV07Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgd3JpdGVfYmFja19ub25femVyb19jb3VudChIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBjb25zdCBpbnQgbWJfeHkgICAgPSBoLT5tYl94eTsKKyAgICB1aW50OF90ICpubnogICAgICAgPSBoLT5ub25femVyb19jb3VudFttYl94eV07CisgICAgdWludDhfdCAqbm56X2NhY2hlID0gaC0+bm9uX3plcm9fY291bnRfY2FjaGU7CisKKyAgICBBVl9DT1BZMzIoJm5uelsgMF0sICZubnpfY2FjaGVbNCArIDggKiAxXSk7CisgICAgQVZfQ09QWTMyKCZubnpbIDRdLCAmbm56X2NhY2hlWzQgKyA4ICogMl0pOworICAgIEFWX0NPUFkzMigmbm56WyA4XSwgJm5uel9jYWNoZVs0ICsgOCAqIDNdKTsKKyAgICBBVl9DT1BZMzIoJm5uelsxMl0sICZubnpfY2FjaGVbNCArIDggKiA0XSk7CisgICAgQVZfQ09QWTMyKCZubnpbMTZdLCAmbm56X2NhY2hlWzQgKyA4ICogNl0pOworICAgIEFWX0NPUFkzMigmbm56WzIwXSwgJm5uel9jYWNoZVs0ICsgOCAqIDddKTsKKyAgICBBVl9DT1BZMzIoJm5uelszMl0sICZubnpfY2FjaGVbNCArIDggKiAxMV0pOworICAgIEFWX0NPUFkzMigmbm56WzM2XSwgJm5uel9jYWNoZVs0ICsgOCAqIDEyXSk7CisKKyAgICBpZiAoIWgtPmNocm9tYV95X3NoaWZ0KSB7CisgICAgICAgIEFWX0NPUFkzMigmbm56WzI0XSwgJm5uel9jYWNoZVs0ICsgOCAqIDhdKTsKKyAgICAgICAgQVZfQ09QWTMyKCZubnpbMjhdLCAmbm56X2NhY2hlWzQgKyA4ICogOV0pOworICAgICAgICBBVl9DT1BZMzIoJm5uels0MF0sICZubnpfY2FjaGVbNCArIDggKiAxM10pOworICAgICAgICBBVl9DT1BZMzIoJm5uels0NF0sICZubnpfY2FjaGVbNCArIDggKiAxNF0pOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCB3cml0ZV9iYWNrX21vdGlvbl9saXN0KEgyNjRDb250ZXh0ICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl94eSwgaW50IGI4X3h5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlLCBpbnQgbGlzdCkKK3sKKyAgICBpbnQxNl90KCptdl9kc3QpWzJdID0gJmgtPmN1cl9waWMubW90aW9uX3ZhbFtsaXN0XVtiX3h5XTsKKyAgICBpbnQxNl90KCptdl9zcmMpWzJdID0gJmgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzBdXTsKKyAgICBBVl9DT1BZMTI4KG12X2RzdCArIDAgKiBiX3N0cmlkZSwgbXZfc3JjICsgOCAqIDApOworICAgIEFWX0NPUFkxMjgobXZfZHN0ICsgMSAqIGJfc3RyaWRlLCBtdl9zcmMgKyA4ICogMSk7CisgICAgQVZfQ09QWTEyOChtdl9kc3QgKyAyICogYl9zdHJpZGUsIG12X3NyYyArIDggKiAyKTsKKyAgICBBVl9DT1BZMTI4KG12X2RzdCArIDMgKiBiX3N0cmlkZSwgbXZfc3JjICsgOCAqIDMpOworICAgIGlmIChDQUJBQyhoKSkgeworICAgICAgICB1aW50OF90ICgqbXZkX2RzdClbMl0gPSAmaC0+bXZkX3RhYmxlW2xpc3RdW0ZNTyA/IDggKiBoLT5tYl94eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGgtPm1iMmJyX3h5W2gtPm1iX3h5XV07CisgICAgICAgIHVpbnQ4X3QoKm12ZF9zcmMpWzJdICA9ICZoLT5tdmRfY2FjaGVbbGlzdF1bc2NhbjhbMF1dOworICAgICAgICBpZiAoSVNfU0tJUChtYl90eXBlKSkgeworICAgICAgICAgICAgQVZfWkVSTzEyOChtdmRfZHN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFWX0NPUFk2NChtdmRfZHN0LCBtdmRfc3JjICsgOCAqIDMpOworICAgICAgICAgICAgQVZfQ09QWTE2KG12ZF9kc3QgKyAzICsgMywgbXZkX3NyYyArIDMgKyA4ICogMCk7CisgICAgICAgICAgICBBVl9DT1BZMTYobXZkX2RzdCArIDMgKyAyLCBtdmRfc3JjICsgMyArIDggKiAxKTsKKyAgICAgICAgICAgIEFWX0NPUFkxNihtdmRfZHN0ICsgMyArIDEsIG12ZF9zcmMgKyAzICsgOCAqIDIpOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBpbnQ4X3QgKnJlZl9pbmRleCA9ICZoLT5jdXJfcGljLnJlZl9pbmRleFtsaXN0XVtiOF94eV07CisgICAgICAgIGludDhfdCAqcmVmX2NhY2hlID0gaC0+cmVmX2NhY2hlW2xpc3RdOworICAgICAgICByZWZfaW5kZXhbMCArIDAgKiAyXSA9IHJlZl9jYWNoZVtzY2FuOFswXV07CisgICAgICAgIHJlZl9pbmRleFsxICsgMCAqIDJdID0gcmVmX2NhY2hlW3NjYW44WzRdXTsKKyAgICAgICAgcmVmX2luZGV4WzAgKyAxICogMl0gPSByZWZfY2FjaGVbc2NhbjhbOF1dOworICAgICAgICByZWZfaW5kZXhbMSArIDEgKiAyXSA9IHJlZl9jYWNoZVtzY2FuOFsxMl1dOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCB3cml0ZV9iYWNrX21vdGlvbihIMjY0Q29udGV4dCAqaCwgaW50IG1iX3R5cGUpCit7CisgICAgY29uc3QgaW50IGJfc3RyaWRlICAgICAgPSBoLT5iX3N0cmlkZTsKKyAgICBjb25zdCBpbnQgYl94eSAgPSA0ICogaC0+bWJfeCArIDQgKiBoLT5tYl95ICogaC0+Yl9zdHJpZGU7IC8vIHRyeSBtYjJiKDgpX3h5CisgICAgY29uc3QgaW50IGI4X3h5ID0gNCAqIGgtPm1iX3h5OworCisgICAgaWYgKFVTRVNfTElTVChtYl90eXBlLCAwKSkgeworICAgICAgICB3cml0ZV9iYWNrX21vdGlvbl9saXN0KGgsIGJfc3RyaWRlLCBiX3h5LCBiOF94eSwgbWJfdHlwZSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPmN1cl9waWMucmVmX2luZGV4WzBdW2I4X3h5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgMiwgMiwgMiwgKHVpbnQ4X3QpTElTVF9OT1RfVVNFRCwgMSk7CisgICAgfQorICAgIGlmIChVU0VTX0xJU1QobWJfdHlwZSwgMSkpCisgICAgICAgIHdyaXRlX2JhY2tfbW90aW9uX2xpc3QoaCwgYl9zdHJpZGUsIGJfeHksIGI4X3h5LCBtYl90eXBlLCAxKTsKKworICAgIGlmIChoLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiBDQUJBQyhoKSkgeworICAgICAgICBpZiAoSVNfOFg4KG1iX3R5cGUpKSB7CisgICAgICAgICAgICB1aW50OF90ICpkaXJlY3RfdGFibGUgPSAmaC0+ZGlyZWN0X3RhYmxlWzQgKiBoLT5tYl94eV07CisgICAgICAgICAgICBkaXJlY3RfdGFibGVbMV0gPSBoLT5zdWJfbWJfdHlwZVsxXSA+PiAxOworICAgICAgICAgICAgZGlyZWN0X3RhYmxlWzJdID0gaC0+c3ViX21iX3R5cGVbMl0gPj4gMTsKKyAgICAgICAgICAgIGRpcmVjdF90YWJsZVszXSA9IGgtPnN1Yl9tYl90eXBlWzNdID4+IDE7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBnZXRfZGN0OHg4X2FsbG93ZWQoSDI2NENvbnRleHQgKmgpCit7CisgICAgaWYgKGgtPnNwcy5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnKQorICAgICAgICByZXR1cm4gIShBVl9STjY0QShoLT5zdWJfbWJfdHlwZSkgJgorICAgICAgICAgICAgICAgICAoKE1CX1RZUEVfMTZ4OCB8IE1CX1RZUEVfOHgxNiB8IE1CX1RZUEVfOHg4KSAqCisgICAgICAgICAgICAgICAgICAweDAwMDEwMDAxMDAwMTAwMDFVTEwpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAhKEFWX1JONjRBKGgtPnN1Yl9tYl90eXBlKSAmCisgICAgICAgICAgICAgICAgICgoTUJfVFlQRV8xNng4IHwgTUJfVFlQRV84eDE2IHwgTUJfVFlQRV84eDggfCBNQl9UWVBFX0RJUkVDVDIpICoKKyAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDEwMDAxMDAwMVVMTCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmaW5kX3N0YXJ0X2NvZGUoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX2luZGV4LCBpbnQgbmV4dF9hdmMpCit7CisgICAgdWludDMyX3Qgc3RhdGUgPSAtMTsKKworICAgIGJ1Zl9pbmRleCA9IGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUoYnVmICsgYnVmX2luZGV4LCBidWYgKyBuZXh0X2F2YyArIDEsICZzdGF0ZSkgLSBidWYgLSAxOworCisgICAgcmV0dXJuIEZGTUlOKGJ1Zl9pbmRleCwgYnVmX3NpemUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfYXZjX25hbHNpemUoSDI2NENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSwgaW50ICpidWZfaW5kZXgpCit7CisgICAgaW50IGksIG5hbHNpemUgPSAwOworCisgICAgaWYgKCpidWZfaW5kZXggPj0gYnVmX3NpemUgLSBoLT5uYWxfbGVuZ3RoX3NpemUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoLT5uYWxfbGVuZ3RoX3NpemU7IGkrKykKKyAgICAgICAgbmFsc2l6ZSA9ICgodW5zaWduZWQpbmFsc2l6ZSA8PCA4KSB8IGJ1ZlsoKmJ1Zl9pbmRleCkrK107CisgICAgaWYgKG5hbHNpemUgPD0gMCB8fCBuYWxzaXplID4gYnVmX3NpemUgLSAqYnVmX2luZGV4KSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkFWQzogbmFsIHNpemUgJWRcbiIsIG5hbHNpemUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBuYWxzaXplOworfQorCitpbnQgZmZfaDI2NF9maWVsZF9lbmQoSDI2NENvbnRleHQgKmgsIGludCBpbl9zZXR1cCk7CisKK2ludCBmZl9oMjY0X3JlZl9waWN0dXJlKEgyNjRDb250ZXh0ICpoLCBIMjY0UGljdHVyZSAqZHN0LCBIMjY0UGljdHVyZSAqc3JjKTsKK3ZvaWQgZmZfaDI2NF91bnJlZl9waWN0dXJlKEgyNjRDb250ZXh0ICpoLCBIMjY0UGljdHVyZSAqcGljKTsKKworaW50IGZmX2gyNjRfY29udGV4dF9pbml0KEgyNjRDb250ZXh0ICpoKTsKK2ludCBmZl9oMjY0X3NldF9wYXJhbWV0ZXJfZnJvbV9zcHMoSDI2NENvbnRleHQgKmgpOworCit2b2lkIGZmX2gyNjRfZHJhd19ob3Jpel9iYW5kKEgyNjRDb250ZXh0ICpoLCBpbnQgeSwgaW50IGhlaWdodCk7CitpbnQgZmZfaW5pdF9wb2MoSDI2NENvbnRleHQgKmgsIGludCBwaWNfZmllbGRfcG9jWzJdLCBpbnQgKnBpY19wb2MpOworaW50IGZmX3ByZWRfd2VpZ2h0X3RhYmxlKEgyNjRDb250ZXh0ICpoKTsKK2ludCBmZl9zZXRfcmVmX2NvdW50KEgyNjRDb250ZXh0ICpoKTsKKworaW50IGZmX2gyNjRfZGVjb2RlX3NsaWNlX2hlYWRlcihIMjY0Q29udGV4dCAqaCwgSDI2NENvbnRleHQgKmgwKTsKKyNkZWZpbmUgU0xJQ0VfU0lOR0xFVEhSRUFEIDEKKyNkZWZpbmUgU0xJQ0VfU0tJUEVEIDIKKworaW50IGZmX2gyNjRfZXhlY3V0ZV9kZWNvZGVfc2xpY2VzKEgyNjRDb250ZXh0ICpoLCB1bnNpZ25lZCBjb250ZXh0X2NvdW50KTsKK2ludCBmZl9oMjY0X3VwZGF0ZV90aHJlYWRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpzcmMpOworCit2b2lkIGZmX2gyNjRfZmx1c2hfY2hhbmdlKEgyNjRDb250ZXh0ICpoKTsKKwordm9pZCBmZl9oMjY0X2ZyZWVfdGFibGVzKEgyNjRDb250ZXh0ICpoLCBpbnQgZnJlZV9yYnNwKTsKKwordm9pZCBmZl9oMjY0X3NldF9lcnBpYyhFUlBpY3R1cmUgKmRzdCwgSDI2NFBpY3R1cmUgKnNyYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0gyNjRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9jYWJhYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9jYWJhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NTVlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X2NhYmFjLmMKQEAgLTAsMCArMSwyNDM1IEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gY2FiYWMgZGVjb2RpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBjYWJhYyBkZWNvZGluZy4KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjZGVmaW5lIENBQkFDKGgpIDEKKyNkZWZpbmUgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIgMQorI2RlZmluZSBJTlRfQklUIChDSEFSX0JJVCAqIHNpemVvZihpbnQpKQorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJjYWJhYy5oIgorI2luY2x1ZGUgImNhYmFjX2Z1bmN0aW9ucy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJoMjY0ZGF0YS5oIgorI2luY2x1ZGUgImgyNjRfbXZwcmVkLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisKKyNpZiBBUkNIX1g4NgorI2luY2x1ZGUgIng4Ni9oMjY0X2kzODYuaCIKKyNlbmRpZgorCisvKiBDYWJhYyBwcmUgc3RhdGUgdGFibGUgKi8KKworc3RhdGljIGNvbnN0IGludDhfdCBjYWJhY19jb250ZXh0X2luaXRfSVsxMDI0XVsyXSA9Cit7CisgICAgLyogMCAtIDEwICovCisgICAgeyAyMCwgLTE1IH0sIHsgIDIsIDU0IH0sICB7ICAzLCAgNzQgfSwgeyAyMCwgLTE1IH0sCisgICAgeyAgMiwgIDU0IH0sIHsgIDMsIDc0IH0sICB7IC0yOCwxMjcgfSwgeyAtMjMsIDEwNCB9LAorICAgIHsgLTYsICA1MyB9LCB7IC0xLCA1NCB9LCAgeyAgNywgIDUxIH0sCisKKyAgICAvKiAxMSAtIDIzIHVuc3VzZWQgZm9yIEkgKi8KKyAgICB7IDAsIDAgfSwgICAgeyAwLCAwIH0sICAgIHsgMCwgMCB9LCAgICAgIHsgMCwgMCB9LAorICAgIHsgMCwgMCB9LCAgICB7IDAsIDAgfSwgICAgeyAwLCAwIH0sICAgICAgeyAwLCAwIH0sCisgICAgeyAwLCAwIH0sICAgIHsgMCwgMCB9LCAgICB7IDAsIDAgfSwgICAgICB7IDAsIDAgfSwKKyAgICB7IDAsIDAgfSwKKworICAgIC8qIDI0LSAzOSAqLworICAgIHsgMCwgMCB9LCAgICB7IDAsIDAgfSwgICAgeyAwLCAwIH0sICAgICAgeyAwLCAwIH0sCisgICAgeyAwLCAwIH0sICAgIHsgMCwgMCB9LCAgICB7IDAsIDAgfSwgICAgICB7IDAsIDAgfSwKKyAgICB7IDAsIDAgfSwgICAgeyAwLCAwIH0sICAgIHsgMCwgMCB9LCAgICAgIHsgMCwgMCB9LAorICAgIHsgMCwgMCB9LCAgICB7IDAsIDAgfSwgICAgeyAwLCAwIH0sICAgICAgeyAwLCAwIH0sCisKKyAgICAvKiA0MCAtIDUzICovCisgICAgeyAwLCAwIH0sICAgIHsgMCwgMCB9LCAgICB7IDAsIDAgfSwgICAgICB7IDAsIDAgfSwKKyAgICB7IDAsIDAgfSwgICAgeyAwLCAwIH0sICAgIHsgMCwgMCB9LCAgICAgIHsgMCwgMCB9LAorICAgIHsgMCwgMCB9LCAgICB7IDAsIDAgfSwgICAgeyAwLCAwIH0sICAgICAgeyAwLCAwIH0sCisgICAgeyAwLCAwIH0sICAgIHsgMCwgMCB9LAorCisgICAgLyogNTQgLSA1OSAqLworICAgIHsgMCwgMCB9LCAgICB7IDAsIDAgfSwgICAgeyAwLCAwIH0sICAgICAgeyAwLCAwIH0sCisgICAgeyAwLCAwIH0sICAgIHsgMCwgMCB9LAorCisgICAgLyogNjAgLSA2OSAqLworICAgIHsgMCwgNDEgfSwgICB7IDAsIDYzIH0sICAgeyAwLCA2MyB9LCAgICAgeyAwLCA2MyB9LAorICAgIHsgLTksIDgzIH0sICB7IDQsIDg2IH0sICAgeyAwLCA5NyB9LCAgICAgeyAtNywgNzIgfSwKKyAgICB7IDEzLCA0MSB9LCAgeyAzLCA2MiB9LAorCisgICAgLyogNzAgLT4gODcgKi8KKyAgICB7IDAsIDExIH0sICAgeyAxLCA1NSB9LCAgIHsgMCwgNjkgfSwgICAgIHsgLTE3LCAxMjcgfSwKKyAgICB7IC0xMywgMTAyIH0seyAwLCA4MiB9LCAgIHsgLTcsIDc0IH0sICAgIHsgLTIxLCAxMDcgfSwKKyAgICB7IC0yNywgMTI3IH0seyAtMzEsIDEyNyB9LHsgLTI0LCAxMjcgfSwgIHsgLTE4LCA5NSB9LAorICAgIHsgLTI3LCAxMjcgfSx7IC0yMSwgMTE0IH0seyAtMzAsIDEyNyB9LCAgeyAtMTcsIDEyMyB9LAorICAgIHsgLTEyLCAxMTUgfSx7IC0xNiwgMTIyIH0sCisKKyAgICAvKiA4OCAtPiAxMDQgKi8KKyAgICB7IC0xMSwgMTE1IH0seyAtMTIsIDYzIH0sIHsgLTIsIDY4IH0sICAgIHsgLTE1LCA4NCB9LAorICAgIHsgLTEzLCAxMDQgfSx7IC0zLCA3MCB9LCAgeyAtOCwgOTMgfSwgICAgeyAtMTAsIDkwIH0sCisgICAgeyAtMzAsIDEyNyB9LHsgLTEsIDc0IH0sICB7IC02LCA5NyB9LCAgICB7IC03LCA5MSB9LAorICAgIHsgLTIwLCAxMjcgfSx7IC00LCA1NiB9LCAgeyAtNSwgODIgfSwgICAgeyAtNywgNzYgfSwKKyAgICB7IC0yMiwgMTI1IH0sCisKKyAgICAvKiAxMDUgLT4gMTM1ICovCisgICAgeyAtNywgOTMgfSwgIHsgLTExLCA4NyB9LCB7IC0zLCA3NyB9LCAgICB7IC01LCA3MSB9LAorICAgIHsgLTQsIDYzIH0sICB7IC00LCA2OCB9LCAgeyAtMTIsIDg0IH0sICAgeyAtNywgNjIgfSwKKyAgICB7IC03LCA2NSB9LCAgeyA4LCA2MSB9LCAgIHsgNSwgNTYgfSwgICAgIHsgLTIsIDY2IH0sCisgICAgeyAxLCA2NCB9LCAgIHsgMCwgNjEgfSwgICB7IC0yLCA3OCB9LCAgICB7IDEsIDUwIH0sCisgICAgeyA3LCA1MiB9LCAgIHsgMTAsIDM1IH0sICB7IDAsIDQ0IH0sICAgICB7IDExLCAzOCB9LAorICAgIHsgMSwgNDUgfSwgICB7IDAsIDQ2IH0sICAgeyA1LCA0NCB9LCAgICAgeyAzMSwgMTcgfSwKKyAgICB7IDEsIDUxIH0sICAgeyA3LCA1MCB9LCAgIHsgMjgsIDE5IH0sICAgIHsgMTYsIDMzIH0sCisgICAgeyAxNCwgNjIgfSwgIHsgLTEzLCAxMDggfSx7IC0xNSwgMTAwIH0sCisKKyAgICAvKiAxMzYgLT4gMTY1ICovCisgICAgeyAtMTMsIDEwMSB9LHsgLTEzLCA5MSB9LCB7IC0xMiwgOTQgfSwgICB7IC0xMCwgODggfSwKKyAgICB7IC0xNiwgODQgfSwgeyAtMTAsIDg2IH0sIHsgLTcsIDgzIH0sICAgIHsgLTEzLCA4NyB9LAorICAgIHsgLTE5LCA5NCB9LCB7IDEsIDcwIH0sICAgeyAwLCA3MiB9LCAgICAgeyAtNSwgNzQgfSwKKyAgICB7IDE4LCA1OSB9LCAgeyAtOCwgMTAyIH0sIHsgLTE1LCAxMDAgfSwgIHsgMCwgOTUgfSwKKyAgICB7IC00LCA3NSB9LCAgeyAyLCA3MiB9LCAgIHsgLTExLCA3NSB9LCAgIHsgLTMsIDcxIH0sCisgICAgeyAxNSwgNDYgfSwgIHsgLTEzLCA2OSB9LCB7IDAsIDYyIH0sICAgICB7IDAsIDY1IH0sCisgICAgeyAyMSwgMzcgfSwgIHsgLTE1LCA3MiB9LCB7IDksIDU3IH0sICAgICB7IDE2LCA1NCB9LAorICAgIHsgMCwgNjIgfSwgICB7IDEyLCA3MiB9LAorCisgICAgLyogMTY2IC0+IDE5NiAqLworICAgIHsgMjQsIDAgfSwgICB7IDE1LCA5IH0sICAgeyA4LCAyNSB9LCAgICAgeyAxMywgMTggfSwKKyAgICB7IDE1LCA5IH0sICAgeyAxMywgMTkgfSwgIHsgMTAsIDM3IH0sICAgIHsgMTIsIDE4IH0sCisgICAgeyA2LCAyOSB9LCAgIHsgMjAsIDMzIH0sICB7IDE1LCAzMCB9LCAgICB7IDQsIDQ1IH0sCisgICAgeyAxLCA1OCB9LCAgIHsgMCwgNjIgfSwgICB7IDcsIDYxIH0sICAgICB7IDEyLCAzOCB9LAorICAgIHsgMTEsIDQ1IH0sICB7IDE1LCAzOSB9LCAgeyAxMSwgNDIgfSwgICAgeyAxMywgNDQgfSwKKyAgICB7IDE2LCA0NSB9LCAgeyAxMiwgNDEgfSwgIHsgMTAsIDQ5IH0sICAgIHsgMzAsIDM0IH0sCisgICAgeyAxOCwgNDIgfSwgIHsgMTAsIDU1IH0sICB7IDE3LCA1MSB9LCAgICB7IDE3LCA0NiB9LAorICAgIHsgMCwgODkgfSwgICB7IDI2LCAtMTkgfSwgeyAyMiwgLTE3IH0sCisKKyAgICAvKiAxOTcgLT4gMjI2ICovCisgICAgeyAyNiwgLTE3IH0sIHsgMzAsIC0yNSB9LCB7IDI4LCAtMjAgfSwgICB7IDMzLCAtMjMgfSwKKyAgICB7IDM3LCAtMjcgfSwgeyAzMywgLTIzIH0sIHsgNDAsIC0yOCB9LCAgIHsgMzgsIC0xNyB9LAorICAgIHsgMzMsIC0xMSB9LCB7IDQwLCAtMTUgfSwgeyA0MSwgLTYgfSwgICAgeyAzOCwgMSB9LAorICAgIHsgNDEsIDE3IH0sICB7IDMwLCAtNiB9LCAgeyAyNywgMyB9LCAgICAgeyAyNiwgMjIgfSwKKyAgICB7IDM3LCAtMTYgfSwgeyAzNSwgLTQgfSwgIHsgMzgsIC04IH0sICAgIHsgMzgsIC0zIH0sCisgICAgeyAzNywgMyB9LCAgIHsgMzgsIDUgfSwgICB7IDQyLCAwIH0sICAgICB7IDM1LCAxNiB9LAorICAgIHsgMzksIDIyIH0sICB7IDE0LCA0OCB9LCAgeyAyNywgMzcgfSwgICAgeyAyMSwgNjAgfSwKKyAgICB7IDEyLCA2OCB9LCAgeyAyLCA5NyB9LAorCisgICAgLyogMjI3IC0+IDI1MSAqLworICAgIHsgLTMsIDcxIH0sICB7IC02LCA0MiB9LCAgeyAtNSwgNTAgfSwgICAgeyAtMywgNTQgfSwKKyAgICB7IC0yLCA2MiB9LCAgeyAwLCA1OCB9LCAgIHsgMSwgNjMgfSwgICAgIHsgLTIsIDcyIH0sCisgICAgeyAtMSwgNzQgfSwgIHsgLTksIDkxIH0sICB7IC01LCA2NyB9LCAgICB7IC01LCAyNyB9LAorICAgIHsgLTMsIDM5IH0sICB7IC0yLCA0NCB9LCAgeyAwLCA0NiB9LCAgICAgeyAtMTYsIDY0IH0sCisgICAgeyAtOCwgNjggfSwgIHsgLTEwLCA3OCB9LCB7IC02LCA3NyB9LCAgICB7IC0xMCwgODYgfSwKKyAgICB7IC0xMiwgOTIgfSwgeyAtMTUsIDU1IH0sIHsgLTEwLCA2MCB9LCAgIHsgLTYsIDYyIH0sCisgICAgeyAtNCwgNjUgfSwKKworICAgIC8qIDI1MiAtPiAyNzUgKi8KKyAgICB7IC0xMiwgNzMgfSwgeyAtOCwgNzYgfSwgIHsgLTcsIDgwIH0sICAgIHsgLTksIDg4IH0sCisgICAgeyAtMTcsIDExMCB9LHsgLTExLCA5NyB9LCB7IC0yMCwgODQgfSwgICB7IC0xMSwgNzkgfSwKKyAgICB7IC02LCA3MyB9LCAgeyAtNCwgNzQgfSwgIHsgLTEzLCA4NiB9LCAgIHsgLTEzLCA5NiB9LAorICAgIHsgLTExLCA5NyB9LCB7IC0xOSwgMTE3IH0seyAtOCwgNzggfSwgICAgeyAtNSwgMzMgfSwKKyAgICB7IC00LCA0OCB9LCAgeyAtMiwgNTMgfSwgIHsgLTMsIDYyIH0sICAgIHsgLTEzLCA3MSB9LAorICAgIHsgLTEwLCA3OSB9LCB7IC0xMiwgODYgfSwgeyAtMTMsIDkwIH0sICAgeyAtMTQsIDk3IH0sCisKKyAgICAvKiAyNzYgYSBiaXQgc3BlY2lhbCAobm90IHVzZWQsIGJ5cGFzcyBpcyB1c2VkIGluc3RlYWQpICovCisgICAgeyAwLCAwIH0sCisKKyAgICAvKiAyNzcgLT4gMzA3ICovCisgICAgeyAtNiwgOTMgfSwgIHsgLTYsIDg0IH0sICB7IC04LCA3OSB9LCAgICB7IDAsIDY2IH0sCisgICAgeyAtMSwgNzEgfSwgIHsgMCwgNjIgfSwgICB7IC0yLCA2MCB9LCAgICB7IC0yLCA1OSB9LAorICAgIHsgLTUsIDc1IH0sICB7IC0zLCA2MiB9LCAgeyAtNCwgNTggfSwgICAgeyAtOSwgNjYgfSwKKyAgICB7IC0xLCA3OSB9LCAgeyAwLCA3MSB9LCAgIHsgMywgNjggfSwgICAgIHsgMTAsIDQ0IH0sCisgICAgeyAtNywgNjIgfSwgIHsgMTUsIDM2IH0sICB7IDE0LCA0MCB9LCAgICB7IDE2LCAyNyB9LAorICAgIHsgMTIsIDI5IH0sICB7IDEsIDQ0IH0sICAgeyAyMCwgMzYgfSwgICAgeyAxOCwgMzIgfSwKKyAgICB7IDUsIDQyIH0sICAgeyAxLCA0OCB9LCAgIHsgMTAsIDYyIH0sICAgIHsgMTcsIDQ2IH0sCisgICAgeyA5LCA2NCB9LCAgIHsgLTEyLCAxMDQgfSx7IC0xMSwgOTcgfSwKKworICAgIC8qIDMwOCAtPiAzMzcgKi8KKyAgICB7IC0xNiwgOTYgfSwgeyAtNywgODggfSwgIHsgLTgsIDg1IH0sICAgIHsgLTcsIDg1IH0sCisgICAgeyAtOSwgODUgfSwgIHsgLTEzLCA4OCB9LCB7IDQsIDY2IH0sICAgICB7IC0zLCA3NyB9LAorICAgIHsgLTMsIDc2IH0sICB7IC02LCA3NiB9LCAgeyAxMCwgNTggfSwgICAgeyAtMSwgNzYgfSwKKyAgICB7IC0xLCA4MyB9LCAgeyAtNywgOTkgfSwgIHsgLTE0LCA5NSB9LCAgIHsgMiwgOTUgfSwKKyAgICB7IDAsIDc2IH0sICAgeyAtNSwgNzQgfSwgIHsgMCwgNzAgfSwgICAgIHsgLTExLCA3NSB9LAorICAgIHsgMSwgNjggfSwgICB7IDAsIDY1IH0sICAgeyAtMTQsIDczIH0sICAgeyAzLCA2MiB9LAorICAgIHsgNCwgNjIgfSwgICB7IC0xLCA2OCB9LCAgeyAtMTMsIDc1IH0sICAgeyAxMSwgNTUgfSwKKyAgICB7IDUsIDY0IH0sICAgeyAxMiwgNzAgfSwKKworICAgIC8qIDMzOCAtPiAzNjggKi8KKyAgICB7IDE1LCA2IH0sICAgeyA2LCAxOSB9LCAgIHsgNywgMTYgfSwgICAgIHsgMTIsIDE0IH0sCisgICAgeyAxOCwgMTMgfSwgIHsgMTMsIDExIH0sICB7IDEzLCAxNSB9LCAgICB7IDE1LCAxNiB9LAorICAgIHsgMTIsIDIzIH0sICB7IDEzLCAyMyB9LCAgeyAxNSwgMjAgfSwgICAgeyAxNCwgMjYgfSwKKyAgICB7IDE0LCA0NCB9LCAgeyAxNywgNDAgfSwgIHsgMTcsIDQ3IH0sICAgIHsgMjQsIDE3IH0sCisgICAgeyAyMSwgMjEgfSwgIHsgMjUsIDIyIH0sICB7IDMxLCAyNyB9LCAgICB7IDIyLCAyOSB9LAorICAgIHsgMTksIDM1IH0sICB7IDE0LCA1MCB9LCAgeyAxMCwgNTcgfSwgICAgeyA3LCA2MyB9LAorICAgIHsgLTIsIDc3IH0sICB7IC00LCA4MiB9LCAgeyAtMywgOTQgfSwgICAgeyA5LCA2OSB9LAorICAgIHsgLTEyLCAxMDkgfSx7IDM2LCAtMzUgfSwgeyAzNiwgLTM0IH0sCisKKyAgICAvKiAzNjkgLT4gMzk4ICovCisgICAgeyAzMiwgLTI2IH0sIHsgMzcsIC0zMCB9LCB7IDQ0LCAtMzIgfSwgICB7IDM0LCAtMTggfSwKKyAgICB7IDM0LCAtMTUgfSwgeyA0MCwgLTE1IH0sIHsgMzMsIC03IH0sICAgIHsgMzUsIC01IH0sCisgICAgeyAzMywgMCB9LCAgIHsgMzgsIDIgfSwgICB7IDMzLCAxMyB9LCAgICB7IDIzLCAzNSB9LAorICAgIHsgMTMsIDU4IH0sICB7IDI5LCAtMyB9LCAgeyAyNiwgMCB9LCAgICAgeyAyMiwgMzAgfSwKKyAgICB7IDMxLCAtNyB9LCAgeyAzNSwgLTE1IH0sIHsgMzQsIC0zIH0sICAgIHsgMzQsIDMgfSwKKyAgICB7IDM2LCAtMSB9LCAgeyAzNCwgNSB9LCAgIHsgMzIsIDExIH0sICAgIHsgMzUsIDUgfSwKKyAgICB7IDM0LCAxMiB9LCAgeyAzOSwgMTEgfSwgIHsgMzAsIDI5IH0sICAgIHsgMzQsIDI2IH0sCisgICAgeyAyOSwgMzkgfSwgIHsgMTksIDY2IH0sCisKKyAgICAvKiAzOTkgLT4gNDM1ICovCisgICAgeyAgMzEsICAyMSB9LCB7ICAzMSwgIDMxIH0sIHsgIDI1LCAgNTAgfSwKKyAgICB7IC0xNywgMTIwIH0sIHsgLTIwLCAxMTIgfSwgeyAtMTgsIDExNCB9LCB7IC0xMSwgIDg1IH0sCisgICAgeyAtMTUsICA5MiB9LCB7IC0xNCwgIDg5IH0sIHsgLTI2LCAgNzEgfSwgeyAtMTUsICA4MSB9LAorICAgIHsgLTE0LCAgODAgfSwgeyAgIDAsICA2OCB9LCB7IC0xNCwgIDcwIH0sIHsgLTI0LCAgNTYgfSwKKyAgICB7IC0yMywgIDY4IH0sIHsgLTI0LCAgNTAgfSwgeyAtMTEsICA3NCB9LCB7ICAyMywgLTEzIH0sCisgICAgeyAgMjYsIC0xMyB9LCB7ICA0MCwgLTE1IH0sIHsgIDQ5LCAtMTQgfSwgeyAgNDQsICAgMyB9LAorICAgIHsgIDQ1LCAgIDYgfSwgeyAgNDQsICAzNCB9LCB7ICAzMywgIDU0IH0sIHsgIDE5LCAgODIgfSwKKyAgICB7ICAtMywgIDc1IH0sIHsgIC0xLCAgMjMgfSwgeyAgIDEsICAzNCB9LCB7ICAgMSwgIDQzIH0sCisgICAgeyAgIDAsICA1NCB9LCB7ICAtMiwgIDU1IH0sIHsgICAwLCAgNjEgfSwgeyAgIDEsICA2NCB9LAorICAgIHsgICAwLCAgNjggfSwgeyAgLTksICA5MiB9LAorCisgICAgLyogNDM2IC0+IDQ1OSAqLworICAgIHsgLTE0LCAxMDYgfSwgeyAtMTMsICA5NyB9LCB7IC0xNSwgIDkwIH0sIHsgLTEyLCAgOTAgfSwKKyAgICB7IC0xOCwgIDg4IH0sIHsgLTEwLCAgNzMgfSwgeyAgLTksICA3OSB9LCB7IC0xNCwgIDg2IH0sCisgICAgeyAtMTAsICA3MyB9LCB7IC0xMCwgIDcwIH0sIHsgLTEwLCAgNjkgfSwgeyAgLTUsICA2NiB9LAorICAgIHsgIC05LCAgNjQgfSwgeyAgLTUsICA1OCB9LCB7ICAgMiwgIDU5IH0sIHsgIDIxLCAtMTAgfSwKKyAgICB7ICAyNCwgLTExIH0sIHsgIDI4LCAgLTggfSwgeyAgMjgsICAtMSB9LCB7ICAyOSwgICAzIH0sCisgICAgeyAgMjksICAgOSB9LCB7ICAzNSwgIDIwIH0sIHsgIDI5LCAgMzYgfSwgeyAgMTQsICA2NyB9LAorCisgICAgLyogNDYwIC0+IDEwMjQgKi8KKyAgICB7IC0xNywgMTIzIH0sIHsgLTEyLCAxMTUgfSwgeyAtMTYsIDEyMiB9LCB7IC0xMSwgMTE1IH0sCisgICAgeyAtMTIsICA2MyB9LCB7ICAtMiwgIDY4IH0sIHsgLTE1LCAgODQgfSwgeyAtMTMsIDEwNCB9LAorICAgIHsgIC0zLCAgNzAgfSwgeyAgLTgsICA5MyB9LCB7IC0xMCwgIDkwIH0sIHsgLTMwLCAxMjcgfSwKKyAgICB7IC0xNywgMTIzIH0sIHsgLTEyLCAxMTUgfSwgeyAtMTYsIDEyMiB9LCB7IC0xMSwgMTE1IH0sCisgICAgeyAtMTIsICA2MyB9LCB7ICAtMiwgIDY4IH0sIHsgLTE1LCAgODQgfSwgeyAtMTMsIDEwNCB9LAorICAgIHsgIC0zLCAgNzAgfSwgeyAgLTgsICA5MyB9LCB7IC0xMCwgIDkwIH0sIHsgLTMwLCAxMjcgfSwKKyAgICB7ICAtNywgIDkzIH0sIHsgLTExLCAgODcgfSwgeyAgLTMsICA3NyB9LCB7ICAtNSwgIDcxIH0sCisgICAgeyAgLTQsICA2MyB9LCB7ICAtNCwgIDY4IH0sIHsgLTEyLCAgODQgfSwgeyAgLTcsICA2MiB9LAorICAgIHsgIC03LCAgNjUgfSwgeyAgIDgsICA2MSB9LCB7ICAgNSwgIDU2IH0sIHsgIC0yLCAgNjYgfSwKKyAgICB7ICAgMSwgIDY0IH0sIHsgICAwLCAgNjEgfSwgeyAgLTIsICA3OCB9LCB7ICAgMSwgIDUwIH0sCisgICAgeyAgIDcsICA1MiB9LCB7ICAxMCwgIDM1IH0sIHsgICAwLCAgNDQgfSwgeyAgMTEsICAzOCB9LAorICAgIHsgICAxLCAgNDUgfSwgeyAgIDAsICA0NiB9LCB7ICAgNSwgIDQ0IH0sIHsgIDMxLCAgMTcgfSwKKyAgICB7ICAgMSwgIDUxIH0sIHsgICA3LCAgNTAgfSwgeyAgMjgsICAxOSB9LCB7ICAxNiwgIDMzIH0sCisgICAgeyAgMTQsICA2MiB9LCB7IC0xMywgMTA4IH0sIHsgLTE1LCAxMDAgfSwgeyAtMTMsIDEwMSB9LAorICAgIHsgLTEzLCAgOTEgfSwgeyAtMTIsICA5NCB9LCB7IC0xMCwgIDg4IH0sIHsgLTE2LCAgODQgfSwKKyAgICB7IC0xMCwgIDg2IH0sIHsgIC03LCAgODMgfSwgeyAtMTMsICA4NyB9LCB7IC0xOSwgIDk0IH0sCisgICAgeyAgIDEsICA3MCB9LCB7ICAgMCwgIDcyIH0sIHsgIC01LCAgNzQgfSwgeyAgMTgsICA1OSB9LAorICAgIHsgIC03LCAgOTMgfSwgeyAtMTEsICA4NyB9LCB7ICAtMywgIDc3IH0sIHsgIC01LCAgNzEgfSwKKyAgICB7ICAtNCwgIDYzIH0sIHsgIC00LCAgNjggfSwgeyAtMTIsICA4NCB9LCB7ICAtNywgIDYyIH0sCisgICAgeyAgLTcsICA2NSB9LCB7ICAgOCwgIDYxIH0sIHsgICA1LCAgNTYgfSwgeyAgLTIsICA2NiB9LAorICAgIHsgICAxLCAgNjQgfSwgeyAgIDAsICA2MSB9LCB7ICAtMiwgIDc4IH0sIHsgICAxLCAgNTAgfSwKKyAgICB7ICAgNywgIDUyIH0sIHsgIDEwLCAgMzUgfSwgeyAgIDAsICA0NCB9LCB7ICAxMSwgIDM4IH0sCisgICAgeyAgIDEsICA0NSB9LCB7ICAgMCwgIDQ2IH0sIHsgICA1LCAgNDQgfSwgeyAgMzEsICAxNyB9LAorICAgIHsgICAxLCAgNTEgfSwgeyAgIDcsICA1MCB9LCB7ICAyOCwgIDE5IH0sIHsgIDE2LCAgMzMgfSwKKyAgICB7ICAxNCwgIDYyIH0sIHsgLTEzLCAxMDggfSwgeyAtMTUsIDEwMCB9LCB7IC0xMywgMTAxIH0sCisgICAgeyAtMTMsICA5MSB9LCB7IC0xMiwgIDk0IH0sIHsgLTEwLCAgODggfSwgeyAtMTYsICA4NCB9LAorICAgIHsgLTEwLCAgODYgfSwgeyAgLTcsICA4MyB9LCB7IC0xMywgIDg3IH0sIHsgLTE5LCAgOTQgfSwKKyAgICB7ICAgMSwgIDcwIH0sIHsgICAwLCAgNzIgfSwgeyAgLTUsICA3NCB9LCB7ICAxOCwgIDU5IH0sCisgICAgeyAgMjQsICAgMCB9LCB7ICAxNSwgICA5IH0sIHsgICA4LCAgMjUgfSwgeyAgMTMsICAxOCB9LAorICAgIHsgIDE1LCAgIDkgfSwgeyAgMTMsICAxOSB9LCB7ICAxMCwgIDM3IH0sIHsgIDEyLCAgMTggfSwKKyAgICB7ICAgNiwgIDI5IH0sIHsgIDIwLCAgMzMgfSwgeyAgMTUsICAzMCB9LCB7ICAgNCwgIDQ1IH0sCisgICAgeyAgIDEsICA1OCB9LCB7ICAgMCwgIDYyIH0sIHsgICA3LCAgNjEgfSwgeyAgMTIsICAzOCB9LAorICAgIHsgIDExLCAgNDUgfSwgeyAgMTUsICAzOSB9LCB7ICAxMSwgIDQyIH0sIHsgIDEzLCAgNDQgfSwKKyAgICB7ICAxNiwgIDQ1IH0sIHsgIDEyLCAgNDEgfSwgeyAgMTAsICA0OSB9LCB7ICAzMCwgIDM0IH0sCisgICAgeyAgMTgsICA0MiB9LCB7ICAxMCwgIDU1IH0sIHsgIDE3LCAgNTEgfSwgeyAgMTcsICA0NiB9LAorICAgIHsgICAwLCAgODkgfSwgeyAgMjYsIC0xOSB9LCB7ICAyMiwgLTE3IH0sIHsgIDI2LCAtMTcgfSwKKyAgICB7ICAzMCwgLTI1IH0sIHsgIDI4LCAtMjAgfSwgeyAgMzMsIC0yMyB9LCB7ICAzNywgLTI3IH0sCisgICAgeyAgMzMsIC0yMyB9LCB7ICA0MCwgLTI4IH0sIHsgIDM4LCAtMTcgfSwgeyAgMzMsIC0xMSB9LAorICAgIHsgIDQwLCAtMTUgfSwgeyAgNDEsICAtNiB9LCB7ICAzOCwgICAxIH0sIHsgIDQxLCAgMTcgfSwKKyAgICB7ICAyNCwgICAwIH0sIHsgIDE1LCAgIDkgfSwgeyAgIDgsICAyNSB9LCB7ICAxMywgIDE4IH0sCisgICAgeyAgMTUsICAgOSB9LCB7ICAxMywgIDE5IH0sIHsgIDEwLCAgMzcgfSwgeyAgMTIsICAxOCB9LAorICAgIHsgICA2LCAgMjkgfSwgeyAgMjAsICAzMyB9LCB7ICAxNSwgIDMwIH0sIHsgICA0LCAgNDUgfSwKKyAgICB7ICAgMSwgIDU4IH0sIHsgICAwLCAgNjIgfSwgeyAgIDcsICA2MSB9LCB7ICAxMiwgIDM4IH0sCisgICAgeyAgMTEsICA0NSB9LCB7ICAxNSwgIDM5IH0sIHsgIDExLCAgNDIgfSwgeyAgMTMsICA0NCB9LAorICAgIHsgIDE2LCAgNDUgfSwgeyAgMTIsICA0MSB9LCB7ICAxMCwgIDQ5IH0sIHsgIDMwLCAgMzQgfSwKKyAgICB7ICAxOCwgIDQyIH0sIHsgIDEwLCAgNTUgfSwgeyAgMTcsICA1MSB9LCB7ICAxNywgIDQ2IH0sCisgICAgeyAgIDAsICA4OSB9LCB7ICAyNiwgLTE5IH0sIHsgIDIyLCAtMTcgfSwgeyAgMjYsIC0xNyB9LAorICAgIHsgIDMwLCAtMjUgfSwgeyAgMjgsIC0yMCB9LCB7ICAzMywgLTIzIH0sIHsgIDM3LCAtMjcgfSwKKyAgICB7ICAzMywgLTIzIH0sIHsgIDQwLCAtMjggfSwgeyAgMzgsIC0xNyB9LCB7ICAzMywgLTExIH0sCisgICAgeyAgNDAsIC0xNSB9LCB7ICA0MSwgIC02IH0sIHsgIDM4LCAgIDEgfSwgeyAgNDEsICAxNyB9LAorICAgIHsgLTE3LCAxMjAgfSwgeyAtMjAsIDExMiB9LCB7IC0xOCwgMTE0IH0sIHsgLTExLCAgODUgfSwKKyAgICB7IC0xNSwgIDkyIH0sIHsgLTE0LCAgODkgfSwgeyAtMjYsICA3MSB9LCB7IC0xNSwgIDgxIH0sCisgICAgeyAtMTQsICA4MCB9LCB7ICAgMCwgIDY4IH0sIHsgLTE0LCAgNzAgfSwgeyAtMjQsICA1NiB9LAorICAgIHsgLTIzLCAgNjggfSwgeyAtMjQsICA1MCB9LCB7IC0xMSwgIDc0IH0sIHsgLTE0LCAxMDYgfSwKKyAgICB7IC0xMywgIDk3IH0sIHsgLTE1LCAgOTAgfSwgeyAtMTIsICA5MCB9LCB7IC0xOCwgIDg4IH0sCisgICAgeyAtMTAsICA3MyB9LCB7ICAtOSwgIDc5IH0sIHsgLTE0LCAgODYgfSwgeyAtMTAsICA3MyB9LAorICAgIHsgLTEwLCAgNzAgfSwgeyAtMTAsICA2OSB9LCB7ICAtNSwgIDY2IH0sIHsgIC05LCAgNjQgfSwKKyAgICB7ICAtNSwgIDU4IH0sIHsgICAyLCAgNTkgfSwgeyAgMjMsIC0xMyB9LCB7ICAyNiwgLTEzIH0sCisgICAgeyAgNDAsIC0xNSB9LCB7ICA0OSwgLTE0IH0sIHsgIDQ0LCAgIDMgfSwgeyAgNDUsICAgNiB9LAorICAgIHsgIDQ0LCAgMzQgfSwgeyAgMzMsICA1NCB9LCB7ICAxOSwgIDgyIH0sIHsgIDIxLCAtMTAgfSwKKyAgICB7ICAyNCwgLTExIH0sIHsgIDI4LCAgLTggfSwgeyAgMjgsICAtMSB9LCB7ICAyOSwgICAzIH0sCisgICAgeyAgMjksICAgOSB9LCB7ICAzNSwgIDIwIH0sIHsgIDI5LCAgMzYgfSwgeyAgMTQsICA2NyB9LAorICAgIHsgIC0zLCAgNzUgfSwgeyAgLTEsICAyMyB9LCB7ICAgMSwgIDM0IH0sIHsgICAxLCAgNDMgfSwKKyAgICB7ICAgMCwgIDU0IH0sIHsgIC0yLCAgNTUgfSwgeyAgIDAsICA2MSB9LCB7ICAgMSwgIDY0IH0sCisgICAgeyAgIDAsICA2OCB9LCB7ICAtOSwgIDkyIH0sIHsgLTE3LCAxMjAgfSwgeyAtMjAsIDExMiB9LAorICAgIHsgLTE4LCAxMTQgfSwgeyAtMTEsICA4NSB9LCB7IC0xNSwgIDkyIH0sIHsgLTE0LCAgODkgfSwKKyAgICB7IC0yNiwgIDcxIH0sIHsgLTE1LCAgODEgfSwgeyAtMTQsICA4MCB9LCB7ICAgMCwgIDY4IH0sCisgICAgeyAtMTQsICA3MCB9LCB7IC0yNCwgIDU2IH0sIHsgLTIzLCAgNjggfSwgeyAtMjQsICA1MCB9LAorICAgIHsgLTExLCAgNzQgfSwgeyAtMTQsIDEwNiB9LCB7IC0xMywgIDk3IH0sIHsgLTE1LCAgOTAgfSwKKyAgICB7IC0xMiwgIDkwIH0sIHsgLTE4LCAgODggfSwgeyAtMTAsICA3MyB9LCB7ICAtOSwgIDc5IH0sCisgICAgeyAtMTQsICA4NiB9LCB7IC0xMCwgIDczIH0sIHsgLTEwLCAgNzAgfSwgeyAtMTAsICA2OSB9LAorICAgIHsgIC01LCAgNjYgfSwgeyAgLTksICA2NCB9LCB7ICAtNSwgIDU4IH0sIHsgICAyLCAgNTkgfSwKKyAgICB7ICAyMywgLTEzIH0sIHsgIDI2LCAtMTMgfSwgeyAgNDAsIC0xNSB9LCB7ICA0OSwgLTE0IH0sCisgICAgeyAgNDQsICAgMyB9LCB7ICA0NSwgICA2IH0sIHsgIDQ0LCAgMzQgfSwgeyAgMzMsICA1NCB9LAorICAgIHsgIDE5LCAgODIgfSwgeyAgMjEsIC0xMCB9LCB7ICAyNCwgLTExIH0sIHsgIDI4LCAgLTggfSwKKyAgICB7ICAyOCwgIC0xIH0sIHsgIDI5LCAgIDMgfSwgeyAgMjksICAgOSB9LCB7ICAzNSwgIDIwIH0sCisgICAgeyAgMjksICAzNiB9LCB7ICAxNCwgIDY3IH0sIHsgIC0zLCAgNzUgfSwgeyAgLTEsICAyMyB9LAorICAgIHsgICAxLCAgMzQgfSwgeyAgIDEsICA0MyB9LCB7ICAgMCwgIDU0IH0sIHsgIC0yLCAgNTUgfSwKKyAgICB7ICAgMCwgIDYxIH0sIHsgICAxLCAgNjQgfSwgeyAgIDAsICA2OCB9LCB7ICAtOSwgIDkyIH0sCisgICAgeyAgLTYsICA5MyB9LCB7ICAtNiwgIDg0IH0sIHsgIC04LCAgNzkgfSwgeyAgIDAsICA2NiB9LAorICAgIHsgIC0xLCAgNzEgfSwgeyAgIDAsICA2MiB9LCB7ICAtMiwgIDYwIH0sIHsgIC0yLCAgNTkgfSwKKyAgICB7ICAtNSwgIDc1IH0sIHsgIC0zLCAgNjIgfSwgeyAgLTQsICA1OCB9LCB7ICAtOSwgIDY2IH0sCisgICAgeyAgLTEsICA3OSB9LCB7ICAgMCwgIDcxIH0sIHsgICAzLCAgNjggfSwgeyAgMTAsICA0NCB9LAorICAgIHsgIC03LCAgNjIgfSwgeyAgMTUsICAzNiB9LCB7ICAxNCwgIDQwIH0sIHsgIDE2LCAgMjcgfSwKKyAgICB7ICAxMiwgIDI5IH0sIHsgICAxLCAgNDQgfSwgeyAgMjAsICAzNiB9LCB7ICAxOCwgIDMyIH0sCisgICAgeyAgIDUsICA0MiB9LCB7ICAgMSwgIDQ4IH0sIHsgIDEwLCAgNjIgfSwgeyAgMTcsICA0NiB9LAorICAgIHsgICA5LCAgNjQgfSwgeyAtMTIsIDEwNCB9LCB7IC0xMSwgIDk3IH0sIHsgLTE2LCAgOTYgfSwKKyAgICB7ICAtNywgIDg4IH0sIHsgIC04LCAgODUgfSwgeyAgLTcsICA4NSB9LCB7ICAtOSwgIDg1IH0sCisgICAgeyAtMTMsICA4OCB9LCB7ICAgNCwgIDY2IH0sIHsgIC0zLCAgNzcgfSwgeyAgLTMsICA3NiB9LAorICAgIHsgIC02LCAgNzYgfSwgeyAgMTAsICA1OCB9LCB7ICAtMSwgIDc2IH0sIHsgIC0xLCAgODMgfSwKKyAgICB7ICAtNiwgIDkzIH0sIHsgIC02LCAgODQgfSwgeyAgLTgsICA3OSB9LCB7ICAgMCwgIDY2IH0sCisgICAgeyAgLTEsICA3MSB9LCB7ICAgMCwgIDYyIH0sIHsgIC0yLCAgNjAgfSwgeyAgLTIsICA1OSB9LAorICAgIHsgIC01LCAgNzUgfSwgeyAgLTMsICA2MiB9LCB7ICAtNCwgIDU4IH0sIHsgIC05LCAgNjYgfSwKKyAgICB7ICAtMSwgIDc5IH0sIHsgICAwLCAgNzEgfSwgeyAgIDMsICA2OCB9LCB7ICAxMCwgIDQ0IH0sCisgICAgeyAgLTcsICA2MiB9LCB7ICAxNSwgIDM2IH0sIHsgIDE0LCAgNDAgfSwgeyAgMTYsICAyNyB9LAorICAgIHsgIDEyLCAgMjkgfSwgeyAgIDEsICA0NCB9LCB7ICAyMCwgIDM2IH0sIHsgIDE4LCAgMzIgfSwKKyAgICB7ICAgNSwgIDQyIH0sIHsgICAxLCAgNDggfSwgeyAgMTAsICA2MiB9LCB7ICAxNywgIDQ2IH0sCisgICAgeyAgIDksICA2NCB9LCB7IC0xMiwgMTA0IH0sIHsgLTExLCAgOTcgfSwgeyAtMTYsICA5NiB9LAorICAgIHsgIC03LCAgODggfSwgeyAgLTgsICA4NSB9LCB7ICAtNywgIDg1IH0sIHsgIC05LCAgODUgfSwKKyAgICB7IC0xMywgIDg4IH0sIHsgICA0LCAgNjYgfSwgeyAgLTMsICA3NyB9LCB7ICAtMywgIDc2IH0sCisgICAgeyAgLTYsICA3NiB9LCB7ICAxMCwgIDU4IH0sIHsgIC0xLCAgNzYgfSwgeyAgLTEsICA4MyB9LAorICAgIHsgIDE1LCAgIDYgfSwgeyAgIDYsICAxOSB9LCB7ICAgNywgIDE2IH0sIHsgIDEyLCAgMTQgfSwKKyAgICB7ICAxOCwgIDEzIH0sIHsgIDEzLCAgMTEgfSwgeyAgMTMsICAxNSB9LCB7ICAxNSwgIDE2IH0sCisgICAgeyAgMTIsICAyMyB9LCB7ICAxMywgIDIzIH0sIHsgIDE1LCAgMjAgfSwgeyAgMTQsICAyNiB9LAorICAgIHsgIDE0LCAgNDQgfSwgeyAgMTcsICA0MCB9LCB7ICAxNywgIDQ3IH0sIHsgIDI0LCAgMTcgfSwKKyAgICB7ICAyMSwgIDIxIH0sIHsgIDI1LCAgMjIgfSwgeyAgMzEsICAyNyB9LCB7ICAyMiwgIDI5IH0sCisgICAgeyAgMTksICAzNSB9LCB7ICAxNCwgIDUwIH0sIHsgIDEwLCAgNTcgfSwgeyAgIDcsICA2MyB9LAorICAgIHsgIC0yLCAgNzcgfSwgeyAgLTQsICA4MiB9LCB7ICAtMywgIDk0IH0sIHsgICA5LCAgNjkgfSwKKyAgICB7IC0xMiwgMTA5IH0sIHsgIDM2LCAtMzUgfSwgeyAgMzYsIC0zNCB9LCB7ICAzMiwgLTI2IH0sCisgICAgeyAgMzcsIC0zMCB9LCB7ICA0NCwgLTMyIH0sIHsgIDM0LCAtMTggfSwgeyAgMzQsIC0xNSB9LAorICAgIHsgIDQwLCAtMTUgfSwgeyAgMzMsICAtNyB9LCB7ICAzNSwgIC01IH0sIHsgIDMzLCAgIDAgfSwKKyAgICB7ICAzOCwgICAyIH0sIHsgIDMzLCAgMTMgfSwgeyAgMjMsICAzNSB9LCB7ICAxMywgIDU4IH0sCisgICAgeyAgMTUsICAgNiB9LCB7ICAgNiwgIDE5IH0sIHsgICA3LCAgMTYgfSwgeyAgMTIsICAxNCB9LAorICAgIHsgIDE4LCAgMTMgfSwgeyAgMTMsICAxMSB9LCB7ICAxMywgIDE1IH0sIHsgIDE1LCAgMTYgfSwKKyAgICB7ICAxMiwgIDIzIH0sIHsgIDEzLCAgMjMgfSwgeyAgMTUsICAyMCB9LCB7ICAxNCwgIDI2IH0sCisgICAgeyAgMTQsICA0NCB9LCB7ICAxNywgIDQwIH0sIHsgIDE3LCAgNDcgfSwgeyAgMjQsICAxNyB9LAorICAgIHsgIDIxLCAgMjEgfSwgeyAgMjUsICAyMiB9LCB7ICAzMSwgIDI3IH0sIHsgIDIyLCAgMjkgfSwKKyAgICB7ICAxOSwgIDM1IH0sIHsgIDE0LCAgNTAgfSwgeyAgMTAsICA1NyB9LCB7ICAgNywgIDYzIH0sCisgICAgeyAgLTIsICA3NyB9LCB7ICAtNCwgIDgyIH0sIHsgIC0zLCAgOTQgfSwgeyAgIDksICA2OSB9LAorICAgIHsgLTEyLCAxMDkgfSwgeyAgMzYsIC0zNSB9LCB7ICAzNiwgLTM0IH0sIHsgIDMyLCAtMjYgfSwKKyAgICB7ICAzNywgLTMwIH0sIHsgIDQ0LCAtMzIgfSwgeyAgMzQsIC0xOCB9LCB7ICAzNCwgLTE1IH0sCisgICAgeyAgNDAsIC0xNSB9LCB7ICAzMywgIC03IH0sIHsgIDM1LCAgLTUgfSwgeyAgMzMsICAgMCB9LAorICAgIHsgIDM4LCAgIDIgfSwgeyAgMzMsICAxMyB9LCB7ICAyMywgIDM1IH0sIHsgIDEzLCAgNTggfSwKKyAgICB7ICAtMywgIDcxIH0sIHsgIC02LCAgNDIgfSwgeyAgLTUsICA1MCB9LCB7ICAtMywgIDU0IH0sCisgICAgeyAgLTIsICA2MiB9LCB7ICAgMCwgIDU4IH0sIHsgICAxLCAgNjMgfSwgeyAgLTIsICA3MiB9LAorICAgIHsgIC0xLCAgNzQgfSwgeyAgLTksICA5MSB9LCB7ICAtNSwgIDY3IH0sIHsgIC01LCAgMjcgfSwKKyAgICB7ICAtMywgIDM5IH0sIHsgIC0yLCAgNDQgfSwgeyAgIDAsICA0NiB9LCB7IC0xNiwgIDY0IH0sCisgICAgeyAgLTgsICA2OCB9LCB7IC0xMCwgIDc4IH0sIHsgIC02LCAgNzcgfSwgeyAtMTAsICA4NiB9LAorICAgIHsgLTEyLCAgOTIgfSwgeyAtMTUsICA1NSB9LCB7IC0xMCwgIDYwIH0sIHsgIC02LCAgNjIgfSwKKyAgICB7ICAtNCwgIDY1IH0sIHsgLTEyLCAgNzMgfSwgeyAgLTgsICA3NiB9LCB7ICAtNywgIDgwIH0sCisgICAgeyAgLTksICA4OCB9LCB7IC0xNywgMTEwIH0sIHsgIC0zLCAgNzEgfSwgeyAgLTYsICA0MiB9LAorICAgIHsgIC01LCAgNTAgfSwgeyAgLTMsICA1NCB9LCB7ICAtMiwgIDYyIH0sIHsgICAwLCAgNTggfSwKKyAgICB7ICAgMSwgIDYzIH0sIHsgIC0yLCAgNzIgfSwgeyAgLTEsICA3NCB9LCB7ICAtOSwgIDkxIH0sCisgICAgeyAgLTUsICA2NyB9LCB7ICAtNSwgIDI3IH0sIHsgIC0zLCAgMzkgfSwgeyAgLTIsICA0NCB9LAorICAgIHsgICAwLCAgNDYgfSwgeyAtMTYsICA2NCB9LCB7ICAtOCwgIDY4IH0sIHsgLTEwLCAgNzggfSwKKyAgICB7ICAtNiwgIDc3IH0sIHsgLTEwLCAgODYgfSwgeyAtMTIsICA5MiB9LCB7IC0xNSwgIDU1IH0sCisgICAgeyAtMTAsICA2MCB9LCB7ICAtNiwgIDYyIH0sIHsgIC00LCAgNjUgfSwgeyAtMTIsICA3MyB9LAorICAgIHsgIC04LCAgNzYgfSwgeyAgLTcsICA4MCB9LCB7ICAtOSwgIDg4IH0sIHsgLTE3LCAxMTAgfSwKKyAgICB7ICAtMywgIDcwIH0sIHsgIC04LCAgOTMgfSwgeyAtMTAsICA5MCB9LCB7IC0zMCwgMTI3IH0sCisgICAgeyAgLTMsICA3MCB9LCB7ICAtOCwgIDkzIH0sIHsgLTEwLCAgOTAgfSwgeyAtMzAsIDEyNyB9LAorICAgIHsgIC0zLCAgNzAgfSwgeyAgLTgsICA5MyB9LCB7IC0xMCwgIDkwIH0sIHsgLTMwLCAxMjcgfQorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBjYWJhY19jb250ZXh0X2luaXRfUEJbM11bMTAyNF1bMl0gPQoreworICAgIC8qIGlfY2FiYWNfaW5pdF9pZGMgPT0gMCAqLworICAgIHsKKyAgICAgICAgLyogMCAtIDEwICovCisgICAgICAgIHsgIDIwLCAtMTUgfSwgeyAgIDIsICA1NCB9LCB7ICAgMywgIDc0IH0sIHsgIDIwLCAtMTUgfSwKKyAgICAgICAgeyAgIDIsICA1NCB9LCB7ICAgMywgIDc0IH0sIHsgLTI4LCAxMjcgfSwgeyAtMjMsIDEwNCB9LAorICAgICAgICB7ICAtNiwgIDUzIH0sIHsgIC0xLCAgNTQgfSwgeyAgIDcsICA1MSB9LAorCisgICAgICAgIC8qIDExIC0gMjMgKi8KKyAgICAgICAgeyAgMjMsICAzMyB9LCB7ICAyMywgICAyIH0sIHsgIDIxLCAgIDAgfSwgeyAgIDEsICAgOSB9LAorICAgICAgICB7ICAgMCwgIDQ5IH0sIHsgLTM3LCAxMTggfSwgeyAgIDUsICA1NyB9LCB7IC0xMywgIDc4IH0sCisgICAgICAgIHsgLTExLCAgNjUgfSwgeyAgIDEsICA2MiB9LCB7ICAxMiwgIDQ5IH0sIHsgIC00LCAgNzMgfSwKKyAgICAgICAgeyAgMTcsICA1MCB9LAorCisgICAgICAgIC8qIDI0IC0gMzkgKi8KKyAgICAgICAgeyAgMTgsICA2NCB9LCB7ICAgOSwgIDQzIH0sIHsgIDI5LCAgIDAgfSwgeyAgMjYsICA2NyB9LAorICAgICAgICB7ICAxNiwgIDkwIH0sIHsgICA5LCAxMDQgfSwgeyAtNDYsIDEyNyB9LCB7IC0yMCwgMTA0IH0sCisgICAgICAgIHsgICAxLCAgNjcgfSwgeyAtMTMsICA3OCB9LCB7IC0xMSwgIDY1IH0sIHsgICAxLCAgNjIgfSwKKyAgICAgICAgeyAgLTYsICA4NiB9LCB7IC0xNywgIDk1IH0sIHsgIC02LCAgNjEgfSwgeyAgIDksICA0NSB9LAorCisgICAgICAgIC8qIDQwIC0gNTMgKi8KKyAgICAgICAgeyAgLTMsICA2OSB9LCB7ICAtNiwgIDgxIH0sIHsgLTExLCAgOTYgfSwgeyAgIDYsICA1NSB9LAorICAgICAgICB7ICAgNywgIDY3IH0sIHsgIC01LCAgODYgfSwgeyAgIDIsICA4OCB9LCB7ICAgMCwgIDU4IH0sCisgICAgICAgIHsgIC0zLCAgNzYgfSwgeyAtMTAsICA5NCB9LCB7ICAgNSwgIDU0IH0sIHsgICA0LCAgNjkgfSwKKyAgICAgICAgeyAgLTMsICA4MSB9LCB7ICAgMCwgIDg4IH0sCisKKyAgICAgICAgLyogNTQgLSA1OSAqLworICAgICAgICB7ICAtNywgIDY3IH0sIHsgIC01LCAgNzQgfSwgeyAgLTQsICA3NCB9LCB7ICAtNSwgIDgwIH0sCisgICAgICAgIHsgIC03LCAgNzIgfSwgeyAgIDEsICA1OCB9LAorCisgICAgICAgIC8qIDYwIC0gNjkgKi8KKyAgICAgICAgeyAgIDAsICA0MSB9LCB7ICAgMCwgIDYzIH0sIHsgICAwLCAgNjMgfSwgeyAwLCA2MyB9LAorICAgICAgICB7ICAtOSwgIDgzIH0sIHsgICA0LCAgODYgfSwgeyAgIDAsICA5NyB9LCB7IC03LCA3MiB9LAorICAgICAgICB7ICAxMywgIDQxIH0sIHsgICAzLCAgNjIgfSwKKworICAgICAgICAvKiA3MCAtIDg3ICovCisgICAgICAgIHsgICAwLCAgNDUgfSwgeyAgLTQsICA3OCB9LCB7ICAtMywgIDk2IH0sIHsgLTI3LCAgMTI2IH0sCisgICAgICAgIHsgLTI4LCAgOTggfSwgeyAtMjUsIDEwMSB9LCB7IC0yMywgIDY3IH0sIHsgLTI4LCAgODIgfSwKKyAgICAgICAgeyAtMjAsICA5NCB9LCB7IC0xNiwgIDgzIH0sIHsgLTIyLCAxMTAgfSwgeyAtMjEsICA5MSB9LAorICAgICAgICB7IC0xOCwgMTAyIH0sIHsgLTEzLCAgOTMgfSwgeyAtMjksIDEyNyB9LCB7ICAtNywgIDkyIH0sCisgICAgICAgIHsgIC01LCAgODkgfSwgeyAgLTcsICA5NiB9LCB7IC0xMywgMTA4IH0sIHsgIC0zLCAgNDYgfSwKKyAgICAgICAgeyAgLTEsICA2NSB9LCB7ICAtMSwgIDU3IH0sIHsgIC05LCAgOTMgfSwgeyAgLTMsICA3NCB9LAorICAgICAgICB7ICAtOSwgIDkyIH0sIHsgIC04LCAgODcgfSwgeyAtMjMsIDEyNiB9LCB7ICAgNSwgIDU0IH0sCisgICAgICAgIHsgICA2LCAgNjAgfSwgeyAgIDYsICA1OSB9LCB7ICAgNiwgIDY5IH0sIHsgIC0xLCAgNDggfSwKKyAgICAgICAgeyAgIDAsICA2OCB9LCB7ICAtNCwgIDY5IH0sIHsgIC04LCAgODggfSwKKworICAgICAgICAvKiAxMDUgLT4gMTY1ICovCisgICAgICAgIHsgIC0yLCAgODUgfSwgeyAgLTYsICA3OCB9LCB7ICAtMSwgIDc1IH0sIHsgIC03LCAgNzcgfSwKKyAgICAgICAgeyAgIDIsICA1NCB9LCB7ICAgNSwgIDUwIH0sIHsgIC0zLCAgNjggfSwgeyAgIDEsICA1MCB9LAorICAgICAgICB7ICAgNiwgIDQyIH0sIHsgIC00LCAgODEgfSwgeyAgIDEsICA2MyB9LCB7ICAtNCwgIDcwIH0sCisgICAgICAgIHsgICAwLCAgNjcgfSwgeyAgIDIsICA1NyB9LCB7ICAtMiwgIDc2IH0sIHsgIDExLCAgMzUgfSwKKyAgICAgICAgeyAgIDQsICA2NCB9LCB7ICAgMSwgIDYxIH0sIHsgIDExLCAgMzUgfSwgeyAgMTgsICAyNSB9LAorICAgICAgICB7ICAxMiwgIDI0IH0sIHsgIDEzLCAgMjkgfSwgeyAgMTMsICAzNiB9LCB7IC0xMCwgIDkzIH0sCisgICAgICAgIHsgIC03LCAgNzMgfSwgeyAgLTIsICA3MyB9LCB7ICAxMywgIDQ2IH0sIHsgICA5LCAgNDkgfSwKKyAgICAgICAgeyAgLTcsIDEwMCB9LCB7ICAgOSwgIDUzIH0sIHsgICAyLCAgNTMgfSwgeyAgIDUsICA1MyB9LAorICAgICAgICB7ICAtMiwgIDYxIH0sIHsgICAwLCAgNTYgfSwgeyAgIDAsICA1NiB9LCB7IC0xMywgIDYzIH0sCisgICAgICAgIHsgIC01LCAgNjAgfSwgeyAgLTEsICA2MiB9LCB7ICAgNCwgIDU3IH0sIHsgIC02LCAgNjkgfSwKKyAgICAgICAgeyAgIDQsICA1NyB9LCB7ICAxNCwgIDM5IH0sIHsgICA0LCAgNTEgfSwgeyAgMTMsICA2OCB9LAorICAgICAgICB7ICAgMywgIDY0IH0sIHsgICAxLCAgNjEgfSwgeyAgIDksICA2MyB9LCB7ICAgNywgIDUwIH0sCisgICAgICAgIHsgIDE2LCAgMzkgfSwgeyAgIDUsICA0NCB9LCB7ICAgNCwgIDUyIH0sIHsgIDExLCAgNDggfSwKKyAgICAgICAgeyAgLTUsICA2MCB9LCB7ICAtMSwgIDU5IH0sIHsgICAwLCAgNTkgfSwgeyAgMjIsICAzMyB9LAorICAgICAgICB7ICAgNSwgIDQ0IH0sIHsgIDE0LCAgNDMgfSwgeyAgLTEsICA3OCB9LCB7ICAgMCwgIDYwIH0sCisgICAgICAgIHsgICA5LCAgNjkgfSwKKworICAgICAgICAvKiAxNjYgLSAyMjYgKi8KKyAgICAgICAgeyAgMTEsICAyOCB9LCB7ICAgMiwgIDQwIH0sIHsgICAzLCAgNDQgfSwgeyAgIDAsICA0OSB9LAorICAgICAgICB7ICAgMCwgIDQ2IH0sIHsgICAyLCAgNDQgfSwgeyAgIDIsICA1MSB9LCB7ICAgMCwgIDQ3IH0sCisgICAgICAgIHsgICA0LCAgMzkgfSwgeyAgIDIsICA2MiB9LCB7ICAgNiwgIDQ2IH0sIHsgICAwLCAgNTQgfSwKKyAgICAgICAgeyAgIDMsICA1NCB9LCB7ICAgMiwgIDU4IH0sIHsgICA0LCAgNjMgfSwgeyAgIDYsICA1MSB9LAorICAgICAgICB7ICAgNiwgIDU3IH0sIHsgICA3LCAgNTMgfSwgeyAgIDYsICA1MiB9LCB7ICAgNiwgIDU1IH0sCisgICAgICAgIHsgIDExLCAgNDUgfSwgeyAgMTQsICAzNiB9LCB7ICAgOCwgIDUzIH0sIHsgIC0xLCAgODIgfSwKKyAgICAgICAgeyAgIDcsICA1NSB9LCB7ICAtMywgIDc4IH0sIHsgIDE1LCAgNDYgfSwgeyAgMjIsICAzMSB9LAorICAgICAgICB7ICAtMSwgIDg0IH0sIHsgIDI1LCAgIDcgfSwgeyAgMzAsICAtNyB9LCB7ICAyOCwgICAzIH0sCisgICAgICAgIHsgIDI4LCAgIDQgfSwgeyAgMzIsICAgMCB9LCB7ICAzNCwgIC0xIH0sIHsgIDMwLCAgIDYgfSwKKyAgICAgICAgeyAgMzAsICAgNiB9LCB7ICAzMiwgICA5IH0sIHsgIDMxLCAgMTkgfSwgeyAgMjYsICAyNyB9LAorICAgICAgICB7ICAyNiwgIDMwIH0sIHsgIDM3LCAgMjAgfSwgeyAgMjgsICAzNCB9LCB7ICAxNywgIDcwIH0sCisgICAgICAgIHsgICAxLCAgNjcgfSwgeyAgIDUsICA1OSB9LCB7ICAgOSwgIDY3IH0sIHsgIDE2LCAgMzAgfSwKKyAgICAgICAgeyAgMTgsICAzMiB9LCB7ICAxOCwgIDM1IH0sIHsgIDIyLCAgMjkgfSwgeyAgMjQsICAzMSB9LAorICAgICAgICB7ICAyMywgIDM4IH0sIHsgIDE4LCAgNDMgfSwgeyAgMjAsICA0MSB9LCB7ICAxMSwgIDYzIH0sCisgICAgICAgIHsgICA5LCAgNTkgfSwgeyAgIDksICA2NCB9LCB7ICAtMSwgIDk0IH0sIHsgIC0yLCAgODkgfSwKKyAgICAgICAgeyAgLTksIDEwOCB9LAorCisgICAgICAgIC8qIDIyNyAtIDI3NSAqLworICAgICAgICB7ICAtNiwgIDc2IH0sIHsgIC0yLCAgNDQgfSwgeyAgIDAsICA0NSB9LCB7ICAgMCwgIDUyIH0sCisgICAgICAgIHsgIC0zLCAgNjQgfSwgeyAgLTIsICA1OSB9LCB7ICAtNCwgIDcwIH0sIHsgIC00LCAgNzUgfSwKKyAgICAgICAgeyAgLTgsICA4MiB9LCB7IC0xNywgMTAyIH0sIHsgIC05LCAgNzcgfSwgeyAgIDMsICAyNCB9LAorICAgICAgICB7ICAgMCwgIDQyIH0sIHsgICAwLCAgNDggfSwgeyAgIDAsICA1NSB9LCB7ICAtNiwgIDU5IH0sCisgICAgICAgIHsgIC03LCAgNzEgfSwgeyAtMTIsICA4MyB9LCB7IC0xMSwgIDg3IH0sIHsgLTMwLCAxMTkgfSwKKyAgICAgICAgeyAgIDEsICA1OCB9LCB7ICAtMywgIDI5IH0sIHsgIC0xLCAgMzYgfSwgeyAgIDEsICAzOCB9LAorICAgICAgICB7ICAgMiwgIDQzIH0sIHsgIC02LCAgNTUgfSwgeyAgIDAsICA1OCB9LCB7ICAgMCwgIDY0IH0sCisgICAgICAgIHsgIC0zLCAgNzQgfSwgeyAtMTAsICA5MCB9LCB7ICAgMCwgIDcwIH0sIHsgIC00LCAgMjkgfSwKKyAgICAgICAgeyAgIDUsICAzMSB9LCB7ICAgNywgIDQyIH0sIHsgICAxLCAgNTkgfSwgeyAgLTIsICA1OCB9LAorICAgICAgICB7ICAtMywgIDcyIH0sIHsgIC0zLCAgODEgfSwgeyAtMTEsICA5NyB9LCB7ICAgMCwgIDU4IH0sCisgICAgICAgIHsgICA4LCAgIDUgfSwgeyAgMTAsICAxNCB9LCB7ICAxNCwgIDE4IH0sIHsgIDEzLCAgMjcgfSwKKyAgICAgICAgeyAgIDIsICA0MCB9LCB7ICAgMCwgIDU4IH0sIHsgIC0zLCAgNzAgfSwgeyAgLTYsICA3OSB9LAorICAgICAgICB7ICAtOCwgIDg1IH0sCisKKyAgICAgICAgLyogMjc2IGEgYml0IHNwZWNpYWwgKG5vdCB1c2VkLCBieXBhc3MgaXMgdXNlZCBpbnN0ZWFkKSAqLworICAgICAgICB7IDAsIDAgfSwKKworICAgICAgICAvKiAyNzcgLSAzMzcgKi8KKyAgICAgICAgeyAtMTMsIDEwNiB9LCB7IC0xNiwgMTA2IH0sIHsgLTEwLCAgODcgfSwgeyAtMjEsIDExNCB9LAorICAgICAgICB7IC0xOCwgMTEwIH0sIHsgLTE0LCAgOTggfSwgeyAtMjIsIDExMCB9LCB7IC0yMSwgMTA2IH0sCisgICAgICAgIHsgLTE4LCAxMDMgfSwgeyAtMjEsIDEwNyB9LCB7IC0yMywgMTA4IH0sIHsgLTI2LCAxMTIgfSwKKyAgICAgICAgeyAtMTAsICA5NiB9LCB7IC0xMiwgIDk1IH0sIHsgIC01LCAgOTEgfSwgeyAgLTksICA5MyB9LAorICAgICAgICB7IC0yMiwgIDk0IH0sIHsgIC01LCAgODYgfSwgeyAgIDksICA2NyB9LCB7ICAtNCwgIDgwIH0sCisgICAgICAgIHsgLTEwLCAgODUgfSwgeyAgLTEsICA3MCB9LCB7ICAgNywgIDYwIH0sIHsgICA5LCAgNTggfSwKKyAgICAgICAgeyAgIDUsICA2MSB9LCB7ICAxMiwgIDUwIH0sIHsgIDE1LCAgNTAgfSwgeyAgMTgsICA0OSB9LAorICAgICAgICB7ICAxNywgIDU0IH0sIHsgIDEwLCAgNDEgfSwgeyAgIDcsICA0NiB9LCB7ICAtMSwgIDUxIH0sCisgICAgICAgIHsgICA3LCAgNDkgfSwgeyAgIDgsICA1MiB9LCB7ICAgOSwgIDQxIH0sIHsgICA2LCAgNDcgfSwKKyAgICAgICAgeyAgIDIsICA1NSB9LCB7ICAxMywgIDQxIH0sIHsgIDEwLCAgNDQgfSwgeyAgIDYsICA1MCB9LAorICAgICAgICB7ICAgNSwgIDUzIH0sIHsgIDEzLCAgNDkgfSwgeyAgIDQsICA2MyB9LCB7ICAgNiwgIDY0IH0sCisgICAgICAgIHsgIC0yLCAgNjkgfSwgeyAgLTIsICA1OSB9LCB7ICAgNiwgIDcwIH0sIHsgIDEwLCAgNDQgfSwKKyAgICAgICAgeyAgIDksICAzMSB9LCB7ICAxMiwgIDQzIH0sIHsgICAzLCAgNTMgfSwgeyAgMTQsICAzNCB9LAorICAgICAgICB7ICAxMCwgIDM4IH0sIHsgIC0zLCAgNTIgfSwgeyAgMTMsICA0MCB9LCB7ICAxNywgIDMyIH0sCisgICAgICAgIHsgICA3LCAgNDQgfSwgeyAgIDcsICAzOCB9LCB7ICAxMywgIDUwIH0sIHsgIDEwLCAgNTcgfSwKKyAgICAgICAgeyAgMjYsICA0MyB9LAorCisgICAgICAgIC8qIDMzOCAtIDM5OCAqLworICAgICAgICB7ICAxNCwgIDExIH0sIHsgIDExLCAgMTQgfSwgeyAgIDksICAxMSB9LCB7ICAxOCwgIDExIH0sCisgICAgICAgIHsgIDIxLCAgIDkgfSwgeyAgMjMsICAtMiB9LCB7ICAzMiwgLTE1IH0sIHsgIDMyLCAtMTUgfSwKKyAgICAgICAgeyAgMzQsIC0yMSB9LCB7ICAzOSwgLTIzIH0sIHsgIDQyLCAtMzMgfSwgeyAgNDEsIC0zMSB9LAorICAgICAgICB7ICA0NiwgLTI4IH0sIHsgIDM4LCAtMTIgfSwgeyAgMjEsICAyOSB9LCB7ICA0NSwgLTI0IH0sCisgICAgICAgIHsgIDUzLCAtNDUgfSwgeyAgNDgsIC0yNiB9LCB7ICA2NSwgLTQzIH0sIHsgIDQzLCAtMTkgfSwKKyAgICAgICAgeyAgMzksIC0xMCB9LCB7ICAzMCwgICA5IH0sIHsgIDE4LCAgMjYgfSwgeyAgMjAsICAyNyB9LAorICAgICAgICB7ICAgMCwgIDU3IH0sIHsgLTE0LCAgODIgfSwgeyAgLTUsICA3NSB9LCB7IC0xOSwgIDk3IH0sCisgICAgICAgIHsgLTM1LCAxMjUgfSwgeyAgMjcsICAgMCB9LCB7ICAyOCwgICAwIH0sIHsgIDMxLCAgLTQgfSwKKyAgICAgICAgeyAgMjcsICAgNiB9LCB7ICAzNCwgICA4IH0sIHsgIDMwLCAgMTAgfSwgeyAgMjQsICAyMiB9LAorICAgICAgICB7ICAzMywgIDE5IH0sIHsgIDIyLCAgMzIgfSwgeyAgMjYsICAzMSB9LCB7ICAyMSwgIDQxIH0sCisgICAgICAgIHsgIDI2LCAgNDQgfSwgeyAgMjMsICA0NyB9LCB7ICAxNiwgIDY1IH0sIHsgIDE0LCAgNzEgfSwKKyAgICAgICAgeyAgIDgsICA2MCB9LCB7ICAgNiwgIDYzIH0sIHsgIDE3LCAgNjUgfSwgeyAgMjEsICAyNCB9LAorICAgICAgICB7ICAyMywgIDIwIH0sIHsgIDI2LCAgMjMgfSwgeyAgMjcsICAzMiB9LCB7ICAyOCwgIDIzIH0sCisgICAgICAgIHsgIDI4LCAgMjQgfSwgeyAgMjMsICA0MCB9LCB7ICAyNCwgIDMyIH0sIHsgIDI4LCAgMjkgfSwKKyAgICAgICAgeyAgMjMsICA0MiB9LCB7ICAxOSwgIDU3IH0sIHsgIDIyLCAgNTMgfSwgeyAgMjIsICA2MSB9LAorICAgICAgICB7ICAxMSwgIDg2IH0sCisKKyAgICAgICAgLyogMzk5IC0gNDM1ICovCisgICAgICAgIHsgIDEyLCAgNDAgfSwgeyAgMTEsICA1MSB9LCB7ICAxNCwgIDU5IH0sCisgICAgICAgIHsgIC00LCAgNzkgfSwgeyAgLTcsICA3MSB9LCB7ICAtNSwgIDY5IH0sIHsgIC05LCAgNzAgfSwKKyAgICAgICAgeyAgLTgsICA2NiB9LCB7IC0xMCwgIDY4IH0sIHsgLTE5LCAgNzMgfSwgeyAtMTIsICA2OSB9LAorICAgICAgICB7IC0xNiwgIDcwIH0sIHsgLTE1LCAgNjcgfSwgeyAtMjAsICA2MiB9LCB7IC0xOSwgIDcwIH0sCisgICAgICAgIHsgLTE2LCAgNjYgfSwgeyAtMjIsICA2NSB9LCB7IC0yMCwgIDYzIH0sIHsgICA5LCAgLTIgfSwKKyAgICAgICAgeyAgMjYsICAtOSB9LCB7ICAzMywgIC05IH0sIHsgIDM5LCAgLTcgfSwgeyAgNDEsICAtMiB9LAorICAgICAgICB7ICA0NSwgICAzIH0sIHsgIDQ5LCAgIDkgfSwgeyAgNDUsICAyNyB9LCB7ICAzNiwgIDU5IH0sCisgICAgICAgIHsgIC02LCAgNjYgfSwgeyAgLTcsICAzNSB9LCB7ICAtNywgIDQyIH0sIHsgIC04LCAgNDUgfSwKKyAgICAgICAgeyAgLTUsICA0OCB9LCB7IC0xMiwgIDU2IH0sIHsgIC02LCAgNjAgfSwgeyAgLTUsICA2MiB9LAorICAgICAgICB7ICAtOCwgIDY2IH0sIHsgIC04LCAgNzYgfSwKKworICAgICAgICAvKiA0MzYgLSA0NTkgKi8KKyAgICAgICAgeyAgLTUsICA4NSB9LCB7ICAtNiwgIDgxIH0sIHsgLTEwLCAgNzcgfSwgeyAgLTcsICA4MSB9LAorICAgICAgICB7IC0xNywgIDgwIH0sIHsgLTE4LCAgNzMgfSwgeyAgLTQsICA3NCB9LCB7IC0xMCwgIDgzIH0sCisgICAgICAgIHsgIC05LCAgNzEgfSwgeyAgLTksICA2NyB9LCB7ICAtMSwgIDYxIH0sIHsgIC04LCAgNjYgfSwKKyAgICAgICAgeyAtMTQsICA2NiB9LCB7ICAgMCwgIDU5IH0sIHsgICAyLCAgNTkgfSwgeyAgMjEsIC0xMyB9LAorICAgICAgICB7ICAzMywgLTE0IH0sIHsgIDM5LCAgLTcgfSwgeyAgNDYsICAtMiB9LCB7ICA1MSwgICAyIH0sCisgICAgICAgIHsgIDYwLCAgIDYgfSwgeyAgNjEsICAxNyB9LCB7ICA1NSwgIDM0IH0sIHsgIDQyLCAgNjIgfSwKKworICAgICAgICAvKiA0NjAgLSAxMDI0ICovCisgICAgICAgIHsgIC03LCAgOTIgfSwgeyAgLTUsICA4OSB9LCB7ICAtNywgIDk2IH0sIHsgLTEzLCAxMDggfSwKKyAgICAgICAgeyAgLTMsICA0NiB9LCB7ICAtMSwgIDY1IH0sIHsgIC0xLCAgNTcgfSwgeyAgLTksICA5MyB9LAorICAgICAgICB7ICAtMywgIDc0IH0sIHsgIC05LCAgOTIgfSwgeyAgLTgsICA4NyB9LCB7IC0yMywgMTI2IH0sCisgICAgICAgIHsgIC03LCAgOTIgfSwgeyAgLTUsICA4OSB9LCB7ICAtNywgIDk2IH0sIHsgLTEzLCAxMDggfSwKKyAgICAgICAgeyAgLTMsICA0NiB9LCB7ICAtMSwgIDY1IH0sIHsgIC0xLCAgNTcgfSwgeyAgLTksICA5MyB9LAorICAgICAgICB7ICAtMywgIDc0IH0sIHsgIC05LCAgOTIgfSwgeyAgLTgsICA4NyB9LCB7IC0yMywgMTI2IH0sCisgICAgICAgIHsgIC0yLCAgODUgfSwgeyAgLTYsICA3OCB9LCB7ICAtMSwgIDc1IH0sIHsgIC03LCAgNzcgfSwKKyAgICAgICAgeyAgIDIsICA1NCB9LCB7ICAgNSwgIDUwIH0sIHsgIC0zLCAgNjggfSwgeyAgIDEsICA1MCB9LAorICAgICAgICB7ICAgNiwgIDQyIH0sIHsgIC00LCAgODEgfSwgeyAgIDEsICA2MyB9LCB7ICAtNCwgIDcwIH0sCisgICAgICAgIHsgICAwLCAgNjcgfSwgeyAgIDIsICA1NyB9LCB7ICAtMiwgIDc2IH0sIHsgIDExLCAgMzUgfSwKKyAgICAgICAgeyAgIDQsICA2NCB9LCB7ICAgMSwgIDYxIH0sIHsgIDExLCAgMzUgfSwgeyAgMTgsICAyNSB9LAorICAgICAgICB7ICAxMiwgIDI0IH0sIHsgIDEzLCAgMjkgfSwgeyAgMTMsICAzNiB9LCB7IC0xMCwgIDkzIH0sCisgICAgICAgIHsgIC03LCAgNzMgfSwgeyAgLTIsICA3MyB9LCB7ICAxMywgIDQ2IH0sIHsgICA5LCAgNDkgfSwKKyAgICAgICAgeyAgLTcsIDEwMCB9LCB7ICAgOSwgIDUzIH0sIHsgICAyLCAgNTMgfSwgeyAgIDUsICA1MyB9LAorICAgICAgICB7ICAtMiwgIDYxIH0sIHsgICAwLCAgNTYgfSwgeyAgIDAsICA1NiB9LCB7IC0xMywgIDYzIH0sCisgICAgICAgIHsgIC01LCAgNjAgfSwgeyAgLTEsICA2MiB9LCB7ICAgNCwgIDU3IH0sIHsgIC02LCAgNjkgfSwKKyAgICAgICAgeyAgIDQsICA1NyB9LCB7ICAxNCwgIDM5IH0sIHsgICA0LCAgNTEgfSwgeyAgMTMsICA2OCB9LAorICAgICAgICB7ICAtMiwgIDg1IH0sIHsgIC02LCAgNzggfSwgeyAgLTEsICA3NSB9LCB7ICAtNywgIDc3IH0sCisgICAgICAgIHsgICAyLCAgNTQgfSwgeyAgIDUsICA1MCB9LCB7ICAtMywgIDY4IH0sIHsgICAxLCAgNTAgfSwKKyAgICAgICAgeyAgIDYsICA0MiB9LCB7ICAtNCwgIDgxIH0sIHsgICAxLCAgNjMgfSwgeyAgLTQsICA3MCB9LAorICAgICAgICB7ICAgMCwgIDY3IH0sIHsgICAyLCAgNTcgfSwgeyAgLTIsICA3NiB9LCB7ICAxMSwgIDM1IH0sCisgICAgICAgIHsgICA0LCAgNjQgfSwgeyAgIDEsICA2MSB9LCB7ICAxMSwgIDM1IH0sIHsgIDE4LCAgMjUgfSwKKyAgICAgICAgeyAgMTIsICAyNCB9LCB7ICAxMywgIDI5IH0sIHsgIDEzLCAgMzYgfSwgeyAtMTAsICA5MyB9LAorICAgICAgICB7ICAtNywgIDczIH0sIHsgIC0yLCAgNzMgfSwgeyAgMTMsICA0NiB9LCB7ICAgOSwgIDQ5IH0sCisgICAgICAgIHsgIC03LCAxMDAgfSwgeyAgIDksICA1MyB9LCB7ICAgMiwgIDUzIH0sIHsgICA1LCAgNTMgfSwKKyAgICAgICAgeyAgLTIsICA2MSB9LCB7ICAgMCwgIDU2IH0sIHsgICAwLCAgNTYgfSwgeyAtMTMsICA2MyB9LAorICAgICAgICB7ICAtNSwgIDYwIH0sIHsgIC0xLCAgNjIgfSwgeyAgIDQsICA1NyB9LCB7ICAtNiwgIDY5IH0sCisgICAgICAgIHsgICA0LCAgNTcgfSwgeyAgMTQsICAzOSB9LCB7ICAgNCwgIDUxIH0sIHsgIDEzLCAgNjggfSwKKyAgICAgICAgeyAgMTEsICAyOCB9LCB7ICAgMiwgIDQwIH0sIHsgICAzLCAgNDQgfSwgeyAgIDAsICA0OSB9LAorICAgICAgICB7ICAgMCwgIDQ2IH0sIHsgICAyLCAgNDQgfSwgeyAgIDIsICA1MSB9LCB7ICAgMCwgIDQ3IH0sCisgICAgICAgIHsgICA0LCAgMzkgfSwgeyAgIDIsICA2MiB9LCB7ICAgNiwgIDQ2IH0sIHsgICAwLCAgNTQgfSwKKyAgICAgICAgeyAgIDMsICA1NCB9LCB7ICAgMiwgIDU4IH0sIHsgICA0LCAgNjMgfSwgeyAgIDYsICA1MSB9LAorICAgICAgICB7ICAgNiwgIDU3IH0sIHsgICA3LCAgNTMgfSwgeyAgIDYsICA1MiB9LCB7ICAgNiwgIDU1IH0sCisgICAgICAgIHsgIDExLCAgNDUgfSwgeyAgMTQsICAzNiB9LCB7ICAgOCwgIDUzIH0sIHsgIC0xLCAgODIgfSwKKyAgICAgICAgeyAgIDcsICA1NSB9LCB7ICAtMywgIDc4IH0sIHsgIDE1LCAgNDYgfSwgeyAgMjIsICAzMSB9LAorICAgICAgICB7ICAtMSwgIDg0IH0sIHsgIDI1LCAgIDcgfSwgeyAgMzAsICAtNyB9LCB7ICAyOCwgICAzIH0sCisgICAgICAgIHsgIDI4LCAgIDQgfSwgeyAgMzIsICAgMCB9LCB7ICAzNCwgIC0xIH0sIHsgIDMwLCAgIDYgfSwKKyAgICAgICAgeyAgMzAsICAgNiB9LCB7ICAzMiwgICA5IH0sIHsgIDMxLCAgMTkgfSwgeyAgMjYsICAyNyB9LAorICAgICAgICB7ICAyNiwgIDMwIH0sIHsgIDM3LCAgMjAgfSwgeyAgMjgsICAzNCB9LCB7ICAxNywgIDcwIH0sCisgICAgICAgIHsgIDExLCAgMjggfSwgeyAgIDIsICA0MCB9LCB7ICAgMywgIDQ0IH0sIHsgICAwLCAgNDkgfSwKKyAgICAgICAgeyAgIDAsICA0NiB9LCB7ICAgMiwgIDQ0IH0sIHsgICAyLCAgNTEgfSwgeyAgIDAsICA0NyB9LAorICAgICAgICB7ICAgNCwgIDM5IH0sIHsgICAyLCAgNjIgfSwgeyAgIDYsICA0NiB9LCB7ICAgMCwgIDU0IH0sCisgICAgICAgIHsgICAzLCAgNTQgfSwgeyAgIDIsICA1OCB9LCB7ICAgNCwgIDYzIH0sIHsgICA2LCAgNTEgfSwKKyAgICAgICAgeyAgIDYsICA1NyB9LCB7ICAgNywgIDUzIH0sIHsgICA2LCAgNTIgfSwgeyAgIDYsICA1NSB9LAorICAgICAgICB7ICAxMSwgIDQ1IH0sIHsgIDE0LCAgMzYgfSwgeyAgIDgsICA1MyB9LCB7ICAtMSwgIDgyIH0sCisgICAgICAgIHsgICA3LCAgNTUgfSwgeyAgLTMsICA3OCB9LCB7ICAxNSwgIDQ2IH0sIHsgIDIyLCAgMzEgfSwKKyAgICAgICAgeyAgLTEsICA4NCB9LCB7ICAyNSwgICA3IH0sIHsgIDMwLCAgLTcgfSwgeyAgMjgsICAgMyB9LAorICAgICAgICB7ICAyOCwgICA0IH0sIHsgIDMyLCAgIDAgfSwgeyAgMzQsICAtMSB9LCB7ICAzMCwgICA2IH0sCisgICAgICAgIHsgIDMwLCAgIDYgfSwgeyAgMzIsICAgOSB9LCB7ICAzMSwgIDE5IH0sIHsgIDI2LCAgMjcgfSwKKyAgICAgICAgeyAgMjYsICAzMCB9LCB7ICAzNywgIDIwIH0sIHsgIDI4LCAgMzQgfSwgeyAgMTcsICA3MCB9LAorICAgICAgICB7ICAtNCwgIDc5IH0sIHsgIC03LCAgNzEgfSwgeyAgLTUsICA2OSB9LCB7ICAtOSwgIDcwIH0sCisgICAgICAgIHsgIC04LCAgNjYgfSwgeyAtMTAsICA2OCB9LCB7IC0xOSwgIDczIH0sIHsgLTEyLCAgNjkgfSwKKyAgICAgICAgeyAtMTYsICA3MCB9LCB7IC0xNSwgIDY3IH0sIHsgLTIwLCAgNjIgfSwgeyAtMTksICA3MCB9LAorICAgICAgICB7IC0xNiwgIDY2IH0sIHsgLTIyLCAgNjUgfSwgeyAtMjAsICA2MyB9LCB7ICAtNSwgIDg1IH0sCisgICAgICAgIHsgIC02LCAgODEgfSwgeyAtMTAsICA3NyB9LCB7ICAtNywgIDgxIH0sIHsgLTE3LCAgODAgfSwKKyAgICAgICAgeyAtMTgsICA3MyB9LCB7ICAtNCwgIDc0IH0sIHsgLTEwLCAgODMgfSwgeyAgLTksICA3MSB9LAorICAgICAgICB7ICAtOSwgIDY3IH0sIHsgIC0xLCAgNjEgfSwgeyAgLTgsICA2NiB9LCB7IC0xNCwgIDY2IH0sCisgICAgICAgIHsgICAwLCAgNTkgfSwgeyAgIDIsICA1OSB9LCB7ICAgOSwgIC0yIH0sIHsgIDI2LCAgLTkgfSwKKyAgICAgICAgeyAgMzMsICAtOSB9LCB7ICAzOSwgIC03IH0sIHsgIDQxLCAgLTIgfSwgeyAgNDUsICAgMyB9LAorICAgICAgICB7ICA0OSwgICA5IH0sIHsgIDQ1LCAgMjcgfSwgeyAgMzYsICA1OSB9LCB7ICAyMSwgLTEzIH0sCisgICAgICAgIHsgIDMzLCAtMTQgfSwgeyAgMzksICAtNyB9LCB7ICA0NiwgIC0yIH0sIHsgIDUxLCAgIDIgfSwKKyAgICAgICAgeyAgNjAsICAgNiB9LCB7ICA2MSwgIDE3IH0sIHsgIDU1LCAgMzQgfSwgeyAgNDIsICA2MiB9LAorICAgICAgICB7ICAtNiwgIDY2IH0sIHsgIC03LCAgMzUgfSwgeyAgLTcsICA0MiB9LCB7ICAtOCwgIDQ1IH0sCisgICAgICAgIHsgIC01LCAgNDggfSwgeyAtMTIsICA1NiB9LCB7ICAtNiwgIDYwIH0sIHsgIC01LCAgNjIgfSwKKyAgICAgICAgeyAgLTgsICA2NiB9LCB7ICAtOCwgIDc2IH0sIHsgIC00LCAgNzkgfSwgeyAgLTcsICA3MSB9LAorICAgICAgICB7ICAtNSwgIDY5IH0sIHsgIC05LCAgNzAgfSwgeyAgLTgsICA2NiB9LCB7IC0xMCwgIDY4IH0sCisgICAgICAgIHsgLTE5LCAgNzMgfSwgeyAtMTIsICA2OSB9LCB7IC0xNiwgIDcwIH0sIHsgLTE1LCAgNjcgfSwKKyAgICAgICAgeyAtMjAsICA2MiB9LCB7IC0xOSwgIDcwIH0sIHsgLTE2LCAgNjYgfSwgeyAtMjIsICA2NSB9LAorICAgICAgICB7IC0yMCwgIDYzIH0sIHsgIC01LCAgODUgfSwgeyAgLTYsICA4MSB9LCB7IC0xMCwgIDc3IH0sCisgICAgICAgIHsgIC03LCAgODEgfSwgeyAtMTcsICA4MCB9LCB7IC0xOCwgIDczIH0sIHsgIC00LCAgNzQgfSwKKyAgICAgICAgeyAtMTAsICA4MyB9LCB7ICAtOSwgIDcxIH0sIHsgIC05LCAgNjcgfSwgeyAgLTEsICA2MSB9LAorICAgICAgICB7ICAtOCwgIDY2IH0sIHsgLTE0LCAgNjYgfSwgeyAgIDAsICA1OSB9LCB7ICAgMiwgIDU5IH0sCisgICAgICAgIHsgICA5LCAgLTIgfSwgeyAgMjYsICAtOSB9LCB7ICAzMywgIC05IH0sIHsgIDM5LCAgLTcgfSwKKyAgICAgICAgeyAgNDEsICAtMiB9LCB7ICA0NSwgICAzIH0sIHsgIDQ5LCAgIDkgfSwgeyAgNDUsICAyNyB9LAorICAgICAgICB7ICAzNiwgIDU5IH0sIHsgIDIxLCAtMTMgfSwgeyAgMzMsIC0xNCB9LCB7ICAzOSwgIC03IH0sCisgICAgICAgIHsgIDQ2LCAgLTIgfSwgeyAgNTEsICAgMiB9LCB7ICA2MCwgICA2IH0sIHsgIDYxLCAgMTcgfSwKKyAgICAgICAgeyAgNTUsICAzNCB9LCB7ICA0MiwgIDYyIH0sIHsgIC02LCAgNjYgfSwgeyAgLTcsICAzNSB9LAorICAgICAgICB7ICAtNywgIDQyIH0sIHsgIC04LCAgNDUgfSwgeyAgLTUsICA0OCB9LCB7IC0xMiwgIDU2IH0sCisgICAgICAgIHsgIC02LCAgNjAgfSwgeyAgLTUsICA2MiB9LCB7ICAtOCwgIDY2IH0sIHsgIC04LCAgNzYgfSwKKyAgICAgICAgeyAtMTMsIDEwNiB9LCB7IC0xNiwgMTA2IH0sIHsgLTEwLCAgODcgfSwgeyAtMjEsIDExNCB9LAorICAgICAgICB7IC0xOCwgMTEwIH0sIHsgLTE0LCAgOTggfSwgeyAtMjIsIDExMCB9LCB7IC0yMSwgMTA2IH0sCisgICAgICAgIHsgLTE4LCAxMDMgfSwgeyAtMjEsIDEwNyB9LCB7IC0yMywgMTA4IH0sIHsgLTI2LCAxMTIgfSwKKyAgICAgICAgeyAtMTAsICA5NiB9LCB7IC0xMiwgIDk1IH0sIHsgIC01LCAgOTEgfSwgeyAgLTksICA5MyB9LAorICAgICAgICB7IC0yMiwgIDk0IH0sIHsgIC01LCAgODYgfSwgeyAgIDksICA2NyB9LCB7ICAtNCwgIDgwIH0sCisgICAgICAgIHsgLTEwLCAgODUgfSwgeyAgLTEsICA3MCB9LCB7ICAgNywgIDYwIH0sIHsgICA5LCAgNTggfSwKKyAgICAgICAgeyAgIDUsICA2MSB9LCB7ICAxMiwgIDUwIH0sIHsgIDE1LCAgNTAgfSwgeyAgMTgsICA0OSB9LAorICAgICAgICB7ICAxNywgIDU0IH0sIHsgIDEwLCAgNDEgfSwgeyAgIDcsICA0NiB9LCB7ICAtMSwgIDUxIH0sCisgICAgICAgIHsgICA3LCAgNDkgfSwgeyAgIDgsICA1MiB9LCB7ICAgOSwgIDQxIH0sIHsgICA2LCAgNDcgfSwKKyAgICAgICAgeyAgIDIsICA1NSB9LCB7ICAxMywgIDQxIH0sIHsgIDEwLCAgNDQgfSwgeyAgIDYsICA1MCB9LAorICAgICAgICB7ICAgNSwgIDUzIH0sIHsgIDEzLCAgNDkgfSwgeyAgIDQsICA2MyB9LCB7ICAgNiwgIDY0IH0sCisgICAgICAgIHsgLTEzLCAxMDYgfSwgeyAtMTYsIDEwNiB9LCB7IC0xMCwgIDg3IH0sIHsgLTIxLCAxMTQgfSwKKyAgICAgICAgeyAtMTgsIDExMCB9LCB7IC0xNCwgIDk4IH0sIHsgLTIyLCAxMTAgfSwgeyAtMjEsIDEwNiB9LAorICAgICAgICB7IC0xOCwgMTAzIH0sIHsgLTIxLCAxMDcgfSwgeyAtMjMsIDEwOCB9LCB7IC0yNiwgMTEyIH0sCisgICAgICAgIHsgLTEwLCAgOTYgfSwgeyAtMTIsICA5NSB9LCB7ICAtNSwgIDkxIH0sIHsgIC05LCAgOTMgfSwKKyAgICAgICAgeyAtMjIsICA5NCB9LCB7ICAtNSwgIDg2IH0sIHsgICA5LCAgNjcgfSwgeyAgLTQsICA4MCB9LAorICAgICAgICB7IC0xMCwgIDg1IH0sIHsgIC0xLCAgNzAgfSwgeyAgIDcsICA2MCB9LCB7ICAgOSwgIDU4IH0sCisgICAgICAgIHsgICA1LCAgNjEgfSwgeyAgMTIsICA1MCB9LCB7ICAxNSwgIDUwIH0sIHsgIDE4LCAgNDkgfSwKKyAgICAgICAgeyAgMTcsICA1NCB9LCB7ICAxMCwgIDQxIH0sIHsgICA3LCAgNDYgfSwgeyAgLTEsICA1MSB9LAorICAgICAgICB7ICAgNywgIDQ5IH0sIHsgICA4LCAgNTIgfSwgeyAgIDksICA0MSB9LCB7ICAgNiwgIDQ3IH0sCisgICAgICAgIHsgICAyLCAgNTUgfSwgeyAgMTMsICA0MSB9LCB7ICAxMCwgIDQ0IH0sIHsgICA2LCAgNTAgfSwKKyAgICAgICAgeyAgIDUsICA1MyB9LCB7ICAxMywgIDQ5IH0sIHsgICA0LCAgNjMgfSwgeyAgIDYsICA2NCB9LAorICAgICAgICB7ICAxNCwgIDExIH0sIHsgIDExLCAgMTQgfSwgeyAgIDksICAxMSB9LCB7ICAxOCwgIDExIH0sCisgICAgICAgIHsgIDIxLCAgIDkgfSwgeyAgMjMsICAtMiB9LCB7ICAzMiwgLTE1IH0sIHsgIDMyLCAtMTUgfSwKKyAgICAgICAgeyAgMzQsIC0yMSB9LCB7ICAzOSwgLTIzIH0sIHsgIDQyLCAtMzMgfSwgeyAgNDEsIC0zMSB9LAorICAgICAgICB7ICA0NiwgLTI4IH0sIHsgIDM4LCAtMTIgfSwgeyAgMjEsICAyOSB9LCB7ICA0NSwgLTI0IH0sCisgICAgICAgIHsgIDUzLCAtNDUgfSwgeyAgNDgsIC0yNiB9LCB7ICA2NSwgLTQzIH0sIHsgIDQzLCAtMTkgfSwKKyAgICAgICAgeyAgMzksIC0xMCB9LCB7ICAzMCwgICA5IH0sIHsgIDE4LCAgMjYgfSwgeyAgMjAsICAyNyB9LAorICAgICAgICB7ICAgMCwgIDU3IH0sIHsgLTE0LCAgODIgfSwgeyAgLTUsICA3NSB9LCB7IC0xOSwgIDk3IH0sCisgICAgICAgIHsgLTM1LCAxMjUgfSwgeyAgMjcsICAgMCB9LCB7ICAyOCwgICAwIH0sIHsgIDMxLCAgLTQgfSwKKyAgICAgICAgeyAgMjcsICAgNiB9LCB7ICAzNCwgICA4IH0sIHsgIDMwLCAgMTAgfSwgeyAgMjQsICAyMiB9LAorICAgICAgICB7ICAzMywgIDE5IH0sIHsgIDIyLCAgMzIgfSwgeyAgMjYsICAzMSB9LCB7ICAyMSwgIDQxIH0sCisgICAgICAgIHsgIDI2LCAgNDQgfSwgeyAgMjMsICA0NyB9LCB7ICAxNiwgIDY1IH0sIHsgIDE0LCAgNzEgfSwKKyAgICAgICAgeyAgMTQsICAxMSB9LCB7ICAxMSwgIDE0IH0sIHsgICA5LCAgMTEgfSwgeyAgMTgsICAxMSB9LAorICAgICAgICB7ICAyMSwgICA5IH0sIHsgIDIzLCAgLTIgfSwgeyAgMzIsIC0xNSB9LCB7ICAzMiwgLTE1IH0sCisgICAgICAgIHsgIDM0LCAtMjEgfSwgeyAgMzksIC0yMyB9LCB7ICA0MiwgLTMzIH0sIHsgIDQxLCAtMzEgfSwKKyAgICAgICAgeyAgNDYsIC0yOCB9LCB7ICAzOCwgLTEyIH0sIHsgIDIxLCAgMjkgfSwgeyAgNDUsIC0yNCB9LAorICAgICAgICB7ICA1MywgLTQ1IH0sIHsgIDQ4LCAtMjYgfSwgeyAgNjUsIC00MyB9LCB7ICA0MywgLTE5IH0sCisgICAgICAgIHsgIDM5LCAtMTAgfSwgeyAgMzAsICAgOSB9LCB7ICAxOCwgIDI2IH0sIHsgIDIwLCAgMjcgfSwKKyAgICAgICAgeyAgIDAsICA1NyB9LCB7IC0xNCwgIDgyIH0sIHsgIC01LCAgNzUgfSwgeyAtMTksICA5NyB9LAorICAgICAgICB7IC0zNSwgMTI1IH0sIHsgIDI3LCAgIDAgfSwgeyAgMjgsICAgMCB9LCB7ICAzMSwgIC00IH0sCisgICAgICAgIHsgIDI3LCAgIDYgfSwgeyAgMzQsICAgOCB9LCB7ICAzMCwgIDEwIH0sIHsgIDI0LCAgMjIgfSwKKyAgICAgICAgeyAgMzMsICAxOSB9LCB7ICAyMiwgIDMyIH0sIHsgIDI2LCAgMzEgfSwgeyAgMjEsICA0MSB9LAorICAgICAgICB7ICAyNiwgIDQ0IH0sIHsgIDIzLCAgNDcgfSwgeyAgMTYsICA2NSB9LCB7ICAxNCwgIDcxIH0sCisgICAgICAgIHsgIC02LCAgNzYgfSwgeyAgLTIsICA0NCB9LCB7ICAgMCwgIDQ1IH0sIHsgICAwLCAgNTIgfSwKKyAgICAgICAgeyAgLTMsICA2NCB9LCB7ICAtMiwgIDU5IH0sIHsgIC00LCAgNzAgfSwgeyAgLTQsICA3NSB9LAorICAgICAgICB7ICAtOCwgIDgyIH0sIHsgLTE3LCAxMDIgfSwgeyAgLTksICA3NyB9LCB7ICAgMywgIDI0IH0sCisgICAgICAgIHsgICAwLCAgNDIgfSwgeyAgIDAsICA0OCB9LCB7ICAgMCwgIDU1IH0sIHsgIC02LCAgNTkgfSwKKyAgICAgICAgeyAgLTcsICA3MSB9LCB7IC0xMiwgIDgzIH0sIHsgLTExLCAgODcgfSwgeyAtMzAsIDExOSB9LAorICAgICAgICB7ICAgMSwgIDU4IH0sIHsgIC0zLCAgMjkgfSwgeyAgLTEsICAzNiB9LCB7ICAgMSwgIDM4IH0sCisgICAgICAgIHsgICAyLCAgNDMgfSwgeyAgLTYsICA1NSB9LCB7ICAgMCwgIDU4IH0sIHsgICAwLCAgNjQgfSwKKyAgICAgICAgeyAgLTMsICA3NCB9LCB7IC0xMCwgIDkwIH0sIHsgIC02LCAgNzYgfSwgeyAgLTIsICA0NCB9LAorICAgICAgICB7ICAgMCwgIDQ1IH0sIHsgICAwLCAgNTIgfSwgeyAgLTMsICA2NCB9LCB7ICAtMiwgIDU5IH0sCisgICAgICAgIHsgIC00LCAgNzAgfSwgeyAgLTQsICA3NSB9LCB7ICAtOCwgIDgyIH0sIHsgLTE3LCAxMDIgfSwKKyAgICAgICAgeyAgLTksICA3NyB9LCB7ICAgMywgIDI0IH0sIHsgICAwLCAgNDIgfSwgeyAgIDAsICA0OCB9LAorICAgICAgICB7ICAgMCwgIDU1IH0sIHsgIC02LCAgNTkgfSwgeyAgLTcsICA3MSB9LCB7IC0xMiwgIDgzIH0sCisgICAgICAgIHsgLTExLCAgODcgfSwgeyAtMzAsIDExOSB9LCB7ICAgMSwgIDU4IH0sIHsgIC0zLCAgMjkgfSwKKyAgICAgICAgeyAgLTEsICAzNiB9LCB7ICAgMSwgIDM4IH0sIHsgICAyLCAgNDMgfSwgeyAgLTYsICA1NSB9LAorICAgICAgICB7ICAgMCwgIDU4IH0sIHsgICAwLCAgNjQgfSwgeyAgLTMsICA3NCB9LCB7IC0xMCwgIDkwIH0sCisgICAgICAgIHsgIC0zLCAgNzQgfSwgeyAgLTksICA5MiB9LCB7ICAtOCwgIDg3IH0sIHsgLTIzLCAxMjYgfSwKKyAgICAgICAgeyAgLTMsICA3NCB9LCB7ICAtOSwgIDkyIH0sIHsgIC04LCAgODcgfSwgeyAtMjMsIDEyNiB9LAorICAgICAgICB7ICAtMywgIDc0IH0sIHsgIC05LCAgOTIgfSwgeyAgLTgsICA4NyB9LCB7IC0yMywgMTI2IH0KKyAgICB9LAorCisgICAgLyogaV9jYWJhY19pbml0X2lkYyA9PSAxICovCisgICAgeworICAgICAgICAvKiAwIC0gMTAgKi8KKyAgICAgICAgeyAgMjAsIC0xNSB9LCB7ICAgMiwgIDU0IH0sIHsgICAzLCAgNzQgfSwgeyAgMjAsIC0xNSB9LAorICAgICAgICB7ICAgMiwgIDU0IH0sIHsgICAzLCAgNzQgfSwgeyAtMjgsIDEyNyB9LCB7IC0yMywgMTA0IH0sCisgICAgICAgIHsgIC02LCAgNTMgfSwgeyAgLTEsICA1NCB9LCB7ICAgNywgIDUxIH0sCisKKyAgICAgICAgLyogMTEgLSAyMyAqLworICAgICAgICB7ICAyMiwgIDI1IH0sIHsgIDM0LCAgIDAgfSwgeyAgMTYsICAgMCB9LCB7ICAtMiwgICA5IH0sCisgICAgICAgIHsgICA0LCAgNDEgfSwgeyAtMjksIDExOCB9LCB7ICAgMiwgIDY1IH0sIHsgIC02LCAgNzEgfSwKKyAgICAgICAgeyAtMTMsICA3OSB9LCB7ICAgNSwgIDUyIH0sIHsgICA5LCAgNTAgfSwgeyAgLTMsICA3MCB9LAorICAgICAgICB7ICAxMCwgIDU0IH0sCisKKyAgICAgICAgLyogMjQgLSAzOSAqLworICAgICAgICB7ICAyNiwgIDM0IH0sIHsgIDE5LCAgMjIgfSwgeyAgNDAsICAgMCB9LCB7ICA1NywgICAyIH0sCisgICAgICAgIHsgIDQxLCAgMzYgfSwgeyAgMjYsICA2OSB9LCB7IC00NSwgMTI3IH0sIHsgLTE1LCAxMDEgfSwKKyAgICAgICAgeyAgLTQsICA3NiB9LCB7ICAtNiwgIDcxIH0sIHsgLTEzLCAgNzkgfSwgeyAgIDUsICA1MiB9LAorICAgICAgICB7ICAgNiwgIDY5IH0sIHsgLTEzLCAgOTAgfSwgeyAgIDAsICA1MiB9LCB7ICAgOCwgIDQzIH0sCisKKyAgICAgICAgLyogNDAgLSA1MyAqLworICAgICAgICB7ICAtMiwgIDY5IH0seyAgLTUsICA4MiB9LHsgLTEwLCAgOTYgfSx7ICAgMiwgIDU5IH0sCisgICAgICAgIHsgICAyLCAgNzUgfSx7ICAtMywgIDg3IH0seyAgLTMsICAxMDAgfSx7ICAgMSwgIDU2IH0sCisgICAgICAgIHsgIC0zLCAgNzQgfSx7ICAtNiwgIDg1IH0seyAgIDAsICA1OSB9LHsgIC0zLCAgODEgfSwKKyAgICAgICAgeyAgLTcsICA4NiB9LHsgIC01LCAgOTUgfSwKKworICAgICAgICAvKiA1NCAtIDU5ICovCisgICAgICAgIHsgIC0xLCAgNjYgfSx7ICAtMSwgIDc3IH0seyAgIDEsICA3MCB9LHsgIC0yLCAgODYgfSwKKyAgICAgICAgeyAgLTUsICA3MiB9LHsgICAwLCAgNjEgfSwKKworICAgICAgICAvKiA2MCAtIDY5ICovCisgICAgICAgIHsgMCwgNDEgfSwgICB7IDAsIDYzIH0sICAgeyAwLCA2MyB9LCAgICAgeyAwLCA2MyB9LAorICAgICAgICB7IC05LCA4MyB9LCAgeyA0LCA4NiB9LCAgIHsgMCwgOTcgfSwgICAgIHsgLTcsIDcyIH0sCisgICAgICAgIHsgMTMsIDQxIH0sICB7IDMsIDYyIH0sCisKKyAgICAgICAgLyogNzAgLSAxMDQgKi8KKyAgICAgICAgeyAgMTMsICAxNSB9LCB7ICAgNywgIDUxIH0sIHsgICAyLCAgODAgfSwgeyAtMzksIDEyNyB9LAorICAgICAgICB7IC0xOCwgIDkxIH0sIHsgLTE3LCAgOTYgfSwgeyAtMjYsICA4MSB9LCB7IC0zNSwgIDk4IH0sCisgICAgICAgIHsgLTI0LCAxMDIgfSwgeyAtMjMsICA5NyB9LCB7IC0yNywgMTE5IH0sIHsgLTI0LCAgOTkgfSwKKyAgICAgICAgeyAtMjEsIDExMCB9LCB7IC0xOCwgMTAyIH0sIHsgLTM2LCAxMjcgfSwgeyAgIDAsICA4MCB9LAorICAgICAgICB7ICAtNSwgIDg5IH0sIHsgIC03LCAgOTQgfSwgeyAgLTQsICA5MiB9LCB7ICAgMCwgIDM5IH0sCisgICAgICAgIHsgICAwLCAgNjUgfSwgeyAtMTUsICA4NCB9LCB7IC0zNSwgMTI3IH0sIHsgIC0yLCAgNzMgfSwKKyAgICAgICAgeyAtMTIsIDEwNCB9LCB7ICAtOSwgIDkxIH0sIHsgLTMxLCAxMjcgfSwgeyAgIDMsICA1NSB9LAorICAgICAgICB7ICAgNywgIDU2IH0sIHsgICA3LCAgNTUgfSwgeyAgIDgsICA2MSB9LCB7ICAtMywgIDUzIH0sCisgICAgICAgIHsgICAwLCAgNjggfSwgeyAgLTcsICA3NCB9LCB7ICAtOSwgIDg4IH0sCisKKyAgICAgICAgLyogMTA1IC0+IDE2NSAqLworICAgICAgICB7IC0xMywgMTAzIH0sIHsgLTEzLCAgOTEgfSwgeyAgLTksICA4OSB9LCB7IC0xNCwgIDkyIH0sCisgICAgICAgIHsgIC04LCAgNzYgfSwgeyAtMTIsICA4NyB9LCB7IC0yMywgMTEwIH0sIHsgLTI0LCAxMDUgfSwKKyAgICAgICAgeyAtMTAsICA3OCB9LCB7IC0yMCwgMTEyIH0sIHsgLTE3LCAgOTkgfSwgeyAtNzgsIDEyNyB9LAorICAgICAgICB7IC03MCwgMTI3IH0sIHsgLTUwLCAxMjcgfSwgeyAtNDYsIDEyNyB9LCB7ICAtNCwgIDY2IH0sCisgICAgICAgIHsgIC01LCAgNzggfSwgeyAgLTQsICA3MSB9LCB7ICAtOCwgIDcyIH0sIHsgICAyLCAgNTkgfSwKKyAgICAgICAgeyAgLTEsICA1NSB9LCB7ICAtNywgIDcwIH0sIHsgIC02LCAgNzUgfSwgeyAgLTgsICA4OSB9LAorICAgICAgICB7IC0zNCwgMTE5IH0sIHsgIC0zLCAgNzUgfSwgeyAgMzIsICAyMCB9LCB7ICAzMCwgIDIyIH0sCisgICAgICAgIHsgLTQ0LCAxMjcgfSwgeyAgIDAsICA1NCB9LCB7ICAtNSwgIDYxIH0sIHsgICAwLCAgNTggfSwKKyAgICAgICAgeyAgLTEsICA2MCB9LCB7ICAtMywgIDYxIH0sIHsgIC04LCAgNjcgfSwgeyAtMjUsICA4NCB9LAorICAgICAgICB7IC0xNCwgIDc0IH0sIHsgIC01LCAgNjUgfSwgeyAgIDUsICA1MiB9LCB7ICAgMiwgIDU3IH0sCisgICAgICAgIHsgICAwLCAgNjEgfSwgeyAgLTksICA2OSB9LCB7IC0xMSwgIDcwIH0sIHsgIDE4LCAgNTUgfSwKKyAgICAgICAgeyAgLTQsICA3MSB9LCB7ICAgMCwgIDU4IH0sIHsgICA3LCAgNjEgfSwgeyAgIDksICA0MSB9LAorICAgICAgICB7ICAxOCwgIDI1IH0sIHsgICA5LCAgMzIgfSwgeyAgIDUsICA0MyB9LCB7ICAgOSwgIDQ3IH0sCisgICAgICAgIHsgICAwLCAgNDQgfSwgeyAgIDAsICA1MSB9LCB7ICAgMiwgIDQ2IH0sIHsgIDE5LCAgMzggfSwKKyAgICAgICAgeyAgLTQsICA2NiB9LCB7ICAxNSwgIDM4IH0sIHsgIDEyLCAgNDIgfSwgeyAgIDksICAzNCB9LAorICAgICAgICB7ICAgMCwgIDg5IH0sCisKKyAgICAgICAgLyogMTY2IC0gMjI2ICovCisgICAgICAgIHsgICA0LCAgNDUgfSwgeyAgMTAsICAyOCB9LCB7ICAxMCwgIDMxIH0sIHsgIDMzLCAtMTEgfSwKKyAgICAgICAgeyAgNTIsIC00MyB9LCB7ICAxOCwgIDE1IH0sIHsgIDI4LCAgIDAgfSwgeyAgMzUsIC0yMiB9LAorICAgICAgICB7ICAzOCwgLTI1IH0sIHsgIDM0LCAgIDAgfSwgeyAgMzksIC0xOCB9LCB7ICAzMiwgLTEyIH0sCisgICAgICAgIHsgMTAyLCAtOTQgfSwgeyAgIDAsICAgMCB9LCB7ICA1NiwgLTE1IH0sIHsgIDMzLCAgLTQgfSwKKyAgICAgICAgeyAgMjksICAxMCB9LCB7ICAzNywgIC01IH0sIHsgIDUxLCAtMjkgfSwgeyAgMzksICAtOSB9LAorICAgICAgICB7ICA1MiwgLTM0IH0sIHsgIDY5LCAtNTggfSwgeyAgNjcsIC02MyB9LCB7ICA0NCwgIC01IH0sCisgICAgICAgIHsgIDMyLCAgIDcgfSwgeyAgNTUsIC0yOSB9LCB7ICAzMiwgICAxIH0sIHsgICAwLCAgIDAgfSwKKyAgICAgICAgeyAgMjcsICAzNiB9LCB7ICAzMywgLTI1IH0sIHsgIDM0LCAtMzAgfSwgeyAgMzYsIC0yOCB9LAorICAgICAgICB7ICAzOCwgLTI4IH0sIHsgIDM4LCAtMjcgfSwgeyAgMzQsIC0xOCB9LCB7ICAzNSwgLTE2IH0sCisgICAgICAgIHsgIDM0LCAtMTQgfSwgeyAgMzIsICAtOCB9LCB7ICAzNywgIC02IH0sIHsgIDM1LCAgIDAgfSwKKyAgICAgICAgeyAgMzAsICAxMCB9LCB7ICAyOCwgIDE4IH0sIHsgIDI2LCAgMjUgfSwgeyAgMjksICA0MSB9LAorICAgICAgICB7ICAgMCwgIDc1IH0sIHsgICAyLCAgNzIgfSwgeyAgIDgsICA3NyB9LCB7ICAxNCwgIDM1IH0sCisgICAgICAgIHsgIDE4LCAgMzEgfSwgeyAgMTcsICAzNSB9LCB7ICAyMSwgIDMwIH0sIHsgIDE3LCAgNDUgfSwKKyAgICAgICAgeyAgMjAsICA0MiB9LCB7ICAxOCwgIDQ1IH0sIHsgIDI3LCAgMjYgfSwgeyAgMTYsICA1NCB9LAorICAgICAgICB7ICAgNywgIDY2IH0sIHsgIDE2LCAgNTYgfSwgeyAgMTEsICA3MyB9LCB7ICAxMCwgIDY3IH0sCisgICAgICAgIHsgLTEwLCAxMTYgfSwKKworICAgICAgICAvKiAyMjcgLSAyNzUgKi8KKyAgICAgICAgeyAtMjMsIDExMiB9LCB7IC0xNSwgIDcxIH0sIHsgIC03LCAgNjEgfSwgeyAgIDAsICA1MyB9LAorICAgICAgICB7ICAtNSwgIDY2IH0sIHsgLTExLCAgNzcgfSwgeyAgLTksICA4MCB9LCB7ICAtOSwgIDg0IH0sCisgICAgICAgIHsgLTEwLCAgODcgfSwgeyAtMzQsIDEyNyB9LCB7IC0yMSwgMTAxIH0sIHsgIC0zLCAgMzkgfSwKKyAgICAgICAgeyAgLTUsICA1MyB9LCB7ICAtNywgIDYxIH0sIHsgLTExLCAgNzUgfSwgeyAtMTUsICA3NyB9LAorICAgICAgICB7IC0xNywgIDkxIH0sIHsgLTI1LCAxMDcgfSwgeyAtMjUsIDExMSB9LCB7IC0yOCwgMTIyIH0sCisgICAgICAgIHsgLTExLCAgNzYgfSwgeyAtMTAsICA0NCB9LCB7IC0xMCwgIDUyIH0sIHsgLTEwLCAgNTcgfSwKKyAgICAgICAgeyAgLTksICA1OCB9LCB7IC0xNiwgIDcyIH0sIHsgIC03LCAgNjkgfSwgeyAgLTQsICA2OSB9LAorICAgICAgICB7ICAtNSwgIDc0IH0sIHsgIC05LCAgODYgfSwgeyAgIDIsICA2NiB9LCB7ICAtOSwgIDM0IH0sCisgICAgICAgIHsgICAxLCAgMzIgfSwgeyAgMTEsICAzMSB9LCB7ICAgNSwgIDUyIH0sIHsgIC0yLCAgNTUgfSwKKyAgICAgICAgeyAgLTIsICA2NyB9LCB7ICAgMCwgIDczIH0sIHsgIC04LCAgODkgfSwgeyAgIDMsICA1MiB9LAorICAgICAgICB7ICAgNywgICA0IH0sIHsgIDEwLCAgIDggfSwgeyAgMTcsICAgOCB9LCB7ICAxNiwgIDE5IH0sCisgICAgICAgIHsgICAzLCAgMzcgfSwgeyAgLTEsICA2MSB9LCB7ICAtNSwgIDczIH0sIHsgIC0xLCAgNzAgfSwKKyAgICAgICAgeyAgLTQsICA3OCB9LAorCisgICAgICAgIC8qIDI3NiBhIGJpdCBzcGVjaWFsIChub3QgdXNlZCwgYnlwYXNzIGlzIHVzZWQgaW5zdGVhZCkgKi8KKyAgICAgICAgeyAwLCAwIH0sCisKKyAgICAgICAgLyogMjc3IC0gMzM3ICovCisgICAgICAgIHsgLTIxLCAxMjYgfSwgeyAtMjMsIDEyNCB9LCB7IC0yMCwgMTEwIH0sIHsgLTI2LCAxMjYgfSwKKyAgICAgICAgeyAtMjUsIDEyNCB9LCB7IC0xNywgMTA1IH0sIHsgLTI3LCAxMjEgfSwgeyAtMjcsIDExNyB9LAorICAgICAgICB7IC0xNywgMTAyIH0sIHsgLTI2LCAxMTcgfSwgeyAtMjcsIDExNiB9LCB7IC0zMywgMTIyIH0sCisgICAgICAgIHsgLTEwLCAgOTUgfSwgeyAtMTQsIDEwMCB9LCB7ICAtOCwgIDk1IH0sIHsgLTE3LCAxMTEgfSwKKyAgICAgICAgeyAtMjgsIDExNCB9LCB7ICAtNiwgIDg5IH0sIHsgIC0yLCAgODAgfSwgeyAgLTQsICA4MiB9LAorICAgICAgICB7ICAtOSwgIDg1IH0sIHsgIC04LCAgODEgfSwgeyAgLTEsICA3MiB9LCB7ICAgNSwgIDY0IH0sCisgICAgICAgIHsgICAxLCAgNjcgfSwgeyAgIDksICA1NiB9LCB7ICAgMCwgIDY5IH0sIHsgICAxLCAgNjkgfSwKKyAgICAgICAgeyAgIDcsICA2OSB9LCB7ICAtNywgIDY5IH0sIHsgIC02LCAgNjcgfSwgeyAtMTYsICA3NyB9LAorICAgICAgICB7ICAtMiwgIDY0IH0sIHsgICAyLCAgNjEgfSwgeyAgLTYsICA2NyB9LCB7ICAtMywgIDY0IH0sCisgICAgICAgIHsgICAyLCAgNTcgfSwgeyAgLTMsICA2NSB9LCB7ICAtMywgIDY2IH0sIHsgICAwLCAgNjIgfSwKKyAgICAgICAgeyAgIDksICA1MSB9LCB7ICAtMSwgIDY2IH0sIHsgIC0yLCAgNzEgfSwgeyAgLTIsICA3NSB9LAorICAgICAgICB7ICAtMSwgIDcwIH0sIHsgIC05LCAgNzIgfSwgeyAgMTQsICA2MCB9LCB7ICAxNiwgIDM3IH0sCisgICAgICAgIHsgICAwLCAgNDcgfSwgeyAgMTgsICAzNSB9LCB7ICAxMSwgIDM3IH0sIHsgIDEyLCAgNDEgfSwKKyAgICAgICAgeyAgMTAsICA0MSB9LCB7ICAgMiwgIDQ4IH0sIHsgIDEyLCAgNDEgfSwgeyAgMTMsICA0MSB9LAorICAgICAgICB7ICAgMCwgIDU5IH0sIHsgICAzLCAgNTAgfSwgeyAgMTksICA0MCB9LCB7ICAgMywgIDY2IH0sCisgICAgICAgIHsgIDE4LCAgNTAgfSwKKworICAgICAgICAvKiAzMzggLSAzOTggKi8KKyAgICAgICAgeyAgMTksICAtNiB9LCB7ICAxOCwgIC02IH0sIHsgIDE0LCAgIDAgfSwgeyAgMjYsIC0xMiB9LAorICAgICAgICB7ICAzMSwgLTE2IH0sIHsgIDMzLCAtMjUgfSwgeyAgMzMsIC0yMiB9LCB7ICAzNywgLTI4IH0sCisgICAgICAgIHsgIDM5LCAtMzAgfSwgeyAgNDIsIC0zMCB9LCB7ICA0NywgLTQyIH0sIHsgIDQ1LCAtMzYgfSwKKyAgICAgICAgeyAgNDksIC0zNCB9LCB7ICA0MSwgLTE3IH0sIHsgIDMyLCAgIDkgfSwgeyAgNjksIC03MSB9LAorICAgICAgICB7ICA2MywgLTYzIH0sIHsgIDY2LCAtNjQgfSwgeyAgNzcsIC03NCB9LCB7ICA1NCwgLTM5IH0sCisgICAgICAgIHsgIDUyLCAtMzUgfSwgeyAgNDEsIC0xMCB9LCB7ICAzNiwgICAwIH0sIHsgIDQwLCAgLTEgfSwKKyAgICAgICAgeyAgMzAsICAxNCB9LCB7ICAyOCwgIDI2IH0sIHsgIDIzLCAgMzcgfSwgeyAgMTIsICA1NSB9LAorICAgICAgICB7ICAxMSwgIDY1IH0sIHsgIDM3LCAtMzMgfSwgeyAgMzksIC0zNiB9LCB7ICA0MCwgLTM3IH0sCisgICAgICAgIHsgIDM4LCAtMzAgfSwgeyAgNDYsIC0zMyB9LCB7ICA0MiwgLTMwIH0sIHsgIDQwLCAtMjQgfSwKKyAgICAgICAgeyAgNDksIC0yOSB9LCB7ICAzOCwgLTEyIH0sIHsgIDQwLCAtMTAgfSwgeyAgMzgsICAtMyB9LAorICAgICAgICB7ICA0NiwgIC01IH0sIHsgIDMxLCAgMjAgfSwgeyAgMjksICAzMCB9LCB7ICAyNSwgIDQ0IH0sCisgICAgICAgIHsgIDEyLCAgNDggfSwgeyAgMTEsICA0OSB9LCB7ICAyNiwgIDQ1IH0sIHsgIDIyLCAgMjIgfSwKKyAgICAgICAgeyAgMjMsICAyMiB9LCB7ICAyNywgIDIxIH0sIHsgIDMzLCAgMjAgfSwgeyAgMjYsICAyOCB9LAorICAgICAgICB7ICAzMCwgIDI0IH0sIHsgIDI3LCAgMzQgfSwgeyAgMTgsICA0MiB9LCB7ICAyNSwgIDM5IH0sCisgICAgICAgIHsgIDE4LCAgNTAgfSwgeyAgMTIsICA3MCB9LCB7ICAyMSwgIDU0IH0sIHsgIDE0LCAgNzEgfSwKKyAgICAgICAgeyAgMTEsICA4MyB9LAorCisgICAgICAgIC8qIDM5OSAtIDQzNSAqLworICAgICAgICB7ICAyNSwgIDMyIH0sIHsgIDIxLCAgNDkgfSwgeyAgMjEsICA1NCB9LAorICAgICAgICB7ICAtNSwgIDg1IH0sIHsgIC02LCAgODEgfSwgeyAtMTAsICA3NyB9LCB7ICAtNywgIDgxIH0sCisgICAgICAgIHsgLTE3LCAgODAgfSwgeyAtMTgsICA3MyB9LCB7ICAtNCwgIDc0IH0sIHsgLTEwLCAgODMgfSwKKyAgICAgICAgeyAgLTksICA3MSB9LCB7ICAtOSwgIDY3IH0sIHsgIC0xLCAgNjEgfSwgeyAgLTgsICA2NiB9LAorICAgICAgICB7IC0xNCwgIDY2IH0sIHsgICAwLCAgNTkgfSwgeyAgIDIsICA1OSB9LCB7ICAxNywgLTEwIH0sCisgICAgICAgIHsgIDMyLCAtMTMgfSwgeyAgNDIsICAtOSB9LCB7ICA0OSwgIC01IH0sIHsgIDUzLCAgIDAgfSwKKyAgICAgICAgeyAgNjQsICAgMyB9LCB7ICA2OCwgIDEwIH0sIHsgIDY2LCAgMjcgfSwgeyAgNDcsICA1NyB9LAorICAgICAgICB7ICAtNSwgIDcxIH0sIHsgICAwLCAgMjQgfSwgeyAgLTEsICAzNiB9LCB7ICAtMiwgIDQyIH0sCisgICAgICAgIHsgIC0yLCAgNTIgfSwgeyAgLTksICA1NyB9LCB7ICAtNiwgIDYzIH0sIHsgIC00LCAgNjUgfSwKKyAgICAgICAgeyAgLTQsICA2NyB9LCB7ICAtNywgIDgyIH0sCisKKyAgICAgICAgLyogNDM2IC0gNDU5ICovCisgICAgICAgIHsgIC0zLCAgODEgfSwgeyAgLTMsICA3NiB9LCB7ICAtNywgIDcyIH0sIHsgIC02LCAgNzggfSwKKyAgICAgICAgeyAtMTIsICA3MiB9LCB7IC0xNCwgIDY4IH0sIHsgIC0zLCAgNzAgfSwgeyAgLTYsICA3NiB9LAorICAgICAgICB7ICAtNSwgIDY2IH0sIHsgIC01LCAgNjIgfSwgeyAgIDAsICA1NyB9LCB7ICAtNCwgIDYxIH0sCisgICAgICAgIHsgIC05LCAgNjAgfSwgeyAgIDEsICA1NCB9LCB7ICAgMiwgIDU4IH0sIHsgIDE3LCAtMTAgfSwKKyAgICAgICAgeyAgMzIsIC0xMyB9LCB7ICA0MiwgIC05IH0sIHsgIDQ5LCAgLTUgfSwgeyAgNTMsICAgMCB9LAorICAgICAgICB7ICA2NCwgICAzIH0sIHsgIDY4LCAgMTAgfSwgeyAgNjYsICAyNyB9LCB7ICA0NywgIDU3IH0sCisKKyAgICAgICAgLyogNDYwIC0gMTAyNCAqLworICAgICAgICB7ICAgMCwgIDgwIH0sIHsgIC01LCAgODkgfSwgeyAgLTcsICA5NCB9LCB7ICAtNCwgIDkyIH0sCisgICAgICAgIHsgICAwLCAgMzkgfSwgeyAgIDAsICA2NSB9LCB7IC0xNSwgIDg0IH0sIHsgLTM1LCAxMjcgfSwKKyAgICAgICAgeyAgLTIsICA3MyB9LCB7IC0xMiwgMTA0IH0sIHsgIC05LCAgOTEgfSwgeyAtMzEsIDEyNyB9LAorICAgICAgICB7ICAgMCwgIDgwIH0sIHsgIC01LCAgODkgfSwgeyAgLTcsICA5NCB9LCB7ICAtNCwgIDkyIH0sCisgICAgICAgIHsgICAwLCAgMzkgfSwgeyAgIDAsICA2NSB9LCB7IC0xNSwgIDg0IH0sIHsgLTM1LCAxMjcgfSwKKyAgICAgICAgeyAgLTIsICA3MyB9LCB7IC0xMiwgMTA0IH0sIHsgIC05LCAgOTEgfSwgeyAtMzEsIDEyNyB9LAorICAgICAgICB7IC0xMywgMTAzIH0sIHsgLTEzLCAgOTEgfSwgeyAgLTksICA4OSB9LCB7IC0xNCwgIDkyIH0sCisgICAgICAgIHsgIC04LCAgNzYgfSwgeyAtMTIsICA4NyB9LCB7IC0yMywgMTEwIH0sIHsgLTI0LCAxMDUgfSwKKyAgICAgICAgeyAtMTAsICA3OCB9LCB7IC0yMCwgMTEyIH0sIHsgLTE3LCAgOTkgfSwgeyAtNzgsIDEyNyB9LAorICAgICAgICB7IC03MCwgMTI3IH0sIHsgLTUwLCAxMjcgfSwgeyAtNDYsIDEyNyB9LCB7ICAtNCwgIDY2IH0sCisgICAgICAgIHsgIC01LCAgNzggfSwgeyAgLTQsICA3MSB9LCB7ICAtOCwgIDcyIH0sIHsgICAyLCAgNTkgfSwKKyAgICAgICAgeyAgLTEsICA1NSB9LCB7ICAtNywgIDcwIH0sIHsgIC02LCAgNzUgfSwgeyAgLTgsICA4OSB9LAorICAgICAgICB7IC0zNCwgMTE5IH0sIHsgIC0zLCAgNzUgfSwgeyAgMzIsICAyMCB9LCB7ICAzMCwgIDIyIH0sCisgICAgICAgIHsgLTQ0LCAxMjcgfSwgeyAgIDAsICA1NCB9LCB7ICAtNSwgIDYxIH0sIHsgICAwLCAgNTggfSwKKyAgICAgICAgeyAgLTEsICA2MCB9LCB7ICAtMywgIDYxIH0sIHsgIC04LCAgNjcgfSwgeyAtMjUsICA4NCB9LAorICAgICAgICB7IC0xNCwgIDc0IH0sIHsgIC01LCAgNjUgfSwgeyAgIDUsICA1MiB9LCB7ICAgMiwgIDU3IH0sCisgICAgICAgIHsgICAwLCAgNjEgfSwgeyAgLTksICA2OSB9LCB7IC0xMSwgIDcwIH0sIHsgIDE4LCAgNTUgfSwKKyAgICAgICAgeyAtMTMsIDEwMyB9LCB7IC0xMywgIDkxIH0sIHsgIC05LCAgODkgfSwgeyAtMTQsICA5MiB9LAorICAgICAgICB7ICAtOCwgIDc2IH0sIHsgLTEyLCAgODcgfSwgeyAtMjMsIDExMCB9LCB7IC0yNCwgMTA1IH0sCisgICAgICAgIHsgLTEwLCAgNzggfSwgeyAtMjAsIDExMiB9LCB7IC0xNywgIDk5IH0sIHsgLTc4LCAxMjcgfSwKKyAgICAgICAgeyAtNzAsIDEyNyB9LCB7IC01MCwgMTI3IH0sIHsgLTQ2LCAxMjcgfSwgeyAgLTQsICA2NiB9LAorICAgICAgICB7ICAtNSwgIDc4IH0sIHsgIC00LCAgNzEgfSwgeyAgLTgsICA3MiB9LCB7ICAgMiwgIDU5IH0sCisgICAgICAgIHsgIC0xLCAgNTUgfSwgeyAgLTcsICA3MCB9LCB7ICAtNiwgIDc1IH0sIHsgIC04LCAgODkgfSwKKyAgICAgICAgeyAtMzQsIDExOSB9LCB7ICAtMywgIDc1IH0sIHsgIDMyLCAgMjAgfSwgeyAgMzAsICAyMiB9LAorICAgICAgICB7IC00NCwgMTI3IH0sIHsgICAwLCAgNTQgfSwgeyAgLTUsICA2MSB9LCB7ICAgMCwgIDU4IH0sCisgICAgICAgIHsgIC0xLCAgNjAgfSwgeyAgLTMsICA2MSB9LCB7ICAtOCwgIDY3IH0sIHsgLTI1LCAgODQgfSwKKyAgICAgICAgeyAtMTQsICA3NCB9LCB7ICAtNSwgIDY1IH0sIHsgICA1LCAgNTIgfSwgeyAgIDIsICA1NyB9LAorICAgICAgICB7ICAgMCwgIDYxIH0sIHsgIC05LCAgNjkgfSwgeyAtMTEsICA3MCB9LCB7ICAxOCwgIDU1IH0sCisgICAgICAgIHsgICA0LCAgNDUgfSwgeyAgMTAsICAyOCB9LCB7ICAxMCwgIDMxIH0sIHsgIDMzLCAtMTEgfSwKKyAgICAgICAgeyAgNTIsIC00MyB9LCB7ICAxOCwgIDE1IH0sIHsgIDI4LCAgIDAgfSwgeyAgMzUsIC0yMiB9LAorICAgICAgICB7ICAzOCwgLTI1IH0sIHsgIDM0LCAgIDAgfSwgeyAgMzksIC0xOCB9LCB7ICAzMiwgLTEyIH0sCisgICAgICAgIHsgMTAyLCAtOTQgfSwgeyAgIDAsICAgMCB9LCB7ICA1NiwgLTE1IH0sIHsgIDMzLCAgLTQgfSwKKyAgICAgICAgeyAgMjksICAxMCB9LCB7ICAzNywgIC01IH0sIHsgIDUxLCAtMjkgfSwgeyAgMzksICAtOSB9LAorICAgICAgICB7ICA1MiwgLTM0IH0sIHsgIDY5LCAtNTggfSwgeyAgNjcsIC02MyB9LCB7ICA0NCwgIC01IH0sCisgICAgICAgIHsgIDMyLCAgIDcgfSwgeyAgNTUsIC0yOSB9LCB7ICAzMiwgICAxIH0sIHsgICAwLCAgIDAgfSwKKyAgICAgICAgeyAgMjcsICAzNiB9LCB7ICAzMywgLTI1IH0sIHsgIDM0LCAtMzAgfSwgeyAgMzYsIC0yOCB9LAorICAgICAgICB7ICAzOCwgLTI4IH0sIHsgIDM4LCAtMjcgfSwgeyAgMzQsIC0xOCB9LCB7ICAzNSwgLTE2IH0sCisgICAgICAgIHsgIDM0LCAtMTQgfSwgeyAgMzIsICAtOCB9LCB7ICAzNywgIC02IH0sIHsgIDM1LCAgIDAgfSwKKyAgICAgICAgeyAgMzAsICAxMCB9LCB7ICAyOCwgIDE4IH0sIHsgIDI2LCAgMjUgfSwgeyAgMjksICA0MSB9LAorICAgICAgICB7ICAgNCwgIDQ1IH0sIHsgIDEwLCAgMjggfSwgeyAgMTAsICAzMSB9LCB7ICAzMywgLTExIH0sCisgICAgICAgIHsgIDUyLCAtNDMgfSwgeyAgMTgsICAxNSB9LCB7ICAyOCwgICAwIH0sIHsgIDM1LCAtMjIgfSwKKyAgICAgICAgeyAgMzgsIC0yNSB9LCB7ICAzNCwgICAwIH0sIHsgIDM5LCAtMTggfSwgeyAgMzIsIC0xMiB9LAorICAgICAgICB7IDEwMiwgLTk0IH0sIHsgICAwLCAgIDAgfSwgeyAgNTYsIC0xNSB9LCB7ICAzMywgIC00IH0sCisgICAgICAgIHsgIDI5LCAgMTAgfSwgeyAgMzcsICAtNSB9LCB7ICA1MSwgLTI5IH0sIHsgIDM5LCAgLTkgfSwKKyAgICAgICAgeyAgNTIsIC0zNCB9LCB7ICA2OSwgLTU4IH0sIHsgIDY3LCAtNjMgfSwgeyAgNDQsICAtNSB9LAorICAgICAgICB7ICAzMiwgICA3IH0sIHsgIDU1LCAtMjkgfSwgeyAgMzIsICAgMSB9LCB7ICAgMCwgICAwIH0sCisgICAgICAgIHsgIDI3LCAgMzYgfSwgeyAgMzMsIC0yNSB9LCB7ICAzNCwgLTMwIH0sIHsgIDM2LCAtMjggfSwKKyAgICAgICAgeyAgMzgsIC0yOCB9LCB7ICAzOCwgLTI3IH0sIHsgIDM0LCAtMTggfSwgeyAgMzUsIC0xNiB9LAorICAgICAgICB7ICAzNCwgLTE0IH0sIHsgIDMyLCAgLTggfSwgeyAgMzcsICAtNiB9LCB7ICAzNSwgICAwIH0sCisgICAgICAgIHsgIDMwLCAgMTAgfSwgeyAgMjgsICAxOCB9LCB7ICAyNiwgIDI1IH0sIHsgIDI5LCAgNDEgfSwKKyAgICAgICAgeyAgLTUsICA4NSB9LCB7ICAtNiwgIDgxIH0sIHsgLTEwLCAgNzcgfSwgeyAgLTcsICA4MSB9LAorICAgICAgICB7IC0xNywgIDgwIH0sIHsgLTE4LCAgNzMgfSwgeyAgLTQsICA3NCB9LCB7IC0xMCwgIDgzIH0sCisgICAgICAgIHsgIC05LCAgNzEgfSwgeyAgLTksICA2NyB9LCB7ICAtMSwgIDYxIH0sIHsgIC04LCAgNjYgfSwKKyAgICAgICAgeyAtMTQsICA2NiB9LCB7ICAgMCwgIDU5IH0sIHsgICAyLCAgNTkgfSwgeyAgLTMsICA4MSB9LAorICAgICAgICB7ICAtMywgIDc2IH0sIHsgIC03LCAgNzIgfSwgeyAgLTYsICA3OCB9LCB7IC0xMiwgIDcyIH0sCisgICAgICAgIHsgLTE0LCAgNjggfSwgeyAgLTMsICA3MCB9LCB7ICAtNiwgIDc2IH0sIHsgIC01LCAgNjYgfSwKKyAgICAgICAgeyAgLTUsICA2MiB9LCB7ICAgMCwgIDU3IH0sIHsgIC00LCAgNjEgfSwgeyAgLTksICA2MCB9LAorICAgICAgICB7ICAgMSwgIDU0IH0sIHsgICAyLCAgNTggfSwgeyAgMTcsIC0xMCB9LCB7ICAzMiwgLTEzIH0sCisgICAgICAgIHsgIDQyLCAgLTkgfSwgeyAgNDksICAtNSB9LCB7ICA1MywgICAwIH0sIHsgIDY0LCAgIDMgfSwKKyAgICAgICAgeyAgNjgsICAxMCB9LCB7ICA2NiwgIDI3IH0sIHsgIDQ3LCAgNTcgfSwgeyAgMTcsIC0xMCB9LAorICAgICAgICB7ICAzMiwgLTEzIH0sIHsgIDQyLCAgLTkgfSwgeyAgNDksICAtNSB9LCB7ICA1MywgICAwIH0sCisgICAgICAgIHsgIDY0LCAgIDMgfSwgeyAgNjgsICAxMCB9LCB7ICA2NiwgIDI3IH0sIHsgIDQ3LCAgNTcgfSwKKyAgICAgICAgeyAgLTUsICA3MSB9LCB7ICAgMCwgIDI0IH0sIHsgIC0xLCAgMzYgfSwgeyAgLTIsICA0MiB9LAorICAgICAgICB7ICAtMiwgIDUyIH0sIHsgIC05LCAgNTcgfSwgeyAgLTYsICA2MyB9LCB7ICAtNCwgIDY1IH0sCisgICAgICAgIHsgIC00LCAgNjcgfSwgeyAgLTcsICA4MiB9LCB7ICAtNSwgIDg1IH0sIHsgIC02LCAgODEgfSwKKyAgICAgICAgeyAtMTAsICA3NyB9LCB7ICAtNywgIDgxIH0sIHsgLTE3LCAgODAgfSwgeyAtMTgsICA3MyB9LAorICAgICAgICB7ICAtNCwgIDc0IH0sIHsgLTEwLCAgODMgfSwgeyAgLTksICA3MSB9LCB7ICAtOSwgIDY3IH0sCisgICAgICAgIHsgIC0xLCAgNjEgfSwgeyAgLTgsICA2NiB9LCB7IC0xNCwgIDY2IH0sIHsgICAwLCAgNTkgfSwKKyAgICAgICAgeyAgIDIsICA1OSB9LCB7ICAtMywgIDgxIH0sIHsgIC0zLCAgNzYgfSwgeyAgLTcsICA3MiB9LAorICAgICAgICB7ICAtNiwgIDc4IH0sIHsgLTEyLCAgNzIgfSwgeyAtMTQsICA2OCB9LCB7ICAtMywgIDcwIH0sCisgICAgICAgIHsgIC02LCAgNzYgfSwgeyAgLTUsICA2NiB9LCB7ICAtNSwgIDYyIH0sIHsgICAwLCAgNTcgfSwKKyAgICAgICAgeyAgLTQsICA2MSB9LCB7ICAtOSwgIDYwIH0sIHsgICAxLCAgNTQgfSwgeyAgIDIsICA1OCB9LAorICAgICAgICB7ICAxNywgLTEwIH0sIHsgIDMyLCAtMTMgfSwgeyAgNDIsICAtOSB9LCB7ICA0OSwgIC01IH0sCisgICAgICAgIHsgIDUzLCAgIDAgfSwgeyAgNjQsICAgMyB9LCB7ICA2OCwgIDEwIH0sIHsgIDY2LCAgMjcgfSwKKyAgICAgICAgeyAgNDcsICA1NyB9LCB7ICAxNywgLTEwIH0sIHsgIDMyLCAtMTMgfSwgeyAgNDIsICAtOSB9LAorICAgICAgICB7ICA0OSwgIC01IH0sIHsgIDUzLCAgIDAgfSwgeyAgNjQsICAgMyB9LCB7ICA2OCwgIDEwIH0sCisgICAgICAgIHsgIDY2LCAgMjcgfSwgeyAgNDcsICA1NyB9LCB7ICAtNSwgIDcxIH0sIHsgICAwLCAgMjQgfSwKKyAgICAgICAgeyAgLTEsICAzNiB9LCB7ICAtMiwgIDQyIH0sIHsgIC0yLCAgNTIgfSwgeyAgLTksICA1NyB9LAorICAgICAgICB7ICAtNiwgIDYzIH0sIHsgIC00LCAgNjUgfSwgeyAgLTQsICA2NyB9LCB7ICAtNywgIDgyIH0sCisgICAgICAgIHsgLTIxLCAxMjYgfSwgeyAtMjMsIDEyNCB9LCB7IC0yMCwgMTEwIH0sIHsgLTI2LCAxMjYgfSwKKyAgICAgICAgeyAtMjUsIDEyNCB9LCB7IC0xNywgMTA1IH0sIHsgLTI3LCAxMjEgfSwgeyAtMjcsIDExNyB9LAorICAgICAgICB7IC0xNywgMTAyIH0sIHsgLTI2LCAxMTcgfSwgeyAtMjcsIDExNiB9LCB7IC0zMywgMTIyIH0sCisgICAgICAgIHsgLTEwLCAgOTUgfSwgeyAtMTQsIDEwMCB9LCB7ICAtOCwgIDk1IH0sIHsgLTE3LCAxMTEgfSwKKyAgICAgICAgeyAtMjgsIDExNCB9LCB7ICAtNiwgIDg5IH0sIHsgIC0yLCAgODAgfSwgeyAgLTQsICA4MiB9LAorICAgICAgICB7ICAtOSwgIDg1IH0sIHsgIC04LCAgODEgfSwgeyAgLTEsICA3MiB9LCB7ICAgNSwgIDY0IH0sCisgICAgICAgIHsgICAxLCAgNjcgfSwgeyAgIDksICA1NiB9LCB7ICAgMCwgIDY5IH0sIHsgICAxLCAgNjkgfSwKKyAgICAgICAgeyAgIDcsICA2OSB9LCB7ICAtNywgIDY5IH0sIHsgIC02LCAgNjcgfSwgeyAtMTYsICA3NyB9LAorICAgICAgICB7ICAtMiwgIDY0IH0sIHsgICAyLCAgNjEgfSwgeyAgLTYsICA2NyB9LCB7ICAtMywgIDY0IH0sCisgICAgICAgIHsgICAyLCAgNTcgfSwgeyAgLTMsICA2NSB9LCB7ICAtMywgIDY2IH0sIHsgICAwLCAgNjIgfSwKKyAgICAgICAgeyAgIDksICA1MSB9LCB7ICAtMSwgIDY2IH0sIHsgIC0yLCAgNzEgfSwgeyAgLTIsICA3NSB9LAorICAgICAgICB7IC0yMSwgMTI2IH0sIHsgLTIzLCAxMjQgfSwgeyAtMjAsIDExMCB9LCB7IC0yNiwgMTI2IH0sCisgICAgICAgIHsgLTI1LCAxMjQgfSwgeyAtMTcsIDEwNSB9LCB7IC0yNywgMTIxIH0sIHsgLTI3LCAxMTcgfSwKKyAgICAgICAgeyAtMTcsIDEwMiB9LCB7IC0yNiwgMTE3IH0sIHsgLTI3LCAxMTYgfSwgeyAtMzMsIDEyMiB9LAorICAgICAgICB7IC0xMCwgIDk1IH0sIHsgLTE0LCAxMDAgfSwgeyAgLTgsICA5NSB9LCB7IC0xNywgMTExIH0sCisgICAgICAgIHsgLTI4LCAxMTQgfSwgeyAgLTYsICA4OSB9LCB7ICAtMiwgIDgwIH0sIHsgIC00LCAgODIgfSwKKyAgICAgICAgeyAgLTksICA4NSB9LCB7ICAtOCwgIDgxIH0sIHsgIC0xLCAgNzIgfSwgeyAgIDUsICA2NCB9LAorICAgICAgICB7ICAgMSwgIDY3IH0sIHsgICA5LCAgNTYgfSwgeyAgIDAsICA2OSB9LCB7ICAgMSwgIDY5IH0sCisgICAgICAgIHsgICA3LCAgNjkgfSwgeyAgLTcsICA2OSB9LCB7ICAtNiwgIDY3IH0sIHsgLTE2LCAgNzcgfSwKKyAgICAgICAgeyAgLTIsICA2NCB9LCB7ICAgMiwgIDYxIH0sIHsgIC02LCAgNjcgfSwgeyAgLTMsICA2NCB9LAorICAgICAgICB7ICAgMiwgIDU3IH0sIHsgIC0zLCAgNjUgfSwgeyAgLTMsICA2NiB9LCB7ICAgMCwgIDYyIH0sCisgICAgICAgIHsgICA5LCAgNTEgfSwgeyAgLTEsICA2NiB9LCB7ICAtMiwgIDcxIH0sIHsgIC0yLCAgNzUgfSwKKyAgICAgICAgeyAgMTksICAtNiB9LCB7ICAxOCwgIC02IH0sIHsgIDE0LCAgIDAgfSwgeyAgMjYsIC0xMiB9LAorICAgICAgICB7ICAzMSwgLTE2IH0sIHsgIDMzLCAtMjUgfSwgeyAgMzMsIC0yMiB9LCB7ICAzNywgLTI4IH0sCisgICAgICAgIHsgIDM5LCAtMzAgfSwgeyAgNDIsIC0zMCB9LCB7ICA0NywgLTQyIH0sIHsgIDQ1LCAtMzYgfSwKKyAgICAgICAgeyAgNDksIC0zNCB9LCB7ICA0MSwgLTE3IH0sIHsgIDMyLCAgIDkgfSwgeyAgNjksIC03MSB9LAorICAgICAgICB7ICA2MywgLTYzIH0sIHsgIDY2LCAtNjQgfSwgeyAgNzcsIC03NCB9LCB7ICA1NCwgLTM5IH0sCisgICAgICAgIHsgIDUyLCAtMzUgfSwgeyAgNDEsIC0xMCB9LCB7ICAzNiwgICAwIH0sIHsgIDQwLCAgLTEgfSwKKyAgICAgICAgeyAgMzAsICAxNCB9LCB7ICAyOCwgIDI2IH0sIHsgIDIzLCAgMzcgfSwgeyAgMTIsICA1NSB9LAorICAgICAgICB7ICAxMSwgIDY1IH0sIHsgIDM3LCAtMzMgfSwgeyAgMzksIC0zNiB9LCB7ICA0MCwgLTM3IH0sCisgICAgICAgIHsgIDM4LCAtMzAgfSwgeyAgNDYsIC0zMyB9LCB7ICA0MiwgLTMwIH0sIHsgIDQwLCAtMjQgfSwKKyAgICAgICAgeyAgNDksIC0yOSB9LCB7ICAzOCwgLTEyIH0sIHsgIDQwLCAtMTAgfSwgeyAgMzgsICAtMyB9LAorICAgICAgICB7ICA0NiwgIC01IH0sIHsgIDMxLCAgMjAgfSwgeyAgMjksICAzMCB9LCB7ICAyNSwgIDQ0IH0sCisgICAgICAgIHsgIDE5LCAgLTYgfSwgeyAgMTgsICAtNiB9LCB7ICAxNCwgICAwIH0sIHsgIDI2LCAtMTIgfSwKKyAgICAgICAgeyAgMzEsIC0xNiB9LCB7ICAzMywgLTI1IH0sIHsgIDMzLCAtMjIgfSwgeyAgMzcsIC0yOCB9LAorICAgICAgICB7ICAzOSwgLTMwIH0sIHsgIDQyLCAtMzAgfSwgeyAgNDcsIC00MiB9LCB7ICA0NSwgLTM2IH0sCisgICAgICAgIHsgIDQ5LCAtMzQgfSwgeyAgNDEsIC0xNyB9LCB7ICAzMiwgICA5IH0sIHsgIDY5LCAtNzEgfSwKKyAgICAgICAgeyAgNjMsIC02MyB9LCB7ICA2NiwgLTY0IH0sIHsgIDc3LCAtNzQgfSwgeyAgNTQsIC0zOSB9LAorICAgICAgICB7ICA1MiwgLTM1IH0sIHsgIDQxLCAtMTAgfSwgeyAgMzYsICAgMCB9LCB7ICA0MCwgIC0xIH0sCisgICAgICAgIHsgIDMwLCAgMTQgfSwgeyAgMjgsICAyNiB9LCB7ICAyMywgIDM3IH0sIHsgIDEyLCAgNTUgfSwKKyAgICAgICAgeyAgMTEsICA2NSB9LCB7ICAzNywgLTMzIH0sIHsgIDM5LCAtMzYgfSwgeyAgNDAsIC0zNyB9LAorICAgICAgICB7ICAzOCwgLTMwIH0sIHsgIDQ2LCAtMzMgfSwgeyAgNDIsIC0zMCB9LCB7ICA0MCwgLTI0IH0sCisgICAgICAgIHsgIDQ5LCAtMjkgfSwgeyAgMzgsIC0xMiB9LCB7ICA0MCwgLTEwIH0sIHsgIDM4LCAgLTMgfSwKKyAgICAgICAgeyAgNDYsICAtNSB9LCB7ICAzMSwgIDIwIH0sIHsgIDI5LCAgMzAgfSwgeyAgMjUsICA0NCB9LAorICAgICAgICB7IC0yMywgMTEyIH0sIHsgLTE1LCAgNzEgfSwgeyAgLTcsICA2MSB9LCB7ICAgMCwgIDUzIH0sCisgICAgICAgIHsgIC01LCAgNjYgfSwgeyAtMTEsICA3NyB9LCB7ICAtOSwgIDgwIH0sIHsgIC05LCAgODQgfSwKKyAgICAgICAgeyAtMTAsICA4NyB9LCB7IC0zNCwgMTI3IH0sIHsgLTIxLCAxMDEgfSwgeyAgLTMsICAzOSB9LAorICAgICAgICB7ICAtNSwgIDUzIH0sIHsgIC03LCAgNjEgfSwgeyAtMTEsICA3NSB9LCB7IC0xNSwgIDc3IH0sCisgICAgICAgIHsgLTE3LCAgOTEgfSwgeyAtMjUsIDEwNyB9LCB7IC0yNSwgMTExIH0sIHsgLTI4LCAxMjIgfSwKKyAgICAgICAgeyAtMTEsICA3NiB9LCB7IC0xMCwgIDQ0IH0sIHsgLTEwLCAgNTIgfSwgeyAtMTAsICA1NyB9LAorICAgICAgICB7ICAtOSwgIDU4IH0sIHsgLTE2LCAgNzIgfSwgeyAgLTcsICA2OSB9LCB7ICAtNCwgIDY5IH0sCisgICAgICAgIHsgIC01LCAgNzQgfSwgeyAgLTksICA4NiB9LCB7IC0yMywgMTEyIH0sIHsgLTE1LCAgNzEgfSwKKyAgICAgICAgeyAgLTcsICA2MSB9LCB7ICAgMCwgIDUzIH0sIHsgIC01LCAgNjYgfSwgeyAtMTEsICA3NyB9LAorICAgICAgICB7ICAtOSwgIDgwIH0sIHsgIC05LCAgODQgfSwgeyAtMTAsICA4NyB9LCB7IC0zNCwgMTI3IH0sCisgICAgICAgIHsgLTIxLCAxMDEgfSwgeyAgLTMsICAzOSB9LCB7ICAtNSwgIDUzIH0sIHsgIC03LCAgNjEgfSwKKyAgICAgICAgeyAtMTEsICA3NSB9LCB7IC0xNSwgIDc3IH0sIHsgLTE3LCAgOTEgfSwgeyAtMjUsIDEwNyB9LAorICAgICAgICB7IC0yNSwgMTExIH0sIHsgLTI4LCAxMjIgfSwgeyAtMTEsICA3NiB9LCB7IC0xMCwgIDQ0IH0sCisgICAgICAgIHsgLTEwLCAgNTIgfSwgeyAtMTAsICA1NyB9LCB7ICAtOSwgIDU4IH0sIHsgLTE2LCAgNzIgfSwKKyAgICAgICAgeyAgLTcsICA2OSB9LCB7ICAtNCwgIDY5IH0sIHsgIC01LCAgNzQgfSwgeyAgLTksICA4NiB9LAorICAgICAgICB7ICAtMiwgIDczIH0sIHsgLTEyLCAxMDQgfSwgeyAgLTksICA5MSB9LCB7IC0zMSwgMTI3IH0sCisgICAgICAgIHsgIC0yLCAgNzMgfSwgeyAtMTIsIDEwNCB9LCB7ICAtOSwgIDkxIH0sIHsgLTMxLCAxMjcgfSwKKyAgICAgICAgeyAgLTIsICA3MyB9LCB7IC0xMiwgMTA0IH0sIHsgIC05LCAgOTEgfSwgeyAtMzEsIDEyNyB9CisgICAgfSwKKworICAgIC8qIGlfY2FiYWNfaW5pdF9pZGMgPT0gMiAqLworICAgIHsKKyAgICAgICAgLyogMCAtIDEwICovCisgICAgICAgIHsgIDIwLCAtMTUgfSwgeyAgIDIsICA1NCB9LCB7ICAgMywgIDc0IH0sIHsgIDIwLCAtMTUgfSwKKyAgICAgICAgeyAgIDIsICA1NCB9LCB7ICAgMywgIDc0IH0sIHsgLTI4LCAxMjcgfSwgeyAtMjMsIDEwNCB9LAorICAgICAgICB7ICAtNiwgIDUzIH0sIHsgIC0xLCAgNTQgfSwgeyAgIDcsICA1MSB9LAorCisgICAgICAgIC8qIDExIC0gMjMgKi8KKyAgICAgICAgeyAgMjksICAxNiB9LCB7ICAyNSwgICAwIH0sIHsgIDE0LCAgIDAgfSwgeyAtMTAsICA1MSB9LAorICAgICAgICB7ICAtMywgIDYyIH0sIHsgLTI3LCAgOTkgfSwgeyAgMjYsICAxNiB9LCB7ICAtNCwgIDg1IH0sCisgICAgICAgIHsgLTI0LCAxMDIgfSwgeyAgIDUsICA1NyB9LCB7ICAgNiwgIDU3IH0sIHsgLTE3LCAgNzMgfSwKKyAgICAgICAgeyAgMTQsICA1NyB9LAorCisgICAgICAgIC8qIDI0IC0gMzkgKi8KKyAgICAgICAgeyAgMjAsICA0MCB9LCB7ICAyMCwgIDEwIH0sIHsgIDI5LCAgIDAgfSwgeyAgNTQsICAgMCB9LAorICAgICAgICB7ICAzNywgIDQyIH0sIHsgIDEyLCAgOTcgfSwgeyAtMzIsIDEyNyB9LCB7IC0yMiwgMTE3IH0sCisgICAgICAgIHsgIC0yLCAgNzQgfSwgeyAgLTQsICA4NSB9LCB7IC0yNCwgMTAyIH0sIHsgICA1LCAgNTcgfSwKKyAgICAgICAgeyAgLTYsICA5MyB9LCB7IC0xNCwgIDg4IH0sIHsgIC02LCAgNDQgfSwgeyAgIDQsICA1NSB9LAorCisgICAgICAgIC8qIDQwIC0gNTMgKi8KKyAgICAgICAgeyAtMTEsICA4OSB9LHsgLTE1LCAgMTAzIH0seyAtMjEsICAxMTYgfSx7ICAxOSwgIDU3IH0sCisgICAgICAgIHsgIDIwLCAgNTggfSx7ICAgNCwgIDg0IH0seyAgIDYsICA5NiB9LHsgICAxLCAgNjMgfSwKKyAgICAgICAgeyAgLTUsICA4NSB9LHsgLTEzLCAgMTA2IH0seyAgIDUsICA2MyB9LHsgICA2LCAgNzUgfSwKKyAgICAgICAgeyAgLTMsICA5MCB9LHsgIC0xLCAgMTAxIH0sCisKKyAgICAgICAgLyogNTQgLSA1OSAqLworICAgICAgICB7ICAgMywgIDU1IH0seyAgLTQsICA3OSB9LHsgIC0yLCAgNzUgfSx7IC0xMiwgIDk3IH0sCisgICAgICAgIHsgIC03LCAgNTAgfSx7ICAgMSwgIDYwIH0sCisKKyAgICAgICAgLyogNjAgLSA2OSAqLworICAgICAgICB7IDAsIDQxIH0sICAgeyAwLCA2MyB9LCAgIHsgMCwgNjMgfSwgICAgIHsgMCwgNjMgfSwKKyAgICAgICAgeyAtOSwgODMgfSwgIHsgNCwgODYgfSwgICB7IDAsIDk3IH0sICAgICB7IC03LCA3MiB9LAorICAgICAgICB7IDEzLCA0MSB9LCAgeyAzLCA2MiB9LAorCisgICAgICAgIC8qIDcwIC0gMTA0ICovCisgICAgICAgIHsgICA3LCAgMzQgfSwgeyAgLTksICA4OCB9LCB7IC0yMCwgMTI3IH0sIHsgLTM2LCAxMjcgfSwKKyAgICAgICAgeyAtMTcsICA5MSB9LCB7IC0xNCwgIDk1IH0sIHsgLTI1LCAgODQgfSwgeyAtMjUsICA4NiB9LAorICAgICAgICB7IC0xMiwgIDg5IH0sIHsgLTE3LCAgOTEgfSwgeyAtMzEsIDEyNyB9LCB7IC0xNCwgIDc2IH0sCisgICAgICAgIHsgLTE4LCAxMDMgfSwgeyAtMTMsICA5MCB9LCB7IC0zNywgMTI3IH0sIHsgIDExLCAgODAgfSwKKyAgICAgICAgeyAgIDUsICA3NiB9LCB7ICAgMiwgIDg0IH0sIHsgICA1LCAgNzggfSwgeyAgLTYsICA1NSB9LAorICAgICAgICB7ICAgNCwgIDYxIH0sIHsgLTE0LCAgODMgfSwgeyAtMzcsIDEyNyB9LCB7ICAtNSwgIDc5IH0sCisgICAgICAgIHsgLTExLCAxMDQgfSwgeyAtMTEsICA5MSB9LCB7IC0zMCwgMTI3IH0sIHsgICAwLCAgNjUgfSwKKyAgICAgICAgeyAgLTIsICA3OSB9LCB7ICAgMCwgIDcyIH0sIHsgIC00LCAgOTIgfSwgeyAgLTYsICA1NiB9LAorICAgICAgICB7ICAgMywgIDY4IH0sIHsgIC04LCAgNzEgfSwgeyAtMTMsICA5OCB9LAorCisgICAgICAgIC8qIDEwNSAtPiAxNjUgKi8KKyAgICAgICAgeyAgLTQsICA4NiB9LCB7IC0xMiwgIDg4IH0sIHsgIC01LCAgODIgfSwgeyAgLTMsICA3MiB9LAorICAgICAgICB7ICAtNCwgIDY3IH0sIHsgIC04LCAgNzIgfSwgeyAtMTYsICA4OSB9LCB7ICAtOSwgIDY5IH0sCisgICAgICAgIHsgIC0xLCAgNTkgfSwgeyAgIDUsICA2NiB9LCB7ICAgNCwgIDU3IH0sIHsgIC00LCAgNzEgfSwKKyAgICAgICAgeyAgLTIsICA3MSB9LCB7ICAgMiwgIDU4IH0sIHsgIC0xLCAgNzQgfSwgeyAgLTQsICA0NCB9LAorICAgICAgICB7ICAtMSwgIDY5IH0sIHsgICAwLCAgNjIgfSwgeyAgLTcsICA1MSB9LCB7ICAtNCwgIDQ3IH0sCisgICAgICAgIHsgIC02LCAgNDIgfSwgeyAgLTMsICA0MSB9LCB7ICAtNiwgIDUzIH0sIHsgICA4LCAgNzYgfSwKKyAgICAgICAgeyAgLTksICA3OCB9LCB7IC0xMSwgIDgzIH0sIHsgICA5LCAgNTIgfSwgeyAgIDAsICA2NyB9LAorICAgICAgICB7ICAtNSwgIDkwIH0sIHsgICAxLCAgNjcgfSwgeyAtMTUsICA3MiB9LCB7ICAtNSwgIDc1IH0sCisgICAgICAgIHsgIC04LCAgODAgfSwgeyAtMjEsICA4MyB9LCB7IC0yMSwgIDY0IH0sIHsgLTEzLCAgMzEgfSwKKyAgICAgICAgeyAtMjUsICA2NCB9LCB7IC0yOSwgIDk0IH0sIHsgICA5LCAgNzUgfSwgeyAgMTcsICA2MyB9LAorICAgICAgICB7ICAtOCwgIDc0IH0sIHsgIC01LCAgMzUgfSwgeyAgLTIsICAyNyB9LCB7ICAxMywgIDkxIH0sCisgICAgICAgIHsgICAzLCAgNjUgfSwgeyAgLTcsICA2OSB9LCB7ICAgOCwgIDc3IH0sIHsgLTEwLCAgNjYgfSwKKyAgICAgICAgeyAgIDMsICA2MiB9LCB7ICAtMywgIDY4IH0sIHsgLTIwLCAgODEgfSwgeyAgIDAsICAzMCB9LAorICAgICAgICB7ICAgMSwgICA3IH0sIHsgIC0zLCAgMjMgfSwgeyAtMjEsICA3NCB9LCB7ICAxNiwgIDY2IH0sCisgICAgICAgIHsgLTIzLCAxMjQgfSwgeyAgMTcsICAzNyB9LCB7ICA0NCwgLTE4IH0sIHsgIDUwLCAtMzQgfSwKKyAgICAgICAgeyAtMjIsIDEyNyB9LAorCisgICAgICAgIC8qIDE2NiAtIDIyNiAqLworICAgICAgICB7ICAgNCwgIDM5IH0sIHsgICAwLCAgNDIgfSwgeyAgIDcsICAzNCB9LCB7ICAxMSwgIDI5IH0sCisgICAgICAgIHsgICA4LCAgMzEgfSwgeyAgIDYsICAzNyB9LCB7ICAgNywgIDQyIH0sIHsgICAzLCAgNDAgfSwKKyAgICAgICAgeyAgIDgsICAzMyB9LCB7ICAxMywgIDQzIH0sIHsgIDEzLCAgMzYgfSwgeyAgIDQsICA0NyB9LAorICAgICAgICB7ICAgMywgIDU1IH0sIHsgICAyLCAgNTggfSwgeyAgIDYsICA2MCB9LCB7ICAgOCwgIDQ0IH0sCisgICAgICAgIHsgIDExLCAgNDQgfSwgeyAgMTQsICA0MiB9LCB7ICAgNywgIDQ4IH0sIHsgICA0LCAgNTYgfSwKKyAgICAgICAgeyAgIDQsICA1MiB9LCB7ICAxMywgIDM3IH0sIHsgICA5LCAgNDkgfSwgeyAgMTksICA1OCB9LAorICAgICAgICB7ICAxMCwgIDQ4IH0sIHsgIDEyLCAgNDUgfSwgeyAgIDAsICA2OSB9LCB7ICAyMCwgIDMzIH0sCisgICAgICAgIHsgICA4LCAgNjMgfSwgeyAgMzUsIC0xOCB9LCB7ICAzMywgLTI1IH0sIHsgIDI4LCAgLTMgfSwKKyAgICAgICAgeyAgMjQsICAxMCB9LCB7ICAyNywgICAwIH0sIHsgIDM0LCAtMTQgfSwgeyAgNTIsIC00NCB9LAorICAgICAgICB7ICAzOSwgLTI0IH0sIHsgIDE5LCAgMTcgfSwgeyAgMzEsICAyNSB9LCB7ICAzNiwgIDI5IH0sCisgICAgICAgIHsgIDI0LCAgMzMgfSwgeyAgMzQsICAxNSB9LCB7ICAzMCwgIDIwIH0sIHsgIDIyLCAgNzMgfSwKKyAgICAgICAgeyAgMjAsICAzNCB9LCB7ICAxOSwgIDMxIH0sIHsgIDI3LCAgNDQgfSwgeyAgMTksICAxNiB9LAorICAgICAgICB7ICAxNSwgIDM2IH0sIHsgIDE1LCAgMzYgfSwgeyAgMjEsICAyOCB9LCB7ICAyNSwgIDIxIH0sCisgICAgICAgIHsgIDMwLCAgMjAgfSwgeyAgMzEsICAxMiB9LCB7ICAyNywgIDE2IH0sIHsgIDI0LCAgNDIgfSwKKyAgICAgICAgeyAgIDAsICA5MyB9LCB7ICAxNCwgIDU2IH0sIHsgIDE1LCAgNTcgfSwgeyAgMjYsICAzOCB9LAorICAgICAgICB7IC0yNCwgMTI3IH0sCisKKyAgICAgICAgLyogMjI3IC0gMjc1ICovCisgICAgICAgIHsgLTI0LCAxMTUgfSwgeyAtMjIsICA4MiB9LCB7ICAtOSwgIDYyIH0sIHsgICAwLCAgNTMgfSwKKyAgICAgICAgeyAgIDAsICA1OSB9LCB7IC0xNCwgIDg1IH0sIHsgLTEzLCAgODkgfSwgeyAtMTMsICA5NCB9LAorICAgICAgICB7IC0xMSwgIDkyIH0sIHsgLTI5LCAxMjcgfSwgeyAtMjEsIDEwMCB9LCB7IC0xNCwgIDU3IH0sCisgICAgICAgIHsgLTEyLCAgNjcgfSwgeyAtMTEsICA3MSB9LCB7IC0xMCwgIDc3IH0sIHsgLTIxLCAgODUgfSwKKyAgICAgICAgeyAtMTYsICA4OCB9LCB7IC0yMywgMTA0IH0sIHsgLTE1LCAgOTggfSwgeyAtMzcsIDEyNyB9LAorICAgICAgICB7IC0xMCwgIDgyIH0sIHsgIC04LCAgNDggfSwgeyAgLTgsICA2MSB9LCB7ICAtOCwgIDY2IH0sCisgICAgICAgIHsgIC03LCAgNzAgfSwgeyAtMTQsICA3NSB9LCB7IC0xMCwgIDc5IH0sIHsgIC05LCAgODMgfSwKKyAgICAgICAgeyAtMTIsICA5MiB9LCB7IC0xOCwgMTA4IH0sIHsgIC00LCAgNzkgfSwgeyAtMjIsICA2OSB9LAorICAgICAgICB7IC0xNiwgIDc1IH0sIHsgIC0yLCAgNTggfSwgeyAgIDEsICA1OCB9LCB7IC0xMywgIDc4IH0sCisgICAgICAgIHsgIC05LCAgODMgfSwgeyAgLTQsICA4MSB9LCB7IC0xMywgIDk5IH0sIHsgLTEzLCAgODEgfSwKKyAgICAgICAgeyAgLTYsICAzOCB9LCB7IC0xMywgIDYyIH0sIHsgIC02LCAgNTggfSwgeyAgLTIsICA1OSB9LAorICAgICAgICB7IC0xNiwgIDczIH0sIHsgLTEwLCAgNzYgfSwgeyAtMTMsICA4NiB9LCB7ICAtOSwgIDgzIH0sCisgICAgICAgIHsgLTEwLCAgODcgfSwKKworICAgICAgICAvKiAyNzYgYSBiaXQgc3BlY2lhbCAobm90IHVzZWQsIGJ5cGFzcyBpcyB1c2VkIGluc3RlYWQpICovCisgICAgICAgIHsgMCwgMCB9LAorCisgICAgICAgIC8qIDI3NyAtIDMzNyAqLworICAgICAgICB7IC0yMiwgMTI3IH0sIHsgLTI1LCAxMjcgfSwgeyAtMjUsIDEyMCB9LCB7IC0yNywgMTI3IH0sCisgICAgICAgIHsgLTE5LCAxMTQgfSwgeyAtMjMsIDExNyB9LCB7IC0yNSwgMTE4IH0sIHsgLTI2LCAxMTcgfSwKKyAgICAgICAgeyAtMjQsIDExMyB9LCB7IC0yOCwgMTE4IH0sIHsgLTMxLCAxMjAgfSwgeyAtMzcsIDEyNCB9LAorICAgICAgICB7IC0xMCwgIDk0IH0sIHsgLTE1LCAxMDIgfSwgeyAtMTAsICA5OSB9LCB7IC0xMywgMTA2IH0sCisgICAgICAgIHsgLTUwLCAxMjcgfSwgeyAgLTUsICA5MiB9LCB7ICAxNywgIDU3IH0sIHsgIC01LCAgODYgfSwKKyAgICAgICAgeyAtMTMsICA5NCB9LCB7IC0xMiwgIDkxIH0sIHsgIC0yLCAgNzcgfSwgeyAgIDAsICA3MSB9LAorICAgICAgICB7ICAtMSwgIDczIH0sIHsgICA0LCAgNjQgfSwgeyAgLTcsICA4MSB9LCB7ICAgNSwgIDY0IH0sCisgICAgICAgIHsgIDE1LCAgNTcgfSwgeyAgIDEsICA2NyB9LCB7ICAgMCwgIDY4IH0sIHsgLTEwLCAgNjcgfSwKKyAgICAgICAgeyAgIDEsICA2OCB9LCB7ICAgMCwgIDc3IH0sIHsgICAyLCAgNjQgfSwgeyAgIDAsICA2OCB9LAorICAgICAgICB7ICAtNSwgIDc4IH0sIHsgICA3LCAgNTUgfSwgeyAgIDUsICA1OSB9LCB7ICAgMiwgIDY1IH0sCisgICAgICAgIHsgIDE0LCAgNTQgfSwgeyAgMTUsICA0NCB9LCB7ICAgNSwgIDYwIH0sIHsgICAyLCAgNzAgfSwKKyAgICAgICAgeyAgLTIsICA3NiB9LCB7IC0xOCwgIDg2IH0sIHsgIDEyLCAgNzAgfSwgeyAgIDUsICA2NCB9LAorICAgICAgICB7IC0xMiwgIDcwIH0sIHsgIDExLCAgNTUgfSwgeyAgIDUsICA1NiB9LCB7ICAgMCwgIDY5IH0sCisgICAgICAgIHsgICAyLCAgNjUgfSwgeyAgLTYsICA3NCB9LCB7ICAgNSwgIDU0IH0sIHsgICA3LCAgNTQgfSwKKyAgICAgICAgeyAgLTYsICA3NiB9LCB7IC0xMSwgIDgyIH0sIHsgIC0yLCAgNzcgfSwgeyAgLTIsICA3NyB9LAorICAgICAgICB7ICAyNSwgIDQyIH0sCisKKyAgICAgICAgLyogMzM4IC0gMzk4ICovCisgICAgICAgIHsgIDE3LCAtMTMgfSwgeyAgMTYsICAtOSB9LCB7ICAxNywgLTEyIH0sIHsgIDI3LCAtMjEgfSwKKyAgICAgICAgeyAgMzcsIC0zMCB9LCB7ICA0MSwgLTQwIH0sIHsgIDQyLCAtNDEgfSwgeyAgNDgsIC00NyB9LAorICAgICAgICB7ICAzOSwgLTMyIH0sIHsgIDQ2LCAtNDAgfSwgeyAgNTIsIC01MSB9LCB7ICA0NiwgLTQxIH0sCisgICAgICAgIHsgIDUyLCAtMzkgfSwgeyAgNDMsIC0xOSB9LCB7ICAzMiwgIDExIH0sIHsgIDYxLCAtNTUgfSwKKyAgICAgICAgeyAgNTYsIC00NiB9LCB7ICA2MiwgLTUwIH0sIHsgIDgxLCAtNjcgfSwgeyAgNDUsIC0yMCB9LAorICAgICAgICB7ICAzNSwgIC0yIH0sIHsgIDI4LCAgMTUgfSwgeyAgMzQsICAgMSB9LCB7ICAzOSwgICAxIH0sCisgICAgICAgIHsgIDMwLCAgMTcgfSwgeyAgMjAsICAzOCB9LCB7ICAxOCwgIDQ1IH0sIHsgIDE1LCAgNTQgfSwKKyAgICAgICAgeyAgIDAsICA3OSB9LCB7ICAzNiwgLTE2IH0sIHsgIDM3LCAtMTQgfSwgeyAgMzcsIC0xNyB9LAorICAgICAgICB7ICAzMiwgICAxIH0sIHsgIDM0LCAgMTUgfSwgeyAgMjksICAxNSB9LCB7ICAyNCwgIDI1IH0sCisgICAgICAgIHsgIDM0LCAgMjIgfSwgeyAgMzEsICAxNiB9LCB7ICAzNSwgIDE4IH0sIHsgIDMxLCAgMjggfSwKKyAgICAgICAgeyAgMzMsICA0MSB9LCB7ICAzNiwgIDI4IH0sIHsgIDI3LCAgNDcgfSwgeyAgMjEsICA2MiB9LAorICAgICAgICB7ICAxOCwgIDMxIH0sIHsgIDE5LCAgMjYgfSwgeyAgMzYsICAyNCB9LCB7ICAyNCwgIDIzIH0sCisgICAgICAgIHsgIDI3LCAgMTYgfSwgeyAgMjQsICAzMCB9LCB7ICAzMSwgIDI5IH0sIHsgIDIyLCAgNDEgfSwKKyAgICAgICAgeyAgMjIsICA0MiB9LCB7ICAxNiwgIDYwIH0sIHsgIDE1LCAgNTIgfSwgeyAgMTQsICA2MCB9LAorICAgICAgICB7ICAgMywgIDc4IH0sIHsgLTE2LCAxMjMgfSwgeyAgMjEsICA1MyB9LCB7ICAyMiwgIDU2IH0sCisgICAgICAgIHsgIDI1LCAgNjEgfSwKKworICAgICAgICAvKiAzOTkgLSA0MzUgKi8KKyAgICAgICAgeyAgMjEsICAzMyB9LCB7ICAxOSwgIDUwIH0sIHsgIDE3LCAgNjEgfSwKKyAgICAgICAgeyAgLTMsICA3OCB9LCB7ICAtOCwgIDc0IH0sIHsgIC05LCAgNzIgfSwgeyAtMTAsICA3MiB9LAorICAgICAgICB7IC0xOCwgIDc1IH0sIHsgLTEyLCAgNzEgfSwgeyAtMTEsICA2MyB9LCB7ICAtNSwgIDcwIH0sCisgICAgICAgIHsgLTE3LCAgNzUgfSwgeyAtMTQsICA3MiB9LCB7IC0xNiwgIDY3IH0sIHsgIC04LCAgNTMgfSwKKyAgICAgICAgeyAtMTQsICA1OSB9LCB7ICAtOSwgIDUyIH0sIHsgLTExLCAgNjggfSwgeyAgIDksICAtMiB9LAorICAgICAgICB7ICAzMCwgLTEwIH0sIHsgIDMxLCAgLTQgfSwgeyAgMzMsICAtMSB9LCB7ICAzMywgICA3IH0sCisgICAgICAgIHsgIDMxLCAgMTIgfSwgeyAgMzcsICAyMyB9LCB7ICAzMSwgIDM4IH0sIHsgIDIwLCAgNjQgfSwKKyAgICAgICAgeyAgLTksICA3MSB9LCB7ICAtNywgIDM3IH0sIHsgIC04LCAgNDQgfSwgeyAtMTEsICA0OSB9LAorICAgICAgICB7IC0xMCwgIDU2IH0sIHsgLTEyLCAgNTkgfSwgeyAgLTgsICA2MyB9LCB7ICAtOSwgIDY3IH0sCisgICAgICAgIHsgIC02LCAgNjggfSwgeyAtMTAsICA3OSB9LAorCisgICAgICAgIC8qIDQzNiAtIDQ1OSAqLworICAgICAgICB7ICAtMywgIDc4IH0sIHsgIC04LCAgNzQgfSwgeyAgLTksICA3MiB9LCB7IC0xMCwgIDcyIH0sCisgICAgICAgIHsgLTE4LCAgNzUgfSwgeyAtMTIsICA3MSB9LCB7IC0xMSwgIDYzIH0sIHsgIC01LCAgNzAgfSwKKyAgICAgICAgeyAtMTcsICA3NSB9LCB7IC0xNCwgIDcyIH0sIHsgLTE2LCAgNjcgfSwgeyAgLTgsICA1MyB9LAorICAgICAgICB7IC0xNCwgIDU5IH0sIHsgIC05LCAgNTIgfSwgeyAtMTEsICA2OCB9LCB7ICAgOSwgIC0yIH0sCisgICAgICAgIHsgIDMwLCAtMTAgfSwgeyAgMzEsICAtNCB9LCB7ICAzMywgIC0xIH0sIHsgIDMzLCAgIDcgfSwKKyAgICAgICAgeyAgMzEsICAxMiB9LCB7ICAzNywgIDIzIH0sIHsgIDMxLCAgMzggfSwgeyAgMjAsICA2NCB9LAorCisgICAgICAgIC8qIDQ2MCAtIDEwMjQgKi8KKyAgICAgICAgeyAgMTEsICA4MCB9LCB7ICAgNSwgIDc2IH0sIHsgICAyLCAgODQgfSwgeyAgIDUsICA3OCB9LAorICAgICAgICB7ICAtNiwgIDU1IH0sIHsgICA0LCAgNjEgfSwgeyAtMTQsICA4MyB9LCB7IC0zNywgMTI3IH0sCisgICAgICAgIHsgIC01LCAgNzkgfSwgeyAtMTEsIDEwNCB9LCB7IC0xMSwgIDkxIH0sIHsgLTMwLCAxMjcgfSwKKyAgICAgICAgeyAgMTEsICA4MCB9LCB7ICAgNSwgIDc2IH0sIHsgICAyLCAgODQgfSwgeyAgIDUsICA3OCB9LAorICAgICAgICB7ICAtNiwgIDU1IH0sIHsgICA0LCAgNjEgfSwgeyAtMTQsICA4MyB9LCB7IC0zNywgMTI3IH0sCisgICAgICAgIHsgIC01LCAgNzkgfSwgeyAtMTEsIDEwNCB9LCB7IC0xMSwgIDkxIH0sIHsgLTMwLCAxMjcgfSwKKyAgICAgICAgeyAgLTQsICA4NiB9LCB7IC0xMiwgIDg4IH0sIHsgIC01LCAgODIgfSwgeyAgLTMsICA3MiB9LAorICAgICAgICB7ICAtNCwgIDY3IH0sIHsgIC04LCAgNzIgfSwgeyAtMTYsICA4OSB9LCB7ICAtOSwgIDY5IH0sCisgICAgICAgIHsgIC0xLCAgNTkgfSwgeyAgIDUsICA2NiB9LCB7ICAgNCwgIDU3IH0sIHsgIC00LCAgNzEgfSwKKyAgICAgICAgeyAgLTIsICA3MSB9LCB7ICAgMiwgIDU4IH0sIHsgIC0xLCAgNzQgfSwgeyAgLTQsICA0NCB9LAorICAgICAgICB7ICAtMSwgIDY5IH0sIHsgICAwLCAgNjIgfSwgeyAgLTcsICA1MSB9LCB7ICAtNCwgIDQ3IH0sCisgICAgICAgIHsgIC02LCAgNDIgfSwgeyAgLTMsICA0MSB9LCB7ICAtNiwgIDUzIH0sIHsgICA4LCAgNzYgfSwKKyAgICAgICAgeyAgLTksICA3OCB9LCB7IC0xMSwgIDgzIH0sIHsgICA5LCAgNTIgfSwgeyAgIDAsICA2NyB9LAorICAgICAgICB7ICAtNSwgIDkwIH0sIHsgICAxLCAgNjcgfSwgeyAtMTUsICA3MiB9LCB7ICAtNSwgIDc1IH0sCisgICAgICAgIHsgIC04LCAgODAgfSwgeyAtMjEsICA4MyB9LCB7IC0yMSwgIDY0IH0sIHsgLTEzLCAgMzEgfSwKKyAgICAgICAgeyAtMjUsICA2NCB9LCB7IC0yOSwgIDk0IH0sIHsgICA5LCAgNzUgfSwgeyAgMTcsICA2MyB9LAorICAgICAgICB7ICAtOCwgIDc0IH0sIHsgIC01LCAgMzUgfSwgeyAgLTIsICAyNyB9LCB7ICAxMywgIDkxIH0sCisgICAgICAgIHsgIC00LCAgODYgfSwgeyAtMTIsICA4OCB9LCB7ICAtNSwgIDgyIH0sIHsgIC0zLCAgNzIgfSwKKyAgICAgICAgeyAgLTQsICA2NyB9LCB7ICAtOCwgIDcyIH0sIHsgLTE2LCAgODkgfSwgeyAgLTksICA2OSB9LAorICAgICAgICB7ICAtMSwgIDU5IH0sIHsgICA1LCAgNjYgfSwgeyAgIDQsICA1NyB9LCB7ICAtNCwgIDcxIH0sCisgICAgICAgIHsgIC0yLCAgNzEgfSwgeyAgIDIsICA1OCB9LCB7ICAtMSwgIDc0IH0sIHsgIC00LCAgNDQgfSwKKyAgICAgICAgeyAgLTEsICA2OSB9LCB7ICAgMCwgIDYyIH0sIHsgIC03LCAgNTEgfSwgeyAgLTQsICA0NyB9LAorICAgICAgICB7ICAtNiwgIDQyIH0sIHsgIC0zLCAgNDEgfSwgeyAgLTYsICA1MyB9LCB7ICAgOCwgIDc2IH0sCisgICAgICAgIHsgIC05LCAgNzggfSwgeyAtMTEsICA4MyB9LCB7ICAgOSwgIDUyIH0sIHsgICAwLCAgNjcgfSwKKyAgICAgICAgeyAgLTUsICA5MCB9LCB7ICAgMSwgIDY3IH0sIHsgLTE1LCAgNzIgfSwgeyAgLTUsICA3NSB9LAorICAgICAgICB7ICAtOCwgIDgwIH0sIHsgLTIxLCAgODMgfSwgeyAtMjEsICA2NCB9LCB7IC0xMywgIDMxIH0sCisgICAgICAgIHsgLTI1LCAgNjQgfSwgeyAtMjksICA5NCB9LCB7ICAgOSwgIDc1IH0sIHsgIDE3LCAgNjMgfSwKKyAgICAgICAgeyAgLTgsICA3NCB9LCB7ICAtNSwgIDM1IH0sIHsgIC0yLCAgMjcgfSwgeyAgMTMsICA5MSB9LAorICAgICAgICB7ICAgNCwgIDM5IH0sIHsgICAwLCAgNDIgfSwgeyAgIDcsICAzNCB9LCB7ICAxMSwgIDI5IH0sCisgICAgICAgIHsgICA4LCAgMzEgfSwgeyAgIDYsICAzNyB9LCB7ICAgNywgIDQyIH0sIHsgICAzLCAgNDAgfSwKKyAgICAgICAgeyAgIDgsICAzMyB9LCB7ICAxMywgIDQzIH0sIHsgIDEzLCAgMzYgfSwgeyAgIDQsICA0NyB9LAorICAgICAgICB7ICAgMywgIDU1IH0sIHsgICAyLCAgNTggfSwgeyAgIDYsICA2MCB9LCB7ICAgOCwgIDQ0IH0sCisgICAgICAgIHsgIDExLCAgNDQgfSwgeyAgMTQsICA0MiB9LCB7ICAgNywgIDQ4IH0sIHsgICA0LCAgNTYgfSwKKyAgICAgICAgeyAgIDQsICA1MiB9LCB7ICAxMywgIDM3IH0sIHsgICA5LCAgNDkgfSwgeyAgMTksICA1OCB9LAorICAgICAgICB7ICAxMCwgIDQ4IH0sIHsgIDEyLCAgNDUgfSwgeyAgIDAsICA2OSB9LCB7ICAyMCwgIDMzIH0sCisgICAgICAgIHsgICA4LCAgNjMgfSwgeyAgMzUsIC0xOCB9LCB7ICAzMywgLTI1IH0sIHsgIDI4LCAgLTMgfSwKKyAgICAgICAgeyAgMjQsICAxMCB9LCB7ICAyNywgICAwIH0sIHsgIDM0LCAtMTQgfSwgeyAgNTIsIC00NCB9LAorICAgICAgICB7ICAzOSwgLTI0IH0sIHsgIDE5LCAgMTcgfSwgeyAgMzEsICAyNSB9LCB7ICAzNiwgIDI5IH0sCisgICAgICAgIHsgIDI0LCAgMzMgfSwgeyAgMzQsICAxNSB9LCB7ICAzMCwgIDIwIH0sIHsgIDIyLCAgNzMgfSwKKyAgICAgICAgeyAgIDQsICAzOSB9LCB7ICAgMCwgIDQyIH0sIHsgICA3LCAgMzQgfSwgeyAgMTEsICAyOSB9LAorICAgICAgICB7ICAgOCwgIDMxIH0sIHsgICA2LCAgMzcgfSwgeyAgIDcsICA0MiB9LCB7ICAgMywgIDQwIH0sCisgICAgICAgIHsgICA4LCAgMzMgfSwgeyAgMTMsICA0MyB9LCB7ICAxMywgIDM2IH0sIHsgICA0LCAgNDcgfSwKKyAgICAgICAgeyAgIDMsICA1NSB9LCB7ICAgMiwgIDU4IH0sIHsgICA2LCAgNjAgfSwgeyAgIDgsICA0NCB9LAorICAgICAgICB7ICAxMSwgIDQ0IH0sIHsgIDE0LCAgNDIgfSwgeyAgIDcsICA0OCB9LCB7ICAgNCwgIDU2IH0sCisgICAgICAgIHsgICA0LCAgNTIgfSwgeyAgMTMsICAzNyB9LCB7ICAgOSwgIDQ5IH0sIHsgIDE5LCAgNTggfSwKKyAgICAgICAgeyAgMTAsICA0OCB9LCB7ICAxMiwgIDQ1IH0sIHsgICAwLCAgNjkgfSwgeyAgMjAsICAzMyB9LAorICAgICAgICB7ICAgOCwgIDYzIH0sIHsgIDM1LCAtMTggfSwgeyAgMzMsIC0yNSB9LCB7ICAyOCwgIC0zIH0sCisgICAgICAgIHsgIDI0LCAgMTAgfSwgeyAgMjcsICAgMCB9LCB7ICAzNCwgLTE0IH0sIHsgIDUyLCAtNDQgfSwKKyAgICAgICAgeyAgMzksIC0yNCB9LCB7ICAxOSwgIDE3IH0sIHsgIDMxLCAgMjUgfSwgeyAgMzYsICAyOSB9LAorICAgICAgICB7ICAyNCwgIDMzIH0sIHsgIDM0LCAgMTUgfSwgeyAgMzAsICAyMCB9LCB7ICAyMiwgIDczIH0sCisgICAgICAgIHsgIC0zLCAgNzggfSwgeyAgLTgsICA3NCB9LCB7ICAtOSwgIDcyIH0sIHsgLTEwLCAgNzIgfSwKKyAgICAgICAgeyAtMTgsICA3NSB9LCB7IC0xMiwgIDcxIH0sIHsgLTExLCAgNjMgfSwgeyAgLTUsICA3MCB9LAorICAgICAgICB7IC0xNywgIDc1IH0sIHsgLTE0LCAgNzIgfSwgeyAtMTYsICA2NyB9LCB7ICAtOCwgIDUzIH0sCisgICAgICAgIHsgLTE0LCAgNTkgfSwgeyAgLTksICA1MiB9LCB7IC0xMSwgIDY4IH0sIHsgIC0zLCAgNzggfSwKKyAgICAgICAgeyAgLTgsICA3NCB9LCB7ICAtOSwgIDcyIH0sIHsgLTEwLCAgNzIgfSwgeyAtMTgsICA3NSB9LAorICAgICAgICB7IC0xMiwgIDcxIH0sIHsgLTExLCAgNjMgfSwgeyAgLTUsICA3MCB9LCB7IC0xNywgIDc1IH0sCisgICAgICAgIHsgLTE0LCAgNzIgfSwgeyAtMTYsICA2NyB9LCB7ICAtOCwgIDUzIH0sIHsgLTE0LCAgNTkgfSwKKyAgICAgICAgeyAgLTksICA1MiB9LCB7IC0xMSwgIDY4IH0sIHsgICA5LCAgLTIgfSwgeyAgMzAsIC0xMCB9LAorICAgICAgICB7ICAzMSwgIC00IH0sIHsgIDMzLCAgLTEgfSwgeyAgMzMsICAgNyB9LCB7ICAzMSwgIDEyIH0sCisgICAgICAgIHsgIDM3LCAgMjMgfSwgeyAgMzEsICAzOCB9LCB7ICAyMCwgIDY0IH0sIHsgICA5LCAgLTIgfSwKKyAgICAgICAgeyAgMzAsIC0xMCB9LCB7ICAzMSwgIC00IH0sIHsgIDMzLCAgLTEgfSwgeyAgMzMsICAgNyB9LAorICAgICAgICB7ICAzMSwgIDEyIH0sIHsgIDM3LCAgMjMgfSwgeyAgMzEsICAzOCB9LCB7ICAyMCwgIDY0IH0sCisgICAgICAgIHsgIC05LCAgNzEgfSwgeyAgLTcsICAzNyB9LCB7ICAtOCwgIDQ0IH0sIHsgLTExLCAgNDkgfSwKKyAgICAgICAgeyAtMTAsICA1NiB9LCB7IC0xMiwgIDU5IH0sIHsgIC04LCAgNjMgfSwgeyAgLTksICA2NyB9LAorICAgICAgICB7ICAtNiwgIDY4IH0sIHsgLTEwLCAgNzkgfSwgeyAgLTMsICA3OCB9LCB7ICAtOCwgIDc0IH0sCisgICAgICAgIHsgIC05LCAgNzIgfSwgeyAtMTAsICA3MiB9LCB7IC0xOCwgIDc1IH0sIHsgLTEyLCAgNzEgfSwKKyAgICAgICAgeyAtMTEsICA2MyB9LCB7ICAtNSwgIDcwIH0sIHsgLTE3LCAgNzUgfSwgeyAtMTQsICA3MiB9LAorICAgICAgICB7IC0xNiwgIDY3IH0sIHsgIC04LCAgNTMgfSwgeyAtMTQsICA1OSB9LCB7ICAtOSwgIDUyIH0sCisgICAgICAgIHsgLTExLCAgNjggfSwgeyAgLTMsICA3OCB9LCB7ICAtOCwgIDc0IH0sIHsgIC05LCAgNzIgfSwKKyAgICAgICAgeyAtMTAsICA3MiB9LCB7IC0xOCwgIDc1IH0sIHsgLTEyLCAgNzEgfSwgeyAtMTEsICA2MyB9LAorICAgICAgICB7ICAtNSwgIDcwIH0sIHsgLTE3LCAgNzUgfSwgeyAtMTQsICA3MiB9LCB7IC0xNiwgIDY3IH0sCisgICAgICAgIHsgIC04LCAgNTMgfSwgeyAtMTQsICA1OSB9LCB7ICAtOSwgIDUyIH0sIHsgLTExLCAgNjggfSwKKyAgICAgICAgeyAgIDksICAtMiB9LCB7ICAzMCwgLTEwIH0sIHsgIDMxLCAgLTQgfSwgeyAgMzMsICAtMSB9LAorICAgICAgICB7ICAzMywgICA3IH0sIHsgIDMxLCAgMTIgfSwgeyAgMzcsICAyMyB9LCB7ICAzMSwgIDM4IH0sCisgICAgICAgIHsgIDIwLCAgNjQgfSwgeyAgIDksICAtMiB9LCB7ICAzMCwgLTEwIH0sIHsgIDMxLCAgLTQgfSwKKyAgICAgICAgeyAgMzMsICAtMSB9LCB7ICAzMywgICA3IH0sIHsgIDMxLCAgMTIgfSwgeyAgMzcsICAyMyB9LAorICAgICAgICB7ICAzMSwgIDM4IH0sIHsgIDIwLCAgNjQgfSwgeyAgLTksICA3MSB9LCB7ICAtNywgIDM3IH0sCisgICAgICAgIHsgIC04LCAgNDQgfSwgeyAtMTEsICA0OSB9LCB7IC0xMCwgIDU2IH0sIHsgLTEyLCAgNTkgfSwKKyAgICAgICAgeyAgLTgsICA2MyB9LCB7ICAtOSwgIDY3IH0sIHsgIC02LCAgNjggfSwgeyAtMTAsICA3OSB9LAorICAgICAgICB7IC0yMiwgMTI3IH0sIHsgLTI1LCAxMjcgfSwgeyAtMjUsIDEyMCB9LCB7IC0yNywgMTI3IH0sCisgICAgICAgIHsgLTE5LCAxMTQgfSwgeyAtMjMsIDExNyB9LCB7IC0yNSwgMTE4IH0sIHsgLTI2LCAxMTcgfSwKKyAgICAgICAgeyAtMjQsIDExMyB9LCB7IC0yOCwgMTE4IH0sIHsgLTMxLCAxMjAgfSwgeyAtMzcsIDEyNCB9LAorICAgICAgICB7IC0xMCwgIDk0IH0sIHsgLTE1LCAxMDIgfSwgeyAtMTAsICA5OSB9LCB7IC0xMywgMTA2IH0sCisgICAgICAgIHsgLTUwLCAxMjcgfSwgeyAgLTUsICA5MiB9LCB7ICAxNywgIDU3IH0sIHsgIC01LCAgODYgfSwKKyAgICAgICAgeyAtMTMsICA5NCB9LCB7IC0xMiwgIDkxIH0sIHsgIC0yLCAgNzcgfSwgeyAgIDAsICA3MSB9LAorICAgICAgICB7ICAtMSwgIDczIH0sIHsgICA0LCAgNjQgfSwgeyAgLTcsICA4MSB9LCB7ICAgNSwgIDY0IH0sCisgICAgICAgIHsgIDE1LCAgNTcgfSwgeyAgIDEsICA2NyB9LCB7ICAgMCwgIDY4IH0sIHsgLTEwLCAgNjcgfSwKKyAgICAgICAgeyAgIDEsICA2OCB9LCB7ICAgMCwgIDc3IH0sIHsgICAyLCAgNjQgfSwgeyAgIDAsICA2OCB9LAorICAgICAgICB7ICAtNSwgIDc4IH0sIHsgICA3LCAgNTUgfSwgeyAgIDUsICA1OSB9LCB7ICAgMiwgIDY1IH0sCisgICAgICAgIHsgIDE0LCAgNTQgfSwgeyAgMTUsICA0NCB9LCB7ICAgNSwgIDYwIH0sIHsgICAyLCAgNzAgfSwKKyAgICAgICAgeyAtMjIsIDEyNyB9LCB7IC0yNSwgMTI3IH0sIHsgLTI1LCAxMjAgfSwgeyAtMjcsIDEyNyB9LAorICAgICAgICB7IC0xOSwgMTE0IH0sIHsgLTIzLCAxMTcgfSwgeyAtMjUsIDExOCB9LCB7IC0yNiwgMTE3IH0sCisgICAgICAgIHsgLTI0LCAxMTMgfSwgeyAtMjgsIDExOCB9LCB7IC0zMSwgMTIwIH0sIHsgLTM3LCAxMjQgfSwKKyAgICAgICAgeyAtMTAsICA5NCB9LCB7IC0xNSwgMTAyIH0sIHsgLTEwLCAgOTkgfSwgeyAtMTMsIDEwNiB9LAorICAgICAgICB7IC01MCwgMTI3IH0sIHsgIC01LCAgOTIgfSwgeyAgMTcsICA1NyB9LCB7ICAtNSwgIDg2IH0sCisgICAgICAgIHsgLTEzLCAgOTQgfSwgeyAtMTIsICA5MSB9LCB7ICAtMiwgIDc3IH0sIHsgICAwLCAgNzEgfSwKKyAgICAgICAgeyAgLTEsICA3MyB9LCB7ICAgNCwgIDY0IH0sIHsgIC03LCAgODEgfSwgeyAgIDUsICA2NCB9LAorICAgICAgICB7ICAxNSwgIDU3IH0sIHsgICAxLCAgNjcgfSwgeyAgIDAsICA2OCB9LCB7IC0xMCwgIDY3IH0sCisgICAgICAgIHsgICAxLCAgNjggfSwgeyAgIDAsICA3NyB9LCB7ICAgMiwgIDY0IH0sIHsgICAwLCAgNjggfSwKKyAgICAgICAgeyAgLTUsICA3OCB9LCB7ICAgNywgIDU1IH0sIHsgICA1LCAgNTkgfSwgeyAgIDIsICA2NSB9LAorICAgICAgICB7ICAxNCwgIDU0IH0sIHsgIDE1LCAgNDQgfSwgeyAgIDUsICA2MCB9LCB7ICAgMiwgIDcwIH0sCisgICAgICAgIHsgIDE3LCAtMTMgfSwgeyAgMTYsICAtOSB9LCB7ICAxNywgLTEyIH0sIHsgIDI3LCAtMjEgfSwKKyAgICAgICAgeyAgMzcsIC0zMCB9LCB7ICA0MSwgLTQwIH0sIHsgIDQyLCAtNDEgfSwgeyAgNDgsIC00NyB9LAorICAgICAgICB7ICAzOSwgLTMyIH0sIHsgIDQ2LCAtNDAgfSwgeyAgNTIsIC01MSB9LCB7ICA0NiwgLTQxIH0sCisgICAgICAgIHsgIDUyLCAtMzkgfSwgeyAgNDMsIC0xOSB9LCB7ICAzMiwgIDExIH0sIHsgIDYxLCAtNTUgfSwKKyAgICAgICAgeyAgNTYsIC00NiB9LCB7ICA2MiwgLTUwIH0sIHsgIDgxLCAtNjcgfSwgeyAgNDUsIC0yMCB9LAorICAgICAgICB7ICAzNSwgIC0yIH0sIHsgIDI4LCAgMTUgfSwgeyAgMzQsICAgMSB9LCB7ICAzOSwgICAxIH0sCisgICAgICAgIHsgIDMwLCAgMTcgfSwgeyAgMjAsICAzOCB9LCB7ICAxOCwgIDQ1IH0sIHsgIDE1LCAgNTQgfSwKKyAgICAgICAgeyAgIDAsICA3OSB9LCB7ICAzNiwgLTE2IH0sIHsgIDM3LCAtMTQgfSwgeyAgMzcsIC0xNyB9LAorICAgICAgICB7ICAzMiwgICAxIH0sIHsgIDM0LCAgMTUgfSwgeyAgMjksICAxNSB9LCB7ICAyNCwgIDI1IH0sCisgICAgICAgIHsgIDM0LCAgMjIgfSwgeyAgMzEsICAxNiB9LCB7ICAzNSwgIDE4IH0sIHsgIDMxLCAgMjggfSwKKyAgICAgICAgeyAgMzMsICA0MSB9LCB7ICAzNiwgIDI4IH0sIHsgIDI3LCAgNDcgfSwgeyAgMjEsICA2MiB9LAorICAgICAgICB7ICAxNywgLTEzIH0sIHsgIDE2LCAgLTkgfSwgeyAgMTcsIC0xMiB9LCB7ICAyNywgLTIxIH0sCisgICAgICAgIHsgIDM3LCAtMzAgfSwgeyAgNDEsIC00MCB9LCB7ICA0MiwgLTQxIH0sIHsgIDQ4LCAtNDcgfSwKKyAgICAgICAgeyAgMzksIC0zMiB9LCB7ICA0NiwgLTQwIH0sIHsgIDUyLCAtNTEgfSwgeyAgNDYsIC00MSB9LAorICAgICAgICB7ICA1MiwgLTM5IH0sIHsgIDQzLCAtMTkgfSwgeyAgMzIsICAxMSB9LCB7ICA2MSwgLTU1IH0sCisgICAgICAgIHsgIDU2LCAtNDYgfSwgeyAgNjIsIC01MCB9LCB7ICA4MSwgLTY3IH0sIHsgIDQ1LCAtMjAgfSwKKyAgICAgICAgeyAgMzUsICAtMiB9LCB7ICAyOCwgIDE1IH0sIHsgIDM0LCAgIDEgfSwgeyAgMzksICAgMSB9LAorICAgICAgICB7ICAzMCwgIDE3IH0sIHsgIDIwLCAgMzggfSwgeyAgMTgsICA0NSB9LCB7ICAxNSwgIDU0IH0sCisgICAgICAgIHsgICAwLCAgNzkgfSwgeyAgMzYsIC0xNiB9LCB7ICAzNywgLTE0IH0sIHsgIDM3LCAtMTcgfSwKKyAgICAgICAgeyAgMzIsICAgMSB9LCB7ICAzNCwgIDE1IH0sIHsgIDI5LCAgMTUgfSwgeyAgMjQsICAyNSB9LAorICAgICAgICB7ICAzNCwgIDIyIH0sIHsgIDMxLCAgMTYgfSwgeyAgMzUsICAxOCB9LCB7ICAzMSwgIDI4IH0sCisgICAgICAgIHsgIDMzLCAgNDEgfSwgeyAgMzYsICAyOCB9LCB7ICAyNywgIDQ3IH0sIHsgIDIxLCAgNjIgfSwKKyAgICAgICAgeyAtMjQsIDExNSB9LCB7IC0yMiwgIDgyIH0sIHsgIC05LCAgNjIgfSwgeyAgIDAsICA1MyB9LAorICAgICAgICB7ICAgMCwgIDU5IH0sIHsgLTE0LCAgODUgfSwgeyAtMTMsICA4OSB9LCB7IC0xMywgIDk0IH0sCisgICAgICAgIHsgLTExLCAgOTIgfSwgeyAtMjksIDEyNyB9LCB7IC0yMSwgMTAwIH0sIHsgLTE0LCAgNTcgfSwKKyAgICAgICAgeyAtMTIsICA2NyB9LCB7IC0xMSwgIDcxIH0sIHsgLTEwLCAgNzcgfSwgeyAtMjEsICA4NSB9LAorICAgICAgICB7IC0xNiwgIDg4IH0sIHsgLTIzLCAxMDQgfSwgeyAtMTUsICA5OCB9LCB7IC0zNywgMTI3IH0sCisgICAgICAgIHsgLTEwLCAgODIgfSwgeyAgLTgsICA0OCB9LCB7ICAtOCwgIDYxIH0sIHsgIC04LCAgNjYgfSwKKyAgICAgICAgeyAgLTcsICA3MCB9LCB7IC0xNCwgIDc1IH0sIHsgLTEwLCAgNzkgfSwgeyAgLTksICA4MyB9LAorICAgICAgICB7IC0xMiwgIDkyIH0sIHsgLTE4LCAxMDggfSwgeyAtMjQsIDExNSB9LCB7IC0yMiwgIDgyIH0sCisgICAgICAgIHsgIC05LCAgNjIgfSwgeyAgIDAsICA1MyB9LCB7ICAgMCwgIDU5IH0sIHsgLTE0LCAgODUgfSwKKyAgICAgICAgeyAtMTMsICA4OSB9LCB7IC0xMywgIDk0IH0sIHsgLTExLCAgOTIgfSwgeyAtMjksIDEyNyB9LAorICAgICAgICB7IC0yMSwgMTAwIH0sIHsgLTE0LCAgNTcgfSwgeyAtMTIsICA2NyB9LCB7IC0xMSwgIDcxIH0sCisgICAgICAgIHsgLTEwLCAgNzcgfSwgeyAtMjEsICA4NSB9LCB7IC0xNiwgIDg4IH0sIHsgLTIzLCAxMDQgfSwKKyAgICAgICAgeyAtMTUsICA5OCB9LCB7IC0zNywgMTI3IH0sIHsgLTEwLCAgODIgfSwgeyAgLTgsICA0OCB9LAorICAgICAgICB7ICAtOCwgIDYxIH0sIHsgIC04LCAgNjYgfSwgeyAgLTcsICA3MCB9LCB7IC0xNCwgIDc1IH0sCisgICAgICAgIHsgLTEwLCAgNzkgfSwgeyAgLTksICA4MyB9LCB7IC0xMiwgIDkyIH0sIHsgLTE4LCAxMDggfSwKKyAgICAgICAgeyAgLTUsICA3OSB9LCB7IC0xMSwgMTA0IH0sIHsgLTExLCAgOTEgfSwgeyAtMzAsIDEyNyB9LAorICAgICAgICB7ICAtNSwgIDc5IH0sIHsgLTExLCAxMDQgfSwgeyAtMTEsICA5MSB9LCB7IC0zMCwgMTI3IH0sCisgICAgICAgIHsgIC01LCAgNzkgfSwgeyAtMTEsIDEwNCB9LCB7IC0xMSwgIDkxIH0sIHsgLTMwLCAxMjcgfQorICAgIH0KK307CisKK3ZvaWQgZmZfaDI2NF9pbml0X2NhYmFjX3N0YXRlcyhIMjY0Q29udGV4dCAqaCkgeworICAgIGludCBpOworICAgIGNvbnN0IGludDhfdCAoKnRhYilbMl07CisgICAgY29uc3QgaW50IHNsaWNlX3FwID0gYXZfY2xpcChoLT5xc2NhbGUgLSA2KihoLT5zcHMuYml0X2RlcHRoX2x1bWEtOCksIDAsIDUxKTsKKworICAgIGlmKCBoLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfSSApIHRhYiA9IGNhYmFjX2NvbnRleHRfaW5pdF9JOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWIgPSBjYWJhY19jb250ZXh0X2luaXRfUEJbaC0+Y2FiYWNfaW5pdF9pZGNdOworCisgICAgLyogY2FsY3VsYXRlIHByZS1zdGF0ZSAqLworICAgIGZvciggaT0gMDsgaSA8IDEwMjQ7IGkrKyApIHsKKyAgICAgICAgaW50IHByZSA9IDIqKCgodGFiW2ldWzBdICogc2xpY2VfcXApID4+NCApICsgdGFiW2ldWzFdKSAtIDEyNzsKKworICAgICAgICBwcmVePSBwcmU+PjMxOworICAgICAgICBpZihwcmUgPiAxMjQpCisgICAgICAgICAgICBwcmU9IDEyNCArIChwcmUmMSk7CisKKyAgICAgICAgaC0+Y2FiYWNfc3RhdGVbaV0gPSAgcHJlOworICAgIH0KK30KKworc3RhdGljIGludCBkZWNvZGVfY2FiYWNfZmllbGRfZGVjb2RpbmdfZmxhZyhIMjY0Q29udGV4dCAqaCkgeworICAgIGNvbnN0IGxvbmcgbWJiX3h5ID0gaC0+bWJfeHkgLSAyTCpoLT5tYl9zdHJpZGU7CisKKyAgICB1bnNpZ25lZCBsb25nIGN0eCA9IDA7CisKKyAgICBjdHggKz0gaC0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZyAmICEhaC0+bWJfeDsgLy9mb3IgRk1POihzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVttYmFfeHldID4+IDcpICYgKGgtPnNsaWNlX3RhYmxlW21iYV94eV0gPT0gaC0+c2xpY2VfbnVtKTsKKyAgICBjdHggKz0gKGgtPmN1cl9waWMubWJfdHlwZVttYmJfeHldID4+IDcpICYgKGgtPnNsaWNlX3RhYmxlW21iYl94eV0gPT0gaC0+c2xpY2VfbnVtKTsKKworICAgIHJldHVybiBnZXRfY2FiYWNfbm9pbmxpbmUoICZoLT5jYWJhYywgJihoLT5jYWJhY19zdGF0ZSs3MClbY3R4XSApOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jYWJhY19pbnRyYV9tYl90eXBlKEgyNjRDb250ZXh0ICpoLCBpbnQgY3R4X2Jhc2UsIGludCBpbnRyYV9zbGljZSkgeworICAgIHVpbnQ4X3QgKnN0YXRlPSAmaC0+Y2FiYWNfc3RhdGVbY3R4X2Jhc2VdOworICAgIGludCBtYl90eXBlOworCisgICAgaWYoaW50cmFfc2xpY2UpeworICAgICAgICBpbnQgY3R4PTA7CisgICAgICAgIGlmKCBoLT5sZWZ0X3R5cGVbTFRPUF0gJiAoTUJfVFlQRV9JTlRSQTE2eDE2fE1CX1RZUEVfSU5UUkFfUENNKSkKKyAgICAgICAgICAgIGN0eCsrOworICAgICAgICBpZiggaC0+dG9wX3R5cGUgICAgICAgICYgKE1CX1RZUEVfSU5UUkExNngxNnxNQl9UWVBFX0lOVFJBX1BDTSkpCisgICAgICAgICAgICBjdHgrKzsKKyAgICAgICAgaWYoIGdldF9jYWJhY19ub2lubGluZSggJmgtPmNhYmFjLCAmc3RhdGVbY3R4XSApID09IDAgKQorICAgICAgICAgICAgcmV0dXJuIDA7ICAgLyogSTR4NCAqLworICAgICAgICBzdGF0ZSArPSAyOworICAgIH1lbHNleworICAgICAgICBpZiggZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsIHN0YXRlICkgPT0gMCApCisgICAgICAgICAgICByZXR1cm4gMDsgICAvKiBJNHg0ICovCisgICAgfQorCisgICAgaWYoIGdldF9jYWJhY190ZXJtaW5hdGUoICZoLT5jYWJhYyApICkKKyAgICAgICAgcmV0dXJuIDI1OyAgLyogUENNICovCisKKyAgICBtYl90eXBlID0gMTsgLyogSTE2eDE2ICovCisgICAgbWJfdHlwZSArPSAxMiAqIGdldF9jYWJhY19ub2lubGluZSggJmgtPmNhYmFjLCAmc3RhdGVbMV0gKTsgLyogY2JwX2x1bWEgIT0gMCAqLworICAgIGlmKCBnZXRfY2FiYWNfbm9pbmxpbmUoICZoLT5jYWJhYywgJnN0YXRlWzJdICkgKSAvKiBjYnBfY2hyb21hICovCisgICAgICAgIG1iX3R5cGUgKz0gNCArIDQgKiBnZXRfY2FiYWNfbm9pbmxpbmUoICZoLT5jYWJhYywgJnN0YXRlWzIraW50cmFfc2xpY2VdICk7CisgICAgbWJfdHlwZSArPSAyICogZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZzdGF0ZVszK2ludHJhX3NsaWNlXSApOworICAgIG1iX3R5cGUgKz0gMSAqIGdldF9jYWJhY19ub2lubGluZSggJmgtPmNhYmFjLCAmc3RhdGVbMysyKmludHJhX3NsaWNlXSApOworICAgIHJldHVybiBtYl90eXBlOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jYWJhY19tYl9za2lwKCBIMjY0Q29udGV4dCAqaCwgaW50IG1iX3gsIGludCBtYl95ICkgeworICAgIGludCBtYmFfeHksIG1iYl94eTsKKyAgICBpbnQgY3R4ID0gMDsKKworICAgIGlmIChGUkFNRV9NQkFGRihoKSkgeyAvL0ZJWE1FIG1lcmdlIHdpdGggdGhlIHN0dWZmIGluIGZpbGxfY2FjaGVzPworICAgICAgICBpbnQgbWJfeHkgPSBtYl94ICsgKG1iX3kmfjEpKmgtPm1iX3N0cmlkZTsKKyAgICAgICAgbWJhX3h5ID0gbWJfeHkgLSAxOworICAgICAgICBpZiggKG1iX3kmMSkKKyAgICAgICAgICAgICYmIGgtPnNsaWNlX3RhYmxlW21iYV94eV0gPT0gaC0+c2xpY2VfbnVtCisgICAgICAgICAgICAmJiBNQl9GSUVMRChoKSA9PSAhIUlTX0lOVEVSTEFDRUQoIGgtPmN1cl9waWMubWJfdHlwZVttYmFfeHldICkgKQorICAgICAgICAgICAgbWJhX3h5ICs9IGgtPm1iX3N0cmlkZTsKKyAgICAgICAgaWYgKE1CX0ZJRUxEKGgpKSB7CisgICAgICAgICAgICBtYmJfeHkgPSBtYl94eSAtIGgtPm1iX3N0cmlkZTsKKyAgICAgICAgICAgIGlmKCAhKG1iX3kmMSkKKyAgICAgICAgICAgICAgICAmJiBoLT5zbGljZV90YWJsZVttYmJfeHldID09IGgtPnNsaWNlX251bQorICAgICAgICAgICAgICAgICYmIElTX0lOVEVSTEFDRUQoIGgtPmN1cl9waWMubWJfdHlwZVttYmJfeHldICkgKQorICAgICAgICAgICAgICAgIG1iYl94eSAtPSBoLT5tYl9zdHJpZGU7CisgICAgICAgIH1lbHNlCisgICAgICAgICAgICBtYmJfeHkgPSBtYl94ICsgKG1iX3ktMSkqaC0+bWJfc3RyaWRlOworICAgIH1lbHNleworICAgICAgICBpbnQgbWJfeHkgPSBoLT5tYl94eTsKKyAgICAgICAgbWJhX3h5ID0gbWJfeHkgLSAxOworICAgICAgICBtYmJfeHkgPSBtYl94eSAtIChoLT5tYl9zdHJpZGUgPDwgRklFTERfUElDVFVSRShoKSk7CisgICAgfQorCisgICAgaWYoIGgtPnNsaWNlX3RhYmxlW21iYV94eV0gPT0gaC0+c2xpY2VfbnVtICYmICFJU19TS0lQKGgtPmN1cl9waWMubWJfdHlwZVttYmFfeHldICkpCisgICAgICAgIGN0eCsrOworICAgIGlmKCBoLT5zbGljZV90YWJsZVttYmJfeHldID09IGgtPnNsaWNlX251bSAmJiAhSVNfU0tJUChoLT5jdXJfcGljLm1iX3R5cGVbbWJiX3h5XSApKQorICAgICAgICBjdHgrKzsKKworICAgIGlmKCBoLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQiApCisgICAgICAgIGN0eCArPSAxMzsKKyAgICByZXR1cm4gZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVsxMStjdHhdICk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2NhYmFjX21iX2ludHJhNHg0X3ByZWRfbW9kZSggSDI2NENvbnRleHQgKmgsIGludCBwcmVkX21vZGUgKSB7CisgICAgaW50IG1vZGUgPSAwOworCisgICAgaWYoIGdldF9jYWJhYyggJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbNjhdICkgKQorICAgICAgICByZXR1cm4gcHJlZF9tb2RlOworCisgICAgbW9kZSArPSAxICogZ2V0X2NhYmFjKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVs2OV0gKTsKKyAgICBtb2RlICs9IDIgKiBnZXRfY2FiYWMoICZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlWzY5XSApOworICAgIG1vZGUgKz0gNCAqIGdldF9jYWJhYyggJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbNjldICk7CisKKyAgICByZXR1cm4gbW9kZSArICggbW9kZSA+PSBwcmVkX21vZGUgKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfY2FiYWNfbWJfY2hyb21hX3ByZV9tb2RlKCBIMjY0Q29udGV4dCAqaCkgeworICAgIGNvbnN0IGludCBtYmFfeHkgPSBoLT5sZWZ0X21iX3h5WzBdOworICAgIGNvbnN0IGludCBtYmJfeHkgPSBoLT50b3BfbWJfeHk7CisKKyAgICBpbnQgY3R4ID0gMDsKKworICAgIC8qIE5vIG5lZWQgdG8gdGVzdCBmb3IgSVNfSU5UUkE0eDQgYW5kIElTX0lOVFJBMTZ4MTYsIGFzIHdlIHNldCBjaHJvbWFfcHJlZF9tb2RlX3RhYmxlIHRvIDAgKi8KKyAgICBpZiggaC0+bGVmdF90eXBlW0xUT1BdICYmIGgtPmNocm9tYV9wcmVkX21vZGVfdGFibGVbbWJhX3h5XSAhPSAwICkKKyAgICAgICAgY3R4Kys7CisKKyAgICBpZiggaC0+dG9wX3R5cGUgICAgICAgICYmIGgtPmNocm9tYV9wcmVkX21vZGVfdGFibGVbbWJiX3h5XSAhPSAwICkKKyAgICAgICAgY3R4Kys7CisKKyAgICBpZiggZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVs2NCtjdHhdICkgPT0gMCApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYoIGdldF9jYWJhY19ub2lubGluZSggJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbNjQrM10gKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYoIGdldF9jYWJhY19ub2lubGluZSggJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbNjQrM10gKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMzsKK30KKworc3RhdGljIGludCBkZWNvZGVfY2FiYWNfbWJfY2JwX2x1bWEoIEgyNjRDb250ZXh0ICpoKSB7CisgICAgaW50IGNicF9iLCBjYnBfYSwgY3R4LCBjYnAgPSAwOworCisgICAgY2JwX2EgPSBoLT5sZWZ0X2NicDsKKyAgICBjYnBfYiA9IGgtPnRvcF9jYnA7CisKKyAgICBjdHggPSAhKGNicF9hICYgMHgwMikgKyAyICogIShjYnBfYiAmIDB4MDQpOworICAgIGNicCArPSBnZXRfY2FiYWNfbm9pbmxpbmUoJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbNzMgKyBjdHhdKTsKKyAgICBjdHggPSAhKGNicCAgICYgMHgwMSkgKyAyICogIShjYnBfYiAmIDB4MDgpOworICAgIGNicCArPSBnZXRfY2FiYWNfbm9pbmxpbmUoJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbNzMgKyBjdHhdKSA8PCAxOworICAgIGN0eCA9ICEoY2JwX2EgJiAweDA4KSArIDIgKiAhKGNicCAgICYgMHgwMSk7CisgICAgY2JwICs9IGdldF9jYWJhY19ub2lubGluZSgmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVs3MyArIGN0eF0pIDw8IDI7CisgICAgY3R4ID0gIShjYnAgICAmIDB4MDQpICsgMiAqICEoY2JwICAgJiAweDAyKTsKKyAgICBjYnAgKz0gZ2V0X2NhYmFjX25vaW5saW5lKCZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlWzczICsgY3R4XSkgPDwgMzsKKyAgICByZXR1cm4gY2JwOworfQorc3RhdGljIGludCBkZWNvZGVfY2FiYWNfbWJfY2JwX2Nocm9tYSggSDI2NENvbnRleHQgKmgpIHsKKyAgICBpbnQgY3R4OworICAgIGludCBjYnBfYSwgY2JwX2I7CisKKyAgICBjYnBfYSA9IChoLT5sZWZ0X2NicD4+NCkmMHgwMzsKKyAgICBjYnBfYiA9IChoLT4gdG9wX2NicD4+NCkmMHgwMzsKKworICAgIGN0eCA9IDA7CisgICAgaWYoIGNicF9hID4gMCApIGN0eCsrOworICAgIGlmKCBjYnBfYiA+IDAgKSBjdHggKz0gMjsKKyAgICBpZiggZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVs3NyArIGN0eF0gKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjdHggPSA0OworICAgIGlmKCBjYnBfYSA9PSAyICkgY3R4Kys7CisgICAgaWYoIGNicF9iID09IDIgKSBjdHggKz0gMjsKKyAgICByZXR1cm4gMSArIGdldF9jYWJhY19ub2lubGluZSggJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbNzcgKyBjdHhdICk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2NhYmFjX3BfbWJfc3ViX3R5cGUoIEgyNjRDb250ZXh0ICpoICkgeworICAgIGlmKCBnZXRfY2FiYWMoICZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlWzIxXSApICkKKyAgICAgICAgcmV0dXJuIDA7ICAgLyogOHg4ICovCisgICAgaWYoICFnZXRfY2FiYWMoICZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlWzIyXSApICkKKyAgICAgICAgcmV0dXJuIDE7ICAgLyogOHg0ICovCisgICAgaWYoIGdldF9jYWJhYyggJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbMjNdICkgKQorICAgICAgICByZXR1cm4gMjsgICAvKiA0eDggKi8KKyAgICByZXR1cm4gMzsgICAgICAgLyogNHg0ICovCit9CitzdGF0aWMgaW50IGRlY29kZV9jYWJhY19iX21iX3N1Yl90eXBlKCBIMjY0Q29udGV4dCAqaCApIHsKKyAgICBpbnQgdHlwZTsKKyAgICBpZiggIWdldF9jYWJhYyggJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbMzZdICkgKQorICAgICAgICByZXR1cm4gMDsgICAvKiBCX0RpcmVjdF84eDggKi8KKyAgICBpZiggIWdldF9jYWJhYyggJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbMzddICkgKQorICAgICAgICByZXR1cm4gMSArIGdldF9jYWJhYyggJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbMzldICk7IC8qIEJfTDBfOHg4LCBCX0wxXzh4OCAqLworICAgIHR5cGUgPSAzOworICAgIGlmKCBnZXRfY2FiYWMoICZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlWzM4XSApICkgeworICAgICAgICBpZiggZ2V0X2NhYmFjKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVszOV0gKSApCisgICAgICAgICAgICByZXR1cm4gMTEgKyBnZXRfY2FiYWMoICZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlWzM5XSApOyAvKiBCX0wxXzR4NCwgQl9CaV80eDQgKi8KKyAgICAgICAgdHlwZSArPSA0OworICAgIH0KKyAgICB0eXBlICs9IDIqZ2V0X2NhYmFjKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVszOV0gKTsKKyAgICB0eXBlICs9ICAgZ2V0X2NhYmFjKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVszOV0gKTsKKyAgICByZXR1cm4gdHlwZTsKK30KKworc3RhdGljIGludCBkZWNvZGVfY2FiYWNfbWJfcmVmKCBIMjY0Q29udGV4dCAqaCwgaW50IGxpc3QsIGludCBuICkgeworICAgIGludCByZWZhID0gaC0+cmVmX2NhY2hlW2xpc3RdW3NjYW44W25dIC0gMV07CisgICAgaW50IHJlZmIgPSBoLT5yZWZfY2FjaGVbbGlzdF1bc2Nhbjhbbl0gLSA4XTsKKyAgICBpbnQgcmVmICA9IDA7CisgICAgaW50IGN0eCAgPSAwOworCisgICAgaWYoIGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIGlmKCByZWZhID4gMCAmJiAhKGgtPmRpcmVjdF9jYWNoZVtzY2FuOFtuXSAtIDFdJihNQl9UWVBFX0RJUkVDVDI+PjEpKSApCisgICAgICAgICAgICBjdHgrKzsKKyAgICAgICAgaWYoIHJlZmIgPiAwICYmICEoaC0+ZGlyZWN0X2NhY2hlW3NjYW44W25dIC0gOF0mKE1CX1RZUEVfRElSRUNUMj4+MSkpICkKKyAgICAgICAgICAgIGN0eCArPSAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCByZWZhID4gMCApCisgICAgICAgICAgICBjdHgrKzsKKyAgICAgICAgaWYoIHJlZmIgPiAwICkKKyAgICAgICAgICAgIGN0eCArPSAyOworICAgIH0KKworICAgIHdoaWxlKCBnZXRfY2FiYWMoICZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlWzU0K2N0eF0gKSApIHsKKyAgICAgICAgcmVmKys7CisgICAgICAgIGN0eCA9IChjdHg+PjIpKzQ7CisgICAgICAgIGlmKHJlZiA+PSAzMiAvKmgtPnJlZl9saXN0W2xpc3RdKi8peworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZWY7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2NhYmFjX21iX212ZCggSDI2NENvbnRleHQgKmgsIGludCBjdHhiYXNlLCBpbnQgYW12ZCwgaW50ICptdmRhKSB7CisgICAgaW50IG12ZDsKKworICAgIGlmKCFnZXRfY2FiYWMoJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbY3R4YmFzZSsoKGFtdmQtMyk+PihJTlRfQklULTEpKSsoKGFtdmQtMzMpPj4oSU5UX0JJVC0xKSkrMl0pKXsKKy8vICAgIGlmKCFnZXRfY2FiYWMoJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbY3R4YmFzZSsoYW12ZD4yKSsoYW12ZD4zMildKSl7CisgICAgICAgICptdmRhPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBtdmQ9IDE7CisgICAgY3R4YmFzZSs9IDM7CisgICAgd2hpbGUoIG12ZCA8IDkgJiYgZ2V0X2NhYmFjKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVtjdHhiYXNlXSApICkgeworICAgICAgICBpZiggbXZkIDwgNCApCisgICAgICAgICAgICBjdHhiYXNlKys7CisgICAgICAgIG12ZCsrOworICAgIH0KKworICAgIGlmKCBtdmQgPj0gOSApIHsKKyAgICAgICAgaW50IGsgPSAzOworICAgICAgICB3aGlsZSggZ2V0X2NhYmFjX2J5cGFzcyggJmgtPmNhYmFjICkgKSB7CisgICAgICAgICAgICBtdmQgKz0gMSA8PCBrOworICAgICAgICAgICAgaysrOworICAgICAgICAgICAgaWYoaz4yNCl7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJvdmVyZmxvdyBpbiBkZWNvZGVfY2FiYWNfbWJfbXZkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5UX01JTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSggay0tICkgeworICAgICAgICAgICAgbXZkICs9IGdldF9jYWJhY19ieXBhc3MoICZoLT5jYWJhYyApPDxrOworICAgICAgICB9CisgICAgICAgICptdmRhPW12ZCA8IDcwID8gbXZkIDogNzA7CisgICAgfWVsc2UKKyAgICAgICAgKm12ZGE9bXZkOworICAgIHJldHVybiBnZXRfY2FiYWNfYnlwYXNzX3NpZ24oICZoLT5jYWJhYywgLW12ZCApOworfQorCisjZGVmaW5lIERFQ09ERV9DQUJBQ19NQl9NVkQoIGgsICBsaXN0LCAgbiApXAore1wKKyAgICBpbnQgYW12ZDAgPSBoLT5tdmRfY2FjaGVbbGlzdF1bc2Nhbjhbbl0gLSAxXVswXSArXAorICAgICAgICAgICAgICAgIGgtPm12ZF9jYWNoZVtsaXN0XVtzY2FuOFtuXSAtIDhdWzBdO1wKKyAgICBpbnQgYW12ZDEgPSBoLT5tdmRfY2FjaGVbbGlzdF1bc2Nhbjhbbl0gLSAxXVsxXSArXAorICAgICAgICAgICAgICAgIGgtPm12ZF9jYWNoZVtsaXN0XVtzY2FuOFtuXSAtIDhdWzFdO1wKK1wKKyAgICBteCArPSBkZWNvZGVfY2FiYWNfbWJfbXZkKCBoLCA0MCwgYW12ZDAsICZtcHggKTtcCisgICAgbXkgKz0gZGVjb2RlX2NhYmFjX21iX212ZCggaCwgNDcsIGFtdmQxLCAmbXB5ICk7XAorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X2NhYmFjX2NiZl9jdHgoIEgyNjRDb250ZXh0ICpoLCBpbnQgY2F0LCBpbnQgaWR4LCBpbnQgbWF4X2NvZWZmLCBpbnQgaXNfZGMgKSB7CisgICAgaW50IG56YSwgbnpiOworICAgIGludCBjdHggPSAwOworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBiYXNlX2N0eFsxNF0gPSB7ODUsODksOTMsOTcsMTAxLDEwMTIsNDYwLDQ2NCw0NjgsMTAxNiw0NzIsNDc2LDQ4MCwxMDIwfTsKKworICAgIGlmKCBpc19kYyApIHsKKyAgICAgICAgaWYoIGNhdCA9PSAzICkgeworICAgICAgICAgICAgaWR4IC09IENIUk9NQV9EQ19CTE9DS19JTkRFWDsKKyAgICAgICAgICAgIG56YSA9IChoLT5sZWZ0X2NicD4+KDYraWR4KSkmMHgwMTsKKyAgICAgICAgICAgIG56YiA9IChoLT4gdG9wX2NicD4+KDYraWR4KSkmMHgwMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlkeCAtPSBMVU1BX0RDX0JMT0NLX0lOREVYOworICAgICAgICAgICAgbnphID0gaC0+bGVmdF9jYnAmKDB4MTAwPDxpZHgpOworICAgICAgICAgICAgbnpiID0gaC0+IHRvcF9jYnAmKDB4MTAwPDxpZHgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbnphID0gaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbaWR4XSAtIDFdOworICAgICAgICBuemIgPSBoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtpZHhdIC0gOF07CisgICAgfQorCisgICAgaWYoIG56YSA+IDAgKQorICAgICAgICBjdHgrKzsKKworICAgIGlmKCBuemIgPiAwICkKKyAgICAgICAgY3R4ICs9IDI7CisKKyAgICByZXR1cm4gYmFzZV9jdHhbY2F0XSArIGN0eDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZAorZGVjb2RlX2NhYmFjX3Jlc2lkdWFsX2ludGVybmFsKEgyNjRDb250ZXh0ICpoLCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2F0LCBpbnQgbiwgY29uc3QgdWludDhfdCAqc2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpxbXVsLCBpbnQgbWF4X2NvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19kYywgaW50IGNocm9tYTQyMikKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IHNpZ25pZmljYW50X2NvZWZmX2ZsYWdfb2Zmc2V0WzJdWzE0XSA9IHsKKyAgICAgIHsgMTA1KzAsIDEwNSsxNSwgMTA1KzI5LCAxMDUrNDQsIDEwNSs0NywgNDAyLCA0ODQrMCwgNDg0KzE1LCA0ODQrMjksIDY2MCwgNTI4KzAsIDUyOCsxNSwgNTI4KzI5LCA3MTggfSwKKyAgICAgIHsgMjc3KzAsIDI3NysxNSwgMjc3KzI5LCAyNzcrNDQsIDI3Nys0NywgNDM2LCA3NzYrMCwgNzc2KzE1LCA3NzYrMjksIDY3NSwgODIwKzAsIDgyMCsxNSwgODIwKzI5LCA3MzMgfQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGludCBsYXN0X2NvZWZmX2ZsYWdfb2Zmc2V0WzJdWzE0XSA9IHsKKyAgICAgIHsgMTY2KzAsIDE2NisxNSwgMTY2KzI5LCAxNjYrNDQsIDE2Nis0NywgNDE3LCA1NzIrMCwgNTcyKzE1LCA1NzIrMjksIDY5MCwgNjE2KzAsIDYxNisxNSwgNjE2KzI5LCA3NDggfSwKKyAgICAgIHsgMzM4KzAsIDMzOCsxNSwgMzM4KzI5LCAzMzgrNDQsIDMzOCs0NywgNDUxLCA4NjQrMCwgODY0KzE1LCA4NjQrMjksIDY5OSwgOTA4KzAsIDkwOCsxNSwgOTA4KzI5LCA3NTcgfQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGludCBjb2VmZl9hYnNfbGV2ZWxfbTFfb2Zmc2V0WzE0XSA9IHsKKyAgICAgICAgMjI3KzAsIDIyNysxMCwgMjI3KzIwLCAyMjcrMzAsIDIyNyszOSwgNDI2LCA5NTIrMCwgOTUyKzEwLCA5NTIrMjAsIDcwOCwgOTgyKzAsIDk4MisxMCwgOTgyKzIwLCA3NjYKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHNpZ25pZmljYW50X2NvZWZmX2ZsYWdfb2Zmc2V0Xzh4OFsyXVs2M10gPSB7CisgICAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDUsIDQsIDQsIDMsIDMsIDQsIDQsIDQsIDUsIDUsCisgICAgICAgIDQsIDQsIDQsIDQsIDMsIDMsIDYsIDcsIDcsIDcsIDgsIDksMTAsIDksIDgsIDcsCisgICAgICAgIDcsIDYsMTEsMTIsMTMsMTEsIDYsIDcsIDgsIDksMTQsMTAsIDksIDgsIDYsMTEsCisgICAgICAgMTIsMTMsMTEsIDYsIDksMTQsMTAsIDksMTEsMTIsMTMsMTEsMTQsMTAsMTIgfSwKKyAgICAgIHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNSwgNiwgNywgNywgNywgOCwgNCwgNSwKKyAgICAgICAgNiwgOSwxMCwxMCwgOCwxMSwxMiwxMSwgOSwgOSwxMCwxMCwgOCwxMSwxMiwxMSwKKyAgICAgICAgOSwgOSwxMCwxMCwgOCwxMSwxMiwxMSwgOSwgOSwxMCwxMCwgOCwxMywxMywgOSwKKyAgICAgICAgOSwxMCwxMCwgOCwxMywxMywgOSwgOSwxMCwxMCwxNCwxNCwxNCwxNCwxNCB9CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBzaWdfY29lZmZfb2Zmc2V0X2RjWzddID0geyAwLCAwLCAxLCAxLCAyLCAyLCAyIH07CisgICAgLyogbm9kZSBjdHg6IDAuLjM6IGFic2xldmVsMSAod2l0aCBhYnNsZXZlbGd0MSA9PSAwKS4KKyAgICAgKiA0Li43OiBhYnNsZXZlbGd0MSArIDMgKGFuZCBhYnNsZXZlbDEgZG9lc24ndCBtYXR0ZXIpLgorICAgICAqIG1hcCBub2RlIGN0eCA9PiBjYWJhYyBjdHggZm9yIGxldmVsPTEgKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBjb2VmZl9hYnNfbGV2ZWwxX2N0eFs4XSA9IHsgMSwgMiwgMywgNCwgMCwgMCwgMCwgMCB9OworICAgIC8qIG1hcCBub2RlIGN0eCA9PiBjYWJhYyBjdHggZm9yIGxldmVsPjEgKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBjb2VmZl9hYnNfbGV2ZWxndDFfY3R4WzJdWzhdID0geworICAgICAgICB7IDUsIDUsIDUsIDUsIDYsIDcsIDgsIDkgfSwKKyAgICAgICAgeyA1LCA1LCA1LCA1LCA2LCA3LCA4LCA4IH0sIC8vIDQyMi9kYyBjYXNlCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBjb2VmZl9hYnNfbGV2ZWxfdHJhbnNpdGlvblsyXVs4XSA9IHsKKyAgICAvKiB1cGRhdGUgbm9kZSBjdHggYWZ0ZXIgZGVjb2RpbmcgYSBsZXZlbD0xICovCisgICAgICAgIHsgMSwgMiwgMywgMywgNCwgNSwgNiwgNyB9LAorICAgIC8qIHVwZGF0ZSBub2RlIGN0eCBhZnRlciBkZWNvZGluZyBhIGxldmVsPjEgKi8KKyAgICAgICAgeyA0LCA0LCA0LCA0LCA1LCA2LCA3LCA3IH0KKyAgICB9OworCisgICAgaW50IGluZGV4WzY0XTsKKworICAgIGludCBsYXN0OworICAgIGludCBjb2VmZl9jb3VudCA9IDA7CisgICAgaW50IG5vZGVfY3R4ID0gMDsKKworICAgIHVpbnQ4X3QgKnNpZ25pZmljYW50X2NvZWZmX2N0eF9iYXNlOworICAgIHVpbnQ4X3QgKmxhc3RfY29lZmZfY3R4X2Jhc2U7CisgICAgdWludDhfdCAqYWJzX2xldmVsX20xX2N0eF9iYXNlOworCisjaWYgIUFSQ0hfWDg2CisjZGVmaW5lIENBQkFDX09OX1NUQUNLCisjZW5kaWYKKyNpZmRlZiBDQUJBQ19PTl9TVEFDSworI2RlZmluZSBDQyAmY2MKKyAgICBDQUJBQ0NvbnRleHQgY2M7CisgICAgY2MucmFuZ2UgICAgID0gaC0+Y2FiYWMucmFuZ2U7CisgICAgY2MubG93ICAgICAgID0gaC0+Y2FiYWMubG93OworICAgIGNjLmJ5dGVzdHJlYW09IGgtPmNhYmFjLmJ5dGVzdHJlYW07CisjaWYgIVVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSIHx8IEFSQ0hfQUFSQ0g2NAorICAgIGNjLmJ5dGVzdHJlYW1fZW5kID0gaC0+Y2FiYWMuYnl0ZXN0cmVhbV9lbmQ7CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIENDICZoLT5jYWJhYworI2VuZGlmCisKKyAgICBzaWduaWZpY2FudF9jb2VmZl9jdHhfYmFzZSA9IGgtPmNhYmFjX3N0YXRlCisgICAgICAgICsgc2lnbmlmaWNhbnRfY29lZmZfZmxhZ19vZmZzZXRbTUJfRklFTEQoaCldW2NhdF07CisgICAgbGFzdF9jb2VmZl9jdHhfYmFzZSA9IGgtPmNhYmFjX3N0YXRlCisgICAgICAgICsgbGFzdF9jb2VmZl9mbGFnX29mZnNldFtNQl9GSUVMRChoKV1bY2F0XTsKKyAgICBhYnNfbGV2ZWxfbTFfY3R4X2Jhc2UgPSBoLT5jYWJhY19zdGF0ZQorICAgICAgICArIGNvZWZmX2Fic19sZXZlbF9tMV9vZmZzZXRbY2F0XTsKKworICAgIGlmKCAhaXNfZGMgJiYgbWF4X2NvZWZmID09IDY0ICkgeworI2RlZmluZSBERUNPREVfU0lHTklGSUNBTkNFKCBjb2Vmcywgc2lnX29mZiwgbGFzdF9vZmYgKSBcCisgICAgICAgIGZvcihsYXN0PSAwOyBsYXN0IDwgY29lZnM7IGxhc3QrKykgeyBcCisgICAgICAgICAgICB1aW50OF90ICpzaWdfY3R4ID0gc2lnbmlmaWNhbnRfY29lZmZfY3R4X2Jhc2UgKyBzaWdfb2ZmOyBcCisgICAgICAgICAgICBpZiggZ2V0X2NhYmFjKCBDQywgc2lnX2N0eCApKSB7IFwKKyAgICAgICAgICAgICAgICB1aW50OF90ICpsYXN0X2N0eCA9IGxhc3RfY29lZmZfY3R4X2Jhc2UgKyBsYXN0X29mZjsgXAorICAgICAgICAgICAgICAgIGluZGV4W2NvZWZmX2NvdW50KytdID0gbGFzdDsgXAorICAgICAgICAgICAgICAgIGlmKCBnZXRfY2FiYWMoIENDLCBsYXN0X2N0eCApICkgeyBcCisgICAgICAgICAgICAgICAgICAgIGxhc3Q9IG1heF9jb2VmZjsgXAorICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH1cCisgICAgICAgIGlmKCBsYXN0ID09IG1heF9jb2VmZiAtMSApIHtcCisgICAgICAgICAgICBpbmRleFtjb2VmZl9jb3VudCsrXSA9IGxhc3Q7XAorICAgICAgICB9CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZ19vZmYgPSBzaWduaWZpY2FudF9jb2VmZl9mbGFnX29mZnNldF84eDhbTUJfRklFTEQoaCldOworI2lmZGVmIGRlY29kZV9zaWduaWZpY2FuY2UKKyAgICAgICAgY29lZmZfY291bnQgPSBkZWNvZGVfc2lnbmlmaWNhbmNlXzh4OChDQywgc2lnbmlmaWNhbnRfY29lZmZfY3R4X2Jhc2UsIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfY29lZmZfY3R4X2Jhc2UsIHNpZ19vZmYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc19kYyAmJiBjaHJvbWE0MjIpIHsgLy8gZGMgNDIyCisgICAgICAgICAgICBERUNPREVfU0lHTklGSUNBTkNFKDcsIHNpZ19jb2VmZl9vZmZzZXRfZGNbbGFzdF0sIHNpZ19jb2VmZl9vZmZzZXRfZGNbbGFzdF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29lZmZfY291bnQgPSBkZWNvZGVfc2lnbmlmaWNhbmNlKENDLCBtYXhfY29lZmYsIHNpZ25pZmljYW50X2NvZWZmX2N0eF9iYXNlLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvZWZmX2N0eF9iYXNlLXNpZ25pZmljYW50X2NvZWZmX2N0eF9iYXNlKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgREVDT0RFX1NJR05JRklDQU5DRSggNjMsIHNpZ19vZmZbbGFzdF0sIGZmX2gyNjRfbGFzdF9jb2VmZl9mbGFnX29mZnNldF84eDhbbGFzdF0gKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaXNfZGMgJiYgY2hyb21hNDIyKSB7IC8vIGRjIDQyMgorICAgICAgICAgICAgREVDT0RFX1NJR05JRklDQU5DRSg3LCBzaWdfY29lZmZfb2Zmc2V0X2RjW2xhc3RdLCBzaWdfY29lZmZfb2Zmc2V0X2RjW2xhc3RdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERFQ09ERV9TSUdOSUZJQ0FOQ0UobWF4X2NvZWZmIC0gMSwgbGFzdCwgbGFzdCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBhdl9hc3NlcnQyKGNvZWZmX2NvdW50ID4gMCk7CisKKyAgICBpZiggaXNfZGMgKSB7CisgICAgICAgIGlmKCBjYXQgPT0gMyApCisgICAgICAgICAgICBoLT5jYnBfdGFibGVbaC0+bWJfeHldIHw9IDB4NDAgPDwgKG4gLSBDSFJPTUFfRENfQkxPQ0tfSU5ERVgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoLT5jYnBfdGFibGVbaC0+bWJfeHldIHw9IDB4MTAwIDw8IChuIC0gTFVNQV9EQ19CTE9DS19JTkRFWCk7CisgICAgICAgIGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W25dXSA9IGNvZWZmX2NvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCBtYXhfY29lZmYgPT0gNjQgKQorICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W25dXSwgMiwgMiwgOCwgY29lZmZfY291bnQsIDEpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGF2X2Fzc2VydDIoIGNhdCA9PSAxIHx8IGNhdCA9PSAgMiB8fCBjYXQgPT0gIDQgfHwgY2F0ID09IDcgfHwgY2F0ID09IDggfHwgY2F0ID09IDExIHx8IGNhdCA9PSAxMiApOworICAgICAgICAgICAgaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2Nhbjhbbl1dID0gY29lZmZfY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyNkZWZpbmUgU1RPUkVfQkxPQ0sodHlwZSkgXAorICAgIGRvIHsgXAorICAgICAgICB1aW50OF90ICpjdHggPSBjb2VmZl9hYnNfbGV2ZWwxX2N0eFtub2RlX2N0eF0gKyBhYnNfbGV2ZWxfbTFfY3R4X2Jhc2U7IFwKKyBcCisgICAgICAgIGludCBqPSBzY2FudGFibGVbaW5kZXhbLS1jb2VmZl9jb3VudF1dOyBcCisgXAorICAgICAgICBpZiggZ2V0X2NhYmFjKCBDQywgY3R4ICkgPT0gMCApIHsgXAorICAgICAgICAgICAgbm9kZV9jdHggPSBjb2VmZl9hYnNfbGV2ZWxfdHJhbnNpdGlvblswXVtub2RlX2N0eF07IFwKKyAgICAgICAgICAgIGlmKCBpc19kYyApIHsgXAorICAgICAgICAgICAgICAgICgodHlwZSopYmxvY2spW2pdID0gZ2V0X2NhYmFjX2J5cGFzc19zaWduKCBDQywgLTEpOyBcCisgICAgICAgICAgICB9ZWxzZXsgXAorICAgICAgICAgICAgICAgICgodHlwZSopYmxvY2spW2pdID0gKGdldF9jYWJhY19ieXBhc3Nfc2lnbiggQ0MsIC1xbXVsW2pdKSArIDMyKSA+PiA2OyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgaW50IGNvZWZmX2FicyA9IDI7IFwKKyAgICAgICAgICAgIGN0eCA9IGNvZWZmX2Fic19sZXZlbGd0MV9jdHhbaXNfZGMgJiYgY2hyb21hNDIyXVtub2RlX2N0eF0gKyBhYnNfbGV2ZWxfbTFfY3R4X2Jhc2U7IFwKKyAgICAgICAgICAgIG5vZGVfY3R4ID0gY29lZmZfYWJzX2xldmVsX3RyYW5zaXRpb25bMV1bbm9kZV9jdHhdOyBcCitcCisgICAgICAgICAgICB3aGlsZSggY29lZmZfYWJzIDwgMTUgJiYgZ2V0X2NhYmFjKCBDQywgY3R4ICkgKSB7IFwKKyAgICAgICAgICAgICAgICBjb2VmZl9hYnMrKzsgXAorICAgICAgICAgICAgfSBcCitcCisgICAgICAgICAgICBpZiggY29lZmZfYWJzID49IDE1ICkgeyBcCisgICAgICAgICAgICAgICAgaW50IGogPSAwOyBcCisgICAgICAgICAgICAgICAgd2hpbGUoZ2V0X2NhYmFjX2J5cGFzcyggQ0MgKSAmJiBqPDMwKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaisrOyBcCisgICAgICAgICAgICAgICAgfSBcCitcCisgICAgICAgICAgICAgICAgY29lZmZfYWJzPTE7IFwKKyAgICAgICAgICAgICAgICB3aGlsZSggai0tICkgeyBcCisgICAgICAgICAgICAgICAgICAgIGNvZWZmX2FicyArPSBjb2VmZl9hYnMgKyBnZXRfY2FiYWNfYnlwYXNzKCBDQyApOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgY29lZmZfYWJzKz0gMTQ7IFwKKyAgICAgICAgICAgIH0gXAorXAorICAgICAgICAgICAgaWYoIGlzX2RjICkgeyBcCisgICAgICAgICAgICAgICAgKCh0eXBlKilibG9jaylbal0gPSBnZXRfY2FiYWNfYnlwYXNzX3NpZ24oIENDLCAtY29lZmZfYWJzICk7IFwKKyAgICAgICAgICAgIH1lbHNleyBcCisgICAgICAgICAgICAgICAgKCh0eXBlKilibG9jaylbal0gPSAoKGludCkoZ2V0X2NhYmFjX2J5cGFzc19zaWduKCBDQywgLWNvZWZmX2FicyApICogcW11bFtqXSArIDMyKSkgPj4gNjsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKCBjb2VmZl9jb3VudCApOworCisgICAgaWYgKGgtPnBpeGVsX3NoaWZ0KSB7CisgICAgICAgIFNUT1JFX0JMT0NLKGludDMyX3QpCisgICAgfSBlbHNlIHsKKyAgICAgICAgU1RPUkVfQkxPQ0soaW50MTZfdCkKKyAgICB9CisjaWZkZWYgQ0FCQUNfT05fU1RBQ0sKKyAgICAgICAgICAgIGgtPmNhYmFjLnJhbmdlICAgICA9IGNjLnJhbmdlICAgICA7CisgICAgICAgICAgICBoLT5jYWJhYy5sb3cgICAgICAgPSBjYy5sb3cgICAgICAgOworICAgICAgICAgICAgaC0+Y2FiYWMuYnl0ZXN0cmVhbT0gY2MuYnl0ZXN0cmVhbTsKKyNlbmRpZgorCit9CisKK3N0YXRpYyBhdl9ub2lubGluZSB2b2lkIGRlY29kZV9jYWJhY19yZXNpZHVhbF9kY19pbnRlcm5hbChIMjY0Q29udGV4dCAqaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2F0LCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jb2VmZikKK3sKKyAgICBkZWNvZGVfY2FiYWNfcmVzaWR1YWxfaW50ZXJuYWwoaCwgYmxvY2ssIGNhdCwgbiwgc2NhbnRhYmxlLCBOVUxMLCBtYXhfY29lZmYsIDEsIDApOworfQorCitzdGF0aWMgYXZfbm9pbmxpbmUgdm9pZCBkZWNvZGVfY2FiYWNfcmVzaWR1YWxfZGNfaW50ZXJuYWxfNDIyKEgyNjRDb250ZXh0ICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhdCwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jb2VmZikKK3sKKyAgICBkZWNvZGVfY2FiYWNfcmVzaWR1YWxfaW50ZXJuYWwoaCwgYmxvY2ssIGNhdCwgbiwgc2NhbnRhYmxlLCBOVUxMLCBtYXhfY29lZmYsIDEsIDEpOworfQorCitzdGF0aWMgYXZfbm9pbmxpbmUgdm9pZCBkZWNvZGVfY2FiYWNfcmVzaWR1YWxfbm9uZGNfaW50ZXJuYWwoSDI2NENvbnRleHQgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhdCwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpxbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfY29lZmYpCit7CisgICAgZGVjb2RlX2NhYmFjX3Jlc2lkdWFsX2ludGVybmFsKGgsIGJsb2NrLCBjYXQsIG4sIHNjYW50YWJsZSwgcW11bCwgbWF4X2NvZWZmLCAwLCAwKTsKK30KKworLyogY2F0OiAwLT4gREMgMTZ4MTYgIG4gPSAwCisgKiAgICAgIDEtPiBBQyAxNngxNiAgbiA9IGx1bWE0eDRpZHgKKyAqICAgICAgMi0+IEx1bWE0eDQgICBuID0gbHVtYTR4NGlkeAorICogICAgICAzLT4gREMgQ2hyb21hIG4gPSBpQ2JDcgorICogICAgICA0LT4gQUMgQ2hyb21hIG4gPSAxNiArIDQgKiBpQ2JDciArIGNocm9tYTR4NGlkeAorICogICAgICA1LT4gTHVtYTh4OCAgIG4gPSA0ICogbHVtYTh4OGlkeCAqLworCisvKiBQYXJ0aWFsbHkgaW5saW5lIHRoZSBDQUJBQyByZXNpZHVhbCBkZWNvZGU6IGlubGluZSB0aGUgY29kZWQgYmxvY2sgZmxhZy4KKyAqIFRoaXMgaGFzIHZlcnkgbGl0dGxlIGltcGFjdCBvbiBiaW5hcnkgc2l6ZSBhbmQgaW1wcm92ZXMgcGVyZm9ybWFuY2UKKyAqIGJlY2F1c2UgaXQgYWxsb3dzIGltcHJvdmVkIGNvbnN0YW50IHByb3BhZ2F0aW9uIGludG8gZ2V0X2NhYmFjX2NiZl9jdHgsCisgKiBhcyB3ZWxsIGFzIGJlY2F1c2UgbW9zdCBibG9ja3MgaGF2ZSB6ZXJvIENCRnMuICovCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZGVjb2RlX2NhYmFjX3Jlc2lkdWFsX2RjKEgyNjRDb250ZXh0ICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2F0LCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfY29lZmYpCit7CisgICAgLyogcmVhZCBjb2RlZCBibG9jayBmbGFnICovCisgICAgaWYoIGdldF9jYWJhYyggJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbZ2V0X2NhYmFjX2NiZl9jdHgoIGgsIGNhdCwgbiwgbWF4X2NvZWZmLCAxICkgXSApID09IDAgKSB7CisgICAgICAgIGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W25dXSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVjb2RlX2NhYmFjX3Jlc2lkdWFsX2RjX2ludGVybmFsKCBoLCBibG9jaywgY2F0LCBuLCBzY2FudGFibGUsIG1heF9jb2VmZiApOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkCitkZWNvZGVfY2FiYWNfcmVzaWR1YWxfZGNfNDIyKEgyNjRDb250ZXh0ICpoLCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhdCwgaW50IG4sIGNvbnN0IHVpbnQ4X3QgKnNjYW50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jb2VmZikKK3sKKyAgICAvKiByZWFkIGNvZGVkIGJsb2NrIGZsYWcgKi8KKyAgICBpZiAoZ2V0X2NhYmFjKCZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlW2dldF9jYWJhY19jYmZfY3R4KGgsIGNhdCwgbiwgbWF4X2NvZWZmLCAxKV0pID09IDApIHsKKyAgICAgICAgaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2Nhbjhbbl1dID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkZWNvZGVfY2FiYWNfcmVzaWR1YWxfZGNfaW50ZXJuYWxfNDIyKGgsIGJsb2NrLCBjYXQsIG4sIHNjYW50YWJsZSwgbWF4X2NvZWZmKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBkZWNvZGVfY2FiYWNfcmVzaWR1YWxfbm9uZGMoSDI2NENvbnRleHQgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYXQsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKnFtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2NvZWZmKQoreworICAgIC8qIHJlYWQgY29kZWQgYmxvY2sgZmxhZyAqLworICAgIGlmKCAoY2F0ICE9IDUgfHwgQ0hST01BNDQ0KGgpKSAmJiBnZXRfY2FiYWMoICZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlW2dldF9jYWJhY19jYmZfY3R4KCBoLCBjYXQsIG4sIG1heF9jb2VmZiwgMCApIF0gKSA9PSAwICkgeworICAgICAgICBpZiggbWF4X2NvZWZmID09IDY0ICkgeworICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W25dXSwgMiwgMiwgOCwgMCwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtuXV0gPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVjb2RlX2NhYmFjX3Jlc2lkdWFsX25vbmRjX2ludGVybmFsKCBoLCBibG9jaywgY2F0LCBuLCBzY2FudGFibGUsIHFtdWwsIG1heF9jb2VmZiApOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGRlY29kZV9jYWJhY19sdW1hX3Jlc2lkdWFsKCBIMjY0Q29udGV4dCAqaCwgY29uc3QgdWludDhfdCAqc2NhbiwgY29uc3QgdWludDhfdCAqc2Nhbjh4OCwgaW50IHBpeGVsX3NoaWZ0LCBpbnQgbWJfdHlwZSwgaW50IGNicCwgaW50IHAgKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGN0eF9jYXRbNF1bM10gPSB7ezAsNiwxMH0sezEsNywxMX0sezIsOCwxMn0sezUsOSwxM319OworICAgIGNvbnN0IHVpbnQzMl90ICpxbXVsOworICAgIGludCBpOHg4LCBpNHg0OworICAgIGludCBxc2NhbGUgPSBwID09IDAgPyBoLT5xc2NhbGUgOiBoLT5jaHJvbWFfcXBbcC0xXTsKKyAgICBpZiggSVNfSU5UUkExNngxNiggbWJfdHlwZSApICkgeworICAgICAgICBBVl9aRVJPMTI4KGgtPm1iX2x1bWFfZGNbcF0rMCk7CisgICAgICAgIEFWX1pFUk8xMjgoaC0+bWJfbHVtYV9kY1twXSs4KTsKKyAgICAgICAgQVZfWkVSTzEyOChoLT5tYl9sdW1hX2RjW3BdKzE2KTsKKyAgICAgICAgQVZfWkVSTzEyOChoLT5tYl9sdW1hX2RjW3BdKzI0KTsKKyAgICAgICAgZGVjb2RlX2NhYmFjX3Jlc2lkdWFsX2RjKGgsIGgtPm1iX2x1bWFfZGNbcF0sIGN0eF9jYXRbMF1bcF0sIExVTUFfRENfQkxPQ0tfSU5ERVgrcCwgc2NhbiwgMTYpOworCisgICAgICAgIGlmKCBjYnAmMTUgKSB7CisgICAgICAgICAgICBxbXVsID0gaC0+ZGVxdWFudDRfY29lZmZbcF1bcXNjYWxlXTsKKyAgICAgICAgICAgIGZvciggaTR4NCA9IDA7IGk0eDQgPCAxNjsgaTR4NCsrICkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IDE2KnAgKyBpNHg0OworICAgICAgICAgICAgICAgIGRlY29kZV9jYWJhY19yZXNpZHVhbF9ub25kYyhoLCBoLT5tYiArICgxNippbmRleCA8PCBwaXhlbF9zaGlmdCksIGN0eF9jYXRbMV1bcF0sIGluZGV4LCBzY2FuICsgMSwgcW11bCwgMTUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44WzE2KnBdXSwgNCwgNCwgOCwgMCwgMSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgY3FtID0gKElTX0lOVFJBKCBtYl90eXBlICkgPyAwOjMpICsgcDsKKyAgICAgICAgZm9yKCBpOHg4ID0gMDsgaTh4OCA8IDQ7IGk4eDgrKyApIHsKKyAgICAgICAgICAgIGlmKCBjYnAgJiAoMTw8aTh4OCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIElTXzh4OERDVChtYl90eXBlKSApIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGluZGV4ID0gMTYqcCArIDQqaTh4ODsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2NhYmFjX3Jlc2lkdWFsX25vbmRjKGgsIGgtPm1iICsgKDE2KmluZGV4IDw8IHBpeGVsX3NoaWZ0KSwgY3R4X2NhdFszXVtwXSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuOHg4LCBoLT5kZXF1YW50OF9jb2VmZltjcW1dW3FzY2FsZV0sIDY0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBxbXVsID0gaC0+ZGVxdWFudDRfY29lZmZbY3FtXVtxc2NhbGVdOworICAgICAgICAgICAgICAgICAgICBmb3IoIGk0eDQgPSAwOyBpNHg0IDwgNDsgaTR4NCsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGluZGV4ID0gMTYqcCArIDQqaTh4OCArIGk0eDQ7CisvL1NUQVJUX1RJTUVSCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY2FiYWNfcmVzaWR1YWxfbm9uZGMoaCwgaC0+bWIgKyAoMTYqaW5kZXggPDwgcGl4ZWxfc2hpZnQpLCBjdHhfY2F0WzJdW3BdLCBpbmRleCwgc2NhbiwgcW11bCwgMTYpOworLy9TVE9QX1RJTUVSKCJkZWNvZGVfcmVzaWR1YWwiKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbNCppOHg4KzE2KnBdXSwgMiwgMiwgOCwgMCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIGEgbWFjcm9ibG9jay4KKyAqIEByZXR1cm4gMCBpZiBPSywgRVJfQUNfRVJST1IgLyBFUl9EQ19FUlJPUiAvIEVSX01WX0VSUk9SIGlmIGFuIGVycm9yIGlzIG5vdGljZWQKKyAqLworaW50IGZmX2gyNjRfZGVjb2RlX21iX2NhYmFjKEgyNjRDb250ZXh0ICpoKSB7CisgICAgaW50IG1iX3h5OworICAgIGludCBtYl90eXBlLCBwYXJ0aXRpb25fY291bnQsIGNicCA9IDA7CisgICAgaW50IGRjdDh4OF9hbGxvd2VkPSBoLT5wcHMudHJhbnNmb3JtXzh4OF9tb2RlOworICAgIGludCBkZWNvZGVfY2hyb21hID0gaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjID09IDEgfHwgaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjID09IDI7CisgICAgY29uc3QgaW50IHBpeGVsX3NoaWZ0ID0gaC0+cGl4ZWxfc2hpZnQ7CisgICAgdW5zaWduZWQgbG9jYWxfcmVmX2NvdW50WzJdOworCisgICAgbWJfeHkgPSBoLT5tYl94eSA9IGgtPm1iX3ggKyBoLT5tYl95KmgtPm1iX3N0cmlkZTsKKworICAgIHRwcmludGYoaC0+YXZjdHgsICJwaWM6JWQgbWI6JWQvJWRcbiIsIGgtPmZyYW1lX251bSwgaC0+bWJfeCwgaC0+bWJfeSk7CisgICAgaWYoIGgtPnNsaWNlX3R5cGVfbm9zICE9IEFWX1BJQ1RVUkVfVFlQRV9JICkgeworICAgICAgICBpbnQgc2tpcDsKKyAgICAgICAgLyogYSBza2lwcGVkIG1iIG5lZWRzIHRoZSBhZmYgZmxhZyBmcm9tIHRoZSBmb2xsb3dpbmcgbWIgKi8KKyAgICAgICAgaWYgKEZSQU1FX01CQUZGKGgpICYmIChoLT5tYl95ICYgMSkgPT0gMSAmJiBoLT5wcmV2X21iX3NraXBwZWQpCisgICAgICAgICAgICBza2lwID0gaC0+bmV4dF9tYl9za2lwcGVkOworICAgICAgICBlbHNlCisgICAgICAgICAgICBza2lwID0gZGVjb2RlX2NhYmFjX21iX3NraXAoIGgsIGgtPm1iX3gsIGgtPm1iX3kgKTsKKyAgICAgICAgLyogcmVhZCBza2lwIGZsYWdzICovCisgICAgICAgIGlmKCBza2lwICkgeworICAgICAgICAgICAgaWYgKEZSQU1FX01CQUZGKGgpICYmIChoLT5tYl95ICYgMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGgtPmN1cl9waWMubWJfdHlwZVttYl94eV0gPSBNQl9UWVBFX1NLSVA7CisgICAgICAgICAgICAgICAgaC0+bmV4dF9tYl9za2lwcGVkID0gZGVjb2RlX2NhYmFjX21iX3NraXAoIGgsIGgtPm1iX3gsIGgtPm1iX3krMSApOworICAgICAgICAgICAgICAgIGlmKCFoLT5uZXh0X21iX3NraXBwZWQpCisgICAgICAgICAgICAgICAgICAgIGgtPm1iX21iYWZmID0gaC0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZyA9IGRlY29kZV9jYWJhY19maWVsZF9kZWNvZGluZ19mbGFnKGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWNvZGVfbWJfc2tpcChoKTsKKworICAgICAgICAgICAgaC0+Y2JwX3RhYmxlW21iX3h5XSA9IDA7CisgICAgICAgICAgICBoLT5jaHJvbWFfcHJlZF9tb2RlX3RhYmxlW21iX3h5XSA9IDA7CisgICAgICAgICAgICBoLT5sYXN0X3FzY2FsZV9kaWZmID0gMDsKKworICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoRlJBTUVfTUJBRkYoaCkpIHsKKyAgICAgICAgaWYoIChoLT5tYl95JjEpID09IDAgKQorICAgICAgICAgICAgaC0+bWJfbWJhZmYgPQorICAgICAgICAgICAgaC0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZyA9IGRlY29kZV9jYWJhY19maWVsZF9kZWNvZGluZ19mbGFnKGgpOworICAgIH0KKworICAgIGgtPnByZXZfbWJfc2tpcHBlZCA9IDA7CisKKyAgICBmaWxsX2RlY29kZV9uZWlnaGJvcnMoaCwgLShNQl9GSUVMRChoKSkpOworCisgICAgaWYoIGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CICkgeworICAgICAgICBpbnQgY3R4ID0gMDsKKyAgICAgICAgYXZfYXNzZXJ0MihoLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQik7CisKKyAgICAgICAgaWYoICFJU19ESVJFQ1QoIGgtPmxlZnRfdHlwZVtMVE9QXS0xICkgKQorICAgICAgICAgICAgY3R4Kys7CisgICAgICAgIGlmKCAhSVNfRElSRUNUKCBoLT50b3BfdHlwZS0xICkgKQorICAgICAgICAgICAgY3R4Kys7CisKKyAgICAgICAgaWYoICFnZXRfY2FiYWNfbm9pbmxpbmUoICZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlWzI3K2N0eF0gKSApeworICAgICAgICAgICAgbWJfdHlwZT0gMDsgLyogQl9EaXJlY3RfMTZ4MTYgKi8KKyAgICAgICAgfWVsc2UgaWYoICFnZXRfY2FiYWNfbm9pbmxpbmUoICZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlWzI3KzNdICkgKSB7CisgICAgICAgICAgICBtYl90eXBlPSAxICsgZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVsyNys1XSApOyAvKiBCX0xbMDFdXzE2eDE2ICovCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgaW50IGJpdHM7CisgICAgICAgICAgICBiaXRzID0gZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVsyNys0XSApIDw8IDM7CisgICAgICAgICAgICBiaXRzKz0gZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVsyNys1XSApIDw8IDI7CisgICAgICAgICAgICBiaXRzKz0gZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVsyNys1XSApIDw8IDE7CisgICAgICAgICAgICBiaXRzKz0gZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVsyNys1XSApOworICAgICAgICAgICAgaWYoIGJpdHMgPCA4ICl7CisgICAgICAgICAgICAgICAgbWJfdHlwZT0gYml0cyArIDM7IC8qIEJfQmlfMTZ4MTYgdGhyb3VnaCBCX0wxX0wwXzE2eDggKi8KKyAgICAgICAgICAgIH1lbHNlIGlmKCBiaXRzID09IDEzICl7CisgICAgICAgICAgICAgICAgbWJfdHlwZT0gZGVjb2RlX2NhYmFjX2ludHJhX21iX3R5cGUoaCwgMzIsIDApOworICAgICAgICAgICAgICAgIGdvdG8gZGVjb2RlX2ludHJhX21iOworICAgICAgICAgICAgfWVsc2UgaWYoIGJpdHMgPT0gMTQgKXsKKyAgICAgICAgICAgICAgICBtYl90eXBlPSAxMTsgLyogQl9MMV9MMF84eDE2ICovCisgICAgICAgICAgICB9ZWxzZSBpZiggYml0cyA9PSAxNSApeworICAgICAgICAgICAgICAgIG1iX3R5cGU9IDIyOyAvKiBCXzh4OCAqLworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgYml0cz0gKCBiaXRzPDwxICkgKyBnZXRfY2FiYWNfbm9pbmxpbmUoICZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlWzI3KzVdICk7CisgICAgICAgICAgICAgICAgbWJfdHlwZT0gYml0cyAtIDQ7IC8qIEJfTDBfQmlfKiB0aHJvdWdoIEJfQmlfQmlfKiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICBwYXJ0aXRpb25fY291bnQ9IGJfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnBhcnRpdGlvbl9jb3VudDsKKyAgICAgICAgICAgIG1iX3R5cGU9ICAgICAgICAgYl9tYl90eXBlX2luZm9bbWJfdHlwZV0udHlwZTsKKyAgICB9IGVsc2UgaWYoIGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9QICkgeworICAgICAgICBpZiggZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVsxNF0gKSA9PSAwICkgeworICAgICAgICAgICAgLyogUC10eXBlICovCisgICAgICAgICAgICBpZiggZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVsxNV0gKSA9PSAwICkgeworICAgICAgICAgICAgICAgIC8qIFBfTDBfRDE2eDE2LCBQXzh4OCAqLworICAgICAgICAgICAgICAgIG1iX3R5cGU9IDMgKiBnZXRfY2FiYWNfbm9pbmxpbmUoICZoLT5jYWJhYywgJmgtPmNhYmFjX3N0YXRlWzE2XSApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBQX0wwX0Q4eDE2LCBQX0wwX0QxNng4ICovCisgICAgICAgICAgICAgICAgbWJfdHlwZT0gMiAtIGdldF9jYWJhY19ub2lubGluZSggJmgtPmNhYmFjLCAmaC0+Y2FiYWNfc3RhdGVbMTddICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJ0aXRpb25fY291bnQ9IHBfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnBhcnRpdGlvbl9jb3VudDsKKyAgICAgICAgICAgIG1iX3R5cGU9ICAgICAgICAgcF9tYl90eXBlX2luZm9bbWJfdHlwZV0udHlwZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1iX3R5cGU9IGRlY29kZV9jYWJhY19pbnRyYV9tYl90eXBlKGgsIDE3LCAwKTsKKyAgICAgICAgICAgIGdvdG8gZGVjb2RlX2ludHJhX21iOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWJfdHlwZT0gZGVjb2RlX2NhYmFjX2ludHJhX21iX3R5cGUoaCwgMywgMSk7CisgICAgICAgIGlmKGgtPnNsaWNlX3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1NJICYmIG1iX3R5cGUpCisgICAgICAgICAgICBtYl90eXBlLS07CisgICAgICAgIGF2X2Fzc2VydDIoaC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0kpOworZGVjb2RlX2ludHJhX21iOgorICAgICAgICBwYXJ0aXRpb25fY291bnQgPSAwOworICAgICAgICBjYnA9IGlfbWJfdHlwZV9pbmZvW21iX3R5cGVdLmNicDsKKyAgICAgICAgaC0+aW50cmExNngxNl9wcmVkX21vZGU9IGlfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnByZWRfbW9kZTsKKyAgICAgICAgbWJfdHlwZT0gaV9tYl90eXBlX2luZm9bbWJfdHlwZV0udHlwZTsKKyAgICB9CisgICAgaWYoTUJfRklFTEQoaCkpCisgICAgICAgIG1iX3R5cGUgfD0gTUJfVFlQRV9JTlRFUkxBQ0VEOworCisgICAgaC0+c2xpY2VfdGFibGVbIG1iX3h5IF09IGgtPnNsaWNlX251bTsKKworICAgIGlmKElTX0lOVFJBX1BDTShtYl90eXBlKSkgeworICAgICAgICBjb25zdCBpbnQgbWJfc2l6ZSA9IGZmX2gyNjRfbWJfc2l6ZXNbaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c3BzLmJpdF9kZXB0aF9sdW1hID4+IDM7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0cjsKKworICAgICAgICAvLyBXZSBhc3N1bWUgdGhlc2UgYmxvY2tzIGFyZSB2ZXJ5IHJhcmUgc28gd2UgZG8gbm90IG9wdGltaXplIGl0LgorICAgICAgICAvLyBGSVhNRSBUaGUgdHdvIGZvbGxvd2luZyBsaW5lcyBnZXQgdGhlIGJpdHN0cmVhbSBwb3NpdGlvbiBpbiB0aGUgY2FiYWMKKyAgICAgICAgLy8gZGVjb2RlLCBJIHRoaW5rIGl0IHNob3VsZCBiZSBkb25lIGJ5IGEgZnVuY3Rpb24gaW4gY2FiYWMuaCAob3IgY2FiYWMuYykuCisgICAgICAgIHB0cj0gaC0+Y2FiYWMuYnl0ZXN0cmVhbTsKKyAgICAgICAgaWYoaC0+Y2FiYWMubG93JjB4MSkgcHRyLS07CisgICAgICAgIGlmKENBQkFDX0JJVFM9PTE2KXsKKyAgICAgICAgICAgIGlmKGgtPmNhYmFjLmxvdyYweDFGRikgcHRyLS07CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgcGl4ZWxzIGFyZSBzdG9yZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgbGV2ZWxzIGluIGgtPm1iIGFycmF5LgorICAgICAgICBpZiAoKGludCkgKGgtPmNhYmFjLmJ5dGVzdHJlYW1fZW5kIC0gcHRyKSA8IG1iX3NpemUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGgtPmludHJhX3BjbV9wdHIgPSBwdHI7CisgICAgICAgIHB0ciArPSBtYl9zaXplOworCisgICAgICAgIGZmX2luaXRfY2FiYWNfZGVjb2RlcigmaC0+Y2FiYWMsIHB0ciwgaC0+Y2FiYWMuYnl0ZXN0cmVhbV9lbmQgLSBwdHIpOworCisgICAgICAgIC8vIEFsbCBibG9ja3MgYXJlIHByZXNlbnQKKyAgICAgICAgaC0+Y2JwX3RhYmxlW21iX3h5XSA9IDB4ZjdlZjsKKyAgICAgICAgaC0+Y2hyb21hX3ByZWRfbW9kZV90YWJsZVttYl94eV0gPSAwOworICAgICAgICAvLyBJbiBkZWJsb2NraW5nLCB0aGUgcXVhbnRpemVyIGlzIDAKKyAgICAgICAgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHldID0gMDsKKyAgICAgICAgLy8gQWxsIGNvZWZmcyBhcmUgcHJlc2VudAorICAgICAgICBtZW1zZXQoaC0+bm9uX3plcm9fY291bnRbbWJfeHldLCAxNiwgNDgpOworICAgICAgICBoLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldID0gbWJfdHlwZTsKKyAgICAgICAgaC0+bGFzdF9xc2NhbGVfZGlmZiA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGxvY2FsX3JlZl9jb3VudFswXSA9IGgtPnJlZl9jb3VudFswXSA8PCBNQl9NQkFGRihoKTsKKyAgICBsb2NhbF9yZWZfY291bnRbMV0gPSBoLT5yZWZfY291bnRbMV0gPDwgTUJfTUJBRkYoaCk7CisKKyAgICBmaWxsX2RlY29kZV9jYWNoZXMoaCwgbWJfdHlwZSk7CisKKyAgICBpZiggSVNfSU5UUkEoIG1iX3R5cGUgKSApIHsKKyAgICAgICAgaW50IGksIHByZWRfbW9kZTsKKyAgICAgICAgaWYoIElTX0lOVFJBNHg0KCBtYl90eXBlICkgKSB7CisgICAgICAgICAgICBpZiggZGN0OHg4X2FsbG93ZWQgJiYgZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVszOTkgKyBoLT5uZWlnaGJvcl90cmFuc2Zvcm1fc2l6ZV0gKSApIHsKKyAgICAgICAgICAgICAgICBtYl90eXBlIHw9IE1CX1RZUEVfOHg4RENUOworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCAxNjsgaSs9NCApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHByZWQgPSBwcmVkX2ludHJhX21vZGUoIGgsIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUgPSBkZWNvZGVfY2FiYWNfbWJfaW50cmE0eDRfcHJlZF9tb2RlKCBoLCBwcmVkICk7CisgICAgICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCAmaC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlWyBzY2FuOFtpXSBdLCAyLCAyLCA4LCBtb2RlLCAxICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMTY7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHByZWQgPSBwcmVkX2ludHJhX21vZGUoIGgsIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgaC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlWyBzY2FuOFtpXSBdID0gZGVjb2RlX2NhYmFjX21iX2ludHJhNHg0X3ByZWRfbW9kZSggaCwgcHJlZCApOworCisgICAgICAgICAgICAgICAgICAgIGF2X2Rsb2coaC0+YXZjdHgsICJpNHg0IHByZWQ9JWQgbW9kZT0lZFxuIiwgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbaV1dKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZV9iYWNrX2ludHJhX3ByZWRfbW9kZShoKTsKKyAgICAgICAgICAgIGlmKCBmZl9oMjY0X2NoZWNrX2ludHJhNHg0X3ByZWRfbW9kZShoKSA8IDAgKSByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoLT5pbnRyYTE2eDE2X3ByZWRfbW9kZT0gZmZfaDI2NF9jaGVja19pbnRyYV9wcmVkX21vZGUoIGgsIGgtPmludHJhMTZ4MTZfcHJlZF9tb2RlLCAwICk7CisgICAgICAgICAgICBpZiggaC0+aW50cmExNngxNl9wcmVkX21vZGUgPCAwICkgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmKGRlY29kZV9jaHJvbWEpeworICAgICAgICAgICAgaC0+Y2hyb21hX3ByZWRfbW9kZV90YWJsZVttYl94eV0gPQorICAgICAgICAgICAgcHJlZF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgPSBkZWNvZGVfY2FiYWNfbWJfY2hyb21hX3ByZV9tb2RlKCBoICk7CisKKyAgICAgICAgICAgIHByZWRfbW9kZT0gZmZfaDI2NF9jaGVja19pbnRyYV9wcmVkX21vZGUoIGgsIHByZWRfbW9kZSwgMSApOworICAgICAgICAgICAgaWYoIHByZWRfbW9kZSA8IDAgKSByZXR1cm4gLTE7CisgICAgICAgICAgICBoLT5jaHJvbWFfcHJlZF9tb2RlPSBwcmVkX21vZGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoLT5jaHJvbWFfcHJlZF9tb2RlPSBEQ18xMjhfUFJFRDh4ODsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiggcGFydGl0aW9uX2NvdW50ID09IDQgKSB7CisgICAgICAgIGludCBpLCBqLCBzdWJfcGFydGl0aW9uX2NvdW50WzRdLCBsaXN0LCByZWZbMl1bNF07CisKKyAgICAgICAgaWYoIGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CICkgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBoLT5zdWJfbWJfdHlwZVtpXSA9IGRlY29kZV9jYWJhY19iX21iX3N1Yl90eXBlKCBoICk7CisgICAgICAgICAgICAgICAgc3ViX3BhcnRpdGlvbl9jb3VudFtpXT0gYl9zdWJfbWJfdHlwZV9pbmZvWyBoLT5zdWJfbWJfdHlwZVtpXSBdLnBhcnRpdGlvbl9jb3VudDsKKyAgICAgICAgICAgICAgICBoLT5zdWJfbWJfdHlwZVtpXT0gICAgICBiX3N1Yl9tYl90eXBlX2luZm9bIGgtPnN1Yl9tYl90eXBlW2ldIF0udHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBJU19ESVJFQ1QoaC0+c3ViX21iX3R5cGVbMF0gfCBoLT5zdWJfbWJfdHlwZVsxXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnN1Yl9tYl90eXBlWzJdIHwgaC0+c3ViX21iX3R5cGVbM10pICkgeworICAgICAgICAgICAgICAgIGZmX2gyNjRfcHJlZF9kaXJlY3RfbW90aW9uKGgsICZtYl90eXBlKTsKKyAgICAgICAgICAgICAgICBoLT5yZWZfY2FjaGVbMF1bc2NhbjhbNF1dID0KKyAgICAgICAgICAgICAgICBoLT5yZWZfY2FjaGVbMV1bc2NhbjhbNF1dID0KKyAgICAgICAgICAgICAgICBoLT5yZWZfY2FjaGVbMF1bc2NhbjhbMTJdXSA9CisgICAgICAgICAgICAgICAgaC0+cmVmX2NhY2hlWzFdW3NjYW44WzEyXV0gPSBQQVJUX05PVF9BVkFJTEFCTEU7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoICZoLT5kaXJlY3RfY2FjaGVbc2NhbjhbNCppXV0sIDIsIDIsIDgsIChoLT5zdWJfbWJfdHlwZVtpXT4+MSkmMHhGRiwgMSApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBoLT5zdWJfbWJfdHlwZVtpXSA9IGRlY29kZV9jYWJhY19wX21iX3N1Yl90eXBlKCBoICk7CisgICAgICAgICAgICAgICAgc3ViX3BhcnRpdGlvbl9jb3VudFtpXT0gcF9zdWJfbWJfdHlwZV9pbmZvWyBoLT5zdWJfbWJfdHlwZVtpXSBdLnBhcnRpdGlvbl9jb3VudDsKKyAgICAgICAgICAgICAgICBoLT5zdWJfbWJfdHlwZVtpXT0gICAgICBwX3N1Yl9tYl90eXBlX2luZm9bIGgtPnN1Yl9tYl90eXBlW2ldIF0udHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciggbGlzdCA9IDA7IGxpc3QgPCBoLT5saXN0X2NvdW50OyBsaXN0KysgKSB7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoSVNfRElSRUNUKGgtPnN1Yl9tYl90eXBlW2ldKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmKElTX0RJUihoLT5zdWJfbWJfdHlwZVtpXSwgMCwgbGlzdCkpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3JlZl9jb3VudFtsaXN0XSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZbbGlzdF1baV0gPSBkZWNvZGVfY2FiYWNfbWJfcmVmKCBoLCBsaXN0LCA0KmkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmW2xpc3RdW2ldID49ICh1bnNpZ25lZClsb2NhbF9yZWZfY291bnRbbGlzdF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZWZlcmVuY2UgJWQgPj0gJWRcbiIsIHJlZltsaXN0XVtpXSwgbG9jYWxfcmVmX2NvdW50W2xpc3RdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmW2xpc3RdW2ldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZltsaXN0XVtpXSA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cmVmX2NhY2hlW2xpc3RdWyBzY2FuOFs0KmldKzEgXT0KKyAgICAgICAgICAgICAgICAgICAgaC0+cmVmX2NhY2hlW2xpc3RdWyBzY2FuOFs0KmldKzggXT1oLT5yZWZfY2FjaGVbbGlzdF1bIHNjYW44WzQqaV0rOSBdPSByZWZbbGlzdF1baV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoZGN0OHg4X2FsbG93ZWQpCisgICAgICAgICAgICBkY3Q4eDhfYWxsb3dlZCA9IGdldF9kY3Q4eDhfYWxsb3dlZChoKTsKKworICAgICAgICBmb3IobGlzdD0wOyBsaXN0PGgtPmxpc3RfY291bnQ7IGxpc3QrKyl7CisgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7CisgICAgICAgICAgICAgICAgaC0+cmVmX2NhY2hlW2xpc3RdWyBzY2FuOFs0KmldICAgXT1oLT5yZWZfY2FjaGVbbGlzdF1bIHNjYW44WzQqaV0rMSBdOworICAgICAgICAgICAgICAgIGlmKElTX0RJUkVDVChoLT5zdWJfbWJfdHlwZVtpXSkpeworICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZShoLT5tdmRfY2FjaGVbbGlzdF1bc2NhbjhbNCppXV0sIDIsIDIsIDgsIDAsIDIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihJU19ESVIoaC0+c3ViX21iX3R5cGVbaV0sIDAsIGxpc3QpICYmICFJU19ESVJFQ1QoaC0+c3ViX21iX3R5cGVbaV0pKXsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN1Yl9tYl90eXBlPSBoLT5zdWJfbWJfdHlwZVtpXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJsb2NrX3dpZHRoPSAoc3ViX21iX3R5cGUgJiAoTUJfVFlQRV8xNngxNnxNQl9UWVBFXzE2eDgpKSA/IDIgOiAxOworICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wOyBqPHN1Yl9wYXJ0aXRpb25fY291bnRbaV07IGorKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXB4LCBtcHk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXgsIG15OworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGluZGV4PSA0KmkgKyBibG9ja193aWR0aCpqOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAoKiBtdl9jYWNoZSlbMl09ICZoLT5tdl9jYWNoZVtsaXN0XVsgc2NhbjhbaW5kZXhdIF07CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICgqIG12ZF9jYWNoZSlbMl09ICZoLT5tdmRfY2FjaGVbbGlzdF1bIHNjYW44W2luZGV4XSBdOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZF9tb3Rpb24oaCwgaW5kZXgsIGJsb2NrX3dpZHRoLCBsaXN0LCBoLT5yZWZfY2FjaGVbbGlzdF1bIHNjYW44W2luZGV4XSBdLCAmbXgsICZteSk7CisgICAgICAgICAgICAgICAgICAgICAgICBERUNPREVfQ0FCQUNfTUJfTVZEKCBoLCBsaXN0LCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwcmludGYoaC0+YXZjdHgsICJmaW5hbCBtdjolZCAlZFxuIiwgbXgsIG15KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoSVNfU1VCXzhYOChzdWJfbWJfdHlwZSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X2NhY2hlWyAxIF1bMF09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZfY2FjaGVbIDggXVswXT0gbXZfY2FjaGVbIDkgXVswXT0gbXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZfY2FjaGVbIDEgXVsxXT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9jYWNoZVsgOCBdWzFdPSBtdl9jYWNoZVsgOSBdWzFdPSBteTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ZF9jYWNoZVsgMSBdWzBdPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ZF9jYWNoZVsgOCBdWzBdPSBtdmRfY2FjaGVbIDkgXVswXT0gbXB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ZF9jYWNoZVsgMSBdWzFdPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ZF9jYWNoZVsgOCBdWzFdPSBtdmRfY2FjaGVbIDkgXVsxXT0gbXB5OworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoSVNfU1VCXzhYNChzdWJfbWJfdHlwZSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X2NhY2hlWyAxIF1bMF09IG14OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X2NhY2hlWyAxIF1bMV09IG15OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZkX2NhY2hlWyAxIF1bMF09ICBtcHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZkX2NhY2hlWyAxIF1bMV09IG1weTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKElTX1NVQl80WDgoc3ViX21iX3R5cGUpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9jYWNoZVsgOCBdWzBdPSBteDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9jYWNoZVsgOCBdWzFdPSBteTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ZF9jYWNoZVsgOCBdWzBdPSBtcHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZkX2NhY2hlWyA4IF1bMV09IG1weTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG12X2NhY2hlWyAwIF1bMF09IG14OworICAgICAgICAgICAgICAgICAgICAgICAgbXZfY2FjaGVbIDAgXVsxXT0gbXk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG12ZF9jYWNoZVsgMCBdWzBdPSBtcHg7CisgICAgICAgICAgICAgICAgICAgICAgICBtdmRfY2FjaGVbIDAgXVsxXT0gbXB5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKGgtPm12X2NhY2hlIFtsaXN0XVsgc2NhbjhbNCppXSBdLCAyLCAyLCA4LCAwLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoaC0+bXZkX2NhY2hlW2xpc3RdWyBzY2FuOFs0KmldIF0sIDIsIDIsIDgsIDAsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiggSVNfRElSRUNUKG1iX3R5cGUpICkgeworICAgICAgICBmZl9oMjY0X3ByZWRfZGlyZWN0X21vdGlvbihoLCAmbWJfdHlwZSk7CisgICAgICAgIGZpbGxfcmVjdGFuZ2xlKGgtPm12ZF9jYWNoZVswXVtzY2FuOFswXV0sIDQsIDQsIDgsIDAsIDIpOworICAgICAgICBmaWxsX3JlY3RhbmdsZShoLT5tdmRfY2FjaGVbMV1bc2NhbjhbMF1dLCA0LCA0LCA4LCAwLCAyKTsKKyAgICAgICAgZGN0OHg4X2FsbG93ZWQgJj0gaC0+c3BzLmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGxpc3QsIGk7CisgICAgICAgIGlmKElTXzE2WDE2KG1iX3R5cGUpKXsKKyAgICAgICAgICAgIGZvcihsaXN0PTA7IGxpc3Q8aC0+bGlzdF9jb3VudDsgbGlzdCsrKXsKKyAgICAgICAgICAgICAgICBpZihJU19ESVIobWJfdHlwZSwgMCwgbGlzdCkpeworICAgICAgICAgICAgICAgICAgICBpbnQgcmVmOworICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxfcmVmX2NvdW50W2xpc3RdID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSBkZWNvZGVfY2FiYWNfbWJfcmVmKGgsIGxpc3QsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZiA+PSAodW5zaWduZWQpbG9jYWxfcmVmX2NvdW50W2xpc3RdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZWZlcmVuY2UgJWQgPj0gJWRcbiIsIHJlZiwgbG9jYWxfcmVmX2NvdW50W2xpc3RdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZWY9MDsKKyAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVtsaXN0XVsgc2NhbjhbMF0gXSwgNCwgNCwgOCwgcmVmLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IobGlzdD0wOyBsaXN0PGgtPmxpc3RfY291bnQ7IGxpc3QrKyl7CisgICAgICAgICAgICAgICAgaWYoSVNfRElSKG1iX3R5cGUsIDAsIGxpc3QpKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IG14LG15LG1weCxtcHk7CisgICAgICAgICAgICAgICAgICAgIHByZWRfbW90aW9uKGgsIDAsIDQsIGxpc3QsIGgtPnJlZl9jYWNoZVtsaXN0XVsgc2NhbjhbMF0gXSwgJm14LCAmbXkpOworICAgICAgICAgICAgICAgICAgICBERUNPREVfQ0FCQUNfTUJfTVZEKCBoLCBsaXN0LCAwKQorICAgICAgICAgICAgICAgICAgICB0cHJpbnRmKGgtPmF2Y3R4LCAiZmluYWwgbXY6JWQgJWRcbiIsIG14LCBteSk7CisKKyAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoaC0+bXZkX2NhY2hlW2xpc3RdWyBzY2FuOFswXSBdLCA0LCA0LCA4LCBwYWNrOHRvMTYobXB4LG1weSksIDIpOworICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZShoLT5tdl9jYWNoZVtsaXN0XVsgc2NhbjhbMF0gXSwgNCwgNCwgOCwgcGFjazE2dG8zMihteCxteSksIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKElTXzE2WDgobWJfdHlwZSkpeworICAgICAgICAgICAgZm9yKGxpc3Q9MDsgbGlzdDxoLT5saXN0X2NvdW50OyBsaXN0KyspeworICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDI7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihJU19ESVIobWJfdHlwZSwgaSwgbGlzdCkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3JlZl9jb3VudFtsaXN0XSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSBkZWNvZGVfY2FiYWNfbWJfcmVmKCBoLCBsaXN0LCA4KmkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZiA+PSAodW5zaWduZWQpbG9jYWxfcmVmX2NvdW50W2xpc3RdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlJlZmVyZW5jZSAlZCA+PSAlZFxuIiwgcmVmLCBsb2NhbF9yZWZfY291bnRbbGlzdF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVtsaXN0XVsgc2NhbjhbMF0gKyAxNippIF0sIDQsIDIsIDgsIHJlZiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5yZWZfY2FjaGVbbGlzdF1bIHNjYW44WzBdICsgMTYqaSBdLCA0LCAyLCA4LCAoTElTVF9OT1RfVVNFRCYweEZGKSwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcihsaXN0PTA7IGxpc3Q8aC0+bGlzdF9jb3VudDsgbGlzdCsrKXsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDI7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIGlmKElTX0RJUihtYl90eXBlLCBpLCBsaXN0KSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXgsbXksbXB4LG1weTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfMTZ4OF9tb3Rpb24oaCwgOCppLCBsaXN0LCBoLT5yZWZfY2FjaGVbbGlzdF1bc2NhbjhbMF0gKyAxNippXSwgJm14LCAmbXkpOworICAgICAgICAgICAgICAgICAgICAgICAgREVDT0RFX0NBQkFDX01CX01WRCggaCwgbGlzdCwgOCppKQorICAgICAgICAgICAgICAgICAgICAgICAgdHByaW50ZihoLT5hdmN0eCwgImZpbmFsIG12OiVkICVkXG4iLCBteCwgbXkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZShoLT5tdmRfY2FjaGVbbGlzdF1bIHNjYW44WzBdICsgMTYqaSBdLCA0LCAyLCA4LCBwYWNrOHRvMTYobXB4LG1weSksIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoaC0+bXZfY2FjaGVbbGlzdF1bIHNjYW44WzBdICsgMTYqaSBdLCA0LCAyLCA4LCBwYWNrMTZ0bzMyKG14LG15KSwgNCk7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoaC0+bXZkX2NhY2hlW2xpc3RdWyBzY2FuOFswXSArIDE2KmkgXSwgNCwgMiwgOCwgMCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZShoLT4gbXZfY2FjaGVbbGlzdF1bIHNjYW44WzBdICsgMTYqaSBdLCA0LCAyLCA4LCAwLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBhdl9hc3NlcnQyKElTXzhYMTYobWJfdHlwZSkpOworICAgICAgICAgICAgZm9yKGxpc3Q9MDsgbGlzdDxoLT5saXN0X2NvdW50OyBsaXN0KyspeworICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDI7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihJU19ESVIobWJfdHlwZSwgaSwgbGlzdCkpeyAvL0ZJWE1FIG9wdGltaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxfcmVmX2NvdW50W2xpc3RdID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IGRlY29kZV9jYWJhY19tYl9yZWYoIGgsIGxpc3QsIDQqaSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmID49ICh1bnNpZ25lZClsb2NhbF9yZWZfY291bnRbbGlzdF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVmZXJlbmNlICVkID49ICVkXG4iLCByZWYsIGxvY2FsX3JlZl9jb3VudFtsaXN0XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+cmVmX2NhY2hlW2xpc3RdWyBzY2FuOFswXSArIDIqaSBdLCAyLCA0LCA4LCByZWYsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+cmVmX2NhY2hlW2xpc3RdWyBzY2FuOFswXSArIDIqaSBdLCAyLCA0LCA4LCAoTElTVF9OT1RfVVNFRCYweEZGKSwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcihsaXN0PTA7IGxpc3Q8aC0+bGlzdF9jb3VudDsgbGlzdCsrKXsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDI7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIGlmKElTX0RJUihtYl90eXBlLCBpLCBsaXN0KSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXgsbXksbXB4LG1weTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfOHgxNl9tb3Rpb24oaCwgaSo0LCBsaXN0LCBoLT5yZWZfY2FjaGVbbGlzdF1bIHNjYW44WzBdICsgMippIF0sICZteCwgJm15KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQ09ERV9DQUJBQ19NQl9NVkQoIGgsIGxpc3QsIDQqaSkKKworICAgICAgICAgICAgICAgICAgICAgICAgdHByaW50ZihoLT5hdmN0eCwgImZpbmFsIG12OiVkICVkXG4iLCBteCwgbXkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoaC0+bXZkX2NhY2hlW2xpc3RdWyBzY2FuOFswXSArIDIqaSBdLCAyLCA0LCA4LCBwYWNrOHRvMTYobXB4LG1weSksIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoaC0+bXZfY2FjaGVbbGlzdF1bIHNjYW44WzBdICsgMippIF0sIDIsIDQsIDgsIHBhY2sxNnRvMzIobXgsbXkpLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZShoLT5tdmRfY2FjaGVbbGlzdF1bIHNjYW44WzBdICsgMippIF0sIDIsIDQsIDgsIDAsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoaC0+IG12X2NhY2hlW2xpc3RdWyBzY2FuOFswXSArIDIqaSBdLCAyLCA0LCA4LCAwLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgaWYoIElTX0lOVEVSKCBtYl90eXBlICkgKSB7CisgICAgICAgIGgtPmNocm9tYV9wcmVkX21vZGVfdGFibGVbbWJfeHldID0gMDsKKyAgICAgICAgd3JpdGVfYmFja19tb3Rpb24oIGgsIG1iX3R5cGUgKTsKKyAgIH0KKworICAgIGlmKCAhSVNfSU5UUkExNngxNiggbWJfdHlwZSApICkgeworICAgICAgICBjYnAgID0gZGVjb2RlX2NhYmFjX21iX2NicF9sdW1hKCBoICk7CisgICAgICAgIGlmKGRlY29kZV9jaHJvbWEpCisgICAgICAgICAgICBjYnAgfD0gZGVjb2RlX2NhYmFjX21iX2NicF9jaHJvbWEoIGggKSA8PCA0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghZGVjb2RlX2Nocm9tYSAmJiBjYnA+MTUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZ3JheSBjaHJvbWFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBoLT5jYnBfdGFibGVbbWJfeHldID0gaC0+Y2JwID0gY2JwOworCisgICAgaWYoIGRjdDh4OF9hbGxvd2VkICYmIChjYnAmMTUpICYmICFJU19JTlRSQSggbWJfdHlwZSApICkgeworICAgICAgICBtYl90eXBlIHw9IE1CX1RZUEVfOHg4RENUICogZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVszOTkgKyBoLT5uZWlnaGJvcl90cmFuc2Zvcm1fc2l6ZV0gKTsKKyAgICB9CisKKyAgICAvKiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZG8gdGhpcyBpbiBmaWxsX2RlY29kZV9jYWNoZXMsIGJ1dCB3ZSBkb24ndCBrbm93CisgICAgICogdGhlIHRyYW5zZm9ybSBtb2RlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgdGhlcmUuICovCisgICAgaWYgKENIUk9NQTQ0NChoKSAmJiBJU184eDhEQ1QobWJfdHlwZSkpeworICAgICAgICBpbnQgaTsKKyAgICAgICAgdWludDhfdCAqbm56X2NhY2hlID0gaC0+bm9uX3plcm9fY291bnRfY2FjaGU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspeworICAgICAgICAgICAgaWYgKGgtPmxlZnRfdHlwZVtMRUZUKGkpXSAmJiAhSVNfOHg4RENUKGgtPmxlZnRfdHlwZVtMRUZUKGkpXSkpeworICAgICAgICAgICAgICAgIG5uel9jYWNoZVszKzgqIDEgKyAyKjgqaV09CisgICAgICAgICAgICAgICAgbm56X2NhY2hlWzMrOCogMiArIDIqOCppXT0KKyAgICAgICAgICAgICAgICBubnpfY2FjaGVbMys4KiA2ICsgMio4KmldPQorICAgICAgICAgICAgICAgIG5uel9jYWNoZVszKzgqIDcgKyAyKjgqaV09CisgICAgICAgICAgICAgICAgbm56X2NhY2hlWzMrOCoxMSArIDIqOCppXT0KKyAgICAgICAgICAgICAgICBubnpfY2FjaGVbMys4KjEyICsgMio4KmldPSBJU19JTlRSQShtYl90eXBlKSA/IDY0IDogMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaC0+dG9wX3R5cGUgJiYgIUlTXzh4OERDVChoLT50b3BfdHlwZSkpeworICAgICAgICAgICAgdWludDMyX3QgdG9wX2VtcHR5ID0gQ0FCQUMoaCkgJiYgIUlTX0lOVFJBKG1iX3R5cGUpID8gMCA6IDB4NDA0MDQwNDA7CisgICAgICAgICAgICBBVl9XTjMyQSgmbm56X2NhY2hlWzQrOCogMF0sIHRvcF9lbXB0eSk7CisgICAgICAgICAgICBBVl9XTjMyQSgmbm56X2NhY2hlWzQrOCogNV0sIHRvcF9lbXB0eSk7CisgICAgICAgICAgICBBVl9XTjMyQSgmbm56X2NhY2hlWzQrOCoxMF0sIHRvcF9lbXB0eSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaC0+Y3VyX3BpYy5tYl90eXBlW21iX3h5XSA9IG1iX3R5cGU7CisKKyAgICBpZiggY2JwIHx8IElTX0lOVFJBMTZ4MTYoIG1iX3R5cGUgKSApIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc2NhbiwgKnNjYW44eDg7CisgICAgICAgIGNvbnN0IHVpbnQzMl90ICpxbXVsOworCisgICAgICAgIGlmKElTX0lOVEVSTEFDRUQobWJfdHlwZSkpeworICAgICAgICAgICAgc2Nhbjh4OD0gaC0+cXNjYWxlID8gaC0+ZmllbGRfc2Nhbjh4OCA6IGgtPmZpZWxkX3NjYW44eDhfcTA7CisgICAgICAgICAgICBzY2FuPSBoLT5xc2NhbGUgPyBoLT5maWVsZF9zY2FuIDogaC0+ZmllbGRfc2Nhbl9xMDsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBzY2FuOHg4PSBoLT5xc2NhbGUgPyBoLT56aWd6YWdfc2Nhbjh4OCA6IGgtPnppZ3phZ19zY2FuOHg4X3EwOworICAgICAgICAgICAgc2Nhbj0gaC0+cXNjYWxlID8gaC0+emlnemFnX3NjYW4gOiBoLT56aWd6YWdfc2Nhbl9xMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlY29kZV9jYWJhY19tYl9kcXAKKyAgICAgICAgaWYoZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVs2MCArIChoLT5sYXN0X3FzY2FsZV9kaWZmICE9IDApXSkpeworICAgICAgICAgICAgaW50IHZhbCA9IDE7CisgICAgICAgICAgICBpbnQgY3R4PSAyOworICAgICAgICAgICAgY29uc3QgaW50IG1heF9xcCA9IDUxICsgNiooaC0+c3BzLmJpdF9kZXB0aF9sdW1hLTgpOworCisgICAgICAgICAgICB3aGlsZSggZ2V0X2NhYmFjX25vaW5saW5lKCAmaC0+Y2FiYWMsICZoLT5jYWJhY19zdGF0ZVs2MCArIGN0eF0gKSApIHsKKyAgICAgICAgICAgICAgICBjdHg9IDM7CisgICAgICAgICAgICAgICAgdmFsKys7CisgICAgICAgICAgICAgICAgaWYodmFsID4gMiptYXhfcXApeyAvL3ByZXZlbnQgaW5maW5pdGUgbG9vcAorICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNhYmFjIGRlY29kZSBvZiBxc2NhbGUgZGlmZiBmYWlsZWQgYXQgJWQgJWRcbiIsIGgtPm1iX3gsIGgtPm1iX3kpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggdmFsJjB4MDEgKQorICAgICAgICAgICAgICAgIHZhbD0gICAodmFsICsgMSk+PjEgOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbD0gLSgodmFsICsgMSk+PjEpOworICAgICAgICAgICAgaC0+bGFzdF9xc2NhbGVfZGlmZiA9IHZhbDsKKyAgICAgICAgICAgIGgtPnFzY2FsZSArPSB2YWw7CisgICAgICAgICAgICBpZigoKHVuc2lnbmVkKWgtPnFzY2FsZSkgPiBtYXhfcXApeworICAgICAgICAgICAgICAgIGlmKGgtPnFzY2FsZTwwKSBoLT5xc2NhbGUrPSBtYXhfcXArMTsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgaC0+cXNjYWxlLT0gbWF4X3FwKzE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoLT5jaHJvbWFfcXBbMF0gPSBnZXRfY2hyb21hX3FwKGgsIDAsIGgtPnFzY2FsZSk7CisgICAgICAgICAgICBoLT5jaHJvbWFfcXBbMV0gPSBnZXRfY2hyb21hX3FwKGgsIDEsIGgtPnFzY2FsZSk7CisgICAgICAgIH1lbHNlCisgICAgICAgICAgICBoLT5sYXN0X3FzY2FsZV9kaWZmPTA7CisKKyAgICAgICAgZGVjb2RlX2NhYmFjX2x1bWFfcmVzaWR1YWwoaCwgc2Nhbiwgc2Nhbjh4OCwgcGl4ZWxfc2hpZnQsIG1iX3R5cGUsIGNicCwgMCk7CisgICAgICAgIGlmIChDSFJPTUE0NDQoaCkpIHsKKyAgICAgICAgICAgIGRlY29kZV9jYWJhY19sdW1hX3Jlc2lkdWFsKGgsIHNjYW4sIHNjYW44eDgsIHBpeGVsX3NoaWZ0LCBtYl90eXBlLCBjYnAsIDEpOworICAgICAgICAgICAgZGVjb2RlX2NhYmFjX2x1bWFfcmVzaWR1YWwoaCwgc2Nhbiwgc2Nhbjh4OCwgcGl4ZWxfc2hpZnQsIG1iX3R5cGUsIGNicCwgMik7CisgICAgICAgIH0gZWxzZSBpZiAoQ0hST01BNDIyKGgpKSB7CisgICAgICAgICAgICBpZiggY2JwJjB4MzAgKXsKKyAgICAgICAgICAgICAgICBpbnQgYzsKKyAgICAgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgMjsgYysrKQorICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY2FiYWNfcmVzaWR1YWxfZGNfNDIyKGgsIGgtPm1iICsgKCgyNTYgKyAxNioxNipjKSA8PCBwaXhlbF9zaGlmdCksIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hST01BX0RDX0JMT0NLX0lOREVYICsgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJvbWE0MjJfZGNfc2NhbiwgOCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBjYnAmMHgyMCApIHsKKyAgICAgICAgICAgICAgICBpbnQgYywgaSwgaTh4ODsKKyAgICAgICAgICAgICAgICBmb3IoIGMgPSAwOyBjIDwgMjsgYysrICkgeworICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICptYiA9IGgtPm1iICsgKDE2KigxNiArIDE2KmMpIDw8IHBpeGVsX3NoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgcW11bCA9IGgtPmRlcXVhbnQ0X2NvZWZmW2MrMSsoSVNfSU5UUkEoIG1iX3R5cGUgKSA/IDA6MyldW2gtPmNocm9tYV9xcFtjXV07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaTh4OCA9IDA7IGk4eDggPCAyOyBpOHg4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXggPSAxNiArIDE2ICogYyArIDgqaTh4OCArIGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2NhYmFjX3Jlc2lkdWFsX25vbmRjKGgsIG1iLCA0LCBpbmRleCwgc2NhbiArIDEsIHFtdWwsIDE1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYiArPSAxNjw8cGl4ZWxfc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFsxNl1dLCA0LCA0LCA4LCAwLCAxKTsKKyAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbMzJdXSwgNCwgNCwgOCwgMCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSAvKiB5dXY0MjAgKi8geworICAgICAgICAgICAgaWYoIGNicCYweDMwICl7CisgICAgICAgICAgICAgICAgaW50IGM7CisgICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IDI7IGMrKykKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2NhYmFjX3Jlc2lkdWFsX2RjKGgsIGgtPm1iICsgKCgyNTYgKyAxNioxNipjKSA8PCBwaXhlbF9zaGlmdCksIDMsIENIUk9NQV9EQ19CTE9DS19JTkRFWCtjLCBjaHJvbWFfZGNfc2NhbiwgNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBjYnAmMHgyMCApIHsKKyAgICAgICAgICAgICAgICBpbnQgYywgaTsKKyAgICAgICAgICAgICAgICBmb3IoIGMgPSAwOyBjIDwgMjsgYysrICkgeworICAgICAgICAgICAgICAgICAgICBxbXVsID0gaC0+ZGVxdWFudDRfY29lZmZbYysxKyhJU19JTlRSQSggbWJfdHlwZSApID8gMDozKV1baC0+Y2hyb21hX3FwW2NdXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IDE2ICsgMTYgKiBjICsgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9jYWJhY19yZXNpZHVhbF9ub25kYyhoLCBoLT5tYiArICgxNippbmRleCA8PCBwaXhlbF9zaGlmdCksIDQsIGluZGV4LCBzY2FuICsgMSwgcW11bCwgMTUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbMTZdXSwgNCwgNCwgOCwgMCwgMSk7CisgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44WzMyXV0sIDQsIDQsIDgsIDAsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44WyAwXV0sIDQsIDQsIDgsIDAsIDEpOworICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbMTZdXSwgNCwgNCwgOCwgMCwgMSk7CisgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFszMl1dLCA0LCA0LCA4LCAwLCAxKTsKKyAgICAgICAgaC0+bGFzdF9xc2NhbGVfZGlmZiA9IDA7CisgICAgfQorCisgICAgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHldID0gaC0+cXNjYWxlOworICAgIHdyaXRlX2JhY2tfbm9uX3plcm9fY291bnQoaCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfY2F2bGMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfY2F2bGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTU4N2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9jYXZsYy5jCkBAIC0wLDAgKzEsMTE3MiBAQAorLyoKKyAqIEguMjZML0guMjY0L0FWQy9KVlQvMTQ0OTYtMTAvLi4uIGNhdmxjIGJpdHN0cmVhbSBkZWNvZGluZworICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIGNhdmxjIGJpdHN0cmVhbSBkZWNvZGluZy4KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjZGVmaW5lIENBQkFDKGgpIDAKKyNkZWZpbmUgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIgMQorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRkYXRhLmgiIC8vIEZJWE1FIEZJWE1FIEZJWE1FCisjaW5jbHVkZSAiaDI2NF9tdnByZWQuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworCitzdGF0aWMgY29uc3QgdWludDhfdCBnb2xvbWJfdG9faW50ZXJfY2JwX2dyYXlbMTZdPXsKKyAwLCAxLCAyLCA0LCA4LCAzLCA1LDEwLDEyLDE1LCA3LDExLDEzLDE0LCA2LCA5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ29sb21iX3RvX2ludHJhNHg0X2NicF9ncmF5WzE2XT17CisxNSwgMCwgNywxMSwxMywxNCwgMywgNSwxMCwxMiwgMSwgMiwgNCwgOCwgNiwgOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNocm9tYV9kY19jb2VmZl90b2tlbl9sZW5bNCo1XT17CisgMiwgMCwgMCwgMCwKKyA2LCAxLCAwLCAwLAorIDYsIDYsIDMsIDAsCisgNiwgNywgNywgNiwKKyA2LCA4LCA4LCA3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2hyb21hX2RjX2NvZWZmX3Rva2VuX2JpdHNbNCo1XT17CisgMSwgMCwgMCwgMCwKKyA3LCAxLCAwLCAwLAorIDQsIDYsIDEsIDAsCisgMywgMywgMiwgNSwKKyAyLCAzLCAyLCAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2hyb21hNDIyX2RjX2NvZWZmX3Rva2VuX2xlbls0KjldPXsKKyAgMSwgIDAsICAwLCAgMCwKKyAgNywgIDIsICAwLCAgMCwKKyAgNywgIDcsICAzLCAgMCwKKyAgOSwgIDcsICA3LCAgNSwKKyAgOSwgIDksICA3LCAgNiwKKyAxMCwgMTAsICA5LCAgNywKKyAxMSwgMTEsIDEwLCAgNywKKyAxMiwgMTIsIDExLCAxMCwKKyAxMywgMTIsIDEyLCAxMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNocm9tYTQyMl9kY19jb2VmZl90b2tlbl9iaXRzWzQqOV09eworICAxLCAgIDAsICAwLCAwLAorIDE1LCAgIDEsICAwLCAwLAorIDE0LCAgMTMsICAxLCAwLAorICA3LCAgMTIsIDExLCAxLAorICA2LCAgIDUsIDEwLCAxLAorICA3LCAgIDYsICA0LCA5LAorICA3LCAgIDYsICA1LCA4LAorICA3LCAgIDYsICA1LCA0LAorICA3LCAgIDUsICA0LCA0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29lZmZfdG9rZW5fbGVuWzRdWzQqMTddPXsKK3sKKyAgICAgMSwgMCwgMCwgMCwKKyAgICAgNiwgMiwgMCwgMCwgICAgIDgsIDYsIDMsIDAsICAgICA5LCA4LCA3LCA1LCAgICAxMCwgOSwgOCwgNiwKKyAgICAxMSwxMCwgOSwgNywgICAgMTMsMTEsMTAsIDgsICAgIDEzLDEzLDExLCA5LCAgICAxMywxMywxMywxMCwKKyAgICAxNCwxNCwxMywxMSwgICAgMTQsMTQsMTQsMTMsICAgIDE1LDE1LDE0LDE0LCAgICAxNSwxNSwxNSwxNCwKKyAgICAxNiwxNSwxNSwxNSwgICAgMTYsMTYsMTYsMTUsICAgIDE2LDE2LDE2LDE2LCAgICAxNiwxNiwxNiwxNiwKK30sCit7CisgICAgIDIsIDAsIDAsIDAsCisgICAgIDYsIDIsIDAsIDAsICAgICA2LCA1LCAzLCAwLCAgICAgNywgNiwgNiwgNCwgICAgIDgsIDYsIDYsIDQsCisgICAgIDgsIDcsIDcsIDUsICAgICA5LCA4LCA4LCA2LCAgICAxMSwgOSwgOSwgNiwgICAgMTEsMTEsMTEsIDcsCisgICAgMTIsMTEsMTEsIDksICAgIDEyLDEyLDEyLDExLCAgICAxMiwxMiwxMiwxMSwgICAgMTMsMTMsMTMsMTIsCisgICAgMTMsMTMsMTMsMTMsICAgIDEzLDE0LDEzLDEzLCAgICAxNCwxNCwxNCwxMywgICAgMTQsMTQsMTQsMTQsCit9LAoreworICAgICA0LCAwLCAwLCAwLAorICAgICA2LCA0LCAwLCAwLCAgICAgNiwgNSwgNCwgMCwgICAgIDYsIDUsIDUsIDQsICAgICA3LCA1LCA1LCA0LAorICAgICA3LCA1LCA1LCA0LCAgICAgNywgNiwgNiwgNCwgICAgIDcsIDYsIDYsIDQsICAgICA4LCA3LCA3LCA1LAorICAgICA4LCA4LCA3LCA2LCAgICAgOSwgOCwgOCwgNywgICAgIDksIDksIDgsIDgsICAgICA5LCA5LCA5LCA4LAorICAgIDEwLCA5LCA5LCA5LCAgICAxMCwxMCwxMCwxMCwgICAgMTAsMTAsMTAsMTAsICAgIDEwLDEwLDEwLDEwLAorfSwKK3sKKyAgICAgNiwgMCwgMCwgMCwKKyAgICAgNiwgNiwgMCwgMCwgICAgIDYsIDYsIDYsIDAsICAgICA2LCA2LCA2LCA2LCAgICAgNiwgNiwgNiwgNiwKKyAgICAgNiwgNiwgNiwgNiwgICAgIDYsIDYsIDYsIDYsICAgICA2LCA2LCA2LCA2LCAgICAgNiwgNiwgNiwgNiwKKyAgICAgNiwgNiwgNiwgNiwgICAgIDYsIDYsIDYsIDYsICAgICA2LCA2LCA2LCA2LCAgICAgNiwgNiwgNiwgNiwKKyAgICAgNiwgNiwgNiwgNiwgICAgIDYsIDYsIDYsIDYsICAgICA2LCA2LCA2LCA2LCAgICAgNiwgNiwgNiwgNiwKK30KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZWZmX3Rva2VuX2JpdHNbNF1bNCoxN109eworeworICAgICAxLCAwLCAwLCAwLAorICAgICA1LCAxLCAwLCAwLCAgICAgNywgNCwgMSwgMCwgICAgIDcsIDYsIDUsIDMsICAgICA3LCA2LCA1LCAzLAorICAgICA3LCA2LCA1LCA0LCAgICAxNSwgNiwgNSwgNCwgICAgMTEsMTQsIDUsIDQsICAgICA4LDEwLDEzLCA0LAorICAgIDE1LDE0LCA5LCA0LCAgICAxMSwxMCwxMywxMiwgICAgMTUsMTQsIDksMTIsICAgIDExLDEwLDEzLCA4LAorICAgIDE1LCAxLCA5LDEyLCAgICAxMSwxNCwxMywgOCwgICAgIDcsMTAsIDksMTIsICAgICA0LCA2LCA1LCA4LAorfSwKK3sKKyAgICAgMywgMCwgMCwgMCwKKyAgICAxMSwgMiwgMCwgMCwgICAgIDcsIDcsIDMsIDAsICAgICA3LDEwLCA5LCA1LCAgICAgNywgNiwgNSwgNCwKKyAgICAgNCwgNiwgNSwgNiwgICAgIDcsIDYsIDUsIDgsICAgIDE1LCA2LCA1LCA0LCAgICAxMSwxNCwxMywgNCwKKyAgICAxNSwxMCwgOSwgNCwgICAgMTEsMTQsMTMsMTIsICAgICA4LDEwLCA5LCA4LCAgICAxNSwxNCwxMywxMiwKKyAgICAxMSwxMCwgOSwxMiwgICAgIDcsMTEsIDYsIDgsICAgICA5LCA4LDEwLCAxLCAgICAgNywgNiwgNSwgNCwKK30sCit7CisgICAgMTUsIDAsIDAsIDAsCisgICAgMTUsMTQsIDAsIDAsICAgIDExLDE1LDEzLCAwLCAgICAgOCwxMiwxNCwxMiwgICAgMTUsMTAsMTEsMTEsCisgICAgMTEsIDgsIDksMTAsICAgICA5LDE0LDEzLCA5LCAgICAgOCwxMCwgOSwgOCwgICAgMTUsMTQsMTMsMTMsCisgICAgMTEsMTQsMTAsMTIsICAgIDE1LDEwLDEzLDEyLCAgICAxMSwxNCwgOSwxMiwgICAgIDgsMTAsMTMsIDgsCisgICAgMTMsIDcsIDksMTIsICAgICA5LDEyLDExLDEwLCAgICAgNSwgOCwgNywgNiwgICAgIDEsIDQsIDMsIDIsCit9LAoreworICAgICAzLCAwLCAwLCAwLAorICAgICAwLCAxLCAwLCAwLCAgICAgNCwgNSwgNiwgMCwgICAgIDgsIDksMTAsMTEsICAgIDEyLDEzLDE0LDE1LAorICAgIDE2LDE3LDE4LDE5LCAgICAyMCwyMSwyMiwyMywgICAgMjQsMjUsMjYsMjcsICAgIDI4LDI5LDMwLDMxLAorICAgIDMyLDMzLDM0LDM1LCAgICAzNiwzNywzOCwzOSwgICAgNDAsNDEsNDIsNDMsICAgIDQ0LDQ1LDQ2LDQ3LAorICAgIDQ4LDQ5LDUwLDUxLCAgICA1Miw1Myw1NCw1NSwgICAgNTYsNTcsNTgsNTksICAgIDYwLDYxLDYyLDYzLAorfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdG90YWxfemVyb3NfbGVuWzE2XVsxNl09IHsKKyAgICB7MSwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksOX0sCisgICAgezMsMywzLDMsMyw0LDQsNCw0LDUsNSw2LDYsNiw2fSwKKyAgICB7NCwzLDMsMyw0LDQsMywzLDQsNSw1LDYsNSw2fSwKKyAgICB7NSwzLDQsNCwzLDMsMyw0LDMsNCw1LDUsNX0sCisgICAgezQsNCw0LDMsMywzLDMsMyw0LDUsNCw1fSwKKyAgICB7Niw1LDMsMywzLDMsMywzLDQsMyw2fSwKKyAgICB7Niw1LDMsMywzLDIsMyw0LDMsNn0sCisgICAgezYsNCw1LDMsMiwyLDMsMyw2fSwKKyAgICB7Niw2LDQsMiwyLDMsMiw1fSwKKyAgICB7NSw1LDMsMiwyLDIsNH0sCisgICAgezQsNCwzLDMsMSwzfSwKKyAgICB7NCw0LDIsMSwzfSwKKyAgICB7MywzLDEsMn0sCisgICAgezIsMiwxfSwKKyAgICB7MSwxfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRvdGFsX3plcm9zX2JpdHNbMTZdWzE2XT0geworICAgIHsxLDMsMiwzLDIsMywyLDMsMiwzLDIsMywyLDMsMiwxfSwKKyAgICB7Nyw2LDUsNCwzLDUsNCwzLDIsMywyLDMsMiwxLDB9LAorICAgIHs1LDcsNiw1LDQsMyw0LDMsMiwzLDIsMSwxLDB9LAorICAgIHszLDcsNSw0LDYsNSw0LDMsMywyLDIsMSwwfSwKKyAgICB7NSw0LDMsNyw2LDUsNCwzLDIsMSwxLDB9LAorICAgIHsxLDEsNyw2LDUsNCwzLDIsMSwxLDB9LAorICAgIHsxLDEsNSw0LDMsMywyLDEsMSwwfSwKKyAgICB7MSwxLDEsMywzLDIsMiwxLDB9LAorICAgIHsxLDAsMSwzLDIsMSwxLDF9LAorICAgIHsxLDAsMSwzLDIsMSwxfSwKKyAgICB7MCwxLDEsMiwxLDN9LAorICAgIHswLDEsMSwxLDF9LAorICAgIHswLDEsMSwxfSwKKyAgICB7MCwxLDF9LAorICAgIHswLDF9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2hyb21hX2RjX3RvdGFsX3plcm9zX2xlblszXVs0XT0geworICAgIHsgMSwgMiwgMywgMyx9LAorICAgIHsgMSwgMiwgMiwgMCx9LAorICAgIHsgMSwgMSwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2hyb21hX2RjX3RvdGFsX3plcm9zX2JpdHNbM11bNF09IHsKKyAgICB7IDEsIDEsIDEsIDAsfSwKKyAgICB7IDEsIDEsIDAsIDAsfSwKKyAgICB7IDEsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNocm9tYTQyMl9kY190b3RhbF96ZXJvc19sZW5bN11bOF09IHsKKyAgICB7IDEsIDMsIDMsIDQsIDQsIDQsIDUsIDUgfSwKKyAgICB7IDMsIDIsIDMsIDMsIDMsIDMsIDMgfSwKKyAgICB7IDMsIDMsIDIsIDIsIDMsIDMgfSwKKyAgICB7IDMsIDIsIDIsIDIsIDMgfSwKKyAgICB7IDIsIDIsIDIsIDIgfSwKKyAgICB7IDIsIDIsIDEgfSwKKyAgICB7IDEsIDEgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNocm9tYTQyMl9kY190b3RhbF96ZXJvc19iaXRzWzddWzhdPSB7CisgICAgeyAxLCAyLCAzLCAyLCAzLCAxLCAxLCAwIH0sCisgICAgeyAwLCAxLCAxLCA0LCA1LCA2LCA3IH0sCisgICAgeyAwLCAxLCAxLCAyLCA2LCA3IH0sCisgICAgeyA2LCAwLCAxLCAyLCA3IH0sCisgICAgeyAwLCAxLCAyLCAzIH0sCisgICAgeyAwLCAxLCAxIH0sCisgICAgeyAwLCAxIH0sCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBydW5fbGVuWzddWzE2XT17CisgICAgezEsMX0sCisgICAgezEsMiwyfSwKKyAgICB7MiwyLDIsMn0sCisgICAgezIsMiwyLDMsM30sCisgICAgezIsMiwzLDMsMywzfSwKKyAgICB7MiwzLDMsMywzLDMsM30sCisgICAgezMsMywzLDMsMywzLDMsNCw1LDYsNyw4LDksMTAsMTF9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnVuX2JpdHNbN11bMTZdPXsKKyAgICB7MSwwfSwKKyAgICB7MSwxLDB9LAorICAgIHszLDIsMSwwfSwKKyAgICB7MywyLDEsMSwwfSwKKyAgICB7MywyLDMsMiwxLDB9LAorICAgIHszLDAsMSwzLDIsNSw0fSwKKyAgICB7Nyw2LDUsNCwzLDIsMSwxLDEsMSwxLDEsMSwxLDF9LAorfTsKKworc3RhdGljIFZMQyBjb2VmZl90b2tlbl92bGNbNF07CitzdGF0aWMgVkxDX1RZUEUgY29lZmZfdG9rZW5fdmxjX3RhYmxlc1s1MjArMzMyKzI4MCsyNTZdWzJdOworc3RhdGljIGNvbnN0IGludCBjb2VmZl90b2tlbl92bGNfdGFibGVzX3NpemVbNF09ezUyMCwzMzIsMjgwLDI1Nn07CisKK3N0YXRpYyBWTEMgY2hyb21hX2RjX2NvZWZmX3Rva2VuX3ZsYzsKK3N0YXRpYyBWTENfVFlQRSBjaHJvbWFfZGNfY29lZmZfdG9rZW5fdmxjX3RhYmxlWzI1Nl1bMl07CitzdGF0aWMgY29uc3QgaW50IGNocm9tYV9kY19jb2VmZl90b2tlbl92bGNfdGFibGVfc2l6ZSA9IDI1NjsKKworc3RhdGljIFZMQyBjaHJvbWE0MjJfZGNfY29lZmZfdG9rZW5fdmxjOworc3RhdGljIFZMQ19UWVBFIGNocm9tYTQyMl9kY19jb2VmZl90b2tlbl92bGNfdGFibGVbODE5Ml1bMl07CitzdGF0aWMgY29uc3QgaW50IGNocm9tYTQyMl9kY19jb2VmZl90b2tlbl92bGNfdGFibGVfc2l6ZSA9IDgxOTI7CisKK3N0YXRpYyBWTEMgdG90YWxfemVyb3NfdmxjWzE1XTsKK3N0YXRpYyBWTENfVFlQRSB0b3RhbF96ZXJvc192bGNfdGFibGVzWzE1XVs1MTJdWzJdOworc3RhdGljIGNvbnN0IGludCB0b3RhbF96ZXJvc192bGNfdGFibGVzX3NpemUgPSA1MTI7CisKK3N0YXRpYyBWTEMgY2hyb21hX2RjX3RvdGFsX3plcm9zX3ZsY1szXTsKK3N0YXRpYyBWTENfVFlQRSBjaHJvbWFfZGNfdG90YWxfemVyb3NfdmxjX3RhYmxlc1szXVs4XVsyXTsKK3N0YXRpYyBjb25zdCBpbnQgY2hyb21hX2RjX3RvdGFsX3plcm9zX3ZsY190YWJsZXNfc2l6ZSA9IDg7CisKK3N0YXRpYyBWTEMgY2hyb21hNDIyX2RjX3RvdGFsX3plcm9zX3ZsY1s3XTsKK3N0YXRpYyBWTENfVFlQRSBjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfdmxjX3RhYmxlc1s3XVszMl1bMl07CitzdGF0aWMgY29uc3QgaW50IGNocm9tYTQyMl9kY190b3RhbF96ZXJvc192bGNfdGFibGVzX3NpemUgPSAzMjsKKworc3RhdGljIFZMQyBydW5fdmxjWzZdOworc3RhdGljIFZMQ19UWVBFIHJ1bl92bGNfdGFibGVzWzZdWzhdWzJdOworc3RhdGljIGNvbnN0IGludCBydW5fdmxjX3RhYmxlc19zaXplID0gODsKKworc3RhdGljIFZMQyBydW43X3ZsYzsKK3N0YXRpYyBWTENfVFlQRSBydW43X3ZsY190YWJsZVs5Nl1bMl07CitzdGF0aWMgY29uc3QgaW50IHJ1bjdfdmxjX3RhYmxlX3NpemUgPSA5NjsKKworI2RlZmluZSBMRVZFTF9UQUJfQklUUyA4CitzdGF0aWMgaW50OF90IGNhdmxjX2xldmVsX3RhYls3XVsxPDxMRVZFTF9UQUJfQklUU11bMl07CisKKyNkZWZpbmUgQ0hST01BX0RDX0NPRUZGX1RPS0VOX1ZMQ19CSVRTIDgKKyNkZWZpbmUgQ0hST01BNDIyX0RDX0NPRUZGX1RPS0VOX1ZMQ19CSVRTIDEzCisjZGVmaW5lIENPRUZGX1RPS0VOX1ZMQ19CSVRTICAgICAgICAgICA4CisjZGVmaW5lIFRPVEFMX1pFUk9TX1ZMQ19CSVRTICAgICAgICAgICA5CisjZGVmaW5lIENIUk9NQV9EQ19UT1RBTF9aRVJPU19WTENfQklUUyAzCisjZGVmaW5lIENIUk9NQTQyMl9EQ19UT1RBTF9aRVJPU19WTENfQklUUyA1CisjZGVmaW5lIFJVTl9WTENfQklUUyAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFJVTjdfVkxDX0JJVFMgICAgICAgICAgICAgICAgICA2CisKKy8qKgorICogR2V0IHRoZSBwcmVkaWN0ZWQgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cy4KKyAqIEBwYXJhbSBuIGJsb2NrIGluZGV4CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHByZWRfbm9uX3plcm9fY291bnQoSDI2NENvbnRleHQgKmgsIGludCBuKXsKKyAgICBjb25zdCBpbnQgaW5kZXg4PSBzY2FuOFtuXTsKKyAgICBjb25zdCBpbnQgbGVmdD0gaC0+bm9uX3plcm9fY291bnRfY2FjaGVbaW5kZXg4IC0gMV07CisgICAgY29uc3QgaW50IHRvcCA9IGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW2luZGV4OCAtIDhdOworICAgIGludCBpPSBsZWZ0ICsgdG9wOworCisgICAgaWYoaTw2NCkgaT0gKGkrMSk+PjE7CisKKyAgICB0cHJpbnRmKGgtPmF2Y3R4LCAicHJlZF9ubnogTCVYIFQlWCBuJWQgcyVkIFAlWFxuIiwgbGVmdCwgdG9wLCBuLCBzY2FuOFtuXSwgaSYzMSk7CisKKyAgICByZXR1cm4gaSYzMTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X2NhdmxjX2xldmVsX3RhYih2b2lkKXsKKyAgICBpbnQgc3VmZml4X2xlbmd0aDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIGZvcihzdWZmaXhfbGVuZ3RoPTA7IHN1ZmZpeF9sZW5ndGg8Nzsgc3VmZml4X2xlbmd0aCsrKXsKKyAgICAgICAgZm9yKGk9MDsgaTwoMTw8TEVWRUxfVEFCX0JJVFMpOyBpKyspeworICAgICAgICAgICAgaW50IHByZWZpeD0gTEVWRUxfVEFCX0JJVFMgLSBhdl9sb2cyKDIqaSk7CisKKyAgICAgICAgICAgIGlmKHByZWZpeCArIDEgKyBzdWZmaXhfbGVuZ3RoIDw9IExFVkVMX1RBQl9CSVRTKXsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWxfY29kZSA9IChwcmVmaXggPDwgc3VmZml4X2xlbmd0aCkgKworICAgICAgICAgICAgICAgICAgICAoaSA+PiAoYXZfbG9nMihpKSAtIHN1ZmZpeF9sZW5ndGgpKSAtICgxIDw8IHN1ZmZpeF9sZW5ndGgpOworICAgICAgICAgICAgICAgIGludCBtYXNrID0gLShsZXZlbF9jb2RlJjEpOworICAgICAgICAgICAgICAgIGxldmVsX2NvZGUgPSAoKCgyICsgbGV2ZWxfY29kZSkgPj4gMSkgXiBtYXNrKSAtIG1hc2s7CisgICAgICAgICAgICAgICAgY2F2bGNfbGV2ZWxfdGFiW3N1ZmZpeF9sZW5ndGhdW2ldWzBdPSBsZXZlbF9jb2RlOworICAgICAgICAgICAgICAgIGNhdmxjX2xldmVsX3RhYltzdWZmaXhfbGVuZ3RoXVtpXVsxXT0gcHJlZml4ICsgMSArIHN1ZmZpeF9sZW5ndGg7CisgICAgICAgICAgICB9ZWxzZSBpZihwcmVmaXggKyAxIDw9IExFVkVMX1RBQl9CSVRTKXsKKyAgICAgICAgICAgICAgICBjYXZsY19sZXZlbF90YWJbc3VmZml4X2xlbmd0aF1baV1bMF09IHByZWZpeCsxMDA7CisgICAgICAgICAgICAgICAgY2F2bGNfbGV2ZWxfdGFiW3N1ZmZpeF9sZW5ndGhdW2ldWzFdPSBwcmVmaXggKyAxOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgY2F2bGNfbGV2ZWxfdGFiW3N1ZmZpeF9sZW5ndGhdW2ldWzBdPSBMRVZFTF9UQUJfQklUUysxMDA7CisgICAgICAgICAgICAgICAgY2F2bGNfbGV2ZWxfdGFiW3N1ZmZpeF9sZW5ndGhdW2ldWzFdPSBMRVZFTF9UQUJfQklUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworYXZfY29sZCB2b2lkIGZmX2gyNjRfZGVjb2RlX2luaXRfdmxjKHZvaWQpeworICAgIHN0YXRpYyBpbnQgZG9uZSA9IDA7CisKKyAgICBpZiAoIWRvbmUpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBvZmZzZXQ7CisgICAgICAgIGRvbmUgPSAxOworCisgICAgICAgIGNocm9tYV9kY19jb2VmZl90b2tlbl92bGMudGFibGUgPSBjaHJvbWFfZGNfY29lZmZfdG9rZW5fdmxjX3RhYmxlOworICAgICAgICBjaHJvbWFfZGNfY29lZmZfdG9rZW5fdmxjLnRhYmxlX2FsbG9jYXRlZCA9IGNocm9tYV9kY19jb2VmZl90b2tlbl92bGNfdGFibGVfc2l6ZTsKKyAgICAgICAgaW5pdF92bGMoJmNocm9tYV9kY19jb2VmZl90b2tlbl92bGMsIENIUk9NQV9EQ19DT0VGRl9UT0tFTl9WTENfQklUUywgNCo1LAorICAgICAgICAgICAgICAgICAmY2hyb21hX2RjX2NvZWZmX3Rva2VuX2xlbiBbMF0sIDEsIDEsCisgICAgICAgICAgICAgICAgICZjaHJvbWFfZGNfY29lZmZfdG9rZW5fYml0c1swXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworCisgICAgICAgIGNocm9tYTQyMl9kY19jb2VmZl90b2tlbl92bGMudGFibGUgPSBjaHJvbWE0MjJfZGNfY29lZmZfdG9rZW5fdmxjX3RhYmxlOworICAgICAgICBjaHJvbWE0MjJfZGNfY29lZmZfdG9rZW5fdmxjLnRhYmxlX2FsbG9jYXRlZCA9IGNocm9tYTQyMl9kY19jb2VmZl90b2tlbl92bGNfdGFibGVfc2l6ZTsKKyAgICAgICAgaW5pdF92bGMoJmNocm9tYTQyMl9kY19jb2VmZl90b2tlbl92bGMsIENIUk9NQTQyMl9EQ19DT0VGRl9UT0tFTl9WTENfQklUUywgNCo5LAorICAgICAgICAgICAgICAgICAmY2hyb21hNDIyX2RjX2NvZWZmX3Rva2VuX2xlbiBbMF0sIDEsIDEsCisgICAgICAgICAgICAgICAgICZjaHJvbWE0MjJfZGNfY29lZmZfdG9rZW5fYml0c1swXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworCisgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgICAgIGNvZWZmX3Rva2VuX3ZsY1tpXS50YWJsZSA9IGNvZWZmX3Rva2VuX3ZsY190YWJsZXMrb2Zmc2V0OworICAgICAgICAgICAgY29lZmZfdG9rZW5fdmxjW2ldLnRhYmxlX2FsbG9jYXRlZCA9IGNvZWZmX3Rva2VuX3ZsY190YWJsZXNfc2l6ZVtpXTsKKyAgICAgICAgICAgIGluaXRfdmxjKCZjb2VmZl90b2tlbl92bGNbaV0sIENPRUZGX1RPS0VOX1ZMQ19CSVRTLCA0KjE3LAorICAgICAgICAgICAgICAgICAgICAgJmNvZWZmX3Rva2VuX2xlbiBbaV1bMF0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAmY29lZmZfdG9rZW5fYml0c1tpXVswXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICAgICAgICAgIG9mZnNldCArPSBjb2VmZl90b2tlbl92bGNfdGFibGVzX3NpemVbaV07CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogVGhpcyBpcyBhIG9uZSB0aW1lIHNhZmV0eSBjaGVjayB0byBtYWtlIHN1cmUgdGhhdAorICAgICAgICAgKiB0aGUgcGFja2VkIHN0YXRpYyBjb2VmZl90b2tlbl92bGMgdGFibGUgc2l6ZXMKKyAgICAgICAgICogd2VyZSBpbml0aWFsaXplZCBjb3JyZWN0bHkuCisgICAgICAgICAqLworICAgICAgICBhdl9hc3NlcnQwKG9mZnNldCA9PSBGRl9BUlJBWV9FTEVNUyhjb2VmZl90b2tlbl92bGNfdGFibGVzKSk7CisKKyAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspeworICAgICAgICAgICAgY2hyb21hX2RjX3RvdGFsX3plcm9zX3ZsY1tpXS50YWJsZSA9IGNocm9tYV9kY190b3RhbF96ZXJvc192bGNfdGFibGVzW2ldOworICAgICAgICAgICAgY2hyb21hX2RjX3RvdGFsX3plcm9zX3ZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSBjaHJvbWFfZGNfdG90YWxfemVyb3NfdmxjX3RhYmxlc19zaXplOworICAgICAgICAgICAgaW5pdF92bGMoJmNocm9tYV9kY190b3RhbF96ZXJvc192bGNbaV0sCisgICAgICAgICAgICAgICAgICAgICBDSFJPTUFfRENfVE9UQUxfWkVST1NfVkxDX0JJVFMsIDQsCisgICAgICAgICAgICAgICAgICAgICAmY2hyb21hX2RjX3RvdGFsX3plcm9zX2xlbiBbaV1bMF0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAmY2hyb21hX2RjX3RvdGFsX3plcm9zX2JpdHNbaV1bMF0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IoaT0wOyBpPDc7IGkrKyl7CisgICAgICAgICAgICBjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfdmxjW2ldLnRhYmxlID0gY2hyb21hNDIyX2RjX3RvdGFsX3plcm9zX3ZsY190YWJsZXNbaV07CisgICAgICAgICAgICBjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfdmxjW2ldLnRhYmxlX2FsbG9jYXRlZCA9IGNocm9tYTQyMl9kY190b3RhbF96ZXJvc192bGNfdGFibGVzX3NpemU7CisgICAgICAgICAgICBpbml0X3ZsYygmY2hyb21hNDIyX2RjX3RvdGFsX3plcm9zX3ZsY1tpXSwKKyAgICAgICAgICAgICAgICAgICAgIENIUk9NQTQyMl9EQ19UT1RBTF9aRVJPU19WTENfQklUUywgOCwKKyAgICAgICAgICAgICAgICAgICAgICZjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfbGVuIFtpXVswXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICZjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfYml0c1tpXVswXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihpPTA7IGk8MTU7IGkrKyl7CisgICAgICAgICAgICB0b3RhbF96ZXJvc192bGNbaV0udGFibGUgPSB0b3RhbF96ZXJvc192bGNfdGFibGVzW2ldOworICAgICAgICAgICAgdG90YWxfemVyb3NfdmxjW2ldLnRhYmxlX2FsbG9jYXRlZCA9IHRvdGFsX3plcm9zX3ZsY190YWJsZXNfc2l6ZTsKKyAgICAgICAgICAgIGluaXRfdmxjKCZ0b3RhbF96ZXJvc192bGNbaV0sCisgICAgICAgICAgICAgICAgICAgICBUT1RBTF9aRVJPU19WTENfQklUUywgMTYsCisgICAgICAgICAgICAgICAgICAgICAmdG90YWxfemVyb3NfbGVuIFtpXVswXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICZ0b3RhbF96ZXJvc19iaXRzW2ldWzBdLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgICAgICB9CisKKyAgICAgICAgZm9yKGk9MDsgaTw2OyBpKyspeworICAgICAgICAgICAgcnVuX3ZsY1tpXS50YWJsZSA9IHJ1bl92bGNfdGFibGVzW2ldOworICAgICAgICAgICAgcnVuX3ZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSBydW5fdmxjX3RhYmxlc19zaXplOworICAgICAgICAgICAgaW5pdF92bGMoJnJ1bl92bGNbaV0sCisgICAgICAgICAgICAgICAgICAgICBSVU5fVkxDX0JJVFMsIDcsCisgICAgICAgICAgICAgICAgICAgICAmcnVuX2xlbiBbaV1bMF0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAmcnVuX2JpdHNbaV1bMF0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgICAgIH0KKyAgICAgICAgcnVuN192bGMudGFibGUgPSBydW43X3ZsY190YWJsZSwKKyAgICAgICAgcnVuN192bGMudGFibGVfYWxsb2NhdGVkID0gcnVuN192bGNfdGFibGVfc2l6ZTsKKyAgICAgICAgaW5pdF92bGMoJnJ1bjdfdmxjLCBSVU43X1ZMQ19CSVRTLCAxNiwKKyAgICAgICAgICAgICAgICAgJnJ1bl9sZW4gWzZdWzBdLCAxLCAxLAorICAgICAgICAgICAgICAgICAmcnVuX2JpdHNbNl1bMF0sIDEsIDEsCisgICAgICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKworICAgICAgICBpbml0X2NhdmxjX2xldmVsX3RhYigpOworICAgIH0KK30KKworLyoqCisgKgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfbGV2ZWxfcHJlZml4KEdldEJpdENvbnRleHQgKmdiKXsKKyAgICB1bnNpZ25lZCBpbnQgYnVmOworICAgIGludCBsb2c7CisKKyAgICBPUEVOX1JFQURFUihyZSwgZ2IpOworICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOworICAgIGJ1Zj1HRVRfQ0FDSEUocmUsIGdiKTsKKworICAgIGxvZz0gMzIgLSBhdl9sb2cyKGJ1Zik7CisjaWZkZWYgVFJBQ0UKKyAgICBwcmludF9iaW4oYnVmPj4oMzItbG9nKSwgbG9nKTsKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiJTVkICUyZCAlM2QgbHByIEAlNWQgaW4gJXMgZ2V0X2xldmVsX3ByZWZpeFxuIiwgYnVmPj4oMzItbG9nKSwgbG9nLCBsb2ctMSwgZ2V0X2JpdHNfY291bnQoZ2IpLCBfX0ZJTEVfXyk7CisjZW5kaWYKKworICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgbG9nKTsKKyAgICBDTE9TRV9SRUFERVIocmUsIGdiKTsKKworICAgIHJldHVybiBsb2ctMTsKK30KKworLyoqCisgKiBEZWNvZGUgYSByZXNpZHVhbCBibG9jay4KKyAqIEBwYXJhbSBuIGJsb2NrIGluZGV4CisgKiBAcGFyYW0gc2NhbnRhYmxlIHNjYW50YWJsZQorICogQHBhcmFtIG1heF9jb2VmZiBudW1iZXIgb2YgY29lZmZpY2llbnRzIGluIHRoZSBibG9jaworICogQHJldHVybiA8MCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitzdGF0aWMgaW50IGRlY29kZV9yZXNpZHVhbChIMjY0Q29udGV4dCAqaCwgR2V0Qml0Q29udGV4dCAqZ2IsIGludDE2X3QgKmJsb2NrLCBpbnQgbiwgY29uc3QgdWludDhfdCAqc2NhbnRhYmxlLCBjb25zdCB1aW50MzJfdCAqcW11bCwgaW50IG1heF9jb2VmZil7CisgICAgc3RhdGljIGNvbnN0IGludCBjb2VmZl90b2tlbl90YWJsZV9pbmRleFsxN109IHswLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzfTsKKyAgICBpbnQgbGV2ZWxbMTZdOworICAgIGludCB6ZXJvc19sZWZ0LCBjb2VmZl90b2tlbiwgdG90YWxfY29lZmYsIGksIHRyYWlsaW5nX29uZXMsIHJ1bl9iZWZvcmU7CisKKyAgICAvL0ZJWE1FIHB1dCB0cmFpbGluZ19vbmV4IGludG8gdGhlIGNvbnRleHQKKworICAgIGlmKG1heF9jb2VmZiA8PSA4KXsKKyAgICAgICAgaWYgKG1heF9jb2VmZiA9PSA0KQorICAgICAgICAgICAgY29lZmZfdG9rZW4gPSBnZXRfdmxjMihnYiwgY2hyb21hX2RjX2NvZWZmX3Rva2VuX3ZsYy50YWJsZSwgQ0hST01BX0RDX0NPRUZGX1RPS0VOX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29lZmZfdG9rZW4gPSBnZXRfdmxjMihnYiwgY2hyb21hNDIyX2RjX2NvZWZmX3Rva2VuX3ZsYy50YWJsZSwgQ0hST01BNDIyX0RDX0NPRUZGX1RPS0VOX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgdG90YWxfY29lZmY9IGNvZWZmX3Rva2VuPj4yOworICAgIH1lbHNleworICAgICAgICBpZihuID49IExVTUFfRENfQkxPQ0tfSU5ERVgpeworICAgICAgICAgICAgdG90YWxfY29lZmY9IHByZWRfbm9uX3plcm9fY291bnQoaCwgKG4gLSBMVU1BX0RDX0JMT0NLX0lOREVYKSoxNik7CisgICAgICAgICAgICBjb2VmZl90b2tlbj0gZ2V0X3ZsYzIoZ2IsIGNvZWZmX3Rva2VuX3ZsY1sgY29lZmZfdG9rZW5fdGFibGVfaW5kZXhbdG90YWxfY29lZmZdIF0udGFibGUsIENPRUZGX1RPS0VOX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgIHRvdGFsX2NvZWZmPSBjb2VmZl90b2tlbj4+MjsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICB0b3RhbF9jb2VmZj0gcHJlZF9ub25femVyb19jb3VudChoLCBuKTsKKyAgICAgICAgICAgIGNvZWZmX3Rva2VuPSBnZXRfdmxjMihnYiwgY29lZmZfdG9rZW5fdmxjWyBjb2VmZl90b2tlbl90YWJsZV9pbmRleFt0b3RhbF9jb2VmZl0gXS50YWJsZSwgQ09FRkZfVE9LRU5fVkxDX0JJVFMsIDIpOworICAgICAgICAgICAgdG90YWxfY29lZmY9IGNvZWZmX3Rva2VuPj4yOworICAgICAgICB9CisgICAgfQorICAgIGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlWyBzY2FuOFtuXSBdPSB0b3RhbF9jb2VmZjsKKworICAgIC8vRklYTUUgc2V0IGxhc3Rfbm9uX3plcm8/CisKKyAgICBpZih0b3RhbF9jb2VmZj09MCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYodG90YWxfY29lZmYgPiAodW5zaWduZWQpbWF4X2NvZWZmKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY29ycnVwdGVkIG1hY3JvYmxvY2sgJWQgJWQgKHRvdGFsX2NvZWZmPSVkKVxuIiwgaC0+bWJfeCwgaC0+bWJfeSwgdG90YWxfY29lZmYpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdHJhaWxpbmdfb25lcz0gY29lZmZfdG9rZW4mMzsKKyAgICB0cHJpbnRmKGgtPmF2Y3R4LCAidHJhaWxpbmc6JWQsIHRvdGFsOiVkXG4iLCB0cmFpbGluZ19vbmVzLCB0b3RhbF9jb2VmZik7CisgICAgYXZfYXNzZXJ0Mih0b3RhbF9jb2VmZjw9MTYpOworCisgICAgaSA9IHNob3dfYml0cyhnYiwgMyk7CisgICAgc2tpcF9iaXRzKGdiLCB0cmFpbGluZ19vbmVzKTsKKyAgICBsZXZlbFswXSA9IDEtKChpJjQpPj4xKTsKKyAgICBsZXZlbFsxXSA9IDEtKChpJjIpICAgKTsKKyAgICBsZXZlbFsyXSA9IDEtKChpJjEpPDwxKTsKKworICAgIGlmKHRyYWlsaW5nX29uZXM8dG90YWxfY29lZmYpIHsKKyAgICAgICAgaW50IG1hc2ssIHByZWZpeDsKKyAgICAgICAgaW50IHN1ZmZpeF9sZW5ndGggPSB0b3RhbF9jb2VmZiA+IDEwICYgdHJhaWxpbmdfb25lcyA8IDM7CisgICAgICAgIGludCBiaXRzaT0gc2hvd19iaXRzKGdiLCBMRVZFTF9UQUJfQklUUyk7CisgICAgICAgIGludCBsZXZlbF9jb2RlPSBjYXZsY19sZXZlbF90YWJbc3VmZml4X2xlbmd0aF1bYml0c2ldWzBdOworCisgICAgICAgIHNraXBfYml0cyhnYiwgY2F2bGNfbGV2ZWxfdGFiW3N1ZmZpeF9sZW5ndGhdW2JpdHNpXVsxXSk7CisgICAgICAgIGlmKGxldmVsX2NvZGUgPj0gMTAwKXsKKyAgICAgICAgICAgIHByZWZpeD0gbGV2ZWxfY29kZSAtIDEwMDsKKyAgICAgICAgICAgIGlmKHByZWZpeCA9PSBMRVZFTF9UQUJfQklUUykKKyAgICAgICAgICAgICAgICBwcmVmaXggKz0gZ2V0X2xldmVsX3ByZWZpeChnYik7CisKKyAgICAgICAgICAgIC8vZmlyc3QgY29lZmZpY2llbnQgaGFzIHN1ZmZpeF9sZW5ndGggZXF1YWwgdG8gMCBvciAxCisgICAgICAgICAgICBpZihwcmVmaXg8MTQpeyAvL0ZJWE1FIHRyeSB0byBidWlsZCBhIGxhcmdlIHVuaWZpZWQgVkxDIHRhYmxlIGZvciBhbGwgdGhpcworICAgICAgICAgICAgICAgIGlmKHN1ZmZpeF9sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIGxldmVsX2NvZGU9IChwcmVmaXg8PDEpICsgZ2V0X2JpdHMxKGdiKTsgLy9wYXJ0CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsZXZlbF9jb2RlPSBwcmVmaXg7IC8vcGFydAorICAgICAgICAgICAgfWVsc2UgaWYocHJlZml4PT0xNCl7CisgICAgICAgICAgICAgICAgaWYoc3VmZml4X2xlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxfY29kZT0gKHByZWZpeDw8MSkgKyBnZXRfYml0czEoZ2IpOyAvL3BhcnQKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGxldmVsX2NvZGU9IHByZWZpeCArIGdldF9iaXRzKGdiLCA0KTsgLy9wYXJ0CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBsZXZlbF9jb2RlPSAzMDsKKyAgICAgICAgICAgICAgICBpZihwcmVmaXg+PTE2KXsKKyAgICAgICAgICAgICAgICAgICAgaWYocHJlZml4ID4gMjUrMyl7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbGV2ZWwgcHJlZml4XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsZXZlbF9jb2RlICs9ICgxPDwocHJlZml4LTMpKS00MDk2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZXZlbF9jb2RlICs9IGdldF9iaXRzKGdiLCBwcmVmaXgtMyk7IC8vcGFydAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZih0cmFpbGluZ19vbmVzIDwgMykgbGV2ZWxfY29kZSArPSAyOworCisgICAgICAgICAgICBzdWZmaXhfbGVuZ3RoID0gMjsKKyAgICAgICAgICAgIG1hc2s9IC0obGV2ZWxfY29kZSYxKTsKKyAgICAgICAgICAgIGxldmVsW3RyYWlsaW5nX29uZXNdPSAoKCgyK2xldmVsX2NvZGUpPj4xKSBeIG1hc2spIC0gbWFzazsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBsZXZlbF9jb2RlICs9ICgobGV2ZWxfY29kZT4+MzEpfDEpICYgLSh0cmFpbGluZ19vbmVzIDwgMyk7CisKKyAgICAgICAgICAgIHN1ZmZpeF9sZW5ndGggPSAxICsgKGxldmVsX2NvZGUgKyAzVSA+IDZVKTsKKyAgICAgICAgICAgIGxldmVsW3RyYWlsaW5nX29uZXNdPSBsZXZlbF9jb2RlOworICAgICAgICB9CisKKyAgICAgICAgLy9yZW1haW5pbmcgY29lZmZpY2llbnRzIGhhdmUgc3VmZml4X2xlbmd0aCA+IDAKKyAgICAgICAgZm9yKGk9dHJhaWxpbmdfb25lcysxO2k8dG90YWxfY29lZmY7aSsrKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN1ZmZpeF9saW1pdFs3XSA9IHswLDMsNiwxMiwyNCw0OCxJTlRfTUFYIH07CisgICAgICAgICAgICBpbnQgYml0c2k9IHNob3dfYml0cyhnYiwgTEVWRUxfVEFCX0JJVFMpOworICAgICAgICAgICAgbGV2ZWxfY29kZT0gY2F2bGNfbGV2ZWxfdGFiW3N1ZmZpeF9sZW5ndGhdW2JpdHNpXVswXTsKKworICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCBjYXZsY19sZXZlbF90YWJbc3VmZml4X2xlbmd0aF1bYml0c2ldWzFdKTsKKyAgICAgICAgICAgIGlmKGxldmVsX2NvZGUgPj0gMTAwKXsKKyAgICAgICAgICAgICAgICBwcmVmaXg9IGxldmVsX2NvZGUgLSAxMDA7CisgICAgICAgICAgICAgICAgaWYocHJlZml4ID09IExFVkVMX1RBQl9CSVRTKXsKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ICs9IGdldF9sZXZlbF9wcmVmaXgoZ2IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihwcmVmaXg8MTUpeworICAgICAgICAgICAgICAgICAgICBsZXZlbF9jb2RlID0gKHByZWZpeDw8c3VmZml4X2xlbmd0aCkgKyBnZXRfYml0cyhnYiwgc3VmZml4X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGxldmVsX2NvZGUgPSAxNTw8c3VmZml4X2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeD49MTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZpeCA+IDI1KzMpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBsZXZlbCBwcmVmaXhcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxfY29kZSArPSAoMTw8KHByZWZpeC0zKSktNDA5NjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsZXZlbF9jb2RlICs9IGdldF9iaXRzKGdiLCBwcmVmaXgtMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hc2s9IC0obGV2ZWxfY29kZSYxKTsKKyAgICAgICAgICAgICAgICBsZXZlbF9jb2RlPSAoKCgyK2xldmVsX2NvZGUpPj4xKSBeIG1hc2spIC0gbWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldmVsW2ldPSBsZXZlbF9jb2RlOworICAgICAgICAgICAgc3VmZml4X2xlbmd0aCs9IHN1ZmZpeF9saW1pdFtzdWZmaXhfbGVuZ3RoXSArIGxldmVsX2NvZGUgPiAyVSpzdWZmaXhfbGltaXRbc3VmZml4X2xlbmd0aF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZih0b3RhbF9jb2VmZiA9PSBtYXhfY29lZmYpCisgICAgICAgIHplcm9zX2xlZnQ9MDsKKyAgICBlbHNleworICAgICAgICBpZiAobWF4X2NvZWZmIDw9IDgpIHsKKyAgICAgICAgICAgIGlmIChtYXhfY29lZmYgPT0gNCkKKyAgICAgICAgICAgICAgICB6ZXJvc19sZWZ0ID0gZ2V0X3ZsYzIoZ2IsIChjaHJvbWFfZGNfdG90YWxfemVyb3NfdmxjLTEpW3RvdGFsX2NvZWZmXS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hST01BX0RDX1RPVEFMX1pFUk9TX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ZXJvc19sZWZ0ID0gZ2V0X3ZsYzIoZ2IsIChjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfdmxjLTEpW3RvdGFsX2NvZWZmXS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hST01BNDIyX0RDX1RPVEFMX1pFUk9TX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHplcm9zX2xlZnQ9IGdldF92bGMyKGdiLCAodG90YWxfemVyb3NfdmxjLTEpWyB0b3RhbF9jb2VmZiBdLnRhYmxlLCBUT1RBTF9aRVJPU19WTENfQklUUywgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyNkZWZpbmUgU1RPUkVfQkxPQ0sodHlwZSkgXAorICAgIHNjYW50YWJsZSArPSB6ZXJvc19sZWZ0ICsgdG90YWxfY29lZmYgLSAxOyBcCisgICAgaWYobiA+PSBMVU1BX0RDX0JMT0NLX0lOREVYKXsgXAorICAgICAgICAoKHR5cGUqKWJsb2NrKVsqc2NhbnRhYmxlXSA9IGxldmVsWzBdOyBcCisgICAgICAgIGZvcihpPTE7aTx0b3RhbF9jb2VmZiAmJiB6ZXJvc19sZWZ0ID4gMDtpKyspIHsgXAorICAgICAgICAgICAgaWYoemVyb3NfbGVmdCA8IDcpIFwKKyAgICAgICAgICAgICAgICBydW5fYmVmb3JlPSBnZXRfdmxjMihnYiwgKHJ1bl92bGMtMSlbemVyb3NfbGVmdF0udGFibGUsIFJVTl9WTENfQklUUywgMSk7IFwKKyAgICAgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgICAgIHJ1bl9iZWZvcmU9IGdldF92bGMyKGdiLCBydW43X3ZsYy50YWJsZSwgUlVON19WTENfQklUUywgMik7IFwKKyAgICAgICAgICAgIHplcm9zX2xlZnQgLT0gcnVuX2JlZm9yZTsgXAorICAgICAgICAgICAgc2NhbnRhYmxlIC09IDEgKyBydW5fYmVmb3JlOyBcCisgICAgICAgICAgICAoKHR5cGUqKWJsb2NrKVsqc2NhbnRhYmxlXT0gbGV2ZWxbaV07IFwKKyAgICAgICAgfSBcCisgICAgICAgIGZvcig7aTx0b3RhbF9jb2VmZjtpKyspIHsgXAorICAgICAgICAgICAgc2NhbnRhYmxlLS07IFwKKyAgICAgICAgICAgICgodHlwZSopYmxvY2spWypzY2FudGFibGVdPSBsZXZlbFtpXTsgXAorICAgICAgICB9IFwKKyAgICB9ZWxzZXsgXAorICAgICAgICAoKHR5cGUqKWJsb2NrKVsqc2NhbnRhYmxlXSA9ICgoaW50KShsZXZlbFswXSAqIHFtdWxbKnNjYW50YWJsZV0gKyAzMikpPj42OyBcCisgICAgICAgIGZvcihpPTE7aTx0b3RhbF9jb2VmZiAmJiB6ZXJvc19sZWZ0ID4gMDtpKyspIHsgXAorICAgICAgICAgICAgaWYoemVyb3NfbGVmdCA8IDcpIFwKKyAgICAgICAgICAgICAgICBydW5fYmVmb3JlPSBnZXRfdmxjMihnYiwgKHJ1bl92bGMtMSlbemVyb3NfbGVmdF0udGFibGUsIFJVTl9WTENfQklUUywgMSk7IFwKKyAgICAgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgICAgIHJ1bl9iZWZvcmU9IGdldF92bGMyKGdiLCBydW43X3ZsYy50YWJsZSwgUlVON19WTENfQklUUywgMik7IFwKKyAgICAgICAgICAgIHplcm9zX2xlZnQgLT0gcnVuX2JlZm9yZTsgXAorICAgICAgICAgICAgc2NhbnRhYmxlIC09IDEgKyBydW5fYmVmb3JlOyBcCisgICAgICAgICAgICAoKHR5cGUqKWJsb2NrKVsqc2NhbnRhYmxlXT0gKChpbnQpKGxldmVsW2ldICogcW11bFsqc2NhbnRhYmxlXSArIDMyKSk+PjY7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGZvcig7aTx0b3RhbF9jb2VmZjtpKyspIHsgXAorICAgICAgICAgICAgc2NhbnRhYmxlLS07IFwKKyAgICAgICAgICAgICgodHlwZSopYmxvY2spWypzY2FudGFibGVdPSAoKGludCkobGV2ZWxbaV0gKiBxbXVsWypzY2FudGFibGVdICsgMzIpKT4+NjsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyAgICBpZiAoaC0+cGl4ZWxfc2hpZnQpIHsKKyAgICAgICAgU1RPUkVfQkxPQ0soaW50MzJfdCkKKyAgICB9IGVsc2UgeworICAgICAgICBTVE9SRV9CTE9DSyhpbnQxNl90KQorICAgIH0KKworICAgIGlmKHplcm9zX2xlZnQ8MCl7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibmVnYXRpdmUgbnVtYmVyIG9mIHplcm8gY29lZmZzIGF0ICVkICVkXG4iLCBoLT5tYl94LCBoLT5tYl95KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZGVjb2RlX2x1bWFfcmVzaWR1YWwoSDI2NENvbnRleHQgKmgsIEdldEJpdENvbnRleHQgKmdiLCBjb25zdCB1aW50OF90ICpzY2FuLCBjb25zdCB1aW50OF90ICpzY2FuOHg4LCBpbnQgcGl4ZWxfc2hpZnQsIGludCBtYl90eXBlLCBpbnQgY2JwLCBpbnQgcCl7CisgICAgaW50IGk0eDQsIGk4eDg7CisgICAgaW50IHFzY2FsZSA9IHAgPT0gMCA/IGgtPnFzY2FsZSA6IGgtPmNocm9tYV9xcFtwLTFdOworICAgIGlmKElTX0lOVFJBMTZ4MTYobWJfdHlwZSkpeworICAgICAgICBBVl9aRVJPMTI4KGgtPm1iX2x1bWFfZGNbcF0rMCk7CisgICAgICAgIEFWX1pFUk8xMjgoaC0+bWJfbHVtYV9kY1twXSs4KTsKKyAgICAgICAgQVZfWkVSTzEyOChoLT5tYl9sdW1hX2RjW3BdKzE2KTsKKyAgICAgICAgQVZfWkVSTzEyOChoLT5tYl9sdW1hX2RjW3BdKzI0KTsKKyAgICAgICAgaWYoIGRlY29kZV9yZXNpZHVhbChoLCBoLT5pbnRyYV9nYl9wdHIsIGgtPm1iX2x1bWFfZGNbcF0sIExVTUFfRENfQkxPQ0tfSU5ERVgrcCwgc2NhbiwgTlVMTCwgMTYpIDwgMCl7CisgICAgICAgICAgICByZXR1cm4gLTE7IC8vRklYTUUgY29udGludWUgaWYgcGFydGl0aW9uZWQgYW5kIG90aGVyIHJldHVybiAtMSB0b28KKyAgICAgICAgfQorCisgICAgICAgIGF2X2Fzc2VydDIoKGNicCYxNSkgPT0gMCB8fCAoY2JwJjE1KSA9PSAxNSk7CisKKyAgICAgICAgaWYoY2JwJjE1KXsKKyAgICAgICAgICAgIGZvcihpOHg4PTA7IGk4eDg8NDsgaTh4OCsrKXsKKyAgICAgICAgICAgICAgICBmb3IoaTR4ND0wOyBpNHg0PDQ7IGk0eDQrKyl7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleD0gaTR4NCArIDQqaTh4OCArIHAqMTY7CisgICAgICAgICAgICAgICAgICAgIGlmKCBkZWNvZGVfcmVzaWR1YWwoaCwgaC0+aW50cmFfZ2JfcHRyLCBoLT5tYiArICgxNippbmRleCA8PCBwaXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgc2NhbiArIDEsIGgtPmRlcXVhbnQ0X2NvZWZmW3BdW3FzY2FsZV0sIDE1KSA8IDAgKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAweGY7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W3AqMTZdXSwgNCwgNCwgOCwgMCwgMSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBpbnQgY3FtID0gKElTX0lOVFJBKCBtYl90eXBlICkgPyAwOjMpK3A7CisgICAgICAgIC8qIEZvciBDQVZMQyA0OjQ6NCwgd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsdW1hIDh4OCBDQlAgZm9yIGRlYmxvY2tpbmcgbm56IHB1cnBvc2VzLiAqLworICAgICAgICBpbnQgbmV3X2NicCA9IDA7CisgICAgICAgIGZvcihpOHg4PTA7IGk4eDg8NDsgaTh4OCsrKXsKKyAgICAgICAgICAgIGlmKGNicCAmICgxPDxpOHg4KSl7CisgICAgICAgICAgICAgICAgaWYoSVNfOHg4RENUKG1iX3R5cGUpKXsKKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYnVmID0gJmgtPm1iWzY0Kmk4eDgrMjU2KnAgPDwgcGl4ZWxfc2hpZnRdOworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpubno7CisgICAgICAgICAgICAgICAgICAgIGZvcihpNHg0PTA7IGk0eDQ8NDsgaTR4NCsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleD0gaTR4NCArIDQqaTh4OCArIHAqMTY7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZGVjb2RlX3Jlc2lkdWFsKGgsIGdiLCBidWYsIGluZGV4LCBzY2FuOHg4KzE2Kmk0eDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ4X2NvZWZmW2NxbV1bcXNjYWxlXSwgMTYpIDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5uej0gJmgtPm5vbl96ZXJvX2NvdW50X2NhY2hlWyBzY2FuOFs0Kmk4eDgrcCoxNl0gXTsKKyAgICAgICAgICAgICAgICAgICAgbm56WzBdICs9IG5uelsxXSArIG5uels4XSArIG5uels5XTsKKyAgICAgICAgICAgICAgICAgICAgbmV3X2NicCB8PSAhIW5uelswXSA8PCBpOHg4OworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBmb3IoaTR4ND0wOyBpNHg0PDQ7IGk0eDQrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXg9IGk0eDQgKyA0Kmk4eDggKyBwKjE2OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGRlY29kZV9yZXNpZHVhbChoLCBnYiwgaC0+bWIgKyAoMTYqaW5kZXggPDwgcGl4ZWxfc2hpZnQpLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbiwgaC0+ZGVxdWFudDRfY29lZmZbY3FtXVtxc2NhbGVdLCAxNikgPCAwICl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NicCB8PSBoLT5ub25femVyb19jb3VudF9jYWNoZVsgc2NhbjhbaW5kZXhdIF0gPDwgaTh4ODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKiBjb25zdCBubno9ICZoLT5ub25femVyb19jb3VudF9jYWNoZVsgc2NhbjhbNCppOHg4K3AqMTZdIF07CisgICAgICAgICAgICAgICAgbm56WzBdID0gbm56WzFdID0gbm56WzhdID0gbm56WzldID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3X2NicDsKKyAgICB9Cit9CisKK2ludCBmZl9oMjY0X2RlY29kZV9tYl9jYXZsYyhIMjY0Q29udGV4dCAqaCl7CisgICAgaW50IG1iX3h5OworICAgIGludCBwYXJ0aXRpb25fY291bnQ7CisgICAgdW5zaWduZWQgaW50IG1iX3R5cGUsIGNicDsKKyAgICBpbnQgZGN0OHg4X2FsbG93ZWQ9IGgtPnBwcy50cmFuc2Zvcm1fOHg4X21vZGU7CisgICAgaW50IGRlY29kZV9jaHJvbWEgPSBoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMgPT0gMSB8fCBoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMgPT0gMjsKKyAgICBjb25zdCBpbnQgcGl4ZWxfc2hpZnQgPSBoLT5waXhlbF9zaGlmdDsKKyAgICB1bnNpZ25lZCBsb2NhbF9yZWZfY291bnRbMl07CisKKyAgICBtYl94eSA9IGgtPm1iX3h5ID0gaC0+bWJfeCArIGgtPm1iX3kqaC0+bWJfc3RyaWRlOworCisgICAgdHByaW50ZihoLT5hdmN0eCwgInBpYzolZCBtYjolZC8lZFxuIiwgaC0+ZnJhbWVfbnVtLCBoLT5tYl94LCBoLT5tYl95KTsKKyAgICBjYnAgPSAwOyAvKiBhdm9pZCB3YXJuaW5nLiBGSVhNRTogZmluZCBhIHNvbHV0aW9uIHdpdGhvdXQgc2xvd2luZworICAgICAgICAgICAgICAgIGRvd24gdGhlIGNvZGUgKi8KKyAgICBpZihoLT5zbGljZV90eXBlX25vcyAhPSBBVl9QSUNUVVJFX1RZUEVfSSl7CisgICAgICAgIGlmKGgtPm1iX3NraXBfcnVuPT0tMSkKKyAgICAgICAgICAgIGgtPm1iX3NraXBfcnVuPSBnZXRfdWVfZ29sb21iX2xvbmcoJmgtPmdiKTsKKworICAgICAgICBpZiAoaC0+bWJfc2tpcF9ydW4tLSkgeworICAgICAgICAgICAgaWYoRlJBTUVfTUJBRkYoaCkgJiYgKGgtPm1iX3kmMSkgPT0gMCl7CisgICAgICAgICAgICAgICAgaWYoaC0+bWJfc2tpcF9ydW49PTApCisgICAgICAgICAgICAgICAgICAgIGgtPm1iX21iYWZmID0gaC0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVjb2RlX21iX3NraXAoaCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoRlJBTUVfTUJBRkYoaCkpIHsKKyAgICAgICAgaWYoIChoLT5tYl95JjEpID09IDAgKQorICAgICAgICAgICAgaC0+bWJfbWJhZmYgPSBoLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgfQorCisgICAgaC0+cHJldl9tYl9za2lwcGVkPSAwOworCisgICAgbWJfdHlwZT0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgIGlmKGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKXsKKyAgICAgICAgaWYobWJfdHlwZSA8IDIzKXsKKyAgICAgICAgICAgIHBhcnRpdGlvbl9jb3VudD0gYl9tYl90eXBlX2luZm9bbWJfdHlwZV0ucGFydGl0aW9uX2NvdW50OworICAgICAgICAgICAgbWJfdHlwZT0gICAgICAgICBiX21iX3R5cGVfaW5mb1ttYl90eXBlXS50eXBlOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIG1iX3R5cGUgLT0gMjM7CisgICAgICAgICAgICBnb3RvIGRlY29kZV9pbnRyYV9tYjsKKyAgICAgICAgfQorICAgIH1lbHNlIGlmKGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9QKXsKKyAgICAgICAgaWYobWJfdHlwZSA8IDUpeworICAgICAgICAgICAgcGFydGl0aW9uX2NvdW50PSBwX21iX3R5cGVfaW5mb1ttYl90eXBlXS5wYXJ0aXRpb25fY291bnQ7CisgICAgICAgICAgICBtYl90eXBlPSAgICAgICAgIHBfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnR5cGU7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgbWJfdHlwZSAtPSA1OworICAgICAgICAgICAgZ290byBkZWNvZGVfaW50cmFfbWI7CisgICAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgICBhdl9hc3NlcnQyKGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9JKTsKKyAgICAgICAgaWYoaC0+c2xpY2VfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfU0kgJiYgbWJfdHlwZSkKKyAgICAgICAgICAgIG1iX3R5cGUtLTsKK2RlY29kZV9pbnRyYV9tYjoKKyAgICAgICAgaWYobWJfdHlwZSA+IDI1KXsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibWJfdHlwZSAlZCBpbiAlYyBzbGljZSB0b28gbGFyZ2UgYXQgJWQgJWRcbiIsIG1iX3R5cGUsIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihoLT5zbGljZV90eXBlKSwgaC0+bWJfeCwgaC0+bWJfeSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcGFydGl0aW9uX2NvdW50PTA7CisgICAgICAgIGNicD0gaV9tYl90eXBlX2luZm9bbWJfdHlwZV0uY2JwOworICAgICAgICBoLT5pbnRyYTE2eDE2X3ByZWRfbW9kZT0gaV9tYl90eXBlX2luZm9bbWJfdHlwZV0ucHJlZF9tb2RlOworICAgICAgICBtYl90eXBlPSBpX21iX3R5cGVfaW5mb1ttYl90eXBlXS50eXBlOworICAgIH0KKworICAgIGlmKE1CX0ZJRUxEKGgpKQorICAgICAgICBtYl90eXBlIHw9IE1CX1RZUEVfSU5URVJMQUNFRDsKKworICAgIGgtPnNsaWNlX3RhYmxlWyBtYl94eSBdPSBoLT5zbGljZV9udW07CisKKyAgICBpZihJU19JTlRSQV9QQ00obWJfdHlwZSkpeworICAgICAgICBjb25zdCBpbnQgbWJfc2l6ZSA9IGZmX2gyNjRfbWJfc2l6ZXNbaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c3BzLmJpdF9kZXB0aF9sdW1hOworCisgICAgICAgIC8vIFdlIGFzc3VtZSB0aGVzZSBibG9ja3MgYXJlIHZlcnkgcmFyZSBzbyB3ZSBkbyBub3Qgb3B0aW1pemUgaXQuCisgICAgICAgIGgtPmludHJhX3BjbV9wdHIgPSBhbGlnbl9nZXRfYml0cygmaC0+Z2IpOworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpIDwgbWJfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJOb3QgZW5vdWdoIGRhdGEgZm9yIGFuIGludHJhIFBDTSBibG9jay5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmgtPmdiLCBtYl9zaXplKTsKKworICAgICAgICAvLyBJbiBkZWJsb2NraW5nLCB0aGUgcXVhbnRpemVyIGlzIDAKKyAgICAgICAgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHldID0gMDsKKyAgICAgICAgLy8gQWxsIGNvZWZmcyBhcmUgcHJlc2VudAorICAgICAgICBtZW1zZXQoaC0+bm9uX3plcm9fY291bnRbbWJfeHldLCAxNiwgNDgpOworCisgICAgICAgIGgtPmN1cl9waWMubWJfdHlwZVttYl94eV0gPSBtYl90eXBlOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsb2NhbF9yZWZfY291bnRbMF0gPSBoLT5yZWZfY291bnRbMF0gPDwgTUJfTUJBRkYoaCk7CisgICAgbG9jYWxfcmVmX2NvdW50WzFdID0gaC0+cmVmX2NvdW50WzFdIDw8IE1CX01CQUZGKGgpOworCisgICAgZmlsbF9kZWNvZGVfbmVpZ2hib3JzKGgsIG1iX3R5cGUpOworICAgIGZpbGxfZGVjb2RlX2NhY2hlcyhoLCBtYl90eXBlKTsKKworICAgIC8vbWJfcHJlZAorICAgIGlmKElTX0lOVFJBKG1iX3R5cGUpKXsKKyAgICAgICAgaW50IHByZWRfbW9kZTsKKy8vICAgICAgICAgICAgaW5pdF90b3BfbGVmdF9hdmFpbGFiaWxpdHkoaCk7CisgICAgICAgIGlmKElTX0lOVFJBNHg0KG1iX3R5cGUpKXsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaW50IGRpID0gMTsKKyAgICAgICAgICAgIGlmKGRjdDh4OF9hbGxvd2VkICYmIGdldF9iaXRzMSgmaC0+Z2IpKXsKKyAgICAgICAgICAgICAgICBtYl90eXBlIHw9IE1CX1RZUEVfOHg4RENUOworICAgICAgICAgICAgICAgIGRpID0gNDsKKyAgICAgICAgICAgIH0KKworLy8gICAgICAgICAgICAgICAgZmlsbF9pbnRyYTR4NF9wcmVkX3RhYmxlKGgpOworICAgICAgICAgICAgZm9yKGk9MDsgaTwxNjsgaSs9ZGkpeworICAgICAgICAgICAgICAgIGludCBtb2RlPSBwcmVkX2ludHJhX21vZGUoaCwgaSk7CisKKyAgICAgICAgICAgICAgICBpZighZ2V0X2JpdHMxKCZoLT5nYikpeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcmVtX21vZGU9IGdldF9iaXRzKCZoLT5nYiwgMyk7CisgICAgICAgICAgICAgICAgICAgIG1vZGUgPSByZW1fbW9kZSArIChyZW1fbW9kZSA+PSBtb2RlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihkaT09NCkKKyAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoICZoLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbIHNjYW44W2ldIF0sIDIsIDIsIDgsIG1vZGUsIDEgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVsgc2NhbjhbaV0gXSA9IG1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZV9iYWNrX2ludHJhX3ByZWRfbW9kZShoKTsKKyAgICAgICAgICAgIGlmKCBmZl9oMjY0X2NoZWNrX2ludHJhNHg0X3ByZWRfbW9kZShoKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGgtPmludHJhMTZ4MTZfcHJlZF9tb2RlPSBmZl9oMjY0X2NoZWNrX2ludHJhX3ByZWRfbW9kZShoLCBoLT5pbnRyYTE2eDE2X3ByZWRfbW9kZSwgMCk7CisgICAgICAgICAgICBpZihoLT5pbnRyYTE2eDE2X3ByZWRfbW9kZSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmKGRlY29kZV9jaHJvbWEpeworICAgICAgICAgICAgcHJlZF9tb2RlPSBmZl9oMjY0X2NoZWNrX2ludHJhX3ByZWRfbW9kZShoLCBnZXRfdWVfZ29sb21iXzMxKCZoLT5nYiksIDEpOworICAgICAgICAgICAgaWYocHJlZF9tb2RlIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBoLT5jaHJvbWFfcHJlZF9tb2RlPSBwcmVkX21vZGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoLT5jaHJvbWFfcHJlZF9tb2RlID0gRENfMTI4X1BSRUQ4eDg7CisgICAgICAgIH0KKyAgICB9ZWxzZSBpZihwYXJ0aXRpb25fY291bnQ9PTQpeworICAgICAgICBpbnQgaSwgaiwgc3ViX3BhcnRpdGlvbl9jb3VudFs0XSwgbGlzdCwgcmVmWzJdWzRdOworCisgICAgICAgIGlmKGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKXsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgICAgICAgICBoLT5zdWJfbWJfdHlwZVtpXT0gZ2V0X3VlX2dvbG9tYl8zMSgmaC0+Z2IpOworICAgICAgICAgICAgICAgIGlmKGgtPnN1Yl9tYl90eXBlW2ldID49MTMpeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkIgc3ViX21iX3R5cGUgJXUgb3V0IG9mIHJhbmdlIGF0ICVkICVkXG4iLCBoLT5zdWJfbWJfdHlwZVtpXSwgaC0+bWJfeCwgaC0+bWJfeSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3ViX3BhcnRpdGlvbl9jb3VudFtpXT0gYl9zdWJfbWJfdHlwZV9pbmZvWyBoLT5zdWJfbWJfdHlwZVtpXSBdLnBhcnRpdGlvbl9jb3VudDsKKyAgICAgICAgICAgICAgICBoLT5zdWJfbWJfdHlwZVtpXT0gICAgICBiX3N1Yl9tYl90eXBlX2luZm9bIGgtPnN1Yl9tYl90eXBlW2ldIF0udHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBJU19ESVJFQ1QoaC0+c3ViX21iX3R5cGVbMF18aC0+c3ViX21iX3R5cGVbMV18aC0+c3ViX21iX3R5cGVbMl18aC0+c3ViX21iX3R5cGVbM10pKSB7CisgICAgICAgICAgICAgICAgZmZfaDI2NF9wcmVkX2RpcmVjdF9tb3Rpb24oaCwgJm1iX3R5cGUpOworICAgICAgICAgICAgICAgIGgtPnJlZl9jYWNoZVswXVtzY2FuOFs0XV0gPQorICAgICAgICAgICAgICAgIGgtPnJlZl9jYWNoZVsxXVtzY2FuOFs0XV0gPQorICAgICAgICAgICAgICAgIGgtPnJlZl9jYWNoZVswXVtzY2FuOFsxMl1dID0KKyAgICAgICAgICAgICAgICBoLT5yZWZfY2FjaGVbMV1bc2NhbjhbMTJdXSA9IFBBUlRfTk9UX0FWQUlMQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBhdl9hc3NlcnQyKGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9QKTsgLy9GSVhNRSBTUCBjb3JyZWN0ID8KKyAgICAgICAgICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgICAgICAgICBoLT5zdWJfbWJfdHlwZVtpXT0gZ2V0X3VlX2dvbG9tYl8zMSgmaC0+Z2IpOworICAgICAgICAgICAgICAgIGlmKGgtPnN1Yl9tYl90eXBlW2ldID49NCl7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUCBzdWJfbWJfdHlwZSAldSBvdXQgb2YgcmFuZ2UgYXQgJWQgJWRcbiIsIGgtPnN1Yl9tYl90eXBlW2ldLCBoLT5tYl94LCBoLT5tYl95KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdWJfcGFydGl0aW9uX2NvdW50W2ldPSBwX3N1Yl9tYl90eXBlX2luZm9bIGgtPnN1Yl9tYl90eXBlW2ldIF0ucGFydGl0aW9uX2NvdW50OworICAgICAgICAgICAgICAgIGgtPnN1Yl9tYl90eXBlW2ldPSAgICAgIHBfc3ViX21iX3R5cGVfaW5mb1sgaC0+c3ViX21iX3R5cGVbaV0gXS50eXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKGxpc3Q9MDsgbGlzdDxoLT5saXN0X2NvdW50OyBsaXN0KyspeworICAgICAgICAgICAgaW50IHJlZl9jb3VudCA9IElTX1JFRjAobWJfdHlwZSkgPyAxIDogbG9jYWxfcmVmX2NvdW50W2xpc3RdOworICAgICAgICAgICAgZm9yKGk9MDsgaTw0OyBpKyspeworICAgICAgICAgICAgICAgIGlmKElTX0RJUkVDVChoLT5zdWJfbWJfdHlwZVtpXSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmKElTX0RJUihoLT5zdWJfbWJfdHlwZVtpXSwgMCwgbGlzdCkpeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdG1wOworICAgICAgICAgICAgICAgICAgICBpZihyZWZfY291bnQgPT0gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXA9IDA7CisgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHJlZl9jb3VudCA9PSAyKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcD0gZ2V0X2JpdHMxKCZoLT5nYileMTsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXA9IGdldF91ZV9nb2xvbWJfMzEoJmgtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRtcD49cmVmX2NvdW50KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJlZiAldSBvdmVyZmxvd1xuIiwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVmW2xpc3RdW2ldPSB0bXA7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgIC8vRklYTUUKKyAgICAgICAgICAgICAgICAgICAgcmVmW2xpc3RdW2ldID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoZGN0OHg4X2FsbG93ZWQpCisgICAgICAgICAgICBkY3Q4eDhfYWxsb3dlZCA9IGdldF9kY3Q4eDhfYWxsb3dlZChoKTsKKworICAgICAgICBmb3IobGlzdD0wOyBsaXN0PGgtPmxpc3RfY291bnQ7IGxpc3QrKyl7CisgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7CisgICAgICAgICAgICAgICAgaWYoSVNfRElSRUNUKGgtPnN1Yl9tYl90eXBlW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBoLT5yZWZfY2FjaGVbbGlzdF1bIHNjYW44WzQqaV0gXSA9IGgtPnJlZl9jYWNoZVtsaXN0XVsgc2NhbjhbNCppXSsxIF07CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoLT5yZWZfY2FjaGVbbGlzdF1bIHNjYW44WzQqaV0gICBdPWgtPnJlZl9jYWNoZVtsaXN0XVsgc2NhbjhbNCppXSsxIF09CisgICAgICAgICAgICAgICAgaC0+cmVmX2NhY2hlW2xpc3RdWyBzY2FuOFs0KmldKzggXT1oLT5yZWZfY2FjaGVbbGlzdF1bIHNjYW44WzQqaV0rOSBdPSByZWZbbGlzdF1baV07CisKKyAgICAgICAgICAgICAgICBpZihJU19ESVIoaC0+c3ViX21iX3R5cGVbaV0sIDAsIGxpc3QpKXsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN1Yl9tYl90eXBlPSBoLT5zdWJfbWJfdHlwZVtpXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJsb2NrX3dpZHRoPSAoc3ViX21iX3R5cGUgJiAoTUJfVFlQRV8xNngxNnxNQl9UWVBFXzE2eDgpKSA/IDIgOiAxOworICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wOyBqPHN1Yl9wYXJ0aXRpb25fY291bnRbaV07IGorKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXgsIG15OworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGluZGV4PSA0KmkgKyBibG9ja193aWR0aCpqOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAoKiBtdl9jYWNoZSlbMl09ICZoLT5tdl9jYWNoZVtsaXN0XVsgc2NhbjhbaW5kZXhdIF07CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkX21vdGlvbihoLCBpbmRleCwgYmxvY2tfd2lkdGgsIGxpc3QsIGgtPnJlZl9jYWNoZVtsaXN0XVsgc2NhbjhbaW5kZXhdIF0sICZteCwgJm15KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG14ICs9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICs9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwcmludGYoaC0+YXZjdHgsICJmaW5hbCBtdjolZCAlZFxuIiwgbXgsIG15KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoSVNfU1VCXzhYOChzdWJfbWJfdHlwZSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X2NhY2hlWyAxIF1bMF09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZfY2FjaGVbIDggXVswXT0gbXZfY2FjaGVbIDkgXVswXT0gbXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZfY2FjaGVbIDEgXVsxXT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9jYWNoZVsgOCBdWzFdPSBtdl9jYWNoZVsgOSBdWzFdPSBteTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKElTX1NVQl84WDQoc3ViX21iX3R5cGUpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9jYWNoZVsgMSBdWzBdPSBteDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9jYWNoZVsgMSBdWzFdPSBteTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKElTX1NVQl80WDgoc3ViX21iX3R5cGUpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9jYWNoZVsgOCBdWzBdPSBteDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9jYWNoZVsgOCBdWzFdPSBteTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG12X2NhY2hlWyAwIF1bMF09IG14OworICAgICAgICAgICAgICAgICAgICAgICAgbXZfY2FjaGVbIDAgXVsxXT0gbXk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnA9ICh1aW50MzJfdCAqKSZoLT5tdl9jYWNoZVtsaXN0XVsgc2NhbjhbNCppXSBdWzBdOworICAgICAgICAgICAgICAgICAgICBwWzBdID0gcFsxXT0KKyAgICAgICAgICAgICAgICAgICAgcFs4XSA9IHBbOV09IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfWVsc2UgaWYoSVNfRElSRUNUKG1iX3R5cGUpKXsKKyAgICAgICAgZmZfaDI2NF9wcmVkX2RpcmVjdF9tb3Rpb24oaCwgJm1iX3R5cGUpOworICAgICAgICBkY3Q4eDhfYWxsb3dlZCAmPSBoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKKyAgICB9ZWxzZXsKKyAgICAgICAgaW50IGxpc3QsIG14LCBteSwgaTsKKyAgICAgICAgIC8vRklYTUUgd2Ugc2hvdWxkIHNldCByZWZfaWR4X2w/IHRvIDAgaWYgd2UgdXNlIHRoYXQgbGF0ZXIgLi4uCisgICAgICAgIGlmKElTXzE2WDE2KG1iX3R5cGUpKXsKKyAgICAgICAgICAgIGZvcihsaXN0PTA7IGxpc3Q8aC0+bGlzdF9jb3VudDsgbGlzdCsrKXsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgaWYoSVNfRElSKG1iX3R5cGUsIDAsIGxpc3QpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2FsX3JlZl9jb3VudFtsaXN0XT09MSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGxvY2FsX3JlZl9jb3VudFtsaXN0XT09Mil7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsPSBnZXRfYml0czEoJmgtPmdiKV4xOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsPSBnZXRfdWVfZ29sb21iXzMxKCZoLT5nYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA+PSBsb2NhbF9yZWZfY291bnRbbGlzdF0peworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJlZiAldSBvdmVyZmxvd1xuIiwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVtsaXN0XVsgc2NhbjhbMF0gXSwgNCwgNCwgOCwgdmFsLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKGxpc3Q9MDsgbGlzdDxoLT5saXN0X2NvdW50OyBsaXN0KyspeworICAgICAgICAgICAgICAgIGlmKElTX0RJUihtYl90eXBlLCAwLCBsaXN0KSl7CisgICAgICAgICAgICAgICAgICAgIHByZWRfbW90aW9uKGgsIDAsIDQsIGxpc3QsIGgtPnJlZl9jYWNoZVtsaXN0XVsgc2NhbjhbMF0gXSwgJm14LCAmbXkpOworICAgICAgICAgICAgICAgICAgICBteCArPSBnZXRfc2VfZ29sb21iKCZoLT5nYik7CisgICAgICAgICAgICAgICAgICAgIG15ICs9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgdHByaW50ZihoLT5hdmN0eCwgImZpbmFsIG12OiVkICVkXG4iLCBteCwgbXkpOworCisgICAgICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKGgtPm12X2NhY2hlW2xpc3RdWyBzY2FuOFswXSBdLCA0LCA0LCA4LCBwYWNrMTZ0bzMyKG14LG15KSwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoSVNfMTZYOChtYl90eXBlKSl7CisgICAgICAgICAgICBmb3IobGlzdD0wOyBsaXN0PGgtPmxpc3RfY291bnQ7IGxpc3QrKyl7CisgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8MjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihJU19ESVIobWJfdHlwZSwgaSwgbGlzdCkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2FsX3JlZl9jb3VudFtsaXN0XSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbD0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYobG9jYWxfcmVmX2NvdW50W2xpc3RdID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsPSBnZXRfYml0czEoJmgtPmdiKV4xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWw9IGdldF91ZV9nb2xvbWJfMzEoJmgtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA+PSBsb2NhbF9yZWZfY291bnRbbGlzdF0peworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZWYgJXUgb3ZlcmZsb3dcbiIsIHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbD0gTElTVF9OT1RfVVNFRCYweEZGOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVtsaXN0XVsgc2NhbjhbMF0gKyAxNippIF0sIDQsIDIsIDgsIHZhbCwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcihsaXN0PTA7IGxpc3Q8aC0+bGlzdF9jb3VudDsgbGlzdCsrKXsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDI7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgICAgICAgICAgICAgICAgIGlmKElTX0RJUihtYl90eXBlLCBpLCBsaXN0KSl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkXzE2eDhfbW90aW9uKGgsIDgqaSwgbGlzdCwgaC0+cmVmX2NhY2hlW2xpc3RdW3NjYW44WzBdICsgMTYqaV0sICZteCwgJm15KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG14ICs9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICs9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwcmludGYoaC0+YXZjdHgsICJmaW5hbCBtdjolZCAlZFxuIiwgbXgsIG15KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsPSBwYWNrMTZ0bzMyKG14LG15KTsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbD0wOworICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZShoLT5tdl9jYWNoZVtsaXN0XVsgc2NhbjhbMF0gKyAxNippIF0sIDQsIDIsIDgsIHZhbCwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGF2X2Fzc2VydDIoSVNfOFgxNihtYl90eXBlKSk7CisgICAgICAgICAgICBmb3IobGlzdD0wOyBsaXN0PGgtPmxpc3RfY291bnQ7IGxpc3QrKyl7CisgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8MjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihJU19ESVIobWJfdHlwZSwgaSwgbGlzdCkpeyAvL0ZJWE1FIG9wdGltaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9jYWxfcmVmX2NvdW50W2xpc3RdPT0xKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihsb2NhbF9yZWZfY291bnRbbGlzdF09PTIpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWw9IGdldF9iaXRzMSgmaC0+Z2IpXjE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbD0gZ2V0X3VlX2dvbG9tYl8zMSgmaC0+Z2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsID49IGxvY2FsX3JlZl9jb3VudFtsaXN0XSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJlZiAldSBvdmVyZmxvd1xuIiwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsPSBMSVNUX05PVF9VU0VEJjB4RkY7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+cmVmX2NhY2hlW2xpc3RdWyBzY2FuOFswXSArIDIqaSBdLCAyLCA0LCA4LCB2YWwsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IobGlzdD0wOyBsaXN0PGgtPmxpc3RfY291bnQ7IGxpc3QrKyl7CisgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsOworICAgICAgICAgICAgICAgICAgICBpZihJU19ESVIobWJfdHlwZSwgaSwgbGlzdCkpeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZF84eDE2X21vdGlvbihoLCBpKjQsIGxpc3QsIGgtPnJlZl9jYWNoZVtsaXN0XVsgc2NhbjhbMF0gKyAyKmkgXSwgJm14LCAmbXkpOworICAgICAgICAgICAgICAgICAgICAgICAgbXggKz0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICAgICAgICAgICAgICAgICAgbXkgKz0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICAgICAgICAgICAgICAgICAgdHByaW50ZihoLT5hdmN0eCwgImZpbmFsIG12OiVkICVkXG4iLCBteCwgbXkpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YWw9IHBhY2sxNnRvMzIobXgsbXkpOworICAgICAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsPTA7CisgICAgICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKGgtPm12X2NhY2hlW2xpc3RdWyBzY2FuOFswXSArIDIqaSBdLCAyLCA0LCA4LCB2YWwsIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKElTX0lOVEVSKG1iX3R5cGUpKQorICAgICAgICB3cml0ZV9iYWNrX21vdGlvbihoLCBtYl90eXBlKTsKKworICAgIGlmKCFJU19JTlRSQTE2eDE2KG1iX3R5cGUpKXsKKyAgICAgICAgY2JwPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7CisKKyAgICAgICAgaWYoZGVjb2RlX2Nocm9tYSl7CisgICAgICAgICAgICBpZihjYnAgPiA0Nyl7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjYnAgdG9vIGxhcmdlICgldSkgYXQgJWQgJWRcbiIsIGNicCwgaC0+bWJfeCwgaC0+bWJfeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoSVNfSU5UUkE0eDQobWJfdHlwZSkpIGNicD0gZ29sb21iX3RvX2ludHJhNHg0X2NicFtjYnBdOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgIGNicD0gZ29sb21iX3RvX2ludGVyX2NicCAgIFtjYnBdOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGlmKGNicCA+IDE1KXsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNicCB0b28gbGFyZ2UgKCV1KSBhdCAlZCAlZFxuIiwgY2JwLCBoLT5tYl94LCBoLT5tYl95KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihJU19JTlRSQTR4NChtYl90eXBlKSkgY2JwPSBnb2xvbWJfdG9faW50cmE0eDRfY2JwX2dyYXlbY2JwXTsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICBjYnA9IGdvbG9tYl90b19pbnRlcl9jYnBfZ3JheVtjYnBdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFkZWNvZGVfY2hyb21hICYmIGNicD4xNSkgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJncmF5IGNocm9tYVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGRjdDh4OF9hbGxvd2VkICYmIChjYnAmMTUpICYmICFJU19JTlRSQShtYl90eXBlKSl7CisgICAgICAgIG1iX3R5cGUgfD0gTUJfVFlQRV84eDhEQ1QqZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgfQorICAgIGgtPmNicD0KKyAgICBoLT5jYnBfdGFibGVbbWJfeHldPSBjYnA7CisgICAgaC0+Y3VyX3BpYy5tYl90eXBlW21iX3h5XSA9IG1iX3R5cGU7CisKKyAgICBpZihjYnAgfHwgSVNfSU5UUkExNngxNihtYl90eXBlKSl7CisgICAgICAgIGludCBpNHg0LCBpOHg4LCBjaHJvbWFfaWR4OworICAgICAgICBpbnQgZHF1YW50OworICAgICAgICBpbnQgcmV0OworICAgICAgICBHZXRCaXRDb250ZXh0ICpnYj0gSVNfSU5UUkEobWJfdHlwZSkgPyBoLT5pbnRyYV9nYl9wdHIgOiBoLT5pbnRlcl9nYl9wdHI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW4sICpzY2FuOHg4OworICAgICAgICBjb25zdCBpbnQgbWF4X3FwID0gNTEgKyA2KihoLT5zcHMuYml0X2RlcHRoX2x1bWEtOCk7CisKKyAgICAgICAgaWYoSVNfSU5URVJMQUNFRChtYl90eXBlKSl7CisgICAgICAgICAgICBzY2FuOHg4PSBoLT5xc2NhbGUgPyBoLT5maWVsZF9zY2FuOHg4X2NhdmxjIDogaC0+ZmllbGRfc2Nhbjh4OF9jYXZsY19xMDsKKyAgICAgICAgICAgIHNjYW49IGgtPnFzY2FsZSA/IGgtPmZpZWxkX3NjYW4gOiBoLT5maWVsZF9zY2FuX3EwOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHNjYW44eDg9IGgtPnFzY2FsZSA/IGgtPnppZ3phZ19zY2FuOHg4X2NhdmxjIDogaC0+emlnemFnX3NjYW44eDhfY2F2bGNfcTA7CisgICAgICAgICAgICBzY2FuPSBoLT5xc2NhbGUgPyBoLT56aWd6YWdfc2NhbiA6IGgtPnppZ3phZ19zY2FuX3EwOworICAgICAgICB9CisKKyAgICAgICAgZHF1YW50PSBnZXRfc2VfZ29sb21iKCZoLT5nYik7CisKKyAgICAgICAgaC0+cXNjYWxlICs9IGRxdWFudDsKKworICAgICAgICBpZigoKHVuc2lnbmVkKWgtPnFzY2FsZSkgPiBtYXhfcXApeworICAgICAgICAgICAgaWYoaC0+cXNjYWxlPDApIGgtPnFzY2FsZSs9IG1heF9xcCsxOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIGgtPnFzY2FsZS09IG1heF9xcCsxOworICAgICAgICAgICAgaWYoKCh1bnNpZ25lZCloLT5xc2NhbGUpID4gbWF4X3FwKXsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRxdWFudCBvdXQgb2YgcmFuZ2UgKCVkKSBhdCAlZCAlZFxuIiwgZHF1YW50LCBoLT5tYl94LCBoLT5tYl95KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBoLT5jaHJvbWFfcXBbMF09IGdldF9jaHJvbWFfcXAoaCwgMCwgaC0+cXNjYWxlKTsKKyAgICAgICAgaC0+Y2hyb21hX3FwWzFdPSBnZXRfY2hyb21hX3FwKGgsIDEsIGgtPnFzY2FsZSk7CisKKyAgICAgICAgaWYoIChyZXQgPSBkZWNvZGVfbHVtYV9yZXNpZHVhbChoLCBnYiwgc2Nhbiwgc2Nhbjh4OCwgcGl4ZWxfc2hpZnQsIG1iX3R5cGUsIGNicCwgMCkpIDwgMCApeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGgtPmNicF90YWJsZVttYl94eV0gfD0gcmV0IDw8IDEyOworICAgICAgICBpZiAoQ0hST01BNDQ0KGgpKSB7CisgICAgICAgICAgICBpZiggZGVjb2RlX2x1bWFfcmVzaWR1YWwoaCwgZ2IsIHNjYW4sIHNjYW44eDgsIHBpeGVsX3NoaWZ0LCBtYl90eXBlLCBjYnAsIDEpIDwgMCApeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBkZWNvZGVfbHVtYV9yZXNpZHVhbChoLCBnYiwgc2Nhbiwgc2Nhbjh4OCwgcGl4ZWxfc2hpZnQsIG1iX3R5cGUsIGNicCwgMikgPCAwICl7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgaW50IG51bV9jOHg4ID0gaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjOworCisgICAgICAgICAgICBpZihjYnAmMHgzMCl7CisgICAgICAgICAgICAgICAgZm9yKGNocm9tYV9pZHg9MDsgY2hyb21hX2lkeDwyOyBjaHJvbWFfaWR4KyspCisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVfcmVzaWR1YWwoaCwgZ2IsIGgtPm1iICsgKCgyNTYgKyAxNioxNipjaHJvbWFfaWR4KSA8PCBwaXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hST01BX0RDX0JMT0NLX0lOREVYK2Nocm9tYV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hST01BNDIyKGgpID8gY2hyb21hNDIyX2RjX3NjYW4gOiBjaHJvbWFfZGNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCA0Km51bV9jOHg4KSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihjYnAmMHgyMCl7CisgICAgICAgICAgICAgICAgZm9yKGNocm9tYV9pZHg9MDsgY2hyb21hX2lkeDwyOyBjaHJvbWFfaWR4KyspeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqcW11bCA9IGgtPmRlcXVhbnQ0X2NvZWZmW2Nocm9tYV9pZHgrMSsoSVNfSU5UUkEoIG1iX3R5cGUgKSA/IDA6MyldW2gtPmNocm9tYV9xcFtjaHJvbWFfaWR4XV07CisgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKm1iID0gaC0+bWIgKyAoMTYqKDE2ICsgMTYqY2hyb21hX2lkeCkgPDwgcGl4ZWxfc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk4eDggPSAwOyBpOHg4PG51bV9jOHg4OyBpOHg4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTR4NCA9IDA7IGk0eDQgPCA0OyBpNHg0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXggPSAxNiArIDE2KmNocm9tYV9pZHggKyA4Kmk4eDggKyBpNHg0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVfcmVzaWR1YWwoaCwgZ2IsIG1iLCBpbmRleCwgc2NhbiArIDEsIHFtdWwsIDE1KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYiArPSAxNiA8PCBwaXhlbF9zaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFsxNl1dLCA0LCA0LCA4LCAwLCAxKTsKKyAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbMzJdXSwgNCwgNCwgOCwgMCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44WyAwXV0sIDQsIDQsIDgsIDAsIDEpOworICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbMTZdXSwgNCwgNCwgOCwgMCwgMSk7CisgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFszMl1dLCA0LCA0LCA4LCAwLCAxKTsKKyAgICB9CisgICAgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHldID0gaC0+cXNjYWxlOworICAgIHdyaXRlX2JhY2tfbm9uX3plcm9fY291bnQoaCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfZGlyZWN0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X2RpcmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODlmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X2RpcmVjdC5jCkBAIC0wLDAgKzEsNjk5IEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZGlyZWN0IG1iL2Jsb2NrIGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgZGlyZWN0IG1iL2Jsb2NrIGRlY29kaW5nLgorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSAicmVjdGFuZ2xlLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworc3RhdGljIGludCBnZXRfc2NhbGVfZmFjdG9yKEgyNjRDb250ZXh0ICpjb25zdCBoLCBpbnQgcG9jLCBpbnQgcG9jMSwgaW50IGkpCit7CisgICAgaW50IHBvYzAgPSBoLT5yZWZfbGlzdFswXVtpXS5wb2M7CisgICAgaW50IHRkID0gYXZfY2xpcChwb2MxIC0gcG9jMCwgLTEyOCwgMTI3KTsKKyAgICBpZiAodGQgPT0gMCB8fCBoLT5yZWZfbGlzdFswXVtpXS5sb25nX3JlZikgeworICAgICAgICByZXR1cm4gMjU2OworICAgIH0gZWxzZSB7CisgICAgICAgIGludCB0YiA9IGF2X2NsaXAocG9jIC0gcG9jMCwgLTEyOCwgMTI3KTsKKyAgICAgICAgaW50IHR4ID0gKDE2Mzg0ICsgKEZGQUJTKHRkKSA+PiAxKSkgLyB0ZDsKKyAgICAgICAgcmV0dXJuIGF2X2NsaXAoKHRiICogdHggKyAzMikgPj4gNiwgLTEwMjQsIDEwMjMpOworICAgIH0KK30KKwordm9pZCBmZl9oMjY0X2RpcmVjdF9kaXN0X3NjYWxlX2ZhY3RvcihIMjY0Q29udGV4dCAqY29uc3QgaCkKK3sKKyAgICBjb25zdCBpbnQgcG9jICA9IEZJRUxEX1BJQ1RVUkUoaCkgPyBoLT5jdXJfcGljX3B0ci0+ZmllbGRfcG9jW2gtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGgtPmN1cl9waWNfcHRyLT5wb2M7CisgICAgY29uc3QgaW50IHBvYzEgPSBoLT5yZWZfbGlzdFsxXVswXS5wb2M7CisgICAgaW50IGksIGZpZWxkOworCisgICAgaWYgKEZSQU1FX01CQUZGKGgpKQorICAgICAgICBmb3IgKGZpZWxkID0gMDsgZmllbGQgPCAyOyBmaWVsZCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgcG9jICA9IGgtPmN1cl9waWNfcHRyLT5maWVsZF9wb2NbZmllbGRdOworICAgICAgICAgICAgY29uc3QgaW50IHBvYzEgPSBoLT5yZWZfbGlzdFsxXVswXS5maWVsZF9wb2NbZmllbGRdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgKiBoLT5yZWZfY291bnRbMF07IGkrKykKKyAgICAgICAgICAgICAgICBoLT5kaXN0X3NjYWxlX2ZhY3Rvcl9maWVsZFtmaWVsZF1baSBeIGZpZWxkXSA9CisgICAgICAgICAgICAgICAgICAgIGdldF9zY2FsZV9mYWN0b3IoaCwgcG9jLCBwb2MxLCBpICsgMTYpOworICAgICAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaC0+cmVmX2NvdW50WzBdOyBpKyspCisgICAgICAgIGgtPmRpc3Rfc2NhbGVfZmFjdG9yW2ldID0gZ2V0X3NjYWxlX2ZhY3RvcihoLCBwb2MsIHBvYzEsIGkpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2NvbG1hcChIMjY0Q29udGV4dCAqaCwgaW50IG1hcFsyXVsxNiArIDMyXSwgaW50IGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGQsIGludCBjb2xmaWVsZCwgaW50IG1iYWZpKQoreworICAgIEgyNjRQaWN0dXJlICpjb25zdCByZWYxID0gJmgtPnJlZl9saXN0WzFdWzBdOworICAgIGludCBqLCBvbGRfcmVmLCByZmllbGQ7CisgICAgaW50IHN0YXJ0ICA9IG1iYWZpID8gMTYgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICBpbnQgZW5kICAgID0gbWJhZmkgPyAxNiArIDIgKiBoLT5yZWZfY291bnRbMF0gOiBoLT5yZWZfY291bnRbMF07CisgICAgaW50IGludGVybCA9IG1iYWZpIHx8IGgtPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUU7CisKKyAgICAvKiBib2d1czsgZmlsbHMgaW4gZm9yIG1pc3NpbmcgZnJhbWVzICovCisgICAgbWVtc2V0KG1hcFtsaXN0XSwgMCwgc2l6ZW9mKG1hcFtsaXN0XSkpOworCisgICAgZm9yIChyZmllbGQgPSAwOyByZmllbGQgPCAyOyByZmllbGQrKykgeworICAgICAgICBmb3IgKG9sZF9yZWYgPSAwOyBvbGRfcmVmIDwgcmVmMS0+cmVmX2NvdW50W2NvbGZpZWxkXVtsaXN0XTsgb2xkX3JlZisrKSB7CisgICAgICAgICAgICBpbnQgcG9jID0gcmVmMS0+cmVmX3BvY1tjb2xmaWVsZF1bbGlzdF1bb2xkX3JlZl07CisKKyAgICAgICAgICAgIGlmICghaW50ZXJsKQorICAgICAgICAgICAgICAgIHBvYyB8PSAzOworICAgICAgICAgICAgLy8gRklYTUU6IHN0b3JlIGFsbCBNQkFGRiByZWZlcmVuY2VzIHNvIHRoaXMgaXMgbm90IG5lZWRlZAorICAgICAgICAgICAgZWxzZSBpZiAoaW50ZXJsICYmIChwb2MgJiAzKSA9PSAzKQorICAgICAgICAgICAgICAgIHBvYyA9IChwb2MgJiB+MykgKyByZmllbGQgKyAxOworCisgICAgICAgICAgICBmb3IgKGogPSBzdGFydDsgaiA8IGVuZDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKDQgKiBoLT5yZWZfbGlzdFswXVtqXS5mcmFtZV9udW0gKworICAgICAgICAgICAgICAgICAgICAoaC0+cmVmX2xpc3RbMF1bal0ucmVmZXJlbmNlICYgMykgPT0gcG9jKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjdXJfcmVmID0gbWJhZmkgPyAoaiAtIDE2KSBeIGZpZWxkIDogajsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZjEtPm1iYWZmKQorICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2xpc3RdWzIgKiBvbGRfcmVmICsgKHJmaWVsZCBeIGZpZWxkKSArIDE2XSA9IGN1cl9yZWY7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZmllbGQgPT0gZmllbGQgfHwgIWludGVybCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtsaXN0XVtvbGRfcmVmXSA9IGN1cl9yZWY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl9oMjY0X2RpcmVjdF9yZWZfbGlzdF9pbml0KEgyNjRDb250ZXh0ICpjb25zdCBoKQoreworICAgIEgyNjRQaWN0dXJlICpjb25zdCByZWYxID0gJmgtPnJlZl9saXN0WzFdWzBdOworICAgIEgyNjRQaWN0dXJlICpjb25zdCBjdXIgPSBoLT5jdXJfcGljX3B0cjsKKyAgICBpbnQgbGlzdCwgaiwgZmllbGQ7CisgICAgaW50IHNpZHggICAgID0gKGgtPnBpY3R1cmVfc3RydWN0dXJlICYgMSkgXiAxOworICAgIGludCByZWYxc2lkeCA9IChyZWYxLT5yZWZlcmVuY2UgICAgICAmIDEpIF4gMTsKKworICAgIGZvciAobGlzdCA9IDA7IGxpc3QgPCAyOyBsaXN0KyspIHsKKyAgICAgICAgY3VyLT5yZWZfY291bnRbc2lkeF1bbGlzdF0gPSBoLT5yZWZfY291bnRbbGlzdF07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBoLT5yZWZfY291bnRbbGlzdF07IGorKykKKyAgICAgICAgICAgIGN1ci0+cmVmX3BvY1tzaWR4XVtsaXN0XVtqXSA9IDQgKiBoLT5yZWZfbGlzdFtsaXN0XVtqXS5mcmFtZV9udW0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnJlZl9saXN0W2xpc3RdW2pdLnJlZmVyZW5jZSAmIDMpOworICAgIH0KKworICAgIGlmIChoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKSB7CisgICAgICAgIG1lbWNweShjdXItPnJlZl9jb3VudFsxXSwgY3VyLT5yZWZfY291bnRbMF0sIHNpemVvZihjdXItPnJlZl9jb3VudFswXSkpOworICAgICAgICBtZW1jcHkoY3VyLT5yZWZfcG9jWzFdLCAgIGN1ci0+cmVmX3BvY1swXSwgICBzaXplb2YoY3VyLT5yZWZfcG9jWzBdKSk7CisgICAgfQorCisgICAgY3VyLT5tYmFmZiA9IEZSQU1FX01CQUZGKGgpOworCisgICAgaC0+Y29sX2ZpZWxkb2ZmID0gMDsKKyAgICBpZiAoaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkgeworICAgICAgICBpbnQgY3VyX3BvYyAgPSBoLT5jdXJfcGljX3B0ci0+cG9jOworICAgICAgICBpbnQgKmNvbF9wb2MgPSBoLT5yZWZfbGlzdFsxXS0+ZmllbGRfcG9jOworICAgICAgICBoLT5jb2xfcGFyaXR5ID0gKEZGQUJTKGNvbF9wb2NbMF0gLSBjdXJfcG9jKSA+PQorICAgICAgICAgICAgICAgICAgICAgICAgIEZGQUJTKGNvbF9wb2NbMV0gLSBjdXJfcG9jKSk7CisgICAgICAgIHJlZjFzaWR4ID0KKyAgICAgICAgc2lkeCAgICAgPSBoLT5jb2xfcGFyaXR5OworICAgIC8vIEZMIC0+IEZMICYgZGlmZmVyIHBhcml0eQorICAgIH0gZWxzZSBpZiAoIShoLT5waWN0dXJlX3N0cnVjdHVyZSAmIGgtPnJlZl9saXN0WzFdWzBdLnJlZmVyZW5jZSkgJiYKKyAgICAgICAgICAgICAgICFoLT5yZWZfbGlzdFsxXVswXS5tYmFmZikgeworICAgICAgICBoLT5jb2xfZmllbGRvZmYgPSAyICogaC0+cmVmX2xpc3RbMV1bMF0ucmVmZXJlbmNlIC0gMzsKKyAgICB9CisKKyAgICBpZiAoaC0+c2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0IgfHwgaC0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChsaXN0ID0gMDsgbGlzdCA8IDI7IGxpc3QrKykgeworICAgICAgICBmaWxsX2NvbG1hcChoLCBoLT5tYXBfY29sX3RvX2xpc3QwLCBsaXN0LCBzaWR4LCByZWYxc2lkeCwgMCk7CisgICAgICAgIGlmIChGUkFNRV9NQkFGRihoKSkKKyAgICAgICAgICAgIGZvciAoZmllbGQgPSAwOyBmaWVsZCA8IDI7IGZpZWxkKyspCisgICAgICAgICAgICAgICAgZmlsbF9jb2xtYXAoaCwgaC0+bWFwX2NvbF90b19saXN0MF9maWVsZFtmaWVsZF0sIGxpc3QsIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLCAxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGF3YWl0X3JlZmVyZW5jZV9tYl9yb3coSDI2NENvbnRleHQgKmNvbnN0IGgsIEgyNjRQaWN0dXJlICpyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl95KQoreworICAgIGludCByZWZfZmllbGQgICAgICAgICA9IHJlZi0+cmVmZXJlbmNlIC0gMTsKKyAgICBpbnQgcmVmX2ZpZWxkX3BpY3R1cmUgPSByZWYtPmZpZWxkX3BpY3R1cmU7CisgICAgaW50IHJlZl9oZWlnaHQgICAgICAgID0gMTYgKiBoLT5tYl9oZWlnaHQgPj4gcmVmX2ZpZWxkX3BpY3R1cmU7CisKKyAgICBpZiAoIUhBVkVfVEhSRUFEUyB8fCAhKGgtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBGSVhNRTogSXQgY2FuIGJlIHNhZmUgdG8gYWNjZXNzIG1iIHN0dWZmCisgICAgICogZXZlbiBpZiBwaXhlbHMgYXJlbid0IGRlYmxvY2tlZCB5ZXQuICovCisKKyAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnJlZi0+dGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKDE2ICogbWJfeSA+PiByZWZfZmllbGRfcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX2hlaWdodCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfZmllbGRfcGljdHVyZSAmJiByZWZfZmllbGQpOworfQorCitzdGF0aWMgdm9pZCBwcmVkX3NwYXRpYWxfZGlyZWN0X21vdGlvbihIMjY0Q29udGV4dCAqY29uc3QgaCwgaW50ICptYl90eXBlKQoreworICAgIGludCBiOF9zdHJpZGUgPSAyOworICAgIGludCBiNF9zdHJpZGUgPSBoLT5iX3N0cmlkZTsKKyAgICBpbnQgbWJfeHkgPSBoLT5tYl94eSwgbWJfeSA9IGgtPm1iX3k7CisgICAgaW50IG1iX3R5cGVfY29sWzJdOworICAgIGNvbnN0IGludDE2X3QgKCpsMW12MClbMl0sICgqbDFtdjEpWzJdOworICAgIGNvbnN0IGludDhfdCAqbDFyZWYwLCAqbDFyZWYxOworICAgIGNvbnN0IGludCBpc19iOHg4ID0gSVNfOFg4KCptYl90eXBlKTsKKyAgICB1bnNpZ25lZCBpbnQgc3ViX21iX3R5cGUgPSBNQl9UWVBFX0wwTDE7CisgICAgaW50IGk4LCBpNDsKKyAgICBpbnQgcmVmWzJdOworICAgIGludCBtdlsyXTsKKyAgICBpbnQgbGlzdDsKKworICAgIGFzc2VydChoLT5yZWZfbGlzdFsxXVswXS5yZWZlcmVuY2UgJiAzKTsKKworICAgIGF3YWl0X3JlZmVyZW5jZV9tYl9yb3coaCwgJmgtPnJlZl9saXN0WzFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWJfeSArICEhSVNfSU5URVJMQUNFRCgqbWJfdHlwZSkpOworCisjZGVmaW5lIE1CX1RZUEVfMTZ4MTZfT1JfSU5UUkEgKE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0lOVFJBNHg0IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX0lOVFJBMTZ4MTYgfCBNQl9UWVBFX0lOVFJBX1BDTSkKKworICAgIC8qIHJlZiA9IG1pbihuZWlnaGJvcnMpICovCisgICAgZm9yIChsaXN0ID0gMDsgbGlzdCA8IDI7IGxpc3QrKykgeworICAgICAgICBpbnQgbGVmdF9yZWYgICAgID0gaC0+cmVmX2NhY2hlW2xpc3RdW3NjYW44WzBdIC0gMV07CisgICAgICAgIGludCB0b3BfcmVmICAgICAgPSBoLT5yZWZfY2FjaGVbbGlzdF1bc2NhbjhbMF0gLSA4XTsKKyAgICAgICAgaW50IHJlZmMgICAgICAgICA9IGgtPnJlZl9jYWNoZVtsaXN0XVtzY2FuOFswXSAtIDggKyA0XTsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqQyA9IGgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzBdICAtIDggKyA0XTsKKyAgICAgICAgaWYgKHJlZmMgPT0gUEFSVF9OT1RfQVZBSUxBQkxFKSB7CisgICAgICAgICAgICByZWZjID0gaC0+cmVmX2NhY2hlW2xpc3RdW3NjYW44WzBdIC0gOCAtIDFdOworICAgICAgICAgICAgQyAgICA9IGgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzBdICAtIDggLSAxXTsKKyAgICAgICAgfQorICAgICAgICByZWZbbGlzdF0gPSBGRk1JTjMoKHVuc2lnbmVkKWxlZnRfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXRvcF9yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcmVmYyk7CisgICAgICAgIGlmIChyZWZbbGlzdF0gPj0gMCkgeworICAgICAgICAgICAgLyogVGhpcyBpcyBqdXN0IHByZWRfbW90aW9uKCkgYnV0IHdpdGggdGhlIGNhc2VzIHJlbW92ZWQgdGhhdAorICAgICAgICAgICAgICogY2Fubm90IGhhcHBlbiBmb3IgZGlyZWN0IGJsb2Nrcy4gKi8KKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNvbnN0IEEgPSBoLT5tdl9jYWNoZVtsaXN0XVtzY2FuOFswXSAtIDFdOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY29uc3QgQiA9IGgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzBdIC0gOF07CisKKyAgICAgICAgICAgIGludCBtYXRjaF9jb3VudCA9IChsZWZ0X3JlZiA9PSByZWZbbGlzdF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b3BfcmVmICA9PSByZWZbbGlzdF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWZjICAgICA9PSByZWZbbGlzdF0pOworCisgICAgICAgICAgICBpZiAobWF0Y2hfY291bnQgPiAxKSB7IC8vIG1vc3QgY29tbW9uCisgICAgICAgICAgICAgICAgbXZbbGlzdF0gPSBwYWNrMTZ0bzMyKG1pZF9wcmVkKEFbMF0sIEJbMF0sIENbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWRfcHJlZChBWzFdLCBCWzFdLCBDWzFdKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydChtYXRjaF9jb3VudCA9PSAxKTsKKyAgICAgICAgICAgICAgICBpZiAobGVmdF9yZWYgPT0gcmVmW2xpc3RdKQorICAgICAgICAgICAgICAgICAgICBtdltsaXN0XSA9IEFWX1JOMzJBKEEpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRvcF9yZWYgPT0gcmVmW2xpc3RdKQorICAgICAgICAgICAgICAgICAgICBtdltsaXN0XSA9IEFWX1JOMzJBKEIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbXZbbGlzdF0gPSBBVl9STjMyQShDKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2Fzc2VydDIocmVmW2xpc3RdIDwgKGgtPnJlZl9jb3VudFtsaXN0XSA8PCAhIUZSQU1FX01CQUZGKGgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgbWFzayA9IH4oTUJfVFlQRV9MMCA8PCAoMiAqIGxpc3QpKTsKKyAgICAgICAgICAgIG12W2xpc3RdICA9IDA7CisgICAgICAgICAgICByZWZbbGlzdF0gPSAtMTsKKyAgICAgICAgICAgIGlmICghaXNfYjh4OCkKKyAgICAgICAgICAgICAgICAqbWJfdHlwZSAmPSBtYXNrOworICAgICAgICAgICAgc3ViX21iX3R5cGUgJj0gbWFzazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmVmWzBdIDwgMCAmJiByZWZbMV0gPCAwKSB7CisgICAgICAgIHJlZlswXSA9IHJlZlsxXSA9IDA7CisgICAgICAgIGlmICghaXNfYjh4OCkKKyAgICAgICAgICAgICptYl90eXBlIHw9IE1CX1RZUEVfTDBMMTsKKyAgICAgICAgc3ViX21iX3R5cGUgfD0gTUJfVFlQRV9MMEwxOworICAgIH0KKworICAgIGlmICghKGlzX2I4eDggfCBtdlswXSB8IG12WzFdKSkgeworICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+cmVmX2NhY2hlWzBdW3NjYW44WzBdXSwgNCwgNCwgOCwgKHVpbnQ4X3QpcmVmWzBdLCAxKTsKKyAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVsxXVtzY2FuOFswXV0sIDQsIDQsIDgsICh1aW50OF90KXJlZlsxXSwgMSk7CisgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5tdl9jYWNoZVswXVtzY2FuOFswXV0sIDQsIDQsIDgsIDAsIDQpOworICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bXZfY2FjaGVbMV1bc2NhbjhbMF1dLCA0LCA0LCA4LCAwLCA0KTsKKyAgICAgICAgKm1iX3R5cGUgPSAoKm1iX3R5cGUgJiB+KE1CX1RZUEVfOHg4IHwgTUJfVFlQRV8xNng4IHwgTUJfVFlQRV84eDE2IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfUDFMMCB8IE1CX1RZUEVfUDFMMSkpIHwKKyAgICAgICAgICAgICAgICAgICBNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV9ESVJFQ1QyOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKElTX0lOVEVSTEFDRUQoaC0+cmVmX2xpc3RbMV1bMF0ubWJfdHlwZVttYl94eV0pKSB7IC8vIEFGTC9BRlIvRlIvRkwgLT4gQUZML0ZMCisgICAgICAgIGlmICghSVNfSU5URVJMQUNFRCgqbWJfdHlwZSkpIHsgICAgICAgICAgICAgICAgICAgIC8vICAgICBBRlIvRlIgICAgLT4gQUZML0ZMCisgICAgICAgICAgICBtYl95ICA9IChoLT5tYl95ICYgfjEpICsgaC0+Y29sX3Bhcml0eTsKKyAgICAgICAgICAgIG1iX3h5ID0gaC0+bWJfeCArCisgICAgICAgICAgICAgICAgICAgICgoaC0+bWJfeSAmIH4xKSArIGgtPmNvbF9wYXJpdHkpICogaC0+bWJfc3RyaWRlOworICAgICAgICAgICAgYjhfc3RyaWRlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1iX3kgICs9IGgtPmNvbF9maWVsZG9mZjsKKyAgICAgICAgICAgIG1iX3h5ICs9IGgtPm1iX3N0cmlkZSAqIGgtPmNvbF9maWVsZG9mZjsgLy8gbm9uLXplcm8gZm9yIEZMIC0+IEZMICYgZGlmZmVyIHBhcml0eQorICAgICAgICB9CisgICAgICAgIGdvdG8gc2luZ2xlX2NvbDsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFGTC9BRlIvRlIvRkwgLT4gQUZSL0ZSCisgICAgICAgIGlmIChJU19JTlRFUkxBQ0VEKCptYl90eXBlKSkgeyAgICAgICAgICAgICAgICAgICAvLyBBRkwgICAgICAgL0ZMIC0+IEFGUi9GUgorICAgICAgICAgICAgbWJfeSAgICAgICAgICAgPSAgaC0+bWJfeSAmIH4xOworICAgICAgICAgICAgbWJfeHkgICAgICAgICAgPSAoaC0+bWJfeSAmIH4xKSAqIGgtPm1iX3N0cmlkZSArIGgtPm1iX3g7CisgICAgICAgICAgICBtYl90eXBlX2NvbFswXSA9IGgtPnJlZl9saXN0WzFdWzBdLm1iX3R5cGVbbWJfeHldOworICAgICAgICAgICAgbWJfdHlwZV9jb2xbMV0gPSBoLT5yZWZfbGlzdFsxXVswXS5tYl90eXBlW21iX3h5ICsgaC0+bWJfc3RyaWRlXTsKKyAgICAgICAgICAgIGI4X3N0cmlkZSAgICAgID0gMiArIDQgKiBoLT5tYl9zdHJpZGU7CisgICAgICAgICAgICBiNF9zdHJpZGUgICAgICo9IDY7CisgICAgICAgICAgICBpZiAoSVNfSU5URVJMQUNFRChtYl90eXBlX2NvbFswXSkgIT0KKyAgICAgICAgICAgICAgICBJU19JTlRFUkxBQ0VEKG1iX3R5cGVfY29sWzFdKSkgeworICAgICAgICAgICAgICAgIG1iX3R5cGVfY29sWzBdICY9IH5NQl9UWVBFX0lOVEVSTEFDRUQ7CisgICAgICAgICAgICAgICAgbWJfdHlwZV9jb2xbMV0gJj0gfk1CX1RZUEVfSU5URVJMQUNFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3ViX21iX3R5cGUgfD0gTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfRElSRUNUMjsgLyogQl9TVUJfOHg4ICovCisgICAgICAgICAgICBpZiAoKG1iX3R5cGVfY29sWzBdICYgTUJfVFlQRV8xNngxNl9PUl9JTlRSQSkgJiYKKyAgICAgICAgICAgICAgICAobWJfdHlwZV9jb2xbMV0gJiBNQl9UWVBFXzE2eDE2X09SX0lOVFJBKSAmJgorICAgICAgICAgICAgICAgICFpc19iOHg4KSB7CisgICAgICAgICAgICAgICAgKm1iX3R5cGUgfD0gTUJfVFlQRV8xNng4IHwgTUJfVFlQRV9ESVJFQ1QyOyAgLyogQl8xNng4ICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICptYl90eXBlIHw9IE1CX1RZUEVfOHg4OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEFGUi9GUiAgICAtPiBBRlIvRlIKK3NpbmdsZV9jb2w6CisgICAgICAgICAgICBtYl90eXBlX2NvbFswXSA9CisgICAgICAgICAgICBtYl90eXBlX2NvbFsxXSA9IGgtPnJlZl9saXN0WzFdWzBdLm1iX3R5cGVbbWJfeHldOworCisgICAgICAgICAgICBzdWJfbWJfdHlwZSB8PSBNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV9ESVJFQ1QyOyAvKiBCX1NVQl84eDggKi8KKyAgICAgICAgICAgIGlmICghaXNfYjh4OCAmJiAobWJfdHlwZV9jb2xbMF0gJiBNQl9UWVBFXzE2eDE2X09SX0lOVFJBKSkgeworICAgICAgICAgICAgICAgICptYl90eXBlIHw9IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0RJUkVDVDI7IC8qIEJfMTZ4MTYgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzX2I4eDggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKG1iX3R5cGVfY29sWzBdICYgKE1CX1RZUEVfMTZ4OCB8IE1CX1RZUEVfOHgxNikpKSB7CisgICAgICAgICAgICAgICAgKm1iX3R5cGUgfD0gTUJfVFlQRV9ESVJFQ1QyIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWJfdHlwZV9jb2xbMF0gJiAoTUJfVFlQRV8xNng4IHwgTUJfVFlQRV84eDE2KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghaC0+c3BzLmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IFNhdmUgc3ViIG1iIHR5cGVzIGZyb20gcHJldmlvdXMgZnJhbWVzIChvciBkZXJpdmUKKyAgICAgICAgICAgICAgICAgICAgICogZnJvbSBNVnMpIHNvIHdlIGtub3cgZXhhY3RseSB3aGF0IGJsb2NrIHNpemUgdG8gdXNlLiAqLworICAgICAgICAgICAgICAgICAgICBzdWJfbWJfdHlwZSArPSAoTUJfVFlQRV84eDggLSBNQl9UWVBFXzE2eDE2KTsgLyogQl9TVUJfNHg0ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICptYl90eXBlIHw9IE1CX1RZUEVfOHg4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXdhaXRfcmVmZXJlbmNlX21iX3JvdyhoLCAmaC0+cmVmX2xpc3RbMV1bMF0sIG1iX3kpOworCisgICAgbDFtdjAgID0gKHZvaWQqKSZoLT5yZWZfbGlzdFsxXVswXS5tb3Rpb25fdmFsWzBdW2gtPm1iMmJfeHlbbWJfeHldXTsKKyAgICBsMW12MSAgPSAodm9pZCopJmgtPnJlZl9saXN0WzFdWzBdLm1vdGlvbl92YWxbMV1baC0+bWIyYl94eVttYl94eV1dOworICAgIGwxcmVmMCA9ICZoLT5yZWZfbGlzdFsxXVswXS5yZWZfaW5kZXhbMF1bNCAqIG1iX3h5XTsKKyAgICBsMXJlZjEgPSAmaC0+cmVmX2xpc3RbMV1bMF0ucmVmX2luZGV4WzFdWzQgKiBtYl94eV07CisgICAgaWYgKCFiOF9zdHJpZGUpIHsKKyAgICAgICAgaWYgKGgtPm1iX3kgJiAxKSB7CisgICAgICAgICAgICBsMXJlZjAgKz0gMjsKKyAgICAgICAgICAgIGwxcmVmMSArPSAyOworICAgICAgICAgICAgbDFtdjAgICs9IDIgKiBiNF9zdHJpZGU7CisgICAgICAgICAgICBsMW12MSAgKz0gMiAqIGI0X3N0cmlkZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChJU19JTlRFUkxBQ0VEKCptYl90eXBlKSAhPSBJU19JTlRFUkxBQ0VEKG1iX3R5cGVfY29sWzBdKSkgeworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIGZvciAoaTggPSAwOyBpOCA8IDQ7IGk4KyspIHsKKyAgICAgICAgICAgIGludCB4OCAgPSBpOCAmIDE7CisgICAgICAgICAgICBpbnQgeTggID0gaTggPj4gMTsKKyAgICAgICAgICAgIGludCB4eTggPSB4OCAgICAgKyB5OCAqIGI4X3N0cmlkZTsKKyAgICAgICAgICAgIGludCB4eTQgPSB4OCAqIDMgKyB5OCAqIGI0X3N0cmlkZTsKKyAgICAgICAgICAgIGludCBhLCBiOworCisgICAgICAgICAgICBpZiAoaXNfYjh4OCAmJiAhSVNfRElSRUNUKGgtPnN1Yl9tYl90eXBlW2k4XSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBoLT5zdWJfbWJfdHlwZVtpOF0gPSBzdWJfbWJfdHlwZTsKKworICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVswXVtzY2FuOFtpOCAqIDRdXSwgMiwgMiwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KXJlZlswXSwgMSk7CisgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+cmVmX2NhY2hlWzFdW3NjYW44W2k4ICogNF1dLCAyLCAyLCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpcmVmWzFdLCAxKTsKKyAgICAgICAgICAgIGlmICghSVNfSU5UUkEobWJfdHlwZV9jb2xbeThdKSAmJiAhaC0+cmVmX2xpc3RbMV1bMF0ubG9uZ19yZWYgJiYKKyAgICAgICAgICAgICAgICAoKGwxcmVmMFt4eThdID09IDAgJiYKKyAgICAgICAgICAgICAgICAgIEZGQUJTKGwxbXYwW3h5NF1bMF0pIDw9IDEgJiYKKyAgICAgICAgICAgICAgICAgIEZGQUJTKGwxbXYwW3h5NF1bMV0pIDw9IDEpIHx8CisgICAgICAgICAgICAgICAgIChsMXJlZjBbeHk4XSA8IDAgJiYKKyAgICAgICAgICAgICAgICAgIGwxcmVmMVt4eThdID09IDAgJiYKKyAgICAgICAgICAgICAgICAgIEZGQUJTKGwxbXYxW3h5NF1bMF0pIDw9IDEgJiYKKyAgICAgICAgICAgICAgICAgIEZGQUJTKGwxbXYxW3h5NF1bMV0pIDw9IDEpKSkgeworICAgICAgICAgICAgICAgIGEgPQorICAgICAgICAgICAgICAgIGIgPSAwOworICAgICAgICAgICAgICAgIGlmIChyZWZbMF0gPiAwKQorICAgICAgICAgICAgICAgICAgICBhID0gbXZbMF07CisgICAgICAgICAgICAgICAgaWYgKHJlZlsxXSA+IDApCisgICAgICAgICAgICAgICAgICAgIGIgPSBtdlsxXTsKKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGEgPSBtdlswXTsKKyAgICAgICAgICAgICAgICBiID0gbXZbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bXZfY2FjaGVbMF1bc2NhbjhbaTggKiA0XV0sIDIsIDIsIDgsIGEsIDQpOworICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm12X2NhY2hlWzFdW3NjYW44W2k4ICogNF1dLCAyLCAyLCA4LCBiLCA0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzX2I4eDggJiYgIShuICYgMykpCisgICAgICAgICAgICAqbWJfdHlwZSA9ICgqbWJfdHlwZSAmIH4oTUJfVFlQRV84eDggfCBNQl9UWVBFXzE2eDggfCBNQl9UWVBFXzh4MTYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfUDFMMCB8IE1CX1RZUEVfUDFMMSkpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfRElSRUNUMjsKKyAgICB9IGVsc2UgaWYgKElTXzE2WDE2KCptYl90eXBlKSkgeworICAgICAgICBpbnQgYSwgYjsKKworICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+cmVmX2NhY2hlWzBdW3NjYW44WzBdXSwgNCwgNCwgOCwgKHVpbnQ4X3QpcmVmWzBdLCAxKTsKKyAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVsxXVtzY2FuOFswXV0sIDQsIDQsIDgsICh1aW50OF90KXJlZlsxXSwgMSk7CisgICAgICAgIGlmICghSVNfSU5UUkEobWJfdHlwZV9jb2xbMF0pICYmICFoLT5yZWZfbGlzdFsxXVswXS5sb25nX3JlZiAmJgorICAgICAgICAgICAgKChsMXJlZjBbMF0gPT0gMCAmJgorICAgICAgICAgICAgICBGRkFCUyhsMW12MFswXVswXSkgPD0gMSAmJgorICAgICAgICAgICAgICBGRkFCUyhsMW12MFswXVsxXSkgPD0gMSkgfHwKKyAgICAgICAgICAgICAobDFyZWYwWzBdIDwgMCAmJiAhbDFyZWYxWzBdICYmCisgICAgICAgICAgICAgIEZGQUJTKGwxbXYxWzBdWzBdKSA8PSAxICYmCisgICAgICAgICAgICAgIEZGQUJTKGwxbXYxWzBdWzFdKSA8PSAxICYmCisgICAgICAgICAgICAgIGgtPngyNjRfYnVpbGQgPiAzM1UpKSkgeworICAgICAgICAgICAgYSA9IGIgPSAwOworICAgICAgICAgICAgaWYgKHJlZlswXSA+IDApCisgICAgICAgICAgICAgICAgYSA9IG12WzBdOworICAgICAgICAgICAgaWYgKHJlZlsxXSA+IDApCisgICAgICAgICAgICAgICAgYiA9IG12WzFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYSA9IG12WzBdOworICAgICAgICAgICAgYiA9IG12WzFdOworICAgICAgICB9CisgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5tdl9jYWNoZVswXVtzY2FuOFswXV0sIDQsIDQsIDgsIGEsIDQpOworICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bXZfY2FjaGVbMV1bc2NhbjhbMF1dLCA0LCA0LCA4LCBiLCA0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIGZvciAoaTggPSAwOyBpOCA8IDQ7IGk4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB4OCA9IGk4ICYgMTsKKyAgICAgICAgICAgIGNvbnN0IGludCB5OCA9IGk4ID4+IDE7CisKKyAgICAgICAgICAgIGlmIChpc19iOHg4ICYmICFJU19ESVJFQ1QoaC0+c3ViX21iX3R5cGVbaThdKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGgtPnN1Yl9tYl90eXBlW2k4XSA9IHN1Yl9tYl90eXBlOworCisgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bXZfY2FjaGVbMF1bc2NhbjhbaTggKiA0XV0sIDIsIDIsIDgsIG12WzBdLCA0KTsKKyAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5tdl9jYWNoZVsxXVtzY2FuOFtpOCAqIDRdXSwgMiwgMiwgOCwgbXZbMV0sIDQpOworICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVswXVtzY2FuOFtpOCAqIDRdXSwgMiwgMiwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KXJlZlswXSwgMSk7CisgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+cmVmX2NhY2hlWzFdW3NjYW44W2k4ICogNF1dLCAyLCAyLCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpcmVmWzFdLCAxKTsKKworICAgICAgICAgICAgYXNzZXJ0KGI4X3N0cmlkZSA9PSAyKTsKKyAgICAgICAgICAgIC8qIGNvbF96ZXJvX2ZsYWcgKi8KKyAgICAgICAgICAgIGlmICghSVNfSU5UUkEobWJfdHlwZV9jb2xbMF0pICYmICFoLT5yZWZfbGlzdFsxXVswXS5sb25nX3JlZiAmJgorICAgICAgICAgICAgICAgIChsMXJlZjBbaThdID09IDAgfHwKKyAgICAgICAgICAgICAgICAgKGwxcmVmMFtpOF0gPCAwICYmCisgICAgICAgICAgICAgICAgICBsMXJlZjFbaThdID09IDAgJiYKKyAgICAgICAgICAgICAgICAgIGgtPngyNjRfYnVpbGQgPiAzM1UpKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKCpsMW12KVsyXSA9IGwxcmVmMFtpOF0gPT0gMCA/IGwxbXYwIDogbDFtdjE7CisgICAgICAgICAgICAgICAgaWYgKElTX1NVQl84WDgoc3ViX21iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKm12X2NvbCA9IGwxbXZbeDggKiAzICsgeTggKiAzICogYjRfc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZGQUJTKG12X2NvbFswXSkgPD0gMSAmJiBGRkFCUyhtdl9jb2xbMV0pIDw9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZbMF0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bXZfY2FjaGVbMF1bc2NhbjhbaTggKiA0XV0sIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgMCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmWzFdID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm12X2NhY2hlWzFdW3NjYW44W2k4ICogNF1dLCAyLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDAsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgbiArPSA0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG0gPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCA0OyBpNCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICptdl9jb2wgPSBsMW12W3g4ICogMiArIChpNCAmIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHk4ICogMiArIChpNCA+PiAxKSkgKiBiNF9zdHJpZGVdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZGQUJTKG12X2NvbFswXSkgPD0gMSAmJiBGRkFCUyhtdl9jb2xbMV0pIDw9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmWzBdID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1pFUk8zMihoLT5tdl9jYWNoZVswXVtzY2FuOFtpOCAqIDQgKyBpNF1dKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmWzFdID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1pFUk8zMihoLT5tdl9jYWNoZVsxXVtzY2FuOFtpOCAqIDQgKyBpNF1dKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEobSAmIDMpKQorICAgICAgICAgICAgICAgICAgICAgICAgaC0+c3ViX21iX3R5cGVbaThdICs9IE1CX1RZUEVfMTZ4MTYgLSBNQl9UWVBFXzh4ODsKKyAgICAgICAgICAgICAgICAgICAgbiArPSBtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzX2I4eDggJiYgIShuICYgMTUpKQorICAgICAgICAgICAgKm1iX3R5cGUgPSAoKm1iX3R5cGUgJiB+KE1CX1RZUEVfOHg4IHwgTUJfVFlQRV8xNng4IHwgTUJfVFlQRV84eDE2IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEpKSB8CisgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0RJUkVDVDI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVkX3RlbXBfZGlyZWN0X21vdGlvbihIMjY0Q29udGV4dCAqY29uc3QgaCwgaW50ICptYl90eXBlKQoreworICAgIGludCBiOF9zdHJpZGUgPSAyOworICAgIGludCBiNF9zdHJpZGUgPSBoLT5iX3N0cmlkZTsKKyAgICBpbnQgbWJfeHkgPSBoLT5tYl94eSwgbWJfeSA9IGgtPm1iX3k7CisgICAgaW50IG1iX3R5cGVfY29sWzJdOworICAgIGNvbnN0IGludDE2X3QgKCpsMW12MClbMl0sICgqbDFtdjEpWzJdOworICAgIGNvbnN0IGludDhfdCAqbDFyZWYwLCAqbDFyZWYxOworICAgIGNvbnN0IGludCBpc19iOHg4ID0gSVNfOFg4KCptYl90eXBlKTsKKyAgICB1bnNpZ25lZCBpbnQgc3ViX21iX3R5cGU7CisgICAgaW50IGk4LCBpNDsKKworICAgIGFzc2VydChoLT5yZWZfbGlzdFsxXVswXS5yZWZlcmVuY2UgJiAzKTsKKworICAgIGF3YWl0X3JlZmVyZW5jZV9tYl9yb3coaCwgJmgtPnJlZl9saXN0WzFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWJfeSArICEhSVNfSU5URVJMQUNFRCgqbWJfdHlwZSkpOworCisgICAgaWYgKElTX0lOVEVSTEFDRUQoaC0+cmVmX2xpc3RbMV1bMF0ubWJfdHlwZVttYl94eV0pKSB7IC8vIEFGTC9BRlIvRlIvRkwgLT4gQUZML0ZMCisgICAgICAgIGlmICghSVNfSU5URVJMQUNFRCgqbWJfdHlwZSkpIHsgICAgICAgICAgICAgICAgICAgIC8vICAgICBBRlIvRlIgICAgLT4gQUZML0ZMCisgICAgICAgICAgICBtYl95ICA9IChoLT5tYl95ICYgfjEpICsgaC0+Y29sX3Bhcml0eTsKKyAgICAgICAgICAgIG1iX3h5ID0gaC0+bWJfeCArCisgICAgICAgICAgICAgICAgICAgICgoaC0+bWJfeSAmIH4xKSArIGgtPmNvbF9wYXJpdHkpICogaC0+bWJfc3RyaWRlOworICAgICAgICAgICAgYjhfc3RyaWRlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1iX3kgICs9IGgtPmNvbF9maWVsZG9mZjsKKyAgICAgICAgICAgIG1iX3h5ICs9IGgtPm1iX3N0cmlkZSAqIGgtPmNvbF9maWVsZG9mZjsgLy8gbm9uLXplcm8gZm9yIEZMIC0+IEZMICYgZGlmZmVyIHBhcml0eQorICAgICAgICB9CisgICAgICAgIGdvdG8gc2luZ2xlX2NvbDsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBRkwvQUZSL0ZSL0ZMIC0+IEFGUi9GUgorICAgICAgICBpZiAoSVNfSU5URVJMQUNFRCgqbWJfdHlwZSkpIHsgICAgICAgICAgICAgIC8vIEFGTCAgICAgICAvRkwgLT4gQUZSL0ZSCisgICAgICAgICAgICBtYl95ICAgICAgICAgICA9IGgtPm1iX3kgJiB+MTsKKyAgICAgICAgICAgIG1iX3h5ICAgICAgICAgID0gaC0+bWJfeCArIChoLT5tYl95ICYgfjEpICogaC0+bWJfc3RyaWRlOworICAgICAgICAgICAgbWJfdHlwZV9jb2xbMF0gPSBoLT5yZWZfbGlzdFsxXVswXS5tYl90eXBlW21iX3h5XTsKKyAgICAgICAgICAgIG1iX3R5cGVfY29sWzFdID0gaC0+cmVmX2xpc3RbMV1bMF0ubWJfdHlwZVttYl94eSArIGgtPm1iX3N0cmlkZV07CisgICAgICAgICAgICBiOF9zdHJpZGUgICAgICA9IDIgKyA0ICogaC0+bWJfc3RyaWRlOworICAgICAgICAgICAgYjRfc3RyaWRlICAgICAqPSA2OworICAgICAgICAgICAgaWYgKElTX0lOVEVSTEFDRUQobWJfdHlwZV9jb2xbMF0pICE9CisgICAgICAgICAgICAgICAgSVNfSU5URVJMQUNFRChtYl90eXBlX2NvbFsxXSkpIHsKKyAgICAgICAgICAgICAgICBtYl90eXBlX2NvbFswXSAmPSB+TUJfVFlQRV9JTlRFUkxBQ0VEOworICAgICAgICAgICAgICAgIG1iX3R5cGVfY29sWzFdICY9IH5NQl9UWVBFX0lOVEVSTEFDRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN1Yl9tYl90eXBlID0gTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDBMMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfRElSRUNUMjsgICAgICAgICAgICAgICAgICAvKiBCX1NVQl84eDggKi8KKworICAgICAgICAgICAgaWYgKChtYl90eXBlX2NvbFswXSAmIE1CX1RZUEVfMTZ4MTZfT1JfSU5UUkEpICYmCisgICAgICAgICAgICAgICAgKG1iX3R5cGVfY29sWzFdICYgTUJfVFlQRV8xNngxNl9PUl9JTlRSQSkgJiYKKyAgICAgICAgICAgICAgICAhaXNfYjh4OCkgeworICAgICAgICAgICAgICAgICptYl90eXBlIHw9IE1CX1RZUEVfMTZ4OCB8IE1CX1RZUEVfTDBMMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9ESVJFQ1QyOyAgICAgICAgICAgICAgICAvKiBCXzE2eDggKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKm1iX3R5cGUgfD0gTUJfVFlQRV84eDggfCBNQl9UWVBFX0wwTDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEFGUi9GUiAgICAtPiBBRlIvRlIKK3NpbmdsZV9jb2w6CisgICAgICAgICAgICBtYl90eXBlX2NvbFswXSAgICAgPQorICAgICAgICAgICAgICAgIG1iX3R5cGVfY29sWzFdID0gaC0+cmVmX2xpc3RbMV1bMF0ubWJfdHlwZVttYl94eV07CisKKyAgICAgICAgICAgIHN1Yl9tYl90eXBlID0gTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDBMMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfRElSRUNUMjsgICAgICAgICAgICAgICAgICAvKiBCX1NVQl84eDggKi8KKyAgICAgICAgICAgIGlmICghaXNfYjh4OCAmJiAobWJfdHlwZV9jb2xbMF0gJiBNQl9UWVBFXzE2eDE2X09SX0lOVFJBKSkgeworICAgICAgICAgICAgICAgICptYl90eXBlIHw9IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfRElSRUNUMjsgICAgICAgICAgICAgICAgLyogQl8xNngxNiAqLworICAgICAgICAgICAgfSBlbHNlIGlmICghaXNfYjh4OCAmJgorICAgICAgICAgICAgICAgICAgICAgICAobWJfdHlwZV9jb2xbMF0gJiAoTUJfVFlQRV8xNng4IHwgTUJfVFlQRV84eDE2KSkpIHsKKyAgICAgICAgICAgICAgICAqbWJfdHlwZSB8PSBNQl9UWVBFX0wwTDEgfCBNQl9UWVBFX0RJUkVDVDIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYl90eXBlX2NvbFswXSAmIChNQl9UWVBFXzE2eDggfCBNQl9UWVBFXzh4MTYpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZykgeworICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogc2F2ZSBzdWIgbWIgdHlwZXMgZnJvbSBwcmV2aW91cyBmcmFtZXMgKG9yIGRlcml2ZQorICAgICAgICAgICAgICAgICAgICAgKiBmcm9tIE1Wcykgc28gd2Uga25vdyBleGFjdGx5IHdoYXQgYmxvY2sgc2l6ZSB0byB1c2UgKi8KKyAgICAgICAgICAgICAgICAgICAgc3ViX21iX3R5cGUgPSBNQl9UWVBFXzh4OCB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDBMMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9ESVJFQ1QyOyAgICAgICAgICAvKiBCX1NVQl80eDQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKm1iX3R5cGUgfD0gTUJfVFlQRV84eDggfCBNQl9UWVBFX0wwTDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhd2FpdF9yZWZlcmVuY2VfbWJfcm93KGgsICZoLT5yZWZfbGlzdFsxXVswXSwgbWJfeSk7CisKKyAgICBsMW12MCAgPSAodm9pZCopJmgtPnJlZl9saXN0WzFdWzBdLm1vdGlvbl92YWxbMF1baC0+bWIyYl94eVttYl94eV1dOworICAgIGwxbXYxICA9ICh2b2lkKikmaC0+cmVmX2xpc3RbMV1bMF0ubW90aW9uX3ZhbFsxXVtoLT5tYjJiX3h5W21iX3h5XV07CisgICAgbDFyZWYwID0gJmgtPnJlZl9saXN0WzFdWzBdLnJlZl9pbmRleFswXVs0ICogbWJfeHldOworICAgIGwxcmVmMSA9ICZoLT5yZWZfbGlzdFsxXVswXS5yZWZfaW5kZXhbMV1bNCAqIG1iX3h5XTsKKyAgICBpZiAoIWI4X3N0cmlkZSkgeworICAgICAgICBpZiAoaC0+bWJfeSAmIDEpIHsKKyAgICAgICAgICAgIGwxcmVmMCArPSAyOworICAgICAgICAgICAgbDFyZWYxICs9IDI7CisgICAgICAgICAgICBsMW12MCAgKz0gMiAqIGI0X3N0cmlkZTsKKyAgICAgICAgICAgIGwxbXYxICArPSAyICogYjRfc3RyaWRlOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBjb25zdCBpbnQgKm1hcF9jb2xfdG9fbGlzdDBbMl0gPSB7IGgtPm1hcF9jb2xfdG9fbGlzdDBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWFwX2NvbF90b19saXN0MFsxXSB9OworICAgICAgICBjb25zdCBpbnQgKmRpc3Rfc2NhbGVfZmFjdG9yID0gaC0+ZGlzdF9zY2FsZV9mYWN0b3I7CisgICAgICAgIGludCByZWZfb2Zmc2V0OworCisgICAgICAgIGlmIChGUkFNRV9NQkFGRihoKSAmJiBJU19JTlRFUkxBQ0VEKCptYl90eXBlKSkgeworICAgICAgICAgICAgbWFwX2NvbF90b19saXN0MFswXSA9IGgtPm1hcF9jb2xfdG9fbGlzdDBfZmllbGRbaC0+bWJfeSAmIDFdWzBdOworICAgICAgICAgICAgbWFwX2NvbF90b19saXN0MFsxXSA9IGgtPm1hcF9jb2xfdG9fbGlzdDBfZmllbGRbaC0+bWJfeSAmIDFdWzFdOworICAgICAgICAgICAgZGlzdF9zY2FsZV9mYWN0b3IgICA9IGgtPmRpc3Rfc2NhbGVfZmFjdG9yX2ZpZWxkW2gtPm1iX3kgJiAxXTsKKyAgICAgICAgfQorICAgICAgICByZWZfb2Zmc2V0ID0gKGgtPnJlZl9saXN0WzFdWzBdLm1iYWZmIDw8IDQpICYgKG1iX3R5cGVfY29sWzBdID4+IDMpOworCisgICAgICAgIGlmIChJU19JTlRFUkxBQ0VEKCptYl90eXBlKSAhPSBJU19JTlRFUkxBQ0VEKG1iX3R5cGVfY29sWzBdKSkgeworICAgICAgICAgICAgaW50IHlfc2hpZnQgPSAyICogIUlTX0lOVEVSTEFDRUQoKm1iX3R5cGUpOworICAgICAgICAgICAgYXNzZXJ0KGgtPnNwcy5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnKTsKKworICAgICAgICAgICAgZm9yIChpOCA9IDA7IGk4IDwgNDsgaTgrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCB4OCA9IGk4ICYgMTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgeTggPSBpOCA+PiAxOworICAgICAgICAgICAgICAgIGludCByZWYwLCBzY2FsZTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICgqbDFtdilbMl0gPSBsMW12MDsKKworICAgICAgICAgICAgICAgIGlmIChpc19iOHg4ICYmICFJU19ESVJFQ1QoaC0+c3ViX21iX3R5cGVbaThdKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaC0+c3ViX21iX3R5cGVbaThdID0gc3ViX21iX3R5cGU7CisKKyAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+cmVmX2NhY2hlWzFdW3NjYW44W2k4ICogNF1dLCAyLCAyLCA4LCAwLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAoSVNfSU5UUkEobWJfdHlwZV9jb2xbeThdKSkgeworICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+cmVmX2NhY2hlWzBdW3NjYW44W2k4ICogNF1dLCAyLCAyLCA4LCAwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm12X2NhY2hlWzBdW3NjYW44W2k4ICogNF1dLCAyLCAyLCA4LCAwLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm12X2NhY2hlWzFdW3NjYW44W2k4ICogNF1dLCAyLCAyLCA4LCAwLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVmMCA9IGwxcmVmMFt4OCArIHk4ICogYjhfc3RyaWRlXTsKKyAgICAgICAgICAgICAgICBpZiAocmVmMCA+PSAwKQorICAgICAgICAgICAgICAgICAgICByZWYwID0gbWFwX2NvbF90b19saXN0MFswXVtyZWYwICsgcmVmX29mZnNldF07CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlZjAgPSBtYXBfY29sX3RvX2xpc3QwWzFdW2wxcmVmMVt4OCArIHk4ICogYjhfc3RyaWRlXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9vZmZzZXRdOworICAgICAgICAgICAgICAgICAgICBsMW12ID0gbDFtdjE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNjYWxlID0gZGlzdF9zY2FsZV9mYWN0b3JbcmVmMF07CisgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVswXVtzY2FuOFtpOCAqIDRdXSwgMiwgMiwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYwLCAxKTsKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqbXZfY29sID0gbDFtdlt4OCAqIDMgKyB5OCAqIGI0X3N0cmlkZV07CisgICAgICAgICAgICAgICAgICAgIGludCBteV9jb2wgICAgICAgICAgICA9IChtdl9jb2xbMV0gPDwgeV9zaGlmdCkgLyAyOworICAgICAgICAgICAgICAgICAgICBpbnQgbXggICAgICAgICAgICAgICAgPSAoc2NhbGUgKiBtdl9jb2xbMF0gKyAxMjgpID4+IDg7CisgICAgICAgICAgICAgICAgICAgIGludCBteSAgICAgICAgICAgICAgICA9IChzY2FsZSAqIG15X2NvbCAgICArIDEyOCkgPj4gODsKKyAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm12X2NhY2hlWzBdW3NjYW44W2k4ICogNF1dLCAyLCAyLCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrMTZ0bzMyKG14LCBteSksIDQpOworICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bXZfY2FjaGVbMV1bc2NhbjhbaTggKiA0XV0sIDIsIDIsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2sxNnRvMzIobXggLSBtdl9jb2xbMF0sIG15IC0gbXlfY29sKSwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogb25lLXRvLW9uZSBtdiBzY2FsaW5nICovCisKKyAgICAgICAgaWYgKElTXzE2WDE2KCptYl90eXBlKSkgeworICAgICAgICAgICAgaW50IHJlZiwgbXYwLCBtdjE7CisKKyAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5yZWZfY2FjaGVbMV1bc2NhbjhbMF1dLCA0LCA0LCA4LCAwLCAxKTsKKyAgICAgICAgICAgIGlmIChJU19JTlRSQShtYl90eXBlX2NvbFswXSkpIHsKKyAgICAgICAgICAgICAgICByZWYgPSBtdjAgPSBtdjEgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcmVmMCA9IGwxcmVmMFswXSA+PSAwID8gbWFwX2NvbF90b19saXN0MFswXVtsMXJlZjBbMF0gKyByZWZfb2Zmc2V0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtYXBfY29sX3RvX2xpc3QwWzFdW2wxcmVmMVswXSArIHJlZl9vZmZzZXRdOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZSA9IGRpc3Rfc2NhbGVfZmFjdG9yW3JlZjBdOworICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKm12X2NvbCA9IGwxcmVmMFswXSA+PSAwID8gbDFtdjBbMF0gOiBsMW12MVswXTsKKyAgICAgICAgICAgICAgICBpbnQgbXZfbDBbMl07CisgICAgICAgICAgICAgICAgbXZfbDBbMF0gPSAoc2NhbGUgKiBtdl9jb2xbMF0gKyAxMjgpID4+IDg7CisgICAgICAgICAgICAgICAgbXZfbDBbMV0gPSAoc2NhbGUgKiBtdl9jb2xbMV0gKyAxMjgpID4+IDg7CisgICAgICAgICAgICAgICAgcmVmICAgICAgPSByZWYwOworICAgICAgICAgICAgICAgIG12MCAgICAgID0gcGFjazE2dG8zMihtdl9sMFswXSwgbXZfbDBbMV0pOworICAgICAgICAgICAgICAgIG12MSAgICAgID0gcGFjazE2dG8zMihtdl9sMFswXSAtIG12X2NvbFswXSwgbXZfbDBbMV0gLSBtdl9jb2xbMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVswXVtzY2FuOFswXV0sIDQsIDQsIDgsIHJlZiwgMSk7CisgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+bXZfY2FjaGVbMF1bc2NhbjhbMF1dLCA0LCA0LCA4LCBtdjAsIDQpOworICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm12X2NhY2hlWzFdW3NjYW44WzBdXSwgNCwgNCwgOCwgbXYxLCA0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaTggPSAwOyBpOCA8IDQ7IGk4KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgeDggPSBpOCAmIDE7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHk4ID0gaTggPj4gMTsKKyAgICAgICAgICAgICAgICBpbnQgcmVmMCwgc2NhbGU7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAoKmwxbXYpWzJdID0gbDFtdjA7CisKKyAgICAgICAgICAgICAgICBpZiAoaXNfYjh4OCAmJiAhSVNfRElSRUNUKGgtPnN1Yl9tYl90eXBlW2k4XSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGgtPnN1Yl9tYl90eXBlW2k4XSA9IHN1Yl9tYl90eXBlOworICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5yZWZfY2FjaGVbMV1bc2NhbjhbaTggKiA0XV0sIDIsIDIsIDgsIDAsIDEpOworICAgICAgICAgICAgICAgIGlmIChJU19JTlRSQShtYl90eXBlX2NvbFswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVswXVtzY2FuOFtpOCAqIDRdXSwgMiwgMiwgOCwgMCwgMSk7CisgICAgICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5tdl9jYWNoZVswXVtzY2FuOFtpOCAqIDRdXSwgMiwgMiwgOCwgMCwgNCk7CisgICAgICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5tdl9jYWNoZVsxXVtzY2FuOFtpOCAqIDRdXSwgMiwgMiwgOCwgMCwgNCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFzc2VydChiOF9zdHJpZGUgPT0gMik7CisgICAgICAgICAgICAgICAgcmVmMCA9IGwxcmVmMFtpOF07CisgICAgICAgICAgICAgICAgaWYgKHJlZjAgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmVmMCA9IG1hcF9jb2xfdG9fbGlzdDBbMF1bcmVmMCArIHJlZl9vZmZzZXRdOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZWYwID0gbWFwX2NvbF90b19saXN0MFsxXVtsMXJlZjFbaThdICsgcmVmX29mZnNldF07CisgICAgICAgICAgICAgICAgICAgIGwxbXYgPSBsMW12MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2NhbGUgPSBkaXN0X3NjYWxlX2ZhY3RvcltyZWYwXTsKKworICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5yZWZfY2FjaGVbMF1bc2NhbjhbaTggKiA0XV0sIDIsIDIsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMCwgMSk7CisgICAgICAgICAgICAgICAgaWYgKElTX1NVQl84WDgoc3ViX21iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKm12X2NvbCA9IGwxbXZbeDggKiAzICsgeTggKiAzICogYjRfc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG14ICAgICAgICAgICAgICAgID0gKHNjYWxlICogbXZfY29sWzBdICsgMTI4KSA+PiA4OworICAgICAgICAgICAgICAgICAgICBpbnQgbXkgICAgICAgICAgICAgICAgPSAoc2NhbGUgKiBtdl9jb2xbMV0gKyAxMjgpID4+IDg7CisgICAgICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5tdl9jYWNoZVswXVtzY2FuOFtpOCAqIDRdXSwgMiwgMiwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjazE2dG8zMihteCwgbXkpLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPm12X2NhY2hlWzFdW3NjYW44W2k4ICogNF1dLCAyLCAyLCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrMTZ0bzMyKG14IC0gbXZfY29sWzBdLCBteSAtIG12X2NvbFsxXSksIDQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IDQ7IGk0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKm12X2NvbCA9IGwxbXZbeDggKiAyICsgKGk0ICYgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeTggKiAyICsgKGk0ID4+IDEpKSAqIGI0X3N0cmlkZV07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICptdl9sMCA9IGgtPm12X2NhY2hlWzBdW3NjYW44W2k4ICogNCArIGk0XV07CisgICAgICAgICAgICAgICAgICAgICAgICBtdl9sMFswXSA9IChzY2FsZSAqIG12X2NvbFswXSArIDEyOCkgPj4gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12X2wwWzFdID0gKHNjYWxlICogbXZfY29sWzFdICsgMTI4KSA+PiA4OworICAgICAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEoaC0+bXZfY2FjaGVbMV1bc2NhbjhbaTggKiA0ICsgaTRdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2sxNnRvMzIobXZfbDBbMF0gLSBtdl9jb2xbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X2wwWzFdIC0gbXZfY29sWzFdKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZmZfaDI2NF9wcmVkX2RpcmVjdF9tb3Rpb24oSDI2NENvbnRleHQgKmNvbnN0IGgsIGludCAqbWJfdHlwZSkKK3sKKyAgICBpZiAoaC0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZCkKKyAgICAgICAgcHJlZF9zcGF0aWFsX2RpcmVjdF9tb3Rpb24oaCwgbWJfdHlwZSk7CisgICAgZWxzZQorICAgICAgICBwcmVkX3RlbXBfZGlyZWN0X21vdGlvbihoLCBtYl90eXBlKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfbG9vcGZpbHRlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9sb29wZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiNjg3OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfbG9vcGZpbHRlci5jCkBAIC0wLDAgKzEsODMxIEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gbG9vcCBmaWx0ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBsb29wIGZpbHRlci4KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSAicmVjdGFuZ2xlLmgiCisKKy8qIERlYmxvY2tpbmcgZmlsdGVyIChwMTUzKSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWxwaGFfdGFibGVbNTIqM10gPSB7CisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDQsICA0LCAgNSwgIDYsCisgICAgIDcsICA4LCAgOSwgMTAsIDEyLCAxMywgMTUsIDE3LCAyMCwgMjIsCisgICAgMjUsIDI4LCAzMiwgMzYsIDQwLCA0NSwgNTAsIDU2LCA2MywgNzEsCisgICAgODAsIDkwLDEwMSwxMTMsMTI3LDE0NCwxNjIsMTgyLDIwMywyMjYsCisgICAyNTUsMjU1LAorICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGJldGFfdGFibGVbNTIqM10gPSB7CisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDIsICAyLCAgMiwgIDMsCisgICAgIDMsICAzLCAgMywgIDQsICA0LCAgNCwgIDYsICA2LCAgNywgIDcsCisgICAgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsCisgICAgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNywgMTcsCisgICAgMTgsIDE4LAorICAgIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LAorfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHRjMF90YWJsZVs1MiozXVs0XSA9IHsKKyAgICB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LAorICAgIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sCisgICAgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwKKyAgICB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LAorICAgIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sCisgICAgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwKKyAgICB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LAorICAgIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sCisgICAgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sCisgICAgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwKKyAgICB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LAorICAgIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAwIH0sIHstMSwgMCwgMCwgMCB9LCB7LTEsIDAsIDAsIDAgfSwgey0xLCAwLCAwLCAxIH0sCisgICAgey0xLCAwLCAwLCAxIH0sIHstMSwgMCwgMCwgMSB9LCB7LTEsIDAsIDAsIDEgfSwgey0xLCAwLCAxLCAxIH0sIHstMSwgMCwgMSwgMSB9LCB7LTEsIDEsIDEsIDEgfSwKKyAgICB7LTEsIDEsIDEsIDEgfSwgey0xLCAxLCAxLCAxIH0sIHstMSwgMSwgMSwgMSB9LCB7LTEsIDEsIDEsIDIgfSwgey0xLCAxLCAxLCAyIH0sIHstMSwgMSwgMSwgMiB9LAorICAgIHstMSwgMSwgMSwgMiB9LCB7LTEsIDEsIDIsIDMgfSwgey0xLCAxLCAyLCAzIH0sIHstMSwgMiwgMiwgMyB9LCB7LTEsIDIsIDIsIDQgfSwgey0xLCAyLCAzLCA0IH0sCisgICAgey0xLCAyLCAzLCA0IH0sIHstMSwgMywgMywgNSB9LCB7LTEsIDMsIDQsIDYgfSwgey0xLCAzLCA0LCA2IH0sIHstMSwgNCwgNSwgNyB9LCB7LTEsIDQsIDUsIDggfSwKKyAgICB7LTEsIDQsIDYsIDkgfSwgey0xLCA1LCA3LDEwIH0sIHstMSwgNiwgOCwxMSB9LCB7LTEsIDYsIDgsMTMgfSwgey0xLCA3LDEwLDE0IH0sIHstMSwgOCwxMSwxNiB9LAorICAgIHstMSwgOSwxMiwxOCB9LCB7LTEsMTAsMTMsMjAgfSwgey0xLDExLDE1LDIzIH0sIHstMSwxMywxNywyNSB9LAorICAgIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sCisgICAgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwKKyAgICB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LAorICAgIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sCisgICAgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwKKyAgICB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LAorICAgIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sCisgICAgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwKKyAgICB7LTEsMTMsMTcsMjUgfSwgey0xLDEzLDE3LDI1IH0sIHstMSwxMywxNywyNSB9LCB7LTEsMTMsMTcsMjUgfSwKK307CisKKy8qIGludHJhOiAwIGlmIHRoaXMgbG9vcGZpbHRlciBjYWxsIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW50ZXIgKGJTIDwgNCksIDEgaWYgaXQgbWlnaHQgYmUgaW50cmEgKGJTID09IDQpICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZpbHRlcl9tYl9lZGdldih1aW50OF90ICpwaXgsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGJTWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHFwLCBpbnQgYSwgaW50IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0Q29udGV4dCAqaCwgaW50IGludHJhKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGludCBpbmRleF9hID0gcXAgKyBhOworICAgIGNvbnN0IGludCBhbHBoYSA9IGFscGhhX3RhYmxlW2luZGV4X2FdOworICAgIGNvbnN0IGludCBiZXRhICA9IGJldGFfdGFibGVbcXAgKyBiXTsKKyAgICBpZiAoYWxwaGEgPT0wIHx8IGJldGEgPT0gMCkgcmV0dXJuOworCisgICAgaWYoIGJTWzBdIDwgNCB8fCAhaW50cmEgKSB7CisgICAgICAgIGludDhfdCB0Y1s0XTsKKyAgICAgICAgdGNbMF0gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbMF1dOworICAgICAgICB0Y1sxXSA9IHRjMF90YWJsZVtpbmRleF9hXVtiU1sxXV07CisgICAgICAgIHRjWzJdID0gdGMwX3RhYmxlW2luZGV4X2FdW2JTWzJdXTsKKyAgICAgICAgdGNbM10gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbM11dOworICAgICAgICBoLT5oMjY0ZHNwLmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hKHBpeCwgc3RyaWRlLCBhbHBoYSwgYmV0YSwgdGMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9oX2xvb3BfZmlsdGVyX2x1bWFfaW50cmEocGl4LCBzdHJpZGUsIGFscGhhLCBiZXRhKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmlsdGVyX21iX2VkZ2Vjdih1aW50OF90ICpwaXgsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBiU1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcXAsIGludCBhLCBpbnQgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0Q29udGV4dCAqaCwgaW50IGludHJhKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGludCBpbmRleF9hID0gcXAgKyBhOworICAgIGNvbnN0IGludCBhbHBoYSA9IGFscGhhX3RhYmxlW2luZGV4X2FdOworICAgIGNvbnN0IGludCBiZXRhICA9IGJldGFfdGFibGVbcXAgKyBiXTsKKyAgICBpZiAoYWxwaGEgPT0wIHx8IGJldGEgPT0gMCkgcmV0dXJuOworCisgICAgaWYoIGJTWzBdIDwgNCB8fCAhaW50cmEgKSB7CisgICAgICAgIGludDhfdCB0Y1s0XTsKKyAgICAgICAgdGNbMF0gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbMF1dKzE7CisgICAgICAgIHRjWzFdID0gdGMwX3RhYmxlW2luZGV4X2FdW2JTWzFdXSsxOworICAgICAgICB0Y1syXSA9IHRjMF90YWJsZVtpbmRleF9hXVtiU1syXV0rMTsKKyAgICAgICAgdGNbM10gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbM11dKzE7CisgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYShwaXgsIHN0cmlkZSwgYWxwaGEsIGJldGEsIHRjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoLT5oMjY0ZHNwLmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmEocGl4LCBzdHJpZGUsIGFscGhhLCBiZXRhKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmlsdGVyX21iX21iYWZmX2VkZ2V2KEgyNjRDb250ZXh0ICpoLCB1aW50OF90ICpwaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBiU1s3XSwgaW50IGJzaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxcCwgaW50IGEsIGludCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludHJhKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGludCBpbmRleF9hID0gcXAgKyBhOworICAgIGNvbnN0IGludCBhbHBoYSA9IGFscGhhX3RhYmxlW2luZGV4X2FdOworICAgIGNvbnN0IGludCBiZXRhICA9IGJldGFfdGFibGVbcXAgKyBiXTsKKyAgICBpZiAoYWxwaGEgPT0wIHx8IGJldGEgPT0gMCkgcmV0dXJuOworCisgICAgaWYoIGJTWzBdIDwgNCB8fCAhaW50cmEgKSB7CisgICAgICAgIGludDhfdCB0Y1s0XTsKKyAgICAgICAgdGNbMF0gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbMCpic2ldXTsKKyAgICAgICAgdGNbMV0gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbMSpic2ldXTsKKyAgICAgICAgdGNbMl0gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbMipic2ldXTsKKyAgICAgICAgdGNbM10gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbMypic2ldXTsKKyAgICAgICAgaC0+aDI2NGRzcC5oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9tYmFmZihwaXgsIHN0cmlkZSwgYWxwaGEsIGJldGEsIHRjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoLT5oMjY0ZHNwLmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX21iYWZmX2ludHJhKHBpeCwgc3RyaWRlLCBhbHBoYSwgYmV0YSk7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZpbHRlcl9tYl9tYmFmZl9lZGdlY3YoSDI2NENvbnRleHQgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgYlNbN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJzaSwgaW50IHFwLCBpbnQgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiwgaW50IGludHJhKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGludCBpbmRleF9hID0gcXAgKyBhOworICAgIGNvbnN0IGludCBhbHBoYSA9IGFscGhhX3RhYmxlW2luZGV4X2FdOworICAgIGNvbnN0IGludCBiZXRhICA9IGJldGFfdGFibGVbcXAgKyBiXTsKKyAgICBpZiAoYWxwaGEgPT0wIHx8IGJldGEgPT0gMCkgcmV0dXJuOworCisgICAgaWYoIGJTWzBdIDwgNCB8fCAhaW50cmEgKSB7CisgICAgICAgIGludDhfdCB0Y1s0XTsKKyAgICAgICAgdGNbMF0gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbMCpic2ldXSArIDE7CisgICAgICAgIHRjWzFdID0gdGMwX3RhYmxlW2luZGV4X2FdW2JTWzEqYnNpXV0gKyAxOworICAgICAgICB0Y1syXSA9IHRjMF90YWJsZVtpbmRleF9hXVtiU1syKmJzaV1dICsgMTsKKyAgICAgICAgdGNbM10gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbMypic2ldXSArIDE7CisgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYV9tYmFmZihwaXgsIHN0cmlkZSwgYWxwaGEsIGJldGEsIHRjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoLT5oMjY0ZHNwLmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfbWJhZmZfaW50cmEocGl4LCBzdHJpZGUsIGFscGhhLCBiZXRhKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmlsdGVyX21iX2VkZ2VoKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgYlNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcXAsIGludCBhLCBpbnQgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRDb250ZXh0ICpoLCBpbnQgaW50cmEpCit7CisgICAgY29uc3QgdW5zaWduZWQgaW50IGluZGV4X2EgPSBxcCArIGE7CisgICAgY29uc3QgaW50IGFscGhhID0gYWxwaGFfdGFibGVbaW5kZXhfYV07CisgICAgY29uc3QgaW50IGJldGEgID0gYmV0YV90YWJsZVtxcCArIGJdOworICAgIGlmIChhbHBoYSA9PTAgfHwgYmV0YSA9PSAwKSByZXR1cm47CisKKyAgICBpZiggYlNbMF0gPCA0IHx8ICFpbnRyYSApIHsKKyAgICAgICAgaW50OF90IHRjWzRdOworICAgICAgICB0Y1swXSA9IHRjMF90YWJsZVtpbmRleF9hXVtiU1swXV07CisgICAgICAgIHRjWzFdID0gdGMwX3RhYmxlW2luZGV4X2FdW2JTWzFdXTsKKyAgICAgICAgdGNbMl0gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbMl1dOworICAgICAgICB0Y1szXSA9IHRjMF90YWJsZVtpbmRleF9hXVtiU1szXV07CisgICAgICAgIGgtPmgyNjRkc3AuaDI2NF92X2xvb3BfZmlsdGVyX2x1bWEocGl4LCBzdHJpZGUsIGFscGhhLCBiZXRhLCB0Yyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaC0+aDI2NGRzcC5oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYV9pbnRyYShwaXgsIHN0cmlkZSwgYWxwaGEsIGJldGEpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmaWx0ZXJfbWJfZWRnZWNoKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGJTWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBxcCwgaW50IGEsIGludCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRDb250ZXh0ICpoLCBpbnQgaW50cmEpCit7CisgICAgY29uc3QgdW5zaWduZWQgaW50IGluZGV4X2EgPSBxcCArIGE7CisgICAgY29uc3QgaW50IGFscGhhID0gYWxwaGFfdGFibGVbaW5kZXhfYV07CisgICAgY29uc3QgaW50IGJldGEgID0gYmV0YV90YWJsZVtxcCArIGJdOworICAgIGlmIChhbHBoYSA9PTAgfHwgYmV0YSA9PSAwKSByZXR1cm47CisKKyAgICBpZiggYlNbMF0gPCA0IHx8ICFpbnRyYSApIHsKKyAgICAgICAgaW50OF90IHRjWzRdOworICAgICAgICB0Y1swXSA9IHRjMF90YWJsZVtpbmRleF9hXVtiU1swXV0rMTsKKyAgICAgICAgdGNbMV0gPSB0YzBfdGFibGVbaW5kZXhfYV1bYlNbMV1dKzE7CisgICAgICAgIHRjWzJdID0gdGMwX3RhYmxlW2luZGV4X2FdW2JTWzJdXSsxOworICAgICAgICB0Y1szXSA9IHRjMF90YWJsZVtpbmRleF9hXVtiU1szXV0rMTsKKyAgICAgICAgaC0+aDI2NGRzcC5oMjY0X3ZfbG9vcF9maWx0ZXJfY2hyb21hKHBpeCwgc3RyaWRlLCBhbHBoYSwgYmV0YSwgdGMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGgtPmgyNjRkc3AuaDI2NF92X2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYShwaXgsIHN0cmlkZSwgYWxwaGEsIGJldGEpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBoMjY0X2ZpbHRlcl9tYl9mYXN0X2ludGVybmFsKEgyNjRDb250ZXh0ICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl94LCBpbnQgbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppbWdfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppbWdfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaW1nX2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfc2hpZnQpCit7CisgICAgaW50IGNocm9tYSA9IENIUk9NQShoKSAmJiAhKENPTkZJR19HUkFZICYmIChoLT5mbGFncyZDT0RFQ19GTEFHX0dSQVkpKTsKKyAgICBpbnQgY2hyb21hNDQ0ID0gQ0hST01BNDQ0KGgpOworICAgIGludCBjaHJvbWE0MjIgPSBDSFJPTUE0MjIoaCk7CisKKyAgICBpbnQgbWJfeHkgPSBoLT5tYl94eTsKKyAgICBpbnQgbGVmdF90eXBlPSBoLT5sZWZ0X3R5cGVbTFRPUF07CisgICAgaW50IHRvcF90eXBlPSBoLT50b3BfdHlwZTsKKworICAgIGludCBxcF9iZF9vZmZzZXQgPSA2ICogKGgtPnNwcy5iaXRfZGVwdGhfbHVtYSAtIDgpOworICAgIGludCBhID0gNTIgKyBoLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQgLSBxcF9iZF9vZmZzZXQ7CisgICAgaW50IGIgPSA1MiArIGgtPnNsaWNlX2JldGFfb2Zmc2V0IC0gcXBfYmRfb2Zmc2V0OworCisgICAgaW50IG1iX3R5cGUgPSBoLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldOworICAgIGludCBxcCAgICAgID0gaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHldOworICAgIGludCBxcDAgICAgID0gaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHkgLSAxXTsKKyAgICBpbnQgcXAxICAgICA9IGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW2gtPnRvcF9tYl94eV07CisgICAgaW50IHFwYyA9IGdldF9jaHJvbWFfcXAoIGgsIDAsIHFwICk7CisgICAgaW50IHFwYzAgPSBnZXRfY2hyb21hX3FwKCBoLCAwLCBxcDAgKTsKKyAgICBpbnQgcXBjMSA9IGdldF9jaHJvbWFfcXAoIGgsIDAsIHFwMSApOworICAgIHFwMCA9IChxcCArIHFwMCArIDEpID4+IDE7CisgICAgcXAxID0gKHFwICsgcXAxICsgMSkgPj4gMTsKKyAgICBxcGMwID0gKHFwYyArIHFwYzAgKyAxKSA+PiAxOworICAgIHFwYzEgPSAocXBjICsgcXBjMSArIDEpID4+IDE7CisKKyAgICBpZiggSVNfSU5UUkEobWJfdHlwZSkgKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQxNl90IGJTNFs0XSA9IHs0LDQsNCw0fTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludDE2X3QgYlMzWzRdID0gezMsMywzLDN9OworICAgICAgICBjb25zdCBpbnQxNl90ICpiU0ggPSBGSUVMRF9QSUNUVVJFKGgpID8gYlMzIDogYlM0OworICAgICAgICBpZihsZWZ0X3R5cGUpCisgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZXYoICZpbWdfeVs0KjA8PHBpeGVsX3NoaWZ0XSwgbGluZXNpemUsIGJTNCwgcXAwLCBhLCBiLCBoLCAxKTsKKyAgICAgICAgaWYoIElTXzh4OERDVChtYl90eXBlKSApIHsKKyAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdldiggJmltZ195WzQqMjw8cGl4ZWxfc2hpZnRdLCBsaW5lc2l6ZSwgYlMzLCBxcCwgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICBpZih0b3BfdHlwZSl7CisgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoKCAmaW1nX3lbNCowKmxpbmVzaXplXSwgbGluZXNpemUsIGJTSCwgcXAxLCBhLCBiLCBoLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlaCggJmltZ195WzQqMipsaW5lc2l6ZV0sIGxpbmVzaXplLCBiUzMsIHFwLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdldiggJmltZ195WzQqMTw8cGl4ZWxfc2hpZnRdLCBsaW5lc2l6ZSwgYlMzLCBxcCwgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZXYoICZpbWdfeVs0KjI8PHBpeGVsX3NoaWZ0XSwgbGluZXNpemUsIGJTMywgcXAsIGEsIGIsIGgsIDApOworICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2V2KCAmaW1nX3lbNCozPDxwaXhlbF9zaGlmdF0sIGxpbmVzaXplLCBiUzMsIHFwLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgIGlmKHRvcF90eXBlKXsKKyAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWgoICZpbWdfeVs0KjAqbGluZXNpemVdLCBsaW5lc2l6ZSwgYlNILCBxcDEsIGEsIGIsIGgsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoKCAmaW1nX3lbNCoxKmxpbmVzaXplXSwgbGluZXNpemUsIGJTMywgcXAsIGEsIGIsIGgsIDApOworICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoKCAmaW1nX3lbNCoyKmxpbmVzaXplXSwgbGluZXNpemUsIGJTMywgcXAsIGEsIGIsIGgsIDApOworICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoKCAmaW1nX3lbNCozKmxpbmVzaXplXSwgbGluZXNpemUsIGJTMywgcXAsIGEsIGIsIGgsIDApOworICAgICAgICB9CisgICAgICAgIGlmKGNocm9tYSl7CisgICAgICAgICAgICBpZihjaHJvbWE0NDQpeworICAgICAgICAgICAgICAgIGlmKGxlZnRfdHlwZSl7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdldiggJmltZ19jYls0KjA8PHBpeGVsX3NoaWZ0XSwgbGluZXNpemUsIGJTNCwgcXBjMCwgYSwgYiwgaCwgMSk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdldiggJmltZ19jcls0KjA8PHBpeGVsX3NoaWZ0XSwgbGluZXNpemUsIGJTNCwgcXBjMCwgYSwgYiwgaCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBJU184eDhEQ1QobWJfdHlwZSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdldiggJmltZ19jYls0KjI8PHBpeGVsX3NoaWZ0XSwgbGluZXNpemUsIGJTMywgcXBjLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2V2KCAmaW1nX2NyWzQqMjw8cGl4ZWxfc2hpZnRdLCBsaW5lc2l6ZSwgYlMzLCBxcGMsIGEsIGIsIGgsIDApOworICAgICAgICAgICAgICAgICAgICBpZih0b3BfdHlwZSl7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWgoICZpbWdfY2JbNCowKmxpbmVzaXplXSwgbGluZXNpemUsIGJTSCwgcXBjMSwgYSwgYiwgaCwgMSApOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoKCAmaW1nX2NyWzQqMCpsaW5lc2l6ZV0sIGxpbmVzaXplLCBiU0gsIHFwYzEsIGEsIGIsIGgsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWgoICZpbWdfY2JbNCoyKmxpbmVzaXplXSwgbGluZXNpemUsIGJTMywgcXBjLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoKCAmaW1nX2NyWzQqMipsaW5lc2l6ZV0sIGxpbmVzaXplLCBiUzMsIHFwYywgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2V2KCAmaW1nX2NiWzQqMTw8cGl4ZWxfc2hpZnRdLCBsaW5lc2l6ZSwgYlMzLCBxcGMsIGEsIGIsIGgsIDApOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZXYoICZpbWdfY3JbNCoxPDxwaXhlbF9zaGlmdF0sIGxpbmVzaXplLCBiUzMsIHFwYywgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdldiggJmltZ19jYls0KjI8PHBpeGVsX3NoaWZ0XSwgbGluZXNpemUsIGJTMywgcXBjLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2V2KCAmaW1nX2NyWzQqMjw8cGl4ZWxfc2hpZnRdLCBsaW5lc2l6ZSwgYlMzLCBxcGMsIGEsIGIsIGgsIDApOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZXYoICZpbWdfY2JbNCozPDxwaXhlbF9zaGlmdF0sIGxpbmVzaXplLCBiUzMsIHFwYywgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdldiggJmltZ19jcls0KjM8PHBpeGVsX3NoaWZ0XSwgbGluZXNpemUsIGJTMywgcXBjLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYodG9wX3R5cGUpeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoKCAmaW1nX2NiWzQqMCpsaW5lc2l6ZV0sIGxpbmVzaXplLCBiU0gsIHFwYzEsIGEsIGIsIGgsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoKCAmaW1nX2NyWzQqMCpsaW5lc2l6ZV0sIGxpbmVzaXplLCBiU0gsIHFwYzEsIGEsIGIsIGgsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlaCggJmltZ19jYls0KjEqbGluZXNpemVdLCBsaW5lc2l6ZSwgYlMzLCBxcGMsIGEsIGIsIGgsIDApOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWgoICZpbWdfY3JbNCoxKmxpbmVzaXplXSwgbGluZXNpemUsIGJTMywgcXBjLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoKCAmaW1nX2NiWzQqMipsaW5lc2l6ZV0sIGxpbmVzaXplLCBiUzMsIHFwYywgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlaCggJmltZ19jcls0KjIqbGluZXNpemVdLCBsaW5lc2l6ZSwgYlMzLCBxcGMsIGEsIGIsIGgsIDApOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWgoICZpbWdfY2JbNCozKmxpbmVzaXplXSwgbGluZXNpemUsIGJTMywgcXBjLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoKCAmaW1nX2NyWzQqMypsaW5lc2l6ZV0sIGxpbmVzaXplLCBiUzMsIHFwYywgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYoY2hyb21hNDIyKXsKKyAgICAgICAgICAgICAgICBpZihsZWZ0X3R5cGUpeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWN2KCZpbWdfY2JbMiowPDxwaXhlbF9zaGlmdF0sIHV2bGluZXNpemUsIGJTNCwgcXBjMCwgYSwgYiwgaCwgMSk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY3YoJmltZ19jclsyKjA8PHBpeGVsX3NoaWZ0XSwgdXZsaW5lc2l6ZSwgYlM0LCBxcGMwLCBhLCBiLCBoLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VjdigmaW1nX2NiWzIqMjw8cGl4ZWxfc2hpZnRdLCB1dmxpbmVzaXplLCBiUzMsIHFwYywgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VjdigmaW1nX2NyWzIqMjw8cGl4ZWxfc2hpZnRdLCB1dmxpbmVzaXplLCBiUzMsIHFwYywgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgaWYodG9wX3R5cGUpeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWNoKCZpbWdfY2JbNCowKnV2bGluZXNpemVdLCB1dmxpbmVzaXplLCBiU0gsIHFwYzEsIGEsIGIsIGgsIDEpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWNoKCZpbWdfY3JbNCowKnV2bGluZXNpemVdLCB1dmxpbmVzaXplLCBiU0gsIHFwYzEsIGEsIGIsIGgsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWNoKCZpbWdfY2JbNCoxKnV2bGluZXNpemVdLCB1dmxpbmVzaXplLCBiUzMsIHFwYywgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VjaCgmaW1nX2NyWzQqMSp1dmxpbmVzaXplXSwgdXZsaW5lc2l6ZSwgYlMzLCBxcGMsIGEsIGIsIGgsIDApOworICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY2goJmltZ19jYls0KjIqdXZsaW5lc2l6ZV0sIHV2bGluZXNpemUsIGJTMywgcXBjLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWNoKCZpbWdfY3JbNCoyKnV2bGluZXNpemVdLCB1dmxpbmVzaXplLCBiUzMsIHFwYywgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VjaCgmaW1nX2NiWzQqMyp1dmxpbmVzaXplXSwgdXZsaW5lc2l6ZSwgYlMzLCBxcGMsIGEsIGIsIGgsIDApOworICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY2goJmltZ19jcls0KjMqdXZsaW5lc2l6ZV0sIHV2bGluZXNpemUsIGJTMywgcXBjLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKGxlZnRfdHlwZSl7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY3YoICZpbWdfY2JbMiowPDxwaXhlbF9zaGlmdF0sIHV2bGluZXNpemUsIGJTNCwgcXBjMCwgYSwgYiwgaCwgMSk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY3YoICZpbWdfY3JbMiowPDxwaXhlbF9zaGlmdF0sIHV2bGluZXNpemUsIGJTNCwgcXBjMCwgYSwgYiwgaCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY3YoICZpbWdfY2JbMioyPDxwaXhlbF9zaGlmdF0sIHV2bGluZXNpemUsIGJTMywgcXBjLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWN2KCAmaW1nX2NyWzIqMjw8cGl4ZWxfc2hpZnRdLCB1dmxpbmVzaXplLCBiUzMsIHFwYywgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgaWYodG9wX3R5cGUpeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWNoKCAmaW1nX2NiWzIqMCp1dmxpbmVzaXplXSwgdXZsaW5lc2l6ZSwgYlNILCBxcGMxLCBhLCBiLCBoLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VjaCggJmltZ19jclsyKjAqdXZsaW5lc2l6ZV0sIHV2bGluZXNpemUsIGJTSCwgcXBjMSwgYSwgYiwgaCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY2goICZpbWdfY2JbMioyKnV2bGluZXNpemVdLCB1dmxpbmVzaXplLCBiUzMsIHFwYywgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VjaCggJmltZ19jclsyKjIqdXZsaW5lc2l6ZV0sIHV2bGluZXNpemUsIGJTMywgcXBjLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9DQUxfQUxJR05FRF84KGludDE2X3QsIGJTLCBbMl0sIFs0XVs0XSk7CisgICAgICAgIGludCBlZGdlczsKKyAgICAgICAgaWYoIElTXzh4OERDVChtYl90eXBlKSAmJiAoaC0+Y2JwJjcpID09IDcgJiYgIWNocm9tYTQ0NCApIHsKKyAgICAgICAgICAgIGVkZ2VzID0gNDsKKyAgICAgICAgICAgIEFWX1dONjRBKGJTWzBdWzBdLCAweDAwMDIwMDAyMDAwMjAwMDJVTEwpOworICAgICAgICAgICAgQVZfV042NEEoYlNbMF1bMl0sIDB4MDAwMjAwMDIwMDAyMDAwMlVMTCk7CisgICAgICAgICAgICBBVl9XTjY0QShiU1sxXVswXSwgMHgwMDAyMDAwMjAwMDIwMDAyVUxMKTsKKyAgICAgICAgICAgIEFWX1dONjRBKGJTWzFdWzJdLCAweDAwMDIwMDAyMDAwMjAwMDJVTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IG1hc2tfZWRnZTEgPSAoMyooKCg1Km1iX3R5cGUpPj41KSYxKSkgfCAobWJfdHlwZT4+NCk7IC8vKG1iX3R5cGUgJiAoTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfOHgxNikpID8gMyA6IChtYl90eXBlICYgTUJfVFlQRV8xNng4KSA/IDEgOiAwOworICAgICAgICAgICAgaW50IG1hc2tfZWRnZTAgPSAzKigobWFza19lZGdlMT4+MSkgJiAoKDUqbGVmdF90eXBlKT4+NSkmMSk7IC8vIChtYl90eXBlICYgKE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFXzh4MTYpKSAmJiAoaC0+bGVmdF90eXBlW0xUT1BdICYgKE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFXzh4MTYpKSA/IDMgOiAwOworICAgICAgICAgICAgaW50IHN0ZXAgPSAgMSsobWJfdHlwZT4+MjQpOyAvL0lTXzh4OERDVChtYl90eXBlKSA/IDIgOiAxOworICAgICAgICAgICAgZWRnZXMgPSA0IC0gMyooKG1iX3R5cGU+PjMpICYgIShoLT5jYnAgJiAxNSkpOyAvLyhtYl90eXBlICYgTUJfVFlQRV8xNngxNikgJiYgIShoLT5jYnAgJiAxNSkgPyAxIDogNDsKKyAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9sb29wX2ZpbHRlcl9zdHJlbmd0aCggYlMsIGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlLCBoLT5yZWZfY2FjaGUsIGgtPm12X2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmxpc3RfY291bnQ9PTIsIGVkZ2VzLCBzdGVwLCBtYXNrX2VkZ2UwLCBtYXNrX2VkZ2UxLCBGSUVMRF9QSUNUVVJFKGgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiggSVNfSU5UUkEobGVmdF90eXBlKSApCisgICAgICAgICAgICBBVl9XTjY0QShiU1swXVswXSwgMHgwMDA0MDAwNDAwMDQwMDA0VUxMKTsKKyAgICAgICAgaWYoIElTX0lOVFJBKHRvcF90eXBlKSApCisgICAgICAgICAgICBBVl9XTjY0QShiU1sxXVswXSwgRklFTERfUElDVFVSRShoKSA/IDB4MDAwMzAwMDMwMDAzMDAwM1VMTCA6IDB4MDAwNDAwMDQwMDA0MDAwNFVMTCk7CisKKyNkZWZpbmUgRklMVEVSKGh2LGRpcixlZGdlLGludHJhKVwKKyAgICAgICAgaWYoQVZfUk42NEEoYlNbZGlyXVtlZGdlXSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlIyNodiggJmltZ195WzQqZWRnZSooZGlyP2xpbmVzaXplOjE8PHBpeGVsX3NoaWZ0KV0sIGxpbmVzaXplLCBiU1tkaXJdW2VkZ2VdLCBlZGdlID8gcXAgOiBxcCMjZGlyLCBhLCBiLCBoLCBpbnRyYSApO1wKKyAgICAgICAgICAgIGlmKGNocm9tYSl7XAorICAgICAgICAgICAgICAgIGlmKGNocm9tYTQ0NCl7XAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZSMjaHYoICZpbWdfY2JbNCplZGdlKihkaXI/bGluZXNpemU6MTw8cGl4ZWxfc2hpZnQpXSwgbGluZXNpemUsIGJTW2Rpcl1bZWRnZV0sIGVkZ2UgPyBxcGMgOiBxcGMjI2RpciwgYSwgYiwgaCwgaW50cmEgKTtcCisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlIyNodiggJmltZ19jcls0KmVkZ2UqKGRpcj9saW5lc2l6ZToxPDxwaXhlbF9zaGlmdCldLCBsaW5lc2l6ZSwgYlNbZGlyXVtlZGdlXSwgZWRnZSA/IHFwYyA6IHFwYyMjZGlyLCBhLCBiLCBoLCBpbnRyYSApO1wKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIShlZGdlJjEpKSB7XAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWMjI2h2KCAmaW1nX2NiWzIqZWRnZSooZGlyP3V2bGluZXNpemU6MTw8cGl4ZWxfc2hpZnQpXSwgdXZsaW5lc2l6ZSwgYlNbZGlyXVtlZGdlXSwgZWRnZSA/IHFwYyA6IHFwYyMjZGlyLCBhLCBiLCBoLCBpbnRyYSApO1wKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VjIyNodiggJmltZ19jclsyKmVkZ2UqKGRpcj91dmxpbmVzaXplOjE8PHBpeGVsX3NoaWZ0KV0sIHV2bGluZXNpemUsIGJTW2Rpcl1bZWRnZV0sIGVkZ2UgPyBxcGMgOiBxcGMjI2RpciwgYSwgYiwgaCwgaW50cmEgKTtcCisgICAgICAgICAgICAgICAgfVwKKyAgICAgICAgICAgIH1cCisgICAgICAgIH0KKyAgICAgICAgaWYobGVmdF90eXBlKQorICAgICAgICAgICAgRklMVEVSKHYsMCwwLDEpOworICAgICAgICBpZiggZWRnZXMgPT0gMSApIHsKKyAgICAgICAgICAgIGlmKHRvcF90eXBlKQorICAgICAgICAgICAgICAgIEZJTFRFUihoLDEsMCwxKTsKKyAgICAgICAgfSBlbHNlIGlmKCBJU184eDhEQ1QobWJfdHlwZSkgKSB7CisgICAgICAgICAgICBGSUxURVIodiwwLDIsMCk7CisgICAgICAgICAgICBpZih0b3BfdHlwZSkKKyAgICAgICAgICAgICAgICBGSUxURVIoaCwxLDAsMSk7CisgICAgICAgICAgICBGSUxURVIoaCwxLDIsMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGSUxURVIodiwwLDEsMCk7CisgICAgICAgICAgICBGSUxURVIodiwwLDIsMCk7CisgICAgICAgICAgICBGSUxURVIodiwwLDMsMCk7CisgICAgICAgICAgICBpZih0b3BfdHlwZSkKKyAgICAgICAgICAgICAgICBGSUxURVIoaCwxLDAsMSk7CisgICAgICAgICAgICBGSUxURVIoaCwxLDEsMCk7CisgICAgICAgICAgICBGSUxURVIoaCwxLDIsMCk7CisgICAgICAgICAgICBGSUxURVIoaCwxLDMsMCk7CisgICAgICAgIH0KKyN1bmRlZiBGSUxURVIKKyAgICB9Cit9CisKK3ZvaWQgZmZfaDI2NF9maWx0ZXJfbWJfZmFzdCggSDI2NENvbnRleHQgKmgsIGludCBtYl94LCBpbnQgbWJfeSwgdWludDhfdCAqaW1nX3ksIHVpbnQ4X3QgKmltZ19jYiwgdWludDhfdCAqaW1nX2NyLCB1bnNpZ25lZCBpbnQgbGluZXNpemUsIHVuc2lnbmVkIGludCB1dmxpbmVzaXplKSB7CisgICAgYXZfYXNzZXJ0MighRlJBTUVfTUJBRkYoaCkpOworICAgIGlmKCFoLT5oMjY0ZHNwLmgyNjRfbG9vcF9maWx0ZXJfc3RyZW5ndGggfHwgaC0+cHBzLmNocm9tYV9xcF9kaWZmKSB7CisgICAgICAgIGZmX2gyNjRfZmlsdGVyX21iKGgsIG1iX3gsIG1iX3ksIGltZ195LCBpbWdfY2IsIGltZ19jciwgbGluZXNpemUsIHV2bGluZXNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgQ09ORklHX1NNQUxMCisgICAgaDI2NF9maWx0ZXJfbWJfZmFzdF9pbnRlcm5hbChoLCBtYl94LCBtYl95LCBpbWdfeSwgaW1nX2NiLCBpbWdfY3IsIGxpbmVzaXplLCB1dmxpbmVzaXplLCBoLT5waXhlbF9zaGlmdCk7CisjZWxzZQorICAgIGlmKGgtPnBpeGVsX3NoaWZ0KXsKKyAgICAgICAgaDI2NF9maWx0ZXJfbWJfZmFzdF9pbnRlcm5hbChoLCBtYl94LCBtYl95LCBpbWdfeSwgaW1nX2NiLCBpbWdfY3IsIGxpbmVzaXplLCB1dmxpbmVzaXplLCAxKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgaDI2NF9maWx0ZXJfbWJfZmFzdF9pbnRlcm5hbChoLCBtYl94LCBtYl95LCBpbWdfeSwgaW1nX2NiLCBpbWdfY3IsIGxpbmVzaXplLCB1dmxpbmVzaXplLCAwKTsKKyAgICB9CisjZW5kaWYKK30KKworc3RhdGljIGludCBjaGVja19tdihIMjY0Q29udGV4dCAqaCwgbG9uZyBiX2lkeCwgbG9uZyBibl9pZHgsIGludCBtdnlfbGltaXQpeworICAgIGludCB2OworCisgICAgdj0gaC0+cmVmX2NhY2hlWzBdW2JfaWR4XSAhPSBoLT5yZWZfY2FjaGVbMF1bYm5faWR4XTsKKyAgICBpZighdiAmJiBoLT5yZWZfY2FjaGVbMF1bYl9pZHhdIT0tMSkKKyAgICAgICAgdj0gaC0+bXZfY2FjaGVbMF1bYl9pZHhdWzBdIC0gaC0+bXZfY2FjaGVbMF1bYm5faWR4XVswXSArIDMgPj0gN1UgfAorICAgICAgICAgICBGRkFCUyggaC0+bXZfY2FjaGVbMF1bYl9pZHhdWzFdIC0gaC0+bXZfY2FjaGVbMF1bYm5faWR4XVsxXSApID49IG12eV9saW1pdDsKKworICAgIGlmKGgtPmxpc3RfY291bnQ9PTIpeworICAgICAgICBpZighdikKKyAgICAgICAgICAgIHYgPSBoLT5yZWZfY2FjaGVbMV1bYl9pZHhdICE9IGgtPnJlZl9jYWNoZVsxXVtibl9pZHhdIHwKKyAgICAgICAgICAgICAgICBoLT5tdl9jYWNoZVsxXVtiX2lkeF1bMF0gLSBoLT5tdl9jYWNoZVsxXVtibl9pZHhdWzBdICsgMyA+PSA3VSB8CisgICAgICAgICAgICAgICAgRkZBQlMoIGgtPm12X2NhY2hlWzFdW2JfaWR4XVsxXSAtIGgtPm12X2NhY2hlWzFdW2JuX2lkeF1bMV0gKSA+PSBtdnlfbGltaXQ7CisKKyAgICAgICAgaWYodil7CisgICAgICAgICAgICBpZihoLT5yZWZfY2FjaGVbMF1bYl9pZHhdICE9IGgtPnJlZl9jYWNoZVsxXVtibl9pZHhdIHwKKyAgICAgICAgICAgICAgIGgtPnJlZl9jYWNoZVsxXVtiX2lkeF0gIT0gaC0+cmVmX2NhY2hlWzBdW2JuX2lkeF0pCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBoLT5tdl9jYWNoZVswXVtiX2lkeF1bMF0gLSBoLT5tdl9jYWNoZVsxXVtibl9pZHhdWzBdICsgMyA+PSA3VSB8CisgICAgICAgICAgICAgICAgRkZBQlMoIGgtPm12X2NhY2hlWzBdW2JfaWR4XVsxXSAtIGgtPm12X2NhY2hlWzFdW2JuX2lkeF1bMV0gKSA+PSBtdnlfbGltaXQgfAorICAgICAgICAgICAgICAgIGgtPm12X2NhY2hlWzFdW2JfaWR4XVswXSAtIGgtPm12X2NhY2hlWzBdW2JuX2lkeF1bMF0gKyAzID49IDdVIHwKKyAgICAgICAgICAgICAgICBGRkFCUyggaC0+bXZfY2FjaGVbMV1bYl9pZHhdWzFdIC0gaC0+bXZfY2FjaGVbMF1bYm5faWR4XVsxXSApID49IG12eV9saW1pdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZpbHRlcl9tYl9kaXIoSDI2NENvbnRleHQgKmgsIGludCBtYl94LCBpbnQgbWJfeSwgdWludDhfdCAqaW1nX3ksIHVpbnQ4X3QgKmltZ19jYiwgdWludDhfdCAqaW1nX2NyLCB1bnNpZ25lZCBpbnQgbGluZXNpemUsIHVuc2lnbmVkIGludCB1dmxpbmVzaXplLCBpbnQgbWJfeHksIGludCBtYl90eXBlLCBpbnQgbXZ5X2xpbWl0LCBpbnQgZmlyc3RfdmVydGljYWxfZWRnZV9kb25lLCBpbnQgYSwgaW50IGIsIGludCBjaHJvbWEsIGludCBkaXIpIHsKKyAgICBpbnQgZWRnZTsKKyAgICBpbnQgY2hyb21hX3FwX2F2Z1syXTsKKyAgICBpbnQgY2hyb21hNDQ0ID0gQ0hST01BNDQ0KGgpOworICAgIGludCBjaHJvbWE0MjIgPSBDSFJPTUE0MjIoaCk7CisgICAgY29uc3QgaW50IG1ibV94eSA9IGRpciA9PSAwID8gbWJfeHkgLTEgOiBoLT50b3BfbWJfeHk7CisgICAgY29uc3QgaW50IG1ibV90eXBlID0gZGlyID09IDAgPyBoLT5sZWZ0X3R5cGVbTFRPUF0gOiBoLT50b3BfdHlwZTsKKworICAgIC8vIGhvdyBvZnRlbiB0byByZWNoZWNrIG12LWJhc2VkIGJTIHdoZW4gaXRlcmF0aW5nIGJldHdlZW4gZWRnZXMKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBtYXNrX2VkZ2VfdGFiWzJdWzhdPXt7MCwzLDMsMywxLDEsMSwxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwzLDEsMSwzLDMsMywzfX07CisgICAgY29uc3QgaW50IG1hc2tfZWRnZSA9IG1hc2tfZWRnZV90YWJbZGlyXVsobWJfdHlwZT4+MykmN107CisgICAgY29uc3QgaW50IGVkZ2VzID0gbWFza19lZGdlPT0gMyAmJiAhKGgtPmNicCYxNSkgPyAxIDogNDsKKworICAgIC8vIGhvdyBvZnRlbiB0byByZWNoZWNrIG12LWJhc2VkIGJTIHdoZW4gaXRlcmF0aW5nIGFsb25nIGVhY2ggZWRnZQorICAgIGNvbnN0IGludCBtYXNrX3BhcjAgPSBtYl90eXBlICYgKE1CX1RZUEVfMTZ4MTYgfCAoTUJfVFlQRV84eDE2ID4+IGRpcikpOworCisgICAgaWYobWJtX3R5cGUgJiYgIWZpcnN0X3ZlcnRpY2FsX2VkZ2VfZG9uZSl7CisKKyAgICAgICAgaWYgKEZSQU1FX01CQUZGKGgpICYmIChkaXIgPT0gMSkgJiYgKChtYl95JjEpID09IDApCisgICAgICAgICAgICAmJiBJU19JTlRFUkxBQ0VEKG1ibV90eXBlJn5tYl90eXBlKQorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIGluIHRoZSBub3JtIHdoZXJlIHRoZSBmaWx0ZXJpbmcgbXVzdAorICAgICAgICAgICAgLy8gYmUgZG9uZSB0d2ljZSAob25lIGVhY2ggb2YgdGhlIGZpZWxkKSBldmVuIGlmIHdlIGFyZSBpbiBhCisgICAgICAgICAgICAvLyBmcmFtZSBtYWNyb2Jsb2NrLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB0bXBfbGluZXNpemUgICA9IDIgKiAgIGxpbmVzaXplOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcF91dmxpbmVzaXplID0gMiAqIHV2bGluZXNpemU7CisgICAgICAgICAgICBpbnQgbWJuX3h5ID0gbWJfeHkgLSAyICogaC0+bWJfc3RyaWRlOworICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgIGZvcihqPTA7IGo8MjsgaisrLCBtYm5feHkgKz0gaC0+bWJfc3RyaWRlKXsKKyAgICAgICAgICAgICAgICBERUNMQVJFX0FMSUdORUQoOCwgaW50MTZfdCwgYlMpWzRdOworICAgICAgICAgICAgICAgIGludCBxcDsKKyAgICAgICAgICAgICAgICBpZiAoSVNfSU5UUkEobWJfdHlwZSB8IGgtPmN1cl9waWMubWJfdHlwZVttYm5feHldKSkgeworICAgICAgICAgICAgICAgICAgICBBVl9XTjY0QShiUywgMHgwMDAzMDAwMzAwMDMwMDAzVUxMKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUNBQkFDKGgpICYmIElTXzh4OERDVChoLT5jdXJfcGljLm1iX3R5cGVbbWJuX3h5XSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTWzBdPSAxKygoaC0+Y2JwX3RhYmxlW21ibl94eV0gJiAweDQwMDApfHxoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFswXSswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiU1sxXT0gMSsoKGgtPmNicF90YWJsZVttYm5feHldICYgMHg0MDAwKXx8aC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbMF0rMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgYlNbMl09IDErKChoLT5jYnBfdGFibGVbbWJuX3h5XSAmIDB4ODAwMCl8fGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44WzBdKzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTWzNdPSAxKygoaC0+Y2JwX3RhYmxlW21ibl94eV0gJiAweDgwMDApfHxoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFswXSszXSk7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptYm5fbm56ID0gaC0+bm9uX3plcm9fY291bnRbbWJuX3h5XSArIDMqNDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiU1tpXSA9IDEgKyAhIShoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFswXStpXSB8IG1ibl9ubnpbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBzLT5xc2NhbGUgYXMgbHVtYSBxdWFudGl6ZXIgYmVjYXVzZSBpdCBoYXMgbm90IHRoZSBzYW1lCisgICAgICAgICAgICAgICAgLy8gdmFsdWUgaW4gSVBDTSBtYWNyb2Jsb2Nrcy4KKyAgICAgICAgICAgICAgICBxcCA9IChoLT5jdXJfcGljLnFzY2FsZV90YWJsZVttYl94eV0gKyBoLT5jdXJfcGljLnFzY2FsZV90YWJsZVttYm5feHldICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICB0cHJpbnRmKGgtPmF2Y3R4LCAiZmlsdGVyIG1iOiVkLyVkIGRpcjolZCBlZGdlOiVkLCBRUHk6JWQgbHM6JWQgdXZsczolZCIsIG1iX3gsIG1iX3ksIGRpciwgZWRnZSwgcXAsIHRtcF9saW5lc2l6ZSwgdG1wX3V2bGluZXNpemUpOworICAgICAgICAgICAgICAgIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHRwcmludGYoaC0+YXZjdHgsICIgYlNbJWRdOiVkIiwgaSwgYlNbaV0pOyB0cHJpbnRmKGgtPmF2Y3R4LCAiXG4iKTsgfQorICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlaCggJmltZ195W2oqbGluZXNpemVdLCB0bXBfbGluZXNpemUsIGJTLCBxcCwgYSwgYiwgaCwgMCApOworICAgICAgICAgICAgICAgIGNocm9tYV9xcF9hdmdbMF0gPSAoaC0+Y2hyb21hX3FwWzBdICsgZ2V0X2Nocm9tYV9xcChoLCAwLCBoLT5jdXJfcGljLnFzY2FsZV90YWJsZVttYm5feHldKSArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgY2hyb21hX3FwX2F2Z1sxXSA9IChoLT5jaHJvbWFfcXBbMV0gKyBnZXRfY2hyb21hX3FwKGgsIDEsIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW21ibl94eV0pICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICBpZiAoY2hyb21hKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaHJvbWE0NDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlaCAoJmltZ19jYltqKnV2bGluZXNpemVdLCB0bXBfdXZsaW5lc2l6ZSwgYlMsIGNocm9tYV9xcF9hdmdbMF0sIGEsIGIsIGgsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoICgmaW1nX2NyW2oqdXZsaW5lc2l6ZV0sIHRtcF91dmxpbmVzaXplLCBiUywgY2hyb21hX3FwX2F2Z1sxXSwgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWNoKCZpbWdfY2Jbaip1dmxpbmVzaXplXSwgdG1wX3V2bGluZXNpemUsIGJTLCBjaHJvbWFfcXBfYXZnWzBdLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY2goJmltZ19jcltqKnV2bGluZXNpemVdLCB0bXBfdXZsaW5lc2l6ZSwgYlMsIGNocm9tYV9xcF9hdmdbMV0sIGEsIGIsIGgsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIERFQ0xBUkVfQUxJR05FRCg4LCBpbnQxNl90LCBiUylbNF07CisgICAgICAgICAgICBpbnQgcXA7CisKKyAgICAgICAgICAgIGlmKCBJU19JTlRSQShtYl90eXBlfG1ibV90eXBlKSkgeworICAgICAgICAgICAgICAgIEFWX1dONjRBKGJTLCAweDAwMDMwMDAzMDAwMzAwMDNVTEwpOworICAgICAgICAgICAgICAgIGlmICggICAoIUlTX0lOVEVSTEFDRUQobWJfdHlwZXxtYm1fdHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoRlJBTUVfTUJBRkYoaCkgfHwgKGgtPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUUpKSAmJiAoZGlyID09IDApKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgQVZfV042NEEoYlMsIDB4MDAwNDAwMDQwMDA0MDAwNFVMTCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGludCBtdl9kb25lOworCisgICAgICAgICAgICAgICAgaWYoIGRpciAmJiBGUkFNRV9NQkFGRihoKSAmJiBJU19JTlRFUkxBQ0VEKG1iX3R5cGUgXiBtYm1fdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfV042NEEoYlMsIDB4MDAwMTAwMDEwMDAxMDAwMVVMTCk7CisgICAgICAgICAgICAgICAgICAgIG12X2RvbmUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBtYXNrX3BhcjAgJiYgKChtYm1fdHlwZSAmIChNQl9UWVBFXzE2eDE2IHwgKE1CX1RZUEVfOHgxNiA+PiBkaXIpKSkpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgYl9pZHg9IDggKyA0OworICAgICAgICAgICAgICAgICAgICBpbnQgYm5faWR4PSBiX2lkeCAtIChkaXIgPyA4OjEpOworCisgICAgICAgICAgICAgICAgICAgIGJTWzBdID0gYlNbMV0gPSBiU1syXSA9IGJTWzNdID0gY2hlY2tfbXYoaCwgOCArIDQsIGJuX2lkeCwgbXZ5X2xpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgbXZfZG9uZSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbXZfZG9uZSA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IGRpciA9PSAwID8gMCA6IGk7CisgICAgICAgICAgICAgICAgICAgIGludCB5ID0gZGlyID09IDAgPyBpICAgIDogMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJfaWR4PSA4ICsgNCArIHggKyA4Knk7CisgICAgICAgICAgICAgICAgICAgIGludCBibl9pZHg9IGJfaWR4IC0gKGRpciA/IDg6MSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW2JfaWR4XSB8CisgICAgICAgICAgICAgICAgICAgICAgICBoLT5ub25femVyb19jb3VudF9jYWNoZVtibl9pZHhdICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYlNbaV0gPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIW12X2RvbmUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTW2ldID0gY2hlY2tfbXYoaCwgYl9pZHgsIGJuX2lkeCwgbXZ5X2xpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRmlsdGVyIGVkZ2UgKi8KKyAgICAgICAgICAgIC8vIERvIG5vdCB1c2Ugcy0+cXNjYWxlIGFzIGx1bWEgcXVhbnRpemVyIGJlY2F1c2UgaXQgaGFzIG5vdCB0aGUgc2FtZQorICAgICAgICAgICAgLy8gdmFsdWUgaW4gSVBDTSBtYWNyb2Jsb2Nrcy4KKyAgICAgICAgICAgIGlmKGJTWzBdK2JTWzFdK2JTWzJdK2JTWzNdKXsKKyAgICAgICAgICAgICAgICBxcCA9IChoLT5jdXJfcGljLnFzY2FsZV90YWJsZVttYl94eV0gKyBoLT5jdXJfcGljLnFzY2FsZV90YWJsZVttYm1feHldICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICAvL3RwcmludGYoaC0+YXZjdHgsICJmaWx0ZXIgbWI6JWQvJWQgZGlyOiVkIGVkZ2U6JWQsIFFQeTolZCwgUVBjOiVkLCBRUGNuOiVkXG4iLCBtYl94LCBtYl95LCBkaXIsIGVkZ2UsIHFwLCBoLT5jaHJvbWFfcXBbMF0sIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW21ibl94eV0pOworICAgICAgICAgICAgICAgIHRwcmludGYoaC0+YXZjdHgsICJmaWx0ZXIgbWI6JWQvJWQgZGlyOiVkIGVkZ2U6JWQsIFFQeTolZCBsczolZCB1dmxzOiVkIiwgbWJfeCwgbWJfeSwgZGlyLCBlZGdlLCBxcCwgbGluZXNpemUsIHV2bGluZXNpemUpOworICAgICAgICAgICAgICAgIC8veyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgdHByaW50ZihoLT5hdmN0eCwgIiBiU1slZF06JWQiLCBpLCBiU1tpXSk7IHRwcmludGYoaC0+YXZjdHgsICJcbiIpOyB9CisgICAgICAgICAgICAgICAgY2hyb21hX3FwX2F2Z1swXSA9IChoLT5jaHJvbWFfcXBbMF0gKyBnZXRfY2hyb21hX3FwKGgsIDAsIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW21ibV94eV0pICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICBjaHJvbWFfcXBfYXZnWzFdID0gKGgtPmNocm9tYV9xcFsxXSArIGdldF9jaHJvbWFfcXAoaCwgMSwgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJtX3h5XSkgKyAxKSA+PiAxOworICAgICAgICAgICAgICAgIGlmKCBkaXIgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2V2KCAmaW1nX3lbMF0sIGxpbmVzaXplLCBiUywgcXAsIGEsIGIsIGgsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNocm9tYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocm9tYTQ0NCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdldiAoICZpbWdfY2JbMF0sIHV2bGluZXNpemUsIGJTLCBjaHJvbWFfcXBfYXZnWzBdLCBhLCBiLCBoLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZXYgKCAmaW1nX2NyWzBdLCB1dmxpbmVzaXplLCBiUywgY2hyb21hX3FwX2F2Z1sxXSwgYSwgYiwgaCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY3YoICZpbWdfY2JbMF0sIHV2bGluZXNpemUsIGJTLCBjaHJvbWFfcXBfYXZnWzBdLCBhLCBiLCBoLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWN2KCAmaW1nX2NyWzBdLCB1dmxpbmVzaXplLCBiUywgY2hyb21hX3FwX2F2Z1sxXSwgYSwgYiwgaCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWgoICZpbWdfeVswXSwgbGluZXNpemUsIGJTLCBxcCwgYSwgYiwgaCwgMSApOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hyb21hKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyb21hNDQ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoICggJmltZ19jYlswXSwgdXZsaW5lc2l6ZSwgYlMsIGNocm9tYV9xcF9hdmdbMF0sIGEsIGIsIGgsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlaCAoICZpbWdfY3JbMF0sIHV2bGluZXNpemUsIGJTLCBjaHJvbWFfcXBfYXZnWzFdLCBhLCBiLCBoLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VjaCggJmltZ19jYlswXSwgdXZsaW5lc2l6ZSwgYlMsIGNocm9tYV9xcF9hdmdbMF0sIGEsIGIsIGgsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY2goICZpbWdfY3JbMF0sIHV2bGluZXNpemUsIGJTLCBjaHJvbWFfcXBfYXZnWzFdLCBhLCBiLCBoLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBiUyAqLworICAgIGZvciggZWRnZSA9IDE7IGVkZ2UgPCBlZGdlczsgZWRnZSsrICkgeworICAgICAgICBERUNMQVJFX0FMSUdORUQoOCwgaW50MTZfdCwgYlMpWzRdOworICAgICAgICBpbnQgcXA7CisgICAgICAgIGNvbnN0IGludCBkZWJsb2NrX2VkZ2UgPSAhSVNfOHg4RENUKG1iX3R5cGUgJiAoZWRnZTw8MjQpKTsgLy8gKGVkZ2UmMSkgJiYgSVNfOHg4RENUKG1iX3R5cGUpCisKKyAgICAgICAgaWYgKCFkZWJsb2NrX2VkZ2UgJiYgKCFjaHJvbWE0MjIgfHwgZGlyID09IDApKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYoIElTX0lOVFJBKG1iX3R5cGUpKSB7CisgICAgICAgICAgICBBVl9XTjY0QShiUywgMHgwMDAzMDAwMzAwMDMwMDAzVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaW50IG12X2RvbmU7CisKKyAgICAgICAgICAgIGlmKCBlZGdlICYgbWFza19lZGdlICkgeworICAgICAgICAgICAgICAgIEFWX1pFUk82NChiUyk7CisgICAgICAgICAgICAgICAgbXZfZG9uZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBtYXNrX3BhcjAgKSB7CisgICAgICAgICAgICAgICAgaW50IGJfaWR4PSA4ICsgNCArIGVkZ2UgKiAoZGlyID8gODoxKTsKKyAgICAgICAgICAgICAgICBpbnQgYm5faWR4PSBiX2lkeCAtIChkaXIgPyA4OjEpOworCisgICAgICAgICAgICAgICAgYlNbMF0gPSBiU1sxXSA9IGJTWzJdID0gYlNbM10gPSBjaGVja19tdihoLCBiX2lkeCwgYm5faWR4LCBtdnlfbGltaXQpOworICAgICAgICAgICAgICAgIG12X2RvbmUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG12X2RvbmUgPSAwOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkgeworICAgICAgICAgICAgICAgIGludCB4ID0gZGlyID09IDAgPyBlZGdlIDogaTsKKyAgICAgICAgICAgICAgICBpbnQgeSA9IGRpciA9PSAwID8gaSAgICA6IGVkZ2U7CisgICAgICAgICAgICAgICAgaW50IGJfaWR4PSA4ICsgNCArIHggKyA4Knk7CisgICAgICAgICAgICAgICAgaW50IGJuX2lkeD0gYl9pZHggLSAoZGlyID8gODoxKTsKKworICAgICAgICAgICAgICAgIGlmKCBoLT5ub25femVyb19jb3VudF9jYWNoZVtiX2lkeF0gfAorICAgICAgICAgICAgICAgICAgICBoLT5ub25femVyb19jb3VudF9jYWNoZVtibl9pZHhdICkgeworICAgICAgICAgICAgICAgICAgICBiU1tpXSA9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIW12X2RvbmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiU1tpXSA9IGNoZWNrX212KGgsIGJfaWR4LCBibl9pZHgsIG12eV9saW1pdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihiU1swXStiU1sxXStiU1syXStiU1szXSA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogRmlsdGVyIGVkZ2UgKi8KKyAgICAgICAgLy8gRG8gbm90IHVzZSBzLT5xc2NhbGUgYXMgbHVtYSBxdWFudGl6ZXIgYmVjYXVzZSBpdCBoYXMgbm90IHRoZSBzYW1lCisgICAgICAgIC8vIHZhbHVlIGluIElQQ00gbWFjcm9ibG9ja3MuCisgICAgICAgIHFwID0gaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHldOworICAgICAgICAvL3RwcmludGYoaC0+YXZjdHgsICJmaWx0ZXIgbWI6JWQvJWQgZGlyOiVkIGVkZ2U6JWQsIFFQeTolZCwgUVBjOiVkLCBRUGNuOiVkXG4iLCBtYl94LCBtYl95LCBkaXIsIGVkZ2UsIHFwLCBoLT5jaHJvbWFfcXBbMF0sIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW21ibl94eV0pOworICAgICAgICB0cHJpbnRmKGgtPmF2Y3R4LCAiZmlsdGVyIG1iOiVkLyVkIGRpcjolZCBlZGdlOiVkLCBRUHk6JWQgbHM6JWQgdXZsczolZCIsIG1iX3gsIG1iX3ksIGRpciwgZWRnZSwgcXAsIGxpbmVzaXplLCB1dmxpbmVzaXplKTsKKyAgICAgICAgLy97IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB0cHJpbnRmKGgtPmF2Y3R4LCAiIGJTWyVkXTolZCIsIGksIGJTW2ldKTsgdHByaW50ZihoLT5hdmN0eCwgIlxuIik7IH0KKyAgICAgICAgaWYoIGRpciA9PSAwICkgeworICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2V2KCAmaW1nX3lbNCplZGdlIDw8IGgtPnBpeGVsX3NoaWZ0XSwgbGluZXNpemUsIGJTLCBxcCwgYSwgYiwgaCwgMCApOworICAgICAgICAgICAgaWYgKGNocm9tYSkgeworICAgICAgICAgICAgICAgIGlmIChjaHJvbWE0NDQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2V2ICggJmltZ19jYls0KmVkZ2UgPDwgaC0+cGl4ZWxfc2hpZnRdLCB1dmxpbmVzaXplLCBiUywgaC0+Y2hyb21hX3FwWzBdLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2V2ICggJmltZ19jcls0KmVkZ2UgPDwgaC0+cGl4ZWxfc2hpZnRdLCB1dmxpbmVzaXplLCBiUywgaC0+Y2hyb21hX3FwWzFdLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIChlZGdlJjEpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY3YoICZpbWdfY2JbMiplZGdlIDw8IGgtPnBpeGVsX3NoaWZ0XSwgdXZsaW5lc2l6ZSwgYlMsIGgtPmNocm9tYV9xcFswXSwgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY3YoICZpbWdfY3JbMiplZGdlIDw8IGgtPnBpeGVsX3NoaWZ0XSwgdXZsaW5lc2l6ZSwgYlMsIGgtPmNocm9tYV9xcFsxXSwgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNocm9tYTQyMikgeworICAgICAgICAgICAgICAgIGlmIChkZWJsb2NrX2VkZ2UpCisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlaCgmaW1nX3lbNCplZGdlKmxpbmVzaXplXSwgbGluZXNpemUsIGJTLCBxcCwgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKGNocm9tYSkgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWNoKCZpbWdfY2JbNCplZGdlKnV2bGluZXNpemVdLCB1dmxpbmVzaXplLCBiUywgaC0+Y2hyb21hX3FwWzBdLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VjaCgmaW1nX2NyWzQqZWRnZSp1dmxpbmVzaXplXSwgdXZsaW5lc2l6ZSwgYlMsIGgtPmNocm9tYV9xcFsxXSwgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWgoJmltZ195WzQqZWRnZSpsaW5lc2l6ZV0sIGxpbmVzaXplLCBiUywgcXAsIGEsIGIsIGgsIDApOworICAgICAgICAgICAgICAgIGlmIChjaHJvbWEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNocm9tYTQ0NCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX2VkZ2VoICgmaW1nX2NiWzQqZWRnZSp1dmxpbmVzaXplXSwgdXZsaW5lc2l6ZSwgYlMsIGgtPmNocm9tYV9xcFswXSwgYSwgYiwgaCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWggKCZpbWdfY3JbNCplZGdlKnV2bGluZXNpemVdLCB1dmxpbmVzaXplLCBiUywgaC0+Y2hyb21hX3FwWzFdLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZWRnZSYxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWNoKCZpbWdfY2JbMiplZGdlKnV2bGluZXNpemVdLCB1dmxpbmVzaXplLCBiUywgaC0+Y2hyb21hX3FwWzBdLCBhLCBiLCBoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9lZGdlY2goJmltZ19jclsyKmVkZ2UqdXZsaW5lc2l6ZV0sIHV2bGluZXNpemUsIGJTLCBoLT5jaHJvbWFfcXBbMV0sIGEsIGIsIGgsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZmX2gyNjRfZmlsdGVyX21iKCBIMjY0Q29udGV4dCAqaCwgaW50IG1iX3gsIGludCBtYl95LCB1aW50OF90ICppbWdfeSwgdWludDhfdCAqaW1nX2NiLCB1aW50OF90ICppbWdfY3IsIHVuc2lnbmVkIGludCBsaW5lc2l6ZSwgdW5zaWduZWQgaW50IHV2bGluZXNpemUpIHsKKyAgICBjb25zdCBpbnQgbWJfeHk9IG1iX3ggKyBtYl95KmgtPm1iX3N0cmlkZTsKKyAgICBjb25zdCBpbnQgbWJfdHlwZSA9IGgtPmN1cl9waWMubWJfdHlwZVttYl94eV07CisgICAgY29uc3QgaW50IG12eV9saW1pdCA9IElTX0lOVEVSTEFDRUQobWJfdHlwZSkgPyAyIDogNDsKKyAgICBpbnQgZmlyc3RfdmVydGljYWxfZWRnZV9kb25lID0gMDsKKyAgICBpbnQgY2hyb21hID0gQ0hST01BKGgpICYmICEoQ09ORklHX0dSQVkgJiYgKGgtPmZsYWdzJkNPREVDX0ZMQUdfR1JBWSkpOworICAgIGludCBxcF9iZF9vZmZzZXQgPSA2ICogKGgtPnNwcy5iaXRfZGVwdGhfbHVtYSAtIDgpOworICAgIGludCBhID0gNTIgKyBoLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQgLSBxcF9iZF9vZmZzZXQ7CisgICAgaW50IGIgPSA1MiArIGgtPnNsaWNlX2JldGFfb2Zmc2V0IC0gcXBfYmRfb2Zmc2V0OworCisgICAgaWYgKEZSQU1FX01CQUZGKGgpCisgICAgICAgICAgICAvLyBhbmQgY3VycmVudCBhbmQgbGVmdCBwYWlyIGRvIG5vdCBoYXZlIHRoZSBzYW1lIGludGVybGFjZWQgdHlwZQorICAgICAgICAgICAgJiYgSVNfSU5URVJMQUNFRChtYl90eXBlXmgtPmxlZnRfdHlwZVtMVE9QXSkKKyAgICAgICAgICAgIC8vIGFuZCBsZWZ0IG1iIGlzIGluIGF2YWlsYWJsZSB0byB1cworICAgICAgICAgICAgJiYgaC0+bGVmdF90eXBlW0xUT1BdKSB7CisgICAgICAgIC8qIEZpcnN0IHZlcnRpY2FsIGVkZ2UgaXMgZGlmZmVyZW50IGluIE1CQUZGIGZyYW1lcworICAgICAgICAgKiBUaGVyZSBhcmUgOCBkaWZmZXJlbnQgYlMgdG8gY29tcHV0ZSBhbmQgMiBkaWZmZXJlbnQgUXAKKyAgICAgICAgICovCisgICAgICAgIERFQ0xBUkVfQUxJR05FRCg4LCBpbnQxNl90LCBiUylbOF07CisgICAgICAgIGludCBxcFsyXTsKKyAgICAgICAgaW50IGJxcFsyXTsKKyAgICAgICAgaW50IHJxcFsyXTsKKyAgICAgICAgaW50IG1iX3FwLCBtYm4wX3FwLCBtYm4xX3FwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZmlyc3RfdmVydGljYWxfZWRnZV9kb25lID0gMTsKKworICAgICAgICBpZiggSVNfSU5UUkEobWJfdHlwZSkgKSB7CisgICAgICAgICAgICBBVl9XTjY0QSgmYlNbMF0sIDB4MDAwNDAwMDQwMDA0MDAwNFVMTCk7CisgICAgICAgICAgICBBVl9XTjY0QSgmYlNbNF0sIDB4MDAwNDAwMDQwMDA0MDAwNFVMTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBvZmZzZXRbMl1bMl1bOF09eworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgezMrNCowLCAzKzQqMCwgMys0KjAsIDMrNCowLCAzKzQqMSwgMys0KjEsIDMrNCoxLCAzKzQqMX0sCisgICAgICAgICAgICAgICAgICAgIHszKzQqMiwgMys0KjIsIDMrNCoyLCAzKzQqMiwgMys0KjMsIDMrNCozLCAzKzQqMywgMys0KjN9LAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICB7Mys0KjAsIDMrNCoxLCAzKzQqMiwgMys0KjMsIDMrNCowLCAzKzQqMSwgMys0KjIsIDMrNCozfSwKKyAgICAgICAgICAgICAgICAgICAgezMrNCowLCAzKzQqMSwgMys0KjIsIDMrNCozLCAzKzQqMCwgMys0KjEsIDMrNCoyLCAzKzQqM30sCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm9mZj0gb2Zmc2V0W01CX0ZJRUxEKGgpXVttYl95JjFdOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpbnQgaj0gTUJfRklFTEQoaCkgPyBpPj4yIDogaSYxOworICAgICAgICAgICAgICAgIGludCBtYm5feHkgPSBoLT5sZWZ0X21iX3h5W0xFRlQoaildOworICAgICAgICAgICAgICAgIGludCBtYm5fdHlwZT0gaC0+bGVmdF90eXBlW0xFRlQoaildOworCisgICAgICAgICAgICAgICAgaWYoIElTX0lOVFJBKCBtYm5fdHlwZSApICkKKyAgICAgICAgICAgICAgICAgICAgYlNbaV0gPSA0OworICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgIGJTW2ldID0gMSArICEhKGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlWzEyKzgqKGk+PjEpXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKCghaC0+cHBzLmNhYmFjICYmIElTXzh4OERDVChtYm5fdHlwZSkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaC0+Y2JwX3RhYmxlW21ibl94eV0gJiAoKChNQl9GSUVMRChoKSA/IChpJjIpIDogKG1iX3kmMSkpID8gOCA6IDIpIDw8IDEyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm5vbl96ZXJvX2NvdW50W21ibl94eV1bIG9mZltpXSBdKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWJfcXAgICA9IGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW21iX3h5XTsKKyAgICAgICAgbWJuMF9xcCA9IGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW2gtPmxlZnRfbWJfeHlbMF1dOworICAgICAgICBtYm4xX3FwID0gaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbaC0+bGVmdF9tYl94eVsxXV07CisgICAgICAgIHFwWzBdID0gKCBtYl9xcCArIG1ibjBfcXAgKyAxICkgPj4gMTsKKyAgICAgICAgYnFwWzBdID0gKCBnZXRfY2hyb21hX3FwKCBoLCAwLCBtYl9xcCApICsKKyAgICAgICAgICAgICAgICAgICBnZXRfY2hyb21hX3FwKCBoLCAwLCBtYm4wX3FwICkgKyAxICkgPj4gMTsKKyAgICAgICAgcnFwWzBdID0gKCBnZXRfY2hyb21hX3FwKCBoLCAxLCBtYl9xcCApICsKKyAgICAgICAgICAgICAgICAgICBnZXRfY2hyb21hX3FwKCBoLCAxLCBtYm4wX3FwICkgKyAxICkgPj4gMTsKKyAgICAgICAgcXBbMV0gPSAoIG1iX3FwICsgbWJuMV9xcCArIDEgKSA+PiAxOworICAgICAgICBicXBbMV0gPSAoIGdldF9jaHJvbWFfcXAoIGgsIDAsIG1iX3FwICkgKworICAgICAgICAgICAgICAgICAgIGdldF9jaHJvbWFfcXAoIGgsIDAsIG1ibjFfcXAgKSArIDEgKSA+PiAxOworICAgICAgICBycXBbMV0gPSAoIGdldF9jaHJvbWFfcXAoIGgsIDEsIG1iX3FwICkgKworICAgICAgICAgICAgICAgICAgIGdldF9jaHJvbWFfcXAoIGgsIDEsIG1ibjFfcXAgKSArIDEgKSA+PiAxOworCisgICAgICAgIC8qIEZpbHRlciBlZGdlICovCisgICAgICAgIHRwcmludGYoaC0+YXZjdHgsICJmaWx0ZXIgbWI6JWQvJWQgTUJBRkYsIFFQeTolZC8lZCwgUVBiOiVkLyVkIFFQcjolZC8lZCBsczolZCB1dmxzOiVkIiwgbWJfeCwgbWJfeSwgcXBbMF0sIHFwWzFdLCBicXBbMF0sIGJxcFsxXSwgcnFwWzBdLCBycXBbMV0sIGxpbmVzaXplLCB1dmxpbmVzaXplKTsKKyAgICAgICAgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgdHByaW50ZihoLT5hdmN0eCwgIiBiU1slZF06JWQiLCBpLCBiU1tpXSk7IHRwcmludGYoaC0+YXZjdHgsICJcbiIpOyB9CisgICAgICAgIGlmIChNQl9GSUVMRChoKSkgeworICAgICAgICAgICAgZmlsdGVyX21iX21iYWZmX2VkZ2V2ICggaCwgaW1nX3kgICAgICAgICAgICAgICAgLCAgIGxpbmVzaXplLCBiUyAgLCAxLCBxcCBbMF0sIGEsIGIsIDEgKTsKKyAgICAgICAgICAgIGZpbHRlcl9tYl9tYmFmZl9lZGdldiAoIGgsIGltZ195ICArIDgqICBsaW5lc2l6ZSwgICBsaW5lc2l6ZSwgYlMrNCwgMSwgcXAgWzFdLCBhLCBiLCAxICk7CisgICAgICAgICAgICBpZiAoY2hyb21hKXsKKyAgICAgICAgICAgICAgICBpZiAoQ0hST01BNDQ0KGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9tYmFmZl9lZGdldiAoIGgsIGltZ19jYiwgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgYlMgICwgMSwgYnFwWzBdLCBhLCBiLCAxICk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9tYmFmZl9lZGdldiAoIGgsIGltZ19jYiArIDgqdXZsaW5lc2l6ZSwgdXZsaW5lc2l6ZSwgYlMrNCwgMSwgYnFwWzFdLCBhLCBiLCAxICk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9tYmFmZl9lZGdldiAoIGgsIGltZ19jciwgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgYlMgICwgMSwgcnFwWzBdLCBhLCBiLCAxICk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9tYmFmZl9lZGdldiAoIGgsIGltZ19jciArIDgqdXZsaW5lc2l6ZSwgdXZsaW5lc2l6ZSwgYlMrNCwgMSwgcnFwWzFdLCBhLCBiLCAxICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDSFJPTUE0MjIoaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX21iYWZmX2VkZ2VjdihoLCBpbWdfY2IsICAgICAgICAgICAgICAgIHV2bGluZXNpemUsIGJTICAsIDEsIGJxcFswXSwgYSwgYiwgMSk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9tYmFmZl9lZGdlY3YoaCwgaW1nX2NiICsgOCp1dmxpbmVzaXplLCB1dmxpbmVzaXplLCBiUys0LCAxLCBicXBbMV0sIGEsIGIsIDEpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfbWJhZmZfZWRnZWN2KGgsIGltZ19jciwgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgYlMgICwgMSwgcnFwWzBdLCBhLCBiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21iX21iYWZmX2VkZ2VjdihoLCBpbWdfY3IgKyA4KnV2bGluZXNpemUsIHV2bGluZXNpemUsIGJTKzQsIDEsIHJxcFsxXSwgYSwgYiwgMSk7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9tYmFmZl9lZGdlY3YoIGgsIGltZ19jYiwgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgYlMgICwgMSwgYnFwWzBdLCBhLCBiLCAxICk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9tYmFmZl9lZGdlY3YoIGgsIGltZ19jYiArIDQqdXZsaW5lc2l6ZSwgdXZsaW5lc2l6ZSwgYlMrNCwgMSwgYnFwWzFdLCBhLCBiLCAxICk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9tYmFmZl9lZGdlY3YoIGgsIGltZ19jciwgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgYlMgICwgMSwgcnFwWzBdLCBhLCBiLCAxICk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYl9tYmFmZl9lZGdlY3YoIGgsIGltZ19jciArIDQqdXZsaW5lc2l6ZSwgdXZsaW5lc2l6ZSwgYlMrNCwgMSwgcnFwWzFdLCBhLCBiLCAxICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGZpbHRlcl9tYl9tYmFmZl9lZGdldiAoIGgsIGltZ195ICAgICAgICAgICAgICAsIDIqICBsaW5lc2l6ZSwgYlMgICwgMiwgcXAgWzBdLCBhLCBiLCAxICk7CisgICAgICAgICAgICBmaWx0ZXJfbWJfbWJhZmZfZWRnZXYgKCBoLCBpbWdfeSAgKyAgIGxpbmVzaXplLCAyKiAgbGluZXNpemUsIGJTKzEsIDIsIHFwIFsxXSwgYSwgYiwgMSApOworICAgICAgICAgICAgaWYgKGNocm9tYSl7CisgICAgICAgICAgICAgICAgaWYgKENIUk9NQTQ0NChoKSkgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfbWJhZmZfZWRnZXYgKCBoLCBpbWdfY2IsICAgICAgICAgICAgICAyKnV2bGluZXNpemUsIGJTICAsIDIsIGJxcFswXSwgYSwgYiwgMSApOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfbWJhZmZfZWRnZXYgKCBoLCBpbWdfY2IgKyB1dmxpbmVzaXplLCAyKnV2bGluZXNpemUsIGJTKzEsIDIsIGJxcFsxXSwgYSwgYiwgMSApOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfbWJhZmZfZWRnZXYgKCBoLCBpbWdfY3IsICAgICAgICAgICAgICAyKnV2bGluZXNpemUsIGJTICAsIDIsIHJxcFswXSwgYSwgYiwgMSApOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfbWJhZmZfZWRnZXYgKCBoLCBpbWdfY3IgKyB1dmxpbmVzaXplLCAyKnV2bGluZXNpemUsIGJTKzEsIDIsIHJxcFsxXSwgYSwgYiwgMSApOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfbWJhZmZfZWRnZWN2KCBoLCBpbWdfY2IsICAgICAgICAgICAgICAyKnV2bGluZXNpemUsIGJTICAsIDIsIGJxcFswXSwgYSwgYiwgMSApOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfbWJhZmZfZWRnZWN2KCBoLCBpbWdfY2IgKyB1dmxpbmVzaXplLCAyKnV2bGluZXNpemUsIGJTKzEsIDIsIGJxcFsxXSwgYSwgYiwgMSApOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfbWJhZmZfZWRnZWN2KCBoLCBpbWdfY3IsICAgICAgICAgICAgICAyKnV2bGluZXNpemUsIGJTICAsIDIsIHJxcFswXSwgYSwgYiwgMSApOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfbWJhZmZfZWRnZWN2KCBoLCBpbWdfY3IgKyB1dmxpbmVzaXplLCAyKnV2bGluZXNpemUsIGJTKzEsIDIsIHJxcFsxXSwgYSwgYiwgMSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworI2lmIENPTkZJR19TTUFMTAorICAgIHsKKyAgICAgICAgaW50IGRpcjsKKyAgICAgICAgZm9yIChkaXIgPSAwOyBkaXIgPCAyOyBkaXIrKykKKyAgICAgICAgICAgIGZpbHRlcl9tYl9kaXIoaCwgbWJfeCwgbWJfeSwgaW1nX3ksIGltZ19jYiwgaW1nX2NyLCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgbWJfeHksIG1iX3R5cGUsIG12eV9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyID8gMCA6IGZpcnN0X3ZlcnRpY2FsX2VkZ2VfZG9uZSwgYSwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21hLCBkaXIpOworICAgIH0KKyNlbHNlCisgICAgZmlsdGVyX21iX2RpcihoLCBtYl94LCBtYl95LCBpbWdfeSwgaW1nX2NiLCBpbWdfY3IsIGxpbmVzaXplLCB1dmxpbmVzaXplLCBtYl94eSwgbWJfdHlwZSwgbXZ5X2xpbWl0LCBmaXJzdF92ZXJ0aWNhbF9lZGdlX2RvbmUsIGEsIGIsIGNocm9tYSwgMCk7CisgICAgZmlsdGVyX21iX2RpcihoLCBtYl94LCBtYl95LCBpbWdfeSwgaW1nX2NiLCBpbWdfY3IsIGxpbmVzaXplLCB1dmxpbmVzaXplLCBtYl94eSwgbWJfdHlwZSwgbXZ5X2xpbWl0LCAwLCAgICAgICAgICAgICAgICAgICAgICAgIGEsIGIsIGNocm9tYSwgMSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfbWIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfbWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQwNmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9tYi5jCkBAIC0wLDAgKzEsODI3IEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIG1hY3JvYmxvY2sgZGVjb2RpbmcKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJxcGVsZHNwLmgiCisjaW5jbHVkZSAic3ZxMy5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCitzdGF0aWMgaW5saW5lIGludCBnZXRfbG93ZXN0X3BhcnRfbGlzdF95KEgyNjRDb250ZXh0ICpoLCBIMjY0UGljdHVyZSAqcGljLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IHlfb2Zmc2V0LCBpbnQgbGlzdCkKK3sKKyAgICBpbnQgcmF3X215ICAgICAgICAgICAgID0gaC0+bXZfY2FjaGVbbGlzdF1bc2Nhbjhbbl1dWzFdOworICAgIGludCBmaWx0ZXJfaGVpZ2h0X2Rvd24gPSAocmF3X215ICYgMykgPyAzIDogMDsKKyAgICBpbnQgZnVsbF9teSAgICAgICAgICAgID0gKHJhd19teSA+PiAyKSArIHlfb2Zmc2V0OworICAgIGludCBib3R0b20gICAgICAgICAgICAgPSBmdWxsX215ICsgZmlsdGVyX2hlaWdodF9kb3duICsgaGVpZ2h0OworCisgICAgYXZfYXNzZXJ0MihoZWlnaHQgPj0gMCk7CisKKyAgICByZXR1cm4gRkZNQVgoMCwgYm90dG9tKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdldF9sb3dlc3RfcGFydF95KEgyNjRDb250ZXh0ICpoLCBpbnQxNl90IHJlZnNbMl1bNDhdLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgeV9vZmZzZXQsIGludCBsaXN0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdDEsIGludCAqbnJlZnMpCit7CisgICAgaW50IG15OworCisgICAgeV9vZmZzZXQgKz0gMTYgKiAoaC0+bWJfeSA+PiBNQl9GSUVMRChoKSk7CisKKyAgICBpZiAobGlzdDApIHsKKyAgICAgICAgaW50IHJlZl9uID0gaC0+cmVmX2NhY2hlWzBdW3NjYW44W25dXTsKKyAgICAgICAgSDI2NFBpY3R1cmUgKnJlZiA9ICZoLT5yZWZfbGlzdFswXVtyZWZfbl07CisKKyAgICAgICAgLy8gRXJyb3IgcmVzaWxpZW5jZSBwdXRzIHRoZSBjdXJyZW50IHBpY3R1cmUgaW4gdGhlIHJlZiBsaXN0LgorICAgICAgICAvLyBEb24ndCB0cnkgdG8gd2FpdCBvbiB0aGVzZSBhcyBpdCB3aWxsIGNhdXNlIGEgZGVhZGxvY2suCisgICAgICAgIC8vIEZpZWxkcyBjYW4gd2FpdCBvbiBlYWNoIG90aGVyLCB0aG91Z2guCisgICAgICAgIGlmIChyZWYtPnRmLnByb2dyZXNzLT5kYXRhICE9IGgtPmN1cl9waWMudGYucHJvZ3Jlc3MtPmRhdGEgfHwKKyAgICAgICAgICAgIChyZWYtPnJlZmVyZW5jZSAmIDMpICE9IGgtPnBpY3R1cmVfc3RydWN0dXJlKSB7CisgICAgICAgICAgICBteSA9IGdldF9sb3dlc3RfcGFydF9saXN0X3koaCwgcmVmLCBuLCBoZWlnaHQsIHlfb2Zmc2V0LCAwKTsKKyAgICAgICAgICAgIGlmIChyZWZzWzBdW3JlZl9uXSA8IDApCisgICAgICAgICAgICAgICAgbnJlZnNbMF0gKz0gMTsKKyAgICAgICAgICAgIHJlZnNbMF1bcmVmX25dID0gRkZNQVgocmVmc1swXVtyZWZfbl0sIG15KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsaXN0MSkgeworICAgICAgICBpbnQgcmVmX24gICAgPSBoLT5yZWZfY2FjaGVbMV1bc2Nhbjhbbl1dOworICAgICAgICBIMjY0UGljdHVyZSAqcmVmID0gJmgtPnJlZl9saXN0WzFdW3JlZl9uXTsKKworICAgICAgICBpZiAocmVmLT50Zi5wcm9ncmVzcy0+ZGF0YSAhPSBoLT5jdXJfcGljLnRmLnByb2dyZXNzLT5kYXRhIHx8CisgICAgICAgICAgICAocmVmLT5yZWZlcmVuY2UgJiAzKSAhPSBoLT5waWN0dXJlX3N0cnVjdHVyZSkgeworICAgICAgICAgICAgbXkgPSBnZXRfbG93ZXN0X3BhcnRfbGlzdF95KGgsIHJlZiwgbiwgaGVpZ2h0LCB5X29mZnNldCwgMSk7CisgICAgICAgICAgICBpZiAocmVmc1sxXVtyZWZfbl0gPCAwKQorICAgICAgICAgICAgICAgIG5yZWZzWzFdICs9IDE7CisgICAgICAgICAgICByZWZzWzFdW3JlZl9uXSA9IEZGTUFYKHJlZnNbMV1bcmVmX25dLCBteSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogV2FpdCB1bnRpbCBhbGwgcmVmZXJlbmNlIGZyYW1lcyBhcmUgYXZhaWxhYmxlIGZvciBNQyBvcGVyYXRpb25zLgorICoKKyAqIEBwYXJhbSBoIHRoZSBIMjY0IGNvbnRleHQKKyAqLworc3RhdGljIHZvaWQgYXdhaXRfcmVmZXJlbmNlcyhIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBjb25zdCBpbnQgbWJfeHkgICA9IGgtPm1iX3h5OworICAgIGNvbnN0IGludCBtYl90eXBlID0gaC0+Y3VyX3BpYy5tYl90eXBlW21iX3h5XTsKKyAgICBpbnQxNl90IHJlZnNbMl1bNDhdOworICAgIGludCBucmVmc1syXSA9IHsgMCB9OworICAgIGludCByZWYsIGxpc3Q7CisKKyAgICBtZW1zZXQocmVmcywgLTEsIHNpemVvZihyZWZzKSk7CisKKyAgICBpZiAoSVNfMTZYMTYobWJfdHlwZSkpIHsKKyAgICAgICAgZ2V0X2xvd2VzdF9wYXJ0X3koaCwgcmVmcywgMCwgMTYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0RJUihtYl90eXBlLCAwLCAwKSwgSVNfRElSKG1iX3R5cGUsIDAsIDEpLCBucmVmcyk7CisgICAgfSBlbHNlIGlmIChJU18xNlg4KG1iX3R5cGUpKSB7CisgICAgICAgIGdldF9sb3dlc3RfcGFydF95KGgsIHJlZnMsIDAsIDgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0RJUihtYl90eXBlLCAwLCAwKSwgSVNfRElSKG1iX3R5cGUsIDAsIDEpLCBucmVmcyk7CisgICAgICAgIGdldF9sb3dlc3RfcGFydF95KGgsIHJlZnMsIDgsIDgsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0RJUihtYl90eXBlLCAxLCAwKSwgSVNfRElSKG1iX3R5cGUsIDEsIDEpLCBucmVmcyk7CisgICAgfSBlbHNlIGlmIChJU184WDE2KG1iX3R5cGUpKSB7CisgICAgICAgIGdldF9sb3dlc3RfcGFydF95KGgsIHJlZnMsIDAsIDE2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJU19ESVIobWJfdHlwZSwgMCwgMCksIElTX0RJUihtYl90eXBlLCAwLCAxKSwgbnJlZnMpOworICAgICAgICBnZXRfbG93ZXN0X3BhcnRfeShoLCByZWZzLCA0LCAxNiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfRElSKG1iX3R5cGUsIDEsIDApLCBJU19ESVIobWJfdHlwZSwgMSwgMSksIG5yZWZzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBhdl9hc3NlcnQyKElTXzhYOChtYl90eXBlKSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgY29uc3QgaW50IHN1Yl9tYl90eXBlID0gaC0+c3ViX21iX3R5cGVbaV07CisgICAgICAgICAgICBjb25zdCBpbnQgbiAgICAgICAgICAgPSA0ICogaTsKKyAgICAgICAgICAgIGludCB5X29mZnNldCAgICAgICAgICA9IChpICYgMikgPDwgMjsKKworICAgICAgICAgICAgaWYgKElTX1NVQl84WDgoc3ViX21iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgZ2V0X2xvd2VzdF9wYXJ0X3koaCwgcmVmcywgbiwgOCwgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfRElSKHN1Yl9tYl90eXBlLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19ESVIoc3ViX21iX3R5cGUsIDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yZWZzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfU1VCXzhYNChzdWJfbWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICBnZXRfbG93ZXN0X3BhcnRfeShoLCByZWZzLCBuLCA0LCB5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19ESVIoc3ViX21iX3R5cGUsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0RJUihzdWJfbWJfdHlwZSwgMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJlZnMpOworICAgICAgICAgICAgICAgIGdldF9sb3dlc3RfcGFydF95KGgsIHJlZnMsIG4gKyAyLCA0LCB5X29mZnNldCArIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfRElSKHN1Yl9tYl90eXBlLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19ESVIoc3ViX21iX3R5cGUsIDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yZWZzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfU1VCXzRYOChzdWJfbWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICBnZXRfbG93ZXN0X3BhcnRfeShoLCByZWZzLCBuLCA4LCB5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19ESVIoc3ViX21iX3R5cGUsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0RJUihzdWJfbWJfdHlwZSwgMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJlZnMpOworICAgICAgICAgICAgICAgIGdldF9sb3dlc3RfcGFydF95KGgsIHJlZnMsIG4gKyAxLCA4LCB5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19ESVIoc3ViX21iX3R5cGUsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0RJUihzdWJfbWJfdHlwZSwgMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJlZnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKElTX1NVQl80WDQoc3ViX21iX3R5cGUpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdWJfeV9vZmZzZXQgPSB5X29mZnNldCArIDIgKiAoaiAmIDIpOworICAgICAgICAgICAgICAgICAgICBnZXRfbG93ZXN0X3BhcnRfeShoLCByZWZzLCBuICsgaiwgNCwgc3ViX3lfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19ESVIoc3ViX21iX3R5cGUsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19ESVIoc3ViX21iX3R5cGUsIDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmVmcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChsaXN0ID0gaC0+bGlzdF9jb3VudCAtIDE7IGxpc3QgPj0gMDsgbGlzdC0tKQorICAgICAgICBmb3IgKHJlZiA9IDA7IHJlZiA8IDQ4ICYmIG5yZWZzW2xpc3RdOyByZWYrKykgeworICAgICAgICAgICAgaW50IHJvdyA9IHJlZnNbbGlzdF1bcmVmXTsKKyAgICAgICAgICAgIGlmIChyb3cgPj0gMCkgeworICAgICAgICAgICAgICAgIEgyNjRQaWN0dXJlICpyZWZfcGljICA9ICZoLT5yZWZfbGlzdFtsaXN0XVtyZWZdOworICAgICAgICAgICAgICAgIGludCByZWZfZmllbGQgICAgICAgICA9IHJlZl9waWMtPnJlZmVyZW5jZSAtIDE7CisgICAgICAgICAgICAgICAgaW50IHJlZl9maWVsZF9waWN0dXJlID0gcmVmX3BpYy0+ZmllbGRfcGljdHVyZTsKKyAgICAgICAgICAgICAgICBpbnQgcGljX2hlaWdodCAgICAgICAgPSAxNiAqIGgtPm1iX2hlaWdodCA+PiByZWZfZmllbGRfcGljdHVyZTsKKworICAgICAgICAgICAgICAgIHJvdyA8PD0gTUJfTUJBRkYoaCk7CisgICAgICAgICAgICAgICAgbnJlZnNbbGlzdF0tLTsKKworICAgICAgICAgICAgICAgIGlmICghRklFTERfUElDVFVSRShoKSAmJiByZWZfZmllbGRfcGljdHVyZSkgeyAvLyBmcmFtZSByZWZlcmVuY2luZyB0d28gZmllbGRzCisgICAgICAgICAgICAgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcmVmX3BpYy0+dGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTigocm93ID4+IDEpIC0gIShyb3cgJiAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY19oZWlnaHQgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnJlZl9waWMtPnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oKHJvdyA+PiAxKSwgcGljX2hlaWdodCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGSUVMRF9QSUNUVVJFKGgpICYmICFyZWZfZmllbGRfcGljdHVyZSkgeyAvLyBmaWVsZCByZWZlcmVuY2luZyBvbmUgZmllbGQgb2YgYSBmcmFtZQorICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnJlZl9waWMtPnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4ocm93ICogMiArIHJlZl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY19oZWlnaHQgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRklFTERfUElDVFVSRShoKSkgeworICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnJlZl9waWMtPnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4ocm93LCBwaWNfaGVpZ2h0IC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfZmllbGQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcmVmX3BpYy0+dGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihyb3csIHBpY19oZWlnaHQgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIG1jX2Rpcl9wYXJ0KEgyNjRDb250ZXh0ICpoLCBIMjY0UGljdHVyZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IHNxdWFyZSwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhLCBpbnQgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF95LCB1aW50OF90ICpkZXN0X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3hfb2Zmc2V0LCBpbnQgc3JjX3lfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcGVsX21jX2Z1bmMgKnFwaXhfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRfY2hyb21hX21jX2Z1bmMgY2hyb21hX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfc2hpZnQsIGludCBjaHJvbWFfaWRjKQoreworICAgIGNvbnN0IGludCBteCAgICAgID0gaC0+bXZfY2FjaGVbbGlzdF1bc2Nhbjhbbl1dWzBdICsgc3JjX3hfb2Zmc2V0ICogODsKKyAgICBpbnQgbXkgICAgICAgICAgICA9IGgtPm12X2NhY2hlW2xpc3RdW3NjYW44W25dXVsxXSArIHNyY195X29mZnNldCAqIDg7CisgICAgY29uc3QgaW50IGx1bWFfeHkgPSAobXggJiAzKSArICgobXkgJiAzKSA8PCAyKTsKKyAgICBwdHJkaWZmX3Qgb2Zmc2V0ICA9ICgobXggPj4gMikgPDwgcGl4ZWxfc2hpZnQpICsgKG15ID4+IDIpICogaC0+bWJfbGluZXNpemU7CisgICAgdWludDhfdCAqc3JjX3kgICAgPSBwaWMtPmYuZGF0YVswXSArIG9mZnNldDsKKyAgICB1aW50OF90ICpzcmNfY2IsICpzcmNfY3I7CisgICAgaW50IGV4dHJhX3dpZHRoICA9IDA7CisgICAgaW50IGV4dHJhX2hlaWdodCA9IDA7CisgICAgaW50IGVtdSA9IDA7CisgICAgY29uc3QgaW50IGZ1bGxfbXggICAgPSBteCA+PiAyOworICAgIGNvbnN0IGludCBmdWxsX215ICAgID0gbXkgPj4gMjsKKyAgICBjb25zdCBpbnQgcGljX3dpZHRoICA9IDE2ICogaC0+bWJfd2lkdGg7CisgICAgY29uc3QgaW50IHBpY19oZWlnaHQgPSAxNiAqIGgtPm1iX2hlaWdodCA+PiBNQl9GSUVMRChoKTsKKyAgICBpbnQgeXNoOworCisgICAgaWYgKG14ICYgNykKKyAgICAgICAgZXh0cmFfd2lkdGggLT0gMzsKKyAgICBpZiAobXkgJiA3KQorICAgICAgICBleHRyYV9oZWlnaHQgLT0gMzsKKworICAgIGlmIChmdWxsX214ICAgICAgICAgICAgICAgIDwgICAgICAgICAgMCAtIGV4dHJhX3dpZHRoICB8fAorICAgICAgICBmdWxsX215ICAgICAgICAgICAgICAgIDwgICAgICAgICAgMCAtIGV4dHJhX2hlaWdodCB8fAorICAgICAgICBmdWxsX214ICsgMTYgLypGSVhNRSovID4gcGljX3dpZHRoICArIGV4dHJhX3dpZHRoICB8fAorICAgICAgICBmdWxsX215ICsgMTYgLypGSVhNRSovID4gcGljX2hlaWdodCArIGV4dHJhX2hlaWdodCkgeworICAgICAgICBoLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMoaC0+ZWRnZV9lbXVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3kgLSAoMiA8PCBwaXhlbF9zaGlmdCkgLSAyICogaC0+bWJfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5tYl9saW5lc2l6ZSwgaC0+bWJfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiArIDUsIDE2ICsgNSAvKkZJWE1FKi8sIGZ1bGxfbXggLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9teSAtIDIsIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisgICAgICAgIHNyY195ID0gaC0+ZWRnZV9lbXVfYnVmZmVyICsgKDIgPDwgcGl4ZWxfc2hpZnQpICsgMiAqIGgtPm1iX2xpbmVzaXplOworICAgICAgICBlbXUgICA9IDE7CisgICAgfQorCisgICAgcXBpeF9vcFtsdW1hX3h5XShkZXN0X3ksIHNyY195LCBoLT5tYl9saW5lc2l6ZSk7IC8vIEZJWE1FIHRyeSB2YXJpYWJsZSBoZWlnaHQgcGVyaGFwcz8KKyAgICBpZiAoIXNxdWFyZSkKKyAgICAgICAgcXBpeF9vcFtsdW1hX3h5XShkZXN0X3kgKyBkZWx0YSwgc3JjX3kgKyBkZWx0YSwgaC0+bWJfbGluZXNpemUpOworCisgICAgaWYgKENPTkZJR19HUkFZICYmIGgtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoY2hyb21hX2lkYyA9PSAzIC8qIHl1djQ0NCAqLykgeworICAgICAgICBzcmNfY2IgPSBwaWMtPmYuZGF0YVsxXSArIG9mZnNldDsKKyAgICAgICAgaWYgKGVtdSkgeworICAgICAgICAgICAgaC0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGgtPmVkZ2VfZW11X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY2IgLSAoMiA8PCBwaXhlbF9zaGlmdCkgLSAyICogaC0+bWJfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWJfbGluZXNpemUsIGgtPm1iX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICsgNSwgMTYgKyA1IC8qRklYTUUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX214IC0gMiwgZnVsbF9teSAtIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljX3dpZHRoLCBwaWNfaGVpZ2h0KTsKKyAgICAgICAgICAgIHNyY19jYiA9IGgtPmVkZ2VfZW11X2J1ZmZlciArICgyIDw8IHBpeGVsX3NoaWZ0KSArIDIgKiBoLT5tYl9saW5lc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBxcGl4X29wW2x1bWFfeHldKGRlc3RfY2IsIHNyY19jYiwgaC0+bWJfbGluZXNpemUpOyAvLyBGSVhNRSB0cnkgdmFyaWFibGUgaGVpZ2h0IHBlcmhhcHM/CisgICAgICAgIGlmICghc3F1YXJlKQorICAgICAgICAgICAgcXBpeF9vcFtsdW1hX3h5XShkZXN0X2NiICsgZGVsdGEsIHNyY19jYiArIGRlbHRhLCBoLT5tYl9saW5lc2l6ZSk7CisKKyAgICAgICAgc3JjX2NyID0gcGljLT5mLmRhdGFbMl0gKyBvZmZzZXQ7CisgICAgICAgIGlmIChlbXUpIHsKKyAgICAgICAgICAgIGgtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhoLT5lZGdlX2VtdV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NyIC0gKDIgPDwgcGl4ZWxfc2hpZnQpIC0gMiAqIGgtPm1iX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX2xpbmVzaXplLCBoLT5tYl9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiArIDUsIDE2ICsgNSAvKkZJWE1FKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9teCAtIDIsIGZ1bGxfbXkgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisgICAgICAgICAgICBzcmNfY3IgPSBoLT5lZGdlX2VtdV9idWZmZXIgKyAoMiA8PCBwaXhlbF9zaGlmdCkgKyAyICogaC0+bWJfbGluZXNpemU7CisgICAgICAgIH0KKyAgICAgICAgcXBpeF9vcFtsdW1hX3h5XShkZXN0X2NyLCBzcmNfY3IsIGgtPm1iX2xpbmVzaXplKTsgLy8gRklYTUUgdHJ5IHZhcmlhYmxlIGhlaWdodCBwZXJoYXBzPworICAgICAgICBpZiAoIXNxdWFyZSkKKyAgICAgICAgICAgIHFwaXhfb3BbbHVtYV94eV0oZGVzdF9jciArIGRlbHRhLCBzcmNfY3IgKyBkZWx0YSwgaC0+bWJfbGluZXNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgeXNoID0gMyAtIChjaHJvbWFfaWRjID09IDIgLyogeXV2NDIyICovKTsKKyAgICBpZiAoY2hyb21hX2lkYyA9PSAxIC8qIHl1djQyMCAqLyAmJiBNQl9GSUVMRChoKSkgeworICAgICAgICAvLyBjaHJvbWEgb2Zmc2V0IHdoZW4gcHJlZGljdGluZyBmcm9tIGEgZmllbGQgb2Ygb3Bwb3NpdGUgcGFyaXR5CisgICAgICAgIG15ICArPSAyICogKChoLT5tYl95ICYgMSkgLSAocGljLT5yZWZlcmVuY2UgLSAxKSk7CisgICAgICAgIGVtdSB8PSAobXkgPj4gMykgPCAwIHx8IChteSA+PiAzKSArIDggPj0gKHBpY19oZWlnaHQgPj4gMSk7CisgICAgfQorCisgICAgc3JjX2NiID0gcGljLT5mLmRhdGFbMV0gKyAoKG14ID4+IDMpIDw8IHBpeGVsX3NoaWZ0KSArCisgICAgICAgICAgICAgKG15ID4+IHlzaCkgKiBoLT5tYl91dmxpbmVzaXplOworICAgIHNyY19jciA9IHBpYy0+Zi5kYXRhWzJdICsgKChteCA+PiAzKSA8PCBwaXhlbF9zaGlmdCkgKworICAgICAgICAgICAgIChteSA+PiB5c2gpICogaC0+bWJfdXZsaW5lc2l6ZTsKKworICAgIGlmIChlbXUpIHsKKyAgICAgICAgaC0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGgtPmVkZ2VfZW11X2J1ZmZlciwgc3JjX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWJfdXZsaW5lc2l6ZSwgaC0+bWJfdXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIDggKiBjaHJvbWFfaWRjICsgMSwgKG14ID4+IDMpLCAobXkgPj4geXNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY193aWR0aCA+PiAxLCBwaWNfaGVpZ2h0ID4+IChjaHJvbWFfaWRjID09IDEgLyogeXV2NDIwICovKSk7CisgICAgICAgIHNyY19jYiA9IGgtPmVkZ2VfZW11X2J1ZmZlcjsKKyAgICB9CisgICAgY2hyb21hX29wKGRlc3RfY2IsIHNyY19jYiwgaC0+bWJfdXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgaGVpZ2h0ID4+IChjaHJvbWFfaWRjID09IDEgLyogeXV2NDIwICovKSwKKyAgICAgICAgICAgICAgbXggJiA3LCAobXkgPDwgKGNocm9tYV9pZGMgPT0gMiAvKiB5dXY0MjIgKi8pKSAmIDcpOworCisgICAgaWYgKGVtdSkgeworICAgICAgICBoLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMoaC0+ZWRnZV9lbXVfYnVmZmVyLCBzcmNfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5tYl91dmxpbmVzaXplLCBoLT5tYl91dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOCAqIGNocm9tYV9pZGMgKyAxLCAobXggPj4gMyksIChteSA+PiB5c2gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljX3dpZHRoID4+IDEsIHBpY19oZWlnaHQgPj4gKGNocm9tYV9pZGMgPT0gMSAvKiB5dXY0MjAgKi8pKTsKKyAgICAgICAgc3JjX2NyID0gaC0+ZWRnZV9lbXVfYnVmZmVyOworICAgIH0KKyAgICBjaHJvbWFfb3AoZGVzdF9jciwgc3JjX2NyLCBoLT5tYl91dmxpbmVzaXplLCBoZWlnaHQgPj4gKGNocm9tYV9pZGMgPT0gMSAvKiB5dXY0MjAgKi8pLAorICAgICAgICAgICAgICBteCAmIDcsIChteSA8PCAoY2hyb21hX2lkYyA9PSAyIC8qIHl1djQyMiAqLykpICYgNyk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgbWNfcGFydF9zdGQoSDI2NENvbnRleHQgKmgsIGludCBuLCBpbnQgc3F1YXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfeSwgdWludDhfdCAqZGVzdF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfb2Zmc2V0LCBpbnQgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFwZWxfbWNfZnVuYyAqcXBpeF9wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRfY2hyb21hX21jX2Z1bmMgY2hyb21hX3B1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXBlbF9tY19mdW5jICpxcGl4X2F2ZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF9jaHJvbWFfbWNfZnVuYyBjaHJvbWFfYXZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdDAsIGludCBsaXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3NoaWZ0LCBpbnQgY2hyb21hX2lkYykKK3sKKyAgICBxcGVsX21jX2Z1bmMgKnFwaXhfb3AgICAgICAgICA9IHFwaXhfcHV0OworICAgIGgyNjRfY2hyb21hX21jX2Z1bmMgY2hyb21hX29wID0gY2hyb21hX3B1dDsKKworICAgIGRlc3RfeSArPSAoMiAqIHhfb2Zmc2V0IDw8IHBpeGVsX3NoaWZ0KSArIDIgKiB5X29mZnNldCAqIGgtPm1iX2xpbmVzaXplOworICAgIGlmIChjaHJvbWFfaWRjID09IDMgLyogeXV2NDQ0ICovKSB7CisgICAgICAgIGRlc3RfY2IgKz0gKDIgKiB4X29mZnNldCA8PCBwaXhlbF9zaGlmdCkgKyAyICogeV9vZmZzZXQgKiBoLT5tYl9saW5lc2l6ZTsKKyAgICAgICAgZGVzdF9jciArPSAoMiAqIHhfb2Zmc2V0IDw8IHBpeGVsX3NoaWZ0KSArIDIgKiB5X29mZnNldCAqIGgtPm1iX2xpbmVzaXplOworICAgIH0gZWxzZSBpZiAoY2hyb21hX2lkYyA9PSAyIC8qIHl1djQyMiAqLykgeworICAgICAgICBkZXN0X2NiICs9ICh4X29mZnNldCA8PCBwaXhlbF9zaGlmdCkgKyAyICogeV9vZmZzZXQgKiBoLT5tYl91dmxpbmVzaXplOworICAgICAgICBkZXN0X2NyICs9ICh4X29mZnNldCA8PCBwaXhlbF9zaGlmdCkgKyAyICogeV9vZmZzZXQgKiBoLT5tYl91dmxpbmVzaXplOworICAgIH0gZWxzZSB7IC8qIHl1djQyMCAqLworICAgICAgICBkZXN0X2NiICs9ICh4X29mZnNldCA8PCBwaXhlbF9zaGlmdCkgKyB5X29mZnNldCAqIGgtPm1iX3V2bGluZXNpemU7CisgICAgICAgIGRlc3RfY3IgKz0gKHhfb2Zmc2V0IDw8IHBpeGVsX3NoaWZ0KSArIHlfb2Zmc2V0ICogaC0+bWJfdXZsaW5lc2l6ZTsKKyAgICB9CisgICAgeF9vZmZzZXQgKz0gOCAqIGgtPm1iX3g7CisgICAgeV9vZmZzZXQgKz0gOCAqIChoLT5tYl95ID4+IE1CX0ZJRUxEKGgpKTsKKworICAgIGlmIChsaXN0MCkgeworICAgICAgICBIMjY0UGljdHVyZSAqcmVmID0gJmgtPnJlZl9saXN0WzBdW2gtPnJlZl9jYWNoZVswXVtzY2FuOFtuXV1dOworICAgICAgICBtY19kaXJfcGFydChoLCByZWYsIG4sIHNxdWFyZSwgaGVpZ2h0LCBkZWx0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLCB4X29mZnNldCwgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHFwaXhfb3AsIGNocm9tYV9vcCwgcGl4ZWxfc2hpZnQsIGNocm9tYV9pZGMpOworCisgICAgICAgIHFwaXhfb3AgICA9IHFwaXhfYXZnOworICAgICAgICBjaHJvbWFfb3AgPSBjaHJvbWFfYXZnOworICAgIH0KKworICAgIGlmIChsaXN0MSkgeworICAgICAgICBIMjY0UGljdHVyZSAqcmVmID0gJmgtPnJlZl9saXN0WzFdW2gtPnJlZl9jYWNoZVsxXVtzY2FuOFtuXV1dOworICAgICAgICBtY19kaXJfcGFydChoLCByZWYsIG4sIHNxdWFyZSwgaGVpZ2h0LCBkZWx0YSwgMSwKKyAgICAgICAgICAgICAgICAgICAgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLCB4X29mZnNldCwgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHFwaXhfb3AsIGNocm9tYV9vcCwgcGl4ZWxfc2hpZnQsIGNocm9tYV9pZGMpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtY19wYXJ0X3dlaWdodGVkKEgyNjRDb250ZXh0ICpoLCBpbnQgbiwgaW50IHNxdWFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF95LCB1aW50OF90ICpkZXN0X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfb2Zmc2V0LCBpbnQgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXBlbF9tY19mdW5jICpxcGl4X3B1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0X2Nocm9tYV9tY19mdW5jIGNocm9tYV9wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF93ZWlnaHRfZnVuYyBsdW1hX3dlaWdodF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0X3dlaWdodF9mdW5jIGNocm9tYV93ZWlnaHRfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF9iaXdlaWdodF9mdW5jIGx1bWFfd2VpZ2h0X2F2ZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0X2Jpd2VpZ2h0X2Z1bmMgY2hyb21hX3dlaWdodF9hdmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpc3QwLCBpbnQgbGlzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3NoaWZ0LCBpbnQgY2hyb21hX2lkYykKK3sKKyAgICBpbnQgY2hyb21hX2hlaWdodDsKKworICAgIGRlc3RfeSArPSAoMiAqIHhfb2Zmc2V0IDw8IHBpeGVsX3NoaWZ0KSArIDIgKiB5X29mZnNldCAqIGgtPm1iX2xpbmVzaXplOworICAgIGlmIChjaHJvbWFfaWRjID09IDMgLyogeXV2NDQ0ICovKSB7CisgICAgICAgIGNocm9tYV9oZWlnaHQgICAgID0gaGVpZ2h0OworICAgICAgICBjaHJvbWFfd2VpZ2h0X2F2ZyA9IGx1bWFfd2VpZ2h0X2F2ZzsKKyAgICAgICAgY2hyb21hX3dlaWdodF9vcCAgPSBsdW1hX3dlaWdodF9vcDsKKyAgICAgICAgZGVzdF9jYiArPSAoMiAqIHhfb2Zmc2V0IDw8IHBpeGVsX3NoaWZ0KSArIDIgKiB5X29mZnNldCAqIGgtPm1iX2xpbmVzaXplOworICAgICAgICBkZXN0X2NyICs9ICgyICogeF9vZmZzZXQgPDwgcGl4ZWxfc2hpZnQpICsgMiAqIHlfb2Zmc2V0ICogaC0+bWJfbGluZXNpemU7CisgICAgfSBlbHNlIGlmIChjaHJvbWFfaWRjID09IDIgLyogeXV2NDIyICovKSB7CisgICAgICAgIGNocm9tYV9oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIGRlc3RfY2IgICAgICArPSAoeF9vZmZzZXQgPDwgcGl4ZWxfc2hpZnQpICsgMiAqIHlfb2Zmc2V0ICogaC0+bWJfdXZsaW5lc2l6ZTsKKyAgICAgICAgZGVzdF9jciAgICAgICs9ICh4X29mZnNldCA8PCBwaXhlbF9zaGlmdCkgKyAyICogeV9vZmZzZXQgKiBoLT5tYl91dmxpbmVzaXplOworICAgIH0gZWxzZSB7IC8qIHl1djQyMCAqLworICAgICAgICBjaHJvbWFfaGVpZ2h0ID0gaGVpZ2h0ID4+IDE7CisgICAgICAgIGRlc3RfY2IgICAgICArPSAoeF9vZmZzZXQgPDwgcGl4ZWxfc2hpZnQpICsgeV9vZmZzZXQgKiBoLT5tYl91dmxpbmVzaXplOworICAgICAgICBkZXN0X2NyICAgICAgKz0gKHhfb2Zmc2V0IDw8IHBpeGVsX3NoaWZ0KSArIHlfb2Zmc2V0ICogaC0+bWJfdXZsaW5lc2l6ZTsKKyAgICB9CisgICAgeF9vZmZzZXQgKz0gOCAqIGgtPm1iX3g7CisgICAgeV9vZmZzZXQgKz0gOCAqIChoLT5tYl95ID4+IE1CX0ZJRUxEKGgpKTsKKworICAgIGlmIChsaXN0MCAmJiBsaXN0MSkgeworICAgICAgICAvKiBkb24ndCBvcHRpbWl6ZSBmb3IgbHVtYS1vbmx5IGNhc2UsIHNpbmNlIEItZnJhbWVzIHVzdWFsbHkKKyAgICAgICAgICogdXNlIGltcGxpY2l0IHdlaWdodHMgPT4gY2hyb21hIHRvby4gKi8KKyAgICAgICAgdWludDhfdCAqdG1wX2NiID0gaC0+YmlwcmVkX3NjcmF0Y2hwYWQ7CisgICAgICAgIHVpbnQ4X3QgKnRtcF9jciA9IGgtPmJpcHJlZF9zY3JhdGNocGFkICsgKDE2IDw8IHBpeGVsX3NoaWZ0KTsKKyAgICAgICAgdWludDhfdCAqdG1wX3kgID0gaC0+YmlwcmVkX3NjcmF0Y2hwYWQgKyAxNiAqIGgtPm1iX3V2bGluZXNpemU7CisgICAgICAgIGludCByZWZuMCAgICAgICA9IGgtPnJlZl9jYWNoZVswXVtzY2FuOFtuXV07CisgICAgICAgIGludCByZWZuMSAgICAgICA9IGgtPnJlZl9jYWNoZVsxXVtzY2FuOFtuXV07CisKKyAgICAgICAgbWNfZGlyX3BhcnQoaCwgJmgtPnJlZl9saXN0WzBdW3JlZm4wXSwgbiwgc3F1YXJlLCBoZWlnaHQsIGRlbHRhLCAwLAorICAgICAgICAgICAgICAgICAgICBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgIHhfb2Zmc2V0LCB5X29mZnNldCwgcXBpeF9wdXQsIGNocm9tYV9wdXQsCisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3NoaWZ0LCBjaHJvbWFfaWRjKTsKKyAgICAgICAgbWNfZGlyX3BhcnQoaCwgJmgtPnJlZl9saXN0WzFdW3JlZm4xXSwgbiwgc3F1YXJlLCBoZWlnaHQsIGRlbHRhLCAxLAorICAgICAgICAgICAgICAgICAgICB0bXBfeSwgdG1wX2NiLCB0bXBfY3IsCisgICAgICAgICAgICAgICAgICAgIHhfb2Zmc2V0LCB5X29mZnNldCwgcXBpeF9wdXQsIGNocm9tYV9wdXQsCisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3NoaWZ0LCBjaHJvbWFfaWRjKTsKKworICAgICAgICBpZiAoaC0+dXNlX3dlaWdodCA9PSAyKSB7CisgICAgICAgICAgICBpbnQgd2VpZ2h0MCA9IGgtPmltcGxpY2l0X3dlaWdodFtyZWZuMF1bcmVmbjFdW2gtPm1iX3kgJiAxXTsKKyAgICAgICAgICAgIGludCB3ZWlnaHQxID0gNjQgLSB3ZWlnaHQwOworICAgICAgICAgICAgbHVtYV93ZWlnaHRfYXZnKGRlc3RfeSwgdG1wX3ksIGgtPm1iX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgNSwgd2VpZ2h0MCwgd2VpZ2h0MSwgMCk7CisgICAgICAgICAgICBpZiAoIUNPTkZJR19HUkFZIHx8ICEoaC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgICAgICAgICAgY2hyb21hX3dlaWdodF9hdmcoZGVzdF9jYiwgdG1wX2NiLCBoLT5tYl91dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocm9tYV9oZWlnaHQsIDUsIHdlaWdodDAsIHdlaWdodDEsIDApOworICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHRfYXZnKGRlc3RfY3IsIHRtcF9jciwgaC0+bWJfdXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJvbWFfaGVpZ2h0LCA1LCB3ZWlnaHQwLCB3ZWlnaHQxLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGx1bWFfd2VpZ2h0X2F2ZyhkZXN0X3ksIHRtcF95LCBoLT5tYl9saW5lc2l6ZSwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bHVtYV93ZWlnaHRbcmVmbjBdWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmx1bWFfd2VpZ2h0W3JlZm4xXVsxXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5sdW1hX3dlaWdodFtyZWZuMF1bMF1bMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmx1bWFfd2VpZ2h0W3JlZm4xXVsxXVsxXSk7CisgICAgICAgICAgICBpZiAoIUNPTkZJR19HUkFZIHx8ICEoaC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgICAgICAgICAgY2hyb21hX3dlaWdodF9hdmcoZGVzdF9jYiwgdG1wX2NiLCBoLT5tYl91dmxpbmVzaXplLCBjaHJvbWFfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5jaHJvbWFfd2VpZ2h0W3JlZm4wXVswXVswXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5jaHJvbWFfd2VpZ2h0W3JlZm4xXVsxXVswXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5jaHJvbWFfd2VpZ2h0W3JlZm4wXVswXVswXVsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+Y2hyb21hX3dlaWdodFtyZWZuMV1bMV1bMF1bMV0pOworICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHRfYXZnKGRlc3RfY3IsIHRtcF9jciwgaC0+bWJfdXZsaW5lc2l6ZSwgY2hyb21hX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+Y2hyb21hX3dlaWdodFtyZWZuMF1bMF1bMV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+Y2hyb21hX3dlaWdodFtyZWZuMV1bMV1bMV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+Y2hyb21hX3dlaWdodFtyZWZuMF1bMF1bMV1bMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmNocm9tYV93ZWlnaHRbcmVmbjFdWzFdWzFdWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBsaXN0ICAgICA9IGxpc3QxID8gMSA6IDA7CisgICAgICAgIGludCByZWZuICAgICA9IGgtPnJlZl9jYWNoZVtsaXN0XVtzY2FuOFtuXV07CisgICAgICAgIEgyNjRQaWN0dXJlICpyZWYgPSAmaC0+cmVmX2xpc3RbbGlzdF1bcmVmbl07CisgICAgICAgIG1jX2Rpcl9wYXJ0KGgsIHJlZiwgbiwgc3F1YXJlLCBoZWlnaHQsIGRlbHRhLCBsaXN0LAorICAgICAgICAgICAgICAgICAgICBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIHhfb2Zmc2V0LCB5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgcXBpeF9wdXQsIGNocm9tYV9wdXQsIHBpeGVsX3NoaWZ0LCBjaHJvbWFfaWRjKTsKKworICAgICAgICBsdW1hX3dlaWdodF9vcChkZXN0X3ksIGgtPm1iX2xpbmVzaXplLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGgtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgIGgtPmx1bWFfd2VpZ2h0W3JlZm5dW2xpc3RdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBoLT5sdW1hX3dlaWdodFtyZWZuXVtsaXN0XVsxXSk7CisgICAgICAgIGlmICghQ09ORklHX0dSQVkgfHwgIShoLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgICAgIGlmIChoLT51c2Vfd2VpZ2h0X2Nocm9tYSkgeworICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHRfb3AoZGVzdF9jYiwgaC0+bWJfdXZsaW5lc2l6ZSwgY2hyb21hX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmNocm9tYV93ZWlnaHRbcmVmbl1bbGlzdF1bMF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5jaHJvbWFfd2VpZ2h0W3JlZm5dW2xpc3RdWzBdWzFdKTsKKyAgICAgICAgICAgICAgICBjaHJvbWFfd2VpZ2h0X29wKGRlc3RfY3IsIGgtPm1iX3V2bGluZXNpemUsIGNocm9tYV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5jaHJvbWFfd2VpZ2h0W3JlZm5dW2xpc3RdWzFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+Y2hyb21hX3dlaWdodFtyZWZuXVtsaXN0XVsxXVsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcHJlZmV0Y2hfbW90aW9uKEgyNjRDb250ZXh0ICpoLCBpbnQgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9zaGlmdCwgaW50IGNocm9tYV9pZGMpCit7CisgICAgLyogZmV0Y2ggcGl4ZWxzIGZvciBlc3RpbWF0ZWQgbXYgNCBtYWNyb2Jsb2NrcyBhaGVhZAorICAgICAqIG9wdGltaXplZCBmb3IgNjRieXRlIGNhY2hlIGxpbmVzICovCisgICAgY29uc3QgaW50IHJlZm4gPSBoLT5yZWZfY2FjaGVbbGlzdF1bc2NhbjhbMF1dOworICAgIGlmIChyZWZuID49IDApIHsKKyAgICAgICAgY29uc3QgaW50IG14ICA9IChoLT5tdl9jYWNoZVtsaXN0XVtzY2FuOFswXV1bMF0gPj4gMikgKyAxNiAqIGgtPm1iX3ggKyA4OworICAgICAgICBjb25zdCBpbnQgbXkgID0gKGgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzBdXVsxXSA+PiAyKSArIDE2ICogaC0+bWJfeTsKKyAgICAgICAgdWludDhfdCAqKnNyYyA9IGgtPnJlZl9saXN0W2xpc3RdW3JlZm5dLmYuZGF0YTsKKyAgICAgICAgaW50IG9mZiAgICAgICA9IChteCA8PCBwaXhlbF9zaGlmdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgKG15ICsgKGgtPm1iX3ggJiAzKSAqIDQpICogaC0+bWJfbGluZXNpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgKDY0IDw8IHBpeGVsX3NoaWZ0KTsKKyAgICAgICAgaC0+dmRzcC5wcmVmZXRjaChzcmNbMF0gKyBvZmYsIGgtPmxpbmVzaXplLCA0KTsKKyAgICAgICAgaWYgKGNocm9tYV9pZGMgPT0gMyAvKiB5dXY0NDQgKi8pIHsKKyAgICAgICAgICAgIGgtPnZkc3AucHJlZmV0Y2goc3JjWzFdICsgb2ZmLCBoLT5saW5lc2l6ZSwgNCk7CisgICAgICAgICAgICBoLT52ZHNwLnByZWZldGNoKHNyY1syXSArIG9mZiwgaC0+bGluZXNpemUsIDQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2ZmPSAoKChteD4+MSkrNjQpPDxwaXhlbF9zaGlmdCkgKyAoKG15Pj4xKSArIChoLT5tYl94JjcpKSpoLT51dmxpbmVzaXplOworICAgICAgICAgICAgaC0+dmRzcC5wcmVmZXRjaChzcmNbMV0gKyBvZmYsIHNyY1syXSAtIHNyY1sxXSwgMik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgeGNoZ19tYl9ib3JkZXIoSDI2NENvbnRleHQgKmgsIHVpbnQ4X3QgKnNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmNfY2IsIHVpbnQ4X3QgKnNyY19jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLCBpbnQgdXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhjaGcsIGludCBjaHJvbWE0NDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaW1wbGUsIGludCBwaXhlbF9zaGlmdCkKK3sKKyAgICBpbnQgZGVibG9ja190b3BsZWZ0OworICAgIGludCBkZWJsb2NrX3RvcDsKKyAgICBpbnQgdG9wX2lkeCA9IDE7CisgICAgdWludDhfdCAqdG9wX2JvcmRlcl9tMTsKKyAgICB1aW50OF90ICp0b3BfYm9yZGVyOworCisgICAgaWYgKCFzaW1wbGUgJiYgRlJBTUVfTUJBRkYoaCkpIHsKKyAgICAgICAgaWYgKGgtPm1iX3kgJiAxKSB7CisgICAgICAgICAgICBpZiAoIU1CX01CQUZGKGgpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRvcF9pZHggPSBNQl9NQkFGRihoKSA/IDAgOiAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGgtPmRlYmxvY2tpbmdfZmlsdGVyID09IDIpIHsKKyAgICAgICAgZGVibG9ja190b3BsZWZ0ID0gaC0+c2xpY2VfdGFibGVbaC0+bWJfeHkgLSAxIC0gaC0+bWJfc3RyaWRlXSA9PSBoLT5zbGljZV9udW07CisgICAgICAgIGRlYmxvY2tfdG9wICAgICA9IGgtPnRvcF90eXBlOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlYmxvY2tfdG9wbGVmdCA9IChoLT5tYl94ID4gMCk7CisgICAgICAgIGRlYmxvY2tfdG9wICAgICA9IChoLT5tYl95ID4gISFNQl9GSUVMRChoKSk7CisgICAgfQorCisgICAgc3JjX3kgIC09IGxpbmVzaXplICAgKyAxICsgcGl4ZWxfc2hpZnQ7CisgICAgc3JjX2NiIC09IHV2bGluZXNpemUgKyAxICsgcGl4ZWxfc2hpZnQ7CisgICAgc3JjX2NyIC09IHV2bGluZXNpemUgKyAxICsgcGl4ZWxfc2hpZnQ7CisKKyAgICB0b3BfYm9yZGVyX20xID0gaC0+dG9wX2JvcmRlcnNbdG9wX2lkeF1baC0+bWJfeCAtIDFdOworICAgIHRvcF9ib3JkZXIgICAgPSBoLT50b3BfYm9yZGVyc1t0b3BfaWR4XVtoLT5tYl94XTsKKworI2RlZmluZSBYQ0hHKGEsIGIsIHhjaGcpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChwaXhlbF9zaGlmdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoeGNoZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQVZfU1dBUDY0KGIgKyAwLCBhICsgMCk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgQVZfU1dBUDY0KGIgKyA4LCBhICsgOCk7ICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQVZfQ09QWTEyOChiLCBhKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoeGNoZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBVl9TV0FQNjQoYiwgYSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBVl9DT1BZNjQoYiwgYSk7CisKKyAgICBpZiAoZGVibG9ja190b3ApIHsKKyAgICAgICAgaWYgKGRlYmxvY2tfdG9wbGVmdCkgeworICAgICAgICAgICAgWENIRyh0b3BfYm9yZGVyX20xICsgKDggPDwgcGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICBzcmNfeSAtICg3IDw8IHBpeGVsX3NoaWZ0KSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgWENIRyh0b3BfYm9yZGVyICsgKDAgPDwgcGl4ZWxfc2hpZnQpLCBzcmNfeSArICgxIDw8IHBpeGVsX3NoaWZ0KSwgeGNoZyk7CisgICAgICAgIFhDSEcodG9wX2JvcmRlciArICg4IDw8IHBpeGVsX3NoaWZ0KSwgc3JjX3kgKyAoOSA8PCBwaXhlbF9zaGlmdCksIDEpOworICAgICAgICBpZiAoaC0+bWJfeCArIDEgPCBoLT5tYl93aWR0aCkgeworICAgICAgICAgICAgWENIRyhoLT50b3BfYm9yZGVyc1t0b3BfaWR4XVtoLT5tYl94ICsgMV0sCisgICAgICAgICAgICAgICAgIHNyY195ICsgKDE3IDw8IHBpeGVsX3NoaWZ0KSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpbXBsZSB8fCAhQ09ORklHX0dSQVkgfHwgIShoLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgICAgIGlmIChjaHJvbWE0NDQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVibG9ja190b3BsZWZ0KSB7CisgICAgICAgICAgICAgICAgICAgIFhDSEcodG9wX2JvcmRlcl9tMSArICgyNCA8PCBwaXhlbF9zaGlmdCksIHNyY19jYiAtICg3IDw8IHBpeGVsX3NoaWZ0KSwgMSk7CisgICAgICAgICAgICAgICAgICAgIFhDSEcodG9wX2JvcmRlcl9tMSArICg0MCA8PCBwaXhlbF9zaGlmdCksIHNyY19jciAtICg3IDw8IHBpeGVsX3NoaWZ0KSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFhDSEcodG9wX2JvcmRlciArICgxNiA8PCBwaXhlbF9zaGlmdCksIHNyY19jYiArICgxIDw8IHBpeGVsX3NoaWZ0KSwgeGNoZyk7CisgICAgICAgICAgICAgICAgWENIRyh0b3BfYm9yZGVyICsgKDI0IDw8IHBpeGVsX3NoaWZ0KSwgc3JjX2NiICsgKDkgPDwgcGl4ZWxfc2hpZnQpLCAxKTsKKyAgICAgICAgICAgICAgICBYQ0hHKHRvcF9ib3JkZXIgKyAoMzIgPDwgcGl4ZWxfc2hpZnQpLCBzcmNfY3IgKyAoMSA8PCBwaXhlbF9zaGlmdCksIHhjaGcpOworICAgICAgICAgICAgICAgIFhDSEcodG9wX2JvcmRlciArICg0MCA8PCBwaXhlbF9zaGlmdCksIHNyY19jciArICg5IDw8IHBpeGVsX3NoaWZ0KSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKGgtPm1iX3ggKyAxIDwgaC0+bWJfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgWENIRyhoLT50b3BfYm9yZGVyc1t0b3BfaWR4XVtoLT5tYl94ICsgMV0gKyAoMTYgPDwgcGl4ZWxfc2hpZnQpLCBzcmNfY2IgKyAoMTcgPDwgcGl4ZWxfc2hpZnQpLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgWENIRyhoLT50b3BfYm9yZGVyc1t0b3BfaWR4XVtoLT5tYl94ICsgMV0gKyAoMzIgPDwgcGl4ZWxfc2hpZnQpLCBzcmNfY3IgKyAoMTcgPDwgcGl4ZWxfc2hpZnQpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChkZWJsb2NrX3RvcGxlZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgWENIRyh0b3BfYm9yZGVyX20xICsgKDE2IDw8IHBpeGVsX3NoaWZ0KSwgc3JjX2NiIC0gKDcgPDwgcGl4ZWxfc2hpZnQpLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgWENIRyh0b3BfYm9yZGVyX20xICsgKDI0IDw8IHBpeGVsX3NoaWZ0KSwgc3JjX2NyIC0gKDcgPDwgcGl4ZWxfc2hpZnQpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgWENIRyh0b3BfYm9yZGVyICsgKDE2IDw8IHBpeGVsX3NoaWZ0KSwgc3JjX2NiICsgMSArIHBpeGVsX3NoaWZ0LCAxKTsKKyAgICAgICAgICAgICAgICBYQ0hHKHRvcF9ib3JkZXIgKyAoMjQgPDwgcGl4ZWxfc2hpZnQpLCBzcmNfY3IgKyAxICsgcGl4ZWxfc2hpZnQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZGN0Y29lZl9nZXQoaW50MTZfdCAqbWIsIGludCBoaWdoX2JpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpCit7CisgICAgaWYgKGhpZ2hfYml0X2RlcHRoKSB7CisgICAgICAgIHJldHVybiBBVl9STjMyQSgoKGludDMyX3QgKiltYikgKyBpbmRleCk7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBBVl9STjE2QShtYiArIGluZGV4KTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBkY3Rjb2VmX3NldChpbnQxNl90ICptYiwgaW50IGhpZ2hfYml0X2RlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGludCB2YWx1ZSkKK3sKKyAgICBpZiAoaGlnaF9iaXRfZGVwdGgpIHsKKyAgICAgICAgQVZfV04zMkEoKChpbnQzMl90ICopbWIpICsgaW5kZXgsIHZhbHVlKTsKKyAgICB9IGVsc2UKKyAgICAgICAgQVZfV04xNkEobWIgKyBpbmRleCwgdmFsdWUpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGhsX2RlY29kZV9tYl9wcmVkaWN0X2x1bWEoSDI2NENvbnRleHQgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3R5cGUsIGludCBpc19oMjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zZm9ybV9ieXBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X3ksIGludCBwKQoreworICAgIHZvaWQgKCppZGN0X2FkZCkodWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSk7CisgICAgdm9pZCAoKmlkY3RfZGNfYWRkKSh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcXNjYWxlID0gcCA9PSAwID8gaC0+cXNjYWxlIDogaC0+Y2hyb21hX3FwW3AgLSAxXTsKKyAgICBibG9ja19vZmZzZXQgKz0gMTYgKiBwOworICAgIGlmIChJU19JTlRSQTR4NChtYl90eXBlKSkgeworICAgICAgICBpZiAoSVNfOHg4RENUKG1iX3R5cGUpKSB7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtX2J5cGFzcykgeworICAgICAgICAgICAgICAgIGlkY3RfZGNfYWRkID0KKyAgICAgICAgICAgICAgICBpZGN0X2FkZCAgICA9IGgtPmgyNjRkc3AuaDI2NF9hZGRfcGl4ZWxzOF9jbGVhcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWRjdF9kY19hZGQgPSBoLT5oMjY0ZHNwLmgyNjRfaWRjdDhfZGNfYWRkOworICAgICAgICAgICAgICAgIGlkY3RfYWRkICAgID0gaC0+aDI2NGRzcC5oMjY0X2lkY3Q4X2FkZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSA0KSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqY29uc3QgcHRyID0gZGVzdF95ICsgYmxvY2tfb2Zmc2V0W2ldOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBkaXIgICAgICA9IGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtzY2FuOFtpXV07CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9ieXBhc3MgJiYgaC0+c3BzLnByb2ZpbGVfaWRjID09IDI0NCAmJiBkaXIgPD0gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaC0+eDI2NF9idWlsZCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaC0+aHBjLnByZWQ4eDhsX2FkZFtkaXJdKHB0ciwgaC0+bWIgKyAoaSAqIDE2ICsgcCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBoLT5ocGMucHJlZDh4OGxfZmlsdGVyX2FkZFtkaXJdKHB0ciwgaC0+bWIgKyAoaSAqIDE2ICsgcCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT4gdG9wbGVmdF9zYW1wbGVzX2F2YWlsYWJsZSA8PCBpKSAmIDB4ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnRvcHJpZ2h0X3NhbXBsZXNfYXZhaWxhYmxlIDw8IGkpICYgMHg0MDAwLCBsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5ueiA9IGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W2kgKyBwICogMTZdXTsKKyAgICAgICAgICAgICAgICAgICAgaC0+aHBjLnByZWQ4eDhsW2Rpcl0ocHRyLCAoaC0+dG9wbGVmdF9zYW1wbGVzX2F2YWlsYWJsZSA8PCBpKSAmIDB4ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnRvcHJpZ2h0X3NhbXBsZXNfYXZhaWxhYmxlIDw8IGkpICYgMHg0MDAwLCBsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChubnopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChubnogPT0gMSAmJiBkY3Rjb2VmX2dldChoLT5tYiwgcGl4ZWxfc2hpZnQsIGkgKiAxNiArIHAgKiAyNTYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkY3RfZGNfYWRkKHB0ciwgaC0+bWIgKyAoaSAqIDE2ICsgcCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGN0X2FkZChwdHIsIGgtPm1iICsgKGkgKiAxNiArIHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLCBsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtX2J5cGFzcykgeworICAgICAgICAgICAgICAgIGlkY3RfZGNfYWRkICA9CisgICAgICAgICAgICAgICAgaWRjdF9hZGQgICAgID0gaC0+aDI2NGRzcC5oMjY0X2FkZF9waXhlbHM0X2NsZWFyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZGN0X2RjX2FkZCA9IGgtPmgyNjRkc3AuaDI2NF9pZGN0X2RjX2FkZDsKKyAgICAgICAgICAgICAgICBpZGN0X2FkZCAgICA9IGgtPmgyNjRkc3AuaDI2NF9pZGN0X2FkZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqY29uc3QgcHRyID0gZGVzdF95ICsgYmxvY2tfb2Zmc2V0W2ldOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBkaXIgICAgICA9IGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtzY2FuOFtpXV07CisKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtX2J5cGFzcyAmJiBoLT5zcHMucHJvZmlsZV9pZGMgPT0gMjQ0ICYmIGRpciA8PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGgtPmhwYy5wcmVkNHg0X2FkZFtkaXJdKHB0ciwgaC0+bWIgKyAoaSAqIDE2ICsgcCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp0b3ByaWdodDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ueiwgdHI7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRyX2hpZ2g7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElBR19ET1dOX0xFRlRfUFJFRCB8fCBkaXIgPT0gVkVSVF9MRUZUX1BSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0b3ByaWdodF9hdmFpbCA9IChoLT50b3ByaWdodF9zYW1wbGVzX2F2YWlsYWJsZSA8PCBpKSAmIDB4ODAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIoaC0+bWJfeSB8fCBsaW5lc2l6ZSA8PSBibG9ja19vZmZzZXRbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b3ByaWdodF9hdmFpbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbF9zaGlmdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cl9oaWdoICA9ICgodWludDE2X3QgKilwdHIpWzMgLSBsaW5lc2l6ZSAvIDJdICogMHgwMDAxMDAwMTAwMDEwMDAxVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3ByaWdodCA9ICh1aW50OF90ICopJnRyX2hpZ2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIgICAgICAgPSBwdHJbMyAtIGxpbmVzaXplXSAqIDB4MDEwMTAxMDF1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3ByaWdodCA9ICh1aW50OF90ICopJnRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcHJpZ2h0ID0gcHRyICsgKDQgPDwgcGl4ZWxfc2hpZnQpIC0gbGluZXNpemU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdG9wcmlnaHQgPSBOVUxMOworCisgICAgICAgICAgICAgICAgICAgIGgtPmhwYy5wcmVkNHg0W2Rpcl0ocHRyLCB0b3ByaWdodCwgbGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICBubnogPSBoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtpICsgcCAqIDE2XV07CisgICAgICAgICAgICAgICAgICAgIGlmIChubnopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19oMjY0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ueiA9PSAxICYmIGRjdGNvZWZfZ2V0KGgtPm1iLCBwaXhlbF9zaGlmdCwgaSAqIDE2ICsgcCAqIDI1NikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkY3RfZGNfYWRkKHB0ciwgaC0+bWIgKyAoaSAqIDE2ICsgcCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkY3RfYWRkKHB0ciwgaC0+bWIgKyAoaSAqIDE2ICsgcCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ09ORklHX1NWUTNfREVDT0RFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9zdnEzX2FkZF9pZGN0X2MocHRyLCBoLT5tYiArIGkgKiAxNiArIHAgKiAyNTYsIGxpbmVzaXplLCBxc2NhbGUsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaC0+aHBjLnByZWQxNngxNltoLT5pbnRyYTE2eDE2X3ByZWRfbW9kZV0oZGVzdF95LCBsaW5lc2l6ZSk7CisgICAgICAgIGlmIChpc19oMjY0KSB7CisgICAgICAgICAgICBpZiAoaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbTFVNQV9EQ19CTE9DS19JTkRFWCArIHBdXSkgeworICAgICAgICAgICAgICAgIGlmICghdHJhbnNmb3JtX2J5cGFzcykKKyAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC5oMjY0X2x1bWFfZGNfZGVxdWFudF9pZGN0KGgtPm1iICsgKHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWJfbHVtYV9kY1twXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ0X2NvZWZmW3BdW3FzY2FsZV1bMF0pOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkY19tYXBwaW5nWzE2XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAwICogMTYsICAxICogMTYsICA0ICogMTYsICA1ICogMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIDE2LCAgMyAqIDE2LCAgNiAqIDE2LCAgNyAqIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgIDggKiAxNiwgIDkgKiAxNiwgMTIgKiAxNiwgMTMgKiAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwICogMTYsIDExICogMTYsIDE0ICogMTYsIDE1ICogMTYKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBkY3Rjb2VmX3NldChoLT5tYiArIChwICogMjU2IDw8IHBpeGVsX3NoaWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3NoaWZ0LCBkY19tYXBwaW5nW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGN0Y29lZl9nZXQoaC0+bWJfbHVtYV9kY1twXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3NoaWZ0LCBpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKENPTkZJR19TVlEzX0RFQ09ERVIpCisgICAgICAgICAgICBmZl9zdnEzX2x1bWFfZGNfZGVxdWFudF9pZGN0X2MoaC0+bWIgKyBwICogMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX2x1bWFfZGNbcF0sIHFzY2FsZSk7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGhsX2RlY29kZV9tYl9pZGN0X2x1bWEoSDI2NENvbnRleHQgKmgsIGludCBtYl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19oMjY0LCBpbnQgc2ltcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc2Zvcm1fYnlwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJsb2NrX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF95LCBpbnQgcCkKK3sKKyAgICB2b2lkICgqaWRjdF9hZGQpKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpOworICAgIGludCBpOworICAgIGJsb2NrX29mZnNldCArPSAxNiAqIHA7CisgICAgaWYgKCFJU19JTlRSQTR4NChtYl90eXBlKSkgeworICAgICAgICBpZiAoaXNfaDI2NCkgeworICAgICAgICAgICAgaWYgKElTX0lOVFJBMTZ4MTYobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtX2J5cGFzcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaC0+c3BzLnByb2ZpbGVfaWRjID09IDI0NCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGgtPmludHJhMTZ4MTZfcHJlZF9tb2RlID09IFZFUlRfUFJFRDh4OCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmludHJhMTZ4MTZfcHJlZF9tb2RlID09IEhPUl9QUkVEOHg4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaC0+aHBjLnByZWQxNngxNl9hZGRbaC0+aW50cmExNngxNl9wcmVkX21vZGVdKGRlc3RfeSwgYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iICsgKHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtpICsgcCAqIDE2XV0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGN0Y29lZl9nZXQoaC0+bWIsIHBpeGVsX3NoaWZ0LCBpICogMTYgKyBwICogMjU2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC5oMjY0X2FkZF9waXhlbHM0X2NsZWFyKGRlc3RfeSArIGJsb2NrX29mZnNldFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iICsgKGkgKiAxNiArIHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC5oMjY0X2lkY3RfYWRkMTZpbnRyYShkZXN0X3ksIGJsb2NrX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5tYiArIChwICogMjU2IDw8IHBpeGVsX3NoaWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5ub25femVyb19jb3VudF9jYWNoZSArIHAgKiA1ICogOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChoLT5jYnAgJiAxNSkgeworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1fYnlwYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkaSA9IElTXzh4OERDVChtYl90eXBlKSA/IDQgOiAxOworICAgICAgICAgICAgICAgICAgICBpZGN0X2FkZCA9IElTXzh4OERDVChtYl90eXBlKSA/IGgtPmgyNjRkc3AuaDI2NF9hZGRfcGl4ZWxzOF9jbGVhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGgtPmgyNjRkc3AuaDI2NF9hZGRfcGl4ZWxzNF9jbGVhcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IGRpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W2kgKyBwICogMTZdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGN0X2FkZChkZXN0X3kgKyBibG9ja19vZmZzZXRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWIgKyAoaSAqIDE2ICsgcCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChJU184eDhEQ1QobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0ZHNwLmgyNjRfaWRjdDhfYWRkNChkZXN0X3ksIGJsb2NrX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iICsgKHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5ub25femVyb19jb3VudF9jYWNoZSArIHAgKiA1ICogOCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9pZGN0X2FkZDE2KGRlc3RfeSwgYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWIgKyAocCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlICsgcCAqIDUgKiA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoQ09ORklHX1NWUTNfREVDT0RFUikgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W2kgKyBwICogMTZdXSB8fCBoLT5tYltpICogMTYgKyBwICogMjU2XSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBiZW5jaG1hcmsgd2VpcmQgcnVsZSwgJiBiZWxvdworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpjb25zdCBwdHIgPSBkZXN0X3kgKyBibG9ja19vZmZzZXRbaV07CisgICAgICAgICAgICAgICAgICAgIGZmX3N2cTNfYWRkX2lkY3RfYyhwdHIsIGgtPm1iICsgaSAqIDE2ICsgcCAqIDI1NiwgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5xc2NhbGUsIElTX0lOVFJBKG1iX3R5cGUpID8gMSA6IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2RlZmluZSBCSVRTICAgOAorI2RlZmluZSBTSU1QTEUgMQorI2luY2x1ZGUgImgyNjRfbWJfdGVtcGxhdGUuYyIKKworI3VuZGVmICBCSVRTCisjZGVmaW5lIEJJVFMgICAxNgorI2luY2x1ZGUgImgyNjRfbWJfdGVtcGxhdGUuYyIKKworI3VuZGVmICBTSU1QTEUKKyNkZWZpbmUgU0lNUExFIDAKKyNpbmNsdWRlICJoMjY0X21iX3RlbXBsYXRlLmMiCisKK3ZvaWQgZmZfaDI2NF9obF9kZWNvZGVfbWIoSDI2NENvbnRleHQgKmgpCit7CisgICAgY29uc3QgaW50IG1iX3h5ICAgPSBoLT5tYl94eTsKKyAgICBjb25zdCBpbnQgbWJfdHlwZSA9IGgtPmN1cl9waWMubWJfdHlwZVttYl94eV07CisgICAgaW50IGlzX2NvbXBsZXggICAgPSBDT05GSUdfU01BTEwgfHwgaC0+aXNfY29tcGxleCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgSVNfSU5UUkFfUENNKG1iX3R5cGUpIHx8IGgtPnFzY2FsZSA9PSAwOworCisgICAgaWYgKENIUk9NQTQ0NChoKSkgeworICAgICAgICBpZiAoaXNfY29tcGxleCB8fCBoLT5waXhlbF9zaGlmdCkKKyAgICAgICAgICAgIGhsX2RlY29kZV9tYl80NDRfY29tcGxleChoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGxfZGVjb2RlX21iXzQ0NF9zaW1wbGVfOChoKTsKKyAgICB9IGVsc2UgaWYgKGlzX2NvbXBsZXgpIHsKKyAgICAgICAgaGxfZGVjb2RlX21iX2NvbXBsZXgoaCk7CisgICAgfSBlbHNlIGlmIChoLT5waXhlbF9zaGlmdCkgeworICAgICAgICBobF9kZWNvZGVfbWJfc2ltcGxlXzE2KGgpOworICAgIH0gZWxzZQorICAgICAgICBobF9kZWNvZGVfbWJfc2ltcGxlXzgoaCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X21iX3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X21iX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5ZDcyYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfbWJfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDM2OSBAQAorLyoKKyAqIEguMjZML0guMjY0L0FWQy9KVlQvMTQ0OTYtMTAvLi4uIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAic3ZxMy5oIgorCisjdW5kZWYgRlVOQworI3VuZGVmIFBJWEVMX1NISUZUCisKKyNpZiBTSU1QTEUKKyMgICBkZWZpbmUgRlVOQyhuKSBBVl9KT0lOKG4gIyMgX3NpbXBsZV8sIEJJVFMpCisjICAgZGVmaW5lIFBJWEVMX1NISUZUIChCSVRTID4+IDQpCisjZWxzZQorIyAgIGRlZmluZSBGVU5DKG4pIG4gIyMgX2NvbXBsZXgKKyMgICBkZWZpbmUgUElYRUxfU0hJRlQgaC0+cGl4ZWxfc2hpZnQKKyNlbmRpZgorCisjdW5kZWYgIENIUk9NQV9JREMKKyNkZWZpbmUgQ0hST01BX0lEQyAxCisjaW5jbHVkZSAiaDI2NF9tY190ZW1wbGF0ZS5jIgorCisjdW5kZWYgIENIUk9NQV9JREMKKyNkZWZpbmUgQ0hST01BX0lEQyAyCisjaW5jbHVkZSAiaDI2NF9tY190ZW1wbGF0ZS5jIgorCitzdGF0aWMgYXZfbm9pbmxpbmUgdm9pZCBGVU5DKGhsX2RlY29kZV9tYikoSDI2NENvbnRleHQgKmgpCit7CisgICAgY29uc3QgaW50IG1iX3ggICAgPSBoLT5tYl94OworICAgIGNvbnN0IGludCBtYl95ICAgID0gaC0+bWJfeTsKKyAgICBjb25zdCBpbnQgbWJfeHkgICA9IGgtPm1iX3h5OworICAgIGNvbnN0IGludCBtYl90eXBlID0gaC0+Y3VyX3BpYy5tYl90eXBlW21iX3h5XTsKKyAgICB1aW50OF90ICpkZXN0X3ksICpkZXN0X2NiLCAqZGVzdF9jcjsKKyAgICBpbnQgbGluZXNpemUsIHV2bGluZXNpemUgLypkY3Rfb2Zmc2V0Ki87CisgICAgaW50IGksIGo7CisgICAgaW50ICpibG9ja19vZmZzZXQgPSAmaC0+YmxvY2tfb2Zmc2V0WzBdOworICAgIGNvbnN0IGludCB0cmFuc2Zvcm1fYnlwYXNzID0gIVNJTVBMRSAmJiAoaC0+cXNjYWxlID09IDAgJiYgaC0+c3BzLnRyYW5zZm9ybV9ieXBhc3MpOworICAgIC8qIGlzX2gyNjQgc2hvdWxkIGFsd2F5cyBiZSB0cnVlIGlmIFNWUTMgaXMgZGlzYWJsZWQuICovCisgICAgY29uc3QgaW50IGlzX2gyNjQgPSAhQ09ORklHX1NWUTNfREVDT0RFUiB8fCBTSU1QTEUgfHwgaC0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQ7CisgICAgdm9pZCAoKmlkY3RfYWRkKSh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKTsKKyAgICBjb25zdCBpbnQgYmxvY2tfaCAgID0gMTYgPj4gaC0+Y2hyb21hX3lfc2hpZnQ7CisgICAgY29uc3QgaW50IGNocm9tYTQyMiA9IENIUk9NQTQyMihoKTsKKworICAgIGRlc3RfeSAgPSBoLT5jdXJfcGljLmYuZGF0YVswXSArICgobWJfeCA8PCBQSVhFTF9TSElGVCkgICAgICsgbWJfeSAqIGgtPmxpbmVzaXplKSAgKiAxNjsKKyAgICBkZXN0X2NiID0gaC0+Y3VyX3BpYy5mLmRhdGFbMV0gKyAgKG1iX3ggPDwgUElYRUxfU0hJRlQpICogOCArIG1iX3kgKiBoLT51dmxpbmVzaXplICogYmxvY2tfaDsKKyAgICBkZXN0X2NyID0gaC0+Y3VyX3BpYy5mLmRhdGFbMl0gKyAgKG1iX3ggPDwgUElYRUxfU0hJRlQpICogOCArIG1iX3kgKiBoLT51dmxpbmVzaXplICogYmxvY2tfaDsKKworICAgIGgtPnZkc3AucHJlZmV0Y2goZGVzdF95ICArIChoLT5tYl94ICYgMykgKiA0ICogaC0+bGluZXNpemUgICArICg2NCA8PCBQSVhFTF9TSElGVCksIGgtPmxpbmVzaXplLCAgICAgICA0KTsKKyAgICBoLT52ZHNwLnByZWZldGNoKGRlc3RfY2IgKyAoaC0+bWJfeCAmIDcpICAgICAqIGgtPnV2bGluZXNpemUgKyAoNjQgPDwgUElYRUxfU0hJRlQpLCBkZXN0X2NyIC0gZGVzdF9jYiwgMik7CisKKyAgICBoLT5saXN0X2NvdW50c1ttYl94eV0gPSBoLT5saXN0X2NvdW50OworCisgICAgaWYgKCFTSU1QTEUgJiYgTUJfRklFTEQoaCkpIHsKKyAgICAgICAgbGluZXNpemUgICAgID0gaC0+bWJfbGluZXNpemUgPSBoLT5saW5lc2l6ZSAqIDI7CisgICAgICAgIHV2bGluZXNpemUgICA9IGgtPm1iX3V2bGluZXNpemUgPSBoLT51dmxpbmVzaXplICogMjsKKyAgICAgICAgYmxvY2tfb2Zmc2V0ID0gJmgtPmJsb2NrX29mZnNldFs0OF07CisgICAgICAgIGlmIChtYl95ICYgMSkgeyAvLyBGSVhNRSBtb3ZlIG91dCBvZiB0aGlzIGZ1bmN0aW9uPworICAgICAgICAgICAgZGVzdF95ICAtPSBoLT5saW5lc2l6ZSAqIDE1OworICAgICAgICAgICAgZGVzdF9jYiAtPSBoLT51dmxpbmVzaXplICogKGJsb2NrX2ggLSAxKTsKKyAgICAgICAgICAgIGRlc3RfY3IgLT0gaC0+dXZsaW5lc2l6ZSAqIChibG9ja19oIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEZSQU1FX01CQUZGKGgpKSB7CisgICAgICAgICAgICBpbnQgbGlzdDsKKyAgICAgICAgICAgIGZvciAobGlzdCA9IDA7IGxpc3QgPCBoLT5saXN0X2NvdW50OyBsaXN0KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIVVTRVNfTElTVChtYl90eXBlLCBsaXN0KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKElTXzE2WDE2KG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGludDhfdCAqcmVmID0gJmgtPnJlZl9jYWNoZVtsaXN0XVtzY2FuOFswXV07CisgICAgICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKHJlZiwgNCwgNCwgOCwgKDE2ICsgKnJlZikgXiAoaC0+bWJfeSAmIDEpLCAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZiA9IGgtPnJlZl9jYWNoZVtsaXN0XVtzY2FuOFtpXV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJmgtPnJlZl9jYWNoZVtsaXN0XVtzY2FuOFtpXV0sIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgKDE2ICsgcmVmKSBeIChoLT5tYl95ICYgMSksIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGluZXNpemUgICA9IGgtPm1iX2xpbmVzaXplICAgPSBoLT5saW5lc2l6ZTsKKyAgICAgICAgdXZsaW5lc2l6ZSA9IGgtPm1iX3V2bGluZXNpemUgPSBoLT51dmxpbmVzaXplOworICAgICAgICAvLyBkY3Rfb2Zmc2V0ID0gcy0+bGluZXNpemUgKiAxNjsKKyAgICB9CisKKyAgICBpZiAoIVNJTVBMRSAmJiBJU19JTlRSQV9QQ00obWJfdHlwZSkpIHsKKyAgICAgICAgY29uc3QgaW50IGJpdF9kZXB0aCA9IGgtPnNwcy5iaXRfZGVwdGhfbHVtYTsKKyAgICAgICAgaWYgKFBJWEVMX1NISUZUKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgaC0+aW50cmFfcGNtX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaDI2NF9tYl9zaXplc1toLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGNdICogYml0X2RlcHRoKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqdG1wX3kgPSAodWludDE2X3QgKikoZGVzdF95ICsgaSAqIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgICAgICAgICAgdG1wX3lbal0gPSBnZXRfYml0cygmZ2IsIGJpdF9kZXB0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoU0lNUExFIHx8ICFDT05GSUdfR1JBWSB8fCAhKGgtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkgeworICAgICAgICAgICAgICAgIGlmICghaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja19oOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICp0bXBfY2IgPSAodWludDE2X3QgKikoZGVzdF9jYiArIGkgKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICp0bXBfY3IgPSAodWludDE2X3QgKikoZGVzdF9jciArIGkgKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfY2Jbal0gPSB0bXBfY3Jbal0gPSAxIDw8IChiaXRfZGVwdGggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja19oOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICp0bXBfY2IgPSAodWludDE2X3QgKikoZGVzdF9jYiArIGkgKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX2NiW2pdID0gZ2V0X2JpdHMoJmdiLCBiaXRfZGVwdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja19oOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICp0bXBfY3IgPSAodWludDE2X3QgKikoZGVzdF9jciArIGkgKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX2NyW2pdID0gZ2V0X2JpdHMoJmdiLCBiaXRfZGVwdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICAgICAgbWVtY3B5KGRlc3RfeSArIGkgKiBsaW5lc2l6ZSwgaC0+aW50cmFfcGNtX3B0ciArIGkgKiAxNiwgMTYpOworICAgICAgICAgICAgaWYgKFNJTVBMRSB8fCAhQ09ORklHX0dSQVkgfHwgIShoLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZGVzdF9jYiArIGkgKiB1dmxpbmVzaXplLCAxIDw8IChiaXRfZGVwdGggLSAxKSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZGVzdF9jciArIGkgKiB1dmxpbmVzaXplLCAxIDw8IChiaXRfZGVwdGggLSAxKSwgOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfY2IgPSBoLT5pbnRyYV9wY21fcHRyICsgMjU2OworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfY3IgPSBoLT5pbnRyYV9wY21fcHRyICsgMjU2ICsgYmxvY2tfaCAqIDg7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja19oOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkZXN0X2NiICsgaSAqIHV2bGluZXNpemUsIHNyY19jYiArIGkgKiA4LCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkZXN0X2NyICsgaSAqIHV2bGluZXNpemUsIHNyY19jciArIGkgKiA4LCA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChJU19JTlRSQShtYl90eXBlKSkgeworICAgICAgICAgICAgaWYgKGgtPmRlYmxvY2tpbmdfZmlsdGVyKQorICAgICAgICAgICAgICAgIHhjaGdfbWJfYm9yZGVyKGgsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgMSwgMCwgU0lNUExFLCBQSVhFTF9TSElGVCk7CisKKyAgICAgICAgICAgIGlmIChTSU1QTEUgfHwgIUNPTkZJR19HUkFZIHx8ICEoaC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgICAgICAgICAgaC0+aHBjLnByZWQ4eDhbaC0+Y2hyb21hX3ByZWRfbW9kZV0oZGVzdF9jYiwgdXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgaC0+aHBjLnByZWQ4eDhbaC0+Y2hyb21hX3ByZWRfbW9kZV0oZGVzdF9jciwgdXZsaW5lc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhsX2RlY29kZV9tYl9wcmVkaWN0X2x1bWEoaCwgbWJfdHlwZSwgaXNfaDI2NCwgU0lNUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fYnlwYXNzLCBQSVhFTF9TSElGVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfb2Zmc2V0LCBsaW5lc2l6ZSwgZGVzdF95LCAwKTsKKworICAgICAgICAgICAgaWYgKGgtPmRlYmxvY2tpbmdfZmlsdGVyKQorICAgICAgICAgICAgICAgIHhjaGdfbWJfYm9yZGVyKGgsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgMCwgMCwgU0lNUExFLCBQSVhFTF9TSElGVCk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNfaDI2NCkgeworICAgICAgICAgICAgaWYgKGNocm9tYTQyMikgeworICAgICAgICAgICAgICAgIEZVTkMoaGxfbW90aW9uXzQyMikoaCwgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cXBlbF9wdXQsIGgtPmgyNjRjaHJvbWEucHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5xcGVsX2F2ZywgaC0+aDI2NGNocm9tYS5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3Aud2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuYml3ZWlnaHRfaDI2NF9waXhlbHNfdGFiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRlVOQyhobF9tb3Rpb25fNDIwKShoLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5xcGVsX3B1dCwgaC0+aDI2NGNocm9tYS5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnFwZWxfYXZnLCBoLT5oMjY0Y2hyb21hLmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC53ZWlnaHRfaDI2NF9waXhlbHNfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC5iaXdlaWdodF9oMjY0X3BpeGVsc190YWIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaGxfZGVjb2RlX21iX2lkY3RfbHVtYShoLCBtYl90eXBlLCBpc19oMjY0LCBTSU1QTEUsIHRyYW5zZm9ybV9ieXBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElYRUxfU0hJRlQsIGJsb2NrX29mZnNldCwgbGluZXNpemUsIGRlc3RfeSwgMCk7CisKKyAgICAgICAgaWYgKChTSU1QTEUgfHwgIUNPTkZJR19HUkFZIHx8ICEoaC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSAmJgorICAgICAgICAgICAgKGgtPmNicCAmIDB4MzApKSB7CisgICAgICAgICAgICB1aW50OF90ICpkZXN0WzJdID0geyBkZXN0X2NiLCBkZXN0X2NyIH07CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtX2J5cGFzcykgeworICAgICAgICAgICAgICAgIGlmIChJU19JTlRSQShtYl90eXBlKSAmJiBoLT5zcHMucHJvZmlsZV9pZGMgPT0gMjQ0ICYmCisgICAgICAgICAgICAgICAgICAgIChoLT5jaHJvbWFfcHJlZF9tb2RlID09IFZFUlRfUFJFRDh4OCB8fAorICAgICAgICAgICAgICAgICAgICAgaC0+Y2hyb21hX3ByZWRfbW9kZSA9PSBIT1JfUFJFRDh4OCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+aHBjLnByZWQ4eDhfYWRkW2gtPmNocm9tYV9wcmVkX21vZGVdKGRlc3RbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19vZmZzZXQgKyAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iICsgKDE2ICogMTYgKiAxIDw8IFBJWEVMX1NISUZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICBoLT5ocGMucHJlZDh4OF9hZGRbaC0+Y2hyb21hX3ByZWRfbW9kZV0oZGVzdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX29mZnNldCArIDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWIgKyAoMTYgKiAxNiAqIDIgPDwgUElYRUxfU0hJRlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWRjdF9hZGQgPSBoLT5oMjY0ZHNwLmgyNjRfYWRkX3BpeGVsczRfY2xlYXI7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGogKiAxNjsgaSA8IGogKiAxNiArIDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbaV1dIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjdGNvZWZfZ2V0KGgtPm1iLCBQSVhFTF9TSElGVCwgaSAqIDE2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRjdF9hZGQoZGVzdFtqIC0gMV0gKyBibG9ja19vZmZzZXRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iICsgKGkgKiAxNiA8PCBQSVhFTF9TSElGVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocm9tYTQyMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGogKiAxNiArIDQ7IGkgPCBqICogMTYgKyA4OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtpICsgNF1dIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY3Rjb2VmX2dldChoLT5tYiwgUElYRUxfU0hJRlQsIGkgKiAxNikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGN0X2FkZChkZXN0W2ogLSAxXSArIGJsb2NrX29mZnNldFtpICsgNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5tYiArIChpICogMTYgPDwgUElYRUxfU0hJRlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpc19oMjY0KSB7CisgICAgICAgICAgICAgICAgICAgIGludCBxcFsyXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNocm9tYTQyMikgeworICAgICAgICAgICAgICAgICAgICAgICAgcXBbMF0gPSBoLT5jaHJvbWFfcXBbMF0gKyAzOworICAgICAgICAgICAgICAgICAgICAgICAgcXBbMV0gPSBoLT5jaHJvbWFfcXBbMV0gKyAzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcXBbMF0gPSBoLT5jaHJvbWFfcXBbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBxcFsxXSA9IGgtPmNocm9tYV9xcFsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbQ0hST01BX0RDX0JMT0NLX0lOREVYICsgMF1dKQorICAgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC5oMjY0X2Nocm9tYV9kY19kZXF1YW50X2lkY3QoaC0+bWIgKyAoMTYgKiAxNiAqIDEgPDwgUElYRUxfU0hJRlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+ZGVxdWFudDRfY29lZmZbSVNfSU5UUkEobWJfdHlwZSkgPyAxIDogNF1bcXBbMF1dWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W0NIUk9NQV9EQ19CTE9DS19JTkRFWCArIDFdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9jaHJvbWFfZGNfZGVxdWFudF9pZGN0KGgtPm1iICsgKDE2ICogMTYgKiAyIDw8IFBJWEVMX1NISUZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ0X2NvZWZmW0lTX0lOVFJBKG1iX3R5cGUpID8gMiA6IDVdW3FwWzFdXVswXSk7CisgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9pZGN0X2FkZDgoZGVzdCwgYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iLCB1dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENPTkZJR19TVlEzX0RFQ09ERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC5oMjY0X2Nocm9tYV9kY19kZXF1YW50X2lkY3QoaC0+bWIgKyAxNiAqIDE2ICogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+ZGVxdWFudDRfY29lZmZbSVNfSU5UUkEobWJfdHlwZSkgPyAxIDogNF1baC0+Y2hyb21hX3FwWzBdXVswXSk7CisgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9jaHJvbWFfZGNfZGVxdWFudF9pZGN0KGgtPm1iICsgMTYgKiAxNiAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ0X2NvZWZmW0lTX0lOVFJBKG1iX3R5cGUpID8gMiA6IDVdW2gtPmNocm9tYV9xcFsxXV1bMF0pOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgMzsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBqICogMTY7IGkgPCBqICogMTYgKyA0OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W2ldXSB8fCBoLT5tYltpICogMTZdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNvbnN0IHB0ciA9IGRlc3RbaiAtIDFdICsgYmxvY2tfb2Zmc2V0W2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9zdnEzX2FkZF9pZGN0X2MocHRyLCBoLT5tYiArIGkgKiAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9oMjY0X2Nocm9tYV9xcFswXVtoLT5xc2NhbGUgKyAxMl0gLSAxMiwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjaWYgIVNJTVBMRSB8fCBCSVRTID09IDgKKworI3VuZGVmICBDSFJPTUFfSURDCisjZGVmaW5lIENIUk9NQV9JREMgMworI2luY2x1ZGUgImgyNjRfbWNfdGVtcGxhdGUuYyIKKworc3RhdGljIGF2X25vaW5saW5lIHZvaWQgRlVOQyhobF9kZWNvZGVfbWJfNDQ0KShIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBjb25zdCBpbnQgbWJfeCAgICA9IGgtPm1iX3g7CisgICAgY29uc3QgaW50IG1iX3kgICAgPSBoLT5tYl95OworICAgIGNvbnN0IGludCBtYl94eSAgID0gaC0+bWJfeHk7CisgICAgY29uc3QgaW50IG1iX3R5cGUgPSBoLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldOworICAgIHVpbnQ4X3QgKmRlc3RbM107CisgICAgaW50IGxpbmVzaXplOworICAgIGludCBpLCBqLCBwOworICAgIGludCAqYmxvY2tfb2Zmc2V0ID0gJmgtPmJsb2NrX29mZnNldFswXTsKKyAgICBjb25zdCBpbnQgdHJhbnNmb3JtX2J5cGFzcyA9ICFTSU1QTEUgJiYgKGgtPnFzY2FsZSA9PSAwICYmIGgtPnNwcy50cmFuc2Zvcm1fYnlwYXNzKTsKKyAgICBjb25zdCBpbnQgcGxhbmVfY291bnQgICAgICA9IChTSU1QTEUgfHwgIUNPTkZJR19HUkFZIHx8ICEoaC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSA/IDMgOiAxOworCisgICAgZm9yIChwID0gMDsgcCA8IHBsYW5lX2NvdW50OyBwKyspIHsKKyAgICAgICAgZGVzdFtwXSA9IGgtPmN1cl9waWMuZi5kYXRhW3BdICsKKyAgICAgICAgICAgICAgICAgICgobWJfeCA8PCBQSVhFTF9TSElGVCkgKyBtYl95ICogaC0+bGluZXNpemUpICogMTY7CisgICAgICAgIGgtPnZkc3AucHJlZmV0Y2goZGVzdFtwXSArIChoLT5tYl94ICYgMykgKiA0ICogaC0+bGluZXNpemUgKyAoNjQgPDwgUElYRUxfU0hJRlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmxpbmVzaXplLCA0KTsKKyAgICB9CisKKyAgICBoLT5saXN0X2NvdW50c1ttYl94eV0gPSBoLT5saXN0X2NvdW50OworCisgICAgaWYgKCFTSU1QTEUgJiYgTUJfRklFTEQoaCkpIHsKKyAgICAgICAgbGluZXNpemUgICAgID0gaC0+bWJfbGluZXNpemUgPSBoLT5tYl91dmxpbmVzaXplID0gaC0+bGluZXNpemUgKiAyOworICAgICAgICBibG9ja19vZmZzZXQgPSAmaC0+YmxvY2tfb2Zmc2V0WzQ4XTsKKyAgICAgICAgaWYgKG1iX3kgJiAxKSAvLyBGSVhNRSBtb3ZlIG91dCBvZiB0aGlzIGZ1bmN0aW9uPworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IDM7IHArKykKKyAgICAgICAgICAgICAgICBkZXN0W3BdIC09IGgtPmxpbmVzaXplICogMTU7CisgICAgICAgIGlmIChGUkFNRV9NQkFGRihoKSkgeworICAgICAgICAgICAgaW50IGxpc3Q7CisgICAgICAgICAgICBmb3IgKGxpc3QgPSAwOyBsaXN0IDwgaC0+bGlzdF9jb3VudDsgbGlzdCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFVU0VTX0xJU1QobWJfdHlwZSwgbGlzdCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChJU18xNlgxNihtYl90eXBlKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnJlZiA9ICZoLT5yZWZfY2FjaGVbbGlzdF1bc2NhbjhbMF1dOworICAgICAgICAgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZShyZWYsIDQsIDQsIDgsICgxNiArICpyZWYpIF4gKGgtPm1iX3kgJiAxKSwgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWYgPSBoLT5yZWZfY2FjaGVbbGlzdF1bc2NhbjhbaV1dOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZiA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5yZWZfY2FjaGVbbGlzdF1bc2NhbjhbaV1dLCAyLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsICgxNiArIHJlZikgXiAoaC0+bWJfeSAmIDEpLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGxpbmVzaXplID0gaC0+bWJfbGluZXNpemUgPSBoLT5tYl91dmxpbmVzaXplID0gaC0+bGluZXNpemU7CisgICAgfQorCisgICAgaWYgKCFTSU1QTEUgJiYgSVNfSU5UUkFfUENNKG1iX3R5cGUpKSB7CisgICAgICAgIGlmIChQSVhFTF9TSElGVCkgeworICAgICAgICAgICAgY29uc3QgaW50IGJpdF9kZXB0aCA9IGgtPnNwcy5iaXRfZGVwdGhfbHVtYTsKKyAgICAgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgaC0+aW50cmFfcGNtX3B0ciwgNzY4ICogYml0X2RlcHRoKTsKKworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHBsYW5lX2NvdW50OyBwKyspCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKnRtcCA9ICh1aW50MTZfdCAqKShkZXN0W3BdICsgaSAqIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICB0bXBbal0gPSBnZXRfYml0cygmZ2IsIGJpdF9kZXB0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHBsYW5lX2NvdW50OyBwKyspCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShkZXN0W3BdICsgaSAqIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+aW50cmFfcGNtX3B0ciArIHAgKiAyNTYgKyBpICogMTYsIDE2KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChJU19JTlRSQShtYl90eXBlKSkgeworICAgICAgICAgICAgaWYgKGgtPmRlYmxvY2tpbmdfZmlsdGVyKQorICAgICAgICAgICAgICAgIHhjaGdfbWJfYm9yZGVyKGgsIGRlc3RbMF0sIGRlc3RbMV0sIGRlc3RbMl0sIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplLCAxLCAxLCBTSU1QTEUsIFBJWEVMX1NISUZUKTsKKworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHBsYW5lX2NvdW50OyBwKyspCisgICAgICAgICAgICAgICAgaGxfZGVjb2RlX21iX3ByZWRpY3RfbHVtYShoLCBtYl90eXBlLCAxLCBTSU1QTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fYnlwYXNzLCBQSVhFTF9TSElGVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX29mZnNldCwgbGluZXNpemUsIGRlc3RbcF0sIHApOworCisgICAgICAgICAgICBpZiAoaC0+ZGVibG9ja2luZ19maWx0ZXIpCisgICAgICAgICAgICAgICAgeGNoZ19tYl9ib3JkZXIoaCwgZGVzdFswXSwgZGVzdFsxXSwgZGVzdFsyXSwgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUsIDAsIDEsIFNJTVBMRSwgUElYRUxfU0hJRlQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRlVOQyhobF9tb3Rpb25fNDQ0KShoLCBkZXN0WzBdLCBkZXN0WzFdLCBkZXN0WzJdLAorICAgICAgICAgICAgICAgICAgICAgIGgtPnFwZWxfcHV0LCBoLT5oMjY0Y2hyb21hLnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiLAorICAgICAgICAgICAgICAgICAgICAgIGgtPnFwZWxfYXZnLCBoLT5oMjY0Y2hyb21hLmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiLAorICAgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3Aud2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0ZHNwLmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcGxhbmVfY291bnQ7IHArKykKKyAgICAgICAgICAgIGhsX2RlY29kZV9tYl9pZGN0X2x1bWEoaCwgbWJfdHlwZSwgMSwgU0lNUExFLCB0cmFuc2Zvcm1fYnlwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVhFTF9TSElGVCwgYmxvY2tfb2Zmc2V0LCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtwXSwgcCk7CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfbWNfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfbWNfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTRlNDc3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9tY190ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJoMjY0LmgiCisKKyN1bmRlZiBNQ0ZVTkMKKworI2lmICAgQ0hST01BX0lEQyA9PSAxCisjICAgZGVmaW5lIE1DRlVOQyhuKSBGVU5DKG4gIyMgXzQyMCkKKyNlbGlmIENIUk9NQV9JREMgPT0gMgorIyAgIGRlZmluZSBNQ0ZVTkMobikgRlVOQyhuICMjIF80MjIpCisjZWxpZiBDSFJPTUFfSURDID09IDMKKyMgICBkZWZpbmUgTUNGVU5DKG4pIEZVTkMobiAjIyBfNDQ0KQorI2VuZGlmCisKKyN1bmRlZiAgbWNfcGFydAorI2RlZmluZSBtY19wYXJ0IE1DRlVOQyhtY19wYXJ0KQorCitzdGF0aWMgdm9pZCBtY19wYXJ0KEgyNjRDb250ZXh0ICpoLCBpbnQgbiwgaW50IHNxdWFyZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGRlbHRhLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X3ksIHVpbnQ4X3QgKmRlc3RfY2IsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgIGludCB4X29mZnNldCwgaW50IHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBxcGVsX21jX2Z1bmMgKnFwaXhfcHV0LAorICAgICAgICAgICAgICAgICAgICBoMjY0X2Nocm9tYV9tY19mdW5jIGNocm9tYV9wdXQsCisgICAgICAgICAgICAgICAgICAgIHFwZWxfbWNfZnVuYyAqcXBpeF9hdmcsCisgICAgICAgICAgICAgICAgICAgIGgyNjRfY2hyb21hX21jX2Z1bmMgY2hyb21hX2F2ZywKKyAgICAgICAgICAgICAgICAgICAgaDI2NF93ZWlnaHRfZnVuYyAqd2VpZ2h0X29wLAorICAgICAgICAgICAgICAgICAgICBoMjY0X2Jpd2VpZ2h0X2Z1bmMgKndlaWdodF9hdmcsCisgICAgICAgICAgICAgICAgICAgIGludCBsaXN0MCwgaW50IGxpc3QxKQoreworICAgIGlmICgoaC0+dXNlX3dlaWdodCA9PSAyICYmIGxpc3QwICYmIGxpc3QxICYmCisgICAgICAgICAoaC0+aW1wbGljaXRfd2VpZ2h0W2gtPnJlZl9jYWNoZVswXVtzY2FuOFtuXV1dW2gtPnJlZl9jYWNoZVsxXVtzY2FuOFtuXV1dW2gtPm1iX3kgJiAxXSAhPSAzMikpIHx8CisgICAgICAgIGgtPnVzZV93ZWlnaHQgPT0gMSkKKyAgICAgICAgbWNfcGFydF93ZWlnaHRlZChoLCBuLCBzcXVhcmUsIGhlaWdodCwgZGVsdGEsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4X29mZnNldCwgeV9vZmZzZXQsIHFwaXhfcHV0LCBjaHJvbWFfcHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF9vcFswXSwgd2VpZ2h0X29wWzFdLCB3ZWlnaHRfYXZnWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF9hdmdbMV0sIGxpc3QwLCBsaXN0MSwgUElYRUxfU0hJRlQsIENIUk9NQV9JREMpOworICAgIGVsc2UKKyAgICAgICAgbWNfcGFydF9zdGQoaCwgbiwgc3F1YXJlLCBoZWlnaHQsIGRlbHRhLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgIHhfb2Zmc2V0LCB5X29mZnNldCwgcXBpeF9wdXQsIGNocm9tYV9wdXQsIHFwaXhfYXZnLAorICAgICAgICAgICAgICAgICAgICBjaHJvbWFfYXZnLCBsaXN0MCwgbGlzdDEsIFBJWEVMX1NISUZULCBDSFJPTUFfSURDKTsKK30KKworc3RhdGljIHZvaWQgTUNGVU5DKGhsX21vdGlvbikoSDI2NENvbnRleHQgKmgsIHVpbnQ4X3QgKmRlc3RfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY2IsIHVpbnQ4X3QgKmRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcGVsX21jX2Z1bmMoKnFwaXhfcHV0KVsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0X2Nocm9tYV9tY19mdW5jKCpjaHJvbWFfcHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFwZWxfbWNfZnVuYygqcXBpeF9hdmcpWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRfY2hyb21hX21jX2Z1bmMoKmNocm9tYV9hdmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF93ZWlnaHRfZnVuYyAqd2VpZ2h0X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF9iaXdlaWdodF9mdW5jICp3ZWlnaHRfYXZnKQoreworICAgIGNvbnN0IGludCBtYl94eSAgID0gaC0+bWJfeHk7CisgICAgY29uc3QgaW50IG1iX3R5cGUgPSBoLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldOworCisgICAgYXZfYXNzZXJ0MihJU19JTlRFUihtYl90eXBlKSk7CisKKyAgICBpZiAoSEFWRV9USFJFQURTICYmIChoLT5hdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSkKKyAgICAgICAgYXdhaXRfcmVmZXJlbmNlcyhoKTsKKyAgICBwcmVmZXRjaF9tb3Rpb24oaCwgMCwgUElYRUxfU0hJRlQsIENIUk9NQV9JREMpOworCisgICAgaWYgKElTXzE2WDE2KG1iX3R5cGUpKSB7CisgICAgICAgIG1jX3BhcnQoaCwgMCwgMSwgMTYsIDAsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgMCwgMCwKKyAgICAgICAgICAgICAgICBxcGl4X3B1dFswXSwgY2hyb21hX3B1dFswXSwgcXBpeF9hdmdbMF0sIGNocm9tYV9hdmdbMF0sCisgICAgICAgICAgICAgICAgd2VpZ2h0X29wLCB3ZWlnaHRfYXZnLAorICAgICAgICAgICAgICAgIElTX0RJUihtYl90eXBlLCAwLCAwKSwgSVNfRElSKG1iX3R5cGUsIDAsIDEpKTsKKyAgICB9IGVsc2UgaWYgKElTXzE2WDgobWJfdHlwZSkpIHsKKyAgICAgICAgbWNfcGFydChoLCAwLCAwLCA4LCA4IDw8IFBJWEVMX1NISUZULCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIDAsIDAsCisgICAgICAgICAgICAgICAgcXBpeF9wdXRbMV0sIGNocm9tYV9wdXRbMF0sIHFwaXhfYXZnWzFdLCBjaHJvbWFfYXZnWzBdLAorICAgICAgICAgICAgICAgIHdlaWdodF9vcCwgd2VpZ2h0X2F2ZywKKyAgICAgICAgICAgICAgICBJU19ESVIobWJfdHlwZSwgMCwgMCksIElTX0RJUihtYl90eXBlLCAwLCAxKSk7CisgICAgICAgIG1jX3BhcnQoaCwgOCwgMCwgOCwgOCA8PCBQSVhFTF9TSElGVCwgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLCAwLCA0LAorICAgICAgICAgICAgICAgIHFwaXhfcHV0WzFdLCBjaHJvbWFfcHV0WzBdLCBxcGl4X2F2Z1sxXSwgY2hyb21hX2F2Z1swXSwKKyAgICAgICAgICAgICAgICB3ZWlnaHRfb3AsIHdlaWdodF9hdmcsCisgICAgICAgICAgICAgICAgSVNfRElSKG1iX3R5cGUsIDEsIDApLCBJU19ESVIobWJfdHlwZSwgMSwgMSkpOworICAgIH0gZWxzZSBpZiAoSVNfOFgxNihtYl90eXBlKSkgeworICAgICAgICBtY19wYXJ0KGgsIDAsIDAsIDE2LCA4ICogaC0+bWJfbGluZXNpemUsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgMCwgMCwKKyAgICAgICAgICAgICAgICBxcGl4X3B1dFsxXSwgY2hyb21hX3B1dFsxXSwgcXBpeF9hdmdbMV0sIGNocm9tYV9hdmdbMV0sCisgICAgICAgICAgICAgICAgJndlaWdodF9vcFsxXSwgJndlaWdodF9hdmdbMV0sCisgICAgICAgICAgICAgICAgSVNfRElSKG1iX3R5cGUsIDAsIDApLCBJU19ESVIobWJfdHlwZSwgMCwgMSkpOworICAgICAgICBtY19wYXJ0KGgsIDQsIDAsIDE2LCA4ICogaC0+bWJfbGluZXNpemUsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgNCwgMCwKKyAgICAgICAgICAgICAgICBxcGl4X3B1dFsxXSwgY2hyb21hX3B1dFsxXSwgcXBpeF9hdmdbMV0sIGNocm9tYV9hdmdbMV0sCisgICAgICAgICAgICAgICAgJndlaWdodF9vcFsxXSwgJndlaWdodF9hdmdbMV0sCisgICAgICAgICAgICAgICAgSVNfRElSKG1iX3R5cGUsIDEsIDApLCBJU19ESVIobWJfdHlwZSwgMSwgMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGF2X2Fzc2VydDIoSVNfOFg4KG1iX3R5cGUpKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgc3ViX21iX3R5cGUgPSBoLT5zdWJfbWJfdHlwZVtpXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBuICA9IDQgKiBpOworICAgICAgICAgICAgaW50IHhfb2Zmc2V0ID0gKGkgJiAxKSA8PCAyOworICAgICAgICAgICAgaW50IHlfb2Zmc2V0ID0gKGkgJiAyKSA8PCAxOworCisgICAgICAgICAgICBpZiAoSVNfU1VCXzhYOChzdWJfbWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICBtY19wYXJ0KGgsIG4sIDEsIDgsIDAsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHhfb2Zmc2V0LCB5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHFwaXhfcHV0WzFdLCBjaHJvbWFfcHV0WzFdLCBxcGl4X2F2Z1sxXSwgY2hyb21hX2F2Z1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3ZWlnaHRfb3BbMV0sICZ3ZWlnaHRfYXZnWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgSVNfRElSKHN1Yl9tYl90eXBlLCAwLCAwKSwgSVNfRElSKHN1Yl9tYl90eXBlLCAwLCAxKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKElTX1NVQl84WDQoc3ViX21iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgbWNfcGFydChoLCBuLCAwLCA0LCA0IDw8IFBJWEVMX1NISUZULCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICB4X29mZnNldCwgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBxcGl4X3B1dFsyXSwgY2hyb21hX3B1dFsxXSwgcXBpeF9hdmdbMl0sIGNocm9tYV9hdmdbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAmd2VpZ2h0X29wWzFdLCAmd2VpZ2h0X2F2Z1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElTX0RJUihzdWJfbWJfdHlwZSwgMCwgMCksIElTX0RJUihzdWJfbWJfdHlwZSwgMCwgMSkpOworICAgICAgICAgICAgICAgIG1jX3BhcnQoaCwgbiArIDIsIDAsIDQsIDQgPDwgUElYRUxfU0hJRlQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIHhfb2Zmc2V0LCB5X29mZnNldCArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICBxcGl4X3B1dFsyXSwgY2hyb21hX3B1dFsxXSwgcXBpeF9hdmdbMl0sIGNocm9tYV9hdmdbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAmd2VpZ2h0X29wWzFdLCAmd2VpZ2h0X2F2Z1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElTX0RJUihzdWJfbWJfdHlwZSwgMCwgMCksIElTX0RJUihzdWJfbWJfdHlwZSwgMCwgMSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChJU19TVUJfNFg4KHN1Yl9tYl90eXBlKSkgeworICAgICAgICAgICAgICAgIG1jX3BhcnQoaCwgbiwgMCwgOCwgNCAqIGgtPm1iX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLCB4X29mZnNldCwgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBxcGl4X3B1dFsyXSwgY2hyb21hX3B1dFsyXSwgcXBpeF9hdmdbMl0sIGNocm9tYV9hdmdbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAmd2VpZ2h0X29wWzJdLCAmd2VpZ2h0X2F2Z1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElTX0RJUihzdWJfbWJfdHlwZSwgMCwgMCksIElTX0RJUihzdWJfbWJfdHlwZSwgMCwgMSkpOworICAgICAgICAgICAgICAgIG1jX3BhcnQoaCwgbiArIDEsIDAsIDgsIDQgKiBoLT5tYl9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgeF9vZmZzZXQgKyAyLCB5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHFwaXhfcHV0WzJdLCBjaHJvbWFfcHV0WzJdLCBxcGl4X2F2Z1syXSwgY2hyb21hX2F2Z1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3ZWlnaHRfb3BbMl0sICZ3ZWlnaHRfYXZnWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgSVNfRElSKHN1Yl9tYl90eXBlLCAwLCAwKSwgSVNfRElSKHN1Yl9tYl90eXBlLCAwLCAxKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIoSVNfU1VCXzRYNChzdWJfbWJfdHlwZSkpOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN1Yl94X29mZnNldCA9IHhfb2Zmc2V0ICsgMiAqIChqICYgMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBzdWJfeV9vZmZzZXQgPSB5X29mZnNldCArIChqICYgMik7CisgICAgICAgICAgICAgICAgICAgIG1jX3BhcnQoaCwgbiArIGosIDEsIDQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLCBzdWJfeF9vZmZzZXQsIHN1Yl95X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcGl4X3B1dFsyXSwgY2hyb21hX3B1dFsyXSwgcXBpeF9hdmdbMl0sIGNocm9tYV9hdmdbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndlaWdodF9vcFsyXSwgJndlaWdodF9hdmdbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfRElSKHN1Yl9tYl90eXBlLCAwLCAwKSwgSVNfRElSKHN1Yl9tYl90eXBlLCAwLCAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJlZmV0Y2hfbW90aW9uKGgsIDEsIFBJWEVMX1NISUZULCBDSFJPTUFfSURDKTsKK30KKwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9tcDR0b2FubmV4Yl9ic2YuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfbXA0dG9hbm5leGJfYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5NmVlOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfbXA0dG9hbm5leGJfYnNmLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBILjI2NCBNUDQgdG8gQW5uZXggQiBieXRlIHN0cmVhbSBmb3JtYXQgZmlsdGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQmVub2l0IEZvdWV0IDxiZW5vaXQuZm91ZXRAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKK3R5cGVkZWYgc3RydWN0IEgyNjRCU0ZDb250ZXh0IHsKKyAgICBpbnQzMl90ICBzcHNfb2Zmc2V0OworICAgIGludDMyX3QgIHBwc19vZmZzZXQ7CisgICAgdWludDhfdCAgbGVuZ3RoX3NpemU7CisgICAgdWludDhfdCAgbmV3X2lkcjsKKyAgICB1aW50OF90ICBpZHJfc3BzX3NlZW47CisgICAgdWludDhfdCAgaWRyX3Bwc19zZWVuOworICAgIGludCAgICAgIGV4dHJhZGF0YV9wYXJzZWQ7Cit9IEgyNjRCU0ZDb250ZXh0OworCitzdGF0aWMgaW50IGFsbG9jX2FuZF9jb3B5KHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3BzX3BwcywgdWludDMyX3Qgc3BzX3Bwc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgdWludDMyX3QgaW5fc2l6ZSkKK3sKKyAgICB1aW50MzJfdCBvZmZzZXQgICAgICAgICA9ICpwb3V0YnVmX3NpemU7CisgICAgdWludDhfdCBuYWxfaGVhZGVyX3NpemUgPSBvZmZzZXQgPyAzIDogNDsKKyAgICBpbnQgZXJyOworCisgICAgKnBvdXRidWZfc2l6ZSArPSBzcHNfcHBzX3NpemUgKyBpbl9zaXplICsgbmFsX2hlYWRlcl9zaXplOworICAgIGlmICgoZXJyID0gYXZfcmVhbGxvY3AocG91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3V0YnVmX3NpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSkgPCAwKSB7CisgICAgICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAoc3BzX3BwcykKKyAgICAgICAgbWVtY3B5KCpwb3V0YnVmICsgb2Zmc2V0LCBzcHNfcHBzLCBzcHNfcHBzX3NpemUpOworICAgIG1lbWNweSgqcG91dGJ1ZiArIHNwc19wcHNfc2l6ZSArIG5hbF9oZWFkZXJfc2l6ZSArIG9mZnNldCwgaW4sIGluX3NpemUpOworICAgIGlmICghb2Zmc2V0KSB7CisgICAgICAgIEFWX1dCMzIoKnBvdXRidWYgKyBzcHNfcHBzX3NpemUsIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgICgqcG91dGJ1ZiArIG9mZnNldCArIHNwc19wcHNfc2l6ZSlbMF0gPQorICAgICAgICAoKnBvdXRidWYgKyBvZmZzZXQgKyBzcHNfcHBzX3NpemUpWzFdID0gMDsKKyAgICAgICAgKCpwb3V0YnVmICsgb2Zmc2V0ICsgc3BzX3Bwc19zaXplKVsyXSA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDI2NF9leHRyYWRhdGFfdG9fYW5uZXhiKEgyNjRCU0ZDb250ZXh0ICpjdHgsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgaW50IHBhZGRpbmcpCit7CisgICAgdWludDE2X3QgdW5pdF9zaXplOworICAgIHVpbnQ2NF90IHRvdGFsX3NpemUgICAgICAgICAgICAgICAgID0gMDsKKyAgICB1aW50OF90ICpvdXQgICAgICAgICAgICAgICAgICAgICAgICA9IE5VTEwsIHVuaXRfbmIsIHNwc19kb25lID0gMCwKKyAgICAgICAgICAgICBzcHNfc2VlbiAgICAgICAgICAgICAgICAgICA9IDAsIHBwc19zZWVuID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpleHRyYWRhdGEgICAgICAgICAgICA9IGF2Y3R4LT5leHRyYWRhdGEgKyA0OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG5hbHVfaGVhZGVyWzRdID0geyAwLCAwLCAwLCAxIH07CisgICAgaW50IGxlbmd0aF9zaXplID0gKCpleHRyYWRhdGErKyAmIDB4MykgKyAxOyAvLyByZXRyaWV2ZSBsZW5ndGggY29kZWQgc2l6ZQorCisgICAgY3R4LT5zcHNfb2Zmc2V0ID0gY3R4LT5wcHNfb2Zmc2V0ID0gLTE7CisKKyAgICAvKiByZXRyaWV2ZSBzcHMgYW5kIHBwcyB1bml0KHMpICovCisgICAgdW5pdF9uYiA9ICpleHRyYWRhdGErKyAmIDB4MWY7IC8qIG51bWJlciBvZiBzcHMgdW5pdChzKSAqLworICAgIGlmICghdW5pdF9uYikgeworICAgICAgICBnb3RvIHBwczsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPnNwc19vZmZzZXQgPSAwOworICAgICAgICBzcHNfc2VlbiA9IDE7CisgICAgfQorCisgICAgd2hpbGUgKHVuaXRfbmItLSkgeworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIHVuaXRfc2l6ZSAgID0gQVZfUkIxNihleHRyYWRhdGEpOworICAgICAgICB0b3RhbF9zaXplICs9IHVuaXRfc2l6ZSArIDQ7CisgICAgICAgIGlmICh0b3RhbF9zaXplID4gSU5UX01BWCAtIHBhZGRpbmcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJUb28gYmlnIGV4dHJhZGF0YSBzaXplLCBjb3JydXB0ZWQgc3RyZWFtIG9yIGludmFsaWQgTVA0L0FWQ0MgYml0c3RyZWFtXG4iKTsKKyAgICAgICAgICAgIGF2X2ZyZWUob3V0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4dHJhZGF0YSArIDIgKyB1bml0X3NpemUgPiBhdmN0eC0+ZXh0cmFkYXRhICsgYXZjdHgtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCBoZWFkZXIgaXMgbm90IGNvbnRhaW5lZCBpbiBnbG9iYWwgZXh0cmFkYXRhLCAiCisgICAgICAgICAgICAgICAgICAgImNvcnJ1cHRlZCBzdHJlYW0gb3IgaW52YWxpZCBNUDQvQVZDQyBiaXRzdHJlYW1cbiIpOworICAgICAgICAgICAgYXZfZnJlZShvdXQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZvdXQsIHRvdGFsX3NpemUgKyBwYWRkaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgbWVtY3B5KG91dCArIHRvdGFsX3NpemUgLSB1bml0X3NpemUgLSA0LCBuYWx1X2hlYWRlciwgNCk7CisgICAgICAgIG1lbWNweShvdXQgKyB0b3RhbF9zaXplIC0gdW5pdF9zaXplLCBleHRyYWRhdGEgKyAyLCB1bml0X3NpemUpOworICAgICAgICBleHRyYWRhdGEgKz0gMiArIHVuaXRfc2l6ZTsKK3BwczoKKyAgICAgICAgaWYgKCF1bml0X25iICYmICFzcHNfZG9uZSsrKSB7CisgICAgICAgICAgICB1bml0X25iID0gKmV4dHJhZGF0YSsrOyAvKiBudW1iZXIgb2YgcHBzIHVuaXQocykgKi8KKyAgICAgICAgICAgIGlmICh1bml0X25iKSB7CisgICAgICAgICAgICAgICAgY3R4LT5wcHNfb2Zmc2V0ID0gKGV4dHJhZGF0YSAtIDEpIC0gKGF2Y3R4LT5leHRyYWRhdGEgKyA0KTsKKyAgICAgICAgICAgICAgICBwcHNfc2VlbiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0KQorICAgICAgICBtZW1zZXQob3V0ICsgdG90YWxfc2l6ZSwgMCwgcGFkZGluZyk7CisKKyAgICBpZiAoIXNwc19zZWVuKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIldhcm5pbmc6IFNQUyBOQUxVIG1pc3Npbmcgb3IgaW52YWxpZC4gIgorICAgICAgICAgICAgICAgIlRoZSByZXN1bHRpbmcgc3RyZWFtIG1heSBub3QgcGxheS5cbiIpOworCisgICAgaWYgKCFwcHNfc2VlbikKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJXYXJuaW5nOiBQUFMgTkFMVSBtaXNzaW5nIG9yIGludmFsaWQuICIKKyAgICAgICAgICAgICAgICJUaGUgcmVzdWx0aW5nIHN0cmVhbSBtYXkgbm90IHBsYXkuXG4iKTsKKworICAgIGF2X2ZyZWUoYXZjdHgtPmV4dHJhZGF0YSk7CisgICAgYXZjdHgtPmV4dHJhZGF0YSAgICAgID0gb3V0OworICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHRvdGFsX3NpemU7CisKKyAgICByZXR1cm4gbGVuZ3RoX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgaDI2NF9tcDR0b2FubmV4Yl9maWx0ZXIoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlmcmFtZSkKK3sKKyAgICBIMjY0QlNGQ29udGV4dCAqY3R4ID0gYnNmYy0+cHJpdl9kYXRhOworICAgIGludCBpOworICAgIHVpbnQ4X3QgdW5pdF90eXBlOworICAgIGludDMyX3QgbmFsX3NpemU7CisgICAgdWludDMyX3QgY3VtdWxfc2l6ZSAgICA9IDA7CisgICAgY29uc3QgdWludDhfdCAqYnVmX2VuZCA9IGJ1ZiArIGJ1Zl9zaXplOworICAgIGludCByZXQgPSAwOworCisgICAgLyogbm90aGluZyB0byBmaWx0ZXIgKi8KKyAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEgfHwgYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgNikgeworICAgICAgICAqcG91dGJ1ZiAgICAgID0gKHVpbnQ4X3QgKilidWY7CisgICAgICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogcmV0cmlldmUgc3BzIGFuZCBwcHMgTkFMIHVuaXRzIGZyb20gZXh0cmFkYXRhICovCisgICAgaWYgKCFjdHgtPmV4dHJhZGF0YV9wYXJzZWQpIHsKKyAgICAgICAgcmV0ID0gaDI2NF9leHRyYWRhdGFfdG9fYW5uZXhiKGN0eCwgYXZjdHgsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGN0eC0+bGVuZ3RoX3NpemUgICAgICA9IHJldDsKKyAgICAgICAgY3R4LT5uZXdfaWRyICAgICAgICAgID0gMTsKKyAgICAgICAgY3R4LT5pZHJfc3BzX3NlZW4gICAgID0gMDsKKyAgICAgICAgY3R4LT5pZHJfcHBzX3NlZW4gICAgID0gMDsKKyAgICAgICAgY3R4LT5leHRyYWRhdGFfcGFyc2VkID0gMTsKKyAgICB9CisKKyAgICAqcG91dGJ1Zl9zaXplID0gMDsKKyAgICAqcG91dGJ1ZiAgICAgID0gTlVMTDsKKyAgICBkbyB7CisgICAgICAgIHJldD0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBpZiAoYnVmICsgY3R4LT5sZW5ndGhfc2l6ZSA+IGJ1Zl9lbmQpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgZm9yIChuYWxfc2l6ZSA9IDAsIGkgPSAwOyBpPGN0eC0+bGVuZ3RoX3NpemU7IGkrKykKKyAgICAgICAgICAgIG5hbF9zaXplID0gKG5hbF9zaXplIDw8IDgpIHwgYnVmW2ldOworCisgICAgICAgIGJ1ZiAgICAgICs9IGN0eC0+bGVuZ3RoX3NpemU7CisgICAgICAgIHVuaXRfdHlwZSA9ICpidWYgJiAweDFmOworCisgICAgICAgIGlmIChidWYgKyBuYWxfc2l6ZSA+IGJ1Zl9lbmQgfHwgbmFsX3NpemUgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIGlmICh1bml0X3R5cGUgPT0gNykKKyAgICAgICAgICAgIGN0eC0+aWRyX3Nwc19zZWVuID0gY3R4LT5uZXdfaWRyID0gMTsKKyAgICAgICAgZWxzZSBpZiAodW5pdF90eXBlID09IDgpIHsKKyAgICAgICAgICAgIGN0eC0+aWRyX3Bwc19zZWVuID0gY3R4LT5uZXdfaWRyID0gMTsKKyAgICAgICAgICAgIC8qIGlmIFNQUyBoYXMgbm90IGJlZW4gc2VlbiB5ZXQsIHByZXBlbmQgdGhlIEFWQ0Mgb25lIHRvIFBQUyAqLworICAgICAgICAgICAgaWYgKCFjdHgtPmlkcl9zcHNfc2VlbikgeworICAgICAgICAgICAgICAgIGlmIChjdHgtPnNwc19vZmZzZXQgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJTUFMgbm90IHByZXNlbnQgaW4gdGhlIHN0cmVhbSwgbm9yIGluIEFWQ0MsIHN0cmVhbSBtYXkgYmUgdW5yZWFkYWJsZVxuIik7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYWxsb2NfYW5kX2NvcHkocG91dGJ1ZiwgcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhICsgY3R4LT5zcHNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBwc19vZmZzZXQgIT0gLTEgPyBjdHgtPnBwc19vZmZzZXQgOiBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgLSBjdHgtPnNwc19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgbmFsX3NpemUpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+aWRyX3Nwc19zZWVuID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0X25hbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiB0aGlzIGlzIGEgbmV3IElEUiBwaWN0dXJlIGZvbGxvd2luZyBhbiBJRFIgcGljdHVyZSwgcmVzZXQgdGhlIGlkciBmbGFnLgorICAgICAgICAgKiBKdXN0IGNoZWNrIGZpcnN0X21iX2luX3NsaWNlIHRvIGJlIDAgYXMgdGhpcyBpcyB0aGUgc2ltcGxlc3Qgc29sdXRpb24uCisgICAgICAgICAqIFRoaXMgY291bGQgYmUgY2hlY2tpbmcgaWRyX3BpY19pZCBpbnN0ZWFkLCBidXQgd291bGQgY29tcGxleGlmeSB0aGUgcGFyc2luZy4gKi8KKyAgICAgICAgaWYgKCFjdHgtPm5ld19pZHIgJiYgdW5pdF90eXBlID09IDUgJiYgKGJ1ZlsxXSAmIDB4ODApKQorICAgICAgICAgICAgY3R4LT5uZXdfaWRyID0gMTsKKworICAgICAgICAvKiBwcmVwZW5kIG9ubHkgdG8gdGhlIGZpcnN0IHR5cGUgNSBOQUwgdW5pdCBvZiBhbiBJRFIgcGljdHVyZSwgaWYgbm8gc3BzL3BwcyBhcmUgYWxyZWFkeSBwcmVzZW50ICovCisgICAgICAgIGlmIChjdHgtPm5ld19pZHIgJiYgdW5pdF90eXBlID09IDUgJiYgIWN0eC0+aWRyX3Nwc19zZWVuICYmICFjdHgtPmlkcl9wcHNfc2VlbikgeworICAgICAgICAgICAgaWYgKChyZXQ9YWxsb2NfYW5kX2NvcHkocG91dGJ1ZiwgcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIG5hbF9zaXplKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGN0eC0+bmV3X2lkciA9IDA7CisgICAgICAgIC8qIGlmIG9ubHkgU1BTIGhhcyBiZWVuIHNlZW4sIGFsc28gaW5zZXJ0IFBQUyAqLworICAgICAgICB9IGVsc2UgaWYgKGN0eC0+bmV3X2lkciAmJiB1bml0X3R5cGUgPT0gNSAmJiBjdHgtPmlkcl9zcHNfc2VlbiAmJiAhY3R4LT5pZHJfcHBzX3NlZW4pIHsKKyAgICAgICAgICAgIGlmIChjdHgtPnBwc19vZmZzZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiUFBTIG5vdCBwcmVzZW50IGluIHRoZSBzdHJlYW0sIG5vciBpbiBBVkNDLCBzdHJlYW0gbWF5IGJlIHVucmVhZGFibGVcbiIpOworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYWxsb2NfYW5kX2NvcHkocG91dGJ1ZiwgcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIGJ1ZiwgbmFsX3NpemUpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHJldCA9IGFsbG9jX2FuZF9jb3B5KHBvdXRidWYsIHBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhICsgY3R4LT5wcHNfb2Zmc2V0LCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgLSBjdHgtPnBwc19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBuYWxfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKHJldD1hbGxvY19hbmRfY29weShwb3V0YnVmLCBwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgYnVmLCBuYWxfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBpZiAoIWN0eC0+bmV3X2lkciAmJiB1bml0X3R5cGUgPT0gMSkgeworICAgICAgICAgICAgICAgIGN0eC0+bmV3X2lkciA9IDE7CisgICAgICAgICAgICAgICAgY3R4LT5pZHJfc3BzX3NlZW4gPSAwOworICAgICAgICAgICAgICAgIGN0eC0+aWRyX3Bwc19zZWVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCituZXh0X25hbDoKKyAgICAgICAgYnVmICAgICAgICArPSBuYWxfc2l6ZTsKKyAgICAgICAgY3VtdWxfc2l6ZSArPSBuYWxfc2l6ZSArIGN0eC0+bGVuZ3RoX3NpemU7CisgICAgfSB3aGlsZSAoY3VtdWxfc2l6ZSA8IGJ1Zl9zaXplKTsKKworICAgIHJldHVybiAxOworCitmYWlsOgorICAgIGF2X2ZyZWVwKHBvdXRidWYpOworICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK0FWQml0U3RyZWFtRmlsdGVyIGZmX2gyNjRfbXA0dG9hbm5leGJfYnNmID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoMjY0X21wNHRvYW5uZXhiIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSDI2NEJTRkNvbnRleHQpLAorICAgIC5maWx0ZXIgICAgICAgICA9IGgyNjRfbXA0dG9hbm5leGJfZmlsdGVyLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfbXZwcmVkLmggYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X212cHJlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMWU5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X212cHJlZC5oCkBAIC0wLDAgKzEsODMwIEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gbW90aW9uIHZlY3RvciBwcmVkaWNpb24KKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBtb3Rpb24gdmVjdG9yIHByZWRpY2lvbi4KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSDI2NF9NVlBSRURfSAorI2RlZmluZSBBVkNPREVDX0gyNjRfTVZQUkVEX0gKKworI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZmV0Y2hfZGlhZ29uYWxfbXYoSDI2NENvbnRleHQgKmgsIGNvbnN0IGludDE2X3QgKipDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgbGlzdCwgaW50IHBhcnRfd2lkdGgpCit7CisgICAgY29uc3QgaW50IHRvcHJpZ2h0X3JlZiA9IGgtPnJlZl9jYWNoZVtsaXN0XVtpIC0gOCArIHBhcnRfd2lkdGhdOworCisgICAgLyogdGhlcmUgaXMgbm8gY29uc2lzdGVudCBtYXBwaW5nIG9mIG12cyB0byBuZWlnaGJvcmluZyBsb2NhdGlvbnMgdGhhdCB3aWxsCisgICAgICogbWFrZSBtYmFmZiBoYXBweSwgc28gd2UgY2FuJ3QgbW92ZSBhbGwgdGhpcyBsb2dpYyB0byBmaWxsX2NhY2hlcyAqLworICAgIGlmIChGUkFNRV9NQkFGRihoKSkgeworI2RlZmluZSBTRVRfRElBR19NVihNVl9PUCwgUkVGX09QLCBYWSwgWTQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgeHkgPSBYWSwgeTQgPSBZNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgbWJfdHlwZSA9IG1iX3R5cGVzW3h5ICsgKHk0ID4+IDIpICogaC0+bWJfc3RyaWRlXTsgICAgXAorICAgICAgICBpZiAoIVVTRVNfTElTVChtYl90eXBlLCBsaXN0KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIExJU1RfTk9UX1VTRUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtdiA9IGgtPmN1cl9waWNfcHRyLT5tb3Rpb25fdmFsW2xpc3RdW2gtPm1iMmJfeHlbeHldICsgMyArIHk0ICogaC0+Yl9zdHJpZGVdOyBcCisgICAgICAgIGgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzBdIC0gMl1bMF0gPSBtdlswXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzBdIC0gMl1bMV0gPSBtdlsxXSBNVl9PUDsgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBoLT5jdXJfcGljX3B0ci0+cmVmX2luZGV4W2xpc3RdWzQgKiB4eSArIDEgKyAoeTQgJiB+MSldIFJFRl9PUDsKKworICAgICAgICBpZiAodG9wcmlnaHRfcmVmID09IFBBUlRfTk9UX0FWQUlMQUJMRQorICAgICAgICAgICAgJiYgaSA+PSBzY2FuOFswXSArIDggJiYgKGkgJiA3KSA9PSA0CisgICAgICAgICAgICAmJiBoLT5yZWZfY2FjaGVbbGlzdF1bc2NhbjhbMF0gLSAxXSAhPSBQQVJUX05PVF9BVkFJTEFCTEUpIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICptYl90eXBlcyA9IGgtPmN1cl9waWNfcHRyLT5tYl90eXBlOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqbXY7CisgICAgICAgICAgICBBVl9aRVJPMzIoaC0+bXZfY2FjaGVbbGlzdF1bc2NhbjhbMF0gLSAyXSk7CisgICAgICAgICAgICAqQyA9IGgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzBdIC0gMl07CisKKyAgICAgICAgICAgIGlmICghTUJfRklFTEQoaCkgJiYgSVNfSU5URVJMQUNFRChoLT5sZWZ0X3R5cGVbMF0pKSB7CisgICAgICAgICAgICAgICAgU0VUX0RJQUdfTVYoKiAyLCA+PiAxLCBoLT5sZWZ0X21iX3h5WzBdICsgaC0+bWJfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5tYl95ICYgMSkgKiAyICsgKGkgPj4gNSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE1CX0ZJRUxEKGgpICYmICFJU19JTlRFUkxBQ0VEKGgtPmxlZnRfdHlwZVswXSkpIHsKKyAgICAgICAgICAgICAgICAvLyBsZWZ0IHNoaWZ0IHdpbGwgdHVybiBMSVNUX05PVF9VU0VEIGludG8gUEFSVF9OT1RfQVZBSUxBQkxFLCBidXQgdGhhdCdzIE9LLgorICAgICAgICAgICAgICAgIFNFVF9ESUFHX01WKC8gMiwgPDwgMSwgaC0+bGVmdF9tYl94eVtpID49IDM2XSwgKChpID4+IDIpKSAmIDMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjdW5kZWYgU0VUX0RJQUdfTVYKKyAgICB9CisKKyAgICBpZiAodG9wcmlnaHRfcmVmICE9IFBBUlRfTk9UX0FWQUlMQUJMRSkgeworICAgICAgICAqQyA9IGgtPm12X2NhY2hlW2xpc3RdW2kgLSA4ICsgcGFydF93aWR0aF07CisgICAgICAgIHJldHVybiB0b3ByaWdodF9yZWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHByaW50ZihoLT5hdmN0eCwgInRvcHJpZ2h0IE1WIG5vdCBhdmFpbGFibGVcbiIpOworCisgICAgICAgICpDID0gaC0+bXZfY2FjaGVbbGlzdF1baSAtIDggLSAxXTsKKyAgICAgICAgcmV0dXJuIGgtPnJlZl9jYWNoZVtsaXN0XVtpIC0gOCAtIDFdOworICAgIH0KK30KKworLyoqCisgKiBHZXQgdGhlIHByZWRpY3RlZCBNVi4KKyAqIEBwYXJhbSBuIHRoZSBibG9jayBpbmRleAorICogQHBhcmFtIHBhcnRfd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBwYXJ0aXRpb24gKDQsIDgsMTYpIC0+ICgxLCAyLCA0KQorICogQHBhcmFtIG14IHRoZSB4IGNvbXBvbmVudCBvZiB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IKKyAqIEBwYXJhbSBteSB0aGUgeSBjb21wb25lbnQgb2YgdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcHJlZF9tb3Rpb24oSDI2NENvbnRleHQgKmNvbnN0IGgsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFydF93aWR0aCwgaW50IGxpc3QsIGludCByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY29uc3QgbXgsIGludCAqY29uc3QgbXkpCit7CisgICAgY29uc3QgaW50IGluZGV4OCAgICAgICA9IHNjYW44W25dOworICAgIGNvbnN0IGludCB0b3BfcmVmICAgICAgPSBoLT5yZWZfY2FjaGVbbGlzdF1baW5kZXg4IC0gOF07CisgICAgY29uc3QgaW50IGxlZnRfcmVmICAgICA9IGgtPnJlZl9jYWNoZVtsaXN0XVtpbmRleDggLSAxXTsKKyAgICBjb25zdCBpbnQxNl90ICpjb25zdCBBID0gaC0+bXZfY2FjaGVbbGlzdF1baW5kZXg4IC0gMV07CisgICAgY29uc3QgaW50MTZfdCAqY29uc3QgQiA9IGgtPm12X2NhY2hlW2xpc3RdW2luZGV4OCAtIDhdOworICAgIGNvbnN0IGludDE2X3QgKkM7CisgICAgaW50IGRpYWdvbmFsX3JlZiwgbWF0Y2hfY291bnQ7CisKKyAgICBhdl9hc3NlcnQyKHBhcnRfd2lkdGggPT0gMSB8fCBwYXJ0X3dpZHRoID09IDIgfHwgcGFydF93aWR0aCA9PSA0KTsKKworLyogbXZfY2FjaGUKKyAqIEIgLiAuIEEgVCBUIFQgVAorICogVSAuIC4gTCAuIC4gLCAuCisgKiBVIC4gLiBMIC4gLiAuIC4KKyAqIFUgLiAuIEwgLiAuICwgLgorICogLiAuIC4gTCAuIC4gLiAuCisgKi8KKworICAgIGRpYWdvbmFsX3JlZiA9IGZldGNoX2RpYWdvbmFsX212KGgsICZDLCBpbmRleDgsIGxpc3QsIHBhcnRfd2lkdGgpOworICAgIG1hdGNoX2NvdW50ICA9IChkaWFnb25hbF9yZWYgPT0gcmVmKSArICh0b3BfcmVmID09IHJlZikgKyAobGVmdF9yZWYgPT0gcmVmKTsKKyAgICB0cHJpbnRmKGgtPmF2Y3R4LCAicHJlZF9tb3Rpb24gbWF0Y2hfY291bnQ9JWRcbiIsIG1hdGNoX2NvdW50KTsKKyAgICBpZiAobWF0Y2hfY291bnQgPiAxKSB7IC8vbW9zdCBjb21tb24KKyAgICAgICAgKm14ID0gbWlkX3ByZWQoQVswXSwgQlswXSwgQ1swXSk7CisgICAgICAgICpteSA9IG1pZF9wcmVkKEFbMV0sIEJbMV0sIENbMV0pOworICAgIH0gZWxzZSBpZiAobWF0Y2hfY291bnQgPT0gMSkgeworICAgICAgICBpZiAobGVmdF9yZWYgPT0gcmVmKSB7CisgICAgICAgICAgICAqbXggPSBBWzBdOworICAgICAgICAgICAgKm15ID0gQVsxXTsKKyAgICAgICAgfSBlbHNlIGlmICh0b3BfcmVmID09IHJlZikgeworICAgICAgICAgICAgKm14ID0gQlswXTsKKyAgICAgICAgICAgICpteSA9IEJbMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqbXggPSBDWzBdOworICAgICAgICAgICAgKm15ID0gQ1sxXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0b3BfcmVmICAgICAgPT0gUEFSVF9OT1RfQVZBSUxBQkxFICYmCisgICAgICAgICAgICBkaWFnb25hbF9yZWYgPT0gUEFSVF9OT1RfQVZBSUxBQkxFICYmCisgICAgICAgICAgICBsZWZ0X3JlZiAgICAgIT0gUEFSVF9OT1RfQVZBSUxBQkxFKSB7CisgICAgICAgICAgICAqbXggPSBBWzBdOworICAgICAgICAgICAgKm15ID0gQVsxXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpteCA9IG1pZF9wcmVkKEFbMF0sIEJbMF0sIENbMF0pOworICAgICAgICAgICAgKm15ID0gbWlkX3ByZWQoQVsxXSwgQlsxXSwgQ1sxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0cHJpbnRmKGgtPmF2Y3R4LAorICAgICAgICAgICAgInByZWRfbW90aW9uICglMmQgJTJkICUyZCkgKCUyZCAlMmQgJTJkKSAoJTJkICUyZCAlMmQpIC0+ICglMmQgJTJkICUyZCkgYXQgJTJkICUyZCAlZCBsaXN0ICVkXG4iLAorICAgICAgICAgICAgdG9wX3JlZiwgQlswXSwgQlsxXSwgZGlhZ29uYWxfcmVmLCBDWzBdLCBDWzFdLCBsZWZ0X3JlZiwKKyAgICAgICAgICAgIEFbMF0sIEFbMV0sIHJlZiwgKm14LCAqbXksIGgtPm1iX3gsIGgtPm1iX3ksIG4sIGxpc3QpOworfQorCisvKioKKyAqIEdldCB0aGUgZGlyZWN0aW9uYWxseSBwcmVkaWN0ZWQgMTZ4OCBNVi4KKyAqIEBwYXJhbSBuIHRoZSBibG9jayBpbmRleAorICogQHBhcmFtIG14IHRoZSB4IGNvbXBvbmVudCBvZiB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IKKyAqIEBwYXJhbSBteSB0aGUgeSBjb21wb25lbnQgb2YgdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcHJlZF8xNng4X21vdGlvbihIMjY0Q29udGV4dCAqY29uc3QgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IGxpc3QsIGludCByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb25zdCBteCwgaW50ICpjb25zdCBteSkKK3sKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIGNvbnN0IGludCB0b3BfcmVmICAgICAgPSBoLT5yZWZfY2FjaGVbbGlzdF1bc2NhbjhbMF0gLSA4XTsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqY29uc3QgQiA9IGgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzBdIC0gOF07CisKKyAgICAgICAgdHByaW50ZihoLT5hdmN0eCwgInByZWRfMTZ4ODogKCUyZCAlMmQgJTJkKSBhdCAlMmQgJTJkICVkIGxpc3QgJWRcbiIsCisgICAgICAgICAgICAgICAgdG9wX3JlZiwgQlswXSwgQlsxXSwgaC0+bWJfeCwgaC0+bWJfeSwgbiwgbGlzdCk7CisKKyAgICAgICAgaWYgKHRvcF9yZWYgPT0gcmVmKSB7CisgICAgICAgICAgICAqbXggPSBCWzBdOworICAgICAgICAgICAgKm15ID0gQlsxXTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBsZWZ0X3JlZiAgICAgPSBoLT5yZWZfY2FjaGVbbGlzdF1bc2NhbjhbOF0gLSAxXTsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqY29uc3QgQSA9IGgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzhdIC0gMV07CisKKyAgICAgICAgdHByaW50ZihoLT5hdmN0eCwgInByZWRfMTZ4ODogKCUyZCAlMmQgJTJkKSBhdCAlMmQgJTJkICVkIGxpc3QgJWRcbiIsCisgICAgICAgICAgICAgICAgbGVmdF9yZWYsIEFbMF0sIEFbMV0sIGgtPm1iX3gsIGgtPm1iX3ksIG4sIGxpc3QpOworCisgICAgICAgIGlmIChsZWZ0X3JlZiA9PSByZWYpIHsKKyAgICAgICAgICAgICpteCA9IEFbMF07CisgICAgICAgICAgICAqbXkgPSBBWzFdOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy9SQVJFCisgICAgcHJlZF9tb3Rpb24oaCwgbiwgNCwgbGlzdCwgcmVmLCBteCwgbXkpOworfQorCisvKioKKyAqIEdldCB0aGUgZGlyZWN0aW9uYWxseSBwcmVkaWN0ZWQgOHgxNiBNVi4KKyAqIEBwYXJhbSBuIHRoZSBibG9jayBpbmRleAorICogQHBhcmFtIG14IHRoZSB4IGNvbXBvbmVudCBvZiB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IKKyAqIEBwYXJhbSBteSB0aGUgeSBjb21wb25lbnQgb2YgdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcHJlZF84eDE2X21vdGlvbihIMjY0Q29udGV4dCAqY29uc3QgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IGxpc3QsIGludCByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb25zdCBteCwgaW50ICpjb25zdCBteSkKK3sKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIGNvbnN0IGludCBsZWZ0X3JlZiAgICAgPSBoLT5yZWZfY2FjaGVbbGlzdF1bc2NhbjhbMF0gLSAxXTsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqY29uc3QgQSA9IGgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzBdIC0gMV07CisKKyAgICAgICAgdHByaW50ZihoLT5hdmN0eCwgInByZWRfOHgxNjogKCUyZCAlMmQgJTJkKSBhdCAlMmQgJTJkICVkIGxpc3QgJWRcbiIsCisgICAgICAgICAgICAgICAgbGVmdF9yZWYsIEFbMF0sIEFbMV0sIGgtPm1iX3gsIGgtPm1iX3ksIG4sIGxpc3QpOworCisgICAgICAgIGlmIChsZWZ0X3JlZiA9PSByZWYpIHsKKyAgICAgICAgICAgICpteCA9IEFbMF07CisgICAgICAgICAgICAqbXkgPSBBWzFdOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqQzsKKyAgICAgICAgaW50IGRpYWdvbmFsX3JlZjsKKworICAgICAgICBkaWFnb25hbF9yZWYgPSBmZXRjaF9kaWFnb25hbF9tdihoLCAmQywgc2NhbjhbNF0sIGxpc3QsIDIpOworCisgICAgICAgIHRwcmludGYoaC0+YXZjdHgsICJwcmVkXzh4MTY6ICglMmQgJTJkICUyZCkgYXQgJTJkICUyZCAlZCBsaXN0ICVkXG4iLAorICAgICAgICAgICAgICAgIGRpYWdvbmFsX3JlZiwgQ1swXSwgQ1sxXSwgaC0+bWJfeCwgaC0+bWJfeSwgbiwgbGlzdCk7CisKKyAgICAgICAgaWYgKGRpYWdvbmFsX3JlZiA9PSByZWYpIHsKKyAgICAgICAgICAgICpteCA9IENbMF07CisgICAgICAgICAgICAqbXkgPSBDWzFdOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy9SQVJFCisgICAgcHJlZF9tb3Rpb24oaCwgbiwgMiwgbGlzdCwgcmVmLCBteCwgbXkpOworfQorCisjZGVmaW5lIEZJWF9NVl9NQkFGRih0eXBlLCByZWZuLCBtdm4sIGlkeCkgICAgICBcCisgICAgaWYgKEZSQU1FX01CQUZGKGgpKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChNQl9GSUVMRChoKSkgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIUlTX0lOVEVSTEFDRUQodHlwZSkpIHsgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmVmbiA8PD0gMTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQVZfQ09QWTMyKG12YnVmW2lkeF0sIG12bik7ICAgICBcCisgICAgICAgICAgICAgICAgbXZidWZbaWR4XVsxXSAvPSAyOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbXZuID0gbXZidWZbaWR4XTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoSVNfSU5URVJMQUNFRCh0eXBlKSkgeyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmVmbiA+Pj0gMTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQVZfQ09QWTMyKG12YnVmW2lkeF0sIG12bik7ICAgICBcCisgICAgICAgICAgICAgICAgbXZidWZbaWR4XVsxXSA8PD0gMTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbXZuID0gbXZidWZbaWR4XTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHByZWRfcHNraXBfbW90aW9uKEgyNjRDb250ZXh0ICpjb25zdCBoKQoreworICAgIERFQ0xBUkVfQUxJR05FRCg0LCBzdGF0aWMgY29uc3QgaW50MTZfdCwgemVyb212KVsyXSA9IHsgMCB9OworICAgIERFQ0xBUkVfQUxJR05FRCg0LCBpbnQxNl90LCBtdmJ1ZilbM11bMl07CisgICAgaW50OF90ICpyZWYgICAgID0gaC0+Y3VyX3BpYy5yZWZfaW5kZXhbMF07CisgICAgaW50MTZfdCgqbXYpWzJdID0gaC0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdOworICAgIGludCB0b3BfcmVmLCBsZWZ0X3JlZiwgZGlhZ29uYWxfcmVmLCBtYXRjaF9jb3VudCwgbXgsIG15OworICAgIGNvbnN0IGludDE2X3QgKkEsICpCLCAqQzsKKyAgICBpbnQgYl9zdHJpZGUgPSBoLT5iX3N0cmlkZTsKKworICAgIGZpbGxfcmVjdGFuZ2xlKCZoLT5yZWZfY2FjaGVbMF1bc2NhbjhbMF1dLCA0LCA0LCA4LCAwLCAxKTsKKworICAgIC8qIFRvIGF2b2lkIGRvaW5nIGFuIGVudGlyZSBmaWxsX2RlY29kZV9jYWNoZXMsIHdlIGlubGluZSB0aGUgcmVsZXZhbnQKKyAgICAgKiBwYXJ0cyBoZXJlLgorICAgICAqIEZJWE1FOiB0aGlzIGlzIGEgcGFydGlhbCBkdXBsaWNhdGUgb2YgdGhlIGxvZ2ljIGluIGZpbGxfZGVjb2RlX2NhY2hlcywKKyAgICAgKiBidXQgaXQncyBmYXN0ZXIgdGhpcyB3YXkuICBJcyB0aGVyZSBhIHdheSB0byBhdm9pZCB0aGlzIGR1cGxpY2F0aW9uPworICAgICAqLworICAgIGlmIChVU0VTX0xJU1QoaC0+bGVmdF90eXBlW0xUT1BdLCAwKSkgeworICAgICAgICBsZWZ0X3JlZiA9IHJlZls0ICogaC0+bGVmdF9tYl94eVtMVE9QXSArIDEgKyAoaC0+bGVmdF9ibG9ja1swXSAmIH4xKV07CisgICAgICAgIEEgPSBtdltoLT5tYjJiX3h5W2gtPmxlZnRfbWJfeHlbTFRPUF1dICsgMyArIGJfc3RyaWRlICogaC0+bGVmdF9ibG9ja1swXV07CisgICAgICAgIEZJWF9NVl9NQkFGRihoLT5sZWZ0X3R5cGVbTFRPUF0sIGxlZnRfcmVmLCBBLCAwKTsKKyAgICAgICAgaWYgKCEobGVmdF9yZWYgfCBBVl9STjMyQShBKSkpCisgICAgICAgICAgICBnb3RvIHplcm9tdjsKKyAgICB9IGVsc2UgaWYgKGgtPmxlZnRfdHlwZVtMVE9QXSkgeworICAgICAgICBsZWZ0X3JlZiA9IExJU1RfTk9UX1VTRUQ7CisgICAgICAgIEEgICAgICAgID0gemVyb212OworICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gemVyb212OworICAgIH0KKworICAgIGlmIChVU0VTX0xJU1QoaC0+dG9wX3R5cGUsIDApKSB7CisgICAgICAgIHRvcF9yZWYgPSByZWZbNCAqIGgtPnRvcF9tYl94eSArIDJdOworICAgICAgICBCICAgICAgID0gbXZbaC0+bWIyYl94eVtoLT50b3BfbWJfeHldICsgMyAqIGJfc3RyaWRlXTsKKyAgICAgICAgRklYX01WX01CQUZGKGgtPnRvcF90eXBlLCB0b3BfcmVmLCBCLCAxKTsKKyAgICAgICAgaWYgKCEodG9wX3JlZiB8IEFWX1JOMzJBKEIpKSkKKyAgICAgICAgICAgIGdvdG8gemVyb212OworICAgIH0gZWxzZSBpZiAoaC0+dG9wX3R5cGUpIHsKKyAgICAgICAgdG9wX3JlZiA9IExJU1RfTk9UX1VTRUQ7CisgICAgICAgIEIgICAgICAgPSB6ZXJvbXY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byB6ZXJvbXY7CisgICAgfQorCisgICAgdHByaW50ZihoLT5hdmN0eCwgInByZWRfcHNraXA6ICglZCkgKCVkKSBhdCAlMmQgJTJkXG4iLAorICAgICAgICAgICAgdG9wX3JlZiwgbGVmdF9yZWYsIGgtPm1iX3gsIGgtPm1iX3kpOworCisgICAgaWYgKFVTRVNfTElTVChoLT50b3ByaWdodF90eXBlLCAwKSkgeworICAgICAgICBkaWFnb25hbF9yZWYgPSByZWZbNCAqIGgtPnRvcHJpZ2h0X21iX3h5ICsgMl07CisgICAgICAgIEMgPSBtdltoLT5tYjJiX3h5W2gtPnRvcHJpZ2h0X21iX3h5XSArIDMgKiBiX3N0cmlkZV07CisgICAgICAgIEZJWF9NVl9NQkFGRihoLT50b3ByaWdodF90eXBlLCBkaWFnb25hbF9yZWYsIEMsIDIpOworICAgIH0gZWxzZSBpZiAoaC0+dG9wcmlnaHRfdHlwZSkgeworICAgICAgICBkaWFnb25hbF9yZWYgPSBMSVNUX05PVF9VU0VEOworICAgICAgICBDID0gemVyb212OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChVU0VTX0xJU1QoaC0+dG9wbGVmdF90eXBlLCAwKSkgeworICAgICAgICAgICAgZGlhZ29uYWxfcmVmID0gcmVmWzQgKiBoLT50b3BsZWZ0X21iX3h5ICsgMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnRvcGxlZnRfcGFydGl0aW9uICYgMildOworICAgICAgICAgICAgQyA9IG12W2gtPm1iMmJfeHlbaC0+dG9wbGVmdF9tYl94eV0gKyAzICsgYl9zdHJpZGUgKworICAgICAgICAgICAgICAgICAgIChoLT50b3BsZWZ0X3BhcnRpdGlvbiAmIDIgKiBiX3N0cmlkZSldOworICAgICAgICAgICAgRklYX01WX01CQUZGKGgtPnRvcGxlZnRfdHlwZSwgZGlhZ29uYWxfcmVmLCBDLCAyKTsKKyAgICAgICAgfSBlbHNlIGlmIChoLT50b3BsZWZ0X3R5cGUpIHsKKyAgICAgICAgICAgIGRpYWdvbmFsX3JlZiA9IExJU1RfTk9UX1VTRUQ7CisgICAgICAgICAgICBDICAgICAgICAgICAgPSB6ZXJvbXY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaWFnb25hbF9yZWYgPSBQQVJUX05PVF9BVkFJTEFCTEU7CisgICAgICAgICAgICBDICAgICAgICAgICAgPSB6ZXJvbXY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtYXRjaF9jb3VudCA9ICFkaWFnb25hbF9yZWYgKyAhdG9wX3JlZiArICFsZWZ0X3JlZjsKKyAgICB0cHJpbnRmKGgtPmF2Y3R4LCAicHJlZF9wc2tpcF9tb3Rpb24gbWF0Y2hfY291bnQ9JWRcbiIsIG1hdGNoX2NvdW50KTsKKyAgICBpZiAobWF0Y2hfY291bnQgPiAxKSB7CisgICAgICAgIG14ID0gbWlkX3ByZWQoQVswXSwgQlswXSwgQ1swXSk7CisgICAgICAgIG15ID0gbWlkX3ByZWQoQVsxXSwgQlsxXSwgQ1sxXSk7CisgICAgfSBlbHNlIGlmIChtYXRjaF9jb3VudCA9PSAxKSB7CisgICAgICAgIGlmICghbGVmdF9yZWYpIHsKKyAgICAgICAgICAgIG14ID0gQVswXTsKKyAgICAgICAgICAgIG15ID0gQVsxXTsKKyAgICAgICAgfSBlbHNlIGlmICghdG9wX3JlZikgeworICAgICAgICAgICAgbXggPSBCWzBdOworICAgICAgICAgICAgbXkgPSBCWzFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXggPSBDWzBdOworICAgICAgICAgICAgbXkgPSBDWzFdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXggPSBtaWRfcHJlZChBWzBdLCBCWzBdLCBDWzBdKTsKKyAgICAgICAgbXkgPSBtaWRfcHJlZChBWzFdLCBCWzFdLCBDWzFdKTsKKyAgICB9CisKKyAgICBmaWxsX3JlY3RhbmdsZShoLT5tdl9jYWNoZVswXVtzY2FuOFswXV0sIDQsIDQsIDgsIHBhY2sxNnRvMzIobXgsIG15KSwgNCk7CisgICAgcmV0dXJuOworCit6ZXJvbXY6CisgICAgZmlsbF9yZWN0YW5nbGUoaC0+bXZfY2FjaGVbMF1bc2NhbjhbMF1dLCA0LCA0LCA4LCAwLCA0KTsKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfZGVjb2RlX25laWdoYm9ycyhIMjY0Q29udGV4dCAqaCwgaW50IG1iX3R5cGUpCit7CisgICAgY29uc3QgaW50IG1iX3h5ID0gaC0+bWJfeHk7CisgICAgaW50IHRvcGxlZnRfeHksIHRvcF94eSwgdG9wcmlnaHRfeHksIGxlZnRfeHlbTEVGVF9NQlNdOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGxlZnRfYmxvY2tfb3B0aW9uc1s0XVszMl0gPSB7CisgICAgICAgIHsgMCwgMSwgMiwgMywgNywgMTAsIDgsIDExLCAzICsgMCAqIDQsIDMgKyAxICogNCwgMyArIDIgKiA0LCAzICsgMyAqIDQsIDEgKyA0ICogNCwgMSArIDggKiA0LCAxICsgNSAqIDQsIDEgKyA5ICogNCB9LAorICAgICAgICB7IDIsIDIsIDMsIDMsIDgsIDExLCA4LCAxMSwgMyArIDIgKiA0LCAzICsgMiAqIDQsIDMgKyAzICogNCwgMyArIDMgKiA0LCAxICsgNSAqIDQsIDEgKyA5ICogNCwgMSArIDUgKiA0LCAxICsgOSAqIDQgfSwKKyAgICAgICAgeyAwLCAwLCAxLCAxLCA3LCAxMCwgNywgMTAsIDMgKyAwICogNCwgMyArIDAgKiA0LCAzICsgMSAqIDQsIDMgKyAxICogNCwgMSArIDQgKiA0LCAxICsgOCAqIDQsIDEgKyA0ICogNCwgMSArIDggKiA0IH0sCisgICAgICAgIHsgMCwgMiwgMCwgMiwgNywgMTAsIDcsIDEwLCAzICsgMCAqIDQsIDMgKyAyICogNCwgMyArIDAgKiA0LCAzICsgMiAqIDQsIDEgKyA0ICogNCwgMSArIDggKiA0LCAxICsgNCAqIDQsIDEgKyA4ICogNCB9CisgICAgfTsKKworICAgIGgtPnRvcGxlZnRfcGFydGl0aW9uID0gLTE7CisKKyAgICB0b3BfeHkgPSBtYl94eSAtIChoLT5tYl9zdHJpZGUgPDwgTUJfRklFTEQoaCkpOworCisgICAgLyogV293LCB3aGF0IGEgbWVzcywgd2h5IGRpZG4ndCB0aGV5IHNpbXBsaWZ5IHRoZSBpbnRlcmxhY2luZyAmIGludHJhCisgICAgICogc3R1ZmYsIEkgY2FuJ3QgaW1hZ2luZSB0aGF0IHRoZXNlIGNvbXBsZXggcnVsZXMgYXJlIHdvcnRoIGl0LiAqLworCisgICAgdG9wbGVmdF94eSAgICA9IHRvcF94eSAtIDE7CisgICAgdG9wcmlnaHRfeHkgICA9IHRvcF94eSArIDE7CisgICAgbGVmdF94eVtMQk9UXSA9IGxlZnRfeHlbTFRPUF0gPSBtYl94eSAtIDE7CisgICAgaC0+bGVmdF9ibG9jayA9IGxlZnRfYmxvY2tfb3B0aW9uc1swXTsKKyAgICBpZiAoRlJBTUVfTUJBRkYoaCkpIHsKKyAgICAgICAgY29uc3QgaW50IGxlZnRfbWJfZmllbGRfZmxhZyA9IElTX0lOVEVSTEFDRUQoaC0+Y3VyX3BpYy5tYl90eXBlW21iX3h5IC0gMV0pOworICAgICAgICBjb25zdCBpbnQgY3Vycl9tYl9maWVsZF9mbGFnID0gSVNfSU5URVJMQUNFRChtYl90eXBlKTsKKyAgICAgICAgaWYgKGgtPm1iX3kgJiAxKSB7CisgICAgICAgICAgICBpZiAobGVmdF9tYl9maWVsZF9mbGFnICE9IGN1cnJfbWJfZmllbGRfZmxhZykgeworICAgICAgICAgICAgICAgIGxlZnRfeHlbTEJPVF0gPSBsZWZ0X3h5W0xUT1BdID0gbWJfeHkgLSBoLT5tYl9zdHJpZGUgLSAxOworICAgICAgICAgICAgICAgIGlmIChjdXJyX21iX2ZpZWxkX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVmdF94eVtMQk9UXSArPSBoLT5tYl9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIGgtPmxlZnRfYmxvY2sgID0gbGVmdF9ibG9ja19vcHRpb25zWzNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRvcGxlZnRfeHkgKz0gaC0+bWJfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAvKiB0YWtlIHRvcCBsZWZ0IG12IGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgbWIsIGFzIG9wcG9zZWQKKyAgICAgICAgICAgICAgICAgICAgICogdG8gYWxsIG90aGVyIG1vZGVzIHdoaWNoIHVzZSB0aGUgYm90dG9tIHJpZ2h0IHBhcnRpdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBoLT50b3BsZWZ0X3BhcnRpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGgtPmxlZnRfYmxvY2sgICAgICAgID0gbGVmdF9ibG9ja19vcHRpb25zWzFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjdXJyX21iX2ZpZWxkX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICB0b3BsZWZ0X3h5ICArPSBoLT5tYl9zdHJpZGUgJiAoKChoLT5jdXJfcGljLm1iX3R5cGVbdG9wX3h5IC0gMV0gPj4gNykgJiAxKSAtIDEpOworICAgICAgICAgICAgICAgIHRvcHJpZ2h0X3h5ICs9IGgtPm1iX3N0cmlkZSAmICgoKGgtPmN1cl9waWMubWJfdHlwZVt0b3BfeHkgKyAxXSA+PiA3KSAmIDEpIC0gMSk7CisgICAgICAgICAgICAgICAgdG9wX3h5ICAgICAgKz0gaC0+bWJfc3RyaWRlICYgKCgoaC0+Y3VyX3BpYy5tYl90eXBlW3RvcF94eV0gICAgID4+IDcpICYgMSkgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZWZ0X21iX2ZpZWxkX2ZsYWcgIT0gY3Vycl9tYl9maWVsZF9mbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJfbWJfZmllbGRfZmxhZykgeworICAgICAgICAgICAgICAgICAgICBsZWZ0X3h5W0xCT1RdICs9IGgtPm1iX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgaC0+bGVmdF9ibG9jayAgPSBsZWZ0X2Jsb2NrX29wdGlvbnNbM107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+bGVmdF9ibG9jayA9IGxlZnRfYmxvY2tfb3B0aW9uc1syXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBoLT50b3BsZWZ0X21iX3h5ICAgID0gdG9wbGVmdF94eTsKKyAgICBoLT50b3BfbWJfeHkgICAgICAgID0gdG9wX3h5OworICAgIGgtPnRvcHJpZ2h0X21iX3h5ICAgPSB0b3ByaWdodF94eTsKKyAgICBoLT5sZWZ0X21iX3h5W0xUT1BdID0gbGVmdF94eVtMVE9QXTsKKyAgICBoLT5sZWZ0X21iX3h5W0xCT1RdID0gbGVmdF94eVtMQk9UXTsKKyAgICAvL0ZJWE1FIGRvIHdlIG5lZWQgYWxsIGluIHRoZSBjb250ZXh0PworCisgICAgaC0+dG9wbGVmdF90eXBlICAgID0gaC0+Y3VyX3BpYy5tYl90eXBlW3RvcGxlZnRfeHldOworICAgIGgtPnRvcF90eXBlICAgICAgICA9IGgtPmN1cl9waWMubWJfdHlwZVt0b3BfeHldOworICAgIGgtPnRvcHJpZ2h0X3R5cGUgICA9IGgtPmN1cl9waWMubWJfdHlwZVt0b3ByaWdodF94eV07CisgICAgaC0+bGVmdF90eXBlW0xUT1BdID0gaC0+Y3VyX3BpYy5tYl90eXBlW2xlZnRfeHlbTFRPUF1dOworICAgIGgtPmxlZnRfdHlwZVtMQk9UXSA9IGgtPmN1cl9waWMubWJfdHlwZVtsZWZ0X3h5W0xCT1RdXTsKKworICAgIGlmIChGTU8pIHsKKyAgICAgICAgaWYgKGgtPnNsaWNlX3RhYmxlW3RvcGxlZnRfeHldICE9IGgtPnNsaWNlX251bSkKKyAgICAgICAgICAgIGgtPnRvcGxlZnRfdHlwZSA9IDA7CisgICAgICAgIGlmIChoLT5zbGljZV90YWJsZVt0b3BfeHldICE9IGgtPnNsaWNlX251bSkKKyAgICAgICAgICAgIGgtPnRvcF90eXBlID0gMDsKKyAgICAgICAgaWYgKGgtPnNsaWNlX3RhYmxlW2xlZnRfeHlbTFRPUF1dICE9IGgtPnNsaWNlX251bSkKKyAgICAgICAgICAgIGgtPmxlZnRfdHlwZVtMVE9QXSA9IGgtPmxlZnRfdHlwZVtMQk9UXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGgtPnNsaWNlX3RhYmxlW3RvcGxlZnRfeHldICE9IGgtPnNsaWNlX251bSkgeworICAgICAgICAgICAgaC0+dG9wbGVmdF90eXBlID0gMDsKKyAgICAgICAgICAgIGlmIChoLT5zbGljZV90YWJsZVt0b3BfeHldICE9IGgtPnNsaWNlX251bSkKKyAgICAgICAgICAgICAgICBoLT50b3BfdHlwZSA9IDA7CisgICAgICAgICAgICBpZiAoaC0+c2xpY2VfdGFibGVbbGVmdF94eVtMVE9QXV0gIT0gaC0+c2xpY2VfbnVtKQorICAgICAgICAgICAgICAgIGgtPmxlZnRfdHlwZVtMVE9QXSA9IGgtPmxlZnRfdHlwZVtMQk9UXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGgtPnNsaWNlX3RhYmxlW3RvcHJpZ2h0X3h5XSAhPSBoLT5zbGljZV9udW0pCisgICAgICAgIGgtPnRvcHJpZ2h0X3R5cGUgPSAwOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2RlY29kZV9jYWNoZXMoSDI2NENvbnRleHQgKmgsIGludCBtYl90eXBlKQoreworICAgIGludCB0b3BsZWZ0X3h5LCB0b3BfeHksIHRvcHJpZ2h0X3h5LCBsZWZ0X3h5W0xFRlRfTUJTXTsKKyAgICBpbnQgdG9wbGVmdF90eXBlLCB0b3BfdHlwZSwgdG9wcmlnaHRfdHlwZSwgbGVmdF90eXBlW0xFRlRfTUJTXTsKKyAgICBjb25zdCB1aW50OF90ICpsZWZ0X2Jsb2NrID0gaC0+bGVmdF9ibG9jazsKKyAgICBpbnQgaTsKKyAgICB1aW50OF90ICpubno7CisgICAgdWludDhfdCAqbm56X2NhY2hlOworCisgICAgdG9wbGVmdF94eSAgICAgID0gaC0+dG9wbGVmdF9tYl94eTsKKyAgICB0b3BfeHkgICAgICAgICAgPSBoLT50b3BfbWJfeHk7CisgICAgdG9wcmlnaHRfeHkgICAgID0gaC0+dG9wcmlnaHRfbWJfeHk7CisgICAgbGVmdF94eVtMVE9QXSAgID0gaC0+bGVmdF9tYl94eVtMVE9QXTsKKyAgICBsZWZ0X3h5W0xCT1RdICAgPSBoLT5sZWZ0X21iX3h5W0xCT1RdOworICAgIHRvcGxlZnRfdHlwZSAgICA9IGgtPnRvcGxlZnRfdHlwZTsKKyAgICB0b3BfdHlwZSAgICAgICAgPSBoLT50b3BfdHlwZTsKKyAgICB0b3ByaWdodF90eXBlICAgPSBoLT50b3ByaWdodF90eXBlOworICAgIGxlZnRfdHlwZVtMVE9QXSA9IGgtPmxlZnRfdHlwZVtMVE9QXTsKKyAgICBsZWZ0X3R5cGVbTEJPVF0gPSBoLT5sZWZ0X3R5cGVbTEJPVF07CisKKyAgICBpZiAoIUlTX1NLSVAobWJfdHlwZSkpIHsKKyAgICAgICAgaWYgKElTX0lOVFJBKG1iX3R5cGUpKSB7CisgICAgICAgICAgICBpbnQgdHlwZV9tYXNrID0gaC0+cHBzLmNvbnN0cmFpbmVkX2ludHJhX3ByZWQgPyBJU19JTlRSQSgtMSkgOiAtMTsKKyAgICAgICAgICAgIGgtPnRvcGxlZnRfc2FtcGxlc19hdmFpbGFibGUgICAgICA9CisgICAgICAgICAgICAgICAgaC0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlICAgICAgPQorICAgICAgICAgICAgICAgICAgICBoLT5sZWZ0X3NhbXBsZXNfYXZhaWxhYmxlID0gMHhGRkZGOworICAgICAgICAgICAgaC0+dG9wcmlnaHRfc2FtcGxlc19hdmFpbGFibGUgICAgID0gMHhFRUVBOworCisgICAgICAgICAgICBpZiAoISh0b3BfdHlwZSAmIHR5cGVfbWFzaykpIHsKKyAgICAgICAgICAgICAgICBoLT50b3BsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlICA9IDB4QjNGRjsKKyAgICAgICAgICAgICAgICBoLT50b3Bfc2FtcGxlc19hdmFpbGFibGUgICAgICA9IDB4MzNGRjsKKyAgICAgICAgICAgICAgICBoLT50b3ByaWdodF9zYW1wbGVzX2F2YWlsYWJsZSA9IDB4MjZFQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChJU19JTlRFUkxBQ0VEKG1iX3R5cGUpICE9IElTX0lOVEVSTEFDRUQobGVmdF90eXBlW0xUT1BdKSkgeworICAgICAgICAgICAgICAgIGlmIChJU19JTlRFUkxBQ0VEKG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGxlZnRfdHlwZVtMVE9QXSAmIHR5cGVfbWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPnRvcGxlZnRfc2FtcGxlc19hdmFpbGFibGUgJj0gMHhERkZGOworICAgICAgICAgICAgICAgICAgICAgICAgaC0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSAgICAmPSAweDVGRkY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEobGVmdF90eXBlW0xCT1RdICYgdHlwZV9tYXNrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaC0+dG9wbGVmdF9zYW1wbGVzX2F2YWlsYWJsZSAmPSAweEZGNUY7CisgICAgICAgICAgICAgICAgICAgICAgICBoLT5sZWZ0X3NhbXBsZXNfYXZhaWxhYmxlICAgICY9IDB4RkY1RjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0X3R5cGVpID0gaC0+Y3VyX3BpYy5tYl90eXBlW2xlZnRfeHlbTFRPUF0gKyBoLT5tYl9zdHJpZGVdOworCisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIobGVmdF94eVtMVE9QXSA9PSBsZWZ0X3h5W0xCT1RdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoKGxlZnRfdHlwZWkgJiB0eXBlX21hc2spICYmIChsZWZ0X3R5cGVbTFRPUF0gJiB0eXBlX21hc2spKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaC0+dG9wbGVmdF9zYW1wbGVzX2F2YWlsYWJsZSAmPSAweERGNUY7CisgICAgICAgICAgICAgICAgICAgICAgICBoLT5sZWZ0X3NhbXBsZXNfYXZhaWxhYmxlICAgICY9IDB4NUY1RjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCEobGVmdF90eXBlW0xUT1BdICYgdHlwZV9tYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBoLT50b3BsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlICY9IDB4REY1RjsKKyAgICAgICAgICAgICAgICAgICAgaC0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSAgICAmPSAweDVGNUY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoISh0b3BsZWZ0X3R5cGUgJiB0eXBlX21hc2spKQorICAgICAgICAgICAgICAgIGgtPnRvcGxlZnRfc2FtcGxlc19hdmFpbGFibGUgJj0gMHg3RkZGOworCisgICAgICAgICAgICBpZiAoISh0b3ByaWdodF90eXBlICYgdHlwZV9tYXNrKSkKKyAgICAgICAgICAgICAgICBoLT50b3ByaWdodF9zYW1wbGVzX2F2YWlsYWJsZSAmPSAweEZCRkY7CisKKyAgICAgICAgICAgIGlmIChJU19JTlRSQTR4NChtYl90eXBlKSkgeworICAgICAgICAgICAgICAgIGlmIChJU19JTlRSQTR4NCh0b3BfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTMyKGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZSArIDQgKyA4ICogMCwgaC0+aW50cmE0eDRfcHJlZF9tb2RlICsgaC0+bWIyYnJfeHlbdG9wX3h5XSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlWzQgKyA4ICogMF0gPQorICAgICAgICAgICAgICAgICAgICBoLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbNSArIDggKiAwXSA9CisgICAgICAgICAgICAgICAgICAgIGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs2ICsgOCAqIDBdID0KKyAgICAgICAgICAgICAgICAgICAgaC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlWzcgKyA4ICogMF0gPSAyIC0gMyAqICEodG9wX3R5cGUgJiB0eXBlX21hc2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChJU19JTlRSQTR4NChsZWZ0X3R5cGVbTEVGVChpKV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKm1vZGUgPSBoLT5pbnRyYTR4NF9wcmVkX21vZGUgKyBoLT5tYjJicl94eVtsZWZ0X3h5W0xFRlQoaSldXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVszICsgOCAqIDEgKyAyICogOCAqIGldID0gbW9kZVs2IC0gbGVmdF9ibG9ja1swICsgMiAqIGldXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVszICsgOCAqIDIgKyAyICogOCAqIGldID0gbW9kZVs2IC0gbGVmdF9ibG9ja1sxICsgMiAqIGldXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVszICsgOCAqIDEgKyAyICogOCAqIGldID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVszICsgOCAqIDIgKyAyICogOCAqIGldID0gMiAtIDMgKiAhKGxlZnRfdHlwZVtMRUZUKGkpXSAmIHR5cGVfbWFzayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAwIC4gVCBULiBUIFQgVCBUCisgICAgICAgICAqIDEgTCAuIC5MIC4gLiAuIC4KKyAgICAgICAgICogMiBMIC4gLkwgLiAuIC4gLgorICAgICAgICAgKiAzIC4gVCBUTCAuIC4gLiAuCisgICAgICAgICAqIDQgTCAuIC5MIC4gLiAuIC4KKyAgICAgICAgICogNSBMIC4gLi4gLiAuIC4gLgorICAgICAgICAgKi8KKyAgICAgICAgLyogRklYTUU6IGNvbnN0cmFpbnRfaW50cmFfcHJlZCAmIHBhcnRpdGlvbmluZyAmIG5uegorICAgICAgICAgKiAobGV0IHVzIGhvcGUgdGhpcyBpcyBqdXN0IGEgdHlwbyBpbiB0aGUgc3BlYykgKi8KKyAgICAgICAgbm56X2NhY2hlID0gaC0+bm9uX3plcm9fY291bnRfY2FjaGU7CisgICAgICAgIGlmICh0b3BfdHlwZSkgeworICAgICAgICAgICAgbm56ID0gaC0+bm9uX3plcm9fY291bnRbdG9wX3h5XTsKKyAgICAgICAgICAgIEFWX0NPUFkzMigmbm56X2NhY2hlWzQgKyA4ICogMF0sICZubnpbNCAqIDNdKTsKKyAgICAgICAgICAgIGlmICghaC0+Y2hyb21hX3lfc2hpZnQpIHsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJm5uel9jYWNoZVs0ICsgOCAqICA1XSwgJm5uels0ICogIDddKTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJm5uel9jYWNoZVs0ICsgOCAqIDEwXSwgJm5uels0ICogMTFdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQVZfQ09QWTMyKCZubnpfY2FjaGVbNCArIDggKiAgNV0sICZubnpbNCAqIDVdKTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJm5uel9jYWNoZVs0ICsgOCAqIDEwXSwgJm5uels0ICogOV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3QgdG9wX2VtcHR5ID0gQ0FCQUMoaCkgJiYgIUlTX0lOVFJBKG1iX3R5cGUpID8gMCA6IDB4NDA0MDQwNDA7CisgICAgICAgICAgICBBVl9XTjMyQSgmbm56X2NhY2hlWzQgKyA4ICogIDBdLCB0b3BfZW1wdHkpOworICAgICAgICAgICAgQVZfV04zMkEoJm5uel9jYWNoZVs0ICsgOCAqICA1XSwgdG9wX2VtcHR5KTsKKyAgICAgICAgICAgIEFWX1dOMzJBKCZubnpfY2FjaGVbNCArIDggKiAxMF0sIHRvcF9lbXB0eSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBpZiAobGVmdF90eXBlW0xFRlQoaSldKSB7CisgICAgICAgICAgICAgICAgbm56ID0gaC0+bm9uX3plcm9fY291bnRbbGVmdF94eVtMRUZUKGkpXV07CisgICAgICAgICAgICAgICAgbm56X2NhY2hlWzMgKyA4ICogMSArIDIgKiA4ICogaV0gPSBubnpbbGVmdF9ibG9ja1s4ICsgMCArIDIgKiBpXV07CisgICAgICAgICAgICAgICAgbm56X2NhY2hlWzMgKyA4ICogMiArIDIgKiA4ICogaV0gPSBubnpbbGVmdF9ibG9ja1s4ICsgMSArIDIgKiBpXV07CisgICAgICAgICAgICAgICAgaWYgKENIUk9NQTQ0NChoKSkgeworICAgICAgICAgICAgICAgICAgICBubnpfY2FjaGVbMyArIDggKiAgNiArIDIgKiA4ICogaV0gPSBubnpbbGVmdF9ibG9ja1s4ICsgMCArIDIgKiBpXSArIDQgKiA0XTsKKyAgICAgICAgICAgICAgICAgICAgbm56X2NhY2hlWzMgKyA4ICogIDcgKyAyICogOCAqIGldID0gbm56W2xlZnRfYmxvY2tbOCArIDEgKyAyICogaV0gKyA0ICogNF07CisgICAgICAgICAgICAgICAgICAgIG5uel9jYWNoZVszICsgOCAqIDExICsgMiAqIDggKiBpXSA9IG5ueltsZWZ0X2Jsb2NrWzggKyAwICsgMiAqIGldICsgOCAqIDRdOworICAgICAgICAgICAgICAgICAgICBubnpfY2FjaGVbMyArIDggKiAxMiArIDIgKiA4ICogaV0gPSBubnpbbGVmdF9ibG9ja1s4ICsgMSArIDIgKiBpXSArIDggKiA0XTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENIUk9NQTQyMihoKSkgeworICAgICAgICAgICAgICAgICAgICBubnpfY2FjaGVbMyArIDggKiAgNiArIDIgKiA4ICogaV0gPSBubnpbbGVmdF9ibG9ja1s4ICsgMCArIDIgKiBpXSAtIDIgKyA0ICogNF07CisgICAgICAgICAgICAgICAgICAgIG5uel9jYWNoZVszICsgOCAqICA3ICsgMiAqIDggKiBpXSA9IG5ueltsZWZ0X2Jsb2NrWzggKyAxICsgMiAqIGldIC0gMiArIDQgKiA0XTsKKyAgICAgICAgICAgICAgICAgICAgbm56X2NhY2hlWzMgKyA4ICogMTEgKyAyICogOCAqIGldID0gbm56W2xlZnRfYmxvY2tbOCArIDAgKyAyICogaV0gLSAyICsgOCAqIDRdOworICAgICAgICAgICAgICAgICAgICBubnpfY2FjaGVbMyArIDggKiAxMiArIDIgKiA4ICogaV0gPSBubnpbbGVmdF9ibG9ja1s4ICsgMSArIDIgKiBpXSAtIDIgKyA4ICogNF07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbm56X2NhY2hlWzMgKyA4ICogIDYgKyA4ICogaV0gPSBubnpbbGVmdF9ibG9ja1s4ICsgNCArIDIgKiBpXV07CisgICAgICAgICAgICAgICAgICAgIG5uel9jYWNoZVszICsgOCAqIDExICsgOCAqIGldID0gbm56W2xlZnRfYmxvY2tbOCArIDUgKyAyICogaV1dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbm56X2NhY2hlWzMgKyA4ICogIDEgKyAyICogOCAqIGldID0KKyAgICAgICAgICAgICAgICBubnpfY2FjaGVbMyArIDggKiAgMiArIDIgKiA4ICogaV0gPQorICAgICAgICAgICAgICAgIG5uel9jYWNoZVszICsgOCAqICA2ICsgMiAqIDggKiBpXSA9CisgICAgICAgICAgICAgICAgbm56X2NhY2hlWzMgKyA4ICogIDcgKyAyICogOCAqIGldID0KKyAgICAgICAgICAgICAgICBubnpfY2FjaGVbMyArIDggKiAxMSArIDIgKiA4ICogaV0gPQorICAgICAgICAgICAgICAgIG5uel9jYWNoZVszICsgOCAqIDEyICsgMiAqIDggKiBpXSA9IENBQkFDKGgpICYmICFJU19JTlRSQShtYl90eXBlKSA/IDAgOiA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChDQUJBQyhoKSkgeworICAgICAgICAgICAgLy8gdG9wX2NicAorICAgICAgICAgICAgaWYgKHRvcF90eXBlKQorICAgICAgICAgICAgICAgIGgtPnRvcF9jYnAgPSBoLT5jYnBfdGFibGVbdG9wX3h5XTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBoLT50b3BfY2JwID0gSVNfSU5UUkEobWJfdHlwZSkgPyAweDdDRiA6IDB4MDBGOworICAgICAgICAgICAgLy8gbGVmdF9jYnAKKyAgICAgICAgICAgIGlmIChsZWZ0X3R5cGVbTFRPUF0pIHsKKyAgICAgICAgICAgICAgICBoLT5sZWZ0X2NicCA9ICAgKGgtPmNicF90YWJsZVtsZWZ0X3h5W0xUT1BdXSAmIDB4N0YwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChoLT5jYnBfdGFibGVbbGVmdF94eVtMVE9QXV0gPj4gKGxlZnRfYmxvY2tbMF0gJiAofjEpKSkgJiAyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChoLT5jYnBfdGFibGVbbGVmdF94eVtMQk9UXV0gPj4gKGxlZnRfYmxvY2tbMl0gJiAofjEpKSkgJiAyKSA8PCAyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaC0+bGVmdF9jYnAgPSBJU19JTlRSQShtYl90eXBlKSA/IDB4N0NGIDogMHgwMEY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoSVNfSU5URVIobWJfdHlwZSkgfHwgKElTX0RJUkVDVChtYl90eXBlKSAmJiBoLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkKSkgeworICAgICAgICBpbnQgbGlzdDsKKyAgICAgICAgaW50IGJfc3RyaWRlID0gaC0+Yl9zdHJpZGU7CisgICAgICAgIGZvciAobGlzdCA9IDA7IGxpc3QgPCBoLT5saXN0X2NvdW50OyBsaXN0KyspIHsKKyAgICAgICAgICAgIGludDhfdCAqcmVmX2NhY2hlID0gJmgtPnJlZl9jYWNoZVtsaXN0XVtzY2FuOFswXV07CisgICAgICAgICAgICBpbnQ4X3QgKnJlZiAgICAgICA9IGgtPmN1cl9waWMucmVmX2luZGV4W2xpc3RdOworICAgICAgICAgICAgaW50MTZfdCgqbXZfY2FjaGUpWzJdID0gJmgtPm12X2NhY2hlW2xpc3RdW3NjYW44WzBdXTsKKyAgICAgICAgICAgIGludDE2X3QoKm12KVsyXSAgICAgICA9IGgtPmN1cl9waWMubW90aW9uX3ZhbFtsaXN0XTsKKyAgICAgICAgICAgIGlmICghVVNFU19MSVNUKG1iX3R5cGUsIGxpc3QpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYXZfYXNzZXJ0MighKElTX0RJUkVDVChtYl90eXBlKSAmJiAhaC0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZCkpOworCisgICAgICAgICAgICBpZiAoVVNFU19MSVNUKHRvcF90eXBlLCBsaXN0KSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBiX3h5ID0gaC0+bWIyYl94eVt0b3BfeHldICsgMyAqIGJfc3RyaWRlOworICAgICAgICAgICAgICAgIEFWX0NPUFkxMjgobXZfY2FjaGVbMCAtIDEgKiA4XSwgbXZbYl94eSArIDBdKTsKKyAgICAgICAgICAgICAgICByZWZfY2FjaGVbMCAtIDEgKiA4XSA9CisgICAgICAgICAgICAgICAgcmVmX2NhY2hlWzEgLSAxICogOF0gPSByZWZbNCAqIHRvcF94eSArIDJdOworICAgICAgICAgICAgICAgIHJlZl9jYWNoZVsyIC0gMSAqIDhdID0KKyAgICAgICAgICAgICAgICByZWZfY2FjaGVbMyAtIDEgKiA4XSA9IHJlZls0ICogdG9wX3h5ICsgM107CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFWX1pFUk8xMjgobXZfY2FjaGVbMCAtIDEgKiA4XSk7CisgICAgICAgICAgICAgICAgQVZfV04zMkEoJnJlZl9jYWNoZVswIC0gMSAqIDhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICgodG9wX3R5cGUgPyBMSVNUX05PVF9VU0VEIDogUEFSVF9OT1RfQVZBSUxBQkxFKSAmIDB4RkYpICogMHgwMTAxMDEwMXUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWJfdHlwZSAmIChNQl9UWVBFXzE2eDggfCBNQl9UWVBFXzh4OCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZV9pZHggPSAtMSArIGkgKiAyICogODsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFVTRVNfTElTVChsZWZ0X3R5cGVbTEVGVChpKV0sIGxpc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYl94eSAgPSBoLT5tYjJiX3h5W2xlZnRfeHlbTEVGVChpKV1dICsgMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiOF94eSA9IDQgKiBsZWZ0X3h5W0xFRlQoaSldICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkzMihtdl9jYWNoZVtjYWNoZV9pZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12W2JfeHkgKyBiX3N0cmlkZSAqIGxlZnRfYmxvY2tbMCArIGkgKiAyXV0pOworICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTMyKG12X2NhY2hlW2NhY2hlX2lkeCArIDhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12W2JfeHkgKyBiX3N0cmlkZSAqIGxlZnRfYmxvY2tbMSArIGkgKiAyXV0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmVmX2NhY2hlW2NhY2hlX2lkeF0gICAgID0gcmVmW2I4X3h5ICsgKGxlZnRfYmxvY2tbMCArIGkgKiAyXSAmIH4xKV07CisgICAgICAgICAgICAgICAgICAgICAgICByZWZfY2FjaGVbY2FjaGVfaWR4ICsgOF0gPSByZWZbYjhfeHkgKyAobGVmdF9ibG9ja1sxICsgaSAqIDJdICYgfjEpXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1pFUk8zMihtdl9jYWNoZVtjYWNoZV9pZHhdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1pFUk8zMihtdl9jYWNoZVtjYWNoZV9pZHggKyA4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWZfY2FjaGVbY2FjaGVfaWR4XSAgICAgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVmX2NhY2hlW2NhY2hlX2lkeCArIDhdID0gKGxlZnRfdHlwZVtMRUZUKGkpXSkgPyBMSVNUX05PVF9VU0VECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBBUlRfTk9UX0FWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKFVTRVNfTElTVChsZWZ0X3R5cGVbTFRPUF0sIGxpc3QpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiX3h5ICA9IGgtPm1iMmJfeHlbbGVmdF94eVtMVE9QXV0gKyAzOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYjhfeHkgPSA0ICogbGVmdF94eVtMVE9QXSArIDE7CisgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkzMihtdl9jYWNoZVstMV0sIG12W2JfeHkgKyBiX3N0cmlkZSAqIGxlZnRfYmxvY2tbMF1dKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmX2NhY2hlWy0xXSA9IHJlZltiOF94eSArIChsZWZ0X2Jsb2NrWzBdICYgfjEpXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBVl9aRVJPMzIobXZfY2FjaGVbLTFdKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmX2NhY2hlWy0xXSA9IGxlZnRfdHlwZVtMVE9QXSA/IExJU1RfTk9UX1VTRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBBUlRfTk9UX0FWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChVU0VTX0xJU1QodG9wcmlnaHRfdHlwZSwgbGlzdCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYl94eSA9IGgtPm1iMmJfeHlbdG9wcmlnaHRfeHldICsgMyAqIGJfc3RyaWRlOworICAgICAgICAgICAgICAgIEFWX0NPUFkzMihtdl9jYWNoZVs0IC0gMSAqIDhdLCBtdltiX3h5XSk7CisgICAgICAgICAgICAgICAgcmVmX2NhY2hlWzQgLSAxICogOF0gPSByZWZbNCAqIHRvcHJpZ2h0X3h5ICsgMl07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFWX1pFUk8zMihtdl9jYWNoZVs0IC0gMSAqIDhdKTsKKyAgICAgICAgICAgICAgICByZWZfY2FjaGVbNCAtIDEgKiA4XSA9IHRvcHJpZ2h0X3R5cGUgPyBMSVNUX05PVF9VU0VECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUEFSVF9OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocmVmX2NhY2hlWzIgLSAxKjhdIDwgMCB8fCByZWZfY2FjaGVbNCAtIDEgKiA4XSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoVVNFU19MSVNUKHRvcGxlZnRfdHlwZSwgbGlzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJfeHkgID0gaC0+bWIyYl94eVt0b3BsZWZ0X3h5XSArIDMgKyBiX3N0cmlkZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT50b3BsZWZ0X3BhcnRpdGlvbiAmIDIgKiBiX3N0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiOF94eSA9IDQgKiB0b3BsZWZ0X3h5ICsgMSArIChoLT50b3BsZWZ0X3BhcnRpdGlvbiAmIDIpOworICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIobXZfY2FjaGVbLTEgLSAxICogOF0sIG12W2JfeHldKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmX2NhY2hlWy0xIC0gMSAqIDhdID0gcmVmW2I4X3h5XTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBVl9aRVJPMzIobXZfY2FjaGVbLTEgLSAxICogOF0pOworICAgICAgICAgICAgICAgICAgICByZWZfY2FjaGVbLTEgLSAxICogOF0gPSB0b3BsZWZ0X3R5cGUgPyBMSVNUX05PVF9VU0VECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBBUlRfTk9UX0FWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgobWJfdHlwZSAmIChNQl9UWVBFX1NLSVAgfCBNQl9UWVBFX0RJUkVDVDIpKSAmJiAhRlJBTUVfTUJBRkYoaCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmICghKG1iX3R5cGUgJiAoTUJfVFlQRV9TS0lQIHwgTUJfVFlQRV9ESVJFQ1QyKSkpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90KCptdmRfY2FjaGUpWzJdICAgPSAmaC0+bXZkX2NhY2hlW2xpc3RdW3NjYW44WzBdXTsKKyAgICAgICAgICAgICAgICB1aW50OF90KCptdmQpWzJdICAgICAgICAgPSBoLT5tdmRfdGFibGVbbGlzdF07CisgICAgICAgICAgICAgICAgcmVmX2NhY2hlWzIgKyA4ICogMF0gPQorICAgICAgICAgICAgICAgIHJlZl9jYWNoZVsyICsgOCAqIDJdID0gUEFSVF9OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgICAgIEFWX1pFUk8zMihtdl9jYWNoZVsyICsgOCAqIDBdKTsKKyAgICAgICAgICAgICAgICBBVl9aRVJPMzIobXZfY2FjaGVbMiArIDggKiAyXSk7CisKKyAgICAgICAgICAgICAgICBpZiAoQ0FCQUMoaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFVTRVNfTElTVCh0b3BfdHlwZSwgbGlzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiX3h5ID0gaC0+bWIyYnJfeHlbdG9wX3h5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPUFk2NChtdmRfY2FjaGVbMCAtIDEgKiA4XSwgbXZkW2JfeHkgKyAwXSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9aRVJPNjQobXZkX2NhY2hlWzAgLSAxICogOF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChVU0VTX0xJU1QobGVmdF90eXBlW0xUT1BdLCBsaXN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJfeHkgPSBoLT5tYjJicl94eVtsZWZ0X3h5W0xUT1BdXSArIDY7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMTYobXZkX2NhY2hlWy0xICsgMCAqIDhdLCBtdmRbYl94eSAtIGxlZnRfYmxvY2tbMF1dKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkxNihtdmRfY2FjaGVbLTEgKyAxICogOF0sIG12ZFtiX3h5IC0gbGVmdF9ibG9ja1sxXV0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQVZfWkVSTzE2KG12ZF9jYWNoZVstMSArIDAgKiA4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9aRVJPMTYobXZkX2NhY2hlWy0xICsgMSAqIDhdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoVVNFU19MSVNUKGxlZnRfdHlwZVtMQk9UXSwgbGlzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiX3h5ID0gaC0+bWIyYnJfeHlbbGVmdF94eVtMQk9UXV0gKyA2OworICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTE2KG12ZF9jYWNoZVstMSArIDIgKiA4XSwgbXZkW2JfeHkgLSBsZWZ0X2Jsb2NrWzJdXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMTYobXZkX2NhY2hlWy0xICsgMyAqIDhdLCBtdmRbYl94eSAtIGxlZnRfYmxvY2tbM11dKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1pFUk8xNihtdmRfY2FjaGVbLTEgKyAyICogOF0pOworICAgICAgICAgICAgICAgICAgICAgICAgQVZfWkVSTzE2KG12ZF9jYWNoZVstMSArIDMgKiA4XSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQVZfWkVSTzE2KG12ZF9jYWNoZVsyICsgOCAqIDBdKTsKKyAgICAgICAgICAgICAgICAgICAgQVZfWkVSTzE2KG12ZF9jYWNoZVsyICsgOCAqIDJdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkaXJlY3RfY2FjaGUgPSAmaC0+ZGlyZWN0X2NhY2hlW3NjYW44WzBdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRpcmVjdF90YWJsZSA9IGgtPmRpcmVjdF90YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKGRpcmVjdF9jYWNoZSwgNCwgNCwgOCwgTUJfVFlQRV8xNngxNiA+PiAxLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElTX0RJUkVDVCh0b3BfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQSgmZGlyZWN0X2NhY2hlWy0xICogOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAxMDEwMXUgKiAoTUJfVFlQRV9ESVJFQ1QyID4+IDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfOFg4KHRvcF90eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiOF94eSA9IDQgKiB0b3BfeHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0X2NhY2hlWzAgLSAxICogOF0gPSBkaXJlY3RfdGFibGVbYjhfeHkgKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RfY2FjaGVbMiAtIDEgKiA4XSA9IGRpcmVjdF90YWJsZVtiOF94eSArIDNdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQSgmZGlyZWN0X2NhY2hlWy0xICogOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAxMDEwMSAqIChNQl9UWVBFXzE2eDE2ID4+IDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElTX0RJUkVDVChsZWZ0X3R5cGVbTFRPUF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdF9jYWNoZVstMSArIDAgKiA4XSA9IE1CX1RZUEVfRElSRUNUMiA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNfOFg4KGxlZnRfdHlwZVtMVE9QXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0X2NhY2hlWy0xICsgMCAqIDhdID0gZGlyZWN0X3RhYmxlWzQgKiBsZWZ0X3h5W0xUT1BdICsgMSArIChsZWZ0X2Jsb2NrWzBdICYgfjEpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RfY2FjaGVbLTEgKyAwICogOF0gPSBNQl9UWVBFXzE2eDE2ID4+IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJU19ESVJFQ1QobGVmdF90eXBlW0xCT1RdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RfY2FjaGVbLTEgKyAyICogOF0gPSBNQl9UWVBFX0RJUkVDVDIgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTXzhYOChsZWZ0X3R5cGVbTEJPVF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdF9jYWNoZVstMSArIDIgKiA4XSA9IGRpcmVjdF90YWJsZVs0ICogbGVmdF94eVtMQk9UXSArIDEgKyAobGVmdF9ibG9ja1syXSAmIH4xKV07CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0X2NhY2hlWy0xICsgMiAqIDhdID0gTUJfVFlQRV8xNngxNiA+PiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisjZGVmaW5lIE1BUF9NVlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFQX0YyRihzY2FuOFswXSAtIDEgLSAxICogOCwgdG9wbGVmdF90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFQX0YyRihzY2FuOFswXSArIDAgLSAxICogOCwgdG9wX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFQX0YyRihzY2FuOFswXSArIDEgLSAxICogOCwgdG9wX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFQX0YyRihzY2FuOFswXSArIDIgLSAxICogOCwgdG9wX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFQX0YyRihzY2FuOFswXSArIDMgLSAxICogOCwgdG9wX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFQX0YyRihzY2FuOFswXSArIDQgLSAxICogOCwgdG9wcmlnaHRfdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFQX0YyRihzY2FuOFswXSAtIDEgKyAwICogOCwgbGVmdF90eXBlW0xUT1BdKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFQX0YyRihzY2FuOFswXSAtIDEgKyAxICogOCwgbGVmdF90eXBlW0xUT1BdKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFQX0YyRihzY2FuOFswXSAtIDEgKyAyICogOCwgbGVmdF90eXBlW0xCT1RdKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFQX0YyRihzY2FuOFswXSAtIDEgKyAzICogOCwgbGVmdF90eXBlW0xCT1RdKQorCisgICAgICAgICAgICBpZiAoRlJBTUVfTUJBRkYoaCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoTUJfRklFTEQoaCkpIHsKKworI2RlZmluZSBNQVBfRjJGKGlkeCwgbWJfdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghSVNfSU5URVJMQUNFRChtYl90eXBlKSAmJiBoLT5yZWZfY2FjaGVbbGlzdF1baWR4XSA+PSAwKSB7ICAgICAgXAorICAgICAgICBoLT5yZWZfY2FjaGVbbGlzdF1baWR4XSAgICA8PD0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoLT5tdl9jYWNoZVtsaXN0XVtpZHhdWzFdICAgLz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoLT5tdmRfY2FjaGVbbGlzdF1baWR4XVsxXSA+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICAgICAgICAgICAgICAgICAgICBNQVBfTVZTCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworI3VuZGVmIE1BUF9GMkYKKyNkZWZpbmUgTUFQX0YyRihpZHgsIG1iX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoSVNfSU5URVJMQUNFRChtYl90eXBlKSAmJiBoLT5yZWZfY2FjaGVbbGlzdF1baWR4XSA+PSAwKSB7ICAgICAgIFwKKyAgICAgICAgaC0+cmVmX2NhY2hlW2xpc3RdW2lkeF0gICAgPj49IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaC0+bXZfY2FjaGVbbGlzdF1baWR4XVsxXSAgPDw9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaC0+bXZkX2NhY2hlW2xpc3RdW2lkeF1bMV0gPDw9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgTUFQX01WUworI3VuZGVmIE1BUF9GMkYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBoLT5uZWlnaGJvcl90cmFuc2Zvcm1fc2l6ZSA9ICEhSVNfOHg4RENUKHRvcF90eXBlKSArICEhSVNfOHg4RENUKGxlZnRfdHlwZVtMVE9QXSk7Cit9CisKKy8qKgorICogZGVjb2RlcyBhIFBfU0tJUCBvciBCX1NLSVAgbWFjcm9ibG9jaworICovCitzdGF0aWMgdm9pZCBhdl91bnVzZWQgZGVjb2RlX21iX3NraXAoSDI2NENvbnRleHQgKmgpCit7CisgICAgY29uc3QgaW50IG1iX3h5ID0gaC0+bWJfeHk7CisgICAgaW50IG1iX3R5cGUgICAgID0gMDsKKworICAgIG1lbXNldChoLT5ub25femVyb19jb3VudFttYl94eV0sIDAsIDQ4KTsKKworICAgIGlmIChNQl9GSUVMRChoKSkKKyAgICAgICAgbWJfdHlwZSB8PSBNQl9UWVBFX0lOVEVSTEFDRUQ7CisKKyAgICBpZiAoaC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgLy8ganVzdCBmb3IgZmlsbF9jYWNoZXMuIHByZWRfZGlyZWN0X21vdGlvbiB3aWxsIHNldCB0aGUgcmVhbCBtYl90eXBlCisgICAgICAgIG1iX3R5cGUgfD0gTUJfVFlQRV9MMEwxIHwgTUJfVFlQRV9ESVJFQ1QyIHwgTUJfVFlQRV9TS0lQOworICAgICAgICBpZiAoaC0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZCkgeworICAgICAgICAgICAgZmlsbF9kZWNvZGVfbmVpZ2hib3JzKGgsIG1iX3R5cGUpOworICAgICAgICAgICAgZmlsbF9kZWNvZGVfY2FjaGVzKGgsIG1iX3R5cGUpOyAvL0ZJWE1FIGNoZWNrIHdoYXQgaXMgbmVlZGVkIGFuZCB3aGF0IG5vdCAuLi4KKyAgICAgICAgfQorICAgICAgICBmZl9oMjY0X3ByZWRfZGlyZWN0X21vdGlvbihoLCAmbWJfdHlwZSk7CisgICAgICAgIG1iX3R5cGUgfD0gTUJfVFlQRV9TS0lQOworICAgIH0gZWxzZSB7CisgICAgICAgIG1iX3R5cGUgfD0gTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCB8IE1CX1RZUEVfU0tJUDsKKworICAgICAgICBmaWxsX2RlY29kZV9uZWlnaGJvcnMoaCwgbWJfdHlwZSk7CisgICAgICAgIHByZWRfcHNraXBfbW90aW9uKGgpOworICAgIH0KKworICAgIHdyaXRlX2JhY2tfbW90aW9uKGgsIG1iX3R5cGUpOworICAgIGgtPmN1cl9waWMubWJfdHlwZVttYl94eV0gICAgICA9IG1iX3R5cGU7CisgICAgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHldID0gaC0+cXNjYWxlOworICAgIGgtPnNsaWNlX3RhYmxlW21iX3h5XSAgICAgICAgICAgID0gaC0+c2xpY2VfbnVtOworICAgIGgtPnByZXZfbWJfc2tpcHBlZCAgICAgICAgICAgICAgID0gMTsKK30KKworI2VuZGlmIC8qIEFWQ09ERUNfSDI2NF9NVlBSRURfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9wYXJzZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4N2VmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfcGFyc2VyLmMKQEAgLTAsMCArMSw1NzUgQEAKKy8qCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBwYXJzZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBwYXJzZXIuCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2RlZmluZSBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUiAxCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgImgyNjRkYXRhLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKworCitzdGF0aWMgaW50IGgyNjRfZmluZF9mcmFtZV9lbmQoSDI2NENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUpCit7CisgICAgaW50IGksIGo7CisgICAgdWludDMyX3Qgc3RhdGU7CisgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZoLT5wYXJzZV9jb250ZXh0OworICAgIGludCBuZXh0X2F2Yz0gaC0+aXNfYXZjID8gMCA6IGJ1Zl9zaXplOworCisvLyAgICBtYl9hZGRyPSBwYy0+bWJfYWRkciAtIDE7CisgICAgc3RhdGUgPSBwYy0+c3RhdGU7CisgICAgaWYgKHN0YXRlID4gMTMpCisgICAgICAgIHN0YXRlID0gNzsKKworICAgIGlmIChoLT5pc19hdmMgJiYgIWgtPm5hbF9sZW5ndGhfc2l6ZSkKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJBVkMtcGFyc2VyOiBuYWwgbGVuZ3RoIHNpemUgaW52YWxpZFxuIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykgeworICAgICAgICBpZiAoaSA+PSBuZXh0X2F2YykgeworICAgICAgICAgICAgaW50IG5hbHNpemUgPSAwOworICAgICAgICAgICAgaSA9IG5leHRfYXZjOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGgtPm5hbF9sZW5ndGhfc2l6ZTsgaisrKQorICAgICAgICAgICAgICAgIG5hbHNpemUgPSAobmFsc2l6ZSA8PCA4KSB8IGJ1ZltpKytdOworICAgICAgICAgICAgaWYgKG5hbHNpemUgPD0gMCB8fCBuYWxzaXplID4gYnVmX3NpemUgLSBpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJBVkMtcGFyc2VyOiBuYWwgc2l6ZSAlZCByZW1haW5pbmcgJWRcbiIsIG5hbHNpemUsIGJ1Zl9zaXplIC0gaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dF9hdmMgPSBpICsgbmFsc2l6ZTsKKyAgICAgICAgICAgIHN0YXRlICAgID0gNTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0ZSA9PSA3KSB7CisgICAgICAgICAgICBpICs9IGgtPmgyNjRkc3Auc3RhcnRjb2RlX2ZpbmRfY2FuZGlkYXRlKGJ1ZiArIGksIG5leHRfYXZjIC0gaSk7CisgICAgICAgICAgICBpZiAoaSA8IG5leHRfYXZjKQorICAgICAgICAgICAgICAgIHN0YXRlID0gMjsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA8PSAyKSB7CisgICAgICAgICAgICBpZiAoYnVmW2ldID09IDEpCisgICAgICAgICAgICAgICAgc3RhdGUgXj0gNTsgICAgICAgICAgICAvLyAyLT43LCAxLT40LCAwLT41CisgICAgICAgICAgICBlbHNlIGlmIChidWZbaV0pCisgICAgICAgICAgICAgICAgc3RhdGUgPSA3OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YXRlID4+PSAxOyAgICAgICAgICAgLy8gMi0+MSwgMS0+MCwgMC0+MAorICAgICAgICB9IGVsc2UgaWYgKHN0YXRlIDw9IDUpIHsKKyAgICAgICAgICAgIGludCBuYWx1X3R5cGUgPSBidWZbaV0gJiAweDFGOworICAgICAgICAgICAgaWYgKG5hbHVfdHlwZSA9PSBOQUxfU0VJIHx8IG5hbHVfdHlwZSA9PSBOQUxfU1BTIHx8CisgICAgICAgICAgICAgICAgbmFsdV90eXBlID09IE5BTF9QUFMgfHwgbmFsdV90eXBlID09IE5BTF9BVUQpIHsKKyAgICAgICAgICAgICAgICBpZiAocGMtPmZyYW1lX3N0YXJ0X2ZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbHVfdHlwZSA9PSBOQUxfU0xJQ0UgfHwgbmFsdV90eXBlID09IE5BTF9EUEEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgbmFsdV90eXBlID09IE5BTF9JRFJfU0xJQ0UpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSArPSA4OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUgPSA3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaC0+cGFyc2VfaGlzdG9yeVtoLT5wYXJzZV9oaXN0b3J5X2NvdW50KytdPSBidWZbaV07CisgICAgICAgICAgICBpZiAoaC0+cGFyc2VfaGlzdG9yeV9jb3VudD41KSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1iLCBsYXN0X21iPSBoLT5wYXJzZV9sYXN0X21iOworICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CisKKyAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgaC0+cGFyc2VfaGlzdG9yeSwgOCpoLT5wYXJzZV9oaXN0b3J5X2NvdW50KTsKKyAgICAgICAgICAgICAgICBoLT5wYXJzZV9oaXN0b3J5X2NvdW50PTA7CisgICAgICAgICAgICAgICAgbWI9IGdldF91ZV9nb2xvbWJfbG9uZygmZ2IpOworICAgICAgICAgICAgICAgIGgtPnBhcnNlX2xhc3RfbWI9IG1iOworICAgICAgICAgICAgICAgIGlmIChwYy0+ZnJhbWVfc3RhcnRfZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iIDw9IGxhc3RfbWIpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPSAxOworICAgICAgICAgICAgICAgIHN0YXRlID0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwYy0+c3RhdGUgPSBzdGF0ZTsKKyAgICBpZiAoaC0+aXNfYXZjKQorICAgICAgICByZXR1cm4gbmV4dF9hdmM7CisgICAgcmV0dXJuIEVORF9OT1RfRk9VTkQ7CisKK2ZvdW5kOgorICAgIHBjLT5zdGF0ZSAgICAgICAgICAgICA9IDc7CisgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gMDsKKyAgICBpZiAoaC0+aXNfYXZjKQorICAgICAgICByZXR1cm4gbmV4dF9hdmM7CisgICAgcmV0dXJuIGkgLSAoc3RhdGUgJiA1KSAtIDUgKiAoc3RhdGUgPiA3KTsKK30KKworc3RhdGljIGludCBzY2FuX21tY29fcmVzZXQoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMpCit7CisgICAgSDI2NENvbnRleHQgKmggPSBzLT5wcml2X2RhdGE7CisKKyAgICBoLT5zbGljZV90eXBlX25vcyA9IHMtPnBpY3RfdHlwZSAmIDM7CisKKyAgICBpZiAoaC0+cHBzLnJlZHVuZGFudF9waWNfY250X3ByZXNlbnQpCisgICAgICAgIGdldF91ZV9nb2xvbWIoJmgtPmdiKTsgLy8gcmVkdW5kYW50X3BpY19jb3VudAorCisgICAgaWYgKGZmX3NldF9yZWZfY291bnQoaCkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChoLT5zbGljZV90eXBlX25vcyAhPSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICBpbnQgbGlzdDsKKyAgICAgICAgZm9yIChsaXN0ID0gMDsgbGlzdCA8IGgtPmxpc3RfY291bnQ7IGxpc3QrKykgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmaC0+Z2IpKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4OworICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyA7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjID0gZ2V0X3VlX2dvbG9tYl8zMSgmaC0+Z2IpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyaW5nX29mX3BpY19udW1zX2lkYyA8IDMpCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdWVfZ29sb21iKCZoLT5nYik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjID4gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgcmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IGgtPnJlZl9jb3VudFtsaXN0XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSBjb3VudCAlZCBvdmVyZmxvd1xuIiwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGgtPnBwcy53ZWlnaHRlZF9wcmVkICYmIGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB8fAorICAgICAgICAoaC0+cHBzLndlaWdodGVkX2JpcHJlZF9pZGMgPT0gMSAmJiBoLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQikpCisgICAgICAgIGZmX3ByZWRfd2VpZ2h0X3RhYmxlKGgpOworCisgICAgaWYgKGdldF9iaXRzMSgmaC0+Z2IpKSB7IC8vIGFkYXB0aXZlX3JlZl9waWNfbWFya2luZ19tb2RlX2ZsYWcKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTU1DT19DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICBNTUNPT3Bjb2RlIG9wY29kZSA9IGdldF91ZV9nb2xvbWJfMzEoJmgtPmdiKTsKKyAgICAgICAgICAgIGlmIChvcGNvZGUgPiAodW5zaWduZWQpIE1NQ09fTE9ORykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gTU1DT19FTkQpCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKG9wY29kZSA9PSBNTUNPX1JFU0VUKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICBpZiAob3Bjb2RlID09IE1NQ09fU0hPUlQyVU5VU0VEIHx8IG9wY29kZSA9PSBNTUNPX1NIT1JUMkxPTkcpCisgICAgICAgICAgICAgICAgZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBNTUNPX1NIT1JUMkxPTkcgfHwgb3Bjb2RlID09IE1NQ09fTE9ORzJVTlVTRUQgfHwKKyAgICAgICAgICAgICAgICBvcGNvZGUgPT0gTU1DT19MT05HIHx8IG9wY29kZSA9PSBNTUNPX1NFVF9NQVhfTE9ORykKKyAgICAgICAgICAgICAgICBnZXRfdWVfZ29sb21iXzMxKCZoLT5nYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBQYXJzZSBOQUwgdW5pdHMgb2YgZm91bmQgcGljdHVyZSBhbmQgZGVjb2RlIHNvbWUgYmFzaWMgaW5mb3JtYXRpb24uCisgKgorICogQHBhcmFtIHMgcGFyc2VyIGNvbnRleHQuCisgKiBAcGFyYW0gYXZjdHggY29kZWMgY29udGV4dC4KKyAqIEBwYXJhbSBidWYgYnVmZmVyIHdpdGggZmllbGQvZnJhbWUgZGF0YS4KKyAqIEBwYXJhbSBidWZfc2l6ZSBzaXplIG9mIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBhcnNlX25hbF91bml0cyhBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IGJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIEgyNjRDb250ZXh0ICpoICAgICAgICAgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGJ1Zl9pbmRleCwgbmV4dF9hdmM7CisgICAgdW5zaWduZWQgaW50IHBwc19pZDsKKyAgICB1bnNpZ25lZCBpbnQgc2xpY2VfdHlwZTsKKyAgICBpbnQgc3RhdGUgPSAtMSwgZ290X3Jlc2V0ID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpwdHI7CisgICAgaW50IHEyNjQgPSBidWZfc2l6ZSA+PTQgJiYgIW1lbWNtcCgiUTI2NCIsIGJ1ZiwgNCk7CisgICAgaW50IGZpZWxkX3BvY1syXTsKKworICAgIC8qIHNldCBzb21lIHNhbmUgZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBzLT5waWN0X3R5cGUgICAgICAgICA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIHMtPmtleV9mcmFtZSAgICAgICAgID0gMDsKKyAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSA9IEFWX1BJQ1RVUkVfU1RSVUNUVVJFX1VOS05PV047CisKKyAgICBoLT5hdmN0eCA9IGF2Y3R4OworICAgIGZmX2gyNjRfcmVzZXRfc2VpKGgpOworICAgIGgtPnNlaV9mcGEuZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9jYW5jZWxfZmxhZyA9IC0xOworCisgICAgaWYgKCFidWZfc2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBidWZfaW5kZXggICAgID0gMDsKKyAgICBuZXh0X2F2YyAgICAgID0gaC0+aXNfYXZjID8gMCA6IGJ1Zl9zaXplOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHNyY19sZW5ndGgsIGRzdF9sZW5ndGgsIGNvbnN1bWVkLCBuYWxzaXplID0gMDsKKworICAgICAgICBpZiAoYnVmX2luZGV4ID49IG5leHRfYXZjKSB7CisgICAgICAgICAgICBuYWxzaXplID0gZ2V0X2F2Y19uYWxzaXplKGgsIGJ1ZiwgYnVmX3NpemUsICZidWZfaW5kZXgpOworICAgICAgICAgICAgaWYgKG5hbHNpemUgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbmV4dF9hdmMgPSBidWZfaW5kZXggKyBuYWxzaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmX2luZGV4ID0gZmluZF9zdGFydF9jb2RlKGJ1ZiwgYnVmX3NpemUsIGJ1Zl9pbmRleCwgbmV4dF9hdmMpOworICAgICAgICAgICAgaWYgKGJ1Zl9pbmRleCA+PSBidWZfc2l6ZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChidWZfaW5kZXggPj0gbmV4dF9hdmMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3JjX2xlbmd0aCA9IG5leHRfYXZjIC0gYnVmX2luZGV4OworCisgICAgICAgIHN0YXRlID0gYnVmW2J1Zl9pbmRleF07CisgICAgICAgIHN3aXRjaCAoc3RhdGUgJiAweDFmKSB7CisgICAgICAgIGNhc2UgTkFMX1NMSUNFOgorICAgICAgICBjYXNlIE5BTF9JRFJfU0xJQ0U6CisgICAgICAgICAgICAvLyBEbyBub3Qgd2FsayB0aGUgd2hvbGUgYnVmZmVyIGp1c3QgdG8gZGVjb2RlIHNsaWNlIGhlYWRlcgorICAgICAgICAgICAgaWYgKChzdGF0ZSAmIDB4MWYpID09IE5BTF9JRFJfU0xJQ0UgfHwgKChzdGF0ZSA+PiA1KSAmIDB4MykgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIElEUiBvciBkaXNwb3NhYmxlIHNsaWNlCisgICAgICAgICAgICAgICAgICogTm8gbmVlZCB0byBkZWNvZGUgbWFueSBieXRlcyBiZWNhdXNlIE1NQ09zIHNoYWxsIG5vdCBiZSBwcmVzZW50LiAqLworICAgICAgICAgICAgICAgIGlmIChzcmNfbGVuZ3RoID4gNjApCisgICAgICAgICAgICAgICAgICAgIHNyY19sZW5ndGggPSA2MDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogVG8gZGVjb2RlIHVwIHRvIE1NQ09zICovCisgICAgICAgICAgICAgICAgaWYgKHNyY19sZW5ndGggPiAxMDAwKQorICAgICAgICAgICAgICAgICAgICBzcmNfbGVuZ3RoID0gMTAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHB0ciA9IGZmX2gyNjRfZGVjb2RlX25hbChoLCBidWYgKyBidWZfaW5kZXgsICZkc3RfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnN1bWVkLCBzcmNfbGVuZ3RoKTsKKyAgICAgICAgaWYgKCFwdHIgfHwgZHN0X2xlbmd0aCA8IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBidWZfaW5kZXggKz0gY29uc3VtZWQ7CisKKyAgICAgICAgaW5pdF9nZXRfYml0cygmaC0+Z2IsIHB0ciwgOCAqIGRzdF9sZW5ndGgpOworICAgICAgICBzd2l0Y2ggKGgtPm5hbF91bml0X3R5cGUpIHsKKyAgICAgICAgY2FzZSBOQUxfU1BTOgorICAgICAgICAgICAgZmZfaDI2NF9kZWNvZGVfc2VxX3BhcmFtZXRlcl9zZXQoaCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOQUxfUFBTOgorICAgICAgICAgICAgZmZfaDI2NF9kZWNvZGVfcGljdHVyZV9wYXJhbWV0ZXJfc2V0KGgsIGgtPmdiLnNpemVfaW5fYml0cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOQUxfU0VJOgorICAgICAgICAgICAgZmZfaDI2NF9kZWNvZGVfc2VpKGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkFMX0lEUl9TTElDRToKKyAgICAgICAgICAgIHMtPmtleV9mcmFtZSA9IDE7CisKKyAgICAgICAgICAgIGgtPnByZXZfZnJhbWVfbnVtICAgICAgICA9IDA7CisgICAgICAgICAgICBoLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgPSAwOworICAgICAgICAgICAgaC0+cHJldl9wb2NfbXNiICAgICAgICAgID0KKyAgICAgICAgICAgIGgtPnByZXZfcG9jX2xzYiAgICAgICAgICA9IDA7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIE5BTF9TTElDRToKKyAgICAgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZygmaC0+Z2IpOyAgLy8gc2tpcCBmaXJzdF9tYl9pbl9zbGljZQorICAgICAgICAgICAgc2xpY2VfdHlwZSAgID0gZ2V0X3VlX2dvbG9tYl8zMSgmaC0+Z2IpOworICAgICAgICAgICAgcy0+cGljdF90eXBlID0gZ29sb21iX3RvX3BpY3RfdHlwZVtzbGljZV90eXBlICUgNV07CisgICAgICAgICAgICBpZiAoaC0+c2VpX3JlY292ZXJ5X2ZyYW1lX2NudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgLyoga2V5IGZyYW1lLCBzaW5jZSByZWNvdmVyeV9mcmFtZV9jbnQgaXMgc2V0ICovCisgICAgICAgICAgICAgICAgcy0+a2V5X2ZyYW1lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBwc19pZCA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgICAgIGlmIChwcHNfaWQgPj0gTUFYX1BQU19DT1VOVCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAicHBzX2lkICV1IG91dCBvZiByYW5nZVxuIiwgcHBzX2lkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWgtPnBwc19idWZmZXJzW3Bwc19pZF0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1leGlzdGluZyBQUFMgJXUgcmVmZXJlbmNlZFxuIiwgcHBzX2lkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoLT5wcHMgPSAqaC0+cHBzX2J1ZmZlcnNbcHBzX2lkXTsKKyAgICAgICAgICAgIGlmICghaC0+c3BzX2J1ZmZlcnNbaC0+cHBzLnNwc19pZF0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1leGlzdGluZyBTUFMgJXUgcmVmZXJlbmNlZFxuIiwgaC0+cHBzLnNwc19pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaC0+c3BzICAgICAgID0gKmgtPnNwc19idWZmZXJzW2gtPnBwcy5zcHNfaWRdOworICAgICAgICAgICAgaC0+ZnJhbWVfbnVtID0gZ2V0X2JpdHMoJmgtPmdiLCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtKTsKKworICAgICAgICAgICAgaWYoaC0+c3BzLnJlZl9mcmFtZV9jb3VudCA8PSAxICYmIGgtPnBwcy5yZWZfY291bnRbMF0gPD0gMSAmJiBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgICAgICAgICAgcy0+a2V5X2ZyYW1lID0gMTsKKworICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBmZl9oMjY0X2dldF9wcm9maWxlKCZoLT5zcHMpOworICAgICAgICAgICAgYXZjdHgtPmxldmVsICAgPSBoLT5zcHMubGV2ZWxfaWRjOworCisgICAgICAgICAgICBpZiAoaC0+c3BzLmZyYW1lX21ic19vbmx5X2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfRlJBTUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJmgtPmdiKSkgeyAvLyBmaWVsZF9waWNfZmxhZworICAgICAgICAgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfVE9QX0ZJRUxEICsgZ2V0X2JpdHMxKCZoLT5nYik7IC8vIGJvdHRvbV9maWVsZF9mbGFnCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBQSUNUX0ZSQU1FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGgtPm5hbF91bml0X3R5cGUgPT0gTkFMX0lEUl9TTElDRSkKKyAgICAgICAgICAgICAgICBnZXRfdWVfZ29sb21iKCZoLT5nYik7IC8qIGlkcl9waWNfaWQgKi8KKyAgICAgICAgICAgIGlmIChoLT5zcHMucG9jX3R5cGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGgtPnBvY19sc2IgPSBnZXRfYml0cygmaC0+Z2IsIGgtPnNwcy5sb2cyX21heF9wb2NfbHNiKTsKKworICAgICAgICAgICAgICAgIGlmIChoLT5wcHMucGljX29yZGVyX3ByZXNlbnQgPT0gMSAmJgorICAgICAgICAgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICBoLT5kZWx0YV9wb2NfYm90dG9tID0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaC0+c3BzLnBvY190eXBlID09IDEgJiYKKyAgICAgICAgICAgICAgICAhaC0+c3BzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKSB7CisgICAgICAgICAgICAgICAgaC0+ZGVsdGFfcG9jWzBdID0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOworCisgICAgICAgICAgICAgICAgaWYgKGgtPnBwcy5waWNfb3JkZXJfcHJlc2VudCA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgIGgtPmRlbHRhX3BvY1sxXSA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRGVjb2RlIFBPQyBvZiB0aGlzIHBpY3R1cmUuCisgICAgICAgICAgICAgKiBUaGUgcHJldl8gdmFsdWVzIG5lZWRlZCBmb3IgZGVjb2RpbmcgUE9DIG9mIHRoZSBuZXh0IHBpY3R1cmUgYXJlIG5vdCBzZXQgaGVyZS4gKi8KKyAgICAgICAgICAgIGZpZWxkX3BvY1swXSA9IGZpZWxkX3BvY1sxXSA9IElOVF9NQVg7CisgICAgICAgICAgICBmZl9pbml0X3BvYyhoLCBmaWVsZF9wb2MsICZzLT5vdXRwdXRfcGljdHVyZV9udW1iZXIpOworCisgICAgICAgICAgICAvKiBDb250aW51ZSBwYXJzaW5nIHRvIGNoZWNrIGlmIE1NQ09fUkVTRVQgaXMgcHJlc2VudC4KKyAgICAgICAgICAgICAqIEZJWE1FOiBNTUNPX1JFU0VUIGNvdWxkIGFwcGVhciBpbiBub24tZmlyc3Qgc2xpY2UuCisgICAgICAgICAgICAgKiAgICAgICAgTWF5YmUsIHdlIHNob3VsZCBwYXJzZSBhbGwgdW5kaXNwb3NhYmxlIG5vbi1JRFIgc2xpY2Ugb2YgdGhpcworICAgICAgICAgICAgICogICAgICAgIHBpY3R1cmUgdW50aWwgZW5jb3VudGVyaW5nIE1NQ09fUkVTRVQgaW4gYSBzbGljZSBvZiBpdC4gKi8KKyAgICAgICAgICAgIGlmIChoLT5uYWxfcmVmX2lkYyAmJiBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9JRFJfU0xJQ0UpIHsKKyAgICAgICAgICAgICAgICBnb3RfcmVzZXQgPSBzY2FuX21tY29fcmVzZXQocyk7CisgICAgICAgICAgICAgICAgaWYgKGdvdF9yZXNldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnb3RfcmVzZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNldCB1cCB0aGUgcHJldl8gdmFsdWVzIGZvciBkZWNvZGluZyBQT0Mgb2YgdGhlIG5leHQgcGljdHVyZS4gKi8KKyAgICAgICAgICAgIGgtPnByZXZfZnJhbWVfbnVtICAgICAgICA9IGdvdF9yZXNldCA/IDAgOiBoLT5mcmFtZV9udW07CisgICAgICAgICAgICBoLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgPSBnb3RfcmVzZXQgPyAwIDogaC0+ZnJhbWVfbnVtX29mZnNldDsKKyAgICAgICAgICAgIGlmIChoLT5uYWxfcmVmX2lkYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnb3RfcmVzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+cHJldl9wb2NfbXNiID0gaC0+cG9jX21zYjsKKyAgICAgICAgICAgICAgICAgICAgaC0+cHJldl9wb2NfbHNiID0gaC0+cG9jX2xzYjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBoLT5wcmV2X3BvY19tc2IgPSAwOworICAgICAgICAgICAgICAgICAgICBoLT5wcmV2X3BvY19sc2IgPQorICAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQgPyAwIDogZmllbGRfcG9jWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGgtPnNwcy5waWNfc3RydWN0X3ByZXNlbnRfZmxhZykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoaC0+c2VpX3BpY19zdHJ1Y3QpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX1RPUF9GSUVMRDoKKyAgICAgICAgICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX0JPVFRPTV9GSUVMRDoKKyAgICAgICAgICAgICAgICAgICAgcy0+cmVwZWF0X3BpY3QgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX0ZSQU1FOgorICAgICAgICAgICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfVE9QX0JPVFRPTToKKyAgICAgICAgICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX0JPVFRPTV9UT1A6CisgICAgICAgICAgICAgICAgICAgIHMtPnJlcGVhdF9waWN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NX1RPUDoKKyAgICAgICAgICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX0JPVFRPTV9UT1BfQk9UVE9NOgorICAgICAgICAgICAgICAgICAgICBzLT5yZXBlYXRfcGljdCA9IDI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfRlJBTUVfRE9VQkxJTkc6CisgICAgICAgICAgICAgICAgICAgIHMtPnJlcGVhdF9waWN0ID0gMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9GUkFNRV9UUklQTElORzoKKyAgICAgICAgICAgICAgICAgICAgcy0+cmVwZWF0X3BpY3QgPSA1OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzLT5yZXBlYXRfcGljdCA9IGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5yZXBlYXRfcGljdCA9IGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUgPyAxIDogMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpIHsKKyAgICAgICAgICAgICAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSA9IEFWX1BJQ1RVUkVfU1RSVUNUVVJFX0ZSQU1FOworICAgICAgICAgICAgICAgIGlmIChoLT5zcHMucGljX3N0cnVjdF9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoLT5zZWlfcGljX3N0cnVjdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX1RPUF9CT1RUT006CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfVE9QX0JPVFRPTV9UT1A6CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1RUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfQk9UVE9NX1RPUDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QX0JPVFRPTToKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfQkI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfUFJPR1JFU1NJVkU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZF9wb2NbMF0gPCBmaWVsZF9wb2NbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1RUOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZF9wb2NbMF0gPiBmaWVsZF9wb2NbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX0JCOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1BST0dSRVNTSVZFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfVE9QX0ZJRUxEKQorICAgICAgICAgICAgICAgICAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSA9IEFWX1BJQ1RVUkVfU1RSVUNUVVJFX1RPUF9GSUVMRDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHMtPnBpY3R1cmVfc3RydWN0dXJlID0gQVZfUElDVFVSRV9TVFJVQ1RVUkVfQk9UVE9NX0ZJRUxEOworICAgICAgICAgICAgICAgIHMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfVU5LTk9XTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIDA7IC8qIG5vIG5lZWQgdG8gZXZhbHVhdGUgdGhlIHJlc3QgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocTI2NCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLyogZGlkbid0IGZpbmQgYSBwaWN0dXJlISAqLworICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibWlzc2luZyBwaWN0dXJlIGluIGFjY2VzcyB1bml0IHdpdGggc2l6ZSAlZFxuIiwgYnVmX3NpemUpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBoMjY0X3BhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgSDI2NENvbnRleHQgKmggICA9IHMtPnByaXZfZGF0YTsKKyAgICBQYXJzZUNvbnRleHQgKnBjID0gJmgtPnBhcnNlX2NvbnRleHQ7CisgICAgaW50IG5leHQ7CisKKyAgICBpZiAoIWgtPmdvdF9maXJzdCkgeworICAgICAgICBoLT5nb3RfZmlyc3QgPSAxOworICAgICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgICAgICBoLT5hdmN0eCA9IGF2Y3R4OworICAgICAgICAgICAgLy8gbXVzdCBiZSBkb25lIGxpa2UgaW4gZGVjb2Rlciwgb3RoZXJ3aXNlIG9wZW5pbmcgdGhlIHBhcnNlciwKKyAgICAgICAgICAgIC8vIGxldHRpbmcgaXQgY3JlYXRlIGV4dHJhZGF0YSBhbmQgdGhlbiBjbG9zaW5nIGFuZCBvcGVuaW5nIGFnYWluCisgICAgICAgICAgICAvLyB3aWxsIGNhdXNlIGhhc19iX2ZyYW1lcyB0byBiZSBhbHdheXMgc2V0LgorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGVzdGltYXRlX3RpbWluZ3NfZnJvbV9wdHMgZG9lcyBleGFjdGx5IHRoaXMuCisgICAgICAgICAgICBpZiAoIWF2Y3R4LT5oYXNfYl9mcmFtZXMpCisgICAgICAgICAgICAgICAgaC0+bG93X2RlbGF5ID0gMTsKKyAgICAgICAgICAgIGZmX2gyNjRfZGVjb2RlX2V4dHJhZGF0YShoLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPmZsYWdzICYgUEFSU0VSX0ZMQUdfQ09NUExFVEVfRlJBTUVTKSB7CisgICAgICAgIG5leHQgPSBidWZfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXh0ID0gaDI2NF9maW5kX2ZyYW1lX2VuZChoLCBidWYsIGJ1Zl9zaXplKTsKKworICAgICAgICBpZiAoZmZfY29tYmluZV9mcmFtZShwYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgICAgICpwb3V0YnVmICAgICAgPSBOVUxMOworICAgICAgICAgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmV4dCA8IDAgJiYgbmV4dCAhPSBFTkRfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBhdl9hc3NlcnQxKHBjLT5sYXN0X2luZGV4ICsgbmV4dCA+PSAwKTsKKyAgICAgICAgICAgIGgyNjRfZmluZF9mcmFtZV9lbmQoaCwgJnBjLT5idWZmZXJbcGMtPmxhc3RfaW5kZXggKyBuZXh0XSwgLW5leHQpOyAvLyB1cGRhdGUgc3RhdGUKKyAgICAgICAgfQorICAgIH0KKworICAgIHBhcnNlX25hbF91bml0cyhzLCBhdmN0eCwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICBpZiAoYXZjdHgtPmZyYW1lcmF0ZS5udW0pCisgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UgPSBhdl9pbnZfcShhdl9tdWxfcShhdmN0eC0+ZnJhbWVyYXRlLCAoQVZSYXRpb25hbCl7YXZjdHgtPnRpY2tzX3Blcl9mcmFtZSwgMX0pKTsKKyAgICBpZiAoaC0+c2VpX2NwYl9yZW1vdmFsX2RlbGF5ID49IDApIHsKKyAgICAgICAgcy0+ZHRzX3N5bmNfcG9pbnQgICAgPSBoLT5zZWlfYnVmZmVyaW5nX3BlcmlvZF9wcmVzZW50OworICAgICAgICBzLT5kdHNfcmVmX2R0c19kZWx0YSA9IGgtPnNlaV9jcGJfcmVtb3ZhbF9kZWxheTsKKyAgICAgICAgcy0+cHRzX2R0c19kZWx0YSAgICAgPSBoLT5zZWlfZHBiX291dHB1dF9kZWxheTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5kdHNfc3luY19wb2ludCAgICA9IElOVF9NSU47CisgICAgICAgIHMtPmR0c19yZWZfZHRzX2RlbHRhID0gSU5UX01JTjsKKyAgICAgICAgcy0+cHRzX2R0c19kZWx0YSAgICAgPSBJTlRfTUlOOworICAgIH0KKworICAgIGlmIChzLT5mbGFncyAmIFBBUlNFUl9GTEFHX09OQ0UpIHsKKyAgICAgICAgcy0+ZmxhZ3MgJj0gUEFSU0VSX0ZMQUdfQ09NUExFVEVfRlJBTUVTOworICAgIH0KKworICAgICpwb3V0YnVmICAgICAgPSBidWY7CisgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIHJldHVybiBuZXh0OworfQorCitzdGF0aWMgaW50IGgyNjRfc3BsaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIGludCBpOworICAgIHVpbnQzMl90IHN0YXRlID0gLTE7CisgICAgaW50IGhhc19zcHMgICAgPSAwOworICAgIGludCBoYXNfcHBzICAgID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gYnVmX3NpemU7IGkrKykgeworICAgICAgICBpZiAoKHN0YXRlICYgMHhGRkZGRkYxRikgPT0gMHgxMDcpCisgICAgICAgICAgICBoYXNfc3BzID0gMTsKKyAgICAgICAgaWYgKChzdGF0ZSAmIDB4RkZGRkZGMUYpID09IDB4MTA4KQorICAgICAgICAgICAgaGFzX3BwcyA9IDE7CisgICAgICAgIC8qICBpZiAoKHN0YXRlJjB4RkZGRkZGMUYpID09IDB4MTAxIHx8CisgICAgICAgICAqICAgICAoc3RhdGUmMHhGRkZGRkYxRikgPT0gMHgxMDIgfHwKKyAgICAgICAgICogICAgIChzdGF0ZSYweEZGRkZGRjFGKSA9PSAweDEwNSkgeworICAgICAgICAgKiAgfQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChzdGF0ZSAmIDB4RkZGRkZGMDApID09IDB4MTAwICYmICgoc3RhdGUgJiAweEZGRkZGRjFGKSAhPSAweDEwNiB8fCBoYXNfcHBzKSAmJgorICAgICAgICAgICAgKHN0YXRlICYgMHhGRkZGRkYxRikgIT0gMHgxMDcgJiYgKHN0YXRlICYgMHhGRkZGRkYxRikgIT0gMHgxMDggJiYKKyAgICAgICAgICAgIChzdGF0ZSAmIDB4RkZGRkZGMUYpICE9IDB4MTA5ICYmIChzdGF0ZSAmIDB4RkZGRkZGMUYpICE9IDB4MTBkICYmCisgICAgICAgICAgICAoc3RhdGUgJiAweEZGRkZGRjFGKSAhPSAweDEwZikgeworICAgICAgICAgICAgaWYgKGhhc19zcHMpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaSA+IDQgJiYgYnVmW2kgLSA1XSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSA0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpIDwgYnVmX3NpemUpCisgICAgICAgICAgICBzdGF0ZSA9IChzdGF0ZSA8PCA4KSB8IGJ1ZltpXTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzKQoreworICAgIEgyNjRDb250ZXh0ICpoICAgPSBzLT5wcml2X2RhdGE7CisgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZoLT5wYXJzZV9jb250ZXh0OworCisgICAgYXZfZnJlZXAoJnBjLT5idWZmZXIpOworICAgIGZmX2gyNjRfZnJlZV9jb250ZXh0KGgpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkNvZGVjUGFyc2VyQ29udGV4dCAqcykKK3sKKyAgICBIMjY0Q29udGV4dCAqaCA9IHMtPnByaXZfZGF0YTsKKyAgICBoLT50aHJlYWRfY29udGV4dFswXSAgID0gaDsKKyAgICBoLT5zbGljZV9jb250ZXh0X2NvdW50ID0gMTsKKyAgICBmZl9oMjY0ZHNwX2luaXQoJmgtPmgyNjRkc3AsIDgsIDEpOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjUGFyc2VyIGZmX2gyNjRfcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfSDI2NCB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihIMjY0Q29udGV4dCksCisgICAgLnBhcnNlcl9pbml0ICAgID0gaW5pdCwKKyAgICAucGFyc2VyX3BhcnNlICAgPSBoMjY0X3BhcnNlLAorICAgIC5wYXJzZXJfY2xvc2UgICA9IGNsb3NlLAorICAgIC5zcGxpdCAgICAgICAgICA9IGgyNjRfc3BsaXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9waWN0dXJlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X3BpY3R1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmJkYWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9waWN0dXJlLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgY29kZWMuCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiY2FiYWMuaCIKKyNpbmNsdWRlICJjYWJhY19mdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJoMjY0ZGF0YS5oIgorI2luY2x1ZGUgImgyNjRjaHJvbWEuaCIKKyNpbmNsdWRlICJoMjY0X212cHJlZC5oIgorI2luY2x1ZGUgImdvbG9tYi5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJyZWN0YW5nbGUuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ2ZHBhdV9pbnRlcm5hbC5oIgorCit2b2lkIGZmX2gyNjRfdW5yZWZfcGljdHVyZShIMjY0Q29udGV4dCAqaCwgSDI2NFBpY3R1cmUgKnBpYykKK3sKKyAgICBpbnQgb2ZmID0gb2Zmc2V0b2YoSDI2NFBpY3R1cmUsIHRmKSArIHNpemVvZihwaWMtPnRmKTsKKyAgICBpbnQgaTsKKworICAgIGlmICghcGljLT5mLmJ1ZlswXSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGgtPmF2Y3R4LCAmcGljLT50Zik7CisgICAgYXZfYnVmZmVyX3VucmVmKCZwaWMtPmh3YWNjZWxfcHJpdl9idWYpOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZwaWMtPnFzY2FsZV90YWJsZV9idWYpOworICAgIGF2X2J1ZmZlcl91bnJlZigmcGljLT5tYl90eXBlX2J1Zik7CisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnBpYy0+bW90aW9uX3ZhbF9idWZbaV0pOworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnBpYy0+cmVmX2luZGV4X2J1ZltpXSk7CisgICAgfQorCisgICAgbWVtc2V0KCh1aW50OF90KilwaWMgKyBvZmYsIDAsIHNpemVvZigqcGljKSAtIG9mZik7Cit9CisKK2ludCBmZl9oMjY0X3JlZl9waWN0dXJlKEgyNjRDb250ZXh0ICpoLCBIMjY0UGljdHVyZSAqZHN0LCBIMjY0UGljdHVyZSAqc3JjKQoreworICAgIGludCByZXQsIGk7CisKKyAgICBhdl9hc3NlcnQwKCFkc3QtPmYuYnVmWzBdKTsKKyAgICBhdl9hc3NlcnQwKHNyYy0+Zi5idWZbMF0pOworCisgICAgc3JjLT50Zi5mID0gJnNyYy0+ZjsKKyAgICBkc3QtPnRmLmYgPSAmZHN0LT5mOworICAgIHJldCA9IGZmX3RocmVhZF9yZWZfZnJhbWUoJmRzdC0+dGYsICZzcmMtPnRmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZHN0LT5xc2NhbGVfdGFibGVfYnVmID0gYXZfYnVmZmVyX3JlZihzcmMtPnFzY2FsZV90YWJsZV9idWYpOworICAgIGRzdC0+bWJfdHlwZV9idWYgICAgICA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5tYl90eXBlX2J1Zik7CisgICAgaWYgKCFkc3QtPnFzY2FsZV90YWJsZV9idWYgfHwgIWRzdC0+bWJfdHlwZV9idWYpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBkc3QtPnFzY2FsZV90YWJsZSA9IHNyYy0+cXNjYWxlX3RhYmxlOworICAgIGRzdC0+bWJfdHlwZSAgICAgID0gc3JjLT5tYl90eXBlOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBkc3QtPm1vdGlvbl92YWxfYnVmW2ldID0gYXZfYnVmZmVyX3JlZihzcmMtPm1vdGlvbl92YWxfYnVmW2ldKTsKKyAgICAgICAgZHN0LT5yZWZfaW5kZXhfYnVmW2ldICA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5yZWZfaW5kZXhfYnVmW2ldKTsKKyAgICAgICAgaWYgKCFkc3QtPm1vdGlvbl92YWxfYnVmW2ldIHx8ICFkc3QtPnJlZl9pbmRleF9idWZbaV0pCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGRzdC0+bW90aW9uX3ZhbFtpXSA9IHNyYy0+bW90aW9uX3ZhbFtpXTsKKyAgICAgICAgZHN0LT5yZWZfaW5kZXhbaV0gID0gc3JjLT5yZWZfaW5kZXhbaV07CisgICAgfQorCisgICAgaWYgKHNyYy0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGUpIHsKKyAgICAgICAgZHN0LT5od2FjY2VsX3ByaXZfYnVmID0gYXZfYnVmZmVyX3JlZihzcmMtPmh3YWNjZWxfcHJpdl9idWYpOworICAgICAgICBpZiAoIWRzdC0+aHdhY2NlbF9wcml2X2J1ZikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgZHN0LT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZSA9IGRzdC0+aHdhY2NlbF9wcml2X2J1Zi0+ZGF0YTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICBkc3QtPmZpZWxkX3BvY1tpXSA9IHNyYy0+ZmllbGRfcG9jW2ldOworCisgICAgbWVtY3B5KGRzdC0+cmVmX3BvYywgICBzcmMtPnJlZl9wb2MsICAgc2l6ZW9mKHNyYy0+cmVmX3BvYykpOworICAgIG1lbWNweShkc3QtPnJlZl9jb3VudCwgc3JjLT5yZWZfY291bnQsIHNpemVvZihzcmMtPnJlZl9jb3VudCkpOworCisgICAgZHN0LT5wb2MgICAgICAgICAgID0gc3JjLT5wb2M7CisgICAgZHN0LT5mcmFtZV9udW0gICAgID0gc3JjLT5mcmFtZV9udW07CisgICAgZHN0LT5tbWNvX3Jlc2V0ICAgID0gc3JjLT5tbWNvX3Jlc2V0OworICAgIGRzdC0+cGljX2lkICAgICAgICA9IHNyYy0+cGljX2lkOworICAgIGRzdC0+bG9uZ19yZWYgICAgICA9IHNyYy0+bG9uZ19yZWY7CisgICAgZHN0LT5tYmFmZiAgICAgICAgID0gc3JjLT5tYmFmZjsKKyAgICBkc3QtPmZpZWxkX3BpY3R1cmUgPSBzcmMtPmZpZWxkX3BpY3R1cmU7CisgICAgZHN0LT5uZWVkc19yZWFsbG9jID0gc3JjLT5uZWVkc19yZWFsbG9jOworICAgIGRzdC0+cmVmZXJlbmNlICAgICA9IHNyYy0+cmVmZXJlbmNlOworICAgIGRzdC0+Y3JvcCAgICAgICAgICA9IHNyYy0+Y3JvcDsKKyAgICBkc3QtPmNyb3BfbGVmdCAgICAgPSBzcmMtPmNyb3BfbGVmdDsKKyAgICBkc3QtPmNyb3BfdG9wICAgICAgPSBzcmMtPmNyb3BfdG9wOworICAgIGRzdC0+cmVjb3ZlcmVkICAgICA9IHNyYy0+cmVjb3ZlcmVkOworICAgIGRzdC0+aW52YWxpZF9nYXAgICA9IHNyYy0+aW52YWxpZF9nYXA7CisgICAgZHN0LT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250ID0gc3JjLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250OworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCBkc3QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZmZfaDI2NF9zZXRfZXJwaWMoRVJQaWN0dXJlICpkc3QsIEgyNjRQaWN0dXJlICpzcmMpCit7CisjaWYgQ09ORklHX0VSUk9SX1JFU0lMSUVOQ0UKKyAgICBpbnQgaTsKKworICAgIG1lbXNldChkc3QsIDAsIHNpemVvZigqZHN0KSk7CisKKyAgICBpZiAoIXNyYykKKyAgICAgICAgcmV0dXJuOworCisgICAgZHN0LT5mID0gJnNyYy0+ZjsKKyAgICBkc3QtPnRmID0gJnNyYy0+dGY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGRzdC0+bW90aW9uX3ZhbFtpXSA9IHNyYy0+bW90aW9uX3ZhbFtpXTsKKyAgICAgICAgZHN0LT5yZWZfaW5kZXhbaV0gPSBzcmMtPnJlZl9pbmRleFtpXTsKKyAgICB9CisKKyAgICBkc3QtPm1iX3R5cGUgPSBzcmMtPm1iX3R5cGU7CisgICAgZHN0LT5maWVsZF9waWN0dXJlID0gc3JjLT5maWVsZF9waWN0dXJlOworI2VuZGlmIC8qIENPTkZJR19FUlJPUl9SRVNJTElFTkNFICovCit9CisKK2ludCBmZl9oMjY0X2ZpZWxkX2VuZChIMjY0Q29udGV4dCAqaCwgaW50IGluX3NldHVwKQoreworICAgIEFWQ29kZWNDb250ZXh0ICpjb25zdCBhdmN0eCA9IGgtPmF2Y3R4OworICAgIGludCBlcnIgPSAwOworICAgIGgtPm1iX3kgPSAwOworCisgICAgaWYgKENPTkZJR19IMjY0X1ZEUEFVX0RFQ09ERVIgJiYKKyAgICAgICAgaC0+YXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVSkKKyAgICAgICAgZmZfdmRwYXVfaDI2NF9zZXRfcmVmZXJlbmNlX2ZyYW1lcyhoKTsKKworICAgIGlmIChpbl9zZXR1cCB8fCAhKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpKSB7CisgICAgICAgIGlmICghaC0+ZHJvcHBhYmxlKSB7CisgICAgICAgICAgICBlcnIgPSBmZl9oMjY0X2V4ZWN1dGVfcmVmX3BpY19tYXJraW5nKGgsIGgtPm1tY28sIGgtPm1tY29faW5kZXgpOworICAgICAgICAgICAgaC0+cHJldl9wb2NfbXNiID0gaC0+cG9jX21zYjsKKyAgICAgICAgICAgIGgtPnByZXZfcG9jX2xzYiA9IGgtPnBvY19sc2I7CisgICAgICAgIH0KKyAgICAgICAgaC0+cHJldl9mcmFtZV9udW1fb2Zmc2V0ID0gaC0+ZnJhbWVfbnVtX29mZnNldDsKKyAgICAgICAgaC0+cHJldl9mcmFtZV9udW0gICAgICAgID0gaC0+ZnJhbWVfbnVtOworICAgICAgICBoLT5vdXRwdXRlZF9wb2MgICAgICAgICAgPSBoLT5uZXh0X291dHB1dGVkX3BvYzsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmh3YWNjZWwpIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5od2FjY2VsLT5lbmRfZnJhbWUoYXZjdHgpIDwgMCkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJoYXJkd2FyZSBhY2NlbGVyYXRvciBmYWlsZWQgdG8gZGVjb2RlIHBpY3R1cmVcbiIpOworICAgIH0KKworICAgIGlmIChDT05GSUdfSDI2NF9WRFBBVV9ERUNPREVSICYmCisgICAgICAgIGgtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpCisgICAgICAgIGZmX3ZkcGF1X2gyNjRfcGljdHVyZV9jb21wbGV0ZShoKTsKKworI2lmIENPTkZJR19FUlJPUl9SRVNJTElFTkNFCisgICAgLyoKKyAgICAgKiBGSVhNRTogRXJyb3IgaGFuZGxpbmcgY29kZSBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgaW50ZXJsYWNlZAorICAgICAqIHdoZW4gc2xpY2VzIHNwYW4gbXVsdGlwbGUgcm93cworICAgICAqIFRoZSBmZl9lcl9hZGRfc2xpY2UgY2FsbHMgZG9uJ3Qgd29yayByaWdodCBmb3IgYm90dG9tCisgICAgICogZmllbGRzOyB0aGV5IGNhdXNlIG1hc3NpdmUgZXJyb25lb3VzIGVycm9yIGNvbmNlYWxpbmcKKyAgICAgKiBFcnJvciBtYXJraW5nIGNvdmVycyBib3RoIGZpZWxkcyAodG9wIGFuZCBib3R0b20pLgorICAgICAqIFRoaXMgY2F1c2VzIGEgbWlzbWF0Y2hlZCBzLT5lcnJvcl9jb3VudAorICAgICAqIGFuZCBhIGJhZCBlcnJvciB0YWJsZS4gRnVydGhlciwgdGhlIGVycm9yIGNvdW50IGdvZXMgdG8KKyAgICAgKiBJTlRfTUFYIHdoZW4gY2FsbGVkIGZvciBib3R0b20gZmllbGQsIGJlY2F1c2UgbWJfeSBpcworICAgICAqIHBhc3QgZW5kIGJ5IG9uZSAoY2FsbGVycyBmYXVsdCkgYW5kIHJlc3luY19tYl95ICE9IDAKKyAgICAgKiBjYXVzZXMgcHJvYmxlbXMgZm9yIHRoZSBmaXJzdCBNQiBsaW5lLCB0b28uCisgICAgICovCisgICAgaWYgKCFGSUVMRF9QSUNUVVJFKGgpICYmIGgtPmN1cnJlbnRfc2xpY2UgJiYgIWgtPnNwcy5uZXcpIHsKKyAgICAgICAgZmZfaDI2NF9zZXRfZXJwaWMoJmgtPmVyLmN1cl9waWMsIGgtPmN1cl9waWNfcHRyKTsKKyAgICAgICAgZmZfZXJfZnJhbWVfZW5kKCZoLT5lcik7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19FUlJPUl9SRVNJTElFTkNFICovCisKKyAgICBpZiAoIWluX3NldHVwICYmICFoLT5kcm9wcGFibGUpCisgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJmgtPmN1cl9waWNfcHRyLT50ZiwgSU5UX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0JPVFRPTV9GSUVMRCk7CisgICAgZW1tc19jKCk7CisKKyAgICBoLT5jdXJyZW50X3NsaWNlID0gMDsKKworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X3BzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3MDQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfcHMuYwpAQCAtMCwwICsxLDcyMCBAQAorLyoKKyAqIEguMjZML0guMjY0L0FWQy9KVlQvMTQ0OTYtMTAvLi4uIHBhcmFtZXRlciBzZXQgZGVjb2RpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBwYXJhbWV0ZXIgc2V0IGRlY29kaW5nLgorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRkYXRhLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisKKyNkZWZpbmUgTUFYX0xPRzJfTUFYX0ZSQU1FX05VTSAgICAoMTIgKyA0KQorI2RlZmluZSBNSU5fTE9HMl9NQVhfRlJBTUVfTlVNICAgIDQKKworI2RlZmluZSBRUChxUCwgZGVwdGgpICgocVApICsgNiAqICgoZGVwdGgpIC0gOCkpCisKKyNkZWZpbmUgQ0hST01BX1FQX1RBQkxFX0VORChkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBRUCgwLCAgZCksIFFQKDEsICBkKSwgUVAoMiwgIGQpLCBRUCgzLCAgZCksIFFQKDQsICBkKSwgUVAoNSwgIGQpLCAgIFwKKyAgICBRUCg2LCAgZCksIFFQKDcsICBkKSwgUVAoOCwgIGQpLCBRUCg5LCAgZCksIFFQKDEwLCBkKSwgUVAoMTEsIGQpLCAgIFwKKyAgICBRUCgxMiwgZCksIFFQKDEzLCBkKSwgUVAoMTQsIGQpLCBRUCgxNSwgZCksIFFQKDE2LCBkKSwgUVAoMTcsIGQpLCAgIFwKKyAgICBRUCgxOCwgZCksIFFQKDE5LCBkKSwgUVAoMjAsIGQpLCBRUCgyMSwgZCksIFFQKDIyLCBkKSwgUVAoMjMsIGQpLCAgIFwKKyAgICBRUCgyNCwgZCksIFFQKDI1LCBkKSwgUVAoMjYsIGQpLCBRUCgyNywgZCksIFFQKDI4LCBkKSwgUVAoMjksIGQpLCAgIFwKKyAgICBRUCgyOSwgZCksIFFQKDMwLCBkKSwgUVAoMzEsIGQpLCBRUCgzMiwgZCksIFFQKDMyLCBkKSwgUVAoMzMsIGQpLCAgIFwKKyAgICBRUCgzNCwgZCksIFFQKDM0LCBkKSwgUVAoMzUsIGQpLCBRUCgzNSwgZCksIFFQKDM2LCBkKSwgUVAoMzYsIGQpLCAgIFwKKyAgICBRUCgzNywgZCksIFFQKDM3LCBkKSwgUVAoMzcsIGQpLCBRUCgzOCwgZCksIFFQKDM4LCBkKSwgUVAoMzgsIGQpLCAgIFwKKyAgICBRUCgzOSwgZCksIFFQKDM5LCBkKSwgUVAoMzksIGQpLCBRUCgzOSwgZCkKKworY29uc3QgdWludDhfdCBmZl9oMjY0X2Nocm9tYV9xcFs3XVtRUF9NQVhfTlVNICsgMV0gPSB7CisgICAgeyBDSFJPTUFfUVBfVEFCTEVfRU5EKDgpIH0sCisgICAgeyAwLCAxLCAyLCAzLCA0LCA1LAorICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCg5KSB9LAorICAgIHsgMCwgMSwgMiwgMywgIDQsICA1LAorICAgICAgNiwgNywgOCwgOSwgMTAsIDExLAorICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCgxMCkgfSwKKyAgICB7IDAsICAxLCAyLCAzLCAgNCwgIDUsCisgICAgICA2LCAgNywgOCwgOSwgMTAsIDExLAorICAgICAgMTIsMTMsMTQsMTUsIDE2LCAxNywKKyAgICAgIENIUk9NQV9RUF9UQUJMRV9FTkQoMTEpIH0sCisgICAgeyAwLCAgMSwgMiwgMywgIDQsICA1LAorICAgICAgNiwgIDcsIDgsIDksIDEwLCAxMSwKKyAgICAgIDEyLDEzLDE0LDE1LCAxNiwgMTcsCisgICAgICAxOCwxOSwyMCwyMSwgMjIsIDIzLAorICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCgxMikgfSwKKyAgICB7IDAsICAxLCAyLCAzLCAgNCwgIDUsCisgICAgICA2LCAgNywgOCwgOSwgMTAsIDExLAorICAgICAgMTIsMTMsMTQsMTUsIDE2LCAxNywKKyAgICAgIDE4LDE5LDIwLDIxLCAyMiwgMjMsCisgICAgICAyNCwyNSwyNiwyNywgMjgsIDI5LAorICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCgxMykgfSwKKyAgICB7IDAsICAxLCAyLCAzLCAgNCwgIDUsCisgICAgICA2LCAgNywgOCwgOSwgMTAsIDExLAorICAgICAgMTIsMTMsMTQsMTUsIDE2LCAxNywKKyAgICAgIDE4LDE5LDIwLDIxLCAyMiwgMjMsCisgICAgICAyNCwyNSwyNiwyNywgMjgsIDI5LAorICAgICAgMzAsMzEsMzIsMzMsIDM0LCAzNSwKKyAgICAgIENIUk9NQV9RUF9UQUJMRV9FTkQoMTQpIH0sCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkZWZhdWx0X3NjYWxpbmc0WzJdWzE2XSA9IHsKKyAgICB7ICA2LCAxMywgMjAsIDI4LCAxMywgMjAsIDI4LCAzMiwKKyAgICAgIDIwLCAyOCwgMzIsIDM3LCAyOCwgMzIsIDM3LCA0MiB9LAorICAgIHsgMTAsIDE0LCAyMCwgMjQsIDE0LCAyMCwgMjQsIDI3LAorICAgICAgMjAsIDI0LCAyNywgMzAsIDI0LCAyNywgMzAsIDM0IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRlZmF1bHRfc2NhbGluZzhbMl1bNjRdID0geworICAgIHsgIDYsIDEwLCAxMywgMTYsIDE4LCAyMywgMjUsIDI3LAorICAgICAgMTAsIDExLCAxNiwgMTgsIDIzLCAyNSwgMjcsIDI5LAorICAgICAgMTMsIDE2LCAxOCwgMjMsIDI1LCAyNywgMjksIDMxLAorICAgICAgMTYsIDE4LCAyMywgMjUsIDI3LCAyOSwgMzEsIDMzLAorICAgICAgMTgsIDIzLCAyNSwgMjcsIDI5LCAzMSwgMzMsIDM2LAorICAgICAgMjMsIDI1LCAyNywgMjksIDMxLCAzMywgMzYsIDM4LAorICAgICAgMjUsIDI3LCAyOSwgMzEsIDMzLCAzNiwgMzgsIDQwLAorICAgICAgMjcsIDI5LCAzMSwgMzMsIDM2LCAzOCwgNDAsIDQyIH0sCisgICAgeyAgOSwgMTMsIDE1LCAxNywgMTksIDIxLCAyMiwgMjQsCisgICAgICAxMywgMTMsIDE3LCAxOSwgMjEsIDIyLCAyNCwgMjUsCisgICAgICAxNSwgMTcsIDE5LCAyMSwgMjIsIDI0LCAyNSwgMjcsCisgICAgICAxNywgMTksIDIxLCAyMiwgMjQsIDI1LCAyNywgMjgsCisgICAgICAxOSwgMjEsIDIyLCAyNCwgMjUsIDI3LCAyOCwgMzAsCisgICAgICAyMSwgMjIsIDI0LCAyNSwgMjcsIDI4LCAzMCwgMzIsCisgICAgICAyMiwgMjQsIDI1LCAyNywgMjgsIDMwLCAzMiwgMzMsCisgICAgICAyNCwgMjUsIDI3LCAyOCwgMzAsIDMyLCAzMywgMzUgfQorfTsKKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX2hyZF9wYXJhbWV0ZXJzKEgyNjRDb250ZXh0ICpoLCBTUFMgKnNwcykKK3sKKyAgICBpbnQgY3BiX2NvdW50LCBpOworICAgIGNwYl9jb3VudCA9IGdldF91ZV9nb2xvbWJfMzEoJmgtPmdiKSArIDE7CisKKyAgICBpZiAoY3BiX2NvdW50ID4gMzJVKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY3BiX2NvdW50ICVkIGludmFsaWRcbiIsIGNwYl9jb3VudCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGdldF9iaXRzKCZoLT5nYiwgNCk7IC8qIGJpdF9yYXRlX3NjYWxlICovCisgICAgZ2V0X2JpdHMoJmgtPmdiLCA0KTsgLyogY3BiX3NpemVfc2NhbGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY3BiX2NvdW50OyBpKyspIHsKKyAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKCZoLT5nYik7IC8qIGJpdF9yYXRlX3ZhbHVlX21pbnVzMSAqLworICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoJmgtPmdiKTsgLyogY3BiX3NpemVfdmFsdWVfbWludXMxICovCisgICAgICAgIGdldF9iaXRzMSgmaC0+Z2IpOyAgICAgICAgICAvKiBjYnJfZmxhZyAqLworICAgIH0KKyAgICBzcHMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoID0gZ2V0X2JpdHMoJmgtPmdiLCA1KSArIDE7CisgICAgc3BzLT5jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGggICAgICAgICA9IGdldF9iaXRzKCZoLT5nYiwgNSkgKyAxOworICAgIHNwcy0+ZHBiX291dHB1dF9kZWxheV9sZW5ndGggICAgICAgICAgPSBnZXRfYml0cygmaC0+Z2IsIDUpICsgMTsKKyAgICBzcHMtPnRpbWVfb2Zmc2V0X2xlbmd0aCAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoJmgtPmdiLCA1KTsKKyAgICBzcHMtPmNwYl9jbnQgICAgICAgICAgICAgICAgICAgICAgICAgID0gY3BiX2NvdW50OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfdnVpX3BhcmFtZXRlcnMoSDI2NENvbnRleHQgKmgsIFNQUyAqc3BzKQoreworICAgIGludCBhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWc7CisgICAgdW5zaWduZWQgaW50IGFzcGVjdF9yYXRpb19pZGM7CisKKyAgICBhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoJmgtPmdiKTsKKworICAgIGlmIChhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgYXNwZWN0X3JhdGlvX2lkYyA9IGdldF9iaXRzKCZoLT5nYiwgOCk7CisgICAgICAgIGlmIChhc3BlY3RfcmF0aW9faWRjID09IEVYVEVOREVEX1NBUikgeworICAgICAgICAgICAgc3BzLT5zYXIubnVtID0gZ2V0X2JpdHMoJmgtPmdiLCAxNik7CisgICAgICAgICAgICBzcHMtPnNhci5kZW4gPSBnZXRfYml0cygmaC0+Z2IsIDE2KTsKKyAgICAgICAgfSBlbHNlIGlmIChhc3BlY3RfcmF0aW9faWRjIDwgRkZfQVJSQVlfRUxFTVMoZmZfaDI2NF9waXhlbF9hc3BlY3QpKSB7CisgICAgICAgICAgICBzcHMtPnNhciA9IGZmX2gyNjRfcGl4ZWxfYXNwZWN0W2FzcGVjdF9yYXRpb19pZGNdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIGFzcGVjdCByYXRpb1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNwcy0+c2FyLm51bSA9CisgICAgICAgIHNwcy0+c2FyLmRlbiA9IDA7CisgICAgfQorCisgICAgaWYgKGdldF9iaXRzMSgmaC0+Z2IpKSAgICAgIC8qIG92ZXJzY2FuX2luZm9fcHJlc2VudF9mbGFnICovCisgICAgICAgIGdldF9iaXRzMSgmaC0+Z2IpOyAgICAgIC8qIG92ZXJzY2FuX2FwcHJvcHJpYXRlX2ZsYWcgKi8KKworICAgIHNwcy0+dmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgaWYgKHNwcy0+dmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnKSB7CisgICAgICAgIGdldF9iaXRzKCZoLT5nYiwgMyk7ICAgICAgICAgICAgICAgICAvKiB2aWRlb19mb3JtYXQgKi8KKyAgICAgICAgc3BzLT5mdWxsX3JhbmdlID0gZ2V0X2JpdHMxKCZoLT5nYik7IC8qIHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyAqLworCisgICAgICAgIHNwcy0+Y29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgICAgICBpZiAoc3BzLT5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnKSB7CisgICAgICAgICAgICBzcHMtPmNvbG9yX3ByaW1hcmllcyA9IGdldF9iaXRzKCZoLT5nYiwgOCk7IC8qIGNvbG91cl9wcmltYXJpZXMgKi8KKyAgICAgICAgICAgIHNwcy0+Y29sb3JfdHJjICAgICAgID0gZ2V0X2JpdHMoJmgtPmdiLCA4KTsgLyogdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzICovCisgICAgICAgICAgICBzcHMtPmNvbG9yc3BhY2UgICAgICA9IGdldF9iaXRzKCZoLT5nYiwgOCk7IC8qIG1hdHJpeF9jb2VmZmljaWVudHMgKi8KKyAgICAgICAgICAgIGlmIChzcHMtPmNvbG9yX3ByaW1hcmllcyA+PSBBVkNPTF9QUklfTkIpCisgICAgICAgICAgICAgICAgc3BzLT5jb2xvcl9wcmltYXJpZXMgPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQ7CisgICAgICAgICAgICBpZiAoc3BzLT5jb2xvcl90cmMgPj0gQVZDT0xfVFJDX05CKQorICAgICAgICAgICAgICAgIHNwcy0+Y29sb3JfdHJjID0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEOworICAgICAgICAgICAgaWYgKHNwcy0+Y29sb3JzcGFjZSA+PSBBVkNPTF9TUENfTkIpCisgICAgICAgICAgICAgICAgc3BzLT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2hyb21hX2xvY2F0aW9uX2luZm9fcHJlc2VudF9mbGFnICovCisgICAgaWYgKGdldF9iaXRzMSgmaC0+Z2IpKSB7CisgICAgICAgIC8qIGNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZV90b3BfZmllbGQgKi8KKyAgICAgICAgaC0+YXZjdHgtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24gPSBnZXRfdWVfZ29sb21iKCZoLT5nYikgKyAxOworICAgICAgICBnZXRfdWVfZ29sb21iKCZoLT5nYik7ICAvKiBjaHJvbWFfc2FtcGxlX2xvY2F0aW9uX3R5cGVfYm90dG9tX2ZpZWxkICovCisgICAgfQorCisgICAgaWYgKHNob3dfYml0czEoJmgtPmdiKSAmJiBnZXRfYml0c19sZWZ0KCZoLT5nYikgPCAxMCkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVHJ1bmNhdGVkIFZVSVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHNwcy0+dGltaW5nX2luZm9fcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgaWYgKHNwcy0+dGltaW5nX2luZm9fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIHNwcy0+bnVtX3VuaXRzX2luX3RpY2sgPSBnZXRfYml0c19sb25nKCZoLT5nYiwgMzIpOworICAgICAgICBzcHMtPnRpbWVfc2NhbGUgICAgICAgID0gZ2V0X2JpdHNfbG9uZygmaC0+Z2IsIDMyKTsKKyAgICAgICAgaWYgKCFzcHMtPm51bV91bml0c19pbl90aWNrIHx8ICFzcHMtPnRpbWVfc2NhbGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJ0aW1lX3NjYWxlL251bV91bml0c19pbl90aWNrIGludmFsaWQgb3IgdW5zdXBwb3J0ZWQgKCUiUFJJdTMyIi8lIlBSSXUzMiIpXG4iLAorICAgICAgICAgICAgICAgICAgIHNwcy0+dGltZV9zY2FsZSwgc3BzLT5udW1fdW5pdHNfaW5fdGljayk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBzcHMtPmZpeGVkX2ZyYW1lX3JhdGVfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIH0KKworICAgIHNwcy0+bmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIGlmIChzcHMtPm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgIGlmIChkZWNvZGVfaHJkX3BhcmFtZXRlcnMoaCwgc3BzKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBzcHMtPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICBpZiAoc3BzLT52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQorICAgICAgICBpZiAoZGVjb2RlX2hyZF9wYXJhbWV0ZXJzKGgsIHNwcykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKHNwcy0+bmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyB8fAorICAgICAgICBzcHMtPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgIGdldF9iaXRzMSgmaC0+Z2IpOyAgICAgLyogbG93X2RlbGF5X2hyZF9mbGFnICovCisgICAgc3BzLT5waWNfc3RydWN0X3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIGlmICghZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzcHMtPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgaWYgKHNwcy0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcpIHsKKyAgICAgICAgZ2V0X2JpdHMxKCZoLT5nYik7ICAgICAvKiBtb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWcgKi8KKyAgICAgICAgZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOyAvKiBtYXhfYnl0ZXNfcGVyX3BpY19kZW5vbSAqLworICAgICAgICBnZXRfdWVfZ29sb21iKCZoLT5nYik7IC8qIG1heF9iaXRzX3Blcl9tYl9kZW5vbSAqLworICAgICAgICBnZXRfdWVfZ29sb21iKCZoLT5nYik7IC8qIGxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsICovCisgICAgICAgIGdldF91ZV9nb2xvbWIoJmgtPmdiKTsgLyogbG9nMl9tYXhfbXZfbGVuZ3RoX3ZlcnRpY2FsICovCisgICAgICAgIHNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICBnZXRfdWVfZ29sb21iKCZoLT5nYik7IC8qbWF4X2RlY19mcmFtZV9idWZmZXJpbmcqLworCisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZoLT5nYikgPCAwKSB7CisgICAgICAgICAgICBzcHMtPm51bV9yZW9yZGVyX2ZyYW1lcyAgICAgICAgID0gMDsKKyAgICAgICAgICAgIHNwcy0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzID4gMTZVCisgICAgICAgICAgICAvKiBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyB8fCBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyA+IDE2ICovKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ2xpcHBpbmcgaWxsZWdhbCBudW1fcmVvcmRlcl9mcmFtZXMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMpOworICAgICAgICAgICAgc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMgPSAxNjsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdldF9iaXRzX2xlZnQoJmgtPmdiKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiT3ZlcnJlYWQgVlVJIGJ5ICVkIGJpdHNcbiIsIC1nZXRfYml0c19sZWZ0KCZoLT5nYikpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3NjYWxpbmdfbGlzdChIMjY0Q29udGV4dCAqaCwgdWludDhfdCAqZmFjdG9ycywgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmp2dF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmYWxsYmFja19saXN0KQoreworICAgIGludCBpLCBsYXN0ID0gOCwgbmV4dCA9IDg7CisgICAgY29uc3QgdWludDhfdCAqc2NhbiA9IHNpemUgPT0gMTYgPyB6aWd6YWdfc2NhbiA6IGZmX3ppZ3phZ19kaXJlY3Q7CisgICAgaWYgKCFnZXRfYml0czEoJmgtPmdiKSkgLyogbWF0cml4IG5vdCB3cml0dGVuLCB3ZSB1c2UgdGhlIHByZWRpY3RlZCBvbmUgKi8KKyAgICAgICAgbWVtY3B5KGZhY3RvcnMsIGZhbGxiYWNrX2xpc3QsIHNpemUgKiBzaXplb2YodWludDhfdCkpOworICAgIGVsc2UKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgaWYgKG5leHQpCisgICAgICAgICAgICAgICAgbmV4dCA9IChsYXN0ICsgZ2V0X3NlX2dvbG9tYigmaC0+Z2IpKSAmIDB4ZmY7CisgICAgICAgICAgICBpZiAoIWkgJiYgIW5leHQpIHsgLyogbWF0cml4IG5vdCB3cml0dGVuLCB3ZSB1c2UgdGhlIHByZXNldCBvbmUgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoZmFjdG9ycywganZ0X2xpc3QsIHNpemUgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdCA9IGZhY3RvcnNbc2NhbltpXV0gPSBuZXh0ID8gbmV4dCA6IGxhc3Q7CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3NjYWxpbmdfbWF0cmljZXMoSDI2NENvbnRleHQgKmgsIFNQUyAqc3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBTICpwcHMsIGludCBpc19zcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KCpzY2FsaW5nX21hdHJpeDQpWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QoKnNjYWxpbmdfbWF0cml4OClbNjRdKQoreworICAgIGludCBmYWxsYmFja19zcHMgPSAhaXNfc3BzICYmIHNwcy0+c2NhbGluZ19tYXRyaXhfcHJlc2VudDsKKyAgICBjb25zdCB1aW50OF90ICpmYWxsYmFja1s0XSA9IHsKKyAgICAgICAgZmFsbGJhY2tfc3BzID8gc3BzLT5zY2FsaW5nX21hdHJpeDRbMF0gOiBkZWZhdWx0X3NjYWxpbmc0WzBdLAorICAgICAgICBmYWxsYmFja19zcHMgPyBzcHMtPnNjYWxpbmdfbWF0cml4NFszXSA6IGRlZmF1bHRfc2NhbGluZzRbMV0sCisgICAgICAgIGZhbGxiYWNrX3NwcyA/IHNwcy0+c2NhbGluZ19tYXRyaXg4WzBdIDogZGVmYXVsdF9zY2FsaW5nOFswXSwKKyAgICAgICAgZmFsbGJhY2tfc3BzID8gc3BzLT5zY2FsaW5nX21hdHJpeDhbM10gOiBkZWZhdWx0X3NjYWxpbmc4WzFdCisgICAgfTsKKyAgICBpZiAoZ2V0X2JpdHMxKCZoLT5nYikpIHsKKyAgICAgICAgc3BzLT5zY2FsaW5nX21hdHJpeF9wcmVzZW50IHw9IGlzX3NwczsKKyAgICAgICAgZGVjb2RlX3NjYWxpbmdfbGlzdChoLCBzY2FsaW5nX21hdHJpeDRbMF0sIDE2LCBkZWZhdWx0X3NjYWxpbmc0WzBdLCBmYWxsYmFja1swXSk7ICAgICAgICAvLyBJbnRyYSwgWQorICAgICAgICBkZWNvZGVfc2NhbGluZ19saXN0KGgsIHNjYWxpbmdfbWF0cml4NFsxXSwgMTYsIGRlZmF1bHRfc2NhbGluZzRbMF0sIHNjYWxpbmdfbWF0cml4NFswXSk7IC8vIEludHJhLCBDcgorICAgICAgICBkZWNvZGVfc2NhbGluZ19saXN0KGgsIHNjYWxpbmdfbWF0cml4NFsyXSwgMTYsIGRlZmF1bHRfc2NhbGluZzRbMF0sIHNjYWxpbmdfbWF0cml4NFsxXSk7IC8vIEludHJhLCBDYgorICAgICAgICBkZWNvZGVfc2NhbGluZ19saXN0KGgsIHNjYWxpbmdfbWF0cml4NFszXSwgMTYsIGRlZmF1bHRfc2NhbGluZzRbMV0sIGZhbGxiYWNrWzFdKTsgICAgICAgIC8vIEludGVyLCBZCisgICAgICAgIGRlY29kZV9zY2FsaW5nX2xpc3QoaCwgc2NhbGluZ19tYXRyaXg0WzRdLCAxNiwgZGVmYXVsdF9zY2FsaW5nNFsxXSwgc2NhbGluZ19tYXRyaXg0WzNdKTsgLy8gSW50ZXIsIENyCisgICAgICAgIGRlY29kZV9zY2FsaW5nX2xpc3QoaCwgc2NhbGluZ19tYXRyaXg0WzVdLCAxNiwgZGVmYXVsdF9zY2FsaW5nNFsxXSwgc2NhbGluZ19tYXRyaXg0WzRdKTsgLy8gSW50ZXIsIENiCisgICAgICAgIGlmIChpc19zcHMgfHwgcHBzLT50cmFuc2Zvcm1fOHg4X21vZGUpIHsKKyAgICAgICAgICAgIGRlY29kZV9zY2FsaW5nX2xpc3QoaCwgc2NhbGluZ19tYXRyaXg4WzBdLCA2NCwgZGVmYXVsdF9zY2FsaW5nOFswXSwgZmFsbGJhY2tbMl0pOyAvLyBJbnRyYSwgWQorICAgICAgICAgICAgZGVjb2RlX3NjYWxpbmdfbGlzdChoLCBzY2FsaW5nX21hdHJpeDhbM10sIDY0LCBkZWZhdWx0X3NjYWxpbmc4WzFdLCBmYWxsYmFja1szXSk7IC8vIEludGVyLCBZCisgICAgICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSB7CisgICAgICAgICAgICAgICAgZGVjb2RlX3NjYWxpbmdfbGlzdChoLCBzY2FsaW5nX21hdHJpeDhbMV0sIDY0LCBkZWZhdWx0X3NjYWxpbmc4WzBdLCBzY2FsaW5nX21hdHJpeDhbMF0pOyAvLyBJbnRyYSwgQ3IKKyAgICAgICAgICAgICAgICBkZWNvZGVfc2NhbGluZ19saXN0KGgsIHNjYWxpbmdfbWF0cml4OFs0XSwgNjQsIGRlZmF1bHRfc2NhbGluZzhbMV0sIHNjYWxpbmdfbWF0cml4OFszXSk7IC8vIEludGVyLCBDcgorICAgICAgICAgICAgICAgIGRlY29kZV9zY2FsaW5nX2xpc3QoaCwgc2NhbGluZ19tYXRyaXg4WzJdLCA2NCwgZGVmYXVsdF9zY2FsaW5nOFswXSwgc2NhbGluZ19tYXRyaXg4WzFdKTsgLy8gSW50cmEsIENiCisgICAgICAgICAgICAgICAgZGVjb2RlX3NjYWxpbmdfbGlzdChoLCBzY2FsaW5nX21hdHJpeDhbNV0sIDY0LCBkZWZhdWx0X3NjYWxpbmc4WzFdLCBzY2FsaW5nX21hdHJpeDhbNF0pOyAvLyBJbnRlciwgQ2IKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGZmX2gyNjRfZGVjb2RlX3NlcV9wYXJhbWV0ZXJfc2V0KEgyNjRDb250ZXh0ICpoKQoreworICAgIGludCBwcm9maWxlX2lkYywgbGV2ZWxfaWRjLCBjb25zdHJhaW50X3NldF9mbGFncyA9IDA7CisgICAgdW5zaWduZWQgaW50IHNwc19pZDsKKyAgICBpbnQgaSwgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKKyAgICBTUFMgKnNwczsKKworICAgIHByb2ZpbGVfaWRjICAgICAgICAgICA9IGdldF9iaXRzKCZoLT5nYiwgOCk7CisgICAgY29uc3RyYWludF9zZXRfZmxhZ3MgfD0gZ2V0X2JpdHMxKCZoLT5nYikgPDwgMDsgICAvLyBjb25zdHJhaW50X3NldDBfZmxhZworICAgIGNvbnN0cmFpbnRfc2V0X2ZsYWdzIHw9IGdldF9iaXRzMSgmaC0+Z2IpIDw8IDE7ICAgLy8gY29uc3RyYWludF9zZXQxX2ZsYWcKKyAgICBjb25zdHJhaW50X3NldF9mbGFncyB8PSBnZXRfYml0czEoJmgtPmdiKSA8PCAyOyAgIC8vIGNvbnN0cmFpbnRfc2V0Ml9mbGFnCisgICAgY29uc3RyYWludF9zZXRfZmxhZ3MgfD0gZ2V0X2JpdHMxKCZoLT5nYikgPDwgMzsgICAvLyBjb25zdHJhaW50X3NldDNfZmxhZworICAgIGNvbnN0cmFpbnRfc2V0X2ZsYWdzIHw9IGdldF9iaXRzMSgmaC0+Z2IpIDw8IDQ7ICAgLy8gY29uc3RyYWludF9zZXQ0X2ZsYWcKKyAgICBjb25zdHJhaW50X3NldF9mbGFncyB8PSBnZXRfYml0czEoJmgtPmdiKSA8PCA1OyAgIC8vIGNvbnN0cmFpbnRfc2V0NV9mbGFnCisgICAgc2tpcF9iaXRzKCZoLT5nYiwgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNlcnZlZF96ZXJvXzJiaXRzCisgICAgbGV2ZWxfaWRjID0gZ2V0X2JpdHMoJmgtPmdiLCA4KTsKKyAgICBzcHNfaWQgICAgPSBnZXRfdWVfZ29sb21iXzMxKCZoLT5nYik7CisKKyAgICBpZiAoc3BzX2lkID49IE1BWF9TUFNfQ09VTlQpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzcHNfaWQgJXUgb3V0IG9mIHJhbmdlXG4iLCBzcHNfaWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgc3BzID0gYXZfbWFsbG9jeihzaXplb2YoU1BTKSk7CisgICAgaWYgKCFzcHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzcHMtPnNwc19pZCAgICAgICAgICAgICAgID0gc3BzX2lkOworICAgIHNwcy0+dGltZV9vZmZzZXRfbGVuZ3RoICAgPSAyNDsKKyAgICBzcHMtPnByb2ZpbGVfaWRjICAgICAgICAgID0gcHJvZmlsZV9pZGM7CisgICAgc3BzLT5jb25zdHJhaW50X3NldF9mbGFncyA9IGNvbnN0cmFpbnRfc2V0X2ZsYWdzOworICAgIHNwcy0+bGV2ZWxfaWRjICAgICAgICAgICAgPSBsZXZlbF9pZGM7CisgICAgc3BzLT5mdWxsX3JhbmdlICAgICAgICAgICA9IC0xOworCisgICAgbWVtc2V0KHNwcy0+c2NhbGluZ19tYXRyaXg0LCAxNiwgc2l6ZW9mKHNwcy0+c2NhbGluZ19tYXRyaXg0KSk7CisgICAgbWVtc2V0KHNwcy0+c2NhbGluZ19tYXRyaXg4LCAxNiwgc2l6ZW9mKHNwcy0+c2NhbGluZ19tYXRyaXg4KSk7CisgICAgc3BzLT5zY2FsaW5nX21hdHJpeF9wcmVzZW50ID0gMDsKKyAgICBzcHMtPmNvbG9yc3BhY2UgPSAyOyAvL0FWQ09MX1NQQ19VTlNQRUNJRklFRAorCisgICAgaWYgKHNwcy0+cHJvZmlsZV9pZGMgPT0gMTAwIHx8ICAvLyBIaWdoIHByb2ZpbGUKKyAgICAgICAgc3BzLT5wcm9maWxlX2lkYyA9PSAxMTAgfHwgIC8vIEhpZ2gxMCBwcm9maWxlCisgICAgICAgIHNwcy0+cHJvZmlsZV9pZGMgPT0gMTIyIHx8ICAvLyBIaWdoNDIyIHByb2ZpbGUKKyAgICAgICAgc3BzLT5wcm9maWxlX2lkYyA9PSAyNDQgfHwgIC8vIEhpZ2g0NDQgUHJlZGljdGl2ZSBwcm9maWxlCisgICAgICAgIHNwcy0+cHJvZmlsZV9pZGMgPT0gIDQ0IHx8ICAvLyBDYXZsYzQ0NCBwcm9maWxlCisgICAgICAgIHNwcy0+cHJvZmlsZV9pZGMgPT0gIDgzIHx8ICAvLyBTY2FsYWJsZSBDb25zdHJhaW5lZCBIaWdoIHByb2ZpbGUgKFNWQykKKyAgICAgICAgc3BzLT5wcm9maWxlX2lkYyA9PSAgODYgfHwgIC8vIFNjYWxhYmxlIEhpZ2ggSW50cmEgcHJvZmlsZSAoU1ZDKQorICAgICAgICBzcHMtPnByb2ZpbGVfaWRjID09IDExOCB8fCAgLy8gU3RlcmVvIEhpZ2ggcHJvZmlsZSAoTVZDKQorICAgICAgICBzcHMtPnByb2ZpbGVfaWRjID09IDEyOCB8fCAgLy8gTXVsdGl2aWV3IEhpZ2ggcHJvZmlsZSAoTVZDKQorICAgICAgICBzcHMtPnByb2ZpbGVfaWRjID09IDEzOCB8fCAgLy8gTXVsdGl2aWV3IERlcHRoIEhpZ2ggcHJvZmlsZSAoTVZDRCkKKyAgICAgICAgc3BzLT5wcm9maWxlX2lkYyA9PSAxNDQpIHsgIC8vIG9sZCBIaWdoNDQ0IHByb2ZpbGUKKyAgICAgICAgc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9IGdldF91ZV9nb2xvbWJfMzEoJmgtPmdiKTsKKyAgICAgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPiAzVSkgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGgtPmF2Y3R4LCAiY2hyb21hX2Zvcm1hdF9pZGMgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9IGVsc2UgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgeworICAgICAgICAgICAgc3BzLT5yZXNpZHVhbF9jb2xvcl90cmFuc2Zvcm1fZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgICAgICAgICAgaWYgKHNwcy0+cmVzaWR1YWxfY29sb3JfdHJhbnNmb3JtX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInNlcGFyYXRlIGNvbG9yIHBsYW5lcyBhcmUgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNwcy0+Yml0X2RlcHRoX2x1bWEgICA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKSArIDg7CisgICAgICAgIHNwcy0+Yml0X2RlcHRoX2Nocm9tYSA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKSArIDg7CisgICAgICAgIGlmIChzcHMtPmJpdF9kZXB0aF9jaHJvbWEgIT0gc3BzLT5iaXRfZGVwdGhfbHVtYSkgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGgtPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWZmZXJlbnQgY2hyb21hIGFuZCBsdW1hIGJpdCBkZXB0aCIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmIChzcHMtPmJpdF9kZXB0aF9sdW1hID4gMTRVIHx8IHNwcy0+Yml0X2RlcHRoX2Nocm9tYSA+IDE0VSkgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIGJpdCBkZXB0aCB2YWx1ZSAoJWQsICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBzcHMtPmJpdF9kZXB0aF9sdW1hLCBzcHMtPmJpdF9kZXB0aF9jaHJvbWEpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHNwcy0+dHJhbnNmb3JtX2J5cGFzcyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgICAgICBkZWNvZGVfc2NhbGluZ19tYXRyaWNlcyhoLCBzcHMsIE5VTEwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcy0+c2NhbGluZ19tYXRyaXg0LCBzcHMtPnNjYWxpbmdfbWF0cml4OCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9IDE7CisgICAgICAgIHNwcy0+Yml0X2RlcHRoX2x1bWEgICAgPSA4OworICAgICAgICBzcHMtPmJpdF9kZXB0aF9jaHJvbWEgID0gODsKKyAgICB9CisKKyAgICBsb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgIGlmIChsb2cyX21heF9mcmFtZV9udW1fbWludXM0IDwgTUlOX0xPRzJfTUFYX0ZSQU1FX05VTSAtIDQgfHwKKyAgICAgICAgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA+IE1BWF9MT0cyX01BWF9GUkFNRV9OVU0gLSA0KSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgb3V0IG9mIHJhbmdlICgwLTEyKTogJWRcbiIsCisgICAgICAgICAgICAgICBsb2cyX21heF9mcmFtZV9udW1fbWludXM0KTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzcHMtPmxvZzJfbWF4X2ZyYW1lX251bSA9IGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0OworCisgICAgc3BzLT5wb2NfdHlwZSA9IGdldF91ZV9nb2xvbWJfMzEoJmgtPmdiKTsKKworICAgIGlmIChzcHMtPnBvY190eXBlID09IDApIHsgLy8gRklYTUUgI2RlZmluZQorICAgICAgICB1bnNpZ25lZCB0ID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICBpZiAodD4xMikgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJsb2cyX21heF9wb2NfbHNiICglZCkgaXMgb3V0IG9mIHJhbmdlXG4iLCB0KTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBzcHMtPmxvZzJfbWF4X3BvY19sc2IgPSB0ICsgNDsKKyAgICB9IGVsc2UgaWYgKHNwcy0+cG9jX3R5cGUgPT0gMSkgeyAvLyBGSVhNRSAjZGVmaW5lCisgICAgICAgIHNwcy0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICAgICAgc3BzLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljICAgICAgICAgICA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgc3BzLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgICA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgc3BzLT5wb2NfY3ljbGVfbGVuZ3RoICAgICAgICAgICAgICAgICA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKTsKKworICAgICAgICBpZiAoKHVuc2lnbmVkKXNwcy0+cG9jX2N5Y2xlX2xlbmd0aCA+PQorICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMoc3BzLT5vZmZzZXRfZm9yX3JlZl9mcmFtZSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJwb2NfY3ljbGVfbGVuZ3RoIG92ZXJmbG93ICVkXG4iLCBzcHMtPnBvY19jeWNsZV9sZW5ndGgpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwcy0+cG9jX2N5Y2xlX2xlbmd0aDsgaSsrKQorICAgICAgICAgICAgc3BzLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXSA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICB9IGVsc2UgaWYgKHNwcy0+cG9jX3R5cGUgIT0gMikgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgUE9DIHR5cGUgJWRcbiIsIHNwcy0+cG9jX3R5cGUpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgc3BzLT5yZWZfZnJhbWVfY291bnQgPSBnZXRfdWVfZ29sb21iXzMxKCZoLT5nYik7CisgICAgaWYgKGgtPmF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ1MnLCAnTScsICdWJywgJzInKSkKKyAgICAgICAgc3BzLT5yZWZfZnJhbWVfY291bnQgPSBGRk1BWCgyLCBzcHMtPnJlZl9mcmFtZV9jb3VudCk7CisgICAgaWYgKHNwcy0+cmVmX2ZyYW1lX2NvdW50ID4gSDI2NF9NQVhfUElDVFVSRV9DT1VOVCAtIDIgfHwKKyAgICAgICAgc3BzLT5yZWZfZnJhbWVfY291bnQgPiAxNlUpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAidG9vIG1hbnkgcmVmZXJlbmNlIGZyYW1lcyAlZFxuIiwgc3BzLT5yZWZfZnJhbWVfY291bnQpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHNwcy0+Z2Fwc19pbl9mcmFtZV9udW1fYWxsb3dlZF9mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgc3BzLT5tYl93aWR0aCAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRfdWVfZ29sb21iKCZoLT5nYikgKyAxOworICAgIHNwcy0+bWJfaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpICsgMTsKKyAgICBpZiAoKHVuc2lnbmVkKXNwcy0+bWJfd2lkdGggID49IElOVF9NQVggLyAxNiB8fAorICAgICAgICAodW5zaWduZWQpc3BzLT5tYl9oZWlnaHQgPj0gSU5UX01BWCAvIDE2IHx8CisgICAgICAgIGF2X2ltYWdlX2NoZWNrX3NpemUoMTYgKiBzcHMtPm1iX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICogc3BzLT5tYl9oZWlnaHQsIDAsIGgtPmF2Y3R4KSkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1iX3dpZHRoL2hlaWdodCBvdmVyZmxvd1xuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICBpZiAoIXNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZykKKyAgICAgICAgc3BzLT5tYl9hZmYgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICBlbHNlCisgICAgICAgIHNwcy0+bWJfYWZmID0gMDsKKworICAgIHNwcy0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworCisjaWZuZGVmIEFMTE9XX0lOVEVSTEFDRQorICAgIGlmIChzcHMtPm1iX2FmZikKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTUJBRkYgc3VwcG9ydCBub3QgaW5jbHVkZWQ7IGVuYWJsZSBpdCBhdCBjb21waWxlLXRpbWUuXG4iKTsKKyNlbmRpZgorICAgIHNwcy0+Y3JvcCA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIGlmIChzcHMtPmNyb3ApIHsKKyAgICAgICAgaW50IGNyb3BfbGVmdCAgID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICBpbnQgY3JvcF9yaWdodCAgPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7CisgICAgICAgIGludCBjcm9wX3RvcCAgICA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgaW50IGNyb3BfYm90dG9tID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICBpbnQgd2lkdGggID0gMTYgKiBzcHMtPm1iX3dpZHRoOworICAgICAgICBpbnQgaGVpZ2h0ID0gMTYgKiBzcHMtPm1iX2hlaWdodCAqICgyIC0gc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnKTsKKworICAgICAgICBpZiAoaC0+YXZjdHgtPmZsYWdzMiAmIENPREVDX0ZMQUcyX0lHTk9SRV9DUk9QKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgImRpc2NhcmRpbmcgc3BzIGNyb3BwaW5nLCBvcmlnaW5hbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlcyBhcmUgbDolZCByOiVkIHQ6JWQgYjolZFxuIiwKKyAgICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfcmlnaHQsIGNyb3BfdG9wLCBjcm9wX2JvdHRvbSk7CisKKyAgICAgICAgICAgIHNwcy0+Y3JvcF9sZWZ0ICAgPQorICAgICAgICAgICAgc3BzLT5jcm9wX3JpZ2h0ICA9CisgICAgICAgICAgICBzcHMtPmNyb3BfdG9wICAgID0KKyAgICAgICAgICAgIHNwcy0+Y3JvcF9ib3R0b20gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHZzdWIgICA9IChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDEpID8gMSA6IDA7CisgICAgICAgICAgICBpbnQgaHN1YiAgID0gKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIpID8gMSA6IDA7CisgICAgICAgICAgICBpbnQgc3RlcF94ID0gMSA8PCBoc3ViOworICAgICAgICAgICAgaW50IHN0ZXBfeSA9ICgyIC0gc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnKSA8PCB2c3ViOworCisgICAgICAgICAgICBpZiAoY3JvcF9sZWZ0ICYgKDB4MUYgPj4gKHNwcy0+Yml0X2RlcHRoX2x1bWEgPiA4KSkgJiYKKyAgICAgICAgICAgICAgICAhKGgtPmF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfVU5BTElHTkVEKSkgeworICAgICAgICAgICAgICAgIGNyb3BfbGVmdCAmPSB+KDB4MUYgPj4gKHNwcy0+Yml0X2RlcHRoX2x1bWEgPiA4KSk7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIlJlZHVjaW5nIGxlZnQgY3JvcHBpbmcgdG8gJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAiY2hyb21hIHNhbXBsZXMgdG8gcHJlc2VydmUgYWxpZ25tZW50LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNyb3BfbGVmdCAgPiAodW5zaWduZWQpSU5UX01BWCAvIDQgLyBzdGVwX3ggfHwKKyAgICAgICAgICAgICAgICBjcm9wX3JpZ2h0ID4gKHVuc2lnbmVkKUlOVF9NQVggLyA0IC8gc3RlcF94IHx8CisgICAgICAgICAgICAgICAgY3JvcF90b3AgICA+ICh1bnNpZ25lZClJTlRfTUFYIC8gNCAvIHN0ZXBfeSB8fAorICAgICAgICAgICAgICAgIGNyb3BfYm90dG9tPiAodW5zaWduZWQpSU5UX01BWCAvIDQgLyBzdGVwX3kgfHwKKyAgICAgICAgICAgICAgICAoY3JvcF9sZWZ0ICsgY3JvcF9yaWdodCApICogc3RlcF94ID49IHdpZHRoIHx8CisgICAgICAgICAgICAgICAgKGNyb3BfdG9wICArIGNyb3BfYm90dG9tKSAqIHN0ZXBfeSA+PSBoZWlnaHQKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY3JvcCB2YWx1ZXMgaW52YWxpZCAlZCAlZCAlZCAlZCAvICVkICVkXG4iLCBjcm9wX2xlZnQsIGNyb3BfcmlnaHQsIGNyb3BfdG9wLCBjcm9wX2JvdHRvbSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcHMtPmNyb3BfbGVmdCAgID0gY3JvcF9sZWZ0ICAgKiBzdGVwX3g7CisgICAgICAgICAgICBzcHMtPmNyb3BfcmlnaHQgID0gY3JvcF9yaWdodCAgKiBzdGVwX3g7CisgICAgICAgICAgICBzcHMtPmNyb3BfdG9wICAgID0gY3JvcF90b3AgICAgKiBzdGVwX3k7CisgICAgICAgICAgICBzcHMtPmNyb3BfYm90dG9tID0gY3JvcF9ib3R0b20gKiBzdGVwX3k7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzcHMtPmNyb3BfbGVmdCAgID0KKyAgICAgICAgc3BzLT5jcm9wX3JpZ2h0ICA9CisgICAgICAgIHNwcy0+Y3JvcF90b3AgICAgPQorICAgICAgICBzcHMtPmNyb3BfYm90dG9tID0KKyAgICAgICAgc3BzLT5jcm9wICAgICAgICA9IDA7CisgICAgfQorCisgICAgc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICBpZiAoc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgaW50IHJldCA9IGRlY29kZV92dWlfcGFyYW1ldGVycyhoLCBzcHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoIXNwcy0+c2FyLmRlbikKKyAgICAgICAgc3BzLT5zYXIuZGVuID0gMTsKKworICAgIGlmIChoLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY3NwWzRdWzVdID0geyAiR3JheSIsICI0MjAiLCAiNDIyIiwgIjQ0NCIgfTsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAic3BzOiV1IHByb2ZpbGU6JWQvJWQgcG9jOiVkIHJlZjolZCAlZHglZCAlcyAlcyBjcm9wOiV1LyV1LyV1LyV1ICVzICVzICUiUFJJZDMyIi8lIlBSSWQzMiIgYiVkIHJlbzolZFxuIiwKKyAgICAgICAgICAgICAgIHNwc19pZCwgc3BzLT5wcm9maWxlX2lkYywgc3BzLT5sZXZlbF9pZGMsCisgICAgICAgICAgICAgICBzcHMtPnBvY190eXBlLAorICAgICAgICAgICAgICAgc3BzLT5yZWZfZnJhbWVfY291bnQsCisgICAgICAgICAgICAgICBzcHMtPm1iX3dpZHRoLCBzcHMtPm1iX2hlaWdodCwKKyAgICAgICAgICAgICAgIHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyA/ICJGUk0iIDogKHNwcy0+bWJfYWZmID8gIk1CLUFGRiIgOiAiUElDLUFGRiIpLAorICAgICAgICAgICAgICAgc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID8gIjhCOCIgOiAiIiwKKyAgICAgICAgICAgICAgIHNwcy0+Y3JvcF9sZWZ0LCBzcHMtPmNyb3BfcmlnaHQsCisgICAgICAgICAgICAgICBzcHMtPmNyb3BfdG9wLCBzcHMtPmNyb3BfYm90dG9tLAorICAgICAgICAgICAgICAgc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPyAiVlVJIiA6ICIiLAorICAgICAgICAgICAgICAgY3NwW3Nwcy0+Y2hyb21hX2Zvcm1hdF9pZGNdLAorICAgICAgICAgICAgICAgc3BzLT50aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcgPyBzcHMtPm51bV91bml0c19pbl90aWNrIDogMCwKKyAgICAgICAgICAgICAgIHNwcy0+dGltaW5nX2luZm9fcHJlc2VudF9mbGFnID8gc3BzLT50aW1lX3NjYWxlIDogMCwKKyAgICAgICAgICAgICAgIHNwcy0+Yml0X2RlcHRoX2x1bWEsCisgICAgICAgICAgICAgICBzcHMtPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnID8gc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMgOiAtMQorICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgc3BzLT5uZXcgPSAxOworCisgICAgYXZfZnJlZShoLT5zcHNfYnVmZmVyc1tzcHNfaWRdKTsKKyAgICBoLT5zcHNfYnVmZmVyc1tzcHNfaWRdID0gc3BzOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfZnJlZShzcHMpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfcXBfdGFibGUoUFBTICpwcHMsIGludCB0LCBpbnQgaW5kZXgsIGNvbnN0IGludCBkZXB0aCkKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCBpbnQgbWF4X3FwID0gNTEgKyA2ICogKGRlcHRoIC0gOCk7CisgICAgZm9yIChpID0gMDsgaSA8IG1heF9xcCArIDE7IGkrKykKKyAgICAgICAgcHBzLT5jaHJvbWFfcXBfdGFibGVbdF1baV0gPQorICAgICAgICAgICAgZmZfaDI2NF9jaHJvbWFfcXBbZGVwdGggLSA4XVthdl9jbGlwKGkgKyBpbmRleCwgMCwgbWF4X3FwKV07Cit9CisKK3N0YXRpYyBpbnQgbW9yZV9yYnNwX2RhdGFfaW5fcHBzKEgyNjRDb250ZXh0ICpoLCBQUFMgKnBwcykKK3sKKyAgICBjb25zdCBTUFMgKnNwcyA9IGgtPnNwc19idWZmZXJzW3Bwcy0+c3BzX2lkXTsKKyAgICBpbnQgcHJvZmlsZV9pZGMgPSBzcHMtPnByb2ZpbGVfaWRjOworCisgICAgaWYgKChwcm9maWxlX2lkYyA9PSA2NiB8fCBwcm9maWxlX2lkYyA9PSA3NyB8fAorICAgICAgICAgcHJvZmlsZV9pZGMgPT0gODgpICYmIChzcHMtPmNvbnN0cmFpbnRfc2V0X2ZsYWdzICYgNykpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgICAgICJDdXJyZW50IHByb2ZpbGUgZG9lc24ndCBwcm92aWRlIG1vcmUgUkJTUCBkYXRhIGluIFBQUywgc2tpcHBpbmdcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworaW50IGZmX2gyNjRfZGVjb2RlX3BpY3R1cmVfcGFyYW1ldGVyX3NldChIMjY0Q29udGV4dCAqaCwgaW50IGJpdF9sZW5ndGgpCit7CisgICAgdW5zaWduZWQgaW50IHBwc19pZCA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKTsKKyAgICBQUFMgKnBwczsKKyAgICBTUFMgKnNwczsKKyAgICBpbnQgcXBfYmRfb2Zmc2V0OworICAgIGludCBiaXRzX2xlZnQ7CisKKyAgICBpZiAocHBzX2lkID49IE1BWF9QUFNfQ09VTlQpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJwcHNfaWQgJXUgb3V0IG9mIHJhbmdlXG4iLCBwcHNfaWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBwcHMgPSBhdl9tYWxsb2N6KHNpemVvZihQUFMpKTsKKyAgICBpZiAoIXBwcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBwcHMtPnNwc19pZCA9IGdldF91ZV9nb2xvbWJfMzEoJmgtPmdiKTsKKyAgICBpZiAoKHVuc2lnbmVkKXBwcy0+c3BzX2lkID49IE1BWF9TUFNfQ09VTlQgfHwKKyAgICAgICAgIWgtPnNwc19idWZmZXJzW3Bwcy0+c3BzX2lkXSkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInNwc19pZCAldSBvdXQgb2YgcmFuZ2VcbiIsIHBwcy0+c3BzX2lkKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzcHMgPSBoLT5zcHNfYnVmZmVyc1twcHMtPnNwc19pZF07CisgICAgcXBfYmRfb2Zmc2V0ID0gNiAqIChzcHMtPmJpdF9kZXB0aF9sdW1hIC0gOCk7CisgICAgaWYgKHNwcy0+Yml0X2RlcHRoX2x1bWEgPiAxNCkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIGx1bWEgYml0IGRlcHRoPSVkXG4iLAorICAgICAgICAgICAgICAgc3BzLT5iaXRfZGVwdGhfbHVtYSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9IGVsc2UgaWYgKHNwcy0+Yml0X2RlcHRoX2x1bWEgPT0gMTEgfHwgc3BzLT5iaXRfZGVwdGhfbHVtYSA9PSAxMykgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbmltcGxlbWVudGVkIGx1bWEgYml0IGRlcHRoPSVkXG4iLAorICAgICAgICAgICAgICAgc3BzLT5iaXRfZGVwdGhfbHVtYSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBwcHMtPmNhYmFjICAgICAgICAgICAgID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgcHBzLT5waWNfb3JkZXJfcHJlc2VudCA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIHBwcy0+c2xpY2VfZ3JvdXBfY291bnQgPSBnZXRfdWVfZ29sb21iKCZoLT5nYikgKyAxOworICAgIGlmIChwcHMtPnNsaWNlX2dyb3VwX2NvdW50ID4gMSkgeworICAgICAgICBwcHMtPm1iX3NsaWNlX2dyb3VwX21hcF90eXBlID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkZNTyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgc3dpdGNoIChwcHMtPm1iX3NsaWNlX2dyb3VwX21hcF90eXBlKSB7CisgICAgICAgIGNhc2UgMDoKKyNpZiAwCisgICAgfCAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG51bV9zbGljZV9ncm91cHNfbWludXMxOyBpKyspICB8ICAgfCAgICAgIHwKKyAgICB8ICAgICAgICAgICBydW5fbGVuZ3RoW2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwxICB8dWUodikgfAorI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorI2lmIDAKKyAgICB8ICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaSsrKSB7IHwgICB8ICAgICAgfAorICAgIHwgICAgICAgICAgIHRvcF9sZWZ0X21iW2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfDEgIHx1ZSh2KSB8CisgICAgfCAgICAgICAgICAgYm90dG9tX3JpZ2h0X21iW2ldICAgICAgICAgICAgICAgICAgICAgICAgICB8MSAgfHVlKHYpIHwKKyAgICB8ICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICAgfAorI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgNToKKyNpZiAwCisgICAgfCAgICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcgICAgICAgICAgICAgICB8MSAgfHUoMSkgIHwKKyAgICB8ICAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSAgICAgICAgICAgICAgICAgIHwxICB8dWUodikgfAorI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorI2lmIDAKKyAgICB8ICAgICAgIHNsaWNlX2dyb3VwX2lkX2NudF9taW51czEgICAgICAgICAgICAgICAgICAgICAgIHwxICB8dWUodikgfAorICAgIHwgICAgICAgZm9yIChpID0gMDsgaSA8PSBzbGljZV9ncm91cF9pZF9jbnRfbWludXMxOyBpKyspfCAgIHwgICAgICB8CisgICAgfCAgICAgICAgICAgc2xpY2VfZ3JvdXBfaWRbaV0gICAgICAgICAgICAgICAgICAgICAgICAgICB8MSAgfHUodikgIHwKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcHBzLT5yZWZfY291bnRbMF0gPSBnZXRfdWVfZ29sb21iKCZoLT5nYikgKyAxOworICAgIHBwcy0+cmVmX2NvdW50WzFdID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpICsgMTsKKyAgICBpZiAocHBzLT5yZWZfY291bnRbMF0gLSAxID4gMzIgLSAxIHx8IHBwcy0+cmVmX2NvdW50WzFdIC0gMSA+IDMyIC0gMSkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJlZmVyZW5jZSBvdmVyZmxvdyAocHBzKVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBwcHMtPndlaWdodGVkX3ByZWQgICAgICAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIHBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoJmgtPmdiLCAyKTsKKyAgICBwcHMtPmluaXRfcXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKSArIDI2ICsgcXBfYmRfb2Zmc2V0OworICAgIHBwcy0+aW5pdF9xcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpICsgMjYgKyBxcF9iZF9vZmZzZXQ7CisgICAgcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzBdICAgICAgICAgICAgPSBnZXRfc2VfZ29sb21iKCZoLT5nYik7CisgICAgcHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICBwcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWQgICAgICAgICAgICAgICA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIHBwcy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudCAgICAgICAgICAgID0gZ2V0X2JpdHMxKCZoLT5nYik7CisKKyAgICBwcHMtPnRyYW5zZm9ybV84eDhfbW9kZSA9IDA7CisgICAgLy8gY29udGVudHMgb2Ygc3BzL3BwcyBjYW4gY2hhbmdlIGV2ZW4gaWYgaWQgZG9lc24ndCwgc28gcmVpbml0CisgICAgaC0+ZGVxdWFudF9jb2VmZl9wcHMgPSAtMTsKKyAgICBtZW1jcHkocHBzLT5zY2FsaW5nX21hdHJpeDQsIGgtPnNwc19idWZmZXJzW3Bwcy0+c3BzX2lkXS0+c2NhbGluZ19tYXRyaXg0LAorICAgICAgICAgICBzaXplb2YocHBzLT5zY2FsaW5nX21hdHJpeDQpKTsKKyAgICBtZW1jcHkocHBzLT5zY2FsaW5nX21hdHJpeDgsIGgtPnNwc19idWZmZXJzW3Bwcy0+c3BzX2lkXS0+c2NhbGluZ19tYXRyaXg4LAorICAgICAgICAgICBzaXplb2YocHBzLT5zY2FsaW5nX21hdHJpeDgpKTsKKworICAgIGJpdHNfbGVmdCA9IGJpdF9sZW5ndGggLSBnZXRfYml0c19jb3VudCgmaC0+Z2IpOworICAgIGlmIChiaXRzX2xlZnQgPiAwICYmIG1vcmVfcmJzcF9kYXRhX2luX3BwcyhoLCBwcHMpKSB7CisgICAgICAgIHBwcy0+dHJhbnNmb3JtXzh4OF9tb2RlID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgICAgIGRlY29kZV9zY2FsaW5nX21hdHJpY2VzKGgsIGgtPnNwc19idWZmZXJzW3Bwcy0+c3BzX2lkXSwgcHBzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHMtPnNjYWxpbmdfbWF0cml4NCwgcHBzLT5zY2FsaW5nX21hdHJpeDgpOworICAgICAgICAvLyBzZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldAorICAgICAgICBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMV0gPSBnZXRfc2VfZ29sb21iKCZoLT5nYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzFdID0gcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzBdOworICAgIH0KKworICAgIGJ1aWxkX3FwX3RhYmxlKHBwcywgMCwgcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzBdLCBzcHMtPmJpdF9kZXB0aF9sdW1hKTsKKyAgICBidWlsZF9xcF90YWJsZShwcHMsIDEsIHBwcy0+Y2hyb21hX3FwX2luZGV4X29mZnNldFsxXSwgc3BzLT5iaXRfZGVwdGhfbHVtYSk7CisgICAgaWYgKHBwcy0+Y2hyb21hX3FwX2luZGV4X29mZnNldFswXSAhPSBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMV0pCisgICAgICAgIHBwcy0+Y2hyb21hX3FwX2RpZmYgPSAxOworCisgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJwcHM6JXUgc3BzOiV1ICVzIHNsaWNlX2dyb3VwczolZCByZWY6JXUvJXUgJXMgcXA6JWQvJWQvJWQvJWQgJXMgJXMgJXMgJXNcbiIsCisgICAgICAgICAgICAgICBwcHNfaWQsIHBwcy0+c3BzX2lkLAorICAgICAgICAgICAgICAgcHBzLT5jYWJhYyA/ICJDQUJBQyIgOiAiQ0FWTEMiLAorICAgICAgICAgICAgICAgcHBzLT5zbGljZV9ncm91cF9jb3VudCwKKyAgICAgICAgICAgICAgIHBwcy0+cmVmX2NvdW50WzBdLCBwcHMtPnJlZl9jb3VudFsxXSwKKyAgICAgICAgICAgICAgIHBwcy0+d2VpZ2h0ZWRfcHJlZCA/ICJ3ZWlnaHRlZCIgOiAiIiwKKyAgICAgICAgICAgICAgIHBwcy0+aW5pdF9xcCwgcHBzLT5pbml0X3FzLCBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMF0sIHBwcy0+Y2hyb21hX3FwX2luZGV4X29mZnNldFsxXSwKKyAgICAgICAgICAgICAgIHBwcy0+ZGVibG9ja2luZ19maWx0ZXJfcGFyYW1ldGVyc19wcmVzZW50ID8gIkxQQVIiIDogIiIsCisgICAgICAgICAgICAgICBwcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWQgPyAiQ09OU1RSIiA6ICIiLAorICAgICAgICAgICAgICAgcHBzLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50ID8gIlJFRFUiIDogIiIsCisgICAgICAgICAgICAgICBwcHMtPnRyYW5zZm9ybV84eDhfbW9kZSA/ICI4eDhEQ1QiIDogIiIpOworICAgIH0KKworICAgIGF2X2ZyZWUoaC0+cHBzX2J1ZmZlcnNbcHBzX2lkXSk7CisgICAgaC0+cHBzX2J1ZmZlcnNbcHBzX2lkXSA9IHBwczsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9mcmVlKHBwcyk7CisgICAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9yZWZzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X3JlZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmRhOTIxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9yZWZzLmMKQEAgLTAsMCArMSw4NzAgQEAKKy8qCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiByZWZlcmVuY2UgcGljdHVyZSBoYW5kbGluZworICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwICByZWZlcmVuY2UgcGljdHVyZSBoYW5kbGluZy4KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIENPUFlfUElDVFVSRShkc3QsIHNyYykgXAorZG8ge1wKKyAgICAqKGRzdCkgPSAqKHNyYyk7XAorICAgIChkc3QpLT5mLmV4dGVuZGVkX2RhdGEgPSAoZHN0KS0+Zi5kYXRhO1wKKyAgICAoZHN0KS0+dGYuZiA9ICYoZHN0KS0+ZjtcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyB2b2lkIHBpY19hc19maWVsZChIMjY0UGljdHVyZSAqcGljLCBjb25zdCBpbnQgcGFyaXR5KXsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGlmIChwYXJpdHkgPT0gUElDVF9CT1RUT01fRklFTEQpCisgICAgICAgICAgICBwaWMtPmYuZGF0YVtpXSArPSBwaWMtPmYubGluZXNpemVbaV07CisgICAgICAgIHBpYy0+cmVmZXJlbmNlICAgICAgPSBwYXJpdHk7CisgICAgICAgIHBpYy0+Zi5saW5lc2l6ZVtpXSAqPSAyOworICAgIH0KKyAgICBwaWMtPnBvYz0gcGljLT5maWVsZF9wb2NbcGFyaXR5ID09IFBJQ1RfQk9UVE9NX0ZJRUxEXTsKK30KKworc3RhdGljIGludCBzcGxpdF9maWVsZF9jb3B5KEgyNjRQaWN0dXJlICpkZXN0LCBIMjY0UGljdHVyZSAqc3JjLCBpbnQgcGFyaXR5LCBpbnQgaWRfYWRkKQoreworICAgIGludCBtYXRjaCA9ICEhKHNyYy0+cmVmZXJlbmNlICYgcGFyaXR5KTsKKworICAgIGlmIChtYXRjaCkgeworICAgICAgICBDT1BZX1BJQ1RVUkUoZGVzdCwgc3JjKTsKKyAgICAgICAgaWYgKHBhcml0eSAhPSBQSUNUX0ZSQU1FKSB7CisgICAgICAgICAgICBwaWNfYXNfZmllbGQoZGVzdCwgcGFyaXR5KTsKKyAgICAgICAgICAgIGRlc3QtPnBpY19pZCAqPSAyOworICAgICAgICAgICAgZGVzdC0+cGljX2lkICs9IGlkX2FkZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXRjaDsKK30KKworc3RhdGljIGludCBidWlsZF9kZWZfbGlzdChIMjY0UGljdHVyZSAqZGVmLCBpbnQgZGVmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFBpY3R1cmUgKippbiwgaW50IGxlbiwgaW50IGlzX2xvbmcsIGludCBzZWwpCit7CisgICAgaW50ICBpWzJdID0geyAwIH07CisgICAgaW50IGluZGV4ID0gMDsKKworICAgIHdoaWxlIChpWzBdIDwgbGVuIHx8IGlbMV0gPCBsZW4pIHsKKyAgICAgICAgd2hpbGUgKGlbMF0gPCBsZW4gJiYgIShpbltpWzBdXSAmJiAoaW5baVswXV0tPnJlZmVyZW5jZSAmIHNlbCkpKQorICAgICAgICAgICAgaVswXSsrOworICAgICAgICB3aGlsZSAoaVsxXSA8IGxlbiAmJiAhKGluW2lbMV1dICYmIChpbltpWzFdXS0+cmVmZXJlbmNlICYgKHNlbCBeIDMpKSkpCisgICAgICAgICAgICBpWzFdKys7CisgICAgICAgIGlmIChpWzBdIDwgbGVuKSB7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGluZGV4IDwgZGVmX2xlbik7CisgICAgICAgICAgICBpbltpWzBdXS0+cGljX2lkID0gaXNfbG9uZyA/IGlbMF0gOiBpbltpWzBdXS0+ZnJhbWVfbnVtOworICAgICAgICAgICAgc3BsaXRfZmllbGRfY29weSgmZGVmW2luZGV4KytdLCBpbltpWzBdKytdLCBzZWwsIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChpWzFdIDwgbGVuKSB7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGluZGV4IDwgZGVmX2xlbik7CisgICAgICAgICAgICBpbltpWzFdXS0+cGljX2lkID0gaXNfbG9uZyA/IGlbMV0gOiBpbltpWzFdXS0+ZnJhbWVfbnVtOworICAgICAgICAgICAgc3BsaXRfZmllbGRfY29weSgmZGVmW2luZGV4KytdLCBpbltpWzFdKytdLCBzZWwgXiAzLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpbmRleDsKK30KKworc3RhdGljIGludCBhZGRfc29ydGVkKEgyNjRQaWN0dXJlICoqc29ydGVkLCBIMjY0UGljdHVyZSAqKnNyYywgaW50IGxlbiwgaW50IGxpbWl0LCBpbnQgZGlyKQoreworICAgIGludCBpLCBiZXN0X3BvYzsKKyAgICBpbnQgb3V0X2kgPSAwOworCisgICAgZm9yICg7OykgeworICAgICAgICBiZXN0X3BvYyA9IGRpciA/IElOVF9NSU4gOiBJTlRfTUFYOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY29uc3QgaW50IHBvYyA9IHNyY1tpXS0+cG9jOworICAgICAgICAgICAgaWYgKCgocG9jID4gbGltaXQpIF4gZGlyKSAmJiAoKHBvYyA8IGJlc3RfcG9jKSBeIGRpcikpIHsKKyAgICAgICAgICAgICAgICBiZXN0X3BvYyAgICAgID0gcG9jOworICAgICAgICAgICAgICAgIHNvcnRlZFtvdXRfaV0gPSBzcmNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJlc3RfcG9jID09IChkaXIgPyBJTlRfTUlOIDogSU5UX01BWCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGltaXQgPSBzb3J0ZWRbb3V0X2krK10tPnBvYyAtIGRpcjsKKyAgICB9CisgICAgcmV0dXJuIG91dF9pOworfQorCitpbnQgZmZfaDI2NF9maWxsX2RlZmF1bHRfcmVmX2xpc3QoSDI2NENvbnRleHQgKmgpCit7CisgICAgaW50IGksIGxlbjsKKworICAgIGlmIChoLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICBIMjY0UGljdHVyZSAqc29ydGVkWzMyXTsKKyAgICAgICAgaW50IGN1cl9wb2MsIGxpc3Q7CisgICAgICAgIGludCBsZW5zWzJdOworCisgICAgICAgIGlmIChGSUVMRF9QSUNUVVJFKGgpKQorICAgICAgICAgICAgY3VyX3BvYyA9IGgtPmN1cl9waWNfcHRyLT5maWVsZF9wb2NbaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTERdOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjdXJfcG9jID0gaC0+Y3VyX3BpY19wdHItPnBvYzsKKworICAgICAgICBmb3IgKGxpc3QgPSAwOyBsaXN0IDwgMjsgbGlzdCsrKSB7CisgICAgICAgICAgICBsZW4gID0gYWRkX3NvcnRlZChzb3J0ZWQsICAgICAgIGgtPnNob3J0X3JlZiwgaC0+c2hvcnRfcmVmX2NvdW50LCBjdXJfcG9jLCAxIF4gbGlzdCk7CisgICAgICAgICAgICBsZW4gKz0gYWRkX3NvcnRlZChzb3J0ZWQgKyBsZW4sIGgtPnNob3J0X3JlZiwgaC0+c2hvcnRfcmVmX2NvdW50LCBjdXJfcG9jLCAwIF4gbGlzdCk7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGxlbiA8PSAzMik7CisKKyAgICAgICAgICAgIGxlbiAgPSBidWlsZF9kZWZfbGlzdChoLT5kZWZhdWx0X3JlZl9saXN0W2xpc3RdLCBGRl9BUlJBWV9FTEVNUyhoLT5kZWZhdWx0X3JlZl9saXN0WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWQsIGxlbiwgMCwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUpOworICAgICAgICAgICAgbGVuICs9IGJ1aWxkX2RlZl9saXN0KGgtPmRlZmF1bHRfcmVmX2xpc3RbbGlzdF0gKyBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMoaC0+ZGVmYXVsdF9yZWZfbGlzdFswXSkgLSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bG9uZ19yZWYsIDE2LCAxLCBoLT5waWN0dXJlX3N0cnVjdHVyZSk7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGxlbiA8PSAzMik7CisKKyAgICAgICAgICAgIGlmIChsZW4gPCBoLT5yZWZfY291bnRbbGlzdF0pCisgICAgICAgICAgICAgICAgbWVtc2V0KCZoLT5kZWZhdWx0X3JlZl9saXN0W2xpc3RdW2xlbl0sIDAsIHNpemVvZihIMjY0UGljdHVyZSkgKiAoaC0+cmVmX2NvdW50W2xpc3RdIC0gbGVuKSk7CisgICAgICAgICAgICBsZW5zW2xpc3RdID0gbGVuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxlbnNbMF0gPT0gbGVuc1sxXSAmJiBsZW5zWzFdID4gMSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbnNbMF0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPmRlZmF1bHRfcmVmX2xpc3RbMF1baV0uZi5idWZbMF0tPmJ1ZmZlciA9PQorICAgICAgICAgICAgICAgICAgICAgICAgaC0+ZGVmYXVsdF9yZWZfbGlzdFsxXVtpXS5mLmJ1ZlswXS0+YnVmZmVyOyBpKyspOworICAgICAgICAgICAgaWYgKGkgPT0gbGVuc1swXSkgeworICAgICAgICAgICAgICAgIEgyNjRQaWN0dXJlIHRtcDsKKyAgICAgICAgICAgICAgICBDT1BZX1BJQ1RVUkUoJnRtcCwgJmgtPmRlZmF1bHRfcmVmX2xpc3RbMV1bMF0pOworICAgICAgICAgICAgICAgIENPUFlfUElDVFVSRSgmaC0+ZGVmYXVsdF9yZWZfbGlzdFsxXVswXSwgJmgtPmRlZmF1bHRfcmVmX2xpc3RbMV1bMV0pOworICAgICAgICAgICAgICAgIENPUFlfUElDVFVSRSgmaC0+ZGVmYXVsdF9yZWZfbGlzdFsxXVsxXSwgJnRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBsZW4gID0gYnVpbGRfZGVmX2xpc3QoaC0+ZGVmYXVsdF9yZWZfbGlzdFswXSwgRkZfQVJSQVlfRUxFTVMoaC0+ZGVmYXVsdF9yZWZfbGlzdFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5zaG9ydF9yZWYsIGgtPnNob3J0X3JlZl9jb3VudCwgMCwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUpOworICAgICAgICBsZW4gKz0gYnVpbGRfZGVmX2xpc3QoaC0+ZGVmYXVsdF9yZWZfbGlzdFswXSArIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0FSUkFZX0VMRU1TKGgtPmRlZmF1bHRfcmVmX2xpc3RbMF0pIC0gbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+IGxvbmdfcmVmLCAxNiwgMSwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUpOworICAgICAgICBhdl9hc3NlcnQwKGxlbiA8PSAzMik7CisKKyAgICAgICAgaWYgKGxlbiA8IGgtPnJlZl9jb3VudFswXSkKKyAgICAgICAgICAgIG1lbXNldCgmaC0+ZGVmYXVsdF9yZWZfbGlzdFswXVtsZW5dLCAwLCBzaXplb2YoSDI2NFBpY3R1cmUpICogKGgtPnJlZl9jb3VudFswXSAtIGxlbikpOworICAgIH0KKyNpZmRlZiBUUkFDRQorICAgIGZvciAoaSA9IDA7IGkgPCBoLT5yZWZfY291bnRbMF07IGkrKykgeworICAgICAgICB0cHJpbnRmKGgtPmF2Y3R4LCAiTGlzdDA6ICVzIGZuOiVkIDB4JXBcbiIsCisgICAgICAgICAgICAgICAgKGgtPmRlZmF1bHRfcmVmX2xpc3RbMF1baV0ubG9uZ19yZWYgPyAiTFQiIDogIlNUIiksCisgICAgICAgICAgICAgICAgaC0+ZGVmYXVsdF9yZWZfbGlzdFswXVtpXS5waWNfaWQsCisgICAgICAgICAgICAgICAgaC0+ZGVmYXVsdF9yZWZfbGlzdFswXVtpXS5mLmRhdGFbMF0pOworICAgIH0KKyAgICBpZiAoaC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPnJlZl9jb3VudFsxXTsgaSsrKSB7CisgICAgICAgICAgICB0cHJpbnRmKGgtPmF2Y3R4LCAiTGlzdDE6ICVzIGZuOiVkIDB4JXBcbiIsCisgICAgICAgICAgICAgICAgICAgIChoLT5kZWZhdWx0X3JlZl9saXN0WzFdW2ldLmxvbmdfcmVmID8gIkxUIiA6ICJTVCIpLAorICAgICAgICAgICAgICAgICAgICBoLT5kZWZhdWx0X3JlZl9saXN0WzFdW2ldLnBpY19pZCwKKyAgICAgICAgICAgICAgICAgICAgaC0+ZGVmYXVsdF9yZWZfbGlzdFsxXVtpXS5mLmRhdGFbMF0pOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3Nob3J0X3Rlcm0oSDI2NENvbnRleHQgKmgpOworc3RhdGljIHZvaWQgcHJpbnRfbG9uZ190ZXJtKEgyNjRDb250ZXh0ICpoKTsKKworLyoqCisgKiBFeHRyYWN0IHN0cnVjdHVyZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGljdHVyZSBkZXNjcmliZWQgYnkgcGljX251bSBpbgorICogdGhlIGN1cnJlbnQgZGVjb2RpbmcgY29udGV4dCAoZnJhbWUgb3IgZmllbGQpLiBOb3RlIHRoYXQgcGljX251bSBpcworICogcGljdHVyZSBudW1iZXIgd2l0aG91dCB3cmFwcGluZyAoc28sIDA8PXBpY19udW08bWF4X3BpY19udW0pLgorICogQHBhcmFtIHBpY19udW0gcGljdHVyZSBudW1iZXIgZm9yIHdoaWNoIHRvIGV4dHJhY3Qgc3RydWN0dXJlIGluZm9ybWF0aW9uCisgKiBAcGFyYW0gc3RydWN0dXJlIG9uZSBvZiBQSUNUX1hYWCBkZXNjcmliaW5nIHN0cnVjdHVyZSBvZiBwaWN0dXJlCisgKiAgICAgICAgICAgICAgICAgICAgICB3aXRoIHBpY19udW0KKyAqIEByZXR1cm4gZnJhbWUgbnVtYmVyIChzaG9ydCB0ZXJtKSBvciBsb25nIHRlcm0gaW5kZXggb2YgcGljdHVyZQorICogICAgICAgICBkZXNjcmliZWQgYnkgcGljX251bQorICovCitzdGF0aWMgaW50IHBpY19udW1fZXh0cmFjdChIMjY0Q29udGV4dCAqaCwgaW50IHBpY19udW0sIGludCAqc3RydWN0dXJlKQoreworICAgICpzdHJ1Y3R1cmUgPSBoLT5waWN0dXJlX3N0cnVjdHVyZTsKKyAgICBpZiAoRklFTERfUElDVFVSRShoKSkgeworICAgICAgICBpZiAoIShwaWNfbnVtICYgMSkpCisgICAgICAgICAgICAvKiBvcHBvc2l0ZSBmaWVsZCAqLworICAgICAgICAgICAgKnN0cnVjdHVyZSBePSBQSUNUX0ZSQU1FOworICAgICAgICBwaWNfbnVtID4+PSAxOworICAgIH0KKworICAgIHJldHVybiBwaWNfbnVtOworfQorCitpbnQgZmZfaDI2NF9kZWNvZGVfcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcoSDI2NENvbnRleHQgKmgpCit7CisgICAgaW50IGxpc3QsIGluZGV4LCBwaWNfc3RydWN0dXJlLCBpOworCisgICAgcHJpbnRfc2hvcnRfdGVybShoKTsKKyAgICBwcmludF9sb25nX3Rlcm0oaCk7CisKKyAgICBmb3IgKGxpc3QgPSAwOyBsaXN0IDwgaC0+bGlzdF9jb3VudDsgbGlzdCsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoLT5yZWZfY291bnRbbGlzdF07IGkrKykKKyAgICAgICAgICAgIENPUFlfUElDVFVSRSgmaC0+cmVmX2xpc3RbbGlzdF1baV0sICZoLT5kZWZhdWx0X3JlZl9saXN0W2xpc3RdW2ldKTsKKworICAgICAgICBpZiAoZ2V0X2JpdHMxKCZoLT5nYikpIHsgICAgLy8gcmVmX3BpY19saXN0X21vZGlmaWNhdGlvbl9mbGFnX2xbMDFdCisgICAgICAgICAgICBpbnQgcHJlZCA9IGgtPmN1cnJfcGljX251bTsKKworICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IDsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjID0gZ2V0X3VlX2dvbG9tYl8zMSgmaC0+Z2IpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaWNfaWQ7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgSDI2NFBpY3R1cmUgKnJlZiA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBpZiAobW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkYyA9PSAzKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBoLT5yZWZfY291bnRbbGlzdF0pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZWZlcmVuY2UgY291bnQgb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgYWJzX2RpZmZfcGljX251bSA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKSArIDE7CisgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9udW07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFic19kaWZmX3BpY19udW0gPiBoLT5tYXhfcGljX251bSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFic19kaWZmX3BpY19udW0gb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkYyA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCAtPSBhYnNfZGlmZl9waWNfbnVtOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkICs9IGFic19kaWZmX3BpY19udW07CisgICAgICAgICAgICAgICAgICAgIHByZWQgJj0gaC0+bWF4X3BpY19udW0gLSAxOworCisgICAgICAgICAgICAgICAgICAgIGZyYW1lX251bSA9IHBpY19udW1fZXh0cmFjdChoLCBwcmVkLCAmcGljX3N0cnVjdHVyZSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gaC0+c2hvcnRfcmVmX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IGgtPnNob3J0X3JlZltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZWYtPnJlZmVyZW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIXJlZi0+bG9uZ19yZWYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZi0+ZnJhbWVfbnVtID09IGZyYW1lX251bSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWYtPnJlZmVyZW5jZSAmIHBpY19zdHJ1Y3R1cmUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnBpY19pZCA9IHByZWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxvbmdfaWR4OworICAgICAgICAgICAgICAgICAgICBwaWNfaWQgPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7IC8vIGxvbmdfdGVybV9waWNfaWR4CisKKyAgICAgICAgICAgICAgICAgICAgbG9uZ19pZHggPSBwaWNfbnVtX2V4dHJhY3QoaCwgcGljX2lkLCAmcGljX3N0cnVjdHVyZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvbmdfaWR4ID4gMzEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nX3Rlcm1fcGljX2lkeCBvdmVyZmxvd1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZWYgPSBoLT5sb25nX3JlZltsb25nX2lkeF07CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCghKHJlZiAmJiAhcmVmLT5yZWZlcmVuY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZiAmJiAocmVmLT5yZWZlcmVuY2UgJiBwaWNfc3RydWN0dXJlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT5waWNfaWQgPSBwaWNfaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVmLT5sb25nX3JlZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2UgcGljdHVyZSBtaXNzaW5nIGR1cmluZyByZW9yZGVyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZoLT5yZWZfbGlzdFtsaXN0XVtpbmRleF0sIDAsIHNpemVvZihIMjY0UGljdHVyZSkpOyAvLyBGSVhNRQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGluZGV4OyBpICsgMSA8IGgtPnJlZl9jb3VudFtsaXN0XTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmLT5sb25nX3JlZiA9PSBoLT5yZWZfbGlzdFtsaXN0XVtpXS5sb25nX3JlZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+cGljX2lkICAgPT0gaC0+cmVmX2xpc3RbbGlzdF1baV0ucGljX2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpID4gaW5kZXg7IGktLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ09QWV9QSUNUVVJFKCZoLT5yZWZfbGlzdFtsaXN0XVtpXSwgJmgtPnJlZl9saXN0W2xpc3RdW2kgLSAxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ09QWV9QSUNUVVJFKCZoLT5yZWZfbGlzdFtsaXN0XVtpbmRleF0sIHJlZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChGSUVMRF9QSUNUVVJFKGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNfYXNfZmllbGQoJmgtPnJlZl9saXN0W2xpc3RdW2luZGV4XSwgcGljX3N0cnVjdHVyZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChsaXN0ID0gMDsgbGlzdCA8IGgtPmxpc3RfY291bnQ7IGxpc3QrKykgeworICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBoLT5yZWZfY291bnRbbGlzdF07IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmICggICAhaC0+cmVmX2xpc3RbbGlzdF1baW5kZXhdLmYuYnVmWzBdCisgICAgICAgICAgICAgICAgfHwgKCFGSUVMRF9QSUNUVVJFKGgpICYmIChoLT5yZWZfbGlzdFtsaXN0XVtpbmRleF0ucmVmZXJlbmNlJjMpICE9IDMpKSB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIHJlZmVyZW5jZSBwaWN0dXJlLCBkZWZhdWx0IGlzICVkXG4iLCBoLT5kZWZhdWx0X3JlZl9saXN0W2xpc3RdWzBdLnBvYyk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGgtPmxhc3RfcG9jcyk7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaC0+bGFzdF9wb2NzW2ldID0gSU5UX01JTjsKKyAgICAgICAgICAgICAgICBpZiAoaC0+ZGVmYXVsdF9yZWZfbGlzdFtsaXN0XVswXS5mLmJ1ZlswXQorICAgICAgICAgICAgICAgICAgICAmJiAhKCFGSUVMRF9QSUNUVVJFKGgpICYmIChoLT5kZWZhdWx0X3JlZl9saXN0W2xpc3RdWzBdLnJlZmVyZW5jZSYzKSAhPSAzKSkKKyAgICAgICAgICAgICAgICAgICAgQ09QWV9QSUNUVVJFKCZoLT5yZWZfbGlzdFtsaXN0XVtpbmRleF0sICZoLT5kZWZhdWx0X3JlZl9saXN0W2xpc3RdWzBdKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfYnVmZmVyX2dldF9yZWZfY291bnQoaC0+cmVmX2xpc3RbbGlzdF1baW5kZXhdLmYuYnVmWzBdKSA+IDApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfaDI2NF9maWxsX21iYWZmX3JlZl9saXN0KEgyNjRDb250ZXh0ICpoKQoreworICAgIGludCBsaXN0LCBpLCBqOworICAgIGZvciAobGlzdCA9IDA7IGxpc3QgPCBoLT5saXN0X2NvdW50OyBsaXN0KyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPnJlZl9jb3VudFtsaXN0XTsgaSsrKSB7CisgICAgICAgICAgICBIMjY0UGljdHVyZSAqZnJhbWUgPSAmaC0+cmVmX2xpc3RbbGlzdF1baV07CisgICAgICAgICAgICBIMjY0UGljdHVyZSAqZmllbGQgPSAmaC0+cmVmX2xpc3RbbGlzdF1bMTYgKyAyICogaV07CisgICAgICAgICAgICBDT1BZX1BJQ1RVUkUoZmllbGQsIGZyYW1lKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCisgICAgICAgICAgICAgICAgZmllbGRbMF0uZi5saW5lc2l6ZVtqXSA8PD0gMTsKKyAgICAgICAgICAgIGZpZWxkWzBdLnJlZmVyZW5jZSA9IFBJQ1RfVE9QX0ZJRUxEOworICAgICAgICAgICAgZmllbGRbMF0ucG9jICAgICAgID0gZmllbGRbMF0uZmllbGRfcG9jWzBdOworICAgICAgICAgICAgQ09QWV9QSUNUVVJFKGZpZWxkICsgMSwgZmllbGQpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKKyAgICAgICAgICAgICAgICBmaWVsZFsxXS5mLmRhdGFbal0gKz0gZnJhbWUtPmYubGluZXNpemVbal07CisgICAgICAgICAgICBmaWVsZFsxXS5yZWZlcmVuY2UgPSBQSUNUX0JPVFRPTV9GSUVMRDsKKyAgICAgICAgICAgIGZpZWxkWzFdLnBvYyAgICAgICA9IGZpZWxkWzFdLmZpZWxkX3BvY1sxXTsKKworICAgICAgICAgICAgaC0+bHVtYV93ZWlnaHRbMTYgKyAyICogaV1bbGlzdF1bMF0gPSBoLT5sdW1hX3dlaWdodFsxNiArIDIgKiBpICsgMV1bbGlzdF1bMF0gPSBoLT5sdW1hX3dlaWdodFtpXVtsaXN0XVswXTsKKyAgICAgICAgICAgIGgtPmx1bWFfd2VpZ2h0WzE2ICsgMiAqIGldW2xpc3RdWzFdID0gaC0+bHVtYV93ZWlnaHRbMTYgKyAyICogaSArIDFdW2xpc3RdWzFdID0gaC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMV07CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICAgICAgaC0+Y2hyb21hX3dlaWdodFsxNiArIDIgKiBpXVtsaXN0XVtqXVswXSA9IGgtPmNocm9tYV93ZWlnaHRbMTYgKyAyICogaSArIDFdW2xpc3RdW2pdWzBdID0gaC0+Y2hyb21hX3dlaWdodFtpXVtsaXN0XVtqXVswXTsKKyAgICAgICAgICAgICAgICBoLT5jaHJvbWFfd2VpZ2h0WzE2ICsgMiAqIGldW2xpc3RdW2pdWzFdID0gaC0+Y2hyb21hX3dlaWdodFsxNiArIDIgKiBpICsgMV1bbGlzdF1bal1bMV0gPSBoLT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW2pdWzFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIE1hcmsgYSBwaWN0dXJlIGFzIG5vIGxvbmdlciBuZWVkZWQgZm9yIHJlZmVyZW5jZS4gVGhlIHJlZm1hc2sKKyAqIGFyZ3VtZW50IGFsbG93cyB1bnJlZmVyZW5jaW5nIG9mIGluZGl2aWR1YWwgZmllbGRzIG9yIHRoZSB3aG9sZSBmcmFtZS4KKyAqIElmIHRoZSBwaWN0dXJlIGJlY29tZXMgZW50aXJlbHkgdW5yZWZlcmVuY2VkLCBidXQgaXMgYmVpbmcgaGVsZCBmb3IKKyAqIGRpc3BsYXkgcHVycG9zZXMsIGl0IGlzIG1hcmtlZCBhcyBzdWNoLgorICogQHBhcmFtIHJlZm1hc2sgbWFzayBvZiBmaWVsZHMgdG8gdW5yZWZlcmVuY2U7IHRoZSBtYXNrIGlzIGJpdHdpc2UKKyAqICAgICAgICAgICAgICAgIGFuZGVkIHdpdGggdGhlIHJlZmVyZW5jZSBtYXJraW5nIG9mIHBpYworICogQHJldHVybiBub24temVybyBpZiBwaWMgYmVjb21lcyBlbnRpcmVseSB1bnJlZmVyZW5jZWQgKGV4Y2VwdCBwb3NzaWJseQorICogICAgICAgICBmb3IgZGlzcGxheSBwdXJwb3NlcykgemVybyBpZiBvbmUgb2YgdGhlIGZpZWxkcyByZW1haW5zIGluCisgKiAgICAgICAgIHJlZmVyZW5jZQorICovCitzdGF0aWMgaW5saW5lIGludCB1bnJlZmVyZW5jZV9waWMoSDI2NENvbnRleHQgKmgsIEgyNjRQaWN0dXJlICpwaWMsIGludCByZWZtYXNrKQoreworICAgIGludCBpOworICAgIGlmIChwaWMtPnJlZmVyZW5jZSAmPSByZWZtYXNrKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvcihpID0gMDsgaC0+ZGVsYXllZF9waWNbaV07IGkrKykKKyAgICAgICAgICAgIGlmKHBpYyA9PSBoLT5kZWxheWVkX3BpY1tpXSl7CisgICAgICAgICAgICAgICAgcGljLT5yZWZlcmVuY2UgPSBERUxBWUVEX1BJQ19SRUY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworLyoqCisgKiBGaW5kIGEgSDI2NFBpY3R1cmUgaW4gdGhlIHNob3J0IHRlcm0gcmVmZXJlbmNlIGxpc3QgYnkgZnJhbWUgbnVtYmVyLgorICogQHBhcmFtIGZyYW1lX251bSBmcmFtZSBudW1iZXIgdG8gc2VhcmNoIGZvcgorICogQHBhcmFtIGlkeCB0aGUgaW5kZXggaW50byBoLT5zaG9ydF9yZWYgd2hlcmUgcmV0dXJuZWQgcGljdHVyZSBpcyBmb3VuZAorICogICAgICAgICAgICB1bmRlZmluZWQgaWYgbm8gcGljdHVyZSBmb3VuZC4KKyAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgZm91bmQgcGljdHVyZSwgb3IgTlVMTCBpZiBubyBwaWMgd2l0aCB0aGUgcHJvdmlkZWQKKyAqICAgICAgICAgICAgICAgICBmcmFtZSBudW1iZXIgaXMgZm91bmQKKyAqLworc3RhdGljIEgyNjRQaWN0dXJlICpmaW5kX3Nob3J0KEgyNjRDb250ZXh0ICpoLCBpbnQgZnJhbWVfbnVtLCBpbnQgKmlkeCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoLT5zaG9ydF9yZWZfY291bnQ7IGkrKykgeworICAgICAgICBIMjY0UGljdHVyZSAqcGljID0gaC0+c2hvcnRfcmVmW2ldOworICAgICAgICBpZiAoaC0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfTU1DTykKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiJWQgJWQgJXBcbiIsIGksIHBpYy0+ZnJhbWVfbnVtLCBwaWMpOworICAgICAgICBpZiAocGljLT5mcmFtZV9udW0gPT0gZnJhbWVfbnVtKSB7CisgICAgICAgICAgICAqaWR4ID0gaTsKKyAgICAgICAgICAgIHJldHVybiBwaWM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogUmVtb3ZlIGEgcGljdHVyZSBmcm9tIHRoZSBzaG9ydCB0ZXJtIHJlZmVyZW5jZSBsaXN0IGJ5IGl0cyBpbmRleCBpbgorICogdGhhdCBsaXN0LiAgVGhpcyBkb2VzIG5vIGNoZWNraW5nIG9uIHRoZSBwcm92aWRlZCBpbmRleDsgaXQgaXMgYXNzdW1lZAorICogdG8gYmUgdmFsaWQuIE90aGVyIGxpc3QgZW50cmllcyBhcmUgc2hpZnRlZCBkb3duLgorICogQHBhcmFtIGkgaW5kZXggaW50byBoLT5zaG9ydF9yZWYgb2YgcGljdHVyZSB0byByZW1vdmUuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9zaG9ydF9hdF9pbmRleChIMjY0Q29udGV4dCAqaCwgaW50IGkpCit7CisgICAgYXNzZXJ0KGkgPj0gMCAmJiBpIDwgaC0+c2hvcnRfcmVmX2NvdW50KTsKKyAgICBoLT5zaG9ydF9yZWZbaV0gPSBOVUxMOworICAgIGlmICgtLWgtPnNob3J0X3JlZl9jb3VudCkKKyAgICAgICAgbWVtbW92ZSgmaC0+c2hvcnRfcmVmW2ldLCAmaC0+c2hvcnRfcmVmW2kgKyAxXSwKKyAgICAgICAgICAgICAgICAoaC0+c2hvcnRfcmVmX2NvdW50IC0gaSkgKiBzaXplb2YoSDI2NFBpY3R1cmUqKSk7Cit9CisKKy8qKgorICoKKyAqIEByZXR1cm4gdGhlIHJlbW92ZWQgcGljdHVyZSBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycworICovCitzdGF0aWMgSDI2NFBpY3R1cmUgKnJlbW92ZV9zaG9ydChIMjY0Q29udGV4dCAqaCwgaW50IGZyYW1lX251bSwgaW50IHJlZl9tYXNrKQoreworICAgIEgyNjRQaWN0dXJlICpwaWM7CisgICAgaW50IGk7CisKKyAgICBpZiAoaC0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfTU1DTykKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJyZW1vdmUgc2hvcnQgJWQgY291bnQgJWRcbiIsIGZyYW1lX251bSwgaC0+c2hvcnRfcmVmX2NvdW50KTsKKworICAgIHBpYyA9IGZpbmRfc2hvcnQoaCwgZnJhbWVfbnVtLCAmaSk7CisgICAgaWYgKHBpYykgeworICAgICAgICBpZiAodW5yZWZlcmVuY2VfcGljKGgsIHBpYywgcmVmX21hc2spKQorICAgICAgICAgICAgcmVtb3ZlX3Nob3J0X2F0X2luZGV4KGgsIGkpOworICAgIH0KKworICAgIHJldHVybiBwaWM7Cit9CisKKy8qKgorICogUmVtb3ZlIGEgcGljdHVyZSBmcm9tIHRoZSBsb25nIHRlcm0gcmVmZXJlbmNlIGxpc3QgYnkgaXRzIGluZGV4IGluCisgKiB0aGF0IGxpc3QuCisgKiBAcmV0dXJuIHRoZSByZW1vdmVkIHBpY3R1cmUgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnMKKyAqLworc3RhdGljIEgyNjRQaWN0dXJlICpyZW1vdmVfbG9uZyhIMjY0Q29udGV4dCAqaCwgaW50IGksIGludCByZWZfbWFzaykKK3sKKyAgICBIMjY0UGljdHVyZSAqcGljOworCisgICAgcGljID0gaC0+bG9uZ19yZWZbaV07CisgICAgaWYgKHBpYykgeworICAgICAgICBpZiAodW5yZWZlcmVuY2VfcGljKGgsIHBpYywgcmVmX21hc2spKSB7CisgICAgICAgICAgICBhc3NlcnQoaC0+bG9uZ19yZWZbaV0tPmxvbmdfcmVmID09IDEpOworICAgICAgICAgICAgaC0+bG9uZ19yZWZbaV0tPmxvbmdfcmVmID0gMDsKKyAgICAgICAgICAgIGgtPmxvbmdfcmVmW2ldICAgICAgICAgICA9IE5VTEw7CisgICAgICAgICAgICBoLT5sb25nX3JlZl9jb3VudC0tOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBpYzsKK30KKwordm9pZCBmZl9oMjY0X3JlbW92ZV9hbGxfcmVmcyhIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIHJlbW92ZV9sb25nKGgsIGksIDApOworICAgIH0KKyAgICBhc3NlcnQoaC0+bG9uZ19yZWZfY291bnQgPT0gMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaC0+c2hvcnRfcmVmX2NvdW50OyBpKyspIHsKKyAgICAgICAgdW5yZWZlcmVuY2VfcGljKGgsIGgtPnNob3J0X3JlZltpXSwgMCk7CisgICAgICAgIGgtPnNob3J0X3JlZltpXSA9IE5VTEw7CisgICAgfQorICAgIGgtPnNob3J0X3JlZl9jb3VudCA9IDA7CisKKyAgICBtZW1zZXQoaC0+ZGVmYXVsdF9yZWZfbGlzdCwgMCwgc2l6ZW9mKGgtPmRlZmF1bHRfcmVmX2xpc3QpKTsKKyAgICBtZW1zZXQoaC0+cmVmX2xpc3QsIDAsIHNpemVvZihoLT5yZWZfbGlzdCkpOworfQorCisvKioKKyAqIHByaW50IHNob3J0IHRlcm0gbGlzdAorICovCitzdGF0aWMgdm9pZCBwcmludF9zaG9ydF90ZXJtKEgyNjRDb250ZXh0ICpoKQoreworICAgIHVpbnQzMl90IGk7CisgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX01NQ08pIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJzaG9ydCB0ZXJtIGxpc3Q6XG4iKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPnNob3J0X3JlZl9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBIMjY0UGljdHVyZSAqcGljID0gaC0+c2hvcnRfcmVmW2ldOworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICIlIlBSSXUzMiIgZm46JWQgcG9jOiVkICVwXG4iLAorICAgICAgICAgICAgICAgICAgIGksIHBpYy0+ZnJhbWVfbnVtLCBwaWMtPnBvYywgcGljLT5mLmRhdGFbMF0pOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIHByaW50IGxvbmcgdGVybSBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2xvbmdfdGVybShIMjY0Q29udGV4dCAqaCkKK3sKKyAgICB1aW50MzJfdCBpOworICAgIGlmIChoLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19NTUNPKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAibG9uZyB0ZXJtIGxpc3Q6XG4iKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgIEgyNjRQaWN0dXJlICpwaWMgPSBoLT5sb25nX3JlZltpXTsKKyAgICAgICAgICAgIGlmIChwaWMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgIiUiUFJJdTMyIiBmbjolZCBwb2M6JWQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGksIHBpYy0+ZnJhbWVfbnVtLCBwaWMtPnBvYywgcGljLT5mLmRhdGFbMF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGNoZWNrX29wY29kZXMoTU1DTyAqbW1jbzEsIE1NQ08gKm1tY28yLCBpbnQgbl9tbWNvcykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuX21tY29zOyBpKyspIHsKKyAgICAgICAgaWYgKG1tY28xW2ldLm9wY29kZSAhPSBtbWNvMltpXS5vcGNvZGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJNTUNPIG9wY29kZSBbJWQsICVkXSBhdCAlZCBtaXNtYXRjaGVzIGJldHdlZW4gc2xpY2VzXG4iLAorICAgICAgICAgICAgICAgICAgIG1tY28xW2ldLm9wY29kZSwgbW1jbzJbaV0ub3Bjb2RlLCBpKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfZ2VuZXJhdGVfc2xpZGluZ193aW5kb3dfbW1jb3MoSDI2NENvbnRleHQgKmgsIGludCBmaXJzdF9zbGljZSkKK3sKKyAgICBNTUNPIG1tY29fdGVtcFtNQVhfTU1DT19DT1VOVF0sICptbWNvID0gZmlyc3Rfc2xpY2UgPyBoLT5tbWNvIDogbW1jb190ZW1wOworICAgIGludCBtbWNvX2luZGV4ID0gMCwgaSA9IDA7CisKKyAgICBpZiAoaC0+c2hvcnRfcmVmX2NvdW50ICYmCisgICAgICAgIGgtPmxvbmdfcmVmX2NvdW50ICsgaC0+c2hvcnRfcmVmX2NvdW50ID49IGgtPnNwcy5yZWZfZnJhbWVfY291bnQgJiYKKyAgICAgICAgIShGSUVMRF9QSUNUVVJFKGgpICYmICFoLT5maXJzdF9maWVsZCAmJiBoLT5jdXJfcGljX3B0ci0+cmVmZXJlbmNlKSkgeworICAgICAgICBtbWNvWzBdLm9wY29kZSAgICAgICAgPSBNTUNPX1NIT1JUMlVOVVNFRDsKKyAgICAgICAgbW1jb1swXS5zaG9ydF9waWNfbnVtID0gaC0+c2hvcnRfcmVmW2gtPnNob3J0X3JlZl9jb3VudCAtIDFdLT5mcmFtZV9udW07CisgICAgICAgIG1tY29faW5kZXggICAgICAgICAgICA9IDE7CisgICAgICAgIGlmIChGSUVMRF9QSUNUVVJFKGgpKSB7CisgICAgICAgICAgICBtbWNvWzBdLnNob3J0X3BpY19udW0gKj0gMjsKKyAgICAgICAgICAgIG1tY29bMV0ub3Bjb2RlICAgICAgICAgPSBNTUNPX1NIT1JUMlVOVVNFRDsKKyAgICAgICAgICAgIG1tY29bMV0uc2hvcnRfcGljX251bSAgPSBtbWNvWzBdLnNob3J0X3BpY19udW0gKyAxOworICAgICAgICAgICAgbW1jb19pbmRleCAgICAgICAgICAgICA9IDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmlyc3Rfc2xpY2UpIHsKKyAgICAgICAgaC0+bW1jb19pbmRleCA9IG1tY29faW5kZXg7CisgICAgfSBlbHNlIGlmICghZmlyc3Rfc2xpY2UgJiYgbW1jb19pbmRleCA+PSAwICYmCisgICAgICAgICAgICAgICAobW1jb19pbmRleCAhPSBoLT5tbWNvX2luZGV4IHx8CisgICAgICAgICAgICAgICAgKGkgPSBjaGVja19vcGNvZGVzKGgtPm1tY28sIG1tY29fdGVtcCwgbW1jb19pbmRleCkpKSkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbmNvbnNpc3RlbnQgTU1DTyBzdGF0ZSBiZXR3ZWVuIHNsaWNlcyBbJWQsICVkXVxuIiwKKyAgICAgICAgICAgICAgIG1tY29faW5kZXgsIGgtPm1tY29faW5kZXgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9oMjY0X2V4ZWN1dGVfcmVmX3BpY19tYXJraW5nKEgyNjRDb250ZXh0ICpoLCBNTUNPICptbWNvLCBpbnQgbW1jb19jb3VudCkKK3sKKyAgICBpbnQgaSwgYXZfdW5pbml0KGopOworICAgIGludCBwcHNfY291bnQ7CisgICAgaW50IGN1cnJlbnRfcmVmX2Fzc2lnbmVkID0gMCwgZXJyID0gMDsKKyAgICBIMjY0UGljdHVyZSAqYXZfdW5pbml0KHBpYyk7CisKKyAgICBpZiAoKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX01NQ08pICYmIG1tY29fY291bnQgPT0gMCkKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJubyBtbWNvIGhlcmVcbiIpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1tY29fY291bnQ7IGkrKykgeworICAgICAgICBpbnQgYXZfdW5pbml0KHN0cnVjdHVyZSksIGF2X3VuaW5pdChmcmFtZV9udW0pOworICAgICAgICBpZiAoaC0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfTU1DTykKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAibW1jbzolZCAlZCAlZFxuIiwgaC0+bW1jb1tpXS5vcGNvZGUsCisgICAgICAgICAgICAgICAgICAgaC0+bW1jb1tpXS5zaG9ydF9waWNfbnVtLCBoLT5tbWNvW2ldLmxvbmdfYXJnKTsKKworICAgICAgICBpZiAobW1jb1tpXS5vcGNvZGUgPT0gTU1DT19TSE9SVDJVTlVTRUQgfHwKKyAgICAgICAgICAgIG1tY29baV0ub3Bjb2RlID09IE1NQ09fU0hPUlQyTE9ORykgeworICAgICAgICAgICAgZnJhbWVfbnVtID0gcGljX251bV9leHRyYWN0KGgsIG1tY29baV0uc2hvcnRfcGljX251bSwgJnN0cnVjdHVyZSk7CisgICAgICAgICAgICBwaWMgICAgICAgPSBmaW5kX3Nob3J0KGgsIGZyYW1lX251bSwgJmopOworICAgICAgICAgICAgaWYgKCFwaWMpIHsKKyAgICAgICAgICAgICAgICBpZiAobW1jb1tpXS5vcGNvZGUgIT0gTU1DT19TSE9SVDJMT05HIHx8CisgICAgICAgICAgICAgICAgICAgICFoLT5sb25nX3JlZlttbWNvW2ldLmxvbmdfYXJnXSAgICB8fAorICAgICAgICAgICAgICAgICAgICBoLT5sb25nX3JlZlttbWNvW2ldLmxvbmdfYXJnXS0+ZnJhbWVfbnVtICE9IGZyYW1lX251bSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIGgtPnNob3J0X3JlZl9jb3VudCA/IEFWX0xPR19FUlJPUiA6IEFWX0xPR19ERUJVRywgIm1tY286IHVucmVmIHNob3J0IGZhaWx1cmVcbiIpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobW1jb1tpXS5vcGNvZGUpIHsKKyAgICAgICAgY2FzZSBNTUNPX1NIT1JUMlVOVVNFRDoKKyAgICAgICAgICAgIGlmIChoLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19NTUNPKQorICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAibW1jbzogdW5yZWYgc2hvcnQgJWQgY291bnQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGgtPm1tY29baV0uc2hvcnRfcGljX251bSwgaC0+c2hvcnRfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIHJlbW92ZV9zaG9ydChoLCBmcmFtZV9udW0sIHN0cnVjdHVyZSBeIFBJQ1RfRlJBTUUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1DT19TSE9SVDJMT05HOgorICAgICAgICAgICAgICAgIGlmIChoLT5sb25nX3JlZlttbWNvW2ldLmxvbmdfYXJnXSAhPSBwaWMpCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9sb25nKGgsIG1tY29baV0ubG9uZ19hcmcsIDApOworCisgICAgICAgICAgICAgICAgcmVtb3ZlX3Nob3J0X2F0X2luZGV4KGgsIGopOworICAgICAgICAgICAgICAgIGgtPmxvbmdfcmVmWyBtbWNvW2ldLmxvbmdfYXJnIF0gPSBwaWM7CisgICAgICAgICAgICAgICAgaWYgKGgtPmxvbmdfcmVmW21tY29baV0ubG9uZ19hcmddKSB7CisgICAgICAgICAgICAgICAgICAgIGgtPmxvbmdfcmVmW21tY29baV0ubG9uZ19hcmddLT5sb25nX3JlZiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGgtPmxvbmdfcmVmX2NvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1DT19MT05HMlVOVVNFRDoKKyAgICAgICAgICAgIGogICA9IHBpY19udW1fZXh0cmFjdChoLCBtbWNvW2ldLmxvbmdfYXJnLCAmc3RydWN0dXJlKTsKKyAgICAgICAgICAgIHBpYyA9IGgtPmxvbmdfcmVmW2pdOworICAgICAgICAgICAgaWYgKHBpYykgeworICAgICAgICAgICAgICAgIHJlbW92ZV9sb25nKGgsIGosIHN0cnVjdHVyZSBeIFBJQ1RfRlJBTUUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChoLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19NTUNPKQorICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAibW1jbzogdW5yZWYgbG9uZyBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1NQ09fTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29tbWVudCBiZWxvdyBsZWZ0IGZyb20gcHJldmlvdXMgY29kZSBhcyBpdCBpcyBhbiBpbnRlcnJlc3Rpbmcgbm90ZS4KKyAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgZmllbGQgaW4gcGFpciBpcyBpbiBzaG9ydCB0ZXJtIGxpc3Qgb3IKKyAgICAgICAgICAgICAgICAgICAgICogYXQgYSBkaWZmZXJlbnQgbG9uZyB0ZXJtIGluZGV4LgorICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIG5vdCBhbGxvd2VkOyBzZWUgNy40LjMuMywgbm90ZXMgMiBhbmQgMy4KKyAgICAgICAgICAgICAgICAgICAgICogUmVwb3J0IHRoZSBwcm9ibGVtIGFuZCBrZWVwIHRoZSBwYWlyIHdoZXJlIGl0IGlzLAorICAgICAgICAgICAgICAgICAgICAgKiBhbmQgbWFyayB0aGlzIGZpZWxkIHZhbGlkLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChoLT5zaG9ydF9yZWZbMF0gPT0gaC0+Y3VyX3BpY19wdHIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1tY286IGNhbm5vdCBhc3NpZ24gY3VycmVudCBwaWN0dXJlIHRvIHNob3J0IGFuZCBsb25nIGF0IHRoZSBzYW1lIHRpbWVcbiIpOworICAgICAgICAgICAgICAgIHJlbW92ZV9zaG9ydF9hdF9pbmRleChoLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGgtPmxvbmdfcmVmW21tY29baV0ubG9uZ19hcmddICE9IGgtPmN1cl9waWNfcHRyKSB7CisgICAgICAgICAgICAgICAgaWYgKGgtPmN1cl9waWNfcHRyLT5sb25nX3JlZikgeworICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wOyBqPDE2OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGgtPmxvbmdfcmVmW2pdID09IGgtPmN1cl9waWNfcHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2xvbmcoaCwgaiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJtbWNvOiBjYW5ub3QgYXNzaWduIGN1cnJlbnQgcGljdHVyZSB0byAyIGxvbmcgdGVybSByZWZlcmVuY2VzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKCFoLT5jdXJfcGljX3B0ci0+bG9uZ19yZWYpOworICAgICAgICAgICAgICAgIHJlbW92ZV9sb25nKGgsIG1tY29baV0ubG9uZ19hcmcsIDApOworCisgICAgICAgICAgICAgICAgaC0+bG9uZ19yZWZbbW1jb1tpXS5sb25nX2FyZ10gICAgICAgICAgID0gaC0+Y3VyX3BpY19wdHI7CisgICAgICAgICAgICAgICAgaC0+bG9uZ19yZWZbbW1jb1tpXS5sb25nX2FyZ10tPmxvbmdfcmVmID0gMTsKKyAgICAgICAgICAgICAgICBoLT5sb25nX3JlZl9jb3VudCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoLT5jdXJfcGljX3B0ci0+cmVmZXJlbmNlIHw9IGgtPnBpY3R1cmVfc3RydWN0dXJlOworICAgICAgICAgICAgY3VycmVudF9yZWZfYXNzaWduZWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1DT19TRVRfTUFYX0xPTkc6CisgICAgICAgICAgICBhc3NlcnQobW1jb1tpXS5sb25nX2FyZyA8PSAxNik7CisgICAgICAgICAgICAvLyBqdXN0IHJlbW92ZSB0aGUgbG9uZyB0ZXJtIHdoaWNoIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiBuZXcgbWF4CisgICAgICAgICAgICBmb3IgKGogPSBtbWNvW2ldLmxvbmdfYXJnOyBqIDwgMTY7IGorKykgeworICAgICAgICAgICAgICAgIHJlbW92ZV9sb25nKGgsIGosIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1DT19SRVNFVDoKKyAgICAgICAgICAgIHdoaWxlIChoLT5zaG9ydF9yZWZfY291bnQpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVfc2hvcnQoaCwgaC0+c2hvcnRfcmVmWzBdLT5mcmFtZV9udW0sIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKyAgICAgICAgICAgICAgICByZW1vdmVfbG9uZyhoLCBqLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGgtPmZyYW1lX251bSAgPSBoLT5jdXJfcGljX3B0ci0+ZnJhbWVfbnVtID0gMDsKKyAgICAgICAgICAgIGgtPm1tY29fcmVzZXQgPSAxOworICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPm1tY29fcmVzZXQgPSAxOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE1BWF9ERUxBWUVEX1BJQ19DT1VOVDsgaisrKQorICAgICAgICAgICAgICAgIGgtPmxhc3RfcG9jc1tqXSA9IElOVF9NSU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYXNzZXJ0KDApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjdXJyZW50X3JlZl9hc3NpZ25lZCkgeworICAgICAgICAvKiBTZWNvbmQgZmllbGQgb2YgY29tcGxlbWVudGFyeSBmaWVsZCBwYWlyOyB0aGUgZmlyc3QgZmllbGQgb2YKKyAgICAgICAgICogd2hpY2ggaXMgYWxyZWFkeSByZWZlcmVuY2VkLiBJZiBzaG9ydCByZWZlcmVuY2VkLCBpdAorICAgICAgICAgKiBzaG91bGQgYmUgZmlyc3QgZW50cnkgaW4gc2hvcnRfcmVmLiBJZiBub3QsIGl0IG11c3QgZXhpc3QKKyAgICAgICAgICogaW4gbG9uZ19yZWY7IHRyeWluZyB0byBwdXQgaXQgb24gdGhlIHNob3J0IGxpc3QgaGVyZSBpcyBhbgorICAgICAgICAgKiBlcnJvciBpbiB0aGUgZW5jb2RlZCBiaXQgc3RyZWFtIChyZWY6IDcuNC4zLjMsIE5PVEUgMiBhbmQgMykuCisgICAgICAgICAqLworICAgICAgICBpZiAoaC0+c2hvcnRfcmVmX2NvdW50ICYmIGgtPnNob3J0X3JlZlswXSA9PSBoLT5jdXJfcGljX3B0cikgeworICAgICAgICAgICAgLyogSnVzdCBtYXJrIHRoZSBzZWNvbmQgZmllbGQgdmFsaWQgKi8KKyAgICAgICAgICAgIGgtPmN1cl9waWNfcHRyLT5yZWZlcmVuY2UgPSBQSUNUX0ZSQU1FOworICAgICAgICB9IGVsc2UgaWYgKGgtPmN1cl9waWNfcHRyLT5sb25nX3JlZikgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIHNob3J0IHRlcm0gcmVmZXJlbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzaWdubWVudCBmb3Igc2Vjb25kIGZpZWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gY29tcGxlbWVudGFyeSBmaWVsZCBwYWlyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGZpcnN0IGZpZWxkIGlzIGxvbmcgdGVybSlcbiIpOworICAgICAgICAgICAgZXJyID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBpYyA9IHJlbW92ZV9zaG9ydChoLCBoLT5jdXJfcGljX3B0ci0+ZnJhbWVfbnVtLCAwKTsKKyAgICAgICAgICAgIGlmIChwaWMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgc2hvcnQgdGVybSBidWZmZXIgc3RhdGUgZGV0ZWN0ZWRcbiIpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoLT5zaG9ydF9yZWZfY291bnQpCisgICAgICAgICAgICAgICAgbWVtbW92ZSgmaC0+c2hvcnRfcmVmWzFdLCAmaC0+c2hvcnRfcmVmWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgaC0+c2hvcnRfcmVmX2NvdW50ICogc2l6ZW9mKEgyNjRQaWN0dXJlKikpOworCisgICAgICAgICAgICBoLT5zaG9ydF9yZWZbMF0gPSBoLT5jdXJfcGljX3B0cjsKKyAgICAgICAgICAgIGgtPnNob3J0X3JlZl9jb3VudCsrOworICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPnJlZmVyZW5jZSB8PSBoLT5waWN0dXJlX3N0cnVjdHVyZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoLT5sb25nX3JlZl9jb3VudCArIGgtPnNob3J0X3JlZl9jb3VudCA+IEZGTUFYKGgtPnNwcy5yZWZfZnJhbWVfY291bnQsIDEpKSB7CisKKyAgICAgICAgLyogV2UgaGF2ZSB0b28gbWFueSByZWZlcmVuY2UgZnJhbWVzLCBwcm9iYWJseSBkdWUgdG8gY29ycnVwdGVkCisgICAgICAgICAqIHN0cmVhbS4gTmVlZCB0byBkaXNjYXJkIG9uZSBmcmFtZS4gUHJldmVudHMgb3ZlcnJ1biBvZiB0aGUKKyAgICAgICAgICogc2hvcnRfcmVmIGFuZCBsb25nX3JlZiBidWZmZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAibnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgKCVkKyVkKSBleGNlZWRzIG1heCAoJWQ7IHByb2JhYmx5ICIKKyAgICAgICAgICAgICAgICJjb3JydXB0IGlucHV0KSwgZGlzY2FyZGluZyBvbmVcbiIsCisgICAgICAgICAgICAgICBoLT5sb25nX3JlZl9jb3VudCwgaC0+c2hvcnRfcmVmX2NvdW50LCBoLT5zcHMucmVmX2ZyYW1lX2NvdW50KTsKKyAgICAgICAgZXJyID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBpZiAoaC0+bG9uZ19yZWZfY291bnQgJiYgIWgtPnNob3J0X3JlZl9jb3VudCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCisgICAgICAgICAgICAgICAgaWYgKGgtPmxvbmdfcmVmW2ldKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgYXNzZXJ0KGkgPCAxNik7CisgICAgICAgICAgICByZW1vdmVfbG9uZyhoLCBpLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBpYyA9IGgtPnNob3J0X3JlZltoLT5zaG9ydF9yZWZfY291bnQgLSAxXTsKKyAgICAgICAgICAgIHJlbW92ZV9zaG9ydChoLCBwaWMtPmZyYW1lX251bSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpPGgtPnNob3J0X3JlZl9jb3VudDsgaSsrKSB7CisgICAgICAgIHBpYyA9IGgtPnNob3J0X3JlZltpXTsKKyAgICAgICAgaWYgKHBpYy0+aW52YWxpZF9nYXApIHsKKyAgICAgICAgICAgIGludCBkID0gKGgtPmN1cl9waWNfcHRyLT5mcmFtZV9udW0gLSBwaWMtPmZyYW1lX251bSkgJiAoKDEgPDwgaC0+c3BzLmxvZzJfbWF4X2ZyYW1lX251bSktMSk7CisgICAgICAgICAgICBpZiAoZCA+IGgtPnNwcy5yZWZfZnJhbWVfY291bnQpCisgICAgICAgICAgICAgICAgcmVtb3ZlX3Nob3J0KGgsIHBpYy0+ZnJhbWVfbnVtLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaW50X3Nob3J0X3Rlcm0oaCk7CisgICAgcHJpbnRfbG9uZ190ZXJtKGgpOworCisgICAgcHBzX2NvdW50ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoaC0+cHBzX2J1ZmZlcnMpOyBpKyspCisgICAgICAgIHBwc19jb3VudCArPSAhIWgtPnBwc19idWZmZXJzW2ldOworCisgICAgaWYgKCAgIGVyciA+PSAwCisgICAgICAgICYmIGgtPmxvbmdfcmVmX2NvdW50PT0wCisgICAgICAgICYmIChoLT5zaG9ydF9yZWZfY291bnQ8PTIgfHwgaC0+cHBzLnJlZl9jb3VudFswXSA8PSAxICYmIGgtPnBwcy5yZWZfY291bnRbMV0gPD0gMSAmJiBwcHNfY291bnQgPT0gMSkKKyAgICAgICAgJiYgaC0+cHBzLnJlZl9jb3VudFswXTw9MiArIChoLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FKSArICgyKiFoLT5oYXNfcmVjb3ZlcnlfcG9pbnQpCisgICAgICAgICYmIGgtPmN1cl9waWNfcHRyLT5mLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSl7CisgICAgICAgIGgtPmN1cl9waWNfcHRyLT5yZWNvdmVyZWQgfD0gMTsKKyAgICAgICAgaWYoIWgtPmF2Y3R4LT5oYXNfYl9mcmFtZXMpCisgICAgICAgICAgICBoLT5mcmFtZV9yZWNvdmVyZWQgfD0gRlJBTUVfUkVDT1ZFUkVEX1NFSTsKKyAgICB9CisKKyAgICByZXR1cm4gKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSA/IGVyciA6IDA7Cit9CisKK2ludCBmZl9oMjY0X2RlY29kZV9yZWZfcGljX21hcmtpbmcoSDI2NENvbnRleHQgKmgsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3Rfc2xpY2UpCit7CisgICAgaW50IGksIHJldDsKKyAgICBNTUNPIG1tY29fdGVtcFtNQVhfTU1DT19DT1VOVF0sICptbWNvID0gbW1jb190ZW1wOworICAgIGludCBtbWNvX2luZGV4ID0gMDsKKworICAgIGlmIChoLT5uYWxfdW5pdF90eXBlID09IE5BTF9JRFJfU0xJQ0UpIHsgLy8gRklYTUUgZmllbGRzCisgICAgICAgIHNraXBfYml0czEoZ2IpOyAvLyBicm9rZW5fbGluaworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgbW1jb1swXS5vcGNvZGUgICA9IE1NQ09fTE9ORzsKKyAgICAgICAgICAgIG1tY29bMF0ubG9uZ19hcmcgPSAwOworICAgICAgICAgICAgbW1jb19pbmRleCAgICAgICA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvLyBhZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01NQ09fQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgICAgIE1NQ09PcGNvZGUgb3Bjb2RlID0gZ2V0X3VlX2dvbG9tYl8zMShnYik7CisKKyAgICAgICAgICAgICAgICBtbWNvW2ldLm9wY29kZSA9IG9wY29kZTsKKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE1NQ09fU0hPUlQyVU5VU0VEIHx8IG9wY29kZSA9PSBNTUNPX1NIT1JUMkxPTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgbW1jb1tpXS5zaG9ydF9waWNfbnVtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChoLT5jdXJyX3BpY19udW0gLSBnZXRfdWVfZ29sb21iKGdiKSAtIDEpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaC0+bWF4X3BpY19udW0gLSAxKTsKKyNpZiAwCisgICAgICAgICAgICAgICAgICAgIGlmIChtbWNvW2ldLnNob3J0X3BpY19udW0gPj0gaC0+c2hvcnRfcmVmX2NvdW50IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhaC0+c2hvcnRfcmVmW21tY29baV0uc2hvcnRfcGljX251bV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHNob3J0IHJlZiBpbiBtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlcmF0aW9uICVkXG4iLCBtbWNvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gTU1DT19TSE9SVDJMT05HIHx8IG9wY29kZSA9PSBNTUNPX0xPTkcyVU5VU0VEIHx8CisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9PSBNTUNPX0xPTkcgfHwgb3Bjb2RlID09IE1NQ09fU0VUX01BWF9MT05HKSB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsb25nX2FyZyA9IGdldF91ZV9nb2xvbWJfMzEoZ2IpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9uZ19hcmcgPj0gMzIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nX2FyZyA+PSAxNiAmJiAhKG9wY29kZSA9PSBNTUNPX1NFVF9NQVhfTE9ORyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ19hcmcgPT0gMTYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIShvcGNvZGUgPT0gTU1DT19MT05HMlVOVVNFRCAmJiBGSUVMRF9QSUNUVVJFKGgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIGxvbmcgcmVmIGluIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVyYXRpb24gJWRcbiIsIG9wY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbW1jb1tpXS5sb25nX2FyZyA9IGxvbmdfYXJnOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPiAodW5zaWduZWQpIE1NQ09fTE9ORykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9uICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE1NQ09fRU5EKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1tY29faW5kZXggPSBpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGZpcnN0X3NsaWNlKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfZ2VuZXJhdGVfc2xpZGluZ193aW5kb3dfbW1jb3MoaCwgZmlyc3Rfc2xpY2UpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwICYmIGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW1jb19pbmRleCA9IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZpcnN0X3NsaWNlICYmIG1tY29faW5kZXggIT0gLTEpIHsKKyAgICAgICAgbWVtY3B5KGgtPm1tY28sIG1tY29fdGVtcCwgc2l6ZW9mKGgtPm1tY28pKTsKKyAgICAgICAgaC0+bW1jb19pbmRleCA9IG1tY29faW5kZXg7CisgICAgfSBlbHNlIGlmICghZmlyc3Rfc2xpY2UgJiYgbW1jb19pbmRleCA+PSAwICYmCisgICAgICAgICAgICAgICAobW1jb19pbmRleCAhPSBoLT5tbWNvX2luZGV4IHx8CisgICAgICAgICAgICAgICAgY2hlY2tfb3Bjb2RlcyhoLT5tbWNvLCBtbWNvX3RlbXAsIG1tY29faW5kZXgpKSkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbmNvbnNpc3RlbnQgTU1DTyBzdGF0ZSBiZXR3ZWVuIHNsaWNlcyBbJWQsICVkXVxuIiwKKyAgICAgICAgICAgICAgIG1tY29faW5kZXgsIGgtPm1tY29faW5kZXgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRfc2VpLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X3NlaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTY5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X3NlaS5jCkBAIC0wLDAgKzEsNDAyIEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gc2VpIGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgc2VpIGRlY29kaW5nLgorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBjb25zdCB1aW50OF90IHNlaV9udW1fY2xvY2tfdHNfdGFibGVbOV0gPSB7CisgICAgMSwgMSwgMSwgMiwgMiwgMywgMywgMiwgMworfTsKKwordm9pZCBmZl9oMjY0X3Jlc2V0X3NlaShIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBoLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250ICAgICAgID0gLTE7CisgICAgaC0+c2VpX2RwYl9vdXRwdXRfZGVsYXkgICAgICAgICA9ICAwOworICAgIGgtPnNlaV9jcGJfcmVtb3ZhbF9kZWxheSAgICAgICAgPSAtMTsKKyAgICBoLT5zZWlfYnVmZmVyaW5nX3BlcmlvZF9wcmVzZW50ID0gIDA7CisgICAgaC0+c2VpX2ZyYW1lX3BhY2tpbmdfcHJlc2VudCAgICA9ICAwOworICAgIGgtPnNlaV9kaXNwbGF5X29yaWVudGF0aW9uX3ByZXNlbnQgPSAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9waWN0dXJlX3RpbWluZyhIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBTUFMgKnNwcyA9ICZoLT5zcHM7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpPE1BWF9TUFNfQ09VTlQ7IGkrKykKKyAgICAgICAgaWYgKCFzcHMtPmxvZzJfbWF4X2ZyYW1lX251bSAmJiBoLT5zcHNfYnVmZmVyc1tpXSkKKyAgICAgICAgICAgIHNwcyA9IGgtPnNwc19idWZmZXJzW2ldOworCisgICAgaWYgKHNwcy0+bmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyB8fCBzcHMtPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgaC0+c2VpX2NwYl9yZW1vdmFsX2RlbGF5ID0gZ2V0X2JpdHNfbG9uZygmaC0+Z2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT5jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGgpOworICAgICAgICBoLT5zZWlfZHBiX291dHB1dF9kZWxheSAgPSBnZXRfYml0c19sb25nKCZoLT5nYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHMtPmRwYl9vdXRwdXRfZGVsYXlfbGVuZ3RoKTsKKyAgICB9CisgICAgaWYgKHNwcy0+cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGksIG51bV9jbG9ja190czsKKworICAgICAgICBoLT5zZWlfcGljX3N0cnVjdCA9IGdldF9iaXRzKCZoLT5nYiwgNCk7CisgICAgICAgIGgtPnNlaV9jdF90eXBlICAgID0gMDsKKworICAgICAgICBpZiAoaC0+c2VpX3BpY19zdHJ1Y3QgPiBTRUlfUElDX1NUUlVDVF9GUkFNRV9UUklQTElORykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIG51bV9jbG9ja190cyA9IHNlaV9udW1fY2xvY2tfdHNfdGFibGVbaC0+c2VpX3BpY19zdHJ1Y3RdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY2xvY2tfdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzKCZoLT5nYiwgMSkpIHsgICAgICAgICAgICAgICAgLyogY2xvY2tfdGltZXN0YW1wX2ZsYWcgKi8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZnVsbF90aW1lc3RhbXBfZmxhZzsKKworICAgICAgICAgICAgICAgIGgtPnNlaV9jdF90eXBlIHw9IDEgPDwgZ2V0X2JpdHMoJmgtPmdiLCAyKTsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCAxKTsgICAgICAgICAgICAgICAgIC8qIG51aXRfZmllbGRfYmFzZWRfZmxhZyAqLworICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDUpOyAgICAgICAgICAgICAgICAgLyogY291bnRpbmdfdHlwZSAqLworICAgICAgICAgICAgICAgIGZ1bGxfdGltZXN0YW1wX2ZsYWcgPSBnZXRfYml0cygmaC0+Z2IsIDEpOworICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDEpOyAgICAgICAgICAgICAgICAgLyogZGlzY29udGludWl0eV9mbGFnICovCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgMSk7ICAgICAgICAgICAgICAgICAvKiBjbnRfZHJvcHBlZF9mbGFnICovCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgOCk7ICAgICAgICAgICAgICAgICAvKiBuX2ZyYW1lcyAqLworICAgICAgICAgICAgICAgIGlmIChmdWxsX3RpbWVzdGFtcF9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDYpOyAgICAgICAgICAgICAvKiBzZWNvbmRzX3ZhbHVlIDAuLjU5ICovCisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDYpOyAgICAgICAgICAgICAvKiBtaW51dGVzX3ZhbHVlIDAuLjU5ICovCisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDUpOyAgICAgICAgICAgICAvKiBob3Vyc192YWx1ZSAwLi4yMyAqLworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0cygmaC0+Z2IsIDEpKSB7ICAgICAgICAvKiBzZWNvbmRzX2ZsYWcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDYpOyAgICAgICAgIC8qIHNlY29uZHNfdmFsdWUgcmFuZ2UgMC4uNTkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0cygmaC0+Z2IsIDEpKSB7ICAgIC8qIG1pbnV0ZXNfZmxhZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDYpOyAgICAgLyogbWludXRlc192YWx1ZSAwLi41OSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0cygmaC0+Z2IsIDEpKSAgLyogaG91cnNfZmxhZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCA1KTsgLyogaG91cnNfdmFsdWUgMC4uMjMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3BzLT50aW1lX29mZnNldF9sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT50aW1lX29mZnNldF9sZW5ndGgpOyAvKiB0aW1lX29mZnNldCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiY3RfdHlwZTolWCBwaWNfc3RydWN0OiVkXG4iLAorICAgICAgICAgICAgICAgICAgIGgtPnNlaV9jdF90eXBlLCBoLT5zZWlfcGljX3N0cnVjdCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV91c2VyX2RhdGFfaXR1X3RfdDM1KEgyNjRDb250ZXh0ICpoLCBpbnQgc2l6ZSkKK3sKKyAgICB1aW50MzJfdCB1c2VyX2lkZW50aWZpZXI7CisgICAgaW50IGR0Z19hY3RpdmVfZm9ybWF0OworCisgICAgaWYgKHNpemUgPCA3KQorICAgICAgICByZXR1cm4gLTE7CisgICAgc2l6ZSAtPSA3OworCisgICAgc2tpcF9iaXRzKCZoLT5nYiwgOCk7ICAgLy8gY291bnRyeV9jb2RlCisgICAgc2tpcF9iaXRzKCZoLT5nYiwgMTYpOyAgLy8gcHJvdmlkZXJfY29kZQorICAgIHVzZXJfaWRlbnRpZmllciA9IGdldF9iaXRzX2xvbmcoJmgtPmdiLCAzMik7CisKKyAgICBzd2l0Y2ggKHVzZXJfaWRlbnRpZmllcikgeworICAgICAgICBjYXNlIDB4NDQ1NDQ3MzE6ICAgIC8vICJEVEcxIiAtIEFGRF9kYXRhCisgICAgICAgICAgICBpZiAoc2l6ZSA8IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgMSk7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMoJmgtPmdiLCAxKSkgeworICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDYpOworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDQpOworICAgICAgICAgICAgICAgIGR0Z19hY3RpdmVfZm9ybWF0ID0gZ2V0X2JpdHMoJmgtPmdiLCA0KTsKKyAgICAgICAgICAgICAgICBoLT5hdmN0eC0+ZHRnX2FjdGl2ZV9mb3JtYXQgPSBkdGdfYWN0aXZlX2Zvcm1hdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIHNpemUgKiA4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV91bnJlZ2lzdGVyZWRfdXNlcl9kYXRhKEgyNjRDb250ZXh0ICpoLCBpbnQgc2l6ZSkKK3sKKyAgICB1aW50OF90IHVzZXJfZGF0YVsxNiArIDI1Nl07CisgICAgaW50IGUsIGJ1aWxkLCBpOworCisgICAgaWYgKHNpemUgPCAxNikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHVzZXJfZGF0YSkgLSAxICYmIGkgPCBzaXplOyBpKyspCisgICAgICAgIHVzZXJfZGF0YVtpXSA9IGdldF9iaXRzKCZoLT5nYiwgOCk7CisKKyAgICB1c2VyX2RhdGFbaV0gPSAwOworICAgIGUgPSBzc2NhbmYodXNlcl9kYXRhICsgMTYsICJ4MjY0IC0gY29yZSAlZCIsICZidWlsZCk7CisgICAgaWYgKGUgPT0gMSAmJiBidWlsZCA+IDApCisgICAgICAgIGgtPngyNjRfYnVpbGQgPSBidWlsZDsKKyAgICBpZiAoZSA9PSAxICYmIGJ1aWxkID09IDEgJiYgIXN0cm5jbXAodXNlcl9kYXRhKzE2LCAieDI2NCAtIGNvcmUgMDAwMCIsIDE2KSkKKyAgICAgICAgaC0+eDI2NF9idWlsZCA9IDY3OworCisgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX0JVR1MpCisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAidXNlciBkYXRhOlwiJXNcIlxuIiwgdXNlcl9kYXRhICsgMTYpOworCisgICAgZm9yICg7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3JlY292ZXJ5X3BvaW50KEgyNjRDb250ZXh0ICpoKQoreworICAgIGgtPnNlaV9yZWNvdmVyeV9mcmFtZV9jbnQgPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7CisKKyAgICAvKiAxYiBleGFjdF9tYXRjaF9mbGFnLAorICAgICAqIDFiIGJyb2tlbl9saW5rX2ZsYWcsCisgICAgICogMmIgY2hhbmdpbmdfc2xpY2VfZ3JvdXBfaWRjICovCisgICAgc2tpcF9iaXRzKCZoLT5nYiwgNCk7CisKKyAgICBpZiAoaC0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgInNlaV9yZWNvdmVyeV9mcmFtZV9jbnQ6ICVkXG4iLCBoLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250KTsKKworICAgIGgtPmhhc19yZWNvdmVyeV9wb2ludCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYnVmZmVyaW5nX3BlcmlvZChIMjY0Q29udGV4dCAqaCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3BzX2lkOworICAgIGludCBzY2hlZF9zZWxfaWR4OworICAgIFNQUyAqc3BzOworCisgICAgc3BzX2lkID0gZ2V0X3VlX2dvbG9tYl8zMSgmaC0+Z2IpOworICAgIGlmIChzcHNfaWQgPiAzMSB8fCAhaC0+c3BzX2J1ZmZlcnNbc3BzX2lkXSkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJub24tZXhpc3RpbmcgU1BTICVkIHJlZmVyZW5jZWQgaW4gYnVmZmVyaW5nIHBlcmlvZFxuIiwgc3BzX2lkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHNwcyA9IGgtPnNwc19idWZmZXJzW3Nwc19pZF07CisKKyAgICAvLyBOT1RFOiBUaGlzIGlzIHJlYWxseSBzbyBkdXBsaWNhdGVkIGluIHRoZSBzdGFuZGFyZC4uLiBTZWUgSC4yNjQsIEQuMS4xCisgICAgaWYgKHNwcy0+bmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykgeworICAgICAgICBmb3IgKHNjaGVkX3NlbF9pZHggPSAwOyBzY2hlZF9zZWxfaWR4IDwgc3BzLT5jcGJfY250OyBzY2hlZF9zZWxfaWR4KyspIHsKKyAgICAgICAgICAgIGgtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlbc2NoZWRfc2VsX2lkeF0gPQorICAgICAgICAgICAgICAgIGdldF9iaXRzX2xvbmcoJmgtPmdiLCBzcHMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKKyAgICAgICAgICAgIC8vIGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0CisgICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCBzcHMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3BzLT52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKSB7CisgICAgICAgIGZvciAoc2NoZWRfc2VsX2lkeCA9IDA7IHNjaGVkX3NlbF9pZHggPCBzcHMtPmNwYl9jbnQ7IHNjaGVkX3NlbF9pZHgrKykgeworICAgICAgICAgICAgaC0+aW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheVtzY2hlZF9zZWxfaWR4XSA9CisgICAgICAgICAgICAgICAgZ2V0X2JpdHNfbG9uZygmaC0+Z2IsIHNwcy0+aW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGgpOworICAgICAgICAgICAgLy8gaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXQKKyAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIHNwcy0+aW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgaC0+c2VpX2J1ZmZlcmluZ19wZXJpb2RfcHJlc2VudCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnQoSDI2NENvbnRleHQgKmgpCit7CisgICAgaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2lkICAgICAgICAgID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgIGgtPnNlaV9mcGEuZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9jYW5jZWxfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIGgtPnNlaV9mcmFtZV9wYWNraW5nX3ByZXNlbnQgPSAhaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2NhbmNlbF9mbGFnOworCisgICAgaWYgKGgtPnNlaV9mcmFtZV9wYWNraW5nX3ByZXNlbnQpIHsKKyAgICAgICAgaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUgPQorICAgICAgICBoLT5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUgPSBnZXRfYml0cygmaC0+Z2IsIDcpOworICAgICAgICBoLT5zZWlfZnBhLnF1aW5jdW54X3NhbXBsaW5nX2ZsYWcgICAgICAgICA9CisgICAgICAgIGgtPnF1aW5jdW54X3N1YnNhbXBsaW5nICAgICAgICAgICA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgICAgICBoLT5zZWlfZnBhLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSAgICA9CisgICAgICAgIGgtPmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSAgICA9IGdldF9iaXRzKCZoLT5nYiwgNik7CisKKyAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBza2lwczogc3BhdGlhbF9mbGlwcGluZ19mbGFnLCBmcmFtZTBfZmxpcHBlZF9mbGFnLAorICAgICAgICAvLyBmaWVsZF92aWV3c19mbGFnLCBjdXJyZW50X2ZyYW1lX2lzX2ZyYW1lMF9mbGFnLAorICAgICAgICAvLyBmcmFtZTBfc2VsZl9jb250YWluZWRfZmxhZywgZnJhbWUxX3NlbGZfY29udGFpbmVkX2ZsYWcKKyAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgNik7CisKKyAgICAgICAgaWYgKCFoLT5xdWluY3VueF9zdWJzYW1wbGluZyAmJiBoLT5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUgIT0gNSkKKyAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDE2KTsgICAgICAvLyBmcmFtZVswMV1fZ3JpZF9wb3NpdGlvbl9beHldCisgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDgpOyAgICAgICAgICAgLy8gZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9yZXNlcnZlZF9ieXRlCisgICAgICAgIGgtPnNlaV9mcGEuZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9yZXBldGl0aW9uX3BlcmlvZCA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKSAvKiBmcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3JlcGV0aXRpb25fcGVyaW9kICovOworICAgIH0KKyAgICBza2lwX2JpdHMxKCZoLT5nYik7ICAgICAgICAgICAgICAgICAvLyBmcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2V4dGVuc2lvbl9mbGFnCisKKyAgICBpZiAoaC0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlNFSSBGUEEgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5zZWlfZnBhLmZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5zZWlfZnBhLmZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfY2FuY2VsX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5zZWlfZnBhLmZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnNlaV9mcGEucXVpbmN1bnhfc2FtcGxpbmdfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnNlaV9mcGEuY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3JlcGV0aXRpb25fcGVyaW9kKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9kaXNwbGF5X29yaWVudGF0aW9uKEgyNjRDb250ZXh0ICpoKQoreworICAgIGgtPnNlaV9kaXNwbGF5X29yaWVudGF0aW9uX3ByZXNlbnQgPSAhZ2V0X2JpdHMxKCZoLT5nYik7CisKKyAgICBpZiAoaC0+c2VpX2Rpc3BsYXlfb3JpZW50YXRpb25fcHJlc2VudCkgeworICAgICAgICBoLT5zZWlfaGZsaXAgPSBnZXRfYml0czEoJmgtPmdiKTsgICAgIC8vIGhvcl9mbGlwCisgICAgICAgIGgtPnNlaV92ZmxpcCA9IGdldF9iaXRzMSgmaC0+Z2IpOyAgICAgLy8gdmVyX2ZsaXAKKworICAgICAgICBoLT5zZWlfYW50aWNsb2Nrd2lzZV9yb3RhdGlvbiA9IGdldF9iaXRzKCZoLT5nYiwgMTYpOworICAgICAgICBnZXRfdWVfZ29sb21iKCZoLT5nYik7ICAvLyBkaXNwbGF5X29yaWVudGF0aW9uX3JlcGV0aXRpb25fcGVyaW9kCisgICAgICAgIHNraXBfYml0czEoJmgtPmdiKTsgICAgIC8vIGRpc3BsYXlfb3JpZW50YXRpb25fZXh0ZW5zaW9uX2ZsYWcKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2gyNjRfZGVjb2RlX3NlaShIMjY0Q29udGV4dCAqaCkKK3sKKyAgICB3aGlsZSAoZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpID4gMTYgJiYgc2hvd19iaXRzKCZoLT5nYiwgMTYpKSB7CisgICAgICAgIGludCB0eXBlID0gMDsKKyAgICAgICAgdW5zaWduZWQgc2l6ZSA9IDA7CisgICAgICAgIHVuc2lnbmVkIG5leHQ7CisgICAgICAgIGludCByZXQgID0gMDsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpIDwgOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHR5cGUgKz0gc2hvd19iaXRzKCZoLT5nYiwgOCk7CisgICAgICAgIH0gd2hpbGUgKGdldF9iaXRzKCZoLT5nYiwgOCkgPT0gMjU1KTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpIDwgOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHNpemUgKz0gc2hvd19iaXRzKCZoLT5nYiwgOCk7CisgICAgICAgIH0gd2hpbGUgKGdldF9iaXRzKCZoLT5nYiwgOCkgPT0gMjU1KTsKKworICAgICAgICBpZiAoaC0+YXZjdHgtPmRlYnVnJkZGX0RFQlVHX1NUQVJUQ09ERSkKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiU0VJICVkIGxlbjolZFxuIiwgdHlwZSwgc2l6ZSk7CisKKyAgICAgICAgaWYgKHNpemUgPiBnZXRfYml0c19sZWZ0KCZoLT5nYikgLyA4KSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlNFSSB0eXBlICVkIHNpemUgJWQgdHJ1bmNhdGVkIGF0ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHR5cGUsIDgqc2l6ZSwgZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIG5leHQgPSBnZXRfYml0c19jb3VudCgmaC0+Z2IpICsgOCAqIHNpemU7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgU0VJX1RZUEVfUElDX1RJTUlORzogLy8gUGljdHVyZSB0aW1pbmcgU0VJCisgICAgICAgICAgICByZXQgPSBkZWNvZGVfcGljdHVyZV90aW1pbmcoaCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0VJX1RZUEVfVVNFUl9EQVRBX0lUVV9UX1QzNToKKyAgICAgICAgICAgIGlmIChkZWNvZGVfdXNlcl9kYXRhX2l0dV90X3QzNShoLCBzaXplKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0VJX1RZUEVfVVNFUl9EQVRBX1VOUkVHSVNURVJFRDoKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV91bnJlZ2lzdGVyZWRfdXNlcl9kYXRhKGgsIHNpemUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFSV9UWVBFX1JFQ09WRVJZX1BPSU5UOgorICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3JlY292ZXJ5X3BvaW50KGgpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFSV9UWVBFX0JVRkZFUklOR19QRVJJT0Q6CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfYnVmZmVyaW5nX3BlcmlvZChoKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRUlfVFlQRV9GUkFNRV9QQUNLSU5HOgorICAgICAgICAgICAgcmV0ID0gZGVjb2RlX2ZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnQoaCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0VJX1RZUEVfRElTUExBWV9PUklFTlRBVElPTjoKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9kaXNwbGF5X29yaWVudGF0aW9uKGgpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJ1bmtub3duIFNFSSB0eXBlICVkXG4iLCB0eXBlKTsKKyAgICAgICAgfQorICAgICAgICBza2lwX2JpdHNfbG9uZygmaC0+Z2IsIG5leHQgLSBnZXRfYml0c19jb3VudCgmaC0+Z2IpKTsKKworICAgICAgICAvLyBGSVhNRSBjaGVjayBiaXRzIGhlcmUKKyAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJmgtPmdiKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgY2hhciogZmZfaDI2NF9zZWlfc3RlcmVvX21vZGUoSDI2NENvbnRleHQgKmgpCit7CisgICAgaWYgKGgtPnNlaV9mcGEuZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9jYW5jZWxfZmxhZyA9PSAwKSB7CisgICAgICAgIHN3aXRjaCAoaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgU0VJX0ZQQV9UWVBFX0NIRUNLRVJCT0FSRDoKKyAgICAgICAgICAgICAgICBpZiAoaC0+c2VpX2ZwYS5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjaGVja2VyYm9hcmRfcmwiOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjaGVja2VyYm9hcmRfbHIiOworICAgICAgICAgICAgY2FzZSBTRUlfRlBBX1RZUEVfSU5URVJMRUFWRV9DT0xVTU46CisgICAgICAgICAgICAgICAgaWYgKGgtPnNlaV9mcGEuY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID09IDIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29sX2ludGVybGVhdmVkX3JsIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29sX2ludGVybGVhdmVkX2xyIjsKKyAgICAgICAgICAgIGNhc2UgU0VJX0ZQQV9UWVBFX0lOVEVSTEVBVkVfUk9XOgorICAgICAgICAgICAgICAgIGlmIChoLT5zZWlfZnBhLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gInJvd19pbnRlcmxlYXZlZF9ybCI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gInJvd19pbnRlcmxlYXZlZF9sciI7CisgICAgICAgICAgICBjYXNlIFNFSV9GUEFfVFlQRV9TSURFX0JZX1NJREU6CisgICAgICAgICAgICAgICAgaWYgKGgtPnNlaV9mcGEuY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID09IDIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAicmlnaHRfbGVmdCI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImxlZnRfcmlnaHQiOworICAgICAgICAgICAgY2FzZSBTRUlfRlBBX1RZUEVfVE9QX0JPVFRPTToKKyAgICAgICAgICAgICAgICBpZiAoaC0+c2VpX2ZwYS5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJib3R0b21fdG9wIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAidG9wX2JvdHRvbSI7CisgICAgICAgICAgICBjYXNlIFNFSV9GUEFfVFlQRV9JTlRFUkxFQVZFX1RFTVBPUkFMOgorICAgICAgICAgICAgICAgIGlmIChoLT5zZWlfZnBhLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImJsb2NrX3JsIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiYmxvY2tfbHIiOworICAgICAgICAgICAgY2FzZSBTRUlfRlBBX1RZUEVfMkQ6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAibW9ubyI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGgtPnNlaV9mcGEuZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9jYW5jZWxfZmxhZyA9PSAxKSB7CisgICAgICAgIHJldHVybiAibW9ubyI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9zbGljZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NF9zbGljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZjYxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0X3NsaWNlLmMKQEAgLTAsMCArMSwyNjAyIEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIGNvZGVjLgorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImNhYmFjLmgiCisjaW5jbHVkZSAiY2FiYWNfZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiZXJyb3JfcmVzaWxpZW5jZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAiaDI2NGRhdGEuaCIKKyNpbmNsdWRlICJoMjY0Y2hyb21hLmgiCisjaW5jbHVkZSAiaDI2NF9tdnByZWQuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSAicmVjdGFuZ2xlLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmVtNltRUF9NQVhfTlVNICsgMV0gPSB7CisgICAgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwKKyAgICAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LAorICAgIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsCisgICAgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwKKyAgICAwLCAxLCAyLCAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGl2NltRUF9NQVhfTlVNICsgMV0gPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMywgIDMsICAzLAorICAgIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsIDYsIDYsIDYsIDYsICA2LCAgNiwKKyAgICA3LCA3LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA5LCA5LCA5LCA5LCA5LCA5LCAxMCwgMTAsIDEwLAorICAgMTAsMTAsMTAsMTEsMTEsMTEsMTEsMTEsMTEsMTIsMTIsMTIsMTIsMTIsMTIsMTMsMTMsMTMsIDEzLCAxMywgMTMsCisgICAxNCwxNCwxNCwxNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGZpZWxkX3NjYW5bMTYrMV0gPSB7CisgICAgMCArIDAgKiA0LCAwICsgMSAqIDQsIDEgKyAwICogNCwgMCArIDIgKiA0LAorICAgIDAgKyAzICogNCwgMSArIDEgKiA0LCAxICsgMiAqIDQsIDEgKyAzICogNCwKKyAgICAyICsgMCAqIDQsIDIgKyAxICogNCwgMiArIDIgKiA0LCAyICsgMyAqIDQsCisgICAgMyArIDAgKiA0LCAzICsgMSAqIDQsIDMgKyAyICogNCwgMyArIDMgKiA0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZmllbGRfc2Nhbjh4OFs2NCsxXSA9IHsKKyAgICAwICsgMCAqIDgsIDAgKyAxICogOCwgMCArIDIgKiA4LCAxICsgMCAqIDgsCisgICAgMSArIDEgKiA4LCAwICsgMyAqIDgsIDAgKyA0ICogOCwgMSArIDIgKiA4LAorICAgIDIgKyAwICogOCwgMSArIDMgKiA4LCAwICsgNSAqIDgsIDAgKyA2ICogOCwKKyAgICAwICsgNyAqIDgsIDEgKyA0ICogOCwgMiArIDEgKiA4LCAzICsgMCAqIDgsCisgICAgMiArIDIgKiA4LCAxICsgNSAqIDgsIDEgKyA2ICogOCwgMSArIDcgKiA4LAorICAgIDIgKyAzICogOCwgMyArIDEgKiA4LCA0ICsgMCAqIDgsIDMgKyAyICogOCwKKyAgICAyICsgNCAqIDgsIDIgKyA1ICogOCwgMiArIDYgKiA4LCAyICsgNyAqIDgsCisgICAgMyArIDMgKiA4LCA0ICsgMSAqIDgsIDUgKyAwICogOCwgNCArIDIgKiA4LAorICAgIDMgKyA0ICogOCwgMyArIDUgKiA4LCAzICsgNiAqIDgsIDMgKyA3ICogOCwKKyAgICA0ICsgMyAqIDgsIDUgKyAxICogOCwgNiArIDAgKiA4LCA1ICsgMiAqIDgsCisgICAgNCArIDQgKiA4LCA0ICsgNSAqIDgsIDQgKyA2ICogOCwgNCArIDcgKiA4LAorICAgIDUgKyAzICogOCwgNiArIDEgKiA4LCA2ICsgMiAqIDgsIDUgKyA0ICogOCwKKyAgICA1ICsgNSAqIDgsIDUgKyA2ICogOCwgNSArIDcgKiA4LCA2ICsgMyAqIDgsCisgICAgNyArIDAgKiA4LCA3ICsgMSAqIDgsIDYgKyA0ICogOCwgNiArIDUgKiA4LAorICAgIDYgKyA2ICogOCwgNiArIDcgKiA4LCA3ICsgMiAqIDgsIDcgKyAzICogOCwKKyAgICA3ICsgNCAqIDgsIDcgKyA1ICogOCwgNyArIDYgKiA4LCA3ICsgNyAqIDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBmaWVsZF9zY2FuOHg4X2NhdmxjWzY0KzFdID0geworICAgIDAgKyAwICogOCwgMSArIDEgKiA4LCAyICsgMCAqIDgsIDAgKyA3ICogOCwKKyAgICAyICsgMiAqIDgsIDIgKyAzICogOCwgMiArIDQgKiA4LCAzICsgMyAqIDgsCisgICAgMyArIDQgKiA4LCA0ICsgMyAqIDgsIDQgKyA0ICogOCwgNSArIDMgKiA4LAorICAgIDUgKyA1ICogOCwgNyArIDAgKiA4LCA2ICsgNiAqIDgsIDcgKyA0ICogOCwKKyAgICAwICsgMSAqIDgsIDAgKyAzICogOCwgMSArIDMgKiA4LCAxICsgNCAqIDgsCisgICAgMSArIDUgKiA4LCAzICsgMSAqIDgsIDIgKyA1ICogOCwgNCArIDEgKiA4LAorICAgIDMgKyA1ICogOCwgNSArIDEgKiA4LCA0ICsgNSAqIDgsIDYgKyAxICogOCwKKyAgICA1ICsgNiAqIDgsIDcgKyAxICogOCwgNiArIDcgKiA4LCA3ICsgNSAqIDgsCisgICAgMCArIDIgKiA4LCAwICsgNCAqIDgsIDAgKyA1ICogOCwgMiArIDEgKiA4LAorICAgIDEgKyA2ICogOCwgNCArIDAgKiA4LCAyICsgNiAqIDgsIDUgKyAwICogOCwKKyAgICAzICsgNiAqIDgsIDYgKyAwICogOCwgNCArIDYgKiA4LCA2ICsgMiAqIDgsCisgICAgNSArIDcgKiA4LCA2ICsgNCAqIDgsIDcgKyAyICogOCwgNyArIDYgKiA4LAorICAgIDEgKyAwICogOCwgMSArIDIgKiA4LCAwICsgNiAqIDgsIDMgKyAwICogOCwKKyAgICAxICsgNyAqIDgsIDMgKyAyICogOCwgMiArIDcgKiA4LCA0ICsgMiAqIDgsCisgICAgMyArIDcgKiA4LCA1ICsgMiAqIDgsIDQgKyA3ICogOCwgNSArIDQgKiA4LAorICAgIDYgKyAzICogOCwgNiArIDUgKiA4LCA3ICsgMyAqIDgsIDcgKyA3ICogOCwKK307CisKKy8vIHppZ3phZ19zY2FuOHg4X2NhdmxjW2ldID0gemlnemFnX3NjYW44eDhbKGkvNCkgKyAxNiooaSU0KV0KK3N0YXRpYyBjb25zdCB1aW50OF90IHppZ3phZ19zY2FuOHg4X2NhdmxjWzY0KzFdID0geworICAgIDAgKyAwICogOCwgMSArIDEgKiA4LCAxICsgMiAqIDgsIDIgKyAyICogOCwKKyAgICA0ICsgMSAqIDgsIDAgKyA1ICogOCwgMyArIDMgKiA4LCA3ICsgMCAqIDgsCisgICAgMyArIDQgKiA4LCAxICsgNyAqIDgsIDUgKyAzICogOCwgNiArIDMgKiA4LAorICAgIDIgKyA3ICogOCwgNiArIDQgKiA4LCA1ICsgNiAqIDgsIDcgKyA1ICogOCwKKyAgICAxICsgMCAqIDgsIDIgKyAwICogOCwgMCArIDMgKiA4LCAzICsgMSAqIDgsCisgICAgMyArIDIgKiA4LCAwICsgNiAqIDgsIDQgKyAyICogOCwgNiArIDEgKiA4LAorICAgIDIgKyA1ICogOCwgMiArIDYgKiA4LCA2ICsgMiAqIDgsIDUgKyA0ICogOCwKKyAgICAzICsgNyAqIDgsIDcgKyAzICogOCwgNCArIDcgKiA4LCA3ICsgNiAqIDgsCisgICAgMCArIDEgKiA4LCAzICsgMCAqIDgsIDAgKyA0ICogOCwgNCArIDAgKiA4LAorICAgIDIgKyAzICogOCwgMSArIDUgKiA4LCA1ICsgMSAqIDgsIDUgKyAyICogOCwKKyAgICAxICsgNiAqIDgsIDMgKyA1ICogOCwgNyArIDEgKiA4LCA0ICsgNSAqIDgsCisgICAgNCArIDYgKiA4LCA3ICsgNCAqIDgsIDUgKyA3ICogOCwgNiArIDcgKiA4LAorICAgIDAgKyAyICogOCwgMiArIDEgKiA4LCAxICsgMyAqIDgsIDUgKyAwICogOCwKKyAgICAxICsgNCAqIDgsIDIgKyA0ICogOCwgNiArIDAgKiA4LCA0ICsgMyAqIDgsCisgICAgMCArIDcgKiA4LCA0ICsgNCAqIDgsIDcgKyAyICogOCwgMyArIDYgKiA4LAorICAgIDUgKyA1ICogOCwgNiArIDUgKiA4LCA2ICsgNiAqIDgsIDcgKyA3ICogOCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRlcXVhbnQ0X2NvZWZmX2luaXRbNl1bM10gPSB7CisgICAgeyAxMCwgMTMsIDE2IH0sCisgICAgeyAxMSwgMTQsIDE4IH0sCisgICAgeyAxMywgMTYsIDIwIH0sCisgICAgeyAxNCwgMTgsIDIzIH0sCisgICAgeyAxNiwgMjAsIDI1IH0sCisgICAgeyAxOCwgMjMsIDI5IH0sCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkZXF1YW50OF9jb2VmZl9pbml0X3NjYW5bMTZdID0geworICAgIDAsIDMsIDQsIDMsIDMsIDEsIDUsIDEsIDQsIDUsIDIsIDUsIDMsIDEsIDUsIDEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRlcXVhbnQ4X2NvZWZmX2luaXRbNl1bNl0gPSB7CisgICAgeyAyMCwgMTgsIDMyLCAxOSwgMjUsIDI0IH0sCisgICAgeyAyMiwgMTksIDM1LCAyMSwgMjgsIDI2IH0sCisgICAgeyAyNiwgMjMsIDQyLCAyNCwgMzMsIDMxIH0sCisgICAgeyAyOCwgMjUsIDQ1LCAyNiwgMzUsIDMzIH0sCisgICAgeyAzMiwgMjgsIDUxLCAzMCwgNDAsIDM4IH0sCisgICAgeyAzNiwgMzIsIDU4LCAzNCwgNDYsIDQzIH0sCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGgyNjRfaHdhY2NlbF9waXhmbXRfbGlzdF80MjBbXSA9IHsKKyNpZiBDT05GSUdfSDI2NF9EWFZBMl9IV0FDQ0VMCisgICAgQVZfUElYX0ZNVF9EWFZBMl9WTEQsCisjZW5kaWYKKyNpZiBDT05GSUdfSDI2NF9WQUFQSV9IV0FDQ0VMCisgICAgQVZfUElYX0ZNVF9WQUFQSV9WTEQsCisjZW5kaWYKKyNpZiBDT05GSUdfSDI2NF9WREFfSFdBQ0NFTAorICAgIEFWX1BJWF9GTVRfVkRBX1ZMRCwKKyAgICBBVl9QSVhfRk1UX1ZEQSwKKyNlbmRpZgorI2lmIENPTkZJR19IMjY0X1ZEUEFVX0hXQUNDRUwKKyAgICBBVl9QSVhfRk1UX1ZEUEFVLAorI2VuZGlmCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBoMjY0X2h3YWNjZWxfcGl4Zm10X2xpc3RfanBlZ180MjBbXSA9IHsKKyNpZiBDT05GSUdfSDI2NF9EWFZBMl9IV0FDQ0VMCisgICAgQVZfUElYX0ZNVF9EWFZBMl9WTEQsCisjZW5kaWYKKyNpZiBDT05GSUdfSDI2NF9WQUFQSV9IV0FDQ0VMCisgICAgQVZfUElYX0ZNVF9WQUFQSV9WTEQsCisjZW5kaWYKKyNpZiBDT05GSUdfSDI2NF9WREFfSFdBQ0NFTAorICAgIEFWX1BJWF9GTVRfVkRBX1ZMRCwKKyAgICBBVl9QSVhfRk1UX1ZEQSwKKyNlbmRpZgorI2lmIENPTkZJR19IMjY0X1ZEUEFVX0hXQUNDRUwKKyAgICBBVl9QSVhfRk1UX1ZEUEFVLAorI2VuZGlmCisgICAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKKworc3RhdGljIHZvaWQgcmVsZWFzZV91bnVzZWRfcGljdHVyZXMoSDI2NENvbnRleHQgKmgsIGludCByZW1vdmVfY3VycmVudCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIHJlbGVhc2Ugbm9uIHJlZmVyZW5jZSBmcmFtZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgSDI2NF9NQVhfUElDVFVSRV9DT1VOVDsgaSsrKSB7CisgICAgICAgIGlmIChoLT5EUEJbaV0uZi5idWZbMF0gJiYgIWgtPkRQQltpXS5yZWZlcmVuY2UgJiYKKyAgICAgICAgICAgIChyZW1vdmVfY3VycmVudCB8fCAmaC0+RFBCW2ldICE9IGgtPmN1cl9waWNfcHRyKSkgeworICAgICAgICAgICAgZmZfaDI2NF91bnJlZl9waWN0dXJlKGgsICZoLT5EUEJbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGFsbG9jX3NjcmF0Y2hfYnVmZmVycyhIMjY0Q29udGV4dCAqaCwgaW50IGxpbmVzaXplKQoreworICAgIGludCBhbGxvY19zaXplID0gRkZBTElHTihGRkFCUyhsaW5lc2l6ZSkgKyAzMiwgMzIpOworCisgICAgaWYgKGgtPmJpcHJlZF9zY3JhdGNocGFkKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGgtPmJpcHJlZF9zY3JhdGNocGFkID0gYXZfbWFsbG9jKDE2ICogNiAqIGFsbG9jX3NpemUpOworICAgIC8vIGVkZ2UgZW11IG5lZWRzIGJsb2Nrc2l6ZSArIGZpbHRlciBsZW5ndGggLSAxCisgICAgLy8gKD0gMjF4MjEgZm9yICBoMjY0KQorICAgIGgtPmVkZ2VfZW11X2J1ZmZlciA9IGF2X21hbGxvY3ooYWxsb2Nfc2l6ZSAqIDIgKiAyMSk7CisKKyAgICBpZiAoIWgtPmJpcHJlZF9zY3JhdGNocGFkIHx8ICFoLT5lZGdlX2VtdV9idWZmZXIpIHsKKyAgICAgICAgYXZfZnJlZXAoJmgtPmJpcHJlZF9zY3JhdGNocGFkKTsKKyAgICAgICAgYXZfZnJlZXAoJmgtPmVkZ2VfZW11X2J1ZmZlcik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF90YWJsZV9wb29scyhIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBjb25zdCBpbnQgYmlnX21iX251bSAgICA9IGgtPm1iX3N0cmlkZSAqIChoLT5tYl9oZWlnaHQgKyAxKSArIDE7CisgICAgY29uc3QgaW50IG1iX2FycmF5X3NpemUgPSBoLT5tYl9zdHJpZGUgKiBoLT5tYl9oZWlnaHQ7CisgICAgY29uc3QgaW50IGI0X3N0cmlkZSAgICAgPSBoLT5tYl93aWR0aCAqIDQgKyAxOworICAgIGNvbnN0IGludCBiNF9hcnJheV9zaXplID0gYjRfc3RyaWRlICogaC0+bWJfaGVpZ2h0ICogNDsKKworICAgIGgtPnFzY2FsZV90YWJsZV9wb29sID0gYXZfYnVmZmVyX3Bvb2xfaW5pdChiaWdfbWJfbnVtICsgaC0+bWJfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9idWZmZXJfYWxsb2N6KTsKKyAgICBoLT5tYl90eXBlX3Bvb2wgICAgICA9IGF2X2J1ZmZlcl9wb29sX2luaXQoKGJpZ19tYl9udW0gKyBoLT5tYl9zdHJpZGUpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSwgYXZfYnVmZmVyX2FsbG9jeik7CisgICAgaC0+bW90aW9uX3ZhbF9wb29sICAgPSBhdl9idWZmZXJfcG9vbF9pbml0KDIgKiAoYjRfYXJyYXlfc2l6ZSArIDQpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDE2X3QpLCBhdl9idWZmZXJfYWxsb2N6KTsKKyAgICBoLT5yZWZfaW5kZXhfcG9vbCAgICA9IGF2X2J1ZmZlcl9wb29sX2luaXQoNCAqIG1iX2FycmF5X3NpemUsIGF2X2J1ZmZlcl9hbGxvY3opOworCisgICAgaWYgKCFoLT5xc2NhbGVfdGFibGVfcG9vbCB8fCAhaC0+bWJfdHlwZV9wb29sIHx8ICFoLT5tb3Rpb25fdmFsX3Bvb2wgfHwKKyAgICAgICAgIWgtPnJlZl9pbmRleF9wb29sKSB7CisgICAgICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmaC0+cXNjYWxlX3RhYmxlX3Bvb2wpOworICAgICAgICBhdl9idWZmZXJfcG9vbF91bmluaXQoJmgtPm1iX3R5cGVfcG9vbCk7CisgICAgICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmaC0+bW90aW9uX3ZhbF9wb29sKTsKKyAgICAgICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZoLT5yZWZfaW5kZXhfcG9vbCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfcGljdHVyZShIMjY0Q29udGV4dCAqaCwgSDI2NFBpY3R1cmUgKnBpYykKK3sKKyAgICBpbnQgaSwgcmV0ID0gMDsKKworICAgIGF2X2Fzc2VydDAoIXBpYy0+Zi5kYXRhWzBdKTsKKworICAgIHBpYy0+dGYuZiA9ICZwaWMtPmY7CisgICAgcmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoaC0+YXZjdHgsICZwaWMtPnRmLCBwaWMtPnJlZmVyZW5jZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGIDogMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGgtPmxpbmVzaXplICAgPSBwaWMtPmYubGluZXNpemVbMF07CisgICAgaC0+dXZsaW5lc2l6ZSA9IHBpYy0+Zi5saW5lc2l6ZVsxXTsKKyAgICBwaWMtPmNyb3AgICAgID0gaC0+c3BzLmNyb3A7CisgICAgcGljLT5jcm9wX3RvcCA9IGgtPnNwcy5jcm9wX3RvcDsKKyAgICBwaWMtPmNyb3BfbGVmdD0gaC0+c3BzLmNyb3BfbGVmdDsKKworICAgIGlmIChoLT5hdmN0eC0+aHdhY2NlbCkgeworICAgICAgICBjb25zdCBBVkhXQWNjZWwgKmh3YWNjZWwgPSBoLT5hdmN0eC0+aHdhY2NlbDsKKyAgICAgICAgYXZfYXNzZXJ0MCghcGljLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZSk7CisgICAgICAgIGlmIChod2FjY2VsLT5mcmFtZV9wcml2X2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgcGljLT5od2FjY2VsX3ByaXZfYnVmID0gYXZfYnVmZmVyX2FsbG9jeihod2FjY2VsLT5mcmFtZV9wcml2X2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIXBpYy0+aHdhY2NlbF9wcml2X2J1ZikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgcGljLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZSA9IHBpYy0+aHdhY2NlbF9wcml2X2J1Zi0+ZGF0YTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWgtPmF2Y3R4LT5od2FjY2VsICYmIENPTkZJR19HUkFZICYmIGgtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZICYmIHBpYy0+Zi5kYXRhWzJdKSB7CisgICAgICAgIGludCBoX2Nocm9tYV9zaGlmdCwgdl9jaHJvbWFfc2hpZnQ7CisgICAgICAgIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKHBpYy0+Zi5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2Nocm9tYV9zaGlmdCwgJnZfY2hyb21hX3NoaWZ0KTsKKworICAgICAgICBmb3IoaT0wOyBpPEZGX0NFSUxfUlNISUZUKGgtPmF2Y3R4LT5oZWlnaHQsIHZfY2hyb21hX3NoaWZ0KTsgaSsrKSB7CisgICAgICAgICAgICBtZW1zZXQocGljLT5mLmRhdGFbMV0gKyBwaWMtPmYubGluZXNpemVbMV0qaSwKKyAgICAgICAgICAgICAgICAgICAweDgwLCBGRl9DRUlMX1JTSElGVChoLT5hdmN0eC0+d2lkdGgsIGhfY2hyb21hX3NoaWZ0KSk7CisgICAgICAgICAgICBtZW1zZXQocGljLT5mLmRhdGFbMl0gKyBwaWMtPmYubGluZXNpemVbMl0qaSwKKyAgICAgICAgICAgICAgICAgICAweDgwLCBGRl9DRUlMX1JTSElGVChoLT5hdmN0eC0+d2lkdGgsIGhfY2hyb21hX3NoaWZ0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWgtPnFzY2FsZV90YWJsZV9wb29sKSB7CisgICAgICAgIHJldCA9IGluaXRfdGFibGVfcG9vbHMoaCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHBpYy0+cXNjYWxlX3RhYmxlX2J1ZiA9IGF2X2J1ZmZlcl9wb29sX2dldChoLT5xc2NhbGVfdGFibGVfcG9vbCk7CisgICAgcGljLT5tYl90eXBlX2J1ZiAgICAgID0gYXZfYnVmZmVyX3Bvb2xfZ2V0KGgtPm1iX3R5cGVfcG9vbCk7CisgICAgaWYgKCFwaWMtPnFzY2FsZV90YWJsZV9idWYgfHwgIXBpYy0+bWJfdHlwZV9idWYpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHBpYy0+bWJfdHlwZSAgICAgID0gKHVpbnQzMl90KilwaWMtPm1iX3R5cGVfYnVmLT5kYXRhICsgMiAqIGgtPm1iX3N0cmlkZSArIDE7CisgICAgcGljLT5xc2NhbGVfdGFibGUgPSBwaWMtPnFzY2FsZV90YWJsZV9idWYtPmRhdGEgKyAyICogaC0+bWJfc3RyaWRlICsgMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgcGljLT5tb3Rpb25fdmFsX2J1ZltpXSA9IGF2X2J1ZmZlcl9wb29sX2dldChoLT5tb3Rpb25fdmFsX3Bvb2wpOworICAgICAgICBwaWMtPnJlZl9pbmRleF9idWZbaV0gID0gYXZfYnVmZmVyX3Bvb2xfZ2V0KGgtPnJlZl9pbmRleF9wb29sKTsKKyAgICAgICAgaWYgKCFwaWMtPm1vdGlvbl92YWxfYnVmW2ldIHx8ICFwaWMtPnJlZl9pbmRleF9idWZbaV0pCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgcGljLT5tb3Rpb25fdmFsW2ldID0gKGludDE2X3QgKCopWzJdKXBpYy0+bW90aW9uX3ZhbF9idWZbaV0tPmRhdGEgKyA0OworICAgICAgICBwaWMtPnJlZl9pbmRleFtpXSAgPSBwaWMtPnJlZl9pbmRleF9idWZbaV0tPmRhdGE7CisgICAgfQorCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCBwaWMpOworICAgIHJldHVybiAocmV0IDwgMCkgPyByZXQgOiBBVkVSUk9SKEVOT01FTSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBpY19pc191bnVzZWQoSDI2NENvbnRleHQgKmgsIEgyNjRQaWN0dXJlICpwaWMpCit7CisgICAgaWYgKCFwaWMtPmYuYnVmWzBdKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAocGljLT5uZWVkc19yZWFsbG9jICYmICEocGljLT5yZWZlcmVuY2UgJiBERUxBWUVEX1BJQ19SRUYpKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW5kX3VudXNlZF9waWN0dXJlKEgyNjRDb250ZXh0ICpoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEgyNjRfTUFYX1BJQ1RVUkVfQ09VTlQ7IGkrKykgeworICAgICAgICBpZiAocGljX2lzX3VudXNlZChoLCAmaC0+RFBCW2ldKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA9PSBIMjY0X01BWF9QSUNUVVJFX0NPVU5UKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChoLT5EUEJbaV0ubmVlZHNfcmVhbGxvYykgeworICAgICAgICBoLT5EUEJbaV0ubmVlZHNfcmVhbGxvYyA9IDA7CisgICAgICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCAmaC0+RFBCW2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gaTsKK30KKworCitzdGF0aWMgdm9pZCBpbml0X2RlcXVhbnQ4X2NvZWZmX3RhYmxlKEgyNjRDb250ZXh0ICpoKQoreworICAgIGludCBpLCBqLCBxLCB4OworICAgIGNvbnN0IGludCBtYXhfcXAgPSA1MSArIDYgKiAoaC0+c3BzLmJpdF9kZXB0aF9sdW1hIC0gOCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIGgtPmRlcXVhbnQ4X2NvZWZmW2ldID0gaC0+ZGVxdWFudDhfYnVmZmVyW2ldOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgaWYgKCFtZW1jbXAoaC0+cHBzLnNjYWxpbmdfbWF0cml4OFtqXSwgaC0+cHBzLnNjYWxpbmdfbWF0cml4OFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDY0ICogc2l6ZW9mKHVpbnQ4X3QpKSkgeworICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ4X2NvZWZmW2ldID0gaC0+ZGVxdWFudDhfYnVmZmVyW2pdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoaiA8IGkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmb3IgKHEgPSAwOyBxIDwgbWF4X3FwICsgMTsgcSsrKSB7CisgICAgICAgICAgICBpbnQgc2hpZnQgPSBkaXY2W3FdOworICAgICAgICAgICAgaW50IGlkeCAgID0gcmVtNltxXTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA2NDsgeCsrKQorICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ4X2NvZWZmW2ldW3FdWyh4ID4+IDMpIHwgKCh4ICYgNykgPDwgMyldID0KKyAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClkZXF1YW50OF9jb2VmZl9pbml0W2lkeF1bZGVxdWFudDhfY29lZmZfaW5pdF9zY2FuWygoeCA+PiAxKSAmIDEyKSB8ICh4ICYgMyldXSAqCisgICAgICAgICAgICAgICAgICAgICBoLT5wcHMuc2NhbGluZ19tYXRyaXg4W2ldW3hdKSA8PCBzaGlmdDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaW5pdF9kZXF1YW50NF9jb2VmZl90YWJsZShIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBpbnQgaSwgaiwgcSwgeDsKKyAgICBjb25zdCBpbnQgbWF4X3FwID0gNTEgKyA2ICogKGgtPnNwcy5iaXRfZGVwdGhfbHVtYSAtIDgpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgaC0+ZGVxdWFudDRfY29lZmZbaV0gPSBoLT5kZXF1YW50NF9idWZmZXJbaV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgICAgICAgICBpZiAoIW1lbWNtcChoLT5wcHMuc2NhbGluZ19tYXRyaXg0W2pdLCBoLT5wcHMuc2NhbGluZ19tYXRyaXg0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgMTYgKiBzaXplb2YodWludDhfdCkpKSB7CisgICAgICAgICAgICAgICAgaC0+ZGVxdWFudDRfY29lZmZbaV0gPSBoLT5kZXF1YW50NF9idWZmZXJbal07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChqIDwgaSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvciAocSA9IDA7IHEgPCBtYXhfcXAgKyAxOyBxKyspIHsKKyAgICAgICAgICAgIGludCBzaGlmdCA9IGRpdjZbcV0gKyAyOworICAgICAgICAgICAgaW50IGlkeCAgID0gcmVtNltxXTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ0X2NvZWZmW2ldW3FdWyh4ID4+IDIpIHwgKCh4IDw8IDIpICYgMHhGKV0gPQorICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWRlcXVhbnQ0X2NvZWZmX2luaXRbaWR4XVsoeCAmIDEpICsgKCh4ID4+IDIpICYgMSldICoKKyAgICAgICAgICAgICAgICAgICAgIGgtPnBwcy5zY2FsaW5nX21hdHJpeDRbaV1beF0pIDw8IHNoaWZ0OworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGgyNjRfaW5pdF9kZXF1YW50X3RhYmxlcyhIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBpbnQgaSwgeDsKKyAgICBpbml0X2RlcXVhbnQ0X2NvZWZmX3RhYmxlKGgpOworICAgIG1lbXNldChoLT5kZXF1YW50OF9jb2VmZiwgMCwgc2l6ZW9mKGgtPmRlcXVhbnQ4X2NvZWZmKSk7CisKKyAgICBpZiAoaC0+cHBzLnRyYW5zZm9ybV84eDhfbW9kZSkKKyAgICAgICAgaW5pdF9kZXF1YW50OF9jb2VmZl90YWJsZShoKTsKKyAgICBpZiAoaC0+c3BzLnRyYW5zZm9ybV9ieXBhc3MpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ0X2NvZWZmW2ldWzBdW3hdID0gMSA8PCA2OworICAgICAgICBpZiAoaC0+cHBzLnRyYW5zZm9ybV84eDhfbW9kZSkKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDY0OyB4KyspCisgICAgICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ4X2NvZWZmW2ldWzBdW3hdID0gMSA8PCA2OworICAgIH0KK30KKworLyoqCisgKiBNaW1pYyBhbGxvY190YWJsZXMoKSwgYnV0IGZvciBldmVyeSBjb250ZXh0IHRocmVhZC4KKyAqLworc3RhdGljIHZvaWQgY2xvbmVfdGFibGVzKEgyNjRDb250ZXh0ICpkc3QsIEgyNjRDb250ZXh0ICpzcmMsIGludCBpKQoreworICAgIGRzdC0+aW50cmE0eDRfcHJlZF9tb2RlICAgICA9IHNyYy0+aW50cmE0eDRfcHJlZF9tb2RlICsgaSAqIDggKiAyICogc3JjLT5tYl9zdHJpZGU7CisgICAgZHN0LT5ub25femVyb19jb3VudCAgICAgICAgID0gc3JjLT5ub25femVyb19jb3VudDsKKyAgICBkc3QtPnNsaWNlX3RhYmxlICAgICAgICAgICAgPSBzcmMtPnNsaWNlX3RhYmxlOworICAgIGRzdC0+Y2JwX3RhYmxlICAgICAgICAgICAgICA9IHNyYy0+Y2JwX3RhYmxlOworICAgIGRzdC0+bWIyYl94eSAgICAgICAgICAgICAgICA9IHNyYy0+bWIyYl94eTsKKyAgICBkc3QtPm1iMmJyX3h5ICAgICAgICAgICAgICAgPSBzcmMtPm1iMmJyX3h5OworICAgIGRzdC0+Y2hyb21hX3ByZWRfbW9kZV90YWJsZSA9IHNyYy0+Y2hyb21hX3ByZWRfbW9kZV90YWJsZTsKKyAgICBkc3QtPm12ZF90YWJsZVswXSAgICAgICAgICAgPSBzcmMtPm12ZF90YWJsZVswXSArIGkgKiA4ICogMiAqIHNyYy0+bWJfc3RyaWRlOworICAgIGRzdC0+bXZkX3RhYmxlWzFdICAgICAgICAgICA9IHNyYy0+bXZkX3RhYmxlWzFdICsgaSAqIDggKiAyICogc3JjLT5tYl9zdHJpZGU7CisgICAgZHN0LT5kaXJlY3RfdGFibGUgICAgICAgICAgID0gc3JjLT5kaXJlY3RfdGFibGU7CisgICAgZHN0LT5saXN0X2NvdW50cyAgICAgICAgICAgID0gc3JjLT5saXN0X2NvdW50czsKKyAgICBkc3QtPkRQQiAgICAgICAgICAgICAgICAgICAgPSBzcmMtPkRQQjsKKyAgICBkc3QtPmN1cl9waWNfcHRyICAgICAgICAgICAgPSBzcmMtPmN1cl9waWNfcHRyOworICAgIGRzdC0+Y3VyX3BpYyAgICAgICAgICAgICAgICA9IHNyYy0+Y3VyX3BpYzsKKyAgICBkc3QtPmJpcHJlZF9zY3JhdGNocGFkICAgICAgPSBOVUxMOworICAgIGRzdC0+ZWRnZV9lbXVfYnVmZmVyICAgICAgICA9IE5VTEw7CisgICAgZmZfaDI2NF9wcmVkX2luaXQoJmRzdC0+aHBjLCBzcmMtPmF2Y3R4LT5jb2RlY19pZCwgc3JjLT5zcHMuYml0X2RlcHRoX2x1bWEsCisgICAgICAgICAgICAgICAgICAgICAgc3JjLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMpOworfQorCisjZGVmaW5lIElOX1JBTkdFKGEsIGIsIHNpemUpICgoKGEpID49IChiKSkgJiYgKChhKSA8ICgoYikgKyAoc2l6ZSkpKSkKKyN1bmRlZiBSRUJBU0VfUElDVFVSRQorI2RlZmluZSBSRUJBU0VfUElDVFVSRShwaWMsIG5ld19jdHgsIG9sZF9jdHgpICAgICAgICAgICAgIFwKKyAgICAoKChwaWMpICYmIChwaWMpID49IChvbGRfY3R4KS0+RFBCICYmICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAocGljKSA8IChvbGRfY3R4KS0+RFBCICsgSDI2NF9NQVhfUElDVFVSRV9DT1VOVCkgPyAgICAgICAgICBcCisgICAgICYobmV3X2N0eCktPkRQQlsocGljKSAtIChvbGRfY3R4KS0+RFBCXSA6IE5VTEwpCisKK3N0YXRpYyB2b2lkIGNvcHlfcGljdHVyZV9yYW5nZShIMjY0UGljdHVyZSAqKnRvLCBIMjY0UGljdHVyZSAqKmZyb20sIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0Q29udGV4dCAqbmV3X2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NENvbnRleHQgKm9sZF9iYXNlKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgYXNzZXJ0KChJTl9SQU5HRShmcm9tW2ldLCBvbGRfYmFzZSwgc2l6ZW9mKCpvbGRfYmFzZSkpIHx8CisgICAgICAgICAgICAgICAgSU5fUkFOR0UoZnJvbVtpXSwgb2xkX2Jhc2UtPkRQQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSDI2NFBpY3R1cmUpICogSDI2NF9NQVhfUElDVFVSRV9DT1VOVCkgfHwKKyAgICAgICAgICAgICAgICAhZnJvbVtpXSkpOworICAgICAgICB0b1tpXSA9IFJFQkFTRV9QSUNUVVJFKGZyb21baV0sIG5ld19iYXNlLCBvbGRfYmFzZSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvcHlfcGFyYW1ldGVyX3NldCh2b2lkICoqdG8sIHZvaWQgKipmcm9tLCBpbnQgY291bnQsIGludCBzaXplKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHRvW2ldICYmICFmcm9tW2ldKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmdG9baV0pOworICAgICAgICB9IGVsc2UgaWYgKGZyb21baV0gJiYgIXRvW2ldKSB7CisgICAgICAgICAgICB0b1tpXSA9IGF2X21hbGxvYyhzaXplKTsKKyAgICAgICAgICAgIGlmICghdG9baV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcm9tW2ldKQorICAgICAgICAgICAgbWVtY3B5KHRvW2ldLCBmcm9tW2ldLCBzaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBjb3B5X2ZpZWxkcyh0bywgZnJvbSwgc3RhcnRfZmllbGQsIGVuZF9maWVsZCkgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbWNweSgmKHRvKS0+c3RhcnRfZmllbGQsICYoZnJvbSktPnN0YXJ0X2ZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKGNoYXIgKikmKHRvKS0+ZW5kX2ZpZWxkIC0gKGNoYXIgKikmKHRvKS0+c3RhcnRfZmllbGQpCisKK3N0YXRpYyBpbnQgaDI2NF9zbGljZV9oZWFkZXJfaW5pdChIMjY0Q29udGV4dCAqaCwgaW50IHJlaW5pdCk7CisKK2ludCBmZl9oMjY0X3VwZGF0ZV90aHJlYWRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpzcmMpCit7CisgICAgSDI2NENvbnRleHQgKmggPSBkc3QtPnByaXZfZGF0YSwgKmgxID0gc3JjLT5wcml2X2RhdGE7CisgICAgaW50IGluaXRlZCA9IGgtPmNvbnRleHRfaW5pdGlhbGl6ZWQsIGVyciA9IDA7CisgICAgaW50IGNvbnRleHRfcmVpbml0aWFsaXplZCA9IDA7CisgICAgaW50IGksIHJldDsKKworICAgIGlmIChkc3QgPT0gc3JjKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChpbml0ZWQgJiYKKyAgICAgICAgKGgtPndpZHRoICAgICAgICAgICAgICAgICAhPSBoMS0+d2lkdGggICAgICAgICAgICAgICAgIHx8CisgICAgICAgICBoLT5oZWlnaHQgICAgICAgICAgICAgICAgIT0gaDEtPmhlaWdodCAgICAgICAgICAgICAgICB8fAorICAgICAgICAgaC0+bWJfd2lkdGggICAgICAgICAgICAgICE9IGgxLT5tYl93aWR0aCAgICAgICAgICAgICAgfHwKKyAgICAgICAgIGgtPm1iX2hlaWdodCAgICAgICAgICAgICAhPSBoMS0+bWJfaGVpZ2h0ICAgICAgICAgICAgIHx8CisgICAgICAgICBoLT5zcHMuYml0X2RlcHRoX2x1bWEgICAgIT0gaDEtPnNwcy5iaXRfZGVwdGhfbHVtYSAgICB8fAorICAgICAgICAgaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjICE9IGgxLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMgfHwKKyAgICAgICAgIGgtPnNwcy5jb2xvcnNwYWNlICAgICAgICAhPSBoMS0+c3BzLmNvbG9yc3BhY2UpKSB7CisKKyAgICAgICAgLyogc2V0IGJpdHNfcGVyX3Jhd19zYW1wbGUgdG8gdGhlIHByZXZpb3VzIHZhbHVlLiB0aGUgY2hlY2sgZm9yIGNoYW5nZWQKKyAgICAgICAgICogYml0IGRlcHRoIGluIGgyNjRfc2V0X3BhcmFtZXRlcl9mcm9tX3NwcygpIHVzZXMgaXQgYW5kIHNldHMgaXQgdG8KKyAgICAgICAgICogdGhlIGN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgaC0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBoLT5zcHMuYml0X2RlcHRoX2x1bWE7CisKKyAgICAgICAgYXZfZnJlZXAoJmgtPmJpcHJlZF9zY3JhdGNocGFkKTsKKworICAgICAgICBoLT53aWR0aCAgICAgPSBoMS0+d2lkdGg7CisgICAgICAgIGgtPmhlaWdodCAgICA9IGgxLT5oZWlnaHQ7CisgICAgICAgIGgtPm1iX2hlaWdodCA9IGgxLT5tYl9oZWlnaHQ7CisgICAgICAgIGgtPm1iX3dpZHRoICA9IGgxLT5tYl93aWR0aDsKKyAgICAgICAgaC0+bWJfbnVtICAgID0gaDEtPm1iX251bTsKKyAgICAgICAgaC0+bWJfc3RyaWRlID0gaDEtPm1iX3N0cmlkZTsKKyAgICAgICAgaC0+Yl9zdHJpZGUgID0gaDEtPmJfc3RyaWRlOworICAgICAgICAvLyBTUFMvUFBTCisgICAgICAgIGlmICgocmV0ID0gY29weV9wYXJhbWV0ZXJfc2V0KCh2b2lkICoqKWgtPnNwc19idWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKiloMS0+c3BzX2J1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TUFNfQ09VTlQsIHNpemVvZihTUFMpKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaC0+c3BzID0gaDEtPnNwczsKKyAgICAgICAgaWYgKChyZXQgPSBjb3B5X3BhcmFtZXRlcl9zZXQoKHZvaWQgKiopaC0+cHBzX2J1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKWgxLT5wcHNfYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BQU19DT1VOVCwgc2l6ZW9mKFBQUykpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBoLT5wcHMgPSBoMS0+cHBzOworCisgICAgICAgIGlmICgoZXJyID0gaDI2NF9zbGljZV9oZWFkZXJfaW5pdChoLCAxKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImgyNjRfc2xpY2VfaGVhZGVyX2luaXQoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBjb250ZXh0X3JlaW5pdGlhbGl6ZWQgPSAxOworCisjaWYgMAorICAgICAgICBoMjY0X3NldF9wYXJhbWV0ZXJfZnJvbV9zcHMoaCk7CisgICAgICAgIC8vTm90ZSB3ZSBzZXQgY29udGV4dF9yZWluaXRpYWxpemVkIHdoaWNoIHdpbGwgY2F1c2UgaDI2NF9zZXRfcGFyYW1ldGVyX2Zyb21fc3BzIHRvIGJlIHJlZXhlY3V0ZWQKKyAgICAgICAgaC0+Y3VyX2Nocm9tYV9mb3JtYXRfaWRjID0gaDEtPmN1cl9jaHJvbWFfZm9ybWF0X2lkYzsKKyNlbmRpZgorICAgIH0KKyAgICAvKiB1cGRhdGUgbGluZXNpemUgb24gcmVzaXplIGZvciBoMjY0LiBUaGUgaDI2NCBkZWNvZGVyIGRvZXNuJ3QKKyAgICAgKiBuZWNlc3NhcmlseSBjYWxsIGZmX21wdl9mcmFtZV9zdGFydCBpbiB0aGUgbmV3IHRocmVhZCAqLworICAgIGgtPmxpbmVzaXplICAgPSBoMS0+bGluZXNpemU7CisgICAgaC0+dXZsaW5lc2l6ZSA9IGgxLT51dmxpbmVzaXplOworCisgICAgLyogY29weSBibG9ja19vZmZzZXQgc2luY2UgZnJhbWVfc3RhcnQgbWF5IG5vdCBiZSBjYWxsZWQgKi8KKyAgICBtZW1jcHkoaC0+YmxvY2tfb2Zmc2V0LCBoMS0+YmxvY2tfb2Zmc2V0LCBzaXplb2YoaC0+YmxvY2tfb2Zmc2V0KSk7CisKKyAgICBpZiAoIWluaXRlZCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1NQU19DT1VOVDsgaSsrKQorICAgICAgICAgICAgYXZfZnJlZXAoaC0+c3BzX2J1ZmZlcnMgKyBpKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BQU19DT1VOVDsgaSsrKQorICAgICAgICAgICAgYXZfZnJlZXAoaC0+cHBzX2J1ZmZlcnMgKyBpKTsKKworICAgICAgICBhdl9mcmVlcCgmaC0+cmJzcF9idWZmZXJbMF0pOworICAgICAgICBhdl9mcmVlcCgmaC0+cmJzcF9idWZmZXJbMV0pOworICAgICAgICBtZW1jcHkoaCwgaDEsIG9mZnNldG9mKEgyNjRDb250ZXh0LCBpbnRyYV9wY21fcHRyKSk7CisgICAgICAgIG1lbWNweSgmaC0+Y2FiYWMsICZoMS0+Y2FiYWMsCisgICAgICAgICAgICAgICBzaXplb2YoSDI2NENvbnRleHQpIC0gb2Zmc2V0b2YoSDI2NENvbnRleHQsIGNhYmFjKSk7CisgICAgICAgIGF2X2Fzc2VydDAoKHZvaWQqKSZoLT5jYWJhYyA9PSAmaC0+bWJfcGFkZGluZyArIDEpOworCisgICAgICAgIG1lbXNldChoLT5zcHNfYnVmZmVycywgMCwgc2l6ZW9mKGgtPnNwc19idWZmZXJzKSk7CisgICAgICAgIG1lbXNldChoLT5wcHNfYnVmZmVycywgMCwgc2l6ZW9mKGgtPnBwc19idWZmZXJzKSk7CisKKyAgICAgICAgbWVtc2V0KCZoLT5lciwgMCwgc2l6ZW9mKGgtPmVyKSk7CisgICAgICAgIG1lbXNldCgmaC0+bWIsIDAsIHNpemVvZihoLT5tYikpOworICAgICAgICBtZW1zZXQoJmgtPm1iX2x1bWFfZGMsIDAsIHNpemVvZihoLT5tYl9sdW1hX2RjKSk7CisgICAgICAgIG1lbXNldCgmaC0+bWJfcGFkZGluZywgMCwgc2l6ZW9mKGgtPm1iX3BhZGRpbmcpKTsKKyAgICAgICAgbWVtc2V0KCZoLT5jdXJfcGljLCAwLCBzaXplb2YoaC0+Y3VyX3BpYykpOworCisgICAgICAgIGgtPmF2Y3R4ICAgICAgICAgICAgID0gZHN0OworICAgICAgICBoLT5EUEIgICAgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIGgtPnFzY2FsZV90YWJsZV9wb29sID0gTlVMTDsKKyAgICAgICAgaC0+bWJfdHlwZV9wb29sICAgICAgPSBOVUxMOworICAgICAgICBoLT5yZWZfaW5kZXhfcG9vbCAgICA9IE5VTEw7CisgICAgICAgIGgtPm1vdGlvbl92YWxfcG9vbCAgID0gTlVMTDsKKyAgICAgICAgaC0+aW50cmE0eDRfcHJlZF9tb2RlPSBOVUxMOworICAgICAgICBoLT5ub25femVyb19jb3VudCAgICA9IE5VTEw7CisgICAgICAgIGgtPnNsaWNlX3RhYmxlX2Jhc2UgID0gTlVMTDsKKyAgICAgICAgaC0+c2xpY2VfdGFibGUgICAgICAgPSBOVUxMOworICAgICAgICBoLT5jYnBfdGFibGUgICAgICAgICA9IE5VTEw7CisgICAgICAgIGgtPmNocm9tYV9wcmVkX21vZGVfdGFibGUgPSBOVUxMOworICAgICAgICBtZW1zZXQoaC0+bXZkX3RhYmxlLCAwLCBzaXplb2YoaC0+bXZkX3RhYmxlKSk7CisgICAgICAgIGgtPmRpcmVjdF90YWJsZSAgICAgID0gTlVMTDsKKyAgICAgICAgaC0+bGlzdF9jb3VudHMgICAgICAgPSBOVUxMOworICAgICAgICBoLT5tYjJiX3h5ICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIGgtPm1iMmJyX3h5ICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgaC0+cmJzcF9idWZmZXJbaV0gPSBOVUxMOworICAgICAgICAgICAgaC0+cmJzcF9idWZmZXJfc2l6ZVtpXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaDEtPmNvbnRleHRfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaC0+Y29udGV4dF9pbml0aWFsaXplZCA9IDA7CisKKyAgICAgICAgbWVtc2V0KCZoLT5jdXJfcGljLCAwLCBzaXplb2YoaC0+Y3VyX3BpYykpOworICAgICAgICBhdl9mcmFtZV91bnJlZigmaC0+Y3VyX3BpYy5mKTsKKyAgICAgICAgaC0+Y3VyX3BpYy50Zi5mID0gJmgtPmN1cl9waWMuZjsKKworICAgICAgICByZXQgPSBmZl9oMjY0X2FsbG9jX3RhYmxlcyhoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhkc3QsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBmZl9oMjY0X2NvbnRleHRfaW5pdChoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhkc3QsIEFWX0xPR19FUlJPUiwgImNvbnRleHRfaW5pdCgpIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaC0+YmlwcmVkX3NjcmF0Y2hwYWQgPSBOVUxMOworICAgICAgICBoLT5lZGdlX2VtdV9idWZmZXIgICA9IE5VTEw7CisKKyAgICAgICAgaC0+dGhyZWFkX2NvbnRleHRbMF0gPSBoOworICAgICAgICBoLT5jb250ZXh0X2luaXRpYWxpemVkID0gaDEtPmNvbnRleHRfaW5pdGlhbGl6ZWQ7CisgICAgfQorCisgICAgaC0+YXZjdHgtPmNvZGVkX2hlaWdodCAgPSBoMS0+YXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICBoLT5hdmN0eC0+Y29kZWRfd2lkdGggICA9IGgxLT5hdmN0eC0+Y29kZWRfd2lkdGg7CisgICAgaC0+YXZjdHgtPndpZHRoICAgICAgICAgPSBoMS0+YXZjdHgtPndpZHRoOworICAgIGgtPmF2Y3R4LT5oZWlnaHQgICAgICAgID0gaDEtPmF2Y3R4LT5oZWlnaHQ7CisgICAgaC0+Y29kZWRfcGljdHVyZV9udW1iZXIgPSBoMS0+Y29kZWRfcGljdHVyZV9udW1iZXI7CisgICAgaC0+Zmlyc3RfZmllbGQgICAgICAgICAgPSBoMS0+Zmlyc3RfZmllbGQ7CisgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgICAgPSBoMS0+cGljdHVyZV9zdHJ1Y3R1cmU7CisgICAgaC0+cXNjYWxlICAgICAgICAgICAgICAgPSBoMS0+cXNjYWxlOworICAgIGgtPmRyb3BwYWJsZSAgICAgICAgICAgID0gaDEtPmRyb3BwYWJsZTsKKyAgICBoLT5sb3dfZGVsYXkgICAgICAgICAgICA9IGgxLT5sb3dfZGVsYXk7CisKKyAgICBmb3IgKGkgPSAwOyBoLT5EUEIgJiYgaSA8IEgyNjRfTUFYX1BJQ1RVUkVfQ09VTlQ7IGkrKykgeworICAgICAgICBmZl9oMjY0X3VucmVmX3BpY3R1cmUoaCwgJmgtPkRQQltpXSk7CisgICAgICAgIGlmIChoMS0+RFBCICYmIGgxLT5EUEJbaV0uZi5idWZbMF0gJiYKKyAgICAgICAgICAgIChyZXQgPSBmZl9oMjY0X3JlZl9waWN0dXJlKGgsICZoLT5EUEJbaV0sICZoMS0+RFBCW2ldKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBoLT5jdXJfcGljX3B0ciA9IFJFQkFTRV9QSUNUVVJFKGgxLT5jdXJfcGljX3B0ciwgaCwgaDEpOworICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCAmaC0+Y3VyX3BpYyk7CisgICAgaWYgKGgxLT5jdXJfcGljLmYuYnVmWzBdICYmIChyZXQgPSBmZl9oMjY0X3JlZl9waWN0dXJlKGgsICZoLT5jdXJfcGljLCAmaDEtPmN1cl9waWMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBoLT53b3JrYXJvdW5kX2J1Z3MgPSBoMS0+d29ya2Fyb3VuZF9idWdzOworICAgIGgtPmxvd19kZWxheSAgICAgICA9IGgxLT5sb3dfZGVsYXk7CisgICAgaC0+ZHJvcHBhYmxlICAgICAgID0gaDEtPmRyb3BwYWJsZTsKKworICAgIC8vIGV4dHJhZGF0YS9OQUwgaGFuZGxpbmcKKyAgICBoLT5pc19hdmMgPSBoMS0+aXNfYXZjOworCisgICAgLy8gU1BTL1BQUworICAgIGlmICgocmV0ID0gY29weV9wYXJhbWV0ZXJfc2V0KCh2b2lkICoqKWgtPnNwc19idWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKWgxLT5zcHNfYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1BTX0NPVU5ULCBzaXplb2YoU1BTKSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBoLT5zcHMgPSBoMS0+c3BzOworICAgIGlmICgocmV0ID0gY29weV9wYXJhbWV0ZXJfc2V0KCh2b2lkICoqKWgtPnBwc19idWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKWgxLT5wcHNfYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUFBTX0NPVU5ULCBzaXplb2YoUFBTKSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBoLT5wcHMgPSBoMS0+cHBzOworCisgICAgLy8gRGVxdWFudGl6YXRpb24gbWF0cmljZXMKKyAgICAvLyBGSVhNRSB0aGVzZSBhcmUgYmlnIC0gY2FuIHRoZXkgYmUgb25seSBjb3BpZWQgd2hlbiBQUFMgY2hhbmdlcz8KKyAgICBjb3B5X2ZpZWxkcyhoLCBoMSwgZGVxdWFudDRfYnVmZmVyLCBkZXF1YW50NF9jb2VmZik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICBoLT5kZXF1YW50NF9jb2VmZltpXSA9IGgtPmRlcXVhbnQ0X2J1ZmZlclswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgxLT5kZXF1YW50NF9jb2VmZltpXSAtIGgxLT5kZXF1YW50NF9idWZmZXJbMF0pOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgaC0+ZGVxdWFudDhfY29lZmZbaV0gPSBoLT5kZXF1YW50OF9idWZmZXJbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoMS0+ZGVxdWFudDhfY29lZmZbaV0gLSBoMS0+ZGVxdWFudDhfYnVmZmVyWzBdKTsKKworICAgIGgtPmRlcXVhbnRfY29lZmZfcHBzID0gaDEtPmRlcXVhbnRfY29lZmZfcHBzOworCisgICAgLy8gUE9DIHRpbWluZworICAgIGNvcHlfZmllbGRzKGgsIGgxLCBwb2NfbHNiLCByZWR1bmRhbnRfcGljX2NvdW50KTsKKworICAgIC8vIHJlZmVyZW5jZSBsaXN0cworICAgIGNvcHlfZmllbGRzKGgsIGgxLCBzaG9ydF9yZWYsIGNhYmFjX2luaXRfaWRjKTsKKworICAgIGNvcHlfcGljdHVyZV9yYW5nZShoLT5zaG9ydF9yZWYsIGgxLT5zaG9ydF9yZWYsIDMyLCBoLCBoMSk7CisgICAgY29weV9waWN0dXJlX3JhbmdlKGgtPmxvbmdfcmVmLCBoMS0+bG9uZ19yZWYsIDMyLCBoLCBoMSk7CisgICAgY29weV9waWN0dXJlX3JhbmdlKGgtPmRlbGF5ZWRfcGljLCBoMS0+ZGVsYXllZF9waWMsCisgICAgICAgICAgICAgICAgICAgICAgIE1BWF9ERUxBWUVEX1BJQ19DT1VOVCArIDIsIGgsIGgxKTsKKworICAgIGgtPmZyYW1lX3JlY292ZXJlZCAgICAgICA9IGgxLT5mcmFtZV9yZWNvdmVyZWQ7CisKKyAgICBpZiAoY29udGV4dF9yZWluaXRpYWxpemVkKQorICAgICAgICBmZl9oMjY0X3NldF9wYXJhbWV0ZXJfZnJvbV9zcHMoaCk7CisKKyAgICBpZiAoIWgtPmN1cl9waWNfcHRyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghaC0+ZHJvcHBhYmxlKSB7CisgICAgICAgIGVyciA9IGZmX2gyNjRfZXhlY3V0ZV9yZWZfcGljX21hcmtpbmcoaCwgaC0+bW1jbywgaC0+bW1jb19pbmRleCk7CisgICAgICAgIGgtPnByZXZfcG9jX21zYiA9IGgtPnBvY19tc2I7CisgICAgICAgIGgtPnByZXZfcG9jX2xzYiA9IGgtPnBvY19sc2I7CisgICAgfQorICAgIGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCA9IGgtPmZyYW1lX251bV9vZmZzZXQ7CisgICAgaC0+cHJldl9mcmFtZV9udW0gICAgICAgID0gaC0+ZnJhbWVfbnVtOworICAgIGgtPm91dHB1dGVkX3BvYyAgICAgICAgICA9IGgtPm5leHRfb3V0cHV0ZWRfcG9jOworCisgICAgaC0+cmVjb3ZlcnlfZnJhbWUgICAgICAgID0gaDEtPnJlY292ZXJ5X2ZyYW1lOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBoMjY0X2ZyYW1lX3N0YXJ0KEgyNjRDb250ZXh0ICpoKQoreworICAgIEgyNjRQaWN0dXJlICpwaWM7CisgICAgaW50IGksIHJldDsKKyAgICBjb25zdCBpbnQgcGl4ZWxfc2hpZnQgPSBoLT5waXhlbF9zaGlmdDsKKyAgICBpbnQgY1s0XSA9IHsKKyAgICAgICAgMTw8KGgtPnNwcy5iaXRfZGVwdGhfbHVtYS0xKSwKKyAgICAgICAgMTw8KGgtPnNwcy5iaXRfZGVwdGhfY2hyb21hLTEpLAorICAgICAgICAxPDwoaC0+c3BzLmJpdF9kZXB0aF9jaHJvbWEtMSksCisgICAgICAgIC0xCisgICAgfTsKKworICAgIGlmICghZmZfdGhyZWFkX2Nhbl9zdGFydF9mcmFtZShoLT5hdmN0eCkpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJBdHRlbXB0IHRvIHN0YXJ0IGEgZnJhbWUgb3V0c2lkZSBTRVRVUCBzdGF0ZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZWxlYXNlX3VudXNlZF9waWN0dXJlcyhoLCAxKTsKKyAgICBoLT5jdXJfcGljX3B0ciA9IE5VTEw7CisKKyAgICBpID0gZmluZF91bnVzZWRfcGljdHVyZShoKTsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJubyBmcmFtZSBidWZmZXIgYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHBpYyA9ICZoLT5EUEJbaV07CisKKyAgICBwaWMtPnJlZmVyZW5jZSAgICAgICAgICAgICAgPSBoLT5kcm9wcGFibGUgPyAwIDogaC0+cGljdHVyZV9zdHJ1Y3R1cmU7CisgICAgcGljLT5mLmNvZGVkX3BpY3R1cmVfbnVtYmVyID0gaC0+Y29kZWRfcGljdHVyZV9udW1iZXIrKzsKKyAgICBwaWMtPmZpZWxkX3BpY3R1cmUgICAgICAgICAgPSBoLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FOworCisgICAgLyoKKyAgICAgKiBaZXJvIGtleV9mcmFtZSBoZXJlOyBJRFIgbWFya2luZ3MgcGVyIHNsaWNlIGluIGZyYW1lIG9yIGZpZWxkcyBhcmUgT1JlZAorICAgICAqIGluIGxhdGVyLgorICAgICAqIFNlZSBkZWNvZGVfbmFsX3VuaXRzKCkuCisgICAgICovCisgICAgcGljLT5mLmtleV9mcmFtZSA9IDA7CisgICAgcGljLT5tbWNvX3Jlc2V0ICA9IDA7CisgICAgcGljLT5yZWNvdmVyZWQgICA9IDA7CisgICAgcGljLT5pbnZhbGlkX2dhcCA9IDA7CisgICAgcGljLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250ID0gaC0+c2VpX3JlY292ZXJ5X2ZyYW1lX2NudDsKKworICAgIGlmICgocmV0ID0gYWxsb2NfcGljdHVyZShoLCBwaWMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYoIWgtPmZyYW1lX3JlY292ZXJlZCAmJiAhaC0+YXZjdHgtPmh3YWNjZWwgJiYKKyAgICAgICAhKGgtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpKQorICAgICAgICBhdnByaXZfY29sb3JfZnJhbWUoJnBpYy0+ZiwgYyk7CisKKyAgICBoLT5jdXJfcGljX3B0ciA9IHBpYzsKKyAgICBmZl9oMjY0X3VucmVmX3BpY3R1cmUoaCwgJmgtPmN1cl9waWMpOworICAgIGlmIChDT05GSUdfRVJST1JfUkVTSUxJRU5DRSkgeworICAgICAgICBmZl9oMjY0X3NldF9lcnBpYygmaC0+ZXIuY3VyX3BpYywgTlVMTCk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9oMjY0X3JlZl9waWN0dXJlKGgsICZoLT5jdXJfcGljLCBoLT5jdXJfcGljX3B0cikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChDT05GSUdfRVJST1JfUkVTSUxJRU5DRSkgeworICAgICAgICBmZl9lcl9mcmFtZV9zdGFydCgmaC0+ZXIpOworICAgICAgICBmZl9oMjY0X3NldF9lcnBpYygmaC0+ZXIubGFzdF9waWMsIE5VTEwpOworICAgICAgICBmZl9oMjY0X3NldF9lcnBpYygmaC0+ZXIubmV4dF9waWMsIE5VTEwpOworICAgIH0KKworICAgIGFzc2VydChoLT5saW5lc2l6ZSAmJiBoLT51dmxpbmVzaXplKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGgtPmJsb2NrX29mZnNldFtpXSAgICAgICAgICAgPSAoNCAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgJiA3KSA8PCBwaXhlbF9zaGlmdCkgKyA0ICogaC0+bGluZXNpemUgKiAoKHNjYW44W2ldIC0gc2NhbjhbMF0pID4+IDMpOworICAgICAgICBoLT5ibG9ja19vZmZzZXRbNDggKyBpXSAgICAgID0gKDQgKiAoKHNjYW44W2ldIC0gc2NhbjhbMF0pICYgNykgPDwgcGl4ZWxfc2hpZnQpICsgOCAqIGgtPmxpbmVzaXplICogKChzY2FuOFtpXSAtIHNjYW44WzBdKSA+PiAzKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgaC0+YmxvY2tfb2Zmc2V0WzE2ICsgaV0gICAgICA9CisgICAgICAgIGgtPmJsb2NrX29mZnNldFszMiArIGldICAgICAgPSAoNCAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgJiA3KSA8PCBwaXhlbF9zaGlmdCkgKyA0ICogaC0+dXZsaW5lc2l6ZSAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgPj4gMyk7CisgICAgICAgIGgtPmJsb2NrX29mZnNldFs0OCArIDE2ICsgaV0gPQorICAgICAgICBoLT5ibG9ja19vZmZzZXRbNDggKyAzMiArIGldID0gKDQgKiAoKHNjYW44W2ldIC0gc2NhbjhbMF0pICYgNykgPDwgcGl4ZWxfc2hpZnQpICsgOCAqIGgtPnV2bGluZXNpemUgKiAoKHNjYW44W2ldIC0gc2NhbjhbMF0pID4+IDMpOworICAgIH0KKworICAgIC8qIFdlIG1hcmsgdGhlIGN1cnJlbnQgcGljdHVyZSBhcyBub24tcmVmZXJlbmNlIGFmdGVyIGFsbG9jYXRpbmcgaXQsIHNvCisgICAgICogdGhhdCBpZiB3ZSBicmVhayBvdXQgZHVlIHRvIGFuIGVycm9yIGl0IGNhbiBiZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5CisgICAgICogaW4gdGhlIG5leHQgZmZfbXB2X2ZyYW1lX3N0YXJ0KCkuCisgICAgICovCisgICAgaC0+Y3VyX3BpY19wdHItPnJlZmVyZW5jZSA9IDA7CisKKyAgICBoLT5jdXJfcGljX3B0ci0+ZmllbGRfcG9jWzBdID0gaC0+Y3VyX3BpY19wdHItPmZpZWxkX3BvY1sxXSA9IElOVF9NQVg7CisKKyAgICBoLT5uZXh0X291dHB1dF9waWMgPSBOVUxMOworCisgICAgYXNzZXJ0KGgtPmN1cl9waWNfcHRyLT5sb25nX3JlZiA9PSAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGJhY2t1cF9tYl9ib3JkZXIoSDI2NENvbnRleHQgKmgsIHVpbnQ4X3QgKnNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyY19jYiwgdWludDhfdCAqc3JjX2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50IHV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpbXBsZSkKK3sKKyAgICB1aW50OF90ICp0b3BfYm9yZGVyOworICAgIGludCB0b3BfaWR4ID0gMTsKKyAgICBjb25zdCBpbnQgcGl4ZWxfc2hpZnQgPSBoLT5waXhlbF9zaGlmdDsKKyAgICBpbnQgY2hyb21hNDQ0ID0gQ0hST01BNDQ0KGgpOworICAgIGludCBjaHJvbWE0MjIgPSBDSFJPTUE0MjIoaCk7CisKKyAgICBzcmNfeSAgLT0gbGluZXNpemU7CisgICAgc3JjX2NiIC09IHV2bGluZXNpemU7CisgICAgc3JjX2NyIC09IHV2bGluZXNpemU7CisKKyAgICBpZiAoIXNpbXBsZSAmJiBGUkFNRV9NQkFGRihoKSkgeworICAgICAgICBpZiAoaC0+bWJfeSAmIDEpIHsKKyAgICAgICAgICAgIGlmICghTUJfTUJBRkYoaCkpIHsKKyAgICAgICAgICAgICAgICB0b3BfYm9yZGVyID0gaC0+dG9wX2JvcmRlcnNbMF1baC0+bWJfeF07CisgICAgICAgICAgICAgICAgQVZfQ09QWTEyOCh0b3BfYm9yZGVyLCBzcmNfeSArIDE1ICogbGluZXNpemUpOworICAgICAgICAgICAgICAgIGlmIChwaXhlbF9zaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTEyOCh0b3BfYm9yZGVyICsgMTYsIHNyY195ICsgMTUgKiBsaW5lc2l6ZSArIDE2KTsKKyAgICAgICAgICAgICAgICBpZiAoc2ltcGxlIHx8ICFDT05GSUdfR1JBWSB8fCAhKGgtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hyb21hNDQ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfc2hpZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMTI4KHRvcF9ib3JkZXIgKyAzMiwgc3JjX2NiICsgMTUgKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMTI4KHRvcF9ib3JkZXIgKyA0OCwgc3JjX2NiICsgMTUgKiB1dmxpbmVzaXplICsgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkxMjgodG9wX2JvcmRlciArIDY0LCBzcmNfY3IgKyAxNSAqIHV2bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkxMjgodG9wX2JvcmRlciArIDgwLCBzcmNfY3IgKyAxNSAqIHV2bGluZXNpemUgKyAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkxMjgodG9wX2JvcmRlciArIDE2LCBzcmNfY2IgKyAxNSAqIHV2bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkxMjgodG9wX2JvcmRlciArIDMyLCBzcmNfY3IgKyAxNSAqIHV2bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNocm9tYTQyMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsX3NoaWZ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTEyOCh0b3BfYm9yZGVyICsgMzIsIHNyY19jYiArIDE1ICogdXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTEyOCh0b3BfYm9yZGVyICsgNDgsIHNyY19jciArIDE1ICogdXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPUFk2NCh0b3BfYm9yZGVyICsgMTYsIHNyY19jYiArIDE1ICogdXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTY0KHRvcF9ib3JkZXIgKyAyNCwgc3JjX2NyICsgMTUgKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbF9zaGlmdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkxMjgodG9wX2JvcmRlciArIDMyLCBzcmNfY2IgKyA3ICogdXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTEyOCh0b3BfYm9yZGVyICsgNDgsIHNyY19jciArIDcgKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTY0KHRvcF9ib3JkZXIgKyAxNiwgc3JjX2NiICsgNyAqIHV2bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPUFk2NCh0b3BfYm9yZGVyICsgMjQsIHNyY19jciArIDcgKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChNQl9NQkFGRihoKSkgeworICAgICAgICAgICAgdG9wX2lkeCA9IDA7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRvcF9ib3JkZXIgPSBoLT50b3BfYm9yZGVyc1t0b3BfaWR4XVtoLT5tYl94XTsKKyAgICAvKiBUaGVyZSBhcmUgdHdvIGxpbmVzIHNhdmVkLCB0aGUgbGluZSBhYm92ZSB0aGUgdG9wIG1hY3JvYmxvY2sKKyAgICAgKiBvZiBhIHBhaXIsIGFuZCB0aGUgbGluZSBhYm92ZSB0aGUgYm90dG9tIG1hY3JvYmxvY2suICovCisgICAgQVZfQ09QWTEyOCh0b3BfYm9yZGVyLCBzcmNfeSArIDE2ICogbGluZXNpemUpOworICAgIGlmIChwaXhlbF9zaGlmdCkKKyAgICAgICAgQVZfQ09QWTEyOCh0b3BfYm9yZGVyICsgMTYsIHNyY195ICsgMTYgKiBsaW5lc2l6ZSArIDE2KTsKKworICAgIGlmIChzaW1wbGUgfHwgIUNPTkZJR19HUkFZIHx8ICEoaC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgIGlmIChjaHJvbWE0NDQpIHsKKyAgICAgICAgICAgIGlmIChwaXhlbF9zaGlmdCkgeworICAgICAgICAgICAgICAgIEFWX0NPUFkxMjgodG9wX2JvcmRlciArIDMyLCBzcmNfY2IgKyAxNiAqIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMTI4KHRvcF9ib3JkZXIgKyA0OCwgc3JjX2NiICsgMTYgKiBsaW5lc2l6ZSArIDE2KTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMTI4KHRvcF9ib3JkZXIgKyA2NCwgc3JjX2NyICsgMTYgKiBsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgQVZfQ09QWTEyOCh0b3BfYm9yZGVyICsgODAsIHNyY19jciArIDE2ICogbGluZXNpemUgKyAxNik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFWX0NPUFkxMjgodG9wX2JvcmRlciArIDE2LCBzcmNfY2IgKyAxNiAqIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMTI4KHRvcF9ib3JkZXIgKyAzMiwgc3JjX2NyICsgMTYgKiBsaW5lc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2hyb21hNDIyKSB7CisgICAgICAgICAgICBpZiAocGl4ZWxfc2hpZnQpIHsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMTI4KHRvcF9ib3JkZXIgKyAzMiwgc3JjX2NiICsgMTYgKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMTI4KHRvcF9ib3JkZXIgKyA0OCwgc3JjX2NyICsgMTYgKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQVZfQ09QWTY0KHRvcF9ib3JkZXIgKyAxNiwgc3JjX2NiICsgMTYgKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZNjQodG9wX2JvcmRlciArIDI0LCBzcmNfY3IgKyAxNiAqIHV2bGluZXNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBpeGVsX3NoaWZ0KSB7CisgICAgICAgICAgICAgICAgQVZfQ09QWTEyOCh0b3BfYm9yZGVyICsgMzIsIHNyY19jYiArIDggKiB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMTI4KHRvcF9ib3JkZXIgKyA0OCwgc3JjX2NyICsgOCAqIHV2bGluZXNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBVl9DT1BZNjQodG9wX2JvcmRlciArIDE2LCBzcmNfY2IgKyA4ICogdXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgQVZfQ09QWTY0KHRvcF9ib3JkZXIgKyAyNCwgc3JjX2NyICsgOCAqIHV2bGluZXNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEluaXRpYWxpemUgaW1wbGljaXRfd2VpZ2h0IHRhYmxlLgorICogQHBhcmFtIGZpZWxkICAwLzEgaW5pdGlhbGl6ZSB0aGUgd2VpZ2h0IGZvciBpbnRlcmxhY2VkIE1CQUZGCisgKiAgICAgICAgICAgICAgICAtMSBpbml0aWFsaXplcyB0aGUgcmVzdAorICovCitzdGF0aWMgdm9pZCBpbXBsaWNpdF93ZWlnaHRfdGFibGUoSDI2NENvbnRleHQgKmgsIGludCBmaWVsZCkKK3sKKyAgICBpbnQgcmVmMCwgcmVmMSwgaSwgY3VyX3BvYywgcmVmX3N0YXJ0LCByZWZfY291bnQwLCByZWZfY291bnQxOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBoLT5sdW1hX3dlaWdodF9mbGFnW2ldICAgPSAwOworICAgICAgICBoLT5jaHJvbWFfd2VpZ2h0X2ZsYWdbaV0gPSAwOworICAgIH0KKworICAgIGlmIChmaWVsZCA8IDApIHsKKyAgICAgICAgaWYgKGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpIHsKKyAgICAgICAgICAgIGN1cl9wb2MgPSBoLT5jdXJfcGljX3B0ci0+cG9jOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VyX3BvYyA9IGgtPmN1cl9waWNfcHRyLT5maWVsZF9wb2NbaC0+cGljdHVyZV9zdHJ1Y3R1cmUgLSAxXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaC0+cmVmX2NvdW50WzBdID09IDEgJiYgaC0+cmVmX2NvdW50WzFdID09IDEgJiYgIUZSQU1FX01CQUZGKGgpICYmCisgICAgICAgICAgICBoLT5yZWZfbGlzdFswXVswXS5wb2MgKyBoLT5yZWZfbGlzdFsxXVswXS5wb2MgPT0gMiAqIGN1cl9wb2MpIHsKKyAgICAgICAgICAgIGgtPnVzZV93ZWlnaHQgICAgICAgID0gMDsKKyAgICAgICAgICAgIGgtPnVzZV93ZWlnaHRfY2hyb21hID0gMDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZWZfc3RhcnQgID0gMDsKKyAgICAgICAgcmVmX2NvdW50MCA9IGgtPnJlZl9jb3VudFswXTsKKyAgICAgICAgcmVmX2NvdW50MSA9IGgtPnJlZl9jb3VudFsxXTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdXJfcG9jICAgID0gaC0+Y3VyX3BpY19wdHItPmZpZWxkX3BvY1tmaWVsZF07CisgICAgICAgIHJlZl9zdGFydCAgPSAxNjsKKyAgICAgICAgcmVmX2NvdW50MCA9IDE2ICsgMiAqIGgtPnJlZl9jb3VudFswXTsKKyAgICAgICAgcmVmX2NvdW50MSA9IDE2ICsgMiAqIGgtPnJlZl9jb3VudFsxXTsKKyAgICB9CisKKyAgICBoLT51c2Vfd2VpZ2h0ICAgICAgICAgICAgICAgPSAyOworICAgIGgtPnVzZV93ZWlnaHRfY2hyb21hICAgICAgICA9IDI7CisgICAgaC0+bHVtYV9sb2cyX3dlaWdodF9kZW5vbSAgID0gNTsKKyAgICBoLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gPSA1OworCisgICAgZm9yIChyZWYwID0gcmVmX3N0YXJ0OyByZWYwIDwgcmVmX2NvdW50MDsgcmVmMCsrKSB7CisgICAgICAgIGludCBwb2MwID0gaC0+cmVmX2xpc3RbMF1bcmVmMF0ucG9jOworICAgICAgICBmb3IgKHJlZjEgPSByZWZfc3RhcnQ7IHJlZjEgPCByZWZfY291bnQxOyByZWYxKyspIHsKKyAgICAgICAgICAgIGludCB3ID0gMzI7CisgICAgICAgICAgICBpZiAoIWgtPnJlZl9saXN0WzBdW3JlZjBdLmxvbmdfcmVmICYmICFoLT5yZWZfbGlzdFsxXVtyZWYxXS5sb25nX3JlZikgeworICAgICAgICAgICAgICAgIGludCBwb2MxID0gaC0+cmVmX2xpc3RbMV1bcmVmMV0ucG9jOworICAgICAgICAgICAgICAgIGludCB0ZCAgID0gYXZfY2xpcChwb2MxIC0gcG9jMCwgLTEyOCwgMTI3KTsKKyAgICAgICAgICAgICAgICBpZiAodGQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRiID0gYXZfY2xpcChjdXJfcG9jIC0gcG9jMCwgLTEyOCwgMTI3KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHR4ID0gKDE2Mzg0ICsgKEZGQUJTKHRkKSA+PiAxKSkgLyB0ZDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpc3Rfc2NhbGVfZmFjdG9yID0gKHRiICogdHggKyAzMikgPj4gODsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3Rfc2NhbGVfZmFjdG9yID49IC02NCAmJiBkaXN0X3NjYWxlX2ZhY3RvciA8PSAxMjgpCisgICAgICAgICAgICAgICAgICAgICAgICB3ID0gNjQgLSBkaXN0X3NjYWxlX2ZhY3RvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmllbGQgPCAwKSB7CisgICAgICAgICAgICAgICAgaC0+aW1wbGljaXRfd2VpZ2h0W3JlZjBdW3JlZjFdWzBdID0KKyAgICAgICAgICAgICAgICBoLT5pbXBsaWNpdF93ZWlnaHRbcmVmMF1bcmVmMV1bMV0gPSB3OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoLT5pbXBsaWNpdF93ZWlnaHRbcmVmMF1bcmVmMV1bZmllbGRdID0gdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBpbml0aWFsaXplIHNjYW4gdGFibGVzCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfc2Nhbl90YWJsZXMoSDI2NENvbnRleHQgKmgpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyNkZWZpbmUgVFJBTlNQT1NFKHgpICgoeCkgPj4gMikgfCAoKCh4KSA8PCAyKSAmIDB4RikKKyAgICAgICAgaC0+emlnemFnX3NjYW5baV0gPSBUUkFOU1BPU0UoemlnemFnX3NjYW5baV0pOworICAgICAgICBoLT5maWVsZF9zY2FuW2ldICA9IFRSQU5TUE9TRShmaWVsZF9zY2FuW2ldKTsKKyN1bmRlZiBUUkFOU1BPU0UKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyNkZWZpbmUgVFJBTlNQT1NFKHgpICgoeCkgPj4gMykgfCAoKCh4KSAmIDcpIDw8IDMpCisgICAgICAgIGgtPnppZ3phZ19zY2FuOHg4W2ldICAgICAgID0gVFJBTlNQT1NFKGZmX3ppZ3phZ19kaXJlY3RbaV0pOworICAgICAgICBoLT56aWd6YWdfc2Nhbjh4OF9jYXZsY1tpXSA9IFRSQU5TUE9TRSh6aWd6YWdfc2Nhbjh4OF9jYXZsY1tpXSk7CisgICAgICAgIGgtPmZpZWxkX3NjYW44eDhbaV0gICAgICAgID0gVFJBTlNQT1NFKGZpZWxkX3NjYW44eDhbaV0pOworICAgICAgICBoLT5maWVsZF9zY2FuOHg4X2NhdmxjW2ldICA9IFRSQU5TUE9TRShmaWVsZF9zY2FuOHg4X2NhdmxjW2ldKTsKKyN1bmRlZiBUUkFOU1BPU0UKKyAgICB9CisgICAgaWYgKGgtPnNwcy50cmFuc2Zvcm1fYnlwYXNzKSB7IC8vIEZJWE1FIHNhbWUgdWdseQorICAgICAgICBtZW1jcHkoaC0+emlnemFnX3NjYW5fcTAgICAgICAgICAgLCB6aWd6YWdfc2NhbiAgICAgICAgICAgICAsIHNpemVvZihoLT56aWd6YWdfc2Nhbl9xMCAgICAgICAgICkpOworICAgICAgICBtZW1jcHkoaC0+emlnemFnX3NjYW44eDhfcTAgICAgICAgLCBmZl96aWd6YWdfZGlyZWN0ICAgICAgICAsIHNpemVvZihoLT56aWd6YWdfc2Nhbjh4OF9xMCAgICAgICkpOworICAgICAgICBtZW1jcHkoaC0+emlnemFnX3NjYW44eDhfY2F2bGNfcTAgLCB6aWd6YWdfc2Nhbjh4OF9jYXZsYyAgICAsIHNpemVvZihoLT56aWd6YWdfc2Nhbjh4OF9jYXZsY19xMCkpOworICAgICAgICBtZW1jcHkoaC0+ZmllbGRfc2Nhbl9xMCAgICAgICAgICAgLCBmaWVsZF9zY2FuICAgICAgICAgICAgICAsIHNpemVvZihoLT5maWVsZF9zY2FuX3EwICAgICAgICAgICkpOworICAgICAgICBtZW1jcHkoaC0+ZmllbGRfc2Nhbjh4OF9xMCAgICAgICAgLCBmaWVsZF9zY2FuOHg4ICAgICAgICAgICAsIHNpemVvZihoLT5maWVsZF9zY2FuOHg4X3EwICAgICAgICkpOworICAgICAgICBtZW1jcHkoaC0+ZmllbGRfc2Nhbjh4OF9jYXZsY19xMCAgLCBmaWVsZF9zY2FuOHg4X2NhdmxjICAgICAsIHNpemVvZihoLT5maWVsZF9zY2FuOHg4X2NhdmxjX3EwICkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShoLT56aWd6YWdfc2Nhbl9xMCAgICAgICAgICAsIGgtPnppZ3phZ19zY2FuICAgICAgICAgICwgc2l6ZW9mKGgtPnppZ3phZ19zY2FuX3EwICAgICAgICAgKSk7CisgICAgICAgIG1lbWNweShoLT56aWd6YWdfc2Nhbjh4OF9xMCAgICAgICAsIGgtPnppZ3phZ19zY2FuOHg4ICAgICAgICwgc2l6ZW9mKGgtPnppZ3phZ19zY2FuOHg4X3EwICAgICAgKSk7CisgICAgICAgIG1lbWNweShoLT56aWd6YWdfc2Nhbjh4OF9jYXZsY19xMCAsIGgtPnppZ3phZ19zY2FuOHg4X2NhdmxjICwgc2l6ZW9mKGgtPnppZ3phZ19zY2FuOHg4X2NhdmxjX3EwKSk7CisgICAgICAgIG1lbWNweShoLT5maWVsZF9zY2FuX3EwICAgICAgICAgICAsIGgtPmZpZWxkX3NjYW4gICAgICAgICAgICwgc2l6ZW9mKGgtPmZpZWxkX3NjYW5fcTAgICAgICAgICAgKSk7CisgICAgICAgIG1lbWNweShoLT5maWVsZF9zY2FuOHg4X3EwICAgICAgICAsIGgtPmZpZWxkX3NjYW44eDggICAgICAgICwgc2l6ZW9mKGgtPmZpZWxkX3NjYW44eDhfcTAgICAgICAgKSk7CisgICAgICAgIG1lbWNweShoLT5maWVsZF9zY2FuOHg4X2NhdmxjX3EwICAsIGgtPmZpZWxkX3NjYW44eDhfY2F2bGMgICwgc2l6ZW9mKGgtPmZpZWxkX3NjYW44eDhfY2F2bGNfcTAgKSk7CisgICAgfQorfQorCisvKioKKyAqIFJlcGxpY2F0ZSBIMjY0ICJtYXN0ZXIiIGNvbnRleHQgdG8gdGhyZWFkIGNvbnRleHRzLgorICovCitzdGF0aWMgaW50IGNsb25lX3NsaWNlKEgyNjRDb250ZXh0ICpkc3QsIEgyNjRDb250ZXh0ICpzcmMpCit7CisgICAgbWVtY3B5KGRzdC0+YmxvY2tfb2Zmc2V0LCBzcmMtPmJsb2NrX29mZnNldCwgc2l6ZW9mKGRzdC0+YmxvY2tfb2Zmc2V0KSk7CisgICAgZHN0LT5jdXJfcGljX3B0ciA9IHNyYy0+Y3VyX3BpY19wdHI7CisgICAgZHN0LT5jdXJfcGljICAgICA9IHNyYy0+Y3VyX3BpYzsKKyAgICBkc3QtPmxpbmVzaXplICAgID0gc3JjLT5saW5lc2l6ZTsKKyAgICBkc3QtPnV2bGluZXNpemUgID0gc3JjLT51dmxpbmVzaXplOworICAgIGRzdC0+Zmlyc3RfZmllbGQgPSBzcmMtPmZpcnN0X2ZpZWxkOworCisgICAgZHN0LT5wcmV2X3BvY19tc2IgICAgICAgICAgPSBzcmMtPnByZXZfcG9jX21zYjsKKyAgICBkc3QtPnByZXZfcG9jX2xzYiAgICAgICAgICA9IHNyYy0+cHJldl9wb2NfbHNiOworICAgIGRzdC0+cHJldl9mcmFtZV9udW1fb2Zmc2V0ID0gc3JjLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQ7CisgICAgZHN0LT5wcmV2X2ZyYW1lX251bSAgICAgICAgPSBzcmMtPnByZXZfZnJhbWVfbnVtOworICAgIGRzdC0+c2hvcnRfcmVmX2NvdW50ICAgICAgID0gc3JjLT5zaG9ydF9yZWZfY291bnQ7CisKKyAgICBtZW1jcHkoZHN0LT5zaG9ydF9yZWYsICAgICAgICBzcmMtPnNob3J0X3JlZiwgICAgICAgIHNpemVvZihkc3QtPnNob3J0X3JlZikpOworICAgIG1lbWNweShkc3QtPmxvbmdfcmVmLCAgICAgICAgIHNyYy0+bG9uZ19yZWYsICAgICAgICAgc2l6ZW9mKGRzdC0+bG9uZ19yZWYpKTsKKyAgICBtZW1jcHkoZHN0LT5kZWZhdWx0X3JlZl9saXN0LCBzcmMtPmRlZmF1bHRfcmVmX2xpc3QsIHNpemVvZihkc3QtPmRlZmF1bHRfcmVmX2xpc3QpKTsKKworICAgIG1lbWNweShkc3QtPmRlcXVhbnQ0X2NvZWZmLCAgIHNyYy0+ZGVxdWFudDRfY29lZmYsICAgc2l6ZW9mKHNyYy0+ZGVxdWFudDRfY29lZmYpKTsKKyAgICBtZW1jcHkoZHN0LT5kZXF1YW50OF9jb2VmZiwgICBzcmMtPmRlcXVhbnQ4X2NvZWZmLCAgIHNpemVvZihzcmMtPmRlcXVhbnQ4X2NvZWZmKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gQVZQaXhlbEZvcm1hdCBnZXRfcGl4ZWxfZm9ybWF0KEgyNjRDb250ZXh0ICpoLCBpbnQgZm9yY2VfY2FsbGJhY2spCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzWzJdOworICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqY2hvaWNlcyA9IHBpeF9mbXRzOworICAgIGludCBpOworCisgICAgcGl4X2ZtdHNbMV0gPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICBzd2l0Y2ggKGgtPnNwcy5iaXRfZGVwdGhfbHVtYSkgeworICAgIGNhc2UgOToKKyAgICAgICAgaWYgKENIUk9NQTQ0NChoKSkgeworICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19SR0IpIHsKKyAgICAgICAgICAgICAgICBwaXhfZm10c1swXSA9IEFWX1BJWF9GTVRfR0JSUDk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBwaXhfZm10c1swXSA9IEFWX1BJWF9GTVRfWVVWNDQ0UDk7CisgICAgICAgIH0gZWxzZSBpZiAoQ0hST01BNDIyKGgpKQorICAgICAgICAgICAgcGl4X2ZtdHNbMF0gPSBBVl9QSVhfRk1UX1lVVjQyMlA5OworICAgICAgICBlbHNlCisgICAgICAgICAgICBwaXhfZm10c1swXSA9IEFWX1BJWF9GTVRfWVVWNDIwUDk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICAgIGlmIChDSFJPTUE0NDQoaCkpIHsKKyAgICAgICAgICAgIGlmIChoLT5hdmN0eC0+Y29sb3JzcGFjZSA9PSBBVkNPTF9TUENfUkdCKSB7CisgICAgICAgICAgICAgICAgcGl4X2ZtdHNbMF0gPSBBVl9QSVhfRk1UX0dCUlAxMDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHBpeF9mbXRzWzBdID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTA7CisgICAgICAgIH0gZWxzZSBpZiAoQ0hST01BNDIyKGgpKQorICAgICAgICAgICAgcGl4X2ZtdHNbMF0gPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGl4X2ZtdHNbMF0gPSBBVl9QSVhfRk1UX1lVVjQyMFAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICAgICAgaWYgKENIUk9NQTQ0NChoKSkgeworICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19SR0IpIHsKKyAgICAgICAgICAgICAgICBwaXhfZm10c1swXSA9IEFWX1BJWF9GTVRfR0JSUDEyOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcGl4X2ZtdHNbMF0gPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMjsKKyAgICAgICAgfSBlbHNlIGlmIChDSFJPTUE0MjIoaCkpCisgICAgICAgICAgICBwaXhfZm10c1swXSA9IEFWX1BJWF9GTVRfWVVWNDIyUDEyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwaXhfZm10c1swXSA9IEFWX1BJWF9GTVRfWVVWNDIwUDEyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE0OgorICAgICAgICBpZiAoQ0hST01BNDQ0KGgpKSB7CisgICAgICAgICAgICBpZiAoaC0+YXZjdHgtPmNvbG9yc3BhY2UgPT0gQVZDT0xfU1BDX1JHQikgeworICAgICAgICAgICAgICAgIHBpeF9mbXRzWzBdID0gQVZfUElYX0ZNVF9HQlJQMTQ7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBwaXhfZm10c1swXSA9IEFWX1BJWF9GTVRfWVVWNDQ0UDE0OworICAgICAgICB9IGVsc2UgaWYgKENIUk9NQTQyMihoKSkKKyAgICAgICAgICAgIHBpeF9mbXRzWzBdID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBpeF9mbXRzWzBdID0gQVZfUElYX0ZNVF9ZVVY0MjBQMTQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgaWYgKENIUk9NQTQ0NChoKSkgeworICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19ZQ0dDTykKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRGV0ZWN0ZWQgdW5zdXBwb3J0ZWQgWUNnQ28gY29sb3JzcGFjZS5cbiIpOworICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19SR0IpCisgICAgICAgICAgICAgICAgcGl4X2ZtdHNbMF0gPSBBVl9QSVhfRk1UX0dCUlA7CisgICAgICAgICAgICBlbHNlIGlmIChoLT5hdmN0eC0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfSlBFRykKKyAgICAgICAgICAgICAgICBwaXhfZm10c1swXSA9IEFWX1BJWF9GTVRfWVVWSjQ0NFA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGl4X2ZtdHNbMF0gPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgICAgIH0gZWxzZSBpZiAoQ0hST01BNDIyKGgpKSB7CisgICAgICAgICAgICBpZiAoaC0+YXZjdHgtPmNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX0pQRUcpCisgICAgICAgICAgICAgICAgcGl4X2ZtdHNbMF0gPSBBVl9QSVhfRk1UX1lVVko0MjJQOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBpeF9mbXRzWzBdID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5jb2RlYy0+cGl4X2ZtdHMpCisgICAgICAgICAgICAgICAgY2hvaWNlcyA9IGgtPmF2Y3R4LT5jb2RlYy0+cGl4X2ZtdHM7CisgICAgICAgICAgICBlbHNlIGlmIChoLT5hdmN0eC0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfSlBFRykKKyAgICAgICAgICAgICAgICBjaG9pY2VzID0gaDI2NF9od2FjY2VsX3BpeGZtdF9saXN0X2pwZWdfNDIwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNob2ljZXMgPSBoMjY0X2h3YWNjZWxfcGl4Zm10X2xpc3RfNDIwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGJpdCBkZXB0aCAlZFxuIiwgaC0+c3BzLmJpdF9kZXB0aF9sdW1hKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZm9yIChpPTA7IGNob2ljZXNbaV0gIT0gQVZfUElYX0ZNVF9OT05FOyBpKyspCisgICAgICAgIGlmIChjaG9pY2VzW2ldID09IGgtPmF2Y3R4LT5waXhfZm10ICYmICFmb3JjZV9jYWxsYmFjaykKKyAgICAgICAgICAgIHJldHVybiBjaG9pY2VzW2ldOworICAgIHJldHVybiBmZl90aHJlYWRfZ2V0X2Zvcm1hdChoLT5hdmN0eCwgY2hvaWNlcyk7Cit9CisKKy8qIGV4cG9ydCBjb2RlZCBhbmQgY3JvcHBlZCBmcmFtZSBkaW1lbnNpb25zIHRvIEFWQ29kZWNDb250ZXh0ICovCitzdGF0aWMgaW50IGluaXRfZGltZW5zaW9ucyhIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBpbnQgd2lkdGggID0gaC0+d2lkdGggIC0gKGgtPnNwcy5jcm9wX3JpZ2h0ICsgaC0+c3BzLmNyb3BfbGVmdCk7CisgICAgaW50IGhlaWdodCA9IGgtPmhlaWdodCAtIChoLT5zcHMuY3JvcF90b3AgICArIGgtPnNwcy5jcm9wX2JvdHRvbSk7CisgICAgaW50IGNyb3BfcHJlc2VudCA9IGgtPnNwcy5jcm9wX2xlZnQgIHx8IGgtPnNwcy5jcm9wX3RvcCB8fAorICAgICAgICAgICAgICAgICAgICAgICBoLT5zcHMuY3JvcF9yaWdodCB8fCBoLT5zcHMuY3JvcF9ib3R0b207CisgICAgYXZfYXNzZXJ0MChoLT5zcHMuY3JvcF9yaWdodCArIGgtPnNwcy5jcm9wX2xlZnQgPCAodW5zaWduZWQpaC0+d2lkdGgpOworICAgIGF2X2Fzc2VydDAoaC0+c3BzLmNyb3BfdG9wICsgaC0+c3BzLmNyb3BfYm90dG9tIDwgKHVuc2lnbmVkKWgtPmhlaWdodCk7CisKKyAgICAvKiBoYW5kbGUgY29udGFpbmVyIGNyb3BwaW5nICovCisgICAgaWYgKCFjcm9wX3ByZXNlbnQgJiYKKyAgICAgICAgRkZBTElHTihoLT5hdmN0eC0+d2lkdGgsICAxNikgPT0gaC0+d2lkdGggJiYKKyAgICAgICAgRkZBTElHTihoLT5hdmN0eC0+aGVpZ2h0LCAxNikgPT0gaC0+aGVpZ2h0KSB7CisgICAgICAgIHdpZHRoICA9IGgtPmF2Y3R4LT53aWR0aDsKKyAgICAgICAgaGVpZ2h0ID0gaC0+YXZjdHgtPmhlaWdodDsKKyAgICB9CisKKyAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY3JvcHBlZCBkaW1lbnNpb25zOiAlZHglZC5cbiIsCisgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIklnbm9yaW5nIGNyb3BwaW5nIGluZm9ybWF0aW9uLlxuIik7CisgICAgICAgIGgtPnNwcy5jcm9wX2JvdHRvbSA9CisgICAgICAgIGgtPnNwcy5jcm9wX3RvcCAgICA9CisgICAgICAgIGgtPnNwcy5jcm9wX3JpZ2h0ICA9CisgICAgICAgIGgtPnNwcy5jcm9wX2xlZnQgICA9CisgICAgICAgIGgtPnNwcy5jcm9wICAgICAgICA9IDA7CisKKyAgICAgICAgd2lkdGggID0gaC0+d2lkdGg7CisgICAgICAgIGhlaWdodCA9IGgtPmhlaWdodDsKKyAgICB9CisKKyAgICBoLT5hdmN0eC0+Y29kZWRfd2lkdGggID0gaC0+d2lkdGg7CisgICAgaC0+YXZjdHgtPmNvZGVkX2hlaWdodCA9IGgtPmhlaWdodDsKKyAgICBoLT5hdmN0eC0+d2lkdGggICAgICAgID0gd2lkdGg7CisgICAgaC0+YXZjdHgtPmhlaWdodCAgICAgICA9IGhlaWdodDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgyNjRfc2xpY2VfaGVhZGVyX2luaXQoSDI2NENvbnRleHQgKmgsIGludCByZWluaXQpCit7CisgICAgaW50IG5iX3NsaWNlcyA9IChIQVZFX1RIUkVBRFMgJiYKKyAgICAgICAgICAgICAgICAgICAgIGgtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpID8KKyAgICAgICAgICAgICAgICAgICAgaC0+YXZjdHgtPnRocmVhZF9jb3VudCA6IDE7CisgICAgaW50IGksIHJldDsKKworICAgIGZmX3NldF9zYXIoaC0+YXZjdHgsIGgtPnNwcy5zYXIpOworICAgIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGgtPmF2Y3R4LT5waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5jaHJvbWFfeF9zaGlmdCwgJmgtPmNocm9tYV95X3NoaWZ0KTsKKworICAgIGlmIChoLT5zcHMudGltaW5nX2luZm9fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIGludDY0X3QgZGVuID0gaC0+c3BzLnRpbWVfc2NhbGU7CisgICAgICAgIGlmIChoLT54MjY0X2J1aWxkIDwgNDRVKQorICAgICAgICAgICAgZGVuICo9IDI7CisgICAgICAgIGF2X3JlZHVjZSgmaC0+YXZjdHgtPmZyYW1lcmF0ZS5kZW4sICZoLT5hdmN0eC0+ZnJhbWVyYXRlLm51bSwKKyAgICAgICAgICAgICAgICAgIGgtPnNwcy5udW1fdW5pdHNfaW5fdGljayAqIGgtPmF2Y3R4LT50aWNrc19wZXJfZnJhbWUsIGRlbiwgMSA8PCAzMCk7CisgICAgfQorCisgICAgaWYgKHJlaW5pdCkKKyAgICAgICAgZmZfaDI2NF9mcmVlX3RhYmxlcyhoLCAwKTsKKyAgICBoLT5maXJzdF9maWVsZCAgICAgICAgICAgPSAwOworICAgIGgtPnByZXZfaW50ZXJsYWNlZF9mcmFtZSA9IDE7CisKKyAgICBpbml0X3NjYW5fdGFibGVzKGgpOworICAgIHJldCA9IGZmX2gyNjRfYWxsb2NfdGFibGVzKGgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAobmJfc2xpY2VzID4gSDI2NF9NQVhfVEhSRUFEUyB8fCAobmJfc2xpY2VzID4gaC0+bWJfaGVpZ2h0ICYmIGgtPm1iX2hlaWdodCkpIHsKKyAgICAgICAgaW50IG1heF9zbGljZXM7CisgICAgICAgIGlmIChoLT5tYl9oZWlnaHQpCisgICAgICAgICAgICBtYXhfc2xpY2VzID0gRkZNSU4oSDI2NF9NQVhfVEhSRUFEUywgaC0+bWJfaGVpZ2h0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF4X3NsaWNlcyA9IEgyNjRfTUFYX1RIUkVBRFM7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJ0b28gbWFueSB0aHJlYWRzL3NsaWNlcyAlZCwiCisgICAgICAgICAgICAgICAiIHJlZHVjaW5nIHRvICVkXG4iLCBuYl9zbGljZXMsIG1heF9zbGljZXMpOworICAgICAgICBuYl9zbGljZXMgPSBtYXhfc2xpY2VzOworICAgIH0KKyAgICBoLT5zbGljZV9jb250ZXh0X2NvdW50ID0gbmJfc2xpY2VzOworCisgICAgaWYgKCFIQVZFX1RIUkVBRFMgfHwgIShoLT5hdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKSkgeworICAgICAgICByZXQgPSBmZl9oMjY0X2NvbnRleHRfaW5pdChoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY29udGV4dF9pbml0KCkgZmFpbGVkLlxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgaC0+c2xpY2VfY29udGV4dF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBIMjY0Q29udGV4dCAqYzsKKyAgICAgICAgICAgIGMgICAgICAgICAgICAgICAgICAgID0gaC0+dGhyZWFkX2NvbnRleHRbaV0gPSBhdl9tYWxsb2N6KHNpemVvZihIMjY0Q29udGV4dCkpOworICAgICAgICAgICAgaWYgKCFjKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMtPmF2Y3R4ICAgICAgICAgICAgID0gaC0+YXZjdHg7CisgICAgICAgICAgICBpZiAoQ09ORklHX0VSUk9SX1JFU0lMSUVOQ0UpIHsKKyAgICAgICAgICAgICAgICBjLT5tZWNjICAgICAgICAgICAgICA9IGgtPm1lY2M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLT52ZHNwICAgICAgICAgICAgICA9IGgtPnZkc3A7CisgICAgICAgICAgICBjLT5oMjY0ZHNwICAgICAgICAgICA9IGgtPmgyNjRkc3A7CisgICAgICAgICAgICBjLT5oMjY0cXBlbCAgICAgICAgICA9IGgtPmgyNjRxcGVsOworICAgICAgICAgICAgYy0+aDI2NGNocm9tYSAgICAgICAgPSBoLT5oMjY0Y2hyb21hOworICAgICAgICAgICAgYy0+c3BzICAgICAgICAgICAgICAgPSBoLT5zcHM7CisgICAgICAgICAgICBjLT5wcHMgICAgICAgICAgICAgICA9IGgtPnBwczsKKyAgICAgICAgICAgIGMtPnBpeGVsX3NoaWZ0ICAgICAgID0gaC0+cGl4ZWxfc2hpZnQ7CisgICAgICAgICAgICBjLT5jdXJfY2hyb21hX2Zvcm1hdF9pZGMgPSBoLT5jdXJfY2hyb21hX2Zvcm1hdF9pZGM7CisgICAgICAgICAgICBjLT53aWR0aCAgICAgICAgICAgICA9IGgtPndpZHRoOworICAgICAgICAgICAgYy0+aGVpZ2h0ICAgICAgICAgICAgPSBoLT5oZWlnaHQ7CisgICAgICAgICAgICBjLT5saW5lc2l6ZSAgICAgICAgICA9IGgtPmxpbmVzaXplOworICAgICAgICAgICAgYy0+dXZsaW5lc2l6ZSAgICAgICAgPSBoLT51dmxpbmVzaXplOworICAgICAgICAgICAgYy0+Y2hyb21hX3hfc2hpZnQgICAgPSBoLT5jaHJvbWFfeF9zaGlmdDsKKyAgICAgICAgICAgIGMtPmNocm9tYV95X3NoaWZ0ICAgID0gaC0+Y2hyb21hX3lfc2hpZnQ7CisgICAgICAgICAgICBjLT5xc2NhbGUgICAgICAgICAgICA9IGgtPnFzY2FsZTsKKyAgICAgICAgICAgIGMtPmRyb3BwYWJsZSAgICAgICAgID0gaC0+ZHJvcHBhYmxlOworICAgICAgICAgICAgYy0+ZGF0YV9wYXJ0aXRpb25pbmcgPSBoLT5kYXRhX3BhcnRpdGlvbmluZzsKKyAgICAgICAgICAgIGMtPmxvd19kZWxheSAgICAgICAgID0gaC0+bG93X2RlbGF5OworICAgICAgICAgICAgYy0+bWJfd2lkdGggICAgICAgICAgPSBoLT5tYl93aWR0aDsKKyAgICAgICAgICAgIGMtPm1iX2hlaWdodCAgICAgICAgID0gaC0+bWJfaGVpZ2h0OworICAgICAgICAgICAgYy0+bWJfc3RyaWRlICAgICAgICAgPSBoLT5tYl9zdHJpZGU7CisgICAgICAgICAgICBjLT5tYl9udW0gICAgICAgICAgICA9IGgtPm1iX251bTsKKyAgICAgICAgICAgIGMtPmZsYWdzICAgICAgICAgICAgID0gaC0+ZmxhZ3M7CisgICAgICAgICAgICBjLT53b3JrYXJvdW5kX2J1Z3MgICA9IGgtPndvcmthcm91bmRfYnVnczsKKyAgICAgICAgICAgIGMtPnBpY3RfdHlwZSAgICAgICAgID0gaC0+cGljdF90eXBlOworCisgICAgICAgICAgICBpbml0X3NjYW5fdGFibGVzKGMpOworICAgICAgICAgICAgY2xvbmVfdGFibGVzKGMsIGgsIGkpOworICAgICAgICAgICAgYy0+Y29udGV4dF9pbml0aWFsaXplZCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaC0+c2xpY2VfY29udGV4dF9jb3VudDsgaSsrKQorICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9oMjY0X2NvbnRleHRfaW5pdChoLT50aHJlYWRfY29udGV4dFtpXSkpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY29udGV4dF9pbml0KCkgZmFpbGVkLlxuIik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGgtPmNvbnRleHRfaW5pdGlhbGl6ZWQgPSAxOworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGZmX2gyNjRfZnJlZV90YWJsZXMoaCwgMCk7CisgICAgaC0+Y29udGV4dF9pbml0aWFsaXplZCA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVudW0gQVZQaXhlbEZvcm1hdCBub25fal9waXhmbXQoZW51bSBBVlBpeGVsRm9ybWF0IGEpCit7CisgICAgc3dpdGNoIChhKSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0MjBQOiByZXR1cm4gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDIyUDogcmV0dXJuIEFWX1BJWF9GTVRfWVVWNDIyUDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQ0NFA6IHJldHVybiBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorfQorCisvKioKKyAqIERlY29kZSBhIHNsaWNlIGhlYWRlci4KKyAqIFRoaXMgd2lsbCAocmUpaW50aWFsaXplIHRoZSBkZWNvZGVyIGFuZCBjYWxsIGgyNjRfZnJhbWVfc3RhcnQoKSBhcyBuZWVkZWQuCisgKgorICogQHBhcmFtIGggaDI2NGNvbnRleHQKKyAqIEBwYXJhbSBoMCBoMjY0IG1hc3RlciBjb250ZXh0IChkaWZmZXJzIGZyb20gJ2gnIHdoZW4gZG9pbmcgc2xpY2VkIGJhc2VkCisgKiAgICAgICAgICAgcGFyYWxsZWwgZGVjb2RpbmcpCisgKgorICogQHJldHVybiAwIGlmIG9rYXksIDwwIGlmIGFuIGVycm9yIG9jY3VycmVkLCAxIGlmIGRlY29kaW5nIG11c3Qgbm90IGJlIG11bHRpdGhyZWFkZWQKKyAqLworaW50IGZmX2gyNjRfZGVjb2RlX3NsaWNlX2hlYWRlcihIMjY0Q29udGV4dCAqaCwgSDI2NENvbnRleHQgKmgwKQoreworICAgIHVuc2lnbmVkIGludCBmaXJzdF9tYl9pbl9zbGljZTsKKyAgICB1bnNpZ25lZCBpbnQgcHBzX2lkOworICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgaW50IHNsaWNlX3R5cGUsIHRtcCwgaSwgajsKKyAgICBpbnQgbGFzdF9waWNfc3RydWN0dXJlLCBsYXN0X3BpY19kcm9wcGFibGU7CisgICAgaW50IG11c3RfcmVpbml0OworICAgIGludCBuZWVkc19yZWluaXQgPSAwOworICAgIGludCBmaWVsZF9waWNfZmxhZywgYm90dG9tX2ZpZWxkX2ZsYWc7CisKKyAgICBoLT5xcGVsX3B1dCA9IGgtPmgyNjRxcGVsLnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYjsKKyAgICBoLT5xcGVsX2F2ZyA9IGgtPmgyNjRxcGVsLmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYjsKKworICAgIGZpcnN0X21iX2luX3NsaWNlID0gZ2V0X3VlX2dvbG9tYl9sb25nKCZoLT5nYik7CisKKyAgICBpZiAoZmlyc3RfbWJfaW5fc2xpY2UgPT0gMCkgeyAvLyBGSVhNRSBiZXR0ZXIgZmllbGQgYm91bmRhcnkgZGV0ZWN0aW9uCisgICAgICAgIGlmIChoMC0+Y3VycmVudF9zbGljZSAmJiBoLT5jdXJfcGljX3B0ciAmJiBGSUVMRF9QSUNUVVJFKGgpKSB7CisgICAgICAgICAgICBmZl9oMjY0X2ZpZWxkX2VuZChoLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGgwLT5jdXJyZW50X3NsaWNlID0gMDsKKyAgICAgICAgaWYgKCFoMC0+Zmlyc3RfZmllbGQpIHsKKyAgICAgICAgICAgIGlmIChoLT5jdXJfcGljX3B0ciAmJiAhaC0+ZHJvcHBhYmxlKSB7CisgICAgICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmaC0+Y3VyX3BpY19wdHItPnRmLCBJTlRfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHIgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgc2xpY2VfdHlwZSA9IGdldF91ZV9nb2xvbWJfMzEoJmgtPmdiKTsKKyAgICBpZiAoc2xpY2VfdHlwZSA+IDkpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAic2xpY2UgdHlwZSAlZCB0b28gbGFyZ2UgYXQgJWQgJWRcbiIsCisgICAgICAgICAgICAgICBzbGljZV90eXBlLCBoLT5tYl94LCBoLT5tYl95KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChzbGljZV90eXBlID4gNCkgeworICAgICAgICBzbGljZV90eXBlIC09IDU7CisgICAgICAgIGgtPnNsaWNlX3R5cGVfZml4ZWQgPSAxOworICAgIH0gZWxzZQorICAgICAgICBoLT5zbGljZV90eXBlX2ZpeGVkID0gMDsKKworICAgIHNsaWNlX3R5cGUgPSBnb2xvbWJfdG9fcGljdF90eXBlW3NsaWNlX3R5cGVdOworICAgIGgtPnNsaWNlX3R5cGUgICAgID0gc2xpY2VfdHlwZTsKKyAgICBoLT5zbGljZV90eXBlX25vcyA9IHNsaWNlX3R5cGUgJiAzOworCisgICAgaWYgKGgtPm5hbF91bml0X3R5cGUgID09IE5BTF9JRFJfU0xJQ0UgJiYKKyAgICAgICAgaC0+c2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJBIG5vbi1pbnRyYSBzbGljZSBpbiBhbiBJRFIgTkFMIHVuaXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKAorICAgICAgICAoaC0+YXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiAmJiAhaC0+bmFsX3JlZl9pZGMpIHx8CisgICAgICAgIChoLT5hdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfQklESVIgICYmIGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB8fAorICAgICAgICAoaC0+YXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTklOVFJBICYmIGgtPnNsaWNlX3R5cGVfbm9zICE9IEFWX1BJQ1RVUkVfVFlQRV9JKSB8fAorICAgICAgICAoaC0+YXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTktFWSAmJiBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9JRFJfU0xJQ0UpIHx8CisgICAgICAgICBoLT5hdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfQUxMKSB7CisgICAgICAgICByZXR1cm4gU0xJQ0VfU0tJUEVEOworICAgICB9CisKKyAgICAvLyB0byBtYWtlIGEgZmV3IG9sZCBmdW5jdGlvbnMgaGFwcHksIGl0J3Mgd3JvbmcgdGhvdWdoCisgICAgaC0+cGljdF90eXBlID0gaC0+c2xpY2VfdHlwZTsKKworICAgIHBwc19pZCA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKTsKKyAgICBpZiAocHBzX2lkID49IE1BWF9QUFNfQ09VTlQpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJwcHNfaWQgJXUgb3V0IG9mIHJhbmdlXG4iLCBwcHNfaWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKCFoMC0+cHBzX2J1ZmZlcnNbcHBzX2lkXSkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJub24tZXhpc3RpbmcgUFBTICV1IHJlZmVyZW5jZWRcbiIsCisgICAgICAgICAgICAgICBwcHNfaWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGgwLT5hdV9wcHNfaWQgPj0gMCAmJiBwcHNfaWQgIT0gaDAtPmF1X3Bwc19pZCkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJQUFMgY2hhbmdlIGZyb20gJWQgdG8gJWQgZm9yYmlkZGVuXG4iLAorICAgICAgICAgICAgICAgaDAtPmF1X3Bwc19pZCwgcHBzX2lkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGgtPnBwcyA9ICpoMC0+cHBzX2J1ZmZlcnNbcHBzX2lkXTsKKworICAgIGlmICghaDAtPnNwc19idWZmZXJzW2gtPnBwcy5zcHNfaWRdKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIm5vbi1leGlzdGluZyBTUFMgJXUgcmVmZXJlbmNlZFxuIiwKKyAgICAgICAgICAgICAgIGgtPnBwcy5zcHNfaWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoaC0+cHBzLnNwc19pZCAhPSBoLT5zcHMuc3BzX2lkIHx8CisgICAgICAgIGgtPnBwcy5zcHNfaWQgIT0gaC0+Y3VycmVudF9zcHNfaWQgfHwKKyAgICAgICAgaDAtPnNwc19idWZmZXJzW2gtPnBwcy5zcHNfaWRdLT5uZXcpIHsKKworICAgICAgICBoLT5zcHMgPSAqaDAtPnNwc19idWZmZXJzW2gtPnBwcy5zcHNfaWRdOworCisgICAgICAgIGlmIChoLT5tYl93aWR0aCAgIT0gaC0+c3BzLm1iX3dpZHRoIHx8CisgICAgICAgICAgICBoLT5tYl9oZWlnaHQgIT0gaC0+c3BzLm1iX2hlaWdodCAqICgyIC0gaC0+c3BzLmZyYW1lX21ic19vbmx5X2ZsYWcpIHx8CisgICAgICAgICAgICBoLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSAhPSBoLT5zcHMuYml0X2RlcHRoX2x1bWEgfHwKKyAgICAgICAgICAgIGgtPmN1cl9jaHJvbWFfZm9ybWF0X2lkYyAhPSBoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMKKyAgICAgICAgKQorICAgICAgICAgICAgbmVlZHNfcmVpbml0ID0gMTsKKworICAgICAgICBpZiAoaC0+Yml0X2RlcHRoX2x1bWEgICAgIT0gaC0+c3BzLmJpdF9kZXB0aF9sdW1hIHx8CisgICAgICAgICAgICBoLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSBoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMpIHsKKyAgICAgICAgICAgIGgtPmJpdF9kZXB0aF9sdW1hICAgID0gaC0+c3BzLmJpdF9kZXB0aF9sdW1hOworICAgICAgICAgICAgaC0+Y2hyb21hX2Zvcm1hdF9pZGMgPSBoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGM7CisgICAgICAgICAgICBuZWVkc19yZWluaXQgICAgICAgICA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBmZl9oMjY0X3NldF9wYXJhbWV0ZXJfZnJvbV9zcHMoaCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaC0+YXZjdHgtPnByb2ZpbGUgPSBmZl9oMjY0X2dldF9wcm9maWxlKCZoLT5zcHMpOworICAgIGgtPmF2Y3R4LT5sZXZlbCAgID0gaC0+c3BzLmxldmVsX2lkYzsKKyAgICBoLT5hdmN0eC0+cmVmcyAgICA9IGgtPnNwcy5yZWZfZnJhbWVfY291bnQ7CisKKyAgICBtdXN0X3JlaW5pdCA9IChoLT5jb250ZXh0X2luaXRpYWxpemVkICYmCisgICAgICAgICAgICAgICAgICAgICggICAxNipoLT5zcHMubWJfd2lkdGggIT0gaC0+YXZjdHgtPmNvZGVkX3dpZHRoCisgICAgICAgICAgICAgICAgICAgICB8fCAxNipoLT5zcHMubWJfaGVpZ2h0ICogKDIgLSBoLT5zcHMuZnJhbWVfbWJzX29ubHlfZmxhZykgIT0gaC0+YXZjdHgtPmNvZGVkX2hlaWdodAorICAgICAgICAgICAgICAgICAgICAgfHwgaC0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgIT0gaC0+c3BzLmJpdF9kZXB0aF9sdW1hCisgICAgICAgICAgICAgICAgICAgICB8fCBoLT5jdXJfY2hyb21hX2Zvcm1hdF9pZGMgIT0gaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjCisgICAgICAgICAgICAgICAgICAgICB8fCBhdl9jbXBfcShoLT5zcHMuc2FyLCBoLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbykKKyAgICAgICAgICAgICAgICAgICAgIHx8IGgtPm1iX3dpZHRoICAhPSBoLT5zcHMubWJfd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIHx8IGgtPm1iX2hlaWdodCAhPSBoLT5zcHMubWJfaGVpZ2h0ICogKDIgLSBoLT5zcHMuZnJhbWVfbWJzX29ubHlfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgKSk7CisgICAgaWYgKG5vbl9qX3BpeGZtdChoMC0+YXZjdHgtPnBpeF9mbXQpICE9IG5vbl9qX3BpeGZtdChnZXRfcGl4ZWxfZm9ybWF0KGgwLCAwKSkpCisgICAgICAgIG11c3RfcmVpbml0ID0gMTsKKworICAgIGgtPm1iX3dpZHRoICA9IGgtPnNwcy5tYl93aWR0aDsKKyAgICBoLT5tYl9oZWlnaHQgPSBoLT5zcHMubWJfaGVpZ2h0ICogKDIgLSBoLT5zcHMuZnJhbWVfbWJzX29ubHlfZmxhZyk7CisgICAgaC0+bWJfbnVtICAgID0gaC0+bWJfd2lkdGggKiBoLT5tYl9oZWlnaHQ7CisgICAgaC0+bWJfc3RyaWRlID0gaC0+bWJfd2lkdGggKyAxOworCisgICAgaC0+Yl9zdHJpZGUgPSBoLT5tYl93aWR0aCAqIDQ7CisKKyAgICBoLT5jaHJvbWFfeV9zaGlmdCA9IGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA8PSAxOyAvLyA0MDAgdXNlcyB5dXY0MjBwCisKKyAgICBoLT53aWR0aCAgPSAxNiAqIGgtPm1iX3dpZHRoOworICAgIGgtPmhlaWdodCA9IDE2ICogaC0+bWJfaGVpZ2h0OworCisgICAgcmV0ID0gaW5pdF9kaW1lbnNpb25zKGgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGgtPnNwcy52aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgaC0+YXZjdHgtPmNvbG9yX3JhbmdlID0gaC0+c3BzLmZ1bGxfcmFuZ2U+MCA/IEFWQ09MX1JBTkdFX0pQRUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWQ09MX1JBTkdFX01QRUc7CisgICAgICAgIGlmIChoLT5zcHMuY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZykgeworICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5jb2xvcnNwYWNlICE9IGgtPnNwcy5jb2xvcnNwYWNlKQorICAgICAgICAgICAgICAgIG5lZWRzX3JlaW5pdCA9IDE7CisgICAgICAgICAgICBoLT5hdmN0eC0+Y29sb3JfcHJpbWFyaWVzID0gaC0+c3BzLmNvbG9yX3ByaW1hcmllczsKKyAgICAgICAgICAgIGgtPmF2Y3R4LT5jb2xvcl90cmMgICAgICAgPSBoLT5zcHMuY29sb3JfdHJjOworICAgICAgICAgICAgaC0+YXZjdHgtPmNvbG9yc3BhY2UgICAgICA9IGgtPnNwcy5jb2xvcnNwYWNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGgtPmNvbnRleHRfaW5pdGlhbGl6ZWQgJiYKKyAgICAgICAgKG11c3RfcmVpbml0IHx8IG5lZWRzX3JlaW5pdCkpIHsKKyAgICAgICAgaWYgKGggIT0gaDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJjaGFuZ2luZyB3aWR0aCAlZCAtPiAlZCAvIGhlaWdodCAlZCAtPiAlZCBvbiAiCisgICAgICAgICAgICAgICAgICAgInNsaWNlICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGgtPndpZHRoLCBoLT5hdmN0eC0+Y29kZWRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgaC0+aGVpZ2h0LCBoLT5hdmN0eC0+Y29kZWRfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGgwLT5jdXJyZW50X3NsaWNlICsgMSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGZmX2gyNjRfZmx1c2hfY2hhbmdlKGgpOworCisgICAgICAgIGlmICgocmV0ID0gZ2V0X3BpeGVsX2Zvcm1hdChoLCAxKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaC0+YXZjdHgtPnBpeF9mbXQgPSByZXQ7CisKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIlJlaW5pdCBjb250ZXh0IHRvICVkeCVkLCAiCisgICAgICAgICAgICAgICAicGl4X2ZtdDogJXNcbiIsIGgtPndpZHRoLCBoLT5oZWlnaHQsIGF2X2dldF9waXhfZm10X25hbWUoaC0+YXZjdHgtPnBpeF9mbXQpKTsKKworICAgICAgICBpZiAoKHJldCA9IGgyNjRfc2xpY2VfaGVhZGVyX2luaXQoaCwgMSkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImgyNjRfc2xpY2VfaGVhZGVyX2luaXQoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWgtPmNvbnRleHRfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKGggIT0gaDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDYW5ub3QgKHJlLSlpbml0aWFsaXplIGNvbnRleHQgZHVyaW5nIHBhcmFsbGVsIGRlY29kaW5nLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldCA9IGdldF9waXhlbF9mb3JtYXQoaCwgMSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGgtPmF2Y3R4LT5waXhfZm10ID0gcmV0OworCisgICAgICAgIGlmICgocmV0ID0gaDI2NF9zbGljZV9oZWFkZXJfaW5pdChoLCAwKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiaDI2NF9zbGljZV9oZWFkZXJfaW5pdCgpIGZhaWxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGggPT0gaDAgJiYgaC0+ZGVxdWFudF9jb2VmZl9wcHMgIT0gcHBzX2lkKSB7CisgICAgICAgIGgtPmRlcXVhbnRfY29lZmZfcHBzID0gcHBzX2lkOworICAgICAgICBoMjY0X2luaXRfZGVxdWFudF90YWJsZXMoaCk7CisgICAgfQorCisgICAgaC0+ZnJhbWVfbnVtID0gZ2V0X2JpdHMoJmgtPmdiLCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtKTsKKworICAgIGgtPm1iX21iYWZmICAgICAgICA9IDA7CisgICAgaC0+bWJfYWZmX2ZyYW1lICAgID0gMDsKKyAgICBsYXN0X3BpY19zdHJ1Y3R1cmUgPSBoMC0+cGljdHVyZV9zdHJ1Y3R1cmU7CisgICAgbGFzdF9waWNfZHJvcHBhYmxlID0gaDAtPmRyb3BwYWJsZTsKKyAgICBoLT5kcm9wcGFibGUgICAgICAgPSBoLT5uYWxfcmVmX2lkYyA9PSAwOworICAgIGlmIChoLT5zcHMuZnJhbWVfbWJzX29ubHlfZmxhZykgeworICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfRlJBTUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyAmJiBzbGljZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRoaXMgc3RyZWFtIHdhcyBnZW5lcmF0ZWQgYnkgYSBicm9rZW4gZW5jb2RlciwgaW52YWxpZCA4eDggaW5mZXJlbmNlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmaWVsZF9waWNfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgICAgICBpZiAoZmllbGRfcGljX2ZsYWcpIHsKKyAgICAgICAgICAgIGJvdHRvbV9maWVsZF9mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfVE9QX0ZJRUxEICsgYm90dG9tX2ZpZWxkX2ZsYWc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfRlJBTUU7CisgICAgICAgICAgICBoLT5tYl9hZmZfZnJhbWUgICAgICA9IGgtPnNwcy5tYl9hZmY7CisgICAgICAgIH0KKyAgICB9CisgICAgaC0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZyA9IGgtPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUU7CisKKyAgICBpZiAoaDAtPmN1cnJlbnRfc2xpY2UgIT0gMCkgeworICAgICAgICBpZiAobGFzdF9waWNfc3RydWN0dXJlICE9IGgtPnBpY3R1cmVfc3RydWN0dXJlIHx8CisgICAgICAgICAgICBsYXN0X3BpY19kcm9wcGFibGUgIT0gaC0+ZHJvcHBhYmxlKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ2hhbmdpbmcgZmllbGQgbW9kZSAoJWQgLT4gJWQpIGJldHdlZW4gc2xpY2VzIGlzIG5vdCBhbGxvd2VkXG4iLAorICAgICAgICAgICAgICAgICAgIGxhc3RfcGljX3N0cnVjdHVyZSwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUpOworICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBsYXN0X3BpY19zdHJ1Y3R1cmU7CisgICAgICAgICAgICBoLT5kcm9wcGFibGUgICAgICAgICA9IGxhc3RfcGljX2Ryb3BwYWJsZTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9IGVsc2UgaWYgKCFoMC0+Y3VyX3BpY19wdHIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJ1bnNldCBjdXJfcGljX3B0ciBvbiBzbGljZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBoMC0+Y3VycmVudF9zbGljZSArIDEpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBTaG9ydGVuIGZyYW1lIG51bSBnYXBzIHNvIHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgcmVmZXJlbmNlCisgICAgICAgICAqIGZyYW1lcyBqdXN0IHRvIHRocm93IHRoZW0gYXdheSAqLworICAgICAgICBpZiAoaC0+ZnJhbWVfbnVtICE9IGgtPnByZXZfZnJhbWVfbnVtKSB7CisgICAgICAgICAgICBpbnQgdW53cmFwX3ByZXZfZnJhbWVfbnVtID0gaC0+cHJldl9mcmFtZV9udW07CisgICAgICAgICAgICBpbnQgbWF4X2ZyYW1lX251bSAgICAgICAgID0gMSA8PCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtOworCisgICAgICAgICAgICBpZiAodW53cmFwX3ByZXZfZnJhbWVfbnVtID4gaC0+ZnJhbWVfbnVtKQorICAgICAgICAgICAgICAgIHVud3JhcF9wcmV2X2ZyYW1lX251bSAtPSBtYXhfZnJhbWVfbnVtOworCisgICAgICAgICAgICBpZiAoKGgtPmZyYW1lX251bSAtIHVud3JhcF9wcmV2X2ZyYW1lX251bSkgPiBoLT5zcHMucmVmX2ZyYW1lX2NvdW50KSB7CisgICAgICAgICAgICAgICAgdW53cmFwX3ByZXZfZnJhbWVfbnVtID0gKGgtPmZyYW1lX251bSAtIGgtPnNwcy5yZWZfZnJhbWVfY291bnQpIC0gMTsKKyAgICAgICAgICAgICAgICBpZiAodW53cmFwX3ByZXZfZnJhbWVfbnVtIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgdW53cmFwX3ByZXZfZnJhbWVfbnVtICs9IG1heF9mcmFtZV9udW07CisKKyAgICAgICAgICAgICAgICBoLT5wcmV2X2ZyYW1lX251bSA9IHVud3JhcF9wcmV2X2ZyYW1lX251bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFNlZSBpZiB3ZSBoYXZlIGEgZGVjb2RlZCBmaXJzdCBmaWVsZCBsb29raW5nIGZvciBhIHBhaXIuLi4KKyAgICAgICAgICogSGVyZSwgd2UncmUgdXNpbmcgdGhhdCB0byBzZWUgaWYgd2Ugc2hvdWxkIG1hcmsgcHJldmlvdXNseQorICAgICAgICAgKiBkZWNvZGUgZnJhbWVzIGFzICJmaW5pc2hlZCIuCisgICAgICAgICAqIFdlIGhhdmUgdG8gZG8gdGhhdCBiZWZvcmUgdGhlICJkdW1teSIgaW4tYmV0d2VlbiBmcmFtZSBhbGxvY2F0aW9uLAorICAgICAgICAgKiBzaW5jZSB0aGF0IGNhbiBtb2RpZnkgaC0+Y3VyX3BpY19wdHIuICovCisgICAgICAgIGlmIChoMC0+Zmlyc3RfZmllbGQpIHsKKyAgICAgICAgICAgIGFzc2VydChoMC0+Y3VyX3BpY19wdHIpOworICAgICAgICAgICAgYXNzZXJ0KGgwLT5jdXJfcGljX3B0ci0+Zi5idWZbMF0pOworICAgICAgICAgICAgYXNzZXJ0KGgwLT5jdXJfcGljX3B0ci0+cmVmZXJlbmNlICE9IERFTEFZRURfUElDX1JFRik7CisKKyAgICAgICAgICAgIC8qIE1hcmsgb2xkIGZpZWxkL2ZyYW1lIGFzIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgaWYgKGgwLT5jdXJfcGljX3B0ci0+dGYub3duZXIgPT0gaDAtPmF2Y3R4KSB7CisgICAgICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmaDAtPmN1cl9waWNfcHRyLT50ZiwgSU5UX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcGljX3N0cnVjdHVyZSA9PSBQSUNUX0JPVFRPTV9GSUVMRCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGZpZ3VyZSBvdXQgaWYgd2UgaGF2ZSBhIGNvbXBsZW1lbnRhcnkgZmllbGQgcGFpciAqLworICAgICAgICAgICAgaWYgKCFGSUVMRF9QSUNUVVJFKGgpIHx8IGgtPnBpY3R1cmVfc3RydWN0dXJlID09IGxhc3RfcGljX3N0cnVjdHVyZSkgeworICAgICAgICAgICAgICAgIC8qIFByZXZpb3VzIGZpZWxkIGlzIHVubWF0Y2hlZC4gRG9uJ3QgZGlzcGxheSBpdCwgYnV0IGxldCBpdAorICAgICAgICAgICAgICAgICAqIHJlbWFpbiBmb3IgcmVmZXJlbmNlIGlmIG1hcmtlZCBhcyBzdWNoLiAqLworICAgICAgICAgICAgICAgIGlmIChsYXN0X3BpY19zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRSkgeworICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoMC0+Y3VyX3BpY19wdHItPnRmLCBJTlRfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcGljX3N0cnVjdHVyZSA9PSBQSUNUX1RPUF9GSUVMRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaDAtPmN1cl9waWNfcHRyLT5mcmFtZV9udW0gIT0gaC0+ZnJhbWVfbnVtKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgYW5kIHByZXZpb3VzIGZpZWxkIHdlcmUgcmVmZXJlbmNlLCBidXQgaGFkCisgICAgICAgICAgICAgICAgICAgICAqIGRpZmZlcmVudCBmcmFtZV9udW1zLiBDb25zaWRlciB0aGlzIGZpZWxkIGZpcnN0IGluCisgICAgICAgICAgICAgICAgICAgICAqIHBhaXIuIFRocm93IGF3YXkgcHJldmlvdXMgZmllbGQgZXhjZXB0IGZvciByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICogcHVycG9zZXMuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X3BpY19zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmaDAtPmN1cl9waWNfcHRyLT50ZiwgSU5UX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9waWNfc3RydWN0dXJlID09IFBJQ1RfVE9QX0ZJRUxEKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFNlY29uZCBmaWVsZCBpbiBjb21wbGVtZW50YXJ5IHBhaXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoKGxhc3RfcGljX3N0cnVjdHVyZSAgID09IFBJQ1RfVE9QX0ZJRUxEICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0JPVFRPTV9GSUVMRCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RfcGljX3N0cnVjdHVyZSAgID09IFBJQ1RfQk9UVE9NX0ZJRUxEICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX1RPUF9GSUVMRCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmaWVsZCBtb2RlIGNvbWJpbmF0aW9uICVkLyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcGljX3N0cnVjdHVyZSwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUpOworICAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBsYXN0X3BpY19zdHJ1Y3R1cmU7CisgICAgICAgICAgICAgICAgICAgICAgICBoLT5kcm9wcGFibGUgICAgICAgICA9IGxhc3RfcGljX2Ryb3BwYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RfcGljX2Ryb3BwYWJsZSAhPSBoLT5kcm9wcGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShoLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgcmVmZXJlbmNlIGFuZCBub24tcmVmZXJlbmNlIGZpZWxkcyBpbiB0aGUgc2FtZSBmcmFtZSwgd2hpY2giKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID0gbGFzdF9waWNfc3RydWN0dXJlOworICAgICAgICAgICAgICAgICAgICAgICAgaC0+ZHJvcHBhYmxlICAgICAgICAgPSBsYXN0X3BpY19kcm9wcGFibGU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoaC0+ZnJhbWVfbnVtICE9IGgtPnByZXZfZnJhbWVfbnVtICYmICFoMC0+Zmlyc3RfZmllbGQgJiYKKyAgICAgICAgICAgICAgIGgtPmZyYW1lX251bSAhPSAoaC0+cHJldl9mcmFtZV9udW0gKyAxKSAlICgxIDw8IGgtPnNwcy5sb2cyX21heF9mcmFtZV9udW0pKSB7CisgICAgICAgICAgICBIMjY0UGljdHVyZSAqcHJldiA9IGgtPnNob3J0X3JlZl9jb3VudCA/IGgtPnNob3J0X3JlZlswXSA6IE5VTEw7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkZyYW1lIG51bSBnYXAgJWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgaC0+ZnJhbWVfbnVtLCBoLT5wcmV2X2ZyYW1lX251bSk7CisgICAgICAgICAgICBpZiAoIWgtPnNwcy5nYXBzX2luX2ZyYW1lX251bV9hbGxvd2VkX2ZsYWcpCisgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxGRl9BUlJBWV9FTEVNUyhoLT5sYXN0X3BvY3MpOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGgtPmxhc3RfcG9jc1tpXSA9IElOVF9NSU47CisgICAgICAgICAgICByZXQgPSBoMjY0X2ZyYW1lX3N0YXJ0KGgpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBoMC0+Zmlyc3RfZmllbGQgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGgtPnByZXZfZnJhbWVfbnVtKys7CisgICAgICAgICAgICBoLT5wcmV2X2ZyYW1lX251bSAgICAgICAgJT0gMSA8PCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtOworICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPmZyYW1lX251bSA9IGgtPnByZXZfZnJhbWVfbnVtOworICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPmludmFsaWRfZ2FwID0gIWgtPnNwcy5nYXBzX2luX2ZyYW1lX251bV9hbGxvd2VkX2ZsYWc7CisgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsIDApOworICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmaC0+Y3VyX3BpY19wdHItPnRmLCBJTlRfTUFYLCAxKTsKKyAgICAgICAgICAgIHJldCA9IGZmX2dlbmVyYXRlX3NsaWRpbmdfd2luZG93X21tY29zKGgsIDEpOworICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcmV0ID0gZmZfaDI2NF9leGVjdXRlX3JlZl9waWNfbWFya2luZyhoLCBoLT5tbWNvLCBoLT5tbWNvX2luZGV4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwICYmIChoLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIC8qIEVycm9yIGNvbmNlYWxtZW50OiBJZiBhIHJlZiBpcyBtaXNzaW5nLCBjb3B5IHRoZSBwcmV2aW91cyByZWYKKyAgICAgICAgICAgICAqIGluIGl0cyBwbGFjZS4KKyAgICAgICAgICAgICAqIEZJWE1FOiBBdm9pZGluZyBhIG1lbWNweSB3b3VsZCBiZSBuaWNlLCBidXQgcmVmIGhhbmRsaW5nIG1ha2VzCisgICAgICAgICAgICAgKiBtYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZXJlIGJlaW5nIG5vIGFjdHVhbCBkdXBsaWNhdGVzLgorICAgICAgICAgICAgICogRklYTUU6IFRoaXMgZG9lcyBub3QgY29weSBwYWRkaW5nIGZvciBvdXQtb2YtZnJhbWUgbW90aW9uCisgICAgICAgICAgICAgKiB2ZWN0b3JzLiAgR2l2ZW4gd2UgYXJlIGNvbmNlYWxpbmcgYSBsb3N0IGZyYW1lLCB0aGlzIHByb2JhYmx5CisgICAgICAgICAgICAgKiBpcyBub3Qgbm90aWNlYWJsZSBieSBjb21wYXJpc29uLCBidXQgaXQgc2hvdWxkIGJlIGZpeGVkLiAqLworICAgICAgICAgICAgaWYgKGgtPnNob3J0X3JlZl9jb3VudCkgeworICAgICAgICAgICAgICAgIGlmIChwcmV2KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NvcHkoaC0+c2hvcnRfcmVmWzBdLT5mLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c2hvcnRfcmVmWzBdLT5mLmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICoqKXByZXYtPmYuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT5mLmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmF2Y3R4LT5waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX3dpZHRoICAqIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX2hlaWdodCAqIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgaC0+c2hvcnRfcmVmWzBdLT5wb2MgPSBwcmV2LT5wb2MgKyAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoLT5zaG9ydF9yZWZbMF0tPmZyYW1lX251bSA9IGgtPnByZXZfZnJhbWVfbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogU2VlIGlmIHdlIGhhdmUgYSBkZWNvZGVkIGZpcnN0IGZpZWxkIGxvb2tpbmcgZm9yIGEgcGFpci4uLgorICAgICAgICAgKiBXZSdyZSB1c2luZyB0aGF0IHRvIHNlZSB3aGV0aGVyIHRvIGNvbnRpbnVlIGRlY29kaW5nIGluIHRoYXQKKyAgICAgICAgICogZnJhbWUsIG9yIHRvIGFsbG9jYXRlIGEgbmV3IG9uZS4gKi8KKyAgICAgICAgaWYgKGgwLT5maXJzdF9maWVsZCkgeworICAgICAgICAgICAgYXNzZXJ0KGgwLT5jdXJfcGljX3B0cik7CisgICAgICAgICAgICBhc3NlcnQoaDAtPmN1cl9waWNfcHRyLT5mLmJ1ZlswXSk7CisgICAgICAgICAgICBhc3NlcnQoaDAtPmN1cl9waWNfcHRyLT5yZWZlcmVuY2UgIT0gREVMQVlFRF9QSUNfUkVGKTsKKworICAgICAgICAgICAgLyogZmlndXJlIG91dCBpZiB3ZSBoYXZlIGEgY29tcGxlbWVudGFyeSBmaWVsZCBwYWlyICovCisgICAgICAgICAgICBpZiAoIUZJRUxEX1BJQ1RVUkUoaCkgfHwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gbGFzdF9waWNfc3RydWN0dXJlKSB7CisgICAgICAgICAgICAgICAgLyogUHJldmlvdXMgZmllbGQgaXMgdW5tYXRjaGVkLiBEb24ndCBkaXNwbGF5IGl0LCBidXQgbGV0IGl0CisgICAgICAgICAgICAgICAgICogcmVtYWluIGZvciByZWZlcmVuY2UgaWYgbWFya2VkIGFzIHN1Y2guICovCisgICAgICAgICAgICAgICAgaDAtPmN1cl9waWNfcHRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBoMC0+Zmlyc3RfZmllbGQgPSBGSUVMRF9QSUNUVVJFKGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaDAtPmN1cl9waWNfcHRyLT5mcmFtZV9udW0gIT0gaC0+ZnJhbWVfbnVtKSB7CisgICAgICAgICAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJmgwLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDAtPnBpY3R1cmVfc3RydWN0dXJlPT1QSUNUX0JPVFRPTV9GSUVMRCk7CisgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgYW5kIHRoZSBwcmV2aW91cyBmaWVsZCBoYWQgZGlmZmVyZW50IGZyYW1lX251bXMuCisgICAgICAgICAgICAgICAgICAgICAqIENvbnNpZGVyIHRoaXMgZmllbGQgZmlyc3QgaW4gcGFpci4gVGhyb3cgYXdheSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgKiBvbmUgZXhjZXB0IGZvciByZWZlcmVuY2UgcHVycG9zZXMuICovCisgICAgICAgICAgICAgICAgICAgIGgwLT5maXJzdF9maWVsZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGgwLT5jdXJfcGljX3B0ciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU2Vjb25kIGZpZWxkIGluIGNvbXBsZW1lbnRhcnkgcGFpciAqLworICAgICAgICAgICAgICAgICAgICBoMC0+Zmlyc3RfZmllbGQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEZyYW1lIG9yIGZpcnN0IGZpZWxkIGluIGEgcG90ZW50aWFsbHkgY29tcGxlbWVudGFyeSBwYWlyICovCisgICAgICAgICAgICBoMC0+Zmlyc3RfZmllbGQgPSBGSUVMRF9QSUNUVVJFKGgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFGSUVMRF9QSUNUVVJFKGgpIHx8IGgwLT5maXJzdF9maWVsZCkgeworICAgICAgICAgICAgaWYgKGgyNjRfZnJhbWVfc3RhcnQoaCkgPCAwKSB7CisgICAgICAgICAgICAgICAgaDAtPmZpcnN0X2ZpZWxkID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbGVhc2VfdW51c2VkX3BpY3R1cmVzKGgsIDApOworICAgICAgICB9CisgICAgICAgIC8qIFNvbWUgbWFjcm9ibG9ja3MgY2FuIGJlIGFjY2Vzc2VkIGJlZm9yZSB0aGV5J3JlIGF2YWlsYWJsZSBpbiBjYXNlCisgICAgICAgICogb2YgbG9zdCBzbGljZXMsIE1CQUZGIG9yIHRocmVhZGluZy4gKi8KKyAgICAgICAgaWYgKEZJRUxEX1BJQ1RVUkUoaCkpIHsKKyAgICAgICAgICAgIGZvcihpID0gKGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEKTsgaTxoLT5tYl9oZWlnaHQ7IGkrKykKKyAgICAgICAgICAgICAgICBtZW1zZXQoaC0+c2xpY2VfdGFibGUgKyBpKmgtPm1iX3N0cmlkZSwgLTEsIChoLT5tYl9zdHJpZGUgLSAoaSsxPT1oLT5tYl9oZWlnaHQpKSAqIHNpemVvZigqaC0+c2xpY2VfdGFibGUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbXNldChoLT5zbGljZV90YWJsZSwgLTEsCisgICAgICAgICAgICAgICAgKGgtPm1iX2hlaWdodCAqIGgtPm1iX3N0cmlkZSAtIDEpICogc2l6ZW9mKCpoLT5zbGljZV90YWJsZSkpOworICAgICAgICB9CisgICAgICAgIGgwLT5sYXN0X3NsaWNlX3R5cGUgPSAtMTsKKyAgICB9CisgICAgaWYgKGggIT0gaDAgJiYgKHJldCA9IGNsb25lX3NsaWNlKGgsIGgwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogY2FuJ3QgYmUgaW4gYWxsb2NfdGFibGVzIGJlY2F1c2UgbGluZXNpemUgaXNuJ3Qga25vd24gdGhlcmUuCisgICAgICogRklYTUU6IHJlZG8gYmlwcmVkIHdlaWdodCB0byBub3QgcmVxdWlyZSBleHRyYSBidWZmZXI/ICovCisgICAgZm9yIChpID0gMDsgaSA8IGgtPnNsaWNlX2NvbnRleHRfY291bnQ7IGkrKykKKyAgICAgICAgaWYgKGgtPnRocmVhZF9jb250ZXh0W2ldKSB7CisgICAgICAgICAgICByZXQgPSBhbGxvY19zY3JhdGNoX2J1ZmZlcnMoaC0+dGhyZWFkX2NvbnRleHRbaV0sIGgtPmxpbmVzaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgIGgtPmN1cl9waWNfcHRyLT5mcmFtZV9udW0gPSBoLT5mcmFtZV9udW07IC8vIEZJWE1FIGZyYW1lX251bSBjbGVhbnVwCisKKyAgICBhdl9hc3NlcnQxKGgtPm1iX251bSA9PSBoLT5tYl93aWR0aCAqIGgtPm1iX2hlaWdodCk7CisgICAgaWYgKGZpcnN0X21iX2luX3NsaWNlIDw8IEZJRUxEX09SX01CQUZGX1BJQ1RVUkUoaCkgPj0gaC0+bWJfbnVtIHx8CisgICAgICAgIGZpcnN0X21iX2luX3NsaWNlID49IGgtPm1iX251bSkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImZpcnN0X21iX2luX3NsaWNlIG92ZXJmbG93XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGgtPnJlc3luY19tYl94ID0gaC0+bWJfeCA9ICBmaXJzdF9tYl9pbl9zbGljZSAlIGgtPm1iX3dpZHRoOworICAgIGgtPnJlc3luY19tYl95ID0gaC0+bWJfeSA9IChmaXJzdF9tYl9pbl9zbGljZSAvIGgtPm1iX3dpZHRoKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEX09SX01CQUZGX1BJQ1RVUkUoaCk7CisgICAgaWYgKGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEKQorICAgICAgICBoLT5yZXN5bmNfbWJfeSA9IGgtPm1iX3kgPSBoLT5tYl95ICsgMTsKKyAgICBhdl9hc3NlcnQxKGgtPm1iX3kgPCBoLT5tYl9oZWlnaHQpOworCisgICAgaWYgKGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpIHsKKyAgICAgICAgaC0+Y3Vycl9waWNfbnVtID0gaC0+ZnJhbWVfbnVtOworICAgICAgICBoLT5tYXhfcGljX251bSAgPSAxIDw8IGgtPnNwcy5sb2cyX21heF9mcmFtZV9udW07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaC0+Y3Vycl9waWNfbnVtID0gMiAqIGgtPmZyYW1lX251bSArIDE7CisgICAgICAgIGgtPm1heF9waWNfbnVtICA9IDEgPDwgKGgtPnNwcy5sb2cyX21heF9mcmFtZV9udW0gKyAxKTsKKyAgICB9CisKKyAgICBpZiAoaC0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfSURSX1NMSUNFKQorICAgICAgICBnZXRfdWVfZ29sb21iKCZoLT5nYik7IC8qIGlkcl9waWNfaWQgKi8KKworICAgIGlmIChoLT5zcHMucG9jX3R5cGUgPT0gMCkgeworICAgICAgICBoLT5wb2NfbHNiID0gZ2V0X2JpdHMoJmgtPmdiLCBoLT5zcHMubG9nMl9tYXhfcG9jX2xzYik7CisKKyAgICAgICAgaWYgKGgtPnBwcy5waWNfb3JkZXJfcHJlc2VudCA9PSAxICYmIGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpCisgICAgICAgICAgICBoLT5kZWx0YV9wb2NfYm90dG9tID0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOworICAgIH0KKworICAgIGlmIChoLT5zcHMucG9jX3R5cGUgPT0gMSAmJiAhaC0+c3BzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKSB7CisgICAgICAgIGgtPmRlbHRhX3BvY1swXSA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKworICAgICAgICBpZiAoaC0+cHBzLnBpY19vcmRlcl9wcmVzZW50ID09IDEgJiYgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkKKyAgICAgICAgICAgIGgtPmRlbHRhX3BvY1sxXSA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICB9CisKKyAgICBmZl9pbml0X3BvYyhoLCBoLT5jdXJfcGljX3B0ci0+ZmllbGRfcG9jLCAmaC0+Y3VyX3BpY19wdHItPnBvYyk7CisKKyAgICBpZiAoaC0+cHBzLnJlZHVuZGFudF9waWNfY250X3ByZXNlbnQpCisgICAgICAgIGgtPnJlZHVuZGFudF9waWNfY291bnQgPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7CisKKyAgICByZXQgPSBmZl9zZXRfcmVmX2NvdW50KGgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHNsaWNlX3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kgJiYKKyAgICAgICAgKGgwLT5jdXJyZW50X3NsaWNlID09IDAgfHwKKyAgICAgICAgIHNsaWNlX3R5cGUgIT0gaDAtPmxhc3Rfc2xpY2VfdHlwZSB8fAorICAgICAgICAgbWVtY21wKGgwLT5sYXN0X3JlZl9jb3VudCwgaDAtPnJlZl9jb3VudCwgc2l6ZW9mKGgwLT5yZWZfY291bnQpKSkpIHsKKworICAgICAgICBmZl9oMjY0X2ZpbGxfZGVmYXVsdF9yZWZfbGlzdChoKTsKKyAgICB9CisKKyAgICBpZiAoaC0+c2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9yZWZfcGljX2xpc3RfcmVvcmRlcmluZyhoKTsKKyAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICBoLT5yZWZfY291bnRbMV0gPSBoLT5yZWZfY291bnRbMF0gPSAwOworICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGgtPnBwcy53ZWlnaHRlZF9wcmVkICYmIGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB8fAorICAgICAgICAoaC0+cHBzLndlaWdodGVkX2JpcHJlZF9pZGMgPT0gMSAmJgorICAgICAgICAgaC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpKQorICAgICAgICBmZl9wcmVkX3dlaWdodF90YWJsZShoKTsKKyAgICBlbHNlIGlmIChoLT5wcHMud2VpZ2h0ZWRfYmlwcmVkX2lkYyA9PSAyICYmCisgICAgICAgICAgICAgaC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgaW1wbGljaXRfd2VpZ2h0X3RhYmxlKGgsIC0xKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoLT51c2Vfd2VpZ2h0ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgaC0+bHVtYV93ZWlnaHRfZmxhZ1tpXSAgID0gMDsKKyAgICAgICAgICAgIGgtPmNocm9tYV93ZWlnaHRfZmxhZ1tpXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBmcmFtZS1tdCBpcyBlbmFibGVkLCBvbmx5IHVwZGF0ZSBtbWNvIHRhYmxlcyBmb3IgdGhlIGZpcnN0IHNsaWNlCisgICAgLy8gaW4gYSBmaWVsZC4gU3Vic2VxdWVudCBzbGljZXMgY2FuIHRlbXBvcmFyaWx5IGNsb2JiZXIgaC0+bW1jb19pbmRleAorICAgIC8vIG9yIGgtPm1tY28sIHdoaWNoIHdpbGwgY2F1c2UgcmVmIGxpc3QgbWl4LXVwcyBhbmQgZGVjb2RpbmcgZXJyb3JzCisgICAgLy8gZnVydGhlciBkb3duIHRoZSBsaW5lLiBUaGlzIG1heSBicmVhayBkZWNvZGluZyBpZiB0aGUgZmlyc3Qgc2xpY2UgaXMKKyAgICAvLyBjb3JydXB0LCB0aHVzIHdlIG9ubHkgZG8gdGhpcyBpZiBmcmFtZS1tdCBpcyBlbmFibGVkLgorICAgIGlmIChoLT5uYWxfcmVmX2lkYykgeworICAgICAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9yZWZfcGljX21hcmtpbmcoaDAsICZoLT5nYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoaC0+YXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgwLT5jdXJyZW50X3NsaWNlID09IDApOworICAgICAgICBpZiAocmV0IDwgMCAmJiAoaC0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKEZSQU1FX01CQUZGKGgpKSB7CisgICAgICAgIGZmX2gyNjRfZmlsbF9tYmFmZl9yZWZfbGlzdChoKTsKKworICAgICAgICBpZiAoaC0+cHBzLndlaWdodGVkX2JpcHJlZF9pZGMgPT0gMiAmJiBoLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICAgICAgaW1wbGljaXRfd2VpZ2h0X3RhYmxlKGgsIDApOworICAgICAgICAgICAgaW1wbGljaXRfd2VpZ2h0X3RhYmxlKGgsIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGgtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmICFoLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkKQorICAgICAgICBmZl9oMjY0X2RpcmVjdF9kaXN0X3NjYWxlX2ZhY3RvcihoKTsKKyAgICBmZl9oMjY0X2RpcmVjdF9yZWZfbGlzdF9pbml0KGgpOworCisgICAgaWYgKGgtPnNsaWNlX3R5cGVfbm9zICE9IEFWX1BJQ1RVUkVfVFlQRV9JICYmIGgtPnBwcy5jYWJhYykgeworICAgICAgICB0bXAgPSBnZXRfdWVfZ29sb21iXzMxKCZoLT5nYik7CisgICAgICAgIGlmICh0bXAgPiAyKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNhYmFjX2luaXRfaWRjICV1IG92ZXJmbG93XG4iLCB0bXApOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaC0+Y2FiYWNfaW5pdF9pZGMgPSB0bXA7CisgICAgfQorCisgICAgaC0+bGFzdF9xc2NhbGVfZGlmZiA9IDA7CisgICAgdG1wID0gaC0+cHBzLmluaXRfcXAgKyBnZXRfc2VfZ29sb21iKCZoLT5nYik7CisgICAgaWYgKHRtcCA+IDUxICsgNiAqIChoLT5zcHMuYml0X2RlcHRoX2x1bWEgLSA4KSkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlFQICV1IG91dCBvZiByYW5nZVxuIiwgdG1wKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGgtPnFzY2FsZSAgICAgICA9IHRtcDsKKyAgICBoLT5jaHJvbWFfcXBbMF0gPSBnZXRfY2hyb21hX3FwKGgsIDAsIGgtPnFzY2FsZSk7CisgICAgaC0+Y2hyb21hX3FwWzFdID0gZ2V0X2Nocm9tYV9xcChoLCAxLCBoLT5xc2NhbGUpOworICAgIC8vIEZJWE1FIHFzY2FsZSAvIHFwIC4uLiBzdHVmZgorICAgIGlmIChoLT5zbGljZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9TUCkKKyAgICAgICAgZ2V0X2JpdHMxKCZoLT5nYik7IC8qIHNwX2Zvcl9zd2l0Y2hfZmxhZyAqLworICAgIGlmIChoLT5zbGljZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9TUCB8fAorICAgICAgICBoLT5zbGljZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9TSSkKKyAgICAgICAgZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOyAvKiBzbGljZV9xc19kZWx0YSAqLworCisgICAgaC0+ZGVibG9ja2luZ19maWx0ZXIgICAgID0gMTsKKyAgICBoLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQgPSAwOworICAgIGgtPnNsaWNlX2JldGFfb2Zmc2V0ICAgICA9IDA7CisgICAgaWYgKGgtPnBwcy5kZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQpIHsKKyAgICAgICAgdG1wID0gZ2V0X3VlX2dvbG9tYl8zMSgmaC0+Z2IpOworICAgICAgICBpZiAodG1wID4gMikgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImRlYmxvY2tpbmdfZmlsdGVyX2lkYyAldSBvdXQgb2YgcmFuZ2VcbiIsIHRtcCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBoLT5kZWJsb2NraW5nX2ZpbHRlciA9IHRtcDsKKyAgICAgICAgaWYgKGgtPmRlYmxvY2tpbmdfZmlsdGVyIDwgMikKKyAgICAgICAgICAgIGgtPmRlYmxvY2tpbmdfZmlsdGVyIF49IDE7ICAvLyAxPC0+MAorCisgICAgICAgIGlmIChoLT5kZWJsb2NraW5nX2ZpbHRlcikgeworICAgICAgICAgICAgaC0+c2xpY2VfYWxwaGFfYzBfb2Zmc2V0ID0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpICogMjsKKyAgICAgICAgICAgIGgtPnNsaWNlX2JldGFfb2Zmc2V0ICAgICA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKSAqIDI7CisgICAgICAgICAgICBpZiAoaC0+c2xpY2VfYWxwaGFfYzBfb2Zmc2V0ID4gIDEyIHx8CisgICAgICAgICAgICAgICAgaC0+c2xpY2VfYWxwaGFfYzBfb2Zmc2V0IDwgLTEyIHx8CisgICAgICAgICAgICAgICAgaC0+c2xpY2VfYmV0YV9vZmZzZXQgPiAgMTIgICAgIHx8CisgICAgICAgICAgICAgICAgaC0+c2xpY2VfYmV0YV9vZmZzZXQgPCAtMTIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImRlYmxvY2tpbmcgZmlsdGVyIHBhcmFtZXRlcnMgJWQgJWQgb3V0IG9mIHJhbmdlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBoLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQsIGgtPnNsaWNlX2JldGFfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoLT5hdmN0eC0+c2tpcF9sb29wX2ZpbHRlciA+PSBBVkRJU0NBUkRfQUxMIHx8CisgICAgICAgIChoLT5hdmN0eC0+c2tpcF9sb29wX2ZpbHRlciA+PSBBVkRJU0NBUkRfTk9OS0VZICYmCisgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9JRFJfU0xJQ0UpIHx8CisgICAgICAgIChoLT5hdmN0eC0+c2tpcF9sb29wX2ZpbHRlciA+PSBBVkRJU0NBUkRfTk9OSU5UUkEgJiYKKyAgICAgICAgIGgtPnNsaWNlX3R5cGVfbm9zICE9IEFWX1BJQ1RVUkVfVFlQRV9JKSB8fAorICAgICAgICAoaC0+YXZjdHgtPnNraXBfbG9vcF9maWx0ZXIgPj0gQVZESVNDQVJEX0JJRElSICAmJgorICAgICAgICAgaC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHx8CisgICAgICAgIChoLT5hdmN0eC0+c2tpcF9sb29wX2ZpbHRlciA+PSBBVkRJU0NBUkRfTk9OUkVGICYmCisgICAgICAgICBoLT5uYWxfcmVmX2lkYyA9PSAwKSkKKyAgICAgICAgaC0+ZGVibG9ja2luZ19maWx0ZXIgPSAwOworCisgICAgaWYgKGgtPmRlYmxvY2tpbmdfZmlsdGVyID09IDEgJiYgaDAtPm1heF9jb250ZXh0cyA+IDEpIHsKKyAgICAgICAgaWYgKGgtPmF2Y3R4LT5mbGFnczIgJiBDT0RFQ19GTEFHMl9GQVNUKSB7CisgICAgICAgICAgICAvKiBDaGVhdCBzbGlnaHRseSBmb3Igc3BlZWQ6CisgICAgICAgICAgICAgKiBEbyBub3QgYm90aGVyIHRvIGRlYmxvY2sgYWNyb3NzIHNsaWNlcy4gKi8KKyAgICAgICAgICAgIGgtPmRlYmxvY2tpbmdfZmlsdGVyID0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGgwLT5tYXhfY29udGV4dHMgPSAxOworICAgICAgICAgICAgaWYgKCFoMC0+c2luZ2xlX2RlY29kZV93YXJuaW5nKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBwYXJhbGxlbGl6ZSBzbGljZSBkZWNvZGluZyB3aXRoIGRlYmxvY2tpbmcgZmlsdGVyIHR5cGUgMSwgZGVjb2Rpbmcgc3VjaCBmcmFtZXMgaW4gc2VxdWVudGlhbCBvcmRlclxuIgorICAgICAgICAgICAgICAgICAgICAgICAiVG8gcGFyYWxsZWxpemUgc2xpY2UgZGVjb2RpbmcgeW91IG5lZWQgdmlkZW8gZW5jb2RlZCB3aXRoIGRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjIHNldCB0byAyIChkZWJsb2NrIG9ubHkgZWRnZXMgdGhhdCBkbyBub3QgY3Jvc3Mgc2xpY2VzKS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIlNldHRpbmcgdGhlIGZsYWdzMiBsaWJhdmNvZGVjIG9wdGlvbiB0byArZmFzdCAoLWZsYWdzMiArZmFzdCkgd2lsbCBkaXNhYmxlIGRlYmxvY2tpbmcgYWNyb3NzIHNsaWNlcyBhbmQgZW5hYmxlIHBhcmFsbGVsIHNsaWNlIGRlY29kaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgImJ1dCB3aWxsIGdlbmVyYXRlIG5vbi1zdGFuZGFyZC1jb21wbGlhbnQgb3V0cHV0LlxuIik7CisgICAgICAgICAgICAgICAgaDAtPnNpbmdsZV9kZWNvZGVfd2FybmluZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaCAhPSBoMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRGVibG9ja2luZyBzd2l0Y2hlZCBpbnNpZGUgZnJhbWUuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU0xJQ0VfU0lOR0xFVEhSRUFEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGgtPnFwX3RocmVzaCA9IDE1IC0KKyAgICAgICAgICAgICAgICAgICBGRk1JTihoLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQsIGgtPnNsaWNlX2JldGFfb2Zmc2V0KSAtCisgICAgICAgICAgICAgICAgICAgRkZNQVgzKDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnBwcy5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcHMuY2hyb21hX3FwX2luZGV4X29mZnNldFsxXSkgKworICAgICAgICAgICAgICAgICAgIDYgKiAoaC0+c3BzLmJpdF9kZXB0aF9sdW1hIC0gOCk7CisKKyAgICBoMC0+bGFzdF9zbGljZV90eXBlID0gc2xpY2VfdHlwZTsKKyAgICBtZW1jcHkoaDAtPmxhc3RfcmVmX2NvdW50LCBoMC0+cmVmX2NvdW50LCBzaXplb2YoaDAtPmxhc3RfcmVmX2NvdW50KSk7CisgICAgaC0+c2xpY2VfbnVtICAgICAgICA9ICsraDAtPmN1cnJlbnRfc2xpY2U7CisKKyAgICBpZiAoaC0+c2xpY2VfbnVtKQorICAgICAgICBoMC0+c2xpY2Vfcm93WyhoLT5zbGljZV9udW0tMSkmKE1BWF9TTElDRVMtMSldPSBoLT5yZXN5bmNfbWJfeTsKKyAgICBpZiAoICAgaDAtPnNsaWNlX3Jvd1toLT5zbGljZV9udW0mKE1BWF9TTElDRVMtMSldICsgMyA+PSBoLT5yZXN5bmNfbWJfeQorICAgICAgICAmJiBoMC0+c2xpY2Vfcm93W2gtPnNsaWNlX251bSYoTUFYX1NMSUNFUy0xKV0gPD0gaC0+cmVzeW5jX21iX3kKKyAgICAgICAgJiYgaC0+c2xpY2VfbnVtID49IE1BWF9TTElDRVMpIHsKKyAgICAgICAgLy9pbiBjYXNlIG9mIEFTTyB0aGlzIGNoZWNrIG5lZWRzIHRvIGJlIHVwZGF0ZWQgZGVwZW5kaW5nIG9uIGhvdyB3ZSBkZWNpZGUgdG8gYXNzaWduIHNsaWNlIG51bWJlcnMgaW4gdGhpcyBjYXNlCisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJQb3NzaWJseSB0b28gbWFueSBzbGljZXMgKCVkID49ICVkKSwgaW5jcmVhc2UgTUFYX1NMSUNFUyBhbmQgcmVjb21waWxlIGlmIHRoZXJlIGFyZSBhcnRpZmFjdHNcbiIsIGgtPnNsaWNlX251bSwgTUFYX1NMSUNFUyk7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICBpbnQgaWRfbGlzdFsxNl07CisgICAgICAgIGludCAqcmVmMmZybSA9IGgtPnJlZjJmcm1baC0+c2xpY2VfbnVtICYgKE1BWF9TTElDRVMgLSAxKV1bal07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBpZF9saXN0W2ldID0gNjA7CisgICAgICAgICAgICBpZiAoaiA8IGgtPmxpc3RfY291bnQgJiYgaSA8IGgtPnJlZl9jb3VudFtqXSAmJgorICAgICAgICAgICAgICAgIGgtPnJlZl9saXN0W2pdW2ldLmYuYnVmWzBdKSB7CisgICAgICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICAgICAgQVZCdWZmZXIgKmJ1ZiA9IGgtPnJlZl9saXN0W2pdW2ldLmYuYnVmWzBdLT5idWZmZXI7CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGgtPnNob3J0X3JlZl9jb3VudDsgaysrKQorICAgICAgICAgICAgICAgICAgICBpZiAoaC0+c2hvcnRfcmVmW2tdLT5mLmJ1ZlswXS0+YnVmZmVyID09IGJ1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWRfbGlzdFtpXSA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoLT5sb25nX3JlZl9jb3VudDsgaysrKQorICAgICAgICAgICAgICAgICAgICBpZiAoaC0+bG9uZ19yZWZba10gJiYgaC0+bG9uZ19yZWZba10tPmYuYnVmWzBdLT5idWZmZXIgPT0gYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZF9saXN0W2ldID0gaC0+c2hvcnRfcmVmX2NvdW50ICsgazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZWYyZnJtWzBdID0KKyAgICAgICAgcmVmMmZybVsxXSA9IC0xOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIHJlZjJmcm1baSArIDJdID0gNCAqIGlkX2xpc3RbaV0gKyAoaC0+cmVmX2xpc3Rbal1baV0ucmVmZXJlbmNlICYgMyk7CisgICAgICAgIHJlZjJmcm1bMTggKyAwXSA9CisgICAgICAgIHJlZjJmcm1bMTggKyAxXSA9IC0xOworICAgICAgICBmb3IgKGkgPSAxNjsgaSA8IDQ4OyBpKyspCisgICAgICAgICAgICByZWYyZnJtW2kgKyA0XSA9IDQgKiBpZF9saXN0WyhpIC0gMTYpID4+IDFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnJlZl9saXN0W2pdW2ldLnJlZmVyZW5jZSAmIDMpOworICAgIH0KKworICAgIGlmIChoLT5yZWZfY291bnRbMF0pIGZmX2gyNjRfc2V0X2VycGljKCZoLT5lci5sYXN0X3BpYywgJmgtPnJlZl9saXN0WzBdWzBdKTsKKyAgICBpZiAoaC0+cmVmX2NvdW50WzFdKSBmZl9oMjY0X3NldF9lcnBpYygmaC0+ZXIubmV4dF9waWMsICZoLT5yZWZfbGlzdFsxXVswXSk7CisKKyAgICBoLT5lci5yZWZfY291bnQgPSBoLT5yZWZfY291bnRbMF07CisgICAgaDAtPmF1X3Bwc19pZCA9IHBwc19pZDsKKyAgICBoLT5zcHMubmV3ID0KKyAgICBoMC0+c3BzX2J1ZmZlcnNbaC0+cHBzLnNwc19pZF0tPm5ldyA9IDA7CisgICAgaC0+Y3VycmVudF9zcHNfaWQgPSBoLT5wcHMuc3BzX2lkOworCisgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJzbGljZTolZCAlcyBtYjolZCAlYyVzJXMgcHBzOiV1IGZyYW1lOiVkIHBvYzolZC8lZCByZWY6JWQvJWQgcXA6JWQgbG9vcDolZDolZDolZCB3ZWlnaHQ6JWQlcyAlc1xuIiwKKyAgICAgICAgICAgICAgIGgtPnNsaWNlX251bSwKKyAgICAgICAgICAgICAgIChoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FID8gIkYiIDogaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9UT1BfRklFTEQgPyAiVCIgOiAiQiIpLAorICAgICAgICAgICAgICAgZmlyc3RfbWJfaW5fc2xpY2UsCisgICAgICAgICAgICAgICBhdl9nZXRfcGljdHVyZV90eXBlX2NoYXIoaC0+c2xpY2VfdHlwZSksCisgICAgICAgICAgICAgICBoLT5zbGljZV90eXBlX2ZpeGVkID8gIiBmaXgiIDogIiIsCisgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlID09IE5BTF9JRFJfU0xJQ0UgPyAiIElEUiIgOiAiIiwKKyAgICAgICAgICAgICAgIHBwc19pZCwgaC0+ZnJhbWVfbnVtLAorICAgICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPmZpZWxkX3BvY1swXSwKKyAgICAgICAgICAgICAgIGgtPmN1cl9waWNfcHRyLT5maWVsZF9wb2NbMV0sCisgICAgICAgICAgICAgICBoLT5yZWZfY291bnRbMF0sIGgtPnJlZl9jb3VudFsxXSwKKyAgICAgICAgICAgICAgIGgtPnFzY2FsZSwKKyAgICAgICAgICAgICAgIGgtPmRlYmxvY2tpbmdfZmlsdGVyLAorICAgICAgICAgICAgICAgaC0+c2xpY2VfYWxwaGFfYzBfb2Zmc2V0LCBoLT5zbGljZV9iZXRhX29mZnNldCwKKyAgICAgICAgICAgICAgIGgtPnVzZV93ZWlnaHQsCisgICAgICAgICAgICAgICBoLT51c2Vfd2VpZ2h0ID09IDEgJiYgaC0+dXNlX3dlaWdodF9jaHJvbWEgPyAiYyIgOiAiIiwKKyAgICAgICAgICAgICAgIGgtPnNsaWNlX3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgPyAoaC0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZCA/ICJTUEFUIiA6ICJURU1QIikgOiAiIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9oMjY0X2dldF9zbGljZV90eXBlKGNvbnN0IEgyNjRDb250ZXh0ICpoKQoreworICAgIHN3aXRjaCAoaC0+c2xpY2VfdHlwZSkgeworICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX1A6CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX0I6CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX0k6CisgICAgICAgIHJldHVybiAyOworICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX1NQOgorICAgICAgICByZXR1cm4gMzsKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9TSToKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZpbGxfZmlsdGVyX2NhY2hlc19pbnRlcihIMjY0Q29udGV4dCAqaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlLCBpbnQgdG9wX3h5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRfeHlbTEVGVF9NQlNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRfdHlwZVtMRUZUX01CU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfeHksIGludCBsaXN0KQoreworICAgIGludCBiX3N0cmlkZSA9IGgtPmJfc3RyaWRlOworICAgIGludDE2X3QoKm12X2RzdClbMl0gPSAmaC0+bXZfY2FjaGVbbGlzdF1bc2NhbjhbMF1dOworICAgIGludDhfdCAqcmVmX2NhY2hlID0gJmgtPnJlZl9jYWNoZVtsaXN0XVtzY2FuOFswXV07CisgICAgaWYgKElTX0lOVEVSKG1iX3R5cGUpIHx8IElTX0RJUkVDVChtYl90eXBlKSkgeworICAgICAgICBpZiAoVVNFU19MSVNUKHRvcF90eXBlLCBsaXN0KSkgeworICAgICAgICAgICAgY29uc3QgaW50IGJfeHkgID0gaC0+bWIyYl94eVt0b3BfeHldICsgMyAqIGJfc3RyaWRlOworICAgICAgICAgICAgY29uc3QgaW50IGI4X3h5ID0gNCAqIHRvcF94eSArIDI7CisgICAgICAgICAgICBpbnQgKCpyZWYyZnJtKVs2NF0gPSAodm9pZCopKGgtPnJlZjJmcm1baC0+c2xpY2VfdGFibGVbdG9wX3h5XSAmIChNQVhfU0xJQ0VTIC0gMSldWzBdICsgKE1CX01CQUZGKGgpID8gMjAgOiAyKSk7CisgICAgICAgICAgICBBVl9DT1BZMTI4KG12X2RzdCAtIDEgKiA4LCBoLT5jdXJfcGljLm1vdGlvbl92YWxbbGlzdF1bYl94eSArIDBdKTsKKyAgICAgICAgICAgIHJlZl9jYWNoZVswIC0gMSAqIDhdID0KKyAgICAgICAgICAgIHJlZl9jYWNoZVsxIC0gMSAqIDhdID0gcmVmMmZybVtsaXN0XVtoLT5jdXJfcGljLnJlZl9pbmRleFtsaXN0XVtiOF94eSArIDBdXTsKKyAgICAgICAgICAgIHJlZl9jYWNoZVsyIC0gMSAqIDhdID0KKyAgICAgICAgICAgIHJlZl9jYWNoZVszIC0gMSAqIDhdID0gcmVmMmZybVtsaXN0XVtoLT5jdXJfcGljLnJlZl9pbmRleFtsaXN0XVtiOF94eSArIDFdXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFWX1pFUk8xMjgobXZfZHN0IC0gMSAqIDgpOworICAgICAgICAgICAgQVZfV04zMkEoJnJlZl9jYWNoZVswIC0gMSAqIDhdLCAoKExJU1RfTk9UX1VTRUQpICYgMHhGRikgKiAweDAxMDEwMTAxdSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUlTX0lOVEVSTEFDRUQobWJfdHlwZSBeIGxlZnRfdHlwZVtMVE9QXSkpIHsKKyAgICAgICAgICAgIGlmIChVU0VTX0xJU1QobGVmdF90eXBlW0xUT1BdLCBsaXN0KSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBiX3h5ICA9IGgtPm1iMmJfeHlbbGVmdF94eVtMVE9QXV0gKyAzOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBiOF94eSA9IDQgKiBsZWZ0X3h5W0xUT1BdICsgMTsKKyAgICAgICAgICAgICAgICBpbnQgKCpyZWYyZnJtKVs2NF0gPSh2b2lkKikoIGgtPnJlZjJmcm1baC0+c2xpY2VfdGFibGVbbGVmdF94eVtMVE9QXV0gJiAoTUFYX1NMSUNFUyAtIDEpXVswXSArIChNQl9NQkFGRihoKSA/IDIwIDogMikpOworICAgICAgICAgICAgICAgIEFWX0NPUFkzMihtdl9kc3QgLSAxICsgIDAsIGgtPmN1cl9waWMubW90aW9uX3ZhbFtsaXN0XVtiX3h5ICsgYl9zdHJpZGUgKiAwXSk7CisgICAgICAgICAgICAgICAgQVZfQ09QWTMyKG12X2RzdCAtIDEgKyAgOCwgaC0+Y3VyX3BpYy5tb3Rpb25fdmFsW2xpc3RdW2JfeHkgKyBiX3N0cmlkZSAqIDFdKTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIobXZfZHN0IC0gMSArIDE2LCBoLT5jdXJfcGljLm1vdGlvbl92YWxbbGlzdF1bYl94eSArIGJfc3RyaWRlICogMl0pOworICAgICAgICAgICAgICAgIEFWX0NPUFkzMihtdl9kc3QgLSAxICsgMjQsIGgtPmN1cl9waWMubW90aW9uX3ZhbFtsaXN0XVtiX3h5ICsgYl9zdHJpZGUgKiAzXSk7CisgICAgICAgICAgICAgICAgcmVmX2NhY2hlWy0xICsgIDBdID0KKyAgICAgICAgICAgICAgICByZWZfY2FjaGVbLTEgKyAgOF0gPSByZWYyZnJtW2xpc3RdW2gtPmN1cl9waWMucmVmX2luZGV4W2xpc3RdW2I4X3h5ICsgMiAqIDBdXTsKKyAgICAgICAgICAgICAgICByZWZfY2FjaGVbLTEgKyAxNl0gPQorICAgICAgICAgICAgICAgIHJlZl9jYWNoZVstMSArIDI0XSA9IHJlZjJmcm1bbGlzdF1baC0+Y3VyX3BpYy5yZWZfaW5kZXhbbGlzdF1bYjhfeHkgKyAyICogMV1dOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBVl9aRVJPMzIobXZfZHN0IC0gMSArICAwKTsKKyAgICAgICAgICAgICAgICBBVl9aRVJPMzIobXZfZHN0IC0gMSArICA4KTsKKyAgICAgICAgICAgICAgICBBVl9aRVJPMzIobXZfZHN0IC0gMSArIDE2KTsKKyAgICAgICAgICAgICAgICBBVl9aRVJPMzIobXZfZHN0IC0gMSArIDI0KTsKKyAgICAgICAgICAgICAgICByZWZfY2FjaGVbLTEgKyAgMF0gPQorICAgICAgICAgICAgICAgIHJlZl9jYWNoZVstMSArICA4XSA9CisgICAgICAgICAgICAgICAgcmVmX2NhY2hlWy0xICsgMTZdID0KKyAgICAgICAgICAgICAgICByZWZfY2FjaGVbLTEgKyAyNF0gPSBMSVNUX05PVF9VU0VEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFVU0VTX0xJU1QobWJfdHlwZSwgbGlzdCkpIHsKKyAgICAgICAgZmlsbF9yZWN0YW5nbGUobXZfZHN0LCA0LCA0LCA4LCBwYWNrMTZ0bzMyKDAsIDApLCA0KTsKKyAgICAgICAgQVZfV04zMkEoJnJlZl9jYWNoZVswICogOF0sICgoTElTVF9OT1RfVVNFRCkgJiAweEZGKSAqIDB4MDEwMTAxMDF1KTsKKyAgICAgICAgQVZfV04zMkEoJnJlZl9jYWNoZVsxICogOF0sICgoTElTVF9OT1RfVVNFRCkgJiAweEZGKSAqIDB4MDEwMTAxMDF1KTsKKyAgICAgICAgQVZfV04zMkEoJnJlZl9jYWNoZVsyICogOF0sICgoTElTVF9OT1RfVVNFRCkgJiAweEZGKSAqIDB4MDEwMTAxMDF1KTsKKyAgICAgICAgQVZfV04zMkEoJnJlZl9jYWNoZVszICogOF0sICgoTElTVF9OT1RfVVNFRCkgJiAweEZGKSAqIDB4MDEwMTAxMDF1KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHsKKyAgICAgICAgaW50OF90ICpyZWYgPSAmaC0+Y3VyX3BpYy5yZWZfaW5kZXhbbGlzdF1bNCAqIG1iX3h5XTsKKyAgICAgICAgaW50ICgqcmVmMmZybSlbNjRdID0gKHZvaWQqKShoLT5yZWYyZnJtW2gtPnNsaWNlX251bSAmIChNQVhfU0xJQ0VTIC0gMSldWzBdICsgKE1CX01CQUZGKGgpID8gMjAgOiAyKSk7CisgICAgICAgIHVpbnQzMl90IHJlZjAxID0gKHBhY2sxNnRvMzIocmVmMmZybVtsaXN0XVtyZWZbMF1dLCByZWYyZnJtW2xpc3RdW3JlZlsxXV0pICYgMHgwMEZGMDBGRikgKiAweDAxMDE7CisgICAgICAgIHVpbnQzMl90IHJlZjIzID0gKHBhY2sxNnRvMzIocmVmMmZybVtsaXN0XVtyZWZbMl1dLCByZWYyZnJtW2xpc3RdW3JlZlszXV0pICYgMHgwMEZGMDBGRikgKiAweDAxMDE7CisgICAgICAgIEFWX1dOMzJBKCZyZWZfY2FjaGVbMCAqIDhdLCByZWYwMSk7CisgICAgICAgIEFWX1dOMzJBKCZyZWZfY2FjaGVbMSAqIDhdLCByZWYwMSk7CisgICAgICAgIEFWX1dOMzJBKCZyZWZfY2FjaGVbMiAqIDhdLCByZWYyMyk7CisgICAgICAgIEFWX1dOMzJBKCZyZWZfY2FjaGVbMyAqIDhdLCByZWYyMyk7CisgICAgfQorCisgICAgeworICAgICAgICBpbnQxNl90KCptdl9zcmMpWzJdID0gJmgtPmN1cl9waWMubW90aW9uX3ZhbFtsaXN0XVs0ICogaC0+bWJfeCArIDQgKiBoLT5tYl95ICogYl9zdHJpZGVdOworICAgICAgICBBVl9DT1BZMTI4KG12X2RzdCArIDggKiAwLCBtdl9zcmMgKyAwICogYl9zdHJpZGUpOworICAgICAgICBBVl9DT1BZMTI4KG12X2RzdCArIDggKiAxLCBtdl9zcmMgKyAxICogYl9zdHJpZGUpOworICAgICAgICBBVl9DT1BZMTI4KG12X2RzdCArIDggKiAyLCBtdl9zcmMgKyAyICogYl9zdHJpZGUpOworICAgICAgICBBVl9DT1BZMTI4KG12X2RzdCArIDggKiAzLCBtdl9zcmMgKyAzICogYl9zdHJpZGUpOworICAgIH0KK30KKworLyoqCisgKgorICogQHJldHVybiBub24gemVybyBpZiB0aGUgbG9vcCBmaWx0ZXIgY2FuIGJlIHNraXBwZWQKKyAqLworc3RhdGljIGludCBmaWxsX2ZpbHRlcl9jYWNoZXMoSDI2NENvbnRleHQgKmgsIGludCBtYl90eXBlKQoreworICAgIGNvbnN0IGludCBtYl94eSA9IGgtPm1iX3h5OworICAgIGludCB0b3BfeHksIGxlZnRfeHlbTEVGVF9NQlNdOworICAgIGludCB0b3BfdHlwZSwgbGVmdF90eXBlW0xFRlRfTUJTXTsKKyAgICB1aW50OF90ICpubno7CisgICAgdWludDhfdCAqbm56X2NhY2hlOworCisgICAgdG9wX3h5ID0gbWJfeHkgLSAoaC0+bWJfc3RyaWRlIDw8IE1CX0ZJRUxEKGgpKTsKKworICAgIC8qIFdvdywgd2hhdCBhIG1lc3MsIHdoeSBkaWRuJ3QgdGhleSBzaW1wbGlmeSB0aGUgaW50ZXJsYWNpbmcgJiBpbnRyYQorICAgICAqIHN0dWZmLCBJIGNhbid0IGltYWdpbmUgdGhhdCB0aGVzZSBjb21wbGV4IHJ1bGVzIGFyZSB3b3J0aCBpdC4gKi8KKworICAgIGxlZnRfeHlbTEJPVF0gPSBsZWZ0X3h5W0xUT1BdID0gbWJfeHkgLSAxOworICAgIGlmIChGUkFNRV9NQkFGRihoKSkgeworICAgICAgICBjb25zdCBpbnQgbGVmdF9tYl9maWVsZF9mbGFnID0gSVNfSU5URVJMQUNFRChoLT5jdXJfcGljLm1iX3R5cGVbbWJfeHkgLSAxXSk7CisgICAgICAgIGNvbnN0IGludCBjdXJyX21iX2ZpZWxkX2ZsYWcgPSBJU19JTlRFUkxBQ0VEKG1iX3R5cGUpOworICAgICAgICBpZiAoaC0+bWJfeSAmIDEpIHsKKyAgICAgICAgICAgIGlmIChsZWZ0X21iX2ZpZWxkX2ZsYWcgIT0gY3Vycl9tYl9maWVsZF9mbGFnKQorICAgICAgICAgICAgICAgIGxlZnRfeHlbTFRPUF0gLT0gaC0+bWJfc3RyaWRlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGN1cnJfbWJfZmllbGRfZmxhZykKKyAgICAgICAgICAgICAgICB0b3BfeHkgKz0gaC0+bWJfc3RyaWRlICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoaC0+Y3VyX3BpYy5tYl90eXBlW3RvcF94eV0gPj4gNykgJiAxKSAtIDEpOworICAgICAgICAgICAgaWYgKGxlZnRfbWJfZmllbGRfZmxhZyAhPSBjdXJyX21iX2ZpZWxkX2ZsYWcpCisgICAgICAgICAgICAgICAgbGVmdF94eVtMQk9UXSArPSBoLT5tYl9zdHJpZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBoLT50b3BfbWJfeHkgICAgICAgID0gdG9wX3h5OworICAgIGgtPmxlZnRfbWJfeHlbTFRPUF0gPSBsZWZ0X3h5W0xUT1BdOworICAgIGgtPmxlZnRfbWJfeHlbTEJPVF0gPSBsZWZ0X3h5W0xCT1RdOworICAgIHsKKyAgICAgICAgLyogRm9yIHN1ZmZpY2llbnRseSBsb3cgcXAsIGZpbHRlcmluZyB3b3VsZG4ndCBkbyBhbnl0aGluZy4KKyAgICAgICAgICogVGhpcyBpcyBhIGNvbnNlcnZhdGl2ZSBlc3RpbWF0ZTogY291bGQgYWxzbyBjaGVjayBiZXRhX29mZnNldAorICAgICAgICAgKiBhbmQgbW9yZSBhY2N1cmF0ZSBjaHJvbWFfcXAuICovCisgICAgICAgIGludCBxcF90aHJlc2ggPSBoLT5xcF90aHJlc2g7IC8vIEZJWE1FIHN0cmljdGx5IHdlIHNob3VsZCBzdG9yZSBxcF90aHJlc2ggZm9yIGVhY2ggbWIgb2YgYSBzbGljZQorICAgICAgICBpbnQgcXAgICAgICAgID0gaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHldOworICAgICAgICBpZiAocXAgPD0gcXBfdGhyZXNoICYmCisgICAgICAgICAgICAobGVmdF94eVtMVE9QXSA8IDAgfHwKKyAgICAgICAgICAgICAoKHFwICsgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbGVmdF94eVtMVE9QXV0gKyAxKSA+PiAxKSA8PSBxcF90aHJlc2gpICYmCisgICAgICAgICAgICAodG9wX3h5IDwgMCB8fAorICAgICAgICAgICAgICgocXAgKyBoLT5jdXJfcGljLnFzY2FsZV90YWJsZVt0b3BfeHldICsgMSkgPj4gMSkgPD0gcXBfdGhyZXNoKSkgeworICAgICAgICAgICAgaWYgKCFGUkFNRV9NQkFGRihoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGlmICgobGVmdF94eVtMVE9QXSA8IDAgfHwKKyAgICAgICAgICAgICAgICAgKChxcCArIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW2xlZnRfeHlbTEJPVF1dICsgMSkgPj4gMSkgPD0gcXBfdGhyZXNoKSAmJgorICAgICAgICAgICAgICAgICh0b3BfeHkgPCBoLT5tYl9zdHJpZGUgfHwKKyAgICAgICAgICAgICAgICAgKChxcCArIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW3RvcF94eSAtIGgtPm1iX3N0cmlkZV0gKyAxKSA+PiAxKSA8PSBxcF90aHJlc2gpKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgdG9wX3R5cGUgICAgICAgID0gaC0+Y3VyX3BpYy5tYl90eXBlW3RvcF94eV07CisgICAgbGVmdF90eXBlW0xUT1BdID0gaC0+Y3VyX3BpYy5tYl90eXBlW2xlZnRfeHlbTFRPUF1dOworICAgIGxlZnRfdHlwZVtMQk9UXSA9IGgtPmN1cl9waWMubWJfdHlwZVtsZWZ0X3h5W0xCT1RdXTsKKyAgICBpZiAoaC0+ZGVibG9ja2luZ19maWx0ZXIgPT0gMikgeworICAgICAgICBpZiAoaC0+c2xpY2VfdGFibGVbdG9wX3h5XSAhPSBoLT5zbGljZV9udW0pCisgICAgICAgICAgICB0b3BfdHlwZSA9IDA7CisgICAgICAgIGlmIChoLT5zbGljZV90YWJsZVtsZWZ0X3h5W0xCT1RdXSAhPSBoLT5zbGljZV9udW0pCisgICAgICAgICAgICBsZWZ0X3R5cGVbTFRPUF0gPSBsZWZ0X3R5cGVbTEJPVF0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChoLT5zbGljZV90YWJsZVt0b3BfeHldID09IDB4RkZGRikKKyAgICAgICAgICAgIHRvcF90eXBlID0gMDsKKyAgICAgICAgaWYgKGgtPnNsaWNlX3RhYmxlW2xlZnRfeHlbTEJPVF1dID09IDB4RkZGRikKKyAgICAgICAgICAgIGxlZnRfdHlwZVtMVE9QXSA9IGxlZnRfdHlwZVtMQk9UXSA9IDA7CisgICAgfQorICAgIGgtPnRvcF90eXBlICAgICAgICA9IHRvcF90eXBlOworICAgIGgtPmxlZnRfdHlwZVtMVE9QXSA9IGxlZnRfdHlwZVtMVE9QXTsKKyAgICBoLT5sZWZ0X3R5cGVbTEJPVF0gPSBsZWZ0X3R5cGVbTEJPVF07CisKKyAgICBpZiAoSVNfSU5UUkEobWJfdHlwZSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgZmlsbF9maWx0ZXJfY2FjaGVzX2ludGVyKGgsIG1iX3R5cGUsIHRvcF94eSwgbGVmdF94eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wX3R5cGUsIGxlZnRfdHlwZSwgbWJfeHksIDApOworICAgIGlmIChoLT5saXN0X2NvdW50ID09IDIpCisgICAgICAgIGZpbGxfZmlsdGVyX2NhY2hlc19pbnRlcihoLCBtYl90eXBlLCB0b3BfeHksIGxlZnRfeHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BfdHlwZSwgbGVmdF90eXBlLCBtYl94eSwgMSk7CisKKyAgICBubnogICAgICAgPSBoLT5ub25femVyb19jb3VudFttYl94eV07CisgICAgbm56X2NhY2hlID0gaC0+bm9uX3plcm9fY291bnRfY2FjaGU7CisgICAgQVZfQ09QWTMyKCZubnpfY2FjaGVbNCArIDggKiAxXSwgJm5uelswXSk7CisgICAgQVZfQ09QWTMyKCZubnpfY2FjaGVbNCArIDggKiAyXSwgJm5uels0XSk7CisgICAgQVZfQ09QWTMyKCZubnpfY2FjaGVbNCArIDggKiAzXSwgJm5uels4XSk7CisgICAgQVZfQ09QWTMyKCZubnpfY2FjaGVbNCArIDggKiA0XSwgJm5uelsxMl0pOworICAgIGgtPmNicCA9IGgtPmNicF90YWJsZVttYl94eV07CisKKyAgICBpZiAodG9wX3R5cGUpIHsKKyAgICAgICAgbm56ID0gaC0+bm9uX3plcm9fY291bnRbdG9wX3h5XTsKKyAgICAgICAgQVZfQ09QWTMyKCZubnpfY2FjaGVbNCArIDggKiAwXSwgJm5uelszICogNF0pOworICAgIH0KKworICAgIGlmIChsZWZ0X3R5cGVbTFRPUF0pIHsKKyAgICAgICAgbm56ID0gaC0+bm9uX3plcm9fY291bnRbbGVmdF94eVtMVE9QXV07CisgICAgICAgIG5uel9jYWNoZVszICsgOCAqIDFdID0gbm56WzMgKyAwICogNF07CisgICAgICAgIG5uel9jYWNoZVszICsgOCAqIDJdID0gbm56WzMgKyAxICogNF07CisgICAgICAgIG5uel9jYWNoZVszICsgOCAqIDNdID0gbm56WzMgKyAyICogNF07CisgICAgICAgIG5uel9jYWNoZVszICsgOCAqIDRdID0gbm56WzMgKyAzICogNF07CisgICAgfQorCisgICAgLyogQ0FWTEMgOHg4ZGN0IHJlcXVpcmVzIE5OWiB2YWx1ZXMgZm9yIHJlc2lkdWFsIGRlY29kaW5nIHRoYXQgZGlmZmVyCisgICAgICogZnJvbSB3aGF0IHRoZSBsb29wIGZpbHRlciBuZWVkcyAqLworICAgIGlmICghQ0FCQUMoaCkgJiYgaC0+cHBzLnRyYW5zZm9ybV84eDhfbW9kZSkgeworICAgICAgICBpZiAoSVNfOHg4RENUKHRvcF90eXBlKSkgeworICAgICAgICAgICAgbm56X2NhY2hlWzQgKyA4ICogMF0gPQorICAgICAgICAgICAgbm56X2NhY2hlWzUgKyA4ICogMF0gPSAoaC0+Y2JwX3RhYmxlW3RvcF94eV0gJiAweDQwMDApID4+IDEyOworICAgICAgICAgICAgbm56X2NhY2hlWzYgKyA4ICogMF0gPQorICAgICAgICAgICAgbm56X2NhY2hlWzcgKyA4ICogMF0gPSAoaC0+Y2JwX3RhYmxlW3RvcF94eV0gJiAweDgwMDApID4+IDEyOworICAgICAgICB9CisgICAgICAgIGlmIChJU184eDhEQ1QobGVmdF90eXBlW0xUT1BdKSkgeworICAgICAgICAgICAgbm56X2NhY2hlWzMgKyA4ICogMV0gPQorICAgICAgICAgICAgbm56X2NhY2hlWzMgKyA4ICogMl0gPSAoaC0+Y2JwX3RhYmxlW2xlZnRfeHlbTFRPUF1dICYgMHgyMDAwKSA+PiAxMjsgLy8gRklYTUUgY2hlY2sgTUJBRkYKKyAgICAgICAgfQorICAgICAgICBpZiAoSVNfOHg4RENUKGxlZnRfdHlwZVtMQk9UXSkpIHsKKyAgICAgICAgICAgIG5uel9jYWNoZVszICsgOCAqIDNdID0KKyAgICAgICAgICAgIG5uel9jYWNoZVszICsgOCAqIDRdID0gKGgtPmNicF90YWJsZVtsZWZ0X3h5W0xCT1RdXSAmIDB4ODAwMCkgPj4gMTI7IC8vIEZJWE1FIGNoZWNrIE1CQUZGCisgICAgICAgIH0KKworICAgICAgICBpZiAoSVNfOHg4RENUKG1iX3R5cGUpKSB7CisgICAgICAgICAgICBubnpfY2FjaGVbc2NhbjhbMF1dID0KKyAgICAgICAgICAgIG5uel9jYWNoZVtzY2FuOFsxXV0gPQorICAgICAgICAgICAgbm56X2NhY2hlW3NjYW44WzJdXSA9CisgICAgICAgICAgICBubnpfY2FjaGVbc2NhbjhbM11dID0gKGgtPmNicCAmIDB4MTAwMCkgPj4gMTI7CisKKyAgICAgICAgICAgIG5uel9jYWNoZVtzY2FuOFswICsgNF1dID0KKyAgICAgICAgICAgIG5uel9jYWNoZVtzY2FuOFsxICsgNF1dID0KKyAgICAgICAgICAgIG5uel9jYWNoZVtzY2FuOFsyICsgNF1dID0KKyAgICAgICAgICAgIG5uel9jYWNoZVtzY2FuOFszICsgNF1dID0gKGgtPmNicCAmIDB4MjAwMCkgPj4gMTI7CisKKyAgICAgICAgICAgIG5uel9jYWNoZVtzY2FuOFswICsgOF1dID0KKyAgICAgICAgICAgIG5uel9jYWNoZVtzY2FuOFsxICsgOF1dID0KKyAgICAgICAgICAgIG5uel9jYWNoZVtzY2FuOFsyICsgOF1dID0KKyAgICAgICAgICAgIG5uel9jYWNoZVtzY2FuOFszICsgOF1dID0gKGgtPmNicCAmIDB4NDAwMCkgPj4gMTI7CisKKyAgICAgICAgICAgIG5uel9jYWNoZVtzY2FuOFswICsgMTJdXSA9CisgICAgICAgICAgICBubnpfY2FjaGVbc2NhbjhbMSArIDEyXV0gPQorICAgICAgICAgICAgbm56X2NhY2hlW3NjYW44WzIgKyAxMl1dID0KKyAgICAgICAgICAgIG5uel9jYWNoZVtzY2FuOFszICsgMTJdXSA9IChoLT5jYnAgJiAweDgwMDApID4+IDEyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxvb3BfZmlsdGVyKEgyNjRDb250ZXh0ICpoLCBpbnQgc3RhcnRfeCwgaW50IGVuZF94KQoreworICAgIHVpbnQ4X3QgKmRlc3RfeSwgKmRlc3RfY2IsICpkZXN0X2NyOworICAgIGludCBsaW5lc2l6ZSwgdXZsaW5lc2l6ZSwgbWJfeCwgbWJfeTsKKyAgICBjb25zdCBpbnQgZW5kX21iX3kgICAgICAgPSBoLT5tYl95ICsgRlJBTUVfTUJBRkYoaCk7CisgICAgY29uc3QgaW50IG9sZF9zbGljZV90eXBlID0gaC0+c2xpY2VfdHlwZTsKKyAgICBjb25zdCBpbnQgcGl4ZWxfc2hpZnQgICAgPSBoLT5waXhlbF9zaGlmdDsKKyAgICBjb25zdCBpbnQgYmxvY2tfaCAgICAgICAgPSAxNiA+PiBoLT5jaHJvbWFfeV9zaGlmdDsKKworICAgIGlmIChoLT5kZWJsb2NraW5nX2ZpbHRlcikgeworICAgICAgICBmb3IgKG1iX3ggPSBzdGFydF94OyBtYl94IDwgZW5kX3g7IG1iX3grKykKKyAgICAgICAgICAgIGZvciAobWJfeSA9IGVuZF9tYl95IC0gRlJBTUVfTUJBRkYoaCk7IG1iX3kgPD0gZW5kX21iX3k7IG1iX3krKykgeworICAgICAgICAgICAgICAgIGludCBtYl94eSwgbWJfdHlwZTsKKyAgICAgICAgICAgICAgICBtYl94eSAgICAgICAgID0gaC0+bWJfeHkgPSBtYl94ICsgbWJfeSAqIGgtPm1iX3N0cmlkZTsKKyAgICAgICAgICAgICAgICBoLT5zbGljZV9udW0gID0gaC0+c2xpY2VfdGFibGVbbWJfeHldOworICAgICAgICAgICAgICAgIG1iX3R5cGUgICAgICAgPSBoLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldOworICAgICAgICAgICAgICAgIGgtPmxpc3RfY291bnQgPSBoLT5saXN0X2NvdW50c1ttYl94eV07CisKKyAgICAgICAgICAgICAgICBpZiAoRlJBTUVfTUJBRkYoaCkpCisgICAgICAgICAgICAgICAgICAgIGgtPm1iX21iYWZmICAgICAgICAgICAgICAgPQorICAgICAgICAgICAgICAgICAgICBoLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnID0gISFJU19JTlRFUkxBQ0VEKG1iX3R5cGUpOworCisgICAgICAgICAgICAgICAgaC0+bWJfeCA9IG1iX3g7CisgICAgICAgICAgICAgICAgaC0+bWJfeSA9IG1iX3k7CisgICAgICAgICAgICAgICAgZGVzdF95ICA9IGgtPmN1cl9waWMuZi5kYXRhWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChtYl94IDw8IHBpeGVsX3NoaWZ0KSArIG1iX3kgKiBoLT5saW5lc2l6ZSkgKiAxNjsKKyAgICAgICAgICAgICAgICBkZXN0X2NiID0gaC0+Y3VyX3BpYy5mLmRhdGFbMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAobWJfeCA8PCBwaXhlbF9zaGlmdCkgKiAoOCA8PCBDSFJPTUE0NDQoaCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfeSAqIGgtPnV2bGluZXNpemUgKiBibG9ja19oOworICAgICAgICAgICAgICAgIGRlc3RfY3IgPSBoLT5jdXJfcGljLmYuZGF0YVsyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtYl94IDw8IHBpeGVsX3NoaWZ0KSAqICg4IDw8IENIUk9NQTQ0NChoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBtYl95ICogaC0+dXZsaW5lc2l6ZSAqIGJsb2NrX2g7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgc2ltcGxpZnkgYWJvdmUKKworICAgICAgICAgICAgICAgIGlmIChNQl9GSUVMRChoKSkgeworICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSAgID0gaC0+bWJfbGluZXNpemUgICA9IGgtPmxpbmVzaXplICAgKiAyOworICAgICAgICAgICAgICAgICAgICB1dmxpbmVzaXplID0gaC0+bWJfdXZsaW5lc2l6ZSA9IGgtPnV2bGluZXNpemUgKiAyOworICAgICAgICAgICAgICAgICAgICBpZiAobWJfeSAmIDEpIHsgLy8gRklYTUUgbW92ZSBvdXQgb2YgdGhpcyBmdW5jdGlvbj8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfeSAgLT0gaC0+bGluZXNpemUgICAqIDE1OworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9jYiAtPSBoLT51dmxpbmVzaXplICogKGJsb2NrX2ggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfY3IgLT0gaC0+dXZsaW5lc2l6ZSAqIChibG9ja19oIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSAgID0gaC0+bWJfbGluZXNpemUgICA9IGgtPmxpbmVzaXplOworICAgICAgICAgICAgICAgICAgICB1dmxpbmVzaXplID0gaC0+bWJfdXZsaW5lc2l6ZSA9IGgtPnV2bGluZXNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJhY2t1cF9tYl9ib3JkZXIoaCwgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUsIDApOworICAgICAgICAgICAgICAgIGlmIChmaWxsX2ZpbHRlcl9jYWNoZXMoaCwgbWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGgtPmNocm9tYV9xcFswXSA9IGdldF9jaHJvbWFfcXAoaCwgMCwgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHldKTsKKyAgICAgICAgICAgICAgICBoLT5jaHJvbWFfcXBbMV0gPSBnZXRfY2hyb21hX3FwKGgsIDEsIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW21iX3h5XSk7CisKKyAgICAgICAgICAgICAgICBpZiAoRlJBTUVfTUJBRkYoaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmZfaDI2NF9maWx0ZXJfbWIoaCwgbWJfeCwgbWJfeSwgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwgdXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmZfaDI2NF9maWx0ZXJfbWJfZmFzdChoLCBtYl94LCBtYl95LCBkZXN0X3ksIGRlc3RfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9jciwgbGluZXNpemUsIHV2bGluZXNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgaC0+c2xpY2VfdHlwZSAgID0gb2xkX3NsaWNlX3R5cGU7CisgICAgaC0+bWJfeCAgICAgICAgID0gZW5kX3g7CisgICAgaC0+bWJfeSAgICAgICAgID0gZW5kX21iX3kgLSBGUkFNRV9NQkFGRihoKTsKKyAgICBoLT5jaHJvbWFfcXBbMF0gPSBnZXRfY2hyb21hX3FwKGgsIDAsIGgtPnFzY2FsZSk7CisgICAgaC0+Y2hyb21hX3FwWzFdID0gZ2V0X2Nocm9tYV9xcChoLCAxLCBoLT5xc2NhbGUpOworfQorCitzdGF0aWMgdm9pZCBwcmVkaWN0X2ZpZWxkX2RlY29kaW5nX2ZsYWcoSDI2NENvbnRleHQgKmgpCit7CisgICAgY29uc3QgaW50IG1iX3h5ID0gaC0+bWJfeCArIGgtPm1iX3kgKiBoLT5tYl9zdHJpZGU7CisgICAgaW50IG1iX3R5cGUgICAgID0gKGgtPnNsaWNlX3RhYmxlW21iX3h5IC0gMV0gPT0gaC0+c2xpY2VfbnVtKSA/CisgICAgICAgICAgICAgICAgICAgICAgaC0+Y3VyX3BpYy5tYl90eXBlW21iX3h5IC0gMV0gOgorICAgICAgICAgICAgICAgICAgICAgIChoLT5zbGljZV90YWJsZVttYl94eSAtIGgtPm1iX3N0cmlkZV0gPT0gaC0+c2xpY2VfbnVtKSA/CisgICAgICAgICAgICAgICAgICAgICAgaC0+Y3VyX3BpYy5tYl90eXBlW21iX3h5IC0gaC0+bWJfc3RyaWRlXSA6IDA7CisgICAgaC0+bWJfbWJhZmYgICAgID0gaC0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZyA9IElTX0lOVEVSTEFDRUQobWJfdHlwZSkgPyAxIDogMDsKK30KKworLyoqCisgKiBEcmF3IGVkZ2VzIGFuZCByZXBvcnQgcHJvZ3Jlc3MgZm9yIHRoZSBsYXN0IE1CIHJvdy4KKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX2ZpbmlzaF9yb3coSDI2NENvbnRleHQgKmgpCit7CisgICAgaW50IHRvcCAgICAgICAgICAgID0gMTYgKiAoaC0+bWJfeSAgICAgID4+IEZJRUxEX1BJQ1RVUkUoaCkpOworICAgIGludCBwaWNfaGVpZ2h0ICAgICA9IDE2ICogIGgtPm1iX2hlaWdodCA+PiBGSUVMRF9QSUNUVVJFKGgpOworICAgIGludCBoZWlnaHQgICAgICAgICA9ICAxNiAgICAgIDw8IEZSQU1FX01CQUZGKGgpOworICAgIGludCBkZWJsb2NrX2JvcmRlciA9ICgxNiArIDQpIDw8IEZSQU1FX01CQUZGKGgpOworCisgICAgaWYgKGgtPmRlYmxvY2tpbmdfZmlsdGVyKSB7CisgICAgICAgIGlmICgodG9wICsgaGVpZ2h0KSA+PSBwaWNfaGVpZ2h0KQorICAgICAgICAgICAgaGVpZ2h0ICs9IGRlYmxvY2tfYm9yZGVyOworICAgICAgICB0b3AgLT0gZGVibG9ja19ib3JkZXI7CisgICAgfQorCisgICAgaWYgKHRvcCA+PSBwaWNfaGVpZ2h0IHx8ICh0b3AgKyBoZWlnaHQpIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaGVpZ2h0ID0gRkZNSU4oaGVpZ2h0LCBwaWNfaGVpZ2h0IC0gdG9wKTsKKyAgICBpZiAodG9wIDwgMCkgeworICAgICAgICBoZWlnaHQgPSB0b3AgKyBoZWlnaHQ7CisgICAgICAgIHRvcCAgICA9IDA7CisgICAgfQorCisgICAgZmZfaDI2NF9kcmF3X2hvcml6X2JhbmQoaCwgdG9wLCBoZWlnaHQpOworCisgICAgaWYgKGgtPmRyb3BwYWJsZSB8fCBoLT5lci5lcnJvcl9vY2N1cnJlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmaC0+Y3VyX3BpY19wdHItPnRmLCB0b3AgKyBoZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpOworfQorCitzdGF0aWMgdm9pZCBlcl9hZGRfc2xpY2UoSDI2NENvbnRleHQgKmgsIGludCBzdGFydHgsIGludCBzdGFydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZHgsIGludCBlbmR5LCBpbnQgc3RhdHVzKQoreworICAgIGlmIChDT05GSUdfRVJST1JfUkVTSUxJRU5DRSkgeworICAgICAgICBFUkNvbnRleHQgKmVyID0gJmgtPmVyOworCisgICAgICAgIGZmX2VyX2FkZF9zbGljZShlciwgc3RhcnR4LCBzdGFydHksIGVuZHgsIGVuZHksIHN0YXR1cyk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9zbGljZShzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICphcmcpCit7CisgICAgSDI2NENvbnRleHQgKmggPSAqKHZvaWQgKiopYXJnOworICAgIGludCBsZl94X3N0YXJ0ID0gaC0+bWJfeDsKKworICAgIGgtPm1iX3NraXBfcnVuID0gLTE7CisKKyAgICBhdl9hc3NlcnQwKGgtPmJsb2NrX29mZnNldFsxNV0gPT0gKDQgKiAoKHNjYW44WzE1XSAtIHNjYW44WzBdKSAmIDcpIDw8IGgtPnBpeGVsX3NoaWZ0KSArIDQgKiBoLT5saW5lc2l6ZSAqICgoc2NhbjhbMTVdIC0gc2NhbjhbMF0pID4+IDMpKTsKKworICAgIGgtPmlzX2NvbXBsZXggPSBGUkFNRV9NQkFGRihoKSB8fCBoLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FIHx8CisgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9IMjY0IHx8CisgICAgICAgICAgICAgICAgICAgIChDT05GSUdfR1JBWSAmJiAoaC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKTsKKworICAgIGlmICghKGgtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpICYmIGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUgJiYgaC0+ZXIuZXJyb3Jfc3RhdHVzX3RhYmxlKSB7CisgICAgICAgIGNvbnN0IGludCBzdGFydF9pICA9IGF2X2NsaXAoaC0+cmVzeW5jX21iX3ggKyBoLT5yZXN5bmNfbWJfeSAqIGgtPm1iX3dpZHRoLCAwLCBoLT5tYl9udW0gLSAxKTsKKyAgICAgICAgaWYgKHN0YXJ0X2kpIHsKKyAgICAgICAgICAgIGludCBwcmV2X3N0YXR1cyA9IGgtPmVyLmVycm9yX3N0YXR1c190YWJsZVtoLT5lci5tYl9pbmRleDJ4eVtzdGFydF9pIC0gMV1dOworICAgICAgICAgICAgcHJldl9zdGF0dXMgJj0gfiBWUF9TVEFSVDsKKyAgICAgICAgICAgIGlmIChwcmV2X3N0YXR1cyAhPSAoRVJfTVZfRU5EIHwgRVJfRENfRU5EIHwgRVJfQUNfRU5EKSkKKyAgICAgICAgICAgICAgICBoLT5lci5lcnJvcl9vY2N1cnJlZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaC0+cHBzLmNhYmFjKSB7CisgICAgICAgIC8qIHJlYWxpZ24gKi8KKyAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJmgtPmdiKTsKKworICAgICAgICAvKiBpbml0IGNhYmFjICovCisgICAgICAgIGZmX2luaXRfY2FiYWNfZGVjb2RlcigmaC0+Y2FiYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5nYi5idWZmZXIgKyBnZXRfYml0c19jb3VudCgmaC0+Z2IpIC8gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfYml0c19sZWZ0KCZoLT5nYikgKyA3KSAvIDgpOworCisgICAgICAgIGZmX2gyNjRfaW5pdF9jYWJhY19zdGF0ZXMoaCk7CisKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgLy8gU1RBUlRfVElNRVIKKyAgICAgICAgICAgIGludCByZXQgPSBmZl9oMjY0X2RlY29kZV9tYl9jYWJhYyhoKTsKKyAgICAgICAgICAgIGludCBlb3M7CisgICAgICAgICAgICAvLyBTVE9QX1RJTUVSKCJkZWNvZGVfbWJfY2FiYWMiKQorCisgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgZmZfaDI2NF9obF9kZWNvZGVfbWIoaCk7CisKKyAgICAgICAgICAgIC8vIEZJWE1FIG9wdGltYWw/IG9yIGxldCBtYl9kZWNvZGUgZGVjb2RlIDE2eDMyID8KKyAgICAgICAgICAgIGlmIChyZXQgPj0gMCAmJiBGUkFNRV9NQkFGRihoKSkgeworICAgICAgICAgICAgICAgIGgtPm1iX3krKzsKKworICAgICAgICAgICAgICAgIHJldCA9IGZmX2gyNjRfZGVjb2RlX21iX2NhYmFjKGgpOworCisgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgICAgICAgICBmZl9oMjY0X2hsX2RlY29kZV9tYihoKTsKKyAgICAgICAgICAgICAgICBoLT5tYl95LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlb3MgPSBnZXRfY2FiYWNfdGVybWluYXRlKCZoLT5jYWJhYyk7CisKKyAgICAgICAgICAgIGlmICgoaC0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX1RSVU5DQVRFRCkgJiYKKyAgICAgICAgICAgICAgICBoLT5jYWJhYy5ieXRlc3RyZWFtID4gaC0+Y2FiYWMuYnl0ZXN0cmVhbV9lbmQgKyAyKSB7CisgICAgICAgICAgICAgICAgZXJfYWRkX3NsaWNlKGgsIGgtPnJlc3luY19tYl94LCBoLT5yZXN5bmNfbWJfeSwgaC0+bWJfeCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX3ksIEVSX01CX0VORCk7CisgICAgICAgICAgICAgICAgaWYgKGgtPm1iX3ggPj0gbGZfeF9zdGFydCkKKyAgICAgICAgICAgICAgICAgICAgbG9vcF9maWx0ZXIoaCwgbGZfeF9zdGFydCwgaC0+bWJfeCArIDEpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGgtPmNhYmFjLmJ5dGVzdHJlYW0gPiBoLT5jYWJhYy5ieXRlc3RyZWFtX2VuZCArIDIgKQorICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiYnl0ZXN0cmVhbSBvdmVycmVhZCAlIlBUUkRJRkZfU1BFQ0lGSUVSIlxuIiwgaC0+Y2FiYWMuYnl0ZXN0cmVhbV9lbmQgLSBoLT5jYWJhYy5ieXRlc3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwIHx8IGgtPmNhYmFjLmJ5dGVzdHJlYW0gPiBoLT5jYWJhYy5ieXRlc3RyZWFtX2VuZCArIDQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHdoaWxlIGRlY29kaW5nIE1CICVkICVkLCBieXRlc3RyZWFtICUiUFRSRElGRl9TUEVDSUZJRVIiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBoLT5tYl94LCBoLT5tYl95LAorICAgICAgICAgICAgICAgICAgICAgICBoLT5jYWJhYy5ieXRlc3RyZWFtX2VuZCAtIGgtPmNhYmFjLmJ5dGVzdHJlYW0pOworICAgICAgICAgICAgICAgIGVyX2FkZF9zbGljZShoLCBoLT5yZXN5bmNfbWJfeCwgaC0+cmVzeW5jX21iX3ksIGgtPm1iX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX3ksIEVSX01CX0VSUk9SKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCsraC0+bWJfeCA+PSBoLT5tYl93aWR0aCkgeworICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyKGgsIGxmX3hfc3RhcnQsIGgtPm1iX3gpOworICAgICAgICAgICAgICAgIGgtPm1iX3ggPSBsZl94X3N0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICBkZWNvZGVfZmluaXNoX3JvdyhoKTsKKyAgICAgICAgICAgICAgICArK2gtPm1iX3k7CisgICAgICAgICAgICAgICAgaWYgKEZJRUxEX09SX01CQUZGX1BJQ1RVUkUoaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytoLT5tYl95OworICAgICAgICAgICAgICAgICAgICBpZiAoRlJBTUVfTUJBRkYoaCkgJiYgaC0+bWJfeSA8IGgtPm1iX2hlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RfZmllbGRfZGVjb2RpbmdfZmxhZyhoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlb3MgfHwgaC0+bWJfeSA+PSBoLT5tYl9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICB0cHJpbnRmKGgtPmF2Y3R4LCAic2xpY2UgZW5kICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHNfY291bnQoJmgtPmdiKSwgaC0+Z2Iuc2l6ZV9pbl9iaXRzKTsKKyAgICAgICAgICAgICAgICBlcl9hZGRfc2xpY2UoaCwgaC0+cmVzeW5jX21iX3gsIGgtPnJlc3luY19tYl95LCBoLT5tYl94IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWJfeSwgRVJfTUJfRU5EKTsKKyAgICAgICAgICAgICAgICBpZiAoaC0+bWJfeCA+IGxmX3hfc3RhcnQpCisgICAgICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyKGgsIGxmX3hfc3RhcnQsIGgtPm1iX3gpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaW50IHJldCA9IGZmX2gyNjRfZGVjb2RlX21iX2NhdmxjKGgpOworCisgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgZmZfaDI2NF9obF9kZWNvZGVfbWIoaCk7CisKKyAgICAgICAgICAgIC8vIEZJWE1FIG9wdGltYWw/IG9yIGxldCBtYl9kZWNvZGUgZGVjb2RlIDE2eDMyID8KKyAgICAgICAgICAgIGlmIChyZXQgPj0gMCAmJiBGUkFNRV9NQkFGRihoKSkgeworICAgICAgICAgICAgICAgIGgtPm1iX3krKzsKKyAgICAgICAgICAgICAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9tYl9jYXZsYyhoKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgZmZfaDI2NF9obF9kZWNvZGVfbWIoaCk7CisgICAgICAgICAgICAgICAgaC0+bWJfeS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3Igd2hpbGUgZGVjb2RpbmcgTUIgJWQgJWRcbiIsIGgtPm1iX3gsIGgtPm1iX3kpOworICAgICAgICAgICAgICAgIGVyX2FkZF9zbGljZShoLCBoLT5yZXN5bmNfbWJfeCwgaC0+cmVzeW5jX21iX3ksIGgtPm1iX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX3ksIEVSX01CX0VSUk9SKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKytoLT5tYl94ID49IGgtPm1iX3dpZHRoKSB7CisgICAgICAgICAgICAgICAgbG9vcF9maWx0ZXIoaCwgbGZfeF9zdGFydCwgaC0+bWJfeCk7CisgICAgICAgICAgICAgICAgaC0+bWJfeCA9IGxmX3hfc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIGRlY29kZV9maW5pc2hfcm93KGgpOworICAgICAgICAgICAgICAgICsraC0+bWJfeTsKKyAgICAgICAgICAgICAgICBpZiAoRklFTERfT1JfTUJBRkZfUElDVFVSRShoKSkgeworICAgICAgICAgICAgICAgICAgICArK2gtPm1iX3k7CisgICAgICAgICAgICAgICAgICAgIGlmIChGUkFNRV9NQkFGRihoKSAmJiBoLT5tYl95IDwgaC0+bWJfaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdF9maWVsZF9kZWNvZGluZ19mbGFnKGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaC0+bWJfeSA+PSBoLT5tYl9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHByaW50ZihoLT5hdmN0eCwgInNsaWNlIGVuZCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0c19jb3VudCgmaC0+Z2IpLCBoLT5nYi5zaXplX2luX2JpdHMpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggICBnZXRfYml0c19sZWZ0KCZoLT5nYikgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpID4gMCAmJiAhKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9BR0dSRVNTSVZFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJfYWRkX3NsaWNlKGgsIGgtPnJlc3luY19tYl94LCBoLT5yZXN5bmNfbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5tYl94IC0gMSwgaC0+bWJfeSwgRVJfTUJfRU5EKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcl9hZGRfc2xpY2UoaCwgaC0+cmVzeW5jX21iX3gsIGgtPnJlc3luY19tYl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX3gsIGgtPm1iX3ksIEVSX01CX0VORCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpIDw9IDAgJiYgaC0+bWJfc2tpcF9ydW4gPD0gMCkgeworICAgICAgICAgICAgICAgIHRwcmludGYoaC0+YXZjdHgsICJzbGljZSBlbmQgJWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0c19jb3VudCgmaC0+Z2IpLCBoLT5nYi5zaXplX2luX2JpdHMpOworCisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmgtPmdiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGVyX2FkZF9zbGljZShoLCBoLT5yZXN5bmNfbWJfeCwgaC0+cmVzeW5jX21iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5tYl94IC0gMSwgaC0+bWJfeSwgRVJfTUJfRU5EKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGgtPm1iX3ggPiBsZl94X3N0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9maWx0ZXIoaCwgbGZfeF9zdGFydCwgaC0+bWJfeCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXJfYWRkX3NsaWNlKGgsIGgtPnJlc3luY19tYl94LCBoLT5yZXN5bmNfbWJfeSwgaC0+bWJfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX3ksIEVSX01CX0VSUk9SKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogQ2FsbCBkZWNvZGVfc2xpY2UoKSBmb3IgZWFjaCBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBoIGgyNjQgbWFzdGVyIGNvbnRleHQKKyAqIEBwYXJhbSBjb250ZXh0X2NvdW50IG51bWJlciBvZiBjb250ZXh0cyB0byBleGVjdXRlCisgKi8KK2ludCBmZl9oMjY0X2V4ZWN1dGVfZGVjb2RlX3NsaWNlcyhIMjY0Q29udGV4dCAqaCwgdW5zaWduZWQgY29udGV4dF9jb3VudCkKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqY29uc3QgYXZjdHggPSBoLT5hdmN0eDsKKyAgICBIMjY0Q29udGV4dCAqaHg7CisgICAgaW50IGk7CisKKyAgICBhdl9hc3NlcnQwKGgtPm1iX3kgPCBoLT5tYl9oZWlnaHQpOworCisgICAgaWYgKGgtPmF2Y3R4LT5od2FjY2VsIHx8CisgICAgICAgIGgtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChjb250ZXh0X2NvdW50ID09IDEpIHsKKyAgICAgICAgcmV0dXJuIGRlY29kZV9zbGljZShhdmN0eCwgJmgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2Fzc2VydDAoY29udGV4dF9jb3VudCA+IDApOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgY29udGV4dF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBoeCAgICAgICAgICAgICAgICAgPSBoLT50aHJlYWRfY29udGV4dFtpXTsKKyAgICAgICAgICAgIGlmIChDT05GSUdfRVJST1JfUkVTSUxJRU5DRSkgeworICAgICAgICAgICAgICAgIGh4LT5lci5lcnJvcl9jb3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoeC0+eDI2NF9idWlsZCAgICAgPSBoLT54MjY0X2J1aWxkOworICAgICAgICB9CisKKyAgICAgICAgYXZjdHgtPmV4ZWN1dGUoYXZjdHgsIGRlY29kZV9zbGljZSwgaC0+dGhyZWFkX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGNvbnRleHRfY291bnQsIHNpemVvZih2b2lkICopKTsKKworICAgICAgICAvKiBwdWxsIGJhY2sgc3R1ZmYgZnJvbSBzbGljZXMgdG8gbWFzdGVyIGNvbnRleHQgKi8KKyAgICAgICAgaHggICAgICAgICAgICAgICAgICAgPSBoLT50aHJlYWRfY29udGV4dFtjb250ZXh0X2NvdW50IC0gMV07CisgICAgICAgIGgtPm1iX3ggICAgICAgICAgICAgID0gaHgtPm1iX3g7CisgICAgICAgIGgtPm1iX3kgICAgICAgICAgICAgID0gaHgtPm1iX3k7CisgICAgICAgIGgtPmRyb3BwYWJsZSAgICAgICAgID0gaHgtPmRyb3BwYWJsZTsKKyAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBoeC0+cGljdHVyZV9zdHJ1Y3R1cmU7CisgICAgICAgIGlmIChDT05GSUdfRVJST1JfUkVTSUxJRU5DRSkgeworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGNvbnRleHRfY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICBoLT5lci5lcnJvcl9jb3VudCArPSBoLT50aHJlYWRfY29udGV4dFtpXS0+ZXIuZXJyb3JfY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRhZGRweF90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NGFkZHB4X3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2YjZjMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRhZGRweF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBlbmNvZGVyL2RlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDExIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIERTUCBmdW5jdGlvbnMuCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2luY2x1ZGUgImJpdF9kZXB0aF90ZW1wbGF0ZS5jIgorCitzdGF0aWMgdm9pZCBGVU5DQyhmZl9oMjY0X2FkZF9waXhlbHM0KSh1aW50OF90ICpfZHN0LCBpbnQxNl90ICpfc3JjLCBpbnQgc3RyaWRlKQoreworICAgIGludCBpOworICAgIHBpeGVsICpkc3QgPSAocGl4ZWwgKikgX2RzdDsKKyAgICBkY3Rjb2VmICpzcmMgPSAoZGN0Y29lZiAqKSBfc3JjOworICAgIHN0cmlkZSAvPSBzaXplb2YocGl4ZWwpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBkc3RbMF0gKz0gc3JjWzBdOworICAgICAgICBkc3RbMV0gKz0gc3JjWzFdOworICAgICAgICBkc3RbMl0gKz0gc3JjWzJdOworICAgICAgICBkc3RbM10gKz0gc3JjWzNdOworCisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIHNyYyArPSA0OworICAgIH0KKworICAgIG1lbXNldChfc3JjLCAwLCBzaXplb2YoZGN0Y29lZikgKiAxNik7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKGZmX2gyNjRfYWRkX3BpeGVsczgpKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKl9zcmMsIGludCBzdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCAqKSBfZHN0OworICAgIGRjdGNvZWYgKnNyYyA9IChkY3Rjb2VmICopIF9zcmM7CisgICAgc3RyaWRlIC89IHNpemVvZihwaXhlbCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGRzdFswXSArPSBzcmNbMF07CisgICAgICAgIGRzdFsxXSArPSBzcmNbMV07CisgICAgICAgIGRzdFsyXSArPSBzcmNbMl07CisgICAgICAgIGRzdFszXSArPSBzcmNbM107CisgICAgICAgIGRzdFs0XSArPSBzcmNbNF07CisgICAgICAgIGRzdFs1XSArPSBzcmNbNV07CisgICAgICAgIGRzdFs2XSArPSBzcmNbNl07CisgICAgICAgIGRzdFs3XSArPSBzcmNbN107CisKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgc3JjICs9IDg7CisgICAgfQorCisgICAgbWVtc2V0KF9zcmMsIDAsIHNpemVvZihkY3Rjb2VmKSAqIDY0KTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRjaHJvbWEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRjaHJvbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjNlMTNiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NGNocm9tYS5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiaDI2NGNocm9tYS5oIgorCisjZGVmaW5lIEJJVF9ERVBUSCA4CisjaW5jbHVkZSAiaDI2NGNocm9tYV90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCAxNgorI2luY2x1ZGUgImgyNjRjaHJvbWFfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKworI2RlZmluZSBTRVRfQ0hST01BKGRlcHRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjLT5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IHB1dF9oMjY0X2Nocm9tYV9tYzhfICMjIGRlcHRoICMjIF9jOyBcCisgICAgYy0+cHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWJbMV0gPSBwdXRfaDI2NF9jaHJvbWFfbWM0XyAjIyBkZXB0aCAjIyBfYzsgXAorICAgIGMtPnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzJdID0gcHV0X2gyNjRfY2hyb21hX21jMl8gIyMgZGVwdGggIyMgX2M7IFwKKyAgICBjLT5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlszXSA9IHB1dF9oMjY0X2Nocm9tYV9tYzFfICMjIGRlcHRoICMjIF9jOyBcCisgICAgYy0+YXZnX2gyNjRfY2hyb21hX3BpeGVsc190YWJbMF0gPSBhdmdfaDI2NF9jaHJvbWFfbWM4XyAjIyBkZXB0aCAjIyBfYzsgXAorICAgIGMtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdID0gYXZnX2gyNjRfY2hyb21hX21jNF8gIyMgZGVwdGggIyMgX2M7IFwKKyAgICBjLT5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsyXSA9IGF2Z19oMjY0X2Nocm9tYV9tYzJfICMjIGRlcHRoICMjIF9jOyBcCisgICAgYy0+YXZnX2gyNjRfY2hyb21hX3BpeGVsc190YWJbM10gPSBhdmdfaDI2NF9jaHJvbWFfbWMxXyAjIyBkZXB0aCAjIyBfYzsgXAorCithdl9jb2xkIHZvaWQgZmZfaDI2NGNocm9tYV9pbml0KEgyNjRDaHJvbWFDb250ZXh0ICpjLCBpbnQgYml0X2RlcHRoKQoreworICAgIGlmIChiaXRfZGVwdGggPiA4ICYmIGJpdF9kZXB0aCA8PSAxNikgeworICAgICAgICBTRVRfQ0hST01BKDE2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBTRVRfQ0hST01BKDgpOworICAgIH0KKworICAgIGlmIChBUkNIX0FBUkNINjQpCisgICAgICAgIGZmX2gyNjRjaHJvbWFfaW5pdF9hYXJjaDY0KGMsIGJpdF9kZXB0aCk7CisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl9oMjY0Y2hyb21hX2luaXRfYXJtKGMsIGJpdF9kZXB0aCk7CisgICAgaWYgKEFSQ0hfUFBDKQorICAgICAgICBmZl9oMjY0Y2hyb21hX2luaXRfcHBjKGMsIGJpdF9kZXB0aCk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9oMjY0Y2hyb21hX2luaXRfeDg2KGMsIGJpdF9kZXB0aCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjY0Y2hyb21hLmggYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0Y2hyb21hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiOGEwZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRjaHJvbWEuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19IMjY0Q0hST01BX0gKKyNkZWZpbmUgQVZDT0RFQ19IMjY0Q0hST01BX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHZvaWQgKCpoMjY0X2Nocm9tYV9tY19mdW5jKSh1aW50OF90ICpkc3QvKmFsaWduIDgqLywgdWludDhfdCAqc3JjLyphbGlnbiAxKi8sIGludCBzcmNTdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOworCit0eXBlZGVmIHN0cnVjdCBIMjY0Q2hyb21hQ29udGV4dCB7CisgICAgaDI2NF9jaHJvbWFfbWNfZnVuYyBwdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYls0XTsKKyAgICBoMjY0X2Nocm9tYV9tY19mdW5jIGF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzRdOworfSBIMjY0Q2hyb21hQ29udGV4dDsKKwordm9pZCBmZl9oMjY0Y2hyb21hX2luaXQoSDI2NENocm9tYUNvbnRleHQgKmMsIGludCBiaXRfZGVwdGgpOworCit2b2lkIGZmX2gyNjRjaHJvbWFfaW5pdF9hYXJjaDY0KEgyNjRDaHJvbWFDb250ZXh0ICpjLCBpbnQgYml0X2RlcHRoKTsKK3ZvaWQgZmZfaDI2NGNocm9tYV9pbml0X2FybShIMjY0Q2hyb21hQ29udGV4dCAqYywgaW50IGJpdF9kZXB0aCk7Cit2b2lkIGZmX2gyNjRjaHJvbWFfaW5pdF9wcGMoSDI2NENocm9tYUNvbnRleHQgKmMsIGludCBiaXRfZGVwdGgpOwordm9pZCBmZl9oMjY0Y2hyb21hX2luaXRfeDg2KEgyNjRDaHJvbWFDb250ZXh0ICpjLCBpbnQgYml0X2RlcHRoKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSDI2NENIUk9NQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjY0Y2hyb21hX3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0Y2hyb21hX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyYjVlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRjaHJvbWFfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworI2luY2x1ZGUgImJpdF9kZXB0aF90ZW1wbGF0ZS5jIgorCisjZGVmaW5lIEgyNjRfQ0hST01BX01DKE9QTkFNRSwgT1ApXAorc3RhdGljIHZvaWQgRlVOQ0MoT1BOQU1FICMjIGgyNjRfY2hyb21hX21jMSkodWludDhfdCAqX2RzdC8qYWxpZ24gOCovLCB1aW50OF90ICpfc3JjLyphbGlnbiAxKi8sIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpe1wKKyAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilfZHN0O1wKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjO1wKKyAgICBjb25zdCBpbnQgQT0oOC14KSooOC15KTtcCisgICAgY29uc3QgaW50IEI9KCAgeCkqKDgteSk7XAorICAgIGNvbnN0IGludCBDPSg4LXgpKiggIHkpO1wKKyAgICBjb25zdCBpbnQgRD0oICB4KSooICB5KTtcCisgICAgaW50IGk7XAorICAgIHN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xO1wKKyAgICBcCisgICAgYXZfYXNzZXJ0Mih4PDggJiYgeTw4ICYmIHg+PTAgJiYgeT49MCk7XAorXAorICAgIGlmKEQpe1wKKyAgICAgICAgZm9yKGk9MDsgaTxoOyBpKyspe1wKKyAgICAgICAgICAgIE9QKGRzdFswXSwgKEEqc3JjWzBdICsgQipzcmNbMV0gKyBDKnNyY1tzdHJpZGUrMF0gKyBEKnNyY1tzdHJpZGUrMV0pKTtcCisgICAgICAgICAgICBkc3QrPSBzdHJpZGU7XAorICAgICAgICAgICAgc3JjKz0gc3RyaWRlO1wKKyAgICAgICAgfVwKKyAgICB9IGVsc2UgaWYgKEIgKyBDKSB7XAorICAgICAgICBjb25zdCBpbnQgRT0gQitDO1wKKyAgICAgICAgY29uc3QgaW50IHN0ZXA9IEMgPyBzdHJpZGUgOiAxO1wKKyAgICAgICAgZm9yKGk9MDsgaTxoOyBpKyspe1wKKyAgICAgICAgICAgIE9QKGRzdFswXSwgKEEqc3JjWzBdICsgRSpzcmNbc3RlcCswXSkpO1wKKyAgICAgICAgICAgIGRzdCs9IHN0cmlkZTtcCisgICAgICAgICAgICBzcmMrPSBzdHJpZGU7XAorICAgICAgICB9XAorICAgIH0gZWxzZSB7XAorICAgICAgICBmb3IoaT0wOyBpPGg7IGkrKyl7XAorICAgICAgICAgICAgT1AoZHN0WzBdLCAoQSpzcmNbMF0pKTtcCisgICAgICAgICAgICBkc3QrPSBzdHJpZGU7XAorICAgICAgICAgICAgc3JjKz0gc3RyaWRlO1wKKyAgICAgICAgfVwKKyAgICB9XAorfVwKK3N0YXRpYyB2b2lkIEZVTkNDKE9QTkFNRSAjIyBoMjY0X2Nocm9tYV9tYzIpKHVpbnQ4X3QgKl9kc3QvKmFsaWduIDgqLywgdWludDhfdCAqX3NyYy8qYWxpZ24gMSovLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KXtcCisgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCopX2RzdDtcCisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYztcCisgICAgY29uc3QgaW50IEE9KDgteCkqKDgteSk7XAorICAgIGNvbnN0IGludCBCPSggIHgpKig4LXkpO1wKKyAgICBjb25zdCBpbnQgQz0oOC14KSooICB5KTtcCisgICAgY29uc3QgaW50IEQ9KCAgeCkqKCAgeSk7XAorICAgIGludCBpO1wKKyAgICBzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTtcCisgICAgXAorICAgIGF2X2Fzc2VydDIoeDw4ICYmIHk8OCAmJiB4Pj0wICYmIHk+PTApO1wKK1wKKyAgICBpZihEKXtcCisgICAgICAgIGZvcihpPTA7IGk8aDsgaSsrKXtcCisgICAgICAgICAgICBPUChkc3RbMF0sIChBKnNyY1swXSArIEIqc3JjWzFdICsgQypzcmNbc3RyaWRlKzBdICsgRCpzcmNbc3RyaWRlKzFdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzFdLCAoQSpzcmNbMV0gKyBCKnNyY1syXSArIEMqc3JjW3N0cmlkZSsxXSArIEQqc3JjW3N0cmlkZSsyXSkpO1wKKyAgICAgICAgICAgIGRzdCs9IHN0cmlkZTtcCisgICAgICAgICAgICBzcmMrPSBzdHJpZGU7XAorICAgICAgICB9XAorICAgIH0gZWxzZSBpZiAoQiArIEMpIHtcCisgICAgICAgIGNvbnN0IGludCBFPSBCK0M7XAorICAgICAgICBjb25zdCBpbnQgc3RlcD0gQyA/IHN0cmlkZSA6IDE7XAorICAgICAgICBmb3IoaT0wOyBpPGg7IGkrKyl7XAorICAgICAgICAgICAgT1AoZHN0WzBdLCAoQSpzcmNbMF0gKyBFKnNyY1tzdGVwKzBdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzFdLCAoQSpzcmNbMV0gKyBFKnNyY1tzdGVwKzFdKSk7XAorICAgICAgICAgICAgZHN0Kz0gc3RyaWRlO1wKKyAgICAgICAgICAgIHNyYys9IHN0cmlkZTtcCisgICAgICAgIH1cCisgICAgfSBlbHNlIHtcCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgaDsgaSsrKXtcCisgICAgICAgICAgICBPUChkc3RbMF0sIEEgKiBzcmNbMF0pO1wKKyAgICAgICAgICAgIE9QKGRzdFsxXSwgQSAqIHNyY1sxXSk7XAorICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTtcCisgICAgICAgICAgICBzcmMgKz0gc3RyaWRlO1wKKyAgICAgICAgfVwKKyAgICB9XAorfVwKK1wKK3N0YXRpYyB2b2lkIEZVTkNDKE9QTkFNRSAjIyBoMjY0X2Nocm9tYV9tYzQpKHVpbnQ4X3QgKl9kc3QvKmFsaWduIDgqLywgdWludDhfdCAqX3NyYy8qYWxpZ24gMSovLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KXtcCisgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCopX2RzdDtcCisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYztcCisgICAgY29uc3QgaW50IEE9KDgteCkqKDgteSk7XAorICAgIGNvbnN0IGludCBCPSggIHgpKig4LXkpO1wKKyAgICBjb25zdCBpbnQgQz0oOC14KSooICB5KTtcCisgICAgY29uc3QgaW50IEQ9KCAgeCkqKCAgeSk7XAorICAgIGludCBpO1wKKyAgICBzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTtcCisgICAgXAorICAgIGF2X2Fzc2VydDIoeDw4ICYmIHk8OCAmJiB4Pj0wICYmIHk+PTApO1wKK1wKKyAgICBpZihEKXtcCisgICAgICAgIGZvcihpPTA7IGk8aDsgaSsrKXtcCisgICAgICAgICAgICBPUChkc3RbMF0sIChBKnNyY1swXSArIEIqc3JjWzFdICsgQypzcmNbc3RyaWRlKzBdICsgRCpzcmNbc3RyaWRlKzFdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzFdLCAoQSpzcmNbMV0gKyBCKnNyY1syXSArIEMqc3JjW3N0cmlkZSsxXSArIEQqc3JjW3N0cmlkZSsyXSkpO1wKKyAgICAgICAgICAgIE9QKGRzdFsyXSwgKEEqc3JjWzJdICsgQipzcmNbM10gKyBDKnNyY1tzdHJpZGUrMl0gKyBEKnNyY1tzdHJpZGUrM10pKTtcCisgICAgICAgICAgICBPUChkc3RbM10sIChBKnNyY1szXSArIEIqc3JjWzRdICsgQypzcmNbc3RyaWRlKzNdICsgRCpzcmNbc3RyaWRlKzRdKSk7XAorICAgICAgICAgICAgZHN0Kz0gc3RyaWRlO1wKKyAgICAgICAgICAgIHNyYys9IHN0cmlkZTtcCisgICAgICAgIH1cCisgICAgfSBlbHNlIGlmIChCICsgQykge1wKKyAgICAgICAgY29uc3QgaW50IEU9IEIrQztcCisgICAgICAgIGNvbnN0IGludCBzdGVwPSBDID8gc3RyaWRlIDogMTtcCisgICAgICAgIGZvcihpPTA7IGk8aDsgaSsrKXtcCisgICAgICAgICAgICBPUChkc3RbMF0sIChBKnNyY1swXSArIEUqc3JjW3N0ZXArMF0pKTtcCisgICAgICAgICAgICBPUChkc3RbMV0sIChBKnNyY1sxXSArIEUqc3JjW3N0ZXArMV0pKTtcCisgICAgICAgICAgICBPUChkc3RbMl0sIChBKnNyY1syXSArIEUqc3JjW3N0ZXArMl0pKTtcCisgICAgICAgICAgICBPUChkc3RbM10sIChBKnNyY1szXSArIEUqc3JjW3N0ZXArM10pKTtcCisgICAgICAgICAgICBkc3QrPSBzdHJpZGU7XAorICAgICAgICAgICAgc3JjKz0gc3RyaWRlO1wKKyAgICAgICAgfVwKKyAgICB9IGVsc2Uge1wKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBoOyBpKyspe1wKKyAgICAgICAgICAgIE9QKGRzdFswXSwgQSAqIHNyY1swXSk7XAorICAgICAgICAgICAgT1AoZHN0WzFdLCBBICogc3JjWzFdKTtcCisgICAgICAgICAgICBPUChkc3RbMl0sIEEgKiBzcmNbMl0pO1wKKyAgICAgICAgICAgIE9QKGRzdFszXSwgQSAqIHNyY1szXSk7XAorICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTtcCisgICAgICAgICAgICBzcmMgKz0gc3RyaWRlO1wKKyAgICAgICAgfVwKKyAgICB9XAorfVwKK1wKK3N0YXRpYyB2b2lkIEZVTkNDKE9QTkFNRSAjIyBoMjY0X2Nocm9tYV9tYzgpKHVpbnQ4X3QgKl9kc3QvKmFsaWduIDgqLywgdWludDhfdCAqX3NyYy8qYWxpZ24gMSovLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KXtcCisgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCopX2RzdDtcCisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYztcCisgICAgY29uc3QgaW50IEE9KDgteCkqKDgteSk7XAorICAgIGNvbnN0IGludCBCPSggIHgpKig4LXkpO1wKKyAgICBjb25zdCBpbnQgQz0oOC14KSooICB5KTtcCisgICAgY29uc3QgaW50IEQ9KCAgeCkqKCAgeSk7XAorICAgIGludCBpO1wKKyAgICBzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTtcCisgICAgXAorICAgIGF2X2Fzc2VydDIoeDw4ICYmIHk8OCAmJiB4Pj0wICYmIHk+PTApO1wKK1wKKyAgICBpZihEKXtcCisgICAgICAgIGZvcihpPTA7IGk8aDsgaSsrKXtcCisgICAgICAgICAgICBPUChkc3RbMF0sIChBKnNyY1swXSArIEIqc3JjWzFdICsgQypzcmNbc3RyaWRlKzBdICsgRCpzcmNbc3RyaWRlKzFdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzFdLCAoQSpzcmNbMV0gKyBCKnNyY1syXSArIEMqc3JjW3N0cmlkZSsxXSArIEQqc3JjW3N0cmlkZSsyXSkpO1wKKyAgICAgICAgICAgIE9QKGRzdFsyXSwgKEEqc3JjWzJdICsgQipzcmNbM10gKyBDKnNyY1tzdHJpZGUrMl0gKyBEKnNyY1tzdHJpZGUrM10pKTtcCisgICAgICAgICAgICBPUChkc3RbM10sIChBKnNyY1szXSArIEIqc3JjWzRdICsgQypzcmNbc3RyaWRlKzNdICsgRCpzcmNbc3RyaWRlKzRdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzRdLCAoQSpzcmNbNF0gKyBCKnNyY1s1XSArIEMqc3JjW3N0cmlkZSs0XSArIEQqc3JjW3N0cmlkZSs1XSkpO1wKKyAgICAgICAgICAgIE9QKGRzdFs1XSwgKEEqc3JjWzVdICsgQipzcmNbNl0gKyBDKnNyY1tzdHJpZGUrNV0gKyBEKnNyY1tzdHJpZGUrNl0pKTtcCisgICAgICAgICAgICBPUChkc3RbNl0sIChBKnNyY1s2XSArIEIqc3JjWzddICsgQypzcmNbc3RyaWRlKzZdICsgRCpzcmNbc3RyaWRlKzddKSk7XAorICAgICAgICAgICAgT1AoZHN0WzddLCAoQSpzcmNbN10gKyBCKnNyY1s4XSArIEMqc3JjW3N0cmlkZSs3XSArIEQqc3JjW3N0cmlkZSs4XSkpO1wKKyAgICAgICAgICAgIGRzdCs9IHN0cmlkZTtcCisgICAgICAgICAgICBzcmMrPSBzdHJpZGU7XAorICAgICAgICB9XAorICAgIH0gZWxzZSBpZiAoQiArIEMpIHtcCisgICAgICAgIGNvbnN0IGludCBFPSBCK0M7XAorICAgICAgICBjb25zdCBpbnQgc3RlcD0gQyA/IHN0cmlkZSA6IDE7XAorICAgICAgICBmb3IoaT0wOyBpPGg7IGkrKyl7XAorICAgICAgICAgICAgT1AoZHN0WzBdLCAoQSpzcmNbMF0gKyBFKnNyY1tzdGVwKzBdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzFdLCAoQSpzcmNbMV0gKyBFKnNyY1tzdGVwKzFdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzJdLCAoQSpzcmNbMl0gKyBFKnNyY1tzdGVwKzJdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzNdLCAoQSpzcmNbM10gKyBFKnNyY1tzdGVwKzNdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzRdLCAoQSpzcmNbNF0gKyBFKnNyY1tzdGVwKzRdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzVdLCAoQSpzcmNbNV0gKyBFKnNyY1tzdGVwKzVdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzZdLCAoQSpzcmNbNl0gKyBFKnNyY1tzdGVwKzZdKSk7XAorICAgICAgICAgICAgT1AoZHN0WzddLCAoQSpzcmNbN10gKyBFKnNyY1tzdGVwKzddKSk7XAorICAgICAgICAgICAgZHN0Kz0gc3RyaWRlO1wKKyAgICAgICAgICAgIHNyYys9IHN0cmlkZTtcCisgICAgICAgIH1cCisgICAgfSBlbHNlIHtcCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgaDsgaSsrKXtcCisgICAgICAgICAgICBPUChkc3RbMF0sIEEgKiBzcmNbMF0pO1wKKyAgICAgICAgICAgIE9QKGRzdFsxXSwgQSAqIHNyY1sxXSk7XAorICAgICAgICAgICAgT1AoZHN0WzJdLCBBICogc3JjWzJdKTtcCisgICAgICAgICAgICBPUChkc3RbM10sIEEgKiBzcmNbM10pO1wKKyAgICAgICAgICAgIE9QKGRzdFs0XSwgQSAqIHNyY1s0XSk7XAorICAgICAgICAgICAgT1AoZHN0WzVdLCBBICogc3JjWzVdKTtcCisgICAgICAgICAgICBPUChkc3RbNl0sIEEgKiBzcmNbNl0pO1wKKyAgICAgICAgICAgIE9QKGRzdFs3XSwgQSAqIHNyY1s3XSk7XAorICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTtcCisgICAgICAgICAgICBzcmMgKz0gc3RyaWRlO1wKKyAgICAgICAgfVwKKyAgICB9XAorfQorCisjZGVmaW5lIG9wX2F2ZyhhLCBiKSBhID0gKCgoYSkrKCgoYikgKyAzMik+PjYpKzEpPj4xKQorI2RlZmluZSBvcF9wdXQoYSwgYikgYSA9ICgoKGIpICsgMzIpPj42KQorCitIMjY0X0NIUk9NQV9NQyhwdXRfICAgICAgICwgb3BfcHV0KQorSDI2NF9DSFJPTUFfTUMoYXZnXyAgICAgICAsIG9wX2F2ZykKKyN1bmRlZiBvcF9hdmcKKyN1bmRlZiBvcF9wdXQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0ZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZWEzODUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0ZGF0YS5oCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogSDI2TC9IMjY0L0FWQy9KVlQvMTQ0OTYtMTAvLi4uIGVuY29kZXIvZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEBicmllZgorICogICAgIEgyNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgY29kZWMgZGF0YSB0YWJsZQorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19IMjY0REFUQV9ICisjZGVmaW5lIEFWQ09ERUNfSDI2NERBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmF0aW9uYWwuaCIKKyNpbmNsdWRlICJoMjY0LmgiCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGdvbG9tYl90b19waWN0X3R5cGVbNV0gPSB7CisgICAgQVZfUElDVFVSRV9UWVBFX1AsIEFWX1BJQ1RVUkVfVFlQRV9CLCBBVl9QSUNUVVJFX1RZUEVfSSwKKyAgICBBVl9QSUNUVVJFX1RZUEVfU1AsIEFWX1BJQ1RVUkVfVFlQRV9TSQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ29sb21iX3RvX2ludHJhNHg0X2NicFs0OF0gPSB7CisgICAgNDcsIDMxLCAxNSwgMCwgIDIzLCAyNywgMjksIDMwLCA3LCAgMTEsIDEzLCAxNCwgMzksIDQzLCA0NSwgNDYsCisgICAgMTYsIDMsICA1LCAgMTAsIDEyLCAxOSwgMjEsIDI2LCAyOCwgMzUsIDM3LCA0MiwgNDQsIDEsICAyLCAgNCwKKyAgICA4LCAgMTcsIDE4LCAyMCwgMjQsIDYsICA5LCAgMjIsIDI1LCAzMiwgMzMsIDM0LCAzNiwgNDAsIDM4LCA0MQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ29sb21iX3RvX2ludGVyX2NicFs0OF0gPSB7CisgICAgMCwgIDE2LCAxLCAgMiwgIDQsICA4LCAgMzIsIDMsICA1LCAgMTAsIDEyLCAxNSwgNDcsIDcsICAxMSwgMTMsCisgICAgMTQsIDYsICA5LCAgMzEsIDM1LCAzNywgNDIsIDQ0LCAzMywgMzQsIDM2LCA0MCwgMzksIDQzLCA0NSwgNDYsCisgICAgMTcsIDE4LCAyMCwgMjQsIDE5LCAyMSwgMjYsIDI4LCAyMywgMjcsIDI5LCAzMCwgMjIsIDI1LCAzOCwgNDEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHppZ3phZ19zY2FuWzE2KzFdID0geworICAgIDAgKyAwICogNCwgMSArIDAgKiA0LCAwICsgMSAqIDQsIDAgKyAyICogNCwKKyAgICAxICsgMSAqIDQsIDIgKyAwICogNCwgMyArIDAgKiA0LCAyICsgMSAqIDQsCisgICAgMSArIDIgKiA0LCAwICsgMyAqIDQsIDEgKyAzICogNCwgMiArIDIgKiA0LAorICAgIDMgKyAxICogNCwgMyArIDIgKiA0LCAyICsgMyAqIDQsIDMgKyAzICogNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNocm9tYV9kY19zY2FuWzRdID0geworICAgICgwICsgMCAqIDIpICogMTYsICgxICsgMCAqIDIpICogMTYsCisgICAgKDAgKyAxICogMikgKiAxNiwgKDEgKyAxICogMikgKiAxNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNocm9tYTQyMl9kY19zY2FuWzhdID0geworICAgICgwICsgMCAqIDIpICogMTYsICgwICsgMSAqIDIpICogMTYsCisgICAgKDEgKyAwICogMikgKiAxNiwgKDAgKyAyICogMikgKiAxNiwKKyAgICAoMCArIDMgKiAyKSAqIDE2LCAoMSArIDEgKiAyKSAqIDE2LAorICAgICgxICsgMiAqIDIpICogMTYsICgxICsgMyAqIDIpICogMTYsCit9OworCit0eXBlZGVmIHN0cnVjdCBJTWJJbmZvIHsKKyAgICB1aW50MTZfdCB0eXBlOworICAgIHVpbnQ4X3QgcHJlZF9tb2RlOworICAgIHVpbnQ4X3QgY2JwOworfSBJTWJJbmZvOworCitzdGF0aWMgY29uc3QgSU1iSW5mbyBpX21iX3R5cGVfaW5mb1syNl0gPSB7CisgICAgeyBNQl9UWVBFX0lOVFJBNHg0LCAgLTEsICAtMSB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAyLCAgIDAgfSwKKyAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMSwgICAwIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDAsICAgMCB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAzLCAgIDAgfSwKKyAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMiwgIDE2IH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDEsICAxNiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAwLCAgMTYgfSwKKyAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMywgIDE2IH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDIsICAzMiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAxLCAgMzIgfSwKKyAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMCwgIDMyIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDMsICAzMiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAyLCAgMTUgKyAgMCB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAxLCAgMTUgKyAgMCB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAwLCAgMTUgKyAgMCB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAzLCAgMTUgKyAgMCB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAyLCAgMTUgKyAxNiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAxLCAgMTUgKyAxNiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAwLCAgMTUgKyAxNiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAzLCAgMTUgKyAxNiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAyLCAgMTUgKyAzMiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAxLCAgMTUgKyAzMiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAwLCAgMTUgKyAzMiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAzLCAgMTUgKyAzMiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQV9QQ00sICAtMSwgLTEgfSwKK307CisKK3R5cGVkZWYgc3RydWN0IFBNYkluZm8geworICAgIHVpbnQxNl90IHR5cGU7CisgICAgdWludDhfdCBwYXJ0aXRpb25fY291bnQ7Cit9IFBNYkluZm87CisKK3N0YXRpYyBjb25zdCBQTWJJbmZvIHBfbWJfdHlwZV9pbmZvWzVdID0geworICAgIHsgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfUDBMMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSB9LAorICAgIHsgTUJfVFlQRV8xNng4ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgMiB9LAorICAgIHsgTUJfVFlQRV84eDE2ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgMiB9LAorICAgIHsgTUJfVFlQRV84eDggICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgNCB9LAorICAgIHsgTUJfVFlQRV84eDggICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCB8IE1CX1RZUEVfUkVGMCwgNCB9LAorfTsKKworc3RhdGljIGNvbnN0IFBNYkluZm8gcF9zdWJfbWJfdHlwZV9pbmZvWzRdID0geworICAgIHsgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfUDBMMCwgMSB9LAorICAgIHsgTUJfVFlQRV8xNng4ICB8IE1CX1RZUEVfUDBMMCwgMiB9LAorICAgIHsgTUJfVFlQRV84eDE2ICB8IE1CX1RZUEVfUDBMMCwgMiB9LAorICAgIHsgTUJfVFlQRV84eDggICB8IE1CX1RZUEVfUDBMMCwgNCB9LAorfTsKKworc3RhdGljIGNvbnN0IFBNYkluZm8gYl9tYl90eXBlX2luZm9bMjNdID0geworICAgIHsgTUJfVFlQRV9ESVJFQ1QyIHwgTUJfVFlQRV9MMEwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB9LAorICAgIHsgTUJfVFlQRV8xNngxNiAgIHwgTUJfVFlQRV9QMEwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB9LAorICAgIHsgTUJfVFlQRV8xNngxNiAgIHwgTUJfVFlQRV9QMEwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB9LAorICAgIHsgTUJfVFlQRV8xNngxNiAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB9LAorICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAyLCB9LAorICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAyLCB9LAorICAgIHsgTUJfVFlQRV84eDggICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCA0LCB9LAorfTsKKworc3RhdGljIGNvbnN0IFBNYkluZm8gYl9zdWJfbWJfdHlwZV9pbmZvWzEzXSA9IHsKKyAgICB7IE1CX1RZUEVfRElSRUNUMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIH0sCisgICAgeyBNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV9QMEwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB9LAorICAgIHsgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfUDBMMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgfSwKKyAgICB7IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIH0sCisgICAgeyBNQl9UWVBFXzE2eDggIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV84eDE2ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgfSwKKyAgICB7IE1CX1RZUEVfMTZ4OCAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4MTYgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV8xNng4ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDBMMSB8IE1CX1RZUEVfUDFMMCB8IE1CX1RZUEVfUDFMMSwgMiwgfSwKKyAgICB7IE1CX1RZUEVfOHgxNiAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4OCAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCB9LAorICAgIHsgTUJfVFlQRV84eDggICB8IE1CX1RZUEVfUDBMMSB8IE1CX1RZUEVfUDFMMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgfSwKKyAgICB7IE1CX1RZUEVfOHg4ICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsIDQsIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZSYXRpb25hbCBmZl9oMjY0X3BpeGVsX2FzcGVjdFsxN10gPSB7CisgICAgeyAgIDAsICAxIH0sCisgICAgeyAgIDEsICAxIH0sCisgICAgeyAgMTIsIDExIH0sCisgICAgeyAgMTAsIDExIH0sCisgICAgeyAgMTYsIDExIH0sCisgICAgeyAgNDAsIDMzIH0sCisgICAgeyAgMjQsIDExIH0sCisgICAgeyAgMjAsIDExIH0sCisgICAgeyAgMzIsIDExIH0sCisgICAgeyAgODAsIDMzIH0sCisgICAgeyAgMTgsIDExIH0sCisgICAgeyAgMTUsIDExIH0sCisgICAgeyAgNjQsIDMzIH0sCisgICAgeyAxNjAsIDk5IH0sCisgICAgeyAgIDQsICAzIH0sCisgICAgeyAgIDMsICAyIH0sCisgICAgeyAgIDIsICAxIH0sCit9OworI2VuZGlmIC8qIEFWQ09ERUNfSDI2NERBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NGRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NGRzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2Q2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0ZHNwLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBlbmNvZGVyL2RlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDEwIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIERTUCBmdW5jdGlvbnMuCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJoMjY0ZHNwLmgiCisjaW5jbHVkZSAiaDI2NGlkY3QuaCIKKyNpbmNsdWRlICJzdGFydGNvZGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKyNkZWZpbmUgQklUX0RFUFRIIDgKKyNpbmNsdWRlICJoMjY0ZHNwX3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDkKKyNpbmNsdWRlICJoMjY0ZHNwX3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDEwCisjaW5jbHVkZSAiaDI2NGRzcF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCAxMgorI2luY2x1ZGUgImgyNjRkc3BfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKworI2RlZmluZSBCSVRfREVQVEggMTQKKyNpbmNsdWRlICJoMjY0ZHNwX3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDgKKyNpbmNsdWRlICJoMjY0YWRkcHhfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKworI2RlZmluZSBCSVRfREVQVEggMTYKKyNpbmNsdWRlICJoMjY0YWRkcHhfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKworYXZfY29sZCB2b2lkIGZmX2gyNjRkc3BfaW5pdChIMjY0RFNQQ29udGV4dCAqYywgY29uc3QgaW50IGJpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNocm9tYV9mb3JtYXRfaWRjKQoreworI3VuZGVmIEZVTkMKKyNkZWZpbmUgRlVOQyhhLCBkZXB0aCkgYSAjIyBfICMjIGRlcHRoICMjIF9jCisKKyNkZWZpbmUgQUREUFhfRFNQKGRlcHRoKSBcCisgICAgYy0+aDI2NF9hZGRfcGl4ZWxzNF9jbGVhciA9IEZVTkMoZmZfaDI2NF9hZGRfcGl4ZWxzNCwgZGVwdGgpO1wKKyAgICBjLT5oMjY0X2FkZF9waXhlbHM4X2NsZWFyID0gRlVOQyhmZl9oMjY0X2FkZF9waXhlbHM4LCBkZXB0aCkKKworICAgIGlmIChiaXRfZGVwdGggPiA4ICYmIGJpdF9kZXB0aCA8PSAxNikgeworICAgICAgICBBRERQWF9EU1AoMTYpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFERFBYX0RTUCg4KTsKKyAgICB9CisKKyNkZWZpbmUgSDI2NF9EU1AoZGVwdGgpIFwKKyAgICBjLT5oMjY0X2lkY3RfYWRkPSBGVU5DKGZmX2gyNjRfaWRjdF9hZGQsIGRlcHRoKTtcCisgICAgYy0+aDI2NF9pZGN0OF9hZGQ9IEZVTkMoZmZfaDI2NF9pZGN0OF9hZGQsIGRlcHRoKTtcCisgICAgYy0+aDI2NF9pZGN0X2RjX2FkZD0gRlVOQyhmZl9oMjY0X2lkY3RfZGNfYWRkLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfaWRjdDhfZGNfYWRkPSBGVU5DKGZmX2gyNjRfaWRjdDhfZGNfYWRkLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfaWRjdF9hZGQxNiAgICAgPSBGVU5DKGZmX2gyNjRfaWRjdF9hZGQxNiwgZGVwdGgpO1wKKyAgICBjLT5oMjY0X2lkY3Q4X2FkZDQgICAgID0gRlVOQyhmZl9oMjY0X2lkY3Q4X2FkZDQsIGRlcHRoKTtcCisgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpXAorICAgICAgICBjLT5oMjY0X2lkY3RfYWRkOCAgPSBGVU5DKGZmX2gyNjRfaWRjdF9hZGQ4LCBkZXB0aCk7XAorICAgIGVsc2VcCisgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQ4ICA9IEZVTkMoZmZfaDI2NF9pZGN0X2FkZDhfNDIyLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfaWRjdF9hZGQxNmludHJhPSBGVU5DKGZmX2gyNjRfaWRjdF9hZGQxNmludHJhLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfbHVtYV9kY19kZXF1YW50X2lkY3Q9IEZVTkMoZmZfaDI2NF9sdW1hX2RjX2RlcXVhbnRfaWRjdCwgZGVwdGgpO1wKKyAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSlcCisgICAgICAgIGMtPmgyNjRfY2hyb21hX2RjX2RlcXVhbnRfaWRjdD0gRlVOQyhmZl9oMjY0X2Nocm9tYV9kY19kZXF1YW50X2lkY3QsIGRlcHRoKTtcCisgICAgZWxzZVwKKyAgICAgICAgYy0+aDI2NF9jaHJvbWFfZGNfZGVxdWFudF9pZGN0PSBGVU5DKGZmX2gyNjRfY2hyb21hNDIyX2RjX2RlcXVhbnRfaWRjdCwgZGVwdGgpO1wKK1wKKyAgICBjLT53ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzBdPSBGVU5DKHdlaWdodF9oMjY0X3BpeGVsczE2LCBkZXB0aCk7XAorICAgIGMtPndlaWdodF9oMjY0X3BpeGVsc190YWJbMV09IEZVTkMod2VpZ2h0X2gyNjRfcGl4ZWxzOCwgZGVwdGgpO1wKKyAgICBjLT53ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzJdPSBGVU5DKHdlaWdodF9oMjY0X3BpeGVsczQsIGRlcHRoKTtcCisgICAgYy0+d2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlszXT0gRlVOQyh3ZWlnaHRfaDI2NF9waXhlbHMyLCBkZXB0aCk7XAorICAgIGMtPmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlswXT0gRlVOQyhiaXdlaWdodF9oMjY0X3BpeGVsczE2LCBkZXB0aCk7XAorICAgIGMtPmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlsxXT0gRlVOQyhiaXdlaWdodF9oMjY0X3BpeGVsczgsIGRlcHRoKTtcCisgICAgYy0+Yml3ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzJdPSBGVU5DKGJpd2VpZ2h0X2gyNjRfcGl4ZWxzNCwgZGVwdGgpO1wKKyAgICBjLT5iaXdlaWdodF9oMjY0X3BpeGVsc190YWJbM109IEZVTkMoYml3ZWlnaHRfaDI2NF9waXhlbHMyLCBkZXB0aCk7XAorXAorICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hPSBGVU5DKGgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hPSBGVU5DKGgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX21iYWZmPSBGVU5DKGgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX21iYWZmLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hX2ludHJhPSBGVU5DKGgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hX2ludHJhLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX2ludHJhPSBGVU5DKGgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX2ludHJhLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX21iYWZmX2ludHJhPSBGVU5DKGgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX21iYWZmX2ludHJhLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWE9IEZVTkMoaDI2NF92X2xvb3BfZmlsdGVyX2Nocm9tYSwgZGVwdGgpO1wKKyAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSlcCisgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWE9IEZVTkMoaDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYSwgZGVwdGgpO1wKKyAgICBlbHNlXAorICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hPSBGVU5DKGgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWE0MjIsIGRlcHRoKTtcCisgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpXAorICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hX21iYWZmPSBGVU5DKGgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfbWJhZmYsIGRlcHRoKTtcCisgICAgZWxzZVwKKyAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYV9tYmFmZj0gRlVOQyhoMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hNDIyX21iYWZmLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmE9IEZVTkMoaDI2NF92X2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSwgZGVwdGgpO1wKKyAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSlcCisgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmE9IEZVTkMoaDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSwgZGVwdGgpO1wKKyAgICBlbHNlXAorICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hX2ludHJhPSBGVU5DKGgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWE0MjJfaW50cmEsIGRlcHRoKTtcCisgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpXAorICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hX21iYWZmX2ludHJhPSBGVU5DKGgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfbWJhZmZfaW50cmEsIGRlcHRoKTtcCisgICAgZWxzZVwKKyAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYV9tYmFmZl9pbnRyYT0gRlVOQyhoMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hNDIyX21iYWZmX2ludHJhLCBkZXB0aCk7XAorICAgIGMtPmgyNjRfbG9vcF9maWx0ZXJfc3RyZW5ndGg9IE5VTEw7CisKKyAgICBzd2l0Y2ggKGJpdF9kZXB0aCkgeworICAgIGNhc2UgOToKKyAgICAgICAgSDI2NF9EU1AoOSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICAgIEgyNjRfRFNQKDEwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICAgICAgSDI2NF9EU1AoMTIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE0OgorICAgICAgICBIMjY0X0RTUCgxNCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoYml0X2RlcHRoPD04KTsKKyAgICAgICAgSDI2NF9EU1AoOCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjLT5zdGFydGNvZGVfZmluZF9jYW5kaWRhdGUgPSBmZl9zdGFydGNvZGVfZmluZF9jYW5kaWRhdGVfYzsKKworICAgIGlmIChBUkNIX0FBUkNINjQpIGZmX2gyNjRkc3BfaW5pdF9hYXJjaDY0KGMsIGJpdF9kZXB0aCwgY2hyb21hX2Zvcm1hdF9pZGMpOworICAgIGlmIChBUkNIX0FSTSkgZmZfaDI2NGRzcF9pbml0X2FybShjLCBiaXRfZGVwdGgsIGNocm9tYV9mb3JtYXRfaWRjKTsKKyAgICBpZiAoQVJDSF9QUEMpIGZmX2gyNjRkc3BfaW5pdF9wcGMoYywgYml0X2RlcHRoLCBjaHJvbWFfZm9ybWF0X2lkYyk7CisgICAgaWYgKEFSQ0hfWDg2KSBmZl9oMjY0ZHNwX2luaXRfeDg2KGMsIGJpdF9kZXB0aCwgY2hyb21hX2Zvcm1hdF9pZGMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NGRzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NGRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZWE0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0ZHNwLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2NCBEU1AgZnVuY3Rpb25zLgorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19IMjY0RFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19IMjY0RFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHZvaWQgKCpoMjY0X3dlaWdodF9mdW5jKSh1aW50OF90ICpibG9jaywgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0LCBpbnQgb2Zmc2V0KTsKK3R5cGVkZWYgdm9pZCAoKmgyNjRfYml3ZWlnaHRfZnVuYykodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoZWlnaHQsIGludCBsb2cyX2Rlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0ZCwgaW50IHdlaWdodHMsIGludCBvZmZzZXQpOworCisvKioKKyAqIENvbnRleHQgZm9yIHN0b3JpbmcgSC4yNjQgRFNQIGZ1bmN0aW9ucworICovCit0eXBlZGVmIHN0cnVjdCBIMjY0RFNQQ29udGV4dCB7CisgICAgLyogd2VpZ2h0ZWQgTUMgKi8KKyAgICBoMjY0X3dlaWdodF9mdW5jIHdlaWdodF9oMjY0X3BpeGVsc190YWJbNF07CisgICAgaDI2NF9iaXdlaWdodF9mdW5jIGJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYls0XTsKKworICAgIC8qIGxvb3AgZmlsdGVyICovCisgICAgdm9pZCAoKmgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hKSh1aW50OF90ICpwaXggLyphbGlnbiAxNiovLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhLCBpbnQgYmV0YSwgaW50OF90ICp0YzApOworICAgIHZvaWQgKCpoMjY0X2hfbG9vcF9maWx0ZXJfbHVtYSkodWludDhfdCAqcGl4IC8qYWxpZ24gNCAqLywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgaW50IGJldGEsIGludDhfdCAqdGMwKTsKKyAgICB2b2lkICgqaDI2NF9oX2xvb3BfZmlsdGVyX2x1bWFfbWJhZmYpKHVpbnQ4X3QgKnBpeCAvKmFsaWduIDE2Ki8sIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQ4X3QgKnRjMCk7CisgICAgLyogdi9oX2xvb3BfZmlsdGVyX2x1bWFfaW50cmE6IGFsaWduIDE2ICovCisgICAgdm9pZCAoKmgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hX2ludHJhKSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsIGludCBiZXRhKTsKKyAgICB2b2lkICgqaDI2NF9oX2xvb3BfZmlsdGVyX2x1bWFfaW50cmEpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgaW50IGJldGEpOworICAgIHZvaWQgKCpoMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9tYmFmZl9pbnRyYSkodWludDhfdCAqcGl4IC8qYWxpZ24gMTYqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEpOworICAgIHZvaWQgKCpoMjY0X3ZfbG9vcF9maWx0ZXJfY2hyb21hKSh1aW50OF90ICpwaXggLyphbGlnbiA4Ki8sIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgaW50IGJldGEsIGludDhfdCAqdGMwKTsKKyAgICB2b2lkICgqaDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYSkodWludDhfdCAqcGl4IC8qYWxpZ24gNCovLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQ4X3QgKnRjMCk7CisgICAgdm9pZCAoKmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfbWJhZmYpKHVpbnQ4X3QgKnBpeCAvKmFsaWduIDgqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICp0YzApOworICAgIHZvaWQgKCpoMjY0X3ZfbG9vcF9maWx0ZXJfY2hyb21hX2ludHJhKSh1aW50OF90ICpwaXggLyphbGlnbiA4Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEpOworICAgIHZvaWQgKCpoMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hX2ludHJhKSh1aW50OF90ICpwaXggLyphbGlnbiA4Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEpOworICAgIHZvaWQgKCpoMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hX21iYWZmX2ludHJhKSh1aW50OF90ICpwaXggLyphbGlnbiA4Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEpOworICAgIC8vIGgyNjRfbG9vcF9maWx0ZXJfc3RyZW5ndGg6IHNpbWQgb25seS4gdGhlIEMgdmVyc2lvbiBpcyBpbmxpbmVkIGluIGgyNjQuYworICAgIHZvaWQgKCpoMjY0X2xvb3BfZmlsdGVyX3N0cmVuZ3RoKShpbnQxNl90IGJTWzJdWzRdWzRdLCB1aW50OF90IG5uels0MF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCByZWZbMl1bNDBdLCBpbnQxNl90IG12WzJdWzQwXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlyLCBpbnQgZWRnZXMsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19tdjAsIGludCBtYXNrX212MSwgaW50IGZpZWxkKTsKKworICAgIC8qIElEQ1QgKi8KKyAgICB2b2lkICgqaDI2NF9pZGN0X2FkZCkodWludDhfdCAqZHN0IC8qYWxpZ24gNCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jayAvKmFsaWduIDE2Ki8sIGludCBzdHJpZGUpOworICAgIHZvaWQgKCpoMjY0X2lkY3Q4X2FkZCkodWludDhfdCAqZHN0IC8qYWxpZ24gOCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2sgLyphbGlnbiAxNiovLCBpbnQgc3RyaWRlKTsKKyAgICB2b2lkICgqaDI2NF9pZGN0X2RjX2FkZCkodWludDhfdCAqZHN0IC8qYWxpZ24gNCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jayAvKmFsaWduIDE2Ki8sIGludCBzdHJpZGUpOworICAgIHZvaWQgKCpoMjY0X2lkY3Q4X2RjX2FkZCkodWludDhfdCAqZHN0IC8qYWxpZ24gOCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2sgLyphbGlnbiAxNiovLCBpbnQgc3RyaWRlKTsKKworICAgIHZvaWQgKCpoMjY0X2lkY3RfYWRkMTYpKHVpbnQ4X3QgKmRzdCAvKmFsaWduIDE2Ki8sIGNvbnN0IGludCAqYmxvY2tvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2sgLyphbGlnbiAxNiovLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1sxNSAqIDhdKTsKKyAgICB2b2lkICgqaDI2NF9pZGN0OF9hZGQ0KSh1aW50OF90ICpkc3QgLyphbGlnbiAxNiovLCBjb25zdCBpbnQgKmJsb2Nrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrIC8qYWxpZ24gMTYqLywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5uemNbMTUgKiA4XSk7CisgICAgdm9pZCAoKmgyNjRfaWRjdF9hZGQ4KSh1aW50OF90ICoqZHN0IC8qYWxpZ24gMTYqLywgY29uc3QgaW50ICpibG9ja29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrIC8qYWxpZ24gMTYqLywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1sxNSAqIDhdKTsKKyAgICB2b2lkICgqaDI2NF9pZGN0X2FkZDE2aW50cmEpKHVpbnQ4X3QgKmRzdCAvKmFsaWduIDE2Ki8sIGNvbnN0IGludCAqYmxvY2tvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jayAvKmFsaWduIDE2Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBjb25zdCB1aW50OF90IG5uemNbMTUgKiA4XSk7CisgICAgdm9pZCAoKmgyNjRfbHVtYV9kY19kZXF1YW50X2lkY3QpKGludDE2X3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqaW5wdXQgLyphbGlnbiAxNiovLCBpbnQgcW11bCk7CisgICAgdm9pZCAoKmgyNjRfY2hyb21hX2RjX2RlcXVhbnRfaWRjdCkoaW50MTZfdCAqYmxvY2ssIGludCBxbXVsKTsKKworICAgIC8qIGJ5cGFzcy10cmFuc2Zvcm0gKi8KKyAgICB2b2lkICgqaDI2NF9hZGRfcGl4ZWxzOF9jbGVhcikodWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSk7CisgICAgdm9pZCAoKmgyNjRfYWRkX3BpeGVsczRfY2xlYXIpKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpOworCisgICAgLyoqCisgICAgICogU2VhcmNoIGJ1ZiBmcm9tIHRoZSBzdGFydCBmb3IgdXAgdG8gc2l6ZSBieXRlcy4gUmV0dXJuIHRoZSBpbmRleAorICAgICAqIG9mIGEgemVybyBieXRlLCBvciA+PSBzaXplIGlmIG5vdCBmb3VuZC4gSWRlYWxseSwgdXNlIGxvb2thaGVhZAorICAgICAqIHRvIGZpbHRlciBvdXQgYW55IHplcm8gYnl0ZXMgdGhhdCBhcmUga25vd24gdG8gbm90IGJlIGZvbGxvd2VkIGJ5CisgICAgICogb25lIG9yIG1vcmUgZnVydGhlciB6ZXJvIGJ5dGVzIGFuZCBhIG9uZSBieXRlLiBCZXR0ZXIgc3RpbGwsIGZpbHRlcgorICAgICAqIG91dCBhbnkgYnl0ZXMgdGhhdCBmb3JtIHRoZSB0cmFpbGluZ196ZXJvXzhiaXRzIHN5bnRheCBlbGVtZW50IHRvby4KKyAgICAgKi8KKyAgICBpbnQgKCpzdGFydGNvZGVfZmluZF9jYW5kaWRhdGUpKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpOworfSBIMjY0RFNQQ29udGV4dDsKKwordm9pZCBmZl9oMjY0ZHNwX2luaXQoSDI2NERTUENvbnRleHQgKmMsIGNvbnN0IGludCBiaXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hyb21hX2Zvcm1hdF9pZGMpOwordm9pZCBmZl9oMjY0ZHNwX2luaXRfYWFyY2g2NChIMjY0RFNQQ29udGV4dCAqYywgY29uc3QgaW50IGJpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNocm9tYV9mb3JtYXRfaWRjKTsKK3ZvaWQgZmZfaDI2NGRzcF9pbml0X2FybShIMjY0RFNQQ29udGV4dCAqYywgY29uc3QgaW50IGJpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hyb21hX2Zvcm1hdF9pZGMpOwordm9pZCBmZl9oMjY0ZHNwX2luaXRfcHBjKEgyNjREU1BDb250ZXh0ICpjLCBjb25zdCBpbnQgYml0X2RlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaHJvbWFfZm9ybWF0X2lkYyk7Cit2b2lkIGZmX2gyNjRkc3BfaW5pdF94ODYoSDI2NERTUENvbnRleHQgKmMsIGNvbnN0IGludCBiaXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNocm9tYV9mb3JtYXRfaWRjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSDI2NERTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjY0ZHNwX3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0ZHNwX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ1ZmFmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRkc3BfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIEguMjZML0guMjY0L0FWQy9KVlQvMTQ0OTYtMTAvLi4uIGVuY29kZXIvZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTEgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgRFNQIGZ1bmN0aW9ucy4KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaW5jbHVkZSAiYml0X2RlcHRoX3RlbXBsYXRlLmMiCisKKyNkZWZpbmUgb3Bfc2NhbGUxKHgpICBibG9ja1t4XSA9IGF2X2NsaXBfcGl4ZWwoIChibG9ja1t4XSp3ZWlnaHQgKyBvZmZzZXQpID4+IGxvZzJfZGVub20gKQorI2RlZmluZSBvcF9zY2FsZTIoeCkgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoIChzcmNbeF0qd2VpZ2h0cyArIGRzdFt4XSp3ZWlnaHRkICsgb2Zmc2V0KSA+PiAobG9nMl9kZW5vbSsxKSkKKyNkZWZpbmUgSDI2NF9XRUlHSFQoVykgXAorc3RhdGljIHZvaWQgRlVOQ0Mod2VpZ2h0X2gyNjRfcGl4ZWxzICMjIFcpKHVpbnQ4X3QgKl9ibG9jaywgaW50IHN0cmlkZSwgaW50IGhlaWdodCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0LCBpbnQgb2Zmc2V0KSBcCit7IFwKKyAgICBpbnQgeTsgXAorICAgIHBpeGVsICpibG9jayA9IChwaXhlbCopX2Jsb2NrOyBcCisgICAgc3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7IFwKKyAgICBvZmZzZXQgPDw9IChsb2cyX2Rlbm9tICsgKEJJVF9ERVBUSC04KSk7IFwKKyAgICBpZihsb2cyX2Rlbm9tKSBvZmZzZXQgKz0gMTw8KGxvZzJfZGVub20tMSk7IFwKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyssIGJsb2NrICs9IHN0cmlkZSkgeyBcCisgICAgICAgIG9wX3NjYWxlMSgwKTsgXAorICAgICAgICBvcF9zY2FsZTEoMSk7IFwKKyAgICAgICAgaWYoVz09MikgY29udGludWU7IFwKKyAgICAgICAgb3Bfc2NhbGUxKDIpOyBcCisgICAgICAgIG9wX3NjYWxlMSgzKTsgXAorICAgICAgICBpZihXPT00KSBjb250aW51ZTsgXAorICAgICAgICBvcF9zY2FsZTEoNCk7IFwKKyAgICAgICAgb3Bfc2NhbGUxKDUpOyBcCisgICAgICAgIG9wX3NjYWxlMSg2KTsgXAorICAgICAgICBvcF9zY2FsZTEoNyk7IFwKKyAgICAgICAgaWYoVz09OCkgY29udGludWU7IFwKKyAgICAgICAgb3Bfc2NhbGUxKDgpOyBcCisgICAgICAgIG9wX3NjYWxlMSg5KTsgXAorICAgICAgICBvcF9zY2FsZTEoMTApOyBcCisgICAgICAgIG9wX3NjYWxlMSgxMSk7IFwKKyAgICAgICAgb3Bfc2NhbGUxKDEyKTsgXAorICAgICAgICBvcF9zY2FsZTEoMTMpOyBcCisgICAgICAgIG9wX3NjYWxlMSgxNCk7IFwKKyAgICAgICAgb3Bfc2NhbGUxKDE1KTsgXAorICAgIH0gXAorfSBcCitzdGF0aWMgdm9pZCBGVU5DQyhiaXdlaWdodF9oMjY0X3BpeGVscyAjIyBXKSh1aW50OF90ICpfZHN0LCB1aW50OF90ICpfc3JjLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodGQsIGludCB3ZWlnaHRzLCBpbnQgb2Zmc2V0KSBcCit7IFwKKyAgICBpbnQgeTsgXAorICAgIHBpeGVsICpkc3QgPSAocGl4ZWwqKV9kc3Q7IFwKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOyBcCisgICAgc3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7IFwKKyAgICBvZmZzZXQgPDw9IChCSVRfREVQVEgtOCk7IFwKKyAgICBvZmZzZXQgPSAoKG9mZnNldCArIDEpIHwgMSkgPDwgbG9nMl9kZW5vbTsgXAorICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKywgZHN0ICs9IHN0cmlkZSwgc3JjICs9IHN0cmlkZSkgeyBcCisgICAgICAgIG9wX3NjYWxlMigwKTsgXAorICAgICAgICBvcF9zY2FsZTIoMSk7IFwKKyAgICAgICAgaWYoVz09MikgY29udGludWU7IFwKKyAgICAgICAgb3Bfc2NhbGUyKDIpOyBcCisgICAgICAgIG9wX3NjYWxlMigzKTsgXAorICAgICAgICBpZihXPT00KSBjb250aW51ZTsgXAorICAgICAgICBvcF9zY2FsZTIoNCk7IFwKKyAgICAgICAgb3Bfc2NhbGUyKDUpOyBcCisgICAgICAgIG9wX3NjYWxlMig2KTsgXAorICAgICAgICBvcF9zY2FsZTIoNyk7IFwKKyAgICAgICAgaWYoVz09OCkgY29udGludWU7IFwKKyAgICAgICAgb3Bfc2NhbGUyKDgpOyBcCisgICAgICAgIG9wX3NjYWxlMig5KTsgXAorICAgICAgICBvcF9zY2FsZTIoMTApOyBcCisgICAgICAgIG9wX3NjYWxlMigxMSk7IFwKKyAgICAgICAgb3Bfc2NhbGUyKDEyKTsgXAorICAgICAgICBvcF9zY2FsZTIoMTMpOyBcCisgICAgICAgIG9wX3NjYWxlMigxNCk7IFwKKyAgICAgICAgb3Bfc2NhbGUyKDE1KTsgXAorICAgIH0gXAorfQorCitIMjY0X1dFSUdIVCgxNikKK0gyNjRfV0VJR0hUKDgpCitIMjY0X1dFSUdIVCg0KQorSDI2NF9XRUlHSFQoMikKKworI3VuZGVmIG9wX3NjYWxlMQorI3VuZGVmIG9wX3NjYWxlMgorI3VuZGVmIEgyNjRfV0VJR0hUCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2ZsYXR0ZW4gdm9pZCBGVU5DQyhoMjY0X2xvb3BfZmlsdGVyX2x1bWEpKHVpbnQ4X3QgKnBfcGl4LCBpbnQgeHN0cmlkZSwgaW50IHlzdHJpZGUsIGludCBpbm5lcl9pdGVycywgaW50IGFscGhhLCBpbnQgYmV0YSwgaW50OF90ICp0YzApCit7CisgICAgcGl4ZWwgKnBpeCA9IChwaXhlbCopcF9waXg7CisgICAgaW50IGksIGQ7CisgICAgeHN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xOworICAgIHlzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTsKKyAgICBhbHBoYSA8PD0gQklUX0RFUFRIIC0gODsKKyAgICBiZXRhICA8PD0gQklUX0RFUFRIIC0gODsKKyAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkgeworICAgICAgICBjb25zdCBpbnQgdGNfb3JpZyA9IHRjMFtpXSA8PCAoQklUX0RFUFRIIC0gOCk7CisgICAgICAgIGlmKCB0Y19vcmlnIDwgMCApIHsKKyAgICAgICAgICAgIHBpeCArPSBpbm5lcl9pdGVycyp5c3RyaWRlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yKCBkID0gMDsgZCA8IGlubmVyX2l0ZXJzOyBkKysgKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgcDAgPSBwaXhbLTEqeHN0cmlkZV07CisgICAgICAgICAgICBjb25zdCBpbnQgcDEgPSBwaXhbLTIqeHN0cmlkZV07CisgICAgICAgICAgICBjb25zdCBpbnQgcDIgPSBwaXhbLTMqeHN0cmlkZV07CisgICAgICAgICAgICBjb25zdCBpbnQgcTAgPSBwaXhbMF07CisgICAgICAgICAgICBjb25zdCBpbnQgcTEgPSBwaXhbMSp4c3RyaWRlXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBxMiA9IHBpeFsyKnhzdHJpZGVdOworCisgICAgICAgICAgICBpZiggRkZBQlMoIHAwIC0gcTAgKSA8IGFscGhhICYmCisgICAgICAgICAgICAgICAgRkZBQlMoIHAxIC0gcDAgKSA8IGJldGEgJiYKKyAgICAgICAgICAgICAgICBGRkFCUyggcTEgLSBxMCApIDwgYmV0YSApIHsKKworICAgICAgICAgICAgICAgIGludCB0YyA9IHRjX29yaWc7CisgICAgICAgICAgICAgICAgaW50IGlfZGVsdGE7CisKKyAgICAgICAgICAgICAgICBpZiggRkZBQlMoIHAyIC0gcDAgKSA8IGJldGEgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKHRjX29yaWcpCisgICAgICAgICAgICAgICAgICAgIHBpeFstMip4c3RyaWRlXSA9IHAxICsgYXZfY2xpcCggKCggcDIgKyAoICggcDAgKyBxMCArIDEgKSA+PiAxICkgKSA+PiAxKSAtIHAxLCAtdGNfb3JpZywgdGNfb3JpZyApOworICAgICAgICAgICAgICAgICAgICB0YysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggRkZBQlMoIHEyIC0gcTAgKSA8IGJldGEgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKHRjX29yaWcpCisgICAgICAgICAgICAgICAgICAgIHBpeFsgICB4c3RyaWRlXSA9IHExICsgYXZfY2xpcCggKCggcTIgKyAoICggcDAgKyBxMCArIDEgKSA+PiAxICkgKSA+PiAxKSAtIHExLCAtdGNfb3JpZywgdGNfb3JpZyApOworICAgICAgICAgICAgICAgICAgICB0YysrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlfZGVsdGEgPSBhdl9jbGlwKCAoKChxMCAtIHAwICkgPDwgMikgKyAocDEgLSBxMSkgKyA0KSA+PiAzLCAtdGMsIHRjICk7CisgICAgICAgICAgICAgICAgcGl4Wy14c3RyaWRlXSA9IGF2X2NsaXBfcGl4ZWwoIHAwICsgaV9kZWx0YSApOyAgICAvKiBwMCcgKi8KKyAgICAgICAgICAgICAgICBwaXhbMF0gICAgICAgID0gYXZfY2xpcF9waXhlbCggcTAgLSBpX2RlbHRhICk7ICAgIC8qIHEwJyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGl4ICs9IHlzdHJpZGU7CisgICAgICAgIH0KKyAgICB9Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhoMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYSkodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQ4X3QgKnRjMCkKK3sKKyAgICBGVU5DQyhoMjY0X2xvb3BfZmlsdGVyX2x1bWEpKHBpeCwgc3RyaWRlLCBzaXplb2YocGl4ZWwpLCA0LCBhbHBoYSwgYmV0YSwgdGMwKTsKK30KK3N0YXRpYyB2b2lkIEZVTkNDKGgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hKSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludDhfdCAqdGMwKQoreworICAgIEZVTkNDKGgyNjRfbG9vcF9maWx0ZXJfbHVtYSkocGl4LCBzaXplb2YocGl4ZWwpLCBzdHJpZGUsIDQsIGFscGhhLCBiZXRhLCB0YzApOworfQorc3RhdGljIHZvaWQgRlVOQ0MoaDI2NF9oX2xvb3BfZmlsdGVyX2x1bWFfbWJhZmYpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwgaW50OF90ICp0YzApCit7CisgICAgRlVOQ0MoaDI2NF9sb29wX2ZpbHRlcl9sdW1hKShwaXgsIHNpemVvZihwaXhlbCksIHN0cmlkZSwgMiwgYWxwaGEsIGJldGEsIHRjMCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2ZsYXR0ZW4gdm9pZCBGVU5DQyhoMjY0X2xvb3BfZmlsdGVyX2x1bWFfaW50cmEpKHVpbnQ4X3QgKnBfcGl4LCBpbnQgeHN0cmlkZSwgaW50IHlzdHJpZGUsIGludCBpbm5lcl9pdGVycywgaW50IGFscGhhLCBpbnQgYmV0YSkKK3sKKyAgICBwaXhlbCAqcGl4ID0gKHBpeGVsKilwX3BpeDsKKyAgICBpbnQgZDsKKyAgICB4c3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7CisgICAgeXN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xOworICAgIGFscGhhIDw8PSBCSVRfREVQVEggLSA4OworICAgIGJldGEgIDw8PSBCSVRfREVQVEggLSA4OworICAgIGZvciggZCA9IDA7IGQgPCA0ICogaW5uZXJfaXRlcnM7IGQrKyApIHsKKyAgICAgICAgY29uc3QgaW50IHAyID0gcGl4Wy0zKnhzdHJpZGVdOworICAgICAgICBjb25zdCBpbnQgcDEgPSBwaXhbLTIqeHN0cmlkZV07CisgICAgICAgIGNvbnN0IGludCBwMCA9IHBpeFstMSp4c3RyaWRlXTsKKworICAgICAgICBjb25zdCBpbnQgcTAgPSBwaXhbIDAqeHN0cmlkZV07CisgICAgICAgIGNvbnN0IGludCBxMSA9IHBpeFsgMSp4c3RyaWRlXTsKKyAgICAgICAgY29uc3QgaW50IHEyID0gcGl4WyAyKnhzdHJpZGVdOworCisgICAgICAgIGlmKCBGRkFCUyggcDAgLSBxMCApIDwgYWxwaGEgJiYKKyAgICAgICAgICAgIEZGQUJTKCBwMSAtIHAwICkgPCBiZXRhICYmCisgICAgICAgICAgICBGRkFCUyggcTEgLSBxMCApIDwgYmV0YSApIHsKKworICAgICAgICAgICAgaWYoRkZBQlMoIHAwIC0gcTAgKSA8ICgoIGFscGhhID4+IDIgKSArIDIgKSl7CisgICAgICAgICAgICAgICAgaWYoIEZGQUJTKCBwMiAtIHAwICkgPCBiZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHAzID0gcGl4Wy00KnhzdHJpZGVdOworICAgICAgICAgICAgICAgICAgICAvKiBwMCcsIHAxJywgcDInICovCisgICAgICAgICAgICAgICAgICAgIHBpeFstMSp4c3RyaWRlXSA9ICggcDIgKyAyKnAxICsgMipwMCArIDIqcTAgKyBxMSArIDQgKSA+PiAzOworICAgICAgICAgICAgICAgICAgICBwaXhbLTIqeHN0cmlkZV0gPSAoIHAyICsgcDEgKyBwMCArIHEwICsgMiApID4+IDI7CisgICAgICAgICAgICAgICAgICAgIHBpeFstMyp4c3RyaWRlXSA9ICggMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0ICkgPj4gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBwMCcgKi8KKyAgICAgICAgICAgICAgICAgICAgcGl4Wy0xKnhzdHJpZGVdID0gKCAyKnAxICsgcDAgKyBxMSArIDIgKSA+PiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggRkZBQlMoIHEyIC0gcTAgKSA8IGJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcTMgPSBwaXhbMyp4c3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgLyogcTAnLCBxMScsIHEyJyAqLworICAgICAgICAgICAgICAgICAgICBwaXhbMCp4c3RyaWRlXSA9ICggcDEgKyAyKnAwICsgMipxMCArIDIqcTEgKyBxMiArIDQgKSA+PiAzOworICAgICAgICAgICAgICAgICAgICBwaXhbMSp4c3RyaWRlXSA9ICggcDAgKyBxMCArIHExICsgcTIgKyAyICkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgcGl4WzIqeHN0cmlkZV0gPSAoIDIqcTMgKyAzKnEyICsgcTEgKyBxMCArIHAwICsgNCApID4+IDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcTAnICovCisgICAgICAgICAgICAgICAgICAgIHBpeFswKnhzdHJpZGVdID0gKCAyKnExICsgcTAgKyBwMSArIDIgKSA+PiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIC8qIHAwJywgcTAnICovCisgICAgICAgICAgICAgICAgcGl4Wy0xKnhzdHJpZGVdID0gKCAyKnAxICsgcDAgKyBxMSArIDIgKSA+PiAyOworICAgICAgICAgICAgICAgIHBpeFsgMCp4c3RyaWRlXSA9ICggMipxMSArIHEwICsgcDEgKyAyICkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwaXggKz0geXN0cmlkZTsKKyAgICB9Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhoMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYV9pbnRyYSkodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhKQoreworICAgIEZVTkNDKGgyNjRfbG9vcF9maWx0ZXJfbHVtYV9pbnRyYSkocGl4LCBzdHJpZGUsIHNpemVvZihwaXhlbCksIDQsIGFscGhhLCBiZXRhKTsKK30KK3N0YXRpYyB2b2lkIEZVTkNDKGgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX2ludHJhKSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEpCit7CisgICAgRlVOQ0MoaDI2NF9sb29wX2ZpbHRlcl9sdW1hX2ludHJhKShwaXgsIHNpemVvZihwaXhlbCksIHN0cmlkZSwgNCwgYWxwaGEsIGJldGEpOworfQorc3RhdGljIHZvaWQgRlVOQ0MoaDI2NF9oX2xvb3BfZmlsdGVyX2x1bWFfbWJhZmZfaW50cmEpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSkKK3sKKyAgICBGVU5DQyhoMjY0X2xvb3BfZmlsdGVyX2x1bWFfaW50cmEpKHBpeCwgc2l6ZW9mKHBpeGVsKSwgc3RyaWRlLCAyLCBhbHBoYSwgYmV0YSk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2ZsYXR0ZW4gdm9pZCBGVU5DQyhoMjY0X2xvb3BfZmlsdGVyX2Nocm9tYSkodWludDhfdCAqcF9waXgsIGludCB4c3RyaWRlLCBpbnQgeXN0cmlkZSwgaW50IGlubmVyX2l0ZXJzLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQ4X3QgKnRjMCkKK3sKKyAgICBwaXhlbCAqcGl4ID0gKHBpeGVsKilwX3BpeDsKKyAgICBpbnQgaSwgZDsKKyAgICBhbHBoYSA8PD0gQklUX0RFUFRIIC0gODsKKyAgICBiZXRhICA8PD0gQklUX0RFUFRIIC0gODsKKyAgICB4c3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7CisgICAgeXN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xOworICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKSB7CisgICAgICAgIGNvbnN0IGludCB0YyA9ICgodGMwW2ldIC0gMSkgPDwgKEJJVF9ERVBUSCAtIDgpKSArIDE7CisgICAgICAgIGlmKCB0YyA8PSAwICkgeworICAgICAgICAgICAgcGl4ICs9IGlubmVyX2l0ZXJzKnlzdHJpZGU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IoIGQgPSAwOyBkIDwgaW5uZXJfaXRlcnM7IGQrKyApIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBwMCA9IHBpeFstMSp4c3RyaWRlXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBwMSA9IHBpeFstMip4c3RyaWRlXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBxMCA9IHBpeFswXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBxMSA9IHBpeFsxKnhzdHJpZGVdOworCisgICAgICAgICAgICBpZiggRkZBQlMoIHAwIC0gcTAgKSA8IGFscGhhICYmCisgICAgICAgICAgICAgICAgRkZBQlMoIHAxIC0gcDAgKSA8IGJldGEgJiYKKyAgICAgICAgICAgICAgICBGRkFCUyggcTEgLSBxMCApIDwgYmV0YSApIHsKKworICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IGF2X2NsaXAoICgoKHEwIC0gcDAgKSA8PCAyKSArIChwMSAtIHExKSArIDQpID4+IDMsIC10YywgdGMgKTsKKworICAgICAgICAgICAgICAgIHBpeFsteHN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBwMCArIGRlbHRhICk7ICAgIC8qIHAwJyAqLworICAgICAgICAgICAgICAgIHBpeFswXSAgICAgICAgPSBhdl9jbGlwX3BpeGVsKCBxMCAtIGRlbHRhICk7ICAgIC8qIHEwJyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGl4ICs9IHlzdHJpZGU7CisgICAgICAgIH0KKyAgICB9Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhoMjY0X3ZfbG9vcF9maWx0ZXJfY2hyb21hKSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludDhfdCAqdGMwKQoreworICAgIEZVTkNDKGgyNjRfbG9vcF9maWx0ZXJfY2hyb21hKShwaXgsIHN0cmlkZSwgc2l6ZW9mKHBpeGVsKSwgMiwgYWxwaGEsIGJldGEsIHRjMCk7Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhoMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hKSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludDhfdCAqdGMwKQoreworICAgIEZVTkNDKGgyNjRfbG9vcF9maWx0ZXJfY2hyb21hKShwaXgsIHNpemVvZihwaXhlbCksIHN0cmlkZSwgMiwgYWxwaGEsIGJldGEsIHRjMCk7Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhoMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hX21iYWZmKSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludDhfdCAqdGMwKQoreworICAgIEZVTkNDKGgyNjRfbG9vcF9maWx0ZXJfY2hyb21hKShwaXgsIHNpemVvZihwaXhlbCksIHN0cmlkZSwgMSwgYWxwaGEsIGJldGEsIHRjMCk7Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhoMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hNDIyKSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludDhfdCAqdGMwKQoreworICAgIEZVTkNDKGgyNjRfbG9vcF9maWx0ZXJfY2hyb21hKShwaXgsIHNpemVvZihwaXhlbCksIHN0cmlkZSwgNCwgYWxwaGEsIGJldGEsIHRjMCk7Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhoMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hNDIyX21iYWZmKSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludDhfdCAqdGMwKQoreworICAgIEZVTkNDKGgyNjRfbG9vcF9maWx0ZXJfY2hyb21hKShwaXgsIHNpemVvZihwaXhlbCksIHN0cmlkZSwgMiwgYWxwaGEsIGJldGEsIHRjMCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2ZsYXR0ZW4gdm9pZCBGVU5DQyhoMjY0X2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSkodWludDhfdCAqcF9waXgsIGludCB4c3RyaWRlLCBpbnQgeXN0cmlkZSwgaW50IGlubmVyX2l0ZXJzLCBpbnQgYWxwaGEsIGludCBiZXRhKQoreworICAgIHBpeGVsICpwaXggPSAocGl4ZWwqKXBfcGl4OworICAgIGludCBkOworICAgIHhzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTsKKyAgICB5c3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7CisgICAgYWxwaGEgPDw9IEJJVF9ERVBUSCAtIDg7CisgICAgYmV0YSAgPDw9IEJJVF9ERVBUSCAtIDg7CisgICAgZm9yKCBkID0gMDsgZCA8IDQgKiBpbm5lcl9pdGVyczsgZCsrICkgeworICAgICAgICBjb25zdCBpbnQgcDAgPSBwaXhbLTEqeHN0cmlkZV07CisgICAgICAgIGNvbnN0IGludCBwMSA9IHBpeFstMip4c3RyaWRlXTsKKyAgICAgICAgY29uc3QgaW50IHEwID0gcGl4WzBdOworICAgICAgICBjb25zdCBpbnQgcTEgPSBwaXhbMSp4c3RyaWRlXTsKKworICAgICAgICBpZiggRkZBQlMoIHAwIC0gcTAgKSA8IGFscGhhICYmCisgICAgICAgICAgICBGRkFCUyggcDEgLSBwMCApIDwgYmV0YSAmJgorICAgICAgICAgICAgRkZBQlMoIHExIC0gcTAgKSA8IGJldGEgKSB7CisKKyAgICAgICAgICAgIHBpeFsteHN0cmlkZV0gPSAoIDIqcDEgKyBwMCArIHExICsgMiApID4+IDI7ICAgLyogcDAnICovCisgICAgICAgICAgICBwaXhbMF0gICAgICAgID0gKCAyKnExICsgcTAgKyBwMSArIDIgKSA+PiAyOyAgIC8qIHEwJyAqLworICAgICAgICB9CisgICAgICAgIHBpeCArPSB5c3RyaWRlOworICAgIH0KK30KK3N0YXRpYyB2b2lkIEZVTkNDKGgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmEpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSkKK3sKKyAgICBGVU5DQyhoMjY0X2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSkocGl4LCBzdHJpZGUsIHNpemVvZihwaXhlbCksIDIsIGFscGhhLCBiZXRhKTsKK30KK3N0YXRpYyB2b2lkIEZVTkNDKGgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmEpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSkKK3sKKyAgICBGVU5DQyhoMjY0X2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSkocGl4LCBzaXplb2YocGl4ZWwpLCBzdHJpZGUsIDIsIGFscGhhLCBiZXRhKTsKK30KK3N0YXRpYyB2b2lkIEZVTkNDKGgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfbWJhZmZfaW50cmEpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSkKK3sKKyAgICBGVU5DQyhoMjY0X2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSkocGl4LCBzaXplb2YocGl4ZWwpLCBzdHJpZGUsIDEsIGFscGhhLCBiZXRhKTsKK30KK3N0YXRpYyB2b2lkIEZVTkNDKGgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWE0MjJfaW50cmEpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSkKK3sKKyAgICBGVU5DQyhoMjY0X2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSkocGl4LCBzaXplb2YocGl4ZWwpLCBzdHJpZGUsIDQsIGFscGhhLCBiZXRhKTsKK30KK3N0YXRpYyB2b2lkIEZVTkNDKGgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWE0MjJfbWJhZmZfaW50cmEpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSkKK3sKKyAgICBGVU5DQyhoMjY0X2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSkocGl4LCBzaXplb2YocGl4ZWwpLCBzdHJpZGUsIDIsIGFscGhhLCBiZXRhKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRpZGN0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0aWRjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNzcxYWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0aWRjdC5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBILjI2NCBJRENUCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSC4yNjQgSURDVC4KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaW5jbHVkZSAiaDI2NGlkY3QuaCIKKworI2RlZmluZSBCSVRfREVQVEggOAorI2luY2x1ZGUgImgyNjRpZGN0X3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDkKKyNpbmNsdWRlICJoMjY0aWRjdF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCAxMAorI2luY2x1ZGUgImgyNjRpZGN0X3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDEyCisjaW5jbHVkZSAiaDI2NGlkY3RfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKworI2RlZmluZSBCSVRfREVQVEggMTQKKyNpbmNsdWRlICJoMjY0aWRjdF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NGlkY3QuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRpZGN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlMDA1MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRpZGN0LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSDI2NElEQ1RfSAorI2RlZmluZSBBVkNPREVDX0gyNjRJRENUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEgyNjRfSURDVChkZXB0aCkgXAordm9pZCBmZl9oMjY0X2lkY3Q4X2FkZF8gIyMgZGVwdGggIyMgX2ModWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSk7XAordm9pZCBmZl9oMjY0X2lkY3RfYWRkXyAjIyBkZXB0aCAjIyBfYyh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKTtcCit2b2lkIGZmX2gyNjRfaWRjdDhfZGNfYWRkXyAjIyBkZXB0aCAjIyBfYyh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKTtcCit2b2lkIGZmX2gyNjRfaWRjdF9kY19hZGRfICMjIGRlcHRoICMjIF9jKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpO1wKK3ZvaWQgZmZfaDI2NF9pZGN0X2FkZDE2XyAjIyBkZXB0aCAjIyBfYyh1aW50OF90ICpkc3QsIGNvbnN0IGludCAqYmxvY2tvZmZzZXQsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLCBjb25zdCB1aW50OF90IG5uemNbNio4XSk7XAordm9pZCBmZl9oMjY0X2lkY3RfYWRkMTZpbnRyYV8gIyMgZGVwdGggIyMgX2ModWludDhfdCAqZHN0LCBjb25zdCBpbnQgKmJsb2Nrb2Zmc2V0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwgY29uc3QgdWludDhfdCBubnpjWzYqOF0pO1wKK3ZvaWQgZmZfaDI2NF9pZGN0OF9hZGQ0XyAjIyBkZXB0aCAjIyBfYyh1aW50OF90ICpkc3QsIGNvbnN0IGludCAqYmxvY2tvZmZzZXQsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLCBjb25zdCB1aW50OF90IG5uemNbNio4XSk7XAordm9pZCBmZl9oMjY0X2lkY3RfYWRkOF80MjJfICMjIGRlcHRoICMjIF9jKHVpbnQ4X3QgKipkZXN0LCBjb25zdCBpbnQgKmJsb2Nrb2Zmc2V0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwgY29uc3QgdWludDhfdCBubnpjWzYqOF0pO1wKK3ZvaWQgZmZfaDI2NF9pZGN0X2FkZDhfICMjIGRlcHRoICMjIF9jKHVpbnQ4X3QgKipkZXN0LCBjb25zdCBpbnQgKmJsb2Nrb2Zmc2V0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwgY29uc3QgdWludDhfdCBubnpjWzYqOF0pO1wKK3ZvaWQgZmZfaDI2NF9sdW1hX2RjX2RlcXVhbnRfaWRjdF8gIyMgZGVwdGggIyMgX2MoaW50MTZfdCAqb3V0cHV0LCBpbnQxNl90ICppbnB1dCwgaW50IHFtdWwpO1wKK3ZvaWQgZmZfaDI2NF9jaHJvbWE0MjJfZGNfZGVxdWFudF9pZGN0XyAjIyBkZXB0aCAjIyBfYyhpbnQxNl90ICpibG9jaywgaW50IHFtdWwpO1wKK3ZvaWQgZmZfaDI2NF9jaHJvbWFfZGNfZGVxdWFudF9pZGN0XyAjIyBkZXB0aCAjIyBfYyhpbnQxNl90ICpibG9jaywgaW50IHFtdWwpOworCitIMjY0X0lEQ1QoIDgpCitIMjY0X0lEQ1QoIDkpCitIMjY0X0lEQ1QoMTApCitIMjY0X0lEQ1QoMTIpCitIMjY0X0lEQ1QoMTQpCisKKyNlbmRpZiAvKiBBVkNPREVDX0gyNjRJRENUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRpZGN0X3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0aWRjdF90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjg4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0aWRjdF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogSC4yNjQgSURDVAorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMTEgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSC4yNjQgSURDVC4KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaW5jbHVkZSAiYml0X2RlcHRoX3RlbXBsYXRlLmMiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJoMjY0aWRjdC5oIgorCit2b2lkIEZVTkNDKGZmX2gyNjRfaWRjdF9hZGQpKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKl9ibG9jaywgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilfZHN0OworICAgIGRjdGNvZWYgKmJsb2NrID0gKGRjdGNvZWYqKV9ibG9jazsKKyAgICBzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTsKKworICAgIGJsb2NrWzBdICs9IDEgPDwgNTsKKworICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgY29uc3QgaW50IHowPSAgYmxvY2tbaSArIDQqMF0gICAgICsgIGJsb2NrW2kgKyA0KjJdOworICAgICAgICBjb25zdCBpbnQgejE9ICBibG9ja1tpICsgNCowXSAgICAgLSAgYmxvY2tbaSArIDQqMl07CisgICAgICAgIGNvbnN0IGludCB6Mj0gKGJsb2NrW2kgKyA0KjFdPj4xKSAtICBibG9ja1tpICsgNCozXTsKKyAgICAgICAgY29uc3QgaW50IHozPSAgYmxvY2tbaSArIDQqMV0gICAgICsgKGJsb2NrW2kgKyA0KjNdPj4xKTsKKworICAgICAgICBibG9ja1tpICsgNCowXT0gejAgKyB6MzsKKyAgICAgICAgYmxvY2tbaSArIDQqMV09IHoxICsgejI7CisgICAgICAgIGJsb2NrW2kgKyA0KjJdPSB6MSAtIHoyOworICAgICAgICBibG9ja1tpICsgNCozXT0gejAgLSB6MzsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7CisgICAgICAgIGNvbnN0IGludCB6MD0gIGJsb2NrWzAgKyA0KmldICAgICArICBibG9ja1syICsgNCppXTsKKyAgICAgICAgY29uc3QgaW50IHoxPSAgYmxvY2tbMCArIDQqaV0gICAgIC0gIGJsb2NrWzIgKyA0KmldOworICAgICAgICBjb25zdCBpbnQgejI9IChibG9ja1sxICsgNCppXT4+MSkgLSAgYmxvY2tbMyArIDQqaV07CisgICAgICAgIGNvbnN0IGludCB6Mz0gIGJsb2NrWzEgKyA0KmldICAgICArIChibG9ja1szICsgNCppXT4+MSk7CisKKyAgICAgICAgZHN0W2kgKyAwKnN0cmlkZV09IGF2X2NsaXBfcGl4ZWwoZHN0W2kgKyAwKnN0cmlkZV0gKyAoKHowICsgejMpID4+IDYpKTsKKyAgICAgICAgZHN0W2kgKyAxKnN0cmlkZV09IGF2X2NsaXBfcGl4ZWwoZHN0W2kgKyAxKnN0cmlkZV0gKyAoKHoxICsgejIpID4+IDYpKTsKKyAgICAgICAgZHN0W2kgKyAyKnN0cmlkZV09IGF2X2NsaXBfcGl4ZWwoZHN0W2kgKyAyKnN0cmlkZV0gKyAoKHoxIC0gejIpID4+IDYpKTsKKyAgICAgICAgZHN0W2kgKyAzKnN0cmlkZV09IGF2X2NsaXBfcGl4ZWwoZHN0W2kgKyAzKnN0cmlkZV0gKyAoKHowIC0gejMpID4+IDYpKTsKKyAgICB9CisKKyAgICBtZW1zZXQoYmxvY2ssIDAsIDE2ICogc2l6ZW9mKGRjdGNvZWYpKTsKK30KKwordm9pZCBGVU5DQyhmZl9oMjY0X2lkY3Q4X2FkZCkodWludDhfdCAqX2RzdCwgaW50MTZfdCAqX2Jsb2NrLCBpbnQgc3RyaWRlKXsKKyAgICBpbnQgaTsKKyAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilfZHN0OworICAgIGRjdGNvZWYgKmJsb2NrID0gKGRjdGNvZWYqKV9ibG9jazsKKyAgICBzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTsKKworICAgIGJsb2NrWzBdICs9IDMyOworCisgICAgZm9yKCBpID0gMDsgaSA8IDg7IGkrKyApCisgICAgeworICAgICAgICBjb25zdCBpbnQgYTAgPSAgYmxvY2tbaSswKjhdICsgYmxvY2tbaSs0KjhdOworICAgICAgICBjb25zdCBpbnQgYTIgPSAgYmxvY2tbaSswKjhdIC0gYmxvY2tbaSs0KjhdOworICAgICAgICBjb25zdCBpbnQgYTQgPSAoYmxvY2tbaSsyKjhdPj4xKSAtIGJsb2NrW2krNio4XTsKKyAgICAgICAgY29uc3QgaW50IGE2ID0gKGJsb2NrW2krNio4XT4+MSkgKyBibG9ja1tpKzIqOF07CisKKyAgICAgICAgY29uc3QgaW50IGIwID0gYTAgKyBhNjsKKyAgICAgICAgY29uc3QgaW50IGIyID0gYTIgKyBhNDsKKyAgICAgICAgY29uc3QgaW50IGI0ID0gYTIgLSBhNDsKKyAgICAgICAgY29uc3QgaW50IGI2ID0gYTAgLSBhNjsKKworICAgICAgICBjb25zdCBpbnQgYTEgPSAtYmxvY2tbaSszKjhdICsgYmxvY2tbaSs1KjhdIC0gYmxvY2tbaSs3KjhdIC0gKGJsb2NrW2krNyo4XT4+MSk7CisgICAgICAgIGNvbnN0IGludCBhMyA9ICBibG9ja1tpKzEqOF0gKyBibG9ja1tpKzcqOF0gLSBibG9ja1tpKzMqOF0gLSAoYmxvY2tbaSszKjhdPj4xKTsKKyAgICAgICAgY29uc3QgaW50IGE1ID0gLWJsb2NrW2krMSo4XSArIGJsb2NrW2krNyo4XSArIGJsb2NrW2krNSo4XSArIChibG9ja1tpKzUqOF0+PjEpOworICAgICAgICBjb25zdCBpbnQgYTcgPSAgYmxvY2tbaSszKjhdICsgYmxvY2tbaSs1KjhdICsgYmxvY2tbaSsxKjhdICsgKGJsb2NrW2krMSo4XT4+MSk7CisKKyAgICAgICAgY29uc3QgaW50IGIxID0gKGE3Pj4yKSArIGExOworICAgICAgICBjb25zdCBpbnQgYjMgPSAgYTMgKyAoYTU+PjIpOworICAgICAgICBjb25zdCBpbnQgYjUgPSAoYTM+PjIpIC0gYTU7CisgICAgICAgIGNvbnN0IGludCBiNyA9ICBhNyAtIChhMT4+Mik7CisKKyAgICAgICAgYmxvY2tbaSswKjhdID0gYjAgKyBiNzsKKyAgICAgICAgYmxvY2tbaSs3KjhdID0gYjAgLSBiNzsKKyAgICAgICAgYmxvY2tbaSsxKjhdID0gYjIgKyBiNTsKKyAgICAgICAgYmxvY2tbaSs2KjhdID0gYjIgLSBiNTsKKyAgICAgICAgYmxvY2tbaSsyKjhdID0gYjQgKyBiMzsKKyAgICAgICAgYmxvY2tbaSs1KjhdID0gYjQgLSBiMzsKKyAgICAgICAgYmxvY2tbaSszKjhdID0gYjYgKyBiMTsKKyAgICAgICAgYmxvY2tbaSs0KjhdID0gYjYgLSBiMTsKKyAgICB9CisgICAgZm9yKCBpID0gMDsgaSA8IDg7IGkrKyApCisgICAgeworICAgICAgICBjb25zdCBpbnQgYTAgPSAgYmxvY2tbMCtpKjhdICsgYmxvY2tbNCtpKjhdOworICAgICAgICBjb25zdCBpbnQgYTIgPSAgYmxvY2tbMCtpKjhdIC0gYmxvY2tbNCtpKjhdOworICAgICAgICBjb25zdCBpbnQgYTQgPSAoYmxvY2tbMitpKjhdPj4xKSAtIGJsb2NrWzYraSo4XTsKKyAgICAgICAgY29uc3QgaW50IGE2ID0gKGJsb2NrWzYraSo4XT4+MSkgKyBibG9ja1syK2kqOF07CisKKyAgICAgICAgY29uc3QgaW50IGIwID0gYTAgKyBhNjsKKyAgICAgICAgY29uc3QgaW50IGIyID0gYTIgKyBhNDsKKyAgICAgICAgY29uc3QgaW50IGI0ID0gYTIgLSBhNDsKKyAgICAgICAgY29uc3QgaW50IGI2ID0gYTAgLSBhNjsKKworICAgICAgICBjb25zdCBpbnQgYTEgPSAtYmxvY2tbMytpKjhdICsgYmxvY2tbNStpKjhdIC0gYmxvY2tbNytpKjhdIC0gKGJsb2NrWzcraSo4XT4+MSk7CisgICAgICAgIGNvbnN0IGludCBhMyA9ICBibG9ja1sxK2kqOF0gKyBibG9ja1s3K2kqOF0gLSBibG9ja1szK2kqOF0gLSAoYmxvY2tbMytpKjhdPj4xKTsKKyAgICAgICAgY29uc3QgaW50IGE1ID0gLWJsb2NrWzEraSo4XSArIGJsb2NrWzcraSo4XSArIGJsb2NrWzUraSo4XSArIChibG9ja1s1K2kqOF0+PjEpOworICAgICAgICBjb25zdCBpbnQgYTcgPSAgYmxvY2tbMytpKjhdICsgYmxvY2tbNStpKjhdICsgYmxvY2tbMStpKjhdICsgKGJsb2NrWzEraSo4XT4+MSk7CisKKyAgICAgICAgY29uc3QgaW50IGIxID0gKGE3Pj4yKSArIGExOworICAgICAgICBjb25zdCBpbnQgYjMgPSAgYTMgKyAoYTU+PjIpOworICAgICAgICBjb25zdCBpbnQgYjUgPSAoYTM+PjIpIC0gYTU7CisgICAgICAgIGNvbnN0IGludCBiNyA9ICBhNyAtIChhMT4+Mik7CisKKyAgICAgICAgZHN0W2kgKyAwKnN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBkc3RbaSArIDAqc3RyaWRlXSArICgoYjAgKyBiNykgPj4gNikgKTsKKyAgICAgICAgZHN0W2kgKyAxKnN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBkc3RbaSArIDEqc3RyaWRlXSArICgoYjIgKyBiNSkgPj4gNikgKTsKKyAgICAgICAgZHN0W2kgKyAyKnN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBkc3RbaSArIDIqc3RyaWRlXSArICgoYjQgKyBiMykgPj4gNikgKTsKKyAgICAgICAgZHN0W2kgKyAzKnN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBkc3RbaSArIDMqc3RyaWRlXSArICgoYjYgKyBiMSkgPj4gNikgKTsKKyAgICAgICAgZHN0W2kgKyA0KnN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBkc3RbaSArIDQqc3RyaWRlXSArICgoYjYgLSBiMSkgPj4gNikgKTsKKyAgICAgICAgZHN0W2kgKyA1KnN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBkc3RbaSArIDUqc3RyaWRlXSArICgoYjQgLSBiMykgPj4gNikgKTsKKyAgICAgICAgZHN0W2kgKyA2KnN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBkc3RbaSArIDYqc3RyaWRlXSArICgoYjIgLSBiNSkgPj4gNikgKTsKKyAgICAgICAgZHN0W2kgKyA3KnN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBkc3RbaSArIDcqc3RyaWRlXSArICgoYjAgLSBiNykgPj4gNikgKTsKKyAgICB9CisKKyAgICBtZW1zZXQoYmxvY2ssIDAsIDY0ICogc2l6ZW9mKGRjdGNvZWYpKTsKK30KKworLy8gYXNzdW1lcyBhbGwgQUMgY29lZnMgYXJlIDAKK3ZvaWQgRlVOQ0MoZmZfaDI2NF9pZGN0X2RjX2FkZCkodWludDhfdCAqX2RzdCwgaW50MTZfdCAqX2Jsb2NrLCBpbnQgc3RyaWRlKXsKKyAgICBpbnQgaSwgajsKKyAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilfZHN0OworICAgIGRjdGNvZWYgKmJsb2NrID0gKGRjdGNvZWYqKV9ibG9jazsKKyAgICBpbnQgZGMgPSAoYmxvY2tbMF0gKyAzMikgPj4gNjsKKyAgICBzdHJpZGUgLz0gc2l6ZW9mKHBpeGVsKTsKKyAgICBibG9ja1swXSA9IDA7CisgICAgZm9yKCBqID0gMDsgaiA8IDQ7IGorKyApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgICAgIGRzdFtpXSA9IGF2X2NsaXBfcGl4ZWwoIGRzdFtpXSArIGRjICk7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCit2b2lkIEZVTkNDKGZmX2gyNjRfaWRjdDhfZGNfYWRkKSh1aW50OF90ICpfZHN0LCBpbnQxNl90ICpfYmxvY2ssIGludCBzdHJpZGUpeworICAgIGludCBpLCBqOworICAgIHBpeGVsICpkc3QgPSAocGl4ZWwqKV9kc3Q7CisgICAgZGN0Y29lZiAqYmxvY2sgPSAoZGN0Y29lZiopX2Jsb2NrOworICAgIGludCBkYyA9IChibG9ja1swXSArIDMyKSA+PiA2OworICAgIGJsb2NrWzBdID0gMDsKKyAgICBzdHJpZGUgLz0gc2l6ZW9mKHBpeGVsKTsKKyAgICBmb3IoIGogPSAwOyBqIDwgODsgaisrICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCA4OyBpKysgKQorICAgICAgICAgICAgZHN0W2ldID0gYXZfY2xpcF9waXhlbCggZHN0W2ldICsgZGMgKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgRlVOQ0MoZmZfaDI2NF9pZGN0X2FkZDE2KSh1aW50OF90ICpkc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwgY29uc3QgdWludDhfdCBubnpjWzE1KjhdKXsKKyAgICBpbnQgaTsKKyAgICBmb3IoaT0wOyBpPDE2OyBpKyspeworICAgICAgICBpbnQgbm56ID0gbm56Y1sgc2NhbjhbaV0gXTsKKyAgICAgICAgaWYobm56KXsKKyAgICAgICAgICAgIGlmKG5uej09MSAmJiAoKGRjdGNvZWYqKWJsb2NrKVtpKjE2XSkgRlVOQ0MoZmZfaDI2NF9pZGN0X2RjX2FkZCkoZHN0ICsgYmxvY2tfb2Zmc2V0W2ldLCBibG9jayArIGkqMTYqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQ0MoZmZfaDI2NF9pZGN0X2FkZCAgICkoZHN0ICsgYmxvY2tfb2Zmc2V0W2ldLCBibG9jayArIGkqMTYqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBGVU5DQyhmZl9oMjY0X2lkY3RfYWRkMTZpbnRyYSkodWludDhfdCAqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3Qgbm56Y1sxNSo4XSl7CisgICAgaW50IGk7CisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKXsKKyAgICAgICAgaWYobm56Y1sgc2NhbjhbaV0gXSkgICAgICAgICAgICAgRlVOQ0MoZmZfaDI2NF9pZGN0X2FkZCAgICkoZHN0ICsgYmxvY2tfb2Zmc2V0W2ldLCBibG9jayArIGkqMTYqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTsKKyAgICAgICAgZWxzZSBpZigoKGRjdGNvZWYqKWJsb2NrKVtpKjE2XSkgRlVOQ0MoZmZfaDI2NF9pZGN0X2RjX2FkZCkoZHN0ICsgYmxvY2tfb2Zmc2V0W2ldLCBibG9jayArIGkqMTYqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTsKKyAgICB9Cit9CisKK3ZvaWQgRlVOQ0MoZmZfaDI2NF9pZGN0OF9hZGQ0KSh1aW50OF90ICpkc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwgY29uc3QgdWludDhfdCBubnpjWzE1KjhdKXsKKyAgICBpbnQgaTsKKyAgICBmb3IoaT0wOyBpPDE2OyBpKz00KXsKKyAgICAgICAgaW50IG5ueiA9IG5uemNbIHNjYW44W2ldIF07CisgICAgICAgIGlmKG5ueil7CisgICAgICAgICAgICBpZihubno9PTEgJiYgKChkY3Rjb2VmKilibG9jaylbaSoxNl0pIEZVTkNDKGZmX2gyNjRfaWRjdDhfZGNfYWRkKShkc3QgKyBibG9ja19vZmZzZXRbaV0sIGJsb2NrICsgaSoxNipzaXplb2YocGl4ZWwpLCBzdHJpZGUpOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVU5DQyhmZl9oMjY0X2lkY3Q4X2FkZCAgICkoZHN0ICsgYmxvY2tfb2Zmc2V0W2ldLCBibG9jayArIGkqMTYqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBGVU5DQyhmZl9oMjY0X2lkY3RfYWRkOCkodWludDhfdCAqKmRlc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwgY29uc3QgdWludDhfdCBubnpjWzE1KjhdKXsKKyAgICBpbnQgaSwgajsKKyAgICBmb3Ioaj0xOyBqPDM7IGorKyl7CisgICAgICAgIGZvcihpPWoqMTY7IGk8aioxNis0OyBpKyspeworICAgICAgICAgICAgaWYobm56Y1sgc2NhbjhbaV0gXSkKKyAgICAgICAgICAgICAgICBGVU5DQyhmZl9oMjY0X2lkY3RfYWRkICAgKShkZXN0W2otMV0gKyBibG9ja19vZmZzZXRbaV0sIGJsb2NrICsgaSoxNipzaXplb2YocGl4ZWwpLCBzdHJpZGUpOworICAgICAgICAgICAgZWxzZSBpZigoKGRjdGNvZWYqKWJsb2NrKVtpKjE2XSkKKyAgICAgICAgICAgICAgICBGVU5DQyhmZl9oMjY0X2lkY3RfZGNfYWRkKShkZXN0W2otMV0gKyBibG9ja19vZmZzZXRbaV0sIGJsb2NrICsgaSoxNipzaXplb2YocGl4ZWwpLCBzdHJpZGUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEZVTkNDKGZmX2gyNjRfaWRjdF9hZGQ4XzQyMikodWludDhfdCAqKmRlc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwgY29uc3QgdWludDhfdCBubnpjWzE1KjhdKXsKKyAgICBpbnQgaSwgajsKKworICAgIGZvcihqPTE7IGo8MzsgaisrKXsKKyAgICAgICAgZm9yKGk9aioxNjsgaTxqKjE2KzQ7IGkrKyl7CisgICAgICAgICAgICBpZihubnpjWyBzY2FuOFtpXSBdKQorICAgICAgICAgICAgICAgIEZVTkNDKGZmX2gyNjRfaWRjdF9hZGQgICApKGRlc3Rbai0xXSArIGJsb2NrX29mZnNldFtpXSwgYmxvY2sgKyBpKjE2KnNpemVvZihwaXhlbCksIHN0cmlkZSk7CisgICAgICAgICAgICBlbHNlIGlmKCgoZGN0Y29lZiopYmxvY2spW2kqMTZdKQorICAgICAgICAgICAgICAgIEZVTkNDKGZmX2gyNjRfaWRjdF9kY19hZGQpKGRlc3Rbai0xXSArIGJsb2NrX29mZnNldFtpXSwgYmxvY2sgKyBpKjE2KnNpemVvZihwaXhlbCksIHN0cmlkZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3Ioaj0xOyBqPDM7IGorKyl7CisgICAgICAgIGZvcihpPWoqMTYrNDsgaTxqKjE2Kzg7IGkrKyl7CisgICAgICAgICAgICBpZihubnpjWyBzY2FuOFtpKzRdIF0pCisgICAgICAgICAgICAgICAgRlVOQ0MoZmZfaDI2NF9pZGN0X2FkZCAgICkoZGVzdFtqLTFdICsgYmxvY2tfb2Zmc2V0W2krNF0sIGJsb2NrICsgaSoxNipzaXplb2YocGl4ZWwpLCBzdHJpZGUpOworICAgICAgICAgICAgZWxzZSBpZigoKGRjdGNvZWYqKWJsb2NrKVtpKjE2XSkKKyAgICAgICAgICAgICAgICBGVU5DQyhmZl9oMjY0X2lkY3RfZGNfYWRkKShkZXN0W2otMV0gKyBibG9ja19vZmZzZXRbaSs0XSwgYmxvY2sgKyBpKjE2KnNpemVvZihwaXhlbCksIHN0cmlkZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogSURDVCB0cmFuc2Zvcm1zIHRoZSAxNiBkYyB2YWx1ZXMgYW5kIGRlcXVhbnRpemVzIHRoZW0uCisgKiBAcGFyYW0gcW11bCBxdWFudGl6YXRpb24gcGFyYW1ldGVyCisgKi8KK3ZvaWQgRlVOQ0MoZmZfaDI2NF9sdW1hX2RjX2RlcXVhbnRfaWRjdCkoaW50MTZfdCAqX291dHB1dCwgaW50MTZfdCAqX2lucHV0LCBpbnQgcW11bCl7CisjZGVmaW5lIHN0cmlkZSAxNgorICAgIGludCBpOworICAgIGludCB0ZW1wWzE2XTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCB4X29mZnNldFs0XT17MCwgMipzdHJpZGUsIDgqc3RyaWRlLCAxMCpzdHJpZGV9OworICAgIGRjdGNvZWYgKmlucHV0ID0gKGRjdGNvZWYqKV9pbnB1dDsKKyAgICBkY3Rjb2VmICpvdXRwdXQgPSAoZGN0Y29lZiopX291dHB1dDsKKworICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgY29uc3QgaW50IHowPSBpbnB1dFs0KmkrMF0gKyBpbnB1dFs0KmkrMV07CisgICAgICAgIGNvbnN0IGludCB6MT0gaW5wdXRbNCppKzBdIC0gaW5wdXRbNCppKzFdOworICAgICAgICBjb25zdCBpbnQgejI9IGlucHV0WzQqaSsyXSAtIGlucHV0WzQqaSszXTsKKyAgICAgICAgY29uc3QgaW50IHozPSBpbnB1dFs0KmkrMl0gKyBpbnB1dFs0KmkrM107CisKKyAgICAgICAgdGVtcFs0KmkrMF09IHowK3ozOworICAgICAgICB0ZW1wWzQqaSsxXT0gejAtejM7CisgICAgICAgIHRlbXBbNCppKzJdPSB6MS16MjsKKyAgICAgICAgdGVtcFs0KmkrM109IHoxK3oyOworICAgIH0KKworICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgY29uc3QgaW50IG9mZnNldD0geF9vZmZzZXRbaV07CisgICAgICAgIGNvbnN0IGludCB6MD0gdGVtcFs0KjAraV0gKyB0ZW1wWzQqMitpXTsKKyAgICAgICAgY29uc3QgaW50IHoxPSB0ZW1wWzQqMCtpXSAtIHRlbXBbNCoyK2ldOworICAgICAgICBjb25zdCBpbnQgejI9IHRlbXBbNCoxK2ldIC0gdGVtcFs0KjMraV07CisgICAgICAgIGNvbnN0IGludCB6Mz0gdGVtcFs0KjEraV0gKyB0ZW1wWzQqMytpXTsKKworICAgICAgICBvdXRwdXRbc3RyaWRlKiAwK29mZnNldF09ICgoKCh6MCArIHozKSpxbXVsICsgMTI4ICkgPj4gOCkpOworICAgICAgICBvdXRwdXRbc3RyaWRlKiAxK29mZnNldF09ICgoKCh6MSArIHoyKSpxbXVsICsgMTI4ICkgPj4gOCkpOworICAgICAgICBvdXRwdXRbc3RyaWRlKiA0K29mZnNldF09ICgoKCh6MSAtIHoyKSpxbXVsICsgMTI4ICkgPj4gOCkpOworICAgICAgICBvdXRwdXRbc3RyaWRlKiA1K29mZnNldF09ICgoKCh6MCAtIHozKSpxbXVsICsgMTI4ICkgPj4gOCkpOworICAgIH0KKyN1bmRlZiBzdHJpZGUKK30KKwordm9pZCBGVU5DQyhmZl9oMjY0X2Nocm9tYTQyMl9kY19kZXF1YW50X2lkY3QpKGludDE2X3QgKl9ibG9jaywgaW50IHFtdWwpeworICAgIGNvbnN0IGludCBzdHJpZGU9IDE2KjI7CisgICAgY29uc3QgaW50IHhTdHJpZGU9IDE2OworICAgIGludCBpOworICAgIGludCB0ZW1wWzhdOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHhfb2Zmc2V0WzJdPXswLCAxNn07CisgICAgZGN0Y29lZiAqYmxvY2sgPSAoZGN0Y29lZiopX2Jsb2NrOworCisgICAgZm9yKGk9MDsgaTw0OyBpKyspeworICAgICAgICB0ZW1wWzIqaSswXSA9IGJsb2NrW3N0cmlkZSppICsgeFN0cmlkZSowXSArIGJsb2NrW3N0cmlkZSppICsgeFN0cmlkZSoxXTsKKyAgICAgICAgdGVtcFsyKmkrMV0gPSBibG9ja1tzdHJpZGUqaSArIHhTdHJpZGUqMF0gLSBibG9ja1tzdHJpZGUqaSArIHhTdHJpZGUqMV07CisgICAgfQorCisgICAgZm9yKGk9MDsgaTwyOyBpKyspeworICAgICAgICBjb25zdCBpbnQgb2Zmc2V0PSB4X29mZnNldFtpXTsKKyAgICAgICAgY29uc3QgaW50IHowPSB0ZW1wWzIqMCtpXSArIHRlbXBbMioyK2ldOworICAgICAgICBjb25zdCBpbnQgejE9IHRlbXBbMiowK2ldIC0gdGVtcFsyKjIraV07CisgICAgICAgIGNvbnN0IGludCB6Mj0gdGVtcFsyKjEraV0gLSB0ZW1wWzIqMytpXTsKKyAgICAgICAgY29uc3QgaW50IHozPSB0ZW1wWzIqMStpXSArIHRlbXBbMiozK2ldOworCisgICAgICAgIGJsb2NrW3N0cmlkZSowK29mZnNldF09ICgoejAgKyB6MykqcW11bCArIDEyOCkgPj4gODsKKyAgICAgICAgYmxvY2tbc3RyaWRlKjErb2Zmc2V0XT0gKCh6MSArIHoyKSpxbXVsICsgMTI4KSA+PiA4OworICAgICAgICBibG9ja1tzdHJpZGUqMitvZmZzZXRdPSAoKHoxIC0gejIpKnFtdWwgKyAxMjgpID4+IDg7CisgICAgICAgIGJsb2NrW3N0cmlkZSozK29mZnNldF09ICgoejAgLSB6MykqcW11bCArIDEyOCkgPj4gODsKKyAgICB9Cit9CisKK3ZvaWQgRlVOQ0MoZmZfaDI2NF9jaHJvbWFfZGNfZGVxdWFudF9pZGN0KShpbnQxNl90ICpfYmxvY2ssIGludCBxbXVsKXsKKyAgICBjb25zdCBpbnQgc3RyaWRlPSAxNioyOworICAgIGNvbnN0IGludCB4U3RyaWRlPSAxNjsKKyAgICBpbnQgYSxiLGMsZCxlOworICAgIGRjdGNvZWYgKmJsb2NrID0gKGRjdGNvZWYqKV9ibG9jazsKKworICAgIGE9IGJsb2NrW3N0cmlkZSowICsgeFN0cmlkZSowXTsKKyAgICBiPSBibG9ja1tzdHJpZGUqMCArIHhTdHJpZGUqMV07CisgICAgYz0gYmxvY2tbc3RyaWRlKjEgKyB4U3RyaWRlKjBdOworICAgIGQ9IGJsb2NrW3N0cmlkZSoxICsgeFN0cmlkZSoxXTsKKworICAgIGU9IGEtYjsKKyAgICBhPSBhK2I7CisgICAgYj0gYy1kOworICAgIGM9IGMrZDsKKworICAgIGJsb2NrW3N0cmlkZSowICsgeFN0cmlkZSowXT0gKChhK2MpKnFtdWwpID4+IDc7CisgICAgYmxvY2tbc3RyaWRlKjAgKyB4U3RyaWRlKjFdPSAoKGUrYikqcW11bCkgPj4gNzsKKyAgICBibG9ja1tzdHJpZGUqMSArIHhTdHJpZGUqMF09ICgoYS1jKSpxbXVsKSA+PiA3OworICAgIGJsb2NrW3N0cmlkZSoxICsgeFN0cmlkZSoxXT0gKChlLWIpKnFtdWwpID4+IDc7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjY0cHJlZC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NHByZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDRmYzkwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NHByZWQuYwpAQCAtMCwwICsxLDU5NyBAQAorLyoKKyAqIEguMjZML0guMjY0L0FWQy9KVlQvMTQ0OTYtMTAvLi4uIGVuY29kZXIvZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIHByZWRpY3Rpb24gZnVuY3Rpb25zLgorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaDI2NHByZWQuaCIKKworI2RlZmluZSBCSVRfREVQVEggOAorI2luY2x1ZGUgImgyNjRwcmVkX3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDkKKyNpbmNsdWRlICJoMjY0cHJlZF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCAxMAorI2luY2x1ZGUgImgyNjRwcmVkX3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDEyCisjaW5jbHVkZSAiaDI2NHByZWRfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKworI2RlZmluZSBCSVRfREVQVEggMTQKKyNpbmNsdWRlICJoMjY0cHJlZF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCitzdGF0aWMgdm9pZCBwcmVkNHg0X3ZlcnRpY2FsX3ZwOF9jKHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgY29uc3QgdW5zaWduZWQgbHQgPSBzcmNbLTEtMSpzdHJpZGVdOworICAgIExPQURfVE9QX0VER0UKKyAgICBMT0FEX1RPUF9SSUdIVF9FREdFCisgICAgdWludDMyX3QgdiA9IFBBQ0tfNFU4KChsdCArIDIqdDAgKyB0MSArIDIpID4+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh0MCArIDIqdDEgKyB0MiArIDIpID4+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh0MSArIDIqdDIgKyB0MyArIDIpID4+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh0MiArIDIqdDMgKyB0NCArIDIpID4+IDIpOworCisgICAgQVZfV04zMkEoc3JjKzAqc3RyaWRlLCB2KTsKKyAgICBBVl9XTjMyQShzcmMrMSpzdHJpZGUsIHYpOworICAgIEFWX1dOMzJBKHNyYysyKnN0cmlkZSwgdik7CisgICAgQVZfV04zMkEoc3JjKzMqc3RyaWRlLCB2KTsKK30KKworc3RhdGljIHZvaWQgcHJlZDR4NF9ob3Jpem9udGFsX3ZwOF9jKHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBsdCA9IHNyY1stMS0xKnN0cmlkZV07CisgICAgTE9BRF9MRUZUX0VER0UKKworICAgIEFWX1dOMzJBKHNyYyswKnN0cmlkZSwgKChsdCArIDIqbDAgKyBsMSArIDIpID4+IDIpKjB4MDEwMTAxMDEpOworICAgIEFWX1dOMzJBKHNyYysxKnN0cmlkZSwgKChsMCArIDIqbDEgKyBsMiArIDIpID4+IDIpKjB4MDEwMTAxMDEpOworICAgIEFWX1dOMzJBKHNyYysyKnN0cmlkZSwgKChsMSArIDIqbDIgKyBsMyArIDIpID4+IDIpKjB4MDEwMTAxMDEpOworICAgIEFWX1dOMzJBKHNyYyszKnN0cmlkZSwgKChsMiArIDIqbDMgKyBsMyArIDIpID4+IDIpKjB4MDEwMTAxMDEpOworfQorCitzdGF0aWMgdm9pZCBwcmVkNHg0X2Rvd25fbGVmdF9zdnEzX2ModWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp0b3ByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIExPQURfVE9QX0VER0UKKyAgICBMT0FEX0xFRlRfRURHRQorCisgICAgc3JjWzArMCpzdHJpZGVdPShsMSArIHQxKT4+MTsKKyAgICBzcmNbMSswKnN0cmlkZV09CisgICAgc3JjWzArMSpzdHJpZGVdPShsMiArIHQyKT4+MTsKKyAgICBzcmNbMiswKnN0cmlkZV09CisgICAgc3JjWzErMSpzdHJpZGVdPQorICAgIHNyY1swKzIqc3RyaWRlXT0KKyAgICBzcmNbMyswKnN0cmlkZV09CisgICAgc3JjWzIrMSpzdHJpZGVdPQorICAgIHNyY1sxKzIqc3RyaWRlXT0KKyAgICBzcmNbMCszKnN0cmlkZV09CisgICAgc3JjWzMrMSpzdHJpZGVdPQorICAgIHNyY1syKzIqc3RyaWRlXT0KKyAgICBzcmNbMSszKnN0cmlkZV09CisgICAgc3JjWzMrMipzdHJpZGVdPQorICAgIHNyY1syKzMqc3RyaWRlXT0KKyAgICBzcmNbMyszKnN0cmlkZV09KGwzICsgdDMpPj4xOworfQorCitzdGF0aWMgdm9pZCBwcmVkNHg0X2Rvd25fbGVmdF9ydjQwX2ModWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp0b3ByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIExPQURfVE9QX0VER0UKKyAgICBMT0FEX1RPUF9SSUdIVF9FREdFCisgICAgTE9BRF9MRUZUX0VER0UKKyAgICBMT0FEX0RPV05fTEVGVF9FREdFCisKKyAgICBzcmNbMCswKnN0cmlkZV09KHQwICsgdDIgKyAyKnQxICsgMiArIGwwICsgbDIgKyAyKmwxICsgMik+PjM7CisgICAgc3JjWzErMCpzdHJpZGVdPQorICAgIHNyY1swKzEqc3RyaWRlXT0odDEgKyB0MyArIDIqdDIgKyAyICsgbDEgKyBsMyArIDIqbDIgKyAyKT4+MzsKKyAgICBzcmNbMiswKnN0cmlkZV09CisgICAgc3JjWzErMSpzdHJpZGVdPQorICAgIHNyY1swKzIqc3RyaWRlXT0odDIgKyB0NCArIDIqdDMgKyAyICsgbDIgKyBsNCArIDIqbDMgKyAyKT4+MzsKKyAgICBzcmNbMyswKnN0cmlkZV09CisgICAgc3JjWzIrMSpzdHJpZGVdPQorICAgIHNyY1sxKzIqc3RyaWRlXT0KKyAgICBzcmNbMCszKnN0cmlkZV09KHQzICsgdDUgKyAyKnQ0ICsgMiArIGwzICsgbDUgKyAyKmw0ICsgMik+PjM7CisgICAgc3JjWzMrMSpzdHJpZGVdPQorICAgIHNyY1syKzIqc3RyaWRlXT0KKyAgICBzcmNbMSszKnN0cmlkZV09KHQ0ICsgdDYgKyAyKnQ1ICsgMiArIGw0ICsgbDYgKyAyKmw1ICsgMik+PjM7CisgICAgc3JjWzMrMipzdHJpZGVdPQorICAgIHNyY1syKzMqc3RyaWRlXT0odDUgKyB0NyArIDIqdDYgKyAyICsgbDUgKyBsNyArIDIqbDYgKyAyKT4+MzsKKyAgICBzcmNbMyszKnN0cmlkZV09KHQ2ICsgdDcgKyAxICsgbDYgKyBsNyArIDEpPj4yOworfQorCitzdGF0aWMgdm9pZCBwcmVkNHg0X2Rvd25fbGVmdF9ydjQwX25vZG93bl9jKHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgTE9BRF9UT1BfRURHRQorICAgIExPQURfVE9QX1JJR0hUX0VER0UKKyAgICBMT0FEX0xFRlRfRURHRQorCisgICAgc3JjWzArMCpzdHJpZGVdPSh0MCArIHQyICsgMip0MSArIDIgKyBsMCArIGwyICsgMipsMSArIDIpPj4zOworICAgIHNyY1sxKzAqc3RyaWRlXT0KKyAgICBzcmNbMCsxKnN0cmlkZV09KHQxICsgdDMgKyAyKnQyICsgMiArIGwxICsgbDMgKyAyKmwyICsgMik+PjM7CisgICAgc3JjWzIrMCpzdHJpZGVdPQorICAgIHNyY1sxKzEqc3RyaWRlXT0KKyAgICBzcmNbMCsyKnN0cmlkZV09KHQyICsgdDQgKyAyKnQzICsgMiArIGwyICsgMypsMyArIDIpPj4zOworICAgIHNyY1szKzAqc3RyaWRlXT0KKyAgICBzcmNbMisxKnN0cmlkZV09CisgICAgc3JjWzErMipzdHJpZGVdPQorICAgIHNyY1swKzMqc3RyaWRlXT0odDMgKyB0NSArIDIqdDQgKyAyICsgbDMqNCArIDIpPj4zOworICAgIHNyY1szKzEqc3RyaWRlXT0KKyAgICBzcmNbMisyKnN0cmlkZV09CisgICAgc3JjWzErMypzdHJpZGVdPSh0NCArIHQ2ICsgMip0NSArIDIgKyBsMyo0ICsgMik+PjM7CisgICAgc3JjWzMrMipzdHJpZGVdPQorICAgIHNyY1syKzMqc3RyaWRlXT0odDUgKyB0NyArIDIqdDYgKyAyICsgbDMqNCArIDIpPj4zOworICAgIHNyY1szKzMqc3RyaWRlXT0odDYgKyB0NyArIDEgKyAyKmwzICsgMSk+PjI7Cit9CisKK3N0YXRpYyB2b2lkIHByZWQ0eDRfdmVydGljYWxfbGVmdF9ydjQwKHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGwwLCBjb25zdCBpbnQgbDEsIGNvbnN0IGludCBsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsMywgY29uc3QgaW50IGw0KQoreworICAgIExPQURfVE9QX0VER0UKKyAgICBMT0FEX1RPUF9SSUdIVF9FREdFCisKKyAgICBzcmNbMCswKnN0cmlkZV09KDIqdDAgKyAyKnQxICsgbDEgKyAyKmwyICsgbDMgKyA0KT4+MzsKKyAgICBzcmNbMSswKnN0cmlkZV09CisgICAgc3JjWzArMipzdHJpZGVdPSh0MSArIHQyICsgMSk+PjE7CisgICAgc3JjWzIrMCpzdHJpZGVdPQorICAgIHNyY1sxKzIqc3RyaWRlXT0odDIgKyB0MyArIDEpPj4xOworICAgIHNyY1szKzAqc3RyaWRlXT0KKyAgICBzcmNbMisyKnN0cmlkZV09KHQzICsgdDQrIDEpPj4xOworICAgIHNyY1szKzIqc3RyaWRlXT0odDQgKyB0NSsgMSk+PjE7CisgICAgc3JjWzArMSpzdHJpZGVdPSh0MCArIDIqdDEgKyB0MiArIGwyICsgMipsMyArIGw0ICsgNCk+PjM7CisgICAgc3JjWzErMSpzdHJpZGVdPQorICAgIHNyY1swKzMqc3RyaWRlXT0odDEgKyAyKnQyICsgdDMgKyAyKT4+MjsKKyAgICBzcmNbMisxKnN0cmlkZV09CisgICAgc3JjWzErMypzdHJpZGVdPSh0MiArIDIqdDMgKyB0NCArIDIpPj4yOworICAgIHNyY1szKzEqc3RyaWRlXT0KKyAgICBzcmNbMiszKnN0cmlkZV09KHQzICsgMip0NCArIHQ1ICsgMik+PjI7CisgICAgc3JjWzMrMypzdHJpZGVdPSh0NCArIDIqdDUgKyB0NiArIDIpPj4yOworfQorCitzdGF0aWMgdm9pZCBwcmVkNHg0X3ZlcnRpY2FsX2xlZnRfcnY0MF9jKHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgTE9BRF9MRUZUX0VER0UKKyAgICBMT0FEX0RPV05fTEVGVF9FREdFCisKKyAgICBwcmVkNHg0X3ZlcnRpY2FsX2xlZnRfcnY0MChzcmMsIHRvcHJpZ2h0LCBzdHJpZGUsIGwwLCBsMSwgbDIsIGwzLCBsNCk7Cit9CisKK3N0YXRpYyB2b2lkIHByZWQ0eDRfdmVydGljYWxfbGVmdF9ydjQwX25vZG93bl9jKHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBMT0FEX0xFRlRfRURHRQorCisgICAgcHJlZDR4NF92ZXJ0aWNhbF9sZWZ0X3J2NDAoc3JjLCB0b3ByaWdodCwgc3RyaWRlLCBsMCwgbDEsIGwyLCBsMywgbDMpOworfQorCitzdGF0aWMgdm9pZCBwcmVkNHg0X3ZlcnRpY2FsX2xlZnRfdnA4X2ModWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp0b3ByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIExPQURfVE9QX0VER0UKKyAgICBMT0FEX1RPUF9SSUdIVF9FREdFCisKKyAgICBzcmNbMCswKnN0cmlkZV09KHQwICsgdDEgKyAxKT4+MTsKKyAgICBzcmNbMSswKnN0cmlkZV09CisgICAgc3JjWzArMipzdHJpZGVdPSh0MSArIHQyICsgMSk+PjE7CisgICAgc3JjWzIrMCpzdHJpZGVdPQorICAgIHNyY1sxKzIqc3RyaWRlXT0odDIgKyB0MyArIDEpPj4xOworICAgIHNyY1szKzAqc3RyaWRlXT0KKyAgICBzcmNbMisyKnN0cmlkZV09KHQzICsgdDQgKyAxKT4+MTsKKyAgICBzcmNbMCsxKnN0cmlkZV09KHQwICsgMip0MSArIHQyICsgMik+PjI7CisgICAgc3JjWzErMSpzdHJpZGVdPQorICAgIHNyY1swKzMqc3RyaWRlXT0odDEgKyAyKnQyICsgdDMgKyAyKT4+MjsKKyAgICBzcmNbMisxKnN0cmlkZV09CisgICAgc3JjWzErMypzdHJpZGVdPSh0MiArIDIqdDMgKyB0NCArIDIpPj4yOworICAgIHNyY1szKzEqc3RyaWRlXT0KKyAgICBzcmNbMiszKnN0cmlkZV09KHQzICsgMip0NCArIHQ1ICsgMik+PjI7CisgICAgc3JjWzMrMipzdHJpZGVdPSh0NCArIDIqdDUgKyB0NiArIDIpPj4yOworICAgIHNyY1szKzMqc3RyaWRlXT0odDUgKyAyKnQ2ICsgdDcgKyAyKT4+MjsKK30KKworc3RhdGljIHZvaWQgcHJlZDR4NF9ob3Jpem9udGFsX3VwX3J2NDBfYyh1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIExPQURfTEVGVF9FREdFCisgICAgTE9BRF9ET1dOX0xFRlRfRURHRQorICAgIExPQURfVE9QX0VER0UKKyAgICBMT0FEX1RPUF9SSUdIVF9FREdFCisKKyAgICBzcmNbMCswKnN0cmlkZV09KHQxICsgMip0MiArIHQzICsgMipsMCArIDIqbDEgKyA0KT4+MzsKKyAgICBzcmNbMSswKnN0cmlkZV09KHQyICsgMip0MyArIHQ0ICsgbDAgKyAyKmwxICsgbDIgKyA0KT4+MzsKKyAgICBzcmNbMiswKnN0cmlkZV09CisgICAgc3JjWzArMSpzdHJpZGVdPSh0MyArIDIqdDQgKyB0NSArIDIqbDEgKyAyKmwyICsgNCk+PjM7CisgICAgc3JjWzMrMCpzdHJpZGVdPQorICAgIHNyY1sxKzEqc3RyaWRlXT0odDQgKyAyKnQ1ICsgdDYgKyBsMSArIDIqbDIgKyBsMyArIDQpPj4zOworICAgIHNyY1syKzEqc3RyaWRlXT0KKyAgICBzcmNbMCsyKnN0cmlkZV09KHQ1ICsgMip0NiArIHQ3ICsgMipsMiArIDIqbDMgKyA0KT4+MzsKKyAgICBzcmNbMysxKnN0cmlkZV09CisgICAgc3JjWzErMipzdHJpZGVdPSh0NiArIDMqdDcgKyBsMiArIDMqbDMgKyA0KT4+MzsKKyAgICBzcmNbMysyKnN0cmlkZV09CisgICAgc3JjWzErMypzdHJpZGVdPShsMyArIDIqbDQgKyBsNSArIDIpPj4yOworICAgIHNyY1swKzMqc3RyaWRlXT0KKyAgICBzcmNbMisyKnN0cmlkZV09KHQ2ICsgdDcgKyBsMyArIGw0ICsgMik+PjI7CisgICAgc3JjWzIrMypzdHJpZGVdPShsNCArIGw1ICsgMSk+PjE7CisgICAgc3JjWzMrMypzdHJpZGVdPShsNCArIDIqbDUgKyBsNiArIDIpPj4yOworfQorCitzdGF0aWMgdm9pZCBwcmVkNHg0X2hvcml6b250YWxfdXBfcnY0MF9ub2Rvd25fYyh1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0b3ByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgTE9BRF9MRUZUX0VER0UKKyAgICBMT0FEX1RPUF9FREdFCisgICAgTE9BRF9UT1BfUklHSFRfRURHRQorCisgICAgc3JjWzArMCpzdHJpZGVdPSh0MSArIDIqdDIgKyB0MyArIDIqbDAgKyAyKmwxICsgNCk+PjM7CisgICAgc3JjWzErMCpzdHJpZGVdPSh0MiArIDIqdDMgKyB0NCArIGwwICsgMipsMSArIGwyICsgNCk+PjM7CisgICAgc3JjWzIrMCpzdHJpZGVdPQorICAgIHNyY1swKzEqc3RyaWRlXT0odDMgKyAyKnQ0ICsgdDUgKyAyKmwxICsgMipsMiArIDQpPj4zOworICAgIHNyY1szKzAqc3RyaWRlXT0KKyAgICBzcmNbMSsxKnN0cmlkZV09KHQ0ICsgMip0NSArIHQ2ICsgbDEgKyAyKmwyICsgbDMgKyA0KT4+MzsKKyAgICBzcmNbMisxKnN0cmlkZV09CisgICAgc3JjWzArMipzdHJpZGVdPSh0NSArIDIqdDYgKyB0NyArIDIqbDIgKyAyKmwzICsgNCk+PjM7CisgICAgc3JjWzMrMSpzdHJpZGVdPQorICAgIHNyY1sxKzIqc3RyaWRlXT0odDYgKyAzKnQ3ICsgbDIgKyAzKmwzICsgNCk+PjM7CisgICAgc3JjWzMrMipzdHJpZGVdPQorICAgIHNyY1sxKzMqc3RyaWRlXT1sMzsKKyAgICBzcmNbMCszKnN0cmlkZV09CisgICAgc3JjWzIrMipzdHJpZGVdPSh0NiArIHQ3ICsgMipsMyArIDIpPj4yOworICAgIHNyY1syKzMqc3RyaWRlXT0KKyAgICBzcmNbMyszKnN0cmlkZV09bDM7Cit9CisKK3N0YXRpYyB2b2lkIHByZWQ0eDRfdG1fdnA4X2ModWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp0b3ByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QIC0gc3JjWy0xLXN0cmlkZV07CisgICAgdWludDhfdCAqdG9wID0gc3JjLXN0cmlkZTsKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqY21faW4gPSBjbSArIHNyY1stMV07CisgICAgICAgIHNyY1swXSA9IGNtX2luW3RvcFswXV07CisgICAgICAgIHNyY1sxXSA9IGNtX2luW3RvcFsxXV07CisgICAgICAgIHNyY1syXSA9IGNtX2luW3RvcFsyXV07CisgICAgICAgIHNyY1szXSA9IGNtX2luW3RvcFszXV07CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVkMTZ4MTZfcGxhbmVfc3ZxM19jKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBwcmVkMTZ4MTZfcGxhbmVfY29tcGF0XzhfYyhzcmMsIHN0cmlkZSwgMSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHByZWQxNngxNl9wbGFuZV9ydjQwX2ModWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHByZWQxNngxNl9wbGFuZV9jb21wYXRfOF9jKHNyYywgc3RyaWRlLCAwLCAxKTsKK30KKworc3RhdGljIHZvaWQgcHJlZDE2eDE2X3RtX3ZwOF9jKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QIC0gc3JjWy0xLXN0cmlkZV07CisgICAgdWludDhfdCAqdG9wID0gc3JjLXN0cmlkZTsKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNtX2luID0gY20gKyBzcmNbLTFdOworICAgICAgICBzcmNbMF0gID0gY21faW5bdG9wWzBdXTsKKyAgICAgICAgc3JjWzFdICA9IGNtX2luW3RvcFsxXV07CisgICAgICAgIHNyY1syXSAgPSBjbV9pblt0b3BbMl1dOworICAgICAgICBzcmNbM10gID0gY21faW5bdG9wWzNdXTsKKyAgICAgICAgc3JjWzRdICA9IGNtX2luW3RvcFs0XV07CisgICAgICAgIHNyY1s1XSAgPSBjbV9pblt0b3BbNV1dOworICAgICAgICBzcmNbNl0gID0gY21faW5bdG9wWzZdXTsKKyAgICAgICAgc3JjWzddICA9IGNtX2luW3RvcFs3XV07CisgICAgICAgIHNyY1s4XSAgPSBjbV9pblt0b3BbOF1dOworICAgICAgICBzcmNbOV0gID0gY21faW5bdG9wWzldXTsKKyAgICAgICAgc3JjWzEwXSA9IGNtX2luW3RvcFsxMF1dOworICAgICAgICBzcmNbMTFdID0gY21faW5bdG9wWzExXV07CisgICAgICAgIHNyY1sxMl0gPSBjbV9pblt0b3BbMTJdXTsKKyAgICAgICAgc3JjWzEzXSA9IGNtX2luW3RvcFsxM11dOworICAgICAgICBzcmNbMTRdID0gY21faW5bdG9wWzE0XV07CisgICAgICAgIHNyY1sxNV0gPSBjbV9pblt0b3BbMTVdXTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHByZWQ4eDhfbGVmdF9kY19ydjQwX2ModWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGRjMDsKKworICAgIGRjMD0wOworICAgIGZvcihpPTA7aTw4OyBpKyspCisgICAgICAgIGRjMCs9IHNyY1stMStpKnN0cmlkZV07CisgICAgZGMwPSAweDAxMDEwMTAxKigoZGMwICsgNCk+PjMpOworCisgICAgZm9yKGk9MDsgaTw4OyBpKyspeworICAgICAgICAoKHVpbnQzMl90Kikoc3JjK2kqc3RyaWRlKSlbMF09CisgICAgICAgICgodWludDMyX3QqKShzcmMraSpzdHJpZGUpKVsxXT0gZGMwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHJlZDh4OF90b3BfZGNfcnY0MF9jKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBkYzA7CisKKyAgICBkYzA9MDsKKyAgICBmb3IoaT0wO2k8ODsgaSsrKQorICAgICAgICBkYzArPSBzcmNbaS1zdHJpZGVdOworICAgIGRjMD0gMHgwMTAxMDEwMSooKGRjMCArIDQpPj4zKTsKKworICAgIGZvcihpPTA7IGk8ODsgaSsrKXsKKyAgICAgICAgKCh1aW50MzJfdCopKHNyYytpKnN0cmlkZSkpWzBdPQorICAgICAgICAoKHVpbnQzMl90Kikoc3JjK2kqc3RyaWRlKSlbMV09IGRjMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHByZWQ4eDhfZGNfcnY0MF9jKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBkYzAgPSAwOworCisgICAgZm9yKGk9MDtpPDQ7IGkrKyl7CisgICAgICAgIGRjMCs9IHNyY1stMStpKnN0cmlkZV0gKyBzcmNbaS1zdHJpZGVdOworICAgICAgICBkYzArPSBzcmNbNCtpLXN0cmlkZV07CisgICAgICAgIGRjMCs9IHNyY1stMSsoaSs0KSpzdHJpZGVdOworICAgIH0KKyAgICBkYzA9IDB4MDEwMTAxMDEqKChkYzAgKyA4KT4+NCk7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7CisgICAgICAgICgodWludDMyX3QqKShzcmMraSpzdHJpZGUpKVswXT0gZGMwOworICAgICAgICAoKHVpbnQzMl90Kikoc3JjK2kqc3RyaWRlKSlbMV09IGRjMDsKKyAgICB9CisgICAgZm9yKGk9NDsgaTw4OyBpKyspeworICAgICAgICAoKHVpbnQzMl90Kikoc3JjK2kqc3RyaWRlKSlbMF09IGRjMDsKKyAgICAgICAgKCh1aW50MzJfdCopKHNyYytpKnN0cmlkZSkpWzFdPSBkYzA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVkOHg4X3RtX3ZwOF9jKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QIC0gc3JjWy0xLXN0cmlkZV07CisgICAgdWludDhfdCAqdG9wID0gc3JjLXN0cmlkZTsKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqY21faW4gPSBjbSArIHNyY1stMV07CisgICAgICAgIHNyY1swXSA9IGNtX2luW3RvcFswXV07CisgICAgICAgIHNyY1sxXSA9IGNtX2luW3RvcFsxXV07CisgICAgICAgIHNyY1syXSA9IGNtX2luW3RvcFsyXV07CisgICAgICAgIHNyY1szXSA9IGNtX2luW3RvcFszXV07CisgICAgICAgIHNyY1s0XSA9IGNtX2luW3RvcFs0XV07CisgICAgICAgIHNyY1s1XSA9IGNtX2luW3RvcFs1XV07CisgICAgICAgIHNyY1s2XSA9IGNtX2luW3RvcFs2XV07CisgICAgICAgIHNyY1s3XSA9IGNtX2luW3RvcFs3XV07CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQorCisvKioKKyAqIFNldCB0aGUgaW50cmEgcHJlZGljdGlvbiBmdW5jdGlvbiBwb2ludGVycy4KKyAqLworYXZfY29sZCB2b2lkIGZmX2gyNjRfcHJlZF9pbml0KEgyNjRQcmVkQ29udGV4dCAqaCwgaW50IGNvZGVjX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNocm9tYV9mb3JtYXRfaWRjKQoreworI3VuZGVmIEZVTkMKKyN1bmRlZiBGVU5DQworI2RlZmluZSBGVU5DKGEsIGRlcHRoKSBhICMjIF8gIyMgZGVwdGgKKyNkZWZpbmUgRlVOQ0MoYSwgZGVwdGgpIGEgIyMgXyAjIyBkZXB0aCAjIyBfYworI2RlZmluZSBGVU5DRChhKSBhICMjIF9jCisKKyNkZWZpbmUgSDI2NF9QUkVEKGRlcHRoKSBcCisgICAgaWYoY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUlY0MCl7XAorICAgICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA3IHx8IGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOCkge1wKKyAgICAgICAgICAgIGgtPnByZWQ0eDRbVkVSVF9QUkVEICAgICAgIF09IEZVTkNEKHByZWQ0eDRfdmVydGljYWxfdnA4KTtcCisgICAgICAgICAgICBoLT5wcmVkNHg0W0hPUl9QUkVEICAgICAgICBdPSBGVU5DRChwcmVkNHg0X2hvcml6b250YWxfdnA4KTtcCisgICAgICAgIH0gZWxzZSB7XAorICAgICAgICAgICAgaC0+cHJlZDR4NFtWRVJUX1BSRUQgICAgICAgXT0gRlVOQ0MocHJlZDR4NF92ZXJ0aWNhbCAgICAgICAgICAsIGRlcHRoKTtcCisgICAgICAgICAgICBoLT5wcmVkNHg0W0hPUl9QUkVEICAgICAgICBdPSBGVU5DQyhwcmVkNHg0X2hvcml6b250YWwgICAgICAgICwgZGVwdGgpO1wKKyAgICAgICAgfVwKKyAgICAgICAgaC0+cHJlZDR4NFtEQ19QUkVEICAgICAgICAgICAgIF09IEZVTkNDKHByZWQ0eDRfZGMgICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICBpZihjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TVlEzKVwKKyAgICAgICAgICAgIGgtPnByZWQ0eDRbRElBR19ET1dOX0xFRlRfUFJFRCBdPSBGVU5DRChwcmVkNHg0X2Rvd25fbGVmdF9zdnEzKTtcCisgICAgICAgIGVsc2VcCisgICAgICAgICAgICBoLT5wcmVkNHg0W0RJQUdfRE9XTl9MRUZUX1BSRUQgXT0gRlVOQ0MocHJlZDR4NF9kb3duX2xlZnQgICAgICwgZGVwdGgpO1wKKyAgICAgICAgaC0+cHJlZDR4NFtESUFHX0RPV05fUklHSFRfUFJFRF09IEZVTkNDKHByZWQ0eDRfZG93bl9yaWdodCAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICBoLT5wcmVkNHg0W1ZFUlRfUklHSFRfUFJFRCAgICAgXT0gRlVOQ0MocHJlZDR4NF92ZXJ0aWNhbF9yaWdodCAgICAsIGRlcHRoKTtcCisgICAgICAgIGgtPnByZWQ0eDRbSE9SX0RPV05fUFJFRCAgICAgICBdPSBGVU5DQyhwcmVkNHg0X2hvcml6b250YWxfZG93biAgICwgZGVwdGgpO1wKKyAgICAgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNyB8fCBjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDgpIHtcCisgICAgICAgICAgICBoLT5wcmVkNHg0W1ZFUlRfTEVGVF9QUkVEICBdPSBGVU5DRChwcmVkNHg0X3ZlcnRpY2FsX2xlZnRfdnA4KTtcCisgICAgICAgIH0gZWxzZVwKKyAgICAgICAgICAgIGgtPnByZWQ0eDRbVkVSVF9MRUZUX1BSRUQgIF09IEZVTkNDKHByZWQ0eDRfdmVydGljYWxfbGVmdCAgICAgLCBkZXB0aCk7XAorICAgICAgICBoLT5wcmVkNHg0W0hPUl9VUF9QUkVEICAgICAgICAgXT0gRlVOQ0MocHJlZDR4NF9ob3Jpem9udGFsX3VwICAgICAsIGRlcHRoKTtcCisgICAgICAgIGlmIChjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WUDcgJiYgY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVlA4KSB7XAorICAgICAgICAgICAgaC0+cHJlZDR4NFtMRUZUX0RDX1BSRUQgICAgXT0gRlVOQ0MocHJlZDR4NF9sZWZ0X2RjICAgICAgICAgICAsIGRlcHRoKTtcCisgICAgICAgICAgICBoLT5wcmVkNHg0W1RPUF9EQ19QUkVEICAgICBdPSBGVU5DQyhwcmVkNHg0X3RvcF9kYyAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICAgICAgfSBlbHNlIHtcCisgICAgICAgICAgICBoLT5wcmVkNHg0W1RNX1ZQOF9QUkVEICAgICBdPSBGVU5DRChwcmVkNHg0X3RtX3ZwOCk7XAorICAgICAgICAgICAgaC0+cHJlZDR4NFtEQ18xMjdfUFJFRCAgICAgXT0gRlVOQ0MocHJlZDR4NF8xMjdfZGMgICAgICAgICAgICAsIGRlcHRoKTtcCisgICAgICAgICAgICBoLT5wcmVkNHg0W0RDXzEyOV9QUkVEICAgICBdPSBGVU5DQyhwcmVkNHg0XzEyOV9kYyAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICAgICAgICAgIGgtPnByZWQ0eDRbVkVSVF9WUDhfUFJFRCAgIF09IEZVTkNDKHByZWQ0eDRfdmVydGljYWwgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICAgICAgaC0+cHJlZDR4NFtIT1JfVlA4X1BSRUQgICAgXT0gRlVOQ0MocHJlZDR4NF9ob3Jpem9udGFsICAgICAgICAsIGRlcHRoKTtcCisgICAgICAgIH1cCisgICAgICAgIGlmIChjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WUDgpXAorICAgICAgICAgICAgaC0+cHJlZDR4NFtEQ18xMjhfUFJFRCAgICAgXT0gRlVOQ0MocHJlZDR4NF8xMjhfZGMgICAgICAgICAgICAsIGRlcHRoKTtcCisgICAgfWVsc2V7XAorICAgICAgICBoLT5wcmVkNHg0W1ZFUlRfUFJFRCAgICAgICAgICAgXT0gRlVOQ0MocHJlZDR4NF92ZXJ0aWNhbCAgICAgICAgICAsIGRlcHRoKTtcCisgICAgICAgIGgtPnByZWQ0eDRbSE9SX1BSRUQgICAgICAgICAgICBdPSBGVU5DQyhwcmVkNHg0X2hvcml6b250YWwgICAgICAgICwgZGVwdGgpO1wKKyAgICAgICAgaC0+cHJlZDR4NFtEQ19QUkVEICAgICAgICAgICAgIF09IEZVTkNDKHByZWQ0eDRfZGMgICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICBoLT5wcmVkNHg0W0RJQUdfRE9XTl9MRUZUX1BSRUQgXT0gRlVOQ0QocHJlZDR4NF9kb3duX2xlZnRfcnY0MCk7XAorICAgICAgICBoLT5wcmVkNHg0W0RJQUdfRE9XTl9SSUdIVF9QUkVEXT0gRlVOQ0MocHJlZDR4NF9kb3duX3JpZ2h0ICAgICAgICAsIGRlcHRoKTtcCisgICAgICAgIGgtPnByZWQ0eDRbVkVSVF9SSUdIVF9QUkVEICAgICBdPSBGVU5DQyhwcmVkNHg0X3ZlcnRpY2FsX3JpZ2h0ICAgICwgZGVwdGgpO1wKKyAgICAgICAgaC0+cHJlZDR4NFtIT1JfRE9XTl9QUkVEICAgICAgIF09IEZVTkNDKHByZWQ0eDRfaG9yaXpvbnRhbF9kb3duICAgLCBkZXB0aCk7XAorICAgICAgICBoLT5wcmVkNHg0W1ZFUlRfTEVGVF9QUkVEICAgICAgXT0gRlVOQ0QocHJlZDR4NF92ZXJ0aWNhbF9sZWZ0X3J2NDApO1wKKyAgICAgICAgaC0+cHJlZDR4NFtIT1JfVVBfUFJFRCAgICAgICAgIF09IEZVTkNEKHByZWQ0eDRfaG9yaXpvbnRhbF91cF9ydjQwKTtcCisgICAgICAgIGgtPnByZWQ0eDRbTEVGVF9EQ19QUkVEICAgICAgICBdPSBGVU5DQyhwcmVkNHg0X2xlZnRfZGMgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICAgICAgaC0+cHJlZDR4NFtUT1BfRENfUFJFRCAgICAgICAgIF09IEZVTkNDKHByZWQ0eDRfdG9wX2RjICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICBoLT5wcmVkNHg0W0RDXzEyOF9QUkVEICAgICAgICAgXT0gRlVOQ0MocHJlZDR4NF8xMjhfZGMgICAgICAgICAgICAsIGRlcHRoKTtcCisgICAgICAgIGgtPnByZWQ0eDRbRElBR19ET1dOX0xFRlRfUFJFRF9SVjQwX05PRE9XTl09IEZVTkNEKHByZWQ0eDRfZG93bl9sZWZ0X3J2NDBfbm9kb3duKTtcCisgICAgICAgIGgtPnByZWQ0eDRbSE9SX1VQX1BSRURfUlY0MF9OT0RPV05dPSBGVU5DRChwcmVkNHg0X2hvcml6b250YWxfdXBfcnY0MF9ub2Rvd24pO1wKKyAgICAgICAgaC0+cHJlZDR4NFtWRVJUX0xFRlRfUFJFRF9SVjQwX05PRE9XTl09IEZVTkNEKHByZWQ0eDRfdmVydGljYWxfbGVmdF9ydjQwX25vZG93bik7XAorICAgIH1cCitcCisgICAgaC0+cHJlZDh4OGxbVkVSVF9QUkVEICAgICAgICAgICBdPSBGVU5DQyhwcmVkOHg4bF92ZXJ0aWNhbCAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICBoLT5wcmVkOHg4bFtIT1JfUFJFRCAgICAgICAgICAgIF09IEZVTkNDKHByZWQ4eDhsX2hvcml6b250YWwgICAgICAgICAgLCBkZXB0aCk7XAorICAgIGgtPnByZWQ4eDhsW0RDX1BSRUQgICAgICAgICAgICAgXT0gRlVOQ0MocHJlZDh4OGxfZGMgICAgICAgICAgICAgICAgICAsIGRlcHRoKTtcCisgICAgaC0+cHJlZDh4OGxbRElBR19ET1dOX0xFRlRfUFJFRCBdPSBGVU5DQyhwcmVkOHg4bF9kb3duX2xlZnQgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICBoLT5wcmVkOHg4bFtESUFHX0RPV05fUklHSFRfUFJFRF09IEZVTkNDKHByZWQ4eDhsX2Rvd25fcmlnaHQgICAgICAgICAgLCBkZXB0aCk7XAorICAgIGgtPnByZWQ4eDhsW1ZFUlRfUklHSFRfUFJFRCAgICAgXT0gRlVOQ0MocHJlZDh4OGxfdmVydGljYWxfcmlnaHQgICAgICAsIGRlcHRoKTtcCisgICAgaC0+cHJlZDh4OGxbSE9SX0RPV05fUFJFRCAgICAgICBdPSBGVU5DQyhwcmVkOHg4bF9ob3Jpem9udGFsX2Rvd24gICAgICwgZGVwdGgpO1wKKyAgICBoLT5wcmVkOHg4bFtWRVJUX0xFRlRfUFJFRCAgICAgIF09IEZVTkNDKHByZWQ4eDhsX3ZlcnRpY2FsX2xlZnQgICAgICAgLCBkZXB0aCk7XAorICAgIGgtPnByZWQ4eDhsW0hPUl9VUF9QUkVEICAgICAgICAgXT0gRlVOQ0MocHJlZDh4OGxfaG9yaXpvbnRhbF91cCAgICAgICAsIGRlcHRoKTtcCisgICAgaC0+cHJlZDh4OGxbTEVGVF9EQ19QUkVEICAgICAgICBdPSBGVU5DQyhwcmVkOHg4bF9sZWZ0X2RjICAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICBoLT5wcmVkOHg4bFtUT1BfRENfUFJFRCAgICAgICAgIF09IEZVTkNDKHByZWQ4eDhsX3RvcF9kYyAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgIGgtPnByZWQ4eDhsW0RDXzEyOF9QUkVEICAgICAgICAgXT0gRlVOQ0MocHJlZDh4OGxfMTI4X2RjICAgICAgICAgICAgICAsIGRlcHRoKTtcCitcCisgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpIHtcCisgICAgICAgIGgtPnByZWQ4eDhbVkVSVF9QUkVEOHg4ICAgXT0gRlVOQ0MocHJlZDh4OF92ZXJ0aWNhbCAgICAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICAgICAgaC0+cHJlZDh4OFtIT1JfUFJFRDh4OCAgICBdPSBGVU5DQyhwcmVkOHg4X2hvcml6b250YWwgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgIH0gZWxzZSB7XAorICAgICAgICBoLT5wcmVkOHg4W1ZFUlRfUFJFRDh4OCAgIF09IEZVTkNDKHByZWQ4eDE2X3ZlcnRpY2FsICAgICAgICAgICAgICAsIGRlcHRoKTtcCisgICAgICAgIGgtPnByZWQ4eDhbSE9SX1BSRUQ4eDggICAgXT0gRlVOQ0MocHJlZDh4MTZfaG9yaXpvbnRhbCAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICB9XAorICAgIGlmIChjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WUDcgJiYgY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVlA4KSB7XAorICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkge1wKKyAgICAgICAgICAgIGgtPnByZWQ4eDhbUExBTkVfUFJFRDh4OF09IEZVTkNDKHByZWQ4eDhfcGxhbmUgICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICB9IGVsc2Uge1wKKyAgICAgICAgICAgIGgtPnByZWQ4eDhbUExBTkVfUFJFRDh4OF09IEZVTkNDKHByZWQ4eDE2X3BsYW5lICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICB9XAorICAgIH0gZWxzZVwKKyAgICAgICAgaC0+cHJlZDh4OFtQTEFORV9QUkVEOHg4XT0gRlVOQ0QocHJlZDh4OF90bV92cDgpO1wKKyAgICBpZiAoY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUlY0MCAmJiBjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WUDcgJiYgXAorICAgICAgICBjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WUDgpIHtcCisgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA8PSAxKSB7XAorICAgICAgICAgICAgaC0+cHJlZDh4OFtEQ19QUkVEOHg4ICAgICBdPSBGVU5DQyhwcmVkOHg4X2RjICAgICAgICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICAgICAgaC0+cHJlZDh4OFtMRUZUX0RDX1BSRUQ4eDhdPSBGVU5DQyhwcmVkOHg4X2xlZnRfZGMgICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICAgICAgaC0+cHJlZDh4OFtUT1BfRENfUFJFRDh4OCBdPSBGVU5DQyhwcmVkOHg4X3RvcF9kYyAgICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICAgICAgaC0+cHJlZDh4OFtBTFpIRUlNRVJfRENfTDBUX1BSRUQ4eDggXT0gRlVOQyhwcmVkOHg4X21hZF9jb3dfZGNfbDB0LCBkZXB0aCk7XAorICAgICAgICAgICAgaC0+cHJlZDh4OFtBTFpIRUlNRVJfRENfMExUX1BSRUQ4eDggXT0gRlVOQyhwcmVkOHg4X21hZF9jb3dfZGNfMGx0LCBkZXB0aCk7XAorICAgICAgICAgICAgaC0+cHJlZDh4OFtBTFpIRUlNRVJfRENfTDAwX1BSRUQ4eDggXT0gRlVOQyhwcmVkOHg4X21hZF9jb3dfZGNfbDAwLCBkZXB0aCk7XAorICAgICAgICAgICAgaC0+cHJlZDh4OFtBTFpIRUlNRVJfRENfMEwwX1BSRUQ4eDggXT0gRlVOQyhwcmVkOHg4X21hZF9jb3dfZGNfMGwwLCBkZXB0aCk7XAorICAgICAgICB9IGVsc2Uge1wKKyAgICAgICAgICAgIGgtPnByZWQ4eDhbRENfUFJFRDh4OCAgICAgXT0gRlVOQ0MocHJlZDh4MTZfZGMgICAgICAgICAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICAgICAgICAgIGgtPnByZWQ4eDhbTEVGVF9EQ19QUkVEOHg4XT0gRlVOQ0MocHJlZDh4MTZfbGVmdF9kYyAgICAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICAgICAgICAgIGgtPnByZWQ4eDhbVE9QX0RDX1BSRUQ4eDggXT0gRlVOQ0MocHJlZDh4MTZfdG9wX2RjICAgICAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICAgICAgICAgIGgtPnByZWQ4eDhbQUxaSEVJTUVSX0RDX0wwVF9QUkVEOHg4IF09IEZVTkMocHJlZDh4MTZfbWFkX2Nvd19kY19sMHQsIGRlcHRoKTtcCisgICAgICAgICAgICBoLT5wcmVkOHg4W0FMWkhFSU1FUl9EQ18wTFRfUFJFRDh4OCBdPSBGVU5DKHByZWQ4eDE2X21hZF9jb3dfZGNfMGx0LCBkZXB0aCk7XAorICAgICAgICAgICAgaC0+cHJlZDh4OFtBTFpIRUlNRVJfRENfTDAwX1BSRUQ4eDggXT0gRlVOQyhwcmVkOHgxNl9tYWRfY293X2RjX2wwMCwgZGVwdGgpO1wKKyAgICAgICAgICAgIGgtPnByZWQ4eDhbQUxaSEVJTUVSX0RDXzBMMF9QUkVEOHg4IF09IEZVTkMocHJlZDh4MTZfbWFkX2Nvd19kY18wbDAsIGRlcHRoKTtcCisgICAgICAgIH1cCisgICAgfWVsc2V7XAorICAgICAgICBoLT5wcmVkOHg4W0RDX1BSRUQ4eDggICAgIF09IEZVTkNEKHByZWQ4eDhfZGNfcnY0MCk7XAorICAgICAgICBoLT5wcmVkOHg4W0xFRlRfRENfUFJFRDh4OF09IEZVTkNEKHByZWQ4eDhfbGVmdF9kY19ydjQwKTtcCisgICAgICAgIGgtPnByZWQ4eDhbVE9QX0RDX1BSRUQ4eDggXT0gRlVOQ0QocHJlZDh4OF90b3BfZGNfcnY0MCk7XAorICAgICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA3IHx8IGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOCkge1wKKyAgICAgICAgICAgIGgtPnByZWQ4eDhbRENfMTI3X1BSRUQ4eDhdPSBGVU5DQyhwcmVkOHg4XzEyN19kYyAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICAgICAgaC0+cHJlZDh4OFtEQ18xMjlfUFJFRDh4OF09IEZVTkNDKHByZWQ4eDhfMTI5X2RjICAgICAgICAgICAgICAsIGRlcHRoKTtcCisgICAgICAgIH1cCisgICAgfVwKKyAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkge1wKKyAgICAgICAgaC0+cHJlZDh4OFtEQ18xMjhfUFJFRDh4OCBdPSBGVU5DQyhwcmVkOHg4XzEyOF9kYyAgICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgIH0gZWxzZSB7XAorICAgICAgICBoLT5wcmVkOHg4W0RDXzEyOF9QUkVEOHg4IF09IEZVTkNDKHByZWQ4eDE2XzEyOF9kYyAgICAgICAgICAgICAgICAsIGRlcHRoKTtcCisgICAgfVwKK1wKKyAgICBoLT5wcmVkMTZ4MTZbRENfUFJFRDh4OCAgICAgXT0gRlVOQ0MocHJlZDE2eDE2X2RjICAgICAgICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgIGgtPnByZWQxNngxNltWRVJUX1BSRUQ4eDggICBdPSBGVU5DQyhwcmVkMTZ4MTZfdmVydGljYWwgICAgICAgICAgICAgICAsIGRlcHRoKTtcCisgICAgaC0+cHJlZDE2eDE2W0hPUl9QUkVEOHg4ICAgIF09IEZVTkNDKHByZWQxNngxNl9ob3Jpem9udGFsICAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICBzd2l0Y2goY29kZWNfaWQpe1wKKyAgICBjYXNlIEFWX0NPREVDX0lEX1NWUTM6XAorICAgICAgIGgtPnByZWQxNngxNltQTEFORV9QUkVEOHg4ICBdPSBGVU5DRChwcmVkMTZ4MTZfcGxhbmVfc3ZxMyk7XAorICAgICAgIGJyZWFrO1wKKyAgICBjYXNlIEFWX0NPREVDX0lEX1JWNDA6XAorICAgICAgIGgtPnByZWQxNngxNltQTEFORV9QUkVEOHg4ICBdPSBGVU5DRChwcmVkMTZ4MTZfcGxhbmVfcnY0MCk7XAorICAgICAgIGJyZWFrO1wKKyAgICBjYXNlIEFWX0NPREVDX0lEX1ZQNzpcCisgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDg6XAorICAgICAgIGgtPnByZWQxNngxNltQTEFORV9QUkVEOHg4ICBdPSBGVU5DRChwcmVkMTZ4MTZfdG1fdnA4KTtcCisgICAgICAgaC0+cHJlZDE2eDE2W0RDXzEyN19QUkVEOHg4XT0gRlVOQ0MocHJlZDE2eDE2XzEyN19kYyAgICAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICAgICBoLT5wcmVkMTZ4MTZbRENfMTI5X1BSRUQ4eDhdPSBGVU5DQyhwcmVkMTZ4MTZfMTI5X2RjICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgIGJyZWFrO1wKKyAgICBkZWZhdWx0OlwKKyAgICAgICBoLT5wcmVkMTZ4MTZbUExBTkVfUFJFRDh4OCAgXT0gRlVOQ0MocHJlZDE2eDE2X3BsYW5lICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgIGJyZWFrO1wKKyAgICB9XAorICAgIGgtPnByZWQxNngxNltMRUZUX0RDX1BSRUQ4eDhdPSBGVU5DQyhwcmVkMTZ4MTZfbGVmdF9kYyAgICAgICAgICAgICAgICAsIGRlcHRoKTtcCisgICAgaC0+cHJlZDE2eDE2W1RPUF9EQ19QUkVEOHg4IF09IEZVTkNDKHByZWQxNngxNl90b3BfZGMgICAgICAgICAgICAgICAgICwgZGVwdGgpO1wKKyAgICBoLT5wcmVkMTZ4MTZbRENfMTI4X1BSRUQ4eDggXT0gRlVOQ0MocHJlZDE2eDE2XzEyOF9kYyAgICAgICAgICAgICAgICAgLCBkZXB0aCk7XAorXAorICAgIC8qIHNwZWNpYWwgbG9zc2xlc3MgaC92IHByZWRpY3Rpb24gZm9yIGgyNjQgKi8gXAorICAgIGgtPnByZWQ0eDRfYWRkICBbVkVSVF9QUkVEICAgXT0gRlVOQ0MocHJlZDR4NF92ZXJ0aWNhbF9hZGQgICAgICAgICAgICAsIGRlcHRoKTtcCisgICAgaC0+cHJlZDR4NF9hZGQgIFsgSE9SX1BSRUQgICBdPSBGVU5DQyhwcmVkNHg0X2hvcml6b250YWxfYWRkICAgICAgICAgICwgZGVwdGgpO1wKKyAgICBoLT5wcmVkOHg4bF9hZGQgW1ZFUlRfUFJFRCAgIF09IEZVTkNDKHByZWQ4eDhsX3ZlcnRpY2FsX2FkZCAgICAgICAgICAgLCBkZXB0aCk7XAorICAgIGgtPnByZWQ4eDhsX2FkZCBbIEhPUl9QUkVEICAgXT0gRlVOQ0MocHJlZDh4OGxfaG9yaXpvbnRhbF9hZGQgICAgICAgICAsIGRlcHRoKTtcCisgICAgaC0+cHJlZDh4OGxfZmlsdGVyX2FkZCBbVkVSVF9QUkVEICAgXT0gRlVOQ0MocHJlZDh4OGxfdmVydGljYWxfZmlsdGVyX2FkZCAgICAgICAgICAgLCBkZXB0aCk7XAorICAgIGgtPnByZWQ4eDhsX2ZpbHRlcl9hZGQgWyBIT1JfUFJFRCAgIF09IEZVTkNDKHByZWQ4eDhsX2hvcml6b250YWxfZmlsdGVyX2FkZCAgICAgICAgICwgZGVwdGgpO1wKKyAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkge1wKKyAgICBoLT5wcmVkOHg4X2FkZCAgW1ZFUlRfUFJFRDh4OF09IEZVTkNDKHByZWQ4eDhfdmVydGljYWxfYWRkICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgIGgtPnByZWQ4eDhfYWRkICBbIEhPUl9QUkVEOHg4XT0gRlVOQ0MocHJlZDh4OF9ob3Jpem9udGFsX2FkZCAgICAgICAgICAsIGRlcHRoKTtcCisgICAgfSBlbHNlIHtcCisgICAgICAgIGgtPnByZWQ4eDhfYWRkICBbVkVSVF9QUkVEOHg4XT0gRlVOQ0MocHJlZDh4MTZfdmVydGljYWxfYWRkICAgICAgICAgICAgLCBkZXB0aCk7XAorICAgICAgICBoLT5wcmVkOHg4X2FkZCAgWyBIT1JfUFJFRDh4OF09IEZVTkNDKHByZWQ4eDE2X2hvcml6b250YWxfYWRkICAgICAgICAgICwgZGVwdGgpO1wKKyAgICB9XAorICAgIGgtPnByZWQxNngxNl9hZGRbVkVSVF9QUkVEOHg4XT0gRlVOQ0MocHJlZDE2eDE2X3ZlcnRpY2FsX2FkZCAgICAgICAgICAsIGRlcHRoKTtcCisgICAgaC0+cHJlZDE2eDE2X2FkZFsgSE9SX1BSRUQ4eDhdPSBGVU5DQyhwcmVkMTZ4MTZfaG9yaXpvbnRhbF9hZGQgICAgICAgICwgZGVwdGgpO1wKKworICAgIHN3aXRjaCAoYml0X2RlcHRoKSB7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIEgyNjRfUFJFRCg5KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICBIMjY0X1BSRUQoMTApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgIEgyNjRfUFJFRCgxMikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgSDI2NF9QUkVEKDE0KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQwKGJpdF9kZXB0aDw9OCk7CisgICAgICAgICAgICBIMjY0X1BSRUQoOCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChBUkNIX0FSTSkgZmZfaDI2NF9wcmVkX2luaXRfYXJtKGgsIGNvZGVjX2lkLCBiaXRfZGVwdGgsIGNocm9tYV9mb3JtYXRfaWRjKTsKKyAgICBpZiAoQVJDSF9YODYpIGZmX2gyNjRfcHJlZF9pbml0X3g4NihoLCBjb2RlY19pZCwgYml0X2RlcHRoLCBjaHJvbWFfZm9ybWF0X2lkYyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjY0cHJlZC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NHByZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzA4MjkyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NHByZWQuaApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIEguMjZML0guMjY0L0FWQy9KVlQvMTQ0OTYtMTAvLi4uIGVuY29kZXIvZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcHJlZGljdGlvbiBmdW5jdGlvbnMuCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2lmbmRlZiBBVkNPREVDX0gyNjRQUkVEX0gKKyNkZWZpbmUgQVZDT0RFQ19IMjY0UFJFRF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBQcmVkaWN0aW9uIHR5cGVzCisgKi8KKy8vQHsKKyNkZWZpbmUgVkVSVF9QUkVEICAgICAgICAgICAgICAwCisjZGVmaW5lIEhPUl9QUkVEICAgICAgICAgICAgICAgMQorI2RlZmluZSBEQ19QUkVEICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRElBR19ET1dOX0xFRlRfUFJFRCAgICAzCisjZGVmaW5lIERJQUdfRE9XTl9SSUdIVF9QUkVEICAgNAorI2RlZmluZSBWRVJUX1JJR0hUX1BSRUQgICAgICAgIDUKKyNkZWZpbmUgSE9SX0RPV05fUFJFRCAgICAgICAgICA2CisjZGVmaW5lIFZFUlRfTEVGVF9QUkVEICAgICAgICAgNworI2RlZmluZSBIT1JfVVBfUFJFRCAgICAgICAgICAgIDgKKworLy8gREMgZWRnZSAobm90IGZvciBWUDgpCisjZGVmaW5lIExFRlRfRENfUFJFRCAgICAgICAgICAgOQorI2RlZmluZSBUT1BfRENfUFJFRCAgICAgICAgICAgMTAKKyNkZWZpbmUgRENfMTI4X1BSRUQgICAgICAgICAgIDExCisKKy8vIFJWNDAgc3BlY2lmaWMKKyNkZWZpbmUgRElBR19ET1dOX0xFRlRfUFJFRF9SVjQwX05PRE9XTiAgIDEyCisjZGVmaW5lIEhPUl9VUF9QUkVEX1JWNDBfTk9ET1dOICAgICAgICAgICAxMworI2RlZmluZSBWRVJUX0xFRlRfUFJFRF9SVjQwX05PRE9XTiAgICAgICAgMTQKKworLy8gVlA4IHNwZWNpZmljCisjZGVmaW5lIFRNX1ZQOF9QUkVEICAgICAgICAgICAgOSAgICAvLy88ICJUcnVlIE1vdGlvbiIsIHVzZWQgaW5zdGVhZCBvZiBwbGFuZQorI2RlZmluZSBWRVJUX1ZQOF9QUkVEICAgICAgICAgMTAgICAgLy8vPCBmb3IgVlA4LCAjVkVSVF9QUkVEIGlzIHRoZSBhdmVyYWdlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IChsZWZ0IGNvbCtjdXIgY29sIHgyK3JpZ2h0IGNvbCkgLyA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0aGlzIGlzIHRoZSAidW5hdmVyYWdlZCIgb25lCisjZGVmaW5lIEhPUl9WUDhfUFJFRCAgICAgICAgICAxNCAgICAvLy88IHVuYXZlcmFnZWQgdmVyc2lvbiBvZiAjSE9SX1BSRUQsIHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCAjVkVSVF9WUDhfUFJFRCBmb3IgZGV0YWlscworI2RlZmluZSBEQ18xMjdfUFJFRCAgICAgICAgICAgMTIKKyNkZWZpbmUgRENfMTI5X1BSRUQgICAgICAgICAgIDEzCisKKyNkZWZpbmUgRENfUFJFRDh4OCAgICAgICAgICAgICAwCisjZGVmaW5lIEhPUl9QUkVEOHg4ICAgICAgICAgICAgMQorI2RlZmluZSBWRVJUX1BSRUQ4eDggICAgICAgICAgIDIKKyNkZWZpbmUgUExBTkVfUFJFRDh4OCAgICAgICAgICAzCisKKy8vIERDIGVkZ2UKKyNkZWZpbmUgTEVGVF9EQ19QUkVEOHg4ICAgICAgICA0CisjZGVmaW5lIFRPUF9EQ19QUkVEOHg4ICAgICAgICAgNQorI2RlZmluZSBEQ18xMjhfUFJFRDh4OCAgICAgICAgIDYKKworLy8gSDI2NC9TVlEzICg4eDgpIHNwZWNpZmljCisjZGVmaW5lIEFMWkhFSU1FUl9EQ19MMFRfUFJFRDh4OCAgNworI2RlZmluZSBBTFpIRUlNRVJfRENfMExUX1BSRUQ4eDggIDgKKyNkZWZpbmUgQUxaSEVJTUVSX0RDX0wwMF9QUkVEOHg4ICA5CisjZGVmaW5lIEFMWkhFSU1FUl9EQ18wTDBfUFJFRDh4OCAxMAorCisvLyBWUDggc3BlY2lmaWMKKyNkZWZpbmUgRENfMTI3X1BSRUQ4eDggICAgICAgICA3CisjZGVmaW5lIERDXzEyOV9QUkVEOHg4ICAgICAgICAgOAorLy9AfQorCisvKioKKyAqIENvbnRleHQgZm9yIHN0b3JpbmcgSC4yNjQgcHJlZGljdGlvbiBmdW5jdGlvbnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgSDI2NFByZWRDb250ZXh0IHsKKyAgICB2b2lkKCpwcmVkNHg0WzkgKyAzICsgM10pKHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKKyAgICB2b2lkKCpwcmVkOHg4bFs5ICsgM10pKHVpbnQ4X3QgKnNyYywgaW50IHRvcGxlZnQsIGludCB0b3ByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOworICAgIHZvaWQoKnByZWQ4eDhbNCArIDMgKyA0XSkodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKyAgICB2b2lkKCpwcmVkMTZ4MTZbNCArIDMgKyAyXSkodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKworICAgIHZvaWQoKnByZWQ0eDRfYWRkWzJdKSh1aW50OF90ICpwaXggLyphbGlnbiAgNCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jayAvKmFsaWduIDE2Ki8sIHB0cmRpZmZfdCBzdHJpZGUpOworICAgIHZvaWQoKnByZWQ4eDhsX2FkZFsyXSkodWludDhfdCAqcGl4IC8qYWxpZ24gIDgqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrIC8qYWxpZ24gMTYqLywgcHRyZGlmZl90IHN0cmlkZSk7CisgICAgdm9pZCgqcHJlZDh4OGxfZmlsdGVyX2FkZFsyXSkodWludDhfdCAqcGl4IC8qYWxpZ24gIDgqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrIC8qYWxpZ24gMTYqLywgaW50IHRvcGxlZnQsIGludCB0b3ByaWdodCwgcHRyZGlmZl90IHN0cmlkZSk7CisgICAgdm9pZCgqcHJlZDh4OF9hZGRbM10pKHVpbnQ4X3QgKnBpeCAvKmFsaWduICA4Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jayAvKmFsaWduIDE2Ki8sIHB0cmRpZmZfdCBzdHJpZGUpOworICAgIHZvaWQoKnByZWQxNngxNl9hZGRbM10pKHVpbnQ4X3QgKnBpeCAvKmFsaWduIDE2Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpibG9ja19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2sgLyphbGlnbiAxNiovLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK30gSDI2NFByZWRDb250ZXh0OworCit2b2lkIGZmX2gyNjRfcHJlZF9pbml0KEgyNjRQcmVkQ29udGV4dCAqaCwgaW50IGNvZGVjX2lkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYml0X2RlcHRoLCBjb25zdCBpbnQgY2hyb21hX2Zvcm1hdF9pZGMpOwordm9pZCBmZl9oMjY0X3ByZWRfaW5pdF9hcm0oSDI2NFByZWRDb250ZXh0ICpoLCBpbnQgY29kZWNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYml0X2RlcHRoLCBjb25zdCBpbnQgY2hyb21hX2Zvcm1hdF9pZGMpOwordm9pZCBmZl9oMjY0X3ByZWRfaW5pdF94ODYoSDI2NFByZWRDb250ZXh0ICpoLCBpbnQgY29kZWNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYml0X2RlcHRoLCBjb25zdCBpbnQgY2hyb21hX2Zvcm1hdF9pZGMpOworCisjZW5kaWYgLyogQVZDT0RFQ19IMjY0UFJFRF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjY0cHJlZF90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NHByZWRfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjg0NDMzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NHByZWRfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDEzNTUgQEAKKy8qCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBlbmNvZGVyL2RlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDExIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIHByZWRpY3Rpb24gZnVuY3Rpb25zLgorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKKyNpbmNsdWRlICJtYXRob3BzLmgiCisKKyNpbmNsdWRlICJiaXRfZGVwdGhfdGVtcGxhdGUuYyIKKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDR4NF92ZXJ0aWNhbCkodWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKyAgICBjb25zdCBwaXhlbDQgYT0gQVZfUk40UEEoc3JjLXN0cmlkZSk7CisKKyAgICBBVl9XTjRQQShzcmMrMCpzdHJpZGUsIGEpOworICAgIEFWX1dONFBBKHNyYysxKnN0cmlkZSwgYSk7CisgICAgQVZfV040UEEoc3JjKzIqc3RyaWRlLCBhKTsKKyAgICBBVl9XTjRQQShzcmMrMypzdHJpZGUsIGEpOworfQorCitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkNHg0X2hvcml6b250YWwpKHVpbnQ4X3QgKl9zcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKyAgICBBVl9XTjRQQShzcmMrMCpzdHJpZGUsIFBJWEVMX1NQTEFUX1g0KHNyY1stMSswKnN0cmlkZV0pKTsKKyAgICBBVl9XTjRQQShzcmMrMSpzdHJpZGUsIFBJWEVMX1NQTEFUX1g0KHNyY1stMSsxKnN0cmlkZV0pKTsKKyAgICBBVl9XTjRQQShzcmMrMipzdHJpZGUsIFBJWEVMX1NQTEFUX1g0KHNyY1stMSsyKnN0cmlkZV0pKTsKKyAgICBBVl9XTjRQQShzcmMrMypzdHJpZGUsIFBJWEVMX1NQTEFUX1g0KHNyY1stMSszKnN0cmlkZV0pKTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDR4NF9kYykodWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKyAgICBjb25zdCBpbnQgZGM9ICggIHNyY1stc3RyaWRlXSArIHNyY1sxLXN0cmlkZV0gKyBzcmNbMi1zdHJpZGVdICsgc3JjWzMtc3RyaWRlXQorICAgICAgICAgICAgICAgICAgICsgc3JjWy0xKzAqc3RyaWRlXSArIHNyY1stMSsxKnN0cmlkZV0gKyBzcmNbLTErMipzdHJpZGVdICsgc3JjWy0xKzMqc3RyaWRlXSArIDQpID4+MzsKKyAgICBjb25zdCBwaXhlbDQgYSA9IFBJWEVMX1NQTEFUX1g0KGRjKTsKKworICAgIEFWX1dONFBBKHNyYyswKnN0cmlkZSwgYSk7CisgICAgQVZfV040UEEoc3JjKzEqc3RyaWRlLCBhKTsKKyAgICBBVl9XTjRQQShzcmMrMipzdHJpZGUsIGEpOworICAgIEFWX1dONFBBKHNyYyszKnN0cmlkZSwgYSk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ0eDRfbGVmdF9kYykodWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICAgIGNvbnN0IGludCBkYz0gKCAgc3JjWy0xKzAqc3RyaWRlXSArIHNyY1stMSsxKnN0cmlkZV0gKyBzcmNbLTErMipzdHJpZGVdICsgc3JjWy0xKzMqc3RyaWRlXSArIDIpID4+MjsKKyAgICBjb25zdCBwaXhlbDQgYSA9IFBJWEVMX1NQTEFUX1g0KGRjKTsKKworICAgIEFWX1dONFBBKHNyYyswKnN0cmlkZSwgYSk7CisgICAgQVZfV040UEEoc3JjKzEqc3RyaWRlLCBhKTsKKyAgICBBVl9XTjRQQShzcmMrMipzdHJpZGUsIGEpOworICAgIEFWX1dONFBBKHNyYyszKnN0cmlkZSwgYSk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ0eDRfdG9wX2RjKSh1aW50OF90ICpfc3JjLCBjb25zdCB1aW50OF90ICp0b3ByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKyAgICBjb25zdCBpbnQgZGM9ICggIHNyY1stc3RyaWRlXSArIHNyY1sxLXN0cmlkZV0gKyBzcmNbMi1zdHJpZGVdICsgc3JjWzMtc3RyaWRlXSArIDIpID4+MjsKKyAgICBjb25zdCBwaXhlbDQgYSA9IFBJWEVMX1NQTEFUX1g0KGRjKTsKKworICAgIEFWX1dONFBBKHNyYyswKnN0cmlkZSwgYSk7CisgICAgQVZfV040UEEoc3JjKzEqc3RyaWRlLCBhKTsKKyAgICBBVl9XTjRQQShzcmMrMipzdHJpZGUsIGEpOworICAgIEFWX1dONFBBKHNyYyszKnN0cmlkZSwgYSk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ0eDRfMTI4X2RjKSh1aW50OF90ICpfc3JjLCBjb25zdCB1aW50OF90ICp0b3ByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKyAgICBjb25zdCBwaXhlbDQgYSA9IFBJWEVMX1NQTEFUX1g0KDE8PChCSVRfREVQVEgtMSkpOworCisgICAgQVZfV040UEEoc3JjKzAqc3RyaWRlLCBhKTsKKyAgICBBVl9XTjRQQShzcmMrMSpzdHJpZGUsIGEpOworICAgIEFWX1dONFBBKHNyYysyKnN0cmlkZSwgYSk7CisgICAgQVZfV040UEEoc3JjKzMqc3RyaWRlLCBhKTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDR4NF8xMjdfZGMpKHVpbnQ4X3QgKl9zcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICAgIGNvbnN0IHBpeGVsNCBhID0gUElYRUxfU1BMQVRfWDQoKDE8PChCSVRfREVQVEgtMSkpLTEpOworCisgICAgQVZfV040UEEoc3JjKzAqc3RyaWRlLCBhKTsKKyAgICBBVl9XTjRQQShzcmMrMSpzdHJpZGUsIGEpOworICAgIEFWX1dONFBBKHNyYysyKnN0cmlkZSwgYSk7CisgICAgQVZfV040UEEoc3JjKzMqc3RyaWRlLCBhKTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDR4NF8xMjlfZGMpKHVpbnQ4X3QgKl9zcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICAgIGNvbnN0IHBpeGVsNCBhID0gUElYRUxfU1BMQVRfWDQoKDE8PChCSVRfREVQVEgtMSkpKzEpOworCisgICAgQVZfV040UEEoc3JjKzAqc3RyaWRlLCBhKTsKKyAgICBBVl9XTjRQQShzcmMrMSpzdHJpZGUsIGEpOworICAgIEFWX1dONFBBKHNyYysyKnN0cmlkZSwgYSk7CisgICAgQVZfV040UEEoc3JjKzMqc3RyaWRlLCBhKTsKK30KKworCisjZGVmaW5lIExPQURfVE9QX1JJR0hUX0VER0VcCisgICAgY29uc3QgdW5zaWduZWQgYXZfdW51c2VkIHQ0ID0gdG9wcmlnaHRbMF07XAorICAgIGNvbnN0IHVuc2lnbmVkIGF2X3VudXNlZCB0NSA9IHRvcHJpZ2h0WzFdO1wKKyAgICBjb25zdCB1bnNpZ25lZCBhdl91bnVzZWQgdDYgPSB0b3ByaWdodFsyXTtcCisgICAgY29uc3QgdW5zaWduZWQgYXZfdW51c2VkIHQ3ID0gdG9wcmlnaHRbM107XAorCisjZGVmaW5lIExPQURfRE9XTl9MRUZUX0VER0VcCisgICAgY29uc3QgdW5zaWduZWQgYXZfdW51c2VkIGw0ID0gc3JjWy0xKzQqc3RyaWRlXTtcCisgICAgY29uc3QgdW5zaWduZWQgYXZfdW51c2VkIGw1ID0gc3JjWy0xKzUqc3RyaWRlXTtcCisgICAgY29uc3QgdW5zaWduZWQgYXZfdW51c2VkIGw2ID0gc3JjWy0xKzYqc3RyaWRlXTtcCisgICAgY29uc3QgdW5zaWduZWQgYXZfdW51c2VkIGw3ID0gc3JjWy0xKzcqc3RyaWRlXTtcCisKKyNkZWZpbmUgTE9BRF9MRUZUX0VER0VcCisgICAgY29uc3QgdW5zaWduZWQgYXZfdW51c2VkIGwwID0gc3JjWy0xKzAqc3RyaWRlXTtcCisgICAgY29uc3QgdW5zaWduZWQgYXZfdW51c2VkIGwxID0gc3JjWy0xKzEqc3RyaWRlXTtcCisgICAgY29uc3QgdW5zaWduZWQgYXZfdW51c2VkIGwyID0gc3JjWy0xKzIqc3RyaWRlXTtcCisgICAgY29uc3QgdW5zaWduZWQgYXZfdW51c2VkIGwzID0gc3JjWy0xKzMqc3RyaWRlXTtcCisKKyNkZWZpbmUgTE9BRF9UT1BfRURHRVwKKyAgICBjb25zdCB1bnNpZ25lZCBhdl91bnVzZWQgdDAgPSBzcmNbIDAtMSpzdHJpZGVdO1wKKyAgICBjb25zdCB1bnNpZ25lZCBhdl91bnVzZWQgdDEgPSBzcmNbIDEtMSpzdHJpZGVdO1wKKyAgICBjb25zdCB1bnNpZ25lZCBhdl91bnVzZWQgdDIgPSBzcmNbIDItMSpzdHJpZGVdO1wKKyAgICBjb25zdCB1bnNpZ25lZCBhdl91bnVzZWQgdDMgPSBzcmNbIDMtMSpzdHJpZGVdO1wKKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDR4NF9kb3duX3JpZ2h0KSh1aW50OF90ICpfc3JjLCBjb25zdCB1aW50OF90ICp0b3ByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IF9zdHJpZGUpCit7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBpbnQgc3RyaWRlID0gX3N0cmlkZT4+KHNpemVvZihwaXhlbCktMSk7CisgICAgY29uc3QgaW50IGx0PSBzcmNbLTEtMSpzdHJpZGVdOworICAgIExPQURfVE9QX0VER0UKKyAgICBMT0FEX0xFRlRfRURHRQorCisgICAgc3JjWzArMypzdHJpZGVdPShsMyArIDIqbDIgKyBsMSArIDIpPj4yOworICAgIHNyY1swKzIqc3RyaWRlXT0KKyAgICBzcmNbMSszKnN0cmlkZV09KGwyICsgMipsMSArIGwwICsgMik+PjI7CisgICAgc3JjWzArMSpzdHJpZGVdPQorICAgIHNyY1sxKzIqc3RyaWRlXT0KKyAgICBzcmNbMiszKnN0cmlkZV09KGwxICsgMipsMCArIGx0ICsgMik+PjI7CisgICAgc3JjWzArMCpzdHJpZGVdPQorICAgIHNyY1sxKzEqc3RyaWRlXT0KKyAgICBzcmNbMisyKnN0cmlkZV09CisgICAgc3JjWzMrMypzdHJpZGVdPShsMCArIDIqbHQgKyB0MCArIDIpPj4yOworICAgIHNyY1sxKzAqc3RyaWRlXT0KKyAgICBzcmNbMisxKnN0cmlkZV09CisgICAgc3JjWzMrMipzdHJpZGVdPShsdCArIDIqdDAgKyB0MSArIDIpPj4yOworICAgIHNyY1syKzAqc3RyaWRlXT0KKyAgICBzcmNbMysxKnN0cmlkZV09KHQwICsgMip0MSArIHQyICsgMik+PjI7CisgICAgc3JjWzMrMCpzdHJpZGVdPSh0MSArIDIqdDIgKyB0MyArIDIpPj4yOworfQorCitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkNHg0X2Rvd25fbGVmdCkodWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAqX3RvcHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgY29uc3QgcGl4ZWwgKnRvcHJpZ2h0ID0gKGNvbnN0IHBpeGVsKilfdG9wcmlnaHQ7CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICAgIExPQURfVE9QX0VER0UKKyAgICBMT0FEX1RPUF9SSUdIVF9FREdFCisvLyAgICBMT0FEX0xFRlRfRURHRQorCisgICAgc3JjWzArMCpzdHJpZGVdPSh0MCArIHQyICsgMip0MSArIDIpPj4yOworICAgIHNyY1sxKzAqc3RyaWRlXT0KKyAgICBzcmNbMCsxKnN0cmlkZV09KHQxICsgdDMgKyAyKnQyICsgMik+PjI7CisgICAgc3JjWzIrMCpzdHJpZGVdPQorICAgIHNyY1sxKzEqc3RyaWRlXT0KKyAgICBzcmNbMCsyKnN0cmlkZV09KHQyICsgdDQgKyAyKnQzICsgMik+PjI7CisgICAgc3JjWzMrMCpzdHJpZGVdPQorICAgIHNyY1syKzEqc3RyaWRlXT0KKyAgICBzcmNbMSsyKnN0cmlkZV09CisgICAgc3JjWzArMypzdHJpZGVdPSh0MyArIHQ1ICsgMip0NCArIDIpPj4yOworICAgIHNyY1szKzEqc3RyaWRlXT0KKyAgICBzcmNbMisyKnN0cmlkZV09CisgICAgc3JjWzErMypzdHJpZGVdPSh0NCArIHQ2ICsgMip0NSArIDIpPj4yOworICAgIHNyY1szKzIqc3RyaWRlXT0KKyAgICBzcmNbMiszKnN0cmlkZV09KHQ1ICsgdDcgKyAyKnQ2ICsgMik+PjI7CisgICAgc3JjWzMrMypzdHJpZGVdPSh0NiArIDMqdDcgKyAyKT4+MjsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDR4NF92ZXJ0aWNhbF9yaWdodCkodWludDhfdCAqX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IF9zdHJpZGUpCit7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBpbnQgc3RyaWRlID0gX3N0cmlkZT4+KHNpemVvZihwaXhlbCktMSk7CisgICAgY29uc3QgaW50IGx0PSBzcmNbLTEtMSpzdHJpZGVdOworICAgIExPQURfVE9QX0VER0UKKyAgICBMT0FEX0xFRlRfRURHRQorCisgICAgc3JjWzArMCpzdHJpZGVdPQorICAgIHNyY1sxKzIqc3RyaWRlXT0obHQgKyB0MCArIDEpPj4xOworICAgIHNyY1sxKzAqc3RyaWRlXT0KKyAgICBzcmNbMisyKnN0cmlkZV09KHQwICsgdDEgKyAxKT4+MTsKKyAgICBzcmNbMiswKnN0cmlkZV09CisgICAgc3JjWzMrMipzdHJpZGVdPSh0MSArIHQyICsgMSk+PjE7CisgICAgc3JjWzMrMCpzdHJpZGVdPSh0MiArIHQzICsgMSk+PjE7CisgICAgc3JjWzArMSpzdHJpZGVdPQorICAgIHNyY1sxKzMqc3RyaWRlXT0obDAgKyAyKmx0ICsgdDAgKyAyKT4+MjsKKyAgICBzcmNbMSsxKnN0cmlkZV09CisgICAgc3JjWzIrMypzdHJpZGVdPShsdCArIDIqdDAgKyB0MSArIDIpPj4yOworICAgIHNyY1syKzEqc3RyaWRlXT0KKyAgICBzcmNbMyszKnN0cmlkZV09KHQwICsgMip0MSArIHQyICsgMik+PjI7CisgICAgc3JjWzMrMSpzdHJpZGVdPSh0MSArIDIqdDIgKyB0MyArIDIpPj4yOworICAgIHNyY1swKzIqc3RyaWRlXT0obHQgKyAyKmwwICsgbDEgKyAyKT4+MjsKKyAgICBzcmNbMCszKnN0cmlkZV09KGwwICsgMipsMSArIGwyICsgMik+PjI7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ0eDRfdmVydGljYWxfbGVmdCkodWludDhfdCAqX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqX3RvcHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGNvbnN0IHBpeGVsICp0b3ByaWdodCA9IChjb25zdCBwaXhlbCopX3RvcHJpZ2h0OworICAgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKyAgICBMT0FEX1RPUF9FREdFCisgICAgTE9BRF9UT1BfUklHSFRfRURHRQorCisgICAgc3JjWzArMCpzdHJpZGVdPSh0MCArIHQxICsgMSk+PjE7CisgICAgc3JjWzErMCpzdHJpZGVdPQorICAgIHNyY1swKzIqc3RyaWRlXT0odDEgKyB0MiArIDEpPj4xOworICAgIHNyY1syKzAqc3RyaWRlXT0KKyAgICBzcmNbMSsyKnN0cmlkZV09KHQyICsgdDMgKyAxKT4+MTsKKyAgICBzcmNbMyswKnN0cmlkZV09CisgICAgc3JjWzIrMipzdHJpZGVdPSh0MyArIHQ0KyAxKT4+MTsKKyAgICBzcmNbMysyKnN0cmlkZV09KHQ0ICsgdDUrIDEpPj4xOworICAgIHNyY1swKzEqc3RyaWRlXT0odDAgKyAyKnQxICsgdDIgKyAyKT4+MjsKKyAgICBzcmNbMSsxKnN0cmlkZV09CisgICAgc3JjWzArMypzdHJpZGVdPSh0MSArIDIqdDIgKyB0MyArIDIpPj4yOworICAgIHNyY1syKzEqc3RyaWRlXT0KKyAgICBzcmNbMSszKnN0cmlkZV09KHQyICsgMip0MyArIHQ0ICsgMik+PjI7CisgICAgc3JjWzMrMSpzdHJpZGVdPQorICAgIHNyY1syKzMqc3RyaWRlXT0odDMgKyAyKnQ0ICsgdDUgKyAyKT4+MjsKKyAgICBzcmNbMyszKnN0cmlkZV09KHQ0ICsgMip0NSArIHQ2ICsgMik+PjI7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ0eDRfaG9yaXpvbnRhbF91cCkodWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICAgIExPQURfTEVGVF9FREdFCisKKyAgICBzcmNbMCswKnN0cmlkZV09KGwwICsgbDEgKyAxKT4+MTsKKyAgICBzcmNbMSswKnN0cmlkZV09KGwwICsgMipsMSArIGwyICsgMik+PjI7CisgICAgc3JjWzIrMCpzdHJpZGVdPQorICAgIHNyY1swKzEqc3RyaWRlXT0obDEgKyBsMiArIDEpPj4xOworICAgIHNyY1szKzAqc3RyaWRlXT0KKyAgICBzcmNbMSsxKnN0cmlkZV09KGwxICsgMipsMiArIGwzICsgMik+PjI7CisgICAgc3JjWzIrMSpzdHJpZGVdPQorICAgIHNyY1swKzIqc3RyaWRlXT0obDIgKyBsMyArIDEpPj4xOworICAgIHNyY1szKzEqc3RyaWRlXT0KKyAgICBzcmNbMSsyKnN0cmlkZV09KGwyICsgMipsMyArIGwzICsgMik+PjI7CisgICAgc3JjWzMrMipzdHJpZGVdPQorICAgIHNyY1sxKzMqc3RyaWRlXT0KKyAgICBzcmNbMCszKnN0cmlkZV09CisgICAgc3JjWzIrMipzdHJpZGVdPQorICAgIHNyY1syKzMqc3RyaWRlXT0KKyAgICBzcmNbMyszKnN0cmlkZV09bDM7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ0eDRfaG9yaXpvbnRhbF9kb3duKSh1aW50OF90ICpfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICAgIGNvbnN0IGludCBsdD0gc3JjWy0xLTEqc3RyaWRlXTsKKyAgICBMT0FEX1RPUF9FREdFCisgICAgTE9BRF9MRUZUX0VER0UKKworICAgIHNyY1swKzAqc3RyaWRlXT0KKyAgICBzcmNbMisxKnN0cmlkZV09KGx0ICsgbDAgKyAxKT4+MTsKKyAgICBzcmNbMSswKnN0cmlkZV09CisgICAgc3JjWzMrMSpzdHJpZGVdPShsMCArIDIqbHQgKyB0MCArIDIpPj4yOworICAgIHNyY1syKzAqc3RyaWRlXT0obHQgKyAyKnQwICsgdDEgKyAyKT4+MjsKKyAgICBzcmNbMyswKnN0cmlkZV09KHQwICsgMip0MSArIHQyICsgMik+PjI7CisgICAgc3JjWzArMSpzdHJpZGVdPQorICAgIHNyY1syKzIqc3RyaWRlXT0obDAgKyBsMSArIDEpPj4xOworICAgIHNyY1sxKzEqc3RyaWRlXT0KKyAgICBzcmNbMysyKnN0cmlkZV09KGx0ICsgMipsMCArIGwxICsgMik+PjI7CisgICAgc3JjWzArMipzdHJpZGVdPQorICAgIHNyY1syKzMqc3RyaWRlXT0obDEgKyBsMisgMSk+PjE7CisgICAgc3JjWzErMipzdHJpZGVdPQorICAgIHNyY1szKzMqc3RyaWRlXT0obDAgKyAyKmwxICsgbDIgKyAyKT4+MjsKKyAgICBzcmNbMCszKnN0cmlkZV09KGwyICsgbDMgKyAxKT4+MTsKKyAgICBzcmNbMSszKnN0cmlkZV09KGwxICsgMipsMiArIGwzICsgMik+PjI7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQxNngxNl92ZXJ0aWNhbCkodWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBpbnQgc3RyaWRlID0gX3N0cmlkZT4+KHNpemVvZihwaXhlbCktMSk7CisgICAgY29uc3QgcGl4ZWw0IGEgPSBBVl9STjRQQSgoKHBpeGVsNCopKHNyYy1zdHJpZGUpKSswKTsKKyAgICBjb25zdCBwaXhlbDQgYiA9IEFWX1JONFBBKCgocGl4ZWw0Kikoc3JjLXN0cmlkZSkpKzEpOworICAgIGNvbnN0IHBpeGVsNCBjID0gQVZfUk40UEEoKChwaXhlbDQqKShzcmMtc3RyaWRlKSkrMik7CisgICAgY29uc3QgcGl4ZWw0IGQgPSBBVl9STjRQQSgoKHBpeGVsNCopKHNyYy1zdHJpZGUpKSszKTsKKworICAgIGZvcihpPTA7IGk8MTY7IGkrKyl7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMCwgYSk7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMSwgYik7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMiwgYyk7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMywgZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkMTZ4MTZfaG9yaXpvbnRhbCkodWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIHN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xOworCisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKXsKKyAgICAgICAgY29uc3QgcGl4ZWw0IGEgPSBQSVhFTF9TUExBVF9YNChzcmNbLTEraSpzdHJpZGVdKTsKKworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzAsIGEpOworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzEsIGEpOworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzIsIGEpOworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzMsIGEpOworICAgIH0KK30KKworI2RlZmluZSBQUkVESUNUXzE2eDE2X0RDKHYpXAorICAgIGZvcihpPTA7IGk8MTY7IGkrKyl7XAorICAgICAgICBBVl9XTjRQQShzcmMrIDAsIHYpO1wKKyAgICAgICAgQVZfV040UEEoc3JjKyA0LCB2KTtcCisgICAgICAgIEFWX1dONFBBKHNyYysgOCwgdik7XAorICAgICAgICBBVl9XTjRQQShzcmMrMTIsIHYpO1wKKyAgICAgICAgc3JjICs9IHN0cmlkZTtcCisgICAgfQorCitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkMTZ4MTZfZGMpKHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGksIGRjPTA7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBwaXhlbDQgZGNzcGxhdDsKKyAgICBzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTsKKworICAgIGZvcihpPTA7aTwxNjsgaSsrKXsKKyAgICAgICAgZGMrPSBzcmNbLTEraSpzdHJpZGVdOworICAgIH0KKworICAgIGZvcihpPTA7aTwxNjsgaSsrKXsKKyAgICAgICAgZGMrPSBzcmNbaS1zdHJpZGVdOworICAgIH0KKworICAgIGRjc3BsYXQgPSBQSVhFTF9TUExBVF9YNCgoZGMrMTYpPj41KTsKKyAgICBQUkVESUNUXzE2eDE2X0RDKGRjc3BsYXQpOworfQorCitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkMTZ4MTZfbGVmdF9kYykodWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaSwgZGM9MDsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIHBpeGVsNCBkY3NwbGF0OworICAgIHN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xOworCisgICAgZm9yKGk9MDtpPDE2OyBpKyspeworICAgICAgICBkYys9IHNyY1stMStpKnN0cmlkZV07CisgICAgfQorCisgICAgZGNzcGxhdCA9IFBJWEVMX1NQTEFUX1g0KChkYys4KT4+NCk7CisgICAgUFJFRElDVF8xNngxNl9EQyhkY3NwbGF0KTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDE2eDE2X3RvcF9kYykodWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaSwgZGM9MDsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIHBpeGVsNCBkY3NwbGF0OworICAgIHN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xOworCisgICAgZm9yKGk9MDtpPDE2OyBpKyspeworICAgICAgICBkYys9IHNyY1tpLXN0cmlkZV07CisgICAgfQorCisgICAgZGNzcGxhdCA9IFBJWEVMX1NQTEFUX1g0KChkYys4KT4+NCk7CisgICAgUFJFRElDVF8xNngxNl9EQyhkY3NwbGF0KTsKK30KKworI2RlZmluZSBQUkVEMTZ4MTZfWChuLCB2KSBcCitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkMTZ4MTZfIyNuIyNfZGMpKHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBpbnQgaTtcCisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYztcCisgICAgc3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7XAorICAgIFBSRURJQ1RfMTZ4MTZfREMoUElYRUxfU1BMQVRfWDQodikpO1wKK30KKworUFJFRDE2eDE2X1goMTI3LCAoMTw8KEJJVF9ERVBUSC0xKSktMSkKK1BSRUQxNngxNl9YKDEyOCwgKDE8PChCSVRfREVQVEgtMSkpKzApCitQUkVEMTZ4MTZfWCgxMjksICgxPDwoQklUX0RFUFRILTEpKSsxKQorCitzdGF0aWMgaW5saW5lIHZvaWQgRlVOQ0MocHJlZDE2eDE2X3BsYW5lX2NvbXBhdCkodWludDhfdCAqX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3ZxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcnY0MCkKK3sKKyAgaW50IGksIGosIGs7CisgIGludCBhOworICBJTklUX0NMSVAKKyAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICBjb25zdCBwaXhlbCAqIGNvbnN0IHNyYzAgPSBzcmMgKzctc3RyaWRlOworICBjb25zdCBwaXhlbCAqICAgICAgIHNyYzEgPSBzcmMgKzgqc3RyaWRlLTE7CisgIGNvbnN0IHBpeGVsICogICAgICAgc3JjMiA9IHNyYzEtMipzdHJpZGU7ICAgIC8vID09IHNyYys2KnN0cmlkZS0xOworICBpbnQgSCA9IHNyYzBbMV0gLSBzcmMwWy0xXTsKKyAgaW50IFYgPSBzcmMxWzBdIC0gc3JjMlsgMF07CisgIGZvcihrPTI7IGs8PTg7ICsraykgeworICAgIHNyYzEgKz0gc3RyaWRlOyBzcmMyIC09IHN0cmlkZTsKKyAgICBIICs9IGsqKHNyYzBba10gLSBzcmMwWy1rXSk7CisgICAgViArPSBrKihzcmMxWzBdIC0gc3JjMlsgMF0pOworICB9CisgIGlmKHN2cTMpeworICAgIEggPSAoIDUqKEgvNCkgKSAvIDE2OworICAgIFYgPSAoIDUqKFYvNCkgKSAvIDE2OworCisgICAgLyogcmVxdWlyZWQgZm9yIDEwMCUgYWNjdXJhY3kgKi8KKyAgICBpID0gSDsgSCA9IFY7IFYgPSBpOworICB9ZWxzZSBpZihydjQwKXsKKyAgICBIID0gKCBIICsgKEg+PjIpICkgPj4gNDsKKyAgICBWID0gKCBWICsgKFY+PjIpICkgPj4gNDsKKyAgfWVsc2V7CisgICAgSCA9ICggNSpIKzMyICkgPj4gNjsKKyAgICBWID0gKCA1KlYrMzIgKSA+PiA2OworICB9CisKKyAgYSA9IDE2KihzcmMxWzBdICsgc3JjMlsxNl0gKyAxKSAtIDcqKFYrSCk7CisgIGZvcihqPTE2OyBqPjA7IC0taikgeworICAgIGludCBiID0gYTsKKyAgICBhICs9IFY7CisgICAgZm9yKGk9LTE2OyBpPDA7IGkrPTQpIHsKKyAgICAgIHNyY1sxNitpXSA9IENMSVAoKGIgICAgKSA+PiA1KTsKKyAgICAgIHNyY1sxNytpXSA9IENMSVAoKGIrICBIKSA+PiA1KTsKKyAgICAgIHNyY1sxOCtpXSA9IENMSVAoKGIrMipIKSA+PiA1KTsKKyAgICAgIHNyY1sxOStpXSA9IENMSVAoKGIrMypIKSA+PiA1KTsKKyAgICAgIGIgKz0gNCpIOworICAgIH0KKyAgICBzcmMgKz0gc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQxNngxNl9wbGFuZSkodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIEZVTkNDKHByZWQxNngxNl9wbGFuZV9jb21wYXQpKHNyYywgc3RyaWRlLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OF92ZXJ0aWNhbCkodWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBpbnQgc3RyaWRlID0gX3N0cmlkZT4+KHNpemVvZihwaXhlbCktMSk7CisgICAgY29uc3QgcGl4ZWw0IGE9IEFWX1JONFBBKCgocGl4ZWw0Kikoc3JjLXN0cmlkZSkpKzApOworICAgIGNvbnN0IHBpeGVsNCBiPSBBVl9STjRQQSgoKHBpeGVsNCopKHNyYy1zdHJpZGUpKSsxKTsKKworICAgIGZvcihpPTA7IGk8ODsgaSsrKXsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSswLCBhKTsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSsxLCBiKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ4eDE2X3ZlcnRpY2FsKSh1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKyAgICBjb25zdCBwaXhlbDQgYT0gQVZfUk40UEEoKChwaXhlbDQqKShzcmMtc3RyaWRlKSkrMCk7CisgICAgY29uc3QgcGl4ZWw0IGI9IEFWX1JONFBBKCgocGl4ZWw0Kikoc3JjLXN0cmlkZSkpKzEpOworCisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKXsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSswLCBhKTsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSsxLCBiKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ4eDhfaG9yaXpvbnRhbCkodWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIHN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xOworCisgICAgZm9yKGk9MDsgaTw4OyBpKyspeworICAgICAgICBjb25zdCBwaXhlbDQgYSA9IFBJWEVMX1NQTEFUX1g0KHNyY1stMStpKnN0cmlkZV0pOworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzAsIGEpOworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzEsIGEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4MTZfaG9yaXpvbnRhbCkodWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIHN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xOworICAgIGZvcihpPTA7IGk8MTY7IGkrKyl7CisgICAgICAgIGNvbnN0IHBpeGVsNCBhID0gUElYRUxfU1BMQVRfWDQoc3JjWy0xK2kqc3RyaWRlXSk7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMCwgYSk7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMSwgYSk7CisgICAgfQorfQorCisjZGVmaW5lIFBSRUQ4eDhfWChuLCB2KVwKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ4eDhfIyNuIyNfZGMpKHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBpbnQgaTtcCisgICAgY29uc3QgcGl4ZWw0IGEgPSBQSVhFTF9TUExBVF9YNCh2KTtcCisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYztcCisgICAgc3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7XAorICAgIGZvcihpPTA7IGk8ODsgaSsrKXtcCisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMCwgYSk7XAorICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzEsIGEpO1wKKyAgICB9XAorfQorCitQUkVEOHg4X1goMTI3LCAoMTw8KEJJVF9ERVBUSC0xKSktMSkKK1BSRUQ4eDhfWCgxMjgsICgxPDwoQklUX0RFUFRILTEpKSswKQorUFJFRDh4OF9YKDEyOSwgKDE8PChCSVRfREVQVEgtMSkpKzEpCisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ4eDE2XzEyOF9kYykodWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBGVU5DQyhwcmVkOHg4XzEyOF9kYykoX3NyYywgc3RyaWRlKTsKKyAgICBGVU5DQyhwcmVkOHg4XzEyOF9kYykoX3NyYys4KnN0cmlkZSwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OF9sZWZ0X2RjKSh1aW50OF90ICpfc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludCBpOworICAgIGludCBkYzAsIGRjMjsKKyAgICBwaXhlbDQgZGMwc3BsYXQsIGRjMnNwbGF0OworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgc3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7CisKKyAgICBkYzA9ZGMyPTA7CisgICAgZm9yKGk9MDtpPDQ7IGkrKyl7CisgICAgICAgIGRjMCs9IHNyY1stMStpKnN0cmlkZV07CisgICAgICAgIGRjMis9IHNyY1stMSsoaSs0KSpzdHJpZGVdOworICAgIH0KKyAgICBkYzBzcGxhdCA9IFBJWEVMX1NQTEFUX1g0KChkYzAgKyAyKT4+Mik7CisgICAgZGMyc3BsYXQgPSBQSVhFTF9TUExBVF9YNCgoZGMyICsgMik+PjIpOworCisgICAgZm9yKGk9MDsgaTw0OyBpKyspeworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzAsIGRjMHNwbGF0KTsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSsxLCBkYzBzcGxhdCk7CisgICAgfQorICAgIGZvcihpPTQ7IGk8ODsgaSsrKXsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSswLCBkYzJzcGxhdCk7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMSwgZGMyc3BsYXQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4MTZfbGVmdF9kYykodWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBGVU5DQyhwcmVkOHg4X2xlZnRfZGMpKF9zcmMsIHN0cmlkZSk7CisgICAgRlVOQ0MocHJlZDh4OF9sZWZ0X2RjKShfc3JjKzgqc3RyaWRlLCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkOHg4X3RvcF9kYykodWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZGMwLCBkYzE7CisgICAgcGl4ZWw0IGRjMHNwbGF0LCBkYzFzcGxhdDsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIHN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xOworCisgICAgZGMwPWRjMT0wOworICAgIGZvcihpPTA7aTw0OyBpKyspeworICAgICAgICBkYzArPSBzcmNbaS1zdHJpZGVdOworICAgICAgICBkYzErPSBzcmNbNCtpLXN0cmlkZV07CisgICAgfQorICAgIGRjMHNwbGF0ID0gUElYRUxfU1BMQVRfWDQoKGRjMCArIDIpPj4yKTsKKyAgICBkYzFzcGxhdCA9IFBJWEVMX1NQTEFUX1g0KChkYzEgKyAyKT4+Mik7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMCwgZGMwc3BsYXQpOworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzEsIGRjMXNwbGF0KTsKKyAgICB9CisgICAgZm9yKGk9NDsgaTw4OyBpKyspeworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzAsIGRjMHNwbGF0KTsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSsxLCBkYzFzcGxhdCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkOHgxNl90b3BfZGMpKHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgaW50IGRjMCwgZGMxOworICAgIHBpeGVsNCBkYzBzcGxhdCwgZGMxc3BsYXQ7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTsKKworICAgIGRjMD1kYzE9MDsKKyAgICBmb3IoaT0wO2k8NDsgaSsrKXsKKyAgICAgICAgZGMwKz0gc3JjW2ktc3RyaWRlXTsKKyAgICAgICAgZGMxKz0gc3JjWzQraS1zdHJpZGVdOworICAgIH0KKyAgICBkYzBzcGxhdCA9IFBJWEVMX1NQTEFUX1g0KChkYzAgKyAyKT4+Mik7CisgICAgZGMxc3BsYXQgPSBQSVhFTF9TUExBVF9YNCgoZGMxICsgMik+PjIpOworCisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKXsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSswLCBkYzBzcGxhdCk7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMSwgZGMxc3BsYXQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OF9kYykodWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZGMwLCBkYzEsIGRjMjsKKyAgICBwaXhlbDQgZGMwc3BsYXQsIGRjMXNwbGF0LCBkYzJzcGxhdCwgZGMzc3BsYXQ7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTsKKworICAgIGRjMD1kYzE9ZGMyPTA7CisgICAgZm9yKGk9MDtpPDQ7IGkrKyl7CisgICAgICAgIGRjMCs9IHNyY1stMStpKnN0cmlkZV0gKyBzcmNbaS1zdHJpZGVdOworICAgICAgICBkYzErPSBzcmNbNCtpLXN0cmlkZV07CisgICAgICAgIGRjMis9IHNyY1stMSsoaSs0KSpzdHJpZGVdOworICAgIH0KKyAgICBkYzBzcGxhdCA9IFBJWEVMX1NQTEFUX1g0KChkYzAgKyA0KT4+Myk7CisgICAgZGMxc3BsYXQgPSBQSVhFTF9TUExBVF9YNCgoZGMxICsgMik+PjIpOworICAgIGRjMnNwbGF0ID0gUElYRUxfU1BMQVRfWDQoKGRjMiArIDIpPj4yKTsKKyAgICBkYzNzcGxhdCA9IFBJWEVMX1NQTEFUX1g0KChkYzEgKyBkYzIgKyA0KT4+Myk7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMCwgZGMwc3BsYXQpOworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzEsIGRjMXNwbGF0KTsKKyAgICB9CisgICAgZm9yKGk9NDsgaTw4OyBpKyspeworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzAsIGRjMnNwbGF0KTsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSsxLCBkYzNzcGxhdCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkOHgxNl9kYykodWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZGMwLCBkYzEsIGRjMiwgZGMzLCBkYzQ7CisgICAgcGl4ZWw0IGRjMHNwbGF0LCBkYzFzcGxhdCwgZGMyc3BsYXQsIGRjM3NwbGF0LCBkYzRzcGxhdCwgZGM1c3BsYXQsIGRjNnNwbGF0LCBkYzdzcGxhdDsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIHN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xOworCisgICAgZGMwPWRjMT1kYzI9ZGMzPWRjND0wOworICAgIGZvcihpPTA7aTw0OyBpKyspeworICAgICAgICBkYzArPSBzcmNbLTEraSpzdHJpZGVdICsgc3JjW2ktc3RyaWRlXTsKKyAgICAgICAgZGMxKz0gc3JjWzQraS1zdHJpZGVdOworICAgICAgICBkYzIrPSBzcmNbLTErKGkrNCkqc3RyaWRlXTsKKyAgICAgICAgZGMzKz0gc3JjWy0xKyhpKzgpKnN0cmlkZV07CisgICAgICAgIGRjNCs9IHNyY1stMSsoaSsxMikqc3RyaWRlXTsKKyAgICB9CisgICAgZGMwc3BsYXQgPSBQSVhFTF9TUExBVF9YNCgoZGMwICsgNCk+PjMpOworICAgIGRjMXNwbGF0ID0gUElYRUxfU1BMQVRfWDQoKGRjMSArIDIpPj4yKTsKKyAgICBkYzJzcGxhdCA9IFBJWEVMX1NQTEFUX1g0KChkYzIgKyAyKT4+Mik7CisgICAgZGMzc3BsYXQgPSBQSVhFTF9TUExBVF9YNCgoZGMxICsgZGMyICsgNCk+PjMpOworICAgIGRjNHNwbGF0ID0gUElYRUxfU1BMQVRfWDQoKGRjMyArIDIpPj4yKTsKKyAgICBkYzVzcGxhdCA9IFBJWEVMX1NQTEFUX1g0KChkYzEgKyBkYzMgKyA0KT4+Myk7CisgICAgZGM2c3BsYXQgPSBQSVhFTF9TUExBVF9YNCgoZGM0ICsgMik+PjIpOworICAgIGRjN3NwbGF0ID0gUElYRUxfU1BMQVRfWDQoKGRjMSArIGRjNCArIDQpPj4zKTsKKworICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSswLCBkYzBzcGxhdCk7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMSwgZGMxc3BsYXQpOworICAgIH0KKyAgICBmb3IoaT00OyBpPDg7IGkrKyl7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMCwgZGMyc3BsYXQpOworICAgICAgICBBVl9XTjRQQSgoKHBpeGVsNCopKHNyYytpKnN0cmlkZSkpKzEsIGRjM3NwbGF0KTsKKyAgICB9CisgICAgZm9yKGk9ODsgaTwxMjsgaSsrKXsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSswLCBkYzRzcGxhdCk7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMSwgZGM1c3BsYXQpOworICAgIH0KKyAgICBmb3IoaT0xMjsgaTwxNjsgaSsrKXsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMraSpzdHJpZGUpKSswLCBkYzZzcGxhdCk7CisgICAgICAgIEFWX1dONFBBKCgocGl4ZWw0Kikoc3JjK2kqc3RyaWRlKSkrMSwgZGM3c3BsYXQpOworICAgIH0KK30KKworLy90aGUgZm9sbG93aW5nIDQgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBvcHRpbWl6ZWQhCitzdGF0aWMgdm9pZCBGVU5DKHByZWQ4eDhfbWFkX2Nvd19kY19sMHQpKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBGVU5DQyhwcmVkOHg4X3RvcF9kYykoc3JjLCBzdHJpZGUpOworICAgIEZVTkNDKHByZWQ0eDRfZGMpKHNyYywgTlVMTCwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgRlVOQyhwcmVkOHgxNl9tYWRfY293X2RjX2wwdCkodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIEZVTkNDKHByZWQ4eDE2X3RvcF9kYykoc3JjLCBzdHJpZGUpOworICAgIEZVTkNDKHByZWQ0eDRfZGMpKHNyYywgTlVMTCwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgRlVOQyhwcmVkOHg4X21hZF9jb3dfZGNfMGx0KSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgRlVOQ0MocHJlZDh4OF9kYykoc3JjLCBzdHJpZGUpOworICAgIEZVTkNDKHByZWQ0eDRfdG9wX2RjKShzcmMsIE5VTEwsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMocHJlZDh4MTZfbWFkX2Nvd19kY18wbHQpKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBGVU5DQyhwcmVkOHgxNl9kYykoc3JjLCBzdHJpZGUpOworICAgIEZVTkNDKHByZWQ0eDRfdG9wX2RjKShzcmMsIE5VTEwsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMocHJlZDh4OF9tYWRfY293X2RjX2wwMCkodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIEZVTkNDKHByZWQ4eDhfbGVmdF9kYykoc3JjLCBzdHJpZGUpOworICAgIEZVTkNDKHByZWQ0eDRfMTI4X2RjKShzcmMgKyA0KnN0cmlkZSAgICAgICAgICAgICAgICAgICwgTlVMTCwgc3RyaWRlKTsKKyAgICBGVU5DQyhwcmVkNHg0XzEyOF9kYykoc3JjICsgNCpzdHJpZGUgKyA0KnNpemVvZihwaXhlbCksIE5VTEwsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMocHJlZDh4MTZfbWFkX2Nvd19kY19sMDApKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBGVU5DQyhwcmVkOHgxNl9sZWZ0X2RjKShzcmMsIHN0cmlkZSk7CisgICAgRlVOQ0MocHJlZDR4NF8xMjhfZGMpKHNyYyArIDQqc3RyaWRlICAgICAgICAgICAgICAgICAgLCBOVUxMLCBzdHJpZGUpOworICAgIEZVTkNDKHByZWQ0eDRfMTI4X2RjKShzcmMgKyA0KnN0cmlkZSArIDQqc2l6ZW9mKHBpeGVsKSwgTlVMTCwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgRlVOQyhwcmVkOHg4X21hZF9jb3dfZGNfMGwwKSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgRlVOQ0MocHJlZDh4OF9sZWZ0X2RjKShzcmMsIHN0cmlkZSk7CisgICAgRlVOQ0MocHJlZDR4NF8xMjhfZGMpKHNyYyAgICAgICAgICAgICAgICAgICwgTlVMTCwgc3RyaWRlKTsKKyAgICBGVU5DQyhwcmVkNHg0XzEyOF9kYykoc3JjICsgNCpzaXplb2YocGl4ZWwpLCBOVUxMLCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBGVU5DKHByZWQ4eDE2X21hZF9jb3dfZGNfMGwwKSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgRlVOQ0MocHJlZDh4MTZfbGVmdF9kYykoc3JjLCBzdHJpZGUpOworICAgIEZVTkNDKHByZWQ0eDRfMTI4X2RjKShzcmMgICAgICAgICAgICAgICAgICAsIE5VTEwsIHN0cmlkZSk7CisgICAgRlVOQ0MocHJlZDR4NF8xMjhfZGMpKHNyYyArIDQqc2l6ZW9mKHBpeGVsKSwgTlVMTCwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OF9wbGFuZSkodWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zdHJpZGUpCit7CisgIGludCBqLCBrOworICBpbnQgYTsKKyAgSU5JVF9DTElQCisgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKyAgY29uc3QgcGl4ZWwgKiBjb25zdCBzcmMwID0gc3JjICszLXN0cmlkZTsKKyAgY29uc3QgcGl4ZWwgKiAgICAgICBzcmMxID0gc3JjICs0KnN0cmlkZS0xOworICBjb25zdCBwaXhlbCAqICAgICAgIHNyYzIgPSBzcmMxLTIqc3RyaWRlOyAgICAvLyA9PSBzcmMrMipzdHJpZGUtMTsKKyAgaW50IEggPSBzcmMwWzFdIC0gc3JjMFstMV07CisgIGludCBWID0gc3JjMVswXSAtIHNyYzJbIDBdOworICBmb3Ioaz0yOyBrPD00OyArK2spIHsKKyAgICBzcmMxICs9IHN0cmlkZTsgc3JjMiAtPSBzdHJpZGU7CisgICAgSCArPSBrKihzcmMwW2tdIC0gc3JjMFsta10pOworICAgIFYgKz0gayooc3JjMVswXSAtIHNyYzJbIDBdKTsKKyAgfQorICBIID0gKCAxNypIKzE2ICkgPj4gNTsKKyAgViA9ICggMTcqVisxNiApID4+IDU7CisKKyAgYSA9IDE2KihzcmMxWzBdICsgc3JjMls4XSsxKSAtIDMqKFYrSCk7CisgIGZvcihqPTg7IGo+MDsgLS1qKSB7CisgICAgaW50IGIgPSBhOworICAgIGEgKz0gVjsKKyAgICBzcmNbMF0gPSBDTElQKChiICAgICkgPj4gNSk7CisgICAgc3JjWzFdID0gQ0xJUCgoYisgIEgpID4+IDUpOworICAgIHNyY1syXSA9IENMSVAoKGIrMipIKSA+PiA1KTsKKyAgICBzcmNbM10gPSBDTElQKChiKzMqSCkgPj4gNSk7CisgICAgc3JjWzRdID0gQ0xJUCgoYis0KkgpID4+IDUpOworICAgIHNyY1s1XSA9IENMSVAoKGIrNSpIKSA+PiA1KTsKKyAgICBzcmNbNl0gPSBDTElQKChiKzYqSCkgPj4gNSk7CisgICAgc3JjWzddID0gQ0xJUCgoYis3KkgpID4+IDUpOworICAgIHNyYyArPSBzdHJpZGU7CisgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4MTZfcGxhbmUpKHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICBpbnQgaiwgazsKKyAgaW50IGE7CisgIElOSVRfQ0xJUAorICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICBpbnQgc3RyaWRlID0gX3N0cmlkZT4+KHNpemVvZihwaXhlbCktMSk7CisgIGNvbnN0IHBpeGVsICogY29uc3Qgc3JjMCA9IHNyYyArMy1zdHJpZGU7CisgIGNvbnN0IHBpeGVsICogICAgICAgc3JjMSA9IHNyYyArOCpzdHJpZGUtMTsKKyAgY29uc3QgcGl4ZWwgKiAgICAgICBzcmMyID0gc3JjMS0yKnN0cmlkZTsgICAgLy8gPT0gc3JjKzYqc3RyaWRlLTE7CisgIGludCBIID0gc3JjMFsxXSAtIHNyYzBbLTFdOworICBpbnQgViA9IHNyYzFbMF0gLSBzcmMyWyAwXTsKKworICBmb3IgKGsgPSAyOyBrIDw9IDQ7ICsraykgeworICAgICAgc3JjMSArPSBzdHJpZGU7IHNyYzIgLT0gc3RyaWRlOworICAgICAgSCArPSBrKihzcmMwW2tdIC0gc3JjMFsta10pOworICAgICAgViArPSBrKihzcmMxWzBdIC0gc3JjMlsgMF0pOworICB9CisgIGZvciAoOyBrIDw9IDg7ICsraykgeworICAgICAgc3JjMSArPSBzdHJpZGU7IHNyYzIgLT0gc3RyaWRlOworICAgICAgViArPSBrKihzcmMxWzBdIC0gc3JjMlswXSk7CisgIH0KKworICBIID0gKDE3KkgrMTYpID4+IDU7CisgIFYgPSAoNSpWKzMyKSA+PiA2OworCisgIGEgPSAxNiooc3JjMVswXSArIHNyYzJbOF0gKyAxKSAtIDcqViAtIDMqSDsKKyAgZm9yKGo9MTY7IGo+MDsgLS1qKSB7CisgICAgaW50IGIgPSBhOworICAgIGEgKz0gVjsKKyAgICBzcmNbMF0gPSBDTElQKChiICAgICkgPj4gNSk7CisgICAgc3JjWzFdID0gQ0xJUCgoYisgIEgpID4+IDUpOworICAgIHNyY1syXSA9IENMSVAoKGIrMipIKSA+PiA1KTsKKyAgICBzcmNbM10gPSBDTElQKChiKzMqSCkgPj4gNSk7CisgICAgc3JjWzRdID0gQ0xJUCgoYis0KkgpID4+IDUpOworICAgIHNyY1s1XSA9IENMSVAoKGIrNSpIKSA+PiA1KTsKKyAgICBzcmNbNl0gPSBDTElQKChiKzYqSCkgPj4gNSk7CisgICAgc3JjWzddID0gQ0xJUCgoYis3KkgpID4+IDUpOworICAgIHNyYyArPSBzdHJpZGU7CisgIH0KK30KKworI2RlZmluZSBTUkMoeCx5KSBzcmNbKHgpKyh5KSpzdHJpZGVdCisjZGVmaW5lIFBMKHkpIFwKKyAgICBjb25zdCBpbnQgbCMjeSA9IChTUkMoLTEseS0xKSArIDIqU1JDKC0xLHkpICsgU1JDKC0xLHkrMSkgKyAyKSA+PiAyOworI2RlZmluZSBQUkVESUNUXzh4OF9MT0FEX0xFRlQgXAorICAgIGNvbnN0IGludCBsMCA9ICgoaGFzX3RvcGxlZnQgPyBTUkMoLTEsLTEpIDogU1JDKC0xLDApKSBcCisgICAgICAgICAgICAgICAgICAgICArIDIqU1JDKC0xLDApICsgU1JDKC0xLDEpICsgMikgPj4gMjsgXAorICAgIFBMKDEpIFBMKDIpIFBMKDMpIFBMKDQpIFBMKDUpIFBMKDYpIFwKKyAgICBjb25zdCBpbnQgbDcgYXZfdW51c2VkID0gKFNSQygtMSw2KSArIDMqU1JDKC0xLDcpICsgMikgPj4gMgorCisjZGVmaW5lIFBUKHgpIFwKKyAgICBjb25zdCBpbnQgdCMjeCA9IChTUkMoeC0xLC0xKSArIDIqU1JDKHgsLTEpICsgU1JDKHgrMSwtMSkgKyAyKSA+PiAyOworI2RlZmluZSBQUkVESUNUXzh4OF9MT0FEX1RPUCBcCisgICAgY29uc3QgaW50IHQwID0gKChoYXNfdG9wbGVmdCA/IFNSQygtMSwtMSkgOiBTUkMoMCwtMSkpIFwKKyAgICAgICAgICAgICAgICAgICAgICsgMipTUkMoMCwtMSkgKyBTUkMoMSwtMSkgKyAyKSA+PiAyOyBcCisgICAgUFQoMSkgUFQoMikgUFQoMykgUFQoNCkgUFQoNSkgUFQoNikgXAorICAgIGNvbnN0IGludCB0NyBhdl91bnVzZWQgPSAoKGhhc190b3ByaWdodCA/IFNSQyg4LC0xKSA6IFNSQyg3LC0xKSkgXAorICAgICAgICAgICAgICAgICAgICAgKyAyKlNSQyg3LC0xKSArIFNSQyg2LC0xKSArIDIpID4+IDIKKworI2RlZmluZSBQVFIoeCkgXAorICAgIHQjI3ggPSAoU1JDKHgtMSwtMSkgKyAyKlNSQyh4LC0xKSArIFNSQyh4KzEsLTEpICsgMikgPj4gMjsKKyNkZWZpbmUgUFJFRElDVF84eDhfTE9BRF9UT1BSSUdIVCBcCisgICAgaW50IHQ4LCB0OSwgdDEwLCB0MTEsIHQxMiwgdDEzLCB0MTQsIHQxNTsgXAorICAgIGlmKGhhc190b3ByaWdodCkgeyBcCisgICAgICAgIFBUUig4KSBQVFIoOSkgUFRSKDEwKSBQVFIoMTEpIFBUUigxMikgUFRSKDEzKSBQVFIoMTQpIFwKKyAgICAgICAgdDE1ID0gKFNSQygxNCwtMSkgKyAzKlNSQygxNSwtMSkgKyAyKSA+PiAyOyBcCisgICAgfSBlbHNlIHQ4PXQ5PXQxMD10MTE9dDEyPXQxMz10MTQ9dDE1PSBTUkMoNywtMSk7CisKKyNkZWZpbmUgUFJFRElDVF84eDhfTE9BRF9UT1BMRUZUIFwKKyAgICBjb25zdCBpbnQgbHQgPSAoU1JDKC0xLDApICsgMipTUkMoLTEsLTEpICsgU1JDKDAsLTEpICsgMikgPj4gMgorCisjZGVmaW5lIFBSRURJQ1RfOHg4X0RDKHYpIFwKKyAgICBpbnQgeTsgXAorICAgIGZvciggeSA9IDA7IHkgPCA4OyB5KysgKSB7IFwKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKXNyYykrMCwgdik7IFwKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKXNyYykrMSwgdik7IFwKKyAgICAgICAgc3JjICs9IHN0cmlkZTsgXAorICAgIH0KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OGxfMTI4X2RjKSh1aW50OF90ICpfc3JjLCBpbnQgaGFzX3RvcGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworCisgICAgUFJFRElDVF84eDhfREMoUElYRUxfU1BMQVRfWDQoMTw8KEJJVF9ERVBUSC0xKSkpOworfQorc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OGxfbGVmdF9kYykodWludDhfdCAqX3NyYywgaW50IGhhc190b3BsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgcHRyZGlmZl90IF9zdHJpZGUpCit7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBpbnQgc3RyaWRlID0gX3N0cmlkZT4+KHNpemVvZihwaXhlbCktMSk7CisKKyAgICBQUkVESUNUXzh4OF9MT0FEX0xFRlQ7CisgICAgY29uc3QgcGl4ZWw0IGRjID0gUElYRUxfU1BMQVRfWDQoKGwwK2wxK2wyK2wzK2w0K2w1K2w2K2w3KzQpID4+IDMpOworICAgIFBSRURJQ1RfOHg4X0RDKGRjKTsKK30KK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ4eDhsX3RvcF9kYykodWludDhfdCAqX3NyYywgaW50IGhhc190b3BsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKworICAgIFBSRURJQ1RfOHg4X0xPQURfVE9QOworICAgIGNvbnN0IHBpeGVsNCBkYyA9IFBJWEVMX1NQTEFUX1g0KCh0MCt0MSt0Mit0Myt0NCt0NSt0Nit0Nys0KSA+PiAzKTsKKyAgICBQUkVESUNUXzh4OF9EQyhkYyk7Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkOHg4bF9kYykodWludDhfdCAqX3NyYywgaW50IGhhc190b3BsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworCisgICAgUFJFRElDVF84eDhfTE9BRF9MRUZUOworICAgIFBSRURJQ1RfOHg4X0xPQURfVE9QOworICAgIGNvbnN0IHBpeGVsNCBkYyA9IFBJWEVMX1NQTEFUX1g0KChsMCtsMStsMitsMytsNCtsNStsNitsNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICt0MCt0MSt0Mit0Myt0NCt0NSt0Nit0Nys4KSA+PiA0KTsKKyAgICBQUkVESUNUXzh4OF9EQyhkYyk7Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkOHg4bF9ob3Jpem9udGFsKSh1aW50OF90ICpfc3JjLCBpbnQgaGFzX3RvcGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKyAgICBwaXhlbDQgYTsKKworICAgIFBSRURJQ1RfOHg4X0xPQURfTEVGVDsKKyNkZWZpbmUgUk9XKHkpIGEgPSBQSVhFTF9TUExBVF9YNChsIyN5KTsgXAorICAgICAgICAgICAgICAgQVZfV040UEEoc3JjK3kqc3RyaWRlLCBhKTsgXAorICAgICAgICAgICAgICAgQVZfV040UEEoc3JjK3kqc3RyaWRlKzQsIGEpOworICAgIFJPVygwKTsgUk9XKDEpOyBST1coMik7IFJPVygzKTsgUk9XKDQpOyBST1coNSk7IFJPVyg2KTsgUk9XKDcpOworI3VuZGVmIFJPVworfQorc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OGxfdmVydGljYWwpKHVpbnQ4X3QgKl9zcmMsIGludCBoYXNfdG9wbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBpbnQgeTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKyAgICBwaXhlbDQgYSwgYjsKKworICAgIFBSRURJQ1RfOHg4X0xPQURfVE9QOworICAgIHNyY1swXSA9IHQwOworICAgIHNyY1sxXSA9IHQxOworICAgIHNyY1syXSA9IHQyOworICAgIHNyY1szXSA9IHQzOworICAgIHNyY1s0XSA9IHQ0OworICAgIHNyY1s1XSA9IHQ1OworICAgIHNyY1s2XSA9IHQ2OworICAgIHNyY1s3XSA9IHQ3OworICAgIGEgPSBBVl9STjRQQSgoKHBpeGVsNCopc3JjKSswKTsKKyAgICBiID0gQVZfUk40UEEoKChwaXhlbDQqKXNyYykrMSk7CisgICAgZm9yKCB5ID0gMTsgeSA8IDg7IHkrKyApIHsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMreSpzdHJpZGUpKSswLCBhKTsKKyAgICAgICAgQVZfV040UEEoKChwaXhlbDQqKShzcmMreSpzdHJpZGUpKSsxLCBiKTsKKyAgICB9Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkOHg4bF9kb3duX2xlZnQpKHVpbnQ4X3QgKl9zcmMsIGludCBoYXNfdG9wbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgcHRyZGlmZl90IF9zdHJpZGUpCit7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBpbnQgc3RyaWRlID0gX3N0cmlkZT4+KHNpemVvZihwaXhlbCktMSk7CisgICAgUFJFRElDVF84eDhfTE9BRF9UT1A7CisgICAgUFJFRElDVF84eDhfTE9BRF9UT1BSSUdIVDsKKyAgICBTUkMoMCwwKT0gKHQwICsgMip0MSArIHQyICsgMikgPj4gMjsKKyAgICBTUkMoMCwxKT1TUkMoMSwwKT0gKHQxICsgMip0MiArIHQzICsgMikgPj4gMjsKKyAgICBTUkMoMCwyKT1TUkMoMSwxKT1TUkMoMiwwKT0gKHQyICsgMip0MyArIHQ0ICsgMikgPj4gMjsKKyAgICBTUkMoMCwzKT1TUkMoMSwyKT1TUkMoMiwxKT1TUkMoMywwKT0gKHQzICsgMip0NCArIHQ1ICsgMikgPj4gMjsKKyAgICBTUkMoMCw0KT1TUkMoMSwzKT1TUkMoMiwyKT1TUkMoMywxKT1TUkMoNCwwKT0gKHQ0ICsgMip0NSArIHQ2ICsgMikgPj4gMjsKKyAgICBTUkMoMCw1KT1TUkMoMSw0KT1TUkMoMiwzKT1TUkMoMywyKT1TUkMoNCwxKT1TUkMoNSwwKT0gKHQ1ICsgMip0NiArIHQ3ICsgMikgPj4gMjsKKyAgICBTUkMoMCw2KT1TUkMoMSw1KT1TUkMoMiw0KT1TUkMoMywzKT1TUkMoNCwyKT1TUkMoNSwxKT1TUkMoNiwwKT0gKHQ2ICsgMip0NyArIHQ4ICsgMikgPj4gMjsKKyAgICBTUkMoMCw3KT1TUkMoMSw2KT1TUkMoMiw1KT1TUkMoMyw0KT1TUkMoNCwzKT1TUkMoNSwyKT1TUkMoNiwxKT1TUkMoNywwKT0gKHQ3ICsgMip0OCArIHQ5ICsgMikgPj4gMjsKKyAgICBTUkMoMSw3KT1TUkMoMiw2KT1TUkMoMyw1KT1TUkMoNCw0KT1TUkMoNSwzKT1TUkMoNiwyKT1TUkMoNywxKT0gKHQ4ICsgMip0OSArIHQxMCArIDIpID4+IDI7CisgICAgU1JDKDIsNyk9U1JDKDMsNik9U1JDKDQsNSk9U1JDKDUsNCk9U1JDKDYsMyk9U1JDKDcsMik9ICh0OSArIDIqdDEwICsgdDExICsgMikgPj4gMjsKKyAgICBTUkMoMyw3KT1TUkMoNCw2KT1TUkMoNSw1KT1TUkMoNiw0KT1TUkMoNywzKT0gKHQxMCArIDIqdDExICsgdDEyICsgMikgPj4gMjsKKyAgICBTUkMoNCw3KT1TUkMoNSw2KT1TUkMoNiw1KT1TUkMoNyw0KT0gKHQxMSArIDIqdDEyICsgdDEzICsgMikgPj4gMjsKKyAgICBTUkMoNSw3KT1TUkMoNiw2KT1TUkMoNyw1KT0gKHQxMiArIDIqdDEzICsgdDE0ICsgMikgPj4gMjsKKyAgICBTUkMoNiw3KT1TUkMoNyw2KT0gKHQxMyArIDIqdDE0ICsgdDE1ICsgMikgPj4gMjsKKyAgICBTUkMoNyw3KT0gKHQxNCArIDMqdDE1ICsgMikgPj4gMjsKK30KK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ4eDhsX2Rvd25fcmlnaHQpKHVpbnQ4X3QgKl9zcmMsIGludCBoYXNfdG9wbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICAgIFBSRURJQ1RfOHg4X0xPQURfVE9QOworICAgIFBSRURJQ1RfOHg4X0xPQURfTEVGVDsKKyAgICBQUkVESUNUXzh4OF9MT0FEX1RPUExFRlQ7CisgICAgU1JDKDAsNyk9IChsNyArIDIqbDYgKyBsNSArIDIpID4+IDI7CisgICAgU1JDKDAsNik9U1JDKDEsNyk9IChsNiArIDIqbDUgKyBsNCArIDIpID4+IDI7CisgICAgU1JDKDAsNSk9U1JDKDEsNik9U1JDKDIsNyk9IChsNSArIDIqbDQgKyBsMyArIDIpID4+IDI7CisgICAgU1JDKDAsNCk9U1JDKDEsNSk9U1JDKDIsNik9U1JDKDMsNyk9IChsNCArIDIqbDMgKyBsMiArIDIpID4+IDI7CisgICAgU1JDKDAsMyk9U1JDKDEsNCk9U1JDKDIsNSk9U1JDKDMsNik9U1JDKDQsNyk9IChsMyArIDIqbDIgKyBsMSArIDIpID4+IDI7CisgICAgU1JDKDAsMik9U1JDKDEsMyk9U1JDKDIsNCk9U1JDKDMsNSk9U1JDKDQsNik9U1JDKDUsNyk9IChsMiArIDIqbDEgKyBsMCArIDIpID4+IDI7CisgICAgU1JDKDAsMSk9U1JDKDEsMik9U1JDKDIsMyk9U1JDKDMsNCk9U1JDKDQsNSk9U1JDKDUsNik9U1JDKDYsNyk9IChsMSArIDIqbDAgKyBsdCArIDIpID4+IDI7CisgICAgU1JDKDAsMCk9U1JDKDEsMSk9U1JDKDIsMik9U1JDKDMsMyk9U1JDKDQsNCk9U1JDKDUsNSk9U1JDKDYsNik9U1JDKDcsNyk9IChsMCArIDIqbHQgKyB0MCArIDIpID4+IDI7CisgICAgU1JDKDEsMCk9U1JDKDIsMSk9U1JDKDMsMik9U1JDKDQsMyk9U1JDKDUsNCk9U1JDKDYsNSk9U1JDKDcsNik9IChsdCArIDIqdDAgKyB0MSArIDIpID4+IDI7CisgICAgU1JDKDIsMCk9U1JDKDMsMSk9U1JDKDQsMik9U1JDKDUsMyk9U1JDKDYsNCk9U1JDKDcsNSk9ICh0MCArIDIqdDEgKyB0MiArIDIpID4+IDI7CisgICAgU1JDKDMsMCk9U1JDKDQsMSk9U1JDKDUsMik9U1JDKDYsMyk9U1JDKDcsNCk9ICh0MSArIDIqdDIgKyB0MyArIDIpID4+IDI7CisgICAgU1JDKDQsMCk9U1JDKDUsMSk9U1JDKDYsMik9U1JDKDcsMyk9ICh0MiArIDIqdDMgKyB0NCArIDIpID4+IDI7CisgICAgU1JDKDUsMCk9U1JDKDYsMSk9U1JDKDcsMik9ICh0MyArIDIqdDQgKyB0NSArIDIpID4+IDI7CisgICAgU1JDKDYsMCk9U1JDKDcsMSk9ICh0NCArIDIqdDUgKyB0NiArIDIpID4+IDI7CisgICAgU1JDKDcsMCk9ICh0NSArIDIqdDYgKyB0NyArIDIpID4+IDI7Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkOHg4bF92ZXJ0aWNhbF9yaWdodCkodWludDhfdCAqX3NyYywgaW50IGhhc190b3BsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICAgIFBSRURJQ1RfOHg4X0xPQURfVE9QOworICAgIFBSRURJQ1RfOHg4X0xPQURfTEVGVDsKKyAgICBQUkVESUNUXzh4OF9MT0FEX1RPUExFRlQ7CisgICAgU1JDKDAsNik9IChsNSArIDIqbDQgKyBsMyArIDIpID4+IDI7CisgICAgU1JDKDAsNyk9IChsNiArIDIqbDUgKyBsNCArIDIpID4+IDI7CisgICAgU1JDKDAsNCk9U1JDKDEsNik9IChsMyArIDIqbDIgKyBsMSArIDIpID4+IDI7CisgICAgU1JDKDAsNSk9U1JDKDEsNyk9IChsNCArIDIqbDMgKyBsMiArIDIpID4+IDI7CisgICAgU1JDKDAsMik9U1JDKDEsNCk9U1JDKDIsNik9IChsMSArIDIqbDAgKyBsdCArIDIpID4+IDI7CisgICAgU1JDKDAsMyk9U1JDKDEsNSk9U1JDKDIsNyk9IChsMiArIDIqbDEgKyBsMCArIDIpID4+IDI7CisgICAgU1JDKDAsMSk9U1JDKDEsMyk9U1JDKDIsNSk9U1JDKDMsNyk9IChsMCArIDIqbHQgKyB0MCArIDIpID4+IDI7CisgICAgU1JDKDAsMCk9U1JDKDEsMik9U1JDKDIsNCk9U1JDKDMsNik9IChsdCArIHQwICsgMSkgPj4gMTsKKyAgICBTUkMoMSwxKT1TUkMoMiwzKT1TUkMoMyw1KT1TUkMoNCw3KT0gKGx0ICsgMip0MCArIHQxICsgMikgPj4gMjsKKyAgICBTUkMoMSwwKT1TUkMoMiwyKT1TUkMoMyw0KT1TUkMoNCw2KT0gKHQwICsgdDEgKyAxKSA+PiAxOworICAgIFNSQygyLDEpPVNSQygzLDMpPVNSQyg0LDUpPVNSQyg1LDcpPSAodDAgKyAyKnQxICsgdDIgKyAyKSA+PiAyOworICAgIFNSQygyLDApPVNSQygzLDIpPVNSQyg0LDQpPVNSQyg1LDYpPSAodDEgKyB0MiArIDEpID4+IDE7CisgICAgU1JDKDMsMSk9U1JDKDQsMyk9U1JDKDUsNSk9U1JDKDYsNyk9ICh0MSArIDIqdDIgKyB0MyArIDIpID4+IDI7CisgICAgU1JDKDMsMCk9U1JDKDQsMik9U1JDKDUsNCk9U1JDKDYsNik9ICh0MiArIHQzICsgMSkgPj4gMTsKKyAgICBTUkMoNCwxKT1TUkMoNSwzKT1TUkMoNiw1KT1TUkMoNyw3KT0gKHQyICsgMip0MyArIHQ0ICsgMikgPj4gMjsKKyAgICBTUkMoNCwwKT1TUkMoNSwyKT1TUkMoNiw0KT1TUkMoNyw2KT0gKHQzICsgdDQgKyAxKSA+PiAxOworICAgIFNSQyg1LDEpPVNSQyg2LDMpPVNSQyg3LDUpPSAodDMgKyAyKnQ0ICsgdDUgKyAyKSA+PiAyOworICAgIFNSQyg1LDApPVNSQyg2LDIpPVNSQyg3LDQpPSAodDQgKyB0NSArIDEpID4+IDE7CisgICAgU1JDKDYsMSk9U1JDKDcsMyk9ICh0NCArIDIqdDUgKyB0NiArIDIpID4+IDI7CisgICAgU1JDKDYsMCk9U1JDKDcsMik9ICh0NSArIHQ2ICsgMSkgPj4gMTsKKyAgICBTUkMoNywxKT0gKHQ1ICsgMip0NiArIHQ3ICsgMikgPj4gMjsKKyAgICBTUkMoNywwKT0gKHQ2ICsgdDcgKyAxKSA+PiAxOworfQorc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OGxfaG9yaXpvbnRhbF9kb3duKSh1aW50OF90ICpfc3JjLCBpbnQgaGFzX3RvcGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIHB0cmRpZmZfdCBfc3RyaWRlKQoreworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICAgIFBSRURJQ1RfOHg4X0xPQURfVE9QOworICAgIFBSRURJQ1RfOHg4X0xPQURfTEVGVDsKKyAgICBQUkVESUNUXzh4OF9MT0FEX1RPUExFRlQ7CisgICAgU1JDKDAsNyk9IChsNiArIGw3ICsgMSkgPj4gMTsKKyAgICBTUkMoMSw3KT0gKGw1ICsgMipsNiArIGw3ICsgMikgPj4gMjsKKyAgICBTUkMoMCw2KT1TUkMoMiw3KT0gKGw1ICsgbDYgKyAxKSA+PiAxOworICAgIFNSQygxLDYpPVNSQygzLDcpPSAobDQgKyAyKmw1ICsgbDYgKyAyKSA+PiAyOworICAgIFNSQygwLDUpPVNSQygyLDYpPVNSQyg0LDcpPSAobDQgKyBsNSArIDEpID4+IDE7CisgICAgU1JDKDEsNSk9U1JDKDMsNik9U1JDKDUsNyk9IChsMyArIDIqbDQgKyBsNSArIDIpID4+IDI7CisgICAgU1JDKDAsNCk9U1JDKDIsNSk9U1JDKDQsNik9U1JDKDYsNyk9IChsMyArIGw0ICsgMSkgPj4gMTsKKyAgICBTUkMoMSw0KT1TUkMoMyw1KT1TUkMoNSw2KT1TUkMoNyw3KT0gKGwyICsgMipsMyArIGw0ICsgMikgPj4gMjsKKyAgICBTUkMoMCwzKT1TUkMoMiw0KT1TUkMoNCw1KT1TUkMoNiw2KT0gKGwyICsgbDMgKyAxKSA+PiAxOworICAgIFNSQygxLDMpPVNSQygzLDQpPVNSQyg1LDUpPVNSQyg3LDYpPSAobDEgKyAyKmwyICsgbDMgKyAyKSA+PiAyOworICAgIFNSQygwLDIpPVNSQygyLDMpPVNSQyg0LDQpPVNSQyg2LDUpPSAobDEgKyBsMiArIDEpID4+IDE7CisgICAgU1JDKDEsMik9U1JDKDMsMyk9U1JDKDUsNCk9U1JDKDcsNSk9IChsMCArIDIqbDEgKyBsMiArIDIpID4+IDI7CisgICAgU1JDKDAsMSk9U1JDKDIsMik9U1JDKDQsMyk9U1JDKDYsNCk9IChsMCArIGwxICsgMSkgPj4gMTsKKyAgICBTUkMoMSwxKT1TUkMoMywyKT1TUkMoNSwzKT1TUkMoNyw0KT0gKGx0ICsgMipsMCArIGwxICsgMikgPj4gMjsKKyAgICBTUkMoMCwwKT1TUkMoMiwxKT1TUkMoNCwyKT1TUkMoNiwzKT0gKGx0ICsgbDAgKyAxKSA+PiAxOworICAgIFNSQygxLDApPVNSQygzLDEpPVNSQyg1LDIpPVNSQyg3LDMpPSAobDAgKyAyKmx0ICsgdDAgKyAyKSA+PiAyOworICAgIFNSQygyLDApPVNSQyg0LDEpPVNSQyg2LDIpPSAodDEgKyAyKnQwICsgbHQgKyAyKSA+PiAyOworICAgIFNSQygzLDApPVNSQyg1LDEpPVNSQyg3LDIpPSAodDIgKyAyKnQxICsgdDAgKyAyKSA+PiAyOworICAgIFNSQyg0LDApPVNSQyg2LDEpPSAodDMgKyAyKnQyICsgdDEgKyAyKSA+PiAyOworICAgIFNSQyg1LDApPVNSQyg3LDEpPSAodDQgKyAyKnQzICsgdDIgKyAyKSA+PiAyOworICAgIFNSQyg2LDApPSAodDUgKyAyKnQ0ICsgdDMgKyAyKSA+PiAyOworICAgIFNSQyg3LDApPSAodDYgKyAyKnQ1ICsgdDQgKyAyKSA+PiAyOworfQorc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OGxfdmVydGljYWxfbGVmdCkodWludDhfdCAqX3NyYywgaW50IGhhc190b3BsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgcHRyZGlmZl90IF9zdHJpZGUpCit7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBpbnQgc3RyaWRlID0gX3N0cmlkZT4+KHNpemVvZihwaXhlbCktMSk7CisgICAgUFJFRElDVF84eDhfTE9BRF9UT1A7CisgICAgUFJFRElDVF84eDhfTE9BRF9UT1BSSUdIVDsKKyAgICBTUkMoMCwwKT0gKHQwICsgdDEgKyAxKSA+PiAxOworICAgIFNSQygwLDEpPSAodDAgKyAyKnQxICsgdDIgKyAyKSA+PiAyOworICAgIFNSQygwLDIpPVNSQygxLDApPSAodDEgKyB0MiArIDEpID4+IDE7CisgICAgU1JDKDAsMyk9U1JDKDEsMSk9ICh0MSArIDIqdDIgKyB0MyArIDIpID4+IDI7CisgICAgU1JDKDAsNCk9U1JDKDEsMik9U1JDKDIsMCk9ICh0MiArIHQzICsgMSkgPj4gMTsKKyAgICBTUkMoMCw1KT1TUkMoMSwzKT1TUkMoMiwxKT0gKHQyICsgMip0MyArIHQ0ICsgMikgPj4gMjsKKyAgICBTUkMoMCw2KT1TUkMoMSw0KT1TUkMoMiwyKT1TUkMoMywwKT0gKHQzICsgdDQgKyAxKSA+PiAxOworICAgIFNSQygwLDcpPVNSQygxLDUpPVNSQygyLDMpPVNSQygzLDEpPSAodDMgKyAyKnQ0ICsgdDUgKyAyKSA+PiAyOworICAgIFNSQygxLDYpPVNSQygyLDQpPVNSQygzLDIpPVNSQyg0LDApPSAodDQgKyB0NSArIDEpID4+IDE7CisgICAgU1JDKDEsNyk9U1JDKDIsNSk9U1JDKDMsMyk9U1JDKDQsMSk9ICh0NCArIDIqdDUgKyB0NiArIDIpID4+IDI7CisgICAgU1JDKDIsNik9U1JDKDMsNCk9U1JDKDQsMik9U1JDKDUsMCk9ICh0NSArIHQ2ICsgMSkgPj4gMTsKKyAgICBTUkMoMiw3KT1TUkMoMyw1KT1TUkMoNCwzKT1TUkMoNSwxKT0gKHQ1ICsgMip0NiArIHQ3ICsgMikgPj4gMjsKKyAgICBTUkMoMyw2KT1TUkMoNCw0KT1TUkMoNSwyKT1TUkMoNiwwKT0gKHQ2ICsgdDcgKyAxKSA+PiAxOworICAgIFNSQygzLDcpPVNSQyg0LDUpPVNSQyg1LDMpPVNSQyg2LDEpPSAodDYgKyAyKnQ3ICsgdDggKyAyKSA+PiAyOworICAgIFNSQyg0LDYpPVNSQyg1LDQpPVNSQyg2LDIpPVNSQyg3LDApPSAodDcgKyB0OCArIDEpID4+IDE7CisgICAgU1JDKDQsNyk9U1JDKDUsNSk9U1JDKDYsMyk9U1JDKDcsMSk9ICh0NyArIDIqdDggKyB0OSArIDIpID4+IDI7CisgICAgU1JDKDUsNik9U1JDKDYsNCk9U1JDKDcsMik9ICh0OCArIHQ5ICsgMSkgPj4gMTsKKyAgICBTUkMoNSw3KT1TUkMoNiw1KT1TUkMoNywzKT0gKHQ4ICsgMip0OSArIHQxMCArIDIpID4+IDI7CisgICAgU1JDKDYsNik9U1JDKDcsNCk9ICh0OSArIHQxMCArIDEpID4+IDE7CisgICAgU1JDKDYsNyk9U1JDKDcsNSk9ICh0OSArIDIqdDEwICsgdDExICsgMikgPj4gMjsKKyAgICBTUkMoNyw2KT0gKHQxMCArIHQxMSArIDEpID4+IDE7CisgICAgU1JDKDcsNyk9ICh0MTAgKyAyKnQxMSArIHQxMiArIDIpID4+IDI7Cit9CitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkOHg4bF9ob3Jpem9udGFsX3VwKSh1aW50OF90ICpfc3JjLCBpbnQgaGFzX3RvcGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGludCBzdHJpZGUgPSBfc3RyaWRlPj4oc2l6ZW9mKHBpeGVsKS0xKTsKKyAgICBQUkVESUNUXzh4OF9MT0FEX0xFRlQ7CisgICAgU1JDKDAsMCk9IChsMCArIGwxICsgMSkgPj4gMTsKKyAgICBTUkMoMSwwKT0gKGwwICsgMipsMSArIGwyICsgMikgPj4gMjsKKyAgICBTUkMoMCwxKT1TUkMoMiwwKT0gKGwxICsgbDIgKyAxKSA+PiAxOworICAgIFNSQygxLDEpPVNSQygzLDApPSAobDEgKyAyKmwyICsgbDMgKyAyKSA+PiAyOworICAgIFNSQygwLDIpPVNSQygyLDEpPVNSQyg0LDApPSAobDIgKyBsMyArIDEpID4+IDE7CisgICAgU1JDKDEsMik9U1JDKDMsMSk9U1JDKDUsMCk9IChsMiArIDIqbDMgKyBsNCArIDIpID4+IDI7CisgICAgU1JDKDAsMyk9U1JDKDIsMik9U1JDKDQsMSk9U1JDKDYsMCk9IChsMyArIGw0ICsgMSkgPj4gMTsKKyAgICBTUkMoMSwzKT1TUkMoMywyKT1TUkMoNSwxKT1TUkMoNywwKT0gKGwzICsgMipsNCArIGw1ICsgMikgPj4gMjsKKyAgICBTUkMoMCw0KT1TUkMoMiwzKT1TUkMoNCwyKT1TUkMoNiwxKT0gKGw0ICsgbDUgKyAxKSA+PiAxOworICAgIFNSQygxLDQpPVNSQygzLDMpPVNSQyg1LDIpPVNSQyg3LDEpPSAobDQgKyAyKmw1ICsgbDYgKyAyKSA+PiAyOworICAgIFNSQygwLDUpPVNSQygyLDQpPVNSQyg0LDMpPVNSQyg2LDIpPSAobDUgKyBsNiArIDEpID4+IDE7CisgICAgU1JDKDEsNSk9U1JDKDMsNCk9U1JDKDUsMyk9U1JDKDcsMik9IChsNSArIDIqbDYgKyBsNyArIDIpID4+IDI7CisgICAgU1JDKDAsNik9U1JDKDIsNSk9U1JDKDQsNCk9U1JDKDYsMyk9IChsNiArIGw3ICsgMSkgPj4gMTsKKyAgICBTUkMoMSw2KT1TUkMoMyw1KT1TUkMoNSw0KT1TUkMoNywzKT0gKGw2ICsgMypsNyArIDIpID4+IDI7CisgICAgU1JDKDAsNyk9U1JDKDEsNyk9U1JDKDIsNik9U1JDKDIsNyk9U1JDKDMsNik9CisgICAgU1JDKDMsNyk9U1JDKDQsNSk9U1JDKDQsNik9U1JDKDQsNyk9U1JDKDUsNSk9CisgICAgU1JDKDUsNik9U1JDKDUsNyk9U1JDKDYsNCk9U1JDKDYsNSk9U1JDKDYsNik9CisgICAgU1JDKDYsNyk9U1JDKDcsNCk9U1JDKDcsNSk9U1JDKDcsNik9U1JDKDcsNyk9IGw3OworfQorCitzdGF0aWMgdm9pZCBGVU5DQyhwcmVkOHg4bF92ZXJ0aWNhbF9maWx0ZXJfYWRkKSh1aW50OF90ICpfc3JjLCBpbnQxNl90ICpfYmxvY2ssIGludCBoYXNfdG9wbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGNvbnN0IGRjdGNvZWYgKmJsb2NrID0gKGNvbnN0IGRjdGNvZWYqKV9ibG9jazsKKyAgICBwaXhlbCBwaXhbOF07CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICAgIFBSRURJQ1RfOHg4X0xPQURfVE9QOworCisgICAgcGl4WzBdID0gdDA7CisgICAgcGl4WzFdID0gdDE7CisgICAgcGl4WzJdID0gdDI7CisgICAgcGl4WzNdID0gdDM7CisgICAgcGl4WzRdID0gdDQ7CisgICAgcGl4WzVdID0gdDU7CisgICAgcGl4WzZdID0gdDY7CisgICAgcGl4WzddID0gdDc7CisKKyAgICBmb3IoaT0wOyBpPDg7IGkrKyl7CisgICAgICAgIHBpeGVsIHYgPSBwaXhbaV07CisgICAgICAgIHNyY1swKnN0cmlkZV09IHYgKz0gYmxvY2tbMF07CisgICAgICAgIHNyY1sxKnN0cmlkZV09IHYgKz0gYmxvY2tbOF07CisgICAgICAgIHNyY1syKnN0cmlkZV09IHYgKz0gYmxvY2tbMTZdOworICAgICAgICBzcmNbMypzdHJpZGVdPSB2ICs9IGJsb2NrWzI0XTsKKyAgICAgICAgc3JjWzQqc3RyaWRlXT0gdiArPSBibG9ja1szMl07CisgICAgICAgIHNyY1s1KnN0cmlkZV09IHYgKz0gYmxvY2tbNDBdOworICAgICAgICBzcmNbNipzdHJpZGVdPSB2ICs9IGJsb2NrWzQ4XTsKKyAgICAgICAgc3JjWzcqc3RyaWRlXT0gdiArICBibG9ja1s1Nl07CisgICAgICAgIHNyYysrOworICAgICAgICBibG9jaysrOworICAgIH0KKworICAgIG1lbXNldChfYmxvY2ssIDAsIHNpemVvZihkY3Rjb2VmKSAqIDY0KTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OGxfaG9yaXpvbnRhbF9maWx0ZXJfYWRkKSh1aW50OF90ICpfc3JjLCBpbnQxNl90ICpfYmxvY2ssIGludCBoYXNfdG9wbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBwdHJkaWZmX3QgX3N0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIGNvbnN0IGRjdGNvZWYgKmJsb2NrID0gKGNvbnN0IGRjdGNvZWYqKV9ibG9jazsKKyAgICBwaXhlbCBwaXhbOF07CisgICAgaW50IHN0cmlkZSA9IF9zdHJpZGU+PihzaXplb2YocGl4ZWwpLTEpOworICAgIFBSRURJQ1RfOHg4X0xPQURfTEVGVDsKKworICAgIHBpeFswXSA9IGwwOworICAgIHBpeFsxXSA9IGwxOworICAgIHBpeFsyXSA9IGwyOworICAgIHBpeFszXSA9IGwzOworICAgIHBpeFs0XSA9IGw0OworICAgIHBpeFs1XSA9IGw1OworICAgIHBpeFs2XSA9IGw2OworICAgIHBpeFs3XSA9IGw3OworCisgICAgZm9yKGk9MDsgaTw4OyBpKyspeworICAgICAgICBwaXhlbCB2ID0gcGl4W2ldOworICAgICAgICBzcmNbMF09IHYgKz0gYmxvY2tbMF07CisgICAgICAgIHNyY1sxXT0gdiArPSBibG9ja1sxXTsKKyAgICAgICAgc3JjWzJdPSB2ICs9IGJsb2NrWzJdOworICAgICAgICBzcmNbM109IHYgKz0gYmxvY2tbM107CisgICAgICAgIHNyY1s0XT0gdiArPSBibG9ja1s0XTsKKyAgICAgICAgc3JjWzVdPSB2ICs9IGJsb2NrWzVdOworICAgICAgICBzcmNbNl09IHYgKz0gYmxvY2tbNl07CisgICAgICAgIHNyY1s3XT0gdiArICBibG9ja1s3XTsKKyAgICAgICAgc3JjKz0gc3RyaWRlOworICAgICAgICBibG9jays9IDg7CisgICAgfQorCisgICAgbWVtc2V0KF9ibG9jaywgMCwgc2l6ZW9mKGRjdGNvZWYpICogNjQpOworfQorCisjdW5kZWYgUFJFRElDVF84eDhfTE9BRF9MRUZUCisjdW5kZWYgUFJFRElDVF84eDhfTE9BRF9UT1AKKyN1bmRlZiBQUkVESUNUXzh4OF9MT0FEX1RPUExFRlQKKyN1bmRlZiBQUkVESUNUXzh4OF9MT0FEX1RPUFJJR0hUCisjdW5kZWYgUFJFRElDVF84eDhfREMKKyN1bmRlZiBQVFIKKyN1bmRlZiBQVAorI3VuZGVmIFBMCisjdW5kZWYgU1JDCisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ0eDRfdmVydGljYWxfYWRkKSh1aW50OF90ICpfcGl4LCBpbnQxNl90ICpfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBwaXhlbCAqcGl4ID0gKHBpeGVsKilfcGl4OworICAgIGNvbnN0IGRjdGNvZWYgKmJsb2NrID0gKGNvbnN0IGRjdGNvZWYqKV9ibG9jazsKKyAgICBzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTsKKyAgICBwaXggLT0gc3RyaWRlOworICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgcGl4ZWwgdiA9IHBpeFswXTsKKyAgICAgICAgcGl4WzEqc3RyaWRlXT0gdiArPSBibG9ja1swXTsKKyAgICAgICAgcGl4WzIqc3RyaWRlXT0gdiArPSBibG9ja1s0XTsKKyAgICAgICAgcGl4WzMqc3RyaWRlXT0gdiArPSBibG9ja1s4XTsKKyAgICAgICAgcGl4WzQqc3RyaWRlXT0gdiArICBibG9ja1sxMl07CisgICAgICAgIHBpeCsrOworICAgICAgICBibG9jaysrOworICAgIH0KKworICAgIG1lbXNldChfYmxvY2ssIDAsIHNpemVvZihkY3Rjb2VmKSAqIDE2KTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDR4NF9ob3Jpem9udGFsX2FkZCkodWludDhfdCAqX3BpeCwgaW50MTZfdCAqX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBwaXhlbCAqcGl4ID0gKHBpeGVsKilfcGl4OworICAgIGNvbnN0IGRjdGNvZWYgKmJsb2NrID0gKGNvbnN0IGRjdGNvZWYqKV9ibG9jazsKKyAgICBzdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTsKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7CisgICAgICAgIHBpeGVsIHYgPSBwaXhbLTFdOworICAgICAgICBwaXhbMF09IHYgKz0gYmxvY2tbMF07CisgICAgICAgIHBpeFsxXT0gdiArPSBibG9ja1sxXTsKKyAgICAgICAgcGl4WzJdPSB2ICs9IGJsb2NrWzJdOworICAgICAgICBwaXhbM109IHYgKyAgYmxvY2tbM107CisgICAgICAgIHBpeCs9IHN0cmlkZTsKKyAgICAgICAgYmxvY2srPSA0OworICAgIH0KKworICAgIG1lbXNldChfYmxvY2ssIDAsIHNpemVvZihkY3Rjb2VmKSAqIDE2KTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OGxfdmVydGljYWxfYWRkKSh1aW50OF90ICpfcGl4LCBpbnQxNl90ICpfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgcGl4ZWwgKnBpeCA9IChwaXhlbCopX3BpeDsKKyAgICBjb25zdCBkY3Rjb2VmICpibG9jayA9IChjb25zdCBkY3Rjb2VmKilfYmxvY2s7CisgICAgc3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7CisgICAgcGl4IC09IHN0cmlkZTsKKyAgICBmb3IoaT0wOyBpPDg7IGkrKyl7CisgICAgICAgIHBpeGVsIHYgPSBwaXhbMF07CisgICAgICAgIHBpeFsxKnN0cmlkZV09IHYgKz0gYmxvY2tbMF07CisgICAgICAgIHBpeFsyKnN0cmlkZV09IHYgKz0gYmxvY2tbOF07CisgICAgICAgIHBpeFszKnN0cmlkZV09IHYgKz0gYmxvY2tbMTZdOworICAgICAgICBwaXhbNCpzdHJpZGVdPSB2ICs9IGJsb2NrWzI0XTsKKyAgICAgICAgcGl4WzUqc3RyaWRlXT0gdiArPSBibG9ja1szMl07CisgICAgICAgIHBpeFs2KnN0cmlkZV09IHYgKz0gYmxvY2tbNDBdOworICAgICAgICBwaXhbNypzdHJpZGVdPSB2ICs9IGJsb2NrWzQ4XTsKKyAgICAgICAgcGl4Wzgqc3RyaWRlXT0gdiArICBibG9ja1s1Nl07CisgICAgICAgIHBpeCsrOworICAgICAgICBibG9jaysrOworICAgIH0KKworICAgIG1lbXNldChfYmxvY2ssIDAsIHNpemVvZihkY3Rjb2VmKSAqIDY0KTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4OGxfaG9yaXpvbnRhbF9hZGQpKHVpbnQ4X3QgKl9waXgsIGludDE2X3QgKl9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludCBpOworICAgIHBpeGVsICpwaXggPSAocGl4ZWwqKV9waXg7CisgICAgY29uc3QgZGN0Y29lZiAqYmxvY2sgPSAoY29uc3QgZGN0Y29lZiopX2Jsb2NrOworICAgIHN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xOworICAgIGZvcihpPTA7IGk8ODsgaSsrKXsKKyAgICAgICAgcGl4ZWwgdiA9IHBpeFstMV07CisgICAgICAgIHBpeFswXT0gdiArPSBibG9ja1swXTsKKyAgICAgICAgcGl4WzFdPSB2ICs9IGJsb2NrWzFdOworICAgICAgICBwaXhbMl09IHYgKz0gYmxvY2tbMl07CisgICAgICAgIHBpeFszXT0gdiArPSBibG9ja1szXTsKKyAgICAgICAgcGl4WzRdPSB2ICs9IGJsb2NrWzRdOworICAgICAgICBwaXhbNV09IHYgKz0gYmxvY2tbNV07CisgICAgICAgIHBpeFs2XT0gdiArPSBibG9ja1s2XTsKKyAgICAgICAgcGl4WzddPSB2ICsgIGJsb2NrWzddOworICAgICAgICBwaXgrPSBzdHJpZGU7CisgICAgICAgIGJsb2NrKz0gODsKKyAgICB9CisKKyAgICBtZW1zZXQoX2Jsb2NrLCAwLCBzaXplb2YoZGN0Y29lZikgKiA2NCk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQxNngxNl92ZXJ0aWNhbF9hZGQpKHVpbnQ4X3QgKnBpeCwgY29uc3QgaW50ICpibG9ja19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKQorICAgICAgICBGVU5DQyhwcmVkNHg0X3ZlcnRpY2FsX2FkZCkocGl4ICsgYmxvY2tfb2Zmc2V0W2ldLCBibG9jayArIGkqMTYqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDE2eDE2X2hvcml6b250YWxfYWRkKSh1aW50OF90ICpwaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoaT0wOyBpPDE2OyBpKyspCisgICAgICAgIEZVTkNDKHByZWQ0eDRfaG9yaXpvbnRhbF9hZGQpKHBpeCArIGJsb2NrX29mZnNldFtpXSwgYmxvY2sgKyBpKjE2KnNpemVvZihwaXhlbCksIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ4eDhfdmVydGljYWxfYWRkKSh1aW50OF90ICpwaXgsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludCBpOworICAgIGZvcihpPTA7IGk8NDsgaSsrKQorICAgICAgICBGVU5DQyhwcmVkNHg0X3ZlcnRpY2FsX2FkZCkocGl4ICsgYmxvY2tfb2Zmc2V0W2ldLCBibG9jayArIGkqMTYqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgRlVOQ0MocHJlZDh4MTZfdmVydGljYWxfYWRkKSh1aW50OF90ICpwaXgsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgRlVOQ0MocHJlZDR4NF92ZXJ0aWNhbF9hZGQpKHBpeCArIGJsb2NrX29mZnNldFtpXSwgYmxvY2sgKyBpKjE2KnNpemVvZihwaXhlbCksIHN0cmlkZSk7CisgICAgZm9yKGk9NDsgaTw4OyBpKyspCisgICAgICAgIEZVTkNDKHByZWQ0eDRfdmVydGljYWxfYWRkKShwaXggKyBibG9ja19vZmZzZXRbaSs0XSwgYmxvY2sgKyBpKjE2KnNpemVvZihwaXhlbCksIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ4eDhfaG9yaXpvbnRhbF9hZGQpKHVpbnQ4X3QgKnBpeCwgY29uc3QgaW50ICpibG9ja19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgZm9yKGk9MDsgaTw0OyBpKyspCisgICAgICAgIEZVTkNDKHByZWQ0eDRfaG9yaXpvbnRhbF9hZGQpKHBpeCArIGJsb2NrX29mZnNldFtpXSwgYmxvY2sgKyBpKjE2KnNpemVvZihwaXhlbCksIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkNDKHByZWQ4eDE2X2hvcml6b250YWxfYWRkKSh1aW50OF90ICpwaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpibG9ja19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgZm9yKGk9MDsgaTw0OyBpKyspCisgICAgICAgIEZVTkNDKHByZWQ0eDRfaG9yaXpvbnRhbF9hZGQpKHBpeCArIGJsb2NrX29mZnNldFtpXSwgYmxvY2sgKyBpKjE2KnNpemVvZihwaXhlbCksIHN0cmlkZSk7CisgICAgZm9yKGk9NDsgaTw4OyBpKyspCisgICAgICAgIEZVTkNDKHByZWQ0eDRfaG9yaXpvbnRhbF9hZGQpKHBpeCArIGJsb2NrX29mZnNldFtpKzRdLCBibG9jayArIGkqMTYqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRxcGVsLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0cXBlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMWJmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oMjY0cXBlbC5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZW5jb2Rlci9kZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJoMjY0cXBlbC5oIgorCisjZGVmaW5lIHBpeGVsdG1wIGludDE2X3QKKyNkZWZpbmUgQklUX0RFUFRIIDgKKyNpbmNsdWRlICJoMjY0cXBlbF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCA5CisjaW5jbHVkZSAiaDI2NHFwZWxfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKworI2RlZmluZSBCSVRfREVQVEggMTAKKyNpbmNsdWRlICJoMjY0cXBlbF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorI3VuZGVmIHBpeGVsdG1wCisKKyNkZWZpbmUgcGl4ZWx0bXAgaW50MzJfdAorI2RlZmluZSBCSVRfREVQVEggMTIKKyNpbmNsdWRlICJoMjY0cXBlbF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCAxNAorI2luY2x1ZGUgImgyNjRxcGVsX3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKworYXZfY29sZCB2b2lkIGZmX2gyNjRxcGVsX2luaXQoSDI2NFFwZWxDb250ZXh0ICpjLCBpbnQgYml0X2RlcHRoKQoreworI3VuZGVmIEZVTkNDCisjZGVmaW5lIEZVTkNDKGYsIGRlcHRoKSBmICMjIF8gIyMgZGVwdGggIyMgX2MKKworI2RlZmluZSBkc3BmdW5jMihQRlgsIElEWCwgTlVNLCBkZXB0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyAwXSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMDAsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyAxXSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMTAsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyAyXSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMjAsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyAzXSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMzAsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA0XSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMDEsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA1XSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMTEsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA2XSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMjEsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA3XSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMzEsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA4XSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMDIsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA5XSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMTIsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzEwXSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMjIsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzExXSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMzIsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzEyXSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMDMsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzEzXSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMTMsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzE0XSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMjMsIGRlcHRoKTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzE1XSA9IEZVTkNDKFBGWCAjIyBOVU0gIyMgX21jMzMsIGRlcHRoKQorCisjZGVmaW5lIFNFVF9RUEVMKGRlcHRoKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHNwZnVuYzIocHV0X2gyNjRfcXBlbCwgMCwgMTYsIGRlcHRoKTsgICAgICBcCisgICAgZHNwZnVuYzIocHV0X2gyNjRfcXBlbCwgMSwgIDgsIGRlcHRoKTsgICAgICBcCisgICAgZHNwZnVuYzIocHV0X2gyNjRfcXBlbCwgMiwgIDQsIGRlcHRoKTsgICAgICBcCisgICAgZHNwZnVuYzIocHV0X2gyNjRfcXBlbCwgMywgIDIsIGRlcHRoKTsgICAgICBcCisgICAgZHNwZnVuYzIoYXZnX2gyNjRfcXBlbCwgMCwgMTYsIGRlcHRoKTsgICAgICBcCisgICAgZHNwZnVuYzIoYXZnX2gyNjRfcXBlbCwgMSwgIDgsIGRlcHRoKTsgICAgICBcCisgICAgZHNwZnVuYzIoYXZnX2gyNjRfcXBlbCwgMiwgIDQsIGRlcHRoKQorCisgICAgc3dpdGNoIChiaXRfZGVwdGgpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICBTRVRfUVBFTCg4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5OgorICAgICAgICBTRVRfUVBFTCg5KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgICAgU0VUX1FQRUwoMTApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgICBTRVRfUVBFTCgxMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTQ6CisgICAgICAgIFNFVF9RUEVMKDE0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKEFSQ0hfQUFSQ0g2NCkKKyAgICAgICAgZmZfaDI2NHFwZWxfaW5pdF9hYXJjaDY0KGMsIGJpdF9kZXB0aCk7CisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl9oMjY0cXBlbF9pbml0X2FybShjLCBiaXRfZGVwdGgpOworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfaDI2NHFwZWxfaW5pdF9wcGMoYywgYml0X2RlcHRoKTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2gyNjRxcGVsX2luaXRfeDg2KGMsIGJpdF9kZXB0aCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oMjY0cXBlbC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NHFwZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzExMzBkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NHFwZWwuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZW5jb2Rlci9kZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSDI2NFFQRUxfSAorI2RlZmluZSBBVkNPREVDX0gyNjRRUEVMX0gKKworI2luY2x1ZGUgInFwZWxkc3AuaCIKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFFwZWxDb250ZXh0IHsKKyAgICBxcGVsX21jX2Z1bmMgcHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzRdWzE2XTsKKyAgICBxcGVsX21jX2Z1bmMgYXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzRdWzE2XTsKK30gSDI2NFFwZWxDb250ZXh0OworCit2b2lkIGZmX2gyNjRxcGVsX2luaXQoSDI2NFFwZWxDb250ZXh0ICpjLCBpbnQgYml0X2RlcHRoKTsKKwordm9pZCBmZl9oMjY0cXBlbF9pbml0X2FhcmNoNjQoSDI2NFFwZWxDb250ZXh0ICpjLCBpbnQgYml0X2RlcHRoKTsKK3ZvaWQgZmZfaDI2NHFwZWxfaW5pdF9hcm0oSDI2NFFwZWxDb250ZXh0ICpjLCBpbnQgYml0X2RlcHRoKTsKK3ZvaWQgZmZfaDI2NHFwZWxfaW5pdF9wcGMoSDI2NFFwZWxDb250ZXh0ICpjLCBpbnQgYml0X2RlcHRoKTsKK3ZvaWQgZmZfaDI2NHFwZWxfaW5pdF94ODYoSDI2NFFwZWxDb250ZXh0ICpjLCBpbnQgYml0X2RlcHRoKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSDI2NFFQRUxfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaDI2NHFwZWxfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRxcGVsX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjNWI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2gyNjRxcGVsX3RlbXBsYXRlLmMKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBlbmNvZGVyL2RlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDEwIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjaW5jbHVkZSAiYml0X2RlcHRoX3RlbXBsYXRlLmMiCisjaW5jbHVkZSAiaHBlbF90ZW1wbGF0ZS5jIgorI2luY2x1ZGUgInBlbF90ZW1wbGF0ZS5jIgorCitzdGF0aWMgaW5saW5lIHZvaWQgRlVOQyhjb3B5X2Jsb2NrMikodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKQoreworICAgIGludCBpOworICAgIGZvcihpPTA7IGk8aDsgaSsrKQorICAgIHsKKyAgICAgICAgQVZfV04yUChkc3QgICAsIEFWX1JOMlAoc3JjICAgKSk7CisgICAgICAgIGRzdCs9ZHN0U3RyaWRlOworICAgICAgICBzcmMrPXNyY1N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBGVU5DKGNvcHlfYmxvY2s0KSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50IGgpCit7CisgICAgaW50IGk7CisgICAgZm9yKGk9MDsgaTxoOyBpKyspCisgICAgeworICAgICAgICBBVl9XTjRQKGRzdCAgICwgQVZfUk40UChzcmMgICApKTsKKyAgICAgICAgZHN0Kz1kc3RTdHJpZGU7CisgICAgICAgIHNyYys9c3JjU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIEZVTkMoY29weV9ibG9jazgpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoaT0wOyBpPGg7IGkrKykKKyAgICB7CisgICAgICAgIEFWX1dONFAoZHN0ICAgICAgICAgICAgICAgICwgQVZfUk40UChzcmMgICAgICAgICAgICAgICAgKSk7CisgICAgICAgIEFWX1dONFAoZHN0KzQqc2l6ZW9mKHBpeGVsKSwgQVZfUk40UChzcmMrNCpzaXplb2YocGl4ZWwpKSk7CisgICAgICAgIGRzdCs9ZHN0U3RyaWRlOworICAgICAgICBzcmMrPXNyY1N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBGVU5DKGNvcHlfYmxvY2sxNikodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKQoreworICAgIGludCBpOworICAgIGZvcihpPTA7IGk8aDsgaSsrKQorICAgIHsKKyAgICAgICAgQVZfV040UChkc3QgICAgICAgICAgICAgICAgICwgQVZfUk40UChzcmMgICAgICAgICAgICAgICAgICkpOworICAgICAgICBBVl9XTjRQKGRzdCsgNCpzaXplb2YocGl4ZWwpLCBBVl9STjRQKHNyYysgNCpzaXplb2YocGl4ZWwpKSk7CisgICAgICAgIEFWX1dONFAoZHN0KyA4KnNpemVvZihwaXhlbCksIEFWX1JONFAoc3JjKyA4KnNpemVvZihwaXhlbCkpKTsKKyAgICAgICAgQVZfV040UChkc3QrMTIqc2l6ZW9mKHBpeGVsKSwgQVZfUk40UChzcmMrMTIqc2l6ZW9mKHBpeGVsKSkpOworICAgICAgICBkc3QrPWRzdFN0cmlkZTsKKyAgICAgICAgc3JjKz1zcmNTdHJpZGU7CisgICAgfQorfQorCisjZGVmaW5lIEgyNjRfTE9XUEFTUyhPUE5BTUUsIE9QLCBPUDIpIFwKK3N0YXRpYyBhdl91bnVzZWQgdm9pZCBGVU5DKE9QTkFNRSAjIyBoMjY0X3FwZWwyX2hfbG93cGFzcykodWludDhfdCAqcF9kc3QsIGNvbnN0IHVpbnQ4X3QgKnBfc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgY29uc3QgaW50IGg9MjtcCisgICAgSU5JVF9DTElQXAorICAgIGludCBpO1wKKyAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilwX2RzdDtcCisgICAgY29uc3QgcGl4ZWwgKnNyYyA9IChjb25zdCBwaXhlbCopcF9zcmM7XAorICAgIGRzdFN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xO1wKKyAgICBzcmNTdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTtcCisgICAgZm9yKGk9MDsgaTxoOyBpKyspXAorICAgIHtcCisgICAgICAgIE9QKGRzdFswXSwgKHNyY1swXStzcmNbMV0pKjIwIC0gKHNyY1stMV0rc3JjWzJdKSo1ICsgKHNyY1stMl0rc3JjWzNdKSk7XAorICAgICAgICBPUChkc3RbMV0sIChzcmNbMV0rc3JjWzJdKSoyMCAtIChzcmNbMCBdK3NyY1szXSkqNSArIChzcmNbLTFdK3NyY1s0XSkpO1wKKyAgICAgICAgZHN0Kz1kc3RTdHJpZGU7XAorICAgICAgICBzcmMrPXNyY1N0cmlkZTtcCisgICAgfVwKK31cCitcCitzdGF0aWMgYXZfdW51c2VkIHZvaWQgRlVOQyhPUE5BTUUgIyMgaDI2NF9xcGVsMl92X2xvd3Bhc3MpKHVpbnQ4X3QgKl9kc3QsIGNvbnN0IHVpbnQ4X3QgKl9zcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKKyAgICBjb25zdCBpbnQgdz0yO1wKKyAgICBJTklUX0NMSVBcCisgICAgaW50IGk7XAorICAgIHBpeGVsICpkc3QgPSAocGl4ZWwqKV9kc3Q7XAorICAgIGNvbnN0IHBpeGVsICpzcmMgPSAoY29uc3QgcGl4ZWwqKV9zcmM7XAorICAgIGRzdFN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xO1wKKyAgICBzcmNTdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTtcCisgICAgZm9yKGk9MDsgaTx3OyBpKyspXAorICAgIHtcCisgICAgICAgIGNvbnN0IGludCBzcmNCPSBzcmNbLTIqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmNBPSBzcmNbLTEqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMwPSBzcmNbMCAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMxPSBzcmNbMSAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMyPSBzcmNbMiAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMzPSBzcmNbMyAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM0PSBzcmNbNCAqc3JjU3RyaWRlXTtcCisgICAgICAgIE9QKGRzdFswKmRzdFN0cmlkZV0sIChzcmMwK3NyYzEpKjIwIC0gKHNyY0Erc3JjMikqNSArIChzcmNCK3NyYzMpKTtcCisgICAgICAgIE9QKGRzdFsxKmRzdFN0cmlkZV0sIChzcmMxK3NyYzIpKjIwIC0gKHNyYzArc3JjMykqNSArIChzcmNBK3NyYzQpKTtcCisgICAgICAgIGRzdCsrO1wKKyAgICAgICAgc3JjKys7XAorICAgIH1cCit9XAorXAorc3RhdGljIGF2X3VudXNlZCB2b2lkIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbDJfaHZfbG93cGFzcykodWludDhfdCAqX2RzdCwgcGl4ZWx0bXAgKnRtcCwgY29uc3QgdWludDhfdCAqX3NyYywgaW50IGRzdFN0cmlkZSwgaW50IHRtcFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGNvbnN0IGludCBoPTI7XAorICAgIGNvbnN0IGludCB3PTI7XAorICAgIGNvbnN0IGludCBwYWQgPSAoQklUX0RFUFRIID09IDEwKSA/ICgtMTAgKiAoKDE8PEJJVF9ERVBUSCktMSkpIDogMDtcCisgICAgSU5JVF9DTElQXAorICAgIGludCBpO1wKKyAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilfZHN0O1wKKyAgICBjb25zdCBwaXhlbCAqc3JjID0gKGNvbnN0IHBpeGVsKilfc3JjO1wKKyAgICBkc3RTdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTtcCisgICAgc3JjU3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7XAorICAgIHNyYyAtPSAyKnNyY1N0cmlkZTtcCisgICAgZm9yKGk9MDsgaTxoKzU7IGkrKylcCisgICAge1wKKyAgICAgICAgdG1wWzBdPSAoc3JjWzBdK3NyY1sxXSkqMjAgLSAoc3JjWy0xXStzcmNbMl0pKjUgKyAoc3JjWy0yXStzcmNbM10pICsgcGFkO1wKKyAgICAgICAgdG1wWzFdPSAoc3JjWzFdK3NyY1syXSkqMjAgLSAoc3JjWzAgXStzcmNbM10pKjUgKyAoc3JjWy0xXStzcmNbNF0pICsgcGFkO1wKKyAgICAgICAgdG1wKz10bXBTdHJpZGU7XAorICAgICAgICBzcmMrPXNyY1N0cmlkZTtcCisgICAgfVwKKyAgICB0bXAgLT0gdG1wU3RyaWRlKihoKzUtMik7XAorICAgIGZvcihpPTA7IGk8dzsgaSsrKVwKKyAgICB7XAorICAgICAgICBjb25zdCBpbnQgdG1wQj0gdG1wWy0yKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wQT0gdG1wWy0xKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wMD0gdG1wWzAgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wMT0gdG1wWzEgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wMj0gdG1wWzIgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wMz0gdG1wWzMgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wND0gdG1wWzQgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBPUDIoZHN0WzAqZHN0U3RyaWRlXSwgKHRtcDArdG1wMSkqMjAgLSAodG1wQSt0bXAyKSo1ICsgKHRtcEIrdG1wMykpO1wKKyAgICAgICAgT1AyKGRzdFsxKmRzdFN0cmlkZV0sICh0bXAxK3RtcDIpKjIwIC0gKHRtcDArdG1wMykqNSArICh0bXBBK3RtcDQpKTtcCisgICAgICAgIGRzdCsrO1wKKyAgICAgICAgdG1wKys7XAorICAgIH1cCit9XAorc3RhdGljIHZvaWQgRlVOQyhPUE5BTUUgIyMgaDI2NF9xcGVsNF9oX2xvd3Bhc3MpKHVpbnQ4X3QgKl9kc3QsIGNvbnN0IHVpbnQ4X3QgKl9zcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKKyAgICBjb25zdCBpbnQgaD00O1wKKyAgICBJTklUX0NMSVBcCisgICAgaW50IGk7XAorICAgIHBpeGVsICpkc3QgPSAocGl4ZWwqKV9kc3Q7XAorICAgIGNvbnN0IHBpeGVsICpzcmMgPSAoY29uc3QgcGl4ZWwqKV9zcmM7XAorICAgIGRzdFN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xO1wKKyAgICBzcmNTdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTtcCisgICAgZm9yKGk9MDsgaTxoOyBpKyspXAorICAgIHtcCisgICAgICAgIE9QKGRzdFswXSwgKHNyY1swXStzcmNbMV0pKjIwIC0gKHNyY1stMV0rc3JjWzJdKSo1ICsgKHNyY1stMl0rc3JjWzNdKSk7XAorICAgICAgICBPUChkc3RbMV0sIChzcmNbMV0rc3JjWzJdKSoyMCAtIChzcmNbMCBdK3NyY1szXSkqNSArIChzcmNbLTFdK3NyY1s0XSkpO1wKKyAgICAgICAgT1AoZHN0WzJdLCAoc3JjWzJdK3NyY1szXSkqMjAgLSAoc3JjWzEgXStzcmNbNF0pKjUgKyAoc3JjWzAgXStzcmNbNV0pKTtcCisgICAgICAgIE9QKGRzdFszXSwgKHNyY1szXStzcmNbNF0pKjIwIC0gKHNyY1syIF0rc3JjWzVdKSo1ICsgKHNyY1sxIF0rc3JjWzZdKSk7XAorICAgICAgICBkc3QrPWRzdFN0cmlkZTtcCisgICAgICAgIHNyYys9c3JjU3RyaWRlO1wKKyAgICB9XAorfVwKK1wKK3N0YXRpYyB2b2lkIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbDRfdl9sb3dwYXNzKSh1aW50OF90ICpfZHN0LCBjb25zdCB1aW50OF90ICpfc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgY29uc3QgaW50IHc9NDtcCisgICAgSU5JVF9DTElQXAorICAgIGludCBpO1wKKyAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilfZHN0O1wKKyAgICBjb25zdCBwaXhlbCAqc3JjID0gKGNvbnN0IHBpeGVsKilfc3JjO1wKKyAgICBkc3RTdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTtcCisgICAgc3JjU3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7XAorICAgIGZvcihpPTA7IGk8dzsgaSsrKVwKKyAgICB7XAorICAgICAgICBjb25zdCBpbnQgc3JjQj0gc3JjWy0yKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjQT0gc3JjWy0xKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjMD0gc3JjWzAgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjMT0gc3JjWzEgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjMj0gc3JjWzIgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjMz0gc3JjWzMgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjND0gc3JjWzQgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjNT0gc3JjWzUgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjNj0gc3JjWzYgKnNyY1N0cmlkZV07XAorICAgICAgICBPUChkc3RbMCpkc3RTdHJpZGVdLCAoc3JjMCtzcmMxKSoyMCAtIChzcmNBK3NyYzIpKjUgKyAoc3JjQitzcmMzKSk7XAorICAgICAgICBPUChkc3RbMSpkc3RTdHJpZGVdLCAoc3JjMStzcmMyKSoyMCAtIChzcmMwK3NyYzMpKjUgKyAoc3JjQStzcmM0KSk7XAorICAgICAgICBPUChkc3RbMipkc3RTdHJpZGVdLCAoc3JjMitzcmMzKSoyMCAtIChzcmMxK3NyYzQpKjUgKyAoc3JjMCtzcmM1KSk7XAorICAgICAgICBPUChkc3RbMypkc3RTdHJpZGVdLCAoc3JjMytzcmM0KSoyMCAtIChzcmMyK3NyYzUpKjUgKyAoc3JjMStzcmM2KSk7XAorICAgICAgICBkc3QrKztcCisgICAgICAgIHNyYysrO1wKKyAgICB9XAorfVwKK1wKK3N0YXRpYyB2b2lkIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbDRfaHZfbG93cGFzcykodWludDhfdCAqX2RzdCwgcGl4ZWx0bXAgKnRtcCwgY29uc3QgdWludDhfdCAqX3NyYywgaW50IGRzdFN0cmlkZSwgaW50IHRtcFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGNvbnN0IGludCBoPTQ7XAorICAgIGNvbnN0IGludCB3PTQ7XAorICAgIGNvbnN0IGludCBwYWQgPSAoQklUX0RFUFRIID09IDEwKSA/ICgtMTAgKiAoKDE8PEJJVF9ERVBUSCktMSkpIDogMDtcCisgICAgSU5JVF9DTElQXAorICAgIGludCBpO1wKKyAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilfZHN0O1wKKyAgICBjb25zdCBwaXhlbCAqc3JjID0gKGNvbnN0IHBpeGVsKilfc3JjO1wKKyAgICBkc3RTdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTtcCisgICAgc3JjU3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7XAorICAgIHNyYyAtPSAyKnNyY1N0cmlkZTtcCisgICAgZm9yKGk9MDsgaTxoKzU7IGkrKylcCisgICAge1wKKyAgICAgICAgdG1wWzBdPSAoc3JjWzBdK3NyY1sxXSkqMjAgLSAoc3JjWy0xXStzcmNbMl0pKjUgKyAoc3JjWy0yXStzcmNbM10pICsgcGFkO1wKKyAgICAgICAgdG1wWzFdPSAoc3JjWzFdK3NyY1syXSkqMjAgLSAoc3JjWzAgXStzcmNbM10pKjUgKyAoc3JjWy0xXStzcmNbNF0pICsgcGFkO1wKKyAgICAgICAgdG1wWzJdPSAoc3JjWzJdK3NyY1szXSkqMjAgLSAoc3JjWzEgXStzcmNbNF0pKjUgKyAoc3JjWzAgXStzcmNbNV0pICsgcGFkO1wKKyAgICAgICAgdG1wWzNdPSAoc3JjWzNdK3NyY1s0XSkqMjAgLSAoc3JjWzIgXStzcmNbNV0pKjUgKyAoc3JjWzEgXStzcmNbNl0pICsgcGFkO1wKKyAgICAgICAgdG1wKz10bXBTdHJpZGU7XAorICAgICAgICBzcmMrPXNyY1N0cmlkZTtcCisgICAgfVwKKyAgICB0bXAgLT0gdG1wU3RyaWRlKihoKzUtMik7XAorICAgIGZvcihpPTA7IGk8dzsgaSsrKVwKKyAgICB7XAorICAgICAgICBjb25zdCBpbnQgdG1wQj0gdG1wWy0yKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wQT0gdG1wWy0xKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wMD0gdG1wWzAgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wMT0gdG1wWzEgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wMj0gdG1wWzIgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wMz0gdG1wWzMgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wND0gdG1wWzQgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wNT0gdG1wWzUgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBjb25zdCBpbnQgdG1wNj0gdG1wWzYgKnRtcFN0cmlkZV0gLSBwYWQ7XAorICAgICAgICBPUDIoZHN0WzAqZHN0U3RyaWRlXSwgKHRtcDArdG1wMSkqMjAgLSAodG1wQSt0bXAyKSo1ICsgKHRtcEIrdG1wMykpO1wKKyAgICAgICAgT1AyKGRzdFsxKmRzdFN0cmlkZV0sICh0bXAxK3RtcDIpKjIwIC0gKHRtcDArdG1wMykqNSArICh0bXBBK3RtcDQpKTtcCisgICAgICAgIE9QMihkc3RbMipkc3RTdHJpZGVdLCAodG1wMit0bXAzKSoyMCAtICh0bXAxK3RtcDQpKjUgKyAodG1wMCt0bXA1KSk7XAorICAgICAgICBPUDIoZHN0WzMqZHN0U3RyaWRlXSwgKHRtcDMrdG1wNCkqMjAgLSAodG1wMit0bXA1KSo1ICsgKHRtcDErdG1wNikpO1wKKyAgICAgICAgZHN0Kys7XAorICAgICAgICB0bXArKztcCisgICAgfVwKK31cCitcCitzdGF0aWMgdm9pZCBGVU5DKE9QTkFNRSAjIyBoMjY0X3FwZWw4X2hfbG93cGFzcykodWludDhfdCAqX2RzdCwgY29uc3QgdWludDhfdCAqX3NyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGNvbnN0IGludCBoPTg7XAorICAgIElOSVRfQ0xJUFwKKyAgICBpbnQgaTtcCisgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCopX2RzdDtcCisgICAgY29uc3QgcGl4ZWwgKnNyYyA9IChjb25zdCBwaXhlbCopX3NyYztcCisgICAgZHN0U3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7XAorICAgIHNyY1N0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xO1wKKyAgICBmb3IoaT0wOyBpPGg7IGkrKylcCisgICAge1wKKyAgICAgICAgT1AoZHN0WzBdLCAoc3JjWzBdK3NyY1sxXSkqMjAgLSAoc3JjWy0xXStzcmNbMl0pKjUgKyAoc3JjWy0yXStzcmNbMyBdKSk7XAorICAgICAgICBPUChkc3RbMV0sIChzcmNbMV0rc3JjWzJdKSoyMCAtIChzcmNbMCBdK3NyY1szXSkqNSArIChzcmNbLTFdK3NyY1s0IF0pKTtcCisgICAgICAgIE9QKGRzdFsyXSwgKHNyY1syXStzcmNbM10pKjIwIC0gKHNyY1sxIF0rc3JjWzRdKSo1ICsgKHNyY1swIF0rc3JjWzUgXSkpO1wKKyAgICAgICAgT1AoZHN0WzNdLCAoc3JjWzNdK3NyY1s0XSkqMjAgLSAoc3JjWzIgXStzcmNbNV0pKjUgKyAoc3JjWzEgXStzcmNbNiBdKSk7XAorICAgICAgICBPUChkc3RbNF0sIChzcmNbNF0rc3JjWzVdKSoyMCAtIChzcmNbMyBdK3NyY1s2XSkqNSArIChzcmNbMiBdK3NyY1s3IF0pKTtcCisgICAgICAgIE9QKGRzdFs1XSwgKHNyY1s1XStzcmNbNl0pKjIwIC0gKHNyY1s0IF0rc3JjWzddKSo1ICsgKHNyY1szIF0rc3JjWzggXSkpO1wKKyAgICAgICAgT1AoZHN0WzZdLCAoc3JjWzZdK3NyY1s3XSkqMjAgLSAoc3JjWzUgXStzcmNbOF0pKjUgKyAoc3JjWzQgXStzcmNbOSBdKSk7XAorICAgICAgICBPUChkc3RbN10sIChzcmNbN10rc3JjWzhdKSoyMCAtIChzcmNbNiBdK3NyY1s5XSkqNSArIChzcmNbNSBdK3NyY1sxMF0pKTtcCisgICAgICAgIGRzdCs9ZHN0U3RyaWRlO1wKKyAgICAgICAgc3JjKz1zcmNTdHJpZGU7XAorICAgIH1cCit9XAorXAorc3RhdGljIHZvaWQgRlVOQyhPUE5BTUUgIyMgaDI2NF9xcGVsOF92X2xvd3Bhc3MpKHVpbnQ4X3QgKl9kc3QsIGNvbnN0IHVpbnQ4X3QgKl9zcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKKyAgICBjb25zdCBpbnQgdz04O1wKKyAgICBJTklUX0NMSVBcCisgICAgaW50IGk7XAorICAgIHBpeGVsICpkc3QgPSAocGl4ZWwqKV9kc3Q7XAorICAgIGNvbnN0IHBpeGVsICpzcmMgPSAoY29uc3QgcGl4ZWwqKV9zcmM7XAorICAgIGRzdFN0cmlkZSA+Pj0gc2l6ZW9mKHBpeGVsKS0xO1wKKyAgICBzcmNTdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTtcCisgICAgZm9yKGk9MDsgaTx3OyBpKyspXAorICAgIHtcCisgICAgICAgIGNvbnN0IGludCBzcmNCPSBzcmNbLTIqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmNBPSBzcmNbLTEqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMwPSBzcmNbMCAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMxPSBzcmNbMSAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMyPSBzcmNbMiAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMzPSBzcmNbMyAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM0PSBzcmNbNCAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM1PSBzcmNbNSAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM2PSBzcmNbNiAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM3PSBzcmNbNyAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM4PSBzcmNbOCAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM5PSBzcmNbOSAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMxMD1zcmNbMTAqc3JjU3RyaWRlXTtcCisgICAgICAgIE9QKGRzdFswKmRzdFN0cmlkZV0sIChzcmMwK3NyYzEpKjIwIC0gKHNyY0Erc3JjMikqNSArIChzcmNCK3NyYzMpKTtcCisgICAgICAgIE9QKGRzdFsxKmRzdFN0cmlkZV0sIChzcmMxK3NyYzIpKjIwIC0gKHNyYzArc3JjMykqNSArIChzcmNBK3NyYzQpKTtcCisgICAgICAgIE9QKGRzdFsyKmRzdFN0cmlkZV0sIChzcmMyK3NyYzMpKjIwIC0gKHNyYzErc3JjNCkqNSArIChzcmMwK3NyYzUpKTtcCisgICAgICAgIE9QKGRzdFszKmRzdFN0cmlkZV0sIChzcmMzK3NyYzQpKjIwIC0gKHNyYzIrc3JjNSkqNSArIChzcmMxK3NyYzYpKTtcCisgICAgICAgIE9QKGRzdFs0KmRzdFN0cmlkZV0sIChzcmM0K3NyYzUpKjIwIC0gKHNyYzMrc3JjNikqNSArIChzcmMyK3NyYzcpKTtcCisgICAgICAgIE9QKGRzdFs1KmRzdFN0cmlkZV0sIChzcmM1K3NyYzYpKjIwIC0gKHNyYzQrc3JjNykqNSArIChzcmMzK3NyYzgpKTtcCisgICAgICAgIE9QKGRzdFs2KmRzdFN0cmlkZV0sIChzcmM2K3NyYzcpKjIwIC0gKHNyYzUrc3JjOCkqNSArIChzcmM0K3NyYzkpKTtcCisgICAgICAgIE9QKGRzdFs3KmRzdFN0cmlkZV0sIChzcmM3K3NyYzgpKjIwIC0gKHNyYzYrc3JjOSkqNSArIChzcmM1K3NyYzEwKSk7XAorICAgICAgICBkc3QrKztcCisgICAgICAgIHNyYysrO1wKKyAgICB9XAorfVwKK1wKK3N0YXRpYyB2b2lkIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbDhfaHZfbG93cGFzcykodWludDhfdCAqX2RzdCwgcGl4ZWx0bXAgKnRtcCwgY29uc3QgdWludDhfdCAqX3NyYywgaW50IGRzdFN0cmlkZSwgaW50IHRtcFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGNvbnN0IGludCBoPTg7XAorICAgIGNvbnN0IGludCB3PTg7XAorICAgIGNvbnN0IGludCBwYWQgPSAoQklUX0RFUFRIID09IDEwKSA/ICgtMTAgKiAoKDE8PEJJVF9ERVBUSCktMSkpIDogMDtcCisgICAgSU5JVF9DTElQXAorICAgIGludCBpO1wKKyAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilfZHN0O1wKKyAgICBjb25zdCBwaXhlbCAqc3JjID0gKGNvbnN0IHBpeGVsKilfc3JjO1wKKyAgICBkc3RTdHJpZGUgPj49IHNpemVvZihwaXhlbCktMTtcCisgICAgc3JjU3RyaWRlID4+PSBzaXplb2YocGl4ZWwpLTE7XAorICAgIHNyYyAtPSAyKnNyY1N0cmlkZTtcCisgICAgZm9yKGk9MDsgaTxoKzU7IGkrKylcCisgICAge1wKKyAgICAgICAgdG1wWzBdPSAoc3JjWzBdK3NyY1sxXSkqMjAgLSAoc3JjWy0xXStzcmNbMl0pKjUgKyAoc3JjWy0yXStzcmNbMyBdKSArIHBhZDtcCisgICAgICAgIHRtcFsxXT0gKHNyY1sxXStzcmNbMl0pKjIwIC0gKHNyY1swIF0rc3JjWzNdKSo1ICsgKHNyY1stMV0rc3JjWzQgXSkgKyBwYWQ7XAorICAgICAgICB0bXBbMl09IChzcmNbMl0rc3JjWzNdKSoyMCAtIChzcmNbMSBdK3NyY1s0XSkqNSArIChzcmNbMCBdK3NyY1s1IF0pICsgcGFkO1wKKyAgICAgICAgdG1wWzNdPSAoc3JjWzNdK3NyY1s0XSkqMjAgLSAoc3JjWzIgXStzcmNbNV0pKjUgKyAoc3JjWzEgXStzcmNbNiBdKSArIHBhZDtcCisgICAgICAgIHRtcFs0XT0gKHNyY1s0XStzcmNbNV0pKjIwIC0gKHNyY1szIF0rc3JjWzZdKSo1ICsgKHNyY1syIF0rc3JjWzcgXSkgKyBwYWQ7XAorICAgICAgICB0bXBbNV09IChzcmNbNV0rc3JjWzZdKSoyMCAtIChzcmNbNCBdK3NyY1s3XSkqNSArIChzcmNbMyBdK3NyY1s4IF0pICsgcGFkO1wKKyAgICAgICAgdG1wWzZdPSAoc3JjWzZdK3NyY1s3XSkqMjAgLSAoc3JjWzUgXStzcmNbOF0pKjUgKyAoc3JjWzQgXStzcmNbOSBdKSArIHBhZDtcCisgICAgICAgIHRtcFs3XT0gKHNyY1s3XStzcmNbOF0pKjIwIC0gKHNyY1s2IF0rc3JjWzldKSo1ICsgKHNyY1s1IF0rc3JjWzEwXSkgKyBwYWQ7XAorICAgICAgICB0bXArPXRtcFN0cmlkZTtcCisgICAgICAgIHNyYys9c3JjU3RyaWRlO1wKKyAgICB9XAorICAgIHRtcCAtPSB0bXBTdHJpZGUqKGgrNS0yKTtcCisgICAgZm9yKGk9MDsgaTx3OyBpKyspXAorICAgIHtcCisgICAgICAgIGNvbnN0IGludCB0bXBCPSB0bXBbLTIqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXBBPSB0bXBbLTEqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXAwPSB0bXBbMCAqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXAxPSB0bXBbMSAqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXAyPSB0bXBbMiAqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXAzPSB0bXBbMyAqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXA0PSB0bXBbNCAqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXA1PSB0bXBbNSAqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXA2PSB0bXBbNiAqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXA3PSB0bXBbNyAqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXA4PSB0bXBbOCAqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXA5PSB0bXBbOSAqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIGNvbnN0IGludCB0bXAxMD10bXBbMTAqdG1wU3RyaWRlXSAtIHBhZDtcCisgICAgICAgIE9QMihkc3RbMCpkc3RTdHJpZGVdLCAodG1wMCt0bXAxKSoyMCAtICh0bXBBK3RtcDIpKjUgKyAodG1wQit0bXAzKSk7XAorICAgICAgICBPUDIoZHN0WzEqZHN0U3RyaWRlXSwgKHRtcDErdG1wMikqMjAgLSAodG1wMCt0bXAzKSo1ICsgKHRtcEErdG1wNCkpO1wKKyAgICAgICAgT1AyKGRzdFsyKmRzdFN0cmlkZV0sICh0bXAyK3RtcDMpKjIwIC0gKHRtcDErdG1wNCkqNSArICh0bXAwK3RtcDUpKTtcCisgICAgICAgIE9QMihkc3RbMypkc3RTdHJpZGVdLCAodG1wMyt0bXA0KSoyMCAtICh0bXAyK3RtcDUpKjUgKyAodG1wMSt0bXA2KSk7XAorICAgICAgICBPUDIoZHN0WzQqZHN0U3RyaWRlXSwgKHRtcDQrdG1wNSkqMjAgLSAodG1wMyt0bXA2KSo1ICsgKHRtcDIrdG1wNykpO1wKKyAgICAgICAgT1AyKGRzdFs1KmRzdFN0cmlkZV0sICh0bXA1K3RtcDYpKjIwIC0gKHRtcDQrdG1wNykqNSArICh0bXAzK3RtcDgpKTtcCisgICAgICAgIE9QMihkc3RbNipkc3RTdHJpZGVdLCAodG1wNit0bXA3KSoyMCAtICh0bXA1K3RtcDgpKjUgKyAodG1wNCt0bXA5KSk7XAorICAgICAgICBPUDIoZHN0WzcqZHN0U3RyaWRlXSwgKHRtcDcrdG1wOCkqMjAgLSAodG1wNit0bXA5KSo1ICsgKHRtcDUrdG1wMTApKTtcCisgICAgICAgIGRzdCsrO1wKKyAgICAgICAgdG1wKys7XAorICAgIH1cCit9XAorXAorc3RhdGljIHZvaWQgRlVOQyhPUE5BTUUgIyMgaDI2NF9xcGVsMTZfdl9sb3dwYXNzKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbDhfdl9sb3dwYXNzKShkc3QgICAgICAgICAgICAgICAgLCBzcmMgICAgICAgICAgICAgICAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbDhfdl9sb3dwYXNzKShkc3QrOCpzaXplb2YocGl4ZWwpLCBzcmMrOCpzaXplb2YocGl4ZWwpLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIHNyYyArPSA4KnNyY1N0cmlkZTtcCisgICAgZHN0ICs9IDgqZHN0U3RyaWRlO1wKKyAgICBGVU5DKE9QTkFNRSAjIyBoMjY0X3FwZWw4X3ZfbG93cGFzcykoZHN0ICAgICAgICAgICAgICAgICwgc3JjICAgICAgICAgICAgICAgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBGVU5DKE9QTkFNRSAjIyBoMjY0X3FwZWw4X3ZfbG93cGFzcykoZHN0Kzgqc2l6ZW9mKHBpeGVsKSwgc3JjKzgqc2l6ZW9mKHBpeGVsKSwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBGVU5DKE9QTkFNRSAjIyBoMjY0X3FwZWwxNl9oX2xvd3Bhc3MpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgRlVOQyhPUE5BTUUgIyMgaDI2NF9xcGVsOF9oX2xvd3Bhc3MpKGRzdCAgICAgICAgICAgICAgICAsIHNyYyAgICAgICAgICAgICAgICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTtcCisgICAgRlVOQyhPUE5BTUUgIyMgaDI2NF9xcGVsOF9oX2xvd3Bhc3MpKGRzdCs4KnNpemVvZihwaXhlbCksIHNyYys4KnNpemVvZihwaXhlbCksIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTtcCisgICAgc3JjICs9IDgqc3JjU3RyaWRlO1wKKyAgICBkc3QgKz0gOCpkc3RTdHJpZGU7XAorICAgIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbDhfaF9sb3dwYXNzKShkc3QgICAgICAgICAgICAgICAgLCBzcmMgICAgICAgICAgICAgICAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbDhfaF9sb3dwYXNzKShkc3QrOCpzaXplb2YocGl4ZWwpLCBzcmMrOCpzaXplb2YocGl4ZWwpLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbDE2X2h2X2xvd3Bhc3MpKHVpbnQ4X3QgKmRzdCwgcGl4ZWx0bXAgKnRtcCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgdG1wU3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgRlVOQyhPUE5BTUUgIyMgaDI2NF9xcGVsOF9odl9sb3dwYXNzKShkc3QgICAgICAgICAgICAgICAgLCB0bXAgICwgc3JjICAgICAgICAgICAgICAgICwgZHN0U3RyaWRlLCB0bXBTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbDhfaHZfbG93cGFzcykoZHN0Kzgqc2l6ZW9mKHBpeGVsKSwgdG1wKzgsIHNyYys4KnNpemVvZihwaXhlbCksIGRzdFN0cmlkZSwgdG1wU3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBzcmMgKz0gOCpzcmNTdHJpZGU7XAorICAgIGRzdCArPSA4KmRzdFN0cmlkZTtcCisgICAgRlVOQyhPUE5BTUUgIyMgaDI2NF9xcGVsOF9odl9sb3dwYXNzKShkc3QgICAgICAgICAgICAgICAgLCB0bXAgICwgc3JjICAgICAgICAgICAgICAgICwgZHN0U3RyaWRlLCB0bXBTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbDhfaHZfbG93cGFzcykoZHN0Kzgqc2l6ZW9mKHBpeGVsKSwgdG1wKzgsIHNyYys4KnNpemVvZihwaXhlbCksIGRzdFN0cmlkZSwgdG1wU3RyaWRlLCBzcmNTdHJpZGUpO1wKK31cCisKKyNkZWZpbmUgSDI2NF9NQyhPUE5BTUUsIFNJWkUpIFwKK3N0YXRpYyB2b2lkIEZVTkNDKE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMwMCkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBGVU5DQyhPUE5BTUUgIyMgcGl4ZWxzICMjIFNJWkUpKGRzdCwgc3JjLCBzdHJpZGUsIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBGVU5DQyhPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMTApKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgdWludDhfdCBoYWxmW1NJWkUqU0laRSpzaXplb2YocGl4ZWwpXTtcCisgICAgRlVOQyhwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX2hfbG93cGFzcykoaGFsZiwgc3JjLCBTSVpFKnNpemVvZihwaXhlbCksIHN0cmlkZSk7XAorICAgIEZVTkMoT1BOQU1FICMjIHBpeGVscyAjIyBTSVpFICMjIF9sMikoZHN0LCBzcmMsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBGVU5DQyhPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMjApKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgRlVOQyhPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX2hfbG93cGFzcykoZHN0LCBzcmMsIHN0cmlkZSwgc3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgRlVOQ0MoT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzMwKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIHVpbnQ4X3QgaGFsZltTSVpFKlNJWkUqc2l6ZW9mKHBpeGVsKV07XAorICAgIEZVTkMocHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3MpKGhhbGYsIHNyYywgU0laRSpzaXplb2YocGl4ZWwpLCBzdHJpZGUpO1wKKyAgICBGVU5DKE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDIpKGRzdCwgc3JjK3NpemVvZihwaXhlbCksIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBGVU5DQyhPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMDEpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgdWludDhfdCBmdWxsW1NJWkUqKFNJWkUrNSkqc2l6ZW9mKHBpeGVsKV07XAorICAgIHVpbnQ4X3QgKiBjb25zdCBmdWxsX21pZD0gZnVsbCArIFNJWkUqMipzaXplb2YocGl4ZWwpO1wKKyAgICB1aW50OF90IGhhbGZbU0laRSpTSVpFKnNpemVvZihwaXhlbCldO1wKKyAgICBGVU5DKGNvcHlfYmxvY2sgIyMgU0laRSApKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCBTSVpFKnNpemVvZihwaXhlbCksICBzdHJpZGUsIFNJWkUgKyA1KTtcCisgICAgRlVOQyhwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzcykoaGFsZiwgZnVsbF9taWQsIFNJWkUqc2l6ZW9mKHBpeGVsKSwgU0laRSpzaXplb2YocGl4ZWwpKTtcCisgICAgRlVOQyhPUE5BTUUgIyMgcGl4ZWxzICMjIFNJWkUgIyMgX2wyKShkc3QsIGZ1bGxfbWlkLCBoYWxmLCBzdHJpZGUsIFNJWkUqc2l6ZW9mKHBpeGVsKSwgU0laRSpzaXplb2YocGl4ZWwpLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgRlVOQ0MoT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzAyKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIHVpbnQ4X3QgZnVsbFtTSVpFKihTSVpFKzUpKnNpemVvZihwaXhlbCldO1wKKyAgICB1aW50OF90ICogY29uc3QgZnVsbF9taWQ9IGZ1bGwgKyBTSVpFKjIqc2l6ZW9mKHBpeGVsKTtcCisgICAgRlVOQyhjb3B5X2Jsb2NrICMjIFNJWkUgKShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgU0laRSpzaXplb2YocGl4ZWwpLCAgc3RyaWRlLCBTSVpFICsgNSk7XAorICAgIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF92X2xvd3Bhc3MpKGRzdCwgZnVsbF9taWQsIHN0cmlkZSwgU0laRSpzaXplb2YocGl4ZWwpKTtcCit9XAorXAorc3RhdGljIHZvaWQgRlVOQ0MoT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzAzKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIHVpbnQ4X3QgZnVsbFtTSVpFKihTSVpFKzUpKnNpemVvZihwaXhlbCldO1wKKyAgICB1aW50OF90ICogY29uc3QgZnVsbF9taWQ9IGZ1bGwgKyBTSVpFKjIqc2l6ZW9mKHBpeGVsKTtcCisgICAgdWludDhfdCBoYWxmW1NJWkUqU0laRSpzaXplb2YocGl4ZWwpXTtcCisgICAgRlVOQyhjb3B5X2Jsb2NrICMjIFNJWkUgKShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgU0laRSpzaXplb2YocGl4ZWwpLCAgc3RyaWRlLCBTSVpFICsgNSk7XAorICAgIEZVTkMocHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF92X2xvd3Bhc3MpKGhhbGYsIGZ1bGxfbWlkLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUqc2l6ZW9mKHBpeGVsKSk7XAorICAgIEZVTkMoT1BOQU1FICMjIHBpeGVscyAjIyBTSVpFICMjIF9sMikoZHN0LCBmdWxsX21pZCtTSVpFKnNpemVvZihwaXhlbCksIGhhbGYsIHN0cmlkZSwgU0laRSpzaXplb2YocGl4ZWwpLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBGVU5DQyhPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMTEpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgdWludDhfdCBmdWxsW1NJWkUqKFNJWkUrNSkqc2l6ZW9mKHBpeGVsKV07XAorICAgIHVpbnQ4X3QgKiBjb25zdCBmdWxsX21pZD0gZnVsbCArIFNJWkUqMipzaXplb2YocGl4ZWwpO1wKKyAgICB1aW50OF90IGhhbGZIW1NJWkUqU0laRSpzaXplb2YocGl4ZWwpXTtcCisgICAgdWludDhfdCBoYWxmVltTSVpFKlNJWkUqc2l6ZW9mKHBpeGVsKV07XAorICAgIEZVTkMocHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3MpKGhhbGZILCBzcmMsIFNJWkUqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTtcCisgICAgRlVOQyhjb3B5X2Jsb2NrICMjIFNJWkUgKShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgU0laRSpzaXplb2YocGl4ZWwpLCAgc3RyaWRlLCBTSVpFICsgNSk7XAorICAgIEZVTkMocHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF92X2xvd3Bhc3MpKGhhbGZWLCBmdWxsX21pZCwgU0laRSpzaXplb2YocGl4ZWwpLCBTSVpFKnNpemVvZihwaXhlbCkpO1wKKyAgICBGVU5DKE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDIpKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIFNJWkUqc2l6ZW9mKHBpeGVsKSwgU0laRSpzaXplb2YocGl4ZWwpLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgRlVOQ0MoT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzMxKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIHVpbnQ4X3QgZnVsbFtTSVpFKihTSVpFKzUpKnNpemVvZihwaXhlbCldO1wKKyAgICB1aW50OF90ICogY29uc3QgZnVsbF9taWQ9IGZ1bGwgKyBTSVpFKjIqc2l6ZW9mKHBpeGVsKTtcCisgICAgdWludDhfdCBoYWxmSFtTSVpFKlNJWkUqc2l6ZW9mKHBpeGVsKV07XAorICAgIHVpbnQ4X3QgaGFsZlZbU0laRSpTSVpFKnNpemVvZihwaXhlbCldO1wKKyAgICBGVU5DKHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzKShoYWxmSCwgc3JjLCBTSVpFKnNpemVvZihwaXhlbCksIHN0cmlkZSk7XAorICAgIEZVTkMoY29weV9ibG9jayAjIyBTSVpFICkoZnVsbCwgc3JjIC0gc3RyaWRlKjIgKyBzaXplb2YocGl4ZWwpLCBTSVpFKnNpemVvZihwaXhlbCksICBzdHJpZGUsIFNJWkUgKyA1KTtcCisgICAgRlVOQyhwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzcykoaGFsZlYsIGZ1bGxfbWlkLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUqc2l6ZW9mKHBpeGVsKSk7XAorICAgIEZVTkMoT1BOQU1FICMjIHBpeGVscyAjIyBTSVpFICMjIF9sMikoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgU0laRSpzaXplb2YocGl4ZWwpLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBGVU5DQyhPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMTMpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgdWludDhfdCBmdWxsW1NJWkUqKFNJWkUrNSkqc2l6ZW9mKHBpeGVsKV07XAorICAgIHVpbnQ4X3QgKiBjb25zdCBmdWxsX21pZD0gZnVsbCArIFNJWkUqMipzaXplb2YocGl4ZWwpO1wKKyAgICB1aW50OF90IGhhbGZIW1NJWkUqU0laRSpzaXplb2YocGl4ZWwpXTtcCisgICAgdWludDhfdCBoYWxmVltTSVpFKlNJWkUqc2l6ZW9mKHBpeGVsKV07XAorICAgIEZVTkMocHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3MpKGhhbGZILCBzcmMgKyBzdHJpZGUsIFNJWkUqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTtcCisgICAgRlVOQyhjb3B5X2Jsb2NrICMjIFNJWkUgKShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgU0laRSpzaXplb2YocGl4ZWwpLCAgc3RyaWRlLCBTSVpFICsgNSk7XAorICAgIEZVTkMocHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF92X2xvd3Bhc3MpKGhhbGZWLCBmdWxsX21pZCwgU0laRSpzaXplb2YocGl4ZWwpLCBTSVpFKnNpemVvZihwaXhlbCkpO1wKKyAgICBGVU5DKE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDIpKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIFNJWkUqc2l6ZW9mKHBpeGVsKSwgU0laRSpzaXplb2YocGl4ZWwpLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgRlVOQ0MoT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzMzKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIHVpbnQ4X3QgZnVsbFtTSVpFKihTSVpFKzUpKnNpemVvZihwaXhlbCldO1wKKyAgICB1aW50OF90ICogY29uc3QgZnVsbF9taWQ9IGZ1bGwgKyBTSVpFKjIqc2l6ZW9mKHBpeGVsKTtcCisgICAgdWludDhfdCBoYWxmSFtTSVpFKlNJWkUqc2l6ZW9mKHBpeGVsKV07XAorICAgIHVpbnQ4X3QgaGFsZlZbU0laRSpTSVpFKnNpemVvZihwaXhlbCldO1wKKyAgICBGVU5DKHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzKShoYWxmSCwgc3JjICsgc3RyaWRlLCBTSVpFKnNpemVvZihwaXhlbCksIHN0cmlkZSk7XAorICAgIEZVTkMoY29weV9ibG9jayAjIyBTSVpFICkoZnVsbCwgc3JjIC0gc3RyaWRlKjIgKyBzaXplb2YocGl4ZWwpLCBTSVpFKnNpemVvZihwaXhlbCksICBzdHJpZGUsIFNJWkUgKyA1KTtcCisgICAgRlVOQyhwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzcykoaGFsZlYsIGZ1bGxfbWlkLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUqc2l6ZW9mKHBpeGVsKSk7XAorICAgIEZVTkMoT1BOQU1FICMjIHBpeGVscyAjIyBTSVpFICMjIF9sMikoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgU0laRSpzaXplb2YocGl4ZWwpLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBGVU5DQyhPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMjIpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgcGl4ZWx0bXAgdG1wW1NJWkUqKFNJWkUrNSkqc2l6ZW9mKHBpeGVsKV07XAorICAgIEZVTkMoT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9odl9sb3dwYXNzKShkc3QsIHRtcCwgc3JjLCBzdHJpZGUsIFNJWkUqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgRlVOQ0MoT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzIxKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIHBpeGVsdG1wIHRtcFtTSVpFKihTSVpFKzUpKnNpemVvZihwaXhlbCldO1wKKyAgICB1aW50OF90IGhhbGZIW1NJWkUqU0laRSpzaXplb2YocGl4ZWwpXTtcCisgICAgdWludDhfdCBoYWxmSFZbU0laRSpTSVpFKnNpemVvZihwaXhlbCldO1wKKyAgICBGVU5DKHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzKShoYWxmSCwgc3JjLCBTSVpFKnNpemVvZihwaXhlbCksIHN0cmlkZSk7XAorICAgIEZVTkMocHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF9odl9sb3dwYXNzKShoYWxmSFYsIHRtcCwgc3JjLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTtcCisgICAgRlVOQyhPUE5BTUUgIyMgcGl4ZWxzICMjIFNJWkUgIyMgX2wyKShkc3QsIGhhbGZILCBoYWxmSFYsIHN0cmlkZSwgU0laRSpzaXplb2YocGl4ZWwpLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBGVU5DQyhPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMjMpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgcGl4ZWx0bXAgdG1wW1NJWkUqKFNJWkUrNSkqc2l6ZW9mKHBpeGVsKV07XAorICAgIHVpbnQ4X3QgaGFsZkhbU0laRSpTSVpFKnNpemVvZihwaXhlbCldO1wKKyAgICB1aW50OF90IGhhbGZIVltTSVpFKlNJWkUqc2l6ZW9mKHBpeGVsKV07XAorICAgIEZVTkMocHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3MpKGhhbGZILCBzcmMgKyBzdHJpZGUsIFNJWkUqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTtcCisgICAgRlVOQyhwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX2h2X2xvd3Bhc3MpKGhhbGZIViwgdG1wLCBzcmMsIFNJWkUqc2l6ZW9mKHBpeGVsKSwgU0laRSpzaXplb2YocGl4ZWwpLCBzdHJpZGUpO1wKKyAgICBGVU5DKE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDIpKGRzdCwgaGFsZkgsIGhhbGZIViwgc3RyaWRlLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUqc2l6ZW9mKHBpeGVsKSwgU0laRSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIEZVTkNDKE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMxMikodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICB1aW50OF90IGZ1bGxbU0laRSooU0laRSs1KSpzaXplb2YocGl4ZWwpXTtcCisgICAgdWludDhfdCAqIGNvbnN0IGZ1bGxfbWlkPSBmdWxsICsgU0laRSoyKnNpemVvZihwaXhlbCk7XAorICAgIHBpeGVsdG1wIHRtcFtTSVpFKihTSVpFKzUpKnNpemVvZihwaXhlbCldO1wKKyAgICB1aW50OF90IGhhbGZWW1NJWkUqU0laRSpzaXplb2YocGl4ZWwpXTtcCisgICAgdWludDhfdCBoYWxmSFZbU0laRSpTSVpFKnNpemVvZihwaXhlbCldO1wKKyAgICBGVU5DKGNvcHlfYmxvY2sgIyMgU0laRSApKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCBTSVpFKnNpemVvZihwaXhlbCksICBzdHJpZGUsIFNJWkUgKyA1KTtcCisgICAgRlVOQyhwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzcykoaGFsZlYsIGZ1bGxfbWlkLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUqc2l6ZW9mKHBpeGVsKSk7XAorICAgIEZVTkMocHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF9odl9sb3dwYXNzKShoYWxmSFYsIHRtcCwgc3JjLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUqc2l6ZW9mKHBpeGVsKSwgc3RyaWRlKTtcCisgICAgRlVOQyhPUE5BTUUgIyMgcGl4ZWxzICMjIFNJWkUgIyMgX2wyKShkc3QsIGhhbGZWLCBoYWxmSFYsIHN0cmlkZSwgU0laRSpzaXplb2YocGl4ZWwpLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBGVU5DQyhPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMzIpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgdWludDhfdCBmdWxsW1NJWkUqKFNJWkUrNSkqc2l6ZW9mKHBpeGVsKV07XAorICAgIHVpbnQ4X3QgKiBjb25zdCBmdWxsX21pZD0gZnVsbCArIFNJWkUqMipzaXplb2YocGl4ZWwpO1wKKyAgICBwaXhlbHRtcCB0bXBbU0laRSooU0laRSs1KSpzaXplb2YocGl4ZWwpXTtcCisgICAgdWludDhfdCBoYWxmVltTSVpFKlNJWkUqc2l6ZW9mKHBpeGVsKV07XAorICAgIHVpbnQ4X3QgaGFsZkhWW1NJWkUqU0laRSpzaXplb2YocGl4ZWwpXTtcCisgICAgRlVOQyhjb3B5X2Jsb2NrICMjIFNJWkUgKShmdWxsLCBzcmMgLSBzdHJpZGUqMiArIHNpemVvZihwaXhlbCksIFNJWkUqc2l6ZW9mKHBpeGVsKSwgIHN0cmlkZSwgU0laRSArIDUpO1wKKyAgICBGVU5DKHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzKShoYWxmViwgZnVsbF9taWQsIFNJWkUqc2l6ZW9mKHBpeGVsKSwgU0laRSpzaXplb2YocGl4ZWwpKTtcCisgICAgRlVOQyhwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX2h2X2xvd3Bhc3MpKGhhbGZIViwgdG1wLCBzcmMsIFNJWkUqc2l6ZW9mKHBpeGVsKSwgU0laRSpzaXplb2YocGl4ZWwpLCBzdHJpZGUpO1wKKyAgICBGVU5DKE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDIpKGRzdCwgaGFsZlYsIGhhbGZIViwgc3RyaWRlLCBTSVpFKnNpemVvZihwaXhlbCksIFNJWkUqc2l6ZW9mKHBpeGVsKSwgU0laRSk7XAorfVwKKworI2RlZmluZSBvcF9hdmcoYSwgYikgIGEgPSAoKChhKStDTElQKCgoYikgKyAxNik+PjUpKzEpPj4xKQorLy8jZGVmaW5lIG9wX2F2ZzIoYSwgYikgYSA9ICgoKGEpKncxK2NtWygoYikgKyAxNik+PjVdKncyICsgbyArIDY0KT4+NykKKyNkZWZpbmUgb3BfcHV0KGEsIGIpICBhID0gQ0xJUCgoKGIpICsgMTYpPj41KQorI2RlZmluZSBvcDJfYXZnKGEsIGIpICBhID0gKCgoYSkrQ0xJUCgoKGIpICsgNTEyKT4+MTApKzEpPj4xKQorI2RlZmluZSBvcDJfcHV0KGEsIGIpICBhID0gQ0xJUCgoKGIpICsgNTEyKT4+MTApCisKK0gyNjRfTE9XUEFTUyhwdXRfICAgICAgICwgb3BfcHV0LCBvcDJfcHV0KQorSDI2NF9MT1dQQVNTKGF2Z18gICAgICAgLCBvcF9hdmcsIG9wMl9hdmcpCitIMjY0X01DKHB1dF8sIDIpCitIMjY0X01DKHB1dF8sIDQpCitIMjY0X01DKHB1dF8sIDgpCitIMjY0X01DKHB1dF8sIDE2KQorSDI2NF9NQyhhdmdfLCA0KQorSDI2NF9NQyhhdmdfLCA4KQorSDI2NF9NQyhhdmdfLCAxNikKKworI3VuZGVmIG9wX2F2ZworI3VuZGVmIG9wX3B1dAorI3VuZGVmIG9wMl9hdmcKKyN1bmRlZiBvcDJfcHV0CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oZXZjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oZXZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkYzUyYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hldmMuYwpAQCAtMCwwICsxLDM0NDYgQEAKKy8qCisgKiBIRVZDIHZpZGVvIERlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIEd1aWxsYXVtZSBNYXJ0cmVzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIE1pY2thZWwgUmF1bGV0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIEdpbGRhcyBDb2NoZXJlbAorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxMyBXYXNzaW0gSGFtaWRvdWNoZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0b21pYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaXNwbGF5LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21kNS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zdGVyZW8zZC5oIgorCisjaW5jbHVkZSAiYnN3YXBkc3AuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiY2FiYWNfZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaGV2Yy5oIgorCitjb25zdCB1aW50OF90IGZmX2hldmNfcGVsX3dlaWdodFs2NV0gPSB7IFsyXSA9IDAsIFs0XSA9IDEsIFs2XSA9IDIsIFs4XSA9IDMsIFsxMl0gPSA0LCBbMTZdID0gNSwgWzI0XSA9IDYsIFszMl0gPSA3LCBbNDhdID0gOCwgWzY0XSA9IDkgfTsKKworLyoqCisgKiBOT1RFOiBFYWNoIGZ1bmN0aW9uIGhsc19mb28gY29ycmVzcG9uZCB0byB0aGUgZnVuY3Rpb24gZm9vIGluIHRoZQorICogc3BlY2lmaWNhdGlvbiAoSExTIHN0YW5kcyBmb3IgSGlnaCBMZXZlbCBTeW50YXgpLgorICovCisKKy8qKgorICogU2VjdGlvbiA1LjcKKyAqLworCisvKiBmcmVlIGV2ZXJ5dGhpbmcgYWxsb2NhdGVkICBieSBwaWNfYXJyYXlzX2luaXQoKSAqLworc3RhdGljIHZvaWQgcGljX2FycmF5c19mcmVlKEhFVkNDb250ZXh0ICpzKQoreworICAgIGF2X2ZyZWVwKCZzLT5zYW8pOworICAgIGF2X2ZyZWVwKCZzLT5kZWJsb2NrKTsKKworICAgIGF2X2ZyZWVwKCZzLT5za2lwX2ZsYWcpOworICAgIGF2X2ZyZWVwKCZzLT50YWJfY3RfZGVwdGgpOworCisgICAgYXZfZnJlZXAoJnMtPnRhYl9pcG0pOworICAgIGF2X2ZyZWVwKCZzLT5jYmZfbHVtYSk7CisgICAgYXZfZnJlZXAoJnMtPmlzX3BjbSk7CisKKyAgICBhdl9mcmVlcCgmcy0+cXBfeV90YWIpOworICAgIGF2X2ZyZWVwKCZzLT50YWJfc2xpY2VfYWRkcmVzcyk7CisgICAgYXZfZnJlZXAoJnMtPmZpbHRlcl9zbGljZV9lZGdlcyk7CisKKyAgICBhdl9mcmVlcCgmcy0+aG9yaXpvbnRhbF9icyk7CisgICAgYXZfZnJlZXAoJnMtPnZlcnRpY2FsX2JzKTsKKworICAgIGF2X2ZyZWVwKCZzLT5zaC5lbnRyeV9wb2ludF9vZmZzZXQpOworICAgIGF2X2ZyZWVwKCZzLT5zaC5zaXplKTsKKyAgICBhdl9mcmVlcCgmcy0+c2gub2Zmc2V0KTsKKworICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmcy0+dGFiX212Zl9wb29sKTsKKyAgICBhdl9idWZmZXJfcG9vbF91bmluaXQoJnMtPnJwbF90YWJfcG9vbCk7Cit9CisKKy8qIGFsbG9jYXRlIGFycmF5cyB0aGF0IGRlcGVuZCBvbiBmcmFtZSBkaW1lbnNpb25zICovCitzdGF0aWMgaW50IHBpY19hcnJheXNfaW5pdChIRVZDQ29udGV4dCAqcywgY29uc3QgSEVWQ1NQUyAqc3BzKQoreworICAgIGludCBsb2cyX21pbl9jYl9zaXplID0gc3BzLT5sb2cyX21pbl9jYl9zaXplOworICAgIGludCB3aWR0aCAgICAgICAgICAgID0gc3BzLT53aWR0aDsKKyAgICBpbnQgaGVpZ2h0ICAgICAgICAgICA9IHNwcy0+aGVpZ2h0OworICAgIGludCBwaWNfc2l6ZV9pbl9jdGIgID0gKCh3aWR0aCAgPj4gbG9nMl9taW5fY2Jfc2l6ZSkgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhlaWdodCA+PiBsb2cyX21pbl9jYl9zaXplKSArIDEpOworICAgIGludCBjdGJfY291bnQgICAgICAgID0gc3BzLT5jdGJfd2lkdGggKiBzcHMtPmN0Yl9oZWlnaHQ7CisgICAgaW50IG1pbl9wdV9zaXplICAgICAgPSBzcHMtPm1pbl9wdV93aWR0aCAqIHNwcy0+bWluX3B1X2hlaWdodDsKKworICAgIHMtPmJzX3dpZHRoICA9ICh3aWR0aCAgPj4gMikgKyAxOworICAgIHMtPmJzX2hlaWdodCA9IChoZWlnaHQgPj4gMikgKyAxOworCisgICAgcy0+c2FvICAgICAgICAgICA9IGF2X21hbGxvY3pfYXJyYXkoY3RiX2NvdW50LCBzaXplb2YoKnMtPnNhbykpOworICAgIHMtPmRlYmxvY2sgICAgICAgPSBhdl9tYWxsb2N6X2FycmF5KGN0Yl9jb3VudCwgc2l6ZW9mKCpzLT5kZWJsb2NrKSk7CisgICAgaWYgKCFzLT5zYW8gfHwgIXMtPmRlYmxvY2spCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHMtPnNraXBfZmxhZyAgICA9IGF2X21hbGxvYyhzcHMtPm1pbl9jYl9oZWlnaHQgKiBzcHMtPm1pbl9jYl93aWR0aCk7CisgICAgcy0+dGFiX2N0X2RlcHRoID0gYXZfbWFsbG9jX2FycmF5KHNwcy0+bWluX2NiX2hlaWdodCwgc3BzLT5taW5fY2Jfd2lkdGgpOworICAgIGlmICghcy0+c2tpcF9mbGFnIHx8ICFzLT50YWJfY3RfZGVwdGgpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHMtPmNiZl9sdW1hID0gYXZfbWFsbG9jX2FycmF5KHNwcy0+bWluX3RiX3dpZHRoLCBzcHMtPm1pbl90Yl9oZWlnaHQpOworICAgIHMtPnRhYl9pcG0gID0gYXZfbWFsbG9jeihtaW5fcHVfc2l6ZSk7CisgICAgcy0+aXNfcGNtICAgPSBhdl9tYWxsb2MoKHNwcy0+bWluX3B1X3dpZHRoICsgMSkgKiAoc3BzLT5taW5fcHVfaGVpZ2h0ICsgMSkpOworICAgIGlmICghcy0+dGFiX2lwbSB8fCAhcy0+Y2JmX2x1bWEgfHwgIXMtPmlzX3BjbSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcy0+ZmlsdGVyX3NsaWNlX2VkZ2VzID0gYXZfbWFsbG9jKGN0Yl9jb3VudCk7CisgICAgcy0+dGFiX3NsaWNlX2FkZHJlc3MgID0gYXZfbWFsbG9jX2FycmF5KHBpY19zaXplX2luX2N0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT50YWJfc2xpY2VfYWRkcmVzcykpOworICAgIHMtPnFwX3lfdGFiICAgICAgICAgICA9IGF2X21hbGxvY19hcnJheShwaWNfc2l6ZV9pbl9jdGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+cXBfeV90YWIpKTsKKyAgICBpZiAoIXMtPnFwX3lfdGFiIHx8ICFzLT5maWx0ZXJfc2xpY2VfZWRnZXMgfHwgIXMtPnRhYl9zbGljZV9hZGRyZXNzKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzLT5ob3Jpem9udGFsX2JzID0gYXZfbWFsbG9jel9hcnJheShzLT5ic193aWR0aCwgcy0+YnNfaGVpZ2h0KTsKKyAgICBzLT52ZXJ0aWNhbF9icyAgID0gYXZfbWFsbG9jel9hcnJheShzLT5ic193aWR0aCwgcy0+YnNfaGVpZ2h0KTsKKyAgICBpZiAoIXMtPmhvcml6b250YWxfYnMgfHwgIXMtPnZlcnRpY2FsX2JzKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzLT50YWJfbXZmX3Bvb2wgPSBhdl9idWZmZXJfcG9vbF9pbml0KG1pbl9wdV9zaXplICogc2l6ZW9mKE12RmllbGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYnVmZmVyX2FsbG9jeik7CisgICAgcy0+cnBsX3RhYl9wb29sID0gYXZfYnVmZmVyX3Bvb2xfaW5pdChjdGJfY291bnQgKiBzaXplb2YoUmVmUGljTGlzdFRhYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9idWZmZXJfYWxsb2N6KTsKKyAgICBpZiAoIXMtPnRhYl9tdmZfcG9vbCB8fCAhcy0+cnBsX3RhYl9wb29sKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBwaWNfYXJyYXlzX2ZyZWUocyk7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworc3RhdGljIHZvaWQgcHJlZF93ZWlnaHRfdGFibGUoSEVWQ0NvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBpID0gMDsKKyAgICBpbnQgaiA9IDA7CisgICAgdWludDhfdCBsdW1hX3dlaWdodF9sMF9mbGFnWzE2XTsKKyAgICB1aW50OF90IGNocm9tYV93ZWlnaHRfbDBfZmxhZ1sxNl07CisgICAgdWludDhfdCBsdW1hX3dlaWdodF9sMV9mbGFnWzE2XTsKKyAgICB1aW50OF90IGNocm9tYV93ZWlnaHRfbDFfZmxhZ1sxNl07CisKKyAgICBzLT5zaC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICBpZiAocy0+c3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSAwKSB7CisgICAgICAgIGludCBkZWx0YSA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gPSBhdl9jbGlwKHMtPnNoLmx1bWFfbG9nMl93ZWlnaHRfZGVub20gKyBkZWx0YSwgMCwgNyk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPnNoLm5iX3JlZnNbTDBdOyBpKyspIHsKKyAgICAgICAgbHVtYV93ZWlnaHRfbDBfZmxhZ1tpXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGlmICghbHVtYV93ZWlnaHRfbDBfZmxhZ1tpXSkgeworICAgICAgICAgICAgcy0+c2gubHVtYV93ZWlnaHRfbDBbaV0gPSAxIDw8IHMtPnNoLmx1bWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgICAgICAgICBzLT5zaC5sdW1hX29mZnNldF9sMFtpXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgIT0gMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c2gubmJfcmVmc1tMMF07IGkrKykKKyAgICAgICAgICAgIGNocm9tYV93ZWlnaHRfbDBfZmxhZ1tpXSA9IGdldF9iaXRzMShnYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnNoLm5iX3JlZnNbTDBdOyBpKyspCisgICAgICAgICAgICBjaHJvbWFfd2VpZ2h0X2wwX2ZsYWdbaV0gPSAwOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c2gubmJfcmVmc1tMMF07IGkrKykgeworICAgICAgICBpZiAobHVtYV93ZWlnaHRfbDBfZmxhZ1tpXSkgeworICAgICAgICAgICAgaW50IGRlbHRhX2x1bWFfd2VpZ2h0X2wwID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICBzLT5zaC5sdW1hX3dlaWdodF9sMFtpXSA9ICgxIDw8IHMtPnNoLmx1bWFfbG9nMl93ZWlnaHRfZGVub20pICsgZGVsdGFfbHVtYV93ZWlnaHRfbDA7CisgICAgICAgICAgICBzLT5zaC5sdW1hX29mZnNldF9sMFtpXSA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICB9CisgICAgICAgIGlmIChjaHJvbWFfd2VpZ2h0X2wwX2ZsYWdbaV0pIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgZGVsdGFfY2hyb21hX3dlaWdodF9sMCA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgIGludCBkZWx0YV9jaHJvbWFfb2Zmc2V0X2wwID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX3dlaWdodF9sMFtpXVtqXSA9ICgxIDw8IHMtPnNoLmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSkgKyBkZWx0YV9jaHJvbWFfd2VpZ2h0X2wwOworICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV9vZmZzZXRfbDBbaV1bal0gPSBhdl9jbGlwKChkZWx0YV9jaHJvbWFfb2Zmc2V0X2wwIC0gKCgxMjggKiBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wwW2ldW2pdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gcy0+c2guY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKSArIDEyOCksIC0xMjgsIDEyNyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wwW2ldWzBdID0gMSA8PCBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgICAgICAgICBzLT5zaC5jaHJvbWFfb2Zmc2V0X2wwW2ldWzBdID0gMDsKKyAgICAgICAgICAgIHMtPnNoLmNocm9tYV93ZWlnaHRfbDBbaV1bMV0gPSAxIDw8IHMtPnNoLmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICAgICAgICAgIHMtPnNoLmNocm9tYV9vZmZzZXRfbDBbaV1bMV0gPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5zaC5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnNoLm5iX3JlZnNbTDFdOyBpKyspIHsKKyAgICAgICAgICAgIGx1bWFfd2VpZ2h0X2wxX2ZsYWdbaV0gPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgaWYgKCFsdW1hX3dlaWdodF9sMV9mbGFnW2ldKSB7CisgICAgICAgICAgICAgICAgcy0+c2gubHVtYV93ZWlnaHRfbDFbaV0gPSAxIDw8IHMtPnNoLmx1bWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgICAgICAgICAgICAgcy0+c2gubHVtYV9vZmZzZXRfbDFbaV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzLT5zcHMtPmNocm9tYV9mb3JtYXRfaWRjICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zaC5uYl9yZWZzW0wxXTsgaSsrKQorICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHRfbDFfZmxhZ1tpXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c2gubmJfcmVmc1tMMV07IGkrKykKKyAgICAgICAgICAgICAgICBjaHJvbWFfd2VpZ2h0X2wxX2ZsYWdbaV0gPSAwOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zaC5uYl9yZWZzW0wxXTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobHVtYV93ZWlnaHRfbDFfZmxhZ1tpXSkgeworICAgICAgICAgICAgICAgIGludCBkZWx0YV9sdW1hX3dlaWdodF9sMSA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfd2VpZ2h0X2wxW2ldID0gKDEgPDwgcy0+c2gubHVtYV9sb2cyX3dlaWdodF9kZW5vbSkgKyBkZWx0YV9sdW1hX3dlaWdodF9sMTsKKyAgICAgICAgICAgICAgICBzLT5zaC5sdW1hX29mZnNldF9sMVtpXSA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNocm9tYV93ZWlnaHRfbDFfZmxhZ1tpXSkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhX2Nocm9tYV93ZWlnaHRfbDEgPSBnZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhX2Nocm9tYV9vZmZzZXRfbDEgPSBnZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX3dlaWdodF9sMVtpXVtqXSA9ICgxIDw8IHMtPnNoLmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSkgKyBkZWx0YV9jaHJvbWFfd2VpZ2h0X2wxOworICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfb2Zmc2V0X2wxW2ldW2pdID0gYXZfY2xpcCgoZGVsdGFfY2hyb21hX29mZnNldF9sMSAtICgoMTI4ICogcy0+c2guY2hyb21hX3dlaWdodF9sMVtpXVtqXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20pICsgMTI4KSwgLTEyOCwgMTI3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV93ZWlnaHRfbDFbaV1bMF0gPSAxIDw8IHMtPnNoLmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfb2Zmc2V0X2wxW2ldWzBdID0gMDsKKyAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wxW2ldWzFdID0gMSA8PCBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX29mZnNldF9sMVtpXVsxXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2x0X3JwcyhIRVZDQ29udGV4dCAqcywgTG9uZ1Rlcm1SUFMgKnJwcywgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgY29uc3QgSEVWQ1NQUyAqc3BzID0gcy0+c3BzOworICAgIGludCBtYXhfcG9jX2xzYiAgICA9IDEgPDwgc3BzLT5sb2cyX21heF9wb2NfbHNiOworICAgIGludCBwcmV2X2RlbHRhX21zYiA9IDA7CisgICAgdW5zaWduZWQgaW50IG5iX3NwcyA9IDAsIG5iX3NoOworICAgIGludCBpOworCisgICAgcnBzLT5uYl9yZWZzID0gMDsKKyAgICBpZiAoIXNwcy0+bG9uZ190ZXJtX3JlZl9waWNzX3ByZXNlbnRfZmxhZykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcyA+IDApCisgICAgICAgIG5iX3NwcyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgbmJfc2ggPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCisgICAgaWYgKG5iX3NoICsgKHVpbnQ2NF90KW5iX3NwcyA+IEZGX0FSUkFZX0VMRU1TKHJwcy0+cG9jKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBycHMtPm5iX3JlZnMgPSBuYl9zaCArIG5iX3NwczsKKworICAgIGZvciAoaSA9IDA7IGkgPCBycHMtPm5iX3JlZnM7IGkrKykgeworICAgICAgICB1aW50OF90IGRlbHRhX3BvY19tc2JfcHJlc2VudDsKKworICAgICAgICBpZiAoaSA8IG5iX3NwcykgeworICAgICAgICAgICAgdWludDhfdCBsdF9pZHhfc3BzID0gMDsKKworICAgICAgICAgICAgaWYgKHNwcy0+bnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHMgPiAxKQorICAgICAgICAgICAgICAgIGx0X2lkeF9zcHMgPSBnZXRfYml0cyhnYiwgYXZfY2VpbF9sb2cyKHNwcy0+bnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHMpKTsKKworICAgICAgICAgICAgcnBzLT5wb2NbaV0gID0gc3BzLT5sdF9yZWZfcGljX3BvY19sc2Jfc3BzW2x0X2lkeF9zcHNdOworICAgICAgICAgICAgcnBzLT51c2VkW2ldID0gc3BzLT51c2VkX2J5X2N1cnJfcGljX2x0X3Nwc19mbGFnW2x0X2lkeF9zcHNdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnBzLT5wb2NbaV0gID0gZ2V0X2JpdHMoZ2IsIHNwcy0+bG9nMl9tYXhfcG9jX2xzYik7CisgICAgICAgICAgICBycHMtPnVzZWRbaV0gPSBnZXRfYml0czEoZ2IpOworICAgICAgICB9CisKKyAgICAgICAgZGVsdGFfcG9jX21zYl9wcmVzZW50ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKGRlbHRhX3BvY19tc2JfcHJlc2VudCkgeworICAgICAgICAgICAgaW50IGRlbHRhID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKworICAgICAgICAgICAgaWYgKGkgJiYgaSAhPSBuYl9zcHMpCisgICAgICAgICAgICAgICAgZGVsdGEgKz0gcHJldl9kZWx0YV9tc2I7CisKKyAgICAgICAgICAgIHJwcy0+cG9jW2ldICs9IHMtPnBvYyAtIGRlbHRhICogbWF4X3BvY19sc2IgLSBzLT5zaC5waWNfb3JkZXJfY250X2xzYjsKKyAgICAgICAgICAgIHByZXZfZGVsdGFfbXNiID0gZGVsdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfYnVmZmVyX3NhbyhIRVZDQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGNvbnN0IEhFVkNTUFMgKnNwcykKK3sKKyAgICBpbnQgcmV0LCBpOworCisgICAgZnJhbWUtPndpZHRoICA9IHMtPmF2Y3R4LT5jb2RlZF93aWR0aCAgKyAyOworICAgIGZyYW1lLT5oZWlnaHQgPSBzLT5hdmN0eC0+Y29kZWRfaGVpZ2h0ICsgMjsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIocy0+YXZjdHgsIGZyYW1lLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGZvciAoaSA9IDA7IGZyYW1lLT5kYXRhW2ldOyBpKyspIHsKKyAgICAgICAgaW50IG9mZnNldCA9IGZyYW1lLT5saW5lc2l6ZVtpXSArICgxIDw8IHNwcy0+cGl4ZWxfc2hpZnQpOworICAgICAgICBmcmFtZS0+ZGF0YVtpXSArPSBvZmZzZXQ7CisgICAgfQorICAgIGZyYW1lLT53aWR0aCAgPSBzLT5hdmN0eC0+Y29kZWRfd2lkdGg7CisgICAgZnJhbWUtPmhlaWdodCA9IHMtPmF2Y3R4LT5jb2RlZF9oZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfc3BzKEhFVkNDb250ZXh0ICpzLCBjb25zdCBIRVZDU1BTICpzcHMpCit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBpbnQgbnVtID0gMCwgZGVuID0gMDsKKworICAgIHBpY19hcnJheXNfZnJlZShzKTsKKyAgICByZXQgPSBwaWNfYXJyYXlzX2luaXQocywgc3BzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcy0+YXZjdHgtPmNvZGVkX3dpZHRoICAgICAgICAgPSBzcHMtPndpZHRoOworICAgIHMtPmF2Y3R4LT5jb2RlZF9oZWlnaHQgICAgICAgID0gc3BzLT5oZWlnaHQ7CisgICAgcy0+YXZjdHgtPndpZHRoICAgICAgICAgICAgICAgPSBzcHMtPm91dHB1dF93aWR0aDsKKyAgICBzLT5hdmN0eC0+aGVpZ2h0ICAgICAgICAgICAgICA9IHNwcy0+b3V0cHV0X2hlaWdodDsKKyAgICBzLT5hdmN0eC0+cGl4X2ZtdCAgICAgICAgICAgICA9IHNwcy0+cGl4X2ZtdDsKKyAgICBzLT5hdmN0eC0+aGFzX2JfZnJhbWVzICAgICAgICA9IHNwcy0+dGVtcG9yYWxfbGF5ZXJbc3BzLT5tYXhfc3ViX2xheWVycyAtIDFdLm51bV9yZW9yZGVyX3BpY3M7CisKKyAgICBmZl9zZXRfc2FyKHMtPmF2Y3R4LCBzcHMtPnZ1aS5zYXIpOworCisgICAgaWYgKHNwcy0+dnVpLnZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZykKKyAgICAgICAgcy0+YXZjdHgtPmNvbG9yX3JhbmdlID0gc3BzLT52dWkudmlkZW9fZnVsbF9yYW5nZV9mbGFnID8gQVZDT0xfUkFOR0VfSlBFRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVkNPTF9SQU5HRV9NUEVHOworICAgIGVsc2UKKyAgICAgICAgcy0+YXZjdHgtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfTVBFRzsKKworICAgIGlmIChzcHMtPnZ1aS5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIHMtPmF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgPSBzcHMtPnZ1aS5jb2xvdXJfcHJpbWFyaWVzOworICAgICAgICBzLT5hdmN0eC0+Y29sb3JfdHJjICAgICAgID0gc3BzLT52dWkudHJhbnNmZXJfY2hhcmFjdGVyaXN0aWM7CisgICAgICAgIHMtPmF2Y3R4LT5jb2xvcnNwYWNlICAgICAgPSBzcHMtPnZ1aS5tYXRyaXhfY29lZmZzOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQ7CisgICAgICAgIHMtPmF2Y3R4LT5jb2xvcl90cmMgICAgICAgPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQ7CisgICAgICAgIHMtPmF2Y3R4LT5jb2xvcnNwYWNlICAgICAgPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQ7CisgICAgfQorCisgICAgZmZfaGV2Y19wcmVkX2luaXQoJnMtPmhwYywgICAgIHNwcy0+Yml0X2RlcHRoKTsKKyAgICBmZl9oZXZjX2RzcF9pbml0ICgmcy0+aGV2Y2RzcCwgc3BzLT5iaXRfZGVwdGgpOworICAgIGZmX3ZpZGVvZHNwX2luaXQgKCZzLT52ZHNwLCAgICBzcHMtPmJpdF9kZXB0aCk7CisKKyAgICBpZiAoc3BzLT5zYW9fZW5hYmxlZCkgeworICAgICAgICBhdl9mcmFtZV91bnJlZihzLT50bXBfZnJhbWUpOworICAgICAgICByZXQgPSBnZXRfYnVmZmVyX3NhbyhzLCBzLT50bXBfZnJhbWUsIHNwcyk7CisgICAgICAgIHMtPnNhb19mcmFtZSA9IHMtPnRtcF9mcmFtZTsKKyAgICB9CisKKyAgICBzLT5zcHMgPSBzcHM7CisgICAgcy0+dnBzID0gKEhFVkNWUFMqKSBzLT52cHNfbGlzdFtzLT5zcHMtPnZwc19pZF0tPmRhdGE7CisKKyAgICBpZiAocy0+dnBzLT52cHNfdGltaW5nX2luZm9fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIG51bSA9IHMtPnZwcy0+dnBzX251bV91bml0c19pbl90aWNrOworICAgICAgICBkZW4gPSBzLT52cHMtPnZwc190aW1lX3NjYWxlOworICAgIH0gZWxzZSBpZiAoc3BzLT52dWkudnVpX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZykgeworICAgICAgICBudW0gPSBzcHMtPnZ1aS52dWlfbnVtX3VuaXRzX2luX3RpY2s7CisgICAgICAgIGRlbiA9IHNwcy0+dnVpLnZ1aV90aW1lX3NjYWxlOworICAgIH0KKworICAgIGlmIChudW0gIT0gMCAmJiBkZW4gIT0gMCkKKyAgICAgICAgYXZfcmVkdWNlKCZzLT5hdmN0eC0+ZnJhbWVyYXRlLmRlbiwgJnMtPmF2Y3R4LT5mcmFtZXJhdGUubnVtLAorICAgICAgICAgICAgICAgICAgbnVtLCBkZW4sIDEgPDwgMzApOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgcGljX2FycmF5c19mcmVlKHMpOworICAgIHMtPnNwcyA9IE5VTEw7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBobHNfc2xpY2VfaGVhZGVyKEhFVkNDb250ZXh0ICpzKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPkhFVkNsYy0+Z2I7CisgICAgU2xpY2VIZWFkZXIgKnNoICAgPSAmcy0+c2g7CisgICAgaW50IGksIGosIHJldDsKKworICAgIC8vIENvZGVkIHBhcmFtZXRlcnMKKyAgICBzaC0+Zmlyc3Rfc2xpY2VfaW5fcGljX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIGlmICgoSVNfSURSKHMpIHx8IElTX0JMQShzKSkgJiYgc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnKSB7CisgICAgICAgIHMtPnNlcV9kZWNvZGUgPSAocy0+c2VxX2RlY29kZSArIDEpICYgMHhmZjsKKyAgICAgICAgcy0+bWF4X3JhICAgICA9IElOVF9NQVg7CisgICAgICAgIGlmIChJU19JRFIocykpCisgICAgICAgICAgICBmZl9oZXZjX2NsZWFyX3JlZnMocyk7CisgICAgfQorICAgIHNoLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnID0gMDsKKyAgICBpZiAoSVNfSVJBUChzKSkKKyAgICAgICAgc2gtPm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgc2gtPnBwc19pZCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgaWYgKHNoLT5wcHNfaWQgPj0gTUFYX1BQU19DT1VOVCB8fCAhcy0+cHBzX2xpc3Rbc2gtPnBwc19pZF0pIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQUFMgaWQgb3V0IG9mIHJhbmdlOiAlZFxuIiwgc2gtPnBwc19pZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoIXNoLT5maXJzdF9zbGljZV9pbl9waWNfZmxhZyAmJgorICAgICAgICBzLT5wcHMgIT0gKEhFVkNQUFMqKXMtPnBwc19saXN0W3NoLT5wcHNfaWRdLT5kYXRhKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUFBTIGNoYW5nZWQgYmV0d2VlbiBzbGljZXMuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHMtPnBwcyA9IChIRVZDUFBTKilzLT5wcHNfbGlzdFtzaC0+cHBzX2lkXS0+ZGF0YTsKKyAgICBpZiAocy0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfQ1JBX05VVCAmJiBzLT5sYXN0X2VvcyA9PSAxKQorICAgICAgICBzaC0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyA9IDE7CisKKyAgICBpZiAocy0+c3BzICE9IChIRVZDU1BTKilzLT5zcHNfbGlzdFtzLT5wcHMtPnNwc19pZF0tPmRhdGEpIHsKKyAgICAgICAgY29uc3QgSEVWQ1NQUyogbGFzdF9zcHMgPSBzLT5zcHM7CisgICAgICAgIHMtPnNwcyA9IChIRVZDU1BTKilzLT5zcHNfbGlzdFtzLT5wcHMtPnNwc19pZF0tPmRhdGE7CisgICAgICAgIGlmIChsYXN0X3NwcyAmJiBJU19JUkFQKHMpICYmIHMtPm5hbF91bml0X3R5cGUgIT0gTkFMX0NSQV9OVVQpIHsKKyAgICAgICAgICAgIGlmIChzLT5zcHMtPndpZHRoICE9ICBsYXN0X3Nwcy0+d2lkdGggfHwgcy0+c3BzLT5oZWlnaHQgIT0gbGFzdF9zcHMtPmhlaWdodCB8fAorICAgICAgICAgICAgICAgIHMtPnNwcy0+dGVtcG9yYWxfbGF5ZXJbcy0+c3BzLT5tYXhfc3ViX2xheWVycyAtIDFdLm1heF9kZWNfcGljX2J1ZmZlcmluZyAhPQorICAgICAgICAgICAgICAgIGxhc3Rfc3BzLT50ZW1wb3JhbF9sYXllcltsYXN0X3Nwcy0+bWF4X3N1Yl9sYXllcnMgLSAxXS5tYXhfZGVjX3BpY19idWZmZXJpbmcpCisgICAgICAgICAgICAgICAgc2gtPm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgPSAwOworICAgICAgICB9CisgICAgICAgIGZmX2hldmNfY2xlYXJfcmVmcyhzKTsKKyAgICAgICAgcmV0ID0gc2V0X3NwcyhzLCBzLT5zcHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcy0+c2VxX2RlY29kZSA9IChzLT5zZXFfZGVjb2RlICsgMSkgJiAweGZmOworICAgICAgICBzLT5tYXhfcmEgICAgID0gSU5UX01BWDsKKyAgICB9CisKKyAgICBzLT5hdmN0eC0+cHJvZmlsZSA9IHMtPnNwcy0+cHRsLmdlbmVyYWxfcHRsLnByb2ZpbGVfaWRjOworICAgIHMtPmF2Y3R4LT5sZXZlbCAgID0gcy0+c3BzLT5wdGwuZ2VuZXJhbF9wdGwubGV2ZWxfaWRjOworCisgICAgc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPSAwOworICAgIGlmICghc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnKSB7CisgICAgICAgIGludCBzbGljZV9hZGRyZXNzX2xlbmd0aDsKKworICAgICAgICBpZiAocy0+cHBzLT5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudHNfZW5hYmxlZF9mbGFnKQorICAgICAgICAgICAgc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgICAgIHNsaWNlX2FkZHJlc3NfbGVuZ3RoID0gYXZfY2VpbF9sb2cyKHMtPnNwcy0+Y3RiX3dpZHRoICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3BzLT5jdGJfaGVpZ2h0KTsKKyAgICAgICAgc2gtPnNsaWNlX3NlZ21lbnRfYWRkciA9IGdldF9iaXRzKGdiLCBzbGljZV9hZGRyZXNzX2xlbmd0aCk7CisgICAgICAgIGlmIChzaC0+c2xpY2Vfc2VnbWVudF9hZGRyID49IHMtPnNwcy0+Y3RiX3dpZHRoICogcy0+c3BzLT5jdGJfaGVpZ2h0KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBzbGljZSBzZWdtZW50IGFkZHJlc3M6ICV1LlxuIiwKKyAgICAgICAgICAgICAgICAgICBzaC0+c2xpY2Vfc2VnbWVudF9hZGRyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzaC0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZykgeworICAgICAgICAgICAgc2gtPnNsaWNlX2FkZHIgPSBzaC0+c2xpY2Vfc2VnbWVudF9hZGRyOworICAgICAgICAgICAgcy0+c2xpY2VfaWR4Kys7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzaC0+c2xpY2Vfc2VnbWVudF9hZGRyID0gc2gtPnNsaWNlX2FkZHIgPSAwOworICAgICAgICBzLT5zbGljZV9pZHggICAgICAgICAgID0gMDsKKyAgICAgICAgcy0+c2xpY2VfaW5pdGlhbGl6ZWQgICA9IDA7CisgICAgfQorCisgICAgaWYgKCFzaC0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZykgeworICAgICAgICBzLT5zbGljZV9pbml0aWFsaXplZCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnBwcy0+bnVtX2V4dHJhX3NsaWNlX2hlYWRlcl9iaXRzOyBpKyspCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDEpOyAgLy8gc2xpY2VfcmVzZXJ2ZWRfdW5kZXRlcm1pbmVkX2ZsYWdbXQorCisgICAgICAgIHNoLT5zbGljZV90eXBlID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgaWYgKCEoc2gtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSB8fAorICAgICAgICAgICAgICBzaC0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFIHx8CisgICAgICAgICAgICAgIHNoLT5zbGljZV90eXBlID09IEJfU0xJQ0UpKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gc2xpY2UgdHlwZTogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgIHNoLT5zbGljZV90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChJU19JUkFQKHMpICYmIHNoLT5zbGljZV90eXBlICE9IElfU0xJQ0UpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW50ZXIgc2xpY2VzIGluIGFuIElSQVAgZnJhbWUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2hlbiBmbGFnIGlzIG5vdCBwcmVzZW50LCBwaWN0dXJlIGlzIGluZmVycmVkIHRvIGJlIG91dHB1dAorICAgICAgICBzaC0+cGljX291dHB1dF9mbGFnID0gMTsKKyAgICAgICAgaWYgKHMtPnBwcy0+b3V0cHV0X2ZsYWdfcHJlc2VudF9mbGFnKQorICAgICAgICAgICAgc2gtPnBpY19vdXRwdXRfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgaWYgKHMtPnNwcy0+c2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcpCisgICAgICAgICAgICBzaC0+Y29sb3VyX3BsYW5lX2lkID0gZ2V0X2JpdHMoZ2IsIDIpOworCisgICAgICAgIGlmICghSVNfSURSKHMpKSB7CisgICAgICAgICAgICBpbnQgc2hvcnRfdGVybV9yZWZfcGljX3NldF9zcHNfZmxhZywgcG9jOworCisgICAgICAgICAgICBzaC0+cGljX29yZGVyX2NudF9sc2IgPSBnZXRfYml0cyhnYiwgcy0+c3BzLT5sb2cyX21heF9wb2NfbHNiKTsKKyAgICAgICAgICAgIHBvYyA9IGZmX2hldmNfY29tcHV0ZV9wb2Mocywgc2gtPnBpY19vcmRlcl9jbnRfbHNiKTsKKyAgICAgICAgICAgIGlmICghc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnICYmIHBvYyAhPSBzLT5wb2MpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgUE9DIGNoYW5nZSBiZXR3ZWVuIHNsaWNlczogJWQgLT4gJWRcbiIsIHMtPnBvYywgcG9jKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHBvYyA9IHMtPnBvYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnBvYyA9IHBvYzsKKworICAgICAgICAgICAgc2hvcnRfdGVybV9yZWZfcGljX3NldF9zcHNfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAoIXNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc3BzX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBmZl9oZXZjX2RlY29kZV9zaG9ydF90ZXJtX3JwcyhzLCAmc2gtPnNsaWNlX3Jwcywgcy0+c3BzLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgIHNoLT5zaG9ydF90ZXJtX3JwcyA9ICZzaC0+c2xpY2VfcnBzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgbnVtYml0cywgcnBzX2lkeDsKKworICAgICAgICAgICAgICAgIGlmICghcy0+c3BzLT5uYl9zdF9ycHMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyByZWYgbGlzdHMgaW4gdGhlIFNQUy5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBudW1iaXRzID0gYXZfY2VpbF9sb2cyKHMtPnNwcy0+bmJfc3RfcnBzKTsKKyAgICAgICAgICAgICAgICBycHNfaWR4ID0gbnVtYml0cyA+IDAgPyBnZXRfYml0cyhnYiwgbnVtYml0cykgOiAwOworICAgICAgICAgICAgICAgIHNoLT5zaG9ydF90ZXJtX3JwcyA9ICZzLT5zcHMtPnN0X3Jwc1tycHNfaWR4XTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX2x0X3JwcyhzLCAmc2gtPmxvbmdfdGVybV9ycHMsIGdiKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgbG9uZyB0ZXJtIFJQUy5cbiIpOworICAgICAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5zcHMtPnNwc190ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnKQorICAgICAgICAgICAgICAgIHNoLT5zbGljZV90ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzaC0+c2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5zaC5zaG9ydF90ZXJtX3JwcyA9IE5VTEw7CisgICAgICAgICAgICBzLT5wb2MgICAgICAgICAgICAgICA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiA4LjMuMSAqLworICAgICAgICBpZiAocy0+dGVtcG9yYWxfaWQgPT0gMCAmJgorICAgICAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfVFJBSUxfTiAmJgorICAgICAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfVFNBX04gICAmJgorICAgICAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfU1RTQV9OICAmJgorICAgICAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfUkFETF9OICAmJgorICAgICAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfUkFETF9SICAmJgorICAgICAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfUkFTTF9OICAmJgorICAgICAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfUkFTTF9SKQorICAgICAgICAgICAgcy0+cG9jVGlkMCA9IHMtPnBvYzsKKworICAgICAgICBpZiAocy0+c3BzLT5zYW9fZW5hYmxlZCkgeworICAgICAgICAgICAgc2gtPnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1swXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBzaC0+c2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzFdID0KKyAgICAgICAgICAgIHNoLT5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbMl0gPSBnZXRfYml0czEoZ2IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2gtPnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1swXSA9IDA7CisgICAgICAgICAgICBzaC0+c2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzFdID0gMDsKKyAgICAgICAgICAgIHNoLT5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbMl0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgc2gtPm5iX3JlZnNbTDBdID0gc2gtPm5iX3JlZnNbTDFdID0gMDsKKyAgICAgICAgaWYgKHNoLT5zbGljZV90eXBlID09IFBfU0xJQ0UgfHwgc2gtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworICAgICAgICAgICAgaW50IG5iX3JlZnM7CisKKyAgICAgICAgICAgIHNoLT5uYl9yZWZzW0wwXSA9IHMtPnBwcy0+bnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmU7CisgICAgICAgICAgICBpZiAoc2gtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkKKyAgICAgICAgICAgICAgICBzaC0+bmJfcmVmc1tMMV0gPSBzLT5wcHMtPm51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlOworCisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvLyBudW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZworICAgICAgICAgICAgICAgIHNoLT5uYl9yZWZzW0wwXSA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworICAgICAgICAgICAgICAgIGlmIChzaC0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKQorICAgICAgICAgICAgICAgICAgICBzaC0+bmJfcmVmc1tMMV0gPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaC0+bmJfcmVmc1tMMF0gPiBNQVhfUkVGUyB8fCBzaC0+bmJfcmVmc1tMMV0gPiBNQVhfUkVGUykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgcmVmczogJWQvJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzaC0+bmJfcmVmc1tMMF0sIHNoLT5uYl9yZWZzW0wxXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNoLT5ycGxfbW9kaWZpY2F0aW9uX2ZsYWdbMF0gPSAwOworICAgICAgICAgICAgc2gtPnJwbF9tb2RpZmljYXRpb25fZmxhZ1sxXSA9IDA7CisgICAgICAgICAgICBuYl9yZWZzID0gZmZfaGV2Y19mcmFtZV9uYl9yZWZzKHMpOworICAgICAgICAgICAgaWYgKCFuYl9yZWZzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJaZXJvIHJlZnMgZm9yIGEgZnJhbWUgd2l0aCBQIG9yIEIgc2xpY2VzLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5wcHMtPmxpc3RzX21vZGlmaWNhdGlvbl9wcmVzZW50X2ZsYWcgJiYgbmJfcmVmcyA+IDEpIHsKKyAgICAgICAgICAgICAgICBzaC0+cnBsX21vZGlmaWNhdGlvbl9mbGFnWzBdID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgICAgICBpZiAoc2gtPnJwbF9tb2RpZmljYXRpb25fZmxhZ1swXSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2gtPm5iX3JlZnNbTDBdOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBzaC0+bGlzdF9lbnRyeV9seFswXVtpXSA9IGdldF9iaXRzKGdiLCBhdl9jZWlsX2xvZzIobmJfcmVmcykpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzaC0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisgICAgICAgICAgICAgICAgICAgIHNoLT5ycGxfbW9kaWZpY2F0aW9uX2ZsYWdbMV0gPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2gtPnJwbF9tb2RpZmljYXRpb25fZmxhZ1sxXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNoLT5uYl9yZWZzW0wxXTsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoLT5saXN0X2VudHJ5X2x4WzFdW2ldID0gZ2V0X2JpdHMoZ2IsIGF2X2NlaWxfbG9nMihuYl9yZWZzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2gtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkKKyAgICAgICAgICAgICAgICBzaC0+bXZkX2wxX3plcm9fZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgICAgIGlmIChzLT5wcHMtPmNhYmFjX2luaXRfcHJlc2VudF9mbGFnKQorICAgICAgICAgICAgICAgIHNoLT5jYWJhY19pbml0X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNoLT5jYWJhY19pbml0X2ZsYWcgPSAwOworCisgICAgICAgICAgICBzaC0+Y29sbG9jYXRlZF9yZWZfaWR4ID0gMDsKKyAgICAgICAgICAgIGlmIChzaC0+c2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZykgeworICAgICAgICAgICAgICAgIHNoLT5jb2xsb2NhdGVkX2xpc3QgPSBMMDsKKyAgICAgICAgICAgICAgICBpZiAoc2gtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkKKyAgICAgICAgICAgICAgICAgICAgc2gtPmNvbGxvY2F0ZWRfbGlzdCA9ICFnZXRfYml0czEoZ2IpOworCisgICAgICAgICAgICAgICAgaWYgKHNoLT5uYl9yZWZzW3NoLT5jb2xsb2NhdGVkX2xpc3RdID4gMSkgeworICAgICAgICAgICAgICAgICAgICBzaC0+Y29sbG9jYXRlZF9yZWZfaWR4ID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNoLT5jb2xsb2NhdGVkX3JlZl9pZHggPj0gc2gtPm5iX3JlZnNbc2gtPmNvbGxvY2F0ZWRfbGlzdF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNvbGxvY2F0ZWRfcmVmX2lkeDogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoLT5jb2xsb2NhdGVkX3JlZl9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocy0+cHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcgICAmJiBzaC0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB8fAorICAgICAgICAgICAgICAgIChzLT5wcHMtPndlaWdodGVkX2JpcHJlZF9mbGFnICYmIHNoLT5zbGljZV90eXBlID09IEJfU0xJQ0UpKSB7CisgICAgICAgICAgICAgICAgcHJlZF93ZWlnaHRfdGFibGUocywgZ2IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaC0+bWF4X251bV9tZXJnZV9jYW5kID0gNSAtIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgICAgICAgICBpZiAoc2gtPm1heF9udW1fbWVyZ2VfY2FuZCA8IDEgfHwgc2gtPm1heF9udW1fbWVyZ2VfY2FuZCA+IDUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIG1lcmdpbmcgTVZQIGNhbmRpZGF0ZXM6ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2gtPm1heF9udW1fbWVyZ2VfY2FuZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzaC0+c2xpY2VfcXBfZGVsdGEgPSBnZXRfc2VfZ29sb21iKGdiKTsKKworICAgICAgICBpZiAocy0+cHBzLT5waWNfc2xpY2VfbGV2ZWxfY2hyb21hX3FwX29mZnNldHNfcHJlc2VudF9mbGFnKSB7CisgICAgICAgICAgICBzaC0+c2xpY2VfY2JfcXBfb2Zmc2V0ID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICBzaC0+c2xpY2VfY3JfcXBfb2Zmc2V0ID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaC0+c2xpY2VfY2JfcXBfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHNoLT5zbGljZV9jcl9xcF9vZmZzZXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnBwcy0+Y2hyb21hX3FwX29mZnNldF9saXN0X2VuYWJsZWRfZmxhZykKKyAgICAgICAgICAgIHNoLT5jdV9jaHJvbWFfcXBfb2Zmc2V0X2VuYWJsZWRfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNoLT5jdV9jaHJvbWFfcXBfb2Zmc2V0X2VuYWJsZWRfZmxhZyA9IDA7CisKKyAgICAgICAgaWYgKHMtPnBwcy0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgICAgIGludCBkZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9mbGFnID0gMDsKKworICAgICAgICAgICAgaWYgKHMtPnBwcy0+ZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZW5hYmxlZF9mbGFnKQorICAgICAgICAgICAgICAgIGRlYmxvY2tpbmdfZmlsdGVyX292ZXJyaWRlX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgICAgICAgICBpZiAoZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZmxhZykgeworICAgICAgICAgICAgICAgIHNoLT5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIGlmICghc2gtPmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfZmxhZykgeworICAgICAgICAgICAgICAgICAgICBzaC0+YmV0YV9vZmZzZXQgPSBnZXRfc2VfZ29sb21iKGdiKSAqIDI7CisgICAgICAgICAgICAgICAgICAgIHNoLT50Y19vZmZzZXQgICA9IGdldF9zZV9nb2xvbWIoZ2IpICogMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNoLT5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcgPSBzLT5wcHMtPmRpc2FibGVfZGJmOworICAgICAgICAgICAgICAgIHNoLT5iZXRhX29mZnNldCAgICAgICAgICAgICAgICAgICAgPSBzLT5wcHMtPmJldGFfb2Zmc2V0OworICAgICAgICAgICAgICAgIHNoLT50Y19vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgPSBzLT5wcHMtPnRjX29mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNoLT5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcgPSAwOworICAgICAgICAgICAgc2gtPmJldGFfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgICAgICAgICBzaC0+dGNfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5wcHMtPnNlcV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZyAmJgorICAgICAgICAgICAgKHNoLT5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbMF0gfHwKKyAgICAgICAgICAgICBzaC0+c2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzFdIHx8CisgICAgICAgICAgICAgIXNoLT5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcpKSB7CisgICAgICAgICAgICBzaC0+c2xpY2VfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2gtPnNsaWNlX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnID0gcy0+cHBzLT5zZXFfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWc7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzLT5zbGljZV9pbml0aWFsaXplZCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkluZGVwZW5kZW50IHNsaWNlIHNlZ21lbnQgbWlzc2luZy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHMgPSAwOworICAgIGlmIChzLT5wcHMtPnRpbGVzX2VuYWJsZWRfZmxhZyB8fCBzLT5wcHMtPmVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnKSB7CisgICAgICAgIHNoLT5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgICAgIGlmIChzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHMgPiAwKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0X2xlbiA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworICAgICAgICAgICAgaW50IHNlZ21lbnRzID0gb2Zmc2V0X2xlbiA+PiA0OworICAgICAgICAgICAgaW50IHJlc3QgPSAob2Zmc2V0X2xlbiAmIDE1KTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzaC0+ZW50cnlfcG9pbnRfb2Zmc2V0KTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzaC0+b2Zmc2V0KTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzaC0+c2l6ZSk7CisgICAgICAgICAgICBzaC0+ZW50cnlfcG9pbnRfb2Zmc2V0ID0gYXZfbWFsbG9jX2FycmF5KHNoLT5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cywgc2l6ZW9mKGludCkpOworICAgICAgICAgICAgc2gtPm9mZnNldCA9IGF2X21hbGxvY19hcnJheShzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHMsIHNpemVvZihpbnQpKTsKKyAgICAgICAgICAgIHNoLT5zaXplID0gYXZfbWFsbG9jX2FycmF5KHNoLT5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cywgc2l6ZW9mKGludCkpOworICAgICAgICAgICAgaWYgKCFzaC0+ZW50cnlfcG9pbnRfb2Zmc2V0IHx8ICFzaC0+b2Zmc2V0IHx8ICFzaC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIHNoLT5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyA9IDA7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNoLT5udW1fZW50cnlfcG9pbnRfb2Zmc2V0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHZhbCA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNlZ21lbnRzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsIDw8PSAxNjsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9IGdldF9iaXRzKGdiLCAxNik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA8PD0gcmVzdDsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9IGdldF9iaXRzKGdiLCByZXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2gtPmVudHJ5X3BvaW50X29mZnNldFtpXSA9IHZhbCArIDE7IC8vICsxOyAvLyArMSB0byBnZXQgdGhlIHNpemUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT50aHJlYWRzX251bWJlciA+IDEgJiYgKHMtPnBwcy0+bnVtX3RpbGVfcm93cyA+IDEgfHwgcy0+cHBzLT5udW1fdGlsZV9jb2x1bW5zID4gMSkpIHsKKyAgICAgICAgICAgICAgICBzLT5lbmFibGVfcGFyYWxsZWxfdGlsZXMgPSAwOyAvLyBUT0RPOiB5b3UgY2FuIGVuYWJsZSB0aWxlcyBpbiBwYXJhbGxlbCBoZXJlCisgICAgICAgICAgICAgICAgcy0+dGhyZWFkc19udW1iZXIgPSAxOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcy0+ZW5hYmxlX3BhcmFsbGVsX3RpbGVzID0gMDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzLT5lbmFibGVfcGFyYWxsZWxfdGlsZXMgPSAwOworICAgIH0KKworICAgIGlmIChzLT5wcHMtPnNsaWNlX2hlYWRlcl9leHRlbnNpb25fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBsZW5ndGggPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgICAgICBpZiAobGVuZ3RoKjhMTCA+IGdldF9iaXRzX2xlZnQoZ2IpKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInRvbyBtYW55IHNsaWNlX2hlYWRlcl9leHRlbnNpb25fZGF0YV9ieXRlc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDgpOyAgLy8gc2xpY2VfaGVhZGVyX2V4dGVuc2lvbl9kYXRhX2J5dGUKKyAgICB9CisKKyAgICAvLyBJbmZlcnJlZCBwYXJhbWV0ZXJzCisgICAgc2gtPnNsaWNlX3FwID0gMjZVICsgcy0+cHBzLT5waWNfaW5pdF9xcF9taW51czI2ICsgc2gtPnNsaWNlX3FwX2RlbHRhOworICAgIGlmIChzaC0+c2xpY2VfcXAgPiA1MSB8fAorICAgICAgICBzaC0+c2xpY2VfcXAgPCAtcy0+c3BzLT5xcF9iZF9vZmZzZXQpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVGhlIHNsaWNlX3FwICVkIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlICIKKyAgICAgICAgICAgICAgICJbJWQsIDUxXS5cbiIsCisgICAgICAgICAgICAgICBzaC0+c2xpY2VfcXAsCisgICAgICAgICAgICAgICAtcy0+c3BzLT5xcF9iZF9vZmZzZXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzaC0+c2xpY2VfY3RiX2FkZHJfcnMgPSBzaC0+c2xpY2Vfc2VnbWVudF9hZGRyOworCisgICAgaWYgKCFzLT5zaC5zbGljZV9jdGJfYWRkcl9ycyAmJiBzLT5zaC5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW1wb3NzaWJsZSBzbGljZSBzZWdtZW50LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiT3ZlcnJlYWQgc2xpY2UgaGVhZGVyIGJ5ICVkIGJpdHNcbiIsIC1nZXRfYml0c19sZWZ0KGdiKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPkhFVkNsYy0+Zmlyc3RfcXBfZ3JvdXAgPSAhcy0+c2guZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZzsKKworICAgIGlmICghcy0+cHBzLT5jdV9xcF9kZWx0YV9lbmFibGVkX2ZsYWcpCisgICAgICAgIHMtPkhFVkNsYy0+cXBfeSA9IHMtPnNoLnNsaWNlX3FwOworCisgICAgcy0+c2xpY2VfaW5pdGlhbGl6ZWQgPSAxOworICAgIHMtPkhFVkNsYy0+dHUuY3VfcXBfb2Zmc2V0X2NiID0gMDsKKyAgICBzLT5IRVZDbGMtPnR1LmN1X3FwX29mZnNldF9jciA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBDVEIodGFiLCB4LCB5KSAoKHRhYilbKHkpICogcy0+c3BzLT5jdGJfd2lkdGggKyAoeCldKQorCisjZGVmaW5lIFNFVF9TQU8oZWxlbSwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghc2FvX21lcmdlX3VwX2ZsYWcgJiYgIXNhb19tZXJnZV9sZWZ0X2ZsYWcpICAgICBcCisgICAgICAgIHNhby0+ZWxlbSA9IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmIChzYW9fbWVyZ2VfbGVmdF9mbGFnKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzYW8tPmVsZW0gPSBDVEIocy0+c2FvLCByeC0xLCByeSkuZWxlbTsgICAgICAgICBcCisgICAgZWxzZSBpZiAoc2FvX21lcmdlX3VwX2ZsYWcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2FvLT5lbGVtID0gQ1RCKHMtPnNhbywgcngsIHJ5LTEpLmVsZW07ICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNhby0+ZWxlbSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGhsc19zYW9fcGFyYW0oSEVWQ0NvbnRleHQgKnMsIGludCByeCwgaW50IHJ5KQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjICAgID0gcy0+SEVWQ2xjOworICAgIGludCBzYW9fbWVyZ2VfbGVmdF9mbGFnID0gMDsKKyAgICBpbnQgc2FvX21lcmdlX3VwX2ZsYWcgICA9IDA7CisgICAgU0FPUGFyYW1zICpzYW8gICAgICAgICAgPSAmQ1RCKHMtPnNhbywgcngsIHJ5KTsKKyAgICBpbnQgY19pZHgsIGk7CisKKyAgICBpZiAocy0+c2guc2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzBdIHx8CisgICAgICAgIHMtPnNoLnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1sxXSkgeworICAgICAgICBpZiAocnggPiAwKSB7CisgICAgICAgICAgICBpZiAobGMtPmN0Yl9sZWZ0X2ZsYWcpCisgICAgICAgICAgICAgICAgc2FvX21lcmdlX2xlZnRfZmxhZyA9IGZmX2hldmNfc2FvX21lcmdlX2ZsYWdfZGVjb2RlKHMpOworICAgICAgICB9CisgICAgICAgIGlmIChyeSA+IDAgJiYgIXNhb19tZXJnZV9sZWZ0X2ZsYWcpIHsKKyAgICAgICAgICAgIGlmIChsYy0+Y3RiX3VwX2ZsYWcpCisgICAgICAgICAgICAgICAgc2FvX21lcmdlX3VwX2ZsYWcgPSBmZl9oZXZjX3Nhb19tZXJnZV9mbGFnX2RlY29kZShzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY19pZHggPSAwOyBjX2lkeCA8IDM7IGNfaWR4KyspIHsKKyAgICAgICAgaW50IGxvZzJfc2FvX29mZnNldF9zY2FsZSA9IGNfaWR4ID09IDAgPyBzLT5wcHMtPmxvZzJfc2FvX29mZnNldF9zY2FsZV9sdW1hIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcHMtPmxvZzJfc2FvX29mZnNldF9zY2FsZV9jaHJvbWE7CisKKyAgICAgICAgaWYgKCFzLT5zaC5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbY19pZHhdKSB7CisgICAgICAgICAgICBzYW8tPnR5cGVfaWR4W2NfaWR4XSA9IFNBT19OT1RfQVBQTElFRDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNfaWR4ID09IDIpIHsKKyAgICAgICAgICAgIHNhby0+dHlwZV9pZHhbMl0gPSBzYW8tPnR5cGVfaWR4WzFdOworICAgICAgICAgICAgc2FvLT5lb19jbGFzc1syXSA9IHNhby0+ZW9fY2xhc3NbMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTRVRfU0FPKHR5cGVfaWR4W2NfaWR4XSwgZmZfaGV2Y19zYW9fdHlwZV9pZHhfZGVjb2RlKHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzYW8tPnR5cGVfaWR4W2NfaWR4XSA9PSBTQU9fTk9UX0FQUExJRUQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgU0VUX1NBTyhvZmZzZXRfYWJzW2NfaWR4XVtpXSwgZmZfaGV2Y19zYW9fb2Zmc2V0X2Fic19kZWNvZGUocykpOworCisgICAgICAgIGlmIChzYW8tPnR5cGVfaWR4W2NfaWR4XSA9PSBTQU9fQkFORCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzYW8tPm9mZnNldF9hYnNbY19pZHhdW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9TQU8ob2Zmc2V0X3NpZ25bY19pZHhdW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2hldmNfc2FvX29mZnNldF9zaWduX2RlY29kZShzKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2FvLT5vZmZzZXRfc2lnbltjX2lkeF1baV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNFVF9TQU8oYmFuZF9wb3NpdGlvbltjX2lkeF0sIGZmX2hldmNfc2FvX2JhbmRfcG9zaXRpb25fZGVjb2RlKHMpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjX2lkeCAhPSAyKSB7CisgICAgICAgICAgICBTRVRfU0FPKGVvX2NsYXNzW2NfaWR4XSwgZmZfaGV2Y19zYW9fZW9fY2xhc3NfZGVjb2RlKHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluZmVycmVkIHBhcmFtZXRlcnMKKyAgICAgICAgc2FvLT5vZmZzZXRfdmFsW2NfaWR4XVswXSA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIHNhby0+b2Zmc2V0X3ZhbFtjX2lkeF1baSArIDFdID0gc2FvLT5vZmZzZXRfYWJzW2NfaWR4XVtpXTsKKyAgICAgICAgICAgIGlmIChzYW8tPnR5cGVfaWR4W2NfaWR4XSA9PSBTQU9fRURHRSkgeworICAgICAgICAgICAgICAgIGlmIChpID4gMSkKKyAgICAgICAgICAgICAgICAgICAgc2FvLT5vZmZzZXRfdmFsW2NfaWR4XVtpICsgMV0gPSAtc2FvLT5vZmZzZXRfdmFsW2NfaWR4XVtpICsgMV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNhby0+b2Zmc2V0X3NpZ25bY19pZHhdW2ldKSB7CisgICAgICAgICAgICAgICAgc2FvLT5vZmZzZXRfdmFsW2NfaWR4XVtpICsgMV0gPSAtc2FvLT5vZmZzZXRfdmFsW2NfaWR4XVtpICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYW8tPm9mZnNldF92YWxbY19pZHhdW2kgKyAxXSA8PD0gbG9nMl9zYW9fb2Zmc2V0X3NjYWxlOworICAgICAgICB9CisgICAgfQorfQorCisjdW5kZWYgU0VUX1NBTworI3VuZGVmIENUQgorCitzdGF0aWMgaW50IGhsc19jcm9zc19jb21wb25lbnRfcHJlZChIRVZDQ29udGV4dCAqcywgaW50IGlkeCkgeworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjICAgID0gcy0+SEVWQ2xjOworICAgIGludCBsb2cyX3Jlc19zY2FsZV9hYnNfcGx1czEgPSBmZl9oZXZjX2xvZzJfcmVzX3NjYWxlX2FicyhzLCBpZHgpOworCisgICAgaWYgKGxvZzJfcmVzX3NjYWxlX2Fic19wbHVzMSAhPSAgMCkgeworICAgICAgICBpbnQgcmVzX3NjYWxlX3NpZ25fZmxhZyA9IGZmX2hldmNfcmVzX3NjYWxlX3NpZ25fZmxhZyhzLCBpZHgpOworICAgICAgICBsYy0+dHUucmVzX3NjYWxlX3ZhbCA9ICgxIDw8IChsb2cyX3Jlc19zY2FsZV9hYnNfcGx1czEgLSAxKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIC0gMiAqIHJlc19zY2FsZV9zaWduX2ZsYWcpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxjLT50dS5yZXNfc2NhbGVfdmFsID0gMDsKKyAgICB9CisKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhsc190cmFuc2Zvcm1fdW5pdChIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeEJhc2UsIGludCB5QmFzZSwgaW50IGNiX3hCYXNlLCBpbnQgY2JfeUJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplLCBpbnQgbG9nMl90cmFmb19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa19pZHgsIGludCBjYmZfbHVtYSwgaW50ICpjYmZfY2IsIGludCAqY2JmX2NyKQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIGNvbnN0IGludCBsb2cyX3RyYWZvX3NpemVfYyA9IGxvZzJfdHJhZm9fc2l6ZSAtIHMtPnNwcy0+aHNoaWZ0WzFdOworICAgIGludCBpOworCisgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgeworICAgICAgICBpbnQgdHJhZm9fc2l6ZSA9IDEgPDwgbG9nMl90cmFmb19zaXplOworICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHgwLCB5MCwgdHJhZm9fc2l6ZSwgdHJhZm9fc2l6ZSk7CisKKyAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplIC0gMl0ocywgeDAsIHkwLCAwKTsKKyAgICB9CisKKyAgICBpZiAoY2JmX2x1bWEgfHwgY2JmX2NiWzBdIHx8IGNiZl9jclswXSB8fAorICAgICAgICAocy0+c3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyICYmIChjYmZfY2JbMV0gfHwgY2JmX2NyWzFdKSkpIHsKKyAgICAgICAgaW50IHNjYW5faWR4ICAgPSBTQ0FOX0RJQUc7CisgICAgICAgIGludCBzY2FuX2lkeF9jID0gU0NBTl9ESUFHOworICAgICAgICBpbnQgY2JmX2Nocm9tYSA9IGNiZl9jYlswXSB8fCBjYmZfY3JbMF0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNiZl9jYlsxXSB8fCBjYmZfY3JbMV0pKTsKKworICAgICAgICBpZiAocy0+cHBzLT5jdV9xcF9kZWx0YV9lbmFibGVkX2ZsYWcgJiYgIWxjLT50dS5pc19jdV9xcF9kZWx0YV9jb2RlZCkgeworICAgICAgICAgICAgbGMtPnR1LmN1X3FwX2RlbHRhID0gZmZfaGV2Y19jdV9xcF9kZWx0YV9hYnMocyk7CisgICAgICAgICAgICBpZiAobGMtPnR1LmN1X3FwX2RlbHRhICE9IDApCisgICAgICAgICAgICAgICAgaWYgKGZmX2hldmNfY3VfcXBfZGVsdGFfc2lnbl9mbGFnKHMpID09IDEpCisgICAgICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9kZWx0YSA9IC1sYy0+dHUuY3VfcXBfZGVsdGE7CisgICAgICAgICAgICBsYy0+dHUuaXNfY3VfcXBfZGVsdGFfY29kZWQgPSAxOworCisgICAgICAgICAgICBpZiAobGMtPnR1LmN1X3FwX2RlbHRhIDwgLSgyNiArIHMtPnNwcy0+cXBfYmRfb2Zmc2V0IC8gMikgfHwKKyAgICAgICAgICAgICAgICBsYy0+dHUuY3VfcXBfZGVsdGEgPiAgKDI1ICsgcy0+c3BzLT5xcF9iZF9vZmZzZXQgLyAyKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGN1X3FwX2RlbHRhICVkIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlslZCwgJWRdLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGMtPnR1LmN1X3FwX2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAtKDI2ICsgcy0+c3BzLT5xcF9iZF9vZmZzZXQgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgyNSArIHMtPnNwcy0+cXBfYmRfb2Zmc2V0IC8gMikpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmZl9oZXZjX3NldF9xUHkocywgY2JfeEJhc2UsIGNiX3lCYXNlLCBsb2cyX2NiX3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnNoLmN1X2Nocm9tYV9xcF9vZmZzZXRfZW5hYmxlZF9mbGFnICYmIGNiZl9jaHJvbWEgJiYKKyAgICAgICAgICAgICFsYy0+Y3UuY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZyAgJiYgICFsYy0+dHUuaXNfY3VfY2hyb21hX3FwX29mZnNldF9jb2RlZCkgeworICAgICAgICAgICAgaW50IGN1X2Nocm9tYV9xcF9vZmZzZXRfZmxhZyA9IGZmX2hldmNfY3VfY2hyb21hX3FwX29mZnNldF9mbGFnKHMpOworICAgICAgICAgICAgaWYgKGN1X2Nocm9tYV9xcF9vZmZzZXRfZmxhZykgeworICAgICAgICAgICAgICAgIGludCBjdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeCAgPSAwOworICAgICAgICAgICAgICAgIGlmIChzLT5wcHMtPmNocm9tYV9xcF9vZmZzZXRfbGlzdF9sZW5fbWludXMxID4gMCkgeworICAgICAgICAgICAgICAgICAgICBjdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeCA9IGZmX2hldmNfY3VfY2hyb21hX3FwX29mZnNldF9pZHgocyk7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgImN1X2Nocm9tYV9xcF9vZmZzZXRfaWR4IG5vdCB5ZXQgdGVzdGVkLlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9vZmZzZXRfY2IgPSBzLT5wcHMtPmNiX3FwX29mZnNldF9saXN0W2N1X2Nocm9tYV9xcF9vZmZzZXRfaWR4XTsKKyAgICAgICAgICAgICAgICBsYy0+dHUuY3VfcXBfb2Zmc2V0X2NyID0gcy0+cHBzLT5jcl9xcF9vZmZzZXRfbGlzdFtjdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9vZmZzZXRfY2IgPSAwOworICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9vZmZzZXRfY3IgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGMtPnR1LmlzX2N1X2Nocm9tYV9xcF9vZmZzZXRfY29kZWQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSAmJiBsb2cyX3RyYWZvX3NpemUgPCA0KSB7CisgICAgICAgICAgICBpZiAobGMtPnR1LmludHJhX3ByZWRfbW9kZSA+PSA2ICYmCisgICAgICAgICAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZSA8PSAxNCkgeworICAgICAgICAgICAgICAgIHNjYW5faWR4ID0gU0NBTl9WRVJUOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYy0+dHUuaW50cmFfcHJlZF9tb2RlID49IDIyICYmCisgICAgICAgICAgICAgICAgICAgICAgIGxjLT50dS5pbnRyYV9wcmVkX21vZGUgPD0gMzApIHsKKyAgICAgICAgICAgICAgICBzY2FuX2lkeCA9IFNDQU5fSE9SSVo7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgPj0gIDYgJiYKKyAgICAgICAgICAgICAgICBsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgPD0gMTQpIHsKKyAgICAgICAgICAgICAgICBzY2FuX2lkeF9jID0gU0NBTl9WRVJUOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgPj0gMjIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZV9jIDw9IDMwKSB7CisgICAgICAgICAgICAgICAgc2Nhbl9pZHhfYyA9IFNDQU5fSE9SSVo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsYy0+dHUuY3Jvc3NfcGYgPSAwOworCisgICAgICAgIGlmIChjYmZfbHVtYSkKKyAgICAgICAgICAgIGZmX2hldmNfaGxzX3Jlc2lkdWFsX2NvZGluZyhzLCB4MCwgeTAsIGxvZzJfdHJhZm9fc2l6ZSwgc2Nhbl9pZHgsIDApOworICAgICAgICBpZiAobG9nMl90cmFmb19zaXplID4gMiB8fCBzLT5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpIHsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX2ggPSAxIDw8IChsb2cyX3RyYWZvX3NpemVfYyArIHMtPnNwcy0+aHNoaWZ0WzFdKTsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX3YgPSAxIDw8IChsb2cyX3RyYWZvX3NpemVfYyArIHMtPnNwcy0+dnNoaWZ0WzFdKTsKKyAgICAgICAgICAgIGxjLT50dS5jcm9zc19wZiAgPSAocy0+cHBzLT5jcm9zc19jb21wb25lbnRfcHJlZGljdGlvbl9lbmFibGVkX2ZsYWcgJiYgY2JmX2x1bWEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRFUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxjLT50dS5jaHJvbWFfbW9kZV9jID09ICA0KSkpOworCisgICAgICAgICAgICBpZiAobGMtPnR1LmNyb3NzX3BmKSB7CisgICAgICAgICAgICAgICAgaGxzX2Nyb3NzX2NvbXBvbmVudF9wcmVkKHMsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChzLT5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIgPyAyIDogMSk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChsYy0+Y3UucHJlZF9tb2RlID09IE1PREVfSU5UUkEpIHsKKyAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShzLCB4MCwgeTAgKyAoaSA8PCBsb2cyX3RyYWZvX3NpemVfYyksIHRyYWZvX3NpemVfaCwgdHJhZm9fc2l6ZV92KTsKKyAgICAgICAgICAgICAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplX2MgLSAyXShzLCB4MCwgeTAgKyAoaSA8PCBsb2cyX3RyYWZvX3NpemVfYyksIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2JmX2NiW2ldKQorICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX2hsc19yZXNpZHVhbF9jb2RpbmcocywgeDAsIHkwICsgKGkgPDwgbG9nMl90cmFmb19zaXplX2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMl90cmFmb19zaXplX2MsIHNjYW5faWR4X2MsIDEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxjLT50dS5jcm9zc19wZikgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSA9IHMtPmZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBoc2hpZnQgPSBzLT5zcHMtPmhzaGlmdFsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2c2hpZnQgPSBzLT5zcHMtPnZzaGlmdFsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmNvZWZmc195ID0gKGludDE2X3QqKWxjLT5lZGdlX2VtdV9idWZmZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpjb2VmZnMgICA9IChpbnQxNl90KilsYy0+ZWRnZV9lbXVfYnVmZmVyMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gMSA8PCBsb2cyX3RyYWZvX3NpemVfYzsKKworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gJnMtPmZyYW1lLT5kYXRhWzFdWyh5MCA+PiB2c2hpZnQpICogc3RyaWRlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4MCA+PiBoc2hpZnQpIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoc2l6ZSAqIHNpemUpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZnNbaV0gPSAoKGxjLT50dS5yZXNfc2NhbGVfdmFsICogY29lZmZzX3lbaV0pID4+IDMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGV2Y2RzcC50cmFuc2Zvcm1fYWRkW2xvZzJfdHJhZm9fc2l6ZV9jLTJdKGRzdCwgY29lZmZzLCBzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYy0+dHUuY3Jvc3NfcGYpIHsKKyAgICAgICAgICAgICAgICBobHNfY3Jvc3NfY29tcG9uZW50X3ByZWQocywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHMtPnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMiA/IDIgOiAxKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgeworICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHgwLCB5MCArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZV9jKSwgdHJhZm9fc2l6ZV9oLCB0cmFmb19zaXplX3YpOworICAgICAgICAgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemVfYyAtIDJdKHMsIHgwLCB5MCArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZV9jKSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjYmZfY3JbaV0pCisgICAgICAgICAgICAgICAgICAgIGZmX2hldmNfaGxzX3Jlc2lkdWFsX2NvZGluZyhzLCB4MCwgeTAgKyAoaSA8PCBsb2cyX3RyYWZvX3NpemVfYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cyX3RyYWZvX3NpemVfYywgc2Nhbl9pZHhfYywgMik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAobGMtPnR1LmNyb3NzX3BmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlID0gcy0+ZnJhbWUtPmxpbmVzaXplWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzaGlmdCA9IHMtPnNwcy0+aHNoaWZ0WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZzaGlmdCA9IHMtPnNwcy0+dnNoaWZ0WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqY29lZmZzX3kgPSAoaW50MTZfdCopbGMtPmVkZ2VfZW11X2J1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmNvZWZmcyAgID0gKGludDE2X3QqKWxjLT5lZGdlX2VtdV9idWZmZXIyOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSAxIDw8IGxvZzJfdHJhZm9fc2l6ZV9jOworCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSAmcy0+ZnJhbWUtPmRhdGFbMl1bKHkwID4+IHZzaGlmdCkgKiBzdHJpZGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeDAgPj4gaHNoaWZ0KSA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemUgKiBzaXplKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZzW2ldID0gKChsYy0+dHUucmVzX3NjYWxlX3ZhbCAqIGNvZWZmc195W2ldKSA+PiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhldmNkc3AudHJhbnNmb3JtX2FkZFtsb2cyX3RyYWZvX3NpemVfYy0yXShkc3QsIGNvZWZmcywgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGJsa19pZHggPT0gMykgeworICAgICAgICAgICAgaW50IHRyYWZvX3NpemVfaCA9IDEgPDwgKGxvZzJfdHJhZm9fc2l6ZSArIDEpOworICAgICAgICAgICAgaW50IHRyYWZvX3NpemVfdiA9IDEgPDwgKGxvZzJfdHJhZm9fc2l6ZSArIHMtPnNwcy0+dnNoaWZ0WzFdKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocy0+c3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyID8gMiA6IDEpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBKSB7CisgICAgICAgICAgICAgICAgICAgIGZmX2hldmNfc2V0X25laWdoYm91cl9hdmFpbGFibGUocywgeEJhc2UsIHlCYXNlICsgKGkgPDwgbG9nMl90cmFmb19zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7CisgICAgICAgICAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZSAtIDJdKHMsIHhCYXNlLCB5QmFzZSArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZSksIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2JmX2NiW2ldKQorICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX2hsc19yZXNpZHVhbF9jb2RpbmcocywgeEJhc2UsIHlCYXNlICsgKGkgPDwgbG9nMl90cmFmb19zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfdHJhZm9fc2l6ZSwgc2Nhbl9pZHhfYywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHMtPnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMiA/IDIgOiAxKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgeworICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHhCYXNlLCB5QmFzZSArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7CisgICAgICAgICAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZSAtIDJdKHMsIHhCYXNlLCB5QmFzZSArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZSksIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2JmX2NyW2ldKQorICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX2hsc19yZXNpZHVhbF9jb2RpbmcocywgeEJhc2UsIHlCYXNlICsgKGkgPDwgbG9nMl90cmFmb19zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfdHJhZm9fc2l6ZSwgc2Nhbl9pZHhfYywgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgeworICAgICAgICBpZiAobG9nMl90cmFmb19zaXplID4gMiB8fCBzLT5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpIHsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX2ggPSAxIDw8IChsb2cyX3RyYWZvX3NpemVfYyArIHMtPnNwcy0+aHNoaWZ0WzFdKTsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX3YgPSAxIDw8IChsb2cyX3RyYWZvX3NpemVfYyArIHMtPnNwcy0+dnNoaWZ0WzFdKTsKKyAgICAgICAgICAgIGZmX2hldmNfc2V0X25laWdoYm91cl9hdmFpbGFibGUocywgeDAsIHkwLCB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7CisgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemVfYyAtIDJdKHMsIHgwLCB5MCwgMSk7CisgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemVfYyAtIDJdKHMsIHgwLCB5MCwgMik7CisgICAgICAgICAgICBpZiAocy0+c3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyKSB7CisgICAgICAgICAgICAgICAgZmZfaGV2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShzLCB4MCwgeTAgKyAoMSA8PCBsb2cyX3RyYWZvX3NpemVfYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7CisgICAgICAgICAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplX2MgLSAyXShzLCB4MCwgeTAgKyAoMSA8PCBsb2cyX3RyYWZvX3NpemVfYyksIDEpOworICAgICAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZV9jIC0gMl0ocywgeDAsIHkwICsgKDEgPDwgbG9nMl90cmFmb19zaXplX2MpLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChibGtfaWR4ID09IDMpIHsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX2ggPSAxIDw8IChsb2cyX3RyYWZvX3NpemUgKyAxKTsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX3YgPSAxIDw8IChsb2cyX3RyYWZvX3NpemUgKyBzLT5zcHMtPnZzaGlmdFsxXSk7CisgICAgICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHhCYXNlLCB5QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhZm9fc2l6ZV9oLCB0cmFmb19zaXplX3YpOworICAgICAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplIC0gMl0ocywgeEJhc2UsIHlCYXNlLCAxKTsKKyAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZSAtIDJdKHMsIHhCYXNlLCB5QmFzZSwgMik7CisgICAgICAgICAgICBpZiAocy0+c3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyKSB7CisgICAgICAgICAgICAgICAgZmZfaGV2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShzLCB4QmFzZSwgeUJhc2UgKyAoMSA8PCAobG9nMl90cmFmb19zaXplKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7CisgICAgICAgICAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplIC0gMl0ocywgeEJhc2UsIHlCYXNlICsgKDEgPDwgKGxvZzJfdHJhZm9fc2l6ZSkpLCAxKTsKKyAgICAgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemUgLSAyXShzLCB4QmFzZSwgeUJhc2UgKyAoMSA8PCAobG9nMl90cmFmb19zaXplKSksIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kZWJsb2NraW5nX2J5cGFzcyhIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBsb2cyX2NiX3NpemUpCit7CisgICAgaW50IGNiX3NpemUgICAgICAgICAgPSAxIDw8IGxvZzJfY2Jfc2l6ZTsKKyAgICBpbnQgbG9nMl9taW5fcHVfc2l6ZSA9IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKKworICAgIGludCBtaW5fcHVfd2lkdGggICAgID0gcy0+c3BzLT5taW5fcHVfd2lkdGg7CisgICAgaW50IHhfZW5kID0gRkZNSU4oeDAgKyBjYl9zaXplLCBzLT5zcHMtPndpZHRoKTsKKyAgICBpbnQgeV9lbmQgPSBGRk1JTih5MCArIGNiX3NpemUsIHMtPnNwcy0+aGVpZ2h0KTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaiA9ICh5MCA+PiBsb2cyX21pbl9wdV9zaXplKTsgaiA8ICh5X2VuZCA+PiBsb2cyX21pbl9wdV9zaXplKTsgaisrKQorICAgICAgICBmb3IgKGkgPSAoeDAgPj4gbG9nMl9taW5fcHVfc2l6ZSk7IGkgPCAoeF9lbmQgPj4gbG9nMl9taW5fcHVfc2l6ZSk7IGkrKykKKyAgICAgICAgICAgIHMtPmlzX3BjbVtpICsgaiAqIG1pbl9wdV93aWR0aF0gPSAyOworfQorCitzdGF0aWMgaW50IGhsc190cmFuc2Zvcm1fdHJlZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeEJhc2UsIGludCB5QmFzZSwgaW50IGNiX3hCYXNlLCBpbnQgY2JfeUJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplLCBpbnQgbG9nMl90cmFmb19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYWZvX2RlcHRoLCBpbnQgYmxrX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqYmFzZV9jYmZfY2IsIGNvbnN0IGludCAqYmFzZV9jYmZfY3IpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgdWludDhfdCBzcGxpdF90cmFuc2Zvcm1fZmxhZzsKKyAgICBpbnQgY2JmX2NiWzJdOworICAgIGludCBjYmZfY3JbMl07CisgICAgaW50IHJldDsKKworICAgIGNiZl9jYlswXSA9IGJhc2VfY2JmX2NiWzBdOworICAgIGNiZl9jYlsxXSA9IGJhc2VfY2JmX2NiWzFdOworICAgIGNiZl9jclswXSA9IGJhc2VfY2JmX2NyWzBdOworICAgIGNiZl9jclsxXSA9IGJhc2VfY2JmX2NyWzFdOworCisgICAgaWYgKGxjLT5jdS5pbnRyYV9zcGxpdF9mbGFnKSB7CisgICAgICAgIGlmICh0cmFmb19kZXB0aCA9PSAxKSB7CisgICAgICAgICAgICBsYy0+dHUuaW50cmFfcHJlZF9tb2RlICAgPSBsYy0+cHUuaW50cmFfcHJlZF9tb2RlW2Jsa19pZHhdOworICAgICAgICAgICAgaWYgKHMtPnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgeworICAgICAgICAgICAgICAgIGxjLT50dS5pbnRyYV9wcmVkX21vZGVfYyA9IGxjLT5wdS5pbnRyYV9wcmVkX21vZGVfY1tibGtfaWR4XTsKKyAgICAgICAgICAgICAgICBsYy0+dHUuY2hyb21hX21vZGVfYyAgICAgPSBsYy0+cHUuY2hyb21hX21vZGVfY1tibGtfaWR4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZV9jID0gbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jWzBdOworICAgICAgICAgICAgICAgIGxjLT50dS5jaHJvbWFfbW9kZV9jICAgICA9IGxjLT5wdS5jaHJvbWFfbW9kZV9jWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZSAgID0gbGMtPnB1LmludHJhX3ByZWRfbW9kZVswXTsKKyAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZV9jID0gbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jWzBdOworICAgICAgICBsYy0+dHUuY2hyb21hX21vZGVfYyAgICAgPSBsYy0+cHUuY2hyb21hX21vZGVfY1swXTsKKyAgICB9CisKKyAgICBpZiAobG9nMl90cmFmb19zaXplIDw9IHMtPnNwcy0+bG9nMl9tYXhfdHJhZm9fc2l6ZSAmJgorICAgICAgICBsb2cyX3RyYWZvX3NpemUgPiAgcy0+c3BzLT5sb2cyX21pbl90Yl9zaXplICAgICYmCisgICAgICAgIHRyYWZvX2RlcHRoICAgICA8IGxjLT5jdS5tYXhfdHJhZm9fZGVwdGggICAgICAgJiYKKyAgICAgICAgIShsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyAmJiB0cmFmb19kZXB0aCA9PSAwKSkgeworICAgICAgICBzcGxpdF90cmFuc2Zvcm1fZmxhZyA9IGZmX2hldmNfc3BsaXRfdHJhbnNmb3JtX2ZsYWdfZGVjb2RlKHMsIGxvZzJfdHJhZm9fc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGludGVyX3NwbGl0ID0gcy0+c3BzLT5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRlciA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRFUiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICBsYy0+Y3UucGFydF9tb2RlICE9IFBBUlRfMk54Mk4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhZm9fZGVwdGggPT0gMDsKKworICAgICAgICBzcGxpdF90cmFuc2Zvcm1fZmxhZyA9IGxvZzJfdHJhZm9fc2l6ZSA+IHMtPnNwcy0+bG9nMl9tYXhfdHJhZm9fc2l6ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyAmJiB0cmFmb19kZXB0aCA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyX3NwbGl0OworICAgIH0KKworICAgIGlmIChsb2cyX3RyYWZvX3NpemUgPiAyIHx8IHMtPnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgeworICAgICAgICBpZiAodHJhZm9fZGVwdGggPT0gMCB8fCBjYmZfY2JbMF0pIHsKKyAgICAgICAgICAgIGNiZl9jYlswXSA9IGZmX2hldmNfY2JmX2NiX2NyX2RlY29kZShzLCB0cmFmb19kZXB0aCk7CisgICAgICAgICAgICBpZiAocy0+c3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyICYmICghc3BsaXRfdHJhbnNmb3JtX2ZsYWcgfHwgbG9nMl90cmFmb19zaXplID09IDMpKSB7CisgICAgICAgICAgICAgICAgY2JmX2NiWzFdID0gZmZfaGV2Y19jYmZfY2JfY3JfZGVjb2RlKHMsIHRyYWZvX2RlcHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh0cmFmb19kZXB0aCA9PSAwIHx8IGNiZl9jclswXSkgeworICAgICAgICAgICAgY2JmX2NyWzBdID0gZmZfaGV2Y19jYmZfY2JfY3JfZGVjb2RlKHMsIHRyYWZvX2RlcHRoKTsKKyAgICAgICAgICAgIGlmIChzLT5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIgJiYgKCFzcGxpdF90cmFuc2Zvcm1fZmxhZyB8fCBsb2cyX3RyYWZvX3NpemUgPT0gMykpIHsKKyAgICAgICAgICAgICAgICBjYmZfY3JbMV0gPSBmZl9oZXZjX2NiZl9jYl9jcl9kZWNvZGUocywgdHJhZm9fZGVwdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNwbGl0X3RyYW5zZm9ybV9mbGFnKSB7CisgICAgICAgIGNvbnN0IGludCB0cmFmb19zaXplX3NwbGl0ID0gMSA8PCAobG9nMl90cmFmb19zaXplIC0gMSk7CisgICAgICAgIGNvbnN0IGludCB4MSA9IHgwICsgdHJhZm9fc2l6ZV9zcGxpdDsKKyAgICAgICAgY29uc3QgaW50IHkxID0geTAgKyB0cmFmb19zaXplX3NwbGl0OworCisjZGVmaW5lIFNVQkRJVklERSh4LCB5LCBpZHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldCA9IGhsc190cmFuc2Zvcm1fdHJlZShzLCB4LCB5LCB4MCwgeTAsIGNiX3hCYXNlLCBjYl95QmFzZSwgbG9nMl9jYl9zaXplLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfdHJhZm9fc2l6ZSAtIDEsIHRyYWZvX2RlcHRoICsgMSwgaWR4LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JmX2NiLCBjYmZfY3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChyZXQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyAgICAgICAgU1VCRElWSURFKHgwLCB5MCwgMCk7CisgICAgICAgIFNVQkRJVklERSh4MSwgeTAsIDEpOworICAgICAgICBTVUJESVZJREUoeDAsIHkxLCAyKTsKKyAgICAgICAgU1VCRElWSURFKHgxLCB5MSwgMyk7CisKKyN1bmRlZiBTVUJESVZJREUKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgbWluX3R1X3NpemUgICAgICA9IDEgPDwgcy0+c3BzLT5sb2cyX21pbl90Yl9zaXplOworICAgICAgICBpbnQgbG9nMl9taW5fdHVfc2l6ZSA9IHMtPnNwcy0+bG9nMl9taW5fdGJfc2l6ZTsKKyAgICAgICAgaW50IG1pbl90dV93aWR0aCAgICAgPSBzLT5zcHMtPm1pbl90Yl93aWR0aDsKKyAgICAgICAgaW50IGNiZl9sdW1hICAgICAgICAgPSAxOworCisgICAgICAgIGlmIChsYy0+Y3UucHJlZF9tb2RlID09IE1PREVfSU5UUkEgfHwgdHJhZm9fZGVwdGggIT0gMCB8fAorICAgICAgICAgICAgY2JmX2NiWzBdIHx8IGNiZl9jclswXSB8fAorICAgICAgICAgICAgKHMtPnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMiAmJiAoY2JmX2NiWzFdIHx8IGNiZl9jclsxXSkpKSB7CisgICAgICAgICAgICBjYmZfbHVtYSA9IGZmX2hldmNfY2JmX2x1bWFfZGVjb2RlKHMsIHRyYWZvX2RlcHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGhsc190cmFuc2Zvcm1fdW5pdChzLCB4MCwgeTAsIHhCYXNlLCB5QmFzZSwgY2JfeEJhc2UsIGNiX3lCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMl9jYl9zaXplLCBsb2cyX3RyYWZvX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtfaWR4LCBjYmZfbHVtYSwgY2JmX2NiLCBjYmZfY3IpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIC8vIFRPRE86IHN0b3JlIGNiZl9sdW1hIHNvbWV3aGVyZSBlbHNlCisgICAgICAgIGlmIChjYmZfbHVtYSkgeworICAgICAgICAgICAgaW50IGksIGo7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKDEgPDwgbG9nMl90cmFmb19zaXplKTsgaSArPSBtaW5fdHVfc2l6ZSkKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKDEgPDwgbG9nMl90cmFmb19zaXplKTsgaiArPSBtaW5fdHVfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgeF90dSA9ICh4MCArIGopID4+IGxvZzJfbWluX3R1X3NpemU7CisgICAgICAgICAgICAgICAgICAgIGludCB5X3R1ID0gKHkwICsgaSkgPj4gbG9nMl9taW5fdHVfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgcy0+Y2JmX2x1bWFbeV90dSAqIG1pbl90dV93aWR0aCArIHhfdHVdID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzLT5zaC5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcpIHsKKyAgICAgICAgICAgIGZmX2hldmNfZGVibG9ja2luZ19ib3VuZGFyeV9zdHJlbmd0aHMocywgeDAsIHkwLCBsb2cyX3RyYWZvX3NpemUpOworICAgICAgICAgICAgaWYgKHMtPnBwcy0+dHJhbnNxdWFudF9ieXBhc3NfZW5hYmxlX2ZsYWcgJiYKKyAgICAgICAgICAgICAgICBsYy0+Y3UuY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZykKKyAgICAgICAgICAgICAgICBzZXRfZGVibG9ja2luZ19ieXBhc3MocywgeDAsIHkwLCBsb2cyX3RyYWZvX3NpemUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhsc19wY21fc2FtcGxlKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwgaW50IGxvZzJfY2Jfc2l6ZSkKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBjYl9zaXplICAgPSAxIDw8IGxvZzJfY2Jfc2l6ZTsKKyAgICBpbnQgc3RyaWRlMCAgID0gcy0+ZnJhbWUtPmxpbmVzaXplWzBdOworICAgIHVpbnQ4X3QgKmRzdDAgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beTAgKiBzdHJpZGUwICsgKHgwIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpXTsKKyAgICBpbnQgICBzdHJpZGUxID0gcy0+ZnJhbWUtPmxpbmVzaXplWzFdOworICAgIHVpbnQ4X3QgKmRzdDEgPSAmcy0+ZnJhbWUtPmRhdGFbMV1bKHkwID4+IHMtPnNwcy0+dnNoaWZ0WzFdKSAqIHN0cmlkZTEgKyAoKHgwID4+IHMtPnNwcy0+aHNoaWZ0WzFdKSA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KV07CisgICAgaW50ICAgc3RyaWRlMiA9IHMtPmZyYW1lLT5saW5lc2l6ZVsyXTsKKyAgICB1aW50OF90ICpkc3QyID0gJnMtPmZyYW1lLT5kYXRhWzJdWyh5MCA+PiBzLT5zcHMtPnZzaGlmdFsyXSkgKiBzdHJpZGUyICsgKCh4MCA+PiBzLT5zcHMtPmhzaGlmdFsyXSkgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCldOworCisgICAgaW50IGxlbmd0aCAgICAgICAgID0gY2Jfc2l6ZSAqIGNiX3NpemUgKiBzLT5zcHMtPnBjbS5iaXRfZGVwdGggKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKGNiX3NpemUgPj4gcy0+c3BzLT5oc2hpZnRbMV0pICogKGNiX3NpemUgPj4gcy0+c3BzLT52c2hpZnRbMV0pKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2Jfc2l6ZSA+PiBzLT5zcHMtPmhzaGlmdFsyXSkgKiAoY2Jfc2l6ZSA+PiBzLT5zcHMtPnZzaGlmdFsyXSkpKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNwcy0+cGNtLmJpdF9kZXB0aF9jaHJvbWE7CisgICAgY29uc3QgdWludDhfdCAqcGNtID0gc2tpcF9ieXRlcygmbGMtPmNjLCAobGVuZ3RoICsgNykgPj4gMyk7CisgICAgaW50IHJldDsKKworICAgIGlmICghcy0+c2guZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnKQorICAgICAgICBmZl9oZXZjX2RlYmxvY2tpbmdfYm91bmRhcnlfc3RyZW5ndGhzKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKKworICAgIHJldCA9IGluaXRfZ2V0X2JpdHMoJmdiLCBwY20sIGxlbmd0aCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5oZXZjZHNwLnB1dF9wY20oZHN0MCwgc3RyaWRlMCwgY2Jfc2l6ZSwgY2Jfc2l6ZSwgICAgICZnYiwgcy0+c3BzLT5wY20uYml0X2RlcHRoKTsKKyAgICBzLT5oZXZjZHNwLnB1dF9wY20oZHN0MSwgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2Jfc2l6ZSA+PiBzLT5zcHMtPmhzaGlmdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2Jfc2l6ZSA+PiBzLT5zcHMtPnZzaGlmdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmdiLCBzLT5zcHMtPnBjbS5iaXRfZGVwdGhfY2hyb21hKTsKKyAgICBzLT5oZXZjZHNwLnB1dF9wY20oZHN0Miwgc3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2Jfc2l6ZSA+PiBzLT5zcHMtPmhzaGlmdFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2Jfc2l6ZSA+PiBzLT5zcHMtPnZzaGlmdFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmdiLCBzLT5zcHMtPnBjbS5iaXRfZGVwdGhfY2hyb21hKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiA4LjUuMy4yLjIuMSBMdW1hIHNhbXBsZSB1bmlkaXJlY3Rpb25hbCBpbnRlcnBvbGF0aW9uIHByb2Nlc3MKKyAqCisgKiBAcGFyYW0gcyBIRVZDIGRlY29kaW5nIGNvbnRleHQKKyAqIEBwYXJhbSBkc3QgdGFyZ2V0IGJ1ZmZlciBmb3IgYmxvY2sgZGF0YSBhdCBibG9jayBwb3NpdGlvbgorICogQHBhcmFtIGRzdHN0cmlkZSBzdHJpZGUgb2YgdGhlIGRzdCBidWZmZXIKKyAqIEBwYXJhbSByZWYgcmVmZXJlbmNlIHBpY3R1cmUgYnVmZmVyIGF0IG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSBtdiBtb3Rpb24gdmVjdG9yIChyZWxhdGl2ZSB0byBibG9jayBwb3NpdGlvbikgdG8gZ2V0IHBpeGVsIGRhdGEgZnJvbQorICogQHBhcmFtIHhfb2ZmIGhvcml6b250YWwgcG9zaXRpb24gb2YgYmxvY2sgZnJvbSBvcmlnaW4gKDAsIDApCisgKiBAcGFyYW0geV9vZmYgdmVydGljYWwgcG9zaXRpb24gb2YgYmxvY2sgZnJvbSBvcmlnaW4gKDAsIDApCisgKiBAcGFyYW0gYmxvY2tfdyB3aWR0aCBvZiBibG9jaworICogQHBhcmFtIGJsb2NrX2ggaGVpZ2h0IG9mIGJsb2NrCisgKiBAcGFyYW0gbHVtYV93ZWlnaHQgd2VpZ2h0aW5nIGZhY3RvciBhcHBsaWVkIHRvIHRoZSBsdW1hIHByZWRpY3Rpb24KKyAqIEBwYXJhbSBsdW1hX29mZnNldCBhZGRpdGl2ZSBvZmZzZXQgYXBwbGllZCB0byB0aGUgbHVtYSBwcmVkaWN0aW9uIHZhbHVlCisgKi8KKworc3RhdGljIHZvaWQgbHVtYV9tY191bmkoSEVWQ0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKnJlZiwgY29uc3QgTXYgKm12LCBpbnQgeF9vZmYsIGludCB5X29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja193LCBpbnQgYmxvY2tfaCwgaW50IGx1bWFfd2VpZ2h0LCBpbnQgbHVtYV9vZmZzZXQpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgdWludDhfdCAqc3JjICAgICAgICAgPSByZWYtPmRhdGFbMF07CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSAgPSByZWYtPmxpbmVzaXplWzBdOworICAgIGludCBwaWNfd2lkdGggICAgICAgID0gcy0+c3BzLT53aWR0aDsKKyAgICBpbnQgcGljX2hlaWdodCAgICAgICA9IHMtPnNwcy0+aGVpZ2h0OworICAgIGludCBteCAgICAgICAgICAgICAgID0gbXYtPnggJiAzOworICAgIGludCBteSAgICAgICAgICAgICAgID0gbXYtPnkgJiAzOworICAgIGludCB3ZWlnaHRfZmxhZyAgICAgID0gKHMtPnNoLnNsaWNlX3R5cGUgPT0gUF9TTElDRSAmJiBzLT5wcHMtPndlaWdodGVkX3ByZWRfZmxhZykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zaC5zbGljZV90eXBlID09IEJfU0xJQ0UgJiYgcy0+cHBzLT53ZWlnaHRlZF9iaXByZWRfZmxhZyk7CisgICAgaW50IGlkeCAgICAgICAgICAgICAgPSBmZl9oZXZjX3BlbF93ZWlnaHRbYmxvY2tfd107CisKKyAgICB4X29mZiArPSBtdi0+eCA+PiAyOworICAgIHlfb2ZmICs9IG12LT55ID4+IDI7CisgICAgc3JjICAgKz0geV9vZmYgKiBzcmNzdHJpZGUgKyAoeF9vZmYgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCk7CisKKyAgICBpZiAoeF9vZmYgPCBRUEVMX0VYVFJBX0JFRk9SRSB8fCB5X29mZiA8IFFQRUxfRVhUUkFfQUZURVIgfHwKKyAgICAgICAgeF9vZmYgPj0gcGljX3dpZHRoIC0gYmxvY2tfdyAtIFFQRUxfRVhUUkFfQUZURVIgfHwKKyAgICAgICAgeV9vZmYgPj0gcGljX2hlaWdodCAtIGJsb2NrX2ggLSBRUEVMX0VYVFJBX0FGVEVSKSB7CisgICAgICAgIGNvbnN0IGludCBlZGdlX2VtdV9zdHJpZGUgPSBFREdFX0VNVV9CVUZGRVJfU1RSSURFIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQ7CisgICAgICAgIGludCBvZmZzZXQgICAgID0gUVBFTF9FWFRSQV9CRUZPUkUgKiBzcmNzdHJpZGUgICAgICAgKyAoUVBFTF9FWFRSQV9CRUZPUkUgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCk7CisgICAgICAgIGludCBidWZfb2Zmc2V0ID0gUVBFTF9FWFRSQV9CRUZPUkUgKiBlZGdlX2VtdV9zdHJpZGUgKyAoUVBFTF9FWFRSQV9CRUZPUkUgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCk7CisKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGxjLT5lZGdlX2VtdV9idWZmZXIsIHNyYyAtIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VfZW11X3N0cmlkZSwgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfdyArIFFQRUxfRVhUUkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oICsgUVBFTF9FWFRSQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfb2ZmIC0gUVBFTF9FWFRSQV9CRUZPUkUsIHlfb2ZmIC0gUVBFTF9FWFRSQV9CRUZPUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOworICAgICAgICBzcmMgPSBsYy0+ZWRnZV9lbXVfYnVmZmVyICsgYnVmX29mZnNldDsKKyAgICAgICAgc3Jjc3RyaWRlID0gZWRnZV9lbXVfc3RyaWRlOworICAgIH0KKworICAgIGlmICghd2VpZ2h0X2ZsYWcpCisgICAgICAgIHMtPmhldmNkc3AucHV0X2hldmNfcXBlbF91bmlbaWR4XVshIW15XVshIW14XShkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBteCwgbXksIGJsb2NrX3cpOworICAgIGVsc2UKKyAgICAgICAgcy0+aGV2Y2RzcC5wdXRfaGV2Y19xcGVsX3VuaV93W2lkeF1bISFteV1bISFteF0oZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBzLT5zaC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdW1hX3dlaWdodCwgbHVtYV9vZmZzZXQsIG14LCBteSwgYmxvY2tfdyk7Cit9CisKKy8qKgorICogOC41LjMuMi4yLjEgTHVtYSBzYW1wbGUgYmlkaXJlY3Rpb25hbCBpbnRlcnBvbGF0aW9uIHByb2Nlc3MKKyAqCisgKiBAcGFyYW0gcyBIRVZDIGRlY29kaW5nIGNvbnRleHQKKyAqIEBwYXJhbSBkc3QgdGFyZ2V0IGJ1ZmZlciBmb3IgYmxvY2sgZGF0YSBhdCBibG9jayBwb3NpdGlvbgorICogQHBhcmFtIGRzdHN0cmlkZSBzdHJpZGUgb2YgdGhlIGRzdCBidWZmZXIKKyAqIEBwYXJhbSByZWYwIHJlZmVyZW5jZSBwaWN0dXJlMCBidWZmZXIgYXQgb3JpZ2luICgwLCAwKQorICogQHBhcmFtIG12MCBtb3Rpb24gdmVjdG9yMCAocmVsYXRpdmUgdG8gYmxvY2sgcG9zaXRpb24pIHRvIGdldCBwaXhlbCBkYXRhIGZyb20KKyAqIEBwYXJhbSB4X29mZiBob3Jpem9udGFsIHBvc2l0aW9uIG9mIGJsb2NrIGZyb20gb3JpZ2luICgwLCAwKQorICogQHBhcmFtIHlfb2ZmIHZlcnRpY2FsIHBvc2l0aW9uIG9mIGJsb2NrIGZyb20gb3JpZ2luICgwLCAwKQorICogQHBhcmFtIGJsb2NrX3cgd2lkdGggb2YgYmxvY2sKKyAqIEBwYXJhbSBibG9ja19oIGhlaWdodCBvZiBibG9jaworICogQHBhcmFtIHJlZjEgcmVmZXJlbmNlIHBpY3R1cmUxIGJ1ZmZlciBhdCBvcmlnaW4gKDAsIDApCisgKiBAcGFyYW0gbXYxIG1vdGlvbiB2ZWN0b3IxIChyZWxhdGl2ZSB0byBibG9jayBwb3NpdGlvbikgdG8gZ2V0IHBpeGVsIGRhdGEgZnJvbQorICogQHBhcmFtIGN1cnJlbnRfbXYgY3VycmVudCBtb3Rpb24gdmVjdG9yIHN0cnVjdHVyZQorICovCisgc3RhdGljIHZvaWQgbHVtYV9tY19iaShIRVZDQ29udGV4dCAqcywgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpyZWYwLCBjb25zdCBNdiAqbXYwLCBpbnQgeF9vZmYsIGludCB5X29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3csIGludCBibG9ja19oLCBBVkZyYW1lICpyZWYxLCBjb25zdCBNdiAqbXYxLCBzdHJ1Y3QgTXZGaWVsZCAqY3VycmVudF9tdikKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICBwdHJkaWZmX3Qgc3JjMHN0cmlkZSAgPSByZWYwLT5saW5lc2l6ZVswXTsKKyAgICBwdHJkaWZmX3Qgc3JjMXN0cmlkZSAgPSByZWYxLT5saW5lc2l6ZVswXTsKKyAgICBpbnQgcGljX3dpZHRoICAgICAgICA9IHMtPnNwcy0+d2lkdGg7CisgICAgaW50IHBpY19oZWlnaHQgICAgICAgPSBzLT5zcHMtPmhlaWdodDsKKyAgICBpbnQgbXgwICAgICAgICAgICAgICA9IG12MC0+eCAmIDM7CisgICAgaW50IG15MCAgICAgICAgICAgICAgPSBtdjAtPnkgJiAzOworICAgIGludCBteDEgICAgICAgICAgICAgID0gbXYxLT54ICYgMzsKKyAgICBpbnQgbXkxICAgICAgICAgICAgICA9IG12MS0+eSAmIDM7CisgICAgaW50IHdlaWdodF9mbGFnICAgICAgPSAocy0+c2guc2xpY2VfdHlwZSA9PSBQX1NMSUNFICYmIHMtPnBwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnNoLnNsaWNlX3R5cGUgPT0gQl9TTElDRSAmJiBzLT5wcHMtPndlaWdodGVkX2JpcHJlZF9mbGFnKTsKKyAgICBpbnQgeF9vZmYwICAgICAgICAgICA9IHhfb2ZmICsgKG12MC0+eCA+PiAyKTsKKyAgICBpbnQgeV9vZmYwICAgICAgICAgICA9IHlfb2ZmICsgKG12MC0+eSA+PiAyKTsKKyAgICBpbnQgeF9vZmYxICAgICAgICAgICA9IHhfb2ZmICsgKG12MS0+eCA+PiAyKTsKKyAgICBpbnQgeV9vZmYxICAgICAgICAgICA9IHlfb2ZmICsgKG12MS0+eSA+PiAyKTsKKyAgICBpbnQgaWR4ICAgICAgICAgICAgICA9IGZmX2hldmNfcGVsX3dlaWdodFtibG9ja193XTsKKworICAgIHVpbnQ4X3QgKnNyYzAgID0gcmVmMC0+ZGF0YVswXSArIHlfb2ZmMCAqIHNyYzBzdHJpZGUgKyAoaW50KSgodW5zaWduZWQpeF9vZmYwIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpOworICAgIHVpbnQ4X3QgKnNyYzEgID0gcmVmMS0+ZGF0YVswXSArIHlfb2ZmMSAqIHNyYzFzdHJpZGUgKyAoaW50KSgodW5zaWduZWQpeF9vZmYxIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpOworCisgICAgaWYgKHhfb2ZmMCA8IFFQRUxfRVhUUkFfQkVGT1JFIHx8IHlfb2ZmMCA8IFFQRUxfRVhUUkFfQUZURVIgfHwKKyAgICAgICAgeF9vZmYwID49IHBpY193aWR0aCAtIGJsb2NrX3cgLSBRUEVMX0VYVFJBX0FGVEVSIHx8CisgICAgICAgIHlfb2ZmMCA+PSBwaWNfaGVpZ2h0IC0gYmxvY2tfaCAtIFFQRUxfRVhUUkFfQUZURVIpIHsKKyAgICAgICAgY29uc3QgaW50IGVkZ2VfZW11X3N0cmlkZSA9IEVER0VfRU1VX0JVRkZFUl9TVFJJREUgPDwgcy0+c3BzLT5waXhlbF9zaGlmdDsKKyAgICAgICAgaW50IG9mZnNldCAgICAgPSBRUEVMX0VYVFJBX0JFRk9SRSAqIHNyYzBzdHJpZGUgICAgICAgKyAoUVBFTF9FWFRSQV9CRUZPUkUgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCk7CisgICAgICAgIGludCBidWZfb2Zmc2V0ID0gUVBFTF9FWFRSQV9CRUZPUkUgKiBlZGdlX2VtdV9zdHJpZGUgKyAoUVBFTF9FWFRSQV9CRUZPUkUgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCk7CisKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGxjLT5lZGdlX2VtdV9idWZmZXIsIHNyYzAgLSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlX2VtdV9zdHJpZGUsIHNyYzBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja193ICsgUVBFTF9FWFRSQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2ggKyBRUEVMX0VYVFJBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9vZmYwIC0gUVBFTF9FWFRSQV9CRUZPUkUsIHlfb2ZmMCAtIFFQRUxfRVhUUkFfQkVGT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljX3dpZHRoLCBwaWNfaGVpZ2h0KTsKKyAgICAgICAgc3JjMCA9IGxjLT5lZGdlX2VtdV9idWZmZXIgKyBidWZfb2Zmc2V0OworICAgICAgICBzcmMwc3RyaWRlID0gZWRnZV9lbXVfc3RyaWRlOworICAgIH0KKworICAgIGlmICh4X29mZjEgPCBRUEVMX0VYVFJBX0JFRk9SRSB8fCB5X29mZjEgPCBRUEVMX0VYVFJBX0FGVEVSIHx8CisgICAgICAgIHhfb2ZmMSA+PSBwaWNfd2lkdGggLSBibG9ja193IC0gUVBFTF9FWFRSQV9BRlRFUiB8fAorICAgICAgICB5X29mZjEgPj0gcGljX2hlaWdodCAtIGJsb2NrX2ggLSBRUEVMX0VYVFJBX0FGVEVSKSB7CisgICAgICAgIGNvbnN0IGludCBlZGdlX2VtdV9zdHJpZGUgPSBFREdFX0VNVV9CVUZGRVJfU1RSSURFIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQ7CisgICAgICAgIGludCBvZmZzZXQgICAgID0gUVBFTF9FWFRSQV9CRUZPUkUgKiBzcmMxc3RyaWRlICAgICAgICsgKFFQRUxfRVhUUkFfQkVGT1JFIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpOworICAgICAgICBpbnQgYnVmX29mZnNldCA9IFFQRUxfRVhUUkFfQkVGT1JFICogZWRnZV9lbXVfc3RyaWRlICsgKFFQRUxfRVhUUkFfQkVGT1JFIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpOworCisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhsYy0+ZWRnZV9lbXVfYnVmZmVyMiwgc3JjMSAtIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VfZW11X3N0cmlkZSwgc3JjMXN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3cgKyBRUEVMX0VYVFJBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaCArIFFQRUxfRVhUUkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X29mZjEgLSBRUEVMX0VYVFJBX0JFRk9SRSwgeV9vZmYxIC0gUVBFTF9FWFRSQV9CRUZPUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOworICAgICAgICBzcmMxID0gbGMtPmVkZ2VfZW11X2J1ZmZlcjIgKyBidWZfb2Zmc2V0OworICAgICAgICBzcmMxc3RyaWRlID0gZWRnZV9lbXVfc3RyaWRlOworICAgIH0KKworICAgIHMtPmhldmNkc3AucHV0X2hldmNfcXBlbFtpZHhdWyEhbXkwXVshIW14MF0obGMtPnRtcCwgc3JjMCwgc3JjMHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2gsIG14MCwgbXkwLCBibG9ja193KTsKKyAgICBpZiAoIXdlaWdodF9mbGFnKQorICAgICAgICBzLT5oZXZjZHNwLnB1dF9oZXZjX3FwZWxfYmlbaWR4XVshIW15MV1bISFteDFdKGRzdCwgZHN0c3RyaWRlLCBzcmMxLCBzcmMxc3RyaWRlLCBsYy0+dG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2gsIG14MSwgbXkxLCBibG9ja193KTsKKyAgICBlbHNlCisgICAgICAgIHMtPmhldmNkc3AucHV0X2hldmNfcXBlbF9iaV93W2lkeF1bISFteTFdWyEhbXgxXShkc3QsIGRzdHN0cmlkZSwgc3JjMSwgc3JjMXN0cmlkZSwgbGMtPnRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2gsIHMtPnNoLmx1bWFfbG9nMl93ZWlnaHRfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5sdW1hX3dlaWdodF9sMFtjdXJyZW50X212LT5yZWZfaWR4WzBdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfd2VpZ2h0X2wxW2N1cnJlbnRfbXYtPnJlZl9pZHhbMV1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2gubHVtYV9vZmZzZXRfbDBbY3VycmVudF9tdi0+cmVmX2lkeFswXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5sdW1hX29mZnNldF9sMVtjdXJyZW50X212LT5yZWZfaWR4WzFdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14MSwgbXkxLCBibG9ja193KTsKKworfQorCisvKioKKyAqIDguNS4zLjIuMi4yIENocm9tYSBzYW1wbGUgdW5pcHJlZGljdGlvbiBpbnRlcnBvbGF0aW9uIHByb2Nlc3MKKyAqCisgKiBAcGFyYW0gcyBIRVZDIGRlY29kaW5nIGNvbnRleHQKKyAqIEBwYXJhbSBkc3QxIHRhcmdldCBidWZmZXIgZm9yIGJsb2NrIGRhdGEgYXQgYmxvY2sgcG9zaXRpb24gKFUgcGxhbmUpCisgKiBAcGFyYW0gZHN0MiB0YXJnZXQgYnVmZmVyIGZvciBibG9jayBkYXRhIGF0IGJsb2NrIHBvc2l0aW9uIChWIHBsYW5lKQorICogQHBhcmFtIGRzdHN0cmlkZSBzdHJpZGUgb2YgdGhlIGRzdDEgYW5kIGRzdDIgYnVmZmVycworICogQHBhcmFtIHJlZiByZWZlcmVuY2UgcGljdHVyZSBidWZmZXIgYXQgb3JpZ2luICgwLCAwKQorICogQHBhcmFtIG12IG1vdGlvbiB2ZWN0b3IgKHJlbGF0aXZlIHRvIGJsb2NrIHBvc2l0aW9uKSB0byBnZXQgcGl4ZWwgZGF0YSBmcm9tCisgKiBAcGFyYW0geF9vZmYgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiBibG9jayBmcm9tIG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSB5X29mZiB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBibG9jayBmcm9tIG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSBibG9ja193IHdpZHRoIG9mIGJsb2NrCisgKiBAcGFyYW0gYmxvY2tfaCBoZWlnaHQgb2YgYmxvY2sKKyAqIEBwYXJhbSBjaHJvbWFfd2VpZ2h0IHdlaWdodGluZyBmYWN0b3IgYXBwbGllZCB0byB0aGUgY2hyb21hIHByZWRpY3Rpb24KKyAqIEBwYXJhbSBjaHJvbWFfb2Zmc2V0IGFkZGl0aXZlIG9mZnNldCBhcHBsaWVkIHRvIHRoZSBjaHJvbWEgcHJlZGljdGlvbiB2YWx1ZQorICovCisKK3N0YXRpYyB2b2lkIGNocm9tYV9tY191bmkoSEVWQ0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYzAsIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCByZWZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9vZmYsIGludCB5X29mZiwgaW50IGJsb2NrX3csIGludCBibG9ja19oLCBzdHJ1Y3QgTXZGaWVsZCAqY3VycmVudF9tdiwgaW50IGNocm9tYV93ZWlnaHQsIGludCBjaHJvbWFfb2Zmc2V0KQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIGludCBwaWNfd2lkdGggICAgICAgID0gcy0+c3BzLT53aWR0aCA+PiBzLT5zcHMtPmhzaGlmdFsxXTsKKyAgICBpbnQgcGljX2hlaWdodCAgICAgICA9IHMtPnNwcy0+aGVpZ2h0ID4+IHMtPnNwcy0+dnNoaWZ0WzFdOworICAgIGNvbnN0IE12ICptdiAgICAgICAgID0gJmN1cnJlbnRfbXYtPm12W3JlZmxpc3RdOworICAgIGludCB3ZWlnaHRfZmxhZyAgICAgID0gKHMtPnNoLnNsaWNlX3R5cGUgPT0gUF9TTElDRSAmJiBzLT5wcHMtPndlaWdodGVkX3ByZWRfZmxhZykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zaC5zbGljZV90eXBlID09IEJfU0xJQ0UgJiYgcy0+cHBzLT53ZWlnaHRlZF9iaXByZWRfZmxhZyk7CisgICAgaW50IGlkeCAgICAgICAgICAgICAgPSBmZl9oZXZjX3BlbF93ZWlnaHRbYmxvY2tfd107CisgICAgaW50IGhzaGlmdCAgICAgICAgICAgPSBzLT5zcHMtPmhzaGlmdFsxXTsKKyAgICBpbnQgdnNoaWZ0ICAgICAgICAgICA9IHMtPnNwcy0+dnNoaWZ0WzFdOworICAgIGludHB0cl90IG14ICAgICAgICAgID0gbXYtPnggJiAoKDEgPDwgKDIgKyBoc2hpZnQpKSAtIDEpOworICAgIGludHB0cl90IG15ICAgICAgICAgID0gbXYtPnkgJiAoKDEgPDwgKDIgKyB2c2hpZnQpKSAtIDEpOworICAgIGludHB0cl90IF9teCAgICAgICAgID0gbXggPDwgKDEgLSBoc2hpZnQpOworICAgIGludHB0cl90IF9teSAgICAgICAgID0gbXkgPDwgKDEgLSB2c2hpZnQpOworCisgICAgeF9vZmYgKz0gbXYtPnggPj4gKDIgKyBoc2hpZnQpOworICAgIHlfb2ZmICs9IG12LT55ID4+ICgyICsgdnNoaWZ0KTsKKyAgICBzcmMwICArPSB5X29mZiAqIHNyY3N0cmlkZSArICh4X29mZiA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KTsKKworICAgIGlmICh4X29mZiA8IEVQRUxfRVhUUkFfQkVGT1JFIHx8IHlfb2ZmIDwgRVBFTF9FWFRSQV9BRlRFUiB8fAorICAgICAgICB4X29mZiA+PSBwaWNfd2lkdGggLSBibG9ja193IC0gRVBFTF9FWFRSQV9BRlRFUiB8fAorICAgICAgICB5X29mZiA+PSBwaWNfaGVpZ2h0IC0gYmxvY2tfaCAtIEVQRUxfRVhUUkFfQUZURVIpIHsKKyAgICAgICAgY29uc3QgaW50IGVkZ2VfZW11X3N0cmlkZSA9IEVER0VfRU1VX0JVRkZFUl9TVFJJREUgPDwgcy0+c3BzLT5waXhlbF9zaGlmdDsKKyAgICAgICAgaW50IG9mZnNldDAgPSBFUEVMX0VYVFJBX0JFRk9SRSAqIChzcmNzdHJpZGUgKyAoMSA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KSk7CisgICAgICAgIGludCBidWZfb2Zmc2V0MCA9IEVQRUxfRVhUUkFfQkVGT1JFICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGVkZ2VfZW11X3N0cmlkZSArICgxIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpKTsKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGxjLT5lZGdlX2VtdV9idWZmZXIsIHNyYzAgLSBvZmZzZXQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZV9lbXVfc3RyaWRlLCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja193ICsgRVBFTF9FWFRSQSwgYmxvY2tfaCArIEVQRUxfRVhUUkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X29mZiAtIEVQRUxfRVhUUkFfQkVGT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9vZmYgLSBFUEVMX0VYVFJBX0JFRk9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisKKyAgICAgICAgc3JjMCA9IGxjLT5lZGdlX2VtdV9idWZmZXIgKyBidWZfb2Zmc2V0MDsKKyAgICAgICAgc3Jjc3RyaWRlID0gZWRnZV9lbXVfc3RyaWRlOworICAgIH0KKyAgICBpZiAoIXdlaWdodF9mbGFnKQorICAgICAgICBzLT5oZXZjZHNwLnB1dF9oZXZjX2VwZWxfdW5pW2lkeF1bISFteV1bISFteF0oZHN0MCwgZHN0c3RyaWRlLCBzcmMwLCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2gsIF9teCwgX215LCBibG9ja193KTsKKyAgICBlbHNlCisgICAgICAgIHMtPmhldmNkc3AucHV0X2hldmNfZXBlbF91bmlfd1tpZHhdWyEhbXldWyEhbXhdKGRzdDAsIGRzdHN0cmlkZSwgc3JjMCwgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHQsIGNocm9tYV9vZmZzZXQsIF9teCwgX215LCBibG9ja193KTsKK30KKworLyoqCisgKiA4LjUuMy4yLjIuMiBDaHJvbWEgc2FtcGxlIGJpZGlyZWN0aW9uYWwgaW50ZXJwb2xhdGlvbiBwcm9jZXNzCisgKgorICogQHBhcmFtIHMgSEVWQyBkZWNvZGluZyBjb250ZXh0CisgKiBAcGFyYW0gZHN0IHRhcmdldCBidWZmZXIgZm9yIGJsb2NrIGRhdGEgYXQgYmxvY2sgcG9zaXRpb24KKyAqIEBwYXJhbSBkc3RzdHJpZGUgc3RyaWRlIG9mIHRoZSBkc3QgYnVmZmVyCisgKiBAcGFyYW0gcmVmMCByZWZlcmVuY2UgcGljdHVyZTAgYnVmZmVyIGF0IG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSBtdjAgbW90aW9uIHZlY3RvcjAgKHJlbGF0aXZlIHRvIGJsb2NrIHBvc2l0aW9uKSB0byBnZXQgcGl4ZWwgZGF0YSBmcm9tCisgKiBAcGFyYW0geF9vZmYgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiBibG9jayBmcm9tIG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSB5X29mZiB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBibG9jayBmcm9tIG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSBibG9ja193IHdpZHRoIG9mIGJsb2NrCisgKiBAcGFyYW0gYmxvY2tfaCBoZWlnaHQgb2YgYmxvY2sKKyAqIEBwYXJhbSByZWYxIHJlZmVyZW5jZSBwaWN0dXJlMSBidWZmZXIgYXQgb3JpZ2luICgwLCAwKQorICogQHBhcmFtIG12MSBtb3Rpb24gdmVjdG9yMSAocmVsYXRpdmUgdG8gYmxvY2sgcG9zaXRpb24pIHRvIGdldCBwaXhlbCBkYXRhIGZyb20KKyAqIEBwYXJhbSBjdXJyZW50X212IGN1cnJlbnQgbW90aW9uIHZlY3RvciBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBjaWR4IGNocm9tYSBjb21wb25lbnQoY2IsIGNyKQorICovCitzdGF0aWMgdm9pZCBjaHJvbWFfbWNfYmkoSEVWQ0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdDAsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIEFWRnJhbWUgKnJlZjAsIEFWRnJhbWUgKnJlZjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfb2ZmLCBpbnQgeV9vZmYsIGludCBibG9ja193LCBpbnQgYmxvY2tfaCwgc3RydWN0IE12RmllbGQgKmN1cnJlbnRfbXYsIGludCBjaWR4KQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIHVpbnQ4X3QgKnNyYzEgICAgICAgID0gcmVmMC0+ZGF0YVtjaWR4KzFdOworICAgIHVpbnQ4X3QgKnNyYzIgICAgICAgID0gcmVmMS0+ZGF0YVtjaWR4KzFdOworICAgIHB0cmRpZmZfdCBzcmMxc3RyaWRlID0gcmVmMC0+bGluZXNpemVbY2lkeCsxXTsKKyAgICBwdHJkaWZmX3Qgc3JjMnN0cmlkZSA9IHJlZjEtPmxpbmVzaXplW2NpZHgrMV07CisgICAgaW50IHdlaWdodF9mbGFnICAgICAgPSAocy0+c2guc2xpY2VfdHlwZSA9PSBQX1NMSUNFICYmIHMtPnBwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnNoLnNsaWNlX3R5cGUgPT0gQl9TTElDRSAmJiBzLT5wcHMtPndlaWdodGVkX2JpcHJlZF9mbGFnKTsKKyAgICBpbnQgcGljX3dpZHRoICAgICAgICA9IHMtPnNwcy0+d2lkdGggPj4gcy0+c3BzLT5oc2hpZnRbMV07CisgICAgaW50IHBpY19oZWlnaHQgICAgICAgPSBzLT5zcHMtPmhlaWdodCA+PiBzLT5zcHMtPnZzaGlmdFsxXTsKKyAgICBNdiAqbXYwICAgICAgICAgICAgICA9ICZjdXJyZW50X212LT5tdlswXTsKKyAgICBNdiAqbXYxICAgICAgICAgICAgICA9ICZjdXJyZW50X212LT5tdlsxXTsKKyAgICBpbnQgaHNoaWZ0ID0gcy0+c3BzLT5oc2hpZnRbMV07CisgICAgaW50IHZzaGlmdCA9IHMtPnNwcy0+dnNoaWZ0WzFdOworCisgICAgaW50cHRyX3QgbXgwID0gbXYwLT54ICYgKCgxIDw8ICgyICsgaHNoaWZ0KSkgLSAxKTsKKyAgICBpbnRwdHJfdCBteTAgPSBtdjAtPnkgJiAoKDEgPDwgKDIgKyB2c2hpZnQpKSAtIDEpOworICAgIGludHB0cl90IG14MSA9IG12MS0+eCAmICgoMSA8PCAoMiArIGhzaGlmdCkpIC0gMSk7CisgICAgaW50cHRyX3QgbXkxID0gbXYxLT55ICYgKCgxIDw8ICgyICsgdnNoaWZ0KSkgLSAxKTsKKyAgICBpbnRwdHJfdCBfbXgwID0gbXgwIDw8ICgxIC0gaHNoaWZ0KTsKKyAgICBpbnRwdHJfdCBfbXkwID0gbXkwIDw8ICgxIC0gdnNoaWZ0KTsKKyAgICBpbnRwdHJfdCBfbXgxID0gbXgxIDw8ICgxIC0gaHNoaWZ0KTsKKyAgICBpbnRwdHJfdCBfbXkxID0gbXkxIDw8ICgxIC0gdnNoaWZ0KTsKKworICAgIGludCB4X29mZjAgPSB4X29mZiArIChtdjAtPnggPj4gKDIgKyBoc2hpZnQpKTsKKyAgICBpbnQgeV9vZmYwID0geV9vZmYgKyAobXYwLT55ID4+ICgyICsgdnNoaWZ0KSk7CisgICAgaW50IHhfb2ZmMSA9IHhfb2ZmICsgKG12MS0+eCA+PiAoMiArIGhzaGlmdCkpOworICAgIGludCB5X29mZjEgPSB5X29mZiArIChtdjEtPnkgPj4gKDIgKyB2c2hpZnQpKTsKKyAgICBpbnQgaWR4ID0gZmZfaGV2Y19wZWxfd2VpZ2h0W2Jsb2NrX3ddOworICAgIHNyYzEgICs9IHlfb2ZmMCAqIHNyYzFzdHJpZGUgKyAoaW50KSgodW5zaWduZWQpeF9vZmYwIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpOworICAgIHNyYzIgICs9IHlfb2ZmMSAqIHNyYzJzdHJpZGUgKyAoaW50KSgodW5zaWduZWQpeF9vZmYxIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpOworCisgICAgaWYgKHhfb2ZmMCA8IEVQRUxfRVhUUkFfQkVGT1JFIHx8IHlfb2ZmMCA8IEVQRUxfRVhUUkFfQUZURVIgfHwKKyAgICAgICAgeF9vZmYwID49IHBpY193aWR0aCAtIGJsb2NrX3cgLSBFUEVMX0VYVFJBX0FGVEVSIHx8CisgICAgICAgIHlfb2ZmMCA+PSBwaWNfaGVpZ2h0IC0gYmxvY2tfaCAtIEVQRUxfRVhUUkFfQUZURVIpIHsKKyAgICAgICAgY29uc3QgaW50IGVkZ2VfZW11X3N0cmlkZSA9IEVER0VfRU1VX0JVRkZFUl9TVFJJREUgPDwgcy0+c3BzLT5waXhlbF9zaGlmdDsKKyAgICAgICAgaW50IG9mZnNldDEgPSBFUEVMX0VYVFJBX0JFRk9SRSAqIChzcmMxc3RyaWRlICsgKDEgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCkpOworICAgICAgICBpbnQgYnVmX29mZnNldDEgPSBFUEVMX0VYVFJBX0JFRk9SRSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIChlZGdlX2VtdV9zdHJpZGUgKyAoMSA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KSk7CisKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGxjLT5lZGdlX2VtdV9idWZmZXIsIHNyYzEgLSBvZmZzZXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZV9lbXVfc3RyaWRlLCBzcmMxc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfdyArIEVQRUxfRVhUUkEsIGJsb2NrX2ggKyBFUEVMX0VYVFJBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9vZmYwIC0gRVBFTF9FWFRSQV9CRUZPUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X29mZjAgLSBFUEVMX0VYVFJBX0JFRk9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisKKyAgICAgICAgc3JjMSA9IGxjLT5lZGdlX2VtdV9idWZmZXIgKyBidWZfb2Zmc2V0MTsKKyAgICAgICAgc3JjMXN0cmlkZSA9IGVkZ2VfZW11X3N0cmlkZTsKKyAgICB9CisKKyAgICBpZiAoeF9vZmYxIDwgRVBFTF9FWFRSQV9CRUZPUkUgfHwgeV9vZmYxIDwgRVBFTF9FWFRSQV9BRlRFUiB8fAorICAgICAgICB4X29mZjEgPj0gcGljX3dpZHRoIC0gYmxvY2tfdyAtIEVQRUxfRVhUUkFfQUZURVIgfHwKKyAgICAgICAgeV9vZmYxID49IHBpY19oZWlnaHQgLSBibG9ja19oIC0gRVBFTF9FWFRSQV9BRlRFUikgeworICAgICAgICBjb25zdCBpbnQgZWRnZV9lbXVfc3RyaWRlID0gRURHRV9FTVVfQlVGRkVSX1NUUklERSA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0OworICAgICAgICBpbnQgb2Zmc2V0MSA9IEVQRUxfRVhUUkFfQkVGT1JFICogKHNyYzJzdHJpZGUgKyAoMSA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KSk7CisgICAgICAgIGludCBidWZfb2Zmc2V0MSA9IEVQRUxfRVhUUkFfQkVGT1JFICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGVkZ2VfZW11X3N0cmlkZSArICgxIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpKTsKKworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMobGMtPmVkZ2VfZW11X2J1ZmZlcjIsIHNyYzIgLSBvZmZzZXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZV9lbXVfc3RyaWRlLCBzcmMyc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfdyArIEVQRUxfRVhUUkEsIGJsb2NrX2ggKyBFUEVMX0VYVFJBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9vZmYxIC0gRVBFTF9FWFRSQV9CRUZPUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X29mZjEgLSBFUEVMX0VYVFJBX0JFRk9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisKKyAgICAgICAgc3JjMiA9IGxjLT5lZGdlX2VtdV9idWZmZXIyICsgYnVmX29mZnNldDE7CisgICAgICAgIHNyYzJzdHJpZGUgPSBlZGdlX2VtdV9zdHJpZGU7CisgICAgfQorCisgICAgcy0+aGV2Y2RzcC5wdXRfaGV2Y19lcGVsW2lkeF1bISFteTBdWyEhbXgwXShsYy0+dG1wLCBzcmMxLCBzcmMxc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaCwgX214MCwgX215MCwgYmxvY2tfdyk7CisgICAgaWYgKCF3ZWlnaHRfZmxhZykKKyAgICAgICAgcy0+aGV2Y2RzcC5wdXRfaGV2Y19lcGVsX2JpW2lkeF1bISFteTFdWyEhbXgxXShkc3QwLCBzLT5mcmFtZS0+bGluZXNpemVbY2lkeCsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBzcmMyc3RyaWRlLCBsYy0+dG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2gsIF9teDEsIF9teTEsIGJsb2NrX3cpOworICAgIGVsc2UKKyAgICAgICAgcy0+aGV2Y2RzcC5wdXRfaGV2Y19lcGVsX2JpX3dbaWR4XVshIW15MV1bISFteDFdKGRzdDAsIHMtPmZyYW1lLT5saW5lc2l6ZVtjaWR4KzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgc3JjMnN0cmlkZSwgbGMtPnRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wwW2N1cnJlbnRfbXYtPnJlZl9pZHhbMF1dW2NpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX3dlaWdodF9sMVtjdXJyZW50X212LT5yZWZfaWR4WzFdXVtjaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV9vZmZzZXRfbDBbY3VycmVudF9tdi0+cmVmX2lkeFswXV1bY2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfb2Zmc2V0X2wxW2N1cnJlbnRfbXYtPnJlZl9pZHhbMV1dW2NpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX214MSwgX215MSwgYmxvY2tfdyk7Cit9CisKK3N0YXRpYyB2b2lkIGhldmNfYXdhaXRfcHJvZ3Jlc3MoSEVWQ0NvbnRleHQgKnMsIEhFVkNGcmFtZSAqcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdiAqbXYsIGludCB5MCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgeSA9IEZGTUFYKDAsIChtdi0+eSA+PiAyKSArIHkwICsgaGVpZ2h0ICsgOSk7CisKKyAgICBpZiAocy0+dGhyZWFkc190eXBlID09IEZGX1RIUkVBRF9GUkFNRSApCisgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcmVmLT50ZiwgeSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhldmNfbHVtYV9tdl9tcHZfbW9kZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBuUGJXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGJILCBpbnQgbG9nMl9jYl9zaXplLCBpbnQgcGFydF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lcmdlX2lkeCwgTXZGaWVsZCAqbXYpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgZW51bSBJbnRlclByZWRJZGMgaW50ZXJfcHJlZF9pZGMgPSBQUkVEX0wwOworICAgIGludCBtdnBfZmxhZzsKKworICAgIGZmX2hldmNfc2V0X25laWdoYm91cl9hdmFpbGFibGUocywgeDAsIHkwLCBuUGJXLCBuUGJIKTsKKyAgICBtdi0+cHJlZF9mbGFnID0gMDsKKyAgICBpZiAocy0+c2guc2xpY2VfdHlwZSA9PSBCX1NMSUNFKQorICAgICAgICBpbnRlcl9wcmVkX2lkYyA9IGZmX2hldmNfaW50ZXJfcHJlZF9pZGNfZGVjb2RlKHMsIG5QYlcsIG5QYkgpOworCisgICAgaWYgKGludGVyX3ByZWRfaWRjICE9IFBSRURfTDEpIHsKKyAgICAgICAgaWYgKHMtPnNoLm5iX3JlZnNbTDBdKQorICAgICAgICAgICAgbXYtPnJlZl9pZHhbMF09IGZmX2hldmNfcmVmX2lkeF9seF9kZWNvZGUocywgcy0+c2gubmJfcmVmc1tMMF0pOworCisgICAgICAgIG12LT5wcmVkX2ZsYWcgPSBQRl9MMDsKKyAgICAgICAgZmZfaGV2Y19obHNfbXZkX2NvZGluZyhzLCB4MCwgeTAsIDApOworICAgICAgICBtdnBfZmxhZyA9IGZmX2hldmNfbXZwX2x4X2ZsYWdfZGVjb2RlKHMpOworICAgICAgICBmZl9oZXZjX2x1bWFfbXZfbXZwX21vZGUocywgeDAsIHkwLCBuUGJXLCBuUGJILCBsb2cyX2NiX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0X2lkeCwgbWVyZ2VfaWR4LCBtdiwgbXZwX2ZsYWcsIDApOworICAgICAgICBtdi0+bXZbMF0ueCArPSBsYy0+cHUubXZkLng7CisgICAgICAgIG12LT5tdlswXS55ICs9IGxjLT5wdS5tdmQueTsKKyAgICB9CisKKyAgICBpZiAoaW50ZXJfcHJlZF9pZGMgIT0gUFJFRF9MMCkgeworICAgICAgICBpZiAocy0+c2gubmJfcmVmc1tMMV0pCisgICAgICAgICAgICBtdi0+cmVmX2lkeFsxXT0gZmZfaGV2Y19yZWZfaWR4X2x4X2RlY29kZShzLCBzLT5zaC5uYl9yZWZzW0wxXSk7CisKKyAgICAgICAgaWYgKHMtPnNoLm12ZF9sMV96ZXJvX2ZsYWcgPT0gMSAmJiBpbnRlcl9wcmVkX2lkYyA9PSBQUkVEX0JJKSB7CisgICAgICAgICAgICBBVl9aRVJPMzIoJmxjLT5wdS5tdmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmZfaGV2Y19obHNfbXZkX2NvZGluZyhzLCB4MCwgeTAsIDEpOworICAgICAgICB9CisKKyAgICAgICAgbXYtPnByZWRfZmxhZyArPSBQRl9MMTsKKyAgICAgICAgbXZwX2ZsYWcgPSBmZl9oZXZjX212cF9seF9mbGFnX2RlY29kZShzKTsKKyAgICAgICAgZmZfaGV2Y19sdW1hX212X212cF9tb2RlKHMsIHgwLCB5MCwgblBiVywgblBiSCwgbG9nMl9jYl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydF9pZHgsIG1lcmdlX2lkeCwgbXYsIG12cF9mbGFnLCAxKTsKKyAgICAgICAgbXYtPm12WzFdLnggKz0gbGMtPnB1Lm12ZC54OworICAgICAgICBtdi0+bXZbMV0ueSArPSBsYy0+cHUubXZkLnk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBobHNfcHJlZGljdGlvbl91bml0KEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYlcsIGludCBuUGJILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplLCBpbnQgcGFydElkeCwgaW50IGlkeCkKK3sKKyNkZWZpbmUgUE9TKGNfaWR4LCB4LCB5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICZzLT5mcmFtZS0+ZGF0YVtjX2lkeF1bKCh5KSA+PiBzLT5zcHMtPnZzaGlmdFtjX2lkeF0pICogcy0+ZnJhbWUtPmxpbmVzaXplW2NfaWR4XSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IHMtPnNwcy0+aHNoaWZ0W2NfaWR4XSkgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCldCisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgaW50IG1lcmdlX2lkeCA9IDA7CisgICAgc3RydWN0IE12RmllbGQgY3VycmVudF9tdiA9IHt7eyAwIH19fTsKKworICAgIGludCBtaW5fcHVfd2lkdGggPSBzLT5zcHMtPm1pbl9wdV93aWR0aDsKKworICAgIE12RmllbGQgKnRhYl9tdmYgPSBzLT5yZWYtPnRhYl9tdmY7CisgICAgUmVmUGljTGlzdCAgKnJlZlBpY0xpc3QgPSBzLT5yZWYtPnJlZlBpY0xpc3Q7CisgICAgSEVWQ0ZyYW1lICpyZWYwLCAqcmVmMTsKKyAgICB1aW50OF90ICpkc3QwID0gUE9TKDAsIHgwLCB5MCk7CisgICAgdWludDhfdCAqZHN0MSA9IFBPUygxLCB4MCwgeTApOworICAgIHVpbnQ4X3QgKmRzdDIgPSBQT1MoMiwgeDAsIHkwKTsKKyAgICBpbnQgbG9nMl9taW5fY2Jfc2l6ZSA9IHMtPnNwcy0+bG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBpbnQgbWluX2NiX3dpZHRoICAgICA9IHMtPnNwcy0+bWluX2NiX3dpZHRoOworICAgIGludCB4X2NiICAgICAgICAgICAgID0geDAgPj4gbG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBpbnQgeV9jYiAgICAgICAgICAgICA9IHkwID4+IGxvZzJfbWluX2NiX3NpemU7CisgICAgaW50IHhfcHUsIHlfcHU7CisgICAgaW50IGksIGo7CisKKyAgICBpbnQgc2tpcF9mbGFnID0gU0FNUExFX0NUQihzLT5za2lwX2ZsYWcsIHhfY2IsIHlfY2IpOworCisgICAgaWYgKCFza2lwX2ZsYWcpCisgICAgICAgIGxjLT5wdS5tZXJnZV9mbGFnID0gZmZfaGV2Y19tZXJnZV9mbGFnX2RlY29kZShzKTsKKworICAgIGlmIChza2lwX2ZsYWcgfHwgbGMtPnB1Lm1lcmdlX2ZsYWcpIHsKKyAgICAgICAgaWYgKHMtPnNoLm1heF9udW1fbWVyZ2VfY2FuZCA+IDEpCisgICAgICAgICAgICBtZXJnZV9pZHggPSBmZl9oZXZjX21lcmdlX2lkeF9kZWNvZGUocyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1lcmdlX2lkeCA9IDA7CisKKyAgICAgICAgZmZfaGV2Y19sdW1hX212X21lcmdlX21vZGUocywgeDAsIHkwLCBuUGJXLCBuUGJILCBsb2cyX2NiX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRJZHgsIG1lcmdlX2lkeCwgJmN1cnJlbnRfbXYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGhldmNfbHVtYV9tdl9tcHZfbW9kZShzLCB4MCwgeTAsIG5QYlcsIG5QYkgsIGxvZzJfY2Jfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRJZHgsIG1lcmdlX2lkeCwgJmN1cnJlbnRfbXYpOworICAgIH0KKworICAgIHhfcHUgPSB4MCA+PiBzLT5zcHMtPmxvZzJfbWluX3B1X3NpemU7CisgICAgeV9wdSA9IHkwID4+IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKKworICAgIGZvciAoaiA9IDA7IGogPCBuUGJIID4+IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsgaisrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgblBiVyA+PiBzLT5zcHMtPmxvZzJfbWluX3B1X3NpemU7IGkrKykKKyAgICAgICAgICAgIHRhYl9tdmZbKHlfcHUgKyBqKSAqIG1pbl9wdV93aWR0aCArIHhfcHUgKyBpXSA9IGN1cnJlbnRfbXY7CisKKyAgICBpZiAoY3VycmVudF9tdi5wcmVkX2ZsYWcgJiBQRl9MMCkgeworICAgICAgICByZWYwID0gcmVmUGljTGlzdFswXS5yZWZbY3VycmVudF9tdi5yZWZfaWR4WzBdXTsKKyAgICAgICAgaWYgKCFyZWYwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBoZXZjX2F3YWl0X3Byb2dyZXNzKHMsIHJlZjAsICZjdXJyZW50X212Lm12WzBdLCB5MCwgblBiSCk7CisgICAgfQorICAgIGlmIChjdXJyZW50X212LnByZWRfZmxhZyAmIFBGX0wxKSB7CisgICAgICAgIHJlZjEgPSByZWZQaWNMaXN0WzFdLnJlZltjdXJyZW50X212LnJlZl9pZHhbMV1dOworICAgICAgICBpZiAoIXJlZjEpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGhldmNfYXdhaXRfcHJvZ3Jlc3MocywgcmVmMSwgJmN1cnJlbnRfbXYubXZbMV0sIHkwLCBuUGJIKTsKKyAgICB9CisKKyAgICBpZiAoY3VycmVudF9tdi5wcmVkX2ZsYWcgPT0gUEZfTDApIHsKKyAgICAgICAgaW50IHgwX2MgPSB4MCA+PiBzLT5zcHMtPmhzaGlmdFsxXTsKKyAgICAgICAgaW50IHkwX2MgPSB5MCA+PiBzLT5zcHMtPnZzaGlmdFsxXTsKKyAgICAgICAgaW50IG5QYldfYyA9IG5QYlcgPj4gcy0+c3BzLT5oc2hpZnRbMV07CisgICAgICAgIGludCBuUGJIX2MgPSBuUGJIID4+IHMtPnNwcy0+dnNoaWZ0WzFdOworCisgICAgICAgIGx1bWFfbWNfdW5pKHMsIGRzdDAsIHMtPmZyYW1lLT5saW5lc2l6ZVswXSwgcmVmMC0+ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICZjdXJyZW50X212Lm12WzBdLCB4MCwgeTAsIG5QYlcsIG5QYkgsCisgICAgICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfd2VpZ2h0X2wwW2N1cnJlbnRfbXYucmVmX2lkeFswXV0sCisgICAgICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfb2Zmc2V0X2wwW2N1cnJlbnRfbXYucmVmX2lkeFswXV0pOworCisgICAgICAgIGNocm9tYV9tY191bmkocywgZHN0MSwgcy0+ZnJhbWUtPmxpbmVzaXplWzFdLCByZWYwLT5mcmFtZS0+ZGF0YVsxXSwgcmVmMC0+ZnJhbWUtPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgIDAsIHgwX2MsIHkwX2MsIG5QYldfYywgblBiSF9jLCAmY3VycmVudF9tdiwKKyAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wwW2N1cnJlbnRfbXYucmVmX2lkeFswXV1bMF0sIHMtPnNoLmNocm9tYV9vZmZzZXRfbDBbY3VycmVudF9tdi5yZWZfaWR4WzBdXVswXSk7CisgICAgICAgIGNocm9tYV9tY191bmkocywgZHN0Miwgcy0+ZnJhbWUtPmxpbmVzaXplWzJdLCByZWYwLT5mcmFtZS0+ZGF0YVsyXSwgcmVmMC0+ZnJhbWUtPmxpbmVzaXplWzJdLAorICAgICAgICAgICAgICAgICAgICAgIDAsIHgwX2MsIHkwX2MsIG5QYldfYywgblBiSF9jLCAmY3VycmVudF9tdiwKKyAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wwW2N1cnJlbnRfbXYucmVmX2lkeFswXV1bMV0sIHMtPnNoLmNocm9tYV9vZmZzZXRfbDBbY3VycmVudF9tdi5yZWZfaWR4WzBdXVsxXSk7CisgICAgfSBlbHNlIGlmIChjdXJyZW50X212LnByZWRfZmxhZyA9PSBQRl9MMSkgeworICAgICAgICBpbnQgeDBfYyA9IHgwID4+IHMtPnNwcy0+aHNoaWZ0WzFdOworICAgICAgICBpbnQgeTBfYyA9IHkwID4+IHMtPnNwcy0+dnNoaWZ0WzFdOworICAgICAgICBpbnQgblBiV19jID0gblBiVyA+PiBzLT5zcHMtPmhzaGlmdFsxXTsKKyAgICAgICAgaW50IG5QYkhfYyA9IG5QYkggPj4gcy0+c3BzLT52c2hpZnRbMV07CisKKyAgICAgICAgbHVtYV9tY191bmkocywgZHN0MCwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdLCByZWYxLT5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnRfbXYubXZbMV0sIHgwLCB5MCwgblBiVywgblBiSCwKKyAgICAgICAgICAgICAgICAgICAgcy0+c2gubHVtYV93ZWlnaHRfbDFbY3VycmVudF9tdi5yZWZfaWR4WzFdXSwKKyAgICAgICAgICAgICAgICAgICAgcy0+c2gubHVtYV9vZmZzZXRfbDFbY3VycmVudF9tdi5yZWZfaWR4WzFdXSk7CisKKyAgICAgICAgY2hyb21hX21jX3VuaShzLCBkc3QxLCBzLT5mcmFtZS0+bGluZXNpemVbMV0sIHJlZjEtPmZyYW1lLT5kYXRhWzFdLCByZWYxLT5mcmFtZS0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgMSwgeDBfYywgeTBfYywgblBiV19jLCBuUGJIX2MsICZjdXJyZW50X212LAorICAgICAgICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV93ZWlnaHRfbDFbY3VycmVudF9tdi5yZWZfaWR4WzFdXVswXSwgcy0+c2guY2hyb21hX29mZnNldF9sMVtjdXJyZW50X212LnJlZl9pZHhbMV1dWzBdKTsKKworICAgICAgICBjaHJvbWFfbWNfdW5pKHMsIGRzdDIsIHMtPmZyYW1lLT5saW5lc2l6ZVsyXSwgcmVmMS0+ZnJhbWUtPmRhdGFbMl0sIHJlZjEtPmZyYW1lLT5saW5lc2l6ZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAxLCB4MF9jLCB5MF9jLCBuUGJXX2MsIG5QYkhfYywgJmN1cnJlbnRfbXYsCisgICAgICAgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX3dlaWdodF9sMVtjdXJyZW50X212LnJlZl9pZHhbMV1dWzFdLCBzLT5zaC5jaHJvbWFfb2Zmc2V0X2wxW2N1cnJlbnRfbXYucmVmX2lkeFsxXV1bMV0pOworICAgIH0gZWxzZSBpZiAoY3VycmVudF9tdi5wcmVkX2ZsYWcgPT0gUEZfQkkpIHsKKyAgICAgICAgaW50IHgwX2MgPSB4MCA+PiBzLT5zcHMtPmhzaGlmdFsxXTsKKyAgICAgICAgaW50IHkwX2MgPSB5MCA+PiBzLT5zcHMtPnZzaGlmdFsxXTsKKyAgICAgICAgaW50IG5QYldfYyA9IG5QYlcgPj4gcy0+c3BzLT5oc2hpZnRbMV07CisgICAgICAgIGludCBuUGJIX2MgPSBuUGJIID4+IHMtPnNwcy0+dnNoaWZ0WzFdOworCisgICAgICAgIGx1bWFfbWNfYmkocywgZHN0MCwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdLCByZWYwLT5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAmY3VycmVudF9tdi5tdlswXSwgeDAsIHkwLCBuUGJXLCBuUGJILAorICAgICAgICAgICAgICAgICAgIHJlZjEtPmZyYW1lLCAmY3VycmVudF9tdi5tdlsxXSwgJmN1cnJlbnRfbXYpOworCisgICAgICAgIGNocm9tYV9tY19iaShzLCBkc3QxLCBzLT5mcmFtZS0+bGluZXNpemVbMV0sIHJlZjAtPmZyYW1lLCByZWYxLT5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHgwX2MsIHkwX2MsIG5QYldfYywgblBiSF9jLCAmY3VycmVudF9tdiwgMCk7CisKKyAgICAgICAgY2hyb21hX21jX2JpKHMsIGRzdDIsIHMtPmZyYW1lLT5saW5lc2l6ZVsyXSwgcmVmMC0+ZnJhbWUsIHJlZjEtPmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgeDBfYywgeTBfYywgblBiV19jLCBuUGJIX2MsICZjdXJyZW50X212LCAxKTsKKyAgICB9Cit9CisKKy8qKgorICogOC40LjEKKyAqLworc3RhdGljIGludCBsdW1hX2ludHJhX3ByZWRfbW9kZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBwdV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJldl9pbnRyYV9sdW1hX3ByZWRfZmxhZykKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICBpbnQgeF9wdSAgICAgICAgICAgICA9IHgwID4+IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKKyAgICBpbnQgeV9wdSAgICAgICAgICAgICA9IHkwID4+IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKKyAgICBpbnQgbWluX3B1X3dpZHRoICAgICA9IHMtPnNwcy0+bWluX3B1X3dpZHRoOworICAgIGludCBzaXplX2luX3B1cyAgICAgID0gcHVfc2l6ZSA+PiBzLT5zcHMtPmxvZzJfbWluX3B1X3NpemU7CisgICAgaW50IHgwYiAgICAgICAgICAgICAgPSB4MCAmICgoMSA8PCBzLT5zcHMtPmxvZzJfY3RiX3NpemUpIC0gMSk7CisgICAgaW50IHkwYiAgICAgICAgICAgICAgPSB5MCAmICgoMSA8PCBzLT5zcHMtPmxvZzJfY3RiX3NpemUpIC0gMSk7CisKKyAgICBpbnQgY2FuZF91cCAgID0gKGxjLT5jdGJfdXBfZmxhZyB8fCB5MGIpID8KKyAgICAgICAgICAgICAgICAgICAgcy0+dGFiX2lwbVsoeV9wdSAtIDEpICogbWluX3B1X3dpZHRoICsgeF9wdV0gOiBJTlRSQV9EQzsKKyAgICBpbnQgY2FuZF9sZWZ0ID0gKGxjLT5jdGJfbGVmdF9mbGFnIHx8IHgwYikgPworICAgICAgICAgICAgICAgICAgICBzLT50YWJfaXBtW3lfcHUgKiBtaW5fcHVfd2lkdGggKyB4X3B1IC0gMV0gICA6IElOVFJBX0RDOworCisgICAgaW50IHlfY3RiID0gKHkwID4+IChzLT5zcHMtPmxvZzJfY3RiX3NpemUpKSA8PCAocy0+c3BzLT5sb2cyX2N0Yl9zaXplKTsKKworICAgIE12RmllbGQgKnRhYl9tdmYgPSBzLT5yZWYtPnRhYl9tdmY7CisgICAgaW50IGludHJhX3ByZWRfbW9kZTsKKyAgICBpbnQgY2FuZGlkYXRlWzNdOworICAgIGludCBpLCBqOworCisgICAgLy8gaW50cmFfcHJlZF9tb2RlIHByZWRpY3Rpb24gZG9lcyBub3QgY3Jvc3MgdmVydGljYWwgQ1RCIGJvdW5kYXJpZXMKKyAgICBpZiAoKHkwIC0gMSkgPCB5X2N0YikKKyAgICAgICAgY2FuZF91cCA9IElOVFJBX0RDOworCisgICAgaWYgKGNhbmRfbGVmdCA9PSBjYW5kX3VwKSB7CisgICAgICAgIGlmIChjYW5kX2xlZnQgPCAyKSB7CisgICAgICAgICAgICBjYW5kaWRhdGVbMF0gPSBJTlRSQV9QTEFOQVI7CisgICAgICAgICAgICBjYW5kaWRhdGVbMV0gPSBJTlRSQV9EQzsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVsyXSA9IElOVFJBX0FOR1VMQVJfMjY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYW5kaWRhdGVbMF0gPSBjYW5kX2xlZnQ7CisgICAgICAgICAgICBjYW5kaWRhdGVbMV0gPSAyICsgKChjYW5kX2xlZnQgLSAyIC0gMSArIDMyKSAmIDMxKTsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVsyXSA9IDIgKyAoKGNhbmRfbGVmdCAtIDIgKyAxKSAmIDMxKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNhbmRpZGF0ZVswXSA9IGNhbmRfbGVmdDsKKyAgICAgICAgY2FuZGlkYXRlWzFdID0gY2FuZF91cDsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZVswXSAhPSBJTlRSQV9QTEFOQVIgJiYgY2FuZGlkYXRlWzFdICE9IElOVFJBX1BMQU5BUikgeworICAgICAgICAgICAgY2FuZGlkYXRlWzJdID0gSU5UUkFfUExBTkFSOworICAgICAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZVswXSAhPSBJTlRSQV9EQyAmJiBjYW5kaWRhdGVbMV0gIT0gSU5UUkFfREMpIHsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVsyXSA9IElOVFJBX0RDOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FuZGlkYXRlWzJdID0gSU5UUkFfQU5HVUxBUl8yNjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmV2X2ludHJhX2x1bWFfcHJlZF9mbGFnKSB7CisgICAgICAgIGludHJhX3ByZWRfbW9kZSA9IGNhbmRpZGF0ZVtsYy0+cHUubXBtX2lkeF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZVswXSA+IGNhbmRpZGF0ZVsxXSkKKyAgICAgICAgICAgIEZGU1dBUCh1aW50OF90LCBjYW5kaWRhdGVbMF0sIGNhbmRpZGF0ZVsxXSk7CisgICAgICAgIGlmIChjYW5kaWRhdGVbMF0gPiBjYW5kaWRhdGVbMl0pCisgICAgICAgICAgICBGRlNXQVAodWludDhfdCwgY2FuZGlkYXRlWzBdLCBjYW5kaWRhdGVbMl0pOworICAgICAgICBpZiAoY2FuZGlkYXRlWzFdID4gY2FuZGlkYXRlWzJdKQorICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QsIGNhbmRpZGF0ZVsxXSwgY2FuZGlkYXRlWzJdKTsKKworICAgICAgICBpbnRyYV9wcmVkX21vZGUgPSBsYy0+cHUucmVtX2ludHJhX2x1bWFfcHJlZF9tb2RlOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgaWYgKGludHJhX3ByZWRfbW9kZSA+PSBjYW5kaWRhdGVbaV0pCisgICAgICAgICAgICAgICAgaW50cmFfcHJlZF9tb2RlKys7CisgICAgfQorCisgICAgLyogd3JpdGUgdGhlIGludHJhIHByZWRpY3Rpb24gdW5pdHMgaW50byB0aGUgbXYgYXJyYXkgKi8KKyAgICBpZiAoIXNpemVfaW5fcHVzKQorICAgICAgICBzaXplX2luX3B1cyA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVfaW5fcHVzOyBpKyspIHsKKyAgICAgICAgbWVtc2V0KCZzLT50YWJfaXBtWyh5X3B1ICsgaSkgKiBtaW5fcHVfd2lkdGggKyB4X3B1XSwKKyAgICAgICAgICAgICAgIGludHJhX3ByZWRfbW9kZSwgc2l6ZV9pbl9wdXMpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplX2luX3B1czsgaisrKSB7CisgICAgICAgICAgICB0YWJfbXZmWyh5X3B1ICsgaikgKiBtaW5fcHVfd2lkdGggKyB4X3B1ICsgaV0ucHJlZF9mbGFnID0gUEZfSU5UUkE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW50cmFfcHJlZF9tb2RlOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHNldF9jdF9kZXB0aChIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplLCBpbnQgY3RfZGVwdGgpCit7CisgICAgaW50IGxlbmd0aCA9ICgxIDw8IGxvZzJfY2Jfc2l6ZSkgPj4gcy0+c3BzLT5sb2cyX21pbl9jYl9zaXplOworICAgIGludCB4X2NiICAgPSB4MCA+PiBzLT5zcHMtPmxvZzJfbWluX2NiX3NpemU7CisgICAgaW50IHlfY2IgICA9IHkwID4+IHMtPnNwcy0+bG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBsZW5ndGg7IHkrKykKKyAgICAgICAgbWVtc2V0KCZzLT50YWJfY3RfZGVwdGhbKHlfY2IgKyB5KSAqIHMtPnNwcy0+bWluX2NiX3dpZHRoICsgeF9jYl0sCisgICAgICAgICAgICAgICBjdF9kZXB0aCwgbGVuZ3RoKTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFiX21vZGVfaWR4W10gPSB7CisgICAgIDAsICAxLCAgMiwgIDIsICAyLCAgMiwgIDMsICA1LCAgNywgIDgsIDEwLCAxMiwgMTMsIDE1LCAxNywgMTgsIDE5LCAyMCwKKyAgICAyMSwgMjIsIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNywgMjcsIDI4LCAyOCwgMjksIDI5LCAzMCwgMzF9OworCitzdGF0aWMgdm9pZCBpbnRyYV9wcmVkaWN0aW9uX3VuaXQoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2NiX3NpemUpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW50cmFfY2hyb21hX3RhYmxlWzRdID0geyAwLCAyNiwgMTAsIDEgfTsKKyAgICB1aW50OF90IHByZXZfaW50cmFfbHVtYV9wcmVkX2ZsYWdbNF07CisgICAgaW50IHNwbGl0ICAgPSBsYy0+Y3UucGFydF9tb2RlID09IFBBUlRfTnhOOworICAgIGludCBwYl9zaXplID0gKDEgPDwgbG9nMl9jYl9zaXplKSA+PiBzcGxpdDsKKyAgICBpbnQgc2lkZSAgICA9IHNwbGl0ICsgMTsKKyAgICBpbnQgY2hyb21hX21vZGU7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2lkZTsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2lkZTsgaisrKQorICAgICAgICAgICAgcHJldl9pbnRyYV9sdW1hX3ByZWRfZmxhZ1syICogaSArIGpdID0gZmZfaGV2Y19wcmV2X2ludHJhX2x1bWFfcHJlZF9mbGFnX2RlY29kZShzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaWRlOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpZGU7IGorKykgeworICAgICAgICAgICAgaWYgKHByZXZfaW50cmFfbHVtYV9wcmVkX2ZsYWdbMiAqIGkgKyBqXSkKKyAgICAgICAgICAgICAgICBsYy0+cHUubXBtX2lkeCA9IGZmX2hldmNfbXBtX2lkeF9kZWNvZGUocyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGMtPnB1LnJlbV9pbnRyYV9sdW1hX3ByZWRfbW9kZSA9IGZmX2hldmNfcmVtX2ludHJhX2x1bWFfcHJlZF9tb2RlX2RlY29kZShzKTsKKworICAgICAgICAgICAgbGMtPnB1LmludHJhX3ByZWRfbW9kZVsyICogaSArIGpdID0KKyAgICAgICAgICAgICAgICBsdW1hX2ludHJhX3ByZWRfbW9kZShzLCB4MCArIHBiX3NpemUgKiBqLCB5MCArIHBiX3NpemUgKiBpLCBwYl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfaW50cmFfbHVtYV9wcmVkX2ZsYWdbMiAqIGkgKyBqXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+c3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaWRlOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaWRlOyBqKyspIHsKKyAgICAgICAgICAgICAgICBsYy0+cHUuY2hyb21hX21vZGVfY1syICogaSArIGpdID0gY2hyb21hX21vZGUgPSBmZl9oZXZjX2ludHJhX2Nocm9tYV9wcmVkX21vZGVfZGVjb2RlKHMpOworICAgICAgICAgICAgICAgIGlmIChjaHJvbWFfbW9kZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYy0+cHUuaW50cmFfcHJlZF9tb2RlWzIgKiBpICsgal0gPT0gaW50cmFfY2hyb21hX3RhYmxlW2Nocm9tYV9tb2RlXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxjLT5wdS5pbnRyYV9wcmVkX21vZGVfY1syICogaSArIGpdID0gMzQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGxjLT5wdS5pbnRyYV9wcmVkX21vZGVfY1syICogaSArIGpdID0gaW50cmFfY2hyb21hX3RhYmxlW2Nocm9tYV9tb2RlXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsYy0+cHUuaW50cmFfcHJlZF9tb2RlX2NbMiAqIGkgKyBqXSA9IGxjLT5wdS5pbnRyYV9wcmVkX21vZGVbMiAqIGkgKyBqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHMtPnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMikgeworICAgICAgICBpbnQgbW9kZV9pZHg7CisgICAgICAgIGxjLT5wdS5jaHJvbWFfbW9kZV9jWzBdID0gY2hyb21hX21vZGUgPSBmZl9oZXZjX2ludHJhX2Nocm9tYV9wcmVkX21vZGVfZGVjb2RlKHMpOworICAgICAgICBpZiAoY2hyb21hX21vZGUgIT0gNCkgeworICAgICAgICAgICAgaWYgKGxjLT5wdS5pbnRyYV9wcmVkX21vZGVbMF0gPT0gaW50cmFfY2hyb21hX3RhYmxlW2Nocm9tYV9tb2RlXSkKKyAgICAgICAgICAgICAgICBtb2RlX2lkeCA9IDM0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1vZGVfaWR4ID0gaW50cmFfY2hyb21hX3RhYmxlW2Nocm9tYV9tb2RlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vZGVfaWR4ID0gbGMtPnB1LmludHJhX3ByZWRfbW9kZVswXTsKKyAgICAgICAgfQorICAgICAgICBsYy0+cHUuaW50cmFfcHJlZF9tb2RlX2NbMF0gPSB0YWJfbW9kZV9pZHhbbW9kZV9pZHhdOworICAgIH0gZWxzZSBpZiAocy0+c3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSAwKSB7CisgICAgICAgIGNocm9tYV9tb2RlID0gZmZfaGV2Y19pbnRyYV9jaHJvbWFfcHJlZF9tb2RlX2RlY29kZShzKTsKKyAgICAgICAgaWYgKGNocm9tYV9tb2RlICE9IDQpIHsKKyAgICAgICAgICAgIGlmIChsYy0+cHUuaW50cmFfcHJlZF9tb2RlWzBdID09IGludHJhX2Nocm9tYV90YWJsZVtjaHJvbWFfbW9kZV0pCisgICAgICAgICAgICAgICAgbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jWzBdID0gMzQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jWzBdID0gaW50cmFfY2hyb21hX3RhYmxlW2Nocm9tYV9tb2RlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxjLT5wdS5pbnRyYV9wcmVkX21vZGVfY1swXSA9IGxjLT5wdS5pbnRyYV9wcmVkX21vZGVbMF07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGludHJhX3ByZWRpY3Rpb25fdW5pdF9kZWZhdWx0X3ZhbHVlKEhFVkNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplKQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIGludCBwYl9zaXplICAgICAgICAgID0gMSA8PCBsb2cyX2NiX3NpemU7CisgICAgaW50IHNpemVfaW5fcHVzICAgICAgPSBwYl9zaXplID4+IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKKyAgICBpbnQgbWluX3B1X3dpZHRoICAgICA9IHMtPnNwcy0+bWluX3B1X3dpZHRoOworICAgIE12RmllbGQgKnRhYl9tdmYgICAgID0gcy0+cmVmLT50YWJfbXZmOworICAgIGludCB4X3B1ICAgICAgICAgICAgID0geDAgPj4gcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplOworICAgIGludCB5X3B1ICAgICAgICAgICAgID0geTAgPj4gcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplOworICAgIGludCBqLCBrOworCisgICAgaWYgKHNpemVfaW5fcHVzID09IDApCisgICAgICAgIHNpemVfaW5fcHVzID0gMTsKKyAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZV9pbl9wdXM7IGorKykKKyAgICAgICAgbWVtc2V0KCZzLT50YWJfaXBtWyh5X3B1ICsgaikgKiBtaW5fcHVfd2lkdGggKyB4X3B1XSwgSU5UUkFfREMsIHNpemVfaW5fcHVzKTsKKyAgICBpZiAobGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZV9pbl9wdXM7IGorKykKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzaXplX2luX3B1czsgaysrKQorICAgICAgICAgICAgICAgIHRhYl9tdmZbKHlfcHUgKyBqKSAqIG1pbl9wdV93aWR0aCArIHhfcHUgKyBrXS5wcmVkX2ZsYWcgPSBQRl9JTlRSQTsKK30KKworc3RhdGljIGludCBobHNfY29kaW5nX3VuaXQoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLCBpbnQgbG9nMl9jYl9zaXplKQoreworICAgIGludCBjYl9zaXplICAgICAgICAgID0gMSA8PCBsb2cyX2NiX3NpemU7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgaW50IGxvZzJfbWluX2NiX3NpemUgPSBzLT5zcHMtPmxvZzJfbWluX2NiX3NpemU7CisgICAgaW50IGxlbmd0aCAgICAgICAgICAgPSBjYl9zaXplID4+IGxvZzJfbWluX2NiX3NpemU7CisgICAgaW50IG1pbl9jYl93aWR0aCAgICAgPSBzLT5zcHMtPm1pbl9jYl93aWR0aDsKKyAgICBpbnQgeF9jYiAgICAgICAgICAgICA9IHgwID4+IGxvZzJfbWluX2NiX3NpemU7CisgICAgaW50IHlfY2IgICAgICAgICAgICAgPSB5MCA+PiBsb2cyX21pbl9jYl9zaXplOworICAgIGludCBpZHggICAgICAgICAgICAgID0gbG9nMl9jYl9zaXplIC0gMjsKKyAgICBpbnQgcXBfYmxvY2tfbWFzayAgICA9ICgxPDwocy0+c3BzLT5sb2cyX2N0Yl9zaXplIC0gcy0+cHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoKSkgLSAxOworICAgIGludCB4LCB5LCByZXQ7CisKKyAgICBsYy0+Y3UueCAgICAgICAgICAgICAgICA9IHgwOworICAgIGxjLT5jdS55ICAgICAgICAgICAgICAgID0geTA7CisgICAgbGMtPmN1LnByZWRfbW9kZSAgICAgICAgPSBNT0RFX0lOVFJBOworICAgIGxjLT5jdS5wYXJ0X21vZGUgICAgICAgID0gUEFSVF8yTngyTjsKKyAgICBsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyA9IDA7CisKKyAgICBTQU1QTEVfQ1RCKHMtPnNraXBfZmxhZywgeF9jYiwgeV9jYikgPSAwOworICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgIGxjLT5wdS5pbnRyYV9wcmVkX21vZGVbeF0gPSAxOworICAgIGlmIChzLT5wcHMtPnRyYW5zcXVhbnRfYnlwYXNzX2VuYWJsZV9mbGFnKSB7CisgICAgICAgIGxjLT5jdS5jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnID0gZmZfaGV2Y19jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnX2RlY29kZShzKTsKKyAgICAgICAgaWYgKGxjLT5jdS5jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnKQorICAgICAgICAgICAgc2V0X2RlYmxvY2tpbmdfYnlwYXNzKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbGMtPmN1LmN1X3RyYW5zcXVhbnRfYnlwYXNzX2ZsYWcgPSAwOworCisgICAgaWYgKHMtPnNoLnNsaWNlX3R5cGUgIT0gSV9TTElDRSkgeworICAgICAgICB1aW50OF90IHNraXBfZmxhZyA9IGZmX2hldmNfc2tpcF9mbGFnX2RlY29kZShzLCB4MCwgeTAsIHhfY2IsIHlfY2IpOworCisgICAgICAgIHggPSB5X2NiICogbWluX2NiX3dpZHRoICsgeF9jYjsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGxlbmd0aDsgeSsrKSB7CisgICAgICAgICAgICBtZW1zZXQoJnMtPnNraXBfZmxhZ1t4XSwgc2tpcF9mbGFnLCBsZW5ndGgpOworICAgICAgICAgICAgeCArPSBtaW5fY2Jfd2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgbGMtPmN1LnByZWRfbW9kZSA9IHNraXBfZmxhZyA/IE1PREVfU0tJUCA6IE1PREVfSU5URVI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgeCA9IHlfY2IgKiBtaW5fY2Jfd2lkdGggKyB4X2NiOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgbGVuZ3RoOyB5KyspIHsKKyAgICAgICAgICAgIG1lbXNldCgmcy0+c2tpcF9mbGFnW3hdLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgeCArPSBtaW5fY2Jfd2lkdGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoU0FNUExFX0NUQihzLT5za2lwX2ZsYWcsIHhfY2IsIHlfY2IpKSB7CisgICAgICAgIGhsc19wcmVkaWN0aW9uX3VuaXQocywgeDAsIHkwLCBjYl9zaXplLCBjYl9zaXplLCBsb2cyX2NiX3NpemUsIDAsIGlkeCk7CisgICAgICAgIGludHJhX3ByZWRpY3Rpb25fdW5pdF9kZWZhdWx0X3ZhbHVlKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKKworICAgICAgICBpZiAoIXMtPnNoLmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfZmxhZykKKyAgICAgICAgICAgIGZmX2hldmNfZGVibG9ja2luZ19ib3VuZGFyeV9zdHJlbmd0aHMocywgeDAsIHkwLCBsb2cyX2NiX3NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwY21fZmxhZyA9IDA7CisKKyAgICAgICAgaWYgKHMtPnNoLnNsaWNlX3R5cGUgIT0gSV9TTElDRSkKKyAgICAgICAgICAgIGxjLT5jdS5wcmVkX21vZGUgPSBmZl9oZXZjX3ByZWRfbW9kZV9kZWNvZGUocyk7CisgICAgICAgIGlmIChsYy0+Y3UucHJlZF9tb2RlICE9IE1PREVfSU5UUkEgfHwKKyAgICAgICAgICAgIGxvZzJfY2Jfc2l6ZSA9PSBzLT5zcHMtPmxvZzJfbWluX2NiX3NpemUpIHsKKyAgICAgICAgICAgIGxjLT5jdS5wYXJ0X21vZGUgICAgICAgID0gZmZfaGV2Y19wYXJ0X21vZGVfZGVjb2RlKHMsIGxvZzJfY2Jfc2l6ZSk7CisgICAgICAgICAgICBsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyA9IGxjLT5jdS5wYXJ0X21vZGUgPT0gUEFSVF9OeE4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgeworICAgICAgICAgICAgaWYgKGxjLT5jdS5wYXJ0X21vZGUgPT0gUEFSVF8yTngyTiAmJiBzLT5zcHMtPnBjbV9lbmFibGVkX2ZsYWcgJiYKKyAgICAgICAgICAgICAgICBsb2cyX2NiX3NpemUgPj0gcy0+c3BzLT5wY20ubG9nMl9taW5fcGNtX2NiX3NpemUgJiYKKyAgICAgICAgICAgICAgICBsb2cyX2NiX3NpemUgPD0gcy0+c3BzLT5wY20ubG9nMl9tYXhfcGNtX2NiX3NpemUpIHsKKyAgICAgICAgICAgICAgICBwY21fZmxhZyA9IGZmX2hldmNfcGNtX2ZsYWdfZGVjb2RlKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBjbV9mbGFnKSB7CisgICAgICAgICAgICAgICAgaW50cmFfcHJlZGljdGlvbl91bml0X2RlZmF1bHRfdmFsdWUocywgeDAsIHkwLCBsb2cyX2NiX3NpemUpOworICAgICAgICAgICAgICAgIHJldCA9IGhsc19wY21fc2FtcGxlKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+c3BzLT5wY20ubG9vcF9maWx0ZXJfZGlzYWJsZV9mbGFnKQorICAgICAgICAgICAgICAgICAgICBzZXRfZGVibG9ja2luZ19ieXBhc3MocywgeDAsIHkwLCBsb2cyX2NiX3NpemUpOworCisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludHJhX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsIGxvZzJfY2Jfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRyYV9wcmVkaWN0aW9uX3VuaXRfZGVmYXVsdF92YWx1ZShzLCB4MCwgeTAsIGxvZzJfY2Jfc2l6ZSk7CisgICAgICAgICAgICBzd2l0Y2ggKGxjLT5jdS5wYXJ0X21vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgUEFSVF8yTngyTjoKKyAgICAgICAgICAgICAgICBobHNfcHJlZGljdGlvbl91bml0KHMsIHgwLCB5MCwgY2Jfc2l6ZSwgY2Jfc2l6ZSwgbG9nMl9jYl9zaXplLCAwLCBpZHgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQQVJUXzJOeE46CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsICAgICAgICAgICAgICAgY2Jfc2l6ZSwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4KTsKKyAgICAgICAgICAgICAgICBobHNfcHJlZGljdGlvbl91bml0KHMsIHgwLCB5MCArIGNiX3NpemUgLyAyLCBjYl9zaXplLCBjYl9zaXplIC8gMiwgbG9nMl9jYl9zaXplLCAxLCBpZHgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQQVJUX054Mk46CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgICAgICAgICAgICAgICB5MCwgY2Jfc2l6ZSAvIDIsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyAyLCB5MCwgY2Jfc2l6ZSAvIDIsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMSwgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBBUlRfMk54blU6CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsICAgICAgICAgICAgICAgY2Jfc2l6ZSwgY2Jfc2l6ZSAgICAgLyA0LCBsb2cyX2NiX3NpemUsIDAsIGlkeCk7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAgKyBjYl9zaXplIC8gNCwgY2Jfc2l6ZSwgY2Jfc2l6ZSAqIDMgLyA0LCBsb2cyX2NiX3NpemUsIDEsIGlkeCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBBUlRfMk54bkQ6CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsICAgICAgICAgICAgICAgICAgIGNiX3NpemUsIGNiX3NpemUgKiAzIC8gNCwgbG9nMl9jYl9zaXplLCAwLCBpZHgpOworICAgICAgICAgICAgICAgIGhsc19wcmVkaWN0aW9uX3VuaXQocywgeDAsIHkwICsgY2Jfc2l6ZSAqIDMgLyA0LCBjYl9zaXplLCBjYl9zaXplICAgICAvIDQsIGxvZzJfY2Jfc2l6ZSwgMSwgaWR4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUEFSVF9uTHgyTjoKKyAgICAgICAgICAgICAgICBobHNfcHJlZGljdGlvbl91bml0KHMsIHgwLCAgICAgICAgICAgICAgIHkwLCBjYl9zaXplICAgICAvIDQsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMik7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyA0LCB5MCwgY2Jfc2l6ZSAqIDMgLyA0LCBjYl9zaXplLCBsb2cyX2NiX3NpemUsIDEsIGlkeCAtIDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQQVJUX25SeDJOOgorICAgICAgICAgICAgICAgIGhsc19wcmVkaWN0aW9uX3VuaXQocywgeDAsICAgICAgICAgICAgICAgICAgIHkwLCBjYl9zaXplICogMyAvIDQsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMik7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgKiAzIC8gNCwgeTAsIGNiX3NpemUgICAgIC8gNCwgY2Jfc2l6ZSwgbG9nMl9jYl9zaXplLCAxLCBpZHggLSAyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUEFSVF9OeE46CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgICAgICAgICAgICAgICB5MCwgICAgICAgICAgICAgICBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyAyLCB5MCwgICAgICAgICAgICAgICBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMSwgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgICAgICAgICAgICAgICB5MCArIGNiX3NpemUgLyAyLCBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMiwgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyAyLCB5MCArIGNiX3NpemUgLyAyLCBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMywgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBjbV9mbGFnKSB7CisgICAgICAgICAgICBpbnQgcnF0X3Jvb3RfY2JmID0gMTsKKworICAgICAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgIT0gTU9ERV9JTlRSQSAmJgorICAgICAgICAgICAgICAgICEobGMtPmN1LnBhcnRfbW9kZSA9PSBQQVJUXzJOeDJOICYmIGxjLT5wdS5tZXJnZV9mbGFnKSkgeworICAgICAgICAgICAgICAgIHJxdF9yb290X2NiZiA9IGZmX2hldmNfbm9fcmVzaWR1YWxfc3ludGF4X2ZsYWdfZGVjb2RlKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJxdF9yb290X2NiZikgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgY2JmWzJdID0geyAwIH07CisgICAgICAgICAgICAgICAgbGMtPmN1Lm1heF90cmFmb19kZXB0aCA9IGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmEgKyBsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXI7CisgICAgICAgICAgICAgICAgcmV0ID0gaGxzX3RyYW5zZm9ybV90cmVlKHMsIHgwLCB5MCwgeDAsIHkwLCB4MCwgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfY2Jfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMl9jYl9zaXplLCAwLCAwLCBjYmYsIGNiZik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghcy0+c2guZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnKQorICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX2RlYmxvY2tpbmdfYm91bmRhcnlfc3RyZW5ndGhzKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5wcHMtPmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZyAmJiBsYy0+dHUuaXNfY3VfcXBfZGVsdGFfY29kZWQgPT0gMCkKKyAgICAgICAgZmZfaGV2Y19zZXRfcVB5KHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKKworICAgIHggPSB5X2NiICogbWluX2NiX3dpZHRoICsgeF9jYjsKKyAgICBmb3IgKHkgPSAwOyB5IDwgbGVuZ3RoOyB5KyspIHsKKyAgICAgICAgbWVtc2V0KCZzLT5xcF95X3RhYlt4XSwgbGMtPnFwX3ksIGxlbmd0aCk7CisgICAgICAgIHggKz0gbWluX2NiX3dpZHRoOworICAgIH0KKworICAgIGlmKCgoeDAgKyAoMTw8bG9nMl9jYl9zaXplKSkgJiBxcF9ibG9ja19tYXNrKSA9PSAwICYmCisgICAgICAgKCh5MCArICgxPDxsb2cyX2NiX3NpemUpKSAmIHFwX2Jsb2NrX21hc2spID09IDApIHsKKyAgICAgICAgbGMtPnFQeV9wcmVkID0gbGMtPnFwX3k7CisgICAgfQorCisgICAgc2V0X2N0X2RlcHRoKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplLCBsYy0+Y3RfZGVwdGgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGxzX2NvZGluZ19xdWFkdHJlZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfY2Jfc2l6ZSwgaW50IGNiX2RlcHRoKQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIGNvbnN0IGludCBjYl9zaXplICAgID0gMSA8PCBsb2cyX2NiX3NpemU7CisgICAgaW50IHJldDsKKyAgICBpbnQgcXBfYmxvY2tfbWFzayA9ICgxPDwocy0+c3BzLT5sb2cyX2N0Yl9zaXplIC0gcy0+cHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoKSkgLSAxOworICAgIGludCBzcGxpdF9jdTsKKworICAgIGxjLT5jdF9kZXB0aCA9IGNiX2RlcHRoOworICAgIGlmICh4MCArIGNiX3NpemUgPD0gcy0+c3BzLT53aWR0aCAgJiYKKyAgICAgICAgeTAgKyBjYl9zaXplIDw9IHMtPnNwcy0+aGVpZ2h0ICYmCisgICAgICAgIGxvZzJfY2Jfc2l6ZSA+IHMtPnNwcy0+bG9nMl9taW5fY2Jfc2l6ZSkgeworICAgICAgICBzcGxpdF9jdSA9IGZmX2hldmNfc3BsaXRfY29kaW5nX3VuaXRfZmxhZ19kZWNvZGUocywgY2JfZGVwdGgsIHgwLCB5MCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3BsaXRfY3UgPSAobG9nMl9jYl9zaXplID4gcy0+c3BzLT5sb2cyX21pbl9jYl9zaXplKTsKKyAgICB9CisgICAgaWYgKHMtPnBwcy0+Y3VfcXBfZGVsdGFfZW5hYmxlZF9mbGFnICYmCisgICAgICAgIGxvZzJfY2Jfc2l6ZSA+PSBzLT5zcHMtPmxvZzJfY3RiX3NpemUgLSBzLT5wcHMtPmRpZmZfY3VfcXBfZGVsdGFfZGVwdGgpIHsKKyAgICAgICAgbGMtPnR1LmlzX2N1X3FwX2RlbHRhX2NvZGVkID0gMDsKKyAgICAgICAgbGMtPnR1LmN1X3FwX2RlbHRhICAgICAgICAgID0gMDsKKyAgICB9CisKKyAgICBpZiAocy0+c2guY3VfY2hyb21hX3FwX29mZnNldF9lbmFibGVkX2ZsYWcgJiYKKyAgICAgICAgbG9nMl9jYl9zaXplID49IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZSAtIHMtPnBwcy0+ZGlmZl9jdV9jaHJvbWFfcXBfb2Zmc2V0X2RlcHRoKSB7CisgICAgICAgIGxjLT50dS5pc19jdV9jaHJvbWFfcXBfb2Zmc2V0X2NvZGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoc3BsaXRfY3UpIHsKKyAgICAgICAgY29uc3QgaW50IGNiX3NpemVfc3BsaXQgPSBjYl9zaXplID4+IDE7CisgICAgICAgIGNvbnN0IGludCB4MSA9IHgwICsgY2Jfc2l6ZV9zcGxpdDsKKyAgICAgICAgY29uc3QgaW50IHkxID0geTAgKyBjYl9zaXplX3NwbGl0OworCisgICAgICAgIGludCBtb3JlX2RhdGEgPSAwOworCisgICAgICAgIG1vcmVfZGF0YSA9IGhsc19jb2RpbmdfcXVhZHRyZWUocywgeDAsIHkwLCBsb2cyX2NiX3NpemUgLSAxLCBjYl9kZXB0aCArIDEpOworICAgICAgICBpZiAobW9yZV9kYXRhIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBtb3JlX2RhdGE7CisKKyAgICAgICAgaWYgKG1vcmVfZGF0YSAmJiB4MSA8IHMtPnNwcy0+d2lkdGgpIHsKKyAgICAgICAgICAgIG1vcmVfZGF0YSA9IGhsc19jb2RpbmdfcXVhZHRyZWUocywgeDEsIHkwLCBsb2cyX2NiX3NpemUgLSAxLCBjYl9kZXB0aCArIDEpOworICAgICAgICAgICAgaWYgKG1vcmVfZGF0YSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG1vcmVfZGF0YTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9yZV9kYXRhICYmIHkxIDwgcy0+c3BzLT5oZWlnaHQpIHsKKyAgICAgICAgICAgIG1vcmVfZGF0YSA9IGhsc19jb2RpbmdfcXVhZHRyZWUocywgeDAsIHkxLCBsb2cyX2NiX3NpemUgLSAxLCBjYl9kZXB0aCArIDEpOworICAgICAgICAgICAgaWYgKG1vcmVfZGF0YSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG1vcmVfZGF0YTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9yZV9kYXRhICYmIHgxIDwgcy0+c3BzLT53aWR0aCAmJgorICAgICAgICAgICAgeTEgPCBzLT5zcHMtPmhlaWdodCkgeworICAgICAgICAgICAgbW9yZV9kYXRhID0gaGxzX2NvZGluZ19xdWFkdHJlZShzLCB4MSwgeTEsIGxvZzJfY2Jfc2l6ZSAtIDEsIGNiX2RlcHRoICsgMSk7CisgICAgICAgICAgICBpZiAobW9yZV9kYXRhIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9yZV9kYXRhOworICAgICAgICB9CisKKyAgICAgICAgaWYoKCh4MCArICgxPDxsb2cyX2NiX3NpemUpKSAmIHFwX2Jsb2NrX21hc2spID09IDAgJiYKKyAgICAgICAgICAgICgoeTAgKyAoMTw8bG9nMl9jYl9zaXplKSkgJiBxcF9ibG9ja19tYXNrKSA9PSAwKQorICAgICAgICAgICAgbGMtPnFQeV9wcmVkID0gbGMtPnFwX3k7CisKKyAgICAgICAgaWYgKG1vcmVfZGF0YSkKKyAgICAgICAgICAgIHJldHVybiAoKHgxICsgY2Jfc2l6ZV9zcGxpdCkgPCBzLT5zcHMtPndpZHRoIHx8CisgICAgICAgICAgICAgICAgICAgICh5MSArIGNiX3NpemVfc3BsaXQpIDwgcy0+c3BzLT5oZWlnaHQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBobHNfY29kaW5nX3VuaXQocywgeDAsIHkwLCBsb2cyX2NiX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmICgoISgoeDAgKyBjYl9zaXplKSAlCisgICAgICAgICAgICAgICAoMSA8PCAocy0+c3BzLT5sb2cyX2N0Yl9zaXplKSkpIHx8CisgICAgICAgICAgICAgKHgwICsgY2Jfc2l6ZSA+PSBzLT5zcHMtPndpZHRoKSkgJiYKKyAgICAgICAgICAgICghKCh5MCArIGNiX3NpemUpICUKKyAgICAgICAgICAgICAgICgxIDw8IChzLT5zcHMtPmxvZzJfY3RiX3NpemUpKSkgfHwKKyAgICAgICAgICAgICAoeTAgKyBjYl9zaXplID49IHMtPnNwcy0+aGVpZ2h0KSkpIHsKKyAgICAgICAgICAgIGludCBlbmRfb2Zfc2xpY2VfZmxhZyA9IGZmX2hldmNfZW5kX29mX3NsaWNlX2ZsYWdfZGVjb2RlKHMpOworICAgICAgICAgICAgcmV0dXJuICFlbmRfb2Zfc2xpY2VfZmxhZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhsc19kZWNvZGVfbmVpZ2hib3VyKEhFVkNDb250ZXh0ICpzLCBpbnQgeF9jdGIsIGludCB5X2N0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdGJfYWRkcl90cykKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyAgPSBzLT5IRVZDbGM7CisgICAgaW50IGN0Yl9zaXplICAgICAgICAgID0gMSA8PCBzLT5zcHMtPmxvZzJfY3RiX3NpemU7CisgICAgaW50IGN0Yl9hZGRyX3JzICAgICAgID0gcy0+cHBzLT5jdGJfYWRkcl90c190b19yc1tjdGJfYWRkcl90c107CisgICAgaW50IGN0Yl9hZGRyX2luX3NsaWNlID0gY3RiX2FkZHJfcnMgLSBzLT5zaC5zbGljZV9hZGRyOworCisgICAgcy0+dGFiX3NsaWNlX2FkZHJlc3NbY3RiX2FkZHJfcnNdID0gcy0+c2guc2xpY2VfYWRkcjsKKworICAgIGlmIChzLT5wcHMtPmVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnKSB7CisgICAgICAgIGlmICh4X2N0YiA9PSAwICYmICh5X2N0YiAmIChjdGJfc2l6ZSAtIDEpKSA9PSAwKQorICAgICAgICAgICAgbGMtPmZpcnN0X3FwX2dyb3VwID0gMTsKKyAgICAgICAgbGMtPmVuZF9vZl90aWxlc194ID0gcy0+c3BzLT53aWR0aDsKKyAgICB9IGVsc2UgaWYgKHMtPnBwcy0+dGlsZXNfZW5hYmxlZF9mbGFnKSB7CisgICAgICAgIGlmIChjdGJfYWRkcl90cyAmJiBzLT5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHNdICE9IHMtPnBwcy0+dGlsZV9pZFtjdGJfYWRkcl90cyAtIDFdKSB7CisgICAgICAgICAgICBpbnQgaWR4WCA9IHMtPnBwcy0+Y29sX2lkeFhbeF9jdGIgPj4gcy0+c3BzLT5sb2cyX2N0Yl9zaXplXTsKKyAgICAgICAgICAgIGxjLT5lbmRfb2ZfdGlsZXNfeCAgID0geF9jdGIgKyAocy0+cHBzLT5jb2x1bW5fd2lkdGhbaWR4WF0gPDwgcy0+c3BzLT5sb2cyX2N0Yl9zaXplKTsKKyAgICAgICAgICAgIGxjLT5maXJzdF9xcF9ncm91cCAgID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGxjLT5lbmRfb2ZfdGlsZXNfeCA9IHMtPnNwcy0+d2lkdGg7CisgICAgfQorCisgICAgbGMtPmVuZF9vZl90aWxlc195ID0gRkZNSU4oeV9jdGIgKyBjdGJfc2l6ZSwgcy0+c3BzLT5oZWlnaHQpOworCisgICAgbGMtPmJvdW5kYXJ5X2ZsYWdzID0gMDsKKyAgICBpZiAocy0+cHBzLT50aWxlc19lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgaWYgKHhfY3RiID4gMCAmJiBzLT5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHNdICE9IHMtPnBwcy0+dGlsZV9pZFtzLT5wcHMtPmN0Yl9hZGRyX3JzX3RvX3RzW2N0Yl9hZGRyX3JzIC0gMV1dKQorICAgICAgICAgICAgbGMtPmJvdW5kYXJ5X2ZsYWdzIHw9IEJPVU5EQVJZX0xFRlRfVElMRTsKKyAgICAgICAgaWYgKHhfY3RiID4gMCAmJiBzLT50YWJfc2xpY2VfYWRkcmVzc1tjdGJfYWRkcl9yc10gIT0gcy0+dGFiX3NsaWNlX2FkZHJlc3NbY3RiX2FkZHJfcnMgLSAxXSkKKyAgICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBCT1VOREFSWV9MRUZUX1NMSUNFOworICAgICAgICBpZiAoeV9jdGIgPiAwICYmIHMtPnBwcy0+dGlsZV9pZFtjdGJfYWRkcl90c10gIT0gcy0+cHBzLT50aWxlX2lkW3MtPnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbY3RiX2FkZHJfcnMgLSBzLT5zcHMtPmN0Yl93aWR0aF1dKQorICAgICAgICAgICAgbGMtPmJvdW5kYXJ5X2ZsYWdzIHw9IEJPVU5EQVJZX1VQUEVSX1RJTEU7CisgICAgICAgIGlmICh5X2N0YiA+IDAgJiYgcy0+dGFiX3NsaWNlX2FkZHJlc3NbY3RiX2FkZHJfcnNdICE9IHMtPnRhYl9zbGljZV9hZGRyZXNzW2N0Yl9hZGRyX3JzIC0gcy0+c3BzLT5jdGJfd2lkdGhdKQorICAgICAgICAgICAgbGMtPmJvdW5kYXJ5X2ZsYWdzIHw9IEJPVU5EQVJZX1VQUEVSX1NMSUNFOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghY3RiX2FkZHJfaW5fc2xpY2UgPiAwKQorICAgICAgICAgICAgbGMtPmJvdW5kYXJ5X2ZsYWdzIHw9IEJPVU5EQVJZX0xFRlRfU0xJQ0U7CisgICAgICAgIGlmIChjdGJfYWRkcl9pbl9zbGljZSA8IHMtPnNwcy0+Y3RiX3dpZHRoKQorICAgICAgICAgICAgbGMtPmJvdW5kYXJ5X2ZsYWdzIHw9IEJPVU5EQVJZX1VQUEVSX1NMSUNFOworICAgIH0KKworICAgIGxjLT5jdGJfbGVmdF9mbGFnID0gKCh4X2N0YiA+IDApICYmIChjdGJfYWRkcl9pbl9zbGljZSA+IDApICYmICEobGMtPmJvdW5kYXJ5X2ZsYWdzICYgQk9VTkRBUllfTEVGVF9USUxFKSk7CisgICAgbGMtPmN0Yl91cF9mbGFnICAgPSAoKHlfY3RiID4gMCkgJiYgKGN0Yl9hZGRyX2luX3NsaWNlID49IHMtPnNwcy0+Y3RiX3dpZHRoKSAmJiAhKGxjLT5ib3VuZGFyeV9mbGFncyAmIEJPVU5EQVJZX1VQUEVSX1RJTEUpKTsKKyAgICBsYy0+Y3RiX3VwX3JpZ2h0X2ZsYWcgPSAoKHlfY3RiID4gMCkgICYmIChjdGJfYWRkcl9pbl9zbGljZSsxID49IHMtPnNwcy0+Y3RiX3dpZHRoKSAmJiAocy0+cHBzLT50aWxlX2lkW2N0Yl9hZGRyX3RzXSA9PSBzLT5wcHMtPnRpbGVfaWRbcy0+cHBzLT5jdGJfYWRkcl9yc190b190c1tjdGJfYWRkcl9ycysxIC0gcy0+c3BzLT5jdGJfd2lkdGhdXSkpOworICAgIGxjLT5jdGJfdXBfbGVmdF9mbGFnID0gKCh4X2N0YiA+IDApICYmICh5X2N0YiA+IDApICAmJiAoY3RiX2FkZHJfaW5fc2xpY2UtMSA+PSBzLT5zcHMtPmN0Yl93aWR0aCkgJiYgKHMtPnBwcy0+dGlsZV9pZFtjdGJfYWRkcl90c10gPT0gcy0+cHBzLT50aWxlX2lkW3MtPnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbY3RiX2FkZHJfcnMtMSAtIHMtPnNwcy0+Y3RiX3dpZHRoXV0pKTsKK30KKworc3RhdGljIGludCBobHNfZGVjb2RlX2VudHJ5KEFWQ29kZWNDb250ZXh0ICphdmN0eHQsIHZvaWQgKmlzRmlsdGVyVGhyZWFkKQoreworICAgIEhFVkNDb250ZXh0ICpzICA9IGF2Y3R4dC0+cHJpdl9kYXRhOworICAgIGludCBjdGJfc2l6ZSAgICA9IDEgPDwgcy0+c3BzLT5sb2cyX2N0Yl9zaXplOworICAgIGludCBtb3JlX2RhdGEgICA9IDE7CisgICAgaW50IHhfY3RiICAgICAgID0gMDsKKyAgICBpbnQgeV9jdGIgICAgICAgPSAwOworICAgIGludCBjdGJfYWRkcl90cyA9IHMtPnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbcy0+c2guc2xpY2VfY3RiX2FkZHJfcnNdOworCisgICAgaWYgKCFjdGJfYWRkcl90cyAmJiBzLT5zaC5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW1wb3NzaWJsZSBpbml0aWFsIHRpbGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHMtPnNoLmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcpIHsKKyAgICAgICAgaW50IHByZXZfcnMgPSBzLT5wcHMtPmN0Yl9hZGRyX3RzX3RvX3JzW2N0Yl9hZGRyX3RzIC0gMV07CisgICAgICAgIGlmIChzLT50YWJfc2xpY2VfYWRkcmVzc1twcmV2X3JzXSAhPSBzLT5zaC5zbGljZV9hZGRyKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlByZXZpb3VzIHNsaWNlIHNlZ21lbnQgbWlzc2luZ1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChtb3JlX2RhdGEgJiYgY3RiX2FkZHJfdHMgPCBzLT5zcHMtPmN0Yl9zaXplKSB7CisgICAgICAgIGludCBjdGJfYWRkcl9ycyA9IHMtPnBwcy0+Y3RiX2FkZHJfdHNfdG9fcnNbY3RiX2FkZHJfdHNdOworCisgICAgICAgIHhfY3RiID0gKGN0Yl9hZGRyX3JzICUgKChzLT5zcHMtPndpZHRoICsgY3RiX3NpemUgLSAxKSA+PiBzLT5zcHMtPmxvZzJfY3RiX3NpemUpKSA8PCBzLT5zcHMtPmxvZzJfY3RiX3NpemU7CisgICAgICAgIHlfY3RiID0gKGN0Yl9hZGRyX3JzIC8gKChzLT5zcHMtPndpZHRoICsgY3RiX3NpemUgLSAxKSA+PiBzLT5zcHMtPmxvZzJfY3RiX3NpemUpKSA8PCBzLT5zcHMtPmxvZzJfY3RiX3NpemU7CisgICAgICAgIGhsc19kZWNvZGVfbmVpZ2hib3VyKHMsIHhfY3RiLCB5X2N0YiwgY3RiX2FkZHJfdHMpOworCisgICAgICAgIGZmX2hldmNfY2FiYWNfaW5pdChzLCBjdGJfYWRkcl90cyk7CisKKyAgICAgICAgaGxzX3Nhb19wYXJhbShzLCB4X2N0YiA+PiBzLT5zcHMtPmxvZzJfY3RiX3NpemUsIHlfY3RiID4+IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZSk7CisKKyAgICAgICAgcy0+ZGVibG9ja1tjdGJfYWRkcl9yc10uYmV0YV9vZmZzZXQgPSBzLT5zaC5iZXRhX29mZnNldDsKKyAgICAgICAgcy0+ZGVibG9ja1tjdGJfYWRkcl9yc10udGNfb2Zmc2V0ICAgPSBzLT5zaC50Y19vZmZzZXQ7CisgICAgICAgIHMtPmZpbHRlcl9zbGljZV9lZGdlc1tjdGJfYWRkcl9yc10gID0gcy0+c2guc2xpY2VfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWc7CisKKyAgICAgICAgbW9yZV9kYXRhID0gaGxzX2NvZGluZ19xdWFkdHJlZShzLCB4X2N0YiwgeV9jdGIsIHMtPnNwcy0+bG9nMl9jdGJfc2l6ZSwgMCk7CisgICAgICAgIGlmIChtb3JlX2RhdGEgPCAwKSB7CisgICAgICAgICAgICBzLT50YWJfc2xpY2VfYWRkcmVzc1tjdGJfYWRkcl9yc10gPSAtMTsKKyAgICAgICAgICAgIHJldHVybiBtb3JlX2RhdGE7CisgICAgICAgIH0KKworCisgICAgICAgIGN0Yl9hZGRyX3RzKys7CisgICAgICAgIGZmX2hldmNfc2F2ZV9zdGF0ZXMocywgY3RiX2FkZHJfdHMpOworICAgICAgICBmZl9oZXZjX2hsc19maWx0ZXJzKHMsIHhfY3RiLCB5X2N0YiwgY3RiX3NpemUpOworICAgIH0KKworICAgIGlmICh4X2N0YiArIGN0Yl9zaXplID49IHMtPnNwcy0+d2lkdGggJiYKKyAgICAgICAgeV9jdGIgKyBjdGJfc2l6ZSA+PSBzLT5zcHMtPmhlaWdodCkKKyAgICAgICAgZmZfaGV2Y19obHNfZmlsdGVyKHMsIHhfY3RiLCB5X2N0YiwgY3RiX3NpemUpOworCisgICAgcmV0dXJuIGN0Yl9hZGRyX3RzOworfQorCitzdGF0aWMgaW50IGhsc19zbGljZV9kYXRhKEhFVkNDb250ZXh0ICpzKQoreworICAgIGludCBhcmdbMl07CisgICAgaW50IHJldFsyXTsKKworICAgIGFyZ1swXSA9IDA7CisgICAgYXJnWzFdID0gMTsKKworICAgIHMtPmF2Y3R4LT5leGVjdXRlKHMtPmF2Y3R4LCBobHNfZGVjb2RlX2VudHJ5LCBhcmcsIHJldCAsIDEsIHNpemVvZihpbnQpKTsKKyAgICByZXR1cm4gcmV0WzBdOworfQorc3RhdGljIGludCBobHNfZGVjb2RlX2VudHJ5X3dwcChBVkNvZGVjQ29udGV4dCAqYXZjdHh0LCB2b2lkICppbnB1dF9jdGJfcm93LCBpbnQgam9iLCBpbnQgc2VsZl9pZCkKK3sKKyAgICBIRVZDQ29udGV4dCAqczEgID0gYXZjdHh0LT5wcml2X2RhdGEsICpzOworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjOworICAgIGludCBjdGJfc2l6ZSAgICA9IDE8PCBzMS0+c3BzLT5sb2cyX2N0Yl9zaXplOworICAgIGludCBtb3JlX2RhdGEgICA9IDE7CisgICAgaW50ICpjdGJfcm93X3AgICAgPSBpbnB1dF9jdGJfcm93OworICAgIGludCBjdGJfcm93ID0gY3RiX3Jvd19wW2pvYl07CisgICAgaW50IGN0Yl9hZGRyX3JzID0gczEtPnNoLnNsaWNlX2N0Yl9hZGRyX3JzICsgY3RiX3JvdyAqICgoczEtPnNwcy0+d2lkdGggKyBjdGJfc2l6ZSAtIDEpID4+IHMxLT5zcHMtPmxvZzJfY3RiX3NpemUpOworICAgIGludCBjdGJfYWRkcl90cyA9IHMxLT5wcHMtPmN0Yl9hZGRyX3JzX3RvX3RzW2N0Yl9hZGRyX3JzXTsKKyAgICBpbnQgdGhyZWFkID0gY3RiX3JvdyAlIHMxLT50aHJlYWRzX251bWJlcjsKKyAgICBpbnQgcmV0OworCisgICAgcyA9IHMxLT5zTGlzdFtzZWxmX2lkXTsKKyAgICBsYyA9IHMtPkhFVkNsYzsKKworICAgIGlmKGN0Yl9yb3cpIHsKKyAgICAgICAgcmV0ID0gaW5pdF9nZXRfYml0czgoJmxjLT5nYiwgcy0+ZGF0YSArIHMtPnNoLm9mZnNldFtjdGJfcm93IC0gMV0sIHMtPnNoLnNpemVbY3RiX3JvdyAtIDFdKTsKKworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGZmX2luaXRfY2FiYWNfZGVjb2RlcigmbGMtPmNjLCBzLT5kYXRhICsgcy0+c2gub2Zmc2V0WyhjdGJfcm93KS0xXSwgcy0+c2guc2l6ZVtjdGJfcm93IC0gMV0pOworICAgIH0KKworICAgIHdoaWxlKG1vcmVfZGF0YSAmJiBjdGJfYWRkcl90cyA8IHMtPnNwcy0+Y3RiX3NpemUpIHsKKyAgICAgICAgaW50IHhfY3RiID0gKGN0Yl9hZGRyX3JzICUgcy0+c3BzLT5jdGJfd2lkdGgpIDw8IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZTsKKyAgICAgICAgaW50IHlfY3RiID0gKGN0Yl9hZGRyX3JzIC8gcy0+c3BzLT5jdGJfd2lkdGgpIDw8IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZTsKKworICAgICAgICBobHNfZGVjb2RlX25laWdoYm91cihzLCB4X2N0YiwgeV9jdGIsIGN0Yl9hZGRyX3RzKTsKKworICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MyKHMtPmF2Y3R4LCBjdGJfcm93LCB0aHJlYWQsIFNISUZUX0NUQl9XUFApOworCisgICAgICAgIGlmIChhdnByaXZfYXRvbWljX2ludF9nZXQoJnMxLT53cHBfZXJyKSl7CisgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzMihzLT5hdmN0eCwgY3RiX3JvdyAsIHRocmVhZCwgU0hJRlRfQ1RCX1dQUCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGZmX2hldmNfY2FiYWNfaW5pdChzLCBjdGJfYWRkcl90cyk7CisgICAgICAgIGhsc19zYW9fcGFyYW0ocywgeF9jdGIgPj4gcy0+c3BzLT5sb2cyX2N0Yl9zaXplLCB5X2N0YiA+PiBzLT5zcHMtPmxvZzJfY3RiX3NpemUpOworICAgICAgICBtb3JlX2RhdGEgPSBobHNfY29kaW5nX3F1YWR0cmVlKHMsIHhfY3RiLCB5X2N0Yiwgcy0+c3BzLT5sb2cyX2N0Yl9zaXplLCAwKTsKKworICAgICAgICBpZiAobW9yZV9kYXRhIDwgMCkgeworICAgICAgICAgICAgcy0+dGFiX3NsaWNlX2FkZHJlc3NbY3RiX2FkZHJfcnNdID0gLTE7CisgICAgICAgICAgICByZXR1cm4gbW9yZV9kYXRhOworICAgICAgICB9CisKKyAgICAgICAgY3RiX2FkZHJfdHMrKzsKKworICAgICAgICBmZl9oZXZjX3NhdmVfc3RhdGVzKHMsIGN0Yl9hZGRyX3RzKTsKKyAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIocy0+YXZjdHgsIGN0Yl9yb3csIHRocmVhZCwgMSk7CisgICAgICAgIGZmX2hldmNfaGxzX2ZpbHRlcnMocywgeF9jdGIsIHlfY3RiLCBjdGJfc2l6ZSk7CisKKyAgICAgICAgaWYgKCFtb3JlX2RhdGEgJiYgKHhfY3RiK2N0Yl9zaXplKSA8IHMtPnNwcy0+d2lkdGggJiYgY3RiX3JvdyAhPSBzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cykgeworICAgICAgICAgICAgYXZwcml2X2F0b21pY19pbnRfc2V0KCZzMS0+d3BwX2VyciwgIDEpOworICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIocy0+YXZjdHgsIGN0Yl9yb3cgLHRocmVhZCwgU0hJRlRfQ1RCX1dQUCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoeF9jdGIrY3RiX3NpemUpID49IHMtPnNwcy0+d2lkdGggJiYgKHlfY3RiK2N0Yl9zaXplKSA+PSBzLT5zcHMtPmhlaWdodCApIHsKKyAgICAgICAgICAgIGZmX2hldmNfaGxzX2ZpbHRlcihzLCB4X2N0YiwgeV9jdGIsIGN0Yl9zaXplKTsKKyAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MyKHMtPmF2Y3R4LCBjdGJfcm93ICwgdGhyZWFkLCBTSElGVF9DVEJfV1BQKTsKKyAgICAgICAgICAgIHJldHVybiBjdGJfYWRkcl90czsKKyAgICAgICAgfQorICAgICAgICBjdGJfYWRkcl9ycyAgICAgICA9IHMtPnBwcy0+Y3RiX2FkZHJfdHNfdG9fcnNbY3RiX2FkZHJfdHNdOworICAgICAgICB4X2N0Yis9Y3RiX3NpemU7CisKKyAgICAgICAgaWYoeF9jdGIgPj0gcy0+c3BzLT53aWR0aCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIocy0+YXZjdHgsIGN0Yl9yb3cgLHRocmVhZCwgU0hJRlRfQ1RCX1dQUCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBobHNfc2xpY2VfZGF0YV93cHAoSEVWQ0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKm5hbCwgaW50IGxlbmd0aCkKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICBpbnQgKnJldCA9IGF2X21hbGxvY19hcnJheShzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyArIDEsIHNpemVvZihpbnQpKTsKKyAgICBpbnQgKmFyZyA9IGF2X21hbGxvY19hcnJheShzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyArIDEsIHNpemVvZihpbnQpKTsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBzdGFydGhlYWRlciwgY21wdCA9IDA7CisgICAgaW50IGksIGosIHJlcyA9IDA7CisKKworICAgIGlmICghcy0+c0xpc3RbMV0pIHsKKyAgICAgICAgZmZfYWxsb2NfZW50cmllcyhzLT5hdmN0eCwgcy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHMgKyAxKTsKKworCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzLT50aHJlYWRzX251bWJlcjsgaSsrKSB7CisgICAgICAgICAgICBzLT5zTGlzdFtpXSA9IGF2X21hbGxvYyhzaXplb2YoSEVWQ0NvbnRleHQpKTsKKyAgICAgICAgICAgIG1lbWNweShzLT5zTGlzdFtpXSwgcywgc2l6ZW9mKEhFVkNDb250ZXh0KSk7CisgICAgICAgICAgICBzLT5IRVZDbGNMaXN0W2ldID0gYXZfbWFsbG9jeihzaXplb2YoSEVWQ0xvY2FsQ29udGV4dCkpOworICAgICAgICAgICAgcy0+c0xpc3RbaV0tPkhFVkNsYyA9IHMtPkhFVkNsY0xpc3RbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvZmZzZXQgPSAobGMtPmdiLmluZGV4ID4+IDMpOworCisgICAgZm9yIChqID0gMCwgY21wdCA9IDAsIHN0YXJ0aGVhZGVyID0gb2Zmc2V0ICsgcy0+c2guZW50cnlfcG9pbnRfb2Zmc2V0WzBdOyBqIDwgcy0+c2tpcHBlZF9ieXRlczsgaisrKSB7CisgICAgICAgIGlmIChzLT5za2lwcGVkX2J5dGVzX3Bvc1tqXSA+PSBvZmZzZXQgJiYgcy0+c2tpcHBlZF9ieXRlc19wb3Nbal0gPCBzdGFydGhlYWRlcikgeworICAgICAgICAgICAgc3RhcnRoZWFkZXItLTsKKyAgICAgICAgICAgIGNtcHQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDE7IGkgPCBzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0czsgaSsrKSB7CisgICAgICAgIG9mZnNldCArPSAocy0+c2guZW50cnlfcG9pbnRfb2Zmc2V0W2kgLSAxXSAtIGNtcHQpOworICAgICAgICBmb3IgKGogPSAwLCBjbXB0ID0gMCwgc3RhcnRoZWFkZXIgPSBvZmZzZXQKKyAgICAgICAgICAgICArIHMtPnNoLmVudHJ5X3BvaW50X29mZnNldFtpXTsgaiA8IHMtPnNraXBwZWRfYnl0ZXM7IGorKykgeworICAgICAgICAgICAgaWYgKHMtPnNraXBwZWRfYnl0ZXNfcG9zW2pdID49IG9mZnNldCAmJiBzLT5za2lwcGVkX2J5dGVzX3Bvc1tqXSA8IHN0YXJ0aGVhZGVyKSB7CisgICAgICAgICAgICAgICAgc3RhcnRoZWFkZXItLTsKKyAgICAgICAgICAgICAgICBjbXB0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcy0+c2guc2l6ZVtpIC0gMV0gPSBzLT5zaC5lbnRyeV9wb2ludF9vZmZzZXRbaV0gLSBjbXB0OworICAgICAgICBzLT5zaC5vZmZzZXRbaSAtIDFdID0gb2Zmc2V0OworCisgICAgfQorICAgIGlmIChzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyAhPSAwKSB7CisgICAgICAgIG9mZnNldCArPSBzLT5zaC5lbnRyeV9wb2ludF9vZmZzZXRbcy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHMgLSAxXSAtIGNtcHQ7CisgICAgICAgIHMtPnNoLnNpemVbcy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHMgLSAxXSA9IGxlbmd0aCAtIG9mZnNldDsKKyAgICAgICAgcy0+c2gub2Zmc2V0W3MtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzIC0gMV0gPSBvZmZzZXQ7CisKKyAgICB9CisgICAgcy0+ZGF0YSA9IG5hbDsKKworICAgIGZvciAoaSA9IDE7IGkgPCBzLT50aHJlYWRzX251bWJlcjsgaSsrKSB7CisgICAgICAgIHMtPnNMaXN0W2ldLT5IRVZDbGMtPmZpcnN0X3FwX2dyb3VwID0gMTsKKyAgICAgICAgcy0+c0xpc3RbaV0tPkhFVkNsYy0+cXBfeSA9IHMtPnNMaXN0WzBdLT5IRVZDbGMtPnFwX3k7CisgICAgICAgIG1lbWNweShzLT5zTGlzdFtpXSwgcywgc2l6ZW9mKEhFVkNDb250ZXh0KSk7CisgICAgICAgIHMtPnNMaXN0W2ldLT5IRVZDbGMgPSBzLT5IRVZDbGNMaXN0W2ldOworICAgIH0KKworICAgIGF2cHJpdl9hdG9taWNfaW50X3NldCgmcy0+d3BwX2VyciwgMCk7CisgICAgZmZfcmVzZXRfZW50cmllcyhzLT5hdmN0eCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzOyBpKyspIHsKKyAgICAgICAgYXJnW2ldID0gaTsKKyAgICAgICAgcmV0W2ldID0gMDsKKyAgICB9CisKKyAgICBpZiAocy0+cHBzLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZykKKyAgICAgICAgcy0+YXZjdHgtPmV4ZWN1dGUyKHMtPmF2Y3R4LCAodm9pZCAqKSBobHNfZGVjb2RlX2VudHJ5X3dwcCwgYXJnLCByZXQsIHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzICsgMSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzOyBpKyspCisgICAgICAgIHJlcyArPSByZXRbaV07CisgICAgYXZfZnJlZShyZXQpOworICAgIGF2X2ZyZWUoYXJnKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIEByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQSBpZiB0aGUgcGFja2V0IGlzIG5vdCBhIHZhbGlkIE5BTCB1bml0LAorICogMCBpZiB0aGUgdW5pdCBzaG91bGQgYmUgc2tpcHBlZCwgMSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBobHNfbmFsX3VuaXQoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKKyAgICBpbnQgbnVoX2xheWVyX2lkOworCisgICAgaWYgKGdldF9iaXRzMShnYikgIT0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzLT5uYWxfdW5pdF90eXBlID0gZ2V0X2JpdHMoZ2IsIDYpOworCisgICAgbnVoX2xheWVyX2lkICAgPSBnZXRfYml0cyhnYiwgNik7CisgICAgcy0+dGVtcG9yYWxfaWQgPSBnZXRfYml0cyhnYiwgMykgLSAxOworICAgIGlmIChzLT50ZW1wb3JhbF9pZCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICJuYWxfdW5pdF90eXBlOiAlZCwgbnVoX2xheWVyX2lkOiAlZCwgdGVtcG9yYWxfaWQ6ICVkXG4iLAorICAgICAgICAgICBzLT5uYWxfdW5pdF90eXBlLCBudWhfbGF5ZXJfaWQsIHMtPnRlbXBvcmFsX2lkKTsKKworICAgIHJldHVybiBudWhfbGF5ZXJfaWQgPT0gMDsKK30KKworc3RhdGljIGludCBzZXRfc2lkZV9kYXRhKEhFVkNDb250ZXh0ICpzKQoreworICAgIEFWRnJhbWUgKm91dCA9IHMtPnJlZi0+ZnJhbWU7CisKKyAgICBpZiAocy0+c2VpX2ZyYW1lX3BhY2tpbmdfcHJlc2VudCAmJgorICAgICAgICBzLT5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUgPj0gMyAmJgorICAgICAgICBzLT5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUgPD0gNSAmJgorICAgICAgICBzLT5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPiAwICYmCisgICAgICAgIHMtPmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA8IDMpIHsKKyAgICAgICAgQVZTdGVyZW8zRCAqc3RlcmVvID0gYXZfc3RlcmVvM2RfY3JlYXRlX3NpZGVfZGF0YShvdXQpOworICAgICAgICBpZiAoIXN0ZXJlbykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgc3dpdGNoIChzLT5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUpIHsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKHMtPnF1aW5jdW54X3N1YnNhbXBsaW5nKQorICAgICAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX1NJREVCWVNJREVfUVVJTkNVTlg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfU0lERUJZU0lERTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF9UT1BCT1RUT007CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfRlJBTUVTRVFVRU5DRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA9PSAyKQorICAgICAgICAgICAgc3RlcmVvLT5mbGFncyA9IEFWX1NURVJFTzNEX0ZMQUdfSU5WRVJUOworICAgIH0KKworICAgIGlmIChzLT5zZWlfZGlzcGxheV9vcmllbnRhdGlvbl9wcmVzZW50ICYmCisgICAgICAgIChzLT5zZWlfYW50aWNsb2Nrd2lzZV9yb3RhdGlvbiB8fCBzLT5zZWlfaGZsaXAgfHwgcy0+c2VpX3ZmbGlwKSkgeworICAgICAgICBkb3VibGUgYW5nbGUgPSBzLT5zZWlfYW50aWNsb2Nrd2lzZV9yb3RhdGlvbiAqIDM2MCAvIChkb3VibGUpICgxIDw8IDE2KTsKKyAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpyb3RhdGlvbiA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9GUkFNRV9EQVRBX0RJU1BMQVlNQVRSSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQzMl90KSAqIDkpOworICAgICAgICBpZiAoIXJvdGF0aW9uKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBhdl9kaXNwbGF5X3JvdGF0aW9uX3NldCgoaW50MzJfdCAqKXJvdGF0aW9uLT5kYXRhLCBhbmdsZSk7CisgICAgICAgIGF2X2Rpc3BsYXlfbWF0cml4X2ZsaXAoKGludDMyX3QgKilyb3RhdGlvbi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zZWlfaGZsaXAsIHMtPnNlaV92ZmxpcCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGV2Y19mcmFtZV9zdGFydChIRVZDQ29udGV4dCAqcykKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICBpbnQgcGljX3NpemVfaW5fY3RiICA9ICgocy0+c3BzLT53aWR0aCAgPj4gcy0+c3BzLT5sb2cyX21pbl9jYl9zaXplKSArIDEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgocy0+c3BzLT5oZWlnaHQgPj4gcy0+c3BzLT5sb2cyX21pbl9jYl9zaXplKSArIDEpOworICAgIGludCByZXQ7CisKKyAgICBtZW1zZXQocy0+aG9yaXpvbnRhbF9icywgMCwgcy0+YnNfd2lkdGggKiBzLT5ic19oZWlnaHQpOworICAgIG1lbXNldChzLT52ZXJ0aWNhbF9icywgICAwLCBzLT5ic193aWR0aCAqIHMtPmJzX2hlaWdodCk7CisgICAgbWVtc2V0KHMtPmNiZl9sdW1hLCAgICAgIDAsIHMtPnNwcy0+bWluX3RiX3dpZHRoICogcy0+c3BzLT5taW5fdGJfaGVpZ2h0KTsKKyAgICBtZW1zZXQocy0+aXNfcGNtLCAgICAgICAgMCwgKHMtPnNwcy0+bWluX3B1X3dpZHRoICsgMSkgKiAocy0+c3BzLT5taW5fcHVfaGVpZ2h0ICsgMSkpOworICAgIG1lbXNldChzLT50YWJfc2xpY2VfYWRkcmVzcywgLTEsIHBpY19zaXplX2luX2N0YiAqIHNpemVvZigqcy0+dGFiX3NsaWNlX2FkZHJlc3MpKTsKKworICAgIHMtPmlzX2RlY29kZWQgICAgICAgID0gMDsKKyAgICBzLT5maXJzdF9uYWxfdHlwZSAgICA9IHMtPm5hbF91bml0X3R5cGU7CisKKyAgICBpZiAocy0+cHBzLT50aWxlc19lbmFibGVkX2ZsYWcpCisgICAgICAgIGxjLT5lbmRfb2ZfdGlsZXNfeCA9IHMtPnBwcy0+Y29sdW1uX3dpZHRoWzBdIDw8IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZTsKKworICAgIHJldCA9IGZmX2hldmNfc2V0X25ld19yZWYocywgJnMtPmZyYW1lLCBzLT5wb2MpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXQgPSBmZl9oZXZjX2ZyYW1lX3JwcyhzKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGNvbnN0cnVjdGluZyB0aGUgZnJhbWUgUlBTLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzLT5yZWYtPmZyYW1lLT5rZXlfZnJhbWUgPSBJU19JUkFQKHMpOworCisgICAgcmV0ID0gc2V0X3NpZGVfZGF0YShzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcy0+ZnJhbWUtPnBpY3RfdHlwZSA9IDMgLSBzLT5zaC5zbGljZV90eXBlOworCisgICAgaWYgKCFJU19JUkFQKHMpKQorICAgICAgICBmZl9oZXZjX2J1bXBfZnJhbWUocyk7CisKKyAgICBhdl9mcmFtZV91bnJlZihzLT5vdXRwdXRfZnJhbWUpOworICAgIHJldCA9IGZmX2hldmNfb3V0cHV0X2ZyYW1lKHMsIHMtPm91dHB1dF9mcmFtZSwgMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAocy0+YXZjdHgpOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgaWYgKHMtPnJlZiAmJiBzLT50aHJlYWRzX3R5cGUgPT0gRkZfVEhSRUFEX0ZSQU1FKQorICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5yZWYtPnRmLCBJTlRfTUFYLCAwKTsKKyAgICBzLT5yZWYgPSBOVUxMOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25hbF91bml0KEhFVkNDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpuYWwsIGludCBsZW5ndGgpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgICAgPSAmbGMtPmdiOworICAgIGludCBjdGJfYWRkcl90cywgcmV0OworCisgICAgcmV0ID0gaW5pdF9nZXRfYml0czgoZ2IsIG5hbCwgbGVuZ3RoKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGhsc19uYWxfdW5pdChzKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgTkFMIHVuaXQgJWQsIHNraXBwaW5nLlxuIiwKKyAgICAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfSBlbHNlIGlmICghcmV0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaCAocy0+bmFsX3VuaXRfdHlwZSkgeworICAgIGNhc2UgTkFMX1ZQUzoKKyAgICAgICAgcmV0ID0gZmZfaGV2Y19kZWNvZGVfbmFsX3ZwcyhzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTkFMX1NQUzoKKyAgICAgICAgcmV0ID0gZmZfaGV2Y19kZWNvZGVfbmFsX3NwcyhzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTkFMX1BQUzoKKyAgICAgICAgcmV0ID0gZmZfaGV2Y19kZWNvZGVfbmFsX3BwcyhzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTkFMX1NFSV9QUkVGSVg6CisgICAgY2FzZSBOQUxfU0VJX1NVRkZJWDoKKyAgICAgICAgcmV0ID0gZmZfaGV2Y19kZWNvZGVfbmFsX3NlaShzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTkFMX1RSQUlMX1I6CisgICAgY2FzZSBOQUxfVFJBSUxfTjoKKyAgICBjYXNlIE5BTF9UU0FfTjoKKyAgICBjYXNlIE5BTF9UU0FfUjoKKyAgICBjYXNlIE5BTF9TVFNBX046CisgICAgY2FzZSBOQUxfU1RTQV9SOgorICAgIGNhc2UgTkFMX0JMQV9XX0xQOgorICAgIGNhc2UgTkFMX0JMQV9XX1JBREw6CisgICAgY2FzZSBOQUxfQkxBX05fTFA6CisgICAgY2FzZSBOQUxfSURSX1dfUkFETDoKKyAgICBjYXNlIE5BTF9JRFJfTl9MUDoKKyAgICBjYXNlIE5BTF9DUkFfTlVUOgorICAgIGNhc2UgTkFMX1JBRExfTjoKKyAgICBjYXNlIE5BTF9SQURMX1I6CisgICAgY2FzZSBOQUxfUkFTTF9OOgorICAgIGNhc2UgTkFMX1JBU0xfUjoKKyAgICAgICAgcmV0ID0gaGxzX3NsaWNlX2hlYWRlcihzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmIChzLT5tYXhfcmEgPT0gSU5UX01BWCkgeworICAgICAgICAgICAgaWYgKHMtPm5hbF91bml0X3R5cGUgPT0gTkFMX0NSQV9OVVQgfHwgSVNfQkxBKHMpKSB7CisgICAgICAgICAgICAgICAgcy0+bWF4X3JhID0gcy0+cG9jOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoSVNfSURSKHMpKQorICAgICAgICAgICAgICAgICAgICBzLT5tYXhfcmEgPSBJTlRfTUlOOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChzLT5uYWxfdW5pdF90eXBlID09IE5BTF9SQVNMX1IgfHwgcy0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfUkFTTF9OKSAmJgorICAgICAgICAgICAgcy0+cG9jIDw9IHMtPm1heF9yYSkgeworICAgICAgICAgICAgcy0+aXNfZGVjb2RlZCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzLT5uYWxfdW5pdF90eXBlID09IE5BTF9SQVNMX1IgJiYgcy0+cG9jID4gcy0+bWF4X3JhKQorICAgICAgICAgICAgICAgIHMtPm1heF9yYSA9IElOVF9NSU47CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+c2guZmlyc3Rfc2xpY2VfaW5fcGljX2ZsYWcpIHsKKyAgICAgICAgICAgIHJldCA9IGhldmNfZnJhbWVfc3RhcnQocyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgaWYgKCFzLT5yZWYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmlyc3Qgc2xpY2UgaW4gYSBmcmFtZSBtaXNzaW5nLlxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+bmFsX3VuaXRfdHlwZSAhPSBzLT5maXJzdF9uYWxfdHlwZSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIk5vbi1tYXRjaGluZyBOQUwgdHlwZXMgb2YgdGhlIFZDTCBOQUxVczogJWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+Zmlyc3RfbmFsX3R5cGUsIHMtPm5hbF91bml0X3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXMtPnNoLmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgJiYKKyAgICAgICAgICAgIHMtPnNoLnNsaWNlX3R5cGUgIT0gSV9TTElDRSkgeworICAgICAgICAgICAgcmV0ID0gZmZfaGV2Y19zbGljZV9ycGwocyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb25zdHJ1Y3RpbmcgdGhlIHJlZmVyZW5jZSBsaXN0cyBmb3IgdGhlIGN1cnJlbnQgc2xpY2UuXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+dGhyZWFkc19udW1iZXIgPiAxICYmIHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzID4gMCkKKyAgICAgICAgICAgIGN0Yl9hZGRyX3RzID0gaGxzX3NsaWNlX2RhdGFfd3BwKHMsIG5hbCwgbGVuZ3RoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3RiX2FkZHJfdHMgPSBobHNfc2xpY2VfZGF0YShzKTsKKyAgICAgICAgaWYgKGN0Yl9hZGRyX3RzID49IChzLT5zcHMtPmN0Yl93aWR0aCAqIHMtPnNwcy0+Y3RiX2hlaWdodCkpIHsKKyAgICAgICAgICAgIHMtPmlzX2RlY29kZWQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN0Yl9hZGRyX3RzIDwgMCkgeworICAgICAgICAgICAgcmV0ID0gY3RiX2FkZHJfdHM7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOQUxfRU9TX05VVDoKKyAgICBjYXNlIE5BTF9FT0JfTlVUOgorICAgICAgICBzLT5zZXFfZGVjb2RlID0gKHMtPnNlcV9kZWNvZGUgKyAxKSAmIDB4ZmY7CisgICAgICAgIHMtPm1heF9yYSAgICAgPSBJTlRfTUFYOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5BTF9BVUQ6CisgICAgY2FzZSBOQUxfRkRfTlVUOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgIlNraXBwaW5nIE5BTCB1bml0ICVkXG4iLCBzLT5uYWxfdW5pdF90eXBlKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgaWYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiAwOworfQorCisvKiBGSVhNRTogVGhpcyBpcyBhZGFwdGVkIGZyb20gZmZfaDI2NF9kZWNvZGVfbmFsLCBhdm9pZGluZyBkdXBsaWNhdGlvbgorICogYmV0d2VlbiB0aGVzZSBmdW5jdGlvbnMgd291bGQgYmUgbmljZS4gKi8KK2ludCBmZl9oZXZjX2V4dHJhY3RfcmJzcChIRVZDQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIEhFVkNOQUwgKm5hbCkKK3sKKyAgICBpbnQgaSwgc2ksIGRpOworICAgIHVpbnQ4X3QgKmRzdDsKKworICAgIHMtPnNraXBwZWRfYnl0ZXMgPSAwOworI2RlZmluZSBTVEFSVENPREVfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaSArIDIgPCBsZW5ndGggJiYgc3JjW2kgKyAxXSA9PSAwICYmIHNyY1tpICsgMl0gPD0gMykgeyAgICAgXAorICAgICAgICAgICAgaWYgKHNyY1tpICsgMl0gIT0gMykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIC8qIHN0YXJ0Y29kZSwgc28gd2UgbXVzdCBiZSBwYXN0IHRoZSBlbmQgKi8gICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGxlbmd0aCA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisjaWYgSEFWRV9GQVNUX1VOQUxJR05FRAorI2RlZmluZSBGSU5EX0ZJUlNUX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaSA+IDAgJiYgIXNyY1tpXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoc3JjW2ldKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaSsrCisjaWYgSEFWRV9GQVNUXzY0QklUCisgICAgZm9yIChpID0gMDsgaSArIDEgPCBsZW5ndGg7IGkgKz0gOSkgeworICAgICAgICBpZiAoISgofkFWX1JONjRBKHNyYyArIGkpICYKKyAgICAgICAgICAgICAgIChBVl9STjY0QShzcmMgKyBpKSAtIDB4MDEwMDAxMDAwMTAwMDEwMVVMTCkpICYKKyAgICAgICAgICAgICAgMHg4MDAwODAwMDgwMDA4MDgwVUxMKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBGSU5EX0ZJUlNUX1pFUk87CisgICAgICAgIFNUQVJUQ09ERV9URVNUOworICAgICAgICBpIC09IDc7CisgICAgfQorI2Vsc2UKKyAgICBmb3IgKGkgPSAwOyBpICsgMSA8IGxlbmd0aDsgaSArPSA1KSB7CisgICAgICAgIGlmICghKCh+QVZfUk4zMkEoc3JjICsgaSkgJgorICAgICAgICAgICAgICAgKEFWX1JOMzJBKHNyYyArIGkpIC0gMHgwMTAwMDEwMVUpKSAmCisgICAgICAgICAgICAgIDB4ODAwMDgwODBVKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBGSU5EX0ZJUlNUX1pFUk87CisgICAgICAgIFNUQVJUQ09ERV9URVNUOworICAgICAgICBpIC09IDM7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfRkFTVF82NEJJVCAqLworI2Vsc2UKKyAgICBmb3IgKGkgPSAwOyBpICsgMSA8IGxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgIGlmIChzcmNbaV0pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGkgPiAwICYmIHNyY1tpIC0gMV0gPT0gMCkKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgU1RBUlRDT0RFX1RFU1Q7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfRkFTVF9VTkFMSUdORUQgKi8KKworICAgIGlmIChpID49IGxlbmd0aCAtIDEpIHsgLy8gbm8gZXNjYXBlZCAwCisgICAgICAgIG5hbC0+ZGF0YSA9IHNyYzsKKyAgICAgICAgbmFsLT5zaXplID0gbGVuZ3RoOworICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0KKworICAgIGF2X2Zhc3RfbWFsbG9jKCZuYWwtPnJic3BfYnVmZmVyLCAmbmFsLT5yYnNwX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgIGxlbmd0aCArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghbmFsLT5yYnNwX2J1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGRzdCA9IG5hbC0+cmJzcF9idWZmZXI7CisKKyAgICBtZW1jcHkoZHN0LCBzcmMsIGkpOworICAgIHNpID0gZGkgPSBpOworICAgIHdoaWxlIChzaSArIDIgPCBsZW5ndGgpIHsKKyAgICAgICAgLy8gcmVtb3ZlIGVzY2FwZXMgKHZlcnkgcmFyZSAxOjJeMjIpCisgICAgICAgIGlmIChzcmNbc2kgKyAyXSA+IDMpIHsKKyAgICAgICAgICAgIGRzdFtkaSsrXSA9IHNyY1tzaSsrXTsKKyAgICAgICAgICAgIGRzdFtkaSsrXSA9IHNyY1tzaSsrXTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmNbc2ldID09IDAgJiYgc3JjW3NpICsgMV0gPT0gMCkgeworICAgICAgICAgICAgaWYgKHNyY1tzaSArIDJdID09IDMpIHsgLy8gZXNjYXBlCisgICAgICAgICAgICAgICAgZHN0W2RpKytdID0gMDsKKyAgICAgICAgICAgICAgICBkc3RbZGkrK10gPSAwOworICAgICAgICAgICAgICAgIHNpICAgICAgICs9IDM7CisKKyAgICAgICAgICAgICAgICBzLT5za2lwcGVkX2J5dGVzKys7CisgICAgICAgICAgICAgICAgaWYgKHMtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemUgPCBzLT5za2lwcGVkX2J5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemUgKj0gMjsKKyAgICAgICAgICAgICAgICAgICAgYXZfcmVhbGxvY3BfYXJyYXkoJnMtPnNraXBwZWRfYnl0ZXNfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5za2lwcGVkX2J5dGVzX3BvcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPnNraXBwZWRfYnl0ZXNfcG9zKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHMtPnNraXBwZWRfYnl0ZXNfcG9zKQorICAgICAgICAgICAgICAgICAgICBzLT5za2lwcGVkX2J5dGVzX3Bvc1tzLT5za2lwcGVkX2J5dGVzLTFdID0gZGkgLSAxOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIC8vIG5leHQgc3RhcnQgY29kZQorICAgICAgICAgICAgICAgIGdvdG8gbnNjOworICAgICAgICB9CisKKyAgICAgICAgZHN0W2RpKytdID0gc3JjW3NpKytdOworICAgIH0KKyAgICB3aGlsZSAoc2kgPCBsZW5ndGgpCisgICAgICAgIGRzdFtkaSsrXSA9IHNyY1tzaSsrXTsKKworbnNjOgorICAgIG1lbXNldChkc3QgKyBkaSwgMCwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICBuYWwtPmRhdGEgPSBkc3Q7CisgICAgbmFsLT5zaXplID0gZGk7CisgICAgcmV0dXJuIHNpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9uYWxfdW5pdHMoSEVWQ0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgaSwgY29uc3VtZWQsIHJldCA9IDA7CisKKyAgICBzLT5yZWYgPSBOVUxMOworICAgIHMtPmxhc3RfZW9zID0gcy0+ZW9zOworICAgIHMtPmVvcyA9IDA7CisKKyAgICAvKiBzcGxpdCB0aGUgaW5wdXQgcGFja2V0IGludG8gTkFMIHVuaXRzLCBzbyB3ZSBrbm93IHRoZSB1cHBlciBib3VuZCBvbiB0aGUKKyAgICAgKiBudW1iZXIgb2Ygc2xpY2VzIGluIHRoZSBmcmFtZSAqLworICAgIHMtPm5iX25hbHMgPSAwOworICAgIHdoaWxlIChsZW5ndGggPj0gNCkgeworICAgICAgICBIRVZDTkFMICpuYWw7CisgICAgICAgIGludCBleHRyYWN0X2xlbmd0aCA9IDA7CisKKyAgICAgICAgaWYgKHMtPmlzX25hbGZmKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYWxfbGVuZ3RoX3NpemU7IGkrKykKKyAgICAgICAgICAgICAgICBleHRyYWN0X2xlbmd0aCA9IChleHRyYWN0X2xlbmd0aCA8PCA4KSB8IGJ1ZltpXTsKKyAgICAgICAgICAgIGJ1ZiAgICArPSBzLT5uYWxfbGVuZ3RoX3NpemU7CisgICAgICAgICAgICBsZW5ndGggLT0gcy0+bmFsX2xlbmd0aF9zaXplOworCisgICAgICAgICAgICBpZiAoZXh0cmFjdF9sZW5ndGggPiBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgTkFMIHVuaXQgc2l6ZS5cbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc2VhcmNoIHN0YXJ0IGNvZGUgKi8KKyAgICAgICAgICAgIHdoaWxlIChidWZbMF0gIT0gMCB8fCBidWZbMV0gIT0gMCB8fCBidWZbMl0gIT0gMSkgeworICAgICAgICAgICAgICAgICsrYnVmOworICAgICAgICAgICAgICAgIC0tbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCA0KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gc3RhcnQgY29kZSBpcyBmb3VuZC5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWYgICAgICAgICAgICs9IDM7CisgICAgICAgICAgICBsZW5ndGggICAgICAgIC09IDM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXMtPmlzX25hbGZmKQorICAgICAgICAgICAgZXh0cmFjdF9sZW5ndGggPSBsZW5ndGg7CisKKyAgICAgICAgaWYgKHMtPm5hbHNfYWxsb2NhdGVkIDwgcy0+bmJfbmFscyArIDEpIHsKKyAgICAgICAgICAgIGludCBuZXdfc2l6ZSA9IHMtPm5hbHNfYWxsb2NhdGVkICsgMTsKKyAgICAgICAgICAgIEhFVkNOQUwgKnRtcCA9IGF2X3JlYWxsb2NfYXJyYXkocy0+bmFscywgbmV3X3NpemUsIHNpemVvZigqdG1wKSk7CisgICAgICAgICAgICBpZiAoIXRtcCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5uYWxzID0gdG1wOworICAgICAgICAgICAgbWVtc2V0KHMtPm5hbHMgKyBzLT5uYWxzX2FsbG9jYXRlZCwgMCwKKyAgICAgICAgICAgICAgICAgICAobmV3X3NpemUgLSBzLT5uYWxzX2FsbG9jYXRlZCkgKiBzaXplb2YoKnRtcCkpOworICAgICAgICAgICAgYXZfcmVhbGxvY3BfYXJyYXkoJnMtPnNraXBwZWRfYnl0ZXNfbmFsLCBuZXdfc2l6ZSwgc2l6ZW9mKCpzLT5za2lwcGVkX2J5dGVzX25hbCkpOworICAgICAgICAgICAgYXZfcmVhbGxvY3BfYXJyYXkoJnMtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemVfbmFsLCBuZXdfc2l6ZSwgc2l6ZW9mKCpzLT5za2lwcGVkX2J5dGVzX3Bvc19zaXplX25hbCkpOworICAgICAgICAgICAgYXZfcmVhbGxvY3BfYXJyYXkoJnMtPnNraXBwZWRfYnl0ZXNfcG9zX25hbCwgbmV3X3NpemUsIHNpemVvZigqcy0+c2tpcHBlZF9ieXRlc19wb3NfbmFsKSk7CisgICAgICAgICAgICBzLT5za2lwcGVkX2J5dGVzX3Bvc19zaXplX25hbFtzLT5uYWxzX2FsbG9jYXRlZF0gPSAxMDI0OyAvLyBpbml0aWFsIGJ1ZmZlciBzaXplCisgICAgICAgICAgICBzLT5za2lwcGVkX2J5dGVzX3Bvc19uYWxbcy0+bmFsc19hbGxvY2F0ZWRdID0gYXZfbWFsbG9jX2FycmF5KHMtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemVfbmFsW3MtPm5hbHNfYWxsb2NhdGVkXSwgc2l6ZW9mKCpzLT5za2lwcGVkX2J5dGVzX3BvcykpOworICAgICAgICAgICAgcy0+bmFsc19hbGxvY2F0ZWQgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBzLT5za2lwcGVkX2J5dGVzX3Bvc19zaXplID0gcy0+c2tpcHBlZF9ieXRlc19wb3Nfc2l6ZV9uYWxbcy0+bmJfbmFsc107CisgICAgICAgIHMtPnNraXBwZWRfYnl0ZXNfcG9zID0gcy0+c2tpcHBlZF9ieXRlc19wb3NfbmFsW3MtPm5iX25hbHNdOworICAgICAgICBuYWwgPSAmcy0+bmFsc1tzLT5uYl9uYWxzXTsKKworICAgICAgICBjb25zdW1lZCA9IGZmX2hldmNfZXh0cmFjdF9yYnNwKHMsIGJ1ZiwgZXh0cmFjdF9sZW5ndGgsIG5hbCk7CisKKyAgICAgICAgcy0+c2tpcHBlZF9ieXRlc19uYWxbcy0+bmJfbmFsc10gPSBzLT5za2lwcGVkX2J5dGVzOworICAgICAgICBzLT5za2lwcGVkX2J5dGVzX3Bvc19zaXplX25hbFtzLT5uYl9uYWxzXSA9IHMtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemU7CisgICAgICAgIHMtPnNraXBwZWRfYnl0ZXNfcG9zX25hbFtzLT5uYl9uYWxzKytdID0gcy0+c2tpcHBlZF9ieXRlc19wb3M7CisKKworICAgICAgICBpZiAoY29uc3VtZWQgPCAwKSB7CisgICAgICAgICAgICByZXQgPSBjb25zdW1lZDsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGluaXRfZ2V0X2JpdHM4KCZzLT5IRVZDbGMtPmdiLCBuYWwtPmRhdGEsIG5hbC0+c2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBobHNfbmFsX3VuaXQocyk7CisKKyAgICAgICAgaWYgKHMtPm5hbF91bml0X3R5cGUgPT0gTkFMX0VPQl9OVVQgfHwKKyAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUgPT0gTkFMX0VPU19OVVQpCisgICAgICAgICAgICBzLT5lb3MgPSAxOworCisgICAgICAgIGJ1ZiAgICArPSBjb25zdW1lZDsKKyAgICAgICAgbGVuZ3RoIC09IGNvbnN1bWVkOworICAgIH0KKworICAgIC8qIHBhcnNlIHRoZSBOQUwgdW5pdHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfbmFsczsgaSsrKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIHMtPnNraXBwZWRfYnl0ZXMgPSBzLT5za2lwcGVkX2J5dGVzX25hbFtpXTsKKyAgICAgICAgcy0+c2tpcHBlZF9ieXRlc19wb3MgPSBzLT5za2lwcGVkX2J5dGVzX3Bvc19uYWxbaV07CisKKyAgICAgICAgcmV0ID0gZGVjb2RlX25hbF91bml0KHMsIHMtPm5hbHNbaV0uZGF0YSwgcy0+bmFsc1tpXS5zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgTkFMIHVuaXQgIyVkLlxuIiwgaSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKK2ZhaWw6CisgICAgaWYgKHMtPnJlZiAmJiBzLT50aHJlYWRzX3R5cGUgPT0gRkZfVEhSRUFEX0ZSQU1FKQorICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5yZWYtPnRmLCBJTlRfTUFYLCAwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21kNSh2b2lkICpsb2dfY3R4LCBpbnQgbGV2ZWwsIHVpbnQ4X3QgbWQ1WzE2XSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIGxldmVsLCAiJTAyIlBSSXg4LCBtZDVbaV0pOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9tZDUoSEVWQ0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZnJhbWUtPmZvcm1hdCk7CisgICAgaW50IHBpeGVsX3NoaWZ0OworICAgIGludCBpLCBqOworCisgICAgaWYgKCFkZXNjKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgcGl4ZWxfc2hpZnQgPSBkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSA+IDc7CisKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlZlcmlmeWluZyBjaGVja3N1bSBmb3IgZnJhbWUgd2l0aCBQT0MgJWQ6ICIsCisgICAgICAgICAgIHMtPnBvYyk7CisKKyAgICAvKiB0aGUgY2hlY2tzdW1zIGFyZSBMRSwgc28gd2UgaGF2ZSB0byBieXRlc3dhcCBmb3IgPjhicHAgZm9ybWF0cworICAgICAqIG9uIEJFIGFyY2hlcyAqLworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgaWYgKHBpeGVsX3NoaWZ0ICYmICFzLT5jaGVja3N1bV9idWYpIHsKKyAgICAgICAgYXZfZmFzdF9tYWxsb2MoJnMtPmNoZWNrc3VtX2J1ZiwgJnMtPmNoZWNrc3VtX2J1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBGRk1BWDMoZnJhbWUtPmxpbmVzaXplWzBdLCBmcmFtZS0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbMl0pKTsKKyAgICAgICAgaWYgKCFzLT5jaGVja3N1bV9idWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyNlbmRpZgorCisgICAgZm9yIChpID0gMDsgZnJhbWUtPmRhdGFbaV07IGkrKykgeworICAgICAgICBpbnQgd2lkdGggID0gcy0+YXZjdHgtPmNvZGVkX3dpZHRoOworICAgICAgICBpbnQgaGVpZ2h0ID0gcy0+YXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICAgICAgaW50IHcgPSAoaSA9PSAxIHx8IGkgPT0gMikgPyAod2lkdGggID4+IGRlc2MtPmxvZzJfY2hyb21hX3cpIDogd2lkdGg7CisgICAgICAgIGludCBoID0gKGkgPT0gMSB8fCBpID09IDIpID8gKGhlaWdodCA+PiBkZXNjLT5sb2cyX2Nocm9tYV9oKSA6IGhlaWdodDsKKyAgICAgICAgdWludDhfdCBtZDVbMTZdOworCisgICAgICAgIGF2X21kNV9pbml0KHMtPm1kNV9jdHgpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSBmcmFtZS0+ZGF0YVtpXSArIGogKiBmcmFtZS0+bGluZXNpemVbaV07CisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICAgICAgICAgIGlmIChwaXhlbF9zaGlmdCkgeworICAgICAgICAgICAgICAgIHMtPmJkc3AuYnN3YXAxNl9idWYoKHVpbnQxNl90ICopIHMtPmNoZWNrc3VtX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50MTZfdCAqKSBzcmMsIHcpOworICAgICAgICAgICAgICAgIHNyYyA9IHMtPmNoZWNrc3VtX2J1ZjsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgYXZfbWQ1X3VwZGF0ZShzLT5tZDVfY3R4LCBzcmMsIHcgPDwgcGl4ZWxfc2hpZnQpOworICAgICAgICB9CisgICAgICAgIGF2X21kNV9maW5hbChzLT5tZDVfY3R4LCBtZDUpOworCisgICAgICAgIGlmICghbWVtY21wKG1kNSwgcy0+bWQ1W2ldLCAxNikpIHsKKyAgICAgICAgICAgIGF2X2xvZyAgIChzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicGxhbmUgJWQgLSBjb3JyZWN0ICIsIGkpOworICAgICAgICAgICAgcHJpbnRfbWQ1KHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsIG1kNSk7CisgICAgICAgICAgICBhdl9sb2cgICAocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIjsgIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cgICAocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1pc21hdGNoaW5nIGNoZWNrc3VtIG9mIHBsYW5lICVkIC0gIiwgaSk7CisgICAgICAgICAgICBwcmludF9tZDUocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgbWQ1KTsKKyAgICAgICAgICAgIGF2X2xvZyAgIChzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiICE9ICIpOworICAgICAgICAgICAgcHJpbnRfbWQ1KHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsIHMtPm1kNVtpXSk7CisgICAgICAgICAgICBhdl9sb2cgICAocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhldmNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3Rfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgaW50IHJldDsKKyAgICBIRVZDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoIWF2cGt0LT5zaXplKSB7CisgICAgICAgIHJldCA9IGZmX2hldmNfb3V0cHV0X2ZyYW1lKHMsIGRhdGEsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgKmdvdF9vdXRwdXQgPSByZXQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHMtPnJlZiA9IE5VTEw7CisgICAgcmV0ICAgID0gZGVjb2RlX25hbF91bml0cyhzLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogdmVyaWZ5IHRoZSBTRUkgY2hlY2tzdW0gKi8KKyAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0NSQ0NIRUNLICYmIHMtPmlzX2RlY29kZWQgJiYKKyAgICAgICAgcy0+aXNfbWQ1KSB7CisgICAgICAgIHJldCA9IHZlcmlmeV9tZDUocywgcy0+cmVmLT5mcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwICYmIGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSB7CisgICAgICAgICAgICBmZl9oZXZjX3VucmVmX2ZyYW1lKHMsIHMtPnJlZiwgfjApOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5pc19tZDUgPSAwOworCisgICAgaWYgKHMtPmlzX2RlY29kZWQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJEZWNvZGVkIGZyYW1lIHdpdGggUE9DICVkLlxuIiwgcy0+cG9jKTsKKyAgICAgICAgcy0+aXNfZGVjb2RlZCA9IDA7CisgICAgfQorCisgICAgaWYgKHMtPm91dHB1dF9mcmFtZS0+YnVmWzBdKSB7CisgICAgICAgIGF2X2ZyYW1lX21vdmVfcmVmKGRhdGEsIHMtPm91dHB1dF9mcmFtZSk7CisgICAgICAgICpnb3Rfb3V0cHV0ID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBpbnQgaGV2Y19yZWZfZnJhbWUoSEVWQ0NvbnRleHQgKnMsIEhFVkNGcmFtZSAqZHN0LCBIRVZDRnJhbWUgKnNyYykKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfdGhyZWFkX3JlZl9mcmFtZSgmZHN0LT50ZiwgJnNyYy0+dGYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZHN0LT50YWJfbXZmX2J1ZiA9IGF2X2J1ZmZlcl9yZWYoc3JjLT50YWJfbXZmX2J1Zik7CisgICAgaWYgKCFkc3QtPnRhYl9tdmZfYnVmKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZHN0LT50YWJfbXZmID0gc3JjLT50YWJfbXZmOworCisgICAgZHN0LT5ycGxfdGFiX2J1ZiA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5ycGxfdGFiX2J1Zik7CisgICAgaWYgKCFkc3QtPnJwbF90YWJfYnVmKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZHN0LT5ycGxfdGFiID0gc3JjLT5ycGxfdGFiOworCisgICAgZHN0LT5ycGxfYnVmID0gYXZfYnVmZmVyX3JlZihzcmMtPnJwbF9idWYpOworICAgIGlmICghZHN0LT5ycGxfYnVmKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBkc3QtPnBvYyAgICAgICAgPSBzcmMtPnBvYzsKKyAgICBkc3QtPmN0Yl9jb3VudCAgPSBzcmMtPmN0Yl9jb3VudDsKKyAgICBkc3QtPndpbmRvdyAgICAgPSBzcmMtPndpbmRvdzsKKyAgICBkc3QtPmZsYWdzICAgICAgPSBzcmMtPmZsYWdzOworICAgIGRzdC0+c2VxdWVuY2UgICA9IHNyYy0+c2VxdWVuY2U7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCBkc3QsIH4wKTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaGV2Y19kZWNvZGVfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSEVWQ0NvbnRleHQgICAgICAgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgcGljX2FycmF5c19mcmVlKHMpOworCisgICAgYXZfZnJlZXAoJnMtPm1kNV9jdHgpOworCisgICAgZm9yKGk9MDsgaSA8IHMtPm5hbHNfYWxsb2NhdGVkOyBpKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnNraXBwZWRfYnl0ZXNfcG9zX25hbFtpXSk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZzLT5za2lwcGVkX2J5dGVzX3Bvc19zaXplX25hbCk7CisgICAgYXZfZnJlZXAoJnMtPnNraXBwZWRfYnl0ZXNfbmFsKTsKKyAgICBhdl9mcmVlcCgmcy0+c2tpcHBlZF9ieXRlc19wb3NfbmFsKTsKKworICAgIGF2X2ZyZWVwKCZzLT5jYWJhY19zdGF0ZSk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT50bXBfZnJhbWUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPm91dHB1dF9mcmFtZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+RFBCKTsgaSsrKSB7CisgICAgICAgIGZmX2hldmNfdW5yZWZfZnJhbWUocywgJnMtPkRQQltpXSwgfjApOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5EUEJbaV0uZnJhbWUpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT52cHNfbGlzdCk7IGkrKykKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZzLT52cHNfbGlzdFtpXSk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPnNwc19saXN0KTsgaSsrKQorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnMtPnNwc19saXN0W2ldKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+cHBzX2xpc3QpOyBpKyspCisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+cHBzX2xpc3RbaV0pOworICAgIHMtPnNwcyA9IE5VTEw7CisgICAgcy0+cHBzID0gTlVMTDsKKyAgICBzLT52cHMgPSBOVUxMOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZzLT5jdXJyZW50X3Nwcyk7CisKKyAgICBhdl9mcmVlcCgmcy0+c2guZW50cnlfcG9pbnRfb2Zmc2V0KTsKKyAgICBhdl9mcmVlcCgmcy0+c2gub2Zmc2V0KTsKKyAgICBhdl9mcmVlcCgmcy0+c2guc2l6ZSk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgcy0+dGhyZWFkc19udW1iZXI7IGkrKykgeworICAgICAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsY0xpc3RbaV07CisgICAgICAgIGlmIChsYykgeworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPkhFVkNsY0xpc3RbaV0pOworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPnNMaXN0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+SEVWQ2xjID09IHMtPkhFVkNsY0xpc3RbMF0pCisgICAgICAgIHMtPkhFVkNsYyA9IE5VTEw7CisgICAgYXZfZnJlZXAoJnMtPkhFVkNsY0xpc3RbMF0pOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5hbHNfYWxsb2NhdGVkOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZzLT5uYWxzW2ldLnJic3BfYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmcy0+bmFscyk7CisgICAgcy0+bmFsc19hbGxvY2F0ZWQgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBoZXZjX2luaXRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSEVWQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIHMtPkhFVkNsYyA9IGF2X21hbGxvY3ooc2l6ZW9mKEhFVkNMb2NhbENvbnRleHQpKTsKKyAgICBpZiAoIXMtPkhFVkNsYykKKyAgICAgICAgZ290byBmYWlsOworICAgIHMtPkhFVkNsY0xpc3RbMF0gPSBzLT5IRVZDbGM7CisgICAgcy0+c0xpc3RbMF0gPSBzOworCisgICAgcy0+Y2FiYWNfc3RhdGUgPSBhdl9tYWxsb2MoSEVWQ19DT05URVhUUyk7CisgICAgaWYgKCFzLT5jYWJhY19zdGF0ZSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcy0+dG1wX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPnRtcF9mcmFtZSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcy0+b3V0cHV0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPm91dHB1dF9mcmFtZSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykgeworICAgICAgICBzLT5EUEJbaV0uZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICBpZiAoIXMtPkRQQltpXS5mcmFtZSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgcy0+RFBCW2ldLnRmLmYgPSBzLT5EUEJbaV0uZnJhbWU7CisgICAgfQorCisgICAgcy0+bWF4X3JhID0gSU5UX01BWDsKKworICAgIHMtPm1kNV9jdHggPSBhdl9tZDVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPm1kNV9jdHgpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZmX2Jzd2FwZHNwX2luaXQoJnMtPmJkc3ApOworCisgICAgcy0+Y29udGV4dF9pbml0aWFsaXplZCA9IDE7CisgICAgcy0+ZW9zID0gMDsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGhldmNfZGVjb2RlX2ZyZWUoYXZjdHgpOworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKK3N0YXRpYyBpbnQgaGV2Y191cGRhdGVfdGhyZWFkX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZDb2RlY0NvbnRleHQgKnNyYykKK3sKKyAgICBIRVZDQ29udGV4dCAqcyAgPSBkc3QtPnByaXZfZGF0YTsKKyAgICBIRVZDQ29udGV4dCAqczAgPSBzcmMtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKCFzLT5jb250ZXh0X2luaXRpYWxpemVkKSB7CisgICAgICAgIHJldCA9IGhldmNfaW5pdF9jb250ZXh0KGRzdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+RFBCKTsgaSsrKSB7CisgICAgICAgIGZmX2hldmNfdW5yZWZfZnJhbWUocywgJnMtPkRQQltpXSwgfjApOworICAgICAgICBpZiAoczAtPkRQQltpXS5mcmFtZS0+YnVmWzBdKSB7CisgICAgICAgICAgICByZXQgPSBoZXZjX3JlZl9mcmFtZShzLCAmcy0+RFBCW2ldLCAmczAtPkRQQltpXSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPnNwcyAhPSBzMC0+c3BzKQorICAgICAgICBzLT5zcHMgPSBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT52cHNfbGlzdCk7IGkrKykgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnMtPnZwc19saXN0W2ldKTsKKyAgICAgICAgaWYgKHMwLT52cHNfbGlzdFtpXSkgeworICAgICAgICAgICAgcy0+dnBzX2xpc3RbaV0gPSBhdl9idWZmZXJfcmVmKHMwLT52cHNfbGlzdFtpXSk7CisgICAgICAgICAgICBpZiAoIXMtPnZwc19saXN0W2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+c3BzX2xpc3QpOyBpKyspIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZzLT5zcHNfbGlzdFtpXSk7CisgICAgICAgIGlmIChzMC0+c3BzX2xpc3RbaV0pIHsKKyAgICAgICAgICAgIHMtPnNwc19saXN0W2ldID0gYXZfYnVmZmVyX3JlZihzMC0+c3BzX2xpc3RbaV0pOworICAgICAgICAgICAgaWYgKCFzLT5zcHNfbGlzdFtpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPnBwc19saXN0KTsgaSsrKSB7CisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+cHBzX2xpc3RbaV0pOworICAgICAgICBpZiAoczAtPnBwc19saXN0W2ldKSB7CisgICAgICAgICAgICBzLT5wcHNfbGlzdFtpXSA9IGF2X2J1ZmZlcl9yZWYoczAtPnBwc19saXN0W2ldKTsKKyAgICAgICAgICAgIGlmICghcy0+cHBzX2xpc3RbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+Y3VycmVudF9zcHMpOworICAgIGlmIChzMC0+Y3VycmVudF9zcHMpIHsKKyAgICAgICAgcy0+Y3VycmVudF9zcHMgPSBhdl9idWZmZXJfcmVmKHMwLT5jdXJyZW50X3Nwcyk7CisgICAgICAgIGlmICghcy0+Y3VycmVudF9zcHMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmIChzLT5zcHMgIT0gczAtPnNwcykKKyAgICAgICAgaWYgKChyZXQgPSBzZXRfc3BzKHMsIHMwLT5zcHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgcy0+c2VxX2RlY29kZSA9IHMwLT5zZXFfZGVjb2RlOworICAgIHMtPnNlcV9vdXRwdXQgPSBzMC0+c2VxX291dHB1dDsKKyAgICBzLT5wb2NUaWQwICAgID0gczAtPnBvY1RpZDA7CisgICAgcy0+bWF4X3JhICAgICA9IHMwLT5tYXhfcmE7CisgICAgcy0+ZW9zICAgICAgICA9IHMwLT5lb3M7CisKKyAgICBzLT5pc19uYWxmZiAgICAgICAgPSBzMC0+aXNfbmFsZmY7CisgICAgcy0+bmFsX2xlbmd0aF9zaXplID0gczAtPm5hbF9sZW5ndGhfc2l6ZTsKKworICAgIHMtPnRocmVhZHNfbnVtYmVyICAgICAgPSBzMC0+dGhyZWFkc19udW1iZXI7CisgICAgcy0+dGhyZWFkc190eXBlICAgICAgICA9IHMwLT50aHJlYWRzX3R5cGU7CisKKyAgICBpZiAoczAtPmVvcykgeworICAgICAgICBzLT5zZXFfZGVjb2RlID0gKHMtPnNlcV9kZWNvZGUgKyAxKSAmIDB4ZmY7CisgICAgICAgIHMtPm1heF9yYSA9IElOVF9NQVg7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGV2Y19kZWNvZGVfZXh0cmFkYXRhKEhFVkNDb250ZXh0ICpzKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPmF2Y3R4OworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIGludCByZXQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPiAzICYmCisgICAgICAgIChhdmN0eC0+ZXh0cmFkYXRhWzBdIHx8IGF2Y3R4LT5leHRyYWRhdGFbMV0gfHwKKyAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFbMl0gPiAxKSkgeworICAgICAgICAvKiBJdCBzZWVtcyB0aGUgZXh0cmFkYXRhIGlzIGVuY29kZWQgYXMgaHZjQyBmb3JtYXQuCisgICAgICAgICAqIFRlbXBvcmFyaWx5LCB3ZSBzdXBwb3J0IGNvbmZpZ3VyYXRpb25WZXJzaW9uPT0wIHVudGlsIDE0NDk2LTE1IDNyZAorICAgICAgICAgKiBpcyBmaW5hbGl6ZWQuIFdoZW4gZmluYWxpemVkLCBjb25maWd1cmF0aW9uVmVyc2lvbiB3aWxsIGJlIDEgYW5kIHdlCisgICAgICAgICAqIGNhbiByZWNvZ25pemUgaHZjQyBieSBjaGVja2luZyBpZiBhdmN0eC0+ZXh0cmFkYXRhWzBdPT0xIG9yIG5vdC4gKi8KKyAgICAgICAgaW50IGksIGosIG51bV9hcnJheXMsIG5hbF9sZW5fc2l6ZTsKKworICAgICAgICBzLT5pc19uYWxmZiA9IDE7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDIxKTsKKyAgICAgICAgbmFsX2xlbl9zaXplID0gKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYikgJiAzKSArIDE7CisgICAgICAgIG51bV9hcnJheXMgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisKKyAgICAgICAgLyogbmFsIHVuaXRzIGluIHRoZSBodmNDIGFsd2F5cyBoYXZlIGxlbmd0aCBjb2RlZCB3aXRoIDIgYnl0ZXMsCisgICAgICAgICAqIHNvIHB1dCBhIGZha2UgbmFsX2xlbmd0aF9zaXplID0gMiB3aGlsZSBwYXJzaW5nIHRoZW0gKi8KKyAgICAgICAgcy0+bmFsX2xlbmd0aF9zaXplID0gMjsKKworICAgICAgICAvKiBEZWNvZGUgbmFsIHVuaXRzIGZyb20gaHZjQy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9hcnJheXM7IGkrKykgeworICAgICAgICAgICAgaW50IHR5cGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpICYgMHgzZjsKKyAgICAgICAgICAgIGludCBjbnQgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNudDsgaisrKSB7CisgICAgICAgICAgICAgICAgLy8gKzIgZm9yIHRoZSBuYWwgc2l6ZSBmaWVsZAorICAgICAgICAgICAgICAgIGludCBuYWxzaXplID0gYnl0ZXN0cmVhbTJfcGVla19iZTE2KCZnYikgKyAyOworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgbmFsc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIE5BTCB1bml0IHNpemUgaW4gZXh0cmFkYXRhLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldCA9IGRlY29kZV9uYWxfdW5pdHMocywgZ2IuYnVmZmVyLCBuYWxzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWNvZGluZyBuYWwgdW5pdCAlZCAlZCBmcm9tIGh2Y0MgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgaSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCBuYWxzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vdyBzdG9yZSByaWdodCBuYWwgbGVuZ3RoIHNpemUsIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHBhcnNlCisgICAgICAgICAqIGFsbCBvdGhlciBuYWxzICovCisgICAgICAgIHMtPm5hbF9sZW5ndGhfc2l6ZSA9IG5hbF9sZW5fc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5pc19uYWxmZiA9IDA7CisgICAgICAgIHJldCA9IGRlY29kZV9uYWxfdW5pdHMocywgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGhldmNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEhFVkNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgZmZfaW5pdF9jYWJhY19zdGF0ZXMoKTsKKworICAgIGF2Y3R4LT5pbnRlcm5hbC0+YWxsb2NhdGVfcHJvZ3Jlc3MgPSAxOworCisgICAgcmV0ID0gaGV2Y19pbml0X2NvbnRleHQoYXZjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcy0+ZW5hYmxlX3BhcmFsbGVsX3RpbGVzID0gMDsKKyAgICBzLT5waWN0dXJlX3N0cnVjdCA9IDA7CisKKyAgICBpZihhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKQorICAgICAgICBzLT50aHJlYWRzX251bWJlciA9IGF2Y3R4LT50aHJlYWRfY291bnQ7CisgICAgZWxzZQorICAgICAgICBzLT50aHJlYWRzX251bWJlciA9IDE7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID4gMCAmJiBhdmN0eC0+ZXh0cmFkYXRhKSB7CisgICAgICAgIHJldCA9IGhldmNfZGVjb2RlX2V4dHJhZGF0YShzKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGhldmNfZGVjb2RlX2ZyZWUoYXZjdHgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSAmJiBhdmN0eC0+dGhyZWFkX2NvdW50ID4gMSkKKyAgICAgICAgICAgIHMtPnRocmVhZHNfdHlwZSA9IEZGX1RIUkVBRF9GUkFNRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+dGhyZWFkc190eXBlID0gRkZfVEhSRUFEX1NMSUNFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBoZXZjX2luaXRfdGhyZWFkX2NvcHkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEhFVkNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworCisgICAgcmV0ID0gaGV2Y19pbml0X2NvbnRleHQoYXZjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhldmNfZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIRVZDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZmZfaGV2Y19mbHVzaF9kcGIocyk7CisgICAgcy0+bWF4X3JhID0gSU5UX01BWDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSEVWQ0NvbnRleHQsIHgpCisjZGVmaW5lIFBBUiAoQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSkKKworc3RhdGljIGNvbnN0IEFWUHJvZmlsZSBwcm9maWxlc1tdID0geworICAgIHsgRkZfUFJPRklMRV9IRVZDX01BSU4sICAgICAgICAgICAgICAgICAiTWFpbiIgICAgICAgICAgICAgICAgfSwKKyAgICB7IEZGX1BST0ZJTEVfSEVWQ19NQUlOXzEwLCAgICAgICAgICAgICAgIk1haW4gMTAiICAgICAgICAgICAgIH0sCisgICAgeyBGRl9QUk9GSUxFX0hFVkNfTUFJTl9TVElMTF9QSUNUVVJFLCAgICJNYWluIFN0aWxsIFBpY3R1cmUiICB9LAorICAgIHsgRkZfUFJPRklMRV9IRVZDX1JFWFQsICAgICAgICAgICAgICAgICAiUmV4dCIgIH0sCisgICAgeyBGRl9QUk9GSUxFX1VOS05PV04gfSwKK307CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiYXBwbHlfZGVmZGlzcHdpbiIsICJBcHBseSBkZWZhdWx0IGRpc3BsYXkgd2luZG93IGZyb20gVlVJIiwgT0ZGU0VUKGFwcGx5X2RlZmRpc3B3aW4pLAorICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIFBBUiB9LAorICAgIHsgInN0cmljdC1kaXNwbGF5d2luIiwgInN0cmljbHkgYXBwbHkgZGVmYXVsdCBkaXNwbGF5IHdpbmRvdyBzaXplIiwgT0ZGU0VUKGFwcGx5X2RlZmRpc3B3aW4pLAorICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIFBBUiB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaGV2Y19kZWNvZGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIkhFVkMgZGVjb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2hldmNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgID0gImhldmMiLAorICAgIC5sb25nX25hbWUgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSEVWQyAoSGlnaCBFZmZpY2llbmN5IFZpZGVvIENvZGluZykiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IRVZDLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2YoSEVWQ0NvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICAgICAgICAgPSAmaGV2Y19kZWNvZGVyX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBoZXZjX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSBoZXZjX2RlY29kZV9mcmVlLAorICAgIC5kZWNvZGUgICAgICAgICAgICAgICAgPSBoZXZjX2RlY29kZV9mcmFtZSwKKyAgICAuZmx1c2ggICAgICAgICAgICAgICAgID0gaGV2Y19kZWNvZGVfZmx1c2gsCisgICAgLnVwZGF0ZV90aHJlYWRfY29udGV4dCA9IGhldmNfdXBkYXRlX3RocmVhZF9jb250ZXh0LAorICAgIC5pbml0X3RocmVhZF9jb3B5ICAgICAgPSBoZXZjX2luaXRfdGhyZWFkX2NvcHksCisgICAgLmNhcGFiaWxpdGllcyAgICAgICAgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfREVMQVkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUyB8IENPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5wcm9maWxlcyAgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChwcm9maWxlcyksCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Yy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZGVmYmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oZXZjLmgKQEAgLTAsMCArMSwxMDQyIEBACisvKgorICogSEVWQyB2aWRlbyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxMyBHdWlsbGF1bWUgTWFydHJlcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSEVWQ19ICisjZGVmaW5lIEFWQ09ERUNfSEVWQ19ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21kNS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisjaW5jbHVkZSAiY2FiYWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImhldmNwcmVkLmgiCisjaW5jbHVkZSAiaGV2Y2RzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAidmlkZW9kc3AuaCIKKworI2RlZmluZSBNQVhfRFBCX1NJWkUgMTYgLy8gQS40LjEKKyNkZWZpbmUgTUFYX1JFRlMgMTYKKworI2RlZmluZSBNQVhfTkJfVEhSRUFEUyAxNgorI2RlZmluZSBTSElGVF9DVEJfV1BQIDIKKworLyoqCisgKiA3LjQuMi4xCisgKi8KKyNkZWZpbmUgTUFYX1NVQl9MQVlFUlMgNworI2RlZmluZSBNQVhfVlBTX0NPVU5UIDE2CisjZGVmaW5lIE1BWF9TUFNfQ09VTlQgMzIKKyNkZWZpbmUgTUFYX1BQU19DT1VOVCAyNTYKKyNkZWZpbmUgTUFYX1NIT1JUX1RFUk1fUlBTX0NPVU5UIDY0CisjZGVmaW5lIE1BWF9DVV9TSVpFIDEyOAorCisvL1RPRE86IGNoZWNrIGlmIHRoaXMgaXMgcmVhbGx5IHRoZSBtYXhpbXVtCisjZGVmaW5lIE1BWF9UUkFOU0ZPUk1fREVQVEggNQorCisjZGVmaW5lIE1BWF9UQl9TSVpFIDMyCisjZGVmaW5lIE1BWF9MT0cyX0NUQl9TSVpFIDYKKyNkZWZpbmUgTUFYX1FQIDUxCisjZGVmaW5lIERFRkFVTFRfSU5UUkFfVENfT0ZGU0VUIDIKKworI2RlZmluZSBIRVZDX0NPTlRFWFRTIDE5OQorCisjZGVmaW5lIE1SR19NQVhfTlVNX0NBTkRTICAgICA1CisKKyNkZWZpbmUgTDAgMAorI2RlZmluZSBMMSAxCisKKyNkZWZpbmUgRVBFTF9FWFRSQV9CRUZPUkUgMQorI2RlZmluZSBFUEVMX0VYVFJBX0FGVEVSICAyCisjZGVmaW5lIEVQRUxfRVhUUkEgICAgICAgIDMKKyNkZWZpbmUgUVBFTF9FWFRSQV9CRUZPUkUgMworI2RlZmluZSBRUEVMX0VYVFJBX0FGVEVSICA0CisjZGVmaW5lIFFQRUxfRVhUUkEgICAgICAgIDcKKworI2RlZmluZSBFREdFX0VNVV9CVUZGRVJfU1RSSURFIDgwCisKKy8qKgorICogVmFsdWUgb2YgdGhlIGx1bWEgc2FtcGxlIGF0IHBvc2l0aW9uICh4LCB5KSBpbiB0aGUgMkQgYXJyYXkgdGFiLgorICovCisjZGVmaW5lIFNBTVBMRSh0YWIsIHgsIHkpICgodGFiKVsoeSkgKiBzLT5zcHMtPndpZHRoICsgKHgpXSkKKyNkZWZpbmUgU0FNUExFX0NUQih0YWIsIHgsIHkpICgodGFiKVsoeSkgKiBtaW5fY2Jfd2lkdGggKyAoeCldKQorCisjZGVmaW5lIElTX0lEUihzKSAoKHMpLT5uYWxfdW5pdF90eXBlID09IE5BTF9JRFJfV19SQURMIHx8IChzKS0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfSURSX05fTFApCisjZGVmaW5lIElTX0JMQShzKSAoKHMpLT5uYWxfdW5pdF90eXBlID09IE5BTF9CTEFfV19SQURMIHx8IChzKS0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfQkxBX1dfTFAgfHwgXAorICAgICAgICAgICAgICAgICAgIChzKS0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfQkxBX05fTFApCisjZGVmaW5lIElTX0lSQVAocykgKChzKS0+bmFsX3VuaXRfdHlwZSA+PSAxNiAmJiAocyktPm5hbF91bml0X3R5cGUgPD0gMjMpCisKKy8qKgorICogVGFibGUgNy0zOiBOQUwgdW5pdCB0eXBlIGNvZGVzCisgKi8KK2VudW0gTkFMVW5pdFR5cGUgeworICAgIE5BTF9UUkFJTF9OICAgID0gMCwKKyAgICBOQUxfVFJBSUxfUiAgICA9IDEsCisgICAgTkFMX1RTQV9OICAgICAgPSAyLAorICAgIE5BTF9UU0FfUiAgICAgID0gMywKKyAgICBOQUxfU1RTQV9OICAgICA9IDQsCisgICAgTkFMX1NUU0FfUiAgICAgPSA1LAorICAgIE5BTF9SQURMX04gICAgID0gNiwKKyAgICBOQUxfUkFETF9SICAgICA9IDcsCisgICAgTkFMX1JBU0xfTiAgICAgPSA4LAorICAgIE5BTF9SQVNMX1IgICAgID0gOSwKKyAgICBOQUxfQkxBX1dfTFAgICA9IDE2LAorICAgIE5BTF9CTEFfV19SQURMID0gMTcsCisgICAgTkFMX0JMQV9OX0xQICAgPSAxOCwKKyAgICBOQUxfSURSX1dfUkFETCA9IDE5LAorICAgIE5BTF9JRFJfTl9MUCAgID0gMjAsCisgICAgTkFMX0NSQV9OVVQgICAgPSAyMSwKKyAgICBOQUxfVlBTICAgICAgICA9IDMyLAorICAgIE5BTF9TUFMgICAgICAgID0gMzMsCisgICAgTkFMX1BQUyAgICAgICAgPSAzNCwKKyAgICBOQUxfQVVEICAgICAgICA9IDM1LAorICAgIE5BTF9FT1NfTlVUICAgID0gMzYsCisgICAgTkFMX0VPQl9OVVQgICAgPSAzNywKKyAgICBOQUxfRkRfTlVUICAgICA9IDM4LAorICAgIE5BTF9TRUlfUFJFRklYID0gMzksCisgICAgTkFMX1NFSV9TVUZGSVggPSA0MCwKK307CisKK2VudW0gUlBTVHlwZSB7CisgICAgU1RfQ1VSUl9CRUYgPSAwLAorICAgIFNUX0NVUlJfQUZULAorICAgIFNUX0ZPTEwsCisgICAgTFRfQ1VSUiwKKyAgICBMVF9GT0xMLAorICAgIE5CX1JQU19UWVBFLAorfTsKKworZW51bSBTbGljZVR5cGUgeworICAgIEJfU0xJQ0UgPSAwLAorICAgIFBfU0xJQ0UgPSAxLAorICAgIElfU0xJQ0UgPSAyLAorfTsKKworZW51bSBTeW50YXhFbGVtZW50IHsKKyAgICBTQU9fTUVSR0VfRkxBRyA9IDAsCisgICAgU0FPX1RZUEVfSURYLAorICAgIFNBT19FT19DTEFTUywKKyAgICBTQU9fQkFORF9QT1NJVElPTiwKKyAgICBTQU9fT0ZGU0VUX0FCUywKKyAgICBTQU9fT0ZGU0VUX1NJR04sCisgICAgRU5EX09GX1NMSUNFX0ZMQUcsCisgICAgU1BMSVRfQ09ESU5HX1VOSVRfRkxBRywKKyAgICBDVV9UUkFOU1FVQU5UX0JZUEFTU19GTEFHLAorICAgIFNLSVBfRkxBRywKKyAgICBDVV9RUF9ERUxUQSwKKyAgICBQUkVEX01PREVfRkxBRywKKyAgICBQQVJUX01PREUsCisgICAgUENNX0ZMQUcsCisgICAgUFJFVl9JTlRSQV9MVU1BX1BSRURfRkxBRywKKyAgICBNUE1fSURYLAorICAgIFJFTV9JTlRSQV9MVU1BX1BSRURfTU9ERSwKKyAgICBJTlRSQV9DSFJPTUFfUFJFRF9NT0RFLAorICAgIE1FUkdFX0ZMQUcsCisgICAgTUVSR0VfSURYLAorICAgIElOVEVSX1BSRURfSURDLAorICAgIFJFRl9JRFhfTDAsCisgICAgUkVGX0lEWF9MMSwKKyAgICBBQlNfTVZEX0dSRUFURVIwX0ZMQUcsCisgICAgQUJTX01WRF9HUkVBVEVSMV9GTEFHLAorICAgIEFCU19NVkRfTUlOVVMyLAorICAgIE1WRF9TSUdOX0ZMQUcsCisgICAgTVZQX0xYX0ZMQUcsCisgICAgTk9fUkVTSURVQUxfREFUQV9GTEFHLAorICAgIFNQTElUX1RSQU5TRk9STV9GTEFHLAorICAgIENCRl9MVU1BLAorICAgIENCRl9DQl9DUiwKKyAgICBUUkFOU0ZPUk1fU0tJUF9GTEFHLAorICAgIEVYUExJQ0lUX1JEUENNX0ZMQUcsCisgICAgRVhQTElDSVRfUkRQQ01fRElSX0ZMQUcsCisgICAgTEFTVF9TSUdOSUZJQ0FOVF9DT0VGRl9YX1BSRUZJWCwKKyAgICBMQVNUX1NJR05JRklDQU5UX0NPRUZGX1lfUFJFRklYLAorICAgIExBU1RfU0lHTklGSUNBTlRfQ09FRkZfWF9TVUZGSVgsCisgICAgTEFTVF9TSUdOSUZJQ0FOVF9DT0VGRl9ZX1NVRkZJWCwKKyAgICBTSUdOSUZJQ0FOVF9DT0VGRl9HUk9VUF9GTEFHLAorICAgIFNJR05JRklDQU5UX0NPRUZGX0ZMQUcsCisgICAgQ09FRkZfQUJTX0xFVkVMX0dSRUFURVIxX0ZMQUcsCisgICAgQ09FRkZfQUJTX0xFVkVMX0dSRUFURVIyX0ZMQUcsCisgICAgQ09FRkZfQUJTX0xFVkVMX1JFTUFJTklORywKKyAgICBDT0VGRl9TSUdOX0ZMQUcsCisgICAgTE9HMl9SRVNfU0NBTEVfQUJTLAorICAgIFJFU19TQ0FMRV9TSUdOX0ZMQUcsCisgICAgQ1VfQ0hST01BX1FQX09GRlNFVF9GTEFHLAorICAgIENVX0NIUk9NQV9RUF9PRkZTRVRfSURYLAorfTsKKworZW51bSBQYXJ0TW9kZSB7CisgICAgUEFSVF8yTngyTiA9IDAsCisgICAgUEFSVF8yTnhOICA9IDEsCisgICAgUEFSVF9OeDJOICA9IDIsCisgICAgUEFSVF9OeE4gICA9IDMsCisgICAgUEFSVF8yTnhuVSA9IDQsCisgICAgUEFSVF8yTnhuRCA9IDUsCisgICAgUEFSVF9uTHgyTiA9IDYsCisgICAgUEFSVF9uUngyTiA9IDcsCit9OworCitlbnVtIFByZWRNb2RlIHsKKyAgICBNT0RFX0lOVEVSID0gMCwKKyAgICBNT0RFX0lOVFJBLAorICAgIE1PREVfU0tJUCwKK307CisKK2VudW0gSW50ZXJQcmVkSWRjIHsKKyAgICBQUkVEX0wwID0gMCwKKyAgICBQUkVEX0wxLAorICAgIFBSRURfQkksCit9OworCitlbnVtIFByZWRGbGFnIHsKKyAgICBQRl9JTlRSQSA9IDAsCisgICAgUEZfTDAsCisgICAgUEZfTDEsCisgICAgUEZfQkksCit9OworCitlbnVtIEludHJhUHJlZE1vZGUgeworICAgIElOVFJBX1BMQU5BUiA9IDAsCisgICAgSU5UUkFfREMsCisgICAgSU5UUkFfQU5HVUxBUl8yLAorICAgIElOVFJBX0FOR1VMQVJfMywKKyAgICBJTlRSQV9BTkdVTEFSXzQsCisgICAgSU5UUkFfQU5HVUxBUl81LAorICAgIElOVFJBX0FOR1VMQVJfNiwKKyAgICBJTlRSQV9BTkdVTEFSXzcsCisgICAgSU5UUkFfQU5HVUxBUl84LAorICAgIElOVFJBX0FOR1VMQVJfOSwKKyAgICBJTlRSQV9BTkdVTEFSXzEwLAorICAgIElOVFJBX0FOR1VMQVJfMTEsCisgICAgSU5UUkFfQU5HVUxBUl8xMiwKKyAgICBJTlRSQV9BTkdVTEFSXzEzLAorICAgIElOVFJBX0FOR1VMQVJfMTQsCisgICAgSU5UUkFfQU5HVUxBUl8xNSwKKyAgICBJTlRSQV9BTkdVTEFSXzE2LAorICAgIElOVFJBX0FOR1VMQVJfMTcsCisgICAgSU5UUkFfQU5HVUxBUl8xOCwKKyAgICBJTlRSQV9BTkdVTEFSXzE5LAorICAgIElOVFJBX0FOR1VMQVJfMjAsCisgICAgSU5UUkFfQU5HVUxBUl8yMSwKKyAgICBJTlRSQV9BTkdVTEFSXzIyLAorICAgIElOVFJBX0FOR1VMQVJfMjMsCisgICAgSU5UUkFfQU5HVUxBUl8yNCwKKyAgICBJTlRSQV9BTkdVTEFSXzI1LAorICAgIElOVFJBX0FOR1VMQVJfMjYsCisgICAgSU5UUkFfQU5HVUxBUl8yNywKKyAgICBJTlRSQV9BTkdVTEFSXzI4LAorICAgIElOVFJBX0FOR1VMQVJfMjksCisgICAgSU5UUkFfQU5HVUxBUl8zMCwKKyAgICBJTlRSQV9BTkdVTEFSXzMxLAorICAgIElOVFJBX0FOR1VMQVJfMzIsCisgICAgSU5UUkFfQU5HVUxBUl8zMywKKyAgICBJTlRSQV9BTkdVTEFSXzM0LAorfTsKKworZW51bSBTQU9UeXBlIHsKKyAgICBTQU9fTk9UX0FQUExJRUQgPSAwLAorICAgIFNBT19CQU5ELAorICAgIFNBT19FREdFLAorICAgIFNBT19BUFBMSUVECit9OworCitlbnVtIFNBT0VPQ2xhc3MgeworICAgIFNBT19FT19IT1JJWiA9IDAsCisgICAgU0FPX0VPX1ZFUlQsCisgICAgU0FPX0VPXzEzNUQsCisgICAgU0FPX0VPXzQ1RCwKK307CisKK2VudW0gU2NhblR5cGUgeworICAgIFNDQU5fRElBRyA9IDAsCisgICAgU0NBTl9IT1JJWiwKKyAgICBTQ0FOX1ZFUlQsCit9OworCit0eXBlZGVmIHN0cnVjdCBTaG9ydFRlcm1SUFMgeworICAgIHVuc2lnbmVkIGludCBudW1fbmVnYXRpdmVfcGljczsKKyAgICBpbnQgbnVtX2RlbHRhX3BvY3M7CisgICAgaW50MzJfdCBkZWx0YV9wb2NbMzJdOworICAgIHVpbnQ4X3QgdXNlZFszMl07Cit9IFNob3J0VGVybVJQUzsKKwordHlwZWRlZiBzdHJ1Y3QgTG9uZ1Rlcm1SUFMgeworICAgIGludCAgICAgcG9jWzMyXTsKKyAgICB1aW50OF90IHVzZWRbMzJdOworICAgIHVpbnQ4X3QgbmJfcmVmczsKK30gTG9uZ1Rlcm1SUFM7CisKK3R5cGVkZWYgc3RydWN0IFJlZlBpY0xpc3QgeworICAgIHN0cnVjdCBIRVZDRnJhbWUgKnJlZltNQVhfUkVGU107CisgICAgaW50IGxpc3RbTUFYX1JFRlNdOworICAgIGludCBpc0xvbmdUZXJtW01BWF9SRUZTXTsKKyAgICBpbnQgbmJfcmVmczsKK30gUmVmUGljTGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgUmVmUGljTGlzdFRhYiB7CisgICAgUmVmUGljTGlzdCByZWZQaWNMaXN0WzJdOworfSBSZWZQaWNMaXN0VGFiOworCit0eXBlZGVmIHN0cnVjdCBIRVZDV2luZG93IHsKKyAgICBpbnQgbGVmdF9vZmZzZXQ7CisgICAgaW50IHJpZ2h0X29mZnNldDsKKyAgICBpbnQgdG9wX29mZnNldDsKKyAgICBpbnQgYm90dG9tX29mZnNldDsKK30gSEVWQ1dpbmRvdzsKKwordHlwZWRlZiBzdHJ1Y3QgVlVJIHsKKyAgICBBVlJhdGlvbmFsIHNhcjsKKworICAgIGludCBvdmVyc2Nhbl9pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICBpbnQgb3ZlcnNjYW5fYXBwcm9wcmlhdGVfZmxhZzsKKworICAgIGludCB2aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWc7CisgICAgaW50IHZpZGVvX2Zvcm1hdDsKKyAgICBpbnQgdmlkZW9fZnVsbF9yYW5nZV9mbGFnOworICAgIGludCBjb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3QgY29sb3VyX3ByaW1hcmllczsKKyAgICB1aW50OF90IHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljOworICAgIHVpbnQ4X3QgbWF0cml4X2NvZWZmczsKKworICAgIGludCBjaHJvbWFfbG9jX2luZm9fcHJlc2VudF9mbGFnOworICAgIGludCBjaHJvbWFfc2FtcGxlX2xvY190eXBlX3RvcF9maWVsZDsKKyAgICBpbnQgY2hyb21hX3NhbXBsZV9sb2NfdHlwZV9ib3R0b21fZmllbGQ7CisgICAgaW50IG5ldXRyYV9jaHJvbWFfaW5kaWNhdGlvbl9mbGFnOworCisgICAgaW50IGZpZWxkX3NlcV9mbGFnOworICAgIGludCBmcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZzsKKworICAgIGludCBkZWZhdWx0X2Rpc3BsYXlfd2luZG93X2ZsYWc7CisgICAgSEVWQ1dpbmRvdyBkZWZfZGlzcF93aW47CisKKyAgICBpbnQgdnVpX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50MzJfdCB2dWlfbnVtX3VuaXRzX2luX3RpY2s7CisgICAgdWludDMyX3QgdnVpX3RpbWVfc2NhbGU7CisgICAgaW50IHZ1aV9wb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnOworICAgIGludCB2dWlfbnVtX3RpY2tzX3BvY19kaWZmX29uZV9taW51czE7CisgICAgaW50IHZ1aV9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7CisKKyAgICBpbnQgYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWc7CisgICAgaW50IHRpbGVzX2ZpeGVkX3N0cnVjdHVyZV9mbGFnOworICAgIGludCBtb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWc7CisgICAgaW50IHJlc3RyaWN0ZWRfcmVmX3BpY19saXN0c19mbGFnOworICAgIGludCBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjOworICAgIGludCBtYXhfYnl0ZXNfcGVyX3BpY19kZW5vbTsKKyAgICBpbnQgbWF4X2JpdHNfcGVyX21pbl9jdV9kZW5vbTsKKyAgICBpbnQgbG9nMl9tYXhfbXZfbGVuZ3RoX2hvcml6b250YWw7CisgICAgaW50IGxvZzJfbWF4X212X2xlbmd0aF92ZXJ0aWNhbDsKK30gVlVJOworCit0eXBlZGVmIHN0cnVjdCBQVExDb21tb24geworICAgIHVpbnQ4X3QgcHJvZmlsZV9zcGFjZTsKKyAgICB1aW50OF90IHRpZXJfZmxhZzsKKyAgICB1aW50OF90IHByb2ZpbGVfaWRjOworICAgIHVpbnQ4X3QgcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdbMzJdOworICAgIHVpbnQ4X3QgbGV2ZWxfaWRjOworICAgIHVpbnQ4X3QgcHJvZ3Jlc3NpdmVfc291cmNlX2ZsYWc7CisgICAgdWludDhfdCBpbnRlcmxhY2VkX3NvdXJjZV9mbGFnOworICAgIHVpbnQ4X3Qgbm9uX3BhY2tlZF9jb25zdHJhaW50X2ZsYWc7CisgICAgdWludDhfdCBmcmFtZV9vbmx5X2NvbnN0cmFpbnRfZmxhZzsKK30gUFRMQ29tbW9uOworCit0eXBlZGVmIHN0cnVjdCBQVEwgeworICAgIFBUTENvbW1vbiBnZW5lcmFsX3B0bDsKKyAgICBQVExDb21tb24gc3ViX2xheWVyX3B0bFtNQVhfU1VCX0xBWUVSU107CisKKyAgICB1aW50OF90IHN1Yl9sYXllcl9wcm9maWxlX3ByZXNlbnRfZmxhZ1tNQVhfU1VCX0xBWUVSU107CisgICAgdWludDhfdCBzdWJfbGF5ZXJfbGV2ZWxfcHJlc2VudF9mbGFnW01BWF9TVUJfTEFZRVJTXTsKK30gUFRMOworCit0eXBlZGVmIHN0cnVjdCBIRVZDVlBTIHsKKyAgICB1aW50OF90IHZwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWc7CisgICAgaW50IHZwc19tYXhfbGF5ZXJzOworICAgIGludCB2cHNfbWF4X3N1Yl9sYXllcnM7IC8vLzwgdnBzX21heF90ZW1wb3JhbF9sYXllcnNfbWludXMxICsgMQorCisgICAgUFRMIHB0bDsKKyAgICBpbnQgdnBzX3N1Yl9sYXllcl9vcmRlcmluZ19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICB1bnNpZ25lZCBpbnQgdnBzX21heF9kZWNfcGljX2J1ZmZlcmluZ1tNQVhfU1VCX0xBWUVSU107CisgICAgdW5zaWduZWQgaW50IHZwc19udW1fcmVvcmRlcl9waWNzW01BWF9TVUJfTEFZRVJTXTsKKyAgICB1bnNpZ25lZCBpbnQgdnBzX21heF9sYXRlbmN5X2luY3JlYXNlW01BWF9TVUJfTEFZRVJTXTsKKyAgICBpbnQgdnBzX21heF9sYXllcl9pZDsKKyAgICBpbnQgdnBzX251bV9sYXllcl9zZXRzOyAvLy88IHZwc19udW1fbGF5ZXJfc2V0c19taW51czEgKyAxCisgICAgdWludDhfdCB2cHNfdGltaW5nX2luZm9fcHJlc2VudF9mbGFnOworICAgIHVpbnQzMl90IHZwc19udW1fdW5pdHNfaW5fdGljazsKKyAgICB1aW50MzJfdCB2cHNfdGltZV9zY2FsZTsKKyAgICB1aW50OF90IHZwc19wb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnOworICAgIGludCB2cHNfbnVtX3RpY2tzX3BvY19kaWZmX29uZTsgLy8vPCB2cHNfbnVtX3RpY2tzX3BvY19kaWZmX29uZV9taW51czEgKyAxCisgICAgaW50IHZwc19udW1faHJkX3BhcmFtZXRlcnM7Cit9IEhFVkNWUFM7CisKK3R5cGVkZWYgc3RydWN0IFNjYWxpbmdMaXN0IHsKKyAgICAvKiBUaGlzIGlzIGEgbGl0dGxlIHdhc3RlZnVsLCBzaW5jZSBzaXplSUQgMCBvbmx5IG5lZWRzIDggY29lZmZzLAorICAgICAqIGFuZCBzaXplIElEIDMgb25seSBoYXMgMiBhcnJheXMsIG5vdCA2LiAqLworICAgIHVpbnQ4X3Qgc2xbNF1bNl1bNjRdOworICAgIHVpbnQ4X3Qgc2xfZGNbMl1bNl07Cit9IFNjYWxpbmdMaXN0OworCit0eXBlZGVmIHN0cnVjdCBIRVZDU1BTIHsKKyAgICB1bnNpZ25lZCB2cHNfaWQ7CisgICAgaW50IGNocm9tYV9mb3JtYXRfaWRjOworICAgIHVpbnQ4X3Qgc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWc7CisKKyAgICAvLy88IG91dHB1dCAoaS5lLiBjcm9wcGVkKSB2YWx1ZXMKKyAgICBpbnQgb3V0cHV0X3dpZHRoLCBvdXRwdXRfaGVpZ2h0OworICAgIEhFVkNXaW5kb3cgb3V0cHV0X3dpbmRvdzsKKworICAgIEhFVkNXaW5kb3cgcGljX2NvbmZfd2luOworCisgICAgaW50IGJpdF9kZXB0aDsKKyAgICBpbnQgcGl4ZWxfc2hpZnQ7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisKKyAgICB1bnNpZ25lZCBpbnQgbG9nMl9tYXhfcG9jX2xzYjsKKyAgICBpbnQgcGNtX2VuYWJsZWRfZmxhZzsKKworICAgIGludCBtYXhfc3ViX2xheWVyczsKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgbWF4X2RlY19waWNfYnVmZmVyaW5nOworICAgICAgICBpbnQgbnVtX3Jlb3JkZXJfcGljczsKKyAgICAgICAgaW50IG1heF9sYXRlbmN5X2luY3JlYXNlOworICAgIH0gdGVtcG9yYWxfbGF5ZXJbTUFYX1NVQl9MQVlFUlNdOworCisgICAgVlVJIHZ1aTsKKyAgICBQVEwgcHRsOworCisgICAgdWludDhfdCBzY2FsaW5nX2xpc3RfZW5hYmxlX2ZsYWc7CisgICAgU2NhbGluZ0xpc3Qgc2NhbGluZ19saXN0OworCisgICAgdW5zaWduZWQgaW50IG5iX3N0X3JwczsKKyAgICBTaG9ydFRlcm1SUFMgc3RfcnBzW01BWF9TSE9SVF9URVJNX1JQU19DT1VOVF07CisKKyAgICB1aW50OF90IGFtcF9lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCBzYW9fZW5hYmxlZDsKKworICAgIHVpbnQ4X3QgbG9uZ190ZXJtX3JlZl9waWNzX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50MTZfdCBsdF9yZWZfcGljX3BvY19sc2Jfc3BzWzMyXTsKKyAgICB1aW50OF90IHVzZWRfYnlfY3Vycl9waWNfbHRfc3BzX2ZsYWdbMzJdOworICAgIHVpbnQ4X3QgbnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHM7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50OF90IGJpdF9kZXB0aDsKKyAgICAgICAgdWludDhfdCBiaXRfZGVwdGhfY2hyb21hOworICAgICAgICB1bnNpZ25lZCBpbnQgbG9nMl9taW5fcGNtX2NiX3NpemU7CisgICAgICAgIHVuc2lnbmVkIGludCBsb2cyX21heF9wY21fY2Jfc2l6ZTsKKyAgICAgICAgdWludDhfdCBsb29wX2ZpbHRlcl9kaXNhYmxlX2ZsYWc7CisgICAgfSBwY207CisgICAgdWludDhfdCBzcHNfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IHNwc19zdHJvbmdfaW50cmFfc21vb3RoaW5nX2VuYWJsZV9mbGFnOworCisgICAgdW5zaWduZWQgaW50IGxvZzJfbWluX2NiX3NpemU7CisgICAgdW5zaWduZWQgaW50IGxvZzJfZGlmZl9tYXhfbWluX2NvZGluZ19ibG9ja19zaXplOworICAgIHVuc2lnbmVkIGludCBsb2cyX21pbl90Yl9zaXplOworICAgIHVuc2lnbmVkIGludCBsb2cyX21heF90cmFmb19zaXplOworICAgIHVuc2lnbmVkIGludCBsb2cyX2N0Yl9zaXplOworICAgIHVuc2lnbmVkIGludCBsb2cyX21pbl9wdV9zaXplOworCisgICAgaW50IG1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyOworICAgIGludCBtYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRyYTsKKworICAgIGludCB0cmFuc2Zvcm1fc2tpcF9yb3RhdGlvbl9lbmFibGVkX2ZsYWc7CisgICAgaW50IHRyYW5zZm9ybV9za2lwX2NvbnRleHRfZW5hYmxlZF9mbGFnOworICAgIGludCBpbXBsaWNpdF9yZHBjbV9lbmFibGVkX2ZsYWc7CisgICAgaW50IGV4cGxpY2l0X3JkcGNtX2VuYWJsZWRfZmxhZzsKKyAgICBpbnQgaW50cmFfc21vb3RoaW5nX2Rpc2FibGVkX2ZsYWc7CisgICAgaW50IHBlcnNpc3RlbnRfcmljZV9hZGFwdGF0aW9uX2VuYWJsZWRfZmxhZzsKKworICAgIC8vLzwgY29kZWQgZnJhbWUgZGltZW5zaW9uIGluIHZhcmlvdXMgdW5pdHMKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgY3RiX3dpZHRoOworICAgIGludCBjdGJfaGVpZ2h0OworICAgIGludCBjdGJfc2l6ZTsKKyAgICBpbnQgbWluX2NiX3dpZHRoOworICAgIGludCBtaW5fY2JfaGVpZ2h0OworICAgIGludCBtaW5fdGJfd2lkdGg7CisgICAgaW50IG1pbl90Yl9oZWlnaHQ7CisgICAgaW50IG1pbl9wdV93aWR0aDsKKyAgICBpbnQgbWluX3B1X2hlaWdodDsKKyAgICBpbnQgdGJfbWFzazsKKworICAgIGludCBoc2hpZnRbM107CisgICAgaW50IHZzaGlmdFszXTsKKworICAgIGludCBxcF9iZF9vZmZzZXQ7Cit9IEhFVkNTUFM7CisKK3R5cGVkZWYgc3RydWN0IEhFVkNQUFMgeworICAgIHVuc2lnbmVkIGludCBzcHNfaWQ7IC8vLzwgc2VxX3BhcmFtZXRlcl9zZXRfaWQKKworICAgIHVpbnQ4X3Qgc2lnbl9kYXRhX2hpZGluZ19mbGFnOworCisgICAgdWludDhfdCBjYWJhY19pbml0X3ByZXNlbnRfZmxhZzsKKworICAgIGludCBudW1fcmVmX2lkeF9sMF9kZWZhdWx0X2FjdGl2ZTsgLy8vPCBudW1fcmVmX2lkeF9sMF9kZWZhdWx0X2FjdGl2ZV9taW51czEgKyAxCisgICAgaW50IG51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlOyAvLy88IG51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlX21pbnVzMSArIDEKKyAgICBpbnQgcGljX2luaXRfcXBfbWludXMyNjsKKworICAgIHVpbnQ4X3QgY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnOworICAgIHVpbnQ4X3QgdHJhbnNmb3JtX3NraXBfZW5hYmxlZF9mbGFnOworCisgICAgdWludDhfdCBjdV9xcF9kZWx0YV9lbmFibGVkX2ZsYWc7CisgICAgaW50IGRpZmZfY3VfcXBfZGVsdGFfZGVwdGg7CisKKyAgICBpbnQgY2JfcXBfb2Zmc2V0OworICAgIGludCBjcl9xcF9vZmZzZXQ7CisgICAgdWludDhfdCBwaWNfc2xpY2VfbGV2ZWxfY2hyb21hX3FwX29mZnNldHNfcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3Qgd2VpZ2h0ZWRfcHJlZF9mbGFnOworICAgIHVpbnQ4X3Qgd2VpZ2h0ZWRfYmlwcmVkX2ZsYWc7CisgICAgdWludDhfdCBvdXRwdXRfZmxhZ19wcmVzZW50X2ZsYWc7CisgICAgdWludDhfdCB0cmFuc3F1YW50X2J5cGFzc19lbmFibGVfZmxhZzsKKworICAgIHVpbnQ4X3QgZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRzX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IHRpbGVzX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IGVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnOworCisgICAgaW50IG51bV90aWxlX2NvbHVtbnM7ICAgLy8vPCBudW1fdGlsZV9jb2x1bW5zX21pbnVzMSArIDEKKyAgICBpbnQgbnVtX3RpbGVfcm93czsgICAgICAvLy88IG51bV90aWxlX3Jvd3NfbWludXMxICsgMQorICAgIHVpbnQ4X3QgdW5pZm9ybV9zcGFjaW5nX2ZsYWc7CisgICAgdWludDhfdCBsb29wX2ZpbHRlcl9hY3Jvc3NfdGlsZXNfZW5hYmxlZF9mbGFnOworCisgICAgdWludDhfdCBzZXFfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWc7CisKKyAgICB1aW50OF90IGRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3QgZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZW5hYmxlZF9mbGFnOworICAgIHVpbnQ4X3QgZGlzYWJsZV9kYmY7CisgICAgaW50IGJldGFfb2Zmc2V0OyAgICAvLy88IGJldGFfb2Zmc2V0X2RpdjIgKiAyCisgICAgaW50IHRjX29mZnNldDsgICAgICAvLy88IHRjX29mZnNldF9kaXYyICogMgorCisgICAgdWludDhfdCBzY2FsaW5nX2xpc3RfZGF0YV9wcmVzZW50X2ZsYWc7CisgICAgU2NhbGluZ0xpc3Qgc2NhbGluZ19saXN0OworCisgICAgdWludDhfdCBsaXN0c19tb2RpZmljYXRpb25fcHJlc2VudF9mbGFnOworICAgIGludCBsb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsOyAvLy88IGxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyICsgMgorICAgIGludCBudW1fZXh0cmFfc2xpY2VfaGVhZGVyX2JpdHM7CisgICAgdWludDhfdCBzbGljZV9oZWFkZXJfZXh0ZW5zaW9uX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IGxvZzJfbWF4X3RyYW5zZm9ybV9za2lwX2Jsb2NrX3NpemU7CisgICAgdWludDhfdCBjcm9zc19jb21wb25lbnRfcHJlZGljdGlvbl9lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCBjaHJvbWFfcXBfb2Zmc2V0X2xpc3RfZW5hYmxlZF9mbGFnOworICAgIHVpbnQ4X3QgZGlmZl9jdV9jaHJvbWFfcXBfb2Zmc2V0X2RlcHRoOworICAgIHVpbnQ4X3QgY2hyb21hX3FwX29mZnNldF9saXN0X2xlbl9taW51czE7CisgICAgaW50OF90ICBjYl9xcF9vZmZzZXRfbGlzdFs1XTsKKyAgICBpbnQ4X3QgIGNyX3FwX29mZnNldF9saXN0WzVdOworICAgIHVpbnQ4X3QgbG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2x1bWE7CisgICAgdWludDhfdCBsb2cyX3Nhb19vZmZzZXRfc2NhbGVfY2hyb21hOworCisgICAgLy8gSW5mZXJyZWQgcGFyYW1ldGVycworICAgIHVuc2lnbmVkIGludCAqY29sdW1uX3dpZHRoOyAgLy8vPCBDb2x1bW5XaWR0aAorICAgIHVuc2lnbmVkIGludCAqcm93X2hlaWdodDsgICAgLy8vPCBSb3dIZWlnaHQKKyAgICB1bnNpZ25lZCBpbnQgKmNvbF9iZDsgICAgICAgIC8vLzwgQ29sQmQKKyAgICB1bnNpZ25lZCBpbnQgKnJvd19iZDsgICAgICAgIC8vLzwgUm93QmQKKyAgICBpbnQgKmNvbF9pZHhYOworCisgICAgaW50ICpjdGJfYWRkcl9yc190b190czsgLy8vPCBDdGJBZGRyUlNUb1RTCisgICAgaW50ICpjdGJfYWRkcl90c190b19yczsgLy8vPCBDdGJBZGRyVFNUb1JTCisgICAgaW50ICp0aWxlX2lkOyAgICAgICAgICAgLy8vPCBUaWxlSWQKKyAgICBpbnQgKnRpbGVfcG9zX3JzOyAgICAgICAvLy88IFRpbGVQb3NSUworICAgIGludCAqbWluX3RiX2FkZHJfenM7ICAgIC8vLzwgTWluVGJBZGRyWlMKKyAgICBpbnQgKm1pbl90Yl9hZGRyX3pzX3RhYjsvLy88IE1pblRiQWRkclpTCit9IEhFVkNQUFM7CisKK3R5cGVkZWYgc3RydWN0IFNsaWNlSGVhZGVyIHsKKyAgICB1bnNpZ25lZCBpbnQgcHBzX2lkOworCisgICAgLy8vPCBhZGRyZXNzIChpbiByYXN0ZXIgb3JkZXIpIG9mIHRoZSBmaXJzdCBibG9jayBpbiB0aGUgY3VycmVudCBzbGljZSBzZWdtZW50CisgICAgdW5zaWduZWQgaW50ICAgc2xpY2Vfc2VnbWVudF9hZGRyOworICAgIC8vLzwgYWRkcmVzcyAoaW4gcmFzdGVyIG9yZGVyKSBvZiB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGN1cnJlbnQgc2xpY2UKKyAgICB1bnNpZ25lZCBpbnQgICBzbGljZV9hZGRyOworCisgICAgZW51bSBTbGljZVR5cGUgc2xpY2VfdHlwZTsKKworICAgIGludCBwaWNfb3JkZXJfY250X2xzYjsKKworICAgIHVpbnQ4X3QgZmlyc3Rfc2xpY2VfaW5fcGljX2ZsYWc7CisgICAgdWludDhfdCBkZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnOworICAgIHVpbnQ4X3QgcGljX291dHB1dF9mbGFnOworICAgIHVpbnQ4X3QgY29sb3VyX3BsYW5lX2lkOworCisgICAgLy8vPCBSUFMgY29kZWQgaW4gdGhlIHNsaWNlIGhlYWRlciBpdHNlbGYgaXMgc3RvcmVkIGhlcmUKKyAgICBTaG9ydFRlcm1SUFMgc2xpY2VfcnBzOworICAgIGNvbnN0IFNob3J0VGVybVJQUyAqc2hvcnRfdGVybV9ycHM7CisgICAgTG9uZ1Rlcm1SUFMgbG9uZ190ZXJtX3JwczsKKyAgICB1bnNpZ25lZCBpbnQgbGlzdF9lbnRyeV9seFsyXVszMl07CisKKyAgICB1aW50OF90IHJwbF9tb2RpZmljYXRpb25fZmxhZ1syXTsKKyAgICB1aW50OF90IG5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWc7CisgICAgdWludDhfdCBzbGljZV90ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnOworCisgICAgdW5zaWduZWQgaW50IG5iX3JlZnNbMl07CisKKyAgICB1aW50OF90IHNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1szXTsKKyAgICB1aW50OF90IG12ZF9sMV96ZXJvX2ZsYWc7CisKKyAgICB1aW50OF90IGNhYmFjX2luaXRfZmxhZzsKKyAgICB1aW50OF90IGRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfZmxhZzsgLy8vPCBzbGljZV9oZWFkZXJfZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnCisgICAgdWludDhfdCBzbGljZV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IGNvbGxvY2F0ZWRfbGlzdDsKKworICAgIHVuc2lnbmVkIGludCBjb2xsb2NhdGVkX3JlZl9pZHg7CisKKyAgICBpbnQgc2xpY2VfcXBfZGVsdGE7CisgICAgaW50IHNsaWNlX2NiX3FwX29mZnNldDsKKyAgICBpbnQgc2xpY2VfY3JfcXBfb2Zmc2V0OworCisgICAgdWludDhfdCBjdV9jaHJvbWFfcXBfb2Zmc2V0X2VuYWJsZWRfZmxhZzsKKworICAgIGludCBiZXRhX29mZnNldDsgICAgLy8vPCBiZXRhX29mZnNldF9kaXYyICogMgorICAgIGludCB0Y19vZmZzZXQ7ICAgICAgLy8vPCB0Y19vZmZzZXRfZGl2MiAqIDIKKworICAgIHVuc2lnbmVkIGludCBtYXhfbnVtX21lcmdlX2NhbmQ7IC8vLzwgNSAtIDVfbWludXNfbWF4X251bV9tZXJnZV9jYW5kCisKKyAgICBpbnQgKmVudHJ5X3BvaW50X29mZnNldDsKKyAgICBpbnQgKiBvZmZzZXQ7CisgICAgaW50ICogc2l6ZTsKKyAgICBpbnQgbnVtX2VudHJ5X3BvaW50X29mZnNldHM7CisKKyAgICBpbnQ4X3Qgc2xpY2VfcXA7CisKKyAgICB1aW50OF90IGx1bWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgaW50MTZfdCBjaHJvbWFfbG9nMl93ZWlnaHRfZGVub207CisKKyAgICBpbnQxNl90IGx1bWFfd2VpZ2h0X2wwWzE2XTsKKyAgICBpbnQxNl90IGNocm9tYV93ZWlnaHRfbDBbMTZdWzJdOworICAgIGludDE2X3QgY2hyb21hX3dlaWdodF9sMVsxNl1bMl07CisgICAgaW50MTZfdCBsdW1hX3dlaWdodF9sMVsxNl07CisKKyAgICBpbnQxNl90IGx1bWFfb2Zmc2V0X2wwWzE2XTsKKyAgICBpbnQxNl90IGNocm9tYV9vZmZzZXRfbDBbMTZdWzJdOworCisgICAgaW50MTZfdCBsdW1hX29mZnNldF9sMVsxNl07CisgICAgaW50MTZfdCBjaHJvbWFfb2Zmc2V0X2wxWzE2XVsyXTsKKworICAgIGludCBzbGljZV9jdGJfYWRkcl9yczsKK30gU2xpY2VIZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IENvZGluZ1VuaXQgeworICAgIGludCB4OworICAgIGludCB5OworCisgICAgZW51bSBQcmVkTW9kZSBwcmVkX21vZGU7ICAgIC8vLzwgUHJlZE1vZGUKKyAgICBlbnVtIFBhcnRNb2RlIHBhcnRfbW9kZTsgICAgLy8vPCBQYXJ0TW9kZQorCisgICAgLy8gSW5mZXJyZWQgcGFyYW1ldGVycworICAgIHVpbnQ4X3QgaW50cmFfc3BsaXRfZmxhZzsgICAvLy88IEludHJhU3BsaXRGbGFnCisgICAgdWludDhfdCBtYXhfdHJhZm9fZGVwdGg7ICAgIC8vLzwgTWF4VHJhZm9EZXB0aAorICAgIHVpbnQ4X3QgY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZzsKK30gQ29kaW5nVW5pdDsKKwordHlwZWRlZiBzdHJ1Y3QgTXYgeworICAgIGludDE2X3QgeDsgIC8vLzwgaG9yaXpvbnRhbCBjb21wb25lbnQgb2YgbW90aW9uIHZlY3RvcgorICAgIGludDE2X3QgeTsgIC8vLzwgdmVydGljYWwgY29tcG9uZW50IG9mIG1vdGlvbiB2ZWN0b3IKK30gTXY7CisKK3R5cGVkZWYgc3RydWN0IE12RmllbGQgeworICAgIERFQ0xBUkVfQUxJR05FRCg0LCBNdiwgbXYpWzJdOworICAgIGludDhfdCByZWZfaWR4WzJdOworICAgIGludDhfdCBwcmVkX2ZsYWc7Cit9IE12RmllbGQ7CisKK3R5cGVkZWYgc3RydWN0IE5laWdoYm91ckF2YWlsYWJsZSB7CisgICAgaW50IGNhbmRfYm90dG9tX2xlZnQ7CisgICAgaW50IGNhbmRfbGVmdDsKKyAgICBpbnQgY2FuZF91cDsKKyAgICBpbnQgY2FuZF91cF9sZWZ0OworICAgIGludCBjYW5kX3VwX3JpZ2h0OworICAgIGludCBjYW5kX3VwX3JpZ2h0X3NhcDsKK30gTmVpZ2hib3VyQXZhaWxhYmxlOworCit0eXBlZGVmIHN0cnVjdCBQcmVkaWN0aW9uVW5pdCB7CisgICAgaW50IG1wbV9pZHg7CisgICAgaW50IHJlbV9pbnRyYV9sdW1hX3ByZWRfbW9kZTsKKyAgICB1aW50OF90IGludHJhX3ByZWRfbW9kZVs0XTsKKyAgICBNdiBtdmQ7CisgICAgdWludDhfdCBtZXJnZV9mbGFnOworICAgIHVpbnQ4X3QgaW50cmFfcHJlZF9tb2RlX2NbNF07CisgICAgdWludDhfdCBjaHJvbWFfbW9kZV9jWzRdOworfSBQcmVkaWN0aW9uVW5pdDsKKwordHlwZWRlZiBzdHJ1Y3QgVHJhbnNmb3JtVW5pdCB7CisgICAgaW50IGN1X3FwX2RlbHRhOworCisgICAgaW50IHJlc19zY2FsZV92YWw7CisKKyAgICAvLyBJbmZlcnJlZCBwYXJhbWV0ZXJzOworICAgIGludCBpbnRyYV9wcmVkX21vZGU7CisgICAgaW50IGludHJhX3ByZWRfbW9kZV9jOworICAgIGludCBjaHJvbWFfbW9kZV9jOworICAgIHVpbnQ4X3QgaXNfY3VfcXBfZGVsdGFfY29kZWQ7CisgICAgdWludDhfdCBpc19jdV9jaHJvbWFfcXBfb2Zmc2V0X2NvZGVkOworICAgIGludDhfdCAgY3VfcXBfb2Zmc2V0X2NiOworICAgIGludDhfdCAgY3VfcXBfb2Zmc2V0X2NyOworICAgIHVpbnQ4X3QgY3Jvc3NfcGY7Cit9IFRyYW5zZm9ybVVuaXQ7CisKK3R5cGVkZWYgc3RydWN0IERCUGFyYW1zIHsKKyAgICBpbnQgYmV0YV9vZmZzZXQ7CisgICAgaW50IHRjX29mZnNldDsKK30gREJQYXJhbXM7CisKKyNkZWZpbmUgSEVWQ19GUkFNRV9GTEFHX09VVFBVVCAgICAoMSA8PCAwKQorI2RlZmluZSBIRVZDX0ZSQU1FX0ZMQUdfU0hPUlRfUkVGICgxIDw8IDEpCisjZGVmaW5lIEhFVkNfRlJBTUVfRkxBR19MT05HX1JFRiAgKDEgPDwgMikKKyNkZWZpbmUgSEVWQ19GUkFNRV9GTEFHX0JVTVBJTkcgICAoMSA8PCAzKQorCit0eXBlZGVmIHN0cnVjdCBIRVZDRnJhbWUgeworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIFRocmVhZEZyYW1lIHRmOworICAgIE12RmllbGQgKnRhYl9tdmY7CisgICAgUmVmUGljTGlzdCAqcmVmUGljTGlzdDsKKyAgICBSZWZQaWNMaXN0VGFiICoqcnBsX3RhYjsKKyAgICBpbnQgY3RiX2NvdW50OworICAgIGludCBwb2M7CisgICAgc3RydWN0IEhFVkNGcmFtZSAqY29sbG9jYXRlZF9yZWY7CisKKyAgICBIRVZDV2luZG93IHdpbmRvdzsKKworICAgIEFWQnVmZmVyUmVmICp0YWJfbXZmX2J1ZjsKKyAgICBBVkJ1ZmZlclJlZiAqcnBsX3RhYl9idWY7CisgICAgQVZCdWZmZXJSZWYgKnJwbF9idWY7CisKKyAgICAvKioKKyAgICAgKiBBIHNlcXVlbmNlIGNvdW50ZXIsIHNvIHRoYXQgb2xkIGZyYW1lcyBhcmUgb3V0cHV0IGZpcnN0CisgICAgICogYWZ0ZXIgYSBQT0MgcmVzZXQKKyAgICAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsKKworICAgIC8qKgorICAgICAqIEEgY29tYmluYXRpb24gb2YgSEVWQ19GUkFNRV9GTEFHXyoKKyAgICAgKi8KKyAgICB1aW50OF90IGZsYWdzOworfSBIRVZDRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IEhFVkNOQUwgeworICAgIHVpbnQ4X3QgKnJic3BfYnVmZmVyOworICAgIGludCByYnNwX2J1ZmZlcl9zaXplOworCisgICAgaW50IHNpemU7CisgICAgY29uc3QgdWludDhfdCAqZGF0YTsKK30gSEVWQ05BTDsKKwordHlwZWRlZiBzdHJ1Y3QgSEVWQ0xvY2FsQ29udGV4dCB7CisgICAgdWludDhfdCBjYWJhY19zdGF0ZVtIRVZDX0NPTlRFWFRTXTsKKworICAgIHVpbnQ4X3Qgc3RhdF9jb2VmZls0XTsKKworICAgIHVpbnQ4X3QgZmlyc3RfcXBfZ3JvdXA7CisKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIENBQkFDQ29udGV4dCBjYzsKKworICAgIGludDhfdCBxcF95OworICAgIGludDhfdCBjdXJyX3FwX3k7CisKKyAgICBpbnQgcVB5X3ByZWQ7CisKKyAgICBUcmFuc2Zvcm1Vbml0IHR1OworCisgICAgdWludDhfdCBjdGJfbGVmdF9mbGFnOworICAgIHVpbnQ4X3QgY3RiX3VwX2ZsYWc7CisgICAgdWludDhfdCBjdGJfdXBfcmlnaHRfZmxhZzsKKyAgICB1aW50OF90IGN0Yl91cF9sZWZ0X2ZsYWc7CisgICAgaW50ICAgICBlbmRfb2ZfdGlsZXNfeDsKKyAgICBpbnQgICAgIGVuZF9vZl90aWxlc195OworICAgIC8qICs3IGlzIGZvciBzdWJwaXhlbCBpbnRlcnBvbGF0aW9uLCAqMiBmb3IgaGlnaCBiaXQgZGVwdGhzICovCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCB1aW50OF90LCBlZGdlX2VtdV9idWZmZXIpWyhNQVhfUEJfU0laRSArIDcpICogRURHRV9FTVVfQlVGRkVSX1NUUklERSAqIDJdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgdWludDhfdCwgZWRnZV9lbXVfYnVmZmVyMilbKE1BWF9QQl9TSVpFICsgNykgKiBFREdFX0VNVV9CVUZGRVJfU1RSSURFICogMl07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCB0bXAgW01BWF9QQl9TSVpFICogTUFYX1BCX1NJWkVdKTsKKworICAgIGludCBjdF9kZXB0aDsKKyAgICBDb2RpbmdVbml0IGN1OworICAgIFByZWRpY3Rpb25Vbml0IHB1OworICAgIE5laWdoYm91ckF2YWlsYWJsZSBuYTsKKworI2RlZmluZSBCT1VOREFSWV9MRUZUX1NMSUNFICAgICAoMSA8PCAwKQorI2RlZmluZSBCT1VOREFSWV9MRUZUX1RJTEUgICAgICAoMSA8PCAxKQorI2RlZmluZSBCT1VOREFSWV9VUFBFUl9TTElDRSAgICAoMSA8PCAyKQorI2RlZmluZSBCT1VOREFSWV9VUFBFUl9USUxFICAgICAoMSA8PCAzKQorICAgIC8qIHByb3BlcnRpZXMgb2YgdGhlIGJvdW5kYXJ5IG9mIHRoZSBjdXJyZW50IENUQiBmb3IgdGhlIHB1cnBvc2VzCisgICAgICogb2YgdGhlIGRlYmxvY2tpbmcgZmlsdGVyICovCisgICAgaW50IGJvdW5kYXJ5X2ZsYWdzOworfSBIRVZDTG9jYWxDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBIRVZDQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqYzsgIC8vIG5lZWRlZCBieSBwcml2YXRlIGF2b3B0aW9ucworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKworICAgIHN0cnVjdCBIRVZDQ29udGV4dCAgKnNMaXN0W01BWF9OQl9USFJFQURTXTsKKworICAgIEhFVkNMb2NhbENvbnRleHQgICAgKkhFVkNsY0xpc3RbTUFYX05CX1RIUkVBRFNdOworICAgIEhFVkNMb2NhbENvbnRleHQgICAgKkhFVkNsYzsKKworICAgIHVpbnQ4X3QgICAgICAgICAgICAgdGhyZWFkc190eXBlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgdGhyZWFkc19udW1iZXI7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdpZHRoOworICAgIGludCAgICAgICAgICAgICAgICAgaGVpZ2h0OworCisgICAgdWludDhfdCAqY2FiYWNfc3RhdGU7CisKKyAgICAvKiogMSBpZiB0aGUgaW5kZXBlbmRlbnQgc2xpY2Ugc2VnbWVudCBoZWFkZXIgd2FzIHN1Y2Nlc3NmdWxseSBwYXJzZWQgKi8KKyAgICB1aW50OF90IHNsaWNlX2luaXRpYWxpemVkOworCisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgQVZGcmFtZSAqc2FvX2ZyYW1lOworICAgIEFWRnJhbWUgKnRtcF9mcmFtZTsKKyAgICBBVkZyYW1lICpvdXRwdXRfZnJhbWU7CisKKyAgICBjb25zdCBIRVZDVlBTICp2cHM7CisgICAgY29uc3QgSEVWQ1NQUyAqc3BzOworICAgIGNvbnN0IEhFVkNQUFMgKnBwczsKKyAgICBBVkJ1ZmZlclJlZiAqdnBzX2xpc3RbTUFYX1ZQU19DT1VOVF07CisgICAgQVZCdWZmZXJSZWYgKnNwc19saXN0W01BWF9TUFNfQ09VTlRdOworICAgIEFWQnVmZmVyUmVmICpwcHNfbGlzdFtNQVhfUFBTX0NPVU5UXTsKKworICAgIEFWQnVmZmVyUmVmICpjdXJyZW50X3NwczsKKworICAgIEFWQnVmZmVyUG9vbCAqdGFiX212Zl9wb29sOworICAgIEFWQnVmZmVyUG9vbCAqcnBsX3RhYl9wb29sOworCisgICAgLy8vPCBjYW5kaWRhdGUgcmVmZXJlbmNlcyBmb3IgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBSZWZQaWNMaXN0IHJwc1s1XTsKKworICAgIFNsaWNlSGVhZGVyIHNoOworICAgIFNBT1BhcmFtcyAqc2FvOworICAgIERCUGFyYW1zICpkZWJsb2NrOworICAgIGVudW0gTkFMVW5pdFR5cGUgbmFsX3VuaXRfdHlwZTsKKyAgICBpbnQgdGVtcG9yYWxfaWQ7ICAvLy88IHRlbXBvcmFsX2lkX3BsdXMxIC0gMQorICAgIEhFVkNGcmFtZSAqcmVmOworICAgIEhFVkNGcmFtZSBEUEJbMzJdOworICAgIGludCBwb2M7CisgICAgaW50IHBvY1RpZDA7CisgICAgaW50IHNsaWNlX2lkeDsgLy8vPCBudW1iZXIgb2YgdGhlIHNsaWNlIGJlaW5nIGN1cnJlbnRseSBkZWNvZGVkCisgICAgaW50IGVvczsgICAgICAgLy8vPCBjdXJyZW50IHBhY2tldCBjb250YWlucyBhbiBFT1MvRU9CIE5BTAorICAgIGludCBsYXN0X2VvczsgIC8vLzwgbGFzdCBwYWNrZXQgY29udGFpbnMgYW4gRU9TL0VPQiBOQUwKKyAgICBpbnQgbWF4X3JhOworICAgIGludCBic193aWR0aDsKKyAgICBpbnQgYnNfaGVpZ2h0OworCisgICAgaW50IGlzX2RlY29kZWQ7CisKKyAgICBIRVZDUHJlZENvbnRleHQgaHBjOworICAgIEhFVkNEU1BDb250ZXh0IGhldmNkc3A7CisgICAgVmlkZW9EU1BDb250ZXh0IHZkc3A7CisgICAgQnN3YXBEU1BDb250ZXh0IGJkc3A7CisgICAgaW50OF90ICpxcF95X3RhYjsKKyAgICB1aW50OF90ICpob3Jpem9udGFsX2JzOworICAgIHVpbnQ4X3QgKnZlcnRpY2FsX2JzOworCisgICAgaW50MzJfdCAqdGFiX3NsaWNlX2FkZHJlc3M7CisKKyAgICAvLyAgQ1UKKyAgICB1aW50OF90ICpza2lwX2ZsYWc7CisgICAgdWludDhfdCAqdGFiX2N0X2RlcHRoOworICAgIC8vIFBVCisgICAgdWludDhfdCAqdGFiX2lwbTsKKworICAgIHVpbnQ4X3QgKmNiZl9sdW1hOyAvLyBjYmZfbHVtYSBvZiBjb2xvY2F0ZWQgVFUKKyAgICB1aW50OF90ICppc19wY207CisKKyAgICAvLyBDVEItbGV2ZWwgZmxhZ3MgYWZmZWN0aW5nIGxvb3AgZmlsdGVyIG9wZXJhdGlvbgorICAgIHVpbnQ4X3QgKmZpbHRlcl9zbGljZV9lZGdlczsKKworICAgIC8qKiB1c2VkIG9uIEJFIHRvIGJ5dGVzd2FwIHRoZSBsaW5lcyBmb3IgY2hlY2tzdW1taW5nICovCisgICAgdWludDhfdCAqY2hlY2tzdW1fYnVmOworICAgIGludCAgICAgIGNoZWNrc3VtX2J1Zl9zaXplOworCisgICAgLyoqCisgICAgICogU2VxdWVuY2UgY291bnRlcnMgZm9yIGRlY29kZWQgYW5kIG91dHB1dCBmcmFtZXMsIHNvIHRoYXQgb2xkCisgICAgICogZnJhbWVzIGFyZSBvdXRwdXQgZmlyc3QgYWZ0ZXIgYSBQT0MgcmVzZXQKKyAgICAgKi8KKyAgICB1aW50MTZfdCBzZXFfZGVjb2RlOworICAgIHVpbnQxNl90IHNlcV9vdXRwdXQ7CisKKyAgICBpbnQgZW5hYmxlX3BhcmFsbGVsX3RpbGVzOworICAgIGludCB3cHBfZXJyOworICAgIGludCBza2lwcGVkX2J5dGVzOworICAgIGludCAqc2tpcHBlZF9ieXRlc19wb3M7CisgICAgaW50IHNraXBwZWRfYnl0ZXNfcG9zX3NpemU7CisKKyAgICBpbnQgKnNraXBwZWRfYnl0ZXNfbmFsOworICAgIGludCAqKnNraXBwZWRfYnl0ZXNfcG9zX25hbDsKKyAgICBpbnQgKnNraXBwZWRfYnl0ZXNfcG9zX3NpemVfbmFsOworCisgICAgY29uc3QgdWludDhfdCAqZGF0YTsKKworICAgIEhFVkNOQUwgKm5hbHM7CisgICAgaW50IG5iX25hbHM7CisgICAgaW50IG5hbHNfYWxsb2NhdGVkOworICAgIC8vIHR5cGUgb2YgdGhlIGZpcnN0IFZDTCBOQUwgb2YgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBlbnVtIE5BTFVuaXRUeXBlIGZpcnN0X25hbF90eXBlOworCisgICAgLy8gZm9yIGNoZWNraW5nIHRoZSBmcmFtZSBjaGVja3N1bXMKKyAgICBzdHJ1Y3QgQVZNRDUgKm1kNV9jdHg7CisgICAgdWludDhfdCAgICAgICBtZDVbM11bMTZdOworICAgIHVpbnQ4X3QgaXNfbWQ1OworCisgICAgdWludDhfdCBjb250ZXh0X2luaXRpYWxpemVkOworICAgIHVpbnQ4X3QgaXNfbmFsZmY7ICAgICAgIC8vLzwgdGhpcyBmbGFnIGlzICE9IDAgaWYgYml0c3RyZWFtIGlzIGVuY2Fwc3VsYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYXMgYSBmb3JtYXQgZGVmaW5lZCBpbiAxNDQ5Ni0xNQorICAgIGludCBhcHBseV9kZWZkaXNwd2luOworCisgICAgaW50IGFjdGl2ZV9zZXFfcGFyYW1ldGVyX3NldF9pZDsKKworICAgIGludCBuYWxfbGVuZ3RoX3NpemU7ICAgIC8vLzwgTnVtYmVyIG9mIGJ5dGVzIHVzZWQgZm9yIG5hbCBsZW5ndGggKDEsIDIgb3IgNCkKKyAgICBpbnQgbnVoX2xheWVyX2lkOworCisgICAgLyoqIGZyYW1lIHBhY2tpbmcgYXJyYW5nZW1lbnQgdmFyaWFibGVzICovCisgICAgaW50IHNlaV9mcmFtZV9wYWNraW5nX3ByZXNlbnQ7CisgICAgaW50IGZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfdHlwZTsKKyAgICBpbnQgY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlOworICAgIGludCBxdWluY3VueF9zdWJzYW1wbGluZzsKKworICAgIC8qKiBkaXNwbGF5IG9yaWVudGF0aW9uICovCisgICAgaW50IHNlaV9kaXNwbGF5X29yaWVudGF0aW9uX3ByZXNlbnQ7CisgICAgaW50IHNlaV9hbnRpY2xvY2t3aXNlX3JvdGF0aW9uOworICAgIGludCBzZWlfaGZsaXAsIHNlaV92ZmxpcDsKKworICAgIGludCBwaWN0dXJlX3N0cnVjdDsKK30gSEVWQ0NvbnRleHQ7CisKK2ludCBmZl9oZXZjX2RlY29kZV9zaG9ydF90ZXJtX3JwcyhIRVZDQ29udGV4dCAqcywgU2hvcnRUZXJtUlBTICpycHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEVWQ1NQUyAqc3BzLCBpbnQgaXNfc2xpY2VfaGVhZGVyKTsKK2ludCBmZl9oZXZjX2RlY29kZV9uYWxfdnBzKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX2RlY29kZV9uYWxfc3BzKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX2RlY29kZV9uYWxfcHBzKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX2RlY29kZV9uYWxfc2VpKEhFVkNDb250ZXh0ICpzKTsKKworaW50IGZmX2hldmNfZXh0cmFjdF9yYnNwKEhFVkNDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEVWQ05BTCAqbmFsKTsKKworLyoqCisgKiBNYXJrIGFsbCBmcmFtZXMgaW4gRFBCIGFzIHVudXNlZCBmb3IgcmVmZXJlbmNlLgorICovCit2b2lkIGZmX2hldmNfY2xlYXJfcmVmcyhIRVZDQ29udGV4dCAqcyk7CisKKy8qKgorICogRHJvcCBhbGwgZnJhbWVzIGN1cnJlbnRseSBpbiBEUEIuCisgKi8KK3ZvaWQgZmZfaGV2Y19mbHVzaF9kcGIoSEVWQ0NvbnRleHQgKnMpOworCisvKioKKyAqIENvbXB1dGUgUE9DIG9mIHRoZSBjdXJyZW50IGZyYW1lIGFuZCByZXR1cm4gaXQuCisgKi8KK2ludCBmZl9oZXZjX2NvbXB1dGVfcG9jKEhFVkNDb250ZXh0ICpzLCBpbnQgcG9jX2xzYik7CisKK1JlZlBpY0xpc3QgKmZmX2hldmNfZ2V0X3JlZl9saXN0KEhFVkNDb250ZXh0ICpzLCBIRVZDRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgwLCBpbnQgeTApOworCisvKioKKyAqIENvbnN0cnVjdCB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgc2V0cyBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuCisgKi8KK2ludCBmZl9oZXZjX2ZyYW1lX3JwcyhIRVZDQ29udGV4dCAqcyk7CisKKy8qKgorICogQ29uc3RydWN0IHRoZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0KHMpIGZvciB0aGUgY3VycmVudCBzbGljZS4KKyAqLworaW50IGZmX2hldmNfc2xpY2VfcnBsKEhFVkNDb250ZXh0ICpzKTsKKwordm9pZCBmZl9oZXZjX3NhdmVfc3RhdGVzKEhFVkNDb250ZXh0ICpzLCBpbnQgY3RiX2FkZHJfdHMpOwordm9pZCBmZl9oZXZjX2NhYmFjX2luaXQoSEVWQ0NvbnRleHQgKnMsIGludCBjdGJfYWRkcl90cyk7CitpbnQgZmZfaGV2Y19zYW9fbWVyZ2VfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfc2FvX3R5cGVfaWR4X2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19zYW9fYmFuZF9wb3NpdGlvbl9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfc2FvX29mZnNldF9hYnNfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX3Nhb19vZmZzZXRfc2lnbl9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfc2FvX2VvX2NsYXNzX2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19lbmRfb2Zfc2xpY2VfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfc2tpcF9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X2NiLCBpbnQgeV9jYik7CitpbnQgZmZfaGV2Y19wcmVkX21vZGVfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX3NwbGl0X2NvZGluZ191bml0X2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgY3RfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeDAsIGludCB5MCk7CitpbnQgZmZfaGV2Y19wYXJ0X21vZGVfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgbG9nMl9jYl9zaXplKTsKK2ludCBmZl9oZXZjX3BjbV9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19wcmV2X2ludHJhX2x1bWFfcHJlZF9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19tcG1faWR4X2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19yZW1faW50cmFfbHVtYV9wcmVkX21vZGVfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX2ludHJhX2Nocm9tYV9wcmVkX21vZGVfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX21lcmdlX2lkeF9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfbWVyZ2VfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfaW50ZXJfcHJlZF9pZGNfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgblBiVywgaW50IG5QYkgpOworaW50IGZmX2hldmNfcmVmX2lkeF9seF9kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCBudW1fcmVmX2lkeF9seCk7CitpbnQgZmZfaGV2Y19tdnBfbHhfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfbm9fcmVzaWR1YWxfc3ludGF4X2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX3NwbGl0X3RyYW5zZm9ybV9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcywgaW50IGxvZzJfdHJhZm9fc2l6ZSk7CitpbnQgZmZfaGV2Y19jYmZfY2JfY3JfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgdHJhZm9fZGVwdGgpOworaW50IGZmX2hldmNfY2JmX2x1bWFfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgdHJhZm9fZGVwdGgpOworaW50IGZmX2hldmNfbG9nMl9yZXNfc2NhbGVfYWJzKEhFVkNDb250ZXh0ICpzLCBpbnQgaWR4KTsKK2ludCBmZl9oZXZjX3Jlc19zY2FsZV9zaWduX2ZsYWcoSEVWQ0NvbnRleHQgKnMsIGludCBpZHgpOworCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbmRpZGF0ZSByZWZlcmVuY2VzIGZvciB0aGUgY3VycmVudCBmcmFtZS4KKyAqLworaW50IGZmX2hldmNfZnJhbWVfbmJfcmVmcyhIRVZDQ29udGV4dCAqcyk7CisKK2ludCBmZl9oZXZjX3NldF9uZXdfcmVmKEhFVkNDb250ZXh0ICpzLCBBVkZyYW1lICoqZnJhbWUsIGludCBwb2MpOworCisvKioKKyAqIEZpbmQgbmV4dCBmcmFtZSBpbiBvdXRwdXQgb3JkZXIgYW5kIHB1dCBhIHJlZmVyZW5jZSB0byBpdCBpbiBmcmFtZS4KKyAqIEByZXR1cm4gMSBpZiBhIGZyYW1lIHdhcyBvdXRwdXQsIDAgb3RoZXJ3aXNlCisgKi8KK2ludCBmZl9oZXZjX291dHB1dF9mcmFtZShIRVZDQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCBmbHVzaCk7CisKK3ZvaWQgZmZfaGV2Y19idW1wX2ZyYW1lKEhFVkNDb250ZXh0ICpzKTsKKwordm9pZCBmZl9oZXZjX3VucmVmX2ZyYW1lKEhFVkNDb250ZXh0ICpzLCBIRVZDRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpOworCit2b2lkIGZmX2hldmNfc2V0X25laWdoYm91cl9hdmFpbGFibGUoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGJXLCBpbnQgblBiSCk7Cit2b2lkIGZmX2hldmNfbHVtYV9tdl9tZXJnZV9tb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYlcsIGludCBuUGJILCBpbnQgbG9nMl9jYl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFydF9pZHgsIGludCBtZXJnZV9pZHgsIE12RmllbGQgKm12KTsKK3ZvaWQgZmZfaGV2Y19sdW1hX212X212cF9tb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGJXLCBpbnQgblBiSCwgaW50IGxvZzJfY2Jfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJ0X2lkeCwgaW50IG1lcmdlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE12RmllbGQgKm12LCBpbnQgbXZwX2x4X2ZsYWcsIGludCBMWCk7Cit2b2lkIGZmX2hldmNfc2V0X3FQeShIRVZDQ29udGV4dCAqcywgaW50IHhCYXNlLCBpbnQgeUJhc2UsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplKTsKK3ZvaWQgZmZfaGV2Y19kZWJsb2NraW5nX2JvdW5kYXJ5X3N0cmVuZ3RocyhIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfdHJhZm9fc2l6ZSk7CitpbnQgZmZfaGV2Y19jdV9xcF9kZWx0YV9zaWduX2ZsYWcoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfY3VfcXBfZGVsdGFfYWJzKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX2N1X2Nocm9tYV9xcF9vZmZzZXRfZmxhZyhIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19jdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeChIRVZDQ29udGV4dCAqcyk7Cit2b2lkIGZmX2hldmNfaGxzX2ZpbHRlcihIRVZDQ29udGV4dCAqcywgaW50IHgsIGludCB5LCBpbnQgY3RiX3NpemUpOwordm9pZCBmZl9oZXZjX2hsc19maWx0ZXJzKEhFVkNDb250ZXh0ICpzLCBpbnQgeF9jdGIsIGludCB5X2N0YiwgaW50IGN0Yl9zaXplKTsKK3ZvaWQgZmZfaGV2Y19obHNfcmVzaWR1YWxfY29kaW5nKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX3RyYWZvX3NpemUsIGVudW0gU2NhblR5cGUgc2Nhbl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY19pZHgpOworCit2b2lkIGZmX2hldmNfaGxzX212ZF9jb2RpbmcoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLCBpbnQgbG9nMl9jYl9zaXplKTsKKworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oZXZjX3FwZWxfZXh0cmFfYmVmb3JlWzRdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaGV2Y19xcGVsX2V4dHJhX2FmdGVyWzRdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaGV2Y19xcGVsX2V4dHJhWzRdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oZXZjX2RpYWdfc2NhbjR4NF94WzE2XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2hldmNfZGlhZ19zY2FuNHg0X3lbMTZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaGV2Y19kaWFnX3NjYW44eDhfeFs2NF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oZXZjX2RpYWdfc2Nhbjh4OF95WzY0XTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSEVWQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oZXZjX2NhYmFjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oZXZjX2NhYmFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2MmRmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNfY2FiYWMuYwpAQCAtMCwwICsxLDE1ODcgQEAKKy8qCisgKiBIRVZDIENBQkFDIGRlY29kaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxMyBHdWlsbGF1bWUgTWFydHJlcworICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxMyBHaWxkYXMgQ29jaGVyZWwKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisjaW5jbHVkZSAiY2FiYWNfZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiaGV2Yy5oIgorCisjZGVmaW5lIENBQkFDX01BWF9CSU4gMzEKKworLyoqCisgKiBudW1iZXIgb2YgYmluIGJ5IFN5bnRheEVsZW1lbnQuCisgKi8KK2F2X3VudXNlZCBzdGF0aWMgY29uc3QgaW50OF90IG51bV9iaW5zX2luX3NlW10gPSB7CisgICAgIDEsIC8vIHNhb19tZXJnZV9mbGFnCisgICAgIDEsIC8vIHNhb190eXBlX2lkeAorICAgICAwLCAvLyBzYW9fZW9fY2xhc3MKKyAgICAgMCwgLy8gc2FvX2JhbmRfcG9zaXRpb24KKyAgICAgMCwgLy8gc2FvX29mZnNldF9hYnMKKyAgICAgMCwgLy8gc2FvX29mZnNldF9zaWduCisgICAgIDAsIC8vIGVuZF9vZl9zbGljZV9mbGFnCisgICAgIDMsIC8vIHNwbGl0X2NvZGluZ191bml0X2ZsYWcKKyAgICAgMSwgLy8gY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZworICAgICAzLCAvLyBza2lwX2ZsYWcKKyAgICAgMywgLy8gY3VfcXBfZGVsdGEKKyAgICAgMSwgLy8gcHJlZF9tb2RlCisgICAgIDQsIC8vIHBhcnRfbW9kZQorICAgICAwLCAvLyBwY21fZmxhZworICAgICAxLCAvLyBwcmV2X2ludHJhX2x1bWFfcHJlZF9tb2RlCisgICAgIDAsIC8vIG1wbV9pZHgKKyAgICAgMCwgLy8gcmVtX2ludHJhX2x1bWFfcHJlZF9tb2RlCisgICAgIDIsIC8vIGludHJhX2Nocm9tYV9wcmVkX21vZGUKKyAgICAgMSwgLy8gbWVyZ2VfZmxhZworICAgICAxLCAvLyBtZXJnZV9pZHgKKyAgICAgNSwgLy8gaW50ZXJfcHJlZF9pZGMKKyAgICAgMiwgLy8gcmVmX2lkeF9sMAorICAgICAyLCAvLyByZWZfaWR4X2wxCisgICAgIDIsIC8vIGFic19tdmRfZ3JlYXRlcjBfZmxhZworICAgICAyLCAvLyBhYnNfbXZkX2dyZWF0ZXIxX2ZsYWcKKyAgICAgMCwgLy8gYWJzX212ZF9taW51czIKKyAgICAgMCwgLy8gbXZkX3NpZ25fZmxhZworICAgICAxLCAvLyBtdnBfbHhfZmxhZworICAgICAxLCAvLyBub19yZXNpZHVhbF9kYXRhX2ZsYWcKKyAgICAgMywgLy8gc3BsaXRfdHJhbnNmb3JtX2ZsYWcKKyAgICAgMiwgLy8gY2JmX2x1bWEKKyAgICAgNCwgLy8gY2JmX2NiLCBjYmZfY3IKKyAgICAgMiwgLy8gdHJhbnNmb3JtX3NraXBfZmxhZ1tdW10KKyAgICAgMiwgLy8gZXhwbGljaXRfcmRwY21fZmxhZ1tdW10KKyAgICAgMiwgLy8gZXhwbGljaXRfcmRwY21fZGlyX2ZsYWdbXVtdCisgICAgMTgsIC8vIGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeF9wcmVmaXgKKyAgICAxOCwgLy8gbGFzdF9zaWduaWZpY2FudF9jb2VmZl95X3ByZWZpeAorICAgICAwLCAvLyBsYXN0X3NpZ25pZmljYW50X2NvZWZmX3hfc3VmZml4CisgICAgIDAsIC8vIGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeV9zdWZmaXgKKyAgICAgNCwgLy8gc2lnbmlmaWNhbnRfY29lZmZfZ3JvdXBfZmxhZworICAgIDQ0LCAvLyBzaWduaWZpY2FudF9jb2VmZl9mbGFnCisgICAgMjQsIC8vIGNvZWZmX2Fic19sZXZlbF9ncmVhdGVyMV9mbGFnCisgICAgIDYsIC8vIGNvZWZmX2Fic19sZXZlbF9ncmVhdGVyMl9mbGFnCisgICAgIDAsIC8vIGNvZWZmX2Fic19sZXZlbF9yZW1haW5pbmcKKyAgICAgMCwgLy8gY29lZmZfc2lnbl9mbGFnCisgICAgIDgsIC8vIGxvZzJfcmVzX3NjYWxlX2FicworICAgICAyLCAvLyByZXNfc2NhbGVfc2lnbl9mbGFnCisgICAgIDEsIC8vIGN1X2Nocm9tYV9xcF9vZmZzZXRfZmxhZworICAgICAxLCAvLyBjdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeAorfTsKKworLyoqCisgKiBPZmZzZXQgdG8gY3R4SWR4IDAgaW4gaW5pdF92YWx1ZXMgYW5kIHN0YXRlcywgaW5kZXhlZCBieSBTeW50YXhFbGVtZW50LgorICovCitzdGF0aWMgY29uc3QgaW50IGVsZW1fb2Zmc2V0W3NpemVvZihudW1fYmluc19pbl9zZSldID0geworICAgIDAsIC8vIHNhb19tZXJnZV9mbGFnCisgICAgMSwgLy8gc2FvX3R5cGVfaWR4CisgICAgMiwgLy8gc2FvX2VvX2NsYXNzCisgICAgMiwgLy8gc2FvX2JhbmRfcG9zaXRpb24KKyAgICAyLCAvLyBzYW9fb2Zmc2V0X2FicworICAgIDIsIC8vIHNhb19vZmZzZXRfc2lnbgorICAgIDIsIC8vIGVuZF9vZl9zbGljZV9mbGFnCisgICAgMiwgLy8gc3BsaXRfY29kaW5nX3VuaXRfZmxhZworICAgIDUsIC8vIGN1X3RyYW5zcXVhbnRfYnlwYXNzX2ZsYWcKKyAgICA2LCAvLyBza2lwX2ZsYWcKKyAgICA5LCAvLyBjdV9xcF9kZWx0YQorICAgIDEyLCAvLyBwcmVkX21vZGUKKyAgICAxMywgLy8gcGFydF9tb2RlCisgICAgMTcsIC8vIHBjbV9mbGFnCisgICAgMTcsIC8vIHByZXZfaW50cmFfbHVtYV9wcmVkX21vZGUKKyAgICAxOCwgLy8gbXBtX2lkeAorICAgIDE4LCAvLyByZW1faW50cmFfbHVtYV9wcmVkX21vZGUKKyAgICAxOCwgLy8gaW50cmFfY2hyb21hX3ByZWRfbW9kZQorICAgIDIwLCAvLyBtZXJnZV9mbGFnCisgICAgMjEsIC8vIG1lcmdlX2lkeAorICAgIDIyLCAvLyBpbnRlcl9wcmVkX2lkYworICAgIDI3LCAvLyByZWZfaWR4X2wwCisgICAgMjksIC8vIHJlZl9pZHhfbDEKKyAgICAzMSwgLy8gYWJzX212ZF9ncmVhdGVyMF9mbGFnCisgICAgMzMsIC8vIGFic19tdmRfZ3JlYXRlcjFfZmxhZworICAgIDM1LCAvLyBhYnNfbXZkX21pbnVzMgorICAgIDM1LCAvLyBtdmRfc2lnbl9mbGFnCisgICAgMzUsIC8vIG12cF9seF9mbGFnCisgICAgMzYsIC8vIG5vX3Jlc2lkdWFsX2RhdGFfZmxhZworICAgIDM3LCAvLyBzcGxpdF90cmFuc2Zvcm1fZmxhZworICAgIDQwLCAvLyBjYmZfbHVtYQorICAgIDQyLCAvLyBjYmZfY2IsIGNiZl9jcgorICAgIDQ2LCAvLyB0cmFuc2Zvcm1fc2tpcF9mbGFnW11bXQorICAgIDQ4LCAvLyBleHBsaWNpdF9yZHBjbV9mbGFnW11bXQorICAgIDUwLCAvLyBleHBsaWNpdF9yZHBjbV9kaXJfZmxhZ1tdW10KKyAgICA1MiwgLy8gbGFzdF9zaWduaWZpY2FudF9jb2VmZl94X3ByZWZpeAorICAgIDcwLCAvLyBsYXN0X3NpZ25pZmljYW50X2NvZWZmX3lfcHJlZml4CisgICAgODgsIC8vIGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeF9zdWZmaXgKKyAgICA4OCwgLy8gbGFzdF9zaWduaWZpY2FudF9jb2VmZl95X3N1ZmZpeAorICAgIDg4LCAvLyBzaWduaWZpY2FudF9jb2VmZl9ncm91cF9mbGFnCisgICAgOTIsIC8vIHNpZ25pZmljYW50X2NvZWZmX2ZsYWcKKyAgICAxMzYsIC8vIGNvZWZmX2Fic19sZXZlbF9ncmVhdGVyMV9mbGFnCisgICAgMTYwLCAvLyBjb2VmZl9hYnNfbGV2ZWxfZ3JlYXRlcjJfZmxhZworICAgIDE2NiwgLy8gY29lZmZfYWJzX2xldmVsX3JlbWFpbmluZworICAgIDE2NiwgLy8gY29lZmZfc2lnbl9mbGFnCisgICAgMTY2LCAvLyBsb2cyX3Jlc19zY2FsZV9hYnMKKyAgICAxNzQsIC8vIHJlc19zY2FsZV9zaWduX2ZsYWcKKyAgICAxNzYsIC8vIGN1X2Nocm9tYV9xcF9vZmZzZXRfZmxhZworICAgIDE3NywgLy8gY3VfY2hyb21hX3FwX29mZnNldF9pZHgKK307CisKKyNkZWZpbmUgQ05VIDE1NAorLyoqCisgKiBJbmRleGVkIGJ5IGluaXRfdHlwZQorICovCitzdGF0aWMgY29uc3QgdWludDhfdCBpbml0X3ZhbHVlc1szXVtIRVZDX0NPTlRFWFRTXSA9IHsKKyAgICB7IC8vIHNhb19tZXJnZV9mbGFnCisgICAgICAxNTMsCisgICAgICAvLyBzYW9fdHlwZV9pZHgKKyAgICAgIDIwMCwKKyAgICAgIC8vIHNwbGl0X2NvZGluZ191bml0X2ZsYWcKKyAgICAgIDEzOSwgMTQxLCAxNTcsCisgICAgICAvLyBjdV90cmFuc3F1YW50X2J5cGFzc19mbGFnCisgICAgICAxNTQsCisgICAgICAvLyBza2lwX2ZsYWcKKyAgICAgIENOVSwgQ05VLCBDTlUsCisgICAgICAvLyBjdV9xcF9kZWx0YQorICAgICAgMTU0LCAxNTQsIDE1NCwKKyAgICAgIC8vIHByZWRfbW9kZQorICAgICAgQ05VLAorICAgICAgLy8gcGFydF9tb2RlCisgICAgICAxODQsIENOVSwgQ05VLCBDTlUsCisgICAgICAvLyBwcmV2X2ludHJhX2x1bWFfcHJlZF9tb2RlCisgICAgICAxODQsCisgICAgICAvLyBpbnRyYV9jaHJvbWFfcHJlZF9tb2RlCisgICAgICA2MywgMTM5LAorICAgICAgLy8gbWVyZ2VfZmxhZworICAgICAgQ05VLAorICAgICAgLy8gbWVyZ2VfaWR4CisgICAgICBDTlUsCisgICAgICAvLyBpbnRlcl9wcmVkX2lkYworICAgICAgQ05VLCBDTlUsIENOVSwgQ05VLCBDTlUsCisgICAgICAvLyByZWZfaWR4X2wwCisgICAgICBDTlUsIENOVSwKKyAgICAgIC8vIHJlZl9pZHhfbDEKKyAgICAgIENOVSwgQ05VLAorICAgICAgLy8gYWJzX212ZF9ncmVhdGVyMV9mbGFnCisgICAgICBDTlUsIENOVSwKKyAgICAgIC8vIGFic19tdmRfZ3JlYXRlcjFfZmxhZworICAgICAgQ05VLCBDTlUsCisgICAgICAvLyBtdnBfbHhfZmxhZworICAgICAgQ05VLAorICAgICAgLy8gbm9fcmVzaWR1YWxfZGF0YV9mbGFnCisgICAgICBDTlUsCisgICAgICAvLyBzcGxpdF90cmFuc2Zvcm1fZmxhZworICAgICAgMTUzLCAxMzgsIDEzOCwKKyAgICAgIC8vIGNiZl9sdW1hCisgICAgICAxMTEsIDE0MSwKKyAgICAgIC8vIGNiZl9jYiwgY2JmX2NyCisgICAgICA5NCwgMTM4LCAxODIsIDE1NCwKKyAgICAgIC8vIHRyYW5zZm9ybV9za2lwX2ZsYWcKKyAgICAgIDEzOSwgMTM5LAorICAgICAgLy8gZXhwbGljaXRfcmRwY21fZmxhZworICAgICAgMTM5LCAxMzksCisgICAgICAvLyBleHBsaWNpdF9yZHBjbV9kaXJfZmxhZworICAgICAgMTM5LCAxMzksCisgICAgICAvLyBsYXN0X3NpZ25pZmljYW50X2NvZWZmX3hfcHJlZml4CisgICAgICAxMTAsIDExMCwgMTI0LCAxMjUsIDE0MCwgMTUzLCAxMjUsIDEyNywgMTQwLCAxMDksIDExMSwgMTQzLCAxMjcsIDExMSwKKyAgICAgICA3OSwgMTA4LCAxMjMsICA2MywKKyAgICAgIC8vIGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeV9wcmVmaXgKKyAgICAgIDExMCwgMTEwLCAxMjQsIDEyNSwgMTQwLCAxNTMsIDEyNSwgMTI3LCAxNDAsIDEwOSwgMTExLCAxNDMsIDEyNywgMTExLAorICAgICAgIDc5LCAxMDgsIDEyMywgIDYzLAorICAgICAgLy8gc2lnbmlmaWNhbnRfY29lZmZfZ3JvdXBfZmxhZworICAgICAgOTEsIDE3MSwgMTM0LCAxNDEsCisgICAgICAvLyBzaWduaWZpY2FudF9jb2VmZl9mbGFnCisgICAgICAxMTEsIDExMSwgMTI1LCAxMTAsIDExMCwgIDk0LCAxMjQsIDEwOCwgMTI0LCAxMDcsIDEyNSwgMTQxLCAxNzksIDE1MywKKyAgICAgIDEyNSwgMTA3LCAxMjUsIDE0MSwgMTc5LCAxNTMsIDEyNSwgMTA3LCAxMjUsIDE0MSwgMTc5LCAxNTMsIDEyNSwgMTQwLAorICAgICAgMTM5LCAxODIsIDE4MiwgMTUyLCAxMzYsIDE1MiwgMTM2LCAxNTMsIDEzNiwgMTM5LCAxMTEsIDEzNiwgMTM5LCAxMTEsCisgICAgICAxNDEsIDExMSwKKyAgICAgIC8vIGNvZWZmX2Fic19sZXZlbF9ncmVhdGVyMV9mbGFnCisgICAgICAxNDAsICA5MiwgMTM3LCAxMzgsIDE0MCwgMTUyLCAxMzgsIDEzOSwgMTUzLCAgNzQsIDE0OSwgIDkyLCAxMzksIDEwNywKKyAgICAgIDEyMiwgMTUyLCAxNDAsIDE3OSwgMTY2LCAxODIsIDE0MCwgMjI3LCAxMjIsIDE5NywKKyAgICAgIC8vIGNvZWZmX2Fic19sZXZlbF9ncmVhdGVyMl9mbGFnCisgICAgICAxMzgsIDE1MywgMTM2LCAxNjcsIDE1MiwgMTUyLAorICAgICAgLy8gbG9nMl9yZXNfc2NhbGVfYWJzCisgICAgICAxNTQsIDE1NCwgMTU0LCAxNTQsIDE1NCwgMTU0LCAxNTQsIDE1NCwKKyAgICAgIC8vIHJlc19zY2FsZV9zaWduX2ZsYWcKKyAgICAgIDE1NCwgMTU0LAorICAgICAgLy8gY3VfY2hyb21hX3FwX29mZnNldF9mbGFnCisgICAgICAxNTQsCisgICAgICAvLyBjdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeAorICAgICAgMTU0LAorICAgIH0sCisgICAgeyAvLyBzYW9fbWVyZ2VfZmxhZworICAgICAgMTUzLAorICAgICAgLy8gc2FvX3R5cGVfaWR4CisgICAgICAxODUsCisgICAgICAvLyBzcGxpdF9jb2RpbmdfdW5pdF9mbGFnCisgICAgICAxMDcsIDEzOSwgMTI2LAorICAgICAgLy8gY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZworICAgICAgMTU0LAorICAgICAgLy8gc2tpcF9mbGFnCisgICAgICAxOTcsIDE4NSwgMjAxLAorICAgICAgLy8gY3VfcXBfZGVsdGEKKyAgICAgIDE1NCwgMTU0LCAxNTQsCisgICAgICAvLyBwcmVkX21vZGUKKyAgICAgIDE0OSwKKyAgICAgIC8vIHBhcnRfbW9kZQorICAgICAgMTU0LCAxMzksIDE1NCwgMTU0LAorICAgICAgLy8gcHJldl9pbnRyYV9sdW1hX3ByZWRfbW9kZQorICAgICAgMTU0LAorICAgICAgLy8gaW50cmFfY2hyb21hX3ByZWRfbW9kZQorICAgICAgMTUyLCAxMzksCisgICAgICAvLyBtZXJnZV9mbGFnCisgICAgICAxMTAsCisgICAgICAvLyBtZXJnZV9pZHgKKyAgICAgIDEyMiwKKyAgICAgIC8vIGludGVyX3ByZWRfaWRjCisgICAgICA5NSwgNzksIDYzLCAzMSwgMzEsCisgICAgICAvLyByZWZfaWR4X2wwCisgICAgICAxNTMsIDE1MywKKyAgICAgIC8vIHJlZl9pZHhfbDEKKyAgICAgIDE1MywgMTUzLAorICAgICAgLy8gYWJzX212ZF9ncmVhdGVyMV9mbGFnCisgICAgICAxNDAsIDE5OCwKKyAgICAgIC8vIGFic19tdmRfZ3JlYXRlcjFfZmxhZworICAgICAgMTQwLCAxOTgsCisgICAgICAvLyBtdnBfbHhfZmxhZworICAgICAgMTY4LAorICAgICAgLy8gbm9fcmVzaWR1YWxfZGF0YV9mbGFnCisgICAgICA3OSwKKyAgICAgIC8vIHNwbGl0X3RyYW5zZm9ybV9mbGFnCisgICAgICAxMjQsIDEzOCwgOTQsCisgICAgICAvLyBjYmZfbHVtYQorICAgICAgMTUzLCAxMTEsCisgICAgICAvLyBjYmZfY2IsIGNiZl9jcgorICAgICAgMTQ5LCAxMDcsIDE2NywgMTU0LAorICAgICAgLy8gdHJhbnNmb3JtX3NraXBfZmxhZworICAgICAgMTM5LCAxMzksCisgICAgICAvLyBleHBsaWNpdF9yZHBjbV9mbGFnCisgICAgICAxMzksIDEzOSwKKyAgICAgIC8vIGV4cGxpY2l0X3JkcGNtX2Rpcl9mbGFnCisgICAgICAxMzksIDEzOSwKKyAgICAgIC8vIGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeF9wcmVmaXgKKyAgICAgIDEyNSwgMTEwLCAgOTQsIDExMCwgIDk1LCAgNzksIDEyNSwgMTExLCAxMTAsICA3OCwgMTEwLCAxMTEsIDExMSwgIDk1LAorICAgICAgIDk0LCAxMDgsIDEyMywgMTA4LAorICAgICAgLy8gbGFzdF9zaWduaWZpY2FudF9jb2VmZl95X3ByZWZpeAorICAgICAgMTI1LCAxMTAsICA5NCwgMTEwLCAgOTUsICA3OSwgMTI1LCAxMTEsIDExMCwgIDc4LCAxMTAsIDExMSwgMTExLCAgOTUsCisgICAgICAgOTQsIDEwOCwgMTIzLCAxMDgsCisgICAgICAvLyBzaWduaWZpY2FudF9jb2VmZl9ncm91cF9mbGFnCisgICAgICAxMjEsIDE0MCwgNjEsIDE1NCwKKyAgICAgIC8vIHNpZ25pZmljYW50X2NvZWZmX2ZsYWcKKyAgICAgIDE1NSwgMTU0LCAxMzksIDE1MywgMTM5LCAxMjMsIDEyMywgIDYzLCAxNTMsIDE2NiwgMTgzLCAxNDAsIDEzNiwgMTUzLAorICAgICAgMTU0LCAxNjYsIDE4MywgMTQwLCAxMzYsIDE1MywgMTU0LCAxNjYsIDE4MywgMTQwLCAxMzYsIDE1MywgMTU0LCAxNzAsCisgICAgICAxNTMsIDEyMywgMTIzLCAxMDcsIDEyMSwgMTA3LCAxMjEsIDE2NywgMTUxLCAxODMsIDE0MCwgMTUxLCAxODMsIDE0MCwKKyAgICAgIDE0MCwgMTQwLAorICAgICAgLy8gY29lZmZfYWJzX2xldmVsX2dyZWF0ZXIxX2ZsYWcKKyAgICAgIDE1NCwgMTk2LCAxOTYsIDE2NywgMTU0LCAxNTIsIDE2NywgMTgyLCAxODIsIDEzNCwgMTQ5LCAxMzYsIDE1MywgMTIxLAorICAgICAgMTM2LCAxMzcsIDE2OSwgMTk0LCAxNjYsIDE2NywgMTU0LCAxNjcsIDEzNywgMTgyLAorICAgICAgLy8gY29lZmZfYWJzX2xldmVsX2dyZWF0ZXIyX2ZsYWcKKyAgICAgIDEwNywgMTY3LCA5MSwgMTIyLCAxMDcsIDE2NywKKyAgICAgIC8vIGxvZzJfcmVzX3NjYWxlX2FicworICAgICAgMTU0LCAxNTQsIDE1NCwgMTU0LCAxNTQsIDE1NCwgMTU0LCAxNTQsCisgICAgICAvLyByZXNfc2NhbGVfc2lnbl9mbGFnCisgICAgICAxNTQsIDE1NCwKKyAgICAgIC8vIGN1X2Nocm9tYV9xcF9vZmZzZXRfZmxhZworICAgICAgMTU0LAorICAgICAgLy8gY3VfY2hyb21hX3FwX29mZnNldF9pZHgKKyAgICAgIDE1NCwKKyAgICB9LAorICAgIHsgLy8gc2FvX21lcmdlX2ZsYWcKKyAgICAgIDE1MywKKyAgICAgIC8vIHNhb190eXBlX2lkeAorICAgICAgMTYwLAorICAgICAgLy8gc3BsaXRfY29kaW5nX3VuaXRfZmxhZworICAgICAgMTA3LCAxMzksIDEyNiwKKyAgICAgIC8vIGN1X3RyYW5zcXVhbnRfYnlwYXNzX2ZsYWcKKyAgICAgIDE1NCwKKyAgICAgIC8vIHNraXBfZmxhZworICAgICAgMTk3LCAxODUsIDIwMSwKKyAgICAgIC8vIGN1X3FwX2RlbHRhCisgICAgICAxNTQsIDE1NCwgMTU0LAorICAgICAgLy8gcHJlZF9tb2RlCisgICAgICAxMzQsCisgICAgICAvLyBwYXJ0X21vZGUKKyAgICAgIDE1NCwgMTM5LCAxNTQsIDE1NCwKKyAgICAgIC8vIHByZXZfaW50cmFfbHVtYV9wcmVkX21vZGUKKyAgICAgIDE4MywKKyAgICAgIC8vIGludHJhX2Nocm9tYV9wcmVkX21vZGUKKyAgICAgIDE1MiwgMTM5LAorICAgICAgLy8gbWVyZ2VfZmxhZworICAgICAgMTU0LAorICAgICAgLy8gbWVyZ2VfaWR4CisgICAgICAxMzcsCisgICAgICAvLyBpbnRlcl9wcmVkX2lkYworICAgICAgOTUsIDc5LCA2MywgMzEsIDMxLAorICAgICAgLy8gcmVmX2lkeF9sMAorICAgICAgMTUzLCAxNTMsCisgICAgICAvLyByZWZfaWR4X2wxCisgICAgICAxNTMsIDE1MywKKyAgICAgIC8vIGFic19tdmRfZ3JlYXRlcjFfZmxhZworICAgICAgMTY5LCAxOTgsCisgICAgICAvLyBhYnNfbXZkX2dyZWF0ZXIxX2ZsYWcKKyAgICAgIDE2OSwgMTk4LAorICAgICAgLy8gbXZwX2x4X2ZsYWcKKyAgICAgIDE2OCwKKyAgICAgIC8vIG5vX3Jlc2lkdWFsX2RhdGFfZmxhZworICAgICAgNzksCisgICAgICAvLyBzcGxpdF90cmFuc2Zvcm1fZmxhZworICAgICAgMjI0LCAxNjcsIDEyMiwKKyAgICAgIC8vIGNiZl9sdW1hCisgICAgICAxNTMsIDExMSwKKyAgICAgIC8vIGNiZl9jYiwgY2JmX2NyCisgICAgICAxNDksIDkyLCAxNjcsIDE1NCwKKyAgICAgIC8vIHRyYW5zZm9ybV9za2lwX2ZsYWcKKyAgICAgIDEzOSwgMTM5LAorICAgICAgLy8gZXhwbGljaXRfcmRwY21fZmxhZworICAgICAgMTM5LCAxMzksCisgICAgICAvLyBleHBsaWNpdF9yZHBjbV9kaXJfZmxhZworICAgICAgMTM5LCAxMzksCisgICAgICAvLyBsYXN0X3NpZ25pZmljYW50X2NvZWZmX3hfcHJlZml4CisgICAgICAxMjUsIDExMCwgMTI0LCAxMTAsICA5NSwgIDk0LCAxMjUsIDExMSwgMTExLCAgNzksIDEyNSwgMTI2LCAxMTEsIDExMSwKKyAgICAgICA3OSwgMTA4LCAxMjMsICA5MywKKyAgICAgIC8vIGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeV9wcmVmaXgKKyAgICAgIDEyNSwgMTEwLCAxMjQsIDExMCwgIDk1LCAgOTQsIDEyNSwgMTExLCAxMTEsICA3OSwgMTI1LCAxMjYsIDExMSwgMTExLAorICAgICAgIDc5LCAxMDgsIDEyMywgIDkzLAorICAgICAgLy8gc2lnbmlmaWNhbnRfY29lZmZfZ3JvdXBfZmxhZworICAgICAgMTIxLCAxNDAsIDYxLCAxNTQsCisgICAgICAvLyBzaWduaWZpY2FudF9jb2VmZl9mbGFnCisgICAgICAxNzAsIDE1NCwgMTM5LCAxNTMsIDEzOSwgMTIzLCAxMjMsICA2MywgMTI0LCAxNjYsIDE4MywgMTQwLCAxMzYsIDE1MywKKyAgICAgIDE1NCwgMTY2LCAxODMsIDE0MCwgMTM2LCAxNTMsIDE1NCwgMTY2LCAxODMsIDE0MCwgMTM2LCAxNTMsIDE1NCwgMTcwLAorICAgICAgMTUzLCAxMzgsIDEzOCwgMTIyLCAxMjEsIDEyMiwgMTIxLCAxNjcsIDE1MSwgMTgzLCAxNDAsIDE1MSwgMTgzLCAxNDAsCisgICAgICAxNDAsIDE0MCwKKyAgICAgIC8vIGNvZWZmX2Fic19sZXZlbF9ncmVhdGVyMV9mbGFnCisgICAgICAxNTQsIDE5NiwgMTY3LCAxNjcsIDE1NCwgMTUyLCAxNjcsIDE4MiwgMTgyLCAxMzQsIDE0OSwgMTM2LCAxNTMsIDEyMSwKKyAgICAgIDEzNiwgMTIyLCAxNjksIDIwOCwgMTY2LCAxNjcsIDE1NCwgMTUyLCAxNjcsIDE4MiwKKyAgICAgIC8vIGNvZWZmX2Fic19sZXZlbF9ncmVhdGVyMl9mbGFnCisgICAgICAxMDcsIDE2NywgOTEsIDEwNywgMTA3LCAxNjcsCisgICAgICAvLyBsb2cyX3Jlc19zY2FsZV9hYnMKKyAgICAgIDE1NCwgMTU0LCAxNTQsIDE1NCwgMTU0LCAxNTQsIDE1NCwgMTU0LAorICAgICAgLy8gcmVzX3NjYWxlX3NpZ25fZmxhZworICAgICAgMTU0LCAxNTQsCisgICAgICAvLyBjdV9jaHJvbWFfcXBfb2Zmc2V0X2ZsYWcKKyAgICAgIDE1NCwKKyAgICAgIC8vIGN1X2Nocm9tYV9xcF9vZmZzZXRfaWR4CisgICAgICAxNTQsCisgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHNjYW5fMXgxWzFdID0geworICAgIDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBob3Jpel9zY2FuMngyX3hbNF0gPSB7CisgICAgMCwgMSwgMCwgMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGhvcml6X3NjYW4yeDJfeVs0XSA9IHsKKyAgICAwLCAwLCAxLCAxCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBob3Jpel9zY2FuNHg0X3hbMTZdID0geworICAgIDAsIDEsIDIsIDMsCisgICAgMCwgMSwgMiwgMywKKyAgICAwLCAxLCAyLCAzLAorICAgIDAsIDEsIDIsIDMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBob3Jpel9zY2FuNHg0X3lbMTZdID0geworICAgIDAsIDAsIDAsIDAsCisgICAgMSwgMSwgMSwgMSwKKyAgICAyLCAyLCAyLCAyLAorICAgIDMsIDMsIDMsIDMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBob3Jpel9zY2FuOHg4X2ludls4XVs4XSA9IHsKKyAgICB7ICAwLCAgMSwgIDIsICAzLCAxNiwgMTcsIDE4LCAxOSwgfSwKKyAgICB7ICA0LCAgNSwgIDYsICA3LCAyMCwgMjEsIDIyLCAyMywgfSwKKyAgICB7ICA4LCAgOSwgMTAsIDExLCAyNCwgMjUsIDI2LCAyNywgfSwKKyAgICB7IDEyLCAxMywgMTQsIDE1LCAyOCwgMjksIDMwLCAzMSwgfSwKKyAgICB7IDMyLCAzMywgMzQsIDM1LCA0OCwgNDksIDUwLCA1MSwgfSwKKyAgICB7IDM2LCAzNywgMzgsIDM5LCA1MiwgNTMsIDU0LCA1NSwgfSwKKyAgICB7IDQwLCA0MSwgNDIsIDQzLCA1NiwgNTcsIDU4LCA1OSwgfSwKKyAgICB7IDQ0LCA0NSwgNDYsIDQ3LCA2MCwgNjEsIDYyLCA2MywgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRpYWdfc2NhbjJ4Ml94WzRdID0geworICAgIDAsIDAsIDEsIDEsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkaWFnX3NjYW4yeDJfeVs0XSA9IHsKKyAgICAwLCAxLCAwLCAxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGlhZ19zY2FuMngyX2ludlsyXVsyXSA9IHsKKyAgICB7IDAsIDIsIH0sCisgICAgeyAxLCAzLCB9LAorfTsKKworY29uc3QgdWludDhfdCBmZl9oZXZjX2RpYWdfc2NhbjR4NF94WzE2XSA9IHsKKyAgICAwLCAwLCAxLCAwLAorICAgIDEsIDIsIDAsIDEsCisgICAgMiwgMywgMSwgMiwKKyAgICAzLCAyLCAzLCAzLAorfTsKKworY29uc3QgdWludDhfdCBmZl9oZXZjX2RpYWdfc2NhbjR4NF95WzE2XSA9IHsKKyAgICAwLCAxLCAwLCAyLAorICAgIDEsIDAsIDMsIDIsCisgICAgMSwgMCwgMywgMiwKKyAgICAxLCAzLCAyLCAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGlhZ19zY2FuNHg0X2ludls0XVs0XSA9IHsKKyAgICB7IDAsICAyLCAgNSwgIDksIH0sCisgICAgeyAxLCAgNCwgIDgsIDEyLCB9LAorICAgIHsgMywgIDcsIDExLCAxNCwgfSwKKyAgICB7IDYsIDEwLCAxMywgMTUsIH0sCit9OworCitjb25zdCB1aW50OF90IGZmX2hldmNfZGlhZ19zY2FuOHg4X3hbNjRdID0geworICAgIDAsIDAsIDEsIDAsCisgICAgMSwgMiwgMCwgMSwKKyAgICAyLCAzLCAwLCAxLAorICAgIDIsIDMsIDQsIDAsCisgICAgMSwgMiwgMywgNCwKKyAgICA1LCAwLCAxLCAyLAorICAgIDMsIDQsIDUsIDYsCisgICAgMCwgMSwgMiwgMywKKyAgICA0LCA1LCA2LCA3LAorICAgIDEsIDIsIDMsIDQsCisgICAgNSwgNiwgNywgMiwKKyAgICAzLCA0LCA1LCA2LAorICAgIDcsIDMsIDQsIDUsCisgICAgNiwgNywgNCwgNSwKKyAgICA2LCA3LCA1LCA2LAorICAgIDcsIDYsIDcsIDcsCit9OworCitjb25zdCB1aW50OF90IGZmX2hldmNfZGlhZ19zY2FuOHg4X3lbNjRdID0geworICAgIDAsIDEsIDAsIDIsCisgICAgMSwgMCwgMywgMiwKKyAgICAxLCAwLCA0LCAzLAorICAgIDIsIDEsIDAsIDUsCisgICAgNCwgMywgMiwgMSwKKyAgICAwLCA2LCA1LCA0LAorICAgIDMsIDIsIDEsIDAsCisgICAgNywgNiwgNSwgNCwKKyAgICAzLCAyLCAxLCAwLAorICAgIDcsIDYsIDUsIDQsCisgICAgMywgMiwgMSwgNywKKyAgICA2LCA1LCA0LCAzLAorICAgIDIsIDcsIDYsIDUsCisgICAgNCwgMywgNywgNiwKKyAgICA1LCA0LCA3LCA2LAorICAgIDUsIDcsIDYsIDcsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkaWFnX3NjYW44eDhfaW52WzhdWzhdID0geworICAgIHsgIDAsICAyLCAgNSwgIDksIDE0LCAyMCwgMjcsIDM1LCB9LAorICAgIHsgIDEsICA0LCAgOCwgMTMsIDE5LCAyNiwgMzQsIDQyLCB9LAorICAgIHsgIDMsICA3LCAxMiwgMTgsIDI1LCAzMywgNDEsIDQ4LCB9LAorICAgIHsgIDYsIDExLCAxNywgMjQsIDMyLCA0MCwgNDcsIDUzLCB9LAorICAgIHsgMTAsIDE2LCAyMywgMzEsIDM5LCA0NiwgNTIsIDU3LCB9LAorICAgIHsgMTUsIDIyLCAzMCwgMzgsIDQ1LCA1MSwgNTYsIDYwLCB9LAorICAgIHsgMjEsIDI5LCAzNywgNDQsIDUwLCA1NSwgNTksIDYyLCB9LAorICAgIHsgMjgsIDM2LCA0MywgNDksIDU0LCA1OCwgNjEsIDYzLCB9LAorfTsKKwordm9pZCBmZl9oZXZjX3NhdmVfc3RhdGVzKEhFVkNDb250ZXh0ICpzLCBpbnQgY3RiX2FkZHJfdHMpCit7CisgICAgaWYgKHMtPnBwcy0+ZW50cm9weV9jb2Rpbmdfc3luY19lbmFibGVkX2ZsYWcgJiYKKyAgICAgICAgKGN0Yl9hZGRyX3RzICUgcy0+c3BzLT5jdGJfd2lkdGggPT0gMiB8fAorICAgICAgICAgKHMtPnNwcy0+Y3RiX3dpZHRoID09IDIgJiYKKyAgICAgICAgICBjdGJfYWRkcl90cyAlIHMtPnNwcy0+Y3RiX3dpZHRoID09IDApKSkgeworICAgICAgICBtZW1jcHkocy0+Y2FiYWNfc3RhdGUsIHMtPkhFVkNsYy0+Y2FiYWNfc3RhdGUsIEhFVkNfQ09OVEVYVFMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbG9hZF9zdGF0ZXMoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgbWVtY3B5KHMtPkhFVkNsYy0+Y2FiYWNfc3RhdGUsIHMtPmNhYmFjX3N0YXRlLCBIRVZDX0NPTlRFWFRTKTsKK30KKworc3RhdGljIHZvaWQgY2FiYWNfcmVpbml0KEhFVkNMb2NhbENvbnRleHQgKmxjKQoreworICAgIHNraXBfYnl0ZXMoJmxjLT5jYywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNhYmFjX2luaXRfZGVjb2RlcihIRVZDQ29udGV4dCAqcykKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5IRVZDbGMtPmdiOworICAgIHNraXBfYml0cyhnYiwgMSk7CisgICAgYWxpZ25fZ2V0X2JpdHMoZ2IpOworICAgIGZmX2luaXRfY2FiYWNfZGVjb2Rlcigmcy0+SEVWQ2xjLT5jYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ItPmJ1ZmZlciArIGdldF9iaXRzX2NvdW50KGdiKSAvIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfYml0c19sZWZ0KGdiKSArIDcpIC8gOCk7Cit9CisKK3N0YXRpYyB2b2lkIGNhYmFjX2luaXRfc3RhdGUoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgaW50IGluaXRfdHlwZSA9IDIgLSBzLT5zaC5zbGljZV90eXBlOworICAgIGludCBpOworCisgICAgaWYgKHMtPnNoLmNhYmFjX2luaXRfZmxhZyAmJiBzLT5zaC5zbGljZV90eXBlICE9IElfU0xJQ0UpCisgICAgICAgIGluaXRfdHlwZSBePSAzOworCisgICAgZm9yIChpID0gMDsgaSA8IEhFVkNfQ09OVEVYVFM7IGkrKykgeworICAgICAgICBpbnQgaW5pdF92YWx1ZSA9IGluaXRfdmFsdWVzW2luaXRfdHlwZV1baV07CisgICAgICAgIGludCBtID0gKGluaXRfdmFsdWUgPj4gNCkgKiA1IC0gNDU7CisgICAgICAgIGludCBuID0gKChpbml0X3ZhbHVlICYgMTUpIDw8IDMpIC0gMTY7CisgICAgICAgIGludCBwcmUgPSAyICogKCgobSAqIGF2X2NsaXAocy0+c2guc2xpY2VfcXAsIDAsIDUxKSkgPj4gNCkgKyBuKSAtIDEyNzsKKworICAgICAgICBwcmUgXj0gcHJlID4+IDMxOworICAgICAgICBpZiAocHJlID4gMTI0KQorICAgICAgICAgICAgcHJlID0gMTI0ICsgKHByZSAmIDEpOworICAgICAgICBzLT5IRVZDbGMtPmNhYmFjX3N0YXRlW2ldID0gcHJlOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHMtPkhFVkNsYy0+c3RhdF9jb2VmZltpXSA9IDA7Cit9CisKK3ZvaWQgZmZfaGV2Y19jYWJhY19pbml0KEhFVkNDb250ZXh0ICpzLCBpbnQgY3RiX2FkZHJfdHMpCit7CisgICAgaWYgKGN0Yl9hZGRyX3RzID09IHMtPnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbcy0+c2guc2xpY2VfY3RiX2FkZHJfcnNdKSB7CisgICAgICAgIGNhYmFjX2luaXRfZGVjb2RlcihzKTsKKyAgICAgICAgaWYgKHMtPnNoLmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPT0gMCB8fAorICAgICAgICAgICAgKHMtPnBwcy0+dGlsZXNfZW5hYmxlZF9mbGFnICYmCisgICAgICAgICAgICAgcy0+cHBzLT50aWxlX2lkW2N0Yl9hZGRyX3RzXSAhPSBzLT5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHMgLSAxXSkpCisgICAgICAgICAgICBjYWJhY19pbml0X3N0YXRlKHMpOworCisgICAgICAgIGlmICghcy0+c2guZmlyc3Rfc2xpY2VfaW5fcGljX2ZsYWcgJiYKKyAgICAgICAgICAgIHMtPnBwcy0+ZW50cm9weV9jb2Rpbmdfc3luY19lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgICAgIGlmIChjdGJfYWRkcl90cyAlIHMtPnNwcy0+Y3RiX3dpZHRoID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+c3BzLT5jdGJfd2lkdGggPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgY2FiYWNfaW5pdF9zdGF0ZShzKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzLT5zaC5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnID09IDEpCisgICAgICAgICAgICAgICAgICAgIGxvYWRfc3RhdGVzKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPnBwcy0+dGlsZXNfZW5hYmxlZF9mbGFnICYmCisgICAgICAgICAgICBzLT5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHNdICE9IHMtPnBwcy0+dGlsZV9pZFtjdGJfYWRkcl90cyAtIDFdKSB7CisgICAgICAgICAgICBpZiAocy0+dGhyZWFkc19udW1iZXIgPT0gMSkKKyAgICAgICAgICAgICAgICBjYWJhY19yZWluaXQocy0+SEVWQ2xjKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjYWJhY19pbml0X2RlY29kZXIocyk7CisgICAgICAgICAgICBjYWJhY19pbml0X3N0YXRlKHMpOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5wcHMtPmVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnKSB7CisgICAgICAgICAgICBpZiAoY3RiX2FkZHJfdHMgJSBzLT5zcHMtPmN0Yl93aWR0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ2V0X2NhYmFjX3Rlcm1pbmF0ZSgmcy0+SEVWQ2xjLT5jYyk7CisgICAgICAgICAgICAgICAgaWYgKHMtPnRocmVhZHNfbnVtYmVyID09IDEpCisgICAgICAgICAgICAgICAgICAgIGNhYmFjX3JlaW5pdChzLT5IRVZDbGMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2FiYWNfaW5pdF9kZWNvZGVyKHMpOworCisgICAgICAgICAgICAgICAgaWYgKHMtPnNwcy0+Y3RiX3dpZHRoID09IDEpCisgICAgICAgICAgICAgICAgICAgIGNhYmFjX2luaXRfc3RhdGUocyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsb2FkX3N0YXRlcyhzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2RlZmluZSBHRVRfQ0FCQUMoY3R4KSBnZXRfY2FiYWMoJnMtPkhFVkNsYy0+Y2MsICZzLT5IRVZDbGMtPmNhYmFjX3N0YXRlW2N0eF0pCisKK2ludCBmZl9oZXZjX3Nhb19tZXJnZV9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W1NBT19NRVJHRV9GTEFHXSk7Cit9CisKK2ludCBmZl9oZXZjX3Nhb190eXBlX2lkeF9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgaWYgKCFHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbU0FPX1RZUEVfSURYXSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKSkKKyAgICAgICAgcmV0dXJuIFNBT19CQU5EOworICAgIHJldHVybiBTQU9fRURHRTsKK30KKworaW50IGZmX2hldmNfc2FvX2JhbmRfcG9zaXRpb25fZGVjb2RlKEhFVkNDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIGludCB2YWx1ZSA9IGdldF9jYWJhY19ieXBhc3MoJnMtPkhFVkNsYy0+Y2MpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgMSkgfCBnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK2ludCBmZl9oZXZjX3Nhb19vZmZzZXRfYWJzX2RlY29kZShIRVZDQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGxlbmd0aCA9ICgxIDw8IChGRk1JTihzLT5zcHMtPmJpdF9kZXB0aCwgMTApIC0gNSkpIC0gMTsKKworICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIGdldF9jYWJhY19ieXBhc3MoJnMtPkhFVkNsYy0+Y2MpKQorICAgICAgICBpKys7CisgICAgcmV0dXJuIGk7Cit9CisKK2ludCBmZl9oZXZjX3Nhb19vZmZzZXRfc2lnbl9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgcmV0dXJuIGdldF9jYWJhY19ieXBhc3MoJnMtPkhFVkNsYy0+Y2MpOworfQorCitpbnQgZmZfaGV2Y19zYW9fZW9fY2xhc3NfZGVjb2RlKEhFVkNDb250ZXh0ICpzKQoreworICAgIGludCByZXQgPSBnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKSA8PCAxOworICAgIHJldCAgICB8PSBnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfaGV2Y19lbmRfb2Zfc2xpY2VfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgcmV0dXJuIGdldF9jYWJhY190ZXJtaW5hdGUoJnMtPkhFVkNsYy0+Y2MpOworfQorCitpbnQgZmZfaGV2Y19jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W0NVX1RSQU5TUVVBTlRfQllQQVNTX0ZMQUddKTsKK30KKworaW50IGZmX2hldmNfc2tpcF9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCB4X2NiLCBpbnQgeV9jYikKK3sKKyAgICBpbnQgbWluX2NiX3dpZHRoID0gcy0+c3BzLT5taW5fY2Jfd2lkdGg7CisgICAgaW50IGluYyA9IDA7CisgICAgaW50IHgwYiA9IHgwICYgKCgxIDw8IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZSkgLSAxKTsKKyAgICBpbnQgeTBiID0geTAgJiAoKDEgPDwgcy0+c3BzLT5sb2cyX2N0Yl9zaXplKSAtIDEpOworCisgICAgaWYgKHMtPkhFVkNsYy0+Y3RiX2xlZnRfZmxhZyB8fCB4MGIpCisgICAgICAgIGluYyA9ICEhU0FNUExFX0NUQihzLT5za2lwX2ZsYWcsIHhfY2IgLSAxLCB5X2NiKTsKKyAgICBpZiAocy0+SEVWQ2xjLT5jdGJfdXBfZmxhZyB8fCB5MGIpCisgICAgICAgIGluYyArPSAhIVNBTVBMRV9DVEIocy0+c2tpcF9mbGFnLCB4X2NiLCB5X2NiIC0gMSk7CisKKyAgICByZXR1cm4gR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W1NLSVBfRkxBR10gKyBpbmMpOworfQorCitpbnQgZmZfaGV2Y19jdV9xcF9kZWx0YV9hYnMoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgaW50IHByZWZpeF92YWwgPSAwOworICAgIGludCBzdWZmaXhfdmFsID0gMDsKKyAgICBpbnQgaW5jID0gMDsKKworICAgIHdoaWxlIChwcmVmaXhfdmFsIDwgNSAmJiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbQ1VfUVBfREVMVEFdICsgaW5jKSkgeworICAgICAgICBwcmVmaXhfdmFsKys7CisgICAgICAgIGluYyA9IDE7CisgICAgfQorICAgIGlmIChwcmVmaXhfdmFsID49IDUpIHsKKyAgICAgICAgaW50IGsgPSAwOworICAgICAgICB3aGlsZSAoayA8IENBQkFDX01BWF9CSU4gJiYgZ2V0X2NhYmFjX2J5cGFzcygmcy0+SEVWQ2xjLT5jYykpIHsKKyAgICAgICAgICAgIHN1ZmZpeF92YWwgKz0gMSA8PCBrOworICAgICAgICAgICAgaysrOworICAgICAgICB9CisgICAgICAgIGlmIChrID09IENBQkFDX01BWF9CSU4pCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNBQkFDX01BWF9CSU4gOiAlZFxuIiwgayk7CisKKyAgICAgICAgd2hpbGUgKGstLSkKKyAgICAgICAgICAgIHN1ZmZpeF92YWwgKz0gZ2V0X2NhYmFjX2J5cGFzcygmcy0+SEVWQ2xjLT5jYykgPDwgazsKKyAgICB9CisgICAgcmV0dXJuIHByZWZpeF92YWwgKyBzdWZmaXhfdmFsOworfQorCitpbnQgZmZfaGV2Y19jdV9xcF9kZWx0YV9zaWduX2ZsYWcoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgcmV0dXJuIGdldF9jYWJhY19ieXBhc3MoJnMtPkhFVkNsYy0+Y2MpOworfQorCitpbnQgZmZfaGV2Y19jdV9jaHJvbWFfcXBfb2Zmc2V0X2ZsYWcoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgcmV0dXJuIEdFVF9DQUJBQyhlbGVtX29mZnNldFtDVV9DSFJPTUFfUVBfT0ZGU0VUX0ZMQUddKTsKK30KKworaW50IGZmX2hldmNfY3VfY2hyb21hX3FwX29mZnNldF9pZHgoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgaW50IGNfbWF4PSBGRk1BWCg1LCBzLT5wcHMtPmNocm9tYV9xcF9vZmZzZXRfbGlzdF9sZW5fbWludXMxKTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICB3aGlsZSAoaSA8IGNfbWF4ICYmIEdFVF9DQUJBQyhlbGVtX29mZnNldFtDVV9DSFJPTUFfUVBfT0ZGU0VUX0lEWF0pKQorICAgICAgICBpKys7CisKKyAgICByZXR1cm4gaTsKK30KKworaW50IGZmX2hldmNfcHJlZF9tb2RlX2RlY29kZShIRVZDQ29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W1BSRURfTU9ERV9GTEFHXSk7Cit9CisKK2ludCBmZl9oZXZjX3NwbGl0X2NvZGluZ191bml0X2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgY3RfZGVwdGgsIGludCB4MCwgaW50IHkwKQoreworICAgIGludCBpbmMgPSAwLCBkZXB0aF9sZWZ0ID0gMCwgZGVwdGhfdG9wID0gMDsKKyAgICBpbnQgeDBiICA9IHgwICYgKCgxIDw8IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZSkgLSAxKTsKKyAgICBpbnQgeTBiICA9IHkwICYgKCgxIDw8IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZSkgLSAxKTsKKyAgICBpbnQgeF9jYiA9IHgwID4+IHMtPnNwcy0+bG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBpbnQgeV9jYiA9IHkwID4+IHMtPnNwcy0+bG9nMl9taW5fY2Jfc2l6ZTsKKworICAgIGlmIChzLT5IRVZDbGMtPmN0Yl9sZWZ0X2ZsYWcgfHwgeDBiKQorICAgICAgICBkZXB0aF9sZWZ0ID0gcy0+dGFiX2N0X2RlcHRoWyh5X2NiKSAqIHMtPnNwcy0+bWluX2NiX3dpZHRoICsgeF9jYiAtIDFdOworICAgIGlmIChzLT5IRVZDbGMtPmN0Yl91cF9mbGFnIHx8IHkwYikKKyAgICAgICAgZGVwdGhfdG9wID0gcy0+dGFiX2N0X2RlcHRoWyh5X2NiIC0gMSkgKiBzLT5zcHMtPm1pbl9jYl93aWR0aCArIHhfY2JdOworCisgICAgaW5jICs9IChkZXB0aF9sZWZ0ID4gY3RfZGVwdGgpOworICAgIGluYyArPSAoZGVwdGhfdG9wICA+IGN0X2RlcHRoKTsKKworICAgIHJldHVybiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbU1BMSVRfQ09ESU5HX1VOSVRfRkxBR10gKyBpbmMpOworfQorCitpbnQgZmZfaGV2Y19wYXJ0X21vZGVfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgbG9nMl9jYl9zaXplKQoreworICAgIGlmIChHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbUEFSVF9NT0RFXSkpIC8vIDEKKyAgICAgICAgcmV0dXJuIFBBUlRfMk54Mk47CisgICAgaWYgKGxvZzJfY2Jfc2l6ZSA9PSBzLT5zcHMtPmxvZzJfbWluX2NiX3NpemUpIHsKKyAgICAgICAgaWYgKHMtPkhFVkNsYy0+Y3UucHJlZF9tb2RlID09IE1PREVfSU5UUkEpIC8vIDAKKyAgICAgICAgICAgIHJldHVybiBQQVJUX054TjsKKyAgICAgICAgaWYgKEdFVF9DQUJBQyhlbGVtX29mZnNldFtQQVJUX01PREVdICsgMSkpIC8vIDAxCisgICAgICAgICAgICByZXR1cm4gUEFSVF8yTnhOOworICAgICAgICBpZiAobG9nMl9jYl9zaXplID09IDMpIC8vIDAwCisgICAgICAgICAgICByZXR1cm4gUEFSVF9OeDJOOworICAgICAgICBpZiAoR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W1BBUlRfTU9ERV0gKyAyKSkgLy8gMDAxCisgICAgICAgICAgICByZXR1cm4gUEFSVF9OeDJOOworICAgICAgICByZXR1cm4gUEFSVF9OeE47IC8vIDAwMAorICAgIH0KKworICAgIGlmICghcy0+c3BzLT5hbXBfZW5hYmxlZF9mbGFnKSB7CisgICAgICAgIGlmIChHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbUEFSVF9NT0RFXSArIDEpKSAvLyAwMQorICAgICAgICAgICAgcmV0dXJuIFBBUlRfMk54TjsKKyAgICAgICAgcmV0dXJuIFBBUlRfTngyTjsKKyAgICB9CisKKyAgICBpZiAoR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W1BBUlRfTU9ERV0gKyAxKSkgeyAvLyAwMVgsIDAxWFgKKyAgICAgICAgaWYgKEdFVF9DQUJBQyhlbGVtX29mZnNldFtQQVJUX01PREVdICsgMykpIC8vIDAxMQorICAgICAgICAgICAgcmV0dXJuIFBBUlRfMk54TjsKKyAgICAgICAgaWYgKGdldF9jYWJhY19ieXBhc3MoJnMtPkhFVkNsYy0+Y2MpKSAvLyAwMTAxCisgICAgICAgICAgICByZXR1cm4gUEFSVF8yTnhuRDsKKyAgICAgICAgcmV0dXJuIFBBUlRfMk54blU7IC8vIDAxMDAKKyAgICB9CisKKyAgICBpZiAoR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W1BBUlRfTU9ERV0gKyAzKSkgLy8gMDAxCisgICAgICAgIHJldHVybiBQQVJUX054Mk47CisgICAgaWYgKGdldF9jYWJhY19ieXBhc3MoJnMtPkhFVkNsYy0+Y2MpKSAvLyAwMDAxCisgICAgICAgIHJldHVybiBQQVJUX25SeDJOOworICAgIHJldHVybiBQQVJUX25MeDJOOyAgLy8gMDAwMAorfQorCitpbnQgZmZfaGV2Y19wY21fZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgcmV0dXJuIGdldF9jYWJhY190ZXJtaW5hdGUoJnMtPkhFVkNsYy0+Y2MpOworfQorCitpbnQgZmZfaGV2Y19wcmV2X2ludHJhX2x1bWFfcHJlZF9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W1BSRVZfSU5UUkFfTFVNQV9QUkVEX0ZMQUddKTsKK30KKworaW50IGZmX2hldmNfbXBtX2lkeF9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgaW50IGkgPSAwOworICAgIHdoaWxlIChpIDwgMiAmJiBnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKSkKKyAgICAgICAgaSsrOworICAgIHJldHVybiBpOworfQorCitpbnQgZmZfaGV2Y19yZW1faW50cmFfbHVtYV9wcmVkX21vZGVfZGVjb2RlKEhFVkNDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIGludCB2YWx1ZSA9IGdldF9jYWJhY19ieXBhc3MoJnMtPkhFVkNsYy0+Y2MpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgMSkgfCBnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK2ludCBmZl9oZXZjX2ludHJhX2Nocm9tYV9wcmVkX21vZGVfZGVjb2RlKEhFVkNDb250ZXh0ICpzKQoreworICAgIGludCByZXQ7CisgICAgaWYgKCFHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbSU5UUkFfQ0hST01BX1BSRURfTU9ERV0pKQorICAgICAgICByZXR1cm4gNDsKKworICAgIHJldCAgPSBnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKSA8PCAxOworICAgIHJldCB8PSBnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfaGV2Y19tZXJnZV9pZHhfZGVjb2RlKEhFVkNDb250ZXh0ICpzKQoreworICAgIGludCBpID0gR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W01FUkdFX0lEWF0pOworCisgICAgaWYgKGkgIT0gMCkgeworICAgICAgICB3aGlsZSAoaSA8IHMtPnNoLm1heF9udW1fbWVyZ2VfY2FuZC0xICYmIGdldF9jYWJhY19ieXBhc3MoJnMtPkhFVkNsYy0+Y2MpKQorICAgICAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworaW50IGZmX2hldmNfbWVyZ2VfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgcmV0dXJuIEdFVF9DQUJBQyhlbGVtX29mZnNldFtNRVJHRV9GTEFHXSk7Cit9CisKK2ludCBmZl9oZXZjX2ludGVyX3ByZWRfaWRjX2RlY29kZShIRVZDQ29udGV4dCAqcywgaW50IG5QYlcsIGludCBuUGJIKQoreworICAgIGlmIChuUGJXICsgblBiSCA9PSAxMikKKyAgICAgICAgcmV0dXJuIEdFVF9DQUJBQyhlbGVtX29mZnNldFtJTlRFUl9QUkVEX0lEQ10gKyA0KTsKKyAgICBpZiAoR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W0lOVEVSX1BSRURfSURDXSArIHMtPkhFVkNsYy0+Y3RfZGVwdGgpKQorICAgICAgICByZXR1cm4gUFJFRF9CSTsKKworICAgIHJldHVybiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbSU5URVJfUFJFRF9JRENdICsgNCk7Cit9CisKK2ludCBmZl9oZXZjX3JlZl9pZHhfbHhfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgbnVtX3JlZl9pZHhfbHgpCit7CisgICAgaW50IGkgPSAwOworICAgIGludCBtYXggPSBudW1fcmVmX2lkeF9seCAtIDE7CisgICAgaW50IG1heF9jdHggPSBGRk1JTihtYXgsIDIpOworCisgICAgd2hpbGUgKGkgPCBtYXhfY3R4ICYmIEdFVF9DQUJBQyhlbGVtX29mZnNldFtSRUZfSURYX0wwXSArIGkpKQorICAgICAgICBpKys7CisgICAgaWYgKGkgPT0gMikgeworICAgICAgICB3aGlsZSAoaSA8IG1heCAmJiBnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKSkKKyAgICAgICAgICAgIGkrKzsKKyAgICB9CisKKyAgICByZXR1cm4gaTsKK30KKworaW50IGZmX2hldmNfbXZwX2x4X2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzKQoreworICAgIHJldHVybiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbTVZQX0xYX0ZMQUddKTsKK30KKworaW50IGZmX2hldmNfbm9fcmVzaWR1YWxfc3ludGF4X2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzKQoreworICAgIHJldHVybiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbTk9fUkVTSURVQUxfREFUQV9GTEFHXSk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBhYnNfbXZkX2dyZWF0ZXIwX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzKQoreworICAgIHJldHVybiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbQUJTX01WRF9HUkVBVEVSMF9GTEFHXSk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBhYnNfbXZkX2dyZWF0ZXIxX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzKQoreworICAgIHJldHVybiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbQUJTX01WRF9HUkVBVEVSMV9GTEFHXSArIDEpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgbXZkX2RlY29kZShIRVZDQ29udGV4dCAqcykKK3sKKyAgICBpbnQgcmV0ID0gMjsKKyAgICBpbnQgayA9IDE7CisKKyAgICB3aGlsZSAoayA8IENBQkFDX01BWF9CSU4gJiYgZ2V0X2NhYmFjX2J5cGFzcygmcy0+SEVWQ2xjLT5jYykpIHsKKyAgICAgICAgcmV0ICs9IDEgPDwgazsKKyAgICAgICAgaysrOworICAgIH0KKyAgICBpZiAoayA9PSBDQUJBQ19NQVhfQklOKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNBQkFDX01BWF9CSU4gOiAlZFxuIiwgayk7CisgICAgd2hpbGUgKGstLSkKKyAgICAgICAgcmV0ICs9IGdldF9jYWJhY19ieXBhc3MoJnMtPkhFVkNsYy0+Y2MpIDw8IGs7CisgICAgcmV0dXJuIGdldF9jYWJhY19ieXBhc3Nfc2lnbigmcy0+SEVWQ2xjLT5jYywgLXJldCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBtdmRfc2lnbl9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gZ2V0X2NhYmFjX2J5cGFzc19zaWduKCZzLT5IRVZDbGMtPmNjLCAtMSk7Cit9CisKK2ludCBmZl9oZXZjX3NwbGl0X3RyYW5zZm9ybV9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcywgaW50IGxvZzJfdHJhZm9fc2l6ZSkKK3sKKyAgICByZXR1cm4gR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W1NQTElUX1RSQU5TRk9STV9GTEFHXSArIDUgLSBsb2cyX3RyYWZvX3NpemUpOworfQorCitpbnQgZmZfaGV2Y19jYmZfY2JfY3JfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgdHJhZm9fZGVwdGgpCit7CisgICAgcmV0dXJuIEdFVF9DQUJBQyhlbGVtX29mZnNldFtDQkZfQ0JfQ1JdICsgdHJhZm9fZGVwdGgpOworfQorCitpbnQgZmZfaGV2Y19jYmZfbHVtYV9kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCB0cmFmb19kZXB0aCkKK3sKKyAgICByZXR1cm4gR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W0NCRl9MVU1BXSArICF0cmFmb19kZXB0aCk7Cit9CisKK3N0YXRpYyBpbnQgZmZfaGV2Y190cmFuc2Zvcm1fc2tpcF9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcywgaW50IGNfaWR4KQoreworICAgIHJldHVybiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbVFJBTlNGT1JNX1NLSVBfRkxBR10gKyAhIWNfaWR4KTsKK30KKworc3RhdGljIGludCBleHBsaWNpdF9yZHBjbV9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcywgaW50IGNfaWR4KQoreworICAgIHJldHVybiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbRVhQTElDSVRfUkRQQ01fRkxBR10gKyAhIWNfaWR4KTsKK30KKworc3RhdGljIGludCBleHBsaWNpdF9yZHBjbV9kaXJfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCBjX2lkeCkKK3sKKyAgICByZXR1cm4gR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W0VYUExJQ0lUX1JEUENNX0RJUl9GTEFHXSArICEhY19pZHgpOworfQorCitpbnQgZmZfaGV2Y19sb2cyX3Jlc19zY2FsZV9hYnMoSEVWQ0NvbnRleHQgKnMsIGludCBpZHgpIHsKKyAgICBpbnQgaSA9MDsKKworICAgIHdoaWxlIChpIDwgNCAmJiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbTE9HMl9SRVNfU0NBTEVfQUJTXSArIDQgKiBpZHggKyBpKSkKKyAgICAgICAgaSsrOworCisgICAgcmV0dXJuIGk7Cit9CisKK2ludCBmZl9oZXZjX3Jlc19zY2FsZV9zaWduX2ZsYWcoSEVWQ0NvbnRleHQgKnMsIGludCBpZHgpIHsKKyAgICByZXR1cm4gR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W1JFU19TQ0FMRV9TSUdOX0ZMQUddICsgaWR4KTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBsYXN0X3NpZ25pZmljYW50X2NvZWZmX3h5X3ByZWZpeF9kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCBjX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX3NpemUsIGludCAqbGFzdF9zY3hfcHJlZml4LCBpbnQgKmxhc3Rfc2N5X3ByZWZpeCkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IG1heCA9IChsb2cyX3NpemUgPDwgMSkgLSAxOworICAgIGludCBjdHhfb2Zmc2V0LCBjdHhfc2hpZnQ7CisKKyAgICBpZiAoIWNfaWR4KSB7CisgICAgICAgIGN0eF9vZmZzZXQgPSAzICogKGxvZzJfc2l6ZSAtIDIpICArICgobG9nMl9zaXplIC0gMSkgPj4gMik7CisgICAgICAgIGN0eF9zaGlmdCA9IChsb2cyX3NpemUgKyAxKSA+PiAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGN0eF9vZmZzZXQgPSAxNTsKKyAgICAgICAgY3R4X3NoaWZ0ID0gbG9nMl9zaXplIC0gMjsKKyAgICB9CisgICAgd2hpbGUgKGkgPCBtYXggJiYKKyAgICAgICAgICAgR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W0xBU1RfU0lHTklGSUNBTlRfQ09FRkZfWF9QUkVGSVhdICsgKGkgPj4gY3R4X3NoaWZ0KSArIGN0eF9vZmZzZXQpKQorICAgICAgICBpKys7CisgICAgKmxhc3Rfc2N4X3ByZWZpeCA9IGk7CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoaSA8IG1heCAmJgorICAgICAgICAgICBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbTEFTVF9TSUdOSUZJQ0FOVF9DT0VGRl9ZX1BSRUZJWF0gKyAoaSA+PiBjdHhfc2hpZnQpICsgY3R4X29mZnNldCkpCisgICAgICAgIGkrKzsKKyAgICAqbGFzdF9zY3lfcHJlZml4ID0gaTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfc3VmZml4X2RlY29kZShIRVZDQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdF9zaWduaWZpY2FudF9jb2VmZl9wcmVmaXgpCit7CisgICAgaW50IGk7CisgICAgaW50IGxlbmd0aCA9IChsYXN0X3NpZ25pZmljYW50X2NvZWZmX3ByZWZpeCA+PiAxKSAtIDE7CisgICAgaW50IHZhbHVlID0gZ2V0X2NhYmFjX2J5cGFzcygmcy0+SEVWQ2xjLT5jYyk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDEpIHwgZ2V0X2NhYmFjX2J5cGFzcygmcy0+SEVWQ2xjLT5jYyk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgc2lnbmlmaWNhbnRfY29lZmZfZ3JvdXBfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCBjX2lkeCwgaW50IGN0eF9jZykKK3sKKyAgICBpbnQgaW5jOworCisgICAgaW5jID0gRkZNSU4oY3R4X2NnLCAxKSArIChjX2lkeD4wID8gMiA6IDApOworCisgICAgcmV0dXJuIEdFVF9DQUJBQyhlbGVtX29mZnNldFtTSUdOSUZJQ0FOVF9DT0VGRl9HUk9VUF9GTEFHXSArIGluYyk7Cit9CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgc2lnbmlmaWNhbnRfY29lZmZfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCB4X2MsIGludCB5X2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgY29uc3QgdWludDhfdCAqY3R4X2lkeF9tYXApCit7CisgICAgaW50IGluYyA9IGN0eF9pZHhfbWFwWyh5X2MgPDwgMikgKyB4X2NdICsgb2Zmc2V0OworICAgIHJldHVybiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbU0lHTklGSUNBTlRfQ09FRkZfRkxBR10gKyBpbmMpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgc2lnbmlmaWNhbnRfY29lZmZfZmxhZ19kZWNvZGVfMChIRVZDQ29udGV4dCAqcywgaW50IGNfaWR4LCBpbnQgb2Zmc2V0KQoreworICAgIHJldHVybiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbU0lHTklGSUNBTlRfQ09FRkZfRkxBR10gKyBvZmZzZXQpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgY29lZmZfYWJzX2xldmVsX2dyZWF0ZXIxX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgY19pZHgsIGludCBpbmMpCit7CisKKyAgICBpZiAoY19pZHggPiAwKQorICAgICAgICBpbmMgKz0gMTY7CisKKyAgICByZXR1cm4gR0VUX0NBQkFDKGVsZW1fb2Zmc2V0W0NPRUZGX0FCU19MRVZFTF9HUkVBVEVSMV9GTEFHXSArIGluYyk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBjb2VmZl9hYnNfbGV2ZWxfZ3JlYXRlcjJfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCBjX2lkeCwgaW50IGluYykKK3sKKyAgICBpZiAoY19pZHggPiAwKQorICAgICAgICBpbmMgKz0gNDsKKworICAgIHJldHVybiBHRVRfQ0FCQUMoZWxlbV9vZmZzZXRbQ09FRkZfQUJTX0xFVkVMX0dSRUFURVIyX0ZMQUddICsgaW5jKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGNvZWZmX2Fic19sZXZlbF9yZW1haW5pbmdfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgcmNfcmljZV9wYXJhbSkKK3sKKyAgICBpbnQgcHJlZml4ID0gMDsKKyAgICBpbnQgc3VmZml4ID0gMDsKKyAgICBpbnQgbGFzdF9jb2VmZl9hYnNfbGV2ZWxfcmVtYWluaW5nOworICAgIGludCBpOworCisgICAgd2hpbGUgKHByZWZpeCA8IENBQkFDX01BWF9CSU4gJiYgZ2V0X2NhYmFjX2J5cGFzcygmcy0+SEVWQ2xjLT5jYykpCisgICAgICAgIHByZWZpeCsrOworICAgIGlmIChwcmVmaXggPT0gQ0FCQUNfTUFYX0JJTikKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJDQUJBQ19NQVhfQklOIDogJWRcbiIsIHByZWZpeCk7CisgICAgaWYgKHByZWZpeCA8IDMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJjX3JpY2VfcGFyYW07IGkrKykKKyAgICAgICAgICAgIHN1ZmZpeCA9IChzdWZmaXggPDwgMSkgfCBnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKTsKKyAgICAgICAgbGFzdF9jb2VmZl9hYnNfbGV2ZWxfcmVtYWluaW5nID0gKHByZWZpeCA8PCByY19yaWNlX3BhcmFtKSArIHN1ZmZpeDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcHJlZml4X21pbnVzMyA9IHByZWZpeCAtIDM7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVmaXhfbWludXMzICsgcmNfcmljZV9wYXJhbTsgaSsrKQorICAgICAgICAgICAgc3VmZml4ID0gKHN1ZmZpeCA8PCAxKSB8IGdldF9jYWJhY19ieXBhc3MoJnMtPkhFVkNsYy0+Y2MpOworICAgICAgICBsYXN0X2NvZWZmX2Fic19sZXZlbF9yZW1haW5pbmcgPSAoKCgxIDw8IHByZWZpeF9taW51czMpICsgMyAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmNfcmljZV9wYXJhbSkgKyBzdWZmaXg7CisgICAgfQorICAgIHJldHVybiBsYXN0X2NvZWZmX2Fic19sZXZlbF9yZW1haW5pbmc7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBjb2VmZl9zaWduX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCB1aW50OF90IG5iKQoreworICAgIGludCBpOworICAgIGludCByZXQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iOyBpKyspCisgICAgICAgIHJldCA9IChyZXQgPDwgMSkgfCBnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGZmX2hldmNfaGxzX3Jlc2lkdWFsX2NvZGluZyhIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX3RyYWZvX3NpemUsIGVudW0gU2NhblR5cGUgc2Nhbl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjX2lkeCkKK3sKKyNkZWZpbmUgR0VUX0NPT1JEKG9mZnNldCwgbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB4X2MgPSAoeF9jZyA8PCAyKSArIHNjYW5feF9vZmZbbl07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeV9jID0gKHlfY2cgPDwgMikgKyBzY2FuX3lfb2ZmW25dOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICBpbnQgdHJhbnNmb3JtX3NraXBfZmxhZyA9IDA7CisKKyAgICBpbnQgbGFzdF9zaWduaWZpY2FudF9jb2VmZl94LCBsYXN0X3NpZ25pZmljYW50X2NvZWZmX3k7CisgICAgaW50IGxhc3Rfc2Nhbl9wb3M7CisgICAgaW50IG5fZW5kOworICAgIGludCBudW1fY29lZmYgPSAwOworICAgIGludCBncmVhdGVyMV9jdHggPSAxOworCisgICAgaW50IG51bV9sYXN0X3N1YnNldDsKKyAgICBpbnQgeF9jZ19sYXN0X3NpZywgeV9jZ19sYXN0X3NpZzsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW5feF9jZywgKnNjYW5feV9jZywgKnNjYW5feF9vZmYsICpzY2FuX3lfb2ZmOworCisgICAgcHRyZGlmZl90IHN0cmlkZSA9IHMtPmZyYW1lLT5saW5lc2l6ZVtjX2lkeF07CisgICAgaW50IGhzaGlmdCA9IHMtPnNwcy0+aHNoaWZ0W2NfaWR4XTsKKyAgICBpbnQgdnNoaWZ0ID0gcy0+c3BzLT52c2hpZnRbY19pZHhdOworICAgIHVpbnQ4X3QgKmRzdCA9ICZzLT5mcmFtZS0+ZGF0YVtjX2lkeF1bKHkwID4+IHZzaGlmdCkgKiBzdHJpZGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4MCA+PiBoc2hpZnQpIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpXTsKKyAgICBpbnQxNl90ICpjb2VmZnMgPSAoaW50MTZfdCopKGNfaWR4ID8gbGMtPmVkZ2VfZW11X2J1ZmZlcjIgOiBsYy0+ZWRnZV9lbXVfYnVmZmVyKTsKKyAgICB1aW50OF90IHNpZ25pZmljYW50X2NvZWZmX2dyb3VwX2ZsYWdbOF1bOF0gPSB7ezB9fTsKKyAgICBpbnQgZXhwbGljaXRfcmRwY21fZmxhZyA9IDA7CisgICAgaW50IGV4cGxpY2l0X3JkcGNtX2Rpcl9mbGFnOworCisgICAgaW50IHRyYWZvX3NpemUgPSAxIDw8IGxvZzJfdHJhZm9fc2l6ZTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcXAsc2hpZnQsYWRkLHNjYWxlLHNjYWxlX207CisgICAgY29uc3QgdWludDhfdCBsZXZlbF9zY2FsZVtdID0geyA0MCwgNDUsIDUxLCA1NywgNjQsIDcyIH07CisgICAgY29uc3QgdWludDhfdCAqc2NhbGVfbWF0cml4ID0gTlVMTDsKKyAgICB1aW50OF90IGRjX3NjYWxlOworICAgIGludCBwcmVkX21vZGVfaW50cmEgPSAoY19pZHggPT0gMCkgPyBsYy0+dHUuaW50cmFfcHJlZF9tb2RlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZV9jOworCisgICAgbWVtc2V0KGNvZWZmcywgMCwgdHJhZm9fc2l6ZSAqIHRyYWZvX3NpemUgKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgLy8gRGVyaXZlIFFQIGZvciBkZXF1YW50CisgICAgaWYgKCFsYy0+Y3UuY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZykgeworICAgICAgICBzdGF0aWMgY29uc3QgaW50IHFwX2NbXSA9IHsgMjksIDMwLCAzMSwgMzIsIDMzLCAzMywgMzQsIDM0LCAzNSwgMzUsIDM2LCAzNiwgMzcsIDM3IH07CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHJlbTZbNTEgKyA0ICogNiArIDFdID0geworICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwKKyAgICAgICAgICAgIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsCisgICAgICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLAorICAgICAgICAgICAgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMQorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRpdjZbNTEgKyA0ICogNiArIDFdID0geworICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMywgIDMsICAzLAorICAgICAgICAgICAgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNiwgNiwgNiwgNiwgIDYsICA2LAorICAgICAgICAgICAgNywgNywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOSwgOSwgOSwgOSwgOSwgOSwgMTAsIDEwLCAxMCwgMTAsCisgICAgICAgICAgICAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMgorICAgICAgICB9OworICAgICAgICBpbnQgcXBfeSA9IGxjLT5xcF95OworCisgICAgICAgIGlmIChzLT5wcHMtPnRyYW5zZm9ybV9za2lwX2VuYWJsZWRfZmxhZyAmJgorICAgICAgICAgICAgbG9nMl90cmFmb19zaXplIDw9IHMtPnBwcy0+bG9nMl9tYXhfdHJhbnNmb3JtX3NraXBfYmxvY2tfc2l6ZSkgeworICAgICAgICAgICAgdHJhbnNmb3JtX3NraXBfZmxhZyA9IGZmX2hldmNfdHJhbnNmb3JtX3NraXBfZmxhZ19kZWNvZGUocywgY19pZHgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNfaWR4ID09IDApIHsKKyAgICAgICAgICAgIHFwID0gcXBfeSArIHMtPnNwcy0+cXBfYmRfb2Zmc2V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHFwX2ksIG9mZnNldDsKKworICAgICAgICAgICAgaWYgKGNfaWR4ID09IDEpCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcy0+cHBzLT5jYl9xcF9vZmZzZXQgKyBzLT5zaC5zbGljZV9jYl9xcF9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9vZmZzZXRfY2I7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcy0+cHBzLT5jcl9xcF9vZmZzZXQgKyBzLT5zaC5zbGljZV9jcl9xcF9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9vZmZzZXRfY3I7CisKKyAgICAgICAgICAgIHFwX2kgPSBhdl9jbGlwKHFwX3kgKyBvZmZzZXQsIC0gcy0+c3BzLT5xcF9iZF9vZmZzZXQsIDU3KTsKKyAgICAgICAgICAgIGlmIChzLT5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAocXBfaSA8IDMwKQorICAgICAgICAgICAgICAgICAgICBxcCA9IHFwX2k7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocXBfaSA+IDQzKQorICAgICAgICAgICAgICAgICAgICBxcCA9IHFwX2kgLSA2OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcXAgPSBxcF9jW3FwX2kgLSAzMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChxcF9pID4gNTEpCisgICAgICAgICAgICAgICAgICAgIHFwID0gNTE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBxcCA9IHFwX2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHFwICs9IHMtPnNwcy0+cXBfYmRfb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgc2hpZnQgICAgPSBzLT5zcHMtPmJpdF9kZXB0aCArIGxvZzJfdHJhZm9fc2l6ZSAtIDU7CisgICAgICAgIGFkZCAgICAgID0gMSA8PCAoc2hpZnQtMSk7CisgICAgICAgIHNjYWxlICAgID0gbGV2ZWxfc2NhbGVbcmVtNltxcF1dIDw8IChkaXY2W3FwXSk7CisgICAgICAgIHNjYWxlX20gID0gMTY7IC8vIGRlZmF1bHQgd2hlbiBubyBjdXN0b20gc2NhbGluZyBsaXN0cy4KKyAgICAgICAgZGNfc2NhbGUgPSAxNjsKKworICAgICAgICBpZiAocy0+c3BzLT5zY2FsaW5nX2xpc3RfZW5hYmxlX2ZsYWcgJiYgISh0cmFuc2Zvcm1fc2tpcF9mbGFnICYmIGxvZzJfdHJhZm9fc2l6ZSA+IDIpKSB7CisgICAgICAgICAgICBjb25zdCBTY2FsaW5nTGlzdCAqc2wgPSBzLT5wcHMtPnNjYWxpbmdfbGlzdF9kYXRhX3ByZXNlbnRfZmxhZyA/CisgICAgICAgICAgICAmcy0+cHBzLT5zY2FsaW5nX2xpc3QgOiAmcy0+c3BzLT5zY2FsaW5nX2xpc3Q7CisgICAgICAgICAgICBpbnQgbWF0cml4X2lkID0gbGMtPmN1LnByZWRfbW9kZSAhPSBNT0RFX0lOVFJBOworCisgICAgICAgICAgICBtYXRyaXhfaWQgPSAzICogbWF0cml4X2lkICsgY19pZHg7CisKKyAgICAgICAgICAgIHNjYWxlX21hdHJpeCA9IHNsLT5zbFtsb2cyX3RyYWZvX3NpemUgLSAyXVttYXRyaXhfaWRdOworICAgICAgICAgICAgaWYgKGxvZzJfdHJhZm9fc2l6ZSA+PSA0KQorICAgICAgICAgICAgICAgIGRjX3NjYWxlID0gc2wtPnNsX2RjW2xvZzJfdHJhZm9fc2l6ZSAtIDRdW21hdHJpeF9pZF07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzaGlmdCAgICAgICAgPSAwOworICAgICAgICBhZGQgICAgICAgICAgPSAwOworICAgICAgICBzY2FsZSAgICAgICAgPSAwOworICAgICAgICBkY19zY2FsZSAgICAgPSAwOworICAgIH0KKworICAgIGlmIChsYy0+Y3UucHJlZF9tb2RlID09IE1PREVfSU5URVIgJiYgcy0+c3BzLT5leHBsaWNpdF9yZHBjbV9lbmFibGVkX2ZsYWcgJiYKKyAgICAgICAgKHRyYW5zZm9ybV9za2lwX2ZsYWcgfHwgbGMtPmN1LmN1X3RyYW5zcXVhbnRfYnlwYXNzX2ZsYWcpKSB7CisgICAgICAgIGV4cGxpY2l0X3JkcGNtX2ZsYWcgPSBleHBsaWNpdF9yZHBjbV9mbGFnX2RlY29kZShzLCBjX2lkeCk7CisgICAgICAgIGlmIChleHBsaWNpdF9yZHBjbV9mbGFnKSB7CisgICAgICAgICAgICBleHBsaWNpdF9yZHBjbV9kaXJfZmxhZyA9IGV4cGxpY2l0X3JkcGNtX2Rpcl9mbGFnX2RlY29kZShzLCBjX2lkeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsYXN0X3NpZ25pZmljYW50X2NvZWZmX3h5X3ByZWZpeF9kZWNvZGUocywgY19pZHgsIGxvZzJfdHJhZm9fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGFzdF9zaWduaWZpY2FudF9jb2VmZl94LCAmbGFzdF9zaWduaWZpY2FudF9jb2VmZl95KTsKKworICAgIGlmIChsYXN0X3NpZ25pZmljYW50X2NvZWZmX3ggPiAzKSB7CisgICAgICAgIGludCBzdWZmaXggPSBsYXN0X3NpZ25pZmljYW50X2NvZWZmX3N1ZmZpeF9kZWNvZGUocywgbGFzdF9zaWduaWZpY2FudF9jb2VmZl94KTsKKyAgICAgICAgbGFzdF9zaWduaWZpY2FudF9jb2VmZl94ID0gKDEgPDwgKChsYXN0X3NpZ25pZmljYW50X2NvZWZmX3ggPj4gMSkgLSAxKSkgKgorICAgICAgICAoMiArIChsYXN0X3NpZ25pZmljYW50X2NvZWZmX3ggJiAxKSkgKworICAgICAgICBzdWZmaXg7CisgICAgfQorCisgICAgaWYgKGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeSA+IDMpIHsKKyAgICAgICAgaW50IHN1ZmZpeCA9IGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfc3VmZml4X2RlY29kZShzLCBsYXN0X3NpZ25pZmljYW50X2NvZWZmX3kpOworICAgICAgICBsYXN0X3NpZ25pZmljYW50X2NvZWZmX3kgPSAoMSA8PCAoKGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeSA+PiAxKSAtIDEpKSAqCisgICAgICAgICgyICsgKGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeSAmIDEpKSArCisgICAgICAgIHN1ZmZpeDsKKyAgICB9CisKKyAgICBpZiAoc2Nhbl9pZHggPT0gU0NBTl9WRVJUKQorICAgICAgICBGRlNXQVAoaW50LCBsYXN0X3NpZ25pZmljYW50X2NvZWZmX3gsIGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeSk7CisKKyAgICB4X2NnX2xhc3Rfc2lnID0gbGFzdF9zaWduaWZpY2FudF9jb2VmZl94ID4+IDI7CisgICAgeV9jZ19sYXN0X3NpZyA9IGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeSA+PiAyOworCisgICAgc3dpdGNoIChzY2FuX2lkeCkgeworICAgIGNhc2UgU0NBTl9ESUFHOiB7CisgICAgICAgIGludCBsYXN0X3hfYyA9IGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeCAmIDM7CisgICAgICAgIGludCBsYXN0X3lfYyA9IGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeSAmIDM7CisKKyAgICAgICAgc2Nhbl94X29mZiA9IGZmX2hldmNfZGlhZ19zY2FuNHg0X3g7CisgICAgICAgIHNjYW5feV9vZmYgPSBmZl9oZXZjX2RpYWdfc2NhbjR4NF95OworICAgICAgICBudW1fY29lZmYgPSBkaWFnX3NjYW40eDRfaW52W2xhc3RfeV9jXVtsYXN0X3hfY107CisgICAgICAgIGlmICh0cmFmb19zaXplID09IDQpIHsKKyAgICAgICAgICAgIHNjYW5feF9jZyA9IHNjYW5fMXgxOworICAgICAgICAgICAgc2Nhbl95X2NnID0gc2Nhbl8xeDE7CisgICAgICAgIH0gZWxzZSBpZiAodHJhZm9fc2l6ZSA9PSA4KSB7CisgICAgICAgICAgICBudW1fY29lZmYgKz0gZGlhZ19zY2FuMngyX2ludlt5X2NnX2xhc3Rfc2lnXVt4X2NnX2xhc3Rfc2lnXSA8PCA0OworICAgICAgICAgICAgc2Nhbl94X2NnID0gZGlhZ19zY2FuMngyX3g7CisgICAgICAgICAgICBzY2FuX3lfY2cgPSBkaWFnX3NjYW4yeDJfeTsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFmb19zaXplID09IDE2KSB7CisgICAgICAgICAgICBudW1fY29lZmYgKz0gZGlhZ19zY2FuNHg0X2ludlt5X2NnX2xhc3Rfc2lnXVt4X2NnX2xhc3Rfc2lnXSA8PCA0OworICAgICAgICAgICAgc2Nhbl94X2NnID0gZmZfaGV2Y19kaWFnX3NjYW40eDRfeDsKKyAgICAgICAgICAgIHNjYW5feV9jZyA9IGZmX2hldmNfZGlhZ19zY2FuNHg0X3k7CisgICAgICAgIH0gZWxzZSB7IC8vIHRyYWZvX3NpemUgPT0gMzIKKyAgICAgICAgICAgIG51bV9jb2VmZiArPSBkaWFnX3NjYW44eDhfaW52W3lfY2dfbGFzdF9zaWddW3hfY2dfbGFzdF9zaWddIDw8IDQ7CisgICAgICAgICAgICBzY2FuX3hfY2cgPSBmZl9oZXZjX2RpYWdfc2Nhbjh4OF94OworICAgICAgICAgICAgc2Nhbl95X2NnID0gZmZfaGV2Y19kaWFnX3NjYW44eDhfeTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBTQ0FOX0hPUklaOgorICAgICAgICBzY2FuX3hfY2cgPSBob3Jpel9zY2FuMngyX3g7CisgICAgICAgIHNjYW5feV9jZyA9IGhvcml6X3NjYW4yeDJfeTsKKyAgICAgICAgc2Nhbl94X29mZiA9IGhvcml6X3NjYW40eDRfeDsKKyAgICAgICAgc2Nhbl95X29mZiA9IGhvcml6X3NjYW40eDRfeTsKKyAgICAgICAgbnVtX2NvZWZmID0gaG9yaXpfc2Nhbjh4OF9pbnZbbGFzdF9zaWduaWZpY2FudF9jb2VmZl95XVtsYXN0X3NpZ25pZmljYW50X2NvZWZmX3hdOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAvL1NDQU5fVkVSVAorICAgICAgICBzY2FuX3hfY2cgPSBob3Jpel9zY2FuMngyX3k7CisgICAgICAgIHNjYW5feV9jZyA9IGhvcml6X3NjYW4yeDJfeDsKKyAgICAgICAgc2Nhbl94X29mZiA9IGhvcml6X3NjYW40eDRfeTsKKyAgICAgICAgc2Nhbl95X29mZiA9IGhvcml6X3NjYW40eDRfeDsKKyAgICAgICAgbnVtX2NvZWZmID0gaG9yaXpfc2Nhbjh4OF9pbnZbbGFzdF9zaWduaWZpY2FudF9jb2VmZl94XVtsYXN0X3NpZ25pZmljYW50X2NvZWZmX3ldOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgbnVtX2NvZWZmKys7CisgICAgbnVtX2xhc3Rfc3Vic2V0ID0gKG51bV9jb2VmZiAtIDEpID4+IDQ7CisKKyAgICBmb3IgKGkgPSBudW1fbGFzdF9zdWJzZXQ7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGludCBuLCBtOworICAgICAgICBpbnQgeF9jZywgeV9jZywgeF9jLCB5X2MsIHBvczsKKyAgICAgICAgaW50IGltcGxpY2l0X25vbl96ZXJvX2NvZWZmID0gMDsKKyAgICAgICAgaW50NjRfdCB0cmFuc19jb2VmZl9sZXZlbDsKKyAgICAgICAgaW50IHByZXZfc2lnID0gMDsKKyAgICAgICAgaW50IG9mZnNldCA9IGkgPDwgNDsKKyAgICAgICAgaW50IHJpY2VfaW5pdCA9IDA7CisKKyAgICAgICAgdWludDhfdCBzaWduaWZpY2FudF9jb2VmZl9mbGFnX2lkeFsxNl07CisgICAgICAgIHVpbnQ4X3QgbmJfc2lnbmlmaWNhbnRfY29lZmZfZmxhZyA9IDA7CisKKyAgICAgICAgeF9jZyA9IHNjYW5feF9jZ1tpXTsKKyAgICAgICAgeV9jZyA9IHNjYW5feV9jZ1tpXTsKKworICAgICAgICBpZiAoKGkgPCBudW1fbGFzdF9zdWJzZXQpICYmIChpID4gMCkpIHsKKyAgICAgICAgICAgIGludCBjdHhfY2cgPSAwOworICAgICAgICAgICAgaWYgKHhfY2cgPCAoMSA8PCAobG9nMl90cmFmb19zaXplIC0gMikpIC0gMSkKKyAgICAgICAgICAgICAgICBjdHhfY2cgKz0gc2lnbmlmaWNhbnRfY29lZmZfZ3JvdXBfZmxhZ1t4X2NnICsgMV1beV9jZ107CisgICAgICAgICAgICBpZiAoeV9jZyA8ICgxIDw8IChsb2cyX3RyYWZvX3NpemUgLSAyKSkgLSAxKQorICAgICAgICAgICAgICAgIGN0eF9jZyArPSBzaWduaWZpY2FudF9jb2VmZl9ncm91cF9mbGFnW3hfY2ddW3lfY2cgKyAxXTsKKworICAgICAgICAgICAgc2lnbmlmaWNhbnRfY29lZmZfZ3JvdXBfZmxhZ1t4X2NnXVt5X2NnXSA9CisgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnRfY29lZmZfZ3JvdXBfZmxhZ19kZWNvZGUocywgY19pZHgsIGN0eF9jZyk7CisgICAgICAgICAgICBpbXBsaWNpdF9ub25femVyb19jb2VmZiA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaWduaWZpY2FudF9jb2VmZl9ncm91cF9mbGFnW3hfY2ddW3lfY2ddID0KKyAgICAgICAgICAgICgoeF9jZyA9PSB4X2NnX2xhc3Rfc2lnICYmIHlfY2cgPT0geV9jZ19sYXN0X3NpZykgfHwKKyAgICAgICAgICAgICAoeF9jZyA9PSAwICYmIHlfY2cgPT0gMCkpOworICAgICAgICB9CisKKyAgICAgICAgbGFzdF9zY2FuX3BvcyA9IG51bV9jb2VmZiAtIG9mZnNldCAtIDE7CisKKyAgICAgICAgaWYgKGkgPT0gbnVtX2xhc3Rfc3Vic2V0KSB7CisgICAgICAgICAgICBuX2VuZCA9IGxhc3Rfc2Nhbl9wb3MgLSAxOworICAgICAgICAgICAgc2lnbmlmaWNhbnRfY29lZmZfZmxhZ19pZHhbMF0gPSBsYXN0X3NjYW5fcG9zOworICAgICAgICAgICAgbmJfc2lnbmlmaWNhbnRfY29lZmZfZmxhZyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuX2VuZCA9IDE1OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHhfY2cgPCAoKDEgPDwgbG9nMl90cmFmb19zaXplKSAtIDEpID4+IDIpCisgICAgICAgICAgICBwcmV2X3NpZyA9ICEhc2lnbmlmaWNhbnRfY29lZmZfZ3JvdXBfZmxhZ1t4X2NnICsgMV1beV9jZ107CisgICAgICAgIGlmICh5X2NnIDwgKCgxIDw8IGxvZzJfdHJhZm9fc2l6ZSkgLSAxKSA+PiAyKQorICAgICAgICAgICAgcHJldl9zaWcgKz0gKCEhc2lnbmlmaWNhbnRfY29lZmZfZ3JvdXBfZmxhZ1t4X2NnXVt5X2NnICsgMV0gPDwgMSk7CisKKyAgICAgICAgaWYgKHNpZ25pZmljYW50X2NvZWZmX2dyb3VwX2ZsYWdbeF9jZ11beV9jZ10gJiYgbl9lbmQgPj0gMCkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgY3R4X2lkeF9tYXBbXSA9IHsKKyAgICAgICAgICAgICAgICAwLCAxLCA0LCA1LCAyLCAzLCA0LCA1LCA2LCA2LCA4LCA4LCA3LCA3LCA4LCA4LCAvLyBsb2cyX3RyYWZvX3NpemUgPT0gMgorICAgICAgICAgICAgICAgIDEsIDEsIDEsIDAsIDEsIDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIHByZXZfc2lnID09IDAKKyAgICAgICAgICAgICAgICAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyBwcmV2X3NpZyA9PSAxCisgICAgICAgICAgICAgICAgMiwgMSwgMCwgMCwgMiwgMSwgMCwgMCwgMiwgMSwgMCwgMCwgMiwgMSwgMCwgMCwgLy8gcHJldl9zaWcgPT0gMgorICAgICAgICAgICAgICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIgIC8vIGRlZmF1bHQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdHhfaWR4X21hcF9wOworICAgICAgICAgICAgaW50IHNjZl9vZmZzZXQgPSAwOworICAgICAgICAgICAgaWYgKHMtPnNwcy0+dHJhbnNmb3JtX3NraXBfY29udGV4dF9lbmFibGVkX2ZsYWcgJiYKKyAgICAgICAgICAgICAgICAodHJhbnNmb3JtX3NraXBfZmxhZyB8fCBsYy0+Y3UuY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZykpIHsKKyAgICAgICAgICAgICAgICBjdHhfaWR4X21hcF9wID0gKHVpbnQ4X3QqKSAmY3R4X2lkeF9tYXBbNCAqIDE2XTsKKyAgICAgICAgICAgICAgICBpZiAoY19pZHggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzY2Zfb2Zmc2V0ID0gNDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NmX29mZnNldCA9IDE0ICsgMjc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY19pZHggIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgc2NmX29mZnNldCA9IDI3OworICAgICAgICAgICAgICAgIGlmIChsb2cyX3RyYWZvX3NpemUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBjdHhfaWR4X21hcF9wID0gKHVpbnQ4X3QqKSAmY3R4X2lkeF9tYXBbMF07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3R4X2lkeF9tYXBfcCA9ICh1aW50OF90KikgJmN0eF9pZHhfbWFwWyhwcmV2X3NpZyArIDEpIDw8IDRdOworICAgICAgICAgICAgICAgICAgICBpZiAoY19pZHggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh4X2NnID4gMCB8fCB5X2NnID4gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmX29mZnNldCArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZzJfdHJhZm9fc2l6ZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmX29mZnNldCArPSAoc2Nhbl9pZHggPT0gU0NBTl9ESUFHKSA/IDkgOiAxNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmX29mZnNldCArPSAyMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cyX3RyYWZvX3NpemUgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2Zfb2Zmc2V0ICs9IDk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmX29mZnNldCArPSAxMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAobiA9IG5fZW5kOyBuID4gMDsgbi0tKSB7CisgICAgICAgICAgICAgICAgeF9jID0gc2Nhbl94X29mZltuXTsKKyAgICAgICAgICAgICAgICB5X2MgPSBzY2FuX3lfb2ZmW25dOworICAgICAgICAgICAgICAgIGlmIChzaWduaWZpY2FudF9jb2VmZl9mbGFnX2RlY29kZShzLCB4X2MsIHlfYywgc2NmX29mZnNldCwgY3R4X2lkeF9tYXBfcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnRfY29lZmZfZmxhZ19pZHhbbmJfc2lnbmlmaWNhbnRfY29lZmZfZmxhZ10gPSBuOworICAgICAgICAgICAgICAgICAgICBuYl9zaWduaWZpY2FudF9jb2VmZl9mbGFnKys7CisgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0X25vbl96ZXJvX2NvZWZmID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW1wbGljaXRfbm9uX3plcm9fY29lZmYgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5zcHMtPnRyYW5zZm9ybV9za2lwX2NvbnRleHRfZW5hYmxlZF9mbGFnICYmCisgICAgICAgICAgICAgICAgICAgICh0cmFuc2Zvcm1fc2tpcF9mbGFnIHx8IGxjLT5jdS5jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY19pZHggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NmX29mZnNldCA9IDQyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NmX29mZnNldCA9IDE2ICsgMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY19pZHggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2Zfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2Zfb2Zmc2V0ID0gMjc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2Zfb2Zmc2V0ID0gMiArIHNjZl9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNpZ25pZmljYW50X2NvZWZmX2ZsYWdfZGVjb2RlXzAocywgY19pZHgsIHNjZl9vZmZzZXQpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnRfY29lZmZfZmxhZ19pZHhbbmJfc2lnbmlmaWNhbnRfY29lZmZfZmxhZ10gPSAwOworICAgICAgICAgICAgICAgICAgICBuYl9zaWduaWZpY2FudF9jb2VmZl9mbGFnKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaWduaWZpY2FudF9jb2VmZl9mbGFnX2lkeFtuYl9zaWduaWZpY2FudF9jb2VmZl9mbGFnXSA9IDA7CisgICAgICAgICAgICAgICAgbmJfc2lnbmlmaWNhbnRfY29lZmZfZmxhZysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbl9lbmQgPSBuYl9zaWduaWZpY2FudF9jb2VmZl9mbGFnOworCisKKyAgICAgICAgaWYgKG5fZW5kKSB7CisgICAgICAgICAgICBpbnQgZmlyc3RfbnpfcG9zX2luX2NnOworICAgICAgICAgICAgaW50IGxhc3RfbnpfcG9zX2luX2NnOworICAgICAgICAgICAgaW50IGNfcmljZV9wYXJhbSA9IDA7CisgICAgICAgICAgICBpbnQgZmlyc3RfZ3JlYXRlcjFfY29lZmZfaWR4ID0gLTE7CisgICAgICAgICAgICB1aW50OF90IGNvZWZmX2Fic19sZXZlbF9ncmVhdGVyMV9mbGFnWzhdOworICAgICAgICAgICAgdWludDE2X3QgY29lZmZfc2lnbl9mbGFnOworICAgICAgICAgICAgaW50IHN1bV9hYnMgPSAwOworICAgICAgICAgICAgaW50IHNpZ25faGlkZGVuOworICAgICAgICAgICAgaW50IHNiX3R5cGU7CisKKworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBmaXJzdCBlbGVtIG9mIGNvZWZmX2Jhc19sZXZlbF9ncmVhdGVyMV9mbGFnCisgICAgICAgICAgICBpbnQgY3R4X3NldCA9IChpID4gMCAmJiBjX2lkeCA9PSAwKSA/IDIgOiAwOworCisgICAgICAgICAgICBpZiAocy0+c3BzLT5wZXJzaXN0ZW50X3JpY2VfYWRhcHRhdGlvbl9lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXRyYW5zZm9ybV9za2lwX2ZsYWcgJiYgIWxjLT5jdS5jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnKQorICAgICAgICAgICAgICAgICAgICBzYl90eXBlID0gMiAqIChjX2lkeCA9PSAwID8gMSA6IDApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2JfdHlwZSA9IDIgKiAoY19pZHggPT0gMCA/IDEgOiAwKSArIDE7CisgICAgICAgICAgICAgICAgY19yaWNlX3BhcmFtID0gbGMtPnN0YXRfY29lZmZbc2JfdHlwZV0gLyA0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIShpID09IG51bV9sYXN0X3N1YnNldCkgJiYgZ3JlYXRlcjFfY3R4ID09IDApCisgICAgICAgICAgICAgICAgY3R4X3NldCsrOworICAgICAgICAgICAgZ3JlYXRlcjFfY3R4ID0gMTsKKyAgICAgICAgICAgIGxhc3RfbnpfcG9zX2luX2NnID0gc2lnbmlmaWNhbnRfY29lZmZfZmxhZ19pZHhbMF07CisKKyAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCAobl9lbmQgPiA4ID8gOCA6IG5fZW5kKTsgbSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGluYyA9IChjdHhfc2V0IDw8IDIpICsgZ3JlYXRlcjFfY3R4OworICAgICAgICAgICAgICAgIGNvZWZmX2Fic19sZXZlbF9ncmVhdGVyMV9mbGFnW21dID0KKyAgICAgICAgICAgICAgICAgICAgY29lZmZfYWJzX2xldmVsX2dyZWF0ZXIxX2ZsYWdfZGVjb2RlKHMsIGNfaWR4LCBpbmMpOworICAgICAgICAgICAgICAgIGlmIChjb2VmZl9hYnNfbGV2ZWxfZ3JlYXRlcjFfZmxhZ1ttXSkgeworICAgICAgICAgICAgICAgICAgICBncmVhdGVyMV9jdHggPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RfZ3JlYXRlcjFfY29lZmZfaWR4ID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfZ3JlYXRlcjFfY29lZmZfaWR4ID0gbTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyZWF0ZXIxX2N0eCA+IDAgJiYgZ3JlYXRlcjFfY3R4IDwgMykgeworICAgICAgICAgICAgICAgICAgICBncmVhdGVyMV9jdHgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXJzdF9uel9wb3NfaW5fY2cgPSBzaWduaWZpY2FudF9jb2VmZl9mbGFnX2lkeFtuX2VuZCAtIDFdOworCisgICAgICAgICAgICBpZiAobGMtPmN1LmN1X3RyYW5zcXVhbnRfYnlwYXNzX2ZsYWcgfHwKKyAgICAgICAgICAgICAgICAobGMtPmN1LnByZWRfbW9kZSA9PSAgTU9ERV9JTlRSQSAgJiYKKyAgICAgICAgICAgICAgICAgcy0+c3BzLT5pbXBsaWNpdF9yZHBjbV9lbmFibGVkX2ZsYWcgICYmICB0cmFuc2Zvcm1fc2tpcF9mbGFnICAmJgorICAgICAgICAgICAgICAgICAocHJlZF9tb2RlX2ludHJhID09IDEwIHx8IHByZWRfbW9kZV9pbnRyYSAgPT0gIDI2ICkpIHx8CisgICAgICAgICAgICAgICAgIGV4cGxpY2l0X3JkcGNtX2ZsYWcpCisgICAgICAgICAgICAgICAgc2lnbl9oaWRkZW4gPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNpZ25faGlkZGVuID0gKGxhc3RfbnpfcG9zX2luX2NnIC0gZmlyc3RfbnpfcG9zX2luX2NnID49IDQpOworCisgICAgICAgICAgICBpZiAoZmlyc3RfZ3JlYXRlcjFfY29lZmZfaWR4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgY29lZmZfYWJzX2xldmVsX2dyZWF0ZXIxX2ZsYWdbZmlyc3RfZ3JlYXRlcjFfY29lZmZfaWR4XSArPSBjb2VmZl9hYnNfbGV2ZWxfZ3JlYXRlcjJfZmxhZ19kZWNvZGUocywgY19pZHgsIGN0eF9zZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzLT5wcHMtPnNpZ25fZGF0YV9oaWRpbmdfZmxhZyB8fCAhc2lnbl9oaWRkZW4gKSB7CisgICAgICAgICAgICAgICAgY29lZmZfc2lnbl9mbGFnID0gY29lZmZfc2lnbl9mbGFnX2RlY29kZShzLCBuYl9zaWduaWZpY2FudF9jb2VmZl9mbGFnKSA8PCAoMTYgLSBuYl9zaWduaWZpY2FudF9jb2VmZl9mbGFnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29lZmZfc2lnbl9mbGFnID0gY29lZmZfc2lnbl9mbGFnX2RlY29kZShzLCBuYl9zaWduaWZpY2FudF9jb2VmZl9mbGFnIC0gMSkgPDwgKDE2IC0gKG5iX3NpZ25pZmljYW50X2NvZWZmX2ZsYWcgLSAxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCBuX2VuZDsgbSsrKSB7CisgICAgICAgICAgICAgICAgbiA9IHNpZ25pZmljYW50X2NvZWZmX2ZsYWdfaWR4W21dOworICAgICAgICAgICAgICAgIEdFVF9DT09SRChvZmZzZXQsIG4pOworICAgICAgICAgICAgICAgIGlmIChtIDwgOCkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc19jb2VmZl9sZXZlbCA9IDEgKyBjb2VmZl9hYnNfbGV2ZWxfZ3JlYXRlcjFfZmxhZ1ttXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zX2NvZWZmX2xldmVsID09ICgobSA9PSBmaXJzdF9ncmVhdGVyMV9jb2VmZl9pZHgpID8gMyA6IDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdF9jb2VmZl9hYnNfbGV2ZWxfcmVtYWluaW5nID0gY29lZmZfYWJzX2xldmVsX3JlbWFpbmluZ19kZWNvZGUocywgY19yaWNlX3BhcmFtKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNfY29lZmZfbGV2ZWwgKz0gbGFzdF9jb2VmZl9hYnNfbGV2ZWxfcmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zX2NvZWZmX2xldmVsID4gKDMgPDwgY19yaWNlX3BhcmFtKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3JpY2VfcGFyYW0gPSBzLT5zcHMtPnBlcnNpc3RlbnRfcmljZV9hZGFwdGF0aW9uX2VuYWJsZWRfZmxhZyA/IGNfcmljZV9wYXJhbSArIDEgOiBGRk1JTihjX3JpY2VfcGFyYW0gKyAxLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5zcHMtPnBlcnNpc3RlbnRfcmljZV9hZGFwdGF0aW9uX2VuYWJsZWRfZmxhZyAmJiAhcmljZV9pbml0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNfcmljZV9wX2luaXQgPSBsYy0+c3RhdF9jb2VmZltzYl90eXBlXSAvIDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfY29lZmZfYWJzX2xldmVsX3JlbWFpbmluZyA+PSAoMyA8PCBjX3JpY2VfcF9pbml0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMtPnN0YXRfY29lZmZbc2JfdHlwZV0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgyICogbGFzdF9jb2VmZl9hYnNfbGV2ZWxfcmVtYWluaW5nIDwgKDEgPDwgY19yaWNlX3BfaW5pdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYy0+c3RhdF9jb2VmZltzYl90eXBlXSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYy0+c3RhdF9jb2VmZltzYl90eXBlXS0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpY2VfaW5pdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdF9jb2VmZl9hYnNfbGV2ZWxfcmVtYWluaW5nID0gY29lZmZfYWJzX2xldmVsX3JlbWFpbmluZ19kZWNvZGUocywgY19yaWNlX3BhcmFtKTsKKworICAgICAgICAgICAgICAgICAgICB0cmFuc19jb2VmZl9sZXZlbCA9IDEgKyBsYXN0X2NvZWZmX2Fic19sZXZlbF9yZW1haW5pbmc7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc19jb2VmZl9sZXZlbCA+ICgzIDw8IGNfcmljZV9wYXJhbSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjX3JpY2VfcGFyYW0gPSBzLT5zcHMtPnBlcnNpc3RlbnRfcmljZV9hZGFwdGF0aW9uX2VuYWJsZWRfZmxhZyA/IGNfcmljZV9wYXJhbSArIDEgOiBGRk1JTihjX3JpY2VfcGFyYW0gKyAxLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnNwcy0+cGVyc2lzdGVudF9yaWNlX2FkYXB0YXRpb25fZW5hYmxlZF9mbGFnICYmICFyaWNlX2luaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjX3JpY2VfcF9pbml0ID0gbGMtPnN0YXRfY29lZmZbc2JfdHlwZV0gLyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfY29lZmZfYWJzX2xldmVsX3JlbWFpbmluZyA+PSAoMyA8PCBjX3JpY2VfcF9pbml0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYy0+c3RhdF9jb2VmZltzYl90eXBlXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoMiAqIGxhc3RfY29lZmZfYWJzX2xldmVsX3JlbWFpbmluZyA8ICgxIDw8IGNfcmljZV9wX2luaXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYy0+c3RhdF9jb2VmZltzYl90eXBlXSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjLT5zdGF0X2NvZWZmW3NiX3R5cGVdLS07CisgICAgICAgICAgICAgICAgICAgICAgICByaWNlX2luaXQgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzLT5wcHMtPnNpZ25fZGF0YV9oaWRpbmdfZmxhZyAmJiBzaWduX2hpZGRlbikgeworICAgICAgICAgICAgICAgICAgICBzdW1fYWJzICs9IHRyYW5zX2NvZWZmX2xldmVsOworICAgICAgICAgICAgICAgICAgICBpZiAobiA9PSBmaXJzdF9uel9wb3NfaW5fY2cgJiYgKHN1bV9hYnMmMSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc19jb2VmZl9sZXZlbCA9IC10cmFuc19jb2VmZl9sZXZlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvZWZmX3NpZ25fZmxhZyA+PiAxNSkKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNfY29lZmZfbGV2ZWwgPSAtdHJhbnNfY29lZmZfbGV2ZWw7CisgICAgICAgICAgICAgICAgY29lZmZfc2lnbl9mbGFnIDw8PSAxOworICAgICAgICAgICAgICAgIGlmKCFsYy0+Y3UuY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZykgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+c3BzLT5zY2FsaW5nX2xpc3RfZW5hYmxlX2ZsYWcgJiYgISh0cmFuc2Zvcm1fc2tpcF9mbGFnICYmIGxvZzJfdHJhZm9fc2l6ZSA+IDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZih5X2MgfHwgeF9jIHx8IGxvZzJfdHJhZm9fc2l6ZSA8IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobG9nMl90cmFmb19zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcG9zID0gKHlfYyA8PCAzKSArIHhfYzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcG9zID0gKCh5X2MgPj4gMSkgPDwgMykgKyAoeF9jID4+IDEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiBwb3MgPSAoKHlfYyA+PiAyKSA8PCAzKSArICh4X2MgPj4gMik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBwb3MgPSAoeV9jIDw8IDIpICsgeF9jOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfbSA9IHNjYWxlX21hdHJpeFtwb3NdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9tID0gZGNfc2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNfY29lZmZfbGV2ZWwgPSAodHJhbnNfY29lZmZfbGV2ZWwgKiAoaW50NjRfdClzY2FsZSAqIChpbnQ2NF90KXNjYWxlX20gKyBhZGQpID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBpZih0cmFuc19jb2VmZl9sZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh+dHJhbnNfY29lZmZfbGV2ZWwpICYgMHhGZmZmZmZmZmZmZjgwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNfY29lZmZfbGV2ZWwgPSAtMzI3Njg7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZih0cmFuc19jb2VmZl9sZXZlbCAmIDB4ZmZmZmZmZmZmZmZmODAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc19jb2VmZl9sZXZlbCA9IDMyNzY3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZWZmc1t5X2MgKiB0cmFmb19zaXplICsgeF9jXSA9IHRyYW5zX2NvZWZmX2xldmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxjLT5jdS5jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnKSB7CisgICAgICAgIGlmIChleHBsaWNpdF9yZHBjbV9mbGFnIHx8IChzLT5zcHMtPmltcGxpY2l0X3JkcGNtX2VuYWJsZWRfZmxhZyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZWRfbW9kZV9pbnRyYSA9PSAxMCB8fCBwcmVkX21vZGVfaW50cmEgPT0gMjYpKSkgeworICAgICAgICAgICAgaW50IG1vZGUgPSBzLT5zcHMtPmltcGxpY2l0X3JkcGNtX2VuYWJsZWRfZmxhZyA/IChwcmVkX21vZGVfaW50cmEgPT0gMjYpIDogZXhwbGljaXRfcmRwY21fZGlyX2ZsYWc7CisKKyAgICAgICAgICAgIHMtPmhldmNkc3AudHJhbnNmb3JtX3JkcGNtKGNvZWZmcywgbG9nMl90cmFmb19zaXplLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0cmFuc2Zvcm1fc2tpcF9mbGFnKSB7CisgICAgICAgICAgICBpbnQgcm90ID0gcy0+c3BzLT50cmFuc2Zvcm1fc2tpcF9yb3RhdGlvbl9lbmFibGVkX2ZsYWcgJiYKKyAgICAgICAgICAgICAgICAgICAgICBsb2cyX3RyYWZvX3NpemUgPT0gMiAmJgorICAgICAgICAgICAgICAgICAgICAgIGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQTsKKyAgICAgICAgICAgIGlmIChyb3QpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgICAgICAgICBGRlNXQVAoaW50MTZfdCwgY29lZmZzW2ldLCBjb2VmZnNbMTYgLSBpIC0gMV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5oZXZjZHNwLnRyYW5zZm9ybV9za2lwKGNvZWZmcywgbG9nMl90cmFmb19zaXplKTsKKworICAgICAgICAgICAgaWYgKGV4cGxpY2l0X3JkcGNtX2ZsYWcgfHwgKHMtPnNwcy0+aW1wbGljaXRfcmRwY21fZW5hYmxlZF9mbGFnICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZWRfbW9kZV9pbnRyYSA9PSAxMCB8fCBwcmVkX21vZGVfaW50cmEgPT0gMjYpKSkgeworICAgICAgICAgICAgICAgIGludCBtb2RlID0gZXhwbGljaXRfcmRwY21fZmxhZyA/IGV4cGxpY2l0X3JkcGNtX2Rpcl9mbGFnIDogKHByZWRfbW9kZV9pbnRyYSA9PSAyNik7CisKKyAgICAgICAgICAgICAgICBzLT5oZXZjZHNwLnRyYW5zZm9ybV9yZHBjbShjb2VmZnMsIGxvZzJfdHJhZm9fc2l6ZSwgbW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBICYmIGNfaWR4ID09IDAgJiYgbG9nMl90cmFmb19zaXplID09IDIpIHsKKyAgICAgICAgICAgIHMtPmhldmNkc3AuaWRjdF80eDRfbHVtYShjb2VmZnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IG1heF94eSA9IEZGTUFYKGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeCwgbGFzdF9zaWduaWZpY2FudF9jb2VmZl95KTsKKyAgICAgICAgICAgIGlmIChtYXhfeHkgPT0gMCkKKyAgICAgICAgICAgICAgICBzLT5oZXZjZHNwLmlkY3RfZGNbbG9nMl90cmFmb19zaXplLTJdKGNvZWZmcyk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgY29sX2xpbWl0ID0gbGFzdF9zaWduaWZpY2FudF9jb2VmZl94ICsgbGFzdF9zaWduaWZpY2FudF9jb2VmZl95ICsgNDsKKyAgICAgICAgICAgICAgICBpZiAobWF4X3h5IDwgNCkKKyAgICAgICAgICAgICAgICAgICAgY29sX2xpbWl0ID0gRkZNSU4oNCwgY29sX2xpbWl0KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXhfeHkgPCA4KQorICAgICAgICAgICAgICAgICAgICBjb2xfbGltaXQgPSBGRk1JTig4LCBjb2xfbGltaXQpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1heF94eSA8IDEyKQorICAgICAgICAgICAgICAgICAgICBjb2xfbGltaXQgPSBGRk1JTigyNCwgY29sX2xpbWl0KTsKKyAgICAgICAgICAgICAgICBzLT5oZXZjZHNwLmlkY3RbbG9nMl90cmFmb19zaXplLTJdKGNvZWZmcywgY29sX2xpbWl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobGMtPnR1LmNyb3NzX3BmKSB7CisgICAgICAgIGludDE2X3QgKmNvZWZmc195ID0gKGludDE2X3QqKWxjLT5lZGdlX2VtdV9idWZmZXI7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICh0cmFmb19zaXplICogdHJhZm9fc2l6ZSk7IGkrKykgeworICAgICAgICAgICAgY29lZmZzW2ldID0gY29lZmZzW2ldICsgKChsYy0+dHUucmVzX3NjYWxlX3ZhbCAqIGNvZWZmc195W2ldKSA+PiAzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5oZXZjZHNwLnRyYW5zZm9ybV9hZGRbbG9nMl90cmFmb19zaXplLTJdKGRzdCwgY29lZmZzLCBzdHJpZGUpOworfQorCit2b2lkIGZmX2hldmNfaGxzX212ZF9jb2RpbmcoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLCBpbnQgbG9nMl9jYl9zaXplKQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIGludCB4ID0gYWJzX212ZF9ncmVhdGVyMF9mbGFnX2RlY29kZShzKTsKKyAgICBpbnQgeSA9IGFic19tdmRfZ3JlYXRlcjBfZmxhZ19kZWNvZGUocyk7CisKKyAgICBpZiAoeCkKKyAgICAgICAgeCArPSBhYnNfbXZkX2dyZWF0ZXIxX2ZsYWdfZGVjb2RlKHMpOworICAgIGlmICh5KQorICAgICAgICB5ICs9IGFic19tdmRfZ3JlYXRlcjFfZmxhZ19kZWNvZGUocyk7CisKKyAgICBzd2l0Y2ggKHgpIHsKKyAgICBjYXNlIDI6IGxjLT5wdS5tdmQueCA9IG12ZF9kZWNvZGUocyk7ICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IGxjLT5wdS5tdmQueCA9IG12ZF9zaWduX2ZsYWdfZGVjb2RlKHMpOyBicmVhazsKKyAgICBjYXNlIDA6IGxjLT5wdS5tdmQueCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHkpIHsKKyAgICBjYXNlIDI6IGxjLT5wdS5tdmQueSA9IG12ZF9kZWNvZGUocyk7ICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IGxjLT5wdS5tdmQueSA9IG12ZF9zaWduX2ZsYWdfZGVjb2RlKHMpOyBicmVhazsKKyAgICBjYXNlIDA6IGxjLT5wdS5tdmQueSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNfZmlsdGVyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oZXZjX2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYWYzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oZXZjX2ZpbHRlci5jCkBAIC0wLDAgKzEsNzM0IEBACisvKgorICogSEVWQyB2aWRlbyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxMyBHdWlsbGF1bWUgTWFydHJlcworICogQ29weXJpZ2h0IChDKSAyMDEzIFNlcHBvIFRvbXBlcmkKKyAqIENvcHlyaWdodCAoQykgMjAxMyBXYXNzaW0gSGFtaWRvdWNoZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSAiY2FiYWNfZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaGV2Yy5oIgorCisjaW5jbHVkZSAiYml0X2RlcHRoX3RlbXBsYXRlLmMiCisKKyNkZWZpbmUgTFVNQSAwCisjZGVmaW5lIENCIDEKKyNkZWZpbmUgQ1IgMgorCitzdGF0aWMgY29uc3QgdWludDhfdCB0Y3RhYmxlWzU0XSA9IHsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAwLCAwLCAxLCAvLyBRUCAgMC4uLjE4CisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMywgIDMsICAzLCAgMywgNCwgNCwgNCwgLy8gUVAgMTkuLi4zNworICAgIDUsIDUsIDYsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgsIDIwLCAyMiwgMjQgICAgICAgICAgIC8vIFFQIDM4Li4uNTMKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJldGF0YWJsZVs1Ml0gPSB7CisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA2LCAgNywgIDgsIC8vIFFQIDAuLi4xOAorICAgICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAyMCwgMjIsIDI0LCAyNiwgMjgsIDMwLCAzMiwgMzQsIDM2LCAvLyBRUCAxOS4uLjM3CisgICAgMzgsIDQwLCA0MiwgNDQsIDQ2LCA0OCwgNTAsIDUyLCA1NCwgNTYsIDU4LCA2MCwgNjIsIDY0ICAgICAgICAgICAgICAgICAgICAgIC8vIFFQIDM4Li4uNTEKK307CisKK3N0YXRpYyBpbnQgY2hyb21hX3RjKEhFVkNDb250ZXh0ICpzLCBpbnQgcXBfeSwgaW50IGNfaWR4LCBpbnQgdGNfb2Zmc2V0KQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgcXBfY1tdID0geworICAgICAgICAyOSwgMzAsIDMxLCAzMiwgMzMsIDMzLCAzNCwgMzQsIDM1LCAzNSwgMzYsIDM2LCAzNywgMzcKKyAgICB9OworICAgIGludCBxcCwgcXBfaSwgb2Zmc2V0LCBpZHh0OworCisgICAgLy8gc2xpY2UgcXAgb2Zmc2V0IGlzIG5vdCB1c2VkIGZvciBkZWJsb2NraW5nCisgICAgaWYgKGNfaWR4ID09IDEpCisgICAgICAgIG9mZnNldCA9IHMtPnBwcy0+Y2JfcXBfb2Zmc2V0OworICAgIGVsc2UKKyAgICAgICAgb2Zmc2V0ID0gcy0+cHBzLT5jcl9xcF9vZmZzZXQ7CisKKyAgICBxcF9pID0gYXZfY2xpcChxcF95ICsgb2Zmc2V0LCAwLCA1Nyk7CisgICAgaWYgKHMtPnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMSkgeworICAgICAgICBpZiAocXBfaSA8IDMwKQorICAgICAgICAgICAgcXAgPSBxcF9pOworICAgICAgICBlbHNlIGlmIChxcF9pID4gNDMpCisgICAgICAgICAgICBxcCA9IHFwX2kgLSA2OworICAgICAgICBlbHNlCisgICAgICAgICAgICBxcCA9IHFwX2NbcXBfaSAtIDMwXTsKKyAgICB9IGVsc2UgeworICAgICAgICBxcCA9IGF2X2NsaXAocXBfaSwgMCwgNTEpOworICAgIH0KKworICAgIGlkeHQgPSBhdl9jbGlwKHFwICsgREVGQVVMVF9JTlRSQV9UQ19PRkZTRVQgKyB0Y19vZmZzZXQsIDAsIDUzKTsKKyAgICByZXR1cm4gdGN0YWJsZVtpZHh0XTsKK30KKworc3RhdGljIGludCBnZXRfcVB5X3ByZWQoSEVWQ0NvbnRleHQgKnMsIGludCB4QmFzZSwgaW50IHlCYXNlLCBpbnQgbG9nMl9jYl9zaXplKQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjICAgICA9IHMtPkhFVkNsYzsKKyAgICBpbnQgY3RiX3NpemVfbWFzayAgICAgICAgPSAoMSA8PCBzLT5zcHMtPmxvZzJfY3RiX3NpemUpIC0gMTsKKyAgICBpbnQgTWluQ3VRcERlbHRhU2l6ZU1hc2sgPSAoMSA8PCAocy0+c3BzLT5sb2cyX2N0Yl9zaXplIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoKSkgLSAxOworICAgIGludCB4UWdCYXNlICAgICAgICAgICAgICA9IHhCYXNlIC0gKHhCYXNlICYgTWluQ3VRcERlbHRhU2l6ZU1hc2spOworICAgIGludCB5UWdCYXNlICAgICAgICAgICAgICA9IHlCYXNlIC0gKHlCYXNlICYgTWluQ3VRcERlbHRhU2l6ZU1hc2spOworICAgIGludCBtaW5fY2Jfd2lkdGggICAgICAgICA9IHMtPnNwcy0+bWluX2NiX3dpZHRoOworICAgIGludCB4X2NiICAgICAgICAgICAgICAgICA9IHhRZ0Jhc2UgPj4gcy0+c3BzLT5sb2cyX21pbl9jYl9zaXplOworICAgIGludCB5X2NiICAgICAgICAgICAgICAgICA9IHlRZ0Jhc2UgPj4gcy0+c3BzLT5sb2cyX21pbl9jYl9zaXplOworICAgIGludCBhdmFpbGFibGVBICAgICAgICAgICA9ICh4QmFzZSAgICYgY3RiX3NpemVfbWFzaykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeFFnQmFzZSAmIGN0Yl9zaXplX21hc2spOworICAgIGludCBhdmFpbGFibGVCICAgICAgICAgICA9ICh5QmFzZSAgICYgY3RiX3NpemVfbWFzaykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeVFnQmFzZSAmIGN0Yl9zaXplX21hc2spOworICAgIGludCBxUHlfcHJlZCwgcVB5X2EsIHFQeV9iOworCisgICAgLy8gcVB5X3ByZWQKKyAgICBpZiAobGMtPmZpcnN0X3FwX2dyb3VwIHx8ICgheFFnQmFzZSAmJiAheVFnQmFzZSkpIHsKKyAgICAgICAgbGMtPmZpcnN0X3FwX2dyb3VwID0gIWxjLT50dS5pc19jdV9xcF9kZWx0YV9jb2RlZDsKKyAgICAgICAgcVB5X3ByZWQgPSBzLT5zaC5zbGljZV9xcDsKKyAgICB9IGVsc2UgeworICAgICAgICBxUHlfcHJlZCA9IGxjLT5xUHlfcHJlZDsKKyAgICB9CisKKyAgICAvLyBxUHlfYQorICAgIGlmIChhdmFpbGFibGVBID09IDApCisgICAgICAgIHFQeV9hID0gcVB5X3ByZWQ7CisgICAgZWxzZQorICAgICAgICBxUHlfYSA9IHMtPnFwX3lfdGFiWyh4X2NiIC0gMSkgKyB5X2NiICogbWluX2NiX3dpZHRoXTsKKworICAgIC8vIHFQeV9iCisgICAgaWYgKGF2YWlsYWJsZUIgPT0gMCkKKyAgICAgICAgcVB5X2IgPSBxUHlfcHJlZDsKKyAgICBlbHNlCisgICAgICAgIHFQeV9iID0gcy0+cXBfeV90YWJbeF9jYiArICh5X2NiIC0gMSkgKiBtaW5fY2Jfd2lkdGhdOworCisgICAgYXZfYXNzZXJ0MihxUHlfYSA+PSAtcy0+c3BzLT5xcF9iZF9vZmZzZXQgJiYgcVB5X2EgPCA1Mik7CisgICAgYXZfYXNzZXJ0MihxUHlfYiA+PSAtcy0+c3BzLT5xcF9iZF9vZmZzZXQgJiYgcVB5X2IgPCA1Mik7CisKKyAgICByZXR1cm4gKHFQeV9hICsgcVB5X2IgKyAxKSA+PiAxOworfQorCit2b2lkIGZmX2hldmNfc2V0X3FQeShIRVZDQ29udGV4dCAqcywgaW50IHhCYXNlLCBpbnQgeUJhc2UsIGludCBsb2cyX2NiX3NpemUpCit7CisgICAgaW50IHFwX3kgPSBnZXRfcVB5X3ByZWQocywgeEJhc2UsIHlCYXNlLCBsb2cyX2NiX3NpemUpOworCisgICAgaWYgKHMtPkhFVkNsYy0+dHUuY3VfcXBfZGVsdGEgIT0gMCkgeworICAgICAgICBpbnQgb2ZmID0gcy0+c3BzLT5xcF9iZF9vZmZzZXQ7CisgICAgICAgIHMtPkhFVkNsYy0+cXBfeSA9IEZGVU1PRChxcF95ICsgcy0+SEVWQ2xjLT50dS5jdV9xcF9kZWx0YSArIDUyICsgMiAqIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyICsgb2ZmKSAtIG9mZjsKKyAgICB9IGVsc2UKKyAgICAgICAgcy0+SEVWQ2xjLT5xcF95ID0gcXBfeTsKK30KKworc3RhdGljIGludCBnZXRfcVB5KEhFVkNDb250ZXh0ICpzLCBpbnQgeEMsIGludCB5QykKK3sKKyAgICBpbnQgbG9nMl9taW5fY2Jfc2l6ZSAgPSBzLT5zcHMtPmxvZzJfbWluX2NiX3NpemU7CisgICAgaW50IHggICAgICAgICAgICAgICAgID0geEMgPj4gbG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBpbnQgeSAgICAgICAgICAgICAgICAgPSB5QyA+PiBsb2cyX21pbl9jYl9zaXplOworICAgIHJldHVybiBzLT5xcF95X3RhYlt4ICsgeSAqIHMtPnNwcy0+bWluX2NiX3dpZHRoXTsKK30KKworc3RhdGljIHZvaWQgY29weV9DVEIodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGVfZHN0LCBpbnQgc3RyaWRlX3NyYykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZV9kc3Q7CisgICAgICAgIHNyYyArPSBzdHJpZGVfc3JjOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVzdG9yZV90cWJfcGl4ZWxzKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgY19pZHgpCit7CisgICAgaWYgKCBzLT5wcHMtPnRyYW5zcXVhbnRfYnlwYXNzX2VuYWJsZV9mbGFnIHx8CisgICAgICAgICAgICAocy0+c3BzLT5wY20ubG9vcF9maWx0ZXJfZGlzYWJsZV9mbGFnICYmIHMtPnNwcy0+cGNtX2VuYWJsZWRfZmxhZykpIHsKKyAgICAgICAgaW50IHgsIHk7CisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGVfZHN0ID0gcy0+c2FvX2ZyYW1lLT5saW5lc2l6ZVtjX2lkeF07CisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGVfc3JjID0gcy0+ZnJhbWUtPmxpbmVzaXplW2NfaWR4XTsKKyAgICAgICAgaW50IG1pbl9wdV9zaXplICA9IDEgPDwgcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplOworICAgICAgICBpbnQgaHNoaWZ0ICAgICAgID0gcy0+c3BzLT5oc2hpZnRbY19pZHhdOworICAgICAgICBpbnQgdnNoaWZ0ICAgICAgID0gcy0+c3BzLT52c2hpZnRbY19pZHhdOworICAgICAgICBpbnQgeF9taW4gICAgICAgID0gKCh4MCAgICAgICAgICkgPj4gcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplKTsKKyAgICAgICAgaW50IHlfbWluICAgICAgICA9ICgoeTAgICAgICAgICApID4+IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZSk7CisgICAgICAgIGludCB4X21heCAgICAgICAgPSAoKHgwICsgd2lkdGggKSA+PiBzLT5zcHMtPmxvZzJfbWluX3B1X3NpemUpOworICAgICAgICBpbnQgeV9tYXggICAgICAgID0gKCh5MCArIGhlaWdodCkgPj4gcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplKTsKKyAgICAgICAgaW50IGxlbiAgICAgICAgICA9IG1pbl9wdV9zaXplID4+IGhzaGlmdDsKKyAgICAgICAgZm9yICh5ID0geV9taW47IHkgPCB5X21heDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSB4X21pbjsgeCA8IHhfbWF4OyB4KyspIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+aXNfcGNtW3kgKiBzLT5zcHMtPm1pbl9wdV93aWR0aCArIHhdKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMgPSAmcy0+ZnJhbWUtPmRhdGFbY19pZHhdWyAgICAoKHkgPDwgcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplKSA+PiB2c2hpZnQpICogc3RyaWRlX3NyYyArICgoKHggPDwgcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplKSA+PiBoc2hpZnQpIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gJnMtPnNhb19mcmFtZS0+ZGF0YVtjX2lkeF1bKCh5IDw8IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZSkgPj4gdnNoaWZ0KSAqIHN0cmlkZV9kc3QgKyAoKCh4IDw8IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZSkgPj4gaHNoaWZ0KSA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KV07CisgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCAobWluX3B1X3NpemUgPj4gdnNoaWZ0KTsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc3JjLCBkc3QsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmMgKz0gc3RyaWRlX3NyYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBzdHJpZGVfZHN0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZGVmaW5lIENUQih0YWIsIHgsIHkpICgodGFiKVsoeSkgKiBzLT5zcHMtPmN0Yl93aWR0aCArICh4KV0pCisKK3N0YXRpYyB2b2lkIHNhb19maWx0ZXJfQ1RCKEhFVkNDb250ZXh0ICpzLCBpbnQgeCwgaW50IHkpCit7CisgICAgaW50IGNfaWR4OworICAgIGludCBlZGdlc1s0XTsgIC8vIDAgbGVmdCAxIHRvcCAyIHJpZ2h0IDMgYm90dG9tCisgICAgaW50IHhfY3RiICAgICAgICAgICAgICAgID0geCA+PiBzLT5zcHMtPmxvZzJfY3RiX3NpemU7CisgICAgaW50IHlfY3RiICAgICAgICAgICAgICAgID0geSA+PiBzLT5zcHMtPmxvZzJfY3RiX3NpemU7CisgICAgaW50IGN0Yl9hZGRyX3JzICAgICAgICAgID0geV9jdGIgKiBzLT5zcHMtPmN0Yl93aWR0aCArIHhfY3RiOworICAgIGludCBjdGJfYWRkcl90cyAgICAgICAgICA9IHMtPnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbY3RiX2FkZHJfcnNdOworICAgIFNBT1BhcmFtcyAqc2FvICAgICAgICAgICA9ICZDVEIocy0+c2FvLCB4X2N0YiwgeV9jdGIpOworICAgIC8vIGZsYWdzIGluZGljYXRpbmcgdW5maWx0ZXJhYmxlIGVkZ2VzCisgICAgdWludDhfdCB2ZXJ0X2VkZ2VbXSAgICAgID0geyAwLCAwIH07CisgICAgdWludDhfdCBob3Jpel9lZGdlW10gICAgID0geyAwLCAwIH07CisgICAgdWludDhfdCBkaWFnX2VkZ2VbXSAgICAgID0geyAwLCAwLCAwLCAwIH07CisgICAgdWludDhfdCBsZmFzZSAgICAgICAgICAgID0gQ1RCKHMtPmZpbHRlcl9zbGljZV9lZGdlcywgeF9jdGIsIHlfY3RiKTsKKyAgICB1aW50OF90IG5vX3RpbGVfZmlsdGVyICAgPSBzLT5wcHMtPnRpbGVzX2VuYWJsZWRfZmxhZyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzLT5wcHMtPmxvb3BfZmlsdGVyX2Fjcm9zc190aWxlc19lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCByZXN0b3JlICAgICAgICAgID0gbm9fdGlsZV9maWx0ZXIgfHwgIWxmYXNlOworICAgIHVpbnQ4X3QgbGVmdF90aWxlX2VkZ2UgICA9IDA7CisgICAgdWludDhfdCByaWdodF90aWxlX2VkZ2UgID0gMDsKKyAgICB1aW50OF90IHVwX3RpbGVfZWRnZSAgICAgPSAwOworICAgIHVpbnQ4X3QgYm90dG9tX3RpbGVfZWRnZSA9IDA7CisKKyAgICBlZGdlc1swXSAgID0geF9jdGIgPT0gMDsKKyAgICBlZGdlc1sxXSAgID0geV9jdGIgPT0gMDsKKyAgICBlZGdlc1syXSAgID0geF9jdGIgPT0gcy0+c3BzLT5jdGJfd2lkdGggIC0gMTsKKyAgICBlZGdlc1szXSAgID0geV9jdGIgPT0gcy0+c3BzLT5jdGJfaGVpZ2h0IC0gMTsKKworICAgIGlmIChyZXN0b3JlKSB7CisgICAgICAgIGlmICghZWRnZXNbMF0pIHsKKyAgICAgICAgICAgIGxlZnRfdGlsZV9lZGdlICA9IG5vX3RpbGVfZmlsdGVyICYmIHMtPnBwcy0+dGlsZV9pZFtjdGJfYWRkcl90c10gIT0gcy0+cHBzLT50aWxlX2lkW3MtPnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbY3RiX2FkZHJfcnMtMV1dOworICAgICAgICAgICAgdmVydF9lZGdlWzBdICAgID0gKCFsZmFzZSAmJiBDVEIocy0+dGFiX3NsaWNlX2FkZHJlc3MsIHhfY3RiLCB5X2N0YikgIT0gQ1RCKHMtPnRhYl9zbGljZV9hZGRyZXNzLCB4X2N0YiAtIDEsIHlfY3RiKSkgfHwgbGVmdF90aWxlX2VkZ2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFlZGdlc1syXSkgeworICAgICAgICAgICAgcmlnaHRfdGlsZV9lZGdlID0gbm9fdGlsZV9maWx0ZXIgJiYgcy0+cHBzLT50aWxlX2lkW2N0Yl9hZGRyX3RzXSAhPSBzLT5wcHMtPnRpbGVfaWRbcy0+cHBzLT5jdGJfYWRkcl9yc190b190c1tjdGJfYWRkcl9ycysxXV07CisgICAgICAgICAgICB2ZXJ0X2VkZ2VbMV0gICAgPSAoIWxmYXNlICYmIENUQihzLT50YWJfc2xpY2VfYWRkcmVzcywgeF9jdGIsIHlfY3RiKSAhPSBDVEIocy0+dGFiX3NsaWNlX2FkZHJlc3MsIHhfY3RiICsgMSwgeV9jdGIpKSB8fCByaWdodF90aWxlX2VkZ2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFlZGdlc1sxXSkgeworICAgICAgICAgICAgdXBfdGlsZV9lZGdlICAgICA9IG5vX3RpbGVfZmlsdGVyICYmIHMtPnBwcy0+dGlsZV9pZFtjdGJfYWRkcl90c10gIT0gcy0+cHBzLT50aWxlX2lkW3MtPnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbY3RiX2FkZHJfcnMgLSBzLT5zcHMtPmN0Yl93aWR0aF1dOworICAgICAgICAgICAgaG9yaXpfZWRnZVswXSAgICA9ICghbGZhc2UgJiYgQ1RCKHMtPnRhYl9zbGljZV9hZGRyZXNzLCB4X2N0YiwgeV9jdGIpICE9IENUQihzLT50YWJfc2xpY2VfYWRkcmVzcywgeF9jdGIsIHlfY3RiIC0gMSkpIHx8IHVwX3RpbGVfZWRnZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWVkZ2VzWzNdKSB7CisgICAgICAgICAgICBib3R0b21fdGlsZV9lZGdlID0gbm9fdGlsZV9maWx0ZXIgJiYgcy0+cHBzLT50aWxlX2lkW2N0Yl9hZGRyX3RzXSAhPSBzLT5wcHMtPnRpbGVfaWRbcy0+cHBzLT5jdGJfYWRkcl9yc190b190c1tjdGJfYWRkcl9ycyArIHMtPnNwcy0+Y3RiX3dpZHRoXV07CisgICAgICAgICAgICBob3Jpel9lZGdlWzFdICAgID0gKCFsZmFzZSAmJiBDVEIocy0+dGFiX3NsaWNlX2FkZHJlc3MsIHhfY3RiLCB5X2N0YikgIT0gQ1RCKHMtPnRhYl9zbGljZV9hZGRyZXNzLCB4X2N0YiwgeV9jdGIgKyAxKSkgfHwgYm90dG9tX3RpbGVfZWRnZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWVkZ2VzWzBdICYmICFlZGdlc1sxXSkgeworICAgICAgICAgICAgZGlhZ19lZGdlWzBdID0gKCFsZmFzZSAmJiBDVEIocy0+dGFiX3NsaWNlX2FkZHJlc3MsIHhfY3RiLCB5X2N0YikgIT0gQ1RCKHMtPnRhYl9zbGljZV9hZGRyZXNzLCB4X2N0YiAtIDEsIHlfY3RiIC0gMSkpIHx8IGxlZnRfdGlsZV9lZGdlIHx8IHVwX3RpbGVfZWRnZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWVkZ2VzWzFdICYmICFlZGdlc1syXSkgeworICAgICAgICAgICAgZGlhZ19lZGdlWzFdID0gKCFsZmFzZSAmJiBDVEIocy0+dGFiX3NsaWNlX2FkZHJlc3MsIHhfY3RiLCB5X2N0YikgIT0gQ1RCKHMtPnRhYl9zbGljZV9hZGRyZXNzLCB4X2N0YiArIDEsIHlfY3RiIC0gMSkpIHx8IHJpZ2h0X3RpbGVfZWRnZSB8fCB1cF90aWxlX2VkZ2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFlZGdlc1syXSAmJiAhZWRnZXNbM10pIHsKKyAgICAgICAgICAgIGRpYWdfZWRnZVsyXSA9ICghbGZhc2UgJiYgQ1RCKHMtPnRhYl9zbGljZV9hZGRyZXNzLCB4X2N0YiwgeV9jdGIpICE9IENUQihzLT50YWJfc2xpY2VfYWRkcmVzcywgeF9jdGIgKyAxLCB5X2N0YiArIDEpKSB8fCByaWdodF90aWxlX2VkZ2UgfHwgYm90dG9tX3RpbGVfZWRnZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWVkZ2VzWzBdICYmICFlZGdlc1szXSkgeworICAgICAgICAgICAgZGlhZ19lZGdlWzNdID0gKCFsZmFzZSAmJiBDVEIocy0+dGFiX3NsaWNlX2FkZHJlc3MsIHhfY3RiLCB5X2N0YikgIT0gQ1RCKHMtPnRhYl9zbGljZV9hZGRyZXNzLCB4X2N0YiAtIDEsIHlfY3RiICsgMSkpIHx8IGxlZnRfdGlsZV9lZGdlIHx8IGJvdHRvbV90aWxlX2VkZ2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNfaWR4ID0gMDsgY19pZHggPCAzOyBjX2lkeCsrKSB7CisgICAgICAgIGludCB4MCAgICAgICA9IHggPj4gcy0+c3BzLT5oc2hpZnRbY19pZHhdOworICAgICAgICBpbnQgeTAgICAgICAgPSB5ID4+IHMtPnNwcy0+dnNoaWZ0W2NfaWR4XTsKKyAgICAgICAgaW50IHN0cmlkZV9zcmMgPSBzLT5mcmFtZS0+bGluZXNpemVbY19pZHhdOworICAgICAgICBpbnQgc3RyaWRlX2RzdCA9IHMtPnNhb19mcmFtZS0+bGluZXNpemVbY19pZHhdOworICAgICAgICBpbnQgY3RiX3NpemVfaCA9ICgxIDw8IChzLT5zcHMtPmxvZzJfY3RiX3NpemUpKSA+PiBzLT5zcHMtPmhzaGlmdFtjX2lkeF07CisgICAgICAgIGludCBjdGJfc2l6ZV92ID0gKDEgPDwgKHMtPnNwcy0+bG9nMl9jdGJfc2l6ZSkpID4+IHMtPnNwcy0+dnNoaWZ0W2NfaWR4XTsKKyAgICAgICAgaW50IHdpZHRoICAgID0gRkZNSU4oY3RiX3NpemVfaCwgKHMtPnNwcy0+d2lkdGggID4+IHMtPnNwcy0+aHNoaWZ0W2NfaWR4XSkgLSB4MCk7CisgICAgICAgIGludCBoZWlnaHQgICA9IEZGTUlOKGN0Yl9zaXplX3YsIChzLT5zcHMtPmhlaWdodCA+PiBzLT5zcHMtPnZzaGlmdFtjX2lkeF0pIC0geTApOworICAgICAgICB1aW50OF90ICpzcmMgPSAmcy0+ZnJhbWUtPmRhdGFbY19pZHhdW3kwICogc3RyaWRlX3NyYyArICh4MCA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KV07CisgICAgICAgIHVpbnQ4X3QgKmRzdCA9ICZzLT5zYW9fZnJhbWUtPmRhdGFbY19pZHhdW3kwICogc3RyaWRlX2RzdCArICh4MCA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KV07CisKKyAgICAgICAgc3dpdGNoIChzYW8tPnR5cGVfaWR4W2NfaWR4XSkgeworICAgICAgICBjYXNlIFNBT19CQU5EOgorICAgICAgICAgICAgY29weV9DVEIoZHN0LCBzcmMsIHdpZHRoIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQsIGhlaWdodCwgc3RyaWRlX2RzdCwgc3RyaWRlX3NyYyk7CisgICAgICAgICAgICBzLT5oZXZjZHNwLnNhb19iYW5kX2ZpbHRlcihzcmMsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZV9zcmMsIHN0cmlkZV9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlcywgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIGNfaWR4KTsKKyAgICAgICAgICAgIHJlc3RvcmVfdHFiX3BpeGVscyhzLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjX2lkeCk7CisgICAgICAgICAgICBzYW8tPnR5cGVfaWR4W2NfaWR4XSA9IFNBT19BUFBMSUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0FPX0VER0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGVmdF9waXhlbHMgPSAhZWRnZXNbMF0gJiYgKENUQihzLT5zYW8sIHhfY3RiLTEsIHlfY3RiKS50eXBlX2lkeFtjX2lkeF0gIT0gU0FPX0FQUExJRUQpOworICAgICAgICAgICAgaWYgKCFlZGdlc1sxXSkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdG9wX2xlZnQgID0gIWVkZ2VzWzBdICYmIChDVEIocy0+c2FvLCB4X2N0Yi0xLCB5X2N0Yi0xKS50eXBlX2lkeFtjX2lkeF0gIT0gU0FPX0FQUExJRUQpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdG9wX3JpZ2h0ID0gIWVkZ2VzWzJdICYmIChDVEIocy0+c2FvLCB4X2N0YisxLCB5X2N0Yi0xKS50eXBlX2lkeFtjX2lkeF0gIT0gU0FPX0FQUExJRUQpOworICAgICAgICAgICAgICAgIGlmIChDVEIocy0+c2FvLCB4X2N0YiAgLCB5X2N0Yi0xKS50eXBlX2lkeFtjX2lkeF0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBkc3QgLSBzdHJpZGVfZHN0IC0gKHRvcF9sZWZ0IDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIHN0cmlkZV9zcmMgLSAodG9wX2xlZnQgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvcF9sZWZ0ICsgd2lkdGggKyB0b3BfcmlnaHQpIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodG9wX2xlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIGRzdCAtIHN0cmlkZV9kc3QgLSAoMSA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjIC0gc3RyaWRlX3NyYyAtICgxIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBpZih0b3BfcmlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIGRzdCAtIHN0cmlkZV9kc3QgKyAod2lkdGggPDwgcy0+c3BzLT5waXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIHN0cmlkZV9zcmMgKyAod2lkdGggPDwgcy0+c3BzLT5waXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFlZGdlc1szXSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3R0b20gYW5kIGJvdHRvbSByaWdodAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgYm90dG9tX2xlZnQgPSAhZWRnZXNbMF0gJiYgKENUQihzLT5zYW8sIHhfY3RiLTEsIHlfY3RiKzEpLnR5cGVfaWR4W2NfaWR4XSAhPSBTQU9fQVBQTElFRCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCBkc3QgKyBoZWlnaHQgKiBzdHJpZGVfZHN0IC0gKGJvdHRvbV9sZWZ0IDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgaGVpZ2h0ICogc3RyaWRlX3NyYyAtIChib3R0b21fbGVmdCA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh3aWR0aCArIDEgKyBib3R0b21fbGVmdCkgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3B5X0NUQihkc3QgLSAobGVmdF9waXhlbHMgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICBzcmMgLSAobGVmdF9waXhlbHMgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAod2lkdGggKyAxICsgbGVmdF9waXhlbHMpIDw8IHMtPnNwcy0+cGl4ZWxfc2hpZnQsIGhlaWdodCwgc3RyaWRlX2RzdCwgc3RyaWRlX3NyYyk7CisgICAgICAgICAgICBzLT5oZXZjZHNwLnNhb19lZGdlX2ZpbHRlcltyZXN0b3JlXShzcmMsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZV9zcmMsIHN0cmlkZV9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlcywgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIGNfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydF9lZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdfZWRnZSk7CisgICAgICAgICAgICByZXN0b3JlX3RxYl9waXhlbHMocywgeCwgeSwgd2lkdGgsIGhlaWdodCwgY19pZHgpOworICAgICAgICAgICAgc2FvLT50eXBlX2lkeFtjX2lkeF0gPSBTQU9fQVBQTElFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BjbShIRVZDQ29udGV4dCAqcywgaW50IHgsIGludCB5KQoreworICAgIGludCBsb2cyX21pbl9wdV9zaXplID0gcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplOworICAgIGludCB4X3B1LCB5X3B1OworCisgICAgaWYgKHggPCAwIHx8IHkgPCAwKQorICAgICAgICByZXR1cm4gMjsKKworICAgIHhfcHUgPSB4ID4+IGxvZzJfbWluX3B1X3NpemU7CisgICAgeV9wdSA9IHkgPj4gbG9nMl9taW5fcHVfc2l6ZTsKKworICAgIGlmICh4X3B1ID49IHMtPnNwcy0+bWluX3B1X3dpZHRoIHx8IHlfcHUgPj0gcy0+c3BzLT5taW5fcHVfaGVpZ2h0KQorICAgICAgICByZXR1cm4gMjsKKyAgICByZXR1cm4gcy0+aXNfcGNtW3lfcHUgKiBzLT5zcHMtPm1pbl9wdV93aWR0aCArIHhfcHVdOworfQorCisjZGVmaW5lIFRDX0NBTEMocXAsIGJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGN0YWJsZVthdl9jbGlwKChxcCkgKyBERUZBVUxUX0lOVFJBX1RDX09GRlNFVCAqICgoYnMpIC0gMSkgKyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICh0Y19vZmZzZXQgPj4gMSA8PCAxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIDAsIE1BWF9RUCArIERFRkFVTFRfSU5UUkFfVENfT0ZGU0VUKV0KKworc3RhdGljIHZvaWQgZGVibG9ja2luZ19maWx0ZXJfQ1RCKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCkKK3sKKyAgICB1aW50OF90ICpzcmM7CisgICAgaW50IHgsIHk7CisgICAgaW50IGNocm9tYSwgYmV0YTsKKyAgICBpbnQzMl90IGNfdGNbMl0sIHRjWzJdOworICAgIHVpbnQ4X3Qgbm9fcFsyXSA9IHsgMCB9OworICAgIHVpbnQ4X3Qgbm9fcVsyXSA9IHsgMCB9OworCisgICAgaW50IGxvZzJfY3RiX3NpemUgPSBzLT5zcHMtPmxvZzJfY3RiX3NpemU7CisgICAgaW50IHhfZW5kLCB4X2VuZDIsIHlfZW5kOworICAgIGludCBjdGJfc2l6ZSAgICAgICAgPSAxIDw8IGxvZzJfY3RiX3NpemU7CisgICAgaW50IGN0YiAgICAgICAgICAgICA9ICh4MCA+PiBsb2cyX2N0Yl9zaXplKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICh5MCA+PiBsb2cyX2N0Yl9zaXplKSAqIHMtPnNwcy0+Y3RiX3dpZHRoOworICAgIGludCBjdXJfdGNfb2Zmc2V0ICAgPSBzLT5kZWJsb2NrW2N0Yl0udGNfb2Zmc2V0OworICAgIGludCBjdXJfYmV0YV9vZmZzZXQgPSBzLT5kZWJsb2NrW2N0Yl0uYmV0YV9vZmZzZXQ7CisgICAgaW50IGxlZnRfdGNfb2Zmc2V0LCBsZWZ0X2JldGFfb2Zmc2V0OworICAgIGludCB0Y19vZmZzZXQsIGJldGFfb2Zmc2V0OworICAgIGludCBwY21mID0gKHMtPnNwcy0+cGNtX2VuYWJsZWRfZmxhZyAmJgorICAgICAgICAgICAgICAgIHMtPnNwcy0+cGNtLmxvb3BfZmlsdGVyX2Rpc2FibGVfZmxhZykgfHwKKyAgICAgICAgICAgICAgIHMtPnBwcy0+dHJhbnNxdWFudF9ieXBhc3NfZW5hYmxlX2ZsYWc7CisKKyAgICBpZiAoeDApIHsKKyAgICAgICAgbGVmdF90Y19vZmZzZXQgICA9IHMtPmRlYmxvY2tbY3RiIC0gMV0udGNfb2Zmc2V0OworICAgICAgICBsZWZ0X2JldGFfb2Zmc2V0ID0gcy0+ZGVibG9ja1tjdGIgLSAxXS5iZXRhX29mZnNldDsKKyAgICB9IGVsc2UgeworICAgICAgICBsZWZ0X3RjX29mZnNldCAgID0gMDsKKyAgICAgICAgbGVmdF9iZXRhX29mZnNldCA9IDA7CisgICAgfQorCisgICAgeF9lbmQgPSB4MCArIGN0Yl9zaXplOworICAgIGlmICh4X2VuZCA+IHMtPnNwcy0+d2lkdGgpCisgICAgICAgIHhfZW5kID0gcy0+c3BzLT53aWR0aDsKKyAgICB5X2VuZCA9IHkwICsgY3RiX3NpemU7CisgICAgaWYgKHlfZW5kID4gcy0+c3BzLT5oZWlnaHQpCisgICAgICAgIHlfZW5kID0gcy0+c3BzLT5oZWlnaHQ7CisKKyAgICB0Y19vZmZzZXQgICA9IGN1cl90Y19vZmZzZXQ7CisgICAgYmV0YV9vZmZzZXQgPSBjdXJfYmV0YV9vZmZzZXQ7CisKKyAgICB4X2VuZDIgPSB4X2VuZDsKKyAgICBpZiAoeF9lbmQyICE9IHMtPnNwcy0+d2lkdGgpCisgICAgICAgIHhfZW5kMiAtPSA4OworICAgIGZvciAoeSA9IHkwOyB5IDwgeV9lbmQ7IHkgKz0gOCkgeworICAgICAgICAvLyB2ZXJ0aWNhbCBmaWx0ZXJpbmcgbHVtYQorICAgICAgICBmb3IgKHggPSB4MCA/IHgwIDogODsgeCA8IHhfZW5kOyB4ICs9IDgpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBiczAgPSBzLT52ZXJ0aWNhbF9ic1soeCArICB5ICAgICAgKiBzLT5ic193aWR0aCkgPj4gMl07CisgICAgICAgICAgICBjb25zdCBpbnQgYnMxID0gcy0+dmVydGljYWxfYnNbKHggKyAoeSArIDQpICogcy0+YnNfd2lkdGgpID4+IDJdOworICAgICAgICAgICAgaWYgKGJzMCB8fCBiczEpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcXAgPSAoZ2V0X3FQeShzLCB4IC0gMSwgeSkgICAgICsgZ2V0X3FQeShzLCB4LCB5KSAgICAgKyAxKSA+PiAxOworCisgICAgICAgICAgICAgICAgYmV0YSA9IGJldGF0YWJsZVthdl9jbGlwKHFwICsgYmV0YV9vZmZzZXQsIDAsIE1BWF9RUCldOworCisgICAgICAgICAgICAgICAgdGNbMF0gICA9IGJzMCA/IFRDX0NBTEMocXAsIGJzMCkgOiAwOworICAgICAgICAgICAgICAgIHRjWzFdICAgPSBiczEgPyBUQ19DQUxDKHFwLCBiczEpIDogMDsKKyAgICAgICAgICAgICAgICBzcmMgICAgID0gJnMtPmZyYW1lLT5kYXRhW0xVTUFdW3kgKiBzLT5mcmFtZS0+bGluZXNpemVbTFVNQV0gKyAoeCA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KV07CisgICAgICAgICAgICAgICAgaWYgKHBjbWYpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9fcFswXSA9IGdldF9wY20ocywgeCAtIDEsIHkpOworICAgICAgICAgICAgICAgICAgICBub19wWzFdID0gZ2V0X3BjbShzLCB4IC0gMSwgeSArIDQpOworICAgICAgICAgICAgICAgICAgICBub19xWzBdID0gZ2V0X3BjbShzLCB4LCB5KTsKKyAgICAgICAgICAgICAgICAgICAgbm9fcVsxXSA9IGdldF9wY20ocywgeCwgeSArIDQpOworICAgICAgICAgICAgICAgICAgICBzLT5oZXZjZHNwLmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hX2Moc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWUtPmxpbmVzaXplW0xVTUFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0YSwgdGMsIG5vX3AsIG5vX3EpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBzLT5oZXZjZHNwLmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZS0+bGluZXNpemVbTFVNQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0YSwgdGMsIG5vX3AsIG5vX3EpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIXkpCisgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgbHVtYQorICAgICAgICBmb3IgKHggPSB4MCA/IHgwIC0gOCA6IDA7IHggPCB4X2VuZDI7IHggKz0gOCkgeworICAgICAgICAgICAgY29uc3QgaW50IGJzMCA9IHMtPmhvcml6b250YWxfYnNbKCB4ICAgICAgKyB5ICogcy0+YnNfd2lkdGgpID4+IDJdOworICAgICAgICAgICAgY29uc3QgaW50IGJzMSA9IHMtPmhvcml6b250YWxfYnNbKCh4ICsgNCkgKyB5ICogcy0+YnNfd2lkdGgpID4+IDJdOworICAgICAgICAgICAgaWYgKGJzMCB8fCBiczEpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcXAgPSAoZ2V0X3FQeShzLCB4LCB5IC0gMSkgICAgICsgZ2V0X3FQeShzLCB4LCB5KSAgICAgKyAxKSA+PiAxOworCisgICAgICAgICAgICAgICAgdGNfb2Zmc2V0ICAgPSB4ID49IHgwID8gY3VyX3RjX29mZnNldCA6IGxlZnRfdGNfb2Zmc2V0OworICAgICAgICAgICAgICAgIGJldGFfb2Zmc2V0ID0geCA+PSB4MCA/IGN1cl9iZXRhX29mZnNldCA6IGxlZnRfYmV0YV9vZmZzZXQ7CisKKyAgICAgICAgICAgICAgICBiZXRhID0gYmV0YXRhYmxlW2F2X2NsaXAocXAgKyBiZXRhX29mZnNldCwgMCwgTUFYX1FQKV07CisgICAgICAgICAgICAgICAgdGNbMF0gICA9IGJzMCA/IFRDX0NBTEMocXAsIGJzMCkgOiAwOworICAgICAgICAgICAgICAgIHRjWzFdICAgPSBiczEgPyBUQ19DQUxDKHFwLCBiczEpIDogMDsKKyAgICAgICAgICAgICAgICBzcmMgICAgID0gJnMtPmZyYW1lLT5kYXRhW0xVTUFdW3kgKiBzLT5mcmFtZS0+bGluZXNpemVbTFVNQV0gKyAoeCA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KV07CisgICAgICAgICAgICAgICAgaWYgKHBjbWYpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9fcFswXSA9IGdldF9wY20ocywgeCwgeSAtIDEpOworICAgICAgICAgICAgICAgICAgICBub19wWzFdID0gZ2V0X3BjbShzLCB4ICsgNCwgeSAtIDEpOworICAgICAgICAgICAgICAgICAgICBub19xWzBdID0gZ2V0X3BjbShzLCB4LCB5KTsKKyAgICAgICAgICAgICAgICAgICAgbm9fcVsxXSA9IGdldF9wY20ocywgeCArIDQsIHkpOworICAgICAgICAgICAgICAgICAgICBzLT5oZXZjZHNwLmhldmNfaF9sb29wX2ZpbHRlcl9sdW1hX2Moc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWUtPmxpbmVzaXplW0xVTUFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0YSwgdGMsIG5vX3AsIG5vX3EpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBzLT5oZXZjZHNwLmhldmNfaF9sb29wX2ZpbHRlcl9sdW1hKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZS0+bGluZXNpemVbTFVNQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0YSwgdGMsIG5vX3AsIG5vX3EpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjaHJvbWEgPSAxOyBjaHJvbWEgPD0gMjsgY2hyb21hKyspIHsKKyAgICAgICAgaW50IGggPSAxIDw8IHMtPnNwcy0+aHNoaWZ0W2Nocm9tYV07CisgICAgICAgIGludCB2ID0gMSA8PCBzLT5zcHMtPnZzaGlmdFtjaHJvbWFdOworCisgICAgICAgIC8vIHZlcnRpY2FsIGZpbHRlcmluZyBjaHJvbWEKKyAgICAgICAgZm9yICh5ID0geTA7IHkgPCB5X2VuZDsgeSArPSAoOCAqIHYpKSB7CisgICAgICAgICAgICBmb3IgKHggPSB4MCA/IHgwIDogOCAqIGg7IHggPCB4X2VuZDsgeCArPSAoOCAqIGgpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGJzMCA9IHMtPnZlcnRpY2FsX2JzWyh4ICsgIHkgICAgICAgICAgICAqIHMtPmJzX3dpZHRoKSA+PiAyXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYnMxID0gcy0+dmVydGljYWxfYnNbKHggKyAoeSArICg0ICogdikpICogcy0+YnNfd2lkdGgpID4+IDJdOworCisgICAgICAgICAgICAgICAgaWYgKChiczAgPT0gMikgfHwgKGJzMSA9PSAyKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcXAwID0gKGdldF9xUHkocywgeCAtIDEsIHkpICAgICAgICAgICArIGdldF9xUHkocywgeCwgeSkgICAgICAgICAgICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHFwMSA9IChnZXRfcVB5KHMsIHggLSAxLCB5ICsgKDQgKiB2KSkgKyBnZXRfcVB5KHMsIHgsIHkgKyAoNCAqIHYpKSArIDEpID4+IDE7CisKKyAgICAgICAgICAgICAgICAgICAgY190Y1swXSA9IChiczAgPT0gMikgPyBjaHJvbWFfdGMocywgcXAwLCBjaHJvbWEsIHRjX29mZnNldCkgOiAwOworICAgICAgICAgICAgICAgICAgICBjX3RjWzFdID0gKGJzMSA9PSAyKSA/IGNocm9tYV90YyhzLCBxcDEsIGNocm9tYSwgdGNfb2Zmc2V0KSA6IDA7CisgICAgICAgICAgICAgICAgICAgIHNyYyAgICAgICA9ICZzLT5mcmFtZS0+ZGF0YVtjaHJvbWFdWyh5ID4+IHMtPnNwcy0+dnNoaWZ0W2Nocm9tYV0pICogcy0+ZnJhbWUtPmxpbmVzaXplW2Nocm9tYV0gKyAoKHggPj4gcy0+c3BzLT5oc2hpZnRbY2hyb21hXSkgPDwgcy0+c3BzLT5waXhlbF9zaGlmdCldOworICAgICAgICAgICAgICAgICAgICBpZiAocGNtZikgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9fcFswXSA9IGdldF9wY20ocywgeCAtIDEsIHkpOworICAgICAgICAgICAgICAgICAgICAgICAgbm9fcFsxXSA9IGdldF9wY20ocywgeCAtIDEsIHkgKyAoNCAqIHYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vX3FbMF0gPSBnZXRfcGNtKHMsIHgsIHkpOworICAgICAgICAgICAgICAgICAgICAgICAgbm9fcVsxXSA9IGdldF9wY20ocywgeCwgeSArICg0ICogdikpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGV2Y2RzcC5oZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hX2Moc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWUtPmxpbmVzaXplW2Nocm9tYV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3RjLCBub19wLCBub19xKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5oZXZjZHNwLmhldmNfdl9sb29wX2ZpbHRlcl9jaHJvbWEoc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lLT5saW5lc2l6ZVtjaHJvbWFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdGMsIG5vX3AsIG5vX3EpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIXkpCisgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBob3Jpem9udGFsIGZpbHRlcmluZyBjaHJvbWEKKyAgICAgICAgICAgIHRjX29mZnNldCA9IHgwID8gbGVmdF90Y19vZmZzZXQgOiBjdXJfdGNfb2Zmc2V0OworICAgICAgICAgICAgeF9lbmQyID0geF9lbmQ7CisgICAgICAgICAgICBpZiAoeF9lbmQgIT0gcy0+c3BzLT53aWR0aCkKKyAgICAgICAgICAgICAgICB4X2VuZDIgPSB4X2VuZCAtIDggKiBoOworICAgICAgICAgICAgZm9yICh4ID0geDAgPyB4MCAtIDggKiBoIDogMDsgeCA8IHhfZW5kMjsgeCArPSAoOCAqIGgpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGJzMCA9IHMtPmhvcml6b250YWxfYnNbKCB4ICAgICAgICAgICsgeSAqIHMtPmJzX3dpZHRoKSA+PiAyXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYnMxID0gcy0+aG9yaXpvbnRhbF9ic1soKHggKyA0ICogaCkgKyB5ICogcy0+YnNfd2lkdGgpID4+IDJdOworICAgICAgICAgICAgICAgIGlmICgoYnMwID09IDIpIHx8IChiczEgPT0gMikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHFwMCA9IGJzMCA9PSAyID8gKGdldF9xUHkocywgeCwgICAgICAgICAgIHkgLSAxKSArIGdldF9xUHkocywgeCwgICAgICAgICAgIHkpICsgMSkgPj4gMSA6IDA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBxcDEgPSBiczEgPT0gMiA/IChnZXRfcVB5KHMsIHggKyAoNCAqIGgpLCB5IC0gMSkgKyBnZXRfcVB5KHMsIHggKyAoNCAqIGgpLCB5KSArIDEpID4+IDEgOiAwOworCisgICAgICAgICAgICAgICAgICAgIGNfdGNbMF0gICA9IGJzMCA9PSAyID8gY2hyb21hX3RjKHMsIHFwMCwgY2hyb21hLCB0Y19vZmZzZXQpICAgICA6IDA7CisgICAgICAgICAgICAgICAgICAgIGNfdGNbMV0gICA9IGJzMSA9PSAyID8gY2hyb21hX3RjKHMsIHFwMSwgY2hyb21hLCBjdXJfdGNfb2Zmc2V0KSA6IDA7CisgICAgICAgICAgICAgICAgICAgIHNyYyAgICAgICA9ICZzLT5mcmFtZS0+ZGF0YVtjaHJvbWFdWyh5ID4+IHMtPnNwcy0+dnNoaWZ0WzFdKSAqIHMtPmZyYW1lLT5saW5lc2l6ZVtjaHJvbWFdICsgKCh4ID4+IHMtPnNwcy0+aHNoaWZ0WzFdKSA8PCBzLT5zcHMtPnBpeGVsX3NoaWZ0KV07CisgICAgICAgICAgICAgICAgICAgIGlmIChwY21mKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub19wWzBdID0gZ2V0X3BjbShzLCB4LCAgICAgICAgICAgeSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbm9fcFsxXSA9IGdldF9wY20ocywgeCArICg0ICogaCksIHkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vX3FbMF0gPSBnZXRfcGNtKHMsIHgsICAgICAgICAgICB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vX3FbMV0gPSBnZXRfcGNtKHMsIHggKyAoNCAqIGgpLCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhldmNkc3AuaGV2Y19oX2xvb3BfZmlsdGVyX2Nocm9tYV9jKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lLT5saW5lc2l6ZVtjaHJvbWFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY190Yywgbm9fcCwgbm9fcSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGV2Y2RzcC5oZXZjX2hfbG9vcF9maWx0ZXJfY2hyb21hKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZS0+bGluZXNpemVbY2hyb21hXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3RjLCBub19wLCBub19xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgYm91bmRhcnlfc3RyZW5ndGgoSEVWQ0NvbnRleHQgKnMsIE12RmllbGQgKmN1cnIsIE12RmllbGQgKm5laWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZQaWNMaXN0ICpuZWlnaF9yZWZQaWNMaXN0KQoreworICAgIGlmIChjdXJyLT5wcmVkX2ZsYWcgPT0gUEZfQkkgJiYgIG5laWdoLT5wcmVkX2ZsYWcgPT0gUEZfQkkpIHsKKyAgICAgICAgLy8gc2FtZSBMMCBhbmQgTDEKKyAgICAgICAgaWYgKHMtPnJlZi0+cmVmUGljTGlzdFswXS5saXN0W2N1cnItPnJlZl9pZHhbMF1dID09IG5laWdoX3JlZlBpY0xpc3RbMF0ubGlzdFtuZWlnaC0+cmVmX2lkeFswXV0gICYmCisgICAgICAgICAgICBzLT5yZWYtPnJlZlBpY0xpc3RbMF0ubGlzdFtjdXJyLT5yZWZfaWR4WzBdXSA9PSBzLT5yZWYtPnJlZlBpY0xpc3RbMV0ubGlzdFtjdXJyLT5yZWZfaWR4WzFdXSAmJgorICAgICAgICAgICAgbmVpZ2hfcmVmUGljTGlzdFswXS5saXN0W25laWdoLT5yZWZfaWR4WzBdXSA9PSBuZWlnaF9yZWZQaWNMaXN0WzFdLmxpc3RbbmVpZ2gtPnJlZl9pZHhbMV1dKSB7CisgICAgICAgICAgICBpZiAoKEZGQUJTKG5laWdoLT5tdlswXS54IC0gY3Vyci0+bXZbMF0ueCkgPj0gNCB8fCBGRkFCUyhuZWlnaC0+bXZbMF0ueSAtIGN1cnItPm12WzBdLnkpID49IDQgfHwKKyAgICAgICAgICAgICAgICAgRkZBQlMobmVpZ2gtPm12WzFdLnggLSBjdXJyLT5tdlsxXS54KSA+PSA0IHx8IEZGQUJTKG5laWdoLT5tdlsxXS55IC0gY3Vyci0+bXZbMV0ueSkgPj0gNCkgJiYKKyAgICAgICAgICAgICAgICAoRkZBQlMobmVpZ2gtPm12WzFdLnggLSBjdXJyLT5tdlswXS54KSA+PSA0IHx8IEZGQUJTKG5laWdoLT5tdlsxXS55IC0gY3Vyci0+bXZbMF0ueSkgPj0gNCB8fAorICAgICAgICAgICAgICAgICBGRkFCUyhuZWlnaC0+bXZbMF0ueCAtIGN1cnItPm12WzFdLngpID49IDQgfHwgRkZBQlMobmVpZ2gtPm12WzBdLnkgLSBjdXJyLT5tdlsxXS55KSA+PSA0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmIChuZWlnaF9yZWZQaWNMaXN0WzBdLmxpc3RbbmVpZ2gtPnJlZl9pZHhbMF1dID09IHMtPnJlZi0+cmVmUGljTGlzdFswXS5saXN0W2N1cnItPnJlZl9pZHhbMF1dICYmCisgICAgICAgICAgICAgICAgICAgbmVpZ2hfcmVmUGljTGlzdFsxXS5saXN0W25laWdoLT5yZWZfaWR4WzFdXSA9PSBzLT5yZWYtPnJlZlBpY0xpc3RbMV0ubGlzdFtjdXJyLT5yZWZfaWR4WzFdXSkgeworICAgICAgICAgICAgaWYgKEZGQUJTKG5laWdoLT5tdlswXS54IC0gY3Vyci0+bXZbMF0ueCkgPj0gNCB8fCBGRkFCUyhuZWlnaC0+bXZbMF0ueSAtIGN1cnItPm12WzBdLnkpID49IDQgfHwKKyAgICAgICAgICAgICAgICBGRkFCUyhuZWlnaC0+bXZbMV0ueCAtIGN1cnItPm12WzFdLngpID49IDQgfHwgRkZBQlMobmVpZ2gtPm12WzFdLnkgLSBjdXJyLT5tdlsxXS55KSA+PSA0KQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYgKG5laWdoX3JlZlBpY0xpc3RbMV0ubGlzdFtuZWlnaC0+cmVmX2lkeFsxXV0gPT0gcy0+cmVmLT5yZWZQaWNMaXN0WzBdLmxpc3RbY3Vyci0+cmVmX2lkeFswXV0gJiYKKyAgICAgICAgICAgICAgICAgICBuZWlnaF9yZWZQaWNMaXN0WzBdLmxpc3RbbmVpZ2gtPnJlZl9pZHhbMF1dID09IHMtPnJlZi0+cmVmUGljTGlzdFsxXS5saXN0W2N1cnItPnJlZl9pZHhbMV1dKSB7CisgICAgICAgICAgICBpZiAoRkZBQlMobmVpZ2gtPm12WzFdLnggLSBjdXJyLT5tdlswXS54KSA+PSA0IHx8IEZGQUJTKG5laWdoLT5tdlsxXS55IC0gY3Vyci0+bXZbMF0ueSkgPj0gNCB8fAorICAgICAgICAgICAgICAgIEZGQUJTKG5laWdoLT5tdlswXS54IC0gY3Vyci0+bXZbMV0ueCkgPj0gNCB8fCBGRkFCUyhuZWlnaC0+bXZbMF0ueSAtIGN1cnItPm12WzFdLnkpID49IDQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKGN1cnItPnByZWRfZmxhZyAhPSBQRl9CSSkgJiYgKG5laWdoLT5wcmVkX2ZsYWcgIT0gUEZfQkkpKXsgLy8gMSBNVgorICAgICAgICBNdiBBLCBCOworICAgICAgICBpbnQgcmVmX0EsIHJlZl9COworCisgICAgICAgIGlmIChjdXJyLT5wcmVkX2ZsYWcgJiAxKSB7CisgICAgICAgICAgICBBICAgICA9IGN1cnItPm12WzBdOworICAgICAgICAgICAgcmVmX0EgPSBzLT5yZWYtPnJlZlBpY0xpc3RbMF0ubGlzdFtjdXJyLT5yZWZfaWR4WzBdXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEEgICAgID0gY3Vyci0+bXZbMV07CisgICAgICAgICAgICByZWZfQSA9IHMtPnJlZi0+cmVmUGljTGlzdFsxXS5saXN0W2N1cnItPnJlZl9pZHhbMV1dOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5laWdoLT5wcmVkX2ZsYWcgJiAxKSB7CisgICAgICAgICAgICBCICAgICA9IG5laWdoLT5tdlswXTsKKyAgICAgICAgICAgIHJlZl9CID0gbmVpZ2hfcmVmUGljTGlzdFswXS5saXN0W25laWdoLT5yZWZfaWR4WzBdXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEIgICAgID0gbmVpZ2gtPm12WzFdOworICAgICAgICAgICAgcmVmX0IgPSBuZWlnaF9yZWZQaWNMaXN0WzFdLmxpc3RbbmVpZ2gtPnJlZl9pZHhbMV1dOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlZl9BID09IHJlZl9CKSB7CisgICAgICAgICAgICBpZiAoRkZBQlMoQS54IC0gQi54KSA+PSA0IHx8IEZGQUJTKEEueSAtIEIueSkgPj0gNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBmZl9oZXZjX2RlYmxvY2tpbmdfYm91bmRhcnlfc3RyZW5ndGhzKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl90cmFmb19zaXplKQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIE12RmllbGQgKnRhYl9tdmYgICAgID0gcy0+cmVmLT50YWJfbXZmOworICAgIGludCBsb2cyX21pbl9wdV9zaXplID0gcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplOworICAgIGludCBsb2cyX21pbl90dV9zaXplID0gcy0+c3BzLT5sb2cyX21pbl90Yl9zaXplOworICAgIGludCBtaW5fcHVfd2lkdGggICAgID0gcy0+c3BzLT5taW5fcHVfd2lkdGg7CisgICAgaW50IG1pbl90dV93aWR0aCAgICAgPSBzLT5zcHMtPm1pbl90Yl93aWR0aDsKKyAgICBpbnQgaXNfaW50cmEgPSB0YWJfbXZmWyh5MCA+PiBsb2cyX21pbl9wdV9zaXplKSAqIG1pbl9wdV93aWR0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoeDAgPj4gbG9nMl9taW5fcHVfc2l6ZSldLnByZWRfZmxhZyA9PSBQRl9JTlRSQTsKKyAgICBpbnQgYm91bmRhcnlfdXBwZXIsIGJvdW5kYXJ5X2xlZnQ7CisgICAgaW50IGksIGosIGJzOworCisgICAgYm91bmRhcnlfdXBwZXIgPSB5MCA+IDAgJiYgISh5MCAmIDcpOworICAgIGlmIChib3VuZGFyeV91cHBlciAmJgorICAgICAgICAoKCFzLT5zaC5zbGljZV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZyAmJgorICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyAmIEJPVU5EQVJZX1VQUEVSX1NMSUNFICYmCisgICAgICAgICAgKHkwICUgKDEgPDwgcy0+c3BzLT5sb2cyX2N0Yl9zaXplKSkgPT0gMCkgfHwKKyAgICAgICAgICghcy0+cHBzLT5sb29wX2ZpbHRlcl9hY3Jvc3NfdGlsZXNfZW5hYmxlZF9mbGFnICYmCisgICAgICAgICAgbGMtPmJvdW5kYXJ5X2ZsYWdzICYgQk9VTkRBUllfVVBQRVJfVElMRSAmJgorICAgICAgICAgICh5MCAlICgxIDw8IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZSkpID09IDApKSkKKyAgICAgICAgYm91bmRhcnlfdXBwZXIgPSAwOworCisgICAgaWYgKGJvdW5kYXJ5X3VwcGVyKSB7CisgICAgICAgIFJlZlBpY0xpc3QgKnJwbF90b3AgPSAobGMtPmJvdW5kYXJ5X2ZsYWdzICYgQk9VTkRBUllfVVBQRVJfU0xJQ0UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2hldmNfZ2V0X3JlZl9saXN0KHMsIHMtPnJlZiwgeDAsIHkwIC0gMSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVmLT5yZWZQaWNMaXN0OworICAgICAgICBpbnQgeXBfcHUgPSAoeTAgLSAxKSA+PiBsb2cyX21pbl9wdV9zaXplOworICAgICAgICBpbnQgeXFfcHUgPSAgeTAgICAgICA+PiBsb2cyX21pbl9wdV9zaXplOworICAgICAgICBpbnQgeXBfdHUgPSAoeTAgLSAxKSA+PiBsb2cyX21pbl90dV9zaXplOworICAgICAgICBpbnQgeXFfdHUgPSAgeTAgICAgICA+PiBsb2cyX21pbl90dV9zaXplOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKDEgPDwgbG9nMl90cmFmb19zaXplKTsgaSArPSA0KSB7CisgICAgICAgICAgICAgICAgaW50IHhfcHUgPSAoeDAgKyBpKSA+PiBsb2cyX21pbl9wdV9zaXplOworICAgICAgICAgICAgICAgIGludCB4X3R1ID0gKHgwICsgaSkgPj4gbG9nMl9taW5fdHVfc2l6ZTsKKyAgICAgICAgICAgICAgICBNdkZpZWxkICp0b3AgID0gJnRhYl9tdmZbeXBfcHUgKiBtaW5fcHVfd2lkdGggKyB4X3B1XTsKKyAgICAgICAgICAgICAgICBNdkZpZWxkICpjdXJyID0gJnRhYl9tdmZbeXFfcHUgKiBtaW5fcHVfd2lkdGggKyB4X3B1XTsKKyAgICAgICAgICAgICAgICB1aW50OF90IHRvcF9jYmZfbHVtYSAgPSBzLT5jYmZfbHVtYVt5cF90dSAqIG1pbl90dV93aWR0aCArIHhfdHVdOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgY3Vycl9jYmZfbHVtYSA9IHMtPmNiZl9sdW1hW3lxX3R1ICogbWluX3R1X3dpZHRoICsgeF90dV07CisKKyAgICAgICAgICAgICAgICBpZiAoY3Vyci0+cHJlZF9mbGFnID09IFBGX0lOVFJBIHx8IHRvcC0+cHJlZF9mbGFnID09IFBGX0lOVFJBKQorICAgICAgICAgICAgICAgICAgICBicyA9IDI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3Vycl9jYmZfbHVtYSB8fCB0b3BfY2JmX2x1bWEpCisgICAgICAgICAgICAgICAgICAgIGJzID0gMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJzID0gYm91bmRhcnlfc3RyZW5ndGgocywgY3VyciwgdG9wLCBycGxfdG9wKTsKKyAgICAgICAgICAgICAgICBzLT5ob3Jpem9udGFsX2JzWygoeDAgKyBpKSArIHkwICogcy0+YnNfd2lkdGgpID4+IDJdID0gYnM7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgLy8gYnMgZm9yIHZlcnRpY2FsIFRVIGJvdW5kYXJpZXMKKyAgICBib3VuZGFyeV9sZWZ0ID0geDAgPiAwICYmICEoeDAgJiA3KTsKKyAgICBpZiAoYm91bmRhcnlfbGVmdCAmJgorICAgICAgICAoKCFzLT5zaC5zbGljZV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZyAmJgorICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyAmIEJPVU5EQVJZX0xFRlRfU0xJQ0UgJiYKKyAgICAgICAgICAoeDAgJSAoMSA8PCBzLT5zcHMtPmxvZzJfY3RiX3NpemUpKSA9PSAwKSB8fAorICAgICAgICAgKCFzLT5wcHMtPmxvb3BfZmlsdGVyX2Fjcm9zc190aWxlc19lbmFibGVkX2ZsYWcgJiYKKyAgICAgICAgICBsYy0+Ym91bmRhcnlfZmxhZ3MgJiBCT1VOREFSWV9MRUZUX1RJTEUgJiYKKyAgICAgICAgICAoeDAgJSAoMSA8PCBzLT5zcHMtPmxvZzJfY3RiX3NpemUpKSA9PSAwKSkpCisgICAgICAgIGJvdW5kYXJ5X2xlZnQgPSAwOworCisgICAgaWYgKGJvdW5kYXJ5X2xlZnQpIHsKKyAgICAgICAgUmVmUGljTGlzdCAqcnBsX2xlZnQgPSAobGMtPmJvdW5kYXJ5X2ZsYWdzICYgQk9VTkRBUllfTEVGVF9TTElDRSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2hldmNfZ2V0X3JlZl9saXN0KHMsIHMtPnJlZiwgeDAgLSAxLCB5MCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlZi0+cmVmUGljTGlzdDsKKyAgICAgICAgaW50IHhwX3B1ID0gKHgwIC0gMSkgPj4gbG9nMl9taW5fcHVfc2l6ZTsKKyAgICAgICAgaW50IHhxX3B1ID0gIHgwICAgICAgPj4gbG9nMl9taW5fcHVfc2l6ZTsKKyAgICAgICAgaW50IHhwX3R1ID0gKHgwIC0gMSkgPj4gbG9nMl9taW5fdHVfc2l6ZTsKKyAgICAgICAgaW50IHhxX3R1ID0gIHgwICAgICAgPj4gbG9nMl9taW5fdHVfc2l6ZTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICgxIDw8IGxvZzJfdHJhZm9fc2l6ZSk7IGkgKz0gNCkgeworICAgICAgICAgICAgICAgIGludCB5X3B1ICAgICAgPSAoeTAgKyBpKSA+PiBsb2cyX21pbl9wdV9zaXplOworICAgICAgICAgICAgICAgIGludCB5X3R1ICAgICAgPSAoeTAgKyBpKSA+PiBsb2cyX21pbl90dV9zaXplOworICAgICAgICAgICAgICAgIE12RmllbGQgKmxlZnQgPSAmdGFiX212Zlt5X3B1ICogbWluX3B1X3dpZHRoICsgeHBfcHVdOworICAgICAgICAgICAgICAgIE12RmllbGQgKmN1cnIgPSAmdGFiX212Zlt5X3B1ICogbWluX3B1X3dpZHRoICsgeHFfcHVdOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVmdF9jYmZfbHVtYSA9IHMtPmNiZl9sdW1hW3lfdHUgKiBtaW5fdHVfd2lkdGggKyB4cF90dV07CisgICAgICAgICAgICAgICAgdWludDhfdCBjdXJyX2NiZl9sdW1hID0gcy0+Y2JmX2x1bWFbeV90dSAqIG1pbl90dV93aWR0aCArIHhxX3R1XTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyLT5wcmVkX2ZsYWcgPT0gUEZfSU5UUkEgfHwgbGVmdC0+cHJlZF9mbGFnID09IFBGX0lOVFJBKQorICAgICAgICAgICAgICAgICAgICBicyA9IDI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3Vycl9jYmZfbHVtYSB8fCBsZWZ0X2NiZl9sdW1hKQorICAgICAgICAgICAgICAgICAgICBicyA9IDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBicyA9IGJvdW5kYXJ5X3N0cmVuZ3RoKHMsIGN1cnIsIGxlZnQsIHJwbF9sZWZ0KTsKKyAgICAgICAgICAgICAgICBzLT52ZXJ0aWNhbF9ic1soeDAgKyAoeTAgKyBpKSAqIHMtPmJzX3dpZHRoKSA+PiAyXSA9IGJzOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsb2cyX3RyYWZvX3NpemUgPiBsb2cyX21pbl9wdV9zaXplICYmICFpc19pbnRyYSkgeworICAgICAgICBSZWZQaWNMaXN0ICpycGwgPSBzLT5yZWYtPnJlZlBpY0xpc3Q7CisKKyAgICAgICAgLy8gYnMgZm9yIFRVIGludGVybmFsIGhvcml6b250YWwgUFUgYm91bmRhcmllcworICAgICAgICBmb3IgKGogPSA4OyBqIDwgKDEgPDwgbG9nMl90cmFmb19zaXplKTsgaiArPSA4KSB7CisgICAgICAgICAgICBpbnQgeXBfcHUgPSAoeTAgKyBqIC0gMSkgPj4gbG9nMl9taW5fcHVfc2l6ZTsKKyAgICAgICAgICAgIGludCB5cV9wdSA9ICh5MCArIGopICAgICA+PiBsb2cyX21pbl9wdV9zaXplOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKDEgPDwgbG9nMl90cmFmb19zaXplKTsgaSArPSA0KSB7CisgICAgICAgICAgICAgICAgaW50IHhfcHUgPSAoeDAgKyBpKSA+PiBsb2cyX21pbl9wdV9zaXplOworICAgICAgICAgICAgICAgIE12RmllbGQgKnRvcCAgPSAmdGFiX212Zlt5cF9wdSAqIG1pbl9wdV93aWR0aCArIHhfcHVdOworICAgICAgICAgICAgICAgIE12RmllbGQgKmN1cnIgPSAmdGFiX212Zlt5cV9wdSAqIG1pbl9wdV93aWR0aCArIHhfcHVdOworCisgICAgICAgICAgICAgICAgYnMgPSBib3VuZGFyeV9zdHJlbmd0aChzLCBjdXJyLCB0b3AsIHJwbCk7CisgICAgICAgICAgICAgICAgcy0+aG9yaXpvbnRhbF9ic1soKHgwICsgaSkgKyAoeTAgKyBqKSAqIHMtPmJzX3dpZHRoKSA+PiAyXSA9IGJzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYnMgZm9yIFRVIGludGVybmFsIHZlcnRpY2FsIFBVIGJvdW5kYXJpZXMKKyAgICAgICAgZm9yIChqID0gMDsgaiA8ICgxIDw8IGxvZzJfdHJhZm9fc2l6ZSk7IGogKz0gNCkgeworICAgICAgICAgICAgaW50IHlfcHUgPSAoeTAgKyBqKSA+PiBsb2cyX21pbl9wdV9zaXplOworCisgICAgICAgICAgICBmb3IgKGkgPSA4OyBpIDwgKDEgPDwgbG9nMl90cmFmb19zaXplKTsgaSArPSA4KSB7CisgICAgICAgICAgICAgICAgaW50IHhwX3B1ID0gKHgwICsgaSAtIDEpID4+IGxvZzJfbWluX3B1X3NpemU7CisgICAgICAgICAgICAgICAgaW50IHhxX3B1ID0gKHgwICsgaSkgICAgID4+IGxvZzJfbWluX3B1X3NpemU7CisgICAgICAgICAgICAgICAgTXZGaWVsZCAqbGVmdCA9ICZ0YWJfbXZmW3lfcHUgKiBtaW5fcHVfd2lkdGggKyB4cF9wdV07CisgICAgICAgICAgICAgICAgTXZGaWVsZCAqY3VyciA9ICZ0YWJfbXZmW3lfcHUgKiBtaW5fcHVfd2lkdGggKyB4cV9wdV07CisKKyAgICAgICAgICAgICAgICBicyA9IGJvdW5kYXJ5X3N0cmVuZ3RoKHMsIGN1cnIsIGxlZnQsIHJwbCk7CisgICAgICAgICAgICAgICAgcy0+dmVydGljYWxfYnNbKCh4MCArIGkpICsgKHkwICsgaikgKiBzLT5ic193aWR0aCkgPj4gMl0gPSBiczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI3VuZGVmIExVTUEKKyN1bmRlZiBDQgorI3VuZGVmIENSCisKK3ZvaWQgZmZfaGV2Y19obHNfZmlsdGVyKEhFVkNDb250ZXh0ICpzLCBpbnQgeCwgaW50IHksIGludCBjdGJfc2l6ZSkKK3sKKyAgICBpbnQgeF9lbmQgPSB4ID49IHMtPnNwcy0+d2lkdGggIC0gY3RiX3NpemU7CisgICAgZGVibG9ja2luZ19maWx0ZXJfQ1RCKHMsIHgsIHkpOworICAgIGlmIChzLT5zcHMtPnNhb19lbmFibGVkKSB7CisgICAgICAgIGludCB5X2VuZCA9IHkgPj0gcy0+c3BzLT5oZWlnaHQgLSBjdGJfc2l6ZTsKKyAgICAgICAgaWYgKHkgJiYgeCkKKyAgICAgICAgICAgIHNhb19maWx0ZXJfQ1RCKHMsIHggLSBjdGJfc2l6ZSwgeSAtIGN0Yl9zaXplKTsKKyAgICAgICAgaWYgKHggJiYgeV9lbmQpCisgICAgICAgICAgICBzYW9fZmlsdGVyX0NUQihzLCB4IC0gY3RiX3NpemUsIHkpOworICAgICAgICBpZiAoeSAmJiB4X2VuZCkgeworICAgICAgICAgICAgc2FvX2ZpbHRlcl9DVEIocywgeCwgeSAtIGN0Yl9zaXplKTsKKyAgICAgICAgICAgIGlmIChzLT50aHJlYWRzX3R5cGUgJiBGRl9USFJFQURfRlJBTUUgKQorICAgICAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPnJlZi0+dGYsIHksIDApOworICAgICAgICB9CisgICAgICAgIGlmICh4X2VuZCAmJiB5X2VuZCkgeworICAgICAgICAgICAgc2FvX2ZpbHRlcl9DVEIocywgeCAsIHkpOworICAgICAgICAgICAgaWYgKHMtPnRocmVhZHNfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSApCisgICAgICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmcy0+cmVmLT50ZiwgeSArIGN0Yl9zaXplLCAwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocy0+dGhyZWFkc190eXBlICYgRkZfVEhSRUFEX0ZSQU1FICYmIHhfZW5kKQorICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5yZWYtPnRmLCB5ICsgY3RiX3NpemUgLSA0LCAwKTsKK30KKwordm9pZCBmZl9oZXZjX2hsc19maWx0ZXJzKEhFVkNDb250ZXh0ICpzLCBpbnQgeF9jdGIsIGludCB5X2N0YiwgaW50IGN0Yl9zaXplKQoreworICAgIGludCB4X2VuZCA9IHhfY3RiID49IHMtPnNwcy0+d2lkdGggIC0gY3RiX3NpemU7CisgICAgaW50IHlfZW5kID0geV9jdGIgPj0gcy0+c3BzLT5oZWlnaHQgLSBjdGJfc2l6ZTsKKyAgICBpZiAoeV9jdGIgJiYgeF9jdGIpCisgICAgICAgIGZmX2hldmNfaGxzX2ZpbHRlcihzLCB4X2N0YiAtIGN0Yl9zaXplLCB5X2N0YiAtIGN0Yl9zaXplLCBjdGJfc2l6ZSk7CisgICAgaWYgKHlfY3RiICYmIHhfZW5kKQorICAgICAgICBmZl9oZXZjX2hsc19maWx0ZXIocywgeF9jdGIsIHlfY3RiIC0gY3RiX3NpemUsIGN0Yl9zaXplKTsKKyAgICBpZiAoeF9jdGIgJiYgeV9lbmQpCisgICAgICAgIGZmX2hldmNfaGxzX2ZpbHRlcihzLCB4X2N0YiAtIGN0Yl9zaXplLCB5X2N0YiwgY3RiX3NpemUpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Y19tdnMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNfbXZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4ZTdhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNfbXZzLmMKQEAgLTAsMCArMSw3NzMgQEAKKy8qCisgKiBIRVZDIHZpZGVvIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIEd1aWxsYXVtZSBNYXJ0cmVzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQW5hbmQgTWVoZXIgS290cmEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImhldmMuaCIKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbDBfbDFfY2FuZF9pZHhbMTJdWzJdID0geworICAgIHsgMCwgMSwgfSwKKyAgICB7IDEsIDAsIH0sCisgICAgeyAwLCAyLCB9LAorICAgIHsgMiwgMCwgfSwKKyAgICB7IDEsIDIsIH0sCisgICAgeyAyLCAxLCB9LAorICAgIHsgMCwgMywgfSwKKyAgICB7IDMsIDAsIH0sCisgICAgeyAxLCAzLCB9LAorICAgIHsgMywgMSwgfSwKKyAgICB7IDIsIDMsIH0sCisgICAgeyAzLCAyLCB9LAorfTsKKwordm9pZCBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBiVywgaW50IG5QYkgpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgaW50IHgwYiA9IHgwICYgKCgxIDw8IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZSkgLSAxKTsKKyAgICBpbnQgeTBiID0geTAgJiAoKDEgPDwgcy0+c3BzLT5sb2cyX2N0Yl9zaXplKSAtIDEpOworCisgICAgbGMtPm5hLmNhbmRfdXAgICAgICAgPSAobGMtPmN0Yl91cF9mbGFnICAgfHwgeTBiKTsKKyAgICBsYy0+bmEuY2FuZF9sZWZ0ICAgICA9IChsYy0+Y3RiX2xlZnRfZmxhZyB8fCB4MGIpOworICAgIGxjLT5uYS5jYW5kX3VwX2xlZnQgID0gKCF4MGIgJiYgIXkwYikgPyBsYy0+Y3RiX3VwX2xlZnRfZmxhZyA6IGxjLT5uYS5jYW5kX2xlZnQgJiYgbGMtPm5hLmNhbmRfdXA7CisgICAgbGMtPm5hLmNhbmRfdXBfcmlnaHRfc2FwID0KKyAgICAgICAgICAgICgoeDBiICsgblBiVykgPT0gKDEgPDwgcy0+c3BzLT5sb2cyX2N0Yl9zaXplKSkgPworICAgICAgICAgICAgICAgICAgICBsYy0+Y3RiX3VwX3JpZ2h0X2ZsYWcgJiYgIXkwYiA6IGxjLT5uYS5jYW5kX3VwOworICAgIGxjLT5uYS5jYW5kX3VwX3JpZ2h0ID0KKyAgICAgICAgICAgIGxjLT5uYS5jYW5kX3VwX3JpZ2h0X3NhcAorICAgICAgICAgICAgICAgICAgICAgJiYgKHgwICsgblBiVykgPCBsYy0+ZW5kX29mX3RpbGVzX3g7CisgICAgbGMtPm5hLmNhbmRfYm90dG9tX2xlZnQgPSAoKHkwICsgblBiSCkgPj0gbGMtPmVuZF9vZl90aWxlc195KSA/IDAgOiBsYy0+bmEuY2FuZF9sZWZ0OworfQorCisvKgorICogNi40LjEgRGVyaXZhdGlvbiBwcm9jZXNzIGZvciB6LXNjYW4gb3JkZXIgYmxvY2sgYXZhaWxhYmlsaXR5CisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB6X3NjYW5fYmxvY2tfYXZhaWwoSEVWQ0NvbnRleHQgKnMsIGludCB4Q3VyciwgaW50IHlDdXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhOLCBpbnQgeU4pCit7CisjZGVmaW5lIE1JTl9UQl9BRERSX1pTKHgsIHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcy0+cHBzLT5taW5fdGJfYWRkcl96c1soeSkgKiAocy0+c3BzLT50Yl9tYXNrKzIpICsgKHgpXQorCisgICAgaW50IHhDdXJyX2N0YiA9IHhDdXJyID4+IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZTsKKyAgICBpbnQgeUN1cnJfY3RiID0geUN1cnIgPj4gcy0+c3BzLT5sb2cyX2N0Yl9zaXplOworICAgIGludCB4Tl9jdGIgICAgPSB4TiAgICA+PiBzLT5zcHMtPmxvZzJfY3RiX3NpemU7CisgICAgaW50IHlOX2N0YiAgICA9IHlOICAgID4+IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZTsKKyAgICBpZiggeU5fY3RiIDwgeUN1cnJfY3RiIHx8IHhOX2N0YiA8IHhDdXJyX2N0YiApCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UgeworICAgICAgICBpbnQgQ3VyciA9IE1JTl9UQl9BRERSX1pTKCh4Q3VyciA+PiBzLT5zcHMtPmxvZzJfbWluX3RiX3NpemUpICYgcy0+c3BzLT50Yl9tYXNrLAorICAgICAgICAgICAgICAgICh5Q3VyciA+PiBzLT5zcHMtPmxvZzJfbWluX3RiX3NpemUpICYgcy0+c3BzLT50Yl9tYXNrKTsKKyAgICAgICAgaW50IE4gICAgPSBNSU5fVEJfQUREUl9aUygoeE4gPj4gcy0+c3BzLT5sb2cyX21pbl90Yl9zaXplKSAmIHMtPnNwcy0+dGJfbWFzaywKKyAgICAgICAgICAgICAgICAoeU4gPj4gcy0+c3BzLT5sb2cyX21pbl90Yl9zaXplKSAmIHMtPnNwcy0+dGJfbWFzayk7CisgICAgICAgIHJldHVybiBOIDw9IEN1cnI7CisgICAgfQorfQorCisvL2NoZWNrIGlmIHRoZSB0d28gbHVtYSBsb2NhdGlvbnMgYmVsb25nIHRvIHRoZSBzYW1lIG1vc3Rpb24gZXN0aW1hdGlvbiByZWdpb24KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBpc19kaWZmX21lcihIRVZDQ29udGV4dCAqcywgaW50IHhOLCBpbnQgeU4sIGludCB4UCwgaW50IHlQKQoreworICAgIHVpbnQ4X3QgcGxldmVsID0gcy0+cHBzLT5sb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsOworCisgICAgcmV0dXJuIHhOID4+IHBsZXZlbCA9PSB4UCA+PiBwbGV2ZWwgJiYKKyAgICAgICAgICAgeU4gPj4gcGxldmVsID09IHlQID4+IHBsZXZlbDsKK30KKworI2RlZmluZSBNQVRDSF9NVih4KSAoQVZfUk4zMkEoJkEueCkgPT0gQVZfUk4zMkEoJkIueCkpCisjZGVmaW5lIE1BVENIKHgpIChBLnggPT0gQi54KQorCisvLyBjaGVjayBpZiB0aGUgbXYncyBhbmQgcmVmaWR4IGFyZSB0aGUgc2FtZSBiZXR3ZWVuIEEgYW5kIEIKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBjb21wYXJlX212X3JlZl9pZHgoc3RydWN0IE12RmllbGQgQSwgc3RydWN0IE12RmllbGQgQikKK3sKKyAgICBpbnQgYV9wZiA9IEEucHJlZF9mbGFnOworICAgIGludCBiX3BmID0gQi5wcmVkX2ZsYWc7CisgICAgaWYgKGFfcGYgPT0gYl9wZikgeworICAgICAgICBpZiAoYV9wZiA9PSBQRl9CSSkgeworICAgICAgICAgICAgcmV0dXJuIE1BVENIKHJlZl9pZHhbMF0pICYmIE1BVENIX01WKG12WzBdKSAmJgorICAgICAgICAgICAgICAgICAgIE1BVENIKHJlZl9pZHhbMV0pICYmIE1BVENIX01WKG12WzFdKTsKKyAgICAgICAgfSBlbHNlIGlmIChhX3BmID09IFBGX0wwKSB7CisgICAgICAgICAgICByZXR1cm4gTUFUQ0gocmVmX2lkeFswXSkgJiYgTUFUQ0hfTVYobXZbMF0pOworICAgICAgICB9IGVsc2UgaWYgKGFfcGYgPT0gUEZfTDEpIHsKKyAgICAgICAgICAgIHJldHVybiBNQVRDSChyZWZfaWR4WzFdKSAmJiBNQVRDSF9NVihtdlsxXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgbXZfc2NhbGUoTXYgKmRzdCwgTXYgKnNyYywgaW50IHRkLCBpbnQgdGIpCit7CisgICAgaW50IHR4LCBzY2FsZV9mYWN0b3I7CisKKyAgICB0ZCA9IGF2X2NsaXBfaW50OCh0ZCk7CisgICAgdGIgPSBhdl9jbGlwX2ludDgodGIpOworICAgIHR4ID0gKDB4NDAwMCArIGFicyh0ZCAvIDIpKSAvIHRkOworICAgIHNjYWxlX2ZhY3RvciA9IGF2X2NsaXAoKHRiICogdHggKyAzMikgPj4gNiwgLTQwOTYsIDQwOTUpOworICAgIGRzdC0+eCA9IGF2X2NsaXBfaW50MTYoKHNjYWxlX2ZhY3RvciAqIHNyYy0+eCArIDEyNyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2NhbGVfZmFjdG9yICogc3JjLT54IDwgMCkpID4+IDgpOworICAgIGRzdC0+eSA9IGF2X2NsaXBfaW50MTYoKHNjYWxlX2ZhY3RvciAqIHNyYy0+eSArIDEyNyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2NhbGVfZmFjdG9yICogc3JjLT55IDwgMCkpID4+IDgpOworfQorCitzdGF0aWMgaW50IGNoZWNrX212c2V0KE12ICptdkxYQ29sLCBNdiAqbXZDb2wsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xQaWMsIGludCBwb2MsCisgICAgICAgICAgICAgICAgICAgICAgIFJlZlBpY0xpc3QgKnJlZlBpY0xpc3QsIGludCBYLCBpbnQgcmVmSWR4THgsCisgICAgICAgICAgICAgICAgICAgICAgIFJlZlBpY0xpc3QgKnJlZlBpY0xpc3RfY29sLCBpbnQgbGlzdENvbCwgaW50IHJlZmlkeENvbCkKK3sKKyAgICBpbnQgY3VyX2x0ID0gcmVmUGljTGlzdFtYXS5pc0xvbmdUZXJtW3JlZklkeEx4XTsKKyAgICBpbnQgY29sX2x0ID0gcmVmUGljTGlzdF9jb2xbbGlzdENvbF0uaXNMb25nVGVybVtyZWZpZHhDb2xdOworICAgIGludCBjb2xfcG9jX2RpZmYsIGN1cl9wb2NfZGlmZjsKKworICAgIGlmIChjdXJfbHQgIT0gY29sX2x0KSB7CisgICAgICAgIG12TFhDb2wtPnggPSAwOworICAgICAgICBtdkxYQ29sLT55ID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29sX3BvY19kaWZmID0gY29sUGljIC0gcmVmUGljTGlzdF9jb2xbbGlzdENvbF0ubGlzdFtyZWZpZHhDb2xdOworICAgIGN1cl9wb2NfZGlmZiA9IHBvYyAgICAtIHJlZlBpY0xpc3RbWF0ubGlzdFtyZWZJZHhMeF07CisKKyAgICBpZiAoY3VyX2x0IHx8IGNvbF9wb2NfZGlmZiA9PSBjdXJfcG9jX2RpZmYgfHwgIWNvbF9wb2NfZGlmZikgeworICAgICAgICBtdkxYQ29sLT54ID0gbXZDb2wtPng7CisgICAgICAgIG12TFhDb2wtPnkgPSBtdkNvbC0+eTsKKyAgICB9IGVsc2UgeworICAgICAgICBtdl9zY2FsZShtdkxYQ29sLCBtdkNvbCwgY29sX3BvY19kaWZmLCBjdXJfcG9jX2RpZmYpOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworI2RlZmluZSBDSEVDS19NVlNFVChsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGVja19tdnNldChtdkxYQ29sLCB0ZW1wX2NvbC5tdiArIGwsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29sUGljLCBzLT5wb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJlZlBpY0xpc3QsIFgsIHJlZklkeEx4LCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZWZQaWNMaXN0X2NvbCwgTCAjIyBsLCB0ZW1wX2NvbC5yZWZfaWR4W2xdKQorCisvLyBkZXJpdmUgdGhlIG1vdGlvbiB2ZWN0b3JzIHNlY3Rpb24gOC41LjMuMS44CitzdGF0aWMgaW50IGRlcml2ZV90ZW1wb3JhbF9jb2xvY2F0ZWRfbXZzKEhFVkNDb250ZXh0ICpzLCBNdkZpZWxkIHRlbXBfY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVmSWR4THgsIE12ICptdkxYQ29sLCBpbnQgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbFBpYywgUmVmUGljTGlzdCAqcmVmUGljTGlzdF9jb2wpCit7CisgICAgUmVmUGljTGlzdCAqcmVmUGljTGlzdCA9IHMtPnJlZi0+cmVmUGljTGlzdDsKKworICAgIGlmICh0ZW1wX2NvbC5wcmVkX2ZsYWcgPT0gUEZfSU5UUkEpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCEodGVtcF9jb2wucHJlZF9mbGFnICYgUEZfTDApKQorICAgICAgICByZXR1cm4gQ0hFQ0tfTVZTRVQoMSk7CisgICAgZWxzZSBpZiAodGVtcF9jb2wucHJlZF9mbGFnID09IFBGX0wwKQorICAgICAgICByZXR1cm4gQ0hFQ0tfTVZTRVQoMCk7CisgICAgZWxzZSBpZiAodGVtcF9jb2wucHJlZF9mbGFnID09IFBGX0JJKSB7CisgICAgICAgIGludCBjaGVja19kaWZmcGljb3VudCA9IDA7CisgICAgICAgIGludCBpLCBqOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVmUGljTGlzdFtqXS5uYl9yZWZzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocmVmUGljTGlzdFtqXS5saXN0W2ldID4gcy0+cG9jKSB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrX2RpZmZwaWNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoZWNrX2RpZmZwaWNvdW50KSB7CisgICAgICAgICAgICBpZiAoWD09MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ0hFQ0tfTVZTRVQoMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIENIRUNLX01WU0VUKDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHMtPnNoLmNvbGxvY2F0ZWRfbGlzdCA9PSBMMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ0hFQ0tfTVZTRVQoMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIENIRUNLX01WU0VUKDEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVEFCX01WRih4LCB5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWJfbXZmWyh5KSAqIG1pbl9wdV93aWR0aCArIHhdCisKKyNkZWZpbmUgVEFCX01WRl9QVSh2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUQUJfTVZGKCgoeCAjIyB2KSA+PiBzLT5zcHMtPmxvZzJfbWluX3B1X3NpemUpLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgoeSAjIyB2KSA+PiBzLT5zcHMtPmxvZzJfbWluX3B1X3NpemUpKQorCisjZGVmaW5lIERFUklWRV9URU1QT1JBTF9DT0xPQ0FURURfTVZTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVyaXZlX3RlbXBvcmFsX2NvbG9jYXRlZF9tdnMocywgdGVtcF9jb2wsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmSWR4THgsIG12TFhDb2wsIFgsIGNvbFBpYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y19nZXRfcmVmX2xpc3QocywgcmVmLCB4LCB5KSkKKworLyoKKyAqIDguNS4zLjEuNyAgdGVtcG9yYWwgbHVtYSBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KKyAqLworc3RhdGljIGludCB0ZW1wb3JhbF9sdW1hX21vdGlvbl92ZWN0b3IoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYlcsIGludCBuUGJILCBpbnQgcmVmSWR4THgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdiAqbXZMWENvbCwgaW50IFgpCit7CisgICAgTXZGaWVsZCAqdGFiX212ZjsKKyAgICBNdkZpZWxkIHRlbXBfY29sOworICAgIGludCB4LCB5LCB4X3B1LCB5X3B1OworICAgIGludCBtaW5fcHVfd2lkdGggPSBzLT5zcHMtPm1pbl9wdV93aWR0aDsKKyAgICBpbnQgYXZhaWxhYmxlRmxhZ0xYQ29sID0gMDsKKyAgICBpbnQgY29sUGljOworCisgICAgSEVWQ0ZyYW1lICpyZWYgPSBzLT5yZWYtPmNvbGxvY2F0ZWRfcmVmOworCisgICAgaWYgKCFyZWYpIHsKKyAgICAgICAgbWVtc2V0KG12TFhDb2wsIDAsIHNpemVvZigqbXZMWENvbCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB0YWJfbXZmID0gcmVmLT50YWJfbXZmOworICAgIGNvbFBpYyAgPSByZWYtPnBvYzsKKworICAgIC8vYm90dG9tIHJpZ2h0IGNvbGxvY2F0ZWQgbW90aW9uIHZlY3RvcgorICAgIHggPSB4MCArIG5QYlc7CisgICAgeSA9IHkwICsgblBiSDsKKworICAgIGlmICh0YWJfbXZmICYmCisgICAgICAgICh5MCA+PiBzLT5zcHMtPmxvZzJfY3RiX3NpemUpID09ICh5ID4+IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZSkgJiYKKyAgICAgICAgeSA8IHMtPnNwcy0+aGVpZ2h0ICYmCisgICAgICAgIHggPCBzLT5zcHMtPndpZHRoKSB7CisgICAgICAgIHggICAgICAgICAgICAgICAgICY9IH4xNTsKKyAgICAgICAgeSAgICAgICAgICAgICAgICAgJj0gfjE1OworICAgICAgICBpZiAocy0+dGhyZWFkc190eXBlID09IEZGX1RIUkVBRF9GUkFNRSkKKyAgICAgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcmVmLT50ZiwgeSwgMCk7CisgICAgICAgIHhfcHUgICAgICAgICAgICAgICA9IHggPj4gcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplOworICAgICAgICB5X3B1ICAgICAgICAgICAgICAgPSB5ID4+IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKKyAgICAgICAgdGVtcF9jb2wgICAgICAgICAgID0gVEFCX01WRih4X3B1LCB5X3B1KTsKKyAgICAgICAgYXZhaWxhYmxlRmxhZ0xYQ29sID0gREVSSVZFX1RFTVBPUkFMX0NPTE9DQVRFRF9NVlM7CisgICAgfQorCisgICAgLy8gZGVyaXZlIGNlbnRlciBjb2xsb2NhdGVkIG1vdGlvbiB2ZWN0b3IKKyAgICBpZiAodGFiX212ZiAmJiAhYXZhaWxhYmxlRmxhZ0xYQ29sKSB7CisgICAgICAgIHggICAgICAgICAgICAgICAgICA9IHgwICsgKG5QYlcgPj4gMSk7CisgICAgICAgIHkgICAgICAgICAgICAgICAgICA9IHkwICsgKG5QYkggPj4gMSk7CisgICAgICAgIHggICAgICAgICAgICAgICAgICY9IH4xNTsKKyAgICAgICAgeSAgICAgICAgICAgICAgICAgJj0gfjE1OworICAgICAgICBpZiAocy0+dGhyZWFkc190eXBlID09IEZGX1RIUkVBRF9GUkFNRSkKKyAgICAgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcmVmLT50ZiwgeSwgMCk7CisgICAgICAgIHhfcHUgICAgICAgICAgICAgICA9IHggPj4gcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplOworICAgICAgICB5X3B1ICAgICAgICAgICAgICAgPSB5ID4+IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKKyAgICAgICAgdGVtcF9jb2wgICAgICAgICAgID0gVEFCX01WRih4X3B1LCB5X3B1KTsKKyAgICAgICAgYXZhaWxhYmxlRmxhZ0xYQ29sID0gREVSSVZFX1RFTVBPUkFMX0NPTE9DQVRFRF9NVlM7CisgICAgfQorICAgIHJldHVybiBhdmFpbGFibGVGbGFnTFhDb2w7Cit9CisKKyNkZWZpbmUgQVZBSUxBQkxFKGNhbmQsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGNhbmQgJiYgIShUQUJfTVZGX1BVKHYpLnByZWRfZmxhZyA9PSBQRl9JTlRSQSkpCisKKyNkZWZpbmUgUFJFRF9CTE9DS19BVkFJTEFCTEUodikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgel9zY2FuX2Jsb2NrX2F2YWlsKHMsIHgwLCB5MCwgeCAjIyB2LCB5ICMjIHYpCisKKyNkZWZpbmUgQ09NUEFSRV9NVl9SRUZJRFgoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29tcGFyZV9tdl9yZWZfaWR4KFRBQl9NVkZfUFUoYSksIFRBQl9NVkZfUFUoYikpCisKKy8qCisgKiA4LjUuMy4xLjIgIERlcml2YXRpb24gcHJvY2VzcyBmb3Igc3BhdGlhbCBtZXJnaW5nIGNhbmRpZGF0ZXMKKyAqLworc3RhdGljIHZvaWQgZGVyaXZlX3NwYXRpYWxfbWVyZ2VfY2FuZGlkYXRlcyhIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGJXLCBpbnQgblBiSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfY2Jfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpbmdsZU1DTEZsYWcsIGludCBwYXJ0X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lcmdlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IE12RmllbGQgbWVyZ2VjYW5kbGlzdFtdKQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjICAgPSBzLT5IRVZDbGM7CisgICAgUmVmUGljTGlzdCAqcmVmUGljTGlzdCA9IHMtPnJlZi0+cmVmUGljTGlzdDsKKyAgICBNdkZpZWxkICp0YWJfbXZmICAgICAgID0gcy0+cmVmLT50YWJfbXZmOworCisgICAgY29uc3QgaW50IG1pbl9wdV93aWR0aCA9IHMtPnNwcy0+bWluX3B1X3dpZHRoOworCisgICAgY29uc3QgaW50IGNhbmRfYm90dG9tX2xlZnQgPSBsYy0+bmEuY2FuZF9ib3R0b21fbGVmdDsKKyAgICBjb25zdCBpbnQgY2FuZF9sZWZ0ICAgICAgICA9IGxjLT5uYS5jYW5kX2xlZnQ7CisgICAgY29uc3QgaW50IGNhbmRfdXBfbGVmdCAgICAgPSBsYy0+bmEuY2FuZF91cF9sZWZ0OworICAgIGNvbnN0IGludCBjYW5kX3VwICAgICAgICAgID0gbGMtPm5hLmNhbmRfdXA7CisgICAgY29uc3QgaW50IGNhbmRfdXBfcmlnaHQgICAgPSBsYy0+bmEuY2FuZF91cF9yaWdodF9zYXA7CisKKyAgICBjb25zdCBpbnQgeEExICAgID0geDAgLSAxOworICAgIGNvbnN0IGludCB5QTEgICAgPSB5MCArIG5QYkggLSAxOworCisgICAgY29uc3QgaW50IHhCMSAgICA9IHgwICsgblBiVyAtIDE7CisgICAgY29uc3QgaW50IHlCMSAgICA9IHkwIC0gMTsKKworICAgIGNvbnN0IGludCB4QjAgICAgPSB4MCArIG5QYlc7CisgICAgY29uc3QgaW50IHlCMCAgICA9IHkwIC0gMTsKKworICAgIGNvbnN0IGludCB4QTAgICAgPSB4MCAtIDE7CisgICAgY29uc3QgaW50IHlBMCAgICA9IHkwICsgblBiSDsKKworICAgIGNvbnN0IGludCB4QjIgICAgPSB4MCAtIDE7CisgICAgY29uc3QgaW50IHlCMiAgICA9IHkwIC0gMTsKKworICAgIGNvbnN0IGludCBuYl9yZWZzID0gKHMtPnNoLnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgPworICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2gubmJfcmVmc1swXSA6IEZGTUlOKHMtPnNoLm5iX3JlZnNbMF0sIHMtPnNoLm5iX3JlZnNbMV0pOworCisgICAgaW50IHplcm9faWR4ID0gMDsKKworICAgIGludCBuYl9tZXJnZV9jYW5kID0gMDsKKyAgICBpbnQgbmJfb3JpZ19tZXJnZV9jYW5kID0gMDsKKworICAgIGludCBpc19hdmFpbGFibGVfYTA7CisgICAgaW50IGlzX2F2YWlsYWJsZV9hMTsKKyAgICBpbnQgaXNfYXZhaWxhYmxlX2IwOworICAgIGludCBpc19hdmFpbGFibGVfYjE7CisgICAgaW50IGlzX2F2YWlsYWJsZV9iMjsKKworCisgICAgaWYgKCFzaW5nbGVNQ0xGbGFnICYmIHBhcnRfaWR4ID09IDEgJiYKKyAgICAgICAgKGxjLT5jdS5wYXJ0X21vZGUgPT0gUEFSVF9OeDJOIHx8CisgICAgICAgICBsYy0+Y3UucGFydF9tb2RlID09IFBBUlRfbkx4Mk4gfHwKKyAgICAgICAgIGxjLT5jdS5wYXJ0X21vZGUgPT0gUEFSVF9uUngyTikgfHwKKyAgICAgICAgaXNfZGlmZl9tZXIocywgeEExLCB5QTEsIHgwLCB5MCkpIHsKKyAgICAgICAgaXNfYXZhaWxhYmxlX2ExID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpc19hdmFpbGFibGVfYTEgPSBBVkFJTEFCTEUoY2FuZF9sZWZ0LCBBMSk7CisgICAgICAgIGlmIChpc19hdmFpbGFibGVfYTEpIHsKKyAgICAgICAgICAgIG1lcmdlY2FuZGxpc3RbbmJfbWVyZ2VfY2FuZF0gPSBUQUJfTVZGX1BVKEExKTsKKyAgICAgICAgICAgIGlmIChtZXJnZV9pZHggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBuYl9tZXJnZV9jYW5kKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXNpbmdsZU1DTEZsYWcgJiYgcGFydF9pZHggPT0gMSAmJgorICAgICAgICAobGMtPmN1LnBhcnRfbW9kZSA9PSBQQVJUXzJOeE4gfHwKKyAgICAgICAgIGxjLT5jdS5wYXJ0X21vZGUgPT0gUEFSVF8yTnhuVSB8fAorICAgICAgICAgbGMtPmN1LnBhcnRfbW9kZSA9PSBQQVJUXzJOeG5EKSB8fAorICAgICAgICBpc19kaWZmX21lcihzLCB4QjEsIHlCMSwgeDAsIHkwKSkgeworICAgICAgICBpc19hdmFpbGFibGVfYjEgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlzX2F2YWlsYWJsZV9iMSA9IEFWQUlMQUJMRShjYW5kX3VwLCBCMSk7CisgICAgICAgIGlmIChpc19hdmFpbGFibGVfYjEgJiYKKyAgICAgICAgICAgICEoaXNfYXZhaWxhYmxlX2ExICYmIENPTVBBUkVfTVZfUkVGSURYKEIxLCBBMSkpKSB7CisgICAgICAgICAgICBtZXJnZWNhbmRsaXN0W25iX21lcmdlX2NhbmRdID0gVEFCX01WRl9QVShCMSk7CisgICAgICAgICAgICBpZiAobWVyZ2VfaWR4ID09IG5iX21lcmdlX2NhbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgbmJfbWVyZ2VfY2FuZCsrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWJvdmUgcmlnaHQgc3BhdGlhbCBtZXJnZSBjYW5kaWRhdGUKKyAgICBpc19hdmFpbGFibGVfYjAgPSBBVkFJTEFCTEUoY2FuZF91cF9yaWdodCwgQjApICYmCisgICAgICAgICAgICAgICAgICAgICAgeEIwIDwgcy0+c3BzLT53aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICAgIFBSRURfQkxPQ0tfQVZBSUxBQkxFKEIwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICFpc19kaWZmX21lcihzLCB4QjAsIHlCMCwgeDAsIHkwKTsKKworICAgIGlmIChpc19hdmFpbGFibGVfYjAgJiYKKyAgICAgICAgIShpc19hdmFpbGFibGVfYjEgJiYgQ09NUEFSRV9NVl9SRUZJRFgoQjAsIEIxKSkpIHsKKyAgICAgICAgbWVyZ2VjYW5kbGlzdFtuYl9tZXJnZV9jYW5kXSA9IFRBQl9NVkZfUFUoQjApOworICAgICAgICBpZiAobWVyZ2VfaWR4ID09IG5iX21lcmdlX2NhbmQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG5iX21lcmdlX2NhbmQrKzsKKyAgICB9CisKKyAgICAvLyBsZWZ0IGJvdHRvbSBzcGF0aWFsIG1lcmdlIGNhbmRpZGF0ZQorICAgIGlzX2F2YWlsYWJsZV9hMCA9IEFWQUlMQUJMRShjYW5kX2JvdHRvbV9sZWZ0LCBBMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICB5QTAgPCBzLT5zcHMtPmhlaWdodCAmJgorICAgICAgICAgICAgICAgICAgICAgIFBSRURfQkxPQ0tfQVZBSUxBQkxFKEEwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICFpc19kaWZmX21lcihzLCB4QTAsIHlBMCwgeDAsIHkwKTsKKworICAgIGlmIChpc19hdmFpbGFibGVfYTAgJiYKKyAgICAgICAgIShpc19hdmFpbGFibGVfYTEgJiYgQ09NUEFSRV9NVl9SRUZJRFgoQTAsIEExKSkpIHsKKyAgICAgICAgbWVyZ2VjYW5kbGlzdFtuYl9tZXJnZV9jYW5kXSA9IFRBQl9NVkZfUFUoQTApOworICAgICAgICBpZiAobWVyZ2VfaWR4ID09IG5iX21lcmdlX2NhbmQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG5iX21lcmdlX2NhbmQrKzsKKyAgICB9CisKKyAgICAvLyBhYm92ZSBsZWZ0IHNwYXRpYWwgbWVyZ2UgY2FuZGlkYXRlCisgICAgaXNfYXZhaWxhYmxlX2IyID0gQVZBSUxBQkxFKGNhbmRfdXBfbGVmdCwgQjIpICYmCisgICAgICAgICAgICAgICAgICAgICAgIWlzX2RpZmZfbWVyKHMsIHhCMiwgeUIyLCB4MCwgeTApOworCisgICAgaWYgKGlzX2F2YWlsYWJsZV9iMiAmJgorICAgICAgICAhKGlzX2F2YWlsYWJsZV9hMSAmJiBDT01QQVJFX01WX1JFRklEWChCMiwgQTEpKSAmJgorICAgICAgICAhKGlzX2F2YWlsYWJsZV9iMSAmJiBDT01QQVJFX01WX1JFRklEWChCMiwgQjEpKSAmJgorICAgICAgICBuYl9tZXJnZV9jYW5kICE9IDQpIHsKKyAgICAgICAgbWVyZ2VjYW5kbGlzdFtuYl9tZXJnZV9jYW5kXSA9IFRBQl9NVkZfUFUoQjIpOworICAgICAgICBpZiAobWVyZ2VfaWR4ID09IG5iX21lcmdlX2NhbmQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG5iX21lcmdlX2NhbmQrKzsKKyAgICB9CisKKyAgICAvLyB0ZW1wb3JhbCBtb3Rpb24gdmVjdG9yIGNhbmRpZGF0ZQorICAgIGlmIChzLT5zaC5zbGljZV90ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnICYmCisgICAgICAgIG5iX21lcmdlX2NhbmQgPCBzLT5zaC5tYXhfbnVtX21lcmdlX2NhbmQpIHsKKyAgICAgICAgTXYgbXZfbDBfY29sID0geyAwIH0sIG12X2wxX2NvbCA9IHsgMCB9OworICAgICAgICBpbnQgYXZhaWxhYmxlX2wwID0gdGVtcG9yYWxfbHVtYV9tb3Rpb25fdmVjdG9yKHMsIHgwLCB5MCwgblBiVywgblBiSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmbXZfbDBfY29sLCAwKTsKKyAgICAgICAgaW50IGF2YWlsYWJsZV9sMSA9IChzLT5zaC5zbGljZV90eXBlID09IEJfU0xJQ0UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsX2x1bWFfbW90aW9uX3ZlY3RvcihzLCB4MCwgeTAsIG5QYlcsIG5QYkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJm12X2wxX2NvbCwgMSkgOiAwOworCisgICAgICAgIGlmIChhdmFpbGFibGVfbDAgfHwgYXZhaWxhYmxlX2wxKSB7CisgICAgICAgICAgICBtZXJnZWNhbmRsaXN0W25iX21lcmdlX2NhbmRdLnByZWRfZmxhZyA9IGF2YWlsYWJsZV9sMCArIChhdmFpbGFibGVfbDEgPDwgMSk7CisgICAgICAgICAgICBBVl9aRVJPMTYobWVyZ2VjYW5kbGlzdFtuYl9tZXJnZV9jYW5kXS5yZWZfaWR4KTsKKyAgICAgICAgICAgIG1lcmdlY2FuZGxpc3RbbmJfbWVyZ2VfY2FuZF0ubXZbMF0gICAgICA9IG12X2wwX2NvbDsKKyAgICAgICAgICAgIG1lcmdlY2FuZGxpc3RbbmJfbWVyZ2VfY2FuZF0ubXZbMV0gICAgICA9IG12X2wxX2NvbDsKKworICAgICAgICAgICAgaWYgKG1lcmdlX2lkeCA9PSBuYl9tZXJnZV9jYW5kKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG5iX21lcmdlX2NhbmQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5iX29yaWdfbWVyZ2VfY2FuZCA9IG5iX21lcmdlX2NhbmQ7CisKKyAgICAvLyBjb21iaW5lZCBiaS1wcmVkaWN0aXZlIG1lcmdlIGNhbmRpZGF0ZXMgIChhcHBsaWVzIGZvciBCIHNsaWNlcykKKyAgICBpZiAocy0+c2guc2xpY2VfdHlwZSA9PSBCX1NMSUNFICYmIG5iX29yaWdfbWVyZ2VfY2FuZCA+IDEgJiYKKyAgICAgICAgbmJfb3JpZ19tZXJnZV9jYW5kIDwgcy0+c2gubWF4X251bV9tZXJnZV9jYW5kKSB7CisgICAgICAgIGludCBjb21iX2lkeCA9IDA7CisKKyAgICAgICAgZm9yIChjb21iX2lkeCA9IDA7IG5iX21lcmdlX2NhbmQgPCBzLT5zaC5tYXhfbnVtX21lcmdlX2NhbmQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJfaWR4IDwgbmJfb3JpZ19tZXJnZV9jYW5kICogKG5iX29yaWdfbWVyZ2VfY2FuZCAtIDEpOyBjb21iX2lkeCsrKSB7CisgICAgICAgICAgICBpbnQgbDBfY2FuZF9pZHggPSBsMF9sMV9jYW5kX2lkeFtjb21iX2lkeF1bMF07CisgICAgICAgICAgICBpbnQgbDFfY2FuZF9pZHggPSBsMF9sMV9jYW5kX2lkeFtjb21iX2lkeF1bMV07CisgICAgICAgICAgICBNdkZpZWxkIGwwX2NhbmQgPSBtZXJnZWNhbmRsaXN0W2wwX2NhbmRfaWR4XTsKKyAgICAgICAgICAgIE12RmllbGQgbDFfY2FuZCA9IG1lcmdlY2FuZGxpc3RbbDFfY2FuZF9pZHhdOworCisgICAgICAgICAgICBpZiAoKGwwX2NhbmQucHJlZF9mbGFnICYgUEZfTDApICYmIChsMV9jYW5kLnByZWRfZmxhZyAmIFBGX0wxKSAmJgorICAgICAgICAgICAgICAgIChyZWZQaWNMaXN0WzBdLmxpc3RbbDBfY2FuZC5yZWZfaWR4WzBdXSAhPQorICAgICAgICAgICAgICAgICByZWZQaWNMaXN0WzFdLmxpc3RbbDFfY2FuZC5yZWZfaWR4WzFdXSB8fAorICAgICAgICAgICAgICAgICBBVl9STjMyQSgmbDBfY2FuZC5tdlswXSkgIT0gQVZfUk4zMkEoJmwxX2NhbmQubXZbMV0pKSkgeworICAgICAgICAgICAgICAgIG1lcmdlY2FuZGxpc3RbbmJfbWVyZ2VfY2FuZF0ucmVmX2lkeFswXSAgID0gbDBfY2FuZC5yZWZfaWR4WzBdOworICAgICAgICAgICAgICAgIG1lcmdlY2FuZGxpc3RbbmJfbWVyZ2VfY2FuZF0ucmVmX2lkeFsxXSAgID0gbDFfY2FuZC5yZWZfaWR4WzFdOworICAgICAgICAgICAgICAgIG1lcmdlY2FuZGxpc3RbbmJfbWVyZ2VfY2FuZF0ucHJlZF9mbGFnICAgID0gUEZfQkk7CisgICAgICAgICAgICAgICAgQVZfQ09QWTMyKCZtZXJnZWNhbmRsaXN0W25iX21lcmdlX2NhbmRdLm12WzBdLCAmbDBfY2FuZC5tdlswXSk7CisgICAgICAgICAgICAgICAgQVZfQ09QWTMyKCZtZXJnZWNhbmRsaXN0W25iX21lcmdlX2NhbmRdLm12WzFdLCAmbDFfY2FuZC5tdlsxXSk7CisgICAgICAgICAgICAgICAgaWYgKG1lcmdlX2lkeCA9PSBuYl9tZXJnZV9jYW5kKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgbmJfbWVyZ2VfY2FuZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gYXBwZW5kIFplcm8gbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzCisgICAgd2hpbGUgKG5iX21lcmdlX2NhbmQgPCBzLT5zaC5tYXhfbnVtX21lcmdlX2NhbmQpIHsKKyAgICAgICAgbWVyZ2VjYW5kbGlzdFtuYl9tZXJnZV9jYW5kXS5wcmVkX2ZsYWcgICAgPSBQRl9MMCArICgocy0+c2guc2xpY2VfdHlwZSA9PSBCX1NMSUNFKSA8PCAxKTsKKyAgICAgICAgQVZfWkVSTzMyKG1lcmdlY2FuZGxpc3RbbmJfbWVyZ2VfY2FuZF0ubXYgKyAwKTsKKyAgICAgICAgQVZfWkVSTzMyKG1lcmdlY2FuZGxpc3RbbmJfbWVyZ2VfY2FuZF0ubXYgKyAxKTsKKyAgICAgICAgbWVyZ2VjYW5kbGlzdFtuYl9tZXJnZV9jYW5kXS5yZWZfaWR4WzBdICAgPSB6ZXJvX2lkeCA8IG5iX3JlZnMgPyB6ZXJvX2lkeCA6IDA7CisgICAgICAgIG1lcmdlY2FuZGxpc3RbbmJfbWVyZ2VfY2FuZF0ucmVmX2lkeFsxXSAgID0gemVyb19pZHggPCBuYl9yZWZzID8gemVyb19pZHggOiAwOworCisgICAgICAgIGlmIChtZXJnZV9pZHggPT0gbmJfbWVyZ2VfY2FuZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbmJfbWVyZ2VfY2FuZCsrOworICAgICAgICB6ZXJvX2lkeCsrOworICAgIH0KK30KKworLyoKKyAqIDguNS4zLjEuMSBEZXJpdmF0aW9uIHByb2Nlc3Mgb2YgbHVtYSBNdnMgZm9yIG1lcmdlIG1vZGUKKyAqLwordm9pZCBmZl9oZXZjX2x1bWFfbXZfbWVyZ2VfbW9kZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBuUGJXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBiSCwgaW50IGxvZzJfY2Jfc2l6ZSwgaW50IHBhcnRfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVyZ2VfaWR4LCBNdkZpZWxkICptdikKK3sKKyAgICBpbnQgc2luZ2xlTUNMRmxhZyA9IDA7CisgICAgaW50IG5DUyA9IDEgPDwgbG9nMl9jYl9zaXplOworICAgIExPQ0FMX0FMSUdORUQoNCwgTXZGaWVsZCwgbWVyZ2VjYW5kX2xpc3QsIFtNUkdfTUFYX05VTV9DQU5EU10pOworICAgIGludCBuUGJXMiA9IG5QYlc7CisgICAgaW50IG5QYkgyID0gblBiSDsKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKworICAgIGlmIChzLT5wcHMtPmxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWwgPiAyICYmIG5DUyA9PSA4KSB7CisgICAgICAgIHNpbmdsZU1DTEZsYWcgPSAxOworICAgICAgICB4MCAgICAgICAgICAgID0gbGMtPmN1Lng7CisgICAgICAgIHkwICAgICAgICAgICAgPSBsYy0+Y3UueTsKKyAgICAgICAgblBiVyAgICAgICAgICA9IG5DUzsKKyAgICAgICAgblBiSCAgICAgICAgICA9IG5DUzsKKyAgICAgICAgcGFydF9pZHggICAgICA9IDA7CisgICAgfQorCisgICAgZmZfaGV2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShzLCB4MCwgeTAsIG5QYlcsIG5QYkgpOworICAgIGRlcml2ZV9zcGF0aWFsX21lcmdlX2NhbmRpZGF0ZXMocywgeDAsIHkwLCBuUGJXLCBuUGJILCBsb2cyX2NiX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVNQ0xGbGFnLCBwYXJ0X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlX2lkeCwgbWVyZ2VjYW5kX2xpc3QpOworCisgICAgaWYgKG1lcmdlY2FuZF9saXN0W21lcmdlX2lkeF0ucHJlZF9mbGFnID09IFBGX0JJICYmCisgICAgICAgIChuUGJXMiArIG5QYkgyKSA9PSAxMikgeworICAgICAgICBtZXJnZWNhbmRfbGlzdFttZXJnZV9pZHhdLnByZWRfZmxhZyA9IFBGX0wwOworICAgIH0KKworICAgICptdiA9IG1lcmdlY2FuZF9saXN0W21lcmdlX2lkeF07Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZGlzdF9zY2FsZShIRVZDQ29udGV4dCAqcywgTXYgKm12LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5fcHVfd2lkdGgsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWxpc3QsIGludCByZWZfaWR4X2N1cnIsIGludCByZWZfaWR4KQoreworICAgIFJlZlBpY0xpc3QgKnJlZlBpY0xpc3QgPSBzLT5yZWYtPnJlZlBpY0xpc3Q7CisgICAgTXZGaWVsZCAqdGFiX212ZiAgICAgICA9IHMtPnJlZi0+dGFiX212ZjsKKyAgICBpbnQgcmVmX3BpY19lbGlzdCAgICAgID0gcmVmUGljTGlzdFtlbGlzdF0ubGlzdFtUQUJfTVZGKHgsIHkpLnJlZl9pZHhbZWxpc3RdXTsKKyAgICBpbnQgcmVmX3BpY19jdXJyICAgICAgID0gcmVmUGljTGlzdFtyZWZfaWR4X2N1cnJdLmxpc3RbcmVmX2lkeF07CisKKyAgICBpZiAocmVmX3BpY19lbGlzdCAhPSByZWZfcGljX2N1cnIpIHsKKyAgICAgICAgaW50IHBvY19kaWZmID0gcy0+cG9jIC0gcmVmX3BpY19lbGlzdDsKKyAgICAgICAgaWYgKCFwb2NfZGlmZikKKyAgICAgICAgICAgIHBvY19kaWZmID0gMTsKKyAgICAgICAgbXZfc2NhbGUobXYsIG12LCBwb2NfZGlmZiwgcy0+cG9jIC0gcmVmX3BpY19jdXJyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbXZfbXBfbW9kZV9teChIRVZDQ29udGV4dCAqcywgaW50IHgsIGludCB5LCBpbnQgcHJlZF9mbGFnX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIE12ICptdiwgaW50IHJlZl9pZHhfY3VyciwgaW50IHJlZl9pZHgpCit7CisgICAgTXZGaWVsZCAqdGFiX212ZiA9IHMtPnJlZi0+dGFiX212ZjsKKyAgICBpbnQgbWluX3B1X3dpZHRoID0gcy0+c3BzLT5taW5fcHVfd2lkdGg7CisKKyAgICBSZWZQaWNMaXN0ICpyZWZQaWNMaXN0ID0gcy0+cmVmLT5yZWZQaWNMaXN0OworCisgICAgaWYgKCgoVEFCX01WRih4LCB5KS5wcmVkX2ZsYWcpICYgKDEgPDwgcHJlZF9mbGFnX2luZGV4KSkgJiYKKyAgICAgICAgcmVmUGljTGlzdFtwcmVkX2ZsYWdfaW5kZXhdLmxpc3RbVEFCX01WRih4LCB5KS5yZWZfaWR4W3ByZWRfZmxhZ19pbmRleF1dID09IHJlZlBpY0xpc3RbcmVmX2lkeF9jdXJyXS5saXN0W3JlZl9pZHhdKSB7CisgICAgICAgICptdiA9IFRBQl9NVkYoeCwgeSkubXZbcHJlZF9mbGFnX2luZGV4XTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12X21wX21vZGVfbXhfbHQoSEVWQ0NvbnRleHQgKnMsIGludCB4LCBpbnQgeSwgaW50IHByZWRfZmxhZ19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdiAqbXYsIGludCByZWZfaWR4X2N1cnIsIGludCByZWZfaWR4KQoreworICAgIE12RmllbGQgKnRhYl9tdmYgPSBzLT5yZWYtPnRhYl9tdmY7CisgICAgaW50IG1pbl9wdV93aWR0aCA9IHMtPnNwcy0+bWluX3B1X3dpZHRoOworCisgICAgUmVmUGljTGlzdCAqcmVmUGljTGlzdCA9IHMtPnJlZi0+cmVmUGljTGlzdDsKKworICAgIGlmICgoVEFCX01WRih4LCB5KS5wcmVkX2ZsYWcpICYgKDEgPDwgcHJlZF9mbGFnX2luZGV4KSkgeworICAgICAgICBpbnQgY3VycklzTG9uZ1Rlcm0gICAgID0gcmVmUGljTGlzdFtyZWZfaWR4X2N1cnJdLmlzTG9uZ1Rlcm1bcmVmX2lkeF07CisKKyAgICAgICAgaW50IGNvbElzTG9uZ1Rlcm0gPQorICAgICAgICAgICAgcmVmUGljTGlzdFtwcmVkX2ZsYWdfaW5kZXhdLmlzTG9uZ1Rlcm1bKFRBQl9NVkYoeCwgeSkucmVmX2lkeFtwcmVkX2ZsYWdfaW5kZXhdKV07CisKKyAgICAgICAgaWYgKGNvbElzTG9uZ1Rlcm0gPT0gY3VycklzTG9uZ1Rlcm0pIHsKKyAgICAgICAgICAgICptdiA9IFRBQl9NVkYoeCwgeSkubXZbcHJlZF9mbGFnX2luZGV4XTsKKyAgICAgICAgICAgIGlmICghY3VycklzTG9uZ1Rlcm0pCisgICAgICAgICAgICAgICAgZGlzdF9zY2FsZShzLCBtdiwgbWluX3B1X3dpZHRoLCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZF9mbGFnX2luZGV4LCByZWZfaWR4X2N1cnIsIHJlZl9pZHgpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTVBfTVgodiwgcHJlZCwgbXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXZfbXBfbW9kZV9teChzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKHggIyMgdikgPj4gcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICh5ICMjIHYpID4+IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBwcmVkLCAmbXgsIHJlZl9pZHhfY3VyciwgcmVmX2lkeCkKKworI2RlZmluZSBNUF9NWF9MVCh2LCBwcmVkLCBteCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtdl9tcF9tb2RlX214X2x0KHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoeCAjIyB2KSA+PiBzLT5zcHMtPmxvZzJfbWluX3B1X3NpemUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKHkgIyMgdikgPj4gcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHByZWQsICZteCwgcmVmX2lkeF9jdXJyLCByZWZfaWR4KQorCit2b2lkIGZmX2hldmNfbHVtYV9tdl9tdnBfbW9kZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBuUGJXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYkgsIGludCBsb2cyX2NiX3NpemUsIGludCBwYXJ0X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXJnZV9pZHgsIE12RmllbGQgKm12LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG12cF9seF9mbGFnLCBpbnQgTFgpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgTXZGaWVsZCAqdGFiX212ZiA9IHMtPnJlZi0+dGFiX212ZjsKKyAgICBpbnQgaXNTY2FsZWRGbGFnX0wwID0gMDsKKyAgICBpbnQgYXZhaWxhYmxlRmxhZ0xYQTAgPSAxOworICAgIGludCBhdmFpbGFibGVGbGFnTFhCMCA9IDE7CisgICAgaW50IG51bU1WUENhbmRMWCA9IDA7CisgICAgaW50IG1pbl9wdV93aWR0aCA9IHMtPnNwcy0+bWluX3B1X3dpZHRoOworCisgICAgaW50IHhBMCwgeUEwOworICAgIGludCBpc19hdmFpbGFibGVfYTA7CisgICAgaW50IHhBMSwgeUExOworICAgIGludCBpc19hdmFpbGFibGVfYTE7CisgICAgaW50IHhCMCwgeUIwOworICAgIGludCBpc19hdmFpbGFibGVfYjA7CisgICAgaW50IHhCMSwgeUIxOworICAgIGludCBpc19hdmFpbGFibGVfYjE7CisgICAgaW50IHhCMiwgeUIyOworICAgIGludCBpc19hdmFpbGFibGVfYjI7CisKKyAgICBNdiBtdnBjYW5kX2xpc3RbMl0gPSB7IHsgMCB9IH07CisgICAgTXYgbXhBOworICAgIE12IG14QjsKKyAgICBpbnQgcmVmX2lkeF9jdXJyOworICAgIGludCByZWZfaWR4ID0gMDsKKyAgICBpbnQgcHJlZF9mbGFnX2luZGV4X2wwOworICAgIGludCBwcmVkX2ZsYWdfaW5kZXhfbDE7CisKKyAgICBjb25zdCBpbnQgY2FuZF9ib3R0b21fbGVmdCA9IGxjLT5uYS5jYW5kX2JvdHRvbV9sZWZ0OworICAgIGNvbnN0IGludCBjYW5kX2xlZnQgICAgICAgID0gbGMtPm5hLmNhbmRfbGVmdDsKKyAgICBjb25zdCBpbnQgY2FuZF91cF9sZWZ0ICAgICA9IGxjLT5uYS5jYW5kX3VwX2xlZnQ7CisgICAgY29uc3QgaW50IGNhbmRfdXAgICAgICAgICAgPSBsYy0+bmEuY2FuZF91cDsKKyAgICBjb25zdCBpbnQgY2FuZF91cF9yaWdodCAgICA9IGxjLT5uYS5jYW5kX3VwX3JpZ2h0X3NhcDsKKyAgICByZWZfaWR4X2N1cnIgICAgICAgPSBMWDsKKyAgICByZWZfaWR4ICAgICAgICAgICAgPSBtdi0+cmVmX2lkeFtMWF07CisgICAgcHJlZF9mbGFnX2luZGV4X2wwID0gTFg7CisgICAgcHJlZF9mbGFnX2luZGV4X2wxID0gIUxYOworCisgICAgLy8gbGVmdCBib3R0b20gc3BhdGlhbCBjYW5kaWRhdGUKKyAgICB4QTAgPSB4MCAtIDE7CisgICAgeUEwID0geTAgKyBuUGJIOworCisgICAgaXNfYXZhaWxhYmxlX2EwID0gQVZBSUxBQkxFKGNhbmRfYm90dG9tX2xlZnQsIEEwKSAmJgorICAgICAgICAgICAgICAgICAgICAgIHlBMCA8IHMtPnNwcy0+aGVpZ2h0ICYmCisgICAgICAgICAgICAgICAgICAgICAgUFJFRF9CTE9DS19BVkFJTEFCTEUoQTApOworCisgICAgLy9sZWZ0IHNwYXRpYWwgbWVyZ2UgY2FuZGlkYXRlCisgICAgeEExICAgID0geDAgLSAxOworICAgIHlBMSAgICA9IHkwICsgblBiSCAtIDE7CisKKyAgICBpc19hdmFpbGFibGVfYTEgPSBBVkFJTEFCTEUoY2FuZF9sZWZ0LCBBMSk7CisgICAgaWYgKGlzX2F2YWlsYWJsZV9hMCB8fCBpc19hdmFpbGFibGVfYTEpCisgICAgICAgIGlzU2NhbGVkRmxhZ19MMCA9IDE7CisKKyAgICBpZiAoaXNfYXZhaWxhYmxlX2EwKSB7CisgICAgICAgIGlmIChNUF9NWChBMCwgcHJlZF9mbGFnX2luZGV4X2wwLCBteEEpKSB7CisgICAgICAgICAgICBnb3RvIGJfY2FuZGlkYXRlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoTVBfTVgoQTAsIHByZWRfZmxhZ19pbmRleF9sMSwgbXhBKSkgeworICAgICAgICAgICAgZ290byBiX2NhbmRpZGF0ZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfYXZhaWxhYmxlX2ExKSB7CisgICAgICAgIGlmIChNUF9NWChBMSwgcHJlZF9mbGFnX2luZGV4X2wwLCBteEEpKSB7CisgICAgICAgICAgICBnb3RvIGJfY2FuZGlkYXRlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoTVBfTVgoQTEsIHByZWRfZmxhZ19pbmRleF9sMSwgbXhBKSkgeworICAgICAgICAgICAgZ290byBiX2NhbmRpZGF0ZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfYXZhaWxhYmxlX2EwKSB7CisgICAgICAgIGlmIChNUF9NWF9MVChBMCwgcHJlZF9mbGFnX2luZGV4X2wwLCBteEEpKSB7CisgICAgICAgICAgICBnb3RvIGJfY2FuZGlkYXRlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoTVBfTVhfTFQoQTAsIHByZWRfZmxhZ19pbmRleF9sMSwgbXhBKSkgeworICAgICAgICAgICAgZ290byBiX2NhbmRpZGF0ZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfYXZhaWxhYmxlX2ExKSB7CisgICAgICAgIGlmIChNUF9NWF9MVChBMSwgcHJlZF9mbGFnX2luZGV4X2wwLCBteEEpKSB7CisgICAgICAgICAgICBnb3RvIGJfY2FuZGlkYXRlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoTVBfTVhfTFQoQTEsIHByZWRfZmxhZ19pbmRleF9sMSwgbXhBKSkgeworICAgICAgICAgICAgZ290byBiX2NhbmRpZGF0ZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZhaWxhYmxlRmxhZ0xYQTAgPSAwOworCitiX2NhbmRpZGF0ZXM6CisgICAgLy8gQiBjYW5kaWRhdGVzCisgICAgLy8gYWJvdmUgcmlnaHQgc3BhdGlhbCBtZXJnZSBjYW5kaWRhdGUKKyAgICB4QjAgICAgPSB4MCArIG5QYlc7CisgICAgeUIwICAgID0geTAgLSAxOworCisgICAgaXNfYXZhaWxhYmxlX2IwID0gIEFWQUlMQUJMRShjYW5kX3VwX3JpZ2h0LCBCMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgeEIwIDwgcy0+c3BzLT53aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICBQUkVEX0JMT0NLX0FWQUlMQUJMRShCMCk7CisKKyAgICAvLyBhYm92ZSBzcGF0aWFsIG1lcmdlIGNhbmRpZGF0ZQorICAgIHhCMSAgICA9IHgwICsgblBiVyAtIDE7CisgICAgeUIxICAgID0geTAgLSAxOworICAgIGlzX2F2YWlsYWJsZV9iMSA9IEFWQUlMQUJMRShjYW5kX3VwLCBCMSk7CisKKyAgICAvLyBhYm92ZSBsZWZ0IHNwYXRpYWwgbWVyZ2UgY2FuZGlkYXRlCisgICAgeEIyID0geDAgLSAxOworICAgIHlCMiA9IHkwIC0gMTsKKyAgICBpc19hdmFpbGFibGVfYjIgPSBBVkFJTEFCTEUoY2FuZF91cF9sZWZ0LCBCMik7CisKKyAgICAvLyBhYm92ZSByaWdodCBzcGF0aWFsIG1lcmdlIGNhbmRpZGF0ZQorICAgIGlmIChpc19hdmFpbGFibGVfYjApIHsKKyAgICAgICAgaWYgKE1QX01YKEIwLCBwcmVkX2ZsYWdfaW5kZXhfbDAsIG14QikpIHsKKyAgICAgICAgICAgIGdvdG8gc2NhbGVmOworICAgICAgICB9CisgICAgICAgIGlmIChNUF9NWChCMCwgcHJlZF9mbGFnX2luZGV4X2wxLCBteEIpKSB7CisgICAgICAgICAgICBnb3RvIHNjYWxlZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFib3ZlIHNwYXRpYWwgbWVyZ2UgY2FuZGlkYXRlCisgICAgaWYgKGlzX2F2YWlsYWJsZV9iMSkgeworICAgICAgICBpZiAoTVBfTVgoQjEsIHByZWRfZmxhZ19pbmRleF9sMCwgbXhCKSkgeworICAgICAgICAgICAgZ290byBzY2FsZWY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE1QX01YKEIxLCBwcmVkX2ZsYWdfaW5kZXhfbDEsIG14QikpIHsKKyAgICAgICAgICAgIGdvdG8gc2NhbGVmOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWJvdmUgbGVmdCBzcGF0aWFsIG1lcmdlIGNhbmRpZGF0ZQorICAgIGlmIChpc19hdmFpbGFibGVfYjIpIHsKKyAgICAgICAgaWYgKE1QX01YKEIyLCBwcmVkX2ZsYWdfaW5kZXhfbDAsIG14QikpIHsKKyAgICAgICAgICAgIGdvdG8gc2NhbGVmOworICAgICAgICB9CisgICAgICAgIGlmIChNUF9NWChCMiwgcHJlZF9mbGFnX2luZGV4X2wxLCBteEIpKSB7CisgICAgICAgICAgICBnb3RvIHNjYWxlZjsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdmFpbGFibGVGbGFnTFhCMCA9IDA7CisKK3NjYWxlZjoKKyAgICBpZiAoIWlzU2NhbGVkRmxhZ19MMCkgeworICAgICAgICBpZiAoYXZhaWxhYmxlRmxhZ0xYQjApIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZUZsYWdMWEEwID0gMTsKKyAgICAgICAgICAgIG14QSA9IG14QjsKKyAgICAgICAgfQorICAgICAgICBhdmFpbGFibGVGbGFnTFhCMCA9IDA7CisKKyAgICAgICAgLy8gWEIwIGFuZCBMMQorICAgICAgICBpZiAoaXNfYXZhaWxhYmxlX2IwKSB7CisgICAgICAgICAgICBhdmFpbGFibGVGbGFnTFhCMCA9IE1QX01YX0xUKEIwLCBwcmVkX2ZsYWdfaW5kZXhfbDAsIG14Qik7CisgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUZsYWdMWEIwKQorICAgICAgICAgICAgICAgIGF2YWlsYWJsZUZsYWdMWEIwID0gTVBfTVhfTFQoQjAsIHByZWRfZmxhZ19pbmRleF9sMSwgbXhCKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc19hdmFpbGFibGVfYjEgJiYgIWF2YWlsYWJsZUZsYWdMWEIwKSB7CisgICAgICAgICAgICBhdmFpbGFibGVGbGFnTFhCMCA9IE1QX01YX0xUKEIxLCBwcmVkX2ZsYWdfaW5kZXhfbDAsIG14Qik7CisgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUZsYWdMWEIwKQorICAgICAgICAgICAgICAgIGF2YWlsYWJsZUZsYWdMWEIwID0gTVBfTVhfTFQoQjEsIHByZWRfZmxhZ19pbmRleF9sMSwgbXhCKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc19hdmFpbGFibGVfYjIgJiYgIWF2YWlsYWJsZUZsYWdMWEIwKSB7CisgICAgICAgICAgICBhdmFpbGFibGVGbGFnTFhCMCA9IE1QX01YX0xUKEIyLCBwcmVkX2ZsYWdfaW5kZXhfbDAsIG14Qik7CisgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUZsYWdMWEIwKQorICAgICAgICAgICAgICAgIGF2YWlsYWJsZUZsYWdMWEIwID0gTVBfTVhfTFQoQjIsIHByZWRfZmxhZ19pbmRleF9sMSwgbXhCKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdmFpbGFibGVGbGFnTFhBMCkKKyAgICAgICAgbXZwY2FuZF9saXN0W251bU1WUENhbmRMWCsrXSA9IG14QTsKKworICAgIGlmIChhdmFpbGFibGVGbGFnTFhCMCAmJiAoIWF2YWlsYWJsZUZsYWdMWEEwIHx8IG14QS54ICE9IG14Qi54IHx8IG14QS55ICE9IG14Qi55KSkKKyAgICAgICAgbXZwY2FuZF9saXN0W251bU1WUENhbmRMWCsrXSA9IG14QjsKKworICAgIC8vdGVtcG9yYWwgbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGNhbmRpZGF0ZQorICAgIGlmIChudW1NVlBDYW5kTFggPCAyICYmIHMtPnNoLnNsaWNlX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWcgJiYKKyAgICAgICAgbXZwX2x4X2ZsYWcgPT0gbnVtTVZQQ2FuZExYKSB7CisgICAgICAgIE12IG12X2NvbDsKKyAgICAgICAgaW50IGF2YWlsYWJsZV9jb2wgPSB0ZW1wb3JhbF9sdW1hX21vdGlvbl92ZWN0b3IocywgeDAsIHkwLCBuUGJXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGJILCByZWZfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXZfY29sLCBMWCk7CisgICAgICAgIGlmIChhdmFpbGFibGVfY29sKQorICAgICAgICAgICAgbXZwY2FuZF9saXN0W251bU1WUENhbmRMWCsrXSA9IG12X2NvbDsKKyAgICB9CisKKyAgICBtdi0+bXZbTFhdID0gbXZwY2FuZF9saXN0W212cF9seF9mbGFnXTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNfcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oZXZjX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGI5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oZXZjX3BhcnNlci5jCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogSEVWQyBBbm5leCBCIGZvcm1hdCBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIEd1aWxsYXVtZSBNYXJ0cmVzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJoZXZjLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisKKyNkZWZpbmUgU1RBUlRfQ09ERSAweDAwMDAwMSAvLy88IHN0YXJ0X2NvZGVfcHJlZml4X29uZV8zYnl0ZXMKKwordHlwZWRlZiBzdHJ1Y3QgSEVWQ1BhcnNlQ29udGV4dCB7CisgICAgSEVWQ0NvbnRleHQgIGg7CisgICAgUGFyc2VDb250ZXh0IHBjOworfSBIRVZDUGFyc2VDb250ZXh0OworCisvKioKKyAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZSBpbiB0aGUgYml0c3RyZWFtLgorICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQgZnJhbWUsIG9yIEVORF9OT1RfRk9VTkQKKyAqLworc3RhdGljIGludCBoZXZjX2ZpbmRfZnJhbWVfZW5kKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKQoreworICAgIGludCBpOworICAgIFBhcnNlQ29udGV4dCAqcGMgPSAmKChIRVZDUGFyc2VDb250ZXh0ICopcy0+cHJpdl9kYXRhKS0+cGM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykgeworICAgICAgICBpbnQgbnV0OworCisgICAgICAgIHBjLT5zdGF0ZTY0ID0gKHBjLT5zdGF0ZTY0IDw8IDgpIHwgYnVmW2ldOworCisgICAgICAgIGlmICgoKHBjLT5zdGF0ZTY0ID4+IDMgKiA4KSAmIDB4RkZGRkZGKSAhPSBTVEFSVF9DT0RFKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbnV0ID0gKHBjLT5zdGF0ZTY0ID4+IDIgKiA4ICsgMSkgJiAweDNGOworICAgICAgICAvLyBCZWdpbm5pbmcgb2YgYWNjZXNzIHVuaXQKKyAgICAgICAgaWYgKChudXQgPj0gTkFMX1ZQUyAmJiBudXQgPD0gTkFMX0FVRCkgfHwgbnV0ID09IE5BTF9TRUlfUFJFRklYIHx8CisgICAgICAgICAgICAobnV0ID49IDQxICYmIG51dCA8PSA0NCkgfHwgKG51dCA+PSA0OCAmJiBudXQgPD0gNTUpKSB7CisgICAgICAgICAgICBpZiAocGMtPmZyYW1lX3N0YXJ0X2ZvdW5kKSB7CisgICAgICAgICAgICAgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gaSAtIDU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobnV0IDw9IE5BTF9SQVNMX1IgfHwKKyAgICAgICAgICAgICAgICAgICAobnV0ID49IE5BTF9CTEFfV19MUCAmJiBudXQgPD0gTkFMX0NSQV9OVVQpKSB7CisgICAgICAgICAgICBpbnQgZmlyc3Rfc2xpY2Vfc2VnbWVudF9pbl9waWNfZmxhZyA9IGJ1ZltpXSA+PiA3OworICAgICAgICAgICAgaWYgKGZpcnN0X3NsaWNlX3NlZ21lbnRfaW5fcGljX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBjLT5mcmFtZV9zdGFydF9mb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIEZpcnN0IHNsaWNlIG9mIG5leHQgZnJhbWUgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSA1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFTkRfTk9UX0ZPVU5EOworfQorCisvKioKKyAqIFBhcnNlIE5BTCB1bml0cyBvZiBmb3VuZCBwaWN0dXJlIGFuZCBkZWNvZGUgc29tZSBiYXNpYyBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcGFyYW0gcyBwYXJzZXIgY29udGV4dC4KKyAqIEBwYXJhbSBhdmN0eCBjb2RlYyBjb250ZXh0LgorICogQHBhcmFtIGJ1ZiBidWZmZXIgd2l0aCBmaWVsZC9mcmFtZSBkYXRhLgorICogQHBhcmFtIGJ1Zl9zaXplIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcGFyc2VfbmFsX3VuaXRzKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgSEVWQ0NvbnRleHQgICAqaCAgPSAmKChIRVZDUGFyc2VDb250ZXh0ICopcy0+cHJpdl9kYXRhKS0+aDsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZoLT5IRVZDbGMtPmdiOworICAgIFNsaWNlSGVhZGVyICAgKnNoID0gJmgtPnNoOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBidWYgKyBidWZfc2l6ZTsKKyAgICBpbnQgc3RhdGUgPSAtMSwgaTsKKyAgICBIRVZDTkFMICpuYWw7CisKKyAgICAvKiBzZXQgc29tZSBzYW5lIGRlZmF1bHQgdmFsdWVzICovCisgICAgcy0+cGljdF90eXBlICAgICAgICAgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBzLT5rZXlfZnJhbWUgICAgICAgICA9IDA7CisgICAgcy0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9VTktOT1dOOworCisgICAgaC0+YXZjdHggPSBhdmN0eDsKKworICAgIGlmICghYnVmX3NpemUpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGgtPm5hbHNfYWxsb2NhdGVkIDwgMSkgeworICAgICAgICBIRVZDTkFMICp0bXAgPSBhdl9yZWFsbG9jX2FycmF5KGgtPm5hbHMsIDEsIHNpemVvZigqdG1wKSk7CisgICAgICAgIGlmICghdG1wKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaC0+bmFscyA9IHRtcDsKKyAgICAgICAgbWVtc2V0KGgtPm5hbHMsIDAsIHNpemVvZigqdG1wKSk7CisgICAgICAgIGgtPm5hbHNfYWxsb2NhdGVkID0gMTsKKyAgICB9CisKKyAgICBuYWwgPSAmaC0+bmFsc1swXTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHNyY19sZW5ndGgsIGNvbnN1bWVkOworICAgICAgICBidWYgPSBhdnByaXZfZmluZF9zdGFydF9jb2RlKGJ1ZiwgYnVmX2VuZCwgJnN0YXRlKTsKKyAgICAgICAgaWYgKC0tYnVmICsgMiA+PSBidWZfZW5kKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNyY19sZW5ndGggPSBidWZfZW5kIC0gYnVmOworCisgICAgICAgIGgtPm5hbF91bml0X3R5cGUgPSAoKmJ1ZiA+PiAxKSAmIDB4M2Y7CisgICAgICAgIGgtPnRlbXBvcmFsX2lkICAgPSAoKihidWYgKyAxKSAmIDB4MDcpIC0gMTsKKyAgICAgICAgaWYgKGgtPm5hbF91bml0X3R5cGUgPD0gTkFMX0NSQV9OVVQpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdCB3YWxrIHRoZSB3aG9sZSBidWZmZXIganVzdCB0byBkZWNvZGUgc2xpY2Ugc2VnbWVudCBoZWFkZXIKKyAgICAgICAgICAgIGlmIChzcmNfbGVuZ3RoID4gMjApCisgICAgICAgICAgICAgICAgc3JjX2xlbmd0aCA9IDIwOworICAgICAgICB9CisKKyAgICAgICAgY29uc3VtZWQgPSBmZl9oZXZjX2V4dHJhY3RfcmJzcChoLCBidWYsIHNyY19sZW5ndGgsIG5hbCk7CisgICAgICAgIGlmIChjb25zdW1lZCA8IDApCisgICAgICAgICAgICByZXR1cm4gY29uc3VtZWQ7CisKKyAgICAgICAgaW5pdF9nZXRfYml0czgoZ2IsIG5hbC0+ZGF0YSArIDIsIG5hbC0+c2l6ZSk7CisgICAgICAgIHN3aXRjaCAoaC0+bmFsX3VuaXRfdHlwZSkgeworICAgICAgICBjYXNlIE5BTF9WUFM6CisgICAgICAgICAgICBmZl9oZXZjX2RlY29kZV9uYWxfdnBzKGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkFMX1NQUzoKKyAgICAgICAgICAgIGZmX2hldmNfZGVjb2RlX25hbF9zcHMoaCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOQUxfUFBTOgorICAgICAgICAgICAgZmZfaGV2Y19kZWNvZGVfbmFsX3BwcyhoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5BTF9TRUlfUFJFRklYOgorICAgICAgICBjYXNlIE5BTF9TRUlfU1VGRklYOgorICAgICAgICAgICAgZmZfaGV2Y19kZWNvZGVfbmFsX3NlaShoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5BTF9UUkFJTF9OOgorICAgICAgICBjYXNlIE5BTF9UUkFJTF9SOgorICAgICAgICBjYXNlIE5BTF9UU0FfTjoKKyAgICAgICAgY2FzZSBOQUxfVFNBX1I6CisgICAgICAgIGNhc2UgTkFMX1NUU0FfTjoKKyAgICAgICAgY2FzZSBOQUxfU1RTQV9SOgorICAgICAgICBjYXNlIE5BTF9SQURMX046CisgICAgICAgIGNhc2UgTkFMX1JBRExfUjoKKyAgICAgICAgY2FzZSBOQUxfUkFTTF9OOgorICAgICAgICBjYXNlIE5BTF9SQVNMX1I6CisgICAgICAgIGNhc2UgTkFMX0JMQV9XX0xQOgorICAgICAgICBjYXNlIE5BTF9CTEFfV19SQURMOgorICAgICAgICBjYXNlIE5BTF9CTEFfTl9MUDoKKyAgICAgICAgY2FzZSBOQUxfSURSX1dfUkFETDoKKyAgICAgICAgY2FzZSBOQUxfSURSX05fTFA6CisgICAgICAgIGNhc2UgTkFMX0NSQV9OVVQ6CisgICAgICAgICAgICBzaC0+Zmlyc3Rfc2xpY2VfaW5fcGljX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgcy0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBoLT5waWN0dXJlX3N0cnVjdDsKKyAgICAgICAgICAgIHMtPmZpZWxkX29yZGVyID0gaC0+cGljdHVyZV9zdHJ1Y3Q7CisKKyAgICAgICAgICAgIGlmIChJU19JUkFQKGgpKSB7CisgICAgICAgICAgICAgICAgcy0+a2V5X2ZyYW1lID0gMTsKKyAgICAgICAgICAgICAgICBzaC0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNoLT5wcHNfaWQgPSBnZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgICAgIGlmIChzaC0+cHBzX2lkID49IE1BWF9QUFNfQ09VTlQgfHwgIWgtPnBwc19saXN0W3NoLT5wcHNfaWRdKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQUFMgaWQgb3V0IG9mIHJhbmdlOiAlZFxuIiwgc2gtPnBwc19pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoLT5wcHMgPSAoSEVWQ1BQUyopaC0+cHBzX2xpc3Rbc2gtPnBwc19pZF0tPmRhdGE7CisKKyAgICAgICAgICAgIGlmIChoLT5wcHMtPnNwc19pZCA+PSBNQVhfU1BTX0NPVU5UIHx8ICFoLT5zcHNfbGlzdFtoLT5wcHMtPnNwc19pZF0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlNQUyBpZCBvdXQgb2YgcmFuZ2U6ICVkXG4iLCBoLT5wcHMtPnNwc19pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaC0+c3BzICE9IChIRVZDU1BTKiloLT5zcHNfbGlzdFtoLT5wcHMtPnNwc19pZF0tPmRhdGEpIHsKKyAgICAgICAgICAgICAgICBoLT5zcHMgPSAoSEVWQ1NQUyopaC0+c3BzX2xpc3RbaC0+cHBzLT5zcHNfaWRdLT5kYXRhOworICAgICAgICAgICAgICAgIGgtPnZwcyA9IChIRVZDVlBTKiloLT52cHNfbGlzdFtoLT5zcHMtPnZwc19pZF0tPmRhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnKSB7CisgICAgICAgICAgICAgICAgaW50IHNsaWNlX2FkZHJlc3NfbGVuZ3RoOworCisgICAgICAgICAgICAgICAgaWYgKGgtPnBwcy0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRzX2VuYWJsZWRfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPSAwOworCisgICAgICAgICAgICAgICAgc2xpY2VfYWRkcmVzc19sZW5ndGggPSBhdl9jZWlsX2xvZzJfYyhoLT5zcHMtPmN0Yl93aWR0aCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5zcHMtPmN0Yl9oZWlnaHQpOworICAgICAgICAgICAgICAgIHNoLT5zbGljZV9zZWdtZW50X2FkZHIgPSBnZXRfYml0cyhnYiwgc2xpY2VfYWRkcmVzc19sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChzaC0+c2xpY2Vfc2VnbWVudF9hZGRyID49IGgtPnNwcy0+Y3RiX3dpZHRoICogaC0+c3BzLT5jdGJfaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzbGljZSBzZWdtZW50IGFkZHJlc3M6ICV1LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoLT5zbGljZV9zZWdtZW50X2FkZHIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBzaC0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZyA9IDA7CisKKyAgICAgICAgICAgIGlmIChzaC0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPnBwcy0+bnVtX2V4dHJhX3NsaWNlX2hlYWRlcl9iaXRzOyBpKyspCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxKTsgLy8gc2xpY2VfcmVzZXJ2ZWRfdW5kZXRlcm1pbmVkX2ZsYWdbXQorCisgICAgICAgICAgICBzaC0+c2xpY2VfdHlwZSA9IGdldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgaWYgKCEoc2gtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSB8fCBzaC0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFIHx8CisgICAgICAgICAgICAgICAgICBzaC0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBzbGljZSB0eXBlOiAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHNoLT5zbGljZV90eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnBpY3RfdHlwZSA9IHNoLT5zbGljZV90eXBlID09IEJfU0xJQ0UgPyBBVl9QSUNUVVJFX1RZUEVfQiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaC0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFID8gQVZfUElDVFVSRV9UWVBFX1AgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgICAgICAgICBpZiAoaC0+cHBzLT5vdXRwdXRfZmxhZ19wcmVzZW50X2ZsYWcpCisgICAgICAgICAgICAgICAgc2gtPnBpY19vdXRwdXRfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgICAgIGlmIChoLT5zcHMtPnNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnKQorICAgICAgICAgICAgICAgIHNoLT5jb2xvdXJfcGxhbmVfaWQgPSBnZXRfYml0cyhnYiwgMik7CisKKyAgICAgICAgICAgIGlmICghSVNfSURSKGgpKSB7CisgICAgICAgICAgICAgICAgc2gtPnBpY19vcmRlcl9jbnRfbHNiID0gZ2V0X2JpdHMoZ2IsIGgtPnNwcy0+bG9nMl9tYXhfcG9jX2xzYik7CisgICAgICAgICAgICAgICAgcy0+b3V0cHV0X3BpY3R1cmVfbnVtYmVyID0gaC0+cG9jID0gZmZfaGV2Y19jb21wdXRlX3BvYyhoLCBzaC0+cGljX29yZGVyX2NudF9sc2IpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcy0+b3V0cHV0X3BpY3R1cmVfbnVtYmVyID0gaC0+cG9jID0gMDsKKworICAgICAgICAgICAgaWYgKGgtPnRlbXBvcmFsX2lkID09IDAgJiYKKyAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9UUkFJTF9OICYmCisgICAgICAgICAgICAgICAgaC0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfVFNBX04gJiYKKyAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9TVFNBX04gJiYKKyAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9SQURMX04gJiYKKyAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9SQVNMX04gJiYKKyAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9SQURMX1IgJiYKKyAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9SQVNMX1IpCisgICAgICAgICAgICAgICAgaC0+cG9jVGlkMCA9IGgtPnBvYzsKKworICAgICAgICAgICAgcmV0dXJuIDA7IC8qIG5vIG5lZWQgdG8gZXZhbHVhdGUgdGhlIHJlc3QgKi8KKyAgICAgICAgfQorICAgICAgICBidWYgKz0gY29uc3VtZWQ7CisgICAgfQorICAgIC8qIGRpZG4ndCBmaW5kIGEgcGljdHVyZSEgKi8KKyAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1pc3NpbmcgcGljdHVyZSBpbiBhY2Nlc3MgdW5pdFxuIik7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGhldmNfcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgbmV4dDsKKyAgICBQYXJzZUNvbnRleHQgKnBjID0gJigoSEVWQ1BhcnNlQ29udGV4dCAqKXMtPnByaXZfZGF0YSktPnBjOworCisgICAgaWYgKHMtPmZsYWdzICYgUEFSU0VSX0ZMQUdfQ09NUExFVEVfRlJBTUVTKSB7CisgICAgICAgIG5leHQgPSBidWZfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXh0ID0gaGV2Y19maW5kX2ZyYW1lX2VuZChzLCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUocGMsIG5leHQsICZidWYsICZidWZfc2l6ZSkgPCAwKSB7CisgICAgICAgICAgICAqcG91dGJ1ZiAgICAgID0gTlVMTDsKKyAgICAgICAgICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgcGFyc2VfbmFsX3VuaXRzKHMsIGF2Y3R4LCBidWYsIGJ1Zl9zaXplKTsKKworICAgICpwb3V0YnVmICAgICAgPSBidWY7CisgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIHJldHVybiBuZXh0OworfQorCisvLyBTcGxpdCBhZnRlciB0aGUgcGFyYW1ldGVyIHNldHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtIGlmIHRoZXkgZXhpc3QuCitzdGF0aWMgaW50IGhldmNfc3BsaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50MzJfdCBzdGF0ZSA9IC0xOworICAgIGludCBoYXNfcHMgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgc3RhdGUgPSAoc3RhdGUgPDwgOCkgfCBidWZbaV07CisgICAgICAgIGlmICgoKHN0YXRlID4+IDgpICYgMHhGRkZGRkYpID09IFNUQVJUX0NPREUpIHsKKyAgICAgICAgICAgIGludCBudXQgPSAoc3RhdGUgPj4gMSkgJiAweDNGOworICAgICAgICAgICAgaWYgKG51dCA+PSBOQUxfVlBTICYmIG51dCA8PSBOQUxfUFBTKQorICAgICAgICAgICAgICAgIGhhc19wcyA9IDE7CisgICAgICAgICAgICBlbHNlIGlmIChoYXNfcHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSAzOworICAgICAgICAgICAgZWxzZSAvLyBubyBwYXJhbWV0ZXIgc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhldmNfaW5pdChBVkNvZGVjUGFyc2VyQ29udGV4dCAqcykKK3sKKyAgICBIRVZDQ29udGV4dCAgKmggID0gJigoSEVWQ1BhcnNlQ29udGV4dCAqKXMtPnByaXZfZGF0YSktPmg7CisgICAgaC0+SEVWQ2xjID0gYXZfbWFsbG9jeihzaXplb2YoSEVWQ0xvY2FsQ29udGV4dCkpOworICAgIGgtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemUgPSBJTlRfTUFYOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhldmNfY2xvc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisgICAgSEVWQ0NvbnRleHQgICpoICA9ICYoKEhFVkNQYXJzZUNvbnRleHQgKilzLT5wcml2X2RhdGEpLT5oOworICAgIFBhcnNlQ29udGV4dCAqcGMgPSAmKChIRVZDUGFyc2VDb250ZXh0ICopcy0+cHJpdl9kYXRhKS0+cGM7CisKKyAgICBhdl9mcmVlcCgmaC0+c2tpcHBlZF9ieXRlc19wb3MpOworICAgIGF2X2ZyZWVwKCZoLT5IRVZDbGMpOworICAgIGF2X2ZyZWVwKCZwYy0+YnVmZmVyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhoLT52cHNfbGlzdCk7IGkrKykKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZoLT52cHNfbGlzdFtpXSk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGgtPnNwc19saXN0KTsgaSsrKQorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmgtPnNwc19saXN0W2ldKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoaC0+cHBzX2xpc3QpOyBpKyspCisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmaC0+cHBzX2xpc3RbaV0pOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZoLT5jdXJyZW50X3Nwcyk7CisgICAgaC0+c3BzID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoLT5uYWxzX2FsbG9jYXRlZDsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmaC0+bmFsc1tpXS5yYnNwX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJmgtPm5hbHMpOworICAgIGgtPm5hbHNfYWxsb2NhdGVkID0gMDsKK30KKworQVZDb2RlY1BhcnNlciBmZl9oZXZjX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX0hFVkMgfSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSEVWQ1BhcnNlQ29udGV4dCksCisgICAgLnBhcnNlcl9pbml0ICAgID0gaGV2Y19pbml0LAorICAgIC5wYXJzZXJfcGFyc2UgICA9IGhldmNfcGFyc2UsCisgICAgLnBhcnNlcl9jbG9zZSAgID0gaGV2Y19jbG9zZSwKKyAgICAuc3BsaXQgICAgICAgICAgPSBoZXZjX3NwbGl0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNfcHMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNfcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjVlMTNmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Y19wcy5jCkBAIC0wLDAgKzEsMTUyOSBAQAorLyoKKyAqIEhFVkMgUGFyYW1ldGVyIFNldCBkZWNvZGluZworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIxMDMgR3VpbGxhdW1lIE1hcnRyZXMKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIxMDMgTWlja2FlbCBSYXVsZXQKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgR2lsZGFzIENvY2hlcmVsCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVml0dG9yaW8gR2lvdmFyYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaGV2Yy5oIgorCitzdGF0aWMgY29uc3QgdWludDhfdCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRyYVtdID0geworICAgIDE2LCAxNiwgMTYsIDE2LCAxNywgMTgsIDIxLCAyNCwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE5LCAyMiwgMjUsCisgICAgMTYsIDE2LCAxNywgMTgsIDIwLCAyMiwgMjUsIDI5LAorICAgIDE2LCAxNiwgMTgsIDIxLCAyNCwgMjcsIDMxLCAzNiwKKyAgICAxNywgMTcsIDIwLCAyNCwgMzAsIDM1LCA0MSwgNDcsCisgICAgMTgsIDE5LCAyMiwgMjcsIDM1LCA0NCwgNTQsIDY1LAorICAgIDIxLCAyMiwgMjUsIDMxLCA0MSwgNTQsIDcwLCA4OCwKKyAgICAyNCwgMjUsIDI5LCAzNiwgNDcsIDY1LCA4OCwgMTE1Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRlcltdID0geworICAgIDE2LCAxNiwgMTYsIDE2LCAxNywgMTgsIDIwLCAyNCwKKyAgICAxNiwgMTYsIDE2LCAxNywgMTgsIDIwLCAyNCwgMjUsCisgICAgMTYsIDE2LCAxNywgMTgsIDIwLCAyNCwgMjUsIDI4LAorICAgIDE2LCAxNywgMTgsIDIwLCAyNCwgMjUsIDI4LCAzMywKKyAgICAxNywgMTgsIDIwLCAyNCwgMjUsIDI4LCAzMywgNDEsCisgICAgMTgsIDIwLCAyNCwgMjUsIDI4LCAzMywgNDEsIDU0LAorICAgIDIwLCAyNCwgMjUsIDI4LCAzMywgNDEsIDU0LCA3MSwKKyAgICAyNCwgMjUsIDI4LCAzMywgNDEsIDU0LCA3MSwgOTEKK307CisKK3N0YXRpYyBjb25zdCBBVlJhdGlvbmFsIHZ1aV9zYXJbXSA9IHsKKyAgICB7ICAwLCAgIDEgfSwKKyAgICB7ICAxLCAgIDEgfSwKKyAgICB7IDEyLCAgMTEgfSwKKyAgICB7IDEwLCAgMTEgfSwKKyAgICB7IDE2LCAgMTEgfSwKKyAgICB7IDQwLCAgMzMgfSwKKyAgICB7IDI0LCAgMTEgfSwKKyAgICB7IDIwLCAgMTEgfSwKKyAgICB7IDMyLCAgMTEgfSwKKyAgICB7IDgwLCAgMzMgfSwKKyAgICB7IDE4LCAgMTEgfSwKKyAgICB7IDE1LCAgMTEgfSwKKyAgICB7IDY0LCAgMzMgfSwKKyAgICB7IDE2MCwgOTkgfSwKKyAgICB7ICA0LCAgIDMgfSwKKyAgICB7ICAzLCAgIDIgfSwKKyAgICB7ICAyLCAgIDEgfSwKK307CisKK2ludCBmZl9oZXZjX2RlY29kZV9zaG9ydF90ZXJtX3JwcyhIRVZDQ29udGV4dCAqcywgU2hvcnRUZXJtUlBTICpycHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEVWQ1NQUyAqc3BzLCBpbnQgaXNfc2xpY2VfaGVhZGVyKQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIHVpbnQ4X3QgcnBzX3ByZWRpY3QgPSAwOworICAgIGludCBkZWx0YV9wb2M7CisgICAgaW50IGswID0gMDsKKyAgICBpbnQgazEgPSAwOworICAgIGludCBrICA9IDA7CisgICAgaW50IGk7CisKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZsYy0+Z2I7CisKKyAgICBpZiAocnBzICE9IHNwcy0+c3RfcnBzICYmIHNwcy0+bmJfc3RfcnBzKQorICAgICAgICBycHNfcHJlZGljdCA9IGdldF9iaXRzMShnYik7CisKKyAgICBpZiAocnBzX3ByZWRpY3QpIHsKKyAgICAgICAgY29uc3QgU2hvcnRUZXJtUlBTICpycHNfcmlkeDsKKyAgICAgICAgaW50IGRlbHRhX3JwczsKKyAgICAgICAgdW5zaWduZWQgYWJzX2RlbHRhX3JwczsKKyAgICAgICAgdWludDhfdCB1c2VfZGVsdGFfZmxhZyA9IDA7CisgICAgICAgIHVpbnQ4X3QgZGVsdGFfcnBzX3NpZ247CisKKyAgICAgICAgaWYgKGlzX3NsaWNlX2hlYWRlcikgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlbHRhX2lkeCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworICAgICAgICAgICAgaWYgKGRlbHRhX2lkeCA+IHNwcy0+bmJfc3RfcnBzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIG9mIGRlbHRhX2lkeCBpbiBzbGljZSBoZWFkZXIgUlBTOiAlZCA+ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFfaWR4LCBzcHMtPm5iX3N0X3Jwcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBycHNfcmlkeCA9ICZzcHMtPnN0X3Jwc1tzcHMtPm5iX3N0X3JwcyAtIGRlbHRhX2lkeF07CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcnBzX3JpZHggPSAmc3BzLT5zdF9ycHNbcnBzIC0gc3BzLT5zdF9ycHMgLSAxXTsKKworICAgICAgICBkZWx0YV9ycHNfc2lnbiA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGFic19kZWx0YV9ycHMgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDE7CisgICAgICAgIGlmIChhYnNfZGVsdGFfcnBzIDwgMSB8fCBhYnNfZGVsdGFfcnBzID4gMzI3NjgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIG9mIGFic19kZWx0YV9ycHM6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGFic19kZWx0YV9ycHMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgZGVsdGFfcnBzICAgICAgPSAoMSAtIChkZWx0YV9ycHNfc2lnbiA8PCAxKSkgKiBhYnNfZGVsdGFfcnBzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IHJwc19yaWR4LT5udW1fZGVsdGFfcG9jczsgaSsrKSB7CisgICAgICAgICAgICBpbnQgdXNlZCA9IHJwcy0+dXNlZFtrXSA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgICAgIGlmICghdXNlZCkKKyAgICAgICAgICAgICAgICB1c2VfZGVsdGFfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgICAgIGlmICh1c2VkIHx8IHVzZV9kZWx0YV9mbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPCBycHNfcmlkeC0+bnVtX2RlbHRhX3BvY3MpCisgICAgICAgICAgICAgICAgICAgIGRlbHRhX3BvYyA9IGRlbHRhX3JwcyArIHJwc19yaWR4LT5kZWx0YV9wb2NbaV07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkZWx0YV9wb2MgPSBkZWx0YV9ycHM7CisgICAgICAgICAgICAgICAgcnBzLT5kZWx0YV9wb2Nba10gPSBkZWx0YV9wb2M7CisgICAgICAgICAgICAgICAgaWYgKGRlbHRhX3BvYyA8IDApCisgICAgICAgICAgICAgICAgICAgIGswKys7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBrMSsrOworICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJwcy0+bnVtX2RlbHRhX3BvY3MgICAgPSBrOworICAgICAgICBycHMtPm51bV9uZWdhdGl2ZV9waWNzID0gazA7CisgICAgICAgIC8vIHNvcnQgaW4gaW5jcmVhc2luZyBvcmRlciAoc21hbGxlc3QgZmlyc3QpCisgICAgICAgIGlmIChycHMtPm51bV9kZWx0YV9wb2NzICE9IDApIHsKKyAgICAgICAgICAgIGludCB1c2VkLCB0bXA7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcnBzLT5udW1fZGVsdGFfcG9jczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsdGFfcG9jID0gcnBzLT5kZWx0YV9wb2NbaV07CisgICAgICAgICAgICAgICAgdXNlZCAgICAgID0gcnBzLT51c2VkW2ldOworICAgICAgICAgICAgICAgIGZvciAoayA9IGkgLSAxOyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBycHMtPmRlbHRhX3BvY1trXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhX3BvYyA8IHRtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcnBzLT5kZWx0YV9wb2NbayArIDFdID0gdG1wOworICAgICAgICAgICAgICAgICAgICAgICAgcnBzLT51c2VkW2sgKyAxXSAgICAgID0gcnBzLT51c2VkW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgcnBzLT5kZWx0YV9wb2Nba10gICAgID0gZGVsdGFfcG9jOworICAgICAgICAgICAgICAgICAgICAgICAgcnBzLT51c2VkW2tdICAgICAgICAgID0gdXNlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKHJwcy0+bnVtX25lZ2F0aXZlX3BpY3MgPj4gMSkgIT0gMCkgeworICAgICAgICAgICAgaW50IHVzZWQ7CisgICAgICAgICAgICBrID0gcnBzLT5udW1fbmVnYXRpdmVfcGljcyAtIDE7CisgICAgICAgICAgICAvLyBmbGlwIHRoZSBuZWdhdGl2ZSB2YWx1ZXMgdG8gbGFyZ2VzdCBmaXJzdAorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJwcy0+bnVtX25lZ2F0aXZlX3BpY3MgPj4gMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsdGFfcG9jICAgICAgICAgPSBycHMtPmRlbHRhX3BvY1tpXTsKKyAgICAgICAgICAgICAgICB1c2VkICAgICAgICAgICAgICA9IHJwcy0+dXNlZFtpXTsKKyAgICAgICAgICAgICAgICBycHMtPmRlbHRhX3BvY1tpXSA9IHJwcy0+ZGVsdGFfcG9jW2tdOworICAgICAgICAgICAgICAgIHJwcy0+dXNlZFtpXSAgICAgID0gcnBzLT51c2VkW2tdOworICAgICAgICAgICAgICAgIHJwcy0+ZGVsdGFfcG9jW2tdID0gZGVsdGFfcG9jOworICAgICAgICAgICAgICAgIHJwcy0+dXNlZFtrXSAgICAgID0gdXNlZDsKKyAgICAgICAgICAgICAgICBrLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB1bnNpZ25lZCBpbnQgcHJldiwgbmJfcG9zaXRpdmVfcGljczsKKyAgICAgICAgcnBzLT5udW1fbmVnYXRpdmVfcGljcyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgICAgIG5iX3Bvc2l0aXZlX3BpY3MgICAgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCisgICAgICAgIGlmIChycHMtPm51bV9uZWdhdGl2ZV9waWNzID49IE1BWF9SRUZTIHx8CisgICAgICAgICAgICBuYl9wb3NpdGl2ZV9waWNzID49IE1BWF9SRUZTKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IHJlZnMgaW4gYSBzaG9ydCB0ZXJtIFJQUy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBycHMtPm51bV9kZWx0YV9wb2NzID0gcnBzLT5udW1fbmVnYXRpdmVfcGljcyArIG5iX3Bvc2l0aXZlX3BpY3M7CisgICAgICAgIGlmIChycHMtPm51bV9kZWx0YV9wb2NzKSB7CisgICAgICAgICAgICBwcmV2ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBycHMtPm51bV9uZWdhdGl2ZV9waWNzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZWx0YV9wb2MgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKKyAgICAgICAgICAgICAgICBwcmV2IC09IGRlbHRhX3BvYzsKKyAgICAgICAgICAgICAgICBycHMtPmRlbHRhX3BvY1tpXSA9IHByZXY7CisgICAgICAgICAgICAgICAgcnBzLT51c2VkW2ldICAgICAgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldiA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfcG9zaXRpdmVfcGljczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVsdGFfcG9jID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDE7CisgICAgICAgICAgICAgICAgcHJldiArPSBkZWx0YV9wb2M7CisgICAgICAgICAgICAgICAgcnBzLT5kZWx0YV9wb2NbcnBzLT5udW1fbmVnYXRpdmVfcGljcyArIGldID0gcHJldjsKKyAgICAgICAgICAgICAgICBycHMtPnVzZWRbcnBzLT5udW1fbmVnYXRpdmVfcGljcyArIGldICAgICAgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZGVjb2RlX3Byb2ZpbGVfdGllcl9sZXZlbChIRVZDQ29udGV4dCAqcywgUFRMQ29tbW9uICpwdGwpCit7CisgICAgaW50IGk7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmbGMtPmdiOworCisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgMisxKzUgKyAzMiArIDQgKyAxNiArIDE2ICsgMTIpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHB0bC0+cHJvZmlsZV9zcGFjZSA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICBwdGwtPnRpZXJfZmxhZyAgICAgPSBnZXRfYml0czEoZ2IpOworICAgIHB0bC0+cHJvZmlsZV9pZGMgICA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICBpZiAocHRsLT5wcm9maWxlX2lkYyA9PSBGRl9QUk9GSUxFX0hFVkNfTUFJTikKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJNYWluIHByb2ZpbGUgYml0c3RyZWFtXG4iKTsKKyAgICBlbHNlIGlmIChwdGwtPnByb2ZpbGVfaWRjID09IEZGX1BST0ZJTEVfSEVWQ19NQUlOXzEwKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIk1haW4gMTAgcHJvZmlsZSBiaXRzdHJlYW1cbiIpOworICAgIGVsc2UgaWYgKHB0bC0+cHJvZmlsZV9pZGMgPT0gRkZfUFJPRklMRV9IRVZDX01BSU5fU1RJTExfUElDVFVSRSkKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJNYWluIFN0aWxsIFBpY3R1cmUgcHJvZmlsZSBiaXRzdHJlYW1cbiIpOworICAgIGVsc2UgaWYgKHB0bC0+cHJvZmlsZV9pZGMgPT0gRkZfUFJPRklMRV9IRVZDX1JFWFQpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiUmFuZ2UgRXh0ZW5zaW9uIHByb2ZpbGUgYml0c3RyZWFtXG4iKTsKKyAgICBlbHNlCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIEhFVkMgcHJvZmlsZTogJWRcbiIsIHB0bC0+cHJvZmlsZV9pZGMpOworCisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisgICAgICAgIHB0bC0+cHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdbaV0gPSBnZXRfYml0czEoZ2IpOworICAgIHB0bC0+cHJvZ3Jlc3NpdmVfc291cmNlX2ZsYWcgICAgPSBnZXRfYml0czEoZ2IpOworICAgIHB0bC0+aW50ZXJsYWNlZF9zb3VyY2VfZmxhZyAgICAgPSBnZXRfYml0czEoZ2IpOworICAgIHB0bC0+bm9uX3BhY2tlZF9jb25zdHJhaW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIHB0bC0+ZnJhbWVfb25seV9jb25zdHJhaW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgc2tpcF9iaXRzKGdiLCAxNik7IC8vIFhYWF9yZXNlcnZlZF96ZXJvXzQ0Yml0c1swLi4xNV0KKyAgICBza2lwX2JpdHMoZ2IsIDE2KTsgLy8gWFhYX3Jlc2VydmVkX3plcm9fNDRiaXRzWzE2Li4zMV0KKyAgICBza2lwX2JpdHMoZ2IsIDEyKTsgLy8gWFhYX3Jlc2VydmVkX3plcm9fNDRiaXRzWzMyLi40M10KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3B0bChIRVZDQ29udGV4dCAqcywgUFRMICpwdGwsIGludCBtYXhfbnVtX3N1Yl9sYXllcnMpCit7CisgICAgaW50IGk7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmbGMtPmdiOworICAgIGlmIChkZWNvZGVfcHJvZmlsZV90aWVyX2xldmVsKHMsICZwdGwtPmdlbmVyYWxfcHRsKSA8IDAgfHwKKyAgICAgICAgZ2V0X2JpdHNfbGVmdChnYikgPCA4ICsgOCoyKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUFRMIGluZm9ybWF0aW9uIHRvbyBzaG9ydFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdGwtPmdlbmVyYWxfcHRsLmxldmVsX2lkYyA9IGdldF9iaXRzKGdiLCA4KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfbnVtX3N1Yl9sYXllcnMgLSAxOyBpKyspIHsKKyAgICAgICAgcHRsLT5zdWJfbGF5ZXJfcHJvZmlsZV9wcmVzZW50X2ZsYWdbaV0gPSBnZXRfYml0czEoZ2IpOworICAgICAgICBwdGwtPnN1Yl9sYXllcl9sZXZlbF9wcmVzZW50X2ZsYWdbaV0gICA9IGdldF9iaXRzMShnYik7CisgICAgfQorCisgICAgaWYgKG1heF9udW1fc3ViX2xheWVycyAtIDE+IDApCisgICAgICAgIGZvciAoaSA9IG1heF9udW1fc3ViX2xheWVycyAtIDE7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDIpOyAvLyByZXNlcnZlZF96ZXJvXzJiaXRzW2ldCisgICAgZm9yIChpID0gMDsgaSA8IG1heF9udW1fc3ViX2xheWVycyAtIDE7IGkrKykgeworICAgICAgICBpZiAocHRsLT5zdWJfbGF5ZXJfcHJvZmlsZV9wcmVzZW50X2ZsYWdbaV0gJiYKKyAgICAgICAgICAgIGRlY29kZV9wcm9maWxlX3RpZXJfbGV2ZWwocywgJnB0bC0+c3ViX2xheWVyX3B0bFtpXSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiUFRMIGluZm9ybWF0aW9uIGZvciBzdWJsYXllciAlaSB0b28gc2hvcnRcbiIsIGkpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChwdGwtPnN1Yl9sYXllcl9sZXZlbF9wcmVzZW50X2ZsYWdbaV0pIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggZGF0YSBmb3Igc3VibGF5ZXIgJWkgbGV2ZWxfaWRjXG4iLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBwdGwtPnN1Yl9sYXllcl9wdGxbaV0ubGV2ZWxfaWRjID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9zdWJsYXllcl9ocmQoSEVWQ0NvbnRleHQgKnMsIHVuc2lnbmVkIGludCBuYl9jcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJwaWNfcGFyYW1zX3ByZXNlbnQpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jcGI7IGkrKykgeworICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBiaXRfcmF0ZV92YWx1ZV9taW51czEKKyAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gY3BiX3NpemVfdmFsdWVfbWludXMxCisKKyAgICAgICAgaWYgKHN1YnBpY19wYXJhbXNfcHJlc2VudCkgeworICAgICAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gY3BiX3NpemVfZHVfdmFsdWVfbWludXMxCisgICAgICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBiaXRfcmF0ZV9kdV92YWx1ZV9taW51czEKKyAgICAgICAgfQorICAgICAgICBza2lwX2JpdHMxKGdiKTsgLy8gY2JyX2ZsYWcKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2hyZChIRVZDQ29udGV4dCAqcywgaW50IGNvbW1vbl9pbmZfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9zdWJsYXllcnMpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKKyAgICBpbnQgbmFsX3BhcmFtc19wcmVzZW50ID0gMCwgdmNsX3BhcmFtc19wcmVzZW50ID0gMDsKKyAgICBpbnQgc3VicGljX3BhcmFtc19wcmVzZW50ID0gMDsKKyAgICBpbnQgaTsKKworICAgIGlmIChjb21tb25faW5mX3ByZXNlbnQpIHsKKyAgICAgICAgbmFsX3BhcmFtc19wcmVzZW50ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgdmNsX3BhcmFtc19wcmVzZW50ID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICBpZiAobmFsX3BhcmFtc19wcmVzZW50IHx8IHZjbF9wYXJhbXNfcHJlc2VudCkgeworICAgICAgICAgICAgc3VicGljX3BhcmFtc19wcmVzZW50ID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICAgICAgaWYgKHN1YnBpY19wYXJhbXNfcHJlc2VudCkgeworICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgOCk7IC8vIHRpY2tfZGl2aXNvcl9taW51czIKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDUpOyAvLyBkdV9jcGJfcmVtb3ZhbF9kZWxheV9pbmNyZW1lbnRfbGVuZ3RoX21pbnVzMQorICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMSk7IC8vIHN1Yl9waWNfY3BiX3BhcmFtc19pbl9waWNfdGltaW5nX3NlaV9mbGFnCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA1KTsgLy8gZHBiX291dHB1dF9kZWxheV9kdV9sZW5ndGhfbWludXMxCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNCk7IC8vIGJpdF9yYXRlX3NjYWxlCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDQpOyAvLyBjcGJfc2l6ZV9zY2FsZQorCisgICAgICAgICAgICBpZiAoc3VicGljX3BhcmFtc19wcmVzZW50KQorICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNCk7ICAvLyBjcGJfc2l6ZV9kdV9zY2FsZQorCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDUpOyAvLyBpbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNSk7IC8vIGF1X2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNSk7IC8vIGRwYl9vdXRwdXRfZGVsYXlfbGVuZ3RoX21pbnVzMQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG1heF9zdWJsYXllcnM7IGkrKykgeworICAgICAgICBpbnQgbG93X2RlbGF5ID0gMDsKKyAgICAgICAgdW5zaWduZWQgaW50IG5iX2NwYiA9IDE7CisgICAgICAgIGludCBmaXhlZF9yYXRlID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICBpZiAoIWZpeGVkX3JhdGUpCisgICAgICAgICAgICBmaXhlZF9yYXRlID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICBpZiAoZml4ZWRfcmF0ZSkKKyAgICAgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7ICAvLyBlbGVtZW50YWxfZHVyYXRpb25faW5fdGNfbWludXMxCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvd19kZWxheSA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgaWYgKCFsb3dfZGVsYXkpIHsKKyAgICAgICAgICAgIG5iX2NwYiA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworICAgICAgICAgICAgaWYgKG5iX2NwYiA8IDEgfHwgbmJfY3BiID4gMzIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm5iX2NwYiAlZCBpbnZhbGlkXG4iLCBuYl9jcGIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbF9wYXJhbXNfcHJlc2VudCkKKyAgICAgICAgICAgIGRlY29kZV9zdWJsYXllcl9ocmQocywgbmJfY3BiLCBzdWJwaWNfcGFyYW1zX3ByZXNlbnQpOworICAgICAgICBpZiAodmNsX3BhcmFtc19wcmVzZW50KQorICAgICAgICAgICAgZGVjb2RlX3N1YmxheWVyX2hyZChzLCBuYl9jcGIsIHN1YnBpY19wYXJhbXNfcHJlc2VudCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgZmZfaGV2Y19kZWNvZGVfbmFsX3ZwcyhIRVZDQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaSxqOworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPkhFVkNsYy0+Z2I7CisgICAgaW50IHZwc19pZCA9IDA7CisgICAgSEVWQ1ZQUyAqdnBzOworICAgIEFWQnVmZmVyUmVmICp2cHNfYnVmID0gYXZfYnVmZmVyX2FsbG9jeihzaXplb2YoKnZwcykpOworCisgICAgaWYgKCF2cHNfYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHZwcyA9IChIRVZDVlBTKil2cHNfYnVmLT5kYXRhOworCisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJEZWNvZGluZyBWUFNcbiIpOworCisgICAgdnBzX2lkID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgIGlmICh2cHNfaWQgPj0gTUFYX1ZQU19DT1VOVCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlZQUyBpZCBvdXQgb2YgcmFuZ2U6ICVkXG4iLCB2cHNfaWQpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHMoZ2IsIDIpICE9IDMpIHsgLy8gdnBzX3Jlc2VydmVkX3RocmVlXzJiaXRzCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidnBzX3Jlc2VydmVkX3RocmVlXzJiaXRzIGlzIG5vdCB0aHJlZVxuIik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIHZwcy0+dnBzX21heF9sYXllcnMgICAgICAgICAgICAgICA9IGdldF9iaXRzKGdiLCA2KSArIDE7CisgICAgdnBzLT52cHNfbWF4X3N1Yl9sYXllcnMgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDMpICsgMTsKKyAgICB2cHMtPnZwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgaWYgKGdldF9iaXRzKGdiLCAxNikgIT0gMHhmZmZmKSB7IC8vIHZwc19yZXNlcnZlZF9mZmZmXzE2Yml0cworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInZwc19yZXNlcnZlZF9mZmZmXzE2Yml0cyBpcyBub3QgMHhmZmZmXG4iKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKHZwcy0+dnBzX21heF9zdWJfbGF5ZXJzID4gTUFYX1NVQl9MQVlFUlMpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ2cHNfbWF4X3N1Yl9sYXllcnMgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHZwcy0+dnBzX21heF9zdWJfbGF5ZXJzKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKHBhcnNlX3B0bChzLCAmdnBzLT5wdGwsIHZwcy0+dnBzX21heF9zdWJfbGF5ZXJzKSA8IDApCisgICAgICAgIGdvdG8gZXJyOworCisgICAgdnBzLT52cHNfc3ViX2xheWVyX29yZGVyaW5nX2luZm9fcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIGkgPSB2cHMtPnZwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWcgPyAwIDogdnBzLT52cHNfbWF4X3N1Yl9sYXllcnMgLSAxOworICAgIGZvciAoOyBpIDwgdnBzLT52cHNfbWF4X3N1Yl9sYXllcnM7IGkrKykgeworICAgICAgICB2cHMtPnZwc19tYXhfZGVjX3BpY19idWZmZXJpbmdbaV0gPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKKyAgICAgICAgdnBzLT52cHNfbnVtX3Jlb3JkZXJfcGljc1tpXSAgICAgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgdnBzLT52cHNfbWF4X2xhdGVuY3lfaW5jcmVhc2VbaV0gID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAtIDE7CisKKyAgICAgICAgaWYgKHZwcy0+dnBzX21heF9kZWNfcGljX2J1ZmZlcmluZ1tpXSA+IE1BWF9EUEJfU0laRSB8fCAhdnBzLT52cHNfbWF4X2RlY19waWNfYnVmZmVyaW5nW2ldKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInZwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxIG91dCBvZiByYW5nZTogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgdnBzLT52cHNfbWF4X2RlY19waWNfYnVmZmVyaW5nW2ldIC0gMSk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAodnBzLT52cHNfbnVtX3Jlb3JkZXJfcGljc1tpXSA+IHZwcy0+dnBzX21heF9kZWNfcGljX2J1ZmZlcmluZ1tpXSAtIDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJ2cHNfbWF4X251bV9yZW9yZGVyX3BpY3Mgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICB2cHMtPnZwc19udW1fcmVvcmRlcl9waWNzW2ldKTsKKyAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZwcy0+dnBzX21heF9sYXllcl9pZCAgID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgIHZwcy0+dnBzX251bV9sYXllcl9zZXRzID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDE7CisgICAgaWYgKCh2cHMtPnZwc19udW1fbGF5ZXJfc2V0cyAtIDFMTCkgKiAodnBzLT52cHNfbWF4X2xheWVyX2lkICsgMUxMKSA+IGdldF9iaXRzX2xlZnQoZ2IpKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIG1hbnkgbGF5ZXJfaWRfaW5jbHVkZWRfZmxhZ3NcbiIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgdnBzLT52cHNfbnVtX2xheWVyX3NldHM7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8PSB2cHMtPnZwc19tYXhfbGF5ZXJfaWQ7IGorKykKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMSk7ICAvLyBsYXllcl9pZF9pbmNsdWRlZF9mbGFnW2ldW2pdCisKKyAgICB2cHMtPnZwc190aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIGlmICh2cHMtPnZwc190aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgdnBzLT52cHNfbnVtX3VuaXRzX2luX3RpY2sgICAgICAgICAgICAgICA9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKKyAgICAgICAgdnBzLT52cHNfdGltZV9zY2FsZSAgICAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKKyAgICAgICAgdnBzLT52cHNfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGlmICh2cHMtPnZwc19wb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnKQorICAgICAgICAgICAgdnBzLT52cHNfbnVtX3RpY2tzX3BvY19kaWZmX29uZSA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworICAgICAgICB2cHMtPnZwc19udW1faHJkX3BhcmFtZXRlcnMgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdnBzLT52cHNfbnVtX2hyZF9wYXJhbWV0ZXJzOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjb21tb25faW5mX3ByZXNlbnQgPSAxOworCisgICAgICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBocmRfbGF5ZXJfc2V0X2lkeAorICAgICAgICAgICAgaWYgKGkpCisgICAgICAgICAgICAgICAgY29tbW9uX2luZl9wcmVzZW50ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGRlY29kZV9ocmQocywgY29tbW9uX2luZl9wcmVzZW50LCB2cHMtPnZwc19tYXhfc3ViX2xheWVycyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZ2V0X2JpdHMxKGdiKTsgLyogdnBzX2V4dGVuc2lvbl9mbGFnICovCisKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk92ZXJyZWFkIFZQUyBieSAlZCBiaXRzXG4iLCAtZ2V0X2JpdHNfbGVmdChnYikpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJnMtPnZwc19saXN0W3Zwc19pZF0pOworICAgIHMtPnZwc19saXN0W3Zwc19pZF0gPSB2cHNfYnVmOworICAgIHJldHVybiAwOworCitlcnI6CisgICAgYXZfYnVmZmVyX3VucmVmKCZ2cHNfYnVmKTsKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3Z1aShIRVZDQ29udGV4dCAqcywgSEVWQ1NQUyAqc3BzKQoreworICAgIFZVSSAqdnVpICAgICAgICAgID0gJnNwcy0+dnVpOworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPkhFVkNsYy0+Z2I7CisgICAgR2V0Qml0Q29udGV4dCBiYWNrdXA7CisgICAgaW50IHNhcl9wcmVzZW50LCBhbHQgPSAwOworCisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJEZWNvZGluZyBWVUlcbiIpOworCisgICAgc2FyX3ByZXNlbnQgPSBnZXRfYml0czEoZ2IpOworICAgIGlmIChzYXJfcHJlc2VudCkgeworICAgICAgICB1aW50OF90IHNhcl9pZHggPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIGlmIChzYXJfaWR4IDwgRkZfQVJSQVlfRUxFTVModnVpX3NhcikpCisgICAgICAgICAgICB2dWktPnNhciA9IHZ1aV9zYXJbc2FyX2lkeF07CisgICAgICAgIGVsc2UgaWYgKHNhcl9pZHggPT0gMjU1KSB7CisgICAgICAgICAgICB2dWktPnNhci5udW0gPSBnZXRfYml0cyhnYiwgMTYpOworICAgICAgICAgICAgdnVpLT5zYXIuZGVuID0gZ2V0X2JpdHMoZ2IsIDE2KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJVbmtub3duIFNBUiBpbmRleDogJXUuXG4iLCBzYXJfaWR4KTsKKyAgICB9CisKKyAgICB2dWktPm92ZXJzY2FuX2luZm9fcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAodnVpLT5vdmVyc2Nhbl9pbmZvX3ByZXNlbnRfZmxhZykKKyAgICAgICAgdnVpLT5vdmVyc2Nhbl9hcHByb3ByaWF0ZV9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIHZ1aS0+dmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAodnVpLT52aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgdnVpLT52aWRlb19mb3JtYXQgICAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICB2dWktPnZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyAgICAgICAgICAgPSBnZXRfYml0czEoZ2IpOworICAgICAgICB2dWktPmNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICBpZiAodnVpLT52aWRlb19mdWxsX3JhbmdlX2ZsYWcgJiYgc3BzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkKKyAgICAgICAgICAgIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWSjQyMFA7CisgICAgICAgIGlmICh2dWktPmNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgICAgIHZ1aS0+Y29sb3VyX3ByaW1hcmllcyAgICAgICAgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICB2dWktPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgdnVpLT5tYXRyaXhfY29lZmZzICAgICAgICAgICA9IGdldF9iaXRzKGdiLCA4KTsKKworICAgICAgICAgICAgLy8gU2V0IGludmFsaWQgdmFsdWVzIHRvICJ1bnNwZWNpZmllZCIKKyAgICAgICAgICAgIGlmICh2dWktPmNvbG91cl9wcmltYXJpZXMgPj0gQVZDT0xfUFJJX05CKQorICAgICAgICAgICAgICAgIHZ1aS0+Y29sb3VyX3ByaW1hcmllcyA9IEFWQ09MX1BSSV9VTlNQRUNJRklFRDsKKyAgICAgICAgICAgIGlmICh2dWktPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljID49IEFWQ09MX1RSQ19OQikKKyAgICAgICAgICAgICAgICB2dWktPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljID0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEOworICAgICAgICAgICAgaWYgKHZ1aS0+bWF0cml4X2NvZWZmcyA+PSBBVkNPTF9TUENfTkIpCisgICAgICAgICAgICAgICAgdnVpLT5tYXRyaXhfY29lZmZzID0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgfQorCisgICAgdnVpLT5jaHJvbWFfbG9jX2luZm9fcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAodnVpLT5jaHJvbWFfbG9jX2luZm9fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIHZ1aS0+Y2hyb21hX3NhbXBsZV9sb2NfdHlwZV90b3BfZmllbGQgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgICAgICB2dWktPmNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICB9CisKKyAgICB2dWktPm5ldXRyYV9jaHJvbWFfaW5kaWNhdGlvbl9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB2dWktPmZpZWxkX3NlcV9mbGFnICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB2dWktPmZyYW1lX2ZpZWxkX2luZm9fcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA+PSA2OCAmJiBzaG93X2JpdHNfbG9uZyhnYiwgMjEpID09IDB4MTAwMDAwKSB7CisgICAgICAgIHZ1aS0+ZGVmYXVsdF9kaXNwbGF5X3dpbmRvd19mbGFnID0gMDsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgZGVmYXVsdCBkaXNwbGF5IHdpbmRvd1xuIik7CisgICAgfSBlbHNlCisgICAgICAgIHZ1aS0+ZGVmYXVsdF9kaXNwbGF5X3dpbmRvd19mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAvLyBCYWNrdXAgY29udGV4dCBpbiBjYXNlIGFuIGFsdGVybmF0ZSBoZWFkZXIgaXMgZGV0ZWN0ZWQKKyAgICBtZW1jcHkoJmJhY2t1cCwgZ2IsIHNpemVvZihiYWNrdXApKTsKKworICAgIGlmICh2dWktPmRlZmF1bHRfZGlzcGxheV93aW5kb3dfZmxhZykgeworICAgICAgICAvL1RPRE86ICogMiBpcyBvbmx5IHZhbGlkIGZvciA0MjAKKyAgICAgICAgdnVpLT5kZWZfZGlzcF93aW4ubGVmdF9vZmZzZXQgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiAyOworICAgICAgICB2dWktPmRlZl9kaXNwX3dpbi5yaWdodF9vZmZzZXQgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAqIDI7CisgICAgICAgIHZ1aS0+ZGVmX2Rpc3Bfd2luLnRvcF9vZmZzZXQgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICogMjsKKyAgICAgICAgdnVpLT5kZWZfZGlzcF93aW4uYm90dG9tX29mZnNldCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiAyOworCisgICAgICAgIGlmIChzLT5hcHBseV9kZWZkaXNwd2luICYmCisgICAgICAgICAgICBzLT5hdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfSUdOT1JFX0NST1ApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJkaXNjYXJkaW5nIHZ1aSBkZWZhdWx0IGRpc3BsYXkgd2luZG93LCAiCisgICAgICAgICAgICAgICAgICAgIm9yaWdpbmFsIHZhbHVlcyBhcmUgbDoldSByOiV1IHQ6JXUgYjoldVxuIiwKKyAgICAgICAgICAgICAgICAgICB2dWktPmRlZl9kaXNwX3dpbi5sZWZ0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICB2dWktPmRlZl9kaXNwX3dpbi5yaWdodF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgdnVpLT5kZWZfZGlzcF93aW4udG9wX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICB2dWktPmRlZl9kaXNwX3dpbi5ib3R0b21fb2Zmc2V0KTsKKworICAgICAgICAgICAgdnVpLT5kZWZfZGlzcF93aW4ubGVmdF9vZmZzZXQgICA9CisgICAgICAgICAgICB2dWktPmRlZl9kaXNwX3dpbi5yaWdodF9vZmZzZXQgID0KKyAgICAgICAgICAgIHZ1aS0+ZGVmX2Rpc3Bfd2luLnRvcF9vZmZzZXQgICAgPQorICAgICAgICAgICAgdnVpLT5kZWZfZGlzcF93aW4uYm90dG9tX29mZnNldCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2dWktPnZ1aV90aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgaWYgKHZ1aS0+dnVpX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZykgeworICAgICAgICBpZiggZ2V0X2JpdHNfbGVmdChnYikgPCA2NikgeworICAgICAgICAgICAgLy8gVGhlIGFsdGVybmF0ZSBzeW50YXggc2VlbSB0byBoYXZlIHRpbWluZyBpbmZvIGxvY2F0ZWQKKyAgICAgICAgICAgIC8vIGF0IHdoZXJlIGRlZl9kaXNwX3dpbiBpcyBub3JtYWxseSBsb2NhdGVkCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJTdHJhbmdlIFZVSSB0aW1pbmcgaW5mb3JtYXRpb24sIHJldHJ5aW5nLi4uXG4iKTsKKyAgICAgICAgICAgIHZ1aS0+ZGVmYXVsdF9kaXNwbGF5X3dpbmRvd19mbGFnID0gMDsKKyAgICAgICAgICAgIG1lbXNldCgmdnVpLT5kZWZfZGlzcF93aW4sIDAsIHNpemVvZih2dWktPmRlZl9kaXNwX3dpbikpOworICAgICAgICAgICAgbWVtY3B5KGdiLCAmYmFja3VwLCBzaXplb2YoYmFja3VwKSk7CisgICAgICAgICAgICBhbHQgPSAxOworICAgICAgICB9CisgICAgICAgIHZ1aS0+dnVpX251bV91bml0c19pbl90aWNrICAgICAgICAgICAgICAgPSBnZXRfYml0c19sb25nKGdiLCAzMik7CisgICAgICAgIHZ1aS0+dnVpX3RpbWVfc2NhbGUgICAgICAgICAgICAgICAgICAgICAgPSBnZXRfYml0c19sb25nKGdiLCAzMik7CisgICAgICAgIGlmIChhbHQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJSZXRyeSBnb3QgJWkvJWkgZnBzXG4iLAorICAgICAgICAgICAgICAgICAgIHZ1aS0+dnVpX3RpbWVfc2NhbGUsIHZ1aS0+dnVpX251bV91bml0c19pbl90aWNrKTsKKyAgICAgICAgfQorICAgICAgICB2dWktPnZ1aV9wb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKHZ1aS0+dnVpX3BvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWcpCisgICAgICAgICAgICB2dWktPnZ1aV9udW1fdGlja3NfcG9jX2RpZmZfb25lX21pbnVzMSA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgICAgIHZ1aS0+dnVpX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGlmICh2dWktPnZ1aV9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgICAgICBkZWNvZGVfaHJkKHMsIDEsIHNwcy0+bWF4X3N1Yl9sYXllcnMpOworICAgIH0KKworICAgIHZ1aS0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIGlmICh2dWktPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnKSB7CisgICAgICAgIHZ1aS0+dGlsZXNfZml4ZWRfc3RydWN0dXJlX2ZsYWcgICAgICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgdnVpLT5tb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICB2dWktPnJlc3RyaWN0ZWRfcmVmX3BpY19saXN0c19mbGFnICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CisgICAgICAgIHZ1aS0+bWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYyAgICAgICAgICAgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgdnVpLT5tYXhfYnl0ZXNfcGVyX3BpY19kZW5vbSAgICAgICAgICAgICAgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgICAgICB2dWktPm1heF9iaXRzX3Blcl9taW5fY3VfZGVub20gICAgICAgICAgICAgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgICAgIHZ1aS0+bG9nMl9tYXhfbXZfbGVuZ3RoX2hvcml6b250YWwgICAgICAgICAgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgdnVpLT5sb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwgICAgICAgICAgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfc2NhbGluZ19saXN0X2RhdGEoU2NhbGluZ0xpc3QgKnNsKQoreworICAgIGludCBtYXRyaXhJZDsKKworICAgIGZvciAobWF0cml4SWQgPSAwOyBtYXRyaXhJZCA8IDY7IG1hdHJpeElkKyspIHsKKyAgICAgICAgLy8gNHg0IGRlZmF1bHQgaXMgMTYKKyAgICAgICAgbWVtc2V0KHNsLT5zbFswXVttYXRyaXhJZF0sIDE2LCAxNik7CisgICAgICAgIHNsLT5zbF9kY1swXVttYXRyaXhJZF0gPSAxNjsgLy8gZGVmYXVsdCBmb3IgMTZ4MTYKKyAgICAgICAgc2wtPnNsX2RjWzFdW21hdHJpeElkXSA9IDE2OyAvLyBkZWZhdWx0IGZvciAzMngzMgorICAgIH0KKyAgICBtZW1jcHkoc2wtPnNsWzFdWzBdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRyYSwgNjQpOworICAgIG1lbWNweShzbC0+c2xbMV1bMV0sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludHJhLCA2NCk7CisgICAgbWVtY3B5KHNsLT5zbFsxXVsyXSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50cmEsIDY0KTsKKyAgICBtZW1jcHkoc2wtPnNsWzFdWzNdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRlciwgNjQpOworICAgIG1lbWNweShzbC0+c2xbMV1bNF0sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludGVyLCA2NCk7CisgICAgbWVtY3B5KHNsLT5zbFsxXVs1XSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50ZXIsIDY0KTsKKyAgICBtZW1jcHkoc2wtPnNsWzJdWzBdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRyYSwgNjQpOworICAgIG1lbWNweShzbC0+c2xbMl1bMV0sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludHJhLCA2NCk7CisgICAgbWVtY3B5KHNsLT5zbFsyXVsyXSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50cmEsIDY0KTsKKyAgICBtZW1jcHkoc2wtPnNsWzJdWzNdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRlciwgNjQpOworICAgIG1lbWNweShzbC0+c2xbMl1bNF0sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludGVyLCA2NCk7CisgICAgbWVtY3B5KHNsLT5zbFsyXVs1XSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50ZXIsIDY0KTsKKyAgICBtZW1jcHkoc2wtPnNsWzNdWzBdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRyYSwgNjQpOworICAgIG1lbWNweShzbC0+c2xbM11bMV0sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludHJhLCA2NCk7CisgICAgbWVtY3B5KHNsLT5zbFszXVsyXSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50cmEsIDY0KTsKKyAgICBtZW1jcHkoc2wtPnNsWzNdWzNdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRlciwgNjQpOworICAgIG1lbWNweShzbC0+c2xbM11bNF0sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludGVyLCA2NCk7CisgICAgbWVtY3B5KHNsLT5zbFszXVs1XSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50ZXIsIDY0KTsKK30KKworc3RhdGljIGludCBzY2FsaW5nX2xpc3RfZGF0YShIRVZDQ29udGV4dCAqcywgU2NhbGluZ0xpc3QgKnNsLCBIRVZDU1BTICpzcHMpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKKyAgICB1aW50OF90IHNjYWxpbmdfbGlzdF9wcmVkX21vZGVfZmxhZzsKKyAgICBpbnQzMl90IHNjYWxpbmdfbGlzdF9kY19jb2VmWzJdWzZdOworICAgIGludCBzaXplX2lkLCBtYXRyaXhfaWQsIHBvczsKKyAgICBpbnQgaTsKKworICAgIGZvciAoc2l6ZV9pZCA9IDA7IHNpemVfaWQgPCA0OyBzaXplX2lkKyspCisgICAgICAgIGZvciAobWF0cml4X2lkID0gMDsgbWF0cml4X2lkIDwgNjsgbWF0cml4X2lkICs9ICgoc2l6ZV9pZCA9PSAzKSA/IDMgOiAxKSkgeworICAgICAgICAgICAgc2NhbGluZ19saXN0X3ByZWRfbW9kZV9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGlmICghc2NhbGluZ19saXN0X3ByZWRfbW9kZV9mbGFnKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlbHRhID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgICAgICAgICAvKiBPbmx5IG5lZWQgdG8gaGFuZGxlIG5vbi16ZXJvIGRlbHRhLiBaZXJvIG1lYW5zIGRlZmF1bHQsCisgICAgICAgICAgICAgICAgICogd2hpY2ggc2hvdWxkIGFscmVhZHkgYmUgaW4gdGhlIGFycmF5cy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoZGVsdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29weSBmcm9tIHByZXZpb3VzIGFycmF5LgorICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4X2lkIDwgZGVsdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGRlbHRhIGluIHNjYWxpbmcgbGlzdCBkYXRhOiAlZC5cbiIsIGRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHNsLT5zbFtzaXplX2lkXVttYXRyaXhfaWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPnNsW3NpemVfaWRdW21hdHJpeF9pZCAtIGRlbHRhXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfaWQgPiAwID8gNjQgOiAxNik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX2lkID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5zbF9kY1tzaXplX2lkIC0gMl1bbWF0cml4X2lkXSA9IHNsLT5zbF9kY1tzaXplX2lkIC0gMl1bbWF0cml4X2lkIC0gZGVsdGFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IG5leHRfY29lZiwgY29lZl9udW07CisgICAgICAgICAgICAgICAgaW50MzJfdCBzY2FsaW5nX2xpc3RfZGVsdGFfY29lZjsKKworICAgICAgICAgICAgICAgIG5leHRfY29lZiA9IDg7CisgICAgICAgICAgICAgICAgY29lZl9udW0gID0gRkZNSU4oNjQsIDEgPDwgKDQgKyAoc2l6ZV9pZCA8PCAxKSkpOworICAgICAgICAgICAgICAgIGlmIChzaXplX2lkID4gMSkgeworICAgICAgICAgICAgICAgICAgICBzY2FsaW5nX2xpc3RfZGNfY29lZltzaXplX2lkIC0gMl1bbWF0cml4X2lkXSA9IGdldF9zZV9nb2xvbWIoZ2IpICsgODsKKyAgICAgICAgICAgICAgICAgICAgbmV4dF9jb2VmID0gc2NhbGluZ19saXN0X2RjX2NvZWZbc2l6ZV9pZCAtIDJdW21hdHJpeF9pZF07CisgICAgICAgICAgICAgICAgICAgIHNsLT5zbF9kY1tzaXplX2lkIC0gMl1bbWF0cml4X2lkXSA9IG5leHRfY29lZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvZWZfbnVtOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVfaWQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IDQgKiBmZl9oZXZjX2RpYWdfc2NhbjR4NF95W2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX2RpYWdfc2NhbjR4NF94W2ldOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSA4ICogZmZfaGV2Y19kaWFnX3NjYW44eDhfeVtpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y19kaWFnX3NjYW44eDhfeFtpXTsKKworICAgICAgICAgICAgICAgICAgICBzY2FsaW5nX2xpc3RfZGVsdGFfY29lZiA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgICAgICBuZXh0X2NvZWYgPSAobmV4dF9jb2VmICsgc2NhbGluZ19saXN0X2RlbHRhX2NvZWYgKyAyNTYpICUgMjU2OworICAgICAgICAgICAgICAgICAgICBzbC0+c2xbc2l6ZV9pZF1bbWF0cml4X2lkXVtwb3NdID0gbmV4dF9jb2VmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgc2wtPnNsWzNdWzFdW2ldID0gc2wtPnNsWzJdWzFdW2ldOworICAgICAgICAgICAgc2wtPnNsWzNdWzJdW2ldID0gc2wtPnNsWzJdWzJdW2ldOworICAgICAgICAgICAgc2wtPnNsWzNdWzRdW2ldID0gc2wtPnNsWzJdWzRdW2ldOworICAgICAgICAgICAgc2wtPnNsWzNdWzVdW2ldID0gc2wtPnNsWzJdWzVdW2ldOworICAgICAgICB9CisgICAgICAgIHNsLT5zbF9kY1sxXVsxXSA9IHNsLT5zbF9kY1swXVsxXTsKKyAgICAgICAgc2wtPnNsX2RjWzFdWzJdID0gc2wtPnNsX2RjWzBdWzJdOworICAgICAgICBzbC0+c2xfZGNbMV1bNF0gPSBzbC0+c2xfZGNbMF1bNF07CisgICAgICAgIHNsLT5zbF9kY1sxXVs1XSA9IHNsLT5zbF9kY1swXVs1XTsKKyAgICB9CisKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfaGV2Y19kZWNvZGVfbmFsX3NwcyhIRVZDQ29udGV4dCAqcykKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgc3BzX2lkID0gMDsKKyAgICBpbnQgbG9nMl9kaWZmX21heF9taW5fdHJhbnNmb3JtX2Jsb2NrX3NpemU7CisgICAgaW50IGJpdF9kZXB0aF9jaHJvbWEsIHN0YXJ0LCB2dWlfcHJlc2VudCwgc3VibGF5ZXJfb3JkZXJpbmdfaW5mbzsKKyAgICBpbnQgaTsKKworICAgIEhFVkNTUFMgKnNwczsKKyAgICBBVkJ1ZmZlclJlZiAqc3BzX2J1ZiA9IGF2X2J1ZmZlcl9hbGxvY3ooc2l6ZW9mKCpzcHMpKTsKKworICAgIGlmICghc3BzX2J1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzcHMgPSAoSEVWQ1NQUyopc3BzX2J1Zi0+ZGF0YTsKKworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiRGVjb2RpbmcgU1BTXG4iKTsKKworICAgIC8vIENvZGVkIHBhcmFtZXRlcnMKKworICAgIHNwcy0+dnBzX2lkID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgIGlmIChzcHMtPnZwc19pZCA+PSBNQVhfVlBTX0NPVU5UKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVlBTIGlkIG91dCBvZiByYW5nZTogJWRcbiIsIHNwcy0+dnBzX2lkKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKCFzLT52cHNfbGlzdFtzcHMtPnZwc19pZF0pIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJWUFMgJWQgZG9lcyBub3QgZXhpc3RcbiIsCisgICAgICAgICAgICAgICBzcHMtPnZwc19pZCk7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIHNwcy0+bWF4X3N1Yl9sYXllcnMgPSBnZXRfYml0cyhnYiwgMykgKyAxOworICAgIGlmIChzcHMtPm1heF9zdWJfbGF5ZXJzID4gTUFYX1NVQl9MQVlFUlMpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzcHNfbWF4X3N1Yl9sYXllcnMgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHNwcy0+bWF4X3N1Yl9sYXllcnMpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBza2lwX2JpdHMxKGdiKTsgLy8gdGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnCisKKyAgICBpZiAocGFyc2VfcHRsKHMsICZzcHMtPnB0bCwgc3BzLT5tYXhfc3ViX2xheWVycykgPCAwKQorICAgICAgICBnb3RvIGVycjsKKworICAgIHNwc19pZCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgaWYgKHNwc19pZCA+PSBNQVhfU1BTX0NPVU5UKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU1BTIGlkIG91dCBvZiByYW5nZTogJWRcbiIsIHNwc19pZCk7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgIGlmICghKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMSB8fCBzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIgfHwgc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgImNocm9tYV9mb3JtYXRfaWRjICE9IHsxLCAyLCAzfVxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKQorICAgICAgICBzcHMtPnNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIGlmIChzcHMtPnNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnKQorICAgICAgICBzcHMtPmNocm9tYV9mb3JtYXRfaWRjID0gMDsKKworICAgIHNwcy0+d2lkdGggID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICBzcHMtPmhlaWdodCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKHNwcy0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcy0+aGVpZ2h0LCAwLCBzLT5hdmN0eCkpIDwgMCkKKyAgICAgICAgZ290byBlcnI7CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvLyBwaWNfY29uZm9ybWFuY2VfZmxhZworICAgICAgICAvL1RPRE86ICogMiBpcyBvbmx5IHZhbGlkIGZvciA0MjAKKyAgICAgICAgc3BzLT5waWNfY29uZl93aW4ubGVmdF9vZmZzZXQgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiAyOworICAgICAgICBzcHMtPnBpY19jb25mX3dpbi5yaWdodF9vZmZzZXQgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAqIDI7CisgICAgICAgIHNwcy0+cGljX2NvbmZfd2luLnRvcF9vZmZzZXQgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICogMjsKKyAgICAgICAgc3BzLT5waWNfY29uZl93aW4uYm90dG9tX29mZnNldCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiAyOworCisgICAgICAgIGlmIChzLT5hdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfSUdOT1JFX0NST1ApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJkaXNjYXJkaW5nIHNwcyBjb25mb3JtYW5jZSB3aW5kb3csICIKKyAgICAgICAgICAgICAgICAgICAib3JpZ2luYWwgdmFsdWVzIGFyZSBsOiV1IHI6JXUgdDoldSBiOiV1XG4iLAorICAgICAgICAgICAgICAgICAgIHNwcy0+cGljX2NvbmZfd2luLmxlZnRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIHNwcy0+cGljX2NvbmZfd2luLnJpZ2h0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBzcHMtPnBpY19jb25mX3dpbi50b3Bfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIHNwcy0+cGljX2NvbmZfd2luLmJvdHRvbV9vZmZzZXQpOworCisgICAgICAgICAgICBzcHMtPnBpY19jb25mX3dpbi5sZWZ0X29mZnNldCAgID0KKyAgICAgICAgICAgIHNwcy0+cGljX2NvbmZfd2luLnJpZ2h0X29mZnNldCAgPQorICAgICAgICAgICAgc3BzLT5waWNfY29uZl93aW4udG9wX29mZnNldCAgICA9CisgICAgICAgICAgICBzcHMtPnBpY19jb25mX3dpbi5ib3R0b21fb2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBzcHMtPm91dHB1dF93aW5kb3cgPSBzcHMtPnBpY19jb25mX3dpbjsKKyAgICB9CisKKyAgICBzcHMtPmJpdF9kZXB0aCAgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDg7CisgICAgYml0X2RlcHRoX2Nocm9tYSA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyA4OworICAgIGlmIChiaXRfZGVwdGhfY2hyb21hICE9IHNwcy0+Yml0X2RlcHRoKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkx1bWEgYml0IGRlcHRoICglZCkgaXMgZGlmZmVyZW50IGZyb20gY2hyb21hIGJpdCBkZXB0aCAoJWQpLCAiCisgICAgICAgICAgICAgICAidGhpcyBpcyB1bnN1cHBvcnRlZC5cbiIsCisgICAgICAgICAgICAgICBzcHMtPmJpdF9kZXB0aCwgYml0X2RlcHRoX2Nocm9tYSk7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIHN3aXRjaCAoc3BzLT5iaXRfZGVwdGgpIHsKKyAgICBjYXNlIDg6CisgICAgICAgIGlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDEpIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMikgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSA5OgorICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAxKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA5OworICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA5OworICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAxKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxMDsKKyAgICAgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMikgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTA7CisgICAgICAgIGlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDEwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAxKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxMjsKKyAgICAgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMikgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTI7CisgICAgICAgIGlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDEyOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICI0OjI6MCwgNDoyOjIsIDQ6NDo0IHN1cHBvcnRzIGFyZSBjdXJyZW50bHkgc3BlY2lmaWVkIGZvciA4LCAxMCBhbmQgMTIgYml0cy5cbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoc3BzLT5waXhfZm10KTsKKyAgICBpZiAoIWRlc2MpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBzcHMtPmhzaGlmdFswXSA9IHNwcy0+dnNoaWZ0WzBdID0gMDsKKyAgICBzcHMtPmhzaGlmdFsyXSA9IHNwcy0+aHNoaWZ0WzFdID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBzcHMtPnZzaGlmdFsyXSA9IHNwcy0+dnNoaWZ0WzFdID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIHNwcy0+cGl4ZWxfc2hpZnQgPSBzcHMtPmJpdF9kZXB0aCA+IDg7CisKKyAgICBzcHMtPmxvZzJfbWF4X3BvY19sc2IgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgNDsKKyAgICBpZiAoc3BzLT5sb2cyX21heF9wb2NfbHNiID4gMTYpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgb3V0IHJhbmdlOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHNwcy0+bG9nMl9tYXhfcG9jX2xzYiAtIDQpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBzdWJsYXllcl9vcmRlcmluZ19pbmZvID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBzdGFydCA9IHN1YmxheWVyX29yZGVyaW5nX2luZm8gPyAwIDogc3BzLT5tYXhfc3ViX2xheWVycyAtIDE7CisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzcHMtPm1heF9zdWJfbGF5ZXJzOyBpKyspIHsKKyAgICAgICAgc3BzLT50ZW1wb3JhbF9sYXllcltpXS5tYXhfZGVjX3BpY19idWZmZXJpbmcgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKKyAgICAgICAgc3BzLT50ZW1wb3JhbF9sYXllcltpXS5udW1fcmVvcmRlcl9waWNzICAgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgICAgICBzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm1heF9sYXRlbmN5X2luY3JlYXNlICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgLSAxOworICAgICAgICBpZiAoc3BzLT50ZW1wb3JhbF9sYXllcltpXS5tYXhfZGVjX3BpY19idWZmZXJpbmcgPiBNQVhfRFBCX1NJWkUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czEgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm1heF9kZWNfcGljX2J1ZmZlcmluZyAtIDEpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIGlmIChzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm51bV9yZW9yZGVyX3BpY3MgPiBzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm1heF9kZWNfcGljX2J1ZmZlcmluZyAtIDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJzcHNfbWF4X251bV9yZW9yZGVyX3BpY3Mgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm51bV9yZW9yZGVyX3BpY3MpOworICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFIHx8CisgICAgICAgICAgICAgICAgc3BzLT50ZW1wb3JhbF9sYXllcltpXS5udW1fcmVvcmRlcl9waWNzID4gTUFYX0RQQl9TSVpFIC0gMSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm1heF9kZWNfcGljX2J1ZmZlcmluZyA9IHNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubnVtX3Jlb3JkZXJfcGljcyArIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXN1YmxheWVyX29yZGVyaW5nX2luZm8pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0YXJ0OyBpKyspIHsKKyAgICAgICAgICAgIHNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubWF4X2RlY19waWNfYnVmZmVyaW5nID0gc3BzLT50ZW1wb3JhbF9sYXllcltzdGFydF0ubWF4X2RlY19waWNfYnVmZmVyaW5nOworICAgICAgICAgICAgc3BzLT50ZW1wb3JhbF9sYXllcltpXS5udW1fcmVvcmRlcl9waWNzICAgICAgPSBzcHMtPnRlbXBvcmFsX2xheWVyW3N0YXJ0XS5udW1fcmVvcmRlcl9waWNzOworICAgICAgICAgICAgc3BzLT50ZW1wb3JhbF9sYXllcltpXS5tYXhfbGF0ZW5jeV9pbmNyZWFzZSAgPSBzcHMtPnRlbXBvcmFsX2xheWVyW3N0YXJ0XS5tYXhfbGF0ZW5jeV9pbmNyZWFzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwcy0+bG9nMl9taW5fY2Jfc2l6ZSAgICAgICAgICAgICAgICAgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMzsKKyAgICBzcHMtPmxvZzJfZGlmZl9tYXhfbWluX2NvZGluZ19ibG9ja19zaXplID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICBzcHMtPmxvZzJfbWluX3RiX3NpemUgICAgICAgICAgICAgICAgICAgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDI7CisgICAgbG9nMl9kaWZmX21heF9taW5fdHJhbnNmb3JtX2Jsb2NrX3NpemUgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgc3BzLT5sb2cyX21heF90cmFmb19zaXplICAgICAgICAgICAgICAgICA9IGxvZzJfZGlmZl9tYXhfbWluX3RyYW5zZm9ybV9ibG9ja19zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT5sb2cyX21pbl90Yl9zaXplOworCisgICAgaWYgKHNwcy0+bG9nMl9taW5fdGJfc2l6ZSA+PSBzcHMtPmxvZzJfbWluX2NiX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHZhbHVlIGZvciBsb2cyX21pbl90Yl9zaXplIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBzcHMtPm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICBzcHMtPm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludHJhID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKworICAgIHNwcy0+c2NhbGluZ19saXN0X2VuYWJsZV9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAoc3BzLT5zY2FsaW5nX2xpc3RfZW5hYmxlX2ZsYWcpIHsKKyAgICAgICAgc2V0X2RlZmF1bHRfc2NhbGluZ19saXN0X2RhdGEoJnNwcy0+c2NhbGluZ19saXN0KTsKKworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgcmV0ID0gc2NhbGluZ19saXN0X2RhdGEocywgJnNwcy0+c2NhbGluZ19saXN0LCBzcHMpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcHMtPmFtcF9lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIHNwcy0+c2FvX2VuYWJsZWQgICAgICA9IGdldF9iaXRzMShnYik7CisKKyAgICBzcHMtPnBjbV9lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIGlmIChzcHMtPnBjbV9lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgc3BzLT5wY20uYml0X2RlcHRoICAgPSBnZXRfYml0cyhnYiwgNCkgKyAxOworICAgICAgICBzcHMtPnBjbS5iaXRfZGVwdGhfY2hyb21hID0gZ2V0X2JpdHMoZ2IsIDQpICsgMTsKKyAgICAgICAgc3BzLT5wY20ubG9nMl9taW5fcGNtX2NiX3NpemUgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMzsKKyAgICAgICAgc3BzLT5wY20ubG9nMl9tYXhfcGNtX2NiX3NpemUgPSBzcHMtPnBjbS5sb2cyX21pbl9wY21fY2Jfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgaWYgKHNwcy0+cGNtLmJpdF9kZXB0aCA+IHNwcy0+Yml0X2RlcHRoKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiUENNIGJpdCBkZXB0aCAoJWQpIGlzIGdyZWF0ZXIgdGhhbiBub3JtYWwgYml0IGRlcHRoICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgc3BzLT5wY20uYml0X2RlcHRoLCBzcHMtPmJpdF9kZXB0aCk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKworICAgICAgICBzcHMtPnBjbS5sb29wX2ZpbHRlcl9kaXNhYmxlX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIH0KKworICAgIHNwcy0+bmJfc3RfcnBzID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICBpZiAoc3BzLT5uYl9zdF9ycHMgPiBNQVhfU0hPUlRfVEVSTV9SUFNfQ09VTlQpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBzaG9ydCB0ZXJtIFJQUzogJWQuXG4iLAorICAgICAgICAgICAgICAgc3BzLT5uYl9zdF9ycHMpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHNwcy0+bmJfc3RfcnBzOyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9oZXZjX2RlY29kZV9zaG9ydF90ZXJtX3JwcyhzLCAmc3BzLT5zdF9ycHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLCAwKSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgc3BzLT5sb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAoc3BzLT5sb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnKSB7CisgICAgICAgIHNwcy0+bnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHMgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgICAgICBpZiAoc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcyA+IDMxVSkgeworICAgICAgICAgICAgYXZfbG9nKDAsIEFWX0xPR19FUlJPUiwgIm51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzICVkIGlzIG91dCBvZiByYW5nZS5cbiIsCisgICAgICAgICAgICAgICAgICAgc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3Nwcyk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwczsgaSsrKSB7CisgICAgICAgICAgICBzcHMtPmx0X3JlZl9waWNfcG9jX2xzYl9zcHNbaV0gICAgICAgPSBnZXRfYml0cyhnYiwgc3BzLT5sb2cyX21heF9wb2NfbHNiKTsKKyAgICAgICAgICAgIHNwcy0+dXNlZF9ieV9jdXJyX3BpY19sdF9zcHNfZmxhZ1tpXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcHMtPnNwc190ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBzcHMtPnNwc19zdHJvbmdfaW50cmFfc21vb3RoaW5nX2VuYWJsZV9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBzcHMtPnZ1aS5zYXIgPSAoQVZSYXRpb25hbCl7MCwgMX07CisgICAgdnVpX3ByZXNlbnQgPSBnZXRfYml0czEoZ2IpOworICAgIGlmICh2dWlfcHJlc2VudCkKKyAgICAgICAgZGVjb2RlX3Z1aShzLCBzcHMpOworCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsgLy8gc3BzX2V4dGVuc2lvbl9mbGFnCisgICAgICAgIGludCBzcHNfZXh0ZW5zaW9uX2ZsYWdbMV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxOyBpKyspCisgICAgICAgICAgICBzcHNfZXh0ZW5zaW9uX2ZsYWdbaV0gPSBnZXRfYml0czEoZ2IpOworICAgICAgICBza2lwX2JpdHMoZ2IsIDcpOyAvL3Nwc19leHRlbnNpb25fN2JpdHMgPSBnZXRfYml0cyhnYiwgNyk7CisgICAgICAgIGlmIChzcHNfZXh0ZW5zaW9uX2ZsYWdbMF0pIHsKKyAgICAgICAgICAgIGludCBleHRlbmRlZF9wcmVjaXNpb25fcHJvY2Vzc2luZ19mbGFnOworICAgICAgICAgICAgaW50IGhpZ2hfcHJlY2lzaW9uX29mZnNldHNfZW5hYmxlZF9mbGFnOworICAgICAgICAgICAgaW50IGNhYmFjX2J5cGFzc19hbGlnbm1lbnRfZW5hYmxlZF9mbGFnOworCisgICAgICAgICAgICBzcHMtPnRyYW5zZm9ybV9za2lwX3JvdGF0aW9uX2VuYWJsZWRfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBzcHMtPnRyYW5zZm9ybV9za2lwX2NvbnRleHRfZW5hYmxlZF9mbGFnICA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBzcHMtPmltcGxpY2l0X3JkcGNtX2VuYWJsZWRfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgICAgIHNwcy0+ZXhwbGljaXRfcmRwY21fZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICAgICAgZXh0ZW5kZWRfcHJlY2lzaW9uX3Byb2Nlc3NpbmdfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAoZXh0ZW5kZWRfcHJlY2lzaW9uX3Byb2Nlc3NpbmdfZmxhZykKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJleHRlbmRlZF9wcmVjaXNpb25fcHJvY2Vzc2luZ19mbGFnIG5vdCB5ZXQgaW1wbGVtZW50ZWRcbiIpOworCisgICAgICAgICAgICBzcHMtPmludHJhX3Ntb290aGluZ19kaXNhYmxlZF9mbGFnICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGhpZ2hfcHJlY2lzaW9uX29mZnNldHNfZW5hYmxlZF9mbGFnICA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAoaGlnaF9wcmVjaXNpb25fb2Zmc2V0c19lbmFibGVkX2ZsYWcpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiaGlnaF9wcmVjaXNpb25fb2Zmc2V0c19lbmFibGVkX2ZsYWcgbm90IHlldCBpbXBsZW1lbnRlZFxuIik7CisKKyAgICAgICAgICAgIHNwcy0+cGVyc2lzdGVudF9yaWNlX2FkYXB0YXRpb25fZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICAgICAgY2FiYWNfYnlwYXNzX2FsaWdubWVudF9lbmFibGVkX2ZsYWcgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGlmIChjYWJhY19ieXBhc3NfYWxpZ25tZW50X2VuYWJsZWRfZmxhZykKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJjYWJhY19ieXBhc3NfYWxpZ25tZW50X2VuYWJsZWRfZmxhZyBub3QgeWV0IGltcGxlbWVudGVkXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+YXBwbHlfZGVmZGlzcHdpbikgeworICAgICAgICBzcHMtPm91dHB1dF93aW5kb3cubGVmdF9vZmZzZXQgICArPSBzcHMtPnZ1aS5kZWZfZGlzcF93aW4ubGVmdF9vZmZzZXQ7CisgICAgICAgIHNwcy0+b3V0cHV0X3dpbmRvdy5yaWdodF9vZmZzZXQgICs9IHNwcy0+dnVpLmRlZl9kaXNwX3dpbi5yaWdodF9vZmZzZXQ7CisgICAgICAgIHNwcy0+b3V0cHV0X3dpbmRvdy50b3Bfb2Zmc2V0ICAgICs9IHNwcy0+dnVpLmRlZl9kaXNwX3dpbi50b3Bfb2Zmc2V0OworICAgICAgICBzcHMtPm91dHB1dF93aW5kb3cuYm90dG9tX29mZnNldCArPSBzcHMtPnZ1aS5kZWZfZGlzcF93aW4uYm90dG9tX29mZnNldDsKKyAgICB9CisgICAgaWYgKHNwcy0+b3V0cHV0X3dpbmRvdy5sZWZ0X29mZnNldCAmICgweDFGID4+IChzcHMtPnBpeGVsX3NoaWZ0KSkgJiYKKyAgICAgICAgIShzLT5hdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1VOQUxJR05FRCkpIHsKKyAgICAgICAgc3BzLT5vdXRwdXRfd2luZG93LmxlZnRfb2Zmc2V0ICY9IH4oMHgxRiA+PiAoc3BzLT5waXhlbF9zaGlmdCkpOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiUmVkdWNpbmcgbGVmdCBvdXRwdXQgd2luZG93IHRvICVkICIKKyAgICAgICAgICAgICAgICJjaHJvbWEgc2FtcGxlcyB0byBwcmVzZXJ2ZSBhbGlnbm1lbnQuXG4iLAorICAgICAgICAgICAgICAgc3BzLT5vdXRwdXRfd2luZG93LmxlZnRfb2Zmc2V0KTsKKyAgICB9CisgICAgc3BzLT5vdXRwdXRfd2lkdGggID0gc3BzLT53aWR0aCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNwcy0+b3V0cHV0X3dpbmRvdy5sZWZ0X29mZnNldCArIHNwcy0+b3V0cHV0X3dpbmRvdy5yaWdodF9vZmZzZXQpOworICAgIHNwcy0+b3V0cHV0X2hlaWdodCA9IHNwcy0+aGVpZ2h0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3BzLT5vdXRwdXRfd2luZG93LnRvcF9vZmZzZXQgKyBzcHMtPm91dHB1dF93aW5kb3cuYm90dG9tX29mZnNldCk7CisgICAgaWYgKHNwcy0+b3V0cHV0X3dpZHRoIDw9IDAgfHwgc3BzLT5vdXRwdXRfaGVpZ2h0IDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgdmlzaWJsZSBmcmFtZSBkaW1lbnNpb25zOiAlZHglZC5cbiIsCisgICAgICAgICAgICAgICBzcHMtPm91dHB1dF93aWR0aCwgc3BzLT5vdXRwdXRfaGVpZ2h0KTsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJEaXNwbGF5aW5nIHRoZSB3aG9sZSB2aWRlbyBzdXJmYWNlLlxuIik7CisgICAgICAgIG1lbXNldCgmc3BzLT5waWNfY29uZl93aW4sIDAsIHNpemVvZihzcHMtPnBpY19jb25mX3dpbikpOworICAgICAgICBtZW1zZXQoJnNwcy0+b3V0cHV0X3dpbmRvdywgMCwgc2l6ZW9mKHNwcy0+b3V0cHV0X3dpbmRvdykpOworICAgICAgICBzcHMtPm91dHB1dF93aWR0aCAgICAgICAgICAgICAgID0gc3BzLT53aWR0aDsKKyAgICAgICAgc3BzLT5vdXRwdXRfaGVpZ2h0ICAgICAgICAgICAgICA9IHNwcy0+aGVpZ2h0OworICAgIH0KKworICAgIC8vIEluZmVycmVkIHBhcmFtZXRlcnMKKyAgICBzcHMtPmxvZzJfY3RiX3NpemUgPSBzcHMtPmxvZzJfbWluX2NiX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgIHNwcy0+bG9nMl9kaWZmX21heF9taW5fY29kaW5nX2Jsb2NrX3NpemU7CisgICAgc3BzLT5sb2cyX21pbl9wdV9zaXplID0gc3BzLT5sb2cyX21pbl9jYl9zaXplIC0gMTsKKworICAgIHNwcy0+Y3RiX3dpZHRoICA9IChzcHMtPndpZHRoICArICgxIDw8IHNwcy0+bG9nMl9jdGJfc2l6ZSkgLSAxKSA+PiBzcHMtPmxvZzJfY3RiX3NpemU7CisgICAgc3BzLT5jdGJfaGVpZ2h0ID0gKHNwcy0+aGVpZ2h0ICsgKDEgPDwgc3BzLT5sb2cyX2N0Yl9zaXplKSAtIDEpID4+IHNwcy0+bG9nMl9jdGJfc2l6ZTsKKyAgICBzcHMtPmN0Yl9zaXplICAgPSBzcHMtPmN0Yl93aWR0aCAqIHNwcy0+Y3RiX2hlaWdodDsKKworICAgIHNwcy0+bWluX2NiX3dpZHRoICA9IHNwcy0+d2lkdGggID4+IHNwcy0+bG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBzcHMtPm1pbl9jYl9oZWlnaHQgPSBzcHMtPmhlaWdodCA+PiBzcHMtPmxvZzJfbWluX2NiX3NpemU7CisgICAgc3BzLT5taW5fdGJfd2lkdGggID0gc3BzLT53aWR0aCAgPj4gc3BzLT5sb2cyX21pbl90Yl9zaXplOworICAgIHNwcy0+bWluX3RiX2hlaWdodCA9IHNwcy0+aGVpZ2h0ID4+IHNwcy0+bG9nMl9taW5fdGJfc2l6ZTsKKyAgICBzcHMtPm1pbl9wdV93aWR0aCAgPSBzcHMtPndpZHRoICA+PiBzcHMtPmxvZzJfbWluX3B1X3NpemU7CisgICAgc3BzLT5taW5fcHVfaGVpZ2h0ID0gc3BzLT5oZWlnaHQgPj4gc3BzLT5sb2cyX21pbl9wdV9zaXplOworICAgIHNwcy0+dGJfbWFzayAgICAgICA9ICgxIDw8IChzcHMtPmxvZzJfY3RiX3NpemUgLSBzcHMtPmxvZzJfbWluX3RiX3NpemUpKSAtIDE7CisKKyAgICBzcHMtPnFwX2JkX29mZnNldCA9IDYgKiAoc3BzLT5iaXRfZGVwdGggLSA4KTsKKworICAgIGlmIChzcHMtPndpZHRoICAmICgoMSA8PCBzcHMtPmxvZzJfbWluX2NiX3NpemUpIC0gMSkgfHwKKyAgICAgICAgc3BzLT5oZWlnaHQgJiAoKDEgPDwgc3BzLT5sb2cyX21pbl9jYl9zaXplKSAtIDEpKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjb2RlZCBmcmFtZSBkaW1lbnNpb25zLlxuIik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChzcHMtPmxvZzJfY3RiX3NpemUgPiBNQVhfTE9HMl9DVEJfU0laRSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNUQiBzaXplIG91dCBvZiByYW5nZTogMl4lZFxuIiwgc3BzLT5sb2cyX2N0Yl9zaXplKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmIChzcHMtPm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyID4gc3BzLT5sb2cyX2N0Yl9zaXplIC0gc3BzLT5sb2cyX21pbl90Yl9zaXplKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXIgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKHNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmEgPiBzcHMtPmxvZzJfY3RiX3NpemUgLSBzcHMtPmxvZzJfbWluX3RiX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJtYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRyYSBvdXQgb2YgcmFuZ2U6ICVkXG4iLAorICAgICAgICAgICAgICAgc3BzLT5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRyYSk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoc3BzLT5sb2cyX21heF90cmFmb19zaXplID4gRkZNSU4oc3BzLT5sb2cyX2N0Yl9zaXplLCA1KSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJtYXggdHJhbnNmb3JtIGJsb2NrIHNpemUgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHNwcy0+bG9nMl9tYXhfdHJhZm9fc2l6ZSk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiT3ZlcnJlYWQgU1BTIGJ5ICVkIGJpdHNcbiIsIC1nZXRfYml0c19sZWZ0KGdiKSk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19CSVRTVFJFQU0pIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiUGFyc2VkIFNQUzogaWQgJWQ7IGNvZGVkIHd4aDogJWR4JWQ7ICIKKyAgICAgICAgICAgICAgICJjcm9wcGVkIHd4aDogJWR4JWQ7IHBpeF9mbXQ6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIHNwc19pZCwgc3BzLT53aWR0aCwgc3BzLT5oZWlnaHQsCisgICAgICAgICAgICAgICBzcHMtPm91dHB1dF93aWR0aCwgc3BzLT5vdXRwdXRfaGVpZ2h0LAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShzcHMtPnBpeF9mbXQpKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBpZiB0aGlzIGlzIGEgcmVwZWF0IG9mIGFuIGFscmVhZHkgcGFyc2VkIFNQUywgdGhlbiBrZWVwIHRoZQorICAgICAqIG9yaWdpbmFsIG9uZS4KKyAgICAgKiBvdGhlcndpc2UgZHJvcCBhbGwgUFBTZXMgdGhhdCBkZXBlbmQgb24gaXQgKi8KKyAgICBpZiAocy0+c3BzX2xpc3Rbc3BzX2lkXSAmJgorICAgICAgICAhbWVtY21wKHMtPnNwc19saXN0W3Nwc19pZF0tPmRhdGEsIHNwc19idWYtPmRhdGEsIHNwc19idWYtPnNpemUpKSB7CisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmc3BzX2J1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPnBwc19saXN0KTsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+cHBzX2xpc3RbaV0gJiYgKChIRVZDUFBTKilzLT5wcHNfbGlzdFtpXS0+ZGF0YSktPnNwc19pZCA9PSBzcHNfaWQpCisgICAgICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZzLT5wcHNfbGlzdFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnNwc19saXN0W3Nwc19pZF0gJiYgcy0+c3BzID09IChIRVZDU1BTKilzLT5zcHNfbGlzdFtzcHNfaWRdLT5kYXRhKSB7CisgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnMtPmN1cnJlbnRfc3BzKTsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfc3BzID0gYXZfYnVmZmVyX3JlZihzLT5zcHNfbGlzdFtzcHNfaWRdKTsKKyAgICAgICAgICAgIGlmICghcy0+Y3VycmVudF9zcHMpCisgICAgICAgICAgICAgICAgcy0+c3BzID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnMtPnNwc19saXN0W3Nwc19pZF0pOworICAgICAgICBzLT5zcHNfbGlzdFtzcHNfaWRdID0gc3BzX2J1ZjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZXJyOgorICAgIGF2X2J1ZmZlcl91bnJlZigmc3BzX2J1Zik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaGV2Y19wcHNfZnJlZSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCit7CisgICAgSEVWQ1BQUyAqcHBzID0gKEhFVkNQUFMqKWRhdGE7CisKKyAgICBhdl9mcmVlcCgmcHBzLT5jb2x1bW5fd2lkdGgpOworICAgIGF2X2ZyZWVwKCZwcHMtPnJvd19oZWlnaHQpOworICAgIGF2X2ZyZWVwKCZwcHMtPmNvbF9iZCk7CisgICAgYXZfZnJlZXAoJnBwcy0+cm93X2JkKTsKKyAgICBhdl9mcmVlcCgmcHBzLT5jb2xfaWR4WCk7CisgICAgYXZfZnJlZXAoJnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHMpOworICAgIGF2X2ZyZWVwKCZwcHMtPmN0Yl9hZGRyX3RzX3RvX3JzKTsKKyAgICBhdl9mcmVlcCgmcHBzLT50aWxlX3Bvc19ycyk7CisgICAgYXZfZnJlZXAoJnBwcy0+dGlsZV9pZCk7CisgICAgYXZfZnJlZXAoJnBwcy0+bWluX3RiX2FkZHJfenNfdGFiKTsKKworICAgIGF2X2ZyZWVwKCZwcHMpOworfQorCitzdGF0aWMgaW50IHBwc19yYW5nZV9leHRlbnNpb25zKEhFVkNDb250ZXh0ICpzLCBIRVZDUFBTICpwcHMsIEhFVkNTUFMgKnNwcykgeworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPkhFVkNsYy0+Z2I7CisgICAgaW50IGk7CisKKyAgICBpZiAocHBzLT50cmFuc2Zvcm1fc2tpcF9lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgcHBzLT5sb2cyX21heF90cmFuc2Zvcm1fc2tpcF9ibG9ja19zaXplID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDI7CisgICAgfQorICAgIHBwcy0+Y3Jvc3NfY29tcG9uZW50X3ByZWRpY3Rpb25fZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBwcHMtPmNocm9tYV9xcF9vZmZzZXRfbGlzdF9lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIGlmIChwcHMtPmNocm9tYV9xcF9vZmZzZXRfbGlzdF9lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgcHBzLT5kaWZmX2N1X2Nocm9tYV9xcF9vZmZzZXRfZGVwdGggPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgICAgICBwcHMtPmNocm9tYV9xcF9vZmZzZXRfbGlzdF9sZW5fbWludXMxID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgaWYgKHBwcy0+Y2hyb21hX3FwX29mZnNldF9saXN0X2xlbl9taW51czEgJiYgcHBzLT5jaHJvbWFfcXBfb2Zmc2V0X2xpc3RfbGVuX21pbnVzMSA+PSA1KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiY2hyb21hX3FwX29mZnNldF9saXN0X2xlbl9taW51czEgc2hhbGwgYmUgaW4gdGhlIHJhbmdlIFswLCA1XS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBwcHMtPmNocm9tYV9xcF9vZmZzZXRfbGlzdF9sZW5fbWludXMxOyBpKyspIHsKKyAgICAgICAgICAgIHBwcy0+Y2JfcXBfb2Zmc2V0X2xpc3RbaV0gPSBnZXRfc2VfZ29sb21iX2xvbmcoZ2IpOworICAgICAgICAgICAgaWYgKHBwcy0+Y2JfcXBfb2Zmc2V0X2xpc3RbaV0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiY2JfcXBfb2Zmc2V0X2xpc3Qgbm90IHRlc3RlZCB5ZXQuXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBwcy0+Y3JfcXBfb2Zmc2V0X2xpc3RbaV0gPSBnZXRfc2VfZ29sb21iX2xvbmcoZ2IpOworICAgICAgICAgICAgaWYgKHBwcy0+Y3JfcXBfb2Zmc2V0X2xpc3RbaV0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiY2JfcXBfb2Zmc2V0X2xpc3Qgbm90IHRlc3RlZCB5ZXQuXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwcHMtPmxvZzJfc2FvX29mZnNldF9zY2FsZV9sdW1hID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICBwcHMtPmxvZzJfc2FvX29mZnNldF9zY2FsZV9jaHJvbWEgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCisgICAgcmV0dXJuKDApOworfQorCitpbnQgZmZfaGV2Y19kZWNvZGVfbmFsX3BwcyhIRVZDQ29udGV4dCAqcykKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5IRVZDbGMtPmdiOworICAgIEhFVkNTUFMgICAgICAqc3BzID0gTlVMTDsKKyAgICBpbnQgcGljX2FyZWFfaW5fY3RiczsKKyAgICBpbnQgbG9nMl9kaWZmX2N0Yl9taW5fdGJfc2l6ZTsKKyAgICBpbnQgaSwgaiwgeCwgeSwgY3RiX2FkZHJfcnMsIHRpbGVfaWQ7CisgICAgaW50IHJldCA9IDA7CisgICAgdW5zaWduZWQgaW50IHBwc19pZCA9IDA7CisKKyAgICBBVkJ1ZmZlclJlZiAqcHBzX2J1ZjsKKyAgICBIRVZDUFBTICpwcHMgPSBhdl9tYWxsb2N6KHNpemVvZigqcHBzKSk7CisKKyAgICBpZiAoIXBwcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHBwc19idWYgPSBhdl9idWZmZXJfY3JlYXRlKCh1aW50OF90ICopcHBzLCBzaXplb2YoKnBwcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV2Y19wcHNfZnJlZSwgTlVMTCwgMCk7CisgICAgaWYgKCFwcHNfYnVmKSB7CisgICAgICAgIGF2X2ZyZWVwKCZwcHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiRGVjb2RpbmcgUFBTXG4iKTsKKworICAgIC8vIERlZmF1bHQgdmFsdWVzCisgICAgcHBzLT5sb29wX2ZpbHRlcl9hY3Jvc3NfdGlsZXNfZW5hYmxlZF9mbGFnID0gMTsKKyAgICBwcHMtPm51bV90aWxlX2NvbHVtbnMgICAgICAgICAgICAgICAgICAgICAgPSAxOworICAgIHBwcy0+bnVtX3RpbGVfcm93cyAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7CisgICAgcHBzLT51bmlmb3JtX3NwYWNpbmdfZmxhZyAgICAgICAgICAgICAgICAgID0gMTsKKyAgICBwcHMtPmRpc2FibGVfZGJmICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgIHBwcy0+YmV0YV9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgcHBzLT50Y19vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBwcHMtPmxvZzJfbWF4X3RyYW5zZm9ybV9za2lwX2Jsb2NrX3NpemUgICAgPSAyOworCisgICAgLy8gQ29kZWQgcGFyYW1ldGVycworICAgIHBwc19pZCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgaWYgKHBwc19pZCA+PSBNQVhfUFBTX0NPVU5UKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUFBTIGlkIG91dCBvZiByYW5nZTogJWRcbiIsIHBwc19pZCk7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBwcHMtPnNwc19pZCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgaWYgKHBwcy0+c3BzX2lkID49IE1BWF9TUFNfQ09VTlQpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJTUFMgaWQgb3V0IG9mIHJhbmdlOiAlZFxuIiwgcHBzLT5zcHNfaWQpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCFzLT5zcHNfbGlzdFtwcHMtPnNwc19pZF0pIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJTUFMgJXUgZG9lcyBub3QgZXhpc3QuXG4iLCBwcHMtPnNwc19pZCk7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBzcHMgPSAoSEVWQ1NQUyAqKXMtPnNwc19saXN0W3Bwcy0+c3BzX2lkXS0+ZGF0YTsKKworICAgIHBwcy0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRzX2VuYWJsZWRfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgcHBzLT5vdXRwdXRfZmxhZ19wcmVzZW50X2ZsYWcgICAgICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBwcHMtPm51bV9leHRyYV9zbGljZV9oZWFkZXJfYml0cyAgICAgICAgICAgPSBnZXRfYml0cyhnYiwgMyk7CisKKyAgICBwcHMtPnNpZ25fZGF0YV9oaWRpbmdfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICBwcHMtPmNhYmFjX2luaXRfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIHBwcy0+bnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmUgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKKyAgICBwcHMtPm51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDE7CisKKyAgICBwcHMtPnBpY19pbml0X3FwX21pbnVzMjYgPSBnZXRfc2VfZ29sb21iKGdiKTsKKworICAgIHBwcy0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBwcHMtPnRyYW5zZm9ybV9za2lwX2VuYWJsZWRfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICBwcHMtPmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgcHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoICAgPSAwOworICAgIGlmIChwcHMtPmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZykKKyAgICAgICAgcHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKworICAgIHBwcy0+Y2JfcXBfb2Zmc2V0ID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgaWYgKHBwcy0+Y2JfcXBfb2Zmc2V0IDwgLTEyIHx8IHBwcy0+Y2JfcXBfb2Zmc2V0ID4gMTIpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJwcHNfY2JfcXBfb2Zmc2V0IG91dCBvZiByYW5nZTogJWRcbiIsCisgICAgICAgICAgICAgICBwcHMtPmNiX3FwX29mZnNldCk7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBwcHMtPmNyX3FwX29mZnNldCA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgIGlmIChwcHMtPmNyX3FwX29mZnNldCA8IC0xMiB8fCBwcHMtPmNyX3FwX29mZnNldCA+IDEyKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicHBzX2NyX3FwX29mZnNldCBvdXQgb2YgcmFuZ2U6ICVkXG4iLAorICAgICAgICAgICAgICAgcHBzLT5jcl9xcF9vZmZzZXQpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgcHBzLT5waWNfc2xpY2VfbGV2ZWxfY2hyb21hX3FwX29mZnNldHNfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIHBwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnICAgPSBnZXRfYml0czEoZ2IpOworICAgIHBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgcHBzLT50cmFuc3F1YW50X2J5cGFzc19lbmFibGVfZmxhZyAgICA9IGdldF9iaXRzMShnYik7CisgICAgcHBzLT50aWxlc19lbmFibGVkX2ZsYWcgICAgICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CisgICAgcHBzLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICBpZiAocHBzLT50aWxlc19lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgcHBzLT5udW1fdGlsZV9jb2x1bW5zID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDE7CisgICAgICAgIHBwcy0+bnVtX3RpbGVfcm93cyAgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworICAgICAgICBpZiAocHBzLT5udW1fdGlsZV9jb2x1bW5zID09IDAgfHwKKyAgICAgICAgICAgIHBwcy0+bnVtX3RpbGVfY29sdW1ucyA+PSBzcHMtPndpZHRoKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm51bV90aWxlX2NvbHVtbnNfbWludXMxIG91dCBvZiByYW5nZTogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgcHBzLT5udW1fdGlsZV9jb2x1bW5zIC0gMSk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBwcy0+bnVtX3RpbGVfcm93cyA9PSAwIHx8CisgICAgICAgICAgICBwcHMtPm51bV90aWxlX3Jvd3MgPj0gc3BzLT5oZWlnaHQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibnVtX3RpbGVfcm93c19taW51czEgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBwcHMtPm51bV90aWxlX3Jvd3MgLSAxKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHBwcy0+Y29sdW1uX3dpZHRoID0gYXZfbWFsbG9jX2FycmF5KHBwcy0+bnVtX3RpbGVfY29sdW1ucywgc2l6ZW9mKCpwcHMtPmNvbHVtbl93aWR0aCkpOworICAgICAgICBwcHMtPnJvd19oZWlnaHQgICA9IGF2X21hbGxvY19hcnJheShwcHMtPm51bV90aWxlX3Jvd3MsICAgIHNpemVvZigqcHBzLT5yb3dfaGVpZ2h0KSk7CisgICAgICAgIGlmICghcHBzLT5jb2x1bW5fd2lkdGggfHwgIXBwcy0+cm93X2hlaWdodCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKworICAgICAgICBwcHMtPnVuaWZvcm1fc3BhY2luZ19mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKCFwcHMtPnVuaWZvcm1fc3BhY2luZ19mbGFnKSB7CisgICAgICAgICAgICB1aW50NjRfdCBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBwcy0+bnVtX3RpbGVfY29sdW1ucyAtIDE7IGkrKykgeworICAgICAgICAgICAgICAgIHBwcy0+Y29sdW1uX3dpZHRoW2ldID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDE7CisgICAgICAgICAgICAgICAgc3VtICAgICAgICAgICAgICAgICArPSBwcHMtPmNvbHVtbl93aWR0aFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdW0gPj0gc3BzLT5jdGJfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdGlsZSB3aWR0aHMuXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHBzLT5jb2x1bW5fd2lkdGhbcHBzLT5udW1fdGlsZV9jb2x1bW5zIC0gMV0gPSBzcHMtPmN0Yl93aWR0aCAtIHN1bTsKKworICAgICAgICAgICAgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcHMtPm51bV90aWxlX3Jvd3MgLSAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwcHMtPnJvd19oZWlnaHRbaV0gPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKKyAgICAgICAgICAgICAgICBzdW0gICAgICAgICAgICAgICArPSBwcHMtPnJvd19oZWlnaHRbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VtID49IHNwcy0+Y3RiX2hlaWdodCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCB0aWxlIGhlaWdodHMuXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHBzLT5yb3dfaGVpZ2h0W3Bwcy0+bnVtX3RpbGVfcm93cyAtIDFdID0gc3BzLT5jdGJfaGVpZ2h0IC0gc3VtOworICAgICAgICB9CisgICAgICAgIHBwcy0+bG9vcF9maWx0ZXJfYWNyb3NzX3RpbGVzX2VuYWJsZWRfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgfQorCisgICAgcHBzLT5zZXFfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgcHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKHBwcy0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgcHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICBwcHMtPmRpc2FibGVfZGJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGlmICghcHBzLT5kaXNhYmxlX2RiZikgeworICAgICAgICAgICAgcHBzLT5iZXRhX29mZnNldCA9IGdldF9zZV9nb2xvbWIoZ2IpICogMjsKKyAgICAgICAgICAgIHBwcy0+dGNfb2Zmc2V0ID0gZ2V0X3NlX2dvbG9tYihnYikgKiAyOworICAgICAgICAgICAgaWYgKHBwcy0+YmV0YV9vZmZzZXQvMiA8IC02IHx8IHBwcy0+YmV0YV9vZmZzZXQvMiA+IDYpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInBwc19iZXRhX29mZnNldF9kaXYyIG91dCBvZiByYW5nZTogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHBwcy0+YmV0YV9vZmZzZXQvMik7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcHMtPnRjX29mZnNldC8yIDwgLTYgfHwgcHBzLT50Y19vZmZzZXQvMiA+IDYpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInBwc190Y19vZmZzZXRfZGl2MiBvdXQgb2YgcmFuZ2U6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwcHMtPnRjX29mZnNldC8yKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHBzLT5zY2FsaW5nX2xpc3RfZGF0YV9wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIGlmIChwcHMtPnNjYWxpbmdfbGlzdF9kYXRhX3ByZXNlbnRfZmxhZykgeworICAgICAgICBzZXRfZGVmYXVsdF9zY2FsaW5nX2xpc3RfZGF0YSgmcHBzLT5zY2FsaW5nX2xpc3QpOworICAgICAgICByZXQgPSBzY2FsaW5nX2xpc3RfZGF0YShzLCAmcHBzLT5zY2FsaW5nX2xpc3QsIHNwcyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIHBwcy0+bGlzdHNfbW9kaWZpY2F0aW9uX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgcHBzLT5sb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsICAgICAgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDI7CisgICAgaWYgKHBwcy0+bG9nMl9wYXJhbGxlbF9tZXJnZV9sZXZlbCA+IHNwcy0+bG9nMl9jdGJfc2l6ZSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyIG91dCBvZiByYW5nZTogJWRcbiIsCisgICAgICAgICAgICAgICBwcHMtPmxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWwgLSAyKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgcHBzLT5zbGljZV9oZWFkZXJfZXh0ZW5zaW9uX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvLyBwcHNfZXh0ZW5zaW9uX3ByZXNlbnRfZmxhZworICAgICAgICBpbnQgcHBzX3JhbmdlX2V4dGVuc2lvbnNfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgIC8qIGludCBwcHNfZXh0ZW5zaW9uXzdiaXRzID0gKi8gZ2V0X2JpdHMoZ2IsIDcpOworICAgICAgICBpZiAoc3BzLT5wdGwuZ2VuZXJhbF9wdGwucHJvZmlsZV9pZGMgPT0gRkZfUFJPRklMRV9IRVZDX1JFWFQgJiYgcHBzX3JhbmdlX2V4dGVuc2lvbnNfZmxhZykgeworICAgICAgICAgICAgaWYgKChyZXQgPSBwcHNfcmFuZ2VfZXh0ZW5zaW9ucyhzLCBwcHMsIHNwcykpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEluZmVycmVkIHBhcmFtZXRlcnMKKyAgICBwcHMtPmNvbF9iZCAgID0gYXZfbWFsbG9jX2FycmF5KHBwcy0+bnVtX3RpbGVfY29sdW1ucyArIDEsIHNpemVvZigqcHBzLT5jb2xfYmQpKTsKKyAgICBwcHMtPnJvd19iZCAgID0gYXZfbWFsbG9jX2FycmF5KHBwcy0+bnVtX3RpbGVfcm93cyArIDEsICAgIHNpemVvZigqcHBzLT5yb3dfYmQpKTsKKyAgICBwcHMtPmNvbF9pZHhYID0gYXZfbWFsbG9jX2FycmF5KHNwcy0+Y3RiX3dpZHRoLCAgICBzaXplb2YoKnBwcy0+Y29sX2lkeFgpKTsKKyAgICBpZiAoIXBwcy0+Y29sX2JkIHx8ICFwcHMtPnJvd19iZCB8fCAhcHBzLT5jb2xfaWR4WCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChwcHMtPnVuaWZvcm1fc3BhY2luZ19mbGFnKSB7CisgICAgICAgIGlmICghcHBzLT5jb2x1bW5fd2lkdGgpIHsKKyAgICAgICAgICAgIHBwcy0+Y29sdW1uX3dpZHRoID0gYXZfbWFsbG9jX2FycmF5KHBwcy0+bnVtX3RpbGVfY29sdW1ucywgc2l6ZW9mKCpwcHMtPmNvbHVtbl93aWR0aCkpOworICAgICAgICAgICAgcHBzLT5yb3dfaGVpZ2h0ICAgPSBhdl9tYWxsb2NfYXJyYXkocHBzLT5udW1fdGlsZV9yb3dzLCAgICBzaXplb2YoKnBwcy0+cm93X2hlaWdodCkpOworICAgICAgICB9CisgICAgICAgIGlmICghcHBzLT5jb2x1bW5fd2lkdGggfHwgIXBwcy0+cm93X2hlaWdodCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1fdGlsZV9jb2x1bW5zOyBpKyspIHsKKyAgICAgICAgICAgIHBwcy0+Y29sdW1uX3dpZHRoW2ldID0gKChpICsgMSkgKiBzcHMtPmN0Yl93aWR0aCkgLyBwcHMtPm51bV90aWxlX2NvbHVtbnMgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSAqIHNwcy0+Y3RiX3dpZHRoKSAvIHBwcy0+bnVtX3RpbGVfY29sdW1uczsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcHMtPm51bV90aWxlX3Jvd3M7IGkrKykgeworICAgICAgICAgICAgcHBzLT5yb3dfaGVpZ2h0W2ldID0gKChpICsgMSkgKiBzcHMtPmN0Yl9oZWlnaHQpIC8gcHBzLT5udW1fdGlsZV9yb3dzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICogc3BzLT5jdGJfaGVpZ2h0KSAvIHBwcy0+bnVtX3RpbGVfcm93czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBwcy0+Y29sX2JkWzBdID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1fdGlsZV9jb2x1bW5zOyBpKyspCisgICAgICAgIHBwcy0+Y29sX2JkW2kgKyAxXSA9IHBwcy0+Y29sX2JkW2ldICsgcHBzLT5jb2x1bW5fd2lkdGhbaV07CisKKyAgICBwcHMtPnJvd19iZFswXSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHBwcy0+bnVtX3RpbGVfcm93czsgaSsrKQorICAgICAgICBwcHMtPnJvd19iZFtpICsgMV0gPSBwcHMtPnJvd19iZFtpXSArIHBwcy0+cm93X2hlaWdodFtpXTsKKworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgc3BzLT5jdGJfd2lkdGg7IGkrKykgeworICAgICAgICBpZiAoaSA+IHBwcy0+Y29sX2JkW2pdKQorICAgICAgICAgICAgaisrOworICAgICAgICBwcHMtPmNvbF9pZHhYW2ldID0gajsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA2LjUKKyAgICAgKi8KKyAgICBwaWNfYXJlYV9pbl9jdGJzICAgICA9IHNwcy0+Y3RiX3dpZHRoICAgICogc3BzLT5jdGJfaGVpZ2h0OworCisgICAgcHBzLT5jdGJfYWRkcl9yc190b190cyA9IGF2X21hbGxvY19hcnJheShwaWNfYXJlYV9pbl9jdGJzLCAgICBzaXplb2YoKnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHMpKTsKKyAgICBwcHMtPmN0Yl9hZGRyX3RzX3RvX3JzID0gYXZfbWFsbG9jX2FycmF5KHBpY19hcmVhX2luX2N0YnMsICAgIHNpemVvZigqcHBzLT5jdGJfYWRkcl90c190b19ycykpOworICAgIHBwcy0+dGlsZV9pZCAgICAgICAgICAgPSBhdl9tYWxsb2NfYXJyYXkocGljX2FyZWFfaW5fY3RicywgICAgc2l6ZW9mKCpwcHMtPnRpbGVfaWQpKTsKKyAgICBwcHMtPm1pbl90Yl9hZGRyX3pzX3RhYiA9IGF2X21hbGxvY19hcnJheSgoc3BzLT50Yl9tYXNrKzIpICogKHNwcy0+dGJfbWFzaysyKSwgc2l6ZW9mKCpwcHMtPm1pbl90Yl9hZGRyX3pzX3RhYikpOworICAgIGlmICghcHBzLT5jdGJfYWRkcl9yc190b190cyB8fCAhcHBzLT5jdGJfYWRkcl90c190b19ycyB8fAorICAgICAgICAhcHBzLT50aWxlX2lkIHx8ICFwcHMtPm1pbl90Yl9hZGRyX3pzX3RhYikgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGZvciAoY3RiX2FkZHJfcnMgPSAwOyBjdGJfYWRkcl9ycyA8IHBpY19hcmVhX2luX2N0YnM7IGN0Yl9hZGRyX3JzKyspIHsKKyAgICAgICAgaW50IHRiX3ggICA9IGN0Yl9hZGRyX3JzICUgc3BzLT5jdGJfd2lkdGg7CisgICAgICAgIGludCB0Yl95ICAgPSBjdGJfYWRkcl9ycyAvIHNwcy0+Y3RiX3dpZHRoOworICAgICAgICBpbnQgdGlsZV94ID0gMDsKKyAgICAgICAgaW50IHRpbGVfeSA9IDA7CisgICAgICAgIGludCB2YWwgICAgPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcHMtPm51bV90aWxlX2NvbHVtbnM7IGkrKykgeworICAgICAgICAgICAgaWYgKHRiX3ggPCBwcHMtPmNvbF9iZFtpICsgMV0pIHsKKyAgICAgICAgICAgICAgICB0aWxlX3ggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBwcy0+bnVtX3RpbGVfcm93czsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGJfeSA8IHBwcy0+cm93X2JkW2kgKyAxXSkgeworICAgICAgICAgICAgICAgIHRpbGVfeSA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZV94OyBpKyspCisgICAgICAgICAgICB2YWwgKz0gcHBzLT5yb3dfaGVpZ2h0W3RpbGVfeV0gKiBwcHMtPmNvbHVtbl93aWR0aFtpXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRpbGVfeTsgaSsrKQorICAgICAgICAgICAgdmFsICs9IHNwcy0+Y3RiX3dpZHRoICogcHBzLT5yb3dfaGVpZ2h0W2ldOworCisgICAgICAgIHZhbCArPSAodGJfeSAtIHBwcy0+cm93X2JkW3RpbGVfeV0pICogcHBzLT5jb2x1bW5fd2lkdGhbdGlsZV94XSArCisgICAgICAgICAgICAgICB0Yl94IC0gcHBzLT5jb2xfYmRbdGlsZV94XTsKKworICAgICAgICBwcHMtPmN0Yl9hZGRyX3JzX3RvX3RzW2N0Yl9hZGRyX3JzXSA9IHZhbDsKKyAgICAgICAgcHBzLT5jdGJfYWRkcl90c190b19yc1t2YWxdICAgICAgICAgPSBjdGJfYWRkcl9yczsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwLCB0aWxlX2lkID0gMDsgaiA8IHBwcy0+bnVtX3RpbGVfcm93czsgaisrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1fdGlsZV9jb2x1bW5zOyBpKyssIHRpbGVfaWQrKykKKyAgICAgICAgICAgIGZvciAoeSA9IHBwcy0+cm93X2JkW2pdOyB5IDwgcHBzLT5yb3dfYmRbaiArIDFdOyB5KyspCisgICAgICAgICAgICAgICAgZm9yICh4ID0gcHBzLT5jb2xfYmRbaV07IHggPCBwcHMtPmNvbF9iZFtpICsgMV07IHgrKykKKyAgICAgICAgICAgICAgICAgICAgcHBzLT50aWxlX2lkW3Bwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbeSAqIHNwcy0+Y3RiX3dpZHRoICsgeF1dID0gdGlsZV9pZDsKKworICAgIHBwcy0+dGlsZV9wb3NfcnMgPSBhdl9tYWxsb2NfYXJyYXkodGlsZV9pZCwgc2l6ZW9mKCpwcHMtPnRpbGVfcG9zX3JzKSk7CisgICAgaWYgKCFwcHMtPnRpbGVfcG9zX3JzKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IHBwcy0+bnVtX3RpbGVfcm93czsgaisrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1fdGlsZV9jb2x1bW5zOyBpKyspCisgICAgICAgICAgICBwcHMtPnRpbGVfcG9zX3JzW2ogKiBwcHMtPm51bV90aWxlX2NvbHVtbnMgKyBpXSA9IHBwcy0+cm93X2JkW2pdICogc3BzLT5jdGJfd2lkdGggKyBwcHMtPmNvbF9iZFtpXTsKKworICAgIGxvZzJfZGlmZl9jdGJfbWluX3RiX3NpemUgPSBzcHMtPmxvZzJfY3RiX3NpemUgLSBzcHMtPmxvZzJfbWluX3RiX3NpemU7CisgICAgcHBzLT5taW5fdGJfYWRkcl96cyA9ICZwcHMtPm1pbl90Yl9hZGRyX3pzX3RhYlsxKihzcHMtPnRiX21hc2srMikrMV07CisgICAgZm9yICh5ID0gMDsgeSA8IHNwcy0+dGJfbWFzaysyOyB5KyspIHsKKyAgICAgICAgcHBzLT5taW5fdGJfYWRkcl96c190YWJbeSooc3BzLT50Yl9tYXNrKzIpXSA9IC0xOworICAgICAgICBwcHMtPm1pbl90Yl9hZGRyX3pzX3RhYlt5XSAgICA9IC0xOworICAgIH0KKyAgICBmb3IgKHkgPSAwOyB5IDwgc3BzLT50Yl9tYXNrKzE7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgc3BzLT50Yl9tYXNrKzE7IHgrKykgeworICAgICAgICAgICAgaW50IHRiX3ggICAgICAgID0geCA+PiBsb2cyX2RpZmZfY3RiX21pbl90Yl9zaXplOworICAgICAgICAgICAgaW50IHRiX3kgICAgICAgID0geSA+PiBsb2cyX2RpZmZfY3RiX21pbl90Yl9zaXplOworICAgICAgICAgICAgaW50IGN0Yl9hZGRyX3JzID0gc3BzLT5jdGJfd2lkdGggKiB0Yl95ICsgdGJfeDsKKyAgICAgICAgICAgIGludCB2YWwgICAgICAgICA9IHBwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbY3RiX2FkZHJfcnNdIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9nMl9kaWZmX2N0Yl9taW5fdGJfc2l6ZSAqIDIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxvZzJfZGlmZl9jdGJfbWluX3RiX3NpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBtID0gMSA8PCBpOworICAgICAgICAgICAgICAgIHZhbCArPSAobSAmIHggPyBtICogbSA6IDApICsgKG0gJiB5ID8gMiAqIG0gKiBtIDogMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcHMtPm1pbl90Yl9hZGRyX3pzW3kgKiAoc3BzLT50Yl9tYXNrKzIpICsgeF0gPSB2YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk92ZXJyZWFkIFBQUyBieSAlZCBiaXRzXG4iLCAtZ2V0X2JpdHNfbGVmdChnYikpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJnMtPnBwc19saXN0W3Bwc19pZF0pOworICAgIHMtPnBwc19saXN0W3Bwc19pZF0gPSBwcHNfYnVmOworCisgICAgcmV0dXJuIDA7CisKK2VycjoKKyAgICBhdl9idWZmZXJfdW5yZWYoJnBwc19idWYpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oZXZjX3JlZnMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNfcmVmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTk3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9oZXZjX3JlZnMuYwpAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIEhFVkMgdmlkZW8gZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgR3VpbGxhdW1lIE1hcnRyZXMKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgR2lsZGFzIENvY2hlcmVsCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJoZXZjLmgiCisKK3ZvaWQgZmZfaGV2Y191bnJlZl9mcmFtZShIRVZDQ29udGV4dCAqcywgSEVWQ0ZyYW1lICpmcmFtZSwgaW50IGZsYWdzKQoreworICAgIC8qIGZyYW1lLT5mcmFtZSBjYW4gYmUgTlVMTCBpZiBjb250ZXh0IGluaXQgZmFpbGVkICovCisgICAgaWYgKCFmcmFtZS0+ZnJhbWUgfHwgIWZyYW1lLT5mcmFtZS0+YnVmWzBdKQorICAgICAgICByZXR1cm47CisKKyAgICBmcmFtZS0+ZmxhZ3MgJj0gfmZsYWdzOworICAgIGlmICghZnJhbWUtPmZsYWdzKSB7CisgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihzLT5hdmN0eCwgJmZyYW1lLT50Zik7CisKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZS0+dGFiX212Zl9idWYpOworICAgICAgICBmcmFtZS0+dGFiX212ZiA9IE5VTEw7CisKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZS0+cnBsX2J1Zik7CisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmZnJhbWUtPnJwbF90YWJfYnVmKTsKKyAgICAgICAgZnJhbWUtPnJwbF90YWIgICAgPSBOVUxMOworICAgICAgICBmcmFtZS0+cmVmUGljTGlzdCA9IE5VTEw7CisKKyAgICAgICAgZnJhbWUtPmNvbGxvY2F0ZWRfcmVmID0gTlVMTDsKKyAgICB9Cit9CisKK1JlZlBpY0xpc3QgKmZmX2hldmNfZ2V0X3JlZl9saXN0KEhFVkNDb250ZXh0ICpzLCBIRVZDRnJhbWUgKnJlZiwgaW50IHgwLCBpbnQgeTApCit7CisgICAgaW50IHhfY2IgICAgICAgICA9IHgwID4+IHMtPnNwcy0+bG9nMl9jdGJfc2l6ZTsKKyAgICBpbnQgeV9jYiAgICAgICAgID0geTAgPj4gcy0+c3BzLT5sb2cyX2N0Yl9zaXplOworICAgIGludCBwaWNfd2lkdGhfY2IgPSBzLT5zcHMtPmN0Yl93aWR0aDsKKyAgICBpbnQgY3RiX2FkZHJfdHMgID0gcy0+cHBzLT5jdGJfYWRkcl9yc190b190c1t5X2NiICogcGljX3dpZHRoX2NiICsgeF9jYl07CisgICAgcmV0dXJuIChSZWZQaWNMaXN0ICopcmVmLT5ycGxfdGFiW2N0Yl9hZGRyX3RzXTsKK30KKwordm9pZCBmZl9oZXZjX2NsZWFyX3JlZnMoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykKKyAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCAmcy0+RFBCW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFVkNfRlJBTUVfRkxBR19TSE9SVF9SRUYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFVkNfRlJBTUVfRkxBR19MT05HX1JFRik7Cit9CisKK3ZvaWQgZmZfaGV2Y19mbHVzaF9kcGIoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykKKyAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCAmcy0+RFBCW2ldLCB+MCk7Cit9CisKK3N0YXRpYyBIRVZDRnJhbWUgKmFsbG9jX2ZyYW1lKEhFVkNDb250ZXh0ICpzKQoreworICAgIGludCBpLCBqLCByZXQ7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykgeworICAgICAgICBIRVZDRnJhbWUgKmZyYW1lID0gJnMtPkRQQltpXTsKKyAgICAgICAgaWYgKGZyYW1lLT5mcmFtZS0+YnVmWzBdKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIocy0+YXZjdHgsICZmcmFtZS0+dGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIGZyYW1lLT5ycGxfYnVmID0gYXZfYnVmZmVyX2FsbG9jeihzLT5uYl9uYWxzICogc2l6ZW9mKFJlZlBpY0xpc3RUYWIpKTsKKyAgICAgICAgaWYgKCFmcmFtZS0+cnBsX2J1ZikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBmcmFtZS0+dGFiX212Zl9idWYgPSBhdl9idWZmZXJfcG9vbF9nZXQocy0+dGFiX212Zl9wb29sKTsKKyAgICAgICAgaWYgKCFmcmFtZS0+dGFiX212Zl9idWYpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGZyYW1lLT50YWJfbXZmID0gKE12RmllbGQgKilmcmFtZS0+dGFiX212Zl9idWYtPmRhdGE7CisKKyAgICAgICAgZnJhbWUtPnJwbF90YWJfYnVmID0gYXZfYnVmZmVyX3Bvb2xfZ2V0KHMtPnJwbF90YWJfcG9vbCk7CisgICAgICAgIGlmICghZnJhbWUtPnJwbF90YWJfYnVmKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBmcmFtZS0+cnBsX3RhYiAgID0gKFJlZlBpY0xpc3RUYWIgKiopZnJhbWUtPnJwbF90YWJfYnVmLT5kYXRhOworICAgICAgICBmcmFtZS0+Y3RiX2NvdW50ID0gcy0+c3BzLT5jdGJfd2lkdGggKiBzLT5zcHMtPmN0Yl9oZWlnaHQ7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmcmFtZS0+Y3RiX2NvdW50OyBqKyspCisgICAgICAgICAgICBmcmFtZS0+cnBsX3RhYltqXSA9IChSZWZQaWNMaXN0VGFiICopZnJhbWUtPnJwbF9idWYtPmRhdGE7CisKKyAgICAgICAgZnJhbWUtPmZyYW1lLT50b3BfZmllbGRfZmlyc3QgID0gcy0+cGljdHVyZV9zdHJ1Y3QgPT0gQVZfUElDVFVSRV9TVFJVQ1RVUkVfVE9QX0ZJRUxEOworICAgICAgICBmcmFtZS0+ZnJhbWUtPmludGVybGFjZWRfZnJhbWUgPSAocy0+cGljdHVyZV9zdHJ1Y3QgPT0gQVZfUElDVFVSRV9TVFJVQ1RVUkVfVE9QX0ZJRUxEKSB8fCAocy0+cGljdHVyZV9zdHJ1Y3QgPT0gQVZfUElDVFVSRV9TVFJVQ1RVUkVfQk9UVE9NX0ZJRUxEKTsKKyAgICAgICAgcmV0dXJuIGZyYW1lOworZmFpbDoKKyAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCBmcmFtZSwgfjApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIGZyYW1lLCBEUEIgZnVsbC5cbiIpOworICAgIHJldHVybiBOVUxMOworfQorCitpbnQgZmZfaGV2Y19zZXRfbmV3X3JlZihIRVZDQ29udGV4dCAqcywgQVZGcmFtZSAqKmZyYW1lLCBpbnQgcG9jKQoreworICAgIEhFVkNGcmFtZSAqcmVmOworICAgIGludCBpOworCisgICAgLyogY2hlY2sgdGhhdCB0aGlzIFBPQyBkb2Vzbid0IGFscmVhZHkgZXhpc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+RFBCKTsgaSsrKSB7CisgICAgICAgIEhFVkNGcmFtZSAqZnJhbWUgPSAmcy0+RFBCW2ldOworCisgICAgICAgIGlmIChmcmFtZS0+ZnJhbWUtPmJ1ZlswXSAmJiBmcmFtZS0+c2VxdWVuY2UgPT0gcy0+c2VxX2RlY29kZSAmJgorICAgICAgICAgICAgZnJhbWUtPnBvYyA9PSBwb2MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRHVwbGljYXRlIFBPQyBpbiBhIHNlcXVlbmNlOiAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgcG9jKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgcmVmID0gYWxsb2NfZnJhbWUocyk7CisgICAgaWYgKCFyZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAqZnJhbWUgPSByZWYtPmZyYW1lOworICAgIHMtPnJlZiA9IHJlZjsKKworICAgIGlmIChzLT5zaC5waWNfb3V0cHV0X2ZsYWcpCisgICAgICAgIHJlZi0+ZmxhZ3MgPSBIRVZDX0ZSQU1FX0ZMQUdfT1VUUFVUIHwgSEVWQ19GUkFNRV9GTEFHX1NIT1JUX1JFRjsKKyAgICBlbHNlCisgICAgICAgIHJlZi0+ZmxhZ3MgPSBIRVZDX0ZSQU1FX0ZMQUdfU0hPUlRfUkVGOworCisgICAgcmVmLT5wb2MgICAgICA9IHBvYzsKKyAgICByZWYtPnNlcXVlbmNlID0gcy0+c2VxX2RlY29kZTsKKyAgICByZWYtPndpbmRvdyAgID0gcy0+c3BzLT5vdXRwdXRfd2luZG93OworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9oZXZjX291dHB1dF9mcmFtZShIRVZDQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0LCBpbnQgZmx1c2gpCit7CisgICAgZG8geworICAgICAgICBpbnQgbmJfb3V0cHV0ID0gMDsKKyAgICAgICAgaW50IG1pbl9wb2MgICA9IElOVF9NQVg7CisgICAgICAgIGludCBpLCBtaW5faWR4LCByZXQ7CisKKyAgICAgICAgaWYgKHMtPnNoLm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgPT0gMSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykgeworICAgICAgICAgICAgICAgIEhFVkNGcmFtZSAqZnJhbWUgPSAmcy0+RFBCW2ldOworICAgICAgICAgICAgICAgIGlmICghKGZyYW1lLT5mbGFncyAmIEhFVkNfRlJBTUVfRkxBR19CVU1QSU5HKSAmJiBmcmFtZS0+cG9jICE9IHMtPnBvYyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNlcXVlbmNlID09IHMtPnNlcV9vdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCBmcmFtZSwgSEVWQ19GUkFNRV9GTEFHX09VVFBVVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykgeworICAgICAgICAgICAgSEVWQ0ZyYW1lICpmcmFtZSA9ICZzLT5EUEJbaV07CisgICAgICAgICAgICBpZiAoKGZyYW1lLT5mbGFncyAmIEhFVkNfRlJBTUVfRkxBR19PVVRQVVQpICYmCisgICAgICAgICAgICAgICAgZnJhbWUtPnNlcXVlbmNlID09IHMtPnNlcV9vdXRwdXQpIHsKKyAgICAgICAgICAgICAgICBuYl9vdXRwdXQrKzsKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWUtPnBvYyA8IG1pbl9wb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluX3BvYyA9IGZyYW1lLT5wb2M7CisgICAgICAgICAgICAgICAgICAgIG1pbl9pZHggPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHdhaXQgZm9yIG1vcmUgZnJhbWVzIGJlZm9yZSBvdXRwdXQgKi8KKyAgICAgICAgaWYgKCFmbHVzaCAmJiBzLT5zZXFfb3V0cHV0ID09IHMtPnNlcV9kZWNvZGUgJiYgcy0+c3BzICYmCisgICAgICAgICAgICBuYl9vdXRwdXQgPD0gcy0+c3BzLT50ZW1wb3JhbF9sYXllcltzLT5zcHMtPm1heF9zdWJfbGF5ZXJzIC0gMV0ubnVtX3Jlb3JkZXJfcGljcykKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChuYl9vdXRwdXQpIHsKKyAgICAgICAgICAgIEhFVkNGcmFtZSAqZnJhbWUgPSAmcy0+RFBCW21pbl9pZHhdOworICAgICAgICAgICAgQVZGcmFtZSAqZHN0ID0gb3V0OworICAgICAgICAgICAgQVZGcmFtZSAqc3JjID0gZnJhbWUtPmZyYW1lOworICAgICAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzcmMtPmZvcm1hdCk7CisgICAgICAgICAgICBpbnQgcGl4ZWxfc2hpZnQgPSAhIShkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSA+IDcpOworCisgICAgICAgICAgICByZXQgPSBhdl9mcmFtZV9yZWYob3V0LCBzcmMpOworICAgICAgICAgICAgaWYgKGZyYW1lLT5mbGFncyAmIEhFVkNfRlJBTUVfRkxBR19CVU1QSU5HKQorICAgICAgICAgICAgICAgIGZmX2hldmNfdW5yZWZfZnJhbWUocywgZnJhbWUsIEhFVkNfRlJBTUVfRkxBR19PVVRQVVQgfCBIRVZDX0ZSQU1FX0ZMQUdfQlVNUElORyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCBmcmFtZSwgSEVWQ19GUkFNRV9GTEFHX09VVFBVVCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGhzaGlmdCA9IChpID4gMCkgPyBkZXNjLT5sb2cyX2Nocm9tYV93IDogMDsKKyAgICAgICAgICAgICAgICBpbnQgdnNoaWZ0ID0gKGkgPiAwKSA/IGRlc2MtPmxvZzJfY2hyb21hX2ggOiAwOworICAgICAgICAgICAgICAgIGludCBvZmYgPSAoKGZyYW1lLT53aW5kb3cubGVmdF9vZmZzZXQgPj4gaHNoaWZ0KSA8PCBwaXhlbF9zaGlmdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWUtPndpbmRvdy50b3Bfb2Zmc2V0ICAgPj4gdnNoaWZ0KSAqIGRzdC0+bGluZXNpemVbaV07CisgICAgICAgICAgICAgICAgZHN0LT5kYXRhW2ldICs9IG9mZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJPdXRwdXQgZnJhbWUgd2l0aCBQT0MgJWQuXG4iLCBmcmFtZS0+cG9jKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnNlcV9vdXRwdXQgIT0gcy0+c2VxX2RlY29kZSkKKyAgICAgICAgICAgIHMtPnNlcV9vdXRwdXQgPSAocy0+c2VxX291dHB1dCArIDEpICYgMHhmZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfSB3aGlsZSAoMSk7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl9oZXZjX2J1bXBfZnJhbWUoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgaW50IGRwYiA9IDA7CisgICAgaW50IG1pbl9wb2MgPSBJTlRfTUFYOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykgeworICAgICAgICBIRVZDRnJhbWUgKmZyYW1lID0gJnMtPkRQQltpXTsKKyAgICAgICAgaWYgKChmcmFtZS0+ZmxhZ3MpICYmCisgICAgICAgICAgICBmcmFtZS0+c2VxdWVuY2UgPT0gcy0+c2VxX291dHB1dCAmJgorICAgICAgICAgICAgZnJhbWUtPnBvYyAhPSBzLT5wb2MpIHsKKyAgICAgICAgICAgIGRwYisrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPnNwcyAmJiBkcGIgPj0gcy0+c3BzLT50ZW1wb3JhbF9sYXllcltzLT5zcHMtPm1heF9zdWJfbGF5ZXJzIC0gMV0ubWF4X2RlY19waWNfYnVmZmVyaW5nKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5EUEIpOyBpKyspIHsKKyAgICAgICAgICAgIEhFVkNGcmFtZSAqZnJhbWUgPSAmcy0+RFBCW2ldOworICAgICAgICAgICAgaWYgKChmcmFtZS0+ZmxhZ3MpICYmCisgICAgICAgICAgICAgICAgZnJhbWUtPnNlcXVlbmNlID09IHMtPnNlcV9vdXRwdXQgJiYKKyAgICAgICAgICAgICAgICBmcmFtZS0+cG9jICE9IHMtPnBvYykgeworICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+ZmxhZ3MgPT0gSEVWQ19GUkFNRV9GTEFHX09VVFBVVCAmJiBmcmFtZS0+cG9jIDwgbWluX3BvYykgeworICAgICAgICAgICAgICAgICAgICBtaW5fcG9jID0gZnJhbWUtPnBvYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+RFBCKTsgaSsrKSB7CisgICAgICAgICAgICBIRVZDRnJhbWUgKmZyYW1lID0gJnMtPkRQQltpXTsKKyAgICAgICAgICAgIGlmIChmcmFtZS0+ZmxhZ3MgJiBIRVZDX0ZSQU1FX0ZMQUdfT1VUUFVUICYmCisgICAgICAgICAgICAgICAgZnJhbWUtPnNlcXVlbmNlID09IHMtPnNlcV9vdXRwdXQgJiYKKyAgICAgICAgICAgICAgICBmcmFtZS0+cG9jIDw9IG1pbl9wb2MpIHsKKyAgICAgICAgICAgICAgICBmcmFtZS0+ZmxhZ3MgfD0gSEVWQ19GUkFNRV9GTEFHX0JVTVBJTkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkcGItLTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9zbGljZV9ycGwoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgSEVWQ0ZyYW1lICpmcmFtZSA9IHMtPnJlZjsKKyAgICBpbnQgY3RiX2NvdW50ICAgID0gZnJhbWUtPmN0Yl9jb3VudDsKKyAgICBpbnQgY3RiX2FkZHJfdHMgID0gcy0+cHBzLT5jdGJfYWRkcl9yc190b190c1tzLT5zaC5zbGljZV9zZWdtZW50X2FkZHJdOworICAgIGludCBpOworCisgICAgaWYgKHMtPnNsaWNlX2lkeCA+PSBmcmFtZS0+cnBsX2J1Zi0+c2l6ZSAvIHNpemVvZihSZWZQaWNMaXN0VGFiKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBmb3IgKGkgPSBjdGJfYWRkcl90czsgaSA8IGN0Yl9jb3VudDsgaSsrKQorICAgICAgICBmcmFtZS0+cnBsX3RhYltpXSA9IChSZWZQaWNMaXN0VGFiICopZnJhbWUtPnJwbF9idWYtPmRhdGEgKyBzLT5zbGljZV9pZHg7CisKKyAgICBmcmFtZS0+cmVmUGljTGlzdCA9IChSZWZQaWNMaXN0ICopZnJhbWUtPnJwbF90YWJbY3RiX2FkZHJfdHNdOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9oZXZjX3NsaWNlX3JwbChIRVZDQ29udGV4dCAqcykKK3sKKyAgICBTbGljZUhlYWRlciAqc2ggPSAmcy0+c2g7CisKKyAgICB1aW50OF90IG5iX2xpc3QgPSBzaC0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFID8gMiA6IDE7CisgICAgdWludDhfdCBsaXN0X2lkeDsKKyAgICBpbnQgaSwgaiwgcmV0OworCisgICAgcmV0ID0gaW5pdF9zbGljZV9ycGwocyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIShzLT5ycHNbU1RfQ1VSUl9CRUZdLm5iX3JlZnMgKyBzLT5ycHNbU1RfQ1VSUl9BRlRdLm5iX3JlZnMgKworICAgICAgICAgIHMtPnJwc1tMVF9DVVJSXS5uYl9yZWZzKSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlplcm8gcmVmcyBpbiB0aGUgZnJhbWUgUlBTLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZvciAobGlzdF9pZHggPSAwOyBsaXN0X2lkeCA8IG5iX2xpc3Q7IGxpc3RfaWR4KyspIHsKKyAgICAgICAgUmVmUGljTGlzdCAgcnBsX3RtcCA9IHsgeyAwIH0gfTsKKyAgICAgICAgUmVmUGljTGlzdCAqcnBsICAgICA9ICZzLT5yZWYtPnJlZlBpY0xpc3RbbGlzdF9pZHhdOworCisgICAgICAgIC8qIFRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaXMKKyAgICAgICAgICogU1RfQ1VSUl9CRUYgLSBTVF9DVVJSX0FGVCAtIExUX0NVUlIgZm9yIHRoZSBMMCBhbmQKKyAgICAgICAgICogU1RfQ1VSUl9BRlQgLSBTVF9DVVJSX0JFRiAtIExUX0NVUlIgZm9yIHRoZSBMMSAqLworICAgICAgICBpbnQgY2FuZF9saXN0c1szXSA9IHsgbGlzdF9pZHggPyBTVF9DVVJSX0FGVCA6IFNUX0NVUlJfQkVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZHggPyBTVF9DVVJSX0JFRiA6IFNUX0NVUlJfQUZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRfQ1VSUiB9OworCisgICAgICAgIC8qIGNvbmNhdGVuYXRlIHRoZSBjYW5kaWRhdGUgbGlzdHMgZm9yIHRoZSBjdXJyZW50IGZyYW1lICovCisgICAgICAgIHdoaWxlIChycGxfdG1wLm5iX3JlZnMgPCBzaC0+bmJfcmVmc1tsaXN0X2lkeF0pIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjYW5kX2xpc3RzKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgUmVmUGljTGlzdCAqcnBzID0gJnMtPnJwc1tjYW5kX2xpc3RzW2ldXTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcnBzLT5uYl9yZWZzICYmIHJwbF90bXAubmJfcmVmcyA8IE1BWF9SRUZTOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcnBsX3RtcC5saXN0W3JwbF90bXAubmJfcmVmc10gICAgICAgPSBycHMtPmxpc3Rbal07CisgICAgICAgICAgICAgICAgICAgIHJwbF90bXAucmVmW3JwbF90bXAubmJfcmVmc10gICAgICAgID0gcnBzLT5yZWZbal07CisgICAgICAgICAgICAgICAgICAgIHJwbF90bXAuaXNMb25nVGVybVtycGxfdG1wLm5iX3JlZnNdID0gaSA9PSAyOworICAgICAgICAgICAgICAgICAgICBycGxfdG1wLm5iX3JlZnMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiByZW9yZGVyIHRoZSByZWZlcmVuY2VzIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICBpZiAoc2gtPnJwbF9tb2RpZmljYXRpb25fZmxhZ1tsaXN0X2lkeF0pIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaC0+bmJfcmVmc1tsaXN0X2lkeF07IGkrKykgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBzaC0+bGlzdF9lbnRyeV9seFtsaXN0X2lkeF1baV07CisKKyAgICAgICAgICAgICAgICBpZiAoaWR4ID49IHJwbF90bXAubmJfcmVmcykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcmVmZXJlbmNlIGluZGV4LlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJwbC0+bGlzdFtpXSAgICAgICA9IHJwbF90bXAubGlzdFtpZHhdOworICAgICAgICAgICAgICAgIHJwbC0+cmVmW2ldICAgICAgICA9IHJwbF90bXAucmVmW2lkeF07CisgICAgICAgICAgICAgICAgcnBsLT5pc0xvbmdUZXJtW2ldID0gcnBsX3RtcC5pc0xvbmdUZXJtW2lkeF07CisgICAgICAgICAgICAgICAgcnBsLT5uYl9yZWZzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkocnBsLCAmcnBsX3RtcCwgc2l6ZW9mKCpycGwpKTsKKyAgICAgICAgICAgIHJwbC0+bmJfcmVmcyA9IEZGTUlOKHJwbC0+bmJfcmVmcywgc2gtPm5iX3JlZnNbbGlzdF9pZHhdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaC0+Y29sbG9jYXRlZF9saXN0ID09IGxpc3RfaWR4ICYmCisgICAgICAgICAgICBzaC0+Y29sbG9jYXRlZF9yZWZfaWR4IDwgcnBsLT5uYl9yZWZzKQorICAgICAgICAgICAgcy0+cmVmLT5jb2xsb2NhdGVkX3JlZiA9IHJwbC0+cmVmW3NoLT5jb2xsb2NhdGVkX3JlZl9pZHhdOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgSEVWQ0ZyYW1lICpmaW5kX3JlZl9pZHgoSEVWQ0NvbnRleHQgKnMsIGludCBwb2MpCit7CisgICAgaW50IGk7CisgICAgaW50IEx0TWFzayA9ICgxIDw8IHMtPnNwcy0+bG9nMl9tYXhfcG9jX2xzYikgLSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykgeworICAgICAgICBIRVZDRnJhbWUgKnJlZiA9ICZzLT5EUEJbaV07CisgICAgICAgIGlmIChyZWYtPmZyYW1lLT5idWZbMF0gJiYgKHJlZi0+c2VxdWVuY2UgPT0gcy0+c2VxX2RlY29kZSkpIHsKKyAgICAgICAgICAgIGlmICgocmVmLT5wb2MgJiBMdE1hc2spID09IHBvYykKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVmOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykgeworICAgICAgICBIRVZDRnJhbWUgKnJlZiA9ICZzLT5EUEJbaV07CisgICAgICAgIGlmIChyZWYtPmZyYW1lLT5idWZbMF0gJiYgcmVmLT5zZXF1ZW5jZSA9PSBzLT5zZXFfZGVjb2RlKSB7CisgICAgICAgICAgICBpZiAocmVmLT5wb2MgPT0gcG9jIHx8IChyZWYtPnBvYyAmIEx0TWFzaykgPT0gcG9jKQorICAgICAgICAgICAgICAgIHJldHVybiByZWY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIHJlZiB3aXRoIFBPQyAlZFxuIiwgcG9jKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgbWFya19yZWYoSEVWQ0ZyYW1lICpmcmFtZSwgaW50IGZsYWcpCit7CisgICAgZnJhbWUtPmZsYWdzICY9IH4oSEVWQ19GUkFNRV9GTEFHX0xPTkdfUkVGIHwgSEVWQ19GUkFNRV9GTEFHX1NIT1JUX1JFRik7CisgICAgZnJhbWUtPmZsYWdzIHw9IGZsYWc7Cit9CisKK3N0YXRpYyBIRVZDRnJhbWUgKmdlbmVyYXRlX21pc3NpbmdfcmVmKEhFVkNDb250ZXh0ICpzLCBpbnQgcG9jKQoreworICAgIEhFVkNGcmFtZSAqZnJhbWU7CisgICAgaW50IGksIHgsIHk7CisKKyAgICBmcmFtZSA9IGFsbG9jX2ZyYW1lKHMpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFzLT5zcHMtPnBpeGVsX3NoaWZ0KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGZyYW1lLT5mcmFtZS0+YnVmW2ldOyBpKyspCisgICAgICAgICAgICBtZW1zZXQoZnJhbWUtPmZyYW1lLT5idWZbaV0tPmRhdGEsIDEgPDwgKHMtPnNwcy0+Yml0X2RlcHRoIC0gMSksCisgICAgICAgICAgICAgICAgICAgZnJhbWUtPmZyYW1lLT5idWZbaV0tPnNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGZyYW1lLT5mcmFtZS0+ZGF0YVtpXTsgaSsrKQorICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IChzLT5zcHMtPmhlaWdodCA+PiBzLT5zcHMtPnZzaGlmdFtpXSk7IHkrKykKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgKHMtPnNwcy0+d2lkdGggPj4gcy0+c3BzLT5oc2hpZnRbaV0pOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfV04xNihmcmFtZS0+ZnJhbWUtPmRhdGFbaV0gKyB5ICogZnJhbWUtPmZyYW1lLT5saW5lc2l6ZVtpXSArIDIgKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgKHMtPnNwcy0+Yml0X2RlcHRoIC0gMSkpOworICAgICAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmFtZS0+cG9jICAgICAgPSBwb2M7CisgICAgZnJhbWUtPnNlcXVlbmNlID0gcy0+c2VxX2RlY29kZTsKKyAgICBmcmFtZS0+ZmxhZ3MgICAgPSAwOworCisgICAgaWYgKHMtPnRocmVhZHNfdHlwZSA9PSBGRl9USFJFQURfRlJBTUUpCisgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJmZyYW1lLT50ZiwgSU5UX01BWCwgMCk7CisKKyAgICByZXR1cm4gZnJhbWU7Cit9CisKKy8qIGFkZCBhIHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBwb2MgdG8gdGhlIGxpc3QgYW5kIG1hcmsgaXQgYXMgdXNlZCBpbiBEUEIgKi8KK3N0YXRpYyBpbnQgYWRkX2NhbmRpZGF0ZV9yZWYoSEVWQ0NvbnRleHQgKnMsIFJlZlBpY0xpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb2MsIGludCByZWZfZmxhZykKK3sKKyAgICBIRVZDRnJhbWUgKnJlZiA9IGZpbmRfcmVmX2lkeChzLCBwb2MpOworCisgICAgaWYgKHJlZiA9PSBzLT5yZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKCFyZWYpIHsKKyAgICAgICAgcmVmID0gZ2VuZXJhdGVfbWlzc2luZ19yZWYocywgcG9jKTsKKyAgICAgICAgaWYgKCFyZWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGxpc3QtPmxpc3RbbGlzdC0+bmJfcmVmc10gPSByZWYtPnBvYzsKKyAgICBsaXN0LT5yZWZbbGlzdC0+bmJfcmVmc10gID0gcmVmOworICAgIGxpc3QtPm5iX3JlZnMrKzsKKworICAgIG1hcmtfcmVmKHJlZiwgcmVmX2ZsYWcpOworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfaGV2Y19mcmFtZV9ycHMoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgY29uc3QgU2hvcnRUZXJtUlBTICpzaG9ydF9ycHMgPSBzLT5zaC5zaG9ydF90ZXJtX3JwczsKKyAgICBjb25zdCBMb25nVGVybVJQUyAgKmxvbmdfcnBzICA9ICZzLT5zaC5sb25nX3Rlcm1fcnBzOworICAgIFJlZlBpY0xpc3QgICAgICAgICAgICAgICAqcnBzID0gcy0+cnBzOworICAgIGludCBpLCByZXQ7CisKKyAgICBpZiAoIXNob3J0X3JwcykgeworICAgICAgICBycHNbMF0ubmJfcmVmcyA9IHJwc1sxXS5uYl9yZWZzID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogY2xlYXIgdGhlIHJlZmVyZW5jZSBmbGFncyBvbiBhbGwgZnJhbWVzIGV4Y2VwdCB0aGUgY3VycmVudCBvbmUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+RFBCKTsgaSsrKSB7CisgICAgICAgIEhFVkNGcmFtZSAqZnJhbWUgPSAmcy0+RFBCW2ldOworCisgICAgICAgIGlmIChmcmFtZSA9PSBzLT5yZWYpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBtYXJrX3JlZihmcmFtZSwgMCk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE5CX1JQU19UWVBFOyBpKyspCisgICAgICAgIHJwc1tpXS5uYl9yZWZzID0gMDsKKworICAgIC8qIGFkZCB0aGUgc2hvcnQgcmVmcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzaG9ydF9ycHMtPm51bV9kZWx0YV9wb2NzOyBpKyspIHsKKyAgICAgICAgaW50IHBvYyA9IHMtPnBvYyArIHNob3J0X3Jwcy0+ZGVsdGFfcG9jW2ldOworICAgICAgICBpbnQgbGlzdDsKKworICAgICAgICBpZiAoIXNob3J0X3Jwcy0+dXNlZFtpXSkKKyAgICAgICAgICAgIGxpc3QgPSBTVF9GT0xMOworICAgICAgICBlbHNlIGlmIChpIDwgc2hvcnRfcnBzLT5udW1fbmVnYXRpdmVfcGljcykKKyAgICAgICAgICAgIGxpc3QgPSBTVF9DVVJSX0JFRjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGlzdCA9IFNUX0NVUlJfQUZUOworCisgICAgICAgIHJldCA9IGFkZF9jYW5kaWRhdGVfcmVmKHMsICZycHNbbGlzdF0sIHBvYywgSEVWQ19GUkFNRV9GTEFHX1NIT1JUX1JFRik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBhZGQgdGhlIGxvbmcgcmVmcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsb25nX3Jwcy0+bmJfcmVmczsgaSsrKSB7CisgICAgICAgIGludCBwb2MgID0gbG9uZ19ycHMtPnBvY1tpXTsKKyAgICAgICAgaW50IGxpc3QgPSBsb25nX3Jwcy0+dXNlZFtpXSA/IExUX0NVUlIgOiBMVF9GT0xMOworCisgICAgICAgIHJldCA9IGFkZF9jYW5kaWRhdGVfcmVmKHMsICZycHNbbGlzdF0sIHBvYywgSEVWQ19GUkFNRV9GTEFHX0xPTkdfUkVGKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIHJlbGVhc2UgYW55IGZyYW1lcyB0aGF0IGFyZSBub3cgdW51c2VkICovCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykKKyAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCAmcy0+RFBCW2ldLCAwKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfaGV2Y19jb21wdXRlX3BvYyhIRVZDQ29udGV4dCAqcywgaW50IHBvY19sc2IpCit7CisgICAgaW50IG1heF9wb2NfbHNiICA9IDEgPDwgcy0+c3BzLT5sb2cyX21heF9wb2NfbHNiOworICAgIGludCBwcmV2X3BvY19sc2IgPSBzLT5wb2NUaWQwICUgbWF4X3BvY19sc2I7CisgICAgaW50IHByZXZfcG9jX21zYiA9IHMtPnBvY1RpZDAgLSBwcmV2X3BvY19sc2I7CisgICAgaW50IHBvY19tc2I7CisKKyAgICBpZiAocG9jX2xzYiA8IHByZXZfcG9jX2xzYiAmJiBwcmV2X3BvY19sc2IgLSBwb2NfbHNiID49IG1heF9wb2NfbHNiIC8gMikKKyAgICAgICAgcG9jX21zYiA9IHByZXZfcG9jX21zYiArIG1heF9wb2NfbHNiOworICAgIGVsc2UgaWYgKHBvY19sc2IgPiBwcmV2X3BvY19sc2IgJiYgcG9jX2xzYiAtIHByZXZfcG9jX2xzYiA+IG1heF9wb2NfbHNiIC8gMikKKyAgICAgICAgcG9jX21zYiA9IHByZXZfcG9jX21zYiAtIG1heF9wb2NfbHNiOworICAgIGVsc2UKKyAgICAgICAgcG9jX21zYiA9IHByZXZfcG9jX21zYjsKKworICAgIC8vIEZvciBCTEEgcGljdHVyZSB0eXBlcywgUE9DbXNiIGlzIHNldCB0byAwLgorICAgIGlmIChzLT5uYWxfdW5pdF90eXBlID09IE5BTF9CTEFfV19MUCAgIHx8CisgICAgICAgIHMtPm5hbF91bml0X3R5cGUgPT0gTkFMX0JMQV9XX1JBREwgfHwKKyAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfQkxBX05fTFApCisgICAgICAgIHBvY19tc2IgPSAwOworCisgICAgcmV0dXJuIHBvY19tc2IgKyBwb2NfbHNiOworfQorCitpbnQgZmZfaGV2Y19mcmFtZV9uYl9yZWZzKEhFVkNDb250ZXh0ICpzKQoreworICAgIGludCByZXQgPSAwOworICAgIGludCBpOworICAgIGNvbnN0IFNob3J0VGVybVJQUyAqcnBzID0gcy0+c2guc2hvcnRfdGVybV9ycHM7CisgICAgTG9uZ1Rlcm1SUFMgKmxvbmdfcnBzICAgPSAmcy0+c2gubG9uZ190ZXJtX3JwczsKKworICAgIGlmIChycHMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJwcy0+bnVtX25lZ2F0aXZlX3BpY3M7IGkrKykKKyAgICAgICAgICAgIHJldCArPSAhIXJwcy0+dXNlZFtpXTsKKyAgICAgICAgZm9yICg7IGkgPCBycHMtPm51bV9kZWx0YV9wb2NzOyBpKyspCisgICAgICAgICAgICByZXQgKz0gISFycHMtPnVzZWRbaV07CisgICAgfQorCisgICAgaWYgKGxvbmdfcnBzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsb25nX3Jwcy0+bmJfcmVmczsgaSsrKQorICAgICAgICAgICAgcmV0ICs9ICEhbG9uZ19ycHMtPnVzZWRbaV07CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oZXZjX3NlaS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Y19zZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmI1YzkwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Y19zZWkuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIEhFVkMgU3VwcGxlbWVudGFyeSBFbmhhbmNlbWVudCBJbmZvcm1hdGlvbiBtZXNzYWdlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgR3VpbGxhdW1lIE1hcnRyZXMKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgR2lsZGFzIENvY2hlcmVsCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVml0dG9yaW8gR2lvdmFyYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaGV2Yy5oIgorCitzdGF0aWMgdm9pZCBkZWNvZGVfbmFsX3NlaV9kZWNvZGVkX3BpY3R1cmVfaGFzaChIRVZDQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY0lkeCwgaTsKKyAgICB1aW50OF90IGhhc2hfdHlwZTsKKyAgICAvL3VpbnQxNl90IHBpY3R1cmVfY3JjOworICAgIC8vdWludDMyX3QgcGljdHVyZV9jaGVja3N1bTsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5IRVZDbGMtPmdiOworICAgIGhhc2hfdHlwZSA9IGdldF9iaXRzKGdiLCA4KTsKKworICAgIGZvciAoY0lkeCA9IDA7IGNJZHggPCAzLyooKHMtPnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMCkgPyAxIDogMykqLzsgY0lkeCsrKSB7CisgICAgICAgIGlmIChoYXNoX3R5cGUgPT0gMCkgeworICAgICAgICAgICAgcy0+aXNfbWQ1ID0gMTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgICAgIHMtPm1kNVtjSWR4XVtpXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgfSBlbHNlIGlmIChoYXNoX3R5cGUgPT0gMSkgeworICAgICAgICAgICAgLy8gcGljdHVyZV9jcmMgPSBnZXRfYml0cyhnYiwgMTYpOworICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxNik7CisgICAgICAgIH0gZWxzZSBpZiAoaGFzaF90eXBlID09IDIpIHsKKyAgICAgICAgICAgIC8vIHBpY3R1cmVfY2hlY2tzdW0gPSBnZXRfYml0c19sb25nKGdiLCAzMik7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDMyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX25hbF9zZWlfZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudChIRVZDQ29udGV4dCAqcykKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5IRVZDbGMtPmdiOworCisgICAgZ2V0X3VlX2dvbG9tYihnYik7ICAgICAgICAgICAgICAgICAgLy8gZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9pZAorICAgIHMtPnNlaV9mcmFtZV9wYWNraW5nX3ByZXNlbnQgPSAhZ2V0X2JpdHMxKGdiKTsKKworICAgIGlmIChzLT5zZWlfZnJhbWVfcGFja2luZ19wcmVzZW50KSB7CisgICAgICAgIHMtPmZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfdHlwZSA9IGdldF9iaXRzKGdiLCA3KTsKKyAgICAgICAgcy0+cXVpbmN1bnhfc3Vic2FtcGxpbmcgICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgcy0+Y29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlICAgID0gZ2V0X2JpdHMoZ2IsIDYpOworCisgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgc2tpcHMgc3BhdGlhbF9mbGlwcGluZ19mbGFnIGZyYW1lMF9mbGlwcGVkX2ZsYWcKKyAgICAgICAgLy8gZmllbGRfdmlld3NfZmxhZyBjdXJyZW50X2ZyYW1lX2lzX2ZyYW1lMF9mbGFnCisgICAgICAgIC8vIGZyYW1lMF9zZWxmX2NvbnRhaW5lZF9mbGFnIGZyYW1lMV9zZWxmX2NvbnRhaW5lZF9mbGFnCisgICAgICAgIHNraXBfYml0cyhnYiwgNik7CisKKyAgICAgICAgaWYgKCFzLT5xdWluY3VueF9zdWJzYW1wbGluZyAmJiBzLT5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUgIT0gNSkKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTYpOyAgLy8gZnJhbWVbMDFdX2dyaWRfcG9zaXRpb25fW3h5XQorICAgICAgICBza2lwX2JpdHMoZ2IsIDgpOyAgICAgICAvLyBmcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3Jlc2VydmVkX2J5dGUKKyAgICAgICAgc2tpcF9iaXRzMShnYik7ICAgICAgICAgLy8gZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9wZXJzaXN0YW5jZV9mbGFnCisgICAgfQorICAgIHNraXBfYml0czEoZ2IpOyAgICAgICAgICAgICAvLyB1cHNhbXBsZWRfYXNwZWN0X3JhdGlvX2ZsYWcKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX25hbF9zZWlfZGlzcGxheV9vcmllbnRhdGlvbihIRVZDQ29udGV4dCAqcykKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5IRVZDbGMtPmdiOworCisgICAgcy0+c2VpX2Rpc3BsYXlfb3JpZW50YXRpb25fcHJlc2VudCA9ICFnZXRfYml0czEoZ2IpOworCisgICAgaWYgKHMtPnNlaV9kaXNwbGF5X29yaWVudGF0aW9uX3ByZXNlbnQpIHsKKyAgICAgICAgcy0+c2VpX2hmbGlwID0gZ2V0X2JpdHMxKGdiKTsgICAgIC8vIGhvcl9mbGlwCisgICAgICAgIHMtPnNlaV92ZmxpcCA9IGdldF9iaXRzMShnYik7ICAgICAvLyB2ZXJfZmxpcAorCisgICAgICAgIHMtPnNlaV9hbnRpY2xvY2t3aXNlX3JvdGF0aW9uID0gZ2V0X2JpdHMoZ2IsIDE2KTsKKyAgICAgICAgc2tpcF9iaXRzMShnYik7ICAgICAvLyBkaXNwbGF5X29yaWVudGF0aW9uX3BlcnNpc3RlbmNlX2ZsYWcKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3BpY190aW1pbmcoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKKyAgICBIRVZDU1BTICpzcHM7CisKKyAgICBpZiAoIXMtPnNwc19saXN0W3MtPmFjdGl2ZV9zZXFfcGFyYW1ldGVyX3NldF9pZF0pCisgICAgICAgIHJldHVybihBVkVSUk9SKEVOT01FTSkpOworICAgIHNwcyA9IChIRVZDU1BTKilzLT5zcHNfbGlzdFtzLT5hY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWRdLT5kYXRhOworCisgICAgaWYgKHNwcy0+dnVpLmZyYW1lX2ZpZWxkX2luZm9fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIGludCBwaWNfc3RydWN0ID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBzLT5waWN0dXJlX3N0cnVjdCA9IEFWX1BJQ1RVUkVfU1RSVUNUVVJFX1VOS05PV047CisgICAgICAgIGlmIChwaWNfc3RydWN0ID09IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiQk9UVE9NIEZpZWxkXG4iKTsKKyAgICAgICAgICAgIHMtPnBpY3R1cmVfc3RydWN0ID0gQVZfUElDVFVSRV9TVFJVQ1RVUkVfQk9UVE9NX0ZJRUxEOworICAgICAgICB9IGVsc2UgaWYgKHBpY19zdHJ1Y3QgPT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJUT1AgRmllbGRcbiIpOworICAgICAgICAgICAgcy0+cGljdHVyZV9zdHJ1Y3QgPSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9UT1BfRklFTEQ7CisgICAgICAgIH0KKyAgICAgICAgZ2V0X2JpdHMoZ2IsIDIpOyAgICAgICAgICAgICAgICAgICAvLyBzb3VyY2Vfc2Nhbl90eXBlCisgICAgICAgIGdldF9iaXRzKGdiLCAxKTsgICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlX2ZsYWcKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYWN0aXZlX3BhcmFtZXRlcl9zZXRzKEhFVkNDb250ZXh0ICpzKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPkhFVkNsYy0+Z2I7CisgICAgaW50IG51bV9zcHNfaWRzX21pbnVzMTsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBhY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWQ7CisKKyAgICBnZXRfYml0cyhnYiwgNCk7IC8vIGFjdGl2ZV92aWRlb19wYXJhbWV0ZXJfc2V0X2lkCisgICAgZ2V0X2JpdHMoZ2IsIDEpOyAvLyBzZWxmX2NvbnRhaW5lZF9jdnNfZmxhZworICAgIGdldF9iaXRzKGdiLCAxKTsgLy8gbnVtX3Nwc19pZHNfbWludXMxCisgICAgbnVtX3Nwc19pZHNfbWludXMxID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gbnVtX3Nwc19pZHNfbWludXMxCisKKyAgICBhY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWQgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgIGlmIChhY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWQgPj0gTUFYX1NQU19DT1VOVCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImFjdGl2ZV9wYXJhbWV0ZXJfc2V0X2lkICVkIGludmFsaWRcbiIsIGFjdGl2ZV9zZXFfcGFyYW1ldGVyX3NldF9pZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzLT5hY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWQgPSBhY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWQ7CisKKyAgICBmb3IgKGkgPSAxOyBpIDw9IG51bV9zcHNfaWRzX21pbnVzMTsgaSsrKQorICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBhY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWRbaV0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9uYWxfc2VpX21lc3NhZ2UoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKKworICAgIGludCBwYXlsb2FkX3R5cGUgPSAwOworICAgIGludCBwYXlsb2FkX3NpemUgPSAwOworICAgIGludCBieXRlID0gMHhGRjsKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkRlY29kaW5nIFNFSVxuIik7CisKKyAgICB3aGlsZSAoYnl0ZSA9PSAweEZGKSB7CisgICAgICAgIGJ5dGUgICAgICAgICAgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIHBheWxvYWRfdHlwZSArPSBieXRlOworICAgIH0KKyAgICBieXRlID0gMHhGRjsKKyAgICB3aGlsZSAoYnl0ZSA9PSAweEZGKSB7CisgICAgICAgIGJ5dGUgICAgICAgICAgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIHBheWxvYWRfc2l6ZSArPSBieXRlOworICAgIH0KKyAgICBpZiAocy0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfU0VJX1BSRUZJWCkgeworICAgICAgICBpZiAocGF5bG9hZF90eXBlID09IDI1NiAvKiYmIHMtPmRlY29kZV9jaGVja3N1bV9zZWkqLykgeworICAgICAgICAgICAgZGVjb2RlX25hbF9zZWlfZGVjb2RlZF9waWN0dXJlX2hhc2gocyk7CisgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZF90eXBlID09IDQ1KSB7CisgICAgICAgICAgICBkZWNvZGVfbmFsX3NlaV9mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50KHMpOworICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWRfdHlwZSA9PSA0NykgeworICAgICAgICAgICAgZGVjb2RlX25hbF9zZWlfZGlzcGxheV9vcmllbnRhdGlvbihzKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkX3R5cGUgPT0gMSl7CisgICAgICAgICAgICBpbnQgcmV0ID0gZGVjb2RlX3BpY190aW1pbmcocyk7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlNraXBwZWQgUFJFRklYIFNFSSAlZFxuIiwgcGF5bG9hZF90eXBlKTsKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgOCAqIHBheWxvYWRfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWRfdHlwZSA9PSAxMjkpeworICAgICAgICAgICAgYWN0aXZlX3BhcmFtZXRlcl9zZXRzKHMpOworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJTa2lwcGVkIFBSRUZJWCBTRUkgJWRcbiIsIHBheWxvYWRfdHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlNraXBwZWQgUFJFRklYIFNFSSAlZFxuIiwgcGF5bG9hZF90eXBlKTsKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgOCpwYXlsb2FkX3NpemUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLyogbmFsX3VuaXRfdHlwZSA9PSBOQUxfU0VJX1NVRkZJWCAqLworICAgICAgICBpZiAocGF5bG9hZF90eXBlID09IDEzMiAvKiAmJiBzLT5kZWNvZGVfY2hlY2tzdW1fc2VpICovKQorICAgICAgICAgICAgZGVjb2RlX25hbF9zZWlfZGVjb2RlZF9waWN0dXJlX2hhc2gocyk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJTa2lwcGVkIFNVRkZJWCBTRUkgJWRcbiIsIHBheWxvYWRfdHlwZSk7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDggKiBwYXlsb2FkX3NpemUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1vcmVfcmJzcF9kYXRhKEdldEJpdENvbnRleHQgKmdiKQoreworICAgIHJldHVybiBnZXRfYml0c19sZWZ0KGdiKSA+IDAgJiYgc2hvd19iaXRzKGdiLCA4KSAhPSAweDgwOworfQorCitpbnQgZmZfaGV2Y19kZWNvZGVfbmFsX3NlaShIRVZDQ29udGV4dCAqcykKK3sKKyAgICBpbnQgcmV0OworCisgICAgZG8geworICAgICAgICByZXQgPSBkZWNvZGVfbmFsX3NlaV9tZXNzYWdlKHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybihBVkVSUk9SKEVOT01FTSkpOworICAgIH0gd2hpbGUgKG1vcmVfcmJzcF9kYXRhKCZzLT5IRVZDbGMtPmdiKSk7CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oZXZjZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9oZXZjZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhZTU0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNkc3AuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIEhFVkMgdmlkZW8gZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgR3VpbGxhdW1lIE1hcnRyZXMKKyAqIENvcHlyaWdodCAoQykgMjAxMyAtIDIwMTQgUGllcnJlLUVkb3VhcmQgTGVwZXJlCisgKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiaGV2Y2RzcC5oIgorCitzdGF0aWMgY29uc3QgaW50OF90IHRyYW5zZm9ybVszMl1bMzJdID0geworICAgIHsgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsCisgICAgICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCB9LAorICAgIHsgOTAsICA5MCwgIDg4LCAgODUsICA4MiwgIDc4LCAgNzMsICA2NywgIDYxLCAgNTQsICA0NiwgIDM4LCAgMzEsICAyMiwgIDEzLCAgIDQsCisgICAgICAtNCwgLTEzLCAtMjIsIC0zMSwgLTM4LCAtNDYsIC01NCwgLTYxLCAtNjcsIC03MywgLTc4LCAtODIsIC04NSwgLTg4LCAtOTAsIC05MCB9LAorICAgIHsgOTAsICA4NywgIDgwLCAgNzAsICA1NywgIDQzLCAgMjUsICAgOSwgIC05LCAtMjUsIC00MywgLTU3LCAtNzAsIC04MCwgLTg3LCAtOTAsCisgICAgIC05MCwgLTg3LCAtODAsIC03MCwgLTU3LCAtNDMsIC0yNSwgIC05LCAgIDksICAyNSwgIDQzLCAgNTcsICA3MCwgIDgwLCAgODcsICA5MCB9LAorICAgIHsgOTAsICA4MiwgIDY3LCAgNDYsICAyMiwgIC00LCAtMzEsIC01NCwgLTczLCAtODUsIC05MCwgLTg4LCAtNzgsIC02MSwgLTM4LCAtMTMsCisgICAgICAxMywgIDM4LCAgNjEsICA3OCwgIDg4LCAgOTAsICA4NSwgIDczLCAgNTQsICAzMSwgICA0LCAtMjIsIC00NiwgLTY3LCAtODIsIC05MCB9LAorICAgIHsgODksICA3NSwgIDUwLCAgMTgsIC0xOCwgLTUwLCAtNzUsIC04OSwgLTg5LCAtNzUsIC01MCwgLTE4LCAgMTgsICA1MCwgIDc1LCAgODksCisgICAgICA4OSwgIDc1LCAgNTAsICAxOCwgLTE4LCAtNTAsIC03NSwgLTg5LCAtODksIC03NSwgLTUwLCAtMTgsICAxOCwgIDUwLCAgNzUsICA4OSB9LAorICAgIHsgODgsICA2NywgIDMxLCAtMTMsIC01NCwgLTgyLCAtOTAsIC03OCwgLTQ2LCAtNCwgICAzOCwgIDczLCAgOTAsICA4NSwgIDYxLCAgMjIsCisgICAgIC0yMiwgLTYxLCAtODUsIC05MCwgLTczLCAtMzgsICAgNCwgIDQ2LCAgNzgsICA5MCwgIDgyLCAgNTQsICAxMywgLTMxLCAtNjcsIC04OCB9LAorICAgIHsgODcsICA1NywgICA5LCAtNDMsIC04MCwgLTkwLCAtNzAsIC0yNSwgIDI1LCAgNzAsICA5MCwgIDgwLCAgNDMsICAtOSwgLTU3LCAtODcsCisgICAgIC04NywgLTU3LCAgLTksICA0MywgIDgwLCAgOTAsICA3MCwgIDI1LCAtMjUsIC03MCwgLTkwLCAtODAsIC00MywgICA5LCAgNTcsICA4NyB9LAorICAgIHsgODUsICA0NiwgLTEzLCAtNjcsIC05MCwgLTczLCAtMjIsICAzOCwgIDgyLCAgODgsICA1NCwgIC00LCAtNjEsIC05MCwgLTc4LCAtMzEsCisgICAgICAzMSwgIDc4LCAgOTAsICA2MSwgICA0LCAtNTQsIC04OCwgLTgyLCAtMzgsICAyMiwgIDczLCAgOTAsICA2NywgIDEzLCAtNDYsIC04NSB9LAorICAgIHsgODMsICAzNiwgLTM2LCAtODMsIC04MywgLTM2LCAgMzYsICA4MywgIDgzLCAgMzYsIC0zNiwgLTgzLCAtODMsIC0zNiwgIDM2LCAgODMsCisgICAgICA4MywgIDM2LCAtMzYsIC04MywgLTgzLCAtMzYsICAzNiwgIDgzLCAgODMsICAzNiwgLTM2LCAtODMsIC04MywgLTM2LCAgMzYsICA4MyB9LAorICAgIHsgODIsICAyMiwgLTU0LCAtOTAsIC02MSwgIDEzLCAgNzgsICA4NSwgIDMxLCAtNDYsIC05MCwgLTY3LCAgIDQsICA3MywgIDg4LCAgMzgsCisgICAgIC0zOCwgLTg4LCAtNzMsICAtNCwgIDY3LCAgOTAsICA0NiwgLTMxLCAtODUsIC03OCwgLTEzLCAgNjEsICA5MCwgIDU0LCAtMjIsIC04MiB9LAorICAgIHsgODAsICAgOSwgLTcwLCAtODcsIC0yNSwgIDU3LCAgOTAsICA0MywgLTQzLCAtOTAsIC01NywgIDI1LCAgODcsICA3MCwgIC05LCAtODAsCisgICAgIC04MCwgIC05LCAgNzAsICA4NywgIDI1LCAtNTcsIC05MCwgLTQzLCAgNDMsICA5MCwgIDU3LCAtMjUsIC04NywgLTcwLCAgIDksICA4MCB9LAorICAgIHsgNzgsICAtNCwgLTgyLCAtNzMsICAxMywgIDg1LCAgNjcsIC0yMiwgLTg4LCAtNjEsICAzMSwgIDkwLCAgNTQsIC0zOCwgLTkwLCAtNDYsCisgICAgICA0NiwgIDkwLCAgMzgsIC01NCwgLTkwLCAtMzEsICA2MSwgIDg4LCAgMjIsIC02NywgLTg1LCAtMTMsICA3MywgIDgyLCAgIDQsIC03OCB9LAorICAgIHsgNzUsIC0xOCwgLTg5LCAtNTAsICA1MCwgIDg5LCAgMTgsIC03NSwgLTc1LCAgMTgsICA4OSwgIDUwLCAtNTAsIC04OSwgLTE4LCAgNzUsCisgICAgICA3NSwgLTE4LCAtODksIC01MCwgIDUwLCAgODksICAxOCwgLTc1LCAtNzUsICAxOCwgIDg5LCAgNTAsIC01MCwgLTg5LCAtMTgsICA3NSB9LAorICAgIHsgNzMsIC0zMSwgLTkwLCAtMjIsICA3OCwgIDY3LCAtMzgsIC05MCwgLTEzLCAgODIsICA2MSwgLTQ2LCAtODgsICAtNCwgIDg1LCAgNTQsCisgICAgIC01NCwgLTg1LCAgIDQsICA4OCwgIDQ2LCAtNjEsIC04MiwgIDEzLCAgOTAsICAzOCwgLTY3LCAtNzgsICAyMiwgIDkwLCAgMzEsIC03MyB9LAorICAgIHsgNzAsIC00MywgLTg3LCAgIDksICA5MCwgIDI1LCAtODAsIC01NywgIDU3LCAgODAsIC0yNSwgLTkwLCAgLTksICA4NywgIDQzLCAtNzAsCisgICAgIC03MCwgIDQzLCAgODcsICAtOSwgLTkwLCAtMjUsICA4MCwgIDU3LCAtNTcsIC04MCwgIDI1LCAgOTAsICAgOSwgLTg3LCAtNDMsICA3MCB9LAorICAgIHsgNjcsIC01NCwgLTc4LCAgMzgsICA4NSwgLTIyLCAtOTAsICAgNCwgIDkwLCAgMTMsIC04OCwgLTMxLCAgODIsICA0NiwgLTczLCAtNjEsCisgICAgICA2MSwgIDczLCAtNDYsIC04MiwgIDMxLCAgODgsIC0xMywgLTkwLCAgLTQsICA5MCwgIDIyLCAtODUsIC0zOCwgIDc4LCAgNTQsIC02NyB9LAorICAgIHsgNjQsIC02NCwgLTY0LCAgNjQsICA2NCwgLTY0LCAtNjQsICA2NCwgIDY0LCAtNjQsIC02NCwgIDY0LCAgNjQsIC02NCwgLTY0LCAgNjQsCisgICAgICA2NCwgLTY0LCAtNjQsICA2NCwgIDY0LCAtNjQsIC02NCwgIDY0LCAgNjQsIC02NCwgLTY0LCAgNjQsICA2NCwgLTY0LCAtNjQsICA2NCB9LAorICAgIHsgNjEsIC03MywgLTQ2LCAgODIsICAzMSwgLTg4LCAtMTMsICA5MCwgIC00LCAtOTAsICAyMiwgIDg1LCAtMzgsIC03OCwgIDU0LCAgNjcsCisgICAgIC02NywgLTU0LCAgNzgsICAzOCwgLTg1LCAtMjIsICA5MCwgICA0LCAtOTAsICAxMywgIDg4LCAtMzEsIC04MiwgIDQ2LCAgNzMsIC02MSB9LAorICAgIHsgNTcsIC04MCwgLTI1LCAgOTAsICAtOSwgLTg3LCAgNDMsICA3MCwgLTcwLCAtNDMsICA4NywgICA5LCAtOTAsICAyNSwgIDgwLCAtNTcsCisgICAgIC01NywgIDgwLCAgMjUsIC05MCwgICA5LCAgODcsIC00MywgLTcwLCAgNzAsICA0MywgLTg3LCAgLTksICA5MCwgLTI1LCAtODAsICA1NyB9LAorICAgIHsgNTQsIC04NSwgIC00LCAgODgsIC00NiwgLTYxLCAgODIsICAxMywgLTkwLCAgMzgsICA2NywgLTc4LCAtMjIsICA5MCwgLTMxLCAtNzMsCisgICAgICA3MywgIDMxLCAtOTAsICAyMiwgIDc4LCAtNjcsIC0zOCwgIDkwLCAtMTMsIC04MiwgIDYxLCAgNDYsIC04OCwgICA0LCAgODUsIC01NCB9LAorICAgIHsgNTAsIC04OSwgIDE4LCAgNzUsIC03NSwgLTE4LCAgODksIC01MCwgLTUwLCAgODksIC0xOCwgLTc1LCAgNzUsICAxOCwgLTg5LCAgNTAsCisgICAgICA1MCwgLTg5LCAgMTgsICA3NSwgLTc1LCAtMTgsICA4OSwgLTUwLCAtNTAsICA4OSwgLTE4LCAtNzUsICA3NSwgIDE4LCAtODksICA1MCB9LAorICAgIHsgNDYsIC05MCwgIDM4LCAgNTQsIC05MCwgIDMxLCAgNjEsIC04OCwgIDIyLCAgNjcsIC04NSwgIDEzLCAgNzMsIC04MiwgICA0LCAgNzgsCisgICAgIC03OCwgIC00LCAgODIsIC03MywgLTEzLCAgODUsIC02NywgLTIyLCAgODgsIC02MSwgLTMxLCAgOTAsIC01NCwgLTM4LCAgOTAsIC00NiB9LAorICAgIHsgNDMsIC05MCwgIDU3LCAgMjUsIC04NywgIDcwLCAgIDksIC04MCwgIDgwLCAgLTksIC03MCwgIDg3LCAtMjUsIC01NywgIDkwLCAtNDMsCisgICAgIC00MywgIDkwLCAtNTcsIC0yNSwgIDg3LCAtNzAsICAtOSwgIDgwLCAtODAsICAgOSwgIDcwLCAtODcsICAyNSwgIDU3LCAtOTAsICA0MyB9LAorICAgIHsgMzgsIC04OCwgIDczLCAgLTQsIC02NywgIDkwLCAtNDYsIC0zMSwgIDg1LCAtNzgsICAxMywgIDYxLCAtOTAsICA1NCwgIDIyLCAtODIsCisgICAgICA4MiwgLTIyLCAtNTQsICA5MCwgLTYxLCAtMTMsICA3OCwgLTg1LCAgMzEsICA0NiwgLTkwLCAgNjcsICAgNCwgLTczLCAgODgsIC0zOCB9LAorICAgIHsgMzYsIC04MywgIDgzLCAtMzYsIC0zNiwgIDgzLCAtODMsICAzNiwgIDM2LCAtODMsICA4MywgLTM2LCAtMzYsICA4MywgLTgzLCAgMzYsCisgICAgICAzNiwgLTgzLCAgODMsIC0zNiwgLTM2LCAgODMsIC04MywgIDM2LCAgMzYsIC04MywgIDgzLCAtMzYsIC0zNiwgIDgzLCAtODMsICAzNiB9LAorICAgIHsgMzEsIC03OCwgIDkwLCAtNjEsICAgNCwgIDU0LCAtODgsICA4MiwgLTM4LCAtMjIsICA3MywgLTkwLCAgNjcsIC0xMywgLTQ2LCAgODUsCisgICAgIC04NSwgIDQ2LCAgMTMsIC02NywgIDkwLCAtNzMsICAyMiwgIDM4LCAtODIsICA4OCwgLTU0LCAgLTQsICA2MSwgLTkwLCAgNzgsIC0zMSB9LAorICAgIHsgMjUsIC03MCwgIDkwLCAtODAsICA0MywgICA5LCAtNTcsICA4NywgLTg3LCAgNTcsICAtOSwgLTQzLCAgODAsIC05MCwgIDcwLCAtMjUsCisgICAgIC0yNSwgIDcwLCAtOTAsICA4MCwgLTQzLCAgLTksICA1NywgLTg3LCAgODcsIC01NywgICA5LCAgNDMsIC04MCwgIDkwLCAtNzAsICAyNSB9LAorICAgIHsgMjIsIC02MSwgIDg1LCAtOTAsICA3MywgLTM4LCAgLTQsICA0NiwgLTc4LCAgOTAsIC04MiwgIDU0LCAtMTMsIC0zMSwgIDY3LCAtODgsCisgICAgICA4OCwgLTY3LCAgMzEsICAxMywgLTU0LCAgODIsIC05MCwgIDc4LCAtNDYsICAgNCwgIDM4LCAtNzMsICA5MCwgLTg1LCAgNjEsIC0yMiB9LAorICAgIHsgMTgsIC01MCwgIDc1LCAtODksICA4OSwgLTc1LCAgNTAsIC0xOCwgLTE4LCAgNTAsIC03NSwgIDg5LCAtODksICA3NSwgLTUwLCAgMTgsCisgICAgICAxOCwgLTUwLCAgNzUsIC04OSwgIDg5LCAtNzUsICA1MCwgLTE4LCAtMTgsICA1MCwgLTc1LCAgODksIC04OSwgIDc1LCAtNTAsICAxOCB9LAorICAgIHsgMTMsIC0zOCwgIDYxLCAtNzgsICA4OCwgLTkwLCAgODUsIC03MywgIDU0LCAtMzEsICAgNCwgIDIyLCAtNDYsICA2NywgLTgyLCAgOTAsCisgICAgIC05MCwgIDgyLCAtNjcsICA0NiwgLTIyLCAgLTQsICAzMSwgLTU0LCAgNzMsIC04NSwgIDkwLCAtODgsICA3OCwgLTYxLCAgMzgsIC0xMyB9LAorICAgIHsgIDksIC0yNSwgIDQzLCAtNTcsICA3MCwgLTgwLCAgODcsIC05MCwgIDkwLCAtODcsICA4MCwgLTcwLCAgNTcsIC00MywgIDI1LCAtOSwKKyAgICAgIC05LCAgMjUsIC00MywgIDU3LCAtNzAsICA4MCwgLTg3LCAgOTAsIC05MCwgIDg3LCAtODAsICA3MCwgLTU3LCAgNDMsIC0yNSwgICA5IH0sCisgICAgeyAgNCwgLTEzLCAgMjIsIC0zMSwgIDM4LCAtNDYsICA1NCwgLTYxLCAgNjcsIC03MywgIDc4LCAtODIsICA4NSwgLTg4LCAgOTAsIC05MCwKKyAgICAgIDkwLCAtOTAsICA4OCwgLTg1LCAgODIsIC03OCwgIDczLCAtNjcsICA2MSwgLTU0LCAgNDYsIC0zOCwgIDMxLCAtMjIsICAxMywgIC00IH0sCit9OworCitERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IGludDhfdCwgZmZfaGV2Y19lcGVsX2ZpbHRlcnNbN11bNF0pID0geworICAgIHsgLTIsIDU4LCAxMCwgLTJ9LAorICAgIHsgLTQsIDU0LCAxNiwgLTJ9LAorICAgIHsgLTYsIDQ2LCAyOCwgLTR9LAorICAgIHsgLTQsIDM2LCAzNiwgLTR9LAorICAgIHsgLTQsIDI4LCA0NiwgLTZ9LAorICAgIHsgLTIsIDE2LCA1NCwgLTR9LAorICAgIHsgLTIsIDEwLCA1OCwgLTJ9LAorfTsKKworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCBpbnQ4X3QsIGZmX2hldmNfcXBlbF9maWx0ZXJzWzNdWzE2XSkgPSB7CisgICAgeyAtMSwgIDQsLTEwLCA1OCwgMTcsIC01LCAgMSwgIDAsIC0xLCAgNCwtMTAsIDU4LCAxNywgLTUsICAxLCAgMH0sCisgICAgeyAtMSwgIDQsLTExLCA0MCwgNDAsLTExLCAgNCwgLTEsIC0xLCAgNCwtMTEsIDQwLCA0MCwtMTEsICA0LCAtMX0sCisgICAgeyAgMCwgIDEsIC01LCAxNywgNTgsLTEwLCAgNCwgLTEsICAwLCAgMSwgLTUsIDE3LCA1OCwtMTAsICA0LCAtMX0KK307CisKKyNkZWZpbmUgQklUX0RFUFRIIDgKKyNpbmNsdWRlICJoZXZjZHNwX3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDkKKyNpbmNsdWRlICJoZXZjZHNwX3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDEwCisjaW5jbHVkZSAiaGV2Y2RzcF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCAxMgorI2luY2x1ZGUgImhldmNkc3BfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKwordm9pZCBmZl9oZXZjX2RzcF9pbml0KEhFVkNEU1BDb250ZXh0ICpoZXZjZHNwLCBpbnQgYml0X2RlcHRoKQoreworI3VuZGVmIEZVTkMKKyNkZWZpbmUgRlVOQyhhLCBkZXB0aCkgYSAjIyBfICMjIGRlcHRoCisKKyN1bmRlZiBQRUxfRlVOQworI2RlZmluZSBQRUxfRlVOQyhkc3QxLCBpZHgxLCBpZHgyLCBhLCBkZXB0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoaSA9IDAgOyBpIDwgMTAgOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhldmNkc3AtPmRzdDFbaV1baWR4MV1baWR4Ml0gPSBhICMjIF8gIyMgZGVwdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI3VuZGVmIEVQRUxfRlVOQ1MKKyNkZWZpbmUgRVBFTF9GVU5DUyhkZXB0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQRUxfRlVOQyhwdXRfaGV2Y19lcGVsLCAwLCAwLCBwdXRfaGV2Y19wZWxfcGl4ZWxzLCBkZXB0aCk7ICAgICAgICAgICAgICAgIFwKKyAgICBQRUxfRlVOQyhwdXRfaGV2Y19lcGVsLCAwLCAxLCBwdXRfaGV2Y19lcGVsX2gsIGRlcHRoKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQRUxfRlVOQyhwdXRfaGV2Y19lcGVsLCAxLCAwLCBwdXRfaGV2Y19lcGVsX3YsIGRlcHRoKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQRUxfRlVOQyhwdXRfaGV2Y19lcGVsLCAxLCAxLCBwdXRfaGV2Y19lcGVsX2h2LCBkZXB0aCkKKworI3VuZGVmIEVQRUxfVU5JX0ZVTkNTCisjZGVmaW5lIEVQRUxfVU5JX0ZVTkNTKGRlcHRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfZXBlbF91bmksIDAsIDAsIHB1dF9oZXZjX3BlbF91bmlfcGl4ZWxzLCBkZXB0aCk7ICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfZXBlbF91bmksIDAsIDEsIHB1dF9oZXZjX2VwZWxfdW5pX2gsIGRlcHRoKTsgICAgICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfZXBlbF91bmksIDEsIDAsIHB1dF9oZXZjX2VwZWxfdW5pX3YsIGRlcHRoKTsgICAgICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfZXBlbF91bmksIDEsIDEsIHB1dF9oZXZjX2VwZWxfdW5pX2h2LCBkZXB0aCk7ICAgICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfZXBlbF91bmlfdywgMCwgMCwgcHV0X2hldmNfcGVsX3VuaV93X3BpeGVscywgZGVwdGgpOyAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfZXBlbF91bmlfdywgMCwgMSwgcHV0X2hldmNfZXBlbF91bmlfd19oLCBkZXB0aCk7ICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfZXBlbF91bmlfdywgMSwgMCwgcHV0X2hldmNfZXBlbF91bmlfd192LCBkZXB0aCk7ICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfZXBlbF91bmlfdywgMSwgMSwgcHV0X2hldmNfZXBlbF91bmlfd19odiwgZGVwdGgpCisKKyN1bmRlZiBFUEVMX0JJX0ZVTkNTCisjZGVmaW5lIEVQRUxfQklfRlVOQ1MoZGVwdGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX2VwZWxfYmksIDAsIDAsIHB1dF9oZXZjX3BlbF9iaV9waXhlbHMsIGRlcHRoKTsgICAgICAgIFwKKyAgICBQRUxfRlVOQyhwdXRfaGV2Y19lcGVsX2JpLCAwLCAxLCBwdXRfaGV2Y19lcGVsX2JpX2gsIGRlcHRoKTsgICAgICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfZXBlbF9iaSwgMSwgMCwgcHV0X2hldmNfZXBlbF9iaV92LCBkZXB0aCk7ICAgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX2VwZWxfYmksIDEsIDEsIHB1dF9oZXZjX2VwZWxfYmlfaHYsIGRlcHRoKTsgICAgICAgICAgIFwKKyAgICBQRUxfRlVOQyhwdXRfaGV2Y19lcGVsX2JpX3csIDAsIDAsIHB1dF9oZXZjX3BlbF9iaV93X3BpeGVscywgZGVwdGgpOyAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfZXBlbF9iaV93LCAwLCAxLCBwdXRfaGV2Y19lcGVsX2JpX3dfaCwgZGVwdGgpOyAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX2VwZWxfYmlfdywgMSwgMCwgcHV0X2hldmNfZXBlbF9iaV93X3YsIGRlcHRoKTsgICAgICAgIFwKKyAgICBQRUxfRlVOQyhwdXRfaGV2Y19lcGVsX2JpX3csIDEsIDEsIHB1dF9oZXZjX2VwZWxfYmlfd19odiwgZGVwdGgpCisKKyN1bmRlZiBRUEVMX0ZVTkNTCisjZGVmaW5lIFFQRUxfRlVOQ1MoZGVwdGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfcXBlbCwgMCwgMCwgcHV0X2hldmNfcGVsX3BpeGVscywgZGVwdGgpOyAgICAgICAgICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfcXBlbCwgMCwgMSwgcHV0X2hldmNfcXBlbF9oLCBkZXB0aCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfcXBlbCwgMSwgMCwgcHV0X2hldmNfcXBlbF92LCBkZXB0aCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgUEVMX0ZVTkMocHV0X2hldmNfcXBlbCwgMSwgMSwgcHV0X2hldmNfcXBlbF9odiwgZGVwdGgpCisKKyN1bmRlZiBRUEVMX1VOSV9GVU5DUworI2RlZmluZSBRUEVMX1VOSV9GVU5DUyhkZXB0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfdW5pLCAwLCAwLCBwdXRfaGV2Y19wZWxfdW5pX3BpeGVscywgZGVwdGgpOyAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfdW5pLCAwLCAxLCBwdXRfaGV2Y19xcGVsX3VuaV9oLCBkZXB0aCk7ICAgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfdW5pLCAxLCAwLCBwdXRfaGV2Y19xcGVsX3VuaV92LCBkZXB0aCk7ICAgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfdW5pLCAxLCAxLCBwdXRfaGV2Y19xcGVsX3VuaV9odiwgZGVwdGgpOyAgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfdW5pX3csIDAsIDAsIHB1dF9oZXZjX3BlbF91bmlfd19waXhlbHMsIGRlcHRoKTsgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfdW5pX3csIDAsIDEsIHB1dF9oZXZjX3FwZWxfdW5pX3dfaCwgZGVwdGgpOyAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfdW5pX3csIDEsIDAsIHB1dF9oZXZjX3FwZWxfdW5pX3dfdiwgZGVwdGgpOyAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfdW5pX3csIDEsIDEsIHB1dF9oZXZjX3FwZWxfdW5pX3dfaHYsIGRlcHRoKQorCisjdW5kZWYgUVBFTF9CSV9GVU5DUworI2RlZmluZSBRUEVMX0JJX0ZVTkNTKGRlcHRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfYmksIDAsIDAsIHB1dF9oZXZjX3BlbF9iaV9waXhlbHMsIGRlcHRoKTsgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfYmksIDAsIDEsIHB1dF9oZXZjX3FwZWxfYmlfaCwgZGVwdGgpOyAgICAgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfYmksIDEsIDAsIHB1dF9oZXZjX3FwZWxfYmlfdiwgZGVwdGgpOyAgICAgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfYmksIDEsIDEsIHB1dF9oZXZjX3FwZWxfYmlfaHYsIGRlcHRoKTsgICAgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfYmlfdywgMCwgMCwgcHV0X2hldmNfcGVsX2JpX3dfcGl4ZWxzLCBkZXB0aCk7ICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfYmlfdywgMCwgMSwgcHV0X2hldmNfcXBlbF9iaV93X2gsIGRlcHRoKTsgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfYmlfdywgMSwgMCwgcHV0X2hldmNfcXBlbF9iaV93X3YsIGRlcHRoKTsgICAgICAgICAgXAorICAgIFBFTF9GVU5DKHB1dF9oZXZjX3FwZWxfYmlfdywgMSwgMSwgcHV0X2hldmNfcXBlbF9iaV93X2h2LCBkZXB0aCkKKworI2RlZmluZSBIRVZDX0RTUChkZXB0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBoZXZjZHNwLT5wdXRfcGNtICAgICAgICAgICAgICAgID0gRlVOQyhwdXRfcGNtLCBkZXB0aCk7ICAgICAgICAgICAgICAgICBcCisgICAgaGV2Y2RzcC0+dHJhbnNmb3JtX2FkZFswXSAgICAgICA9IEZVTkModHJhbnNmb3JtX2FkZDR4NCwgZGVwdGgpOyAgICAgICAgXAorICAgIGhldmNkc3AtPnRyYW5zZm9ybV9hZGRbMV0gICAgICAgPSBGVU5DKHRyYW5zZm9ybV9hZGQ4eDgsIGRlcHRoKTsgICAgICAgIFwKKyAgICBoZXZjZHNwLT50cmFuc2Zvcm1fYWRkWzJdICAgICAgID0gRlVOQyh0cmFuc2Zvcm1fYWRkMTZ4MTYsIGRlcHRoKTsgICAgICBcCisgICAgaGV2Y2RzcC0+dHJhbnNmb3JtX2FkZFszXSAgICAgICA9IEZVTkModHJhbnNmb3JtX2FkZDMyeDMyLCBkZXB0aCk7ICAgICAgXAorICAgIGhldmNkc3AtPnRyYW5zZm9ybV9za2lwICAgICAgICAgPSBGVU5DKHRyYW5zZm9ybV9za2lwLCBkZXB0aCk7ICAgICAgICAgIFwKKyAgICBoZXZjZHNwLT50cmFuc2Zvcm1fcmRwY20gICAgICAgID0gRlVOQyh0cmFuc2Zvcm1fcmRwY20sIGRlcHRoKTsgICAgICAgICBcCisgICAgaGV2Y2RzcC0+aWRjdF80eDRfbHVtYSAgICAgICAgICA9IEZVTkModHJhbnNmb3JtXzR4NF9sdW1hLCBkZXB0aCk7ICAgICAgXAorICAgIGhldmNkc3AtPmlkY3RbMF0gICAgICAgICAgICAgICAgPSBGVU5DKGlkY3RfNHg0LCBkZXB0aCk7ICAgICAgICAgICAgICAgIFwKKyAgICBoZXZjZHNwLT5pZGN0WzFdICAgICAgICAgICAgICAgID0gRlVOQyhpZGN0Xzh4OCwgZGVwdGgpOyAgICAgICAgICAgICAgICBcCisgICAgaGV2Y2RzcC0+aWRjdFsyXSAgICAgICAgICAgICAgICA9IEZVTkMoaWRjdF8xNngxNiwgZGVwdGgpOyAgICAgICAgICAgICAgXAorICAgIGhldmNkc3AtPmlkY3RbM10gICAgICAgICAgICAgICAgPSBGVU5DKGlkY3RfMzJ4MzIsIGRlcHRoKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGV2Y2RzcC0+aWRjdF9kY1swXSAgICAgICAgICAgICA9IEZVTkMoaWRjdF80eDRfZGMsIGRlcHRoKTsgICAgICAgICAgICAgXAorICAgIGhldmNkc3AtPmlkY3RfZGNbMV0gICAgICAgICAgICAgPSBGVU5DKGlkY3RfOHg4X2RjLCBkZXB0aCk7ICAgICAgICAgICAgIFwKKyAgICBoZXZjZHNwLT5pZGN0X2RjWzJdICAgICAgICAgICAgID0gRlVOQyhpZGN0XzE2eDE2X2RjLCBkZXB0aCk7ICAgICAgICAgICBcCisgICAgaGV2Y2RzcC0+aWRjdF9kY1szXSAgICAgICAgICAgICA9IEZVTkMoaWRjdF8zMngzMl9kYywgZGVwdGgpOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBoZXZjZHNwLT5zYW9fYmFuZF9maWx0ZXIgICAgPSBGVU5DKHNhb19iYW5kX2ZpbHRlcl8wLCBkZXB0aCk7ICAgICAgICAgICAgICBcCisgICAgaGV2Y2RzcC0+c2FvX2VkZ2VfZmlsdGVyWzBdID0gRlVOQyhzYW9fZWRnZV9maWx0ZXJfMCwgZGVwdGgpOyAgICAgICAgICAgICAgXAorICAgIGhldmNkc3AtPnNhb19lZGdlX2ZpbHRlclsxXSA9IEZVTkMoc2FvX2VkZ2VfZmlsdGVyXzEsIGRlcHRoKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUVBFTF9GVU5DUyhkZXB0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFFQRUxfVU5JX0ZVTkNTKGRlcHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBRUEVMX0JJX0ZVTkNTKGRlcHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRVBFTF9GVU5DUyhkZXB0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVQRUxfVU5JX0ZVTkNTKGRlcHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFUEVMX0JJX0ZVTkNTKGRlcHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhldmNkc3AtPmhldmNfaF9sb29wX2ZpbHRlcl9sdW1hICAgICA9IEZVTkMoaGV2Y19oX2xvb3BfZmlsdGVyX2x1bWEsIGRlcHRoKTsgICBcCisgICAgaGV2Y2RzcC0+aGV2Y192X2xvb3BfZmlsdGVyX2x1bWEgICAgID0gRlVOQyhoZXZjX3ZfbG9vcF9maWx0ZXJfbHVtYSwgZGVwdGgpOyAgIFwKKyAgICBoZXZjZHNwLT5oZXZjX2hfbG9vcF9maWx0ZXJfY2hyb21hICAgPSBGVU5DKGhldmNfaF9sb29wX2ZpbHRlcl9jaHJvbWEsIGRlcHRoKTsgXAorICAgIGhldmNkc3AtPmhldmNfdl9sb29wX2ZpbHRlcl9jaHJvbWEgICA9IEZVTkMoaGV2Y192X2xvb3BfZmlsdGVyX2Nocm9tYSwgZGVwdGgpOyBcCisgICAgaGV2Y2RzcC0+aGV2Y19oX2xvb3BfZmlsdGVyX2x1bWFfYyAgID0gRlVOQyhoZXZjX2hfbG9vcF9maWx0ZXJfbHVtYSwgZGVwdGgpOyAgIFwKKyAgICBoZXZjZHNwLT5oZXZjX3ZfbG9vcF9maWx0ZXJfbHVtYV9jICAgPSBGVU5DKGhldmNfdl9sb29wX2ZpbHRlcl9sdW1hLCBkZXB0aCk7ICAgXAorICAgIGhldmNkc3AtPmhldmNfaF9sb29wX2ZpbHRlcl9jaHJvbWFfYyA9IEZVTkMoaGV2Y19oX2xvb3BfZmlsdGVyX2Nocm9tYSwgZGVwdGgpOyBcCisgICAgaGV2Y2RzcC0+aGV2Y192X2xvb3BfZmlsdGVyX2Nocm9tYV9jID0gRlVOQyhoZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hLCBkZXB0aCkKK2ludCBpID0gMDsKKworICAgIHN3aXRjaCAoYml0X2RlcHRoKSB7CisgICAgY2FzZSA5OgorICAgICAgICBIRVZDX0RTUCg5KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgICAgSEVWQ19EU1AoMTApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgICBIRVZDX0RTUCgxMik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEhFVkNfRFNQKDgpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2hldmNfZHNwX2luaXRfeDg2KGhldmNkc3AsIGJpdF9kZXB0aCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oZXZjZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy9oZXZjZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkM2I5OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNkc3AuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIEhFVkMgdmlkZW8gZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgR3VpbGxhdW1lIE1hcnRyZXMKKyAqIENvcHlyaWdodCAoQykgMjAxMyAtIDIwMTQgUGllcnJlLUVkb3VhcmQgTGVwZXJlCisgKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSEVWQ0RTUF9ICisjZGVmaW5lIEFWQ09ERUNfSEVWQ0RTUF9ICisKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorCisjZGVmaW5lIE1BWF9QQl9TSVpFIDY0CisKK3R5cGVkZWYgc3RydWN0IFNBT1BhcmFtcyB7CisgICAgaW50IG9mZnNldF9hYnNbM11bNF07ICAgLy8vPCBzYW9fb2Zmc2V0X2FicworICAgIGludCBvZmZzZXRfc2lnblszXVs0XTsgIC8vLzwgc2FvX29mZnNldF9zaWduCisKKyAgICB1aW50OF90IGJhbmRfcG9zaXRpb25bM107ICAgLy8vPCBzYW9fYmFuZF9wb3NpdGlvbgorCisgICAgaW50IGVvX2NsYXNzWzNdOyAgICAgICAgLy8vPCBzYW9fZW9fY2xhc3MKKworICAgIGludDE2X3Qgb2Zmc2V0X3ZhbFszXVs1XTsgICAvLy88U2FvT2Zmc2V0VmFsCisKKyAgICB1aW50OF90IHR5cGVfaWR4WzNdOyAgICAvLy88IHNhb190eXBlX2lkeAorfSBTQU9QYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IEhFVkNEU1BDb250ZXh0IHsKKyAgICB2b2lkICgqcHV0X3BjbSkodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IF9zdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IEdldEJpdENvbnRleHQgKmdiLCBpbnQgcGNtX2JpdF9kZXB0aCk7CisKKyAgICB2b2lkICgqdHJhbnNmb3JtX2FkZFs0XSkodWludDhfdCAqX2RzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3QgX3N0cmlkZSk7CisKKyAgICB2b2lkICgqdHJhbnNmb3JtX3NraXApKGludDE2X3QgKmNvZWZmcywgaW50MTZfdCBsb2cyX3NpemUpOworCisgICAgdm9pZCAoKnRyYW5zZm9ybV9yZHBjbSkoaW50MTZfdCAqY29lZmZzLCBpbnQxNl90IGxvZzJfc2l6ZSwgaW50IG1vZGUpOworCisgICAgdm9pZCAoKmlkY3RfNHg0X2x1bWEpKGludDE2X3QgKmNvZWZmcyk7CisKKyAgICB2b2lkICgqaWRjdFs0XSkoaW50MTZfdCAqY29lZmZzLCBpbnQgY29sX2xpbWl0KTsKKworICAgIHZvaWQgKCppZGN0X2RjWzRdKShpbnQxNl90ICpjb2VmZnMpOworCisgICAgdm9pZCAoKnNhb19iYW5kX2ZpbHRlcikodWludDhfdCAqX2RzdCwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zdHJpZGVfZHN0LCBwdHJkaWZmX3QgX3N0cmlkZV9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNBT1BhcmFtcyAqc2FvLCBpbnQgKmJvcmRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgY19pZHgpOworCisgICAgdm9pZCAoKnNhb19lZGdlX2ZpbHRlclsyXSkodWludDhfdCAqX2RzdCwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zdHJpZGVfZHN0LCBwdHJkaWZmX3QgX3N0cmlkZV9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNBT1BhcmFtcyAqc2FvLCBpbnQgKmJvcmRlcnMsIGludCBfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9oZWlnaHQsIGludCBjX2lkeCwgdWludDhfdCAqdmVydF9lZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmhvcml6X2VkZ2UsIHVpbnQ4X3QgKmRpYWdfZWRnZSk7CisKKyAgICB2b2lkICgqcHV0X2hldmNfcXBlbFsxMF1bMl1bMl0pKGludDE2X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpOworICAgIHZvaWQgKCpwdXRfaGV2Y19xcGVsX3VuaVsxMF1bMl1bMl0pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKTsKKyAgICB2b2lkICgqcHV0X2hldmNfcXBlbF91bmlfd1sxMF1bMl1bMl0pKHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBkZW5vbSwgaW50IHd4LCBpbnQgb3gsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKTsKKworICAgIHZvaWQgKCpwdXRfaGV2Y19xcGVsX2JpWzEwXVsyXVsyXSkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCk7CisgICAgdm9pZCAoKnB1dF9oZXZjX3FwZWxfYmlfd1sxMF1bMl1bMl0pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBkZW5vbSwgaW50IHd4MCwgaW50IHd4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG94MCwgaW50IG94MSwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpOworICAgIHZvaWQgKCpwdXRfaGV2Y19lcGVsWzEwXVsyXVsyXSkoaW50MTZfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCk7CisKKyAgICB2b2lkICgqcHV0X2hldmNfZXBlbF91bmlbMTBdWzJdWzJdKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKTsKKyAgICB2b2lkICgqcHV0X2hldmNfZXBlbF91bmlfd1sxMF1bMl1bMl0pKHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBkZW5vbSwgaW50IHd4LCBpbnQgb3gsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKTsKKyAgICB2b2lkICgqcHV0X2hldmNfZXBlbF9iaVsxMF1bMl1bMl0pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpOworICAgIHZvaWQgKCpwdXRfaGV2Y19lcGVsX2JpX3dbMTBdWzJdWzJdKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgZGVub20sIGludCB3eDAsIGludCBveDAsIGludCB3eDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBveDEsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKTsKKworICAgIHZvaWQgKCpoZXZjX2hfbG9vcF9maWx0ZXJfbHVtYSkodWludDhfdCAqcGl4LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEsIGludDMyX3QgKnRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbm9fcCwgdWludDhfdCAqbm9fcSk7CisgICAgdm9pZCAoKmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hKSh1aW50OF90ICpwaXgsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmV0YSwgaW50MzJfdCAqdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpub19wLCB1aW50OF90ICpub19xKTsKKyAgICB2b2lkICgqaGV2Y19oX2xvb3BfZmlsdGVyX2Nocm9tYSkodWludDhfdCAqcGl4LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICp0YywgdWludDhfdCAqbm9fcCwgdWludDhfdCAqbm9fcSk7CisgICAgdm9pZCAoKmhldmNfdl9sb29wX2ZpbHRlcl9jaHJvbWEpKHVpbnQ4X3QgKnBpeCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqdGMsIHVpbnQ4X3QgKm5vX3AsIHVpbnQ4X3QgKm5vX3EpOworICAgIHZvaWQgKCpoZXZjX2hfbG9vcF9maWx0ZXJfbHVtYV9jKSh1aW50OF90ICpwaXgsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXRhLCBpbnQzMl90ICp0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbm9fcCwgdWludDhfdCAqbm9fcSk7CisgICAgdm9pZCAoKmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hX2MpKHVpbnQ4X3QgKnBpeCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEsIGludDMyX3QgKnRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpub19wLCB1aW50OF90ICpub19xKTsKKyAgICB2b2lkICgqaGV2Y19oX2xvb3BfZmlsdGVyX2Nocm9tYV9jKSh1aW50OF90ICpwaXgsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqdGMsIHVpbnQ4X3QgKm5vX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbm9fcSk7CisgICAgdm9pZCAoKmhldmNfdl9sb29wX2ZpbHRlcl9jaHJvbWFfYykodWludDhfdCAqcGl4LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnRjLCB1aW50OF90ICpub19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm5vX3EpOworfSBIRVZDRFNQQ29udGV4dDsKKwordm9pZCBmZl9oZXZjX2RzcF9pbml0KEhFVkNEU1BDb250ZXh0ICpocGMsIGludCBiaXRfZGVwdGgpOworCitleHRlcm4gY29uc3QgaW50OF90IGZmX2hldmNfZXBlbF9maWx0ZXJzWzddWzRdOworZXh0ZXJuIGNvbnN0IGludDhfdCBmZl9oZXZjX3FwZWxfZmlsdGVyc1szXVsxNl07CisKK3ZvaWQgZmZfaGV2Y19kc3BfaW5pdF94ODYoSEVWQ0RTUENvbnRleHQgKmMsIGNvbnN0IGludCBiaXRfZGVwdGgpOworCisjZW5kaWYgLyogQVZDT0RFQ19IRVZDRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNkc3BfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNkc3BfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjBhNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Y2RzcF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMTcxMyBAQAorLyoKKyAqIEhFVkMgdmlkZW8gZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgR3VpbGxhdW1lIE1hcnRyZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaGV2Yy5oIgorCisjaW5jbHVkZSAiYml0X2RlcHRoX3RlbXBsYXRlLmMiCisjaW5jbHVkZSAiaGV2Y2RzcC5oIgorCisKK3N0YXRpYyB2b2lkIEZVTkMocHV0X3BjbSkodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYiwgaW50IHBjbV9iaXRfZGVwdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCAqKV9kc3Q7CisKKyAgICBzdHJpZGUgLz0gc2l6ZW9mKHBpeGVsKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IGdldF9iaXRzKGdiLCBwY21fYml0X2RlcHRoKSA8PCAoQklUX0RFUFRIIC0gcGNtX2JpdF9kZXB0aCk7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkModHJhbnNxdWFudF9ieXBhc3MpKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKmNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IHNpemUpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCAqKV9kc3Q7CisKKyAgICBzdHJpZGUgLz0gc2l6ZW9mKHBpeGVsKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBzaXplOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7IHgrKykgeworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbChkc3RbeF0gKyAqY29lZmZzKTsKKyAgICAgICAgICAgIGNvZWZmcysrOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHRyYW5zZm9ybV9hZGQ0eDQpKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKmNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgRlVOQyh0cmFuc3F1YW50X2J5cGFzcykoX2RzdCwgY29lZmZzLCBzdHJpZGUsIDQpOworfQorCitzdGF0aWMgdm9pZCBGVU5DKHRyYW5zZm9ybV9hZGQ4eDgpKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKmNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgRlVOQyh0cmFuc3F1YW50X2J5cGFzcykoX2RzdCwgY29lZmZzLCBzdHJpZGUsIDgpOworfQorCitzdGF0aWMgdm9pZCBGVU5DKHRyYW5zZm9ybV9hZGQxNngxNikodWludDhfdCAqX2RzdCwgaW50MTZfdCAqY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIEZVTkModHJhbnNxdWFudF9ieXBhc3MpKF9kc3QsIGNvZWZmcywgc3RyaWRlLCAxNik7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkModHJhbnNmb3JtX2FkZDMyeDMyKSh1aW50OF90ICpfZHN0LCBpbnQxNl90ICpjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgRlVOQyh0cmFuc3F1YW50X2J5cGFzcykoX2RzdCwgY29lZmZzLCBzdHJpZGUsIDMyKTsKK30KKworCitzdGF0aWMgdm9pZCBGVU5DKHRyYW5zZm9ybV9yZHBjbSkoaW50MTZfdCAqX2NvZWZmcywgaW50MTZfdCBsb2cyX3NpemUsIGludCBtb2RlKQoreworICAgIGludDE2X3QgKmNvZWZmcyA9IChpbnQxNl90ICopIF9jb2VmZnM7CisgICAgaW50IHgsIHk7CisgICAgaW50IHNpemUgPSAxIDw8IGxvZzJfc2l6ZTsKKworICAgIGlmIChtb2RlKSB7CisgICAgICAgIGNvZWZmcyArPSBzaXplOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc2l6ZSAtIDE7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7IHgrKykKKyAgICAgICAgICAgICAgICBjb2VmZnNbeF0gKz0gY29lZmZzW3ggLSBzaXplXTsKKyAgICAgICAgICAgIGNvZWZmcyArPSBzaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNpemU7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMTsgeCA8IHNpemU7IHgrKykKKyAgICAgICAgICAgICAgICBjb2VmZnNbeF0gKz0gY29lZmZzW3ggLSAxXTsKKyAgICAgICAgICAgIGNvZWZmcyArPSBzaXplOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHRyYW5zZm9ybV9za2lwKShpbnQxNl90ICpfY29lZmZzLCBpbnQxNl90IGxvZzJfc2l6ZSkKK3sKKyAgICBpbnQgc2hpZnQgID0gMTUgLSBCSVRfREVQVEggLSBsb2cyX3NpemU7CisgICAgaW50IHgsIHk7CisgICAgaW50IHNpemUgPSAxIDw8IGxvZzJfc2l6ZTsKKyAgICBpbnQxNl90ICpjb2VmZnMgPSBfY29lZmZzOworCisKKyAgICBpZiAoc2hpZnQgPiAwKSB7CisgICAgICAgIGludCBvZmZzZXQgPSAxIDw8IChzaGlmdCAtIDEpOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7CisgICAgICAgICAgICAgICAgKmNvZWZmcyA9ICgqY29lZmZzICsgb2Zmc2V0KSA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICBjb2VmZnMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzaXplOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyB4KyspIHsKKyAgICAgICAgICAgICAgICAqY29lZmZzID0gKmNvZWZmcyA8PCAtc2hpZnQ7CisgICAgICAgICAgICAgICAgY29lZmZzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNkZWZpbmUgU0VUKGRzdCwgeCkgICAoZHN0KSA9ICh4KQorI2RlZmluZSBTQ0FMRShkc3QsIHgpIChkc3QpID0gYXZfY2xpcF9pbnQxNigoKHgpICsgYWRkKSA+PiBzaGlmdCkKKyNkZWZpbmUgQUREX0FORF9TQ0FMRShkc3QsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZHN0KSA9IGF2X2NsaXBfcGl4ZWwoKGRzdCkgKyBhdl9jbGlwX2ludDE2KCgoeCkgKyBhZGQpID4+IHNoaWZ0KSkKKworI2RlZmluZSBUUl80eDRfTFVNQShkc3QsIHNyYywgc3RlcCwgYXNzaWduKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgYzAgPSBzcmNbMCAqIHN0ZXBdICsgc3JjWzIgKiBzdGVwXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgYzEgPSBzcmNbMiAqIHN0ZXBdICsgc3JjWzMgKiBzdGVwXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgYzIgPSBzcmNbMCAqIHN0ZXBdIC0gc3JjWzMgKiBzdGVwXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgYzMgPSA3NCAqIHNyY1sxICogc3RlcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NpZ24oZHN0WzIgKiBzdGVwXSwgNzQgKiAoc3JjWzAgKiBzdGVwXSAtICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWzIgKiBzdGVwXSArICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWzMgKiBzdGVwXSkpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NpZ24oZHN0WzAgKiBzdGVwXSwgMjkgKiBjMCArIDU1ICogYzEgKyBjMyk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NpZ24oZHN0WzEgKiBzdGVwXSwgNTUgKiBjMiAtIDI5ICogYzEgKyBjMyk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NpZ24oZHN0WzMgKiBzdGVwXSwgNTUgKiBjMCArIDI5ICogYzIgLSBjMyk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIEZVTkModHJhbnNmb3JtXzR4NF9sdW1hKShpbnQxNl90ICpjb2VmZnMpCit7CisgICAgaW50IGk7CisgICAgaW50IHNoaWZ0ICAgID0gNzsKKyAgICBpbnQgYWRkICAgICAgPSAxIDw8IChzaGlmdCAtIDEpOworICAgIGludDE2X3QgKnNyYyA9IGNvZWZmczsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgVFJfNHg0X0xVTUEoc3JjLCBzcmMsIDQsIFNDQUxFKTsKKyAgICAgICAgc3JjKys7CisgICAgfQorCisgICAgc2hpZnQgPSAyMCAtIEJJVF9ERVBUSDsKKyAgICBhZGQgICA9IDEgPDwgKHNoaWZ0IC0gMSk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBUUl80eDRfTFVNQShjb2VmZnMsIGNvZWZmcywgMSwgU0NBTEUpOworICAgICAgICBjb2VmZnMgKz0gNDsKKyAgICB9Cit9CisKKyN1bmRlZiBUUl80eDRfTFVNQQorCisjZGVmaW5lIFRSXzQoZHN0LCBzcmMsIGRzdGVwLCBzc3RlcCwgYXNzaWduLCBlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IGUwID0gNjQgKiBzcmNbMCAqIHNzdGVwXSArIDY0ICogc3JjWzIgKiBzc3RlcF07ICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBlMSA9IDY0ICogc3JjWzAgKiBzc3RlcF0gLSA2NCAqIHNyY1syICogc3N0ZXBdOyAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgbzAgPSA4MyAqIHNyY1sxICogc3N0ZXBdICsgMzYgKiBzcmNbMyAqIHNzdGVwXTsgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IG8xID0gMzYgKiBzcmNbMSAqIHNzdGVwXSAtIDgzICogc3JjWzMgKiBzc3RlcF07ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NpZ24oZHN0WzAgKiBkc3RlcF0sIGUwICsgbzApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXNzaWduKGRzdFsxICogZHN0ZXBdLCBlMSArIG8xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFzc2lnbihkc3RbMiAqIGRzdGVwXSwgZTEgLSBvMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NpZ24oZHN0WzMgKiBkc3RlcF0sIGUwIC0gbzApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSXzgoZHN0LCBzcmMsIGRzdGVwLCBzc3RlcCwgYXNzaWduLCBlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGksIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBlXzhbNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgb184WzRdID0geyAwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgZW5kOyBqICs9IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9fOFtpXSArPSB0cmFuc2Zvcm1bNCAqIGpdW2ldICogc3JjW2ogKiBzc3RlcF07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFJfNChlXzgsIHNyYywgMSwgMiAqIHNzdGVwLCBTRVQsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFzc2lnbihkc3RbaSAqIGRzdGVwXSwgZV84W2ldICsgb184W2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhc3NpZ24oZHN0Wyg3IC0gaSkgKiBkc3RlcF0sIGVfOFtpXSAtIG9fOFtpXSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSXzE2KGRzdCwgc3JjLCBkc3RlcCwgc3N0ZXAsIGFzc2lnbiwgZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGksIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBlXzE2WzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgb18xNls4XSA9IHsgMCB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgZW5kOyBqICs9IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9fMTZbaV0gKz0gdHJhbnNmb3JtWzIgKiBqXVtpXSAqIHNyY1tqICogc3N0ZXBdOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFJfOChlXzE2LCBzcmMsIDEsIDIgKiBzc3RlcCwgU0VULCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFzc2lnbihkc3RbaSAqIGRzdGVwXSwgZV8xNltpXSArIG9fMTZbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhc3NpZ24oZHN0WygxNSAtIGkpICogZHN0ZXBdLCBlXzE2W2ldIC0gb18xNltpXSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSXzMyKGRzdCwgc3JjLCBkc3RlcCwgc3N0ZXAsIGFzc2lnbiwgZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGksIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBlXzMyWzE2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgb18zMlsxNl0gPSB7IDAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgZW5kOyBqICs9IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9fMzJbaV0gKz0gdHJhbnNmb3JtW2pdW2ldICogc3JjW2ogKiBzc3RlcF07ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFJfMTYoZV8zMiwgc3JjLCAxLCAyICogc3N0ZXAsIFNFVCwgZW5kLzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFzc2lnbihkc3RbaSAqIGRzdGVwXSwgZV8zMltpXSArIG9fMzJbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhc3NpZ24oZHN0WygzMSAtIGkpICogZHN0ZXBdLCBlXzMyW2ldIC0gb18zMltpXSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIElEQ1RfVkFSNChIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgbGltaXQyICAgPSBGRk1JTihjb2xfbGltaXQgKyA0LCBIKQorI2RlZmluZSBJRENUX1ZBUjgoSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgICAgICBsaW1pdCAgID0gRkZNSU4oY29sX2xpbWl0LCBIKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgICAgICBsaW1pdDIgICA9IEZGTUlOKGNvbF9saW1pdCArIDQsIEgpCisjZGVmaW5lIElEQ1RfVkFSMTYoSCkgICBJRENUX1ZBUjgoSCkKKyNkZWZpbmUgSURDVF9WQVIzMihIKSAgIElEQ1RfVkFSOChIKQorCisjZGVmaW5lIElEQ1QoSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkMoaWRjdF8jI0ggIyN4ICMjSCApKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICBzaGlmdCAgID0gNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgIGFkZCAgICAgPSAxIDw8IChzaGlmdCAtIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MTZfdCAqc3JjICAgICA9IGNvZWZmczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJRENUX1ZBUiAjI0goSCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IEg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFJfICMjIEgoc3JjLCBzcmMsIEgsIEgsIFNDQUxFLCBsaW1pdDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobGltaXQyIDwgSCAmJiBpJTQgPT0gMCAmJiAhIWkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsaW1pdDIgLT0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaGlmdCAgID0gMjAgLSBCSVRfREVQVEg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFkZCAgICAgPSAxIDw8IChzaGlmdCAtIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IEg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFJfICMjIEgoY29lZmZzLCBjb2VmZnMsIDEsIDEsIFNDQUxFLCBsaW1pdCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb2VmZnMgKz0gSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBJRENUX0RDKEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DKGlkY3RfIyNIICMjeCAjI0ggIyNfZGMpKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpjb2VmZnMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgc2hpZnQgICA9IDE0IC0gQklUX0RFUFRIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICBhZGQgICAgID0gMSA8PCAoc2hpZnQgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgIGNvZWZmICAgPSAoKChjb2VmZnNbMF0gKyAxKSA+PiAxKSArIGFkZCkgPj4gc2hpZnQ7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGogPSAwOyBqIDwgSDsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb2VmZnNbaStqKkhdID0gY29lZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0lEQ1QoIDQpCitJRENUKCA4KQorSURDVCgxNikKK0lEQ1QoMzIpCisKK0lEQ1RfREMoIDQpCitJRENUX0RDKCA4KQorSURDVF9EQygxNikKK0lEQ1RfREMoMzIpCisKKyN1bmRlZiBUUl80CisjdW5kZWYgVFJfOAorI3VuZGVmIFRSXzE2CisjdW5kZWYgVFJfMzIKKworI3VuZGVmIFNFVAorI3VuZGVmIFNDQUxFCisjdW5kZWYgQUREX0FORF9TQ0FMRQorCitzdGF0aWMgdm9pZCBGVU5DKHNhb19iYW5kX2ZpbHRlcl8wKSh1aW50OF90ICpfZHN0LCB1aW50OF90ICpfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGVfZHN0LCBwdHJkaWZmX3Qgc3RyaWRlX3NyYywgU0FPUGFyYW1zICpzYW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpib3JkZXJzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNfaWR4KQoreworICAgIHBpeGVsICpkc3QgPSAocGl4ZWwgKilfZHN0OworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwgKilfc3JjOworICAgIGludCBvZmZzZXRfdGFibGVbMzJdID0geyAwIH07CisgICAgaW50IGssIHksIHg7CisgICAgaW50IHNoaWZ0ICA9IEJJVF9ERVBUSCAtIDU7CisgICAgaW50MTZfdCAqc2FvX29mZnNldF92YWwgPSBzYW8tPm9mZnNldF92YWxbY19pZHhdOworICAgIGludCBzYW9fbGVmdF9jbGFzcyAgPSBzYW8tPmJhbmRfcG9zaXRpb25bY19pZHhdOworCisgICAgc3RyaWRlX2RzdCAvPSBzaXplb2YocGl4ZWwpOworICAgIHN0cmlkZV9zcmMgLz0gc2l6ZW9mKHBpeGVsKTsKKworICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCisgICAgICAgIG9mZnNldF90YWJsZVsoayArIHNhb19sZWZ0X2NsYXNzKSAmIDMxXSA9IHNhb19vZmZzZXRfdmFsW2sgKyAxXTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKHNyY1t4XSArIG9mZnNldF90YWJsZVtzcmNbeF0gPj4gc2hpZnRdKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZV9kc3Q7CisgICAgICAgIHNyYyArPSBzdHJpZGVfc3JjOworICAgIH0KK30KKworI2RlZmluZSBDTVAoYSwgYikgKChhKSA+IChiKSA/IDEgOiAoKGEpID09IChiKSA/IDAgOiAtMSkpCisKK3N0YXRpYyB2b2lkIEZVTkMoc2FvX2VkZ2VfZmlsdGVyKSh1aW50OF90ICpfZHN0LCB1aW50OF90ICpfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGVfZHN0LCBwdHJkaWZmX3Qgc3RyaWRlX3NyYywgU0FPUGFyYW1zICpzYW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjX2lkeCwgaW50IGluaXRfeCwgaW50IGluaXRfeSkgeworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZWRnZV9pZHhbXSA9IHsgMSwgMiwgMCwgMywgNCB9OworICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgcG9zWzRdWzJdWzJdID0geworICAgICAgICB7IHsgLTEsICAwIH0sIHsgIDEsIDAgfSB9LCAvLyBob3Jpem9udGFsCisgICAgICAgIHsgeyAgMCwgLTEgfSwgeyAgMCwgMSB9IH0sIC8vIHZlcnRpY2FsCisgICAgICAgIHsgeyAtMSwgLTEgfSwgeyAgMSwgMSB9IH0sIC8vIDQ1IGRlZ3JlZQorICAgICAgICB7IHsgIDEsIC0xIH0sIHsgLTEsIDEgfSB9LCAvLyAxMzUgZGVncmVlCisgICAgfTsKKyAgICBpbnQxNl90ICpzYW9fb2Zmc2V0X3ZhbCA9IHNhby0+b2Zmc2V0X3ZhbFtjX2lkeF07CisgICAgaW50IHNhb19lb19jbGFzcyAgICA9IHNhby0+ZW9fY2xhc3NbY19pZHhdOworICAgIHBpeGVsICpkc3QgPSAocGl4ZWwgKilfZHN0OworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwgKilfc3JjOworCisgICAgaW50IHlfc3RyaWRlX3NyYyA9IGluaXRfeSAqIHN0cmlkZV9zcmM7CisgICAgaW50IHlfc3RyaWRlX2RzdCA9IGluaXRfeSAqIHN0cmlkZV9kc3Q7CisgICAgaW50IHBvc18wXzAgID0gcG9zW3Nhb19lb19jbGFzc11bMF1bMF07CisgICAgaW50IHBvc18wXzEgID0gcG9zW3Nhb19lb19jbGFzc11bMF1bMV07CisgICAgaW50IHBvc18xXzAgID0gcG9zW3Nhb19lb19jbGFzc11bMV1bMF07CisgICAgaW50IHBvc18xXzEgID0gcG9zW3Nhb19lb19jbGFzc11bMV1bMV07CisgICAgaW50IHgsIHk7CisKKyAgICBpbnQgeV9zdHJpZGVfMF8xID0gKGluaXRfeSArIHBvc18wXzEpICogc3RyaWRlX3NyYzsKKyAgICBpbnQgeV9zdHJpZGVfMV8xID0gKGluaXRfeSArIHBvc18xXzEpICogc3RyaWRlX3NyYzsKKyAgICBmb3IgKHkgPSBpbml0X3k7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSBpbml0X3g7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgZGlmZjAgICAgICAgICAgICAgPSBDTVAoc3JjW3ggKyB5X3N0cmlkZV9zcmNdLCBzcmNbeCArIHBvc18wXzAgKyB5X3N0cmlkZV8wXzFdKTsKKyAgICAgICAgICAgIGludCBkaWZmMSAgICAgICAgICAgICA9IENNUChzcmNbeCArIHlfc3RyaWRlX3NyY10sIHNyY1t4ICsgcG9zXzFfMCArIHlfc3RyaWRlXzFfMV0pOworICAgICAgICAgICAgaW50IG9mZnNldF92YWwgICAgICAgID0gZWRnZV9pZHhbMiArIGRpZmYwICsgZGlmZjFdOworICAgICAgICAgICAgZHN0W3ggKyB5X3N0cmlkZV9kc3RdID0gYXZfY2xpcF9waXhlbChzcmNbeCArIHlfc3RyaWRlX3NyY10gKyBzYW9fb2Zmc2V0X3ZhbFtvZmZzZXRfdmFsXSk7CisgICAgICAgIH0KKyAgICAgICAgeV9zdHJpZGVfc3JjICs9IHN0cmlkZV9zcmM7CisgICAgICAgIHlfc3RyaWRlX2RzdCArPSBzdHJpZGVfZHN0OworICAgICAgICB5X3N0cmlkZV8wXzEgKz0gc3RyaWRlX3NyYzsKKyAgICAgICAgeV9zdHJpZGVfMV8xICs9IHN0cmlkZV9zcmM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHNhb19lZGdlX2ZpbHRlcl8wKSh1aW50OF90ICpfZHN0LCB1aW50OF90ICpfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZV9kc3QsIHB0cmRpZmZfdCBzdHJpZGVfc3JjLCBTQU9QYXJhbXMgKnNhbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYm9yZGVycywgaW50IF93aWR0aCwgaW50IF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY19pZHgsIHVpbnQ4X3QgKnZlcnRfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmhvcml6X2VkZ2UsIHVpbnQ4X3QgKmRpYWdfZWRnZSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqZHN0ID0gKHBpeGVsICopX2RzdDsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsICopX3NyYzsKKyAgICBpbnQxNl90ICpzYW9fb2Zmc2V0X3ZhbCA9IHNhby0+b2Zmc2V0X3ZhbFtjX2lkeF07CisgICAgaW50IHNhb19lb19jbGFzcyAgICA9IHNhby0+ZW9fY2xhc3NbY19pZHhdOworICAgIGludCBpbml0X3ggPSAwLCBpbml0X3kgPSAwLCB3aWR0aCA9IF93aWR0aCwgaGVpZ2h0ID0gX2hlaWdodDsKKworICAgIHN0cmlkZV9kc3QgLz0gc2l6ZW9mKHBpeGVsKTsKKyAgICBzdHJpZGVfc3JjIC89IHNpemVvZihwaXhlbCk7CisKKyAgICBpZiAoc2FvX2VvX2NsYXNzICE9IFNBT19FT19WRVJUKSB7CisgICAgICAgIGlmIChib3JkZXJzWzBdKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0X3ZhbCA9IHNhb19vZmZzZXRfdmFsWzBdOworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgZHN0W3kgKiBzdHJpZGVfZHN0XSA9IGF2X2NsaXBfcGl4ZWwoc3JjW3kgKiBzdHJpZGVfc3JjXSArIG9mZnNldF92YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5pdF94ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYm9yZGVyc1syXSkgeworICAgICAgICAgICAgaW50IG9mZnNldF92YWwgPSBzYW9fb2Zmc2V0X3ZhbFswXTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgICAgID0gd2lkdGggLSAxOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGhlaWdodDsgeCsrKSB7CisgICAgICAgICAgICAgICAgZHN0W3ggKiBzdHJpZGVfZHN0ICsgb2Zmc2V0XSA9IGF2X2NsaXBfcGl4ZWwoc3JjW3ggKiBzdHJpZGVfc3JjICsgb2Zmc2V0XSArIG9mZnNldF92YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2lkdGgtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2FvX2VvX2NsYXNzICE9IFNBT19FT19IT1JJWikgeworICAgICAgICBpZiAoYm9yZGVyc1sxXSkgeworICAgICAgICAgICAgaW50IG9mZnNldF92YWwgPSBzYW9fb2Zmc2V0X3ZhbFswXTsKKyAgICAgICAgICAgIGZvciAoeCA9IGluaXRfeDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbChzcmNbeF0gKyBvZmZzZXRfdmFsKTsKKyAgICAgICAgICAgIGluaXRfeSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJvcmRlcnNbM10pIHsKKyAgICAgICAgICAgIGludCBvZmZzZXRfdmFsICAgPSBzYW9fb2Zmc2V0X3ZhbFswXTsKKyAgICAgICAgICAgIGludCB5X3N0cmlkZV9kc3QgPSBzdHJpZGVfZHN0ICogKGhlaWdodCAtIDEpOworICAgICAgICAgICAgaW50IHlfc3RyaWRlX3NyYyA9IHN0cmlkZV9zcmMgKiAoaGVpZ2h0IC0gMSk7CisgICAgICAgICAgICBmb3IgKHggPSBpbml0X3g7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgICAgIGRzdFt4ICsgeV9zdHJpZGVfZHN0XSA9IGF2X2NsaXBfcGl4ZWwoc3JjW3ggKyB5X3N0cmlkZV9zcmNdICsgb2Zmc2V0X3ZhbCk7CisgICAgICAgICAgICBoZWlnaHQtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZVTkMoc2FvX2VkZ2VfZmlsdGVyKSgodWludDhfdCAqKWRzdCwgKHVpbnQ4X3QgKilzcmMsIHN0cmlkZV9kc3QsIHN0cmlkZV9zcmMsIHNhbywgd2lkdGgsIGhlaWdodCwgY19pZHgsIGluaXRfeCwgaW5pdF95KTsKK30KKworc3RhdGljIHZvaWQgRlVOQyhzYW9fZWRnZV9maWx0ZXJfMSkodWludDhfdCAqX2RzdCwgdWludDhfdCAqX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGVfZHN0LCBwdHJkaWZmX3Qgc3RyaWRlX3NyYywgU0FPUGFyYW1zICpzYW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJvcmRlcnMsIGludCBfd2lkdGgsIGludCBfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNfaWR4LCB1aW50OF90ICp2ZXJ0X2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpob3Jpel9lZGdlLCB1aW50OF90ICpkaWFnX2VkZ2UpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCAqKV9kc3Q7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCAqKV9zcmM7CisgICAgaW50MTZfdCAqc2FvX29mZnNldF92YWwgPSBzYW8tPm9mZnNldF92YWxbY19pZHhdOworICAgIGludCBzYW9fZW9fY2xhc3MgICAgPSBzYW8tPmVvX2NsYXNzW2NfaWR4XTsKKyAgICBpbnQgaW5pdF94ID0gMCwgaW5pdF95ID0gMCwgd2lkdGggPSBfd2lkdGgsIGhlaWdodCA9IF9oZWlnaHQ7CisKKyAgICBzdHJpZGVfZHN0IC89IHNpemVvZihwaXhlbCk7CisgICAgc3RyaWRlX3NyYyAvPSBzaXplb2YocGl4ZWwpOworCisgICAgaWYgKHNhb19lb19jbGFzcyAhPSBTQU9fRU9fVkVSVCkgeworICAgICAgICBpZiAoYm9yZGVyc1swXSkgeworICAgICAgICAgICAgaW50IG9mZnNldF92YWwgPSBzYW9fb2Zmc2V0X3ZhbFswXTsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgIGRzdFt5ICogc3RyaWRlX2RzdF0gPSBhdl9jbGlwX3BpeGVsKHNyY1t5ICogc3RyaWRlX3NyY10gKyBvZmZzZXRfdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluaXRfeCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJvcmRlcnNbMl0pIHsKKyAgICAgICAgICAgIGludCBvZmZzZXRfdmFsID0gc2FvX29mZnNldF92YWxbMF07CisgICAgICAgICAgICBpbnQgb2Zmc2V0ICAgICA9IHdpZHRoIC0gMTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBoZWlnaHQ7IHgrKykgeworICAgICAgICAgICAgICAgIGRzdFt4ICogc3RyaWRlX2RzdCArIG9mZnNldF0gPSBhdl9jbGlwX3BpeGVsKHNyY1t4ICogc3RyaWRlX3NyYyArIG9mZnNldF0gKyBvZmZzZXRfdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdpZHRoLS07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNhb19lb19jbGFzcyAhPSBTQU9fRU9fSE9SSVopIHsKKyAgICAgICAgaWYgKGJvcmRlcnNbMV0pIHsKKyAgICAgICAgICAgIGludCBvZmZzZXRfdmFsID0gc2FvX29mZnNldF92YWxbMF07CisgICAgICAgICAgICBmb3IgKHggPSBpbml0X3g7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoc3JjW3hdICsgb2Zmc2V0X3ZhbCk7CisgICAgICAgICAgICBpbml0X3kgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChib3JkZXJzWzNdKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0X3ZhbCAgID0gc2FvX29mZnNldF92YWxbMF07CisgICAgICAgICAgICBpbnQgeV9zdHJpZGVfZHN0ID0gc3RyaWRlX2RzdCAqIChoZWlnaHQgLSAxKTsKKyAgICAgICAgICAgIGludCB5X3N0cmlkZV9zcmMgPSBzdHJpZGVfc3JjICogKGhlaWdodCAtIDEpOworICAgICAgICAgICAgZm9yICh4ID0gaW5pdF94OyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICBkc3RbeCArIHlfc3RyaWRlX2RzdF0gPSBhdl9jbGlwX3BpeGVsKHNyY1t4ICsgeV9zdHJpZGVfc3JjXSArIG9mZnNldF92YWwpOworICAgICAgICAgICAgaGVpZ2h0LS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGVU5DKHNhb19lZGdlX2ZpbHRlcikoKHVpbnQ4X3QgKilkc3QsICh1aW50OF90ICopc3JjLCBzdHJpZGVfZHN0LCBzdHJpZGVfc3JjLCBzYW8sIHdpZHRoLCBoZWlnaHQsIGNfaWR4LCBpbml0X3gsIGluaXRfeSk7CisKKyAgICB7CisgICAgICAgIGludCBzYXZlX3VwcGVyX2xlZnQgID0gIWRpYWdfZWRnZVswXSAmJiBzYW9fZW9fY2xhc3MgPT0gU0FPX0VPXzEzNUQgJiYgIWJvcmRlcnNbMF0gJiYgIWJvcmRlcnNbMV07CisgICAgICAgIGludCBzYXZlX3VwcGVyX3JpZ2h0ID0gIWRpYWdfZWRnZVsxXSAmJiBzYW9fZW9fY2xhc3MgPT0gU0FPX0VPXzQ1RCAgJiYgIWJvcmRlcnNbMV0gJiYgIWJvcmRlcnNbMl07CisgICAgICAgIGludCBzYXZlX2xvd2VyX3JpZ2h0ID0gIWRpYWdfZWRnZVsyXSAmJiBzYW9fZW9fY2xhc3MgPT0gU0FPX0VPXzEzNUQgJiYgIWJvcmRlcnNbMl0gJiYgIWJvcmRlcnNbM107CisgICAgICAgIGludCBzYXZlX2xvd2VyX2xlZnQgID0gIWRpYWdfZWRnZVszXSAmJiBzYW9fZW9fY2xhc3MgPT0gU0FPX0VPXzQ1RCAgJiYgIWJvcmRlcnNbMF0gJiYgIWJvcmRlcnNbM107CisKKyAgICAgICAgLy8gUmVzdG9yZSBwaXhlbHMgdGhhdCBjYW4ndCBiZSBtb2RpZmllZAorICAgICAgICBpZih2ZXJ0X2VkZ2VbMF0gJiYgc2FvX2VvX2NsYXNzICE9IFNBT19FT19WRVJUKSB7CisgICAgICAgICAgICBmb3IoeSA9IGluaXRfeStzYXZlX3VwcGVyX2xlZnQ7IHk8IGhlaWdodC1zYXZlX2xvd2VyX2xlZnQ7IHkrKykKKyAgICAgICAgICAgICAgICBkc3RbeSpzdHJpZGVfZHN0XSA9IHNyY1t5KnN0cmlkZV9zcmNdOworICAgICAgICB9CisgICAgICAgIGlmKHZlcnRfZWRnZVsxXSAmJiBzYW9fZW9fY2xhc3MgIT0gU0FPX0VPX1ZFUlQpIHsKKyAgICAgICAgICAgIGZvcih5ID0gaW5pdF95K3NhdmVfdXBwZXJfcmlnaHQ7IHk8IGhlaWdodC1zYXZlX2xvd2VyX3JpZ2h0OyB5KyspCisgICAgICAgICAgICAgICAgZHN0W3kqc3RyaWRlX2RzdCt3aWR0aC0xXSA9IHNyY1t5KnN0cmlkZV9zcmMrd2lkdGgtMV07CisgICAgICAgIH0KKworICAgICAgICBpZihob3Jpel9lZGdlWzBdICYmIHNhb19lb19jbGFzcyAhPSBTQU9fRU9fSE9SSVopIHsKKyAgICAgICAgICAgIGZvcih4ID0gaW5pdF94K3NhdmVfdXBwZXJfbGVmdDsgeCA8IHdpZHRoLXNhdmVfdXBwZXJfcmlnaHQ7IHgrKykKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBzcmNbeF07CisgICAgICAgIH0KKyAgICAgICAgaWYoaG9yaXpfZWRnZVsxXSAmJiBzYW9fZW9fY2xhc3MgIT0gU0FPX0VPX0hPUklaKSB7CisgICAgICAgICAgICBmb3IoeCA9IGluaXRfeCtzYXZlX2xvd2VyX2xlZnQ7IHggPCB3aWR0aC1zYXZlX2xvd2VyX3JpZ2h0OyB4KyspCisgICAgICAgICAgICAgICAgZHN0WyhoZWlnaHQtMSkqc3RyaWRlX2RzdCt4XSA9IHNyY1soaGVpZ2h0LTEpKnN0cmlkZV9zcmMreF07CisgICAgICAgIH0KKyAgICAgICAgaWYoZGlhZ19lZGdlWzBdICYmIHNhb19lb19jbGFzcyA9PSBTQU9fRU9fMTM1RCkKKyAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgaWYoZGlhZ19lZGdlWzFdICYmIHNhb19lb19jbGFzcyA9PSBTQU9fRU9fNDVEKQorICAgICAgICAgICAgZHN0W3dpZHRoLTFdID0gc3JjW3dpZHRoLTFdOworICAgICAgICBpZihkaWFnX2VkZ2VbMl0gJiYgc2FvX2VvX2NsYXNzID09IFNBT19FT18xMzVEKQorICAgICAgICAgICAgZHN0W3N0cmlkZV9kc3QqKGhlaWdodC0xKSt3aWR0aC0xXSA9IHNyY1tzdHJpZGVfc3JjKihoZWlnaHQtMSkrd2lkdGgtMV07CisgICAgICAgIGlmKGRpYWdfZWRnZVszXSAmJiBzYW9fZW9fY2xhc3MgPT0gU0FPX0VPXzQ1RCkKKyAgICAgICAgICAgIGRzdFtzdHJpZGVfZHN0KihoZWlnaHQtMSldID0gc3JjW3N0cmlkZV9zcmMqKGhlaWdodC0xKV07CisKKyAgICB9Cit9CisKKyN1bmRlZiBDTVAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19wZWxfcGl4ZWxzKShpbnQxNl90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqc3JjICAgICAgICAgID0gKHBpeGVsICopX3NyYzsKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBzcmNbeF0gPDwgKDE0IC0gQklUX0RFUFRIKTsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICAgICAgZHN0ICs9IE1BWF9QQl9TSVpFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19wZWxfdW5pX3BpeGVscykodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IF9kc3RzdHJpZGUsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHk7CisgICAgcGl4ZWwgKnNyYyAgICAgICAgICA9IChwaXhlbCAqKV9zcmM7CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIHBpeGVsICpkc3QgICAgICAgICAgPSAocGl4ZWwgKilfZHN0OworICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUgPSBfZHN0c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoICogc2l6ZW9mKHBpeGVsKSk7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX3BlbF9iaV9waXhlbHMpKHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyAgICAgICAgICA9IChwaXhlbCAqKV9zcmM7CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIHBpeGVsICpkc3QgICAgICAgICAgPSAocGl4ZWwgKilfZHN0OworICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUgPSBfZHN0c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKworICAgIGludCBzaGlmdCA9IDE0ICArIDEgLSBCSVRfREVQVEg7CisjaWYgQklUX0RFUFRIIDwgMTQKKyAgICBpbnQgb2Zmc2V0ID0gMSA8PCAoc2hpZnQgLSAxKTsKKyNlbHNlCisgICAgaW50IG9mZnNldCA9IDA7CisjZW5kaWYKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKChzcmNbeF0gPDwgKDE0IC0gQklUX0RFUFRIKSkgKyBzcmMyW3hdICsgb2Zmc2V0KSA+PiBzaGlmdCk7CisgICAgICAgIHNyYyAgKz0gc3Jjc3RyaWRlOworICAgICAgICBkc3QgICs9IGRzdHN0cmlkZTsKKyAgICAgICAgc3JjMiArPSBNQVhfUEJfU0laRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMocHV0X2hldmNfcGVsX3VuaV93X3BpeGVscykodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IF9kc3RzdHJpZGUsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgZGVub20sIGludCB3eCwgaW50IG94LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqc3JjICAgICAgICAgID0gKHBpeGVsICopX3NyYzsKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgcGl4ZWwgKmRzdCAgICAgICAgICA9IChwaXhlbCAqKV9kc3Q7CisgICAgcHRyZGlmZl90IGRzdHN0cmlkZSA9IF9kc3RzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIGludCBzaGlmdCA9IGRlbm9tICsgMTQgLSBCSVRfREVQVEg7CisjaWYgQklUX0RFUFRIIDwgMTQKKyAgICBpbnQgb2Zmc2V0ID0gMSA8PCAoc2hpZnQgLSAxKTsKKyNlbHNlCisgICAgaW50IG9mZnNldCA9IDA7CisjZW5kaWYKKworICAgIG94ICAgICA9IG94ICogKDEgPDwgKEJJVF9ERVBUSCAtIDgpKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKCgoKHNyY1t4XSA8PCAoMTQgLSBCSVRfREVQVEgpKSAqIHd4ICsgb2Zmc2V0KSA+PiBzaGlmdCkgKyBveCk7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX3BlbF9iaV93X3BpeGVscykodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IF9kc3RzdHJpZGUsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGRlbm9tLCBpbnQgd3gwLCBpbnQgd3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBveDAsIGludCBveDEsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKQoreworICAgIGludCB4LCB5OworICAgIHBpeGVsICpzcmMgICAgICAgICAgPSAocGl4ZWwgKilfc3JjOworICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUgPSBfc3Jjc3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwaXhlbCAqZHN0ICAgICAgICAgID0gKHBpeGVsICopX2RzdDsKKyAgICBwdHJkaWZmX3QgZHN0c3RyaWRlID0gX2RzdHN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisKKyAgICBpbnQgc2hpZnQgPSAxNCAgKyAxIC0gQklUX0RFUFRIOworICAgIGludCBsb2cyV2QgPSBkZW5vbSArIHNoaWZ0IC0gMTsKKworICAgIG94MCAgICAgPSBveDAgKiAoMSA8PCAoQklUX0RFUFRIIC0gOCkpOworICAgIG94MSAgICAgPSBveDEgKiAoMSA8PCAoQklUX0RFUFRIIC0gOCkpOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCgoIChzcmNbeF0gPDwgKDE0IC0gQklUX0RFUFRIKSkgKiB3eDEgKyBzcmMyW3hdICogd3gwICsgKChveDAgKyBveDEgKyAxKSA8PCBsb2cyV2QpKSA+PiAobG9nMldkICsgMSkpOworICAgICAgICB9CisgICAgICAgIHNyYyAgKz0gc3Jjc3RyaWRlOworICAgICAgICBkc3QgICs9IGRzdHN0cmlkZTsKKyAgICAgICAgc3JjMiArPSBNQVhfUEJfU0laRTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgUVBFTF9GSUxURVIoc3JjLCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGZpbHRlclswXSAqIHNyY1t4IC0gMyAqIHN0cmlkZV0gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBmaWx0ZXJbMV0gKiBzcmNbeCAtIDIgKiBzdHJpZGVdICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZmlsdGVyWzJdICogc3JjW3ggLSAgICAgc3RyaWRlXSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGZpbHRlclszXSAqIHNyY1t4ICAgICAgICAgICAgIF0gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBmaWx0ZXJbNF0gKiBzcmNbeCArICAgICBzdHJpZGVdICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZmlsdGVyWzVdICogc3JjW3ggKyAyICogc3RyaWRlXSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGZpbHRlcls2XSAqIHNyY1t4ICsgMyAqIHN0cmlkZV0gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBmaWx0ZXJbN10gKiBzcmNbeCArIDQgKiBzdHJpZGVdKQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX3FwZWxfaCkoaW50MTZfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKQoreworICAgIGludCB4LCB5OworICAgIHBpeGVsICAgICAgICAqc3JjICAgICAgID0gKHBpeGVsKilfc3JjOworICAgIHB0cmRpZmZfdCAgICAgc3Jjc3RyaWRlID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgICAgPSBmZl9oZXZjX3FwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IFFQRUxfRklMVEVSKHNyYywgMSkgPj4gKEJJVF9ERVBUSCAtIDgpOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgICBkc3QgKz0gTUFYX1BCX1NJWkU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX3FwZWxfdikoaW50MTZfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKQoreworICAgIGludCB4LCB5OworICAgIHBpeGVsICAgICAgICAqc3JjICAgICAgID0gKHBpeGVsKilfc3JjOworICAgIHB0cmRpZmZfdCAgICAgc3Jjc3RyaWRlID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgICAgPSBmZl9oZXZjX3FwZWxfZmlsdGVyc1tteSAtIDFdOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBRUEVMX0ZJTFRFUihzcmMsIHNyY3N0cmlkZSkgPj4gKEJJVF9ERVBUSCAtIDgpOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgICBkc3QgKz0gTUFYX1BCX1NJWkU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX3FwZWxfaHYpKGludDE2X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludHB0cl90IG14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteSwgaW50IHdpZHRoKQoreworICAgIGludCB4LCB5OworICAgIGNvbnN0IGludDhfdCAqZmlsdGVyOworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIGludDE2X3QgdG1wX2FycmF5WyhNQVhfUEJfU0laRSArIFFQRUxfRVhUUkEpICogTUFYX1BCX1NJWkVdOworICAgIGludDE2X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIHNyYyAgIC09IFFQRUxfRVhUUkFfQkVGT1JFICogc3Jjc3RyaWRlOworICAgIGZpbHRlciA9IGZmX2hldmNfcXBlbF9maWx0ZXJzW214IC0gMV07CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodCArIFFQRUxfRVhUUkE7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIHRtcFt4XSA9IFFQRUxfRklMVEVSKHNyYywgMSkgPj4gKEJJVF9ERVBUSCAtIDgpOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgICB0bXAgKz0gTUFYX1BCX1NJWkU7CisgICAgfQorCisgICAgdG1wICAgID0gdG1wX2FycmF5ICsgUVBFTF9FWFRSQV9CRUZPUkUgKiBNQVhfUEJfU0laRTsKKyAgICBmaWx0ZXIgPSBmZl9oZXZjX3FwZWxfZmlsdGVyc1tteSAtIDFdOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IFFQRUxfRklMVEVSKHRtcCwgTUFYX1BCX1NJWkUpID4+IDY7CisgICAgICAgIHRtcCArPSBNQVhfUEJfU0laRTsKKyAgICAgICAgZHN0ICs9IE1BWF9QQl9TSVpFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19xcGVsX3VuaV9oKSh1aW50OF90ICpfZHN0LCAgcHRyZGlmZl90IF9kc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAgICAgICAgKnNyYyAgICAgICA9IChwaXhlbCopX3NyYzsKKyAgICBwdHJkaWZmX3QgICAgIHNyY3N0cmlkZSA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIHBpeGVsICpkc3QgICAgICAgICAgPSAocGl4ZWwgKilfZHN0OworICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUgPSBfZHN0c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciAgICA9IGZmX2hldmNfcXBlbF9maWx0ZXJzW214IC0gMV07CisgICAgaW50IHNoaWZ0ID0gMTQgLSBCSVRfREVQVEg7CisKKyNpZiBCSVRfREVQVEggPCAxNAorICAgIGludCBvZmZzZXQgPSAxIDw8IChzaGlmdCAtIDEpOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyNlbmRpZgorCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCgoKFFQRUxfRklMVEVSKHNyYywgMSkgPj4gKEJJVF9ERVBUSCAtIDgpKSArIG9mZnNldCkgPj4gc2hpZnQpOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19xcGVsX2JpX2gpKHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKQoreworICAgIGludCB4LCB5OworICAgIHBpeGVsICAgICAgICAqc3JjICAgICAgID0gKHBpeGVsKilfc3JjOworICAgIHB0cmRpZmZfdCAgICAgc3Jjc3RyaWRlID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgcGl4ZWwgKmRzdCAgICAgICAgICA9IChwaXhlbCAqKV9kc3Q7CisgICAgcHRyZGlmZl90IGRzdHN0cmlkZSA9IF9kc3RzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworCisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgICAgPSBmZl9oZXZjX3FwZWxfZmlsdGVyc1tteCAtIDFdOworCisgICAgaW50IHNoaWZ0ID0gMTQgICsgMSAtIEJJVF9ERVBUSDsKKyNpZiBCSVRfREVQVEggPCAxNAorICAgIGludCBvZmZzZXQgPSAxIDw8IChzaGlmdCAtIDEpOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyNlbmRpZgorCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCgoKFFQRUxfRklMVEVSKHNyYywgMSkgPj4gKEJJVF9ERVBUSCAtIDgpKSArIHNyYzJbeF0gKyBvZmZzZXQpID4+IHNoaWZ0KTsKKyAgICAgICAgc3JjICArPSBzcmNzdHJpZGU7CisgICAgICAgIGRzdCAgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMyICs9IE1BWF9QQl9TSVpFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19xcGVsX3VuaV92KSh1aW50OF90ICpfZHN0LCAgcHRyZGlmZl90IF9kc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgICAgICAgICpzcmMgICAgICAgPSAocGl4ZWwqKV9zcmM7CisgICAgcHRyZGlmZl90ICAgICBzcmNzdHJpZGUgPSBfc3Jjc3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwaXhlbCAqZHN0ICAgICAgICAgID0gKHBpeGVsICopX2RzdDsKKyAgICBwdHJkaWZmX3QgZHN0c3RyaWRlID0gX2RzdHN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgICAgPSBmZl9oZXZjX3FwZWxfZmlsdGVyc1tteSAtIDFdOworICAgIGludCBzaGlmdCA9IDE0IC0gQklUX0RFUFRIOworCisjaWYgQklUX0RFUFRIIDwgMTQKKyAgICBpbnQgb2Zmc2V0ID0gMSA8PCAoc2hpZnQgLSAxKTsKKyNlbHNlCisgICAgaW50IG9mZnNldCA9IDA7CisjZW5kaWYKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKChRUEVMX0ZJTFRFUihzcmMsIHNyY3N0cmlkZSkgPj4gKEJJVF9ERVBUSCAtIDgpKSArIG9mZnNldCkgPj4gc2hpZnQpOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX3FwZWxfYmlfdikodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IF9kc3RzdHJpZGUsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgICAgICAgICpzcmMgICAgICAgPSAocGl4ZWwqKV9zcmM7CisgICAgcHRyZGlmZl90ICAgICBzcmNzdHJpZGUgPSBfc3Jjc3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwaXhlbCAqZHN0ICAgICAgICAgID0gKHBpeGVsICopX2RzdDsKKyAgICBwdHJkaWZmX3QgZHN0c3RyaWRlID0gX2RzdHN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciAgICA9IGZmX2hldmNfcXBlbF9maWx0ZXJzW215IC0gMV07CisKKyAgICBpbnQgc2hpZnQgPSAxNCArIDEgLSBCSVRfREVQVEg7CisjaWYgQklUX0RFUFRIIDwgMTQKKyAgICBpbnQgb2Zmc2V0ID0gMSA8PCAoc2hpZnQgLSAxKTsKKyNlbHNlCisgICAgaW50IG9mZnNldCA9IDA7CisjZW5kaWYKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKChRUEVMX0ZJTFRFUihzcmMsIHNyY3N0cmlkZSkgPj4gKEJJVF9ERVBUSCAtIDgpKSArIHNyYzJbeF0gKyBvZmZzZXQpID4+IHNoaWZ0KTsKKyAgICAgICAgc3JjICArPSBzcmNzdHJpZGU7CisgICAgICAgIGRzdCAgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMyICs9IE1BWF9QQl9TSVpFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19xcGVsX3VuaV9odikodWludDhfdCAqX2RzdCwgIHB0cmRpZmZfdCBfZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcjsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjOworICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUgPSBfc3Jjc3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwaXhlbCAqZHN0ICAgICAgICAgID0gKHBpeGVsICopX2RzdDsKKyAgICBwdHJkaWZmX3QgZHN0c3RyaWRlID0gX2RzdHN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgaW50MTZfdCB0bXBfYXJyYXlbKE1BWF9QQl9TSVpFICsgUVBFTF9FWFRSQSkgKiBNQVhfUEJfU0laRV07CisgICAgaW50MTZfdCAqdG1wID0gdG1wX2FycmF5OworICAgIGludCBzaGlmdCA9ICAxNCAtIEJJVF9ERVBUSDsKKworI2lmIEJJVF9ERVBUSCA8IDE0CisgICAgaW50IG9mZnNldCA9IDEgPDwgKHNoaWZ0IC0gMSk7CisjZWxzZQorICAgIGludCBvZmZzZXQgPSAwOworI2VuZGlmCisKKyAgICBzcmMgICAtPSBRUEVMX0VYVFJBX0JFRk9SRSAqIHNyY3N0cmlkZTsKKyAgICBmaWx0ZXIgPSBmZl9oZXZjX3FwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQgKyBRUEVMX0VYVFJBOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICB0bXBbeF0gPSBRUEVMX0ZJTFRFUihzcmMsIDEpID4+IChCSVRfREVQVEggLSA4KTsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICAgICAgdG1wICs9IE1BWF9QQl9TSVpFOworICAgIH0KKworICAgIHRtcCAgICA9IHRtcF9hcnJheSArIFFQRUxfRVhUUkFfQkVGT1JFICogTUFYX1BCX1NJWkU7CisgICAgZmlsdGVyID0gZmZfaGV2Y19xcGVsX2ZpbHRlcnNbbXkgLSAxXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKChRUEVMX0ZJTFRFUih0bXAsIE1BWF9QQl9TSVpFKSA+PiA2KSArIG9mZnNldCkgPj4gc2hpZnQpOworICAgICAgICB0bXAgKz0gTUFYX1BCX1NJWkU7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX3FwZWxfYmlfaHYpKHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXI7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgcGl4ZWwgKmRzdCAgICAgICAgICA9IChwaXhlbCAqKV9kc3Q7CisgICAgcHRyZGlmZl90IGRzdHN0cmlkZSA9IF9kc3RzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIGludDE2X3QgdG1wX2FycmF5WyhNQVhfUEJfU0laRSArIFFQRUxfRVhUUkEpICogTUFYX1BCX1NJWkVdOworICAgIGludDE2X3QgKnRtcCA9IHRtcF9hcnJheTsKKyAgICBpbnQgc2hpZnQgPSAxNCArIDEgLSBCSVRfREVQVEg7CisjaWYgQklUX0RFUFRIIDwgMTQKKyAgICBpbnQgb2Zmc2V0ID0gMSA8PCAoc2hpZnQgLSAxKTsKKyNlbHNlCisgICAgaW50IG9mZnNldCA9IDA7CisjZW5kaWYKKworICAgIHNyYyAgIC09IFFQRUxfRVhUUkFfQkVGT1JFICogc3Jjc3RyaWRlOworICAgIGZpbHRlciA9IGZmX2hldmNfcXBlbF9maWx0ZXJzW214IC0gMV07CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodCArIFFQRUxfRVhUUkE7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIHRtcFt4XSA9IFFQRUxfRklMVEVSKHNyYywgMSkgPj4gKEJJVF9ERVBUSCAtIDgpOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgICB0bXAgKz0gTUFYX1BCX1NJWkU7CisgICAgfQorCisgICAgdG1wICAgID0gdG1wX2FycmF5ICsgUVBFTF9FWFRSQV9CRUZPUkUgKiBNQVhfUEJfU0laRTsKKyAgICBmaWx0ZXIgPSBmZl9oZXZjX3FwZWxfZmlsdGVyc1tteSAtIDFdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCgoKFFQRUxfRklMVEVSKHRtcCwgTUFYX1BCX1NJWkUpID4+IDYpICsgc3JjMlt4XSArIG9mZnNldCkgPj4gc2hpZnQpOworICAgICAgICB0bXAgICs9IE1BWF9QQl9TSVpFOworICAgICAgICBkc3QgICs9IGRzdHN0cmlkZTsKKyAgICAgICAgc3JjMiArPSBNQVhfUEJfU0laRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMocHV0X2hldmNfcXBlbF91bmlfd19oKSh1aW50OF90ICpfZHN0LCAgcHRyZGlmZl90IF9kc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGRlbm9tLCBpbnQgd3gsIGludCBveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAgICAgICAgKnNyYyAgICAgICA9IChwaXhlbCopX3NyYzsKKyAgICBwdHJkaWZmX3QgICAgIHNyY3N0cmlkZSA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIHBpeGVsICpkc3QgICAgICAgICAgPSAocGl4ZWwgKilfZHN0OworICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUgPSBfZHN0c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciAgICA9IGZmX2hldmNfcXBlbF9maWx0ZXJzW214IC0gMV07CisgICAgaW50IHNoaWZ0ID0gZGVub20gKyAxNCAtIEJJVF9ERVBUSDsKKyNpZiBCSVRfREVQVEggPCAxNAorICAgIGludCBvZmZzZXQgPSAxIDw8IChzaGlmdCAtIDEpOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyNlbmRpZgorCisgICAgb3ggPSBveCAqICgxIDw8IChCSVRfREVQVEggLSA4KSk7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCgoKChRUEVMX0ZJTFRFUihzcmMsIDEpID4+IChCSVRfREVQVEggLSA4KSkgKiB3eCArIG9mZnNldCkgPj4gc2hpZnQpICsgb3gpOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19xcGVsX2JpX3dfaCkodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IF9kc3RzdHJpZGUsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBkZW5vbSwgaW50IHd4MCwgaW50IHd4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBveDAsIGludCBveDEsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKQoreworICAgIGludCB4LCB5OworICAgIHBpeGVsICAgICAgICAqc3JjICAgICAgID0gKHBpeGVsKilfc3JjOworICAgIHB0cmRpZmZfdCAgICAgc3Jjc3RyaWRlID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgcGl4ZWwgKmRzdCAgICAgICAgICA9IChwaXhlbCAqKV9kc3Q7CisgICAgcHRyZGlmZl90IGRzdHN0cmlkZSA9IF9kc3RzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworCisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgICAgPSBmZl9oZXZjX3FwZWxfZmlsdGVyc1tteCAtIDFdOworCisgICAgaW50IHNoaWZ0ID0gMTQgICsgMSAtIEJJVF9ERVBUSDsKKyAgICBpbnQgbG9nMldkID0gZGVub20gKyBzaGlmdCAtIDE7CisKKyAgICBveDAgICAgID0gb3gwICogKDEgPDwgKEJJVF9ERVBUSCAtIDgpKTsKKyAgICBveDEgICAgID0gb3gxICogKDEgPDwgKEJJVF9ERVBUSCAtIDgpKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKCgoUVBFTF9GSUxURVIoc3JjLCAxKSA+PiAoQklUX0RFUFRIIC0gOCkpICogd3gxICsgc3JjMlt4XSAqIHd4MCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG94MCArIG94MSArIDEpIDw8IGxvZzJXZCkpID4+IChsb2cyV2QgKyAxKSk7CisgICAgICAgIHNyYyAgKz0gc3Jjc3RyaWRlOworICAgICAgICBkc3QgICs9IGRzdHN0cmlkZTsKKyAgICAgICAgc3JjMiArPSBNQVhfUEJfU0laRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMocHV0X2hldmNfcXBlbF91bmlfd192KSh1aW50OF90ICpfZHN0LCAgcHRyZGlmZl90IF9kc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGRlbm9tLCBpbnQgd3gsIGludCBveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAgICAgICAgKnNyYyAgICAgICA9IChwaXhlbCopX3NyYzsKKyAgICBwdHJkaWZmX3QgICAgIHNyY3N0cmlkZSA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIHBpeGVsICpkc3QgICAgICAgICAgPSAocGl4ZWwgKilfZHN0OworICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUgPSBfZHN0c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciAgICA9IGZmX2hldmNfcXBlbF9maWx0ZXJzW215IC0gMV07CisgICAgaW50IHNoaWZ0ID0gZGVub20gKyAxNCAtIEJJVF9ERVBUSDsKKyNpZiBCSVRfREVQVEggPCAxNAorICAgIGludCBvZmZzZXQgPSAxIDw8IChzaGlmdCAtIDEpOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyNlbmRpZgorCisgICAgb3ggPSBveCAqICgxIDw8IChCSVRfREVQVEggLSA4KSk7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCgoKChRUEVMX0ZJTFRFUihzcmMsIHNyY3N0cmlkZSkgPj4gKEJJVF9ERVBUSCAtIDgpKSAqIHd4ICsgb2Zmc2V0KSA+PiBzaGlmdCkgKyBveCk7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX3FwZWxfYmlfd192KSh1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgX2RzdHN0cmlkZSwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGRlbm9tLCBpbnQgd3gwLCBpbnQgd3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG94MCwgaW50IG94MSwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgICAgICAgICpzcmMgICAgICAgPSAocGl4ZWwqKV9zcmM7CisgICAgcHRyZGlmZl90ICAgICBzcmNzdHJpZGUgPSBfc3Jjc3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwaXhlbCAqZHN0ICAgICAgICAgID0gKHBpeGVsICopX2RzdDsKKyAgICBwdHJkaWZmX3QgZHN0c3RyaWRlID0gX2RzdHN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciAgICA9IGZmX2hldmNfcXBlbF9maWx0ZXJzW215IC0gMV07CisKKyAgICBpbnQgc2hpZnQgPSAxNCArIDEgLSBCSVRfREVQVEg7CisgICAgaW50IGxvZzJXZCA9IGRlbm9tICsgc2hpZnQgLSAxOworCisgICAgb3gwICAgICA9IG94MCAqICgxIDw8IChCSVRfREVQVEggLSA4KSk7CisgICAgb3gxICAgICA9IG94MSAqICgxIDw8IChCSVRfREVQVEggLSA4KSk7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCgoKFFQRUxfRklMVEVSKHNyYywgc3Jjc3RyaWRlKSA+PiAoQklUX0RFUFRIIC0gOCkpICogd3gxICsgc3JjMlt4XSAqIHd4MCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG94MCArIG94MSArIDEpIDw8IGxvZzJXZCkpID4+IChsb2cyV2QgKyAxKSk7CisgICAgICAgIHNyYyAgKz0gc3Jjc3RyaWRlOworICAgICAgICBkc3QgICs9IGRzdHN0cmlkZTsKKyAgICAgICAgc3JjMiArPSBNQVhfUEJfU0laRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMocHV0X2hldmNfcXBlbF91bmlfd19odikodWludDhfdCAqX2RzdCwgIHB0cmRpZmZfdCBfZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGRlbm9tLCBpbnQgd3gsIGludCBveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXI7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYzsKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgcGl4ZWwgKmRzdCAgICAgICAgICA9IChwaXhlbCAqKV9kc3Q7CisgICAgcHRyZGlmZl90IGRzdHN0cmlkZSA9IF9kc3RzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIGludDE2X3QgdG1wX2FycmF5WyhNQVhfUEJfU0laRSArIFFQRUxfRVhUUkEpICogTUFYX1BCX1NJWkVdOworICAgIGludDE2X3QgKnRtcCA9IHRtcF9hcnJheTsKKyAgICBpbnQgc2hpZnQgPSBkZW5vbSArIDE0IC0gQklUX0RFUFRIOworI2lmIEJJVF9ERVBUSCA8IDE0CisgICAgaW50IG9mZnNldCA9IDEgPDwgKHNoaWZ0IC0gMSk7CisjZWxzZQorICAgIGludCBvZmZzZXQgPSAwOworI2VuZGlmCisKKyAgICBzcmMgICAtPSBRUEVMX0VYVFJBX0JFRk9SRSAqIHNyY3N0cmlkZTsKKyAgICBmaWx0ZXIgPSBmZl9oZXZjX3FwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQgKyBRUEVMX0VYVFJBOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICB0bXBbeF0gPSBRUEVMX0ZJTFRFUihzcmMsIDEpID4+IChCSVRfREVQVEggLSA4KTsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICAgICAgdG1wICs9IE1BWF9QQl9TSVpFOworICAgIH0KKworICAgIHRtcCAgICA9IHRtcF9hcnJheSArIFFQRUxfRVhUUkFfQkVGT1JFICogTUFYX1BCX1NJWkU7CisgICAgZmlsdGVyID0gZmZfaGV2Y19xcGVsX2ZpbHRlcnNbbXkgLSAxXTsKKworICAgIG94ID0gb3ggKiAoMSA8PCAoQklUX0RFUFRIIC0gOCkpOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKCgoUVBFTF9GSUxURVIodG1wLCBNQVhfUEJfU0laRSkgPj4gNikgKiB3eCArIG9mZnNldCkgPj4gc2hpZnQpICsgb3gpOworICAgICAgICB0bXAgKz0gTUFYX1BCX1NJWkU7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX3FwZWxfYmlfd19odikodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IF9kc3RzdHJpZGUsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGRlbm9tLCBpbnQgd3gwLCBpbnQgd3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBveDAsIGludCBveDEsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKQoreworICAgIGludCB4LCB5OworICAgIGNvbnN0IGludDhfdCAqZmlsdGVyOworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKV9zcmM7CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIHBpeGVsICpkc3QgICAgICAgICAgPSAocGl4ZWwgKilfZHN0OworICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUgPSBfZHN0c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBpbnQxNl90IHRtcF9hcnJheVsoTUFYX1BCX1NJWkUgKyBRUEVMX0VYVFJBKSAqIE1BWF9QQl9TSVpFXTsKKyAgICBpbnQxNl90ICp0bXAgPSB0bXBfYXJyYXk7CisgICAgaW50IHNoaWZ0ID0gMTQgKyAxIC0gQklUX0RFUFRIOworICAgIGludCBsb2cyV2QgPSBkZW5vbSArIHNoaWZ0IC0gMTsKKworICAgIHNyYyAgIC09IFFQRUxfRVhUUkFfQkVGT1JFICogc3Jjc3RyaWRlOworICAgIGZpbHRlciA9IGZmX2hldmNfcXBlbF9maWx0ZXJzW214IC0gMV07CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodCArIFFQRUxfRVhUUkE7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIHRtcFt4XSA9IFFQRUxfRklMVEVSKHNyYywgMSkgPj4gKEJJVF9ERVBUSCAtIDgpOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgICB0bXAgKz0gTUFYX1BCX1NJWkU7CisgICAgfQorCisgICAgdG1wICAgID0gdG1wX2FycmF5ICsgUVBFTF9FWFRSQV9CRUZPUkUgKiBNQVhfUEJfU0laRTsKKyAgICBmaWx0ZXIgPSBmZl9oZXZjX3FwZWxfZmlsdGVyc1tteSAtIDFdOworCisgICAgb3gwICAgICA9IG94MCAqICgxIDw8IChCSVRfREVQVEggLSA4KSk7CisgICAgb3gxICAgICA9IG94MSAqICgxIDw8IChCSVRfREVQVEggLSA4KSk7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCgoKFFQRUxfRklMVEVSKHRtcCwgTUFYX1BCX1NJWkUpID4+IDYpICogd3gxICsgc3JjMlt4XSAqIHd4MCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG94MCArIG94MSArIDEpIDw8IGxvZzJXZCkpID4+IChsb2cyV2QgKyAxKSk7CisgICAgICAgIHRtcCAgKz0gTUFYX1BCX1NJWkU7CisgICAgICAgIGRzdCAgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMyICs9IE1BWF9QQl9TSVpFOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBFUEVMX0ZJTFRFUihzcmMsIHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZmlsdGVyWzBdICogc3JjW3ggLSBzdHJpZGVdICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGZpbHRlclsxXSAqIHNyY1t4XSAgICAgICAgICArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBmaWx0ZXJbMl0gKiBzcmNbeCArIHN0cmlkZV0gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZmlsdGVyWzNdICogc3JjW3ggKyAyICogc3RyaWRlXSkKKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19lcGVsX2gpKGludDE2X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsICopX3NyYzsKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlICA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIGNvbnN0IGludDhfdCAqZmlsdGVyID0gZmZfaGV2Y19lcGVsX2ZpbHRlcnNbbXggLSAxXTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBFUEVMX0ZJTFRFUihzcmMsIDEpID4+IChCSVRfREVQVEggLSA4KTsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICAgICAgZHN0ICs9IE1BWF9QQl9TSVpFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19lcGVsX3YpKGludDE2X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsICopX3NyYzsKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgPSBmZl9oZXZjX2VwZWxfZmlsdGVyc1tteSAtIDFdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gRVBFTF9GSUxURVIoc3JjLCBzcmNzdHJpZGUpID4+IChCSVRfREVQVEggLSA4KTsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICAgICAgZHN0ICs9IE1BWF9QQl9TSVpFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19lcGVsX2h2KShpbnQxNl90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsICopX3NyYzsKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgPSBmZl9oZXZjX2VwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGludDE2X3QgdG1wX2FycmF5WyhNQVhfUEJfU0laRSArIEVQRUxfRVhUUkEpICogTUFYX1BCX1NJWkVdOworICAgIGludDE2X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIHNyYyAtPSBFUEVMX0VYVFJBX0JFRk9SRSAqIHNyY3N0cmlkZTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQgKyBFUEVMX0VYVFJBOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICB0bXBbeF0gPSBFUEVMX0ZJTFRFUihzcmMsIDEpID4+IChCSVRfREVQVEggLSA4KTsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICAgICAgdG1wICs9IE1BWF9QQl9TSVpFOworICAgIH0KKworICAgIHRtcCAgICAgID0gdG1wX2FycmF5ICsgRVBFTF9FWFRSQV9CRUZPUkUgKiBNQVhfUEJfU0laRTsKKyAgICBmaWx0ZXIgPSBmZl9oZXZjX2VwZWxfZmlsdGVyc1tteSAtIDFdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gRVBFTF9GSUxURVIodG1wLCBNQVhfUEJfU0laRSkgPj4gNjsKKyAgICAgICAgdG1wICs9IE1BWF9QQl9TSVpFOworICAgICAgICBkc3QgKz0gTUFYX1BCX1NJWkU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX2VwZWxfdW5pX2gpKHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCAqKV9zcmM7CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSAgPSBfc3Jjc3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwaXhlbCAqZHN0ICAgICAgICAgID0gKHBpeGVsICopX2RzdDsKKyAgICBwdHJkaWZmX3QgZHN0c3RyaWRlID0gX2RzdHN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgPSBmZl9oZXZjX2VwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGludCBzaGlmdCA9IDE0IC0gQklUX0RFUFRIOworI2lmIEJJVF9ERVBUSCA8IDE0CisgICAgaW50IG9mZnNldCA9IDEgPDwgKHNoaWZ0IC0gMSk7CisjZWxzZQorICAgIGludCBvZmZzZXQgPSAwOworI2VuZGlmCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKCgoRVBFTF9GSUxURVIoc3JjLCAxKSA+PiAoQklUX0RFUFRIIC0gOCkpICsgb2Zmc2V0KSA+PiBzaGlmdCk7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX2VwZWxfYmlfaCkodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IF9kc3RzdHJpZGUsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCAqKV9zcmM7CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSAgPSBfc3Jjc3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwaXhlbCAqZHN0ICAgICAgICAgID0gKHBpeGVsICopX2RzdDsKKyAgICBwdHJkaWZmX3QgZHN0c3RyaWRlID0gX2RzdHN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgPSBmZl9oZXZjX2VwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGludCBzaGlmdCA9IDE0ICsgMSAtIEJJVF9ERVBUSDsKKyNpZiBCSVRfREVQVEggPCAxNAorICAgIGludCBvZmZzZXQgPSAxIDw8IChzaGlmdCAtIDEpOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyNlbmRpZgorCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKCgoRVBFTF9GSUxURVIoc3JjLCAxKSA+PiAoQklUX0RFUFRIIC0gOCkpICsgc3JjMlt4XSArIG9mZnNldCkgPj4gc2hpZnQpOworICAgICAgICB9CisgICAgICAgIGRzdCAgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMgICs9IHNyY3N0cmlkZTsKKyAgICAgICAgc3JjMiArPSBNQVhfUEJfU0laRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMocHV0X2hldmNfZXBlbF91bmlfdikodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IF9kc3RzdHJpZGUsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsICopX3NyYzsKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlICA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIHBpeGVsICpkc3QgICAgICAgICAgPSAocGl4ZWwgKilfZHN0OworICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUgPSBfZHN0c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciA9IGZmX2hldmNfZXBlbF9maWx0ZXJzW215IC0gMV07CisgICAgaW50IHNoaWZ0ID0gMTQgLSBCSVRfREVQVEg7CisjaWYgQklUX0RFUFRIIDwgMTQKKyAgICBpbnQgb2Zmc2V0ID0gMSA8PCAoc2hpZnQgLSAxKTsKKyNlbHNlCisgICAgaW50IG9mZnNldCA9IDA7CisjZW5kaWYKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKChFUEVMX0ZJTFRFUihzcmMsIHNyY3N0cmlkZSkgPj4gKEJJVF9ERVBUSCAtIDgpKSArIG9mZnNldCkgPj4gc2hpZnQpOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19lcGVsX2JpX3YpKHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKQoreworICAgIGludCB4LCB5OworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwgKilfc3JjOworICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUgID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgPSBmZl9oZXZjX2VwZWxfZmlsdGVyc1tteSAtIDFdOworICAgIHBpeGVsICpkc3QgICAgICAgICAgPSAocGl4ZWwgKilfZHN0OworICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUgPSBfZHN0c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBpbnQgc2hpZnQgPSAxNCArIDEgLSBCSVRfREVQVEg7CisjaWYgQklUX0RFUFRIIDwgMTQKKyAgICBpbnQgb2Zmc2V0ID0gMSA8PCAoc2hpZnQgLSAxKTsKKyNlbHNlCisgICAgaW50IG9mZnNldCA9IDA7CisjZW5kaWYKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKChFUEVMX0ZJTFRFUihzcmMsIHNyY3N0cmlkZSkgPj4gKEJJVF9ERVBUSCAtIDgpKSArIHNyYzJbeF0gKyBvZmZzZXQpID4+IHNoaWZ0KTsKKyAgICAgICAgZHN0ICArPSBkc3RzdHJpZGU7CisgICAgICAgIHNyYyAgKz0gc3Jjc3RyaWRlOworICAgICAgICBzcmMyICs9IE1BWF9QQl9TSVpFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19lcGVsX3VuaV9odikodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IF9kc3RzdHJpZGUsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCAqKV9zcmM7CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIHBpeGVsICpkc3QgICAgICAgICAgPSAocGl4ZWwgKilfZHN0OworICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUgPSBfZHN0c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciA9IGZmX2hldmNfZXBlbF9maWx0ZXJzW214IC0gMV07CisgICAgaW50MTZfdCB0bXBfYXJyYXlbKE1BWF9QQl9TSVpFICsgRVBFTF9FWFRSQSkgKiBNQVhfUEJfU0laRV07CisgICAgaW50MTZfdCAqdG1wID0gdG1wX2FycmF5OworICAgIGludCBzaGlmdCA9IDE0IC0gQklUX0RFUFRIOworI2lmIEJJVF9ERVBUSCA8IDE0CisgICAgaW50IG9mZnNldCA9IDEgPDwgKHNoaWZ0IC0gMSk7CisjZWxzZQorICAgIGludCBvZmZzZXQgPSAwOworI2VuZGlmCisKKyAgICBzcmMgLT0gRVBFTF9FWFRSQV9CRUZPUkUgKiBzcmNzdHJpZGU7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0ICsgRVBFTF9FWFRSQTsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgdG1wW3hdID0gRVBFTF9GSUxURVIoc3JjLCAxKSA+PiAoQklUX0RFUFRIIC0gOCk7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgICAgIHRtcCArPSBNQVhfUEJfU0laRTsKKyAgICB9CisKKyAgICB0bXAgICAgICA9IHRtcF9hcnJheSArIEVQRUxfRVhUUkFfQkVGT1JFICogTUFYX1BCX1NJWkU7CisgICAgZmlsdGVyID0gZmZfaGV2Y19lcGVsX2ZpbHRlcnNbbXkgLSAxXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKChFUEVMX0ZJTFRFUih0bXAsIE1BWF9QQl9TSVpFKSA+PiA2KSArIG9mZnNldCkgPj4gc2hpZnQpOworICAgICAgICB0bXAgKz0gTUFYX1BCX1NJWkU7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX2VwZWxfYmlfaHYpKHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCAqKV9zcmM7CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIHBpeGVsICpkc3QgICAgICAgICAgPSAocGl4ZWwgKilfZHN0OworICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUgPSBfZHN0c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciA9IGZmX2hldmNfZXBlbF9maWx0ZXJzW214IC0gMV07CisgICAgaW50MTZfdCB0bXBfYXJyYXlbKE1BWF9QQl9TSVpFICsgRVBFTF9FWFRSQSkgKiBNQVhfUEJfU0laRV07CisgICAgaW50MTZfdCAqdG1wID0gdG1wX2FycmF5OworICAgIGludCBzaGlmdCA9IDE0ICsgMSAtIEJJVF9ERVBUSDsKKyNpZiBCSVRfREVQVEggPCAxNAorICAgIGludCBvZmZzZXQgPSAxIDw8IChzaGlmdCAtIDEpOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyNlbmRpZgorCisgICAgc3JjIC09IEVQRUxfRVhUUkFfQkVGT1JFICogc3Jjc3RyaWRlOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodCArIEVQRUxfRVhUUkE7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIHRtcFt4XSA9IEVQRUxfRklMVEVSKHNyYywgMSkgPj4gKEJJVF9ERVBUSCAtIDgpOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgICB0bXAgKz0gTUFYX1BCX1NJWkU7CisgICAgfQorCisgICAgdG1wICAgICAgPSB0bXBfYXJyYXkgKyBFUEVMX0VYVFJBX0JFRk9SRSAqIE1BWF9QQl9TSVpFOworICAgIGZpbHRlciA9IGZmX2hldmNfZXBlbF9maWx0ZXJzW215IC0gMV07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKCgoRVBFTF9GSUxURVIodG1wLCBNQVhfUEJfU0laRSkgPj4gNikgKyBzcmMyW3hdICsgb2Zmc2V0KSA+PiBzaGlmdCk7CisgICAgICAgIHRtcCAgKz0gTUFYX1BCX1NJWkU7CisgICAgICAgIGRzdCAgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMyICs9IE1BWF9QQl9TSVpFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19lcGVsX3VuaV93X2gpKHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgZGVub20sIGludCB3eCwgaW50IG94LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsICopX3NyYzsKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlICA9IF9zcmNzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIHBpeGVsICpkc3QgICAgICAgICAgPSAocGl4ZWwgKilfZHN0OworICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUgPSBfZHN0c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciA9IGZmX2hldmNfZXBlbF9maWx0ZXJzW214IC0gMV07CisgICAgaW50IHNoaWZ0ID0gZGVub20gKyAxNCAtIEJJVF9ERVBUSDsKKyNpZiBCSVRfREVQVEggPCAxNAorICAgIGludCBvZmZzZXQgPSAxIDw8IChzaGlmdCAtIDEpOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyNlbmRpZgorCisgICAgb3ggICAgID0gb3ggKiAoMSA8PCAoQklUX0RFUFRIIC0gOCkpOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCgoKChFUEVMX0ZJTFRFUihzcmMsIDEpID4+IChCSVRfREVQVEggLSA4KSkgKiB3eCArIG9mZnNldCkgPj4gc2hpZnQpICsgb3gpOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX2VwZWxfYmlfd19oKSh1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgX2RzdHN0cmlkZSwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGRlbm9tLCBpbnQgd3gwLCBpbnQgd3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG94MCwgaW50IG94MSwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCAqKV9zcmM7CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSAgPSBfc3Jjc3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwaXhlbCAqZHN0ICAgICAgICAgID0gKHBpeGVsICopX2RzdDsKKyAgICBwdHJkaWZmX3QgZHN0c3RyaWRlID0gX2RzdHN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgPSBmZl9oZXZjX2VwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGludCBzaGlmdCA9IDE0ICsgMSAtIEJJVF9ERVBUSDsKKyAgICBpbnQgbG9nMldkID0gZGVub20gKyBzaGlmdCAtIDE7CisKKyAgICBveDAgICAgID0gb3gwICogKDEgPDwgKEJJVF9ERVBUSCAtIDgpKTsKKyAgICBveDEgICAgID0gb3gxICogKDEgPDwgKEJJVF9ERVBUSCAtIDgpKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKCgoRVBFTF9GSUxURVIoc3JjLCAxKSA+PiAoQklUX0RFUFRIIC0gOCkpICogd3gxICsgc3JjMlt4XSAqIHd4MCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG94MCArIG94MSArIDEpIDw8IGxvZzJXZCkpID4+IChsb2cyV2QgKyAxKSk7CisgICAgICAgIHNyYyAgKz0gc3Jjc3RyaWRlOworICAgICAgICBkc3QgICs9IGRzdHN0cmlkZTsKKyAgICAgICAgc3JjMiArPSBNQVhfUEJfU0laRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMocHV0X2hldmNfZXBlbF91bmlfd192KSh1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgX2RzdHN0cmlkZSwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGRlbm9tLCBpbnQgd3gsIGludCBveCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCAqKV9zcmM7CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSAgPSBfc3Jjc3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwaXhlbCAqZHN0ICAgICAgICAgID0gKHBpeGVsICopX2RzdDsKKyAgICBwdHJkaWZmX3QgZHN0c3RyaWRlID0gX2RzdHN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgPSBmZl9oZXZjX2VwZWxfZmlsdGVyc1tteSAtIDFdOworICAgIGludCBzaGlmdCA9IGRlbm9tICsgMTQgLSBCSVRfREVQVEg7CisjaWYgQklUX0RFUFRIIDwgMTQKKyAgICBpbnQgb2Zmc2V0ID0gMSA8PCAoc2hpZnQgLSAxKTsKKyNlbHNlCisgICAgaW50IG9mZnNldCA9IDA7CisjZW5kaWYKKworICAgIG94ICAgICA9IG94ICogKDEgPDwgKEJJVF9ERVBUSCAtIDgpKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKCgoRVBFTF9GSUxURVIoc3JjLCBzcmNzdHJpZGUpID4+IChCSVRfREVQVEggLSA4KSkgKiB3eCArIG9mZnNldCkgPj4gc2hpZnQpICsgb3gpOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHB1dF9oZXZjX2VwZWxfYmlfd192KSh1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgX2RzdHN0cmlkZSwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGRlbm9tLCBpbnQgd3gwLCBpbnQgd3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG94MCwgaW50IG94MSwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCAqKV9zcmM7CisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSAgPSBfc3Jjc3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciA9IGZmX2hldmNfZXBlbF9maWx0ZXJzW215IC0gMV07CisgICAgcGl4ZWwgKmRzdCAgICAgICAgICA9IChwaXhlbCAqKV9kc3Q7CisgICAgcHRyZGlmZl90IGRzdHN0cmlkZSA9IF9kc3RzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIGludCBzaGlmdCA9IDE0ICsgMSAtIEJJVF9ERVBUSDsKKyAgICBpbnQgbG9nMldkID0gZGVub20gKyBzaGlmdCAtIDE7CisKKyAgICBveDAgICAgID0gb3gwICogKDEgPDwgKEJJVF9ERVBUSCAtIDgpKTsKKyAgICBveDEgICAgID0gb3gxICogKDEgPDwgKEJJVF9ERVBUSCAtIDgpKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKCgoRVBFTF9GSUxURVIoc3JjLCBzcmNzdHJpZGUpID4+IChCSVRfREVQVEggLSA4KSkgKiB3eDEgKyBzcmMyW3hdICogd3gwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3gwICsgb3gxICsgMSkgPDwgbG9nMldkKSkgPj4gKGxvZzJXZCArIDEpKTsKKyAgICAgICAgc3JjICArPSBzcmNzdHJpZGU7CisgICAgICAgIGRzdCAgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMyICs9IE1BWF9QQl9TSVpFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19lcGVsX3VuaV93X2h2KSh1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgX2RzdHN0cmlkZSwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBkZW5vbSwgaW50IHd4LCBpbnQgb3gsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKQoreworICAgIGludCB4LCB5OworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwgKilfc3JjOworICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUgPSBfc3Jjc3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwaXhlbCAqZHN0ICAgICAgICAgID0gKHBpeGVsICopX2RzdDsKKyAgICBwdHJkaWZmX3QgZHN0c3RyaWRlID0gX2RzdHN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgPSBmZl9oZXZjX2VwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGludDE2X3QgdG1wX2FycmF5WyhNQVhfUEJfU0laRSArIEVQRUxfRVhUUkEpICogTUFYX1BCX1NJWkVdOworICAgIGludDE2X3QgKnRtcCA9IHRtcF9hcnJheTsKKyAgICBpbnQgc2hpZnQgPSBkZW5vbSArIDE0IC0gQklUX0RFUFRIOworI2lmIEJJVF9ERVBUSCA8IDE0CisgICAgaW50IG9mZnNldCA9IDEgPDwgKHNoaWZ0IC0gMSk7CisjZWxzZQorICAgIGludCBvZmZzZXQgPSAwOworI2VuZGlmCisKKyAgICBzcmMgLT0gRVBFTF9FWFRSQV9CRUZPUkUgKiBzcmNzdHJpZGU7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0ICsgRVBFTF9FWFRSQTsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgdG1wW3hdID0gRVBFTF9GSUxURVIoc3JjLCAxKSA+PiAoQklUX0RFUFRIIC0gOCk7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgICAgIHRtcCArPSBNQVhfUEJfU0laRTsKKyAgICB9CisKKyAgICB0bXAgICAgICA9IHRtcF9hcnJheSArIEVQRUxfRVhUUkFfQkVGT1JFICogTUFYX1BCX1NJWkU7CisgICAgZmlsdGVyID0gZmZfaGV2Y19lcGVsX2ZpbHRlcnNbbXkgLSAxXTsKKworICAgIG94ICAgICA9IG94ICogKDEgPDwgKEJJVF9ERVBUSCAtIDgpKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKCgoKEVQRUxfRklMVEVSKHRtcCwgTUFYX1BCX1NJWkUpID4+IDYpICogd3ggKyBvZmZzZXQpID4+IHNoaWZ0KSArIG94KTsKKyAgICAgICAgdG1wICs9IE1BWF9QQl9TSVpFOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwdXRfaGV2Y19lcGVsX2JpX3dfaHYpKHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBkZW5vbSwgaW50IHd4MCwgaW50IHd4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3gwLCBpbnQgb3gxLCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsICopX3NyYzsKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlID0gX3NyY3N0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgcGl4ZWwgKmRzdCAgICAgICAgICA9IChwaXhlbCAqKV9kc3Q7CisgICAgcHRyZGlmZl90IGRzdHN0cmlkZSA9IF9kc3RzdHJpZGUgLyBzaXplb2YocGl4ZWwpOworICAgIGNvbnN0IGludDhfdCAqZmlsdGVyID0gZmZfaGV2Y19lcGVsX2ZpbHRlcnNbbXggLSAxXTsKKyAgICBpbnQxNl90IHRtcF9hcnJheVsoTUFYX1BCX1NJWkUgKyBFUEVMX0VYVFJBKSAqIE1BWF9QQl9TSVpFXTsKKyAgICBpbnQxNl90ICp0bXAgPSB0bXBfYXJyYXk7CisgICAgaW50IHNoaWZ0ID0gMTQgKyAxIC0gQklUX0RFUFRIOworICAgIGludCBsb2cyV2QgPSBkZW5vbSArIHNoaWZ0IC0gMTsKKworICAgIHNyYyAtPSBFUEVMX0VYVFJBX0JFRk9SRSAqIHNyY3N0cmlkZTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQgKyBFUEVMX0VYVFJBOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICB0bXBbeF0gPSBFUEVMX0ZJTFRFUihzcmMsIDEpID4+IChCSVRfREVQVEggLSA4KTsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICAgICAgdG1wICs9IE1BWF9QQl9TSVpFOworICAgIH0KKworICAgIHRtcCAgICAgID0gdG1wX2FycmF5ICsgRVBFTF9FWFRSQV9CRUZPUkUgKiBNQVhfUEJfU0laRTsKKyAgICBmaWx0ZXIgPSBmZl9oZXZjX2VwZWxfZmlsdGVyc1tteSAtIDFdOworCisgICAgb3gwICAgICA9IG94MCAqICgxIDw8IChCSVRfREVQVEggLSA4KSk7CisgICAgb3gxICAgICA9IG94MSAqICgxIDw8IChCSVRfREVQVEggLSA4KSk7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCgoKEVQRUxfRklMVEVSKHRtcCwgTUFYX1BCX1NJWkUpID4+IDYpICogd3gxICsgc3JjMlt4XSAqIHd4MCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG94MCArIG94MSArIDEpIDw8IGxvZzJXZCkpID4+IChsb2cyV2QgKyAxKSk7CisgICAgICAgIHRtcCAgKz0gTUFYX1BCX1NJWkU7CisgICAgICAgIGRzdCAgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMyICs9IE1BWF9QQl9TSVpFOworICAgIH0KK30vLyBsaW5lIHplcm8KKyNkZWZpbmUgUDMgcGl4Wy00ICogeHN0cmlkZV0KKyNkZWZpbmUgUDIgcGl4Wy0zICogeHN0cmlkZV0KKyNkZWZpbmUgUDEgcGl4Wy0yICogeHN0cmlkZV0KKyNkZWZpbmUgUDAgcGl4Wy0xICogeHN0cmlkZV0KKyNkZWZpbmUgUTAgcGl4WzAgKiB4c3RyaWRlXQorI2RlZmluZSBRMSBwaXhbMSAqIHhzdHJpZGVdCisjZGVmaW5lIFEyIHBpeFsyICogeHN0cmlkZV0KKyNkZWZpbmUgUTMgcGl4WzMgKiB4c3RyaWRlXQorCisvLyBsaW5lIHRocmVlLiB1c2VkIG9ubHkgZm9yIGRlYmxvY2tpbmcgZGVjaXNpb24KKyNkZWZpbmUgVFAzIHBpeFstNCAqIHhzdHJpZGUgKyAzICogeXN0cmlkZV0KKyNkZWZpbmUgVFAyIHBpeFstMyAqIHhzdHJpZGUgKyAzICogeXN0cmlkZV0KKyNkZWZpbmUgVFAxIHBpeFstMiAqIHhzdHJpZGUgKyAzICogeXN0cmlkZV0KKyNkZWZpbmUgVFAwIHBpeFstMSAqIHhzdHJpZGUgKyAzICogeXN0cmlkZV0KKyNkZWZpbmUgVFEwIHBpeFswICAqIHhzdHJpZGUgKyAzICogeXN0cmlkZV0KKyNkZWZpbmUgVFExIHBpeFsxICAqIHhzdHJpZGUgKyAzICogeXN0cmlkZV0KKyNkZWZpbmUgVFEyIHBpeFsyICAqIHhzdHJpZGUgKyAzICogeXN0cmlkZV0KKyNkZWZpbmUgVFEzIHBpeFszICAqIHhzdHJpZGUgKyAzICogeXN0cmlkZV0KKworc3RhdGljIHZvaWQgRlVOQyhoZXZjX2xvb3BfZmlsdGVyX2x1bWEpKHVpbnQ4X3QgKl9waXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IF94c3RyaWRlLCBwdHJkaWZmX3QgX3lzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEsIGludCAqX3RjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9ub19wLCB1aW50OF90ICpfbm9fcSkKK3sKKyAgICBpbnQgZCwgajsKKyAgICBwaXhlbCAqcGl4ICAgICAgICA9IChwaXhlbCAqKV9waXg7CisgICAgcHRyZGlmZl90IHhzdHJpZGUgPSBfeHN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisgICAgcHRyZGlmZl90IHlzdHJpZGUgPSBfeXN0cmlkZSAvIHNpemVvZihwaXhlbCk7CisKKyAgICBiZXRhIDw8PSBCSVRfREVQVEggLSA4OworCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICBjb25zdCBpbnQgZHAwICA9IGFicyhQMiAgLSAyICogUDEgICsgUDApOworICAgICAgICBjb25zdCBpbnQgZHEwICA9IGFicyhRMiAgLSAyICogUTEgICsgUTApOworICAgICAgICBjb25zdCBpbnQgZHAzICA9IGFicyhUUDIgLSAyICogVFAxICsgVFAwKTsKKyAgICAgICAgY29uc3QgaW50IGRxMyAgPSBhYnMoVFEyIC0gMiAqIFRRMSArIFRRMCk7CisgICAgICAgIGNvbnN0IGludCBkMCAgID0gZHAwICsgZHEwOworICAgICAgICBjb25zdCBpbnQgZDMgICA9IGRwMyArIGRxMzsKKyAgICAgICAgY29uc3QgaW50IHRjICAgPSBfdGNbal0gICA8PCAoQklUX0RFUFRIIC0gOCk7CisgICAgICAgIGNvbnN0IGludCBub19wID0gX25vX3Bbal07CisgICAgICAgIGNvbnN0IGludCBub19xID0gX25vX3Fbal07CisKKyAgICAgICAgaWYgKGQwICsgZDMgPj0gYmV0YSkgeworICAgICAgICAgICAgcGl4ICs9IDQgKiB5c3RyaWRlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBpbnQgYmV0YV8zID0gYmV0YSA+PiAzOworICAgICAgICAgICAgY29uc3QgaW50IGJldGFfMiA9IGJldGEgPj4gMjsKKyAgICAgICAgICAgIGNvbnN0IGludCB0YzI1ICAgPSAoKHRjICogNSArIDEpID4+IDEpOworCisgICAgICAgICAgICBpZiAoYWJzKFAzICAtICBQMCkgKyBhYnMoUTMgIC0gIFEwKSA8IGJldGFfMyAmJiBhYnMoUDAgIC0gIFEwKSA8IHRjMjUgJiYKKyAgICAgICAgICAgICAgICBhYnMoVFAzIC0gVFAwKSArIGFicyhUUTMgLSBUUTApIDwgYmV0YV8zICYmIGFicyhUUDAgLSBUUTApIDwgdGMyNSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZDAgPDwgMSkgPCBiZXRhXzIgJiYgICAgICAoZDMgPDwgMSkgPCBiZXRhXzIpIHsKKyAgICAgICAgICAgICAgICAvLyBzdHJvbmcgZmlsdGVyaW5nCisgICAgICAgICAgICAgICAgY29uc3QgaW50IHRjMiA9IHRjIDw8IDE7CisgICAgICAgICAgICAgICAgZm9yIChkID0gMDsgZCA8IDQ7IGQrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcDMgPSBQMzsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHAyID0gUDI7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwMSA9IFAxOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcDAgPSBQMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHEwID0gUTA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBxMSA9IFExOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcTIgPSBRMjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHEzID0gUTM7CisgICAgICAgICAgICAgICAgICAgIGlmICghbm9fcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUDAgPSBwMCArIGF2X2NsaXAoKChwMiArIDIgKiBwMSArIDIgKiBwMCArIDIgKiBxMCArIHExICsgNCkgPj4gMykgLSBwMCwgLXRjMiwgdGMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFAxID0gcDEgKyBhdl9jbGlwKCgocDIgKyBwMSArIHAwICsgcTAgKyAyKSA+PiAyKSAtIHAxLCAtdGMyLCB0YzIpOworICAgICAgICAgICAgICAgICAgICAgICAgUDIgPSBwMiArIGF2X2NsaXAoKCgyICogcDMgKyAzICogcDIgKyBwMSArIHAwICsgcTAgKyA0KSA+PiAzKSAtIHAyLCAtdGMyLCB0YzIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghbm9fcSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUTAgPSBxMCArIGF2X2NsaXAoKChwMSArIDIgKiBwMCArIDIgKiBxMCArIDIgKiBxMSArIHEyICsgNCkgPj4gMykgLSBxMCwgLXRjMiwgdGMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFExID0gcTEgKyBhdl9jbGlwKCgocDAgKyBxMCArIHExICsgcTIgKyAyKSA+PiAyKSAtIHExLCAtdGMyLCB0YzIpOworICAgICAgICAgICAgICAgICAgICAgICAgUTIgPSBxMiArIGF2X2NsaXAoKCgyICogcTMgKyAzICogcTIgKyBxMSArIHEwICsgcDAgKyA0KSA+PiAzKSAtIHEyLCAtdGMyLCB0YzIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBpeCArPSB5c3RyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vcm1hbCBmaWx0ZXJpbmcKKyAgICAgICAgICAgICAgICBpbnQgbmRfcCA9IDE7CisgICAgICAgICAgICAgICAgaW50IG5kX3EgPSAxOworICAgICAgICAgICAgICAgIGNvbnN0IGludCB0Y18yID0gdGMgPj4gMTsKKyAgICAgICAgICAgICAgICBpZiAoZHAwICsgZHAzIDwgKChiZXRhICsgKGJldGEgPj4gMSkpID4+IDMpKQorICAgICAgICAgICAgICAgICAgICBuZF9wID0gMjsKKyAgICAgICAgICAgICAgICBpZiAoZHEwICsgZHEzIDwgKChiZXRhICsgKGJldGEgPj4gMSkpID4+IDMpKQorICAgICAgICAgICAgICAgICAgICBuZF9xID0gMjsKKworICAgICAgICAgICAgICAgIGZvciAoZCA9IDA7IGQgPCA0OyBkKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHAyID0gUDI7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwMSA9IFAxOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcDAgPSBQMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHEwID0gUTA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBxMSA9IFExOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcTIgPSBRMjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhMCAgID0gKDkgKiAocTAgLSBwMCkgLSAzICogKHExIC0gcDEpICsgOCkgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFicyhkZWx0YTApIDwgMTAgKiB0YykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEwID0gYXZfY2xpcChkZWx0YTAsIC10YywgdGMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub19wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAwID0gYXZfY2xpcF9waXhlbChwMCArIGRlbHRhMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vX3EpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUTAgPSBhdl9jbGlwX3BpeGVsKHEwIC0gZGVsdGEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9fcCAmJiBuZF9wID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWx0YXAxID0gYXZfY2xpcCgoKChwMiArIHAwICsgMSkgPj4gMSkgLSBwMSArIGRlbHRhMCkgPj4gMSwgLXRjXzIsIHRjXzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAxID0gYXZfY2xpcF9waXhlbChwMSArIGRlbHRhcDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub19xICYmIG5kX3EgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRlbHRhcTEgPSBhdl9jbGlwKCgoKHEyICsgcTAgKyAxKSA+PiAxKSAtIHExIC0gZGVsdGEwKSA+PiAxLCAtdGNfMiwgdGNfMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUTEgPSBhdl9jbGlwX3BpeGVsKHExICsgZGVsdGFxMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGl4ICs9IHlzdHJpZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKGhldmNfbG9vcF9maWx0ZXJfY2hyb21hKSh1aW50OF90ICpfcGl4LCBwdHJkaWZmX3QgX3hzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgX3lzdHJpZGUsIGludCAqX3RjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX25vX3AsIHVpbnQ4X3QgKl9ub19xKQoreworICAgIGludCBkLCBqLCBub19wLCBub19xOworICAgIHBpeGVsICpwaXggICAgICAgID0gKHBpeGVsICopX3BpeDsKKyAgICBwdHJkaWZmX3QgeHN0cmlkZSA9IF94c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwdHJkaWZmX3QgeXN0cmlkZSA9IF95c3RyaWRlIC8gc2l6ZW9mKHBpeGVsKTsKKworICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgY29uc3QgaW50IHRjID0gX3RjW2pdIDw8IChCSVRfREVQVEggLSA4KTsKKyAgICAgICAgaWYgKHRjIDw9IDApIHsKKyAgICAgICAgICAgIHBpeCArPSA0ICogeXN0cmlkZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5vX3AgPSBfbm9fcFtqXTsKKyAgICAgICAgbm9fcSA9IF9ub19xW2pdOworCisgICAgICAgIGZvciAoZCA9IDA7IGQgPCA0OyBkKyspIHsKKyAgICAgICAgICAgIGludCBkZWx0YTA7CisgICAgICAgICAgICBjb25zdCBpbnQgcDEgPSBQMTsKKyAgICAgICAgICAgIGNvbnN0IGludCBwMCA9IFAwOworICAgICAgICAgICAgY29uc3QgaW50IHEwID0gUTA7CisgICAgICAgICAgICBjb25zdCBpbnQgcTEgPSBRMTsKKyAgICAgICAgICAgIGRlbHRhMCA9IGF2X2NsaXAoKCgocTAgLSBwMCkgKiA0KSArIHAxIC0gcTEgKyA0KSA+PiAzLCAtdGMsIHRjKTsKKyAgICAgICAgICAgIGlmICghbm9fcCkKKyAgICAgICAgICAgICAgICBQMCA9IGF2X2NsaXBfcGl4ZWwocDAgKyBkZWx0YTApOworICAgICAgICAgICAgaWYgKCFub19xKQorICAgICAgICAgICAgICAgIFEwID0gYXZfY2xpcF9waXhlbChxMCAtIGRlbHRhMCk7CisgICAgICAgICAgICBwaXggKz0geXN0cmlkZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhoZXZjX2hfbG9vcF9maWx0ZXJfY2hyb21hKSh1aW50OF90ICpwaXgsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnRjLCB1aW50OF90ICpub19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpub19xKQoreworICAgIEZVTkMoaGV2Y19sb29wX2ZpbHRlcl9jaHJvbWEpKHBpeCwgc3RyaWRlLCBzaXplb2YocGl4ZWwpLCB0Yywgbm9fcCwgbm9fcSk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMoaGV2Y192X2xvb3BfZmlsdGVyX2Nocm9tYSkodWludDhfdCAqcGl4LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICp0YywgdWludDhfdCAqbm9fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbm9fcSkKK3sKKyAgICBGVU5DKGhldmNfbG9vcF9maWx0ZXJfY2hyb21hKShwaXgsIHNpemVvZihwaXhlbCksIHN0cmlkZSwgdGMsIG5vX3AsIG5vX3EpOworfQorCitzdGF0aWMgdm9pZCBGVU5DKGhldmNfaF9sb29wX2ZpbHRlcl9sdW1hKSh1aW50OF90ICpwaXgsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmV0YSwgaW50MzJfdCAqdGMsIHVpbnQ4X3QgKm5vX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpub19xKQoreworICAgIEZVTkMoaGV2Y19sb29wX2ZpbHRlcl9sdW1hKShwaXgsIHN0cmlkZSwgc2l6ZW9mKHBpeGVsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0YSwgdGMsIG5vX3AsIG5vX3EpOworfQorCitzdGF0aWMgdm9pZCBGVU5DKGhldmNfdl9sb29wX2ZpbHRlcl9sdW1hKSh1aW50OF90ICpwaXgsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmV0YSwgaW50MzJfdCAqdGMsIHVpbnQ4X3QgKm5vX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpub19xKQoreworICAgIEZVTkMoaGV2Y19sb29wX2ZpbHRlcl9sdW1hKShwaXgsIHNpemVvZihwaXhlbCksIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0YSwgdGMsIG5vX3AsIG5vX3EpOworfQorCisjdW5kZWYgUDMKKyN1bmRlZiBQMgorI3VuZGVmIFAxCisjdW5kZWYgUDAKKyN1bmRlZiBRMAorI3VuZGVmIFExCisjdW5kZWYgUTIKKyN1bmRlZiBRMworCisjdW5kZWYgVFAzCisjdW5kZWYgVFAyCisjdW5kZWYgVFAxCisjdW5kZWYgVFAwCisjdW5kZWYgVFEwCisjdW5kZWYgVFExCisjdW5kZWYgVFEyCisjdW5kZWYgVFEzCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oZXZjcHJlZC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Y3ByZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTk4MjI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Y3ByZWQuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogSEVWQyB2aWRlbyBEZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxMyBHdWlsbGF1bWUgTWFydHJlcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiaGV2Yy5oIgorCisjaW5jbHVkZSAiaGV2Y3ByZWQuaCIKKworI2RlZmluZSBCSVRfREVQVEggOAorI2luY2x1ZGUgImhldmNwcmVkX3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDkKKyNpbmNsdWRlICJoZXZjcHJlZF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCAxMAorI2luY2x1ZGUgImhldmNwcmVkX3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDEyCisjaW5jbHVkZSAiaGV2Y3ByZWRfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKwordm9pZCBmZl9oZXZjX3ByZWRfaW5pdChIRVZDUHJlZENvbnRleHQgKmhwYywgaW50IGJpdF9kZXB0aCkKK3sKKyN1bmRlZiBGVU5DCisjZGVmaW5lIEZVTkMoYSwgZGVwdGgpIGEgIyMgXyAjIyBkZXB0aAorCisjZGVmaW5lIEhFVkNfUFJFRChkZXB0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBocGMtPmludHJhX3ByZWRbMF0gICA9IEZVTkMoaW50cmFfcHJlZF8yLCBkZXB0aCk7ICAgXAorICAgIGhwYy0+aW50cmFfcHJlZFsxXSAgID0gRlVOQyhpbnRyYV9wcmVkXzMsIGRlcHRoKTsgICBcCisgICAgaHBjLT5pbnRyYV9wcmVkWzJdICAgPSBGVU5DKGludHJhX3ByZWRfNCwgZGVwdGgpOyAgIFwKKyAgICBocGMtPmludHJhX3ByZWRbM10gICA9IEZVTkMoaW50cmFfcHJlZF81LCBkZXB0aCk7ICAgXAorICAgIGhwYy0+cHJlZF9wbGFuYXJbMF0gID0gRlVOQyhwcmVkX3BsYW5hcl8wLCBkZXB0aCk7ICBcCisgICAgaHBjLT5wcmVkX3BsYW5hclsxXSAgPSBGVU5DKHByZWRfcGxhbmFyXzEsIGRlcHRoKTsgIFwKKyAgICBocGMtPnByZWRfcGxhbmFyWzJdICA9IEZVTkMocHJlZF9wbGFuYXJfMiwgZGVwdGgpOyAgXAorICAgIGhwYy0+cHJlZF9wbGFuYXJbM10gID0gRlVOQyhwcmVkX3BsYW5hcl8zLCBkZXB0aCk7ICBcCisgICAgaHBjLT5wcmVkX2RjICAgICAgICAgPSBGVU5DKHByZWRfZGMsIGRlcHRoKTsgICAgICAgIFwKKyAgICBocGMtPnByZWRfYW5ndWxhclswXSA9IEZVTkMocHJlZF9hbmd1bGFyXzAsIGRlcHRoKTsgXAorICAgIGhwYy0+cHJlZF9hbmd1bGFyWzFdID0gRlVOQyhwcmVkX2FuZ3VsYXJfMSwgZGVwdGgpOyBcCisgICAgaHBjLT5wcmVkX2FuZ3VsYXJbMl0gPSBGVU5DKHByZWRfYW5ndWxhcl8yLCBkZXB0aCk7IFwKKyAgICBocGMtPnByZWRfYW5ndWxhclszXSA9IEZVTkMocHJlZF9hbmd1bGFyXzMsIGRlcHRoKTsKKworICAgIHN3aXRjaCAoYml0X2RlcHRoKSB7CisgICAgY2FzZSA5OgorICAgICAgICBIRVZDX1BSRUQoOSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICAgIEhFVkNfUFJFRCgxMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6CisgICAgICAgIEhFVkNfUFJFRCgxMik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEhFVkNfUFJFRCg4KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Y3ByZWQuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNwcmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxNGE3NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hldmNwcmVkLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIEhFVkMgdmlkZW8gRGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgR3VpbGxhdW1lIE1hcnRyZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0hFVkNQUkVEX0gKKyNkZWZpbmUgQVZDT0RFQ19IRVZDUFJFRF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RydWN0IEhFVkNDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBIRVZDUHJlZENvbnRleHQgeworICAgIHZvaWQgKCppbnRyYV9wcmVkWzRdKShzdHJ1Y3QgSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLCBpbnQgY19pZHgpOworCisgICAgdm9pZCAoKnByZWRfcGxhbmFyWzRdKSh1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIHB0cmRpZmZfdCBzdHJpZGUpOworICAgIHZvaWQgKCpwcmVkX2RjKSh1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcCwgY29uc3QgdWludDhfdCAqbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGxvZzJfc2l6ZSwgaW50IGNfaWR4KTsKKyAgICB2b2lkICgqcHJlZF9hbmd1bGFyWzRdKSh1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjX2lkeCwgaW50IG1vZGUpOworfSBIRVZDUHJlZENvbnRleHQ7CisKK3ZvaWQgZmZfaGV2Y19wcmVkX2luaXQoSEVWQ1ByZWRDb250ZXh0ICpocGMsIGludCBiaXRfZGVwdGgpOworCisjZW5kaWYgLyogQVZDT0RFQ19IRVZDUFJFRF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9oZXZjcHJlZF90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Y3ByZWRfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTI0MjMwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaGV2Y3ByZWRfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDU1MSBAQAorLyoKKyAqIEhFVkMgdmlkZW8gZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgR3VpbGxhdW1lIE1hcnRyZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJiaXRfZGVwdGhfdGVtcGxhdGUuYyIKKyNpbmNsdWRlICJoZXZjcHJlZC5oIgorCisjZGVmaW5lIFBPUyh4LCB5KSBzcmNbKHgpICsgc3RyaWRlICogKHkpXQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMoaW50cmFfcHJlZCkoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX3NpemUsIGludCBjX2lkeCkKK3sKKyNkZWZpbmUgUFUoeCkgXAorICAgICgoeCkgPj4gcy0+c3BzLT5sb2cyX21pbl9wdV9zaXplKQorI2RlZmluZSBNVkYoeCwgeSkgXAorICAgIChzLT5yZWYtPnRhYl9tdmZbKHgpICsgKHkpICogbWluX3B1X3dpZHRoXSkKKyNkZWZpbmUgTVZGX1BVKHgsIHkpIFwKKyAgICBNVkYoUFUoeDAgKyAoKHgpIDw8IGhzaGlmdCkpLCBQVSh5MCArICgoeSkgPDwgdnNoaWZ0KSkpCisjZGVmaW5lIElTX0lOVFJBKHgsIHkpIFwKKyAgICAoTVZGX1BVKHgsIHkpLnByZWRfZmxhZyA9PSBQRl9JTlRSQSkKKyNkZWZpbmUgTUlOX1RCX0FERFJfWlMoeCwgeSkgXAorICAgIHMtPnBwcy0+bWluX3RiX2FkZHJfenNbKHkpICogKHMtPnNwcy0+dGJfbWFzaysyKSArICh4KV0KKyNkZWZpbmUgRVhURU5EKHB0ciwgdmFsLCBsZW4pICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGl4ZWw0IHBpeCA9IFBJWEVMX1NQTEFUX1g0KHZhbCk7IFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGxlbik7IGkgKz0gNCkgICAgXAorICAgICAgICBBVl9XTjRQKHB0ciArIGksIHBpeCk7ICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEVYVEVORF9SSUdIVF9DSVAocHRyLCBzdGFydCwgbGVuZ3RoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IChzdGFydCkgKyAobGVuZ3RoKTsgaSArPSA0KSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICghSVNfSU5UUkEoaSwgLTEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQVZfV040UCgmcHRyW2ldLCBhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhID0gUElYRUxfU1BMQVRfWDQocHRyW2krM10pCisjZGVmaW5lIEVYVEVORF9MRUZUX0NJUChwdHIsIHN0YXJ0LCBsZW5ndGgpIFwKKyAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPiAoc3RhcnQpIC0gKGxlbmd0aCk7IGktLSkgXAorICAgICAgICAgICAgaWYgKCFJU19JTlRSQShpIC0gMSwgLTEpKSBcCisgICAgICAgICAgICAgICAgcHRyW2kgLSAxXSA9IHB0cltpXQorI2RlZmluZSBFWFRFTkRfVVBfQ0lQKHB0ciwgc3RhcnQsIGxlbmd0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gKHN0YXJ0KTsgaSA+IChzdGFydCkgLSAobGVuZ3RoKTsgaSAtPSA0KSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIUlTX0lOVFJBKC0xLCBpIC0gMykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFWX1dONFAoJnB0cltpIC0gM10sIGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYSA9IFBJWEVMX1NQTEFUX1g0KHB0cltpIC0gM10pCisjZGVmaW5lIEVYVEVORF9ET1dOX0NJUChwdHIsIHN0YXJ0LCBsZW5ndGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IChzdGFydCkgKyAobGVuZ3RoKTsgaSArPSA0KSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICghSVNfSU5UUkEoLTEsIGkpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQVZfV040UCgmcHRyW2ldLCBhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhID0gUElYRUxfU1BMQVRfWDQocHRyW2kgKyAzXSkKKworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIGludCBpOworICAgIGludCBoc2hpZnQgPSBzLT5zcHMtPmhzaGlmdFtjX2lkeF07CisgICAgaW50IHZzaGlmdCA9IHMtPnNwcy0+dnNoaWZ0W2NfaWR4XTsKKyAgICBpbnQgc2l6ZSA9ICgxIDw8IGxvZzJfc2l6ZSk7CisgICAgaW50IHNpemVfaW5fbHVtYV9oID0gc2l6ZSA8PCBoc2hpZnQ7CisgICAgaW50IHNpemVfaW5fdGJzX2ggID0gc2l6ZV9pbl9sdW1hX2ggPj4gcy0+c3BzLT5sb2cyX21pbl90Yl9zaXplOworICAgIGludCBzaXplX2luX2x1bWFfdiA9IHNpemUgPDwgdnNoaWZ0OworICAgIGludCBzaXplX2luX3Ric192ICA9IHNpemVfaW5fbHVtYV92ID4+IHMtPnNwcy0+bG9nMl9taW5fdGJfc2l6ZTsKKyAgICBpbnQgeCA9IHgwID4+IGhzaGlmdDsKKyAgICBpbnQgeSA9IHkwID4+IHZzaGlmdDsKKyAgICBpbnQgeF90YiA9ICh4MCA+PiBzLT5zcHMtPmxvZzJfbWluX3RiX3NpemUpICYgcy0+c3BzLT50Yl9tYXNrOworICAgIGludCB5X3RiID0gKHkwID4+IHMtPnNwcy0+bG9nMl9taW5fdGJfc2l6ZSkgJiBzLT5zcHMtPnRiX21hc2s7CisKKyAgICBpbnQgY3VyX3RiX2FkZHIgPSBNSU5fVEJfQUREUl9aUyh4X3RiLCB5X3RiKTsKKworICAgIHB0cmRpZmZfdCBzdHJpZGUgPSBzLT5mcmFtZS0+bGluZXNpemVbY19pZHhdIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilzLT5mcmFtZS0+ZGF0YVtjX2lkeF0gKyB4ICsgeSAqIHN0cmlkZTsKKworICAgIGludCBtaW5fcHVfd2lkdGggPSBzLT5zcHMtPm1pbl9wdV93aWR0aDsKKworICAgIGVudW0gSW50cmFQcmVkTW9kZSBtb2RlID0gY19pZHggPyBsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZTsKKyAgICBwaXhlbDQgYTsKKyAgICBwaXhlbCAgbGVmdF9hcnJheVsyICogTUFYX1RCX1NJWkUgKyAxXTsKKyAgICBwaXhlbCAgZmlsdGVyZWRfbGVmdF9hcnJheVsyICogTUFYX1RCX1NJWkUgKyAxXTsKKyAgICBwaXhlbCAgdG9wX2FycmF5WzIgKiBNQVhfVEJfU0laRSArIDFdOworICAgIHBpeGVsICBmaWx0ZXJlZF90b3BfYXJyYXlbMiAqIE1BWF9UQl9TSVpFICsgMV07CisKKyAgICBwaXhlbCAgKmxlZnQgICAgICAgICAgPSBsZWZ0X2FycmF5ICsgMTsKKyAgICBwaXhlbCAgKnRvcCAgICAgICAgICAgPSB0b3BfYXJyYXkgICsgMTsKKyAgICBwaXhlbCAgKmZpbHRlcmVkX2xlZnQgPSBmaWx0ZXJlZF9sZWZ0X2FycmF5ICsgMTsKKyAgICBwaXhlbCAgKmZpbHRlcmVkX3RvcCAgPSBmaWx0ZXJlZF90b3BfYXJyYXkgICsgMTsKKyAgICBpbnQgY2FuZF9ib3R0b21fbGVmdCA9IGxjLT5uYS5jYW5kX2JvdHRvbV9sZWZ0ICYmIGN1cl90Yl9hZGRyID4gTUlOX1RCX0FERFJfWlMoIHhfdGIgLSAxLCAoeV90YiArIHNpemVfaW5fdGJzX3YpICYgcy0+c3BzLT50Yl9tYXNrKTsKKyAgICBpbnQgY2FuZF9sZWZ0ICAgICAgICA9IGxjLT5uYS5jYW5kX2xlZnQ7CisgICAgaW50IGNhbmRfdXBfbGVmdCAgICAgPSBsYy0+bmEuY2FuZF91cF9sZWZ0OworICAgIGludCBjYW5kX3VwICAgICAgICAgID0gbGMtPm5hLmNhbmRfdXA7CisgICAgaW50IGNhbmRfdXBfcmlnaHQgICAgPSBsYy0+bmEuY2FuZF91cF9yaWdodCAgICAmJiBjdXJfdGJfYWRkciA+IE1JTl9UQl9BRERSX1pTKCh4X3RiICsgc2l6ZV9pbl90YnNfaCkgJiBzLT5zcHMtPnRiX21hc2ssIHlfdGIgLSAxKTsKKworICAgIGludCBib3R0b21fbGVmdF9zaXplID0gKEZGTUlOKHkwICsgMiAqIHNpemVfaW5fbHVtYV92LCBzLT5zcHMtPmhlaWdodCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkwICsgc2l6ZV9pbl9sdW1hX3YpKSA+PiB2c2hpZnQ7CisgICAgaW50IHRvcF9yaWdodF9zaXplICAgPSAoRkZNSU4oeDAgKyAyICogc2l6ZV9pbl9sdW1hX2gsIHMtPnNwcy0+d2lkdGgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh4MCArIHNpemVfaW5fbHVtYV9oKSkgPj4gaHNoaWZ0OworCisgICAgaWYgKHMtPnBwcy0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnID09IDEpIHsKKyAgICAgICAgaW50IHNpemVfaW5fbHVtYV9wdV92ID0gUFUoc2l6ZV9pbl9sdW1hX3YpOworICAgICAgICBpbnQgc2l6ZV9pbl9sdW1hX3B1X2ggPSBQVShzaXplX2luX2x1bWFfaCk7CisgICAgICAgIGludCBvbl9wdV9lZGdlX3ggICAgPSAhKHgwICYgKCgxIDw8IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZSkgLSAxKSk7CisgICAgICAgIGludCBvbl9wdV9lZGdlX3kgICAgPSAhKHkwICYgKCgxIDw8IHMtPnNwcy0+bG9nMl9taW5fcHVfc2l6ZSkgLSAxKSk7CisgICAgICAgIGlmICghc2l6ZV9pbl9sdW1hX3B1X2gpCisgICAgICAgICAgICBzaXplX2luX2x1bWFfcHVfaCsrOworICAgICAgICBpZiAoY2FuZF9ib3R0b21fbGVmdCA9PSAxICYmIG9uX3B1X2VkZ2VfeCkgeworICAgICAgICAgICAgaW50IHhfbGVmdF9wdSAgID0gUFUoeDAgLSAxKTsKKyAgICAgICAgICAgIGludCB5X2JvdHRvbV9wdSA9IFBVKHkwICsgc2l6ZV9pbl9sdW1hX3YpOworICAgICAgICAgICAgaW50IG1heCA9IEZGTUlOKHNpemVfaW5fbHVtYV9wdV92LCBzLT5zcHMtPm1pbl9wdV9oZWlnaHQgLSB5X2JvdHRvbV9wdSk7CisgICAgICAgICAgICBjYW5kX2JvdHRvbV9sZWZ0ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkgKz0gMikKKyAgICAgICAgICAgICAgICBjYW5kX2JvdHRvbV9sZWZ0IHw9IChNVkYoeF9sZWZ0X3B1LCB5X2JvdHRvbV9wdSArIGkpLnByZWRfZmxhZyA9PSBQRl9JTlRSQSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbmRfbGVmdCA9PSAxICYmIG9uX3B1X2VkZ2VfeCkgeworICAgICAgICAgICAgaW50IHhfbGVmdF9wdSAgID0gUFUoeDAgLSAxKTsKKyAgICAgICAgICAgIGludCB5X2xlZnRfcHUgICA9IFBVKHkwKTsKKyAgICAgICAgICAgIGludCBtYXggPSBGRk1JTihzaXplX2luX2x1bWFfcHVfdiwgcy0+c3BzLT5taW5fcHVfaGVpZ2h0IC0geV9sZWZ0X3B1KTsKKyAgICAgICAgICAgIGNhbmRfbGVmdCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpICs9IDIpCisgICAgICAgICAgICAgICAgY2FuZF9sZWZ0IHw9IChNVkYoeF9sZWZ0X3B1LCB5X2xlZnRfcHUgKyBpKS5wcmVkX2ZsYWcgPT0gUEZfSU5UUkEpOworICAgICAgICB9CisgICAgICAgIGlmIChjYW5kX3VwX2xlZnQgPT0gMSkgeworICAgICAgICAgICAgaW50IHhfbGVmdF9wdSAgID0gUFUoeDAgLSAxKTsKKyAgICAgICAgICAgIGludCB5X3RvcF9wdSAgICA9IFBVKHkwIC0gMSk7CisgICAgICAgICAgICBjYW5kX3VwX2xlZnQgPSBNVkYoeF9sZWZ0X3B1LCB5X3RvcF9wdSkucHJlZF9mbGFnID09IFBGX0lOVFJBOworICAgICAgICB9CisgICAgICAgIGlmIChjYW5kX3VwID09IDEgJiYgb25fcHVfZWRnZV95KSB7CisgICAgICAgICAgICBpbnQgeF90b3BfcHUgICAgPSBQVSh4MCk7CisgICAgICAgICAgICBpbnQgeV90b3BfcHUgICAgPSBQVSh5MCAtIDEpOworICAgICAgICAgICAgaW50IG1heCA9IEZGTUlOKHNpemVfaW5fbHVtYV9wdV9oLCBzLT5zcHMtPm1pbl9wdV93aWR0aCAtIHhfdG9wX3B1KTsKKyAgICAgICAgICAgIGNhbmRfdXAgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSArPSAyKQorICAgICAgICAgICAgICAgIGNhbmRfdXAgfD0gKE1WRih4X3RvcF9wdSArIGksIHlfdG9wX3B1KS5wcmVkX2ZsYWcgPT0gUEZfSU5UUkEpOworICAgICAgICB9CisgICAgICAgIGlmIChjYW5kX3VwX3JpZ2h0ID09IDEgJiYgb25fcHVfZWRnZV95KSB7CisgICAgICAgICAgICBpbnQgeV90b3BfcHUgICAgPSBQVSh5MCAtIDEpOworICAgICAgICAgICAgaW50IHhfcmlnaHRfcHUgID0gUFUoeDAgKyBzaXplX2luX2x1bWFfaCk7CisgICAgICAgICAgICBpbnQgbWF4ID0gRkZNSU4oc2l6ZV9pbl9sdW1hX3B1X2gsIHMtPnNwcy0+bWluX3B1X3dpZHRoIC0geF9yaWdodF9wdSk7CisgICAgICAgICAgICBjYW5kX3VwX3JpZ2h0ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkgKz0gMikKKyAgICAgICAgICAgICAgICBjYW5kX3VwX3JpZ2h0IHw9IChNVkYoeF9yaWdodF9wdSArIGksIHlfdG9wX3B1KS5wcmVkX2ZsYWcgPT0gUEZfSU5UUkEpOworICAgICAgICB9CisgICAgICAgIG1lbXNldChsZWZ0LCAxMjgsIDIgKiBNQVhfVEJfU0laRSpzaXplb2YocGl4ZWwpKTsKKyAgICAgICAgbWVtc2V0KHRvcCAsIDEyOCwgMiAqIE1BWF9UQl9TSVpFKnNpemVvZihwaXhlbCkpOworICAgICAgICB0b3BbLTFdID0gMTI4OworICAgIH0KKyAgICBpZiAoY2FuZF91cF9sZWZ0KSB7CisgICAgICAgIGxlZnRbLTFdID0gUE9TKC0xLCAtMSk7CisgICAgICAgIHRvcFstMV0gID0gbGVmdFstMV07CisgICAgfQorICAgIGlmIChjYW5kX3VwKQorICAgICAgICBtZW1jcHkodG9wLCBzcmMgLSBzdHJpZGUsIHNpemUgKiBzaXplb2YocGl4ZWwpKTsKKyAgICBpZiAoY2FuZF91cF9yaWdodCkgeworICAgICAgICBtZW1jcHkodG9wICsgc2l6ZSwgc3JjIC0gc3RyaWRlICsgc2l6ZSwgc2l6ZSAqIHNpemVvZihwaXhlbCkpOworICAgICAgICBFWFRFTkQodG9wICsgc2l6ZSArIHRvcF9yaWdodF9zaXplLCBQT1Moc2l6ZSArIHRvcF9yaWdodF9zaXplIC0gMSwgLTEpLAorICAgICAgICAgICAgICAgc2l6ZSAtIHRvcF9yaWdodF9zaXplKTsKKyAgICB9CisgICAgaWYgKGNhbmRfbGVmdCkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIGxlZnRbaV0gPSBQT1MoLTEsIGkpOworICAgIGlmIChjYW5kX2JvdHRvbV9sZWZ0KSB7CisgICAgICAgIGZvciAoaSA9IHNpemU7IGkgPCBzaXplICsgYm90dG9tX2xlZnRfc2l6ZTsgaSsrKQorICAgICAgICAgICAgbGVmdFtpXSA9IFBPUygtMSwgaSk7CisgICAgICAgIEVYVEVORChsZWZ0ICsgc2l6ZSArIGJvdHRvbV9sZWZ0X3NpemUsIFBPUygtMSwgc2l6ZSArIGJvdHRvbV9sZWZ0X3NpemUgLSAxKSwKKyAgICAgICAgICAgICAgIHNpemUgLSBib3R0b21fbGVmdF9zaXplKTsKKyAgICB9CisKKyAgICBpZiAocy0+cHBzLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgPT0gMSkgeworICAgICAgICBpZiAoY2FuZF9ib3R0b21fbGVmdCB8fCBjYW5kX2xlZnQgfHwgY2FuZF91cF9sZWZ0IHx8IGNhbmRfdXAgfHwgY2FuZF91cF9yaWdodCkgeworICAgICAgICAgICAgaW50IHNpemVfbWF4X3ggPSB4MCArICgoMiAqIHNpemUpIDw8IGhzaGlmdCkgPCBzLT5zcHMtPndpZHRoID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBzaXplIDogKHMtPnNwcy0+d2lkdGggLSB4MCkgPj4gaHNoaWZ0OworICAgICAgICAgICAgaW50IHNpemVfbWF4X3kgPSB5MCArICgoMiAqIHNpemUpIDw8IHZzaGlmdCkgPCBzLT5zcHMtPmhlaWdodCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogc2l6ZSA6IChzLT5zcHMtPmhlaWdodCAtIHkwKSA+PiB2c2hpZnQ7CisgICAgICAgICAgICBpbnQgaiA9IHNpemUgKyAoY2FuZF9ib3R0b21fbGVmdD8gYm90dG9tX2xlZnRfc2l6ZTogMCkgLTE7CisgICAgICAgICAgICBpZiAoIWNhbmRfdXBfcmlnaHQpIHsKKyAgICAgICAgICAgICAgICBzaXplX21heF94ID0geDAgKyAoKHNpemUpIDw8IGhzaGlmdCkgPCBzLT5zcHMtPndpZHRoID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIDogKHMtPnNwcy0+d2lkdGggLSB4MCkgPj4gaHNoaWZ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjYW5kX2JvdHRvbV9sZWZ0KSB7CisgICAgICAgICAgICAgICAgc2l6ZV9tYXhfeSA9IHkwICsgKCggc2l6ZSkgPDwgdnNoaWZ0KSA8IHMtPnNwcy0+aGVpZ2h0ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA6IChzLT5zcHMtPmhlaWdodCAtIHkwKSA+PiB2c2hpZnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FuZF9ib3R0b21fbGVmdCB8fCBjYW5kX2xlZnQgfHwgY2FuZF91cF9sZWZ0KSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGogPiAtMSAmJiAhSVNfSU5UUkEoLTEsIGopKQorICAgICAgICAgICAgICAgICAgICBqLS07CisgICAgICAgICAgICAgICAgaWYgKCFJU19JTlRSQSgtMSwgaikpIHsKKyAgICAgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgc2l6ZV9tYXhfeCAmJiAhSVNfSU5UUkEoaiwgLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgICAgICBFWFRFTkRfTEVGVF9DSVAodG9wLCBqLCBqICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGxlZnRbLTFdID0gdG9wWy0xXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgc2l6ZV9tYXhfeCAmJiAhSVNfSU5UUkEoaiwgLTEpKQorICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgaWYgKGogPiAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoeDAgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFWFRFTkRfTEVGVF9DSVAodG9wLCBqLCBqICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFWFRFTkRfTEVGVF9DSVAodG9wLCBqLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvcFstMV0gPSB0b3BbMF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZWZ0Wy0xXSA9IHRvcFstMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZWZ0Wy0xXSA9IHRvcFstMV07CisgICAgICAgICAgICBpZiAoY2FuZF9ib3R0b21fbGVmdCB8fCBjYW5kX2xlZnQpIHsKKyAgICAgICAgICAgICAgICBhID0gUElYRUxfU1BMQVRfWDQobGVmdFstMV0pOworICAgICAgICAgICAgICAgIEVYVEVORF9ET1dOX0NJUChsZWZ0LCAwLCBzaXplX21heF95KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY2FuZF9sZWZ0KQorICAgICAgICAgICAgICAgIEVYVEVORChsZWZ0LCBsZWZ0Wy0xXSwgc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWNhbmRfYm90dG9tX2xlZnQpCisgICAgICAgICAgICAgICAgRVhURU5EKGxlZnQgKyBzaXplLCBsZWZ0W3NpemUgLSAxXSwgc2l6ZSk7CisgICAgICAgICAgICBpZiAoeDAgIT0gMCAmJiB5MCAhPSAwKSB7CisgICAgICAgICAgICAgICAgYSA9IFBJWEVMX1NQTEFUX1g0KGxlZnRbc2l6ZV9tYXhfeSAtIDFdKTsKKyAgICAgICAgICAgICAgICBFWFRFTkRfVVBfQ0lQKGxlZnQsIHNpemVfbWF4X3kgLSAxLCBzaXplX21heF95KTsKKyAgICAgICAgICAgICAgICBpZiAoIUlTX0lOVFJBKC0xLCAtIDEpKQorICAgICAgICAgICAgICAgICAgICBsZWZ0Wy0xXSA9IGxlZnRbMF07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHgwID09IDApIHsKKyAgICAgICAgICAgICAgICBFWFRFTkQobGVmdCwgMCwgc2l6ZV9tYXhfeSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGEgPSBQSVhFTF9TUExBVF9YNChsZWZ0W3NpemVfbWF4X3kgLSAxXSk7CisgICAgICAgICAgICAgICAgRVhURU5EX1VQX0NJUChsZWZ0LCBzaXplX21heF95IC0gMSwgc2l6ZV9tYXhfeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3BbLTFdID0gbGVmdFstMV07CisgICAgICAgICAgICBpZiAoeTAgIT0gMCkgeworICAgICAgICAgICAgICAgIGEgPSBQSVhFTF9TUExBVF9YNChsZWZ0Wy0xXSk7CisgICAgICAgICAgICAgICAgRVhURU5EX1JJR0hUX0NJUCh0b3AsIDAsIHNpemVfbWF4X3gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIEluZmVyIHRoZSB1bmF2YWlsYWJsZSBzYW1wbGVzCisgICAgaWYgKCFjYW5kX2JvdHRvbV9sZWZ0KSB7CisgICAgICAgIGlmIChjYW5kX2xlZnQpIHsKKyAgICAgICAgICAgIEVYVEVORChsZWZ0ICsgc2l6ZSwgbGVmdFtzaXplIC0gMV0sIHNpemUpOworICAgICAgICB9IGVsc2UgaWYgKGNhbmRfdXBfbGVmdCkgeworICAgICAgICAgICAgRVhURU5EKGxlZnQsIGxlZnRbLTFdLCAyICogc2l6ZSk7CisgICAgICAgICAgICBjYW5kX2xlZnQgPSAxOworICAgICAgICB9IGVsc2UgaWYgKGNhbmRfdXApIHsKKyAgICAgICAgICAgIGxlZnRbLTFdID0gdG9wWzBdOworICAgICAgICAgICAgRVhURU5EKGxlZnQsIGxlZnRbLTFdLCAyICogc2l6ZSk7CisgICAgICAgICAgICBjYW5kX3VwX2xlZnQgPSAxOworICAgICAgICAgICAgY2FuZF9sZWZ0ICAgID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChjYW5kX3VwX3JpZ2h0KSB7CisgICAgICAgICAgICBFWFRFTkQodG9wLCB0b3Bbc2l6ZV0sIHNpemUpOworICAgICAgICAgICAgbGVmdFstMV0gPSB0b3Bbc2l6ZV07CisgICAgICAgICAgICBFWFRFTkQobGVmdCwgbGVmdFstMV0sIDIgKiBzaXplKTsKKyAgICAgICAgICAgIGNhbmRfdXAgICAgICA9IDE7CisgICAgICAgICAgICBjYW5kX3VwX2xlZnQgPSAxOworICAgICAgICAgICAgY2FuZF9sZWZ0ICAgID0gMTsKKyAgICAgICAgfSBlbHNlIHsgLy8gTm8gc2FtcGxlcyBhdmFpbGFibGUKKyAgICAgICAgICAgIGxlZnRbLTFdID0gKDEgPDwgKEJJVF9ERVBUSCAtIDEpKTsKKyAgICAgICAgICAgIEVYVEVORCh0b3AsICBsZWZ0Wy0xXSwgMiAqIHNpemUpOworICAgICAgICAgICAgRVhURU5EKGxlZnQsIGxlZnRbLTFdLCAyICogc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWNhbmRfbGVmdCkKKyAgICAgICAgRVhURU5EKGxlZnQsIGxlZnRbc2l6ZV0sIHNpemUpOworICAgIGlmICghY2FuZF91cF9sZWZ0KSB7CisgICAgICAgIGxlZnRbLTFdID0gbGVmdFswXTsKKyAgICB9CisgICAgaWYgKCFjYW5kX3VwKQorICAgICAgICBFWFRFTkQodG9wLCBsZWZ0Wy0xXSwgc2l6ZSk7CisgICAgaWYgKCFjYW5kX3VwX3JpZ2h0KQorICAgICAgICBFWFRFTkQodG9wICsgc2l6ZSwgdG9wW3NpemUgLSAxXSwgc2l6ZSk7CisKKyAgICB0b3BbLTFdID0gbGVmdFstMV07CisKKyAgICAvLyBGaWx0ZXJpbmcgcHJvY2VzcworICAgIGlmICghcy0+c3BzLT5pbnRyYV9zbW9vdGhpbmdfZGlzYWJsZWRfZmxhZyAmJiAoY19pZHggPT0gMCAgfHwgcy0+c3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSkgeworICAgICAgICBpZiAobW9kZSAhPSBJTlRSQV9EQyAmJiBzaXplICE9IDQpeworICAgICAgICAgICAgaW50IGludHJhX2hvcl92ZXJfZGlzdF90aHJlc2hbXSA9IHsgNywgMSwgMCB9OworICAgICAgICAgICAgaW50IG1pbl9kaXN0X3ZlcnRfaG9yID0gRkZNSU4oRkZBQlMoKGludCkobW9kZSAtIDI2VSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZBQlMoKGludCkobW9kZSAtIDEwVSkpKTsKKyAgICAgICAgICAgIGlmIChtaW5fZGlzdF92ZXJ0X2hvciA+IGludHJhX2hvcl92ZXJfZGlzdF90aHJlc2hbbG9nMl9zaXplIC0gM10pIHsKKyAgICAgICAgICAgICAgICBpbnQgdGhyZXNob2xkID0gMSA8PCAoQklUX0RFUFRIIC0gNSk7CisgICAgICAgICAgICAgICAgaWYgKHMtPnNwcy0+c3BzX3N0cm9uZ19pbnRyYV9zbW9vdGhpbmdfZW5hYmxlX2ZsYWcgJiYgY19pZHggPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBsb2cyX3NpemUgPT0gNSAmJgorICAgICAgICAgICAgICAgICAgICBGRkFCUyh0b3BbLTFdICArIHRvcFs2M10gIC0gMiAqIHRvcFszMV0pICA8IHRocmVzaG9sZCAmJgorICAgICAgICAgICAgICAgICAgICBGRkFCUyhsZWZ0Wy0xXSArIGxlZnRbNjNdIC0gMiAqIGxlZnRbMzFdKSA8IHRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCBqdXN0IG92ZXJ3cml0ZSB2YWx1ZXMgaW4gdG9wIGJlY2F1c2UgaXQgY291bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYSBwb2ludGVyIGludG8gc3JjCisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX3RvcFstMV0gPSB0b3BbLTFdOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF90b3BbNjNdID0gdG9wWzYzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDYzOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF90b3BbaV0gPSAoKDY0IC0gKGkgKyAxKSkgKiB0b3BbLTFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSArIDEpICAqIHRvcFs2M10gKyAzMikgPj4gNjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDYzOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0W2ldID0gKCg2NCAtIChpICsgMSkpICogbGVmdFstMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSArIDEpICAqIGxlZnRbNjNdICsgMzIpID4+IDY7CisgICAgICAgICAgICAgICAgICAgIHRvcCA9IGZpbHRlcmVkX3RvcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF9sZWZ0WzIgKiBzaXplIC0gMV0gPSBsZWZ0WzIgKiBzaXplIC0gMV07CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX3RvcFsyICogc2l6ZSAtIDFdICA9IHRvcFsyICogc2l6ZSAtIDFdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAyICogc2l6ZSAtIDI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRfbGVmdFtpXSA9IChsZWZ0W2kgKyAxXSArIDIgKiBsZWZ0W2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFtpIC0gMV0gKyAyKSA+PiAyOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF90b3BbLTFdICA9CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2xlZnRbLTFdID0gKGxlZnRbMF0gKyAyICogbGVmdFstMV0gKyB0b3BbMF0gKyAyKSA+PiAyOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAyICogc2l6ZSAtIDI7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRfdG9wW2ldID0gKHRvcFtpICsgMV0gKyAyICogdG9wW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BbaSAtIDFdICsgMikgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGZpbHRlcmVkX2xlZnQ7CisgICAgICAgICAgICAgICAgICAgIHRvcCAgPSBmaWx0ZXJlZF90b3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBJTlRSQV9QTEFOQVI6CisgICAgICAgIHMtPmhwYy5wcmVkX3BsYW5hcltsb2cyX3NpemUgLSAyXSgodWludDhfdCAqKXNyYywgKHVpbnQ4X3QgKil0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWxlZnQsIHN0cmlkZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5UUkFfREM6CisgICAgICAgIHMtPmhwYy5wcmVkX2RjKCh1aW50OF90ICopc3JjLCAodWludDhfdCAqKXRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilsZWZ0LCBzdHJpZGUsIGxvZzJfc2l6ZSwgY19pZHgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzLT5ocGMucHJlZF9hbmd1bGFyW2xvZzJfc2l6ZSAtIDJdKCh1aW50OF90ICopc3JjLCAodWludDhfdCAqKXRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWxlZnQsIHN0cmlkZSwgY19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworI2RlZmluZSBJTlRSQV9QUkVEKHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQyhpbnRyYV9wcmVkXyAjIyBzaXplKShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBjX2lkeCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMoaW50cmFfcHJlZCkocywgeDAsIHkwLCBzaXplLCBjX2lkeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitJTlRSQV9QUkVEKDIpCitJTlRSQV9QUkVEKDMpCitJTlRSQV9QUkVEKDQpCitJTlRSQV9QUkVEKDUpCisKKyN1bmRlZiBJTlRSQV9QUkVECisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgRlVOQyhwcmVkX3BsYW5hcikodWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAqX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpfbGVmdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhZm9fc2l6ZSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqc3JjICAgICAgICA9IChwaXhlbCAqKV9zcmM7CisgICAgY29uc3QgcGl4ZWwgKnRvcCAgPSAoY29uc3QgcGl4ZWwgKilfdG9wOworICAgIGNvbnN0IHBpeGVsICpsZWZ0ID0gKGNvbnN0IHBpeGVsICopX2xlZnQ7CisgICAgaW50IHNpemUgPSAxIDw8IHRyYWZvX3NpemU7CisgICAgZm9yICh5ID0gMDsgeSA8IHNpemU7IHkrKykKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7IHgrKykKKyAgICAgICAgICAgIFBPUyh4LCB5KSA9ICgoc2l6ZSAtIDEgLSB4KSAqIGxlZnRbeV0gKyAoeCArIDEpICogdG9wW3NpemVdICArCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemUgLSAxIC0geSkgKiB0b3BbeF0gICsgKHkgKyAxKSAqIGxlZnRbc2l6ZV0gKyBzaXplKSA+PiAodHJhZm9fc2l6ZSArIDEpOworfQorCisjZGVmaW5lIFBSRURfUExBTkFSKHNpemUpXAorc3RhdGljIHZvaWQgRlVOQyhwcmVkX3BsYW5hcl8gIyMgc2l6ZSkodWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp0b3AsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBwdHJkaWZmX3Qgc3RyaWRlKSAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMocHJlZF9wbGFuYXIpKHNyYywgdG9wLCBsZWZ0LCBzdHJpZGUsIHNpemUgKyAyKTsgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1BSRURfUExBTkFSKDApCitQUkVEX1BMQU5BUigxKQorUFJFRF9QTEFOQVIoMikKK1BSRURfUExBTkFSKDMpCisKKyN1bmRlZiBQUkVEX1BMQU5BUgorCitzdGF0aWMgdm9pZCBGVU5DKHByZWRfZGMpKHVpbnQ4X3QgKl9zcmMsIGNvbnN0IHVpbnQ4X3QgKl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgbG9nMl9zaXplLCBpbnQgY19pZHgpCit7CisgICAgaW50IGksIGosIHgsIHk7CisgICAgaW50IHNpemUgICAgICAgICAgPSAoMSA8PCBsb2cyX3NpemUpOworICAgIHBpeGVsICpzcmMgICAgICAgID0gKHBpeGVsICopX3NyYzsKKyAgICBjb25zdCBwaXhlbCAqdG9wICA9IChjb25zdCBwaXhlbCAqKV90b3A7CisgICAgY29uc3QgcGl4ZWwgKmxlZnQgPSAoY29uc3QgcGl4ZWwgKilfbGVmdDsKKyAgICBpbnQgZGMgICAgICAgICAgICA9IHNpemU7CisgICAgcGl4ZWw0IGE7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgZGMgKz0gbGVmdFtpXSArIHRvcFtpXTsKKworICAgIGRjID4+PSBsb2cyX3NpemUgKyAxOworCisgICAgYSA9IFBJWEVMX1NQTEFUX1g0KGRjKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKz00KQorICAgICAgICAgICAgQVZfV040UCgmUE9TKGosIGkpLCBhKTsKKworICAgIGlmIChjX2lkeCA9PSAwICYmIHNpemUgPCAzMikgeworICAgICAgICBQT1MoMCwgMCkgPSAobGVmdFswXSArIDIgKiBkYyArIHRvcFswXSArIDIpID4+IDI7CisgICAgICAgIGZvciAoeCA9IDE7IHggPCBzaXplOyB4KyspCisgICAgICAgICAgICBQT1MoeCwgMCkgPSAodG9wW3hdICsgMyAqIGRjICsgMikgPj4gMjsKKyAgICAgICAgZm9yICh5ID0gMTsgeSA8IHNpemU7IHkrKykKKyAgICAgICAgICAgIFBPUygwLCB5KSA9IChsZWZ0W3ldICsgMyAqIGRjICsgMikgPj4gMjsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgRlVOQyhwcmVkX2FuZ3VsYXIpKHVpbnQ4X3QgKl9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgY19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgaW50IHNpemUpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyAgICAgICAgPSAocGl4ZWwgKilfc3JjOworICAgIGNvbnN0IHBpeGVsICp0b3AgID0gKGNvbnN0IHBpeGVsICopX3RvcDsKKyAgICBjb25zdCBwaXhlbCAqbGVmdCA9IChjb25zdCBwaXhlbCAqKV9sZWZ0OworCisgICAgc3RhdGljIGNvbnN0IGludCBpbnRyYV9wcmVkX2FuZ2xlW10gPSB7CisgICAgICAgICAzMiwgIDI2LCAgMjEsICAxNywgMTMsICA5LCAgNSwgMiwgMCwgLTIsIC01LCAtOSwgLTEzLCAtMTcsIC0yMSwgLTI2LCAtMzIsCisgICAgICAgIC0yNiwgLTIxLCAtMTcsIC0xMywgLTksIC01LCAtMiwgMCwgMiwgIDUsICA5LCAxMywgIDE3LCAgMjEsICAyNiwgIDMyCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGludl9hbmdsZVtdID0geworICAgICAgICAtNDA5NiwgLTE2MzgsIC05MTAsIC02MzAsIC00ODIsIC0zOTAsIC0zMTUsIC0yNTYsIC0zMTUsIC0zOTAsIC00ODIsCisgICAgICAgIC02MzAsIC05MTAsIC0xNjM4LCAtNDA5NgorICAgIH07CisKKyAgICBpbnQgYW5nbGUgPSBpbnRyYV9wcmVkX2FuZ2xlW21vZGUgLSAyXTsKKyAgICBwaXhlbCByZWZfYXJyYXlbMyAqIE1BWF9UQl9TSVpFICsgNF07CisgICAgcGl4ZWwgKnJlZl90bXAgPSByZWZfYXJyYXkgKyBzaXplOworICAgIGNvbnN0IHBpeGVsICpyZWY7CisgICAgaW50IGxhc3QgPSAoc2l6ZSAqIGFuZ2xlKSA+PiA1OworCisgICAgaWYgKG1vZGUgPj0gMTgpIHsKKyAgICAgICAgcmVmID0gdG9wIC0gMTsKKyAgICAgICAgaWYgKGFuZ2xlIDwgMCAmJiBsYXN0IDwgLTEpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPD0gc2l6ZTsgeCArPSA0KQorICAgICAgICAgICAgICAgIEFWX1dONFAoJnJlZl90bXBbeF0sIEFWX1JONFAoJnRvcFt4IC0gMV0pKTsKKyAgICAgICAgICAgIGZvciAoeCA9IGxhc3Q7IHggPD0gLTE7IHgrKykKKyAgICAgICAgICAgICAgICByZWZfdG1wW3hdID0gbGVmdFstMSArICgoeCAqIGludl9hbmdsZVttb2RlIC0gMTFdICsgMTI4KSA+PiA4KV07CisgICAgICAgICAgICByZWYgPSByZWZfdG1wOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNpemU7IHkrKykgeworICAgICAgICAgICAgaW50IGlkeCAgPSAoKHkgKyAxKSAqIGFuZ2xlKSA+PiA1OworICAgICAgICAgICAgaW50IGZhY3QgPSAoKHkgKyAxKSAqIGFuZ2xlKSAmIDMxOworICAgICAgICAgICAgaWYgKGZhY3QpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgeCArPSA0KSB7CisgICAgICAgICAgICAgICAgICAgIFBPUyh4ICAgICwgeSkgPSAoKDMyIC0gZmFjdCkgKiByZWZbeCArIGlkeCArIDFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0ICAqIHJlZlt4ICsgaWR4ICsgMl0gKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgUE9TKHggKyAxLCB5KSA9ICgoMzIgLSBmYWN0KSAqIHJlZlt4ICsgMSArIGlkeCArIDFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0ICAqIHJlZlt4ICsgMSArIGlkeCArIDJdICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIFBPUyh4ICsgMiwgeSkgPSAoKDMyIC0gZmFjdCkgKiByZWZbeCArIDIgKyBpZHggKyAxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdCAgKiByZWZbeCArIDIgKyBpZHggKyAyXSArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBQT1MoeCArIDMsIHkpID0gKCgzMiAtIGZhY3QpICogcmVmW3ggKyAzICsgaWR4ICsgMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3QgICogcmVmW3ggKyAzICsgaWR4ICsgMl0gKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyB4ICs9IDQpCisgICAgICAgICAgICAgICAgICAgIEFWX1dONFAoJlBPUyh4LCB5KSwgQVZfUk40UCgmcmVmW3ggKyBpZHggKyAxXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtb2RlID09IDI2ICYmIGNfaWR4ID09IDAgJiYgc2l6ZSA8IDMyKSB7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgeSsrKQorICAgICAgICAgICAgICAgIFBPUygwLCB5KSA9IGF2X2NsaXBfcGl4ZWwodG9wWzBdICsgKChsZWZ0W3ldIC0gbGVmdFstMV0pID4+IDEpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlZiA9IGxlZnQgLSAxOworICAgICAgICBpZiAoYW5nbGUgPCAwICYmIGxhc3QgPCAtMSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8PSBzaXplOyB4ICs9IDQpCisgICAgICAgICAgICAgICAgQVZfV040UCgmcmVmX3RtcFt4XSwgQVZfUk40UCgmbGVmdFt4IC0gMV0pKTsKKyAgICAgICAgICAgIGZvciAoeCA9IGxhc3Q7IHggPD0gLTE7IHgrKykKKyAgICAgICAgICAgICAgICByZWZfdG1wW3hdID0gdG9wWy0xICsgKCh4ICogaW52X2FuZ2xlW21vZGUgLSAxMV0gKyAxMjgpID4+IDgpXTsKKyAgICAgICAgICAgIHJlZiA9IHJlZl90bXA7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7CisgICAgICAgICAgICBpbnQgaWR4ICA9ICgoeCArIDEpICogYW5nbGUpID4+IDU7CisgICAgICAgICAgICBpbnQgZmFjdCA9ICgoeCArIDEpICogYW5nbGUpICYgMzE7CisgICAgICAgICAgICBpZiAoZmFjdCkgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzaXplOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgUE9TKHgsIHkpID0gKCgzMiAtIGZhY3QpICogcmVmW3kgKyBpZHggKyAxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0ICAqIHJlZlt5ICsgaWR4ICsgMl0gKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzaXplOyB5KyspCisgICAgICAgICAgICAgICAgICAgIFBPUyh4LCB5KSA9IHJlZlt5ICsgaWR4ICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vZGUgPT0gMTAgJiYgY19pZHggPT0gMCAmJiBzaXplIDwgMzIpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyB4ICs9IDQpIHsKKyAgICAgICAgICAgICAgICBQT1MoeCwgICAgIDApID0gYXZfY2xpcF9waXhlbChsZWZ0WzBdICsgKCh0b3BbeCAgICBdIC0gdG9wWy0xXSkgPj4gMSkpOworICAgICAgICAgICAgICAgIFBPUyh4ICsgMSwgMCkgPSBhdl9jbGlwX3BpeGVsKGxlZnRbMF0gKyAoKHRvcFt4ICsgMV0gLSB0b3BbLTFdKSA+PiAxKSk7CisgICAgICAgICAgICAgICAgUE9TKHggKyAyLCAwKSA9IGF2X2NsaXBfcGl4ZWwobGVmdFswXSArICgodG9wW3ggKyAyXSAtIHRvcFstMV0pID4+IDEpKTsKKyAgICAgICAgICAgICAgICBQT1MoeCArIDMsIDApID0gYXZfY2xpcF9waXhlbChsZWZ0WzBdICsgKCh0b3BbeCArIDNdIC0gdG9wWy0xXSkgPj4gMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGVU5DKHByZWRfYW5ndWxhcl8wKSh1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgY19pZHgsIGludCBtb2RlKQoreworICAgIEZVTkMocHJlZF9hbmd1bGFyKShzcmMsIHRvcCwgbGVmdCwgc3RyaWRlLCBjX2lkeCwgbW9kZSwgMSA8PCAyKTsKK30KKworc3RhdGljIHZvaWQgRlVOQyhwcmVkX2FuZ3VsYXJfMSkodWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGNfaWR4LCBpbnQgbW9kZSkKK3sKKyAgICBGVU5DKHByZWRfYW5ndWxhcikoc3JjLCB0b3AsIGxlZnQsIHN0cmlkZSwgY19pZHgsIG1vZGUsIDEgPDwgMyk7Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMocHJlZF9hbmd1bGFyXzIpKHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBjX2lkeCwgaW50IG1vZGUpCit7CisgICAgRlVOQyhwcmVkX2FuZ3VsYXIpKHNyYywgdG9wLCBsZWZ0LCBzdHJpZGUsIGNfaWR4LCBtb2RlLCAxIDw8IDQpOworfQorCitzdGF0aWMgdm9pZCBGVU5DKHByZWRfYW5ndWxhcl8zKSh1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgY19pZHgsIGludCBtb2RlKQoreworICAgIEZVTkMocHJlZF9hbmd1bGFyKShzcmMsIHRvcCwgbGVmdCwgc3RyaWRlLCBjX2lkeCwgbW9kZSwgMSA8PCA1KTsKK30KKworI3VuZGVmIEVYVEVORF9MRUZUX0NJUAorI3VuZGVmIEVYVEVORF9SSUdIVF9DSVAKKyN1bmRlZiBFWFRFTkRfVVBfQ0lQCisjdW5kZWYgRVhURU5EX0RPV05fQ0lQCisjdW5kZWYgSVNfSU5UUkEKKyN1bmRlZiBNVkZfUFUKKyN1bmRlZiBNVkYKKyN1bmRlZiBQVQorI3VuZGVmIEVYVEVORAorI3VuZGVmIE1JTl9UQl9BRERSX1pTCisjdW5kZWYgUE9TCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9obm00dmlkZW8uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hubTR2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOTk1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9obm00dmlkZW8uYwpAQCAtMCwwICsxLDUxNCBAQAorLyoKKyAqIENyeW8gSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBITk00IHZpZGVvIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgRGF2aWQgS21lbnQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgSE5NNF9DSFVOS19JRF9QTCAxOTUzNgorI2RlZmluZSBITk00X0NIVU5LX0lEX0laIDIzMTEzCisjZGVmaW5lIEhOTTRfQ0hVTktfSURfSVUgMjE4MzMKKyNkZWZpbmUgSE5NNF9DSFVOS19JRF9TRCAxNzQ5MQorCit0eXBlZGVmIHN0cnVjdCBIbm00VmlkZW9Db250ZXh0IHsKKyAgICB1aW50OF90IHZlcnNpb247CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgdWludDhfdCAqY3VycmVudDsKKyAgICB1aW50OF90ICpwcmV2aW91czsKKyAgICB1aW50OF90ICpidWZmZXIxOworICAgIHVpbnQ4X3QgKmJ1ZmZlcjI7CisgICAgdWludDhfdCAqcHJvY2Vzc2VkOworICAgIHVpbnQzMl90IHBhbGV0dGVbMjU2XTsKK30gSG5tNFZpZGVvQ29udGV4dDsKKworc3RhdGljIGludCBnZXRiaXQoR2V0Qnl0ZUNvbnRleHQgKmdiLCB1aW50MzJfdCAqYml0YnVmLCBpbnQgKmJpdHMpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICghKmJpdHMpIHsKKyAgICAgICAgKmJpdGJ1ZiA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiKTsKKyAgICAgICAgKmJpdHMgPSAzMjsKKyAgICB9CisKKyAgICByZXQgPSAqYml0YnVmID4+IDMxOworICAgICpiaXRidWYgPDw9IDE7CisgICAgKCpiaXRzKS0tOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdW5wYWNrX2ludHJhZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKQoreworICAgIEhubTRWaWRlb0NvbnRleHQgKmhubSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgdWludDMyX3QgYml0YnVmID0gMCwgd3JpdGVvZmZzZXQgPSAwLCBjb3VudCA9IDA7CisgICAgdWludDE2X3Qgd29yZDsKKyAgICBpbnQzMl90IG9mZnNldDsKKyAgICBpbnQgYml0cyA9IDA7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgc3JjLCBzaXplKTsKKworICAgIHdoaWxlIChieXRlc3RyZWFtMl90ZWxsKCZnYikgPCBzaXplKSB7CisgICAgICAgIGlmIChnZXRiaXQoJmdiLCAmYml0YnVmLCAmYml0cykpIHsKKyAgICAgICAgICAgIGlmICh3cml0ZW9mZnNldCA+PSBobm0tPndpZHRoICogaG5tLT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kc1xuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBobm0tPmN1cnJlbnRbd3JpdGVvZmZzZXQrK10gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGdldGJpdCgmZ2IsICZiaXRidWYsICZiaXRzKSkgeworICAgICAgICAgICAgICAgIHdvcmQgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnYik7CisgICAgICAgICAgICAgICAgY291bnQgID0gd29yZCAmIDB4MDc7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKHdvcmQgPj4gMykgLSAweDIwMDA7CisgICAgICAgICAgICAgICAgaWYgKCFjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICAgICAgICAgIGlmICghY291bnQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY291bnQgID0gZ2V0Yml0KCZnYiwgJmJpdGJ1ZiwgJmJpdHMpICogMjsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBnZXRiaXQoJmdiLCAmYml0YnVmLCAmYml0cyk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSAtIDB4MDEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvdW50ICArPSAyOworICAgICAgICAgICAgb2Zmc2V0ICs9IHdyaXRlb2Zmc2V0OworICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgY291bnQgPj0gaG5tLT53aWR0aCAqIGhubS0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBdHRlbXB0aW5nIHRvIHJlYWQgb3V0IG9mIGJvdW5kc1xuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdyaXRlb2Zmc2V0ICsgY291bnQgPj0gaG5tLT53aWR0aCAqIGhubS0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICAgICAgICBobm0tPmN1cnJlbnRbd3JpdGVvZmZzZXQrK10gPSBobm0tPmN1cnJlbnRbb2Zmc2V0KytdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwb3N0cHJvY2Vzc19jdXJyZW50X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIbm00VmlkZW9Db250ZXh0ICpobm0gPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQzMl90IHgsIHksIHNyY194LCBzcmNfeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBobm0tPmhlaWdodDsgeSsrKSB7CisgICAgICAgIHNyY195ID0geSAtICh5ICUgMik7CisgICAgICAgIHNyY194ID0gc3JjX3kgKiBobm0tPndpZHRoICsgKHkgJSAyKTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGhubS0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgaG5tLT5wcm9jZXNzZWRbKHkgKiBobm0tPndpZHRoKSArIHhdID0gaG5tLT5jdXJyZW50W3NyY194XTsKKyAgICAgICAgICAgIHNyY194ICs9IDI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfcHJvY2Vzc2VkX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgSG5tNFZpZGVvQ29udGV4dCAqaG5tID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpzcmMgPSBobm0tPnByb2Nlc3NlZDsKKyAgICB1aW50OF90ICpkc3QgPSBmcmFtZS0+ZGF0YVswXTsKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBobm0tPmhlaWdodDsgeSsrKSB7CisgICAgICAgIG1lbWNweShkc3QsIHNyYywgaG5tLT53aWR0aCk7CisgICAgICAgIHNyYyArPSBobm0tPndpZHRoOworICAgICAgICBkc3QgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2ludGVyZnJhbWVfdjQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB1aW50OF90ICpzcmMsIHVpbnQzMl90IHNpemUpCit7CisgICAgSG5tNFZpZGVvQ29udGV4dCAqaG5tID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICB1aW50MzJfdCB3cml0ZW9mZnNldCA9IDA7CisgICAgaW50IGNvdW50LCBsZWZ0LCBvZmZzZXQ7CisgICAgdWludDhfdCB0YWcsIHByZXZpb3VzLCBiYWNrbGluZSwgYmFja3dhcmQsIHN3YXA7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgc3JjLCBzaXplKTsKKworICAgIHdoaWxlIChieXRlc3RyZWFtMl90ZWxsKCZnYikgPCBzaXplKSB7CisgICAgICAgIGNvdW50ID0gYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZnYikgJiAweDFGOworICAgICAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAgICAgdGFnID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSAmIDB4RTA7CisgICAgICAgICAgICB0YWcgPSB0YWcgPj4gNTsKKworICAgICAgICAgICAgaWYgKHRhZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHdyaXRlb2Zmc2V0ICsgMiA+IGhubS0+d2lkdGggKiBobm0tPmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIndyaXRlb2Zmc2V0IG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaG5tLT5jdXJyZW50W3dyaXRlb2Zmc2V0KytdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgICAgICBobm0tPmN1cnJlbnRbd3JpdGVvZmZzZXQrK10gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gMSkgeworICAgICAgICAgICAgICAgIHdyaXRlb2Zmc2V0ICs9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYikgKiAyOworICAgICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gMikgeworICAgICAgICAgICAgICAgIGNvdW50ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKyAgICAgICAgICAgICAgICBjb3VudCAqPSAyOworICAgICAgICAgICAgICAgIHdyaXRlb2Zmc2V0ICs9IGNvdW50OworICAgICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gMykgeworICAgICAgICAgICAgICAgIGNvdW50ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSAqIDI7CisgICAgICAgICAgICAgICAgaWYgKHdyaXRlb2Zmc2V0ICsgY291bnQgPiBobm0tPndpZHRoICogaG5tLT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3cml0ZW9mZnNldCBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaG5tLT5jdXJyZW50W3dyaXRlb2Zmc2V0KytdID0gYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZnYik7CisgICAgICAgICAgICAgICAgICAgIGNvdW50LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod3JpdGVvZmZzZXQgPiBobm0tPndpZHRoICogaG5tLT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIndyaXRlb2Zmc2V0IG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJldmlvdXMgPSBieXRlc3RyZWFtMl9wZWVrX2J5dGUoJmdiKSAmIDB4MjA7CisgICAgICAgICAgICBiYWNrbGluZSA9IGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZSgmZ2IpICYgMHg0MDsKKyAgICAgICAgICAgIGJhY2t3YXJkID0gYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZnYikgJiAweDgwOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDEpOworICAgICAgICAgICAgc3dhcCAgID0gYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZnYikgJiAweDAxOworICAgICAgICAgICAgb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKyAgICAgICAgICAgIG9mZnNldCA9IChvZmZzZXQgPj4gMSkgJiAweDdGRkY7CisgICAgICAgICAgICBvZmZzZXQgPSB3cml0ZW9mZnNldCArIChvZmZzZXQgKiAyKSAtIDB4ODAwMDsKKworICAgICAgICAgICAgbGVmdCA9IGNvdW50OworCisgICAgICAgICAgICBpZiAoIWJhY2t3YXJkICYmIG9mZnNldCArIDIqY291bnQgPiBobm0tPndpZHRoICogaG5tLT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkF0dGVtcHRpbmcgdG8gcmVhZCBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFja3dhcmQgJiYgb2Zmc2V0ICsgMSA+PSBobm0tPndpZHRoICogaG5tLT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkF0dGVtcHRpbmcgdG8gcmVhZCBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod3JpdGVvZmZzZXQgKyAyKmNvdW50ID4gaG5tLT53aWR0aCAqIGhubS0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoYmFja3dhcmQpIHsKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgKCEhYmFja2xpbmUpKigyICogaG5tLT53aWR0aCAtIDEpICsgMioobGVmdC0xKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkF0dGVtcHRpbmcgdG8gcmVhZCBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgKCEhYmFja2xpbmUpKigyICogaG5tLT53aWR0aCAtIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQXR0ZW1wdGluZyB0byByZWFkIG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcmV2aW91cykgeworICAgICAgICAgICAgICAgIHdoaWxlIChsZWZ0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYmFja2xpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhubS0+Y3VycmVudFt3cml0ZW9mZnNldCsrXSA9IGhubS0+cHJldmlvdXNbb2Zmc2V0IC0gKDIgKiBobm0tPndpZHRoKSArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgaG5tLT5jdXJyZW50W3dyaXRlb2Zmc2V0KytdID0gaG5tLT5wcmV2aW91c1tvZmZzZXQrK107CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhubS0+Y3VycmVudFt3cml0ZW9mZnNldCsrXSA9IGhubS0+cHJldmlvdXNbb2Zmc2V0KytdOworICAgICAgICAgICAgICAgICAgICAgICAgaG5tLT5jdXJyZW50W3dyaXRlb2Zmc2V0KytdID0gaG5tLT5wcmV2aW91c1tvZmZzZXQrK107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2t3YXJkKQorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IDQ7CisgICAgICAgICAgICAgICAgICAgIGxlZnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlIChsZWZ0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYmFja2xpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhubS0+Y3VycmVudFt3cml0ZW9mZnNldCsrXSA9IGhubS0+Y3VycmVudFtvZmZzZXQgLSAoMiAqIGhubS0+d2lkdGgpICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICBobm0tPmN1cnJlbnRbd3JpdGVvZmZzZXQrK10gPSBobm0tPmN1cnJlbnRbb2Zmc2V0KytdOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBobm0tPmN1cnJlbnRbd3JpdGVvZmZzZXQrK10gPSBobm0tPmN1cnJlbnRbb2Zmc2V0KytdOworICAgICAgICAgICAgICAgICAgICAgICAgaG5tLT5jdXJyZW50W3dyaXRlb2Zmc2V0KytdID0gaG5tLT5jdXJyZW50W29mZnNldCsrXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYmFja3dhcmQpCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gNDsKKyAgICAgICAgICAgICAgICAgICAgbGVmdC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN3YXApIHsKKyAgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgPSBjb3VudDsKKyAgICAgICAgICAgICAgICB3cml0ZW9mZnNldCAtPSBjb3VudCAqIDI7CisgICAgICAgICAgICAgICAgd2hpbGUgKGxlZnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN3YXAgPSBobm0tPmN1cnJlbnRbd3JpdGVvZmZzZXRdOworICAgICAgICAgICAgICAgICAgICBobm0tPmN1cnJlbnRbd3JpdGVvZmZzZXRdID0gaG5tLT5jdXJyZW50W3dyaXRlb2Zmc2V0ICsgMV07CisgICAgICAgICAgICAgICAgICAgIGhubS0+Y3VycmVudFt3cml0ZW9mZnNldCArIDFdID0gc3dhcDsKKyAgICAgICAgICAgICAgICAgICAgbGVmdC0tOworICAgICAgICAgICAgICAgICAgICB3cml0ZW9mZnNldCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2ludGVyZnJhbWVfdjRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpCit7CisgICAgSG5tNFZpZGVvQ29udGV4dCAqaG5tID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICB1aW50MzJfdCB3cml0ZW9mZnNldCA9IDAsIG9mZnNldDsKKyAgICB1aW50OF90IHRhZywgY291bnQsIHByZXZpb3VzLCBkZWx0YTsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBzcmMsIHNpemUpOworCisgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX3RlbGwoJmdiKSA8IHNpemUpIHsKKyAgICAgICAgY291bnQgPSBieXRlc3RyZWFtMl9wZWVrX2J5dGUoJmdiKSAmIDB4M0Y7CisgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgICAgICB0YWcgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpICYgMHhDMDsKKyAgICAgICAgICAgIHRhZyA9IHRhZyA+PiA2OworICAgICAgICAgICAgaWYgKHRhZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgd3JpdGVvZmZzZXQgKz0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnID09IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAod3JpdGVvZmZzZXQgKyBobm0tPndpZHRoID49IGhubS0+d2lkdGggKiBobm0tPmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIndyaXRlb2Zmc2V0IG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaG5tLT5jdXJyZW50W3dyaXRlb2Zmc2V0XSAgICAgICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICAgICAgICAgIGhubS0+Y3VycmVudFt3cml0ZW9mZnNldCArIGhubS0+d2lkdGhdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgICAgICB3cml0ZW9mZnNldCsrOworICAgICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gMikgeworICAgICAgICAgICAgICAgIHdyaXRlb2Zmc2V0ICs9IGhubS0+d2lkdGg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSAzKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod3JpdGVvZmZzZXQgPiBobm0tPndpZHRoICogaG5tLT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIndyaXRlb2Zmc2V0IG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVsdGEgICAgPSBieXRlc3RyZWFtMl9wZWVrX2J5dGUoJmdiKSAmIDB4ODA7CisgICAgICAgICAgICBwcmV2aW91cyA9IGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZSgmZ2IpICYgMHg0MDsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAxKTsKKworICAgICAgICAgICAgb2Zmc2V0ICA9IHdyaXRlb2Zmc2V0OworICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnYik7CisKKyAgICAgICAgICAgIGlmIChkZWx0YSkgeworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAweDEwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQXR0ZW1wdGluZyB0byByZWFkIG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2Zmc2V0IC09IDB4MTAwMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyBobm0tPndpZHRoICsgY291bnQgPj0gaG5tLT53aWR0aCAqIGhubS0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBdHRlbXB0aW5nIHRvIHJlYWQgb3V0IG9mIGJvdW5kc1xuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdyaXRlb2Zmc2V0ICsgaG5tLT53aWR0aCArIGNvdW50ID49IGhubS0+d2lkdGggKiBobm0tPmhlaWdodCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQXR0ZW1wdGluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHByZXZpb3VzKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBobm0tPmN1cnJlbnRbd3JpdGVvZmZzZXRdICAgICAgICAgICAgICA9IGhubS0+cHJldmlvdXNbb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgaG5tLT5jdXJyZW50W3dyaXRlb2Zmc2V0ICsgaG5tLT53aWR0aF0gPSBobm0tPnByZXZpb3VzW29mZnNldCArIGhubS0+d2lkdGhdOworICAgICAgICAgICAgICAgICAgICB3cml0ZW9mZnNldCsrOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaG5tLT5jdXJyZW50W3dyaXRlb2Zmc2V0XSAgICAgICAgICAgICAgPSBobm0tPmN1cnJlbnRbb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgaG5tLT5jdXJyZW50W3dyaXRlb2Zmc2V0ICsgaG5tLT53aWR0aF0gPSBobm0tPmN1cnJlbnRbb2Zmc2V0ICsgaG5tLT53aWR0aF07CisgICAgICAgICAgICAgICAgICAgIHdyaXRlb2Zmc2V0Kys7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgICAgICAgICBjb3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaG5tX3VwZGF0ZV9wYWxldHRlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpCit7CisgICAgSG5tNFZpZGVvQ29udGV4dCAqaG5tID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICB1aW50OF90IHN0YXJ0LCB3cml0ZW9mZnNldDsKKyAgICB1aW50MTZfdCBjb3VudDsKKyAgICBpbnQgZWlnaHRfYml0X2NvbG9yczsKKworICAgIGVpZ2h0X2JpdF9jb2xvcnMgPSBzcmNbN10gJiAweDgwICYmIGhubS0+dmVyc2lvbiA9PSAweDRhOworCisgICAgLy8gc2tpcCBmaXJzdCA4IGJ5dGVzCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIHNyYyArIDgsIHNpemUgLSA4KTsKKworICAgIHdoaWxlIChieXRlc3RyZWFtMl90ZWxsKCZnYikgPCBzaXplIC0gOCkgeworICAgICAgICBzdGFydCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgIGNvdW50ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgaWYgKHN0YXJ0ID09IDI1NSAmJiBjb3VudCA9PSAyNTUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGNvdW50ID09IDApCisgICAgICAgICAgICBjb3VudCA9IDI1NjsKKyAgICAgICAgd3JpdGVvZmZzZXQgPSBzdGFydDsKKyAgICAgICAgd2hpbGUgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgaG5tLT5wYWxldHRlW3dyaXRlb2Zmc2V0XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0KCZnYik7CisgICAgICAgICAgICBpZiAoIWVpZ2h0X2JpdF9jb2xvcnMpCisgICAgICAgICAgICAgICAgaG5tLT5wYWxldHRlW3dyaXRlb2Zmc2V0XSA8PD0gMjsKKyAgICAgICAgICAgIGNvdW50LS07CisgICAgICAgICAgICB3cml0ZW9mZnNldCsrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBobm1fZmxpcF9idWZmZXJzKEhubTRWaWRlb0NvbnRleHQgKmhubSkKK3sKKyAgICB1aW50OF90ICp0ZW1wOworCisgICAgdGVtcCAgICAgICAgICA9IGhubS0+Y3VycmVudDsKKyAgICBobm0tPmN1cnJlbnQgID0gaG5tLT5wcmV2aW91czsKKyAgICBobm0tPnByZXZpb3VzID0gdGVtcDsKK30KKworc3RhdGljIGludCBobm1fZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBIbm00VmlkZW9Db250ZXh0ICpobm0gPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisgICAgdWludDE2X3QgY2h1bmtfaWQ7CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPCA4KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGFja2V0IHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGNodW5rX2lkID0gQVZfUkwxNihhdnBrdC0+ZGF0YSArIDQpOworCisgICAgaWYgKGNodW5rX2lkID09IEhOTTRfQ0hVTktfSURfUEwpIHsKKyAgICAgICAgaG5tX3VwZGF0ZV9wYWxldHRlKGF2Y3R4LCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIH0gZWxzZSBpZiAoY2h1bmtfaWQgPT0gSE5NNF9DSFVOS19JRF9JWikgeworICAgICAgICBpZiAoYXZwa3QtPnNpemUgPCAxMikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwYWNrZXQgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHVucGFja19pbnRyYWZyYW1lKGF2Y3R4LCBhdnBrdC0+ZGF0YSArIDEyLCBhdnBrdC0+c2l6ZSAtIDEyKTsKKyAgICAgICAgbWVtY3B5KGhubS0+cHJldmlvdXMsIGhubS0+Y3VycmVudCwgaG5tLT53aWR0aCAqIGhubS0+aGVpZ2h0KTsKKyAgICAgICAgaWYgKGhubS0+dmVyc2lvbiA9PSAweDRhKQorICAgICAgICAgICAgbWVtY3B5KGhubS0+cHJvY2Vzc2VkLCBobm0tPmN1cnJlbnQsIGhubS0+d2lkdGggKiBobm0tPmhlaWdodCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBvc3Rwcm9jZXNzX2N1cnJlbnRfZnJhbWUoYXZjdHgpOworICAgICAgICBjb3B5X3Byb2Nlc3NlZF9mcmFtZShhdmN0eCwgZnJhbWUpOworICAgICAgICBmcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIGZyYW1lLT5rZXlfZnJhbWUgPSAxOworICAgICAgICBtZW1jcHkoZnJhbWUtPmRhdGFbMV0sIGhubS0+cGFsZXR0ZSwgMjU2ICogNCk7CisgICAgICAgICpnb3RfZnJhbWUgPSAxOworICAgIH0gZWxzZSBpZiAoY2h1bmtfaWQgPT0gSE5NNF9DSFVOS19JRF9JVSkgeworICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAoaG5tLT52ZXJzaW9uID09IDB4NGEpIHsKKyAgICAgICAgICAgIGRlY29kZV9pbnRlcmZyYW1lX3Y0YShhdmN0eCwgYXZwa3QtPmRhdGEgKyA4LCBhdnBrdC0+c2l6ZSAtIDgpOworICAgICAgICAgICAgbWVtY3B5KGhubS0+cHJvY2Vzc2VkLCBobm0tPmN1cnJlbnQsIGhubS0+d2lkdGggKiBobm0tPmhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWNvZGVfaW50ZXJmcmFtZV92NChhdmN0eCwgYXZwa3QtPmRhdGEgKyA4LCBhdnBrdC0+c2l6ZSAtIDgpOworICAgICAgICAgICAgcG9zdHByb2Nlc3NfY3VycmVudF9mcmFtZShhdmN0eCk7CisgICAgICAgIH0KKyAgICAgICAgY29weV9wcm9jZXNzZWRfZnJhbWUoYXZjdHgsIGZyYW1lKTsKKyAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMDsKKyAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzFdLCBobm0tPnBhbGV0dGUsIDI1NiAqIDQpOworICAgICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICAgICAgaG5tX2ZsaXBfYnVmZmVycyhobm0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBjaHVuayBpZDogJWRcbiIsIGNodW5rX2lkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaG5tX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIbm00VmlkZW9Db250ZXh0ICpobm0gPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJFeHRyYWRhdGEgbWlzc2luZywgZGVjb2RlciByZXF1aXJlcyB2ZXJzaW9uIG51bWJlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCAwLCBhdmN0eCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBobm0tPnZlcnNpb24gICA9IGF2Y3R4LT5leHRyYWRhdGFbMF07CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgaG5tLT53aWR0aCAgICAgPSBhdmN0eC0+d2lkdGg7CisgICAgaG5tLT5oZWlnaHQgICAgPSBhdmN0eC0+aGVpZ2h0OworICAgIGhubS0+YnVmZmVyMSAgID0gYXZfbWFsbG9jeihhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0KTsKKyAgICBobm0tPmJ1ZmZlcjIgICA9IGF2X21hbGxvY3ooYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCk7CisgICAgaG5tLT5wcm9jZXNzZWQgPSBhdl9tYWxsb2N6KGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQpOworCisgICAgaWYgKCAgICFobm0tPmJ1ZmZlcjEgfHwgIWhubS0+YnVmZmVyMiB8fCAhaG5tLT5wcm9jZXNzZWQKKyAgICAgICAgfHwgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCA9PSAwCisgICAgICAgIHx8IGF2Y3R4LT5oZWlnaHQgJSAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYXZfbWFsbG9jeigpIGZhaWxlZFxuIik7CisgICAgICAgIGF2X2ZyZWVwKCZobm0tPmJ1ZmZlcjEpOworICAgICAgICBhdl9mcmVlcCgmaG5tLT5idWZmZXIyKTsKKyAgICAgICAgYXZfZnJlZXAoJmhubS0+cHJvY2Vzc2VkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBobm0tPmN1cnJlbnQgID0gaG5tLT5idWZmZXIxOworICAgIGhubS0+cHJldmlvdXMgPSBobm0tPmJ1ZmZlcjI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGhubV9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIbm00VmlkZW9Db250ZXh0ICpobm0gPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmhubS0+YnVmZmVyMSk7CisgICAgYXZfZnJlZXAoJmhubS0+YnVmZmVyMik7CisgICAgYXZfZnJlZXAoJmhubS0+cHJvY2Vzc2VkKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2hubTRfdmlkZW9fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaG5tNHZpZGVvIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSE5NIDQgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSE5NNF9WSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSG5tNFZpZGVvQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gaG5tX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGhubV9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGhubV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ocGVsX3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9ocGVsX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjZmU3NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hwZWxfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKKyNpbmNsdWRlICJwaXhlbHMuaCIKKworI2luY2x1ZGUgImJpdF9kZXB0aF90ZW1wbGF0ZS5jIgorCisjZGVmaW5lIERFRl9IUEVMKE9QTkFNRSwgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgRlVOQyhPUE5BTUUgIyMgX3BpeGVsczhfbDIpKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVsNCBhLCBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgPSBBVl9STjRQKCZzcmMxW2kgKiBzcmNfc3RyaWRlMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIgPSBBVl9STjRQKCZzcmMyW2kgKiBzcmNfc3RyaWRlMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHBpeGVsNCAqKSAmZHN0W2kgKiBkc3Rfc3RyaWRlXSksIHJuZF9hdmdfcGl4ZWw0KGEsIGIpKTsgICBcCisgICAgICAgIGEgPSBBVl9STjRQKCZzcmMxW2kgKiBzcmNfc3RyaWRlMSArIDQgKiBzaXplb2YocGl4ZWwpXSk7ICAgICAgICBcCisgICAgICAgIGIgPSBBVl9STjRQKCZzcmMyW2kgKiBzcmNfc3RyaWRlMiArIDQgKiBzaXplb2YocGl4ZWwpXSk7ICAgICAgICBcCisgICAgICAgIE9QKCooKHBpeGVsNCAqKSAmZHN0W2kgKiBkc3Rfc3RyaWRlICsgNCAqIHNpemVvZihwaXhlbCldKSwgICAgICBcCisgICAgICAgICAgIHJuZF9hdmdfcGl4ZWw0KGEsIGIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgRlVOQyhPUE5BTUUgIyMgX3BpeGVsczRfbDIpKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVsNCBhLCBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgPSBBVl9STjRQKCZzcmMxW2kgKiBzcmNfc3RyaWRlMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIgPSBBVl9STjRQKCZzcmMyW2kgKiBzcmNfc3RyaWRlMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHBpeGVsNCAqKSAmZHN0W2kgKiBkc3Rfc3RyaWRlXSksIHJuZF9hdmdfcGl4ZWw0KGEsIGIpKTsgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgRlVOQyhPUE5BTUUgIyMgX3BpeGVsczJfbDIpKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVsNCBhLCBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgPSBBVl9STjJQKCZzcmMxW2kgKiBzcmNfc3RyaWRlMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIgPSBBVl9STjJQKCZzcmMyW2kgKiBzcmNfc3RyaWRlMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHBpeGVsMiAqKSAmZHN0W2kgKiBkc3Rfc3RyaWRlXSksIHJuZF9hdmdfcGl4ZWw0KGEsIGIpKTsgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgRlVOQyhPUE5BTUUgIyMgX3BpeGVsczE2X2wyKSh1aW50OF90ICpkc3QsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZTEsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZTIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyhPUE5BTUUgIyMgX3BpeGVsczhfbDIpKGRzdCwgc3JjMSwgc3JjMiwgZHN0X3N0cmlkZSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGUxLCBzcmNfc3RyaWRlMiwgaCk7ICAgICAgICAgICBcCisgICAgRlVOQyhPUE5BTUUgIyMgX3BpeGVsczhfbDIpKGRzdCAgKyA4ICogc2l6ZW9mKHBpeGVsKSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgKyA4ICogc2l6ZW9mKHBpeGVsKSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIgKyA4ICogc2l6ZW9mKHBpeGVsKSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUsIHNyY19zdHJpZGUxLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGUyLCBoKTsgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgb3BfYXZnKGEsIGIpIGEgPSBybmRfYXZnX3BpeGVsNChhLCBiKQorI2RlZmluZSBvcF9wdXQoYSwgYikgYSA9IGIKK0RFRl9IUEVMKGF2Zywgb3BfYXZnKQorREVGX0hQRUwocHV0LCBvcF9wdXQpCisjdW5kZWYgb3BfYXZnCisjdW5kZWYgb3BfcHV0CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ocGVsZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9ocGVsZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2Mzc2MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2hwZWxkc3AuYwpAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIEhhbGYtcGVsIERTUCBmdW5jdGlvbnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIGdtYyAmIHEtcGVsICYgMzIvNjQgYml0IGJhc2VkIE1DIGJ5IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEhhbGYtcGVsIERTUCBmdW5jdGlvbnMuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImhwZWxkc3AuaCIKKworI2RlZmluZSBCSVRfREVQVEggOAorI2luY2x1ZGUgImhwZWxfdGVtcGxhdGUuYyIKKyNpbmNsdWRlICJwZWxfdGVtcGxhdGUuYyIKKworI2RlZmluZSBQSVhPUDIoT1BOQU1FLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGlubGluZSB2b2lkIE9QTkFNRSAjIyBfbm9fcm5kX3BpeGVsczhfbDJfOCh1aW50OF90ICpkc3QsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZTEsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZTIsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MzJfdCBhLCBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhID0gQVZfUk4zMigmc3JjMVtpICogc3JjX3N0cmlkZTFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiID0gQVZfUk4zMigmc3JjMltpICogc3JjX3N0cmlkZTJdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUCgqKCh1aW50MzJfdCAqKSAmZHN0W2kgKiBkc3Rfc3RyaWRlXSksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBub19ybmRfYXZnMzIoYSwgYikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhID0gQVZfUk4zMigmc3JjMVtpICogc3JjX3N0cmlkZTEgKyA0XSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiID0gQVZfUk4zMigmc3JjMltpICogc3JjX3N0cmlkZTIgKyA0XSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUCgqKCh1aW50MzJfdCAqKSAmZHN0W2kgKiBkc3Rfc3RyaWRlICsgNF0pLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBub19ybmRfYXZnMzIoYSwgYikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGlubGluZSB2b2lkIE9QTkFNRSAjIyBfbm9fcm5kX3BpeGVsczhfeDJfOF9jKHVpbnQ4X3QgKmJsb2NrLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUE5BTUUgIyMgX25vX3JuZF9waXhlbHM4X2wyXzgoYmxvY2ssIHBpeGVscywgcGl4ZWxzICsgMSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9zaXplLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgaCk7IFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBPUE5BTUUgIyMgX3BpeGVsczhfeDJfOF9jKHVpbnQ4X3QgKmJsb2NrLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKSAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUE5BTUUgIyMgX3BpeGVsczhfbDJfOChibG9jaywgcGl4ZWxzLCBwaXhlbHMgKyAxLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgbGluZV9zaXplLCBoKTsgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBPUE5BTUUgIyMgX25vX3JuZF9waXhlbHM4X3kyXzhfYyh1aW50OF90ICpibG9jaywgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9ub19ybmRfcGl4ZWxzOF9sMl84KGJsb2NrLCBwaXhlbHMsIHBpeGVscyArIGxpbmVfc2l6ZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfc2l6ZSwgbGluZV9zaXplLCBsaW5lX3NpemUsIGgpOyBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9waXhlbHM4X3kyXzhfYyh1aW50OF90ICpibG9jaywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9waXhlbHM4X2wyXzgoYmxvY2ssIHBpeGVscywgcGl4ZWxzICsgbGluZV9zaXplLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9zaXplLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgaCk7ICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9waXhlbHM0X3gyXzhfYyh1aW50OF90ICpibG9jaywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9waXhlbHM0X2wyXzgoYmxvY2ssIHBpeGVscywgcGl4ZWxzICsgMSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9zaXplLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgaCk7ICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9waXhlbHM0X3kyXzhfYyh1aW50OF90ICpibG9jaywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9waXhlbHM0X2wyXzgoYmxvY2ssIHBpeGVscywgcGl4ZWxzICsgbGluZV9zaXplLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9zaXplLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgaCk7ICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9waXhlbHMyX3gyXzhfYyh1aW50OF90ICpibG9jaywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9waXhlbHMyX2wyXzgoYmxvY2ssIHBpeGVscywgcGl4ZWxzICsgMSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9zaXplLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgaCk7ICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9waXhlbHMyX3kyXzhfYyh1aW50OF90ICpibG9jaywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9waXhlbHMyX2wyXzgoYmxvY2ssIHBpeGVscywgcGl4ZWxzICsgbGluZV9zaXplLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9zaXplLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgaCk7ICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9waXhlbHMyX3h5Ml84X2ModWludDhfdCAqYmxvY2ssICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGl4ZWxzLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGExLCBiMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGEwID0gcGl4ZWxzWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGIwID0gcGl4ZWxzWzFdICsgMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYTAgKz0gYjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYjAgKz0gcGl4ZWxzWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkgKz0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGExICA9IHBpeGVsc1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIxICA9IHBpeGVsc1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGExICs9IGIxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIxICs9IHBpeGVsc1syXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrWzBdID0gKGExICsgYTApID4+IDI7IC8qIEZJWE1FIG5vbiBwdXQgKi8gICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrWzFdID0gKGIxICsgYjApID4+IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEwICA9IHBpeGVsc1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIwICA9IHBpeGVsc1sxXSArIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEwICs9IGIwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIwICs9IHBpeGVsc1syXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrWzBdID0gKGExICsgYTApID4+IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrWzFdID0gKGIxICsgYjApID4+IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVscyAgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrICAgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9waXhlbHM0X3h5Ml84X2ModWludDhfdCAqYmxvY2ssICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGl4ZWxzLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogRklYTUUgSElHSCBCSVQgREVQVEggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgYSA9IEFWX1JOMzIocGl4ZWxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgYiA9IEFWX1JOMzIocGl4ZWxzICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgbDAgPSAoYSAmIDB4MDMwMzAzMDNVTCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAoYiAmIDB4MDMwMzAzMDNVTCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMjAyMDJVTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgaDAgPSAoKGEgJiAweEZDRkNGQ0ZDVUwpID4+IDIpICsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAoKGIgJiAweEZDRkNGQ0ZDVUwpID4+IDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgbDEsIGgxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkgKz0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGEgPSBBVl9STjMyKHBpeGVscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGIgPSBBVl9STjMyKHBpeGVscyArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwxID0gKGEgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGIgJiAweDAzMDMwMzAzVUwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGgxID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHVpbnQzMl90ICopIGJsb2NrKSwgaDAgKyBoMSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICgoKGwwICsgbDEpID4+IDIpICYgMHgwRjBGMEYwRlVMKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgID0gQVZfUk4zMihwaXhlbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIgID0gQVZfUk4zMihwaXhlbHMgKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGIgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAweDAyMDIwMjAyVUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGgwID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHVpbnQzMl90ICopIGJsb2NrKSwgaDAgKyBoMSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICgoKGwwICsgbDEpID4+IDIpICYgMHgwRjBGMEYwRlVMKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9waXhlbHM4X3h5Ml84X2ModWludDhfdCAqYmxvY2ssICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGl4ZWxzLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogRklYTUUgSElHSCBCSVQgREVQVEggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGEgPSBBVl9STjMyKHBpeGVscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGIgPSBBVl9STjMyKHBpeGVscyArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKGIgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDIwMjAyVUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGgwID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGwxLCBoMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpICs9IDIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MzJfdCBhID0gQVZfUk4zMihwaXhlbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MzJfdCBiID0gQVZfUk4zMihwaXhlbHMgKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsMSA9IChhICYgMHgwMzAzMDMwM1VMKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIChiICYgMHgwMzAzMDMwM1VMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoMSA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBPUCgqKCh1aW50MzJfdCAqKSBibG9jayksIGgwICsgaDEgKyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCkpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBibG9jayAgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhICA9IEFWX1JOMzIocGl4ZWxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiICA9IEFWX1JOMzIocGl4ZWxzICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsMCA9IChhICYgMHgwMzAzMDMwM1VMKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIChiICYgMHgwMzAzMDMwM1VMKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyMDIwMlVMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoMCA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBPUCgqKCh1aW50MzJfdCAqKSBibG9jayksIGgwICsgaDEgKyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCkpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBibG9jayAgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVscyArPSA0IC0gbGluZV9zaXplICogKGggKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrICArPSA0IC0gbGluZV9zaXplICogaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9ub19ybmRfcGl4ZWxzOF94eTJfOF9jKHVpbnQ4X3QgKmJsb2NrLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogRklYTUUgSElHSCBCSVQgREVQVEggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGEgPSBBVl9STjMyKHBpeGVscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGIgPSBBVl9STjMyKHBpeGVscyArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKGIgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDEwMTAxVUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGgwID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGwxLCBoMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpICs9IDIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MzJfdCBhID0gQVZfUk4zMihwaXhlbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MzJfdCBiID0gQVZfUk4zMihwaXhlbHMgKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsMSA9IChhICYgMHgwMzAzMDMwM1VMKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIChiICYgMHgwMzAzMDMwM1VMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoMSA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBPUCgqKCh1aW50MzJfdCAqKSBibG9jayksIGgwICsgaDEgKyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCkpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBibG9jayAgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhICA9IEFWX1JOMzIocGl4ZWxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiICA9IEFWX1JOMzIocGl4ZWxzICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsMCA9IChhICYgMHgwMzAzMDMwM1VMKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIChiICYgMHgwMzAzMDMwM1VMKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgMHgwMTAxMDEwMVVMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoMCA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBPUCgqKCh1aW50MzJfdCAqKSBibG9jayksIGgwICsgaDEgKyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCkpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBibG9jayAgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVscyArPSA0IC0gbGluZV9zaXplICogKGggKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrICArPSA0IC0gbGluZV9zaXplICogaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitDQUxMXzJYX1BJWEVMUyhPUE5BTUUgIyMgX3BpeGVsczE2X3gyXzhfYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBPUE5BTUUgIyMgX3BpeGVsczhfeDJfOF9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitDQUxMXzJYX1BJWEVMUyhPUE5BTUUgIyMgX3BpeGVsczE2X3kyXzhfYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBPUE5BTUUgIyMgX3BpeGVsczhfeTJfOF9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitDQUxMXzJYX1BJWEVMUyhPUE5BTUUgIyMgX3BpeGVsczE2X3h5Ml84X2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBPUE5BTUUgIyMgX3BpeGVsczhfeHkyXzhfYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitDQUxMXzJYX1BJWEVMUyhPUE5BTUUgIyMgX25vX3JuZF9waXhlbHMxNl84X2MsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBPUE5BTUUgIyMgX3BpeGVsczhfOF9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitDQUxMXzJYX1BJWEVMUyhPUE5BTUUgIyMgX25vX3JuZF9waXhlbHMxNl94Ml84X2MsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBPUE5BTUUgIyMgX25vX3JuZF9waXhlbHM4X3gyXzhfYywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitDQUxMXzJYX1BJWEVMUyhPUE5BTUUgIyMgX25vX3JuZF9waXhlbHMxNl95Ml84X2MsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBPUE5BTUUgIyMgX25vX3JuZF9waXhlbHM4X3kyXzhfYywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitDQUxMXzJYX1BJWEVMUyhPUE5BTUUgIyMgX25vX3JuZF9waXhlbHMxNl94eTJfOF9jLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBPUE5BTUUgIyMgX25vX3JuZF9waXhlbHM4X3h5Ml84X2MsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgb3BfYXZnKGEsIGIpIGEgPSBybmRfYXZnMzIoYSwgYikKKyNkZWZpbmUgb3BfcHV0KGEsIGIpIGEgPSBiCisjZGVmaW5lIHB1dF9ub19ybmRfcGl4ZWxzOF84X2MgcHV0X3BpeGVsczhfOF9jCitQSVhPUDIoYXZnLCBvcF9hdmcpCitQSVhPUDIocHV0LCBvcF9wdXQpCisjdW5kZWYgb3BfYXZnCisjdW5kZWYgb3BfcHV0CisKK2F2X2NvbGQgdm9pZCBmZl9ocGVsZHNwX2luaXQoSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncykKK3sKKyNkZWZpbmUgaHBlbF9mdW5jcyhwcmVmaXgsIGlkeCwgbnVtKSBcCisgICAgYy0+cHJlZml4ICMjIF9waXhlbHNfdGFiIGlkeCBbMF0gPSBwcmVmaXggIyMgX3BpeGVscyAjIyBudW0gIyMgXzhfYzsgXAorICAgIGMtPnByZWZpeCAjIyBfcGl4ZWxzX3RhYiBpZHggWzFdID0gcHJlZml4ICMjIF9waXhlbHMgIyMgbnVtICMjIF94Ml84X2M7IFwKKyAgICBjLT5wcmVmaXggIyMgX3BpeGVsc190YWIgaWR4IFsyXSA9IHByZWZpeCAjIyBfcGl4ZWxzICMjIG51bSAjIyBfeTJfOF9jOyBcCisgICAgYy0+cHJlZml4ICMjIF9waXhlbHNfdGFiIGlkeCBbM10gPSBwcmVmaXggIyMgX3BpeGVscyAjIyBudW0gIyMgX3h5Ml84X2MKKworICAgIGhwZWxfZnVuY3MocHV0LCBbMF0sIDE2KTsKKyAgICBocGVsX2Z1bmNzKHB1dCwgWzFdLCAgOCk7CisgICAgaHBlbF9mdW5jcyhwdXQsIFsyXSwgIDQpOworICAgIGhwZWxfZnVuY3MocHV0LCBbM10sICAyKTsKKyAgICBocGVsX2Z1bmNzKHB1dF9ub19ybmQsIFswXSwgMTYpOworICAgIGhwZWxfZnVuY3MocHV0X25vX3JuZCwgWzFdLCAgOCk7CisgICAgaHBlbF9mdW5jcyhhdmcsIFswXSwgMTYpOworICAgIGhwZWxfZnVuY3MoYXZnLCBbMV0sICA4KTsKKyAgICBocGVsX2Z1bmNzKGF2ZywgWzJdLCAgNCk7CisgICAgaHBlbF9mdW5jcyhhdmcsIFszXSwgIDIpOworICAgIGhwZWxfZnVuY3MoYXZnX25vX3JuZCwsIDE2KTsKKworICAgIGlmIChBUkNIX0FBUkNINjQpCisgICAgICAgIGZmX2hwZWxkc3BfaW5pdF9hYXJjaDY0KGMsIGZsYWdzKTsKKyAgICBpZiAoQVJDSF9BTFBIQSkKKyAgICAgICAgZmZfaHBlbGRzcF9pbml0X2FscGhhKGMsIGZsYWdzKTsKKyAgICBpZiAoQVJDSF9BUk0pCisgICAgICAgIGZmX2hwZWxkc3BfaW5pdF9hcm0oYywgZmxhZ3MpOworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfaHBlbGRzcF9pbml0X3BwYyhjLCBmbGFncyk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9ocGVsZHNwX2luaXRfeDg2KGMsIGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2hwZWxkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2hwZWxkc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2MyOTNhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaHBlbGRzcC5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogSGFsZi1wZWwgRFNQIGZ1bmN0aW9ucy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEhhbGYtcGVsIERTUCBmdW5jdGlvbnMuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0hQRUxEU1BfSAorI2RlZmluZSBBVkNPREVDX0hQRUxEU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIGFkZCBhbmQgcHV0IHBpeGVsIChkZWNvZGluZykgKi8KKy8vIGJsb2Nrc2l6ZXMgZm9yIGhwZWxfcGl4ZWxzX2Z1bmMgYXJlIDh4NCw4eDggMTZ4OCAxNngxNgorLy8gaCBmb3IgaHBlbF9waXhlbHNfZnVuYyBpcyBsaW1pdGVkIHRvIHt3aWR0aC8yLCB3aWR0aH0gYnV0IG5ldmVyIGxhcmdlcgorLy8gdGhhbiAxNiBhbmQgbmV2ZXIgc21hbGxlciB0aGFuIDQKK3R5cGVkZWYgdm9pZCAoKm9wX3BpeGVsc19mdW5jKSh1aW50OF90ICpibG9jayAvKmFsaWduIHdpZHRoICg4IG9yIDE2KSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscyAvKmFsaWduIDEqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CisKKy8qKgorICogSGFsZi1wZWwgRFNQIGNvbnRleHQuCisgKi8KK3R5cGVkZWYgc3RydWN0IEhwZWxEU1BDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBIYWxmcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gd2l0aCByb3VuZGluZyAoYStiKzEpPj4xLgorICAgICAqIHRoaXMgaXMgYW4gYXJyYXlbNF1bNF0gb2YgbW90aW9uIGNvbXBlbnNhdGlvbiBmdW5jdGlvbnMgZm9yIDQKKyAgICAgKiBob3Jpem9udGFsIGJsb2Nrc2l6ZXMgKDgsMTYpIGFuZCB0aGUgNCBoYWxmcGVsIHBvc2l0aW9uczxicj4KKyAgICAgKiAqcGl4ZWxzX3RhYlsgMC0+MTZ4SCAxLT44eEggXVsgeGhhbGZwZWwgKyAyKnloYWxmcGVsIF0KKyAgICAgKiBAcGFyYW0gYmxvY2sgZGVzdGluYXRpb24gd2hlcmUgdGhlIHJlc3VsdCBpcyBzdG9yZWQKKyAgICAgKiBAcGFyYW0gcGl4ZWxzIHNvdXJjZQorICAgICAqIEBwYXJhbSBsaW5lX3NpemUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgaG9yaXpvbnRhbCBsaW5lIG9mIGJsb2NrCisgICAgICogQHBhcmFtIGggaGVpZ2h0CisgICAgICovCisgICAgb3BfcGl4ZWxzX2Z1bmMgcHV0X3BpeGVsc190YWJbNF1bNF07CisKKyAgICAvKioKKyAgICAgKiBIYWxmcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gd2l0aCByb3VuZGluZyAoYStiKzEpPj4xLgorICAgICAqIFRoaXMgaXMgYW4gYXJyYXlbNF1bNF0gb2YgbW90aW9uIGNvbXBlbnNhdGlvbiBmdW5jdGlvbnMgZm9yIDQKKyAgICAgKiBob3Jpem9udGFsIGJsb2Nrc2l6ZXMgKDgsMTYpIGFuZCB0aGUgNCBoYWxmcGVsIHBvc2l0aW9uczxicj4KKyAgICAgKiAqcGl4ZWxzX3RhYlsgMC0+MTZ4SCAxLT44eEggXVsgeGhhbGZwZWwgKyAyKnloYWxmcGVsIF0KKyAgICAgKiBAcGFyYW0gYmxvY2sgZGVzdGluYXRpb24gaW50byB3aGljaCB0aGUgcmVzdWx0IGlzIGF2ZXJhZ2VkIChhK2IrMSk+PjEKKyAgICAgKiBAcGFyYW0gcGl4ZWxzIHNvdXJjZQorICAgICAqIEBwYXJhbSBsaW5lX3NpemUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgaG9yaXpvbnRhbCBsaW5lIG9mIGJsb2NrCisgICAgICogQHBhcmFtIGggaGVpZ2h0CisgICAgICovCisgICAgb3BfcGl4ZWxzX2Z1bmMgYXZnX3BpeGVsc190YWJbNF1bNF07CisKKyAgICAvKioKKyAgICAgKiBIYWxmcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gd2l0aCBubyByb3VuZGluZyAoYStiKT4+MS4KKyAgICAgKiB0aGlzIGlzIGFuIGFycmF5WzRdWzRdIG9mIG1vdGlvbiBjb21wZW5zYXRpb24gZnVuY3Rpb25zIGZvciAyCisgICAgICogaG9yaXpvbnRhbCBibG9ja3NpemVzICg4LDE2KSBhbmQgdGhlIDQgaGFsZnBlbCBwb3NpdGlvbnM8YnI+CisgICAgICogKnBpeGVsc190YWJbIDAtPjE2eEggMS0+OHhIIF1bIHhoYWxmcGVsICsgMip5aGFsZnBlbCBdCisgICAgICogQHBhcmFtIGJsb2NrIGRlc3RpbmF0aW9uIHdoZXJlIHRoZSByZXN1bHQgaXMgc3RvcmVkCisgICAgICogQHBhcmFtIHBpeGVscyBzb3VyY2UKKyAgICAgKiBAcGFyYW0gbGluZV9zaXplIG51bWJlciBvZiBieXRlcyBpbiBhIGhvcml6b250YWwgbGluZSBvZiBibG9jaworICAgICAqIEBwYXJhbSBoIGhlaWdodAorICAgICAqLworICAgIG9wX3BpeGVsc19mdW5jIHB1dF9ub19ybmRfcGl4ZWxzX3RhYls0XVs0XTsKKworICAgIC8qKgorICAgICAqIEhhbGZwZWwgbW90aW9uIGNvbXBlbnNhdGlvbiB3aXRoIG5vIHJvdW5kaW5nIChhK2IpPj4xLgorICAgICAqIHRoaXMgaXMgYW4gYXJyYXlbNF0gb2YgbW90aW9uIGNvbXBlbnNhdGlvbiBmdW5jdGlvbnMgZm9yIDEKKyAgICAgKiBob3Jpem9udGFsIGJsb2Nrc2l6ZSAoMTYpIGFuZCB0aGUgNCBoYWxmcGVsIHBvc2l0aW9uczxicj4KKyAgICAgKiAqcGl4ZWxzX3RhYlswXVsgeGhhbGZwZWwgKyAyKnloYWxmcGVsIF0KKyAgICAgKiBAcGFyYW0gYmxvY2sgZGVzdGluYXRpb24gaW50byB3aGljaCB0aGUgcmVzdWx0IGlzIGF2ZXJhZ2VkIChhK2IpPj4xCisgICAgICogQHBhcmFtIHBpeGVscyBzb3VyY2UKKyAgICAgKiBAcGFyYW0gbGluZV9zaXplIG51bWJlciBvZiBieXRlcyBpbiBhIGhvcml6b250YWwgbGluZSBvZiBibG9jaworICAgICAqIEBwYXJhbSBoIGhlaWdodAorICAgICAqLworICAgIG9wX3BpeGVsc19mdW5jIGF2Z19ub19ybmRfcGl4ZWxzX3RhYls0XTsKK30gSHBlbERTUENvbnRleHQ7CisKK3ZvaWQgZmZfaHBlbGRzcF9pbml0KEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MpOworCit2b2lkIGZmX2hwZWxkc3BfaW5pdF9hYXJjaDY0KEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MpOwordm9pZCBmZl9ocGVsZHNwX2luaXRfYWxwaGEoSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncyk7Cit2b2lkIGZmX2hwZWxkc3BfaW5pdF9hcm0oSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncyk7Cit2b2lkIGZmX2hwZWxkc3BfaW5pdF9wcGMoSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncyk7Cit2b2lkIGZmX2hwZWxkc3BfaW5pdF94ODYoSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0hQRUxEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaHVmZm1hbi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaHVmZm1hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjZlZWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9odWZmbWFuLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICogQ29weXJpZ2h0IChjKSAyMDA3IExvcmVuIE1lcnJpdHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaHVmZm1hbiB0cmVlIGJ1aWxkZXIgYW5kIFZMQyBnZW5lcmF0b3IKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJodWZmbWFuLmgiCisKKy8qIHN5bWJvbCBmb3IgSHVmZm1hbiB0cmVlIG5vZGUgKi8KKyNkZWZpbmUgSE5PREUgLTEKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90IHZhbDsKKyAgICBpbnQgbmFtZTsKK30gSGVhcEVsZW07CisKK3N0YXRpYyB2b2lkIGhlYXBfc2lmdChIZWFwRWxlbSAqaCwgaW50IHJvb3QsIGludCBzaXplKQoreworICAgIHdoaWxlIChyb290ICogMiArIDEgPCBzaXplKSB7CisgICAgICAgIGludCBjaGlsZCA9IHJvb3QgKiAyICsgMTsKKyAgICAgICAgaWYgKGNoaWxkIDwgc2l6ZSAtIDEgJiYgaFtjaGlsZF0udmFsID4gaFtjaGlsZCsxXS52YWwpCisgICAgICAgICAgICBjaGlsZCsrOworICAgICAgICBpZiAoaFtyb290XS52YWwgPiBoW2NoaWxkXS52YWwpIHsKKyAgICAgICAgICAgIEZGU1dBUChIZWFwRWxlbSwgaFtyb290XSwgaFtjaGlsZF0pOworICAgICAgICAgICAgcm9vdCA9IGNoaWxkOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworaW50IGZmX2h1ZmZfZ2VuX2xlbl90YWJsZSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ2NF90ICpzdGF0cywgaW50IHN0YXRzX3NpemUsIGludCBza2lwMCkKK3sKKyAgICBIZWFwRWxlbSAqaCAgPSBhdl9tYWxsb2NfYXJyYXkoc2l6ZW9mKCpoKSwgc3RhdHNfc2l6ZSk7CisgICAgaW50ICp1cCAgICAgID0gYXZfbWFsbG9jX2FycmF5KHNpemVvZigqdXApICogMiwgc3RhdHNfc2l6ZSk7CisgICAgdWludDhfdCAqbGVuID0gYXZfbWFsbG9jX2FycmF5KHNpemVvZigqbGVuKSAqIDIsIHN0YXRzX3NpemUpOworICAgIHVpbnQxNl90ICptYXA9IGF2X21hbGxvY19hcnJheShzaXplb2YoKm1hcCksIHN0YXRzX3NpemUpOworICAgIGludCBvZmZzZXQsIGksIG5leHQ7CisgICAgaW50IHNpemUgPSAwOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKCFoIHx8ICF1cCB8fCAhbGVuKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaTxzdGF0c19zaXplOyBpKyspIHsKKyAgICAgICAgZHN0W2ldID0gMjU1OworICAgICAgICBpZiAoc3RhdHNbaV0gfHwgIXNraXAwKQorICAgICAgICAgICAgbWFwW3NpemUrK10gPSBpOworICAgIH0KKworICAgIGZvciAob2Zmc2V0ID0gMTsgOyBvZmZzZXQgPDw9IDEpIHsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGhbaV0ubmFtZSA9IGk7CisgICAgICAgICAgICBoW2ldLnZhbCA9IChzdGF0c1ttYXBbaV1dIDw8IDE0KSArIG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSBzaXplIC8gMiAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgaGVhcF9zaWZ0KGgsIGksIHNpemUpOworCisgICAgICAgIGZvciAobmV4dCA9IHNpemU7IG5leHQgPCBzaXplICogMiAtIDE7IG5leHQrKykgeworICAgICAgICAgICAgLy8gbWVyZ2UgdGhlIHR3byBzbWFsbGVzdCBlbnRyaWVzLCBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlIGhlYXAKKyAgICAgICAgICAgIHVpbnQ2NF90IG1pbjF2ID0gaFswXS52YWw7CisgICAgICAgICAgICB1cFtoWzBdLm5hbWVdID0gbmV4dDsKKyAgICAgICAgICAgIGhbMF0udmFsID0gSU5UNjRfTUFYOworICAgICAgICAgICAgaGVhcF9zaWZ0KGgsIDAsIHNpemUpOworICAgICAgICAgICAgdXBbaFswXS5uYW1lXSA9IG5leHQ7CisgICAgICAgICAgICBoWzBdLm5hbWUgPSBuZXh0OworICAgICAgICAgICAgaFswXS52YWwgKz0gbWluMXY7CisgICAgICAgICAgICBoZWFwX3NpZnQoaCwgMCwgc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBsZW5bMiAqIHNpemUgLSAyXSA9IDA7CisgICAgICAgIGZvciAoaSA9IDIgKiBzaXplIC0gMzsgaSA+PSBzaXplOyBpLS0pCisgICAgICAgICAgICBsZW5baV0gPSBsZW5bdXBbaV1dICsgMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgZHN0W21hcFtpXV0gPSBsZW5bdXBbaV1dICsgMTsKKyAgICAgICAgICAgIGlmIChkc3RbbWFwW2ldXSA+PSAzMikgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGk9PXNpemUpIGJyZWFrOworICAgIH0KK2VuZDoKKyAgICBhdl9mcmVlKGgpOworICAgIGF2X2ZyZWUodXApOworICAgIGF2X2ZyZWUobGVuKTsKKyAgICBhdl9mcmVlKG1hcCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2V0X3RyZWVfY29kZXModWludDMyX3QgKmJpdHMsIGludDE2X3QgKmxlbnMsIHVpbnQ4X3QgKnhsYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlICpub2RlcywgaW50IG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwZngsIGludCBwbCwgaW50ICpwb3MsIGludCBub196ZXJvX2NvdW50KQoreworICAgIGludCBzOworCisgICAgcyA9IG5vZGVzW25vZGVdLnN5bTsKKyAgICBpZiAocyAhPSBITk9ERSB8fCAobm9femVyb19jb3VudCAmJiAhbm9kZXNbbm9kZV0uY291bnQpKSB7CisgICAgICAgIGJpdHNbKnBvc10gPSBwZng7CisgICAgICAgIGxlbnNbKnBvc10gPSBwbDsKKyAgICAgICAgeGxhdFsqcG9zXSA9IHM7CisgICAgICAgICgqcG9zKSsrOworICAgIH0gZWxzZSB7CisgICAgICAgIHBmeCA8PD0gMTsKKyAgICAgICAgcGwrKzsKKyAgICAgICAgZ2V0X3RyZWVfY29kZXMoYml0cywgbGVucywgeGxhdCwgbm9kZXMsIG5vZGVzW25vZGVdLm4wLCBwZngsIHBsLAorICAgICAgICAgICAgICAgICAgICAgICBwb3MsIG5vX3plcm9fY291bnQpOworICAgICAgICBwZnggfD0gMTsKKyAgICAgICAgZ2V0X3RyZWVfY29kZXMoYml0cywgbGVucywgeGxhdCwgbm9kZXMsIG5vZGVzW25vZGVdLm4wICsgMSwgcGZ4LCBwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgcG9zLCBub196ZXJvX2NvdW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgYnVpbGRfaHVmZl90cmVlKFZMQyAqdmxjLCBOb2RlICpub2RlcywgaW50IGhlYWQsIGludCBmbGFncywgaW50IG5iX2JpdHMpCit7CisgICAgaW50IG5vX3plcm9fY291bnQgPSAhKGZsYWdzICYgRkZfSFVGRk1BTl9GTEFHX1pFUk9fQ09VTlQpOworICAgIHVpbnQzMl90IGJpdHNbMjU2XTsKKyAgICBpbnQxNl90IGxlbnNbMjU2XTsKKyAgICB1aW50OF90IHhsYXRbMjU2XTsKKyAgICBpbnQgcG9zID0gMDsKKworICAgIGdldF90cmVlX2NvZGVzKGJpdHMsIGxlbnMsIHhsYXQsIG5vZGVzLCBoZWFkLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICZwb3MsIG5vX3plcm9fY291bnQpOworICAgIHJldHVybiBmZl9pbml0X3ZsY19zcGFyc2UodmxjLCBuYl9iaXRzLCBwb3MsIGxlbnMsIDIsIDIsIGJpdHMsIDQsIDQsIHhsYXQsIDEsIDEsIDApOworfQorCisKKy8qKgorICogbm9kZXMgc2l6ZSBtdXN0IGJlIDIqbmJfY29kZXMKKyAqIGZpcnN0IG5iX2NvZGVzIG5vZGVzLmNvdW50IG11c3QgYmUgc2V0CisgKi8KK2ludCBmZl9odWZmX2J1aWxkX3RyZWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWTEMgKnZsYywgaW50IG5iX2NvZGVzLCBpbnQgbmJfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAqbm9kZXMsIEh1ZmZDbXAgY21wLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IGN1cl9ub2RlOworICAgIGludDY0X3Qgc3VtID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb2RlczsgaSsrKSB7CisgICAgICAgIG5vZGVzW2ldLnN5bSA9IGk7CisgICAgICAgIG5vZGVzW2ldLm4wID0gLTI7CisgICAgICAgIHN1bSArPSBub2Rlc1tpXS5jb3VudDsKKyAgICB9CisKKyAgICBpZiAoc3VtID4+IDMxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRvbyBoaWdoIHN5bWJvbCBmcmVxdWVuY2llcy4gIgorICAgICAgICAgICAgICAgIlRyZWUgY29uc3RydWN0aW9uIGlzIG5vdCBwb3NzaWJsZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcXNvcnQobm9kZXMsIG5iX2NvZGVzLCBzaXplb2YoTm9kZSksIGNtcCk7CisgICAgY3VyX25vZGUgPSBuYl9jb2RlczsKKyAgICBub2Rlc1tuYl9jb2RlcyoyLTFdLmNvdW50ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfY29kZXMgKiAyIC0gMTsgaSArPSAyKSB7CisgICAgICAgIHVpbnQzMl90IGN1cl9jb3VudCA9IG5vZGVzW2ldLmNvdW50ICsgbm9kZXNbaSsxXS5jb3VudDsKKyAgICAgICAgLy8gZmluZCBjb3JyZWN0IHBsYWNlIHRvIGluc2VydCBuZXcgbm9kZSwgYW5kCisgICAgICAgIC8vIG1ha2Ugc3BhY2UgZm9yIHRoZSBuZXcgbm9kZSB3aGlsZSBhdCBpdAorICAgICAgICBmb3IoaiA9IGN1cl9ub2RlOyBqID4gaSArIDI7IGotLSl7CisgICAgICAgICAgICBpZihjdXJfY291bnQgPiBub2Rlc1tqLTFdLmNvdW50IHx8CisgICAgICAgICAgICAgICAoY3VyX2NvdW50ID09IG5vZGVzW2otMV0uY291bnQgJiYKKyAgICAgICAgICAgICAgICAhKGZsYWdzICYgRkZfSFVGRk1BTl9GTEFHX0hOT0RFX0ZJUlNUKSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBub2Rlc1tqXSA9IG5vZGVzW2ogLSAxXTsKKyAgICAgICAgfQorICAgICAgICBub2Rlc1tqXS5zeW0gPSBITk9ERTsKKyAgICAgICAgbm9kZXNbal0uY291bnQgPSBjdXJfY291bnQ7CisgICAgICAgIG5vZGVzW2pdLm4wID0gaTsKKyAgICAgICAgY3VyX25vZGUrKzsKKyAgICB9CisgICAgaWYgKGJ1aWxkX2h1ZmZfdHJlZSh2bGMsIG5vZGVzLCBuYl9jb2RlcyAqIDIgLSAyLCBmbGFncywgbmJfYml0cykgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYnVpbGRpbmcgdHJlZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9odWZmbWFuLmggYi9mZm1wZWcvbGliYXZjb2RlYy9odWZmbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiMjNhZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2h1ZmZtYW4uaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGh1ZmZtYW4gdHJlZSBidWlsZGVyIGFuZCBWTEMgZ2VuZXJhdG9yCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0hVRkZNQU5fSAorI2RlZmluZSBBVkNPREVDX0hVRkZNQU5fSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisKK3R5cGVkZWYgc3RydWN0IE5vZGUgeworICAgIGludDE2X3QgIHN5bTsKKyAgICBpbnQxNl90ICBuMDsKKyAgICB1aW50MzJfdCBjb3VudDsKK30gTm9kZTsKKworI2RlZmluZSBGRl9IVUZGTUFOX0ZMQUdfSE5PREVfRklSU1QgMHgwMQorI2RlZmluZSBGRl9IVUZGTUFOX0ZMQUdfWkVST19DT1VOVCAgMHgwMgorI2RlZmluZSBGRl9IVUZGTUFOX0JJVFMgMTAKKwordHlwZWRlZiBpbnQgKCpIdWZmQ21wKShjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpOworaW50IGZmX2h1ZmZfYnVpbGRfdHJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFZMQyAqdmxjLCBpbnQgbmJfY29kZXMsIGludCBuYl9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICBOb2RlICpub2RlcywgSHVmZkNtcCBjbXAsIGludCBmbGFncyk7CisKK2ludCBmZl9odWZmX2dlbl9sZW5fdGFibGUodWludDhfdCAqZHN0LCBjb25zdCB1aW50NjRfdCAqc3RhdHMsIGludCBuLCBpbnQgc2tpcDApOworCisjZW5kaWYgLyogQVZDT0RFQ19IVUZGTUFOX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2h1ZmZ5dXYuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2h1ZmZ5dXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTIxNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaHVmZnl1di5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBodWZmeXV2IGNvZGVjIGZvciBsaWJhdmNvZGVjCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBzZWUgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvaHVmZnl1di50eHQgZm9yIGEgZGVzY3JpcHRpb24gb2YKKyAqIHRoZSBhbGdvcml0aG0gdXNlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBodWZmeXV2IGNvZGVjIGZvciBsaWJhdmNvZGVjLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJic3dhcGRzcC5oIgorI2luY2x1ZGUgImh1ZmZ5dXYuaCIKKworaW50IGZmX2h1ZmZ5dXZfZ2VuZXJhdGVfYml0c190YWJsZSh1aW50MzJfdCAqZHN0LCBjb25zdCB1aW50OF90ICpsZW5fdGFibGUsIGludCBuKQoreworICAgIGludCBsZW4sIGluZGV4OworICAgIHVpbnQzMl90IGJpdHMgPSAwOworCisgICAgZm9yIChsZW4gPSAzMjsgbGVuID4gMDsgbGVuLS0pIHsKKyAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbjsgaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKGxlbl90YWJsZVtpbmRleF0gPT0gbGVuKQorICAgICAgICAgICAgICAgIGRzdFtpbmRleF0gPSBiaXRzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpdHMgJiAxKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZ2VuZXJhdGluZyBodWZmbWFuIHRhYmxlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBiaXRzID4+PSAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworYXZfY29sZCBpbnQgZmZfaHVmZnl1dl9hbGxvY190ZW1wKEhZdXZDb250ZXh0ICpzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7CisgICAgICAgIHMtPnRlbXBbaV09IGF2X21hbGxvYyg0KnMtPndpZHRoICsgMTYpOworICAgICAgICBpZiAoIXMtPnRlbXBbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBzLT50ZW1wMTZbaV0gPSAodWludDE2X3QqKXMtPnRlbXBbaV07CisgICAgfQorICAgIHJldHVybiAwOworfQorCithdl9jb2xkIHZvaWQgZmZfaHVmZnl1dl9jb21tb25faW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSFl1dkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBzLT5mbGFncyA9IGF2Y3R4LT5mbGFnczsKKworICAgIGZmX2Jzd2FwZHNwX2luaXQoJnMtPmJkc3ApOworICAgIGZmX2xsdmlkZHNwX2luaXQoJnMtPmxsdmlkZHNwLCBhdmN0eCk7CisKKyAgICBzLT53aWR0aCA9IGF2Y3R4LT53aWR0aDsKKyAgICBzLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgYXZfYXNzZXJ0MShzLT53aWR0aCA+IDAgJiYgcy0+aGVpZ2h0ID4gMCk7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9odWZmeXV2X2NvbW1vbl9lbmQoSFl1dkNvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnRlbXBbaV0pOworICAgICAgICBzLT50ZW1wMTZbaV0gPSBOVUxMOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2h1ZmZ5dXYuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2h1ZmZ5dXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTgyNDdlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaHVmZnl1di5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBzZWUgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvaHVmZnl1di50eHQgZm9yIGEgZGVzY3JpcHRpb24gb2YKKyAqIHRoZSBhbGdvcml0aG0gdXNlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBodWZmeXV2IGNvZGVjIGZvciBsaWJhdmNvZGVjLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19IVUZGWVVWX0gKKyNkZWZpbmUgQVZDT0RFQ19IVUZGWVVWX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJodWZmeXV2ZHNwLmgiCisjaW5jbHVkZSAiaHVmZnl1dmVuY2RzcC5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAibG9zc2xlc3NfdmlkZW9kc3AuaCIKKworI2RlZmluZSBWTENfQklUUyAxMgorCisjZGVmaW5lIE1BWF9CSVRTIDE2CisjZGVmaW5lIE1BWF9OICgxPDxNQVhfQklUUykKKyNkZWZpbmUgTUFYX1ZMQ19OIDE2Mzg0CisKK3R5cGVkZWYgZW51bSBQcmVkaWN0b3IgeworICAgIExFRlQgPSAwLAorICAgIFBMQU5FLAorICAgIE1FRElBTiwKK30gUHJlZGljdG9yOworCit0eXBlZGVmIHN0cnVjdCBIWXV2Q29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIFByZWRpY3RvciBwcmVkaWN0b3I7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIGludCBpbnRlcmxhY2VkOworICAgIGludCBkZWNvcnJlbGF0ZTsKKyAgICBpbnQgYml0c3RyZWFtX2JwcDsKKyAgICBpbnQgdmVyc2lvbjsKKyAgICBpbnQgeXV5MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2UgeXV5MiBpbnN0ZWFkIG9mIDQyMlAKKyAgICBpbnQgYmdyMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2UgYmdyMzIgaW5zdGVhZCBvZiBiZ3IyNAorICAgIGludCBicHM7CisgICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE8PGJwcworICAgIGludCB2bGNfbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgdmxjIGNvZGVzIChGRk1JTigxPDxicHMsIE1BWF9WTENfTikpCisgICAgaW50IGFscGhhOworICAgIGludCBjaHJvbWE7CisgICAgaW50IHl1djsKKyAgICBpbnQgY2hyb21hX2hfc2hpZnQ7CisgICAgaW50IGNocm9tYV92X3NoaWZ0OworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBmbGFnczsKKyAgICBpbnQgY29udGV4dDsKKyAgICBpbnQgcGljdHVyZV9udW1iZXI7CisgICAgaW50IGxhc3Rfc2xpY2VfZW5kOworICAgIHVpbnQ4X3QgKnRlbXBbM107CisgICAgdWludDE2X3QgKnRlbXAxNlszXTsgICAgICAgICAgICAgICAgICAgIC8vLzwgaWRlbnRpY2FsIHRvIHRlbXAgYnV0IDE2Yml0IHR5cGUKKyAgICB1aW50NjRfdCBzdGF0c1s0XVtNQVhfVkxDX05dOworICAgIHVpbnQ4X3QgbGVuWzRdW01BWF9WTENfTl07CisgICAgdWludDMyX3QgYml0c1s0XVtNQVhfVkxDX05dOworICAgIHVpbnQzMl90IHBpeF9iZ3JfbWFwWzE8PFZMQ19CSVRTXTsKKyAgICBWTEMgdmxjWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ZLFUsVixBLFlZLFlVLFlWLEFBCisgICAgdWludDhfdCAqYml0c3RyZWFtX2J1ZmZlcjsKKyAgICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX2J1ZmZlcl9zaXplOworICAgIEJzd2FwRFNQQ29udGV4dCBiZHNwOworICAgIEh1ZmZZVVZEU1BDb250ZXh0IGhkc3A7CisgICAgSHVmZllVVkVuY0RTUENvbnRleHQgaGVuY2RzcDsKKyAgICBMTFZpZERTUENvbnRleHQgbGx2aWRkc3A7CisgICAgaW50IG5vbl9kZXRlcm07IC8vIG5vbi1kZXRlcm1pbmlzdGljLCBtdWx0aS10aHJlYWRlZCBlbmNvZGVyIGFsbG93ZWQKK30gSFl1dkNvbnRleHQ7CisKK3ZvaWQgZmZfaHVmZnl1dl9jb21tb25faW5pdChBVkNvZGVjQ29udGV4dCAqcyk7Cit2b2lkIGZmX2h1ZmZ5dXZfY29tbW9uX2VuZChIWXV2Q29udGV4dCAqcyk7CitpbnQgIGZmX2h1ZmZ5dXZfYWxsb2NfdGVtcChIWXV2Q29udGV4dCAqcyk7CitpbnQgZmZfaHVmZnl1dl9nZW5lcmF0ZV9iaXRzX3RhYmxlKHVpbnQzMl90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKmxlbl90YWJsZSwgaW50IG4pOworCisjZW5kaWYgLyogQVZDT0RFQ19IVUZGWVVWX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2h1ZmZ5dXZkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2h1ZmZ5dXZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGM2MTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaHVmZnl1dmRlYy5jCkBAIC0wLDAgKzEsMTI2MCBAQAorLyoKKyAqIGh1ZmZ5dXYgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogc2VlIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzL2h1ZmZ5dXYudHh0IGZvciBhIGRlc2NyaXB0aW9uIG9mCisgKiB0aGUgYWxnb3JpdGhtIHVzZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKgorICogeXV2YSwgZ3JheSwgNDo0OjQsIDQ6MToxLCA0OjE6MCBhbmQgPjggYml0IHBlciBzYW1wbGUgc3VwcG9ydCBzcG9uc29yZWQgYnkgTk9BCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaHVmZnl1diBkZWNvZGVyCisgKi8KKworI2RlZmluZSBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUiAxCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJodWZmeXV2LmgiCisjaW5jbHVkZSAiaHVmZnl1dmRzcC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNkZWZpbmUgY2xhc3NpY19zaGlmdF9sdW1hX3RhYmxlX3NpemUgNDIKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNsYXNzaWNfc2hpZnRfbHVtYVtjbGFzc2ljX3NoaWZ0X2x1bWFfdGFibGVfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkVdID0geworICAgIDM0LCAzNiwgMzUsIDY5LCAxMzUsIDIzMiwgICA5LCAxNiwgMTAsIDI0LCAgMTEsICAyMywgIDEyLCAgMTYsIDEzLCAxMCwKKyAgICAxNCwgIDgsIDE1LCAgOCwgIDE2LCAgIDgsICAxNywgMjAsIDE2LCAxMCwgMjA3LCAyMDYsIDIwNSwgMjM2LCAxMSwgIDgsCisgICAgMTAsIDIxLCAgOSwgMjMsICAgOCwgICA4LCAxOTksIDcwLCA2OSwgNjgsICAgMCwKKyAgMCwwLDAsMCwwLDAsMCwwLAorfTsKKworI2RlZmluZSBjbGFzc2ljX3NoaWZ0X2Nocm9tYV90YWJsZV9zaXplIDU5CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjbGFzc2ljX3NoaWZ0X2Nocm9tYVtjbGFzc2ljX3NoaWZ0X2Nocm9tYV90YWJsZV9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV0gPSB7CisgICAgNjYsIDM2LCAgMzcsICAzOCwgMzksIDQwLCAgNDEsICA3NSwgIDc2LCAgNzcsIDExMCwgMjM5LCAxNDQsIDgxLCA4MiwgIDgzLAorICAgIDg0LCA4NSwgMTE4LCAxODMsIDU2LCA1NywgIDg4LCAgODksICA1NiwgIDg5LCAxNTQsICA1NywgIDU4LCA1NywgMjYsIDE0MSwKKyAgICA1NywgNTYsICA1OCwgIDU3LCA1OCwgNTcsIDE4NCwgMTE5LCAyMTQsIDI0NSwgMTE2LCAgODMsICA4MiwgNDksIDgwLCAgNzksCisgICAgNzgsIDc3LCAgNDQsICA3NSwgNDEsIDQwLCAgMzksICAzOCwgIDM3LCAgMzYsICAzNCwgIDAsCisgIDAsMCwwLDAsMCwwLDAsMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNsYXNzaWNfYWRkX2x1bWFbMjU2XSA9IHsKKyAgICAgMywgIDksICA1LCAxMiwgMTAsIDM1LCAzMiwgMjksIDI3LCA1MCwgNDgsIDQ1LCA0NCwgNDEsIDM5LCAzNywKKyAgICA3MywgNzAsIDY4LCA2NSwgNjQsIDYxLCA1OCwgNTYsIDUzLCA1MCwgNDksIDQ2LCA0NCwgNDEsIDM4LCAzNiwKKyAgICA2OCwgNjUsIDYzLCA2MSwgNTgsIDU1LCA1MywgNTEsIDQ4LCA0NiwgNDUsIDQzLCA0MSwgMzksIDM4LCAzNiwKKyAgICAzNSwgMzMsIDMyLCAzMCwgMjksIDI3LCAyNiwgMjUsIDQ4LCA0NywgNDYsIDQ0LCA0MywgNDEsIDQwLCAzOSwKKyAgICAzNywgMzYsIDM1LCAzNCwgMzIsIDMxLCAzMCwgMjgsIDI3LCAyNiwgMjQsIDIzLCAyMiwgMjAsIDE5LCAzNywKKyAgICAzNSwgMzQsIDMzLCAzMSwgMzAsIDI5LCAyNywgMjYsIDI0LCAyMywgMjEsIDIwLCAxOCwgMTcsIDE1LCAyOSwKKyAgICAyNywgMjYsIDI0LCAyMiwgMjEsIDE5LCAxNywgMTYsIDE0LCAyNiwgMjUsIDIzLCAyMSwgMTksIDE4LCAxNiwKKyAgICAxNSwgMjcsIDI1LCAyMywgMjEsIDE5LCAxNywgMTYsIDE0LCAyNiwgMjUsIDIzLCAyMSwgMTgsIDE3LCAxNCwKKyAgICAxMiwgMTcsIDE5LCAxMywgIDQsICA5LCAgMiwgMTEsICAxLCAgNywgIDgsICAwLCAxNiwgIDMsIDE0LCAgNiwKKyAgICAxMiwgMTAsICA1LCAxNSwgMTgsIDExLCAxMCwgMTMsIDE1LCAxNiwgMTksIDIwLCAyMiwgMjQsIDI3LCAxNSwKKyAgICAxOCwgMjAsIDIyLCAyNCwgMjYsIDE0LCAxNywgMjAsIDIyLCAyNCwgMjcsIDE1LCAxOCwgMjAsIDIzLCAyNSwKKyAgICAyOCwgMTYsIDE5LCAyMiwgMjUsIDI4LCAzMiwgMzYsIDIxLCAyNSwgMjksIDMzLCAzOCwgNDIsIDQ1LCA0OSwKKyAgICAyOCwgMzEsIDM0LCAzNywgNDAsIDQyLCA0NCwgNDcsIDQ5LCA1MCwgNTIsIDU0LCA1NiwgNTcsIDU5LCA2MCwKKyAgICA2MiwgNjQsIDY2LCA2NywgNjksIDM1LCAzNywgMzksIDQwLCA0MiwgNDMsIDQ1LCA0NywgNDgsIDUxLCA1MiwKKyAgICA1NCwgNTUsIDU3LCA1OSwgNjAsIDYyLCA2MywgNjYsIDY3LCA2OSwgNzEsIDcyLCAzOCwgNDAsIDQyLCA0MywKKyAgICA0NiwgNDcsIDQ5LCA1MSwgMjYsIDI4LCAzMCwgMzEsIDMzLCAzNCwgMTgsIDE5LCAxMSwgMTMsICA3LCAgOCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNsYXNzaWNfYWRkX2Nocm9tYVsyNTZdID0geworICAgICAzLCAgICAxLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMywgICAzLCAgIDcsICAgNSwgICA3LCAgIDUsICAgOCwgICA2LCAgMTEsICAgOSwKKyAgICAgNywgICAxMywgIDExLCAgMTAsICAgOSwgICA4LCAgIDcsICAgNSwgICA5LCAgIDcsICAgNiwgICA0LCAgIDcsICAgNSwgICA4LCAgIDcsCisgICAgIDExLCAgIDgsICAxMywgIDExLCAgMTksICAxNSwgIDIyLCAgMjMsICAyMCwgIDMzLCAgMzIsICAyOCwgIDI3LCAgMjksICA1MSwgIDc3LAorICAgICA0MywgIDQ1LCAgNzYsICA4MSwgIDQ2LCAgODIsICA3NSwgIDU1LCAgNTYsIDE0NCwgIDU4LCAgODAsICA2MCwgIDc0LCAxNDcsICA2MywKKyAgICAxNDMsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgICAgIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDI3LCAgMzAsICAyMSwgIDIyLAorICAgICAxNywgIDE0LCAgIDUsICAgNiwgMTAwLCAgNTQsICA0NywgIDUwLCAgNTEsICA1MywgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKyAgICAxMTIsIDExMywgMTE0LCAxMTUsICAgNCwgMTE3LCAxMTgsICA5MiwgIDk0LCAxMjEsIDEyMiwgICAzLCAxMjQsIDEwMywgICAyLCAgIDEsCisgICAgICAwLCAxMjksIDEzMCwgMTMxLCAxMjAsIDExOSwgMTI2LCAxMjUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTM0LAorICAgIDEzNSwgMTMyLCAxMzMsIDEwNCwgIDY0LCAxMDEsICA2MiwgIDU3LCAxMDIsICA5NSwgIDkzLCAgNTksICA2MSwgIDI4LCAgOTcsICA5NiwKKyAgICAgNTIsICA0OSwgIDQ4LCAgMjksICAzMiwgIDI1LCAgMjQsICA0NiwgIDIzLCAgOTgsICA0NSwgIDQ0LCAgNDMsICAyMCwgIDQyLCAgNDEsCisgICAgIDE5LCAgMTgsICA5OSwgIDQwLCAgMTUsICAzOSwgIDM4LCAgMTYsICAxMywgIDEyLCAgMTEsICAzNywgIDEwLCAgIDksICAgOCwgIDM2LAorICAgICAgNywgMTI4LCAxMjcsIDEwNSwgMTIzLCAxMTYsICAzNSwgIDM0LCAgMzMsIDE0NSwgIDMxLCAgNzksICA0MiwgMTQ2LCAgNzgsICAyNiwKKyAgICAgODMsICA0OCwgIDQ5LCAgNTAsICA0NCwgIDQ3LCAgMjYsICAzMSwgIDMwLCAgMTgsICAxNywgIDE5LCAgMjEsICAyNCwgIDI1LCAgMTMsCisgICAgIDE0LCAgMTYsICAxNywgIDE4LCAgMjAsICAyMSwgIDEyLCAgMTQsICAxNSwgICA5LCAgMTAsICAgNiwgICA5LCAgIDYsICAgNSwgICA4LAorICAgICAgNiwgIDEyLCAgIDgsICAxMCwgICA3LCAgIDksICAgNiwgICA0LCAgIDYsICAgMiwgICAyLCAgIDMsICAgMywgICAzLCAgIDMsICAgMiwKK307CisKK3N0YXRpYyBpbnQgcmVhZF9sZW5fdGFibGUodWludDhfdCAqZHN0LCBHZXRCaXRDb250ZXh0ICpnYiwgaW50IG4pCit7CisgICAgaW50IGksIHZhbCwgcmVwZWF0OworCisgICAgZm9yIChpID0gMDsgaSA8IG47KSB7CisgICAgICAgIHJlcGVhdCA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgdmFsICAgID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgICAgICBpZiAocmVwZWF0ID09IDApCisgICAgICAgICAgICByZXBlYXQgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIGlmIChpICsgcmVwZWF0ID4gbiB8fCBnZXRfYml0c19sZWZ0KGdiKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciByZWFkaW5nIGh1ZmZtYW4gdGFibGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHJlcGVhdC0tKQorICAgICAgICAgICAgZHN0W2krK10gPSB2YWw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX2pvaW50X3RhYmxlcyhIWXV2Q29udGV4dCAqcykKK3sKKyAgICBpbnQgcmV0OworICAgIHVpbnQxNl90ICpzeW1ib2xzID0gYXZfbWFsbG9jeig1IDw8IFZMQ19CSVRTKTsKKyAgICB1aW50MTZfdCAqYml0czsKKyAgICB1aW50OF90ICpsZW47CisgICAgaWYgKCFzeW1ib2xzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGJpdHMgPSBzeW1ib2xzICsgKDEgPDwgVkxDX0JJVFMpOworICAgIGxlbiA9ICh1aW50OF90ICopKGJpdHMgKyAoMSA8PCBWTENfQklUUykpOworCisgICAgaWYgKHMtPmJpdHN0cmVhbV9icHAgPCAyNCB8fCBzLT52ZXJzaW9uID4gMikgeworICAgICAgICBpbnQgcCwgaSwgeSwgdTsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IDQ7IHArKykgeworICAgICAgICAgICAgaW50IHAwID0gcy0+dmVyc2lvbiA+IDIgPyBwIDogMDsKKyAgICAgICAgICAgIGZvciAoaSA9IHkgPSAwOyB5IDwgcy0+dmxjX247IHkrKykgeworICAgICAgICAgICAgICAgIGludCBsZW4wICA9IHMtPmxlbltwMF1beV07CisgICAgICAgICAgICAgICAgaW50IGxpbWl0ID0gVkxDX0JJVFMgLSBsZW4wOworICAgICAgICAgICAgICAgIGlmIChsaW1pdCA8PSAwIHx8ICFsZW4wKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoKHNpZ25fZXh0ZW5kKHksIDgpICYgKHMtPnZsY19uLTEpKSAhPSB5KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBmb3IgKHUgPSAwOyB1IDwgcy0+dmxjX247IHUrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgbGVuMSA9IHMtPmxlbltwXVt1XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbjEgPiBsaW1pdCB8fCAhbGVuMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoKHNpZ25fZXh0ZW5kKHUsIDgpICYgKHMtPnZsY19uLTEpKSAhPSB1KQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoaSA8ICgxIDw8IFZMQ19CSVRTKSk7CisgICAgICAgICAgICAgICAgICAgIGxlbltpXSAgICAgPSBsZW4wICsgbGVuMTsKKyAgICAgICAgICAgICAgICAgICAgYml0c1tpXSAgICA9IChzLT5iaXRzW3AwXVt5XSA8PCBsZW4xKSArIHMtPmJpdHNbcF1bdV07CisgICAgICAgICAgICAgICAgICAgIHN5bWJvbHNbaV0gPSAoeSA8PCA4KSArICh1ICYgMHhGRik7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmZfZnJlZV92bGMoJnMtPnZsY1s0ICsgcF0pOworICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9pbml0X3ZsY19zcGFyc2UoJnMtPnZsY1s0ICsgcF0sIFZMQ19CSVRTLCBpLCBsZW4sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzLCAyLCAyLCBzeW1ib2xzLCAyLCAyLCAwKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDhfdCAoKm1hcClbNF0gPSAodWludDhfdCgqKVs0XSkgcy0+cGl4X2Jncl9tYXA7CisgICAgICAgIGludCBpLCBiLCBnLCByLCBjb2RlOworICAgICAgICBpbnQgcDAgPSBzLT5kZWNvcnJlbGF0ZTsKKyAgICAgICAgaW50IHAxID0gIXMtPmRlY29ycmVsYXRlOworICAgICAgICAvKiBSZXN0cmljdCB0aGUgcmFuZ2UgdG8gKy8tMTYgYmVjYXVzZSB0aGF0J3MgcHJldHR5IG11Y2ggZ3VhcmFudGVlZAorICAgICAgICAgKiB0byBjb3ZlciBhbGwgdGhlIGNvbWJpbmF0aW9ucyB0aGF0IGZpdCBpbiAxMSBiaXRzIHRvdGFsLCBhbmQgaXQKKyAgICAgICAgICogIGRvZXMgbm90IG1hdHRlciBpZiB3ZSBtaXNzIGEgZmV3IHJhcmUgY29kZXMuICovCisgICAgICAgIGZvciAoaSA9IDAsIGcgPSAtMTY7IGcgPCAxNjsgZysrKSB7CisgICAgICAgICAgICBpbnQgbGVuMCAgID0gcy0+bGVuW3AwXVtnICYgMjU1XTsKKyAgICAgICAgICAgIGludCBsaW1pdDAgPSBWTENfQklUUyAtIGxlbjA7CisgICAgICAgICAgICBpZiAobGltaXQwIDwgMiB8fCAhbGVuMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAoYiA9IC0xNjsgYiA8IDE2OyBiKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuMSAgID0gcy0+bGVuW3AxXVtiICYgMjU1XTsKKyAgICAgICAgICAgICAgICBpbnQgbGltaXQxID0gbGltaXQwIC0gbGVuMTsKKyAgICAgICAgICAgICAgICBpZiAobGltaXQxIDwgMSB8fCAhbGVuMSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY29kZSA9IChzLT5iaXRzW3AwXVtnICYgMjU1XSA8PCBsZW4xKSArIHMtPmJpdHNbcDFdW2IgJiAyNTVdOworICAgICAgICAgICAgICAgIGZvciAociA9IC0xNjsgciA8IDE2OyByKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbjIgPSBzLT5sZW5bMl1bciAmIDI1NV07CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4yID4gbGltaXQxIHx8ICFsZW4yKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoaSA8ICgxIDw8IFZMQ19CSVRTKSk7CisgICAgICAgICAgICAgICAgICAgIGxlbltpXSAgPSBsZW4wICsgbGVuMSArIGxlbjI7CisgICAgICAgICAgICAgICAgICAgIGJpdHNbaV0gPSAoY29kZSA8PCBsZW4yKSArIHMtPmJpdHNbMl1bciAmIDI1NV07CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5kZWNvcnJlbGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2ldW0ddID0gZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtpXVtCXSA9IGcgKyBiOworICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2ldW1JdID0gZyArIHI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBbaV1bQl0gPSBnOworICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2ldW0ddID0gYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtpXVtSXSA9IHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmZl9mcmVlX3ZsYygmcy0+dmxjWzRdKTsKKyAgICAgICAgaWYgKChyZXQgPSBpbml0X3ZsYygmcy0+dmxjWzRdLCBWTENfQklUUywgaSwgbGVuLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMsIDIsIDIsIDApKSA8IDApCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgcmV0ID0gMDsKK291dDoKKyAgICBhdl9mcmVlcCgmc3ltYm9scyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZWFkX2h1ZmZtYW5fdGFibGVzKEhZdXZDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW5ndGgpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgaSwgcmV0OworICAgIGludCBjb3VudCA9IDM7CisKKyAgICBpZiAoKHJldCA9IGluaXRfZ2V0X2JpdHMoJmdiLCBzcmMsIGxlbmd0aCAqIDgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+dmVyc2lvbiA+IDIpCisgICAgICAgIGNvdW50ID0gMSArIHMtPmFscGhhICsgMipzLT5jaHJvbWE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBpZiAoKHJldCA9IHJlYWRfbGVuX3RhYmxlKHMtPmxlbltpXSwgJmdiLCBzLT52bGNfbikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmICgocmV0ID0gZmZfaHVmZnl1dl9nZW5lcmF0ZV9iaXRzX3RhYmxlKHMtPmJpdHNbaV0sIHMtPmxlbltpXSwgcy0+dmxjX24pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBmZl9mcmVlX3ZsYygmcy0+dmxjW2ldKTsKKyAgICAgICAgaWYgKChyZXQgPSBpbml0X3ZsYygmcy0+dmxjW2ldLCBWTENfQklUUywgcy0+dmxjX24sIHMtPmxlbltpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJpdHNbaV0sIDQsIDQsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICgocmV0ID0gZ2VuZXJhdGVfam9pbnRfdGFibGVzKHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gKGdldF9iaXRzX2NvdW50KCZnYikgKyA3KSAvIDg7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9vbGRfaHVmZm1hbl90YWJsZXMoSFl1dkNvbnRleHQgKnMpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGNsYXNzaWNfc2hpZnRfbHVtYSwKKyAgICAgICAgICAgICAgICAgIGNsYXNzaWNfc2hpZnRfbHVtYV90YWJsZV9zaXplICogOCk7CisgICAgaWYgKChyZXQgPSByZWFkX2xlbl90YWJsZShzLT5sZW5bMF0sICZnYiwgMjU2KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGNsYXNzaWNfc2hpZnRfY2hyb21hLAorICAgICAgICAgICAgICAgICAgY2xhc3NpY19zaGlmdF9jaHJvbWFfdGFibGVfc2l6ZSAqIDgpOworICAgIGlmICgocmV0ID0gcmVhZF9sZW5fdGFibGUocy0+bGVuWzFdLCAmZ2IsIDI1NikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgcy0+Yml0c1swXVtpXSA9IGNsYXNzaWNfYWRkX2x1bWFbaV07CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBzLT5iaXRzWzFdW2ldID0gY2xhc3NpY19hZGRfY2hyb21hW2ldOworCisgICAgaWYgKHMtPmJpdHN0cmVhbV9icHAgPj0gMjQpIHsKKyAgICAgICAgbWVtY3B5KHMtPmJpdHNbMV0sIHMtPmJpdHNbMF0sIDI1NiAqIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICBtZW1jcHkocy0+bGVuWzFdLCBzLT5sZW5bMF0sIDI1NiAqIHNpemVvZih1aW50OF90KSk7CisgICAgfQorICAgIG1lbWNweShzLT5iaXRzWzJdLCBzLT5iaXRzWzFdLCAyNTYgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICBtZW1jcHkocy0+bGVuWzJdLCBzLT5sZW5bMV0sIDI1NiAqIHNpemVvZih1aW50OF90KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZzLT52bGNbaV0pOworICAgICAgICBpZiAoKHJldCA9IGluaXRfdmxjKCZzLT52bGNbaV0sIFZMQ19CSVRTLCAyNTYsIHMtPmxlbltpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5iaXRzW2ldLCA0LCA0LCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGdlbmVyYXRlX2pvaW50X3RhYmxlcyhzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIWXV2Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmZl9odWZmeXV2X2NvbW1vbl9lbmQocyk7CisgICAgYXZfZnJlZXAoJnMtPmJpdHN0cmVhbV9idWZmZXIpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgZmZfZnJlZV92bGMoJnMtPnZsY1tpXSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIWXV2Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGZmX2h1ZmZ5dXZkc3BfaW5pdCgmcy0+aGRzcCk7CisgICAgbWVtc2V0KHMtPnZsYywgMCwgNCAqIHNpemVvZihWTEMpKTsKKworICAgIHMtPmludGVybGFjZWQgPSBhdmN0eC0+aGVpZ2h0ID4gMjg4OworICAgIHMtPmJncjMyICAgICAgPSAxOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICBpZiAoKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgJiA3KSAmJgorICAgICAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAhPSAxMikKKyAgICAgICAgICAgIHMtPnZlcnNpb24gPSAxOyAvLyBkbyBzdWNoIGZpbGVzIGV4aXN0IGF0IGFsbD8KKyAgICAgICAgZWxzZSBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID4gMyAmJiBhdmN0eC0+ZXh0cmFkYXRhWzNdID09IDApCisgICAgICAgICAgICBzLT52ZXJzaW9uID0gMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+dmVyc2lvbiA9IDM7CisgICAgfSBlbHNlCisgICAgICAgIHMtPnZlcnNpb24gPSAwOworCisgICAgcy0+YnBzID0gODsKKyAgICBzLT5uID0gMTw8cy0+YnBzOworICAgIHMtPnZsY19uID0gRkZNSU4ocy0+biwgTUFYX1ZMQ19OKTsKKyAgICBzLT5jaHJvbWEgPSAxOworICAgIGlmIChzLT52ZXJzaW9uID49IDIpIHsKKyAgICAgICAgaW50IG1ldGhvZCwgaW50ZXJsYWNlOworCisgICAgICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCA0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgbWV0aG9kICAgICAgICAgICA9IGF2Y3R4LT5leHRyYWRhdGFbMF07CisgICAgICAgIHMtPmRlY29ycmVsYXRlICAgPSBtZXRob2QgJiA2NCA/IDEgOiAwOworICAgICAgICBzLT5wcmVkaWN0b3IgICAgID0gbWV0aG9kICYgNjM7CisgICAgICAgIGlmIChzLT52ZXJzaW9uID09IDIpIHsKKyAgICAgICAgICAgIHMtPmJpdHN0cmVhbV9icHAgPSBhdmN0eC0+ZXh0cmFkYXRhWzFdOworICAgICAgICAgICAgaWYgKHMtPmJpdHN0cmVhbV9icHAgPT0gMCkKKyAgICAgICAgICAgICAgICBzLT5iaXRzdHJlYW1fYnBwID0gYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAmIH43OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+YnBzID0gKGF2Y3R4LT5leHRyYWRhdGFbMV0gPj4gNCkgKyAxOworICAgICAgICAgICAgcy0+biA9IDE8PHMtPmJwczsKKyAgICAgICAgICAgIHMtPnZsY19uID0gRkZNSU4ocy0+biwgTUFYX1ZMQ19OKTsKKyAgICAgICAgICAgIHMtPmNocm9tYV9oX3NoaWZ0ID0gYXZjdHgtPmV4dHJhZGF0YVsxXSAmIDM7CisgICAgICAgICAgICBzLT5jaHJvbWFfdl9zaGlmdCA9IChhdmN0eC0+ZXh0cmFkYXRhWzFdID4+IDIpICYgMzsKKyAgICAgICAgICAgIHMtPnl1diAgID0gISEoYXZjdHgtPmV4dHJhZGF0YVsyXSAmIDEpOworICAgICAgICAgICAgcy0+Y2hyb21hPSAhIShhdmN0eC0+ZXh0cmFkYXRhWzJdICYgMyk7CisgICAgICAgICAgICBzLT5hbHBoYSA9ICEhKGF2Y3R4LT5leHRyYWRhdGFbMl0gJiA0KTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcmxhY2UgICAgID0gKGF2Y3R4LT5leHRyYWRhdGFbMl0gJiAweDMwKSA+PiA0OworICAgICAgICBzLT5pbnRlcmxhY2VkID0gKGludGVybGFjZSA9PSAxKSA/IDEgOiAoaW50ZXJsYWNlID09IDIpID8gMCA6IHMtPmludGVybGFjZWQ7CisgICAgICAgIHMtPmNvbnRleHQgICAgPSBhdmN0eC0+ZXh0cmFkYXRhWzJdICYgMHg0MCA/IDEgOiAwOworCisgICAgICAgIGlmICgocmV0ID0gcmVhZF9odWZmbWFuX3RhYmxlcyhzLCBhdmN0eC0+ZXh0cmFkYXRhICsgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAtIDQpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAmIDcpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcy0+cHJlZGljdG9yICAgPSBMRUZUOworICAgICAgICAgICAgcy0+ZGVjb3JyZWxhdGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHMtPnByZWRpY3RvciAgID0gTEVGVDsKKyAgICAgICAgICAgIHMtPmRlY29ycmVsYXRlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBzLT5wcmVkaWN0b3IgICA9IFBMQU5FOworICAgICAgICAgICAgcy0+ZGVjb3JyZWxhdGUgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID49IDI0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHMtPnByZWRpY3RvciAgID0gTUVESUFOOworICAgICAgICAgICAgcy0+ZGVjb3JyZWxhdGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzLT5wcmVkaWN0b3IgICA9IExFRlQ7IC8vIE9MRAorICAgICAgICAgICAgcy0+ZGVjb3JyZWxhdGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy0+Yml0c3RyZWFtX2JwcCA9IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgJiB+NzsKKyAgICAgICAgcy0+Y29udGV4dCAgICAgICA9IDA7CisKKyAgICAgICAgaWYgKChyZXQgPSByZWFkX29sZF9odWZmbWFuX3RhYmxlcyhzKSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAocy0+dmVyc2lvbiA8PSAyKSB7CisgICAgICAgIHN3aXRjaCAocy0+Yml0c3RyZWFtX2JwcCkgeworICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgICAgICBzLT55dXYgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICBpZiAocy0+eXV5MikKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVZVjQyMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKKyAgICAgICAgICAgIHMtPnl1diA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgIGlmIChzLT5iZ3IzMikKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfMFJHQjMyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IyNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgYXZfYXNzZXJ0MChzLT5iZ3IzMik7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMzI7CisgICAgICAgICAgICBzLT5hbHBoYSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGF2Y3R4LT5waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y2hyb21hX2hfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jaHJvbWFfdl9zaGlmdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoICggKHMtPmNocm9tYTw8MTApIHwgKHMtPnl1djw8OSkgfCAocy0+YWxwaGE8PDgpIHwgKChzLT5icHMtMSk8PDQpIHwgcy0+Y2hyb21hX2hfc2hpZnQgfCAocy0+Y2hyb21hX3Zfc2hpZnQ8PDIpKSB7CisgICAgICAgIGNhc2UgMHgwNzA6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDBGMDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDE3MDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZOEE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDQ3MDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg0ODA6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDQ5MDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDRCMDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDREMDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDRGMDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDU3MDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJBUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NjcwOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDY4MDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NjkwOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NkIwOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NkQwOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NkYwOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NjcxOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDY4MToKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NjkxOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NkIxOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NkQxOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NkYxOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NjcyOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQxMVA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDY3NDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg2NzU6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4Njg1OgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg2OTU6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDEwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg2QjU6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDEyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg2RDU6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDE0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg2RjU6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg2N0E6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDEwUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NzcwOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0NDRQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg3ODA6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQ0NFA5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg3OTA6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQ0NFAxMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4N0YwOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0NDRQMTY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDc3MToKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDIyUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NzgxOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0MjJQOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NzkxOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0MjJQMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDdGMToKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDIyUDE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg3NzU6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQyMFA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDc4NToKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDIwUDk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDc5NToKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDIwUDEwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg3RjU6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQyMFAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmZl9odWZmeXV2X2NvbW1vbl9pbml0KGF2Y3R4KTsKKworICAgIGlmICgoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQIHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgJiYgYXZjdHgtPndpZHRoICYgMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIndpZHRoIG11c3QgYmUgZXZlbiBmb3IgdGhpcyBjb2xvcnNwYWNlXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKHMtPnByZWRpY3RvciA9PSBNRURJQU4gJiYgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQICYmCisgICAgICAgIGF2Y3R4LT53aWR0aCAlIDQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3aWR0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAiCisgICAgICAgICAgICAgICAiZm9yIHRoaXMgY29tYmluYXRpb24gb2YgY29sb3JzcGFjZSBhbmQgcHJlZGljdG9yIHR5cGUuXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2h1ZmZ5dXZfYWxsb2NfdGVtcChzKSkgPCAwKSB7CisgICAgICAgIGZmX2h1ZmZ5dXZfY29tbW9uX2VuZChzKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyAgZXJyb3I6CisgICAgZGVjb2RlX2VuZChhdmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0X3RocmVhZF9jb3B5KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIWXV2Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIHJldDsKKworICAgIGlmICgocmV0ID0gZmZfaHVmZnl1dl9hbGxvY190ZW1wKHMpKSA8IDApIHsKKyAgICAgICAgZmZfaHVmZnl1dl9jb21tb25fZW5kKHMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHMtPnZsY1tpXS50YWJsZSA9IE5VTEw7CisKKyAgICBpZiAocy0+dmVyc2lvbiA+PSAyKSB7CisgICAgICAgIGlmICgocmV0ID0gcmVhZF9odWZmbWFuX3RhYmxlcyhzLCBhdmN0eC0+ZXh0cmFkYXRhICsgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChyZXQgPSByZWFkX29sZF9odWZmbWFuX3RhYmxlcyhzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqIFN1YnNldCBvZiBHRVRfVkxDIGZvciB1c2UgaW4gaGFuZC1yb2xsZXIgVkxDIGNvZGUgKi8KKyNkZWZpbmUgVkxDX0lOVEVSTihkc3QsIHRhYmxlLCBnYiwgbmFtZSwgYml0cywgbWF4X2RlcHRoKSAgIFwKKyAgICBjb2RlID0gdGFibGVbaW5kZXhdWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuICAgID0gdGFibGVbaW5kZXhdWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobWF4X2RlcHRoID4gMSAmJiBuIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTEFTVF9TS0lQX0JJVFMobmFtZSwgZ2IsIGJpdHMpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVVBEQVRFX0NBQ0hFKG5hbWUsIGdiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmJfYml0cyA9IC1uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW5kZXggICA9IFNIT1dfVUJJVFMobmFtZSwgZ2IsIG5iX2JpdHMpICsgY29kZTsgICAgIFwKKyAgICAgICAgY29kZSAgICA9IHRhYmxlW2luZGV4XVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbiAgICAgICA9IHRhYmxlW2luZGV4XVsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG1heF9kZXB0aCA+IDIgJiYgbiA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKG5hbWUsIGdiLCBuYl9iaXRzKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFVQREFURV9DQUNIRShuYW1lLCBnYik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5iX2JpdHMgPSAtbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGluZGV4ICAgPSBTSE9XX1VCSVRTKG5hbWUsIGdiLCBuYl9iaXRzKSArIGNvZGU7IFwKKyAgICAgICAgICAgIGNvZGUgICAgPSB0YWJsZVtpbmRleF1bMF07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG4gICAgICAgPSB0YWJsZVtpbmRleF1bMV07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgPSBjb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMQVNUX1NLSVBfQklUUyhuYW1lLCBnYiwgbikKKworCisjZGVmaW5lIEdFVF9WTENfRFVBTChkc3QwLCBkc3QxLCBuYW1lLCBnYiwgZHRhYmxlLCB0YWJsZTEsIHRhYmxlMiwgIFwKKyAgICAgICAgICAgICAgICAgICAgIGJpdHMsIG1heF9kZXB0aCwgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGludCBpbmRleCA9IFNIT1dfVUJJVFMobmFtZSwgZ2IsIGJpdHMpOyAgICAgICAgICAgIFwKKyAgICAgICAgaW50ICAgICAgICAgIGNvZGUsIG4gPSBkdGFibGVbaW5kZXhdWzFdOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChuPD0wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBuYl9iaXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVkxDX0lOVEVSTihkc3QwLCB0YWJsZTEsIGdiLCBuYW1lLCBiaXRzLCBtYXhfZGVwdGgpOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW5kZXggPSBTSE9XX1VCSVRTKG5hbWUsIGdiLCBiaXRzKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBWTENfSU5URVJOKGRzdDEsIHRhYmxlMiwgZ2IsIG5hbWUsIGJpdHMsIG1heF9kZXB0aCk7ICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29kZSA9IGR0YWJsZVtpbmRleF1bMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBPUChkc3QwLCBkc3QxLCBjb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKG5hbWUsIGdiLCBuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBPUDhiaXRzKGRzdDAsIGRzdDEsIGNvZGUpIGRzdDAgPSBjb2RlPj44OyBkc3QxID0gY29kZQorCisjZGVmaW5lIFJFQURfMlBJWChkc3QwLCBkc3QxLCBwbGFuZTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUX1ZMQ19EVUFMKGRzdDAsIGRzdDEsIHJlLCAmcy0+Z2IsIHMtPnZsY1s0K3BsYW5lMV0udGFibGUsICAgICAgICBcCisgICAgICAgICAgICAgICAgIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjW3BsYW5lMV0udGFibGUsIFZMQ19CSVRTLCAzLCBPUDhiaXRzKQorCitzdGF0aWMgdm9pZCBkZWNvZGVfNDIyX2JpdHN0cmVhbShIWXV2Q29udGV4dCAqcywgaW50IGNvdW50KQoreworICAgIGludCBpLCBpY291bnQ7CisgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgY291bnQgLz0gMjsKKworICAgIGljb3VudCA9IGdldF9iaXRzX2xlZnQoJnMtPmdiKSAvICgzMiAqIDQpOworICAgIGlmIChjb3VudCA+PSBpY291bnQpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGljb3VudDsgaSsrKSB7CisgICAgICAgICAgICBSRUFEXzJQSVgocy0+dGVtcFswXVsyICogaV0sICAgICBzLT50ZW1wWzFdW2ldLCAxKTsKKyAgICAgICAgICAgIFJFQURfMlBJWChzLT50ZW1wWzBdWzIgKiBpICsgMV0sIHMtPnRlbXBbMl1baV0sIDIpOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBpIDwgY291bnQgJiYgQklUU19MRUZUKHJlLCAmcy0+Z2IpID4gMDsgaSsrKSB7CisgICAgICAgICAgICBSRUFEXzJQSVgocy0+dGVtcFswXVsyICogaSAgICBdLCBzLT50ZW1wWzFdW2ldLCAxKTsKKyAgICAgICAgICAgIGlmIChCSVRTX0xFRlQocmUsICZzLT5nYikgPD0gMCkgYnJlYWs7CisgICAgICAgICAgICBSRUFEXzJQSVgocy0+dGVtcFswXVsyICogaSArIDFdLCBzLT50ZW1wWzJdW2ldLCAyKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICBzLT50ZW1wWzBdWzIgKiBpICAgIF0gPSBzLT50ZW1wWzFdW2ldID0KKyAgICAgICAgICAgIHMtPnRlbXBbMF1bMiAqIGkgKyAxXSA9IHMtPnRlbXBbMl1baV0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBSRUFEXzJQSVgocy0+dGVtcFswXVsyICogaV0sICAgICBzLT50ZW1wWzFdW2ldLCAxKTsKKyAgICAgICAgICAgIFJFQURfMlBJWChzLT50ZW1wWzBdWzIgKiBpICsgMV0sIHMtPnRlbXBbMl1baV0sIDIpOworICAgICAgICB9CisgICAgfQorICAgIENMT1NFX1JFQURFUihyZSwgJnMtPmdiKTsKK30KKworI2RlZmluZSBSRUFEXzJQSVhfUExBTkUoZHN0MCwgZHN0MSwgcGxhbmUsIE9QKSBcCisgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOyBcCisgICAgR0VUX1ZMQ19EVUFMKGRzdDAsIGRzdDEsIHJlLCAmcy0+Z2IsIHMtPnZsY1s0K3BsYW5lXS50YWJsZSwgXAorICAgICAgICAgICAgICAgICBzLT52bGNbcGxhbmVdLnRhYmxlLCBzLT52bGNbcGxhbmVdLnRhYmxlLCBWTENfQklUUywgMywgT1ApCisKKyNkZWZpbmUgT1AxNGJpdHMoZHN0MCwgZHN0MSwgY29kZSkgZHN0MCA9IGNvZGU+Pjg7IGRzdDEgPSBzaWduX2V4dGVuZChjb2RlLCA4KQorCisvKiBUT0RPIGluc3RlYWQgb2YgcmVzdGFydGluZyB0aGUgcmVhZCB3aGVuIHRoZSBjb2RlIGlzbid0IGluIHRoZSBmaXJzdCBsZXZlbAorICogb2YgdGhlIGpvaW50IHRhYmxlLCBqdW1wIGludG8gdGhlIDJuZCBsZXZlbCBvZiB0aGUgaW5kaXZpZHVhbCB0YWJsZS4gKi8KKyNkZWZpbmUgUkVBRF8yUElYX1BMQU5FMTYoZHN0MCwgZHN0MSwgcGxhbmUpe1wKKyAgICBkc3QwID0gZ2V0X3ZsYzIoJnMtPmdiLCBzLT52bGNbcGxhbmVdLnRhYmxlLCBWTENfQklUUywgMyk8PDI7XAorICAgIGRzdDAgKz0gZ2V0X2JpdHMoJnMtPmdiLCAyKTtcCisgICAgZHN0MSA9IGdldF92bGMyKCZzLT5nYiwgcy0+dmxjW3BsYW5lXS50YWJsZSwgVkxDX0JJVFMsIDMpPDwyO1wKKyAgICBkc3QxICs9IGdldF9iaXRzKCZzLT5nYiwgMik7XAorfQorc3RhdGljIHZvaWQgZGVjb2RlX3BsYW5lX2JpdHN0cmVhbShIWXV2Q29udGV4dCAqcywgaW50IHdpZHRoLCBpbnQgcGxhbmUpCit7CisgICAgaW50IGksIGNvdW50ID0gd2lkdGgvMjsKKworICAgIGlmIChzLT5icHMgPD0gOCkgeworICAgICAgICBPUEVOX1JFQURFUihyZSwgJnMtPmdiKTsKKyAgICAgICAgaWYgKGNvdW50ID49IChnZXRfYml0c19sZWZ0KCZzLT5nYikpIC8gKDMyICogMikpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCAmJiBCSVRTX0xFRlQocmUsICZzLT5nYikgPiAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICBSRUFEXzJQSVhfUExBTkUocy0+dGVtcFswXVsyICogaV0sIHMtPnRlbXBbMF1bMiAqIGkgKyAxXSwgcGxhbmUsIE9QOGJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yKGk9MDsgaTxjb3VudDsgaSsrKXsKKyAgICAgICAgICAgICAgICBSRUFEXzJQSVhfUExBTkUocy0+dGVtcFswXVsyICogaV0sIHMtPnRlbXBbMF1bMiAqIGkgKyAxXSwgcGxhbmUsIE9QOGJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCB3aWR0aCYxICYmIEJJVFNfTEVGVChyZSwgJnMtPmdiKT4wICkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGV4OworICAgICAgICAgICAgaW50IG5iX2JpdHMsIGNvZGUsIG47CisgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICBpbmRleCA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgVkxDX0JJVFMpOworICAgICAgICAgICAgVkxDX0lOVEVSTihzLT50ZW1wWzBdW3dpZHRoLTFdLCBzLT52bGNbcGxhbmVdLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAmcy0+Z2IsIHJlLCBWTENfQklUUywgMyk7CisgICAgICAgIH0KKyAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOworICAgIH0gZWxzZSBpZiAocy0+YnBzIDw9IDE0KSB7CisgICAgICAgIE9QRU5fUkVBREVSKHJlLCAmcy0+Z2IpOworICAgICAgICBpZiAoY291bnQgPj0gKGdldF9iaXRzX2xlZnQoJnMtPmdiKSkgLyAoMzIgKiAyKSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50ICYmIEJJVFNfTEVGVChyZSwgJnMtPmdiKSA+IDA7IGkrKykgeworICAgICAgICAgICAgICAgIFJFQURfMlBJWF9QTEFORShzLT50ZW1wMTZbMF1bMiAqIGldLCBzLT50ZW1wMTZbMF1bMiAqIGkgKyAxXSwgcGxhbmUsIE9QMTRiaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8Y291bnQ7IGkrKyl7CisgICAgICAgICAgICAgICAgUkVBRF8yUElYX1BMQU5FKHMtPnRlbXAxNlswXVsyICogaV0sIHMtPnRlbXAxNlswXVsyICogaSArIDFdLCBwbGFuZSwgT1AxNGJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCB3aWR0aCYxICYmIEJJVFNfTEVGVChyZSwgJnMtPmdiKT4wICkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGV4OworICAgICAgICAgICAgaW50IG5iX2JpdHMsIGNvZGUsIG47CisgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICBpbmRleCA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgVkxDX0JJVFMpOworICAgICAgICAgICAgVkxDX0lOVEVSTihzLT50ZW1wMTZbMF1bd2lkdGgtMV0sIHMtPnZsY1twbGFuZV0udGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICZzLT5nYiwgcmUsIFZMQ19CSVRTLCAzKTsKKyAgICAgICAgfQorICAgICAgICBDTE9TRV9SRUFERVIocmUsICZzLT5nYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNvdW50ID49IChnZXRfYml0c19sZWZ0KCZzLT5nYikpIC8gKDMyICogMikpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCAmJiBnZXRfYml0c19sZWZ0KCZzLT5nYikgPiAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICBSRUFEXzJQSVhfUExBTkUxNihzLT50ZW1wMTZbMF1bMiAqIGldLCBzLT50ZW1wMTZbMF1bMiAqIGkgKyAxXSwgcGxhbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yKGk9MDsgaTxjb3VudDsgaSsrKXsKKyAgICAgICAgICAgICAgICBSRUFEXzJQSVhfUExBTkUxNihzLT50ZW1wMTZbMF1bMiAqIGldLCBzLT50ZW1wMTZbMF1bMiAqIGkgKyAxXSwgcGxhbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCB3aWR0aCYxICYmIGdldF9iaXRzX2xlZnQoJnMtPmdiKT4wICkgeworICAgICAgICAgICAgaW50IGRzdCA9IGdldF92bGMyKCZzLT5nYiwgcy0+dmxjW3BsYW5lXS50YWJsZSwgVkxDX0JJVFMsIDMpPDwyOworICAgICAgICAgICAgcy0+dGVtcDE2WzBdW3dpZHRoLTFdID0gZHN0ICsgZ2V0X2JpdHMoJnMtPmdiLCAyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2dyYXlfYml0c3RyZWFtKEhZdXZDb250ZXh0ICpzLCBpbnQgY291bnQpCit7CisgICAgaW50IGk7CisgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgY291bnQgLz0gMjsKKworICAgIGlmIChjb3VudCA+PSAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpKSAvICgzMiAqIDIpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCAmJiBCSVRTX0xFRlQocmUsICZzLT5nYikgPiAwOyBpKyspIHsKKyAgICAgICAgICAgIFJFQURfMlBJWChzLT50ZW1wWzBdWzIgKiBpXSwgcy0+dGVtcFswXVsyICogaSArIDFdLCAwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBSRUFEXzJQSVgocy0+dGVtcFswXVsyICogaV0sIHMtPnRlbXBbMF1bMiAqIGkgKyAxXSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGRlY29kZV9iZ3JfMShIWXV2Q29udGV4dCAqcywgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY29ycmVsYXRlLCBpbnQgYWxwaGEpCit7CisgICAgaW50IGk7CisgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgJiYgQklUU19MRUZUKHJlLCAmcy0+Z2IpID4gMDsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBpbmRleDsKKyAgICAgICAgaW50IGNvZGUsIG4sIG5iX2JpdHM7CisKKyAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOworICAgICAgICBpbmRleCA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgVkxDX0JJVFMpOworICAgICAgICBuICAgICA9IHMtPnZsY1s0XS50YWJsZVtpbmRleF1bMV07CisKKyAgICAgICAgaWYgKG4+MCkgeworICAgICAgICAgICAgY29kZSAgPSBzLT52bGNbNF0udGFibGVbaW5kZXhdWzBdOworICAgICAgICAgICAgKih1aW50MzJfdCAqKSAmcy0+dGVtcFswXVs0ICogaV0gPSBzLT5waXhfYmdyX21hcFtjb2RlXTsKKyAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIG4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGRlY29ycmVsYXRlKSB7CisgICAgICAgICAgICAgICAgVkxDX0lOVEVSTihzLT50ZW1wWzBdWzQgKiBpICsgR10sIHMtPnZsY1sxXS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5nYiwgcmUsIFZMQ19CSVRTLCAzKTsKKworICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgVkxDX0JJVFMpOworICAgICAgICAgICAgICAgIFZMQ19JTlRFUk4oY29kZSwgcy0+dmxjWzBdLnRhYmxlLCAmcy0+Z2IsIHJlLCBWTENfQklUUywgMyk7CisgICAgICAgICAgICAgICAgcy0+dGVtcFswXVs0ICogaSArIEJdID0gY29kZSArIHMtPnRlbXBbMF1bNCAqIGkgKyBHXTsKKworICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgVkxDX0JJVFMpOworICAgICAgICAgICAgICAgIFZMQ19JTlRFUk4oY29kZSwgcy0+dmxjWzJdLnRhYmxlLCAmcy0+Z2IsIHJlLCBWTENfQklUUywgMyk7CisgICAgICAgICAgICAgICAgcy0+dGVtcFswXVs0ICogaSArIFJdID0gY29kZSArIHMtPnRlbXBbMF1bNCAqIGkgKyBHXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVkxDX0lOVEVSTihzLT50ZW1wWzBdWzQgKiBpICsgQl0sIHMtPnZsY1swXS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5nYiwgcmUsIFZMQ19CSVRTLCAzKTsKKworICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgVkxDX0JJVFMpOworICAgICAgICAgICAgICAgIFZMQ19JTlRFUk4ocy0+dGVtcFswXVs0ICogaSArIEddLCBzLT52bGNbMV0udGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Z2IsIHJlLCBWTENfQklUUywgMyk7CisKKyAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICAgICAgaW5kZXggPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIFZMQ19CSVRTKTsKKyAgICAgICAgICAgICAgICBWTENfSU5URVJOKHMtPnRlbXBbMF1bNCAqIGkgKyBSXSwgcy0+dmxjWzJdLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmdiLCByZSwgVkxDX0JJVFMsIDMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhbHBoYSkgeworICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOworICAgICAgICAgICAgaW5kZXggPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIFZMQ19CSVRTKTsKKyAgICAgICAgICAgIFZMQ19JTlRFUk4ocy0+dGVtcFswXVs0ICogaSArIEFdLCBzLT52bGNbMl0udGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICZzLT5nYiwgcmUsIFZMQ19CSVRTLCAzKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzLT50ZW1wWzBdWzQgKiBpICsgQV0gPSAwOworICAgIH0KKyAgICBDTE9TRV9SRUFERVIocmUsICZzLT5nYik7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9iZ3JfYml0c3RyZWFtKEhZdXZDb250ZXh0ICpzLCBpbnQgY291bnQpCit7CisgICAgaWYgKHMtPmRlY29ycmVsYXRlKSB7CisgICAgICAgIGlmIChzLT5iaXRzdHJlYW1fYnBwID09IDI0KQorICAgICAgICAgICAgZGVjb2RlX2Jncl8xKHMsIGNvdW50LCAxLCAwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGVjb2RlX2Jncl8xKHMsIGNvdW50LCAxLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocy0+Yml0c3RyZWFtX2JwcCA9PSAyNCkKKyAgICAgICAgICAgIGRlY29kZV9iZ3JfMShzLCBjb3VudCwgMCwgMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlY29kZV9iZ3JfMShzLCBjb3VudCwgMCwgMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkcmF3X3NsaWNlKEhZdXZDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgaW50IHkpCit7CisgICAgaW50IGgsIGN5LCBpOworICAgIGludCBvZmZzZXRbQVZfTlVNX0RBVEFfUE9JTlRFUlNdOworCisgICAgaWYgKCFzLT5hdmN0eC0+ZHJhd19ob3Jpel9iYW5kKQorICAgICAgICByZXR1cm47CisKKyAgICBoICA9IHkgLSBzLT5sYXN0X3NsaWNlX2VuZDsKKyAgICB5IC09IGg7CisKKyAgICBpZiAocy0+Yml0c3RyZWFtX2JwcCA9PSAxMikKKyAgICAgICAgY3kgPSB5ID4+IDE7CisgICAgZWxzZQorICAgICAgICBjeSA9IHk7CisKKyAgICBvZmZzZXRbMF0gPSBmcmFtZS0+bGluZXNpemVbMF0gKiB5OworICAgIG9mZnNldFsxXSA9IGZyYW1lLT5saW5lc2l6ZVsxXSAqIGN5OworICAgIG9mZnNldFsyXSA9IGZyYW1lLT5saW5lc2l6ZVsyXSAqIGN5OworICAgIGZvciAoaSA9IDM7IGkgPCBBVl9OVU1fREFUQV9QT0lOVEVSUzsgaSsrKQorICAgICAgICBvZmZzZXRbaV0gPSAwOworICAgIGVtbXNfYygpOworCisgICAgcy0+YXZjdHgtPmRyYXdfaG9yaXpfYmFuZChzLT5hdmN0eCwgZnJhbWUsIG9mZnNldCwgeSwgMywgaCk7CisKKyAgICBzLT5sYXN0X3NsaWNlX2VuZCA9IHkgKyBoOworfQorCitzdGF0aWMgaW50IGxlZnRfcHJlZGljdGlvbihIWXV2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCB3LCBpbnQgYWNjKQoreworICAgIGlmIChzLT5icHMgPD0gOCkgeworICAgICAgICByZXR1cm4gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQoZHN0LCBzcmMsIHcsIGFjYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHMtPmxsdmlkZHNwLmFkZF9oZnl1X2xlZnRfcHJlZF9pbnQxNigoICAgICAgdWludDE2X3QgKilkc3QsIChjb25zdCB1aW50MTZfdCAqKXNyYywgcy0+bi0xLCB3LCBhY2MpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWRkX2J5dGVzKEhZdXZDb250ZXh0ICpzLCB1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHcpCit7CisgICAgaWYgKHMtPmJwcyA8PSA4KSB7CisgICAgICAgIHMtPmhkc3AuYWRkX2J5dGVzKGRzdCwgc3JjLCB3KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5sbHZpZGRzcC5hZGRfaW50MTYoKHVpbnQxNl90Kilkc3QsIChjb25zdCB1aW50MTZfdCopc3JjLCBzLT5uIC0gMSwgdyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGRfbWVkaWFuX3ByZWRpY3Rpb24oSFl1dkNvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICpkaWZmLCBpbnQgdywgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKQoreworICAgIGlmIChzLT5icHMgPD0gOCkgeworICAgICAgICBzLT5oZHNwLmFkZF9oZnl1X21lZGlhbl9wcmVkKGRzdCwgc3JjLCBkaWZmLCB3LCBsZWZ0LCBsZWZ0X3RvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYoKHVpbnQxNl90ICopZHN0LCAoY29uc3QgdWludDE2X3QgKilzcmMsIChjb25zdCB1aW50MTZfdCAqKWRpZmYsIHMtPm4tMSwgdywgbGVmdCwgbGVmdF90b3ApOworICAgIH0KK30KK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgSFl1dkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IGludCB3aWR0aCAgPSBzLT53aWR0aDsKKyAgICBjb25zdCBpbnQgd2lkdGgyID0gcy0+d2lkdGggPj4gMTsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcy0+aGVpZ2h0OworICAgIGludCBmYWtlX3lzdHJpZGUsIGZha2VfdXN0cmlkZSwgZmFrZV92c3RyaWRlOworICAgIFRocmVhZEZyYW1lIGZyYW1lID0geyAuZiA9IGRhdGEgfTsKKyAgICBBVkZyYW1lICpjb25zdCBwID0gZGF0YTsKKyAgICBpbnQgdGFibGVfc2l6ZSA9IDAsIHJldDsKKworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcy0+Yml0c3RyZWFtX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAmcy0+Yml0c3RyZWFtX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplKTsKKyAgICBpZiAoIXMtPmJpdHN0cmVhbV9idWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5iZHNwLmJzd2FwX2J1ZigodWludDMyX3QgKikgcy0+Yml0c3RyZWFtX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDMyX3QgKikgYnVmLCBidWZfc2l6ZSAvIDQpOworCisgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJmZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHMtPmNvbnRleHQpIHsKKyAgICAgICAgdGFibGVfc2l6ZSA9IHJlYWRfaHVmZm1hbl90YWJsZXMocywgcy0+Yml0c3RyZWFtX2J1ZmZlciwgYnVmX3NpemUpOworICAgICAgICBpZiAodGFibGVfc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gdGFibGVfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoKHVuc2lnbmVkKSAoYnVmX3NpemUgLSB0YWJsZV9zaXplKSA+PSBJTlRfTUFYIC8gOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoKHJldCA9IGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBzLT5iaXRzdHJlYW1fYnVmZmVyICsgdGFibGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Zl9zaXplIC0gdGFibGVfc2l6ZSkgKiA4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZmFrZV95c3RyaWRlID0gcy0+aW50ZXJsYWNlZCA/IHAtPmxpbmVzaXplWzBdICogMiA6IHAtPmxpbmVzaXplWzBdOworICAgIGZha2VfdXN0cmlkZSA9IHMtPmludGVybGFjZWQgPyBwLT5saW5lc2l6ZVsxXSAqIDIgOiBwLT5saW5lc2l6ZVsxXTsKKyAgICBmYWtlX3ZzdHJpZGUgPSBzLT5pbnRlcmxhY2VkID8gcC0+bGluZXNpemVbMl0gKiAyIDogcC0+bGluZXNpemVbMl07CisKKyAgICBzLT5sYXN0X3NsaWNlX2VuZCA9IDA7CisKKyAgICBpZiAocy0+dmVyc2lvbiA+IDIpIHsKKyAgICAgICAgaW50IHBsYW5lOworICAgICAgICBmb3IocGxhbmUgPSAwOyBwbGFuZSA8IDEgKyAyKnMtPmNocm9tYSArIHMtPmFscGhhOyBwbGFuZSsrKSB7CisgICAgICAgICAgICBpbnQgbGVmdCwgbGVmdHRvcCwgeTsKKyAgICAgICAgICAgIGludCB3ID0gd2lkdGg7CisgICAgICAgICAgICBpbnQgaCA9IGhlaWdodDsKKyAgICAgICAgICAgIGludCBmYWtlX3N0cmlkZSA9IGZha2VfeXN0cmlkZTsKKworICAgICAgICAgICAgaWYgKHMtPmNocm9tYSAmJiAocGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyKSkgeworICAgICAgICAgICAgICAgIHcgPj49IHMtPmNocm9tYV9oX3NoaWZ0OworICAgICAgICAgICAgICAgIGggPj49IHMtPmNocm9tYV92X3NoaWZ0OworICAgICAgICAgICAgICAgIGZha2Vfc3RyaWRlID0gcGxhbmUgPT0gMSA/IGZha2VfdXN0cmlkZSA6IGZha2VfdnN0cmlkZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChzLT5wcmVkaWN0b3IpIHsKKyAgICAgICAgICAgIGNhc2UgTEVGVDoKKyAgICAgICAgICAgIGNhc2UgUExBTkU6CisgICAgICAgICAgICAgICAgZGVjb2RlX3BsYW5lX2JpdHN0cmVhbShzLCB3LCBwbGFuZSk7CisgICAgICAgICAgICAgICAgbGVmdCA9IGxlZnRfcHJlZGljdGlvbihzLCBwLT5kYXRhW3BsYW5lXSwgcy0+dGVtcFswXSwgdywgMCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAxOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IHAtPmRhdGFbcGxhbmVdICsgcC0+bGluZXNpemVbcGxhbmVdKnk7CisKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3BsYW5lX2JpdHN0cmVhbShzLCB3LCBwbGFuZSk7CisgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0X3ByZWRpY3Rpb24ocywgZHN0LCBzLT50ZW1wWzBdLCB3LCBsZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnByZWRpY3RvciA9PSBQTEFORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiBzLT5pbnRlcmxhY2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2J5dGVzKHMsIGRzdCwgZHN0IC0gZmFrZV9zdHJpZGUsIHcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1FRElBTjoKKyAgICAgICAgICAgICAgICBkZWNvZGVfcGxhbmVfYml0c3RyZWFtKHMsIHcsIHBsYW5lKTsKKyAgICAgICAgICAgICAgICBsZWZ0PSBsZWZ0X3ByZWRpY3Rpb24ocywgcC0+ZGF0YVtwbGFuZV0sIHMtPnRlbXBbMF0sIHcsIDApOworCisgICAgICAgICAgICAgICAgeSA9IDE7CisKKyAgICAgICAgICAgICAgICAvKiBzZWNvbmQgbGluZSBpcyBsZWZ0IHByZWRpY3RlZCBmb3IgaW50ZXJsYWNlZCBjYXNlICovCisgICAgICAgICAgICAgICAgaWYgKHMtPmludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3BsYW5lX2JpdHN0cmVhbShzLCB3LCBwbGFuZSk7CisgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0X3ByZWRpY3Rpb24ocywgcC0+ZGF0YVtwbGFuZV0gKyBwLT5saW5lc2l6ZVtwbGFuZV0sIHMtPnRlbXBbMF0sIHcsIGxlZnQpOworICAgICAgICAgICAgICAgICAgICB5Kys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbGVmdHRvcCA9IHAtPmRhdGFbcGxhbmVdWzBdOworICAgICAgICAgICAgICAgIGRlY29kZV9wbGFuZV9iaXRzdHJlYW0ocywgdywgcGxhbmUpOworICAgICAgICAgICAgICAgIGFkZF9tZWRpYW5fcHJlZGljdGlvbihzLCBwLT5kYXRhW3BsYW5lXSArIGZha2Vfc3RyaWRlLCBwLT5kYXRhW3BsYW5lXSwgcy0+dGVtcFswXSwgdywgJmxlZnQsICZsZWZ0dG9wKTsKKyAgICAgICAgICAgICAgICB5Kys7CisKKyAgICAgICAgICAgICAgICBmb3IgKDsgeTxoOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0OworCisgICAgICAgICAgICAgICAgICAgIGRlY29kZV9wbGFuZV9iaXRzdHJlYW0ocywgdywgcGxhbmUpOworCisgICAgICAgICAgICAgICAgICAgIGRzdCA9IHAtPmRhdGFbcGxhbmVdICsgcC0+bGluZXNpemVbcGxhbmVdICogeTsKKworICAgICAgICAgICAgICAgICAgICBhZGRfbWVkaWFuX3ByZWRpY3Rpb24ocywgZHN0LCBkc3QgLSBmYWtlX3N0cmlkZSwgcy0+dGVtcFswXSwgdywgJmxlZnQsICZsZWZ0dG9wKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkcmF3X3NsaWNlKHMsIHAsIGhlaWdodCk7CisgICAgfSBlbHNlIGlmIChzLT5iaXRzdHJlYW1fYnBwIDwgMjQpIHsKKyAgICAgICAgaW50IHksIGN5OworICAgICAgICBpbnQgbGVmdHksIGxlZnR1LCBsZWZ0djsKKyAgICAgICAgaW50IGxlZnR0b3B5LCBsZWZ0dG9wdSwgbGVmdHRvcHY7CisKKyAgICAgICAgaWYgKHMtPnl1eTIpIHsKKyAgICAgICAgICAgIHAtPmRhdGFbMF1bM10gPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgcC0+ZGF0YVswXVsyXSA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgICAgICBwLT5kYXRhWzBdWzFdID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIHAtPmRhdGFbMF1bMF0gPSBnZXRfYml0cygmcy0+Z2IsIDgpOworCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiWVVZMiBvdXRwdXQgaXMgbm90IGltcGxlbWVudGVkIHlldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZWZ0diAgICAgICAgID0KKyAgICAgICAgICAgIHAtPmRhdGFbMl1bMF0gPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgbGVmdHkgICAgICAgICA9CisgICAgICAgICAgICBwLT5kYXRhWzBdWzFdID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIGxlZnR1ICAgICAgICAgPQorICAgICAgICAgICAgcC0+ZGF0YVsxXVswXSA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgICAgICBwLT5kYXRhWzBdWzBdID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKworICAgICAgICAgICAgc3dpdGNoIChzLT5wcmVkaWN0b3IpIHsKKyAgICAgICAgICAgIGNhc2UgTEVGVDoKKyAgICAgICAgICAgIGNhc2UgUExBTkU6CisgICAgICAgICAgICAgICAgZGVjb2RlXzQyMl9iaXRzdHJlYW0ocywgd2lkdGggLSAyKTsKKyAgICAgICAgICAgICAgICBsZWZ0eSA9IHMtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKHAtPmRhdGFbMF0gKyAyLCBzLT50ZW1wWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggLSAyLCBsZWZ0eSk7CisgICAgICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgICAgICAgICAgICAgIGxlZnR1ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQocC0+ZGF0YVsxXSArIDEsIHMtPnRlbXBbMV0sIHdpZHRoMiAtIDEsIGxlZnR1KTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdHYgPSBzLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZChwLT5kYXRhWzJdICsgMSwgcy0+dGVtcFsyXSwgd2lkdGgyIC0gMSwgbGVmdHYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoY3kgPSB5ID0gMTsgeSA8IHMtPmhlaWdodDsgeSsrLCBjeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnlkc3QsICp1ZHN0LCAqdmRzdDsKKworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Yml0c3RyZWFtX2JwcCA9PSAxMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2dyYXlfYml0c3RyZWFtKHMsIHdpZHRoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgeWRzdCA9IHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSAqIHk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnR5ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQoeWRzdCwgcy0+dGVtcFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGxlZnR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wcmVkaWN0b3IgPT0gUExBTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSA+IHMtPmludGVybGFjZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2J5dGVzKHlkc3QsIHlkc3QgLSBmYWtlX3lzdHJpZGUsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5ID49IHMtPmhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRyYXdfc2xpY2UocywgcCwgeSk7CisKKyAgICAgICAgICAgICAgICAgICAgeWRzdCA9IHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSAqIHk7CisgICAgICAgICAgICAgICAgICAgIHVkc3QgPSBwLT5kYXRhWzFdICsgcC0+bGluZXNpemVbMV0gKiBjeTsKKyAgICAgICAgICAgICAgICAgICAgdmRzdCA9IHAtPmRhdGFbMl0gKyBwLT5saW5lc2l6ZVsyXSAqIGN5OworCisgICAgICAgICAgICAgICAgICAgIGRlY29kZV80MjJfYml0c3RyZWFtKHMsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdHkgPSBzLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZCh5ZHN0LCBzLT50ZW1wWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBsZWZ0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdHUgPSBzLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZCh1ZHN0LCBzLT50ZW1wWzFdLCB3aWR0aDIsIGxlZnR1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnR2ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQodmRzdCwgcy0+dGVtcFsyXSwgd2lkdGgyLCBsZWZ0dik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnByZWRpY3RvciA9PSBQTEFORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ID4gcy0+aW50ZXJsYWNlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2J5dGVzKHlkc3QsIHlkc3QgLSBmYWtlX3lzdHJpZGUsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5hZGRfYnl0ZXModWRzdCwgdWRzdCAtIGZha2VfdXN0cmlkZSwgd2lkdGgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5hZGRfYnl0ZXModmRzdCwgdmRzdCAtIGZha2VfdnN0cmlkZSwgd2lkdGgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHJhd19zbGljZShzLCBwLCBoZWlnaHQpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1FRElBTjoKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBsaW5lIGV4Y2VwdCBmaXJzdCAyIHBpeGVscyBpcyBsZWZ0IHByZWRpY3RlZCAqLworICAgICAgICAgICAgICAgIGRlY29kZV80MjJfYml0c3RyZWFtKHMsIHdpZHRoIC0gMik7CisgICAgICAgICAgICAgICAgbGVmdHkgPSBzLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZChwLT5kYXRhWzBdICsgMiwgcy0+dGVtcFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gMiwgbGVmdHkpOworICAgICAgICAgICAgICAgIGlmICghKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkgeworICAgICAgICAgICAgICAgICAgICBsZWZ0dSA9IHMtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKHAtPmRhdGFbMV0gKyAxLCBzLT50ZW1wWzFdLCB3aWR0aDIgLSAxLCBsZWZ0dSk7CisgICAgICAgICAgICAgICAgICAgIGxlZnR2ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQocC0+ZGF0YVsyXSArIDEsIHMtPnRlbXBbMl0sIHdpZHRoMiAtIDEsIGxlZnR2KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjeSA9IHkgPSAxOworCisgICAgICAgICAgICAgICAgLyogc2Vjb25kIGxpbmUgaXMgbGVmdCBwcmVkaWN0ZWQgZm9yIGludGVybGFjZWQgY2FzZSAqLworICAgICAgICAgICAgICAgIGlmIChzLT5pbnRlcmxhY2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZV80MjJfYml0c3RyZWFtKHMsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdHkgPSBzLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZChwLT5kYXRhWzBdICsgcC0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dGVtcFswXSwgd2lkdGgsIGxlZnR5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0dSA9IHMtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKHAtPmRhdGFbMV0gKyBwLT5saW5lc2l6ZVsyXSwgcy0+dGVtcFsxXSwgd2lkdGgyLCBsZWZ0dSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0diA9IHMtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKHAtPmRhdGFbMl0gKyBwLT5saW5lc2l6ZVsxXSwgcy0+dGVtcFsyXSwgd2lkdGgyLCBsZWZ0dik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeSsrOworICAgICAgICAgICAgICAgICAgICBjeSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIG5leHQgNCBwaXhlbHMgYXJlIGxlZnQgcHJlZGljdGVkIHRvbyAqLworICAgICAgICAgICAgICAgIGRlY29kZV80MjJfYml0c3RyZWFtKHMsIDQpOworICAgICAgICAgICAgICAgIGxlZnR5ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQocC0+ZGF0YVswXSArIGZha2VfeXN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRlbXBbMF0sIDQsIGxlZnR5KTsKKyAgICAgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVmdHUgPSBzLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZChwLT5kYXRhWzFdICsgZmFrZV91c3RyaWRlLCBzLT50ZW1wWzFdLCAyLCBsZWZ0dSk7CisgICAgICAgICAgICAgICAgICAgIGxlZnR2ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQocC0+ZGF0YVsyXSArIGZha2VfdnN0cmlkZSwgcy0+dGVtcFsyXSwgMiwgbGVmdHYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIG5leHQgbGluZSBleGNlcHQgdGhlIGZpcnN0IDQgcGl4ZWxzIGlzIG1lZGlhbiBwcmVkaWN0ZWQgKi8KKyAgICAgICAgICAgICAgICBsZWZ0dG9weSA9IHAtPmRhdGFbMF1bM107CisgICAgICAgICAgICAgICAgZGVjb2RlXzQyMl9iaXRzdHJlYW0ocywgd2lkdGggLSA0KTsKKyAgICAgICAgICAgICAgICBzLT5oZHNwLmFkZF9oZnl1X21lZGlhbl9wcmVkKHAtPmRhdGFbMF0gKyBmYWtlX3lzdHJpZGUgKyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVswXSArIDQsIHMtPnRlbXBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAtIDQsICZsZWZ0eSwgJmxlZnR0b3B5KTsKKyAgICAgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVmdHRvcHUgPSBwLT5kYXRhWzFdWzFdOworICAgICAgICAgICAgICAgICAgICBsZWZ0dG9wdiA9IHAtPmRhdGFbMl1bMV07CisgICAgICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2hmeXVfbWVkaWFuX3ByZWQocC0+ZGF0YVsxXSArIGZha2VfdXN0cmlkZSArIDIsIHAtPmRhdGFbMV0gKyAyLCBzLT50ZW1wWzFdLCB3aWR0aDIgLSAyLCAmbGVmdHUsICZsZWZ0dG9wdSk7CisgICAgICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2hmeXVfbWVkaWFuX3ByZWQocC0+ZGF0YVsyXSArIGZha2VfdnN0cmlkZSArIDIsIHAtPmRhdGFbMl0gKyAyLCBzLT50ZW1wWzJdLCB3aWR0aDIgLSAyLCAmbGVmdHYsICZsZWZ0dG9wdik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHkrKzsKKyAgICAgICAgICAgICAgICBjeSsrOworCisgICAgICAgICAgICAgICAgZm9yICg7IHkgPCBoZWlnaHQ7IHkrKywgY3krKykgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp5ZHN0LCAqdWRzdCwgKnZkc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmJpdHN0cmVhbV9icHAgPT0gMTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgyICogY3kgPiB5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2dyYXlfYml0c3RyZWFtKHMsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZHN0ID0gcC0+ZGF0YVswXSArIHAtPmxpbmVzaXplWzBdICogeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oZHNwLmFkZF9oZnl1X21lZGlhbl9wcmVkKHlkc3QsIHlkc3QgLSBmYWtlX3lzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50ZW1wWzBdLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0eSwgJmxlZnR0b3B5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSA+PSBoZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZHJhd19zbGljZShzLCBwLCB5KTsKKworICAgICAgICAgICAgICAgICAgICBkZWNvZGVfNDIyX2JpdHN0cmVhbShzLCB3aWR0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgeWRzdCA9IHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSAqIHk7CisgICAgICAgICAgICAgICAgICAgIHVkc3QgPSBwLT5kYXRhWzFdICsgcC0+bGluZXNpemVbMV0gKiBjeTsKKyAgICAgICAgICAgICAgICAgICAgdmRzdCA9IHAtPmRhdGFbMl0gKyBwLT5saW5lc2l6ZVsyXSAqIGN5OworCisgICAgICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2hmeXVfbWVkaWFuX3ByZWQoeWRzdCwgeWRzdCAtIGZha2VfeXN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50ZW1wWzBdLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdHksICZsZWZ0dG9weSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5hZGRfaGZ5dV9tZWRpYW5fcHJlZCh1ZHN0LCB1ZHN0IC0gZmFrZV91c3RyaWRlLCBzLT50ZW1wWzFdLCB3aWR0aDIsICZsZWZ0dSwgJmxlZnR0b3B1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2hmeXVfbWVkaWFuX3ByZWQodmRzdCwgdmRzdCAtIGZha2VfdnN0cmlkZSwgcy0+dGVtcFsyXSwgd2lkdGgyLCAmbGVmdHYsICZsZWZ0dG9wdik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkcmF3X3NsaWNlKHMsIHAsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgeTsKKyAgICAgICAgdWludDhfdCBsZWZ0WzRdOworICAgICAgICBjb25zdCBpbnQgbGFzdF9saW5lID0gKGhlaWdodCAtIDEpICogcC0+bGluZXNpemVbMF07CisKKyAgICAgICAgaWYgKHMtPmJpdHN0cmVhbV9icHAgPT0gMzIpIHsKKyAgICAgICAgICAgIGxlZnRbQV0gPSBwLT5kYXRhWzBdW2xhc3RfbGluZSArIEFdID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIGxlZnRbUl0gPSBwLT5kYXRhWzBdW2xhc3RfbGluZSArIFJdID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIGxlZnRbR10gPSBwLT5kYXRhWzBdW2xhc3RfbGluZSArIEddID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIGxlZnRbQl0gPSBwLT5kYXRhWzBdW2xhc3RfbGluZSArIEJdID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlZnRbUl0gPSBwLT5kYXRhWzBdW2xhc3RfbGluZSArIFJdID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIGxlZnRbR10gPSBwLT5kYXRhWzBdW2xhc3RfbGluZSArIEddID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIGxlZnRbQl0gPSBwLT5kYXRhWzBdW2xhc3RfbGluZSArIEJdID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIGxlZnRbQV0gPSBwLT5kYXRhWzBdW2xhc3RfbGluZSArIEFdID0gMjU1OworICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+YmdyMzIpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocy0+cHJlZGljdG9yKSB7CisgICAgICAgICAgICBjYXNlIExFRlQ6CisgICAgICAgICAgICBjYXNlIFBMQU5FOgorICAgICAgICAgICAgICAgIGRlY29kZV9iZ3JfYml0c3RyZWFtKHMsIHdpZHRoIC0gMSk7CisgICAgICAgICAgICAgICAgcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWRfYmdyMzIocC0+ZGF0YVswXSArIGxhc3RfbGluZSArIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dGVtcFswXSwgd2lkdGggLSAxLCBsZWZ0KTsKKworICAgICAgICAgICAgICAgIGZvciAoeSA9IHMtPmhlaWdodCAtIDI7IHkgPj0gMDsgeS0tKSB7IC8vIFllcyBpdCBpcyBzdG9yZWQgdXBzaWRlIGRvd24uCisgICAgICAgICAgICAgICAgICAgIGRlY29kZV9iZ3JfYml0c3RyZWFtKHMsIHdpZHRoKTsKKworICAgICAgICAgICAgICAgICAgICBzLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMihwLT5kYXRhWzBdICsgcC0+bGluZXNpemVbMF0gKiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50ZW1wWzBdLCB3aWR0aCwgbGVmdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wcmVkaWN0b3IgPT0gUExBTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5iaXRzdHJlYW1fYnBwICE9IDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRbQV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCBzLT5oZWlnaHQgLSAxIC0gcy0+aW50ZXJsYWNlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2J5dGVzKHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSAqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVswXSArIHAtPmxpbmVzaXplWzBdICogeSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFrZV95c3RyaWRlLCA0ICogd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGp1c3QgMSBsYXJnZSBzbGljZSBhcyB0aGlzIGlzIG5vdCBwb3NzaWJsZSBpbiByZXZlcnNlIG9yZGVyCisgICAgICAgICAgICAgICAgZHJhd19zbGljZShzLCBwLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgInByZWRpY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkIVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQkdSMjQgb3V0cHV0IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgfQorICAgIGVtbXNfYygpOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gKGdldF9iaXRzX2NvdW50KCZzLT5nYikgKyAzMSkgLyAzMiAqIDQgKyB0YWJsZV9zaXplOworfQorCitBVkNvZGVjIGZmX2h1ZmZ5dXZfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJodWZmeXV2IiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJIdWZmeXV2IC8gSHVmZllVViIpLAorICAgIC50eXBlICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSFVGRllVViwKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihIWXV2Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8CisgICAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKKyAgICAuaW5pdF90aHJlYWRfY29weSA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKGRlY29kZV9pbml0X3RocmVhZF9jb3B5KSwKK307CisKKyNpZiBDT05GSUdfRkZWSFVGRl9ERUNPREVSCitBVkNvZGVjIGZmX2Zmdmh1ZmZfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJmZnZodWZmIiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJIdWZmeXV2IEZGbXBlZyB2YXJpYW50IiksCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9GRlZIVUZGLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgID0gc2l6ZW9mKEhZdXZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgID0gZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfRFJBV19IT1JJWl9CQU5EIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIENPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5pbml0X3RocmVhZF9jb3B5ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoZGVjb2RlX2luaXRfdGhyZWFkX2NvcHkpLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfRkZWSFVGRl9ERUNPREVSICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9odWZmeXV2ZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9odWZmeXV2ZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhMDVmNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2h1ZmZ5dXZkc3AuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJodWZmeXV2ZHNwLmgiCisKKy8vIDB4N2Y3ZjdmN2Ygb3IgMHg3ZjdmN2Y3ZjdmN2Y3ZjdmIG9yIHdoYXRldmVyLCBkZXBlbmRpbmcgb24gdGhlIGNwdSdzIG5hdGl2ZSBhcml0aG1ldGljIHNpemUKKyNkZWZpbmUgcGJfN2YgKH4wVUwgLyAyNTUgKiAweDdmKQorI2RlZmluZSBwYl84MCAofjBVTCAvIDI1NSAqIDB4ODApCisKK3N0YXRpYyB2b2lkIGFkZF9ieXRlc19jKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnRwdHJfdCB3KQoreworICAgIGxvbmcgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gdyAtIChpbnQpIHNpemVvZihsb25nKTsgaSArPSBzaXplb2YobG9uZykpIHsKKyAgICAgICAgbG9uZyBhID0gKihsb25nICopIChzcmMgKyBpKTsKKyAgICAgICAgbG9uZyBiID0gKihsb25nICopIChkc3QgKyBpKTsKKyAgICAgICAgKihsb25nICopIChkc3QgKyBpKSA9ICgoYSAmIHBiXzdmKSArIChiICYgcGJfN2YpKSBeICgoYSBeIGIpICYgcGJfODApOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHc7IGkrKykKKyAgICAgICAgZHN0W2kgKyAwXSArPSBzcmNbaSArIDBdOworfQorCitzdGF0aWMgdm9pZCBhZGRfaGZ5dV9tZWRpYW5fcHJlZF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGlmZiwgaW50cHRyX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKQoreworICAgIGludCBpOworICAgIHVpbnQ4X3QgbCwgbHQ7CisKKyAgICBsICA9ICpsZWZ0OworICAgIGx0ID0gKmxlZnRfdG9wOworCisgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICBsICAgICAgPSBtaWRfcHJlZChsLCBzcmMxW2ldLCAobCArIHNyYzFbaV0gLSBsdCkgJiAweEZGKSArIGRpZmZbaV07CisgICAgICAgIGx0ICAgICA9IHNyYzFbaV07CisgICAgICAgIGRzdFtpXSA9IGw7CisgICAgfQorCisgICAgKmxlZnQgICAgID0gbDsKKyAgICAqbGVmdF90b3AgPSBsdDsKK30KKworc3RhdGljIGludCBhZGRfaGZ5dV9sZWZ0X3ByZWRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50cHRyX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjYykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3IC0gMTsgaSsrKSB7CisgICAgICAgIGFjYyAgICs9IHNyY1tpXTsKKyAgICAgICAgZHN0W2ldID0gYWNjOworICAgICAgICBpKys7CisgICAgICAgIGFjYyAgICs9IHNyY1tpXTsKKyAgICAgICAgZHN0W2ldID0gYWNjOworICAgIH0KKworICAgIGZvciAoOyBpIDwgdzsgaSsrKSB7CisgICAgICAgIGFjYyAgICs9IHNyY1tpXTsKKyAgICAgICAgZHN0W2ldID0gYWNjOworICAgIH0KKworICAgIHJldHVybiBhY2M7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgdywgdWludDhfdCAqbGVmdCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90IHIgPSBsZWZ0W1JdLCBnID0gbGVmdFtHXSwgYiA9IGxlZnRbQl0sIGEgPSBsZWZ0W0FdOworCisgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICBiICs9IHNyY1s0ICogaSArIEJdOworICAgICAgICBnICs9IHNyY1s0ICogaSArIEddOworICAgICAgICByICs9IHNyY1s0ICogaSArIFJdOworICAgICAgICBhICs9IHNyY1s0ICogaSArIEFdOworCisgICAgICAgIGRzdFs0ICogaSArIEJdID0gYjsKKyAgICAgICAgZHN0WzQgKiBpICsgR10gPSBnOworICAgICAgICBkc3RbNCAqIGkgKyBSXSA9IHI7CisgICAgICAgIGRzdFs0ICogaSArIEFdID0gYTsKKyAgICB9CisKKyAgICBsZWZ0W0JdID0gYjsKKyAgICBsZWZ0W0ddID0gZzsKKyAgICBsZWZ0W1JdID0gcjsKKyAgICBsZWZ0W0FdID0gYTsKK30KKworYXZfY29sZCB2b2lkIGZmX2h1ZmZ5dXZkc3BfaW5pdChIdWZmWVVWRFNQQ29udGV4dCAqYykKK3sKKyAgICBjLT5hZGRfYnl0ZXMgICAgICAgICAgICAgICAgPSBhZGRfYnl0ZXNfYzsKKyAgICBjLT5hZGRfaGZ5dV9tZWRpYW5fcHJlZCAgICAgPSBhZGRfaGZ5dV9tZWRpYW5fcHJlZF9jOworICAgIGMtPmFkZF9oZnl1X2xlZnRfcHJlZCAgICAgICA9IGFkZF9oZnl1X2xlZnRfcHJlZF9jOworICAgIGMtPmFkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMiA9IGFkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMl9jOworCisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9odWZmeXV2ZHNwX2luaXRfeDg2KGMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaHVmZnl1dmRzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvaHVmZnl1dmRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMzc3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9odWZmeXV2ZHNwLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSFVGRllVVkRTUF9ICisjZGVmaW5lIEFWQ09ERUNfSFVGRllVVkRTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEhBVkVfQklHRU5ESUFOCisjZGVmaW5lIEIgMworI2RlZmluZSBHIDIKKyNkZWZpbmUgUiAxCisjZGVmaW5lIEEgMAorI2Vsc2UKKyNkZWZpbmUgQiAwCisjZGVmaW5lIEcgMQorI2RlZmluZSBSIDIKKyNkZWZpbmUgQSAzCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgSHVmZllVVkRTUENvbnRleHQgeworICAgIHZvaWQgKCphZGRfYnl0ZXMpKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiAxNiAqLywgdWludDhfdCAqc3JjIC8qIGFsaWduIDE2ICovLAorICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcpOworICAgIHZvaWQgKCphZGRfaGZ5dV9tZWRpYW5fcHJlZCkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICp0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaWZmLCBpbnRwdHJfdCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKTsKKyAgICBpbnQgKCphZGRfaGZ5dV9sZWZ0X3ByZWQpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgdywgaW50IGxlZnQpOworICAgIHZvaWQgKCphZGRfaGZ5dV9sZWZ0X3ByZWRfYmdyMzIpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcsIHVpbnQ4X3QgKmxlZnQpOworfSBIdWZmWVVWRFNQQ29udGV4dDsKKwordm9pZCBmZl9odWZmeXV2ZHNwX2luaXQoSHVmZllVVkRTUENvbnRleHQgKmMpOwordm9pZCBmZl9odWZmeXV2ZHNwX2luaXRfcHBjKEh1ZmZZVVZEU1BDb250ZXh0ICpjKTsKK3ZvaWQgZmZfaHVmZnl1dmRzcF9pbml0X3g4NihIdWZmWVVWRFNQQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0hVRkZZVVZEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaHVmZnl1dmVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaHVmZnl1dmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZTY5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9odWZmeXV2ZW5jLmMKQEAgLTAsMCArMSwxMTE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBzZWUgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvaHVmZnl1di50eHQgZm9yIGEgZGVzY3JpcHRpb24gb2YKKyAqIHRoZSBhbGdvcml0aG0gdXNlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqCisgKiB5dXZhLCBncmF5LCA0OjQ6NCwgNDoxOjEsIDQ6MTowIGFuZCA+OCBiaXQgcGVyIHNhbXBsZSBzdXBwb3J0IHNwb25zb3JlZCBieSBOT0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBodWZmeXV2IGVuY29kZXIKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImh1ZmZ5dXYuaCIKKyNpbmNsdWRlICJodWZmbWFuLmgiCisjaW5jbHVkZSAiaHVmZnl1dmVuY2RzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworc3RhdGljIGlubGluZSB2b2lkIGRpZmZfYnl0ZXMoSFl1dkNvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzAsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGludCB3KQoreworICAgIGlmIChzLT5icHMgPD0gOCkgeworICAgICAgICBzLT5oZW5jZHNwLmRpZmZfYnl0ZXMoZHN0LCBzcmMwLCBzcmMxLCB3KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5sbHZpZGRzcC5kaWZmX2ludDE2KCh1aW50MTZfdCAqKWRzdCwgKGNvbnN0IHVpbnQxNl90ICopc3JjMCwgKGNvbnN0IHVpbnQxNl90ICopc3JjMSwgcy0+biAtIDEsIHcpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgc3ViX2xlZnRfcHJlZGljdGlvbihIWXV2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCB3LCBpbnQgbGVmdCkKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAocy0+YnBzIDw9IDgpIHsKKyAgICAgICAgaWYgKHcgPCAzMikgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCB0ZW1wID0gc3JjW2ldOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IHRlbXAgLSBsZWZ0OworICAgICAgICAgICAgICAgIGxlZnQgICA9IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVmdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHRlbXAgPSBzcmNbaV07CisgICAgICAgICAgICAgICAgZHN0W2ldID0gdGVtcCAtIGxlZnQ7CisgICAgICAgICAgICAgICAgbGVmdCAgID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmhlbmNkc3AuZGlmZl9ieXRlcyhkc3QgKyAxNiwgc3JjICsgMTYsIHNyYyArIDE1LCB3IC0gMTYpOworICAgICAgICAgICAgcmV0dXJuIHNyY1t3LTFdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyYzE2ID0gKGNvbnN0IHVpbnQxNl90ICopc3JjOworICAgICAgICB1aW50MTZfdCAgICAgICAqZHN0MTYgPSAoICAgICAgdWludDE2X3QgKilkc3Q7CisgICAgICAgIGlmICh3IDwgMzIpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGVtcCA9IHNyYzE2W2ldOworICAgICAgICAgICAgICAgIGRzdDE2W2ldID0gdGVtcCAtIGxlZnQ7CisgICAgICAgICAgICAgICAgbGVmdCAgID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZWZ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGVtcCA9IHNyYzE2W2ldOworICAgICAgICAgICAgICAgIGRzdDE2W2ldID0gdGVtcCAtIGxlZnQ7CisgICAgICAgICAgICAgICAgbGVmdCAgID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmxsdmlkZHNwLmRpZmZfaW50MTYoZHN0MTYgKyAxNiwgc3JjMTYgKyAxNiwgc3JjMTYgKyAxNSwgcy0+biAtIDEsIHcgLSAxNik7CisgICAgICAgICAgICByZXR1cm4gc3JjMTZbdy0xXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1Yl9sZWZ0X3ByZWRpY3Rpb25fYmdyMzIoSFl1dkNvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZCwgaW50ICpncmVlbiwgaW50ICpibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICphbHBoYSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgciwgZywgYiwgYTsKKyAgICByID0gKnJlZDsKKyAgICBnID0gKmdyZWVuOworICAgIGIgPSAqYmx1ZTsKKyAgICBhID0gKmFscGhhOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGTUlOKHcsIDQpOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IHJ0ID0gc3JjW2kgKiA0ICsgUl07CisgICAgICAgIGNvbnN0IGludCBndCA9IHNyY1tpICogNCArIEddOworICAgICAgICBjb25zdCBpbnQgYnQgPSBzcmNbaSAqIDQgKyBCXTsKKyAgICAgICAgY29uc3QgaW50IGF0ID0gc3JjW2kgKiA0ICsgQV07CisgICAgICAgIGRzdFtpICogNCArIFJdID0gcnQgLSByOworICAgICAgICBkc3RbaSAqIDQgKyBHXSA9IGd0IC0gZzsKKyAgICAgICAgZHN0W2kgKiA0ICsgQl0gPSBidCAtIGI7CisgICAgICAgIGRzdFtpICogNCArIEFdID0gYXQgLSBhOworICAgICAgICByID0gcnQ7CisgICAgICAgIGcgPSBndDsKKyAgICAgICAgYiA9IGJ0OworICAgICAgICBhID0gYXQ7CisgICAgfQorCisgICAgcy0+aGVuY2RzcC5kaWZmX2J5dGVzKGRzdCArIDE2LCBzcmMgKyAxNiwgc3JjICsgMTIsIHcgKiA0IC0gMTYpOworCisgICAgKnJlZCAgID0gc3JjWyh3IC0gMSkgKiA0ICsgUl07CisgICAgKmdyZWVuID0gc3JjWyh3IC0gMSkgKiA0ICsgR107CisgICAgKmJsdWUgID0gc3JjWyh3IC0gMSkgKiA0ICsgQl07CisgICAgKmFscGhhID0gc3JjWyh3IC0gMSkgKiA0ICsgQV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdWJfbGVmdF9wcmVkaWN0aW9uX3JnYjI0KEhZdXZDb250ZXh0ICpzLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyZWQsIGludCAqZ3JlZW4sIGludCAqYmx1ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgciwgZywgYjsKKyAgICByID0gKnJlZDsKKyAgICBnID0gKmdyZWVuOworICAgIGIgPSAqYmx1ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZNSU4odywgMTYpOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IHJ0ID0gc3JjW2kgKiAzICsgMF07CisgICAgICAgIGNvbnN0IGludCBndCA9IHNyY1tpICogMyArIDFdOworICAgICAgICBjb25zdCBpbnQgYnQgPSBzcmNbaSAqIDMgKyAyXTsKKyAgICAgICAgZHN0W2kgKiAzICsgMF0gPSBydCAtIHI7CisgICAgICAgIGRzdFtpICogMyArIDFdID0gZ3QgLSBnOworICAgICAgICBkc3RbaSAqIDMgKyAyXSA9IGJ0IC0gYjsKKyAgICAgICAgciA9IHJ0OworICAgICAgICBnID0gZ3Q7CisgICAgICAgIGIgPSBidDsKKyAgICB9CisKKyAgICBzLT5oZW5jZHNwLmRpZmZfYnl0ZXMoZHN0ICsgNDgsIHNyYyArIDQ4LCBzcmMgKyA0OCAtIDMsIHcgKiAzIC0gNDgpOworCisgICAgKnJlZCAgID0gc3JjWyh3IC0gMSkgKiAzICsgMF07CisgICAgKmdyZWVuID0gc3JjWyh3IC0gMSkgKiAzICsgMV07CisgICAgKmJsdWUgID0gc3JjWyh3IC0gMSkgKiAzICsgMl07Cit9CisKK3N0YXRpYyB2b2lkIHN1Yl9tZWRpYW5fcHJlZGljdGlvbihIWXV2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgdywgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKQoreworICAgIGlmIChzLT5icHMgPD0gOCkgeworICAgICAgICBzLT5oZW5jZHNwLnN1Yl9oZnl1X21lZGlhbl9wcmVkKGRzdCwgc3JjMSwgc3JjMiwgdyAsIGxlZnQsIGxlZnRfdG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5sbHZpZGRzcC5zdWJfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNigodWludDE2X3QgKilkc3QsIChjb25zdCB1aW50MTZfdCAqKXNyYzEsIChjb25zdCB1aW50MTZfdCAqKXNyYzIsIHMtPm4gLSAxLCB3ICwgbGVmdCwgbGVmdF90b3ApOworICAgIH0KK30KKworc3RhdGljIGludCBzdG9yZV90YWJsZShIWXV2Q29udGV4dCAqcywgY29uc3QgdWludDhfdCAqbGVuLCB1aW50OF90ICpidWYpCit7CisgICAgaW50IGk7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICBpbnQgbiA9IHMtPnZsY19uOworCisgICAgZm9yIChpID0gMDsgaSA8IG47KSB7CisgICAgICAgIGludCB2YWwgPSBsZW5baV07CisgICAgICAgIGludCByZXBlYXQgPSAwOworCisgICAgICAgIGZvciAoOyBpIDwgbiAmJiBsZW5baV0gPT0gdmFsICYmIHJlcGVhdCA8IDI1NTsgaSsrKQorICAgICAgICAgICAgcmVwZWF0Kys7CisKKyAgICAgICAgYXZfYXNzZXJ0MCh2YWwgPCAzMiAmJiB2YWwgPjAgJiYgcmVwZWF0IDwgMjU2ICYmIHJlcGVhdD4wKTsKKyAgICAgICAgaWYgKHJlcGVhdCA+IDcpIHsKKyAgICAgICAgICAgIGJ1ZltpbmRleCsrXSA9IHZhbDsKKyAgICAgICAgICAgIGJ1ZltpbmRleCsrXSA9IHJlcGVhdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZltpbmRleCsrXSA9IHZhbCB8IChyZXBlYXQgPDwgNSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfaHVmZm1hbl90YWJsZXMoSFl1dkNvbnRleHQgKnMsIHVpbnQ4X3QgKmJ1ZikKK3sKKyAgICBpbnQgaSwgcmV0OworICAgIGludCBzaXplID0gMDsKKyAgICBpbnQgY291bnQgPSAzOworCisgICAgaWYgKHMtPnZlcnNpb24gPiAyKQorICAgICAgICBjb3VudCA9IDEgKyBzLT5hbHBoYSArIDIqcy0+Y2hyb21hOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9odWZmX2dlbl9sZW5fdGFibGUocy0+bGVuW2ldLCBzLT5zdGF0c1tpXSwgcy0+dmxjX24sIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmIChmZl9odWZmeXV2X2dlbmVyYXRlX2JpdHNfdGFibGUocy0+Yml0c1tpXSwgcy0+bGVuW2ldLCBzLT52bGNfbikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzaXplICs9IHN0b3JlX3RhYmxlKHMsIHMtPmxlbltpXSwgYnVmICsgc2l6ZSk7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEhZdXZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgcmV0OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZjdHgtPnBpeF9mbXQpOworCisgICAgZmZfaHVmZnl1dl9jb21tb25faW5pdChhdmN0eCk7CisgICAgZmZfaHVmZnl1dmVuY2RzcF9pbml0KCZzLT5oZW5jZHNwKTsKKworICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KDMqTUFYX04gKyA0KTsKKyAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaWYgKHMtPmZsYWdzJkNPREVDX0ZMQUdfUEFTUzEpIHsKKyNkZWZpbmUgU1RBVFNfT1VUX1NJWkUgMjEqTUFYX04qMyArIDQKKyAgICAgICAgYXZjdHgtPnN0YXRzX291dCA9IGF2X21hbGxvY3ooU1RBVFNfT1VUX1NJWkUpOyAvLyAyMSoyNTYqMyglbGx1ICkgKyAzKFxuKSArIDEoMCkgPSAxNjEzMgorICAgICAgICBpZiAoIWF2Y3R4LT5zdGF0c19vdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBzLT52ZXJzaW9uID0gMjsKKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKworICAgIHMtPmJwcyA9IGRlc2MtPmNvbXBbMF0uZGVwdGhfbWludXMxICsgMTsKKyAgICBzLT55dXYgPSAhKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQikgJiYgZGVzYy0+bmJfY29tcG9uZW50cyA+PSAyOworICAgIHMtPmNocm9tYSA9IGRlc2MtPm5iX2NvbXBvbmVudHMgPiAyOworICAgIHMtPmFscGhhID0gISEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEpOworICAgIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGF2Y3R4LT5waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jaHJvbWFfaF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y2hyb21hX3Zfc2hpZnQpOworCisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOgorICAgICAgICBpZiAocy0+d2lkdGggJiAxKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIldpZHRoIG11c3QgYmUgZXZlbiBmb3IgdGhpcyBjb2xvcnNwYWNlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIHMtPmJpdHN0cmVhbV9icHAgPSBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAgPyAxMiA6IDE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDEwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDExUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4QToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNjoKKyAgICAgICAgcy0+dmVyc2lvbiA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjoKKyAgICAgICAgcy0+Yml0c3RyZWFtX2JwcCA9IDMyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIHMtPmJpdHN0cmVhbV9icHAgPSAyNDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHMtPm4gPSAxPDxzLT5icHM7CisgICAgcy0+dmxjX24gPSBGRk1JTihzLT5uLCBNQVhfVkxDX04pOworCisgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IHMtPmJpdHN0cmVhbV9icHA7CisgICAgcy0+ZGVjb3JyZWxhdGUgPSBzLT5iaXRzdHJlYW1fYnBwID49IDI0ICYmICFzLT55dXYgJiYgIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QTEFOQVIpOworICAgIHMtPnByZWRpY3RvciA9IGF2Y3R4LT5wcmVkaWN0aW9uX21ldGhvZDsKKyAgICBzLT5pbnRlcmxhY2VkID0gYXZjdHgtPmZsYWdzJkNPREVDX0ZMQUdfSU5URVJMQUNFRF9NRSA/IDEgOiAwOworICAgIGlmIChhdmN0eC0+Y29udGV4dF9tb2RlbCA9PSAxKSB7CisgICAgICAgIHMtPmNvbnRleHQgPSBhdmN0eC0+Y29udGV4dF9tb2RlbDsKKyAgICAgICAgaWYgKHMtPmZsYWdzICYgKENPREVDX0ZMQUdfUEFTUzF8Q09ERUNfRkxBR19QQVNTMikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJjb250ZXh0PTEgaXMgbm90IGNvbXBhdGlibGUgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgIjIgcGFzcyBodWZmeXV2IGVuY29kaW5nXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9ZWxzZSBzLT5jb250ZXh0PSAwOworCisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfSFVGRllVVikgeworICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRXJyb3I6IFlWMTIgaXMgbm90IHN1cHBvcnRlZCBieSBodWZmeXV2OyB1c2UgIgorICAgICAgICAgICAgICAgICAgICJ2Y29kZWM9ZmZ2aHVmZiBvciBmb3JtYXQ9NDIycFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGlmIChhdmN0eC0+Y29udGV4dF9tb2RlbCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkVycm9yOiBwZXItZnJhbWUgaHVmZm1hbiB0YWJsZXMgYXJlIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICJieSBodWZmeXV2OyB1c2UgdmNvZGVjPWZmdmh1ZmZcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+dmVyc2lvbiA+IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJFcnJvcjogdmVyPjIgaXMgbm90IHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgImJ5IGh1ZmZ5dXY7IHVzZSB2Y29kZWM9ZmZ2aHVmZlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5pbnRlcmxhY2VkICE9ICggcy0+aGVpZ2h0ID4gMjg4ICkpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJ1c2luZyBodWZmeXV2IDIuMi4wIG9yIG5ld2VyIGludGVybGFjaW5nIGZsYWdcbiIpOworICAgIH0KKworICAgIGlmIChzLT52ZXJzaW9uID4gMyAmJiBhdmN0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID4gRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJWZXIgPiAzIGlzIHVuZGVyIGRldmVsb3BtZW50LCBmaWxlcyBlbmNvZGVkIHdpdGggaXQgbWF5IG5vdCBiZSBkZWNvZGFibGUgd2l0aCBmdXR1cmUgdmVyc2lvbnMhISFcbiIKKyAgICAgICAgICAgICAgICJVc2UgdnN0cmljdD0tMiAvIC1zdHJpY3QgLTIgdG8gdXNlIGl0IGFueXdheS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChzLT5iaXRzdHJlYW1fYnBwID49IDI0ICYmIHMtPnByZWRpY3RvciA9PSBNRURJQU4gJiYgcy0+dmVyc2lvbiA8PSAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkVycm9yOiBSR0IgaXMgaW5jb21wYXRpYmxlIHdpdGggbWVkaWFuIHByZWRpY3RvclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgKCh1aW50OF90KilhdmN0eC0+ZXh0cmFkYXRhKVswXSA9IHMtPnByZWRpY3RvciB8IChzLT5kZWNvcnJlbGF0ZSA8PCA2KTsKKyAgICAoKHVpbnQ4X3QqKWF2Y3R4LT5leHRyYWRhdGEpWzJdID0gcy0+aW50ZXJsYWNlZCA/IDB4MTAgOiAweDIwOworICAgIGlmIChzLT5jb250ZXh0KQorICAgICAgICAoKHVpbnQ4X3QqKWF2Y3R4LT5leHRyYWRhdGEpWzJdIHw9IDB4NDA7CisgICAgaWYgKHMtPnZlcnNpb24gPCAzKSB7CisgICAgICAgICgodWludDhfdCopYXZjdHgtPmV4dHJhZGF0YSlbMV0gPSBzLT5iaXRzdHJlYW1fYnBwOworICAgICAgICAoKHVpbnQ4X3QqKWF2Y3R4LT5leHRyYWRhdGEpWzNdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAoKHVpbnQ4X3QqKWF2Y3R4LT5leHRyYWRhdGEpWzFdID0gKChzLT5icHMtMSk8PDQpIHwgcy0+Y2hyb21hX2hfc2hpZnQgfCAocy0+Y2hyb21hX3Zfc2hpZnQ8PDIpOworICAgICAgICBpZiAocy0+Y2hyb21hKQorICAgICAgICAgICAgKCh1aW50OF90KilhdmN0eC0+ZXh0cmFkYXRhKVsyXSB8PSBzLT55dXYgPyAxIDogMjsKKyAgICAgICAgaWYgKHMtPmFscGhhKQorICAgICAgICAgICAgKCh1aW50OF90KilhdmN0eC0+ZXh0cmFkYXRhKVsyXSB8PSA0OworICAgICAgICAoKHVpbnQ4X3QqKWF2Y3R4LT5leHRyYWRhdGEpWzNdID0gMTsKKyAgICB9CisgICAgcy0+YXZjdHgtPmV4dHJhZGF0YV9zaXplID0gNDsKKworICAgIGlmIChhdmN0eC0+c3RhdHNfaW4pIHsKKyAgICAgICAgY2hhciAqcCA9IGF2Y3R4LT5zdGF0c19pbjsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnZsY19uOyBqKyspCisgICAgICAgICAgICAgICAgcy0+c3RhdHNbaV1bal0gPSAxOworCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaGFyICpuZXh0OworCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnZsY19uOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+c3RhdHNbaV1bal0gKz0gc3RydG9sKHAsICZuZXh0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gcCkgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBwID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocFswXSA9PSAwIHx8IHBbMV0gPT0gMCB8fCBwWzJdID09IDApIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT52bGNfbjsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGQgPSBGRk1JTihqLCBzLT52bGNfbiAtIGopOworCisgICAgICAgICAgICAgICAgcy0+c3RhdHNbaV1bal0gPSAxMDAwMDAwMDAgLyAoZCpkICsgMSk7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gc3RvcmVfaHVmZm1hbl90YWJsZXMocywgcy0+YXZjdHgtPmV4dHJhZGF0YSArIHMtPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcy0+YXZjdHgtPmV4dHJhZGF0YV9zaXplICs9IHJldDsKKworICAgIGlmIChzLT5jb250ZXh0KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGludCBwZWxzID0gcy0+d2lkdGggKiBzLT5oZWlnaHQgLyAoaSA/IDQwIDogMTApOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnZsY19uOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgZCA9IEZGTUlOKGosIHMtPnZsY19uIC0gaik7CisgICAgICAgICAgICAgICAgcy0+c3RhdHNbaV1bal0gPSBwZWxzLyhkKmQgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+dmxjX247IGorKykKKyAgICAgICAgICAgICAgICBzLT5zdGF0c1tpXVtqXT0gMDsKKyAgICB9CisKKyAgICBpZiAoZmZfaHVmZnl1dl9hbGxvY190ZW1wKHMpKSB7CisgICAgICAgIGZmX2h1ZmZ5dXZfY29tbW9uX2VuZChzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBzLT5waWN0dXJlX251bWJlcj0wOworCisgICAgcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGVuY29kZV80MjJfYml0c3RyZWFtKEhZdXZDb250ZXh0ICpzLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgdWludDhfdCAqeSA9IHMtPnRlbXBbMF0gKyBvZmZzZXQ7CisgICAgY29uc3QgdWludDhfdCAqdSA9IHMtPnRlbXBbMV0gKyBvZmZzZXQgLyAyOworICAgIGNvbnN0IHVpbnQ4X3QgKnYgPSBzLT50ZW1wWzJdICsgb2Zmc2V0IC8gMjsKKworICAgIGlmIChzLT5wYi5idWZfZW5kIC0gcy0+cGIuYnVmIC0gKHB1dF9iaXRzX2NvdW50KCZzLT5wYikgPj4gMykgPCAyICogNCAqIGNvdW50KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5jb2RlZCBmcmFtZSB0b28gbGFyZ2VcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisjZGVmaW5lIExPQUQ0XAorICAgICAgICAgICAgaW50IHkwID0geVsyICogaV07XAorICAgICAgICAgICAgaW50IHkxID0geVsyICogaSArIDFdO1wKKyAgICAgICAgICAgIGludCB1MCA9IHVbaV07XAorICAgICAgICAgICAgaW50IHYwID0gdltpXTsKKworICAgIGNvdW50IC89IDI7CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1BBU1MxKSB7CisgICAgICAgIGZvcihpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIExPQUQ0OworICAgICAgICAgICAgcy0+c3RhdHNbMF1beTBdKys7CisgICAgICAgICAgICBzLT5zdGF0c1sxXVt1MF0rKzsKKyAgICAgICAgICAgIHMtPnN0YXRzWzBdW3kxXSsrOworICAgICAgICAgICAgcy0+c3RhdHNbMl1bdjBdKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPmF2Y3R4LT5mbGFnczIgJiBDT0RFQ19GTEFHMl9OT19PVVRQVVQpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChzLT5jb250ZXh0KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBMT0FENDsKKyAgICAgICAgICAgIHMtPnN0YXRzWzBdW3kwXSsrOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5sZW5bMF1beTBdLCBzLT5iaXRzWzBdW3kwXSk7CisgICAgICAgICAgICBzLT5zdGF0c1sxXVt1MF0rKzsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcy0+bGVuWzFdW3UwXSwgcy0+Yml0c1sxXVt1MF0pOworICAgICAgICAgICAgcy0+c3RhdHNbMF1beTFdKys7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIHMtPmxlblswXVt5MV0sIHMtPmJpdHNbMF1beTFdKTsKKyAgICAgICAgICAgIHMtPnN0YXRzWzJdW3YwXSsrOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5sZW5bMl1bdjBdLCBzLT5iaXRzWzJdW3YwXSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBMT0FENDsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcy0+bGVuWzBdW3kwXSwgcy0+Yml0c1swXVt5MF0pOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5sZW5bMV1bdTBdLCBzLT5iaXRzWzFdW3UwXSk7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIHMtPmxlblswXVt5MV0sIHMtPmJpdHNbMF1beTFdKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcy0+bGVuWzJdW3YwXSwgcy0+Yml0c1syXVt2MF0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9wbGFuZV9iaXRzdHJlYW0oSFl1dkNvbnRleHQgKnMsIGludCB3aWR0aCwgaW50IHBsYW5lKQoreworICAgIGludCBpLCBjb3VudCA9IHdpZHRoLzI7CisKKyAgICBpZiAocy0+cGIuYnVmX2VuZCAtIHMtPnBiLmJ1ZiAtIChwdXRfYml0c19jb3VudCgmcy0+cGIpID4+IDMpIDwgY291bnQgKiBzLT5icHMgLyAyKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5jb2RlZCBmcmFtZSB0b28gbGFyZ2VcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisjZGVmaW5lIExPQURFTkRcCisgICAgICAgICAgICBpbnQgeTAgPSBzLT50ZW1wWzBdW3dpZHRoLTFdOworI2RlZmluZSBMT0FERU5EXzE0XAorICAgICAgICAgICAgaW50IHkwID0gcy0+dGVtcDE2WzBdW3dpZHRoLTFdICYgbWFzazsKKyNkZWZpbmUgTE9BREVORF8xNlwKKyAgICAgICAgICAgIGludCB5MCA9IHMtPnRlbXAxNlswXVt3aWR0aC0xXTsKKyNkZWZpbmUgU1RBVEVORFwKKyAgICAgICAgICAgIHMtPnN0YXRzW3BsYW5lXVt5MF0rKzsKKyNkZWZpbmUgU1RBVEVORF8xNlwKKyAgICAgICAgICAgIHMtPnN0YXRzW3BsYW5lXVt5MD4+Ml0rKzsKKyNkZWZpbmUgV1JJVEVFTkRcCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIHMtPmxlbltwbGFuZV1beTBdLCBzLT5iaXRzW3BsYW5lXVt5MF0pOworI2RlZmluZSBXUklURUVORF8xNlwKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcy0+bGVuW3BsYW5lXVt5MD4+Ml0sIHMtPmJpdHNbcGxhbmVdW3kwPj4yXSk7XAorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCB5MCYzKTsKKworI2RlZmluZSBMT0FEMlwKKyAgICAgICAgICAgIGludCB5MCA9IHMtPnRlbXBbMF1bMiAqIGldO1wKKyAgICAgICAgICAgIGludCB5MSA9IHMtPnRlbXBbMF1bMiAqIGkgKyAxXTsKKyNkZWZpbmUgTE9BRDJfMTRcCisgICAgICAgICAgICBpbnQgeTAgPSBzLT50ZW1wMTZbMF1bMiAqIGldICYgbWFzaztcCisgICAgICAgICAgICBpbnQgeTEgPSBzLT50ZW1wMTZbMF1bMiAqIGkgKyAxXSAmIG1hc2s7CisjZGVmaW5lIExPQUQyXzE2XAorICAgICAgICAgICAgaW50IHkwID0gcy0+dGVtcDE2WzBdWzIgKiBpXTtcCisgICAgICAgICAgICBpbnQgeTEgPSBzLT50ZW1wMTZbMF1bMiAqIGkgKyAxXTsKKyNkZWZpbmUgU1RBVDJcCisgICAgICAgICAgICBzLT5zdGF0c1twbGFuZV1beTBdKys7XAorICAgICAgICAgICAgcy0+c3RhdHNbcGxhbmVdW3kxXSsrOworI2RlZmluZSBTVEFUMl8xNlwKKyAgICAgICAgICAgIHMtPnN0YXRzW3BsYW5lXVt5MD4+Ml0rKztcCisgICAgICAgICAgICBzLT5zdGF0c1twbGFuZV1beTE+PjJdKys7CisjZGVmaW5lIFdSSVRFMlwKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcy0+bGVuW3BsYW5lXVt5MF0sIHMtPmJpdHNbcGxhbmVdW3kwXSk7XAorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5sZW5bcGxhbmVdW3kxXSwgcy0+Yml0c1twbGFuZV1beTFdKTsKKyNkZWZpbmUgV1JJVEUyXzE2XAorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5sZW5bcGxhbmVdW3kwPj4yXSwgcy0+Yml0c1twbGFuZV1beTA+PjJdKTtcCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIHkwJjMpO1wKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcy0+bGVuW3BsYW5lXVt5MT4+Ml0sIHMtPmJpdHNbcGxhbmVdW3kxPj4yXSk7XAorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCB5MSYzKTsKKworICAgIGlmIChzLT5icHMgPD0gOCkgeworICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIExPQUQyOworICAgICAgICAgICAgU1RBVDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdpZHRoJjEpIHsKKyAgICAgICAgICAgIExPQURFTkQ7CisgICAgICAgICAgICBTVEFURU5EOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5hdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfTk9fT1VUUFVUKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzLT5jb250ZXh0KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBMT0FEMjsKKyAgICAgICAgICAgIFNUQVQyOworICAgICAgICAgICAgV1JJVEUyOworICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aCYxKSB7CisgICAgICAgICAgICBMT0FERU5EOworICAgICAgICAgICAgU1RBVEVORDsKKyAgICAgICAgICAgIFdSSVRFRU5EOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIExPQUQyOworICAgICAgICAgICAgV1JJVEUyOworICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aCYxKSB7CisgICAgICAgICAgICBMT0FERU5EOworICAgICAgICAgICAgV1JJVEVFTkQ7CisgICAgICAgIH0KKyAgICB9CisgICAgfSBlbHNlIGlmIChzLT5icHMgPD0gMTQpIHsKKyAgICAgICAgaW50IG1hc2sgPSBzLT5uIC0gMTsKKyAgICAgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19QQVNTMSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBMT0FEMl8xNDsKKyAgICAgICAgICAgICAgICBTVEFUMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3aWR0aCYxKSB7CisgICAgICAgICAgICAgICAgTE9BREVORF8xNDsKKyAgICAgICAgICAgICAgICBTVEFURU5EOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzLT5hdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfTk9fT1VUUFVUKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKHMtPmNvbnRleHQpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgTE9BRDJfMTQ7CisgICAgICAgICAgICAgICAgU1RBVDI7CisgICAgICAgICAgICAgICAgV1JJVEUyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdpZHRoJjEpIHsKKyAgICAgICAgICAgICAgICBMT0FERU5EXzE0OworICAgICAgICAgICAgICAgIFNUQVRFTkQ7CisgICAgICAgICAgICAgICAgV1JJVEVFTkQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIExPQUQyXzE0OworICAgICAgICAgICAgICAgIFdSSVRFMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3aWR0aCYxKSB7CisgICAgICAgICAgICAgICAgTE9BREVORF8xNDsKKyAgICAgICAgICAgICAgICBXUklURUVORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzEpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgTE9BRDJfMTY7CisgICAgICAgICAgICAgICAgU1RBVDJfMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod2lkdGgmMSkgeworICAgICAgICAgICAgICAgIExPQURFTkRfMTY7CisgICAgICAgICAgICAgICAgU1RBVEVORF8xNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocy0+YXZjdHgtPmZsYWdzMiAmIENPREVDX0ZMQUcyX05PX09VVFBVVCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChzLT5jb250ZXh0KSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIExPQUQyXzE2OworICAgICAgICAgICAgICAgIFNUQVQyXzE2OworICAgICAgICAgICAgICAgIFdSSVRFMl8xNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3aWR0aCYxKSB7CisgICAgICAgICAgICAgICAgTE9BREVORF8xNjsKKyAgICAgICAgICAgICAgICBTVEFURU5EXzE2OworICAgICAgICAgICAgICAgIFdSSVRFRU5EXzE2OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBMT0FEMl8xNjsKKyAgICAgICAgICAgICAgICBXUklURTJfMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod2lkdGgmMSkgeworICAgICAgICAgICAgICAgIExPQURFTkRfMTY7CisgICAgICAgICAgICAgICAgV1JJVEVFTkRfMTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjdW5kZWYgTE9BRDIKKyN1bmRlZiBTVEFUMgorI3VuZGVmIFdSSVRFMgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9ncmF5X2JpdHN0cmVhbShIWXV2Q29udGV4dCAqcywgaW50IGNvdW50KQoreworICAgIGludCBpOworCisgICAgaWYgKHMtPnBiLmJ1Zl9lbmQgLSBzLT5wYi5idWYgLSAocHV0X2JpdHNfY291bnQoJnMtPnBiKSA+PiAzKSA8IDQgKiBjb3VudCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVuY29kZWQgZnJhbWUgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworI2RlZmluZSBMT0FEMlwKKyAgICAgICAgICAgIGludCB5MCA9IHMtPnRlbXBbMF1bMiAqIGldO1wKKyAgICAgICAgICAgIGludCB5MSA9IHMtPnRlbXBbMF1bMiAqIGkgKyAxXTsKKyNkZWZpbmUgU1RBVDJcCisgICAgICAgICAgICBzLT5zdGF0c1swXVt5MF0rKztcCisgICAgICAgICAgICBzLT5zdGF0c1swXVt5MV0rKzsKKyNkZWZpbmUgV1JJVEUyXAorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5sZW5bMF1beTBdLCBzLT5iaXRzWzBdW3kwXSk7XAorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5sZW5bMF1beTFdLCBzLT5iaXRzWzBdW3kxXSk7CisKKyAgICBjb3VudCAvPSAyOworCisgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19QQVNTMSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgTE9BRDI7CisgICAgICAgICAgICBTVEFUMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+YXZjdHgtPmZsYWdzMiAmIENPREVDX0ZMQUcyX05PX09VVFBVVCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocy0+Y29udGV4dCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgTE9BRDI7CisgICAgICAgICAgICBTVEFUMjsKKyAgICAgICAgICAgIFdSSVRFMjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBMT0FEMjsKKyAgICAgICAgICAgIFdSSVRFMjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZW5jb2RlX2JncmFfYml0c3RyZWFtKEhZdXZDb250ZXh0ICpzLCBpbnQgY291bnQsIGludCBwbGFuZXMpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAocy0+cGIuYnVmX2VuZCAtIHMtPnBiLmJ1ZiAtIChwdXRfYml0c19jb3VudCgmcy0+cGIpID4+IDMpIDwKKyAgICAgICAgNCAqIHBsYW5lcyAqIGNvdW50KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5jb2RlZCBmcmFtZSB0b28gbGFyZ2VcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisjZGVmaW5lIExPQURfR0JSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGcgPSBzLT50ZW1wWzBdW3BsYW5lcyA9PSAzID8gMyAqIGkgKyAxIDogNCAqIGkgKyBHXTsgICAgICAgICAgICBcCisgICAgaW50IGIgPShzLT50ZW1wWzBdW3BsYW5lcyA9PSAzID8gMyAqIGkgKyAyIDogNCAqIGkgKyBCXSAtIGcpICYgMHhGRjtcCisgICAgaW50IHIgPShzLT50ZW1wWzBdW3BsYW5lcyA9PSAzID8gMyAqIGkgKyAwIDogNCAqIGkgKyBSXSAtIGcpICYgMHhGRjtcCisgICAgaW50IGEgPSBzLT50ZW1wWzBdW3BsYW5lcyAqIGkgKyBBXTsKKworI2RlZmluZSBTVEFUX0JHUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHMtPnN0YXRzWzBdW2JdKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHMtPnN0YXRzWzFdW2ddKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHMtPnN0YXRzWzJdW3JdKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChwbGFuZXMgPT0gNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzLT5zdGF0c1syXVthXSsrOworCisjZGVmaW5lIFdSSVRFX0dCUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5sZW5bMV1bZ10sIHMtPmJpdHNbMV1bZ10pOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5sZW5bMF1bYl0sIHMtPmJpdHNbMF1bYl0pOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5sZW5bMl1bcl0sIHMtPmJpdHNbMl1bcl0pOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHBsYW5lcyA9PSA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcy0+bGVuWzJdW2FdLCBzLT5iaXRzWzJdW2FdKTsKKworICAgIGlmICgocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1BBU1MxKSAmJgorICAgICAgICAocy0+YXZjdHgtPmZsYWdzMiAmIENPREVDX0ZMQUcyX05PX09VVFBVVCkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIExPQURfR0JSQTsKKyAgICAgICAgICAgIFNUQVRfQkdSQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocy0+Y29udGV4dCB8fCAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1BBU1MxKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgTE9BRF9HQlJBOworICAgICAgICAgICAgU1RBVF9CR1JBOworICAgICAgICAgICAgV1JJVEVfR0JSQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBMT0FEX0dCUkE7CisgICAgICAgICAgICBXUklURV9HQlJBOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWN0LCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgSFl1dkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IGludCB3aWR0aCA9IHMtPndpZHRoOworICAgIGNvbnN0IGludCB3aWR0aDIgPSBzLT53aWR0aD4+MTsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcy0+aGVpZ2h0OworICAgIGNvbnN0IGludCBmYWtlX3lzdHJpZGUgPSBzLT5pbnRlcmxhY2VkID8gcGljdC0+bGluZXNpemVbMF0qMiAgOiBwaWN0LT5saW5lc2l6ZVswXTsKKyAgICBjb25zdCBpbnQgZmFrZV91c3RyaWRlID0gcy0+aW50ZXJsYWNlZCA/IHBpY3QtPmxpbmVzaXplWzFdKjIgIDogcGljdC0+bGluZXNpemVbMV07CisgICAgY29uc3QgaW50IGZha2VfdnN0cmlkZSA9IHMtPmludGVybGFjZWQgPyBwaWN0LT5saW5lc2l6ZVsyXSoyICA6IHBpY3QtPmxpbmVzaXplWzJdOworICAgIGNvbnN0IEFWRnJhbWUgKiBjb25zdCBwID0gcGljdDsKKyAgICBpbnQgaSwgaiwgc2l6ZSA9IDAsIHJldDsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCB3aWR0aCAqIGhlaWdodCAqIDMgKiA0ICsgRkZfTUlOX0JVRkZFUl9TSVpFKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHMtPmNvbnRleHQpIHsKKyAgICAgICAgc2l6ZSA9IHN0b3JlX2h1ZmZtYW5fdGFibGVzKHMsIHBrdC0+ZGF0YSk7CisgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBzaXplOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+dmxjX247IGorKykKKyAgICAgICAgICAgICAgICBzLT5zdGF0c1tpXVtqXSA+Pj0gMTsKKyAgICB9CisKKyAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgcGt0LT5kYXRhICsgc2l6ZSwgcGt0LT5zaXplIC0gc2l6ZSk7CisKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQIHx8CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgeworICAgICAgICBpbnQgbGVmdHksIGxlZnR1LCBsZWZ0diwgeSwgY3k7CisKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCBsZWZ0diA9IHAtPmRhdGFbMl1bMF0pOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIGxlZnR5ID0gcC0+ZGF0YVswXVsxXSk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgbGVmdHUgPSBwLT5kYXRhWzFdWzBdKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCAgICAgICAgIHAtPmRhdGFbMF1bMF0pOworCisgICAgICAgIGxlZnR5ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzBdLCBwLT5kYXRhWzBdLCB3aWR0aCAsIDApOworICAgICAgICBsZWZ0dSA9IHN1Yl9sZWZ0X3ByZWRpY3Rpb24ocywgcy0+dGVtcFsxXSwgcC0+ZGF0YVsxXSwgd2lkdGgyLCAwKTsKKyAgICAgICAgbGVmdHYgPSBzdWJfbGVmdF9wcmVkaWN0aW9uKHMsIHMtPnRlbXBbMl0sIHAtPmRhdGFbMl0sIHdpZHRoMiwgMCk7CisKKyAgICAgICAgZW5jb2RlXzQyMl9iaXRzdHJlYW0ocywgMiwgd2lkdGgtMik7CisKKyAgICAgICAgaWYgKHMtPnByZWRpY3Rvcj09TUVESUFOKSB7CisgICAgICAgICAgICBpbnQgbGVmdHRvcHksIGxlZnR0b3B1LCBsZWZ0dG9wdjsKKyAgICAgICAgICAgIGN5ID0geSA9IDE7CisgICAgICAgICAgICBpZiAocy0+aW50ZXJsYWNlZCkgeworICAgICAgICAgICAgICAgIGxlZnR5ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzBdLCBwLT5kYXRhWzBdICsgcC0+bGluZXNpemVbMF0sIHdpZHRoICwgbGVmdHkpOworICAgICAgICAgICAgICAgIGxlZnR1ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzFdLCBwLT5kYXRhWzFdICsgcC0+bGluZXNpemVbMV0sIHdpZHRoMiwgbGVmdHUpOworICAgICAgICAgICAgICAgIGxlZnR2ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzJdLCBwLT5kYXRhWzJdICsgcC0+bGluZXNpemVbMl0sIHdpZHRoMiwgbGVmdHYpOworCisgICAgICAgICAgICAgICAgZW5jb2RlXzQyMl9iaXRzdHJlYW0ocywgMCwgd2lkdGgpOworICAgICAgICAgICAgICAgIHkrKzsgY3krKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVmdHkgPSBzdWJfbGVmdF9wcmVkaWN0aW9uKHMsIHMtPnRlbXBbMF0sIHAtPmRhdGFbMF0gKyBmYWtlX3lzdHJpZGUsIDQsIGxlZnR5KTsKKyAgICAgICAgICAgIGxlZnR1ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzFdLCBwLT5kYXRhWzFdICsgZmFrZV91c3RyaWRlLCAyLCBsZWZ0dSk7CisgICAgICAgICAgICBsZWZ0diA9IHN1Yl9sZWZ0X3ByZWRpY3Rpb24ocywgcy0+dGVtcFsyXSwgcC0+ZGF0YVsyXSArIGZha2VfdnN0cmlkZSwgMiwgbGVmdHYpOworCisgICAgICAgICAgICBlbmNvZGVfNDIyX2JpdHN0cmVhbShzLCAwLCA0KTsKKworICAgICAgICAgICAgbGVmdHRvcHkgPSBwLT5kYXRhWzBdWzNdOworICAgICAgICAgICAgbGVmdHRvcHUgPSBwLT5kYXRhWzFdWzFdOworICAgICAgICAgICAgbGVmdHRvcHYgPSBwLT5kYXRhWzJdWzFdOworICAgICAgICAgICAgcy0+aGVuY2RzcC5zdWJfaGZ5dV9tZWRpYW5fcHJlZChzLT50ZW1wWzBdLCBwLT5kYXRhWzBdICsgNCwgcC0+ZGF0YVswXSArIGZha2VfeXN0cmlkZSArIDQsIHdpZHRoICAtIDQsICZsZWZ0eSwgJmxlZnR0b3B5KTsKKyAgICAgICAgICAgIHMtPmhlbmNkc3Auc3ViX2hmeXVfbWVkaWFuX3ByZWQocy0+dGVtcFsxXSwgcC0+ZGF0YVsxXSArIDIsIHAtPmRhdGFbMV0gKyBmYWtlX3VzdHJpZGUgKyAyLCB3aWR0aDIgLSAyLCAmbGVmdHUsICZsZWZ0dG9wdSk7CisgICAgICAgICAgICBzLT5oZW5jZHNwLnN1Yl9oZnl1X21lZGlhbl9wcmVkKHMtPnRlbXBbMl0sIHAtPmRhdGFbMl0gKyAyLCBwLT5kYXRhWzJdICsgZmFrZV92c3RyaWRlICsgMiwgd2lkdGgyIC0gMiwgJmxlZnR2LCAmbGVmdHRvcHYpOworICAgICAgICAgICAgZW5jb2RlXzQyMl9iaXRzdHJlYW0ocywgMCwgd2lkdGggLSA0KTsKKyAgICAgICAgICAgIHkrKzsgY3krKzsKKworICAgICAgICAgICAgZm9yICg7IHkgPCBoZWlnaHQ7IHkrKyxjeSsrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqeWRzdCwgKnVkc3QsICp2ZHN0OworCisgICAgICAgICAgICAgICAgaWYgKHMtPmJpdHN0cmVhbV9icHAgPT0gMTIpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDIgKiBjeSA+IHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHlkc3QgPSBwLT5kYXRhWzBdICsgcC0+bGluZXNpemVbMF0gKiB5OworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGVuY2RzcC5zdWJfaGZ5dV9tZWRpYW5fcHJlZChzLT50ZW1wWzBdLCB5ZHN0IC0gZmFrZV95c3RyaWRlLCB5ZHN0LCB3aWR0aCwgJmxlZnR5LCAmbGVmdHRvcHkpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2dyYXlfYml0c3RyZWFtKHMsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoeSA+PSBoZWlnaHQpIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB5ZHN0ID0gcC0+ZGF0YVswXSArIHAtPmxpbmVzaXplWzBdICogeTsKKyAgICAgICAgICAgICAgICB1ZHN0ID0gcC0+ZGF0YVsxXSArIHAtPmxpbmVzaXplWzFdICogY3k7CisgICAgICAgICAgICAgICAgdmRzdCA9IHAtPmRhdGFbMl0gKyBwLT5saW5lc2l6ZVsyXSAqIGN5OworCisgICAgICAgICAgICAgICAgcy0+aGVuY2RzcC5zdWJfaGZ5dV9tZWRpYW5fcHJlZChzLT50ZW1wWzBdLCB5ZHN0IC0gZmFrZV95c3RyaWRlLCB5ZHN0LCB3aWR0aCwgICZsZWZ0eSwgJmxlZnR0b3B5KTsKKyAgICAgICAgICAgICAgICBzLT5oZW5jZHNwLnN1Yl9oZnl1X21lZGlhbl9wcmVkKHMtPnRlbXBbMV0sIHVkc3QgLSBmYWtlX3VzdHJpZGUsIHVkc3QsIHdpZHRoMiwgJmxlZnR1LCAmbGVmdHRvcHUpOworICAgICAgICAgICAgICAgIHMtPmhlbmNkc3Auc3ViX2hmeXVfbWVkaWFuX3ByZWQocy0+dGVtcFsyXSwgdmRzdCAtIGZha2VfdnN0cmlkZSwgdmRzdCwgd2lkdGgyLCAmbGVmdHYsICZsZWZ0dG9wdik7CisKKyAgICAgICAgICAgICAgICBlbmNvZGVfNDIyX2JpdHN0cmVhbShzLCAwLCB3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGN5ID0geSA9IDE7IHkgPCBoZWlnaHQ7IHkrKywgY3krKykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnlkc3QsICp1ZHN0LCAqdmRzdDsKKworICAgICAgICAgICAgICAgIC8qIGVuY29kZSBhIGx1bWEgb25seSBsaW5lICYgeSsrICovCisgICAgICAgICAgICAgICAgaWYgKHMtPmJpdHN0cmVhbV9icHAgPT0gMTIpIHsKKyAgICAgICAgICAgICAgICAgICAgeWRzdCA9IHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSAqIHk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnByZWRpY3RvciA9PSBQTEFORSAmJiBzLT5pbnRlcmxhY2VkIDwgeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGVuY2RzcC5kaWZmX2J5dGVzKHMtPnRlbXBbMV0sIHlkc3QsIHlkc3QgLSBmYWtlX3lzdHJpZGUsIHdpZHRoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdHkgPSBzdWJfbGVmdF9wcmVkaWN0aW9uKHMsIHMtPnRlbXBbMF0sIHMtPnRlbXBbMV0sIHdpZHRoICwgbGVmdHkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdHkgPSBzdWJfbGVmdF9wcmVkaWN0aW9uKHMsIHMtPnRlbXBbMF0sIHlkc3QsIHdpZHRoICwgbGVmdHkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVuY29kZV9ncmF5X2JpdHN0cmVhbShzLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHkrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHkgPj0gaGVpZ2h0KSBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB5ZHN0ID0gcC0+ZGF0YVswXSArIHAtPmxpbmVzaXplWzBdICogeTsKKyAgICAgICAgICAgICAgICB1ZHN0ID0gcC0+ZGF0YVsxXSArIHAtPmxpbmVzaXplWzFdICogY3k7CisgICAgICAgICAgICAgICAgdmRzdCA9IHAtPmRhdGFbMl0gKyBwLT5saW5lc2l6ZVsyXSAqIGN5OworCisgICAgICAgICAgICAgICAgaWYgKHMtPnByZWRpY3RvciA9PSBQTEFORSAmJiBzLT5pbnRlcmxhY2VkIDwgY3kpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+aGVuY2RzcC5kaWZmX2J5dGVzKHMtPnRlbXBbMV0sICAgICAgICAgIHlkc3QsIHlkc3QgLSBmYWtlX3lzdHJpZGUsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+aGVuY2RzcC5kaWZmX2J5dGVzKHMtPnRlbXBbMl0sICAgICAgICAgIHVkc3QsIHVkc3QgLSBmYWtlX3VzdHJpZGUsIHdpZHRoMik7CisgICAgICAgICAgICAgICAgICAgIHMtPmhlbmNkc3AuZGlmZl9ieXRlcyhzLT50ZW1wWzJdICsgd2lkdGgyLCB2ZHN0LCB2ZHN0IC0gZmFrZV92c3RyaWRlLCB3aWR0aDIpOworCisgICAgICAgICAgICAgICAgICAgIGxlZnR5ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzBdLCBzLT50ZW1wWzFdLCB3aWR0aCAsIGxlZnR5KTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdHUgPSBzdWJfbGVmdF9wcmVkaWN0aW9uKHMsIHMtPnRlbXBbMV0sIHMtPnRlbXBbMl0sIHdpZHRoMiwgbGVmdHUpOworICAgICAgICAgICAgICAgICAgICBsZWZ0diA9IHN1Yl9sZWZ0X3ByZWRpY3Rpb24ocywgcy0+dGVtcFsyXSwgcy0+dGVtcFsyXSArIHdpZHRoMiwgd2lkdGgyLCBsZWZ0dik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGVmdHkgPSBzdWJfbGVmdF9wcmVkaWN0aW9uKHMsIHMtPnRlbXBbMF0sIHlkc3QsIHdpZHRoICwgbGVmdHkpOworICAgICAgICAgICAgICAgICAgICBsZWZ0dSA9IHN1Yl9sZWZ0X3ByZWRpY3Rpb24ocywgcy0+dGVtcFsxXSwgdWRzdCwgd2lkdGgyLCBsZWZ0dSk7CisgICAgICAgICAgICAgICAgICAgIGxlZnR2ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzJdLCB2ZHN0LCB3aWR0aDIsIGxlZnR2KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlbmNvZGVfNDIyX2JpdHN0cmVhbShzLCAwLCB3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IzMikgeworICAgICAgICB1aW50OF90ICpkYXRhID0gcC0+ZGF0YVswXSArIChoZWlnaHQgLSAxKSAqIHAtPmxpbmVzaXplWzBdOworICAgICAgICBjb25zdCBpbnQgc3RyaWRlID0gLXAtPmxpbmVzaXplWzBdOworICAgICAgICBjb25zdCBpbnQgZmFrZV9zdHJpZGUgPSAtZmFrZV95c3RyaWRlOworICAgICAgICBpbnQgeTsKKyAgICAgICAgaW50IGxlZnRyLCBsZWZ0ZywgbGVmdGIsIGxlZnRhOworCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgbGVmdGEgPSBkYXRhW0FdKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCBsZWZ0ciA9IGRhdGFbUl0pOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIGxlZnRnID0gZGF0YVtHXSk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgbGVmdGIgPSBkYXRhW0JdKTsKKworICAgICAgICBzdWJfbGVmdF9wcmVkaWN0aW9uX2JncjMyKHMsIHMtPnRlbXBbMF0sIGRhdGEgKyA0LCB3aWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnRyLCAmbGVmdGcsICZsZWZ0YiwgJmxlZnRhKTsKKyAgICAgICAgZW5jb2RlX2JncmFfYml0c3RyZWFtKHMsIHdpZHRoIC0gMSwgNCk7CisKKyAgICAgICAgZm9yICh5ID0gMTsgeSA8IHMtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBkYXRhICsgeSpzdHJpZGU7CisgICAgICAgICAgICBpZiAocy0+cHJlZGljdG9yID09IFBMQU5FICYmIHMtPmludGVybGFjZWQgPCB5KSB7CisgICAgICAgICAgICAgICAgcy0+aGVuY2RzcC5kaWZmX2J5dGVzKHMtPnRlbXBbMV0sIGRzdCwgZHN0IC0gZmFrZV9zdHJpZGUsIHdpZHRoICogNCk7CisgICAgICAgICAgICAgICAgc3ViX2xlZnRfcHJlZGljdGlvbl9iZ3IzMihzLCBzLT50ZW1wWzBdLCBzLT50ZW1wWzFdLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0ciwgJmxlZnRnLCAmbGVmdGIsICZsZWZ0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1Yl9sZWZ0X3ByZWRpY3Rpb25fYmdyMzIocywgcy0+dGVtcFswXSwgZHN0LCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0ciwgJmxlZnRnLCAmbGVmdGIsICZsZWZ0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmNvZGVfYmdyYV9iaXRzdHJlYW0ocywgd2lkdGgsIDQpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBwLT5kYXRhWzBdICsgKGhlaWdodCAtIDEpICogcC0+bGluZXNpemVbMF07CisgICAgICAgIGNvbnN0IGludCBzdHJpZGUgPSAtcC0+bGluZXNpemVbMF07CisgICAgICAgIGNvbnN0IGludCBmYWtlX3N0cmlkZSA9IC1mYWtlX3lzdHJpZGU7CisgICAgICAgIGludCB5OworICAgICAgICBpbnQgbGVmdHIsIGxlZnRnLCBsZWZ0YjsKKworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIGxlZnRyID0gZGF0YVswXSk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgbGVmdGcgPSBkYXRhWzFdKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCBsZWZ0YiA9IGRhdGFbMl0pOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIDApOworCisgICAgICAgIHN1Yl9sZWZ0X3ByZWRpY3Rpb25fcmdiMjQocywgcy0+dGVtcFswXSwgZGF0YSArIDMsIHdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdHIsICZsZWZ0ZywgJmxlZnRiKTsKKyAgICAgICAgZW5jb2RlX2JncmFfYml0c3RyZWFtKHMsIHdpZHRoLTEsIDMpOworCisgICAgICAgIGZvciAoeSA9IDE7IHkgPCBzLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gZGF0YSArIHkgKiBzdHJpZGU7CisgICAgICAgICAgICBpZiAocy0+cHJlZGljdG9yID09IFBMQU5FICYmIHMtPmludGVybGFjZWQgPCB5KSB7CisgICAgICAgICAgICAgICAgcy0+aGVuY2RzcC5kaWZmX2J5dGVzKHMtPnRlbXBbMV0sIGRzdCwgZHN0IC0gZmFrZV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICogMyk7CisgICAgICAgICAgICAgICAgc3ViX2xlZnRfcHJlZGljdGlvbl9yZ2IyNChzLCBzLT50ZW1wWzBdLCBzLT50ZW1wWzFdLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0ciwgJmxlZnRnLCAmbGVmdGIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdWJfbGVmdF9wcmVkaWN0aW9uX3JnYjI0KHMsIHMtPnRlbXBbMF0sIGRzdCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdHIsICZsZWZ0ZywgJmxlZnRiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuY29kZV9iZ3JhX2JpdHN0cmVhbShzLCB3aWR0aCwgMyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHMtPnZlcnNpb24gPiAyKSB7CisgICAgICAgIGludCBwbGFuZTsKKyAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMSArIDIqcy0+Y2hyb21hICsgcy0+YWxwaGE7IHBsYW5lKyspIHsKKyAgICAgICAgICAgIGludCBsZWZ0LCB5OworICAgICAgICAgICAgaW50IHcgPSB3aWR0aDsKKyAgICAgICAgICAgIGludCBoID0gaGVpZ2h0OworICAgICAgICAgICAgaW50IGZha2Vfc3RyaWRlID0gZmFrZV95c3RyaWRlOworCisgICAgICAgICAgICBpZiAocy0+Y2hyb21hICYmIChwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIpKSB7CisgICAgICAgICAgICAgICAgdyA+Pj0gcy0+Y2hyb21hX2hfc2hpZnQ7CisgICAgICAgICAgICAgICAgaCA+Pj0gcy0+Y2hyb21hX3Zfc2hpZnQ7CisgICAgICAgICAgICAgICAgZmFrZV9zdHJpZGUgPSBwbGFuZSA9PSAxID8gZmFrZV91c3RyaWRlIDogZmFrZV92c3RyaWRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZWZ0ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzBdLCBwLT5kYXRhW3BsYW5lXSwgdyAsIDApOworCisgICAgICAgICAgICBlbmNvZGVfcGxhbmVfYml0c3RyZWFtKHMsIHcsIHBsYW5lKTsKKworICAgICAgICAgICAgaWYgKHMtPnByZWRpY3Rvcj09TUVESUFOKSB7CisgICAgICAgICAgICAgICAgaW50IGxlZnR0b3A7CisgICAgICAgICAgICAgICAgeSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKHMtPmludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHN1Yl9sZWZ0X3ByZWRpY3Rpb24ocywgcy0+dGVtcFswXSwgcC0+ZGF0YVtwbGFuZV0gKyBwLT5saW5lc2l6ZVtwbGFuZV0sIHcgLCBsZWZ0KTsKKworICAgICAgICAgICAgICAgICAgICBlbmNvZGVfcGxhbmVfYml0c3RyZWFtKHMsIHcsIHBsYW5lKTsKKyAgICAgICAgICAgICAgICAgICAgeSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxlZnR0b3AgPSBwLT5kYXRhW3BsYW5lXVswXTsKKworICAgICAgICAgICAgICAgIGZvciAoOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IHAtPmRhdGFbcGxhbmVdICsgcC0+bGluZXNpemVbcGxhbmVdICogeTsKKworICAgICAgICAgICAgICAgICAgICBzdWJfbWVkaWFuX3ByZWRpY3Rpb24ocywgcy0+dGVtcFswXSwgZHN0IC0gZmFrZV9zdHJpZGUsIGRzdCwgdyAsICZsZWZ0LCAmbGVmdHRvcCk7CisKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX3BsYW5lX2JpdHN0cmVhbShzLCB3LCBwbGFuZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAxOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IHAtPmRhdGFbcGxhbmVdICsgcC0+bGluZXNpemVbcGxhbmVdICogeTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocy0+cHJlZGljdG9yID09IFBMQU5FICYmIHMtPmludGVybGFjZWQgPCB5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWZmX2J5dGVzKHMsIHMtPnRlbXBbMV0sIGRzdCwgZHN0IC0gZmFrZV9zdHJpZGUsIHcpOworCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzBdLCBzLT50ZW1wWzFdLCB3ICwgbGVmdCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzBdLCBkc3QsIHcgLCBsZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVuY29kZV9wbGFuZV9iaXRzdHJlYW0ocywgdywgcGxhbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRm9ybWF0IG5vdCBzdXBwb3J0ZWQhXG4iKTsKKyAgICB9CisgICAgZW1tc19jKCk7CisKKyAgICBzaXplICs9IChwdXRfYml0c19jb3VudCgmcy0+cGIpICsgMzEpIC8gODsKKyAgICBwdXRfYml0cygmcy0+cGIsIDE2LCAwKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDE1LCAwKTsKKyAgICBzaXplIC89IDQ7CisKKyAgICBpZiAoKHMtPmZsYWdzJkNPREVDX0ZMQUdfUEFTUzEpICYmIChzLT5waWN0dXJlX251bWJlciAmIDMxKSA9PSAwKSB7CisgICAgICAgIGludCBqOworICAgICAgICBjaGFyICpwID0gYXZjdHgtPnN0YXRzX291dDsKKyAgICAgICAgY2hhciAqZW5kID0gcCArIFNUQVRTX09VVF9TSVpFOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+dmxjX247IGorKykgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKHAsIGVuZC1wLCAiJSJQUkl1NjQiICIsIHMtPnN0YXRzW2ldW2pdKTsKKyAgICAgICAgICAgICAgICBwICs9IHN0cmxlbihwKTsKKyAgICAgICAgICAgICAgICBzLT5zdGF0c1tpXVtqXT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNucHJpbnRmKHAsIGVuZC1wLCAiXG4iKTsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGlmIChlbmQgPD0gcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhdmN0eC0+c3RhdHNfb3V0KQorICAgICAgICBhdmN0eC0+c3RhdHNfb3V0WzBdID0gJ1wwJzsKKyAgICBpZiAoIShzLT5hdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfTk9fT1VUUFVUKSkgeworICAgICAgICBmbHVzaF9wdXRfYml0cygmcy0+cGIpOworICAgICAgICBzLT5iZHNwLmJzd2FwX2J1ZigodWludDMyX3QgKikgcGt0LT5kYXRhLCAodWludDMyX3QgKikgcGt0LT5kYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICBzLT5waWN0dXJlX251bWJlcisrOworCisgICAgcGt0LT5zaXplICAgPSBzaXplICogNDsKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGVuY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEhZdXZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGZmX2h1ZmZ5dXZfY29tbW9uX2VuZChzKTsKKworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBhdl9mcmVlcCgmYXZjdHgtPnN0YXRzX291dCk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAibm9uX2RldGVybWluaXN0aWMiLCAiQWxsb3cgbXVsdGl0aHJlYWRpbmcgZm9yIGUuZy4gY29udGV4dD0xIGF0IHRoZSBleHBlbnNlIG9mIGRldGVybWluaXNtIiwKKyAgICAgIG9mZnNldG9mKEhZdXZDb250ZXh0LCBub25fZGV0ZXJtKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sCisgICAgICAwLCAxLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBub3JtYWxfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiaHVmZnl1diIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmZl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJmZnZodWZmIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfaHVmZnl1dl9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJodWZmeXV2IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSHVmZnl1diAvIEh1ZmZZVVYiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSFVGRllVViwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSFl1dkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGVuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGVuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBlbmNvZGVfZW5kLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9GUkFNRV9USFJFQURTIHwgQ09ERUNfQ0FQX0lOVFJBX09OTFksCisgICAgLnByaXZfY2xhc3MgICAgID0gJm5vcm1hbF9jbGFzcywKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peworICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfUkdCMjQsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCMzIsIEFWX1BJWF9GTVRfTk9ORQorICAgIH0sCit9OworCisjaWYgQ09ORklHX0ZGVkhVRkZfRU5DT0RFUgorQVZDb2RlYyBmZl9mZnZodWZmX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImZmdmh1ZmYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJIdWZmeXV2IEZGbXBlZyB2YXJpYW50IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0ZGVkhVRkYsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEhZdXZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBlbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBlbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZW5jb2RlX2VuZCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IENPREVDX0NBUF9JTlRSQV9PTkxZLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZmZl9jbGFzcywKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peworICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgQVZfUElYX0ZNVF9ZVVY0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDksIEFWX1BJWF9GTVRfR0JSUDEwLCBBVl9QSVhfRk1UX0dCUlAxMiwgQVZfUElYX0ZNVF9HQlJQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWTE2LAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX0dCUkFQLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4QSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIwUDEyLCBBVl9QSVhfRk1UX1lVVjQyMFAxNCwgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUDksIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQyMlAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTQsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5LCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UDE0LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDksIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjJQOSwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFA5LCBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IzMiwgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2h1ZmZ5dXZlbmNkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2h1ZmZ5dXZlbmNkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWZjYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaHVmZnl1dmVuY2RzcC5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiaHVmZnl1dmVuY2RzcC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKworLy8gMHg3ZjdmN2Y3ZiBvciAweDdmN2Y3ZjdmN2Y3ZjdmN2Ygb3Igd2hhdGV2ZXIsIGRlcGVuZGluZyBvbiB0aGUgY3B1J3MgbmF0aXZlIGFyaXRobWV0aWMgc2l6ZQorI2RlZmluZSBwYl83ZiAofjBVTCAvIDI1NSAqIDB4N2YpCisjZGVmaW5lIHBiXzgwICh+MFVMIC8gMjU1ICogMHg4MCkKKworc3RhdGljIHZvaWQgZGlmZl9ieXRlc19jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IHcpCit7CisgICAgbG9uZyBpOworCisjaWYgIUhBVkVfRkFTVF9VTkFMSUdORUQKKyAgICBpZiAoKChsb25nKXNyYzEgfCAobG9uZylzcmMyKSAmIChzaXplb2YobG9uZykgLSAxKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpICsgNyA8IHc7IGkgKz0gOCkgeworICAgICAgICAgICAgZHN0W2kgKyAwXSA9IHNyYzFbaSArIDBdIC0gc3JjMltpICsgMF07CisgICAgICAgICAgICBkc3RbaSArIDFdID0gc3JjMVtpICsgMV0gLSBzcmMyW2kgKyAxXTsKKyAgICAgICAgICAgIGRzdFtpICsgMl0gPSBzcmMxW2kgKyAyXSAtIHNyYzJbaSArIDJdOworICAgICAgICAgICAgZHN0W2kgKyAzXSA9IHNyYzFbaSArIDNdIC0gc3JjMltpICsgM107CisgICAgICAgICAgICBkc3RbaSArIDRdID0gc3JjMVtpICsgNF0gLSBzcmMyW2kgKyA0XTsKKyAgICAgICAgICAgIGRzdFtpICsgNV0gPSBzcmMxW2kgKyA1XSAtIHNyYzJbaSArIDVdOworICAgICAgICAgICAgZHN0W2kgKyA2XSA9IHNyYzFbaSArIDZdIC0gc3JjMltpICsgNl07CisgICAgICAgICAgICBkc3RbaSArIDddID0gc3JjMVtpICsgN10gLSBzcmMyW2kgKyA3XTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorI2VuZGlmCisgICAgZm9yIChpID0gMDsgaSA8PSB3IC0gKGludCkgc2l6ZW9mKGxvbmcpOyBpICs9IHNpemVvZihsb25nKSkgeworICAgICAgICBsb25nIGEgPSAqKGxvbmcgKikgKHNyYzEgKyBpKTsKKyAgICAgICAgbG9uZyBiID0gKihsb25nICopIChzcmMyICsgaSk7CisgICAgICAgICoobG9uZyAqKSAoZHN0ICsgaSkgPSAoKGEgfCBwYl84MCkgLSAoYiAmIHBiXzdmKSkgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhIF4gYiBeIHBiXzgwKSAmIHBiXzgwKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCB3OyBpKyspCisgICAgICAgIGRzdFtpICsgMF0gPSBzcmMxW2kgKyAwXSAtIHNyYzJbaSArIDBdOworfQorCitzdGF0aWMgdm9pZCBzdWJfaGZ5dV9tZWRpYW5fcHJlZF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90IGwsIGx0OworCisgICAgbCAgPSAqbGVmdDsKKyAgICBsdCA9ICpsZWZ0X3RvcDsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IHByZWQgPSBtaWRfcHJlZChsLCBzcmMxW2ldLCAobCArIHNyYzFbaV0gLSBsdCkgJiAweEZGKTsKKyAgICAgICAgbHQgICAgID0gc3JjMVtpXTsKKyAgICAgICAgbCAgICAgID0gc3JjMltpXTsKKyAgICAgICAgZHN0W2ldID0gbCAtIHByZWQ7CisgICAgfQorCisgICAgKmxlZnQgICAgID0gbDsKKyAgICAqbGVmdF90b3AgPSBsdDsKK30KKworYXZfY29sZCB2b2lkIGZmX2h1ZmZ5dXZlbmNkc3BfaW5pdChIdWZmWVVWRW5jRFNQQ29udGV4dCAqYykKK3sKKyAgICBjLT5kaWZmX2J5dGVzICAgICAgICAgICA9IGRpZmZfYnl0ZXNfYzsKKyAgICBjLT5zdWJfaGZ5dV9tZWRpYW5fcHJlZCA9IHN1Yl9oZnl1X21lZGlhbl9wcmVkX2M7CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2h1ZmZ5dXZlbmNkc3BfaW5pdF94ODYoYyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9odWZmeXV2ZW5jZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy9odWZmeXV2ZW5jZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0OWI0YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2h1ZmZ5dXZlbmNkc3AuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19IVUZGWVVWRU5DRFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19IVUZGWVVWRU5DRFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHN0cnVjdCBIdWZmWVVWRW5jRFNQQ29udGV4dCB7CisgICAgdm9pZCAoKmRpZmZfYnl0ZXMpKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiAxNiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMSAvKiBhbGlnbiAxNiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdyk7CisgICAgLyoqCisgICAgICogU3VidHJhY3QgSHVmZllVVidzIHZhcmlhbnQgb2YgbWVkaWFuIHByZWRpY3Rpb24uCisgICAgICogTm90ZSwgdGhpcyBtaWdodCByZWFkIGZyb20gc3JjMVstMV0sIHNyYzJbLTFdLgorICAgICAqLworICAgIHZvaWQgKCpzdWJfaGZ5dV9tZWRpYW5fcHJlZCkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApOworfSBIdWZmWVVWRW5jRFNQQ29udGV4dDsKKwordm9pZCBmZl9odWZmeXV2ZW5jZHNwX2luaXQoSHVmZllVVkVuY0RTUENvbnRleHQgKmMpOwordm9pZCBmZl9odWZmeXV2ZW5jZHNwX2luaXRfeDg2KEh1ZmZZVVZFbmNEU1BDb250ZXh0ICpjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSFVGRllVVkVOQ0RTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9pZGNpbnZpZGVvLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9pZGNpbnZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2NTM3NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2lkY2ludmlkZW8uYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIGlkIFF1YWtlIElJIENJTiBWaWRlbyBEZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGlkIFF1YWtlIElJIENpbiBWaWRlbyBEZWNvZGVyIGJ5IERyLiBUaW0gRmVyZ3Vzb24KKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpZCBDSU4gZm9ybWF0LCB2aXNpdDoKKyAqICAgaHR0cDovL3d3dy5jc3NlLm1vbmFzaC5lZHUuYXUvfnRpbWYvCisgKgorICogVGhpcyB2aWRlbyBkZWNvZGVyIG91dHB1dHMgUEFMOCBjb2xvcnNwYWNlIGRhdGEuIEludGVyYWN0aW5nIHdpdGggdGhpcworICogZGVjb2RlciBpcyBhIGxpdHRsZSBpbnZvbHZlZC4gRHVyaW5nIGluaXRpYWxpemF0aW9uLCB0aGUgZGVtdXhlciBtdXN0CisgKiB0cmFuc21pdCB0aGUgNjU1MzYtYnl0ZSBIdWZmbWFuIHRhYmxlKHMpIHRvIHRoZSBkZWNvZGVyIHZpYSBleHRyYWRhdGEuCisgKiBUaGVuLCB3aGVuZXZlciBhIHBhbGV0dGUgY2hhbmdlIGlzIGVuY291bnRlcmVkIHdoaWxlIGRlbXV4aW5nIHRoZSBmaWxlLAorICogdGhlIGRlbXV4ZXIgbXVzdCB1c2UgdGhlIHNhbWUgZXh0cmFkYXRhIHNwYWNlIHRvIHRyYW5zbWl0IGFuCisgKiBBVlBhbGV0dGVDb250cm9sIHN0cnVjdHVyZS4KKyAqCisgKiBpZCBDSU4gdmlkZW8gaXMgcHVyZWx5IEh1ZmZtYW4tY29kZWQsIGludHJhZnJhbWUtb25seSBjb2RlYy4gSXQgYWNoaWV2ZXMKKyAqIGEgbGl0dGxlIG1vcmUgY29tcHJlc3Npb24gYnkgZXhwbG9pdGluZyB0aGUgZmFjdCB0aGF0IGFkamFjZW50IHBpeGVscworICogdGVuZCB0byBiZSBzaW1pbGFyLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGRlY29kZXIgY291bGQgdXNlIGxpYmF2Y29kZWMncyBvcHRpbWl6ZWQgVkxDIGZhY2lsaXRpZXMKKyAqIHJhdGhlciB0aGFuIG5haXZlLCB0cmVlLWJhc2VkIEh1ZmZtYW4gZGVjb2RpbmcuIEhvd2V2ZXIsIHRoZXJlIGFyZSAyNTYKKyAqIEh1ZmZtYW4gdGFibGVzLiBQbHVzLCB0aGUgVkxDIGJpdCBjb2Rpbmcgb3JkZXIgaXMgcmlnaHQgLT4gbGVmdCBpbnN0ZWFkCisgKiBvciBsZWZ0IC0+IHJpZ2h0LCBzbyBhbGwgb2YgdGhlIGJpdHMgd291bGQgaGF2ZSB0byBiZSByZXZlcnNlZC4gRnVydGhlciwKKyAqIHRoZSBvcmlnaW5hbCBRdWFrZSBJSSBpbXBsZW1lbnRhdGlvbiBsaWtlbHkgdXNlZCBhIHNpbWlsYXIgbmFpdmUKKyAqIGRlY29kaW5nIGFsZ29yaXRobSBhbmQgaXQgd29ya2VkIGZpbmUgb24gbXVjaCBsb3dlciBzcGVjIG1hY2hpbmVzLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisKKyNkZWZpbmUgSFVGRk1BTl9UQUJMRV9TSVpFIDY0ICogMTAyNAorI2RlZmluZSBIVUZfVE9LRU5TIDI1NgorI2RlZmluZSBQQUxFVFRFX0NPVU5UIDI1NgorCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgY291bnQ7CisgIHVuc2lnbmVkIGNoYXIgdXNlZDsKKyAgaW50IGNoaWxkcmVuWzJdOworfSBobm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgSWRjaW5Db250ZXh0IHsKKworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICBpbnQgc2l6ZTsKKworICAgIGhub2RlIGh1ZmZfbm9kZXNbMjU2XVtIVUZfVE9LRU5TKjJdOworICAgIGludCBudW1faHVmZl9ub2Rlc1syNTZdOworCisgICAgdWludDMyX3QgcGFsWzI1Nl07Cit9IElkY2luQ29udGV4dDsKKworLyoqCisgKiBGaW5kIHRoZSBsb3dlc3QgcHJvYmFiaWxpdHkgbm9kZSBpbiBhIEh1ZmZtYW4gdGFibGUsIGFuZCBtYXJrIGl0IGFzCisgKiBiZWluZyBhc3NpZ25lZCB0byBhIGhpZ2hlciBwcm9iYWJpbGl0eS4KKyAqIEByZXR1cm4gdGhlIG5vZGUgaW5kZXggb2YgdGhlIGxvd2VzdCB1bnVzZWQgbm9kZSwgb3IgLTEgaWYgYWxsIG5vZGVzCisgKiBhcmUgdXNlZC4KKyAqLworc3RhdGljIGludCBodWZmX3NtYWxsZXN0X25vZGUoaG5vZGUgKmhub2RlcywgaW50IG51bV9obm9kZXMpIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgYmVzdCwgYmVzdF9ub2RlOworCisgICAgYmVzdCA9IDk5OTk5OTk5OworICAgIGJlc3Rfbm9kZSA9IC0xOworICAgIGZvcihpID0gMDsgaSA8IG51bV9obm9kZXM7IGkrKykgeworICAgICAgICBpZihobm9kZXNbaV0udXNlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZighaG5vZGVzW2ldLmNvdW50KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmKGhub2Rlc1tpXS5jb3VudCA8IGJlc3QpIHsKKyAgICAgICAgICAgIGJlc3QgPSBobm9kZXNbaV0uY291bnQ7CisgICAgICAgICAgICBiZXN0X25vZGUgPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoYmVzdF9ub2RlID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaG5vZGVzW2Jlc3Rfbm9kZV0udXNlZCA9IDE7CisgICAgcmV0dXJuIGJlc3Rfbm9kZTsKK30KKworLyoKKyAqIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWUgdXNpbmcgdGhlIGdlbmVyYXRlZC9sb2FkZWQgcHJvYmFiaWxpdGllcyBoaXN0b2dyYW0uCisgKgorICogT24gY29tcGxldGlvbjoKKyAqICBodWZmX25vZGVzW3ByZXZdW2kgPCBIVUZfVE9LRU5TXSAtIGFyZSB0aGUgbm9kZXMgYXQgdGhlIGJhc2Ugb2YgdGhlIHRyZWUuCisgKiAgaHVmZl9ub2Rlc1twcmV2XVtpID49IEhVRl9UT0tFTlNdIC0gYXJlIHVzZWQgdG8gY29uc3RydWN0IHRoZSB0cmVlLgorICogIG51bV9odWZmX25vZGVzW3ByZXZdIC0gY29udGFpbnMgdGhlIGluZGV4IHRvIHRoZSByb290IG5vZGUgb2YgdGhlIHRyZWUuCisgKiAgICBUaGF0IGlzOiBodWZmX25vZGVzW3ByZXZdW251bV9odWZmX25vZGVzW3ByZXZdXSBpcyB0aGUgcm9vdCBub2RlLgorICovCitzdGF0aWMgYXZfY29sZCB2b2lkIGh1ZmZfYnVpbGRfdHJlZShJZGNpbkNvbnRleHQgKnMsIGludCBwcmV2KSB7CisgICAgaG5vZGUgKm5vZGUsICpobm9kZXM7CisgICAgIGludCBudW1faG5vZGVzLCBpOworCisgICAgbnVtX2hub2RlcyA9IEhVRl9UT0tFTlM7CisgICAgaG5vZGVzID0gcy0+aHVmZl9ub2Rlc1twcmV2XTsKKyAgICBmb3IoaSA9IDA7IGkgPCBIVUZfVE9LRU5TICogMjsgaSsrKQorICAgICAgICBobm9kZXNbaV0udXNlZCA9IDA7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBub2RlID0gJmhub2Rlc1tudW1faG5vZGVzXTsgICAgICAgICAgICAgLyogbmV4dCBmcmVlIG5vZGUgKi8KKworICAgICAgICAvKiBwaWNrIHR3byBsb3dlc3QgY291bnRzICovCisgICAgICAgIG5vZGUtPmNoaWxkcmVuWzBdID0gaHVmZl9zbWFsbGVzdF9ub2RlKGhub2RlcywgbnVtX2hub2Rlcyk7CisgICAgICAgIGlmKG5vZGUtPmNoaWxkcmVuWzBdID09IC0xKQorICAgICAgICAgICAgYnJlYWs7ICAgICAgLyogcmVhY2hlZCB0aGUgcm9vdCBub2RlICovCisKKyAgICAgICAgbm9kZS0+Y2hpbGRyZW5bMV0gPSBodWZmX3NtYWxsZXN0X25vZGUoaG5vZGVzLCBudW1faG5vZGVzKTsKKyAgICAgICAgaWYobm9kZS0+Y2hpbGRyZW5bMV0gPT0gLTEpCisgICAgICAgICAgICBicmVhazsgICAgICAvKiByZWFjaGVkIHRoZSByb290IG5vZGUgKi8KKworICAgICAgICAvKiBjb21iaW5lIG5vZGVzIHByb2JhYmlsaXR5IGZvciBuZXcgbm9kZSAqLworICAgICAgICBub2RlLT5jb3VudCA9IGhub2Rlc1tub2RlLT5jaGlsZHJlblswXV0uY291bnQgKworICAgICAgICBobm9kZXNbbm9kZS0+Y2hpbGRyZW5bMV1dLmNvdW50OworICAgICAgICBudW1faG5vZGVzKys7CisgICAgfQorCisgICAgcy0+bnVtX2h1ZmZfbm9kZXNbcHJldl0gPSBudW1faG5vZGVzIC0gMTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGlkY2luX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBJZGNpbkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCBqLCBoaXN0b2dyYW1faW5kZXggPSAwOworICAgIHVuc2lnbmVkIGNoYXIgKmhpc3RvZ3JhbXM7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworCisgICAgLyogbWFrZSBzdXJlIHRoZSBIdWZmbWFuIHRhYmxlcyBtYWtlIGl0ICovCisgICAgaWYgKHMtPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAhPSBIVUZGTUFOX1RBQkxFX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgIGlkIENJTiB2aWRlbzogZXhwZWN0ZWQgZXh0cmFkYXRhIHNpemUgb2YgJWRcbiIsIEhVRkZNQU5fVEFCTEVfU0laRSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBidWlsZCB0aGUgMjU2IEh1ZmZtYW4gZGVjb2RlIHRyZWVzICovCisgICAgaGlzdG9ncmFtcyA9ICh1bnNpZ25lZCBjaGFyICopcy0+YXZjdHgtPmV4dHJhZGF0YTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgZm9yKGogPSAwOyBqIDwgSFVGX1RPS0VOUzsgaisrKQorICAgICAgICAgICAgcy0+aHVmZl9ub2Rlc1tpXVtqXS5jb3VudCA9IGhpc3RvZ3JhbXNbaGlzdG9ncmFtX2luZGV4KytdOworICAgICAgICBodWZmX2J1aWxkX3RyZWUocywgaSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWRjaW5fZGVjb2RlX3ZsY3MoSWRjaW5Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBobm9kZSAqaG5vZGVzOworICAgIGxvbmcgeCwgeTsKKyAgICBpbnQgcHJldjsKKyAgICB1bnNpZ25lZCBjaGFyIHYgPSAwOworICAgIGludCBiaXRfcG9zLCBub2RlX251bSwgZGF0X3BvczsKKworICAgIHByZXYgPSBiaXRfcG9zID0gZGF0X3BvcyA9IDA7CisgICAgZm9yICh5ID0gMDsgeSA8IChmcmFtZS0+bGluZXNpemVbMF0gKiBzLT5hdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgeSArPSBmcmFtZS0+bGluZXNpemVbMF0pIHsKKyAgICAgICAgZm9yICh4ID0geTsgeCA8IHkgKyBzLT5hdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgbm9kZV9udW0gPSBzLT5udW1faHVmZl9ub2Rlc1twcmV2XTsKKyAgICAgICAgICAgIGhub2RlcyA9IHMtPmh1ZmZfbm9kZXNbcHJldl07CisKKyAgICAgICAgICAgIHdoaWxlKG5vZGVfbnVtID49IEhVRl9UT0tFTlMpIHsKKyAgICAgICAgICAgICAgICBpZighYml0X3BvcykgeworICAgICAgICAgICAgICAgICAgICBpZihkYXRfcG9zID49IHMtPnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSHVmZm1hbiBkZWNvZGUgZXJyb3IuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBiaXRfcG9zID0gODsKKyAgICAgICAgICAgICAgICAgICAgdiA9IHMtPmJ1ZltkYXRfcG9zKytdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5vZGVfbnVtID0gaG5vZGVzW25vZGVfbnVtXS5jaGlsZHJlblt2ICYgMHgwMV07CisgICAgICAgICAgICAgICAgdiA9IHYgPj4gMTsKKyAgICAgICAgICAgICAgICBiaXRfcG9zLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyYW1lLT5kYXRhWzBdW3hdID0gbm9kZV9udW07CisgICAgICAgICAgICBwcmV2ID0gbm9kZV9udW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZGNpbl9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgSWRjaW5Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgTlVMTCk7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIGludCByZXQ7CisKKyAgICBzLT5idWYgPSBidWY7CisgICAgcy0+c2l6ZSA9IGJ1Zl9zaXplOworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChpZGNpbl9kZWNvZGVfdmxjcyhzLCBmcmFtZSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKHBhbCkgeworICAgICAgICBmcmFtZS0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisgICAgICAgIG1lbWNweShzLT5wYWwsIHBhbCwgQVZQQUxFVFRFX1NJWkUpOworICAgIH0KKyAgICAvKiBtYWtlIHRoZSBwYWxldHRlIGF2YWlsYWJsZSBvbiB0aGUgd2F5IG91dCAqLworICAgIG1lbWNweShmcmFtZS0+ZGF0YVsxXSwgcy0+cGFsLCBBVlBBTEVUVEVfU0laRSk7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIC8qIHJlcG9ydCB0aGF0IHRoZSBidWZmZXIgd2FzIGNvbXBsZXRlbHkgY29uc3VtZWQgKi8KKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK0FWQ29kZWMgZmZfaWRjaW5fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaWRjaW52aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImlkIFF1YWtlIElJIENJTiB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9JRENJTiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSWRjaW5Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBpZGNpbl9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBpZGNpbl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9pZGN0ZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9pZGN0ZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5NzIyMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2lkY3Rkc3AuYwpAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImRjdC5oIgorI2luY2x1ZGUgImZhYW5pZGN0LmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgInNpbXBsZV9pZGN0LmgiCisjaW5jbHVkZSAieHZpZGlkY3QuaCIKKworYXZfY29sZCB2b2lkIGZmX2luaXRfc2NhbnRhYmxlKHVpbnQ4X3QgKnBlcm11dGF0aW9uLCBTY2FuVGFibGUgKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19zY2FudGFibGUpCit7CisgICAgaW50IGksIGVuZDsKKworICAgIHN0LT5zY2FudGFibGUgPSBzcmNfc2NhbnRhYmxlOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgaW50IGogPSBzcmNfc2NhbnRhYmxlW2ldOworICAgICAgICBzdC0+cGVybXV0YXRlZFtpXSA9IHBlcm11dGF0aW9uW2pdOworICAgIH0KKworICAgIGVuZCA9IC0xOworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIGludCBqID0gc3QtPnBlcm11dGF0ZWRbaV07CisgICAgICAgIGlmIChqID4gZW5kKQorICAgICAgICAgICAgZW5kID0gajsKKyAgICAgICAgc3QtPnJhc3Rlcl9lbmRbaV0gPSBlbmQ7CisgICAgfQorfQorCithdl9jb2xkIHZvaWQgZmZfaW5pdF9zY2FudGFibGVfcGVybXV0YXRpb24odWludDhfdCAqaWRjdF9wZXJtdXRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGlkY3RfcGVybXV0YXRpb25fdHlwZSBwZXJtX3R5cGUpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGlmIChmZl9pbml0X3NjYW50YWJsZV9wZXJtdXRhdGlvbl94ODYoaWRjdF9wZXJtdXRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtX3R5cGUpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgc3dpdGNoIChwZXJtX3R5cGUpIHsKKyAgICBjYXNlIEZGX0lEQ1RfUEVSTV9OT05FOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGlkY3RfcGVybXV0YXRpb25baV0gPSBpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZGX0lEQ1RfUEVSTV9MSUJNUEVHMjoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICBpZGN0X3Blcm11dGF0aW9uW2ldID0gKGkgJiAweDM4KSB8ICgoaSAmIDYpID4+IDEpIHwgKChpICYgMSkgPDwgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfSURDVF9QRVJNX1RSQU5TUE9TRToKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICBpZGN0X3Blcm11dGF0aW9uW2ldID0gKChpICYgNykgPDwgMykgfCAoaSA+PiAzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9JRENUX1BFUk1fUEFSVFRSQU5TOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGlkY3RfcGVybXV0YXRpb25baV0gPSAoaSAmIDB4MjQpIHwgKChpICYgMykgPDwgMykgfCAoKGkgPj4gMykgJiAzKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnRlcm5hbCBlcnJvciwgSURDVCBwZXJtdXRhdGlvbiBub3Qgc2V0XG4iKTsKKyAgICB9Cit9CisKK3ZvaWQgKCpmZl9wdXRfcGl4ZWxzX2NsYW1wZWQpKGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUpOwordm9pZCAoKmZmX2FkZF9waXhlbHNfY2xhbXBlZCkoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CisKK3N0YXRpYyB2b2lkIHB1dF9waXhlbHNfY2xhbXBlZF9jKGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICphdl9yZXN0cmljdCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKQoreworICAgIGludCBpOworCisgICAgLyogcmVhZCB0aGUgcGl4ZWxzICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBwaXhlbHNbMF0gPSBhdl9jbGlwX3VpbnQ4KGJsb2NrWzBdKTsKKyAgICAgICAgcGl4ZWxzWzFdID0gYXZfY2xpcF91aW50OChibG9ja1sxXSk7CisgICAgICAgIHBpeGVsc1syXSA9IGF2X2NsaXBfdWludDgoYmxvY2tbMl0pOworICAgICAgICBwaXhlbHNbM10gPSBhdl9jbGlwX3VpbnQ4KGJsb2NrWzNdKTsKKyAgICAgICAgcGl4ZWxzWzRdID0gYXZfY2xpcF91aW50OChibG9ja1s0XSk7CisgICAgICAgIHBpeGVsc1s1XSA9IGF2X2NsaXBfdWludDgoYmxvY2tbNV0pOworICAgICAgICBwaXhlbHNbNl0gPSBhdl9jbGlwX3VpbnQ4KGJsb2NrWzZdKTsKKyAgICAgICAgcGl4ZWxzWzddID0gYXZfY2xpcF91aW50OChibG9ja1s3XSk7CisKKyAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgYmxvY2sgICs9IDg7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwdXRfcGl4ZWxzX2NsYW1wZWQ0X2MoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX3NpemUpCit7CisgICAgaW50IGk7CisKKyAgICAvKiByZWFkIHRoZSBwaXhlbHMgKi8KKyAgICBmb3IoaT0wO2k8NDtpKyspIHsKKyAgICAgICAgcGl4ZWxzWzBdID0gYXZfY2xpcF91aW50OChibG9ja1swXSk7CisgICAgICAgIHBpeGVsc1sxXSA9IGF2X2NsaXBfdWludDgoYmxvY2tbMV0pOworICAgICAgICBwaXhlbHNbMl0gPSBhdl9jbGlwX3VpbnQ4KGJsb2NrWzJdKTsKKyAgICAgICAgcGl4ZWxzWzNdID0gYXZfY2xpcF91aW50OChibG9ja1szXSk7CisKKyAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgYmxvY2sgKz0gODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9waXhlbHNfY2xhbXBlZDJfYyhjb25zdCBpbnQxNl90ICpibG9jaywgdWludDhfdCAqYXZfcmVzdHJpY3QgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfc2l6ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIHJlYWQgdGhlIHBpeGVscyAqLworICAgIGZvcihpPTA7aTwyO2krKykgeworICAgICAgICBwaXhlbHNbMF0gPSBhdl9jbGlwX3VpbnQ4KGJsb2NrWzBdKTsKKyAgICAgICAgcGl4ZWxzWzFdID0gYXZfY2xpcF91aW50OChibG9ja1sxXSk7CisKKyAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgYmxvY2sgKz0gODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWRfYyhjb25zdCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICphdl9yZXN0cmljdCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgICAgICAgaWYgKCpibG9jayA8IC0xMjgpCisgICAgICAgICAgICAgICAgKnBpeGVscyA9IDA7CisgICAgICAgICAgICBlbHNlIGlmICgqYmxvY2sgPiAxMjcpCisgICAgICAgICAgICAgICAgKnBpeGVscyA9IDI1NTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqcGl4ZWxzID0gKHVpbnQ4X3QpICgqYmxvY2sgKyAxMjgpOworICAgICAgICAgICAgYmxvY2srKzsKKyAgICAgICAgICAgIHBpeGVscysrOworICAgICAgICB9CisgICAgICAgIHBpeGVscyArPSAobGluZV9zaXplIC0gOCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGRfcGl4ZWxzX2NsYW1wZWRfYyhjb25zdCBpbnQxNl90ICpibG9jaywgdWludDhfdCAqYXZfcmVzdHJpY3QgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIHJlYWQgdGhlIHBpeGVscyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgcGl4ZWxzWzBdID0gYXZfY2xpcF91aW50OChwaXhlbHNbMF0gKyBibG9ja1swXSk7CisgICAgICAgIHBpeGVsc1sxXSA9IGF2X2NsaXBfdWludDgocGl4ZWxzWzFdICsgYmxvY2tbMV0pOworICAgICAgICBwaXhlbHNbMl0gPSBhdl9jbGlwX3VpbnQ4KHBpeGVsc1syXSArIGJsb2NrWzJdKTsKKyAgICAgICAgcGl4ZWxzWzNdID0gYXZfY2xpcF91aW50OChwaXhlbHNbM10gKyBibG9ja1szXSk7CisgICAgICAgIHBpeGVsc1s0XSA9IGF2X2NsaXBfdWludDgocGl4ZWxzWzRdICsgYmxvY2tbNF0pOworICAgICAgICBwaXhlbHNbNV0gPSBhdl9jbGlwX3VpbnQ4KHBpeGVsc1s1XSArIGJsb2NrWzVdKTsKKyAgICAgICAgcGl4ZWxzWzZdID0gYXZfY2xpcF91aW50OChwaXhlbHNbNl0gKyBibG9ja1s2XSk7CisgICAgICAgIHBpeGVsc1s3XSA9IGF2X2NsaXBfdWludDgocGl4ZWxzWzddICsgYmxvY2tbN10pOworICAgICAgICBwaXhlbHMgICArPSBsaW5lX3NpemU7CisgICAgICAgIGJsb2NrICAgICs9IDg7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGRfcGl4ZWxzX2NsYW1wZWQ0X2MoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfc2l6ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIHJlYWQgdGhlIHBpeGVscyAqLworICAgIGZvcihpPTA7aTw0O2krKykgeworICAgICAgICBwaXhlbHNbMF0gPSBhdl9jbGlwX3VpbnQ4KHBpeGVsc1swXSArIGJsb2NrWzBdKTsKKyAgICAgICAgcGl4ZWxzWzFdID0gYXZfY2xpcF91aW50OChwaXhlbHNbMV0gKyBibG9ja1sxXSk7CisgICAgICAgIHBpeGVsc1syXSA9IGF2X2NsaXBfdWludDgocGl4ZWxzWzJdICsgYmxvY2tbMl0pOworICAgICAgICBwaXhlbHNbM10gPSBhdl9jbGlwX3VpbnQ4KHBpeGVsc1szXSArIGJsb2NrWzNdKTsKKyAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgYmxvY2sgKz0gODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9waXhlbHNfY2xhbXBlZDJfYyhjb25zdCBpbnQxNl90ICpibG9jaywgdWludDhfdCAqYXZfcmVzdHJpY3QgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9zaXplKQoreworICAgIGludCBpOworCisgICAgLyogcmVhZCB0aGUgcGl4ZWxzICovCisgICAgZm9yKGk9MDtpPDI7aSsrKSB7CisgICAgICAgIHBpeGVsc1swXSA9IGF2X2NsaXBfdWludDgocGl4ZWxzWzBdICsgYmxvY2tbMF0pOworICAgICAgICBwaXhlbHNbMV0gPSBhdl9jbGlwX3VpbnQ4KHBpeGVsc1sxXSArIGJsb2NrWzFdKTsKKyAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgYmxvY2sgKz0gODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZmX2pyZWZfaWRjdDRfcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGZmX2pfcmV2X2RjdDQgKGJsb2NrKTsKKyAgICBwdXRfcGl4ZWxzX2NsYW1wZWQ0X2MoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7Cit9CitzdGF0aWMgdm9pZCBmZl9qcmVmX2lkY3Q0X2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBmZl9qX3Jldl9kY3Q0IChibG9jayk7CisgICAgYWRkX3BpeGVsc19jbGFtcGVkNF9jKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworfQorCitzdGF0aWMgdm9pZCBmZl9qcmVmX2lkY3QyX3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBmZl9qX3Jldl9kY3QyIChibG9jayk7CisgICAgcHV0X3BpeGVsc19jbGFtcGVkMl9jKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworfQorc3RhdGljIHZvaWQgZmZfanJlZl9pZGN0Ml9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgZmZfal9yZXZfZGN0MiAoYmxvY2spOworICAgIGFkZF9waXhlbHNfY2xhbXBlZDJfYyhibG9jaywgZGVzdCwgbGluZV9zaXplKTsKK30KKworc3RhdGljIHZvaWQgZmZfanJlZl9pZGN0MV9wdXQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfdWludDgoKGJsb2NrWzBdICsgNCk+PjMpOworfQorc3RhdGljIHZvaWQgZmZfanJlZl9pZGN0MV9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfdWludDgoZGVzdFswXSArICgoYmxvY2tbMF0gKyA0KT4+MykpOworfQorCithdl9jb2xkIHZvaWQgZmZfaWRjdGRzcF9pbml0KElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgY29uc3QgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGggPSBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+IDg7CisKKyAgICBpZiAoYXZjdHgtPmxvd3Jlcz09MSkgeworICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl9qcmVmX2lkY3Q0X3B1dDsKKyAgICAgICAgYy0+aWRjdF9hZGQgID0gZmZfanJlZl9pZGN0NF9hZGQ7CisgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX2pfcmV2X2RjdDQ7CisgICAgICAgIGMtPnBlcm1fdHlwZSA9IEZGX0lEQ1RfUEVSTV9OT05FOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmxvd3Jlcz09MikgeworICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl9qcmVmX2lkY3QyX3B1dDsKKyAgICAgICAgYy0+aWRjdF9hZGQgID0gZmZfanJlZl9pZGN0Ml9hZGQ7CisgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX2pfcmV2X2RjdDI7CisgICAgICAgIGMtPnBlcm1fdHlwZSA9IEZGX0lEQ1RfUEVSTV9OT05FOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmxvd3Jlcz09MykgeworICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl9qcmVmX2lkY3QxX3B1dDsKKyAgICAgICAgYy0+aWRjdF9hZGQgID0gZmZfanJlZl9pZGN0MV9hZGQ7CisgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX2pfcmV2X2RjdDE7CisgICAgICAgIGMtPnBlcm1fdHlwZSA9IEZGX0lEQ1RfUEVSTV9OT05FOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMCkgeworICAgICAgICAgICAgYy0+aWRjdF9wdXQgICAgICAgICAgICAgID0gZmZfc2ltcGxlX2lkY3RfcHV0XzEwOworICAgICAgICAgICAgYy0+aWRjdF9hZGQgICAgICAgICAgICAgID0gZmZfc2ltcGxlX2lkY3RfYWRkXzEwOworICAgICAgICAgICAgYy0+aWRjdCAgICAgICAgICAgICAgICAgID0gZmZfc2ltcGxlX2lkY3RfMTA7CisgICAgICAgICAgICBjLT5wZXJtX3R5cGUgICAgICAgICAgICAgPSBGRl9JRENUX1BFUk1fTk9ORTsKKyAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMikgeworICAgICAgICAgICAgYy0+aWRjdF9wdXQgICAgICAgICAgICAgID0gZmZfc2ltcGxlX2lkY3RfcHV0XzEyOworICAgICAgICAgICAgYy0+aWRjdF9hZGQgICAgICAgICAgICAgID0gZmZfc2ltcGxlX2lkY3RfYWRkXzEyOworICAgICAgICAgICAgYy0+aWRjdCAgICAgICAgICAgICAgICAgID0gZmZfc2ltcGxlX2lkY3RfMTI7CisgICAgICAgICAgICBjLT5wZXJtX3R5cGUgICAgICAgICAgICAgPSBGRl9JRENUX1BFUk1fTk9ORTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfSU5UKSB7CisgICAgICAgICAgICAgICAgYy0+aWRjdF9wdXQgID0gZmZfanJlZl9pZGN0X3B1dDsKKyAgICAgICAgICAgICAgICBjLT5pZGN0X2FkZCAgPSBmZl9qcmVmX2lkY3RfYWRkOworICAgICAgICAgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX2pfcmV2X2RjdDsKKyAgICAgICAgICAgICAgICBjLT5wZXJtX3R5cGUgPSBGRl9JRENUX1BFUk1fTElCTVBFRzI7CisjaWYgQ09ORklHX0ZBQU5JRENUCisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9GQUFOKSB7CisgICAgICAgICAgICAgICAgYy0+aWRjdF9wdXQgID0gZmZfZmFhbmlkY3RfcHV0OworICAgICAgICAgICAgICAgIGMtPmlkY3RfYWRkICA9IGZmX2ZhYW5pZGN0X2FkZDsKKyAgICAgICAgICAgICAgICBjLT5pZGN0ICAgICAgPSBmZl9mYWFuaWRjdDsKKyAgICAgICAgICAgICAgICBjLT5wZXJtX3R5cGUgPSBGRl9JRENUX1BFUk1fTk9ORTsKKyNlbmRpZiAvKiBDT05GSUdfRkFBTklEQ1QgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFjY3VyYXRlL2RlZmF1bHQKKyAgICAgICAgICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl9zaW1wbGVfaWRjdF9wdXRfODsKKyAgICAgICAgICAgICAgICBjLT5pZGN0X2FkZCAgPSBmZl9zaW1wbGVfaWRjdF9hZGRfODsKKyAgICAgICAgICAgICAgICBjLT5pZGN0ICAgICAgPSBmZl9zaW1wbGVfaWRjdF84OworICAgICAgICAgICAgICAgIGMtPnBlcm1fdHlwZSA9IEZGX0lEQ1RfUEVSTV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYy0+cHV0X3BpeGVsc19jbGFtcGVkICAgICAgICA9IHB1dF9waXhlbHNfY2xhbXBlZF9jOworICAgIGMtPnB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQgPSBwdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkX2M7CisgICAgYy0+YWRkX3BpeGVsc19jbGFtcGVkICAgICAgICA9IGFkZF9waXhlbHNfY2xhbXBlZF9jOworCisgICAgaWYgKENPTkZJR19NUEVHNF9ERUNPREVSICYmIGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9YVklEKQorICAgICAgICBmZl94dmlkX2lkY3RfaW5pdChjLCBhdmN0eCk7CisKKyAgICBpZiAoQVJDSF9BTFBIQSkKKyAgICAgICAgZmZfaWRjdGRzcF9pbml0X2FscGhhKGMsIGF2Y3R4LCBoaWdoX2JpdF9kZXB0aCk7CisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl9pZGN0ZHNwX2luaXRfYXJtKGMsIGF2Y3R4LCBoaWdoX2JpdF9kZXB0aCk7CisgICAgaWYgKEFSQ0hfUFBDKQorICAgICAgICBmZl9pZGN0ZHNwX2luaXRfcHBjKGMsIGF2Y3R4LCBoaWdoX2JpdF9kZXB0aCk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9pZGN0ZHNwX2luaXRfeDg2KGMsIGF2Y3R4LCBoaWdoX2JpdF9kZXB0aCk7CisKKyAgICBmZl9wdXRfcGl4ZWxzX2NsYW1wZWQgPSBjLT5wdXRfcGl4ZWxzX2NsYW1wZWQ7CisgICAgZmZfYWRkX3BpeGVsc19jbGFtcGVkID0gYy0+YWRkX3BpeGVsc19jbGFtcGVkOworCisgICAgZmZfaW5pdF9zY2FudGFibGVfcGVybXV0YXRpb24oYy0+aWRjdF9wZXJtdXRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5wZXJtX3R5cGUpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaWRjdGRzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvaWRjdGRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOGI3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9pZGN0ZHNwLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0lEQ1REU1BfSAorI2RlZmluZSBBVkNPREVDX0lEQ1REU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKKy8qKgorICogU2NhbnRhYmxlLgorICovCit0eXBlZGVmIHN0cnVjdCBTY2FuVGFibGUgeworICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW50YWJsZTsKKyAgICB1aW50OF90IHBlcm11dGF0ZWRbNjRdOworICAgIHVpbnQ4X3QgcmFzdGVyX2VuZFs2NF07Cit9IFNjYW5UYWJsZTsKKworZW51bSBpZGN0X3Blcm11dGF0aW9uX3R5cGUgeworICAgIEZGX0lEQ1RfUEVSTV9OT05FLAorICAgIEZGX0lEQ1RfUEVSTV9MSUJNUEVHMiwKKyAgICBGRl9JRENUX1BFUk1fU0lNUExFLAorICAgIEZGX0lEQ1RfUEVSTV9UUkFOU1BPU0UsCisgICAgRkZfSURDVF9QRVJNX1BBUlRUUkFOUywKKyAgICBGRl9JRENUX1BFUk1fU1NFMiwKK307CisKK3ZvaWQgZmZfaW5pdF9zY2FudGFibGUodWludDhfdCAqcGVybXV0YXRpb24sIFNjYW5UYWJsZSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19zY2FudGFibGUpOwordm9pZCBmZl9pbml0X3NjYW50YWJsZV9wZXJtdXRhdGlvbih1aW50OF90ICppZGN0X3Blcm11dGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGlkY3RfcGVybXV0YXRpb25fdHlwZSBwZXJtX3R5cGUpOworaW50IGZmX2luaXRfc2NhbnRhYmxlX3Blcm11dGF0aW9uX3g4Nih1aW50OF90ICppZGN0X3Blcm11dGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGlkY3RfcGVybXV0YXRpb25fdHlwZSBwZXJtX3R5cGUpOworCit0eXBlZGVmIHN0cnVjdCBJRENURFNQQ29udGV4dCB7CisgICAgLyogcGl4ZWwgb3BzIDogaW50ZXJmYWNlIHdpdGggRENUICovCisgICAgdm9pZCAoKnB1dF9waXhlbHNfY2xhbXBlZCkoY29uc3QgaW50MTZfdCAqYmxvY2sgLyogYWxpZ24gMTYgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGl4ZWxzIC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CisgICAgdm9pZCAoKnB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQpKGNvbnN0IGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwaXhlbHMgLyogYWxpZ24gOCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CisgICAgdm9pZCAoKmFkZF9waXhlbHNfY2xhbXBlZCkoY29uc3QgaW50MTZfdCAqYmxvY2sgLyogYWxpZ24gMTYgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGl4ZWxzIC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CisKKyAgICB2b2lkICgqaWRjdCkoaW50MTZfdCAqYmxvY2sgLyogYWxpZ24gMTYgKi8pOworCisgICAgLyoqCisgICAgICogYmxvY2sgLT4gaWRjdCAtPiBjbGlwIHRvIHVuc2lnbmVkIDggYml0IC0+IGRlc3QuCisgICAgICogKC0xMzkyLCAwLCAwLCAuLi4pIC0+IGlkY3QgLT4gKC0xNzQsIC0xNzQsIC4uLikgLT4gcHV0IC0+ICgwLCAwLCAuLi4pCisgICAgICogQHBhcmFtIGxpbmVfc2l6ZSBzaXplIGluIGJ5dGVzIG9mIGEgaG9yaXpvbnRhbCBsaW5lIG9mIGRlc3QKKyAgICAgKi8KKyAgICB2b2lkICgqaWRjdF9wdXQpKHVpbnQ4X3QgKmRlc3QgLyogYWxpZ24gOCAqLywKKyAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovKTsKKworICAgIC8qKgorICAgICAqIGJsb2NrIC0+IGlkY3QgLT4gYWRkIGRlc3QgLT4gY2xpcCB0byB1bnNpZ25lZCA4IGJpdCAtPiBkZXN0LgorICAgICAqIEBwYXJhbSBsaW5lX3NpemUgc2l6ZSBpbiBieXRlcyBvZiBhIGhvcml6b250YWwgbGluZSBvZiBkZXN0CisgICAgICovCisgICAgdm9pZCAoKmlkY3RfYWRkKSh1aW50OF90ICpkZXN0IC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayAvKiBhbGlnbiAxNiAqLyk7CisKKyAgICAvKioKKyAgICAgKiBJRENUIGlucHV0IHBlcm11dGF0aW9uLgorICAgICAqIFNldmVyYWwgb3B0aW1pemVkIElEQ1RzIG5lZWQgYSBwZXJtdXRhdGVkIGlucHV0IChyZWxhdGl2ZSB0byB0aGUKKyAgICAgKiBub3JtYWwgb3JkZXIgb2YgdGhlIHJlZmVyZW5jZSBJRENUKS4KKyAgICAgKiBUaGlzIHBlcm11dGF0aW9uIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgaWRjdF9wdXQvYWRkLgorICAgICAqIE5vdGUsIG5vcm1hbGx5IHRoaXMgY2FuIGJlIG1lcmdlZCB3aXRoIHRoZSB6aWd6YWcvYWx0ZXJuYXRlIHNjYW48YnI+CisgICAgICogQW4gZXhhbXBsZSB0byBhdm9pZCBjb25mdXNpb246CisgICAgICogLSAoLT5kZWNvZGUgY29lZmZzIC0+IHppZ3phZyByZW9yZGVyIC0+IGRlcXVhbnQgLT4gcmVmZXJlbmNlIElEQ1QgLT4gLi4uKQorICAgICAqIC0gKHggLT4gcmVmZXJlbmNlIERDVCAtPiByZWZlcmVuY2UgSURDVCAtPiB4KQorICAgICAqIC0gKHggLT4gcmVmZXJlbmNlIERDVCAtPiBzaW1wbGVfbW14X3Blcm0gPSBpZGN0X3Blcm11dGF0aW9uCisgICAgICogICAgLT4gc2ltcGxlX2lkY3RfbW14IC0+IHgpCisgICAgICogLSAoLT4gZGVjb2RlIGNvZWZmcyAtPiB6aWd6YWcgcmVvcmRlciAtPiBzaW1wbGVfbW14X3Blcm0gLT4gZGVxdWFudAorICAgICAqICAgIC0+IHNpbXBsZV9pZGN0X21teCAtPiAuLi4pCisgICAgICovCisgICAgdWludDhfdCBpZGN0X3Blcm11dGF0aW9uWzY0XTsKKyAgICBlbnVtIGlkY3RfcGVybXV0YXRpb25fdHlwZSBwZXJtX3R5cGU7Cit9IElEQ1REU1BDb250ZXh0OworCitleHRlcm4gdm9pZCAoKmZmX3B1dF9waXhlbHNfY2xhbXBlZCkoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CitleHRlcm4gdm9pZCAoKmZmX2FkZF9waXhlbHNfY2xhbXBlZCkoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CisKK3ZvaWQgZmZfaWRjdGRzcF9pbml0KElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCit2b2lkIGZmX2lkY3Rkc3BfaW5pdF9hbHBoYShJRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpOwordm9pZCBmZl9pZGN0ZHNwX2luaXRfYXJtKElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpOwordm9pZCBmZl9pZGN0ZHNwX2luaXRfcHBjKElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpOwordm9pZCBmZl9pZGN0ZHNwX2luaXRfeDg2KElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpOworCisjZW5kaWYgLyogQVZDT0RFQ19JRENURFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2lmZi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwNmIzNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2lmZi5jCkBAIC0wLDAgKzEsOTA1IEBACisvKgorICogSUZGIEFDQk0vREVFUC9JTEJNL1BCTSBiaXRtYXAgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNlYmFzdGlhbiBWYXRlciA8Y2Rncy5iYXN0eUBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSUZGIEFDQk0vREVFUC9JTEJNL1BCTSBiaXRtYXAgZGVjb2RlcgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvLyBUT0RPOiBtYXNraW5nIGJpdHMKK3R5cGVkZWYgZW51bSB7CisgICAgTUFTS19OT05FLAorICAgIE1BU0tfSEFTX01BU0ssCisgICAgTUFTS19IQVNfVFJBTlNQQVJFTlRfQ09MT1IsCisgICAgTUFTS19MQVNTTworfSBtYXNrX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBpbnQgcGxhbmVzaXplOworICAgIHVpbnQ4X3QgKiBwbGFuZWJ1ZjsKKyAgICB1aW50OF90ICogaGFtX2J1ZjsgICAgICAvLy88IHRlbXBvcmFyeSBidWZmZXIgZm9yIHBsYW5hciB0byBjaHVua3kgY29udmVyc2F0aW9uCisgICAgdWludDMyX3QgKmhhbV9wYWxidWY7ICAgLy8vPCBIQU0gZGVjb2RlIHRhYmxlCisgICAgdWludDMyX3QgKm1hc2tfYnVmOyAgICAgLy8vPCB0ZW1wb3JhcnkgYnVmZmVyIGZvciBwYWxldHRlIGluZGljZXMKKyAgICB1aW50MzJfdCAqbWFza19wYWxidWY7ICAvLy88IG1hc2tpbmcgcGFsZXR0ZSB0YWJsZQorICAgIHVuc2lnbmVkICBjb21wcmVzc2lvbjsgIC8vLzwgZGVsdGEgY29tcHJlc3Npb24gbWV0aG9kIHVzZWQKKyAgICB1bnNpZ25lZCAgYnBwOyAgICAgICAgICAvLy88IGJpdHMgcGVyIHBsYW5lIHRvIGRlY29kZSAoZGlmZmVycyBmcm9tIGJpdHNfcGVyX2NvZGVkX3NhbXBsZSBpZiBIQU0pCisgICAgdW5zaWduZWQgIGhhbTsgICAgICAgICAgLy8vPCAwIGlmIG5vbi1IQU0gb3IgbnVtYmVyIG9mIGhvbGQgYml0cyAoNiBmb3IgYnBwID4gNiwgNCBvdGhlcndpc2UpCisgICAgdW5zaWduZWQgIGZsYWdzOyAgICAgICAgLy8vPCAxIGZvciBFSEIsIDAgaXMgbm8gZXh0cmEgaGFsZiBkYXJrZW5pbmcKKyAgICB1bnNpZ25lZCAgdHJhbnNwYXJlbmN5OyAvLy88IFRPRE86IHRyYW5zcGFyZW5jeSBjb2xvciBpbmRleCBpbiBwYWxldHRlCisgICAgdW5zaWduZWQgIG1hc2tpbmc7ICAgICAgLy8vPCBUT0RPOiBtYXNraW5nIG1ldGhvZCB1c2VkCisgICAgaW50IGluaXQ7IC8vIDEgaWYgYnVmZmVyIGFuZCBwYWxldHRlIGRhdGEgYWxyZWFkeSBpbml0aWFsaXplZCwgMCBvdGhlcndpc2UKKyAgICBpbnQxNl90ICAgdHZkY1sxNl07ICAgICAvLy88IFRWREMgbG9va3VwIHRhYmxlCit9IElmZkNvbnRleHQ7CisKKyNkZWZpbmUgTFVUOF9QQVJUKHBsYW5lLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFWX0xFMk5FNjRDKFVJTlQ2NF9DKDB4MDAwMDAwMCk8PDMyIHwgdikgPDwgcGxhbmUsICBcCisgICAgQVZfTEUyTkU2NEMoVUlOVDY0X0MoMHgxMDAwMDAwKTw8MzIgfCB2KSA8PCBwbGFuZSwgIFwKKyAgICBBVl9MRTJORTY0QyhVSU5UNjRfQygweDAwMTAwMDApPDwzMiB8IHYpIDw8IHBsYW5lLCAgXAorICAgIEFWX0xFMk5FNjRDKFVJTlQ2NF9DKDB4MTAxMDAwMCk8PDMyIHwgdikgPDwgcGxhbmUsICBcCisgICAgQVZfTEUyTkU2NEMoVUlOVDY0X0MoMHgwMDAwMTAwKTw8MzIgfCB2KSA8PCBwbGFuZSwgIFwKKyAgICBBVl9MRTJORTY0QyhVSU5UNjRfQygweDEwMDAxMDApPDwzMiB8IHYpIDw8IHBsYW5lLCAgXAorICAgIEFWX0xFMk5FNjRDKFVJTlQ2NF9DKDB4MDAxMDEwMCk8PDMyIHwgdikgPDwgcGxhbmUsICBcCisgICAgQVZfTEUyTkU2NEMoVUlOVDY0X0MoMHgxMDEwMTAwKTw8MzIgfCB2KSA8PCBwbGFuZSwgIFwKKyAgICBBVl9MRTJORTY0QyhVSU5UNjRfQygweDAwMDAwMDEpPDwzMiB8IHYpIDw8IHBsYW5lLCAgXAorICAgIEFWX0xFMk5FNjRDKFVJTlQ2NF9DKDB4MTAwMDAwMSk8PDMyIHwgdikgPDwgcGxhbmUsICBcCisgICAgQVZfTEUyTkU2NEMoVUlOVDY0X0MoMHgwMDEwMDAxKTw8MzIgfCB2KSA8PCBwbGFuZSwgIFwKKyAgICBBVl9MRTJORTY0QyhVSU5UNjRfQygweDEwMTAwMDEpPDwzMiB8IHYpIDw8IHBsYW5lLCAgXAorICAgIEFWX0xFMk5FNjRDKFVJTlQ2NF9DKDB4MDAwMDEwMSk8PDMyIHwgdikgPDwgcGxhbmUsICBcCisgICAgQVZfTEUyTkU2NEMoVUlOVDY0X0MoMHgxMDAwMTAxKTw8MzIgfCB2KSA8PCBwbGFuZSwgIFwKKyAgICBBVl9MRTJORTY0QyhVSU5UNjRfQygweDAwMTAxMDEpPDwzMiB8IHYpIDw8IHBsYW5lLCAgXAorICAgIEFWX0xFMk5FNjRDKFVJTlQ2NF9DKDB4MTAxMDEwMSk8PDMyIHwgdikgPDwgcGxhbmUKKworI2RlZmluZSBMVVQ4KHBsYW5lKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgwMDAwMDAwKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgxMDAwMDAwKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgwMDEwMDAwKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgxMDEwMDAwKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgwMDAwMTAwKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgxMDAwMTAwKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgwMDEwMTAwKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgxMDEwMTAwKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgwMDAwMDAxKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgxMDAwMDAxKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgwMDEwMDAxKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgxMDEwMDAxKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgwMDAwMTAxKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgxMDAwMTAxKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgwMDEwMTAxKSwgICAgICAgICAgICAgICAgXAorICAgIExVVDhfUEFSVChwbGFuZSwgMHgxMDEwMTAxKSwgICAgICAgICAgICAgICAgXAorfQorCisvLyA4IHBsYW5lcyAqIDgtYml0IG1hc2sKK3N0YXRpYyBjb25zdCB1aW50NjRfdCBwbGFuZThfbHV0WzhdWzI1Nl0gPSB7CisgICAgTFVUOCgwKSwgTFVUOCgxKSwgTFVUOCgyKSwgTFVUOCgzKSwKKyAgICBMVVQ4KDQpLCBMVVQ4KDUpLCBMVVQ4KDYpLCBMVVQ4KDcpLAorfTsKKworI2RlZmluZSBMVVQzMihwbGFuZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgXAorICAgICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsIDEgPDwgcGxhbmUsICAgXAorICAgICAgICAgICAgIDAsICAgICAgICAgIDAsIDEgPDwgcGxhbmUsICAgICAgICAgIDAsICAgXAorICAgICAgICAgICAgIDAsICAgICAgICAgIDAsIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsICAgXAorICAgICAgICAgICAgIDAsIDEgPDwgcGxhbmUsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgXAorICAgICAgICAgICAgIDAsIDEgPDwgcGxhbmUsICAgICAgICAgIDAsIDEgPDwgcGxhbmUsICAgXAorICAgICAgICAgICAgIDAsIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsICAgICAgICAgIDAsICAgXAorICAgICAgICAgICAgIDAsIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsICAgXAorICAgIDEgPDwgcGxhbmUsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgXAorICAgIDEgPDwgcGxhbmUsICAgICAgICAgIDAsICAgICAgICAgIDAsIDEgPDwgcGxhbmUsICAgXAorICAgIDEgPDwgcGxhbmUsICAgICAgICAgIDAsIDEgPDwgcGxhbmUsICAgICAgICAgIDAsICAgXAorICAgIDEgPDwgcGxhbmUsICAgICAgICAgIDAsIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsICAgXAorICAgIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgXAorICAgIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsICAgICAgICAgIDAsIDEgPDwgcGxhbmUsICAgXAorICAgIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsICAgICAgICAgIDAsICAgXAorICAgIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsIDEgPDwgcGxhbmUsICAgXAorfQorCisvLyAzMiBwbGFuZXMgKiA0LWJpdCBtYXNrICogNCBsb29rdXAgdGFibGVzIGVhY2gKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBwbGFuZTMyX2x1dFszMl1bMTYqNF0gPSB7CisgICAgTFVUMzIoIDApLCBMVVQzMiggMSksIExVVDMyKCAyKSwgTFVUMzIoIDMpLAorICAgIExVVDMyKCA0KSwgTFVUMzIoIDUpLCBMVVQzMiggNiksIExVVDMyKCA3KSwKKyAgICBMVVQzMiggOCksIExVVDMyKCA5KSwgTFVUMzIoMTApLCBMVVQzMigxMSksCisgICAgTFVUMzIoMTIpLCBMVVQzMigxMyksIExVVDMyKDE0KSwgTFVUMzIoMTUpLAorICAgIExVVDMyKDE2KSwgTFVUMzIoMTcpLCBMVVQzMigxOCksIExVVDMyKDE5KSwKKyAgICBMVVQzMigyMCksIExVVDMyKDIxKSwgTFVUMzIoMjIpLCBMVVQzMigyMyksCisgICAgTFVUMzIoMjQpLCBMVVQzMigyNSksIExVVDMyKDI2KSwgTFVUMzIoMjcpLAorICAgIExVVDMyKDI4KSwgTFVUMzIoMjkpLCBMVVQzMigzMCksIExVVDMyKDMxKSwKK307CisKKy8vIEdyYXkgdG8gUkdCLCByZXF1aXJlZCBmb3IgcGFsZXR0ZSB0YWJsZSBvZiBncmF5c2NhbGUgaW1hZ2VzIHdpdGggYnBwIDwgOAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3QgZ3JheTJyZ2IoY29uc3QgdWludDMyX3QgeCkgeworICAgIHJldHVybiB4IDw8IDE2IHwgeCA8PCA4IHwgeDsKK30KKworLyoqCisgKiBDb252ZXJ0IENNQVAgYnVmZmVyIChzdG9yZWQgaW4gZXh0cmFkYXRhKSB0byBsYXZjIHBhbGV0dGUgZm9ybWF0CisgKi8KK3N0YXRpYyBpbnQgY21hcF9yZWFkX3BhbGV0dGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB1aW50MzJfdCAqcGFsKQoreworICAgIElmZkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBjb3VudCwgaTsKKyAgICBjb25zdCB1aW50OF90ICpjb25zdCBwYWxldHRlID0gYXZjdHgtPmV4dHJhZGF0YSArIEFWX1JCMTYoYXZjdHgtPmV4dHJhZGF0YSk7CisgICAgaW50IHBhbGV0dGVfc2l6ZSA9IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAtIEFWX1JCMTYoYXZjdHgtPmV4dHJhZGF0YSk7CisKKyAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA+IDgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJiaXRzX3Blcl9jb2RlZF9zYW1wbGUgPiA4IG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBjb3VudCA9IDEgPDwgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAvLyBJZiBleHRyYWRhdGEgaXMgc21hbGxlciB0aGFuIGFjdHVhbGx5IG5lZWRlZCwgZmlsbCB0aGUgcmVtYWluaW5nIHdpdGggYmxhY2suCisgICAgY291bnQgPSBGRk1JTihwYWxldHRlX3NpemUgLyAzLCBjb3VudCk7CisgICAgaWYgKGNvdW50KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICAgICAgcGFsW2ldID0gMHhGRjAwMDAwMCB8IEFWX1JCMjQocGFsZXR0ZSArIGkqMyk7CisgICAgICAgIGlmIChzLT5mbGFncyAmJiBjb3VudCA+PSAzMikgeyAvLyBFSEIKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgICAgICAgICAgICAgIHBhbFtpICsgMzJdID0gMHhGRjAwMDAwMCB8IChBVl9SQjI0KHBhbGV0dGUgKyBpKjMpICYgMHhGRUZFRkUpID4+IDE7CisgICAgICAgICAgICBjb3VudCA9IEZGTUFYKGNvdW50LCA2NCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBDcmVhdGUgZ3JheS1zY2FsZSBjb2xvciBwYWxldHRlIGZvciBicHMgPCA4CisgICAgICAgIGNvdW50ID0gMSA8PCBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICAgICAgcGFsW2ldID0gMHhGRjAwMDAwMCB8IGdyYXkycmdiKChpICogMjU1KSA+PiBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICB9CisgICAgaWYgKHMtPm1hc2tpbmcgPT0gTUFTS19IQVNfTUFTSykgeworICAgICAgICBtZW1jcHkocGFsICsgKDEgPDwgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSksIHBhbCwgY291bnQgKiA0KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICBwYWxbaV0gJj0gMHhGRkZGRkY7CisgICAgfSBlbHNlIGlmIChzLT5tYXNraW5nID09IE1BU0tfSEFTX1RSQU5TUEFSRU5UX0NPTE9SICYmCisgICAgICAgIHMtPnRyYW5zcGFyZW5jeSA8IDEgPDwgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkKKyAgICAgICAgcGFsW3MtPnRyYW5zcGFyZW5jeV0gJj0gMHhGRkZGRkY7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRXh0cmFjdHMgdGhlIElGRiBleHRyYSBjb250ZXh0IGFuZCB1cGRhdGVzIGludGVybmFsCisgKiBkZWNvZGVyIHN0cnVjdHVyZXMuCisgKgorICogQHBhcmFtIGF2Y3R4IHRoZSBBVkNvZGVjQ29udGV4dCB3aGVyZSB0byBleHRyYWN0IGV4dHJhIGNvbnRleHQgdG8KKyAqIEBwYXJhbSBhdnBrdCB0aGUgQVZQYWNrZXQgdG8gZXh0cmFjdCBleHRyYSBjb250ZXh0IGZyb20gb3IgTlVMTCB0byB1c2UgYXZjdHgKKyAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBleHRyYWN0X2hlYWRlcihBVkNvZGVjQ29udGV4dCAqY29uc3QgYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWUGFja2V0ICpjb25zdCBhdnBrdCkgeworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKyAgICB1bnNpZ25lZCBidWZfc2l6ZTsKKyAgICBJZmZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcGFsZXR0ZV9zaXplOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJub3QgZW5vdWdoIGV4dHJhZGF0YVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBwYWxldHRlX3NpemUgPSBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgLSBBVl9SQjE2KGF2Y3R4LT5leHRyYWRhdGEpOworCisgICAgaWYgKGF2cGt0KSB7CisgICAgICAgIGludCBpbWFnZV9zaXplOworICAgICAgICBpZiAoYXZwa3QtPnNpemUgPCAyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGltYWdlX3NpemUgPSBhdnBrdC0+c2l6ZSAtIEFWX1JCMTYoYXZwa3QtPmRhdGEpOworICAgICAgICBidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICAgICAgYnVmX3NpemUgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZidWYpOworICAgICAgICBpZiAoYnVmX3NpemUgPD0gMSB8fCBpbWFnZV9zaXplIDw9IDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGltYWdlIHNpemUgcmVjZWl2ZWQ6ICV1IC0+IGltYWdlIGRhdGEgb2Zmc2V0OiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSwgaW1hZ2Vfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZiA9IGF2Y3R4LT5leHRyYWRhdGE7CisgICAgICAgIGJ1Zl9zaXplID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYnVmKTsKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDw9IDEgfHwgcGFsZXR0ZV9zaXplIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcGFsZXR0ZSBzaXplIHJlY2VpdmVkOiAldSAtPiBwYWxldHRlIGRhdGEgb2Zmc2V0OiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSwgcGFsZXR0ZV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJ1Zl9zaXplID49IDQxKSB7CisgICAgICAgIHMtPmNvbXByZXNzaW9uICA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1Zik7CisgICAgICAgIHMtPmJwcCAgICAgICAgICA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1Zik7CisgICAgICAgIHMtPmhhbSAgICAgICAgICA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1Zik7CisgICAgICAgIHMtPmZsYWdzICAgICAgICA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1Zik7CisgICAgICAgIHMtPnRyYW5zcGFyZW5jeSA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmJ1Zik7CisgICAgICAgIHMtPm1hc2tpbmcgICAgICA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1Zik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgcy0+dHZkY1tpXSA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmJ1Zik7CisKKyAgICAgICAgaWYgKHMtPm1hc2tpbmcgPT0gTUFTS19IQVNfTUFTSykgeworICAgICAgICAgICAgaWYgKHMtPmJwcCA+PSA4ICYmICFzLT5oYW0pIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMzI7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnMtPm1hc2tfYnVmKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcy0+bWFza19wYWxidWYpOworICAgICAgICAgICAgICAgIHMtPm1hc2tfYnVmID0gYXZfbWFsbG9jKChzLT5wbGFuZXNpemUgKiAzMikgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAoIXMtPm1hc2tfYnVmKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGlmIChzLT5icHAgPiAxNikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJwcCAlZCB0b28gbGFyZ2UgZm9yIHBhbGV0dGVcbiIsIHMtPmJwcCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5tYXNrX2J1Zik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPm1hc2tfcGFsYnVmID0gYXZfbWFsbG9jKCgyIDw8IHMtPmJwcCkgKiBzaXplb2YodWludDMyX3QpICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICAgICAgaWYgKCFzLT5tYXNrX3BhbGJ1ZikgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcy0+bWFza19idWYpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmJwcCsrOworICAgICAgICB9IGVsc2UgaWYgKHMtPm1hc2tpbmcgIT0gTUFTS19OT05FICYmIHMtPm1hc2tpbmcgIT0gTUFTS19IQVNfVFJBTlNQQVJFTlRfQ09MT1IpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWFza2luZyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXMtPmJwcCB8fCBzLT5icHAgPiAzMikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBiaXRwbGFuZXM6ICV1XG4iLCBzLT5icHApOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0gZWxzZSBpZiAocy0+aGFtID49IDgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgaG9sZCBiaXRzIGZvciBIQU06ICV1XG4iLCBzLT5oYW0pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmVlcCgmcy0+aGFtX2J1Zik7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5oYW1fcGFsYnVmKTsKKworICAgICAgICBpZiAocy0+aGFtKSB7CisgICAgICAgICAgICBpbnQgaSwgY291bnQgPSBGRk1JTihwYWxldHRlX3NpemUgLyAzLCAxIDw8IHMtPmhhbSk7CisgICAgICAgICAgICBpbnQgaGFtX2NvdW50OworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY29uc3QgcGFsZXR0ZSA9IGF2Y3R4LT5leHRyYWRhdGEgKyBBVl9SQjE2KGF2Y3R4LT5leHRyYWRhdGEpOworCisgICAgICAgICAgICBzLT5oYW1fYnVmID0gYXZfbWFsbG9jKChzLT5wbGFuZXNpemUgKiA4KSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgaWYgKCFzLT5oYW1fYnVmKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgIGhhbV9jb3VudCA9IDggKiAoMSA8PCBzLT5oYW0pOworICAgICAgICAgICAgcy0+aGFtX3BhbGJ1ZiA9IGF2X21hbGxvYygoaGFtX2NvdW50IDw8ICEhKHMtPm1hc2tpbmcgPT0gTUFTS19IQVNfTUFTSykpICogc2l6ZW9mICh1aW50MzJfdCkgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmICghcy0+aGFtX3BhbGJ1ZikgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5oYW1fYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY291bnQpIHsgLy8gSEFNIHdpdGggY29sb3IgcGFsZXR0ZSBhdHRhY2hlZAorICAgICAgICAgICAgICAgIC8vIHByZWZpbGwgd2l0aCBibGFjayBhbmQgcGFsZXR0ZSBhbmQgc2V0IEhBTSB0YWtlIGRpcmVjdCB2YWx1ZSBtYXNrIHRvIHplcm8KKyAgICAgICAgICAgICAgICBtZW1zZXQocy0+aGFtX3BhbGJ1ZiwgMCwgKDEgPDwgcy0+aGFtKSAqIDIgKiBzaXplb2YgKHVpbnQzMl90KSk7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmhhbV9wYWxidWZbaSoyKzFdID0gMHhGRjAwMDAwMCB8IEFWX1JMMjQocGFsZXR0ZSArIGkqMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50ID0gMSA8PCBzLT5oYW07CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBIQU0gd2l0aCBncmF5c2NhbGUgY29sb3IgcGFsZXR0ZQorICAgICAgICAgICAgICAgIGNvdW50ID0gMSA8PCBzLT5oYW07CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmhhbV9wYWxidWZbaSoyXSAgID0gMHhGRjAwMDAwMDsgLy8gdGFrZSBkaXJlY3QgY29sb3IgdmFsdWUgZnJvbSBwYWxldHRlCisgICAgICAgICAgICAgICAgICAgIHMtPmhhbV9wYWxidWZbaSoyKzFdID0gMHhGRjAwMDAwMCB8IGF2X2xlMm5lMzIoZ3JheTJyZ2IoKGkgKiAyNTUpID4+IHMtPmhhbSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRtcCA9IGkgPDwgKDggLSBzLT5oYW0pOworICAgICAgICAgICAgICAgIHRtcCB8PSB0bXAgPj4gcy0+aGFtOworICAgICAgICAgICAgICAgIHMtPmhhbV9wYWxidWZbKGkrY291bnQpKjJdICAgICA9IDB4RkYwMEZGRkY7IC8vIGp1c3QgbW9kaWZ5IGJsdWUgY29sb3IgY29tcG9uZW50CisgICAgICAgICAgICAgICAgcy0+aGFtX3BhbGJ1ZlsoaStjb3VudCoyKSoyXSAgID0gMHhGRkZGRkYwMDsgLy8ganVzdCBtb2RpZnkgcmVkIGNvbG9yIGNvbXBvbmVudAorICAgICAgICAgICAgICAgIHMtPmhhbV9wYWxidWZbKGkrY291bnQqMykqMl0gICA9IDB4RkZGRjAwRkY7IC8vIGp1c3QgbW9kaWZ5IGdyZWVuIGNvbG9yIGNvbXBvbmVudAorICAgICAgICAgICAgICAgIHMtPmhhbV9wYWxidWZbKGkrY291bnQpKjIrMV0gICA9IDB4RkYwMDAwMDAgfCB0bXAgPDwgMTY7CisgICAgICAgICAgICAgICAgcy0+aGFtX3BhbGJ1ZlsoaStjb3VudCoyKSoyKzFdID0gMHhGRjAwMDAwMCB8IHRtcDsKKyAgICAgICAgICAgICAgICBzLT5oYW1fcGFsYnVmWyhpK2NvdW50KjMpKjIrMV0gPSAweEZGMDAwMDAwIHwgdG1wIDw8IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+bWFza2luZyA9PSBNQVNLX0hBU19NQVNLKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhhbV9jb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzLT5oYW1fcGFsYnVmWygxIDw8IHMtPmJwcCkgKyBpXSA9IHMtPmhhbV9wYWxidWZbaV0gfCAweEZGMDAwMDAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBJZmZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZSk7CisgICAgYXZfZnJlZXAoJnMtPnBsYW5lYnVmKTsKKyAgICBhdl9mcmVlcCgmcy0+aGFtX2J1Zik7CisgICAgYXZfZnJlZXAoJnMtPmhhbV9wYWxidWYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIElmZkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBlcnI7CisKKyAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA8PSA4KSB7CisgICAgICAgIGludCBwYWxldHRlX3NpemU7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSAyKQorICAgICAgICAgICAgcGFsZXR0ZV9zaXplID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplIC0gQVZfUkIxNihhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGFsZXR0ZV9zaXplID0gMDsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA8IDgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSAyICYmIHBhbGV0dGVfc2l6ZSkgPyBBVl9QSVhfRk1UX1BBTDggOiBBVl9QSVhfRk1UX0dSQVk4OworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA8PSAzMikgeworICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnUicsICdHJywgJ0InLCAnOCcpKSB7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMzI7CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnUicsICdHJywgJ0InLCAnTicpKSB7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNDQ0OworICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2RlY190YWcgIT0gTUtUQUcoJ0QnLCAnRScsICdFJywgJ1AnKSkgeworICAgICAgICAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMjQpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfMEJHUjMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDMyKSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjMyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJ1bmtub3duIGJpdHNfcGVyX2NvZGVkX3NhbXBsZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgoZXJyID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIDAsIGF2Y3R4KSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgcy0+cGxhbmVzaXplID0gRkZBTElHTihhdmN0eC0+d2lkdGgsIDE2KSA+PiAzOyAvLyBBbGlnbiBwbGFuZSBzaXplIGluIGJpdHMgdG8gd29yZC1ib3VuZGFyeQorICAgIHMtPnBsYW5lYnVmICA9IGF2X21hbGxvYyhzLT5wbGFuZXNpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIXMtPnBsYW5lYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+YnBwID0gYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICBzLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5mcmFtZSkgeworICAgICAgICBkZWNvZGVfZW5kKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IGV4dHJhY3RfaGVhZGVyKGF2Y3R4LCBOVUxMKSkgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVjb2RlIGludGVybGVhdmVkIHBsYW5lIGJ1ZmZlciB1cCB0byA4YnBwCisgKiBAcGFyYW0gZHN0IERlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHBhcmFtIGJ1ZiBTb3VyY2UgYnVmZmVyCisgKiBAcGFyYW0gYnVmX3NpemUKKyAqIEBwYXJhbSBwbGFuZSBwbGFuZSBudW1iZXIgdG8gZGVjb2RlIGFzCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZXBsYW5lOCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQgcGxhbmUpCit7CisgICAgY29uc3QgdWludDY0X3QgKmx1dCA9IHBsYW5lOF9sdXRbcGxhbmVdOworICAgIGlmIChwbGFuZSA+PSA4KSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIklnbm9yaW5nIGV4dHJhIHBsYW5lcyBiZXlvbmQgOFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZG8geworICAgICAgICB1aW50NjRfdCB2ID0gQVZfUk42NEEoZHN0KSB8IGx1dFsqYnVmKytdOworICAgICAgICBBVl9XTjY0QShkc3QsIHYpOworICAgICAgICBkc3QgKz0gODsKKyAgICB9IHdoaWxlICgtLWJ1Zl9zaXplKTsKK30KKworLyoqCisgKiBEZWNvZGUgaW50ZXJsZWF2ZWQgcGxhbmUgYnVmZmVyIHVwIHRvIDI0YnBwCisgKiBAcGFyYW0gZHN0IERlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHBhcmFtIGJ1ZiBTb3VyY2UgYnVmZmVyCisgKiBAcGFyYW0gYnVmX3NpemUKKyAqIEBwYXJhbSBwbGFuZSBwbGFuZSBudW1iZXIgdG8gZGVjb2RlIGFzCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZXBsYW5lMzIodWludDMyX3QgKmRzdCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBwbGFuZSkKK3sKKyAgICBjb25zdCB1aW50MzJfdCAqbHV0ID0gcGxhbmUzMl9sdXRbcGxhbmVdOworICAgIGRvIHsKKyAgICAgICAgdW5zaWduZWQgbWFzayA9ICgqYnVmID4+IDIpICYgfjM7CisgICAgICAgIGRzdFswXSB8PSBsdXRbbWFzaysrXTsKKyAgICAgICAgZHN0WzFdIHw9IGx1dFttYXNrKytdOworICAgICAgICBkc3RbMl0gfD0gbHV0W21hc2srK107CisgICAgICAgIGRzdFszXSB8PSBsdXRbbWFza107CisgICAgICAgIG1hc2sgICAgPSAoKmJ1ZisrIDw8IDIpICYgMHgzRjsKKyAgICAgICAgZHN0WzRdIHw9IGx1dFttYXNrKytdOworICAgICAgICBkc3RbNV0gfD0gbHV0W21hc2srK107CisgICAgICAgIGRzdFs2XSB8PSBsdXRbbWFzaysrXTsKKyAgICAgICAgZHN0WzddIHw9IGx1dFttYXNrXTsKKyAgICAgICAgZHN0ICAgICs9IDg7CisgICAgfSB3aGlsZSAoLS1idWZfc2l6ZSk7Cit9CisKKyNkZWZpbmUgREVDT0RFX0hBTV9QTEFORTMyKHgpICAgICAgIFwKKyAgICBmaXJzdCAgICAgICA9IGJ1Zlt4XSA8PCAxOyAgICAgIFwKKyAgICBzZWNvbmQgICAgICA9IGJ1ZlsoeCkrMV0gPDwgMTsgIFwKKyAgICBkZWx0YSAgICAgICY9IHBhbFtmaXJzdCsrXTsgICAgIFwKKyAgICBkZWx0YSAgICAgIHw9IHBhbFtmaXJzdF07ICAgICAgIFwKKyAgICBkc3RbeF0gICAgICA9IGRlbHRhOyAgICAgICAgICAgIFwKKyAgICBkZWx0YSAgICAgICY9IHBhbFtzZWNvbmQrK107ICAgIFwKKyAgICBkZWx0YSAgICAgIHw9IHBhbFtzZWNvbmRdOyAgICAgIFwKKyAgICBkc3RbKHgpKzFdICA9IGRlbHRhCisKKy8qKgorICogQ29udmVydHMgb25lIGxpbmUgb2YgSEFNNi84LWVuY29kZWQgY2h1bmt5IGJ1ZmZlciB0byAyNGJwcC4KKyAqCisgKiBAcGFyYW0gZHN0IHRoZSBkZXN0aW5hdGlvbiAyNGJwcCBidWZmZXIKKyAqIEBwYXJhbSBidWYgdGhlIHNvdXJjZSA4YnBwIGNodW5reSBidWZmZXIKKyAqIEBwYXJhbSBwYWwgdGhlIEhBTSBkZWNvZGUgdGFibGUKKyAqIEBwYXJhbSBidWZfc2l6ZSB0aGUgcGxhbmUgc2l6ZSBpbiBieXRlcworICovCitzdGF0aWMgdm9pZCBkZWNvZGVfaGFtX3BsYW5lMzIodWludDMyX3QgKmRzdCwgY29uc3QgdWludDhfdCAgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqY29uc3QgcGFsLCB1bnNpZ25lZCBidWZfc2l6ZSkKK3sKKyAgICB1aW50MzJfdCBkZWx0YSA9IHBhbFsxXTsgLyogZmlyc3QgcGFsZXR0ZSBlbnRyeSAqLworICAgIGRvIHsKKyAgICAgICAgdWludDMyX3QgZmlyc3QsIHNlY29uZDsKKyAgICAgICAgREVDT0RFX0hBTV9QTEFORTMyKDApOworICAgICAgICBERUNPREVfSEFNX1BMQU5FMzIoMik7CisgICAgICAgIERFQ09ERV9IQU1fUExBTkUzMig0KTsKKyAgICAgICAgREVDT0RFX0hBTV9QTEFORTMyKDYpOworICAgICAgICBidWYgKz0gODsKKyAgICAgICAgZHN0ICs9IDg7CisgICAgfSB3aGlsZSAoLS1idWZfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGxvb2t1cF9wYWxfaW5kaWNpZXModWludDMyX3QgKmRzdCwgY29uc3QgdWludDMyX3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqY29uc3QgcGFsLCB1bnNpZ25lZCB3aWR0aCkKK3sKKyAgICBkbyB7CisgICAgICAgICpkc3QrKyA9IHBhbFsqYnVmKytdOworICAgIH0gd2hpbGUgKC0td2lkdGgpOworfQorCisvKioKKyAqIERlY29kZSBvbmUgY29tcGxldGUgYnl0ZXJ1bjEgZW5jb2RlZCBsaW5lLgorICoKKyAqIEBwYXJhbSBkc3QgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB3aGVyZSB0byBzdG9yZSBkZWNvbXByZXNzZWQgYml0c3RyZWFtCisgKiBAcGFyYW0gZHN0X3NpemUgdGhlIGRlc3RpbmF0aW9uIHBsYW5lIHNpemUgaW4gYnl0ZXMKKyAqIEBwYXJhbSBidWYgdGhlIHNvdXJjZSBieXRlcnVuMSBjb21wcmVzc2VkIGJpdHN0cmVhbQorICogQHBhcmFtIGJ1Zl9lbmQgdGhlIEVPRiBvZiBzb3VyY2UgYnl0ZXJ1bjEgY29tcHJlc3NlZCBiaXRzdHJlYW0KKyAqIEByZXR1cm4gbnVtYmVyIG9mIGNvbnN1bWVkIGJ5dGVzIGluIGJ5dGVydW4xIGNvbXByZXNzZWQgYml0c3RyZWFtCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2J5dGVydW4odWludDhfdCAqZHN0LCBpbnQgZHN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgY29uc3QgdWludDhfdCAqY29uc3QgYnVmX2VuZCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpjb25zdCBidWZfc3RhcnQgPSBidWY7CisgICAgdW5zaWduZWQgeDsKKyAgICBmb3IgKHggPSAwOyB4IDwgZHN0X3NpemUgJiYgYnVmIDwgYnVmX2VuZDspIHsKKyAgICAgICAgdW5zaWduZWQgbGVuZ3RoOworICAgICAgICBjb25zdCBpbnQ4X3QgdmFsdWUgPSAqYnVmKys7CisgICAgICAgIGlmICh2YWx1ZSA+PSAwKSB7CisgICAgICAgICAgICBsZW5ndGggPSBGRk1JTjModmFsdWUgKyAxLCBkc3Rfc2l6ZSAtIHgsIGJ1Zl9lbmQgLSBidWYpOworICAgICAgICAgICAgbWVtY3B5KGRzdCArIHgsIGJ1ZiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJ1ZiArPSBsZW5ndGg7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiAtMTI4KSB7CisgICAgICAgICAgICBsZW5ndGggPSBGRk1JTigtdmFsdWUgKyAxLCBkc3Rfc2l6ZSAtIHgpOworICAgICAgICAgICAgbWVtc2V0KGRzdCArIHgsICpidWYrKywgbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsgLy8gbm9vcAorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgeCArPSBsZW5ndGg7CisgICAgfQorICAgIGlmICh4IDwgZHN0X3NpemUpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiZGVjb2RlX2J5dGVydW4gZW5kZWQgYmVmb3JlIHBsYW5lIHNpemVcbiIpOworICAgICAgICBtZW1zZXQoZHN0K3gsIDAsIGRzdF9zaXplIC0geCk7CisgICAgfQorICAgIHJldHVybiBidWYgLSBidWZfc3RhcnQ7Cit9CisKKyNkZWZpbmUgREVDT0RFX1JHQlhfQ09NTU9OKHR5cGUpIFwKKyAgICBpZiAoIWxlbmd0aCkgeyBcCisgICAgICAgIGxlbmd0aCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsgXAorICAgICAgICBpZiAoIWxlbmd0aCkgeyBcCisgICAgICAgICAgICBsZW5ndGggPSBieXRlc3RyZWFtMl9nZXRfYmUxNihnYik7IFwKKyAgICAgICAgICAgIGlmICghbGVuZ3RoKSBcCisgICAgICAgICAgICAgICAgcmV0dXJuOyBcCisgICAgICAgIH0gXAorICAgIH0gXAorICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeyBcCisgICAgICAgICoodHlwZSAqKShkc3QgKyB5KmxpbmVzaXplICsgeCAqIHNpemVvZih0eXBlKSkgPSBwaXhlbDsgXAorICAgICAgICB4ICs9IDE7IFwKKyAgICAgICAgaWYgKHggPj0gd2lkdGgpIHsgXAorICAgICAgICAgICAgeSArPSAxOyBcCisgICAgICAgICAgICBpZiAoeSA+PSBoZWlnaHQpIFwKKyAgICAgICAgICAgICAgICByZXR1cm47IFwKKyAgICAgICAgICAgIHggPSAwOyBcCisgICAgICAgIH0gXAorICAgIH0KKworLyoqCisgKiBEZWNvZGUgUkdCOCBidWZmZXIKKyAqIEBwYXJhbVtvdXRdIGRzdCBEZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBwYXJhbSB3aWR0aCBXaWR0aCBvZiBkZXN0aW5hdGlvbiBidWZmZXIgKHBpeGVscykKKyAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciAocGl4ZWxzKQorICogQHBhcmFtIGxpbmVzaXplIExpbmUgc2l6ZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIgKGJ5dGVzKQorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfcmdiOChHZXRCeXRlQ29udGV4dCAqZ2IsIHVpbnQ4X3QgKmRzdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbGluZXNpemUpCit7CisgICAgaW50IHggPSAwLCB5ID0gMCwgaSwgbGVuZ3RoOworICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPj0gNCkgeworICAgICAgICB1aW50MzJfdCBwaXhlbCA9IDB4RkYwMDAwMDAgfCBieXRlc3RyZWFtMl9nZXRfYmUyNChnYik7CisgICAgICAgIGxlbmd0aCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSAmIDB4N0Y7CisgICAgICAgIERFQ09ERV9SR0JYX0NPTU1PTih1aW50MzJfdCkKKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIFJHQk4gYnVmZmVyCisgKiBAcGFyYW1bb3V0XSBkc3QgRGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgZGVzdGluYXRpb24gYnVmZmVyIChwaXhlbHMpCisgKiBAcGFyYW0gaGVpZ2h0IEhlaWdodCBvZiBkZXN0aW5hdGlvbiBidWZmZXIgKHBpeGVscykKKyAqIEBwYXJhbSBsaW5lc2l6ZSBMaW5lIHNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyIChieXRlcykKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX3JnYm4oR2V0Qnl0ZUNvbnRleHQgKmdiLCB1aW50OF90ICpkc3QsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxpbmVzaXplKQoreworICAgIGludCB4ID0gMCwgeSA9IDAsIGksIGxlbmd0aDsKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID49IDIpIHsKKyAgICAgICAgdWludDMyX3QgcGl4ZWwgPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoZ2IpOworICAgICAgICBsZW5ndGggPSBwaXhlbCAmIDB4NzsKKyAgICAgICAgcGl4ZWwgPj49IDQ7CisgICAgICAgIERFQ09ERV9SR0JYX0NPTU1PTih1aW50MTZfdCkKKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIERFRVAgUkxFIDMyLWJpdCBidWZmZXIKKyAqIEBwYXJhbVtvdXRdIGRzdCBEZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBwYXJhbVtpbl0gc3JjIFNvdXJjZSBidWZmZXIKKyAqIEBwYXJhbSBzcmNfc2l6ZSBTb3VyY2UgYnVmZmVyIHNpemUgKGJ5dGVzKQorICogQHBhcmFtIHdpZHRoIFdpZHRoIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciAocGl4ZWxzKQorICogQHBhcmFtIGhlaWdodCBIZWlnaHQgb2YgZGVzdGluYXRpb24gYnVmZmVyIChwaXhlbHMpCisgKiBAcGFyYW0gbGluZXNpemUgTGluZSBzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciAoYnl0ZXMpCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9kZWVwX3JsZTMyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxpbmVzaXplKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19lbmQgPSBzcmMgKyBzcmNfc2l6ZTsKKyAgICBpbnQgeCA9IDAsIHkgPSAwLCBpOworICAgIHdoaWxlIChzcmMgKyA1IDw9IHNyY19lbmQpIHsKKyAgICAgICAgaW50IG9wY29kZTsKKyAgICAgICAgb3Bjb2RlID0gKihpbnQ4X3QgKilzcmMrKzsKKyAgICAgICAgaWYgKG9wY29kZSA+PSAwKSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IG9wY29kZSArIDE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IEZGTUlOKHNpemUgLSBpLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCArIHkqbGluZXNpemUgKyB4ICogNCwgc3JjLCBsZW5ndGggKiA0KTsKKyAgICAgICAgICAgICAgICBzcmMgKz0gbGVuZ3RoICogNDsKKyAgICAgICAgICAgICAgICB4ICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoeCA+PSB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgeSArPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoeSA+PSBoZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHNpemUgPSAtb3Bjb2RlICsgMTsKKyAgICAgICAgICAgIHVpbnQzMl90IHBpeGVsID0gQVZfUk4zMihzcmMpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICoodWludDMyX3QgKikoZHN0ICsgeSpsaW5lc2l6ZSArIHggKiA0KSA9IHBpeGVsOworICAgICAgICAgICAgICAgIHggKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoeCA+PSB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgeSArPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoeSA+PSBoZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3JjICs9IDQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIERFRVAgVFZEQyAzMi1iaXQgYnVmZmVyCisgKiBAcGFyYW1bb3V0XSBkc3QgRGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW1baW5dIHNyYyBTb3VyY2UgYnVmZmVyCisgKiBAcGFyYW0gc3JjX3NpemUgU291cmNlIGJ1ZmZlciBzaXplIChieXRlcykKKyAqIEBwYXJhbSB3aWR0aCBXaWR0aCBvZiBkZXN0aW5hdGlvbiBidWZmZXIgKHBpeGVscykKKyAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciAocGl4ZWxzKQorICogQHBhcmFtIGxpbmVzaXplIExpbmUgc2l6ZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIgKGJ5dGVzKQorICogQHBhcmFtW2ludF0gdHZkYyBUVkRDIGxvb2t1cCB0YWJsZQorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfZGVlcF90dmRjMzIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbGluZXNpemUsIGNvbnN0IGludDE2X3QgKnR2ZGMpCit7CisgICAgaW50IHggPSAwLCB5ID0gMCwgcGxhbmUgPSAwOworICAgIGludDhfdCBwaXhlbCA9IDA7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX3NpemUgKiAyOykgeworI2RlZmluZSBHRVROSUJCTEUgKChpICYgMSkgPyAgKHNyY1tpPj4xXSAmIDB4RikgOiAoc3JjW2k+PjFdID4+IDQpKQorICAgICAgICBpbnQgZCA9IHR2ZGNbR0VUTklCQkxFXTsKKyAgICAgICAgaSsrOworICAgICAgICBpZiAoZCkgeworICAgICAgICAgICAgcGl4ZWwgKz0gZDsKKyAgICAgICAgICAgIGRzdFt5ICogbGluZXNpemUgKyB4KjQgKyBwbGFuZV0gPSBwaXhlbDsKKyAgICAgICAgICAgIHgrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpID49IHNyY19zaXplICogMikKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBkID0gR0VUTklCQkxFICsgMTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGQgPSBGRk1JTihkLCB3aWR0aCAtIHgpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGQ7IGorKykgeworICAgICAgICAgICAgICAgIGRzdFt5ICogbGluZXNpemUgKyB4KjQgKyBwbGFuZV0gPSBwaXhlbDsKKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHggPj0gd2lkdGgpIHsKKyAgICAgICAgICAgIHBsYW5lKys7CisgICAgICAgICAgICBpZiAocGxhbmUgPj0gNCkgeworICAgICAgICAgICAgICAgIHkrKzsKKyAgICAgICAgICAgICAgICBpZiAoeSA+PSBoZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBwbGFuZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgIHBpeGVsID0gMDsKKyAgICAgICAgICAgIGkgPSAoaSArIDEpICYgfjE7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdW5zdXBwb3J0ZWQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIElmZkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgImJpdG1hcCAoY29tcHJlc3Npb24gJWksIGJwcCAlaSwgaGFtICVpKSIsIHMtPmNvbXByZXNzaW9uLCBzLT5icHAsIHMtPmhhbSk7CisgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIElmZkNvbnRleHQgKnMgICAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiAgICAgPSBhdnBrdC0+c2l6ZSA+PSAyID8gYXZwa3QtPmRhdGEgKyBBVl9SQjE2KGF2cGt0LT5kYXRhKSA6IE5VTEw7CisgICAgY29uc3QgaW50IGJ1Zl9zaXplICAgICA9IGF2cGt0LT5zaXplID49IDIgPyBhdnBrdC0+c2l6ZSAtIEFWX1JCMTYoYXZwa3QtPmRhdGEpIDogMDsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisgICAgaW50IHksIHBsYW5lLCByZXM7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworCisgICAgaWYgKChyZXMgPSBleHRyYWN0X2hlYWRlcihhdmN0eCwgYXZwa3QpKSA8IDApCisgICAgICAgIHJldHVybiByZXM7CisgICAgaWYgKChyZXMgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZjdHgtPnBpeF9mbXQpOworCisgICAgaWYgKCFzLT5pbml0ICYmIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPD0gOCAmJgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpIHsKKyAgICAgICAgaWYgKChyZXMgPSBjbWFwX3JlYWRfcGFsZXR0ZShhdmN0eCwgKHVpbnQzMl90ICopcy0+ZnJhbWUtPmRhdGFbMV0pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgIH0gZWxzZSBpZiAoIXMtPmluaXQgJiYgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA8PSA4ICYmCisgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjMyKSB7CisgICAgICAgIGlmICgocmVzID0gY21hcF9yZWFkX3BhbGV0dGUoYXZjdHgsIHMtPm1hc2tfcGFsYnVmKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcy0+aW5pdCA9IDE7CisKKyAgICBzd2l0Y2ggKHMtPmNvbXByZXNzaW9uKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnQScsICdDJywgJ0InLCAnTScpKSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4IHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR1JBWTgpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQocy0+ZnJhbWUtPmRhdGFbMF0sIDAsIGF2Y3R4LT5oZWlnaHQgKiBzLT5mcmFtZS0+bGluZXNpemVbMF0pOworICAgICAgICAgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPmJwcDsgcGxhbmUrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodCAmJiBidWYgPCBidWZfZW5kOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZzLT5mcmFtZS0+ZGF0YVswXVt5ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lOChyb3csIGJ1ZiwgRkZNSU4ocy0+cGxhbmVzaXplLCBidWZfZW5kIC0gYnVmKSwgcGxhbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IHMtPnBsYW5lc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+aGFtKSB7IC8vIEhBTSB0byBBVl9QSVhfRk1UX0JHUjMyCisgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmZyYW1lLT5kYXRhWzBdLCAwLCBhdmN0eC0+aGVpZ2h0ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZzLT5mcmFtZS0+ZGF0YVswXVt5ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmhhbV9idWYsIDAsIHMtPnBsYW5lc2l6ZSAqIDgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBzLT5icHA7IHBsYW5lKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBzdGFydCA9IGJ1ZiArIChwbGFuZSAqIGF2Y3R4LT5oZWlnaHQgKyB5KSAqIHMtPnBsYW5lc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSBidWZfZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcGxhbmU4KHMtPmhhbV9idWYsIHN0YXJ0LCBGRk1JTihzLT5wbGFuZXNpemUsIGJ1Zl9lbmQgLSBzdGFydCksIHBsYW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWNvZGVfaGFtX3BsYW5lMzIoKHVpbnQzMl90ICopcm93LCBzLT5oYW1fYnVmLCBzLT5oYW1fcGFsYnVmLCBzLT5wbGFuZXNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiB1bnN1cHBvcnRlZChhdmN0eCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnRCcsICdFJywgJ0UnLCAnUCcpKSB7CisgICAgICAgICAgICBpbnQgcmF3X3dpZHRoID0gYXZjdHgtPndpZHRoICogKGF2X2dldF9iaXRzX3Blcl9waXhlbChkZXNjKSA+PiAzKTsKKyAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQgJiYgYnVmIDwgYnVmX2VuZDsgeSsrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJnMtPmZyYW1lLT5kYXRhWzBdW3kgKiBzLT5mcmFtZS0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgICAgIG1lbWNweShyb3csIGJ1ZiwgRkZNSU4ocmF3X3dpZHRoLCBidWZfZW5kIC0gYnVmKSk7CisgICAgICAgICAgICAgICAgYnVmICs9IHJhd193aWR0aDsKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1IzMikgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspCisgICAgICAgICAgICAgICAgICAgICAgICByb3dbNCAqIHggKyAzXSA9IHJvd1s0ICogeCArIDNdICYgMHhGMCB8IChyb3dbNCAqIHggKyAzXSA+PiA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnSScsICdMJywgJ0InLCAnTScpKSB7IC8vIGludGVybGVhdmVkCisgICAgICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4IHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR1JBWTgpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZzLT5mcmFtZS0+ZGF0YVswXVt5ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHJvdywgMCwgYXZjdHgtPndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+YnBwICYmIGJ1ZiA8IGJ1Zl9lbmQ7IHBsYW5lKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lOChyb3csIGJ1ZiwgRkZNSU4ocy0+cGxhbmVzaXplLCBidWZfZW5kIC0gYnVmKSwgcGxhbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IHMtPnBsYW5lc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+aGFtKSB7IC8vIEhBTSB0byBBVl9QSVhfRk1UX0JHUjMyCisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChzLT5oYW1fYnVmLCAwLCBzLT5wbGFuZXNpemUgKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+YnBwICYmIGJ1ZiA8IGJ1Zl9lbmQ7IHBsYW5lKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lOChzLT5oYW1fYnVmLCBidWYsIEZGTUlOKHMtPnBsYW5lc2l6ZSwgYnVmX2VuZCAtIGJ1ZiksIHBsYW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArPSBzLT5wbGFuZXNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2hhbV9wbGFuZTMyKCh1aW50MzJfdCAqKXJvdywgcy0+aGFtX2J1Ziwgcy0+aGFtX3BhbGJ1Ziwgcy0+cGxhbmVzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBBVl9QSVhfRk1UX0JHUjMyCisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChyb3csIDAsIGF2Y3R4LT53aWR0aCA8PCAyKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+YnBwICYmIGJ1ZiA8IGJ1Zl9lbmQ7IHBsYW5lKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lMzIoKHVpbnQzMl90ICopcm93LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKHMtPnBsYW5lc2l6ZSwgYnVmX2VuZCAtIGJ1ZiksIHBsYW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArPSBzLT5wbGFuZXNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnUCcsICdCJywgJ00nLCAnICcpKSB7IC8vIElGRi1QQk0KKyAgICAgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDggfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HUkFZOCkgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0ICYmIGJ1Zl9lbmQgPiBidWY7IHkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShyb3csIGJ1ZiwgRkZNSU4oYXZjdHgtPndpZHRoLCBidWZfZW5kIC0gYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZiArPSBhdmN0eC0+d2lkdGggKyAoYXZjdHgtPndpZHRoICUgMik7IC8vIHBhZGRpbmcgaWYgb2RkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5oYW0pIHsgLy8gSUZGLVBCTTogSEFNIHRvIEFWX1BJWF9GTVRfQkdSMzIKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodCAmJiBidWZfZW5kID4gYnVmOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJnMtPmZyYW1lLT5kYXRhWzBdW3kgKiBzLT5mcmFtZS0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkocy0+aGFtX2J1ZiwgYnVmLCBGRk1JTihhdmN0eC0+d2lkdGgsIGJ1Zl9lbmQgLSBidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmICs9IGF2Y3R4LT53aWR0aCArIChhdmN0eC0+d2lkdGggJiAxKTsgLy8gcGFkZGluZyBpZiBvZGQKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2hhbV9wbGFuZTMyKCh1aW50MzJfdCAqKXJvdywgcy0+aGFtX2J1Ziwgcy0+aGFtX3BhbGJ1Ziwgcy0+cGxhbmVzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWQoYXZjdHgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0knLCAnTCcsICdCJywgJ00nKSkgeyAvLyBpbnRlcmxlYXZlZAorICAgICAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCB8fCBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dSQVk4KSB7CisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChyb3csIDAsIGF2Y3R4LT53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPmJwcDsgcGxhbmUrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IGRlY29kZV9ieXRlcnVuKHMtPnBsYW5lYnVmLCBzLT5wbGFuZXNpemUsIGJ1ZiwgYnVmX2VuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVwbGFuZTgocm93LCBzLT5wbGFuZWJ1Ziwgcy0+cGxhbmVzaXplLCBwbGFuZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPD0gOCkgeyAvLzgtYml0ICgrIG1hc2spIHRvIEFWX1BJWF9GTVRfQkdSMzIKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZzLT5mcmFtZS0+ZGF0YVswXVt5ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPm1hc2tfYnVmLCAwLCBhdmN0eC0+d2lkdGggKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+YnBwOyBwbGFuZSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgKz0gZGVjb2RlX2J5dGVydW4ocy0+cGxhbmVidWYsIHMtPnBsYW5lc2l6ZSwgYnVmLCBidWZfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lMzIocy0+bWFza19idWYsIHMtPnBsYW5lYnVmLCBzLT5wbGFuZXNpemUsIHBsYW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsb29rdXBfcGFsX2luZGljaWVzKCh1aW50MzJfdCAqKXJvdywgcy0+bWFza19idWYsIHMtPm1hc2tfcGFsYnVmLCBhdmN0eC0+d2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+aGFtKSB7IC8vIEhBTSB0byBBVl9QSVhfRk1UX0JHUjMyCisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChzLT5oYW1fYnVmLCAwLCBzLT5wbGFuZXNpemUgKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+YnBwOyBwbGFuZSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgKz0gZGVjb2RlX2J5dGVydW4ocy0+cGxhbmVidWYsIHMtPnBsYW5lc2l6ZSwgYnVmLCBidWZfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lOChzLT5oYW1fYnVmLCBzLT5wbGFuZWJ1Ziwgcy0+cGxhbmVzaXplLCBwbGFuZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2hhbV9wbGFuZTMyKCh1aW50MzJfdCAqKXJvdywgcy0+aGFtX2J1Ziwgcy0+aGFtX3BhbGJ1Ziwgcy0+cGxhbmVzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBBVl9QSVhfRk1UX0JHUjMyCisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChyb3csIDAsIGF2Y3R4LT53aWR0aCA8PCAyKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+YnBwOyBwbGFuZSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgKz0gZGVjb2RlX2J5dGVydW4ocy0+cGxhbmVidWYsIHMtPnBsYW5lc2l6ZSwgYnVmLCBidWZfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lMzIoKHVpbnQzMl90ICopcm93LCBzLT5wbGFuZWJ1Ziwgcy0+cGxhbmVzaXplLCBwbGFuZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnUCcsICdCJywgJ00nLCAnICcpKSB7IC8vIElGRi1QQk0KKyAgICAgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDggfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HUkFZOCkgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJnMtPmZyYW1lLT5kYXRhWzBdW3kgKiBzLT5mcmFtZS0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgICAgICAgICBidWYgKz0gZGVjb2RlX2J5dGVydW4ocm93LCBhdmN0eC0+d2lkdGgsIGJ1ZiwgYnVmX2VuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5oYW0pIHsgLy8gSUZGLVBCTTogSEFNIHRvIEFWX1BJWF9GTVRfQkdSMzIKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZzLT5mcmFtZS0+ZGF0YVswXVt5ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICAgICAgYnVmICs9IGRlY29kZV9ieXRlcnVuKHMtPmhhbV9idWYsIGF2Y3R4LT53aWR0aCwgYnVmLCBidWZfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2hhbV9wbGFuZTMyKCh1aW50MzJfdCAqKXJvdywgcy0+aGFtX2J1Ziwgcy0+aGFtX3BhbGJ1Ziwgcy0+cGxhbmVzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWQoYXZjdHgpOworICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0QnLCAnRScsICdFJywgJ1AnKSkgeyAvLyBJRkYtREVFUAorICAgICAgICAgICAgaWYgKGF2X2dldF9iaXRzX3Blcl9waXhlbChkZXNjKSA9PSAzMikKKyAgICAgICAgICAgICAgICBkZWNvZGVfZGVlcF9ybGUzMihzLT5mcmFtZS0+ZGF0YVswXSwgYnVmLCBidWZfc2l6ZSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBzLT5mcmFtZS0+bGluZXNpemVbMF0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiB1bnN1cHBvcnRlZChhdmN0eCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdSJywgJ0cnLCAnQicsICc4JykgJiYgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IzMikKKyAgICAgICAgICAgIGRlY29kZV9yZ2I4KCZnYiwgcy0+ZnJhbWUtPmRhdGFbMF0sIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnUicsICdHJywgJ0InLCAnTicpICYmIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCNDQ0KQorICAgICAgICAgICAgZGVjb2RlX3JnYm4oJmdiLCBzLT5mcmFtZS0+ZGF0YVswXSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBzLT5mcmFtZS0+bGluZXNpemVbMF0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWQoYXZjdHgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdEJywgJ0UnLCAnRScsICdQJykpIHsKKyAgICAgICAgICAgIGlmIChhdl9nZXRfYml0c19wZXJfcGl4ZWwoZGVzYykgPT0gMzIpCisgICAgICAgICAgICAgICAgZGVjb2RlX2RlZXBfdHZkYzMyKHMtPmZyYW1lLT5kYXRhWzBdLCBidWYsIGJ1Zl9zaXplLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIHMtPmZyYW1lLT5saW5lc2l6ZVswXSwgcy0+dHZkYyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkKGF2Y3R4KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWQoYXZjdHgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWQoYXZjdHgpOworICAgIH0KKworICAgIGlmICgocmVzID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKKyNpZiBDT05GSUdfSUZGX0lMQk1fREVDT0RFUgorQVZDb2RlYyBmZl9pZmZfaWxibV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJpZmYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJJRkYiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSUZGX0lMQk0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKElmZkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCisjaWYgQ09ORklHX0lGRl9CWVRFUlVOMV9ERUNPREVSCitBVkNvZGVjIGZmX2lmZl9ieXRlcnVuMV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJpZmYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJJRkYiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSUZGX0JZVEVSVU4xLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihJZmZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaWlyZmlsdGVyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9paXJmaWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjU4NzFjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaWlyZmlsdGVyLmMKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiBJSVIgZmlsdGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBkaWZmZXJlbnQgSUlSIGZpbHRlcnMgaW1wbGVtZW50YXRpb24KKyAqLworCisjaW5jbHVkZSAiaWlyZmlsdGVyLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisvKioKKyAqIElJUiBmaWx0ZXIgZ2xvYmFsIHBhcmFtZXRlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnN7CisgICAgaW50ICAgb3JkZXI7CisgICAgZmxvYXQgZ2FpbjsKKyAgICBpbnQgICAqY3g7CisgICAgZmxvYXQgKmN5OworfUZGSUlSRmlsdGVyQ29lZmZzOworCisvKioKKyAqIElJUiBmaWx0ZXIgc3RhdGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgRkZJSVJGaWx0ZXJTdGF0ZXsKKyAgICBmbG9hdCB4WzFdOworfUZGSUlSRmlsdGVyU3RhdGU7CisKKy8vLyBtYXhpbXVtIHN1cHBvcnRlZCBmaWx0ZXIgb3JkZXIKKyNkZWZpbmUgTUFYT1JERVIgMzAKKworc3RhdGljIGF2X2NvbGQgaW50IGJ1dHRlcndvcnRoX2luaXRfY29lZmZzKHZvaWQgKmF2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnMgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBJSVJGaWx0ZXJNb2RlIGZpbHRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIsIGZsb2F0IGN1dG9mZl9yYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzdG9wYmFuZCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBkb3VibGUgd2E7CisgICAgZG91YmxlIHBbTUFYT1JERVIgKyAxXVsyXTsKKworICAgIGlmIChmaWx0X21vZGUgIT0gRkZfRklMVEVSX01PREVfTE9XUEFTUykgeworICAgICAgICBhdl9sb2coYXZjLCBBVl9MT0dfRVJST1IsICJCdXR0ZXJ3b3J0aCBmaWx0ZXIgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgIgorICAgICAgICAgICAgICAgImxvdy1wYXNzIGZpbHRlciBtb2RlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAob3JkZXIgJiAxKSB7CisgICAgICAgIGF2X2xvZyhhdmMsIEFWX0xPR19FUlJPUiwgIkJ1dHRlcndvcnRoIGZpbHRlciBjdXJyZW50bHkgb25seSBzdXBwb3J0cyAiCisgICAgICAgICAgICAgICAiZXZlbiBmaWx0ZXIgb3JkZXJzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHdhID0gMiAqIHRhbihNX1BJICogMC41ICogY3V0b2ZmX3JhdGlvKTsKKworICAgIGMtPmN4WzBdID0gMTsKKyAgICBmb3IoaSA9IDE7IGkgPCAob3JkZXIgPj4gMSkgKyAxOyBpKyspCisgICAgICAgIGMtPmN4W2ldID0gYy0+Y3hbaSAtIDFdICogKG9yZGVyIC0gaSArIDFMTCkgLyBpOworCisgICAgcFswXVswXSA9IDEuMDsKKyAgICBwWzBdWzFdID0gMC4wOworICAgIGZvcihpID0gMTsgaSA8PSBvcmRlcjsgaSsrKQorICAgICAgICBwW2ldWzBdID0gcFtpXVsxXSA9IDAuMDsKKyAgICBmb3IoaSA9IDA7IGkgPCBvcmRlcjsgaSsrKXsKKyAgICAgICAgZG91YmxlIHpwWzJdOworICAgICAgICBkb3VibGUgdGggPSAoaSArIChvcmRlciA+PiAxKSArIDAuNSkgKiBNX1BJIC8gb3JkZXI7CisgICAgICAgIGRvdWJsZSBhX3JlLCBhX2ltLCBjX3JlLCBjX2ltOworICAgICAgICB6cFswXSA9IGNvcyh0aCkgKiB3YTsKKyAgICAgICAgenBbMV0gPSBzaW4odGgpICogd2E7CisgICAgICAgIGFfcmUgPSB6cFswXSArIDIuMDsKKyAgICAgICAgY19yZSA9IHpwWzBdIC0gMi4wOworICAgICAgICBhX2ltID0KKyAgICAgICAgY19pbSA9IHpwWzFdOworICAgICAgICB6cFswXSA9IChhX3JlICogY19yZSArIGFfaW0gKiBjX2ltKSAvIChjX3JlICogY19yZSArIGNfaW0gKiBjX2ltKTsKKyAgICAgICAgenBbMV0gPSAoYV9pbSAqIGNfcmUgLSBhX3JlICogY19pbSkgLyAoY19yZSAqIGNfcmUgKyBjX2ltICogY19pbSk7CisKKyAgICAgICAgZm9yKGogPSBvcmRlcjsgaiA+PSAxOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGFfcmUgPSBwW2pdWzBdOworICAgICAgICAgICAgYV9pbSA9IHBbal1bMV07CisgICAgICAgICAgICBwW2pdWzBdID0gYV9yZSp6cFswXSAtIGFfaW0qenBbMV0gKyBwW2otMV1bMF07CisgICAgICAgICAgICBwW2pdWzFdID0gYV9yZSp6cFsxXSArIGFfaW0qenBbMF0gKyBwW2otMV1bMV07CisgICAgICAgIH0KKyAgICAgICAgYV9yZSAgICA9IHBbMF1bMF0qenBbMF0gLSBwWzBdWzFdKnpwWzFdOworICAgICAgICBwWzBdWzFdID0gcFswXVswXSp6cFsxXSArIHBbMF1bMV0qenBbMF07CisgICAgICAgIHBbMF1bMF0gPSBhX3JlOworICAgIH0KKyAgICBjLT5nYWluID0gcFtvcmRlcl1bMF07CisgICAgZm9yKGkgPSAwOyBpIDwgb3JkZXI7IGkrKyl7CisgICAgICAgIGMtPmdhaW4gKz0gcFtpXVswXTsKKyAgICAgICAgYy0+Y3lbaV0gPSAoLXBbaV1bMF0gKiBwW29yZGVyXVswXSArIC1wW2ldWzFdICogcFtvcmRlcl1bMV0pIC8KKyAgICAgICAgICAgICAgICAgICAocFtvcmRlcl1bMF0gKiBwW29yZGVyXVswXSArIHBbb3JkZXJdWzFdICogcFtvcmRlcl1bMV0pOworICAgIH0KKyAgICBjLT5nYWluIC89IDEgPDwgb3JkZXI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGJpcXVhZF9pbml0X2NvZWZmcyh2b2lkICphdmMsIHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBJSVJGaWx0ZXJNb2RlIGZpbHRfbW9kZSwgaW50IG9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXRvZmZfcmF0aW8sIGZsb2F0IHN0b3BiYW5kKQoreworICAgIGRvdWJsZSBjb3NfdzAsIHNpbl93MDsKKyAgICBkb3VibGUgYTAsIHgwLCB4MTsKKworICAgIGlmIChmaWx0X21vZGUgIT0gRkZfRklMVEVSX01PREVfSElHSFBBU1MgJiYKKyAgICAgICAgZmlsdF9tb2RlICE9IEZGX0ZJTFRFUl9NT0RFX0xPV1BBU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2YywgQVZfTE9HX0VSUk9SLCAiQmlxdWFkIGZpbHRlciBjdXJyZW50bHkgb25seSBzdXBwb3J0cyAiCisgICAgICAgICAgICAgICAiaGlnaC1wYXNzIGFuZCBsb3ctcGFzcyBmaWx0ZXIgbW9kZXNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChvcmRlciAhPSAyKSB7CisgICAgICAgIGF2X2xvZyhhdmMsIEFWX0xPR19FUlJPUiwgIkJpcXVhZCBmaWx0ZXIgbXVzdCBoYXZlIG9yZGVyIG9mIDJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY29zX3cwID0gY29zKE1fUEkgKiBjdXRvZmZfcmF0aW8pOworICAgIHNpbl93MCA9IHNpbihNX1BJICogY3V0b2ZmX3JhdGlvKTsKKworICAgIGEwID0gMS4wICsgKHNpbl93MCAvIDIuMCk7CisKKyAgICBpZiAoZmlsdF9tb2RlID09IEZGX0ZJTFRFUl9NT0RFX0hJR0hQQVNTKSB7CisgICAgICAgIGMtPmdhaW4gID0gICgoMS4wICsgY29zX3cwKSAvIDIuMCkgIC8gYTA7CisgICAgICAgIHgwICAgICAgID0gICgoMS4wICsgY29zX3cwKSAvIDIuMCkgIC8gYTA7CisgICAgICAgIHgxICAgICAgID0gKC0oMS4wICsgY29zX3cwKSkgICAgICAgIC8gYTA7CisgICAgfSBlbHNlIHsgLy8gRkZfRklMVEVSX01PREVfTE9XUEFTUworICAgICAgICBjLT5nYWluICA9ICAoKDEuMCAtIGNvc193MCkgLyAyLjApICAvIGEwOworICAgICAgICB4MCAgICAgICA9ICAoKDEuMCAtIGNvc193MCkgLyAyLjApICAvIGEwOworICAgICAgICB4MSAgICAgICA9ICAgKDEuMCAtIGNvc193MCkgICAgICAgICAvIGEwOworICAgIH0KKyAgICBjLT5jeVswXSA9ICgtMS4wICsgKHNpbl93MCAvIDIuMCkpIC8gYTA7CisgICAgYy0+Y3lbMV0gPSAgKDIuMCAqICBjb3NfdzApICAgICAgICAvIGEwOworCisgICAgLy8gZGl2aWRlIGJ5IGdhaW4gdG8gbWFrZSB0aGUgeCBjb2VmZnMgaW50ZWdlcnMuCisgICAgLy8gZHVyaW5nIGZpbHRlcmluZywgdGhlIGRlbGF5IHN0YXRlIHdpbGwgaW5jbHVkZSB0aGUgZ2FpbiBtdWx0aXBsaWNhdGlvbgorICAgIGMtPmN4WzBdID0gbHJpbnRmKHgwIC8gYy0+Z2Fpbik7CisgICAgYy0+Y3hbMV0gPSBscmludGYoeDEgLyBjLT5nYWluKTsKKworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyogZmZfaWlyX2ZpbHRlcl9pbml0X2NvZWZmcyh2b2lkICphdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIElJUkZpbHRlclR5cGUgZmlsdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBJSVJGaWx0ZXJNb2RlIGZpbHRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRlciwgZmxvYXQgY3V0b2ZmX3JhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3RvcGJhbmQsIGZsb2F0IHJpcHBsZSkKK3sKKyAgICBGRklJUkZpbHRlckNvZWZmcyAqYzsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChvcmRlciA8PSAwIHx8IG9yZGVyID4gTUFYT1JERVIgfHwgY3V0b2ZmX3JhdGlvID49IDEuMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhhdmMsIGMsICAgICBzaXplb2YoRkZJSVJGaWx0ZXJDb2VmZnMpLAorICAgICAgICAgICAgICAgICAgICAgIGluaXRfZmFpbCk7CisgICAgRkZfQUxMT0NfT1JfR09UTyAoYXZjLCBjLT5jeCwgc2l6ZW9mKGMtPmN4WzBdKSAqICgob3JkZXIgPj4gMSkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICBpbml0X2ZhaWwpOworICAgIEZGX0FMTE9DX09SX0dPVE8gKGF2YywgYy0+Y3ksIHNpemVvZihjLT5jeVswXSkgKiBvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbml0X2ZhaWwpOworICAgIGMtPm9yZGVyID0gb3JkZXI7CisKKyAgICBzd2l0Y2ggKGZpbHRfdHlwZSkgeworICAgIGNhc2UgRkZfRklMVEVSX1RZUEVfQlVUVEVSV09SVEg6CisgICAgICAgIHJldCA9IGJ1dHRlcndvcnRoX2luaXRfY29lZmZzKGF2YywgYywgZmlsdF9tb2RlLCBvcmRlciwgY3V0b2ZmX3JhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wYmFuZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfRklMVEVSX1RZUEVfQklRVUFEOgorICAgICAgICByZXQgPSBiaXF1YWRfaW5pdF9jb2VmZnMoYXZjLCBjLCBmaWx0X21vZGUsIG9yZGVyLCBjdXRvZmZfcmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wYmFuZCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmMsIEFWX0xPR19FUlJPUiwgImZpbHRlciB0eXBlIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWRcbiIpOworICAgICAgICBnb3RvIGluaXRfZmFpbDsKKyAgICB9CisKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIGM7CisKK2luaXRfZmFpbDoKKyAgICBmZl9paXJfZmlsdGVyX2ZyZWVfY29lZmZzcCgmYyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2F2X2NvbGQgc3RydWN0IEZGSUlSRmlsdGVyU3RhdGUqIGZmX2lpcl9maWx0ZXJfaW5pdF9zdGF0ZShpbnQgb3JkZXIpCit7CisgICAgRkZJSVJGaWx0ZXJTdGF0ZSogcyA9IGF2X21hbGxvY3ooc2l6ZW9mKEZGSUlSRmlsdGVyU3RhdGUpICsgc2l6ZW9mKHMtPnhbMF0pICogKG9yZGVyIC0gMSkpOworICAgIHJldHVybiBzOworfQorCisjZGVmaW5lIENPTlZfUzE2KGRlc3QsIHNvdXJjZSkgZGVzdCA9IGF2X2NsaXBfaW50MTYobHJpbnRmKHNvdXJjZSkpOworCisjZGVmaW5lIENPTlZfRkxUKGRlc3QsIHNvdXJjZSkgZGVzdCA9IHNvdXJjZTsKKworI2RlZmluZSBGSUxURVJfQldfTzRfMShpMCwgaTEsIGkyLCBpMywgZm10KSAgICAgICAgIFwKKyAgICBpbiA9ICpzcmMwICogYy0+Z2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICArIGMtPmN5WzBdKnMtPnhbaTBdICsgYy0+Y3lbMV0qcy0+eFtpMV0gICAgXAorICAgICAgICAgKyBjLT5jeVsyXSpzLT54W2kyXSArIGMtPmN5WzNdKnMtPnhbaTNdOyAgIFwKKyAgICByZXMgPSAgKHMtPnhbaTBdICsgaW4gICAgICApKjEgICAgICAgICAgICAgICAgICBcCisgICAgICAgICArIChzLT54W2kxXSArIHMtPnhbaTNdKSo0ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKyAgcy0+eFtpMl0gICAgICAgICAgICAqNjsgICAgICAgICAgICAgICAgIFwKKyAgICBDT05WXyMjZm10KCpkc3QwLCByZXMpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcy0+eFtpMF0gPSBpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYzAgKz0gc3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QwICs9IGRzdGVwOworCisjZGVmaW5lIEZJTFRFUl9CV19PNCh0eXBlLCBmbXQpIHsgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHR5cGUgKnNyYzAgPSBzcmM7ICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSAgICAgICAqZHN0MCA9IGRzdDsgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7ICAgICAgICAgXAorICAgICAgICBmbG9hdCBpbiwgcmVzOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTFRFUl9CV19PNF8xKDAsIDEsIDIsIDMsIGZtdCk7ICAgIFwKKyAgICAgICAgRklMVEVSX0JXX080XzEoMSwgMiwgMywgMCwgZm10KTsgICAgXAorICAgICAgICBGSUxURVJfQldfTzRfMSgyLCAzLCAwLCAxLCBmbXQpOyAgICBcCisgICAgICAgIEZJTFRFUl9CV19PNF8xKDMsIDAsIDEsIDIsIGZtdCk7ICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEZJTFRFUl9ESVJFQ1RfRk9STV9JSSh0eXBlLCBmbXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB0eXBlICpzcmMwID0gc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSAgICAgICAqZHN0MCA9IGRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZsb2F0IGluLCByZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbiA9ICpzcmMwICogYy0+Z2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKGogPSAwOyBqIDwgYy0+b3JkZXI7IGorKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbiArPSBjLT5jeVtqXSAqIHMtPnhbal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXMgPSBzLT54WzBdICsgaW4gKyBzLT54W2MtPm9yZGVyID4+IDFdICogYy0+Y3hbYy0+b3JkZXIgPj4gMV07ICAgIFwKKyAgICAgICAgZm9yKGogPSAxOyBqIDwgYy0+b3JkZXIgPj4gMTsgaisrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXMgKz0gKHMtPnhbal0gKyBzLT54W2MtPm9yZGVyIC0gal0pICogYy0+Y3hbal07ICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoaiA9IDA7IGogPCBjLT5vcmRlciAtIDE7IGorKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMtPnhbal0gPSBzLT54W2ogKyAxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENPTlZfIyNmbXQoKmRzdDAsIHJlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzLT54W2MtPm9yZGVyIC0gMV0gPSBpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjMCArPSBzc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdDAgKz0gZHN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBGSUxURVJfTzIodHlwZSwgZm10KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdHlwZSAqc3JjMCA9IHNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgICAgICAgKmRzdDAgPSBkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZsb2F0IGluID0gKnNyYzAgICAqIGMtPmdhaW4gICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIHMtPnhbMF0gKiBjLT5jeVswXSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBzLT54WzFdICogYy0+Y3lbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENPTlZfIyNmbXQoKmRzdDAsIHMtPnhbMF0gKyBpbiArIHMtPnhbMV0gKiBjLT5jeFsxXSkgICAgICAgICAgICAgICAgXAorICAgICAgICBzLT54WzBdID0gcy0+eFsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcy0+eFsxXSA9IGluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNyYzAgKz0gc3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3QwICs9IGRzdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3ZvaWQgZmZfaWlyX2ZpbHRlcihjb25zdCBzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnMgKmMsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IEZGSUlSRmlsdGVyU3RhdGUgKnMsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnNyYywgaW50IHNzdGVwLCBpbnQxNl90ICpkc3QsIGludCBkc3RlcCkKK3sKKyAgICBpZiAoYy0+b3JkZXIgPT0gMikgeworICAgICAgICBGSUxURVJfTzIoaW50MTZfdCwgUzE2KQorICAgIH0gZWxzZSBpZiAoYy0+b3JkZXIgPT0gNCkgeworICAgICAgICBGSUxURVJfQldfTzQoaW50MTZfdCwgUzE2KQorICAgIH0gZWxzZSB7CisgICAgICAgIEZJTFRFUl9ESVJFQ1RfRk9STV9JSShpbnQxNl90LCBTMTYpCisgICAgfQorfQorCit2b2lkIGZmX2lpcl9maWx0ZXJfZmx0KGNvbnN0IHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZGSUlSRmlsdGVyU3RhdGUgKnMsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjLCBpbnQgc3N0ZXAsIGZsb2F0ICpkc3QsIGludCBkc3RlcCkKK3sKKyAgICBpZiAoYy0+b3JkZXIgPT0gMikgeworICAgICAgICBGSUxURVJfTzIoZmxvYXQsIEZMVCkKKyAgICB9IGVsc2UgaWYgKGMtPm9yZGVyID09IDQpIHsKKyAgICAgICAgRklMVEVSX0JXX080KGZsb2F0LCBGTFQpCisgICAgfSBlbHNlIHsKKyAgICAgICAgRklMVEVSX0RJUkVDVF9GT1JNX0lJKGZsb2F0LCBGTFQpCisgICAgfQorfQorCithdl9jb2xkIHZvaWQgZmZfaWlyX2ZpbHRlcl9mcmVlX3N0YXRlcChzdHJ1Y3QgRkZJSVJGaWx0ZXJTdGF0ZSAqKnN0YXRlKQoreworICAgIGF2X2ZyZWVwKHN0YXRlKTsKK30KKworYXZfY29sZCB2b2lkIGZmX2lpcl9maWx0ZXJfZnJlZV9jb2VmZnNwKHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyAqKmNvZWZmc3ApCit7CisgICAgc3RydWN0IEZGSUlSRmlsdGVyQ29lZmZzICpjb2VmZnMgPSAqY29lZmZzcDsKKyAgICBpZihjb2VmZnMpeworICAgICAgICBhdl9mcmVlcCgmY29lZmZzLT5jeCk7CisgICAgICAgIGF2X2ZyZWVwKCZjb2VmZnMtPmN5KTsKKyAgICB9CisgICAgYXZfZnJlZXAoY29lZmZzcCk7Cit9CisKK3ZvaWQgZmZfaWlyX2ZpbHRlcl9pbml0KEZGSUlSRmlsdGVyQ29udGV4dCAqZikgeworICAgIGYtPmZpbHRlcl9mbHQgPSBmZl9paXJfZmlsdGVyX2ZsdDsKKworICAgIGlmIChIQVZFX01JUFNGUFUpCisgICAgICAgIGZmX2lpcl9maWx0ZXJfaW5pdF9taXBzKGYpOworfQorCisjaWZkZWYgVEVTVAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgRklMVF9PUkRFUiA0CisjZGVmaW5lIFNJWkUgMTAyNAoraW50IG1haW4odm9pZCkKK3sKKyAgICBzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnMgKmZjb2VmZnMgPSBOVUxMOworICAgIHN0cnVjdCBGRklJUkZpbHRlclN0YXRlICAqZnN0YXRlICA9IE5VTEw7CisgICAgZmxvYXQgY3V0b2ZmX2NvZWZmID0gMC40OworICAgIGludDE2X3QgeFtTSVpFXSwgeVtTSVpFXTsKKyAgICBpbnQgaTsKKworICAgIGZjb2VmZnMgPSBmZl9paXJfZmlsdGVyX2luaXRfY29lZmZzKE5VTEwsIEZGX0ZJTFRFUl9UWVBFX0JVVFRFUldPUlRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0ZJTFRFUl9NT0RFX0xPV1BBU1MsIEZJTFRfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0b2ZmX2NvZWZmLCAwLjAsIDAuMCk7CisgICAgZnN0YXRlICA9IGZmX2lpcl9maWx0ZXJfaW5pdF9zdGF0ZShGSUxUX09SREVSKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyBpKyspIHsKKyAgICAgICAgeFtpXSA9IGxyaW50KDAuNzUgKiBJTlQxNl9NQVggKiBzaW4oMC41Kk1fUEkqaSppL1NJWkUpKTsKKyAgICB9CisKKyAgICBmZl9paXJfZmlsdGVyKGZjb2VmZnMsIGZzdGF0ZSwgU0laRSwgeCwgMSwgeSwgMSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgU0laRTsgaSsrKQorICAgICAgICBwcmludGYoIiU2ZCAlNmRcbiIsIHhbaV0sIHlbaV0pOworCisgICAgZmZfaWlyX2ZpbHRlcl9mcmVlX2NvZWZmc3AoJmZjb2VmZnMpOworICAgIGZmX2lpcl9maWx0ZXJfZnJlZV9zdGF0ZXAoJmZzdGF0ZSk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaWlyZmlsdGVyLmggYi9mZm1wZWcvbGliYXZjb2RlYy9paXJmaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdiYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaWlyZmlsdGVyLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBJSVIgZmlsdGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBJSVIgZmlsdGVyIGludGVyZmFjZQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19JSVJGSUxURVJfSAorI2RlZmluZSBBVkNPREVDX0lJUkZJTFRFUl9ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKK3N0cnVjdCBGRklJUkZpbHRlckNvZWZmczsKK3N0cnVjdCBGRklJUkZpbHRlclN0YXRlOworCitlbnVtIElJUkZpbHRlclR5cGV7CisgICAgRkZfRklMVEVSX1RZUEVfQkVTU0VMLAorICAgIEZGX0ZJTFRFUl9UWVBFX0JJUVVBRCwKKyAgICBGRl9GSUxURVJfVFlQRV9CVVRURVJXT1JUSCwKKyAgICBGRl9GSUxURVJfVFlQRV9DSEVCWVNIRVYsCisgICAgRkZfRklMVEVSX1RZUEVfRUxMSVBUSUMsCit9OworCitlbnVtIElJUkZpbHRlck1vZGV7CisgICAgRkZfRklMVEVSX01PREVfTE9XUEFTUywKKyAgICBGRl9GSUxURVJfTU9ERV9ISUdIUEFTUywKKyAgICBGRl9GSUxURVJfTU9ERV9CQU5EUEFTUywKKyAgICBGRl9GSUxURVJfTU9ERV9CQU5EU1RPUCwKK307CisKK3R5cGVkZWYgc3RydWN0IEZGSUlSRmlsdGVyQ29udGV4dCB7CisgICAgLyoqCisgICAgKiBQZXJmb3JtIElJUiBmaWx0ZXJpbmcgb24gZmxvYXRpbmctcG9pbnQgaW5wdXQgc2FtcGxlcy4KKyAgICAqCisgICAgKiBAcGFyYW0gY29lZmZzIHBvaW50ZXIgdG8gZmlsdGVyIGNvZWZmaWNpZW50cworICAgICogQHBhcmFtIHN0YXRlICBwb2ludGVyIHRvIGZpbHRlciBzdGF0ZQorICAgICogQHBhcmFtIHNpemUgICBpbnB1dCBsZW5ndGgKKyAgICAqIEBwYXJhbSBzcmMgICAgc291cmNlIHNhbXBsZXMKKyAgICAqIEBwYXJhbSBzc3RlcCAgc291cmNlIHN0cmlkZQorICAgICogQHBhcmFtIGRzdCAgICBmaWx0ZXJlZCBzYW1wbGVzIChkZXN0aW5hdGlvbiBtYXkgYmUgdGhlIHNhbWUgYXMgaW5wdXQpCisgICAgKiBAcGFyYW0gZHN0ZXAgIGRlc3RpbmF0aW9uIHN0cmlkZQorICAgICovCisgICAgdm9pZCAoKmZpbHRlcl9mbHQpKGNvbnN0IHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyAqY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZGSUlSRmlsdGVyU3RhdGUgKnN0YXRlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMsIGludCBzc3RlcCwgZmxvYXQgKmRzdCwgaW50IGRzdGVwKTsKK30gRkZJSVJGaWx0ZXJDb250ZXh0OworCisvKioKKyAqIEluaXRpYWxpemUgRkZJSVJGaWx0ZXJDb250ZXh0CisgKi8KK3ZvaWQgZmZfaWlyX2ZpbHRlcl9pbml0KEZGSUlSRmlsdGVyQ29udGV4dCAqZik7Cit2b2lkIGZmX2lpcl9maWx0ZXJfaW5pdF9taXBzKEZGSUlSRmlsdGVyQ29udGV4dCAqZik7CisKKy8qKgorICogSW5pdGlhbGl6ZSBmaWx0ZXIgY29lZmZpY2llbnRzLgorICoKKyAqIEBwYXJhbSBhdmMgICAgICAgICAgYSBwb2ludGVyIHRvIGFuIGFyYml0cmFyeSBzdHJ1Y3Qgb2Ygd2hpY2ggdGhlIGZpcnN0CisgKiAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGlzIGEgcG9pbnRlciB0byBhbiBBVkNsYXNzIHN0cnVjdAorICogQHBhcmFtIGZpbHRfdHlwZSAgICBmaWx0ZXIgdHlwZSAoZS5nLiBCdXR0ZXJ3b3J0aCkKKyAqIEBwYXJhbSBmaWx0X21vZGUgICAgZmlsdGVyIG1vZGUgKGUuZy4gbG93cGFzcykKKyAqIEBwYXJhbSBvcmRlciAgICAgICAgZmlsdGVyIG9yZGVyCisgKiBAcGFyYW0gY3V0b2ZmX3JhdGlvIGN1dG9mZiB0byBpbnB1dCBmcmVxdWVuY3kgcmF0aW8KKyAqIEBwYXJhbSBzdG9wYmFuZCAgICAgc3RvcGJhbmQgdG8gaW5wdXQgZnJlcXVlbmN5IHJhdGlvICh1c2VkIGJ5IGJhbmRwYXNzIGFuZCBiYW5kc3RvcCBmaWx0ZXIgbW9kZXMpCisgKiBAcGFyYW0gcmlwcGxlICAgICAgIHJpcHBsZSBmYWN0b3IgKHVzZWQgb25seSBpbiBDaGVieXNoZXYgZmlsdGVycykKKyAqCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gZmlsdGVyIGNvZWZmaWNpZW50cyBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBmaWx0ZXIgY2Fubm90IGJlIGNyZWF0ZWQKKyAqLworc3RydWN0IEZGSUlSRmlsdGVyQ29lZmZzKiBmZl9paXJfZmlsdGVyX2luaXRfY29lZmZzKHZvaWQgKmF2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gSUlSRmlsdGVyVHlwZSBmaWx0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIElJUkZpbHRlck1vZGUgZmlsdF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yZGVyLCBmbG9hdCBjdXRvZmZfcmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzdG9wYmFuZCwgZmxvYXQgcmlwcGxlKTsKKworLyoqCisgKiBDcmVhdGUgbmV3IGZpbHRlciBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gb3JkZXIgZmlsdGVyIG9yZGVyCisgKgorICogQHJldHVybiBwb2ludGVyIHRvIG5ldyBmaWx0ZXIgc3RhdGUgb3IgTlVMTCBpZiBzdGF0ZSBjcmVhdGlvbiBmYWlscworICovCitzdHJ1Y3QgRkZJSVJGaWx0ZXJTdGF0ZSogZmZfaWlyX2ZpbHRlcl9pbml0X3N0YXRlKGludCBvcmRlcik7CisKKy8qKgorICogRnJlZSBmaWx0ZXIgY29lZmZpY2llbnRzLgorICoKKyAqIEBwYXJhbSBjb2VmZnMgcG9pbnRlciBhbGxvY2F0ZWQgd2l0aCBmZl9paXJfZmlsdGVyX2luaXRfY29lZmZzKCkKKyAqLwordm9pZCBmZl9paXJfZmlsdGVyX2ZyZWVfY29lZmZzcChzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnMgKipjb2VmZnMpOworCisvKioKKyAqIEZyZWUgYW5kIHplcm8gZmlsdGVyIHN0YXRlLgorICoKKyAqIEBwYXJhbSBzdGF0ZSBwb2ludGVyIHRvIHBvaW50ZXIgYWxsb2NhdGVkIHdpdGggZmZfaWlyX2ZpbHRlcl9pbml0X3N0YXRlKCkKKyAqLwordm9pZCBmZl9paXJfZmlsdGVyX2ZyZWVfc3RhdGVwKHN0cnVjdCBGRklJUkZpbHRlclN0YXRlICoqc3RhdGUpOworCisvKioKKyAqIFBlcmZvcm0gSUlSIGZpbHRlcmluZyBvbiBzaWduZWQgMTYtYml0IGlucHV0IHNhbXBsZXMuCisgKgorICogQHBhcmFtIGNvZWZmcyBwb2ludGVyIHRvIGZpbHRlciBjb2VmZmljaWVudHMKKyAqIEBwYXJhbSBzdGF0ZSAgcG9pbnRlciB0byBmaWx0ZXIgc3RhdGUKKyAqIEBwYXJhbSBzaXplICAgaW5wdXQgbGVuZ3RoCisgKiBAcGFyYW0gc3JjICAgIHNvdXJjZSBzYW1wbGVzCisgKiBAcGFyYW0gc3N0ZXAgIHNvdXJjZSBzdHJpZGUKKyAqIEBwYXJhbSBkc3QgICAgZmlsdGVyZWQgc2FtcGxlcyAoZGVzdGluYXRpb24gbWF5IGJlIHRoZSBzYW1lIGFzIGlucHV0KQorICogQHBhcmFtIGRzdGVwICBkZXN0aW5hdGlvbiBzdHJpZGUKKyAqLwordm9pZCBmZl9paXJfZmlsdGVyKGNvbnN0IHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyAqY29lZmZzLCBzdHJ1Y3QgRkZJSVJGaWx0ZXJTdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGNvbnN0IGludDE2X3QgKnNyYywgaW50IHNzdGVwLCBpbnQxNl90ICpkc3QsIGludCBkc3RlcCk7CisKKy8qKgorICogUGVyZm9ybSBJSVIgZmlsdGVyaW5nIG9uIGZsb2F0aW5nLXBvaW50IGlucHV0IHNhbXBsZXMuCisgKgorICogQHBhcmFtIGNvZWZmcyBwb2ludGVyIHRvIGZpbHRlciBjb2VmZmljaWVudHMKKyAqIEBwYXJhbSBzdGF0ZSAgcG9pbnRlciB0byBmaWx0ZXIgc3RhdGUKKyAqIEBwYXJhbSBzaXplICAgaW5wdXQgbGVuZ3RoCisgKiBAcGFyYW0gc3JjICAgIHNvdXJjZSBzYW1wbGVzCisgKiBAcGFyYW0gc3N0ZXAgIHNvdXJjZSBzdHJpZGUKKyAqIEBwYXJhbSBkc3QgICAgZmlsdGVyZWQgc2FtcGxlcyAoZGVzdGluYXRpb24gbWF5IGJlIHRoZSBzYW1lIGFzIGlucHV0KQorICogQHBhcmFtIGRzdGVwICBkZXN0aW5hdGlvbiBzdHJpZGUKKyAqLwordm9pZCBmZl9paXJfZmlsdGVyX2ZsdChjb25zdCBzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnMgKmNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZGSUlSRmlsdGVyU3RhdGUgKnN0YXRlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYywgaW50IHNzdGVwLCBmbG9hdCAqZHN0LCBpbnQgZHN0ZXApOworCisjZW5kaWYgLyogQVZDT0RFQ19JSVJGSUxURVJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaW1jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9pbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzlmZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW1jLmMKQEAgLTAsMCArMSwxMTExIEBACisvKgorICogSU1DIGNvbXBhdGlibGUgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWF4aW0gUG9saWFrb3Zza2kKKyAqIENvcHlyaWdodCAoYykgMjAwNiBCZW5qYW1pbiBMYXJzc29uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqICBAZmlsZQorICogIElNQyAtIEludGVsIE11c2ljIENvZGVyCisgKiAgQSBtZGN0IGJhc2VkIGNvZGVjIHVzaW5nIGEgMjU2IHBvaW50cyBsYXJnZSB0cmFuc2Zvcm0KKyAqICBkaXZpZGVkIGludG8gMzIgYmFuZHMgd2l0aCBzb21lIG1peCBvZiBzY2FsZSBmYWN0b3JzLgorICogIE9ubHkgbW9ubyBpcyBzdXBwb3J0ZWQuCisgKgorICovCisKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9saWJtLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInNpbmV3aW4uaCIKKworI2luY2x1ZGUgImltY2RhdGEuaCIKKworI2RlZmluZSBJTUNfQkxPQ0tfU0laRSA2NAorI2RlZmluZSBJTUNfRlJBTUVfSUQgMHgyMQorI2RlZmluZSBCQU5EUyAzMgorI2RlZmluZSBDT0VGRlMgMjU2CisKK3R5cGVkZWYgc3RydWN0IElNQ0NoYW5uZWwgeworICAgIGZsb2F0IG9sZF9mbG9vcltCQU5EU107CisgICAgZmxvYXQgZmxjb2VmZnMxW0JBTkRTXTsKKyAgICBmbG9hdCBmbGNvZWZmczJbQkFORFNdOworICAgIGZsb2F0IGZsY29lZmZzM1tCQU5EU107CisgICAgZmxvYXQgZmxjb2VmZnM0W0JBTkRTXTsKKyAgICBmbG9hdCBmbGNvZWZmczVbQkFORFNdOworICAgIGZsb2F0IGZsY29lZmZzNltCQU5EU107CisgICAgZmxvYXQgQ1dkZWNvZGVkW0NPRUZGU107CisKKyAgICBpbnQgYmFuZFdpZHRoVFtCQU5EU107ICAgICAvLy88IGNvZGV3b3JkcyBwZXIgYmFuZAorICAgIGludCBiaXRzQmFuZFRbQkFORFNdOyAgICAgIC8vLzwgaG93IG1hbnkgYml0cyBwZXIgY29kZXdvcmQgaW4gYmFuZAorICAgIGludCBDV2xlbmd0aFRbQ09FRkZTXTsgICAgIC8vLzwgaG93IG1hbnkgYml0cyBpbiBlYWNoIGNvZGV3b3JkCisgICAgaW50IGxldmxDb2VmZkJ1ZltCQU5EU107CisgICAgaW50IGJhbmRGbGFnc0J1ZltCQU5EU107ICAgLy8vPCBmbGFncyBmb3IgZWFjaCBiYW5kCisgICAgaW50IHN1bUxlbkFycltCQU5EU107ICAgICAgLy8vPCBiaXRzIGZvciBhbGwgY29lZmZzIGluIGJhbmQKKyAgICBpbnQgc2tpcEZsYWdSYXdbQkFORFNdOyAgICAvLy88IHNraXAgZmxhZ3MgYXJlIHN0b3JlZCBpbiByYXcgZm9ybSBvciBub3QKKyAgICBpbnQgc2tpcEZsYWdCaXRzW0JBTkRTXTsgICAvLy88IGJpdHMgdXNlZCB0byBjb2RlIHNraXAgZmxhZ3MKKyAgICBpbnQgc2tpcEZsYWdDb3VudFtCQU5EU107ICAvLy88IHNraXBwZWQgY29lZmZpZW50cyBwZXIgYmFuZAorICAgIGludCBza2lwRmxhZ3NbQ09FRkZTXTsgICAgIC8vLzwgc2tpcCBjb2VmZmljaWVudCBkZWNvZGluZyBvciBub3QKKyAgICBpbnQgY29kZXdvcmRzW0NPRUZGU107ICAgICAvLy88IHJhdyBjb2Rld29yZHMgcmVhZCBmcm9tIGJpdHN0cmVhbQorCisgICAgZmxvYXQgbGFzdF9mZnRfaW1bQ09FRkZTXTsKKworICAgIGludCBkZWNvZGVyX3Jlc2V0OworfSBJTUNDaGFubmVsOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgSU1DQ2hhbm5lbCBjaGN0eFsyXTsKKworICAgIC8qKiBNRENUIHRhYmxlcyAqLworICAgIC8vQHsKKyAgICBmbG9hdCBtZGN0X3NpbmVfd2luZG93W0NPRUZGU107CisgICAgZmxvYXQgcG9zdF9jb3NbQ09FRkZTXTsKKyAgICBmbG9hdCBwb3N0X3NpbltDT0VGRlNdOworICAgIGZsb2F0IHByZV9jb2VmMVtDT0VGRlNdOworICAgIGZsb2F0IHByZV9jb2VmMltDT0VGRlNdOworICAgIC8vQH0KKworICAgIGZsb2F0IHNxcnRfdGFiWzMwXTsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworCisgICAgQnN3YXBEU1BDb250ZXh0IGJkc3A7CisgICAgQVZGbG9hdERTUENvbnRleHQgKmZkc3A7CisgICAgRkZUQ29udGV4dCBmZnQ7CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBGRlRDb21wbGV4LCBzYW1wbGVzKVtDT0VGRlMgLyAyXTsKKyAgICBmbG9hdCAqb3V0X3NhbXBsZXM7CisKKyAgICBpbnQgY29lZjBfcG9zOworCisgICAgaW50OF90IGN5Y2xUYWJbMzJdLCBjeWNsVGFiMlszMl07CisgICAgZmxvYXQgIHdlaWdodHMxWzMxXSwgd2VpZ2h0czJbMzFdOworfSBJTUNDb250ZXh0OworCitzdGF0aWMgVkxDIGh1ZmZtYW5fdmxjWzRdWzRdOworCisjZGVmaW5lIFZMQ19UQUJMRVNfU0laRSA5NTEyCisKK3N0YXRpYyBjb25zdCBpbnQgdmxjX29mZnNldHNbMTddID0geworICAgIDAsICAgICA2NDAsIDExNTYsIDE3MzIsIDIzMDgsIDI4NTIsIDMzOTYsIDM5MjQsCisgICAgNDQ1MiwgNTIyMCwgNTg2MCwgNjYyOCwgNzI2OCwgNzkwOCwgODQyNCwgODkzNiwgVkxDX1RBQkxFU19TSVpFCit9OworCitzdGF0aWMgVkxDX1RZUEUgdmxjX3RhYmxlc1tWTENfVEFCTEVTX1NJWkVdWzJdOworCitzdGF0aWMgaW5saW5lIGRvdWJsZSBmcmVxMmJhcmsoZG91YmxlIGZyZXEpCit7CisgICAgcmV0dXJuIDMuNSAqIGF0YW4oKGZyZXEgLyA3NTAwLjApICogKGZyZXEgLyA3NTAwLjApKSArIDEzLjAgKiBhdGFuKGZyZXEgKiAwLjAwMDc2KTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBpYWNfZ2VuZXJhdGVfdGFicyhJTUNDb250ZXh0ICpxLCBpbnQgc2FtcGxpbmdfcmF0ZSkKK3sKKyAgICBkb3VibGUgZnJlcW1pblszMl0sIGZyZXFtaWRbMzJdLCBmcmVxbWF4WzMyXTsKKyAgICBkb3VibGUgc2NhbGUgPSBzYW1wbGluZ19yYXRlIC8gKDI1Ni4wICogMi4wICogMi4wKTsKKyAgICBkb3VibGUgbnlxdWlzdF9mcmVxID0gc2FtcGxpbmdfcmF0ZSAqIDAuNTsKKyAgICBkb3VibGUgZnJlcSwgYmFyaywgcHJldl9iYXJrID0gMCwgdGYsIHRiOworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgICAgZnJlcSA9IChiYW5kX3RhYltpXSArIGJhbmRfdGFiW2kgKyAxXSAtIDEpICogc2NhbGU7CisgICAgICAgIGJhcmsgPSBmcmVxMmJhcmsoZnJlcSk7CisKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICB0YiA9IGJhcmsgLSBwcmV2X2Jhcms7CisgICAgICAgICAgICBxLT53ZWlnaHRzMVtpIC0gMV0gPSBwb3coMTAuMCwgLTEuMCAqIHRiKTsKKyAgICAgICAgICAgIHEtPndlaWdodHMyW2kgLSAxXSA9IHBvdygxMC4wLCAtMi43ICogdGIpOworICAgICAgICB9CisgICAgICAgIHByZXZfYmFyayA9IGJhcms7CisKKyAgICAgICAgZnJlcW1pZFtpXSA9IGZyZXE7CisKKyAgICAgICAgdGYgPSBmcmVxOworICAgICAgICB3aGlsZSAodGYgPCBueXF1aXN0X2ZyZXEpIHsKKyAgICAgICAgICAgIHRmICs9IDAuNTsKKyAgICAgICAgICAgIHRiID0gIGZyZXEyYmFyayh0Zik7CisgICAgICAgICAgICBpZiAodGIgPiBiYXJrICsgMC41KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZyZXFtYXhbaV0gPSB0ZjsKKworICAgICAgICB0ZiA9IGZyZXE7CisgICAgICAgIHdoaWxlICh0ZiA+IDAuMCkgeworICAgICAgICAgICAgdGYgLT0gMC41OworICAgICAgICAgICAgdGIgPSAgZnJlcTJiYXJrKHRmKTsKKyAgICAgICAgICAgIGlmICh0YiA8PSBiYXJrIC0gMC41KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZyZXFtaW5baV0gPSB0ZjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgICBmcmVxID0gZnJlcW1heFtpXTsKKyAgICAgICAgZm9yIChqID0gMzE7IGogPiAwICYmIGZyZXEgPD0gZnJlcW1pZFtqXTsgai0tKTsKKyAgICAgICAgcS0+Y3ljbFRhYltpXSA9IGogKyAxOworCisgICAgICAgIGZyZXEgPSBmcmVxbWluW2ldOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzIgJiYgZnJlcSA+PSBmcmVxbWlkW2pdOyBqKyspOworICAgICAgICBxLT5jeWNsVGFiMltpXSA9IGogLSAxOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGltY19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGksIGosIHJldDsKKyAgICBJTUNDb250ZXh0ICpxID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBkb3VibGUgcjEsIHIyOworCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9JQUMgJiYgYXZjdHgtPnNhbXBsZV9yYXRlID4gOTYwMDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiU3RyYW5nZSBzYW1wbGUgcmF0ZSBvZiAlaSwgZmlsZSBsaWtlbHkgY29ycnVwdCBvciAiCisgICAgICAgICAgICAgICAibmVlZGluZyBhIG5ldyB0YWJsZSBkZXJpdmF0aW9uIG1ldGhvZC5cbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9JTUMpCisgICAgICAgIGF2Y3R4LT5jaGFubmVscyA9IDE7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID4gMikgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJOdW1iZXIgb2YgY2hhbm5lbHMgPiAyIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPmNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgcS0+Y2hjdHhbal0uZGVjb2Rlcl9yZXNldCA9IDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspCisgICAgICAgICAgICBxLT5jaGN0eFtqXS5vbGRfZmxvb3JbaV0gPSAxLjA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IENPRUZGUyAvIDI7IGkrKykKKyAgICAgICAgICAgIHEtPmNoY3R4W2pdLmxhc3RfZmZ0X2ltW2ldID0gMDsKKyAgICB9CisKKyAgICAvKiBCdWlsZCBtZGN0IHdpbmRvdywgYSBzaW1wbGUgc2luZSB3aW5kb3cgbm9ybWFsaXplZCB3aXRoIHNxcnQoMikgKi8KKyAgICBmZl9zaW5lX3dpbmRvd19pbml0KHEtPm1kY3Rfc2luZV93aW5kb3csIENPRUZGUyk7CisgICAgZm9yIChpID0gMDsgaSA8IENPRUZGUzsgaSsrKQorICAgICAgICBxLT5tZGN0X3NpbmVfd2luZG93W2ldICo9IHNxcnQoMi4wKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ09FRkZTIC8gMjsgaSsrKSB7CisgICAgICAgIHEtPnBvc3RfY29zW2ldID0gKDEuMGYgLyAzMjc2OCkgKiBjb3MoaSAvIDI1Ni4wICogTV9QSSk7CisgICAgICAgIHEtPnBvc3Rfc2luW2ldID0gKDEuMGYgLyAzMjc2OCkgKiBzaW4oaSAvIDI1Ni4wICogTV9QSSk7CisKKyAgICAgICAgcjEgPSBzaW4oKGkgKiA0LjAgKyAxLjApIC8gMTAyNC4wICogTV9QSSk7CisgICAgICAgIHIyID0gY29zKChpICogNC4wICsgMS4wKSAvIDEwMjQuMCAqIE1fUEkpOworCisgICAgICAgIGlmIChpICYgMHgxKSB7CisgICAgICAgICAgICBxLT5wcmVfY29lZjFbaV0gPSAgKHIxICsgcjIpICogc3FydCgyLjApOworICAgICAgICAgICAgcS0+cHJlX2NvZWYyW2ldID0gLShyMSAtIHIyKSAqIHNxcnQoMi4wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHEtPnByZV9jb2VmMVtpXSA9IC0ocjEgKyByMikgKiBzcXJ0KDIuMCk7CisgICAgICAgICAgICBxLT5wcmVfY29lZjJbaV0gPSAgKHIxIC0gcjIpICogc3FydCgyLjApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2VuZXJhdGUgYSBzcXVhcmUgcm9vdCB0YWJsZSAqLworCisgICAgZm9yIChpID0gMDsgaSA8IDMwOyBpKyspCisgICAgICAgIHEtPnNxcnRfdGFiW2ldID0gc3FydChpKTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIFZMQyB0YWJsZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNCA7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICBodWZmbWFuX3ZsY1tpXVtqXS50YWJsZSA9ICZ2bGNfdGFibGVzW3ZsY19vZmZzZXRzW2kgKiA0ICsgal1dOworICAgICAgICAgICAgaHVmZm1hbl92bGNbaV1bal0udGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNldHNbaSAqIDQgKyBqICsgMV0gLSB2bGNfb2Zmc2V0c1tpICogNCArIGpdOworICAgICAgICAgICAgaW5pdF92bGMoJmh1ZmZtYW5fdmxjW2ldW2pdLCA5LCBpbWNfaHVmZm1hbl9zaXplc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgIGltY19odWZmbWFuX2xlbnNbaV1bal0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICBpbWNfaHVmZm1hbl9iaXRzW2ldW2pdLCAyLCAyLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0lBQykgeworICAgICAgICBpYWNfZ2VuZXJhdGVfdGFicyhxLCBhdmN0eC0+c2FtcGxlX3JhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShxLT5jeWNsVGFiLCAgY3ljbFRhYiwgIHNpemVvZihjeWNsVGFiKSk7CisgICAgICAgIG1lbWNweShxLT5jeWNsVGFiMiwgY3ljbFRhYjIsIHNpemVvZihjeWNsVGFiMikpOworICAgICAgICBtZW1jcHkocS0+d2VpZ2h0czEsIGltY193ZWlnaHRzMSwgc2l6ZW9mKGltY193ZWlnaHRzMSkpOworICAgICAgICBtZW1jcHkocS0+d2VpZ2h0czIsIGltY193ZWlnaHRzMiwgc2l6ZW9mKGltY193ZWlnaHRzMikpOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfZmZ0X2luaXQoJnEtPmZmdCwgNywgMSkpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJGRlQgaW5pdCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBmZl9ic3dhcGRzcF9pbml0KCZxLT5iZHNwKTsKKyAgICBxLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBpZiAoIXEtPmZkc3ApIHsKKyAgICAgICAgZmZfZmZ0X2VuZCgmcS0+ZmZ0KTsKKworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF2Y3R4LT5zYW1wbGVfZm10ICAgICA9IEFWX1NBTVBMRV9GTVRfRkxUUDsKKyAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBhdmN0eC0+Y2hhbm5lbHMgPT0gMSA/IEFWX0NIX0xBWU9VVF9NT05PCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVl9DSF9MQVlPVVRfU1RFUkVPOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGltY19jYWxjdWxhdGVfY29lZmZzKElNQ0NvbnRleHQgKnEsIGZsb2F0ICpmbGNvZWZmczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZmxjb2VmZnMyLCBpbnQgKmJhbmRXaWR0aFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZmxjb2VmZnMzLCBmbG9hdCAqZmxjb2VmZnM1KQoreworICAgIGZsb2F0ICAgd29ya1QxW0JBTkRTXTsKKyAgICBmbG9hdCAgIHdvcmtUMltCQU5EU107CisgICAgZmxvYXQgICB3b3JrVDNbQkFORFNdOworICAgIGZsb2F0ICAgc25yX2xpbWl0ID0gMS5lLTMwOworICAgIGZsb2F0ICAgYWNjdW0gPSAwLjA7CisgICAgaW50IGksIGNudDI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkFORFM7IGkrKykgeworICAgICAgICBmbGNvZWZmczVbaV0gPSB3b3JrVDJbaV0gPSAwLjA7CisgICAgICAgIGlmIChiYW5kV2lkdGhUW2ldKSB7CisgICAgICAgICAgICB3b3JrVDFbaV0gPSBmbGNvZWZmczFbaV0gKiBmbGNvZWZmczFbaV07CisgICAgICAgICAgICBmbGNvZWZmczNbaV0gPSAyLjAgKiBmbGNvZWZmczJbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3b3JrVDFbaV0gICAgPSAwLjA7CisgICAgICAgICAgICBmbGNvZWZmczNbaV0gPSAtMzAwMDAuMDsKKyAgICAgICAgfQorICAgICAgICB3b3JrVDNbaV0gPSBiYW5kV2lkdGhUW2ldICogd29ya1QxW2ldICogMC4wMTsKKyAgICAgICAgaWYgKHdvcmtUM1tpXSA8PSBzbnJfbGltaXQpCisgICAgICAgICAgICB3b3JrVDNbaV0gPSAwLjA7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspIHsKKyAgICAgICAgZm9yIChjbnQyID0gaTsgY250MiA8IHEtPmN5Y2xUYWJbaV07IGNudDIrKykKKyAgICAgICAgICAgIGZsY29lZmZzNVtjbnQyXSA9IGZsY29lZmZzNVtjbnQyXSArIHdvcmtUM1tpXTsKKyAgICAgICAgd29ya1QyW2NudDIgLSAxXSA9IHdvcmtUMltjbnQyIC0gMV0gKyB3b3JrVDNbaV07CisgICAgfQorCisgICAgZm9yIChpID0gMTsgaSA8IEJBTkRTOyBpKyspIHsKKyAgICAgICAgYWNjdW0gPSAod29ya1QyW2kgLSAxXSArIGFjY3VtKSAqIHEtPndlaWdodHMxW2kgLSAxXTsKKyAgICAgICAgZmxjb2VmZnM1W2ldICs9IGFjY3VtOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBCQU5EUzsgaSsrKQorICAgICAgICB3b3JrVDJbaV0gPSAwLjA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkFORFM7IGkrKykgeworICAgICAgICBmb3IgKGNudDIgPSBpIC0gMTsgY250MiA+IHEtPmN5Y2xUYWIyW2ldOyBjbnQyLS0pCisgICAgICAgICAgICBmbGNvZWZmczVbY250Ml0gKz0gd29ya1QzW2ldOworICAgICAgICB3b3JrVDJbY250MisxXSArPSB3b3JrVDNbaV07CisgICAgfQorCisgICAgYWNjdW0gPSAwLjA7CisKKyAgICBmb3IgKGkgPSBCQU5EUy0yOyBpID49IDA7IGktLSkgeworICAgICAgICBhY2N1bSA9ICh3b3JrVDJbaSsxXSArIGFjY3VtKSAqIHEtPndlaWdodHMyW2ldOworICAgICAgICBmbGNvZWZmczVbaV0gKz0gYWNjdW07CisgICAgICAgIC8vIHRoZXJlIGlzIG1pc3NpbmcgY29kZSBoZXJlLCBidXQgaXQgc2VlbXMgdG8gbmV2ZXIgYmUgdHJpZ2dlcmVkCisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGltY19yZWFkX2xldmVsX2NvZWZmcyhJTUNDb250ZXh0ICpxLCBpbnQgc3RyZWFtX2Zvcm1hdF9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGV2bENvZWZmcykKK3sKKyAgICBpbnQgaTsKKyAgICBWTEMgKmh1ZmZ0YWJbNF07CisgICAgaW50IHN0YXJ0ID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpjYl9zZWw7CisgICAgaW50IHM7CisKKyAgICBzID0gc3RyZWFtX2Zvcm1hdF9jb2RlID4+IDE7CisgICAgaHVmZnRhYlswXSA9ICZodWZmbWFuX3ZsY1tzXVswXTsKKyAgICBodWZmdGFiWzFdID0gJmh1ZmZtYW5fdmxjW3NdWzFdOworICAgIGh1ZmZ0YWJbMl0gPSAmaHVmZm1hbl92bGNbc11bMl07CisgICAgaHVmZnRhYlszXSA9ICZodWZmbWFuX3ZsY1tzXVszXTsKKyAgICBjYl9zZWwgPSBpbWNfY2Jfc2VsZWN0W3NdOworCisgICAgaWYgKHN0cmVhbV9mb3JtYXRfY29kZSAmIDQpCisgICAgICAgIHN0YXJ0ID0gMTsKKyAgICBpZiAoc3RhcnQpCisgICAgICAgIGxldmxDb2VmZnNbMF0gPSBnZXRfYml0cygmcS0+Z2IsIDcpOworICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgQkFORFM7IGkrKykgeworICAgICAgICBsZXZsQ29lZmZzW2ldID0gZ2V0X3ZsYzIoJnEtPmdiLCBodWZmdGFiW2NiX3NlbFtpXV0tPnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZnRhYltjYl9zZWxbaV1dLT5iaXRzLCAyKTsKKyAgICAgICAgaWYgKGxldmxDb2VmZnNbaV0gPT0gMTcpCisgICAgICAgICAgICBsZXZsQ29lZmZzW2ldICs9IGdldF9iaXRzKCZxLT5nYiwgNCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpbWNfcmVhZF9sZXZlbF9jb2VmZnNfcmF3KElNQ0NvbnRleHQgKnEsIGludCBzdHJlYW1fZm9ybWF0X2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGV2bENvZWZmcykKK3sKKyAgICBpbnQgaTsKKworICAgIHEtPmNvZWYwX3BvcyAgPSBnZXRfYml0cygmcS0+Z2IsIDUpOworICAgIGxldmxDb2VmZnNbMF0gPSBnZXRfYml0cygmcS0+Z2IsIDcpOworICAgIGZvciAoaSA9IDE7IGkgPCBCQU5EUzsgaSsrKQorICAgICAgICBsZXZsQ29lZmZzW2ldID0gZ2V0X2JpdHMoJnEtPmdiLCA0KTsKK30KKworc3RhdGljIHZvaWQgaW1jX2RlY29kZV9sZXZlbF9jb2VmZmljaWVudHMoSU1DQ29udGV4dCAqcSwgaW50ICpsZXZsQ29lZmZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZmxjb2VmZnMxLCBmbG9hdCAqZmxjb2VmZnMyKQoreworICAgIGludCBpLCBsZXZlbDsKKyAgICBmbG9hdCB0bXAsIHRtcDI7CisgICAgLy8gbWF5YmUgc29tZSBmcmVxdWVuY3kgZGl2aXNpb24gdGhpbmd5CisKKyAgICBmbGNvZWZmczFbMF0gPSAyMDAwMC4wIC8gZXhwMiAobGV2bENvZWZmQnVmWzBdICogMC4xODk0NSk7IC8vIDAuMTg5NDUgPSBsb2cyKDEwKSAqIDAuMDU3MDMxMjUKKyAgICBmbGNvZWZmczJbMF0gPSBsb2cyZihmbGNvZWZmczFbMF0pOworICAgIHRtcCAgPSBmbGNvZWZmczFbMF07CisgICAgdG1wMiA9IGZsY29lZmZzMlswXTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBCQU5EUzsgaSsrKSB7CisgICAgICAgIGxldmVsID0gbGV2bENvZWZmQnVmW2ldOworICAgICAgICBpZiAobGV2ZWwgPT0gMTYpIHsKKyAgICAgICAgICAgIGZsY29lZmZzMVtpXSA9IDEuMDsKKyAgICAgICAgICAgIGZsY29lZmZzMltpXSA9IDAuMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA8IDE3KQorICAgICAgICAgICAgICAgIGxldmVsIC09IDc7CisgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8PSAyNCkKKyAgICAgICAgICAgICAgICBsZXZlbCAtPSAzMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZXZlbCAtPSAxNjsKKworICAgICAgICAgICAgdG1wICAqPSBpbWNfZXhwX3RhYlsxNSArIGxldmVsXTsKKyAgICAgICAgICAgIHRtcDIgKz0gMC44MzA0OCAqIGxldmVsOyAgLy8gMC44MzA0OCA9IGxvZzIoMTApICogMC4yNQorICAgICAgICAgICAgZmxjb2VmZnMxW2ldID0gdG1wOworICAgICAgICAgICAgZmxjb2VmZnMyW2ldID0gdG1wMjsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBpbWNfZGVjb2RlX2xldmVsX2NvZWZmaWNpZW50czIoSU1DQ29udGV4dCAqcSwgaW50ICpsZXZsQ29lZmZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm9sZF9mbG9vciwgZmxvYXQgKmZsY29lZmZzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZmxjb2VmZnMyKQoreworICAgIGludCBpOworICAgIC8qIEZJWE1FIG1heWJlIGZsYWdfYnVmID0gbm9pc2UgY29kaW5nIGFuZCBmbGNvZWZmczEgPSBuZXcgc2NhbGUgZmFjdG9ycworICAgICAqICAgICAgIGFuZCBmbGNvZWZmczIgb2xkIHNjYWxlIGZhY3RvcnMKKyAgICAgKiAgICAgICBtaWdodCBiZSBpbmNvbXBsZXRlIGR1ZSB0byBhIG1pc3NpbmcgdGFibGUgdGhhdCBpcyBpbiB0aGUgYmluYXJ5IGNvZGUKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQkFORFM7IGkrKykgeworICAgICAgICBmbGNvZWZmczFbaV0gPSAwOworICAgICAgICBpZiAobGV2bENvZWZmQnVmW2ldIDwgMTYpIHsKKyAgICAgICAgICAgIGZsY29lZmZzMVtpXSA9IGltY19leHBfdGFiMltsZXZsQ29lZmZCdWZbaV1dICogb2xkX2Zsb29yW2ldOworICAgICAgICAgICAgZmxjb2VmZnMyW2ldID0gKGxldmxDb2VmZkJ1ZltpXSAtIDcpICogMC44MzA0OCArIGZsY29lZmZzMltpXTsgLy8gMC44MzA0OCA9IGxvZzIoMTApICogMC4yNQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxjb2VmZnMxW2ldID0gb2xkX2Zsb29yW2ldOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpbWNfZGVjb2RlX2xldmVsX2NvZWZmaWNpZW50c19yYXcoSU1DQ29udGV4dCAqcSwgaW50ICpsZXZsQ29lZmZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmZsY29lZmZzMSwgZmxvYXQgKmZsY29lZmZzMikKK3sKKyAgICBpbnQgaSwgbGV2ZWwsIHBvczsKKyAgICBmbG9hdCB0bXAsIHRtcDI7CisKKyAgICBwb3MgPSBxLT5jb2VmMF9wb3M7CisgICAgZmxjb2VmZnMxW3Bvc10gPSAyMDAwMC4wIC8gcG93ICgyLCBsZXZsQ29lZmZCdWZbMF0gKiAwLjE4OTQ1KTsgLy8gMC4xODk0NSA9IGxvZzIoMTApICogMC4wNTcwMzEyNQorICAgIGZsY29lZmZzMltwb3NdID0gbG9nMmYoZmxjb2VmZnMxWzBdKTsKKyAgICB0bXAgID0gZmxjb2VmZnMxW3Bvc107CisgICAgdG1wMiA9IGZsY29lZmZzMltwb3NdOworCisgICAgbGV2bENvZWZmQnVmKys7CisgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPT0gcG9zKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGxldmVsID0gKmxldmxDb2VmZkJ1ZisrOworICAgICAgICBmbGNvZWZmczFbaV0gPSB0bXAgICogcG93ZigxMC4wLCAtbGV2ZWwgKiAwLjQzNzUpOyAvL3RvZG8gdGFiCisgICAgICAgIGZsY29lZmZzMltpXSA9IHRtcDIgLSAxLjQ1MzM0MzU0MTUgKiBsZXZlbDsgLy8gMS40NTMzNDM1NDE1ID0gbG9nMigxMCkgKiAwLjQzNzUKKyAgICB9Cit9CisKKy8qKgorICogUGVyZm9ybSBiaXQgYWxsb2NhdGlvbiBkZXBlbmRpbmcgb24gYml0cyBhdmFpbGFibGUKKyAqLworc3RhdGljIGludCBiaXRfYWxsb2NhdGlvbihJTUNDb250ZXh0ICpxLCBJTUNDaGFubmVsICpjaGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9mb3JtYXRfY29kZSwgaW50IGZyZWViaXRzLCBpbnQgZmxhZykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBjb25zdCBmbG9hdCBsaW1pdCA9IC0xLmUyMDsKKyAgICBmbG9hdCBoaWdoZXN0ID0gMC4wOworICAgIGludCBpbmR4OworICAgIGludCB0MSA9IDA7CisgICAgaW50IHQyID0gMTsKKyAgICBmbG9hdCBzdW1tYSA9IDAuMDsKKyAgICBpbnQgaWFjYyA9IDA7CisgICAgaW50IHN1bW1lciA9IDA7CisgICAgaW50IHJyZXMsIGN3bGVuOworICAgIGZsb2F0IGxvd2VzdCA9IDEuZTEwOworICAgIGludCBsb3dfaW5keCA9IDA7CisgICAgZmxvYXQgd29ya1RbMzJdOworICAgIGludCBmbGc7CisgICAgaW50IGZvdW5kX2luZHggPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspCisgICAgICAgIGhpZ2hlc3QgPSBGRk1BWChoaWdoZXN0LCBjaGN0eC0+Zmxjb2VmZnMxW2ldKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCQU5EUyAtIDE7IGkrKykgeworICAgICAgICBpZiAoY2hjdHgtPmZsY29lZmZzNVtpXSA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiZmxjb2VmZnM1ICVmIGludmFsaWRcbiIsIGNoY3R4LT5mbGNvZWZmczVbaV0pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgY2hjdHgtPmZsY29lZmZzNFtpXSA9IGNoY3R4LT5mbGNvZWZmczNbaV0gLSBsb2cyZihjaGN0eC0+Zmxjb2VmZnM1W2ldKTsKKyAgICB9CisgICAgY2hjdHgtPmZsY29lZmZzNFtCQU5EUyAtIDFdID0gbGltaXQ7CisKKyAgICBoaWdoZXN0ID0gaGlnaGVzdCAqIDAuMjU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkFORFM7IGkrKykgeworICAgICAgICBpbmR4ID0gLTE7CisgICAgICAgIGlmICgoYmFuZF90YWJbaSArIDFdIC0gYmFuZF90YWJbaV0pID09IGNoY3R4LT5iYW5kV2lkdGhUW2ldKQorICAgICAgICAgICAgaW5keCA9IDA7CisKKyAgICAgICAgaWYgKChiYW5kX3RhYltpICsgMV0gLSBiYW5kX3RhYltpXSkgPiBjaGN0eC0+YmFuZFdpZHRoVFtpXSkKKyAgICAgICAgICAgIGluZHggPSAxOworCisgICAgICAgIGlmICgoKGJhbmRfdGFiW2kgKyAxXSAtIGJhbmRfdGFiW2ldKSAvIDIpID49IGNoY3R4LT5iYW5kV2lkdGhUW2ldKQorICAgICAgICAgICAgaW5keCA9IDI7CisKKyAgICAgICAgaWYgKGluZHggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBjaGN0eC0+Zmxjb2VmZnM0W2ldICs9IHhUYWJbKGluZHggKiAyICsgKGNoY3R4LT5mbGNvZWZmczFbaV0gPCBoaWdoZXN0KSkgKiAyICsgZmxhZ107CisgICAgfQorCisgICAgaWYgKHN0cmVhbV9mb3JtYXRfY29kZSAmIDB4MikgeworICAgICAgICBjaGN0eC0+Zmxjb2VmZnM0WzBdID0gbGltaXQ7CisgICAgICAgIGNoY3R4LT5mbGNvZWZmczRbMV0gPSBsaW1pdDsKKyAgICAgICAgY2hjdHgtPmZsY29lZmZzNFsyXSA9IGxpbWl0OworICAgICAgICBjaGN0eC0+Zmxjb2VmZnM0WzNdID0gbGltaXQ7CisgICAgfQorCisgICAgZm9yIChpID0gKHN0cmVhbV9mb3JtYXRfY29kZSAmIDB4MikgPyA0IDogMDsgaSA8IEJBTkRTIC0gMTsgaSsrKSB7CisgICAgICAgIGlhY2MgICs9IGNoY3R4LT5iYW5kV2lkdGhUW2ldOworICAgICAgICBzdW1tYSArPSBjaGN0eC0+YmFuZFdpZHRoVFtpXSAqIGNoY3R4LT5mbGNvZWZmczRbaV07CisgICAgfQorCisgICAgaWYgKCFpYWNjKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGNoY3R4LT5iYW5kV2lkdGhUW0JBTkRTIC0gMV0gPSAwOworICAgIHN1bW1hID0gKHN1bW1hICogMC41IC0gZnJlZWJpdHMpIC8gaWFjYzsKKworCisgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTIC8gMjsgaSsrKSB7CisgICAgICAgIHJyZXMgPSBzdW1tZXIgLSBmcmVlYml0czsKKyAgICAgICAgaWYgKChycmVzID49IC04KSAmJiAocnJlcyA8PSA4KSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHN1bW1lciA9IDA7CisgICAgICAgIGlhY2MgICA9IDA7CisKKyAgICAgICAgZm9yIChqID0gKHN0cmVhbV9mb3JtYXRfY29kZSAmIDB4MikgPyA0IDogMDsgaiA8IEJBTkRTOyBqKyspIHsKKyAgICAgICAgICAgIGN3bGVuID0gYXZfY2xpcGYoKChjaGN0eC0+Zmxjb2VmZnM0W2pdICogMC41KSAtIHN1bW1hICsgMC41KSwgMCwgNik7CisKKyAgICAgICAgICAgIGNoY3R4LT5iaXRzQmFuZFRbal0gPSBjd2xlbjsKKyAgICAgICAgICAgIHN1bW1lciArPSBjaGN0eC0+YmFuZFdpZHRoVFtqXSAqIGN3bGVuOworCisgICAgICAgICAgICBpZiAoY3dsZW4gPiAwKQorICAgICAgICAgICAgICAgIGlhY2MgKz0gY2hjdHgtPmJhbmRXaWR0aFRbal07CisgICAgICAgIH0KKworICAgICAgICBmbGcgPSB0MjsKKyAgICAgICAgdDIgPSAxOworICAgICAgICBpZiAoZnJlZWJpdHMgPCBzdW1tZXIpCisgICAgICAgICAgICB0MiA9IC0xOworICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgZmxnID0gdDI7CisgICAgICAgIGlmIChmbGcgIT0gdDIpCisgICAgICAgICAgICB0MSsrOworCisgICAgICAgIHN1bW1hID0gKGZsb2F0KShzdW1tZXIgLSBmcmVlYml0cykgLyAoKHQxICsgMSkgKiBpYWNjKSArIHN1bW1hOworICAgIH0KKworICAgIGZvciAoaSA9IChzdHJlYW1fZm9ybWF0X2NvZGUgJiAweDIpID8gNCA6IDA7IGkgPCBCQU5EUzsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IGJhbmRfdGFiW2ldOyBqIDwgYmFuZF90YWJbaSArIDFdOyBqKyspCisgICAgICAgICAgICBjaGN0eC0+Q1dsZW5ndGhUW2pdID0gY2hjdHgtPmJpdHNCYW5kVFtpXTsKKyAgICB9CisKKyAgICBpZiAoZnJlZWJpdHMgPiBzdW1tZXIpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspIHsKKyAgICAgICAgICAgIHdvcmtUW2ldID0gKGNoY3R4LT5iaXRzQmFuZFRbaV0gPT0gNikgPyAtMS5lMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChjaGN0eC0+Yml0c0JhbmRUW2ldICogLTIgKyBjaGN0eC0+Zmxjb2VmZnM0W2ldIC0gMC40MTUpOworICAgICAgICB9CisKKyAgICAgICAgaGlnaGVzdCA9IDAuMDsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoaGlnaGVzdCA8PSAtMS5lMjApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGZvdW5kX2luZHggPSAwOworICAgICAgICAgICAgaGlnaGVzdCA9IC0xLmUyMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAod29ya1RbaV0gPiBoaWdoZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGhpZ2hlc3QgPSB3b3JrVFtpXTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfaW5keCA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaGlnaGVzdCA+IC0xLmUyMCkgeworICAgICAgICAgICAgICAgIHdvcmtUW2ZvdW5kX2luZHhdIC09IDIuMDsKKyAgICAgICAgICAgICAgICBpZiAoKytjaGN0eC0+Yml0c0JhbmRUW2ZvdW5kX2luZHhdID09IDYpCisgICAgICAgICAgICAgICAgICAgIHdvcmtUW2ZvdW5kX2luZHhdID0gLTEuZTIwOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gYmFuZF90YWJbZm91bmRfaW5keF07IGogPCBiYW5kX3RhYltmb3VuZF9pbmR4ICsgMV0gJiYgKGZyZWViaXRzID4gc3VtbWVyKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5DV2xlbmd0aFRbal0rKzsKKyAgICAgICAgICAgICAgICAgICAgc3VtbWVyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChmcmVlYml0cyA+IHN1bW1lcik7CisgICAgfQorICAgIGlmIChmcmVlYml0cyA8IHN1bW1lcikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQkFORFM7IGkrKykgeworICAgICAgICAgICAgd29ya1RbaV0gPSBjaGN0eC0+Yml0c0JhbmRUW2ldID8gKGNoY3R4LT5iaXRzQmFuZFRbaV0gKiAtMiArIGNoY3R4LT5mbGNvZWZmczRbaV0gKyAxLjU4NSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMS5lMjA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbV9mb3JtYXRfY29kZSAmIDB4MikgeworICAgICAgICAgICAgd29ya1RbMF0gPSAxLmUyMDsKKyAgICAgICAgICAgIHdvcmtUWzFdID0gMS5lMjA7CisgICAgICAgICAgICB3b3JrVFsyXSA9IDEuZTIwOworICAgICAgICAgICAgd29ya1RbM10gPSAxLmUyMDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoZnJlZWJpdHMgPCBzdW1tZXIpIHsKKyAgICAgICAgICAgIGxvd2VzdCAgID0gMS5lMTA7CisgICAgICAgICAgICBsb3dfaW5keCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQkFORFM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh3b3JrVFtpXSA8IGxvd2VzdCkgeworICAgICAgICAgICAgICAgICAgICBsb3dlc3QgICA9IHdvcmtUW2ldOworICAgICAgICAgICAgICAgICAgICBsb3dfaW5keCA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgKGxvd2VzdCA+PSAxLmUxMCkKKyAgICAgICAgICAgIC8vICAgICBicmVhazsKKyAgICAgICAgICAgIHdvcmtUW2xvd19pbmR4XSA9IGxvd2VzdCArIDIuMDsKKworICAgICAgICAgICAgaWYgKCEtLWNoY3R4LT5iaXRzQmFuZFRbbG93X2luZHhdKQorICAgICAgICAgICAgICAgIHdvcmtUW2xvd19pbmR4XSA9IDEuZTIwOworCisgICAgICAgICAgICBmb3IgKGogPSBiYW5kX3RhYltsb3dfaW5keF07IGogPCBiYW5kX3RhYltsb3dfaW5keCsxXSAmJiAoZnJlZWJpdHMgPCBzdW1tZXIpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hjdHgtPkNXbGVuZ3RoVFtqXSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY2hjdHgtPkNXbGVuZ3RoVFtqXS0tOworICAgICAgICAgICAgICAgICAgICBzdW1tZXItLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGltY19nZXRfc2tpcF9jb2VmZihJTUNDb250ZXh0ICpxLCBJTUNDaGFubmVsICpjaGN0eCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIG1lbXNldChjaGN0eC0+c2tpcEZsYWdCaXRzLCAgMCwgc2l6ZW9mKGNoY3R4LT5za2lwRmxhZ0JpdHMpKTsKKyAgICBtZW1zZXQoY2hjdHgtPnNraXBGbGFnQ291bnQsIDAsIHNpemVvZihjaGN0eC0+c2tpcEZsYWdDb3VudCkpOworICAgIGZvciAoaSA9IDA7IGkgPCBCQU5EUzsgaSsrKSB7CisgICAgICAgIGlmICghY2hjdHgtPmJhbmRGbGFnc0J1ZltpXSB8fCAhY2hjdHgtPmJhbmRXaWR0aFRbaV0pCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoIWNoY3R4LT5za2lwRmxhZ1Jhd1tpXSkgeworICAgICAgICAgICAgY2hjdHgtPnNraXBGbGFnQml0c1tpXSA9IGJhbmRfdGFiW2kgKyAxXSAtIGJhbmRfdGFiW2ldOworCisgICAgICAgICAgICBmb3IgKGogPSBiYW5kX3RhYltpXTsgaiA8IGJhbmRfdGFiW2kgKyAxXTsgaisrKSB7CisgICAgICAgICAgICAgICAgY2hjdHgtPnNraXBGbGFnc1tqXSA9IGdldF9iaXRzMSgmcS0+Z2IpOworICAgICAgICAgICAgICAgIGlmIChjaGN0eC0+c2tpcEZsYWdzW2pdKQorICAgICAgICAgICAgICAgICAgICBjaGN0eC0+c2tpcEZsYWdDb3VudFtpXSsrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChqID0gYmFuZF90YWJbaV07IGogPCBiYW5kX3RhYltpICsgMV0gLSAxOyBqICs9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldF9iaXRzMSgmcS0+Z2IpKSB7IC8vIDAKKyAgICAgICAgICAgICAgICAgICAgY2hjdHgtPnNraXBGbGFnQml0c1tpXSsrOworICAgICAgICAgICAgICAgICAgICBjaGN0eC0+c2tpcEZsYWdzW2pdICAgICAgPSAxOworICAgICAgICAgICAgICAgICAgICBjaGN0eC0+c2tpcEZsYWdzW2ogKyAxXSAgPSAxOworICAgICAgICAgICAgICAgICAgICBjaGN0eC0+c2tpcEZsYWdDb3VudFtpXSArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnEtPmdiKSkgeyAvLyAxMQorICAgICAgICAgICAgICAgICAgICAgICAgY2hjdHgtPnNraXBGbGFnQml0c1tpXSArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgY2hjdHgtPnNraXBGbGFnc1tqXSAgICAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY2hjdHgtPnNraXBGbGFnc1tqICsgMV0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgY2hjdHgtPnNraXBGbGFnQ291bnRbaV0rKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5za2lwRmxhZ0JpdHNbaV0gKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5za2lwRmxhZ3NbaiArIDFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0X2JpdHMxKCZxLT5nYikpIHsgLy8gMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hjdHgtPnNraXBGbGFnc1tqXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hjdHgtPnNraXBGbGFnQ291bnRbaV0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIDEwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5za2lwRmxhZ3Nbal0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaiA8IGJhbmRfdGFiW2kgKyAxXSkgeworICAgICAgICAgICAgICAgIGNoY3R4LT5za2lwRmxhZ0JpdHNbaV0rKzsKKyAgICAgICAgICAgICAgICBpZiAoKGNoY3R4LT5za2lwRmxhZ3Nbal0gPSBnZXRfYml0czEoJnEtPmdiKSkpCisgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5za2lwRmxhZ0NvdW50W2ldKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogSW5jcmVhc2UgaGlnaGVzdCcgYmFuZCBjb2VmZmljaWVudCBzaXplcyBhcyBzb21lIGJpdHMgd29uJ3QgYmUgdXNlZAorICovCitzdGF0aWMgdm9pZCBpbWNfYWRqdXN0X2JpdF9hbGxvY2F0aW9uKElNQ0NvbnRleHQgKnEsIElNQ0NoYW5uZWwgKmNoY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VtbWVyKQoreworICAgIGZsb2F0IHdvcmtUWzMyXTsKKyAgICBpbnQgY29ycmVjdGVkID0gMDsKKyAgICBpbnQgaSwgajsKKyAgICBmbG9hdCBoaWdoZXN0ICA9IDA7CisgICAgaW50IGZvdW5kX2luZHggPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspIHsKKyAgICAgICAgd29ya1RbaV0gPSAoY2hjdHgtPmJpdHNCYW5kVFtpXSA9PSA2KSA/IC0xLmUyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoY2hjdHgtPmJpdHNCYW5kVFtpXSAqIC0yICsgY2hjdHgtPmZsY29lZmZzNFtpXSAtIDAuNDE1KTsKKyAgICB9CisKKyAgICB3aGlsZSAoY29ycmVjdGVkIDwgc3VtbWVyKSB7CisgICAgICAgIGlmIChoaWdoZXN0IDw9IC0xLmUyMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGhpZ2hlc3QgPSAtMS5lMjA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh3b3JrVFtpXSA+IGhpZ2hlc3QpIHsKKyAgICAgICAgICAgICAgICBoaWdoZXN0ID0gd29ya1RbaV07CisgICAgICAgICAgICAgICAgZm91bmRfaW5keCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGlnaGVzdCA+IC0xLmUyMCkgeworICAgICAgICAgICAgd29ya1RbZm91bmRfaW5keF0gLT0gMi4wOworICAgICAgICAgICAgaWYgKCsrKGNoY3R4LT5iaXRzQmFuZFRbZm91bmRfaW5keF0pID09IDYpCisgICAgICAgICAgICAgICAgd29ya1RbZm91bmRfaW5keF0gPSAtMS5lMjA7CisKKyAgICAgICAgICAgIGZvciAoaiA9IGJhbmRfdGFiW2ZvdW5kX2luZHhdOyBqIDwgYmFuZF90YWJbZm91bmRfaW5keCsxXSAmJiAoY29ycmVjdGVkIDwgc3VtbWVyKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjaGN0eC0+c2tpcEZsYWdzW2pdICYmIChjaGN0eC0+Q1dsZW5ndGhUW2pdIDwgNikpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hjdHgtPkNXbGVuZ3RoVFtqXSsrOworICAgICAgICAgICAgICAgICAgICBjb3JyZWN0ZWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGltY19pbWRjdDI1NihJTUNDb250ZXh0ICpxLCBJTUNDaGFubmVsICpjaGN0eCwgaW50IGNoYW5uZWxzKQoreworICAgIGludCBpOworICAgIGZsb2F0IHJlLCBpbTsKKyAgICBmbG9hdCAqZHN0MSA9IHEtPm91dF9zYW1wbGVzOworICAgIGZsb2F0ICpkc3QyID0gcS0+b3V0X3NhbXBsZXMgKyAoQ09FRkZTIC0gMSk7CisKKyAgICAvKiBwcmVyb3RhdGlvbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBDT0VGRlMgLyAyOyBpKyspIHsKKyAgICAgICAgcS0+c2FtcGxlc1tpXS5yZSA9IC0ocS0+cHJlX2NvZWYxW2ldICogY2hjdHgtPkNXZGVjb2RlZFtDT0VGRlMgLSAxIC0gaSAqIDJdKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHEtPnByZV9jb2VmMltpXSAqIGNoY3R4LT5DV2RlY29kZWRbaSAqIDJdKTsKKyAgICAgICAgcS0+c2FtcGxlc1tpXS5pbSA9ICAocS0+cHJlX2NvZWYyW2ldICogY2hjdHgtPkNXZGVjb2RlZFtDT0VGRlMgLSAxIC0gaSAqIDJdKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHEtPnByZV9jb2VmMVtpXSAqIGNoY3R4LT5DV2RlY29kZWRbaSAqIDJdKTsKKyAgICB9CisKKyAgICAvKiBGRlQgKi8KKyAgICBxLT5mZnQuZmZ0X3Blcm11dGUoJnEtPmZmdCwgcS0+c2FtcGxlcyk7CisgICAgcS0+ZmZ0LmZmdF9jYWxjKCZxLT5mZnQsIHEtPnNhbXBsZXMpOworCisgICAgLyogcG9zdHJvdGF0aW9uLCB3aW5kb3cgYW5kIHJlb3JkZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQ09FRkZTIC8gMjsgaSsrKSB7CisgICAgICAgIHJlID0gKCBxLT5zYW1wbGVzW2ldLnJlICogcS0+cG9zdF9jb3NbaV0pICsgKC1xLT5zYW1wbGVzW2ldLmltICogcS0+cG9zdF9zaW5baV0pOworICAgICAgICBpbSA9ICgtcS0+c2FtcGxlc1tpXS5pbSAqIHEtPnBvc3RfY29zW2ldKSAtICggcS0+c2FtcGxlc1tpXS5yZSAqIHEtPnBvc3Rfc2luW2ldKTsKKyAgICAgICAgKmRzdDEgPSAgKHEtPm1kY3Rfc2luZV93aW5kb3dbQ09FRkZTIC0gMSAtIGkgKiAyXSAqIGNoY3R4LT5sYXN0X2ZmdF9pbVtpXSkKKyAgICAgICAgICAgICAgICsgKHEtPm1kY3Rfc2luZV93aW5kb3dbaSAqIDJdICogcmUpOworICAgICAgICAqZHN0MiA9ICAocS0+bWRjdF9zaW5lX3dpbmRvd1tpICogMl0gKiBjaGN0eC0+bGFzdF9mZnRfaW1baV0pCisgICAgICAgICAgICAgICAtIChxLT5tZGN0X3NpbmVfd2luZG93W0NPRUZGUyAtIDEgLSBpICogMl0gKiByZSk7CisgICAgICAgIGRzdDEgKz0gMjsKKyAgICAgICAgZHN0MiAtPSAyOworICAgICAgICBjaGN0eC0+bGFzdF9mZnRfaW1baV0gPSBpbTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaW52ZXJzZV9xdWFudF9jb2VmZihJTUNDb250ZXh0ICpxLCBJTUNDaGFubmVsICpjaGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX2Zvcm1hdF9jb2RlKQoreworICAgIGludCBpLCBqOworICAgIGludCBtaWRkbGVfdmFsdWUsIGN3X2xlbiwgbWF4X3NpemU7CisgICAgY29uc3QgZmxvYXQgKnF1YW50aXplcjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCQU5EUzsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IGJhbmRfdGFiW2ldOyBqIDwgYmFuZF90YWJbaSArIDFdOyBqKyspIHsKKyAgICAgICAgICAgIGNoY3R4LT5DV2RlY29kZWRbal0gPSAwOworICAgICAgICAgICAgY3dfbGVuID0gY2hjdHgtPkNXbGVuZ3RoVFtqXTsKKworICAgICAgICAgICAgaWYgKGN3X2xlbiA8PSAwIHx8IGNoY3R4LT5za2lwRmxhZ3Nbal0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIG1heF9zaXplICAgICA9IDEgPDwgY3dfbGVuOworICAgICAgICAgICAgbWlkZGxlX3ZhbHVlID0gbWF4X3NpemUgPj4gMTsKKworICAgICAgICAgICAgaWYgKGNoY3R4LT5jb2Rld29yZHNbal0gPj0gbWF4X3NpemUgfHwgY2hjdHgtPmNvZGV3b3Jkc1tqXSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIGlmIChjd19sZW4gPj0gNCkgeworICAgICAgICAgICAgICAgIHF1YW50aXplciA9IGltY19xdWFudGl6ZXIyWyhzdHJlYW1fZm9ybWF0X2NvZGUgJiAyKSA+PiAxXTsKKyAgICAgICAgICAgICAgICBpZiAoY2hjdHgtPmNvZGV3b3Jkc1tqXSA+PSBtaWRkbGVfdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5DV2RlY29kZWRbal0gPSAgcXVhbnRpemVyW2NoY3R4LT5jb2Rld29yZHNbal0gLSA4XSAgICAgICAgICAgICAgICAqIGNoY3R4LT5mbGNvZWZmczZbaV07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjaGN0eC0+Q1dkZWNvZGVkW2pdID0gLXF1YW50aXplclttYXhfc2l6ZSAtIGNoY3R4LT5jb2Rld29yZHNbal0gLSA4IC0gMV0gKiBjaGN0eC0+Zmxjb2VmZnM2W2ldOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcXVhbnRpemVyID0gaW1jX3F1YW50aXplcjFbKChzdHJlYW1fZm9ybWF0X2NvZGUgJiAyKSA+PiAxKSB8IChjaGN0eC0+YmFuZEZsYWdzQnVmW2ldIDw8IDEpXTsKKyAgICAgICAgICAgICAgICBpZiAoY2hjdHgtPmNvZGV3b3Jkc1tqXSA+PSBtaWRkbGVfdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5DV2RlY29kZWRbal0gPSAgcXVhbnRpemVyW2NoY3R4LT5jb2Rld29yZHNbal0gLSAxXSAgICAgICAgICAgICogY2hjdHgtPmZsY29lZmZzNltpXTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5DV2RlY29kZWRbal0gPSAtcXVhbnRpemVyW21heF9zaXplIC0gMiAtIGNoY3R4LT5jb2Rld29yZHNbal1dICogY2hjdHgtPmZsY29lZmZzNltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGltY19nZXRfY29lZmZzKElNQ0NvbnRleHQgKnEsIElNQ0NoYW5uZWwgKmNoY3R4KQoreworICAgIGludCBpLCBqLCBjd19sZW4sIGN3OworCisgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspIHsKKyAgICAgICAgaWYgKCFjaGN0eC0+c3VtTGVuQXJyW2ldKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChjaGN0eC0+YmFuZEZsYWdzQnVmW2ldIHx8IGNoY3R4LT5iYW5kV2lkdGhUW2ldKSB7CisgICAgICAgICAgICBmb3IgKGogPSBiYW5kX3RhYltpXTsgaiA8IGJhbmRfdGFiW2kgKyAxXTsgaisrKSB7CisgICAgICAgICAgICAgICAgY3dfbGVuID0gY2hjdHgtPkNXbGVuZ3RoVFtqXTsKKyAgICAgICAgICAgICAgICBjdyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfY291bnQoJnEtPmdiKSArIGN3X2xlbiA+IDUxMikgeworICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJCYW5kICVpIGNvZWZmICVpIGN3X2xlbiAlaVxuIiwgaSwgaiwgY3dfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGN3X2xlbiAmJiAoIWNoY3R4LT5iYW5kRmxhZ3NCdWZbaV0gfHwgIWNoY3R4LT5za2lwRmxhZ3Nbal0pKQorICAgICAgICAgICAgICAgICAgICBjdyA9IGdldF9iaXRzKCZxLT5nYiwgY3dfbGVuKTsKKworICAgICAgICAgICAgICAgIGNoY3R4LT5jb2Rld29yZHNbal0gPSBjdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW1jX3JlZmluZV9iaXRfYWxsb2NhdGlvbihJTUNDb250ZXh0ICpxLCBJTUNDaGFubmVsICpjaGN0eCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgYml0cywgc3VtbWVyOworCisgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspIHsKKyAgICAgICAgY2hjdHgtPnN1bUxlbkFycltpXSAgID0gMDsKKyAgICAgICAgY2hjdHgtPnNraXBGbGFnUmF3W2ldID0gMDsKKyAgICAgICAgZm9yIChqID0gYmFuZF90YWJbaV07IGogPCBiYW5kX3RhYltpICsgMV07IGorKykKKyAgICAgICAgICAgIGNoY3R4LT5zdW1MZW5BcnJbaV0gKz0gY2hjdHgtPkNXbGVuZ3RoVFtqXTsKKyAgICAgICAgaWYgKGNoY3R4LT5iYW5kRmxhZ3NCdWZbaV0pCisgICAgICAgICAgICBpZiAoKCgoYmFuZF90YWJbaSArIDFdIC0gYmFuZF90YWJbaV0pICogMS41KSA+IGNoY3R4LT5zdW1MZW5BcnJbaV0pICYmIChjaGN0eC0+c3VtTGVuQXJyW2ldID4gMCkpCisgICAgICAgICAgICAgICAgY2hjdHgtPnNraXBGbGFnUmF3W2ldID0gMTsKKyAgICB9CisKKyAgICBpbWNfZ2V0X3NraXBfY29lZmYocSwgY2hjdHgpOworCisgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspIHsKKyAgICAgICAgY2hjdHgtPmZsY29lZmZzNltpXSA9IGNoY3R4LT5mbGNvZWZmczFbaV07CisgICAgICAgIC8qIGJhbmQgaGFzIGZsYWcgc2V0IGFuZCBhdCBsZWFzdCBvbmUgY29kZWQgY29lZmZpY2llbnQgKi8KKyAgICAgICAgaWYgKGNoY3R4LT5iYW5kRmxhZ3NCdWZbaV0gJiYgKGJhbmRfdGFiW2kgKyAxXSAtIGJhbmRfdGFiW2ldKSAhPSBjaGN0eC0+c2tpcEZsYWdDb3VudFtpXSkgeworICAgICAgICAgICAgY2hjdHgtPmZsY29lZmZzNltpXSAqPSBxLT5zcXJ0X3RhYlsgYmFuZF90YWJbaSArIDFdIC0gYmFuZF90YWJbaV1dIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+c3FydF90YWJbKGJhbmRfdGFiW2kgKyAxXSAtIGJhbmRfdGFiW2ldIC0gY2hjdHgtPnNraXBGbGFnQ291bnRbaV0pXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBiaXRzIGxlZnQsIGJpdHMgbmVlZGVkIGFuZCBhZGp1c3QgYml0IGFsbG9jYXRpb24gKi8KKyAgICBiaXRzID0gc3VtbWVyID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCQU5EUzsgaSsrKSB7CisgICAgICAgIGlmIChjaGN0eC0+YmFuZEZsYWdzQnVmW2ldKSB7CisgICAgICAgICAgICBmb3IgKGogPSBiYW5kX3RhYltpXTsgaiA8IGJhbmRfdGFiW2kgKyAxXTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoY3R4LT5za2lwRmxhZ3Nbal0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtbWVyICs9IGNoY3R4LT5DV2xlbmd0aFRbal07CisgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5DV2xlbmd0aFRbal0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJpdHMgICArPSBjaGN0eC0+c2tpcEZsYWdCaXRzW2ldOworICAgICAgICAgICAgc3VtbWVyIC09IGNoY3R4LT5za2lwRmxhZ0JpdHNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaW1jX2FkanVzdF9iaXRfYWxsb2NhdGlvbihxLCBjaGN0eCwgc3VtbWVyKTsKK30KKworc3RhdGljIGludCBpbWNfZGVjb2RlX2Jsb2NrKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgSU1DQ29udGV4dCAqcSwgaW50IGNoKQoreworICAgIGludCBzdHJlYW1fZm9ybWF0X2NvZGU7CisgICAgaW50IGltY19oZHIsIGksIGosIHJldDsKKyAgICBpbnQgZmxhZzsKKyAgICBpbnQgYml0czsKKyAgICBpbnQgY291bnRlciwgYml0c2NvdW50OworICAgIElNQ0NoYW5uZWwgKmNoY3R4ID0gcS0+Y2hjdHggKyBjaDsKKworCisgICAgLyogQ2hlY2sgdGhlIGZyYW1lIGhlYWRlciAqLworICAgIGltY19oZHIgPSBnZXRfYml0cygmcS0+Z2IsIDkpOworICAgIGlmIChpbWNfaGRyICYgMHgxOCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImZyYW1lIGhlYWRlciBjaGVjayBmYWlsZWQhXG4iKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJnb3QgJVguXG4iLCBpbWNfaGRyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHN0cmVhbV9mb3JtYXRfY29kZSA9IGdldF9iaXRzKCZxLT5nYiwgMyk7CisKKyAgICBpZiAoc3RyZWFtX2Zvcm1hdF9jb2RlICYgMHgwNCkKKyAgICAgICAgY2hjdHgtPmRlY29kZXJfcmVzZXQgPSAxOworCisgICAgaWYgKGNoY3R4LT5kZWNvZGVyX3Jlc2V0KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCQU5EUzsgaSsrKQorICAgICAgICAgICAgY2hjdHgtPm9sZF9mbG9vcltpXSA9IDEuMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IENPRUZGUzsgaSsrKQorICAgICAgICAgICAgY2hjdHgtPkNXZGVjb2RlZFtpXSA9IDA7CisgICAgICAgIGNoY3R4LT5kZWNvZGVyX3Jlc2V0ID0gMDsKKyAgICB9CisKKyAgICBmbGFnID0gZ2V0X2JpdHMxKCZxLT5nYik7CisgICAgaWYgKHN0cmVhbV9mb3JtYXRfY29kZSAmIDB4MSkKKyAgICAgICAgaW1jX3JlYWRfbGV2ZWxfY29lZmZzX3JhdyhxLCBzdHJlYW1fZm9ybWF0X2NvZGUsIGNoY3R4LT5sZXZsQ29lZmZCdWYpOworICAgIGVsc2UKKyAgICAgICAgaW1jX3JlYWRfbGV2ZWxfY29lZmZzKHEsIHN0cmVhbV9mb3JtYXRfY29kZSwgY2hjdHgtPmxldmxDb2VmZkJ1Zik7CisKKyAgICBpZiAoc3RyZWFtX2Zvcm1hdF9jb2RlICYgMHgxKQorICAgICAgICBpbWNfZGVjb2RlX2xldmVsX2NvZWZmaWNpZW50c19yYXcocSwgY2hjdHgtPmxldmxDb2VmZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5mbGNvZWZmczEsIGNoY3R4LT5mbGNvZWZmczIpOworICAgIGVsc2UgaWYgKHN0cmVhbV9mb3JtYXRfY29kZSAmIDB4NCkKKyAgICAgICAgaW1jX2RlY29kZV9sZXZlbF9jb2VmZmljaWVudHMocSwgY2hjdHgtPmxldmxDb2VmZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hjdHgtPmZsY29lZmZzMSwgY2hjdHgtPmZsY29lZmZzMik7CisgICAgZWxzZQorICAgICAgICBpbWNfZGVjb2RlX2xldmVsX2NvZWZmaWNpZW50czIocSwgY2hjdHgtPmxldmxDb2VmZkJ1ZiwgY2hjdHgtPm9sZF9mbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5mbGNvZWZmczEsIGNoY3R4LT5mbGNvZWZmczIpOworCisgICAgZm9yKGk9MDsgaTxCQU5EUzsgaSsrKSB7CisgICAgICAgIGlmKGNoY3R4LT5mbGNvZWZmczFbaV0gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInNjYWxlZmFjdG9yIG91dCBvZiByYW5nZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1lbWNweShjaGN0eC0+b2xkX2Zsb29yLCBjaGN0eC0+Zmxjb2VmZnMxLCAzMiAqIHNpemVvZihmbG9hdCkpOworCisgICAgY291bnRlciA9IDA7CisgICAgaWYgKHN0cmVhbV9mb3JtYXRfY29kZSAmIDB4MSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQkFORFM7IGkrKykgeworICAgICAgICAgICAgY2hjdHgtPmJhbmRXaWR0aFRbaV0gICA9IGJhbmRfdGFiW2kgKyAxXSAtIGJhbmRfdGFiW2ldOworICAgICAgICAgICAgY2hjdHgtPmJhbmRGbGFnc0J1ZltpXSA9IDA7CisgICAgICAgICAgICBjaGN0eC0+Zmxjb2VmZnMzW2ldICAgID0gY2hjdHgtPmZsY29lZmZzMltpXSAqIDI7CisgICAgICAgICAgICBjaGN0eC0+Zmxjb2VmZnM1W2ldICAgID0gMS4wOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjaGN0eC0+bGV2bENvZWZmQnVmW2ldID09IDE2KSB7CisgICAgICAgICAgICAgICAgY2hjdHgtPmJhbmRXaWR0aFRbaV0gPSAwOworICAgICAgICAgICAgICAgIGNvdW50ZXIrKzsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGNoY3R4LT5iYW5kV2lkdGhUW2ldID0gYmFuZF90YWJbaSArIDFdIC0gYmFuZF90YWJbaV07CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoY2hjdHgtPmJhbmRGbGFnc0J1ZiwgMCwgQkFORFMgKiBzaXplb2YoaW50KSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCQU5EUyAtIDE7IGkrKykKKyAgICAgICAgICAgIGlmIChjaGN0eC0+YmFuZFdpZHRoVFtpXSkKKyAgICAgICAgICAgICAgICBjaGN0eC0+YmFuZEZsYWdzQnVmW2ldID0gZ2V0X2JpdHMxKCZxLT5nYik7CisKKyAgICAgICAgaW1jX2NhbGN1bGF0ZV9jb2VmZnMocSwgY2hjdHgtPmZsY29lZmZzMSwgY2hjdHgtPmZsY29lZmZzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hjdHgtPmJhbmRXaWR0aFQsIGNoY3R4LT5mbGNvZWZmczMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoY3R4LT5mbGNvZWZmczUpOworICAgIH0KKworICAgIGJpdHNjb3VudCA9IDA7CisgICAgLyogZmlyc3QgNCBiYW5kcyB3aWxsIGJlIGFzc2lnbmVkIDUgYml0cyBwZXIgY29lZmZpY2llbnQgKi8KKyAgICBpZiAoc3RyZWFtX2Zvcm1hdF9jb2RlICYgMHgyKSB7CisgICAgICAgIGJpdHNjb3VudCArPSAxNTsKKworICAgICAgICBjaGN0eC0+Yml0c0JhbmRUWzBdID0gNTsKKyAgICAgICAgY2hjdHgtPkNXbGVuZ3RoVFswXSA9IDU7CisgICAgICAgIGNoY3R4LT5DV2xlbmd0aFRbMV0gPSA1OworICAgICAgICBjaGN0eC0+Q1dsZW5ndGhUWzJdID0gNTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgaWYgKHN0cmVhbV9mb3JtYXRfY29kZSAmIDB4MSkKKyAgICAgICAgICAgICAgICBiaXRzID0gNTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiaXRzID0gKGNoY3R4LT5sZXZsQ29lZmZCdWZbaV0gPT0gMTYpID8gMCA6IDU7CisgICAgICAgICAgICBjaGN0eC0+Yml0c0JhbmRUW2ldID0gYml0czsKKyAgICAgICAgICAgIGZvciAoaiA9IGJhbmRfdGFiW2ldOyBqIDwgYmFuZF90YWJbaSArIDFdOyBqKyspIHsKKyAgICAgICAgICAgICAgICBjaGN0eC0+Q1dsZW5ndGhUW2pdID0gYml0czsKKyAgICAgICAgICAgICAgICBiaXRzY291bnQgICAgICArPSBiaXRzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSUFDKSB7CisgICAgICAgIGJpdHNjb3VudCArPSAhIWNoY3R4LT5iYW5kV2lkdGhUW0JBTkRTIC0gMV07CisgICAgICAgIGlmICghKHN0cmVhbV9mb3JtYXRfY29kZSAmIDB4MikpCisgICAgICAgICAgICBiaXRzY291bnQgKz0gMTY7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBiaXRfYWxsb2NhdGlvbihxLCBjaGN0eCwgc3RyZWFtX2Zvcm1hdF9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyIC0gYml0c2NvdW50IC0gZ2V0X2JpdHNfY291bnQoJnEtPmdiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCaXQgYWxsb2NhdGlvbnMgZmFpbGVkXG4iKTsKKyAgICAgICAgY2hjdHgtPmRlY29kZXJfcmVzZXQgPSAxOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChzdHJlYW1fZm9ybWF0X2NvZGUgJiAweDEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEJBTkRTOyBpKyspCisgICAgICAgICAgICBjaGN0eC0+c2tpcEZsYWdzW2ldID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbWNfcmVmaW5lX2JpdF9hbGxvY2F0aW9uKHEsIGNoY3R4KTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkFORFM7IGkrKykgeworICAgICAgICBjaGN0eC0+c3VtTGVuQXJyW2ldID0gMDsKKworICAgICAgICBmb3IgKGogPSBiYW5kX3RhYltpXTsgaiA8IGJhbmRfdGFiW2kgKyAxXTsgaisrKQorICAgICAgICAgICAgaWYgKCFjaGN0eC0+c2tpcEZsYWdzW2pdKQorICAgICAgICAgICAgICAgIGNoY3R4LT5zdW1MZW5BcnJbaV0gKz0gY2hjdHgtPkNXbGVuZ3RoVFtqXTsKKyAgICB9CisKKyAgICBtZW1zZXQoY2hjdHgtPmNvZGV3b3JkcywgMCwgc2l6ZW9mKGNoY3R4LT5jb2Rld29yZHMpKTsKKworICAgIGlmIChpbWNfZ2V0X2NvZWZmcyhxLCBjaGN0eCkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVhZCBjb2VmZmljaWVudHMgZmFpbGVkXG4iKTsKKyAgICAgICAgY2hjdHgtPmRlY29kZXJfcmVzZXQgPSAxOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoaW52ZXJzZV9xdWFudF9jb2VmZihxLCBjaGN0eCwgc3RyZWFtX2Zvcm1hdF9jb2RlKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZlcnNlIHF1YW50aXphdGlvbiBvZiBjb2VmZmljaWVudHMgZmFpbGVkXG4iKTsKKyAgICAgICAgY2hjdHgtPmRlY29kZXJfcmVzZXQgPSAxOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBtZW1zZXQoY2hjdHgtPnNraXBGbGFncywgMCwgc2l6ZW9mKGNoY3R4LT5za2lwRmxhZ3MpKTsKKworICAgIGltY19pbWRjdDI1NihxLCBjaGN0eCwgYXZjdHgtPmNoYW5uZWxzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGltY19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lICAgICA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgaW50IHJldCwgaTsKKworICAgIElNQ0NvbnRleHQgKnEgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50MTZfdCwgYnVmMTYsIFtJTUNfQkxPQ0tfU0laRSAvIDIgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFLzJdKTsKKworICAgIGlmIChidWZfc2l6ZSA8IElNQ19CTE9DS19TSVpFICogYXZjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZnJhbWUgdG9vIHNtYWxsIVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBDT0VGRlM7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICBxLT5vdXRfc2FtcGxlcyA9IChmbG9hdCAqKWZyYW1lLT5leHRlbmRlZF9kYXRhW2ldOworCisgICAgICAgIHEtPmJkc3AuYnN3YXAxNl9idWYoYnVmMTYsIChjb25zdCB1aW50MTZfdCAqKSBidWYsIElNQ19CTE9DS19TSVpFIC8gMik7CisKKyAgICAgICAgaW5pdF9nZXRfYml0cygmcS0+Z2IsIChjb25zdCB1aW50OF90KilidWYxNiwgSU1DX0JMT0NLX1NJWkUgKiA4KTsKKworICAgICAgICBidWYgKz0gSU1DX0JMT0NLX1NJWkU7CisKKyAgICAgICAgaWYgKChyZXQgPSBpbWNfZGVjb2RlX2Jsb2NrKGF2Y3R4LCBxLCBpKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgcS0+ZmRzcC0+YnV0dGVyZmxpZXNfZmxvYXQoKGZsb2F0ICopZnJhbWUtPmV4dGVuZGVkX2RhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopZnJhbWUtPmV4dGVuZGVkX2RhdGFbMV0sIENPRUZGUyk7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIElNQ19CTE9DS19TSVpFICogYXZjdHgtPmNoYW5uZWxzOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW1jX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqIGF2Y3R4KQoreworICAgIElNQ0NvbnRleHQgKnEgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmZfZmZ0X2VuZCgmcS0+ZmZ0KTsKKyAgICBhdl9mcmVlcCgmcS0+ZmRzcCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBmbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSU1DQ29udGV4dCAqcSA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBxLT5jaGN0eFswXS5kZWNvZGVyX3Jlc2V0ID0KKyAgICBxLT5jaGN0eFsxXS5kZWNvZGVyX3Jlc2V0ID0gMTsKK30KKworI2lmIENPTkZJR19JTUNfREVDT0RFUgorQVZDb2RlYyBmZl9pbWNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaW1jIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSU1DIChJbnRlbCBNdXNpYyBDb2RlcikiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSU1DLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihJTUNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBpbWNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gaW1jX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBpbWNfZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CisjZW5kaWYKKyNpZiBDT05GSUdfSUFDX0RFQ09ERVIKK0FWQ29kZWMgZmZfaWFjX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImlhYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIklBQyAoSW5kZW8gQXVkaW8gQ29kZXIpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0lBQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSU1DQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gaW1jX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGltY19kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gaW1jX2RlY29kZV9mcmFtZSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9pbWNkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9pbWNkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlN2M3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ltY2RhdGEuaApAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIElNQyBjb21wYXRpYmxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1heGltIFBvbGlha292c2tpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQmVuamFtaW4gTGFyc3NvbgorICogQ29weXJpZ2h0IChjKSAyMDA2IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0lNQ0RBVEFfSAorI2RlZmluZSBBVkNPREVDX0lNQ0RBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiYW5kX3RhYlszM10gPSB7CisgICAgICAwLCAgIDMsICAgNiwgICA5LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOSwgIDM0LCAgNDAsCisgICAgIDQ2LCAgNTMsICA2MCwgIDY4LCAgNzYsICA4NCwgIDkzLCAxMDIsIDExMSwgMTIxLCAxMzEsCisgICAgMTQxLCAxNTEsIDE2MiwgMTczLCAxODQsIDE5NSwgMjA3LCAyMTksIDIzMSwgMjQzLCAyNTYsCit9OworCisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgY3ljbFRhYlszMl0gPSB7CisgICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsCisgICAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMjAsIDIxLCAyMiwgMjMsCisgICAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMiwKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgY3ljbFRhYjJbMzJdID0geworICAgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwKKyAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLAorMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjl9OworCitzdGF0aWMgY29uc3QgZmxvYXQgaW1jX3dlaWdodHMxWzMxXSA9IHsKKyAgICAwLjExOTU5NSwgMC4xMjMxMjQsIDAuMTI5MTkyLCA5Ljk3Mzc3ZS0yLCA4LjE5MjNlLTIsIDkuNjExNTNlLTIsIDguNzc4ODVlLTIsIDguNjExNzRlLTIsCisgICAgOS4wMDg4MmUtMiwgOS45MTY1OGUtMiwgMC4xMTI5OTEsIDAuMTMxMTI2LCAwLjE1Mjg4NiwgMC4xNzcyOTIsIDAuMjIxNzgyLCAwLjI0NDkxNywgMC4yNjczODYsCisgICAgMC4zMDY4MTYsIDAuMzIzMDQ2LCAwLjMzNzI5LCAwLjM2Njc3MywgMC4zOTI1NTcsIDAuMzk4MDc2LCAwLjQwMzMwMiwgMC40MjQ1MSwgMC40NDQ3NzcsCisgICAgMC40NDkxODgsIDAuNDU1NDQ1LCAwLjQ3Nzg1MywgMC41MDA2NjksIDAuNTEwMzk1fTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGltY193ZWlnaHRzMlszMV0gPSB7CisgICAgMy4yMzQ2NmUtMywgMy40OTg4NmUtMywgMy45ODQxM2UtMywgMS45ODExNmUtMywgMS4xNjQ2NWUtMywgMS43OTI4M2UtMywgMS40MDM3MmUtMywgMS4zMzI3NGUtMywKKyAgICAxLjUwNTIzZS0zLCAxLjk1MDY0ZS0zLCAyLjc3NDcyZS0zLCA0LjE0NzI1ZS0zLCA2LjI3NzZlLTMsIDkuMzY0MDFlLTMsIDEuNzEzOTdlLTIsIDIuMjQwNTJlLTIsCisgICAgMi44Mzk3MWUtMiwgNC4xMTY4OWUtMiwgNC43MzE2NWUtMiwgNS4zMTYzMWUtMiwgNi42NjYxNGUtMiwgOC4wMDgyNGUtMiwgOC4zMTU4OGUtMiwgOC42MTM5N2UtMiwKKyAgICA5Ljg5MjI5ZS0yLCAwLjExMjE5NywgMC4xMTUyMjcsIDAuMTE5NjEzLCAwLjEzNjE3NCwgMC4xNTQ0NSwgMC4xNjI2ODV9OworCitzdGF0aWMgY29uc3QgZmxvYXQgaW1jX3F1YW50aXplcjFbNF1bOF0gPSB7CisgICAgeyA4LjQ0MzEyMDFlLTEsIDQuNzM1ODMwMWUtMSwgMS40NDgzNTQsIDIuNzA3Mzg5OWUtMSwgNy40NDQ5MDAzZS0xLCAxLjI0MTk5MSwgIDEuODQ1NDg0LCAgMC4wfSwKKyAgICB7IDguNjg3NjcwMmUtMSwgNC43NjU5MDAxZS0xLCAxLjQ3ODIyNCwgMi41NjcyNzk5ZS0xLCA3LjU1Nzc3ZS0xLCAgIDEuMzIyOTg1MSwgMi4wMzQzOCwgICAwLjB9LAorICAgIHsgNy41ODkxNTAxZS0xLCA2LjIyNzI3OTllLTEsIDEuMjcxMzIyLCAzLjQ3OTA0ZS0xLCAgIDcuNTMxNzY5OWUtMSwgMS4xNTA3NjcsICAxLjYyODQ3NiwgIDAuMH0sCisgICAgeyA3LjY1MjU3ZS0xLCAgIDYuNDQ2NDdlLTEsICAgMS4yNjM4MjQsIDMuNDU0ODEwMWUtMSwgNy42Mzg0OTAyZS0xLCAxLjIxNDQ2NiwgIDEuNzYzODc4OSwgMC4wfSwKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBpbWNfcXVhbnRpemVyMlsyXVs1Nl0gPSB7CisgICAgeyAxLjM5MjM2ZS0xLCAzLjUwNTQ4ZS0xLCA1Ljk1NDc5MDFlLTEsIDguNTc3MjQwMWUtMSwgMS4xMjE1NDUsIDEuMzg4MjI4MSwgMS42OTU4ODIsIDIuMTI3MDgwOSwKKyAgICAgIDcuMjIyMTAwM2UtMiwgMS44NTE3N2UtMSwgMi45NTIxNzAxZS0xLCA0LjEyNTY4ZS0xLCA1LjQwNjg2MDFlLTEsIDYuNzY3OTUwMWUtMSwgOC4xMTk2ODk4ZS0xLCA5LjQ3NjUxOThlLTEsCisgICAgICAxLjA3Nzk5OTksIDEuMjAzNDE1LCAxLjMzNzI2NSwgMS40ODE4NzEsIDEuNjM5OTgyLCAxLjgxNDc2NiwgMi4wNzAxMzk5LCAyLjQ0OTg2MiwKKyAgICAgIDMuNzUzMzk5OGUtMiwgMS4wMjcyMmUtMSwgMS42MDIxNDAxZS0xLCAyLjE2MDQzZS0xLCAyLjcyMzE2MDFlLTEsIDMuMzAyNTM5OWUtMSwgMy45MDIyNjAxZS0xLCA0LjUyODQ5ZS0xLAorICAgICAgNS4xNzk0ODk5ZS0xLCA1Ljg1Mjk1MDJlLTEsIDYuNTM5NTZlLTEsIDcuMjMxMjgwMmUtMSwgNy45MTUwODAyZS0xLCA4LjU4OTEwMDJlLTEsIDkuMjgxNDFlLTEsIDkuOTcwNjIwM2UtMSwKKyAgICAgIDEuMDYyMTUzLCAxLjEyNTY0LCAxLjE4OTgzNCwgMS4yNTYxMjIsIDEuMzI0NDY5LCAxLjM5NTUzMTEsIDEuNDY4OTA2LCAxLjU0NTA4NCwKKyAgICAgIDEuNjI2NDcyOSwgMS43MTE1MjQsIDEuODAyNzA1LCAxLjkxMDIzLCAyLjA1MzM5OTEsIDIuMjIzMzMsIDIuNDgzMDAxOSwgMy4yNTMzMjkgfSwKKyAgICB7IDEuMTE2NTRlLTEsIDMuNTQ0NjllLTEsIDYuNDIzMjA5OWUtMSwgOS42MTI4Nzk4ZS0xLCAxLjI5NTA1MywgMS42MTc3NywgMS45ODk4MzksIDIuNTExMDcsCisgICAgICA1Ljc3MjE5OTllLTIsIDEuNjk4NzllLTEsIDIuOTc1ODllLTEsIDQuMzg1ODc5OWUtMSwgNS45MDM5OTAzZS0xLCA3LjQ5MzQ3OThlLTEsIDkuMTYyODA5OGUtMSwgMS4wODcyOTcsCisgICAgICAxLjI2Mjc1MSwgMS40Mjg4MzIxLCAxLjYwNDA4NzksIDEuNzkwNjcsIDIuMDAwNjY4LCAyLjIzOTQ2NjksIDIuNjQ5MzMyLCA1LjI3NjAwNzIsCisgICAgICAyLjk3MjJlLTIsIDguNzMxNjk5N2UtMiwgMS40NDQ1MjAxZS0xLCAyLjA0MjQ3ZS0xLCAyLjY4Nzk1MDFlLTEsIDMuMzcxNjgwMWUtMSwgNC4wODgxMWUtMSwgNC44MzA2OTk5ZS0xLAorICAgICAgNS42MDQ5NDAxZS0xLCA2LjM5NTU0OThlLTEsIDcuMjA0NDU5OWUtMSwgOC4wNDI3OTk4ZS0xLCA4Ljg5MzM1OTllLTEsIDkuNzUzNzYwMWUtMSwgMS4wNjI0NjEsIDEuMTUxMDQzMSwKKyAgICAgIDEuMjQwMjM2LCAxLjMyNjcxNSwgMS40MTI1MTMsIDEuNTAwNTAyLCAxLjU5MTc0OSwgMS42ODY0MTMsIDEuNzg1MjM5LCAxLjg5MTIzMywKKyAgICAgIDIuMDA1MTI5MSwgMi4xMjc2ODEsIDIuMjcwOTE0MSwgMi40NzU4MjYsIDIuNzIxOTM3OSwgMy4xMDE5ODUsIDQuNjg2MjEzLCA2LjIyODc3ODh9LAorfTsKKworCitzdGF0aWMgY29uc3QgZmxvYXQgeFRhYlsxNF0gPSB7Ny42LCAzLjYsIDQuNCwgMy43LCA2LjEsIDUuMSwgMi4zLCAxLjYsIDYuMiwgMS41LCAxLjgsIDEuMiwgMCwgMH07IC8vMTAwMTQwNDgKKworLyogcHJlY29tcHV0ZWQgdGFibGUgZm9yIDEwXihpLzQpLCBpPS0xNS4uMTYgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBpbWNfZXhwX3RhYlszMl0gPSB7CisgICAgMS43NzgyODBlLTQsIDMuMTYyMjc4ZS00LCA1LjYyMzQxM2UtNCwgMS4wMDAwMDBlLTMsCisgICAgMS43NzgyODBlLTMsIDMuMTYyMjc4ZS0zLCA1LjYyMzQxM2UtMywgMS4wMDAwMDBlLTIsCisgICAgMS43NzgyODBlLTIsIDMuMTYyMjc4ZS0yLCA1LjYyMzQxM2UtMiwgMS4wMDAwMDBlLTEsCisgICAgMS43NzgyODBlLTEsIDMuMTYyMjc4ZS0xLCA1LjYyMzQxM2UtMSwgMS4wMDAwMDBlMDAsCisgICAgMS43NzgyODBlMDAsIDMuMTYyMjc4ZTAwLCA1LjYyMzQxM2UwMCwgMS4wMDAwMDBlMDEsCisgICAgMS43NzgyODBlMDEsIDMuMTYyMjc4ZTAxLCA1LjYyMzQxM2UwMSwgMS4wMDAwMDBlMDIsCisgICAgMS43NzgyODBlMDIsIDMuMTYyMjc4ZTAyLCA1LjYyMzQxM2UwMiwgMS4wMDAwMDBlMDMsCisgICAgMS43NzgyODBlMDMsIDMuMTYyMjc4ZTAzLCA1LjYyMzQxM2UwMywgMS4wMDAwMDBlMDQKK307CitzdGF0aWMgY29uc3QgZmxvYXQgKiBjb25zdCBpbWNfZXhwX3RhYjIgPSBpbWNfZXhwX3RhYiArIDg7CisKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW1jX2NiX3NlbGVjdFs0XVszMl0gPSB7CisgICAgeyAxLCAxLCAxLCAxLCAxLCAxLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMiwgMiwgMiB9LAorICAgIHsgMCwgMiwgMCwgMywgMiwgMywgMywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfSwKKyAgICB7IDEsIDEsIDEsIDEsIDEsIDEsIDEsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgICAzLCAzLCAzLCAzLCAzLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAyLCAyLCAyIH0sCisgICAgeyAwLCAxLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgICAgMywgMywgMywgMywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBpbWNfaHVmZm1hbl9zaXplc1s0XSA9IHsKKyAgICAxNywgIDE3LCAgMTgsICAxOAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW1jX2h1ZmZtYW5fbGVuc1s0XVs0XVsxOF0gPSB7CisgICAgeworICAgICAgICB7IDE2LCAxNSwgMTMsIDExLCAgOCwgIDUsICAzLCAgMSwgIDIsICA0LCAgNiwgIDksIDEwLCAxMiwgMTQsIDE2LCAgNywgIDAgfSwKKyAgICAgICAgeyAxMCwgIDgsICA3LCAgNiwgIDQsICA0LCAgMywgIDIsICAyLCAgMywgIDQsICA2LCAgNywgIDksIDExLCAxMSwgIDcsICAwIH0sCisgICAgICAgIHsgMTUsIDE1LCAxNCwgMTEsICA4LCAgNiwgIDQsICAyLCAgMSwgIDQsICA1LCAgNywgIDksIDEwLCAxMiwgMTMsICA0LCAgMCB9LAorICAgICAgICB7IDEzLCAxMSwgMTAsICA4LCAgNiwgIDQsICAyLCAgMiwgIDIsICAzLCAgNSwgIDcsICA5LCAxMiwgMTUsIDE1LCAxNCwgIDAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgeyAxNCwgMTIsIDEwLCAgOCwgIDcsICA0LCAgMiwgIDIsICAyLCAgMywgIDUsICA3LCAgOSwgMTEsIDEzLCAxNCwgIDcsICAwIH0sCisgICAgICAgIHsgMTQsIDEzLCAxMSwgIDgsICA2LCAgNCwgIDMsICAyLCAgMiwgIDMsICA1LCAgNywgIDksIDEwLCAxMiwgMTQsICAzLCAgMCB9LAorICAgICAgICB7IDEzLCAxMiwgMTAsICA3LCAgNSwgIDQsICAzLCAgMiwgIDIsICAzLCAgNCwgIDYsICA4LCAgOSwgMTEsIDEzLCAgNCwgIDAgfSwKKyAgICAgICAgeyAxMywgMTIsIDEwLCAgNywgIDUsICA0LCAgMywgIDIsICAyLCAgMywgIDQsICA2LCAgOCwgIDksIDExLCAxMywgIDQsICAwIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMTYsIDE0LCAxMiwgMTAsICA4LCAgNSwgIDMsICAxLCAgMiwgIDQsICA3LCAgOSwgMTEsIDEzLCAxNSwgMTcsICA2LCAxNyB9LAorICAgICAgICB7IDE1LCAxMywgMTEsICA4LCAgNiwgIDQsICAyLCAgMiwgIDIsICAzLCAgNSwgIDcsIDEwLCAxMiwgMTQsIDE2LCAgOSwgMTYgfSwKKyAgICAgICAgeyAxNCwgMTIsIDExLCAgOSwgIDgsICA2LCAgMywgIDEsICAyLCAgNSwgIDcsIDEwLCAxMywgMTUsIDE2LCAxNywgIDQsIDE3IH0sCisgICAgICAgIHsgMTYsIDE0LCAxMiwgIDksICA3LCAgNSwgIDIsICAyLCAgMiwgIDMsICA0LCAgNiwgIDgsIDExLCAxMywgMTUsIDEwLCAxNiB9LAorICAgIH0sCisgICAgeworICAgICAgICB7IDEzLCAxMSwgMTAsICA4LCAgNywgIDUsICAyLCAgMiwgIDIsICA0LCAgNiwgIDksIDEyLCAxNCwgMTUsIDE2LCAgMywgMTYgfSwKKyAgICAgICAgeyAxMSwgMTEsIDEwLCAgOSwgIDgsICA3LCAgNSwgIDQsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICA0LCAgNSwgIDYsICA1IH0sCisgICAgICAgIHsgIDksICA5LCAgNywgIDYsICA1LCAgNCwgIDMsICAzLCAgMiwgIDMsICA0LCAgNSwgIDQsICA1LCAgNSwgIDYsICA4LCAgNiB9LAorICAgICAgICB7IDEzLCAxMiwgMTAsICA4LCAgNSwgIDMsICAzLCAgMiwgIDIsICAzLCAgNCwgIDcsICA5LCAxMSwgMTQsIDE1LCAgNiwgMTUgfSwKKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgaW1jX2h1ZmZtYW5fYml0c1s0XVs0XVsxOF0gPSB7CisgICAgeworICAgICAgICB7IDB4Q0MzMiwgMHg2NjE4LCAweDE5ODcsIDB4MDY2MCwgMHgwMENELCAweDAwMTgsIDB4MDAwNywgMHgwMDAwLCAweDAwMDIsIDB4MDAwRCwgMHgwMDMyLCAweDAxOTksIDB4MDMzMSwgMHgwQ0MyLCAweDMzMEQsIDB4Q0MzMywgMHgwMDY3LCAweDAwMDAgfSwKKyAgICAgICAgeyAweDAyRkUsIDB4MDBCRSwgMHgwMDVFLCAweDAwMkQsIDB4MDAwQSwgMHgwMDA5LCAweDAwMDMsIDB4MDAwMywgMHgwMDAwLCAweDAwMDIsIDB4MDAwOCwgMHgwMDJDLCAweDAwNUQsIDB4MDE3RSwgMHgwNUZFLCAweDA1RkYsIDB4MDA1QywgMHgwMDAwIH0sCisgICAgICAgIHsgMHg1MTY5LCAweDUxNjgsIDB4MjhCNSwgMHgwNTE3LCAweDAwQTMsIDB4MDAyOSwgMHgwMDA4LCAweDAwMDMsIDB4MDAwMCwgMHgwMDA5LCAweDAwMTUsIDB4MDA1MCwgMHgwMTQ0LCAweDAyOEEsIDB4MEEyQywgMHgxNDVCLCAweDAwMEIsIDB4MDAwMCB9LAorICAgICAgICB7IDB4MTIzMSwgMHgwNDhELCAweDAyNDcsIDB4MDA5MCwgMHgwMDI1LCAweDAwMDgsIDB4MDAwMSwgMHgwMDAzLCAweDAwMDAsIDB4MDAwNSwgMHgwMDEzLCAweDAwNDksIDB4MDEyMiwgMHgwOTE5LCAweDQ4QzMsIDB4NDhDMiwgMHgyNDYwLCAweDAwMDAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgeyAweDJEMUQsIDB4MEI0NiwgMHgwMkQwLCAweDAwQjUsIDB4MDA1OSwgMHgwMDBBLCAweDAwMDMsIDB4MDAwMSwgMHgwMDAwLCAweDAwMDQsIDB4MDAxNywgMHgwMDVCLCAweDAxNjksIDB4MDVBMiwgMHgxNjhGLCAweDJEMUMsIDB4MDA1OCwgMHgwMDAwIH0sCisgICAgICAgIHsgMHgxODAwLCAweDBDMDEsIDB4MDMwMSwgMHgwMDYxLCAweDAwMTksIDB4MDAwNywgMHgwMDA0LCAweDAwMDMsIDB4MDAwMCwgMHgwMDA1LCAweDAwMEQsIDB4MDAzMSwgMHgwMEMxLCAweDAxODEsIDB4MDYwMSwgMHgxODAxLCAweDAwMDIsIDB4MDAwMCB9LAorICAgICAgICB7IDB4MTU1NiwgMHgwQUFBLCAweDAyQUIsIDB4MDA1NCwgMHgwMDE0LCAweDAwMEIsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDAsIDB4MDAwMywgMHgwMDA4LCAweDAwMkIsIDB4MDBBQiwgMHgwMTU0LCAweDA1NTQsIDB4MTU1NywgMHgwMDA5LCAweDAwMDAgfSwKKyAgICAgICAgeyAweDE1NTYsIDB4MEFBQSwgMHgwMkFCLCAweDAwNTQsIDB4MDAxNCwgMHgwMDBCLCAweDAwMDIsIDB4MDAwMywgMHgwMDAwLCAweDAwMDMsIDB4MDAwOCwgMHgwMDJCLCAweDAwQUIsIDB4MDE1NCwgMHgwNTU0LCAweDE1NTcsIDB4MDAwOSwgMHgwMDAwIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMHgyOTkzLCAweDBBNjUsIDB4MDI5OCwgMHgwMEE3LCAweDAwMjgsIDB4MDAwNCwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAzLCAweDAwMTUsIDB4MDA1MiwgMHgwMTRELCAweDA1MzMsIDB4MTRDOCwgMHg1MzI0LCAweDAwMEIsIDB4NTMyNSB9LAorICAgICAgICB7IDB4MDlCOCwgMHgwMjZGLCAweDAwOUEsIDB4MDAxMiwgMHgwMDA1LCAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwMSwgMHgwMDAzLCAweDAwMDgsIDB4MDA0QywgMHgwMTM2LCAweDA0REQsIDB4MTM3MywgMHgwMDI3LCAweDEzNzIgfSwKKyAgICAgICAgeyAweDA3ODcsIDB4MDFFMCwgMHgwMEYxLCAweDAwM0QsIDB4MDAxRiwgMHgwMDA2LCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDIsIDB4MDAwRSwgMHgwMDc5LCAweDAzQzIsIDB4MEYwRCwgMHgxRTE5LCAweDNDMzAsIDB4MDAwMCwgMHgzQzMxIH0sCisgICAgICAgIHsgMHg0QjA2LCAweDEyQzAsIDB4MDRCMSwgMHgwMDk3LCAweDAwMjQsIDB4MDAwOCwgMHgwMDAyLCAweDAwMDMsIDB4MDAwMCwgMHgwMDAzLCAweDAwMDUsIDB4MDAxMywgMHgwMDRBLCAweDAyNTksIDB4MDk2MSwgMHgyNTgyLCAweDAxMkQsIDB4NEIwNyB9LAorICAgIH0sCisgICAgeworICAgICAgICB7IDB4MEE1QSwgMHgwMjk3LCAweDAxNEEsIDB4MDA1MywgMHgwMDI4LCAweDAwMEIsIDB4MDAwMywgMHgwMDAwLCAweDAwMDIsIDB4MDAwNCwgMHgwMDE1LCAweDAwQTQsIDB4MDUyQywgMHgxNEI3LCAweDI5NkMsIDB4NTJEQiwgMHgwMDAzLCAweDUyREEgfSwKKyAgICAgICAgeyAweDAxOTMsIDB4MDE5MiwgMHgwMEM4LCAweDAwNjUsIDB4MDAzMywgMHgwMDE4LCAweDAwMDcsIDB4MDAwNCwgMHgwMDAwLCAweDAwMDQsIDB4MDAwNSwgMHgwMDA3LCAweDAwMDYsIDB4MDAwMywgMHgwMDA1LCAweDAwMDUsIDB4MDAwRCwgMHgwMDA0IH0sCisgICAgICAgIHsgMHgwMDEyLCAweDAwMTMsIDB4MDAwNSwgMHgwMDAzLCAweDAwMDAsIDB4MDAwMywgMHgwMDA1LCAweDAwMDQsIDB4MDAwMywgMHgwMDAzLCAweDAwMDUsIDB4MDAwNSwgMHgwMDA0LCAweDAwMDQsIDB4MDAwMywgMHgwMDA1LCAweDAwMDgsIDB4MDAwNCB9LAorICAgICAgICB7IDB4MEQ2NiwgMHgwNkIyLCAweDAxQUQsIDB4MDA2QSwgMHgwMDBDLCAweDAwMDUsIDB4MDAwNCwgMHgwMDAwLCAweDAwMDMsIDB4MDAwMiwgMHgwMDA3LCAweDAwMzQsIDB4MDBENywgMHgwMzU4LCAweDFBQ0YsIDB4MzU5QywgMHgwMDFCLCAweDM1OUQgfSwKKyAgICB9Cit9OworCisjZW5kaWYgLyogQVZDT0RFQ19JTUNEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ltZ2NvbnZlcnQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ltZ2NvbnZlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThiYzczCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW1nY29udmVydC5jCkBAIC0wLDAgKzEsNDg1IEBACisvKgorICogTWlzYyBpbWFnZSBjb252ZXJzaW9uIHJvdXRpbmVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIG1pc2MgaW1hZ2UgY29udmVyc2lvbiByb3V0aW5lcworICovCisKKy8qIFRPRE86CisgKiAtIHdyaXRlICdmZmltZycgcHJvZ3JhbSB0byB0ZXN0IGFsbCB0aGUgaW1hZ2UgcmVsYXRlZCBzdHVmZgorICogLSBtb3ZlIGFsbCBhcGkgdG8gc2xpY2UgYmFzZWQgc3lzdGVtCisgKiAtIGludGVncmF0ZSBkZWludGVybGFjaW5nLCBwb3N0cHJvY2Vzc2luZyBhbmQgc2NhbGluZyBpbiB0aGUgY29udmVyc2lvbiBwcm9jZXNzCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbWdjb252ZXJ0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbG9yc3BhY2UuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKwordm9pZCBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50ICpoX3NoaWZ0LCBpbnQgKnZfc2hpZnQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MpOworICAgICpoX3NoaWZ0ID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICAqdl9zaGlmdCA9IGRlc2MtPmxvZzJfY2hyb21hX2g7Cit9CisKK2ludCBhdmNvZGVjX2dldF9waXhfZm10X2xvc3MoZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjX3BpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfYWxwaGEpCit7CisgICAgcmV0dXJuIGF2X2dldF9waXhfZm10X2xvc3MoZHN0X3BpeF9mbXQsIHNyY19waXhfZm10LCBoYXNfYWxwaGEpOworfQorCitlbnVtIEFWUGl4ZWxGb3JtYXQgYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdF9vZl8yKGVudW0gQVZQaXhlbEZvcm1hdCBkc3RfcGl4X2ZtdDEsIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RfcGl4X2ZtdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNfcGl4X2ZtdCwgaW50IGhhc19hbHBoYSwgaW50ICpsb3NzX3B0cikKK3sKKyAgICByZXR1cm4gYXZfZmluZF9iZXN0X3BpeF9mbXRfb2ZfMihkc3RfcGl4X2ZtdDEsIGRzdF9waXhfZm10Miwgc3JjX3BpeF9mbXQsIGhhc19hbHBoYSwgbG9zc19wdHIpOworfQorCisjaWYgQVZfSEFWRV9JTkNPTVBBVElCTEVfTElCQVZfQUJJCitlbnVtIEFWUGl4ZWxGb3JtYXQgYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdDIoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpwaXhfZm10X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNfcGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19hbHBoYSwgaW50ICpsb3NzX3B0cil7CisgICAgcmV0dXJuIGF2Y29kZWNfZmluZF9iZXN0X3BpeF9mbXRfb2ZfbGlzdChwaXhfZm10X2xpc3QsIHNyY19waXhfZm10LCBoYXNfYWxwaGEsIGxvc3NfcHRyKTsKK30KKyNlbHNlCitlbnVtIEFWUGl4ZWxGb3JtYXQgYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdDIoZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10MSwgZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY19waXhfZm10LCBpbnQgaGFzX2FscGhhLCBpbnQgKmxvc3NfcHRyKQoreworICAgIHJldHVybiBhdmNvZGVjX2ZpbmRfYmVzdF9waXhfZm10X29mXzIoZHN0X3BpeF9mbXQxLCBkc3RfcGl4X2ZtdDIsIHNyY19waXhfZm10LCBoYXNfYWxwaGEsIGxvc3NfcHRyKTsKK30KKyNlbmRpZgorCitlbnVtIEFWUGl4ZWxGb3JtYXQgYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdF9vZl9saXN0KGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcGl4X2ZtdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjX3BpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfYWxwaGEsIGludCAqbG9zc19wdHIpeworICAgIGludCBpOworCisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGJlc3QgPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICBmb3IoaT0wOyBwaXhfZm10X2xpc3RbaV0gIT0gQVZfUElYX0ZNVF9OT05FOyBpKyspCisgICAgICAgIGJlc3QgPSBhdmNvZGVjX2ZpbmRfYmVzdF9waXhfZm10X29mXzIoYmVzdCwgcGl4X2ZtdF9saXN0W2ldLCBzcmNfcGl4X2ZtdCwgaGFzX2FscGhhLCBsb3NzX3B0cik7CisKKyAgICByZXR1cm4gYmVzdDsKK30KKworLyogMngyIC0+IDF4MSAqLwordm9pZCBmZl9zaHJpbmsyMih1aW50OF90ICpkc3QsIGludCBkc3Rfd3JhcCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY193cmFwLAorICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCB3OworICAgIGNvbnN0IHVpbnQ4X3QgKnMxLCAqczI7CisgICAgdWludDhfdCAqZDsKKworICAgIGZvcig7aGVpZ2h0ID4gMDsgaGVpZ2h0LS0pIHsKKyAgICAgICAgczEgPSBzcmM7CisgICAgICAgIHMyID0gczEgKyBzcmNfd3JhcDsKKyAgICAgICAgZCA9IGRzdDsKKyAgICAgICAgZm9yKHcgPSB3aWR0aDt3ID49IDQ7IHctPTQpIHsKKyAgICAgICAgICAgIGRbMF0gPSAoczFbMF0gKyBzMVsxXSArIHMyWzBdICsgczJbMV0gKyAyKSA+PiAyOworICAgICAgICAgICAgZFsxXSA9IChzMVsyXSArIHMxWzNdICsgczJbMl0gKyBzMlszXSArIDIpID4+IDI7CisgICAgICAgICAgICBkWzJdID0gKHMxWzRdICsgczFbNV0gKyBzMls0XSArIHMyWzVdICsgMikgPj4gMjsKKyAgICAgICAgICAgIGRbM10gPSAoczFbNl0gKyBzMVs3XSArIHMyWzZdICsgczJbN10gKyAyKSA+PiAyOworICAgICAgICAgICAgczEgKz0gODsKKyAgICAgICAgICAgIHMyICs9IDg7CisgICAgICAgICAgICBkICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yKDt3ID4gMDsgdy0tKSB7CisgICAgICAgICAgICBkWzBdID0gKHMxWzBdICsgczFbMV0gKyBzMlswXSArIHMyWzFdICsgMikgPj4gMjsKKyAgICAgICAgICAgIHMxICs9IDI7CisgICAgICAgICAgICBzMiArPSAyOworICAgICAgICAgICAgZCsrOworICAgICAgICB9CisgICAgICAgIHNyYyArPSAyICogc3JjX3dyYXA7CisgICAgICAgIGRzdCArPSBkc3Rfd3JhcDsKKyAgICB9Cit9CisKKy8qIDR4NCAtPiAxeDEgKi8KK3ZvaWQgZmZfc2hyaW5rNDQodWludDhfdCAqZHN0LCBpbnQgZHN0X3dyYXAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfd3JhcCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgdzsKKyAgICBjb25zdCB1aW50OF90ICpzMSwgKnMyLCAqczMsICpzNDsKKyAgICB1aW50OF90ICpkOworCisgICAgZm9yKDtoZWlnaHQgPiAwOyBoZWlnaHQtLSkgeworICAgICAgICBzMSA9IHNyYzsKKyAgICAgICAgczIgPSBzMSArIHNyY193cmFwOworICAgICAgICBzMyA9IHMyICsgc3JjX3dyYXA7CisgICAgICAgIHM0ID0gczMgKyBzcmNfd3JhcDsKKyAgICAgICAgZCA9IGRzdDsKKyAgICAgICAgZm9yKHcgPSB3aWR0aDt3ID4gMDsgdy0tKSB7CisgICAgICAgICAgICBkWzBdID0gKHMxWzBdICsgczFbMV0gKyBzMVsyXSArIHMxWzNdICsKKyAgICAgICAgICAgICAgICAgICAgczJbMF0gKyBzMlsxXSArIHMyWzJdICsgczJbM10gKworICAgICAgICAgICAgICAgICAgICBzM1swXSArIHMzWzFdICsgczNbMl0gKyBzM1szXSArCisgICAgICAgICAgICAgICAgICAgIHM0WzBdICsgczRbMV0gKyBzNFsyXSArIHM0WzNdICsgOCkgPj4gNDsKKyAgICAgICAgICAgIHMxICs9IDQ7CisgICAgICAgICAgICBzMiArPSA0OworICAgICAgICAgICAgczMgKz0gNDsKKyAgICAgICAgICAgIHM0ICs9IDQ7CisgICAgICAgICAgICBkKys7CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IDQgKiBzcmNfd3JhcDsKKyAgICAgICAgZHN0ICs9IGRzdF93cmFwOworICAgIH0KK30KKworLyogOHg4IC0+IDF4MSAqLwordm9pZCBmZl9zaHJpbms4OCh1aW50OF90ICpkc3QsIGludCBkc3Rfd3JhcCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY193cmFwLAorICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCB3LCBpOworCisgICAgZm9yKDtoZWlnaHQgPiAwOyBoZWlnaHQtLSkgeworICAgICAgICBmb3IodyA9IHdpZHRoO3cgPiAwOyB3LS0pIHsKKyAgICAgICAgICAgIGludCB0bXA9MDsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8ODsgaSsrKXsKKyAgICAgICAgICAgICAgICB0bXAgKz0gc3JjWzBdICsgc3JjWzFdICsgc3JjWzJdICsgc3JjWzNdICsgc3JjWzRdICsgc3JjWzVdICsgc3JjWzZdICsgc3JjWzddOworICAgICAgICAgICAgICAgIHNyYyArPSBzcmNfd3JhcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooZHN0KyspID0gKHRtcCArIDMyKT4+NjsKKyAgICAgICAgICAgIHNyYyArPSA4IC0gOCpzcmNfd3JhcDsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gOCpzcmNfd3JhcCAtIDgqd2lkdGg7CisgICAgICAgIGRzdCArPSBkc3Rfd3JhcCAtIHdpZHRoOworICAgIH0KK30KKworLyogcmV0dXJuIHRydWUgaWYgeXV2IHBsYW5hciAqLworc3RhdGljIGlubGluZSBpbnQgaXNfeXV2X3BsYW5hcihjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MpCit7CisgICAgaW50IGk7CisgICAgaW50IHBsYW5lc1s0XSA9IHsgMCB9OworCisgICAgaWYgKCAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUkdCCisgICAgICAgIHx8ICEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBzZXQgdGhlIHVzZWQgcGxhbmVzICovCisgICAgZm9yIChpID0gMDsgaSA8IGRlc2MtPm5iX2NvbXBvbmVudHM7IGkrKykKKyAgICAgICAgcGxhbmVzW2Rlc2MtPmNvbXBbaV0ucGxhbmVdID0gMTsKKworICAgIC8qIGlmIHRoZXJlIGlzIGFuIHVudXNlZCBwbGFuZSwgdGhlIGZvcm1hdCBpcyBub3QgcGxhbmFyICovCisgICAgZm9yIChpID0gMDsgaSA8IGRlc2MtPm5iX2NvbXBvbmVudHM7IGkrKykKKyAgICAgICAgaWYgKCFwbGFuZXNbaV0pCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKK30KKworaW50IGF2X3BpY3R1cmVfY3JvcChBVlBpY3R1cmUgKmRzdCwgY29uc3QgQVZQaWN0dXJlICpzcmMsCisgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgdG9wX2JhbmQsIGludCBsZWZ0X2JhbmQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBpbnQgeV9zaGlmdDsKKyAgICBpbnQgeF9zaGlmdDsKKworICAgIGlmIChwaXhfZm10IDwgMCB8fCBwaXhfZm10ID49IEFWX1BJWF9GTVRfTkIpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHlfc2hpZnQgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworICAgIHhfc2hpZnQgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworCisgICAgaWYgKGlzX3l1dl9wbGFuYXIoZGVzYykpIHsKKyAgICBkc3QtPmRhdGFbMF0gPSBzcmMtPmRhdGFbMF0gKyAodG9wX2JhbmQgKiBzcmMtPmxpbmVzaXplWzBdKSArIGxlZnRfYmFuZDsKKyAgICBkc3QtPmRhdGFbMV0gPSBzcmMtPmRhdGFbMV0gKyAoKHRvcF9iYW5kID4+IHlfc2hpZnQpICogc3JjLT5saW5lc2l6ZVsxXSkgKyAobGVmdF9iYW5kID4+IHhfc2hpZnQpOworICAgIGRzdC0+ZGF0YVsyXSA9IHNyYy0+ZGF0YVsyXSArICgodG9wX2JhbmQgPj4geV9zaGlmdCkgKiBzcmMtPmxpbmVzaXplWzJdKSArIChsZWZ0X2JhbmQgPj4geF9zaGlmdCk7CisgICAgfSBlbHNleworICAgICAgICBpZih0b3BfYmFuZCAlICgxPDx5X3NoaWZ0KSB8fCBsZWZ0X2JhbmQgJSAoMTw8eF9zaGlmdCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmKGxlZnRfYmFuZCkgLy9GSVhNRSBhZGQgc3VwcG9ydCBmb3IgdGhpcyB0b28KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZHN0LT5kYXRhWzBdID0gc3JjLT5kYXRhWzBdICsgKHRvcF9iYW5kICogc3JjLT5saW5lc2l6ZVswXSkgKyBsZWZ0X2JhbmQ7CisgICAgfQorCisgICAgZHN0LT5saW5lc2l6ZVswXSA9IHNyYy0+bGluZXNpemVbMF07CisgICAgZHN0LT5saW5lc2l6ZVsxXSA9IHNyYy0+bGluZXNpemVbMV07CisgICAgZHN0LT5saW5lc2l6ZVsyXSA9IHNyYy0+bGluZXNpemVbMl07CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9waWN0dXJlX3BhZChBVlBpY3R1cmUgKmRzdCwgY29uc3QgQVZQaWN0dXJlICpzcmMsIGludCBoZWlnaHQsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHBhZHRvcCwgaW50IHBhZGJvdHRvbSwgaW50IHBhZGxlZnQsIGludCBwYWRyaWdodCwKKyAgICAgICAgICAgIGludCAqY29sb3IpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICB1aW50OF90ICpvcHRyOworICAgIGludCB5X3NoaWZ0OworICAgIGludCB4X3NoaWZ0OworICAgIGludCB5aGVpZ2h0OworICAgIGludCBpLCB5OworCisgICAgaWYgKHBpeF9mbXQgPCAwIHx8IHBpeF9mbXQgPj0gQVZfUElYX0ZNVF9OQiB8fAorICAgICAgICAhaXNfeXV2X3BsYW5hcihkZXNjKSkgcmV0dXJuIC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICB4X3NoaWZ0ID0gaSA/IGRlc2MtPmxvZzJfY2hyb21hX3cgOiAwOworICAgICAgICB5X3NoaWZ0ID0gaSA/IGRlc2MtPmxvZzJfY2hyb21hX2ggOiAwOworCisgICAgICAgIGlmIChwYWR0b3AgfHwgcGFkbGVmdCkgeworICAgICAgICAgICAgbWVtc2V0KGRzdC0+ZGF0YVtpXSwgY29sb3JbaV0sCisgICAgICAgICAgICAgICAgZHN0LT5saW5lc2l6ZVtpXSAqIChwYWR0b3AgPj4geV9zaGlmdCkgKyAocGFkbGVmdCA+PiB4X3NoaWZ0KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFkbGVmdCB8fCBwYWRyaWdodCkgeworICAgICAgICAgICAgb3B0ciA9IGRzdC0+ZGF0YVtpXSArIGRzdC0+bGluZXNpemVbaV0gKiAocGFkdG9wID4+IHlfc2hpZnQpICsKKyAgICAgICAgICAgICAgICAoZHN0LT5saW5lc2l6ZVtpXSAtIChwYWRyaWdodCA+PiB4X3NoaWZ0KSk7CisgICAgICAgICAgICB5aGVpZ2h0ID0gKGhlaWdodCAtIDEgLSAocGFkdG9wICsgcGFkYm90dG9tKSkgPj4geV9zaGlmdDsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCB5aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQob3B0ciwgY29sb3JbaV0sIChwYWRsZWZ0ICsgcGFkcmlnaHQpID4+IHhfc2hpZnQpOworICAgICAgICAgICAgICAgIG9wdHIgKz0gZHN0LT5saW5lc2l6ZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcmMpIHsgLyogZmlyc3QgbGluZSAqLworICAgICAgICAgICAgdWludDhfdCAqaXB0ciA9IHNyYy0+ZGF0YVtpXTsKKyAgICAgICAgICAgIG9wdHIgPSBkc3QtPmRhdGFbaV0gKyBkc3QtPmxpbmVzaXplW2ldICogKHBhZHRvcCA+PiB5X3NoaWZ0KSArCisgICAgICAgICAgICAgICAgICAgIChwYWRsZWZ0ID4+IHhfc2hpZnQpOworICAgICAgICAgICAgbWVtY3B5KG9wdHIsIGlwdHIsICh3aWR0aCAtIHBhZGxlZnQgLSBwYWRyaWdodCkgPj4geF9zaGlmdCk7CisgICAgICAgICAgICBpcHRyICs9IHNyYy0+bGluZXNpemVbaV07CisgICAgICAgICAgICBvcHRyID0gZHN0LT5kYXRhW2ldICsgZHN0LT5saW5lc2l6ZVtpXSAqIChwYWR0b3AgPj4geV9zaGlmdCkgKworICAgICAgICAgICAgICAgIChkc3QtPmxpbmVzaXplW2ldIC0gKHBhZHJpZ2h0ID4+IHhfc2hpZnQpKTsKKyAgICAgICAgICAgIHloZWlnaHQgPSAoaGVpZ2h0IC0gMSAtIChwYWR0b3AgKyBwYWRib3R0b20pKSA+PiB5X3NoaWZ0OworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHloZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgIG1lbXNldChvcHRyLCBjb2xvcltpXSwgKHBhZGxlZnQgKyBwYWRyaWdodCkgPj4geF9zaGlmdCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KG9wdHIgKyAoKHBhZGxlZnQgKyBwYWRyaWdodCkgPj4geF9zaGlmdCksIGlwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICh3aWR0aCAtIHBhZGxlZnQgLSBwYWRyaWdodCkgPj4geF9zaGlmdCk7CisgICAgICAgICAgICAgICAgaXB0ciArPSBzcmMtPmxpbmVzaXplW2ldOworICAgICAgICAgICAgICAgIG9wdHIgKz0gZHN0LT5saW5lc2l6ZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYWRib3R0b20gfHwgcGFkcmlnaHQpIHsKKyAgICAgICAgICAgIG9wdHIgPSBkc3QtPmRhdGFbaV0gKyBkc3QtPmxpbmVzaXplW2ldICoKKyAgICAgICAgICAgICAgICAoKGhlaWdodCAtIHBhZGJvdHRvbSkgPj4geV9zaGlmdCkgLSAocGFkcmlnaHQgPj4geF9zaGlmdCk7CisgICAgICAgICAgICBtZW1zZXQob3B0ciwgY29sb3JbaV0sZHN0LT5saW5lc2l6ZVtpXSAqCisgICAgICAgICAgICAgICAgKHBhZGJvdHRvbSA+PiB5X3NoaWZ0KSArIChwYWRyaWdodCA+PiB4X3NoaWZ0KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBGRl9BUElfREVJTlRFUkxBQ0UKKworI2lmIEhBVkVfTU1YX0VYVEVSTkFMCisjZGVmaW5lIGRlaW50ZXJsYWNlX2xpbmVfaW5wbGFjZSBmZl9kZWludGVybGFjZV9saW5lX2lucGxhY2VfbW14CisjZGVmaW5lIGRlaW50ZXJsYWNlX2xpbmUgICAgICAgICBmZl9kZWludGVybGFjZV9saW5lX21teAorI2Vsc2UKKyNkZWZpbmUgZGVpbnRlcmxhY2VfbGluZV9pbnBsYWNlIGRlaW50ZXJsYWNlX2xpbmVfaW5wbGFjZV9jCisjZGVmaW5lIGRlaW50ZXJsYWNlX2xpbmUgICAgICAgICBkZWludGVybGFjZV9saW5lX2MKKworLyogZmlsdGVyIHBhcmFtZXRlcnM6IFstMSA0IDIgNCAtMV0gLy8gOCAqLworc3RhdGljIHZvaWQgZGVpbnRlcmxhY2VfbGluZV9jKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbHVtX200LCBjb25zdCB1aW50OF90ICpsdW1fbTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmx1bV9tMiwgY29uc3QgdWludDhfdCAqbHVtX20xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmNtID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IHN1bTsKKworICAgIGZvcig7c2l6ZSA+IDA7c2l6ZS0tKSB7CisgICAgICAgIHN1bSA9IC1sdW1fbTRbMF07CisgICAgICAgIHN1bSArPSBsdW1fbTNbMF0gPDwgMjsKKyAgICAgICAgc3VtICs9IGx1bV9tMlswXSA8PCAxOworICAgICAgICBzdW0gKz0gbHVtX20xWzBdIDw8IDI7CisgICAgICAgIHN1bSArPSAtbHVtWzBdOworICAgICAgICBkc3RbMF0gPSBjbVsoc3VtICsgNCkgPj4gM107CisgICAgICAgIGx1bV9tNCsrOworICAgICAgICBsdW1fbTMrKzsKKyAgICAgICAgbHVtX20yKys7CisgICAgICAgIGx1bV9tMSsrOworICAgICAgICBsdW0rKzsKKyAgICAgICAgZHN0Kys7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWludGVybGFjZV9saW5lX2lucGxhY2VfYyh1aW50OF90ICpsdW1fbTQsIHVpbnQ4X3QgKmx1bV9tMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmx1bV9tMiwgdWludDhfdCAqbHVtX20xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbHVtLCBpbnQgc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOworICAgIGludCBzdW07CisKKyAgICBmb3IoO3NpemUgPiAwO3NpemUtLSkgeworICAgICAgICBzdW0gPSAtbHVtX200WzBdOworICAgICAgICBzdW0gKz0gbHVtX20zWzBdIDw8IDI7CisgICAgICAgIHN1bSArPSBsdW1fbTJbMF0gPDwgMTsKKyAgICAgICAgbHVtX200WzBdPWx1bV9tMlswXTsKKyAgICAgICAgc3VtICs9IGx1bV9tMVswXSA8PCAyOworICAgICAgICBzdW0gKz0gLWx1bVswXTsKKyAgICAgICAgbHVtX20yWzBdID0gY21bKHN1bSArIDQpID4+IDNdOworICAgICAgICBsdW1fbTQrKzsKKyAgICAgICAgbHVtX20zKys7CisgICAgICAgIGx1bV9tMisrOworICAgICAgICBsdW1fbTErKzsKKyAgICAgICAgbHVtKys7CisgICAgfQorfQorI2VuZGlmIC8qICFIQVZFX01NWF9FWFRFUk5BTCAqLworCisvKiBkZWludGVybGFjaW5nIDogMiB0ZW1wb3JhbCB0YXBzLCAzIHNwYXRpYWwgdGFwcyBsaW5lYXIgZmlsdGVyLiBUaGUKKyAgIHRvcCBmaWVsZCBpcyBjb3BpZWQgYXMgaXMsIGJ1dCB0aGUgYm90dG9tIGZpZWxkIGlzIGRlaW50ZXJsYWNlZAorICAgYWdhaW5zdCB0aGUgdG9wIGZpZWxkLiAqLworc3RhdGljIHZvaWQgZGVpbnRlcmxhY2VfYm90dG9tX2ZpZWxkKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF93cmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMSwgaW50IHNyY193cmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19tMiwgKnNyY19tMSwgKnNyY18wLCAqc3JjX3AxLCAqc3JjX3AyOworICAgIGludCB5OworCisgICAgc3JjX20yID0gc3JjMTsKKyAgICBzcmNfbTEgPSBzcmMxOworICAgIHNyY18wPSZzcmNfbTFbc3JjX3dyYXBdOworICAgIHNyY19wMT0mc3JjXzBbc3JjX3dyYXBdOworICAgIHNyY19wMj0mc3JjX3AxW3NyY193cmFwXTsKKyAgICBmb3IoeT0wO3k8KGhlaWdodC0yKTt5Kz0yKSB7CisgICAgICAgIG1lbWNweShkc3Qsc3JjX20xLHdpZHRoKTsKKyAgICAgICAgZHN0ICs9IGRzdF93cmFwOworICAgICAgICBkZWludGVybGFjZV9saW5lKGRzdCxzcmNfbTIsc3JjX20xLHNyY18wLHNyY19wMSxzcmNfcDIsd2lkdGgpOworICAgICAgICBzcmNfbTIgPSBzcmNfMDsKKyAgICAgICAgc3JjX20xID0gc3JjX3AxOworICAgICAgICBzcmNfMCA9IHNyY19wMjsKKyAgICAgICAgc3JjX3AxICs9IDIqc3JjX3dyYXA7CisgICAgICAgIHNyY19wMiArPSAyKnNyY193cmFwOworICAgICAgICBkc3QgKz0gZHN0X3dyYXA7CisgICAgfQorICAgIG1lbWNweShkc3Qsc3JjX20xLHdpZHRoKTsKKyAgICBkc3QgKz0gZHN0X3dyYXA7CisgICAgLyogZG8gbGFzdCBsaW5lICovCisgICAgZGVpbnRlcmxhY2VfbGluZShkc3Qsc3JjX20yLHNyY19tMSxzcmNfMCxzcmNfMCxzcmNfMCx3aWR0aCk7Cit9CisKK3N0YXRpYyB2b2lkIGRlaW50ZXJsYWNlX2JvdHRvbV9maWVsZF9pbnBsYWNlKHVpbnQ4X3QgKnNyYzEsIGludCBzcmNfd3JhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICB1aW50OF90ICpzcmNfbTEsICpzcmNfMCwgKnNyY19wMSwgKnNyY19wMjsKKyAgICBpbnQgeTsKKyAgICB1aW50OF90ICpidWY7CisgICAgYnVmID0gYXZfbWFsbG9jKHdpZHRoKTsKKworICAgIHNyY19tMSA9IHNyYzE7CisgICAgbWVtY3B5KGJ1ZixzcmNfbTEsd2lkdGgpOworICAgIHNyY18wPSZzcmNfbTFbc3JjX3dyYXBdOworICAgIHNyY19wMT0mc3JjXzBbc3JjX3dyYXBdOworICAgIHNyY19wMj0mc3JjX3AxW3NyY193cmFwXTsKKyAgICBmb3IoeT0wO3k8KGhlaWdodC0yKTt5Kz0yKSB7CisgICAgICAgIGRlaW50ZXJsYWNlX2xpbmVfaW5wbGFjZShidWYsc3JjX20xLHNyY18wLHNyY19wMSxzcmNfcDIsd2lkdGgpOworICAgICAgICBzcmNfbTEgPSBzcmNfcDE7CisgICAgICAgIHNyY18wID0gc3JjX3AyOworICAgICAgICBzcmNfcDEgKz0gMipzcmNfd3JhcDsKKyAgICAgICAgc3JjX3AyICs9IDIqc3JjX3dyYXA7CisgICAgfQorICAgIC8qIGRvIGxhc3QgbGluZSAqLworICAgIGRlaW50ZXJsYWNlX2xpbmVfaW5wbGFjZShidWYsc3JjX20xLHNyY18wLHNyY18wLHNyY18wLHdpZHRoKTsKKyAgICBhdl9mcmVlKGJ1Zik7Cit9CisKK2ludCBhdnBpY3R1cmVfZGVpbnRlcmxhY2UoQVZQaWN0dXJlICpkc3QsIGNvbnN0IEFWUGljdHVyZSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBpOworCisgICAgaWYgKHBpeF9mbXQgIT0gQVZfUElYX0ZNVF9ZVVY0MjBQICYmCisgICAgICAgIHBpeF9mbXQgIT0gQVZfUElYX0ZNVF9ZVVZKNDIwUCAmJgorICAgICAgICBwaXhfZm10ICE9IEFWX1BJWF9GTVRfWVVWNDIyUCAmJgorICAgICAgICBwaXhfZm10ICE9IEFWX1BJWF9GTVRfWVVWSjQyMlAgJiYKKyAgICAgICAgcGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1lVVjQ0NFAgJiYKKyAgICAgICAgcGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1lVVjQxMVAgJiYKKyAgICAgICAgcGl4X2ZtdCAhPSBBVl9QSVhfRk1UX0dSQVk4KQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCh3aWR0aCAmIDMpICE9IDAgfHwgKGhlaWdodCAmIDMpICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvcihpPTA7aTwzO2krKykgeworICAgICAgICBpZiAoaSA9PSAxKSB7CisgICAgICAgICAgICBzd2l0Y2gocGl4X2ZtdCkgeworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0MjBQOgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgICAgICAgICAgICAgd2lkdGggPj49IDE7CisgICAgICAgICAgICAgICAgaGVpZ2h0ID4+PSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQyMlA6CisgICAgICAgICAgICAgICAgd2lkdGggPj49IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDExUDoKKyAgICAgICAgICAgICAgICB3aWR0aCA+Pj0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dSQVk4KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyYyA9PSBkc3QpIHsKKyAgICAgICAgICAgIGRlaW50ZXJsYWNlX2JvdHRvbV9maWVsZF9pbnBsYWNlKGRzdC0+ZGF0YVtpXSwgZHN0LT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVpbnRlcmxhY2VfYm90dG9tX2ZpZWxkKGRzdC0+ZGF0YVtpXSxkc3QtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+ZGF0YVtpXSwgc3JjLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbW1zX2MoKTsKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIEZGX0FQSV9ERUlOVEVSTEFDRSAqLworCisjaWZkZWYgVEVTVAorCitpbnQgbWFpbih2b2lkKXsKKyAgICBpbnQgaTsKKyAgICBpbnQgZXJyPTA7CisgICAgaW50IHNraXAgPSAwOworCisgICAgZm9yIChpPTA7IGk8QVZfUElYX0ZNVF9OQioyOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpKTsKKyAgICAgICAgaWYoIWRlc2MgfHwgIWRlc2MtPm5hbWUpIHsKKyAgICAgICAgICAgIHNraXAgKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2tpcCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJTNkIHVudXNlZCBwaXhlbCBmb3JtYXQgdmFsdWVzXG4iLCBza2lwKTsKKyAgICAgICAgICAgIHNraXAgPSAwOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgInBpeCBmbXQgJXMgeXV2X3BsYW46JWQgYXZnX2JwcDolZFxuIiwgZGVzYy0+bmFtZSwgaXNfeXV2X3BsYW5hcihkZXNjKSwgYXZfZ2V0X3BhZGRlZF9iaXRzX3Blcl9waXhlbChkZXNjKSk7CisgICAgICAgIGlmICgoIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSkpICE9IChkZXNjLT5uYl9jb21wb25lbnRzICE9IDIgJiYgZGVzYy0+bmJfY29tcG9uZW50cyAhPSA0KSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkFscGhhIGZsYWcgbWlzbWF0Y2hcbiIpOworICAgICAgICAgICAgZXJyID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ltZ2NvbnZlcnQuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2ltZ2NvbnZlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2U2MjZkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW1nY29udmVydC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0lNR0NPTlZFUlRfSAorI2RlZmluZSBBVkNPREVDX0lNR0NPTlZFUlRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNpZiBGRl9BUElfREVJTlRFUkxBQ0UKKwordm9pZCBmZl9kZWludGVybGFjZV9saW5lX21teCh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmx1bV9tNCwgY29uc3QgdWludDhfdCAqbHVtX20zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsdW1fbTIsIGNvbnN0IHVpbnQ4X3QgKmx1bV9tMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbHVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSk7CisKK3ZvaWQgZmZfZGVpbnRlcmxhY2VfbGluZV9pbnBsYWNlX21teChjb25zdCB1aW50OF90ICpsdW1fbTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbHVtX20zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmx1bV9tMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsdW1fbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbHVtLCBpbnQgc2l6ZSk7CisKKyNlbmRpZiAvKiBGRl9BUElfREVJTlRFUkxBQ0UgKi8KKworLyogMS8yXm4gZG93bnNjYWxpbmcgZnVuY3Rpb25zICovCit2b2lkIGZmX3NocmluazIyKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF93cmFwLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfd3JhcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK3ZvaWQgZmZfc2hyaW5rNDQodWludDhfdCAqZHN0LCBpbnQgZHN0X3dyYXAsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY193cmFwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwordm9pZCBmZl9zaHJpbms4OCh1aW50OF90ICpkc3QsIGludCBkc3Rfd3JhcCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3dyYXAsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0lNR0NPTlZFUlRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaW14X2R1bXBfaGVhZGVyX2JzZi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW14X2R1bXBfaGVhZGVyX2JzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDNmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9pbXhfZHVtcF9oZWFkZXJfYnNmLmMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIGlteCBkdW1wIGhlYWRlciBiaXRzdHJlYW0gZmlsdGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQmFwdGlzdGUgQ291ZHVyaWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGlteCBkdW1wIGhlYWRlciBiaXRzdHJlYW0gZmlsdGVyCisgKiBtb2RpZmllcyBiaXRzdHJlYW0gdG8gZml0IGluIG1vdiBhbmQgYmUgZGVjb2RlZCBieSBmaW5hbCBjdXQgcHJvIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKworCitzdGF0aWMgaW50IGlteF9kdW1wX2hlYWRlcihBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgY2hhciAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQga2V5ZnJhbWUpCit7CisgICAgLyogTVhGIGVzc2VuY2UgZWxlbWVudCBrZXkgKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBpbXhfaGVhZGVyWzE2XSA9IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAzLDB4MDEsMHgwNSwweDAxLDB4MDEsMHgwMCB9OworICAgIHVpbnQ4X3QgKnBvdXRidWZwOworCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW14IGJpdHN0cmVhbSBmaWx0ZXIgb25seSBhcHBsaWVzIHRvIG1wZWcydmlkZW8gY29kZWNcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqcG91dGJ1ZiA9IGF2X21hbGxvYyhidWZfc2l6ZSArIDIwICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgcG91dGJ1ZnAgPSAqcG91dGJ1ZjsKKyAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnBvdXRidWZwLCBpbXhfaGVhZGVyLCAxNik7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcG91dGJ1ZnAsIDB4ODMpOyAvKiBLTFYgQkVSIGxvbmcgZm9ybSAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMjQoJnBvdXRidWZwLCBidWZfc2l6ZSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZwb3V0YnVmcCwgYnVmLCBidWZfc2l6ZSk7CisgICAgKnBvdXRidWZfc2l6ZSA9IHBvdXRidWZwIC0gKnBvdXRidWY7CisgICAgcmV0dXJuIDE7Cit9CisKK0FWQml0U3RyZWFtRmlsdGVyIGZmX2lteF9kdW1wX2hlYWRlcl9ic2YgPSB7CisgICAgLm5hbWUgICA9ICJpbXhkdW1wIiwKKyAgICAuZmlsdGVyID0gaW14X2R1bXBfaGVhZGVyLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2luZGVvMi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW5kZW8yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3MzVjMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2luZGVvMi5jCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogSW50ZWwgSW5kZW8gMiBjb2RlYworICogQ29weXJpZ2h0IChjKSAyMDA1IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSW50ZWwgSW5kZW8gMiBkZWNvZGVyLgorICovCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW5kZW8yZGF0YS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCit0eXBlZGVmIHN0cnVjdCBJcjJDb250ZXh0eworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBVkZyYW1lICpwaWN0dXJlOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGRlY29kZV9kZWx0YTsKK30gSXIyQ29udGV4dDsKKworI2RlZmluZSBDT0RFX1ZMQ19CSVRTIDE0CitzdGF0aWMgVkxDIGlyMl92bGM7CisKKy8qIEluZGVvIDIgY29kZXMgYXJlIGluIHJhbmdlIDB4MDEuLjB4N0YgYW5kIDB4ODEuLjB4OTAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlyMl9nZXRfY29kZShHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICByZXR1cm4gZ2V0X3ZsYzIoZ2IsIGlyMl92bGMudGFibGUsIENPREVfVkxDX0JJVFMsIDEpICsgMTsKK30KKworc3RhdGljIGludCBpcjJfZGVjb2RlX3BsYW5lKElyMkNvbnRleHQgKmN0eCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLCBjb25zdCB1aW50OF90ICp0YWJsZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgajsKKyAgICBpbnQgb3V0ID0gMDsKKworICAgIGlmICh3aWR0aCAmIDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLyogZmlyc3QgbGluZSBjb250YWluIGFic29sdXRlIHZhbHVlcywgb3RoZXIgbGluZXMgY29udGFpbiBkZWx0YXMgKi8KKyAgICB3aGlsZSAob3V0IDwgd2lkdGgpIHsKKyAgICAgICAgaW50IGMgPSBpcjJfZ2V0X2NvZGUoJmN0eC0+Z2IpOworICAgICAgICBpZiAoYyA+PSAweDgwKSB7IC8qIHdlIGhhdmUgYSBydW4gKi8KKyAgICAgICAgICAgIGMgLT0gMHg3RjsKKyAgICAgICAgICAgIGlmIChvdXQgKyBjKjIgPiB3aWR0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjICogMjsgaSsrKQorICAgICAgICAgICAgICAgIGRzdFtvdXQrK10gPSAweDgwOworICAgICAgICB9IGVsc2UgeyAvKiBjb3B5IHR3byB2YWx1ZXMgZnJvbSB0YWJsZSAqLworICAgICAgICAgICAgZHN0W291dCsrXSA9IHRhYmxlW2MgKiAyXTsKKyAgICAgICAgICAgIGRzdFtvdXQrK10gPSB0YWJsZVsoYyAqIDIpICsgMV07CisgICAgICAgIH0KKyAgICB9CisgICAgZHN0ICs9IHBpdGNoOworCisgICAgZm9yIChqID0gMTsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgIG91dCA9IDA7CisgICAgICAgIHdoaWxlIChvdXQgPCB3aWR0aCkgeworICAgICAgICAgICAgaW50IGMgPSBpcjJfZ2V0X2NvZGUoJmN0eC0+Z2IpOworICAgICAgICAgICAgaWYgKGMgPj0gMHg4MCkgeyAvKiB3ZSBoYXZlIGEgc2tpcCAqLworICAgICAgICAgICAgICAgIGMgLT0gMHg3RjsKKyAgICAgICAgICAgICAgICBpZiAob3V0ICsgYyoyID4gd2lkdGgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjICogMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFtvdXRdID0gZHN0W291dCAtIHBpdGNoXTsKKyAgICAgICAgICAgICAgICAgICAgb3V0Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLyogYWRkIHR3byBkZWx0YXMgZnJvbSB0YWJsZSAqLworICAgICAgICAgICAgICAgIGludCB0ICAgID0gZHN0W291dCAtIHBpdGNoXSArICh0YWJsZVtjICogMl0gLSAxMjgpOworICAgICAgICAgICAgICAgIHQgICAgICAgID0gYXZfY2xpcF91aW50OCh0KTsKKyAgICAgICAgICAgICAgICBkc3Rbb3V0XSA9IHQ7CisgICAgICAgICAgICAgICAgb3V0Kys7CisgICAgICAgICAgICAgICAgdCAgICAgICAgPSBkc3Rbb3V0IC0gcGl0Y2hdICsgKHRhYmxlWyhjICogMikgKyAxXSAtIDEyOCk7CisgICAgICAgICAgICAgICAgdCAgICAgICAgPSBhdl9jbGlwX3VpbnQ4KHQpOworICAgICAgICAgICAgICAgIGRzdFtvdXRdID0gdDsKKyAgICAgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gcGl0Y2g7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlyMl9kZWNvZGVfcGxhbmVfaW50ZXIoSXIyQ29udGV4dCAqY3R4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gsIGNvbnN0IHVpbnQ4X3QgKnRhYmxlKQoreworICAgIGludCBqOworICAgIGludCBvdXQgPSAwOworICAgIGludCBjOworICAgIGludCB0OworCisgICAgaWYgKHdpZHRoICYgMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgb3V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG91dCA8IHdpZHRoKSB7CisgICAgICAgICAgICBjID0gaXIyX2dldF9jb2RlKCZjdHgtPmdiKTsKKyAgICAgICAgICAgIGlmIChjID49IDB4ODApIHsgLyogd2UgaGF2ZSBhIHNraXAgKi8KKyAgICAgICAgICAgICAgICBjICAgLT0gMHg3RjsKKyAgICAgICAgICAgICAgICBvdXQgKz0gYyAqIDI7CisgICAgICAgICAgICB9IGVsc2UgeyAvKiBhZGQgdHdvIGRlbHRhcyBmcm9tIHRhYmxlICovCisgICAgICAgICAgICAgICAgdCAgICAgICAgPSBkc3Rbb3V0XSArICgoKHRhYmxlW2MgKiAyXSAtIDEyOCkqMykgPj4gMik7CisgICAgICAgICAgICAgICAgdCAgICAgICAgPSBhdl9jbGlwX3VpbnQ4KHQpOworICAgICAgICAgICAgICAgIGRzdFtvdXRdID0gdDsKKyAgICAgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgICAgICAgICB0ICAgICAgICA9IGRzdFtvdXRdICsgKCgodGFibGVbKGMgKiAyKSArIDFdIC0gMTI4KSozKSA+PiAyKTsKKyAgICAgICAgICAgICAgICB0ICAgICAgICA9IGF2X2NsaXBfdWludDgodCk7CisgICAgICAgICAgICAgICAgZHN0W291dF0gPSB0OworICAgICAgICAgICAgICAgIG91dCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRzdCArPSBwaXRjaDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXIyX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBJcjJDb250ZXh0ICogY29uc3QgcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmICAgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgICA9IGF2cGt0LT5zaXplOworICAgIEFWRnJhbWUgKnBpY3R1cmUgICAgID0gZGF0YTsKKyAgICBBVkZyYW1lICogY29uc3QgcCAgICA9IHMtPnBpY3R1cmU7CisgICAgaW50IHN0YXJ0LCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHN0YXJ0ID0gNDg7IC8qIGhhcmRjb2RlZCBmb3Igbm93ICovCisKKyAgICBpZiAoc3RhcnQgPj0gYnVmX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dCBidWZmZXIgc2l6ZSB0b28gc21hbGwgKCVkKVxuIiwgYnVmX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5kZWNvZGVfZGVsdGEgPSBidWZbMThdOworCisgICAgLyogZGVjaWRlIHdoZXRoZXIgZnJhbWUgdXNlcyBkZWx0YXMgb3Igbm90ICovCisjaWZuZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykKKyAgICAgICAgYnVmW2ldID0gZmZfcmV2ZXJzZVtidWZbaV1dOworI2VuZGlmCisKKyAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgYnVmICsgc3RhcnQsIChidWZfc2l6ZSAtIHN0YXJ0KSAqIDgpOworCisgICAgaWYgKHMtPmRlY29kZV9kZWx0YSkgeyAvKiBpbnRyYWZyYW1lICovCisgICAgICAgIGlmICgocmV0ID0gaXIyX2RlY29kZV9wbGFuZShzLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhWzBdLCBwLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyMl9sdW1hX3RhYmxlKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAvKiBzd2FwcGVkIFUgYW5kIFYgKi8KKyAgICAgICAgaWYgKChyZXQgPSBpcjJfZGVjb2RlX3BsYW5lKHMsIGF2Y3R4LT53aWR0aCA+PiAyLCBhdmN0eC0+aGVpZ2h0ID4+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhWzJdLCBwLT5saW5lc2l6ZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyMl9sdW1hX3RhYmxlKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKChyZXQgPSBpcjJfZGVjb2RlX3BsYW5lKHMsIGF2Y3R4LT53aWR0aCA+PiAyLCBhdmN0eC0+aGVpZ2h0ID4+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhWzFdLCBwLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyMl9sdW1hX3RhYmxlKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeyAvKiBpbnRlcmZyYW1lICovCisgICAgICAgIGlmICgocmV0ID0gaXIyX2RlY29kZV9wbGFuZV9pbnRlcihzLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhWzBdLCBwLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyMl9sdW1hX3RhYmxlKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgLyogc3dhcHBlZCBVIGFuZCBWICovCisgICAgICAgIGlmICgocmV0ID0gaXIyX2RlY29kZV9wbGFuZV9pbnRlcihzLCBhdmN0eC0+d2lkdGggPj4gMiwgYXZjdHgtPmhlaWdodCA+PiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVsyXSwgcC0+bGluZXNpemVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcjJfbHVtYV90YWJsZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmICgocmV0ID0gaXIyX2RlY29kZV9wbGFuZV9pbnRlcihzLCBhdmN0eC0+d2lkdGggPj4gMiwgYXZjdHgtPmhlaWdodCA+PiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVsxXSwgcC0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcjJfbHVtYV90YWJsZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYocGljdHVyZSwgcCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaXIyX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBJcjJDb250ZXh0ICogY29uc3QgaWMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0YXRpYyBWTENfVFlQRSB2bGNfdGFibGVzWzEgPDwgQ09ERV9WTENfQklUU11bMl07CisKKyAgICBpYy0+YXZjdHggPSBhdmN0eDsKKworICAgIGF2Y3R4LT5waXhfZm10PSBBVl9QSVhfRk1UX1lVVjQxMFA7CisKKyAgICBpYy0+cGljdHVyZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFpYy0+cGljdHVyZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlyMl92bGMudGFibGUgPSB2bGNfdGFibGVzOworICAgIGlyMl92bGMudGFibGVfYWxsb2NhdGVkID0gMSA8PCBDT0RFX1ZMQ19CSVRTOworI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKyAgICAgICAgaW5pdF92bGMoJmlyMl92bGMsIENPREVfVkxDX0JJVFMsIElSMl9DT0RFUywKKyAgICAgICAgICAgICAgICAgJmlyMl9jb2Rlc1swXVsxXSwgNCwgMiwKKyAgICAgICAgICAgICAgICAgJmlyMl9jb2Rlc1swXVswXSwgNCwgMiwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMgfCBJTklUX1ZMQ19MRSk7CisjZWxzZQorICAgICAgICBpbml0X3ZsYygmaXIyX3ZsYywgQ09ERV9WTENfQklUUywgSVIyX0NPREVTLAorICAgICAgICAgICAgICAgICAmaXIyX2NvZGVzWzBdWzFdLCA0LCAyLAorICAgICAgICAgICAgICAgICAmaXIyX2NvZGVzWzBdWzBdLCA0LCAyLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaXIyX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIElyMkNvbnRleHQgKiBjb25zdCBpYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpYy0+cGljdHVyZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9pbmRlbzJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaW5kZW8yIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSW50ZWwgSW5kZW8gMiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9JTkRFTzIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKElyMkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGlyMl9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBpcjJfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBpcjJfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaW5kZW8yZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW5kZW8yZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNmQ4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9pbmRlbzJkYXRhLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBJbnRlbCBJbmRlbyAyIGNvZGVjCisgKiBjb3B5cmlnaHQgKGMpIDIwMDUgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSU5ERU8yREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfSU5ERU8yREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBJUjJfQ09ERVMgMTQzCitzdGF0aWMgY29uc3QgdWludDE2X3QgaXIyX2NvZGVzW0lSMl9DT0RFU11bMl0gPSB7CisjaWZkZWYgQklUU1RSRUFNX1JFQURFUl9MRQorezB4MDAwMCwgIDN9LCB7MHgwMDA0LCAgM30sIHsweDAwMDYsICAzfSwgezB4MDAwMSwgIDV9LAorezB4MDAwOSwgIDV9LCB7MHgwMDE5LCAgNX0sIHsweDAwMEQsICA1fSwgezB4MDAxRCwgIDV9LAorezB4MDAyMywgIDZ9LCB7MHgwMDEzLCAgNn0sIHsweDAwMzMsICA2fSwgezB4MDAwQiwgIDZ9LAorezB4MDAyQiwgIDZ9LCB7MHgwMDFCLCAgNn0sIHsweDAwMDcsICA4fSwgezB4MDA4NywgIDh9LAorezB4MDAyNywgIDh9LCB7MHgwMEE3LCAgOH0sIHsweDAwNjcsICA4fSwgezB4MDBFNywgIDh9LAorezB4MDA5NywgIDh9LCB7MHgwMDU3LCAgOH0sIHsweDAwMzcsICA4fSwgezB4MDBCNywgIDh9LAorezB4MDBGNywgIDh9LCB7MHgwMDBGLCAgOX0sIHsweDAwOEYsICA5fSwgezB4MDE4RiwgIDl9LAorezB4MDE0RiwgIDl9LCB7MHgwMENGLCAgOX0sIHsweDAwMkYsICA5fSwgezB4MDEyRiwgIDl9LAorezB4MDFBRiwgIDl9LCB7MHgwMDZGLCAgOX0sIHsweDAwRUYsICA5fSwgezB4MDFFRiwgIDl9LAorezB4MDAxRiwgMTB9LCB7MHgwMjFGLCAxMH0sIHsweDAxMUYsIDEwfSwgezB4MDMxRiwgMTB9LAorezB4MDA5RiwgMTB9LCB7MHgwMjlGLCAxMH0sIHsweDAxOUYsIDEwfSwgezB4MDM5RiwgMTB9LAorezB4MDA1RiwgMTB9LCB7MHgwMjVGLCAxMH0sIHsweDAxNUYsIDEwfSwgezB4MDM1RiwgMTB9LAorezB4MDBERiwgMTB9LCB7MHgwMkRGLCAxMH0sIHsweDAxREYsIDEwfSwgezB4MDNERiwgMTB9LAorezB4MDAzRiwgMTN9LCB7MHgxMDNGLCAxM30sIHsweDA4M0YsIDEzfSwgezB4MTgzRiwgMTN9LAorezB4MDQzRiwgMTN9LCB7MHgxNDNGLCAxM30sIHsweDBDM0YsIDEzfSwgezB4MUMzRiwgMTN9LAorezB4MDIzRiwgMTN9LCB7MHgxMjNGLCAxM30sIHsweDBBM0YsIDEzfSwgezB4MUEzRiwgMTN9LAorezB4MDYzRiwgMTN9LCB7MHgxNjNGLCAxM30sIHsweDBFM0YsIDEzfSwgezB4MUUzRiwgMTN9LAorezB4MDEzRiwgMTN9LCB7MHgxMTNGLCAxM30sIHsweDA5M0YsIDEzfSwgezB4MTkzRiwgMTN9LAorezB4MDUzRiwgMTN9LCB7MHgxNTNGLCAxM30sIHsweDBEM0YsIDEzfSwgezB4MUQzRiwgMTN9LAorezB4MDMzRiwgMTN9LCB7MHgxMzNGLCAxM30sIHsweDBCM0YsIDEzfSwgezB4MUIzRiwgMTN9LAorezB4MDczRiwgMTN9LCB7MHgxNzNGLCAxM30sIHsweDBGM0YsIDEzfSwgezB4MUYzRiwgMTN9LAorezB4MDBCRiwgMTN9LCB7MHgxMEJGLCAxM30sIHsweDA4QkYsIDEzfSwgezB4MThCRiwgMTN9LAorezB4MDRCRiwgMTN9LCB7MHgxNEJGLCAxM30sIHsweDBDQkYsIDEzfSwgezB4MUNCRiwgMTN9LAorezB4MDJCRiwgMTN9LCB7MHgxMkJGLCAxM30sIHsweDBBQkYsIDEzfSwgezB4MUFCRiwgMTN9LAorezB4MDZCRiwgMTN9LCB7MHgxNkJGLCAxM30sIHsweDBFQkYsIDEzfSwgezB4MUVCRiwgMTN9LAorezB4MDFCRiwgMTN9LCB7MHgxMUJGLCAxM30sIHsweDA5QkYsIDEzfSwgezB4MTlCRiwgMTN9LAorezB4MDVCRiwgMTN9LCB7MHgxNUJGLCAxM30sIHsweDBEQkYsIDEzfSwgezB4MURCRiwgMTN9LAorezB4MDNCRiwgMTN9LCB7MHgxM0JGLCAxM30sIHsweDBCQkYsIDEzfSwgezB4MUJCRiwgMTN9LAorezB4MDdCRiwgMTN9LCB7MHgxN0JGLCAxM30sIHsweDBGQkYsIDEzfSwgezB4MUZCRiwgMTN9LAorezB4MDA3RiwgMTR9LCB7MHgyMDdGLCAxNH0sIHsweDEwN0YsIDE0fSwgezB4MzA3RiwgMTR9LAorezB4MDg3RiwgMTR9LCB7MHgyODdGLCAxNH0sIHsweDE4N0YsIDE0fSwgezB4Mzg3RiwgMTR9LAorezB4MDQ3RiwgMTR9LCB7MHgyNDdGLCAxNH0sIHsweDE0N0YsIDE0fSwgezB4MDAwMiwgIDN9LAorezB4MDAxMSwgIDV9LCB7MHgwMDA1LCAgNX0sIHsweDAwMTUsICA1fSwgezB4MDAwMywgIDZ9LAorezB4MDAzQiwgIDZ9LCB7MHgwMDQ3LCAgOH0sIHsweDAwQzcsICA4fSwgezB4MDAxNywgIDh9LAorezB4MDBENywgIDh9LCB7MHgwMDc3LCAgOH0sIHsweDAxMEYsICA5fSwgezB4MDA0RiwgIDl9LAorezB4MDFDRiwgIDl9LCB7MHgwMEFGLCAgOX0sIHsweDAxNkYsICA5fSwKKyNlbHNlCisgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAxLCAgM30sIHsweDAwMDMsICAzfSwgezB4MDAxMCwgIDV9LAorICAgIHsweDAwMTIsICA1fSwgezB4MDAxMywgIDV9LCB7MHgwMDE2LCAgNX0sIHsweDAwMTcsICA1fSwKKyAgICB7MHgwMDMxLCAgNn0sIHsweDAwMzIsICA2fSwgezB4MDAzMywgIDZ9LCB7MHgwMDM0LCAgNn0sCisgICAgezB4MDAzNSwgIDZ9LCB7MHgwMDM2LCAgNn0sIHsweDAwRTAsICA4fSwgezB4MDBFMSwgIDh9LAorICAgIHsweDAwRTQsICA4fSwgezB4MDBFNSwgIDh9LCB7MHgwMEU2LCAgOH0sIHsweDAwRTcsICA4fSwKKyAgICB7MHgwMEU5LCAgOH0sIHsweDAwRUEsICA4fSwgezB4MDBFQywgIDh9LCB7MHgwMEVELCAgOH0sCisgICAgezB4MDBFRiwgIDh9LCB7MHgwMUUwLCAgOX0sIHsweDAxRTIsICA5fSwgezB4MDFFMywgIDl9LAorICAgIHsweDAxRTUsICA5fSwgezB4MDFFNiwgIDl9LCB7MHgwMUU4LCAgOX0sIHsweDAxRTksICA5fSwKKyAgICB7MHgwMUVCLCAgOX0sIHsweDAxRUMsICA5fSwgezB4MDFFRSwgIDl9LCB7MHgwMUVGLCAgOX0sCisgICAgezB4MDNFMCwgMTB9LCB7MHgwM0UxLCAxMH0sIHsweDAzRTIsIDEwfSwgezB4MDNFMywgMTB9LAorICAgIHsweDAzRTQsIDEwfSwgezB4MDNFNSwgMTB9LCB7MHgwM0U2LCAxMH0sIHsweDAzRTcsIDEwfSwKKyAgICB7MHgwM0U4LCAxMH0sIHsweDAzRTksIDEwfSwgezB4MDNFQSwgMTB9LCB7MHgwM0VCLCAxMH0sCisgICAgezB4MDNFQywgMTB9LCB7MHgwM0VELCAxMH0sIHsweDAzRUUsIDEwfSwgezB4MDNFRiwgMTB9LAorICAgIHsweDFGODAsIDEzfSwgezB4MUY4MSwgMTN9LCB7MHgxRjgyLCAxM30sIHsweDFGODMsIDEzfSwKKyAgICB7MHgxRjg0LCAxM30sIHsweDFGODUsIDEzfSwgezB4MUY4NiwgMTN9LCB7MHgxRjg3LCAxM30sCisgICAgezB4MUY4OCwgMTN9LCB7MHgxRjg5LCAxM30sIHsweDFGOEEsIDEzfSwgezB4MUY4QiwgMTN9LAorICAgIHsweDFGOEMsIDEzfSwgezB4MUY4RCwgMTN9LCB7MHgxRjhFLCAxM30sIHsweDFGOEYsIDEzfSwKKyAgICB7MHgxRjkwLCAxM30sIHsweDFGOTEsIDEzfSwgezB4MUY5MiwgMTN9LCB7MHgxRjkzLCAxM30sCisgICAgezB4MUY5NCwgMTN9LCB7MHgxRjk1LCAxM30sIHsweDFGOTYsIDEzfSwgezB4MUY5NywgMTN9LAorICAgIHsweDFGOTgsIDEzfSwgezB4MUY5OSwgMTN9LCB7MHgxRjlBLCAxM30sIHsweDFGOUIsIDEzfSwKKyAgICB7MHgxRjlDLCAxM30sIHsweDFGOUQsIDEzfSwgezB4MUY5RSwgMTN9LCB7MHgxRjlGLCAxM30sCisgICAgezB4MUZBMCwgMTN9LCB7MHgxRkExLCAxM30sIHsweDFGQTIsIDEzfSwgezB4MUZBMywgMTN9LAorICAgIHsweDFGQTQsIDEzfSwgezB4MUZBNSwgMTN9LCB7MHgxRkE2LCAxM30sIHsweDFGQTcsIDEzfSwKKyAgICB7MHgxRkE4LCAxM30sIHsweDFGQTksIDEzfSwgezB4MUZBQSwgMTN9LCB7MHgxRkFCLCAxM30sCisgICAgezB4MUZBQywgMTN9LCB7MHgxRkFELCAxM30sIHsweDFGQUUsIDEzfSwgezB4MUZBRiwgMTN9LAorICAgIHsweDFGQjAsIDEzfSwgezB4MUZCMSwgMTN9LCB7MHgxRkIyLCAxM30sIHsweDFGQjMsIDEzfSwKKyAgICB7MHgxRkI0LCAxM30sIHsweDFGQjUsIDEzfSwgezB4MUZCNiwgMTN9LCB7MHgxRkI3LCAxM30sCisgICAgezB4MUZCOCwgMTN9LCB7MHgxRkI5LCAxM30sIHsweDFGQkEsIDEzfSwgezB4MUZCQiwgMTN9LAorICAgIHsweDFGQkMsIDEzfSwgezB4MUZCRCwgMTN9LCB7MHgxRkJFLCAxM30sIHsweDFGQkYsIDEzfSwKKyAgICB7MHgzRjgwLCAxNH0sIHsweDNGODEsIDE0fSwgezB4M0Y4MiwgMTR9LCB7MHgzRjgzLCAxNH0sCisgICAgezB4M0Y4NCwgMTR9LCB7MHgzRjg1LCAxNH0sIHsweDNGODYsIDE0fSwgezB4M0Y4NywgMTR9LAorICAgIHsweDNGODgsIDE0fSwgezB4M0Y4OSwgMTR9LCB7MHgzRjhBLCAxNH0sIHsweDAwMDIsICAzfSwKKyAgICB7MHgwMDExLCAgNX0sIHsweDAwMTQsICA1fSwgezB4MDAxNSwgIDV9LCB7MHgwMDMwLCAgNn0sCisgICAgezB4MDAzNywgIDZ9LCB7MHgwMEUyLCAgOH0sIHsweDAwRTMsICA4fSwgezB4MDBFOCwgIDh9LAorICAgIHsweDAwRUIsICA4fSwgezB4MDBFRSwgIDh9LCB7MHgwMUUxLCAgOX0sIHsweDAxRTQsICA5fSwKKyAgICB7MHgwMUU3LCAgOX0sIHsweDAxRUEsICA5fSwgezB4MDFFRCwgIDl9CisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGlyMl9sdW1hX3RhYmxlWzI1Nl0gPSB7CisgMHg4MCwgMHg4MCwgMHg4NCwgMHg4NCwgMHg3QywgMHg3QywgMHg3RiwgMHg4NSwKKyAweDgxLCAweDdCLCAweDg1LCAweDdGLCAweDdCLCAweDgxLCAweDhDLCAweDhDLAorIDB4NzQsIDB4NzQsIDB4ODMsIDB4OEQsIDB4N0QsIDB4NzMsIDB4OEQsIDB4ODMsCisgMHg3MywgMHg3RCwgMHg3NywgMHg4OSwgMHg4OSwgMHg3NywgMHg4OSwgMHg3NywKKyAweDc3LCAweDg5LCAweDhDLCAweDk1LCAweDc0LCAweDZCLCAweDk1LCAweDhDLAorIDB4NkIsIDB4NzQsIDB4N0MsIDB4OTAsIDB4ODQsIDB4NzAsIDB4OTAsIDB4N0MsCisgMHg3MCwgMHg4NCwgMHg5NiwgMHg5NiwgMHg2QSwgMHg2QSwgMHg4MiwgMHg5OCwKKyAweDdFLCAweDY4LCAweDk4LCAweDgyLCAweDY4LCAweDdFLCAweDk3LCAweEEyLAorIDB4NjksIDB4NUUsIDB4QTIsIDB4OTcsIDB4NUUsIDB4NjksIDB4QTIsIDB4QTIsCisgMHg1RSwgMHg1RSwgMHg4QiwgMHhBMywgMHg3NSwgMHg1RCwgMHhBMywgMHg4QiwKKyAweDVELCAweDc1LCAweDcxLCAweDk1LCAweDhGLCAweDZCLCAweDk1LCAweDcxLAorIDB4NkIsIDB4OEYsIDB4NzgsIDB4OUQsIDB4ODgsIDB4NjMsIDB4OUQsIDB4NzgsCisgMHg2MywgMHg4OCwgMHg3RiwgMHhBNywgMHg4MSwgMHg1OSwgMHhBNywgMHg3RiwKKyAweDU5LCAweDgxLCAweEE0LCAweEIxLCAweDVDLCAweDRGLCAweEIxLCAweEE0LAorIDB4NEYsIDB4NUMsIDB4OTYsIDB4QjEsIDB4NkEsIDB4NEYsIDB4QjEsIDB4OTYsCisgMHg0RiwgMHg2QSwgMHhCMiwgMHhCMiwgMHg0RSwgMHg0RSwgMHg2NSwgMHg5QiwKKyAweDlCLCAweDY1LCAweDlCLCAweDY1LCAweDY1LCAweDlCLCAweDg5LCAweEI0LAorIDB4NzcsIDB4NEMsIDB4QjQsIDB4ODksIDB4NEMsIDB4NzcsIDB4NkEsIDB4QTMsCisgMHg5NiwgMHg1RCwgMHhBMywgMHg2QSwgMHg1RCwgMHg5NiwgMHg3MywgMHhBQywKKyAweDhELCAweDU0LCAweEFDLCAweDczLCAweDU0LCAweDhELCAweEI0LCAweEMzLAorIDB4NEMsIDB4M0QsIDB4QzMsIDB4QjQsIDB4M0QsIDB4NEMsIDB4QTQsIDB4QzMsCisgMHg1QywgMHgzRCwgMHhDMywgMHhBNCwgMHgzRCwgMHg1QywgMHhDNCwgMHhDNCwKKyAweDNDLCAweDNDLCAweDk2LCAweEM2LCAweDZBLCAweDNBLCAweEM2LCAweDk2LAorIDB4M0EsIDB4NkEsIDB4N0MsIDB4QkEsIDB4ODQsIDB4NDYsIDB4QkEsIDB4N0MsCisgMHg0NiwgMHg4NCwgMHg1QiwgMHhBQiwgMHhBNSwgMHg1NSwgMHhBQiwgMHg1QiwKKyAweDU1LCAweEE1LCAweDYzLCAweEI0LCAweDlELCAweDRDLCAweEI0LCAweDYzLAorIDB4NEMsIDB4OUQsIDB4ODYsIDB4Q0EsIDB4N0EsIDB4MzYsIDB4Q0EsIDB4ODYsCisgMHgzNiwgMHg3QSwgMHhCNiwgMHhENywgMHg0QSwgMHgyOSwgMHhENywgMHhCNiwKKyAweDI5LCAweDRBLCAweEM4LCAweEQ3LCAweDM4LCAweDI5LCAweEQ3LCAweEM4LAorIDB4MjksIDB4MzgsIDB4QTQsIDB4RDgsIDB4NUMsIDB4MjgsIDB4RDgsIDB4QTQsCisgMHgyOCwgMHg1QywgMHg2QywgMHhDMSwgMHg5NCwgMHgzRiwgMHhDMSwgMHg2QywKKyAweDNGLCAweDk0LCAweEQ5LCAweEQ5LCAweDI3LCAweDI3LCAweDgwLCAweDgwCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19JTkRFTzJEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2luZGVvMy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW5kZW8zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4NzY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2luZGVvMy5jCkBAIC0wLDAgKzEsMTE0NCBAQAorLyoKKyAqIEluZGVvIFZpZGVvIHYzIGNvbXBhdGlibGUgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IC0gMjAxMSBNYXhpbSBQb2xpYWtvdnNraQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUaGlzIGlzIGEgZGVjb2RlciBmb3IgSW50ZWwgSW5kZW8gVmlkZW8gdjMuCisgKiBJdCBpcyBiYXNlZCBvbiB2ZWN0b3IgcXVhbnRpemF0aW9uLCBydW4tbGVuZ3RoIGNvZGluZyBhbmQgbW90aW9uIGNvbXBlbnNhdGlvbi4KKyAqIEtub3duIGNvbnRhaW5lciBmb3JtYXRzOiAuYXZpIGFuZCAubW92CisgKiBLbm93biBGT1VSQ0NzOiAnSVYzMScsICdJVjMyJworICoKKyAqIEBzZWUgaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9SW5kZW9fMworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImNvcHlfYmxvY2suaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJocGVsZHNwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgImluZGVvM2RhdGEuaCIKKworLyogUkxFIG9wY29kZXMuICovCitlbnVtIHsKKyAgICBSTEVfRVNDX0Y5ICAgID0gMjQ5LCAvLy88IHNhbWUgYXMgUkxFX0VTQ19GQSArIGRvIHRoZSBzYW1lIHdpdGggbmV4dCBibG9jaworICAgIFJMRV9FU0NfRkEgICAgPSAyNTAsIC8vLzwgSU5UUkE6IHNraXAgYmxvY2ssIElOVEVSOiBjb3B5IGRhdGEgZnJvbSByZWZlcmVuY2UKKyAgICBSTEVfRVNDX0ZCICAgID0gMjUxLCAvLy88IGFwcGx5IG51bGwgZGVsdGEgdG8gTiBibG9ja3MgLyBza2lwIE4gYmxvY2tzCisgICAgUkxFX0VTQ19GQyAgICA9IDI1MiwgLy8vPCBzYW1lIGFzIFJMRV9FU0NfRkQgKyBkbyB0aGUgc2FtZSB3aXRoIG5leHQgYmxvY2sKKyAgICBSTEVfRVNDX0ZEICAgID0gMjUzLCAvLy88IGFwcGx5IG51bGwgZGVsdGEgdG8gYWxsIHJlbWFpbmluZyBsaW5lcyBvZiB0aGlzIGJsb2NrCisgICAgUkxFX0VTQ19GRSAgICA9IDI1NCwgLy8vPCBhcHBseSBudWxsIGRlbHRhIHRvIGFsbCBsaW5lcyB1cCB0byB0aGUgM3JkIGxpbmUKKyAgICBSTEVfRVNDX0ZGICAgID0gMjU1ICAvLy88IGFwcGx5IG51bGwgZGVsdGEgdG8gYWxsIGxpbmVzIHVwIHRvIHRoZSAybmQgbGluZQorfTsKKworCisvKiBTb21lIGNvbnN0YW50cyBmb3IgcGFyc2luZyBmcmFtZSBiaXRzdHJlYW0gZmxhZ3MuICovCisjZGVmaW5lIEJTXzhCSVRfUEVMICAgICAoMSA8PCAxKSAvLy88IDhiaXQgcGl4ZWwgYml0ZGVwdGggaW5kaWNhdG9yCisjZGVmaW5lIEJTX0tFWUZSQU1FICAgICAoMSA8PCAyKSAvLy88IGludHJhIGZyYW1lIGluZGljYXRvcgorI2RlZmluZSBCU19NVl9ZX0hBTEYgICAgKDEgPDwgNCkgLy8vPCB2ZXJ0aWNhbCBtdiBoYWxmcGVsIHJlc29sdXRpb24gaW5kaWNhdG9yCisjZGVmaW5lIEJTX01WX1hfSEFMRiAgICAoMSA8PCA1KSAvLy88IGhvcml6b250YWwgbXYgaGFsZnBlbCByZXNvbHV0aW9uIGluZGljYXRvcgorI2RlZmluZSBCU19OT05SRUYgICAgICAgKDEgPDwgOCkgLy8vPCBub25yZWYgKGRpc2NhcmRhYmxlKSBmcmFtZSBpbmRpY2F0b3IKKyNkZWZpbmUgQlNfQlVGRkVSICAgICAgICA5ICAgICAgIC8vLzwgaW5kaWNhdGVzIHdoaWNoIG9mIHR3byBmcmFtZSBidWZmZXJzIHNob3VsZCBiZSB1c2VkCisKKwordHlwZWRlZiBzdHJ1Y3QgUGxhbmUgeworICAgIHVpbnQ4X3QgICAgICAgICAqYnVmZmVyc1syXTsKKyAgICB1aW50OF90ICAgICAgICAgKnBpeGVsc1syXTsgLy8vPCBwb2ludGVyIHRvIHRoZSBhY3R1YWwgcGl4ZWwgZGF0YSBvZiB0aGUgYnVmZmVycyBhYm92ZQorICAgIHVpbnQzMl90ICAgICAgICB3aWR0aDsKKyAgICB1aW50MzJfdCAgICAgICAgaGVpZ2h0OworICAgIHVpbnQzMl90ICAgICAgICBwaXRjaDsKK30gUGxhbmU7CisKKyNkZWZpbmUgQ0VMTF9TVEFDS19NQVggIDIwCisKK3R5cGVkZWYgc3RydWN0IENlbGwgeworICAgIGludDE2X3QgICAgICAgICB4cG9zOyAgICAgICAvLy88IGNlbGwgY29vcmRpbmF0ZXMgaW4gNHg0IGJsb2NrcworICAgIGludDE2X3QgICAgICAgICB5cG9zOworICAgIGludDE2X3QgICAgICAgICB3aWR0aDsgICAgICAvLy88IGNlbGwgd2lkdGggIGluIDR4NCBibG9ja3MKKyAgICBpbnQxNl90ICAgICAgICAgaGVpZ2h0OyAgICAgLy8vPCBjZWxsIGhlaWdodCBpbiA0eDQgYmxvY2tzCisgICAgdWludDhfdCAgICAgICAgIHRyZWU7ICAgICAgIC8vLzwgdHJlZSBpZDogMC0gTUMgdHJlZSwgMSAtIFZRIHRyZWUKKyAgICBjb25zdCBpbnQ4X3QgICAgKm12X3B0cjsgICAgLy8vPCBwdHIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgaWYgYW55Cit9IENlbGw7CisKK3R5cGVkZWYgc3RydWN0IEluZGVvM0RlY29kZUNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBIcGVsRFNQQ29udGV4dCAgaGRzcDsKKworICAgIEdldEJpdENvbnRleHQgICBnYjsKKyAgICBpbnQgICAgICAgICAgICAgbmVlZF9yZXN5bmM7CisgICAgaW50ICAgICAgICAgICAgIHNraXBfYml0czsKKyAgICBjb25zdCB1aW50OF90ICAgKm5leHRfY2VsbF9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgICAqbGFzdF9ieXRlOworICAgIGNvbnN0IGludDhfdCAgICAqbWNfdmVjdG9yczsKKyAgICB1bnNpZ25lZCAgICAgICAgbnVtX3ZlY3RvcnM7ICAgIC8vLzwgbnVtYmVyIG9mIG1vdGlvbiB2ZWN0b3JzIGluIG1jX3ZlY3RvcnMKKworICAgIGludDE2X3QgICAgICAgICB3aWR0aCwgaGVpZ2h0OworICAgIHVpbnQzMl90ICAgICAgICBmcmFtZV9udW07ICAgICAgLy8vPCBjdXJyZW50IGZyYW1lIG51bWJlciAoemVyby1iYXNlZCkKKyAgICB1aW50MzJfdCAgICAgICAgZGF0YV9zaXplOyAgICAgIC8vLzwgc2l6ZSBvZiB0aGUgZnJhbWUgZGF0YSBpbiBieXRlcworICAgIHVpbnQxNl90ICAgICAgICBmcmFtZV9mbGFnczsgICAgLy8vPCBmcmFtZSBwcm9wZXJ0aWVzCisgICAgdWludDhfdCAgICAgICAgIGNiX29mZnNldDsgICAgICAvLy88IG5lZWRlZCBmb3Igc2VsZWN0aW5nIFZRIHRhYmxlcworICAgIHVpbnQ4X3QgICAgICAgICBidWZfc2VsOyAgICAgICAgLy8vPCBhY3RpdmUgZnJhbWUgYnVmZmVyOiAwIC0gcHJpbWFyeSwgMSAtc2Vjb25kYXJ5CisgICAgY29uc3QgdWludDhfdCAgICp5X2RhdGFfcHRyOworICAgIGNvbnN0IHVpbnQ4X3QgICAqdl9kYXRhX3B0cjsKKyAgICBjb25zdCB1aW50OF90ICAgKnVfZGF0YV9wdHI7CisgICAgaW50MzJfdCAgICAgICAgIHlfZGF0YV9zaXplOworICAgIGludDMyX3QgICAgICAgICB2X2RhdGFfc2l6ZTsKKyAgICBpbnQzMl90ICAgICAgICAgdV9kYXRhX3NpemU7CisgICAgY29uc3QgdWludDhfdCAgICphbHRfcXVhbnQ7ICAgICAvLy88IHNlY29uZGFyeSBWUSB0YWJsZSBzZXQgZm9yIHRoZSBtb2RlcyAxIGFuZCA0CisgICAgUGxhbmUgICAgICAgICAgIHBsYW5lc1szXTsKK30gSW5kZW8zRGVjb2RlQ29udGV4dDsKKworCitzdGF0aWMgdWludDhfdCByZXF1YW50X3RhYls4XVsxMjhdOworCisvKgorICogIEJ1aWxkIHRoZSBzdGF0aWMgcmVxdWFudGl6YXRpb24gdGFibGUuCisgKiAgVGhpcyB0YWJsZSBpcyB1c2VkIHRvIHJlbWFwIHBpeGVsIHZhbHVlcyBhY2NvcmRpbmcgdG8gYSBzcGVjaWZpYworICogIHF1YW50IGluZGV4IGFuZCB0aHVzIGF2b2lkIG92ZXJmbG93cyB3aGlsZSBhZGRpbmcgZGVsdGFzLgorICovCitzdGF0aWMgYXZfY29sZCB2b2lkIGJ1aWxkX3JlcXVhbnRfdGFiKHZvaWQpCit7CisgICAgc3RhdGljIGNvbnN0IGludDhfdCBvZmZzZXRzWzhdID0geyAxLCAxLCAyLCAtMywgLTMsIDMsIDQsIDQgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50OF90IGRlbHRhcyBbOF0gPSB7IDAsIDEsIDAsICA0LCAgNCwgMSwgMCwgMSB9OworCisgICAgaW50IGksIGosIHN0ZXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIHN0ZXAgPSBpICsgMjsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDEyODsgaisrKQorICAgICAgICAgICAgICAgIHJlcXVhbnRfdGFiW2ldW2pdID0gKGogKyBvZmZzZXRzW2ldKSAvIHN0ZXAgKiBzdGVwICsgZGVsdGFzW2ldOworICAgIH0KKworICAgIC8qIHNvbWUgbGFzdCBlbGVtZW50cyBjYWxjdWxhdGVkIGFib3ZlIHdpbGwgaGF2ZSB2YWx1ZXMgPj0gMTI4ICovCisgICAgLyogcGl4ZWwgdmFsdWVzIHNoYWxsIG5ldmVyIGV4Y2VlZCAxMjcgc28gc2V0IHRoZW0gdG8gbm9uLW92ZXJmbG93aW5nIHZhbHVlcyAqLworICAgIC8qIGFjY29yZGluZyB3aXRoIHRoZSBxdWFudGl6YXRpb24gc3RlcCBvZiB0aGUgcmVzcGVjdGl2ZSBzZWN0aW9uICovCisgICAgcmVxdWFudF90YWJbMF1bMTI3XSA9IDEyNjsKKyAgICByZXF1YW50X3RhYlsxXVsxMTldID0gMTE4OworICAgIHJlcXVhbnRfdGFiWzFdWzEyMF0gPSAxMTg7CisgICAgcmVxdWFudF90YWJbMl1bMTI2XSA9IDEyNDsKKyAgICByZXF1YW50X3RhYlsyXVsxMjddID0gMTI0OworICAgIHJlcXVhbnRfdGFiWzZdWzEyNF0gPSAxMjA7CisgICAgcmVxdWFudF90YWJbNl1bMTI1XSA9IDEyMDsKKyAgICByZXF1YW50X3RhYls2XVsxMjZdID0gMTIwOworICAgIHJlcXVhbnRfdGFiWzZdWzEyN10gPSAxMjA7CisKKyAgICAvKiBQYXRjaCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBJbnRlbCdzIGJpbmFyeSBkZWNvZGVycyAqLworICAgIHJlcXVhbnRfdGFiWzFdWzddID0gMTA7CisgICAgcmVxdWFudF90YWJbNF1bOF0gPSAxMDsKK30KKworCitzdGF0aWMgYXZfY29sZCB2b2lkIGZyZWVfZnJhbWVfYnVmZmVycyhJbmRlbzNEZWNvZGVDb250ZXh0ICpjdHgpCit7CisgICAgaW50IHA7CisKKyAgICBjdHgtPndpZHRoID0gY3R4LT5oZWlnaHQgPSAwOworCisgICAgZm9yIChwID0gMDsgcCA8IDM7IHArKykgeworICAgICAgICBhdl9mcmVlcCgmY3R4LT5wbGFuZXNbcF0uYnVmZmVyc1swXSk7CisgICAgICAgIGF2X2ZyZWVwKCZjdHgtPnBsYW5lc1twXS5idWZmZXJzWzFdKTsKKyAgICAgICAgY3R4LT5wbGFuZXNbcF0ucGl4ZWxzWzBdID0gY3R4LT5wbGFuZXNbcF0ucGl4ZWxzWzFdID0gMDsKKyAgICB9Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IGFsbG9jYXRlX2ZyYW1lX2J1ZmZlcnMoSW5kZW8zRGVjb2RlQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgbHVtYV93aWR0aCwgaW50IGx1bWFfaGVpZ2h0KQoreworICAgIGludCBwLCBjaHJvbWFfd2lkdGgsIGNocm9tYV9oZWlnaHQ7CisgICAgaW50IGx1bWFfcGl0Y2gsIGNocm9tYV9waXRjaCwgbHVtYV9zaXplLCBjaHJvbWFfc2l6ZTsKKworICAgIGlmIChsdW1hX3dpZHRoICA8IDE2IHx8IGx1bWFfd2lkdGggID4gNjQwIHx8CisgICAgICAgIGx1bWFfaGVpZ2h0IDwgMTYgfHwgbHVtYV9oZWlnaHQgPiA0ODAgfHwKKyAgICAgICAgbHVtYV93aWR0aCAgJiAgMyB8fCBsdW1hX2hlaWdodCAmICAgMykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGljdHVyZSBkaW1lbnNpb25zOiAlZCB4ICVkIVxuIiwKKyAgICAgICAgICAgICAgIGx1bWFfd2lkdGgsIGx1bWFfaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3R4LT53aWR0aCAgPSBsdW1hX3dpZHRoIDsKKyAgICBjdHgtPmhlaWdodCA9IGx1bWFfaGVpZ2h0OworCisgICAgY2hyb21hX3dpZHRoICA9IEZGQUxJR04obHVtYV93aWR0aCAgPj4gMiwgNCk7CisgICAgY2hyb21hX2hlaWdodCA9IEZGQUxJR04obHVtYV9oZWlnaHQgPj4gMiwgNCk7CisKKyAgICBsdW1hX3BpdGNoICAgPSBGRkFMSUdOKGx1bWFfd2lkdGgsICAgMTYpOworICAgIGNocm9tYV9waXRjaCA9IEZGQUxJR04oY2hyb21hX3dpZHRoLCAxNik7CisKKyAgICAvKiBDYWxjdWxhdGUgc2l6ZSBvZiB0aGUgbHVtaW5hbmNlIHBsYW5lLiAgKi8KKyAgICAvKiBBZGQgb25lIGxpbmUgbW9yZSBmb3IgSU5UUkEgcHJlZGljdGlvbi4gKi8KKyAgICBsdW1hX3NpemUgPSBsdW1hX3BpdGNoICogKGx1bWFfaGVpZ2h0ICsgMSk7CisKKyAgICAvKiBDYWxjdWxhdGUgc2l6ZSBvZiBhIGNocm9taW5hbmNlIHBsYW5lcy4gKi8KKyAgICAvKiBBZGQgb25lIGxpbmUgbW9yZSBmb3IgSU5UUkEgcHJlZGljdGlvbi4gKi8KKyAgICBjaHJvbWFfc2l6ZSA9IGNocm9tYV9waXRjaCAqIChjaHJvbWFfaGVpZ2h0ICsgMSk7CisKKyAgICAvKiBhbGxvY2F0ZSBmcmFtZSBidWZmZXJzICovCisgICAgZm9yIChwID0gMDsgcCA8IDM7IHArKykgeworICAgICAgICBjdHgtPnBsYW5lc1twXS5waXRjaCAgPSAhcCA/IGx1bWFfcGl0Y2ggIDogY2hyb21hX3BpdGNoOworICAgICAgICBjdHgtPnBsYW5lc1twXS53aWR0aCAgPSAhcCA/IGx1bWFfd2lkdGggIDogY2hyb21hX3dpZHRoOworICAgICAgICBjdHgtPnBsYW5lc1twXS5oZWlnaHQgPSAhcCA/IGx1bWFfaGVpZ2h0IDogY2hyb21hX2hlaWdodDsKKworICAgICAgICBjdHgtPnBsYW5lc1twXS5idWZmZXJzWzBdID0gYXZfbWFsbG9jKCFwID8gbHVtYV9zaXplIDogY2hyb21hX3NpemUpOworICAgICAgICBjdHgtPnBsYW5lc1twXS5idWZmZXJzWzFdID0gYXZfbWFsbG9jKCFwID8gbHVtYV9zaXplIDogY2hyb21hX3NpemUpOworCisgICAgICAgIGlmICghY3R4LT5wbGFuZXNbcF0uYnVmZmVyc1swXSB8fCAhY3R4LT5wbGFuZXNbcF0uYnVmZmVyc1sxXSkgeworICAgICAgICAgICAgZnJlZV9mcmFtZV9idWZmZXJzKGN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgLyogZmlsbCB0aGUgSU5UUkEgcHJlZGljdGlvbiBsaW5lcyB3aXRoIHRoZSBtaWRkbGUgcGl4ZWwgdmFsdWUgPSA2NCAqLworICAgICAgICBtZW1zZXQoY3R4LT5wbGFuZXNbcF0uYnVmZmVyc1swXSwgMHg0MCwgY3R4LT5wbGFuZXNbcF0ucGl0Y2gpOworICAgICAgICBtZW1zZXQoY3R4LT5wbGFuZXNbcF0uYnVmZmVyc1sxXSwgMHg0MCwgY3R4LT5wbGFuZXNbcF0ucGl0Y2gpOworCisgICAgICAgIC8qIHNldCBidWZmZXIgcG9pbnRlcnMgPSBidWZfcHRyICsgcGl0Y2ggYW5kIHRodXMgc2tpcCB0aGUgSU5UUkEgcHJlZGljdGlvbiBsaW5lICovCisgICAgICAgIGN0eC0+cGxhbmVzW3BdLnBpeGVsc1swXSA9IGN0eC0+cGxhbmVzW3BdLmJ1ZmZlcnNbMF0gKyBjdHgtPnBsYW5lc1twXS5waXRjaDsKKyAgICAgICAgY3R4LT5wbGFuZXNbcF0ucGl4ZWxzWzFdID0gY3R4LT5wbGFuZXNbcF0uYnVmZmVyc1sxXSArIGN0eC0+cGxhbmVzW3BdLnBpdGNoOworICAgICAgICBtZW1zZXQoY3R4LT5wbGFuZXNbcF0ucGl4ZWxzWzBdLCAwLCBjdHgtPnBsYW5lc1twXS5waXRjaCAqIGN0eC0+cGxhbmVzW3BdLmhlaWdodCk7CisgICAgICAgIG1lbXNldChjdHgtPnBsYW5lc1twXS5waXhlbHNbMV0sIDAsIGN0eC0+cGxhbmVzW3BdLnBpdGNoICogY3R4LT5wbGFuZXNbcF0uaGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiAgQ29weSBwaXhlbHMgb2YgdGhlIGNlbGwoeCArIG12X3gsIHkgKyBtdl95KSBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZSBpbnRvCisgKiAgdGhlIGNlbGwoeCwgeSkgaW4gdGhlIGN1cnJlbnQgZnJhbWUuCisgKgorICogIEBwYXJhbSBjdHggICAgICBwb2ludGVyIHRvIHRoZSBkZWNvZGVyIGNvbnRleHQKKyAqICBAcGFyYW0gcGxhbmUgICAgcG9pbnRlciB0byB0aGUgcGxhbmUgZGVzY3JpcHRvcgorICogIEBwYXJhbSBjZWxsICAgICBwb2ludGVyIHRvIHRoZSBjZWxsICBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyBpbnQgY29weV9jZWxsKEluZGVvM0RlY29kZUNvbnRleHQgKmN0eCwgUGxhbmUgKnBsYW5lLCBDZWxsICpjZWxsKQoreworICAgIGludCAgICAgaCwgdywgbXZfeCwgbXZfeSwgb2Zmc2V0LCBvZmZzZXRfZHN0OworICAgIHVpbnQ4X3QgKnNyYywgKmRzdDsKKworICAgIC8qIHNldHVwIG91dHB1dCBhbmQgcmVmZXJlbmNlIHBvaW50ZXJzICovCisgICAgb2Zmc2V0X2RzdCAgPSAoY2VsbC0+eXBvcyA8PCAyKSAqIHBsYW5lLT5waXRjaCArIChjZWxsLT54cG9zIDw8IDIpOworICAgIGRzdCAgICAgICAgID0gcGxhbmUtPnBpeGVsc1tjdHgtPmJ1Zl9zZWxdICsgb2Zmc2V0X2RzdDsKKyAgICBpZihjZWxsLT5tdl9wdHIpeworICAgIG12X3kgICAgICAgID0gY2VsbC0+bXZfcHRyWzBdOworICAgIG12X3ggICAgICAgID0gY2VsbC0+bXZfcHRyWzFdOworICAgIH1lbHNlCisgICAgICAgIG12X3g9IG12X3k9IDA7CisKKyAgICAvKiAtMSBiZWNhdXNlIHRoZXJlIGlzIGFuIGV4dHJhIGxpbmUgb24gdG9wIGZvciBwcmVkaWN0aW9uICovCisgICAgaWYgKChjZWxsLT55cG9zIDw8IDIpICsgbXZfeSA8IC0xIHx8IChjZWxsLT54cG9zIDw8IDIpICsgbXZfeCA8IDAgfHwKKyAgICAgICAgKChjZWxsLT55cG9zICsgY2VsbC0+aGVpZ2h0KSA8PCAyKSArIG12X3kgPiBwbGFuZS0+aGVpZ2h0ICAgICB8fAorICAgICAgICAoKGNlbGwtPnhwb3MgKyBjZWxsLT53aWR0aCkgIDw8IDIpICsgbXZfeCA+IHBsYW5lLT53aWR0aCkgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk1vdGlvbiB2ZWN0b3JzIHBvaW50IG91dCBvZiB0aGUgZnJhbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgb2Zmc2V0ICAgICAgPSBvZmZzZXRfZHN0ICsgbXZfeSAqIHBsYW5lLT5waXRjaCArIG12X3g7CisgICAgc3JjICAgICAgICAgPSBwbGFuZS0+cGl4ZWxzW2N0eC0+YnVmX3NlbCBeIDFdICsgb2Zmc2V0OworCisgICAgaCA9IGNlbGwtPmhlaWdodCA8PCAyOworCisgICAgZm9yICh3ID0gY2VsbC0+d2lkdGg7IHcgPiAwOykgeworICAgICAgICAvKiBjb3B5IHVzaW5nIDE2eEggYmxvY2tzICovCisgICAgICAgIGlmICghKChjZWxsLT54cG9zIDw8IDIpICYgMTUpICYmIHcgPj0gNCkgeworICAgICAgICAgICAgZm9yICg7IHcgPj0gNDsgc3JjICs9IDE2LCBkc3QgKz0gMTYsIHcgLT0gNCkKKyAgICAgICAgICAgICAgICBjdHgtPmhkc3AucHV0X3BpeGVsc190YWJbMF1bMF0oZHN0LCBzcmMsIHBsYW5lLT5waXRjaCwgaCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBjb3B5IHVzaW5nIDh4SCBibG9ja3MgKi8KKyAgICAgICAgaWYgKCEoKGNlbGwtPnhwb3MgPDwgMikgJiA3KSAmJiB3ID49IDIpIHsKKyAgICAgICAgICAgIGN0eC0+aGRzcC5wdXRfcGl4ZWxzX3RhYlsxXVswXShkc3QsIHNyYywgcGxhbmUtPnBpdGNoLCBoKTsKKyAgICAgICAgICAgIHcgLT0gMjsKKyAgICAgICAgICAgIHNyYyArPSA4OworICAgICAgICAgICAgZHN0ICs9IDg7CisgICAgICAgIH0gZWxzZSBpZiAodyA+PSAxKSB7CisgICAgICAgICAgICBjdHgtPmhkc3AucHV0X3BpeGVsc190YWJbMl1bMF0oZHN0LCBzcmMsIHBsYW5lLT5waXRjaCwgaCk7CisgICAgICAgICAgICB3LS07CisgICAgICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgICAgIGRzdCArPSA0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogQXZlcmFnZSA0LzggcGl4ZWxzIGF0IG9uY2Ugd2l0aG91dCByb3VuZGluZyB1c2luZyBTV0FSICovCisjZGVmaW5lIEFWR18zMihkc3QsIHNyYywgcmVmKSBcCisgICAgQVZfV04zMkEoZHN0LCAoKEFWX1JOMzIoc3JjKSArIEFWX1JOMzIocmVmKSkgPj4gMSkgJiAweDdGN0Y3RjdGVUwpCisKKyNkZWZpbmUgQVZHXzY0KGRzdCwgc3JjLCByZWYpIFwKKyAgICBBVl9XTjY0QShkc3QsICgoQVZfUk42NChzcmMpICsgQVZfUk42NChyZWYpKSA+PiAxKSAmIDB4N0Y3RjdGN0Y3RjdGN0Y3RlVMTCkKKworCisvKgorICogIFJlcGxpY2F0ZSBlYWNoIGV2ZW4gcGl4ZWwgYXMgZm9sbG93czoKKyAqICBBQkNERUZHSCAtPiBBQUNDRUVHRworICovCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IHJlcGxpY2F0ZTY0KHVpbnQ2NF90IGEpIHsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIGEgJj0gMHhGRjAwRkYwMEZGMDBGRjAwVUxMOworICAgIGEgfD0gYSA+PiA4OworI2Vsc2UKKyAgICBhICY9IDB4MDBGRjAwRkYwMEZGMDBGRlVMTDsKKyAgICBhIHw9IGEgPDwgODsKKyNlbmRpZgorICAgIHJldHVybiBhOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHJlcGxpY2F0ZTMyKHVpbnQzMl90IGEpIHsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIGEgJj0gMHhGRjAwRkYwMFVMOworICAgIGEgfD0gYSA+PiA4OworI2Vsc2UKKyAgICBhICY9IDB4MDBGRjAwRkZVTDsKKyAgICBhIHw9IGEgPDwgODsKKyNlbmRpZgorICAgIHJldHVybiBhOworfQorCisKKy8qIEZpbGwgbiBsaW5lcyB3aXRoIDY0Yml0IHBpeGVsIHZhbHVlIHBpeCAqLworc3RhdGljIGlubGluZSB2b2lkIGZpbGxfNjQodWludDhfdCAqZHN0LCBjb25zdCB1aW50NjRfdCBwaXgsIGludDMyX3QgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93X29mZnNldCkKK3sKKyAgICBmb3IgKDsgbiA+IDA7IGRzdCArPSByb3dfb2Zmc2V0LCBuLS0pCisgICAgICAgIEFWX1dONjRBKGRzdCwgcGl4KTsKK30KKworCisvKiBFcnJvciBjb2RlcyBmb3IgY2VsbCBkZWNvZGluZy4gKi8KK2VudW0geworICAgIElWM19OT0VSUiAgICAgICA9IDAsCisgICAgSVYzX0JBRF9STEUgICAgID0gMSwKKyAgICBJVjNfQkFEX0RBVEEgICAgPSAyLAorICAgIElWM19CQURfQ09VTlRFUiA9IDMsCisgICAgSVYzX1VOU1VQUE9SVEVEID0gNCwKKyAgICBJVjNfT1VUX09GX0RBVEEgPSA1Cit9OworCisKKyNkZWZpbmUgQlVGRkVSX1BSRUNIRUNLIFwKK2lmICgqZGF0YV9wdHIgPj0gbGFzdF9wdHIpIFwKKyAgICByZXR1cm4gSVYzX09VVF9PRl9EQVRBOyBcCisKKyNkZWZpbmUgUkxFX0JMT0NLX0NPUFkgXAorICAgIGlmIChjZWxsLT5tdl9wdHIgfHwgIXNraXBfZmxhZykgXAorICAgICAgICBjb3B5X2Jsb2NrNChkc3QsIHJlZiwgcm93X29mZnNldCwgcm93X29mZnNldCwgNCA8PCB2X3pvb20pCisKKyNkZWZpbmUgUkxFX0JMT0NLX0NPUFlfOCBcCisgICAgcGl4NjQgPSBBVl9STjY0KHJlZik7XAorICAgIGlmIChpc19maXJzdF9yb3cpIHsvKiBzcGVjaWFsIHByZWRpY3Rpb24gY2FzZTogdG9wIGxpbmUgb2YgYSBjZWxsICovXAorICAgICAgICBwaXg2NCA9IHJlcGxpY2F0ZTY0KHBpeDY0KTtcCisgICAgICAgIGZpbGxfNjQoZHN0ICsgcm93X29mZnNldCwgcGl4NjQsIDcsIHJvd19vZmZzZXQpO1wKKyAgICAgICAgQVZHXzY0KGRzdCwgcmVmLCBkc3QgKyByb3dfb2Zmc2V0KTtcCisgICAgfSBlbHNlIFwKKyAgICAgICAgZmlsbF82NChkc3QsIHBpeDY0LCA4LCByb3dfb2Zmc2V0KQorCisjZGVmaW5lIFJMRV9MSU5FU19DT1BZIFwKKyAgICBjb3B5X2Jsb2NrNChkc3QsIHJlZiwgcm93X29mZnNldCwgcm93X29mZnNldCwgbnVtX2xpbmVzIDw8IHZfem9vbSkKKworI2RlZmluZSBSTEVfTElORVNfQ09QWV9NMTAgXAorICAgIHBpeDY0ID0gQVZfUk42NChyZWYpO1wKKyAgICBpZiAoaXNfdG9wX29mX2NlbGwpIHtcCisgICAgICAgIHBpeDY0ID0gcmVwbGljYXRlNjQocGl4NjQpO1wKKyAgICAgICAgZmlsbF82NChkc3QgKyByb3dfb2Zmc2V0LCBwaXg2NCwgKG51bV9saW5lcyA8PCAxKSAtIDEsIHJvd19vZmZzZXQpO1wKKyAgICAgICAgQVZHXzY0KGRzdCwgcmVmLCBkc3QgKyByb3dfb2Zmc2V0KTtcCisgICAgfSBlbHNlIFwKKyAgICAgICAgZmlsbF82NChkc3QsIHBpeDY0LCBudW1fbGluZXMgPDwgMSwgcm93X29mZnNldCkKKworI2RlZmluZSBBUFBMWV9ERUxUQV80IFwKKyAgICBBVl9XTjE2QShkc3QgKyBsaW5lX29mZnNldCAgICAsXAorICAgICAgICAgICAgIChBVl9STjE2KHJlZiAgICApICsgZGVsdGFfdGFiLT5kZWx0YXNbZHlhZDFdKSAmIDB4N0Y3Rik7XAorICAgIEFWX1dOMTZBKGRzdCArIGxpbmVfb2Zmc2V0ICsgMixcCisgICAgICAgICAgICAgKEFWX1JOMTYocmVmICsgMikgKyBkZWx0YV90YWItPmRlbHRhc1tkeWFkMl0pICYgMHg3RjdGKTtcCisgICAgaWYgKG1vZGUgPj0gMykge1wKKyAgICAgICAgaWYgKGlzX3RvcF9vZl9jZWxsICYmICFjZWxsLT55cG9zKSB7XAorICAgICAgICAgICAgQVZfQ09QWTMyVShkc3QsIGRzdCArIHJvd19vZmZzZXQpO1wKKyAgICAgICAgfSBlbHNlIHtcCisgICAgICAgICAgICBBVkdfMzIoZHN0LCByZWYsIGRzdCArIHJvd19vZmZzZXQpO1wKKyAgICAgICAgfVwKKyAgICB9CisKKyNkZWZpbmUgQVBQTFlfREVMVEFfOCBcCisgICAgLyogYXBwbHkgdHdvIDMyLWJpdCBWUSBkZWx0YXMgdG8gbmV4dCBldmVuIGxpbmUgKi9cCisgICAgaWYgKGlzX3RvcF9vZl9jZWxsKSB7IFwKKyAgICAgICAgQVZfV04zMkEoZHN0ICsgcm93X29mZnNldCAgICAsIFwKKyAgICAgICAgICAgICAgICAgKHJlcGxpY2F0ZTMyKEFWX1JOMzIocmVmICAgICkpICsgZGVsdGFfdGFiLT5kZWx0YXNfbTEwW2R5YWQxXSkgJiAweDdGN0Y3RjdGKTtcCisgICAgICAgIEFWX1dOMzJBKGRzdCArIHJvd19vZmZzZXQgKyA0LCBcCisgICAgICAgICAgICAgICAgIChyZXBsaWNhdGUzMihBVl9STjMyKHJlZiArIDQpKSArIGRlbHRhX3RhYi0+ZGVsdGFzX20xMFtkeWFkMl0pICYgMHg3RjdGN0Y3Rik7XAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgQVZfV04zMkEoZHN0ICsgcm93X29mZnNldCAgICAsIFwKKyAgICAgICAgICAgICAgICAgKEFWX1JOMzIocmVmICAgICkgKyBkZWx0YV90YWItPmRlbHRhc19tMTBbZHlhZDFdKSAmIDB4N0Y3RjdGN0YpO1wKKyAgICAgICAgQVZfV04zMkEoZHN0ICsgcm93X29mZnNldCArIDQsIFwKKyAgICAgICAgICAgICAgICAgKEFWX1JOMzIocmVmICsgNCkgKyBkZWx0YV90YWItPmRlbHRhc19tMTBbZHlhZDJdKSAmIDB4N0Y3RjdGN0YpO1wKKyAgICB9IFwKKyAgICAvKiBvZGQgbGluZXMgYXJlIG5vdCBjb2RlZCBidXQgcmF0aGVyIGludGVycG9sYXRlZC9yZXBsaWNhdGVkICovXAorICAgIC8qIGZpcnN0IGxpbmUgb2YgdGhlIGNlbGwgb24gdGhlIHRvcCBvZiBpbWFnZT8gLSByZXBsaWNhdGUgKi9cCisgICAgLyogb3RoZXJ3aXNlIC0gaW50ZXJwb2xhdGUgKi9cCisgICAgaWYgKGlzX3RvcF9vZl9jZWxsICYmICFjZWxsLT55cG9zKSB7XAorICAgICAgICBBVl9DT1BZNjRVKGRzdCwgZHN0ICsgcm93X29mZnNldCk7XAorICAgIH0gZWxzZSBcCisgICAgICAgIEFWR182NChkc3QsIHJlZiwgZHN0ICsgcm93X29mZnNldCk7CisKKworI2RlZmluZSBBUFBMWV9ERUxUQV8xMDExX0lOVEVSIFwKKyAgICBpZiAobW9kZSA9PSAxMCkgeyBcCisgICAgICAgIEFWX1dOMzJBKGRzdCAgICAgICAgICAgICAgICAgLCBcCisgICAgICAgICAgICAgICAgIChBVl9STjMyKGRzdCAgICAgICAgICAgICAgICAgKSArIGRlbHRhX3RhYi0+ZGVsdGFzX20xMFtkeWFkMV0pICYgMHg3RjdGN0Y3Rik7XAorICAgICAgICBBVl9XTjMyQShkc3QgKyA0ICAgICAgICAgICAgICwgXAorICAgICAgICAgICAgICAgICAoQVZfUk4zMihkc3QgKyA0ICAgICAgICAgICAgICkgKyBkZWx0YV90YWItPmRlbHRhc19tMTBbZHlhZDJdKSAmIDB4N0Y3RjdGN0YpO1wKKyAgICAgICAgQVZfV04zMkEoZHN0ICsgcm93X29mZnNldCAgICAsIFwKKyAgICAgICAgICAgICAgICAgKEFWX1JOMzIoZHN0ICsgcm93X29mZnNldCAgICApICsgZGVsdGFfdGFiLT5kZWx0YXNfbTEwW2R5YWQxXSkgJiAweDdGN0Y3RjdGKTtcCisgICAgICAgIEFWX1dOMzJBKGRzdCArIHJvd19vZmZzZXQgKyA0LCBcCisgICAgICAgICAgICAgICAgIChBVl9STjMyKGRzdCArIHJvd19vZmZzZXQgKyA0KSArIGRlbHRhX3RhYi0+ZGVsdGFzX20xMFtkeWFkMl0pICYgMHg3RjdGN0Y3Rik7XAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgQVZfV04xNkEoZHN0ICAgICAgICAgICAgICAgICAsIFwKKyAgICAgICAgICAgICAgICAgKEFWX1JOMTYoZHN0ICAgICAgICAgICAgICAgICApICsgZGVsdGFfdGFiLT5kZWx0YXNbZHlhZDFdKSAmIDB4N0Y3Rik7XAorICAgICAgICBBVl9XTjE2QShkc3QgKyAyICAgICAgICAgICAgICwgXAorICAgICAgICAgICAgICAgICAoQVZfUk4xNihkc3QgKyAyICAgICAgICAgICAgICkgKyBkZWx0YV90YWItPmRlbHRhc1tkeWFkMl0pICYgMHg3RjdGKTtcCisgICAgICAgIEFWX1dOMTZBKGRzdCArIHJvd19vZmZzZXQgICAgLCBcCisgICAgICAgICAgICAgICAgIChBVl9STjE2KGRzdCArIHJvd19vZmZzZXQgICAgKSArIGRlbHRhX3RhYi0+ZGVsdGFzW2R5YWQxXSkgJiAweDdGN0YpO1wKKyAgICAgICAgQVZfV04xNkEoZHN0ICsgcm93X29mZnNldCArIDIsIFwKKyAgICAgICAgICAgICAgICAgKEFWX1JOMTYoZHN0ICsgcm93X29mZnNldCArIDIpICsgZGVsdGFfdGFiLT5kZWx0YXNbZHlhZDJdKSAmIDB4N0Y3Rik7XAorICAgIH0KKworCitzdGF0aWMgaW50IGRlY29kZV9jZWxsX2RhdGEoSW5kZW8zRGVjb2RlQ29udGV4dCAqY3R4LCBDZWxsICpjZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJsb2NrLCB1aW50OF90ICpyZWZfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLCBpbnQgaF96b29tLCBpbnQgdl96b29tLCBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cUVudHJ5ICpkZWx0YVsyXSwgaW50IHN3YXBfcXVhZHNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKmRhdGFfcHRyLCBjb25zdCB1aW50OF90ICpsYXN0X3B0cikKK3sKKyAgICBpbnQgICAgICAgICAgIHgsIHksIGxpbmUsIG51bV9saW5lczsKKyAgICBpbnQgICAgICAgICAgIHJsZV9ibG9ja3MgPSAwOworICAgIHVpbnQ4X3QgICAgICAgY29kZSwgKmRzdCwgKnJlZjsKKyAgICBjb25zdCB2cUVudHJ5ICpkZWx0YV90YWI7CisgICAgdW5zaWduZWQgaW50ICBkeWFkMSwgZHlhZDI7CisgICAgdWludDY0X3QgICAgICBwaXg2NDsKKyAgICBpbnQgICAgICAgICAgIHNraXBfZmxhZyA9IDAsIGlzX3RvcF9vZl9jZWxsLCBpc19maXJzdF9yb3cgPSAxOworICAgIGludCAgICAgICAgICAgcm93X29mZnNldCwgYmxrX3Jvd19vZmZzZXQsIGxpbmVfb2Zmc2V0OworCisgICAgcm93X29mZnNldCAgICAgPSAgcGl0Y2g7CisgICAgYmxrX3Jvd19vZmZzZXQgPSAocm93X29mZnNldCA8PCAoMiArIHZfem9vbSkpIC0gKGNlbGwtPndpZHRoIDw8IDIpOworICAgIGxpbmVfb2Zmc2V0ICAgID0gdl96b29tID8gcm93X29mZnNldCA6IDA7CisKKyAgICBpZiAoY2VsbC0+aGVpZ2h0ICYgdl96b29tIHx8IGNlbGwtPndpZHRoICYgaF96b29tKQorICAgICAgICByZXR1cm4gSVYzX0JBRF9EQVRBOworCisgICAgZm9yICh5ID0gMDsgeSA8IGNlbGwtPmhlaWdodDsgaXNfZmlyc3Rfcm93ID0gMCwgeSArPSAxICsgdl96b29tKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBjZWxsLT53aWR0aDsgeCArPSAxICsgaF96b29tKSB7CisgICAgICAgICAgICByZWYgPSByZWZfYmxvY2s7CisgICAgICAgICAgICBkc3QgPSBibG9jazsKKworICAgICAgICAgICAgaWYgKHJsZV9ibG9ja3MgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1vZGUgPD0gNCkgeworICAgICAgICAgICAgICAgICAgICBSTEVfQkxPQ0tfQ09QWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMTAgJiYgIWNlbGwtPm12X3B0cikgeworICAgICAgICAgICAgICAgICAgICBSTEVfQkxPQ0tfQ09QWV84OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBybGVfYmxvY2tzLS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAobGluZSA9IDA7IGxpbmUgPCA0OykgeworICAgICAgICAgICAgICAgICAgICBudW1fbGluZXMgPSAxOworICAgICAgICAgICAgICAgICAgICBpc190b3Bfb2ZfY2VsbCA9IGlzX2ZpcnN0X3JvdyAmJiAhbGluZTsKKworICAgICAgICAgICAgICAgICAgICAvKiBzZWxlY3QgcHJpbWFyeSBWUSB0YWJsZSBmb3Igb2RkLCBzZWNvbmRhcnkgZm9yIGV2ZW4gbGluZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPD0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX3RhYiA9IGRlbHRhW2xpbmUgJiAxXTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFfdGFiID0gZGVsdGFbMV07CisgICAgICAgICAgICAgICAgICAgIEJVRkZFUl9QUkVDSEVDSzsKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoZGF0YV9wdHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA8IDI0OCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPCBkZWx0YV90YWItPm51bV9keWFkcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVRkZFUl9QUkVDSEVDSzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeWFkMSA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoZGF0YV9wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5YWQyID0gY29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlhZDEgPj0gZGVsdGFfdGFiLT5udW1fZHlhZHMgfHwgZHlhZDEgPj0gMjQ4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSVYzX0JBRF9EQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIFFVQURTICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAtPSBkZWx0YV90YWItPm51bV9keWFkczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeWFkMSA9IGNvZGUgLyBkZWx0YV90YWItPnF1YWRfZXhwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5YWQyID0gY29kZSAlIGRlbHRhX3RhYi0+cXVhZF9leHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN3YXBfcXVhZHNbbGluZSAmIDFdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRlNXQVAodW5zaWduZWQgaW50LCBkeWFkMSwgZHlhZDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPD0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX0RFTFRBXzQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMTAgJiYgIWNlbGwtPm12X3B0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX0RFTFRBXzg7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX0RFTFRBXzEwMTFfSU5URVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIFJMRSBjb2RlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJMRV9FU0NfRkM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9mbGFnICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmxlX2Jsb2NrcyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAgICAgICA9IDI1MzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSTEVfRVNDX0ZGOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSTEVfRVNDX0ZFOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSTEVfRVNDX0ZEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9saW5lcyA9IDI1NyAtIGNvZGUgLSBsaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1fbGluZXMgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElWM19CQURfUkxFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlIDw9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkxFX0xJTkVTX0NPUFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEwICYmICFjZWxsLT5tdl9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkxFX0xJTkVTX0NPUFlfTTEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkxFX0VTQ19GQjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUZGRVJfUFJFQ0hFQ0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoZGF0YV9wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJsZV9ibG9ja3MgPSAoY29kZSAmIDB4MUYpIC0gMTsgLyogc2V0IGJsb2NrIGNvdW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA+PSA2NCB8fCBybGVfYmxvY2tzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElWM19CQURfQ09VTlRFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2ZsYWcgPSBjb2RlICYgMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fbGluZXMgPSA0IC0gbGluZTsgLyogZW5mb3JjZSBuZXh0IGJsb2NrIHByb2Nlc3NpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA+PSAxMCB8fCAoY2VsbC0+bXZfcHRyIHx8ICFza2lwX2ZsYWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlIDw9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJMRV9MSU5FU19DT1BZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMTAgJiYgIWNlbGwtPm12X3B0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkxFX0xJTkVTX0NPUFlfTTEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSTEVfRVNDX0Y5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfZmxhZyAgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJsZV9ibG9ja3MgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJMRV9FU0NfRkE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJVjNfQkFEX1JMRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fbGluZXMgPSA0OyAvKiBlbmZvcmNlIG5leHQgYmxvY2sgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsLT5tdl9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPD0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkxFX0xJTkVTX0NPUFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSAxMCAmJiAhY2VsbC0+bXZfcHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSTEVfTElORVNfQ09QWV9NMTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJVjNfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBsaW5lICs9IG51bV9saW5lczsKKyAgICAgICAgICAgICAgICAgICAgcmVmICArPSByb3dfb2Zmc2V0ICogKG51bV9saW5lcyA8PCB2X3pvb20pOworICAgICAgICAgICAgICAgICAgICBkc3QgICs9IHJvd19vZmZzZXQgKiAobnVtX2xpbmVzIDw8IHZfem9vbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBtb3ZlIHRvIG5leHQgaG9yaXpvbnRhbCBibG9jayAqLworICAgICAgICAgICAgYmxvY2sgICAgICs9IDQgPDwgaF96b29tOworICAgICAgICAgICAgcmVmX2Jsb2NrICs9IDQgPDwgaF96b29tOworICAgICAgICB9CisKKyAgICAgICAgLyogbW92ZSB0byBuZXh0IGxpbmUgb2YgYmxvY2tzICovCisgICAgICAgIHJlZl9ibG9jayArPSBibGtfcm93X29mZnNldDsKKyAgICAgICAgYmxvY2sgICAgICs9IGJsa19yb3dfb2Zmc2V0OworICAgIH0KKyAgICByZXR1cm4gSVYzX05PRVJSOworfQorCisKKy8qKgorICogIERlY29kZSBhIHZlY3Rvci1xdWFudGl6ZWQgY2VsbC4KKyAqICBJdCBjb25zaXN0cyBvZiBzZXZlcmFsIHJvdXRpbmVzLCBlYWNoIG9mIHdoaWNoIGhhbmRsZXMgb25lIG9yIG1vcmUgIm1vZGVzIgorICogIHdpdGggd2hpY2ggYSBjZWxsIGNhbiBiZSBlbmNvZGVkLgorICoKKyAqICBAcGFyYW0gY3R4ICAgICAgcG9pbnRlciB0byB0aGUgZGVjb2RlciBjb250ZXh0CisgKiAgQHBhcmFtIGF2Y3R4ICAgIHB0ciB0byB0aGUgQVZDb2RlY0NvbnRleHQKKyAqICBAcGFyYW0gcGxhbmUgICAgcG9pbnRlciB0byB0aGUgcGxhbmUgZGVzY3JpcHRvcgorICogIEBwYXJhbSBjZWxsICAgICBwb2ludGVyIHRvIHRoZSBjZWxsICBkZXNjcmlwdG9yCisgKiAgQHBhcmFtIGRhdGFfcHRyIHBvaW50ZXIgdG8gdGhlIGNvbXByZXNzZWQgZGF0YQorICogIEBwYXJhbSBsYXN0X3B0ciBwb2ludGVyIHRvIHRoZSBsYXN0IGJ5dGUgdG8gY2F0Y2ggcmVhZHMgcGFzdCBlbmQgb2YgYnVmZmVyCisgKiAgQHJldHVybiAgICAgICAgIG51bWJlciBvZiBjb25zdW1lZCBieXRlcyBvciBuZWdhdGl2ZSBudW1iZXIgaW4gY2FzZSBvZiBlcnJvcgorICovCitzdGF0aWMgaW50IGRlY29kZV9jZWxsKEluZGVvM0RlY29kZUNvbnRleHQgKmN0eCwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICBQbGFuZSAqcGxhbmUsIENlbGwgKmNlbGwsIGNvbnN0IHVpbnQ4X3QgKmRhdGFfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsYXN0X3B0cikKK3sKKyAgICBpbnQgICAgICAgICAgIHgsIG12X3gsIG12X3ksIG1vZGUsIHZxX2luZGV4LCBwcmltX2luZHgsIHNlY29uZF9pbmR4OworICAgIGludCAgICAgICAgICAgem9vbV9mYWM7CisgICAgaW50ICAgICAgICAgICBvZmZzZXQsIGVycm9yID0gMCwgc3dhcF9xdWFkc1syXTsKKyAgICB1aW50OF90ICAgICAgIGNvZGUsICpibG9jaywgKnJlZl9ibG9jayA9IDA7CisgICAgY29uc3QgdnFFbnRyeSAqZGVsdGFbMl07CisgICAgY29uc3QgdWludDhfdCAqZGF0YV9zdGFydCA9IGRhdGFfcHRyOworCisgICAgLyogZ2V0IGNvZGluZyBtb2RlIGFuZCBWUSB0YWJsZSBpbmRleCBmcm9tIHRoZSBWUSBkZXNjcmlwdG9yIGJ5dGUgKi8KKyAgICBjb2RlICAgICA9ICpkYXRhX3B0cisrOworICAgIG1vZGUgICAgID0gY29kZSA+PiA0OworICAgIHZxX2luZGV4ID0gY29kZSAmIDB4RjsKKworICAgIC8qIHNldHVwIG91dHB1dCBhbmQgcmVmZXJlbmNlIHBvaW50ZXJzICovCisgICAgb2Zmc2V0ID0gKGNlbGwtPnlwb3MgPDwgMikgKiBwbGFuZS0+cGl0Y2ggKyAoY2VsbC0+eHBvcyA8PCAyKTsKKyAgICBibG9jayAgPSAgcGxhbmUtPnBpeGVsc1tjdHgtPmJ1Zl9zZWxdICsgb2Zmc2V0OworCisgICAgaWYgKCFjZWxsLT5tdl9wdHIpIHsKKyAgICAgICAgLyogdXNlIHByZXZpb3VzIGxpbmUgYXMgcmVmZXJlbmNlIGZvciBJTlRSQSBjZWxscyAqLworICAgICAgICByZWZfYmxvY2sgPSBibG9jayAtIHBsYW5lLT5waXRjaDsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPj0gMTApIHsKKyAgICAgICAgLyogZm9yIG1vZGUgMTAgYW5kIDExIElOVEVSIGZpcnN0IGNvcHkgdGhlIHByZWRpY3RlZCBjZWxsIGludG8gdGhlIGN1cnJlbnQgb25lICovCisgICAgICAgIC8qIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gZGF0YSBjb3B5aW5nIGZvciBlYWNoIFJMRSBjb2RlIGxhdGVyICovCisgICAgICAgIGludCByZXQgPSBjb3B5X2NlbGwoY3R4LCBwbGFuZSwgY2VsbCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBzZXQgdGhlIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBwaXhlbHMgZm9yIG1vZGVzIDAtNCBJTlRFUiAqLworICAgICAgICBtdl95ICAgICAgPSBjZWxsLT5tdl9wdHJbMF07CisgICAgICAgIG12X3ggICAgICA9IGNlbGwtPm12X3B0clsxXTsKKworICAgICAgICAvKiAtMSBiZWNhdXNlIHRoZXJlIGlzIGFuIGV4dHJhIGxpbmUgb24gdG9wIGZvciBwcmVkaWN0aW9uICovCisgICAgICAgIGlmICgoY2VsbC0+eXBvcyA8PCAyKSArIG12X3kgPCAtMSB8fCAoY2VsbC0+eHBvcyA8PCAyKSArIG12X3ggPCAwIHx8CisgICAgICAgICAgICAoKGNlbGwtPnlwb3MgKyBjZWxsLT5oZWlnaHQpIDw8IDIpICsgbXZfeSA+IHBsYW5lLT5oZWlnaHQgICAgIHx8CisgICAgICAgICAgICAoKGNlbGwtPnhwb3MgKyBjZWxsLT53aWR0aCkgIDw8IDIpICsgbXZfeCA+IHBsYW5lLT53aWR0aCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTW90aW9uIHZlY3RvcnMgcG9pbnQgb3V0IG9mIHRoZSBmcmFtZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgICArPSBtdl95ICogcGxhbmUtPnBpdGNoICsgbXZfeDsKKyAgICAgICAgcmVmX2Jsb2NrID0gcGxhbmUtPnBpeGVsc1tjdHgtPmJ1Zl9zZWwgXiAxXSArIG9mZnNldDsKKyAgICB9CisKKyAgICAvKiBzZWxlY3QgVlEgdGFibGVzIGFzIGZvbGxvd3M6ICovCisgICAgLyogbW9kZXMgMCBhbmQgMyB1c2Ugb25seSB0aGUgcHJpbWFyeSB0YWJsZSBmb3IgYWxsIGxpbmVzIGluIGEgYmxvY2sgKi8KKyAgICAvKiB3aGlsZSBtb2RlcyAxIGFuZCA0IHN3aXRjaCBiZXR3ZWVuIHByaW1hcnkgYW5kIHNlY29uZGFyeSB0YWJsZXMgb24gYWx0ZXJuYXRlIGxpbmVzICovCisgICAgaWYgKG1vZGUgPT0gMSB8fCBtb2RlID09IDQpIHsKKyAgICAgICAgY29kZSAgICAgICAgPSBjdHgtPmFsdF9xdWFudFt2cV9pbmRleF07CisgICAgICAgIHByaW1faW5keCAgID0gKGNvZGUgPj4gNCkgICsgY3R4LT5jYl9vZmZzZXQ7CisgICAgICAgIHNlY29uZF9pbmR4ID0gKGNvZGUgJiAweEYpICsgY3R4LT5jYl9vZmZzZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdnFfaW5kZXggKz0gY3R4LT5jYl9vZmZzZXQ7CisgICAgICAgIHByaW1faW5keCA9IHNlY29uZF9pbmR4ID0gdnFfaW5kZXg7CisgICAgfQorCisgICAgaWYgKHByaW1faW5keCA+PSAyNCB8fCBzZWNvbmRfaW5keCA+PSAyNCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgVlEgdGFibGUgaW5kZXhlcyEgUHJpbWFyeTogJWQsIHNlY29uZGFyeTogJWQhXG4iLAorICAgICAgICAgICAgICAgcHJpbV9pbmR4LCBzZWNvbmRfaW5keCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGRlbHRhWzBdID0gJnZxX3RhYltzZWNvbmRfaW5keF07CisgICAgZGVsdGFbMV0gPSAmdnFfdGFiW3ByaW1faW5keF07CisgICAgc3dhcF9xdWFkc1swXSA9IHNlY29uZF9pbmR4ID49IDE2OworICAgIHN3YXBfcXVhZHNbMV0gPSBwcmltX2luZHggICA+PSAxNjsKKworICAgIC8qIHJlcXVhbnRpemUgdGhlIHByZWRpY3Rpb24gaWYgVlEgaW5kZXggb2YgdGhpcyBjZWxsIGRpZmZlcnMgZnJvbSBWUSBpbmRleCAqLworICAgIC8qIG9mIHRoZSBwcmVkaWN0ZWQgY2VsbCBpbiBvcmRlciB0byBhdm9pZCBvdmVyZmxvd3MuICovCisgICAgaWYgKHZxX2luZGV4ID49IDggJiYgcmVmX2Jsb2NrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBjZWxsLT53aWR0aCA8PCAyOyB4KyspCisgICAgICAgICAgICByZWZfYmxvY2tbeF0gPSByZXF1YW50X3RhYlt2cV9pbmRleCAmIDddW3JlZl9ibG9ja1t4XSAmIDEyN107CisgICAgfQorCisgICAgZXJyb3IgPSBJVjNfTk9FUlI7CisKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIDA6IC8qLS0tLS0tLS0tLS0tLS0tLS0tIE1PREVTIDAgJiAxICg0eDQgYmxvY2sgcHJvY2Vzc2luZykgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGNhc2UgMToKKyAgICBjYXNlIDM6IC8qLS0tLS0tLS0tLS0tLS0tLS0tIE1PREVTIDMgJiA0ICg0eDggYmxvY2sgcHJvY2Vzc2luZykgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGNhc2UgNDoKKyAgICAgICAgaWYgKG1vZGUgPj0gMyAmJiBjZWxsLT5tdl9wdHIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQXR0ZW1wdCB0byBhcHBseSBNb2RlIDMvNCB0byBhbiBJTlRFUiBjZWxsIVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIHpvb21fZmFjID0gbW9kZSA+PSAzOworICAgICAgICBlcnJvciA9IGRlY29kZV9jZWxsX2RhdGEoY3R4LCBjZWxsLCBibG9jaywgcmVmX2Jsb2NrLCBwbGFuZS0+cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB6b29tX2ZhYywgbW9kZSwgZGVsdGEsIHN3YXBfcXVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YV9wdHIsIGxhc3RfcHRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDogLyotLS0tLS0tLS0tLS0tLS0tLS0tLSBNT0RFIDEwICg4eDggYmxvY2sgcHJvY2Vzc2luZykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBjYXNlIDExOiAvKi0tLS0tLS0tLS0tLS0tLS0tIE1PREUgMTEgKDR4OCBJTlRFUiBibG9jayBwcm9jZXNzaW5nKSAtLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICBpZiAobW9kZSA9PSAxMCAmJiAhY2VsbC0+bXZfcHRyKSB7IC8qIE1PREUgMTAgSU5UUkEgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgZXJyb3IgPSBkZWNvZGVfY2VsbF9kYXRhKGN0eCwgY2VsbCwgYmxvY2ssIHJlZl9ibG9jaywgcGxhbmUtPnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIG1vZGUsIGRlbHRhLCBzd2FwX3F1YWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhX3B0ciwgbGFzdF9wdHIpOworICAgICAgICB9IGVsc2UgeyAvKiBtb2RlIDEwIGFuZCAxMSBJTlRFUiBwcm9jZXNzaW5nICovCisgICAgICAgICAgICBpZiAobW9kZSA9PSAxMSAmJiAhY2VsbC0+bXZfcHRyKSB7CisgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkF0dGVtcHQgdG8gdXNlIE1vZGUgMTEgZm9yIGFuIElOVFJBIGNlbGwhXG4iKTsKKyAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6b29tX2ZhYyA9IG1vZGUgPT0gMTA7CisgICAgICAgICAgICBlcnJvciA9IGRlY29kZV9jZWxsX2RhdGEoY3R4LCBjZWxsLCBibG9jaywgcmVmX2Jsb2NrLCBwbGFuZS0+cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbV9mYWMsIDEsIG1vZGUsIGRlbHRhLCBzd2FwX3F1YWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhX3B0ciwgbGFzdF9wdHIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgY29kaW5nIG1vZGU6ICVkXG4iLCBtb2RlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfS8vc3dpdGNoIG1vZGUKKworICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICBjYXNlIElWM19CQURfUkxFOgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1vZGUgJWQ6IFJMRSBjb2RlICVYIGlzIG5vdCBhbGxvd2VkIGF0IHRoZSBjdXJyZW50IGxpbmVcbiIsCisgICAgICAgICAgICAgICBtb2RlLCBkYXRhX3B0clstMV0pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBjYXNlIElWM19CQURfREFUQToKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNb2RlICVkOiBpbnZhbGlkIFZRIGRhdGFcbiIsIG1vZGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBjYXNlIElWM19CQURfQ09VTlRFUjoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNb2RlICVkOiBSTEUtRkIgaW52YWxpZCBjb3VudGVyOiAlZFxuIiwgbW9kZSwgY29kZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGNhc2UgSVYzX1VOU1VQUE9SVEVEOgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1vZGUgJWQ6IHVuc3VwcG9ydGVkIFJMRSBjb2RlOiAlWFxuIiwgbW9kZSwgZGF0YV9wdHJbLTFdKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgY2FzZSBJVjNfT1VUX09GX0RBVEE6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTW9kZSAlZDogYXR0ZW1wdCB0byByZWFkIHBhc3QgZW5kIG9mIGJ1ZmZlclxuIiwgbW9kZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldHVybiBkYXRhX3B0ciAtIGRhdGFfc3RhcnQ7IC8qIHJlcG9ydCBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyICovCit9CisKKworLyogQmluYXJ5IHRyZWUgY29kZXMuICovCitlbnVtIHsKKyAgICBIX1NQTElUICAgID0gMCwKKyAgICBWX1NQTElUICAgID0gMSwKKyAgICBJTlRSQV9OVUxMID0gMiwKKyAgICBJTlRFUl9EQVRBID0gMworfTsKKworCisjZGVmaW5lIFNQTElUX0NFTEwoc2l6ZSwgbmV3X3NpemUpIChuZXdfc2l6ZSkgPSAoKHNpemUpID4gMikgPyAoKCgoc2l6ZSkgKyAyKSA+PiAyKSA8PCAxKSA6IDEKKworI2RlZmluZSBVUERBVEVfQklUUE9TKG4pIFwKKyAgICBjdHgtPnNraXBfYml0cyAgKz0gKG4pOyBcCisgICAgY3R4LT5uZWVkX3Jlc3luYyA9IDEKKworI2RlZmluZSBSRVNZTkNfQklUU1RSRUFNIFwKKyAgICBpZiAoY3R4LT5uZWVkX3Jlc3luYyAmJiAhKGdldF9iaXRzX2NvdW50KCZjdHgtPmdiKSAmIDcpKSB7IFwKKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmN0eC0+Z2IsIGN0eC0+c2tpcF9iaXRzKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgY3R4LT5za2lwX2JpdHMgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY3R4LT5uZWVkX3Jlc3luYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgQ0hFQ0tfQ0VMTCBcCisgICAgaWYgKGN1cnJfY2VsbC54cG9zICsgY3Vycl9jZWxsLndpZHRoID4gKHBsYW5lLT53aWR0aCA+PiAyKSB8fCAgICAgICAgICAgICAgIFwKKyAgICAgICAgY3Vycl9jZWxsLnlwb3MgKyBjdXJyX2NlbGwuaGVpZ2h0ID4gKHBsYW5lLT5oZWlnaHQgPj4gMikpIHsgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY2VsbDogeD0lZCwgeT0lZCwgdz0lZCwgaD0lZFxuIiwgICBcCisgICAgICAgICAgICAgICBjdXJyX2NlbGwueHBvcywgY3Vycl9jZWxsLnlwb3MsIGN1cnJfY2VsbC53aWR0aCwgY3Vycl9jZWxsLmhlaWdodCk7IFwKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKK3N0YXRpYyBpbnQgcGFyc2VfYmludHJlZShJbmRlbzNEZWNvZGVDb250ZXh0ICpjdHgsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZSAqcGxhbmUsIGludCBjb2RlLCBDZWxsICpyZWZfY2VsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGVwdGgsIGNvbnN0IGludCBzdHJpcF93aWR0aCkKK3sKKyAgICBDZWxsICAgIGN1cnJfY2VsbDsKKyAgICBpbnQgICAgIGJ5dGVzX3VzZWQsIHJldDsKKworICAgIGlmIChkZXB0aCA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU3RhY2sgb3ZlcmZsb3cgKGNvcnJ1cHRlZCBiaW5hcnkgdHJlZSkhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7IC8vIHVud2luZCByZWN1cnNpb24KKyAgICB9CisKKyAgICBjdXJyX2NlbGwgPSAqcmVmX2NlbGw7IC8vIGNsb25lIHBhcmVudCBjZWxsCisgICAgaWYgKGNvZGUgPT0gSF9TUExJVCkgeworICAgICAgICBTUExJVF9DRUxMKHJlZl9jZWxsLT5oZWlnaHQsIGN1cnJfY2VsbC5oZWlnaHQpOworICAgICAgICByZWZfY2VsbC0+eXBvcyAgICs9IGN1cnJfY2VsbC5oZWlnaHQ7CisgICAgICAgIHJlZl9jZWxsLT5oZWlnaHQgLT0gY3Vycl9jZWxsLmhlaWdodDsKKyAgICAgICAgaWYgKHJlZl9jZWxsLT5oZWlnaHQgPD0gMCB8fCBjdXJyX2NlbGwuaGVpZ2h0IDw9IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9IGVsc2UgaWYgKGNvZGUgPT0gVl9TUExJVCkgeworICAgICAgICBpZiAoY3Vycl9jZWxsLndpZHRoID4gc3RyaXBfd2lkdGgpIHsKKyAgICAgICAgICAgIC8qIHNwbGl0IHN0cmlwICovCisgICAgICAgICAgICBjdXJyX2NlbGwud2lkdGggPSAoY3Vycl9jZWxsLndpZHRoIDw9IChzdHJpcF93aWR0aCA8PCAxKSA/IDEgOiAyKSAqIHN0cmlwX3dpZHRoOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIFNQTElUX0NFTEwocmVmX2NlbGwtPndpZHRoLCBjdXJyX2NlbGwud2lkdGgpOworICAgICAgICByZWZfY2VsbC0+eHBvcyAgKz0gY3Vycl9jZWxsLndpZHRoOworICAgICAgICByZWZfY2VsbC0+d2lkdGggLT0gY3Vycl9jZWxsLndpZHRoOworICAgICAgICBpZiAocmVmX2NlbGwtPndpZHRoIDw9IDAgfHwgY3Vycl9jZWxsLndpZHRoIDw9IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB3aGlsZSAoZ2V0X2JpdHNfbGVmdCgmY3R4LT5nYikgPj0gMikgeyAvKiBsb29wIHVudGlsIHJldHVybiAqLworICAgICAgICBSRVNZTkNfQklUU1RSRUFNOworICAgICAgICBzd2l0Y2ggKGNvZGUgPSBnZXRfYml0cygmY3R4LT5nYiwgMikpIHsKKyAgICAgICAgY2FzZSBIX1NQTElUOgorICAgICAgICBjYXNlIFZfU1BMSVQ6CisgICAgICAgICAgICBpZiAocGFyc2VfYmludHJlZShjdHgsIGF2Y3R4LCBwbGFuZSwgY29kZSwgJmN1cnJfY2VsbCwgZGVwdGggLSAxLCBzdHJpcF93aWR0aCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRSQV9OVUxMOgorICAgICAgICAgICAgaWYgKCFjdXJyX2NlbGwudHJlZSkgeyAvKiBNQyB0cmVlIElOVFJBIGNvZGUgKi8KKyAgICAgICAgICAgICAgICBjdXJyX2NlbGwubXZfcHRyID0gMDsgLyogbWFyayB0aGUgY3VycmVudCBzdHJpcCBhcyBJTlRSQSAqLworICAgICAgICAgICAgICAgIGN1cnJfY2VsbC50cmVlICAgPSAxOyAvKiBlbnRlciB0aGUgVlEgdHJlZSAqLworICAgICAgICAgICAgfSBlbHNlIHsgLyogVlEgdHJlZSBOVUxMIGNvZGUgKi8KKyAgICAgICAgICAgICAgICBSRVNZTkNfQklUU1RSRUFNOworICAgICAgICAgICAgICAgIGNvZGUgPSBnZXRfYml0cygmY3R4LT5nYiwgMik7CisgICAgICAgICAgICAgICAgaWYgKGNvZGUgPj0gMikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgVlFfTlVMTCBjb2RlOiAlZFxuIiwgY29kZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNraXBDZWxsIHByb2NlZHVyZSBub3QgaW1wbGVtZW50ZWQgeWV0IVxuIik7CisKKyAgICAgICAgICAgICAgICBDSEVDS19DRUxMCisgICAgICAgICAgICAgICAgaWYgKCFjdXJyX2NlbGwubXZfcHRyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgICAgIHJldCA9IGNvcHlfY2VsbChjdHgsIHBsYW5lLCAmY3Vycl9jZWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5URVJfREFUQToKKyAgICAgICAgICAgIGlmICghY3Vycl9jZWxsLnRyZWUpIHsgLyogTUMgdHJlZSBJTlRFUiBjb2RlICovCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbXZfaWR4OworICAgICAgICAgICAgICAgIC8qIGdldCBtb3Rpb24gdmVjdG9yIGluZGV4IGFuZCBzZXR1cCB0aGUgcG9pbnRlciB0byB0aGUgbXYgc2V0ICovCisgICAgICAgICAgICAgICAgaWYgKCFjdHgtPm5lZWRfcmVzeW5jKQorICAgICAgICAgICAgICAgICAgICBjdHgtPm5leHRfY2VsbF9kYXRhID0gJmN0eC0+Z2IuYnVmZmVyWyhnZXRfYml0c19jb3VudCgmY3R4LT5nYikgKyA3KSA+PiAzXTsKKyAgICAgICAgICAgICAgICBpZiAoY3R4LT5uZXh0X2NlbGxfZGF0YSA+PSBjdHgtPmxhc3RfYnl0ZSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1vdGlvbiB2ZWN0b3Igb3V0IG9mIGFycmF5XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG12X2lkeCA9ICooY3R4LT5uZXh0X2NlbGxfZGF0YSsrKTsKKyAgICAgICAgICAgICAgICBpZiAobXZfaWR4ID49IGN0eC0+bnVtX3ZlY3RvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtb3Rpb24gdmVjdG9yIGluZGV4IG91dCBvZiByYW5nZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyX2NlbGwubXZfcHRyID0gJmN0eC0+bWNfdmVjdG9yc1ttdl9pZHggPDwgMV07CisgICAgICAgICAgICAgICAgY3Vycl9jZWxsLnRyZWUgICA9IDE7IC8qIGVudGVyIHRoZSBWUSB0cmVlICovCisgICAgICAgICAgICAgICAgVVBEQVRFX0JJVFBPUyg4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8qIFZRIHRyZWUgREFUQSBjb2RlICovCisgICAgICAgICAgICAgICAgaWYgKCFjdHgtPm5lZWRfcmVzeW5jKQorICAgICAgICAgICAgICAgICAgICBjdHgtPm5leHRfY2VsbF9kYXRhID0gJmN0eC0+Z2IuYnVmZmVyWyhnZXRfYml0c19jb3VudCgmY3R4LT5nYikgKyA3KSA+PiAzXTsKKworICAgICAgICAgICAgICAgIENIRUNLX0NFTEwKKyAgICAgICAgICAgICAgICBieXRlc191c2VkID0gZGVjb2RlX2NlbGwoY3R4LCBhdmN0eCwgcGxhbmUsICZjdXJyX2NlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bmV4dF9jZWxsX2RhdGEsIGN0eC0+bGFzdF9ieXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNfdXNlZCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgVVBEQVRFX0JJVFBPUyhieXRlc191c2VkIDw8IDMpOworICAgICAgICAgICAgICAgIGN0eC0+bmV4dF9jZWxsX2RhdGEgKz0gYnl0ZXNfdXNlZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfS8vd2hpbGUKKworICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworfQorCisKK3N0YXRpYyBpbnQgZGVjb2RlX3BsYW5lKEluZGVvM0RlY29kZUNvbnRleHQgKmN0eCwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmUgKnBsYW5lLCBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaXBfd2lkdGgpCit7CisgICAgQ2VsbCAgICAgICAgICAgIGN1cnJfY2VsbDsKKyAgICB1bnNpZ25lZCAgICAgICAgbnVtX3ZlY3RvcnM7CisKKyAgICAvKiBlYWNoIHBsYW5lIGRhdGEgc3RhcnRzIHdpdGggbWNfdmVjdG9yX2NvdW50IGZpZWxkLCAqLworICAgIC8qIGFuIG9wdGlvbmFsIGFycmF5IG9mIG1vdGlvbiB2ZWN0b3JzIGZvbGxvd2VkIGJ5IHRoZSB2cSBkYXRhICovCisgICAgbnVtX3ZlY3RvcnMgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZkYXRhKTsgZGF0YV9zaXplIC09IDQ7CisgICAgaWYgKG51bV92ZWN0b3JzID4gMjU2KSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiUmVhZCBpbnZhbGlkIG51bWJlciBvZiBtb3Rpb24gdmVjdG9ycyAlZFxuIiwgbnVtX3ZlY3RvcnMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKG51bV92ZWN0b3JzICogMiA+IGRhdGFfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBjdHgtPm51bV92ZWN0b3JzID0gbnVtX3ZlY3RvcnM7CisgICAgY3R4LT5tY192ZWN0b3JzICA9IG51bV92ZWN0b3JzID8gZGF0YSA6IDA7CisKKyAgICAvKiBpbml0IHRoZSBiaXRyZWFkZXIgKi8KKyAgICBpbml0X2dldF9iaXRzKCZjdHgtPmdiLCAmZGF0YVtudW1fdmVjdG9ycyAqIDJdLCAoZGF0YV9zaXplIC0gbnVtX3ZlY3RvcnMgKiAyKSA8PCAzKTsKKyAgICBjdHgtPnNraXBfYml0cyAgID0gMDsKKyAgICBjdHgtPm5lZWRfcmVzeW5jID0gMDsKKworICAgIGN0eC0+bGFzdF9ieXRlID0gZGF0YSArIGRhdGFfc2l6ZTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIDFzdCBjZWxsIGFuZCBzZXQgaXRzIGRpbWVuc2lvbnMgdG8gd2hvbGUgcGxhbmUgKi8KKyAgICBjdXJyX2NlbGwueHBvcyAgID0gY3Vycl9jZWxsLnlwb3MgPSAwOworICAgIGN1cnJfY2VsbC53aWR0aCAgPSBwbGFuZS0+d2lkdGggID4+IDI7CisgICAgY3Vycl9jZWxsLmhlaWdodCA9IHBsYW5lLT5oZWlnaHQgPj4gMjsKKyAgICBjdXJyX2NlbGwudHJlZSAgID0gMDsgLy8gd2UgYXJlIGluIHRoZSBNQyB0cmVlIG5vdworICAgIGN1cnJfY2VsbC5tdl9wdHIgPSAwOyAvLyBubyBtb3Rpb24gdmVjdG9yID0gSU5UUkEgY2VsbAorCisgICAgcmV0dXJuIHBhcnNlX2JpbnRyZWUoY3R4LCBhdmN0eCwgcGxhbmUsIElOVFJBX05VTEwsICZjdXJyX2NlbGwsIENFTExfU1RBQ0tfTUFYLCBzdHJpcF93aWR0aCk7Cit9CisKKworI2RlZmluZSBPU19IRFJfSUQgICBNS0JFVEFHKCdGJywgJ1InLCAnTScsICdIJykKKworc3RhdGljIGludCBkZWNvZGVfZnJhbWVfaGVhZGVycyhJbmRlbzNEZWNvZGVDb250ZXh0ICpjdHgsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgY29uc3QgdWludDhfdCAgICpic19oZHI7CisgICAgdWludDMyX3QgICAgICAgIGZyYW1lX251bSwgd29yZDIsIGNoZWNrX3N1bSwgZGF0YV9zaXplOworICAgIHVpbnQzMl90ICAgICAgICB5X29mZnNldCwgdV9vZmZzZXQsIHZfb2Zmc2V0LCBzdGFydHNbM10sIGVuZHNbM107CisgICAgdWludDE2X3QgICAgICAgIGhlaWdodCwgd2lkdGg7CisgICAgaW50ICAgICAgICAgICAgIGksIGo7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICAvKiBwYXJzZSBhbmQgY2hlY2sgdGhlIE9TIGhlYWRlciAqLworICAgIGZyYW1lX251bSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgd29yZDIgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKKyAgICBjaGVja19zdW0gPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2IpOworICAgIGRhdGFfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisKKyAgICBpZiAoKGZyYW1lX251bSBeIHdvcmQyIF4gZGF0YV9zaXplIF4gT1NfSERSX0lEKSAhPSBjaGVja19zdW0pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPUyBoZWFkZXIgY2hlY2tzdW0gbWlzbWF0Y2ghXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogcGFyc2UgdGhlIGJpdHN0cmVhbSBoZWFkZXIgKi8KKyAgICBic19oZHIgPSBnYi5idWZmZXI7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKSAhPSAzMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvZGVjIHZlcnNpb24hXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3R4LT5mcmFtZV9udW0gICA9ICBmcmFtZV9udW07CisgICAgY3R4LT5mcmFtZV9mbGFncyA9ICBieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpOworICAgIGN0eC0+ZGF0YV9zaXplICAgPSAoYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKSArIDcpID4+IDM7CisgICAgY3R4LT5jYl9vZmZzZXQgICA9ICBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworCisgICAgaWYgKGN0eC0+ZGF0YV9zaXplID09IDE2KQorICAgICAgICByZXR1cm4gNDsKKyAgICBjdHgtPmRhdGFfc2l6ZSA9IEZGTUlOKGN0eC0+ZGF0YV9zaXplLCBidWZfc2l6ZSAtIDE2KTsKKworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAzKTsgLy8gc2tpcCByZXNlcnZlZCBieXRlIGFuZCBjaGVja3N1bQorCisgICAgLyogY2hlY2sgZnJhbWUgZGltZW5zaW9ucyAqLworICAgIGhlaWdodCA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnYik7CisgICAgd2lkdGggID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKyAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZSh3aWR0aCwgaGVpZ2h0LCAwLCBhdmN0eCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKHdpZHRoICE9IGN0eC0+d2lkdGggfHwgaGVpZ2h0ICE9IGN0eC0+aGVpZ2h0KSB7CisgICAgICAgIGludCByZXM7CisKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgIkZyYW1lIGRpbWVuc2lvbnMgY2hhbmdlZCFcbiIpOworCisgICAgICAgIGlmICh3aWR0aCAgPCAxNiB8fCB3aWR0aCAgPiA2NDAgfHwKKyAgICAgICAgICAgIGhlaWdodCA8IDE2IHx8IGhlaWdodCA+IDQ4MCB8fAorICAgICAgICAgICAgd2lkdGggICYgIDMgfHwgaGVpZ2h0ICYgICAzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBwaWN0dXJlIGRpbWVuc2lvbnM6ICVkIHggJWQhXG4iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGZyZWVfZnJhbWVfYnVmZmVycyhjdHgpOworICAgICAgICBpZiAoKHJlcyA9IGFsbG9jYXRlX2ZyYW1lX2J1ZmZlcnMoY3R4LCBhdmN0eCwgd2lkdGgsIGhlaWdodCkpIDwgMCkKKyAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICBpZiAoKHJlcyA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCB3aWR0aCwgaGVpZ2h0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICB5X29mZnNldCA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgdl9vZmZzZXQgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2IpOworICAgIHVfb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgNCk7CisKKyAgICAvKiB1bmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIGNvbW1vbiBvcmRlciBvZiBwbGFuZXMgaW4gdGhlIGJ1ZmZlciAqLworICAgIC8qIHNvIHdlIHVzZSB0aGF0IHNvcnRpbmcgYWxnbyBmb3IgZGV0ZXJtaW5pbmcgcGxhbmVzIGRhdGEgc2l6ZXMgICovCisgICAgc3RhcnRzWzBdID0geV9vZmZzZXQ7CisgICAgc3RhcnRzWzFdID0gdl9vZmZzZXQ7CisgICAgc3RhcnRzWzJdID0gdV9vZmZzZXQ7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CisgICAgICAgIGVuZHNbal0gPSBjdHgtPmRhdGFfc2l6ZTsKKyAgICAgICAgZm9yIChpID0gMjsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICBpZiAoc3RhcnRzW2ldIDwgZW5kc1tqXSAmJiBzdGFydHNbaV0gPiBzdGFydHNbal0pCisgICAgICAgICAgICAgICAgZW5kc1tqXSA9IHN0YXJ0c1tpXTsKKyAgICB9CisKKyAgICBjdHgtPnlfZGF0YV9zaXplID0gZW5kc1swXSAtIHN0YXJ0c1swXTsKKyAgICBjdHgtPnZfZGF0YV9zaXplID0gZW5kc1sxXSAtIHN0YXJ0c1sxXTsKKyAgICBjdHgtPnVfZGF0YV9zaXplID0gZW5kc1syXSAtIHN0YXJ0c1syXTsKKyAgICBpZiAoRkZNQVgzKHlfb2Zmc2V0LCB2X29mZnNldCwgdV9vZmZzZXQpID49IGN0eC0+ZGF0YV9zaXplIC0gMTYgfHwKKyAgICAgICAgRkZNSU4zKHlfb2Zmc2V0LCB2X29mZnNldCwgdV9vZmZzZXQpIDwgZ2IuYnVmZmVyIC0gYnNfaGRyICsgMTYgfHwKKyAgICAgICAgRkZNSU4zKGN0eC0+eV9kYXRhX3NpemUsIGN0eC0+dl9kYXRhX3NpemUsIGN0eC0+dV9kYXRhX3NpemUpIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmUgb2YgdGhlIHkvdS92IG9mZnNldHMgaXMgaW52YWxpZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGN0eC0+eV9kYXRhX3B0ciA9IGJzX2hkciArIHlfb2Zmc2V0OworICAgIGN0eC0+dl9kYXRhX3B0ciA9IGJzX2hkciArIHZfb2Zmc2V0OworICAgIGN0eC0+dV9kYXRhX3B0ciA9IGJzX2hkciArIHVfb2Zmc2V0OworICAgIGN0eC0+YWx0X3F1YW50ICA9IGdiLmJ1ZmZlcjsKKworICAgIGlmIChjdHgtPmRhdGFfc2l6ZSA9PSAxNikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlN5bmMgZnJhbWUgZW5jb3VudGVyZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIDE2OworICAgIH0KKworICAgIGlmIChjdHgtPmZyYW1lX2ZsYWdzICYgQlNfOEJJVF9QRUwpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiOC1iaXQgcGl4ZWwgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5mcmFtZV9mbGFncyAmIEJTX01WX1hfSEFMRiB8fCBjdHgtPmZyYW1lX2ZsYWdzICYgQlNfTVZfWV9IQUxGKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkhhbGZwZWwgbW90aW9uIHZlY3RvcnMiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogIENvbnZlcnQgYW5kIG91dHB1dCB0aGUgY3VycmVudCBwbGFuZS4KKyAqICBBbGwgcGl4ZWwgdmFsdWVzIHdpbGwgYmUgdXBzYW1wbGVkIGJ5IHNoaWZ0aW5nIHJpZ2h0IGJ5IG9uZSBiaXQuCisgKgorICogIEBwYXJhbVtpbl0gIHBsYW5lICAgICAgICBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBwbGFuZSBiZWluZyBwcm9jZXNzZWQKKyAqICBAcGFyYW1baW5dICBidWZfc2VsICAgICAgaW5kaWNhdGVzIHdoaWNoIGZyYW1lIGJ1ZmZlciB0aGUgaW5wdXQgZGF0YSBzdG9yZWQgaW4KKyAqICBAcGFyYW1bb3V0XSBkc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgYnVmZmVyIHJlY2VpdmluZyBjb252ZXJ0ZWQgcGl4ZWxzCisgKiAgQHBhcmFtW2luXSAgZHN0X3BpdGNoICAgIHBpdGNoIGZvciBtb3ZpbmcgdG8gdGhlIG5leHQgeSBsaW5lCisgKiAgQHBhcmFtW2luXSAgZHN0X2hlaWdodCAgIG91dHB1dCBwbGFuZSBoZWlnaHQKKyAqLworc3RhdGljIHZvaWQgb3V0cHV0X3BsYW5lKGNvbnN0IFBsYW5lICpwbGFuZSwgaW50IGJ1Zl9zZWwsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3BpdGNoLCBpbnQgZHN0X2hlaWdodCkKK3sKKyAgICBpbnQgICAgICAgICAgICAgeCx5OworICAgIGNvbnN0IHVpbnQ4X3QgICAqc3JjICA9IHBsYW5lLT5waXhlbHNbYnVmX3NlbF07CisgICAgdWludDMyX3QgICAgICAgIHBpdGNoID0gcGxhbmUtPnBpdGNoOworCisgICAgZHN0X2hlaWdodCA9IEZGTUlOKGRzdF9oZWlnaHQsIHBsYW5lLT5oZWlnaHQpOworICAgIGZvciAoeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgLyogY29udmVydCBmb3VyIHBpeGVscyBhdCBvbmNlIHVzaW5nIFNXQVIgKi8KKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHBsYW5lLT53aWR0aCA+PiAyOyB4KyspIHsKKyAgICAgICAgICAgIEFWX1dOMzJBKGRzdCwgKEFWX1JOMzJBKHNyYykgJiAweDdGN0Y3RjdGKSA8PCAxKTsKKyAgICAgICAgICAgIHNyYyArPSA0OworICAgICAgICAgICAgZHN0ICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHggPDw9IDI7IHggPCBwbGFuZS0+d2lkdGg7IHgrKykKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKyA8PCAxOworCisgICAgICAgIHNyYyArPSBwaXRjaCAgICAgLSBwbGFuZS0+d2lkdGg7CisgICAgICAgIGRzdCArPSBkc3RfcGl0Y2ggLSBwbGFuZS0+d2lkdGg7CisgICAgfQorfQorCisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSW5kZW8zRGVjb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGN0eC0+YXZjdHggICAgID0gYXZjdHg7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQxMFA7CisKKyAgICBidWlsZF9yZXF1YW50X3RhYigpOworCisgICAgZmZfaHBlbGRzcF9pbml0KCZjdHgtPmhkc3AsIGF2Y3R4LT5mbGFncyk7CisKKyAgICByZXR1cm4gYWxsb2NhdGVfZnJhbWVfYnVmZmVycyhjdHgsIGF2Y3R4LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworfQorCisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgSW5kZW8zRGVjb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGludCByZXM7CisKKyAgICByZXMgPSBkZWNvZGVfZnJhbWVfaGVhZGVycyhjdHgsIGF2Y3R4LCBidWYsIGJ1Zl9zaXplKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIC8qIHNraXAgc3luYyhudWxsKSBmcmFtZXMgKi8KKyAgICBpZiAocmVzKSB7CisgICAgICAgIC8vIHdlIGhhdmUgcHJvY2Vzc2VkIDE2IGJ5dGVzIGJ1dCBubyBkYXRhIHdhcyBkZWNvZGVkCisgICAgICAgICpnb3RfZnJhbWUgPSAwOworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgLyogc2tpcCBkcm9wcGFibGUgSU5URVIgZnJhbWVzIGlmIHJlcXVlc3RlZCAqLworICAgIGlmIChjdHgtPmZyYW1lX2ZsYWdzICYgQlNfTk9OUkVGICYmCisgICAgICAgKGF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9OT05SRUYpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHNraXAgSU5URVIgZnJhbWVzIGlmIHJlcXVlc3RlZCAqLworICAgIGlmICghKGN0eC0+ZnJhbWVfZmxhZ3MgJiBCU19LRVlGUkFNRSkgJiYgYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTktFWSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiB1c2UgQlNfQlVGRkVSIGZsYWcgZm9yIGJ1ZmZlciBzd2l0Y2hpbmcgKi8KKyAgICBjdHgtPmJ1Zl9zZWwgPSAoY3R4LT5mcmFtZV9mbGFncyA+PiBCU19CVUZGRVIpICYgMTsKKworICAgIGlmICgocmVzID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICAvKiBkZWNvZGUgbHVtYSBwbGFuZSAqLworICAgIGlmICgocmVzID0gZGVjb2RlX3BsYW5lKGN0eCwgYXZjdHgsIGN0eC0+cGxhbmVzLCBjdHgtPnlfZGF0YV9wdHIsIGN0eC0+eV9kYXRhX3NpemUsIDQwKSkpCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICAvKiBkZWNvZGUgY2hyb21hIHBsYW5lcyAqLworICAgIGlmICgocmVzID0gZGVjb2RlX3BsYW5lKGN0eCwgYXZjdHgsICZjdHgtPnBsYW5lc1sxXSwgY3R4LT51X2RhdGFfcHRyLCBjdHgtPnVfZGF0YV9zaXplLCAxMCkpKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgaWYgKChyZXMgPSBkZWNvZGVfcGxhbmUoY3R4LCBhdmN0eCwgJmN0eC0+cGxhbmVzWzJdLCBjdHgtPnZfZGF0YV9wdHIsIGN0eC0+dl9kYXRhX3NpemUsIDEwKSkpCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICBvdXRwdXRfcGxhbmUoJmN0eC0+cGxhbmVzWzBdLCBjdHgtPmJ1Zl9zZWwsCisgICAgICAgICAgICAgICAgIGZyYW1lLT5kYXRhWzBdLCBmcmFtZS0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQpOworICAgIG91dHB1dF9wbGFuZSgmY3R4LT5wbGFuZXNbMV0sIGN0eC0+YnVmX3NlbCwKKyAgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMV0sIGZyYW1lLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgKGF2Y3R4LT5oZWlnaHQgKyAzKSA+PiAyKTsKKyAgICBvdXRwdXRfcGxhbmUoJmN0eC0+cGxhbmVzWzJdLCBjdHgtPmJ1Zl9zZWwsCisgICAgICAgICAgICAgICAgIGZyYW1lLT5kYXRhWzJdLCBmcmFtZS0+bGluZXNpemVbMl0sCisgICAgICAgICAgICAgICAgIChhdmN0eC0+aGVpZ2h0ICsgMykgPj4gMik7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBmcmVlX2ZyYW1lX2J1ZmZlcnMoYXZjdHgtPnByaXZfZGF0YSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9pbmRlbzNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaW5kZW8zIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSW50ZWwgSW5kZW8gMyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9JTkRFTzMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEluZGVvM0RlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9pbmRlbzNkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9pbmRlbzNkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlMjhhMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2luZGVvM2RhdGEuaApAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIEluZGVvIFZpZGVvIHYzIGNvbXBhdGlibGUgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IC0gMjAxMSBNYXhpbSBQb2xpYWtvdnNraQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSU5ERU8zREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfSU5ERU8zREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisvKgorICogRGVmaW5lIGNvbXByZXNzZWQgVlEgdGFibGVzLgorICovCisKKyNkZWZpbmUgVEFCXzFfMSBcCisgICAgUEQoICAgMCwgICAwKSwgRTIoICAgMiwgICAyKSwgRTQoICAtMSwgICAzKSwgRTIoICAgNCwgICA0KSwgRTQoICAgMSwgICA1KSxcCisgICAgRTIoICAtNCwgICA0KSwgRTQoICAtMiwgICA2KSwgRTQoICAgNCwgICA5KSwgRTIoICAgOSwgICA5KSwgRTQoICAgMSwgIDEwKSxcCisgICAgRTQoICAtNSwgICA4KSwgRTQoICAgOSwgIDE1KSwgRTQoICAtMywgIDEyKSwgRTQoICAgNCwgIDE2KSwgRTIoICAxNiwgIDE2KSxcCisgICAgRTQoICAgMCwgIDE4KSwgRTIoIC0xMiwgIDEyKSwgRTQoICAtOSwgIDE2KSwgRTQoICAxMSwgIDI3KSwgRTQoICAxOSwgIDI4KSxcCisgICAgRTQoICAtNiwgIDIyKSwgRTQoICAgNCwgIDI5KSwgRTIoICAzMCwgIDMwKSwgRTQoICAtMiwgIDMzKSwgRTQoIC0xOCwgIDIzKSxcCisgICAgRTQoIC0xNSwgIDMwKSwgRTQoICAyMiwgIDQ2KSwgRTQoICAxMywgIDQ3KSwgRTQoICAzNSwgIDQ5KSwgRTQoIC0xMSwgIDQxKSxcCisgICAgRTQoICAgNCwgIDUxKSwgRTIoICA1NCwgIDU0KSwgRTIoIC0zNCwgIDM0KSwgRTQoIC0yOSwgIDQyKSwgRTQoICAtNiwgIDYwKSxcCisgICAgRTQoICAyNywgIDc2KSwgRTQoICA0MywgIDc3KSwgRTQoIC0yNCwgIDU1KSwgRTQoICAxNCwgIDc5KSwgRTQoICA2MywgIDgzKSxcCisgICAgRTQoIC0yMCwgIDc0KSwgRTQoICAgMiwgIDg4KSwgRTIoICA5MywgIDkzKSwgRTQoIC01MiwgIDYxKSwgRTQoICA1MiwgMTIwKSxcCisgICAgRTQoIC00NSwgIDc1KSwgRTQoICA3NSwgMTI1KSwgRTQoICAzMywgMTIyKSwgRTQoIC0xMywgMTAzKSwgRTQoIC00MCwgIDk2KSxcCisgICAgRTQoIC0zNCwgMTI3KSwgRTIoIC04OSwgIDg5KSwgRTQoIC03OCwgMTA1KSwgRTIoICAxMiwgIDEyKSwgRTIoICAyMywgIDIzKSxcCisgICAgRTIoICA0MiwgIDQyKSwgRTIoICA3MywgIDczKQorCisjZGVmaW5lIFRBQl8xXzIgXAorICAgIFBEKCAgIDAsICAgMCksIEUyKCAgIDMsICAgMyksIEU0KCAgLTEsICAgNCksIEUyKCAgIDcsICAgNyksIEU0KCAgIDIsICAgOCksXAorICAgIEU0KCAgLTIsICAgOSksIEUyKCAgLTYsICAgNiksIEU0KCAgIDYsICAxMyksIEUyKCAgMTMsICAxMyksIEU0KCAgIDEsICAxNCksXAorICAgIEU0KCAgLTgsICAxMiksIEU0KCAgMTQsICAyMyksIEU0KCAgLTUsICAxOCksIEU0KCAgIDYsICAyNCksIEUyKCAgMjQsICAyNCksXAorICAgIEU0KCAgLTEsICAyNyksIEUyKCAtMTcsICAxNyksIEU0KCAtMTMsICAyMyksIEU0KCAgMTYsICA0MCksIEU0KCAgMjgsICA0MSksXAorICAgIEU0KCAgLTksICAzMyksIEU0KCAgIDYsICA0MyksIEUyKCAgNDYsICA0NiksIEU0KCAgLTQsICA1MCksIEU0KCAtMjcsICAzNCksXAorICAgIEU0KCAtMjIsICA0NSksIEU0KCAgMzQsICA2OSksIEU0KCAgMTksICA3MCksIEU0KCAgNTMsICA3MyksIEU0KCAtMTcsICA2MiksXAorICAgIEU0KCAgIDUsICA3NyksIEUyKCAgODIsICA4MiksIEUyKCAtNTEsICA1MSksIEU0KCAtNDMsICA2NCksIEU0KCAtMTAsICA5MCksXAorICAgIEU0KCAgNDEsIDExNCksIEU0KCAgNjQsIDExNiksIEU0KCAtMzcsICA4MiksIEU0KCAgMjIsIDExOSksIEU0KCAgOTUsIDEyNCksXAorICAgIEU0KCAtMzAsIDExMSksIEU0KCAtNzgsICA5MiksIEU0KCAtNjgsIDExMyksIEUyKCAgMTgsICAxOCksIEUyKCAgMzQsICAzNCksXAorICAgIEUyKCAgNjMsICA2MyksIEUyKCAxMDksIDEwOSkKKworI2RlZmluZSBUQUJfMV8zIFwKKyAgICBQRCggICAwLCAgIDApLCBFMiggICA0LCAgIDQpLCBFNCggIC0xLCAgIDUpLCBFNCggICAzLCAgMTApLCBFMiggICA5LCAgIDkpLFwKKyAgICBFMiggIC03LCAgIDcpLCBFNCggIC0zLCAgMTIpLCBFNCggICA4LCAgMTcpLCBFMiggIDE3LCAgMTcpLCBFNCggICAxLCAgMTkpLFwKKyAgICBFNCggLTExLCAgMTYpLCBFNCggIC02LCAgMjMpLCBFNCggIDE4LCAgMzEpLCBFNCggICA4LCAgMzIpLCBFMiggIDMzLCAgMzMpLFwKKyAgICBFNCggIC0xLCAgMzYpLCBFMiggLTIzLCAgMjMpLCBFNCggLTE3LCAgMzEpLCBFNCggIDIxLCAgNTQpLCBFNCggIDM3LCAgNTUpLFwKKyAgICBFNCggLTEyLCAgNDQpLCBFNCggICA4LCAgNTcpLCBFMiggIDYxLCAgNjEpLCBFNCggIC01LCAgNjYpLCBFNCggLTM2LCAgNDUpLFwKKyAgICBFNCggLTI5LCAgNjApLCBFNCggIDQ1LCAgOTIpLCBFNCggIDI1LCAgOTMpLCBFNCggIDcxLCAgOTcpLCBFNCggLTIyLCAgODMpLFwKKyAgICBFNCggICA3LCAxMDIpLCBFMiggMTA5LCAxMDkpLCBFMiggLTY4LCAgNjgpLCBFNCggLTU3LCAgODUpLCBFNCggLTEzLCAxMjApLFwKKyAgICBFNCggLTQ5LCAxMTApLCBFNCgtMTA0LCAxMjMpLCBFMiggIDI0LCAgMjQpLCBFMiggIDQ2LCAgNDYpLCBFMiggIDg0LCAgODQpCisKKyNkZWZpbmUgVEFCXzFfNCBcCisgICAgUEQoICAgMCwgICAwKSwgRTIoICAgNSwgICA1KSwgRTQoICAtMiwgICA3KSwgRTIoICAxMSwgIDExKSwgRTQoICAgMywgIDEzKSxcCisgICAgRTIoICAtOSwgICA5KSwgRTQoICAtNCwgIDE1KSwgRTQoICAxMSwgIDIyKSwgRTIoICAyMSwgIDIxKSwgRTQoICAgMiwgIDI0KSxcCisgICAgRTQoIC0xNCwgIDIwKSwgRTQoICAyMywgIDM4KSwgRTQoICAtOCwgIDI5KSwgRTQoICAxMSwgIDM5KSwgRTIoICA0MSwgIDQxKSxcCisgICAgRTQoICAtMSwgIDQ1KSwgRTIoIC0yOSwgIDI5KSwgRTQoIC0yMiwgIDM5KSwgRTQoICAyNywgIDY3KSwgRTQoICA0NywgIDY5KSxcCisgICAgRTQoIC0xNSwgIDU2KSwgRTQoICAxMSwgIDcxKSwgRTIoICA3NiwgIDc2KSwgRTQoICAtNiwgIDgzKSwgRTQoIC00NSwgIDU3KSxcCisgICAgRTQoIC0zNiwgIDc1KSwgRTQoICA1NiwgMTE1KSwgRTQoICAzMSwgMTE3KSwgRTQoICA4OCwgMTIyKSwgRTQoIC0yOCwgMTA0KSxcCisgICAgRTIoIC04NSwgIDg1KSwgRTQoIC03MiwgMTA2KSwgRTIoICAzMCwgIDMwKSwgRTIoICA1OCwgIDU4KSwgRTIoIDEwNSwgMTA1KQorCisjZGVmaW5lIFRBQl8xXzUgXAorICAgIFBEKCAgIDAsICAgMCksIEUyKCAgIDYsICAgNiksIEU0KCAgLTIsICAgOCksIEUyKCAgMTMsICAxMyksIEU0KCAgIDQsICAxNSksXAorICAgIEUyKCAtMTEsICAxMSksIEU0KCAgLTUsICAxOCksIEU0KCAgMTMsICAyNiksIEUyKCAgMjYsICAyNiksIEU0KCAgIDIsICAyOSksXAorICAgIEU0KCAtMTYsICAyNCksIEU0KCAgMjgsICA0NiksIEU0KCAgLTksICAzNSksIEU0KCAgMTMsICA0NyksIEUyKCAgNDksICA0OSksXAorICAgIEU0KCAgLTEsICA1NCksIEUyKCAtMzUsICAzNSksIEU0KCAtMjYsICA0NyksIEU0KCAgMzIsICA4MSksIEU0KCAgNTYsICA4MyksXAorICAgIEU0KCAtMTgsICA2NyksIEU0KCAgMTMsICA4NiksIEUyKCAgOTEsICA5MSksIEU0KCAgLTcsICA5OSksIEU0KCAtNTQsICA2OCksXAorICAgIEU0KCAtNDQsICA5MCksIEU0KCAtMzMsIDEyNCksIEUyKC0xMDMsIDEwMyksIEU0KCAtODYsIDEyNyksIEUyKCAgMzcsICAzNyksXAorICAgIEUyKCAgNjksICA2OSkKKworI2RlZmluZSBUQUJfMV82IFwKKyAgICBQRCggICAwLCAgIDApLCBFMiggICA3LCAgIDcpLCBFNCggIC0zLCAgMTApLCBFMiggIDE2LCAgMTYpLCBFNCggICA1LCAgMTgpLFwKKyAgICBFMiggLTEzLCAgMTMpLCBFNCggIC02LCAgMjEpLCBFNCggIDE1LCAgMzApLCBFMiggIDMwLCAgMzApLCBFNCggICAyLCAgMzQpLFwKKyAgICBFNCggLTE5LCAgMjgpLCBFNCggIDMyLCAgNTQpLCBFNCggLTExLCAgNDEpLCBFNCggIDE1LCAgNTUpLCBFMiggIDU3LCAgNTcpLFwKKyAgICBFNCggIC0xLCAgNjMpLCBFMiggLTQwLCAgNDApLCBFNCggLTMwLCAgNTUpLCBFNCggIDM3LCAgOTQpLCBFNCggIDY1LCAgOTYpLFwKKyAgICBFNCggLTIxLCAgNzgpLCBFNCggIDE1LCAxMDApLCBFMiggMTA2LCAxMDYpLCBFNCggIC04LCAxMTYpLCBFNCggLTYzLCAgNzkpLFwKKyAgICBFNCggLTUxLCAxMDUpLCBFMigtMTIwLCAxMjApLCBFMiggIDQzLCAgNDMpLCBFMiggIDgwLCAgODApCisKKyNkZWZpbmUgVEFCXzFfNyBcCisgICAgUEQoICAgMCwgICAwKSwgRTIoICAgOCwgICA4KSwgRTQoICAtMywgIDExKSwgRTIoICAxOCwgIDE4KSwgRTQoICAgNSwgIDIwKSxcCisgICAgRTIoIC0xNSwgIDE1KSwgRTQoICAtNywgIDI0KSwgRTQoICAxNywgIDM1KSwgRTIoICAzNCwgIDM0KSwgRTQoICAgMywgIDM4KSxcCisgICAgRTQoIC0yMiwgIDMyKSwgRTQoICAzNywgIDYxKSwgRTQoIC0xMywgIDQ3KSwgRTQoICAxNywgIDYzKSwgRTIoICA2NSwgIDY1KSxcCisgICAgRTQoICAtMSwgIDcyKSwgRTIoIC00NiwgIDQ2KSwgRTQoIC0zNSwgIDYzKSwgRTQoICA0MywgMTA3KSwgRTQoICA3NSwgMTEwKSxcCisgICAgRTQoIC0yNCwgIDg5KSwgRTQoICAxNywgMTE0KSwgRTIoIDEyMSwgMTIxKSwgRTQoIC03MiwgIDkxKSwgRTQoIC01OCwgMTIwKSxcCisgICAgRTIoICA0OSwgIDQ5KSwgRTIoICA5MiwgIDkyKQorCisjZGVmaW5lIFRBQl8xXzggXAorICAgIFBEKCAgIDAsICAgMCksIEUyKCAgIDksICAgOSksIEU0KCAgLTMsICAxMiksIEUyKCAgMjAsICAyMCksIEU0KCAgIDYsICAyMyksXAorICAgIEUyKCAtMTcsICAxNyksIEU0KCAgLTcsICAyNyksIEU0KCAgMTksICAzOSksIEUyKCAgMzksICAzOSksIEU0KCAgIDMsICA0MyksXAorICAgIEU0KCAtMjQsICAzNiksIEU0KCAgNDIsICA2OSksIEU0KCAtMTQsICA1MyksIEU0KCAgMTksICA3MSksIEUyKCAgNzMsICA3MyksXAorICAgIEU0KCAgLTIsICA4MCksIEUyKCAtNTIsICA1MiksIEU0KCAtMzksICA3MCksIEU0KCAgNDgsIDEyMSksIEU0KCAgODQsIDEyNCksXAorICAgIEU0KCAtMjcsIDEwMCksIEU0KCAtODEsIDEwMiksIEUyKCAgNTUsICA1NSksIEUyKCAxMDQsIDEwNCkKKworI2RlZmluZSBUQUJfMl8xIFwKKyAgICBQRCggICAwLCAgIDApLCBFMiggICAyLCAgIDIpLCBFNCggICAwLCAgIDIpLCBFMiggICA0LCAgIDQpLCBFNCggICAwLCAgIDQpLFwKKyAgICBFMiggIC00LCAgIDQpLCBFNCggIC0yLCAgIDYpLCBFNCggICA0LCAgIDgpLCBFMiggICA4LCAgIDgpLCBFNCggICAwLCAgMTApLFwKKyAgICBFNCggIC00LCAgIDgpLCBFNCggICA4LCAgMTQpLCBFNCggIC0yLCAgMTIpLCBFNCggICA0LCAgMTYpLCBFMiggIDE2LCAgMTYpLFwKKyAgICBFNCggICAwLCAgMTgpLCBFMiggLTEyLCAgMTIpLCBFNCggIC04LCAgMTYpLCBFNCggIDEwLCAgMjYpLCBFNCggIDE4LCAgMjgpLFwKKyAgICBFNCggIC02LCAgMjIpLCBFNCggICA0LCAgMjgpLCBFMiggIDMwLCAgMzApLCBFNCggIC0yLCAgMzIpLCBFNCggLTE4LCAgMjIpLFwKKyAgICBFNCggLTE0LCAgMzApLCBFNCggIDIyLCAgNDYpLCBFNCggIDEyLCAgNDYpLCBFNCggIDM0LCAgNDgpLCBFNCggLTEwLCAgNDApLFwKKyAgICBFNCggICA0LCAgNTApLCBFMiggIDU0LCAgNTQpLCBFMiggLTM0LCAgMzQpLCBFNCggLTI4LCAgNDIpLCBFNCggIC02LCAgNjApLFwKKyAgICBFNCggIDI2LCAgNzYpLCBFNCggIDQyLCAgNzYpLCBFNCggLTI0LCAgNTQpLCBFNCggIDE0LCAgNzgpLCBFNCggIDYyLCAgODIpLFwKKyAgICBFNCggLTIwLCAgNzQpLCBFNCggICAyLCAgODgpLCBFMiggIDkyLCAgOTIpLCBFNCggLTUyLCAgNjApLCBFNCggIDUyLCAxMTgpLFwKKyAgICBFNCggLTQ0LCAgNzQpLCBFNCggIDc0LCAxMTgpLCBFNCggIDMyLCAxMTgpLCBFNCggLTEyLCAxMDIpLCBFNCggLTQwLCAgOTYpLFwKKyAgICBFNCggLTM0LCAxMTgpLCBFMiggLTg4LCAgODgpLCBFNCggLTc4LCAxMDQpLCBFMiggIDEyLCAgMTIpLCBFMiggIDIyLCAgMjIpLFwKKyAgICBFMiggIDQyLCAgNDIpLCBFMiggIDcyLCAgNzIpCisKKyNkZWZpbmUgVEFCXzJfMiBcCisgICAgUEQoICAgMCwgICAwKSwgRTIoICAgMywgICAzKSwgRTQoICAgMCwgICAzKSwgRTIoICAgNiwgICA2KSwgRTQoICAgMywgICA5KSxcCisgICAgRTQoICAtMywgICA5KSwgRTIoICAtNiwgICA2KSwgRTQoICAgNiwgIDEyKSwgRTIoICAxMiwgIDEyKSwgRTQoICAgMCwgIDE1KSxcCisgICAgRTQoICAtOSwgIDEyKSwgRTQoICAxNSwgIDI0KSwgRTQoICAtNiwgIDE4KSwgRTQoICAgNiwgIDI0KSwgRTIoICAyNCwgIDI0KSxcCisgICAgRTQoICAgMCwgIDI3KSwgRTIoIC0xOCwgIDE4KSwgRTQoIC0xMiwgIDI0KSwgRTQoICAxNSwgIDM5KSwgRTQoICAyNywgIDQyKSxcCisgICAgRTQoICAtOSwgIDMzKSwgRTQoICAgNiwgIDQyKSwgRTIoICA0NSwgIDQ1KSwgRTQoICAtMywgIDUxKSwgRTQoIC0yNywgIDMzKSxcCisgICAgRTQoIC0yMSwgIDQ1KSwgRTQoICAzMywgIDY5KSwgRTQoICAxOCwgIDY5KSwgRTQoICA1NCwgIDcyKSwgRTQoIC0xOCwgIDYzKSxcCisgICAgRTQoICAgNiwgIDc4KSwgRTIoICA4MSwgIDgxKSwgRTIoIC01MSwgIDUxKSwgRTQoIC00MiwgIDYzKSwgRTQoICAtOSwgIDkwKSxcCisgICAgRTQoICA0MiwgMTE0KSwgRTQoICA2MywgMTE3KSwgRTQoIC0zNiwgIDgxKSwgRTQoICAyMSwgMTIwKSwgRTQoICA5NiwgMTIzKSxcCisgICAgRTQoIC0zMCwgMTExKSwgRTQoIC03OCwgIDkzKSwgRTQoIC02OSwgMTE0KSwgRTIoICAxOCwgIDE4KSwgRTIoICAzMywgIDMzKSxcCisgICAgRTIoICA2MywgIDYzKSwgRTIoIDEwOCwgMTA4KQorCisjZGVmaW5lIFRBQl8yXzMgXAorICAgIFBEKCAgIDAsICAgMCksIEUyKCAgIDQsICAgNCksIEU0KCAgIDAsICAgNCksIEU0KCAgIDQsICAgOCksIEUyKCAgIDgsICAgOCksXAorICAgIEUyKCAgLTgsICAgOCksIEU0KCAgLTQsICAxMiksIEU0KCAgIDgsICAxNiksIEUyKCAgMTYsICAxNiksIEU0KCAgIDAsICAyMCksXAorICAgIEU0KCAtMTIsICAxNiksIEU0KCAgLTQsICAyNCksIEU0KCAgMTYsICAzMiksIEU0KCAgIDgsICAzMiksIEUyKCAgMzIsICAzMiksXAorICAgIEU0KCAgIDAsICAzNiksIEUyKCAtMjQsICAyNCksIEU0KCAtMTYsICAzMiksIEU0KCAgMjAsICA1MiksIEU0KCAgMzYsICA1NiksXAorICAgIEU0KCAtMTIsICA0NCksIEU0KCAgIDgsICA1NiksIEUyKCAgNjAsICA2MCksIEU0KCAgLTQsICA2NCksIEU0KCAtMzYsICA0NCksXAorICAgIEU0KCAtMjgsICA2MCksIEU0KCAgNDQsICA5MiksIEU0KCAgMjQsICA5MiksIEU0KCAgNzIsICA5NiksIEU0KCAtMjAsICA4NCksXAorICAgIEU0KCAgIDgsIDEwMCksIEUyKCAxMDgsIDEwOCksIEUyKCAtNjgsICA2OCksIEU0KCAtNTYsICA4NCksIEU0KCAtMTIsIDEyMCksXAorICAgIEU0KCAtNDgsIDEwOCksIEU0KC0xMDQsIDEyNCksIEUyKCAgMjQsICAyNCksIEUyKCAgNDQsICA0NCksIEUyKCAgODQsICA4NCkKKworI2RlZmluZSBUQUJfMl80IFwKKyAgICBQRCggICAwLCAgIDApLCBFMiggICA1LCAgIDUpLCBFNCggICAwLCAgIDUpLCBFMiggIDEwLCAgMTApLCBFNCggICA1LCAgMTUpLFwKKyAgICBFMiggLTEwLCAgMTApLCBFNCggIC01LCAgMTUpLCBFNCggIDEwLCAgMjApLCBFMiggIDIwLCAgMjApLCBFNCggICAwLCAgMjUpLFwKKyAgICBFNCggLTE1LCAgMjApLCBFNCggIDI1LCAgNDApLCBFNCggLTEwLCAgMzApLCBFNCggIDEwLCAgNDApLCBFMiggIDQwLCAgNDApLFwKKyAgICBFNCggICAwLCAgNDUpLCBFMiggLTMwLCAgMzApLCBFNCggLTIwLCAgNDApLCBFNCggIDI1LCAgNjUpLCBFNCggIDQ1LCAgNzApLFwKKyAgICBFNCggLTE1LCAgNTUpLCBFNCggIDEwLCAgNzApLCBFMiggIDc1LCAgNzUpLCBFNCggIC01LCAgODUpLCBFNCggLTQ1LCAgNTUpLFwKKyAgICBFNCggLTM1LCAgNzUpLCBFNCggIDU1LCAxMTUpLCBFNCggIDMwLCAxMTUpLCBFNCggIDkwLCAxMjApLCBFNCggLTMwLCAxMDUpLFwKKyAgICBFMiggLTg1LCAgODUpLCBFNCggLTcwLCAxMDUpLCBFMiggIDMwLCAgMzApLCBFMiggIDYwLCAgNjApLCBFMiggMTA1LCAxMDUpCisKKyNkZWZpbmUgVEFCXzJfNSBcCisgICAgUEQoICAgMCwgICAwKSwgRTIoICAgNiwgICA2KSwgRTQoICAgMCwgICA2KSwgRTIoICAxMiwgIDEyKSwgRTQoICAgNiwgIDEyKSxcCisgICAgRTIoIC0xMiwgIDEyKSwgRTQoICAtNiwgIDE4KSwgRTQoICAxMiwgIDI0KSwgRTIoICAyNCwgIDI0KSwgRTQoICAgMCwgIDMwKSxcCisgICAgRTQoIC0xOCwgIDI0KSwgRTQoICAzMCwgIDQ4KSwgRTQoICAtNiwgIDM2KSwgRTQoICAxMiwgIDQ4KSwgRTIoICA0OCwgIDQ4KSxcCisgICAgRTQoICAgMCwgIDU0KSwgRTIoIC0zNiwgIDM2KSwgRTQoIC0yNCwgIDQ4KSwgRTQoICAzMCwgIDc4KSwgRTQoICA1NCwgIDg0KSxcCisgICAgRTQoIC0xOCwgIDY2KSwgRTQoICAxMiwgIDg0KSwgRTIoICA5MCwgIDkwKSwgRTQoICAtNiwgIDk2KSwgRTQoIC01NCwgIDY2KSxcCisgICAgRTQoIC00MiwgIDkwKSwgRTQoIC0zMCwgMTI2KSwgRTIoLTEwMiwgMTAyKSwgRTQoIC04NCwgMTI2KSwgRTIoICAzNiwgIDM2KSxcCisgICAgRTIoICA2NiwgIDY2KQorCisjZGVmaW5lIFRBQl8yXzYgXAorICAgIFBEKCAgIDAsICAgMCksIEUyKCAgIDcsICAgNyksIEU0KCAgIDAsICAgNyksIEUyKCAgMTQsICAxNCksIEU0KCAgIDcsICAyMSksXAorICAgIEUyKCAtMTQsICAxNCksIEU0KCAgLTcsICAyMSksIEU0KCAgMTQsICAyOCksIEUyKCAgMjgsICAyOCksIEU0KCAgIDAsICAzNSksXAorICAgIEU0KCAtMjEsICAyOCksIEU0KCAgMzUsICA1NiksIEU0KCAtMTQsICA0MiksIEU0KCAgMTQsICA1NiksIEUyKCAgNTYsICA1NiksXAorICAgIEU0KCAgIDAsICA2MyksIEUyKCAtNDIsICA0MiksIEU0KCAtMjgsICA1NiksIEU0KCAgMzUsICA5MSksIEU0KCAgNjMsICA5OCksXAorICAgIEU0KCAtMjEsICA3NyksIEU0KCAgMTQsICA5OCksIEUyKCAxMDUsIDEwNSksIEU0KCAgLTcsIDExOSksIEU0KCAtNjMsICA3NyksXAorICAgIEU0KCAtNDksIDEwNSksIEUyKC0xMTksIDExOSksIEUyKCAgNDIsICA0MiksIEUyKCAgNzcsICA3NykKKworI2RlZmluZSBUQUJfMl83IFwKKyAgICBQRCggICAwLCAgIDApLCBFMiggICA4LCAgIDgpLCBFNCggICAwLCAgIDgpLCBFMiggIDE2LCAgMTYpLCBFNCggICA4LCAgMTYpLFwKKyAgICBFMiggLTE2LCAgMTYpLCBFNCggIC04LCAgMjQpLCBFNCggIDE2LCAgMzIpLCBFMiggIDMyLCAgMzIpLCBFNCggICAwLCAgNDApLFwKKyAgICBFNCggLTI0LCAgMzIpLCBFNCggIDQwLCAgNjQpLCBFNCggLTE2LCAgNDgpLCBFNCggIDE2LCAgNjQpLCBFMiggIDY0LCAgNjQpLFwKKyAgICBFNCggICAwLCAgNzIpLCBFMiggLTQ4LCAgNDgpLCBFNCggLTMyLCAgNjQpLCBFNCggIDQwLCAxMDQpLCBFNCggIDcyLCAxMTIpLFwKKyAgICBFNCggLTI0LCAgODgpLCBFNCggIDE2LCAxMTIpLCBFMiggMTIwLCAxMjApLCBFNCggLTcyLCAgODgpLCBFNCggLTU2LCAxMjApLFwKKyAgICBFMiggIDQ4LCAgNDgpLCBFMiggIDg4LCAgODgpCisKKyNkZWZpbmUgVEFCXzJfOCBcCisgICAgUEQoICAgMCwgICAwKSwgRTIoICAgOSwgICA5KSwgRTQoICAgMCwgICA5KSwgRTIoICAxOCwgIDE4KSwgRTQoICAgOSwgIDI3KSxcCisgICAgRTIoIC0xOCwgIDE4KSwgRTQoICAtOSwgIDI3KSwgRTQoICAxOCwgIDM2KSwgRTIoICAzNiwgIDM2KSwgRTQoICAgMCwgIDQ1KSxcCisgICAgRTQoIC0yNywgIDM2KSwgRTQoICA0NSwgIDcyKSwgRTQoIC0xOCwgIDU0KSwgRTQoICAxOCwgIDcyKSwgRTIoICA3MiwgIDcyKSxcCisgICAgRTQoICAgMCwgIDgxKSwgRTIoIC01NCwgIDU0KSwgRTQoIC0zNiwgIDcyKSwgRTQoICA0NSwgMTE3KSwgRTQoICA4MSwgMTI2KSxcCisgICAgRTQoIC0yNywgIDk5KSwgRTQoIC04MSwgIDk5KSwgRTIoICA1NCwgIDU0KSwgRTIoIDEwOCwgMTA4KQorCisjZGVmaW5lIFRBQl8zXzEgXAorICAgIFBEKCAgIDAsICAgMCksIEUyKCAgIDIsICAgMiksIEU0KCAgIDAsICAgMyksIEUyKCAgIDYsICAgNiksIEU0KCAgIDAsICAgNyksXAorICAgIEUyKCAgLTUsICAgNSksIEUyKCAgIDUsICAtNSksIEU0KCAgIDYsICAxMSksIEU0KCAgIDAsICAgOCksIEUyKCAgMTEsICAxMSksXAorICAgIEU0KCAgIDAsICAxMiksIEU0KCAgMTIsICAxNyksIEUyKCAgMTcsICAxNyksIEU0KCAgIDYsICAxOCksIEU0KCAgLTgsICAxMSksXAorICAgIEU0KCAgIDAsICAxNSksIEU0KCAgIDAsICAyMCksIEU0KCAgMTgsICAyNSksIEU0KCAgMTEsICAyNSksIEUyKCAgMjUsICAyNSksXAorICAgIEUyKCAtMTQsICAxNCksIEUyKCAgMTQsIC0xNCksIEU0KCAgIDAsICAyNiksIEU0KCAtMTEsICAxOCksIEU0KCAgLTcsICAyMiksXAorICAgIEU0KCAgMjYsICAzNCksIEU0KCAgMTgsICAzNCksIEUyKCAgMzQsICAzNCksIEU0KCAgMTEsICAzNSksIEU0KCAgIDAsICAyOSksXAorICAgIEU0KCAtMTksICAyMiksIEU0KCAtMTUsICAyNiksIEU0KCAgIDAsICAzNyksIEU0KCAgMjcsICA0NCksIEU0KCAgMzYsICA0NCksXAorICAgIEU0KCAgMTgsICA0NCksIEU0KCAtMTAsICAzMyksIEUyKCAgNDUsICA0NSkKKworI2RlZmluZSBUQUJfM18yIFwKKyAgICBQRCggICAwLCAgIDApLCBFNCggICAwLCAgIDIpLCBFMiggICAyLCAgIDIpLCBFMiggICA2LCAgIDYpLCBFNCggICAwLCAgIDYpLFwKKyAgICBFMiggIC00LCAgIDQpLCBFMiggIDEwLCAgLTYpLCBFMiggICAwLCAtMTIpLCBQRCggIC02LCAtMTIpLCBFMiggICA2LCAtMTIpLFwKKyAgICBQRCggICA2LCAgMTIpLCBFMiggLTE0LCAgIDApLCBFMiggIDEyLCAgMTIpLCBFMiggICAwLCAtMTgpLCBFMiggIDE0LCAtMTIpLFwKKyAgICBQRCggLTE4LCAgLTYpLCBFMiggIDE4LCAgLTYpLCBQRCggIDE4LCAgIDYpLCBQRCggLTEwLCAtMTgpLCBFMiggIDEwLCAtMTgpLFwKKyAgICBQRCggIDEwLCAgMTgpLCBFMiggLTIyLCAgIDApLCBFMiggICAwLCAtMjQpLCBQRCggLTIyLCAtMTIpLCBFMiggIDIyLCAtMTIpLFwKKyAgICBQRCggIDIyLCAgMTIpLCBQRCggIC04LCAtMjQpLCBFMiggICA4LCAtMjQpLCBQRCggICA4LCAgMjQpLCBQRCggLTI2LCAgLTYpLFwKKyAgICBFMiggIDI2LCAgLTYpLCBQRCggIDI2LCAgIDYpLCBFMiggLTI4LCAgIDApLCBFMiggIDIwLCAgMjApLCBFMiggLTE0LCAtMjYpLFwKKyAgICBFMiggLTMwLCAtMTIpLCBFMiggLTEwLCAtMzIpLCBFMiggLTE4LCAtMzIpLCBFMiggLTI2LCAtMjYpLCBFMiggLTM0LCAtMjApLFwKKyAgICBFMiggLTM4LCAtMTIpLCBFMiggLTMyLCAtMzIpLCBQRCggIDMyLCAgMzIpLCBQRCggLTIyLCAtNDApLCBFMiggLTM0LCAtMzQpCisKKyNkZWZpbmUgVEFCXzNfMyBcCisgICAgUEQoICAgMCwgICAwKSwgRTQoICAgMCwgICAyKSwgRTIoICAgNCwgICA0KSwgRTIoICAxMCwgIDEwKSwgRTQoICAgMCwgIDEwKSxcCisgICAgRTIoICAtNiwgICA2KSwgRTIoICAxNCwgIC04KSwgRTIoIC0xOCwgICAwKSwgRTIoICAxMCwgLTE2KSwgRTIoICAgMCwgLTI0KSxcCisgICAgUEQoIC0yNCwgIC04KSwgRTIoICAyNCwgIC04KSwgUEQoICAyNCwgICA4KSwgRTIoICAxOCwgIDE4KSwgRTIoICAyMCwgLTE2KSxcCisgICAgUEQoIC0xNCwgLTI2KSwgRTIoICAxNCwgLTI2KSwgUEQoICAxNCwgIDI2KSwgRTIoIC0zMCwgICAwKSwgRTIoICAgMCwgLTM0KSxcCisgICAgUEQoIC0zNCwgIC04KSwgRTIoICAzNCwgIC04KSwgUEQoICAzNCwgICA4KSwgUEQoIC0zMCwgLTE4KSwgRTIoICAzMCwgLTE4KSxcCisgICAgUEQoICAzMCwgIDE4KSwgUEQoIC0xMCwgLTM0KSwgRTIoICAxMCwgLTM0KSwgUEQoICAxMCwgIDM0KSwgRTIoIC0yMCwgLTM0KSxcCisgICAgRTIoIC00MCwgICAwKSwgRTIoICAzMCwgIDMwKSwgRTIoIC00MCwgLTE4KSwgRTIoICAgMCwgLTQ0KSwgRTIoIC0xNiwgLTQ0KSxcCisgICAgUEQoIC0zNiwgLTM2KSwgRTIoIC0zNiwgLTM2KSwgRTIoIC0yNiwgLTQ0KSwgRTIoIC00NiwgLTI2KSwgRTIoIC01MiwgLTE4KSxcCisgICAgUEQoIC0yMCwgLTU0KSwgRTIoIC00NCwgLTQ0KSwgUEQoIC0zMiwgLTU0KSwgUEQoIC00NiwgLTQ2KSwgRTIoIC00NiwgLTQ2KQorCisjZGVmaW5lIFRBQl8zXzQgXAorICAgIFBEKCAgIDAsICAgMCksIEU0KCAgIDAsICAgNCksIEUyKCAgIDQsICAgNCksIEUyKCAgMTIsICAxMiksIEU0KCAgIDAsICAxMiksXAorICAgIEUyKCAgLTgsICAgOCksIEUyKCAgIDgsIC0xNiksIEUyKCAgIDAsIC0yNCksIFBEKCAtMjQsICAtOCksIEUyKCAgMjQsICAtOCksXAorICAgIFBEKCAgMjQsICAgOCksIEUyKCAgMjAsIC0xNiksIEUyKCAtMjgsICAgMCksIFBEKCAtMTYsIC0yNCksIEUyKCAgMTYsIC0yNCksXAorICAgIFBEKCAgMTYsICAyNCksIEUyKCAgIDAsIC0zMiksIFBEKCAtMjgsIC0xNiksIEUyKCAgMjgsIC0xNiksIFBEKCAgMjgsICAxNiksXAorICAgIFBEKCAgLTgsIC0zMiksIFBEKCAgIDgsIC0zMiksIFBEKCAtMzIsICAtOCksIEUyKCAgMzIsICAtOCksIFBEKCAgMzIsICAgOCksXAorICAgIFBEKCAgLTgsICAzMiksIFBEKCAgIDgsICAzMiksIEUyKCAgMjQsICAyNCksIEUyKCAgMjQsIC0yNCksIEUyKCAtMjAsIC0zMiksXAorICAgIEUyKCAtNDAsICAgMCksIEUyKCAtNDAsIC0xNiksIFBEKCAgIDAsIC00NCksIFBEKCAgIDAsIC00NCksIEUyKCAtNDQsICAgMCksXAorICAgIFBEKCAgIDAsICA0NCksIFBEKCAgIDAsICA0NCksIEUyKCAtMzIsIC0zMiksIEUyKCAtMTYsIC00NCksIFBEKCAtMjQsIC00NCksXAorICAgIEUyKCAtNDQsIC0yNCksIFBEKCAgMjQsICA0NCksIEUyKCAtNDgsIC0xNiksIFBEKCAtMzYsIC0zNiksIEUyKCAtMzYsIC0zNiksXAorICAgIFBEKCAgMzYsICAzNiksIFBEKCAtMjAsIC01MiksIEUyKCAgNDAsICA0MCksIFBEKCAtMzIsIC01MikKKworI2RlZmluZSBUQUJfM181IFwKKyAgICBQRCggICAwLCAgIDApLCBFMiggICAyLCAgIDIpLCBFMiggICA2LCAgIDYpLCBFMiggIDEyLCAgMTIpLCBFMiggIDIwLCAgMjApLFwKKyAgICBFMiggIDMyLCAgMzIpLCBFMiggIDQ2LCAgNDYpCisKKworLyoqCisgKiBQYWNrIHR3byBkZWx0YSB2YWx1ZXMgKGEsYikgaW50byBvbmUgMTZiaXQgd29yZAorICogYWNjb3JkaW5nIHdpdGggZW5kaWFubmVzcyBvZiB0aGUgaG9zdCBtYWNoaW5lLgorICovCisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgUEQoYSxiKSAoKChhKSA8PCA4KSArIChiKSkKKyNlbHNlCisjZGVmaW5lIFBEKGEsYikgKCgoYikgPDwgOCkgKyAoYSkpCisjZW5kaWYKKworLyoqCisgKiBFeHBhbmQgYSBwYWlyIG9mIGRlbHRhIHZhbHVlcyAoYSxiKQorICogaW50byB0d28vZm91ciBkZWx0YSBlbnRyaWVzLgorICovCisjZGVmaW5lIEUyKGEsIGIpIFBEKGEsIGIpLCBQRCgtKGEpLCAtKGIpKQorI2RlZmluZSBFNChhLCBiKSBQRChhLCBiKSwgUEQoLShhKSwgLShiKSksIFBEKGIsIGEpLCBQRCgtKGIpLCAtKGEpKQorCisvKgorICogVlEgdGFibGVzIGZvciA0eDQgYmxvY2sgbW9kZXMuCisgKiBMZXQgdGhlIGNvbXBpbGVyIGRlY29tcHJlc3MgYW5kIGJ1aWxkIHRoZSB0YWJsZXMgZm9yIHVzLgorICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBkZWx0YV90YWJfMV8xWzE5NV0gPSB7IFRBQl8xXzEgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRlbHRhX3RhYl8xXzJbMTU5XSA9IHsgVEFCXzFfMiB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgZGVsdGFfdGFiXzFfM1sxMzNdID0geyBUQUJfMV8zIH07CitzdGF0aWMgY29uc3QgaW50MTZfdCBkZWx0YV90YWJfMV80WzExNV0gPSB7IFRBQl8xXzQgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRlbHRhX3RhYl8xXzVbMTAxXSA9IHsgVEFCXzFfNSB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgZGVsdGFfdGFiXzFfNls5M10gID0geyBUQUJfMV82IH07CitzdGF0aWMgY29uc3QgaW50MTZfdCBkZWx0YV90YWJfMV83Wzg3XSAgPSB7IFRBQl8xXzcgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRlbHRhX3RhYl8xXzhbNzddICA9IHsgVEFCXzFfOCB9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBkZWx0YV90YWJfMl8xWzE5NV0gPSB7IFRBQl8yXzEgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRlbHRhX3RhYl8yXzJbMTU5XSA9IHsgVEFCXzJfMiB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgZGVsdGFfdGFiXzJfM1sxMzNdID0geyBUQUJfMl8zIH07CitzdGF0aWMgY29uc3QgaW50MTZfdCBkZWx0YV90YWJfMl80WzExNV0gPSB7IFRBQl8yXzQgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRlbHRhX3RhYl8yXzVbMTAxXSA9IHsgVEFCXzJfNSB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgZGVsdGFfdGFiXzJfNls5M10gID0geyBUQUJfMl82IH07CitzdGF0aWMgY29uc3QgaW50MTZfdCBkZWx0YV90YWJfMl83Wzg3XSAgPSB7IFRBQl8yXzcgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRlbHRhX3RhYl8yXzhbNzddICA9IHsgVEFCXzJfOCB9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBkZWx0YV90YWJfM18xWzEyOF0gPSB7IFRBQl8zXzEgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRlbHRhX3RhYl8zXzJbNzldICA9IHsgVEFCXzNfMiB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgZGVsdGFfdGFiXzNfM1s3OV0gID0geyBUQUJfM18zIH07CitzdGF0aWMgY29uc3QgaW50MTZfdCBkZWx0YV90YWJfM180Wzc5XSAgPSB7IFRBQl8zXzQgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRlbHRhX3RhYl8zXzVbNzldICA9IHsgVEFCXzNfNSB9OworCisjdW5kZWYgUEQKKworLyoqCisgKiBQYWNrIGZvdXIgZGVsdGEgdmFsdWVzIChhLGEsYixiKSBpbnRvIG9uZSAzMmJpdCB3b3JkCisgKiBhY2NvcmRpbmcgd2l0aCBlbmRpYW5uZXNzIG9mIHRoZSBob3N0IG1hY2hpbmUuCisgKi8KKyNpZiBIQVZFX0JJR0VORElBTgorI2RlZmluZSBQRChhLGIpICgoKGEpIDw8IDI0KSArICgoYSkgPDwgMTYpICsgKChiKSA8PCA4KSArIChiKSkKKyNlbHNlCisjZGVmaW5lIFBEKGEsYikgKCgoYikgPDwgMjQpICsgKChiKSA8PCAxNikgKyAoKGEpIDw8IDgpICsgKGEpKQorI2VuZGlmCisKKy8qCisgKiBWUSB0YWJsZXMgZm9yIDh4OCBibG9jayBtb2Rlcy4KKyAqIFRob3NlIGFyZSBiYXNlZCBvbiB0aGUgc2FtZSBkZWx0YSB0YWJsZXMgYnkgdXNpbmcKKyAqIGVhY2ggdmFsdWUgdHdpY2U6IEFCQ0QgLS0+IEFBQkJDQ0RELgorICovCitzdGF0aWMgY29uc3QgaW50MzJfdCBkZWx0YV90YWJfMV8xX20xMFsxOTVdID0geyBUQUJfMV8xIH07CitzdGF0aWMgY29uc3QgaW50MzJfdCBkZWx0YV90YWJfMV8yX20xMFsxNTldID0geyBUQUJfMV8yIH07CitzdGF0aWMgY29uc3QgaW50MzJfdCBkZWx0YV90YWJfMV8zX20xMFsxMzNdID0geyBUQUJfMV8zIH07CitzdGF0aWMgY29uc3QgaW50MzJfdCBkZWx0YV90YWJfMV80X20xMFsxMTVdID0geyBUQUJfMV80IH07CitzdGF0aWMgY29uc3QgaW50MzJfdCBkZWx0YV90YWJfMV81X20xMFsxMDFdID0geyBUQUJfMV81IH07CitzdGF0aWMgY29uc3QgaW50MzJfdCBkZWx0YV90YWJfMV82X20xMFs5M10gID0geyBUQUJfMV82IH07CitzdGF0aWMgY29uc3QgaW50MzJfdCBkZWx0YV90YWJfMV83X20xMFs4N10gID0geyBUQUJfMV83IH07CitzdGF0aWMgY29uc3QgaW50MzJfdCBkZWx0YV90YWJfMV84X20xMFs3N10gID0geyBUQUJfMV84IH07CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGRlbHRhX3RhYl8yXzFfbTEwWzE5NV0gPSB7IFRBQl8yXzEgfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGRlbHRhX3RhYl8yXzJfbTEwWzE1OV0gPSB7IFRBQl8yXzIgfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGRlbHRhX3RhYl8yXzNfbTEwWzEzM10gPSB7IFRBQl8yXzMgfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGRlbHRhX3RhYl8yXzRfbTEwWzExNV0gPSB7IFRBQl8yXzQgfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGRlbHRhX3RhYl8yXzVfbTEwWzEwMV0gPSB7IFRBQl8yXzUgfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGRlbHRhX3RhYl8yXzZfbTEwWzkzXSAgPSB7IFRBQl8yXzYgfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGRlbHRhX3RhYl8yXzdfbTEwWzg3XSAgPSB7IFRBQl8yXzcgfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGRlbHRhX3RhYl8yXzhfbTEwWzc3XSAgPSB7IFRBQl8yXzggfTsKKworc3RhdGljIGNvbnN0IGludDMyX3QgZGVsdGFfdGFiXzNfMV9tMTBbMTI4XSA9IHsgVEFCXzNfMSB9Oworc3RhdGljIGNvbnN0IGludDMyX3QgZGVsdGFfdGFiXzNfMl9tMTBbNzldICA9IHsgVEFCXzNfMiB9Oworc3RhdGljIGNvbnN0IGludDMyX3QgZGVsdGFfdGFiXzNfM19tMTBbNzldICA9IHsgVEFCXzNfMyB9Oworc3RhdGljIGNvbnN0IGludDMyX3QgZGVsdGFfdGFiXzNfNF9tMTBbNzldICA9IHsgVEFCXzNfNCB9Oworc3RhdGljIGNvbnN0IGludDMyX3QgZGVsdGFfdGFiXzNfNV9tMTBbNzldICA9IHsgVEFCXzNfNSB9OworCisKK3R5cGVkZWYgc3RydWN0IHZxRW50cnkgeworICAgIGNvbnN0IGludDE2X3QgICpkZWx0YXM7ICAgICAvLy88IGRlbHRhIHRhYmxlcyBmb3IgNHg0IGJsb2NrIG1vZGVzCisgICAgY29uc3QgaW50MzJfdCAgKmRlbHRhc19tMTA7IC8vLzwgZGVsdGEgdGFibGVzIGZvciA4eDggYmxvY2sgbW9kZXMKKyAgICB1aW50OF90ICAgICAgICBudW1fZHlhZHM7ICAgLy8vPCBudW1iZXIgb2YgdHdvLXBpeGVsIGRlbHRhcworICAgIHVpbnQ4X3QgICAgICAgIHF1YWRfZXhwOyAgICAvLy88IGxvZzIgb2YgZm91ci1waXhlbCBkZWx0YXMKK30gdnFFbnRyeTsKKworc3RhdGljIGNvbnN0IHZxRW50cnkgdnFfdGFiWzI0XSA9IHsKKyAgICAvKiBzZXQgMSAqLworICAgIHsgZGVsdGFfdGFiXzFfMSwgZGVsdGFfdGFiXzFfMV9tMTAsIDE5NSwgIDcgfSwKKyAgICB7IGRlbHRhX3RhYl8xXzIsIGRlbHRhX3RhYl8xXzJfbTEwLCAxNTksICA5IH0sCisgICAgeyBkZWx0YV90YWJfMV8zLCBkZWx0YV90YWJfMV8zX20xMCwgMTMzLCAxMCB9LAorICAgIHsgZGVsdGFfdGFiXzFfNCwgZGVsdGFfdGFiXzFfNF9tMTAsIDExNSwgMTEgfSwKKyAgICB7IGRlbHRhX3RhYl8xXzUsIGRlbHRhX3RhYl8xXzVfbTEwLCAxMDEsIDEyIH0sCisgICAgeyBkZWx0YV90YWJfMV82LCBkZWx0YV90YWJfMV82X20xMCwgIDkzLCAxMiB9LAorICAgIHsgZGVsdGFfdGFiXzFfNywgZGVsdGFfdGFiXzFfN19tMTAsICA4NywgMTIgfSwKKyAgICB7IGRlbHRhX3RhYl8xXzgsIGRlbHRhX3RhYl8xXzhfbTEwLCAgNzcsIDEzIH0sCisKKyAgICAvKiBzZXQgMiAqLworICAgIHsgZGVsdGFfdGFiXzJfMSwgZGVsdGFfdGFiXzJfMV9tMTAsIDE5NSwgIDcgfSwKKyAgICB7IGRlbHRhX3RhYl8yXzIsIGRlbHRhX3RhYl8yXzJfbTEwLCAxNTksICA5IH0sCisgICAgeyBkZWx0YV90YWJfMl8zLCBkZWx0YV90YWJfMl8zX20xMCwgMTMzLCAxMCB9LAorICAgIHsgZGVsdGFfdGFiXzJfNCwgZGVsdGFfdGFiXzJfNF9tMTAsIDExNSwgMTEgfSwKKyAgICB7IGRlbHRhX3RhYl8yXzUsIGRlbHRhX3RhYl8yXzVfbTEwLCAxMDEsIDEyIH0sCisgICAgeyBkZWx0YV90YWJfMl82LCBkZWx0YV90YWJfMl82X20xMCwgIDkzLCAxMiB9LAorICAgIHsgZGVsdGFfdGFiXzJfNywgZGVsdGFfdGFiXzJfN19tMTAsICA4NywgMTIgfSwKKyAgICB7IGRlbHRhX3RhYl8yXzgsIGRlbHRhX3RhYl8yXzhfbTEwLCAgNzcsIDEzIH0sCisKKyAgICAvKiBzZXQgMyAqLworICAgIHsgZGVsdGFfdGFiXzNfMSwgZGVsdGFfdGFiXzNfMV9tMTAsIDEyOCwgMTEgfSwKKyAgICB7IGRlbHRhX3RhYl8zXzIsIGRlbHRhX3RhYl8zXzJfbTEwLCAgNzksIDEzIH0sCisgICAgeyBkZWx0YV90YWJfM18zLCBkZWx0YV90YWJfM18zX20xMCwgIDc5LCAxMyB9LAorICAgIHsgZGVsdGFfdGFiXzNfNCwgZGVsdGFfdGFiXzNfNF9tMTAsICA3OSwgMTMgfSwKKyAgICB7IGRlbHRhX3RhYl8zXzUsIGRlbHRhX3RhYl8zXzVfbTEwLCAgNzksIDEzIH0sCisgICAgeyBkZWx0YV90YWJfM181LCBkZWx0YV90YWJfM181X20xMCwgIDc5LCAxMyB9LAorICAgIHsgZGVsdGFfdGFiXzNfNSwgZGVsdGFfdGFiXzNfNV9tMTAsICA3OSwgMTMgfSwKKyAgICB7IGRlbHRhX3RhYl8zXzUsIGRlbHRhX3RhYl8zXzVfbTEwLCAgNzksIDEzIH0KK307CisKKyNlbmRpZiAvKiBBVkNPREVDX0lOREVPM0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvaW5kZW80LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9pbmRlbzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDQyNzJiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW5kZW80LmMKQEAgLTAsMCArMSw3MDcgQEAKKy8qCisgKiBJbmRlbyBWaWRlbyBJbnRlcmFjdGl2ZSB2NCBjb21wYXRpYmxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIE1heGltIFBvbGlha292c2tpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEluZGVvIFZpZGVvIEludGVyYWN0aXZlIHZlcnNpb24gNCBkZWNvZGVyCisgKgorICogSW5kZW8gNCBkYXRhIGlzIHVzdWFsbHkgdHJhbnNwb3J0ZWQgd2l0aGluIC5hdmkgb3IgLm1vdiBmaWxlcy4KKyAqIEtub3duIEZPVVJDQ3M6ICdJVjQxJworICovCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgIml2aV9kc3AuaCIKKyNpbmNsdWRlICJpdmlfY29tbW9uLmgiCisjaW5jbHVkZSAiaW5kZW80ZGF0YS5oIgorCisjZGVmaW5lIElWSTRfUElDX1NJWkVfRVNDICAgNworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIEludlRyYW5zZm9ybVB0ciAqaW52X3RyYW5zOworICAgIERDVHJhbnNmb3JtUHRyICAqZGNfdHJhbnM7CisgICAgaW50ICAgICAgICAgICAgIGlzXzJkX3RyYW5zOworfSB0cmFuc2Zvcm1zWzE4XSA9IHsKKyAgICB7IGZmX2l2aV9pbnZlcnNlX2hhYXJfOHg4LCAgZmZfaXZpX2RjX2hhYXJfMmQsICAgICAgIDEgfSwKKyAgICB7IGZmX2l2aV9yb3dfaGFhcjgsICAgICAgICAgZmZfaXZpX2RjX2hhYXJfMmQsICAgICAgIDAgfSwKKyAgICB7IGZmX2l2aV9jb2xfaGFhcjgsICAgICAgICAgZmZfaXZpX2RjX2hhYXJfMmQsICAgICAgIDAgfSwKKyAgICB7IGZmX2l2aV9wdXRfcGl4ZWxzXzh4OCwgICAgZmZfaXZpX3B1dF9kY19waXhlbF84eDgsIDEgfSwKKyAgICB7IGZmX2l2aV9pbnZlcnNlX3NsYW50Xzh4OCwgZmZfaXZpX2RjX3NsYW50XzJkLCAgICAgIDEgfSwKKyAgICB7IGZmX2l2aV9yb3dfc2xhbnQ4LCAgICAgICAgZmZfaXZpX2RjX3Jvd19zbGFudCwgICAgIDEgfSwKKyAgICB7IGZmX2l2aV9jb2xfc2xhbnQ4LCAgICAgICAgZmZfaXZpX2RjX2NvbF9zbGFudCwgICAgIDEgfSwKKyAgICB7IE5VTEwsIE5VTEwsIDAgfSwgLyogaW52ZXJzZSBEQ1QgOHg4ICovCisgICAgeyBOVUxMLCBOVUxMLCAwIH0sIC8qIGludmVyc2UgRENUIDh4MSAqLworICAgIHsgTlVMTCwgTlVMTCwgMCB9LCAvKiBpbnZlcnNlIERDVCAxeDggKi8KKyAgICB7IGZmX2l2aV9pbnZlcnNlX2hhYXJfNHg0LCAgZmZfaXZpX2RjX2hhYXJfMmQsICAgICAgIDEgfSwKKyAgICB7IGZmX2l2aV9pbnZlcnNlX3NsYW50XzR4NCwgZmZfaXZpX2RjX3NsYW50XzJkLCAgICAgIDEgfSwKKyAgICB7IE5VTEwsIE5VTEwsIDAgfSwgLyogbm8gdHJhbnNmb3JtIDR4NCAqLworICAgIHsgZmZfaXZpX3Jvd19oYWFyNCwgICAgICAgICBmZl9pdmlfZGNfaGFhcl8yZCwgICAgICAgMCB9LAorICAgIHsgZmZfaXZpX2NvbF9oYWFyNCwgICAgICAgICBmZl9pdmlfZGNfaGFhcl8yZCwgICAgICAgMCB9LAorICAgIHsgZmZfaXZpX3Jvd19zbGFudDQsICAgICAgICBmZl9pdmlfZGNfcm93X3NsYW50LCAgICAgMCB9LAorICAgIHsgZmZfaXZpX2NvbF9zbGFudDQsICAgICAgICBmZl9pdmlfZGNfY29sX3NsYW50LCAgICAgMCB9LAorICAgIHsgTlVMTCwgTlVMTCwgMCB9LCAvKiBpbnZlcnNlIERDVCA0eDQgKi8KK307CisKKy8qKgorICogIERlY29kZSBzdWJkaXZpc2lvbiBvZiBhIHBsYW5lLgorICogIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gdGhhdCBjaGVja3MgZm9yIHR3byBzdXBwb3J0ZWQgc3ViZGl2aXNpb25zOgorICogIC0gMSB3YXZlbGV0IGJhbmQgIHBlciBwbGFuZSwgc2l6ZSBmYWN0b3IgMToxLCBjb2RlIHBhdHRlcm46IDMKKyAqICAtIDQgd2F2ZWxldCBiYW5kcyBwZXIgcGxhbmUsIHNpemUgZmFjdG9yIDE6NCwgY29kZSBwYXR0ZXJuOiAyLDMsMywzLDMKKyAqICBBbnl0aGluZyBlbHNlIGlzIGVpdGhlciB1bnN1cHBvcnRlZCBvciBjb3JydXB0LgorICoKKyAqICBAcGFyYW1baW4sb3V0XSBnYiAgICB0aGUgR2V0Qml0IGNvbnRleHQKKyAqICBAcmV0dXJuICAgICAgICBudW1iZXIgb2Ygd2F2ZWxldCBiYW5kcyBvciAwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3BsYW5lX3N1YmRpdmlzaW9uKEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBpOworCisgICAgc3dpdGNoIChnZXRfYml0cyhnYiwgMikpIHsKKyAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgMjoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIGlmIChnZXRfYml0cyhnYiwgMikgIT0gMykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBzY2FsZV90aWxlX3NpemUoaW50IGRlZl9zaXplLCBpbnQgc2l6ZV9mYWN0b3IpCit7CisgICAgcmV0dXJuIHNpemVfZmFjdG9yID09IDE1ID8gZGVmX3NpemUgOiAoc2l6ZV9mYWN0b3IgKyAxKSA8PCA1OworfQorCisvKioKKyAqICBEZWNvZGUgSW5kZW8gNCBwaWN0dXJlIGhlYWRlci4KKyAqCisgKiAgQHBhcmFtW2luLG91dF0gY3R4ICAgICAgIHBvaW50ZXIgdG8gdGhlIGRlY29kZXIgY29udGV4dAorICogIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICBwb2ludGVyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogIEByZXR1cm4gICAgICAgIHJlc3VsdCBjb2RlOiAwID0gT0ssIG5lZ2F0aXZlIG51bWJlciA9IGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3BpY19oZHIoSVZJNDVEZWNDb250ZXh0ICpjdHgsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgICAgICAgICAgICAgcGljX3NpemVfaW5keCwgaSwgcDsKKyAgICBJVklQaWNDb25maWcgICAgcGljX2NvbmY7CisKKyAgICBpZiAoZ2V0X2JpdHMoJmN0eC0+Z2IsIDE4KSAhPSAweDNGRkY4KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwaWN0dXJlIHN0YXJ0IGNvZGUhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3R4LT5wcmV2X2ZyYW1lX3R5cGUgPSBjdHgtPmZyYW1lX3R5cGU7CisgICAgY3R4LT5mcmFtZV90eXBlICAgICAgPSBnZXRfYml0cygmY3R4LT5nYiwgMyk7CisgICAgaWYgKGN0eC0+ZnJhbWVfdHlwZSA9PSA3KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZSB0eXBlOiAlZFxuIiwgY3R4LT5mcmFtZV90eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisjaWYgSVZJNF9TVFJFQU1fQU5BTFlTRVIKKyAgICBpZiAoY3R4LT5mcmFtZV90eXBlID09IElWSTRfRlJBTUVUWVBFX0JJRElSKQorICAgICAgICBjdHgtPmhhc19iX2ZyYW1lcyA9IDE7CisjZW5kaWYKKworICAgIGN0eC0+dHJhbnNwX3N0YXR1cyA9IGdldF9iaXRzMSgmY3R4LT5nYik7CisjaWYgSVZJNF9TVFJFQU1fQU5BTFlTRVIKKyAgICBpZiAoY3R4LT50cmFuc3Bfc3RhdHVzKSB7CisgICAgICAgIGN0eC0+aGFzX3RyYW5zcCA9IDE7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiB1bmtub3duIGJpdDogTWFjIGRlY29kZXIgaWdub3JlcyB0aGlzIGJpdCwgWEFOSU0gcmV0dXJucyBlcnJvciAqLworICAgIGlmIChnZXRfYml0czEoJmN0eC0+Z2IpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU3luYyBiaXQgaXMgc2V0IVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGN0eC0+ZGF0YV9zaXplID0gZ2V0X2JpdHMxKCZjdHgtPmdiKSA/IGdldF9iaXRzKCZjdHgtPmdiLCAyNCkgOiAwOworCisgICAgLyogbnVsbCBmcmFtZXMgZG9uJ3QgY29udGFpbiBhbnl0aGluZyBlbHNlIHNvIHdlIGp1c3QgcmV0dXJuICovCisgICAgaWYgKGN0eC0+ZnJhbWVfdHlwZSA+PSBJVkk0X0ZSQU1FVFlQRV9OVUxMX0ZJUlNUKSB7CisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJOdWxsIGZyYW1lIGVuY291bnRlcmVkIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIENoZWNrIGtleSBsb2NrIHN0YXR1cy4gSWYgZW5hYmxlZCAtIGlnbm9yZSBsb2NrIHdvcmQuICAgICAgICAgKi8KKyAgICAvKiBVc3VhbGx5IHdlIGhhdmUgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgcGFzc3dvcmQsIGJ1dCAgICAgICovCisgICAgLyogd2UgZG9uJ3QgZG8gdGhhdCBiZWNhdXNlIEluZGVvIDQgdmlkZW9zIGNhbiBiZSBkZWNvZGVkIGFueXdheSAqLworICAgIGlmIChnZXRfYml0czEoJmN0eC0+Z2IpKSB7CisgICAgICAgIHNraXBfYml0c19sb25nKCZjdHgtPmdiLCAzMik7CisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJQYXNzd29yZC1wcm90ZWN0ZWQgY2xpcCFcbiIpOworICAgIH0KKworICAgIHBpY19zaXplX2luZHggPSBnZXRfYml0cygmY3R4LT5nYiwgMyk7CisgICAgaWYgKHBpY19zaXplX2luZHggPT0gSVZJNF9QSUNfU0laRV9FU0MpIHsKKyAgICAgICAgcGljX2NvbmYucGljX2hlaWdodCA9IGdldF9iaXRzKCZjdHgtPmdiLCAxNik7CisgICAgICAgIHBpY19jb25mLnBpY193aWR0aCAgPSBnZXRfYml0cygmY3R4LT5nYiwgMTYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBpY19jb25mLnBpY19oZWlnaHQgPSBpdmk0X2NvbW1vbl9waWNfc2l6ZXNbcGljX3NpemVfaW5keCAqIDIgKyAxXTsKKyAgICAgICAgcGljX2NvbmYucGljX3dpZHRoICA9IGl2aTRfY29tbW9uX3BpY19zaXplc1twaWNfc2l6ZV9pbmR4ICogMiAgICBdOworICAgIH0KKworICAgIC8qIERlY29kZSB0aWxlIGRpbWVuc2lvbnMuICovCisgICAgaWYgKGdldF9iaXRzMSgmY3R4LT5nYikpIHsKKyAgICAgICAgcGljX2NvbmYudGlsZV9oZWlnaHQgPSBzY2FsZV90aWxlX3NpemUocGljX2NvbmYucGljX2hlaWdodCwgZ2V0X2JpdHMoJmN0eC0+Z2IsIDQpKTsKKyAgICAgICAgcGljX2NvbmYudGlsZV93aWR0aCAgPSBzY2FsZV90aWxlX3NpemUocGljX2NvbmYucGljX3dpZHRoLCAgZ2V0X2JpdHMoJmN0eC0+Z2IsIDQpKTsKKyNpZiBJVkk0X1NUUkVBTV9BTkFMWVNFUgorICAgICAgICBjdHgtPnVzZXNfdGlsaW5nID0gMTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIHBpY19jb25mLnRpbGVfaGVpZ2h0ID0gcGljX2NvbmYucGljX2hlaWdodDsKKyAgICAgICAgcGljX2NvbmYudGlsZV93aWR0aCAgPSBwaWNfY29uZi5waWNfd2lkdGg7CisgICAgfQorCisgICAgLyogRGVjb2RlIGNocm9tYSBzdWJzYW1wbGluZy4gV2Ugc3VwcG9ydCBvbmx5IDQ6NCBha2EgWVZVOS4gKi8KKyAgICBpZiAoZ2V0X2JpdHMoJmN0eC0+Z2IsIDIpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBZVlU5IHBpY3R1cmUgZm9ybWF0IGlzIHN1cHBvcnRlZCFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcGljX2NvbmYuY2hyb21hX2hlaWdodCA9IChwaWNfY29uZi5waWNfaGVpZ2h0ICsgMykgPj4gMjsKKyAgICBwaWNfY29uZi5jaHJvbWFfd2lkdGggID0gKHBpY19jb25mLnBpY193aWR0aCAgKyAzKSA+PiAyOworCisgICAgLyogZGVjb2RlIHN1YmRpdmlzaW9uIG9mIHRoZSBwbGFuZXMgKi8KKyAgICBwaWNfY29uZi5sdW1hX2JhbmRzID0gZGVjb2RlX3BsYW5lX3N1YmRpdmlzaW9uKCZjdHgtPmdiKTsKKyAgICBwaWNfY29uZi5jaHJvbWFfYmFuZHMgPSAwOworICAgIGlmIChwaWNfY29uZi5sdW1hX2JhbmRzKQorICAgICAgICBwaWNfY29uZi5jaHJvbWFfYmFuZHMgPSBkZWNvZGVfcGxhbmVfc3ViZGl2aXNpb24oJmN0eC0+Z2IpOworICAgIGN0eC0+aXNfc2NhbGFibGUgPSBwaWNfY29uZi5sdW1hX2JhbmRzICE9IDEgfHwgcGljX2NvbmYuY2hyb21hX2JhbmRzICE9IDE7CisgICAgaWYgKGN0eC0+aXNfc2NhbGFibGUgJiYgKHBpY19jb25mLmx1bWFfYmFuZHMgIT0gNCB8fCBwaWNfY29uZi5jaHJvbWFfYmFuZHMgIT0gMSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTY2FsYWJpbGl0eTogdW5zdXBwb3J0ZWQgc3ViZGl2aXNpb24hIEx1bWEgYmFuZHM6ICVkLCBjaHJvbWEgYmFuZHM6ICVkXG4iLAorICAgICAgICAgICAgICAgcGljX2NvbmYubHVtYV9iYW5kcywgcGljX2NvbmYuY2hyb21hX2JhbmRzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgcGljdHVyZSBsYXlvdXQgd2FzIGNoYW5nZWQgYW5kIHJlYWxsb2NhdGUgYnVmZmVycyAqLworICAgIGlmIChpdmlfcGljX2NvbmZpZ19jbXAoJnBpY19jb25mLCAmY3R4LT5waWNfY29uZikpIHsKKyAgICAgICAgaWYgKGZmX2l2aV9pbml0X3BsYW5lcyhjdHgtPnBsYW5lcywgJnBpY19jb25mLCAxKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZG4ndCByZWFsbG9jYXRlIGNvbG9yIHBsYW5lcyFcbiIpOworICAgICAgICAgICAgY3R4LT5waWNfY29uZi5sdW1hX2JhbmRzID0gMDsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPnBpY19jb25mID0gcGljX2NvbmY7CisKKyAgICAgICAgLyogc2V0IGRlZmF1bHQgbWFjcm9ibG9jay9ibG9jayBkaW1lbnNpb25zICovCisgICAgICAgIGZvciAocCA9IDA7IHAgPD0gMjsgcCsrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKCFwID8gcGljX2NvbmYubHVtYV9iYW5kcyA6IHBpY19jb25mLmNocm9tYV9iYW5kcyk7IGkrKykgeworICAgICAgICAgICAgICAgIGN0eC0+cGxhbmVzW3BdLmJhbmRzW2ldLm1iX3NpemUgID0gIXAgPyAoIWN0eC0+aXNfc2NhbGFibGUgPyAxNiA6IDgpIDogNDsKKyAgICAgICAgICAgICAgICBjdHgtPnBsYW5lc1twXS5iYW5kc1tpXS5ibGtfc2l6ZSA9ICFwID8gOCA6IDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmZfaXZpX2luaXRfdGlsZXMoY3R4LT5wbGFuZXMsIGN0eC0+cGljX2NvbmYudGlsZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cGljX2NvbmYudGlsZV9oZWlnaHQpKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgcmVhbGxvY2F0ZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzIVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgY3R4LT5mcmFtZV9udW0gPSBnZXRfYml0czEoJmN0eC0+Z2IpID8gZ2V0X2JpdHMoJmN0eC0+Z2IsIDIwKSA6IDA7CisKKyAgICAvKiBza2lwIGRlY1RpbWVFc3QgZmllbGQgaWYgcHJlc2VudCAqLworICAgIGlmIChnZXRfYml0czEoJmN0eC0+Z2IpKQorICAgICAgICBza2lwX2JpdHMoJmN0eC0+Z2IsIDgpOworCisgICAgLyogZGVjb2RlIG1hY3JvYmxvY2sgYW5kIGJsb2NrIGh1ZmZtYW4gY29kZWJvb2tzICovCisgICAgaWYgKGZmX2l2aV9kZWNfaHVmZl9kZXNjKCZjdHgtPmdiLCBnZXRfYml0czEoJmN0eC0+Z2IpLCBJVklfTUJfSFVGRiwgICZjdHgtPm1iX3ZsYywgIGF2Y3R4KSB8fAorICAgICAgICBmZl9pdmlfZGVjX2h1ZmZfZGVzYygmY3R4LT5nYiwgZ2V0X2JpdHMxKCZjdHgtPmdiKSwgSVZJX0JMS19IVUZGLCAmY3R4LT5ibGtfdmxjLCBhdmN0eCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgY3R4LT5ydm1hcF9zZWwgPSBnZXRfYml0czEoJmN0eC0+Z2IpID8gZ2V0X2JpdHMoJmN0eC0+Z2IsIDMpIDogODsKKworICAgIGN0eC0+aW5faW1mID0gZ2V0X2JpdHMxKCZjdHgtPmdiKTsKKyAgICBjdHgtPmluX3EgICA9IGdldF9iaXRzMSgmY3R4LT5nYik7CisKKyAgICBjdHgtPnBpY19nbG9iX3F1YW50ID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDUpOworCisgICAgLyogVE9ETzogaWdub3JlIHRoaXMgcGFyYW1ldGVyIGlmIHVudXNlZCAqLworICAgIGN0eC0+dW5rbm93bjEgPSBnZXRfYml0czEoJmN0eC0+Z2IpID8gZ2V0X2JpdHMoJmN0eC0+Z2IsIDMpIDogMDsKKworICAgIGN0eC0+Y2hlY2tzdW0gPSBnZXRfYml0czEoJmN0eC0+Z2IpID8gZ2V0X2JpdHMoJmN0eC0+Z2IsIDE2KSA6IDA7CisKKyAgICAvKiBza2lwIHBpY3R1cmUgaGVhZGVyIGV4dGVuc2lvbiBpZiBhbnkgKi8KKyAgICB3aGlsZSAoZ2V0X2JpdHMxKCZjdHgtPmdiKSkgeworICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiUGljIGhkciBleHRlbnNpb24gZW5jb3VudGVyZWQhXG4iKTsKKyAgICAgICAgc2tpcF9iaXRzKCZjdHgtPmdiLCA4KTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHMxKCZjdHgtPmdiKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJhZCBibG9ja3MgYml0cyBlbmNvdW50ZXJlZCFcbiIpOworICAgIH0KKworICAgIGFsaWduX2dldF9iaXRzKCZjdHgtPmdiKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogIERlY29kZSBJbmRlbyA0IGJhbmQgaGVhZGVyLgorICoKKyAqICBAcGFyYW1baW4sb3V0XSBjdHggICAgICAgcG9pbnRlciB0byB0aGUgZGVjb2RlciBjb250ZXh0CisgKiAgQHBhcmFtW2luLG91dF0gYmFuZCAgICAgIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVzY3JpcHRvcgorICogIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICBwb2ludGVyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogIEByZXR1cm4gICAgICAgIHJlc3VsdCBjb2RlOiAwID0gT0ssIG5lZ2F0aXZlIG51bWJlciA9IGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2JhbmRfaGRyKElWSTQ1RGVjQ29udGV4dCAqY3R4LCBJVklCYW5kRGVzYyAqYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgcGxhbmUsIGJhbmRfbnVtLCBpbmR4LCB0cmFuc2Zvcm1faWQsIHNjYW5faW5keDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcXVhbnRfbWF0OworCisgICAgcGxhbmUgICAgPSBnZXRfYml0cygmY3R4LT5nYiwgMik7CisgICAgYmFuZF9udW0gPSBnZXRfYml0cygmY3R4LT5nYiwgNCk7CisgICAgaWYgKGJhbmQtPnBsYW5lICE9IHBsYW5lIHx8IGJhbmQtPmJhbmRfbnVtICE9IGJhbmRfbnVtKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBiYW5kIGhlYWRlciBzZXF1ZW5jZSFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBiYW5kLT5pc19lbXB0eSA9IGdldF9iaXRzMSgmY3R4LT5nYik7CisgICAgaWYgKCFiYW5kLT5pc19lbXB0eSkgeworICAgICAgICBpbnQgb2xkX2Jsa19zaXplID0gYmFuZC0+YmxrX3NpemU7CisgICAgICAgIC8qIHNraXAgaGVhZGVyIHNpemUKKyAgICAgICAgICogSWYgaGVhZGVyIHNpemUgaXMgbm90IGdpdmVuLCBoZWFkZXIgc2l6ZSBpcyA0IGJ5dGVzLiAqLworICAgICAgICBpZiAoZ2V0X2JpdHMxKCZjdHgtPmdiKSkKKyAgICAgICAgICAgIHNraXBfYml0cygmY3R4LT5nYiwgMTYpOworCisgICAgICAgIGJhbmQtPmlzX2hhbGZwZWwgPSBnZXRfYml0cygmY3R4LT5nYiwgMik7CisgICAgICAgIGlmIChiYW5kLT5pc19oYWxmcGVsID49IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZC91bnN1cHBvcnRlZCBtdiByZXNvbHV0aW9uOiAlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgYmFuZC0+aXNfaGFsZnBlbCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorI2lmIElWSTRfU1RSRUFNX0FOQUxZU0VSCisgICAgICAgIGlmICghYmFuZC0+aXNfaGFsZnBlbCkKKyAgICAgICAgICAgIGN0eC0+dXNlc19mdWxscGVsID0gMTsKKyNlbmRpZgorCisgICAgICAgIGJhbmQtPmNoZWNrc3VtX3ByZXNlbnQgPSBnZXRfYml0czEoJmN0eC0+Z2IpOworICAgICAgICBpZiAoYmFuZC0+Y2hlY2tzdW1fcHJlc2VudCkKKyAgICAgICAgICAgIGJhbmQtPmNoZWNrc3VtID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDE2KTsKKworICAgICAgICBpbmR4ID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDIpOworICAgICAgICBpZiAoaW5keCA9PSAzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYmxvY2sgc2l6ZSFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYmFuZC0+bWJfc2l6ZSAgPSAxNiA+PiBpbmR4OworICAgICAgICBiYW5kLT5ibGtfc2l6ZSA9IDggPj4gKGluZHggPj4gMSk7CisKKyAgICAgICAgYmFuZC0+aW5oZXJpdF9tdiAgICAgPSBnZXRfYml0czEoJmN0eC0+Z2IpOworICAgICAgICBiYW5kLT5pbmhlcml0X3FkZWx0YSA9IGdldF9iaXRzMSgmY3R4LT5nYik7CisKKyAgICAgICAgYmFuZC0+Z2xvYl9xdWFudCA9IGdldF9iaXRzKCZjdHgtPmdiLCA1KTsKKworICAgICAgICBpZiAoIWdldF9iaXRzMSgmY3R4LT5nYikgfHwgY3R4LT5mcmFtZV90eXBlID09IElWSTRfRlJBTUVUWVBFX0lOVFJBKSB7CisgICAgICAgICAgICB0cmFuc2Zvcm1faWQgPSBnZXRfYml0cygmY3R4LT5nYiwgNSk7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtX2lkID49IEZGX0FSUkFZX0VMRU1TKHRyYW5zZm9ybXMpIHx8CisgICAgICAgICAgICAgICAgIXRyYW5zZm9ybXNbdHJhbnNmb3JtX2lkXS5pbnZfdHJhbnMpIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJUcmFuc2Zvcm0gJWQiLCB0cmFuc2Zvcm1faWQpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgodHJhbnNmb3JtX2lkID49IDcgJiYgdHJhbnNmb3JtX2lkIDw9IDkpIHx8CisgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV9pZCA9PSAxNykgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkRDVCB0cmFuc2Zvcm0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1faWQgPCAxMCAmJiBiYW5kLT5ibGtfc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIndyb25nIHRyYW5zZm9ybSBzaXplIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisjaWYgSVZJNF9TVFJFQU1fQU5BTFlTRVIKKyAgICAgICAgICAgIGlmICgodHJhbnNmb3JtX2lkID49IDAgJiYgdHJhbnNmb3JtX2lkIDw9IDIpIHx8IHRyYW5zZm9ybV9pZCA9PSAxMCkKKyAgICAgICAgICAgICAgICBjdHgtPnVzZXNfaGFhciA9IDE7CisjZW5kaWYKKworICAgICAgICAgICAgYmFuZC0+aW52X3RyYW5zZm9ybSA9IHRyYW5zZm9ybXNbdHJhbnNmb3JtX2lkXS5pbnZfdHJhbnM7CisgICAgICAgICAgICBiYW5kLT5kY190cmFuc2Zvcm0gID0gdHJhbnNmb3Jtc1t0cmFuc2Zvcm1faWRdLmRjX3RyYW5zOworICAgICAgICAgICAgYmFuZC0+aXNfMmRfdHJhbnMgICA9IHRyYW5zZm9ybXNbdHJhbnNmb3JtX2lkXS5pc18yZF90cmFuczsKKworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9pZCA8IDEwKQorICAgICAgICAgICAgICAgIGJhbmQtPnRyYW5zZm9ybV9zaXplID0gODsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiYW5kLT50cmFuc2Zvcm1fc2l6ZSA9IDQ7CisKKyAgICAgICAgICAgIGlmIChiYW5kLT5ibGtfc2l6ZSAhPSBiYW5kLT50cmFuc2Zvcm1fc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidHJhbnNmb3JtIGFuZCBibG9jayBzaXplIG1pc21hdGNoICglZCAhPSAlZClcbiIsIGJhbmQtPnRyYW5zZm9ybV9zaXplLCBiYW5kLT5ibGtfc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNjYW5faW5keCA9IGdldF9iaXRzKCZjdHgtPmdiLCA0KTsKKyAgICAgICAgICAgIGlmIChzY2FuX2luZHggPT0gMTUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkN1c3RvbSBzY2FuIHBhdHRlcm4gZW5jb3VudGVyZWQhXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzY2FuX2luZHggPiA0ICYmIHNjYW5faW5keCA8IDEwKSB7CisgICAgICAgICAgICAgICAgaWYgKGJhbmQtPmJsa19zaXplICE9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaXNtYXRjaGluZyBzY2FuIHRhYmxlIVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFuZC0+YmxrX3NpemUgIT0gOCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibWlzbWF0Y2hpbmcgc2NhbiB0YWJsZSFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiYW5kLT5zY2FuID0gc2Nhbl9pbmRleF90b190YWJbc2Nhbl9pbmR4XTsKKyAgICAgICAgICAgIGJhbmQtPnNjYW5fc2l6ZSA9IGJhbmQtPmJsa19zaXplOworCisgICAgICAgICAgICBxdWFudF9tYXQgPSBnZXRfYml0cygmY3R4LT5nYiwgNSk7CisgICAgICAgICAgICBpZiAocXVhbnRfbWF0ID09IDMxKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDdXN0b20gcXVhbnQgbWF0cml4IGVuY291bnRlcmVkIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocXVhbnRfbWF0ID49IEZGX0FSUkFZX0VMRU1TKHF1YW50X2luZGV4X3RvX3RhYikpIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJRdWFudGl6YXRpb24gbWF0cml4ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRfbWF0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJhbmQtPnF1YW50X21hdCA9IHF1YW50X21hdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvbGRfYmxrX3NpemUgIT0gYmFuZC0+YmxrX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBiYW5kIGJsb2NrIHNpemUgZG9lcyBub3QgbWF0Y2ggdGhlIGNvbmZpZ3VyYXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAiaW5oZXJpdGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocXVhbnRfaW5kZXhfdG9fdGFiW2JhbmQtPnF1YW50X21hdF0gPiA0ICYmIGJhbmQtPmJsa19zaXplID09IDQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBxdWFudCBtYXRyaXggZm9yIDR4NCBibG9jayBlbmNvdW50ZXJlZCFcbiIpOworICAgICAgICAgICAgYmFuZC0+cXVhbnRfbWF0ID0gMDsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChiYW5kLT5zY2FuX3NpemUgIT0gYmFuZC0+YmxrX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibWlzbWF0Y2hpbmcgc2NhbiB0YWJsZSFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhbmQtPnRyYW5zZm9ybV9zaXplID09IDggJiYgYmFuZC0+YmxrX3NpemUgPCA4KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1pc21hdGNoaW5nIHRyYW5zZm9ybV9zaXplIVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRlY29kZSBibG9jayBodWZmbWFuIGNvZGVib29rICovCisgICAgICAgIGlmICghZ2V0X2JpdHMxKCZjdHgtPmdiKSkKKyAgICAgICAgICAgIGJhbmQtPmJsa192bGMudGFiID0gY3R4LT5ibGtfdmxjLnRhYjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKGZmX2l2aV9kZWNfaHVmZl9kZXNjKCZjdHgtPmdiLCAxLCBJVklfQkxLX0hVRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbmQtPmJsa192bGMsIGF2Y3R4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAvKiBzZWxlY3QgYXBwcm9wcmlhdGUgcnZtYXAgdGFibGUgZm9yIHRoaXMgYmFuZCAqLworICAgICAgICBiYW5kLT5ydm1hcF9zZWwgPSBnZXRfYml0czEoJmN0eC0+Z2IpID8gZ2V0X2JpdHMoJmN0eC0+Z2IsIDMpIDogODsKKworICAgICAgICAvKiBkZWNvZGUgcnZtYXAgcHJvYmFiaWxpdHkgY29ycmVjdGlvbnMgaWYgYW55ICovCisgICAgICAgIGJhbmQtPm51bV9jb3JyID0gMDsgLyogdGhlcmUgaXMgbm8gY29ycmVjdGlvbnMgKi8KKyAgICAgICAgaWYgKGdldF9iaXRzMSgmY3R4LT5nYikpIHsKKyAgICAgICAgICAgIGJhbmQtPm51bV9jb3JyID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDgpOyAvKiBnZXQgbnVtYmVyIG9mIGNvcnJlY3Rpb24gcGFpcnMgKi8KKyAgICAgICAgICAgIGlmIChiYW5kLT5udW1fY29yciA+IDYxKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBjb3JyZWN0aW9uczogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPm51bV9jb3JyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcmVhZCBjb3JyZWN0aW9uIHBhaXJzICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmFuZC0+bnVtX2NvcnIgKiAyOyBpKyspCisgICAgICAgICAgICAgICAgYmFuZC0+Y29ycltpXSA9IGdldF9iaXRzKCZjdHgtPmdiLCA4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiYW5kLT5ibGtfc2l6ZSA9PSA4KSB7CisgICAgICAgIGJhbmQtPmludHJhX2Jhc2UgPSAmaXZpNF9xdWFudF84eDhfaW50cmFbcXVhbnRfaW5kZXhfdG9fdGFiW2JhbmQtPnF1YW50X21hdF1dWzBdOworICAgICAgICBiYW5kLT5pbnRlcl9iYXNlID0gJml2aTRfcXVhbnRfOHg4X2ludGVyW3F1YW50X2luZGV4X3RvX3RhYltiYW5kLT5xdWFudF9tYXRdXVswXTsKKyAgICB9IGVsc2UgeworICAgICAgICBiYW5kLT5pbnRyYV9iYXNlID0gJml2aTRfcXVhbnRfNHg0X2ludHJhW3F1YW50X2luZGV4X3RvX3RhYltiYW5kLT5xdWFudF9tYXRdXVswXTsKKyAgICAgICAgYmFuZC0+aW50ZXJfYmFzZSA9ICZpdmk0X3F1YW50XzR4NF9pbnRlcltxdWFudF9pbmRleF90b190YWJbYmFuZC0+cXVhbnRfbWF0XV1bMF07CisgICAgfQorCisgICAgLyogSW5kZW8gNCBkb2Vzbid0IHVzZSBzY2FsZSB0YWJsZXMgKi8KKyAgICBiYW5kLT5pbnRyYV9zY2FsZSA9IE5VTEw7CisgICAgYmFuZC0+aW50ZXJfc2NhbGUgPSBOVUxMOworCisgICAgYWxpZ25fZ2V0X2JpdHMoJmN0eC0+Z2IpOworCisgICAgaWYgKCFiYW5kLT5zY2FuKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYmFuZC0+c2NhbiBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiAgRGVjb2RlIGluZm9ybWF0aW9uIChibG9jayB0eXBlLCBjYnAsIHF1YW50IGRlbHRhLCBtb3Rpb24gdmVjdG9yKQorICogIGZvciBhbGwgbWFjcm9ibG9ja3MgaW4gdGhlIGN1cnJlbnQgdGlsZS4KKyAqCisgKiAgQHBhcmFtW2luLG91dF0gY3R4ICAgICAgIHBvaW50ZXIgdG8gdGhlIGRlY29kZXIgY29udGV4dAorICogIEBwYXJhbVtpbixvdXRdIGJhbmQgICAgICBwb2ludGVyIHRvIHRoZSBiYW5kIGRlc2NyaXB0b3IKKyAqICBAcGFyYW1baW4sb3V0XSB0aWxlICAgICAgcG9pbnRlciB0byB0aGUgdGlsZSBkZXNjcmlwdG9yCisgKiAgQHBhcmFtW2luXSAgICAgYXZjdHggICAgIHBvaW50ZXIgdG8gdGhlIEFWQ29kZWNDb250ZXh0CisgKiAgQHJldHVybiAgICAgICAgcmVzdWx0IGNvZGU6IDAgPSBPSywgbmVnYXRpdmUgbnVtYmVyID0gZXJyb3IKKyAqLworc3RhdGljIGludCBkZWNvZGVfbWJfaW5mbyhJVkk0NURlY0NvbnRleHQgKmN0eCwgSVZJQmFuZERlc2MgKmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElWSVRpbGUgKnRpbGUsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgICAgICAgICB4LCB5LCBtdl94LCBtdl95LCBtdl9kZWx0YSwgb2ZmcywgbWJfb2Zmc2V0LCBibGtzX3Blcl9tYiwKKyAgICAgICAgICAgICAgICBtdl9zY2FsZSwgbWJfdHlwZV9iaXRzLCBzOworICAgIElWSU1iSW5mbyAgICptYiwgKnJlZl9tYjsKKyAgICBpbnQgICAgICAgICByb3dfb2Zmc2V0ID0gYmFuZC0+bWJfc2l6ZSAqIGJhbmQtPnBpdGNoOworCisgICAgbWIgICAgID0gdGlsZS0+bWJzOworICAgIHJlZl9tYiA9IHRpbGUtPnJlZl9tYnM7CisgICAgb2ZmcyAgID0gdGlsZS0+eXBvcyAqIGJhbmQtPnBpdGNoICsgdGlsZS0+eHBvczsKKworICAgIGJsa3NfcGVyX21iICA9IGJhbmQtPm1iX3NpemUgICAhPSBiYW5kLT5ibGtfc2l6ZSAgPyA0IDogMTsKKyAgICBtYl90eXBlX2JpdHMgPSBjdHgtPmZyYW1lX3R5cGUgPT0gSVZJNF9GUkFNRVRZUEVfQklESVIgPyAyIDogMTsKKworICAgIC8qIHNjYWxlIGZhY3RvciBmb3IgbW90aW9uIHZlY3RvcnMgKi8KKyAgICBtdl9zY2FsZSA9IChjdHgtPnBsYW5lc1swXS5iYW5kc1swXS5tYl9zaXplID4+IDMpIC0gKGJhbmQtPm1iX3NpemUgPj4gMyk7CisgICAgbXZfeCA9IG12X3kgPSAwOworCisgICAgaWYgKCgodGlsZS0+d2lkdGggKyBiYW5kLT5tYl9zaXplLTEpL2JhbmQtPm1iX3NpemUpICogKCh0aWxlLT5oZWlnaHQgKyBiYW5kLT5tYl9zaXplLTEpL2JhbmQtPm1iX3NpemUpICE9IHRpbGUtPm51bV9NQnMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJudW1fTUJzIG1pc21hdGNoICVkICVkICVkICVkXG4iLCB0aWxlLT53aWR0aCwgdGlsZS0+aGVpZ2h0LCBiYW5kLT5tYl9zaXplLCB0aWxlLT5udW1fTUJzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZvciAoeSA9IHRpbGUtPnlwb3M7IHkgPCB0aWxlLT55cG9zICsgdGlsZS0+aGVpZ2h0OyB5ICs9IGJhbmQtPm1iX3NpemUpIHsKKyAgICAgICAgbWJfb2Zmc2V0ID0gb2ZmczsKKworICAgICAgICBmb3IgKHggPSB0aWxlLT54cG9zOyB4IDwgdGlsZS0+eHBvcyArIHRpbGUtPndpZHRoOyB4ICs9IGJhbmQtPm1iX3NpemUpIHsKKyAgICAgICAgICAgIG1iLT54cG9zICAgICA9IHg7CisgICAgICAgICAgICBtYi0+eXBvcyAgICAgPSB5OworICAgICAgICAgICAgbWItPmJ1Zl9vZmZzID0gbWJfb2Zmc2V0OworICAgICAgICAgICAgbWItPmJfbXZfeCAgID0KKyAgICAgICAgICAgIG1iLT5iX212X3kgICA9IDA7CisKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJmN0eC0+Z2IpKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+ZnJhbWVfdHlwZSA9PSBJVkk0X0ZSQU1FVFlQRV9JTlRSQSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVtcHR5IG1hY3JvYmxvY2sgaW4gYW4gSU5UUkEgcGljdHVyZSFcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWItPnR5cGUgPSAxOyAvKiBlbXB0eSBtYWNyb2Jsb2NrcyBhcmUgYWx3YXlzIElOVEVSICovCisgICAgICAgICAgICAgICAgbWItPmNicCAgPSAwOyAvKiBhbGwgYmxvY2tzIGFyZSBlbXB0eSAqLworCisgICAgICAgICAgICAgICAgbWItPnFfZGVsdGEgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmFuZC0+cGxhbmUgJiYgIWJhbmQtPmJhbmRfbnVtICYmIGN0eC0+aW5fcSkgeworICAgICAgICAgICAgICAgICAgICBtYi0+cV9kZWx0YSA9IGdldF92bGMyKCZjdHgtPmdiLCBjdHgtPm1iX3ZsYy50YWItPnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWSV9WTENfQklUUywgMSk7CisgICAgICAgICAgICAgICAgICAgIG1iLT5xX2RlbHRhID0gSVZJX1RPU0lHTkVEKG1iLT5xX2RlbHRhKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtYi0+bXZfeCA9IG1iLT5tdl95ID0gMDsgLyogbm8gbW90aW9uIHZlY3RvciBjb2RlZCAqLworICAgICAgICAgICAgICAgIGlmIChiYW5kLT5pbmhlcml0X212ICYmIHJlZl9tYikgeworICAgICAgICAgICAgICAgICAgICAvKiBtb3Rpb24gdmVjdG9yIGluaGVyaXRhbmNlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChtdl9zY2FsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWItPm12X3ggPSBpdmlfc2NhbGVfbXYocmVmX21iLT5tdl94LCBtdl9zY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYi0+bXZfeSA9IGl2aV9zY2FsZV9tdihyZWZfbWItPm12X3ksIG12X3NjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5tdl94ID0gcmVmX21iLT5tdl94OworICAgICAgICAgICAgICAgICAgICAgICAgbWItPm12X3kgPSByZWZfbWItPm12X3k7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChiYW5kLT5pbmhlcml0X212KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgbWJfdHlwZSBmcm9tIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlIG1iICovCisgICAgICAgICAgICAgICAgICAgIGlmICghcmVmX21iKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInJlZl9tYiB1bmF2YWlsYWJsZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYi0+dHlwZSA9IHJlZl9tYi0+dHlwZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN0eC0+ZnJhbWVfdHlwZSA9PSBJVkk0X0ZSQU1FVFlQRV9JTlRSQSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5mcmFtZV90eXBlID09IElWSTRfRlJBTUVUWVBFX0lOVFJBMSkgeworICAgICAgICAgICAgICAgICAgICBtYi0+dHlwZSA9IDA7IC8qIG1iX3R5cGUgaXMgYWx3YXlzIElOVFJBIGZvciBpbnRyYS1mcmFtZXMgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtYi0+dHlwZSA9IGdldF9iaXRzKCZjdHgtPmdiLCBtYl90eXBlX2JpdHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1iLT5jYnAgPSBnZXRfYml0cygmY3R4LT5nYiwgYmxrc19wZXJfbWIpOworCisgICAgICAgICAgICAgICAgbWItPnFfZGVsdGEgPSAwOworICAgICAgICAgICAgICAgIGlmIChiYW5kLT5pbmhlcml0X3FkZWx0YSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVmX21iKSBtYi0+cV9kZWx0YSA9IHJlZl9tYi0+cV9kZWx0YTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1iLT5jYnAgfHwgKCFiYW5kLT5wbGFuZSAmJiAhYmFuZC0+YmFuZF9udW0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aW5fcSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWItPnFfZGVsdGEgPSBnZXRfdmxjMigmY3R4LT5nYiwgY3R4LT5tYl92bGMudGFiLT50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVklfVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgICAgICAgICBtYi0+cV9kZWx0YSA9IElWSV9UT1NJR05FRChtYi0+cV9kZWx0YSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFtYi0+dHlwZSkgeworICAgICAgICAgICAgICAgICAgICBtYi0+bXZfeCA9IG1iLT5tdl95ID0gMDsgLyogdGhlcmUgaXMgbm8gbW90aW9uIHZlY3RvciBpbiBpbnRyYS1tYWNyb2Jsb2NrcyAqLworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiYW5kLT5pbmhlcml0X212KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmX21iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdGlvbiB2ZWN0b3IgaW5oZXJpdGFuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXZfc2NhbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWItPm12X3ggPSBpdmlfc2NhbGVfbXYocmVmX21iLT5tdl94LCBtdl9zY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5tdl95ID0gaXZpX3NjYWxlX212KHJlZl9tYi0+bXZfeSwgbXZfc2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5tdl94ID0gcmVmX21iLT5tdl94OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYi0+bXZfeSA9IHJlZl9tYi0+bXZfeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWNvZGUgbW90aW9uIHZlY3RvciBkZWx0YXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG12X2RlbHRhID0gZ2V0X3ZsYzIoJmN0eC0+Z2IsIGN0eC0+bWJfdmxjLnRhYi0+dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWSV9WTENfQklUUywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtdl95ICs9IElWSV9UT1NJR05FRChtdl9kZWx0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtdl9kZWx0YSA9IGdldF92bGMyKCZjdHgtPmdiLCBjdHgtPm1iX3ZsYy50YWItPnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVklfVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbXZfeCArPSBJVklfVE9TSUdORUQobXZfZGVsdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgbWItPm12X3ggPSBtdl94OworICAgICAgICAgICAgICAgICAgICAgICAgbWItPm12X3kgPSBtdl95OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iLT50eXBlID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9kZWx0YSA9IGdldF92bGMyKCZjdHgtPmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5tYl92bGMudGFiLT50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWSV9WTENfQklUUywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZfeSArPSBJVklfVE9TSUdORUQobXZfZGVsdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X2RlbHRhID0gZ2V0X3ZsYzIoJmN0eC0+Z2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm1iX3ZsYy50YWItPnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVZJX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl94ICs9IElWSV9UT1NJR05FRChtdl9kZWx0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWItPmJfbXZfeCA9IC1tdl94OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5iX212X3kgPSAtbXZfeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWItPnR5cGUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgbWItPmJfbXZfeCA9IC1tYi0+bXZfeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5iX212X3kgPSAtbWItPm12X3k7CisgICAgICAgICAgICAgICAgICAgICAgICBtYi0+bXZfeCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtYi0+bXZfeSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHM9IGJhbmQtPmlzX2hhbGZwZWw7CisgICAgICAgICAgICBpZiAobWItPnR5cGUpCisgICAgICAgICAgICBpZiAoIHggKyAgKG1iLT5tdl94ICAgPj5zKSArICAgICAgICAgICAgICAgICAoeSsgICAgICAgICAgICAgICAobWItPm12X3kgICA+PnMpKSpiYW5kLT5waXRjaCA8IDAgfHwKKyAgICAgICAgICAgICAgICAgeCArICgobWItPm12X3grcyk+PnMpICsgYmFuZC0+bWJfc2l6ZSAtIDEKKyAgICAgICAgICAgICAgICAgICArICh5K2JhbmQtPm1iX3NpemUgLSAxICsoKG1iLT5tdl95K3MpPj5zKSkqYmFuZC0+cGl0Y2ggPiBiYW5kLT5idWZzaXplIC0xKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtb3Rpb24gdmVjdG9yICVkICVkIG91dHNpZGUgcmVmZXJlbmNlXG4iLCB4KnMgKyBtYi0+bXZfeCwgeSpzICsgbWItPm12X3kpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYisrOworICAgICAgICAgICAgaWYgKHJlZl9tYikKKyAgICAgICAgICAgICAgICByZWZfbWIrKzsKKyAgICAgICAgICAgIG1iX29mZnNldCArPSBiYW5kLT5tYl9zaXplOworICAgICAgICB9CisKKyAgICAgICAgb2ZmcyArPSByb3dfb2Zmc2V0OworICAgIH0KKworICAgIGFsaWduX2dldF9iaXRzKCZjdHgtPmdiKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogIFJlYXJyYW5nZSBkZWNvZGluZyBhbmQgcmVmZXJlbmNlIGJ1ZmZlcnMuCisgKgorICogIEBwYXJhbVtpbixvdXRdIGN0eCAgICAgICBwb2ludGVyIHRvIHRoZSBkZWNvZGVyIGNvbnRleHQKKyAqLworc3RhdGljIHZvaWQgc3dpdGNoX2J1ZmZlcnMoSVZJNDVEZWNDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGlzX3ByZXZfcmVmID0gMCwgaXNfcmVmID0gMDsKKworICAgIHN3aXRjaCAoY3R4LT5wcmV2X2ZyYW1lX3R5cGUpIHsKKyAgICBjYXNlIElWSTRfRlJBTUVUWVBFX0lOVFJBOgorICAgIGNhc2UgSVZJNF9GUkFNRVRZUEVfSU5UUkExOgorICAgIGNhc2UgSVZJNF9GUkFNRVRZUEVfSU5URVI6CisgICAgICAgIGlzX3ByZXZfcmVmID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChjdHgtPmZyYW1lX3R5cGUpIHsKKyAgICBjYXNlIElWSTRfRlJBTUVUWVBFX0lOVFJBOgorICAgIGNhc2UgSVZJNF9GUkFNRVRZUEVfSU5UUkExOgorICAgIGNhc2UgSVZJNF9GUkFNRVRZUEVfSU5URVI6CisgICAgICAgIGlzX3JlZiA9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpc19wcmV2X3JlZiAmJiBpc19yZWYpIHsKKyAgICAgICAgRkZTV0FQKGludCwgY3R4LT5kc3RfYnVmLCBjdHgtPnJlZl9idWYpOworICAgIH0gZWxzZSBpZiAoaXNfcHJldl9yZWYpIHsKKyAgICAgICAgRkZTV0FQKGludCwgY3R4LT5yZWZfYnVmLCBjdHgtPmJfcmVmX2J1Zik7CisgICAgICAgIEZGU1dBUChpbnQsIGN0eC0+ZHN0X2J1ZiwgY3R4LT5yZWZfYnVmKTsKKyAgICB9Cit9CisKKworc3RhdGljIGludCBpc19ub25udWxsX2ZyYW1lKElWSTQ1RGVjQ29udGV4dCAqY3R4KQoreworICAgIHJldHVybiBjdHgtPmZyYW1lX3R5cGUgPCBJVkk0X0ZSQU1FVFlQRV9OVUxMX0ZJUlNUOworfQorCisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSVZJNDVEZWNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmZfaXZpX2luaXRfc3RhdGljX3ZsYygpOworCisgICAgLyogY29weSBydm1hcCB0YWJsZXMgaW4gb3VyIGNvbnRleHQgc28gd2UgY2FuIGFwcGx5IGNoYW5nZXMgdG8gdGhlbSAqLworICAgIG1lbWNweShjdHgtPnJ2bWFwX3RhYnMsIGZmX2l2aV9ydm1hcF90YWJzLCBzaXplb2YoZmZfaXZpX3J2bWFwX3RhYnMpKTsKKworICAgIC8qIEZvcmNlIGFsbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGJ1ZmZlcnMgKi8KKyAgICAvKiBkdXJpbmcgcGljdHVyZSBoZWFkZXIgZGVjb2RpbmcuICAgICAgICAgICovCisgICAgY3R4LT5waWNfY29uZi5waWNfd2lkdGggID0gMDsKKyAgICBjdHgtPnBpY19jb25mLnBpY19oZWlnaHQgPSAwOworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQxMFA7CisKKyAgICBjdHgtPmRlY29kZV9waWNfaGRyICAgPSBkZWNvZGVfcGljX2hkcjsKKyAgICBjdHgtPmRlY29kZV9iYW5kX2hkciAgPSBkZWNvZGVfYmFuZF9oZHI7CisgICAgY3R4LT5kZWNvZGVfbWJfaW5mbyAgID0gZGVjb2RlX21iX2luZm87CisgICAgY3R4LT5zd2l0Y2hfYnVmZmVycyAgID0gc3dpdGNoX2J1ZmZlcnM7CisgICAgY3R4LT5pc19ub25udWxsX2ZyYW1lID0gaXNfbm9ubnVsbF9mcmFtZTsKKworICAgIGN0eC0+aXNfaW5kZW80ID0gMTsKKworICAgIGN0eC0+ZHN0X2J1ZiAgID0gMDsKKyAgICBjdHgtPnJlZl9idWYgICA9IDE7CisgICAgY3R4LT5iX3JlZl9idWYgPSAzOyAvKiBidWZmZXIgMiBpcyB1c2VkIGZvciBzY2FsYWJpbGl0eSBtb2RlICovCisgICAgY3R4LT5wX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWN0eC0+cF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCisKK0FWQ29kZWMgZmZfaW5kZW80X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImluZGVvNCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkludGVsIEluZGVvIFZpZGVvIEludGVyYWN0aXZlIDQiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSU5ERU80LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihJVkk0NURlY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX2l2aV9kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gZmZfaXZpX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2luZGVvNGRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2luZGVvNGRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM1YTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW5kZW80ZGF0YS5oCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogSW5kZW8gVmlkZW8gSW50ZXJhY3RpdmUgNCBjb21wYXRpYmxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIE1heGltIFBvbGlha292c2tpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkYXRhIG5lZWRlZCBmb3IgdGhlIEluZGVvIDQgZGVjb2Rlci4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSU5ERU80REFUQV9ICisjZGVmaW5lIEFWQ09ERUNfSU5ERU80REFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgIml2aV9jb21tb24uaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisKKy8qKgorICogIHN0YW5kYXJkIHBpY3R1cmUgZGltZW5zaW9ucworICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgaXZpNF9jb21tb25fcGljX3NpemVzWzE0XSA9IHsKKyAgICA2NDAsIDQ4MCwgMzIwLCAyNDAsIDE2MCwgMTIwLCA3MDQsIDQ4MCwgMzUyLCAyNDAsIDM1MiwgMjg4LCAxNzYsIDE0NAorfTsKKworLyoqCisgKiAgSW5kZW8gNCA4eDggc2NhbiAoemlnemFnKSBwYXR0ZXJucworICovCitzdGF0aWMgY29uc3QgdWludDhfdCBpdmk0X2FsdGVybmF0ZV9zY2FuXzh4OFs2NF0gPSB7CisgICAgIDAsICA4LCAgMSwgIDksIDE2LCAyNCwgIDIsICAzLCAxNywgMjUsIDEwLCAxMSwgMzIsIDQwLCA0OCwgNTYsCisgICAgIDQsICA1LCAgNiwgIDcsIDMzLCA0MSwgNDksIDU3LCAxOCwgMTksIDI2LCAyNywgMTIsIDEzLCAxNCwgMTUsCisgICAgMzQsIDM1LCA0MywgNDIsIDUwLCA1MSwgNTksIDU4LCAyMCwgMjEsIDIyLCAyMywgMzEsIDMwLCAyOSwgMjgsCisgICAgMzYsIDM3LCAzOCwgMzksIDQ3LCA0NiwgNDUsIDQ0LCA1MiwgNTMsIDU0LCA1NSwgNjMsIDYyLCA2MSwgNjAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGl2aTRfYWx0ZXJuYXRlX3NjYW5fNHg0WzE2XSA9IHsKKyAgICAwLCAxLCA0LCA1LCA4LCAxMiwgMiwgMywgOSwgMTMsIDYsIDcsIDEwLCAxMSwgMTQsIDE1Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBpdmk0X3ZlcnRpY2FsX3NjYW5fNHg0WzE2XSA9IHsKKyAgICAwLCA0LCA4LCAxMiwgMSwgNSwgOSwgMTMsIDIsIDYsIDEwLCAxNCwgMywgNywgMTEsIDE1Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBpdmk0X2hvcml6b250YWxfc2Nhbl80eDRbMTZdID0geworICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90ICogY29uc3Qgc2Nhbl9pbmRleF90b190YWJbMTVdID0geworICAgIC8vIGZvciA4eDggdHJhbnNmb3JtcworICAgIGZmX3ppZ3phZ19kaXJlY3QsCisgICAgaXZpNF9hbHRlcm5hdGVfc2Nhbl84eDgsCisgICAgZmZfaXZpX2hvcml6b250YWxfc2Nhbl84eDgsCisgICAgZmZfaXZpX3ZlcnRpY2FsX3NjYW5fOHg4LAorICAgIGZmX3ppZ3phZ19kaXJlY3QsCisKKyAgICAvLyBmb3IgNHg0IHRyYW5zZm9ybXMKKyAgICBmZl9pdmlfZGlyZWN0X3NjYW5fNHg0LAorICAgIGl2aTRfYWx0ZXJuYXRlX3NjYW5fNHg0LAorICAgIGl2aTRfdmVydGljYWxfc2Nhbl80eDQsCisgICAgaXZpNF9ob3Jpem9udGFsX3NjYW5fNHg0LAorICAgIGZmX2l2aV9kaXJlY3Rfc2Nhbl80eDQsCisKKyAgICAvLyBUT0RPOiBjaGVjayBpZiB0aG9zZSBhcmUgbmVlZGVkCisgICAgZmZfaXZpX2hvcml6b250YWxfc2Nhbl84eDgsCisgICAgZmZfaXZpX2hvcml6b250YWxfc2Nhbl84eDgsCisgICAgZmZfaXZpX2hvcml6b250YWxfc2Nhbl84eDgsCisgICAgZmZfaXZpX2hvcml6b250YWxfc2Nhbl84eDgsCisgICAgZmZfaXZpX2hvcml6b250YWxfc2Nhbl84eDgKK307CisKKy8qKgorICogIEluZGVvIDQgZGVxdWFudCB0YWJsZXMKKyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGl2aTRfcXVhbnRfOHg4X2ludHJhWzldWzY0XSA9IHsKKyAgeworICAgICAgNDMsICAzNDIsICAzODUsICA0NzAsICA1NTUsICA1NTUsICA1OTgsICA3MjYsCisgICAgIDM0MiwgIDM0MiwgIDQ3MCwgIDUxMywgIDU1NSwgIDU5OCwgIDcyNiwgIDc2OSwKKyAgICAgMzg1LCAgNDcwLCAgNTU1LCAgNTU1LCAgNTk4LCAgNzI2LCAgNzI2LCAgODExLAorICAgICA0NzAsICA0NzAsICA1NTUsICA1NTUsICA1OTgsICA3MjYsICA3NjksICA4NTQsCisgICAgIDQ3MCwgIDU1NSwgIDU1NSwgIDU5OCwgIDY4MywgIDcyNiwgIDg1NCwgMTAyNSwKKyAgICAgNTU1LCAgNTU1LCAgNTk4LCAgNjgzLCAgNzI2LCAgODU0LCAxMDI1LCAxMTUzLAorICAgICA1NTUsICA1NTUsICA1OTgsICA3MjYsICA4MTEsICA5ODIsIDExOTUsIDE0NTEsCisgICAgIDU1NSwgIDU5OCwgIDcyNiwgIDgxMSwgIDk4MiwgMTE5NSwgMTQ1MSwgMTc5MworICB9LAorICB7CisgICAgICA4NiwgMTE5NSwgMjM5MCwgMjM5MCwgNDg2NSwgNDg2NSwgNDg2NSwgNDg2NSwKKyAgICAxMTk1LCAxMTk1LCAyMzkwLCAyMzkwLCA0ODY1LCA0ODY1LCA0ODY1LCA0ODY1LAorICAgIDIzOTAsIDIzOTAsIDQ4NjUsIDQ4NjUsIDY4MjcsIDY4MjcsIDY4MjcsIDY4MjcsCisgICAgMjM5MCwgMjM5MCwgNDg2NSwgNDg2NSwgNjgyNywgNjgyNywgNjgyNywgNjgyNywKKyAgICA0ODY1LCA0ODY1LCA2ODI3LCA2ODI3LCA2ODI3LCA2ODI3LCA2ODI3LCA2ODI3LAorICAgIDQ4NjUsIDQ4NjUsIDY4MjcsIDY4MjcsIDY4MjcsIDY4MjcsIDY4MjcsIDY4MjcsCisgICAgNDg2NSwgNDg2NSwgNjgyNywgNjgyNywgNjgyNywgNjgyNywgNjgyNywgNjgyNywKKyAgICA0ODY1LCA0ODY1LCA2ODI3LCA2ODI3LCA2ODI3LCA2ODI3LCA2ODI3LCA2ODI3CisgIH0sCisgIHsKKyAgICAgMjM1LCAxMDY3LCAxMTk1LCAxMzIzLCAxNDUxLCAxNTc5LCAxNzA3LCAxODM1LAorICAgICAyMzUsIDEwNjcsIDExOTUsIDEzMjMsIDE0NTEsIDE1NzksIDE3MDcsIDE4MzUsCisgICAgIDIzNSwgMTA2NywgMTE5NSwgMTMyMywgMTQ1MSwgMTU3OSwgMTcwNywgMTgzNSwKKyAgICAgMjM1LCAxMDY3LCAxMTk1LCAxMzIzLCAxNDUxLCAxNTc5LCAxNzA3LCAxODM1LAorICAgICAyMzUsIDEwNjcsIDExOTUsIDEzMjMsIDE0NTEsIDE1NzksIDE3MDcsIDE4MzUsCisgICAgIDIzNSwgMTA2NywgMTE5NSwgMTMyMywgMTQ1MSwgMTU3OSwgMTcwNywgMTgzNSwKKyAgICAgMjM1LCAxMDY3LCAxMTk1LCAxMzIzLCAxNDUxLCAxNTc5LCAxNzA3LCAxODM1LAorICAgICAyMzUsIDEwNjcsIDExOTUsIDEzMjMsIDE0NTEsIDE1NzksIDE3MDcsIDE4MzUKKyAgfSwKKyAgeworICAgIDE3MDcsIDE3MDcsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsCisgICAgMTcwNywgMTcwNywgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwKKyAgICAxNzA3LCAxNzA3LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LAorICAgIDE3MDcsIDE3MDcsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsCisgICAgMTcwNywgMTcwNywgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwKKyAgICAxNzA3LCAxNzA3LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LAorICAgIDE3MDcsIDE3MDcsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsCisgICAgMTcwNywgMTcwNywgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNAorICB9LAorICB7CisgICAgIDg5NywgIDg5NywgIDg5NywgIDg5NywgIDg5NywgIDg5NywgIDg5NywgIDg5NywKKyAgICAxMDY3LCAxMDY3LCAxMDY3LCAxMDY3LCAxMDY3LCAxMDY3LCAxMDY3LCAxMDY3LAorICAgIDEyMzgsIDEyMzgsIDEyMzgsIDEyMzgsIDEyMzgsIDEyMzgsIDEyMzgsIDEyMzgsCisgICAgMTQwOSwgMTQwOSwgMTQwOSwgMTQwOSwgMTQwOSwgMTQwOSwgMTQwOSwgMTQwOSwKKyAgICAxNTc5LCAxNTc5LCAxNTc5LCAxNTc5LCAxNTc5LCAxNTc5LCAxNTc5LCAxNTc5LAorICAgIDE3NTAsIDE3NTAsIDE3NTAsIDE3NTAsIDE3NTAsIDE3NTAsIDE3NTAsIDE3NTAsCisgICAgMTkyMSwgMTkyMSwgMTkyMSwgMTkyMSwgMTkyMSwgMTkyMSwgMTkyMSwgMTkyMSwKKyAgICAyMDkxLCAyMDkxLCAyMDkxLCAyMDkxLCAyMDkxLCAyMDkxLCAyMDkxLCAyMDkxCisgIH0sCisgIHsKKyAgICAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LAorICAgIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsCisgICAgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwKKyAgICAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LAorICAgIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsCisgICAgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwKKyAgICAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LAorICAgIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQKKyAgfSwKKyAgeworICAgIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsCisgICAgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwKKyAgICAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLAorICAgIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsCisgICAgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwKKyAgICAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLAorICAgIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsCisgICAgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MAorICB9LAorICB7CisgICAgICAyMiwgIDE3MSwgIDIxNCwgIDI1NywgIDI1NywgIDI5OSwgIDI5OSwgIDM0MiwKKyAgICAgMTcxLCAgMTcxLCAgMjU3LCAgMjU3LCAgMjk5LCAgMjk5LCAgMzQyLCAgMzg1LAorICAgICAyMTQsICAyNTcsICAyNTcsICAyOTksICAyOTksICAzNDIsICAzNDIsICAzODUsCisgICAgIDI1NywgIDI1NywgIDI1NywgIDI5OSwgIDI5OSwgIDM0MiwgIDM4NSwgIDQyNywKKyAgICAgMjU3LCAgMjU3LCAgMjk5LCAgMjk5LCAgMzQyLCAgMzg1LCAgNDI3LCAgNTEzLAorICAgICAyNTcsICAyOTksICAyOTksICAzNDIsICAzODUsICA0MjcsICA1MTMsICA1OTgsCisgICAgIDI5OSwgIDI5OSwgIDI5OSwgIDM4NSwgIDM4NSwgIDQ3MCwgIDU5OCwgIDcyNiwKKyAgICAgMjk5LCAgMjk5LCAgMzg1LCAgMzg1LCAgNDcwLCAgNTk4LCAgNzI2LCAgODk3CisgIH0sCisgIHsKKyAgICAgIDg2LCAgNTk4LCAxMTk1LCAxMTk1LCAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLAorICAgICA1OTgsICA1OTgsIDExOTUsIDExOTUsIDIzOTAsIDIzOTAsIDIzOTAsIDIzOTAsCisgICAgMTE5NSwgMTE5NSwgMjM5MCwgMjM5MCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwKKyAgICAxMTk1LCAxMTk1LCAyMzkwLCAyMzkwLCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LAorICAgIDIzOTAsIDIzOTAsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsCisgICAgMjM5MCwgMjM5MCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwKKyAgICAyMzkwLCAyMzkwLCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LAorICAgIDIzOTAsIDIzOTAsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQKKyAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGl2aTRfcXVhbnRfOHg4X2ludGVyWzldWzY0XSA9IHsKKyAgeworICAgICA0MjcsICA0MjcsICA0NzAsICA0MjcsICA0MjcsICA0MjcsICA0NzAsICA0NzAsCisgICAgIDQyNywgIDQyNywgIDQ3MCwgIDQyNywgIDQyNywgIDQyNywgIDQ3MCwgIDQ3MCwKKyAgICAgNDcwLCAgNDcwLCAgNDcwLCAgNDcwLCAgNDcwLCAgNDcwLCAgNDcwLCAgNDcwLAorICAgICA0MjcsICA0MjcsICA0NzAsICA0NzAsICA0MjcsICA0MjcsICA0NzAsICA0NzAsCisgICAgIDQyNywgIDQyNywgIDQ3MCwgIDQyNywgIDQyNywgIDQyNywgIDQ3MCwgIDQ3MCwKKyAgICAgNDI3LCAgNDI3LCAgNDcwLCAgNDI3LCAgNDI3LCAgNDI3LCAgNDcwLCAgNDcwLAorICAgICA0NzAsICA0NzAsICA0NzAsICA0NzAsICA0NzAsICA0NzAsICA0NzAsICA0NzAsCisgICAgIDQ3MCwgIDQ3MCwgIDQ3MCwgIDQ3MCwgIDQ3MCwgIDQ3MCwgIDQ3MCwgIDQ3MAorICB9LAorICB7CisgICAgMTcwNywgMTcwNywgMjQzMywgMjQzMywgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwKKyAgICAxNzA3LCAxNzA3LCAyNDMzLCAyNDMzLCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LAorICAgIDI0MzMsIDI0MzMsIDM0MTQsIDM0MTQsIDQ4MjIsIDQ4MjIsIDQ4MjIsIDQ4MjIsCisgICAgMjQzMywgMjQzMywgMzQxNCwgMzQxNCwgNDgyMiwgNDgyMiwgNDgyMiwgNDgyMiwKKyAgICAzNDE0LCAzNDE0LCA0ODIyLCA0ODIyLCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LAorICAgIDM0MTQsIDM0MTQsIDQ4MjIsIDQ4MjIsIDM0MTQsIDM0MTQsIDM0MTQsIDM0MTQsCisgICAgMzQxNCwgMzQxNCwgNDgyMiwgNDgyMiwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwKKyAgICAzNDE0LCAzNDE0LCA0ODIyLCA0ODIyLCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0CisgIH0sCisgIHsKKyAgICAxMTk1LCAxMTk1LCAxMjgxLCAxMjM4LCAxMTk1LCAxMTk1LCAxMjgxLCAxMjgxLAorICAgIDExOTUsIDExOTUsIDEyODEsIDEyMzgsIDExOTUsIDExOTUsIDEyODEsIDEyODEsCisgICAgMTE5NSwgMTE5NSwgMTI4MSwgMTIzOCwgMTE5NSwgMTE5NSwgMTI4MSwgMTI4MSwKKyAgICAxMTk1LCAxMTk1LCAxMjgxLCAxMjM4LCAxMTk1LCAxMTk1LCAxMjgxLCAxMjgxLAorICAgIDExOTUsIDExOTUsIDEyODEsIDEyMzgsIDExOTUsIDExOTUsIDEyODEsIDEyODEsCisgICAgMTE5NSwgMTE5NSwgMTI4MSwgMTIzOCwgMTE5NSwgMTE5NSwgMTI4MSwgMTI4MSwKKyAgICAxMTk1LCAxMTk1LCAxMjgxLCAxMjM4LCAxMTk1LCAxMTk1LCAxMjgxLCAxMjgxLAorICAgIDExOTUsIDExOTUsIDEyODEsIDEyMzgsIDExOTUsIDExOTUsIDEyODEsIDEyODEKKyAgfSwKKyAgeworICAgIDI0MzMsIDI0MzMsIDM0MTQsIDM0MTQsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsCisgICAgMjQzMywgMjQzMywgMzQxNCwgMzQxNCwgMjQzMywgMjQzMywgMjQzMywgMjQzMywKKyAgICAyNDMzLCAyNDMzLCAzNDE0LCAzNDE0LCAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLAorICAgIDI0MzMsIDI0MzMsIDM0MTQsIDM0MTQsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsCisgICAgMjQzMywgMjQzMywgMzQxNCwgMzQxNCwgMjQzMywgMjQzMywgMjQzMywgMjQzMywKKyAgICAyNDMzLCAyNDMzLCAzNDE0LCAzNDE0LCAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLAorICAgIDI0MzMsIDI0MzMsIDM0MTQsIDM0MTQsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsCisgICAgMjQzMywgMjQzMywgMzQxNCwgMzQxNCwgMjQzMywgMjQzMywgMjQzMywgMjQzMworICB9LAorICB7CisgICAgMTE5NSwgMTE5NSwgMTE5NSwgMTE5NSwgMTE5NSwgMTE5NSwgMTE5NSwgMTE5NSwKKyAgICAxMTk1LCAxMTk1LCAxMTk1LCAxMTk1LCAxMTk1LCAxMTk1LCAxMTk1LCAxMTk1LAorICAgIDEyODEsIDEyODEsIDEyODEsIDEyODEsIDEyODEsIDEyODEsIDEyODEsIDEyODEsCisgICAgMTIzOCwgMTIzOCwgMTIzOCwgMTIzOCwgMTIzOCwgMTIzOCwgMTIzOCwgMTIzOCwKKyAgICAxMTk1LCAxMTk1LCAxMTk1LCAxMTk1LCAxMTk1LCAxMTk1LCAxMTk1LCAxMTk1LAorICAgIDExOTUsIDExOTUsIDExOTUsIDExOTUsIDExOTUsIDExOTUsIDExOTUsIDExOTUsCisgICAgMTI4MSwgMTI4MSwgMTI4MSwgMTI4MSwgMTI4MSwgMTI4MSwgMTI4MSwgMTI4MSwKKyAgICAxMjgxLCAxMjgxLCAxMjgxLCAxMjgxLCAxMjgxLCAxMjgxLCAxMjgxLCAxMjgxCisgIH0sCisgIHsKKyAgICAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLAorICAgIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsCisgICAgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwgMzQxNCwKKyAgICAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LCAzNDE0LAorICAgIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsCisgICAgMjQzMywgMjQzMywgMjQzMywgMjQzMywgMjQzMywgMjQzMywgMjQzMywgMjQzMywKKyAgICAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLCAyNDMzLAorICAgIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMsIDI0MzMKKyAgfSwKKyAgeworICAgIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsCisgICAgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNywKKyAgICAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LAorICAgIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsCisgICAgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNywKKyAgICAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LAorICAgIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsCisgICAgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNywgMTcwNworICB9LAorICB7CisgICAgICA4NiwgIDE3MSwgIDE3MSwgIDIxNCwgIDIxNCwgIDIxNCwgIDIxNCwgIDI1NywKKyAgICAgMTcxLCAgMTcxLCAgMjE0LCAgMjE0LCAgMjE0LCAgMjE0LCAgMjU3LCAgMjU3LAorICAgICAxNzEsICAyMTQsICAyMTQsICAyMTQsICAyMTQsICAyNTcsICAyNTcsICAyNTcsCisgICAgIDIxNCwgIDIxNCwgIDIxNCwgIDIxNCwgIDI1NywgIDI1NywgIDI1NywgIDI5OSwKKyAgICAgMjE0LCAgMjE0LCAgMjE0LCAgMjU3LCAgMjU3LCAgMjU3LCAgMjk5LCAgMjk5LAorICAgICAyMTQsICAyMTQsICAyNTcsICAyNTcsICAyNTcsICAyOTksICAyOTksICAyOTksCisgICAgIDIxNCwgIDI1NywgIDI1NywgIDI1NywgIDI5OSwgIDI5OSwgIDI5OSwgIDM0MiwKKyAgICAgMjU3LCAgMjU3LCAgMjU3LCAgMjk5LCAgMjk5LCAgMjk5LCAgMzQyLCAgMzQyCisgIH0sCisgIHsKKyAgICAgODU0LCAgODU0LCAxMTk1LCAxMTk1LCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LAorICAgICA4NTQsICA4NTQsIDExOTUsIDExOTUsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsCisgICAgMTE5NSwgMTE5NSwgMTcwNywgMTcwNywgMjM5MCwgMjM5MCwgMjM5MCwgMjM5MCwKKyAgICAxMTk1LCAxMTk1LCAxNzA3LCAxNzA3LCAyMzkwLCAyMzkwLCAyMzkwLCAyMzkwLAorICAgIDE3MDcsIDE3MDcsIDIzOTAsIDIzOTAsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcsCisgICAgMTcwNywgMTcwNywgMjM5MCwgMjM5MCwgMTcwNywgMTcwNywgMTcwNywgMTcwNywKKyAgICAxNzA3LCAxNzA3LCAyMzkwLCAyMzkwLCAxNzA3LCAxNzA3LCAxNzA3LCAxNzA3LAorICAgIDE3MDcsIDE3MDcsIDIzOTAsIDIzOTAsIDE3MDcsIDE3MDcsIDE3MDcsIDE3MDcKKyAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGl2aTRfcXVhbnRfNHg0X2ludHJhWzVdWzE2XSA9IHsKKyAgeworICAgICAgMjIsICAyMTQsICAyNTcsICAyOTksCisgICAgIDIxNCwgIDI1NywgIDI5OSwgIDM0MiwKKyAgICAgMjU3LCAgMjk5LCAgMzQyLCAgNDI3LAorICAgICAyOTksICAzNDIsICA0MjcsICA1MTMKKyAgfSwKKyAgeworICAgICAxMjksIDEwMjUsIDE0NTEsIDE0NTEsCisgICAgMTAyNSwgMTAyNSwgMTQ1MSwgMTQ1MSwKKyAgICAxNDUxLCAxNDUxLCAyMDQ5LCAyMDQ5LAorICAgIDE0NTEsIDE0NTEsIDIwNDksIDIwNDkKKyAgfSwKKyAgeworICAgICAgNDMsICAxNzEsICAxNzEsICAxNzEsCisgICAgICA0MywgIDE3MSwgIDE3MSwgIDE3MSwKKyAgICAgIDQzLCAgMTcxLCAgMTcxLCAgMTcxLAorICAgICAgNDMsICAxNzEsICAxNzEsICAxNzEKKyAgfSwKKyAgeworICAgICAgNDMsICAgNDMsICAgNDMsICAgNDMsCisgICAgIDE3MSwgIDE3MSwgIDE3MSwgIDE3MSwKKyAgICAgMTcxLCAgMTcxLCAgMTcxLCAgMTcxLAorICAgICAxNzEsICAxNzEsICAxNzEsICAxNzEKKyAgfSwKKyAgeworICAgICAgNDMsICAgNDMsICAgNDMsICAgNDMsCisgICAgICA0MywgICA0MywgICA0MywgICA0MywKKyAgICAgIDQzLCAgIDQzLCAgIDQzLCAgIDQzLAorICAgICAgNDMsICAgNDMsICAgNDMsICAgNDMKKyAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGl2aTRfcXVhbnRfNHg0X2ludGVyWzVdWzE2XSA9IHsKKyAgeworICAgICAxMDcsICAyMTQsICAyNTcsICAyOTksCisgICAgIDIxNCwgIDI1NywgIDI5OSwgIDI5OSwKKyAgICAgMjU3LCAgMjk5LCAgMjk5LCAgMzQyLAorICAgICAyOTksICAyOTksICAzNDIsICAzNDIKKyAgfSwKKyAgeworICAgICA1MTMsIDEwMjUsIDEyMzgsIDEyMzgsCisgICAgMTAyNSwgMTAyNSwgMTIzOCwgMTIzOCwKKyAgICAxMjM4LCAxMjM4LCAxNDUxLCAxNDUxLAorICAgIDEyMzgsIDEyMzgsIDE0NTEsIDE0NTEKKyAgfSwKKyAgeworICAgICAgNDMsICAxNzEsICAxNzEsICAxNzEsCisgICAgICA0MywgIDE3MSwgIDE3MSwgIDE3MSwKKyAgICAgIDQzLCAgMTcxLCAgMTcxLCAgMTcxLAorICAgICAgNDMsICAxNzEsICAxNzEsICAxNzEKKyAgfSwKKyAgeworICAgICAgNDMsICAgNDMsICAgNDMsICAgNDMsCisgICAgIDE3MSwgIDE3MSwgIDE3MSwgIDE3MSwKKyAgICAgMTcxLCAgMTcxLCAgMTcxLCAgMTcxLAorICAgICAxNzEsICAxNzEsICAxNzEsICAxNzEKKyAgfSwKKyAgeworICAgICAgNDMsICAgNDMsICAgNDMsICAgNDMsCisgICAgICA0MywgICA0MywgICA0MywgICA0MywKKyAgICAgIDQzLCAgIDQzLCAgIDQzLCAgIDQzLAorICAgICAgNDMsICAgNDMsICAgNDMsICAgNDMKKyAgfQorfTsKKworLyoqCisgKiAgVGFibGUgZm9yIG1hcHBpbmcgcXVhbnQgbWF0cml4IGluZGV4IGZyb20gdGhlIGJpdHN0cmVhbQorICogIGludG8gaW50ZXJuYWwgcXVhbnQgdGFibGUgbnVtYmVyLgorICovCitzdGF0aWMgY29uc3QgdWludDhfdCBxdWFudF9pbmRleF90b190YWJbMjJdID0geworICAgIDAsIDEsIDAsIDIsIDEsIDMsIDAsIDQsIDEsIDUsIDAsIDEsIDYsIDcsIDgsIC8vIGZvciA4eDggcXVhbnQgbWF0cml4ZXMKKyAgICAwLCAxLCAyLCAyLCAzLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgNHg0IHF1YW50IG1hdHJpeGVzCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19JTkRFTzREQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2luZGVvNS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW5kZW81LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhNTRkNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2luZGVvNS5jCkBAIC0wLDAgKzEsNjkyIEBACisvKgorICogSW5kZW8gVmlkZW8gSW50ZXJhY3RpdmUgdjUgY29tcGF0aWJsZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWF4aW0gUG9saWFrb3Zza2kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSW5kZW8gVmlkZW8gSW50ZXJhY3RpdmUgdmVyc2lvbiA1IGRlY29kZXIKKyAqCisgKiBJbmRlbzUgZGF0YSBpcyB1c3VhbGx5IHRyYW5zcG9ydGVkIHdpdGhpbiAuYXZpIG9yIC5tb3YgZmlsZXMuCisgKiBLbm93biBGT1VSQ0NzOiAnSVY1MCcKKyAqLworCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpdmlfZHNwLmgiCisjaW5jbHVkZSAiaXZpX2NvbW1vbi5oIgorI2luY2x1ZGUgImluZGVvNWRhdGEuaCIKKworLyoqCisgKiAgSW5kZW81IGZyYW1lIHR5cGVzLgorICovCitlbnVtIHsKKyAgICBGUkFNRVRZUEVfSU5UUkEgICAgICAgPSAwLAorICAgIEZSQU1FVFlQRV9JTlRFUiAgICAgICA9IDEsICAvLy88IG5vbi1kcm9wcGFibGUgUC1mcmFtZQorICAgIEZSQU1FVFlQRV9JTlRFUl9TQ0FMICA9IDIsICAvLy88IGRyb3BwYWJsZSBQLWZyYW1lIHVzZWQgaW4gdGhlIHNjYWxhYmlsaXR5IG1vZGUKKyAgICBGUkFNRVRZUEVfSU5URVJfTk9SRUYgPSAzLCAgLy8vPCBkcm9wcGFibGUgUC1mcmFtZQorICAgIEZSQU1FVFlQRV9OVUxMICAgICAgICA9IDQgICAvLy88IGVtcHR5IGZyYW1lIHdpdGggbm8gZGF0YQorfTsKKworI2RlZmluZSBJVkk1X1BJQ19TSVpFX0VTQyAgICAgICAxNQorCisvKioKKyAqICBEZWNvZGUgSW5kZW81IEdPUCAoR3JvdXAgb2YgcGljdHVyZXMpIGhlYWRlci4KKyAqICBUaGlzIGhlYWRlciBpcyBwcmVzZW50IGluIGtleSBmcmFtZXMgb25seS4KKyAqICBJdCBkZWZpbmVzIHBhcmFtZXRlcnMgZm9yIGFsbCBmcmFtZXMgaW4gYSBHT1AuCisgKgorICogIEBwYXJhbVtpbixvdXRdIGN0eCAgICBwdHIgdG8gdGhlIGRlY29kZXIgY29udGV4dAorICogIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICBwdHIgdG8gdGhlIEFWQ29kZWNDb250ZXh0CisgKiAgQHJldHVybiAgICAgICAgIHJlc3VsdCBjb2RlOiAwID0gT0ssIC0xID0gZXJyb3IKKyAqLworc3RhdGljIGludCBkZWNvZGVfZ29wX2hlYWRlcihJVkk0NURlY0NvbnRleHQgKmN0eCwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCAgICAgICAgICAgICByZXN1bHQsIGksIHAsIHRpbGVfc2l6ZSwgcGljX3NpemVfaW5keCwgbWJfc2l6ZSwgYmxrX3NpemUsIGlzX3NjYWxhYmxlOworICAgIGludCAgICAgICAgICAgICBxdWFudF9tYXQsIGJsa19zaXplX2NoYW5nZWQgPSAwOworICAgIElWSUJhbmREZXNjICAgICAqYmFuZCwgKmJhbmQxLCAqYmFuZDI7CisgICAgSVZJUGljQ29uZmlnICAgIHBpY19jb25mOworCisgICAgY3R4LT5nb3BfZmxhZ3MgPSBnZXRfYml0cygmY3R4LT5nYiwgOCk7CisKKyAgICBjdHgtPmdvcF9oZHJfc2l6ZSA9IChjdHgtPmdvcF9mbGFncyAmIDEpID8gZ2V0X2JpdHMoJmN0eC0+Z2IsIDE2KSA6IDA7CisKKyAgICBpZiAoY3R4LT5nb3BfZmxhZ3MgJiBJVkk1X0lTX1BST1RFQ1RFRCkKKyAgICAgICAgY3R4LT5sb2NrX3dvcmQgPSBnZXRfYml0c19sb25nKCZjdHgtPmdiLCAzMik7CisKKyAgICB0aWxlX3NpemUgPSAoY3R4LT5nb3BfZmxhZ3MgJiAweDQwKSA/IDY0IDw8IGdldF9iaXRzKCZjdHgtPmdiLCAyKSA6IDA7CisgICAgaWYgKHRpbGVfc2l6ZSA+IDI1NikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdGlsZSBzaXplOiAlZFxuIiwgdGlsZV9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogZGVjb2RlIG51bWJlciBvZiB3YXZlbGV0IGJhbmRzICovCisgICAgLyogbnVtX2xldmVscyAqIDMgKyAxICovCisgICAgcGljX2NvbmYubHVtYV9iYW5kcyAgID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDIpICogMyArIDE7CisgICAgcGljX2NvbmYuY2hyb21hX2JhbmRzID0gZ2V0X2JpdHMxKCZjdHgtPmdiKSAgICogMyArIDE7CisgICAgaXNfc2NhbGFibGUgPSBwaWNfY29uZi5sdW1hX2JhbmRzICE9IDEgfHwgcGljX2NvbmYuY2hyb21hX2JhbmRzICE9IDE7CisgICAgaWYgKGlzX3NjYWxhYmxlICYmIChwaWNfY29uZi5sdW1hX2JhbmRzICE9IDQgfHwgcGljX2NvbmYuY2hyb21hX2JhbmRzICE9IDEpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2NhbGFiaWxpdHk6IHVuc3VwcG9ydGVkIHN1YmRpdmlzaW9uISBMdW1hIGJhbmRzOiAlZCwgY2hyb21hIGJhbmRzOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHBpY19jb25mLmx1bWFfYmFuZHMsIHBpY19jb25mLmNocm9tYV9iYW5kcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHBpY19zaXplX2luZHggPSBnZXRfYml0cygmY3R4LT5nYiwgNCk7CisgICAgaWYgKHBpY19zaXplX2luZHggPT0gSVZJNV9QSUNfU0laRV9FU0MpIHsKKyAgICAgICAgcGljX2NvbmYucGljX2hlaWdodCA9IGdldF9iaXRzKCZjdHgtPmdiLCAxMyk7CisgICAgICAgIHBpY19jb25mLnBpY193aWR0aCAgPSBnZXRfYml0cygmY3R4LT5nYiwgMTMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBpY19jb25mLnBpY19oZWlnaHQgPSBpdmk1X2NvbW1vbl9waWNfc2l6ZXNbcGljX3NpemVfaW5keCAqIDIgKyAxXSA8PCAyOworICAgICAgICBwaWNfY29uZi5waWNfd2lkdGggID0gaXZpNV9jb21tb25fcGljX3NpemVzW3BpY19zaXplX2luZHggKiAyICAgIF0gPDwgMjsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5nb3BfZmxhZ3MgJiAyKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiWVYxMiBwaWN0dXJlIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgcGljX2NvbmYuY2hyb21hX2hlaWdodCA9IChwaWNfY29uZi5waWNfaGVpZ2h0ICsgMykgPj4gMjsKKyAgICBwaWNfY29uZi5jaHJvbWFfd2lkdGggID0gKHBpY19jb25mLnBpY193aWR0aCAgKyAzKSA+PiAyOworCisgICAgaWYgKCF0aWxlX3NpemUpIHsKKyAgICAgICAgcGljX2NvbmYudGlsZV9oZWlnaHQgPSBwaWNfY29uZi5waWNfaGVpZ2h0OworICAgICAgICBwaWNfY29uZi50aWxlX3dpZHRoICA9IHBpY19jb25mLnBpY193aWR0aDsKKyAgICB9IGVsc2UgeworICAgICAgICBwaWNfY29uZi50aWxlX2hlaWdodCA9IHBpY19jb25mLnRpbGVfd2lkdGggPSB0aWxlX3NpemU7CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgcGljdHVyZSBsYXlvdXQgd2FzIGNoYW5nZWQgYW5kIHJlYWxsb2NhdGUgYnVmZmVycyAqLworICAgIGlmIChpdmlfcGljX2NvbmZpZ19jbXAoJnBpY19jb25mLCAmY3R4LT5waWNfY29uZikgfHwgY3R4LT5nb3BfaW52YWxpZCkgeworICAgICAgICByZXN1bHQgPSBmZl9pdmlfaW5pdF9wbGFuZXMoY3R4LT5wbGFuZXMsICZwaWNfY29uZiwgMCk7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkbid0IHJlYWxsb2NhdGUgY29sb3IgcGxhbmVzIVxuIik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGN0eC0+cGljX2NvbmYgPSBwaWNfY29uZjsKKyAgICAgICAgY3R4LT5pc19zY2FsYWJsZSA9IGlzX3NjYWxhYmxlOworICAgICAgICBibGtfc2l6ZV9jaGFuZ2VkID0gMTsgLyogZm9yY2UgcmVhbGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzICovCisgICAgfQorCisgICAgZm9yIChwID0gMDsgcCA8PSAxOyBwKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICghcCA/IHBpY19jb25mLmx1bWFfYmFuZHMgOiBwaWNfY29uZi5jaHJvbWFfYmFuZHMpOyBpKyspIHsKKyAgICAgICAgICAgIGJhbmQgPSAmY3R4LT5wbGFuZXNbcF0uYmFuZHNbaV07CisKKyAgICAgICAgICAgIGJhbmQtPmlzX2hhbGZwZWwgPSBnZXRfYml0czEoJmN0eC0+Z2IpOworCisgICAgICAgICAgICBtYl9zaXplICA9IGdldF9iaXRzMSgmY3R4LT5nYik7CisgICAgICAgICAgICBibGtfc2l6ZSA9IDggPj4gZ2V0X2JpdHMxKCZjdHgtPmdiKTsKKyAgICAgICAgICAgIG1iX3NpemUgID0gYmxrX3NpemUgPDwgIW1iX3NpemU7CisKKyAgICAgICAgICAgIGlmIChwPT0wICYmIGJsa19zaXplPT00KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICI0eDQgbHVtYSBibG9ja3MgYXJlIHVuc3VwcG9ydGVkIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBibGtfc2l6ZV9jaGFuZ2VkID0gbWJfc2l6ZSAhPSBiYW5kLT5tYl9zaXplIHx8IGJsa19zaXplICE9IGJhbmQtPmJsa19zaXplOworICAgICAgICAgICAgaWYgKGJsa19zaXplX2NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBiYW5kLT5tYl9zaXplICA9IG1iX3NpemU7CisgICAgICAgICAgICAgICAgYmFuZC0+YmxrX3NpemUgPSBibGtfc2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmY3R4LT5nYikpIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIkV4dGVuZGVkIHRyYW5zZm9ybSBpbmZvIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzZWxlY3QgdHJhbnNmb3JtIGZ1bmN0aW9uIGFuZCBzY2FuIHBhdHRlcm4gYWNjb3JkaW5nIHRvIHBsYW5lIGFuZCBiYW5kIG51bWJlciAqLworICAgICAgICAgICAgc3dpdGNoICgocCA8PCAyKSArIGkpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBiYW5kLT5pbnZfdHJhbnNmb3JtICA9IGZmX2l2aV9pbnZlcnNlX3NsYW50Xzh4ODsKKyAgICAgICAgICAgICAgICBiYW5kLT5kY190cmFuc2Zvcm0gICA9IGZmX2l2aV9kY19zbGFudF8yZDsKKyAgICAgICAgICAgICAgICBiYW5kLT5zY2FuICAgICAgICAgICA9IGZmX3ppZ3phZ19kaXJlY3Q7CisgICAgICAgICAgICAgICAgYmFuZC0+dHJhbnNmb3JtX3NpemUgPSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgYmFuZC0+aW52X3RyYW5zZm9ybSAgPSBmZl9pdmlfcm93X3NsYW50ODsKKyAgICAgICAgICAgICAgICBiYW5kLT5kY190cmFuc2Zvcm0gICA9IGZmX2l2aV9kY19yb3dfc2xhbnQ7CisgICAgICAgICAgICAgICAgYmFuZC0+c2NhbiAgICAgICAgICAgPSBmZl9pdmlfdmVydGljYWxfc2Nhbl84eDg7CisgICAgICAgICAgICAgICAgYmFuZC0+dHJhbnNmb3JtX3NpemUgPSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgYmFuZC0+aW52X3RyYW5zZm9ybSAgPSBmZl9pdmlfY29sX3NsYW50ODsKKyAgICAgICAgICAgICAgICBiYW5kLT5kY190cmFuc2Zvcm0gICA9IGZmX2l2aV9kY19jb2xfc2xhbnQ7CisgICAgICAgICAgICAgICAgYmFuZC0+c2NhbiAgICAgICAgICAgPSBmZl9pdmlfaG9yaXpvbnRhbF9zY2FuXzh4ODsKKyAgICAgICAgICAgICAgICBiYW5kLT50cmFuc2Zvcm1fc2l6ZSA9IDg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBiYW5kLT5pbnZfdHJhbnNmb3JtICA9IGZmX2l2aV9wdXRfcGl4ZWxzXzh4ODsKKyAgICAgICAgICAgICAgICBiYW5kLT5kY190cmFuc2Zvcm0gICA9IGZmX2l2aV9wdXRfZGNfcGl4ZWxfOHg4OworICAgICAgICAgICAgICAgIGJhbmQtPnNjYW4gICAgICAgICAgID0gZmZfaXZpX2hvcml6b250YWxfc2Nhbl84eDg7CisgICAgICAgICAgICAgICAgYmFuZC0+dHJhbnNmb3JtX3NpemUgPSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgYmFuZC0+aW52X3RyYW5zZm9ybSAgPSBmZl9pdmlfaW52ZXJzZV9zbGFudF80eDQ7CisgICAgICAgICAgICAgICAgYmFuZC0+ZGNfdHJhbnNmb3JtICAgPSBmZl9pdmlfZGNfc2xhbnRfMmQ7CisgICAgICAgICAgICAgICAgYmFuZC0+c2NhbiAgICAgICAgICAgPSBmZl9pdmlfZGlyZWN0X3NjYW5fNHg0OworICAgICAgICAgICAgICAgIGJhbmQtPnRyYW5zZm9ybV9zaXplID0gNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmFuZC0+aXNfMmRfdHJhbnMgPSBiYW5kLT5pbnZfdHJhbnNmb3JtID09IGZmX2l2aV9pbnZlcnNlX3NsYW50Xzh4OCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLT5pbnZfdHJhbnNmb3JtID09IGZmX2l2aV9pbnZlcnNlX3NsYW50XzR4NDsKKworICAgICAgICAgICAgaWYgKGJhbmQtPnRyYW5zZm9ybV9zaXplICE9IGJhbmQtPmJsa19zaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ0cmFuc2Zvcm0gYW5kIGJsb2NrIHNpemUgbWlzbWF0Y2ggKCVkICE9ICVkKVxuIiwgYmFuZC0+dHJhbnNmb3JtX3NpemUsIGJhbmQtPmJsa19zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2VsZWN0IGRlcXVhbnQgbWF0cml4IGFjY29yZGluZyB0byBwbGFuZSBhbmQgYmFuZCBudW1iZXIgKi8KKyAgICAgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgICAgIHF1YW50X21hdCA9IChwaWNfY29uZi5sdW1hX2JhbmRzID4gMSkgPyBpKzEgOiAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWFudF9tYXQgPSA1OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYmFuZC0+YmxrX3NpemUgPT0gOCkgeworICAgICAgICAgICAgICAgIGlmKHF1YW50X21hdCA+PSA1KXsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJxdWFudF9tYXQgJWQgdG9vIGxhcmdlIVxuIiwgcXVhbnRfbWF0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiYW5kLT5pbnRyYV9iYXNlICA9ICZpdmk1X2Jhc2VfcXVhbnRfOHg4X2ludHJhW3F1YW50X21hdF1bMF07CisgICAgICAgICAgICAgICAgYmFuZC0+aW50ZXJfYmFzZSAgPSAmaXZpNV9iYXNlX3F1YW50Xzh4OF9pbnRlcltxdWFudF9tYXRdWzBdOworICAgICAgICAgICAgICAgIGJhbmQtPmludHJhX3NjYWxlID0gJml2aTVfc2NhbGVfcXVhbnRfOHg4X2ludHJhW3F1YW50X21hdF1bMF07CisgICAgICAgICAgICAgICAgYmFuZC0+aW50ZXJfc2NhbGUgPSAmaXZpNV9zY2FsZV9xdWFudF84eDhfaW50ZXJbcXVhbnRfbWF0XVswXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmFuZC0+aW50cmFfYmFzZSAgPSBpdmk1X2Jhc2VfcXVhbnRfNHg0X2ludHJhOworICAgICAgICAgICAgICAgIGJhbmQtPmludGVyX2Jhc2UgID0gaXZpNV9iYXNlX3F1YW50XzR4NF9pbnRlcjsKKyAgICAgICAgICAgICAgICBiYW5kLT5pbnRyYV9zY2FsZSA9IGl2aTVfc2NhbGVfcXVhbnRfNHg0X2ludHJhOworICAgICAgICAgICAgICAgIGJhbmQtPmludGVyX3NjYWxlID0gaXZpNV9zY2FsZV9xdWFudF80eDRfaW50ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChnZXRfYml0cygmY3R4LT5nYiwgMikpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVuZCBtYXJrZXIgbWlzc2luZyFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogY29weSBjaHJvbWEgcGFyYW1ldGVycyBpbnRvIHRoZSAybmQgY2hyb21hIHBsYW5lICovCisgICAgZm9yIChpID0gMDsgaSA8IHBpY19jb25mLmNocm9tYV9iYW5kczsgaSsrKSB7CisgICAgICAgIGJhbmQxID0gJmN0eC0+cGxhbmVzWzFdLmJhbmRzW2ldOworICAgICAgICBiYW5kMiA9ICZjdHgtPnBsYW5lc1syXS5iYW5kc1tpXTsKKworICAgICAgICBiYW5kMi0+d2lkdGggICAgICAgICA9IGJhbmQxLT53aWR0aDsKKyAgICAgICAgYmFuZDItPmhlaWdodCAgICAgICAgPSBiYW5kMS0+aGVpZ2h0OworICAgICAgICBiYW5kMi0+bWJfc2l6ZSAgICAgICA9IGJhbmQxLT5tYl9zaXplOworICAgICAgICBiYW5kMi0+YmxrX3NpemUgICAgICA9IGJhbmQxLT5ibGtfc2l6ZTsKKyAgICAgICAgYmFuZDItPmlzX2hhbGZwZWwgICAgPSBiYW5kMS0+aXNfaGFsZnBlbDsKKyAgICAgICAgYmFuZDItPmludHJhX2Jhc2UgICAgPSBiYW5kMS0+aW50cmFfYmFzZTsKKyAgICAgICAgYmFuZDItPmludGVyX2Jhc2UgICAgPSBiYW5kMS0+aW50ZXJfYmFzZTsKKyAgICAgICAgYmFuZDItPmludHJhX3NjYWxlICAgPSBiYW5kMS0+aW50cmFfc2NhbGU7CisgICAgICAgIGJhbmQyLT5pbnRlcl9zY2FsZSAgID0gYmFuZDEtPmludGVyX3NjYWxlOworICAgICAgICBiYW5kMi0+c2NhbiAgICAgICAgICA9IGJhbmQxLT5zY2FuOworICAgICAgICBiYW5kMi0+aW52X3RyYW5zZm9ybSA9IGJhbmQxLT5pbnZfdHJhbnNmb3JtOworICAgICAgICBiYW5kMi0+ZGNfdHJhbnNmb3JtICA9IGJhbmQxLT5kY190cmFuc2Zvcm07CisgICAgICAgIGJhbmQyLT5pc18yZF90cmFucyAgID0gYmFuZDEtPmlzXzJkX3RyYW5zOworICAgICAgICBiYW5kMi0+dHJhbnNmb3JtX3NpemU9IGJhbmQxLT50cmFuc2Zvcm1fc2l6ZTsKKyAgICB9CisKKyAgICAvKiByZWFsbG9jYXRlIGludGVybmFsIHN0cnVjdHVyZXMgaWYgbmVlZGVkICovCisgICAgaWYgKGJsa19zaXplX2NoYW5nZWQpIHsKKyAgICAgICAgcmVzdWx0ID0gZmZfaXZpX2luaXRfdGlsZXMoY3R4LT5wbGFuZXMsIHBpY19jb25mLnRpbGVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY19jb25mLnRpbGVfaGVpZ2h0KTsKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCByZWFsbG9jYXRlIGludGVybmFsIHN0cnVjdHVyZXMhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3R4LT5nb3BfZmxhZ3MgJiA4KSB7CisgICAgICAgIGlmIChnZXRfYml0cygmY3R4LT5nYiwgMykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQWxpZ25tZW50IGJpdHMgYXJlIG5vdCB6ZXJvIVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRfYml0czEoJmN0eC0+Z2IpKQorICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmN0eC0+Z2IsIDI0KTsgLyogc2tpcCB0cmFuc3BhcmVuY3kgZmlsbCBjb2xvciAqLworICAgIH0KKworICAgIGFsaWduX2dldF9iaXRzKCZjdHgtPmdiKTsKKworICAgIHNraXBfYml0cygmY3R4LT5nYiwgMjMpOyAvKiBGSVhNRTogdW5rbm93biBtZWFuaW5nICovCisKKyAgICAvKiBza2lwIEdPUCBleHRlbnNpb24gaWYgYW55ICovCisgICAgaWYgKGdldF9iaXRzMSgmY3R4LT5nYikpIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaSA9IGdldF9iaXRzKCZjdHgtPmdiLCAxNik7CisgICAgICAgIH0gd2hpbGUgKGkgJiAweDgwMDApOworICAgIH0KKworICAgIGFsaWduX2dldF9iaXRzKCZjdHgtPmdiKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogIFNraXAgYSBoZWFkZXIgZXh0ZW5zaW9uLgorICoKKyAqICBAcGFyYW1baW4sb3V0XSAgZ2IgIHRoZSBHZXRCaXQgY29udGV4dAorICovCitzdGF0aWMgaW5saW5lIGludCBza2lwX2hkcl9leHRlbnNpb24oR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IGksIGxlbjsKKworICAgIGRvIHsKKyAgICAgICAgbGVuID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICBpZiAoOCpsZW4gPiBnZXRfYml0c19sZWZ0KGdiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHNraXBfYml0cyhnYiwgOCk7CisgICAgfSB3aGlsZShsZW4pOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiAgRGVjb2RlIEluZGVvNSBwaWN0dXJlIGhlYWRlci4KKyAqCisgKiAgQHBhcmFtW2luLG91dF0gIGN0eCAgICBwdHIgdG8gdGhlIGRlY29kZXIgY29udGV4dAorICogIEBwYXJhbVtpbl0gICAgICBhdmN0eCAgcHRyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAorICogIEByZXR1cm4gICAgICAgICByZXN1bHQgY29kZTogMCA9IE9LLCAtMSA9IGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3BpY19oZHIoSVZJNDVEZWNDb250ZXh0ICpjdHgsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGdldF9iaXRzKCZjdHgtPmdiLCA1KSAhPSAweDFGKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwaWN0dXJlIHN0YXJ0IGNvZGUhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3R4LT5wcmV2X2ZyYW1lX3R5cGUgPSBjdHgtPmZyYW1lX3R5cGU7CisgICAgY3R4LT5mcmFtZV90eXBlICAgICAgPSBnZXRfYml0cygmY3R4LT5nYiwgMyk7CisgICAgaWYgKGN0eC0+ZnJhbWVfdHlwZSA+PSA1KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZSB0eXBlOiAlZCBcbiIsIGN0eC0+ZnJhbWVfdHlwZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGN0eC0+ZnJhbWVfbnVtID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDgpOworCisgICAgaWYgKGN0eC0+ZnJhbWVfdHlwZSA9PSBGUkFNRVRZUEVfSU5UUkEpIHsKKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfZ29wX2hlYWRlcihjdHgsIGF2Y3R4KSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgR09QIGhlYWRlciwgc2tpcHBpbmcgZnJhbWVzLlxuIik7CisgICAgICAgICAgICBjdHgtPmdvcF9pbnZhbGlkID0gMTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5nb3BfaW52YWxpZCA9IDA7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZnJhbWVfdHlwZSA9PSBGUkFNRVRZUEVfSU5URVJfU0NBTCAmJiAhY3R4LT5pc19zY2FsYWJsZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNjYWxhYmxlIGludGVyIGZyYW1lIGluIG5vbiBzY2FsYWJsZSBzdHJlYW1cbiIpOworICAgICAgICBjdHgtPmZyYW1lX3R5cGUgPSBGUkFNRVRZUEVfSU5URVI7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChjdHgtPmZyYW1lX3R5cGUgIT0gRlJBTUVUWVBFX05VTEwpIHsKKyAgICAgICAgY3R4LT5mcmFtZV9mbGFncyA9IGdldF9iaXRzKCZjdHgtPmdiLCA4KTsKKworICAgICAgICBjdHgtPnBpY19oZHJfc2l6ZSA9IChjdHgtPmZyYW1lX2ZsYWdzICYgMSkgPyBnZXRfYml0c19sb25nKCZjdHgtPmdiLCAyNCkgOiAwOworCisgICAgICAgIGN0eC0+Y2hlY2tzdW0gPSAoY3R4LT5mcmFtZV9mbGFncyAmIDB4MTApID8gZ2V0X2JpdHMoJmN0eC0+Z2IsIDE2KSA6IDA7CisKKyAgICAgICAgLyogc2tpcCB1bmtub3duIGV4dGVuc2lvbiBpZiBhbnkgKi8KKyAgICAgICAgaWYgKGN0eC0+ZnJhbWVfZmxhZ3MgJiAweDIwKQorICAgICAgICAgICAgc2tpcF9oZHJfZXh0ZW5zaW9uKCZjdHgtPmdiKTsgLyogWFhYOiB1bnRlc3RlZCAqLworCisgICAgICAgIC8qIGRlY29kZSBtYWNyb2Jsb2NrIGh1ZmZtYW4gY29kZWJvb2sgKi8KKyAgICAgICAgcmV0ID0gZmZfaXZpX2RlY19odWZmX2Rlc2MoJmN0eC0+Z2IsIGN0eC0+ZnJhbWVfZmxhZ3MgJiAweDQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVklfTUJfSFVGRiwgJmN0eC0+bWJfdmxjLCBhdmN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBza2lwX2JpdHMoJmN0eC0+Z2IsIDMpOyAvKiBGSVhNRTogdW5rbm93biBtZWFuaW5nISAqLworICAgIH0KKworICAgIGFsaWduX2dldF9iaXRzKCZjdHgtPmdiKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogIERlY29kZSBJbmRlbzUgYmFuZCBoZWFkZXIuCisgKgorICogIEBwYXJhbVtpbixvdXRdICBjdHggICAgcHRyIHRvIHRoZSBkZWNvZGVyIGNvbnRleHQKKyAqICBAcGFyYW1baW4sb3V0XSAgYmFuZCAgIHB0ciB0byB0aGUgYmFuZCBkZXNjcmlwdG9yCisgKiAgQHBhcmFtW2luXSAgICAgIGF2Y3R4ICBwdHIgdG8gdGhlIEFWQ29kZWNDb250ZXh0CisgKiAgQHJldHVybiAgICAgICAgIHJlc3VsdCBjb2RlOiAwID0gT0ssIC0xID0gZXJyb3IKKyAqLworc3RhdGljIGludCBkZWNvZGVfYmFuZF9oZHIoSVZJNDVEZWNDb250ZXh0ICpjdHgsIElWSUJhbmREZXNjICpiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCAgICAgICAgIGksIHJldDsKKyAgICB1aW50OF90ICAgICBiYW5kX2ZsYWdzOworCisgICAgYmFuZF9mbGFncyA9IGdldF9iaXRzKCZjdHgtPmdiLCA4KTsKKworICAgIGlmIChiYW5kX2ZsYWdzICYgMSkgeworICAgICAgICBiYW5kLT5pc19lbXB0eSA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJhbmQtPmRhdGFfc2l6ZSA9IChjdHgtPmZyYW1lX2ZsYWdzICYgMHg4MCkgPyBnZXRfYml0c19sb25nKCZjdHgtPmdiLCAyNCkgOiAwOworCisgICAgYmFuZC0+aW5oZXJpdF9tdiAgICAgPSBiYW5kX2ZsYWdzICYgMjsKKyAgICBiYW5kLT5pbmhlcml0X3FkZWx0YSA9IGJhbmRfZmxhZ3MgJiA4OworICAgIGJhbmQtPnFkZWx0YV9wcmVzZW50ID0gYmFuZF9mbGFncyAmIDQ7CisgICAgaWYgKCFiYW5kLT5xZGVsdGFfcHJlc2VudCkgYmFuZC0+aW5oZXJpdF9xZGVsdGEgPSAxOworCisgICAgLyogZGVjb2RlIHJ2bWFwIHByb2JhYmlsaXR5IGNvcnJlY3Rpb25zIGlmIGFueSAqLworICAgIGJhbmQtPm51bV9jb3JyID0gMDsgLyogdGhlcmUgYXJlIG5vIGNvcnJlY3Rpb25zICovCisgICAgaWYgKGJhbmRfZmxhZ3MgJiAweDEwKSB7CisgICAgICAgIGJhbmQtPm51bV9jb3JyID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDgpOyAvKiBnZXQgbnVtYmVyIG9mIGNvcnJlY3Rpb24gcGFpcnMgKi8KKyAgICAgICAgaWYgKGJhbmQtPm51bV9jb3JyID4gNjEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgY29ycmVjdGlvbnM6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGJhbmQtPm51bV9jb3JyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVhZCBjb3JyZWN0aW9uIHBhaXJzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiYW5kLT5udW1fY29yciAqIDI7IGkrKykKKyAgICAgICAgICAgIGJhbmQtPmNvcnJbaV0gPSBnZXRfYml0cygmY3R4LT5nYiwgOCk7CisgICAgfQorCisgICAgLyogc2VsZWN0IGFwcHJvcHJpYXRlIHJ2bWFwIHRhYmxlIGZvciB0aGlzIGJhbmQgKi8KKyAgICBiYW5kLT5ydm1hcF9zZWwgPSAoYmFuZF9mbGFncyAmIDB4NDApID8gZ2V0X2JpdHMoJmN0eC0+Z2IsIDMpIDogODsKKworICAgIC8qIGRlY29kZSBibG9jayBodWZmbWFuIGNvZGVib29rICovCisgICAgcmV0ID0gZmZfaXZpX2RlY19odWZmX2Rlc2MoJmN0eC0+Z2IsIGJhbmRfZmxhZ3MgJiAweDgwLCBJVklfQkxLX0hVRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbmQtPmJsa192bGMsIGF2Y3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGJhbmQtPmNoZWNrc3VtX3ByZXNlbnQgPSBnZXRfYml0czEoJmN0eC0+Z2IpOworICAgIGlmIChiYW5kLT5jaGVja3N1bV9wcmVzZW50KQorICAgICAgICBiYW5kLT5jaGVja3N1bSA9IGdldF9iaXRzKCZjdHgtPmdiLCAxNik7CisKKyAgICBiYW5kLT5nbG9iX3F1YW50ID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDUpOworCisgICAgLyogc2tpcCB1bmtub3duIGV4dGVuc2lvbiBpZiBhbnkgKi8KKyAgICBpZiAoYmFuZF9mbGFncyAmIDB4MjApIHsgLyogWFhYOiB1bnRlc3RlZCAqLworICAgICAgICBhbGlnbl9nZXRfYml0cygmY3R4LT5nYik7CisgICAgICAgIHNraXBfaGRyX2V4dGVuc2lvbigmY3R4LT5nYik7CisgICAgfQorCisgICAgYWxpZ25fZ2V0X2JpdHMoJmN0eC0+Z2IpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiAgRGVjb2RlIGluZm8gKGJsb2NrIHR5cGUsIGNicCwgcXVhbnQgZGVsdGEsIG1vdGlvbiB2ZWN0b3IpCisgKiAgZm9yIGFsbCBtYWNyb2Jsb2NrcyBpbiB0aGUgY3VycmVudCB0aWxlLgorICoKKyAqICBAcGFyYW1baW4sb3V0XSAgY3R4ICAgIHB0ciB0byB0aGUgZGVjb2RlciBjb250ZXh0CisgKiAgQHBhcmFtW2luLG91dF0gIGJhbmQgICBwdHIgdG8gdGhlIGJhbmQgZGVzY3JpcHRvcgorICogIEBwYXJhbVtpbixvdXRdICB0aWxlICAgcHRyIHRvIHRoZSB0aWxlIGRlc2NyaXB0b3IKKyAqICBAcGFyYW1baW5dICAgICAgYXZjdHggIHB0ciB0byB0aGUgQVZDb2RlY0NvbnRleHQKKyAqICBAcmV0dXJuICAgICAgICAgcmVzdWx0IGNvZGU6IDAgPSBPSywgLTEgPSBlcnJvcgorICovCitzdGF0aWMgaW50IGRlY29kZV9tYl9pbmZvKElWSTQ1RGVjQ29udGV4dCAqY3R4LCBJVklCYW5kRGVzYyAqYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVZJVGlsZSAqdGlsZSwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCAgICAgICAgIHgsIHksIG12X3gsIG12X3ksIG12X2RlbHRhLCBvZmZzLCBtYl9vZmZzZXQsCisgICAgICAgICAgICAgICAgbXZfc2NhbGUsIGJsa3NfcGVyX21iLCBzOworICAgIElWSU1iSW5mbyAgICptYiwgKnJlZl9tYjsKKyAgICBpbnQgICAgICAgICByb3dfb2Zmc2V0ID0gYmFuZC0+bWJfc2l6ZSAqIGJhbmQtPnBpdGNoOworCisgICAgbWIgICAgID0gdGlsZS0+bWJzOworICAgIHJlZl9tYiA9IHRpbGUtPnJlZl9tYnM7CisgICAgb2ZmcyAgID0gdGlsZS0+eXBvcyAqIGJhbmQtPnBpdGNoICsgdGlsZS0+eHBvczsKKworICAgIGlmICghcmVmX21iICYmCisgICAgICAgICgoYmFuZC0+cWRlbHRhX3ByZXNlbnQgJiYgYmFuZC0+aW5oZXJpdF9xZGVsdGEpIHx8IGJhbmQtPmluaGVyaXRfbXYpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICh0aWxlLT5udW1fTUJzICE9IElWSV9NQnNfUEVSX1RJTEUodGlsZS0+d2lkdGgsIHRpbGUtPmhlaWdodCwgYmFuZC0+bWJfc2l6ZSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBbGxvY2F0ZWQgdGlsZSBzaXplICVkIG1pc21hdGNoZXMgcGFyYW1ldGVycyAlZFxuIiwKKyAgICAgICAgICAgICAgIHRpbGUtPm51bV9NQnMsIElWSV9NQnNfUEVSX1RJTEUodGlsZS0+d2lkdGgsIHRpbGUtPmhlaWdodCwgYmFuZC0+bWJfc2l6ZSkpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBzY2FsZSBmYWN0b3IgZm9yIG1vdGlvbiB2ZWN0b3JzICovCisgICAgbXZfc2NhbGUgPSAoY3R4LT5wbGFuZXNbMF0uYmFuZHNbMF0ubWJfc2l6ZSA+PiAzKSAtIChiYW5kLT5tYl9zaXplID4+IDMpOworICAgIG12X3ggPSBtdl95ID0gMDsKKworICAgIGZvciAoeSA9IHRpbGUtPnlwb3M7IHkgPCAodGlsZS0+eXBvcyArIHRpbGUtPmhlaWdodCk7IHkgKz0gYmFuZC0+bWJfc2l6ZSkgeworICAgICAgICBtYl9vZmZzZXQgPSBvZmZzOworCisgICAgICAgIGZvciAoeCA9IHRpbGUtPnhwb3M7IHggPCAodGlsZS0+eHBvcyArIHRpbGUtPndpZHRoKTsgeCArPSBiYW5kLT5tYl9zaXplKSB7CisgICAgICAgICAgICBtYi0+eHBvcyAgICAgPSB4OworICAgICAgICAgICAgbWItPnlwb3MgICAgID0geTsKKyAgICAgICAgICAgIG1iLT5idWZfb2ZmcyA9IG1iX29mZnNldDsKKworICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmY3R4LT5nYikpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3R4LT5mcmFtZV90eXBlID09IEZSQU1FVFlQRV9JTlRSQSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVtcHR5IG1hY3JvYmxvY2sgaW4gYW4gSU5UUkEgcGljdHVyZSFcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWItPnR5cGUgPSAxOyAvKiBlbXB0eSBtYWNyb2Jsb2NrcyBhcmUgYWx3YXlzIElOVEVSICovCisgICAgICAgICAgICAgICAgbWItPmNicCAgPSAwOyAvKiBhbGwgYmxvY2tzIGFyZSBlbXB0eSAqLworCisgICAgICAgICAgICAgICAgbWItPnFfZGVsdGEgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmFuZC0+cGxhbmUgJiYgIWJhbmQtPmJhbmRfbnVtICYmIChjdHgtPmZyYW1lX2ZsYWdzICYgOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWItPnFfZGVsdGEgPSBnZXRfdmxjMigmY3R4LT5nYiwgY3R4LT5tYl92bGMudGFiLT50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVklfVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgICAgICAgICBtYi0+cV9kZWx0YSA9IElWSV9UT1NJR05FRChtYi0+cV9kZWx0YSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWItPm12X3ggPSBtYi0+bXZfeSA9IDA7IC8qIG5vIG1vdGlvbiB2ZWN0b3IgY29kZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoYmFuZC0+aW5oZXJpdF9tdiAmJiByZWZfbWIpeworICAgICAgICAgICAgICAgICAgICAvKiBtb3Rpb24gdmVjdG9yIGluaGVyaXRhbmNlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChtdl9zY2FsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWItPm12X3ggPSBpdmlfc2NhbGVfbXYocmVmX21iLT5tdl94LCBtdl9zY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYi0+bXZfeSA9IGl2aV9zY2FsZV9tdihyZWZfbWItPm12X3ksIG12X3NjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5tdl94ID0gcmVmX21iLT5tdl94OworICAgICAgICAgICAgICAgICAgICAgICAgbWItPm12X3kgPSByZWZfbWItPm12X3k7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChiYW5kLT5pbmhlcml0X212ICYmIHJlZl9tYikgeworICAgICAgICAgICAgICAgICAgICBtYi0+dHlwZSA9IHJlZl9tYi0+dHlwZTsgLyogY29weSBtYl90eXBlIGZyb20gY29ycmVzcG9uZGluZyByZWZlcmVuY2UgbWIgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN0eC0+ZnJhbWVfdHlwZSA9PSBGUkFNRVRZUEVfSU5UUkEpIHsKKyAgICAgICAgICAgICAgICAgICAgbWItPnR5cGUgPSAwOyAvKiBtYl90eXBlIGlzIGFsd2F5cyBJTlRSQSBmb3IgaW50cmEtZnJhbWVzICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWItPnR5cGUgPSBnZXRfYml0czEoJmN0eC0+Z2IpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJsa3NfcGVyX21iID0gYmFuZC0+bWJfc2l6ZSAhPSBiYW5kLT5ibGtfc2l6ZSA/IDQgOiAxOworICAgICAgICAgICAgICAgIG1iLT5jYnAgPSBnZXRfYml0cygmY3R4LT5nYiwgYmxrc19wZXJfbWIpOworCisgICAgICAgICAgICAgICAgbWItPnFfZGVsdGEgPSAwOworICAgICAgICAgICAgICAgIGlmIChiYW5kLT5xZGVsdGFfcHJlc2VudCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYmFuZC0+aW5oZXJpdF9xZGVsdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZfbWIpIG1iLT5xX2RlbHRhID0gcmVmX21iLT5xX2RlbHRhOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1iLT5jYnAgfHwgKCFiYW5kLT5wbGFuZSAmJiAhYmFuZC0+YmFuZF9udW0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5mcmFtZV9mbGFncyAmIDgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWItPnFfZGVsdGEgPSBnZXRfdmxjMigmY3R4LT5nYiwgY3R4LT5tYl92bGMudGFiLT50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVZJX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5xX2RlbHRhID0gSVZJX1RPU0lHTkVEKG1iLT5xX2RlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghbWItPnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWItPm12X3ggPSBtYi0+bXZfeSA9IDA7IC8qIHRoZXJlIGlzIG5vIG1vdGlvbiB2ZWN0b3IgaW4gaW50cmEtbWFjcm9ibG9ja3MgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoYmFuZC0+aW5oZXJpdF9tdiAmJiByZWZfbWIpeworICAgICAgICAgICAgICAgICAgICAgICAgLyogbW90aW9uIHZlY3RvciBpbmhlcml0YW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG12X3NjYWxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWItPm12X3ggPSBpdmlfc2NhbGVfbXYocmVmX21iLT5tdl94LCBtdl9zY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWItPm12X3kgPSBpdmlfc2NhbGVfbXYocmVmX21iLT5tdl95LCBtdl9zY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5tdl94ID0gcmVmX21iLT5tdl94OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5tdl95ID0gcmVmX21iLT5tdl95OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVjb2RlIG1vdGlvbiB2ZWN0b3IgZGVsdGFzICovCisgICAgICAgICAgICAgICAgICAgICAgICBtdl9kZWx0YSA9IGdldF92bGMyKCZjdHgtPmdiLCBjdHgtPm1iX3ZsYy50YWItPnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVklfVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbXZfeSArPSBJVklfVE9TSUdORUQobXZfZGVsdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgbXZfZGVsdGEgPSBnZXRfdmxjMigmY3R4LT5nYiwgY3R4LT5tYl92bGMudGFiLT50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVZJX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12X3ggKz0gSVZJX1RPU0lHTkVEKG12X2RlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5tdl94ID0gbXZfeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5tdl95ID0gbXZfeTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcz0gYmFuZC0+aXNfaGFsZnBlbDsKKyAgICAgICAgICAgIGlmIChtYi0+dHlwZSkKKyAgICAgICAgICAgIGlmICggeCArICAobWItPm12X3ggICA+PnMpICsgICAgICAgICAgICAgICAgICh5KyAgICAgICAgICAgICAgIChtYi0+bXZfeSAgID4+cykpKmJhbmQtPnBpdGNoIDwgMCB8fAorICAgICAgICAgICAgICAgICB4ICsgKChtYi0+bXZfeCtzKT4+cykgKyBiYW5kLT5tYl9zaXplIC0gMQorICAgICAgICAgICAgICAgICAgICsgKHkrYmFuZC0+bWJfc2l6ZSAtIDEgKygobWItPm12X3krcyk+PnMpKSpiYW5kLT5waXRjaCA+IGJhbmQtPmJ1ZnNpemUgLSAxKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtb3Rpb24gdmVjdG9yICVkICVkIG91dHNpZGUgcmVmZXJlbmNlXG4iLCB4KnMgKyBtYi0+bXZfeCwgeSpzICsgbWItPm12X3kpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYisrOworICAgICAgICAgICAgaWYgKHJlZl9tYikKKyAgICAgICAgICAgICAgICByZWZfbWIrKzsKKyAgICAgICAgICAgIG1iX29mZnNldCArPSBiYW5kLT5tYl9zaXplOworICAgICAgICB9CisKKyAgICAgICAgb2ZmcyArPSByb3dfb2Zmc2V0OworICAgIH0KKworICAgIGFsaWduX2dldF9iaXRzKCZjdHgtPmdiKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogIFN3aXRjaCBidWZmZXJzLgorICoKKyAqICBAcGFyYW1baW4sb3V0XSBjdHggIHB0ciB0byB0aGUgZGVjb2RlciBjb250ZXh0CisgKi8KK3N0YXRpYyB2b2lkIHN3aXRjaF9idWZmZXJzKElWSTQ1RGVjQ29udGV4dCAqY3R4KQoreworICAgIHN3aXRjaCAoY3R4LT5wcmV2X2ZyYW1lX3R5cGUpIHsKKyAgICBjYXNlIEZSQU1FVFlQRV9JTlRSQToKKyAgICBjYXNlIEZSQU1FVFlQRV9JTlRFUjoKKyAgICAgICAgY3R4LT5idWZfc3dpdGNoIF49IDE7CisgICAgICAgIGN0eC0+ZHN0X2J1ZiA9IGN0eC0+YnVmX3N3aXRjaDsKKyAgICAgICAgY3R4LT5yZWZfYnVmID0gY3R4LT5idWZfc3dpdGNoIF4gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGUkFNRVRZUEVfSU5URVJfU0NBTDoKKyAgICAgICAgaWYgKCFjdHgtPmludGVyX3NjYWwpIHsKKyAgICAgICAgICAgIGN0eC0+cmVmMl9idWYgICA9IDI7CisgICAgICAgICAgICBjdHgtPmludGVyX3NjYWwgPSAxOworICAgICAgICB9CisgICAgICAgIEZGU1dBUChpbnQsIGN0eC0+ZHN0X2J1ZiwgY3R4LT5yZWYyX2J1Zik7CisgICAgICAgIGN0eC0+cmVmX2J1ZiA9IGN0eC0+cmVmMl9idWY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlJBTUVUWVBFX0lOVEVSX05PUkVGOgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGN0eC0+ZnJhbWVfdHlwZSkgeworICAgIGNhc2UgRlJBTUVUWVBFX0lOVFJBOgorICAgICAgICBjdHgtPmJ1Zl9zd2l0Y2ggPSAwOworICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgRlJBTUVUWVBFX0lOVEVSOgorICAgICAgICBjdHgtPmludGVyX3NjYWwgPSAwOworICAgICAgICBjdHgtPmRzdF9idWYgPSBjdHgtPmJ1Zl9zd2l0Y2g7CisgICAgICAgIGN0eC0+cmVmX2J1ZiA9IGN0eC0+YnVmX3N3aXRjaCBeIDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlJBTUVUWVBFX0lOVEVSX1NDQUw6CisgICAgY2FzZSBGUkFNRVRZUEVfSU5URVJfTk9SRUY6CisgICAgY2FzZSBGUkFNRVRZUEVfTlVMTDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQgaXNfbm9ubnVsbF9mcmFtZShJVkk0NURlY0NvbnRleHQgKmN0eCkKK3sKKyAgICByZXR1cm4gY3R4LT5mcmFtZV90eXBlICE9IEZSQU1FVFlQRV9OVUxMOworfQorCisKKy8qKgorICogIEluaXRpYWxpemUgSW5kZW81IGRlY29kZXIuCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSVZJNDVEZWNDb250ZXh0ICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgcmVzdWx0OworCisgICAgZmZfaXZpX2luaXRfc3RhdGljX3ZsYygpOworCisgICAgLyogY29weSBydm1hcCB0YWJsZXMgaW4gb3VyIGNvbnRleHQgc28gd2UgY2FuIGFwcGx5IGNoYW5nZXMgdG8gdGhlbSAqLworICAgIG1lbWNweShjdHgtPnJ2bWFwX3RhYnMsIGZmX2l2aV9ydm1hcF90YWJzLCBzaXplb2YoZmZfaXZpX3J2bWFwX3RhYnMpKTsKKworICAgIC8qIHNldCB0aGUgaW5pdGlhbCBwaWN0dXJlIGxheW91dCBhY2NvcmRpbmcgdG8gdGhlIGJhc2ljIHByb2ZpbGU6CisgICAgICAgdGhlcmUgaXMgb25seSBvbmUgYmFuZCBwZXIgcGxhbmUgKG5vIHNjYWxhYmlsaXR5KSwgb25seSBvbmUgdGlsZSAobm8gbG9jYWwgZGVjb2RpbmcpCisgICAgICAgYW5kIHBpY3R1cmUgZm9ybWF0ID0gWVZVOSAqLworICAgIGN0eC0+cGljX2NvbmYucGljX3dpZHRoICAgICA9IGF2Y3R4LT53aWR0aDsKKyAgICBjdHgtPnBpY19jb25mLnBpY19oZWlnaHQgICAgPSBhdmN0eC0+aGVpZ2h0OworICAgIGN0eC0+cGljX2NvbmYuY2hyb21hX3dpZHRoICA9IChhdmN0eC0+d2lkdGggICsgMykgPj4gMjsKKyAgICBjdHgtPnBpY19jb25mLmNocm9tYV9oZWlnaHQgPSAoYXZjdHgtPmhlaWdodCArIDMpID4+IDI7CisgICAgY3R4LT5waWNfY29uZi50aWxlX3dpZHRoICAgID0gYXZjdHgtPndpZHRoOworICAgIGN0eC0+cGljX2NvbmYudGlsZV9oZWlnaHQgICA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgY3R4LT5waWNfY29uZi5sdW1hX2JhbmRzICAgID0gY3R4LT5waWNfY29uZi5jaHJvbWFfYmFuZHMgPSAxOworCisgICAgcmVzdWx0ID0gZmZfaXZpX2luaXRfcGxhbmVzKGN0eC0+cGxhbmVzLCAmY3R4LT5waWNfY29uZiwgMCk7CisgICAgaWYgKHJlc3VsdCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkbid0IGFsbG9jYXRlIGNvbG9yIHBsYW5lcyFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBjdHgtPmJ1Zl9zd2l0Y2ggPSAwOworICAgIGN0eC0+aW50ZXJfc2NhbCA9IDA7CisKKyAgICBjdHgtPmRlY29kZV9waWNfaGRyICAgPSBkZWNvZGVfcGljX2hkcjsKKyAgICBjdHgtPmRlY29kZV9iYW5kX2hkciAgPSBkZWNvZGVfYmFuZF9oZHI7CisgICAgY3R4LT5kZWNvZGVfbWJfaW5mbyAgID0gZGVjb2RlX21iX2luZm87CisgICAgY3R4LT5zd2l0Y2hfYnVmZmVycyAgID0gc3dpdGNoX2J1ZmZlcnM7CisgICAgY3R4LT5pc19ub25udWxsX2ZyYW1lID0gaXNfbm9ubnVsbF9mcmFtZTsKKworICAgIGN0eC0+aXNfaW5kZW80ID0gMDsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MTBQOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfaW5kZW81X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImluZGVvNSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkludGVsIEluZGVvIFZpZGVvIEludGVyYWN0aXZlIDUiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSU5ERU81LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihJVkk0NURlY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX2l2aV9kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gZmZfaXZpX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2luZGVvNWRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2luZGVvNWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjIxN2QwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW5kZW81ZGF0YS5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogSW5kZW8gVmlkZW8gSW50ZXJhY3RpdmUgNSBjb21wYXRpYmxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBNYXhpbSBQb2xpYWtvdnNraQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGF0YSBuZWVkZWQgZm9yIHRoZSBJbmRlbzUgZGVjb2Rlci4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSU5ERU81REFUQV9ICisjZGVmaW5lIEFWQ09ERUNfSU5ERU81REFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiAgc3RhbmRhcmQgcGljdHVyZSBkaW1lbnNpb25zICh3aWR0aCwgaGVpZ2h0IGRpdmlkZWQgYnkgNCkKKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaXZpNV9jb21tb25fcGljX3NpemVzWzMwXSA9IHsKKyAgICAxNjAsIDEyMCwgODAsIDYwLCA0MCwgMzAsIDE3NiwgMTIwLCA4OCwgNjAsIDg4LCA3MiwgNDQsIDM2LCA2MCwgNDUsIDE2MCwgNjAsCisgICAgMTc2LCAgNjAsIDIwLCAxNSwgMjIsIDE4LCAgIDAsICAgMCwgIDAsICAwLCAgMCwgIDAKK307CisKKworLyoqCisgKiAgSW5kZW81IGRlcXVhbnRpemF0aW9uIG1hdHJpeGVzIGNvbnNpc3Qgb2YgdHdvIHRhYmxlczogYmFzZSB0YWJsZQorICogIGFuZCBzY2FsZSB0YWJsZS4gVGhlIGJhc2UgdGFibGUgZGVmaW5lcyB0aGUgZGVxdWFudGl6YXRpb24gbWF0cml4CisgKiAgaXRzZWxmIGFuZCB0aGUgc2NhbGUgdGFibGUgdGVsbHMgaG93IHRoaXMgbWF0cml4IHNob3VsZCBiZSBzY2FsZWQKKyAqICBmb3IgYSBwYXJ0aWN1bGFyIHF1YW50IGxldmVsICgwLi4uMjQpLgorICoKKyAqICBpdmk1X2Jhc2VfcXVhbnRfYmJiX3R0dCAgLSBiYXNlICB0YWJsZXMgZm9yIGJsb2NrIHNpemUgJ2JiYicgb2YgdHlwZSAndHR0JworICogIGl2aTVfc2NhbGVfcXVhbnRfYmJiX3R0dCAtIHNjYWxlIHRhYmxlcyBmb3IgYmxvY2sgc2l6ZSAnYmJiJyBvZiB0eXBlICd0dHQnCisgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBpdmk1X2Jhc2VfcXVhbnRfOHg4X2ludGVyWzVdWzY0XSA9IHsKKyAgICB7MHgyNiwgMHgzYSwgMHgzZSwgMHg0NiwgMHg0YSwgMHg0ZSwgMHg1MiwgMHg1YSwgMHgzYSwgMHgzZSwgMHg0MiwgMHg0NiwgMHg0YSwgMHg0ZSwgMHg1NiwgMHg1ZSwKKyAgICAgMHgzZSwgMHg0MiwgMHg0NiwgMHg0OCwgMHg0YywgMHg1MiwgMHg1YSwgMHg2MiwgMHg0NiwgMHg0NiwgMHg0OCwgMHg0YSwgMHg0ZSwgMHg1NiwgMHg1ZSwgMHg2NiwKKyAgICAgMHg0YSwgMHg0YSwgMHg0YywgMHg0ZSwgMHg1MiwgMHg1YSwgMHg2MiwgMHg2YSwgMHg0ZSwgMHg0ZSwgMHg1MiwgMHg1NiwgMHg1YSwgMHg1ZSwgMHg2NiwgMHg2ZSwKKyAgICAgMHg1MiwgMHg1NiwgMHg1YSwgMHg1ZSwgMHg2MiwgMHg2NiwgMHg2YSwgMHg3MiwgMHg1YSwgMHg1ZSwgMHg2MiwgMHg2NiwgMHg2YSwgMHg2ZSwgMHg3MiwgMHg3NiwKKyAgICB9LAorICAgIHsweDI2LCAweDNhLCAweDNlLCAweDQ2LCAweDRhLCAweDRlLCAweDUyLCAweDVhLCAweDNhLCAweDNlLCAweDQyLCAweDQ2LCAweDRhLCAweDRlLCAweDU2LCAweDVlLAorICAgICAweDNlLCAweDQyLCAweDQ2LCAweDQ4LCAweDRjLCAweDUyLCAweDVhLCAweDYyLCAweDQ2LCAweDQ2LCAweDQ4LCAweDRhLCAweDRlLCAweDU2LCAweDVlLCAweDY2LAorICAgICAweDRhLCAweDRhLCAweDRjLCAweDRlLCAweDUyLCAweDVhLCAweDYyLCAweDZhLCAweDRlLCAweDRlLCAweDUyLCAweDU2LCAweDVhLCAweDVlLCAweDY2LCAweDZlLAorICAgICAweDUyLCAweDU2LCAweDVhLCAweDVlLCAweDYyLCAweDY2LCAweDZhLCAweDcyLCAweDVhLCAweDVlLCAweDYyLCAweDY2LCAweDZhLCAweDZlLCAweDcyLCAweDc2LAorICAgIH0sCisgICAgezB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsCisgICAgIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsCisgICAgIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsCisgICAgIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsCisgICAgfSwKKyAgICB7MHg0ZSwgMHg0ZSwgMHg0ZSwgMHg0ZSwgMHg0ZSwgMHg0ZSwgMHg0ZSwgMHg0ZSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKyAgICAgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwKKyAgICAgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwKKyAgICAgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwKKyAgICB9LAorICAgIHsweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLAorICAgICAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLAorICAgICAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLAorICAgICAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLAorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBpdmk1X2Jhc2VfcXVhbnRfOHg4X2ludHJhWzVdWzY0XSA9IHsKKyAgICB7MHgxYSwgMHgyZSwgMHgzNiwgMHg0MiwgMHg0NiwgMHg0YSwgMHg0ZSwgMHg1YSwgMHgyZSwgMHgzMiwgMHgzZSwgMHg0MiwgMHg0NiwgMHg0ZSwgMHg1NiwgMHg2YSwKKyAgICAgMHgzNiwgMHgzZSwgMHgzZSwgMHg0NCwgMHg0YSwgMHg1NCwgMHg2NiwgMHg3MiwgMHg0MiwgMHg0MiwgMHg0NCwgMHg0YSwgMHg1MiwgMHg2MiwgMHg2YywgMHg3YSwKKyAgICAgMHg0NiwgMHg0NiwgMHg0YSwgMHg1MiwgMHg1ZSwgMHg2NiwgMHg3MiwgMHg4ZSwgMHg0YSwgMHg0ZSwgMHg1NCwgMHg2MiwgMHg2NiwgMHg2ZSwgMHg4NiwgMHhhNiwKKyAgICAgMHg0ZSwgMHg1NiwgMHg2NiwgMHg2YywgMHg3MiwgMHg4NiwgMHg5YSwgMHhjYSwgMHg1YSwgMHg2YSwgMHg3MiwgMHg3YSwgMHg4ZSwgMHhhNiwgMHhjYSwgMHhmZSwKKyAgICB9LAorICAgIHsweDI2LCAweDNhLCAweDNlLCAweDQ2LCAweDRhLCAweDRlLCAweDUyLCAweDVhLCAweDNhLCAweDNlLCAweDQyLCAweDQ2LCAweDRhLCAweDRlLCAweDU2LCAweDVlLAorICAgICAweDNlLCAweDQyLCAweDQ2LCAweDQ4LCAweDRjLCAweDUyLCAweDVhLCAweDYyLCAweDQ2LCAweDQ2LCAweDQ4LCAweDRhLCAweDRlLCAweDU2LCAweDVlLCAweDY2LAorICAgICAweDRhLCAweDRhLCAweDRjLCAweDRlLCAweDUyLCAweDVhLCAweDYyLCAweDZhLCAweDRlLCAweDRlLCAweDUyLCAweDU2LCAweDVhLCAweDVlLCAweDY2LCAweDZlLAorICAgICAweDUyLCAweDU2LCAweDVhLCAweDVlLCAweDYyLCAweDY2LCAweDZhLCAweDcyLCAweDVhLCAweDVlLCAweDYyLCAweDY2LCAweDZhLCAweDZlLCAweDcyLCAweDc2LAorICAgIH0sCisgICAgezB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsCisgICAgIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsCisgICAgIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsCisgICAgIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsIDB4NGUsIDB4YWEsIDB4ZjIsIDB4ZDQsIDB4ZGUsIDB4YzIsIDB4ZDYsIDB4YzIsCisgICAgfSwKKyAgICB7MHg0ZSwgMHg0ZSwgMHg0ZSwgMHg0ZSwgMHg0ZSwgMHg0ZSwgMHg0ZSwgMHg0ZSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKyAgICAgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwKKyAgICAgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwKKyAgICAgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwKKyAgICB9LAorICAgIHsweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLAorICAgICAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLAorICAgICAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLAorICAgICAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLCAweDVlLAorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBpdmk1X2Jhc2VfcXVhbnRfNHg0X2ludGVyWzE2XSA9IHsKKyAgICAweDFlLCAweDNlLCAweDRhLCAweDUyLCAweDNlLCAweDRhLCAweDUyLCAweDU2LCAweDRhLCAweDUyLCAweDU2LCAweDVlLCAweDUyLCAweDU2LCAweDVlLCAweDY2Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgaXZpNV9iYXNlX3F1YW50XzR4NF9pbnRyYVsxNl0gPSB7CisgICAgMHgxZSwgMHgzZSwgMHg0YSwgMHg1MiwgMHgzZSwgMHg0YSwgMHg1MiwgMHg1ZSwgMHg0YSwgMHg1MiwgMHg1ZSwgMHg3YSwgMHg1MiwgMHg1ZSwgMHg3YSwgMHg5MgorfTsKKworCitzdGF0aWMgY29uc3QgdWludDhfdCBpdmk1X3NjYWxlX3F1YW50Xzh4OF9pbnRlcls1XVsyNF0gPSB7CisgICAgezB4MGIsIDB4MTEsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTgsIDB4MWEsIDB4MWIsIDB4MWQsIDB4MjAsIDB4MjIsCisgICAgIDB4MjMsIDB4MjUsIDB4MjgsIDB4MmEsIDB4MmUsIDB4MzIsIDB4MzUsIDB4MzksIDB4M2QsIDB4NDEsIDB4NDQsIDB4NGEsCisgICAgfSwKKyAgICB7MHgwNywgMHgxNCwgMHgxNiwgMHgxOCwgMHgxYiwgMHgxZSwgMHgyMiwgMHgyNSwgMHgyOSwgMHgyZCwgMHgzMSwgMHgzNSwKKyAgICAgMHgzYSwgMHgzZiwgMHg0NCwgMHg0YSwgMHg1MCwgMHg1NiwgMHg1YywgMHg2MywgMHg2YSwgMHg3MSwgMHg3OCwgMHg3ZSwKKyAgICB9LAorICAgIHsweDE1LCAweDI1LCAweDI4LCAweDJkLCAweDMwLCAweDM0LCAweDNhLCAweDNkLCAweDQyLCAweDQ4LCAweDRjLCAweDUxLAorICAgICAweDU2LCAweDViLCAweDYwLCAweDY1LCAweDZiLCAweDcwLCAweDc2LCAweDdjLCAweDgyLCAweDg4LCAweDhmLCAweDk3LAorICAgIH0sCisgICAgezB4MTMsIDB4MWYsIDB4MjAsIDB4MjIsIDB4MjUsIDB4MjgsIDB4MmIsIDB4MmQsIDB4MzAsIDB4MzMsIDB4MzYsIDB4MzksCisgICAgIDB4M2MsIDB4M2YsIDB4NDIsIDB4NDUsIDB4NDgsIDB4NGIsIDB4NGUsIDB4NTIsIDB4NTYsIDB4NWEsIDB4NWUsIDB4NjIsCisgICAgfSwKKyAgICB7MHgzYywgMHg1MiwgMHg1OCwgMHg1ZCwgMHg2MywgMHg2OCwgMHg2OCwgMHg2ZCwgMHg3MywgMHg3OCwgMHg3YywgMHg4MCwKKyAgICAgMHg4NCwgMHg4OSwgMHg4ZSwgMHg5MywgMHg5OCwgMHg5ZCwgMHhhMywgMHhhOSwgMHhhZCwgMHhiMSwgMHhiNSwgMHhiYSwKKyAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaXZpNV9zY2FsZV9xdWFudF84eDhfaW50cmFbNV1bMjRdID0geworICAgIHsweDBiLCAweDBlLCAweDEwLCAweDEyLCAweDE0LCAweDE2LCAweDE3LCAweDE4LCAweDFhLCAweDFjLCAweDFlLCAweDIwLAorICAgICAweDIyLCAweDI0LCAweDI3LCAweDI4LCAweDJhLCAweDJkLCAweDJmLCAweDMxLCAweDM0LCAweDM3LCAweDM5LCAweDNjLAorICAgIH0sCisgICAgezB4MDEsIDB4MTAsIDB4MTIsIDB4MTQsIDB4MTYsIDB4MTgsIDB4MWIsIDB4MWUsIDB4MjIsIDB4MjUsIDB4MjgsIDB4MmMsCisgICAgIDB4MzAsIDB4MzQsIDB4MzgsIDB4M2QsIDB4NDIsIDB4NDcsIDB4NGMsIDB4NTIsIDB4NTgsIDB4NWUsIDB4NjUsIDB4NmMsCisgICAgfSwKKyAgICB7MHgxMywgMHgyMiwgMHgyNywgMHgyYSwgMHgyZCwgMHgzMywgMHgzNiwgMHgzYywgMHg0MSwgMHg0NSwgMHg0OSwgMHg0ZSwKKyAgICAgMHg1MywgMHg1OCwgMHg1ZCwgMHg2MywgMHg2OSwgMHg2ZiwgMHg3NSwgMHg3YywgMHg4MiwgMHg4OCwgMHg4ZSwgMHg5NSwKKyAgICB9LAorICAgIHsweDEzLCAweDFmLCAweDIxLCAweDI0LCAweDI3LCAweDI5LCAweDJkLCAweDJmLCAweDM0LCAweDM3LCAweDNhLCAweDNkLAorICAgICAweDQwLCAweDQ0LCAweDQ4LCAweDRjLCAweDRmLCAweDUyLCAweDU2LCAweDVhLCAweDVlLCAweDYyLCAweDY2LCAweDZiLAorICAgIH0sCisgICAgezB4MzEsIDB4NDIsIDB4NDcsIDB4NDcsIDB4NGQsIDB4NTIsIDB4NTgsIDB4NTgsIDB4NWQsIDB4NjMsIDB4NjcsIDB4NmIsCisgICAgIDB4NmYsIDB4NzMsIDB4NzgsIDB4N2MsIDB4ODAsIDB4ODQsIDB4ODksIDB4OGUsIDB4OTMsIDB4OTgsIDB4OWQsIDB4YTQsCisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaXZpNV9zY2FsZV9xdWFudF80eDRfaW50ZXJbMjRdID0geworICAgIDB4MGIsIDB4MGQsIDB4MGQsIDB4MGUsIDB4MTEsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsCisgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGl2aTVfc2NhbGVfcXVhbnRfNHg0X2ludHJhWzI0XSA9IHsKKyAgICAweDAxLCAweDBiLCAweDBiLCAweDBkLCAweDBkLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEzLCAweDE0LAorICAgIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAKK307CisKKworI2VuZGlmIC8qIEFWQ09ERUNfSU5ERU81REFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9pbnRlbGgyNjNkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ludGVsaDI2M2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZDFjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9pbnRlbGgyNjNkZWMuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIEguMjYzaSBkZWNvZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJoMjYzLmgiCisKKy8qIGRvbid0IHVuZGVyc3RhbmQgd2h5IHRoZXkgY2hvb3NlIGEgZGlmZmVyZW50IGhlYWRlciAhICovCitpbnQgZmZfaW50ZWxfaDI2M19kZWNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IGZvcm1hdDsKKworICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPT0gNjQpIHsgLyogc3BlY2lhbCBkdW1teSBmcmFtZXMgKi8KKyAgICAgICAgcmV0dXJuIEZSQU1FX1NLSVBQRUQ7CisgICAgfQorCisgICAgLyogcGljdHVyZSBoZWFkZXIgKi8KKyAgICBpZiAoZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIDIyKSAhPSAweDIwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQmFkIHBpY3R1cmUgc3RhcnQgY29kZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcy0+cGljdHVyZV9udW1iZXIgPSBnZXRfYml0cygmcy0+Z2IsIDgpOyAvKiBwaWN0dXJlIHRpbWVzdGFtcCAqLworCisgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJCYWQgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgIC8qIG1hcmtlciAqLworICAgIH0KKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikgIT0gMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkJhZCBIMjYzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgIC8qIGgyNjMgaWQgKi8KKyAgICB9CisgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOyAgICAgICAgIC8qIHNwbGl0IHNjcmVlbiBvZmYgKi8KKyAgICBza2lwX2JpdHMxKCZzLT5nYik7ICAgICAgICAgLyogY2FtZXJhICBvZmYgKi8KKyAgICBza2lwX2JpdHMxKCZzLT5nYik7ICAgICAgICAgLyogZnJlZXplIHBpY3R1cmUgcmVsZWFzZSBvZmYgKi8KKworICAgIGZvcm1hdCA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CisgICAgaWYgKGZvcm1hdCA9PSAwIHx8IGZvcm1hdCA9PSA2KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW50ZWwgSDI2MyBmcmVlIGZvcm1hdCBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzLT5oMjYzX3BsdXMgPSAwOworCisgICAgcy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0kgKyBnZXRfYml0czEoJnMtPmdiKTsKKworICAgIHMtPmgyNjNfbG9uZ192ZWN0b3JzID0gZ2V0X2JpdHMxKCZzLT5nYik7CisKKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikgIT0gMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlNBQyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgIC8qIFNBQzogb2ZmICovCisgICAgfQorICAgIHMtPm9ibWM9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgIHMtPnVucmVzdHJpY3RlZF9tdiA9IHMtPm9ibWMgfHwgcy0+aDI2M19sb25nX3ZlY3RvcnM7CisgICAgcy0+cGJfZnJhbWUgPSBnZXRfYml0czEoJnMtPmdiKTsKKworICAgIGlmIChmb3JtYXQgPCA2KSB7CisgICAgICAgIHMtPndpZHRoID0gZmZfaDI2M19mb3JtYXRbZm9ybWF0XVswXTsKKyAgICAgICAgcy0+aGVpZ2h0ID0gZmZfaDI2M19mb3JtYXRbZm9ybWF0XVsxXTsKKyAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID0gMTI7CisgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9IDExOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdCA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CisgICAgICAgIGlmKGZvcm1hdCA9PSAwIHx8IGZvcm1hdCA9PSA3KXsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiV3JvbmcgSW50ZWwgSDI2MyBmb3JtYXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmKGdldF9iaXRzKCZzLT5nYiwgMikpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkJhZCB2YWx1ZSBmb3IgcmVzZXJ2ZWQgZmllbGRcbiIpOworICAgICAgICBzLT5sb29wX2ZpbHRlciA9IGdldF9iaXRzMSgmcy0+Z2IpICogIXMtPmF2Y3R4LT5sb3dyZXM7CisgICAgICAgIGlmKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJCYWQgdmFsdWUgZm9yIHJlc2VydmVkIGZpZWxkXG4iKTsKKyAgICAgICAgaWYoZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgICAgICBzLT5wYl9mcmFtZSA9IDI7CisgICAgICAgIGlmKGdldF9iaXRzKCZzLT5nYiwgNSkpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkJhZCB2YWx1ZSBmb3IgcmVzZXJ2ZWQgZmllbGRcbiIpOworICAgICAgICBpZihnZXRfYml0cygmcy0+Z2IsIDUpICE9IDEpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbWFya2VyXG4iKTsKKyAgICB9CisgICAgaWYoZm9ybWF0ID09IDYpeworICAgICAgICBpbnQgYXIgPSBnZXRfYml0cygmcy0+Z2IsIDQpOworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA5KTsgLy8gZGlzcGxheSB3aWR0aAorICAgICAgICBza2lwX2JpdHMxKCZzLT5nYik7CisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDkpOyAvLyBkaXNwbGF5IGhlaWdodAorICAgICAgICBpZihhciA9PSAxNSl7CisgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPSBnZXRfYml0cygmcy0+Z2IsIDgpOyAvLyBhc3BlY3QgcmF0aW8gLSB3aWR0aAorICAgICAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsgLy8gYXNwZWN0IHJhdGlvIC0gaGVpZ2h0CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGZmX2gyNjNfcGl4ZWxfYXNwZWN0W2FyXTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID09IDApCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYXNwZWN0IHJhdGlvLlxuIik7CisgICAgfQorCisgICAgcy0+Y2hyb21hX3FzY2FsZT0gcy0+cXNjYWxlID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKKyAgICBza2lwX2JpdHMxKCZzLT5nYik7IC8qIENvbnRpbnVvdXMgUHJlc2VuY2UgTXVsdGlwb2ludCBtb2RlOiBvZmYgKi8KKworICAgIGlmKHMtPnBiX2ZyYW1lKXsKKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMyk7IC8vdGVtcG9yYWwgcmVmZXJlbmNlIGZvciBCLWZyYW1lCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDIpOyAvL2RicXVhbnQKKyAgICB9CisKKyAgICAvKiBQRUkgKi8KKyAgICBpZiAoc2tpcF8xc3RvcF84ZGF0YV9iaXRzKCZzLT5nYikgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBzLT5mX2NvZGUgPSAxOworCisgICAgcy0+eV9kY19zY2FsZV90YWJsZT0KKyAgICBzLT5jX2RjX3NjYWxlX3RhYmxlPSBmZl9tcGVnMV9kY19zY2FsZV90YWJsZTsKKworICAgIGZmX2gyNjNfc2hvd19waWN0X2luZm8ocyk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9oMjYzaV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoMjYzaSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkludGVsIEguMjYzIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjNJLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IENPREVDX0NBUF9EUjEsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9pbnRlcm5hbC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGUxMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW50ZXJuYWwuaApAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBjb21tb24gaW50ZXJuYWwgYXBpIGhlYWRlci4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSU5URVJOQUxfSAorI2RlZmluZSBBVkNPREVDX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2J1ZmZlci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNkZWZpbmUgRkZfU0FORV9OQl9DSEFOTkVMUyA2M1UKKworI2RlZmluZSBGRl9TSUdOQklUKHgpICgoeCkgPj4gQ0hBUl9CSVQgKiBzaXplb2YoeCkgLSAxKQorCisjaWYgSEFWRV9BVlgKKyMgICBkZWZpbmUgU1RSSURFX0FMSUdOIDMyCisjZWxpZiBIQVZFX1NJTURfQUxJR05fMTYKKyMgICBkZWZpbmUgU1RSSURFX0FMSUdOIDE2CisjZWxzZQorIyAgIGRlZmluZSBTVFJJREVfQUxJR04gOAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEZyYW1lUG9vbCB7CisgICAgLyoqCisgICAgICogUG9vbHMgZm9yIGVhY2ggZGF0YSBwbGFuZS4gRm9yIGF1ZGlvIGFsbCB0aGUgcGxhbmVzIGhhdmUgdGhlIHNhbWUgc2l6ZSwKKyAgICAgKiBzbyBvbmx5IHBvb2xzWzBdIGlzIHVzZWQuCisgICAgICovCisgICAgQVZCdWZmZXJQb29sICpwb29sc1s0XTsKKworICAgIC8qCisgICAgICogUG9vbCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaW50IGZvcm1hdDsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgc3RyaWRlX2FsaWduW0FWX05VTV9EQVRBX1BPSU5URVJTXTsKKyAgICBpbnQgbGluZXNpemVbNF07CisgICAgaW50IHBsYW5lczsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IHNhbXBsZXM7Cit9IEZyYW1lUG9vbDsKKwordHlwZWRlZiBzdHJ1Y3QgQVZDb2RlY0ludGVybmFsIHsKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBwYXJlbnQgQVZDb2RlY0NvbnRleHQgaXMgYSBjb3B5IG9mIHRoZSBjb250ZXh0IHdoaWNoIGhhZAorICAgICAqIGluaXQoKSBjYWxsZWQgb24gaXQuCisgICAgICogVGhpcyBpcyB1c2VkIGJ5IG11bHRpdGhyZWFkaW5nIC0gc2hhcmVkIHRhYmxlcyBhbmQgcGljdHVyZSBwb2ludGVycworICAgICAqIHNob3VsZCBiZSBmcmVlZCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9ubHkuCisgICAgICovCisgICAgaW50IGlzX2NvcHk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFsbG9jYXRlIHByb2dyZXNzIGZvciBmcmFtZSB0aHJlYWRpbmcuCisgICAgICoKKyAgICAgKiBUaGUgY29kZWMgbXVzdCBzZXQgaXQgdG8gMSBpZiBpdCB1c2VzIGZmX3RocmVhZF9hd2FpdC9yZXBvcnRfcHJvZ3Jlc3MoKSwKKyAgICAgKiB0aGVuIHByb2dyZXNzIHdpbGwgYmUgYWxsb2NhdGVkIGluIGZmX3RocmVhZF9nZXRfYnVmZmVyKCkuIFRoZSBmcmFtZXMKKyAgICAgKiB0aGVuIE1VU1QgYmUgZnJlZWQgd2l0aCBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoKS4KKyAgICAgKgorICAgICAqIElmIHRoZSBjb2RlYyBkb2VzIG5vdCBuZWVkIHRvIGNhbGwgdGhlIHByb2dyZXNzIGZ1bmN0aW9ucyAodGhlcmUgYXJlIG5vCisgICAgICogZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlIGZyYW1lcyksIGl0IHNob3VsZCBsZWF2ZSB0aGlzIGF0IDAuIFRoZW4gaXQgY2FuCisgICAgICogZGVjb2RlIHN0cmFpZ2h0IHRvIHRoZSB1c2VyLXByb3ZpZGVkIGZyYW1lcyAod2hpY2ggdGhlIHVzZXIgd2lsbCB0aGVuCisgICAgICogZnJlZSB3aXRoIGF2X2ZyYW1lX3VucmVmKCkpLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwKKyAgICAgKiBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoKS4KKyAgICAgKi8KKyAgICBpbnQgYWxsb2NhdGVfcHJvZ3Jlc3M7CisKKyNpZiBGRl9BUElfT0xEX0VOQ09ERV9BVURJTworICAgIC8qKgorICAgICAqIEludGVybmFsIHNhbXBsZSBjb3VudCB1c2VkIGJ5IGF2Y29kZWNfZW5jb2RlX2F1ZGlvKCkgdG8gZmFicmljYXRlIHB0cy4KKyAgICAgKiBDYW4gYmUgcmVtb3ZlZCBhbG9uZyB3aXRoIGF2Y29kZWNfZW5jb2RlX2F1ZGlvKCkuCisgICAgICovCisgICAgaW50NjRfdCBzYW1wbGVfY291bnQ7CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIEFuIGF1ZGlvIGZyYW1lIHdpdGggbGVzcyB0aGFuIHJlcXVpcmVkIHNhbXBsZXMgaGFzIGJlZW4gc3VibWl0dGVkIGFuZAorICAgICAqIHBhZGRlZCB3aXRoIHNpbGVuY2UuIFJlamVjdCBhbGwgc3Vic2VxdWVudCBmcmFtZXMuCisgICAgICovCisgICAgaW50IGxhc3RfYXVkaW9fZnJhbWU7CisKKyAgICBBVkZyYW1lICp0b19mcmVlOworCisgICAgRnJhbWVQb29sICpwb29sOworCisgICAgdm9pZCAqdGhyZWFkX2N0eDsKKworICAgIC8qKgorICAgICAqIEN1cnJlbnQgcGFja2V0IGFzIHBhc3NlZCBpbnRvIHRoZSBkZWNvZGVyLCB0byBhdm9pZCBoYXZpbmcgdG8gcGFzcyB0aGUKKyAgICAgKiBwYWNrZXQgaW50byBldmVyeSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBBVlBhY2tldCAqcGt0OworCisgICAgLyoqCisgICAgICogdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBlbmNvZGVycyB0byBzdG9yZSB0aGVpciBiaXRzdHJlYW0KKyAgICAgKi8KKyAgICB1aW50OF90ICpieXRlX2J1ZmZlcjsKKyAgICB1bnNpZ25lZCBpbnQgYnl0ZV9idWZmZXJfc2l6ZTsKKworICAgIHZvaWQgKmZyYW1lX3RocmVhZF9lbmNvZGVyOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGF1ZGlvIHNhbXBsZXMgdG8gc2tpcCBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZGVjb2RlZCBmcmFtZQorICAgICAqLworICAgIGludCBza2lwX3NhbXBsZXM7CisKKyAgICAvKioKKyAgICAgKiBod2FjY2VsLXNwZWNpZmljIHByaXZhdGUgZGF0YQorICAgICAqLworICAgIHZvaWQgKmh3YWNjZWxfcHJpdl9kYXRhOworfSBBVkNvZGVjSW50ZXJuYWw7CisKK3N0cnVjdCBBVkNvZGVjRGVmYXVsdCB7CisgICAgY29uc3QgdWludDhfdCAqa2V5OworICAgIGNvbnN0IHVpbnQ4X3QgKnZhbHVlOworfTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfbG9nMl9ydW5bNDFdOworCisvKioKKyAqIFJldHVybiB0aGUgaW5kZXggaW50byB0YWIgYXQgd2hpY2gge2EsYn0gbWF0Y2ggZWxlbWVudHMge1swXSxbMV19IG9mIHRhYi4KKyAqIElmIHRoZXJlIGlzIG5vIHN1Y2ggbWF0Y2hpbmcgcGFpciB0aGVuIHNpemUgaXMgcmV0dXJuZWQuCisgKi8KK2ludCBmZl9tYXRjaF8ydWludDE2KGNvbnN0IHVpbnQxNl90ICgqdGFiKVsyXSwgaW50IHNpemUsIGludCBhLCBpbnQgYik7CisKK3Vuc2lnbmVkIGludCBhdnByaXZfdG91cHBlcjQodW5zaWduZWQgaW50IHgpOworCisvKioKKyAqIGRvZXMgbmVlZGVkIHNldHVwIG9mIHBrdF9wdHMvcG9zIGFuZCBzdWNoIGZvciAocmUpZ2V0X2J1ZmZlcigpOworICovCitpbnQgZmZfaW5pdF9idWZmZXJfaW5mbyhBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpOworCisKK3ZvaWQgYXZwcml2X2NvbG9yX2ZyYW1lKEFWRnJhbWUgKmZyYW1lLCBjb25zdCBpbnQgY29sb3JbNF0pOworCitleHRlcm4gdm9sYXRpbGUgaW50IGZmX2F2Y29kZWNfbG9ja2VkOworaW50IGZmX2xvY2tfYXZjb2RlYyhBVkNvZGVjQ29udGV4dCAqbG9nX2N0eCk7CitpbnQgZmZfdW5sb2NrX2F2Y29kZWModm9pZCk7CisKK2ludCBhdnByaXZfbG9ja19hdmZvcm1hdCh2b2lkKTsKK2ludCBhdnByaXZfdW5sb2NrX2F2Zm9ybWF0KHZvaWQpOworCisvKioKKyAqIE1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiBleHRyYWRhdGEuCisgKiBUaGlzIHZhbHVlIHdhcyBjaG9zZW4gc3VjaCB0aGF0IGV2ZXJ5IGJpdCBvZiB0aGUgYnVmZmVyIGlzCisgKiBhZGRyZXNzYWJsZSBieSBhIDMyLWJpdCBzaWduZWQgaW50ZWdlciBhcyB1c2VkIGJ5IGdldF9iaXRzLgorICovCisjZGVmaW5lIEZGX01BWF9FWFRSQURBVEFfU0laRSAoKDEgPDwgMjgpIC0gRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkKKworLyoqCisgKiBDaGVjayBBVlBhY2tldCBzaXplIGFuZC9vciBhbGxvY2F0ZSBkYXRhLgorICoKKyAqIEVuY29kZXJzIHN1cHBvcnRpbmcgQVZDb2RlYy5lbmNvZGUyKCkgY2FuIHVzZSB0aGlzIGFzIGEgY29udmVuaWVuY2UgdG8KKyAqIGVuc3VyZSB0aGUgb3V0cHV0IHBhY2tldCBkYXRhIGlzIGxhcmdlIGVub3VnaCwgd2hldGhlciBwcm92aWRlZCBieSB0aGUgdXNlcgorICogb3IgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIGF2Y3R4ICAgdGhlIEFWQ29kZWNDb250ZXh0IG9mIHRoZSBlbmNvZGVyCisgKiBAcGFyYW0gYXZwa3QgICB0aGUgQVZQYWNrZXQKKyAqICAgICAgICAgICAgICAgIElmIGF2cGt0LT5kYXRhIGlzIGFscmVhZHkgc2V0LCBhdnBrdC0+c2l6ZSBpcyBjaGVja2VkCisgKiAgICAgICAgICAgICAgICB0byBlbnN1cmUgaXQgaXMgbGFyZ2UgZW5vdWdoLgorICogICAgICAgICAgICAgICAgSWYgYXZwa3QtPmRhdGEgaXMgTlVMTCwgYSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZC4KKyAqICAgICAgICAgICAgICAgIGF2cGt0LT5zaXplIGlzIHNldCB0byB0aGUgc3BlY2lmaWVkIHNpemUuCisgKiAgICAgICAgICAgICAgICBBbGwgb3RoZXIgQVZQYWNrZXQgZmllbGRzIHdpbGwgYmUgcmVzZXQgd2l0aCBhdl9pbml0X3BhY2tldCgpLgorICogQHBhcmFtIHNpemUgICAgdGhlIG1pbmltdW0gcmVxdWlyZWQgcGFja2V0IHNpemUKKyAqIEByZXR1cm4gICAgICAgIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBmZl9hbGxvY19wYWNrZXQyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LCBpbnQ2NF90IHNpemUpOworCitpbnQgZmZfYWxsb2NfcGFja2V0KEFWUGFja2V0ICphdnBrdCwgaW50IHNpemUpOworCisvKioKKyAqIFJlc2NhbGUgZnJvbSBzYW1wbGUgcmF0ZSB0byBBVkNvZGVjQ29udGV4dC50aW1lX2Jhc2UuCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludDY0X3QgZmZfc2FtcGxlc190b190aW1lX2Jhc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZXMpCit7CisgICAgaWYoc2FtcGxlcyA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworICAgIHJldHVybiBhdl9yZXNjYWxlX3Eoc2FtcGxlcywgKEFWUmF0aW9uYWwpeyAxLCBhdmN0eC0+c2FtcGxlX3JhdGUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UpOworfQorCisvKioKKyAqIEdldCBhIGJ1ZmZlciBmb3IgYSBmcmFtZS4gVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kCisgKiBBVkNvZGVjQ29udGV4dC5nZXRfYnVmZmVyKCkgYW5kIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgY2FsbGluZyBnZXRfYnVmZmVyKCkKKyAqIGRpcmVjdGx5LgorICovCitpbnQgZmZfZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpOworCisvKioKKyAqIElkZW50aWNhbCBpbiBmdW5jdGlvbiB0byBhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKCksIGV4Y2VwdCBpdCB1c2VzCisgKiBmZl9nZXRfYnVmZmVyKCkgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciB3aGVuIG5lZWRlZC4KKyAqLworaW50IGZmX3JlZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKTsKKworaW50IGZmX3RocmVhZF9jYW5fc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworaW50IGF2cHJpdl9oMjY0X2hhc19udW1fcmVvcmRlcl9mcmFtZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworLyoqCisgKiBDYWxsIGF2Y29kZWNfb3BlbjIgcmVjdXJzaXZlbHkgYnkgZGVjcmVtZW50aW5nIGNvdW50ZXIsIHVubG9ja2luZyBtdXRleCwKKyAqIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIGFuZCB0aGVuIHJlc3RvcmluZyBhZ2Fpbi4gQXNzdW1lcyB0aGUgbXV0ZXggaXMKKyAqIGFscmVhZHkgbG9ja2VkCisgKi8KK2ludCBmZl9jb2RlY19vcGVuMl9yZWN1cnNpdmUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkNvZGVjICpjb2RlYywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucyk7CisKKy8qKgorICogRmluYWxpemUgYnVmIGludG8gZXh0cmFkYXRhIGFuZCBzZXQgaXRzIHNpemUgYXBwcm9wcmlhdGVseS4KKyAqLworaW50IGF2cHJpdl9icHJpbnRfdG9fZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgc3RydWN0IEFWQlByaW50ICpidWYpOworCitjb25zdCB1aW50OF90ICphdnByaXZfZmluZF9zdGFydF9jb2RlKGNvbnN0IHVpbnQ4X3QgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnN0YXRlKTsKKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBwcm92aWRlZCBmcmFtZSBkaW1lbnNpb25zIGFyZSB2YWxpZCBhbmQgc2V0IHRoZW0gb24gdGhlIGNvZGVjCisgKiBjb250ZXh0LgorICovCitpbnQgZmZfc2V0X2RpbWVuc2lvbnMoQVZDb2RlY0NvbnRleHQgKnMsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8qKgorICogQ2hlY2sgdGhhdCB0aGUgcHJvdmlkZWQgc2FtcGxlIGFzcGVjdCByYXRpbyBpcyB2YWxpZCBhbmQgc2V0IGl0IG9uIHRoZSBjb2RlYworICogY29udGV4dC4KKyAqLworaW50IGZmX3NldF9zYXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlJhdGlvbmFsIHNhcik7CisKKy8qKgorICogQWRkIG9yIHVwZGF0ZSBBVl9GUkFNRV9EQVRBX01BVFJJWEVOQ09ESU5HIHNpZGUgZGF0YS4KKyAqLworaW50IGZmX3NpZGVfZGF0YV91cGRhdGVfbWF0cml4X2VuY29kaW5nKEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZNYXRyaXhFbmNvZGluZyBtYXRyaXhfZW5jb2RpbmcpOworCisvKioKKyAqIFNlbGVjdCB0aGUgKHBvc3NpYmx5IGhhcmR3YXJlIGFjY2VsZXJhdGVkKSBwaXhlbCBmb3JtYXQuCisgKiBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgQVZDb2RlY0NvbnRleHQuZ2V0X2Zvcm1hdCgpIGFuZCBzaG91bGQgYmUgdXNlZAorICogaW5zdGVhZCBvZiBjYWxsaW5nIGdldF9mb3JtYXQoKSBkaXJlY3RseS4KKyAqLworaW50IGZmX2dldF9mb3JtYXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKmZtdCk7CisKKy8qKgorICogU2V0IHZhcmlvdXMgZnJhbWUgcHJvcGVydGllcyBmcm9tIHRoZSBjb2RlYyBjb250ZXh0IC8gcGFja2V0IGRhdGEuCisgKi8KK2ludCBmZl9kZWNvZGVfZnJhbWVfcHJvcHMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ludGVycGxheXZpZGVvLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9pbnRlcnBsYXl2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YzBjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9pbnRlcnBsYXl2aWRlby5jCkBAIC0wLDAgKzEsMTA1MiBAQAorLyoKKyAqIEludGVycGxheSBNVkUgVmlkZW8gRGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBJbnRlcnBsYXkgTVZFIFZpZGVvIERlY29kZXIgYnkgTWlrZSBNZWxhbnNvbiAobWVsYW5zb25AcGNpc3lzLm5ldCkKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBJbnRlcnBsYXkgTVZFIGZvcm1hdCwgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzL2ludGVycGxheS1tdmUudHh0CisgKiBUaGlzIGNvZGUgaXMgd3JpdHRlbiBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIGlkZW50aWZpZXJzIG1hdGNoIHVwCisgKiB3aXRoIHRoZSBlbmNvZGluZyBkZXNjcmlwdGlvbnMgaW4gdGhlIGRvY3VtZW50LgorICoKKyAqIFRoaXMgZGVjb2RlciBwcmVzZW50bHkgb25seSBzdXBwb3J0cyBhIFBBTDggb3V0cHV0IGNvbG9yc3BhY2UuCisgKgorICogQW4gSW50ZXJwbGF5IHZpZGVvIGZyYW1lIGNvbnNpc3RzIG9mIDIgcGFydHM6IFRoZSBkZWNvZGluZyBtYXAgYW5kCisgKiB0aGUgdmlkZW8gZGF0YS4gQSBkZW11eGVyIG11c3QgbG9hZCB0aGVzZSAyIHBhcnRzIHRvZ2V0aGVyIGluIGEgc2luZ2xlCisgKiBidWZmZXIgYmVmb3JlIHNlbmRpbmcgaXQgdGhyb3VnaCB0aGUgc3RyZWFtIHRvIHRoaXMgZGVjb2Rlci4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaHBlbGRzcC5oIgorI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFBBTEVUVEVfQ09VTlQgMjU2CisKK3R5cGVkZWYgc3RydWN0IElwdmlkZW9Db250ZXh0IHsKKworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBIcGVsRFNQQ29udGV4dCBoZHNwOworICAgIEFWRnJhbWUgKnNlY29uZF9sYXN0X2ZyYW1lOworICAgIEFWRnJhbWUgKmxhc3RfZnJhbWU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGVjb2RpbmdfbWFwOworICAgIGludCBkZWNvZGluZ19tYXBfc2l6ZTsKKworICAgIGludCBpc18xNmJwcDsKKyAgICBHZXRCeXRlQ29udGV4dCBzdHJlYW1fcHRyLCBtdl9wdHI7CisgICAgdW5zaWduZWQgY2hhciAqcGl4ZWxfcHRyOworICAgIGludCBsaW5lX2luYzsKKyAgICBpbnQgc3RyaWRlOworICAgIGludCB1cHBlcl9tb3Rpb25fbGltaXRfb2Zmc2V0OworCisgICAgdWludDMyX3QgcGFsWzI1Nl07Cit9IElwdmlkZW9Db250ZXh0OworCitzdGF0aWMgaW50IGNvcHlfZnJvbShJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqc3JjLCBBVkZyYW1lICpkc3QsIGludCBkZWx0YV94LCBpbnQgZGVsdGFfeSkKK3sKKyAgICBpbnQgY3VycmVudF9vZmZzZXQgPSBzLT5waXhlbF9wdHIgLSBkc3QtPmRhdGFbMF07CisgICAgaW50IG1vdGlvbl9vZmZzZXQgPSBjdXJyZW50X29mZnNldCArIGRlbHRhX3kgKiBkc3QtPmxpbmVzaXplWzBdCisgICAgICAgICAgICAgICAgICAgICAgICsgZGVsdGFfeCAqICgxICsgcy0+aXNfMTZicHApOworICAgIGlmIChtb3Rpb25fb2Zmc2V0IDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1vdGlvbiBvZmZzZXQgPCAwICglZClcbiIsIG1vdGlvbl9vZmZzZXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9IGVsc2UgaWYgKG1vdGlvbl9vZmZzZXQgPiBzLT51cHBlcl9tb3Rpb25fbGltaXRfb2Zmc2V0KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibW90aW9uIG9mZnNldCBhYm92ZSBsaW1pdCAoJWQgPj0gJWQpXG4iLAorICAgICAgICAgICAgbW90aW9uX29mZnNldCwgcy0+dXBwZXJfbW90aW9uX2xpbWl0X29mZnNldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoIXNyYy0+ZGF0YVswXSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZGVjb2RlIHR5cGUsIGNvcnJ1cHRlZCBoZWFkZXI/XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYlshcy0+aXNfMTZicHBdWzBdKHMtPnBpeGVsX3B0ciwgc3JjLT5kYXRhWzBdICsgbW90aW9uX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5saW5lc2l6ZVswXSwgOCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4MChJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgcmV0dXJuIGNvcHlfZnJvbShzLCBzLT5sYXN0X2ZyYW1lLCBmcmFtZSwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4MShJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgcmV0dXJuIGNvcHlfZnJvbShzLCBzLT5zZWNvbmRfbGFzdF9mcmFtZSwgZnJhbWUsIDAsIDApOworfQorCitzdGF0aWMgaW50IGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weDIoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIHVuc2lnbmVkIGNoYXIgQjsKKyAgICBpbnQgeCwgeTsKKworICAgIC8qIGNvcHkgYmxvY2sgZnJvbSAyIGZyYW1lcyBhZ28gdXNpbmcgYSBtb3Rpb24gdmVjdG9yOyBuZWVkIDEgbW9yZSBieXRlICovCisgICAgaWYgKCFzLT5pc18xNmJwcCkgeworICAgICAgICBCID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPnN0cmVhbV9wdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+bXZfcHRyKTsKKyAgICB9CisKKyAgICBpZiAoQiA8IDU2KSB7CisgICAgICAgIHggPSA4ICsgKEIgJSA3KTsKKyAgICAgICAgeSA9IEIgLyA3OworICAgIH0gZWxzZSB7CisgICAgICAgIHggPSAtMTQgKyAoKEIgLSA1NikgJSAyOSk7CisgICAgICAgIHkgPSAgIDggKyAoKEIgLSA1NikgLyAyOSk7CisgICAgfQorCisgICAgYXZfZGxvZyhzLT5hdmN0eCwgIm1vdGlvbiBieXRlID0gJWQsICh4LCB5KSA9ICglZCwgJWQpXG4iLCBCLCB4LCB5KTsKKyAgICByZXR1cm4gY29weV9mcm9tKHMsIHMtPnNlY29uZF9sYXN0X2ZyYW1lLCBmcmFtZSwgeCwgeSk7Cit9CisKK3N0YXRpYyBpbnQgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4MyhJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgdW5zaWduZWQgY2hhciBCOworICAgIGludCB4LCB5OworCisgICAgLyogY29weSA4eDggYmxvY2sgZnJvbSBjdXJyZW50IGZyYW1lIGZyb20gYW4gdXAvbGVmdCBibG9jayAqLworCisgICAgLyogbmVlZCAxIG1vcmUgYnl0ZSBmb3IgbW90aW9uICovCisgICAgaWYgKCFzLT5pc18xNmJwcCkgeworICAgICAgICBCID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPnN0cmVhbV9wdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+bXZfcHRyKTsKKyAgICB9CisKKyAgICBpZiAoQiA8IDU2KSB7CisgICAgICAgIHggPSAtKDggKyAoQiAlIDcpKTsKKyAgICAgICAgeSA9IC0oQiAvIDcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHggPSAtKC0xNCArICgoQiAtIDU2KSAlIDI5KSk7CisgICAgICAgIHkgPSAtKCAgOCArICgoQiAtIDU2KSAvIDI5KSk7CisgICAgfQorCisgICAgYXZfZGxvZyhzLT5hdmN0eCwgIm1vdGlvbiBieXRlID0gJWQsICh4LCB5KSA9ICglZCwgJWQpXG4iLCBCLCB4LCB5KTsKKyAgICByZXR1cm4gY29weV9mcm9tKHMsIGZyYW1lLCBmcmFtZSwgeCwgeSk7Cit9CisKK3N0YXRpYyBpbnQgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4NChJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHgsIHk7CisgICAgdW5zaWduZWQgY2hhciBCLCBCTCwgQkg7CisKKyAgICAvKiBjb3B5IGEgYmxvY2sgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWU7IG5lZWQgMSBtb3JlIGJ5dGUgKi8KKyAgICBpZiAoIXMtPmlzXzE2YnBwKSB7CisgICAgICAgIEIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+c3RyZWFtX3B0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5tdl9wdHIpOworICAgIH0KKworICAgIEJMID0gQiAmIDB4MEY7CisgICAgQkggPSAoQiA+PiA0KSAmIDB4MEY7CisgICAgeCA9IC04ICsgQkw7CisgICAgeSA9IC04ICsgQkg7CisKKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAibW90aW9uIGJ5dGUgPSAlZCwgKHgsIHkpID0gKCVkLCAlZClcbiIsIEIsIHgsIHkpOworICAgIHJldHVybiBjb3B5X2Zyb20ocywgcy0+bGFzdF9mcmFtZSwgZnJhbWUsIHgsIHkpOworfQorCitzdGF0aWMgaW50IGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weDUoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIHNpZ25lZCBjaGFyIHgsIHk7CisKKyAgICAvKiBjb3B5IGEgYmxvY2sgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUgdXNpbmcgYW4gZXhwYW5kZWQgcmFuZ2U7CisgICAgICogbmVlZCAyIG1vcmUgYnl0ZXMgKi8KKyAgICB4ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPnN0cmVhbV9wdHIpOworICAgIHkgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+c3RyZWFtX3B0cik7CisKKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAibW90aW9uIGJ5dGVzID0gJWQsICVkXG4iLCB4LCB5KTsKKyAgICByZXR1cm4gY29weV9mcm9tKHMsIHMtPmxhc3RfZnJhbWUsIGZyYW1lLCB4LCB5KTsKK30KKworc3RhdGljIGludCBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHg2KElwdmlkZW9Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICAvKiBteXN0ZXJ5IG9wY29kZT8gc2tpcCBtdWx0aXBsZSBibG9ja3M/ICovCisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJIZWxwISBNeXN0ZXJ5IG9wY29kZSAweDYgc2VlblxuIik7CisKKyAgICAvKiByZXBvcnQgc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weDcoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCB4LCB5OworICAgIHVuc2lnbmVkIGNoYXIgUFsyXTsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPnN0cmVhbV9wdHIpIDwgNCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInRvbyBsaXR0bGUgZGF0YSBmb3Igb3Bjb2RlIDB4N1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIDItY29sb3IgZW5jb2RpbmcgKi8KKyAgICBQWzBdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPnN0cmVhbV9wdHIpOworICAgIFBbMV0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+c3RyZWFtX3B0cik7CisKKyAgICBpZiAoUFswXSA8PSBQWzFdKSB7CisKKyAgICAgICAgLyogbmVlZCA4IG1vcmUgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtICovCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgICAgIGZsYWdzID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPnN0cmVhbV9wdHIpIHwgMHgxMDA7CisgICAgICAgICAgICBmb3IgKDsgZmxhZ3MgIT0gMTsgZmxhZ3MgPj49IDEpCisgICAgICAgICAgICAgICAgKnMtPnBpeGVsX3B0cisrID0gUFtmbGFncyAmIDFdOworICAgICAgICAgICAgcy0+cGl4ZWxfcHRyICs9IHMtPmxpbmVfaW5jOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8qIG5lZWQgMiBtb3JlIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSAqLworICAgICAgICBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkgKz0gMikgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHggKz0gMiwgZmxhZ3MgPj49IDEpIHsKKyAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHJbeCAgICAgICAgICAgICAgICBdID0KKyAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHJbeCArIDEgICAgICAgICAgICBdID0KKyAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHJbeCArICAgICBzLT5zdHJpZGVdID0KKyAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHJbeCArIDEgKyBzLT5zdHJpZGVdID0gUFtmbGFncyAmIDFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+cGl4ZWxfcHRyICs9IHMtPnN0cmlkZSAqIDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZXBvcnQgc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weDgoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCB4LCB5OworICAgIHVuc2lnbmVkIGNoYXIgUFs0XTsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5zdHJlYW1fcHRyKSA8IDEyKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIGxpdHRsZSBkYXRhIGZvciBvcGNvZGUgMHg4XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogMi1jb2xvciBlbmNvZGluZyBmb3IgZWFjaCA0eDQgcXVhZHJhbnQsIG9yIDItY29sb3IgZW5jb2Rpbmcgb24KKyAgICAgKiBlaXRoZXIgdG9wIGFuZCBib3R0b20gb3IgbGVmdCBhbmQgcmlnaHQgaGFsdmVzICovCisgICAgUFswXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5zdHJlYW1fcHRyKTsKKyAgICBQWzFdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPnN0cmVhbV9wdHIpOworCisgICAgaWYgKFBbMF0gPD0gUFsxXSkgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworICAgICAgICAgICAgLy8gbmV3IHZhbHVlcyBmb3IgZWFjaCA0eDQgYmxvY2sKKyAgICAgICAgICAgIGlmICghKHkgJiAzKSkgeworICAgICAgICAgICAgICAgIGlmICh5KSB7CisgICAgICAgICAgICAgICAgICAgIFBbMF0gID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPnN0cmVhbV9wdHIpOworICAgICAgICAgICAgICAgICAgICBQWzFdICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+c3RyZWFtX3B0cik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyssIGZsYWdzID4+PSAxKQorICAgICAgICAgICAgICAgICpzLT5waXhlbF9wdHIrKyA9IFBbZmxhZ3MgJiAxXTsKKyAgICAgICAgICAgIHMtPnBpeGVsX3B0ciArPSBzLT5zdHJpZGUgLSA0OworICAgICAgICAgICAgLy8gc3dpdGNoIHRvIHJpZ2h0IGhhbGYKKyAgICAgICAgICAgIGlmICh5ID09IDcpIHMtPnBpeGVsX3B0ciAtPSA4ICogcy0+c3RyaWRlIC0gNDsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+c3RyZWFtX3B0cik7CisgICAgICAgIFBbMl0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+c3RyZWFtX3B0cik7CisgICAgICAgIFBbM10gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+c3RyZWFtX3B0cik7CisKKyAgICAgICAgaWYgKFBbMl0gPD0gUFszXSkgeworCisgICAgICAgICAgICAvKiB2ZXJ0aWNhbCBzcGxpdDsgbGVmdCAmIHJpZ2h0IGhhbHZlcyBhcmUgMi1jb2xvciBlbmNvZGVkICovCisKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKywgZmxhZ3MgPj49IDEpCisgICAgICAgICAgICAgICAgICAgICpzLT5waXhlbF9wdHIrKyA9IFBbZmxhZ3MgJiAxXTsKKyAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHIgKz0gcy0+c3RyaWRlIC0gNDsKKyAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggdG8gcmlnaHQgaGFsZgorICAgICAgICAgICAgICAgIGlmICh5ID09IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+cGl4ZWxfcHRyIC09IDggKiBzLT5zdHJpZGUgLSA0OworICAgICAgICAgICAgICAgICAgICBQWzBdICA9IFBbMl07CisgICAgICAgICAgICAgICAgICAgIFBbMV0gID0gUFszXTsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+c3RyZWFtX3B0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8qIGhvcml6b250YWwgc3BsaXQ7IHRvcCAmIGJvdHRvbSBoYWx2ZXMgYXJlIDItY29sb3IgZW5jb2RlZCAqLworCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHkgPT0gNCkgeworICAgICAgICAgICAgICAgICAgICBQWzBdICA9IFBbMl07CisgICAgICAgICAgICAgICAgICAgIFBbMV0gID0gUFszXTsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+c3RyZWFtX3B0cik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgZmxhZ3MgPj49IDEpCisgICAgICAgICAgICAgICAgICAgICpzLT5waXhlbF9wdHIrKyA9IFBbZmxhZ3MgJiAxXTsKKyAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHIgKz0gcy0+bGluZV9pbmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZXBvcnQgc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weDkoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCB4LCB5OworICAgIHVuc2lnbmVkIGNoYXIgUFs0XTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+c3RyZWFtX3B0cikgPCA4KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIGxpdHRsZSBkYXRhIGZvciBvcGNvZGUgMHg5XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogNC1jb2xvciBlbmNvZGluZyAqLworICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJnMtPnN0cmVhbV9wdHIsIFAsIDQpOworCisgICAgaWYgKFBbMF0gPD0gUFsxXSkgeworICAgICAgICBpZiAoUFsyXSA8PSBQWzNdKSB7CisKKyAgICAgICAgICAgIC8qIDEgb2YgNCBjb2xvcnMgZm9yIGVhY2ggcGl4ZWwsIG5lZWQgMTYgbW9yZSBieXRlcyAqLworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgbmV4dCBzZXQgb2YgOCAyLWJpdCBmbGFncyAqLworICAgICAgICAgICAgICAgIGludCBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBmbGFncyA+Pj0gMikKKyAgICAgICAgICAgICAgICAgICAgKnMtPnBpeGVsX3B0cisrID0gUFtmbGFncyAmIDB4MDNdOworICAgICAgICAgICAgICAgIHMtPnBpeGVsX3B0ciArPSBzLT5saW5lX2luYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3M7CisKKyAgICAgICAgICAgIC8qIDEgb2YgNCBjb2xvcnMgZm9yIGVhY2ggMngyIGJsb2NrLCBuZWVkIDQgbW9yZSBieXRlcyAqLworICAgICAgICAgICAgZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+c3RyZWFtX3B0cik7CisKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCArPSAyLCBmbGFncyA+Pj0gMikgeworICAgICAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHJbeCAgICAgICAgICAgICAgICBdID0KKyAgICAgICAgICAgICAgICAgICAgcy0+cGl4ZWxfcHRyW3ggKyAxICAgICAgICAgICAgXSA9CisgICAgICAgICAgICAgICAgICAgIHMtPnBpeGVsX3B0clt4ICsgICAgIHMtPnN0cmlkZV0gPQorICAgICAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHJbeCArIDEgKyBzLT5zdHJpZGVdID0gUFtmbGFncyAmIDB4MDNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHIgKz0gcy0+c3RyaWRlICogMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDY0X3QgZmxhZ3M7CisKKyAgICAgICAgLyogMSBvZiA0IGNvbG9ycyBmb3IgZWFjaCAyeDEgb3IgMXgyIGJsb2NrLCBuZWVkIDggbW9yZSBieXRlcyAqLworICAgICAgICBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9sZTY0KCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgaWYgKFBbMl0gPD0gUFszXSkgeworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4ICs9IDIsIGZsYWdzID4+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnBpeGVsX3B0clt4ICAgIF0gPQorICAgICAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHJbeCArIDFdID0gUFtmbGFncyAmIDB4MDNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHIgKz0gcy0+c3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkgKz0gMikgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGZsYWdzID4+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnBpeGVsX3B0clt4ICAgICAgICAgICAgXSA9CisgICAgICAgICAgICAgICAgICAgIHMtPnBpeGVsX3B0clt4ICsgcy0+c3RyaWRlXSA9IFBbZmxhZ3MgJiAweDAzXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+cGl4ZWxfcHRyICs9IHMtPnN0cmlkZSAqIDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZXBvcnQgc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weEEoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCB4LCB5OworICAgIHVuc2lnbmVkIGNoYXIgUFs4XTsKKyAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5zdHJlYW1fcHRyKSA8IDE2KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIGxpdHRsZSBkYXRhIGZvciBvcGNvZGUgMHhBXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcy0+c3RyZWFtX3B0ciwgUCwgNCk7CisKKyAgICAvKiA0LWNvbG9yIGVuY29kaW5nIGZvciBlYWNoIDR4NCBxdWFkcmFudCwgb3IgNC1jb2xvciBlbmNvZGluZyBvbgorICAgICAqIGVpdGhlciB0b3AgYW5kIGJvdHRvbSBvciBsZWZ0IGFuZCByaWdodCBoYWx2ZXMgKi8KKyAgICBpZiAoUFswXSA8PSBQWzFdKSB7CisKKyAgICAgICAgLyogNC1jb2xvciBlbmNvZGluZyBmb3IgZWFjaCBxdWFkcmFudDsgbmVlZCAzMiBieXRlcyAqLworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworICAgICAgICAgICAgLy8gbmV3IHZhbHVlcyBmb3IgZWFjaCA0eDQgYmxvY2sKKyAgICAgICAgICAgIGlmICghKHkgJiAzKSkgeworICAgICAgICAgICAgICAgIGlmICh5KSBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZzLT5zdHJlYW1fcHRyLCBQLCA0KTsKKyAgICAgICAgICAgICAgICBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKywgZmxhZ3MgPj49IDIpCisgICAgICAgICAgICAgICAgKnMtPnBpeGVsX3B0cisrID0gUFtmbGFncyAmIDB4MDNdOworCisgICAgICAgICAgICBzLT5waXhlbF9wdHIgKz0gcy0+c3RyaWRlIC0gNDsKKyAgICAgICAgICAgIC8vIHN3aXRjaCB0byByaWdodCBoYWxmCisgICAgICAgICAgICBpZiAoeSA9PSA3KSBzLT5waXhlbF9wdHIgLT0gOCAqIHMtPnN0cmlkZSAtIDQ7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHZlcnRpY2FsIHNwbGl0PworICAgICAgICBpbnQgdmVydDsKKyAgICAgICAgdWludDY0X3QgZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfbGU2NCgmcy0+c3RyZWFtX3B0cik7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcy0+c3RyZWFtX3B0ciwgUCArIDQsIDQpOworICAgICAgICB2ZXJ0ID0gUFs0XSA8PSBQWzVdOworCisgICAgICAgIC8qIDQtY29sb3IgZW5jb2RpbmcgZm9yIGVpdGhlciBsZWZ0IGFuZCByaWdodCBvciB0b3AgYW5kIGJvdHRvbQorICAgICAgICAgKiBoYWx2ZXMgKi8KKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKywgZmxhZ3MgPj49IDIpCisgICAgICAgICAgICAgICAgKnMtPnBpeGVsX3B0cisrID0gUFtmbGFncyAmIDB4MDNdOworCisgICAgICAgICAgICBpZiAodmVydCkgeworICAgICAgICAgICAgICAgIHMtPnBpeGVsX3B0ciArPSBzLT5zdHJpZGUgLSA0OworICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byByaWdodCBoYWxmCisgICAgICAgICAgICAgICAgaWYgKHkgPT0gNykgcy0+cGl4ZWxfcHRyIC09IDggKiBzLT5zdHJpZGUgLSA0OworICAgICAgICAgICAgfSBlbHNlIGlmICh5ICYgMSkgcy0+cGl4ZWxfcHRyICs9IHMtPmxpbmVfaW5jOworCisgICAgICAgICAgICAvLyBsb2FkIHZhbHVlcyBmb3Igc2Vjb25kIGhhbGYKKyAgICAgICAgICAgIGlmICh5ID09IDcpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoUCwgUCArIDQsIDQpOworICAgICAgICAgICAgICAgIGZsYWdzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlNjQoJnMtPnN0cmVhbV9wdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogcmVwb3J0IHN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHhCKElwdmlkZW9Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgeTsKKworICAgIC8qIDY0LWNvbG9yIGVuY29kaW5nIChlYWNoIHBpeGVsIGluIGJsb2NrIGlzIGEgZGlmZmVyZW50IGNvbG9yKSAqLworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcy0+c3RyZWFtX3B0ciwgcy0+cGl4ZWxfcHRyLCA4KTsKKyAgICAgICAgcy0+cGl4ZWxfcHRyICArPSBzLT5zdHJpZGU7CisgICAgfQorCisgICAgLyogcmVwb3J0IHN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHhDKElwdmlkZW9Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIC8qIDE2LWNvbG9yIGJsb2NrIGVuY29kaW5nOiBlYWNoIDJ4MiBibG9jayBpcyBhIGRpZmZlcmVudCBjb2xvciAqLworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5ICs9IDIpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHggKz0gMikgeworICAgICAgICAgICAgcy0+cGl4ZWxfcHRyW3ggICAgICAgICAgICAgICAgXSA9CisgICAgICAgICAgICBzLT5waXhlbF9wdHJbeCArIDEgICAgICAgICAgICBdID0KKyAgICAgICAgICAgIHMtPnBpeGVsX3B0clt4ICsgICAgIHMtPnN0cmlkZV0gPQorICAgICAgICAgICAgcy0+cGl4ZWxfcHRyW3ggKyAxICsgcy0+c3RyaWRlXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgfQorICAgICAgICBzLT5waXhlbF9wdHIgKz0gcy0+c3RyaWRlICogMjsKKyAgICB9CisKKyAgICAvKiByZXBvcnQgc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weEQoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCB5OworICAgIHVuc2lnbmVkIGNoYXIgUFsyXTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+c3RyZWFtX3B0cikgPCA0KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIGxpdHRsZSBkYXRhIGZvciBvcGNvZGUgMHhEXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogNC1jb2xvciBibG9jayBlbmNvZGluZzogZWFjaCA0eDQgYmxvY2sgaXMgYSBkaWZmZXJlbnQgY29sb3IgKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgIGlmICghKHkgJiAzKSkgeworICAgICAgICAgICAgUFswXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgICAgIFBbMV0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+c3RyZWFtX3B0cik7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KHMtPnBpeGVsX3B0ciwgICAgIFBbMF0sIDQpOworICAgICAgICBtZW1zZXQocy0+cGl4ZWxfcHRyICsgNCwgUFsxXSwgNCk7CisgICAgICAgIHMtPnBpeGVsX3B0ciArPSBzLT5zdHJpZGU7CisgICAgfQorCisgICAgLyogcmVwb3J0IHN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHhFKElwdmlkZW9Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgeTsKKyAgICB1bnNpZ25lZCBjaGFyIHBpeDsKKworICAgIC8qIDEtY29sb3IgZW5jb2Rpbmc6IHRoZSB3aG9sZSBibG9jayBpcyAxIHNvbGlkIGNvbG9yICovCisgICAgcGl4ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPnN0cmVhbV9wdHIpOworCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBtZW1zZXQocy0+cGl4ZWxfcHRyLCBwaXgsIDgpOworICAgICAgICBzLT5waXhlbF9wdHIgKz0gcy0+c3RyaWRlOworICAgIH0KKworICAgIC8qIHJlcG9ydCBzdWNjZXNzICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4RihJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHgsIHk7CisgICAgdW5zaWduZWQgY2hhciBzYW1wbGVbMl07CisKKyAgICAvKiBkaXRoZXJlZCBlbmNvZGluZyAqLworICAgIHNhbXBsZVswXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5zdHJlYW1fcHRyKTsKKyAgICBzYW1wbGVbMV0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+c3RyZWFtX3B0cik7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4ICs9IDIpIHsKKyAgICAgICAgICAgICpzLT5waXhlbF9wdHIrKyA9IHNhbXBsZVsgIHkgJiAxIF07CisgICAgICAgICAgICAqcy0+cGl4ZWxfcHRyKysgPSBzYW1wbGVbISh5ICYgMSldOworICAgICAgICB9CisgICAgICAgIHMtPnBpeGVsX3B0ciArPSBzLT5saW5lX2luYzsKKyAgICB9CisKKyAgICAvKiByZXBvcnQgc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weDZfMTYoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIHNpZ25lZCBjaGFyIHgsIHk7CisKKyAgICAvKiBjb3B5IGEgYmxvY2sgZnJvbSB0aGUgc2Vjb25kIGxhc3QgZnJhbWUgdXNpbmcgYW4gZXhwYW5kZWQgcmFuZ2UgKi8KKyAgICB4ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPnN0cmVhbV9wdHIpOworICAgIHkgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+c3RyZWFtX3B0cik7CisKKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAibW90aW9uIGJ5dGVzID0gJWQsICVkXG4iLCB4LCB5KTsKKyAgICByZXR1cm4gY29weV9mcm9tKHMsIHMtPnNlY29uZF9sYXN0X2ZyYW1lLCBmcmFtZSwgeCwgeSk7Cit9CisKK3N0YXRpYyBpbnQgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4N18xNihJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHgsIHk7CisgICAgdWludDE2X3QgUFsyXTsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7CisgICAgdWludDE2X3QgKnBpeGVsX3B0ciA9ICh1aW50MTZfdCopcy0+cGl4ZWxfcHRyOworCisgICAgLyogMi1jb2xvciBlbmNvZGluZyAqLworICAgIFBbMF0gPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+c3RyZWFtX3B0cik7CisgICAgUFsxXSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5zdHJlYW1fcHRyKTsKKworICAgIGlmICghKFBbMF0gJiAweDgwMDApKSB7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICAgICAgZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+c3RyZWFtX3B0cikgfCAweDEwMDsKKyAgICAgICAgICAgIGZvciAoOyBmbGFncyAhPSAxOyBmbGFncyA+Pj0gMSkKKyAgICAgICAgICAgICAgICAqcGl4ZWxfcHRyKysgPSBQW2ZsYWdzICYgMV07CisgICAgICAgICAgICBwaXhlbF9wdHIgKz0gcy0+bGluZV9pbmM7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisKKyAgICAgICAgZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+c3RyZWFtX3B0cik7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5ICs9IDIpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4ICs9IDIsIGZsYWdzID4+PSAxKSB7CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyW3ggICAgICAgICAgICAgICAgXSA9CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyW3ggKyAxICAgICAgICAgICAgXSA9CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyW3ggKyAgICAgcy0+c3RyaWRlXSA9CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyW3ggKyAxICsgcy0+c3RyaWRlXSA9IFBbZmxhZ3MgJiAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpeGVsX3B0ciArPSBzLT5zdHJpZGUgKiAyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4OF8xNihJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHgsIHk7CisgICAgdWludDE2X3QgUFs0XTsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworICAgIHVpbnQxNl90ICpwaXhlbF9wdHIgPSAodWludDE2X3QqKXMtPnBpeGVsX3B0cjsKKworICAgIC8qIDItY29sb3IgZW5jb2RpbmcgZm9yIGVhY2ggNHg0IHF1YWRyYW50LCBvciAyLWNvbG9yIGVuY29kaW5nIG9uCisgICAgICogZWl0aGVyIHRvcCBhbmQgYm90dG9tIG9yIGxlZnQgYW5kIHJpZ2h0IGhhbHZlcyAqLworICAgIFBbMF0gPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+c3RyZWFtX3B0cik7CisgICAgUFsxXSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5zdHJlYW1fcHRyKTsKKworICAgIGlmICghKFBbMF0gJiAweDgwMDApKSB7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHsKKyAgICAgICAgICAgIC8vIG5ldyB2YWx1ZXMgZm9yIGVhY2ggNHg0IGJsb2NrCisgICAgICAgICAgICBpZiAoISh5ICYgMykpIHsKKyAgICAgICAgICAgICAgICBpZiAoeSkgeworICAgICAgICAgICAgICAgICAgICBQWzBdID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnMtPnN0cmVhbV9wdHIpOworICAgICAgICAgICAgICAgICAgICBQWzFdID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnMtPnN0cmVhbV9wdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKywgZmxhZ3MgPj49IDEpCisgICAgICAgICAgICAgICAgKnBpeGVsX3B0cisrID0gUFtmbGFncyAmIDFdOworICAgICAgICAgICAgcGl4ZWxfcHRyICs9IHMtPnN0cmlkZSAtIDQ7CisgICAgICAgICAgICAvLyBzd2l0Y2ggdG8gcmlnaHQgaGFsZgorICAgICAgICAgICAgaWYgKHkgPT0gNykgcGl4ZWxfcHRyIC09IDggKiBzLT5zdHJpZGUgLSA0OworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIGZsYWdzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnMtPnN0cmVhbV9wdHIpOworICAgICAgICBQWzJdICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgUFszXSAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+c3RyZWFtX3B0cik7CisKKyAgICAgICAgaWYgKCEoUFsyXSAmIDB4ODAwMCkpIHsKKworICAgICAgICAgICAgLyogdmVydGljYWwgc3BsaXQ7IGxlZnQgJiByaWdodCBoYWx2ZXMgYXJlIDItY29sb3IgZW5jb2RlZCAqLworCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyssIGZsYWdzID4+PSAxKQorICAgICAgICAgICAgICAgICAgICAqcGl4ZWxfcHRyKysgPSBQW2ZsYWdzICYgMV07CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IHMtPnN0cmlkZSAtIDQ7CisgICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIHJpZ2h0IGhhbGYKKyAgICAgICAgICAgICAgICBpZiAoeSA9PSA3KSB7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciAtPSA4ICogcy0+c3RyaWRlIC0gNDsKKyAgICAgICAgICAgICAgICAgICAgUFswXSAgPSBQWzJdOworICAgICAgICAgICAgICAgICAgICBQWzFdICA9IFBbM107CisgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnMtPnN0cmVhbV9wdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAvKiBob3Jpem9udGFsIHNwbGl0OyB0b3AgJiBib3R0b20gaGFsdmVzIGFyZSAyLWNvbG9yIGVuY29kZWQgKi8KKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICAgICAgICAgIGlmICh5ID09IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgUFswXSAgPSBQWzJdOworICAgICAgICAgICAgICAgICAgICBQWzFdICA9IFBbM107CisgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnMtPnN0cmVhbV9wdHIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGZsYWdzID4+PSAxKQorICAgICAgICAgICAgICAgICAgICAqcGl4ZWxfcHRyKysgPSBQW2ZsYWdzICYgMV07CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IHMtPmxpbmVfaW5jOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogcmVwb3J0IHN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHg5XzE2KElwdmlkZW9Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICB1aW50MTZfdCBQWzRdOworICAgIHVpbnQxNl90ICpwaXhlbF9wdHIgPSAodWludDE2X3QqKXMtPnBpeGVsX3B0cjsKKworICAgIC8qIDQtY29sb3IgZW5jb2RpbmcgKi8KKyAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKQorICAgICAgICBQW3hdID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnMtPnN0cmVhbV9wdHIpOworCisgICAgaWYgKCEoUFswXSAmIDB4ODAwMCkpIHsKKyAgICAgICAgaWYgKCEoUFsyXSAmIDB4ODAwMCkpIHsKKworICAgICAgICAgICAgLyogMSBvZiA0IGNvbG9ycyBmb3IgZWFjaCBwaXhlbCAqLworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgbmV4dCBzZXQgb2YgOCAyLWJpdCBmbGFncyAqLworICAgICAgICAgICAgICAgIGludCBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBmbGFncyA+Pj0gMikKKyAgICAgICAgICAgICAgICAgICAgKnBpeGVsX3B0cisrID0gUFtmbGFncyAmIDB4MDNdOworICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSBzLT5saW5lX2luYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3M7CisKKyAgICAgICAgICAgIC8qIDEgb2YgNCBjb2xvcnMgZm9yIGVhY2ggMngyIGJsb2NrICovCisgICAgICAgICAgICBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZzLT5zdHJlYW1fcHRyKTsKKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkgKz0gMikgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4ICs9IDIsIGZsYWdzID4+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0clt4ICAgICAgICAgICAgICAgIF0gPQorICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHJbeCArIDEgICAgICAgICAgICBdID0KKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyW3ggKyAgICAgcy0+c3RyaWRlXSA9CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0clt4ICsgMSArIHMtPnN0cmlkZV0gPSBQW2ZsYWdzICYgMHgwM107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSBzLT5zdHJpZGUgKiAyOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB1aW50NjRfdCBmbGFnczsKKworICAgICAgICAvKiAxIG9mIDQgY29sb3JzIGZvciBlYWNoIDJ4MSBvciAxeDIgYmxvY2sgKi8KKyAgICAgICAgZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfbGU2NCgmcy0+c3RyZWFtX3B0cik7CisgICAgICAgIGlmICghKFBbMl0gJiAweDgwMDApKSB7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHggKz0gMiwgZmxhZ3MgPj49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyW3ggICAgXSA9CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0clt4ICsgMV0gPSBQW2ZsYWdzICYgMHgwM107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSBzLT5zdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSArPSAyKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgZmxhZ3MgPj49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyW3ggICAgICAgICAgICBdID0KKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyW3ggKyBzLT5zdHJpZGVdID0gUFtmbGFncyAmIDB4MDNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gcy0+c3RyaWRlICogMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlcG9ydCBzdWNjZXNzICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4QV8xNihJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHgsIHk7CisgICAgdWludDE2X3QgUFs4XTsKKyAgICBpbnQgZmxhZ3MgPSAwOworICAgIHVpbnQxNl90ICpwaXhlbF9wdHIgPSAodWludDE2X3QqKXMtPnBpeGVsX3B0cjsKKworICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgIFBbeF0gPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+c3RyZWFtX3B0cik7CisKKyAgICAvKiA0LWNvbG9yIGVuY29kaW5nIGZvciBlYWNoIDR4NCBxdWFkcmFudCwgb3IgNC1jb2xvciBlbmNvZGluZyBvbgorICAgICAqIGVpdGhlciB0b3AgYW5kIGJvdHRvbSBvciBsZWZ0IGFuZCByaWdodCBoYWx2ZXMgKi8KKyAgICBpZiAoIShQWzBdICYgMHg4MDAwKSkgeworCisgICAgICAgIC8qIDQtY29sb3IgZW5jb2RpbmcgZm9yIGVhY2ggcXVhZHJhbnQgKi8KKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHsKKyAgICAgICAgICAgIC8vIG5ldyB2YWx1ZXMgZm9yIGVhY2ggNHg0IGJsb2NrCisgICAgICAgICAgICBpZiAoISh5ICYgMykpIHsKKyAgICAgICAgICAgICAgICBpZiAoeSkKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIFBbeF0gPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+c3RyZWFtX3B0cik7CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+c3RyZWFtX3B0cik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyssIGZsYWdzID4+PSAyKQorICAgICAgICAgICAgICAgICpwaXhlbF9wdHIrKyA9IFBbZmxhZ3MgJiAweDAzXTsKKworICAgICAgICAgICAgcGl4ZWxfcHRyICs9IHMtPnN0cmlkZSAtIDQ7CisgICAgICAgICAgICAvLyBzd2l0Y2ggdG8gcmlnaHQgaGFsZgorICAgICAgICAgICAgaWYgKHkgPT0gNykgcGl4ZWxfcHRyIC09IDggKiBzLT5zdHJpZGUgLSA0OworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB2ZXJ0aWNhbCBzcGxpdD8KKyAgICAgICAgaW50IHZlcnQ7CisgICAgICAgIHVpbnQ2NF90IGZsYWdzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlNjQoJnMtPnN0cmVhbV9wdHIpOworCisgICAgICAgIGZvciAoeCA9IDQ7IHggPCA4OyB4KyspCisgICAgICAgICAgICBQW3hdID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnMtPnN0cmVhbV9wdHIpOworICAgICAgICB2ZXJ0ID0gIShQWzRdICYgMHg4MDAwKTsKKworICAgICAgICAvKiA0LWNvbG9yIGVuY29kaW5nIGZvciBlaXRoZXIgbGVmdCBhbmQgcmlnaHQgb3IgdG9wIGFuZCBib3R0b20KKyAgICAgICAgICogaGFsdmVzICovCisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyssIGZsYWdzID4+PSAyKQorICAgICAgICAgICAgICAgICpwaXhlbF9wdHIrKyA9IFBbZmxhZ3MgJiAweDAzXTsKKworICAgICAgICAgICAgaWYgKHZlcnQpIHsKKyAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gcy0+c3RyaWRlIC0gNDsKKyAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggdG8gcmlnaHQgaGFsZgorICAgICAgICAgICAgICAgIGlmICh5ID09IDcpIHBpeGVsX3B0ciAtPSA4ICogcy0+c3RyaWRlIC0gNDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeSAmIDEpIHBpeGVsX3B0ciArPSBzLT5saW5lX2luYzsKKworICAgICAgICAgICAgLy8gbG9hZCB2YWx1ZXMgZm9yIHNlY29uZCBoYWxmCisgICAgICAgICAgICBpZiAoeSA9PSA3KSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KFAsIFAgKyA0LCA4KTsKKyAgICAgICAgICAgICAgICBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9sZTY0KCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlcG9ydCBzdWNjZXNzICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4Ql8xNihJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHgsIHk7CisgICAgdWludDE2X3QgKnBpeGVsX3B0ciA9ICh1aW50MTZfdCopcy0+cGl4ZWxfcHRyOworCisgICAgLyogNjQtY29sb3IgZW5jb2RpbmcgKGVhY2ggcGl4ZWwgaW4gYmxvY2sgaXMgYSBkaWZmZXJlbnQgY29sb3IpICovCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgcGl4ZWxfcHRyW3hdID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnMtPnN0cmVhbV9wdHIpOworICAgICAgICBwaXhlbF9wdHIgICs9IHMtPnN0cmlkZTsKKyAgICB9CisKKyAgICAvKiByZXBvcnQgc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weENfMTYoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCB4LCB5OworICAgIHVpbnQxNl90ICpwaXhlbF9wdHIgPSAodWludDE2X3QqKXMtPnBpeGVsX3B0cjsKKworICAgIC8qIDE2LWNvbG9yIGJsb2NrIGVuY29kaW5nOiBlYWNoIDJ4MiBibG9jayBpcyBhIGRpZmZlcmVudCBjb2xvciAqLworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5ICs9IDIpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHggKz0gMikgeworICAgICAgICAgICAgcGl4ZWxfcHRyW3ggICAgICAgICAgICAgICAgXSA9CisgICAgICAgICAgICBwaXhlbF9wdHJbeCArIDEgICAgICAgICAgICBdID0KKyAgICAgICAgICAgIHBpeGVsX3B0clt4ICsgICAgIHMtPnN0cmlkZV0gPQorICAgICAgICAgICAgcGl4ZWxfcHRyW3ggKyAxICsgcy0+c3RyaWRlXSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgfQorICAgICAgICBwaXhlbF9wdHIgKz0gcy0+c3RyaWRlICogMjsKKyAgICB9CisKKyAgICAvKiByZXBvcnQgc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weERfMTYoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCB4LCB5OworICAgIHVpbnQxNl90IFBbMl07CisgICAgdWludDE2X3QgKnBpeGVsX3B0ciA9ICh1aW50MTZfdCopcy0+cGl4ZWxfcHRyOworCisgICAgLyogNC1jb2xvciBibG9jayBlbmNvZGluZzogZWFjaCA0eDQgYmxvY2sgaXMgYSBkaWZmZXJlbnQgY29sb3IgKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgIGlmICghKHkgJiAzKSkgeworICAgICAgICAgICAgUFswXSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5zdHJlYW1fcHRyKTsKKyAgICAgICAgICAgIFBbMV0gPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+c3RyZWFtX3B0cik7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIHBpeGVsX3B0clt4XSA9IFBbeCA+PiAyXTsKKyAgICAgICAgcGl4ZWxfcHRyICs9IHMtPnN0cmlkZTsKKyAgICB9CisKKyAgICAvKiByZXBvcnQgc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weEVfMTYoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCB4LCB5OworICAgIHVpbnQxNl90IHBpeDsKKyAgICB1aW50MTZfdCAqcGl4ZWxfcHRyID0gKHVpbnQxNl90KilzLT5waXhlbF9wdHI7CisKKyAgICAvKiAxLWNvbG9yIGVuY29kaW5nOiB0aGUgd2hvbGUgYmxvY2sgaXMgMSBzb2xpZCBjb2xvciAqLworICAgIHBpeCA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5zdHJlYW1fcHRyKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIHBpeGVsX3B0clt4XSA9IHBpeDsKKyAgICAgICAgcGl4ZWxfcHRyICs9IHMtPnN0cmlkZTsKKyAgICB9CisKKyAgICAvKiByZXBvcnQgc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50ICgqIGNvbnN0IGlwdmlkZW9fZGVjb2RlX2Jsb2NrW10pKElwdmlkZW9Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkgPSB7CisgICAgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4MCwgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4MSwKKyAgICBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHgyLCBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHgzLAorICAgIGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weDQsIGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weDUsCisgICAgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4NiwgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4NywKKyAgICBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHg4LCBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHg5LAorICAgIGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weEEsIGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weEIsCisgICAgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4QywgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4RCwKKyAgICBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHhFLCBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHhGLAorfTsKKworc3RhdGljIGludCAoKiBjb25zdCBpcHZpZGVvX2RlY29kZV9ibG9jazE2W10pKElwdmlkZW9Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkgPSB7CisgICAgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4MCwgICAgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4MSwKKyAgICBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHgyLCAgICBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHgzLAorICAgIGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weDQsICAgIGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weDUsCisgICAgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4Nl8xNiwgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4N18xNiwKKyAgICBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHg4XzE2LCBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHg5XzE2LAorICAgIGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weEFfMTYsIGlwdmlkZW9fZGVjb2RlX2Jsb2NrX29wY29kZV8weEJfMTYsCisgICAgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4Q18xNiwgaXB2aWRlb19kZWNvZGVfYmxvY2tfb3Bjb2RlXzB4RF8xNiwKKyAgICBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHhFXzE2LCBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHgxLAorfTsKKworc3RhdGljIHZvaWQgaXB2aWRlb19kZWNvZGVfb3Bjb2RlcyhJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHgsIHk7CisgICAgdW5zaWduZWQgY2hhciBvcGNvZGU7CisgICAgaW50IHJldDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworCisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+c3RyZWFtX3B0ciwgMTQpOyAvKiBkYXRhIHN0YXJ0cyAxNCBieXRlcyBpbiAqLworICAgIGlmICghcy0+aXNfMTZicHApIHsKKyAgICAgICAgLyogdGhpcyBpcyBQQUw4LCBzbyBtYWtlIHRoZSBwYWxldHRlIGF2YWlsYWJsZSAqLworICAgICAgICBtZW1jcHkoZnJhbWUtPmRhdGFbMV0sIHMtPnBhbCwgQVZQQUxFVFRFX1NJWkUpOworCisgICAgICAgIHMtPnN0cmlkZSA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5zdHJpZGUgPSBmcmFtZS0+bGluZXNpemVbMF0gPj4gMTsKKyAgICAgICAgcy0+bXZfcHRyID0gcy0+c3RyZWFtX3B0cjsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+bXZfcHRyLCBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+c3RyZWFtX3B0cikpOworICAgIH0KKyAgICBzLT5saW5lX2luYyA9IHMtPnN0cmlkZSAtIDg7CisgICAgcy0+dXBwZXJfbW90aW9uX2xpbWl0X29mZnNldCA9IChzLT5hdmN0eC0+aGVpZ2h0IC0gOCkgKiBmcmFtZS0+bGluZXNpemVbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChzLT5hdmN0eC0+d2lkdGggLSA4KSAqICgxICsgcy0+aXNfMTZicHApOworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIHMtPmRlY29kaW5nX21hcCwgcy0+ZGVjb2RpbmdfbWFwX3NpemUgKiA4KTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgcy0+YXZjdHgtPmhlaWdodDsgeSArPSA4KSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5hdmN0eC0+d2lkdGg7IHggKz0gOCkgeworICAgICAgICAgICAgb3Bjb2RlID0gZ2V0X2JpdHMoJmdiLCA0KTsKKworICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgIiAgYmxvY2sgQCAoJTNkLCAlM2QpOiBlbmNvZGluZyAweCVYLCBkYXRhIHB0ciBvZmZzZXQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIHgsIHksIG9wY29kZSwgYnl0ZXN0cmVhbTJfdGVsbCgmcy0+c3RyZWFtX3B0cikpOworCisgICAgICAgICAgICBpZiAoIXMtPmlzXzE2YnBwKSB7CisgICAgICAgICAgICAgICAgcy0+cGl4ZWxfcHRyID0gZnJhbWUtPmRhdGFbMF0gKyB4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHkqZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgICAgIHJldCA9IGlwdmlkZW9fZGVjb2RlX2Jsb2NrW29wY29kZV0ocywgZnJhbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5waXhlbF9wdHIgPSBmcmFtZS0+ZGF0YVswXSArIHgqMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB5KmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICByZXQgPSBpcHZpZGVvX2RlY29kZV9ibG9jazE2W29wY29kZV0ocywgZnJhbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJkZWNvZGUgcHJvYmxlbSBvbiBmcmFtZSAlZCwgQCBibG9jayAoJWQsICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmZyYW1lX251bWJlciwgeCwgeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+c3RyZWFtX3B0cikgPiAxKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImRlY29kZSBmaW5pc2hlZCB3aXRoICVkIGJ5dGVzIGxlZnQgb3ZlclxuIiwKKyAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5zdHJlYW1fcHRyKSk7CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaXB2aWRlb19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSXB2aWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIHMtPmlzXzE2YnBwID0gYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNjsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IHMtPmlzXzE2YnBwID8gQVZfUElYX0ZNVF9SR0I1NTUgOiBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICBmZl9ocGVsZHNwX2luaXQoJnMtPmhkc3AsIGF2Y3R4LT5mbGFncyk7CisKKyAgICBzLT5sYXN0X2ZyYW1lICAgICAgICA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgcy0+c2Vjb25kX2xhc3RfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+bGFzdF9mcmFtZSB8fCAhcy0+c2Vjb25kX2xhc3RfZnJhbWUpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9mcmFtZSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnNlY29uZF9sYXN0X2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHZpZGVvX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgSXB2aWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgLyogZGVjb2RpbmcgbWFwIGNvbnRhaW5zIDQgYml0cyBvZiBpbmZvcm1hdGlvbiBwZXIgOHg4IGJsb2NrICovCisgICAgcy0+ZGVjb2RpbmdfbWFwX3NpemUgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0IC8gKDggKiA4ICogMik7CisKKyAgICAvKiBjb21wcmVzc2VkIGJ1ZmZlciBuZWVkcyB0byBiZSBsYXJnZSBlbm91Z2ggdG8gYXQgbGVhc3QgaG9sZCBhbiBlbnRpcmUKKyAgICAgKiBkZWNvZGluZyBtYXAgKi8KKyAgICBpZiAoYnVmX3NpemUgPCBzLT5kZWNvZGluZ19tYXBfc2l6ZSkKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworCisgICAgaWYgKGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LCBBVl9QS1RfREFUQV9QQVJBTV9DSEFOR0UsIE5VTEwpKSB7CisgICAgICAgIGF2X2ZyYW1lX3VucmVmKHMtPmxhc3RfZnJhbWUpOworICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5zZWNvbmRfbGFzdF9mcmFtZSk7CisgICAgfQorCisgICAgcy0+ZGVjb2RpbmdfbWFwID0gYnVmOworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPnN0cmVhbV9wdHIsIGJ1ZiArIHMtPmRlY29kaW5nX21hcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUgLSBzLT5kZWNvZGluZ19tYXBfc2l6ZSk7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCFzLT5pc18xNmJwcCkgeworICAgICAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgTlVMTCk7CisgICAgICAgIGlmIChwYWwpIHsKKyAgICAgICAgICAgIGZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKKyAgICAgICAgICAgIG1lbWNweShzLT5wYWwsIHBhbCwgQVZQQUxFVFRFX1NJWkUpOworICAgICAgICB9CisgICAgfQorCisgICAgaXB2aWRlb19kZWNvZGVfb3Bjb2RlcyhzLCBmcmFtZSk7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIC8qIHNodWZmbGUgZnJhbWVzICovCisgICAgYXZfZnJhbWVfdW5yZWYocy0+c2Vjb25kX2xhc3RfZnJhbWUpOworICAgIEZGU1dBUChBVkZyYW1lKiwgcy0+c2Vjb25kX2xhc3RfZnJhbWUsIHMtPmxhc3RfZnJhbWUpOworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKHMtPmxhc3RfZnJhbWUsIGZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogcmVwb3J0IHRoYXQgdGhlIGJ1ZmZlciB3YXMgY29tcGxldGVseSBjb25zdW1lZCAqLworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGlwdmlkZW9fZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSXB2aWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9mcmFtZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+c2Vjb25kX2xhc3RfZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfaW50ZXJwbGF5X3ZpZGVvX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImludGVycGxheXZpZGVvIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSW50ZXJwbGF5IE1WRSB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9JTlRFUlBMQVlfVklERU8sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKElwdmlkZW9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBpcHZpZGVvX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGlwdmlkZW9fZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBpcHZpZGVvX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX1BBUkFNX0NIQU5HRSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9pbnRyYXg4LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9pbnRyYXg4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NTM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ludHJheDguYwpAQCAtMCwwICsxLDc5MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgSW50cmFYOCAoSi1GcmFtZSkgc3ViZGVjb2RlciwgdXNlZCBieSBXTVYyIGFuZCBWQy0xCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAibXNtcGVnNGRhdGEuaCIKKyNpbmNsdWRlICJpbnRyYXg4aHVmLmgiCisjaW5jbHVkZSAiaW50cmF4OC5oIgorI2luY2x1ZGUgImludHJheDhkc3AuaCIKKworI2RlZmluZSBNQVhfVEFCTEVfREVQVEgodGFibGVfYml0cywgbWF4X2JpdHMpICgobWF4X2JpdHMrdGFibGVfYml0cy0xKS90YWJsZV9iaXRzKQorCisjZGVmaW5lIERDX1ZMQ19CSVRTIDkKKyNkZWZpbmUgQUNfVkxDX0JJVFMgOQorI2RlZmluZSBPUl9WTENfQklUUyA3CisKKyNkZWZpbmUgRENfVkxDX01URCBNQVhfVEFCTEVfREVQVEgoRENfVkxDX0JJVFMsIE1BWF9EQ19WTENfQklUUykKKyNkZWZpbmUgQUNfVkxDX01URCBNQVhfVEFCTEVfREVQVEgoQUNfVkxDX0JJVFMsIE1BWF9BQ19WTENfQklUUykKKyNkZWZpbmUgT1JfVkxDX01URCBNQVhfVEFCTEVfREVQVEgoT1JfVkxDX0JJVFMsIE1BWF9PUl9WTENfQklUUykKKworc3RhdGljIFZMQyBqX2FjX3ZsY1syXVsyXVs4XTsgIC8vW3F1YW50PDEzXSxbaW50cmEvaW50ZXJdLFtzZWxlY3RdCitzdGF0aWMgVkxDIGpfZGNfdmxjWzJdWzhdOyAgICAgLy9bcXVhbnRdLCBbc2VsZWN0XQorc3RhdGljIFZMQyBqX29yaWVudF92bGNbMl1bNF07IC8vW3F1YW50XSwgW3NlbGVjdF0KKworc3RhdGljIGF2X2NvbGQgdm9pZCB4OF92bGNfaW5pdCh2b2lkKXsKKyAgICBpbnQgaTsKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBpbnQgc2l6ZWlkeCA9IDA7CisgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpemVzWzgqNCArIDgqMiArIDIgKyA0XSA9IHsKKyAgICAgICAgNTc2LCA1NDgsIDU4MiwgNjE4LCA1NDYsIDYxNiwgNTYwLCA2NDIsCisgICAgICAgIDU4NCwgNTgyLCA3MDQsIDY2NCwgNTEyLCA1NDQsIDY1NiwgNjQwLAorICAgICAgICA1MTIsIDY0OCwgNTgyLCA1NjYsIDUzMiwgNjE0LCA1OTYsIDY0OCwKKyAgICAgICAgNTg2LCA1NTIsIDU4NCwgNTkwLCA1NDQsIDU3OCwgNTg0LCA2MjQsCisKKyAgICAgICAgNTI4LCA1MjgsIDUyNiwgNTI4LCA1MzYsIDUyOCwgNTI2LCA1NDQsCisgICAgICAgIDU0NCwgNTEyLCA1MTIsIDUyOCwgNTI4LCA1NDQsIDUxMiwgNTQ0LAorCisgICAgICAgIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9OworCisgICAgc3RhdGljIFZMQ19UWVBFIHRhYmxlWzI4MTUwXVsyXTsKKworI2RlZmluZSAgaW5pdF9hY192bGMoZHN0LHNyYykgXAorICAgIGRzdC50YWJsZSA9ICZ0YWJsZVtvZmZzZXRdOyBcCisgICAgZHN0LnRhYmxlX2FsbG9jYXRlZCA9IHNpemVzW3NpemVpZHhdOyBcCisgICAgb2Zmc2V0ICs9IHNpemVzW3NpemVpZHgrK107IFwKKyAgICAgICBpbml0X3ZsYygmZHN0LCBcCisgICAgICAgICAgICAgIEFDX1ZMQ19CSVRTLDc3LCBcCisgICAgICAgICAgICAgICZzcmNbMV0sNCwyLCBcCisgICAgICAgICAgICAgICZzcmNbMF0sNCwyLCBcCisgICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKQorLy9zZXQgYWMgdGFibGVzCisgICAgZm9yKGk9MDtpPDg7aSsrKXsKKyAgICAgICAgaW5pdF9hY192bGMoIGpfYWNfdmxjWzBdWzBdW2ldLCB4OF9hYzBfaGlnaHF1YW50X3RhYmxlW2ldWzBdICk7CisgICAgICAgIGluaXRfYWNfdmxjKCBqX2FjX3ZsY1swXVsxXVtpXSwgeDhfYWMxX2hpZ2hxdWFudF90YWJsZVtpXVswXSApOworICAgICAgICBpbml0X2FjX3ZsYyggal9hY192bGNbMV1bMF1baV0sIHg4X2FjMF9sb3dxdWFudF90YWJsZSBbaV1bMF0gKTsKKyAgICAgICAgaW5pdF9hY192bGMoIGpfYWNfdmxjWzFdWzFdW2ldLCB4OF9hYzFfbG93cXVhbnRfdGFibGUgW2ldWzBdICk7CisgICAgfQorI3VuZGVmIGluaXRfYWNfdmxjCisKKy8vc2V0IGRjIHRhYmxlcworI2RlZmluZSBpbml0X2RjX3ZsYyhkc3Qsc3JjKSBcCisgICAgZHN0LnRhYmxlID0gJnRhYmxlW29mZnNldF07IFwKKyAgICBkc3QudGFibGVfYWxsb2NhdGVkID0gc2l6ZXNbc2l6ZWlkeF07IFwKKyAgICBvZmZzZXQgKz0gc2l6ZXNbc2l6ZWlkeCsrXTsgXAorICAgICAgICBpbml0X3ZsYygmZHN0LCBcCisgICAgICAgIERDX1ZMQ19CSVRTLDM0LCBcCisgICAgICAgICZzcmNbMV0sNCwyLCBcCisgICAgICAgICZzcmNbMF0sNCwyLCBcCisgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICBmb3IoaT0wO2k8ODtpKyspeworICAgICAgICBpbml0X2RjX3ZsYyggal9kY192bGNbMF1baV0sIHg4X2RjX2hpZ2hxdWFudF90YWJsZVtpXVswXSk7CisgICAgICAgIGluaXRfZGNfdmxjKCBqX2RjX3ZsY1sxXVtpXSwgeDhfZGNfbG93cXVhbnRfdGFibGUgW2ldWzBdKTsKKyAgICB9CisjdW5kZWYgaW5pdF9kY192bGMKKworLy9zZXQgb3JpZW50IHRhYmxlcworI2RlZmluZSBpbml0X29yX3ZsYyhkc3Qsc3JjKSBcCisgICAgZHN0LnRhYmxlID0gJnRhYmxlW29mZnNldF07IFwKKyAgICBkc3QudGFibGVfYWxsb2NhdGVkID0gc2l6ZXNbc2l6ZWlkeF07IFwKKyAgICBvZmZzZXQgKz0gc2l6ZXNbc2l6ZWlkeCsrXTsgXAorICAgIGluaXRfdmxjKCZkc3QsIFwKKyAgICBPUl9WTENfQklUUywxMiwgXAorICAgICZzcmNbMV0sNCwyLCBcCisgICAgJnNyY1swXSw0LDIsIFwKKyAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgZm9yKGk9MDtpPDI7aSsrKXsKKyAgICAgICAgaW5pdF9vcl92bGMoIGpfb3JpZW50X3ZsY1swXVtpXSwgeDhfb3JpZW50X2hpZ2hxdWFudF90YWJsZVtpXVswXSk7CisgICAgfQorICAgIGZvcihpPTA7aTw0O2krKyl7CisgICAgICAgIGluaXRfb3JfdmxjKCBqX29yaWVudF92bGNbMV1baV0sIHg4X29yaWVudF9sb3dxdWFudF90YWJsZSBbaV1bMF0pCisgICAgfQorICAgIGlmIChvZmZzZXQgIT0gc2l6ZW9mKHRhYmxlKS9zaXplb2YoVkxDX1RZUEUpLzIpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJ0YWJsZSBzaXplICVpIGRvZXMgbm90IG1hdGNoIG5lZWRlZCAlaVxuIiwgKGludCkoc2l6ZW9mKHRhYmxlKS9zaXplb2YoVkxDX1RZUEUpLzIpLCBvZmZzZXQpOworfQorI3VuZGVmIGluaXRfb3JfdmxjCisKK3N0YXRpYyB2b2lkIHg4X3Jlc2V0X3ZsY190YWJsZXMoSW50cmFYOENvbnRleHQgKiB3KXsKKyAgICBtZW1zZXQody0+al9kY192bGMsMCxzaXplb2Yody0+al9kY192bGMpKTsKKyAgICBtZW1zZXQody0+al9hY192bGMsMCxzaXplb2Yody0+al9hY192bGMpKTsKKyAgICB3LT5qX29yaWVudF92bGM9TlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHg4X3NlbGVjdF9hY190YWJsZShJbnRyYVg4Q29udGV4dCAqIGNvbnN0IHcgLCBpbnQgbW9kZSl7CisgICAgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzPSB3LT5zOworICAgIGludCB0YWJsZV9pbmRleDsKKworICAgIGF2X2Fzc2VydDIobW9kZTw0KTsKKworICAgIGlmKCB3LT5qX2FjX3ZsY1ttb2RlXSApIHJldHVybjsKKworICAgIHRhYmxlX2luZGV4ID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICB3LT5qX2FjX3ZsY1ttb2RlXSA9ICZqX2FjX3ZsY1t3LT5xdWFudDwxM11bbW9kZT4+MV1bdGFibGVfaW5kZXhdOy8vMiBtb2RlcyB1c2Ugc2FtZSB0YWJsZXMKKyAgICBhdl9hc3NlcnQyKHctPmpfYWNfdmxjW21vZGVdKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgeDhfZ2V0X29yaWVudF92bGMoSW50cmFYOENvbnRleHQgKiB3KXsKKyAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHM9IHctPnM7CisgICAgaW50IHRhYmxlX2luZGV4OworCisgICAgaWYoIXctPmpfb3JpZW50X3ZsYyApeworICAgICAgICB0YWJsZV9pbmRleCA9IGdldF9iaXRzKCZzLT5nYiwgMSsody0+cXVhbnQ8MTMpICk7CisgICAgICAgIHctPmpfb3JpZW50X3ZsYyA9ICZqX29yaWVudF92bGNbdy0+cXVhbnQ8MTNdW3RhYmxlX2luZGV4XTsKKyAgICB9CisKKyAgICByZXR1cm4gZ2V0X3ZsYzIoJnMtPmdiLCB3LT5qX29yaWVudF92bGMtPnRhYmxlLCBPUl9WTENfQklUUywgT1JfVkxDX01URCk7Cit9CisKKyNkZWZpbmUgZXh0cmFfYml0cyhlYikgKGViKQorI2RlZmluZSBleHRyYV9ydW4gICAoMHhGRjw8OCkKKyNkZWZpbmUgZXh0cmFfbGV2ZWwgKDB4MDA8PDgpCisjZGVmaW5lICAgcnVuX29mZnNldChyKSAgICAoKHIpPDwxNikKKyNkZWZpbmUgbGV2ZWxfb2Zmc2V0KGwpICAgICgobCk8PDI0KQorc3RhdGljIGNvbnN0IHVpbnQzMl90IGFjX2RlY29kZV90YWJsZVtdPXsKKyAgICAvKjQ2Ki8gZXh0cmFfYml0cygzKSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCgxNikgfCBsZXZlbF9vZmZzZXQoIDApLAorICAgIC8qNDcqLyBleHRyYV9iaXRzKDMpIHwgIGV4dHJhX3J1biAgfCBydW5fb2Zmc2V0KDI0KSB8IGxldmVsX29mZnNldCggMCksCisgICAgLyo0OCovIGV4dHJhX2JpdHMoMikgfCAgZXh0cmFfcnVuICB8IHJ1bl9vZmZzZXQoIDQpIHwgbGV2ZWxfb2Zmc2V0KCAxKSwKKyAgICAvKjQ5Ki8gZXh0cmFfYml0cygzKSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCggOCkgfCBsZXZlbF9vZmZzZXQoIDEpLAorCisgICAgLyo1MCovIGV4dHJhX2JpdHMoNSkgfCAgZXh0cmFfcnVuICB8IHJ1bl9vZmZzZXQoMzIpIHwgbGV2ZWxfb2Zmc2V0KCAwKSwKKyAgICAvKjUxKi8gZXh0cmFfYml0cyg0KSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCgxNikgfCBsZXZlbF9vZmZzZXQoIDEpLAorCisgICAgLyo1MiovIGV4dHJhX2JpdHMoMikgfCBleHRyYV9sZXZlbCB8IHJ1bl9vZmZzZXQoIDApIHwgbGV2ZWxfb2Zmc2V0KCA0KSwKKyAgICAvKjUzKi8gZXh0cmFfYml0cygyKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCggMCkgfCBsZXZlbF9vZmZzZXQoIDgpLAorICAgIC8qNTQqLyBleHRyYV9iaXRzKDIpIHwgZXh0cmFfbGV2ZWwgfCBydW5fb2Zmc2V0KCAwKSB8IGxldmVsX29mZnNldCgxMiksCisgICAgLyo1NSovIGV4dHJhX2JpdHMoMykgfCBleHRyYV9sZXZlbCB8IHJ1bl9vZmZzZXQoIDApIHwgbGV2ZWxfb2Zmc2V0KDE2KSwKKyAgICAvKjU2Ki8gZXh0cmFfYml0cygzKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCggMCkgfCBsZXZlbF9vZmZzZXQoMjQpLAorCisgICAgLyo1NyovIGV4dHJhX2JpdHMoMikgfCBleHRyYV9sZXZlbCB8IHJ1bl9vZmZzZXQoIDEpIHwgbGV2ZWxfb2Zmc2V0KCAzKSwKKyAgICAvKjU4Ki8gZXh0cmFfYml0cygzKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCggMSkgfCBsZXZlbF9vZmZzZXQoIDcpLAorCisgICAgLyo1OSovIGV4dHJhX2JpdHMoMikgfCAgZXh0cmFfcnVuICB8IHJ1bl9vZmZzZXQoMTYpIHwgbGV2ZWxfb2Zmc2V0KCAwKSwKKyAgICAvKjYwKi8gZXh0cmFfYml0cygyKSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCgyMCkgfCBsZXZlbF9vZmZzZXQoIDApLAorICAgIC8qNjEqLyBleHRyYV9iaXRzKDIpIHwgIGV4dHJhX3J1biAgfCBydW5fb2Zmc2V0KDI0KSB8IGxldmVsX29mZnNldCggMCksCisgICAgLyo2MiovIGV4dHJhX2JpdHMoMikgfCAgZXh0cmFfcnVuICB8IHJ1bl9vZmZzZXQoMjgpIHwgbGV2ZWxfb2Zmc2V0KCAwKSwKKyAgICAvKjYzKi8gZXh0cmFfYml0cyg0KSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCgzMikgfCBsZXZlbF9vZmZzZXQoIDApLAorICAgIC8qNjQqLyBleHRyYV9iaXRzKDQpIHwgIGV4dHJhX3J1biAgfCBydW5fb2Zmc2V0KDQ4KSB8IGxldmVsX29mZnNldCggMCksCisKKyAgICAvKjY1Ki8gZXh0cmFfYml0cygyKSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCggNCkgfCBsZXZlbF9vZmZzZXQoIDEpLAorICAgIC8qNjYqLyBleHRyYV9iaXRzKDMpIHwgIGV4dHJhX3J1biAgfCBydW5fb2Zmc2V0KCA4KSB8IGxldmVsX29mZnNldCggMSksCisgICAgLyo2NyovIGV4dHJhX2JpdHMoNCkgfCAgZXh0cmFfcnVuICB8IHJ1bl9vZmZzZXQoMTYpIHwgbGV2ZWxfb2Zmc2V0KCAxKSwKKworICAgIC8qNjgqLyBleHRyYV9iaXRzKDIpIHwgZXh0cmFfbGV2ZWwgfCBydW5fb2Zmc2V0KCAwKSB8IGxldmVsX29mZnNldCggNCksCisgICAgLyo2OSovIGV4dHJhX2JpdHMoMykgfCBleHRyYV9sZXZlbCB8IHJ1bl9vZmZzZXQoIDApIHwgbGV2ZWxfb2Zmc2V0KCA4KSwKKyAgICAvKjcwKi8gZXh0cmFfYml0cyg0KSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCggMCkgfCBsZXZlbF9vZmZzZXQoMTYpLAorCisgICAgLyo3MSovIGV4dHJhX2JpdHMoMikgfCBleHRyYV9sZXZlbCB8IHJ1bl9vZmZzZXQoIDEpIHwgbGV2ZWxfb2Zmc2V0KCAzKSwKKyAgICAvKjcyKi8gZXh0cmFfYml0cygzKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCggMSkgfCBsZXZlbF9vZmZzZXQoIDcpLAorfTsKKy8vZXh0cmFfYml0cyA9IDNiaXRzOyBleHRyYV9ydW4vbGV2ZWwgPSAxIGJpdDsgcnVuX29mZnNldCA9IDZiaXRzOyBsZXZlbF9vZmZzZXQgPSA1IGJpdHM7CisjdW5kZWYgZXh0cmFfYml0cworI3VuZGVmIGV4dHJhX3J1bgorI3VuZGVmIGV4dHJhX2xldmVsCisjdW5kZWYgcnVuX29mZnNldAorI3VuZGVmIGxldmVsX29mZnNldAorCitzdGF0aWMgdm9pZCB4OF9nZXRfYWNfcmxmKEludHJhWDhDb250ZXh0ICogY29uc3QgdywgY29uc3QgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgKiBjb25zdCBydW4sIGludCAqIGNvbnN0IGxldmVsLCBpbnQgKiBjb25zdCBmaW5hbCl7CisgICAgTXBlZ0VuY0NvbnRleHQgKiAgY29uc3Qgcz0gdy0+czsKKyAgICBpbnQgaSxlOworCisvLyAgICB4OF9zZWxlY3RfYWNfdGFibGUodyxtb2RlKTsKKyAgICBpID0gZ2V0X3ZsYzIoJnMtPmdiLCB3LT5qX2FjX3ZsY1ttb2RlXS0+dGFibGUsIEFDX1ZMQ19CSVRTLCBBQ19WTENfTVREKTsKKworICAgIGlmKGk8NDYpeyAvL1swLTQ1XQorICAgICAgICBpbnQgdCxsOworICAgICAgICBpZihpPDApeworICAgICAgICAgICAgKCpsZXZlbCk9KCpmaW5hbCk9Ly9wcmV2ZW50ICdtYXkgYmUgdXNlZCB1bmlsaXRpYWxpemVkJworICAgICAgICAgICAgKCpydW4pPTY0Oy8vdGhpcyB3b3VsZCBjYXVzZSBlcnJvciBleGl0IGluIHRoZSBhYyBsb29wCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAoKmZpbmFsKSA9IHQgPSAoaT4yMik7CisgICAgICAgIGktPTIzKnQ7CisvKgorICBpPT0gMC0xNSByPTAtMTUgbD0wIDtyPWkmICUwMTExMQorICBpPT0xNi0xOSByPTAtMyAgbD0xIDtyPWkmICUwMDAxMQorICBpPT0yMC0yMSByPTAtMSAgbD0yIDtyPWkmICUwMDAwMQorICBpPT0yMiAgICByPTAgICAgbD0zIDtyPWkmICUwMDAwMAorbD1sdXRfbFtpLzJdPXswLDAsMCwwLDAsMCwwLDAsMSwxLDIsM31baT4+MV07Ly8gMTEgMTAnMDEgMDEnMDAgMDAnMDAgMDAnMDAgMDAnMDAgMDAgPT4gMHhFNTAwMDAKK3Q9bHV0X21hc2tbbF09ezB4MGYsMHgwMywweDAxLDB4MDB9W2xdOyBhcyBpPDI1NiB0aGUgaGlnaGVyIGJpdHMgZG8gbm90IG1hdHRlciAqLworICAgICAgICBsPSgweEU1MDAwMD4+KGkmKDB4MUUpKSkmMzsvKjB4MUUgb3IgKH4xKSBvciAoKGk+PjEpPDwxKSovCisgICAgICAgIHQ9KDB4MDEwMzBGPj4obDw8MykpOworCisgICAgICAgICgqcnVuKSAgID0gaSZ0OworICAgICAgICAoKmxldmVsKSA9IGw7CisgICAgfWVsc2UgaWYoaTw3Myl7Ly9bNDYtNzJdCisgICAgICAgIHVpbnQzMl90IHNtOworICAgICAgICB1aW50MzJfdCBtYXNrOworCisgICAgICAgIGktPTQ2OworICAgICAgICBzbT1hY19kZWNvZGVfdGFibGVbaV07CisKKyAgICAgICAgZT1nZXRfYml0cygmcy0+Z2Isc20mMHhGKTtzbT4+PTg7Ly8zYml0cworICAgICAgICBtYXNrPXNtJjB4ZmY7c20+Pj04OyAgICAgICAgICAgICAvLzFiaXQKKworICAgICAgICAoKnJ1bikgID0oc20mMHhmZikgKyAoZSYoIG1hc2spKTsvLzZiaXRzCisgICAgICAgICgqbGV2ZWwpPShzbT4+OCkgICArIChlJih+bWFzaykpOy8vNWJpdHMKKyAgICAgICAgKCpmaW5hbCk9aT4oNTgtNDYpOworICAgIH1lbHNlIGlmKGk8NzUpey8vWzczLTc0XQorICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBjcmF6eV9taXhfcnVubGV2ZWxbMzJdPXsKKyAgICAgICAgMHgyMiwweDMyLDB4MzMsMHg1MywweDIzLDB4NDIsMHg0MywweDYzLAorICAgICAgICAweDI0LDB4NTIsMHgzNCwweDczLDB4MjUsMHg2MiwweDQ0LDB4ODMsCisgICAgICAgIDB4MjYsMHg3MiwweDM1LDB4NTQsMHgyNywweDgyLDB4NDUsMHg2NCwKKyAgICAgICAgMHgyOCwweDkyLDB4MzYsMHg3NCwweDI5LDB4YTIsMHg0NiwweDg0fTsKKworICAgICAgICAoKmZpbmFsKT0hKGkmMSk7CisgICAgICAgIGU9Z2V0X2JpdHMoJnMtPmdiLDUpOy8vZ2V0IHRoZSBleHRyYSBiaXRzCisgICAgICAgICgqcnVuKSAgPWNyYXp5X21peF9ydW5sZXZlbFtlXT4+NDsKKyAgICAgICAgKCpsZXZlbCk9Y3JhenlfbWl4X3J1bmxldmVsW2VdJjB4MEY7CisgICAgfWVsc2V7CisgICAgICAgICgqbGV2ZWwpPWdldF9iaXRzKCAmcy0+Z2IsIDctMyooaSYxKSk7CisgICAgICAgICgqcnVuKSAgPWdldF9iaXRzKCAmcy0+Z2IsIDYpOworICAgICAgICAoKmZpbmFsKT1nZXRfYml0czEoJnMtPmdiKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisvL3N0YXRpYyBjb25zdCB1aW50OF90IGRjX2V4dHJhX3NiaXRzW10gICA9ezAsIDEsMSwgMSwxLCAyLDIsIDMsMywgICA0LDQsICAgNSw1LCAgIDYsNiwgICAgNyw3ICAgIH07CitzdGF0aWMgY29uc3QgdWludDhfdCBkY19pbmRleF9vZmZzZXRbXSAgPXsgMCwgMSwyLCAzLDQsIDUsNywgOSwxMywgMTcsMjUsIDMzLDQ5LCA2NSw5NywgMTI5LDE5M307CisKK3N0YXRpYyBpbnQgeDhfZ2V0X2RjX3JsZihJbnRyYVg4Q29udGV4dCAqIGNvbnN0IHcsaW50IGNvbnN0IG1vZGUsIGludCAqIGNvbnN0IGxldmVsLCBpbnQgKiBjb25zdCBmaW5hbCl7CisgICAgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzPSB3LT5zOworICAgIGludCBpLGUsYzsKKworICAgIGF2X2Fzc2VydDIobW9kZTwzKTsKKyAgICBpZiggIXctPmpfZGNfdmxjW21vZGVdICkgeworICAgICAgICBpbnQgdGFibGVfaW5kZXg7CisgICAgICAgIHRhYmxlX2luZGV4ID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICAgICAgLy80IG1vZGVzLCBzYW1lIHRhYmxlCisgICAgICAgIHctPmpfZGNfdmxjW21vZGVdPSAmal9kY192bGNbdy0+cXVhbnQ8MTNdW3RhYmxlX2luZGV4XTsKKyAgICB9CisKKyAgICBpPWdldF92bGMyKCZzLT5nYiwgdy0+al9kY192bGNbbW9kZV0tPnRhYmxlLCBEQ19WTENfQklUUywgRENfVkxDX01URCk7CisKKyAgICAvKihpPj0xNykge2ktPTE3O2ZpbmFsPTE7fSovCisgICAgYz0gaT4xNjsKKyAgICAoKmZpbmFsKT1jOworICAgIGktPTE3KmM7CisKKyAgICBpZihpPD0wKXsKKyAgICAgICAgKCpsZXZlbCk9MDsKKyAgICAgICAgcmV0dXJuIC1pOworICAgIH0KKyAgICBjPShpKzEpPj4xOy8vaGFja2lzaCB3YXkgdG8gY2FsY3VsYXRlIGRjX2V4dHJhX3NiaXRzW10KKyAgICBjLT1jPjE7CisKKyAgICBlPWdldF9iaXRzKCZzLT5nYixjKTsvL2dldCB0aGUgZXh0cmEgYml0cworICAgIGk9ZGNfaW5kZXhfb2Zmc2V0W2ldKyhlPj4xKTsKKworICAgIGU9IC0oZSAmIDEpOy8vMCwweGZmZmZmZgorICAgICgqbGV2ZWwpPSAoaSBeIGUpIC0gZTsvLyAoaV4wKS0wICwgKGleMHhmZiktKC0xKQorICAgIHJldHVybiAwOworfQorLy9lbmQgb2YgaHVmZm1hbgorCitzdGF0aWMgaW50IHg4X3NldHVwX3NwYXRpYWxfcHJlZGljdG9yKEludHJhWDhDb250ZXh0ICogY29uc3QgdywgY29uc3QgaW50IGNocm9tYSl7CisgICAgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzPSB3LT5zOworICAgIGludCByYW5nZTsKKyAgICBpbnQgc3VtOworICAgIGludCBxdWFudDsKKworICAgIHctPmRzcC5zZXR1cF9zcGF0aWFsX2NvbXBlbnNhdGlvbihzLT5kZXN0W2Nocm9tYV0sIHMtPmVkZ2VfZW11X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplW2Nocm9tYT4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlLCAmc3VtLCB3LT5lZGdlcyk7CisgICAgaWYoY2hyb21hKXsKKyAgICAgICAgdy0+b3JpZW50PXctPmNocm9tYV9vcmllbnQ7CisgICAgICAgIHF1YW50PXctPnF1YW50X2RjX2Nocm9tYTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcXVhbnQ9dy0+cXVhbnQ7CisgICAgfQorCisgICAgdy0+ZmxhdF9kYz0wOworICAgIGlmKHJhbmdlIDwgcXVhbnQgfHwgcmFuZ2UgPCAzKXsKKyAgICAgICAgdy0+b3JpZW50PTA7CisgICAgICAgIGlmKHJhbmdlIDwgMyl7Ly95ZXAgeW91IHJlYWQgcmlnaHQsIGEgKy0xIGlkY3QgZXJyb3IgbWF5IGJyZWFrIGRlY29kaW5nIQorICAgICAgICAgICAgdy0+ZmxhdF9kYz0xOworICAgICAgICAgICAgc3VtKz05OworICAgICAgICAgICAgdy0+cHJlZGljdGVkX2RjID0gKHN1bSo2ODk5KT4+MTc7Ly8oKDE8PDE3KSs5KS8oOCs4KzErMik9Njg5OQorICAgICAgICB9CisgICAgfQorICAgIGlmKGNocm9tYSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBhdl9hc3NlcnQyKHctPm9yaWVudCA8IDMpOworICAgIGlmKHJhbmdlIDwgMip3LT5xdWFudCl7CisgICAgICAgIGlmKCAody0+ZWRnZXMmMykgPT0gMCl7CisgICAgICAgICAgICBpZih3LT5vcmllbnQ9PTEpIHctPm9yaWVudD0xMTsKKyAgICAgICAgICAgIGlmKHctPm9yaWVudD09Mikgdy0+b3JpZW50PTEwOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHctPm9yaWVudD0wOworICAgICAgICB9CisgICAgICAgIHctPnJhd19vcmllbnQ9MDsKKyAgICB9ZWxzZXsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcHJlZGljdGlvbl90YWJsZVszXVsxMl09eworICAgICAgICAgICAgezAsOCw0LCAxMCwxMSwgMiw2LDksMSwzLDUsN30sCisgICAgICAgICAgICB7NCwwLDgsIDExLDEwLCAzLDUsMiw2LDksMSw3fSwKKyAgICAgICAgICAgIHs4LDAsNCwgMTAsMTEsIDEsNywyLDYsOSwzLDV9CisgICAgICAgIH07CisgICAgICAgIHctPnJhd19vcmllbnQ9eDhfZ2V0X29yaWVudF92bGModyk7CisgICAgICAgIGlmKHctPnJhd19vcmllbnQ8MCkgcmV0dXJuIC0xOworICAgICAgICBhdl9hc3NlcnQyKHctPnJhd19vcmllbnQgPCAxMiApOworICAgICAgICBhdl9hc3NlcnQyKHctPm9yaWVudDwzKTsKKyAgICAgICAgdy0+b3JpZW50PXByZWRpY3Rpb25fdGFibGVbdy0+b3JpZW50XVt3LT5yYXdfb3JpZW50XTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHg4X3VwZGF0ZV9wcmVkaWN0aW9ucyhJbnRyYVg4Q29udGV4dCAqIGNvbnN0IHcsIGNvbnN0IGludCBvcmllbnQsIGNvbnN0IGludCBlc3RfcnVuICl7CisgICAgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzPSB3LT5zOworCisgICAgdy0+cHJlZGljdGlvbl90YWJsZVtzLT5tYl94KjIrKHMtPm1iX3kmMSldID0gKGVzdF9ydW48PDIpICsgMSoob3JpZW50PT00KSArIDIqKG9yaWVudD09OCk7CisvKgorICB5PTJuKzAgLT4vLzAgMiA0CisgIHk9Mm4rMSAtPi8vMSAzIDUKKyovCit9CitzdGF0aWMgdm9pZCB4OF9nZXRfcHJlZGljdGlvbl9jaHJvbWEoSW50cmFYOENvbnRleHQgKiBjb25zdCB3KXsKKyAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHM9IHctPnM7CisKKyAgICB3LT5lZGdlcyA9IDEqKCAhKHMtPm1iX3g+PjEpICk7CisgICAgdy0+ZWRnZXN8PSAyKiggIShzLT5tYl95Pj4xKSApOworICAgIHctPmVkZ2VzfD0gNCooIHMtPm1iX3ggPj0gKDIqcy0+bWJfd2lkdGgtMSkgKTsvL21iX3ggZm9yIGNocm9tYSB3b3VsZCBhbHdheXMgYmUgb2RkCisKKyAgICB3LT5yYXdfb3JpZW50PTA7CisgICAgaWYody0+ZWRnZXMmMyl7Ly9sdXRfY29bOF09e2ludiw0LDgsOCwgaW52LDQsOCw4fTwtID0+ezEsMSwwLDA7MSwxLDAsMH0gPT4gMHhDQworICAgICAgICB3LT5jaHJvbWFfb3JpZW50PTQ8PCgoMHhDQz4+dy0+ZWRnZXMpJjEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHctPmNocm9tYV9vcmllbnQgPSAody0+cHJlZGljdGlvbl90YWJsZVsyKnMtPm1iX3gtMl0gJiAweDAzKTw8MjsvL2Jsb2NrW3gtMV1beXwxLTEpXQorfQorCitzdGF0aWMgdm9pZCB4OF9nZXRfcHJlZGljdGlvbihJbnRyYVg4Q29udGV4dCAqIGNvbnN0IHcpeworICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3Qgcz0gdy0+czsKKyAgICBpbnQgYSxiLGMsaTsKKworICAgIHctPmVkZ2VzID0gMSooICFzLT5tYl94ICk7CisgICAgdy0+ZWRnZXN8PSAyKiggIXMtPm1iX3kgKTsKKyAgICB3LT5lZGdlc3w9IDQqKCBzLT5tYl94ID49ICgyKnMtPm1iX3dpZHRoLTEpICk7CisKKyAgICBzd2l0Y2gody0+ZWRnZXMmMyl7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAvL3Rha2UgdGhlIG9uZSBmcm9tIHRoZSBhYm92ZSBibG9ja1swXVt5LTFdCisgICAgICAgICAgICB3LT5lc3RfcnVuID0gdy0+cHJlZGljdGlvbl90YWJsZVshKHMtPm1iX3kmMSldPj4yOworICAgICAgICAgICAgdy0+b3JpZW50ICA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIC8vdGFrZSB0aGUgb25lIGZyb20gdGhlIHByZXZpb3VzIGJsb2NrW3gtMV1bMF0KKyAgICAgICAgICAgIHctPmVzdF9ydW4gPSB3LT5wcmVkaWN0aW9uX3RhYmxlWzIqcy0+bWJfeC0yXT4+MjsKKyAgICAgICAgICAgIHctPm9yaWVudCAgPSAyOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB3LT5lc3RfcnVuID0gMTY7CisgICAgICAgICAgICB3LT5vcmllbnQgID0gMDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy9ubyBlZGdlIGNhc2VzCisgICAgYj0gdy0+cHJlZGljdGlvbl90YWJsZVsyKnMtPm1iX3ggICArICEocy0+bWJfeSYxKSBdOy8vYmxvY2tbeCAgXVt5LTFdCisgICAgYT0gdy0+cHJlZGljdGlvbl90YWJsZVsyKnMtPm1iX3gtMiArICAocy0+bWJfeSYxKSBdOy8vYmxvY2tbeC0xXVt5ICBdCisgICAgYz0gdy0+cHJlZGljdGlvbl90YWJsZVsyKnMtPm1iX3gtMiArICEocy0+bWJfeSYxKSBdOy8vYmxvY2tbeC0xXVt5LTFdCisKKyAgICB3LT5lc3RfcnVuID0gRkZNSU4oYixhKTsKKyAgICAvKiBUaGlzIGNvbmRpdGlvbiBoYXMgbm90aGluZyB0byBkbyB3aXRoIHctPmVkZ2VzLCBldmVuIGlmIGl0IGxvb2tzCisgICAgICAgc2ltaWxhciBpdCB3b3VsZCB0cmlnZ2VyIGlmIGUuZy4geD0zO3k9MjsKKyAgICAgICBJIGd1ZXNzIHNvbWVib2R5IHdyb3RlIHNvbWV0aGluZyB3cm9uZyBhbmQgaXQgYmVjYW1lIHN0YW5kYXJkLiAqLworICAgIGlmKCAocy0+bWJfeCAmIHMtPm1iX3kpICE9IDAgKSB3LT5lc3RfcnVuPUZGTUlOKGMsdy0+ZXN0X3J1bik7CisgICAgdy0+ZXN0X3J1bj4+PTI7CisKKyAgICBhJj0zOworICAgIGImPTM7CisgICAgYyY9MzsKKworICAgIGk9KCAweEZGRUFGNEM0Pj4oMipiKzgqYSkgKSYzOworICAgIGlmKGkhPTMpIHctPm9yaWVudD1pOworICAgIGVsc2UgICAgIHctPm9yaWVudD0oIDB4RkZFQUQ4Pj4oMipjKzgqKHctPnF1YW50PjEyKSkgKSYzOworLyoKK2x1dDFbYl1bYV09eworLT57MCwgMSwgMCwgcGFkfSwKKyAgezAsIDEsIFgsIHBhZH0sCisgIHsyLCAyLCAyLCBwYWR9fQorICAgcGFkIDIgICAyICAyOyBwYWQgWCAgMSAgMDsgcGFkIDAgIDEgIDAgPC0KKy0+IDExIDEwICcxMCAxMCAnMTEgMTEnMDEgMDAgJzExIDAwJzAxIDAwPT4weEVBRjRDNAorCitsdXQyW3E+MTJdW2NdPXsKKyAgLT57MCwyLDEscGFkfSwKKyAgICB7MiwyLDIscGFkfX0KKyAgIHBhZCAyICAyICAyOyBwYWQgMSAgMiAgMCA8LQorLT4gMTEgMTAnMTAgMTAgJzExIDAxJzEwIDAwPT4weEVBRDgKKyovCit9CisKKworc3RhdGljIHZvaWQgeDhfYWNfY29tcGVuc2F0aW9uKEludHJhWDhDb250ZXh0ICogY29uc3QgdywgaW50IGNvbnN0IGRpcmVjdGlvbiwgaW50IGNvbnN0IGRjX2xldmVsKXsKKyAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHM9IHctPnM7CisgICAgaW50IHQ7CisjZGVmaW5lIEIoeCx5KSAgcy0+YmxvY2tbMF1bdy0+aWRjdF9wZXJtdXRhdGlvblsoeCkrKHkpKjhdXQorI2RlZmluZSBUKHgpICAoKHgpICogZGNfbGV2ZWwgKyAweDgwMDApID4+IDE2OworICAgIHN3aXRjaChkaXJlY3Rpb24peworICAgIGNhc2UgMDoKKyAgICAgICAgdCA9IFQoMzgxMSk7Ly9oCisgICAgICAgIEIoMSwwKSAtPSB0OworICAgICAgICBCKDAsMSkgLT0gdDsKKworICAgICAgICB0ID0gVCg0ODcpOy8vZQorICAgICAgICBCKDIsMCkgLT0gdDsKKyAgICAgICAgQigwLDIpIC09IHQ7CisKKyAgICAgICAgdCA9IFQoNTA2KTsvL2YKKyAgICAgICAgQigzLDApIC09IHQ7CisgICAgICAgIEIoMCwzKSAtPSB0OworCisgICAgICAgIHQgPSBUKDEzNSk7Ly9jCisgICAgICAgIEIoNCwwKSAtPSB0OworICAgICAgICBCKDAsNCkgLT0gdDsKKyAgICAgICAgQigyLDEpICs9IHQ7CisgICAgICAgIEIoMSwyKSArPSB0OworICAgICAgICBCKDMsMSkgKz0gdDsKKyAgICAgICAgQigxLDMpICs9IHQ7CisKKyAgICAgICAgdCA9IFQoMTczKTsvL2QKKyAgICAgICAgQig1LDApIC09IHQ7CisgICAgICAgIEIoMCw1KSAtPSB0OworCisgICAgICAgIHQgPSBUKDYxKTsvL2IKKyAgICAgICAgQig2LDApIC09IHQ7CisgICAgICAgIEIoMCw2KSAtPSB0OworICAgICAgICBCKDUsMSkgKz0gdDsKKyAgICAgICAgQigxLDUpICs9IHQ7CisKKyAgICAgICAgdCA9IFQoNDIpOyAvL2EKKyAgICAgICAgQig3LDApIC09IHQ7CisgICAgICAgIEIoMCw3KSAtPSB0OworICAgICAgICBCKDQsMSkgKz0gdDsKKyAgICAgICAgQigxLDQpICs9IHQ7CisgICAgICAgIEIoNCw0KSArPSB0OworCisgICAgICAgIHQgPSBUKDEwODQpOy8vZworICAgICAgICBCKDEsMSkgKz0gdDsKKworICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4WzBdID0gRkZNQVgocy0+YmxvY2tfbGFzdF9pbmRleFswXSwgNyo4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBCKDAsMSkgLT0gVCg2MjY5KTsKKyAgICAgICAgQigwLDMpIC09IFQoIDcwOCk7CisgICAgICAgIEIoMCw1KSAtPSBUKCAxNzIpOworICAgICAgICBCKDAsNykgLT0gVCggIDczKTsKKworICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4WzBdID0gRkZNQVgocy0+YmxvY2tfbGFzdF9pbmRleFswXSwgNyo4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBCKDEsMCkgLT0gVCg2MjY5KTsKKyAgICAgICAgQigzLDApIC09IFQoIDcwOCk7CisgICAgICAgIEIoNSwwKSAtPSBUKCAxNzIpOworICAgICAgICBCKDcsMCkgLT0gVCggIDczKTsKKworICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4WzBdID0gRkZNQVgocy0+YmxvY2tfbGFzdF9pbmRleFswXSwgNyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyN1bmRlZiBCCisjdW5kZWYgVAorfQorCitzdGF0aWMgdm9pZCBkc3BfeDhfcHV0X3NvbGlkY29sb3IodWludDhfdCBjb25zdCBwaXgsIHVpbnQ4X3QgKiBkc3QsIGludCBjb25zdCBsaW5lc2l6ZSl7CisgICAgaW50IGs7CisgICAgZm9yKGs9MDtrPDg7aysrKXsKKyAgICAgICAgbWVtc2V0KGRzdCxwaXgsOCk7CisgICAgICAgIGRzdCs9bGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgaW50MTZfdCBxdWFudF90YWJsZVs2NF0gPSB7CisgICAgMjU2LCAyNTYsIDI1NiwgMjU2LCAgMjU2LCAyNTYsIDI1OSwgMjYyLAorICAgIDI2NSwgMjY5LCAyNzIsIDI3NSwgIDI3OCwgMjgyLCAyODUsIDI4OCwKKyAgICAyOTIsIDI5NSwgMjk5LCAzMDMsICAzMDYsIDMxMCwgMzE0LCAzMTcsCisgICAgMzIxLCAzMjUsIDMyOSwgMzMzLCAgMzM3LCAzNDEsIDM0NSwgMzQ5LAorICAgIDM1MywgMzU4LCAzNjIsIDM2NiwgIDM3MSwgMzc1LCAzNzksIDM4NCwKKyAgICAzODksIDM5MywgMzk4LCA0MDMsICA0MDgsIDQxMywgNDE3LCA0MjIsCisgICAgNDI4LCA0MzMsIDQzOCwgNDQzLCAgNDQ4LCA0NTQsIDQ1OSwgNDY1LAorICAgIDQ3MCwgNDc2LCA0ODIsIDQ4OCwgIDQ5MywgNDk5LCA1MDUsIDUxMQorfTsKKworc3RhdGljIGludCB4OF9kZWNvZGVfaW50cmFfbWIoSW50cmFYOENvbnRleHQqIGNvbnN0IHcsIGNvbnN0IGludCBjaHJvbWEpeworICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3Qgcz0gdy0+czsKKworICAgIHVpbnQ4X3QgKiBzY2FudGFibGU7CisgICAgaW50IGZpbmFsLHJ1bixsZXZlbDsKKyAgICBpbnQgYWNfbW9kZSxkY19tb2RlLGVzdF9ydW4sZGNfbGV2ZWw7CisgICAgaW50IHBvcyxuOworICAgIGludCB6ZXJvc19vbmx5OworICAgIGludCB1c2VfcXVhbnRfbWF0cml4OworICAgIGludCBzaWduOworCisgICAgYXZfYXNzZXJ0Mih3LT5vcmllbnQ8MTIpOworICAgIHMtPmJkc3AuY2xlYXJfYmxvY2socy0+YmxvY2tbMF0pOworCisgICAgaWYoY2hyb21hKXsKKyAgICAgICAgZGNfbW9kZT0yOworICAgIH1lbHNleworICAgICAgICBkY19tb2RlPSEhdy0+ZXN0X3J1bjsvLzAsMQorICAgIH0KKworICAgIGlmKHg4X2dldF9kY19ybGYodywgZGNfbW9kZSwgJmRjX2xldmVsLCAmZmluYWwpKSByZXR1cm4gLTE7CisgICAgbj0wOworICAgIHplcm9zX29ubHk9MDsKKyAgICBpZighZmluYWwpey8vZGVjb2RlIGFjCisgICAgICAgIHVzZV9xdWFudF9tYXRyaXg9dy0+dXNlX3F1YW50X21hdHJpeDsKKyAgICAgICAgaWYoY2hyb21hKXsKKyAgICAgICAgICAgIGFjX21vZGUgPSAxOworICAgICAgICAgICAgZXN0X3J1biA9IDY0Oy8vbm90IHVzZWQKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpZiAody0+cmF3X29yaWVudCA8IDMpeworICAgICAgICAgICAgICAgIHVzZV9xdWFudF9tYXRyaXggPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYody0+cmF3X29yaWVudCA+IDQpeworICAgICAgICAgICAgICAgIGFjX21vZGUgPSAwOworICAgICAgICAgICAgICAgIGVzdF9ydW4gPSA2NDsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKHctPmVzdF9ydW4gPiAxKXsKKyAgICAgICAgICAgICAgICAgICAgYWNfbW9kZSA9IDI7CisgICAgICAgICAgICAgICAgICAgIGVzdF9ydW49dy0+ZXN0X3J1bjsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgYWNfbW9kZSA9IDM7CisgICAgICAgICAgICAgICAgICAgIGVzdF9ydW4gPSA2NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeDhfc2VsZWN0X2FjX3RhYmxlKHcsYWNfbW9kZSk7CisgICAgICAgIC8qc2NhbnRhYmxlX3NlbGVjdG9yWzEyXT17MCwyLDAsMSwxLDEsMCwyLDIsMCwxLDJ9OzwtCisgICAgICAgIC0+IDEwJzAxJyAwMCcxMCcgMTAnMDAnIDAxJzAxJyAwMScwMCcgMTAnMDAgPT4weDkyODU0OCAqLworICAgICAgICBzY2FudGFibGUgPSB3LT5zY2FudGFibGVbICgweDkyODU0OD4+KDIqdy0+b3JpZW50KSkmMyBdLnBlcm11dGF0ZWQ7CisgICAgICAgIHBvcz0wOworICAgICAgICBkbyB7CisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICBpZiggbiA+PSBlc3RfcnVuICl7CisgICAgICAgICAgICAgICAgYWNfbW9kZT0zOworICAgICAgICAgICAgICAgIHg4X3NlbGVjdF9hY190YWJsZSh3LDMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB4OF9nZXRfYWNfcmxmKHcsYWNfbW9kZSwmcnVuLCZsZXZlbCwmZmluYWwpOworCisgICAgICAgICAgICBwb3MrPXJ1bisxOworICAgICAgICAgICAgaWYocG9zPjYzKXsKKyAgICAgICAgICAgICAgICAvL3RoaXMgYWxzbyBoYW5kbGVzIHZsYyBlcnJvciBpbiB4OF9nZXRfYWNfcmxmCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV2ZWw9IChsZXZlbCsxKSAqIHctPmRxdWFudDsKKyAgICAgICAgICAgIGxldmVsKz0gdy0+cXN1bTsKKworICAgICAgICAgICAgc2lnbiA9IC0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCBeIHNpZ24pIC0gc2lnbjsKKworICAgICAgICAgICAgaWYodXNlX3F1YW50X21hdHJpeCl7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwqcXVhbnRfdGFibGVbcG9zXSk+Pjg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5ibG9ja1swXVsgc2NhbnRhYmxlW3Bvc10gXT1sZXZlbDsKKyAgICAgICAgfXdoaWxlKCFmaW5hbCk7CisKKyAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFswXT1wb3M7CisgICAgfWVsc2V7Ly9EQyBvbmx5CisgICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbMF09MDsKKyAgICAgICAgaWYody0+ZmxhdF9kYyAmJiAoKHVuc2lnbmVkKShkY19sZXZlbCsxKSkgPCAzKXsvL1stMTsxXQorICAgICAgICAgICAgaW50MzJfdCBkaXZpZGVfcXVhbnQ9ICFjaHJvbWEgPyB3LT5kaXZpZGVfcXVhbnRfZGNfbHVtYToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+ZGl2aWRlX3F1YW50X2RjX2Nocm9tYTsKKyAgICAgICAgICAgIGludDMyX3QgZGNfcXVhbnQgICAgPSAhY2hyb21hID8gdy0+cXVhbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHctPnF1YW50X2RjX2Nocm9tYTsKKworICAgICAgICAgICAgLy9vcmlnaW5hbCBpbnRlbnQgZGNfbGV2ZWwrPXByZWRpY3RlZF9kYy9xdWFudDsgYnV0IGl0IGdvdCBsb3N0IHNvbWV3aGVyZSBpbiB0aGUgcm91bmRpbmcKKyAgICAgICAgICAgIGRjX2xldmVsKz0gKHctPnByZWRpY3RlZF9kYypkaXZpZGVfcXVhbnQgKyAoMTw8MTIpICk+PjEzOworCisgICAgICAgICAgICBkc3BfeDhfcHV0X3NvbGlkY29sb3IoIGF2X2NsaXBfdWludDgoKGRjX2xldmVsKmRjX3F1YW50KzQpPj4zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdFtjaHJvbWFdLCBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbISFjaHJvbWFdKTsKKworICAgICAgICAgICAgZ290byBibG9ja19wbGFjZWQ7CisgICAgICAgIH0KKyAgICAgICAgemVyb3Nfb25seSA9IChkY19sZXZlbCA9PSAwKTsKKyAgICB9CisgICAgaWYoIWNocm9tYSl7CisgICAgICAgIHMtPmJsb2NrWzBdWzBdID0gZGNfbGV2ZWwqdy0+cXVhbnQ7CisgICAgfWVsc2V7CisgICAgICAgIHMtPmJsb2NrWzBdWzBdID0gZGNfbGV2ZWwqdy0+cXVhbnRfZGNfY2hyb21hOworICAgIH0KKworICAgIC8vdGhlcmUgaXMgIXplcm9fb25seSBjaGVjayBpbiB0aGUgb3JpZ2luYWwsIGJ1dCBkY19sZXZlbCBjaGVjayBpcyBlbm91Z2gKKyAgICBpZiggKHVuc2lnbmVkIGludCkoZGNfbGV2ZWwrMSkgPj0gMyAmJiAody0+ZWRnZXMmMykgIT0gMyApeworICAgICAgICBpbnQgZGlyZWN0aW9uOworICAgICAgICAvKmFjX2NvbXBfZGlyZWN0aW9uW29yaWVudF0gPSB7IDAsIDMsIDMsIDEsIDEsIDAsIDAsIDAsIDIsIDIsIDIsIDEgfTs8LQorICAgICAgICAtPiAwMScxMCcgMTAnMTAnIDAwJzAwJyAwMCcwMScgMDEnMTEnIDExJzAwID0+MHg2QTAxN0MgKi8KKyAgICAgICAgZGlyZWN0aW9uPSAoMHg2QTAxN0M+Pih3LT5vcmllbnQqMikpJjM7CisgICAgICAgIGlmIChkaXJlY3Rpb24gIT0gMyl7CisgICAgICAgICAgICB4OF9hY19jb21wZW5zYXRpb24odywgZGlyZWN0aW9uLCBzLT5ibG9ja1swXVswXSk7Ly9tb2RpZnkgYmxvY2tfbGFzdFtdCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZih3LT5mbGF0X2RjKXsKKyAgICAgICAgZHNwX3g4X3B1dF9zb2xpZGNvbG9yKHctPnByZWRpY3RlZF9kYywgcy0+ZGVzdFtjaHJvbWFdLCBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbISFjaHJvbWFdKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgdy0+ZHNwLnNwYXRpYWxfY29tcGVuc2F0aW9uW3ctPm9yaWVudF0oIHMtPmVkZ2VfZW11X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdFtjaHJvbWFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbISFjaHJvbWFdICk7CisgICAgfQorICAgIGlmKCF6ZXJvc19vbmx5KQorICAgICAgICB3LT53ZHNwLmlkY3RfYWRkKHMtPmRlc3RbY2hyb21hXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbISFjaHJvbWFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrWzBdKTsKKworYmxvY2tfcGxhY2VkOgorCisgICAgaWYoIWNocm9tYSl7CisgICAgICAgIHg4X3VwZGF0ZV9wcmVkaWN0aW9ucyh3LHctPm9yaWVudCxuKTsKKyAgICB9CisKKyAgICBpZihzLT5sb29wX2ZpbHRlcil7CisgICAgICAgIHVpbnQ4X3QqIHB0ciA9IHMtPmRlc3RbY2hyb21hXTsKKyAgICAgICAgaW50IGxpbmVzaXplID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWyEhY2hyb21hXTsKKworICAgICAgICBpZighKCAody0+ZWRnZXMmMikgfHwgKCB6ZXJvc19vbmx5ICYmICh3LT5vcmllbnR8NCk9PTQgKSApKXsKKyAgICAgICAgICAgIHctPmRzcC5oX2xvb3BfZmlsdGVyKHB0ciwgbGluZXNpemUsIHctPnF1YW50KTsKKyAgICAgICAgfQorICAgICAgICBpZighKCAody0+ZWRnZXMmMSkgfHwgKCB6ZXJvc19vbmx5ICYmICh3LT5vcmllbnR8OCk9PTggKSApKXsKKyAgICAgICAgICAgIHctPmRzcC52X2xvb3BfZmlsdGVyKHB0ciwgbGluZXNpemUsIHctPnF1YW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeDhfaW5pdF9ibG9ja19pbmRleChNcGVnRW5jQ29udGV4dCAqcyl7IC8vRklYTUUgbWF5YmUgbWVyZ2Ugd2l0aCBmZl8qCisvL25vdCBzLT5saW5lc2l6ZSBhcyB0aGlzIHdvdWxkIGJlIHdyb25nIGZvciBmaWVsZCBwaWNzCisvL25vdCB0aGF0IEludHJhWDggaGFzIGludGVybGFjaW5nIHN1cHBvcnQgOykKKyAgICBjb25zdCBpbnQgbGluZXNpemUgICA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5saW5lc2l6ZVswXTsKKyAgICBjb25zdCBpbnQgdXZsaW5lc2l6ZSA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5saW5lc2l6ZVsxXTsKKworICAgIHMtPmRlc3RbMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVswXTsKKyAgICBzLT5kZXN0WzFdID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMV07CisgICAgcy0+ZGVzdFsyXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhWzJdOworCisgICAgcy0+ZGVzdFswXSArPSAgIHMtPm1iX3kgICAgICAgICogICBsaW5lc2l6ZSA8PCAzOworICAgIHMtPmRlc3RbMV0gKz0gKCBzLT5tYl95Jih+MSkgKSAqIHV2bGluZXNpemUgPDwgMjsvL2Nocm9tYSBibG9ja3MgYXJlIG9uIGFkZCByb3dzCisgICAgcy0+ZGVzdFsyXSArPSAoIHMtPm1iX3kmKH4xKSApICogdXZsaW5lc2l6ZSA8PCAyOworfQorCisvKioKKyAqIEluaXRpYWxpemUgSW50cmFYOCBmcmFtZSBkZWNvZGVyLgorICogUmVxdWlyZXMgdmFsaWQgTXBlZ0VuY0NvbnRleHQgd2l0aCB2YWxpZCBzLT5tYl93aWR0aCBiZWZvcmUgY2FsbGluZy4KKyAqIEBwYXJhbSB3IHBvaW50ZXIgdG8gSW50cmFYOENvbnRleHQKKyAqIEBwYXJhbSBzIHBvaW50ZXIgdG8gTXBlZ0VuY0NvbnRleHQgb2YgdGhlIHBhcmVudCBjb2RlYworICovCithdl9jb2xkIHZvaWQgZmZfaW50cmF4OF9jb21tb25faW5pdChJbnRyYVg4Q29udGV4dCAqIHcsIE1wZWdFbmNDb250ZXh0ICogY29uc3Qgcyl7CisKKyAgICB3LT5zPXM7CisgICAgeDhfdmxjX2luaXQoKTsKKyAgICBhdl9hc3NlcnQwKHMtPm1iX3dpZHRoPjApOworICAgIHctPnByZWRpY3Rpb25fdGFibGU9YXZfbWFsbG9jeihzLT5tYl93aWR0aCoyKjIpOy8vdHdvIHJvd3MsIDIgYmxvY2tzIHBlciBjYW5ub24gbWIKKworICAgIGZmX3dtdjJkc3BfaW5pdCgmdy0+d2RzcCk7CisgICAgZmZfaW5pdF9zY2FudGFibGVfcGVybXV0YXRpb24ody0+aWRjdF9wZXJtdXRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT53ZHNwLmlkY3RfcGVybSk7CisKKyAgICBmZl9pbml0X3NjYW50YWJsZSh3LT5pZGN0X3Blcm11dGF0aW9uLCAmdy0+c2NhbnRhYmxlWzBdLCBmZl93bXYxX3NjYW50YWJsZVswXSk7CisgICAgZmZfaW5pdF9zY2FudGFibGUody0+aWRjdF9wZXJtdXRhdGlvbiwgJnctPnNjYW50YWJsZVsxXSwgZmZfd212MV9zY2FudGFibGVbMl0pOworICAgIGZmX2luaXRfc2NhbnRhYmxlKHctPmlkY3RfcGVybXV0YXRpb24sICZ3LT5zY2FudGFibGVbMl0sIGZmX3dtdjFfc2NhbnRhYmxlWzNdKTsKKworICAgIGZmX2ludHJheDhkc3BfaW5pdCgmdy0+ZHNwKTsKK30KKworLyoqCisgKiBEZXN0cm95IEludHJhWDggZnJhbWUgc3RydWN0dXJlLgorICogQHBhcmFtIHcgcG9pbnRlciB0byBJbnRyYVg4Q29udGV4dAorICovCithdl9jb2xkIHZvaWQgZmZfaW50cmF4OF9jb21tb25fZW5kKEludHJhWDhDb250ZXh0ICogdykKK3sKKyAgICBhdl9mcmVlcCgmdy0+cHJlZGljdGlvbl90YWJsZSk7Cit9CisKKy8qKgorICogRGVjb2RlIHNpbmdsZSBJbnRyYVg4IGZyYW1lLgorICogVGhlIHBhcmVudCBjb2RlYyBtdXN0IGZpbGwgcy0+bG9vcGZpbHRlciBhbmQgcy0+Z2IgKGJpdHN0cmVhbSkuCisgKiBUaGUgcGFyZW50IGNvZGVjIG11c3QgY2FsbCBmZl9tcHZfZnJhbWVfc3RhcnQoKSwgZmZfZXJfZnJhbWVfc3RhcnQoKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICogVGhlIHBhcmVudCBjb2RlYyBtdXN0IGNhbGwgZmZfZXJfZnJhbWVfZW5kKCksIGZmX21wdl9mcmFtZV9lbmQoKSBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSBmZl9tcHZfZGVjb2RlX21iKCkuCisgKiBsb3dyZXMgZGVjb2RpbmcgaXMgdGhlb3JldGljYWxseSBpbXBvc3NpYmxlLgorICogQHBhcmFtIHcgcG9pbnRlciB0byBJbnRyYVg4Q29udGV4dAorICogQHBhcmFtIGRxdWFudCBkb3VibGVkIHF1YW50aXplciwgaXQgd291bGQgYmUgb2RkIGluIGNhc2Ugb2YgVkMtMSBoYWxmcHE9PTEuCisgKiBAcGFyYW0gcXVhbnRfb2Zmc2V0IG9mZnNldCBhd2F5IGZyb20gemVybworICovCitpbnQgZmZfaW50cmF4OF9kZWNvZGVfcGljdHVyZShJbnRyYVg4Q29udGV4dCAqIGNvbnN0IHcsIGludCBkcXVhbnQsIGludCBxdWFudF9vZmZzZXQpeworICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3Qgcz0gdy0+czsKKyAgICBpbnQgbWJfeHk7CisgICAgdy0+dXNlX3F1YW50X21hdHJpeCA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgdy0+ZHF1YW50ID0gZHF1YW50OworICAgIHctPnF1YW50ICA9IGRxdWFudCA+PiAxOworICAgIHctPnFzdW0gICA9IHF1YW50X29mZnNldDsKKworICAgIHctPmRpdmlkZV9xdWFudF9kY19sdW1hID0gKCgxPDwxNikgKyAody0+cXVhbnQ+PjEpKSAvIHctPnF1YW50OworICAgIGlmKHctPnF1YW50IDwgNSl7CisgICAgICAgIHctPnF1YW50X2RjX2Nocm9tYSA9ICB3LT5xdWFudDsKKyAgICAgICAgdy0+ZGl2aWRlX3F1YW50X2RjX2Nocm9tYSA9IHctPmRpdmlkZV9xdWFudF9kY19sdW1hOworICAgIH1lbHNleworICAgICAgICB3LT5xdWFudF9kY19jaHJvbWEgPSAgdy0+cXVhbnQrKCh3LT5xdWFudCszKT4+Myk7CisgICAgICAgIHctPmRpdmlkZV9xdWFudF9kY19jaHJvbWEgPSAoKDE8PDE2KSArICh3LT5xdWFudF9kY19jaHJvbWE+PjEpKSAvIHctPnF1YW50X2RjX2Nocm9tYTsKKyAgICB9CisgICAgeDhfcmVzZXRfdmxjX3RhYmxlcyh3KTsKKworICAgIHMtPnJlc3luY19tYl94PTA7CisgICAgcy0+cmVzeW5jX21iX3k9MDsKKworICAgIGZvcihzLT5tYl95PTA7IHMtPm1iX3kgPCBzLT5tYl9oZWlnaHQqMjsgcy0+bWJfeSsrKXsKKyAgICAgICAgeDhfaW5pdF9ibG9ja19pbmRleChzKTsKKyAgICAgICAgbWJfeHk9KHMtPm1iX3k+PjEpKnMtPm1iX3N0cmlkZTsKKworICAgICAgICBmb3Iocy0+bWJfeD0wOyBzLT5tYl94IDwgcy0+bWJfd2lkdGgqMjsgcy0+bWJfeCsrKXsKKyAgICAgICAgICAgIHg4X2dldF9wcmVkaWN0aW9uKHcpOworICAgICAgICAgICAgaWYoeDhfc2V0dXBfc3BhdGlhbF9wcmVkaWN0b3IodywwKSkgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGlmKHg4X2RlY29kZV9pbnRyYV9tYih3LDApKSBnb3RvIGVycm9yOworCisgICAgICAgICAgICBpZiggcy0+bWJfeCAmIHMtPm1iX3kgJiAxICl7CisgICAgICAgICAgICAgICAgeDhfZ2V0X3ByZWRpY3Rpb25fY2hyb21hKHcpOworCisgICAgICAgICAgICAgICAgLyp3aGVuIHNldHRpbmcgdXAgY2hyb21hLCBubyB2bGMgaXMgcmVhZCwKKyAgICAgICAgICAgICAgICBzbyBubyBlcnJvciBjb25kaXRpb24gY2FuIGJlIHJlYWNoZWQqLworICAgICAgICAgICAgICAgIHg4X3NldHVwX3NwYXRpYWxfcHJlZGljdG9yKHcsMSk7CisgICAgICAgICAgICAgICAgaWYoeDhfZGVjb2RlX2ludHJhX21iKHcsMSkpIGdvdG8gZXJyb3I7CisKKyAgICAgICAgICAgICAgICB4OF9zZXR1cF9zcGF0aWFsX3ByZWRpY3Rvcih3LDIpOworICAgICAgICAgICAgICAgIGlmKHg4X2RlY29kZV9pbnRyYV9tYih3LDIpKSBnb3RvIGVycm9yOworCisgICAgICAgICAgICAgICAgcy0+ZGVzdFsxXSs9IDg7CisgICAgICAgICAgICAgICAgcy0+ZGVzdFsyXSs9IDg7CisKKyAgICAgICAgICAgICAgICAvKmVtdWxhdGUgTUIgaW5mbyBpbiB0aGUgcmVsZXZhbnQgdGFibGVzKi8KKyAgICAgICAgICAgICAgICBzLT5tYnNraXBfdGFibGUgW21iX3h5XT0wOworICAgICAgICAgICAgICAgIHMtPm1iaW50cmFfdGFibGVbbWJfeHldPTE7CisgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVttYl94eV0gPSB3LT5xdWFudDsKKyAgICAgICAgICAgICAgICBtYl94eSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+ZGVzdFswXSs9IDg7CisgICAgICAgIH0KKyAgICAgICAgaWYocy0+bWJfeSYxKXsKKyAgICAgICAgICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIChzLT5tYl95LTEpKjgsIDE2KTsKKyAgICAgICAgfQorICAgIH0KKworZXJyb3I6CisgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgcy0+cmVzeW5jX21iX3gsIHMtPnJlc3luY19tYl95LAorICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1iX3g+PjEpLTEsIChzLT5tYl95Pj4xKS0xLAorICAgICAgICAgICAgICAgICAgICAgICAgRVJfTUJfRU5EICk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9pbnRyYXg4LmggYi9mZm1wZWcvbGliYXZjb2RlYy9pbnRyYXg4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4MTc4NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ludHJheDguaApAQCAtMCwwICsxLDYyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19JTlRSQVg4X0gKKyNkZWZpbmUgQVZDT0RFQ19JTlRSQVg4X0gKKworI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAiaW50cmF4OGRzcC5oIgorI2luY2x1ZGUgIndtdjJkc3AuaCIKKwordHlwZWRlZiBzdHJ1Y3QgSW50cmFYOENvbnRleHQgeworICAgIFZMQyAqIGpfYWNfdmxjWzRdOy8vdGhleSBwb2ludCB0byB0aGUgc3RhdGljIGpfbWJfdmxjCisgICAgVkxDICogal9vcmllbnRfdmxjOworICAgIFZMQyAqIGpfZGNfdmxjWzNdOworCisgICAgaW50IHVzZV9xdWFudF9tYXRyaXg7CisvL3NldCBieSBmZl9pbnRyYXg4X2NvbW1vbl9pbml0CisgICAgdWludDhfdCAqIHByZWRpY3Rpb25fdGFibGU7Ly8yKihtYl93KjIpCisgICAgU2NhblRhYmxlIHNjYW50YWJsZVszXTsKKyAgICBXTVYyRFNQQ29udGV4dCB3ZHNwOworICAgIHVpbnQ4X3QgaWRjdF9wZXJtdXRhdGlvbls2NF07CisvL3NldCBieSB0aGUgY2FsbGVyIGNvZGVjCisgICAgTXBlZ0VuY0NvbnRleHQgKiBzOworICAgIEludHJhWDhEU1BDb250ZXh0IGRzcDsKKyAgICBpbnQgcXVhbnQ7CisgICAgaW50IGRxdWFudDsKKyAgICBpbnQgcXN1bTsKKy8vY2FsY3VsYXRlZCBwZXIgZnJhbWUKKyAgICBpbnQgcXVhbnRfZGNfY2hyb21hOworICAgIGludCBkaXZpZGVfcXVhbnRfZGNfbHVtYTsKKyAgICBpbnQgZGl2aWRlX3F1YW50X2RjX2Nocm9tYTsKKy8vY2hhbmdlZCBwZXIgYmxvY2sKKyAgICBpbnQgZWRnZXM7CisgICAgaW50IGZsYXRfZGM7CisgICAgaW50IHByZWRpY3RlZF9kYzsKKyAgICBpbnQgcmF3X29yaWVudDsKKyAgICBpbnQgY2hyb21hX29yaWVudDsKKyAgICBpbnQgb3JpZW50OworICAgIGludCBlc3RfcnVuOworfSBJbnRyYVg4Q29udGV4dDsKKwordm9pZCBmZl9pbnRyYXg4X2NvbW1vbl9pbml0KEludHJhWDhDb250ZXh0ICogdywgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzKTsKK3ZvaWQgZmZfaW50cmF4OF9jb21tb25fZW5kKEludHJhWDhDb250ZXh0ICogdyk7CitpbnQgIGZmX2ludHJheDhfZGVjb2RlX3BpY3R1cmUoSW50cmFYOENvbnRleHQgKiB3LCBpbnQgcXVhbnQsIGludCBoYWxmcHEpOworCisjZW5kaWYgLyogQVZDT0RFQ19JTlRSQVg4X0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ludHJheDhkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ludHJheDhkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjM0Zjg5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW50cmF4OGRzcC5jCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorKiBAZmlsZQorICpAYnJpZWYgSW50cmFYOCBmcmFtZSBzdWJkZWNvZGVyIGltYWdlIG1hbmlwdWxhdGlvbiByb3V0aW5lcworICovCisKKyNpbmNsdWRlICJpbnRyYXg4ZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisvKgorYXJlYSBwb3NpdGlvbnMsICMzIGlzIDEgcGl4ZWwgb25seSwgb3RoZXIgYXJlIDggcGl4ZWxzCisgICB8NjY2NjY2NjZ8CisgIDN8NDQ0NDQ0NDR8NTU1NTU1NTV8CistIC0rLS0tLS0tLS0rLS0tLS0tLS0rCisxIDJ8WFhYWFhYWFh8CisxIDJ8WFhYWFhYWFh8CisxIDJ8WFhYWFhYWFh8CisxIDJ8WFhYWFhYWFh8CisxIDJ8WFhYWFhYWFh8CisxIDJ8WFhYWFhYWFh8CisxIDJ8WFhYWFhYWFh8CisxIDJ8WFhYWFhYWFh8CiteLXN0YXJ0CisqLworCisjZGVmaW5lIGFyZWExICgwKQorI2RlZmluZSBhcmVhMiAoOCkKKyNkZWZpbmUgYXJlYTMgKDgrOCkKKyNkZWZpbmUgYXJlYTQgKDgrOCsxKQorI2RlZmluZSBhcmVhNSAoOCs4KzErOCkKKyNkZWZpbmUgYXJlYTYgKDgrOCsxKzE2KQorCisvKioKKyBDb2xsZWN0IHN0YXRpc3RpY3MgYW5kIHByZXBhcmUgdGhlIGVkZ2UgcGl4ZWxzIHJlcXVpcmVkIGJ5IHRoZSBvdGhlciBzcGF0aWFsIGNvbXBlbnNhdGlvbiBmdW5jdGlvbnMuCisKKyAqIEBwYXJhbSBzcmMgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9jZXNzZWQgYmxvY2sKKyAqIEBwYXJhbSBkc3QgcG9pbnRlciB0byBlbXVfZWRnZSwgZWRnZSBwaXhlbHMgYXJlIHN0b3JlZCB0aGUgd2F5IG90aGVyIGNvbXBlbnNhdGlvbiByb3V0aW5lcyBkby4KKyAqIEBwYXJhbSBsaW5lc2l6ZSBieXRlIG9mZnNldCBiZXR3ZWVuIDIgdmVydGljYWwgcGl4ZWxzIGluIHRoZSBzb3VyY2UgaW1hZ2UKKyAqIEBwYXJhbSByYW5nZSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB3aGVyZSB0aGUgZWRnZSBwaXhlbCByYW5nZSBpcyB0byBiZSBzdG9yZWQgKG1heC1taW4gdmFsdWVzKQorICogQHBhcmFtIHBzdW0gIHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIHdoZXJlIHRoZSBlZGdlIHBpeGVsIHN1bSBpcyB0byBiZSBzdG9yZWQKKyAqIEBwYXJhbSBlZGdlcyBJbmZvcm1zIHRoaXMgcm91dGluZSB0aGF0IHRoZSBibG9jayBpcyBvbiBhbiBpbWFnZSBib3JkZXIsIHNvIGl0IGhhcyB0byBpbnRlcnBvbGF0ZSB0aGUgbWlzc2luZyBlZGdlIHBpeGVscy4KKyAgICAgICAgICAgICAgICBhbmQgc29tZSBvZiB0aGUgZWRnZSBwaXhlbHMgc2hvdWxkIGJlIGludGVycG9sYXRlZCwgdGhlIGZsYWcgaGFzIHRoZSBmb2xsb3dpbmcgbWVhbmluZzoKKyAgICAgICAgICAgICAgICAxICAgLSBtYl94PT0wIC0gZmlyc3QgYmxvY2sgaW4gdGhlIHJvdywgaW50ZXJwb2xhdGUgYXJlYSAjMSwjMiwjMzsKKyAgICAgICAgICAgICAgICAyICAgLSBtYl95PT0wIC0gZmlyc3Qgcm93LCBpbnRlcnBvbGF0ZSBhcmVhICMzLCM0LCM1LCM2OworICAgICAgICBub3RlOiAgIDF8MiAtIG1iX3g9PW1iX3k9PTAgLSBmaXJzdCBibG9jaywgdXNlIDB4ODAgdmFsdWUgZm9yIGFsbCBhcmVhczsKKyAgICAgICAgICAgICAgICA0ICAgLSBtYl94Pj0gKG1iX3dpZHRoLTEpIGxhc3QgYmxvY2sgaW4gdGhlIHJvdywgaW50ZXJwb2xhdGUgYXJlYSAjNTsKKyovCitzdGF0aWMgdm9pZCB4OF9zZXR1cF9zcGF0aWFsX2NvbXBlbnNhdGlvbih1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICBpbnQgKiByYW5nZSwgaW50ICogcHN1bSwgIGludCBlZGdlcyl7CisgICAgdWludDhfdCAqIHB0cjsKKyAgICBpbnQgc3VtOworICAgIGludCBpOworICAgIGludCBtaW5fcGl4LG1heF9waXg7CisgICAgdWludDhfdCBjOworCisgICAgaWYoKGVkZ2VzJjMpPT0zKXsKKyAgICAgICAgKnBzdW09MHg4MCooOCsxKzgrMik7CisgICAgICAgICpyYW5nZT0wOworICAgICAgICBtZW1zZXQoZHN0LDB4ODAsMTYrMSsxNis4KTsKKyAgICAgICAgLy90aGlzIHRyaWdnZXJzIGZsYXRfZGMgZm9yIHN1cmUuCisgICAgICAgIC8vZmxhdF9kYyBhdm9pZHMgYWxsIChvdGhlcikgcHJlZGljdGlvbiBtb2RlcywgYnV0IHJlcXVpcmVzIGRjX2xldmVsIGRlY29kaW5nLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWluX3BpeD0yNTY7CisgICAgbWF4X3BpeD0tMTsKKworICAgIHN1bT0wOworCisgICAgaWYoIShlZGdlcyYxKSl7Ly8obWJfeCE9MCkvL3RoZXJlIGlzIHByZXZpb3VzIGJsb2NrIG9uIHRoaXMgcm93CisgICAgICAgIHB0cj1zcmMtMTsvL2xlZnQgY29sdW1uLCBhcmVhIDIKKyAgICAgICAgZm9yKGk9NztpPj0wO2ktLSl7CisgICAgICAgICAgICBjPSoocHRyLTEpOy8vYXJlYTEsIHNhbWUgbWIgYXMgYXJlYTIsIG5vIG5lZWQgdG8gY2hlY2sKKyAgICAgICAgICAgIGRzdFthcmVhMStpXT1jOworICAgICAgICAgICAgYz0qKHB0cik7CisKKyAgICAgICAgICAgIHN1bSs9YzsKKyAgICAgICAgICAgIG1pbl9waXg9RkZNSU4obWluX3BpeCxjKTsKKyAgICAgICAgICAgIG1heF9waXg9RkZNQVgobWF4X3BpeCxjKTsKKyAgICAgICAgICAgIGRzdFthcmVhMitpXT1jOworCisgICAgICAgICAgICBwdHIrPWxpbmVzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIShlZGdlcyYyKSl7ICAvLyhtYl95IT0wKS8vdGhlcmUgaXMgcm93IGFib3ZlCisgICAgICAgIHB0cj1zcmMtbGluZXNpemU7Ly90b3AgbGluZQorICAgICAgICBmb3IoaT0wO2k8ODtpKyspeworICAgICAgICAgICAgYz0qKHB0citpKTsKKyAgICAgICAgICAgIHN1bSs9YzsKKyAgICAgICAgICAgIG1pbl9waXg9RkZNSU4obWluX3BpeCwgYyk7CisgICAgICAgICAgICBtYXhfcGl4PUZGTUFYKG1heF9waXgsIGMpOworICAgICAgICB9CisgICAgICAgIGlmKGVkZ2VzJjQpey8vbGFzdCBibG9jayBvbiB0aGUgcm93PworICAgICAgICAgICAgbWVtc2V0KGRzdCthcmVhNSxjLDgpOy8vc2V0IHdpdGggbGFzdCBwaXhlbCBmcgorICAgICAgICAgICAgbWVtY3B5KGRzdCthcmVhNCwgcHRyLCA4KTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBtZW1jcHkoZHN0K2FyZWE0LCBwdHIsIDE2KTsvL2JvdGggYXJlYTQgYW5kIDUKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZHN0K2FyZWE2LCBwdHItbGluZXNpemUsIDgpOy8vYXJlYTYgYWx3YXlzIHByZXNlbnQgaW4gdGhlIGFib3ZlIGJsb2NrCisgICAgfQorICAgIC8vbm93IGNhbGN1bGF0ZSB0aGUgc3R1ZmYgd2UgbmVlZAorICAgIGlmKGVkZ2VzJjMpey8vbWJfeD09MCB8fCBtYl95PT0wKXsKKyAgICAgICAgaW50IGF2Zz0oc3VtKzQpPj4zOworICAgICAgICBpZihlZGdlcyYxKXsgLy8obWJfeD09MCkgey8vaW1wbGllcyBtYl95IT0wCisgICAgICAgICAgICBtZW1zZXQoZHN0K2FyZWExLGF2Zyw4KzgrMSk7Ly9hcmVhcyAxLDIgYW5kIDMgYXJlIGF2ZXJhZ2VkCisgICAgICAgIH1lbHNley8vaW1wbGllcyB5PT0wIHghPTAKKyAgICAgICAgICAgIG1lbXNldChkc3QrYXJlYTMsYXZnLCAxKzE2KzgpOy8vYXJlYXMgMywgNCw1LDYKKyAgICAgICAgfQorICAgICAgICBzdW0rPWF2Zyo5OworICAgIH1lbHNleworICAgICAgICB1aW50OF90IGM9KihzcmMtMS1saW5lc2l6ZSk7Ly90aGUgZWRnZSBwaXhlbCwgaW4gdGhlIHRvcCBsaW5lIGFuZCBsZWZ0IGNvbHVtbgorICAgICAgICBkc3RbYXJlYTNdPWM7CisgICAgICAgIHN1bSs9YzsKKyAgICAgICAgLy9lZGdlIHBpeGVsIGlzIG5vdCBwYXJ0IG9mIG1pbi9tYXgKKyAgICB9CisgICAgKCpyYW5nZSkgPSBtYXhfcGl4IC0gbWluX3BpeDsKKyAgICBzdW0gKz0gKihkc3QrYXJlYTUpICsgKihkc3QrYXJlYTUrMSk7CisgICAgKnBzdW0gPSBzdW07Cit9CisKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHplcm9fcHJlZGljdGlvbl93ZWlnaHRzWzY0KjJdID0geworICAgIDY0MCwgIDY0MCwgIDY2OSwgIDQ4MCwgIDcwOCwgIDM1NCwgIDc0OCwgMjU3LCAgNzkyLCAxOTgsICA3NjAsIDE0MywgIDgwOCwgMTAxLCAgNzcyLCAgNzIsCisgICAgNDgwLCAgNjY5LCAgNTM3LCAgNTM3LCAgNTk4LCAgNDE2LCAgNjYxLCAzMTYsICA3MTksIDI1MCwgIDcwNywgMTg1LCAgNzY4LCAxMzQsICA3NDUsICA5NywKKyAgICAzNTQsICA3MDgsICA0MTYsICA1OTgsICA0ODgsICA0ODgsICA1NjQsIDM4OCwgIDYzNCwgMzE3LCAgNjQyLCAyNDEsICA3MTYsIDE3OSwgIDcwNiwgMTMyLAorICAgIDI1NywgIDc0OCwgIDMxNiwgIDY2MSwgIDM4OCwgIDU2NCwgIDQ2OSwgNDY5LCAgNTQzLCAzOTUsICA1NzEsIDMxMSwgIDY1NSwgMjM4LCAgNjYwLCAxODAsCisgICAgMTk4LCAgNzkyLCAgMjUwLCAgNzE5LCAgMzE3LCAgNjM0LCAgMzk1LCA1NDMsICA0NjksIDQ2OSwgIDUwNywgMzgwLCAgNTk3LCAyOTksICA2MTYsIDIzMSwKKyAgICAxNjEsICA4NTUsICAyMDYsICA3ODgsICAyNjYsICA3MTAsICAzNDAsIDYyMywgIDQxMSwgNTQ4LCAgNDU1LCA0NTUsICA1NDgsIDM2NiwgIDU3NiwgMjg4LAorICAgIDEyMiwgIDk3MiwgIDE1OSwgIDkxNCwgIDIxMSwgIDg0MiwgIDI3NiwgNzU4LCAgMzQxLCA2ODIsICAzODksIDU4NCwgIDQ4MywgNDgzLCAgNTIwLCAzOTAsCisgICAgMTEwLCAxMTcyLCAgMTQ0LCAxMTA3LCAgMTkzLCAxMDI4LCAgMjU0LCA5MzIsICAzMTcsIDg0NiwgIDM2NiwgNzMxLCAgNDU4LCA2MTEsICA0OTksIDQ5OQorfTsKKworc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fMCh1aW50OF90ICpzcmMgLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSl7CisgICAgaW50IGksajsKKyAgICBpbnQgeCx5OworICAgIHVuc2lnbmVkIGludCBwOy8vcG93ZXIgZGl2aWRlZCBieSAyCisgICAgaW50IGE7CisgICAgdWludDE2X3QgbGVmdF9zdW1bMl1bOF0gPSB7IHsgMCB9IH07CisgICAgdWludDE2X3QgIHRvcF9zdW1bMl1bOF0gPSB7IHsgMCB9IH07CisKKyAgICBmb3IoaT0wO2k8ODtpKyspeworICAgICAgICBhPXNyY1thcmVhMis3LWldPDw0OworICAgICAgICBmb3Ioaj0wO2o8ODtqKyspeworICAgICAgICAgICAgcD1hYnMoaS1qKTsKKyAgICAgICAgICAgIGxlZnRfc3VtW3AmMV1bal0rPSBhPj4ocD4+MSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaT0wO2k8ODtpKyspeworICAgICAgICBhPXNyY1thcmVhNCtpXTw8NDsKKyAgICAgICAgZm9yKGo9MDtqPDg7aisrKXsKKyAgICAgICAgICAgIHA9YWJzKGktaik7CisgICAgICAgICAgICB0b3Bfc3VtW3AmMV1bal0rPSAgIGE+PihwPj4xKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IoO2k8MTA7aSsrKXsKKyAgICAgICAgYT1zcmNbYXJlYTQraV08PDQ7CisgICAgICAgIGZvcihqPTU7ajw4O2orKyl7CisgICAgICAgICAgICBwPWFicyhpLWopOworICAgICAgICAgICAgdG9wX3N1bVtwJjFdW2pdKz0gICBhPj4ocD4+MSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yKDtpPDEyO2krKyl7CisgICAgICAgIGE9c3JjW2FyZWE0K2ldPDw0OworICAgICAgICBmb3Ioaj03O2o8ODtqKyspeworICAgICAgICAgICAgcD1hYnMoaS1qKTsKKyAgICAgICAgICAgIHRvcF9zdW1bcCYxXVtqXSs9ICAgYT4+KHA+PjEpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9MDtpPDg7aSsrKXsKKyAgICAgICAgdG9wX3N1bSBbMF1baV0rPSh0b3Bfc3VtIFsxXVtpXSoxODEgKyAxMjggKT4+ODsvLzE4MSBpcyBzcXJ0KDIpLzIKKyAgICAgICAgbGVmdF9zdW1bMF1baV0rPShsZWZ0X3N1bVsxXVtpXSoxODEgKyAxMjggKT4+ODsKKyAgICB9CisgICAgZm9yKHk9MDt5PDg7eSsrKXsKKyAgICAgICAgZm9yKHg9MDt4PDg7eCsrKXsKKyAgICAgICAgICAgIGRzdFt4XSA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpdG9wX3N1bSBbMF1beF0qemVyb19wcmVkaWN0aW9uX3dlaWdodHNbeSoxNit4KjIrMF0gKworICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClsZWZ0X3N1bVswXVt5XSp6ZXJvX3ByZWRpY3Rpb25fd2VpZ2h0c1t5KjE2K3gqMisxXSArCisgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorICAgICAgICAgICAgICAgICAgICAgICk+PjE2OworICAgICAgICB9CisgICAgICAgIGRzdCs9bGluZXNpemU7CisgICAgfQorfQorc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fMSh1aW50OF90ICpzcmMgLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSl7CisgICAgaW50IHgseTsKKworICAgIGZvcih5PTA7eTw4O3krKyl7CisgICAgICAgIGZvcih4PTA7eDw4O3grKyl7CisgICAgICAgICAgICBkc3RbeF09c3JjW2FyZWE0ICsgRkZNSU4oMip5K3grMiwgMTUpIF07CisgICAgICAgIH0KKyAgICAgICAgZHN0Kz1saW5lc2l6ZTsKKyAgICB9Cit9CitzdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBlbnNhdGlvbl8yKHVpbnQ4X3QgKnNyYyAsIHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVzaXplKXsKKyAgICBpbnQgeCx5OworCisgICAgZm9yKHk9MDt5PDg7eSsrKXsKKyAgICAgICAgZm9yKHg9MDt4PDg7eCsrKXsKKyAgICAgICAgICAgIGRzdFt4XT1zcmNbYXJlYTQgKzEreSt4XTsKKyAgICAgICAgfQorICAgICAgICBkc3QrPWxpbmVzaXplOworICAgIH0KK30KK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzModWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpeworICAgIGludCB4LHk7CisKKyAgICBmb3IoeT0wO3k8ODt5KyspeworICAgICAgICBmb3IoeD0wO3g8ODt4KyspeworICAgICAgICAgICAgZHN0W3hdPXNyY1thcmVhNCArKCh5KzEpPj4xKSt4XTsKKyAgICAgICAgfQorICAgICAgICBkc3QrPWxpbmVzaXplOworICAgIH0KK30KK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzQodWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpeworICAgIGludCB4LHk7CisKKyAgICBmb3IoeT0wO3k8ODt5KyspeworICAgICAgICBmb3IoeD0wO3g8ODt4KyspeworICAgICAgICAgICAgZHN0W3hdPSggc3JjW2FyZWE0K3hdICsgc3JjW2FyZWE2K3hdICsgMSApPj4xOworICAgICAgICB9CisgICAgICAgIGRzdCs9bGluZXNpemU7CisgICAgfQorfQorc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fNSh1aW50OF90ICpzcmMgLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSl7CisgICAgaW50IHgseTsKKworICAgIGZvcih5PTA7eTw4O3krKyl7CisgICAgICAgIGZvcih4PTA7eDw4O3grKyl7CisgICAgICAgICAgICBpZigyKngteTwwKXsKKyAgICAgICAgICAgICAgICBkc3RbeF09c3JjW2FyZWEyKzkrMip4LXldOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgZHN0W3hdPXNyY1thcmVhNCAreC0oKHkrMSk+PjEpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc3QrPWxpbmVzaXplOworICAgIH0KK30KK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzYodWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpeworICAgIGludCB4LHk7CisKKyAgICBmb3IoeT0wO3k8ODt5KyspeworICAgICAgICBmb3IoeD0wO3g8ODt4KyspeworICAgICAgICAgICAgZHN0W3hdPXNyY1thcmVhMyt4LXldOworICAgICAgICB9CisgICAgICAgIGRzdCs9bGluZXNpemU7CisgICAgfQorfQorc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fNyh1aW50OF90ICpzcmMgLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSl7CisgICAgaW50IHgseTsKKworICAgIGZvcih5PTA7eTw4O3krKyl7CisgICAgICAgIGZvcih4PTA7eDw4O3grKyl7CisgICAgICAgICAgICBpZih4LTIqeT4wKXsKKyAgICAgICAgICAgICAgICBkc3RbeF09KCBzcmNbYXJlYTMtMSt4LTIqeV0gKyBzcmNbYXJlYTMreC0yKnldICsgMSk+PjE7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBkc3RbeF09c3JjW2FyZWEyKzgteSArKHg+PjEpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc3QrPWxpbmVzaXplOworICAgIH0KK30KK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzgodWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpeworICAgIGludCB4LHk7CisKKyAgICBmb3IoeT0wO3k8ODt5KyspeworICAgICAgICBmb3IoeD0wO3g8ODt4KyspeworICAgICAgICAgICAgZHN0W3hdPSggc3JjW2FyZWExKzcteV0gKyBzcmNbYXJlYTIrNy15XSArIDEgKT4+MTsKKyAgICAgICAgfQorICAgICAgICBkc3QrPWxpbmVzaXplOworICAgIH0KK30KK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzkodWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpeworICAgIGludCB4LHk7CisKKyAgICBmb3IoeT0wO3k8ODt5KyspeworICAgICAgICBmb3IoeD0wO3g8ODt4KyspeworICAgICAgICAgICAgZHN0W3hdPXNyY1thcmVhMis2LUZGTUlOKHgreSw2KV07CisgICAgICAgIH0KKyAgICAgICAgZHN0Kz1saW5lc2l6ZTsKKyAgICB9Cit9CitzdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBlbnNhdGlvbl8xMCh1aW50OF90ICpzcmMgLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSl7CisgICAgaW50IHgseTsKKworICAgIGZvcih5PTA7eTw4O3krKyl7CisgICAgICAgIGZvcih4PTA7eDw4O3grKyl7CisgICAgICAgICAgICBkc3RbeF09KHNyY1thcmVhMis3LXldKig4LXgpK3NyY1thcmVhNCt4XSp4KzQpPj4zOworICAgICAgICB9CisgICAgICAgIGRzdCs9bGluZXNpemU7CisgICAgfQorfQorc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fMTEodWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpeworICAgIGludCB4LHk7CisKKyAgICBmb3IoeT0wO3k8ODt5KyspeworICAgICAgICBmb3IoeD0wO3g8ODt4KyspeworICAgICAgICAgICAgZHN0W3hdPShzcmNbYXJlYTIrNy15XSp5K3NyY1thcmVhNCt4XSooOC15KSs0KT4+MzsKKyAgICAgICAgfQorICAgICAgICBkc3QrPWxpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQgeDhfbG9vcF9maWx0ZXIodWludDhfdCAqIHB0ciwgY29uc3QgaW50IGFfc3RyaWRlLCBjb25zdCBpbnQgYl9zdHJpZGUsIGludCBxdWFudCl7CisgICAgaW50IGksdDsKKyAgICBpbnQgcDAscDEscDIscDMscDQscDUscDYscDcscDgscDk7CisgICAgaW50IHFsPShxdWFudCsxMCk+PjM7CisKKyAgICBmb3IoaT0wOyBpPDg7IGkrKyxwdHIrPWJfc3RyaWRlKXsKKyAgICAgICAgcDA9cHRyWy01KmFfc3RyaWRlXTsKKyAgICAgICAgcDE9cHRyWy00KmFfc3RyaWRlXTsKKyAgICAgICAgcDI9cHRyWy0zKmFfc3RyaWRlXTsKKyAgICAgICAgcDM9cHRyWy0yKmFfc3RyaWRlXTsKKyAgICAgICAgcDQ9cHRyWy0xKmFfc3RyaWRlXTsKKyAgICAgICAgcDU9cHRyWyAwICAgICAgICAgXTsKKyAgICAgICAgcDY9cHRyWyAxKmFfc3RyaWRlXTsKKyAgICAgICAgcDc9cHRyWyAyKmFfc3RyaWRlXTsKKyAgICAgICAgcDg9cHRyWyAzKmFfc3RyaWRlXTsKKyAgICAgICAgcDk9cHRyWyA0KmFfc3RyaWRlXTsKKworICAgICAgICB0PQorICAgICAgICAgICAgKEZGQUJTKHAxLXAyKSA8PSBxbCkgKworICAgICAgICAgICAgKEZGQUJTKHAyLXAzKSA8PSBxbCkgKworICAgICAgICAgICAgKEZGQUJTKHAzLXA0KSA8PSBxbCkgKworICAgICAgICAgICAgKEZGQUJTKHA0LXA1KSA8PSBxbCk7CisgICAgICAgIGlmKHQ+MCl7Ly9Zb3UgbmVlZCBhdCBsZWFzdCAxIHRvIGJlIGFibGUgdG8gcmVhY2ggYSB0b3RhbCBzY29yZSBvZiA2LgorICAgICAgICAgICAgdCs9CisgICAgICAgICAgICAgICAgKEZGQUJTKHA1LXA2KSA8PSBxbCkgKworICAgICAgICAgICAgICAgIChGRkFCUyhwNi1wNykgPD0gcWwpICsKKyAgICAgICAgICAgICAgICAoRkZBQlMocDctcDgpIDw9IHFsKSArCisgICAgICAgICAgICAgICAgKEZGQUJTKHA4LXA5KSA8PSBxbCkgKworICAgICAgICAgICAgICAgIChGRkFCUyhwMC1wMSkgPD0gcWwpOworICAgICAgICAgICAgaWYodD49Nil7CisgICAgICAgICAgICAgICAgaW50IG1pbixtYXg7CisKKyAgICAgICAgICAgICAgICBtaW49bWF4PXAxOworICAgICAgICAgICAgICAgIG1pbj1GRk1JTihtaW4scDMpOyBtYXg9RkZNQVgobWF4LHAzKTsKKyAgICAgICAgICAgICAgICBtaW49RkZNSU4obWluLHA1KTsgbWF4PUZGTUFYKG1heCxwNSk7CisgICAgICAgICAgICAgICAgbWluPUZGTUlOKG1pbixwOCk7IG1heD1GRk1BWChtYXgscDgpOworICAgICAgICAgICAgICAgIGlmKG1heC1taW48MipxdWFudCl7Ly9lYXJseSBzdG9wCisgICAgICAgICAgICAgICAgICAgIG1pbj1GRk1JTihtaW4scDIpOyBtYXg9RkZNQVgobWF4LHAyKTsKKyAgICAgICAgICAgICAgICAgICAgbWluPUZGTUlOKG1pbixwNCk7IG1heD1GRk1BWChtYXgscDQpOworICAgICAgICAgICAgICAgICAgICBtaW49RkZNSU4obWluLHA2KTsgbWF4PUZGTUFYKG1heCxwNik7CisgICAgICAgICAgICAgICAgICAgIG1pbj1GRk1JTihtaW4scDcpOyBtYXg9RkZNQVgobWF4LHA3KTsKKyAgICAgICAgICAgICAgICAgICAgaWYobWF4LW1pbjwyKnF1YW50KXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0clstMiphX3N0cmlkZV09KDQqcDIgKyAzKnAzICsgMSpwNyArIDQpPj4zOworICAgICAgICAgICAgICAgICAgICAgICAgcHRyWy0xKmFfc3RyaWRlXT0oMypwMiArIDMqcDQgKyAyKnA3ICsgNCk+PjM7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHJbIDAgICAgICAgICBdPSgyKnAyICsgMypwNSArIDMqcDcgKyA0KT4+MzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0clsgMSphX3N0cmlkZV09KDEqcDIgKyAzKnA2ICsgNCpwNyArIDQpPj4zOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB4LHgwLHgxLHgyOworICAgICAgICAgICAgaW50IG07CisKKyAgICAgICAgICAgIHgwID0gICAoMipwMyAtIDUqcDQgKyA1KnA1IC0gMipwNiArIDQpPj4zOworICAgICAgICAgICAgaWYoRkZBQlMoeDApIDwgcXVhbnQpeworICAgICAgICAgICAgICAgIHgxPSgyKnAxIC0gNSpwMiArIDUqcDMgLSAyKnA0ICsgNCk+PjM7CisgICAgICAgICAgICAgICAgeDI9KDIqcDUgLSA1KnA2ICsgNSpwNyAtIDIqcDggKyA0KT4+MzsKKworICAgICAgICAgICAgICAgIHg9RkZBQlMoeDApIC0gRkZNSU4oIEZGQUJTKHgxKSwgRkZBQlMoeDIpICk7CisgICAgICAgICAgICAgICAgbT1wNC1wNTsKKworICAgICAgICAgICAgICAgIGlmKCB4ID4gMCAmJiAobV54MCkgPDApeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpZ247CisKKyAgICAgICAgICAgICAgICAgICAgc2lnbj1tPj4zMTsKKyAgICAgICAgICAgICAgICAgICAgbT0obV5zaWduKS1zaWduOy8vYWJzKG0pCisgICAgICAgICAgICAgICAgICAgIG0+Pj0xOworCisgICAgICAgICAgICAgICAgICAgIHg9KDUqeCk+PjM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoeD5tKSB4PW07CisKKyAgICAgICAgICAgICAgICAgICAgeD0oeF5zaWduKS1zaWduOworCisgICAgICAgICAgICAgICAgICAgIHB0clstMSphX3N0cmlkZV0gLT0geDsKKyAgICAgICAgICAgICAgICAgICAgcHRyWyAwXSAgICAgICAgICArPSB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgeDhfaF9sb29wX2ZpbHRlcih1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBxc2NhbGUpeworICAgIHg4X2xvb3BfZmlsdGVyKHNyYywgc3RyaWRlLCAxLCBxc2NhbGUpOworfQorCitzdGF0aWMgdm9pZCB4OF92X2xvb3BfZmlsdGVyKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHFzY2FsZSl7CisgICAgeDhfbG9vcF9maWx0ZXIoc3JjLCAxLCBzdHJpZGUsIHFzY2FsZSk7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9pbnRyYXg4ZHNwX2luaXQoSW50cmFYOERTUENvbnRleHQgKmRzcCkKK3sKKyAgICBkc3AtPmhfbG9vcF9maWx0ZXI9eDhfaF9sb29wX2ZpbHRlcjsKKyAgICBkc3AtPnZfbG9vcF9maWx0ZXI9eDhfdl9sb29wX2ZpbHRlcjsKKyAgICBkc3AtPnNldHVwX3NwYXRpYWxfY29tcGVuc2F0aW9uPXg4X3NldHVwX3NwYXRpYWxfY29tcGVuc2F0aW9uOworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bMF09c3BhdGlhbF9jb21wZW5zYXRpb25fMDsKKyAgICBkc3AtPnNwYXRpYWxfY29tcGVuc2F0aW9uWzFdPXNwYXRpYWxfY29tcGVuc2F0aW9uXzE7CisgICAgZHNwLT5zcGF0aWFsX2NvbXBlbnNhdGlvblsyXT1zcGF0aWFsX2NvbXBlbnNhdGlvbl8yOworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bM109c3BhdGlhbF9jb21wZW5zYXRpb25fMzsKKyAgICBkc3AtPnNwYXRpYWxfY29tcGVuc2F0aW9uWzRdPXNwYXRpYWxfY29tcGVuc2F0aW9uXzQ7CisgICAgZHNwLT5zcGF0aWFsX2NvbXBlbnNhdGlvbls1XT1zcGF0aWFsX2NvbXBlbnNhdGlvbl81OworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bNl09c3BhdGlhbF9jb21wZW5zYXRpb25fNjsKKyAgICBkc3AtPnNwYXRpYWxfY29tcGVuc2F0aW9uWzddPXNwYXRpYWxfY29tcGVuc2F0aW9uXzc7CisgICAgZHNwLT5zcGF0aWFsX2NvbXBlbnNhdGlvbls4XT1zcGF0aWFsX2NvbXBlbnNhdGlvbl84OworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bOV09c3BhdGlhbF9jb21wZW5zYXRpb25fOTsKKyAgICBkc3AtPnNwYXRpYWxfY29tcGVuc2F0aW9uWzEwXT1zcGF0aWFsX2NvbXBlbnNhdGlvbl8xMDsKKyAgICBkc3AtPnNwYXRpYWxfY29tcGVuc2F0aW9uWzExXT1zcGF0aWFsX2NvbXBlbnNhdGlvbl8xMTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2ludHJheDhkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2ludHJheDhkc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTRhM2FmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaW50cmF4OGRzcC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0lOVFJBWDhEU1BfSAorI2RlZmluZSBBVkNPREVDX0lOVFJBWDhEU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IEludHJhWDhEU1BDb250ZXh0IHsKKyAgICB2b2lkICgqdl9sb29wX2ZpbHRlcikodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcXNjYWxlKTsKKyAgICB2b2lkICgqaF9sb29wX2ZpbHRlcikodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcXNjYWxlKTsKKworICAgIHZvaWQgKCpzcGF0aWFsX2NvbXBlbnNhdGlvblsxMl0pKHVpbnQ4X3QgKnNyYyAsIHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVzaXplKTsKKyAgICB2b2lkICgqc2V0dXBfc3BhdGlhbF9jb21wZW5zYXRpb24pKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJhbmdlLCBpbnQgKnN1bSwgIGludCBlZGdlcyk7Cit9IEludHJhWDhEU1BDb250ZXh0OworCit2b2lkIGZmX2ludHJheDhkc3BfaW5pdChJbnRyYVg4RFNQQ29udGV4dCAqZHNwKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSU5UUkFYOERTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9pbnRyYXg4aHVmLmggYi9mZm1wZWcvbGliYXZjb2RlYy9pbnRyYXg4aHVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1OTA2YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2ludHJheDhodWYuaApAQCAtMCwwICsxLDkxOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSU5UUkFYOEhVRl9ICisjZGVmaW5lIEFWQ09ERUNfSU5UUkFYOEhVRl9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9vcmllbnRfbG93cXVhbnRfdGFibGVbNF1bMTJdWzJdPXsKKyAgICB7Ly8wCisgICAgICAgIHsweDAwMDAsICAxfSwgezB4MDAwNCwgIDN9LCB7MHgwMDA1LCAgM30sIHsweDAwMEMsICA0fSwKKyAgICAgICAgezB4MDAwRCwgIDR9LCB7MHgwMDM4LCAgNn0sIHsweDAwMUQsICA1fSwgezB4MDAzOSwgIDZ9LAorICAgICAgICB7MHgwMDNDLCAgNn0sIHsweDAwM0QsICA2fSwgezB4MDAzRSwgIDZ9LCB7MHgwMDNGLCAgNn0sCisgICAgfSx7Ly8xCisgICAgICAgIHsweDAwMDAsICA1fSwgezB4MDAwMSwgIDV9LCB7MHgwMDAyLCAgNX0sIHsweDAwMDEsICAyfSwKKyAgICAgICAgezB4MDAwMiwgIDJ9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDMsICA1fSwgezB4MDAwNiwgIDN9LAorICAgICAgICB7MHgwMDAzLCAgNH0sIHsweDAwMEUsICA0fSwgezB4MDAxRSwgIDV9LCB7MHgwMDFGLCAgNX0sCisgICAgfSx7Ly8yCisgICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwMSwgIDJ9LCB7MHgwMDA0LCAgM30sIHsweDAwMDUsICAzfSwKKyAgICAgICAgezB4MDAwNiwgIDN9LCB7MHgwMDM4LCAgNn0sIHsweDAwMzksICA2fSwgezB4MDAxRCwgIDV9LAorICAgICAgICB7MHgwMDNDLCAgNn0sIHsweDAwM0QsICA2fSwgezB4MDAzRSwgIDZ9LCB7MHgwMDNGLCAgNn0sCisgICAgfSx7Ly8zCisgICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwMiwgIDR9LCB7MHgwMDAzLCAgNH0sIHsweDAwMDEsICAyfSwKKyAgICAgICAgezB4MDAwMiwgIDJ9LCB7MHgwMDE4LCAgNX0sIHsweDAwMTksICA1fSwgezB4MDAwRCwgIDR9LAorICAgICAgICB7MHgwMDFDLCAgNX0sIHsweDAwMUQsICA1fSwgezB4MDAxRSwgIDV9LCB7MHgwMDFGLCAgNX0sCisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHg4X29yaWVudF9oaWdocXVhbnRfdGFibGVbMl1bMTJdWzJdPXsKKyAgICB7Ly8wCisgICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwMSwgIDJ9LCB7MHgwMDA0LCAgM30sIHsweDAwMDUsICAzfSwKKyAgICAgICAgezB4MDAwNiwgIDN9LCB7MHgwMDM4LCAgNn0sIHsweDAwMUQsICA1fSwgezB4MDAzOSwgIDZ9LAorICAgICAgICB7MHgwMDNDLCAgNn0sIHsweDAwM0QsICA2fSwgezB4MDAzRSwgIDZ9LCB7MHgwMDNGLCAgNn0sCisgICAgfSx7Ly8xCisgICAgICAgIHsweDAwMDAsICAxfSwgezB4MDAwMiwgIDJ9LCB7MHgwMDA2LCAgM30sIHsweDAwMUMsICA1fSwKKyAgICAgICAgezB4MDAxRCwgIDV9LCB7MHgwMDc4LCAgN30sIHsweDAwM0QsICA2fSwgezB4MDA3OSwgIDd9LAorICAgICAgICB7MHgwMDdDLCAgN30sIHsweDAwN0QsICA3fSwgezB4MDA3RSwgIDd9LCB7MHgwMDdGLCAgN30sCisgICAgfQorfTsKKyNkZWZpbmUgTUFYX09SX1ZMQ19CSVRTIDcKKworCitzdGF0aWMgY29uc3QgdWludDE2X3QgeDhfZGNfbG93cXVhbnRfdGFibGVbOF1bMzRdWzJdPXsKKyAgICB7Ly8wCisgICAgICAgIHsweDAwMDAsICA1fSwgezB4MDAwMSwgIDR9LCB7MHgwMDAxLCAgNX0sIHsweDAwMDQsICA1fSwKKyAgICAgICAgezB4MDAwNSwgIDV9LCB7MHgwMDA2LCAgNX0sIHsweDAwMEUsICA2fSwgezB4MDAwRiwgIDZ9LAorICAgICAgICB7MHgwMDQwLCAgOH0sIHsweDAwNDEsICA4fSwgezB4MDg0MCwgMTN9LCB7MHgwODQxLCAxM30sCisgICAgICAgIHsweDA4NDIsIDEzfSwgezB4MDg0MywgMTN9LCB7MHgwODQ0LCAxM30sIHsweDA4NDUsIDEzfSwKKyAgICAgICAgezB4MDg0NiwgMTN9LCB7MHgwMDAyLCAgMn0sIHsweDAwMDMsICAyfSwgezB4MDAwMywgIDN9LAorICAgICAgICB7MHgwMDA1LCAgNH0sIHsweDAwMDksICA1fSwgezB4MDAxMSwgIDZ9LCB7MHgwMDQzLCAgOH0sCisgICAgICAgIHsweDAwODUsICA5fSwgezB4MDg0NywgMTN9LCB7MHgwODQ4LCAxM30sIHsweDA4NDksIDEzfSwKKyAgICAgICAgezB4MDg0QSwgMTN9LCB7MHgwODRCLCAxM30sIHsweDA4NEMsIDEzfSwgezB4MDg0RCwgMTN9LAorICAgICAgICB7MHgwODRFLCAxM30sIHsweDA4NEYsIDEzfSwKKyAgICB9LHsvLzEKKyAgICAgICAgezB4MDAwMCwgIDR9LCB7MHgwMDAxLCAgM30sIHsweDAwMDIsICAzfSwgezB4MDAwMSwgIDR9LAorICAgICAgICB7MHgwMDA2LCAgNH0sIHsweDAwMDQsICAzfSwgezB4MDAwNywgIDR9LCB7MHgwMDA1LCAgM30sCisgICAgICAgIHsweDAwMEMsICA0fSwgezB4MDAwRCwgIDR9LCB7MHgwMDFDLCAgNX0sIHsweDAwM0EsICA2fSwKKyAgICAgICAgezB4MDFEOCwgIDl9LCB7MHgwMUQ5LCAgOX0sIHsweDFEQTAsIDEzfSwgezB4MURBMSwgMTN9LAorICAgICAgICB7MHgxREEyLCAxM30sIHsweDAwM0MsICA2fSwgezB4MDAzRCwgIDZ9LCB7MHgwMDNFLCAgNn0sCisgICAgICAgIHsweDAwNzcsICA3fSwgezB4MDFEQiwgIDl9LCB7MHgwMDdFLCAgN30sIHsweDAwRkUsICA4fSwKKyAgICAgICAgezB4MDFGRSwgIDl9LCB7MHgxREEzLCAxM30sIHsweDFEQTQsIDEzfSwgezB4MURBNSwgMTN9LAorICAgICAgICB7MHgwRUQzLCAxMn0sIHsweDBFRDQsIDEyfSwgezB4MDFGRiwgIDl9LCB7MHgwRUQ1LCAxMn0sCisgICAgICAgIHsweDBFRDYsIDEyfSwgezB4MEVENywgMTJ9LAorICAgIH0sey8vMgorICAgICAgICB7MHgwMDAwLCAgNH0sIHsweDAwMDEsICAzfSwgezB4MDAwMiwgIDN9LCB7MHgwMDAxLCAgNH0sCisgICAgICAgIHsweDAwMDYsICA0fSwgezB4MDAwNywgIDR9LCB7MHgwMDA4LCAgNH0sIHsweDAwMDksICA0fSwKKyAgICAgICAgezB4MDAyOCwgIDZ9LCB7MHgwMDI5LCAgNn0sIHsweDAwNTQsICA3fSwgezB4MDA1NSwgIDd9LAorICAgICAgICB7MHgwQUMwLCAxMn0sIHsweDBBQzEsIDEyfSwgezB4MEFDMiwgMTJ9LCB7MHgwQUMzLCAxMn0sCisgICAgICAgIHsweDBBQzQsIDEyfSwgezB4MDAwQiwgIDR9LCB7MHgwMDA2LCAgM30sIHsweDAwMEUsICA0fSwKKyAgICAgICAgezB4MDAxRSwgIDV9LCB7MHgwMDNFLCAgNn0sIHsweDAwM0YsICA2fSwgezB4MDA1NywgIDd9LAorICAgICAgICB7MHgwMEFELCAgOH0sIHsweDBBQzUsIDEyfSwgezB4MEFDNiwgMTJ9LCB7MHgwQUM3LCAxMn0sCisgICAgICAgIHsweDBBQzgsIDEyfSwgezB4MEFDOSwgMTJ9LCB7MHgwQUNBLCAxMn0sIHsweDBBQ0IsIDEyfSwKKyAgICAgICAgezB4MDU2NiwgMTF9LCB7MHgwNTY3LCAxMX0sCisgICAgfSx7Ly8zCisgICAgICAgIHsweDAwMDAsICA0fSwgezB4MDAwMSwgIDJ9LCB7MHgwMDAxLCAgM30sIHsweDAwMDQsICAzfSwKKyAgICAgICAgezB4MDAwNSwgIDN9LCB7MHgwMDA2LCAgM30sIHsweDAwMDEsICA0fSwgezB4MDAwRSwgIDR9LAorICAgICAgICB7MHgwMDNDLCAgNn0sIHsweDAwM0QsICA2fSwgezB4MDA3QywgIDd9LCB7MHgwMEZBLCAgOH0sCisgICAgICAgIHsweDNFQzAsIDE0fSwgezB4M0VDMSwgMTR9LCB7MHgzRUMyLCAxNH0sIHsweDNFQzMsIDE0fSwKKyAgICAgICAgezB4MUY2MiwgMTN9LCB7MHgwMUY3LCAgOX0sIHsweDAwN0UsICA3fSwgezB4MDBGRSwgIDh9LAorICAgICAgICB7MHgwMEZGLCAgOH0sIHsweDFGNjMsIDEzfSwgezB4MUY2NCwgMTN9LCB7MHgxRjY1LCAxM30sCisgICAgICAgIHsweDFGNjYsIDEzfSwgezB4MUY2NywgMTN9LCB7MHgxRjY4LCAxM30sIHsweDFGNjksIDEzfSwKKyAgICAgICAgezB4MUY2QSwgMTN9LCB7MHgxRjZCLCAxM30sIHsweDFGNkMsIDEzfSwgezB4MUY2RCwgMTN9LAorICAgICAgICB7MHgxRjZFLCAxM30sIHsweDFGNkYsIDEzfSwKKyAgICB9LHsvLzQKKyAgICAgICAgezB4MDAwMCwgIDd9LCB7MHgwMDAxLCAgN30sIHsweDAwMDIsICA3fSwgezB4MDAwMywgIDd9LAorICAgICAgICB7MHgwMDA0LCAgN30sIHsweDAwMDUsICA3fSwgezB4MDAwNiwgIDd9LCB7MHgwMDA3LCAgN30sCisgICAgICAgIHsweDAwMDgsICA3fSwgezB4MDAwOSwgIDd9LCB7MHgwMDBBLCAgN30sIHsweDAwMEIsICA3fSwKKyAgICAgICAgezB4MDAwQywgIDd9LCB7MHgwMDBELCAgN30sIHsweDAwMEUsICA3fSwgezB4MDAwRiwgIDd9LAorICAgICAgICB7MHgwMDEwLCAgN30sIHsweDAwMDEsICAxfSwgezB4MDAwMSwgIDJ9LCB7MHgwMDExLCAgN30sCisgICAgICAgIHsweDAwMTIsICA3fSwgezB4MDAxMywgIDd9LCB7MHgwMDE0LCAgN30sIHsweDAwMTUsICA3fSwKKyAgICAgICAgezB4MDAxNiwgIDd9LCB7MHgwMDE3LCAgN30sIHsweDAwMTgsICA3fSwgezB4MDAxOSwgIDd9LAorICAgICAgICB7MHgwMDFBLCAgN30sIHsweDAwMUIsICA3fSwgezB4MDAxQywgIDd9LCB7MHgwMDFELCAgN30sCisgICAgICAgIHsweDAwMUUsICA3fSwgezB4MDAxRiwgIDd9LAorICAgIH0sey8vNQorICAgICAgICB7MHgwMDAwLCAgNX0sIHsweDAwMDEsICA0fSwgezB4MDAwMSwgIDV9LCB7MHgwMDA4LCAgNn0sCisgICAgICAgIHsweDAwMDksICA2fSwgezB4MDAwQSwgIDZ9LCB7MHgwMDE2LCAgN30sIHsweDAwMEMsICA2fSwKKyAgICAgICAgezB4MDAxNywgIDd9LCB7MHgwMDBELCAgNn0sIHsweDAwMzgsICA4fSwgezB4MDAxRCwgIDd9LAorICAgICAgICB7MHgwMDM5LCAgOH0sIHsweDA3ODAsIDEzfSwgezB4MDc4MSwgMTN9LCB7MHgwNzgyLCAxM30sCisgICAgICAgIHsweDA3ODMsIDEzfSwgezB4MDAwMiwgIDN9LCB7MHgwMDAxLCAgMX0sIHsweDAwMDMsICAzfSwKKyAgICAgICAgezB4MDAxRiwgIDd9LCB7MHgwMDNELCAgOH0sIHsweDAwNzksICA5fSwgezB4MDc4NCwgMTN9LAorICAgICAgICB7MHgwNzg1LCAxM30sIHsweDA3ODYsIDEzfSwgezB4MDc4NywgMTN9LCB7MHgwNzg4LCAxM30sCisgICAgICAgIHsweDA3ODksIDEzfSwgezB4MDc4QSwgMTN9LCB7MHgwNzhCLCAxM30sIHsweDA3OEMsIDEzfSwKKyAgICAgICAgezB4MDc4RCwgMTN9LCB7MHgwM0M3LCAxMn0sCisgICAgfSx7Ly82CisgICAgICAgIHsweDAwMDAsICA0fSwgezB4MDAwMSwgIDJ9LCB7MHgwMDAxLCAgM30sIHsweDAwMDQsICAzfSwKKyAgICAgICAgezB4MDAwMSwgIDR9LCB7MHgwMDBBLCAgNH0sIHsweDAwMTYsICA1fSwgezB4MDAyRSwgIDZ9LAorICAgICAgICB7MHgwMDVFLCAgN30sIHsweDAwNUYsICA3fSwgezB4MDBDMCwgIDh9LCB7MHgzMDQwLCAxNH0sCisgICAgICAgIHsweDMwNDEsIDE0fSwgezB4MDMwNSwgMTB9LCB7MHgwMTgzLCAgOX0sIHsweDMwNDIsIDE0fSwKKyAgICAgICAgezB4MzA0MywgMTR9LCB7MHgwMDBELCAgNH0sIHsweDAwMDcsICAzfSwgezB4MDAxOSwgIDV9LAorICAgICAgICB7MHgwMDMxLCAgNn0sIHsweDAwQzIsICA4fSwgezB4MDBDMywgIDh9LCB7MHgzMDQ0LCAxNH0sCisgICAgICAgIHsweDMwNDUsIDE0fSwgezB4MzA0NiwgMTR9LCB7MHgzMDQ3LCAxNH0sIHsweDMwNDgsIDE0fSwKKyAgICAgICAgezB4MzA0OSwgMTR9LCB7MHgzMDRBLCAxNH0sIHsweDMwNEIsIDE0fSwgezB4MzA0QywgMTR9LAorICAgICAgICB7MHgzMDRELCAxNH0sIHsweDE4MjcsIDEzfSwKKyAgICB9LHsvLzcKKyAgICAgICAgezB4MDAwMCwgIDZ9LCB7MHgwMDAxLCAgNn0sIHsweDAwMDIsICA2fSwgezB4MDAwNiwgIDd9LAorICAgICAgICB7MHgwMDA3LCAgN30sIHsweDAwMDQsICA2fSwgezB4MDAwNSwgIDZ9LCB7MHgwMDA2LCAgNn0sCisgICAgICAgIHsweDAwMEUsICA3fSwgezB4MDAxRSwgIDh9LCB7MHgwMDFGLCAgOH0sIHsweDAwNDAsICA5fSwKKyAgICAgICAgezB4MDA4MiwgMTB9LCB7MHgwODMwLCAxNH0sIHsweDA4MzEsIDE0fSwgezB4MDgzMiwgMTR9LAorICAgICAgICB7MHgwODMzLCAxNH0sIHsweDAwMDEsICAxfSwgezB4MDAwMSwgIDJ9LCB7MHgwMDAzLCAgNH0sCisgICAgICAgIHsweDAwMDUsICA1fSwgezB4MDAwOSwgIDZ9LCB7MHgwMDExLCAgN30sIHsweDAwMjEsICA4fSwKKyAgICAgICAgezB4MDgzNCwgMTR9LCB7MHgwODM1LCAxNH0sIHsweDA4MzYsIDE0fSwgezB4MDgzNywgMTR9LAorICAgICAgICB7MHgwODM4LCAxNH0sIHsweDA4MzksIDE0fSwgezB4MDgzQSwgMTR9LCB7MHgwODNCLCAxNH0sCisgICAgICAgIHsweDA0MUUsIDEzfSwgezB4MDQxRiwgMTN9LAorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9kY19oaWdocXVhbnRfdGFibGVbOF1bMzRdWzJdPXsKKyAgICB7Ly8wCisgICAgICAgIHsweDAwMDAsICA1fSwgezB4MDAwMSwgIDR9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDEsICA1fSwKKyAgICAgICAgezB4MDAwNiwgIDV9LCB7MHgwMDA0LCAgNH0sIHsweDAwMDcsICA1fSwgezB4MDAwQSwgIDV9LAorICAgICAgICB7MHgwMDJDLCAgN30sIHsweDAwMkQsICA3fSwgezB4MDVDMCwgMTJ9LCB7MHgwNUMxLCAxMn0sCisgICAgICAgIHsweDA1QzIsIDEyfSwgezB4MDVDMywgMTJ9LCB7MHgwNUM0LCAxMn0sIHsweDA1QzUsIDEyfSwKKyAgICAgICAgezB4MDVDNiwgMTJ9LCB7MHgwMDAzLCAgM30sIHsweDAwMDIsICAyfSwgezB4MDAwNiwgIDN9LAorICAgICAgICB7MHgwMDBFLCAgNH0sIHsweDAwMUUsICA1fSwgezB4MDAxRiwgIDV9LCB7MHgwMDJGLCAgN30sCisgICAgICAgIHsweDAwNUQsICA4fSwgezB4MDVDNywgMTJ9LCB7MHgwNUM4LCAxMn0sIHsweDA1QzksIDEyfSwKKyAgICAgICAgezB4MDVDQSwgMTJ9LCB7MHgwNUNCLCAxMn0sIHsweDA1Q0MsIDEyfSwgezB4MDVDRCwgMTJ9LAorICAgICAgICB7MHgwNUNFLCAxMn0sIHsweDA1Q0YsIDEyfSwKKyAgICB9LHsvLzEKKyAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAxLCAgM30sIHsweDAwMDIsICAzfSwgezB4MDAwNiwgIDR9LAorICAgICAgICB7MHgwMDA3LCAgNH0sIHsweDAwMDQsICAzfSwgezB4MDAwQSwgIDR9LCB7MHgwMDBCLCAgNH0sCisgICAgICAgIHsweDAwMzAsICA2fSwgezB4MDA2MiwgIDd9LCB7MHgwMDYzLCAgN30sIHsweDA2NDAsIDExfSwKKyAgICAgICAgezB4MDY0MSwgMTF9LCB7MHgwNjQyLCAxMX0sIHsweDA2NDMsIDExfSwgezB4MDY0NCwgMTF9LAorICAgICAgICB7MHgwNjQ1LCAxMX0sIHsweDAwMzMsICA2fSwgezB4MDAwRCwgIDR9LCB7MHgwMDFDLCAgNX0sCisgICAgICAgIHsweDAwMUQsICA1fSwgezB4MDAzQywgIDZ9LCB7MHgwMDFGLCAgNX0sIHsweDAwNjUsICA3fSwKKyAgICAgICAgezB4MDA3QSwgIDd9LCB7MHgwNjQ2LCAxMX0sIHsweDAwN0IsICA3fSwgezB4MDY0NywgMTF9LAorICAgICAgICB7MHgwNjQ4LCAxMX0sIHsweDA2NDksIDExfSwgezB4MDY0QSwgMTF9LCB7MHgwNjRCLCAxMX0sCisgICAgICAgIHsweDAzMjYsIDEwfSwgezB4MDMyNywgMTB9LAorICAgIH0sey8vMgorICAgICAgICB7MHgwMDAwLCAgN30sIHsweDAwMDEsICA3fSwgezB4MDAwMSwgIDZ9LCB7MHgwMDA0LCAgN30sCisgICAgICAgIHsweDAwMDMsICA2fSwgezB4MDAwNSwgIDd9LCB7MHgwMDEwLCAgOH0sIHsweDAwMTEsICA4fSwKKyAgICAgICAgezB4MDI0MCwgMTN9LCB7MHgwMjQxLCAxM30sIHsweDAyNDIsIDEzfSwgezB4MDI0MywgMTN9LAorICAgICAgICB7MHgwMjQ0LCAxM30sIHsweDAyNDUsIDEzfSwgezB4MDI0NiwgMTN9LCB7MHgwMjQ3LCAxM30sCisgICAgICAgIHsweDAxMjQsIDEyfSwgezB4MDAwMSwgIDF9LCB7MHgwMDAxLCAgMn0sIHsweDAwMDEsICAzfSwKKyAgICAgICAgezB4MDAwMywgIDV9LCB7MHgwMDA1LCAgNn0sIHsweDAwMTMsICA4fSwgezB4MDEyNSwgMTJ9LAorICAgICAgICB7MHgwMTI2LCAxMn0sIHsweDAxMjcsIDEyfSwgezB4MDEyOCwgMTJ9LCB7MHgwMTI5LCAxMn0sCisgICAgICAgIHsweDAxMkEsIDEyfSwgezB4MDEyQiwgMTJ9LCB7MHgwMTJDLCAxMn0sIHsweDAxMkQsIDEyfSwKKyAgICAgICAgezB4MDEyRSwgMTJ9LCB7MHgwMTJGLCAxMn0sCisgICAgfSx7Ly8zCisgICAgICAgIHsweDAwMDAsICA0fSwgezB4MDAwMSwgIDN9LCB7MHgwMDAyLCAgM30sIHsweDAwMDEsICA0fSwKKyAgICAgICAgezB4MDAwNiwgIDR9LCB7MHgwMDA0LCAgM30sIHsweDAwMDUsICAzfSwgezB4MDAwNiwgIDN9LAorICAgICAgICB7MHgwMDBFLCAgNX0sIHsweDAwMEYsICA1fSwgezB4MDA3MCwgIDd9LCB7MHgwNzEwLCAxMX0sCisgICAgICAgIHsweDA3MTEsIDExfSwgezB4MDcxMiwgMTF9LCB7MHgwNzEzLCAxMX0sIHsweDA3MTQsIDExfSwKKyAgICAgICAgezB4MDcxNSwgMTF9LCB7MHgwMDFELCAgNX0sIHsweDAwNzIsICA3fSwgezB4MDAzQywgIDZ9LAorICAgICAgICB7MHgwMDNELCAgNn0sIHsweDAwNzMsICA3fSwgezB4MDA3QywgIDd9LCB7MHgwMDdELCAgN30sCisgICAgICAgIHsweDAwN0UsICA3fSwgezB4MDcxNiwgMTF9LCB7MHgwNzE3LCAxMX0sIHsweDA3MTgsIDExfSwKKyAgICAgICAgezB4MDA3RiwgIDd9LCB7MHgwNzE5LCAxMX0sIHsweDA3MUEsIDExfSwgezB4MDcxQiwgMTF9LAorICAgICAgICB7MHgwMzhFLCAxMH0sIHsweDAzOEYsIDEwfSwKKyAgICB9LHsvLzQKKyAgICAgICAgezB4MDAwMCwgIDh9LCB7MHgwMDAxLCAgN30sIHsweDAwMDIsICA3fSwgezB4MDAwMywgIDd9LAorICAgICAgICB7MHgwMDAyLCAgOX0sIHsweDAwMDgsICA4fSwgezB4MDAwMywgIDl9LCB7MHgwMjQwLCAxNH0sCisgICAgICAgIHsweDAyNDEsIDE0fSwgezB4MDI0MiwgMTR9LCB7MHgwMjQzLCAxNH0sIHsweDAyNDQsIDE0fSwKKyAgICAgICAgezB4MDI0NSwgMTR9LCB7MHgwMjQ2LCAxNH0sIHsweDAyNDcsIDE0fSwgezB4MDEyNCwgMTN9LAorICAgICAgICB7MHgwMTI1LCAxM30sIHsweDAwMDEsICAyfSwgezB4MDAwMSwgIDF9LCB7MHgwMDAxLCAgM30sCisgICAgICAgIHsweDAwMDEsICA0fSwgezB4MDAwMywgIDZ9LCB7MHgwMDA1LCAgN30sIHsweDAwMTMsICA5fSwKKyAgICAgICAgezB4MDEyNiwgMTN9LCB7MHgwMTI3LCAxM30sIHsweDAxMjgsIDEzfSwgezB4MDEyOSwgMTN9LAorICAgICAgICB7MHgwMTJBLCAxM30sIHsweDAxMkIsIDEzfSwgezB4MDEyQywgMTN9LCB7MHgwMTJELCAxM30sCisgICAgICAgIHsweDAxMkUsIDEzfSwgezB4MDEyRiwgMTN9LAorICAgIH0sey8vNQorICAgICAgICB7MHgwMDAwLCAgN30sIHsweDAwMDEsICA3fSwgezB4MDAwMSwgIDZ9LCB7MHgwMDAyLCAgNn0sCisgICAgICAgIHsweDAwMDMsICA2fSwgezB4MDAwNCwgIDZ9LCB7MHgwMDA1LCAgNn0sIHsweDAwMDYsICA2fSwKKyAgICAgICAgezB4MDAwNywgIDZ9LCB7MHgwMDA4LCAgNn0sIHsweDAwMDksICA2fSwgezB4MDAwQSwgIDZ9LAorICAgICAgICB7MHgwMDBCLCAgNn0sIHsweDAwMEMsICA2fSwgezB4MDAwRCwgIDZ9LCB7MHgwMDBFLCAgNn0sCisgICAgICAgIHsweDAwMEYsICA2fSwgezB4MDAxMCwgIDZ9LCB7MHgwMDExLCAgNn0sIHsweDAwMTIsICA2fSwKKyAgICAgICAgezB4MDAxMywgIDZ9LCB7MHgwMDE0LCAgNn0sIHsweDAwMTUsICA2fSwgezB4MDAxNiwgIDZ9LAorICAgICAgICB7MHgwMDE3LCAgNn0sIHsweDAwMTgsICA2fSwgezB4MDAxOSwgIDZ9LCB7MHgwMDAxLCAgMX0sCisgICAgICAgIHsweDAwMUEsICA2fSwgezB4MDAxQiwgIDZ9LCB7MHgwMDFDLCAgNn0sIHsweDAwMUQsICA2fSwKKyAgICAgICAgezB4MDAxRSwgIDZ9LCB7MHgwMDFGLCAgNn0sCisgICAgfSx7Ly82CisgICAgICAgIHsweDAwMDAsICA1fSwgezB4MDAwMSwgIDR9LCB7MHgwMDAxLCAgNX0sIHsweDAwMDQsICA1fSwKKyAgICAgICAgezB4MDAwQSwgIDZ9LCB7MHgwMDA2LCAgNX0sIHsweDAwMEIsICA2fSwgezB4MDAwRSwgIDZ9LAorICAgICAgICB7MHgwMDNDLCAgOH0sIHsweDAwM0QsICA4fSwgezB4MDdDMCwgMTN9LCB7MHgwN0MxLCAxM30sCisgICAgICAgIHsweDA3QzIsIDEzfSwgezB4MDdDMywgMTN9LCB7MHgwN0M0LCAxM30sIHsweDA3QzUsIDEzfSwKKyAgICAgICAgezB4MDdDNiwgMTN9LCB7MHgwMDAxLCAgMn0sIHsweDAwMDIsICAyfSwgezB4MDAwNiwgIDN9LAorICAgICAgICB7MHgwMDBFLCAgNH0sIHsweDAwMUUsICA1fSwgezB4MDAxRiwgIDV9LCB7MHgwMDNGLCAgOH0sCisgICAgICAgIHsweDAwN0QsICA5fSwgezB4MDdDNywgMTN9LCB7MHgwN0M4LCAxM30sIHsweDA3QzksIDEzfSwKKyAgICAgICAgezB4MDdDQSwgMTN9LCB7MHgwN0NCLCAxM30sIHsweDA3Q0MsIDEzfSwgezB4MDdDRCwgMTN9LAorICAgICAgICB7MHgwN0NFLCAxM30sIHsweDA3Q0YsIDEzfSwKKyAgICB9LHsvLzcKKyAgICAgICAgezB4MDAwMCwgIDd9LCB7MHgwMDAxLCAgN30sIHsweDAwMDIsICA3fSwgezB4MDAwMywgIDd9LAorICAgICAgICB7MHgwMDA0LCAgN30sIHsweDAwMDUsICA3fSwgezB4MDAwNiwgIDd9LCB7MHgwMDA3LCAgN30sCisgICAgICAgIHsweDAwMDgsICA3fSwgezB4MDAwOSwgIDd9LCB7MHgwMDBBLCAgN30sIHsweDAwMEIsICA3fSwKKyAgICAgICAgezB4MDAwQywgIDd9LCB7MHgwMDBELCAgN30sIHsweDAwMEUsICA3fSwgezB4MDAwRiwgIDd9LAorICAgICAgICB7MHgwMDEwLCAgN30sIHsweDAwMDEsICAxfSwgezB4MDAwMSwgIDJ9LCB7MHgwMDExLCAgN30sCisgICAgICAgIHsweDAwMTIsICA3fSwgezB4MDAxMywgIDd9LCB7MHgwMDE0LCAgN30sIHsweDAwMTUsICA3fSwKKyAgICAgICAgezB4MDAxNiwgIDd9LCB7MHgwMDE3LCAgN30sIHsweDAwMTgsICA3fSwgezB4MDAxOSwgIDd9LAorICAgICAgICB7MHgwMDFBLCAgN30sIHsweDAwMUIsICA3fSwgezB4MDAxQywgIDd9LCB7MHgwMDFELCAgN30sCisgICAgICAgIHsweDAwMUUsICA3fSwgezB4MDAxRiwgIDd9LAorICAgIH0KK307CisjZGVmaW5lIE1BWF9EQ19WTENfQklUUyAxNAorCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9hYzBfbG93cXVhbnRfdGFibGVbOF1bNzddWzJdPXsKKyAgICB7Ly8wCisgICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwMiwgIDN9LCB7MHgwMDA2LCAgNH0sIHsweDAwMEUsICA1fSwKKyAgICAgICAgezB4MDAxRSwgIDZ9LCB7MHgwMDNFLCAgN30sIHsweDAwM0YsICA3fSwgezB4MDA0MCwgIDd9LAorICAgICAgICB7MHgwMTA0LCAgOX0sIHsweDAwODMsICA4fSwgezB4MDA4NCwgIDh9LCB7MHgwMDg1LCAgOH0sCisgICAgICAgIHsweDAyMEEsIDEwfSwgezB4MDIwQiwgMTB9LCB7MHgwMjE4LCAxMH0sIHsweDAyMTksIDEwfSwKKyAgICAgICAgezB4MDAwOSwgIDR9LCB7MHgwMDQ0LCAgN30sIHsweDAxMEQsICA5fSwgezB4MDIxQywgMTB9LAorICAgICAgICB7MHgwMDIzLCAgNn0sIHsweDAwNDUsICA3fSwgezB4MDA1MCwgIDd9LCB7MHgwMDBCLCAgNH0sCisgICAgICAgIHsweDAwMEMsICA0fSwgezB4MDAxNSwgIDV9LCB7MHgwMDFBLCAgNX0sIHsweDAwMUIsICA1fSwKKyAgICAgICAgezB4MDAyOSwgIDZ9LCB7MHgwMDM4LCAgNn0sIHsweDAwMzksICA2fSwgezB4MDAzQSwgIDZ9LAorICAgICAgICB7MHgwMDUxLCAgN30sIHsweDAwNzYsICA3fSwgezB4MDA3NywgIDd9LCB7MHgwMDc4LCAgN30sCisgICAgICAgIHsweDAwNzksICA3fSwgezB4MDA3QSwgIDd9LCB7MHgwMDdCLCAgN30sIHsweDAwRjgsICA4fSwKKyAgICAgICAgezB4MDEwRiwgIDl9LCB7MHgwMjFELCAxMH0sIHsweDNFNDAsIDE0fSwgezB4M0U0MSwgMTR9LAorICAgICAgICB7MHgzRTQyLCAxNH0sIHsweDNFNDMsIDE0fSwgezB4MDNFNSwgMTB9LCB7MHgzRTQ0LCAxNH0sCisgICAgICAgIHsweDAxRjMsICA5fSwgezB4M0U0NSwgMTR9LCB7MHgzRTQ2LCAxNH0sIHsweDNFNDcsIDE0fSwKKyAgICAgICAgezB4MDBGQSwgIDh9LCB7MHgzRTQ4LCAxNH0sIHsweDNFNDksIDE0fSwgezB4M0U0QSwgMTR9LAorICAgICAgICB7MHgzRTRCLCAxNH0sIHsweDAzRUMsIDEwfSwgezB4M0U0QywgMTR9LCB7MHgwMDdFLCAgN30sCisgICAgICAgIHsweDAwRkUsICA4fSwgezB4MDBGRiwgIDh9LCB7MHgwMUY3LCAgOX0sIHsweDNFNEQsIDE0fSwKKyAgICAgICAgezB4M0U0RSwgMTR9LCB7MHgzRTRGLCAxNH0sIHsweDNFRDAsIDE0fSwgezB4M0VEMSwgMTR9LAorICAgICAgICB7MHgzRUQyLCAxNH0sIHsweDNFRDMsIDE0fSwgezB4M0VENCwgMTR9LCB7MHgzRUQ1LCAxNH0sCisgICAgICAgIHsweDFGNkIsIDEzfSwgezB4MUY2QywgMTN9LCB7MHgxRjZELCAxM30sIHsweDFGNkUsIDEzfSwKKyAgICAgICAgezB4MUY2RiwgMTN9LAorICAgIH0sey8vMQorICAgICAgICB7MHgwMDAwLCAgM30sIHsweDAwMDQsICA1fSwgezB4MDAxNCwgIDd9LCB7MHgwMDBCLCAgNn0sCisgICAgICAgIHsweDAwMEMsICA2fSwgezB4MDAyQSwgIDh9LCB7MHgwMDJCLCAgOH0sIHsweDAwMzQsICA4fSwKKyAgICAgICAgezB4MEQ0MCwgMTR9LCB7MHgwRDQxLCAxNH0sIHsweDAwMUIsICA3fSwgezB4MEQ0MiwgMTR9LAorICAgICAgICB7MHgwRDQzLCAxNH0sIHsweDBENDQsIDE0fSwgezB4MEQ0NSwgMTR9LCB7MHgwRDQ2LCAxNH0sCisgICAgICAgIHsweDAwMEUsICA2fSwgezB4MDAzQywgIDh9LCB7MHgwRDQ3LCAxNH0sIHsweDAwM0QsICA4fSwKKyAgICAgICAgezB4MEQ0OCwgMTR9LCB7MHgwRDQ5LCAxNH0sIHsweDBENEEsIDE0fSwgezB4MDAwMSwgIDJ9LAorICAgICAgICB7MHgwMDA0LCAgM30sIHsweDAwMTQsICA1fSwgezB4MDAwQiwgIDR9LCB7MHgwMDBDLCAgNH0sCisgICAgICAgIHsweDAwMEQsICA0fSwgezB4MDAyQSwgIDZ9LCB7MHgwMDFGLCAgN30sIHsweDAwNTYsICA3fSwKKyAgICAgICAgezB4MDA1NywgIDd9LCB7MHgwMDcwLCAgN30sIHsweDAwRTIsICA4fSwgezB4MDA3MiwgIDd9LAorICAgICAgICB7MHgwMDNBLCAgNn0sIHsweDAwM0IsICA2fSwgezB4MDAzQywgIDZ9LCB7MHgwMDNELCAgNn0sCisgICAgICAgIHsweDAwRTMsICA4fSwgezB4MEQ0QiwgMTR9LCB7MHgwMEU2LCAgOH0sIHsweDAwRTcsICA4fSwKKyAgICAgICAgezB4MDBGOCwgIDh9LCB7MHgwRDRDLCAxNH0sIHsweDBENEQsIDE0fSwgezB4MEQ0RSwgMTR9LAorICAgICAgICB7MHgwMEY5LCAgOH0sIHsweDBENEYsIDE0fSwgezB4MEQ1MCwgMTR9LCB7MHgwRDUxLCAxNH0sCisgICAgICAgIHsweDA2QTksIDEzfSwgezB4MDZBQSwgMTN9LCB7MHgwNkFCLCAxM30sIHsweDA2QUMsIDEzfSwKKyAgICAgICAgezB4MDZBRCwgMTN9LCB7MHgwNkFFLCAxM30sIHsweDA2QUYsIDEzfSwgezB4MDAzRiwgIDZ9LAorICAgICAgICB7MHgwNkIwLCAxM30sIHsweDA2QjEsIDEzfSwgezB4MDZCMiwgMTN9LCB7MHgwNkIzLCAxM30sCisgICAgICAgIHsweDA2QjQsIDEzfSwgezB4MDA3RCwgIDd9LCB7MHgwNkI1LCAxM30sIHsweDA2QjYsIDEzfSwKKyAgICAgICAgezB4MDZCNywgMTN9LCB7MHgwNkI4LCAxM30sIHsweDA2QjksIDEzfSwgezB4MDZCQSwgMTN9LAorICAgICAgICB7MHgwNkJCLCAxM30sIHsweDA2QkMsIDEzfSwgezB4MDZCRCwgMTN9LCB7MHgwNkJFLCAxM30sCisgICAgICAgIHsweDA2QkYsIDEzfSwKKyAgICB9LHsvLzIKKyAgICAgICAgezB4MDAwMCwgIDJ9LCB7MHgwMDAyLCAgM30sIHsweDAwMDMsICAzfSwgezB4MDAwOCwgIDR9LAorICAgICAgICB7MHgwMDEyLCAgNX0sIHsweDAwMTMsICA1fSwgezB4MDAyOCwgIDZ9LCB7MHgwMDI5LCAgNn0sCisgICAgICAgIHsweDAwNTQsICA3fSwgezB4MDA1NSwgIDd9LCB7MHgwMDU2LCAgN30sIHsweDAwQUUsICA4fSwKKyAgICAgICAgezB4MDBBRiwgIDh9LCB7MHgwMEIwLCAgOH0sIHsweDAxNjIsICA5fSwgezB4MDJDNiwgMTB9LAorICAgICAgICB7MHgwMDBDLCAgNH0sIHsweDAwMkQsICA2fSwgezB4MDBCMiwgIDh9LCB7MHgwMTY2LCAgOX0sCisgICAgICAgIHsweDAwMkUsICA2fSwgezB4MDE2NywgIDl9LCB7MHgwMEJDLCAgOH0sIHsweDAwMUEsICA1fSwKKyAgICAgICAgezB4MDAzNiwgIDZ9LCB7MHgwMDM3LCAgNn0sIHsweDAwMzgsICA2fSwgezB4MDA1RiwgIDd9LAorICAgICAgICB7MHgwMDcyLCAgN30sIHsweDAwNzMsICA3fSwgezB4MDA3NCwgIDd9LCB7MHgwMDc1LCAgN30sCisgICAgICAgIHsweDAwNzYsICA3fSwgezB4MDA3NywgIDd9LCB7MHgwMDc4LCAgN30sIHsweDAwNzksICA3fSwKKyAgICAgICAgezB4MDA3QSwgIDd9LCB7MHgwMDdCLCAgN30sIHsweDAwQkQsICA4fSwgezB4QjFDMCwgMTZ9LAorICAgICAgICB7MHhCMUMxLCAxNn0sIHsweDU4RTEsIDE1fSwgezB4MEIxRCwgMTJ9LCB7MHg1OEUyLCAxNX0sCisgICAgICAgIHsweDU4RTMsIDE1fSwgezB4NThFNCwgMTV9LCB7MHgwMEY4LCAgOH0sIHsweDAzRTQsIDEwfSwKKyAgICAgICAgezB4MDFGMywgIDl9LCB7MHgwQjFFLCAxMn0sIHsweDU4RTUsIDE1fSwgezB4NThFNiwgMTV9LAorICAgICAgICB7MHgwMEZBLCAgOH0sIHsweDU4RTcsIDE1fSwgezB4NThGOCwgMTV9LCB7MHg1OEY5LCAxNX0sCisgICAgICAgIHsweDU4RkEsIDE1fSwgezB4MDFGNiwgIDl9LCB7MHg1OEZCLCAxNX0sIHsweDAwN0UsICA3fSwKKyAgICAgICAgezB4MDBGRSwgIDh9LCB7MHgwMEZGLCAgOH0sIHsweDA3Q0EsIDExfSwgezB4MEY5NiwgMTJ9LAorICAgICAgICB7MHg1OEZDLCAxNX0sIHsweDU4RkQsIDE1fSwgezB4NThGRSwgMTV9LCB7MHg1OEZGLCAxNX0sCisgICAgICAgIHsweDdDQjgsIDE1fSwgezB4N0NCOSwgMTV9LCB7MHg3Q0JBLCAxNX0sIHsweDdDQkIsIDE1fSwKKyAgICAgICAgezB4N0NCQywgMTV9LCB7MHgwMUY3LCAgOX0sIHsweDdDQkQsIDE1fSwgezB4N0NCRSwgMTV9LAorICAgICAgICB7MHg3Q0JGLCAxNX0sCisgICAgfSx7Ly8zCisgICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwMiwgIDN9LCB7MHgwMDA2LCAgNH0sIHsweDAwMEUsICA1fSwKKyAgICAgICAgezB4MDAwRiwgIDV9LCB7MHgwMDIwLCAgNn0sIHsweDAwMjEsICA2fSwgezB4MDA0NCwgIDd9LAorICAgICAgICB7MHgwMDQ1LCAgN30sIHsweDAwOEMsICA4fSwgezB4MDA4RCwgIDh9LCB7MHgwMTFDLCAgOX0sCisgICAgICAgIHsweDAxMUQsICA5fSwgezB4MDExRSwgIDl9LCB7MHgwMjNFLCAxMH0sIHsweDAyM0YsIDEwfSwKKyAgICAgICAgezB4MDAwNSwgIDN9LCB7MHgwMDEyLCAgNX0sIHsweDAwNEMsICA3fSwgezB4MDA0RCwgIDd9LAorICAgICAgICB7MHgwMDBDLCAgNH0sIHsweDAwNEUsICA3fSwgezB4MDAxQSwgIDV9LCB7MHgwMDM2LCAgNn0sCisgICAgICAgIHsweDAwNEYsICA3fSwgezB4MDA2RSwgIDd9LCB7MHgwMDZGLCAgN30sIHsweDAwRTAsICA4fSwKKyAgICAgICAgezB4MDBFMSwgIDh9LCB7MHgwMEUyLCAgOH0sIHsweDAwRTMsICA4fSwgezB4MDBFNCwgIDh9LAorICAgICAgICB7MHgwMEU1LCAgOH0sIHsweDAxQ0MsICA5fSwgezB4MDBFNywgIDh9LCB7MHgwMEU4LCAgOH0sCisgICAgICAgIHsweDAwRTksICA4fSwgezB4MDFDRCwgIDl9LCB7MHgwNzUwLCAxMX0sIHsweDAzQTksIDEwfSwKKyAgICAgICAgezB4MDc1MSwgMTF9LCB7MHg3NTQwLCAxNX0sIHsweDAzQUIsIDEwfSwgezB4NzU0MSwgMTV9LAorICAgICAgICB7MHg3NTQyLCAxNX0sIHsweDc1NDMsIDE1fSwgezB4MDFENiwgIDl9LCB7MHgwNzU1LCAxMX0sCisgICAgICAgIHsweDAwNzYsICA3fSwgezB4MEVBOSwgMTJ9LCB7MHg3NTQ0LCAxNX0sIHsweDc1NDUsIDE1fSwKKyAgICAgICAgezB4MDAxRSwgIDV9LCB7MHgwMDc3LCAgN30sIHsweDAwRjgsICA4fSwgezB4MDNBRSwgMTB9LAorICAgICAgICB7MHgwNzVFLCAxMX0sIHsweDAwN0QsICA3fSwgezB4MDNFNCwgMTB9LCB7MHgwMEZDLCAgOH0sCisgICAgICAgIHsweDAwRkQsICA4fSwgezB4MDNFNSwgMTB9LCB7MHgwM0U2LCAxMH0sIHsweDBFQkUsIDEyfSwKKyAgICAgICAgezB4NzU0NiwgMTV9LCB7MHgwN0NFLCAxMX0sIHsweDc1NDcsIDE1fSwgezB4NzVGOCwgMTV9LAorICAgICAgICB7MHg3NUY5LCAxNX0sIHsweDc1RkEsIDE1fSwgezB4NzVGQiwgMTV9LCB7MHg3NUZDLCAxNX0sCisgICAgICAgIHsweDc1RkQsIDE1fSwgezB4MDA3RiwgIDd9LCB7MHgzQUZGLCAxNH0sIHsweDBGOUUsIDEyfSwKKyAgICAgICAgezB4MEY5RiwgMTJ9LAorICAgIH0sey8vNAorICAgICAgICB7MHgwMDAwLCAgM30sIHsweDAwMDIsICA0fSwgezB4MDAwMywgIDR9LCB7MHgwMDA4LCAgNX0sCisgICAgICAgIHsweDAwMTIsICA2fSwgezB4MDAxMywgIDZ9LCB7MHgwMDE0LCAgNn0sIHsweDAwMkEsICA3fSwKKyAgICAgICAgezB4MDAxNiwgIDZ9LCB7MHgwMDJCLCAgN30sIHsweDAwNUMsICA4fSwgezB4MDA1RCwgIDh9LAorICAgICAgICB7MHgwMDVFLCAgOH0sIHsweDAwQkUsICA5fSwgezB4MDBCRiwgIDl9LCB7MHgwMDYwLCAgOH0sCisgICAgICAgIHsweDAwMDcsICA0fSwgezB4MDAwRCwgIDV9LCB7MHgwMDE5LCAgNn0sIHsweDAwMjAsICA2fSwKKyAgICAgICAgezB4MDAwOSwgIDR9LCB7MHgwMDIxLCAgNn0sIHsweDAwMTEsICA1fSwgezB4MDAxNCwgIDV9LAorICAgICAgICB7MHgwMDJBLCAgNn0sIHsweDAwMkIsICA2fSwgezB4MDAyQywgIDZ9LCB7MHgwMDJELCAgNn0sCisgICAgICAgIHsweDAwMkUsICA2fSwgezB4MDAyRiwgIDZ9LCB7MHgwMDMwLCAgNn0sIHsweDAwMzEsICA3fSwKKyAgICAgICAgezB4MDA2MiwgIDd9LCB7MHgwMDYzLCAgN30sIHsweDAwNjQsICA3fSwgezB4MDA2NSwgIDd9LAorICAgICAgICB7MHgwMDY2LCAgN30sIHsweDAwNjEsICA4fSwgezB4MDY3MCwgMTF9LCB7MHgwMDY4LCAgN30sCisgICAgICAgIHsweDAwNjksICA3fSwgezB4MDBDRiwgIDh9LCB7MHgwMTlELCAgOX0sIHsweDAxQTgsICA5fSwKKyAgICAgICAgezB4MDFBOSwgIDl9LCB7MHgwMzM5LCAxMH0sIHsweDAxQUEsICA5fSwgezB4MDM1NiwgMTB9LAorICAgICAgICB7MHgwMDM2LCAgNn0sIHsweDAwRDYsICA4fSwgezB4NjcxMCwgMTV9LCB7MHg2NzExLCAxNX0sCisgICAgICAgIHsweDAwMEUsICA0fSwgezB4MDA2RSwgIDd9LCB7MHgwMUFFLCAgOX0sIHsweDY3MTIsIDE1fSwKKyAgICAgICAgezB4NjcxMywgMTV9LCB7MHgwMDNDLCAgNn0sIHsweDAzNTcsIDEwfSwgezB4MDA2RiwgIDd9LAorICAgICAgICB7MHgwMEY0LCAgOH0sIHsweDAwRjUsICA4fSwgezB4MDM1RSwgMTB9LCB7MHgwMUVDLCAgOX0sCisgICAgICAgIHsweDY3MTQsIDE1fSwgezB4MDFFRCwgIDl9LCB7MHgwMzVGLCAxMH0sIHsweDAzREMsIDEwfSwKKyAgICAgICAgezB4MDNERCwgMTB9LCB7MHg2NzE1LCAxNX0sIHsweDMzOEIsIDE0fSwgezB4MzM4QywgMTR9LAorICAgICAgICB7MHgzMzhELCAxNH0sIHsweDAwMUYsICA1fSwgezB4MDFFRiwgIDl9LCB7MHgzMzhFLCAxNH0sCisgICAgICAgIHsweDMzOEYsIDE0fSwKKyAgICB9LHsvLzUKKyAgICAgICAgezB4MDAwMCwgIDJ9LCB7MHgwMDA0LCAgNH0sIHsweDAwMEEsICA1fSwgezB4MDAwQiwgIDV9LAorICAgICAgICB7MHgwMDE4LCAgNn0sIHsweDAwMTksICA2fSwgezB4MDAzNCwgIDd9LCB7MHgwMDZBLCAgOH0sCisgICAgICAgIHsweDAwNkIsICA4fSwgezB4MDA2QywgIDh9LCB7MHgwMERBLCAgOX0sIHsweDAzNkMsIDExfSwKKyAgICAgICAgezB4MDA2RSwgIDh9LCB7MHgwMUI3LCAxMH0sIHsweDAzNkQsIDExfSwgezB4Mzc4MCwgMTV9LAorICAgICAgICB7MHgwMDA0LCAgM30sIHsweDAwMEUsICA1fSwgezB4MDAxRSwgIDZ9LCB7MHgwMDNFLCAgN30sCisgICAgICAgIHsweDAwMEEsICA0fSwgezB4MDAyQywgIDZ9LCB7MHgwMDE3LCAgNX0sIHsweDAwMkQsICA2fSwKKyAgICAgICAgezB4MDAzRiwgIDd9LCB7MHgwMEMwLCAgOH0sIHsweDAwNjEsICA3fSwgezB4MDBDMSwgIDh9LAorICAgICAgICB7MHgwMDYyLCAgN30sIHsweDAwQzYsICA4fSwgezB4MDA2NCwgIDd9LCB7MHgwMEM3LCAgOH0sCisgICAgICAgIHsweDAwQ0EsICA4fSwgezB4MDBERiwgIDl9LCB7MHgwMTk2LCAgOX0sIHsweDAxOTcsICA5fSwKKyAgICAgICAgezB4MDE5OCwgIDl9LCB7MHgwMTk5LCAgOX0sIHsweDAzNzksIDExfSwgezB4MDE5QSwgIDl9LAorICAgICAgICB7MHgwMUJELCAxMH0sIHsweDA2NkMsIDExfSwgezB4Mzc4MSwgMTV9LCB7MHgwMzM3LCAxMH0sCisgICAgICAgIHsweDA2NkQsIDExfSwgezB4MDY3MCwgMTF9LCB7MHgwMzM5LCAxMH0sIHsweDA2NzEsIDExfSwKKyAgICAgICAgezB4MDAzNCwgIDZ9LCB7MHgwMENGLCAgOH0sIHsweDM3ODIsIDE1fSwgezB4Mzc4MywgMTV9LAorICAgICAgICB7MHgwMDBFLCAgNH0sIHsweDAwMUIsICA1fSwgezB4MDA2QSwgIDd9LCB7MHgwMDZCLCAgN30sCisgICAgICAgIHsweDAxOUQsICA5fSwgezB4MDAzQywgIDZ9LCB7MHgwMEY0LCAgOH0sIHsweDAwRjUsICA4fSwKKyAgICAgICAgezB4MDNEOCwgMTB9LCB7MHgwN0IyLCAxMX0sIHsweDM3ODQsIDE1fSwgezB4MDNEQSwgMTB9LAorICAgICAgICB7MHgzNzg1LCAxNX0sIHsweDAzREIsIDEwfSwgezB4MDNEQywgMTB9LCB7MHgzNzg2LCAxNX0sCisgICAgICAgIHsweDM3ODcsIDE1fSwgezB4MUJDNCwgMTR9LCB7MHgxQkM1LCAxNH0sIHsweDFCQzYsIDE0fSwKKyAgICAgICAgezB4MUJDNywgMTR9LCB7MHgwMDFGLCAgNX0sIHsweDAzREQsIDEwfSwgezB4MDdCMywgMTF9LAorICAgICAgICB7MHgwMUVGLCAgOX0sCisgICAgfSx7Ly82CisgICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwNCwgIDR9LCB7MHgwMDBBLCAgNX0sIHsweDAwMTYsICA2fSwKKyAgICAgICAgezB4MDAxNywgIDZ9LCB7MHgwMDYwLCAgOH0sIHsweDAwQzIsICA5fSwgezB4MDE4NiwgMTB9LAorICAgICAgICB7MHgwMTg3LCAxMH0sIHsweDAwQzQsICA5fSwgezB4MzE0MCwgMTV9LCB7MHgzMTQxLCAxNX0sCisgICAgICAgIHsweDAxOEIsIDEwfSwgezB4MzE0MiwgMTV9LCB7MHgwMThDLCAxMH0sIHsweDMxNDMsIDE1fSwKKyAgICAgICAgezB4MDAwNywgIDR9LCB7MHgwMDBELCAgNX0sIHsweDAwNjQsICA4fSwgezB4MDA2NSwgIDh9LAorICAgICAgICB7MHgwMDEwLCAgNX0sIHsweDAwQzcsICA5fSwgezB4MDA2NiwgIDh9LCB7MHgwMDA1LCAgM30sCisgICAgICAgIHsweDAwMDYsICAzfSwgezB4MDAwOSwgIDR9LCB7MHgwMDExLCAgNX0sIHsweDAwMzgsICA2fSwKKyAgICAgICAgezB4MDAzOSwgIDZ9LCB7MHgwMDc0LCAgN30sIHsweDAwNzUsICA3fSwgezB4MDA3NiwgIDd9LAorICAgICAgICB7MHgwMDY3LCAgOH0sIHsweDAwRUUsICA4fSwgezB4MDFERSwgIDl9LCB7MHgwMEYwLCAgOH0sCisgICAgICAgIHsweDAxOEQsIDEwfSwgezB4MzE0NCwgMTV9LCB7MHgwMURGLCAgOX0sIHsweDAwM0QsICA2fSwKKyAgICAgICAgezB4MDAzRSwgIDZ9LCB7MHgwMUUyLCAgOX0sIHsweDAzQzYsIDEwfSwgezB4MDBGMiwgIDh9LAorICAgICAgICB7MHgwMEYzLCAgOH0sIHsweDAzQzcsIDEwfSwgezB4MzE0NSwgMTV9LCB7MHgzMTQ2LCAxNX0sCisgICAgICAgIHsweDAxRjgsICA5fSwgezB4MzE0NywgMTV9LCB7MHgzMTQ4LCAxNX0sIHsweDMxNDksIDE1fSwKKyAgICAgICAgezB4MDBGRCwgIDh9LCB7MHgzMTRBLCAxNX0sIHsweDMxNEIsIDE1fSwgezB4MzE0QywgMTV9LAorICAgICAgICB7MHgzMTRELCAxNX0sIHsweDAxRjksICA5fSwgezB4MzE0RSwgMTV9LCB7MHgwMUZDLCAgOX0sCisgICAgICAgIHsweDMxNEYsIDE1fSwgezB4MzE1MCwgMTV9LCB7MHgzMTUxLCAxNX0sIHsweDMxNTIsIDE1fSwKKyAgICAgICAgezB4MzE1MywgMTV9LCB7MHgwM0ZBLCAxMH0sIHsweDAzRkIsIDEwfSwgezB4MzE1NCwgMTV9LAorICAgICAgICB7MHgzMTU1LCAxNX0sIHsweDMxNTYsIDE1fSwgezB4MzE1NywgMTV9LCB7MHgzMTU4LCAxNX0sCisgICAgICAgIHsweDMxNTksIDE1fSwgezB4MDBGRiwgIDh9LCB7MHgxOEFELCAxNH0sIHsweDE4QUUsIDE0fSwKKyAgICAgICAgezB4MThBRiwgMTR9LAorICAgIH0sey8vNworICAgICAgICB7MHgwMDAwLCAgNH0sIHsweDAwODAsIDExfSwgezB4MDA4MSwgMTF9LCB7MHgwMDgyLCAxMX0sCisgICAgICAgIHsweDAwODMsIDExfSwgezB4MDA4NCwgMTF9LCB7MHgwMDg1LCAxMX0sIHsweDAwODYsIDExfSwKKyAgICAgICAgezB4MDA4NywgMTF9LCB7MHgwMDg4LCAxMX0sIHsweDAwODksIDExfSwgezB4MDA4QSwgMTF9LAorICAgICAgICB7MHgwMDhCLCAxMX0sIHsweDAwOEMsIDExfSwgezB4MDA4RCwgMTF9LCB7MHgwMDhFLCAxMX0sCisgICAgICAgIHsweDAwOEYsIDExfSwgezB4MDA0OCwgMTB9LCB7MHgwMDQ5LCAxMH0sIHsweDAwNEEsIDEwfSwKKyAgICAgICAgezB4MDA0QiwgMTB9LCB7MHgwMDRDLCAxMH0sIHsweDAwNEQsIDEwfSwgezB4MDAwMSwgIDF9LAorICAgICAgICB7MHgwMDAxLCAgMn0sIHsweDAwNEUsIDEwfSwgezB4MDAwMiwgIDR9LCB7MHgwMDAzLCAgNH0sCisgICAgICAgIHsweDAwNEYsIDEwfSwgezB4MDA1MCwgMTB9LCB7MHgwMDUxLCAxMH0sIHsweDAwNTIsIDEwfSwKKyAgICAgICAgezB4MDA1MywgMTB9LCB7MHgwMDU0LCAxMH0sIHsweDAwNTUsIDEwfSwgezB4MDA1NiwgMTB9LAorICAgICAgICB7MHgwMDU3LCAxMH0sIHsweDAwNTgsIDEwfSwgezB4MDA1OSwgMTB9LCB7MHgwMDVBLCAxMH0sCisgICAgICAgIHsweDAwNUIsIDEwfSwgezB4MDA1QywgMTB9LCB7MHgwMDVELCAxMH0sIHsweDAwNUUsIDEwfSwKKyAgICAgICAgezB4MDA1RiwgMTB9LCB7MHgwMDYwLCAxMH0sIHsweDAwNjEsIDEwfSwgezB4MDA2MiwgMTB9LAorICAgICAgICB7MHgwMDYzLCAxMH0sIHsweDAwNjQsIDEwfSwgezB4MDA2NSwgMTB9LCB7MHgwMDY2LCAxMH0sCisgICAgICAgIHsweDAwNjcsIDEwfSwgezB4MDA2OCwgMTB9LCB7MHgwMDY5LCAxMH0sIHsweDAwNkEsIDEwfSwKKyAgICAgICAgezB4MDA2QiwgMTB9LCB7MHgwMDZDLCAxMH0sIHsweDAwNkQsIDEwfSwgezB4MDA2RSwgMTB9LAorICAgICAgICB7MHgwMDZGLCAxMH0sIHsweDAwNzAsIDEwfSwgezB4MDA3MSwgMTB9LCB7MHgwMDcyLCAxMH0sCisgICAgICAgIHsweDAwNzMsIDEwfSwgezB4MDA3NCwgMTB9LCB7MHgwMDc1LCAxMH0sIHsweDAwNzYsIDEwfSwKKyAgICAgICAgezB4MDA3NywgMTB9LCB7MHgwMDc4LCAxMH0sIHsweDAwNzksIDEwfSwgezB4MDA3QSwgMTB9LAorICAgICAgICB7MHgwMDdCLCAxMH0sIHsweDAwN0MsIDEwfSwgezB4MDA3RCwgMTB9LCB7MHgwMDdFLCAxMH0sCisgICAgICAgIHsweDAwN0YsIDEwfSwKKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgeDhfYWMwX2hpZ2hxdWFudF90YWJsZVs4XVs3N11bMl09eworICAgIHsvLzAKKyAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAyLCAgNH0sIHsweDAwMEMsICA2fSwgezB4MDAwRCwgIDZ9LAorICAgICAgICB7MHgwMDFDLCAgN30sIHsweDAwMEYsICA2fSwgezB4MUQwMCwgMTV9LCB7MHgwMDNCLCAgOH0sCisgICAgICAgIHsweDFEMDEsIDE1fSwgezB4MDA3NSwgIDl9LCB7MHgxRDAyLCAxNX0sIHsweDAwODAsICA5fSwKKyAgICAgICAgezB4MUQwMywgMTV9LCB7MHgxRDA0LCAxNX0sIHsweDFEMDUsIDE1fSwgezB4MEU4MywgMTR9LAorICAgICAgICB7MHgwMDA5LCAgNX0sIHsweDAwMTEsICA2fSwgezB4MDA4MSwgIDl9LCB7MHgwMDgyLCAgOX0sCisgICAgICAgIHsweDAwMjEsICA3fSwgezB4MDAyOCwgIDd9LCB7MHgwMDgzLCAgOX0sIHsweDAwMDIsICAyfSwKKyAgICAgICAgezB4MDAwMywgIDN9LCB7MHgwMDBDLCAgNH0sIHsweDAwMEQsICA0fSwgezB4MDAwQiwgIDV9LAorICAgICAgICB7MHgwMDE1LCAgNn0sIHsweDAwNTIsICA4fSwgezB4MDA3MCwgIDd9LCB7MHgwMDM5LCAgNn0sCisgICAgICAgIHsweDAwNzEsICA3fSwgezB4MDA1MywgIDh9LCB7MHgwRTg0LCAxNH0sIHsweDAwNzQsICA3fSwKKyAgICAgICAgezB4MDA3NSwgIDd9LCB7MHgwMDc2LCAgN30sIHsweDAxREMsICA5fSwgezB4MDAxRSwgIDV9LAorICAgICAgICB7MHgwMDNFLCAgNn0sIHsweDAxREQsICA5fSwgezB4MDBFRiwgIDh9LCB7MHgwMUY4LCAgOX0sCisgICAgICAgIHsweDAxRjksICA5fSwgezB4MEU4NSwgMTR9LCB7MHgwRTg2LCAxNH0sIHsweDBFODcsIDE0fSwKKyAgICAgICAgezB4MDBGRCwgIDh9LCB7MHgwRTg4LCAxNH0sIHsweDBFODksIDE0fSwgezB4MEU4QSwgMTR9LAorICAgICAgICB7MHgwRThCLCAxNH0sIHsweDBFOEMsIDE0fSwgezB4MEU4RCwgMTR9LCB7MHgwRThFLCAxNH0sCisgICAgICAgIHsweDBFOEYsIDE0fSwgezB4MEU5MCwgMTR9LCB7MHgwRTkxLCAxNH0sIHsweDAxRkMsICA5fSwKKyAgICAgICAgezB4MEU5MiwgMTR9LCB7MHgwRTkzLCAxNH0sIHsweDBFOTQsIDE0fSwgezB4MEU5NSwgMTR9LAorICAgICAgICB7MHgwRTk2LCAxNH0sIHsweDBFOTcsIDE0fSwgezB4MDFGRCwgIDl9LCB7MHgwRTk4LCAxNH0sCisgICAgICAgIHsweDAxRkUsICA5fSwgezB4MEU5OSwgMTR9LCB7MHgwRTlBLCAxNH0sIHsweDBFOUIsIDE0fSwKKyAgICAgICAgezB4MEU5QywgMTR9LCB7MHgwMUZGLCAgOX0sIHsweDBFOUQsIDE0fSwgezB4MEU5RSwgMTR9LAorICAgICAgICB7MHgwRTlGLCAxNH0sCisgICAgfSx7Ly8xCisgICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwMiwgIDR9LCB7MHgwMDAzLCAgNH0sIHsweDAwMDgsICA1fSwKKyAgICAgICAgezB4MDAxMiwgIDZ9LCB7MHgwMDEzLCAgNn0sIHsweDAwMTQsICA2fSwgezB4MDAxNSwgIDZ9LAorICAgICAgICB7MHgwMDJDLCAgN30sIHsweDAwNUEsICA4fSwgezB4MDA1QiwgIDh9LCB7MHgwMDVDLCAgOH0sCisgICAgICAgIHsweDAwNUQsICA4fSwgezB4MTc4MCwgMTR9LCB7MHgwMTc5LCAxMH0sIHsweDAxN0EsIDEwfSwKKyAgICAgICAgezB4MDAwNiwgIDR9LCB7MHgwMDBFLCAgNX0sIHsweDAwMUUsICA2fSwgezB4MDAzRSwgIDd9LAorICAgICAgICB7MHgwMDEwLCAgNX0sIHsweDAwMjIsICA2fSwgezB4MDAxMiwgIDV9LCB7MHgwMDBBLCAgNH0sCisgICAgICAgIHsweDAwMTMsICA1fSwgezB4MDAxNiwgIDV9LCB7MHgwMDIzLCAgNn0sIHsweDAwMkUsICA2fSwKKyAgICAgICAgezB4MDAyRiwgIDZ9LCB7MHgwMDMwLCAgNn0sIHsweDAwMzEsICA2fSwgezB4MDAzRiwgIDd9LAorICAgICAgICB7MHgwMDVGLCAgOH0sIHsweDAwQzgsICA4fSwgezB4MDA2NSwgIDd9LCB7MHgwMDY2LCAgN30sCisgICAgICAgIHsweDAwNjcsICA3fSwgezB4MDA2OCwgIDd9LCB7MHgwMEM5LCAgOH0sIHsweDAwNjksICA3fSwKKyAgICAgICAgezB4MDA2QSwgIDd9LCB7MHgwMEQ2LCAgOH0sIHsweDAwRDcsICA4fSwgezB4MDBEOCwgIDh9LAorICAgICAgICB7MHgxNzgxLCAxNH0sIHsweDAxN0IsIDEwfSwgezB4MDFCMiwgIDl9LCB7MHgxNzgyLCAxNH0sCisgICAgICAgIHsweDAwMUMsICA1fSwgezB4MDFCMywgIDl9LCB7MHgxNzgzLCAxNH0sIHsweDE3ODQsIDE0fSwKKyAgICAgICAgezB4MDAxRCwgIDV9LCB7MHgwMERBLCAgOH0sIHsweDE3ODUsIDE0fSwgezB4MTc4NiwgMTR9LAorICAgICAgICB7MHgxNzg3LCAxNH0sIHsweDAwMzcsICA2fSwgezB4MDBEQiwgIDh9LCB7MHgwMDc4LCAgN30sCisgICAgICAgIHsweDAwRjIsICA4fSwgezB4MDFFNiwgIDl9LCB7MHgwMEY0LCAgOH0sIHsweDE3ODgsIDE0fSwKKyAgICAgICAgezB4MTc4OSwgMTR9LCB7MHgwMEY1LCAgOH0sIHsweDAxRTcsICA5fSwgezB4MTc4QSwgMTR9LAorICAgICAgICB7MHgxNzhCLCAxNH0sIHsweDE3OEMsIDE0fSwgezB4MTc4RCwgMTR9LCB7MHgwMUVDLCAgOX0sCisgICAgICAgIHsweDE3OEUsIDE0fSwgezB4MDAxRiwgIDV9LCB7MHgwMEY3LCAgOH0sIHsweDAxRUQsICA5fSwKKyAgICAgICAgezB4MTc4RiwgMTR9LAorICAgIH0sey8vMgorICAgICAgICB7MHgwMDAwLCAgNH0sIHsweDAwMDIsICA1fSwgezB4MDE4MCwgMTJ9LCB7MHgwMTgxLCAxMn0sCisgICAgICAgIHsweDAxODIsIDEyfSwgezB4MDE4MywgMTJ9LCB7MHgwMTg0LCAxMn0sIHsweDAxODUsIDEyfSwKKyAgICAgICAgezB4MDE4NiwgMTJ9LCB7MHgwMTg3LCAxMn0sIHsweDAxODgsIDEyfSwgezB4MDE4OSwgMTJ9LAorICAgICAgICB7MHgwMEM1LCAxMX0sIHsweDAwQzYsIDExfSwgezB4MDBDNywgMTF9LCB7MHgwMEM4LCAxMX0sCisgICAgICAgIHsweDAwQzksIDExfSwgezB4MDBDQSwgMTF9LCB7MHgwMENCLCAxMX0sIHsweDAwQ0MsIDExfSwKKyAgICAgICAgezB4MDBDRCwgMTF9LCB7MHgwMENFLCAxMX0sIHsweDAwQ0YsIDExfSwgezB4MDAwMSwgIDF9LAorICAgICAgICB7MHgwMDAxLCAgMn0sIHsweDAwMDQsICA1fSwgezB4MDAwNSwgIDV9LCB7MHgwMDA2LCAgNX0sCisgICAgICAgIHsweDAwRDAsIDExfSwgezB4MDBEMSwgMTF9LCB7MHgwMEQyLCAxMX0sIHsweDAwRDMsIDExfSwKKyAgICAgICAgezB4MDBENCwgMTF9LCB7MHgwMEQ1LCAxMX0sIHsweDAwRDYsIDExfSwgezB4MDBENywgMTF9LAorICAgICAgICB7MHgwMEQ4LCAxMX0sIHsweDAwRDksIDExfSwgezB4MDBEQSwgMTF9LCB7MHgwMDA3LCAgNX0sCisgICAgICAgIHsweDAwREIsIDExfSwgezB4MDBEQywgMTF9LCB7MHgwMERELCAxMX0sIHsweDAwREUsIDExfSwKKyAgICAgICAgezB4MDBERiwgMTF9LCB7MHgwMEUwLCAxMX0sIHsweDAwRTEsIDExfSwgezB4MDBFMiwgMTF9LAorICAgICAgICB7MHgwMEUzLCAxMX0sIHsweDAwRTQsIDExfSwgezB4MDBFNSwgMTF9LCB7MHgwMEU2LCAxMX0sCisgICAgICAgIHsweDAwRTcsIDExfSwgezB4MDBFOCwgMTF9LCB7MHgwMEU5LCAxMX0sIHsweDAwRUEsIDExfSwKKyAgICAgICAgezB4MDBFQiwgMTF9LCB7MHgwMEVDLCAxMX0sIHsweDAwRUQsIDExfSwgezB4MDBFRSwgMTF9LAorICAgICAgICB7MHgwMEVGLCAxMX0sIHsweDAwRjAsIDExfSwgezB4MDBGMSwgMTF9LCB7MHgwMEYyLCAxMX0sCisgICAgICAgIHsweDAwRjMsIDExfSwgezB4MDBGNCwgMTF9LCB7MHgwMEY1LCAxMX0sIHsweDAwRjYsIDExfSwKKyAgICAgICAgezB4MDBGNywgMTF9LCB7MHgwMEY4LCAxMX0sIHsweDAwRjksIDExfSwgezB4MDBGQSwgMTF9LAorICAgICAgICB7MHgwMEZCLCAxMX0sIHsweDAwRkMsIDExfSwgezB4MDBGRCwgMTF9LCB7MHgwMEZFLCAxMX0sCisgICAgICAgIHsweDAwRkYsIDExfSwKKyAgICB9LHsvLzMKKyAgICAgICAgezB4MDAwMCwgIDh9LCB7MHgwMDAxLCAgOH0sIHsweDAwMDIsICA4fSwgezB4MDAwMywgIDh9LAorICAgICAgICB7MHgwMDA0LCAgOH0sIHsweDAwMDUsICA4fSwgezB4MDAwNiwgIDh9LCB7MHgwMDA3LCAgOH0sCisgICAgICAgIHsweDAwMDgsICA4fSwgezB4MDAwOSwgIDh9LCB7MHgwMDBBLCAgOH0sIHsweDAwMEIsICA4fSwKKyAgICAgICAgezB4MDAwQywgIDh9LCB7MHgwMDBELCAgOH0sIHsweDAwMEUsICA4fSwgezB4MDAwRiwgIDh9LAorICAgICAgICB7MHgwMDEwLCAgOH0sIHsweDAwMTEsICA4fSwgezB4MDAxMiwgIDh9LCB7MHgwMDEzLCAgOH0sCisgICAgICAgIHsweDAwMTQsICA4fSwgezB4MDAxNSwgIDh9LCB7MHgwMDE2LCAgOH0sIHsweDAwMDEsICAxfSwKKyAgICAgICAgezB4MDAxNywgIDh9LCB7MHgwMDBDLCAgN30sIHsweDAwMEQsICA3fSwgezB4MDAwRSwgIDd9LAorICAgICAgICB7MHgwMDBGLCAgN30sIHsweDAwMTAsICA3fSwgezB4MDAxMSwgIDd9LCB7MHgwMDEyLCAgN30sCisgICAgICAgIHsweDAwMTMsICA3fSwgezB4MDAxNCwgIDd9LCB7MHgwMDE1LCAgN30sIHsweDAwMTYsICA3fSwKKyAgICAgICAgezB4MDAxNywgIDd9LCB7MHgwMDE4LCAgN30sIHsweDAwMTksICA3fSwgezB4MDAxQSwgIDd9LAorICAgICAgICB7MHgwMDFCLCAgN30sIHsweDAwMUMsICA3fSwgezB4MDAxRCwgIDd9LCB7MHgwMDFFLCAgN30sCisgICAgICAgIHsweDAwMUYsICA3fSwgezB4MDAyMCwgIDd9LCB7MHgwMDIxLCAgN30sIHsweDAwMjIsICA3fSwKKyAgICAgICAgezB4MDAyMywgIDd9LCB7MHgwMDI0LCAgN30sIHsweDAwMjUsICA3fSwgezB4MDAyNiwgIDd9LAorICAgICAgICB7MHgwMDI3LCAgN30sIHsweDAwMjgsICA3fSwgezB4MDAyOSwgIDd9LCB7MHgwMDJBLCAgN30sCisgICAgICAgIHsweDAwMkIsICA3fSwgezB4MDAyQywgIDd9LCB7MHgwMDJELCAgN30sIHsweDAwMkUsICA3fSwKKyAgICAgICAgezB4MDAyRiwgIDd9LCB7MHgwMDMwLCAgN30sIHsweDAwMzEsICA3fSwgezB4MDAzMiwgIDd9LAorICAgICAgICB7MHgwMDMzLCAgN30sIHsweDAwMzQsICA3fSwgezB4MDAzNSwgIDd9LCB7MHgwMDM2LCAgN30sCisgICAgICAgIHsweDAwMzcsICA3fSwgezB4MDAzOCwgIDd9LCB7MHgwMDM5LCAgN30sIHsweDAwM0EsICA3fSwKKyAgICAgICAgezB4MDAzQiwgIDd9LCB7MHgwMDNDLCAgN30sIHsweDAwM0QsICA3fSwgezB4MDAzRSwgIDd9LAorICAgICAgICB7MHgwMDNGLCAgN30sCisgICAgfSx7Ly80CisgICAgICAgIHsweDAwMDAsICA5fSwgezB4MDAwMSwgIDl9LCB7MHgwMDAyLCAgOX0sIHsweDAwMDMsICA5fSwKKyAgICAgICAgezB4MDAwNCwgIDl9LCB7MHgwMDA1LCAgOX0sIHsweDAwMDYsICA5fSwgezB4MDAwNywgIDl9LAorICAgICAgICB7MHgwMDA4LCAgOX0sIHsweDAwMDksICA5fSwgezB4MDAwQSwgIDl9LCB7MHgwMDBCLCAgOX0sCisgICAgICAgIHsweDAwMEMsICA5fSwgezB4MDAwRCwgIDl9LCB7MHgwMDBFLCAgOX0sIHsweDAwMEYsICA5fSwKKyAgICAgICAgezB4MDAxMCwgIDl9LCB7MHgwMDExLCAgOX0sIHsweDAwMTIsICA5fSwgezB4MDAxMywgIDl9LAorICAgICAgICB7MHgwMDE0LCAgOX0sIHsweDAwMTUsICA5fSwgezB4MDAwQiwgIDh9LCB7MHgwMDAxLCAgMn0sCisgICAgICAgIHsweDAwMDEsICAxfSwgezB4MDAwQywgIDh9LCB7MHgwMDBELCAgOH0sIHsweDAwMEUsICA4fSwKKyAgICAgICAgezB4MDAwRiwgIDh9LCB7MHgwMDEwLCAgOH0sIHsweDAwMTEsICA4fSwgezB4MDAxMiwgIDh9LAorICAgICAgICB7MHgwMDEzLCAgOH0sIHsweDAwMTQsICA4fSwgezB4MDAxNSwgIDh9LCB7MHgwMDE2LCAgOH0sCisgICAgICAgIHsweDAwMTcsICA4fSwgezB4MDAxOCwgIDh9LCB7MHgwMDE5LCAgOH0sIHsweDAwMUEsICA4fSwKKyAgICAgICAgezB4MDAxQiwgIDh9LCB7MHgwMDFDLCAgOH0sIHsweDAwMUQsICA4fSwgezB4MDAxRSwgIDh9LAorICAgICAgICB7MHgwMDFGLCAgOH0sIHsweDAwMjAsICA4fSwgezB4MDAyMSwgIDh9LCB7MHgwMDIyLCAgOH0sCisgICAgICAgIHsweDAwMjMsICA4fSwgezB4MDAyNCwgIDh9LCB7MHgwMDI1LCAgOH0sIHsweDAwMjYsICA4fSwKKyAgICAgICAgezB4MDAyNywgIDh9LCB7MHgwMDI4LCAgOH0sIHsweDAwMjksICA4fSwgezB4MDAyQSwgIDh9LAorICAgICAgICB7MHgwMDJCLCAgOH0sIHsweDAwMkMsICA4fSwgezB4MDAyRCwgIDh9LCB7MHgwMDJFLCAgOH0sCisgICAgICAgIHsweDAwMkYsICA4fSwgezB4MDAzMCwgIDh9LCB7MHgwMDMxLCAgOH0sIHsweDAwMzIsICA4fSwKKyAgICAgICAgezB4MDAzMywgIDh9LCB7MHgwMDM0LCAgOH0sIHsweDAwMzUsICA4fSwgezB4MDAzNiwgIDh9LAorICAgICAgICB7MHgwMDM3LCAgOH0sIHsweDAwMzgsICA4fSwgezB4MDAzOSwgIDh9LCB7MHgwMDNBLCAgOH0sCisgICAgICAgIHsweDAwM0IsICA4fSwgezB4MDAzQywgIDh9LCB7MHgwMDNELCAgOH0sIHsweDAwM0UsICA4fSwKKyAgICAgICAgezB4MDAzRiwgIDh9LAorICAgIH0sey8vNQorICAgICAgICB7MHgwMDAwLCAxMH0sIHsweDAwMDEsIDEwfSwgezB4MDAwMiwgMTB9LCB7MHgwMDAzLCAxMH0sCisgICAgICAgIHsweDAwMDQsIDEwfSwgezB4MDAwNSwgMTB9LCB7MHgwMDA2LCAxMH0sIHsweDAwMDcsIDEwfSwKKyAgICAgICAgezB4MDAwOCwgMTB9LCB7MHgwMDA5LCAxMH0sIHsweDAwMEEsIDEwfSwgezB4MDAwQiwgMTB9LAorICAgICAgICB7MHgwMDBDLCAxMH0sIHsweDAwMEQsIDEwfSwgezB4MDAwRSwgMTB9LCB7MHgwMDBGLCAxMH0sCisgICAgICAgIHsweDAwMTAsIDEwfSwgezB4MDAxMSwgMTB9LCB7MHgwMDEyLCAxMH0sIHsweDAwMTMsIDEwfSwKKyAgICAgICAgezB4MDAwQSwgIDl9LCB7MHgwMDBCLCAgOX0sIHsweDAwMEMsICA5fSwgezB4MDAwMSwgIDF9LAorICAgICAgICB7MHgwMDAxLCAgM30sIHsweDAwMEQsICA5fSwgezB4MDAwRSwgIDl9LCB7MHgwMDAxLCAgMn0sCisgICAgICAgIHsweDAwMEYsICA5fSwgezB4MDAxMCwgIDl9LCB7MHgwMDExLCAgOX0sIHsweDAwMTIsICA5fSwKKyAgICAgICAgezB4MDAxMywgIDl9LCB7MHgwMDE0LCAgOX0sIHsweDAwMTUsICA5fSwgezB4MDAxNiwgIDl9LAorICAgICAgICB7MHgwMDE3LCAgOX0sIHsweDAwMTgsICA5fSwgezB4MDAxOSwgIDl9LCB7MHgwMDFBLCAgOX0sCisgICAgICAgIHsweDAwMUIsICA5fSwgezB4MDAxQywgIDl9LCB7MHgwMDFELCAgOX0sIHsweDAwMUUsICA5fSwKKyAgICAgICAgezB4MDAxRiwgIDl9LCB7MHgwMDIwLCAgOX0sIHsweDAwMjEsICA5fSwgezB4MDAyMiwgIDl9LAorICAgICAgICB7MHgwMDIzLCAgOX0sIHsweDAwMjQsICA5fSwgezB4MDAyNSwgIDl9LCB7MHgwMDI2LCAgOX0sCisgICAgICAgIHsweDAwMjcsICA5fSwgezB4MDAyOCwgIDl9LCB7MHgwMDI5LCAgOX0sIHsweDAwMkEsICA5fSwKKyAgICAgICAgezB4MDAyQiwgIDl9LCB7MHgwMDJDLCAgOX0sIHsweDAwMkQsICA5fSwgezB4MDAyRSwgIDl9LAorICAgICAgICB7MHgwMDJGLCAgOX0sIHsweDAwMzAsICA5fSwgezB4MDAzMSwgIDl9LCB7MHgwMDMyLCAgOX0sCisgICAgICAgIHsweDAwMzMsICA5fSwgezB4MDAzNCwgIDl9LCB7MHgwMDM1LCAgOX0sIHsweDAwMzYsICA5fSwKKyAgICAgICAgezB4MDAzNywgIDl9LCB7MHgwMDM4LCAgOX0sIHsweDAwMzksICA5fSwgezB4MDAzQSwgIDl9LAorICAgICAgICB7MHgwMDNCLCAgOX0sIHsweDAwM0MsICA5fSwgezB4MDAzRCwgIDl9LCB7MHgwMDNFLCAgOX0sCisgICAgICAgIHsweDAwM0YsICA5fSwKKyAgICB9LHsvLzYKKyAgICAgICAgezB4MDAwMCwgIDJ9LCB7MHgwMDA0LCAgNH0sIHsweDAwMEEsICA1fSwgezB4MDAwQiwgIDV9LAorICAgICAgICB7MHgwMDE4LCAgNn0sIHsweDAwMTksICA2fSwgezB4MDAzNCwgIDd9LCB7MHgwMDZBLCAgOH0sCisgICAgICAgIHsweDAwNkIsICA4fSwgezB4MDA2QywgIDh9LCB7MHgwMERBLCAgOX0sIHsweDAwREIsICA5fSwKKyAgICAgICAgezB4MDFCOCwgMTB9LCB7MHgwMERELCAgOX0sIHsweDAxQjksIDEwfSwgezB4Mzc4MCwgMTV9LAorICAgICAgICB7MHgwMDA0LCAgM30sIHsweDAwMEUsICA1fSwgezB4MDAxRSwgIDZ9LCB7MHgwMDFGLCAgNn0sCisgICAgICAgIHsweDAwMEEsICA0fSwgezB4MDA1OCwgIDd9LCB7MHgwMDE3LCAgNX0sIHsweDAwMTgsICA1fSwKKyAgICAgICAgezB4MDA1OSwgIDd9LCB7MHgwMDVBLCAgN30sIHsweDAwNUIsICA3fSwgezB4MDBDOCwgIDh9LAorICAgICAgICB7MHgwMDY1LCAgN30sIHsweDAwNjYsICA3fSwgezB4MDBDOSwgIDh9LCB7MHgwMENFLCAgOH0sCisgICAgICAgIHsweDAwQ0YsICA4fSwgezB4MDBEMCwgIDh9LCB7MHgwMEQxLCAgOH0sIHsweDAwRDIsICA4fSwKKyAgICAgICAgezB4MDBEMywgIDh9LCB7MHgwMERGLCAgOX0sIHsweDAwRDQsICA4fSwgezB4MDBENSwgIDh9LAorICAgICAgICB7MHgwMEQ2LCAgOH0sIHsweDAxQUUsICA5fSwgezB4Mzc4MSwgMTV9LCB7MHgwMUJELCAxMH0sCisgICAgICAgIHsweDAzNUUsIDEwfSwgezB4MDM1RiwgMTB9LCB7MHgzNzgyLCAxNX0sIHsweDAzNjAsIDEwfSwKKyAgICAgICAgezB4MDAzNywgIDZ9LCB7MHgwMUIxLCAgOX0sIHsweDM3ODMsIDE1fSwgezB4Mzc4NCwgMTV9LAorICAgICAgICB7MHgwMDBFLCAgNH0sIHsweDAwM0MsICA2fSwgezB4MDM2MSwgMTB9LCB7MHgzNzg1LCAxNX0sCisgICAgICAgIHsweDFCQzMsIDE0fSwgezB4MDAzRCwgIDZ9LCB7MHgwMEQ5LCAgOH0sIHsweDFCQzQsIDE0fSwKKyAgICAgICAgezB4MDM2OCwgMTB9LCB7MHgxQkM1LCAxNH0sIHsweDFCQzYsIDE0fSwgezB4MUJDNywgMTR9LAorICAgICAgICB7MHgxQkM4LCAxNH0sIHsweDAwREIsICA4fSwgezB4MDM2OSwgMTB9LCB7MHgwMzZBLCAxMH0sCisgICAgICAgIHsweDFCQzksIDE0fSwgezB4MUJDQSwgMTR9LCB7MHgxQkNCLCAxNH0sIHsweDFCQ0MsIDE0fSwKKyAgICAgICAgezB4MUJDRCwgMTR9LCB7MHgwMDFGLCAgNX0sIHsweDAzNkIsIDEwfSwgezB4MUJDRSwgMTR9LAorICAgICAgICB7MHgxQkNGLCAxNH0sCisgICAgfSx7Ly83CisgICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwMiwgIDR9LCB7MHgwMDA2LCAgNX0sIHsweDAwMDcsICA1fSwKKyAgICAgICAgezB4MDAxMCwgIDZ9LCB7MHgwMDQ0LCAgOH0sIHsweDAwMjMsICA3fSwgezB4MDAxMiwgIDZ9LAorICAgICAgICB7MHgwMDI2LCAgN30sIHsweDA4QTAsIDEzfSwgezB4MDA0RSwgIDh9LCB7MHgwMDRGLCAgOH0sCisgICAgICAgIHsweDA4QTEsIDEzfSwgezB4MDhBMiwgMTN9LCB7MHgwOEEzLCAxM30sIHsweDAwNTAsICA4fSwKKyAgICAgICAgezB4MDAwNiwgIDR9LCB7MHgwMDBCLCAgNX0sIHsweDAwMjksICA3fSwgezB4MDAxNSwgIDZ9LAorICAgICAgICB7MHgwMDFDLCAgNn0sIHsweDAwM0EsICA3fSwgezB4MDAxRSwgIDZ9LCB7MHgwMDA0LCAgM30sCisgICAgICAgIHsweDAwMTQsICA1fSwgezB4MDAxNSwgIDV9LCB7MHgwMDBCLCAgNH0sIHsweDAwMUYsICA2fSwKKyAgICAgICAgezB4MDAzMCwgIDZ9LCB7MHgwMDMxLCAgNn0sIHsweDAwMTksICA1fSwgezB4MDA1MSwgIDh9LAorICAgICAgICB7MHgwMDM0LCAgNn0sIHsweDAwMzUsICA2fSwgezB4MDAzNiwgIDZ9LCB7MHgwMDM3LCAgNn0sCisgICAgICAgIHsweDAwNzYsICA4fSwgezB4MDA3NywgIDh9LCB7MHgwMDcwLCAgN30sIHsweDAwMUQsICA1fSwKKyAgICAgICAgezB4MDA3MSwgIDd9LCB7MHgwMDcyLCAgN30sIHsweDA4QTQsIDEzfSwgezB4MDA3MywgIDd9LAorICAgICAgICB7MHgwMEYwLCAgOH0sIHsweDA4QTUsIDEzfSwgezB4MDhBNiwgMTN9LCB7MHgwOEE3LCAxM30sCisgICAgICAgIHsweDAwNzksICA3fSwgezB4MDA3QSwgIDd9LCB7MHgwOEE4LCAxM30sIHsweDA4QTksIDEzfSwKKyAgICAgICAgezB4MDBGMSwgIDh9LCB7MHgwOEFBLCAxM30sIHsweDA4QUIsIDEzfSwgezB4MDhBQywgMTN9LAorICAgICAgICB7MHgwOEFELCAxM30sIHsweDAwRjYsICA4fSwgezB4MDhBRSwgMTN9LCB7MHgwMDdDLCAgN30sCisgICAgICAgIHsweDAwRjcsICA4fSwgezB4MDhBRiwgMTN9LCB7MHgwOEIwLCAxM30sIHsweDA4QjEsIDEzfSwKKyAgICAgICAgezB4MDhCMiwgMTN9LCB7MHgwMEZBLCAgOH0sIHsweDA4QjMsIDEzfSwgezB4MDhCNCwgMTN9LAorICAgICAgICB7MHgwOEI1LCAxM30sIHsweDA4QjYsIDEzfSwgezB4MDhCNywgMTN9LCB7MHgwMEZCLCAgOH0sCisgICAgICAgIHsweDA0NUMsIDEyfSwgezB4MDAzRiwgIDZ9LCB7MHgwNDVELCAxMn0sIHsweDA0NUUsIDEyfSwKKyAgICAgICAgezB4MDQ1RiwgMTJ9LAorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9hYzFfbG93cXVhbnRfdGFibGVbOF1bNzddWzJdPXsKKyAgICB7Ly8wCisgICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwMiwgIDR9LCB7MHgwMDAzLCAgNH0sIHsweDAwMDgsICA1fSwKKyAgICAgICAgezB4MDAxMiwgIDZ9LCB7MHgwMDI2LCAgN30sIHsweDAwMTQsICA2fSwgezB4MDA0RSwgIDh9LAorICAgICAgICB7MHgwMDRGLCAgOH0sIHsweDAwQTgsICA5fSwgezB4MDE1MiwgMTB9LCB7MHgwMEFBLCAgOX0sCisgICAgICAgIHsweDAwQUIsICA5fSwgezB4MDBBQywgIDl9LCB7MHgyQTYwLCAxNX0sIHsweDAyQTcsIDExfSwKKyAgICAgICAgezB4MDAwNiwgIDR9LCB7MHgwMDBCLCAgNX0sIHsweDAwMUMsICA2fSwgezB4MDAzQSwgIDd9LAorICAgICAgICB7MHgwMDBGLCAgNX0sIHsweDAwM0IsICA3fSwgezB4MDAxMCwgIDV9LCB7MHgwMDA1LCAgM30sCisgICAgICAgIHsweDAwMDksICA0fSwgezB4MDAxMSwgIDV9LCB7MHgwMDE4LCAgNX0sIHsweDAwMTksICA1fSwKKyAgICAgICAgezB4MDAxQSwgIDV9LCB7MHgwMDM2LCAgNn0sIHsweDAwMzcsICA2fSwgezB4MDA3MCwgIDd9LAorICAgICAgICB7MHgwMDU3LCAgOH0sIHsweDAwRTIsICA4fSwgezB4MDBFMywgIDh9LCB7MHgwMEU0LCAgOH0sCisgICAgICAgIHsweDAwRTUsICA4fSwgezB4MDBBRCwgIDl9LCB7MHgwMzk4LCAxMH0sIHsweDAwM0EsICA2fSwKKyAgICAgICAgezB4MDA3NiwgIDd9LCB7MHgwMEU3LCAgOH0sIHsweDAwRUUsICA4fSwgezB4MDBFRiwgIDh9LAorICAgICAgICB7MHgwNzMyLCAxMX0sIHsweDAzOUEsIDEwfSwgezB4MDczMywgMTF9LCB7MHgyQTYxLCAxNX0sCisgICAgICAgIHsweDAwNzgsICA3fSwgezB4MTUzMSwgMTR9LCB7MHgxNTMyLCAxNH0sIHsweDE1MzMsIDE0fSwKKyAgICAgICAgezB4MDAzRCwgIDZ9LCB7MHgwMzlCLCAxMH0sIHsweDE1MzQsIDE0fSwgezB4MTUzNSwgMTR9LAorICAgICAgICB7MHgxNTM2LCAxNH0sIHsweDAwNzksICA3fSwgezB4MTUzNywgMTR9LCB7MHgwMEY4LCAgOH0sCisgICAgICAgIHsweDAxRjIsICA5fSwgezB4MDdDQywgMTF9LCB7MHgwM0U3LCAxMH0sIHsweDA3Q0QsIDExfSwKKyAgICAgICAgezB4M0U4MCwgMTR9LCB7MHgwMEZCLCAgOH0sIHsweDAzRTksIDEwfSwgezB4M0U4MSwgMTR9LAorICAgICAgICB7MHgzRTgyLCAxNH0sIHsweDNFODMsIDE0fSwgezB4M0U4NCwgMTR9LCB7MHgzRTg1LCAxNH0sCisgICAgICAgIHsweDNFODYsIDE0fSwgezB4MDAzRiwgIDZ9LCB7MHgwMUY1LCAgOX0sIHsweDA3RDEsIDExfSwKKyAgICAgICAgezB4M0U4NywgMTR9LAorICAgIH0sey8vMQorICAgICAgICB7MHgwMDAwLCAgMn0sIHsweDAwMDIsICAzfSwgezB4MDAwNiwgIDR9LCB7MHgwMDBFLCAgNX0sCisgICAgICAgIHsweDAwMUUsICA2fSwgezB4MDAxRiwgIDZ9LCB7MHgwMDQwLCAgN30sIHsweDAwODIsICA4fSwKKyAgICAgICAgezB4MDA4MywgIDh9LCB7MHgwMDg0LCAgOH0sIHsweDAxMEEsICA5fSwgezB4MDEwQiwgIDl9LAorICAgICAgICB7MHgwNDMwLCAxMX0sIHsweDA0MzEsIDExfSwgezB4MDQzMiwgMTF9LCB7MHgwNDMzLCAxMX0sCisgICAgICAgIHsweDAwMDUsICAzfSwgezB4MDAxMSwgIDV9LCB7MHgwMDI0LCAgNn0sIHsweDAwNEEsICA3fSwKKyAgICAgICAgezB4MDAwQywgIDR9LCB7MHgwMDI2LCAgNn0sIHsweDAwMEQsICA0fSwgezB4MDA4NywgIDh9LAorICAgICAgICB7MHgwMTBELCAgOX0sIHsweDAyNTgsIDEwfSwgezB4MDEyRCwgIDl9LCB7MHgwMjU5LCAxMH0sCisgICAgICAgIHsweDAyNUMsIDEwfSwgezB4MDk3NCwgMTJ9LCB7MHgwMjVFLCAxMH0sIHsweDAyNUYsIDEwfSwKKyAgICAgICAgezB4MDI3MCwgMTB9LCB7MHgwMjcxLCAxMH0sIHsweDA0QkIsIDExfSwgezB4MDk3NSwgMTJ9LAorICAgICAgICB7MHgwMjcyLCAxMH0sIHsweDA5Q0MsIDEyfSwgezB4MDlDRCwgMTJ9LCB7MHg0RTcwLCAxNX0sCisgICAgICAgIHsweDRFNzEsIDE1fSwgezB4NEU3MiwgMTV9LCB7MHg0RTczLCAxNX0sIHsweDI3M0EsIDE0fSwKKyAgICAgICAgezB4MjczQiwgMTR9LCB7MHgyNzNDLCAxNH0sIHsweDA0RTgsIDExfSwgezB4MDRFOSwgMTF9LAorICAgICAgICB7MHgwMDlFLCAgOH0sIHsweDAyNzUsIDEwfSwgezB4MDlEOCwgMTJ9LCB7MHgyNzNELCAxNH0sCisgICAgICAgIHsweDAwMEUsICA0fSwgezB4MDAzQywgIDZ9LCB7MHgwMDdBLCAgN30sIHsweDAwOUYsICA4fSwKKyAgICAgICAgezB4MDI3NywgMTB9LCB7MHgwMDNFLCAgNn0sIHsweDAwRjYsICA4fSwgezB4MDRFRCwgMTF9LAorICAgICAgICB7MHgwM0RDLCAxMH0sIHsweDI3M0UsIDE0fSwgezB4MDdCQSwgMTF9LCB7MHgwOUQ5LCAxMn0sCisgICAgICAgIHsweDI3M0YsIDE0fSwgezB4M0REOCwgMTR9LCB7MHgzREQ5LCAxNH0sIHsweDNEREEsIDE0fSwKKyAgICAgICAgezB4M0REQiwgMTR9LCB7MHgzRERDLCAxNH0sIHsweDNEREQsIDE0fSwgezB4M0RERSwgMTR9LAorICAgICAgICB7MHgzRERGLCAxNH0sIHsweDAwM0YsICA2fSwgezB4MDdCQywgMTF9LCB7MHgwN0JELCAxMX0sCisgICAgICAgIHsweDAzREYsIDEwfSwKKyAgICB9LHsvLzIKKyAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDYsICA1fSwgezB4MDAwRSwgIDZ9LAorICAgICAgICB7MHgwMDFFLCAgN30sIHsweDAwM0UsICA4fSwgezB4MDAzRiwgIDh9LCB7MHgwMDQwLCAgOH0sCisgICAgICAgIHsweDAxMDQsIDEwfSwgezB4MDA4MywgIDl9LCB7MHgwMTA1LCAxMH0sIHsweDAxMDgsIDEwfSwKKyAgICAgICAgezB4NDI0MCwgMTZ9LCB7MHgwMTBBLCAxMH0sIHsweDAxMEIsIDEwfSwgezB4NDI0MSwgMTZ9LAorICAgICAgICB7MHgwMDAzLCAgM30sIHsweDAwMDksICA1fSwgezB4MDAxMSwgIDZ9LCB7MHgwMDQzLCAgOH0sCisgICAgICAgIHsweDAwMDQsICAzfSwgezB4MDAwQSwgIDV9LCB7MHgwMDBBLCAgNH0sIHsweDAwMkMsICA3fSwKKyAgICAgICAgezB4MDBCNCwgIDl9LCB7MHgwMEI1LCAgOX0sIHsweDAwQjYsICA5fSwgezB4MDBCNywgIDl9LAorICAgICAgICB7MHgwMEI4LCAgOX0sIHsweDAxNzIsIDEwfSwgezB4MDE3MywgMTB9LCB7MHgwMTc0LCAxMH0sCisgICAgICAgIHsweDAxNzUsIDEwfSwgezB4MDE3NiwgMTB9LCB7MHgwMTc3LCAxMH0sIHsweDAwQkMsICA5fSwKKyAgICAgICAgezB4MDE3QSwgMTB9LCB7MHgwMjEzLCAxMX0sIHsweDQyNDIsIDE2fSwgezB4MDE3QiwgMTB9LAorICAgICAgICB7MHgwMkY4LCAxMX0sIHsweDAxN0QsIDEwfSwgezB4MDJGOSwgMTF9LCB7MHgwMTdFLCAxMH0sCisgICAgICAgIHsweDQyNDMsIDE2fSwgezB4MDJGRSwgMTF9LCB7MHgyMTIyLCAxNX0sIHsweDIxMjMsIDE1fSwKKyAgICAgICAgezB4MDA1OCwgIDd9LCB7MHgwMTY0LCAgOX0sIHsweDIxMjQsIDE1fSwgezB4MjEyNSwgMTV9LAorICAgICAgICB7MHgwMDA2LCAgM30sIHsweDAwMEUsICA0fSwgezB4MDAyRCwgIDZ9LCB7MHgwMDJFLCAgNn0sCisgICAgICAgIHsweDAwQjMsICA4fSwgezB4MDAxRSwgIDV9LCB7MHgwMDVFLCAgN30sIHsweDIxMjYsIDE1fSwKKyAgICAgICAgezB4MjEyNywgMTV9LCB7MHgyMTI4LCAxNX0sIHsweDIxMjksIDE1fSwgezB4MDJGRiwgMTF9LAorICAgICAgICB7MHgyMTJBLCAxNX0sIHsweDA1OTQsIDExfSwgezB4MDU5NSwgMTF9LCB7MHgwNTk2LCAxMX0sCisgICAgICAgIHsweDIxMkIsIDE1fSwgezB4MjEyQywgMTV9LCB7MHgyMTJELCAxNX0sIHsweDIxMkUsIDE1fSwKKyAgICAgICAgezB4MjEyRiwgMTV9LCB7MHgwMDFGLCAgNX0sIHsweDA1OTcsIDExfSwgezB4MDBCRSwgIDh9LAorICAgICAgICB7MHgwMEJGLCAgOH0sCisgICAgfSx7Ly8zCisgICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwMiwgIDN9LCB7MHgwMDA2LCAgNH0sIHsweDAwMDcsICA0fSwKKyAgICAgICAgezB4MDAxMCwgIDV9LCB7MHgwMDExLCAgNX0sIHsweDAwMjQsICA2fSwgezB4MDAyNSwgIDZ9LAorICAgICAgICB7MHgwMDI2LCAgNn0sIHsweDAwMjcsICA2fSwgezB4MDA1MCwgIDd9LCB7MHgwMDUxLCAgN30sCisgICAgICAgIHsweDAwQTQsICA4fSwgezB4MDBBNSwgIDh9LCB7MHgwMEE2LCAgOH0sIHsweDAxNEUsICA5fSwKKyAgICAgICAgezB4MDAwQiwgIDR9LCB7MHgwMDJBLCAgNn0sIHsweDAwNTYsICA3fSwgezB4MDE0RiwgIDl9LAorICAgICAgICB7MHgwMDMwLCAgNn0sIHsweDAwQUUsICA4fSwgezB4MDA2MiwgIDd9LCB7MHgwMDMyLCAgNn0sCisgICAgICAgIHsweDAwMzMsICA2fSwgezB4MDAzNCwgIDZ9LCB7MHgwMDM1LCAgNn0sIHsweDAwMzYsICA2fSwKKyAgICAgICAgezB4MDA2MywgIDd9LCB7MHgwMDZFLCAgN30sIHsweDAwNkYsICA3fSwgezB4MDA3MCwgIDd9LAorICAgICAgICB7MHgwMDcxLCAgN30sIHsweDAwNzIsICA3fSwgezB4MDA3MywgIDd9LCB7MHgwMDc0LCAgN30sCisgICAgICAgIHsweDAwQUYsICA4fSwgezB4MDBFQSwgIDh9LCB7MHgwMUQ2LCAgOX0sIHsweDA3NUMsIDExfSwKKyAgICAgICAgezB4MDNBRiwgMTB9LCB7MHg3NUQwLCAxNX0sIHsweDc1RDEsIDE1fSwgezB4NzVEMiwgMTV9LAorICAgICAgICB7MHg3NUQzLCAxNX0sIHsweDc1RDQsIDE1fSwgezB4MDA3NiwgIDd9LCB7MHgwMEVFLCAgOH0sCisgICAgICAgIHsweDAwRUYsICA4fSwgezB4MEVCQiwgMTJ9LCB7MHgwMUUwLCAgOX0sIHsweDc1RDUsIDE1fSwKKyAgICAgICAgezB4MDA3OSwgIDd9LCB7MHgwMUUxLCAgOX0sIHsweDc1RDYsIDE1fSwgezB4NzVENywgMTV9LAorICAgICAgICB7MHg3ODgwLCAxNX0sIHsweDAwRjQsICA4fSwgezB4MDc4OSwgMTF9LCB7MHgwMDNFLCAgNn0sCisgICAgICAgIHsweDAwN0IsICA3fSwgezB4MDBGNSwgIDh9LCB7MHgwMEZDLCAgOH0sIHsweDAwN0YsICA3fSwKKyAgICAgICAgezB4MDFFMywgIDl9LCB7MHgwNzhBLCAxMX0sIHsweDA3OEIsIDExfSwgezB4Nzg4MSwgMTV9LAorICAgICAgICB7MHg3ODgyLCAxNX0sIHsweDc4ODMsIDE1fSwgezB4M0M0MiwgMTR9LCB7MHgzQzQzLCAxNH0sCisgICAgICAgIHsweDNDNDQsIDE0fSwgezB4MDBGRCwgIDh9LCB7MHgzQzQ1LCAxNH0sIHsweDNDNDYsIDE0fSwKKyAgICAgICAgezB4M0M0NywgMTR9LAorICAgIH0sey8vNAorICAgICAgICB7MHgwMDAwLCAgMn0sIHsweDAwMDQsICA0fSwgezB4MDAwQSwgIDV9LCB7MHgwMDE2LCAgNn0sCisgICAgICAgIHsweDAwMTcsICA2fSwgezB4MDAzMCwgIDd9LCB7MHgwMDMxLCAgN30sIHsweDAwNjQsICA4fSwKKyAgICAgICAgezB4MDA2NSwgIDh9LCB7MHgwMDY2LCAgOH0sIHsweDAwQ0UsICA5fSwgezB4MDBDRiwgIDl9LAorICAgICAgICB7MHgwMUEwLCAxMH0sIHsweDAxQTEsIDEwfSwgezB4MUEyMCwgMTR9LCB7MHgwNjg5LCAxMn0sCisgICAgICAgIHsweDAwMDQsICAzfSwgezB4MDAwRSwgIDV9LCB7MHgwMDFCLCAgNn0sIHsweDAwMzUsICA3fSwKKyAgICAgICAgezB4MDAwQSwgIDR9LCB7MHgwMDFFLCAgNn0sIHsweDAwMTYsICA1fSwgezB4MDAxNywgIDV9LAorICAgICAgICB7MHgwMDFGLCAgNn0sIHsweDAwMzAsICA2fSwgezB4MDAzMSwgIDZ9LCB7MHgwMDY0LCAgN30sCisgICAgICAgIHsweDAwNjUsICA3fSwgezB4MDA2OSwgIDh9LCB7MHgwMDY2LCAgN30sIHsweDAwQ0UsICA4fSwKKyAgICAgICAgezB4MDBDRiwgIDh9LCB7MHgwMEQwLCAgOH0sIHsweDAwRDEsICA4fSwgezB4MDBEMiwgIDh9LAorICAgICAgICB7MHgwMUE2LCAgOX0sIHsweDAxQTMsIDEwfSwgezB4MDM0RSwgMTB9LCB7MHgwMDZBLCAgN30sCisgICAgICAgIHsweDAwRDYsICA4fSwgezB4MDFBRSwgIDl9LCB7MHgwMUFGLCAgOX0sIHsweDAzNEYsIDEwfSwKKyAgICAgICAgezB4MDM0NSwgMTF9LCB7MHgwMUIwLCAgOX0sIHsweDAxQjEsICA5fSwgezB4MDM2NCwgMTB9LAorICAgICAgICB7MHgwMDZELCAgN30sIHsweDAwREMsICA4fSwgezB4MEQ5NCwgMTJ9LCB7MHgwRDk1LCAxMn0sCisgICAgICAgIHsweDAwMEUsICA0fSwgezB4MDAzQywgIDZ9LCB7MHgwMERELCAgOH0sIHsweDAwREUsICA4fSwKKyAgICAgICAgezB4MDFCMywgIDl9LCB7MHgwMDNELCAgNn0sIHsweDAwREYsICA4fSwgezB4MDFGMCwgIDl9LAorICAgICAgICB7MHgwM0UyLCAxMH0sIHsweDAzRTMsIDEwfSwgezB4MDZDQiwgMTF9LCB7MHgwM0U0LCAxMH0sCisgICAgICAgIHsweDA3Q0EsIDExfSwgezB4MDFGMywgIDl9LCB7MHgwMUY0LCAgOX0sIHsweDA3Q0IsIDExfSwKKyAgICAgICAgezB4MDdENCwgMTF9LCB7MHgxQTIxLCAxNH0sIHsweDFBMjIsIDE0fSwgezB4MDdENSwgMTF9LAorICAgICAgICB7MHgxQTIzLCAxNH0sIHsweDAwM0YsICA2fSwgezB4MDFGNiwgIDl9LCB7MHgwMUY3LCAgOX0sCisgICAgICAgIHsweDAzRUIsIDEwfSwKKyAgICB9LHsvLzUKKyAgICAgICAgezB4MDAwMCwgIDJ9LCB7MHgwMDAyLCAgM30sIHsweDAwMDYsICA0fSwgezB4MDAwRSwgIDV9LAorICAgICAgICB7MHgwMDBGLCAgNX0sIHsweDAwMjAsICA2fSwgezB4MDAyMSwgIDZ9LCB7MHgwMDQ0LCAgN30sCisgICAgICAgIHsweDAwNDUsICA3fSwgezB4MDA0NiwgIDd9LCB7MHgwMDhFLCAgOH0sIHsweDAwOEYsICA4fSwKKyAgICAgICAgezB4MDA5MCwgIDh9LCB7MHgwMTIyLCAgOX0sIHsweDAyNDYsIDEwfSwgezB4MDEyNCwgIDl9LAorICAgICAgICB7MHgwMDA1LCAgM30sIHsweDAwMTMsICA1fSwgezB4MDA0QSwgIDd9LCB7MHgwMDkzLCAgOH0sCisgICAgICAgIHsweDAwMTgsICA1fSwgezB4MDA0QiwgIDd9LCB7MHgwMDMyLCAgNn0sIHsweDAwMUEsICA1fSwKKyAgICAgICAgezB4MDAzMywgIDZ9LCB7MHgwMDZDLCAgN30sIHsweDAwNkQsICA3fSwgezB4MDA2RSwgIDd9LAorICAgICAgICB7MHgwMERFLCAgOH0sIHsweDAwREYsICA4fSwgezB4MDA3MCwgIDd9LCB7MHgwMEUyLCAgOH0sCisgICAgICAgIHsweDAwRTMsICA4fSwgezB4MDBFNCwgIDh9LCB7MHgwMEU1LCAgOH0sIHsweDAwRTYsICA4fSwKKyAgICAgICAgezB4MDBFNywgIDh9LCB7MHgwMTI1LCAgOX0sIHsweDAxRDAsICA5fSwgezB4MDQ4RSwgMTF9LAorICAgICAgICB7MHgwOTFFLCAxMn0sIHsweDA5MUYsIDEyfSwgezB4NzQ0MCwgMTV9LCB7MHgxRDExLCAxM30sCisgICAgICAgIHsweDc0NDEsIDE1fSwgezB4NzQ0MiwgMTV9LCB7MHgwMEU5LCAgOH0sIHsweDAxRDQsICA5fSwKKyAgICAgICAgezB4MDBFQiwgIDh9LCB7MHgwM0EzLCAxMH0sIHsweDAxRDUsICA5fSwgezB4MUQxMiwgMTN9LAorICAgICAgICB7MHgwMDFFLCAgNX0sIHsweDAwNzYsICA3fSwgezB4MDFEQywgIDl9LCB7MHgwMURELCAgOX0sCisgICAgICAgIHsweDc0NDMsIDE1fSwgezB4MDA3QywgIDd9LCB7MHgwNzQ1LCAxMX0sIHsweDAwRUYsICA4fSwKKyAgICAgICAgezB4MDBGQSwgIDh9LCB7MHgwMEZCLCAgOH0sIHsweDAxRjgsICA5fSwgezB4MDBGRCwgIDh9LAorICAgICAgICB7MHgwN0U0LCAxMX0sIHsweDBGQ0EsIDEyfSwgezB4MUQxMywgMTN9LCB7MHg3RTU4LCAxNX0sCisgICAgICAgIHsweDdFNTksIDE1fSwgezB4N0U1QSwgMTV9LCB7MHg3RTVCLCAxNX0sIHsweDdFNUMsIDE1fSwKKyAgICAgICAgezB4N0U1RCwgMTV9LCB7MHgwMDdGLCAgN30sIHsweDNGMkYsIDE0fSwgezB4MDdFNiwgMTF9LAorICAgICAgICB7MHgwN0U3LCAxMX0sCisgICAgfSx7Ly82CisgICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwMiwgIDR9LCB7MHgwMDAzLCAgNH0sIHsweDAwMDgsICA1fSwKKyAgICAgICAgezB4MDAwOSwgIDV9LCB7MHgwMDE0LCAgNn0sIHsweDAwMTUsICA2fSwgezB4MDAyQywgIDd9LAorICAgICAgICB7MHgwMDVBLCAgOH0sIHsweDAwNUIsICA4fSwgezB4MDA1QywgIDh9LCB7MHgwMEJBLCAgOX0sCisgICAgICAgIHsweDAwQkIsICA5fSwgezB4MDBCQywgIDl9LCB7MHgwMkY0LCAxMX0sIHsweDA1RUEsIDEyfSwKKyAgICAgICAgezB4MDAwMywgIDN9LCB7MHgwMDEwLCAgNX0sIHsweDAwMjIsICA2fSwgezB4MDA0NiwgIDd9LAorICAgICAgICB7MHgwMDA5LCAgNH0sIHsweDAwMjgsICA2fSwgezB4MDAxNSwgIDV9LCB7MHgwMDBCLCAgNH0sCisgICAgICAgIHsweDAwMTgsICA1fSwgezB4MDAyOSwgIDZ9LCB7MHgwMDMyLCAgNn0sIHsweDAwNDcsICA3fSwKKyAgICAgICAgezB4MDA2NiwgIDd9LCB7MHgwMDY3LCAgN30sIHsweDAwNjgsICA3fSwgezB4MDA2OSwgIDd9LAorICAgICAgICB7MHgwMDZBLCAgN30sIHsweDAwNUYsICA4fSwgezB4MDBENiwgIDh9LCB7MHgwMEQ3LCAgOH0sCisgICAgICAgIHsweDAxQjAsICA5fSwgezB4MDBEOSwgIDh9LCB7MHgwMTdCLCAxMH0sIHsweDAwNkQsICA3fSwKKyAgICAgICAgezB4MDBEQywgIDh9LCB7MHgwMUIxLCAgOX0sIHsweDA2RTgsIDExfSwgezB4MDFCQiwgIDl9LAorICAgICAgICB7MHgwMzc1LCAxMH0sIHsweDA1RUIsIDEyfSwgezB4MDFCQywgIDl9LCB7MHg2RTkwLCAxNX0sCisgICAgICAgIHsweDAwMzgsICA2fSwgezB4MDA3MiwgIDd9LCB7MHg2RTkxLCAxNX0sIHsweDZFOTIsIDE1fSwKKyAgICAgICAgezB4MDAxRCwgIDV9LCB7MHgwMDczLCAgN30sIHsweDAxQkQsICA5fSwgezB4MDZGOCwgMTF9LAorICAgICAgICB7MHg2RTkzLCAxNX0sIHsweDAwM0MsICA2fSwgezB4MDFCRiwgIDl9LCB7MHgwMEY0LCAgOH0sCisgICAgICAgIHsweDAxRUEsICA5fSwgezB4MDM3RCwgMTB9LCB7MHgwM0Q2LCAxMH0sIHsweDA2RjksIDExfSwKKyAgICAgICAgezB4NkU5NCwgMTV9LCB7MHgwMEY2LCAgOH0sIHsweDAxRUUsICA5fSwgezB4NkU5NSwgMTV9LAorICAgICAgICB7MHg2RTk2LCAxNX0sIHsweDZFOTcsIDE1fSwgezB4Mzc0QywgMTR9LCB7MHgzNzRELCAxNH0sCisgICAgICAgIHsweDM3NEUsIDE0fSwgezB4MDAxRiwgIDV9LCB7MHgwM0Q3LCAxMH0sIHsweDAxRUYsICA5fSwKKyAgICAgICAgezB4Mzc0RiwgMTR9LAorICAgIH0sey8vNworICAgICAgICB7MHgwMDAwLCAgMn0sIHsweDAwMDQsICA0fSwgezB4MDAwQSwgIDV9LCB7MHgwMDE2LCAgNn0sCisgICAgICAgIHsweDAwMkUsICA3fSwgezB4MDAyRiwgIDd9LCB7MHgwMDYwLCAgOH0sIHsweDAwNjEsICA4fSwKKyAgICAgICAgezB4MDBDNCwgIDl9LCB7MHgwMEM1LCAgOX0sIHsweDAwQzYsICA5fSwgezB4MDE4RSwgMTB9LAorICAgICAgICB7MHgzMUUwLCAxNX0sIHsweDMxRTEsIDE1fSwgezB4MzFFMiwgMTV9LCB7MHgzMUUzLCAxNX0sCisgICAgICAgIHsweDAwMDQsICAzfSwgezB4MDAwRCwgIDV9LCB7MHgwMDE5LCAgNn0sIHsweDAwMzgsICA3fSwKKyAgICAgICAgezB4MDAwQSwgIDR9LCB7MHgwMDFELCAgNn0sIHsweDAwMEIsICA0fSwgezB4MDA3MiwgIDh9LAorICAgICAgICB7MHgwMDczLCAgOH0sIHsweDAwRjAsICA5fSwgezB4MDFFMiwgMTB9LCB7MHgwMEYyLCAgOX0sCisgICAgICAgIHsweDAxRTMsIDEwfSwgezB4MDBGMywgIDl9LCB7MHgwMUU4LCAxMH0sIHsweDAxRTksIDEwfSwKKyAgICAgICAgezB4MzFFNCwgMTV9LCB7MHgwMUVBLCAxMH0sIHsweDAzMUYsIDExfSwgezB4MDNENiwgMTF9LAorICAgICAgICB7MHgzMUU1LCAxNX0sIHsweDAxRUMsIDEwfSwgezB4MzFFNiwgMTV9LCB7MHgwMEY3LCAgOX0sCisgICAgICAgIHsweDAzRDcsIDExfSwgezB4MzFFNywgMTV9LCB7MHgzMUU4LCAxNX0sIHsweDAzREEsIDExfSwKKyAgICAgICAgezB4MDNEQiwgMTF9LCB7MHgzMUU5LCAxNX0sIHsweDAzRTAsIDExfSwgezB4MzFFQSwgMTV9LAorICAgICAgICB7MHgwMDNGLCAgN30sIHsweDAxRjEsIDEwfSwgezB4MzFFQiwgMTV9LCB7MHgzMUVDLCAxNX0sCisgICAgICAgIHsweDAwMDYsICAzfSwgezB4MDAxQywgIDV9LCB7MHgwMDc0LCAgN30sIHsweDAwNzUsICA3fSwKKyAgICAgICAgezB4MDBGOSwgIDl9LCB7MHgwMDFFLCAgNX0sIHsweDAwNzYsICA3fSwgezB4MDBGQSwgIDl9LAorICAgICAgICB7MHgwM0UxLCAxMX0sIHsweDMxRUQsIDE1fSwgezB4MThGNywgMTR9LCB7MHgxRjYwLCAxNH0sCisgICAgICAgIHsweDFGNjEsIDE0fSwgezB4MDFEQywgIDl9LCB7MHgwMURELCAgOX0sIHsweDFGNjIsIDE0fSwKKyAgICAgICAgezB4MUY2MywgMTR9LCB7MHgxRjY0LCAxNH0sIHsweDFGNjUsIDE0fSwgezB4MUY2NiwgMTR9LAorICAgICAgICB7MHgxRjY3LCAxNH0sIHsweDAwMUYsICA1fSwgezB4MDNFRCwgMTF9LCB7MHgwMEVGLCAgOH0sCisgICAgICAgIHsweDAxRjcsIDEwfSwKKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgeDhfYWMxX2hpZ2hxdWFudF90YWJsZVs4XVs3N11bMl09eworICAgIHsvLzAKKyAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDYsICA1fSwgezB4MDAwNywgIDV9LAorICAgICAgICB7MHgwMDA4LCAgNX0sIHsweDAwMDksICA1fSwgezB4MDAxNCwgIDZ9LCB7MHgwMDJBLCAgN30sCisgICAgICAgIHsweDAwMTYsICA2fSwgezB4MDAyQiwgIDd9LCB7MHgwMDVDLCAgOH0sIHsweDAwMkYsICA3fSwKKyAgICAgICAgezB4MDAzMCwgIDd9LCB7MHgwMDVELCAgOH0sIHsweDAwNjIsICA4fSwgezB4MDBDNiwgIDl9LAorICAgICAgICB7MHgwMDA3LCAgNH0sIHsweDAwMTksICA2fSwgezB4MDAxQSwgIDZ9LCB7MHgwMDM2LCAgN30sCisgICAgICAgIHsweDAwMTAsICA1fSwgezB4MDA2RSwgIDh9LCB7MHgwMDIyLCAgNn0sIHsweDAwMDksICA0fSwKKyAgICAgICAgezB4MDAwQSwgIDR9LCB7MHgwMDE2LCAgNX0sIHsweDAwMjMsICA2fSwgezB4MDAyRSwgIDZ9LAorICAgICAgICB7MHgwMDJGLCAgNn0sIHsweDAwMzAsICA2fSwgezB4MDA2MiwgIDd9LCB7MHgwMDYzLCAgN30sCisgICAgICAgIHsweDAwNjQsICA3fSwgezB4MDA2NSwgIDd9LCB7MHgwMDY2LCAgN30sIHsweDAwNjcsICA3fSwKKyAgICAgICAgezB4MDA2OCwgIDd9LCB7MHgwMDY5LCAgN30sIHsweDAwNkEsICA3fSwgezB4MDA2QiwgIDd9LAorICAgICAgICB7MHgwMDZDLCAgN30sIHsweDAwQzcsICA5fSwgezB4MDBERSwgIDl9LCB7MHgwMERGLCAgOX0sCisgICAgICAgIHsweDA2RDAsIDExfSwgezB4MDFCNSwgIDl9LCB7MHgwMDM3LCAgNn0sIHsweDAwREIsICA4fSwKKyAgICAgICAgezB4MDAxQywgIDV9LCB7MHgwMDc0LCAgN30sIHsweDAxRDQsICA5fSwgezB4MDFENSwgIDl9LAorICAgICAgICB7MHgwMDc2LCAgN30sIHsweDAzNjksIDEwfSwgezB4MzY4OCwgMTR9LCB7MHgzNjg5LCAxNH0sCisgICAgICAgIHsweDM2OEEsIDE0fSwgezB4MDA3NywgIDd9LCB7MHgwM0FDLCAxMH0sIHsweDAwNzgsICA3fSwKKyAgICAgICAgezB4MDBGMiwgIDh9LCB7MHgwMUQ3LCAgOX0sIHsweDAwRjMsICA4fSwgezB4MDA3QSwgIDd9LAorICAgICAgICB7MHgzNjhCLCAxNH0sIHsweDAwN0IsICA3fSwgezB4MDA3QywgIDd9LCB7MHgwM0FELCAxMH0sCisgICAgICAgIHsweDAzRTgsIDEwfSwgezB4MzY4QywgMTR9LCB7MHgzNjhELCAxNH0sIHsweDAzRTksIDEwfSwKKyAgICAgICAgezB4MzY4RSwgMTR9LCB7MHgwMDNGLCAgNn0sIHsweDAxRjUsICA5fSwgezB4MDBGQiwgIDh9LAorICAgICAgICB7MHgzNjhGLCAxNH0sCisgICAgfSx7Ly8xCisgICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwNCwgIDR9LCB7MHgwMDBBLCAgNX0sIHsweDAwMEIsICA1fSwKKyAgICAgICAgezB4MDAxOCwgIDZ9LCB7MHgwMDMyLCAgN30sIHsweDAwMzMsICA3fSwgezB4MDAzNCwgIDd9LAorICAgICAgICB7MHgwMDZBLCAgOH0sIHsweDAwRDYsICA5fSwgezB4MDBENywgIDl9LCB7MHgwMEQ4LCAgOX0sCisgICAgICAgIHsweDAwRDksICA5fSwgezB4MzY4MCwgMTV9LCB7MHgwMUI1LCAxMH0sIHsweDAzNjksIDExfSwKKyAgICAgICAgezB4MDAwNCwgIDN9LCB7MHgwMDBFLCAgNX0sIHsweDAwMUUsICA2fSwgezB4MDAzNywgIDd9LAorICAgICAgICB7MHgwMDBBLCAgNH0sIHsweDAwMTYsICA1fSwgezB4MDAwQywgIDR9LCB7MHgwMDFGLCAgNn0sCisgICAgICAgIHsweDAwNUMsICA3fSwgezB4MDA1RCwgIDd9LCB7MHgwMEJDLCAgOH0sIHsweDAwQkQsICA4fSwKKyAgICAgICAgezB4MDA1RiwgIDd9LCB7MHgwMEQwLCAgOH0sIHsweDAwREIsICA5fSwgezB4MDBEMSwgIDh9LAorICAgICAgICB7MHgwMUE0LCAgOX0sIHsweDAxQTUsICA5fSwgezB4MDFBNiwgIDl9LCB7MHgwMUE3LCAgOX0sCisgICAgICAgIHsweDAzNTAsIDEwfSwgezB4MDZBMiwgMTF9LCB7MHgwNkEzLCAxMX0sIHsweDAxQTksICA5fSwKKyAgICAgICAgezB4MDFBQSwgIDl9LCB7MHgwNkFDLCAxMX0sIHsweDM2ODEsIDE1fSwgezB4MDM1NywgMTB9LAorICAgICAgICB7MHgzNjgyLCAxNX0sIHsweDM2ODMsIDE1fSwgezB4MzY4NCwgMTV9LCB7MHgzNjg1LCAxNX0sCisgICAgICAgIHsweDAwMzYsICA2fSwgezB4MDBENiwgIDh9LCB7MHgzNjg2LCAxNX0sIHsweDM2ODcsIDE1fSwKKyAgICAgICAgezB4MDAwRSwgIDR9LCB7MHgwMDZFLCAgN30sIHsweDAwRDcsICA4fSwgezB4MDZBRCwgMTF9LAorICAgICAgICB7MHgzNjg4LCAxNX0sIHsweDAwMUUsICA1fSwgezB4MDBERSwgIDh9LCB7MHgwNkY4LCAxMX0sCisgICAgICAgIHsweDAzN0QsIDEwfSwgezB4MzY4OSwgMTV9LCB7MHgzNjhBLCAxNX0sIHsweDM2OEIsIDE1fSwKKyAgICAgICAgezB4MzY4QywgMTV9LCB7MHgwMUJGLCAgOX0sIHsweDM2OEQsIDE1fSwgezB4MUI0NywgMTR9LAorICAgICAgICB7MHgzN0M4LCAxNH0sIHsweDM3QzksIDE0fSwgezB4MzdDQSwgMTR9LCB7MHgzN0NCLCAxNH0sCisgICAgICAgIHsweDM3Q0MsIDE0fSwgezB4MDAxRiwgIDV9LCB7MHgzN0NELCAxNH0sIHsweDM3Q0UsIDE0fSwKKyAgICAgICAgezB4MzdDRiwgMTR9LAorICAgIH0sey8vMgorICAgICAgICB7MHgwMDAwLCAgM30sIHsweDAwMDIsICA0fSwgezB4MDAwMywgIDR9LCB7MHgwMDA4LCAgNX0sCisgICAgICAgIHsweDAwMTIsICA2fSwgezB4MDAyNiwgIDd9LCB7MHgwMDE0LCAgNn0sIHsweDAwMjcsICA3fSwKKyAgICAgICAgezB4MDBBOCwgIDl9LCB7MHgwMEE5LCAgOX0sIHsweDAwNTUsICA4fSwgezB4MkIwMCwgMTV9LAorICAgICAgICB7MHgwMEFELCAgOX0sIHsweDJCMDEsIDE1fSwgezB4MkIwMiwgMTV9LCB7MHgyQjAzLCAxNX0sCisgICAgICAgIHsweDAwMDMsICAzfSwgezB4MDAwQiwgIDV9LCB7MHgwMDQwLCAgN30sIHsweDAwNDEsICA3fSwKKyAgICAgICAgezB4MDAwOSwgIDR9LCB7MHgwMDIxLCAgNn0sIHsweDAwMTEsICA1fSwgezB4MDAwQSwgIDR9LAorICAgICAgICB7MHgwMDBCLCAgNH0sIHsweDAwMTgsICA1fSwgezB4MDAzMiwgIDZ9LCB7MHgwMDMzLCAgNn0sCisgICAgICAgIHsweDAwMzQsICA2fSwgezB4MDAzNSwgIDZ9LCB7MHgwMDZDLCAgN30sIHsweDAwNTcsICA4fSwKKyAgICAgICAgezB4MDA2RCwgIDd9LCB7MHgwMERDLCAgOH0sIHsweDAxNTksIDEwfSwgezB4MDBERCwgIDh9LAorICAgICAgICB7MHgwMUJDLCAgOX0sIHsweDAzN0EsIDEwfSwgezB4MDM3QiwgMTB9LCB7MHgwMDM4LCAgNn0sCisgICAgICAgIHsweDAwNzIsICA3fSwgezB4MDFCRSwgIDl9LCB7MHgwMUJGLCAgOX0sIHsweDAwRTYsICA4fSwKKyAgICAgICAgezB4MDM5QywgMTB9LCB7MHgwMUNGLCAgOX0sIHsweDJCMDQsIDE1fSwgezB4MkIwNSwgMTV9LAorICAgICAgICB7MHgwMDc0LCAgN30sIHsweDAxRDQsICA5fSwgezB4MkIwNiwgMTV9LCB7MHgyQjA3LCAxNX0sCisgICAgICAgIHsweDAwMUUsICA1fSwgezB4MDBFQiwgIDh9LCB7MHgxNTg0LCAxNH0sIHsweDE1ODUsIDE0fSwKKyAgICAgICAgezB4MTU4NiwgMTR9LCB7MHgwMDNCLCAgNn0sIHsweDAxRDUsICA5fSwgezB4MDFGMCwgIDl9LAorICAgICAgICB7MHgwMzlELCAxMH0sIHsweDAzRTIsIDEwfSwgezB4MTU4NywgMTR9LCB7MHgxNTg4LCAxNH0sCisgICAgICAgIHsweDE1ODksIDE0fSwgezB4MDBGOSwgIDh9LCB7MHgxNThBLCAxNH0sIHsweDE1OEIsIDE0fSwKKyAgICAgICAgezB4MDNFMywgMTB9LCB7MHgxNThDLCAxNH0sIHsweDE1OEQsIDE0fSwgezB4MDFGNCwgIDl9LAorICAgICAgICB7MHgxNThFLCAxNH0sIHsweDAwM0YsICA2fSwgezB4MDBGQiwgIDh9LCB7MHgwMUY1LCAgOX0sCisgICAgICAgIHsweDE1OEYsIDE0fSwKKyAgICB9LHsvLzMKKyAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDYsICA1fSwgezB4MDAwNywgIDV9LAorICAgICAgICB7MHgwMDEwLCAgNn0sIHsweDAwMTEsICA2fSwgezB4MDAyNCwgIDd9LCB7MHgwMDI1LCAgN30sCisgICAgICAgIHsweDAwMTMsICA2fSwgezB4MDAxNCwgIDZ9LCB7MHgwMDJBLCAgN30sIHsweDAwMkIsICA3fSwKKyAgICAgICAgezB4MDBCMCwgIDl9LCB7MHgwMEIxLCAgOX0sIHsweDAwMkQsICA3fSwgezB4MDA1OSwgIDh9LAorICAgICAgICB7MHgwMDBDLCAgNX0sIHsweDAwMTcsICA2fSwgezB4MDBEMCwgIDl9LCB7MHgwMDM1LCAgN30sCisgICAgICAgIHsweDAwMUIsICA2fSwgezB4MDAzOCwgIDd9LCB7MHgwMDM5LCAgN30sIHsweDAwMDQsICAzfSwKKyAgICAgICAgezB4MDAwNSwgIDN9LCB7MHgwMDBGLCAgNX0sIHsweDAwMTgsICA1fSwgezB4MDAxRCwgIDZ9LAorICAgICAgICB7MHgwMDMyLCAgNn0sIHsweDAwMzMsICA2fSwgezB4MDA2OCwgIDd9LCB7MHgwMDY5LCAgN30sCisgICAgICAgIHsweDAwNjksICA4fSwgezB4MDBENCwgIDh9LCB7MHgwMEQ1LCAgOH0sIHsweDAwRDYsICA4fSwKKyAgICAgICAgezB4MDA2QywgIDd9LCB7MHgwMDM3LCAgNn0sIHsweDAwNkQsICA3fSwgezB4MDA3MCwgIDd9LAorICAgICAgICB7MHgwMDM5LCAgNn0sIHsweDAwRDcsICA4fSwgezB4MDBEMSwgIDl9LCB7MHgzODgwLCAxNH0sCisgICAgICAgIHsweDM4ODEsIDE0fSwgezB4Mzg4MiwgMTR9LCB7MHgwMDc0LCAgN30sIHsweDAxQzUsICA5fSwKKyAgICAgICAgezB4MDA3NSwgIDd9LCB7MHgwMEUzLCAgOH0sIHsweDM4ODMsIDE0fSwgezB4Mzg4NCwgMTR9LAorICAgICAgICB7MHgwMEVDLCAgOH0sIHsweDM4ODUsIDE0fSwgezB4MUM0MywgMTN9LCB7MHgxQzQ0LCAxM30sCisgICAgICAgIHsweDFDNDUsIDEzfSwgezB4MDBFRCwgIDh9LCB7MHgxQzQ2LCAxM30sIHsweDAwM0MsICA2fSwKKyAgICAgICAgezB4MDA3NywgIDd9LCB7MHgwMUU4LCAgOX0sIHsweDAwM0UsICA2fSwgezB4MDA3QiwgIDd9LAorICAgICAgICB7MHgxQzQ3LCAxM30sIHsweDAwN0UsICA3fSwgezB4MDA3RiwgIDd9LCB7MHgxQzQ4LCAxM30sCisgICAgICAgIHsweDFDNDksIDEzfSwgezB4MUM0QSwgMTN9LCB7MHgxQzRCLCAxM30sIHsweDFDNEMsIDEzfSwKKyAgICAgICAgezB4MUM0RCwgMTN9LCB7MHgwMEY1LCAgOH0sIHsweDFDNEUsIDEzfSwgezB4MDFFOSwgIDl9LAorICAgICAgICB7MHgxQzRGLCAxM30sCisgICAgfSx7Ly80CisgICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwNCwgIDR9LCB7MHgwMDBBLCAgNX0sIHsweDAwMEIsICA1fSwKKyAgICAgICAgezB4MDAxOCwgIDZ9LCB7MHgwMDE5LCAgNn0sIHsweDAwMzQsICA3fSwgezB4MDAzNSwgIDd9LAorICAgICAgICB7MHgwMDM2LCAgN30sIHsweDAwNkUsICA4fSwgezB4MDBERSwgIDl9LCB7MHgwMERGLCAgOX0sCisgICAgICAgIHsweDAxQzAsIDEwfSwgezB4MDFDMSwgMTB9LCB7MHgwMUMyLCAxMH0sIHsweDM4NjAsIDE1fSwKKyAgICAgICAgezB4MDAwNCwgIDN9LCB7MHgwMDBGLCAgNX0sIHsweDAwMUQsICA2fSwgezB4MDAzOSwgIDd9LAorICAgICAgICB7MHgwMDBBLCAgNH0sIHsweDAwMkMsICA2fSwgezB4MDAyRCwgIDZ9LCB7MHgwMDBDLCAgNH0sCisgICAgICAgIHsweDAwMTcsICA1fSwgezB4MDAzNCwgIDZ9LCB7MHgwMDM1LCAgNn0sIHsweDAwMzYsICA2fSwKKyAgICAgICAgezB4MDA2RSwgIDd9LCB7MHgwMDZGLCAgN30sIHsweDAwNzAsICA3fSwgezB4MDA3MSwgIDd9LAorICAgICAgICB7MHgwMDcxLCAgOH0sIHsweDAwRTQsICA4fSwgezB4MDBFNSwgIDh9LCB7MHgwMEU2LCAgOH0sCisgICAgICAgIHsweDAwRTcsICA4fSwgezB4MDBFOCwgIDh9LCB7MHgwM0E0LCAxMH0sIHsweDAwNzUsICA3fSwKKyAgICAgICAgezB4MDBFQywgIDh9LCB7MHgwMUQzLCAgOX0sIHsweDAxREEsICA5fSwgezB4MDNBNSwgMTB9LAorICAgICAgICB7MHgwM0I2LCAxMH0sIHsweDA3MEQsIDEyfSwgezB4MDNCNywgMTB9LCB7MHgwNzBFLCAxMn0sCisgICAgICAgIHsweDAwM0MsICA2fSwgezB4MDBFRSwgIDh9LCB7MHgzODYxLCAxNX0sIHsweDM4NjIsIDE1fSwKKyAgICAgICAgezB4MDAzRCwgIDZ9LCB7MHgwMURFLCAgOX0sIHsweDM4NjMsIDE1fSwgezB4Mzg2NCwgMTV9LAorICAgICAgICB7MHgzODY1LCAxNX0sIHsweDAwN0MsICA3fSwgezB4MDcwRiwgMTJ9LCB7MHgwM0JFLCAxMH0sCisgICAgICAgIHsweDAzQkYsIDEwfSwgezB4Mzg2NiwgMTV9LCB7MHgwRkEwLCAxMn0sIHsweDA3RDEsIDExfSwKKyAgICAgICAgezB4Mzg2NywgMTV9LCB7MHgwMEZCLCAgOH0sIHsweDAxRjUsICA5fSwgezB4N0QwOCwgMTV9LAorICAgICAgICB7MHgwRkE0LCAxMn0sIHsweDdEMDksIDE1fSwgezB4N0QwQSwgMTV9LCB7MHg3RDBCLCAxNX0sCisgICAgICAgIHsweDNFODYsIDE0fSwgezB4MDAzRiwgIDZ9LCB7MHgwRkE1LCAxMn0sIHsweDA3RDMsIDExfSwKKyAgICAgICAgezB4M0U4NywgMTR9LAorICAgIH0sey8vNQorICAgICAgICB7MHgwMDAwLCAgM30sIHsweDAwMDIsICA0fSwgezB4MDAwMywgIDR9LCB7MHgwMDA4LCAgNX0sCisgICAgICAgIHsweDAwMDksICA1fSwgezB4MDAxNCwgIDZ9LCB7MHgwMDJBLCAgN30sIHsweDAwNTYsICA4fSwKKyAgICAgICAgezB4MDJCOCwgMTF9LCB7MHgwMEFGLCAgOX0sIHsweDAyQjksIDExfSwgezB4MDE1RCwgMTB9LAorICAgICAgICB7MHgwMkMwLCAxMX0sIHsweDJDMTAsIDE1fSwgezB4MkMxMSwgMTV9LCB7MHgyQzEyLCAxNX0sCisgICAgICAgIHsweDAwMDYsICA0fSwgezB4MDAwRSwgIDV9LCB7MHgwMDE3LCAgNn0sIHsweDAwMkQsICA3fSwKKyAgICAgICAgezB4MDAwRiwgIDV9LCB7MHgwMDQwLCAgN30sIHsweDAwMjEsICA2fSwgezB4MDAwNSwgIDN9LAorICAgICAgICB7MHgwMDA5LCAgNH0sIHsweDAwMTEsICA1fSwgezB4MDAxOCwgIDV9LCB7MHgwMDE5LCAgNX0sCisgICAgICAgIHsweDAwMUEsICA1fSwgezB4MDAzNiwgIDZ9LCB7MHgwMDM3LCAgNn0sIHsweDAwNDEsICA3fSwKKyAgICAgICAgezB4MDA1OSwgIDh9LCB7MHgwMEUwLCAgOH0sIHsweDAwRTEsICA4fSwgezB4MDA3MSwgIDd9LAorICAgICAgICB7MHgwMEU0LCAgOH0sIHsweDAwQjEsICA5fSwgezB4MDJDMiwgMTF9LCB7MHgwMDFELCAgNX0sCisgICAgICAgIHsweDAwNzMsICA3fSwgezB4MDBFNSwgIDh9LCB7MHgwMEYwLCAgOH0sIHsweDAwNzksICA3fSwKKyAgICAgICAgezB4MDNDNCwgMTB9LCB7MHgwMUUzLCAgOX0sIHsweDAxRTgsICA5fSwgezB4MkMxMywgMTV9LAorICAgICAgICB7MHgwMDdCLCAgN30sIHsweDJDMTQsIDE1fSwgezB4MkMxNSwgMTV9LCB7MHgyQzE2LCAxNX0sCisgICAgICAgIHsweDAwN0MsICA3fSwgezB4MDJDMywgMTF9LCB7MHgyQzE3LCAxNX0sIHsweDE2MEMsIDE0fSwKKyAgICAgICAgezB4MTYwRCwgMTR9LCB7MHgwMDdELCAgN30sIHsweDE2MEUsIDE0fSwgezB4MDFFOSwgIDl9LAorICAgICAgICB7MHgwM0M1LCAxMH0sIHsweDAzRDQsIDEwfSwgezB4MDFFQiwgIDl9LCB7MHgxNjBGLCAxNH0sCisgICAgICAgIHsweDNENTAsIDE0fSwgezB4MDBGQywgIDh9LCB7MHgwN0FCLCAxMX0sIHsweDNENTEsIDE0fSwKKyAgICAgICAgezB4M0Q1MiwgMTR9LCB7MHgzRDUzLCAxNH0sIHsweDNENTQsIDE0fSwgezB4MDFGQSwgIDl9LAorICAgICAgICB7MHgzRDU1LCAxNH0sIHsweDAwN0YsICA3fSwgezB4MDFGQiwgIDl9LCB7MHgzRDU2LCAxNH0sCisgICAgICAgIHsweDNENTcsIDE0fSwKKyAgICB9LHsvLzYKKyAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDMsICA0fSwgezB4MDAwOCwgIDV9LAorICAgICAgICB7MHgwMDA5LCAgNX0sIHsweDAwMEEsICA1fSwgezB4MDAwQiwgIDV9LCB7MHgwMDE4LCAgNn0sCisgICAgICAgIHsweDAwMzIsICA3fSwgezB4MDAwRCwgIDV9LCB7MHgwMDMzLCAgN30sIHsweDBFMDAsIDEzfSwKKyAgICAgICAgezB4MDAzOSwgIDd9LCB7MHgwRTAxLCAxM30sIHsweDAwM0EsICA3fSwgezB4MEUwMiwgMTN9LAorICAgICAgICB7MHgwMDA4LCAgNH0sIHsweDAwMUUsICA2fSwgezB4MDAzQiwgIDd9LCB7MHgwMDNFLCAgN30sCisgICAgICAgIHsweDAwMTIsICA1fSwgezB4MDAzRiwgIDd9LCB7MHgwMDEzLCAgNX0sIHsweDAwMjgsICA2fSwKKyAgICAgICAgezB4MDAyOSwgIDZ9LCB7MHgwMDU0LCAgN30sIHsweDAwMkIsICA2fSwgezB4MDA1NSwgIDd9LAorICAgICAgICB7MHgwMDU4LCAgN30sIHsweDBFMDMsIDEzfSwgezB4MDA1OSwgIDd9LCB7MHgwMDVBLCAgN30sCisgICAgICAgIHsweDBFMDQsIDEzfSwgezB4MEUwNSwgMTN9LCB7MHgwNzAzLCAxMn0sIHsweDAwNUIsICA3fSwKKyAgICAgICAgezB4MDA1QywgIDd9LCB7MHgwNzA0LCAxMn0sIHsweDA3MDUsIDEyfSwgezB4MDA1RCwgIDd9LAorICAgICAgICB7MHgwNzA2LCAxMn0sIHsweDA3MDcsIDEyfSwgezB4MDcwOCwgMTJ9LCB7MHgwNzA5LCAxMn0sCisgICAgICAgIHsweDA3MEEsIDEyfSwgezB4MDcwQiwgMTJ9LCB7MHgwMDE4LCAgNX0sIHsweDAwMkYsICA2fSwKKyAgICAgICAgezB4MDAwRCwgIDR9LCB7MHgwMDE5LCAgNX0sIHsweDA3MEMsIDEyfSwgezB4MDA3MCwgIDd9LAorICAgICAgICB7MHgwMDFELCAgNX0sIHsweDA3MEQsIDEyfSwgezB4MDcwRSwgMTJ9LCB7MHgwNzBGLCAxMn0sCisgICAgICAgIHsweDA3MTAsIDEyfSwgezB4MDAzOSwgIDZ9LCB7MHgwNzExLCAxMn0sIHsweDAwM0MsICA2fSwKKyAgICAgICAgezB4MDcxMiwgMTJ9LCB7MHgwNzEzLCAxMn0sIHsweDA3MTQsIDEyfSwgezB4MDcxNSwgMTJ9LAorICAgICAgICB7MHgwNzE2LCAxMn0sIHsweDAwM0QsICA2fSwgezB4MDcxNywgMTJ9LCB7MHgwNzE4LCAxMn0sCisgICAgICAgIHsweDA3MTksIDEyfSwgezB4MDcxQSwgMTJ9LCB7MHgwNzFCLCAxMn0sIHsweDA3MUMsIDEyfSwKKyAgICAgICAgezB4MDcxRCwgMTJ9LCB7MHgwMDFGLCAgNX0sIHsweDA3MUUsIDEyfSwgezB4MDA3MSwgIDd9LAorICAgICAgICB7MHgwNzFGLCAxMn0sCisgICAgfSx7Ly83CisgICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwMiwgIDR9LCB7MHgwMDA2LCAgNX0sIHsweDAwMEUsICA2fSwKKyAgICAgICAgezB4MDAwRiwgIDZ9LCB7MHgwMDQwLCAgOH0sIHsweDAwNDEsICA4fSwgezB4MDA0MiwgIDh9LAorICAgICAgICB7MHgwMjE4LCAxMX0sIHsweDIxOTAsIDE1fSwgezB4MjE5MSwgMTV9LCB7MHgyMTkyLCAxNX0sCisgICAgICAgIHsweDIxOTMsIDE1fSwgezB4MjE5NCwgMTV9LCB7MHgyMTk1LCAxNX0sIHsweDIxOTYsIDE1fSwKKyAgICAgICAgezB4MDAwNSwgIDR9LCB7MHgwMDExLCAgNn0sIHsweDAwMjQsICA3fSwgezB4MDA4NywgIDl9LAorICAgICAgICB7MHgwMDBDLCAgNX0sIHsweDAwNEEsICA4fSwgezB4MDA0QiwgIDh9LCB7MHgwMDAyLCAgMn0sCisgICAgICAgIHsweDAwMDYsICAzfSwgezB4MDAwRCwgIDV9LCB7MHgwMDBFLCAgNX0sIHsweDAwMEYsICA1fSwKKyAgICAgICAgezB4MDAxMywgIDZ9LCB7MHgwMDM4LCAgNn0sIHsweDAwRTQsICA4fSwgezB4MDBFNSwgIDh9LAorICAgICAgICB7MHgwMUNDLCAgOX0sIHsweDAwRTcsICA4fSwgezB4MDA3NCwgIDd9LCB7MHgwMEVBLCAgOH0sCisgICAgICAgIHsweDAxQ0QsICA5fSwgezB4MDIxQSwgMTF9LCB7MHgyMTk3LCAxNX0sIHsweDAwMUUsICA1fSwKKyAgICAgICAgezB4MDA3NiwgIDd9LCB7MHgwMEVCLCAgOH0sIHsweDAxREMsICA5fSwgezB4MDBFRiwgIDh9LAorICAgICAgICB7MHgwMURELCAgOX0sIHsweDAxRjAsICA5fSwgezB4MjE5OCwgMTV9LCB7MHgyMTk5LCAxNX0sCisgICAgICAgIHsweDAwRjksICA4fSwgezB4MDNFMiwgMTB9LCB7MHgyMTlBLCAxNX0sIHsweDIxOUIsIDE1fSwKKyAgICAgICAgezB4MDBGQSwgIDh9LCB7MHgyMTlDLCAxNX0sIHsweDIxOUQsIDE1fSwgezB4MjE5RSwgMTV9LAorICAgICAgICB7MHgyMTlGLCAxNX0sIHsweDAxRjYsICA5fSwgezB4MjFCMCwgMTV9LCB7MHgwMEZDLCAgOH0sCisgICAgICAgIHsweDAxRjcsICA5fSwgezB4MjFCMSwgMTV9LCB7MHgyMUIyLCAxNX0sIHsweDIxQjMsIDE1fSwKKyAgICAgICAgezB4MjFCNCwgMTV9LCB7MHgwMUZBLCAgOX0sIHsweDIxQjUsIDE1fSwgezB4MjFCNiwgMTV9LAorICAgICAgICB7MHgyMUI3LCAxNX0sIHsweDIxQjgsIDE1fSwgezB4MjFCOSwgMTV9LCB7MHgwM0UzLCAxMH0sCisgICAgICAgIHsweDEwREQsIDE0fSwgezB4MDA3RiwgIDd9LCB7MHgwMUZCLCAgOX0sIHsweDEwREUsIDE0fSwKKyAgICAgICAgezB4MTBERiwgMTR9LAorICAgIH0KK307CisjZGVmaW5lIE1BWF9BQ19WTENfQklUUyAxNgorCisjZW5kaWYgLyogQVZDT0RFQ19JTlRSQVg4SFVGX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2l0dWgyNjNkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2l0dWgyNjNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTA3YWMyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaXR1aDI2M2RlYy5jCkBAIC0wLDAgKzEsMTE2MiBAQAorLyoKKyAqIElUVSBIMjYzIGJpdHN0cmVhbSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIEgyNjMrIHN1cHBvcnQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSnVhbiBKLiBTaWVycmFsdGEgUAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaDI2MyBkZWNvZGVyLgorICovCisKKyNkZWZpbmUgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIgMQorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAiaDI2My5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorI2luY2x1ZGUgImZsdi5oIgorI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKKworLy8gVGhlIGRlZmluZXMgYmVsb3cgZGVmaW5lIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IGFyZSByZWFkIGF0IG9uY2UgZm9yCisvLyByZWFkaW5nIHZsYyB2YWx1ZXMuIENoYW5naW5nIHRoZXNlIG1heSBpbXByb3ZlIHNwZWVkIGFuZCBkYXRhIGNhY2hlIG5lZWRzCisvLyBiZSBhd2FyZSB0aG91Z2ggdGhhdCBkZWNyZWFzaW5nIHRoZW0gbWF5IG5lZWQgdGhlIG51bWJlciBvZiBzdGFnZXMgdGhhdCBpcworLy8gcGFzc2VkIHRvIGdldF92bGMqIHRvIGJlIGluY3JlYXNlZC4KKyNkZWZpbmUgTVZfVkxDX0JJVFMgOQorI2RlZmluZSBIMjYzX01CVFlQRV9CX1ZMQ19CSVRTIDYKKyNkZWZpbmUgQ0JQQ19CX1ZMQ19CSVRTIDMKKworc3RhdGljIGNvbnN0IGludCBoMjYzX21iX3R5cGVfYl9tYXBbMTVdPSB7CisgICAgTUJfVFlQRV9ESVJFQ1QyIHwgTUJfVFlQRV9MMEwxLAorICAgIE1CX1RZUEVfRElSRUNUMiB8IE1CX1RZUEVfTDBMMSB8IE1CX1RZUEVfQ0JQLAorICAgIE1CX1RZUEVfRElSRUNUMiB8IE1CX1RZUEVfTDBMMSB8IE1CX1RZUEVfQ0JQIHwgTUJfVFlQRV9RVUFOVCwKKyAgICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX0wwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNQl9UWVBFXzE2eDE2LAorICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfTDAgICB8IE1CX1RZUEVfQ0JQICAgICAgICAgICAgICAgICB8IE1CX1RZUEVfMTZ4MTYsCisgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9MMCAgIHwgTUJfVFlQRV9DQlAgfCBNQl9UWVBFX1FVQU5UIHwgTUJfVFlQRV8xNngxNiwKKyAgICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX0wxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNQl9UWVBFXzE2eDE2LAorICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfTDEgICB8IE1CX1RZUEVfQ0JQICAgICAgICAgICAgICAgICB8IE1CX1RZUEVfMTZ4MTYsCisgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9MMSAgIHwgTUJfVFlQRV9DQlAgfCBNQl9UWVBFX1FVQU5UIHwgTUJfVFlQRV8xNngxNiwKKyAgICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX0wwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNQl9UWVBFXzE2eDE2LAorICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfTDBMMSB8IE1CX1RZUEVfQ0JQICAgICAgICAgICAgICAgICB8IE1CX1RZUEVfMTZ4MTYsCisgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9MMEwxIHwgTUJfVFlQRV9DQlAgfCBNQl9UWVBFX1FVQU5UIHwgTUJfVFlQRV8xNngxNiwKKyAgICAwLCAvL3N0dWZmaW5nCisgICAgTUJfVFlQRV9JTlRSQTR4NCAgICAgICAgICAgICAgICB8IE1CX1RZUEVfQ0JQLAorICAgIE1CX1RZUEVfSU5UUkE0eDQgICAgICAgICAgICAgICAgfCBNQl9UWVBFX0NCUCB8IE1CX1RZUEVfUVVBTlQsCit9OworCit2b2lkIGZmX2gyNjNfc2hvd19waWN0X2luZm8oTXBlZ0VuY0NvbnRleHQgKnMpeworICAgIGlmKHMtPmF2Y3R4LT5kZWJ1ZyZGRl9ERUJVR19QSUNUX0lORk8peworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicXA6JWQgJWMgc2l6ZTolZCBybmQ6JWQlcyVzJXMlcyVzJXMlcyVzJXMgJWQvJWRcbiIsCisgICAgICAgICBzLT5xc2NhbGUsIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihzLT5waWN0X3R5cGUpLAorICAgICAgICAgcy0+Z2Iuc2l6ZV9pbl9iaXRzLCAxLXMtPm5vX3JvdW5kaW5nLAorICAgICAgICAgcy0+b2JtYyA/ICIgQVAiIDogIiIsCisgICAgICAgICBzLT51bXZwbHVzID8gIiBVTVYiIDogIiIsCisgICAgICAgICBzLT5oMjYzX2xvbmdfdmVjdG9ycyA/ICIgTE9ORyIgOiAiIiwKKyAgICAgICAgIHMtPmgyNjNfcGx1cyA/ICIgKyIgOiAiIiwKKyAgICAgICAgIHMtPmgyNjNfYWljID8gIiBBSUMiIDogIiIsCisgICAgICAgICBzLT5hbHRfaW50ZXJfdmxjID8gIiBBSVYiIDogIiIsCisgICAgICAgICBzLT5tb2RpZmllZF9xdWFudCA/ICIgTVEiIDogIiIsCisgICAgICAgICBzLT5sb29wX2ZpbHRlciA/ICIgTE9PUCIgOiAiIiwKKyAgICAgICAgIHMtPmgyNjNfc2xpY2Vfc3RydWN0dXJlZCA/ICIgU1MiIDogIiIsCisgICAgICAgICBzLT5hdmN0eC0+ZnJhbWVyYXRlLm51bSwgcy0+YXZjdHgtPmZyYW1lcmF0ZS5kZW4KKyAgICApOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGVjb2RpbmcgKi8KKworVkxDIGZmX2gyNjNfaW50cmFfTUNCUENfdmxjOworVkxDIGZmX2gyNjNfaW50ZXJfTUNCUENfdmxjOworVkxDIGZmX2gyNjNfY2JweV92bGM7CitzdGF0aWMgVkxDIG12X3ZsYzsKK3N0YXRpYyBWTEMgaDI2M19tYnR5cGVfYl92bGM7CitzdGF0aWMgVkxDIGNicGNfYl92bGM7CisKKy8qIGluaXQgdmxjcyAqLworCisvKiBYWFg6IGZpbmQgYSBiZXR0ZXIgc29sdXRpb24gdG8gaGFuZGxlIHN0YXRpYyBpbml0ICovCithdl9jb2xkIHZvaWQgZmZfaDI2M19kZWNvZGVfaW5pdF92bGModm9pZCkKK3sKKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50IGRvbmUgPSAwOworCisgICAgaWYgKCFkb25lKSB7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmZmZfaDI2M19pbnRyYV9NQ0JQQ192bGMsIElOVFJBX01DQlBDX1ZMQ19CSVRTLCA5LAorICAgICAgICAgICAgICAgICBmZl9oMjYzX2ludHJhX01DQlBDX2JpdHMsIDEsIDEsCisgICAgICAgICAgICAgICAgIGZmX2gyNjNfaW50cmFfTUNCUENfY29kZSwgMSwgMSwgNzIpOworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmZmX2gyNjNfaW50ZXJfTUNCUENfdmxjLCBJTlRFUl9NQ0JQQ19WTENfQklUUywgMjgsCisgICAgICAgICAgICAgICAgIGZmX2gyNjNfaW50ZXJfTUNCUENfYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgZmZfaDI2M19pbnRlcl9NQ0JQQ19jb2RlLCAxLCAxLCAxOTgpOworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmZmX2gyNjNfY2JweV92bGMsIENCUFlfVkxDX0JJVFMsIDE2LAorICAgICAgICAgICAgICAgICAmZmZfaDI2M19jYnB5X3RhYlswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgJmZmX2gyNjNfY2JweV90YWJbMF1bMF0sIDIsIDEsIDY0KTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZtdl92bGMsIE1WX1ZMQ19CSVRTLCAzMywKKyAgICAgICAgICAgICAgICAgJmZmX212dGFiWzBdWzFdLCAyLCAxLAorICAgICAgICAgICAgICAgICAmZmZfbXZ0YWJbMF1bMF0sIDIsIDEsIDUzOCk7CisgICAgICAgIGZmX2luaXRfcmwoJmZmX2gyNjNfcmxfaW50ZXIsIGZmX2gyNjNfc3RhdGljX3JsX3RhYmxlX3N0b3JlWzBdKTsKKyAgICAgICAgZmZfaW5pdF9ybCgmZmZfcmxfaW50cmFfYWljLCBmZl9oMjYzX3N0YXRpY19ybF90YWJsZV9zdG9yZVsxXSk7CisgICAgICAgIElOSVRfVkxDX1JMKGZmX2gyNjNfcmxfaW50ZXIsIDU1NCk7CisgICAgICAgIElOSVRfVkxDX1JMKGZmX3JsX2ludHJhX2FpYywgNTU0KTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZoMjYzX21idHlwZV9iX3ZsYywgSDI2M19NQlRZUEVfQl9WTENfQklUUywgMTUsCisgICAgICAgICAgICAgICAgICZmZl9oMjYzX21idHlwZV9iX3RhYlswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgJmZmX2gyNjNfbWJ0eXBlX2JfdGFiWzBdWzBdLCAyLCAxLCA4MCk7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmY2JwY19iX3ZsYywgQ0JQQ19CX1ZMQ19CSVRTLCA0LAorICAgICAgICAgICAgICAgICAmZmZfY2JwY19iX3RhYlswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgJmZmX2NicGNfYl90YWJbMF1bMF0sIDIsIDEsIDgpOworICAgICAgICBkb25lID0gMTsKKyAgICB9Cit9CisKK2ludCBmZl9oMjYzX2RlY29kZV9tYmEoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IGksIG1iX3BvczsKKworICAgIGZvcihpPTA7IGk8NjsgaSsrKXsKKyAgICAgICAgaWYocy0+bWJfbnVtLTEgPD0gZmZfbWJhX21heFtpXSkgYnJlYWs7CisgICAgfQorICAgIG1iX3Bvcz0gZ2V0X2JpdHMoJnMtPmdiLCBmZl9tYmFfbGVuZ3RoW2ldKTsKKyAgICBzLT5tYl94PSBtYl9wb3MgJSBzLT5tYl93aWR0aDsKKyAgICBzLT5tYl95PSBtYl9wb3MgLyBzLT5tYl93aWR0aDsKKworICAgIHJldHVybiBtYl9wb3M7Cit9CisKKy8qKgorICogRGVjb2RlIHRoZSBncm91cCBvZiBibG9ja3MgaGVhZGVyIG9yIHNsaWNlIGhlYWRlci4KKyAqIEByZXR1cm4gPDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworc3RhdGljIGludCBoMjYzX2RlY29kZV9nb2JfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIHVuc2lnbmVkIGludCB2YWwsIGdvYl9udW1iZXI7CisgICAgaW50IGxlZnQ7CisKKyAgICAvKiBDaGVjayBmb3IgR09CIFN0YXJ0IENvZGUgKi8KKyAgICB2YWwgPSBzaG93X2JpdHMoJnMtPmdiLCAxNik7CisgICAgaWYodmFsKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgLyogV2UgaGF2ZSBhIEdCU0MgcHJvYmFibHkgd2l0aCBHU1RVRkYgKi8KKyAgICBza2lwX2JpdHMoJnMtPmdiLCAxNik7IC8qIERyb3AgdGhlIHplcm9zICovCisgICAgbGVmdD0gZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpOworICAgIC8vTU46IHdlIG11c3QgY2hlY2sgdGhlIGJpdHMgbGVmdCBvciB3ZSBtaWdodCBlbmQgaW4gYSBpbmZpbml0ZSBsb29wIChvciBzZWdmYXVsdCkKKyAgICBmb3IoO2xlZnQ+MTM7IGxlZnQtLSl7CisgICAgICAgIGlmKGdldF9iaXRzMSgmcy0+Z2IpKSBicmVhazsgLyogU2VlayB0aGUgJzEnIGJpdCAqLworICAgIH0KKyAgICBpZihsZWZ0PD0xMykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYocy0+aDI2M19zbGljZV9zdHJ1Y3R1cmVkKXsKKyAgICAgICAgaWYoZ2V0X2JpdHMxKCZzLT5nYik9PTApCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgZmZfaDI2M19kZWNvZGVfbWJhKHMpOworCisgICAgICAgIGlmKHMtPm1iX251bSA+IDE1ODMpCisgICAgICAgICAgICBpZihnZXRfYml0czEoJnMtPmdiKT09MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgcy0+cXNjYWxlID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsgLyogU1FVQU5UICovCisgICAgICAgIGlmKGdldF9iaXRzMSgmcy0+Z2IpPT0wKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAyKTsgLyogR0ZJRCAqLworICAgIH1lbHNleworICAgICAgICBnb2JfbnVtYmVyID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsgLyogR04gKi8KKyAgICAgICAgcy0+bWJfeD0gMDsKKyAgICAgICAgcy0+bWJfeT0gcy0+Z29iX2luZGV4KiBnb2JfbnVtYmVyOworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAyKTsgLyogR0ZJRCAqLworICAgICAgICBzLT5xc2NhbGUgPSBnZXRfYml0cygmcy0+Z2IsIDUpOyAvKiBHUVVBTlQgKi8KKyAgICB9CisKKyAgICBpZihzLT5tYl95ID49IHMtPm1iX2hlaWdodCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYocy0+cXNjYWxlPT0wKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgdGhlIGdyb3VwIG9mIGJsb2NrcyAvIHZpZGVvIHBhY2tldCBoZWFkZXIuCisgKiBAcmV0dXJuIGJpdCBwb3NpdGlvbiBvZiB0aGUgcmVzeW5jX21hcmtlciwgb3IgPDAgaWYgbm9uZSB3YXMgZm91bmQKKyAqLworaW50IGZmX2gyNjNfcmVzeW5jKE1wZWdFbmNDb250ZXh0ICpzKXsKKyAgICBpbnQgbGVmdCwgcG9zLCByZXQ7CisKKyAgICBpZihzLT5jb2RlY19pZD09QVZfQ09ERUNfSURfTVBFRzQpeworICAgICAgICBza2lwX2JpdHMxKCZzLT5nYik7CisgICAgICAgIGFsaWduX2dldF9iaXRzKCZzLT5nYik7CisgICAgfQorCisgICAgaWYoc2hvd19iaXRzKCZzLT5nYiwgMTYpPT0wKXsKKyAgICAgICAgcG9zPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpOworICAgICAgICBpZihDT05GSUdfTVBFRzRfREVDT0RFUiAmJiBzLT5jb2RlY19pZD09QVZfQ09ERUNfSURfTVBFRzQpCisgICAgICAgICAgICByZXQ9IGZmX21wZWc0X2RlY29kZV92aWRlb19wYWNrZXRfaGVhZGVyKHMtPmF2Y3R4LT5wcml2X2RhdGEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQ9IGgyNjNfZGVjb2RlX2dvYl9oZWFkZXIocyk7CisgICAgICAgIGlmKHJldD49MCkKKyAgICAgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorICAgIC8vT0ssIGl0J3Mgbm90IHdoZXJlIGl0IGlzIHN1cHBvc2VkIHRvIGJlIC4uLgorICAgIHMtPmdiPSBzLT5sYXN0X3Jlc3luY19nYjsKKyAgICBhbGlnbl9nZXRfYml0cygmcy0+Z2IpOworICAgIGxlZnQ9IGdldF9iaXRzX2xlZnQoJnMtPmdiKTsKKworICAgIGZvcig7bGVmdD4xNisxKzUrNTsgbGVmdC09OCl7CisgICAgICAgIGlmKHNob3dfYml0cygmcy0+Z2IsIDE2KT09MCl7CisgICAgICAgICAgICBHZXRCaXRDb250ZXh0IGJhaz0gcy0+Z2I7CisKKyAgICAgICAgICAgIHBvcz0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICAgICAgICAgIGlmKENPTkZJR19NUEVHNF9ERUNPREVSICYmIHMtPmNvZGVjX2lkPT1BVl9DT0RFQ19JRF9NUEVHNCkKKyAgICAgICAgICAgICAgICByZXQ9IGZmX21wZWc0X2RlY29kZV92aWRlb19wYWNrZXRfaGVhZGVyKHMtPmF2Y3R4LT5wcml2X2RhdGEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldD0gaDI2M19kZWNvZGVfZ29iX2hlYWRlcihzKTsKKyAgICAgICAgICAgIGlmKHJldD49MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9zOworCisgICAgICAgICAgICBzLT5nYj0gYmFrOworICAgICAgICB9CisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDgpOworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworaW50IGZmX2gyNjNfZGVjb2RlX21vdGlvbihNcGVnRW5jQ29udGV4dCAqIHMsIGludCBwcmVkLCBpbnQgZl9jb2RlKQoreworICAgIGludCBjb2RlLCB2YWwsIHNpZ24sIHNoaWZ0OworICAgIGNvZGUgPSBnZXRfdmxjMigmcy0+Z2IsIG12X3ZsYy50YWJsZSwgTVZfVkxDX0JJVFMsIDIpOworCisgICAgaWYgKGNvZGUgPT0gMCkKKyAgICAgICAgcmV0dXJuIHByZWQ7CisgICAgaWYgKGNvZGUgPCAwKQorICAgICAgICByZXR1cm4gMHhmZmZmOworCisgICAgc2lnbiA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgIHNoaWZ0ID0gZl9jb2RlIC0gMTsKKyAgICB2YWwgPSBjb2RlOworICAgIGlmIChzaGlmdCkgeworICAgICAgICB2YWwgPSAodmFsIC0gMSkgPDwgc2hpZnQ7CisgICAgICAgIHZhbCB8PSBnZXRfYml0cygmcy0+Z2IsIHNoaWZ0KTsKKyAgICAgICAgdmFsKys7CisgICAgfQorICAgIGlmIChzaWduKQorICAgICAgICB2YWwgPSAtdmFsOworICAgIHZhbCArPSBwcmVkOworCisgICAgLyogbW9kdWxvIGRlY29kaW5nICovCisgICAgaWYgKCFzLT5oMjYzX2xvbmdfdmVjdG9ycykgeworICAgICAgICB2YWwgPSBzaWduX2V4dGVuZCh2YWwsIDUgKyBmX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGhvcnJpYmxlIGgyNjMgbG9uZyB2ZWN0b3IgbW9kZSAqLworICAgICAgICBpZiAocHJlZCA8IC0zMSAmJiB2YWwgPCAtNjMpCisgICAgICAgICAgICB2YWwgKz0gNjQ7CisgICAgICAgIGlmIChwcmVkID4gMzIgJiYgdmFsID4gNjMpCisgICAgICAgICAgICB2YWwgLT0gNjQ7CisKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworCisvKiBEZWNvZGUgUlZMQyBvZiBILjI2MysgVU1WICovCitzdGF0aWMgaW50IGgyNjNwX2RlY29kZV91bW90aW9uKE1wZWdFbmNDb250ZXh0ICogcywgaW50IHByZWQpCit7CisgICBpbnQgY29kZSA9IDAsIHNpZ247CisKKyAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgLyogTW90aW9uIGRpZmZlcmVuY2UgPSAwICovCisgICAgICByZXR1cm4gcHJlZDsKKworICAgY29kZSA9IDIgKyBnZXRfYml0czEoJnMtPmdiKTsKKworICAgd2hpbGUgKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgeworICAgICAgY29kZSA8PD0gMTsKKyAgICAgIGNvZGUgKz0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICB9CisgICBzaWduID0gY29kZSAmIDE7CisgICBjb2RlID4+PSAxOworCisgICBjb2RlID0gKHNpZ24pID8gKHByZWQgLSBjb2RlKSA6IChwcmVkICsgY29kZSk7CisgICBhdl9kbG9nKHMtPmF2Y3R4LCJILjI2MysgVU1WIE1vdGlvbiA9ICVkXG4iLCBjb2RlKTsKKyAgIHJldHVybiBjb2RlOworCit9CisKKy8qKgorICogcmVhZCB0aGUgbmV4dCBNVnMgZm9yIE9CTUMuIHllcyB0aGlzIGlzIGEgdWdseSBoYWNrLCBmZWVsIGZyZWUgdG8gc2VuZCBhIHBhdGNoIDopCisgKi8KK3N0YXRpYyB2b2lkIHByZXZpZXdfb2JtYyhNcGVnRW5jQ29udGV4dCAqcyl7CisgICAgR2V0Qml0Q29udGV4dCBnYj0gcy0+Z2I7CisKKyAgICBpbnQgY2JwYywgaSwgcHJlZF94LCBwcmVkX3ksIG14LCBteTsKKyAgICBpbnQxNl90ICptb3RfdmFsOworICAgIGNvbnN0IGludCB4eT0gcy0+bWJfeCArIDEgKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOworICAgIGNvbnN0IGludCBzdHJpZGU9IHMtPmI4X3N0cmlkZSoyOworCisgICAgZm9yKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHMtPmJsb2NrX2luZGV4W2ldKz0gMjsKKyAgICBmb3IoaT00OyBpPDY7IGkrKykKKyAgICAgICAgcy0+YmxvY2tfaW5kZXhbaV0rPSAxOworICAgIHMtPm1iX3grKzsKKworICAgIGF2X2Fzc2VydDIocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKTsKKworICAgIGRveworICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgICAgIC8qIHNraXAgbWIgKi8KKyAgICAgICAgICAgIG1vdF92YWwgPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVtzLT5ibG9ja19pbmRleFswXV07CisgICAgICAgICAgICBtb3RfdmFsWzAgICAgICAgXT0gbW90X3ZhbFsyICAgICAgIF09CisgICAgICAgICAgICBtb3RfdmFsWzArc3RyaWRlXT0gbW90X3ZhbFsyK3N0cmlkZV09IDA7CisgICAgICAgICAgICBtb3RfdmFsWzEgICAgICAgXT0gbW90X3ZhbFszICAgICAgIF09CisgICAgICAgICAgICBtb3RfdmFsWzErc3RyaWRlXT0gbW90X3ZhbFszK3N0cmlkZV09IDA7CisKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IE1CX1RZUEVfU0tJUCB8IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0wwOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgY2JwYyA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19pbnRlcl9NQ0JQQ192bGMudGFibGUsIElOVEVSX01DQlBDX1ZMQ19CSVRTLCAyKTsKKyAgICB9d2hpbGUoY2JwYyA9PSAyMCk7CisKKyAgICBpZihjYnBjICYgNCl7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IE1CX1RZUEVfSU5UUkE7CisgICAgfWVsc2V7CisgICAgICAgIGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19jYnB5X3ZsYy50YWJsZSwgQ0JQWV9WTENfQklUUywgMSk7CisgICAgICAgIGlmIChjYnBjICYgOCkgeworICAgICAgICAgICAgaWYocy0+bW9kaWZpZWRfcXVhbnQpeworICAgICAgICAgICAgICAgIGlmKGdldF9iaXRzMSgmcy0+Z2IpKSBza2lwX2JpdHMoJnMtPmdiLCAxKTsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgNSk7CisgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChjYnBjICYgMTYpID09IDApIHsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0gPSBNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV9MMDsKKyAgICAgICAgICAgICAgICAvKiAxNngxNiBtb3Rpb24gcHJlZGljdGlvbiAqLworICAgICAgICAgICAgICAgIG1vdF92YWw9IGZmX2gyNjNfcHJlZF9tb3Rpb24ocywgMCwgMCwgJnByZWRfeCwgJnByZWRfeSk7CisgICAgICAgICAgICAgICAgaWYgKHMtPnVtdnBsdXMpCisgICAgICAgICAgICAgICAgICAgbXggPSBoMjYzcF9kZWNvZGVfdW1vdGlvbihzLCBwcmVkX3gpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICBteCA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3gsIDEpOworCisgICAgICAgICAgICAgICAgaWYgKHMtPnVtdnBsdXMpCisgICAgICAgICAgICAgICAgICAgbXkgPSBoMjYzcF9kZWNvZGVfdW1vdGlvbihzLCBwcmVkX3kpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICBteSA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3ksIDEpOworCisgICAgICAgICAgICAgICAgbW90X3ZhbFswICAgICAgIF09IG1vdF92YWxbMiAgICAgICBdPQorICAgICAgICAgICAgICAgIG1vdF92YWxbMCtzdHJpZGVdPSBtb3RfdmFsWzIrc3RyaWRlXT0gbXg7CisgICAgICAgICAgICAgICAgbW90X3ZhbFsxICAgICAgIF09IG1vdF92YWxbMyAgICAgICBdPQorICAgICAgICAgICAgICAgIG1vdF92YWxbMStzdHJpZGVdPSBtb3RfdmFsWzMrc3RyaWRlXT0gbXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0gPSBNQl9UWVBFXzh4OCB8IE1CX1RZUEVfTDA7CisgICAgICAgICAgICBmb3IoaT0wO2k8NDtpKyspIHsKKyAgICAgICAgICAgICAgICBtb3RfdmFsID0gZmZfaDI2M19wcmVkX21vdGlvbihzLCBpLCAwLCAmcHJlZF94LCAmcHJlZF95KTsKKyAgICAgICAgICAgICAgICBpZiAocy0+dW12cGx1cykKKyAgICAgICAgICAgICAgICAgIG14ID0gaDI2M3BfZGVjb2RlX3Vtb3Rpb24ocywgcHJlZF94KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBteCA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3gsIDEpOworCisgICAgICAgICAgICAgICAgaWYgKHMtPnVtdnBsdXMpCisgICAgICAgICAgICAgICAgICBteSA9IGgyNjNwX2RlY29kZV91bW90aW9uKHMsIHByZWRfeSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF95LCAxKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+dW12cGx1cyAmJiAobXggLSBwcmVkX3gpID09IDEgJiYgKG15IC0gcHJlZF95KSA9PSAxKQorICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOyAvKiBCaXQgc3R1ZmZpbmcgdG8gcHJldmVudCBQU0MgKi8KKyAgICAgICAgICAgICAgICBtb3RfdmFsWzBdID0gbXg7CisgICAgICAgICAgICAgICAgbW90X3ZhbFsxXSA9IG15OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorZW5kOgorCisgICAgZm9yKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHMtPmJsb2NrX2luZGV4W2ldLT0gMjsKKyAgICBmb3IoaT00OyBpPDY7IGkrKykKKyAgICAgICAgcy0+YmxvY2tfaW5kZXhbaV0tPSAxOworICAgIHMtPm1iX3gtLTsKKworICAgIHMtPmdiPSBnYjsKK30KKworc3RhdGljIHZvaWQgaDI2M19kZWNvZGVfZHF1YW50KE1wZWdFbmNDb250ZXh0ICpzKXsKKyAgICBzdGF0aWMgY29uc3QgaW50OF90IHF1YW50X3RhYls0XSA9IHsgLTEsIC0yLCAxLCAyIH07CisKKyAgICBpZihzLT5tb2RpZmllZF9xdWFudCl7CisgICAgICAgIGlmKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICAgICAgcy0+cXNjYWxlPSBmZl9tb2RpZmllZF9xdWFudF90YWJbZ2V0X2JpdHMxKCZzLT5nYildWyBzLT5xc2NhbGUgXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+cXNjYWxlPSBnZXRfYml0cygmcy0+Z2IsIDUpOworICAgIH1lbHNlCisgICAgICAgIHMtPnFzY2FsZSArPSBxdWFudF90YWJbZ2V0X2JpdHMoJnMtPmdiLCAyKV07CisgICAgZmZfc2V0X3FzY2FsZShzLCBzLT5xc2NhbGUpOworfQorCitzdGF0aWMgaW50IGgyNjNfZGVjb2RlX2Jsb2NrKE1wZWdFbmNDb250ZXh0ICogcywgaW50MTZfdCAqIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IGNvZGVkKQoreworICAgIGludCBsZXZlbCwgaSwgaiwgcnVuOworICAgIFJMVGFibGUgKnJsID0gJmZmX2gyNjNfcmxfaW50ZXI7CisgICAgY29uc3QgdWludDhfdCAqc2Nhbl90YWJsZTsKKyAgICBHZXRCaXRDb250ZXh0IGdiPSBzLT5nYjsKKworICAgIHNjYW5fdGFibGUgPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZDsKKyAgICBpZiAocy0+aDI2M19haWMgJiYgcy0+bWJfaW50cmEpIHsKKyAgICAgICAgcmwgPSAmZmZfcmxfaW50cmFfYWljOworICAgICAgICBpID0gMDsKKyAgICAgICAgaWYgKHMtPmFjX3ByZWQpIHsKKyAgICAgICAgICAgIGlmIChzLT5oMjYzX2FpY19kaXIpCisgICAgICAgICAgICAgICAgc2Nhbl90YWJsZSA9IHMtPmludHJhX3Zfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7IC8qIGxlZnQgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzY2FuX3RhYmxlID0gcy0+aW50cmFfaF9zY2FudGFibGUucGVybXV0YXRlZDsgLyogdG9wICovCisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgIC8qIERDIGNvZWYgKi8KKyAgICAgICAgaWYocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlYxMCl7CisjaWYgQ09ORklHX1JWMTBfREVDT0RFUgorICAgICAgICAgIGlmIChzLT5ydjEwX3ZlcnNpb24gPT0gMyAmJiBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgICAgIGludCBjb21wb25lbnQsIGRpZmY7CisgICAgICAgICAgICBjb21wb25lbnQgPSAobiA8PSAzID8gMCA6IG4gLSA0ICsgMSk7CisgICAgICAgICAgICBsZXZlbCA9IHMtPmxhc3RfZGNbY29tcG9uZW50XTsKKyAgICAgICAgICAgIGlmIChzLT5ydjEwX2ZpcnN0X2RjX2NvZGVkW2NvbXBvbmVudF0pIHsKKyAgICAgICAgICAgICAgICBkaWZmID0gZmZfcnZfZGVjb2RlX2RjKHMsIG4pOworICAgICAgICAgICAgICAgIGlmIChkaWZmID09IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGxldmVsICs9IGRpZmY7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbCAmIDB4ZmY7IC8qIGhhbmRsZSB3cmFwIHJvdW5kICovCisgICAgICAgICAgICAgICAgcy0+bGFzdF9kY1tjb21wb25lbnRdID0gbGV2ZWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPnJ2MTBfZmlyc3RfZGNfY29kZWRbY29tcG9uZW50XSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsID09IDI1NSkKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAxMjg7CisgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgbGV2ZWwgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgaWYoKGxldmVsJjB4N0YpID09IDApeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBkYyAlZCBhdCAlZCAlZFxuIiwgbGV2ZWwsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgICAgIGlmKHMtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9CSVRTVFJFQU18QVZfRUZfQ09NUExJQU5UKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxldmVsID09IDI1NSkKKyAgICAgICAgICAgICAgICBsZXZlbCA9IDEyODsKKyAgICAgICAgfQorICAgICAgICBibG9ja1swXSA9IGxldmVsOworICAgICAgICBpID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpID0gMDsKKyAgICB9CisgICAgaWYgKCFjb2RlZCkgeworICAgICAgICBpZiAocy0+bWJfaW50cmEgJiYgcy0+aDI2M19haWMpCisgICAgICAgICAgICBnb3RvIG5vdF9jb2RlZDsKKyAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSA9IGkgLSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CityZXRyeToKKyAgICB7CisgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgaS0tOyAvLyBvZmZzZXQgYnkgLTEgdG8gYWxsb3cgZGlyZWN0IGluZGV4aW5nIG9mIHNjYW5fdGFibGUKKyAgICBmb3IoOzspIHsKKyAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOworICAgICAgICBHRVRfUkxfVkxDKGxldmVsLCBydW4sIHJlLCAmcy0+Z2IsIHJsLT5ybF92bGNbMF0sIFRFWF9WTENfQklUUywgMiwgMCk7CisgICAgICAgIGlmIChydW4gPT0gNjYpIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCl7CisgICAgICAgICAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBhYyB2bGMgY29kZSBhdCAlZHglZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZXNjYXBlICovCisgICAgICAgICAgICBpZiAoQ09ORklHX0ZMVl9ERUNPREVSICYmIHMtPmgyNjNfZmx2ID4gMSkgeworICAgICAgICAgICAgICAgIGludCBpczExID0gU0hPV19VQklUUyhyZSwgJnMtPmdiLCAxKTsKKyAgICAgICAgICAgICAgICBTS0lQX0NBQ0hFKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgICAgIHJ1biA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgNykgKyAxOworICAgICAgICAgICAgICAgIGlmIChpczExKSB7CisgICAgICAgICAgICAgICAgICAgIFNLSVBfQ09VTlRFUihyZSwgJnMtPmdiLCAxICsgNyk7CisgICAgICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDExKTsKKyAgICAgICAgICAgICAgICAgICAgU0tJUF9DT1VOVEVSKHJlLCAmcy0+Z2IsIDExKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTS0lQX0NBQ0hFKHJlLCAmcy0+Z2IsIDcpOworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IFNIT1dfU0JJVFMocmUsICZzLT5nYiwgNyk7CisgICAgICAgICAgICAgICAgICAgIFNLSVBfQ09VTlRFUihyZSwgJnMtPmdiLCAxICsgNyArIDcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVuID0gU0hPV19VQklUUyhyZSwgJnMtPmdiLCA3KSArIDE7CisgICAgICAgICAgICAgICAgU0tJUF9DQUNIRShyZSwgJnMtPmdiLCA3KTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChpbnQ4X3QpU0hPV19VQklUUyhyZSwgJnMtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICBTS0lQX0NPVU5URVIocmUsICZzLT5nYiwgNyArIDgpOworICAgICAgICAgICAgICAgIGlmKGxldmVsID09IC0xMjgpeworICAgICAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjEwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFg6IHNob3VsZCBwYXRjaCBlbmNvZGVyIHRvbyAqLworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNLSVBfQ09VTlRFUihyZSwgJnMtPmdiLCAxMik7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDUpOworICAgICAgICAgICAgICAgICAgICAgICAgU0tJUF9DQUNIRShyZSwgJnMtPmdiLCA1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIHw9IFNIT1dfU0JJVFMocmUsICZzLT5nYiwgNik8PDU7CisgICAgICAgICAgICAgICAgICAgICAgICBTS0lQX0NPVU5URVIocmUsICZzLT5nYiwgNSArIDYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKFNIT1dfVUJJVFMocmUsICZzLT5nYiwgMSkpCisgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICBTS0lQX0NPVU5URVIocmUsICZzLT5nYiwgMSk7CisgICAgICAgIH0KKyAgICAgICAgaSArPSBydW47CisgICAgICAgIGlmIChpID49IDY0KXsKKyAgICAgICAgICAgIENMT1NFX1JFQURFUihyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgIC8vIHJlZG8gdXBkYXRlIHdpdGhvdXQgbGFzdCBmbGFnLCByZXZlcnQgLTEgb2Zmc2V0CisgICAgICAgICAgICBpID0gaSAtIHJ1biArICgocnVuLTEpJjYzKSArIDE7CisgICAgICAgICAgICBpZiAoaSA8IDY0KSB7CisgICAgICAgICAgICAgICAgLy8gb25seSBsYXN0IG1hcmtlciwgbm8gb3ZlcnJ1bgorICAgICAgICAgICAgICAgIGJsb2NrW3NjYW5fdGFibGVbaV1dID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihzLT5hbHRfaW50ZXJfdmxjICYmIHJsID09ICZmZl9oMjYzX3JsX2ludGVyICYmICFzLT5tYl9pbnRyYSl7CisgICAgICAgICAgICAgICAgLy9Mb29rcyBsaWtlIGEgaGFjayBidXQgbm8sIGl0J3MgdGhlIHdheSBpdCBpcyBzdXBwb3NlZCB0byB3b3JrIC4uLgorICAgICAgICAgICAgICAgIHJsID0gJmZmX3JsX2ludHJhX2FpYzsKKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICBzLT5nYj0gZ2I7CisgICAgICAgICAgICAgICAgcy0+YmRzcC5jbGVhcl9ibG9jayhibG9jayk7CisgICAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicnVuIG92ZXJmbG93IGF0ICVkeCVkIGk6JWRcbiIsIHMtPm1iX3gsIHMtPm1iX3ksIHMtPm1iX2ludHJhKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBqID0gc2Nhbl90YWJsZVtpXTsKKyAgICAgICAgYmxvY2tbal0gPSBsZXZlbDsKKyAgICB9CisgICAgfQorbm90X2NvZGVkOgorICAgIGlmIChzLT5tYl9pbnRyYSAmJiBzLT5oMjYzX2FpYykgeworICAgICAgICBmZl9oMjYzX3ByZWRfYWNkYyhzLCBibG9jaywgbik7CisgICAgICAgIGkgPSA2MzsKKyAgICB9CisgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSA9IGk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDI2M19za2lwX2JfcGFydChNcGVnRW5jQ29udGV4dCAqcywgaW50IGNicCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIGRibG9jaywgWzY0XSk7CisgICAgaW50IGksIG1iaTsKKyAgICBpbnQgYmxpWzZdOworCisgICAgLyogd2UgaGF2ZSB0byBzZXQgcy0+bWJfaW50cmEgdG8gemVybyB0byBkZWNvZGUgQi1wYXJ0IG9mIFBCLWZyYW1lIGNvcnJlY3RseQorICAgICAqIGJ1dCByZWFsIHZhbHVlIHNob3VsZCBiZSByZXN0b3JlZCBpbiBvcmRlciB0byBiZSB1c2VkIGxhdGVyIChpbiBPQk1DIGNvbmRpdGlvbikKKyAgICAgKi8KKyAgICBtYmkgPSBzLT5tYl9pbnRyYTsKKyAgICBtZW1jcHkoYmxpLCBzLT5ibG9ja19sYXN0X2luZGV4LCBzaXplb2YoYmxpKSk7CisgICAgcy0+bWJfaW50cmEgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgaWYgKGgyNjNfZGVjb2RlX2Jsb2NrKHMsIGRibG9jaywgaSwgY2JwJjMyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNicCs9Y2JwOworICAgIH0KKyAgICBzLT5tYl9pbnRyYSA9IG1iaTsKKyAgICBtZW1jcHkocy0+YmxvY2tfbGFzdF9pbmRleCwgYmxpLCBzaXplb2YoYmxpKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDI2M19nZXRfbW9kYihHZXRCaXRDb250ZXh0ICpnYiwgaW50IHBiX2ZyYW1lLCBpbnQgKmNicGIpCit7CisgICAgaW50IGMsIG12ID0gMTsKKworICAgIGlmIChwYl9mcmFtZSA8IDMpIHsgLy8gaC4yNjMgQW5uZXggRyBhbmQgaTI2MyBQQi1mcmFtZQorICAgICAgICBjID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKHBiX2ZyYW1lID09IDIgJiYgYykKKyAgICAgICAgICAgIG12ID0gIWdldF9iaXRzMShnYik7CisgICAgfSBlbHNlIHsgLy8gaC4yNjMgQW5uZXggTSBpbXByb3ZlZCBQQi1mcmFtZQorICAgICAgICBtdiA9IGdldF91bmFyeShnYiwgMCwgNCkgKyAxOworICAgICAgICBjID0gbXYgJiAxOworICAgICAgICBtdiA9ICEhKG12ICYgMik7CisgICAgfQorICAgIGlmKGMpCisgICAgICAgICpjYnBiID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgIHJldHVybiBtdjsKK30KKworaW50IGZmX2gyNjNfZGVjb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgYmxvY2tbNl1bNjRdKQoreworICAgIGludCBjYnBjLCBjYnB5LCBpLCBjYnAsIHByZWRfeCwgcHJlZF95LCBteCwgbXksIGRxdWFudDsKKyAgICBpbnQxNl90ICptb3RfdmFsOworICAgIGNvbnN0IGludCB4eT0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisgICAgaW50IGNicGIgPSAwLCBwYl9tdl9jb3VudCA9IDA7CisKKyAgICBhdl9hc3NlcnQyKCFzLT5oMjYzX3ByZWQpOworCisgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkgeworICAgICAgICBkb3sKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgIC8qIHNraXAgbWIgKi8KKyAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYSA9IDA7CisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPDY7aSsrKQorICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4W2ldID0gLTE7CisgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgcy0+bXZfdHlwZSA9IE1WX1RZUEVfMTZYMTY7CisgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbeHldID0gTUJfVFlQRV9TS0lQIHwgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfTDA7CisgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSAwOworICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdID0gMDsKKyAgICAgICAgICAgICAgICBzLT5tYl9za2lwcGVkID0gIShzLT5vYm1jIHwgcy0+bG9vcF9maWx0ZXIpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2JwYyA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19pbnRlcl9NQ0JQQ192bGMudGFibGUsIElOVEVSX01DQlBDX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgIGlmIChjYnBjIDwgMCl7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjYnBjIGRhbWFnZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfXdoaWxlKGNicGMgPT0gMjApOworCisgICAgICAgIHMtPmJkc3AuY2xlYXJfYmxvY2tzKHMtPmJsb2NrWzBdKTsKKworICAgICAgICBkcXVhbnQgPSBjYnBjICYgODsKKyAgICAgICAgcy0+bWJfaW50cmEgPSAoKGNicGMgJiA0KSAhPSAwKTsKKyAgICAgICAgaWYgKHMtPm1iX2ludHJhKSBnb3RvIGludHJhOworCisgICAgICAgIGlmKHMtPnBiX2ZyYW1lICYmIGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICAgICAgcGJfbXZfY291bnQgPSBoMjYzX2dldF9tb2RiKCZzLT5nYiwgcy0+cGJfZnJhbWUsICZjYnBiKTsKKyAgICAgICAgY2JweSA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19jYnB5X3ZsYy50YWJsZSwgQ0JQWV9WTENfQklUUywgMSk7CisKKyAgICAgICAgaWYocy0+YWx0X2ludGVyX3ZsYz09MCB8fCAoY2JwYyAmIDMpIT0zKQorICAgICAgICAgICAgY2JweSBePSAweEY7CisKKyAgICAgICAgY2JwID0gKGNicGMgJiAzKSB8IChjYnB5IDw8IDIpOworICAgICAgICBpZiAoZHF1YW50KSB7CisgICAgICAgICAgICBoMjYzX2RlY29kZV9kcXVhbnQocyk7CisgICAgICAgIH0KKworICAgICAgICBzLT5tdl9kaXIgPSBNVl9ESVJfRk9SV0FSRDsKKyAgICAgICAgaWYgKChjYnBjICYgMTYpID09IDApIHsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0wwOworICAgICAgICAgICAgLyogMTZ4MTYgbW90aW9uIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgZmZfaDI2M19wcmVkX21vdGlvbihzLCAwLCAwLCAmcHJlZF94LCAmcHJlZF95KTsKKyAgICAgICAgICAgIGlmIChzLT51bXZwbHVzKQorICAgICAgICAgICAgICAgbXggPSBoMjYzcF9kZWNvZGVfdW1vdGlvbihzLCBwcmVkX3gpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgbXggPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF94LCAxKTsKKworICAgICAgICAgICAgaWYgKG14ID49IDB4ZmZmZikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIGlmIChzLT51bXZwbHVzKQorICAgICAgICAgICAgICAgbXkgPSBoMjYzcF9kZWNvZGVfdW1vdGlvbihzLCBwcmVkX3kpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF95LCAxKTsKKworICAgICAgICAgICAgaWYgKG15ID49IDB4ZmZmZikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9IG14OworICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSBteTsKKworICAgICAgICAgICAgaWYgKHMtPnVtdnBsdXMgJiYgKG14IC0gcHJlZF94KSA9PSAxICYmIChteSAtIHByZWRfeSkgPT0gMSkKKyAgICAgICAgICAgICAgIHNraXBfYml0czEoJnMtPmdiKTsgLyogQml0IHN0dWZmaW5nIHRvIHByZXZlbnQgUFNDICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0gPSBNQl9UWVBFXzh4OCB8IE1CX1RZUEVfTDA7CisgICAgICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV84WDg7CisgICAgICAgICAgICBmb3IoaT0wO2k8NDtpKyspIHsKKyAgICAgICAgICAgICAgICBtb3RfdmFsID0gZmZfaDI2M19wcmVkX21vdGlvbihzLCBpLCAwLCAmcHJlZF94LCAmcHJlZF95KTsKKyAgICAgICAgICAgICAgICBpZiAocy0+dW12cGx1cykKKyAgICAgICAgICAgICAgICAgIG14ID0gaDI2M3BfZGVjb2RlX3Vtb3Rpb24ocywgcHJlZF94KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBteCA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3gsIDEpOworICAgICAgICAgICAgICAgIGlmIChteCA+PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgIGlmIChzLT51bXZwbHVzKQorICAgICAgICAgICAgICAgICAgbXkgPSBoMjYzcF9kZWNvZGVfdW1vdGlvbihzLCBwcmVkX3kpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG15ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKG15ID49IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzBdID0gbXg7CisgICAgICAgICAgICAgICAgcy0+bXZbMF1baV1bMV0gPSBteTsKKyAgICAgICAgICAgICAgICBpZiAocy0+dW12cGx1cyAmJiAobXggLSBwcmVkX3gpID09IDEgJiYgKG15IC0gcHJlZF95KSA9PSAxKQorICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOyAvKiBCaXQgc3R1ZmZpbmcgdG8gcHJldmVudCBQU0MgKi8KKyAgICAgICAgICAgICAgICBtb3RfdmFsWzBdID0gbXg7CisgICAgICAgICAgICAgICAgbW90X3ZhbFsxXSA9IG15OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmKHMtPnBpY3RfdHlwZT09QVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgaW50IG1iX3R5cGU7CisgICAgICAgIGNvbnN0IGludCBzdHJpZGU9IHMtPmI4X3N0cmlkZTsKKyAgICAgICAgaW50MTZfdCAqbW90X3ZhbDAgPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVsyICogKHMtPm1iX3ggKyBzLT5tYl95ICogc3RyaWRlKV07CisgICAgICAgIGludDE2X3QgKm1vdF92YWwxID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bMiAqIChzLT5tYl94ICsgcy0+bWJfeSAqIHN0cmlkZSldOworLy8gICAgICAgIGNvbnN0IGludCBtdl94eT0gcy0+bWJfeCArIDEgKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOworCisgICAgICAgIC8vRklYTUUgdWdseQorICAgICAgICBtb3RfdmFsMFswICAgICAgIF09IG1vdF92YWwwWzIgICAgICAgXT0gbW90X3ZhbDBbMCsyKnN0cmlkZV09IG1vdF92YWwwWzIrMipzdHJpZGVdPQorICAgICAgICBtb3RfdmFsMFsxICAgICAgIF09IG1vdF92YWwwWzMgICAgICAgXT0gbW90X3ZhbDBbMSsyKnN0cmlkZV09IG1vdF92YWwwWzMrMipzdHJpZGVdPQorICAgICAgICBtb3RfdmFsMVswICAgICAgIF09IG1vdF92YWwxWzIgICAgICAgXT0gbW90X3ZhbDFbMCsyKnN0cmlkZV09IG1vdF92YWwxWzIrMipzdHJpZGVdPQorICAgICAgICBtb3RfdmFsMVsxICAgICAgIF09IG1vdF92YWwxWzMgICAgICAgXT0gbW90X3ZhbDFbMSsyKnN0cmlkZV09IG1vdF92YWwxWzMrMipzdHJpZGVdPSAwOworCisgICAgICAgIGRveworICAgICAgICAgICAgbWJfdHlwZT0gZ2V0X3ZsYzIoJnMtPmdiLCBoMjYzX21idHlwZV9iX3ZsYy50YWJsZSwgSDI2M19NQlRZUEVfQl9WTENfQklUUywgMik7CisgICAgICAgICAgICBpZiAobWJfdHlwZSA8IDApeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYiBtYl90eXBlIGRhbWFnZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWJfdHlwZT0gaDI2M19tYl90eXBlX2JfbWFwWyBtYl90eXBlIF07CisgICAgICAgIH13aGlsZSghbWJfdHlwZSk7CisKKyAgICAgICAgcy0+bWJfaW50cmEgPSBJU19JTlRSQShtYl90eXBlKTsKKyAgICAgICAgaWYoSEFTX0NCUChtYl90eXBlKSl7CisgICAgICAgICAgICBzLT5iZHNwLmNsZWFyX2Jsb2NrcyhzLT5ibG9ja1swXSk7CisgICAgICAgICAgICBjYnBjID0gZ2V0X3ZsYzIoJnMtPmdiLCBjYnBjX2JfdmxjLnRhYmxlLCBDQlBDX0JfVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgaWYocy0+bWJfaW50cmEpeworICAgICAgICAgICAgICAgIGRxdWFudCA9IElTX1FVQU5UKG1iX3R5cGUpOworICAgICAgICAgICAgICAgIGdvdG8gaW50cmE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNicHkgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX2gyNjNfY2JweV92bGMudGFibGUsIENCUFlfVkxDX0JJVFMsIDEpOworCisgICAgICAgICAgICBpZiAoY2JweSA8IDApeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYiBjYnB5IGRhbWFnZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYocy0+YWx0X2ludGVyX3ZsYz09MCB8fCAoY2JwYyAmIDMpIT0zKQorICAgICAgICAgICAgICAgIGNicHkgXj0gMHhGOworCisgICAgICAgICAgICBjYnAgPSAoY2JwYyAmIDMpIHwgKGNicHkgPDwgMik7CisgICAgICAgIH1lbHNlCisgICAgICAgICAgICBjYnA9MDsKKworICAgICAgICBhdl9hc3NlcnQyKCFzLT5tYl9pbnRyYSk7CisKKyAgICAgICAgaWYoSVNfUVVBTlQobWJfdHlwZSkpeworICAgICAgICAgICAgaDI2M19kZWNvZGVfZHF1YW50KHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYoSVNfRElSRUNUKG1iX3R5cGUpKXsKKyAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEIHwgTVZfRElSX0JBQ0tXQVJEIHwgTVZfRElSRUNUOworICAgICAgICAgICAgbWJfdHlwZSB8PSBmZl9tcGVnNF9zZXRfZGlyZWN0X212KHMsIDAsIDApOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHMtPm12X2RpciA9IDA7CisgICAgICAgICAgICBzLT5tdl90eXBlPSBNVl9UWVBFXzE2WDE2OworLy9GSVhNRSBVTVYKKworICAgICAgICAgICAgaWYoVVNFU19MSVNUKG1iX3R5cGUsIDApKXsKKyAgICAgICAgICAgICAgICBpbnQxNl90ICptb3RfdmFsPSBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIDAsIDAsICZteCwgJm15KTsKKyAgICAgICAgICAgICAgICBzLT5tdl9kaXIgPSBNVl9ESVJfRk9SV0FSRDsKKworICAgICAgICAgICAgICAgIG14ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIG14LCAxKTsKKyAgICAgICAgICAgICAgICBteSA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBteSwgMSk7CisKKyAgICAgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9IG14OworICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdID0gbXk7CisgICAgICAgICAgICAgICAgbW90X3ZhbFswICAgICAgIF09IG1vdF92YWxbMiAgICAgICBdPSBtb3RfdmFsWzArMipzdHJpZGVdPSBtb3RfdmFsWzIrMipzdHJpZGVdPSBteDsKKyAgICAgICAgICAgICAgICBtb3RfdmFsWzEgICAgICAgXT0gbW90X3ZhbFszICAgICAgIF09IG1vdF92YWxbMSsyKnN0cmlkZV09IG1vdF92YWxbMysyKnN0cmlkZV09IG15OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihVU0VTX0xJU1QobWJfdHlwZSwgMSkpeworICAgICAgICAgICAgICAgIGludDE2X3QgKm1vdF92YWw9IGZmX2gyNjNfcHJlZF9tb3Rpb24ocywgMCwgMSwgJm14LCAmbXkpOworICAgICAgICAgICAgICAgIHMtPm12X2RpciB8PSBNVl9ESVJfQkFDS1dBUkQ7CisKKyAgICAgICAgICAgICAgICBteCA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBteCwgMSk7CisgICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgbXksIDEpOworCisgICAgICAgICAgICAgICAgcy0+bXZbMV1bMF1bMF0gPSBteDsKKyAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVsxXSA9IG15OworICAgICAgICAgICAgICAgIG1vdF92YWxbMCAgICAgICBdPSBtb3RfdmFsWzIgICAgICAgXT0gbW90X3ZhbFswKzIqc3RyaWRlXT0gbW90X3ZhbFsyKzIqc3RyaWRlXT0gbXg7CisgICAgICAgICAgICAgICAgbW90X3ZhbFsxICAgICAgIF09IG1vdF92YWxbMyAgICAgICBdPSBtb3RfdmFsWzErMipzdHJpZGVdPSBtb3RfdmFsWzMrMipzdHJpZGVdPSBteTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IG1iX3R5cGU7CisgICAgfSBlbHNlIHsgLyogSS1GcmFtZSAqLworICAgICAgICBkb3sKKyAgICAgICAgICAgIGNicGMgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX2gyNjNfaW50cmFfTUNCUENfdmxjLnRhYmxlLCBJTlRSQV9NQ0JQQ19WTENfQklUUywgMik7CisgICAgICAgICAgICBpZiAoY2JwYyA8IDApeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSSBjYnBjIGRhbWFnZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfXdoaWxlKGNicGMgPT0gOCk7CisKKyAgICAgICAgcy0+YmRzcC5jbGVhcl9ibG9ja3Mocy0+YmxvY2tbMF0pOworCisgICAgICAgIGRxdWFudCA9IGNicGMgJiA0OworICAgICAgICBzLT5tYl9pbnRyYSA9IDE7CitpbnRyYToKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbeHldID0gTUJfVFlQRV9JTlRSQTsKKyAgICAgICAgaWYgKHMtPmgyNjNfYWljKSB7CisgICAgICAgICAgICBzLT5hY19wcmVkID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBpZihzLT5hY19wcmVkKXsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0gPSBNQl9UWVBFX0lOVFJBIHwgTUJfVFlQRV9BQ1BSRUQ7CisKKyAgICAgICAgICAgICAgICBzLT5oMjYzX2FpY19kaXIgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIHMtPmFjX3ByZWQgPSAwOworCisgICAgICAgIGlmKHMtPnBiX2ZyYW1lICYmIGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICAgICAgcGJfbXZfY291bnQgPSBoMjYzX2dldF9tb2RiKCZzLT5nYiwgcy0+cGJfZnJhbWUsICZjYnBiKTsKKyAgICAgICAgY2JweSA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19jYnB5X3ZsYy50YWJsZSwgQ0JQWV9WTENfQklUUywgMSk7CisgICAgICAgIGlmKGNicHk8MCl7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkkgY2JweSBkYW1hZ2VkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBjYnAgPSAoY2JwYyAmIDMpIHwgKGNicHkgPDwgMik7CisgICAgICAgIGlmIChkcXVhbnQpIHsKKyAgICAgICAgICAgIGgyNjNfZGVjb2RlX2RxdWFudChzKTsKKyAgICAgICAgfQorCisgICAgICAgIHBiX212X2NvdW50ICs9ICEhcy0+cGJfZnJhbWU7CisgICAgfQorCisgICAgd2hpbGUocGJfbXZfY291bnQtLSl7CisgICAgICAgIGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCAwLCAxKTsKKyAgICAgICAgZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIDAsIDEpOworICAgIH0KKworICAgIC8qIGRlY29kZSBlYWNoIGJsb2NrICovCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICBpZiAoaDI2M19kZWNvZGVfYmxvY2socywgYmxvY2tbaV0sIGksIGNicCYzMikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYnArPWNicDsKKyAgICB9CisKKyAgICBpZihzLT5wYl9mcmFtZSAmJiBoMjYzX3NraXBfYl9wYXJ0KHMsIGNicGIpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmKHMtPm9ibWMgJiYgIXMtPm1iX2ludHJhKXsKKyAgICAgICAgaWYocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QICYmIHMtPm1iX3grMTxzLT5tYl93aWR0aCAmJiBzLT5tYl9udW1fbGVmdCAhPSAxKQorICAgICAgICAgICAgcHJldmlld19vYm1jKHMpOworICAgIH0KK2VuZDoKKworICAgICAgICAvKiBwZXItTUIgZW5kIG9mIHNsaWNlIGNoZWNrICovCisgICAgeworICAgICAgICBpbnQgdj0gc2hvd19iaXRzKCZzLT5nYiwgMTYpOworCisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCAxNikgeworICAgICAgICAgICAgdiA+Pj0gMTYgLSBnZXRfYml0c19sZWZ0KCZzLT5nYik7CisgICAgICAgIH0KKworICAgICAgICBpZih2PT0wKQorICAgICAgICAgICAgcmV0dXJuIFNMSUNFX0VORDsKKyAgICB9CisKKyAgICByZXR1cm4gU0xJQ0VfT0s7Cit9CisKKy8qIG1vc3QgaXMgaGFyZGNvZGVkLiBzaG91bGQgZXh0ZW5kIHRvIGhhbmRsZSBhbGwgaDI2MyBzdHJlYW1zICovCitpbnQgZmZfaDI2M19kZWNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgaTsKKyAgICB1aW50MzJfdCBzdGFydGNvZGU7CisKKyAgICBhbGlnbl9nZXRfYml0cygmcy0+Z2IpOworCisgICAgaWYgKHNob3dfYml0cygmcy0+Z2IsIDIpID09IDIgJiYgcy0+YXZjdHgtPmZyYW1lX251bWJlciA9PSAwKSB7CisgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSGVhZGVyIGxvb2tzIGxpa2UgUlRQIGluc3RlYWQgb2YgSC4yNjNcbiIpOworICAgIH0KKworICAgIHN0YXJ0Y29kZT0gZ2V0X2JpdHMoJnMtPmdiLCAyMi04KTsKKworICAgIGZvcihpPSBnZXRfYml0c19sZWZ0KCZzLT5nYik7IGk+MjQ7IGktPTgpIHsKKyAgICAgICAgc3RhcnRjb2RlID0gKChzdGFydGNvZGUgPDwgOCkgfCBnZXRfYml0cygmcy0+Z2IsIDgpKSAmIDB4MDAzRkZGRkY7CisKKyAgICAgICAgaWYoc3RhcnRjb2RlID09IDB4MjApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc3RhcnRjb2RlICE9IDB4MjApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJCYWQgcGljdHVyZSBzdGFydCBjb2RlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiB0ZW1wb3JhbCByZWZlcmVuY2UgKi8KKyAgICBpID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsgLyogcGljdHVyZSB0aW1lc3RhbXAgKi8KKyAgICBpZiggKHMtPnBpY3R1cmVfbnVtYmVyJn4weEZGKStpIDwgcy0+cGljdHVyZV9udW1iZXIpCisgICAgICAgIGkrPSAyNTY7CisgICAgcy0+cGljdHVyZV9udW1iZXI9IChzLT5waWN0dXJlX251bWJlciZ+MHhGRikgKyBpOworCisgICAgLyogUFRZUEUgc3RhcnRzIGhlcmUgKi8KKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikgIT0gMSkgeworICAgICAgICAvKiBtYXJrZXIgKi8KKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJCYWQgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikgIT0gMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkJhZCBIMjYzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgIC8qIGgyNjMgaWQgKi8KKyAgICB9CisgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOyAgICAgICAgIC8qIHNwbGl0IHNjcmVlbiBvZmYgKi8KKyAgICBza2lwX2JpdHMxKCZzLT5nYik7ICAgICAgICAgLyogY2FtZXJhICBvZmYgKi8KKyAgICBza2lwX2JpdHMxKCZzLT5nYik7ICAgICAgICAgLyogZnJlZXplIHBpY3R1cmUgcmVsZWFzZSBvZmYgKi8KKworICAgIGZvcm1hdCA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CisgICAgLyoKKyAgICAgICAgMCAgICBmb3JiaWRkZW4KKyAgICAgICAgMSAgICBzdWItUUNJRgorICAgICAgICAxMCAgIFFDSUYKKyAgICAgICAgNyAgICAgICBleHRlbmRlZCBQVFlQRSAoUExVU1BUWVBFKQorICAgICovCisKKyAgICBpZiAoZm9ybWF0ICE9IDcgJiYgZm9ybWF0ICE9IDYpIHsKKyAgICAgICAgcy0+aDI2M19wbHVzID0gMDsKKyAgICAgICAgLyogSC4yNjN2MSAqLworICAgICAgICB3aWR0aCA9IGZmX2gyNjNfZm9ybWF0W2Zvcm1hdF1bMF07CisgICAgICAgIGhlaWdodCA9IGZmX2gyNjNfZm9ybWF0W2Zvcm1hdF1bMV07CisgICAgICAgIGlmICghd2lkdGgpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgcy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0kgKyBnZXRfYml0czEoJnMtPmdiKTsKKworICAgICAgICBzLT5oMjYzX2xvbmdfdmVjdG9ycyA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSAhPSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkgyNjMgU0FDIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOyAvKiBTQUM6IG9mZiAqLworICAgICAgICB9CisgICAgICAgIHMtPm9ibWM9IGdldF9iaXRzMSgmcy0+Z2IpOyAvKiBBZHZhbmNlZCBwcmVkaWN0aW9uIG1vZGUgKi8KKyAgICAgICAgcy0+dW5yZXN0cmljdGVkX212ID0gcy0+aDI2M19sb25nX3ZlY3RvcnMgfHwgcy0+b2JtYzsKKworICAgICAgICBzLT5wYl9mcmFtZSA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICBzLT5jaHJvbWFfcXNjYWxlPSBzLT5xc2NhbGUgPSBnZXRfYml0cygmcy0+Z2IsIDUpOworICAgICAgICBza2lwX2JpdHMxKCZzLT5nYik7IC8qIENvbnRpbnVvdXMgUHJlc2VuY2UgTXVsdGlwb2ludCBtb2RlOiBvZmYgKi8KKworICAgICAgICBzLT53aWR0aCA9IHdpZHRoOworICAgICAgICBzLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvPSAoQVZSYXRpb25hbCl7MTIsMTF9OworICAgICAgICBzLT5hdmN0eC0+ZnJhbWVyYXRlID0gKEFWUmF0aW9uYWwpeyAzMDAwMCwgMTAwMSB9OworICAgIH0gZWxzZSB7CisgICAgICAgIGludCB1ZmVwOworCisgICAgICAgIC8qIEguMjYzdjIgKi8KKyAgICAgICAgcy0+aDI2M19wbHVzID0gMTsKKyAgICAgICAgdWZlcCA9IGdldF9iaXRzKCZzLT5nYiwgMyk7IC8qIFVwZGF0ZSBGdWxsIEV4dGVuZGVkIFBUWVBFICovCisKKyAgICAgICAgLyogdWZlcCBvdGhlciB0aGFuIDAgYW5kIDEgYXJlIHJlc2VydmVkICovCisgICAgICAgIGlmICh1ZmVwID09IDEpIHsKKyAgICAgICAgICAgIC8qIE9QUFRZUEUgKi8KKyAgICAgICAgICAgIGZvcm1hdCA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CisgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAidWZlcD0xLCBmb3JtYXQ6ICVkXG4iLCBmb3JtYXQpOworICAgICAgICAgICAgcy0+Y3VzdG9tX3BjZj0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBzLT51bXZwbHVzID0gZ2V0X2JpdHMxKCZzLT5nYik7IC8qIFVucmVzdHJpY3RlZCBNb3Rpb24gVmVjdG9yICovCisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikgIT0gMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU3ludGF4LWJhc2VkIEFyaXRobWV0aWMgQ29kaW5nIChTQUMpIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+b2JtYz0gZ2V0X2JpdHMxKCZzLT5nYik7IC8qIEFkdmFuY2VkIHByZWRpY3Rpb24gbW9kZSAqLworICAgICAgICAgICAgcy0+aDI2M19haWMgPSBnZXRfYml0czEoJnMtPmdiKTsgLyogQWR2YW5jZWQgSW50cmEgQ29kaW5nIChBSUMpICovCisgICAgICAgICAgICBzLT5sb29wX2ZpbHRlcj0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBzLT51bnJlc3RyaWN0ZWRfbXYgPSBzLT51bXZwbHVzIHx8IHMtPm9ibWMgfHwgcy0+bG9vcF9maWx0ZXI7CisgICAgICAgICAgICBpZihzLT5hdmN0eC0+bG93cmVzKQorICAgICAgICAgICAgICAgIHMtPmxvb3BfZmlsdGVyID0gMDsKKworICAgICAgICAgICAgcy0+aDI2M19zbGljZV9zdHJ1Y3R1cmVkPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZWZlcmVuY2UgUGljdHVyZSBTZWxlY3Rpb24gbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikgIT0gMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5kZXBlbmRlbnQgU2VnbWVudCBEZWNvZGluZyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmFsdF9pbnRlcl92bGM9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgcy0+bW9kaWZpZWRfcXVhbnQ9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgaWYocy0+bW9kaWZpZWRfcXVhbnQpCisgICAgICAgICAgICAgICAgcy0+Y2hyb21hX3FzY2FsZV90YWJsZT0gZmZfaDI2M19jaHJvbWFfcXNjYWxlX3RhYmxlOworCisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxKTsgLyogUHJldmVudCBzdGFydCBjb2RlIGVtdWxhdGlvbiAqLworCisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzKTsgLyogUmVzZXJ2ZWQgKi8KKyAgICAgICAgfSBlbHNlIGlmICh1ZmVwICE9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQmFkIFVGRVAgdHlwZSAoJWQpXG4iLCB1ZmVwKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE1QUFRZUEUgKi8KKyAgICAgICAgcy0+cGljdF90eXBlID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICAgICAgc3dpdGNoKHMtPnBpY3RfdHlwZSl7CisgICAgICAgIGNhc2UgMDogcy0+cGljdF90eXBlPSBBVl9QSUNUVVJFX1RZUEVfSTticmVhazsKKyAgICAgICAgY2FzZSAxOiBzLT5waWN0X3R5cGU9IEFWX1BJQ1RVUkVfVFlQRV9QO2JyZWFrOworICAgICAgICBjYXNlIDI6IHMtPnBpY3RfdHlwZT0gQVZfUElDVFVSRV9UWVBFX1A7cy0+cGJfZnJhbWUgPSAzO2JyZWFrOworICAgICAgICBjYXNlIDM6IHMtPnBpY3RfdHlwZT0gQVZfUElDVFVSRV9UWVBFX0I7YnJlYWs7CisgICAgICAgIGNhc2UgNzogcy0+cGljdF90eXBlPSBBVl9QSUNUVVJFX1RZUEVfSTticmVhazsgLy9aWUdPCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMik7CisgICAgICAgIHMtPm5vX3JvdW5kaW5nID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDQpOworCisgICAgICAgIC8qIEdldCB0aGUgcGljdHVyZSBkaW1lbnNpb25zICovCisgICAgICAgIGlmICh1ZmVwKSB7CisgICAgICAgICAgICBpZiAoZm9ybWF0ID09IDYpIHsKKyAgICAgICAgICAgICAgICAvKiBDdXN0b20gUGljdHVyZSBGb3JtYXQgKENQRk1UKSAqLworICAgICAgICAgICAgICAgIHMtPmFzcGVjdF9yYXRpb19pbmZvID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsKKyAgICAgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiYXNwZWN0OiAlZFxuIiwgcy0+YXNwZWN0X3JhdGlvX2luZm8pOworICAgICAgICAgICAgICAgIC8qIGFzcGVjdCByYXRpb3M6CisgICAgICAgICAgICAgICAgMCAtIGZvcmJpZGRlbgorICAgICAgICAgICAgICAgIDEgLSAxOjEKKyAgICAgICAgICAgICAgICAyIC0gMTI6MTEgKENJRiA0OjMpCisgICAgICAgICAgICAgICAgMyAtIDEwOjExICg1MjUtdHlwZSA0OjMpCisgICAgICAgICAgICAgICAgNCAtIDE2OjExIChDSUYgMTY6OSkKKyAgICAgICAgICAgICAgICA1IC0gNDA6MzMgKDUyNS10eXBlIDE2OjkpCisgICAgICAgICAgICAgICAgNi0xNCAtIHJlc2VydmVkCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB3aWR0aCA9IChnZXRfYml0cygmcy0+Z2IsIDkpICsgMSkgKiA0OworICAgICAgICAgICAgICAgIHNraXBfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBnZXRfYml0cygmcy0+Z2IsIDkpICogNDsKKyAgICAgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiXG5ILjI2MysgQ3VzdG9tIHBpY3R1cmU6ICVkeCVkXG4iLHdpZHRoLGhlaWdodCk7CisgICAgICAgICAgICAgICAgaWYgKHMtPmFzcGVjdF9yYXRpb19pbmZvID09IEZGX0FTUEVDVF9FWFRFTkRFRCkgeworICAgICAgICAgICAgICAgICAgICAvKiBhc3BlY3RlZCBkaW1lbnNpb25zICovCisgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bT0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbz0gZmZfaDI2M19waXhlbF9hc3BlY3Rbcy0+YXNwZWN0X3JhdGlvX2luZm9dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2lkdGggPSBmZl9oMjYzX2Zvcm1hdFtmb3JtYXRdWzBdOworICAgICAgICAgICAgICAgIGhlaWdodCA9IGZmX2gyNjNfZm9ybWF0W2Zvcm1hdF1bMV07CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW89IChBVlJhdGlvbmFsKXsxMiwxMX07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPDw9IHMtPmVoY19tb2RlOworICAgICAgICAgICAgaWYgKCh3aWR0aCA9PSAwKSB8fCAoaGVpZ2h0ID09IDApKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHMtPndpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBzLT5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgICAgIGlmKHMtPmN1c3RvbV9wY2YpeworICAgICAgICAgICAgICAgIGludCBnY2Q7CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmZyYW1lcmF0ZS5udW0gID0gMTgwMDAwMDsKKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+ZnJhbWVyYXRlLmRlbiAgPSAxMDAwICsgZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmZyYW1lcmF0ZS5kZW4gKj0gZ2V0X2JpdHMoJnMtPmdiLCA3KTsKKyAgICAgICAgICAgICAgICBpZihzLT5hdmN0eC0+ZnJhbWVyYXRlLmRlbiA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInplcm8gZnJhbWVyYXRlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnY2Q9IGF2X2djZChzLT5hdmN0eC0+ZnJhbWVyYXRlLmRlbiwgcy0+YXZjdHgtPmZyYW1lcmF0ZS5udW0pOworICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5mcmFtZXJhdGUuZGVuIC89IGdjZDsKKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+ZnJhbWVyYXRlLm51bSAvPSBnY2Q7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+ZnJhbWVyYXRlID0gKEFWUmF0aW9uYWwpeyAzMDAwMCwgMTAwMSB9OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYocy0+Y3VzdG9tX3BjZil7CisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAyKTsgLy9leHRlbmRlZCBUZW1wb3JhbCByZWZlcmVuY2UKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1ZmVwKSB7CisgICAgICAgICAgICBpZiAocy0+dW12cGx1cykgeworICAgICAgICAgICAgICAgIGlmKGdldF9iaXRzMSgmcy0+Z2IpPT0wKSAvKiBVbmxpbWl0ZWQgVW5yZXN0cmljdGVkIE1vdGlvbiBWZWN0b3JzIEluZGljYXRvciAoVVVJKSAqLworICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihzLT5oMjYzX3NsaWNlX3N0cnVjdHVyZWQpeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicmVjdGFuZ3VsYXIgc2xpY2VzIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInVub3JkZXJlZCBzbGljZXMgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcy0+cXNjYWxlID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKKyAgICB9CisKKyAgICBpZiAocy0+d2lkdGggPT0gMCB8fCBzLT5oZWlnaHQgPT0gMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRpbWVuc2lvbnMgMFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcy0+bWJfd2lkdGggPSAocy0+d2lkdGggICsgMTUpIC8gMTY7CisgICAgcy0+bWJfaGVpZ2h0ID0gKHMtPmhlaWdodCAgKyAxNSkgLyAxNjsKKyAgICBzLT5tYl9udW0gPSBzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodDsKKworICAgIGlmIChzLT5wYl9mcmFtZSkgeworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzKTsgLyogVGVtcG9yYWwgcmVmZXJlbmNlIGZvciBCLXBpY3R1cmVzICovCisgICAgICAgIGlmIChzLT5jdXN0b21fcGNmKQorICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMik7IC8vZXh0ZW5kZWQgVGVtcG9yYWwgcmVmZXJlbmNlCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDIpOyAvKiBRdWFudGl6YXRpb24gaW5mb3JtYXRpb24gZm9yIEItcGljdHVyZXMgKi8KKyAgICB9CisKKyAgICBpZiAocy0+cGljdF90eXBlIT1BVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICBzLT50aW1lICAgICAgICAgICAgPSBzLT5waWN0dXJlX251bWJlcjsKKyAgICAgICAgcy0+cHBfdGltZSAgICAgICAgID0gcy0+dGltZSAtIHMtPmxhc3Rfbm9uX2JfdGltZTsKKyAgICAgICAgcy0+bGFzdF9ub25fYl90aW1lID0gcy0+dGltZTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcy0+dGltZSAgICA9IHMtPnBpY3R1cmVfbnVtYmVyOworICAgICAgICBzLT5wYl90aW1lID0gcy0+cHBfdGltZSAtIChzLT5sYXN0X25vbl9iX3RpbWUgLSBzLT50aW1lKTsKKyAgICAgICAgaWYgKHMtPnBwX3RpbWUgPD1zLT5wYl90aW1lIHx8CisgICAgICAgICAgICBzLT5wcF90aW1lIDw9IHMtPnBwX3RpbWUgLSBzLT5wYl90aW1lIHx8CisgICAgICAgICAgICBzLT5wcF90aW1lIDw9IDApeworICAgICAgICAgICAgcy0+cHBfdGltZSA9IDI7CisgICAgICAgICAgICBzLT5wYl90aW1lID0gMTsKKyAgICAgICAgfQorICAgICAgICBmZl9tcGVnNF9pbml0X2RpcmVjdF9tdihzKTsKKyAgICB9CisKKyAgICAvKiBQRUkgKi8KKyAgICBpZiAoc2tpcF8xc3RvcF84ZGF0YV9iaXRzKCZzLT5nYikgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmKHMtPmgyNjNfc2xpY2Vfc3RydWN0dXJlZCl7CisgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSAhPSAxKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlNFUEIxIG1hcmtlciBtaXNzaW5nXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGZmX2gyNjNfZGVjb2RlX21iYShzKTsKKworICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikgIT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJTRVBCMiBtYXJrZXIgbWlzc2luZ1xuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+Zl9jb2RlID0gMTsKKworICAgIGlmKHMtPmgyNjNfYWljKXsKKyAgICAgICAgIHMtPnlfZGNfc2NhbGVfdGFibGU9CisgICAgICAgICBzLT5jX2RjX3NjYWxlX3RhYmxlPSBmZl9haWNfZGNfc2NhbGVfdGFibGU7CisgICAgfWVsc2V7CisgICAgICAgIHMtPnlfZGNfc2NhbGVfdGFibGU9CisgICAgICAgIHMtPmNfZGNfc2NhbGVfdGFibGU9IGZmX21wZWcxX2RjX3NjYWxlX3RhYmxlOworICAgIH0KKworICAgICAgICBmZl9oMjYzX3Nob3dfcGljdF9pbmZvKHMpOworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgJiYgcy0+Y29kZWNfdGFnID09IEFWX1JMMzIoIlpZR08iKSAmJiBnZXRfYml0c19sZWZ0KCZzLT5nYikgPj0gODUgKyAxMyozKjE2ICsgNTApeworICAgICAgICBpbnQgaSxqOworICAgICAgICBmb3IoaT0wOyBpPDg1OyBpKyspIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiJWQiLCBnZXRfYml0czEoJnMtPmdiKSk7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKKyAgICAgICAgZm9yKGk9MDsgaTwxMzsgaSsrKXsKKyAgICAgICAgICAgIGZvcihqPTA7IGo8MzsgaisrKXsKKyAgICAgICAgICAgICAgICBpbnQgdj0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICB2IHw9IGdldF9zYml0cygmcy0+Z2IsIDgpPDw4OworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiICU1ZCIsIHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgICAgICB9CisgICAgICAgIGZvcihpPTA7IGk8NTA7IGkrKykgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICIlZCIsIGdldF9iaXRzMSgmcy0+Z2IpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2l0dWgyNjNlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2l0dWgyNjNlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FkMDgwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaXR1aDI2M2VuYy5jCkBAIC0wLDAgKzEsODMzIEBACisvKgorICogSVRVIEgyNjMgYml0c3RyZWFtIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogSDI2Mysgc3VwcG9ydC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBKdWFuIEouIFNpZXJyYWx0YSBQCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBoMjYzIGJpdHN0cmVhbSBlbmNvZGVyLgorICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgImgyNjMuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSAidW5hcnkuaCIKKyNpbmNsdWRlICJmbHYuaCIKKyNpbmNsdWRlICJtcGVnNHZpZGVvLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyoqCisgKiBUYWJsZSBvZiBudW1iZXIgb2YgYml0cyBhIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IG5lZWRzLgorICovCitzdGF0aWMgdWludDhfdCBtdl9wZW5hbHR5W01BWF9GQ09ERSsxXVtNQVhfTVYqMisxXTsKKworLyoqCisgKiBNaW5pbWFsIGZjb2RlIHRoYXQgYSBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCB3b3VsZCBuZWVkLgorICovCitzdGF0aWMgdWludDhfdCBmY29kZV90YWJbTUFYX01WKjIrMV07CisKKy8qKgorICogTWluaW1hbCBmY29kZSB0aGF0IGEgbW90aW9uIHZlY3RvciBjb21wb25lbnQgd291bGQgbmVlZCBpbiB1bXYuCisgKiBBbGwgZW50cmllcyBpbiB0aGlzIHRhYmxlIGFyZSAxLgorICovCitzdGF0aWMgdWludDhfdCB1bXZfZmNvZGVfdGFiW01BWF9NVioyKzFdOworCisvL3VuaWZpZWQgZW5jb2RpbmcgdGFibGVzIGZvciBydW4gbGVuZ3RoIGVuY29kaW5nIG9mIGNvZWZmaWNpZW50cworLy91bmlmaWVkIGluIHRoZSBzZW5zZSB0aGF0IHRoZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgaW4gc2V2ZXJhbCBzdGVwcy4KK3N0YXRpYyB1aW50OF90ICB1bmlfaDI2M19pbnRyYV9haWNfcmxfbGVuIFs2NCo2NCoyKjJdOworc3RhdGljIHVpbnQ4X3QgIHVuaV9oMjYzX2ludGVyX3JsX2xlbiBbNjQqNjQqMioyXTsKKy8vI2RlZmluZSBVTklfTVBFRzRfRU5DX0lOREVYKGxhc3QscnVuLGxldmVsKSAoKGxhc3QpKjEyOCArIChydW4pKjI1NiArIChsZXZlbCkpCisvLyNkZWZpbmUgVU5JX01QRUc0X0VOQ19JTkRFWChsYXN0LHJ1bixsZXZlbCkgKChsYXN0KSoxMjgqNjQgKyAocnVuKSArIChsZXZlbCkqNjQpCisjZGVmaW5lIFVOSV9NUEVHNF9FTkNfSU5ERVgobGFzdCxydW4sbGV2ZWwpICgobGFzdCkqMTI4KjY0ICsgKHJ1bikqMTI4ICsgKGxldmVsKSkKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgd3JvbmdfcnVuWzEwMl0gPSB7CisgMSwgIDIsICAzLCAgNSwgIDQsIDEwLCAgOSwgIDgsCisxMSwgMTUsIDE3LCAxNiwgMjMsIDIyLCAyMSwgMjAsCisxOSwgMTgsIDI1LCAyNCwgMjcsIDI2LCAxMSwgIDcsCisgNiwgIDEsICAyLCAxMywgIDIsICAyLCAgMiwgIDIsCisgNiwgMTIsICAzLCAgOSwgIDEsICAzLCAgNCwgIDMsCisgNywgIDQsICAxLCAgMSwgIDUsICA1LCAxNCwgIDYsCisgMSwgIDcsICAxLCAgOCwgIDEsICAxLCAgMSwgIDEsCisxMCwgIDEsICAxLCAgNSwgIDksIDE3LCAyNSwgMjQsCisyOSwgMzMsIDMyLCA0MSwgIDIsIDIzLCAyOCwgMzEsCisgMywgMjIsIDMwLCAgNCwgMjcsIDQwLCAgOCwgMjYsCisgNiwgMzksICA3LCAzOCwgMTYsIDM3LCAxNSwgMTAsCisxMSwgMTIsIDEzLCAxNCwgIDEsIDIxLCAyMCwgMTgsCisxOSwgIDIsICAxLCAzNCwgMzUsIDM2Cit9OworCisvKioKKyAqIFJldHVybiB0aGUgNCBiaXQgdmFsdWUgdGhhdCBzcGVjaWZpZXMgdGhlIGdpdmVuIGFzcGVjdCByYXRpby4KKyAqIFRoaXMgbWF5IGJlIG9uZSBvZiB0aGUgc3RhbmRhcmQgYXNwZWN0IHJhdGlvcyBvciBpdCBzcGVjaWZpZXMKKyAqIHRoYXQgdGhlIGFzcGVjdCB3aWxsIGJlIHN0b3JlZCBleHBsaWNpdGx5IGxhdGVyLgorICovCithdl9jb25zdCBpbnQgZmZfaDI2M19hc3BlY3RfdG9faW5mbyhBVlJhdGlvbmFsIGFzcGVjdCl7CisgICAgaW50IGk7CisKKyAgICBpZihhc3BlY3QubnVtPT0wKSBhc3BlY3Q9IChBVlJhdGlvbmFsKXsxLDF9OworCisgICAgZm9yKGk9MTsgaTw2OyBpKyspeworICAgICAgICBpZihhdl9jbXBfcShmZl9oMjYzX3BpeGVsX2FzcGVjdFtpXSwgYXNwZWN0KSA9PSAwKXsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEZGX0FTUEVDVF9FWFRFTkRFRDsKK30KKwordm9pZCBmZl9oMjYzX2VuY29kZV9waWN0dXJlX2hlYWRlcihNcGVnRW5jQ29udGV4dCAqIHMsIGludCBwaWN0dXJlX251bWJlcikKK3sKKyAgICBpbnQgZm9ybWF0LCBjb2RlZF9mcmFtZV9yYXRlLCBjb2RlZF9mcmFtZV9yYXRlX2Jhc2UsIGksIHRlbXBfcmVmOworICAgIGludCBiZXN0X2Nsb2NrX2NvZGU9MTsKKyAgICBpbnQgYmVzdF9kaXZpc29yPTYwOworICAgIGludCBiZXN0X2Vycm9yPSBJTlRfTUFYOworCisgICAgaWYocy0+aDI2M19wbHVzKXsKKyAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspeworICAgICAgICAgICAgaW50IGRpdiwgZXJyb3I7CisgICAgICAgICAgICBkaXY9IChzLT5hdmN0eC0+dGltZV9iYXNlLm51bSoxODAwMDAwTEwgKyA1MDBMTCpzLT5hdmN0eC0+dGltZV9iYXNlLmRlbikgLyAoKDEwMDBMTCtpKSpzLT5hdmN0eC0+dGltZV9iYXNlLmRlbik7CisgICAgICAgICAgICBkaXY9IGF2X2NsaXAoZGl2LCAxLCAxMjcpOworICAgICAgICAgICAgZXJyb3I9IEZGQUJTKHMtPmF2Y3R4LT50aW1lX2Jhc2UubnVtKjE4MDAwMDBMTCAtICgxMDAwTEwraSkqcy0+YXZjdHgtPnRpbWVfYmFzZS5kZW4qZGl2KTsKKyAgICAgICAgICAgIGlmKGVycm9yIDwgYmVzdF9lcnJvcil7CisgICAgICAgICAgICAgICAgYmVzdF9lcnJvcj0gZXJyb3I7CisgICAgICAgICAgICAgICAgYmVzdF9kaXZpc29yPSBkaXY7CisgICAgICAgICAgICAgICAgYmVzdF9jbG9ja19jb2RlPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHMtPmN1c3RvbV9wY2Y9IGJlc3RfY2xvY2tfY29kZSE9MSB8fCBiZXN0X2Rpdmlzb3IhPTYwOworICAgIGNvZGVkX2ZyYW1lX3JhdGU9IDE4MDAwMDA7CisgICAgY29kZWRfZnJhbWVfcmF0ZV9iYXNlPSAoMTAwMCtiZXN0X2Nsb2NrX2NvZGUpKmJlc3RfZGl2aXNvcjsKKworICAgIGF2cHJpdl9hbGlnbl9wdXRfYml0cygmcy0+cGIpOworCisgICAgLyogVXBkYXRlIHRoZSBwb2ludGVyIHRvIGxhc3QgR09CICovCisgICAgcy0+cHRyX2xhc3Rnb2IgPSBwdXRfYml0c19wdHIoJnMtPnBiKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDIyLCAweDIwKTsgLyogUFNDICovCisgICAgdGVtcF9yZWY9IHMtPnBpY3R1cmVfbnVtYmVyICogKGludDY0X3QpY29kZWRfZnJhbWVfcmF0ZSAqIHMtPmF2Y3R4LT50aW1lX2Jhc2UubnVtIC8gLy9GSVhNRSB1c2UgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGVkX2ZyYW1lX3JhdGVfYmFzZSAqIChpbnQ2NF90KXMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuKTsKKyAgICBwdXRfc2JpdHMoJnMtPnBiLCA4LCB0ZW1wX3JlZik7IC8qIFRlbXBvcmFsUmVmZXJlbmNlICovCisKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOyAgICAgLyogbWFya2VyICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgIC8qIGgyNjMgaWQgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgLyogc3BsaXQgc2NyZWVuIG9mZiAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAvKiBjYW1lcmEgIG9mZiAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAvKiBmcmVlemUgcGljdHVyZSByZWxlYXNlIG9mZiAqLworCisgICAgZm9ybWF0ID0gZmZfbWF0Y2hfMnVpbnQxNihmZl9oMjYzX2Zvcm1hdCwgRkZfQVJSQVlfRUxFTVMoZmZfaDI2M19mb3JtYXQpLCBzLT53aWR0aCwgcy0+aGVpZ2h0KTsKKyAgICBpZiAoIXMtPmgyNjNfcGx1cykgeworICAgICAgICAvKiBILjI2M3YxICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgZm9ybWF0KTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSk7CisgICAgICAgIC8qIEJ5IG5vdyBVTVYgSVMgRElTQUJMRUQgT04gSC4yNjN2MSwgc2luY2UgdGhlIHJlc3RyaWN0aW9ucworICAgICAgICBvZiBILjI2M3YxIFVNViBpbXBsaWVzIHRvIGNoZWNrIHRoZSBwcmVkaWN0ZWQgTVYgYWZ0ZXIKKyAgICAgICAgY2FsY3VsYXRpb24gb2YgdGhlIGN1cnJlbnQgTUIgdG8gc2VlIGlmIHdlJ3JlIG9uIHRoZSBsaW1pdHMgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAvKiBVbnJlc3RyaWN0ZWQgTW90aW9uIFZlY3Rvcjogb2ZmICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgLyogU0FDOiBvZmYgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5vYm1jKTsgICAvKiBBZHZhbmNlZCBQcmVkaWN0aW9uICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgLyogb25seSBJL1AgZnJhbWVzLCBubyBQQiBmcmFtZSAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIHMtPnFzY2FsZSk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgLyogQ29udGludW91cyBQcmVzZW5jZSBNdWx0aXBvaW50IG1vZGU6IG9mZiAqLworICAgIH0gZWxzZSB7CisgICAgICAgIGludCB1ZmVwPTE7CisgICAgICAgIC8qIEguMjYzdjIgKi8KKyAgICAgICAgLyogSC4yNjMgUGx1cyBQVFlQRSAqLworCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgNyk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwzLHVmZXApOyAvKiBVcGRhdGUgRnVsbCBFeHRlbmRlZCBQVFlQRSAqLworICAgICAgICBpZiAoZm9ybWF0ID09IDgpCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsMyw2KTsgLyogQ3VzdG9tIFNvdXJjZSBGb3JtYXQgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCBmb3JtYXQpOworCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwxLCBzLT5jdXN0b21fcGNmKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLDEsIHMtPnVtdnBsdXMpOyAvKiBVbnJlc3RyaWN0ZWQgTW90aW9uIFZlY3RvciAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsMSwwKTsgLyogU0FDOiBvZmYgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLDEscy0+b2JtYyk7IC8qIEFkdmFuY2VkIFByZWRpY3Rpb24gTW9kZSAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsMSxzLT5oMjYzX2FpYyk7IC8qIEFkdmFuY2VkIEludHJhIENvZGluZyAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsMSxzLT5sb29wX2ZpbHRlcik7IC8qIERlYmxvY2tpbmcgRmlsdGVyICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwxLHMtPmgyNjNfc2xpY2Vfc3RydWN0dXJlZCk7IC8qIFNsaWNlIFN0cnVjdHVyZWQgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLDEsMCk7IC8qIFJlZmVyZW5jZSBQaWN0dXJlIFNlbGVjdGlvbjogb2ZmICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwxLDApOyAvKiBJbmRlcGVuZGVudCBTZWdtZW50IERlY29kaW5nOiBvZmYgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLDEscy0+YWx0X2ludGVyX3ZsYyk7IC8qIEFsdGVybmF0aXZlIEludGVyIFZMQyAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsMSxzLT5tb2RpZmllZF9xdWFudCk7IC8qIE1vZGlmaWVkIFF1YW50aXphdGlvbjogKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLDEsMSk7IC8qICIxIiB0byBwcmV2ZW50IHN0YXJ0IGNvZGUgZW11bGF0aW9uICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwzLDApOyAvKiBSZXNlcnZlZCAqLworCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKTsKKworICAgICAgICBwdXRfYml0cygmcy0+cGIsMSwwKTsgLyogUmVmZXJlbmNlIFBpY3R1cmUgUmVzYW1wbGluZzogb2ZmICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwxLDApOyAvKiBSZWR1Y2VkLVJlc29sdXRpb24gVXBkYXRlOiBvZmYgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLDEscy0+bm9fcm91bmRpbmcpOyAvKiBSb3VuZGluZyBUeXBlICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwyLDApOyAvKiBSZXNlcnZlZCAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsMSwxKTsgLyogIjEiIHRvIHByZXZlbnQgc3RhcnQgY29kZSBlbXVsYXRpb24gKi8KKworICAgICAgICAvKiBUaGlzIHNob3VsZCBiZSBoZXJlIGlmIFBMVVNQVFlQRSAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAvKiBDb250aW51b3VzIFByZXNlbmNlIE11bHRpcG9pbnQgbW9kZTogb2ZmICovCisKKyAgICAgICAgaWYgKGZvcm1hdCA9PSA4KSB7CisgICAgICAgICAgICAvKiBDdXN0b20gUGljdHVyZSBGb3JtYXQgKENQRk1UKSAqLworICAgICAgICAgICAgcy0+YXNwZWN0X3JhdGlvX2luZm89IGZmX2gyNjNfYXNwZWN0X3RvX2luZm8ocy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsNCxzLT5hc3BlY3RfcmF0aW9faW5mbyk7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsOSwocy0+d2lkdGggPj4gMikgLSAxKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwxLDEpOyAvKiAiMSIgdG8gcHJldmVudCBzdGFydCBjb2RlIGVtdWxhdGlvbiAqLworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLDksKHMtPmhlaWdodCA+PiAyKSk7CisgICAgICAgICAgICBpZiAocy0+YXNwZWN0X3JhdGlvX2luZm8gPT0gRkZfQVNQRUNUX0VYVEVOREVEKXsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSk7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKHMtPmN1c3RvbV9wY2YpeworICAgICAgICAgICAgaWYodWZlcCl7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBiZXN0X2Nsb2NrX2NvZGUpOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNywgYmVzdF9kaXZpc29yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1dF9zYml0cygmcy0+cGIsIDIsIHRlbXBfcmVmPj44KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVubGltaXRlZCBVbnJlc3RyaWN0ZWQgTW90aW9uIFZlY3RvcnMgSW5kaWNhdG9yIChVVUkpICovCisgICAgICAgIGlmIChzLT51bXZwbHVzKQorLy8gICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsMSwxKTsgLyogTGltaXRlZCBhY2NvcmRpbmcgdGFibGVzIG9mIEFubmV4IEQgKi8KKy8vRklYTUUgY2hlY2sgYWN0dWFsIHJlcXVlc3RlZCByYW5nZQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLDIsMSk7IC8qIHVubGltaXRlZCAqLworICAgICAgICBpZihzLT5oMjYzX3NsaWNlX3N0cnVjdHVyZWQpCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsMiwwKTsgLyogbm8gd2VpcmQgc3VibW9kZXMgKi8KKworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIHMtPnFzY2FsZSk7CisgICAgfQorCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgIC8qIG5vIFBFSSAqLworCisgICAgaWYocy0+aDI2M19zbGljZV9zdHJ1Y3R1cmVkKXsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsKKworICAgICAgICBhdl9hc3NlcnQxKHMtPm1iX3ggPT0gMCAmJiBzLT5tYl95ID09IDApOworICAgICAgICBmZl9oMjYzX2VuY29kZV9tYmEocyk7CisKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsKKyAgICB9Cit9CisKKy8qKgorICogRW5jb2RlIGEgZ3JvdXAgb2YgYmxvY2tzIGhlYWRlci4KKyAqLwordm9pZCBmZl9oMjYzX2VuY29kZV9nb2JfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICogcywgaW50IG1iX2xpbmUpCit7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNywgMSk7IC8qIEdCU0MgKi8KKworICAgIGlmKHMtPmgyNjNfc2xpY2Vfc3RydWN0dXJlZCl7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7CisKKyAgICAgICAgZmZfaDI2M19lbmNvZGVfbWJhKHMpOworCisgICAgICAgIGlmKHMtPm1iX251bSA+IDE1ODMpCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIHMtPnFzY2FsZSk7IC8qIEdRVUFOVCAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSk7IC8qIEdGSUQgKi8KKyAgICB9ZWxzZXsKKyAgICAgICAgaW50IGdvYl9udW1iZXI9IG1iX2xpbmUgLyBzLT5nb2JfaW5kZXg7CisKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA1LCBnb2JfbnVtYmVyKTsgLyogR04gKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpOyAvKiBHRklEICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgcy0+cXNjYWxlKTsgLyogR1FVQU5UICovCisgICAgfQorfQorCisvKioKKyAqIG1vZGlmeSBxc2NhbGUgc28gdGhhdCBlbmNvZGluZyBpcyBhY3R1YWxseSBwb3NzaWJsZSBpbiBoMjYzIChsaW1pdCBkaWZmZXJlbmNlIHRvIC0yLi4yKQorICovCit2b2lkIGZmX2NsZWFuX2gyNjNfcXNjYWxlcyhNcGVnRW5jQ29udGV4dCAqcyl7CisgICAgaW50IGk7CisgICAgaW50OF90ICogY29uc3QgcXNjYWxlX3RhYmxlID0gcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZTsKKworICAgIGZmX2luaXRfcXNjYWxlX3RhYihzKTsKKworICAgIGZvcihpPTE7IGk8cy0+bWJfbnVtOyBpKyspeworICAgICAgICBpZihxc2NhbGVfdGFibGVbIHMtPm1iX2luZGV4Mnh5W2ldIF0gLSBxc2NhbGVfdGFibGVbIHMtPm1iX2luZGV4Mnh5W2ktMV0gXSA+MikKKyAgICAgICAgICAgIHFzY2FsZV90YWJsZVsgcy0+bWJfaW5kZXgyeHlbaV0gXT0gcXNjYWxlX3RhYmxlWyBzLT5tYl9pbmRleDJ4eVtpLTFdIF0rMjsKKyAgICB9CisgICAgZm9yKGk9cy0+bWJfbnVtLTI7IGk+PTA7IGktLSl7CisgICAgICAgIGlmKHFzY2FsZV90YWJsZVsgcy0+bWJfaW5kZXgyeHlbaV0gXSAtIHFzY2FsZV90YWJsZVsgcy0+bWJfaW5kZXgyeHlbaSsxXSBdID4yKQorICAgICAgICAgICAgcXNjYWxlX3RhYmxlWyBzLT5tYl9pbmRleDJ4eVtpXSBdPSBxc2NhbGVfdGFibGVbIHMtPm1iX2luZGV4Mnh5W2krMV0gXSsyOworICAgIH0KKworICAgIGlmKHMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0gyNjNQKXsKKyAgICAgICAgZm9yKGk9MTsgaTxzLT5tYl9udW07IGkrKyl7CisgICAgICAgICAgICBpbnQgbWJfeHk9IHMtPm1iX2luZGV4Mnh5W2ldOworCisgICAgICAgICAgICBpZihxc2NhbGVfdGFibGVbbWJfeHldICE9IHFzY2FsZV90YWJsZVtzLT5tYl9pbmRleDJ4eVtpLTFdXSAmJiAocy0+bWJfdHlwZVttYl94eV0mQ0FORElEQVRFX01CX1RZUEVfSU5URVI0VikpeworICAgICAgICAgICAgICAgIHMtPm1iX3R5cGVbbWJfeHldfD0gQ0FORElEQVRFX01CX1RZUEVfSU5URVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgZHF1YW50X2NvZGVbNV09IHsxLDAsOSwyLDN9OworCisvKioKKyAqIEVuY29kZSBhbiA4eDggYmxvY2suCisgKiBAcGFyYW0gYmxvY2sgdGhlIDh4OCBibG9jaworICogQHBhcmFtIG4gYmxvY2sgaW5kZXggKDAtMyBhcmUgbHVtYSwgNC01IGFyZSBjaHJvbWEpCisgKi8KK3N0YXRpYyB2b2lkIGgyNjNfZW5jb2RlX2Jsb2NrKE1wZWdFbmNDb250ZXh0ICogcywgaW50MTZfdCAqIGJsb2NrLCBpbnQgbikKK3sKKyAgICBpbnQgbGV2ZWwsIHJ1biwgbGFzdCwgaSwgaiwgbGFzdF9pbmRleCwgbGFzdF9ub25femVybywgc2lnbiwgc2xldmVsLCBjb2RlOworICAgIFJMVGFibGUgKnJsOworCisgICAgcmwgPSAmZmZfaDI2M19ybF9pbnRlcjsKKyAgICBpZiAocy0+bWJfaW50cmEgJiYgIXMtPmgyNjNfYWljKSB7CisgICAgICAgIC8qIERDIGNvZWYgKi8KKyAgICAgICAgbGV2ZWwgPSBibG9ja1swXTsKKyAgICAgICAgLyogMjU1IGNhbm5vdCBiZSByZXByZXNlbnRlZCwgc28gd2UgY2xhbXAgKi8KKyAgICAgICAgaWYgKGxldmVsID4gMjU0KSB7CisgICAgICAgICAgICBsZXZlbCA9IDI1NDsKKyAgICAgICAgICAgIGJsb2NrWzBdID0gMjU0OworICAgICAgICB9CisgICAgICAgIC8qIDAgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFsc28gKi8KKyAgICAgICAgZWxzZSBpZiAobGV2ZWwgPCAxKSB7CisgICAgICAgICAgICBsZXZlbCA9IDE7CisgICAgICAgICAgICBibG9ja1swXSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsID09IDEyOCkgLy9GSVhNRSBjaGVjayBydjEwCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIDB4ZmYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIGxldmVsKTsKKyAgICAgICAgaSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGlmIChzLT5oMjYzX2FpYyAmJiBzLT5tYl9pbnRyYSkKKyAgICAgICAgICAgIHJsID0gJmZmX3JsX2ludHJhX2FpYzsKKworICAgICAgICBpZihzLT5hbHRfaW50ZXJfdmxjICYmICFzLT5tYl9pbnRyYSl7CisgICAgICAgICAgICBpbnQgYWljX3ZsY19iaXRzPTA7CisgICAgICAgICAgICBpbnQgaW50ZXJfdmxjX2JpdHM9MDsKKyAgICAgICAgICAgIGludCB3cm9uZ19wb3M9LTE7CisgICAgICAgICAgICBpbnQgYWljX2NvZGU7CisKKyAgICAgICAgICAgIGxhc3RfaW5kZXggPSBzLT5ibG9ja19sYXN0X2luZGV4W25dOworICAgICAgICAgICAgbGFzdF9ub25femVybyA9IGkgLSAxOworICAgICAgICAgICAgZm9yICg7IGkgPD0gbGFzdF9pbmRleDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaiA9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkW2ldOworICAgICAgICAgICAgICAgIGxldmVsID0gYmxvY2tbal07CisgICAgICAgICAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIHJ1biA9IGkgLSBsYXN0X25vbl96ZXJvIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IChpID09IGxhc3RfaW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgIGlmKGxldmVsPDApIGxldmVsPSAtbGV2ZWw7CisKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IGdldF9ybF9pbmRleChybCwgbGFzdCwgcnVuLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIGFpY19jb2RlID0gZ2V0X3JsX2luZGV4KCZmZl9ybF9pbnRyYV9haWMsIGxhc3QsIHJ1biwgbGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBpbnRlcl92bGNfYml0cyArPSBybC0+dGFibGVfdmxjW2NvZGVdWzFdKzE7CisgICAgICAgICAgICAgICAgICAgIGFpY192bGNfYml0cyAgICs9IGZmX3JsX2ludHJhX2FpYy50YWJsZV92bGNbYWljX2NvZGVdWzFdKzE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gcmwtPm4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyX3ZsY19iaXRzICs9IDErNis4LTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFpY19jb2RlID09IGZmX3JsX2ludHJhX2FpYy5uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhaWNfdmxjX2JpdHMgKz0gMSs2KzgtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyb25nX3BvcyArPSBydW4gKyAxOworICAgICAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgd3JvbmdfcG9zICs9IHdyb25nX3J1blthaWNfY29kZV07CisgICAgICAgICAgICAgICAgICAgIGxhc3Rfbm9uX3plcm8gPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgaWYoYWljX3ZsY19iaXRzIDwgaW50ZXJfdmxjX2JpdHMgJiYgd3JvbmdfcG9zID4gNjMpCisgICAgICAgICAgICAgICAgcmwgPSAmZmZfcmxfaW50cmFfYWljOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQUMgY29lZnMgKi8KKyAgICBsYXN0X2luZGV4ID0gcy0+YmxvY2tfbGFzdF9pbmRleFtuXTsKKyAgICBsYXN0X25vbl96ZXJvID0gaSAtIDE7CisgICAgZm9yICg7IGkgPD0gbGFzdF9pbmRleDsgaSsrKSB7CisgICAgICAgIGogPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZFtpXTsKKyAgICAgICAgbGV2ZWwgPSBibG9ja1tqXTsKKyAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICBydW4gPSBpIC0gbGFzdF9ub25femVybyAtIDE7CisgICAgICAgICAgICBsYXN0ID0gKGkgPT0gbGFzdF9pbmRleCk7CisgICAgICAgICAgICBzaWduID0gMDsKKyAgICAgICAgICAgIHNsZXZlbCA9IGxldmVsOworICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkgeworICAgICAgICAgICAgICAgIHNpZ24gPSAxOworICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZSA9IGdldF9ybF9pbmRleChybCwgbGFzdCwgcnVuLCBsZXZlbCk7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIHJsLT50YWJsZV92bGNbY29kZV1bMV0sIHJsLT50YWJsZV92bGNbY29kZV1bMF0pOworICAgICAgICAgICAgaWYgKGNvZGUgPT0gcmwtPm4pIHsKKyAgICAgICAgICAgICAgaWYoIUNPTkZJR19GTFZfRU5DT0RFUiB8fCBzLT5oMjYzX2ZsdiA8PSAxKXsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIGxhc3QpOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNiwgcnVuKTsKKworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIoc2xldmVsICE9IDApOworCisgICAgICAgICAgICAgICAgaWYobGV2ZWwgPCAxMjgpCisgICAgICAgICAgICAgICAgICAgIHB1dF9zYml0cygmcy0+cGIsIDgsIHNsZXZlbCk7CisgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCAxMjgpOworICAgICAgICAgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCA1LCBzbGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCA2LCBzbGV2ZWw+PjUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGZmX2ZsdjJfZW5jb2RlX2FjX2VzYygmcy0+cGIsIHNsZXZlbCwgbGV2ZWwsIHJ1biwgbGFzdCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzaWduKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3Rfbm9uX3plcm8gPSBpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBFbmNvZGUgTVYgZGlmZmVyZW5jZXMgb24gSC4yNjMrIHdpdGggVW5yZXN0cmljdGVkIE1WIG1vZGUgKi8KK3N0YXRpYyB2b2lkIGgyNjNwX2VuY29kZV91bW90aW9uKE1wZWdFbmNDb250ZXh0ICogcywgaW50IHZhbCkKK3sKKyAgICBzaG9ydCBzdmFsID0gMDsKKyAgICBzaG9ydCBpID0gMDsKKyAgICBzaG9ydCBuX2JpdHMgPSAwOworICAgIHNob3J0IHRlbXBfdmFsOworICAgIGludCBjb2RlID0gMDsKKyAgICBpbnQgdGNvZGU7CisKKyAgICBpZiAoIHZhbCA9PSAwKQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOworICAgIGVsc2UgaWYgKHZhbCA9PSAxKQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDMsIDApOworICAgIGVsc2UgaWYgKHZhbCA9PSAtMSkKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCAyKTsKKyAgICBlbHNlIHsKKworICAgICAgICBzdmFsID0gKCh2YWwgPCAwKSA/IChzaG9ydCkoLXZhbCk6KHNob3J0KXZhbCk7CisgICAgICAgIHRlbXBfdmFsID0gc3ZhbDsKKworICAgICAgICB3aGlsZSAodGVtcF92YWwgIT0gMCkgeworICAgICAgICAgICAgdGVtcF92YWwgPSB0ZW1wX3ZhbCA+PiAxOworICAgICAgICAgICAgbl9iaXRzKys7CisgICAgICAgIH0KKworICAgICAgICBpID0gbl9iaXRzIC0gMTsKKyAgICAgICAgd2hpbGUgKGkgPiAwKSB7CisgICAgICAgICAgICB0Y29kZSA9IChzdmFsICYgKDEgPDwgKGktMSkpKSA+PiAoaS0xKTsKKyAgICAgICAgICAgIHRjb2RlID0gKHRjb2RlIDw8IDEpIHwgMTsKKyAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCAyKSB8IHRjb2RlOworICAgICAgICAgICAgaS0tOworICAgICAgICB9CisgICAgICAgIGNvZGUgPSAoKGNvZGUgPDwgMSkgfCAodmFsIDwgMCkpIDw8IDE7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgKDIqbl9iaXRzKSsxLCBjb2RlKTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfaDI2M19lbmNvZGVfbWIoTXBlZ0VuY0NvbnRleHQgKiBzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGJsb2NrWzZdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3kpCit7CisgICAgaW50IGNicGMsIGNicHksIGksIGNicCwgcHJlZF94LCBwcmVkX3k7CisgICAgaW50MTZfdCBwcmVkX2RjOworICAgIGludDE2X3QgcmVjX2ludHJhZGNbNl07CisgICAgaW50MTZfdCAqZGNfcHRyWzZdOworICAgIGNvbnN0IGludCBpbnRlcmxlYXZlZF9zdGF0cz0gKHMtPmZsYWdzJkNPREVDX0ZMQUdfUEFTUzEpOworCisgICAgaWYgKCFzLT5tYl9pbnRyYSkgeworICAgICAgICAvKiBjb21wdXRlIGNicCAqLworICAgICAgICBjYnA9IGdldF9wX2NicChzLCBibG9jaywgbW90aW9uX3gsIG1vdGlvbl95KTsKKworICAgICAgICBpZiAoKGNicCB8IG1vdGlvbl94IHwgbW90aW9uX3kgfCBzLT5kcXVhbnQgfCAocy0+bXZfdHlwZSAtIE1WX1RZUEVfMTZYMTYpKSA9PSAwKSB7CisgICAgICAgICAgICAvKiBza2lwIG1hY3JvYmxvY2sgKi8KKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7CisgICAgICAgICAgICBpZihpbnRlcmxlYXZlZF9zdGF0cyl7CisgICAgICAgICAgICAgICAgcy0+bWlzY19iaXRzKys7CisgICAgICAgICAgICAgICAgcy0+bGFzdF9iaXRzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5za2lwX2NvdW50Kys7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgIC8qIG1iIGNvZGVkICovCisKKyAgICAgICAgY2JwYyA9IGNicCAmIDM7CisgICAgICAgIGNicHkgPSBjYnAgPj4gMjsKKyAgICAgICAgaWYocy0+YWx0X2ludGVyX3ZsYz09MCB8fCBjYnBjIT0zKQorICAgICAgICAgICAgY2JweSBePSAweEY7CisgICAgICAgIGlmKHMtPmRxdWFudCkgY2JwYys9IDg7CisgICAgICAgIGlmKHMtPm12X3R5cGU9PU1WX1RZUEVfMTZYMTYpeworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICBmZl9oMjYzX2ludGVyX01DQlBDX2JpdHNbY2JwY10sCisgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfaW50ZXJfTUNCUENfY29kZVtjYnBjXSk7CisKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgZmZfaDI2M19jYnB5X3RhYltjYnB5XVsxXSwgZmZfaDI2M19jYnB5X3RhYltjYnB5XVswXSk7CisgICAgICAgICAgICBpZihzLT5kcXVhbnQpCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBkcXVhbnRfY29kZVtzLT5kcXVhbnQrMl0pOworCisgICAgICAgICAgICBpZihpbnRlcmxlYXZlZF9zdGF0cyl7CisgICAgICAgICAgICAgICAgcy0+bWlzY19iaXRzKz0gZ2V0X2JpdHNfZGlmZihzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbW90aW9uIHZlY3RvcnM6IDE2eDE2IG1vZGUgKi8KKyAgICAgICAgICAgIGZmX2gyNjNfcHJlZF9tb3Rpb24ocywgMCwgMCwgJnByZWRfeCwgJnByZWRfeSk7CisKKyAgICAgICAgICAgIGlmICghcy0+dW12cGx1cykgeworICAgICAgICAgICAgICAgIGZmX2gyNjNfZW5jb2RlX21vdGlvbl92ZWN0b3IocywgbW90aW9uX3ggLSBwcmVkX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feSAtIHByZWRfeSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBoMjYzcF9lbmNvZGVfdW1vdGlvbihzLCBtb3Rpb25feCAtIHByZWRfeCk7CisgICAgICAgICAgICAgICAgaDI2M3BfZW5jb2RlX3Vtb3Rpb24ocywgbW90aW9uX3kgLSBwcmVkX3kpOworICAgICAgICAgICAgICAgIGlmICgoKG1vdGlvbl94IC0gcHJlZF94KSA9PSAxKSAmJiAoKG1vdGlvbl95IC0gcHJlZF95KSA9PSAxKSkKKyAgICAgICAgICAgICAgICAgICAgLyogVG8gcHJldmVudCBTdGFydCBDb2RlIGVtdWxhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsMSwxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfaW50ZXJfTUNCUENfYml0c1tjYnBjKzE2XSwKKyAgICAgICAgICAgICAgICAgICAgZmZfaDI2M19pbnRlcl9NQ0JQQ19jb2RlW2NicGMrMTZdKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgZmZfaDI2M19jYnB5X3RhYltjYnB5XVsxXSwgZmZfaDI2M19jYnB5X3RhYltjYnB5XVswXSk7CisgICAgICAgICAgICBpZihzLT5kcXVhbnQpCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBkcXVhbnRfY29kZVtzLT5kcXVhbnQrMl0pOworCisgICAgICAgICAgICBpZihpbnRlcmxlYXZlZF9zdGF0cyl7CisgICAgICAgICAgICAgICAgcy0+bWlzY19iaXRzKz0gZ2V0X2JpdHNfZGlmZihzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKGk9MDsgaTw0OyBpKyspeworICAgICAgICAgICAgICAgIC8qIG1vdGlvbiB2ZWN0b3JzOiA4eDggbW9kZSovCisgICAgICAgICAgICAgICAgZmZfaDI2M19wcmVkX21vdGlvbihzLCBpLCAwLCAmcHJlZF94LCAmcHJlZF95KTsKKworICAgICAgICAgICAgICAgIG1vdGlvbl94ID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dWzBdOworICAgICAgICAgICAgICAgIG1vdGlvbl95ID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dWzFdOworICAgICAgICAgICAgICAgIGlmICghcy0+dW12cGx1cykgeworICAgICAgICAgICAgICAgICAgICBmZl9oMjYzX2VuY29kZV9tb3Rpb25fdmVjdG9yKHMsIG1vdGlvbl94IC0gcHJlZF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95IC0gcHJlZF95LCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGgyNjNwX2VuY29kZV91bW90aW9uKHMsIG1vdGlvbl94IC0gcHJlZF94KTsKKyAgICAgICAgICAgICAgICAgICAgaDI2M3BfZW5jb2RlX3Vtb3Rpb24ocywgbW90aW9uX3kgLSBwcmVkX3kpOworICAgICAgICAgICAgICAgICAgICBpZiAoKChtb3Rpb25feCAtIHByZWRfeCkgPT0gMSkgJiYgKChtb3Rpb25feSAtIHByZWRfeSkgPT0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUbyBwcmV2ZW50IFN0YXJ0IENvZGUgZW11bGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsMSwxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihpbnRlcmxlYXZlZF9zdGF0cyl7CisgICAgICAgICAgICBzLT5tdl9iaXRzKz0gZ2V0X2JpdHNfZGlmZihzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2Fzc2VydDIocy0+bWJfaW50cmEpOworCisgICAgICAgIGNicCA9IDA7CisgICAgICAgIGlmIChzLT5oMjYzX2FpYykgeworICAgICAgICAgICAgLyogUHJlZGljdCBEQyAqLworICAgICAgICAgICAgZm9yKGk9MDsgaTw2OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQxNl90IGxldmVsID0gYmxvY2tbaV1bMF07CisgICAgICAgICAgICAgICAgaW50IHNjYWxlOworCisgICAgICAgICAgICAgICAgaWYoaTw0KSBzY2FsZT0gcy0+eV9kY19zY2FsZTsKKyAgICAgICAgICAgICAgICBlbHNlICAgIHNjYWxlPSBzLT5jX2RjX3NjYWxlOworCisgICAgICAgICAgICAgICAgcHJlZF9kYyA9IGZmX2gyNjNfcHJlZF9kYyhzLCBpLCAmZGNfcHRyW2ldKTsKKyAgICAgICAgICAgICAgICBsZXZlbCAtPSBwcmVkX2RjOworICAgICAgICAgICAgICAgIC8qIFF1YW50ICovCisgICAgICAgICAgICAgICAgaWYgKGxldmVsID49IDApCisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsICsgKHNjYWxlPj4xKSkvc2NhbGU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAtIChzY2FsZT4+MSkpL3NjYWxlOworCisgICAgICAgICAgICAgICAgaWYoIXMtPm1vZGlmaWVkX3F1YW50KXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgLTEyNykKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLTEyNzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPiAxMjcpCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IDEyNzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBibG9ja1tpXVswXSA9IGxldmVsOworICAgICAgICAgICAgICAgIC8qIFJlY29uc3RydWN0aW9uICovCisgICAgICAgICAgICAgICAgcmVjX2ludHJhZGNbaV0gPSBzY2FsZSpsZXZlbCArIHByZWRfZGM7CisgICAgICAgICAgICAgICAgLyogT2RkaWZ5ICovCisgICAgICAgICAgICAgICAgcmVjX2ludHJhZGNbaV0gfD0gMTsKKyAgICAgICAgICAgICAgICAvL2lmICgocmVjX2ludHJhZGNbaV0gJSAyKSA9PSAwKQorICAgICAgICAgICAgICAgIC8vICAgIHJlY19pbnRyYWRjW2ldKys7CisgICAgICAgICAgICAgICAgLyogQ2xpcHBpbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAocmVjX2ludHJhZGNbaV0gPCAwKQorICAgICAgICAgICAgICAgICAgICByZWNfaW50cmFkY1tpXSA9IDA7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVjX2ludHJhZGNbaV0gPiAyMDQ3KQorICAgICAgICAgICAgICAgICAgICByZWNfaW50cmFkY1tpXSA9IDIwNDc7CisKKyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgQUMvREMgdGFibGVzICovCisgICAgICAgICAgICAgICAgKmRjX3B0cltpXSA9IHJlY19pbnRyYWRjW2ldOworICAgICAgICAgICAgICAgIC8qIEFJQyBjYW4gY2hhbmdlIENCUCAqLworICAgICAgICAgICAgICAgIGlmIChzLT5ibG9ja19sYXN0X2luZGV4W2ldID4gMCB8fAorICAgICAgICAgICAgICAgICAgICAocy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9PSAwICYmIGxldmVsICE9MCkpCisgICAgICAgICAgICAgICAgICAgIGNicCB8PSAxIDw8ICg1IC0gaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZm9yKGk9MDsgaTw2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAvKiBjb21wdXRlIGNicCAqLworICAgICAgICAgICAgICAgIGlmIChzLT5ibG9ja19sYXN0X2luZGV4W2ldID49IDEpCisgICAgICAgICAgICAgICAgICAgIGNicCB8PSAxIDw8ICg1IC0gaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjYnBjID0gY2JwICYgMzsKKyAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICAgICAgaWYocy0+ZHF1YW50KSBjYnBjKz00OworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgIGZmX2gyNjNfaW50cmFfTUNCUENfYml0c1tjYnBjXSwKKyAgICAgICAgICAgICAgICBmZl9oMjYzX2ludHJhX01DQlBDX2NvZGVbY2JwY10pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYocy0+ZHF1YW50KSBjYnBjKz04OworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgIC8qIG1iIGNvZGVkICovCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgZmZfaDI2M19pbnRlcl9NQ0JQQ19iaXRzW2NicGMgKyA0XSwKKyAgICAgICAgICAgICAgICBmZl9oMjYzX2ludGVyX01DQlBDX2NvZGVbY2JwYyArIDRdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+aDI2M19haWMpIHsKKyAgICAgICAgICAgIC8qIFhYWDogY3VycmVudGx5LCB3ZSBkbyBub3QgdHJ5IHRvIHVzZSBhYyBwcmVkaWN0aW9uICovCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgLyogbm8gQUMgcHJlZGljdGlvbiAqLworICAgICAgICB9CisgICAgICAgIGNicHkgPSBjYnAgPj4gMjsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBmZl9oMjYzX2NicHlfdGFiW2NicHldWzFdLCBmZl9oMjYzX2NicHlfdGFiW2NicHldWzBdKTsKKyAgICAgICAgaWYocy0+ZHF1YW50KQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBkcXVhbnRfY29kZVtzLT5kcXVhbnQrMl0pOworCisgICAgICAgIGlmKGludGVybGVhdmVkX3N0YXRzKXsKKyAgICAgICAgICAgIHMtPm1pc2NfYml0cys9IGdldF9iaXRzX2RpZmYocyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPDY7IGkrKykgeworICAgICAgICAvKiBlbmNvZGUgZWFjaCBibG9jayAqLworICAgICAgICBoMjYzX2VuY29kZV9ibG9jayhzLCBibG9ja1tpXSwgaSk7CisKKyAgICAgICAgLyogVXBkYXRlIElOVFJBREMgZm9yIGRlY29kaW5nICovCisgICAgICAgIGlmIChzLT5oMjYzX2FpYyAmJiBzLT5tYl9pbnRyYSkgeworICAgICAgICAgICAgYmxvY2tbaV1bMF0gPSByZWNfaW50cmFkY1tpXTsKKworICAgICAgICB9CisgICAgfQorCisgICAgaWYoaW50ZXJsZWF2ZWRfc3RhdHMpeworICAgICAgICBpZiAoIXMtPm1iX2ludHJhKSB7CisgICAgICAgICAgICBzLT5wX3RleF9iaXRzKz0gZ2V0X2JpdHNfZGlmZihzKTsKKyAgICAgICAgICAgIHMtPmZfY291bnQrKzsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBzLT5pX3RleF9iaXRzKz0gZ2V0X2JpdHNfZGlmZihzKTsKKyAgICAgICAgICAgIHMtPmlfY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl9oMjYzX2VuY29kZV9tb3Rpb24oTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgdmFsLCBpbnQgZl9jb2RlKQoreworICAgIGludCByYW5nZSwgYml0X3NpemUsIHNpZ24sIGNvZGUsIGJpdHM7CisKKyAgICBpZiAodmFsID09IDApIHsKKyAgICAgICAgLyogemVybyB2ZWN0b3IgKi8KKyAgICAgICAgY29kZSA9IDA7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgZmZfbXZ0YWJbY29kZV1bMV0sIGZmX212dGFiW2NvZGVdWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBiaXRfc2l6ZSA9IGZfY29kZSAtIDE7CisgICAgICAgIHJhbmdlID0gMSA8PCBiaXRfc2l6ZTsKKyAgICAgICAgLyogbW9kdWxvIGVuY29kaW5nICovCisgICAgICAgIHZhbCA9IHNpZ25fZXh0ZW5kKHZhbCwgNiArIGJpdF9zaXplKTsKKyAgICAgICAgc2lnbiA9IHZhbD4+MzE7CisgICAgICAgIHZhbD0gKHZhbF5zaWduKS1zaWduOworICAgICAgICBzaWduJj0xOworCisgICAgICAgIHZhbC0tOworICAgICAgICBjb2RlID0gKHZhbCA+PiBiaXRfc2l6ZSkgKyAxOworICAgICAgICBiaXRzID0gdmFsICYgKHJhbmdlIC0gMSk7CisKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBmZl9tdnRhYltjb2RlXVsxXSArIDEsIChmZl9tdnRhYltjb2RlXVswXSA8PCAxKSB8IHNpZ24pOworICAgICAgICBpZiAoYml0X3NpemUgPiAwKSB7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIGJpdF9zaXplLCBiaXRzKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X212X3BlbmFsdHlfYW5kX2Zjb2RlKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludCBmX2NvZGU7CisgICAgaW50IG12OworCisgICAgZm9yKGZfY29kZT0xOyBmX2NvZGU8PU1BWF9GQ09ERTsgZl9jb2RlKyspeworICAgICAgICBmb3IobXY9LU1BWF9NVjsgbXY8PU1BWF9NVjsgbXYrKyl7CisgICAgICAgICAgICBpbnQgbGVuOworCisgICAgICAgICAgICBpZihtdj09MCkgbGVuPSBmZl9tdnRhYlswXVsxXTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgaW50IHZhbCwgYml0X3NpemUsIGNvZGU7CisKKyAgICAgICAgICAgICAgICBiaXRfc2l6ZSA9IGZfY29kZSAtIDE7CisKKyAgICAgICAgICAgICAgICB2YWw9bXY7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA8IDApCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IC12YWw7CisgICAgICAgICAgICAgICAgdmFsLS07CisgICAgICAgICAgICAgICAgY29kZSA9ICh2YWwgPj4gYml0X3NpemUpICsgMTsKKyAgICAgICAgICAgICAgICBpZihjb2RlPDMzKXsKKyAgICAgICAgICAgICAgICAgICAgbGVuPSBmZl9tdnRhYltjb2RlXVsxXSArIDEgKyBiaXRfc2l6ZTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgbGVuPSBmZl9tdnRhYlszMl1bMV0gKyBhdl9sb2cyKGNvZGU+PjUpICsgMiArIGJpdF9zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbXZfcGVuYWx0eVtmX2NvZGVdW212K01BWF9NVl09IGxlbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcihmX2NvZGU9TUFYX0ZDT0RFOyBmX2NvZGU+MDsgZl9jb2RlLS0peworICAgICAgICBmb3IobXY9LSgxNjw8Zl9jb2RlKTsgbXY8KDE2PDxmX2NvZGUpOyBtdisrKXsKKyAgICAgICAgICAgIGZjb2RlX3RhYlttditNQVhfTVZdPSBmX2NvZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IobXY9MDsgbXY8TUFYX01WKjIrMTsgbXYrKyl7CisgICAgICAgIHVtdl9mY29kZV90YWJbbXZdPSAxOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X3VuaV9oMjYzX3JsX3RhYihSTFRhYmxlICpybCwgdWludDMyX3QgKmJpdHNfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpsZW5fdGFiKQoreworICAgIGludCBzbGV2ZWwsIHJ1biwgbGFzdDsKKworICAgIGF2X2Fzc2VydDAoTUFYX0xFVkVMID49IDY0KTsKKyAgICBhdl9hc3NlcnQwKE1BWF9SVU4gICA+PSA2Myk7CisKKyAgICBmb3Ioc2xldmVsPS02NDsgc2xldmVsPDY0OyBzbGV2ZWwrKyl7CisgICAgICAgIGlmKHNsZXZlbD09MCkgY29udGludWU7CisgICAgICAgIGZvcihydW49MDsgcnVuPDY0OyBydW4rKyl7CisgICAgICAgICAgICBmb3IobGFzdD0wOyBsYXN0PD0xOyBsYXN0KyspeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleD0gVU5JX01QRUc0X0VOQ19JTkRFWChsYXN0LCBydW4sIHNsZXZlbCs2NCk7CisgICAgICAgICAgICAgICAgaW50IGxldmVsPSBzbGV2ZWwgPCAwID8gLXNsZXZlbCA6IHNsZXZlbDsKKyAgICAgICAgICAgICAgICBpbnQgc2lnbj0gc2xldmVsIDwgMCA/IDEgOiAwOworICAgICAgICAgICAgICAgIGludCBiaXRzLCBsZW4sIGNvZGU7CisKKyAgICAgICAgICAgICAgICBsZW5fdGFiW2luZGV4XT0gMTAwOworCisgICAgICAgICAgICAgICAgLyogRVNDMCAqLworICAgICAgICAgICAgICAgIGNvZGU9IGdldF9ybF9pbmRleChybCwgbGFzdCwgcnVuLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgYml0cz0gcmwtPnRhYmxlX3ZsY1tjb2RlXVswXTsKKyAgICAgICAgICAgICAgICBsZW49ICBybC0+dGFibGVfdmxjW2NvZGVdWzFdOworICAgICAgICAgICAgICAgIGJpdHM9Yml0cyoyK3NpZ247IGxlbisrOworCisgICAgICAgICAgICAgICAgaWYoY29kZSE9cmwtPm4gJiYgbGVuIDwgbGVuX3RhYltpbmRleF0peworICAgICAgICAgICAgICAgICAgICBpZihiaXRzX3RhYikgYml0c190YWJbaW5kZXhdPSBiaXRzOworICAgICAgICAgICAgICAgICAgICBsZW5fdGFiIFtpbmRleF09IGxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRVNDICovCisgICAgICAgICAgICAgICAgYml0cz0gcmwtPnRhYmxlX3ZsY1tybC0+bl1bMF07CisgICAgICAgICAgICAgICAgbGVuID0gcmwtPnRhYmxlX3ZsY1tybC0+bl1bMV07CisgICAgICAgICAgICAgICAgYml0cz1iaXRzKjIrbGFzdDsgbGVuKys7CisgICAgICAgICAgICAgICAgYml0cz1iaXRzKjY0K3J1bjsgbGVuKz02OworICAgICAgICAgICAgICAgIGJpdHM9Yml0cyoyNTYrKGxldmVsJjB4ZmYpOyBsZW4rPTg7CisKKyAgICAgICAgICAgICAgICBpZihsZW4gPCBsZW5fdGFiW2luZGV4XSl7CisgICAgICAgICAgICAgICAgICAgIGlmKGJpdHNfdGFiKSBiaXRzX3RhYltpbmRleF09IGJpdHM7CisgICAgICAgICAgICAgICAgICAgIGxlbl90YWIgW2luZGV4XT0gbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworYXZfY29sZCB2b2lkIGZmX2gyNjNfZW5jb2RlX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgc3RhdGljIGludCBkb25lID0gMDsKKworICAgIGlmICghZG9uZSkgeworICAgICAgICBkb25lID0gMTsKKworICAgICAgICBmZl9pbml0X3JsKCZmZl9oMjYzX3JsX2ludGVyLCBmZl9oMjYzX3N0YXRpY19ybF90YWJsZV9zdG9yZVswXSk7CisgICAgICAgIGZmX2luaXRfcmwoJmZmX3JsX2ludHJhX2FpYywgZmZfaDI2M19zdGF0aWNfcmxfdGFibGVfc3RvcmVbMV0pOworCisgICAgICAgIGluaXRfdW5pX2gyNjNfcmxfdGFiKCZmZl9ybF9pbnRyYV9haWMsIE5VTEwsIHVuaV9oMjYzX2ludHJhX2FpY19ybF9sZW4pOworICAgICAgICBpbml0X3VuaV9oMjYzX3JsX3RhYigmZmZfaDI2M19ybF9pbnRlciAgICAsIE5VTEwsIHVuaV9oMjYzX2ludGVyX3JsX2xlbik7CisKKyAgICAgICAgaW5pdF9tdl9wZW5hbHR5X2FuZF9mY29kZShzKTsKKyAgICB9CisgICAgcy0+bWUubXZfcGVuYWx0eT0gbXZfcGVuYWx0eTsgLy9GSVhNRSBleGFjdCB0YWJsZSBmb3IgbXNtcGVnNCAmIGgyNjNwCisKKyAgICBzLT5pbnRyYV9hY192bGNfbGVuZ3RoICAgICA9cy0+aW50ZXJfYWNfdmxjX2xlbmd0aCAgICAgPSB1bmlfaDI2M19pbnRlcl9ybF9sZW47CisgICAgcy0+aW50cmFfYWNfdmxjX2xhc3RfbGVuZ3RoPXMtPmludGVyX2FjX3ZsY19sYXN0X2xlbmd0aD0gdW5pX2gyNjNfaW50ZXJfcmxfbGVuICsgMTI4KjY0OworICAgIGlmKHMtPmgyNjNfYWljKXsKKyAgICAgICAgcy0+aW50cmFfYWNfdmxjX2xlbmd0aCAgICAgPSB1bmlfaDI2M19pbnRyYV9haWNfcmxfbGVuOworICAgICAgICBzLT5pbnRyYV9hY192bGNfbGFzdF9sZW5ndGg9IHVuaV9oMjYzX2ludHJhX2FpY19ybF9sZW4gKyAxMjgqNjQ7CisgICAgfQorICAgIHMtPmFjX2VzY19sZW5ndGg9IDcrMSs2Kzg7CisKKyAgICAvLyB1c2UgZmNvZGVzID4xIG9ubHkgZm9yIG1wZWc0ICYgaDI2MyAmIGgyNjNwIEZJWE1FCisgICAgc3dpdGNoKHMtPmNvZGVjX2lkKXsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OgorICAgICAgICBzLT5mY29kZV90YWI9IGZjb2RlX3RhYjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzUDoKKyAgICAgICAgaWYocy0+dW12cGx1cykKKyAgICAgICAgICAgIHMtPmZjb2RlX3RhYj0gdW12X2Zjb2RlX3RhYjsKKyAgICAgICAgaWYocy0+bW9kaWZpZWRfcXVhbnQpeworICAgICAgICAgICAgcy0+bWluX3Fjb2VmZj0gLTIwNDc7CisgICAgICAgICAgICBzLT5tYXhfcWNvZWZmPSAgMjA0NzsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBzLT5taW5fcWNvZWZmPSAtMTI3OworICAgICAgICAgICAgcy0+bWF4X3Fjb2VmZj0gIDEyNzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgLy9Ob3RlIGZvciBtcGVnNCAmIGgyNjMgdGhlIGRjLXNjYWxlIHRhYmxlIHdpbGwgYmUgc2V0IHBlciBmcmFtZSBhcyBuZWVkZWQgbGF0ZXIKKyAgICBjYXNlIEFWX0NPREVDX0lEX0ZMVjE6CisgICAgICAgIGlmIChzLT5oMjYzX2ZsdiA+IDEpIHsKKyAgICAgICAgICAgIHMtPm1pbl9xY29lZmY9IC0xMDIzOworICAgICAgICAgICAgcy0+bWF4X3Fjb2VmZj0gIDEwMjM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5taW5fcWNvZWZmPSAtMTI3OworICAgICAgICAgICAgcy0+bWF4X3Fjb2VmZj0gIDEyNzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAvL25vdGhpbmcgbmVlZGVkIC0gZGVmYXVsdCB0YWJsZSBhbHJlYWR5IHNldCBpbiBtcGVndmlkZW8uYworICAgICAgICBzLT5taW5fcWNvZWZmPSAtMTI3OworICAgICAgICBzLT5tYXhfcWNvZWZmPSAgMTI3OworICAgIH0KKyAgICBpZihzLT5oMjYzX2FpYyl7CisgICAgICAgICBzLT55X2RjX3NjYWxlX3RhYmxlPQorICAgICAgICAgcy0+Y19kY19zY2FsZV90YWJsZT0gZmZfYWljX2RjX3NjYWxlX3RhYmxlOworICAgIH1lbHNleworICAgICAgICBzLT55X2RjX3NjYWxlX3RhYmxlPQorICAgICAgICBzLT5jX2RjX3NjYWxlX3RhYmxlPSBmZl9tcGVnMV9kY19zY2FsZV90YWJsZTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfaDI2M19lbmNvZGVfbWJhKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludCBpLCBtYl9wb3M7CisKKyAgICBmb3IoaT0wOyBpPDY7IGkrKyl7CisgICAgICAgIGlmKHMtPm1iX251bS0xIDw9IGZmX21iYV9tYXhbaV0pIGJyZWFrOworICAgIH0KKyAgICBtYl9wb3M9IHMtPm1iX3ggKyBzLT5tYl93aWR0aCpzLT5tYl95OworICAgIHB1dF9iaXRzKCZzLT5wYiwgZmZfbWJhX2xlbmd0aFtpXSwgbWJfcG9zKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2l2aV9jb21tb24uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2l2aV9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzk1MDgxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaXZpX2NvbW1vbi5jCkBAIC0wLDAgKzEsMTU5NyBAQAorLyoKKyAqIGNvbW1vbiBmdW5jdGlvbnMgZm9yIEluZGVvIFZpZGVvIEludGVyYWN0aXZlIGNvZGVjcyAoSW5kZW80IGFuZCBJbmRlbzUpCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1heGltIFBvbGlha292c2tpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgYW5kIGRhdGEgc2hhcmVkIGJ5IGJvdGggSW5kZW80IGFuZAorICogSW5kZW81IGRlY29kZXJzLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgIml2aV9jb21tb24uaCIKKyNpbmNsdWRlICJpdmlfZHNwLmgiCisKKy8qKgorICogVGhlc2UgYXJlIDJ4OCBwcmVkZWZpbmVkIEh1ZmZtYW4gY29kZWJvb2tzIGZvciBjb2RpbmcgbWFjcm9ibG9jay9ibG9jaworICogc2lnbmFscy4gVGhleSBhcmUgc3BlY2lmaWVkIHVzaW5nICJodWZmbWFuIGRlc2NyaXB0b3JzIiBpbiBvcmRlciB0bworICogYXZvaWQgaHVnZSBzdGF0aWMgdGFibGVzLiBUaGUgZGVjb2RpbmcgdGFibGVzIHdpbGwgYmUgZ2VuZXJhdGVkIGF0CisgKiBzdGFydHVwIGZyb20gdGhlc2UgZGVzY3JpcHRvcnMuCisgKi8KKy8qKiBzdGF0aWMgbWFjcm9ibG9jayBodWZmbWFuIHRhYmxlcyAqLworc3RhdGljIGNvbnN0IElWSUh1ZmZEZXNjIGl2aV9tYl9odWZmX2Rlc2NbOF0gPSB7CisgICAgezgsICB7MCwgNCwgNSwgNCwgNCwgNCwgNiwgNn19LAorICAgIHsxMiwgezAsIDIsIDIsIDMsIDMsIDMsIDMsIDUsIDMsIDIsIDIsIDJ9fSwKKyAgICB7MTIsIHswLCAyLCAzLCA0LCAzLCAzLCAzLCAzLCA0LCAzLCAyLCAyfX0sCisgICAgezEyLCB7MCwgMywgNCwgNCwgMywgMywgMywgMywgMywgMiwgMiwgMn19LAorICAgIHsxMywgezAsIDQsIDQsIDMsIDMsIDMsIDMsIDIsIDMsIDMsIDIsIDEsIDF9fSwKKyAgICB7OSwgIHswLCA0LCA0LCA0LCA0LCAzLCAzLCAzLCAyfX0sCisgICAgezEwLCB7MCwgNCwgNCwgNCwgNCwgMywgMywgMiwgMiwgMn19LAorICAgIHsxMiwgezAsIDQsIDQsIDQsIDMsIDMsIDIsIDMsIDIsIDIsIDIsIDJ9fQorfTsKKworLyoqIHN0YXRpYyBibG9jayBodWZmbWFuIHRhYmxlcyAqLworc3RhdGljIGNvbnN0IElWSUh1ZmZEZXNjIGl2aV9ibGtfaHVmZl9kZXNjWzhdID0geworICAgIHsxMCwgezEsIDIsIDMsIDQsIDQsIDcsIDUsIDUsIDQsIDF9fSwKKyAgICB7MTEsIHsyLCAzLCA0LCA0LCA0LCA3LCA1LCA0LCAzLCAzLCAyfX0sCisgICAgezEyLCB7MiwgNCwgNSwgNSwgNSwgNSwgNiwgNCwgNCwgMywgMSwgMX19LAorICAgIHsxMywgezMsIDMsIDQsIDQsIDUsIDYsIDYsIDQsIDQsIDMsIDIsIDEsIDF9fSwKKyAgICB7MTEsIHszLCA0LCA0LCA1LCA1LCA1LCA2LCA1LCA0LCAyLCAyfX0sCisgICAgezEzLCB7MywgNCwgNSwgNSwgNSwgNSwgNiwgNCwgMywgMywgMiwgMSwgMX19LAorICAgIHsxMywgezMsIDQsIDUsIDUsIDUsIDYsIDUsIDQsIDMsIDMsIDIsIDEsIDF9fSwKKyAgICB7OSwgIHszLCA0LCA0LCA1LCA1LCA1LCA2LCA1LCA1fX0KK307CisKK3N0YXRpYyBWTEMgaXZpX21iX3ZsY190YWJzIFs4XTsgLy8vPCBzdGF0aWMgbWFjcm9ibG9jayBIdWZmbWFuIHRhYmxlcworc3RhdGljIFZMQyBpdmlfYmxrX3ZsY190YWJzWzhdOyAvLy88IHN0YXRpYyBibG9jayBIdWZmbWFuIHRhYmxlcworCit0eXBlZGVmIHZvaWQgKCppdmlfbWNfZnVuYykgKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGl0Y2gsIGludCBtY190eXBlKTsKK3R5cGVkZWYgdm9pZCAoKml2aV9tY19hdmdfZnVuYykgKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpyZWZfYnVmMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpdGNoLCBpbnQgbWNfdHlwZSwgaW50IG1jX3R5cGUyKTsKKworc3RhdGljIGludCBpdmlfbWMoSVZJQmFuZERlc2MgKmJhbmQsIGl2aV9tY19mdW5jIG1jLCBpdmlfbWNfYXZnX2Z1bmMgbWNfYXZnLAorICAgICAgICAgICAgICAgICAgaW50IG9mZnMsIGludCBtdl94LCBpbnQgbXZfeSwgaW50IG12X3gyLCBpbnQgbXZfeTIsCisgICAgICAgICAgICAgICAgICBpbnQgbWNfdHlwZSwgaW50IG1jX3R5cGUyKQoreworICAgIGludCByZWZfb2ZmcyA9IG9mZnMgKyBtdl95ICogYmFuZC0+cGl0Y2ggKyBtdl94OworICAgIGludCBidWZfc2l6ZSA9IGJhbmQtPnBpdGNoICogYmFuZC0+YWhlaWdodDsKKyAgICBpbnQgbWluX3NpemUgPSBiYW5kLT5waXRjaCAqIChiYW5kLT5ibGtfc2l6ZSAtIDEpICsgYmFuZC0+YmxrX3NpemU7CisgICAgaW50IHJlZl9zaXplID0gKG1jX3R5cGUgPiAxKSAqIGJhbmQtPnBpdGNoICsgKG1jX3R5cGUgJiAxKTsKKworICAgIGlmIChtY190eXBlICE9IC0xKSB7CisgICAgICAgIGF2X2Fzc2VydDAob2ZmcyA+PSAwICYmIHJlZl9vZmZzID49IDAgJiYgYmFuZC0+cmVmX2J1Zik7CisgICAgICAgIGF2X2Fzc2VydDAoYnVmX3NpemUgLSBtaW5fc2l6ZSA+PSBvZmZzKTsKKyAgICAgICAgYXZfYXNzZXJ0MChidWZfc2l6ZSAtIG1pbl9zaXplIC0gcmVmX3NpemUgPj0gcmVmX29mZnMpOworICAgIH0KKworICAgIGlmIChtY190eXBlMiA9PSAtMSkgeworICAgICAgICBtYyhiYW5kLT5idWYgKyBvZmZzLCBiYW5kLT5yZWZfYnVmICsgcmVmX29mZnMsIGJhbmQtPnBpdGNoLCBtY190eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcmVmX29mZnMyID0gb2ZmcyArIG12X3kyICogYmFuZC0+cGl0Y2ggKyBtdl94MjsKKyAgICAgICAgaW50IHJlZl9zaXplMiA9IChtY190eXBlMiA+IDEpICogYmFuZC0+cGl0Y2ggKyAobWNfdHlwZTIgJiAxKTsKKyAgICAgICAgaWYgKG9mZnMgPCAwIHx8IHJlZl9vZmZzMiA8IDAgfHwgIWJhbmQtPmJfcmVmX2J1ZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAoYnVmX3NpemUgLSBtaW5fc2l6ZSAtIHJlZl9zaXplMiA8IHJlZl9vZmZzMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGlmIChtY190eXBlID09IC0xKQorICAgICAgICAgICAgbWMoYmFuZC0+YnVmICsgb2ZmcywgYmFuZC0+Yl9yZWZfYnVmICsgcmVmX29mZnMyLAorICAgICAgICAgICAgICAgYmFuZC0+cGl0Y2gsIG1jX3R5cGUyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWNfYXZnKGJhbmQtPmJ1ZiArIG9mZnMsIGJhbmQtPnJlZl9idWYgKyByZWZfb2ZmcywKKyAgICAgICAgICAgICAgICAgICBiYW5kLT5iX3JlZl9idWYgKyByZWZfb2ZmczIsIGJhbmQtPnBpdGNoLAorICAgICAgICAgICAgICAgICAgIG1jX3R5cGUsIG1jX3R5cGUyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiAgUmV2ZXJzZSAibmJpdHMiIGJpdHMgb2YgdGhlIHZhbHVlICJ2YWwiIGFuZCByZXR1cm4gdGhlIHJlc3VsdAorICogIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLgorICovCitzdGF0aWMgdWludDE2X3QgaW52X2JpdHModWludDE2X3QgdmFsLCBpbnQgbmJpdHMpCit7CisgICAgdWludDE2X3QgcmVzOworCisgICAgaWYgKG5iaXRzIDw9IDgpIHsKKyAgICAgICAgcmVzID0gZmZfcmV2ZXJzZVt2YWxdID4+ICg4IC0gbmJpdHMpOworICAgIH0gZWxzZQorICAgICAgICByZXMgPSAoKGZmX3JldmVyc2VbdmFsICYgMHhGRl0gPDwgOCkgKworICAgICAgICAgICAgICAgKGZmX3JldmVyc2VbdmFsID4+IDhdKSkgPj4gKDE2IC0gbmJpdHMpOworCisgICAgcmV0dXJuIHJlczsKK30KKworLyoKKyAqICBHZW5lcmF0ZSBhIGh1ZmZtYW4gY29kZWJvb2sgZnJvbSB0aGUgZ2l2ZW4gZGVzY3JpcHRvcgorICogIGFuZCBjb252ZXJ0IGl0IGludG8gdGhlIEZGbXBlZyBWTEMgdGFibGUuCisgKgorICogIEBwYXJhbVtpbl0gICBjYiAgICBwb2ludGVyIHRvIGNvZGVib29rIGRlc2NyaXB0b3IKKyAqICBAcGFyYW1bb3V0XSAgdmxjICAgd2hlcmUgdG8gcGxhY2UgdGhlIGdlbmVyYXRlZCBWTEMgdGFibGUKKyAqICBAcGFyYW1baW5dICAgZmxhZyAgZmxhZzogMSAtIGZvciBzdGF0aWMgb3IgMCBmb3IgZHluYW1pYyB0YWJsZXMKKyAqICBAcmV0dXJuICAgICByZXN1bHQgY29kZTogMCAtIE9LLCAtMSA9IGVycm9yIChpbnZhbGlkIGNvZGVib29rIGRlc2NyaXB0b3IpCisgKi8KK3N0YXRpYyBpbnQgaXZpX2NyZWF0ZV9odWZmX2Zyb21fZGVzYyhjb25zdCBJVklIdWZmRGVzYyAqY2IsIFZMQyAqdmxjLCBpbnQgZmxhZykKK3sKKyAgICBpbnQgICAgICAgICBwb3MsIGksIGosIGNvZGVzX3Blcl9yb3csIHByZWZpeCwgbm90X2xhc3Rfcm93OworICAgIHVpbnQxNl90ICAgIGNvZGV3b3Jkc1syNTZdOyAvKiBGSVhNRTogbW92ZSB0aGlzIHRlbXBvcmFsIHN0b3JhZ2Ugb3V0PyAqLworICAgIHVpbnQ4X3QgICAgIGJpdHNbMjU2XTsKKworICAgIHBvcyA9IDA7IC8qIGN1cnJlbnQgcG9zaXRpb24gPSAwICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2ItPm51bV9yb3dzOyBpKyspIHsKKyAgICAgICAgY29kZXNfcGVyX3JvdyA9IDEgPDwgY2ItPnhiaXRzW2ldOworICAgICAgICBub3RfbGFzdF9yb3cgID0gKGkgIT0gY2ItPm51bV9yb3dzIC0gMSk7CisgICAgICAgIHByZWZpeCAgICAgICAgPSAoKDEgPDwgaSkgLSAxKSA8PCAoY2ItPnhiaXRzW2ldICsgbm90X2xhc3Rfcm93KTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29kZXNfcGVyX3JvdzsgaisrKSB7CisgICAgICAgICAgICBpZiAocG9zID49IDI1NikgLyogU29tZSBJbmRlbzUgY29kZWJvb2tzIGNhbiBoYXZlIG1vcmUgdGhhbiAyNTYgKi8KKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAvKiBlbGVtZW50cywgYnV0IG9ubHkgMjU2IGNvZGVzIGFyZSBhbGxvd2VkISAqLworCisgICAgICAgICAgICBiaXRzW3Bvc10gPSBpICsgY2ItPnhiaXRzW2ldICsgbm90X2xhc3Rfcm93OworICAgICAgICAgICAgaWYgKGJpdHNbcG9zXSA+IElWSV9WTENfQklUUykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgLyogaW52YWxpZCBkZXNjcmlwdG9yICovCisKKyAgICAgICAgICAgIGNvZGV3b3Jkc1twb3NdID0gaW52X2JpdHMoKHByZWZpeCB8IGopLCBiaXRzW3Bvc10pOworICAgICAgICAgICAgaWYgKCFiaXRzW3Bvc10pCisgICAgICAgICAgICAgICAgYml0c1twb3NdID0gMTsKKworICAgICAgICAgICAgcG9zKys7CisgICAgICAgIH0vL2ZvciBqCisgICAgfS8vZm9yIGkKKworICAgIC8qIG51bWJlciBvZiBjb2Rld29yZHMgPSBwb3MgKi8KKyAgICByZXR1cm4gaW5pdF92bGModmxjLCBJVklfVkxDX0JJVFMsIHBvcywgYml0cywgMSwgMSwgY29kZXdvcmRzLCAyLCAyLAorICAgICAgICAgICAgICAgICAgICAoZmxhZyA/IElOSVRfVkxDX1VTRV9ORVdfU1RBVElDIDogMCkgfCBJTklUX1ZMQ19MRSk7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9pdmlfaW5pdF9zdGF0aWNfdmxjKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgc3RhdGljIFZMQ19UWVBFIHRhYmxlX2RhdGFbODE5MiAqIDE2XVsyXTsKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkX3ZsY3MgPSAwOworCisgICAgaWYgKGluaXRpYWxpemVkX3ZsY3MpCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGl2aV9tYl92bGNfdGFic1tpXS50YWJsZSA9IHRhYmxlX2RhdGEgKyBpICogMiAqIDgxOTI7CisgICAgICAgIGl2aV9tYl92bGNfdGFic1tpXS50YWJsZV9hbGxvY2F0ZWQgPSA4MTkyOworICAgICAgICBpdmlfY3JlYXRlX2h1ZmZfZnJvbV9kZXNjKCZpdmlfbWJfaHVmZl9kZXNjW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdmlfbWJfdmxjX3RhYnNbaV0sIDEpOworICAgICAgICBpdmlfYmxrX3ZsY190YWJzW2ldLnRhYmxlID0gdGFibGVfZGF0YSArIChpICogMiArIDEpICogODE5MjsKKyAgICAgICAgaXZpX2Jsa192bGNfdGFic1tpXS50YWJsZV9hbGxvY2F0ZWQgPSA4MTkyOworICAgICAgICBpdmlfY3JlYXRlX2h1ZmZfZnJvbV9kZXNjKCZpdmlfYmxrX2h1ZmZfZGVzY1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXZpX2Jsa192bGNfdGFic1tpXSwgMSk7CisgICAgfQorICAgIGluaXRpYWxpemVkX3ZsY3MgPSAxOworfQorCisvKgorICogIENvcHkgaHVmZm1hbiBjb2RlYm9vayBkZXNjcmlwdG9ycy4KKyAqCisgKiAgQHBhcmFtW291dF0gIGRzdCAgcHRyIHRvIHRoZSBkZXN0aW5hdGlvbiBkZXNjcmlwdG9yCisgKiAgQHBhcmFtW2luXSAgIHNyYyAgcHRyIHRvIHRoZSBzb3VyY2UgZGVzY3JpcHRvcgorICovCitzdGF0aWMgdm9pZCBpdmlfaHVmZl9kZXNjX2NvcHkoSVZJSHVmZkRlc2MgKmRzdCwgY29uc3QgSVZJSHVmZkRlc2MgKnNyYykKK3sKKyAgICBkc3QtPm51bV9yb3dzID0gc3JjLT5udW1fcm93czsKKyAgICBtZW1jcHkoZHN0LT54Yml0cywgc3JjLT54Yml0cywgc3JjLT5udW1fcm93cyk7Cit9CisKKy8qCisgKiAgQ29tcGFyZSB0d28gaHVmZm1hbiBjb2RlYm9vayBkZXNjcmlwdG9ycy4KKyAqCisgKiAgQHBhcmFtW2luXSAgZGVzYzEgIHB0ciB0byB0aGUgMXN0IGRlc2NyaXB0b3IgdG8gY29tcGFyZQorICogIEBwYXJhbVtpbl0gIGRlc2MyICBwdHIgdG8gdGhlIDJuZCBkZXNjcmlwdG9yIHRvIGNvbXBhcmUKKyAqICBAcmV0dXJuICAgICAgICAgY29tcGFyaXNvbiByZXN1bHQ6IDAgLSBlcXVhbCwgMSAtIG5vdCBlcXVhbAorICovCitzdGF0aWMgaW50IGl2aV9odWZmX2Rlc2NfY21wKGNvbnN0IElWSUh1ZmZEZXNjICpkZXNjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSVZJSHVmZkRlc2MgKmRlc2MyKQoreworICAgIHJldHVybiBkZXNjMS0+bnVtX3Jvd3MgIT0gZGVzYzItPm51bV9yb3dzIHx8CisgICAgICAgICAgIG1lbWNtcChkZXNjMS0+eGJpdHMsIGRlc2MyLT54Yml0cywgZGVzYzEtPm51bV9yb3dzKTsKK30KKworaW50IGZmX2l2aV9kZWNfaHVmZl9kZXNjKEdldEJpdENvbnRleHQgKmdiLCBpbnQgZGVzY19jb2RlZCwgaW50IHdoaWNoX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJVklIdWZmVGFiICpodWZmX3RhYiwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBpLCByZXN1bHQ7CisgICAgSVZJSHVmZkRlc2MgbmV3X2h1ZmY7CisKKyAgICBpZiAoIWRlc2NfY29kZWQpIHsKKyAgICAgICAgLyogc2VsZWN0IGRlZmF1bHQgdGFibGUgKi8KKyAgICAgICAgaHVmZl90YWItPnRhYiA9ICh3aGljaF90YWIpID8gJml2aV9ibGtfdmxjX3RhYnNbN10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJml2aV9tYl92bGNfdGFicyBbN107CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGh1ZmZfdGFiLT50YWJfc2VsID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgIGlmIChodWZmX3RhYi0+dGFiX3NlbCA9PSA3KSB7CisgICAgICAgIC8qIGN1c3RvbSBodWZmbWFuIHRhYmxlIChleHBsaWNpdGx5IGVuY29kZWQpICovCisgICAgICAgIG5ld19odWZmLm51bV9yb3dzID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBpZiAoIW5ld19odWZmLm51bV9yb3dzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVtcHR5IGN1c3RvbSBIdWZmbWFuIHRhYmxlIVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZXdfaHVmZi5udW1fcm93czsgaSsrKQorICAgICAgICAgICAgbmV3X2h1ZmYueGJpdHNbaV0gPSBnZXRfYml0cyhnYiwgNCk7CisKKyAgICAgICAgLyogSGF2ZSB3ZSBnb3QgdGhlIHNhbWUgY3VzdG9tIHRhYmxlPyBSZWJ1aWxkIGlmIG5vdC4gKi8KKyAgICAgICAgaWYgKGl2aV9odWZmX2Rlc2NfY21wKCZuZXdfaHVmZiwgJmh1ZmZfdGFiLT5jdXN0X2Rlc2MpIHx8ICFodWZmX3RhYi0+Y3VzdF90YWIudGFibGUpIHsKKyAgICAgICAgICAgIGl2aV9odWZmX2Rlc2NfY29weSgmaHVmZl90YWItPmN1c3RfZGVzYywgJm5ld19odWZmKTsKKworICAgICAgICAgICAgaWYgKGh1ZmZfdGFiLT5jdXN0X3RhYi50YWJsZSkKKyAgICAgICAgICAgICAgICBmZl9mcmVlX3ZsYygmaHVmZl90YWItPmN1c3RfdGFiKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGl2aV9jcmVhdGVfaHVmZl9mcm9tX2Rlc2MoJmh1ZmZfdGFiLT5jdXN0X2Rlc2MsCisgICAgICAgICAgICAgICAgICAgICZodWZmX3RhYi0+Y3VzdF90YWIsIDApOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIC8vIHJlc2V0IGZhdWx0eSBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgIGh1ZmZfdGFiLT5jdXN0X2Rlc2MubnVtX3Jvd3MgPSAwOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nIGN1c3RvbSB2bGMgdGFibGUhXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGh1ZmZfdGFiLT50YWIgPSAmaHVmZl90YWItPmN1c3RfdGFiOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHNlbGVjdCBvbmUgb2YgcHJlZGVmaW5lZCB0YWJsZXMgKi8KKyAgICAgICAgaHVmZl90YWItPnRhYiA9ICh3aGljaF90YWIpID8gJml2aV9ibGtfdmxjX3RhYnNbaHVmZl90YWItPnRhYl9zZWxdCisgICAgICAgICAgICA6ICZpdmlfbWJfdmxjX3RhYnMgW2h1ZmZfdGFiLT50YWJfc2VsXTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqICBGcmVlIHBsYW5lcywgYmFuZHMgYW5kIG1hY3JvYmxvY2tzIGJ1ZmZlcnMuCisgKgorICogIEBwYXJhbVtpbl0gIHBsYW5lcyAgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgdGhlIHBsYW5lIGRlc2NyaXB0b3JzCisgKi8KK3N0YXRpYyBhdl9jb2xkIHZvaWQgaXZpX2ZyZWVfYnVmZmVycyhJVklQbGFuZURlc2MgKnBsYW5lcykKK3sKKyAgICBpbnQgcCwgYiwgdDsKKworICAgIGZvciAocCA9IDA7IHAgPCAzOyBwKyspIHsKKyAgICAgICAgaWYgKHBsYW5lc1twXS5iYW5kcykKKyAgICAgICAgZm9yIChiID0gMDsgYiA8IHBsYW5lc1twXS5udW1fYmFuZHM7IGIrKykgeworICAgICAgICAgICAgYXZfZnJlZXAoJnBsYW5lc1twXS5iYW5kc1tiXS5idWZzWzBdKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwbGFuZXNbcF0uYmFuZHNbYl0uYnVmc1sxXSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmcGxhbmVzW3BdLmJhbmRzW2JdLmJ1ZnNbMl0pOworICAgICAgICAgICAgYXZfZnJlZXAoJnBsYW5lc1twXS5iYW5kc1tiXS5idWZzWzNdKTsKKworICAgICAgICAgICAgaWYgKHBsYW5lc1twXS5iYW5kc1tiXS5ibGtfdmxjLmN1c3RfdGFiLnRhYmxlKQorICAgICAgICAgICAgICAgIGZmX2ZyZWVfdmxjKCZwbGFuZXNbcF0uYmFuZHNbYl0uYmxrX3ZsYy5jdXN0X3RhYik7CisgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgcGxhbmVzW3BdLmJhbmRzW2JdLm51bV90aWxlczsgdCsrKQorICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZwbGFuZXNbcF0uYmFuZHNbYl0udGlsZXNbdF0ubWJzKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwbGFuZXNbcF0uYmFuZHNbYl0udGlsZXMpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVwKCZwbGFuZXNbcF0uYmFuZHMpOworICAgICAgICBwbGFuZXNbcF0ubnVtX2JhbmRzID0gMDsKKyAgICB9Cit9CisKK2F2X2NvbGQgaW50IGZmX2l2aV9pbml0X3BsYW5lcyhJVklQbGFuZURlc2MgKnBsYW5lcywgY29uc3QgSVZJUGljQ29uZmlnICpjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2luZGVvNCkKK3sKKyAgICBpbnQgcCwgYjsKKyAgICB1aW50MzJfdCBiX3dpZHRoLCBiX2hlaWdodCwgYWxpZ25fZmFjLCB3aWR0aF9hbGlnbmVkLAorICAgICAgICAgICAgIGhlaWdodF9hbGlnbmVkLCBidWZfc2l6ZTsKKyAgICBJVklCYW5kRGVzYyAqYmFuZDsKKworICAgIGl2aV9mcmVlX2J1ZmZlcnMocGxhbmVzKTsKKworICAgIGlmIChjZmctPnBpY193aWR0aCA8IDEgfHwgY2ZnLT5waWNfaGVpZ2h0IDwgMSB8fAorICAgICAgICBjZmctPmx1bWFfYmFuZHMgPCAxIHx8IGNmZy0+Y2hyb21hX2JhbmRzIDwgMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiBmaWxsIGluIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBsdW1pbmFuY2UgcGxhbmUgKi8KKyAgICBwbGFuZXNbMF0ud2lkdGggICAgID0gY2ZnLT5waWNfd2lkdGg7CisgICAgcGxhbmVzWzBdLmhlaWdodCAgICA9IGNmZy0+cGljX2hlaWdodDsKKyAgICBwbGFuZXNbMF0ubnVtX2JhbmRzID0gY2ZnLT5sdW1hX2JhbmRzOworCisgICAgLyogZmlsbCBpbiB0aGUgZGVzY3JpcHRvcnMgb2YgdGhlIGNocm9taW5hbmNlIHBsYW5lcyAqLworICAgIHBsYW5lc1sxXS53aWR0aCAgICAgPSBwbGFuZXNbMl0ud2lkdGggICAgID0gKGNmZy0+cGljX3dpZHRoICArIDMpID4+IDI7CisgICAgcGxhbmVzWzFdLmhlaWdodCAgICA9IHBsYW5lc1syXS5oZWlnaHQgICAgPSAoY2ZnLT5waWNfaGVpZ2h0ICsgMykgPj4gMjsKKyAgICBwbGFuZXNbMV0ubnVtX2JhbmRzID0gcGxhbmVzWzJdLm51bV9iYW5kcyA9IGNmZy0+Y2hyb21hX2JhbmRzOworCisgICAgZm9yIChwID0gMDsgcCA8IDM7IHArKykgeworICAgICAgICBwbGFuZXNbcF0uYmFuZHMgPSBhdl9tYWxsb2N6X2FycmF5KHBsYW5lc1twXS5udW1fYmFuZHMsIHNpemVvZihJVklCYW5kRGVzYykpOworICAgICAgICBpZiAoIXBsYW5lc1twXS5iYW5kcykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgLyogc2VsZWN0IGJhbmQgZGltZW5zaW9uczogaWYgdGhlcmUgaXMgb25seSBvbmUgYmFuZCB0aGVuIGl0CisgICAgICAgICAqICBoYXMgdGhlIGZ1bGwgc2l6ZSwgaWYgdGhlcmUgYXJlIHNldmVyYWwgYmFuZHMgZWFjaCBvZiB0aGVtCisgICAgICAgICAqICBoYXMgb25seSBoYWxmIHNpemUgKi8KKyAgICAgICAgYl93aWR0aCAgPSBwbGFuZXNbcF0ubnVtX2JhbmRzID09IDEgPyBwbGFuZXNbcF0ud2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocGxhbmVzW3BdLndpZHRoICArIDEpID4+IDE7CisgICAgICAgIGJfaGVpZ2h0ID0gcGxhbmVzW3BdLm51bV9iYW5kcyA9PSAxID8gcGxhbmVzW3BdLmhlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChwbGFuZXNbcF0uaGVpZ2h0ICsgMSkgPj4gMTsKKworICAgICAgICAvKiBsdW1hICAgYmFuZCBidWZmZXJzIHdpbGwgYmUgYWxpZ25lZCBvbiAxNngxNiAobWF4IG1hY3JvYmxvY2sgc2l6ZSkgKi8KKyAgICAgICAgLyogY2hyb21hIGJhbmQgYnVmZmVycyB3aWxsIGJlIGFsaWduZWQgb24gICA4eDggKG1heCBtYWNyb2Jsb2NrIHNpemUpICovCisgICAgICAgIGFsaWduX2ZhYyAgICAgICA9IHAgPyA4IDogMTY7CisgICAgICAgIHdpZHRoX2FsaWduZWQgICA9IEZGQUxJR04oYl93aWR0aCAsIGFsaWduX2ZhYyk7CisgICAgICAgIGhlaWdodF9hbGlnbmVkICA9IEZGQUxJR04oYl9oZWlnaHQsIGFsaWduX2ZhYyk7CisgICAgICAgIGJ1Zl9zaXplICAgICAgICA9IHdpZHRoX2FsaWduZWQgKiBoZWlnaHRfYWxpZ25lZCAqIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICBmb3IgKGIgPSAwOyBiIDwgcGxhbmVzW3BdLm51bV9iYW5kczsgYisrKSB7CisgICAgICAgICAgICBiYW5kID0gJnBsYW5lc1twXS5iYW5kc1tiXTsgLyogc2VsZWN0IGFwcHJvcHJpYXRlIHBsYW5lL2JhbmQgKi8KKyAgICAgICAgICAgIGJhbmQtPnBsYW5lICAgID0gcDsKKyAgICAgICAgICAgIGJhbmQtPmJhbmRfbnVtID0gYjsKKyAgICAgICAgICAgIGJhbmQtPndpZHRoICAgID0gYl93aWR0aDsKKyAgICAgICAgICAgIGJhbmQtPmhlaWdodCAgID0gYl9oZWlnaHQ7CisgICAgICAgICAgICBiYW5kLT5waXRjaCAgICA9IHdpZHRoX2FsaWduZWQ7CisgICAgICAgICAgICBiYW5kLT5haGVpZ2h0ICA9IGhlaWdodF9hbGlnbmVkOworICAgICAgICAgICAgYmFuZC0+YnVmc1swXSAgPSBhdl9tYWxsb2N6KGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIGJhbmQtPmJ1ZnNbMV0gID0gYXZfbWFsbG9jeihidWZfc2l6ZSk7CisgICAgICAgICAgICBiYW5kLT5idWZzaXplICA9IGJ1Zl9zaXplLzI7CisgICAgICAgICAgICBpZiAoIWJhbmQtPmJ1ZnNbMF0gfHwgIWJhbmQtPmJ1ZnNbMV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgLyogYWxsb2NhdGUgdGhlIDNyZCBiYW5kIGJ1ZmZlciBmb3Igc2NhbGFiaWxpdHkgbW9kZSAqLworICAgICAgICAgICAgaWYgKGNmZy0+bHVtYV9iYW5kcyA+IDEpIHsKKyAgICAgICAgICAgICAgICBiYW5kLT5idWZzWzJdID0gYXZfbWFsbG9jeihidWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFiYW5kLT5idWZzWzJdKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzX2luZGVvNCkgeworICAgICAgICAgICAgICAgIGJhbmQtPmJ1ZnNbM10gID0gYXZfbWFsbG9jeihidWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFiYW5kLT5idWZzWzNdKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogcmVzZXQgY3VzdG9tIHZsYyAqLworICAgICAgICAgICAgcGxhbmVzW3BdLmJhbmRzWzBdLmJsa192bGMuY3VzdF9kZXNjLm51bV9yb3dzID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl2aV9pbml0X3RpbGVzKElWSUJhbmREZXNjICpiYW5kLCBJVklUaWxlICpyZWZfdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHAsIGludCBiLCBpbnQgdF9oZWlnaHQsIGludCB0X3dpZHRoKQoreworICAgIGludCB4LCB5OworICAgIElWSVRpbGUgKnRpbGUgPSBiYW5kLT50aWxlczsKKworICAgIGZvciAoeSA9IDA7IHkgPCBiYW5kLT5oZWlnaHQ7IHkgKz0gdF9oZWlnaHQpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGJhbmQtPndpZHRoOyB4ICs9IHRfd2lkdGgpIHsKKyAgICAgICAgICAgIHRpbGUtPnhwb3MgICAgID0geDsKKyAgICAgICAgICAgIHRpbGUtPnlwb3MgICAgID0geTsKKyAgICAgICAgICAgIHRpbGUtPm1iX3NpemUgID0gYmFuZC0+bWJfc2l6ZTsKKyAgICAgICAgICAgIHRpbGUtPndpZHRoICAgID0gRkZNSU4oYmFuZC0+d2lkdGggLSB4LCAgdF93aWR0aCk7CisgICAgICAgICAgICB0aWxlLT5oZWlnaHQgICA9IEZGTUlOKGJhbmQtPmhlaWdodCAtIHksIHRfaGVpZ2h0KTsKKyAgICAgICAgICAgIHRpbGUtPmlzX2VtcHR5ID0gdGlsZS0+ZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbWFjcm9ibG9ja3MgKi8KKyAgICAgICAgICAgIHRpbGUtPm51bV9NQnMgID0gSVZJX01Cc19QRVJfVElMRSh0aWxlLT53aWR0aCwgdGlsZS0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPm1iX3NpemUpOworCisgICAgICAgICAgICBhdl9mcmVlcCgmdGlsZS0+bWJzKTsKKyAgICAgICAgICAgIHRpbGUtPm1icyA9IGF2X21hbGxvY3pfYXJyYXkodGlsZS0+bnVtX01Ccywgc2l6ZW9mKElWSU1iSW5mbykpOworICAgICAgICAgICAgaWYgKCF0aWxlLT5tYnMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgdGlsZS0+cmVmX21icyA9IDA7CisgICAgICAgICAgICBpZiAocCB8fCBiKSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbGUtPm51bV9NQnMgIT0gcmVmX3RpbGUtPm51bV9NQnMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgInJlZl90aWxlIG1pc21hdGNoXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRpbGUtPnJlZl9tYnMgPSByZWZfdGlsZS0+bWJzOworICAgICAgICAgICAgICAgIHJlZl90aWxlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aWxlKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworYXZfY29sZCBpbnQgZmZfaXZpX2luaXRfdGlsZXMoSVZJUGxhbmVEZXNjICpwbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0KQoreworICAgIGludCBwLCBiLCB4X3RpbGVzLCB5X3RpbGVzLCB0X3dpZHRoLCB0X2hlaWdodCwgcmV0OworICAgIElWSUJhbmREZXNjICpiYW5kOworCisgICAgZm9yIChwID0gMDsgcCA8IDM7IHArKykgeworICAgICAgICB0X3dpZHRoICA9ICFwID8gdGlsZV93aWR0aCAgOiAodGlsZV93aWR0aCAgKyAzKSA+PiAyOworICAgICAgICB0X2hlaWdodCA9ICFwID8gdGlsZV9oZWlnaHQgOiAodGlsZV9oZWlnaHQgKyAzKSA+PiAyOworCisgICAgICAgIGlmICghcCAmJiBwbGFuZXNbMF0ubnVtX2JhbmRzID09IDQpIHsKKyAgICAgICAgICAgIHRfd2lkdGggID4+PSAxOworICAgICAgICAgICAgdF9oZWlnaHQgPj49IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYodF93aWR0aDw9MCB8fCB0X2hlaWdodDw9MCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAgICAgZm9yIChiID0gMDsgYiA8IHBsYW5lc1twXS5udW1fYmFuZHM7IGIrKykgeworICAgICAgICAgICAgYmFuZCA9ICZwbGFuZXNbcF0uYmFuZHNbYl07CisgICAgICAgICAgICB4X3RpbGVzID0gSVZJX05VTV9USUxFUyhiYW5kLT53aWR0aCwgdF93aWR0aCk7CisgICAgICAgICAgICB5X3RpbGVzID0gSVZJX05VTV9USUxFUyhiYW5kLT5oZWlnaHQsIHRfaGVpZ2h0KTsKKyAgICAgICAgICAgIGJhbmQtPm51bV90aWxlcyA9IHhfdGlsZXMgKiB5X3RpbGVzOworCisgICAgICAgICAgICBhdl9mcmVlcCgmYmFuZC0+dGlsZXMpOworICAgICAgICAgICAgYmFuZC0+dGlsZXMgPSBhdl9tYWxsb2N6X2FycmF5KGJhbmQtPm51bV90aWxlcywgc2l6ZW9mKElWSVRpbGUpKTsKKyAgICAgICAgICAgIGlmICghYmFuZC0+dGlsZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgLyogdXNlIHRoZSBmaXJzdCBsdW1hIGJhbmQgYXMgcmVmZXJlbmNlIGZvciBtb3Rpb24gdmVjdG9ycworICAgICAgICAgICAgICogYW5kIHF1YW50ICovCisgICAgICAgICAgICByZXQgPSBpdmlfaW5pdF90aWxlcyhiYW5kLCBwbGFuZXNbMF0uYmFuZHNbMF0udGlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBiLCB0X2hlaWdodCwgdF93aWR0aCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgRGVjb2RlIHNpemUgb2YgdGhlIHRpbGUgZGF0YS4KKyAqICBUaGUgc2l6ZSBpcyBzdG9yZWQgYXMgYSB2YXJpYWJsZS1sZW5ndGggZmllbGQgaGF2aW5nIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICogIGlmICh0aWxlX2RhdGFfc2l6ZSA8IDI1NSkgdGhhbiB0aGlzIGZpZWxkIGlzIG9ubHkgb25lIGJ5dGUgbG9uZworICogIGlmICh0aWxlX2RhdGFfc2l6ZSA+PSAyNTUpIHRoYW4gdGhpcyBmaWVsZCBmb3VyIGlzIGJ5dGUgbG9uZzogMHhGRiBYMSBYMiBYMworICogIHdoZXJlIFgxLVgzIGlzIHNpemUgb2YgdGhlIHRpbGUgZGF0YQorICoKKyAqICBAcGFyYW1baW4sb3V0XSAgZ2IgIHRoZSBHZXRCaXQgY29udGV4dAorICogIEByZXR1cm4gICAgIHNpemUgb2YgdGhlIHRpbGUgZGF0YSBpbiBieXRlcworICovCitzdGF0aWMgaW50IGl2aV9kZWNfdGlsZV9kYXRhX3NpemUoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50ICAgIGxlbjsKKworICAgIGxlbiA9IDA7CisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgbGVuID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICBpZiAobGVuID09IDI1NSkKKyAgICAgICAgICAgIGxlbiA9IGdldF9iaXRzX2xvbmcoZ2IsIDI0KTsKKyAgICB9CisKKyAgICAvKiBhbGlnbiB0aGUgYml0c3RyZWFtIHJlYWRlciBvbiB0aGUgYnl0ZSBib3VuZGFyeSAqLworICAgIGFsaWduX2dldF9iaXRzKGdiKTsKKworICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgaXZpX2RjX3RyYW5zZm9ybShJVklCYW5kRGVzYyAqYmFuZCwgaW50ICpwcmV2X2RjLCBpbnQgYnVmX29mZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa19zaXplKQoreworICAgIGludCBidWZfc2l6ZSA9IGJhbmQtPnBpdGNoICogYmFuZC0+YWhlaWdodCAtIGJ1Zl9vZmZzOworICAgIGludCBtaW5fc2l6ZSA9IChibGtfc2l6ZSAtIDEpICogYmFuZC0+cGl0Y2ggKyBibGtfc2l6ZTsKKworICAgIGlmIChtaW5fc2l6ZSA+IGJ1Zl9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGJhbmQtPmRjX3RyYW5zZm9ybShwcmV2X2RjLCBiYW5kLT5idWYgKyBidWZfb2ZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgYmFuZC0+cGl0Y2gsIGJsa19zaXplKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl2aV9kZWNvZGVfY29kZWRfYmxvY2tzKEdldEJpdENvbnRleHQgKmdiLCBJVklCYW5kRGVzYyAqYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZpX21jX2Z1bmMgbWMsIGl2aV9tY19hdmdfZnVuYyBtY19hdmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtdl94LCBpbnQgbXZfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG12X3gyLCBpbnQgbXZfeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcHJldl9kYywgaW50IGlzX2ludHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWNfdHlwZSwgaW50IG1jX3R5cGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWFudCwgaW50IG9mZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqYmFzZV90YWIgID0gaXNfaW50cmEgPyBiYW5kLT5pbnRyYV9iYXNlIDogYmFuZC0+aW50ZXJfYmFzZTsKKyAgICBSVk1hcERlc2MgKnJ2bWFwID0gYmFuZC0+cnZfbWFwOworICAgIHVpbnQ4X3QgY29sX2ZsYWdzWzhdOworICAgIGludDMyX3QgdHJ2ZWNbNjRdOworICAgIHVpbnQzMl90IHN5bSA9IDAsIGxvLCBoaSwgcTsKKyAgICBpbnQgcG9zLCBydW4sIHZhbDsKKyAgICBpbnQgYmxrX3NpemUgICA9IGJhbmQtPmJsa19zaXplOworICAgIGludCBudW1fY29lZmZzID0gYmxrX3NpemUgKiBibGtfc2l6ZTsKKyAgICBpbnQgY29sX21hc2sgICA9IGJsa19zaXplIC0gMTsKKyAgICBpbnQgc2Nhbl9wb3MgICA9IC0xOworICAgIGludCBtaW5fc2l6ZSAgID0gYmFuZC0+cGl0Y2ggKiAoYmFuZC0+dHJhbnNmb3JtX3NpemUgLSAxKSArCisgICAgICAgICAgICAgICAgICAgICBiYW5kLT50cmFuc2Zvcm1fc2l6ZTsKKyAgICBpbnQgYnVmX3NpemUgICA9IGJhbmQtPnBpdGNoICogYmFuZC0+YWhlaWdodCAtIG9mZnM7CisKKyAgICBpZiAobWluX3NpemUgPiBidWZfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoIWJhbmQtPnNjYW4pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTY2FuIHBhdHRlcm4gaXMgbm90IHNldC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiB6ZXJvIHRyYW5zZm9ybSB2ZWN0b3IgKi8KKyAgICBtZW1zZXQodHJ2ZWMsIDAsIG51bV9jb2VmZnMgKiBzaXplb2YodHJ2ZWNbMF0pKTsKKyAgICAvKiB6ZXJvIGNvbHVtbiBmbGFncyAqLworICAgIG1lbXNldChjb2xfZmxhZ3MsIDAsIHNpemVvZihjb2xfZmxhZ3MpKTsKKyAgICB3aGlsZSAoc2Nhbl9wb3MgPD0gbnVtX2NvZWZmcykgeworICAgICAgICBzeW0gPSBnZXRfdmxjMihnYiwgYmFuZC0+YmxrX3ZsYy50YWItPnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICBJVklfVkxDX0JJVFMsIDEpOworICAgICAgICBpZiAoc3ltID09IHJ2bWFwLT5lb2Jfc3ltKQorICAgICAgICAgICAgYnJlYWs7IC8qIEVuZCBvZiBibG9jayAqLworCisgICAgICAgIC8qIEVzY2FwZSAtIHJ1bi92YWwgZXhwbGljaXRseSBjb2RlZCB1c2luZyAzIHZsYyBjb2RlcyAqLworICAgICAgICBpZiAoc3ltID09IHJ2bWFwLT5lc2Nfc3ltKSB7CisgICAgICAgICAgICBydW4gPSBnZXRfdmxjMihnYiwgYmFuZC0+YmxrX3ZsYy50YWItPnRhYmxlLCBJVklfVkxDX0JJVFMsIDEpICsgMTsKKyAgICAgICAgICAgIGxvICA9IGdldF92bGMyKGdiLCBiYW5kLT5ibGtfdmxjLnRhYi0+dGFibGUsIElWSV9WTENfQklUUywgMSk7CisgICAgICAgICAgICBoaSAgPSBnZXRfdmxjMihnYiwgYmFuZC0+YmxrX3ZsYy50YWItPnRhYmxlLCBJVklfVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgLyogbWVyZ2UgdGhlbSBhbmQgY29udmVydCBpbnRvIHNpZ25lZCB2YWwgKi8KKyAgICAgICAgICAgIHZhbCA9IElWSV9UT1NJR05FRCgoaGkgPDwgNikgfCBsbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc3ltID49IDI1NlUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc3ltIGVuY291bnRlcmVkOiAlIlBSSXUzMiIuXG4iLCBzeW0pOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnVuID0gcnZtYXAtPnJ1bnRhYltzeW1dOworICAgICAgICAgICAgdmFsID0gcnZtYXAtPnZhbHRhYltzeW1dOworICAgICAgICB9CisKKyAgICAgICAgLyogZGUtemlnemFnIGFuZCBkZXF1YW50aXplICovCisgICAgICAgIHNjYW5fcG9zICs9IHJ1bjsKKyAgICAgICAgaWYgKHNjYW5fcG9zID49IG51bV9jb2VmZnMgfHwgc2Nhbl9wb3MgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHBvcyA9IGJhbmQtPnNjYW5bc2Nhbl9wb3NdOworCisgICAgICAgIGlmICghdmFsKQorICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgIlZhbCA9IDAgZW5jb3VudGVyZWQhXG4iKTsKKworICAgICAgICBxID0gKGJhc2VfdGFiW3Bvc10gKiBxdWFudCkgPj4gOTsKKyAgICAgICAgaWYgKHEgPiAxKQorICAgICAgICAgICAgdmFsID0gdmFsICogcSArIEZGU0lHTih2YWwpICogKCgocSBeIDEpIC0gMSkgPj4gMSk7CisgICAgICAgIHRydmVjW3Bvc10gPSB2YWw7CisgICAgICAgIC8qIHRyYWNrIGNvbHVtbnMgY29udGFpbmluZyBub24temVybyBjb2VmZnMgKi8KKyAgICAgICAgY29sX2ZsYWdzW3BvcyAmIGNvbF9tYXNrXSB8PSAhIXZhbDsKKyAgICB9CisKKyAgICBpZiAoc2Nhbl9wb3MgPCAwIHx8IHNjYW5fcG9zID49IG51bV9jb2VmZnMgJiYgc3ltICE9IHJ2bWFwLT5lb2Jfc3ltKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgLyogY29ycnVwdCBibG9jayBkYXRhICovCisKKyAgICAvKiB1bmRvaW5nIERDIGNvZWZmIHByZWRpY3Rpb24gZm9yIGludHJhLWJsb2NrcyAqLworICAgIGlmIChpc19pbnRyYSAmJiBiYW5kLT5pc18yZF90cmFucykgeworICAgICAgICAqcHJldl9kYyAgICAgKz0gdHJ2ZWNbMF07CisgICAgICAgIHRydmVjWzBdICAgICAgPSAqcHJldl9kYzsKKyAgICAgICAgY29sX2ZsYWdzWzBdIHw9ICEhKnByZXZfZGM7CisgICAgfQorCisgICAgaWYoYmFuZC0+dHJhbnNmb3JtX3NpemUgPiBiYW5kLT5ibGtfc2l6ZSl7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJUb28gbGFyZ2UgdHJhbnNmb3JtXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogYXBwbHkgaW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICBiYW5kLT5pbnZfdHJhbnNmb3JtKHRydmVjLCBiYW5kLT5idWYgKyBvZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFuZC0+cGl0Y2gsIGNvbF9mbGFncyk7CisKKyAgICAvKiBhcHBseSBtb3Rpb24gY29tcGVuc2F0aW9uICovCisgICAgaWYgKCFpc19pbnRyYSkKKyAgICAgICAgcmV0dXJuIGl2aV9tYyhiYW5kLCBtYywgbWNfYXZnLCBvZmZzLCBtdl94LCBtdl95LCBtdl94MiwgbXZfeTIsCisgICAgICAgICAgICAgICAgICAgICAgbWNfdHlwZSwgbWNfdHlwZTIpOworCisgICAgcmV0dXJuIDA7Cit9CisvKgorICogIERlY29kZSBibG9jayBkYXRhOgorICogIGV4dHJhY3QgaHVmZm1hbi1jb2RlZCB0cmFuc2Zvcm0gY29lZmZpY2llbnRzIGZyb20gdGhlIGJpdHN0cmVhbSwKKyAqICBkZXF1YW50aXplIHRoZW0sIGFwcGx5IGludmVyc2UgdHJhbnNmb3JtIGFuZCBtb3Rpb24gY29tcGVuc2F0aW9uCisgKiAgaW4gb3JkZXIgdG8gcmVjb25zdHJ1Y3QgdGhlIHBpY3R1cmUuCisgKgorICogIEBwYXJhbVtpbixvdXRdICBnYiAgICB0aGUgR2V0Qml0IGNvbnRleHQKKyAqICBAcGFyYW1baW5dICAgICAgYmFuZCAgcG9pbnRlciB0byB0aGUgYmFuZCBkZXNjcmlwdG9yCisgKiAgQHBhcmFtW2luXSAgICAgIHRpbGUgIHBvaW50ZXIgdG8gdGhlIHRpbGUgZGVzY3JpcHRvcgorICogIEByZXR1cm4gICAgIHJlc3VsdCBjb2RlOiAwIC0gT0ssIC0xID0gZXJyb3IgKGNvcnJ1cHRlZCBibG9ja3MgZGF0YSkKKyAqLworc3RhdGljIGludCBpdmlfZGVjb2RlX2Jsb2NrcyhHZXRCaXRDb250ZXh0ICpnYiwgSVZJQmFuZERlc2MgKmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWSVRpbGUgKnRpbGUsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgbWJuLCBibGssIG51bV9ibG9ja3MsIGJsa19zaXplLCByZXQsIGlzX2ludHJhOworICAgIGludCBtY190eXBlID0gMCwgbWNfdHlwZTIgPSAtMTsKKyAgICBpbnQgbXZfeCA9IDAsIG12X3kgPSAwLCBtdl94MiA9IDAsIG12X3kyID0gMDsKKyAgICBpbnQzMl90IHByZXZfZGM7CisgICAgdWludDMyX3QgY2JwLCBxdWFudCwgYnVmX29mZnM7CisgICAgSVZJTWJJbmZvICptYjsKKyAgICBpdmlfbWNfZnVuYyBtY193aXRoX2RlbHRhX2Z1bmMsIG1jX25vX2RlbHRhX2Z1bmM7CisgICAgaXZpX21jX2F2Z19mdW5jIG1jX2F2Z193aXRoX2RlbHRhX2Z1bmMsIG1jX2F2Z19ub19kZWx0YV9mdW5jOworICAgIGNvbnN0IHVpbnQ4X3QgKnNjYWxlX3RhYjsKKworICAgIC8qIGluaXQgaW50cmEgcHJlZGljdGlvbiBmb3IgdGhlIERDIGNvZWZmaWNpZW50ICovCisgICAgcHJldl9kYyAgICA9IDA7CisgICAgYmxrX3NpemUgICA9IGJhbmQtPmJsa19zaXplOworICAgIC8qIG51bWJlciBvZiBibG9ja3MgcGVyIG1iICovCisgICAgbnVtX2Jsb2NrcyA9IChiYW5kLT5tYl9zaXplICE9IGJsa19zaXplKSA/IDQgOiAxOworICAgIGlmIChibGtfc2l6ZSA9PSA4KSB7CisgICAgICAgIG1jX3dpdGhfZGVsdGFfZnVuYyAgICAgPSBmZl9pdmlfbWNfOHg4X2RlbHRhOworICAgICAgICBtY19ub19kZWx0YV9mdW5jICAgICAgID0gZmZfaXZpX21jXzh4OF9ub19kZWx0YTsKKyAgICAgICAgbWNfYXZnX3dpdGhfZGVsdGFfZnVuYyA9IGZmX2l2aV9tY19hdmdfOHg4X2RlbHRhOworICAgICAgICBtY19hdmdfbm9fZGVsdGFfZnVuYyAgID0gZmZfaXZpX21jX2F2Z184eDhfbm9fZGVsdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWNfd2l0aF9kZWx0YV9mdW5jICAgICA9IGZmX2l2aV9tY180eDRfZGVsdGE7CisgICAgICAgIG1jX25vX2RlbHRhX2Z1bmMgICAgICAgPSBmZl9pdmlfbWNfNHg0X25vX2RlbHRhOworICAgICAgICBtY19hdmdfd2l0aF9kZWx0YV9mdW5jID0gZmZfaXZpX21jX2F2Z180eDRfZGVsdGE7CisgICAgICAgIG1jX2F2Z19ub19kZWx0YV9mdW5jICAgPSBmZl9pdmlfbWNfYXZnXzR4NF9ub19kZWx0YTsKKyAgICB9CisKKyAgICBmb3IgKG1ibiA9IDAsIG1iID0gdGlsZS0+bWJzOyBtYm4gPCB0aWxlLT5udW1fTUJzOyBtYisrLCBtYm4rKykgeworICAgICAgICBpc19pbnRyYSA9ICFtYi0+dHlwZTsKKyAgICAgICAgY2JwICAgICAgPSBtYi0+Y2JwOworICAgICAgICBidWZfb2ZmcyA9IG1iLT5idWZfb2ZmczsKKworICAgICAgICBxdWFudCA9IGJhbmQtPmdsb2JfcXVhbnQgKyBtYi0+cV9kZWx0YTsKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9JTkRFTzQpCisgICAgICAgICAgICBxdWFudCA9IGF2X2NsaXAocXVhbnQsIDAsIDMxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcXVhbnQgPSBhdl9jbGlwKHF1YW50LCAwLCAyMyk7CisKKyAgICAgICAgc2NhbGVfdGFiID0gaXNfaW50cmEgPyBiYW5kLT5pbnRyYV9zY2FsZSA6IGJhbmQtPmludGVyX3NjYWxlOworICAgICAgICBpZiAoc2NhbGVfdGFiKQorICAgICAgICAgICAgcXVhbnQgPSBzY2FsZV90YWJbcXVhbnRdOworCisgICAgICAgIGlmICghaXNfaW50cmEpIHsKKyAgICAgICAgICAgIG12X3ggID0gbWItPm12X3g7CisgICAgICAgICAgICBtdl95ICA9IG1iLT5tdl95OworICAgICAgICAgICAgbXZfeDIgPSBtYi0+Yl9tdl94OworICAgICAgICAgICAgbXZfeTIgPSBtYi0+Yl9tdl95OworICAgICAgICAgICAgaWYgKGJhbmQtPmlzX2hhbGZwZWwpIHsKKyAgICAgICAgICAgICAgICBtY190eXBlICA9ICgobXZfeSAgJiAxKSA8PCAxKSB8IChtdl94ICAmIDEpOworICAgICAgICAgICAgICAgIG1jX3R5cGUyID0gKChtdl95MiAmIDEpIDw8IDEpIHwgKG12X3gyICYgMSk7CisgICAgICAgICAgICAgICAgbXZfeCAgPj49IDE7CisgICAgICAgICAgICAgICAgbXZfeSAgPj49IDE7CisgICAgICAgICAgICAgICAgbXZfeDIgPj49IDE7CisgICAgICAgICAgICAgICAgbXZfeTIgPj49IDE7IC8qIGNvbnZlcnQgaGFsZnBlbCB2ZWN0b3JzIGludG8gZnVsbHBlbCBvbmVzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWItPnR5cGUgPT0gMikKKyAgICAgICAgICAgICAgICBtY190eXBlID0gLTE7CisgICAgICAgICAgICBpZiAobWItPnR5cGUgIT0gMiAmJiBtYi0+dHlwZSAhPSAzKQorICAgICAgICAgICAgICAgIG1jX3R5cGUyID0gLTE7CisgICAgICAgICAgICBpZiAobWItPnR5cGUpIHsKKyAgICAgICAgICAgICAgICBpbnQgZG12X3gsIGRtdl95LCBjeCwgY3k7CisKKyAgICAgICAgICAgICAgICBkbXZfeCA9IG1iLT5tdl94ID4+IGJhbmQtPmlzX2hhbGZwZWw7CisgICAgICAgICAgICAgICAgZG12X3kgPSBtYi0+bXZfeSA+PiBiYW5kLT5pc19oYWxmcGVsOworICAgICAgICAgICAgICAgIGN4ICAgID0gbWItPm12X3ggJiAgYmFuZC0+aXNfaGFsZnBlbDsKKyAgICAgICAgICAgICAgICBjeSAgICA9IG1iLT5tdl95ICYgIGJhbmQtPmlzX2hhbGZwZWw7CisKKyAgICAgICAgICAgICAgICBpZiAobWItPnhwb3MgKyBkbXZfeCA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgbWItPnhwb3MgKyBkbXZfeCArIGJhbmQtPm1iX3NpemUgKyBjeCA+IGJhbmQtPnBpdGNoIHx8CisgICAgICAgICAgICAgICAgICAgIG1iLT55cG9zICsgZG12X3kgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgIG1iLT55cG9zICsgZG12X3kgKyBiYW5kLT5tYl9zaXplICsgY3kgPiBiYW5kLT5haGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYi0+dHlwZSA9PSAyIHx8IG1iLT50eXBlID09IDMpIHsKKyAgICAgICAgICAgICAgICBpbnQgZG12X3gsIGRtdl95LCBjeCwgY3k7CisKKyAgICAgICAgICAgICAgICBkbXZfeCA9IG1iLT5iX212X3ggPj4gYmFuZC0+aXNfaGFsZnBlbDsKKyAgICAgICAgICAgICAgICBkbXZfeSA9IG1iLT5iX212X3kgPj4gYmFuZC0+aXNfaGFsZnBlbDsKKyAgICAgICAgICAgICAgICBjeCAgICA9IG1iLT5iX212X3ggJiAgYmFuZC0+aXNfaGFsZnBlbDsKKyAgICAgICAgICAgICAgICBjeSAgICA9IG1iLT5iX212X3kgJiAgYmFuZC0+aXNfaGFsZnBlbDsKKworICAgICAgICAgICAgICAgIGlmIChtYi0+eHBvcyArIGRtdl94IDwgMCB8fAorICAgICAgICAgICAgICAgICAgICBtYi0+eHBvcyArIGRtdl94ICsgYmFuZC0+bWJfc2l6ZSArIGN4ID4gYmFuZC0+cGl0Y2ggfHwKKyAgICAgICAgICAgICAgICAgICAgbWItPnlwb3MgKyBkbXZfeSA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgbWItPnlwb3MgKyBkbXZfeSArIGJhbmQtPm1iX3NpemUgKyBjeSA+IGJhbmQtPmFoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChibGsgPSAwOyBibGsgPCBudW1fYmxvY2tzOyBibGsrKykgeworICAgICAgICAgICAgLyogYWRqdXN0IGJsb2NrIHBvc2l0aW9uIGluIHRoZSBidWZmZXIgYWNjb3JkaW5nIHRvIGl0cyBudW1iZXIgKi8KKyAgICAgICAgICAgIGlmIChibGsgJiAxKSB7CisgICAgICAgICAgICAgICAgYnVmX29mZnMgKz0gYmxrX3NpemU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJsayA9PSAyKSB7CisgICAgICAgICAgICAgICAgYnVmX29mZnMgLT0gYmxrX3NpemU7CisgICAgICAgICAgICAgICAgYnVmX29mZnMgKz0gYmxrX3NpemUgKiBiYW5kLT5waXRjaDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNicCAmIDEpIHsgLyogYmxvY2sgY29kZWQgPyAqLworICAgICAgICAgICAgICAgIHJldCA9IGl2aV9kZWNvZGVfY29kZWRfYmxvY2tzKGdiLCBiYW5kLCBtY193aXRoX2RlbHRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNfYXZnX3dpdGhfZGVsdGFfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl94LCBtdl95LCBtdl94MiwgbXZfeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXZfZGMsIGlzX2ludHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jX3R5cGUsIG1jX3R5cGUyLCBxdWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb2ZmcywgYXZjdHgpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBibG9jayBub3QgY29kZWQgKi8KKyAgICAgICAgICAgICAgICAvKiBmb3IgaW50cmEgYmxvY2tzIGFwcGx5IHRoZSBkYyBzbGFudCB0cmFuc2Zvcm0gKi8KKyAgICAgICAgICAgICAgICAvKiBmb3IgaW50ZXIgLSBwZXJmb3JtIHRoZSBtb3Rpb24gY29tcGVuc2F0aW9uIHdpdGhvdXQgZGVsdGEgKi8KKyAgICAgICAgICAgICAgICBpZiAoaXNfaW50cmEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gaXZpX2RjX3RyYW5zZm9ybShiYW5kLCAmcHJldl9kYywgYnVmX29mZnMsIGJsa19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGl2aV9tYyhiYW5kLCBtY19ub19kZWx0YV9mdW5jLCBtY19hdmdfbm9fZGVsdGFfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vZmZzLCBtdl94LCBtdl95LCBtdl94MiwgbXZfeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY190eXBlLCBtY190eXBlMik7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNicCA+Pj0gMTsKKyAgICAgICAgfS8vIGZvciBibGsKKyAgICB9Ly8gZm9yIG1ibgorCisgICAgYWxpZ25fZ2V0X2JpdHMoZ2IpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEhhbmRsZSBlbXB0eSB0aWxlcyBieSBwZXJmb3JtaW5nIGRhdGEgY29weWluZyBhbmQgbW90aW9uCisgKiAgY29tcGVuc2F0aW9uIHJlc3BlY3RpdmVseS4KKyAqCisgKiAgQHBhcmFtW2luXSAgYXZjdHggICAgIHB0ciB0byB0aGUgQVZDb2RlY0NvbnRleHQKKyAqICBAcGFyYW1baW5dICBiYW5kICAgICAgcG9pbnRlciB0byB0aGUgYmFuZCBkZXNjcmlwdG9yCisgKiAgQHBhcmFtW2luXSAgdGlsZSAgICAgIHBvaW50ZXIgdG8gdGhlIHRpbGUgZGVzY3JpcHRvcgorICogIEBwYXJhbVtpbl0gIG12X3NjYWxlICBzY2FsaW5nIGZhY3RvciBmb3IgbW90aW9uIHZlY3RvcnMKKyAqLworc3RhdGljIGludCBpdmlfcHJvY2Vzc19lbXB0eV90aWxlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgSVZJQmFuZERlc2MgKmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVZJVGlsZSAqdGlsZSwgaW50MzJfdCBtdl9zY2FsZSkKK3sKKyAgICBpbnQgICAgICAgICAgICAgeCwgeSwgbmVlZF9tYywgbWJuLCBibGssIG51bV9ibG9ja3MsIG12X3gsIG12X3ksIG1jX3R5cGU7CisgICAgaW50ICAgICAgICAgICAgIG9mZnMsIG1iX29mZnNldCwgcm93X29mZnNldCwgcmV0OworICAgIElWSU1iSW5mbyAgICAgICAqbWIsICpyZWZfbWI7CisgICAgY29uc3QgaW50MTZfdCAgICpzcmM7CisgICAgaW50MTZfdCAgICAgICAgICpkc3Q7CisgICAgaXZpX21jX2Z1bmMgICAgIG1jX25vX2RlbHRhX2Z1bmM7CisKKyAgICBpZiAodGlsZS0+bnVtX01CcyAhPSBJVklfTUJzX1BFUl9USUxFKHRpbGUtPndpZHRoLCB0aWxlLT5oZWlnaHQsIGJhbmQtPm1iX3NpemUpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQWxsb2NhdGVkIHRpbGUgc2l6ZSAlZCBtaXNtYXRjaGVzICIKKyAgICAgICAgICAgICAgICJwYXJhbWV0ZXJzICVkIGluIGl2aV9wcm9jZXNzX2VtcHR5X3RpbGUoKVxuIiwKKyAgICAgICAgICAgICAgIHRpbGUtPm51bV9NQnMsIElWSV9NQnNfUEVSX1RJTEUodGlsZS0+d2lkdGgsIHRpbGUtPmhlaWdodCwgYmFuZC0+bWJfc2l6ZSkpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBvZmZzICAgICAgID0gdGlsZS0+eXBvcyAqIGJhbmQtPnBpdGNoICsgdGlsZS0+eHBvczsKKyAgICBtYiAgICAgICAgID0gdGlsZS0+bWJzOworICAgIHJlZl9tYiAgICAgPSB0aWxlLT5yZWZfbWJzOworICAgIHJvd19vZmZzZXQgPSBiYW5kLT5tYl9zaXplICogYmFuZC0+cGl0Y2g7CisgICAgbmVlZF9tYyAgICA9IDA7IC8qIHJlc2V0IHRoZSBtYyB0cmFja2luZyBmbGFnICovCisKKyAgICBmb3IgKHkgPSB0aWxlLT55cG9zOyB5IDwgKHRpbGUtPnlwb3MgKyB0aWxlLT5oZWlnaHQpOyB5ICs9IGJhbmQtPm1iX3NpemUpIHsKKyAgICAgICAgbWJfb2Zmc2V0ID0gb2ZmczsKKworICAgICAgICBmb3IgKHggPSB0aWxlLT54cG9zOyB4IDwgKHRpbGUtPnhwb3MgKyB0aWxlLT53aWR0aCk7IHggKz0gYmFuZC0+bWJfc2l6ZSkgeworICAgICAgICAgICAgbWItPnhwb3MgICAgID0geDsKKyAgICAgICAgICAgIG1iLT55cG9zICAgICA9IHk7CisgICAgICAgICAgICBtYi0+YnVmX29mZnMgPSBtYl9vZmZzZXQ7CisKKyAgICAgICAgICAgIG1iLT50eXBlID0gMTsgLyogc2V0IHRoZSBtYWNyb2Jsb2NrcyB0eXBlID0gSU5URVIgKi8KKyAgICAgICAgICAgIG1iLT5jYnAgID0gMDsgLyogYWxsIGJsb2NrcyBhcmUgZW1wdHkgKi8KKworICAgICAgICAgICAgaWYgKCFiYW5kLT5xZGVsdGFfcHJlc2VudCAmJiAhYmFuZC0+cGxhbmUgJiYgIWJhbmQtPmJhbmRfbnVtKSB7CisgICAgICAgICAgICAgICAgbWItPnFfZGVsdGEgPSBiYW5kLT5nbG9iX3F1YW50OworICAgICAgICAgICAgICAgIG1iLT5tdl94ICAgID0gMDsKKyAgICAgICAgICAgICAgICBtYi0+bXZfeSAgICA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiYW5kLT5pbmhlcml0X3FkZWx0YSAmJiByZWZfbWIpCisgICAgICAgICAgICAgICAgbWItPnFfZGVsdGEgPSByZWZfbWItPnFfZGVsdGE7CisKKyAgICAgICAgICAgIGlmIChiYW5kLT5pbmhlcml0X212ICYmIHJlZl9tYikgeworICAgICAgICAgICAgICAgIC8qIG1vdGlvbiB2ZWN0b3IgaW5oZXJpdGFuY2UgKi8KKyAgICAgICAgICAgICAgICBpZiAobXZfc2NhbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWItPm12X3ggPSBpdmlfc2NhbGVfbXYocmVmX21iLT5tdl94LCBtdl9zY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIG1iLT5tdl95ID0gaXZpX3NjYWxlX212KHJlZl9tYi0+bXZfeSwgbXZfc2NhbGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1iLT5tdl94ID0gcmVmX21iLT5tdl94OworICAgICAgICAgICAgICAgICAgICBtYi0+bXZfeSA9IHJlZl9tYi0+bXZfeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmVlZF9tYyB8PSBtYi0+bXZfeCB8fCBtYi0+bXZfeTsgLyogdHJhY2tpbmcgbm9uLXplcm8gbW90aW9uIHZlY3RvcnMgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBkbXZfeCwgZG12X3ksIGN4LCBjeTsKKworICAgICAgICAgICAgICAgICAgICBkbXZfeCA9IG1iLT5tdl94ID4+IGJhbmQtPmlzX2hhbGZwZWw7CisgICAgICAgICAgICAgICAgICAgIGRtdl95ID0gbWItPm12X3kgPj4gYmFuZC0+aXNfaGFsZnBlbDsKKyAgICAgICAgICAgICAgICAgICAgY3ggICAgPSBtYi0+bXZfeCAmICBiYW5kLT5pc19oYWxmcGVsOworICAgICAgICAgICAgICAgICAgICBjeSAgICA9IG1iLT5tdl95ICYgIGJhbmQtPmlzX2hhbGZwZWw7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAgIG1iLT54cG9zICsgZG12X3ggPCAwCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtYi0+eHBvcyArIGRtdl94ICsgYmFuZC0+bWJfc2l6ZSArIGN4ID4gYmFuZC0+cGl0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1iLT55cG9zICsgZG12X3kgPCAwCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtYi0+eXBvcyArIGRtdl95ICsgYmFuZC0+bWJfc2l6ZSArIGN5ID4gYmFuZC0+YWhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNViBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYisrOworICAgICAgICAgICAgaWYgKHJlZl9tYikKKyAgICAgICAgICAgICAgICByZWZfbWIrKzsKKyAgICAgICAgICAgIG1iX29mZnNldCArPSBiYW5kLT5tYl9zaXplOworICAgICAgICB9IC8vIGZvciB4CisgICAgICAgIG9mZnMgKz0gcm93X29mZnNldDsKKyAgICB9IC8vIGZvciB5CisKKyAgICBpZiAoYmFuZC0+aW5oZXJpdF9tdiAmJiBuZWVkX21jKSB7IC8qIGFwcGx5IG1vdGlvbiBjb21wZW5zYXRpb24gaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIG1vdGlvbiB2ZWN0b3IgKi8KKyAgICAgICAgbnVtX2Jsb2NrcyA9IChiYW5kLT5tYl9zaXplICE9IGJhbmQtPmJsa19zaXplKSA/IDQgOiAxOyAvKiBudW1iZXIgb2YgYmxvY2tzIHBlciBtYiAqLworICAgICAgICBtY19ub19kZWx0YV9mdW5jID0gKGJhbmQtPmJsa19zaXplID09IDgpID8gZmZfaXZpX21jXzh4OF9ub19kZWx0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmZfaXZpX21jXzR4NF9ub19kZWx0YTsKKworICAgICAgICBmb3IgKG1ibiA9IDAsIG1iID0gdGlsZS0+bWJzOyBtYm4gPCB0aWxlLT5udW1fTUJzOyBtYisrLCBtYm4rKykgeworICAgICAgICAgICAgbXZfeCA9IG1iLT5tdl94OworICAgICAgICAgICAgbXZfeSA9IG1iLT5tdl95OworICAgICAgICAgICAgaWYgKCFiYW5kLT5pc19oYWxmcGVsKSB7CisgICAgICAgICAgICAgICAgbWNfdHlwZSA9IDA7IC8qIHdlIGhhdmUgb25seSBmdWxscGVsIHZlY3RvcnMgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWNfdHlwZSA9ICgobXZfeSAmIDEpIDw8IDEpIHwgKG12X3ggJiAxKTsKKyAgICAgICAgICAgICAgICBtdl94ID4+PSAxOworICAgICAgICAgICAgICAgIG12X3kgPj49IDE7IC8qIGNvbnZlcnQgaGFsZnBlbCB2ZWN0b3JzIGludG8gZnVsbHBlbCBvbmVzICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgbnVtX2Jsb2NrczsgYmxrKyspIHsKKyAgICAgICAgICAgICAgICAvKiBhZGp1c3QgYmxvY2sgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciBhY2NvcmRpbmcgd2l0aCBpdHMgbnVtYmVyICovCisgICAgICAgICAgICAgICAgb2ZmcyA9IG1iLT5idWZfb2ZmcyArIGJhbmQtPmJsa19zaXplICogKChibGsgJiAxKSArICEhKGJsayAmIDIpICogYmFuZC0+cGl0Y2gpOworICAgICAgICAgICAgICAgIHJldCA9IGl2aV9tYyhiYW5kLCBtY19ub19kZWx0YV9mdW5jLCAwLCBvZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl94LCBtdl95LCAwLCAwLCBtY190eXBlLCAtMSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBjb3B5IGRhdGEgZnJvbSB0aGUgcmVmZXJlbmNlIHRpbGUgaW50byB0aGUgY3VycmVudCBvbmUgKi8KKyAgICAgICAgc3JjID0gYmFuZC0+cmVmX2J1ZiArIHRpbGUtPnlwb3MgKiBiYW5kLT5waXRjaCArIHRpbGUtPnhwb3M7CisgICAgICAgIGRzdCA9IGJhbmQtPmJ1ZiAgICAgKyB0aWxlLT55cG9zICogYmFuZC0+cGl0Y2ggKyB0aWxlLT54cG9zOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgdGlsZS0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgdGlsZS0+d2lkdGgqc2l6ZW9mKGJhbmQtPmJ1ZlswXSkpOworICAgICAgICAgICAgc3JjICs9IGJhbmQtPnBpdGNoOworICAgICAgICAgICAgZHN0ICs9IGJhbmQtPnBpdGNoOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdWludDE2X3QgaXZpX2NhbGNfYmFuZF9jaGVja3N1bShJVklCYW5kRGVzYyAqYmFuZCkKK3sKKyAgICBpbnQgICAgICAgICB4LCB5OworICAgIGludDE2X3QgICAgICpzcmMsIGNoZWNrc3VtOworCisgICAgc3JjID0gYmFuZC0+YnVmOworICAgIGNoZWNrc3VtID0gMDsKKworICAgIGZvciAoeSA9IDA7IHkgPCBiYW5kLT5oZWlnaHQ7IHNyYyArPSBiYW5kLT5waXRjaCwgeSsrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgYmFuZC0+d2lkdGg7IHgrKykKKyAgICAgICAgICAgIGNoZWNrc3VtICs9IHNyY1t4XTsKKworICAgIHJldHVybiBjaGVja3N1bTsKK30KKyNlbmRpZgorCisvKgorICogIENvbnZlcnQgYW5kIG91dHB1dCB0aGUgY3VycmVudCBwbGFuZS4KKyAqICBUaGlzIGNvbnZlcnNpb24gaXMgZG9uZSBieSBhZGRpbmcgYmFjayB0aGUgYmlhcyB2YWx1ZSBvZiAxMjgKKyAqICAoc3VidHJhY3RlZCBpbiB0aGUgZW5jb2RlcikgYW5kIGNsaXBwaW5nIHRoZSByZXN1bHQuCisgKgorICogIEBwYXJhbVtpbl0gICBwbGFuZSAgICAgIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHBsYW5lIGJlaW5nIHByb2Nlc3NlZAorICogIEBwYXJhbVtvdXRdICBkc3QgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciByZWNlaXZpbmcgY29udmVydGVkIHBpeGVscworICogIEBwYXJhbVtpbl0gICBkc3RfcGl0Y2ggIHBpdGNoIGZvciBtb3ZpbmcgdG8gdGhlIG5leHQgeSBsaW5lCisgKi8KK3N0YXRpYyB2b2lkIGl2aV9vdXRwdXRfcGxhbmUoSVZJUGxhbmVEZXNjICpwbGFuZSwgdWludDhfdCAqZHN0LCBpbnQgZHN0X3BpdGNoKQoreworICAgIGludCAgICAgICAgICAgICB4LCB5OworICAgIGNvbnN0IGludDE2X3QgICAqc3JjICA9IHBsYW5lLT5iYW5kc1swXS5idWY7CisgICAgdWludDMyX3QgICAgICAgIHBpdGNoID0gcGxhbmUtPmJhbmRzWzBdLnBpdGNoOworCisgICAgaWYgKCFzcmMpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoeSA9IDA7IHkgPCBwbGFuZS0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHBsYW5lLT53aWR0aDsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF91aW50OChzcmNbeF0gKyAxMjgpOworICAgICAgICBzcmMgKz0gcGl0Y2g7CisgICAgICAgIGRzdCArPSBkc3RfcGl0Y2g7CisgICAgfQorfQorCisvKioKKyAqICBEZWNvZGUgYW4gSW5kZW8gNCBvciA1IGJhbmQuCisgKgorICogIEBwYXJhbVtpbixvdXRdICBjdHggICAgcHRyIHRvIHRoZSBkZWNvZGVyIGNvbnRleHQKKyAqICBAcGFyYW1baW4sb3V0XSAgYmFuZCAgIHB0ciB0byB0aGUgYmFuZCBkZXNjcmlwdG9yCisgKiAgQHBhcmFtW2luXSAgICAgIGF2Y3R4ICBwdHIgdG8gdGhlIEFWQ29kZWNDb250ZXh0CisgKiAgQHJldHVybiAgICAgICAgIHJlc3VsdCBjb2RlOiAwID0gT0ssIC0xID0gZXJyb3IKKyAqLworc3RhdGljIGludCBkZWNvZGVfYmFuZChJVkk0NURlY0NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgSVZJQmFuZERlc2MgKmJhbmQsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgICAgICAgICByZXN1bHQsIGksIHQsIGlkeDEsIGlkeDIsIHBvczsKKyAgICBJVklUaWxlICAgICAqdGlsZTsKKworICAgIGJhbmQtPmJ1ZiAgICAgPSBiYW5kLT5idWZzW2N0eC0+ZHN0X2J1Zl07CisgICAgaWYgKCFiYW5kLT5idWYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCYW5kIGJ1ZmZlciBwb2ludHMgdG8gbm8gZGF0YSFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGN0eC0+aXNfaW5kZW80ICYmIGN0eC0+ZnJhbWVfdHlwZSA9PSBJVkk0X0ZSQU1FVFlQRV9CSURJUikgeworICAgICAgICBiYW5kLT5yZWZfYnVmICAgPSBiYW5kLT5idWZzW2N0eC0+Yl9yZWZfYnVmXTsKKyAgICAgICAgYmFuZC0+Yl9yZWZfYnVmID0gYmFuZC0+YnVmc1tjdHgtPnJlZl9idWZdOworICAgIH0gZWxzZSB7CisgICAgICAgIGJhbmQtPnJlZl9idWYgICA9IGJhbmQtPmJ1ZnNbY3R4LT5yZWZfYnVmXTsKKyAgICAgICAgYmFuZC0+Yl9yZWZfYnVmID0gMDsKKyAgICB9CisgICAgYmFuZC0+ZGF0YV9wdHIgID0gY3R4LT5mcmFtZV9kYXRhICsgKGdldF9iaXRzX2NvdW50KCZjdHgtPmdiKSA+PiAzKTsKKworICAgIHJlc3VsdCA9IGN0eC0+ZGVjb2RlX2JhbmRfaGRyKGN0eCwgYmFuZCwgYXZjdHgpOworICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciB3aGlsZSBkZWNvZGluZyBiYW5kIGhlYWRlcjogJWRcbiIsCisgICAgICAgICAgICAgICByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmIChiYW5kLT5pc19lbXB0eSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVtcHR5IGJhbmQgZW5jb3VudGVyZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYmFuZC0+cnZfbWFwID0gJmN0eC0+cnZtYXBfdGFic1tiYW5kLT5ydm1hcF9zZWxdOworCisgICAgLyogYXBwbHkgY29ycmVjdGlvbnMgdG8gdGhlIHNlbGVjdGVkIHJ2bWFwIHRhYmxlIGlmIHByZXNlbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYmFuZC0+bnVtX2NvcnI7IGkrKykgeworICAgICAgICBpZHgxID0gYmFuZC0+Y29ycltpICogMl07CisgICAgICAgIGlkeDIgPSBiYW5kLT5jb3JyW2kgKiAyICsgMV07CisgICAgICAgIEZGU1dBUCh1aW50OF90LCBiYW5kLT5ydl9tYXAtPnJ1bnRhYltpZHgxXSwgYmFuZC0+cnZfbWFwLT5ydW50YWJbaWR4Ml0pOworICAgICAgICBGRlNXQVAoaW50MTZfdCwgYmFuZC0+cnZfbWFwLT52YWx0YWJbaWR4MV0sIGJhbmQtPnJ2X21hcC0+dmFsdGFiW2lkeDJdKTsKKyAgICAgICAgaWYgKGlkeDEgPT0gYmFuZC0+cnZfbWFwLT5lb2Jfc3ltIHx8IGlkeDIgPT0gYmFuZC0+cnZfbWFwLT5lb2Jfc3ltKQorICAgICAgICAgICAgYmFuZC0+cnZfbWFwLT5lb2Jfc3ltIF49IGlkeDEgXiBpZHgyOworICAgICAgICBpZiAoaWR4MSA9PSBiYW5kLT5ydl9tYXAtPmVzY19zeW0gfHwgaWR4MiA9PSBiYW5kLT5ydl9tYXAtPmVzY19zeW0pCisgICAgICAgICAgICBiYW5kLT5ydl9tYXAtPmVzY19zeW0gXj0gaWR4MSBeIGlkeDI7CisgICAgfQorCisgICAgcG9zID0gZ2V0X2JpdHNfY291bnQoJmN0eC0+Z2IpOworCisgICAgZm9yICh0ID0gMDsgdCA8IGJhbmQtPm51bV90aWxlczsgdCsrKSB7CisgICAgICAgIHRpbGUgPSAmYmFuZC0+dGlsZXNbdF07CisKKyAgICAgICAgaWYgKHRpbGUtPm1iX3NpemUgIT0gYmFuZC0+bWJfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNQiBzaXplcyBtaXNtYXRjaDogJWQgdnMuICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGJhbmQtPm1iX3NpemUsIHRpbGUtPm1iX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgdGlsZS0+aXNfZW1wdHkgPSBnZXRfYml0czEoJmN0eC0+Z2IpOworICAgICAgICBpZiAodGlsZS0+aXNfZW1wdHkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGl2aV9wcm9jZXNzX2VtcHR5X3RpbGUoYXZjdHgsIGJhbmQsIHRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdHgtPnBsYW5lc1swXS5iYW5kc1swXS5tYl9zaXplID4+IDMpIC0gKGJhbmQtPm1iX3NpemUgPj4gMykpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiRW1wdHkgdGlsZSBlbmNvdW50ZXJlZCFcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGlsZS0+ZGF0YV9zaXplID0gaXZpX2RlY190aWxlX2RhdGFfc2l6ZSgmY3R4LT5nYik7CisgICAgICAgICAgICBpZiAoIXRpbGUtPmRhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGlsZSBkYXRhIHNpemUgaXMgemVybyFcbiIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdCA9IGN0eC0+ZGVjb2RlX21iX2luZm8oY3R4LCBiYW5kLCB0aWxlLCBhdmN0eCk7CisgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgcmVzdWx0ID0gaXZpX2RlY29kZV9ibG9ja3MoJmN0eC0+Z2IsIGJhbmQsIHRpbGUsIGF2Y3R4KTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJDb3JydXB0ZWQgdGlsZSBkYXRhIGVuY291bnRlcmVkIVxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKGdldF9iaXRzX2NvdW50KCZjdHgtPmdiKSAtIHBvcykgPj4gMykgIT0gdGlsZS0+ZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJUaWxlIGRhdGFfc2l6ZSBtaXNtYXRjaCFcbiIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBvcyArPSB0aWxlLT5kYXRhX3NpemUgPDwgMzsgLy8gc2tpcCB0byBuZXh0IHRpbGUKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlc3RvcmUgdGhlIHNlbGVjdGVkIHJ2bWFwIHRhYmxlIGJ5IGFwcGx5aW5nIGl0cyBjb3JyZWN0aW9ucyBpbgorICAgICAqIHJldmVyc2Ugb3JkZXIgKi8KKyAgICBmb3IgKGkgPSBiYW5kLT5udW1fY29yci0xOyBpID49IDA7IGktLSkgeworICAgICAgICBpZHgxID0gYmFuZC0+Y29ycltpKjJdOworICAgICAgICBpZHgyID0gYmFuZC0+Y29ycltpKjIrMV07CisgICAgICAgIEZGU1dBUCh1aW50OF90LCBiYW5kLT5ydl9tYXAtPnJ1bnRhYltpZHgxXSwgYmFuZC0+cnZfbWFwLT5ydW50YWJbaWR4Ml0pOworICAgICAgICBGRlNXQVAoaW50MTZfdCwgYmFuZC0+cnZfbWFwLT52YWx0YWJbaWR4MV0sIGJhbmQtPnJ2X21hcC0+dmFsdGFiW2lkeDJdKTsKKyAgICAgICAgaWYgKGlkeDEgPT0gYmFuZC0+cnZfbWFwLT5lb2Jfc3ltIHx8IGlkeDIgPT0gYmFuZC0+cnZfbWFwLT5lb2Jfc3ltKQorICAgICAgICAgICAgYmFuZC0+cnZfbWFwLT5lb2Jfc3ltIF49IGlkeDEgXiBpZHgyOworICAgICAgICBpZiAoaWR4MSA9PSBiYW5kLT5ydl9tYXAtPmVzY19zeW0gfHwgaWR4MiA9PSBiYW5kLT5ydl9tYXAtPmVzY19zeW0pCisgICAgICAgICAgICBiYW5kLT5ydl9tYXAtPmVzY19zeW0gXj0gaWR4MSBeIGlkeDI7CisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgICBpZiAoYmFuZC0+Y2hlY2tzdW1fcHJlc2VudCkgeworICAgICAgICB1aW50MTZfdCBjaGtzdW0gPSBpdmlfY2FsY19iYW5kX2NoZWNrc3VtKGJhbmQpOworICAgICAgICBpZiAoY2hrc3VtICE9IGJhbmQtPmNoZWNrc3VtKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQmFuZCBjaGVja3N1bSBtaXNtYXRjaCEgUGxhbmUgJWQsIGJhbmQgJWQsICIKKyAgICAgICAgICAgICAgICAgICAicmVjZWl2ZWQ6ICUiUFJJeDMyIiwgY2FsY3VsYXRlZDogJSJQUkl4MTYiXG4iLAorICAgICAgICAgICAgICAgICAgIGJhbmQtPnBsYW5lLCBiYW5kLT5iYW5kX251bSwgYmFuZC0+Y2hlY2tzdW0sIGNoa3N1bSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGFsaWduX2dldF9iaXRzKCZjdHgtPmdiKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBmZl9pdmlfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgSVZJNDVEZWNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgICAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgQVZGcmFtZSAgICAgICAqZnJhbWUgPSBkYXRhOworICAgIGludCAgICAgICAgICAgICBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIGludCAgICAgICAgICAgICByZXN1bHQsIHAsIGI7CisKKyAgICBpbml0X2dldF9iaXRzKCZjdHgtPmdiLCBidWYsIGJ1Zl9zaXplICogOCk7CisgICAgY3R4LT5mcmFtZV9kYXRhID0gYnVmOworICAgIGN0eC0+ZnJhbWVfc2l6ZSA9IGJ1Zl9zaXplOworCisgICAgcmVzdWx0ID0gY3R4LT5kZWNvZGVfcGljX2hkcihjdHgsIGF2Y3R4KTsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIGRlY29kaW5nIHBpY3R1cmUgaGVhZGVyOiAlZFxuIiwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgaWYgKGN0eC0+Z29wX2ludmFsaWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGN0eC0+aXNfaW5kZW80ICYmIGN0eC0+ZnJhbWVfdHlwZSA9PSBJVkk0X0ZSQU1FVFlQRV9OVUxMX0xBU1QpIHsKKyAgICAgICAgaWYgKGN0eC0+Z290X3BfZnJhbWUpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX21vdmVfcmVmKGRhdGEsIGN0eC0+cF9mcmFtZSk7CisgICAgICAgICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICAgICAgICAgIGN0eC0+Z290X3BfZnJhbWUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmdvdF9mcmFtZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKworICAgIGlmIChjdHgtPmdvcF9mbGFncyAmIElWSTVfSVNfUFJPVEVDVEVEKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiUGFzc3dvcmQtcHJvdGVjdGVkIGNsaXAhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGlmICghY3R4LT5wbGFuZXNbMF0uYmFuZHMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb2xvciBwbGFuZXMgbm90IGluaXRpYWxpemVkIHlldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGN0eC0+c3dpdGNoX2J1ZmZlcnMoY3R4KTsKKworICAgIC8veyBTVEFSVF9USU1FUjsKKworICAgIGlmIChjdHgtPmlzX25vbm51bGxfZnJhbWUoY3R4KSkgeworICAgICAgICBjdHgtPmJ1Zl9pbnZhbGlkW2N0eC0+ZHN0X2J1Zl0gPSAxOworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgMzsgcCsrKSB7CisgICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgY3R4LT5wbGFuZXNbcF0ubnVtX2JhbmRzOyBiKyspIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWNvZGVfYmFuZChjdHgsICZjdHgtPnBsYW5lc1twXS5iYW5kc1tiXSwgYXZjdHgpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIGRlY29kaW5nIGJhbmQ6ICVkLCBwbGFuZTogJWRcbiIsIGIsIHApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjdHgtPmJ1Zl9pbnZhbGlkW2N0eC0+ZHN0X2J1Zl0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjdHgtPmlzX3NjYWxhYmxlKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IDM7IHArKykgeworICAgICAgICAgICAgaWYgKCFjdHgtPnBsYW5lc1twXS5iYW5kc1swXS5idWYpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGN0eC0+YnVmX2ludmFsaWRbY3R4LT5kc3RfYnVmXSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy9TVE9QX1RJTUVSKCJkZWNvZGVfcGxhbmVzIik7IH0KKworICAgIGlmICghY3R4LT5pc19ub25udWxsX2ZyYW1lKGN0eCkpCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKworICAgIHJlc3VsdCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBjdHgtPnBsYW5lc1swXS53aWR0aCwgY3R4LT5wbGFuZXNbMF0uaGVpZ2h0KTsKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGlmICgocmVzdWx0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBpZiAoY3R4LT5pc19zY2FsYWJsZSkgeworICAgICAgICBpZiAoY3R4LT5pc19pbmRlbzQpCisgICAgICAgICAgICBmZl9pdmlfcmVjb21wb3NlX2hhYXIoJmN0eC0+cGxhbmVzWzBdLCBmcmFtZS0+ZGF0YVswXSwgZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmZfaXZpX3JlY29tcG9zZTUzICAgKCZjdHgtPnBsYW5lc1swXSwgZnJhbWUtPmRhdGFbMF0sIGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaXZpX291dHB1dF9wbGFuZSgmY3R4LT5wbGFuZXNbMF0sIGZyYW1lLT5kYXRhWzBdLCBmcmFtZS0+bGluZXNpemVbMF0pOworICAgIH0KKworICAgIGl2aV9vdXRwdXRfcGxhbmUoJmN0eC0+cGxhbmVzWzJdLCBmcmFtZS0+ZGF0YVsxXSwgZnJhbWUtPmxpbmVzaXplWzFdKTsKKyAgICBpdmlfb3V0cHV0X3BsYW5lKCZjdHgtPnBsYW5lc1sxXSwgZnJhbWUtPmRhdGFbMl0sIGZyYW1lLT5saW5lc2l6ZVsyXSk7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIC8qIElmIHRoZSBiaWRpcmVjdGlvbmFsIG1vZGUgaXMgZW5hYmxlZCwgbmV4dCBJIGFuZCB0aGUgZm9sbG93aW5nIFAKKyAgICAgKiBmcmFtZSB3aWxsIGJlIHNlbnQgdG9nZXRoZXIuIFVuZm9ydHVuYXRlbHkgdGhlIGFwcHJvYWNoIGJlbG93IHNlZW1zCisgICAgICogdG8gYmUgdGhlIG9ubHkgd2F5IHRvIGhhbmRsZSB0aGUgQi1mcmFtZXMgbW9kZS4KKyAgICAgKiBUaGF0J3MgZXhhY3RseSB0aGUgc2FtZSBJbnRlbCBkZWNvZGVycyBkby4KKyAgICAgKi8KKyAgICBpZiAoY3R4LT5pc19pbmRlbzQgJiYgY3R4LT5mcmFtZV90eXBlID09IElWSTRfRlJBTUVUWVBFX0lOVFJBKSB7CisgICAgICAgIGludCBsZWZ0OworCisgICAgICAgICAgICAvLyBza2lwIHZlcnNpb24gc3RyaW5nCisgICAgICAgIHdoaWxlIChnZXRfYml0cygmY3R4LT5nYiwgOCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZjdHgtPmdiKSA8IDgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgbGVmdCA9IGdldF9iaXRzX2NvdW50KCZjdHgtPmdiKSAmIDB4MTg7CisgICAgICAgIHNraXBfYml0c19sb25nKCZjdHgtPmdiLCA2NCAtIGxlZnQpOworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmY3R4LT5nYikgPiAxOCAmJgorICAgICAgICAgICAgc2hvd19iaXRzX2xvbmcoJmN0eC0+Z2IsIDIxKSA9PSAweEJGRkY4KSB7IC8vIHN5bmNoZWFkZXIgKyBpbnRlciB0eXBlCisgICAgICAgICAgICBBVlBhY2tldCBwa3Q7CisgICAgICAgICAgICBwa3QuZGF0YSA9IGF2cGt0LT5kYXRhICsgKGdldF9iaXRzX2NvdW50KCZjdHgtPmdiKSA+PiAzKTsKKyAgICAgICAgICAgIHBrdC5zaXplID0gZ2V0X2JpdHNfbGVmdCgmY3R4LT5nYikgPj4gMzsKKyAgICAgICAgICAgIGZmX2l2aV9kZWNvZGVfZnJhbWUoYXZjdHgsIGN0eC0+cF9mcmFtZSwgJmN0eC0+Z290X3BfZnJhbWUsICZwa3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCisvKioKKyAqICBDbG9zZSBJbmRlbzUgZGVjb2RlciBhbmQgY2xlYW4gdXAgaXRzIGNvbnRleHQuCisgKi8KK2F2X2NvbGQgaW50IGZmX2l2aV9kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIElWSTQ1RGVjQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGl2aV9mcmVlX2J1ZmZlcnMoJmN0eC0+cGxhbmVzWzBdKTsKKworICAgIGlmIChjdHgtPm1iX3ZsYy5jdXN0X3RhYi50YWJsZSkKKyAgICAgICAgZmZfZnJlZV92bGMoJmN0eC0+bWJfdmxjLmN1c3RfdGFiKTsKKworI2lmIElWSTRfU1RSRUFNX0FOQUxZU0VSCisgICAgaWYgKGN0eC0+aXNfaW5kZW80KSB7CisgICAgaWYgKGN0eC0+aXNfc2NhbGFibGUpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGhpcyB2aWRlbyB1c2VzIHNjYWxhYmlsaXR5IG1vZGUhXG4iKTsKKyAgICBpZiAoY3R4LT51c2VzX3RpbGluZykKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGlzIHZpZGVvIHVzZXMgbG9jYWwgZGVjb2RpbmchXG4iKTsKKyAgICBpZiAoY3R4LT5oYXNfYl9mcmFtZXMpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGhpcyB2aWRlbyBjb250YWlucyBCLWZyYW1lcyFcbiIpOworICAgIGlmIChjdHgtPmhhc190cmFuc3ApCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVHJhbnNwYXJlbmN5IG1vZGUgaXMgZW5hYmxlZCFcbiIpOworICAgIGlmIChjdHgtPnVzZXNfaGFhcikKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGlzIHZpZGVvIHVzZXMgSGFhciB0cmFuc2Zvcm0hXG4iKTsKKyAgICBpZiAoY3R4LT51c2VzX2Z1bGxwZWwpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGhpcyB2aWRlbyB1c2VzIGZ1bGxwZWwgbW90aW9uIHZlY3RvcnMhXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmN0eC0+cF9mcmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqICBTY2FuIHBhdHRlcm5zIHNoYXJlZCBiZXR3ZWVuIGluZGVvNCBhbmQgaW5kZW81CisgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfaXZpX3ZlcnRpY2FsX3NjYW5fOHg4WzY0XSA9IHsKKyAgICAwLCAgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwKKyAgICAxLCAgOSwgMTcsIDI1LCAzMywgNDEsIDQ5LCA1NywKKyAgICAyLCAxMCwgMTgsIDI2LCAzNCwgNDIsIDUwLCA1OCwKKyAgICAzLCAxMSwgMTksIDI3LCAzNSwgNDMsIDUxLCA1OSwKKyAgICA0LCAxMiwgMjAsIDI4LCAzNiwgNDQsIDUyLCA2MCwKKyAgICA1LCAxMywgMjEsIDI5LCAzNywgNDUsIDUzLCA2MSwKKyAgICA2LCAxNCwgMjIsIDMwLCAzOCwgNDYsIDU0LCA2MiwKKyAgICA3LCAxNSwgMjMsIDMxLCAzOSwgNDcsIDU1LCA2MworfTsKKworY29uc3QgdWludDhfdCBmZl9pdmlfaG9yaXpvbnRhbF9zY2FuXzh4OFs2NF0gPSB7CisgICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LAorICAgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsCisgICAgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAorICAgIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwKKyAgICA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisgICAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LAorICAgIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MworfTsKKworY29uc3QgdWludDhfdCBmZl9pdmlfZGlyZWN0X3NjYW5fNHg0WzE2XSA9IHsKKyAgICAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1Cit9OworCisKKy8qKgorICogIFJ1bi12YWx1ZSAoUkxFKSB0YWJsZXMuCisgKi8KK2NvbnN0IFJWTWFwRGVzYyBmZl9pdmlfcnZtYXBfdGFic1s5XSA9IHsKK3sgICAvKiBNYXBUYWIwICovCisgICAgNSwgLyogZW9iX3N5bSAqLworICAgIDIsIC8qIGVzY19zeW0gKi8KKyAgICAvKiBydW4gdGFibGUgKi8KKyAgICB7MSwgIDEsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAzLCAgMywKKyAgICAgMSwgIDEsICAyLCAgMiwgIDEsICAxLCAgNCwgIDQsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICA1LCAgNSwKKyAgICAgMSwgIDEsICAzLCAgMywgIDEsICAxLCAgNiwgIDYsICAxLCAgMiwgIDEsICAyLCAgNywgIDcsICAxLCAgMSwKKyAgICAgOCwgIDgsICAxLCAgMSwgIDQsICAyLCAgMSwgIDQsICAyLCAgMSwgIDMsICAzLCAgMSwgIDEsICAxLCAgOSwKKyAgICAgOSwgIDEsICAyLCAgMSwgIDIsICAxLCAgNSwgIDUsICAxLCAgMSwgMTAsIDEwLCAgMSwgIDEsICAzLCAgMywKKyAgICAgMiwgIDIsICAxLCAgMSwgMTEsIDExLCAgNiwgIDQsICA0LCAgMSwgIDYsICAxLCAgMiwgIDEsICAyLCAxMiwKKyAgICAgOCwgIDEsIDEyLCAgNywgIDgsICA3LCAgMSwgMTYsICAxLCAxNiwgIDEsICAzLCAgMywgMTMsICAxLCAxMywKKyAgICAgMiwgIDIsICAxLCAxNSwgIDEsICA1LCAxNCwgMTUsICAxLCAgNSwgMTQsICAxLCAxNywgIDgsIDE3LCAgOCwKKyAgICAgMSwgIDQsICA0LCAgMiwgIDIsICAxLCAyNSwgMjUsIDI0LCAyNCwgIDEsICAzLCAgMSwgIDMsICAxLCAgOCwKKyAgICAgNiwgIDcsICA2LCAgMSwgMTgsICA4LCAxOCwgIDEsICA3LCAyMywgIDIsICAyLCAyMywgIDEsICAxLCAyMSwKKyAgICAyMiwgIDksICA5LCAyMiwgMTksICAxLCAyMSwgIDUsIDE5LCAgNSwgIDEsIDMzLCAyMCwgMzMsIDIwLCAgOCwKKyAgICAgNCwgIDQsICAxLCAzMiwgIDIsICAyLCAgOCwgIDMsIDMyLCAyNiwgIDMsICAxLCAgNywgIDcsIDI2LCAgNiwKKyAgICAgMSwgIDYsICAxLCAgMSwgMTYsICAxLCAxMCwgIDEsIDEwLCAgMiwgMTYsIDI5LCAyOCwgIDIsIDI5LCAyOCwKKyAgICAgMSwgMjcsICA1LCAgOCwgIDUsIDI3LCAgMSwgIDgsICAzLCAgNywgIDMsIDMxLCA0MSwgMzEsICAxLCA0MSwKKyAgICAgNiwgIDEsICA2LCAgNywgIDQsICA0LCAgMSwgIDEsICAyLCAgMSwgIDIsIDExLCAzNCwgMzAsIDExLCAgMSwKKyAgICAzMCwgMTUsIDE1LCAzNCwgMzYsIDQwLCAzNiwgNDAsIDM1LCAzNSwgMzcsIDM3LCAzOSwgMzksIDM4LCAzOH0sCisKKyAgICAvKiB2YWx1ZSB0YWJsZSAqLworICAgIHsgMSwgIC0xLCAgIDAsICAgMiwgIC0yLCAgIDAsICAgMywgIC0zLCAgIDEsICAtMSwgICA0LCAgLTQsICAgNSwgIC01LCAgIDEsICAtMSwKKyAgICAgIDYsICAtNiwgICAyLCAgLTIsICAgNywgIC03LCAgIDEsICAtMSwgICA4LCAgLTgsICAgOSwgIC05LCAgIDMsICAtMywgICAxLCAgLTEsCisgICAgIDEwLCAtMTAsICAgMiwgIC0yLCAgMTEsIC0xMSwgICAxLCAgLTEsICAxMiwgICA0LCAtMTIsICAtNCwgICAxLCAgLTEsICAxMywgLTEzLAorICAgICAgMSwgIC0xLCAgMTQsIC0xNCwgICAyLCAgIDUsICAxNSwgIC0yLCAgLTUsIC0xNSwgIC0zLCAgIDMsICAxNiwgLTE2LCAgMTcsICAgMSwKKyAgICAgLTEsIC0xNywgICA2LCAgMTgsICAtNiwgLTE4LCAgIDIsICAtMiwgIDE5LCAtMTksICAgMSwgIC0xLCAgMjAsIC0yMCwgICA0LCAgLTQsCisgICAgICA3LCAgLTcsICAyMSwgLTIxLCAgIDEsICAtMSwgICAyLCAgIDMsICAtMywgIDIyLCAgLTIsIC0yMiwgICA4LCAgMjMsICAtOCwgICAxLAorICAgICAgMiwgLTIzLCAgLTEsICAgMiwgIC0yLCAgLTIsICAyNCwgICAxLCAtMjQsICAtMSwgIDI1LCAgIDUsICAtNSwgICAxLCAtMjUsICAtMSwKKyAgICAgIDksICAtOSwgIDI2LCAgIDEsIC0yNiwgICAzLCAgIDEsICAtMSwgIDI3LCAgLTMsICAtMSwgLTI3LCAgIDEsICAgMywgIC0xLCAgLTMsCisgICAgIDI4LCAgLTQsICAgNCwgIDEwLCAtMTAsIC0yOCwgICAxLCAgLTEsICAgMSwgIC0xLCAgMjksICAgNiwgLTI5LCAgLTYsICAzMCwgIC00LAorICAgICAgMywgICAzLCAgLTMsIC0zMCwgICAxLCAgIDQsICAtMSwgIDMxLCAgLTMsICAgMSwgIDExLCAtMTEsICAtMSwgLTMxLCAgMzIsICAtMSwKKyAgICAgLTEsICAgMiwgIC0yLCAgIDEsICAgMSwgLTMyLCAgIDEsICAgNCwgIC0xLCAgLTQsICAzMywgIC0xLCAgIDEsICAgMSwgIC0xLCAgIDUsCisgICAgICA1LCAgLTUsIC0zMywgIC0xLCAtMTIsICAxMiwgIC01LCAgLTcsICAgMSwgICAxLCAgIDcsICAzNCwgICA0LCAgLTQsICAtMSwgICA0LAorICAgIC0zNCwgIC00LCAgMzUsICAzNiwgIC0yLCAtMzUsICAtMiwgLTM2LCAgIDIsICAxMywgICAyLCAgLTEsICAgMSwgLTEzLCAgIDEsICAtMSwKKyAgICAgMzcsICAgMSwgIC01LCAgIDYsICAgNSwgIC0xLCAgMzgsICAtNiwgIC04LCAgIDUsICAgOCwgIC0xLCAgIDEsICAgMSwgLTM3LCAgLTEsCisgICAgICA1LCAgMzksICAtNSwgIC01LCAgIDYsICAtNiwgLTM4LCAtMzksIC0xNCwgIDQwLCAgMTQsICAgMiwgICAxLCAgIDEsICAtMiwgLTQwLAorICAgICAtMSwgIC0yLCAgIDIsICAtMSwgIC0xLCAgLTEsICAgMSwgICAxLCAgIDEsICAtMSwgICAxLCAgLTEsICAgMSwgIC0xLCAgIDEsICAtMX0KK30seworICAgIC8qIE1hcFRhYjEgKi8KKyAgICAwLCAgLyogZW9iX3N5bSAqLworICAgIDM4LCAvKiBlc2Nfc3ltICovCisgICAgLyogcnVuIHRhYmxlICovCisgICAgezAsICAxLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDgsICA2LCAgOCwgIDcsCisgICAgIDcsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsICAxLCAxMiwgIDEsIDEyLCAxMywgMTMsIDE2LCAxNCwgMTYsCisgICAgMTQsIDE1LCAxNSwgMTcsIDE3LCAxOCwgIDAsIDE4LCAxOSwgMjAsIDIxLCAxOSwgMjIsIDIxLCAyMCwgMjIsCisgICAgMjUsIDI0LCAgMiwgMjUsIDI0LCAyMywgMjMsICAyLCAyNiwgMjgsIDI2LCAyOCwgMjksIDI3LCAyOSwgMjcsCisgICAgMzMsIDMzLCAgMSwgMzIsICAxLCAgMywgMzIsIDMwLCAzNiwgIDMsIDM2LCAzMCwgMzEsIDMxLCAzNSwgMzQsCisgICAgMzcsIDQxLCAzNCwgMzUsIDM3LCAgNCwgNDEsICA0LCA0OSwgIDgsICA4LCA0OSwgNDAsIDM4LCAgNSwgMzgsCisgICAgNDAsIDM5LCAgNSwgMzksIDQyLCA0MywgNDIsICA3LCA1NywgIDYsIDQzLCA0NCwgIDYsIDUwLCAgNywgNDQsCisgICAgNTcsIDQ4LCA1MCwgNDgsIDQ1LCA0NSwgNDYsIDQ3LCA1MSwgNDYsIDQ3LCA1OCwgIDEsIDUxLCA1OCwgIDEsCisgICAgNTIsIDU5LCA1MywgIDksIDUyLCA1NSwgNTUsIDU5LCA1MywgNTYsIDU0LCA1NiwgNTQsICA5LCA2NCwgNjQsCisgICAgNjAsIDYzLCA2MCwgNjMsIDYxLCA2MiwgNjEsIDYyLCAgMiwgMTAsICAyLCAxMCwgMTEsICAxLCAxMSwgMTMsCisgICAgMTIsICAxLCAxMiwgMTMsIDE2LCAxNiwgIDgsICA4LCAxNCwgIDMsICAzLCAxNSwgMTQsIDE1LCAgNCwgIDQsCisgICAgIDEsIDE3LCAxNywgIDUsICAxLCAgNywgIDcsICA1LCAgNiwgIDEsICAyLCAgMiwgIDYsIDIyLCAgMSwgMjUsCisgICAgMjEsIDIyLCAgOCwgMjQsICAxLCAyMSwgMjUsIDI0LCAgOCwgMTgsIDE4LCAyMywgIDksIDIwLCAyMywgMzMsCisgICAgMjksIDMzLCAyMCwgIDEsIDE5LCAgMSwgMjksIDM2LCAgOSwgMzYsIDE5LCA0MSwgMjgsIDU3LCAzMiwgIDMsCisgICAgMjgsICAzLCAgMSwgMjcsIDQ5LCA0OSwgIDEsIDMyLCAyNiwgMjYsICAyLCAgNCwgIDQsICA3LCA1NywgNDEsCisgICAgIDIsICA3LCAxMCwgIDUsIDM3LCAxNiwgMTAsIDI3LCAgOCwgIDgsIDEzLCAxNiwgMzcsIDEzLCAgMSwgIDV9LAorCisgICAgLyogdmFsdWUgdGFibGUgKi8KKyAgICB7MCwgICAxLCAgLTEsICAgMSwgIC0xLCAgIDEsICAtMSwgICAxLCAgLTEsICAgMSwgIC0xLCAgIDEsICAgMSwgIC0xLCAgLTEsICAgMSwKKyAgICAtMSwgICAxLCAgLTEsICAgMSwgIC0xLCAgIDEsICAtMSwgICAyLCAgIDEsICAtMiwgIC0xLCAgIDEsICAtMSwgICAxLCAgIDEsICAtMSwKKyAgICAtMSwgICAxLCAgLTEsICAgMSwgIC0xLCAgIDEsICAgMCwgIC0xLCAgIDEsICAgMSwgICAxLCAgLTEsICAgMSwgIC0xLCAgLTEsICAtMSwKKyAgICAgMSwgICAxLCAgIDIsICAtMSwgIC0xLCAgIDEsICAtMSwgIC0yLCAgIDEsICAgMSwgIC0xLCAgLTEsICAgMSwgICAxLCAgLTEsICAtMSwKKyAgICAgMSwgIC0xLCAgIDMsICAgMSwgIC0zLCAgIDIsICAtMSwgICAxLCAgIDEsICAtMiwgIC0xLCAgLTEsICAtMSwgICAxLCAgIDEsICAgMSwKKyAgICAgMSwgICAxLCAgLTEsICAtMSwgIC0xLCAgIDIsICAtMSwgIC0yLCAgIDEsICAgMiwgIC0yLCAgLTEsICAgMSwgICAxLCAgIDIsICAtMSwKKyAgICAtMSwgICAxLCAgLTIsICAtMSwgICAxLCAgIDEsICAtMSwgICAyLCAgIDEsICAgMiwgIC0xLCAgIDEsICAtMiwgIC0xLCAgLTIsICAtMSwKKyAgICAtMSwgICAxLCAgIDEsICAtMSwgICAxLCAgLTEsICAgMSwgICAxLCAgIDEsICAtMSwgIC0xLCAgIDEsICAgNCwgIC0xLCAgLTEsICAtNCwKKyAgICAgMSwgICAxLCAgIDEsICAgMiwgIC0xLCAgLTEsICAgMSwgIC0xLCAgLTEsICAgMSwgIC0xLCAgLTEsICAgMSwgIC0yLCAgIDEsICAtMSwKKyAgICAgMSwgICAxLCAgLTEsICAtMSwgICAxLCAgIDEsICAtMSwgIC0xLCAgIDMsICAgMiwgIC0zLCAgLTIsICAgMiwgICA1LCAgLTIsICAgMiwKKyAgICAgMiwgIC01LCAgLTIsICAtMiwgIC0yLCAgIDIsICAtMywgICAzLCAgIDIsICAgMywgIC0zLCAgIDIsICAtMiwgIC0yLCAgIDMsICAtMywKKyAgICAgNiwgICAyLCAgLTIsICAgMywgIC02LCAgIDMsICAtMywgIC0zLCAgIDMsICAgNywgIC00LCAgIDQsICAtMywgICAyLCAgLTcsICAgMiwKKyAgICAgMiwgIC0yLCAgLTQsICAgMiwgICA4LCAgLTIsICAtMiwgIC0yLCAgIDQsICAgMiwgIC0yLCAgIDIsICAgMywgICAyLCAgLTIsICAtMiwKKyAgICAgMiwgICAyLCAgLTIsICAtOCwgIC0yLCAgIDksICAtMiwgICAyLCAgLTMsICAtMiwgICAyLCAgLTIsICAgMiwgICAyLCAgIDIsICAgNCwKKyAgICAtMiwgIC00LCAgMTAsICAgMiwgICAyLCAgLTIsICAtOSwgIC0yLCAgIDIsICAtMiwgICA1LCAgIDQsICAtNCwgICA0LCAgLTIsICAgMiwKKyAgICAtNSwgIC00LCAgLTMsICAgNCwgICAyLCAgLTMsICAgMywgIC0yLCAgLTUsICAgNSwgICAzLCAgIDMsICAtMiwgIC0zLCAtMTAsICAtNH0KK30seworICAgIC8qIE1hcFRhYjIgKi8KKyAgICAyLCAgLyogZW9iX3N5bSAqLworICAgIDExLCAvKiBlc2Nfc3ltICovCisgICAgLyogcnVuIHRhYmxlICovCisgICAgezEsICAxLCAgMCwgIDIsICAyLCAgMSwgIDEsICAzLCAgMywgIDQsICA0LCAgMCwgIDEsICAxLCAgNSwgIDUsCisgICAgIDIsICAyLCAgNiwgIDYsICA3LCAgNywgIDEsICA4LCAgMSwgIDgsICAzLCAgMywgIDksICA5LCAgMSwgIDIsCisgICAgIDIsICAxLCAgNCwgMTAsICA0LCAxMCwgMTEsIDExLCAgMSwgIDUsIDEyLCAxMiwgIDEsICA1LCAxMywgMTMsCisgICAgIDMsICAzLCAgNiwgIDYsICAyLCAgMiwgMTQsIDE0LCAxNiwgMTYsIDE1LCAgNywgMTUsICA4LCAgOCwgIDcsCisgICAgIDEsICAxLCAxNywgMTcsICA0LCAgNCwgIDEsICAxLCAxOCwgMTgsICAyLCAgMiwgIDUsICA1LCAyNSwgIDMsCisgICAgIDksICAzLCAyNSwgIDksIDE5LCAyNCwgMTksIDI0LCAgMSwgMjEsIDIwLCAgMSwgMjEsIDIyLCAyMCwgMjIsCisgICAgMjMsIDIzLCAgOCwgIDYsIDMzLCAgNiwgIDgsIDMzLCAgNywgIDcsIDI2LCAyNiwgIDEsIDMyLCAgMSwgMzIsCisgICAgMjgsICA0LCAyOCwgMTAsIDI5LCAyNywgMjcsIDEwLCA0MSwgIDQsIDI5LCAgMiwgIDIsIDQxLCAzNiwgMzEsCisgICAgNDksIDMxLCAzNCwgMzAsIDM0LCAzNiwgMzAsIDM1LCAgMSwgNDksIDExLCAgNSwgMzUsIDExLCAgMSwgIDMsCisgICAgIDMsICA1LCAzNywgMzcsICA4LCA0MCwgIDgsIDQwLCAxMiwgMTIsIDQyLCA0MiwgIDEsIDM4LCAxNiwgNTcsCisgICAgIDEsICA2LCAxNiwgMzksIDM4LCAgNiwgIDcsICA3LCAxMywgMTMsIDM5LCA0MywgIDIsIDQzLCA1NywgIDIsCisgICAgNTAsICA5LCA0NCwgIDksIDUwLCAgNCwgMTUsIDQ4LCA0NCwgIDQsICAxLCAxNSwgNDgsIDE0LCAxNCwgIDEsCisgICAgNDUsIDQ1LCAgOCwgIDMsICA1LCAgOCwgNTEsIDQ3LCAgMywgNDYsIDQ2LCA0NywgIDUsIDUxLCAgMSwgMTcsCisgICAgMTcsIDU4LCAgMSwgNTgsICAyLCA1MiwgNTIsICAyLCA1MywgIDcsIDU5LCAgNiwgIDYsIDU2LCA1MywgNTUsCisgICAgIDcsIDU1LCAgMSwgNTQsIDU5LCA1NiwgNTQsIDEwLCAgMSwgMTAsICA0LCA2MCwgIDEsIDYwLCAgOCwgIDQsCisgICAgIDgsIDY0LCA2NCwgNjEsICAxLCA2MywgIDMsIDYzLCA2MiwgNjEsICA1LCAxMSwgIDUsICAzLCAxMSwgNjJ9LAorCisgICAgLyogdmFsdWUgdGFibGUgKi8KKyAgICB7IDEsICAtMSwgICAwLCAgIDEsICAtMSwgICAyLCAgLTIsICAgMSwgIC0xLCAgIDEsICAtMSwgICAwLCAgIDMsICAtMywgICAxLCAgLTEsCisgICAgICAyLCAgLTIsICAgMSwgIC0xLCAgIDEsICAtMSwgICA0LCAgIDEsICAtNCwgIC0xLCAgIDIsICAtMiwgICAxLCAgLTEsICAgNSwgICAzLAorICAgICAtMywgIC01LCAgIDIsICAgMSwgIC0yLCAgLTEsICAgMSwgIC0xLCAgIDYsICAgMiwgICAxLCAgLTEsICAtNiwgIC0yLCAgIDEsICAtMSwKKyAgICAgIDMsICAtMywgICAyLCAgLTIsICAgNCwgIC00LCAgIDEsICAtMSwgICAxLCAgLTEsICAgMSwgICAyLCAgLTEsICAgMiwgIC0yLCAgLTIsCisgICAgICA3LCAgLTcsICAgMSwgIC0xLCAgIDMsICAtMywgICA4LCAgLTgsICAgMSwgIC0xLCAgIDUsICAtNSwgICAzLCAgLTMsICAgMSwgICA0LAorICAgICAgMiwgIC00LCAgLTEsICAtMiwgICAxLCAgIDEsICAtMSwgIC0xLCAgIDksICAgMSwgICAxLCAgLTksICAtMSwgICAxLCAgLTEsICAtMSwKKyAgICAgIDEsICAtMSwgICAzLCAgLTMsICAgMSwgICAzLCAgLTMsICAtMSwgICAzLCAgLTMsICAgMSwgIC0xLCAgMTAsICAgMSwgLTEwLCAgLTEsCisgICAgICAxLCAgIDQsICAtMSwgICAyLCAgIDEsICAtMSwgICAxLCAgLTIsICAgMSwgIC00LCAgLTEsICAgNiwgIC02LCAgLTEsICAgMSwgICAxLAorICAgICAgMSwgIC0xLCAgIDEsICAgMSwgIC0xLCAgLTEsICAtMSwgICAxLCAgMTEsICAtMSwgIC0yLCAgIDQsICAtMSwgICAyLCAtMTEsICAgNSwKKyAgICAgLTUsICAtNCwgIC0xLCAgIDEsICAgNCwgICAxLCAgLTQsICAtMSwgIC0yLCAgIDIsICAgMSwgIC0xLCAgMTIsICAgMSwgIC0yLCAgIDEsCisgICAgLTEyLCAgIDQsICAgMiwgICAxLCAgLTEsICAtNCwgICA0LCAgLTQsICAgMiwgIC0yLCAgLTEsICAgMSwgICA3LCAgLTEsICAtMSwgIC03LAorICAgICAtMSwgIC0zLCAgIDEsICAgMywgICAxLCAgIDUsICAgMiwgICAxLCAgLTEsICAtNSwgIDEzLCAgLTIsICAtMSwgICAyLCAgLTIsIC0xMywKKyAgICAgIDEsICAtMSwgICA1LCAgIDYsICAgNSwgIC01LCAgIDEsICAgMSwgIC02LCAgIDEsICAtMSwgIC0xLCAgLTUsICAtMSwgIDE0LCAgIDIsCisgICAgIC0yLCAgIDEsIC0xNCwgIC0xLCAgIDgsICAgMSwgIC0xLCAgLTgsICAgMSwgICA1LCAgIDEsICAgNSwgIC01LCAgIDEsICAtMSwgICAxLAorICAgICAtNSwgIC0xLCAgMTUsICAgMSwgIC0xLCAgLTEsICAtMSwgICAzLCAtMTUsICAtMywgICA2LCAgIDEsICAxNiwgIC0xLCAgIDYsICAtNiwKKyAgICAgLTYsICAgMSwgIC0xLCAgIDEsIC0xNiwgICAxLCAgIDcsICAtMSwgICAxLCAgLTEsICAtNiwgIC0zLCAgIDYsICAtNywgICAzLCAgLTF9Cit9LHsKKyAgICAvKiBNYXBUYWIzICovCisgICAgMCwgIC8qIGVvYl9zeW0gKi8KKyAgICAzNSwgLyogZXNjX3N5bSAqLworICAgIC8qIHJ1biB0YWJsZSAqLworICAgIHswLCAgMSwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICAxLCAgMSwgIDUsICA1LCAgNiwgIDYsICA3LAorICAgICA3LCAgOCwgIDgsICA5LCAgOSwgIDIsICAyLCAxMCwgMTAsICAxLCAgMSwgMTEsIDExLCAxMiwgMTIsICAzLAorICAgICAzLCAxMywgMTMsICAwLCAxNCwgMTQsIDE2LCAxNSwgMTYsIDE1LCAgNCwgIDQsIDE3LCAgMSwgMTcsICAxLAorICAgICA1LCAgNSwgMTgsIDE4LCAgMiwgIDIsICA2LCAgNiwgIDgsIDE5LCAgNywgIDgsICA3LCAxOSwgMjAsIDIwLAorICAgIDIxLCAyMSwgMjIsIDI0LCAyMiwgMjQsIDIzLCAyMywgIDEsICAxLCAyNSwgMjUsICAzLCAgMywgMjYsIDI2LAorICAgICA5LCAgOSwgMjcsIDI3LCAyOCwgMjgsIDMzLCAyOSwgIDQsIDMzLCAyOSwgIDEsICA0LCAgMSwgMzIsIDMyLAorICAgICAyLCAgMiwgMzEsIDEwLCAzMCwgMTAsIDMwLCAzMSwgMzQsIDM0LCAgNSwgIDUsIDM2LCAzNiwgMzUsIDQxLAorICAgIDM1LCAxMSwgNDEsIDExLCAzNywgIDEsICA4LCAgOCwgMzcsICA2LCAgMSwgIDYsIDQwLCAgNywgIDcsIDQwLAorICAgIDEyLCAzOCwgMTIsIDM5LCAzOSwgMzgsIDQ5LCAxMywgNDksIDEzLCAgMywgNDIsICAzLCA0MiwgMTYsIDE2LAorICAgIDQzLCA0MywgMTQsIDE0LCAgMSwgIDEsIDQ0LCAxNSwgNDQsIDE1LCAgMiwgIDIsIDU3LCA0OCwgNTAsIDQ4LAorICAgIDU3LCA1MCwgIDQsIDQ1LCA0NSwgIDQsIDQ2LCA0NywgNDcsIDQ2LCAgMSwgNTEsICAxLCAxNywgMTcsIDUxLAorICAgICA4LCAgOSwgIDksICA1LCA1OCwgIDgsIDU4LCAgNSwgNTIsIDUyLCA1NSwgNTYsIDUzLCA1NiwgNTUsIDU5LAorICAgIDU5LCA1MywgNTQsICAxLCAgNiwgNTQsICA3LCAgNywgIDYsICAxLCAgMiwgIDMsICAyLCAgMywgNjQsIDYwLAorICAgIDYwLCAxMCwgMTAsIDY0LCA2MSwgNjIsIDYxLCA2MywgIDEsIDYzLCA2MiwgIDEsIDE4LCAyNCwgMTgsICA0LAorICAgIDI1LCAgNCwgIDgsIDIxLCAyMSwgIDEsIDI0LCAyMiwgMjUsIDIyLCAgOCwgMTEsIDE5LCAxMSwgMjMsICAxLAorICAgIDIwLCAyMywgMTksIDIwLCAgNSwgMTIsICA1LCAgMSwgMTYsICAyLCAxMiwgMTMsICAyLCAxMywgIDEsIDE2fSwKKworICAgIC8qIHZhbHVlIHRhYmxlICovCisgICAgeyAwLCAgIDEsICAtMSwgICAxLCAgLTEsICAgMSwgIC0xLCAgIDEsICAtMSwgICAyLCAgLTIsICAgMSwgIC0xLCAgIDEsICAtMSwgICAxLAorICAgICAtMSwgICAxLCAgLTEsICAgMSwgIC0xLCAgIDIsICAtMiwgICAxLCAgLTEsICAgMywgIC0zLCAgIDEsICAtMSwgICAxLCAgLTEsICAgMiwKKyAgICAgLTIsICAgMSwgIC0xLCAgIDAsICAgMSwgIC0xLCAgIDEsICAgMSwgIC0xLCAgLTEsICAgMiwgIC0yLCAgIDEsICAgNCwgIC0xLCAgLTQsCisgICAgICAyLCAgLTIsICAgMSwgIC0xLCAgLTMsICAgMywgICAyLCAgLTIsICAgMiwgICAxLCAgIDIsICAtMiwgIC0yLCAgLTEsICAgMSwgIC0xLAorICAgICAgMSwgIC0xLCAgIDEsICAgMSwgIC0xLCAgLTEsICAgMSwgIC0xLCAgIDUsICAtNSwgICAxLCAgLTEsICAgMywgIC0zLCAgIDEsICAtMSwKKyAgICAgIDIsICAtMiwgICAxLCAgLTEsICAgMSwgIC0xLCAgIDEsICAgMSwgICAzLCAgLTEsICAtMSwgICA2LCAgLTMsICAtNiwgIC0xLCAgIDEsCisgICAgICA0LCAgLTQsICAgMSwgICAyLCAgIDEsICAtMiwgIC0xLCAgLTEsICAgMSwgIC0xLCAgIDMsICAtMywgICAxLCAgLTEsICAgMSwgICAxLAorICAgICAtMSwgICAyLCAgLTEsICAtMiwgICAxLCAgIDcsICAtMywgICAzLCAgLTEsICAgMywgIC03LCAgLTMsICAgMSwgIC0zLCAgIDMsICAtMSwKKyAgICAgIDIsICAgMSwgIC0yLCAgIDEsICAtMSwgIC0xLCAgIDEsICAgMiwgIC0xLCAgLTIsICAtNCwgIC0xLCAgIDQsICAgMSwgICAyLCAgLTIsCisgICAgICAxLCAgLTEsICAtMiwgICAyLCAgIDgsICAtOCwgIC0xLCAgIDIsICAgMSwgIC0yLCAgLTUsICAgNSwgICAxLCAgLTEsICAtMSwgICAxLAorICAgICAtMSwgICAxLCAgIDQsICAtMSwgICAxLCAgLTQsICAtMSwgIC0xLCAgIDEsICAgMSwgICA5LCAgIDEsICAtOSwgICAyLCAgLTIsICAtMSwKKyAgICAgLTQsICAgMywgIC0zLCAgLTQsICAtMSwgICA0LCAgIDEsICAgNCwgICAxLCAgLTEsICAgMSwgIC0xLCAgIDEsICAgMSwgIC0xLCAgIDEsCisgICAgIC0xLCAgLTEsICAtMSwgIDEwLCAgIDQsICAgMSwgICA0LCAgLTQsICAtNCwgLTEwLCAgIDYsICAgNSwgIC02LCAgLTUsICAgMSwgIC0xLAorICAgICAgMSwgICAzLCAgLTMsICAtMSwgICAxLCAgLTEsICAtMSwgIC0xLCAgMTEsICAgMSwgICAxLCAtMTEsICAtMiwgIC0yLCAgIDIsICAgNSwKKyAgICAgLTIsICAtNSwgIC01LCAgIDIsICAtMiwgIDEyLCAgIDIsICAtMiwgICAyLCAgIDIsICAgNSwgIC0zLCAgLTIsICAgMywgIC0yLCAtMTIsCisgICAgIC0yLCAgIDIsICAgMiwgICAyLCAgLTUsICAgMywgICA1LCAgMTMsICAtMywgICA3LCAgLTMsICAtMywgIC03LCAgIDMsIC0xMywgICAzfQorfSx7CisgICAgLyogTWFwVGFiNCAqLworICAgIDAsICAvKiBlb2Jfc3ltICovCisgICAgMzQsIC8qIGVzY19zeW0gKi8KKyAgICAvKiBydW4gdGFibGUgKi8KKyAgICB7MCwgIDEsICAxLCAgMSwgIDIsICAyLCAgMSwgIDMsICAzLCAgMSwgIDEsICAxLCAgNCwgIDQsICAxLCAgNSwKKyAgICAgMiwgIDEsICA1LCAgMiwgIDEsICAxLCAgNiwgIDYsICAxLCAgMSwgIDEsICAxLCAgMSwgIDcsICAzLCAgMSwKKyAgICAgMiwgIDMsICAwLCAgMSwgIDIsICA3LCAgMSwgIDEsICAxLCAgOCwgIDEsICAxLCAgOCwgIDEsICAxLCAgMSwKKyAgICAgOSwgIDEsICA5LCAgMSwgIDIsICAxLCAgMSwgIDIsICAxLCAgMSwgMTAsICA0LCAgMSwgMTAsICAxLCAgNCwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAzLCAgMSwgIDEsICAxLCAgMywgIDIsICAxLCAgNSwgIDEsICAxLCAgMSwKKyAgICAgMiwgIDUsICAxLCAxMSwgIDEsIDExLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMiwgIDEsICA2LCAgMSwgIDYsICAxLCAgMSwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAxMiwKKyAgICAgMywgIDEsIDEyLCAgMSwgIDEsICAxLCAgMiwgIDEsICAxLCAgMywgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgNCwgIDEsICAxLCAgMSwgIDIsICAxLCAgMSwgIDQsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAyLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDMsICAxLCAgMiwgIDEsICAxLCAgNSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICA3LCAgMSwgIDcsICAxLCAgMSwgIDIsICAzLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgNSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsIDEzLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIDEzLCAgMiwgIDEsICAxLCAgNCwgIDEsICAxLCAgMSwKKyAgICAgMywgIDEsICA2LCAgMSwgIDEsICAxLCAxNCwgIDEsICAxLCAgMSwgIDEsICAxLCAxNCwgIDYsICAxLCAgMSwKKyAgICAgMSwgIDEsIDE1LCAgMiwgIDQsICAxLCAgMiwgIDMsIDE1LCAgMSwgIDEsICAxLCAgOCwgIDEsICAxLCAgOCwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMX0sCisKKyAgICAvKiB2YWx1ZSB0YWJsZSAqLworICAgIHsgMCwgICAxLCAgLTEsICAgMiwgICAxLCAgLTEsICAtMiwgICAxLCAgLTEsICAgMywgIC0zLCAgIDQsICAgMSwgIC0xLCAgLTQsICAgMSwKKyAgICAgIDIsICAgNSwgIC0xLCAgLTIsICAtNSwgICA2LCAgIDEsICAtMSwgIC02LCAgIDcsICAtNywgICA4LCAgLTgsICAgMSwgICAyLCAgIDksCisgICAgICAzLCAgLTIsICAgMCwgIC05LCAgLTMsICAtMSwgIDEwLCAtMTAsICAxMSwgICAxLCAtMTEsICAxMiwgIC0xLCAtMTIsICAxMywgLTEzLAorICAgICAgMSwgIDE0LCAgLTEsIC0xNCwgICA0LCAgMTUsIC0xNSwgIC00LCAgMTYsIC0xNiwgICAxLCAgIDIsICAxNywgIC0xLCAtMTcsICAtMiwKKyAgICAgMTgsIC0xOCwgIDE5LCAtMTksICAyMCwgICAzLCAtMjAsICAyMSwgLTIxLCAgLTMsICAgNSwgIDIyLCAgIDIsIC0yMiwgLTIzLCAgMjMsCisgICAgIC01LCAgLTIsICAyNCwgICAxLCAtMjQsICAtMSwgIDI1LCAtMjUsICAyNiwgLTI2LCAtMjcsICAyNywgIDI4LCAgMjksIC0yOCwgLTI5LAorICAgICAgNiwgIDMwLCAgIDIsIC0zMSwgIC0yLCAtMzAsICAzMSwgIC02LCAtMzIsICAzMiwgIDMzLCAtMzMsICAzNCwgLTM1LCAtMzQsICAgMSwKKyAgICAgIDQsIC0zNiwgIC0xLCAgMzUsICAzNywgIDM2LCAgIDcsIC0zNywgIDM4LCAgLTQsIC0zOCwgIDM5LCAgNDEsICA0MCwgLTQwLCAtMzksCisgICAgICAzLCAgNDIsIC00MywgLTQxLCAgLTcsIC00MiwgIDQzLCAgLTMsICA0NCwgLTQ0LCAgNDUsIC00NSwgIDQ2LCAgNDcsICAgOCwgLTQ3LAorICAgIC00OCwgLTQ2LCAgNTAsIC01MCwgIDQ4LCAgNDksICA1MSwgLTQ5LCAgNTIsIC01MiwgICA1LCAtNTEsICAtOCwgLTUzLCAgNTMsICAgMywKKyAgICAtNTYsICA1NiwgIDU1LCAgNTQsIC01NCwgICAyLCAgNjAsICAtMiwgLTU1LCAgNTgsICAgOSwgIC01LCAgNTksICA1NywgLTU3LCAtNjMsCisgICAgIC0zLCAtNTgsIC02MCwgLTYxLCAgNjEsIC01OSwgLTYyLCAgLTksICAgMSwgIDY0LCAgNjIsICA2OSwgLTY0LCAgNjMsICA2NSwgLTY3LAorICAgIC02OCwgIDY2LCAtNjUsICA2OCwgLTY2LCAtNjksICA2NywgLTcwLCAgLTEsICAxMCwgIDcxLCAtNzEsICAgNCwgIDczLCAgNzIsICA3MCwKKyAgICAgIDYsIC03NiwgIC0zLCAgNzQsIC03OCwgLTc0LCAgIDEsICA3OCwgIDgwLCAtNzIsIC03NSwgIDc2LCAgLTEsICAgMywgLTczLCAgNzksCisgICAgIDc1LCAgNzcsICAgMSwgIDExLCAgLTQsIC03OSwgLTEwLCAgLTYsICAtMSwgLTc3LCAtODMsIC04MCwgICAyLCAgODEsIC04NCwgIC0yLAorICAgICA4MywgLTgxLCAgODIsIC04MiwgIDg0LCAtODcsIC04NiwgIDg1LCAtMTEsIC04NSwgIDg2LCAtODksICA4NywgLTg4LCAgODgsICA4OX0KK30seworICAgIC8qIE1hcFRhYjUgKi8KKyAgICAyLCAgLyogZW9iX3N5bSAqLworICAgIDMzLCAvKiBlc2Nfc3ltICovCisgICAgLyogcnVuIHRhYmxlICovCisgICAgezEsICAxLCAgMCwgIDIsICAxLCAgMiwgIDEsICAzLCAgMywgIDEsICAxLCAgNCwgIDQsICAyLCAgMiwgIDEsCisgICAgIDEsICA1LCAgNSwgIDYsICAxLCAgNiwgIDEsICA3LCAgNywgIDMsICAzLCAgMiwgIDgsICAyLCAgOCwgIDEsCisgICAgIDEsICAwLCAgOSwgIDksICAxLCAgMSwgMTAsICA0LCAxMCwgIDQsIDExLCAxMSwgIDIsICAxLCAgMiwgIDEsCisgICAgMTIsIDEyLCAgMywgIDMsICAxLCAgMSwgMTMsICA1LCAgNSwgMTMsIDE0LCAgMSwgIDEsIDE0LCAgMiwgIDIsCisgICAgIDYsICA2LCAxNSwgIDEsICAxLCAxNSwgMTYsICA0LCAgNywgMTYsICA0LCAgNywgIDEsICAxLCAgMywgIDMsCisgICAgIDgsICA4LCAgMiwgIDIsICAxLCAgMSwgMTcsIDE3LCAgMSwgIDEsIDE4LCAxOCwgIDUsICA1LCAgMiwgIDIsCisgICAgIDEsICAxLCAgOSwgMTksICA5LCAxOSwgMjAsICAzLCAgMywgMjAsICAxLCAxMCwgMjEsICAxLCAxMCwgIDQsCisgICAgIDQsIDIxLCAyMiwgIDYsICA2LCAyMiwgIDEsICAxLCAyMywgMjQsICAyLCAgMiwgMjMsIDI0LCAxMSwgIDEsCisgICAgIDEsIDExLCAgNywgMjUsICA3LCAgMSwgIDEsIDI1LCAgOCwgIDgsICAzLCAyNiwgIDMsICAxLCAxMiwgIDIsCisgICAgIDIsIDI2LCAgMSwgMTIsICA1LCAgNSwgMjcsICA0LCAgMSwgIDQsICAxLCAyNywgMjgsICAxLCAyOCwgMTMsCisgICAgIDEsIDEzLCAgMiwgMjksICAyLCAgMSwgMzIsICA2LCAgMSwgMzAsIDE0LCAyOSwgMTQsICA2LCAgMywgMzEsCisgICAgIDMsICAxLCAzMCwgIDEsIDMyLCAzMSwgMzMsICA5LCAzMywgIDEsICAxLCAgNywgIDksICA3LCAgMiwgIDIsCisgICAgIDEsICAxLCAgNCwgMzYsIDM0LCAgNCwgIDUsIDEwLCAxMCwgIDUsIDM0LCAgMSwgIDEsIDM1LCAgOCwgIDgsCisgICAgMzYsICAzLCAzNSwgIDEsIDE1LCAgMywgIDIsICAxLCAxNiwgMTUsIDE2LCAgMiwgMzcsICAxLCAzNywgIDEsCisgICAgIDEsICAxLCAgNiwgIDYsIDM4LCAgMSwgMzgsIDExLCAgMSwgMzksIDM5LCA0MCwgMTEsICAyLCA0MSwgIDQsCisgICAgNDAsICAxLCAgMiwgIDQsICAxLCAgMSwgIDEsIDQxLCAgMywgIDEsICAzLCAgMSwgIDUsICA3LCAgNSwgIDd9LAorCisgICAgLyogdmFsdWUgdGFibGUgKi8KKyAgICB7IDEsICAtMSwgICAwLCAgIDEsICAgMiwgIC0xLCAgLTIsICAgMSwgIC0xLCAgIDMsICAtMywgICAxLCAgLTEsICAgMiwgIC0yLCAgIDQsCisgICAgIC00LCAgIDEsICAtMSwgICAxLCAgIDUsICAtMSwgIC01LCAgIDEsICAtMSwgICAyLCAgLTIsICAgMywgICAxLCAgLTMsICAtMSwgICA2LAorICAgICAtNiwgICAwLCAgIDEsICAtMSwgICA3LCAgLTcsICAgMSwgICAyLCAgLTEsICAtMiwgICAxLCAgLTEsICAgNCwgICA4LCAgLTQsICAtOCwKKyAgICAgIDEsICAtMSwgICAzLCAgLTMsICAgOSwgIC05LCAgIDEsICAgMiwgIC0yLCAgLTEsICAgMSwgIDEwLCAtMTAsICAtMSwgICA1LCAgLTUsCisgICAgICAyLCAgLTIsICAgMSwgIDExLCAtMTEsICAtMSwgICAxLCAgIDMsICAgMiwgIC0xLCAgLTMsICAtMiwgIDEyLCAtMTIsICAgNCwgIC00LAorICAgICAgMiwgIC0yLCAgLTYsICAgNiwgIDEzLCAtMTMsICAgMSwgIC0xLCAgMTQsIC0xNCwgICAxLCAgLTEsICAgMywgIC0zLCAgIDcsICAtNywKKyAgICAgMTUsIC0xNSwgICAyLCAgIDEsICAtMiwgIC0xLCAgIDEsICAgNSwgIC01LCAgLTEsIC0xNiwgICAyLCAgIDEsICAxNiwgIC0yLCAgIDQsCisgICAgIC00LCAgLTEsICAgMSwgICAzLCAgLTMsICAtMSwgIDE3LCAtMTcsICAgMSwgICAxLCAgLTgsICAgOCwgIC0xLCAgLTEsICAgMiwgIDE4LAorICAgIC0xOCwgIC0yLCAgIDMsICAgMSwgIC0zLCAgMTksIC0xOSwgIC0xLCAgIDMsICAtMywgICA2LCAgIDEsICAtNiwgIDIwLCAgIDIsICAgOSwKKyAgICAgLTksICAtMSwgLTIwLCAgLTIsICAgNCwgIC00LCAgIDEsICAtNSwgIDIxLCAgIDUsIC0yMSwgIC0xLCAgIDEsIC0yMiwgIC0xLCAgIDIsCisgICAgIDIyLCAgLTIsICAxMCwgICAxLCAtMTAsICAyMywgICAxLCAgIDQsIC0yMywgICAxLCAgIDIsICAtMSwgIC0yLCAgLTQsICAtNywgICAxLAorICAgICAgNywgLTI0LCAgLTEsICAyNCwgIC0xLCAgLTEsICAgMSwgICAzLCAgLTEsIC0yNSwgIDI1LCAgIDQsICAtMywgIC00LCAgMTEsIC0xMSwKKyAgICAgMjYsIC0yNiwgICA2LCAgIDEsICAgMSwgIC02LCAgLTUsICAtMywgICAzLCAgIDUsICAtMSwgLTI3LCAgMjcsICAgMSwgICA0LCAgLTQsCisgICAgIC0xLCAgLTgsICAtMSwgIDI4LCAgIDIsICAgOCwgLTEyLCAtMjgsICAtMiwgIC0yLCAgIDIsICAxMiwgIC0xLCAgMjksICAgMSwgLTI5LAorICAgICAzMCwgLTMwLCAgIDUsICAtNSwgICAxLCAtMzEsICAtMSwgICAzLCAgMzEsICAtMSwgICAxLCAgIDEsICAtMywgLTEzLCAgIDEsICAtNywKKyAgICAgLTEsIC0zMiwgIDEzLCAgIDcsICAzMiwgIDMzLCAtMzMsICAtMSwgIC05LCAtMzQsICAgOSwgIDM0LCAgLTYsICAgNSwgICA2LCAgLTV9Cit9LHsKKyAgICAvKiBNYXBUYWI2ICovCisgICAgMiwgIC8qIGVvYl9zeW0gKi8KKyAgICAxMywgLyogZXNjX3N5bSAqLworICAgIC8qIHJ1biB0YWJsZSAqLworICAgIHsxLCAgMSwgIDAsICAxLCAgMSwgIDIsICAyLCAgMSwgIDEsICAzLCAgMywgIDEsICAxLCAgMCwgIDIsICAyLAorICAgICA0LCAgMSwgIDQsICAxLCAgMSwgIDEsICA1LCAgNSwgIDEsICAxLCAgNiwgIDYsICAyLCAgMiwgIDEsICAxLAorICAgICAzLCAgMywgIDcsICA3LCAgMSwgIDEsICA4LCAgOCwgIDEsICAxLCAgMiwgIDIsICAxLCAgOSwgIDEsICA5LAorICAgICA0LCAgNCwgMTAsICAxLCAgMSwgMTAsICAxLCAgMSwgMTEsIDExLCAgMywgIDMsICAxLCAgMiwgIDEsICAyLAorICAgICAxLCAgMSwgMTIsIDEyLCAgNSwgIDUsICAxLCAgMSwgMTMsICAxLCAgMSwgMTMsICAyLCAgMiwgIDEsICAxLAorICAgICA2LCAgNiwgIDEsICAxLCAgNCwgMTQsICA0LCAxNCwgIDMsICAxLCAgMywgIDEsICAxLCAgMSwgMTUsICA3LAorICAgIDE1LCAgMiwgIDIsICA3LCAgMSwgIDEsICAxLCAgOCwgIDEsICA4LCAxNiwgMTYsICAxLCAgMSwgIDEsICAxLAorICAgICAyLCAgMSwgIDEsICAyLCAgMSwgIDEsICAzLCAgNSwgIDUsICAzLCAgNCwgIDEsICAxLCAgNCwgIDEsICAxLAorICAgIDE3LCAxNywgIDksICAxLCAgMSwgIDksICAyLCAgMiwgIDEsICAxLCAxMCwgMTAsICAxLCAgNiwgIDEsICAxLAorICAgICA2LCAxOCwgIDEsICAxLCAxOCwgIDEsICAxLCAgMSwgIDIsICAyLCAgMywgIDEsICAzLCAgMSwgIDEsICAxLAorICAgICA0LCAgMSwgMTksICAxLCAxOSwgIDcsICAxLCAgMSwgMjAsICAxLCAgNCwgMjAsICAxLCAgNywgMTEsICAyLAorICAgICAxLCAxMSwgMjEsICAyLCAgOCwgIDUsICAxLCAgOCwgIDEsICA1LCAyMSwgIDEsICAxLCAgMSwgMjIsICAxLAorICAgICAxLCAyMiwgIDEsICAxLCAgMywgIDMsICAxLCAyMywgIDIsIDEyLCAyNCwgIDEsICAxLCAgMiwgIDEsICAxLAorICAgIDEyLCAyMywgIDEsICAxLCAyNCwgIDEsICAxLCAgMSwgIDQsICAxLCAgMSwgIDEsICAyLCAgMSwgIDYsICA2LAorICAgICA0LCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIDE0LCAxMywgIDMsICAxLCAyNSwgIDksIDI1LAorICAgIDE0LCAgMSwgIDksICAzLCAxMywgIDEsICAxLCAgMSwgIDEsICAxLCAxMCwgIDEsICAxLCAgMiwgMTAsICAyfSwKKworICAgIC8qIHZhbHVlIHRhYmxlICovCisgICAgey0yMCwgIC0xLCAgIDAsICAgMiwgIC0yLCAgIDEsICAtMSwgICAzLCAgLTMsICAgMSwgIC0xLCAgIDQsICAtNCwgICAwLCAgIDIsICAtMiwKKyAgICAgICAxLCAgIDUsICAtMSwgIC01LCAgIDYsICAtNiwgICAxLCAgLTEsICAgNywgIC03LCAgIDEsICAtMSwgICAzLCAgLTMsICAgOCwgIC04LAorICAgICAgIDIsICAtMiwgICAxLCAgLTEsICAgOSwgIC05LCAgIDEsICAtMSwgIDEwLCAtMTAsICAgNCwgIC00LCAgMTEsICAgMSwgLTExLCAgLTEsCisgICAgICAgMiwgIC0yLCAgIDEsICAxMiwgLTEyLCAgLTEsICAxMywgLTEzLCAgIDEsICAtMSwgICAzLCAgLTMsICAxNCwgICA1LCAtMTQsICAtNSwKKyAgICAgLTE1LCAgMTUsICAtMSwgICAxLCAgIDIsICAtMiwgIDE2LCAtMTYsICAgMSwgIDE3LCAtMTcsICAtMSwgICA2LCAgLTYsICAxOCwgLTE4LAorICAgICAgIDIsICAtMiwgLTE5LCAgMTksICAtMywgICAxLCAgIDMsICAtMSwgICA0LCAgMjAsICAtNCwgICAxLCAtMjEsICAyMSwgICAxLCAgIDIsCisgICAgICAtMSwgIC03LCAgIDcsICAtMiwgIDIyLCAtMjIsICAyMywgICAyLCAtMjMsICAtMiwgICAxLCAgLTEsIC0yNCwgIDI0LCAtMjUsICAyNSwKKyAgICAgIC04LCAtMjYsICAyNiwgICA4LCAtMjcsICAyNywgICA1LCAgIDMsICAtMywgIC01LCAgLTQsICAyOCwgLTI4LCAgIDQsICAyOSwgLTI5LAorICAgICAgIDEsICAtMSwgIC0yLCAtMzAsICAzMCwgICAyLCAgIDksICAtOSwgLTMxLCAgMzEsICAgMiwgIC0yLCAtMzIsICAgMywgIDMyLCAtMzMsCisgICAgICAtMywgICAxLCAgMzMsIC0zNCwgIC0xLCAgMzQsIC0zNSwgIDM1LCAtMTAsICAxMCwgIC02LCAgMzYsICAgNiwgLTM2LCAgMzcsIC0zNywKKyAgICAgIC01LCAgMzgsICAgMSwgLTM4LCAgLTEsICAgMywgIDM5LCAtMzksICAtMSwgIDQwLCAgIDUsICAgMSwgLTQwLCAgLTMsICAgMiwgLTExLAorICAgICAtNDEsICAtMiwgICAxLCAgMTEsICAtMywgIC00LCAgNDEsICAgMywgIDQyLCAgIDQsICAtMSwgLTQzLCAtNDIsICA0MywgICAxLCAtNDQsCisgICAgICA0NSwgIC0xLCAgNDQsIC00NSwgIC03LCAgIDcsIC00NiwgICAxLCAtMTIsICAgMiwgICAxLCAtNDcsICA0NiwgIDEyLCAgNDcsICA0OCwKKyAgICAgIC0yLCAgLTEsIC00OCwgIDQ5LCAgLTEsIC01MCwgLTQ5LCAgNTAsICAtNiwgLTUxLCAgNTEsICA1MiwgLTEzLCAgNTMsICAtNCwgICA0LAorICAgICAgIDYsICAxMywgLTUzLCAtNTIsIC01NCwgIDU1LCAgNTQsIC01NSwgLTU2LCAgLTIsICAgMiwgIC04LCAgNTYsICAgMSwgIC0zLCAgLTEsCisgICAgICAgMiwgIDU4LCAgIDMsICAgOCwgIC0yLCAgNTcsIC01OCwgLTYwLCAtNTksIC01NywgIC0zLCAgNjAsICA1OSwgLTE0LCAgIDMsICAxNH0KK30seworICAgIC8qIE1hcFRhYjcgKi8KKyAgICAyLCAgLyogZW9iX3N5bSAqLworICAgIDM4LCAvKiBlc2Nfc3ltICovCisgICAgLyogcnVuIHRhYmxlICovCisgICAgezEsICAxLCAgMCwgIDIsICAyLCAgMSwgIDEsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICAxLCAgMSwgIDYsCisgICAgIDYsICAyLCAgMiwgIDcsICA3LCAgOCwgIDgsICAxLCAgMSwgIDMsICAzLCAgOSwgIDksIDEwLCAxMCwgIDEsCisgICAgIDEsICAyLCAgMiwgIDQsICA0LCAxMSwgIDAsIDExLCAxMiwgMTIsIDEzLCAxMywgIDEsICAxLCAgNSwgIDUsCisgICAgMTQsIDE0LCAxNSwgMTYsIDE1LCAxNiwgIDMsICAzLCAgMSwgIDYsICAxLCAgNiwgIDIsICAyLCAgNywgIDcsCisgICAgIDgsICA4LCAxNywgMTcsICAxLCAgMSwgIDQsICA0LCAxOCwgMTgsICAyLCAgMiwgIDEsIDE5LCAgMSwgMjAsCisgICAgMTksIDIwLCAyMSwgMjEsICAzLCAgMywgMjIsIDIyLCAgNSwgIDUsIDI0LCAgMSwgIDEsIDIzLCAgOSwgMjMsCisgICAgMjQsICA5LCAgMiwgIDIsIDEwLCAgMSwgIDEsIDEwLCAgNiwgIDYsIDI1LCAgNCwgIDQsIDI1LCAgNywgIDcsCisgICAgMjYsICA4LCAgMSwgIDgsICAzLCAgMSwgMjYsICAzLCAxMSwgMTEsIDI3LCAyNywgIDIsIDI4LCAgMSwgIDIsCisgICAgMjgsICAxLCAxMiwgMTIsICA1LCAgNSwgMjksIDEzLCAxMywgMjksIDMyLCAgMSwgIDEsIDMzLCAzMSwgMzAsCisgICAgMzIsICA0LCAzMCwgMzMsICA0LCAzMSwgIDMsIDE0LCAgMSwgIDEsICAzLCAzNCwgMzQsICAyLCAgMiwgMTQsCisgICAgIDYsICA2LCAzNSwgMzYsIDM1LCAzNiwgIDEsIDE1LCAgMSwgMTYsIDE2LCAxNSwgIDcsICA5LCAgNywgIDksCisgICAgMzcsICA4LCAgOCwgMzcsICAxLCAgMSwgMzksICAyLCAzOCwgMzksICAyLCA0MCwgIDUsIDM4LCA0MCwgIDUsCisgICAgIDMsICAzLCAgNCwgIDQsIDEwLCAxMCwgIDEsICAxLCAgMSwgIDEsIDQxLCAgMiwgNDEsICAyLCAgNiwgIDYsCisgICAgIDEsICAxLCAxMSwgNDIsIDExLCA0MywgIDMsIDQyLCAgMywgMTcsICA0LCA0MywgIDEsIDE3LCAgNywgIDEsCisgICAgIDgsIDQ0LCAgNCwgIDcsIDQ0LCAgNSwgIDgsICAyLCAgNSwgIDEsICAyLCA0OCwgNDUsICAxLCAxMiwgNDUsCisgICAgMTIsIDQ4LCAxMywgMTMsICAxLCAgOSwgIDksIDQ2LCAgMSwgNDYsIDQ3LCA0NywgNDksIDE4LCAxOCwgNDl9LAorCisgICAgLyogdmFsdWUgdGFibGUgKi8KKyAgICB7IDEsICAtMSwgICAwLCAgIDEsICAtMSwgICAyLCAgLTIsICAgMSwgIC0xLCAgIDEsICAtMSwgICAxLCAgLTEsICAgMywgIC0zLCAgIDEsCisgICAgIC0xLCAgLTIsICAgMiwgICAxLCAgLTEsICAgMSwgIC0xLCAgIDQsICAtNCwgIC0yLCAgIDIsICAgMSwgIC0xLCAgIDEsICAtMSwgICA1LAorICAgICAtNSwgIC0zLCAgIDMsICAgMiwgIC0yLCAgIDEsICAgMCwgIC0xLCAgIDEsICAtMSwgICAxLCAgLTEsICAgNiwgIC02LCAgIDIsICAtMiwKKyAgICAgIDEsICAtMSwgICAxLCAgIDEsICAtMSwgIC0xLCAgLTMsICAgMywgICA3LCAgIDIsICAtNywgIC0yLCAgLTQsICAgNCwgICAyLCAgLTIsCisgICAgICAyLCAgLTIsICAgMSwgIC0xLCAgIDgsICAtOCwgICAzLCAgLTMsICAgMSwgIC0xLCAgLTUsICAgNSwgICA5LCAgIDEsICAtOSwgICAxLAorICAgICAtMSwgIC0xLCAgIDEsICAtMSwgIC00LCAgIDQsICAgMSwgIC0xLCAgIDMsICAtMywgICAxLCAtMTAsICAxMCwgICAxLCAgIDIsICAtMSwKKyAgICAgLTEsICAtMiwgICA2LCAgLTYsICAgMiwgIDExLCAtMTEsICAtMiwgICAzLCAgLTMsICAgMSwgIC00LCAgIDQsICAtMSwgICAzLCAgLTMsCisgICAgICAxLCAgIDMsICAxMiwgIC0zLCAgLTUsIC0xMiwgIC0xLCAgIDUsICAgMiwgIC0yLCAgIDEsICAtMSwgIC03LCAgIDEsICAxMywgICA3LAorICAgICAtMSwgLTEzLCAgIDIsICAtMiwgICA0LCAgLTQsICAgMSwgICAyLCAgLTIsICAtMSwgICAxLCAgMTQsIC0xNCwgICAxLCAgIDEsICAgMSwKKyAgICAgLTEsICAtNSwgIC0xLCAgLTEsICAgNSwgIC0xLCAgLTYsICAgMiwgLTE1LCAgMTUsICAgNiwgICAxLCAgLTEsICAtOCwgICA4LCAgLTIsCisgICAgIC00LCAgIDQsICAgMSwgICAxLCAgLTEsICAtMSwgIDE2LCAgIDIsIC0xNiwgIC0yLCAgIDIsICAtMiwgICA0LCAgIDMsICAtNCwgIC0zLAorICAgICAtMSwgIC00LCAgIDQsICAgMSwgLTE3LCAgMTcsICAtMSwgIC05LCAgIDEsICAgMSwgICA5LCAgIDEsICAtNSwgIC0xLCAgLTEsICAgNSwKKyAgICAgLTcsICAgNywgICA2LCAgLTYsICAgMywgIC0zLCAgMTgsIC0xOCwgIDE5LCAtMTksICAgMSwgLTEwLCAgLTEsICAxMCwgIC01LCAgIDUsCisgICAgIDIwLCAtMjAsICAtMywgICAxLCAgIDMsICAgMSwgICA4LCAgLTEsICAtOCwgICAyLCAgIDcsICAtMSwgLTIxLCAgLTIsICAgNSwgIDIxLAorICAgICAgNSwgIC0xLCAgLTcsICAtNSwgICAxLCAgLTYsICAtNSwgLTExLCAgIDYsICAyMiwgIDExLCAgIDEsICAgMSwgLTIyLCAgLTMsICAtMSwKKyAgICAgIDMsICAtMSwgICAzLCAgLTMsIC0yMywgICA0LCAgLTQsICAgMSwgIDIzLCAgLTEsICAgMSwgIC0xLCAgIDEsICAtMiwgICAyLCAgLTF9Cit9LHsKKyAgICAvKiBNYXBUYWI4ICovCisgICAgNCwgIC8qIGVvYl9zeW0gKi8KKyAgICAxMSwgLyogZXNjX3N5bSAqLworICAgIC8qIHJ1biB0YWJsZSAqLworICAgIHsxLCAgMSwgIDEsICAxLCAgMCwgIDIsICAyLCAgMSwgIDEsICAzLCAgMywgIDAsICAxLCAgMSwgIDIsICAyLAorICAgICA0LCAgNCwgIDEsICAxLCAgNSwgIDUsICAxLCAgMSwgIDIsICAyLCAgMywgIDMsICA2LCAgNiwgIDEsICAxLAorICAgICA3LCAgNywgIDgsICAxLCAgOCwgIDIsICAyLCAgMSwgIDQsICA0LCAgMSwgIDMsICAxLCAgMywgIDksICA5LAorICAgICAyLCAgMiwgIDEsICA1LCAgMSwgIDUsIDEwLCAxMCwgIDEsICAxLCAxMSwgMTEsICAzLCAgNiwgIDMsICA0LAorICAgICA0LCAgNiwgIDIsICAyLCAgMSwgMTIsICAxLCAxMiwgIDcsIDEzLCAgNywgMTMsICAxLCAgMSwgIDgsICA4LAorICAgICAyLCAgMiwgMTQsIDE0LCAxNiwgMTUsIDE2LCAgNSwgIDUsICAxLCAgMywgMTUsICAxLCAgMywgIDQsICA0LAorICAgICAxLCAgMSwgMTcsIDE3LCAgMiwgIDIsICA2LCAgNiwgIDEsIDE4LCAgMSwgMTgsIDIyLCAyMSwgMjIsIDIxLAorICAgIDI1LCAyNCwgMjUsIDE5LCAgOSwgMjAsICA5LCAyMywgMTksIDI0LCAyMCwgIDMsIDIzLCAgNywgIDMsICAxLAorICAgICAxLCAgNywgMjgsIDI2LCAyOSwgIDUsIDI4LCAyNiwgIDUsICA4LCAyOSwgIDQsICA4LCAyNywgIDIsICAyLAorICAgICA0LCAyNywgIDEsICAxLCAxMCwgMzYsIDEwLCAzMywgMzMsIDM2LCAzMCwgIDEsIDMyLCAzMiwgIDEsIDMwLAorICAgICA2LCAzMSwgMzEsIDM1LCAgMywgIDYsIDExLCAxMSwgIDMsICAyLCAzNSwgIDIsIDM0LCAgMSwgMzQsICAxLAorICAgIDM3LCAzNywgMTIsICA3LCAxMiwgIDUsIDQxLCAgNSwgIDQsICA3LCAgMSwgIDgsIDEzLCAgNCwgIDEsIDQxLAorICAgIDEzLCAzOCwgIDgsIDM4LCAgOSwgIDEsIDQwLCA0MCwgIDksICAxLCAzOSwgIDIsICAyLCA0OSwgMzksIDQyLAorICAgICAzLCAgMywgMTQsIDE2LCA0OSwgMTQsIDE2LCA0MiwgNDMsIDQzLCAgNiwgIDYsIDE1LCAgMSwgIDEsIDE1LAorICAgIDQ0LCA0NCwgIDEsICAxLCA1MCwgNDgsICA0LCAgNSwgIDQsICA3LCAgNSwgIDIsIDEwLCAxMCwgNDgsICA3LAorICAgIDUwLCA0NSwgIDIsICAxLCA0NSwgIDgsICA4LCAgMSwgNDYsIDQ2LCAgMywgNDcsIDQ3LCAgMywgIDEsICAxfSwKKworICAgIC8qIHZhbHVlIHRhYmxlICovCisgICAgeyAxLCAgLTEsICAgMiwgIC0yLCAgIDAsICAgMSwgIC0xLCAgIDMsICAtMywgICAxLCAgLTEsICAgMCwgICA0LCAgLTQsICAgMiwgIC0yLAorICAgICAgMSwgIC0xLCAgIDUsICAtNSwgICAxLCAgLTEsICAgNiwgIC02LCAgIDMsICAtMywgICAyLCAgLTIsICAgMSwgIC0xLCAgIDcsICAtNywKKyAgICAgIDEsICAtMSwgICAxLCAgIDgsICAtMSwgICA0LCAgLTQsICAtOCwgICAyLCAgLTIsICAgOSwgICAzLCAgLTksICAtMywgICAxLCAgLTEsCisgICAgICA1LCAgLTUsICAxMCwgICAyLCAtMTAsICAtMiwgICAxLCAgLTEsICAxMSwgLTExLCAgIDEsICAtMSwgIC00LCAgIDIsICAgNCwgICAzLAorICAgICAtMywgIC0yLCAgIDYsICAtNiwgIDEyLCAgIDEsIC0xMiwgIC0xLCAgIDIsICAgMSwgIC0yLCAgLTEsICAxMywgLTEzLCAgIDIsICAtMiwKKyAgICAgIDcsICAtNywgICAxLCAgLTEsICAgMSwgICAxLCAgLTEsICAgMywgIC0zLCAgMTQsICAgNSwgIC0xLCAtMTQsICAtNSwgICA0LCAgLTQsCisgICAgIDE1LCAtMTUsICAgMSwgIC0xLCAgIDgsICAtOCwgIC0zLCAgIDMsICAxNiwgICAxLCAtMTYsICAtMSwgICAxLCAgIDEsICAtMSwgIC0xLAorICAgICAgMSwgICAxLCAgLTEsICAgMSwgICAyLCAgIDEsICAtMiwgICAxLCAgLTEsICAtMSwgIC0xLCAgIDYsICAtMSwgICAzLCAgLTYsICAxNywKKyAgICAtMTcsICAtMywgICAxLCAgIDEsICAgMSwgICA0LCAgLTEsICAtMSwgIC00LCAgIDMsICAtMSwgICA1LCAgLTMsICAtMSwgIC05LCAgIDksCisgICAgIC01LCAgIDEsICAxOCwgLTE4LCAgIDIsICAgMSwgIC0yLCAgIDEsICAtMSwgIC0xLCAgIDEsICAxOSwgIC0xLCAgIDEsIC0xOSwgIC0xLAorICAgICAgNCwgICAxLCAgLTEsICAgMSwgICA3LCAgLTQsICAtMiwgICAyLCAgLTcsICAxMCwgIC0xLCAtMTAsICAgMSwgIDIwLCAgLTEsIC0yMCwKKyAgICAgIDEsICAtMSwgICAyLCAgIDQsICAtMiwgICA1LCAgIDEsICAtNSwgICA2LCAgLTQsICAyMSwgICA0LCAgIDIsICAtNiwgLTIxLCAgLTEsCisgICAgIC0yLCAgIDEsICAtNCwgIC0xLCAgLTMsICAyMiwgIC0xLCAgIDEsICAgMywgLTIyLCAgLTEsICAxMSwgLTExLCAgIDEsICAgMSwgICAxLAorICAgICAgOCwgIC04LCAgIDIsICAgMiwgIC0xLCAgLTIsICAtMiwgIC0xLCAgIDEsICAtMSwgIC01LCAgIDUsICAgMiwgIDIzLCAtMjMsICAtMiwKKyAgICAgIDEsICAtMSwgIDI0LCAtMjQsICAtMSwgIC0xLCAgIDcsICAgNiwgIC03LCAgIDUsICAtNiwgIDEyLCAgLTMsICAgMywgICAxLCAgLTUsCisgICAgICAxLCAgIDEsIC0xMiwgIDI1LCAgLTEsICAtNSwgICA1LCAtMjUsICAtMSwgICAxLCAgIDksICAgMSwgIC0xLCAgLTksICAyNiwgLTI2fQorfQorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2l2aV9jb21tb24uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2l2aV9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmVjOTYwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaXZpX2NvbW1vbi5oCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogY29tbW9uIGZ1bmN0aW9ucyBmb3IgSW5kZW8gVmlkZW8gSW50ZXJhY3RpdmUgY29kZWNzIChJbmRlbzQgYW5kIEluZGVvNSkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWF4aW0gUG9saWFrb3Zza2kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVGhpcyBmaWxlIGNvbnRhaW5zIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyBzaGFyZWQgYnkgYm90aCBJbmRlbzQgYW5kCisgKiBJbmRlbzUgZGVjb2RlcnMuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0lWSV9DT01NT05fSAorI2RlZmluZSBBVkNPREVDX0lWSV9DT01NT05fSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKgorICogIEluZGVvIDQgZnJhbWUgdHlwZXMuCisgKi8KK2VudW0geworICAgIElWSTRfRlJBTUVUWVBFX0lOVFJBICAgICAgID0gMCwKKyAgICBJVkk0X0ZSQU1FVFlQRV9JTlRSQTEgICAgICA9IDEsICAvLy88IGludHJhIGZyYW1lIHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IGJpdHN0cmVhbSBjb2RpbmcKKyAgICBJVkk0X0ZSQU1FVFlQRV9JTlRFUiAgICAgICA9IDIsICAvLy88IG5vbi1kcm9wcGFibGUgUC1mcmFtZQorICAgIElWSTRfRlJBTUVUWVBFX0JJRElSICAgICAgID0gMywgIC8vLzwgYmlkaXJlY3Rpb25hbCBmcmFtZQorICAgIElWSTRfRlJBTUVUWVBFX0lOVEVSX05PUkVGID0gNCwgIC8vLzwgZHJvcHBhYmxlIFAtZnJhbWUKKyAgICBJVkk0X0ZSQU1FVFlQRV9OVUxMX0ZJUlNUICA9IDUsICAvLy88IGVtcHR5IGZyYW1lIHdpdGggbm8gZGF0YQorICAgIElWSTRfRlJBTUVUWVBFX05VTExfTEFTVCAgID0gNiAgIC8vLzwgZW1wdHkgZnJhbWUgd2l0aCBubyBkYXRhCit9OworCisjZGVmaW5lIElWSV9WTENfQklUUyAxMyAvLy88IG1heCBudW1iZXIgb2YgYml0cyBvZiB0aGUgaXZpJ3MgaHVmZm1hbiBjb2RlcworI2RlZmluZSBJVkk0X1NUUkVBTV9BTkFMWVNFUiAgICAwCisjZGVmaW5lIElWSTVfSVNfUFJPVEVDVEVEICAgICAgIDB4MjAKKworLyoqCisgKiAgaHVmZm1hbiBjb2RlYm9vayBkZXNjcmlwdG9yCisgKi8KK3R5cGVkZWYgc3RydWN0IElWSUh1ZmZEZXNjIHsKKyAgICBpbnQzMl90ICAgICBudW1fcm93czsKKyAgICB1aW50OF90ICAgICB4Yml0c1sxNl07Cit9IElWSUh1ZmZEZXNjOworCisvKioKKyAqICBtYWNyb2Jsb2NrL2Jsb2NrIGh1ZmZtYW4gdGFibGUgZGVzY3JpcHRvcgorICovCit0eXBlZGVmIHN0cnVjdCBJVklIdWZmVGFiIHsKKyAgICBpbnQzMl90ICAgICB0YWJfc2VsOyAgICAvLy8gaW5kZXggb2Ygb25lIG9mIHRoZSBwcmVkZWZpbmVkIHRhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBvciAiNyIgZm9yIGN1c3RvbSBvbmUKKyAgICBWTEMgICAgICAgICAqdGFiOyAgICAgICAvLy8gcG9pbnRlciB0byB0aGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRhYl9zZWwKKworICAgIC8vLyB0aGUgZm9sbG93aW5nIGFyZSB1c2VkIG9ubHkgd2hlbiB0YWJfc2VsID09IDcKKyAgICBJVklIdWZmRGVzYyBjdXN0X2Rlc2M7ICAvLy8gY3VzdG9tIEh1ZmZtYW4gY29kZWJvb2sgZGVzY3JpcHRvcgorICAgIFZMQyAgICAgICAgIGN1c3RfdGFiOyAgIC8vLyB2bGMgdGFibGUgZm9yIGN1c3RvbSBjb2RlYm9vaworfSBJVklIdWZmVGFiOworCitlbnVtIHsKKyAgICBJVklfTUJfSFVGRiAgID0gMCwgICAgICAvLy8gSHVmZm1hbiB0YWJsZSBpcyB1c2VkIGZvciBjb2RpbmcgbWFjcm9ibG9ja3MKKyAgICBJVklfQkxLX0hVRkYgID0gMSAgICAgICAvLy8gSHVmZm1hbiB0YWJsZSBpcyB1c2VkIGZvciBjb2RpbmcgYmxvY2tzCit9OworCisKKy8qKgorICogIENvbW1vbiBzY2FuIHBhdHRlcm5zIChkZWZpbmVkIGluIGl2aV9jb21tb24uYykKKyAqLworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaXZpX3ZlcnRpY2FsX3NjYW5fOHg4WzY0XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2l2aV9ob3Jpem9udGFsX3NjYW5fOHg4WzY0XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2l2aV9kaXJlY3Rfc2Nhbl80eDRbMTZdOworCisKKy8qKgorICogIERlY2xhcmUgaW52ZXJzZSB0cmFuc2Zvcm0gZnVuY3Rpb24gdHlwZXMKKyAqLwordHlwZWRlZiB2b2lkIChJbnZUcmFuc2Zvcm1QdHIpKGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBjb25zdCB1aW50OF90ICpmbGFncyk7Cit0eXBlZGVmIHZvaWQgKERDVHJhbnNmb3JtUHRyKSAoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsIGludCBibGtfc2l6ZSk7CisKKworLyoqCisgKiAgcnVuLXZhbHVlIChSTEUpIHRhYmxlIGRlc2NyaXB0b3IKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUlZNYXBEZXNjIHsKKyAgICB1aW50OF90ICAgICBlb2Jfc3ltOyAvLy88IGVuZCBvZiBibG9jayBzeW1ib2wKKyAgICB1aW50OF90ICAgICBlc2Nfc3ltOyAvLy88IGVzY2FwZSBzeW1ib2wKKyAgICB1aW50OF90ICAgICBydW50YWJbMjU2XTsKKyAgICBpbnQ4X3QgICAgICB2YWx0YWJbMjU2XTsKK30gUlZNYXBEZXNjOworCitleHRlcm4gY29uc3QgUlZNYXBEZXNjIGZmX2l2aV9ydm1hcF90YWJzWzldOworCisKKy8qKgorICogIGluZm9ybWF0aW9uIGZvciBJbmRlbyBtYWNyb2Jsb2NrICgxNngxNiwgOHg4IG9yIDR4NCkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgSVZJTWJJbmZvIHsKKyAgICBpbnQxNl90ICAgICB4cG9zOworICAgIGludDE2X3QgICAgIHlwb3M7CisgICAgdWludDMyX3QgICAgYnVmX29mZnM7IC8vLzwgYWRkcmVzcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhpcyBtYgorICAgIHVpbnQ4X3QgICAgIHR5cGU7ICAgICAvLy88IG1hY3JvYmxvY2sgdHlwZTogMCAtIElOVFJBLCAxIC0gSU5URVIKKyAgICB1aW50OF90ICAgICBjYnA7ICAgICAgLy8vPCBjb2RlZCBibG9jayBwYXR0ZXJuCisgICAgaW50OF90ICAgICAgcV9kZWx0YTsgIC8vLzwgcXVhbnQgZGVsdGEKKyAgICBpbnQ4X3QgICAgICBtdl94OyAgICAgLy8vPCBtb3Rpb24gdmVjdG9yICh4IGNvbXBvbmVudCkKKyAgICBpbnQ4X3QgICAgICBtdl95OyAgICAgLy8vPCBtb3Rpb24gdmVjdG9yICh5IGNvbXBvbmVudCkKKyAgICBpbnQ4X3QgICAgICBiX212X3g7ICAgLy8vPCBzZWNvbmQgbW90aW9uIHZlY3RvciAoeCBjb21wb25lbnQpCisgICAgaW50OF90ICAgICAgYl9tdl95OyAgIC8vLzwgc2Vjb25kIG1vdGlvbiB2ZWN0b3IgKHkgY29tcG9uZW50KQorfSBJVklNYkluZm87CisKKworLyoqCisgKiAgaW5mb3JtYXRpb24gZm9yIEluZGVvIHRpbGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgSVZJVGlsZSB7CisgICAgaW50ICAgICAgICAgeHBvczsKKyAgICBpbnQgICAgICAgICB5cG9zOworICAgIGludCAgICAgICAgIHdpZHRoOworICAgIGludCAgICAgICAgIGhlaWdodDsKKyAgICBpbnQgICAgICAgICBtYl9zaXplOworICAgIGludCAgICAgICAgIGlzX2VtcHR5OyAgLy8vPCA9IDEgaWYgdGhpcyB0aWxlIGRvZXNuJ3QgY29udGFpbiBhbnkgZGF0YQorICAgIGludCAgICAgICAgIGRhdGFfc2l6ZTsgLy8vPCBzaXplIG9mIHRoZSBkYXRhIGluIGJ5dGVzCisgICAgaW50ICAgICAgICAgbnVtX01CczsgICAvLy88IG51bWJlciBvZiBtYWNyb2Jsb2NrcyBpbiB0aGlzIHRpbGUKKyAgICBJVklNYkluZm8gICAqbWJzOyAgICAgIC8vLzwgYXJyYXkgb2YgbWFjcm9ibG9jayBkZXNjcmlwdG9ycworICAgIElWSU1iSW5mbyAgICpyZWZfbWJzOyAgLy8vPCBwdHIgdG8gdGhlIG1hY3JvYmxvY2sgZGVzY3JpcHRvcnMgb2YgdGhlIHJlZmVyZW5jZSB0aWxlCit9IElWSVRpbGU7CisKKworLyoqCisgKiAgaW5mb3JtYXRpb24gZm9yIEluZGVvIHdhdmVsZXQgYmFuZAorICovCit0eXBlZGVmIHN0cnVjdCBJVklCYW5kRGVzYyB7CisgICAgaW50ICAgICAgICAgICAgIHBsYW5lOyAgICAgICAgICAvLy88IHBsYW5lIG51bWJlciB0aGlzIGJhbmQgYmVsb25ncyB0bworICAgIGludCAgICAgICAgICAgICBiYW5kX251bTsgICAgICAgLy8vPCBiYW5kIG51bWJlcgorICAgIGludCAgICAgICAgICAgICB3aWR0aDsKKyAgICBpbnQgICAgICAgICAgICAgaGVpZ2h0OworICAgIGludCAgICAgICAgICAgICBhaGVpZ2h0OyAgICAgICAgLy8vPCBhbGlnbmVkIGJhbmQgaGVpZ2h0CisgICAgY29uc3QgdWludDhfdCAgICpkYXRhX3B0cjsgICAgICAvLy88IHB0ciB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYmFuZCBkYXRhCisgICAgaW50ICAgICAgICAgICAgIGRhdGFfc2l6ZTsgICAgICAvLy88IHNpemUgb2YgdGhlIGJhbmQgZGF0YQorICAgIGludDE2X3QgICAgICAgICAqYnVmOyAgICAgICAgICAgLy8vPCBwb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGZvciB0aGlzIGJhbmQKKyAgICBpbnQxNl90ICAgICAgICAgKnJlZl9idWY7ICAgICAgIC8vLzwgcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAoZm9yIG1vdGlvbiBjb21wZW5zYXRpb24pCisgICAgaW50MTZfdCAgICAgICAgICpiX3JlZl9idWY7ICAgICAvLy88IHBvaW50ZXIgdG8gdGhlIHNlY29uZCByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIChmb3IgbW90aW9uIGNvbXBlbnNhdGlvbikKKyAgICBpbnQxNl90ICAgICAgICAgKmJ1ZnNbNF07ICAgICAgIC8vLzwgYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIGJhbmQgYnVmZmVycworICAgIGludCAgICAgICAgICAgICBwaXRjaDsgICAgICAgICAgLy8vPCBwaXRjaCBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlcnMgYWJvdmUKKyAgICBpbnQgICAgICAgICAgICAgaXNfZW1wdHk7ICAgICAgIC8vLzwgPSAxIGlmIHRoaXMgYmFuZCBkb2Vzbid0IGNvbnRhaW4gYW55IGRhdGEKKyAgICBpbnQgICAgICAgICAgICAgbWJfc2l6ZTsgICAgICAgIC8vLzwgbWFjcm9ibG9jayBzaXplCisgICAgaW50ICAgICAgICAgICAgIGJsa19zaXplOyAgICAgICAvLy88IGJsb2NrIHNpemUKKyAgICBpbnQgICAgICAgICAgICAgaXNfaGFsZnBlbDsgICAgIC8vLzwgcHJlY2lzaW9uIG9mIHRoZSBtb3Rpb24gY29tcGVuc2F0aW9uOiAwIC0gZnVsbHBlbCwgMSAtIGhhbGZwZWwKKyAgICBpbnQgICAgICAgICAgICAgaW5oZXJpdF9tdjsgICAgIC8vLzwgdGVsbHMgaWYgbW90aW9uIHZlY3RvciBpcyBpbmhlcml0ZWQgZnJvbSByZWZlcmVuY2UgbWFjcm9ibG9jaworICAgIGludCAgICAgICAgICAgICBpbmhlcml0X3FkZWx0YTsgLy8vPCB0ZWxscyBpZiBxdWFudGlzZXIgZGVsdGEgaXMgaW5oZXJpdGVkIGZyb20gcmVmZXJlbmNlIG1hY3JvYmxvY2sKKyAgICBpbnQgICAgICAgICAgICAgcWRlbHRhX3ByZXNlbnQ7IC8vLzwgdGVsbHMgaWYgUWRlbHRhIHNpZ25hbCBpcyBwcmVzZW50IGluIHRoZSBiaXRzdHJlYW0gKEluZGVvNSBvbmx5KQorICAgIGludCAgICAgICAgICAgICBxdWFudF9tYXQ7ICAgICAgLy8vPCBkZXF1YW50IG1hdHJpeCBpbmRleAorICAgIGludCAgICAgICAgICAgICBnbG9iX3F1YW50OyAgICAgLy8vPCBxdWFudCBiYXNlIGZvciB0aGlzIGJhbmQKKyAgICBjb25zdCB1aW50OF90ICAgKnNjYW47ICAgICAgICAgIC8vLzwgcHRyIHRvIHRoZSBzY2FuIHBhdHRlcm4KKyAgICBpbnQgICAgICAgICAgICAgc2Nhbl9zaXplOyAgICAgIC8vLzwgc2l6ZSBvZiB0aGUgc2NhbnRhYmxlCisKKyAgICBJVklIdWZmVGFiICAgICAgYmxrX3ZsYzsgICAgICAgIC8vLzwgdmxjIHRhYmxlIGZvciBkZWNvZGluZyBibG9jayBkYXRhCisKKyAgICBpbnQgICAgICAgICAgICAgbnVtX2NvcnI7ICAgICAgIC8vLzwgbnVtYmVyIG9mIGNvcnJlY3Rpb24gZW50cmllcworICAgIHVpbnQ4X3QgICAgICAgICBjb3JyWzYxKjJdOyAgICAgLy8vPCBydm1hcCBjb3JyZWN0aW9uIHBhaXJzCisgICAgaW50ICAgICAgICAgICAgIHJ2bWFwX3NlbDsgICAgICAvLy88IHJ2bWFwIHRhYmxlIHNlbGVjdG9yCisgICAgUlZNYXBEZXNjICAgICAgICpydl9tYXA7ICAgICAgICAvLy88IHB0ciB0byB0aGUgUkxFIHRhYmxlIGZvciB0aGlzIGJhbmQKKyAgICBpbnQgICAgICAgICAgICAgbnVtX3RpbGVzOyAgICAgIC8vLzwgbnVtYmVyIG9mIHRpbGVzIGluIHRoaXMgYmFuZAorICAgIElWSVRpbGUgICAgICAgICAqdGlsZXM7ICAgICAgICAgLy8vPCBhcnJheSBvZiB0aWxlIGRlc2NyaXB0b3JzCisgICAgSW52VHJhbnNmb3JtUHRyICppbnZfdHJhbnNmb3JtOworICAgIGludCAgICAgICAgICAgICB0cmFuc2Zvcm1fc2l6ZTsKKyAgICBEQ1RyYW5zZm9ybVB0ciAgKmRjX3RyYW5zZm9ybTsKKyAgICBpbnQgICAgICAgICAgICAgaXNfMmRfdHJhbnM7ICAgIC8vLzwgMSBpbmRpY2F0ZXMgdGhhdCB0aGUgdHdvLWRpbWVuc2lvbmFsIGludmVyc2UgdHJhbnNmb3JtIGlzIHVzZWQKKyAgICBpbnQzMl90ICAgICAgICAgY2hlY2tzdW07ICAgICAgIC8vLzwgZm9yIGRlYnVnIHB1cnBvc2VzCisgICAgaW50ICAgICAgICAgICAgIGNoZWNrc3VtX3ByZXNlbnQ7CisgICAgaW50ICAgICAgICAgICAgIGJ1ZnNpemU7ICAgICAgICAvLy88IGJhbmQgYnVmZmVyIHNpemUgaW4gYnl0ZXMKKyAgICBjb25zdCB1aW50MTZfdCAgKmludHJhX2Jhc2U7ICAgIC8vLzwgcXVhbnRpemF0aW9uIG1hdHJpeCBmb3IgaW50cmEgYmxvY2tzCisgICAgY29uc3QgdWludDE2X3QgICppbnRlcl9iYXNlOyAgICAvLy88IHF1YW50aXphdGlvbiBtYXRyaXggZm9yIGludGVyIGJsb2NrcworICAgIGNvbnN0IHVpbnQ4X3QgICAqaW50cmFfc2NhbGU7ICAgLy8vPCBxdWFudGl6YXRpb24gY29lZmZpY2llbnQgZm9yIGludHJhIGJsb2NrcworICAgIGNvbnN0IHVpbnQ4X3QgICAqaW50ZXJfc2NhbGU7ICAgLy8vPCBxdWFudGl6YXRpb24gY29lZmZpY2llbnQgZm9yIGludGVyIGJsb2NrcworfSBJVklCYW5kRGVzYzsKKworCisvKioKKyAqICBjb2xvciBwbGFuZSAobHVtYSBvciBjaHJvbWEpIGluZm9ybWF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IElWSVBsYW5lRGVzYyB7CisgICAgdWludDE2X3QgICAgd2lkdGg7CisgICAgdWludDE2X3QgICAgaGVpZ2h0OworICAgIHVpbnQ4X3QgICAgIG51bV9iYW5kczsgIC8vLzwgbnVtYmVyIG9mIGJhbmRzIHRoaXMgcGxhbmUgc3ViZGl2aWRlZCBpbnRvCisgICAgSVZJQmFuZERlc2MgKmJhbmRzOyAgICAgLy8vPCBhcnJheSBvZiBiYW5kIGRlc2NyaXB0b3JzCit9IElWSVBsYW5lRGVzYzsKKworCit0eXBlZGVmIHN0cnVjdCBJVklQaWNDb25maWcgeworICAgIHVpbnQxNl90ICAgIHBpY193aWR0aDsKKyAgICB1aW50MTZfdCAgICBwaWNfaGVpZ2h0OworICAgIHVpbnQxNl90ICAgIGNocm9tYV93aWR0aDsKKyAgICB1aW50MTZfdCAgICBjaHJvbWFfaGVpZ2h0OworICAgIHVpbnQxNl90ICAgIHRpbGVfd2lkdGg7CisgICAgdWludDE2X3QgICAgdGlsZV9oZWlnaHQ7CisgICAgdWludDhfdCAgICAgbHVtYV9iYW5kczsKKyAgICB1aW50OF90ICAgICBjaHJvbWFfYmFuZHM7Cit9IElWSVBpY0NvbmZpZzsKKwordHlwZWRlZiBzdHJ1Y3QgSVZJNDVEZWNDb250ZXh0IHsKKyAgICBHZXRCaXRDb250ZXh0ICAgZ2I7CisgICAgUlZNYXBEZXNjICAgICAgIHJ2bWFwX3RhYnNbOV07ICAgLy8vPCBsb2NhbCBjb3JyZWN0ZWQgY29weSBvZiB0aGUgc3RhdGljIHJ2bWFwIHRhYmxlcworCisgICAgdWludDMyX3QgICAgICAgIGZyYW1lX251bTsKKyAgICBpbnQgICAgICAgICAgICAgZnJhbWVfdHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgcHJldl9mcmFtZV90eXBlOyAvLy88IGZyYW1lIHR5cGUgb2YgdGhlIHByZXZpb3VzIGZyYW1lCisgICAgdWludDMyX3QgICAgICAgIGRhdGFfc2l6ZTsgICAgICAgLy8vPCBzaXplIG9mIHRoZSBmcmFtZSBkYXRhIGluIGJ5dGVzIGZyb20gcGljdHVyZSBoZWFkZXIKKyAgICBpbnQgICAgICAgICAgICAgaXNfc2NhbGFibGU7CisgICAgaW50ICAgICAgICAgICAgIHRyYW5zcF9zdGF0dXM7ICAgLy8vPCB0cmFuc3BhcmVuY3kgbW9kZSBzdGF0dXM6IDEgLSBlbmFibGVkCisgICAgY29uc3QgdWludDhfdCAgICpmcmFtZV9kYXRhOyAgICAgLy8vPCBpbnB1dCBmcmFtZSBkYXRhIHBvaW50ZXIKKyAgICBpbnQgICAgICAgICAgICAgaW50ZXJfc2NhbDsgICAgICAvLy88IHNpZ25hbHMgYSBzZXF1ZW5jZSBvZiBzY2FsYWJsZSBpbnRlciBmcmFtZXMKKyAgICB1aW50MzJfdCAgICAgICAgZnJhbWVfc2l6ZTsgICAgICAvLy88IGZyYW1lIHNpemUgaW4gYnl0ZXMKKyAgICB1aW50MzJfdCAgICAgICAgcGljX2hkcl9zaXplOyAgICAvLy88IHBpY3R1cmUgaGVhZGVyIHNpemUgaW4gYnl0ZXMKKyAgICB1aW50OF90ICAgICAgICAgZnJhbWVfZmxhZ3M7CisgICAgdWludDE2X3QgICAgICAgIGNoZWNrc3VtOyAgICAgICAgLy8vPCBmcmFtZSBjaGVja3N1bQorCisgICAgSVZJUGljQ29uZmlnICAgIHBpY19jb25mOworICAgIElWSVBsYW5lRGVzYyAgICBwbGFuZXNbM107ICAgICAgIC8vLzwgY29sb3IgcGxhbmVzCisKKyAgICBpbnQgICAgICAgICAgICAgYnVmX3N3aXRjaDsgICAgICAvLy88IHVzZWQgdG8gc3dpdGNoIGJldHdlZW4gdGhyZWUgYnVmZmVycworICAgIGludCAgICAgICAgICAgICBkc3RfYnVmOyAgICAgICAgIC8vLzwgYnVmZmVyIGluZGV4IGZvciB0aGUgY3VycmVudGx5IGRlY29kZWQgZnJhbWUKKyAgICBpbnQgICAgICAgICAgICAgcmVmX2J1ZjsgICAgICAgICAvLy88IGludGVyIGZyYW1lIHJlZmVyZW5jZSBidWZmZXIgaW5kZXgKKyAgICBpbnQgICAgICAgICAgICAgcmVmMl9idWY7ICAgICAgICAvLy88IHRlbXBvcmFsIHN0b3JhZ2UgZm9yIHN3aXRjaGluZyBidWZmZXJzCisgICAgaW50ICAgICAgICAgICAgIGJfcmVmX2J1ZjsgICAgICAgLy8vPCBzZWNvbmQgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciBpbmRleAorCisgICAgSVZJSHVmZlRhYiAgICAgIG1iX3ZsYzsgICAgICAgICAgLy8vPCBjdXJyZW50IG1hY3JvYmxvY2sgdGFibGUgZGVzY3JpcHRvcgorICAgIElWSUh1ZmZUYWIgICAgICBibGtfdmxjOyAgICAgICAgIC8vLzwgY3VycmVudCBibG9jayB0YWJsZSBkZXNjcmlwdG9yCisKKyAgICB1aW50OF90ICAgICAgICAgcnZtYXBfc2VsOworICAgIHVpbnQ4X3QgICAgICAgICBpbl9pbWY7CisgICAgdWludDhfdCAgICAgICAgIGluX3E7ICAgICAgICAgICAgLy8vPCBmbGFnIGZvciBleHBsaWNpdGx5IHN0b3JlZCBxdWFudGlzZXIgZGVsdGEKKyAgICB1aW50OF90ICAgICAgICAgcGljX2dsb2JfcXVhbnQ7CisgICAgdWludDhfdCAgICAgICAgIHVua25vd24xOworCisgICAgdWludDE2X3QgICAgICAgIGdvcF9oZHJfc2l6ZTsKKyAgICB1aW50OF90ICAgICAgICAgZ29wX2ZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICBsb2NrX3dvcmQ7CisKKyNpZiBJVkk0X1NUUkVBTV9BTkFMWVNFUgorICAgIHVpbnQ4X3QgICAgICAgICBoYXNfYl9mcmFtZXM7CisgICAgdWludDhfdCAgICAgICAgIGhhc190cmFuc3A7CisgICAgdWludDhfdCAgICAgICAgIHVzZXNfdGlsaW5nOworICAgIHVpbnQ4X3QgICAgICAgICB1c2VzX2hhYXI7CisgICAgdWludDhfdCAgICAgICAgIHVzZXNfZnVsbHBlbDsKKyNlbmRpZgorCisgICAgaW50ICAgICAgICAgICAgICgqZGVjb2RlX3BpY19oZHIpICAoc3RydWN0IElWSTQ1RGVjQ29udGV4dCAqY3R4LCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworICAgIGludCAgICAgICAgICAgICAoKmRlY29kZV9iYW5kX2hkcikgKHN0cnVjdCBJVkk0NURlY0NvbnRleHQgKmN0eCwgSVZJQmFuZERlc2MgKmJhbmQsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisgICAgaW50ICAgICAgICAgICAgICgqZGVjb2RlX21iX2luZm8pICAoc3RydWN0IElWSTQ1RGVjQ29udGV4dCAqY3R4LCBJVklCYW5kRGVzYyAqYmFuZCwgSVZJVGlsZSAqdGlsZSwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKyAgICB2b2lkICAgICAgICAgICAgKCpzd2l0Y2hfYnVmZmVycykgIChzdHJ1Y3QgSVZJNDVEZWNDb250ZXh0ICpjdHgpOworICAgIGludCAgICAgICAgICAgICAoKmlzX25vbm51bGxfZnJhbWUpKHN0cnVjdCBJVkk0NURlY0NvbnRleHQgKmN0eCk7CisKKyAgICBpbnQgZ29wX2ludmFsaWQ7CisgICAgaW50IGJ1Zl9pbnZhbGlkWzRdOworCisgICAgaW50IGlzX2luZGVvNDsKKworICAgIEFWRnJhbWUgICAgICAgICAqcF9mcmFtZTsKKyAgICBpbnQgICAgICAgICAgICAgZ290X3BfZnJhbWU7Cit9IElWSTQ1RGVjQ29udGV4dDsKKworLyoqIGNvbXBhcmUgc29tZSBwcm9wZXJ0aWVzIG9mIHR3byBwaWN0dXJlcyAqLworc3RhdGljIGlubGluZSBpbnQgaXZpX3BpY19jb25maWdfY21wKElWSVBpY0NvbmZpZyAqc3RyMSwgSVZJUGljQ29uZmlnICpzdHIyKQoreworICAgIHJldHVybiBzdHIxLT5waWNfd2lkdGggICAgIT0gc3RyMi0+cGljX3dpZHRoICAgIHx8IHN0cjEtPnBpY19oZWlnaHQgICAgIT0gc3RyMi0+cGljX2hlaWdodCAgICB8fAorICAgICAgICAgICBzdHIxLT5jaHJvbWFfd2lkdGggIT0gc3RyMi0+Y2hyb21hX3dpZHRoIHx8IHN0cjEtPmNocm9tYV9oZWlnaHQgIT0gc3RyMi0+Y2hyb21hX2hlaWdodCB8fAorICAgICAgICAgICBzdHIxLT50aWxlX3dpZHRoICAgIT0gc3RyMi0+dGlsZV93aWR0aCAgIHx8IHN0cjEtPnRpbGVfaGVpZ2h0ICAgIT0gc3RyMi0+dGlsZV9oZWlnaHQgICB8fAorICAgICAgICAgICBzdHIxLT5sdW1hX2JhbmRzICAgIT0gc3RyMi0+bHVtYV9iYW5kcyAgIHx8IHN0cjEtPmNocm9tYV9iYW5kcyAgIT0gc3RyMi0+Y2hyb21hX2JhbmRzOworfQorCisvKiogY2FsY3VsYXRlIG51bWJlciBvZiB0aWxlcyBpbiBhIHN0cmlkZSAqLworI2RlZmluZSBJVklfTlVNX1RJTEVTKHN0cmlkZSwgdGlsZV9zaXplKSAoKChzdHJpZGUpICsgKHRpbGVfc2l6ZSkgLSAxKSAvICh0aWxlX3NpemUpKQorCisvKiogY2FsY3VsYXRlIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBpbiBhIHRpbGUgKi8KKyNkZWZpbmUgSVZJX01Cc19QRVJfVElMRSh0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwgbWJfc2l6ZSkgXAorICAgICgoKCh0aWxlX3dpZHRoKSArIChtYl9zaXplKSAtIDEpIC8gKG1iX3NpemUpKSAqICgoKHRpbGVfaGVpZ2h0KSArIChtYl9zaXplKSAtIDEpIC8gKG1iX3NpemUpKSkKKworLyoqIGNvbnZlcnQgdW5zaWduZWQgdmFsdWVzIGludG8gc2lnbmVkIG9uZXMgKHRoZSBzaWduIGlzIGluIHRoZSBMU0IpICovCisjZGVmaW5lIElWSV9UT1NJR05FRCh2YWwpICgtKCgodmFsKSA+PiAxKSBeIC0oKHZhbCkgJiAxKSkpCisKKy8qKiBzY2FsZSBtb3Rpb24gdmVjdG9yICovCitzdGF0aWMgaW5saW5lIGludCBpdmlfc2NhbGVfbXYoaW50IG12LCBpbnQgbXZfc2NhbGUpCit7CisgICAgcmV0dXJuIChtdiArIChtdiA+IDApICsgKG12X3NjYWxlIC0gMSkpID4+IG12X3NjYWxlOworfQorCisvKioKKyAqIEluaXRpYWxpemUgc3RhdGljIGNvZGVzIHVzZWQgZm9yIG1hY3JvYmxvY2sgYW5kIGJsb2NrIGRlY29kaW5nLgorICovCit2b2lkIGZmX2l2aV9pbml0X3N0YXRpY192bGModm9pZCk7CisKKy8qKgorICogIERlY29kZSBhIGh1ZmZtYW4gY29kZWJvb2sgZGVzY3JpcHRvciBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICBhbmQgc2VsZWN0IHNwZWNpZmllZCBodWZmbWFuIHRhYmxlLgorICoKKyAqICBAcGFyYW1baW4sb3V0XSAgZ2IgICAgICAgICAgdGhlIEdldEJpdCBjb250ZXh0CisgKiAgQHBhcmFtW2luXSAgICAgIGRlc2NfY29kZWQgIGZsYWcgc2lnbmFsbGluZyBpZiB0YWJsZSBkZXNjcmlwdG9yIHdhcyBjb2RlZAorICogIEBwYXJhbVtpbl0gICAgICB3aGljaF90YWIgICBjb2RlYm9vayBwdXJwb3NlIChJVklfTUJfSFVGRiBvciBJVklfQkxLX0hVRkYpCisgKiAgQHBhcmFtW291dF0gICAgIGh1ZmZfdGFiICAgIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHNlbGVjdGVkIHRhYmxlCisgKiAgQHBhcmFtW2luXSAgICAgIGF2Y3R4ICAgICAgIEFWQ29kZWNDb250ZXh0IHBvaW50ZXIKKyAqICBAcmV0dXJuICAgICAgICAgICAgIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK2ludCAgZmZfaXZpX2RlY19odWZmX2Rlc2MoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBkZXNjX2NvZGVkLCBpbnQgd2hpY2hfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJVklIdWZmVGFiICpodWZmX3RhYiwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworLyoqCisgKiAgSW5pdGlhbGl6ZSBwbGFuZXMgKHByZXBhcmVzIGRlc2NyaXB0b3JzLCBhbGxvY2F0ZXMgYnVmZmVycyBldGMpLgorICoKKyAqICBAcGFyYW1baW4sb3V0XSAgcGxhbmVzICAgICBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiB0aGUgcGxhbmUgZGVzY3JpcHRvcnMKKyAqICBAcGFyYW1baW5dICAgICAgY2ZnICAgICAgICBwb2ludGVyIHRvIHRoZSBpdmlfcGljX2NvbmZpZyBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBwaWN0dXJlIGxheW91dAorICogIEBwYXJhbVtpbl0gICAgICBpc19pbmRlbzQgIGZsYWcgc2lnbmFsbGluZyBpZiBpdCBpcyBJbmRlbyA0IG9yIG5vdAorICogIEByZXR1cm4gICAgICAgICAgICAgcmVzdWx0IGNvZGU6IDAgLSBPSworICovCitpbnQgIGZmX2l2aV9pbml0X3BsYW5lcyhJVklQbGFuZURlc2MgKnBsYW5lcywgY29uc3QgSVZJUGljQ29uZmlnICpjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfaW5kZW80KTsKKworLyoqCisgKiAgSW5pdGlhbGl6ZSB0aWxlIGFuZCBtYWNyb2Jsb2NrIGRlc2NyaXB0b3JzLgorICoKKyAqICBAcGFyYW1baW4sb3V0XSAgcGxhbmVzICAgICAgIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHRoZSBwbGFuZSBkZXNjcmlwdG9ycworICogIEBwYXJhbVtpbl0gICAgICB0aWxlX3dpZHRoICAgdGlsZSB3aWR0aAorICogIEBwYXJhbVtpbl0gICAgICB0aWxlX2hlaWdodCAgdGlsZSBoZWlnaHQKKyAqICBAcmV0dXJuICAgICAgICAgICAgIHJlc3VsdCBjb2RlOiAwIC0gT0sKKyAqLworaW50ICBmZl9pdmlfaW5pdF90aWxlcyhJVklQbGFuZURlc2MgKnBsYW5lcywgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCk7CisKK2ludCBmZl9pdmlfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpOworaW50IGZmX2l2aV9kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSVZJX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9pdmlfZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9pdmlfZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxMjFhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2l2aV9kc3AuYwpAQCAtMCwwICsxLDg0NiBAQAorLyoKKyAqIERTUCBmdW5jdGlvbnMgZm9yIEluZGVvIFZpZGVvIEludGVyYWN0aXZlIGNvZGVjcyAoSW5kZW80IGFuZCBJbmRlbzUpCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEgTWF4aW0gUG9saWFrb3Zza2kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRFNQIGZ1bmN0aW9ucyAoaW52ZXJzZSB0cmFuc2Zvcm1zLCBtb3Rpb24gY29tcGVuc2F0aW9uLCB3YXZlbGV0IHJlY29tcG9zdGlvbnMpCisgKiBmb3IgSW5kZW8gVmlkZW8gSW50ZXJhY3RpdmUgY29kZWNzLgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaXZpX2NvbW1vbi5oIgorI2luY2x1ZGUgIml2aV9kc3AuaCIKKwordm9pZCBmZl9pdmlfcmVjb21wb3NlNTMoY29uc3QgSVZJUGxhbmVEZXNjICpwbGFuZSwgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRzdF9waXRjaCkKK3sKKyAgICBpbnQgICAgICAgICAgICAgeCwgeSwgaW5keDsKKyAgICBpbnQzMl90ICAgICAgICAgcDAsIHAxLCBwMiwgcDMsIHRtcDAsIHRtcDEsIHRtcDI7CisgICAgaW50MzJfdCAgICAgICAgIGIwXzEsIGIwXzIsIGIxXzEsIGIxXzIsIGIxXzMsIGIyXzEsIGIyXzIsIGIyXzMsIGIyXzQsIGIyXzUsIGIyXzY7CisgICAgaW50MzJfdCAgICAgICAgIGIzXzEsIGIzXzIsIGIzXzMsIGIzXzQsIGIzXzUsIGIzXzYsIGIzXzcsIGIzXzgsIGIzXzk7CisgICAgaW50MzJfdCAgICAgICAgIHBpdGNoLCBiYWNrX3BpdGNoOworICAgIGNvbnN0IHNob3J0ICAgICAqYjBfcHRyLCAqYjFfcHRyLCAqYjJfcHRyLCAqYjNfcHRyOworICAgIGNvbnN0IGludCAgICAgICBudW1fYmFuZHMgPSA0OworCisgICAgLyogYWxsIGJhbmRzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHBpdGNoICovCisgICAgcGl0Y2ggPSBwbGFuZS0+YmFuZHNbMF0ucGl0Y2g7CisKKyAgICAvKiBwaXhlbHMgYXQgdGhlIHBvc2l0aW9uICJ5LTEiIHdpbGwgYmUgc2V0IHRvIHBpeGVscyBhdCB0aGUgInkiIGZvciB0aGUgMXN0IGl0ZXJhdGlvbiAqLworICAgIGJhY2tfcGl0Y2ggPSAwOworCisgICAgLyogZ2V0IHBvaW50ZXJzIHRvIHRoZSB3YXZlbGV0IGJhbmRzICovCisgICAgYjBfcHRyID0gcGxhbmUtPmJhbmRzWzBdLmJ1ZjsKKyAgICBiMV9wdHIgPSBwbGFuZS0+YmFuZHNbMV0uYnVmOworICAgIGIyX3B0ciA9IHBsYW5lLT5iYW5kc1syXS5idWY7CisgICAgYjNfcHRyID0gcGxhbmUtPmJhbmRzWzNdLmJ1ZjsKKworICAgIGZvciAoeSA9IDA7IHkgPCBwbGFuZS0+aGVpZ2h0OyB5ICs9IDIpIHsKKworICAgICAgICBpZiAoeSsyID49IHBsYW5lLT5oZWlnaHQpCisgICAgICAgICAgICBwaXRjaD0gMDsKKyAgICAgICAgLyogbG9hZCBzdG9yYWdlIHZhcmlhYmxlcyB3aXRoIHZhbHVlcyAqLworICAgICAgICBpZiAobnVtX2JhbmRzID4gMCkgeworICAgICAgICAgICAgYjBfMSA9IGIwX3B0clswXTsKKyAgICAgICAgICAgIGIwXzIgPSBiMF9wdHJbcGl0Y2hdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bV9iYW5kcyA+IDEpIHsKKyAgICAgICAgICAgIGIxXzEgPSBiMV9wdHJbYmFja19waXRjaF07CisgICAgICAgICAgICBiMV8yID0gYjFfcHRyWzBdOworICAgICAgICAgICAgYjFfMyA9IGIxXzEgLSBiMV8yKjYgKyBiMV9wdHJbcGl0Y2hdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bV9iYW5kcyA+IDIpIHsKKyAgICAgICAgICAgIGIyXzIgPSBiMl9wdHJbMF07ICAgICAvLyBiMlt4LCAgeSAgXQorICAgICAgICAgICAgYjJfMyA9IGIyXzI7ICAgICAgICAgIC8vIGIyW3grMSx5ICBdID0gYjJbeCx5XQorICAgICAgICAgICAgYjJfNSA9IGIyX3B0cltwaXRjaF07IC8vIGIyW3ggICx5KzFdCisgICAgICAgICAgICBiMl82ID0gYjJfNTsgICAgICAgICAgLy8gYjJbeCsxLHkrMV0gPSBiMlt4LHkrMV0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1fYmFuZHMgPiAzKSB7CisgICAgICAgICAgICBiM18yID0gYjNfcHRyW2JhY2tfcGl0Y2hdOyAvLyBiM1t4ICAseS0xXQorICAgICAgICAgICAgYjNfMyA9IGIzXzI7ICAgICAgICAgICAgICAgLy8gYjNbeCsxLHktMV0gPSBiM1t4ICAseS0xXQorICAgICAgICAgICAgYjNfNSA9IGIzX3B0clswXTsgICAgICAgICAgLy8gYjNbeCAgLHkgIF0KKyAgICAgICAgICAgIGIzXzYgPSBiM181OyAgICAgICAgICAgICAgIC8vIGIzW3grMSx5ICBdID0gYjNbeCAgLHkgIF0KKyAgICAgICAgICAgIGIzXzggPSBiM18yIC0gYjNfNSo2ICsgYjNfcHRyW3BpdGNoXTsKKyAgICAgICAgICAgIGIzXzkgPSBiM184OworICAgICAgICB9CisKKyAgICAgICAgZm9yICh4ID0gMCwgaW5keCA9IDA7IHggPCBwbGFuZS0+d2lkdGg7IHgrPTIsIGluZHgrKykgeworICAgICAgICAgICAgaWYgKHgrMiA+PSBwbGFuZS0+d2lkdGgpIHsKKyAgICAgICAgICAgICAgICBiMF9wdHIgLS07CisgICAgICAgICAgICAgICAgYjFfcHRyIC0tOworICAgICAgICAgICAgICAgIGIyX3B0ciAtLTsKKyAgICAgICAgICAgICAgICBiM19wdHIgLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHNvbWUgdmFsdWVzIGNhbGN1bGF0ZWQgaW4gdGhlIHByZXZpb3VzIGl0ZXJhdGlvbnMgY2FuICovCisgICAgICAgICAgICAvKiBiZSByZXVzZWQgaW4gdGhlIG5leHQgb25lcywgc28gZG8gYXBwcm9wcmlhdGUgY29weWluZyAqLworICAgICAgICAgICAgYjJfMSA9IGIyXzI7IC8vIGIyW3gtMSx5ICBdID0gYjJbeCwgIHkgIF0KKyAgICAgICAgICAgIGIyXzIgPSBiMl8zOyAvLyBiMlt4ICAseSAgXSA9IGIyW3grMSx5ICBdCisgICAgICAgICAgICBiMl80ID0gYjJfNTsgLy8gYjJbeC0xLHkrMV0gPSBiMlt4ICAseSsxXQorICAgICAgICAgICAgYjJfNSA9IGIyXzY7IC8vIGIyW3ggICx5KzFdID0gYjJbeCsxLHkrMV0KKyAgICAgICAgICAgIGIzXzEgPSBiM18yOyAvLyBiM1t4LTEseS0xXSA9IGIzW3ggICx5LTFdCisgICAgICAgICAgICBiM18yID0gYjNfMzsgLy8gYjNbeCAgLHktMV0gPSBiM1t4KzEseS0xXQorICAgICAgICAgICAgYjNfNCA9IGIzXzU7IC8vIGIzW3gtMSx5ICBdID0gYjNbeCAgLHkgIF0KKyAgICAgICAgICAgIGIzXzUgPSBiM182OyAvLyBiM1t4ICAseSAgXSA9IGIzW3grMSx5ICBdCisgICAgICAgICAgICBiM183ID0gYjNfODsgLy8gdmVydF9IUEYoeC0xKQorICAgICAgICAgICAgYjNfOCA9IGIzXzk7IC8vIHZlcnRfSFBGKHggICkKKworICAgICAgICAgICAgcDAgPSBwMSA9IHAyID0gcDMgPSAwOworCisgICAgICAgICAgICAvKiBwcm9jZXNzIHRoZSBMTC1iYW5kIGJ5IGFwcGx5aW5nIExQRiBib3RoIHZlcnRpY2FsbHkgYW5kIGhvcml6b250YWxseSAqLworICAgICAgICAgICAgaWYgKG51bV9iYW5kcyA+IDApIHsKKyAgICAgICAgICAgICAgICB0bXAwID0gYjBfMTsKKyAgICAgICAgICAgICAgICB0bXAyID0gYjBfMjsKKyAgICAgICAgICAgICAgICBiMF8xID0gYjBfcHRyW2luZHgrMV07CisgICAgICAgICAgICAgICAgYjBfMiA9IGIwX3B0cltwaXRjaCtpbmR4KzFdOworICAgICAgICAgICAgICAgIHRtcDEgPSB0bXAwICsgYjBfMTsKKworICAgICAgICAgICAgICAgIHAwID0gIHRtcDAgPDwgNDsKKyAgICAgICAgICAgICAgICBwMSA9ICB0bXAxIDw8IDM7CisgICAgICAgICAgICAgICAgcDIgPSAodG1wMCArIHRtcDIpIDw8IDM7CisgICAgICAgICAgICAgICAgcDMgPSAodG1wMSArIHRtcDIgKyBiMF8yKSA8PCAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBwcm9jZXNzIHRoZSBITC1iYW5kIGJ5IGFwcGx5aW5nIEhQRiB2ZXJ0aWNhbGx5IGFuZCBMUEYgaG9yaXpvbnRhbGx5ICovCisgICAgICAgICAgICBpZiAobnVtX2JhbmRzID4gMSkgeworICAgICAgICAgICAgICAgIHRtcDAgPSBiMV8yOworICAgICAgICAgICAgICAgIHRtcDEgPSBiMV8xOworICAgICAgICAgICAgICAgIGIxXzIgPSBiMV9wdHJbaW5keCsxXTsKKyAgICAgICAgICAgICAgICBiMV8xID0gYjFfcHRyW2JhY2tfcGl0Y2graW5keCsxXTsKKworICAgICAgICAgICAgICAgIHRtcDIgPSB0bXAxIC0gdG1wMCo2ICsgYjFfMzsKKyAgICAgICAgICAgICAgICBiMV8zID0gYjFfMSAtIGIxXzIqNiArIGIxX3B0cltwaXRjaCtpbmR4KzFdOworCisgICAgICAgICAgICAgICAgcDAgKz0gKHRtcDAgKyB0bXAxKSA8PCAzOworICAgICAgICAgICAgICAgIHAxICs9ICh0bXAwICsgdG1wMSArIGIxXzEgKyBiMV8yKSA8PCAyOworICAgICAgICAgICAgICAgIHAyICs9ICB0bXAyIDw8IDI7CisgICAgICAgICAgICAgICAgcDMgKz0gKHRtcDIgKyBiMV8zKSA8PCAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBwcm9jZXNzIHRoZSBMSC1iYW5kIGJ5IGFwcGx5aW5nIExQRiB2ZXJ0aWNhbGx5IGFuZCBIUEYgaG9yaXpvbnRhbGx5ICovCisgICAgICAgICAgICBpZiAobnVtX2JhbmRzID4gMikgeworICAgICAgICAgICAgICAgIGIyXzMgPSBiMl9wdHJbaW5keCsxXTsKKyAgICAgICAgICAgICAgICBiMl82ID0gYjJfcHRyW3BpdGNoK2luZHgrMV07CisKKyAgICAgICAgICAgICAgICB0bXAwID0gYjJfMSArIGIyXzI7CisgICAgICAgICAgICAgICAgdG1wMSA9IGIyXzEgLSBiMl8yKjYgKyBiMl8zOworCisgICAgICAgICAgICAgICAgcDAgKz0gdG1wMCA8PCAzOworICAgICAgICAgICAgICAgIHAxICs9IHRtcDEgPDwgMjsKKyAgICAgICAgICAgICAgICBwMiArPSAodG1wMCArIGIyXzQgKyBiMl81KSA8PCAyOworICAgICAgICAgICAgICAgIHAzICs9ICh0bXAxICsgYjJfNCAtIGIyXzUqNiArIGIyXzYpIDw8IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgdGhlIEhILWJhbmQgYnkgYXBwbHlpbmcgSFBGIGJvdGggdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5ICovCisgICAgICAgICAgICBpZiAobnVtX2JhbmRzID4gMykgeworICAgICAgICAgICAgICAgIGIzXzYgPSBiM19wdHJbaW5keCsxXTsgICAgICAgICAgICAvLyBiM1t4KzEseSAgXQorICAgICAgICAgICAgICAgIGIzXzMgPSBiM19wdHJbYmFja19waXRjaCtpbmR4KzFdOyAvLyBiM1t4KzEseS0xXQorCisgICAgICAgICAgICAgICAgdG1wMCA9IGIzXzEgKyBiM180OworICAgICAgICAgICAgICAgIHRtcDEgPSBiM18yICsgYjNfNTsKKyAgICAgICAgICAgICAgICB0bXAyID0gYjNfMyArIGIzXzY7CisKKyAgICAgICAgICAgICAgICBiM185ID0gYjNfMyAtIGIzXzYqNiArIGIzX3B0cltwaXRjaCtpbmR4KzFdOworCisgICAgICAgICAgICAgICAgcDAgKz0gKHRtcDAgKyB0bXAxKSA8PCAyOworICAgICAgICAgICAgICAgIHAxICs9ICh0bXAwIC0gdG1wMSo2ICsgdG1wMikgPDwgMTsKKyAgICAgICAgICAgICAgICBwMiArPSAoYjNfNyArIGIzXzgpIDw8IDE7CisgICAgICAgICAgICAgICAgcDMgKz0gIGIzXzcgLSBiM184KjYgKyBiM185OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBvdXRwdXQgZm91ciBwaXhlbHMgKi8KKyAgICAgICAgICAgIGRzdFt4XSAgICAgICAgICAgICA9IGF2X2NsaXBfdWludDgoKHAwID4+IDYpICsgMTI4KTsKKyAgICAgICAgICAgIGRzdFt4KzFdICAgICAgICAgICA9IGF2X2NsaXBfdWludDgoKHAxID4+IDYpICsgMTI4KTsKKyAgICAgICAgICAgIGRzdFtkc3RfcGl0Y2greF0gICA9IGF2X2NsaXBfdWludDgoKHAyID4+IDYpICsgMTI4KTsKKyAgICAgICAgICAgIGRzdFtkc3RfcGl0Y2greCsxXSA9IGF2X2NsaXBfdWludDgoKHAzID4+IDYpICsgMTI4KTsKKyAgICAgICAgfS8vIGZvciB4CisKKyAgICAgICAgZHN0ICs9IGRzdF9waXRjaCA8PCAxOworCisgICAgICAgIGJhY2tfcGl0Y2ggPSAtcGl0Y2g7CisKKyAgICAgICAgYjBfcHRyICs9IHBpdGNoICsgMTsKKyAgICAgICAgYjFfcHRyICs9IHBpdGNoICsgMTsKKyAgICAgICAgYjJfcHRyICs9IHBpdGNoICsgMTsKKyAgICAgICAgYjNfcHRyICs9IHBpdGNoICsgMTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfaXZpX3JlY29tcG9zZV9oYWFyKGNvbnN0IElWSVBsYW5lRGVzYyAqcGxhbmUsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkc3RfcGl0Y2gpCit7CisgICAgaW50ICAgICAgICAgICAgIHgsIHksIGluZHgsIGIwLCBiMSwgYjIsIGIzLCBwMCwgcDEsIHAyLCBwMzsKKyAgICBjb25zdCBzaG9ydCAgICAgKmIwX3B0ciwgKmIxX3B0ciwgKmIyX3B0ciwgKmIzX3B0cjsKKyAgICBpbnQzMl90ICAgICAgICAgcGl0Y2g7CisKKyAgICAvKiBhbGwgYmFuZHMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgcGl0Y2ggKi8KKyAgICBwaXRjaCA9IHBsYW5lLT5iYW5kc1swXS5waXRjaDsKKworICAgIC8qIGdldCBwb2ludGVycyB0byB0aGUgd2F2ZWxldCBiYW5kcyAqLworICAgIGIwX3B0ciA9IHBsYW5lLT5iYW5kc1swXS5idWY7CisgICAgYjFfcHRyID0gcGxhbmUtPmJhbmRzWzFdLmJ1ZjsKKyAgICBiMl9wdHIgPSBwbGFuZS0+YmFuZHNbMl0uYnVmOworICAgIGIzX3B0ciA9IHBsYW5lLT5iYW5kc1szXS5idWY7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgcGxhbmUtPmhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIGZvciAoeCA9IDAsIGluZHggPSAwOyB4IDwgcGxhbmUtPndpZHRoOyB4ICs9IDIsIGluZHgrKykgeworICAgICAgICAgICAgLyogbG9hZCBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgICAgIGIwID0gYjBfcHRyW2luZHhdOyAvL3Nob3VsZCBiZTogYjAgPSAobnVtX2JhbmRzID4gMCkgPyBiMF9wdHJbaW5keF0gOiAwOworICAgICAgICAgICAgYjEgPSBiMV9wdHJbaW5keF07IC8vc2hvdWxkIGJlOiBiMSA9IChudW1fYmFuZHMgPiAxKSA/IGIxX3B0cltpbmR4XSA6IDA7CisgICAgICAgICAgICBiMiA9IGIyX3B0cltpbmR4XTsgLy9zaG91bGQgYmU6IGIyID0gKG51bV9iYW5kcyA+IDIpID8gYjJfcHRyW2luZHhdIDogMDsKKyAgICAgICAgICAgIGIzID0gYjNfcHRyW2luZHhdOyAvL3Nob3VsZCBiZTogYjMgPSAobnVtX2JhbmRzID4gMykgPyBiM19wdHJbaW5keF0gOiAwOworCisgICAgICAgICAgICAvKiBoYWFyIHdhdmVsZXQgcmVjb21wb3NpdGlvbiAqLworICAgICAgICAgICAgcDAgPSAoYjAgKyBiMSArIGIyICsgYjMgKyAyKSA+PiAyOworICAgICAgICAgICAgcDEgPSAoYjAgKyBiMSAtIGIyIC0gYjMgKyAyKSA+PiAyOworICAgICAgICAgICAgcDIgPSAoYjAgLSBiMSArIGIyIC0gYjMgKyAyKSA+PiAyOworICAgICAgICAgICAgcDMgPSAoYjAgLSBiMSAtIGIyICsgYjMgKyAyKSA+PiAyOworCisgICAgICAgICAgICAvKiBiaWFzLCBjb252ZXJ0IGFuZCBvdXRwdXQgZm91ciBwaXhlbHMgKi8KKyAgICAgICAgICAgIGRzdFt4XSAgICAgICAgICAgICAgICAgPSBhdl9jbGlwX3VpbnQ4KHAwICsgMTI4KTsKKyAgICAgICAgICAgIGRzdFt4ICsgMV0gICAgICAgICAgICAgPSBhdl9jbGlwX3VpbnQ4KHAxICsgMTI4KTsKKyAgICAgICAgICAgIGRzdFtkc3RfcGl0Y2ggKyB4XSAgICAgPSBhdl9jbGlwX3VpbnQ4KHAyICsgMTI4KTsKKyAgICAgICAgICAgIGRzdFtkc3RfcGl0Y2ggKyB4ICsgMV0gPSBhdl9jbGlwX3VpbnQ4KHAzICsgMTI4KTsKKyAgICAgICAgfS8vIGZvciB4CisKKyAgICAgICAgZHN0ICs9IGRzdF9waXRjaCA8PCAxOworCisgICAgICAgIGIwX3B0ciArPSBwaXRjaDsKKyAgICAgICAgYjFfcHRyICs9IHBpdGNoOworICAgICAgICBiMl9wdHIgKz0gcGl0Y2g7CisgICAgICAgIGIzX3B0ciArPSBwaXRjaDsKKyAgICB9Ly8gZm9yIHkKK30KKworLyoqIGJ1dHRlcmZseSBvcGVyYXRpb24gZm9yIHRoZSBpbnZlcnNlIEhhYXIgdHJhbnNmb3JtICovCisjZGVmaW5lIElWSV9IQUFSX0JGTFkoczEsIHMyLCBvMSwgbzIsIHQpIFwKKyAgICB0ICA9ICgoczEpIC0gKHMyKSkgPj4gMTtcCisgICAgbzEgPSAoKHMxKSArIChzMikpID4+IDE7XAorICAgIG8yID0gKHQpO1wKKworLyoqIGludmVyc2UgOC1wb2ludCBIYWFyIHRyYW5zZm9ybSAqLworI2RlZmluZSBJTlZfSEFBUjgoczEsIHM1LCBzMywgczcsIHMyLCBzNCwgczYsIHM4LFwKKyAgICAgICAgICAgICAgICAgIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCxcCisgICAgICAgICAgICAgICAgICB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4KSB7XAorICAgIHQxID0gKHMxKSA8PCAxOyB0NSA9IChzNSkgPDwgMTtcCisgICAgSVZJX0hBQVJfQkZMWSh0MSwgdDUsIHQxLCB0NSwgdDApOyBJVklfSEFBUl9CRkxZKHQxLCBzMywgdDEsIHQzLCB0MCk7XAorICAgIElWSV9IQUFSX0JGTFkodDUsIHM3LCB0NSwgdDcsIHQwKTsgSVZJX0hBQVJfQkZMWSh0MSwgczIsIHQxLCB0MiwgdDApO1wKKyAgICBJVklfSEFBUl9CRkxZKHQzLCBzNCwgdDMsIHQ0LCB0MCk7IElWSV9IQUFSX0JGTFkodDUsIHM2LCB0NSwgdDYsIHQwKTtcCisgICAgSVZJX0hBQVJfQkZMWSh0NywgczgsIHQ3LCB0OCwgdDApO1wKKyAgICBkMSA9IENPTVBFTlNBVEUodDEpO1wKKyAgICBkMiA9IENPTVBFTlNBVEUodDIpO1wKKyAgICBkMyA9IENPTVBFTlNBVEUodDMpO1wKKyAgICBkNCA9IENPTVBFTlNBVEUodDQpO1wKKyAgICBkNSA9IENPTVBFTlNBVEUodDUpO1wKKyAgICBkNiA9IENPTVBFTlNBVEUodDYpO1wKKyAgICBkNyA9IENPTVBFTlNBVEUodDcpO1wKKyAgICBkOCA9IENPTVBFTlNBVEUodDgpOyB9CisKKy8qKiBpbnZlcnNlIDQtcG9pbnQgSGFhciB0cmFuc2Zvcm0gKi8KKyNkZWZpbmUgSU5WX0hBQVI0KHMxLCBzMywgczUsIHM3LCBkMSwgZDIsIGQzLCBkNCwgdDAsIHQxLCB0MiwgdDMsIHQ0KSB7XAorICAgIElWSV9IQUFSX0JGTFkoczEsIHMzLCB0MCwgdDEsIHQ0KTtcCisgICAgSVZJX0hBQVJfQkZMWSh0MCwgczUsIHQyLCB0MywgdDQpO1wKKyAgICBkMSA9IENPTVBFTlNBVEUodDIpO1wKKyAgICBkMiA9IENPTVBFTlNBVEUodDMpO1wKKyAgICBJVklfSEFBUl9CRkxZKHQxLCBzNywgdDIsIHQzLCB0NCk7XAorICAgIGQzID0gQ09NUEVOU0FURSh0Mik7XAorICAgIGQ0ID0gQ09NUEVOU0FURSh0Myk7IH0KKwordm9pZCBmZl9pdmlfaW52ZXJzZV9oYWFyXzh4OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpCit7CisgICAgaW50ICAgICBpLCBzaGlmdCwgc3AxLCBzcDIsIHNwMywgc3A0OworICAgIGNvbnN0IGludDMyX3QgKnNyYzsKKyAgICBpbnQzMl90ICpkc3Q7CisgICAgaW50ICAgICB0bXBbNjRdOworICAgIGludCAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LCB0ODsKKworICAgIC8qIGFwcGx5IHRoZSBJbnZIYWFyOCB0byBhbGwgY29sdW1ucyAqLworI2RlZmluZSBDT01QRU5TQVRFKHgpICh4KQorICAgIHNyYyA9IGluOworICAgIGRzdCA9IHRtcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGlmIChmbGFnc1tpXSkgeworICAgICAgICAgICAgLyogcHJlLXNjYWxpbmcgKi8KKyAgICAgICAgICAgIHNoaWZ0ID0gIShpICYgNCk7CisgICAgICAgICAgICBzcDEgPSBzcmNbIDBdIDw8IHNoaWZ0OworICAgICAgICAgICAgc3AyID0gc3JjWyA4XSA8PCBzaGlmdDsKKyAgICAgICAgICAgIHNwMyA9IHNyY1sxNl0gPDwgc2hpZnQ7CisgICAgICAgICAgICBzcDQgPSBzcmNbMjRdIDw8IHNoaWZ0OworICAgICAgICAgICAgSU5WX0hBQVI4KCAgICBzcDEsICAgICBzcDIsICAgICBzcDMsICAgICBzcDQsCisgICAgICAgICAgICAgICAgICAgICAgc3JjWzMyXSwgc3JjWzQwXSwgc3JjWzQ4XSwgc3JjWzU2XSwKKyAgICAgICAgICAgICAgICAgICAgICBkc3RbIDBdLCBkc3RbIDhdLCBkc3RbMTZdLCBkc3RbMjRdLAorICAgICAgICAgICAgICAgICAgICAgIGRzdFszMl0sIGRzdFs0MF0sIGRzdFs0OF0sIGRzdFs1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LCB0OCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZHN0WyAwXSA9IGRzdFsgOF0gPSBkc3RbMTZdID0gZHN0WzI0XSA9CisgICAgICAgICAgICBkc3RbMzJdID0gZHN0WzQwXSA9IGRzdFs0OF0gPSBkc3RbNTZdID0gMDsKKworICAgICAgICBzcmMrKzsKKyAgICAgICAgZHN0Kys7CisgICAgfQorI3VuZGVmICBDT01QRU5TQVRFCisKKyAgICAvKiBhcHBseSB0aGUgSW52SGFhcjggdG8gYWxsIHJvd3MgKi8KKyNkZWZpbmUgQ09NUEVOU0FURSh4KSAoeCkKKyAgICBzcmMgPSB0bXA7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBpZiAoICAgIXNyY1swXSAmJiAhc3JjWzFdICYmICFzcmNbMl0gJiYgIXNyY1szXQorICAgICAgICAgICAgJiYgIXNyY1s0XSAmJiAhc3JjWzVdICYmICFzcmNbNl0gJiYgIXNyY1s3XSkgeworICAgICAgICAgICAgbWVtc2V0KG91dCwgMCwgOCAqIHNpemVvZihvdXRbMF0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIElOVl9IQUFSOChzcmNbMF0sIHNyY1sxXSwgc3JjWzJdLCBzcmNbM10sCisgICAgICAgICAgICAgICAgICAgICAgc3JjWzRdLCBzcmNbNV0sIHNyY1s2XSwgc3JjWzddLAorICAgICAgICAgICAgICAgICAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRbNF0sIG91dFs1XSwgb3V0WzZdLCBvdXRbN10sCisgICAgICAgICAgICAgICAgICAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LCB0OCk7CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IDg7CisgICAgICAgIG91dCArPSBwaXRjaDsKKyAgICB9CisjdW5kZWYgIENPTVBFTlNBVEUKK30KKwordm9pZCBmZl9pdmlfcm93X2hhYXI4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKQoreworICAgIGludCAgICAgaTsKKyAgICBpbnQgICAgIHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDg7CisKKyAgICAvKiBhcHBseSB0aGUgSW52SGFhcjggdG8gYWxsIHJvd3MgKi8KKyNkZWZpbmUgQ09NUEVOU0FURSh4KSAoeCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGlmICggICAhaW5bMF0gJiYgIWluWzFdICYmICFpblsyXSAmJiAhaW5bM10KKyAgICAgICAgICAgICYmICFpbls0XSAmJiAhaW5bNV0gJiYgIWluWzZdICYmICFpbls3XSkgeworICAgICAgICAgICAgbWVtc2V0KG91dCwgMCwgOCAqIHNpemVvZihvdXRbMF0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIElOVl9IQUFSOChpblswXSwgIGluWzFdLCAgaW5bMl0sICBpblszXSwKKyAgICAgICAgICAgICAgICAgICAgICBpbls0XSwgIGluWzVdLCAgaW5bNl0sICBpbls3XSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sCisgICAgICAgICAgICAgICAgICAgICAgb3V0WzRdLCBvdXRbNV0sIG91dFs2XSwgb3V0WzddLAorICAgICAgICAgICAgICAgICAgICAgIHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDgpOworICAgICAgICB9CisgICAgICAgIGluICArPSA4OworICAgICAgICBvdXQgKz0gcGl0Y2g7CisgICAgfQorI3VuZGVmICBDT01QRU5TQVRFCit9CisKK3ZvaWQgZmZfaXZpX2NvbF9oYWFyOChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncykKK3sKKyAgICBpbnQgICAgIGk7CisgICAgaW50ICAgICB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4OworCisgICAgLyogYXBwbHkgdGhlIEludkhhYXI4IHRvIGFsbCBjb2x1bW5zICovCisjZGVmaW5lIENPTVBFTlNBVEUoeCkgKHgpCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBpZiAoZmxhZ3NbaV0pIHsKKyAgICAgICAgICAgIElOVl9IQUFSOChpblsgMF0sIGluWyA4XSwgaW5bMTZdLCBpblsyNF0sCisgICAgICAgICAgICAgICAgICAgICAgaW5bMzJdLCBpbls0MF0sIGluWzQ4XSwgaW5bNTZdLAorICAgICAgICAgICAgICAgICAgICAgIG91dFswICogcGl0Y2hdLCBvdXRbMSAqIHBpdGNoXSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRbMiAqIHBpdGNoXSwgb3V0WzMgKiBwaXRjaF0sCisgICAgICAgICAgICAgICAgICAgICAgb3V0WzQgKiBwaXRjaF0sIG91dFs1ICogcGl0Y2hdLAorICAgICAgICAgICAgICAgICAgICAgIG91dFs2ICogcGl0Y2hdLCBvdXRbNyAqIHBpdGNoXSwKKyAgICAgICAgICAgICAgICAgICAgICB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBvdXRbMCAqIHBpdGNoXSA9IG91dFsxICogcGl0Y2hdID0KKyAgICAgICAgICAgIG91dFsyICogcGl0Y2hdID0gb3V0WzMgKiBwaXRjaF0gPQorICAgICAgICAgICAgb3V0WzQgKiBwaXRjaF0gPSBvdXRbNSAqIHBpdGNoXSA9CisgICAgICAgICAgICBvdXRbNiAqIHBpdGNoXSA9IG91dFs3ICogcGl0Y2hdID0gMDsKKworICAgICAgICBpbisrOworICAgICAgICBvdXQrKzsKKyAgICB9CisjdW5kZWYgIENPTVBFTlNBVEUKK30KKwordm9pZCBmZl9pdmlfaW52ZXJzZV9oYWFyXzR4NChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpCit7CisgICAgaW50ICAgICBpLCBzaGlmdCwgc3AxLCBzcDI7CisgICAgY29uc3QgaW50MzJfdCAqc3JjOworICAgIGludDMyX3QgKmRzdDsKKyAgICBpbnQgICAgIHRtcFsxNl07CisgICAgaW50ICAgICB0MCwgdDEsIHQyLCB0MywgdDQ7CisKKyAgICAvKiBhcHBseSB0aGUgSW52SGFhcjQgdG8gYWxsIGNvbHVtbnMgKi8KKyNkZWZpbmUgQ09NUEVOU0FURSh4KSAoeCkKKyAgICBzcmMgPSBpbjsKKyAgICBkc3QgPSB0bXA7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpZiAoZmxhZ3NbaV0pIHsKKyAgICAgICAgICAgIC8qIHByZS1zY2FsaW5nICovCisgICAgICAgICAgICBzaGlmdCA9ICEoaSAmIDIpOworICAgICAgICAgICAgc3AxID0gc3JjWzBdIDw8IHNoaWZ0OworICAgICAgICAgICAgc3AyID0gc3JjWzRdIDw8IHNoaWZ0OworICAgICAgICAgICAgSU5WX0hBQVI0KCAgIHNwMSwgICAgc3AyLCBzcmNbOF0sIHNyY1sxMl0sCisgICAgICAgICAgICAgICAgICAgICAgZHN0WzBdLCBkc3RbNF0sIGRzdFs4XSwgZHN0WzEyXSwKKyAgICAgICAgICAgICAgICAgICAgICB0MCwgdDEsIHQyLCB0MywgdDQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGRzdFswXSA9IGRzdFs0XSA9IGRzdFs4XSA9IGRzdFsxMl0gPSAwOworCisgICAgICAgIHNyYysrOworICAgICAgICBkc3QrKzsKKyAgICB9CisjdW5kZWYgIENPTVBFTlNBVEUKKworICAgIC8qIGFwcGx5IHRoZSBJbnZIYWFyOCB0byBhbGwgcm93cyAqLworI2RlZmluZSBDT01QRU5TQVRFKHgpICh4KQorICAgIHNyYyA9IHRtcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGlmICghc3JjWzBdICYmICFzcmNbMV0gJiYgIXNyY1syXSAmJiAhc3JjWzNdKSB7CisgICAgICAgICAgICBtZW1zZXQob3V0LCAwLCA0ICogc2l6ZW9mKG91dFswXSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSU5WX0hBQVI0KHNyY1swXSwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sCisgICAgICAgICAgICAgICAgICAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0KTsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgb3V0ICs9IHBpdGNoOworICAgIH0KKyN1bmRlZiAgQ09NUEVOU0FURQorfQorCit2b2lkIGZmX2l2aV9yb3dfaGFhcjQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpCit7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0OworCisgICAgLyogYXBwbHkgdGhlIEludkhhYXI0IHRvIGFsbCByb3dzICovCisjZGVmaW5lIENPTVBFTlNBVEUoeCkgKHgpCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpZiAoIWluWzBdICYmICFpblsxXSAmJiAhaW5bMl0gJiYgIWluWzNdKSB7CisgICAgICAgICAgICBtZW1zZXQob3V0LCAwLCA0ICogc2l6ZW9mKG91dFswXSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSU5WX0hBQVI0KGluWzBdLCBpblsxXSwgaW5bMl0sIGluWzNdLAorICAgICAgICAgICAgICAgICAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwKKyAgICAgICAgICAgICAgICAgICAgICB0MCwgdDEsIHQyLCB0MywgdDQpOworICAgICAgICB9CisgICAgICAgIGluICArPSA0OworICAgICAgICBvdXQgKz0gcGl0Y2g7CisgICAgfQorI3VuZGVmICBDT01QRU5TQVRFCit9CisKK3ZvaWQgZmZfaXZpX2NvbF9oYWFyNChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncykKK3sKKyAgICBpbnQgICAgIGk7CisgICAgaW50ICAgICB0MCwgdDEsIHQyLCB0MywgdDQ7CisKKyAgICAvKiBhcHBseSB0aGUgSW52SGFhcjggdG8gYWxsIGNvbHVtbnMgKi8KKyNkZWZpbmUgQ09NUEVOU0FURSh4KSAoeCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGlmIChmbGFnc1tpXSkgeworICAgICAgICAgICAgSU5WX0hBQVI0KGluWzBdLCBpbls0XSwgaW5bOF0sIGluWzEyXSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRbMCAqIHBpdGNoXSwgb3V0WzEgKiBwaXRjaF0sCisgICAgICAgICAgICAgICAgICAgICAgb3V0WzIgKiBwaXRjaF0sIG91dFszICogcGl0Y2hdLAorICAgICAgICAgICAgICAgICAgICAgIHQwLCB0MSwgdDIsIHQzLCB0NCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgb3V0WzAgKiBwaXRjaF0gPSBvdXRbMSAqIHBpdGNoXSA9CisgICAgICAgICAgICBvdXRbMiAqIHBpdGNoXSA9IG91dFszICogcGl0Y2hdID0gMDsKKworICAgICAgICBpbisrOworICAgICAgICBvdXQrKzsKKyAgICB9CisjdW5kZWYgIENPTVBFTlNBVEUKK30KKwordm9pZCBmZl9pdmlfZGNfaGFhcl8yZChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa19zaXplKQoreworICAgIGludCAgICAgeCwgeTsKKyAgICBpbnQxNl90IGRjX2NvZWZmOworCisgICAgZGNfY29lZmYgPSAoKmluICsgMCkgPj4gMzsKKworICAgIGZvciAoeSA9IDA7IHkgPCBibGtfc2l6ZTsgb3V0ICs9IHBpdGNoLCB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGJsa19zaXplOyB4KyspCisgICAgICAgICAgICBvdXRbeF0gPSBkY19jb2VmZjsKKyAgICB9Cit9CisKKy8qKiBidXR0ZXJmbHkgb3BlcmF0aW9uIGZvciB0aGUgaW52ZXJzZSBzbGFudCB0cmFuc2Zvcm0gKi8KKyNkZWZpbmUgSVZJX1NMQU5UX0JGTFkoczEsIHMyLCBvMSwgbzIsIHQpIFwKKyAgICB0ICA9IChzMSkgLSAoczIpO1wKKyAgICBvMSA9IChzMSkgKyAoczIpO1wKKyAgICBvMiA9ICh0KTtcCisKKy8qKiBUaGlzIGlzIGEgcmVmbGVjdGlvbiBhLGIgPSAxLzIsIDUvNCBmb3IgdGhlIGludmVyc2Ugc2xhbnQgdHJhbnNmb3JtICovCisjZGVmaW5lIElWSV9JUkVGTEVDVChzMSwgczIsIG8xLCBvMiwgdCkgXAorICAgIHQgID0gKCgoczEpICsgKHMyKSoyICsgMikgPj4gMikgKyAoczEpO1wKKyAgICBvMiA9ICgoKHMxKSoyIC0gKHMyKSArIDIpID4+IDIpIC0gKHMyKTtcCisgICAgbzEgPSAodCk7XAorCisvKiogVGhpcyBpcyBhIHJlZmxlY3Rpb24gYSxiID0gMS8yLCA3LzggZm9yIHRoZSBpbnZlcnNlIHNsYW50IHRyYW5zZm9ybSAqLworI2RlZmluZSBJVklfU0xBTlRfUEFSVDQoczEsIHMyLCBvMSwgbzIsIHQpIFwKKyAgICB0ICA9IChzMikgKyAoKChzMSkqNCAgLSAoczIpICsgNCkgPj4gMyk7XAorICAgIG8yID0gKHMxKSArICgoLShzMSkgLSAoczIpKjQgKyA0KSA+PiAzKTtcCisgICAgbzEgPSAodCk7XAorCisvKiogaW52ZXJzZSBzbGFudDggdHJhbnNmb3JtICovCisjZGVmaW5lIElWSV9JTlZfU0xBTlQ4KHMxLCBzNCwgczgsIHM1LCBzMiwgczYsIHMzLCBzNyxcCisgICAgICAgICAgICAgICAgICAgICAgIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCxcCisgICAgICAgICAgICAgICAgICAgICAgIHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDgpIHtcCisgICAgSVZJX1NMQU5UX1BBUlQ0KHM0LCBzNSwgdDQsIHQ1LCB0MCk7XAorXAorICAgIElWSV9TTEFOVF9CRkxZKHMxLCB0NSwgdDEsIHQ1LCB0MCk7IElWSV9TTEFOVF9CRkxZKHMyLCBzNiwgdDIsIHQ2LCB0MCk7XAorICAgIElWSV9TTEFOVF9CRkxZKHM3LCBzMywgdDcsIHQzLCB0MCk7IElWSV9TTEFOVF9CRkxZKHQ0LCBzOCwgdDQsIHQ4LCB0MCk7XAorXAorICAgIElWSV9TTEFOVF9CRkxZKHQxLCB0MiwgdDEsIHQyLCB0MCk7IElWSV9JUkVGTEVDVCAgKHQ0LCB0MywgdDQsIHQzLCB0MCk7XAorICAgIElWSV9TTEFOVF9CRkxZKHQ1LCB0NiwgdDUsIHQ2LCB0MCk7IElWSV9JUkVGTEVDVCAgKHQ4LCB0NywgdDgsIHQ3LCB0MCk7XAorICAgIElWSV9TTEFOVF9CRkxZKHQxLCB0NCwgdDEsIHQ0LCB0MCk7IElWSV9TTEFOVF9CRkxZKHQyLCB0MywgdDIsIHQzLCB0MCk7XAorICAgIElWSV9TTEFOVF9CRkxZKHQ1LCB0OCwgdDUsIHQ4LCB0MCk7IElWSV9TTEFOVF9CRkxZKHQ2LCB0NywgdDYsIHQ3LCB0MCk7XAorICAgIGQxID0gQ09NUEVOU0FURSh0MSk7XAorICAgIGQyID0gQ09NUEVOU0FURSh0Mik7XAorICAgIGQzID0gQ09NUEVOU0FURSh0Myk7XAorICAgIGQ0ID0gQ09NUEVOU0FURSh0NCk7XAorICAgIGQ1ID0gQ09NUEVOU0FURSh0NSk7XAorICAgIGQ2ID0gQ09NUEVOU0FURSh0Nik7XAorICAgIGQ3ID0gQ09NUEVOU0FURSh0Nyk7XAorICAgIGQ4ID0gQ09NUEVOU0FURSh0OCk7fQorCisvKiogaW52ZXJzZSBzbGFudDQgdHJhbnNmb3JtICovCisjZGVmaW5lIElWSV9JTlZfU0xBTlQ0KHMxLCBzNCwgczIsIHMzLCBkMSwgZDIsIGQzLCBkNCwgdDAsIHQxLCB0MiwgdDMsIHQ0KSB7XAorICAgIElWSV9TTEFOVF9CRkxZKHMxLCBzMiwgdDEsIHQyLCB0MCk7IElWSV9JUkVGTEVDVCAgKHM0LCBzMywgdDQsIHQzLCB0MCk7XAorXAorICAgIElWSV9TTEFOVF9CRkxZKHQxLCB0NCwgdDEsIHQ0LCB0MCk7IElWSV9TTEFOVF9CRkxZKHQyLCB0MywgdDIsIHQzLCB0MCk7XAorICAgIGQxID0gQ09NUEVOU0FURSh0MSk7XAorICAgIGQyID0gQ09NUEVOU0FURSh0Mik7XAorICAgIGQzID0gQ09NUEVOU0FURSh0Myk7XAorICAgIGQ0ID0gQ09NUEVOU0FURSh0NCk7fQorCit2b2lkIGZmX2l2aV9pbnZlcnNlX3NsYW50Xzh4OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwgY29uc3QgdWludDhfdCAqZmxhZ3MpCit7CisgICAgaW50ICAgICBpOworICAgIGNvbnN0IGludDMyX3QgKnNyYzsKKyAgICBpbnQzMl90ICpkc3Q7CisgICAgaW50ICAgICB0bXBbNjRdOworICAgIGludCAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LCB0ODsKKworI2RlZmluZSBDT01QRU5TQVRFKHgpICh4KQorICAgIHNyYyA9IGluOworICAgIGRzdCA9IHRtcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGlmIChmbGFnc1tpXSkgeworICAgICAgICAgICAgSVZJX0lOVl9TTEFOVDgoc3JjWzBdLCBzcmNbOF0sIHNyY1sxNl0sIHNyY1syNF0sIHNyY1szMl0sIHNyY1s0MF0sIHNyY1s0OF0sIHNyY1s1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMF0sIGRzdFs4XSwgZHN0WzE2XSwgZHN0WzI0XSwgZHN0WzMyXSwgZHN0WzQwXSwgZHN0WzQ4XSwgZHN0WzU2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGRzdFswXSA9IGRzdFs4XSA9IGRzdFsxNl0gPSBkc3RbMjRdID0gZHN0WzMyXSA9IGRzdFs0MF0gPSBkc3RbNDhdID0gZHN0WzU2XSA9IDA7CisKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgZHN0Kys7CisgICAgfQorI3VuZGVmIENPTVBFTlNBVEUKKworI2RlZmluZSBDT01QRU5TQVRFKHgpICgoKHgpICsgMSk+PjEpCisgICAgc3JjID0gdG1wOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgaWYgKCFzcmNbMF0gJiYgIXNyY1sxXSAmJiAhc3JjWzJdICYmICFzcmNbM10gJiYgIXNyY1s0XSAmJiAhc3JjWzVdICYmICFzcmNbNl0gJiYgIXNyY1s3XSkgeworICAgICAgICAgICAgbWVtc2V0KG91dCwgMCwgOCpzaXplb2Yob3V0WzBdKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJVklfSU5WX1NMQU5UOChzcmNbMF0sIHNyY1sxXSwgc3JjWzJdLCBzcmNbM10sIHNyY1s0XSwgc3JjWzVdLCBzcmNbNl0sIHNyY1s3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNV0sIG91dFs2XSwgb3V0WzddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LCB0OCk7CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IDg7CisgICAgICAgIG91dCArPSBwaXRjaDsKKyAgICB9CisjdW5kZWYgQ09NUEVOU0FURQorfQorCit2b2lkIGZmX2l2aV9pbnZlcnNlX3NsYW50XzR4NChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwgY29uc3QgdWludDhfdCAqZmxhZ3MpCit7CisgICAgaW50ICAgICBpOworICAgIGNvbnN0IGludDMyX3QgKnNyYzsKKyAgICBpbnQzMl90ICpkc3Q7CisgICAgaW50ICAgICB0bXBbMTZdOworICAgIGludCAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0OworCisjZGVmaW5lIENPTVBFTlNBVEUoeCkgKHgpCisgICAgc3JjID0gaW47CisgICAgZHN0ID0gdG1wOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaWYgKGZsYWdzW2ldKSB7CisgICAgICAgICAgICBJVklfSU5WX1NMQU5UNChzcmNbMF0sIHNyY1s0XSwgc3JjWzhdLCBzcmNbMTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzBdLCBkc3RbNF0sIGRzdFs4XSwgZHN0WzEyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHQwLCB0MSwgdDIsIHQzLCB0NCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZHN0WzBdID0gZHN0WzRdID0gZHN0WzhdID0gZHN0WzEyXSA9IDA7CisKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgZHN0Kys7CisgICAgfQorI3VuZGVmIENPTVBFTlNBVEUKKworI2RlZmluZSBDT01QRU5TQVRFKHgpICgoKHgpICsgMSk+PjEpCisgICAgc3JjID0gdG1wOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaWYgKCFzcmNbMF0gJiYgIXNyY1sxXSAmJiAhc3JjWzJdICYmICFzcmNbM10pIHsKKyAgICAgICAgICAgIG91dFswXSA9IG91dFsxXSA9IG91dFsyXSA9IG91dFszXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJVklfSU5WX1NMQU5UNChzcmNbMF0sIHNyY1sxXSwgc3JjWzJdLCBzcmNbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0MCwgdDEsIHQyLCB0MywgdDQpOworICAgICAgICB9CisgICAgICAgIHNyYyArPSA0OworICAgICAgICBvdXQgKz0gcGl0Y2g7CisgICAgfQorI3VuZGVmIENPTVBFTlNBVEUKK30KKwordm9pZCBmZl9pdmlfZGNfc2xhbnRfMmQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsIGludCBibGtfc2l6ZSkKK3sKKyAgICBpbnQgICAgIHgsIHk7CisgICAgaW50MTZfdCBkY19jb2VmZjsKKworICAgIGRjX2NvZWZmID0gKCppbiArIDEpID4+IDE7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgYmxrX3NpemU7IG91dCArPSBwaXRjaCwgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBibGtfc2l6ZTsgeCsrKQorICAgICAgICAgICAgb3V0W3hdID0gZGNfY29lZmY7CisgICAgfQorfQorCit2b2lkIGZmX2l2aV9yb3dfc2xhbnQ4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBjb25zdCB1aW50OF90ICpmbGFncykKK3sKKyAgICBpbnQgICAgIGk7CisgICAgaW50ICAgICB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4OworCisjZGVmaW5lIENPTVBFTlNBVEUoeCkgKCgoeCkgKyAxKT4+MSkKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGlmICghaW5bMF0gJiYgIWluWzFdICYmICFpblsyXSAmJiAhaW5bM10gJiYgIWluWzRdICYmICFpbls1XSAmJiAhaW5bNl0gJiYgIWluWzddKSB7CisgICAgICAgICAgICBtZW1zZXQob3V0LCAwLCA4KnNpemVvZihvdXRbMF0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIElWSV9JTlZfU0xBTlQ4KCBpblswXSwgIGluWzFdLCAgaW5bMl0sICBpblszXSwgIGluWzRdLCAgaW5bNV0sICBpbls2XSwgIGluWzddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSwgb3V0WzZdLCBvdXRbN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4KTsKKyAgICAgICAgfQorICAgICAgICBpbiArPSA4OworICAgICAgICBvdXQgKz0gcGl0Y2g7CisgICAgfQorI3VuZGVmIENPTVBFTlNBVEUKK30KKwordm9pZCBmZl9pdmlfZGNfcm93X3NsYW50KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBpbnQgYmxrX3NpemUpCit7CisgICAgaW50ICAgICB4LCB5OworICAgIGludDE2X3QgZGNfY29lZmY7CisKKyAgICBkY19jb2VmZiA9ICgqaW4gKyAxKSA+PiAxOworCisgICAgZm9yICh4ID0gMDsgeCA8IGJsa19zaXplOyB4KyspCisgICAgICAgIG91dFt4XSA9IGRjX2NvZWZmOworCisgICAgb3V0ICs9IHBpdGNoOworCisgICAgZm9yICh5ID0gMTsgeSA8IGJsa19zaXplOyBvdXQgKz0gcGl0Y2gsIHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYmxrX3NpemU7IHgrKykKKyAgICAgICAgICAgIG91dFt4XSA9IDA7CisgICAgfQorfQorCit2b2lkIGZmX2l2aV9jb2xfc2xhbnQ4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBjb25zdCB1aW50OF90ICpmbGFncykKK3sKKyAgICBpbnQgICAgIGksIHJvdzIsIHJvdzQsIHJvdzg7CisgICAgaW50ICAgICB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4OworCisgICAgcm93MiA9IHBpdGNoIDw8IDE7CisgICAgcm93NCA9IHBpdGNoIDw8IDI7CisgICAgcm93OCA9IHBpdGNoIDw8IDM7CisKKyNkZWZpbmUgQ09NUEVOU0FURSh4KSAoKCh4KSArIDEpPj4xKQorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgaWYgKGZsYWdzW2ldKSB7CisgICAgICAgICAgICBJVklfSU5WX1NMQU5UOChpblswXSwgaW5bOF0sIGluWzE2XSwgaW5bMjRdLCBpblszMl0sIGluWzQwXSwgaW5bNDhdLCBpbls1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbMF0sIG91dFtwaXRjaF0sIG91dFtyb3cyXSwgb3V0W3JvdzIgKyBwaXRjaF0sIG91dFtyb3c0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFtyb3c0ICsgcGl0Y2hdLCAgb3V0W3JvdzQgKyByb3cyXSwgb3V0W3JvdzggLSBwaXRjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dFswXSA9IG91dFtwaXRjaF0gPSBvdXRbcm93Ml0gPSBvdXRbcm93MiArIHBpdGNoXSA9IG91dFtyb3c0XSA9CisgICAgICAgICAgICBvdXRbcm93NCArIHBpdGNoXSA9ICBvdXRbcm93NCArIHJvdzJdID0gb3V0W3JvdzggLSBwaXRjaF0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaW4rKzsKKyAgICAgICAgb3V0Kys7CisgICAgfQorI3VuZGVmIENPTVBFTlNBVEUKK30KKwordm9pZCBmZl9pdmlfZGNfY29sX3NsYW50KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBpbnQgYmxrX3NpemUpCit7CisgICAgaW50ICAgICB4LCB5OworICAgIGludDE2X3QgZGNfY29lZmY7CisKKyAgICBkY19jb2VmZiA9ICgqaW4gKyAxKSA+PiAxOworCisgICAgZm9yICh5ID0gMDsgeSA8IGJsa19zaXplOyBvdXQgKz0gcGl0Y2gsIHkrKykgeworICAgICAgICBvdXRbMF0gPSBkY19jb2VmZjsKKyAgICAgICAgZm9yICh4ID0gMTsgeCA8IGJsa19zaXplOyB4KyspCisgICAgICAgICAgICBvdXRbeF0gPSAwOworICAgIH0KK30KKwordm9pZCBmZl9pdmlfcm93X3NsYW50NChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwgY29uc3QgdWludDhfdCAqZmxhZ3MpCit7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0OworCisjZGVmaW5lIENPTVBFTlNBVEUoeCkgKCgoeCkgKyAxKT4+MSkKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGlmICghaW5bMF0gJiYgIWluWzFdICYmICFpblsyXSAmJiAhaW5bM10pIHsKKyAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIDQqc2l6ZW9mKG91dFswXSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSVZJX0lOVl9TTEFOVDQoIGluWzBdLCAgaW5bMV0sICBpblsyXSwgIGluWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0KTsKKyAgICAgICAgfQorICAgICAgICBpbiAgKz0gNDsKKyAgICAgICAgb3V0ICs9IHBpdGNoOworICAgIH0KKyN1bmRlZiBDT01QRU5TQVRFCit9CisKK3ZvaWQgZmZfaXZpX2NvbF9zbGFudDQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKQoreworICAgIGludCAgICAgaSwgcm93MjsKKyAgICBpbnQgICAgIHQwLCB0MSwgdDIsIHQzLCB0NDsKKworICAgIHJvdzIgPSBwaXRjaCA8PCAxOworCisjZGVmaW5lIENPTVBFTlNBVEUoeCkgKCgoeCkgKyAxKT4+MSkKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGlmIChmbGFnc1tpXSkgeworICAgICAgICAgICAgSVZJX0lOVl9TTEFOVDQoaW5bMF0sIGluWzRdLCBpbls4XSwgaW5bMTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0WzBdLCBvdXRbcGl0Y2hdLCBvdXRbcm93Ml0sIG91dFtyb3cyICsgcGl0Y2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dFswXSA9IG91dFtwaXRjaF0gPSBvdXRbcm93Ml0gPSBvdXRbcm93MiArIHBpdGNoXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpbisrOworICAgICAgICBvdXQrKzsKKyAgICB9CisjdW5kZWYgQ09NUEVOU0FURQorfQorCit2b2lkIGZmX2l2aV9wdXRfcGl4ZWxzXzh4OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKQoreworICAgIGludCAgICAgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyBvdXQgKz0gcGl0Y2gsIGluICs9IDgsIHkrKykKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIG91dFt4XSA9IGluW3hdOworfQorCit2b2lkIGZmX2l2aV9wdXRfZGNfcGl4ZWxfOHg4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrX3NpemUpCit7CisgICAgaW50ICAgICB5OworCisgICAgb3V0WzBdID0gaW5bMF07CisgICAgbWVtc2V0KG91dCArIDEsIDAsIDcqc2l6ZW9mKG91dFswXSkpOworICAgIG91dCArPSBwaXRjaDsKKworICAgIGZvciAoeSA9IDE7IHkgPCA4OyBvdXQgKz0gcGl0Y2gsIHkrKykKKyAgICAgICAgbWVtc2V0KG91dCwgMCwgOCpzaXplb2Yob3V0WzBdKSk7Cit9CisKKyNkZWZpbmUgSVZJX01DX1RFTVBMQVRFKHNpemUsIHN1ZmZpeCwgT1ApIFwKK3N0YXRpYyB2b2lkIGl2aV9tY18gIyMgc2l6ZSAjI3gjIyBzaXplICMjIHN1ZmZpeChpbnQxNl90ICpidWYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkcGl0Y2gsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpyZWZfYnVmLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGl0Y2gsIGludCBtY190eXBlKSBcCit7IFwKKyAgICBpbnQgICAgIGksIGo7IFwKKyAgICBjb25zdCBpbnQxNl90ICp3cHRyOyBcCitcCisgICAgc3dpdGNoIChtY190eXBlKSB7IFwKKyAgICBjYXNlIDA6IC8qIGZ1bGxwZWwgKG5vIGludGVycG9sYXRpb24pICovIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKywgYnVmICs9IGRwaXRjaCwgcmVmX2J1ZiArPSBwaXRjaCkgeyBcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7XAorICAgICAgICAgICAgICAgIE9QKGJ1ZltqXSwgcmVmX2J1ZltqXSk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICAgICAgYnJlYWs7IFwKKyAgICBjYXNlIDE6IC8qIGhvcml6b250YWwgaGFsZnBlbCBpbnRlcnBvbGF0aW9uICovIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKywgYnVmICs9IGRwaXRjaCwgcmVmX2J1ZiArPSBwaXRjaCkgXAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgXAorICAgICAgICAgICAgICAgIE9QKGJ1ZltqXSwgKHJlZl9idWZbal0gKyByZWZfYnVmW2orMV0pID4+IDEpOyBcCisgICAgICAgIGJyZWFrOyBcCisgICAgY2FzZSAyOiAvKiB2ZXJ0aWNhbCBoYWxmcGVsIGludGVycG9sYXRpb24gKi8gXAorICAgICAgICB3cHRyID0gcmVmX2J1ZiArIHBpdGNoOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyssIGJ1ZiArPSBkcGl0Y2gsIHdwdHIgKz0gcGl0Y2gsIHJlZl9idWYgKz0gcGl0Y2gpIFwKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIFwKKyAgICAgICAgICAgICAgICBPUChidWZbal0sIChyZWZfYnVmW2pdICsgd3B0cltqXSkgPj4gMSk7IFwKKyAgICAgICAgYnJlYWs7IFwKKyAgICBjYXNlIDM6IC8qIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGhhbGZwZWwgaW50ZXJwb2xhdGlvbiAqLyBcCisgICAgICAgIHdwdHIgPSByZWZfYnVmICsgcGl0Y2g7IFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKywgYnVmICs9IGRwaXRjaCwgd3B0ciArPSBwaXRjaCwgcmVmX2J1ZiArPSBwaXRjaCkgXAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgXAorICAgICAgICAgICAgICAgIE9QKGJ1ZltqXSwgKHJlZl9idWZbal0gKyByZWZfYnVmW2orMV0gKyB3cHRyW2pdICsgd3B0cltqKzFdKSA+PiAyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIH0gXAorfSBcCitcCit2b2lkIGZmX2l2aV9tY18gIyMgc2l6ZSAjI3gjIyBzaXplICMjIHN1ZmZpeChpbnQxNl90ICpidWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpdGNoLCBpbnQgbWNfdHlwZSkgXAoreyBcCisgICAgaXZpX21jXyAjIyBzaXplICMjeCMjIHNpemUgIyMgc3VmZml4KGJ1ZiwgcGl0Y2gsIHJlZl9idWYsIHBpdGNoLCBtY190eXBlKTsgXAorfSBcCisKKyNkZWZpbmUgSVZJX01DX0FWR19URU1QTEFURShzaXplLCBzdWZmaXgsIE9QKSBcCit2b2lkIGZmX2l2aV9tY19hdmdfICMjIHNpemUgIyN4IyMgc2l6ZSAjIyBzdWZmaXgoaW50MTZfdCAqYnVmLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnJlZl9idWYyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGl0Y2gsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWNfdHlwZSwgaW50IG1jX3R5cGUyKSBcCit7IFwKKyAgICBpbnQxNl90IHRtcFtzaXplICogc2l6ZV07IFwKKyAgICBpbnQgaSwgajsgXAorXAorICAgIGl2aV9tY18gIyMgc2l6ZSAjI3gjIyBzaXplICMjIF9ub19kZWx0YSh0bXAsIHNpemUsIHJlZl9idWYsIHBpdGNoLCBtY190eXBlKTsgXAorICAgIGl2aV9tY18gIyMgc2l6ZSAjI3gjIyBzaXplICMjIF9kZWx0YSh0bXAsIHNpemUsIHJlZl9idWYyLCBwaXRjaCwgbWNfdHlwZTIpOyBcCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKywgYnVmICs9IHBpdGNoKSB7IFwKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykge1wKKyAgICAgICAgICAgIE9QKGJ1ZltqXSwgdG1wW2kgKiBzaXplICsgal0gPj4gMSk7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCit9IFwKKworI2RlZmluZSBPUF9QVVQoYSwgYikgIChhKSA9IChiKQorI2RlZmluZSBPUF9BREQoYSwgYikgIChhKSArPSAoYikKKworSVZJX01DX1RFTVBMQVRFKDgsIF9ub19kZWx0YSwgT1BfUFVUKQorSVZJX01DX1RFTVBMQVRFKDgsIF9kZWx0YSwgICAgT1BfQUREKQorSVZJX01DX1RFTVBMQVRFKDQsIF9ub19kZWx0YSwgT1BfUFVUKQorSVZJX01DX1RFTVBMQVRFKDQsIF9kZWx0YSwgICAgT1BfQUREKQorSVZJX01DX0FWR19URU1QTEFURSg4LCBfbm9fZGVsdGEsIE9QX1BVVCkKK0lWSV9NQ19BVkdfVEVNUExBVEUoOCwgX2RlbHRhLCAgICBPUF9BREQpCitJVklfTUNfQVZHX1RFTVBMQVRFKDQsIF9ub19kZWx0YSwgT1BfUFVUKQorSVZJX01DX0FWR19URU1QTEFURSg0LCBfZGVsdGEsICAgIE9QX0FERCkKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2l2aV9kc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2l2aV9kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTU2MmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvaXZpX2RzcC5oCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogRFNQIGZ1bmN0aW9ucyBmb3IgSW5kZW8gVmlkZW8gSW50ZXJhY3RpdmUgY29kZWNzIChJbmRlbzQgYW5kIEluZGVvNSkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBNYXhpbSBQb2xpYWtvdnNraQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBEU1AgZnVuY3Rpb25zIChpbnZlcnNlIHRyYW5zZm9ybXMsIG1vdGlvbiBjb21wZW5zYXRpb25zLCB3YXZlbGV0IHJlY29tcG9zdGlvbikKKyAqIGZvciBJbmRlbyBWaWRlbyBJbnRlcmFjdGl2ZSBjb2RlY3MuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0lWSV9EU1BfSAorI2RlZmluZSBBVkNPREVDX0lWSV9EU1BfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIml2aV9jb21tb24uaCIKKworLyoqCisgKiAgNS8zIHdhdmVsZXQgcmVjb21wb3NpdGlvbiBmaWx0ZXIgZm9yIEluZGVvNQorICoKKyAqICBAcGFyYW1baW5dICAgcGxhbmUgICAgICAgIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHBsYW5lIGJlaW5nIHByb2Nlc3NlZAorICogIEBwYXJhbVtvdXRdICBkc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiAgQHBhcmFtW2luXSAgIGRzdF9waXRjaCAgICBwaXRjaCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKi8KK3ZvaWQgZmZfaXZpX3JlY29tcG9zZTUzKGNvbnN0IElWSVBsYW5lRGVzYyAqcGxhbmUsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkc3RfcGl0Y2gpOworCisvKioKKyAqICBIYWFyIHdhdmVsZXQgcmVjb21wb3NpdGlvbiBmaWx0ZXIgZm9yIEluZGVvIDQKKyAqCisgKiAgQHBhcmFtW2luXSAgcGxhbmUgICAgICAgIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHBsYW5lIGJlaW5nIHByb2Nlc3NlZAorICogIEBwYXJhbVtvdXRdIGRzdCAgICAgICAgICBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqICBAcGFyYW1baW5dICBkc3RfcGl0Y2ggICAgcGl0Y2ggb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICovCit2b2lkIGZmX2l2aV9yZWNvbXBvc2VfaGFhcihjb25zdCBJVklQbGFuZURlc2MgKnBsYW5lLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZHN0X3BpdGNoKTsKKworLyoqCisgKiAgdHdvLWRpbWVuc2lvbmFsIGludmVyc2UgSGFhciA4eDggdHJhbnNmb3JtIGZvciBJbmRlbyA0CisgKgorICogIEBwYXJhbVtpbl0gIGluICAgICAgICBwb2ludGVyIHRvIHRoZSB2ZWN0b3Igb2YgdHJhbnNmb3JtIGNvZWZmaWNpZW50cworICogIEBwYXJhbVtvdXRdIG91dCAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyIChmcmFtZSkKKyAqICBAcGFyYW1baW5dICBwaXRjaCAgICAgcGl0Y2ggdG8gbW92ZSB0byB0aGUgbmV4dCB5IGxpbmUKKyAqICBAcGFyYW1baW5dICBmbGFncyAgICAgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgY29sdW1uIGZsYWdzOgorICogICAgICAgICAgICAgICAgICAgICAgICAhPSAwIC0gbm9uX2VtcHR5IGNvbHVtbiwgMCAtIGVtcHR5IG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBhcnJheSBtdXN0IGJlIGZpbGxlZCBieSBjYWxsZXIpCisgKi8KK3ZvaWQgZmZfaXZpX2ludmVyc2VfaGFhcl84eDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKTsKK3ZvaWQgZmZfaXZpX2ludmVyc2VfaGFhcl84eDEoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKTsKK3ZvaWQgZmZfaXZpX2ludmVyc2VfaGFhcl8xeDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKTsKKworLyoqCisgKiAgb25lLWRpbWVuc2lvbmFsIGludmVyc2UgOC1wb2ludCBIYWFyIHRyYW5zZm9ybSBvbiByb3dzIGZvciBJbmRlbyA0CisgKgorICogIEBwYXJhbVtpbl0gIGluICAgICAgICBwb2ludGVyIHRvIHRoZSB2ZWN0b3Igb2YgdHJhbnNmb3JtIGNvZWZmaWNpZW50cworICogIEBwYXJhbVtvdXRdIG91dCAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyIChmcmFtZSkKKyAqICBAcGFyYW1baW5dICBwaXRjaCAgICAgcGl0Y2ggdG8gbW92ZSB0byB0aGUgbmV4dCB5IGxpbmUKKyAqICBAcGFyYW1baW5dICBmbGFncyAgICAgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgY29sdW1uIGZsYWdzOgorICogICAgICAgICAgICAgICAgICAgICAgICAhPSAwIC0gbm9uX2VtcHR5IGNvbHVtbiwgMCAtIGVtcHR5IG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBhcnJheSBtdXN0IGJlIGZpbGxlZCBieSBjYWxsZXIpCisgKi8KK3ZvaWQgZmZfaXZpX3Jvd19oYWFyOChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CisKKy8qKgorICogIG9uZS1kaW1lbnNpb25hbCBpbnZlcnNlIDgtcG9pbnQgSGFhciB0cmFuc2Zvcm0gb24gY29sdW1ucyBmb3IgSW5kZW8gNAorICoKKyAqICBAcGFyYW1baW5dICBpbiAgICAgICAgcG9pbnRlciB0byB0aGUgdmVjdG9yIG9mIHRyYW5zZm9ybSBjb2VmZmljaWVudHMKKyAqICBAcGFyYW1bb3V0XSBvdXQgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlciAoZnJhbWUpCisgKiAgQHBhcmFtW2luXSAgcGl0Y2ggICAgIHBpdGNoIHRvIG1vdmUgdG8gdGhlIG5leHQgeSBsaW5lCisgKiAgQHBhcmFtW2luXSAgZmxhZ3MgICAgIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIGNvbHVtbiBmbGFnczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCAtIG5vbl9lbXB0eSBjb2x1bW4sIDAgLSBlbXB0eSBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXJyYXkgbXVzdCBiZSBmaWxsZWQgYnkgY2FsbGVyKQorICovCit2b2lkIGZmX2l2aV9jb2xfaGFhcjgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpOworCisvKioKKyAqICB0d28tZGltZW5zaW9uYWwgaW52ZXJzZSBIYWFyIDR4NCB0cmFuc2Zvcm0gZm9yIEluZGVvIDQKKyAqCisgKiAgQHBhcmFtW2luXSAgaW4gICAgICAgIHBvaW50ZXIgdG8gdGhlIHZlY3RvciBvZiB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCisgKiAgQHBhcmFtW291dF0gb3V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIgKGZyYW1lKQorICogIEBwYXJhbVtpbl0gIHBpdGNoICAgICBwaXRjaCB0byBtb3ZlIHRvIHRoZSBuZXh0IHkgbGluZQorICogIEBwYXJhbVtpbl0gIGZsYWdzICAgICBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBjb2x1bW4gZmxhZ3M6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICE9IDAgLSBub25fZW1wdHkgY29sdW1uLCAwIC0gZW1wdHkgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFycmF5IG11c3QgYmUgZmlsbGVkIGJ5IGNhbGxlcikKKyAqLwordm9pZCBmZl9pdmlfaW52ZXJzZV9oYWFyXzR4NChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpOworCisvKioKKyAqICBvbmUtZGltZW5zaW9uYWwgaW52ZXJzZSA0LXBvaW50IEhhYXIgdHJhbnNmb3JtIG9uIHJvd3MgZm9yIEluZGVvIDQKKyAqCisgKiAgQHBhcmFtW2luXSAgaW4gICAgICAgIHBvaW50ZXIgdG8gdGhlIHZlY3RvciBvZiB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCisgKiAgQHBhcmFtW291dF0gb3V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIgKGZyYW1lKQorICogIEBwYXJhbVtpbl0gIHBpdGNoICAgICBwaXRjaCB0byBtb3ZlIHRvIHRoZSBuZXh0IHkgbGluZQorICogIEBwYXJhbVtpbl0gIGZsYWdzICAgICBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBjb2x1bW4gZmxhZ3M6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICE9IDAgLSBub25fZW1wdHkgY29sdW1uLCAwIC0gZW1wdHkgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFycmF5IG11c3QgYmUgZmlsbGVkIGJ5IGNhbGxlcikKKyAqLwordm9pZCBmZl9pdmlfcm93X2hhYXI0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKTsKKworLyoqCisgKiAgb25lLWRpbWVuc2lvbmFsIGludmVyc2UgNC1wb2ludCBIYWFyIHRyYW5zZm9ybSBvbiBjb2x1bW5zIGZvciBJbmRlbyA0CisgKgorICogIEBwYXJhbVtpbl0gIGluICAgICAgICBwb2ludGVyIHRvIHRoZSB2ZWN0b3Igb2YgdHJhbnNmb3JtIGNvZWZmaWNpZW50cworICogIEBwYXJhbVtvdXRdIG91dCAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyIChmcmFtZSkKKyAqICBAcGFyYW1baW5dICBwaXRjaCAgICAgcGl0Y2ggdG8gbW92ZSB0byB0aGUgbmV4dCB5IGxpbmUKKyAqICBAcGFyYW1baW5dICBmbGFncyAgICAgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgY29sdW1uIGZsYWdzOgorICogICAgICAgICAgICAgICAgICAgICAgICAhPSAwIC0gbm9uX2VtcHR5IGNvbHVtbiwgMCAtIGVtcHR5IG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBhcnJheSBtdXN0IGJlIGZpbGxlZCBieSBjYWxsZXIpCisgKi8KK3ZvaWQgZmZfaXZpX2NvbF9oYWFyNChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CisKKy8qKgorICogIERDLW9ubHkgdHdvLWRpbWVuc2lvbmFsIGludmVyc2UgSGFhciB0cmFuc2Zvcm0gZm9yIEluZGVvIDQuCisgKiAgUGVyZm9ybWluZyB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0gaW4gdGhpcyBjYXNlIGlzIGVxdWl2YWxlbnQgdG8KKyAqICBzcHJlYWRpbmcgRENfY29lZmYgPj4gMyBvdmVyIHRoZSB3aG9sZSBibG9jay4KKyAqCisgKiAgQHBhcmFtW2luXSAgaW4gICAgICAgICAgcG9pbnRlciB0byB0aGUgZGMgY29lZmZpY2llbnQKKyAqICBAcGFyYW1bb3V0XSBvdXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyIChmcmFtZSkKKyAqICBAcGFyYW1baW5dICBwaXRjaCAgICAgICBwaXRjaCB0byBtb3ZlIHRvIHRoZSBuZXh0IHkgbGluZQorICogIEBwYXJhbVtpbl0gIGJsa19zaXplICAgIHRyYW5zZm9ybSBibG9jayBzaXplCisgKi8KK3ZvaWQgZmZfaXZpX2RjX2hhYXJfMmQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBibGtfc2l6ZSk7CisKKy8qKgorICogIHR3by1kaW1lbnNpb25hbCBpbnZlcnNlIHNsYW50IDh4OCB0cmFuc2Zvcm0KKyAqCisgKiAgQHBhcmFtW2luXSAgICBpbiAgICAgIHBvaW50ZXIgdG8gdGhlIHZlY3RvciBvZiB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCisgKiAgQHBhcmFtW291dF0gICBvdXQgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIgKGZyYW1lKQorICogIEBwYXJhbVtpbl0gICAgcGl0Y2ggICBwaXRjaCB0byBtb3ZlIHRvIHRoZSBuZXh0IHkgbGluZQorICogIEBwYXJhbVtpbl0gICAgZmxhZ3MgICBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBjb2x1bW4gZmxhZ3M6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICE9IDAgLSBub25fZW1wdHkgY29sdW1uLCAwIC0gZW1wdHkgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFycmF5IG11c3QgYmUgZmlsbGVkIGJ5IGNhbGxlcikKKyAqLwordm9pZCBmZl9pdmlfaW52ZXJzZV9zbGFudF84eDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CisKKy8qKgorICogIHR3by1kaW1lbnNpb25hbCBpbnZlcnNlIHNsYW50IDR4NCB0cmFuc2Zvcm0KKyAqCisgKiAgQHBhcmFtW2luXSAgICBpbiAgICAgIHBvaW50ZXIgdG8gdGhlIHZlY3RvciBvZiB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCisgKiAgQHBhcmFtW291dF0gICBvdXQgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIgKGZyYW1lKQorICogIEBwYXJhbVtpbl0gICAgcGl0Y2ggICBwaXRjaCB0byBtb3ZlIHRvIHRoZSBuZXh0IHkgbGluZQorICogIEBwYXJhbVtpbl0gICAgZmxhZ3MgICBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBjb2x1bW4gZmxhZ3M6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICE9IDAgLSBub25fZW1wdHkgY29sdW1uLCAwIC0gZW1wdHkgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFycmF5IG11c3QgYmUgZmlsbGVkIGJ5IGNhbGxlcikKKyAqLwordm9pZCBmZl9pdmlfaW52ZXJzZV9zbGFudF80eDQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CisKKy8qKgorICogIERDLW9ubHkgdHdvLWRpbWVuc2lvbmFsIGludmVyc2Ugc2xhbnQgdHJhbnNmb3JtLgorICogIFBlcmZvcm1pbmcgdGhlIGludmVyc2Ugc2xhbnQgdHJhbnNmb3JtIGluIHRoaXMgY2FzZSBpcyBlcXVpdmFsZW50IHRvCisgKiAgc3ByZWFkaW5nIChEQ19jb2VmZiArIDEpLzIgb3ZlciB0aGUgd2hvbGUgYmxvY2suCisgKiAgSXQgd29ya3MgbXVjaCBmYXN0ZXIgdGhhbiBwZXJmb3JtaW5nIHRoZSBzbGFudCB0cmFuc2Zvcm0gb24gYSB2ZWN0b3Igb2YgemVyb2VzLgorICoKKyAqICBAcGFyYW1baW5dICAgIGluICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGRjIGNvZWZmaWNpZW50CisgKiAgQHBhcmFtW291dF0gICBvdXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyIChmcmFtZSkKKyAqICBAcGFyYW1baW5dICAgIHBpdGNoICAgICAgIHBpdGNoIHRvIG1vdmUgdG8gdGhlIG5leHQgeSBsaW5lCisgKiAgQHBhcmFtW2luXSAgICBibGtfc2l6ZSAgICB0cmFuc2Zvcm0gYmxvY2sgc2l6ZQorICovCit2b2lkIGZmX2l2aV9kY19zbGFudF8yZChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwgaW50IGJsa19zaXplKTsKKworLyoqCisgKiAgaW52ZXJzZSAxRCByb3cgc2xhbnQgdHJhbnNmb3JtCisgKgorICogIEBwYXJhbVtpbl0gICAgaW4gICAgICBwb2ludGVyIHRvIHRoZSB2ZWN0b3Igb2YgdHJhbnNmb3JtIGNvZWZmaWNpZW50cworICogIEBwYXJhbVtvdXRdICAgb3V0ICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyIChmcmFtZSkKKyAqICBAcGFyYW1baW5dICAgIHBpdGNoICAgcGl0Y2ggdG8gbW92ZSB0byB0aGUgbmV4dCB5IGxpbmUKKyAqICBAcGFyYW1baW5dICAgIGZsYWdzICAgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgY29sdW1uIGZsYWdzICh1bnVzZWQgaGVyZSkKKyAqLwordm9pZCBmZl9pdmlfcm93X3NsYW50OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpOworCisvKioKKyAqICBpbnZlcnNlIDFEIGNvbHVtbiBzbGFudCB0cmFuc2Zvcm0KKyAqCisgKiAgQHBhcmFtW2luXSAgICBpbiAgICAgIHBvaW50ZXIgdG8gdGhlIHZlY3RvciBvZiB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCisgKiAgQHBhcmFtW291dF0gICBvdXQgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIgKGZyYW1lKQorICogIEBwYXJhbVtpbl0gICAgcGl0Y2ggICBwaXRjaCB0byBtb3ZlIHRvIHRoZSBuZXh0IHkgbGluZQorICogIEBwYXJhbVtpbl0gICAgZmxhZ3MgICBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBjb2x1bW4gZmxhZ3M6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICE9IDAgLSBub25fZW1wdHkgY29sdW1uLCAwIC0gZW1wdHkgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFycmF5IG11c3QgYmUgZmlsbGVkIGJ5IGNhbGxlcikKKyAqLwordm9pZCBmZl9pdmlfY29sX3NsYW50OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpOworCisvKioKKyAqICBpbnZlcnNlIDFEIHJvdyBzbGFudCB0cmFuc2Zvcm0KKyAqCisgKiAgQHBhcmFtW2luXSAgICBpbiAgICAgIHBvaW50ZXIgdG8gdGhlIHZlY3RvciBvZiB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCisgKiAgQHBhcmFtW291dF0gICBvdXQgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIgKGZyYW1lKQorICogIEBwYXJhbVtpbl0gICAgcGl0Y2ggICBwaXRjaCB0byBtb3ZlIHRvIHRoZSBuZXh0IHkgbGluZQorICogIEBwYXJhbVtpbl0gICAgZmxhZ3MgICBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBjb2x1bW4gZmxhZ3MgKHVudXNlZCBoZXJlKQorICovCit2b2lkIGZmX2l2aV9yb3dfc2xhbnQ0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CisKKy8qKgorICogIGludmVyc2UgMUQgY29sdW1uIHNsYW50IHRyYW5zZm9ybQorICoKKyAqICBAcGFyYW1baW5dICAgIGluICAgICAgcG9pbnRlciB0byB0aGUgdmVjdG9yIG9mIHRyYW5zZm9ybSBjb2VmZmljaWVudHMKKyAqICBAcGFyYW1bb3V0XSAgIG91dCAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlciAoZnJhbWUpCisgKiAgQHBhcmFtW2luXSAgICBwaXRjaCAgIHBpdGNoIHRvIG1vdmUgdG8gdGhlIG5leHQgeSBsaW5lCisgKiAgQHBhcmFtW2luXSAgICBmbGFncyAgIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIGNvbHVtbiBmbGFnczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCAtIG5vbl9lbXB0eSBjb2x1bW4sIDAgLSBlbXB0eSBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXJyYXkgbXVzdCBiZSBmaWxsZWQgYnkgY2FsbGVyKQorICovCit2b2lkIGZmX2l2aV9jb2xfc2xhbnQ0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CisKKy8qKgorICogIERDLW9ubHkgaW52ZXJzZSByb3cgc2xhbnQgdHJhbnNmb3JtCisgKi8KK3ZvaWQgZmZfaXZpX2RjX3Jvd19zbGFudChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwgaW50IGJsa19zaXplKTsKKworLyoqCisgKiAgREMtb25seSBpbnZlcnNlIGNvbHVtbiBzbGFudCB0cmFuc2Zvcm0KKyAqLwordm9pZCBmZl9pdmlfZGNfY29sX3NsYW50KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBpbnQgYmxrX3NpemUpOworCisvKioKKyAqICBDb3B5IHRoZSBwaXhlbHMgaW50byB0aGUgZnJhbWUgYnVmZmVyLgorICovCit2b2lkIGZmX2l2aV9wdXRfcGl4ZWxzXzh4OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwgY29uc3QgdWludDhfdCAqZmxhZ3MpOworCisvKioKKyAqICBDb3B5IHRoZSBEQyBjb2VmZmljaWVudCBpbnRvIHRoZSBmaXJzdCBwaXhlbCBvZiB0aGUgYmxvY2sgYW5kCisgKiAgemVybyBhbGwgb3RoZXJzLgorICovCit2b2lkIGZmX2l2aV9wdXRfZGNfcGl4ZWxfOHg4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBpbnQgYmxrX3NpemUpOworCisvKioKKyAqICA4eDggYmxvY2sgbW90aW9uIGNvbXBlbnNhdGlvbiB3aXRoIGFkZGluZyBkZWx0YQorICoKKyAqICBAcGFyYW1baW4sb3V0XSAgIGJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBjdXJyZW50IGZyYW1lIGJ1ZmZlciBjb250YWluaW5nIGRlbHRhCisgKiAgQHBhcmFtW2luXSAgICAgICByZWZfYnVmICBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgZnJhbWUKKyAqICBAcGFyYW1baW5dICAgICAgIHBpdGNoICAgIHBpdGNoIGZvciBtb3ZpbmcgdG8gdGhlIG5leHQgeSBsaW5lCisgKiAgQHBhcmFtW2luXSAgICAgICBtY190eXBlICBpbnRlcnBvbGF0aW9uIHR5cGUKKyAqLwordm9pZCBmZl9pdmlfbWNfOHg4X2RlbHRhKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgdWludDMyX3QgcGl0Y2gsIGludCBtY190eXBlKTsKKworLyoqCisgKiAgNHg0IGJsb2NrIG1vdGlvbiBjb21wZW5zYXRpb24gd2l0aCBhZGRpbmcgZGVsdGEKKyAqCisgKiAgQHBhcmFtW2luLG91dF0gICBidWYgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgY3VycmVudCBmcmFtZSBidWZmZXIgY29udGFpbmluZyBkZWx0YQorICogIEBwYXJhbVtpbl0gICAgICAgcmVmX2J1ZiAgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyBibG9jayBpbiB0aGUgcmVmZXJlbmNlIGZyYW1lCisgKiAgQHBhcmFtW2luXSAgICAgICBwaXRjaCAgICBwaXRjaCBmb3IgbW92aW5nIHRvIHRoZSBuZXh0IHkgbGluZQorICogIEBwYXJhbVtpbl0gICAgICAgbWNfdHlwZSAgaW50ZXJwb2xhdGlvbiB0eXBlCisgKi8KK3ZvaWQgZmZfaXZpX21jXzR4NF9kZWx0YShpbnQxNl90ICpidWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYsIHVpbnQzMl90IHBpdGNoLCBpbnQgbWNfdHlwZSk7CisKKy8qKgorICogIG1vdGlvbiBjb21wZW5zYXRpb24gd2l0aG91dCBhZGRpbmcgZGVsdGEKKyAqCisgKiAgQHBhcmFtW2luLG91dF0gIGJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBjdXJyZW50IGZyYW1lIHJlY2VpdmluZyB0aGUgcmVzdWx0CisgKiAgQHBhcmFtW2luXSAgICAgIHJlZl9idWYgIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZQorICogIEBwYXJhbVtpbl0gICAgICBwaXRjaCAgICBwaXRjaCBmb3IgbW92aW5nIHRvIHRoZSBuZXh0IHkgbGluZQorICogIEBwYXJhbVtpbl0gICAgICBtY190eXBlICBpbnRlcnBvbGF0aW9uIHR5cGUKKyAqLwordm9pZCBmZl9pdmlfbWNfOHg4X25vX2RlbHRhKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgdWludDMyX3QgcGl0Y2gsIGludCBtY190eXBlKTsKKworLyoqCisgKiAgNHg0IGJsb2NrIG1vdGlvbiBjb21wZW5zYXRpb24gd2l0aG91dCBhZGRpbmcgZGVsdGEKKyAqCisgKiAgQHBhcmFtW2luLG91dF0gIGJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBjdXJyZW50IGZyYW1lIHJlY2VpdmluZyB0aGUgcmVzdWx0CisgKiAgQHBhcmFtW2luXSAgICAgIHJlZl9idWYgIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZQorICogIEBwYXJhbVtpbl0gICAgICBwaXRjaCAgICBwaXRjaCBmb3IgbW92aW5nIHRvIHRoZSBuZXh0IHkgbGluZQorICogIEBwYXJhbVtpbl0gICAgICBtY190eXBlICBpbnRlcnBvbGF0aW9uIHR5cGUKKyAqLwordm9pZCBmZl9pdmlfbWNfNHg0X25vX2RlbHRhKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgdWludDMyX3QgcGl0Y2gsIGludCBtY190eXBlKTsKKworLyoqCisgKiAgOHg4IGJsb2NrIG1vdGlvbiBjb21wZW5zYXRpb24gd2l0aCBhZGRpbmcgZGVsdGEKKyAqCisgKiAgQHBhcmFtW2luLG91dF0gIGJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBjdXJyZW50IGZyYW1lIGJ1ZmZlciBjb250YWluaW5nIGRlbHRhCisgKiAgQHBhcmFtW2luXSAgICAgIHJlZl9idWYgIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaW4gdGhlIGJhY2t3YXJkIHJlZmVyZW5jZSBmcmFtZQorICogIEBwYXJhbVtpbl0gICAgICByZWZfYnVmMiBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGluIHRoZSBmb3J3YXJkIHJlZmVyZW5jZSBmcmFtZQorICogIEBwYXJhbVtpbl0gICAgICBwaXRjaCAgICBwaXRjaCBmb3IgbW92aW5nIHRvIHRoZSBuZXh0IHkgbGluZQorICogIEBwYXJhbVtpbl0gICAgICBtY190eXBlICBpbnRlcnBvbGF0aW9uIHR5cGUgZm9yIGJhY2t3YXJkIHJlZmVyZW5jZQorICogIEBwYXJhbVtpbl0gICAgICBtY190eXBlMiBpbnRlcnBvbGF0aW9uIHR5cGUgZm9yIGZvcndhcmQgcmVmZXJlbmNlCisgKi8KK3ZvaWQgZmZfaXZpX21jX2F2Z184eDhfZGVsdGEoaW50MTZfdCAqYnVmLCBjb25zdCBpbnQxNl90ICpyZWZfYnVmLCBjb25zdCBpbnQxNl90ICpyZWZfYnVmMiwgdWludDMyX3QgcGl0Y2gsIGludCBtY190eXBlLCBpbnQgbWNfdHlwZTIpOworCisvKioKKyAqICA0eDQgYmxvY2sgbW90aW9uIGNvbXBlbnNhdGlvbiB3aXRoIGFkZGluZyBkZWx0YQorICoKKyAqICBAcGFyYW1baW4sb3V0XSAgYnVmICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGN1cnJlbnQgZnJhbWUgYnVmZmVyIGNvbnRhaW5pbmcgZGVsdGEKKyAqICBAcGFyYW1baW5dICAgICAgcmVmX2J1ZiAgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyBibG9jayBpbiB0aGUgYmFja3dhcmQgcmVmZXJlbmNlIGZyYW1lCisgKiAgQHBhcmFtW2luXSAgICAgIHJlZl9idWYyIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaW4gdGhlIGZvcndhcmQgcmVmZXJlbmNlIGZyYW1lCisgKiAgQHBhcmFtW2luXSAgICAgIHBpdGNoICAgIHBpdGNoIGZvciBtb3ZpbmcgdG8gdGhlIG5leHQgeSBsaW5lCisgKiAgQHBhcmFtW2luXSAgICAgIG1jX3R5cGUgIGludGVycG9sYXRpb24gdHlwZSBmb3IgYmFja3dhcmQgcmVmZXJlbmNlCisgKiAgQHBhcmFtW2luXSAgICAgIG1jX3R5cGUyIGludGVycG9sYXRpb24gdHlwZSBmb3IgZm9yd2FyZCByZWZlcmVuY2UKKyAqLwordm9pZCBmZl9pdmlfbWNfYXZnXzR4NF9kZWx0YShpbnQxNl90ICpidWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYyLCB1aW50MzJfdCBwaXRjaCwgaW50IG1jX3R5cGUsIGludCBtY190eXBlMik7CisKKy8qKgorICogIG1vdGlvbiBjb21wZW5zYXRpb24gd2l0aG91dCBhZGRpbmcgZGVsdGEgZm9yIEItZnJhbWVzCisgKgorICogIEBwYXJhbVtpbixvdXRdICBidWYgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgY3VycmVudCBmcmFtZSByZWNlaXZpbmcgdGhlIHJlc3VsdAorICogIEBwYXJhbVtpbl0gICAgICByZWZfYnVmICBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGluIHRoZSBiYWNrd2FyZCByZWZlcmVuY2UgZnJhbWUKKyAqICBAcGFyYW1baW5dICAgICAgcmVmX2J1ZjIgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyBibG9jayBpbiB0aGUgZm9yd2FyZCByZWZlcmVuY2UgZnJhbWUKKyAqICBAcGFyYW1baW5dICAgICAgcGl0Y2ggICAgcGl0Y2ggZm9yIG1vdmluZyB0byB0aGUgbmV4dCB5IGxpbmUKKyAqICBAcGFyYW1baW5dICAgICAgbWNfdHlwZSAgaW50ZXJwb2xhdGlvbiB0eXBlIGZvciBiYWNrd2FyZCByZWZlcmVuY2UKKyAqICBAcGFyYW1baW5dICAgICAgbWNfdHlwZTIgaW50ZXJwb2xhdGlvbiB0eXBlIGZvciBmb3J3YXJkIHJlZmVyZW5jZQorICovCit2b2lkIGZmX2l2aV9tY19hdmdfOHg4X25vX2RlbHRhKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZjIsIHVpbnQzMl90IHBpdGNoLCBpbnQgbWNfdHlwZSwgaW50IG1jX3R5cGUyKTsKKworLyoqCisgKiAgNHg0IGJsb2NrIG1vdGlvbiBjb21wZW5zYXRpb24gd2l0aG91dCBhZGRpbmcgZGVsdGEgZm9yIEItZnJhbWVzCisgKgorICogIEBwYXJhbVtpbixvdXRdICBidWYgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgY3VycmVudCBmcmFtZSByZWNlaXZpbmcgdGhlIHJlc3VsdAorICogIEBwYXJhbVtpbl0gICAgICByZWZfYnVmICBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGluIHRoZSBiYWNrd2FyZCByZWZlcmVuY2UgZnJhbWUKKyAqICBAcGFyYW1baW5dICAgICAgcmVmX2J1ZjIgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyBibG9jayBpbiB0aGUgZm9yd2FyZCByZWZlcmVuY2UgZnJhbWUKKyAqICBAcGFyYW1baW5dICAgICAgcGl0Y2ggICAgcGl0Y2ggZm9yIG1vdmluZyB0byB0aGUgbmV4dCB5IGxpbmUKKyAqICBAcGFyYW1baW5dICAgICAgbWNfdHlwZSAgaW50ZXJwb2xhdGlvbiB0eXBlIGZvciBiYWNrd2FyZCByZWZlcmVuY2UKKyAqICBAcGFyYW1baW5dICAgICAgbWNfdHlwZTIgaW50ZXJwb2xhdGlvbiB0eXBlIGZvciBmb3J3YXJkIHJlZmVyZW5jZQorICovCit2b2lkIGZmX2l2aV9tY19hdmdfNHg0X25vX2RlbHRhKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZjIsIHVpbnQzMl90IHBpdGNoLCBpbnQgbWNfdHlwZSwgaW50IG1jX3R5cGUyKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSVZJX0RTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9qMmtlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2oya2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYjBiNjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9qMmtlbmMuYwpAQCAtMCwwICsxLDEwNTUgQEAKKy8qCisgKiBKUEVHMjAwMCBpbWFnZSBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS2FtaWwgTm93b3NhZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEpQRUcyMDAwIGltYWdlIGVuY29kZXIKKyAqIEBmaWxlCisgKiBAYXV0aG9yIEthbWlsIE5vd29zYWQKKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAianBlZzIwMDAuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKyNkZWZpbmUgTk1TRURFQ19CSVRTIDcKKyNkZWZpbmUgTk1TRURFQ19GUkFDQklUUyAoTk1TRURFQ19CSVRTLTEpCisjZGVmaW5lIFdNU0VERUNfU0hJRlQgMTMgLy8vPCBtdXN0IGJlID49IDEzCisjZGVmaW5lIExBTUJEQV9TQ0FMRSAoMTAwMDAwMDAwTEwgPDwgKFdNU0VERUNfU0hJRlQgLSAxMykpCisKK3N0YXRpYyBpbnQgbHV0X25tc2VkZWNfcmVmIFsxPDxOTVNFREVDX0JJVFNdLAorICAgICAgICAgICBsdXRfbm1zZWRlY19yZWYwWzE8PE5NU0VERUNfQklUU10sCisgICAgICAgICAgIGx1dF9ubXNlZGVjX3NpZyBbMTw8Tk1TRURFQ19CSVRTXSwKKyAgICAgICAgICAgbHV0X25tc2VkZWNfc2lnMFsxPDxOTVNFREVDX0JJVFNdOworCitzdGF0aWMgY29uc3QgaW50IGR3dF9ub3Jtc1syXVs0XVsxMF0gPSB7IC8vIFtkd3RfdHlwZV1bYmFuZF1bcmxldmVsXSAobXVsdGlwbGllZCBieSAxMDAwMCkKKyAgICB7ezEwMDAwLCAxOTY1MCwgNDE3NzAsICA4NDAzMCwgMTY5MDAwLCAzMzg0MDAsICA2NzY5MDAsIDEzNTMwMDAsIDI3MDYwMDAsIDU0MDkwMDB9LAorICAgICB7MjAyMjAsIDM5ODkwLCA4MzU1MCwgMTcwNDAwLCAzNDI3MDAsIDY4NjMwMCwgMTM3MzAwMCwgMjc0NjAwMCwgNTQ5MDAwMH0sCisgICAgIHsyMDIyMCwgMzk4OTAsIDgzNTUwLCAxNzA0MDAsIDM0MjcwMCwgNjg2MzAwLCAxMzczMDAwLCAyNzQ2MDAwLCA1NDkwMDAwfSwKKyAgICAgezIwODAwLCAzODY1MCwgODMwNzAsIDE3MTgwMCwgMzQ3MTAwLCA2OTU5MDAsIDEzOTMwMDAsIDI3ODYwMDAsIDU1NzIwMDB9fSwKKworICAgIHt7MTAwMDAsIDE1MDAwLCAyNzUwMCwgNTM3NTAsIDEwNjgwMCwgMjEzNDAwLCA0MjY3MDAsIDg1MzMwMCwgMTcwNzAwMCwgMzQxMzAwMH0sCisgICAgIHsxMDM4MCwgMTU5MjAsIDI5MTkwLCA1NzAzMCwgMTEzMzAwLCAyMjY0MDAsIDQ1MjUwMCwgOTA0ODAwLCAxODA5MDAwfSwKKyAgICAgezEwMzgwLCAxNTkyMCwgMjkxOTAsIDU3MDMwLCAxMTMzMDAsIDIyNjQwMCwgNDUyNTAwLCA5MDQ4MDAsIDE4MDkwMDB9LAorICAgICB7IDcxODYsICA5MjE4LCAxNTg2MCwgMzA0MzAsICA2MDE5MCwgMTIwMTAwLCAyNDAwMDAsIDQ3OTcwMCwgIDk1OTMwMH19Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICBKcGVnMjAwMENvbXBvbmVudCAqY29tcDsKK30gSnBlZzIwMDBUaWxlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGNvbnN0IEFWRnJhbWUgKnBpY3R1cmU7CisKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsgLy8vPCBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0CisgICAgdWludDhfdCBjYnBzWzRdOyAvLy88IGJpdHMgcGVyIHNhbXBsZSBpbiBwYXJ0aWN1bGFyIGNvbXBvbmVudHMKKyAgICBpbnQgY2hyb21hX3NoaWZ0WzJdOworICAgIHVpbnQ4X3QgcGxhbmFyOworICAgIGludCBuY29tcG9uZW50czsKKyAgICBpbnQgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQ7IC8vLzwgdGlsZSBzaXplCisgICAgaW50IG51bVh0aWxlcywgbnVtWXRpbGVzOworCisgICAgdWludDhfdCAqYnVmX3N0YXJ0OworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICB1aW50OF90ICpidWZfZW5kOworICAgIGludCBiaXRfaW5kZXg7CisKKyAgICBpbnQ2NF90IGxhbWJkYTsKKworICAgIEpwZWcyMDAwQ29kaW5nU3R5bGUgY29kc3R5OworICAgIEpwZWcyMDAwUXVhbnRTdHlsZSAgcW50c3R5OworCisgICAgSnBlZzIwMDBUaWxlICp0aWxlOworfSBKcGVnMjAwMEVuY29kZXJDb250ZXh0OworCisKKy8qIGRlYnVnICovCisjaWYgMAorI3VuZGVmIGlmcHJpbnRmCisjdW5kZWYgcHJpbnRmCisKK3N0YXRpYyB2b2lkIG5zcGFjZXMoRklMRSAqZmQsIGludCBuKQoreworICAgIHdoaWxlKG4tLSkgcHV0YygnICcsIGZkKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRjb21wKEpwZWcyMDAwQ29tcG9uZW50ICpjb21wKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb21wLT55MSAtIGNvbXAtPnkwOyBpKyspCisgICAgICAgIGZmX2pwZWcyMDAwX3ByaW50dihjb21wLT5pX2RhdGEgKyBpICogKGNvbXAtPngxIC0gY29tcC0+eDApLCBjb21wLT54MSAtIGNvbXAtPngwKTsKK30KKworc3RhdGljIHZvaWQgZHVtcChKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzLCBGSUxFICpmZCkKK3sKKyAgICBpbnQgdGlsZW5vLCBjb21wbm8sIHJlc2xldmVsbm8sIGJhbmRubywgcHJlY25vOworICAgIGZwcmludGYoZmQsICJYU2l6ID0gJWQsIFlTaXogPSAlZCwgdGlsZV93aWR0aCA9ICVkLCB0aWxlX2hlaWdodCA9ICVkXG4iCisgICAgICAgICAgICAgICAgIm51bVh0aWxlcyA9ICVkLCBudW1ZdGlsZXMgPSAlZCwgbmNvbXBvbmVudHMgPSAlZFxuIgorICAgICAgICAgICAgICAgICJ0aWxlczpcbiIsCisgICAgICAgICAgICBzLT53aWR0aCwgcy0+aGVpZ2h0LCBzLT50aWxlX3dpZHRoLCBzLT50aWxlX2hlaWdodCwKKyAgICAgICAgICAgIHMtPm51bVh0aWxlcywgcy0+bnVtWXRpbGVzLCBzLT5uY29tcG9uZW50cyk7CisgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBzLT5udW1YdGlsZXMgKiBzLT5udW1ZdGlsZXM7IHRpbGVubysrKXsKKyAgICAgICAgSnBlZzIwMDBUaWxlICp0aWxlID0gcy0+dGlsZSArIHRpbGVubzsKKyAgICAgICAgbnNwYWNlcyhmZCwgMik7CisgICAgICAgIGZwcmludGYoZmQsICJ0aWxlICVkOlxuIiwgdGlsZW5vKTsKKyAgICAgICAgZm9yKGNvbXBubyA9IDA7IGNvbXBubyA8IHMtPm5jb21wb25lbnRzOyBjb21wbm8rKyl7CisgICAgICAgICAgICBKcGVnMjAwMENvbXBvbmVudCAqY29tcCA9IHRpbGUtPmNvbXAgKyBjb21wbm87CisgICAgICAgICAgICBuc3BhY2VzKGZkLCA0KTsKKyAgICAgICAgICAgIGZwcmludGYoZmQsICJjb21wb25lbnQgJWQ6XG4iLCBjb21wbm8pOworICAgICAgICAgICAgbnNwYWNlcyhmZCwgNCk7CisgICAgICAgICAgICBmcHJpbnRmKGZkLCAieDAgPSAlZCwgeDEgPSAlZCwgeTAgPSAlZCwgeTEgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAtPngwLCBjb21wLT54MSwgY29tcC0+eTAsIGNvbXAtPnkxKTsKKyAgICAgICAgICAgIGZvcihyZXNsZXZlbG5vID0gMDsgcmVzbGV2ZWxubyA8IHMtPm5yZXNsZXZlbHM7IHJlc2xldmVsbm8rKyl7CisgICAgICAgICAgICAgICAgSnBlZzIwMDBSZXNMZXZlbCAqcmVzbGV2ZWwgPSBjb21wLT5yZXNsZXZlbCArIHJlc2xldmVsbm87CisgICAgICAgICAgICAgICAgbnNwYWNlcyhmZCwgNik7CisgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgInJlc2xldmVsICVkOlxuIiwgcmVzbGV2ZWxubyk7CisgICAgICAgICAgICAgICAgbnNwYWNlcyhmZCwgNik7CisgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIngwID0gJWQsIHgxID0gJWQsIHkwID0gJWQsIHkxID0gJWQsIG5iYW5kcyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzbGV2ZWwtPngwLCByZXNsZXZlbC0+eDEsIHJlc2xldmVsLT55MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc2xldmVsLT55MSwgcmVzbGV2ZWwtPm5iYW5kcyk7CisgICAgICAgICAgICAgICAgZm9yKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlc2xldmVsLT5uYmFuZHM7IGJhbmRubysrKXsKKyAgICAgICAgICAgICAgICAgICAgSnBlZzIwMDBCYW5kICpiYW5kID0gcmVzbGV2ZWwtPmJhbmQgKyBiYW5kbm87CisgICAgICAgICAgICAgICAgICAgIG5zcGFjZXMoZmQsIDgpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiYmFuZCAlZDpcbiIsIGJhbmRubyk7CisgICAgICAgICAgICAgICAgICAgIG5zcGFjZXMoZmQsIDgpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAieDAgPSAlZCwgeDEgPSAlZCwgeTAgPSAlZCwgeTEgPSAlZCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2RlYmxvY2tfd2lkdGggPSAlZCwgY29kZWJsb2NrX2hlaWdodCA9ICVkIGNibGtueCA9ICVkIGNibGtueSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLT54MCwgYmFuZC0+eDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPnkwLCBiYW5kLT55MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZC0+Y29kZWJsb2NrX3dpZHRoLCBiYW5kLT5jb2RlYmxvY2tfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLT5jYmxrbngsIGJhbmQtPmNibGtueSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAocHJlY25vID0gMDsgcHJlY25vIDwgcmVzbGV2ZWwtPm51bV9wcmVjaW5jdHNfeCAqIHJlc2xldmVsLT5udW1fcHJlY2luY3RzX3k7IHByZWNubysrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpwZWcyMDAwUHJlYyAqcHJlYyA9IGJhbmQtPnByZWMgKyBwcmVjbm87CisgICAgICAgICAgICAgICAgICAgICAgICBuc3BhY2VzKGZkLCAxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAicHJlYyAlZDpcbiIsIHByZWNubyk7CisgICAgICAgICAgICAgICAgICAgICAgICBuc3BhY2VzKGZkLCAxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAieGkwID0gJWQsIHhpMSA9ICVkLCB5aTAgPSAlZCwgeWkxID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYy0+eGkwLCBwcmVjLT54aTEsIHByZWMtPnlpMCwgcHJlYy0+eWkxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCisvKiBiaXRzdHJlYW0gcm91dGluZXMgKi8KKworLyoqIHB1dCBuIHRpbWVzIHZhbCBiaXQgKi8KK3N0YXRpYyB2b2lkIHB1dF9iaXRzKEpwZWcyMDAwRW5jb2RlckNvbnRleHQgKnMsIGludCB2YWwsIGludCBuKSAvLyBUT0RPOiBvcHRpbWl6ZQoreworICAgIHdoaWxlIChuLS0gPiAwKXsKKyAgICAgICAgaWYgKHMtPmJpdF9pbmRleCA9PSA4KQorICAgICAgICB7CisgICAgICAgICAgICBzLT5iaXRfaW5kZXggPSAqcy0+YnVmID09IDB4ZmY7CisgICAgICAgICAgICAqKCsrcy0+YnVmKSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgKnMtPmJ1ZiB8PSB2YWwgPDwgKDcgLSBzLT5iaXRfaW5kZXgrKyk7CisgICAgfQorfQorCisvKiogcHV0IG4gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBhIG51bWJlciBudW0gKi8KK3N0YXRpYyB2b2lkIHB1dF9udW0oSnBlZzIwMDBFbmNvZGVyQ29udGV4dCAqcywgaW50IG51bSwgaW50IG4pCit7CisgICAgd2hpbGUoLS1uID49IDApCisgICAgICAgIHB1dF9iaXRzKHMsIChudW0gPj4gbikgJiAxLCAxKTsKK30KKworLyoqIGZsdXNoIHRoZSBiaXRzdHJlYW0gKi8KK3N0YXRpYyB2b2lkIGoya19mbHVzaChKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzKQoreworICAgIGlmIChzLT5iaXRfaW5kZXgpeworICAgICAgICBzLT5iaXRfaW5kZXggPSAwOworICAgICAgICBzLT5idWYrKzsKKyAgICB9Cit9CisKKy8qIHRhZyB0cmVlIHJvdXRpbmVzICovCisKKy8qKiBjb2RlIHRoZSB2YWx1ZSBzdG9yZWQgaW4gbm9kZSAqLworc3RhdGljIHZvaWQgdGFnX3RyZWVfY29kZShKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzLCBKcGVnMjAwMFRndE5vZGUgKm5vZGUsIGludCB0aHJlc2hvbGQpCit7CisgICAgSnBlZzIwMDBUZ3ROb2RlICpzdGFja1szMF07CisgICAgaW50IHNwID0gMSwgY3VydmFsID0gMDsKKyAgICBzdGFja1swXSA9IG5vZGU7CisKKyAgICBub2RlID0gbm9kZS0+cGFyZW50OworICAgIHdoaWxlKG5vZGUpeworICAgICAgICBpZiAobm9kZS0+dmlzKXsKKyAgICAgICAgICAgIGN1cnZhbCA9IG5vZGUtPnZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5vZGUtPnZpcysrOworICAgICAgICBzdGFja1tzcCsrXSA9IG5vZGU7CisgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnQ7CisgICAgfQorICAgIHdoaWxlKC0tc3AgPj0gMCl7CisgICAgICAgIGlmIChzdGFja1tzcF0tPnZhbCA+PSB0aHJlc2hvbGQpeworICAgICAgICAgICAgcHV0X2JpdHMocywgMCwgdGhyZXNob2xkIC0gY3VydmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHB1dF9iaXRzKHMsIDAsIHN0YWNrW3NwXS0+dmFsIC0gY3VydmFsKTsKKyAgICAgICAgcHV0X2JpdHMocywgMSwgMSk7CisgICAgICAgIGN1cnZhbCA9IHN0YWNrW3NwXS0+dmFsOworICAgIH0KK30KKworLyoqIHVwZGF0ZSB0aGUgdmFsdWUgaW4gbm9kZSAqLworc3RhdGljIHZvaWQgdGFnX3RyZWVfdXBkYXRlKEpwZWcyMDAwVGd0Tm9kZSAqbm9kZSkKK3sKKyAgICBpbnQgbGV2ID0gMDsKKyAgICB3aGlsZSAobm9kZS0+cGFyZW50KXsKKyAgICAgICAgaWYgKG5vZGUtPnBhcmVudC0+dmFsIDw9IG5vZGUtPnZhbCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBub2RlLT5wYXJlbnQtPnZhbCA9IG5vZGUtPnZhbDsKKyAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudDsKKyAgICAgICAgbGV2Kys7CisgICAgfQorfQorCitzdGF0aWMgaW50IHB1dF9zaXooSnBlZzIwMDBFbmNvZGVyQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChzLT5idWZfZW5kIC0gcy0+YnVmIDwgNDAgKyAzICogcy0+bmNvbXBvbmVudHMpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnMtPmJ1ZiwgSlBFRzIwMDBfU0laKTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZzLT5idWYsIDM4ICsgMyAqIHMtPm5jb21wb25lbnRzKTsgLy8gTHNpegorICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnMtPmJ1ZiwgMCk7IC8vIFJzaXoKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZzLT5idWYsIHMtPndpZHRoKTsgLy8gd2lkdGgKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZzLT5idWYsIHMtPmhlaWdodCk7IC8vIGhlaWdodAorICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnMtPmJ1ZiwgMCk7IC8vIFgwU2l6CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcy0+YnVmLCAwKTsgLy8gWTBTaXoKKworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnMtPmJ1Ziwgcy0+dGlsZV93aWR0aCk7IC8vIFhUU2l6CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcy0+YnVmLCBzLT50aWxlX2hlaWdodCk7IC8vIFlUU2l6CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcy0+YnVmLCAwKTsgLy8gWFQwU2l6CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcy0+YnVmLCAwKTsgLy8gWVQwU2l6CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcy0+YnVmLCBzLT5uY29tcG9uZW50cyk7IC8vIENTaXoKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uY29tcG9uZW50czsgaSsrKXsgLy8gU3Npel9pIFhSc2l6X2ksIFlSc2l6X2kKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcy0+YnVmLCA3KTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcy0+YnVmLCBpPzE8PHMtPmNocm9tYV9zaGlmdFswXToxKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcy0+YnVmLCBpPzE8PHMtPmNocm9tYV9zaGlmdFsxXToxKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2NvZChKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzKQoreworICAgIEpwZWcyMDAwQ29kaW5nU3R5bGUgKmNvZHN0eSA9ICZzLT5jb2RzdHk7CisKKyAgICBpZiAocy0+YnVmX2VuZCAtIHMtPmJ1ZiA8IDE0KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZzLT5idWYsIEpQRUcyMDAwX0NPRCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcy0+YnVmLCAxMik7IC8vIExjb2QKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZzLT5idWYsIDApOyAgLy8gU2NvZAorICAgIC8vIFNHY29kCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcy0+YnVmLCAwKTsgLy8gcHJvZ3Jlc3Npb24gbGV2ZWwKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZzLT5idWYsIDEpOyAvLyBudW0gb2YgbGF5ZXJzCisgICAgaWYocy0+YXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQKXsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcy0+YnVmLCAyKTsgLy8gSUNUCisgICAgfWVsc2V7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnMtPmJ1ZiwgMCk7IC8vIHVuc3BlY2lmaWVkCisgICAgfQorICAgIC8vIFNQY29kCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcy0+YnVmLCBjb2RzdHktPm5yZXNsZXZlbHMgLSAxKTsgLy8gbnVtIG9mIGRlY29tcC4gbGV2ZWxzCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcy0+YnVmLCBjb2RzdHktPmxvZzJfY2Jsa193aWR0aC0yKTsgLy8gY2JsayB3aWR0aAorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnMtPmJ1ZiwgY29kc3R5LT5sb2cyX2NibGtfaGVpZ2h0LTIpOyAvLyBjYmxrIGhlaWdodAorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnMtPmJ1ZiwgMCk7IC8vIGNibGsgc3R5bGUKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZzLT5idWYsIGNvZHN0eS0+dHJhbnNmb3JtID09IEZGX0RXVDUzKTsgLy8gdHJhbnNmb3JtYXRpb24KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXRfcWNkKEpwZWcyMDAwRW5jb2RlckNvbnRleHQgKnMsIGludCBjb21wbm8pCit7CisgICAgaW50IGksIHNpemU7CisgICAgSnBlZzIwMDBDb2RpbmdTdHlsZSAqY29kc3R5ID0gJnMtPmNvZHN0eTsKKyAgICBKcGVnMjAwMFF1YW50U3R5bGUgICpxbnRzdHkgPSAmcy0+cW50c3R5OworCisgICAgaWYgKHFudHN0eS0+cXVhbnRzdHkgPT0gSlBFRzIwMDBfUVNUWV9OT05FKQorICAgICAgICBzaXplID0gNCArIDMgKiAoY29kc3R5LT5ucmVzbGV2ZWxzLTEpOworICAgIGVsc2UgLy8gUVNUWV9TRQorICAgICAgICBzaXplID0gNSArIDYgKiAoY29kc3R5LT5ucmVzbGV2ZWxzLTEpOworCisgICAgaWYgKHMtPmJ1Zl9lbmQgLSBzLT5idWYgPCBzaXplICsgMikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcy0+YnVmLCBKUEVHMjAwMF9RQ0QpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnMtPmJ1Ziwgc2l6ZSk7ICAvLyBMUWNkCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcy0+YnVmLCAocW50c3R5LT5uZ3VhcmRiaXRzIDw8IDUpIHwgcW50c3R5LT5xdWFudHN0eSk7ICAvLyBTcWNkCisgICAgaWYgKHFudHN0eS0+cXVhbnRzdHkgPT0gSlBFRzIwMDBfUVNUWV9OT05FKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29kc3R5LT5ucmVzbGV2ZWxzICogMyAtIDI7IGkrKykKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnMtPmJ1ZiwgcW50c3R5LT5leHBuW2ldIDw8IDMpOworICAgIGVsc2UgLy8gUVNUWV9TRQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29kc3R5LT5ucmVzbGV2ZWxzICogMyAtIDI7IGkrKykKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnMtPmJ1ZiwgKHFudHN0eS0+ZXhwbltpXSA8PCAxMSkgfCBxbnRzdHktPm1hbnRbaV0pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDhfdCAqcHV0X3NvdChKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzLCBpbnQgdGlsZW5vKQoreworICAgIHVpbnQ4X3QgKnBzb3RwdHI7CisKKyAgICBpZiAocy0+YnVmX2VuZCAtIHMtPmJ1ZiA8IDEyKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnMtPmJ1ZiwgSlBFRzIwMDBfU09UKTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZzLT5idWYsIDEwKTsgLy8gTHNvdAorICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnMtPmJ1ZiwgdGlsZW5vKTsgLy8gSXNvdAorCisgICAgcHNvdHB0ciA9IHMtPmJ1ZjsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZzLT5idWYsIDApOyAvLyBQc290IChmaWxsZWQgaW4gbGF0ZXIpCisKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZzLT5idWYsIDApOyAvLyBUUHNvdAorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnMtPmJ1ZiwgMSk7IC8vIFROc290CisgICAgcmV0dXJuIHBzb3RwdHI7Cit9CisKKy8qKgorICogY29tcHV0ZSB0aGUgc2l6ZXMgb2YgdGlsZXMsIHJlc29sdXRpb24gbGV2ZWxzLCBiYW5kcywgZXRjLgorICogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGVtCisgKiBkaXZpZGUgdGhlIGlucHV0IGltYWdlIGludG8gdGlsZS1jb21wb25lbnRzCisgKi8KK3N0YXRpYyBpbnQgaW5pdF90aWxlcyhKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzKQoreworICAgIGludCB0aWxlbm8sIHRpbGV4LCB0aWxleSwgY29tcG5vOworICAgIEpwZWcyMDAwQ29kaW5nU3R5bGUgKmNvZHN0eSA9ICZzLT5jb2RzdHk7CisgICAgSnBlZzIwMDBRdWFudFN0eWxlICAqcW50c3R5ID0gJnMtPnFudHN0eTsKKworICAgIHMtPm51bVh0aWxlcyA9IGZmX2pwZWcyMDAwX2NlaWxkaXYocy0+d2lkdGgsIHMtPnRpbGVfd2lkdGgpOworICAgIHMtPm51bVl0aWxlcyA9IGZmX2pwZWcyMDAwX2NlaWxkaXYocy0+aGVpZ2h0LCBzLT50aWxlX2hlaWdodCk7CisKKyAgICBzLT50aWxlID0gYXZfbWFsbG9jX2FycmF5KHMtPm51bVh0aWxlcywgcy0+bnVtWXRpbGVzICogc2l6ZW9mKEpwZWcyMDAwVGlsZSkpOworICAgIGlmICghcy0+dGlsZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IgKHRpbGVubyA9IDAsIHRpbGV5ID0gMDsgdGlsZXkgPCBzLT5udW1ZdGlsZXM7IHRpbGV5KyspCisgICAgICAgIGZvciAodGlsZXggPSAwOyB0aWxleCA8IHMtPm51bVh0aWxlczsgdGlsZXgrKywgdGlsZW5vKyspeworICAgICAgICAgICAgSnBlZzIwMDBUaWxlICp0aWxlID0gcy0+dGlsZSArIHRpbGVubzsKKworICAgICAgICAgICAgdGlsZS0+Y29tcCA9IGF2X21hbGxvY3pfYXJyYXkocy0+bmNvbXBvbmVudHMsIHNpemVvZihKcGVnMjAwMENvbXBvbmVudCkpOworICAgICAgICAgICAgaWYgKCF0aWxlLT5jb21wKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHMtPm5jb21wb25lbnRzOyBjb21wbm8rKyl7CisgICAgICAgICAgICAgICAgSnBlZzIwMDBDb21wb25lbnQgKmNvbXAgPSB0aWxlLT5jb21wICsgY29tcG5vOworICAgICAgICAgICAgICAgIGludCByZXQsIGksIGo7CisKKyAgICAgICAgICAgICAgICBjb21wLT5jb29yZFswXVswXSA9IGNvbXAtPmNvb3JkX29bMF1bMF0gPSB0aWxleCAqIHMtPnRpbGVfd2lkdGg7CisgICAgICAgICAgICAgICAgY29tcC0+Y29vcmRbMF1bMV0gPSBjb21wLT5jb29yZF9vWzBdWzFdID0gRkZNSU4oKHRpbGV4KzEpKnMtPnRpbGVfd2lkdGgsIHMtPndpZHRoKTsKKyAgICAgICAgICAgICAgICBjb21wLT5jb29yZFsxXVswXSA9IGNvbXAtPmNvb3JkX29bMV1bMF0gPSB0aWxleSAqIHMtPnRpbGVfaGVpZ2h0OworICAgICAgICAgICAgICAgIGNvbXAtPmNvb3JkWzFdWzFdID0gY29tcC0+Y29vcmRfb1sxXVsxXSA9IEZGTUlOKCh0aWxleSsxKSpzLT50aWxlX2hlaWdodCwgcy0+aGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG5vID4gMCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC0+Y29vcmRbaV1bal0gPSBjb21wLT5jb29yZF9vW2ldW2pdID0gZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIoY29tcC0+Y29vcmRbaV1bal0sIHMtPmNocm9tYV9zaGlmdFtpXSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmV0ID0gZmZfanBlZzIwMDBfaW5pdF9jb21wb25lbnQoY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZHN0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFudHN0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNicHNbY29tcG5vXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBubz8xPDxzLT5jaHJvbWFfc2hpZnRbMF06MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBubz8xPDxzLT5jaHJvbWFfc2hpZnRbMV06MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY29weV9mcmFtZShKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzKQoreworICAgIGludCB0aWxlbm8sIGNvbXBubywgaSwgeSwgeDsKKyAgICB1aW50OF90ICpsaW5lOworICAgIGZvciAodGlsZW5vID0gMDsgdGlsZW5vIDwgcy0+bnVtWHRpbGVzICogcy0+bnVtWXRpbGVzOyB0aWxlbm8rKyl7CisgICAgICAgIEpwZWcyMDAwVGlsZSAqdGlsZSA9IHMtPnRpbGUgKyB0aWxlbm87CisgICAgICAgIGlmIChzLT5wbGFuYXIpeworICAgICAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBzLT5uY29tcG9uZW50czsgY29tcG5vKyspeworICAgICAgICAgICAgICAgIEpwZWcyMDAwQ29tcG9uZW50ICpjb21wID0gdGlsZS0+Y29tcCArIGNvbXBubzsKKyAgICAgICAgICAgICAgICBpbnQgKmRzdCA9IGNvbXAtPmlfZGF0YTsKKyAgICAgICAgICAgICAgICBsaW5lID0gcy0+cGljdHVyZS0+ZGF0YVtjb21wbm9dCisgICAgICAgICAgICAgICAgICAgICAgICsgY29tcC0+Y29vcmRbMV1bMF0gKiBzLT5waWN0dXJlLT5saW5lc2l6ZVtjb21wbm9dCisgICAgICAgICAgICAgICAgICAgICAgICsgY29tcC0+Y29vcmRbMF1bMF07CisgICAgICAgICAgICAgICAgZm9yICh5ID0gY29tcC0+Y29vcmRbMV1bMF07IHkgPCBjb21wLT5jb29yZFsxXVsxXTsgeSsrKXsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gbGluZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gY29tcC0+Y29vcmRbMF1bMF07IHggPCBjb21wLT5jb29yZFswXVsxXTsgeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKnB0cisrIC0gKDEgPDwgNyk7CisgICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gcy0+cGljdHVyZS0+bGluZXNpemVbY29tcG5vXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgIGxpbmUgPSBzLT5waWN0dXJlLT5kYXRhWzBdICsgdGlsZS0+Y29tcFswXS5jb29yZFsxXVswXSAqIHMtPnBpY3R1cmUtPmxpbmVzaXplWzBdCisgICAgICAgICAgICAgICAgICAgKyB0aWxlLT5jb21wWzBdLmNvb3JkWzBdWzBdICogcy0+bmNvbXBvbmVudHM7CisKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZm9yICh5ID0gdGlsZS0+Y29tcFswXS5jb29yZFsxXVswXTsgeSA8IHRpbGUtPmNvbXBbMF0uY29vcmRbMV1bMV07IHkrKyl7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gbGluZTsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSB0aWxlLT5jb21wWzBdLmNvb3JkWzBdWzBdOyB4IDwgdGlsZS0+Y29tcFswXS5jb29yZFswXVsxXTsgeCsrLCBpKyspeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHMtPm5jb21wb25lbnRzOyBjb21wbm8rKyl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWxlLT5jb21wW2NvbXBub10uaV9kYXRhW2ldID0gKnB0cisrICAtICgxIDw8IDcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmUgKz0gcy0+cGljdHVyZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcXVhbnRpemF0aW9uKEpwZWcyMDAwRW5jb2RlckNvbnRleHQgKnMpCit7CisgICAgaW50IGNvbXBubywgcmVzbGV2ZWxubywgYmFuZG5vOworICAgIEpwZWcyMDAwUXVhbnRTdHlsZSAgKnFudHN0eSA9ICZzLT5xbnRzdHk7CisgICAgSnBlZzIwMDBDb2RpbmdTdHlsZSAqY29kc3R5ID0gJnMtPmNvZHN0eTsKKworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcy0+bmNvbXBvbmVudHM7IGNvbXBubysrKXsKKyAgICAgICAgaW50IGdiYW5kbm8gPSAwOworICAgICAgICBmb3IgKHJlc2xldmVsbm8gPSAwOyByZXNsZXZlbG5vIDwgY29kc3R5LT5ucmVzbGV2ZWxzOyByZXNsZXZlbG5vKyspeworICAgICAgICAgICAgaW50IG5iYW5kcywgbGV2ID0gY29kc3R5LT5ucmVzbGV2ZWxzIC0gcmVzbGV2ZWxubyAtIDE7CisgICAgICAgICAgICBuYmFuZHMgPSByZXNsZXZlbG5vID8gMyA6IDE7CisgICAgICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IG5iYW5kczsgYmFuZG5vKyssIGdiYW5kbm8rKyl7CisgICAgICAgICAgICAgICAgaW50IGV4cG4sIG1hbnQ7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kc3R5LT50cmFuc2Zvcm0gPT0gRkZfRFdUOTdfSU5UKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJhbmRwb3MgPSBiYW5kbm8gKyAocmVzbGV2ZWxubz4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzID0gODE5MjAwMDAgLyBkd3Rfbm9ybXNbMF1bYmFuZHBvc11bbGV2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZyA9IGF2X2xvZzIoc3MpOworICAgICAgICAgICAgICAgICAgICBtYW50ID0gKDExIC0gbG9nIDwgMCA/IHNzID4+IGxvZyAtIDExIDogc3MgPDwgMTEgLSBsb2cpICYgMHg3ZmY7CisgICAgICAgICAgICAgICAgICAgIGV4cG4gPSBzLT5jYnBzW2NvbXBub10gLSBsb2cgKyAxMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZXhwbiA9ICgoYmFuZG5vJjIpPj4xKSArIChyZXNsZXZlbG5vPjApICsgcy0+Y2Jwc1tjb21wbm9dOworCisgICAgICAgICAgICAgICAgcW50c3R5LT5leHBuW2diYW5kbm9dID0gZXhwbjsKKyAgICAgICAgICAgICAgICBxbnRzdHktPm1hbnRbZ2JhbmRub10gPSBtYW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpbml0X2x1dHModm9pZCkKK3sKKyAgICBpbnQgaSwgYSwKKyAgICAgICAgbWFzayA9IH4oKDE8PE5NU0VERUNfRlJBQ0JJVFMpLTEpOworCisgICAgZm9yIChpID0gMDsgaSA8ICgxIDw8IE5NU0VERUNfQklUUyk7IGkrKyl7CisgICAgICAgIGx1dF9ubXNlZGVjX3NpZ1tpXSAgPSBGRk1BWCg2KmkgLSAoOTw8Tk1TRURFQ19GUkFDQklUUy0xKSA8PCAxMi1OTVNFREVDX0ZSQUNCSVRTLCAwKTsKKyAgICAgICAgbHV0X25tc2VkZWNfc2lnMFtpXSA9IEZGTUFYKChpKmkgKyAoMTw8Tk1TRURFQ19GUkFDQklUUy0xKSAmIG1hc2spIDw8IDEsIDApOworCisgICAgICAgIGEgPSAoaSA+PiAoTk1TRURFQ19CSVRTLTIpJjIpICsgMTsKKyAgICAgICAgbHV0X25tc2VkZWNfcmVmW2ldICA9IEZGTUFYKCgtMippICsgKDE8PE5NU0VERUNfRlJBQ0JJVFMpICsgYSppIC0gKGEqYTw8Tk1TRURFQ19GUkFDQklUUy0yKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDEzLU5NU0VERUNfRlJBQ0JJVFMsIDApOworICAgICAgICBsdXRfbm1zZWRlY19yZWYwW2ldID0gRkZNQVgoKChpKmkgKyAoMS00KmkgPDwgTk1TRURFQ19GUkFDQklUUy0xKSArICgxPDwyKk5NU0VERUNfRlJBQ0JJVFMpKSAmIG1hc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxLCAwKTsKKyAgICB9Cit9CisKKy8qIHRpZXItMSByb3V0aW5lcyAqLworc3RhdGljIGludCBnZXRubXNlZGVjX3NpZyhpbnQgeCwgaW50IGJwbm8pCit7CisgICAgaWYgKGJwbm8gPiBOTVNFREVDX0ZSQUNCSVRTKQorICAgICAgICByZXR1cm4gbHV0X25tc2VkZWNfc2lnWyh4ID4+IChicG5vIC0gTk1TRURFQ19GUkFDQklUUykpICYgKCgxIDw8IE5NU0VERUNfQklUUykgLSAxKV07CisgICAgcmV0dXJuIGx1dF9ubXNlZGVjX3NpZzBbeCAmICgoMSA8PCBOTVNFREVDX0JJVFMpIC0gMSldOworfQorCitzdGF0aWMgaW50IGdldG5tc2VkZWNfcmVmKGludCB4LCBpbnQgYnBubykKK3sKKyAgICBpZiAoYnBubyA+IE5NU0VERUNfRlJBQ0JJVFMpCisgICAgICAgIHJldHVybiBsdXRfbm1zZWRlY19yZWZbKHggPj4gKGJwbm8gLSBOTVNFREVDX0ZSQUNCSVRTKSkgJiAoKDEgPDwgTk1TRURFQ19CSVRTKSAtIDEpXTsKKyAgICByZXR1cm4gbHV0X25tc2VkZWNfcmVmMFt4ICYgKCgxIDw8IE5NU0VERUNfQklUUykgLSAxKV07Cit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9zaWdwYXNzKEpwZWcyMDAwVDFDb250ZXh0ICp0MSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYmFuZG5vLCBpbnQgKm5tc2VkZWMsIGludCBicG5vKQoreworICAgIGludCB5MCwgeCwgeSwgbWFzayA9IDEgPDwgKGJwbm8gKyBOTVNFREVDX0ZSQUNCSVRTKTsKKyAgICBmb3IgKHkwID0gMDsgeTAgPCBoZWlnaHQ7IHkwICs9IDQpCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgZm9yICh5ID0geTA7IHkgPCBoZWlnaHQgJiYgeSA8IHkwKzQ7IHkrKyl7CisgICAgICAgICAgICAgICAgaWYgKCEodDEtPmZsYWdzW3krMV1beCsxXSAmIEpQRUcyMDAwX1QxX1NJRykgJiYgKHQxLT5mbGFnc1t5KzFdW3grMV0gJiBKUEVHMjAwMF9UMV9TSUdfTkIpKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IGN0eG5vID0gZmZfanBlZzIwMDBfZ2V0c2lnY3R4bm8odDEtPmZsYWdzW3krMV1beCsxXSwgYmFuZG5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdCA9IHQxLT5kYXRhW3ldW3hdICYgbWFzayA/IDEgOiAwOworICAgICAgICAgICAgICAgICAgICBmZl9tcWNfZW5jb2RlKCZ0MS0+bXFjLCB0MS0+bXFjLmN4X3N0YXRlcyArIGN0eG5vLCBiaXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoYml0KXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4b3JiaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4bm8gPSBmZl9qcGVnMjAwMF9nZXRzZ25jdHhubyh0MS0+ZmxhZ3NbeSsxXVt4KzFdLCAmeG9yYml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX21xY19lbmNvZGUoJnQxLT5tcWMsIHQxLT5tcWMuY3hfc3RhdGVzICsgY3R4bm8sICh0MS0+ZmxhZ3NbeSsxXVt4KzFdID4+IDE1KSBeIHhvcmJpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqbm1zZWRlYyArPSBnZXRubXNlZGVjX3NpZyh0MS0+ZGF0YVt5XVt4XSwgYnBubyArIE5NU0VERUNfRlJBQ0JJVFMpOworICAgICAgICAgICAgICAgICAgICAgICAgZmZfanBlZzIwMDBfc2V0X3NpZ25pZmljYW5jZSh0MSwgeCwgeSwgdDEtPmZsYWdzW3krMV1beCsxXSA+PiAxNSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdDEtPmZsYWdzW3krMV1beCsxXSB8PSBKUEVHMjAwMF9UMV9WSVM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfcmVmcGFzcyhKcGVnMjAwMFQxQ29udGV4dCAqdDEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50ICpubXNlZGVjLCBpbnQgYnBubykKK3sKKyAgICBpbnQgeTAsIHgsIHksIG1hc2sgPSAxIDw8IChicG5vICsgTk1TRURFQ19GUkFDQklUUyk7CisgICAgZm9yICh5MCA9IDA7IHkwIDwgaGVpZ2h0OyB5MCArPSA0KQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGZvciAoeSA9IHkwOyB5IDwgaGVpZ2h0ICYmIHkgPCB5MCs0OyB5KyspCisgICAgICAgICAgICAgICAgaWYgKCh0MS0+ZmxhZ3NbeSsxXVt4KzFdICYgKEpQRUcyMDAwX1QxX1NJRyB8IEpQRUcyMDAwX1QxX1ZJUykpID09IEpQRUcyMDAwX1QxX1NJRyl7CisgICAgICAgICAgICAgICAgICAgIGludCBjdHhubyA9IGZmX2pwZWcyMDAwX2dldHJlZmN0eG5vKHQxLT5mbGFnc1t5KzFdW3grMV0pOworICAgICAgICAgICAgICAgICAgICAqbm1zZWRlYyArPSBnZXRubXNlZGVjX3JlZih0MS0+ZGF0YVt5XVt4XSwgYnBubyArIE5NU0VERUNfRlJBQ0JJVFMpOworICAgICAgICAgICAgICAgICAgICBmZl9tcWNfZW5jb2RlKCZ0MS0+bXFjLCB0MS0+bXFjLmN4X3N0YXRlcyArIGN0eG5vLCB0MS0+ZGF0YVt5XVt4XSAmIG1hc2sgPyAxOjApOworICAgICAgICAgICAgICAgICAgICB0MS0+ZmxhZ3NbeSsxXVt4KzFdIHw9IEpQRUcyMDAwX1QxX1JFRjsKKyAgICAgICAgICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9jbG5wYXNzKEpwZWcyMDAwVDFDb250ZXh0ICp0MSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYmFuZG5vLCBpbnQgKm5tc2VkZWMsIGludCBicG5vKQoreworICAgIGludCB5MCwgeCwgeSwgbWFzayA9IDEgPDwgKGJwbm8gKyBOTVNFREVDX0ZSQUNCSVRTKTsKKyAgICBmb3IgKHkwID0gMDsgeTAgPCBoZWlnaHQ7IHkwICs9IDQpCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKXsKKyAgICAgICAgICAgIGlmICh5MCArIDMgPCBoZWlnaHQgJiYgISgKKyAgICAgICAgICAgICh0MS0+ZmxhZ3NbeTArMV1beCsxXSAmIChKUEVHMjAwMF9UMV9TSUdfTkIgfCBKUEVHMjAwMF9UMV9WSVMgfCBKUEVHMjAwMF9UMV9TSUcpKSB8fAorICAgICAgICAgICAgKHQxLT5mbGFnc1t5MCsyXVt4KzFdICYgKEpQRUcyMDAwX1QxX1NJR19OQiB8IEpQRUcyMDAwX1QxX1ZJUyB8IEpQRUcyMDAwX1QxX1NJRykpIHx8CisgICAgICAgICAgICAodDEtPmZsYWdzW3kwKzNdW3grMV0gJiAoSlBFRzIwMDBfVDFfU0lHX05CIHwgSlBFRzIwMDBfVDFfVklTIHwgSlBFRzIwMDBfVDFfU0lHKSkgfHwKKyAgICAgICAgICAgICh0MS0+ZmxhZ3NbeTArNF1beCsxXSAmIChKUEVHMjAwMF9UMV9TSUdfTkIgfCBKUEVHMjAwMF9UMV9WSVMgfCBKUEVHMjAwMF9UMV9TSUcpKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYWdncmVnYXRpb24gbW9kZQorICAgICAgICAgICAgICAgIGludCBybGVuOworICAgICAgICAgICAgICAgIGZvciAocmxlbiA9IDA7IHJsZW4gPCA0OyBybGVuKyspCisgICAgICAgICAgICAgICAgICAgIGlmICh0MS0+ZGF0YVt5MCtybGVuXVt4XSAmIG1hc2spCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBmZl9tcWNfZW5jb2RlKCZ0MS0+bXFjLCB0MS0+bXFjLmN4X3N0YXRlcyArIE1RQ19DWF9STCwgcmxlbiAhPSA0KTsKKyAgICAgICAgICAgICAgICBpZiAocmxlbiA9PSA0KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBmZl9tcWNfZW5jb2RlKCZ0MS0+bXFjLCB0MS0+bXFjLmN4X3N0YXRlcyArIE1RQ19DWF9VTkksIHJsZW4gPj4gMSk7CisgICAgICAgICAgICAgICAgZmZfbXFjX2VuY29kZSgmdDEtPm1xYywgdDEtPm1xYy5jeF9zdGF0ZXMgKyBNUUNfQ1hfVU5JLCBybGVuICYgMSk7CisgICAgICAgICAgICAgICAgZm9yICh5ID0geTAgKyBybGVuOyB5IDwgeTAgKyA0OyB5KyspeworICAgICAgICAgICAgICAgICAgICBpZiAoISh0MS0+ZmxhZ3NbeSsxXVt4KzFdICYgKEpQRUcyMDAwX1QxX1NJRyB8IEpQRUcyMDAwX1QxX1ZJUykpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdHhubyA9IGZmX2pwZWcyMDAwX2dldHNpZ2N0eG5vKHQxLT5mbGFnc1t5KzFdW3grMV0sIGJhbmRubyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSA+IHkwICsgcmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9tcWNfZW5jb2RlKCZ0MS0+bXFjLCB0MS0+bXFjLmN4X3N0YXRlcyArIGN0eG5vLCB0MS0+ZGF0YVt5XVt4XSAmIG1hc2sgPyAxOjApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQxLT5kYXRhW3ldW3hdICYgbWFzayl7IC8vIG5ld2x5IHNpZ25pZmljYW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvcmJpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4bm8gPSBmZl9qcGVnMjAwMF9nZXRzZ25jdHhubyh0MS0+ZmxhZ3NbeSsxXVt4KzFdLCAmeG9yYml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbm1zZWRlYyArPSBnZXRubXNlZGVjX3NpZyh0MS0+ZGF0YVt5XVt4XSwgYnBubyArIE5NU0VERUNfRlJBQ0JJVFMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21xY19lbmNvZGUoJnQxLT5tcWMsIHQxLT5tcWMuY3hfc3RhdGVzICsgY3R4bm8sICh0MS0+ZmxhZ3NbeSsxXVt4KzFdID4+IDE1KSBeIHhvcmJpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfanBlZzIwMDBfc2V0X3NpZ25pZmljYW5jZSh0MSwgeCwgeSwgdDEtPmZsYWdzW3krMV1beCsxXSA+PiAxNSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdDEtPmZsYWdzW3krMV1beCsxXSAmPSB+SlBFRzIwMDBfVDFfVklTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSB5MDsgeSA8IHkwICsgNCAmJiB5IDwgaGVpZ2h0OyB5KyspeworICAgICAgICAgICAgICAgICAgICBpZiAoISh0MS0+ZmxhZ3NbeSsxXVt4KzFdICYgKEpQRUcyMDAwX1QxX1NJRyB8IEpQRUcyMDAwX1QxX1ZJUykpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdHhubyA9IGZmX2pwZWcyMDAwX2dldHNpZ2N0eG5vKHQxLT5mbGFnc1t5KzFdW3grMV0sIGJhbmRubyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmZl9tcWNfZW5jb2RlKCZ0MS0+bXFjLCB0MS0+bXFjLmN4X3N0YXRlcyArIGN0eG5vLCB0MS0+ZGF0YVt5XVt4XSAmIG1hc2sgPyAxOjApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQxLT5kYXRhW3ldW3hdICYgbWFzayl7IC8vIG5ld2x5IHNpZ25pZmljYW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvcmJpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4bm8gPSBmZl9qcGVnMjAwMF9nZXRzZ25jdHhubyh0MS0+ZmxhZ3NbeSsxXVt4KzFdLCAmeG9yYml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbm1zZWRlYyArPSBnZXRubXNlZGVjX3NpZyh0MS0+ZGF0YVt5XVt4XSwgYnBubyArIE5NU0VERUNfRlJBQ0JJVFMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21xY19lbmNvZGUoJnQxLT5tcWMsIHQxLT5tcWMuY3hfc3RhdGVzICsgY3R4bm8sICh0MS0+ZmxhZ3NbeSsxXVt4KzFdID4+IDE1KSBeIHhvcmJpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfanBlZzIwMDBfc2V0X3NpZ25pZmljYW5jZSh0MSwgeCwgeSwgdDEtPmZsYWdzW3krMV1beCsxXSA+PiAxNSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdDEtPmZsYWdzW3krMV1beCsxXSAmPSB+SlBFRzIwMDBfVDFfVklTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfY2JsayhKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzLCBKcGVnMjAwMFQxQ29udGV4dCAqdDEsIEpwZWcyMDAwQ2JsayAqY2JsaywgSnBlZzIwMDBUaWxlICp0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYmFuZHBvcywgaW50IGxldikKK3sKKyAgICBpbnQgcGFzc190ID0gMiwgcGFzc25vLCB4LCB5LCBtYXg9MCwgbm1zZWRlYywgYnBubzsKKyAgICBpbnQ2NF90IHdtc2VkZWMgPSAwOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodCsyOyB5KyspCisgICAgICAgIG1lbXNldCh0MS0+ZmxhZ3NbeV0sIDAsICh3aWR0aCsyKSpzaXplb2YoaW50KSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKyl7CisgICAgICAgICAgICBpZiAodDEtPmRhdGFbeV1beF0gPCAwKXsKKyAgICAgICAgICAgICAgICB0MS0+ZmxhZ3NbeSsxXVt4KzFdIHw9IEpQRUcyMDAwX1QxX1NHTjsKKyAgICAgICAgICAgICAgICB0MS0+ZGF0YVt5XVt4XSA9IC10MS0+ZGF0YVt5XVt4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heCA9IEZGTUFYKG1heCwgdDEtPmRhdGFbeV1beF0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1heCA9PSAwKXsKKyAgICAgICAgY2Jsay0+bm9uemVyb2JpdHMgPSAwOworICAgICAgICBicG5vID0gMDsKKyAgICB9IGVsc2V7CisgICAgICAgIGNibGstPm5vbnplcm9iaXRzID0gYXZfbG9nMihtYXgpICsgMSAtIE5NU0VERUNfRlJBQ0JJVFM7CisgICAgICAgIGJwbm8gPSBjYmxrLT5ub256ZXJvYml0cyAtIDE7CisgICAgfQorCisgICAgZmZfbXFjX2luaXRlbmMoJnQxLT5tcWMsIGNibGstPmRhdGEpOworCisgICAgZm9yIChwYXNzbm8gPSAwOyBicG5vID49IDA7IHBhc3NubysrKXsKKyAgICAgICAgbm1zZWRlYz0wOworCisgICAgICAgIHN3aXRjaChwYXNzX3QpeworICAgICAgICAgICAgY2FzZSAwOiBlbmNvZGVfc2lncGFzcyh0MSwgd2lkdGgsIGhlaWdodCwgYmFuZHBvcywgJm5tc2VkZWMsIGJwbm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogZW5jb2RlX3JlZnBhc3ModDEsIHdpZHRoLCBoZWlnaHQsICZubXNlZGVjLCBicG5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IGVuY29kZV9jbG5wYXNzKHQxLCB3aWR0aCwgaGVpZ2h0LCBiYW5kcG9zLCAmbm1zZWRlYywgYnBubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2Jsay0+cGFzc2VzW3Bhc3Nub10ucmF0ZSA9IDMgKyBmZl9tcWNfbGVuZ3RoKCZ0MS0+bXFjKTsKKyAgICAgICAgd21zZWRlYyArPSAoaW50NjRfdClubXNlZGVjIDw8ICgyKmJwbm8pOworICAgICAgICBjYmxrLT5wYXNzZXNbcGFzc25vXS5kaXN0byA9IHdtc2VkZWM7CisKKyAgICAgICAgaWYgKCsrcGFzc190ID09IDMpeworICAgICAgICAgICAgcGFzc190ID0gMDsKKyAgICAgICAgICAgIGJwbm8tLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYmxrLT5ucGFzc2VzID0gcGFzc25vOworICAgIGNibGstPm5pbmNscGFzc2VzID0gcGFzc25vOworCisgICAgLy8gVE9ETzogb3B0aW9uYWwgZmx1c2ggb24gZWFjaCBwYXNzCisgICAgY2Jsay0+cGFzc2VzW3Bhc3Nuby0xXS5yYXRlID0gZmZfbXFjX2ZsdXNoKCZ0MS0+bXFjKTsKK30KKworLyogdGllci0yIHJvdXRpbmVzOiAqLworCitzdGF0aWMgdm9pZCBwdXRudW1wYXNzZXMoSnBlZzIwMDBFbmNvZGVyQ29udGV4dCAqcywgaW50IG4pCit7CisgICAgaWYgKG4gPT0gMSkKKyAgICAgICAgcHV0X251bShzLCAwLCAxKTsKKyAgICBlbHNlIGlmIChuID09IDIpCisgICAgICAgIHB1dF9udW0ocywgMiwgMik7CisgICAgZWxzZSBpZiAobiA8PSA1KQorICAgICAgICBwdXRfbnVtKHMsIDB4YyB8IChuLTMpLCA0KTsKKyAgICBlbHNlIGlmIChuIDw9IDM2KQorICAgICAgICBwdXRfbnVtKHMsIDB4MWUwIHwgKG4tNiksIDkpOworICAgIGVsc2UKKyAgICAgICAgcHV0X251bShzLCAweGZmODAgfCAobi0zNyksIDE2KTsKK30KKworCitzdGF0aWMgaW50IGVuY29kZV9wYWNrZXQoSnBlZzIwMDBFbmNvZGVyQ29udGV4dCAqcywgSnBlZzIwMDBSZXNMZXZlbCAqcmxldmVsLCBpbnQgcHJlY25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpleHBuLCBpbnQgbnVtZ2JpdHMpCit7CisgICAgaW50IGJhbmRubywgZW1wdHkgPSAxOworCisgICAgLy8gaW5pdCBiaXRzdHJlYW0KKyAgICAqcy0+YnVmID0gMDsKKyAgICBzLT5iaXRfaW5kZXggPSAwOworCisgICAgLy8gaGVhZGVyCisKKyAgICAvLyBpcyB0aGUgcGFja2V0IGVtcHR5PworICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmxldmVsLT5uYmFuZHM7IGJhbmRubysrKXsKKyAgICAgICAgaWYgKHJsZXZlbC0+YmFuZFtiYW5kbm9dLmNvb3JkWzBdWzBdIDwgcmxldmVsLT5iYW5kW2JhbmRub10uY29vcmRbMF1bMV0KKyAgICAgICAgJiYgIHJsZXZlbC0+YmFuZFtiYW5kbm9dLmNvb3JkWzFdWzBdIDwgcmxldmVsLT5iYW5kW2JhbmRub10uY29vcmRbMV1bMV0peworICAgICAgICAgICAgZW1wdHkgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdXRfYml0cyhzLCAhZW1wdHksIDEpOworICAgIGlmIChlbXB0eSl7CisgICAgICAgIGoya19mbHVzaChzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCBybGV2ZWwtPm5iYW5kczsgYmFuZG5vKyspeworICAgICAgICBKcGVnMjAwMEJhbmQgKmJhbmQgPSBybGV2ZWwtPmJhbmQgKyBiYW5kbm87CisgICAgICAgIEpwZWcyMDAwUHJlYyAqcHJlYyA9IGJhbmQtPnByZWMgKyBwcmVjbm87CisgICAgICAgIGludCB5aSwgeGksIHBvczsKKyAgICAgICAgaW50IGNibGtudyA9IHByZWMtPm5iX2NvZGVibG9ja3Nfd2lkdGg7CisKKyAgICAgICAgaWYgKGJhbmQtPmNvb3JkWzBdWzBdID09IGJhbmQtPmNvb3JkWzBdWzFdCisgICAgICAgIHx8ICBiYW5kLT5jb29yZFsxXVswXSA9PSBiYW5kLT5jb29yZFsxXVsxXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvciAocG9zPTAsIHlpID0gMDsgeWkgPCBwcmVjLT5uYl9jb2RlYmxvY2tzX2hlaWdodDsgeWkrKyl7CisgICAgICAgICAgICBmb3IgKHhpID0gMDsgeGkgPCBjYmxrbnc7IHhpKyssIHBvcysrKXsKKyAgICAgICAgICAgICAgICBwcmVjLT5jYmxraW5jbFtwb3NdLnZhbCA9IHByZWMtPmNibGtbeWkgKiBjYmxrbncgKyB4aV0ubmluY2xwYXNzZXMgPT0gMDsKKyAgICAgICAgICAgICAgICB0YWdfdHJlZV91cGRhdGUocHJlYy0+Y2Jsa2luY2wgKyBwb3MpOworICAgICAgICAgICAgICAgIHByZWMtPnplcm9iaXRzW3Bvc10udmFsID0gZXhwbltiYW5kbm9dICsgbnVtZ2JpdHMgLSAxIC0gcHJlYy0+Y2Jsa1t5aSAqIGNibGtudyArIHhpXS5ub256ZXJvYml0czsKKyAgICAgICAgICAgICAgICB0YWdfdHJlZV91cGRhdGUocHJlYy0+emVyb2JpdHMgKyBwb3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChwb3M9MCwgeWkgPSAwOyB5aSA8IHByZWMtPm5iX2NvZGVibG9ja3NfaGVpZ2h0OyB5aSsrKXsKKyAgICAgICAgICAgIGZvciAoeGkgPSAwOyB4aSA8IGNibGtudzsgeGkrKywgcG9zKyspeworICAgICAgICAgICAgICAgIGludCBwYWQgPSAwLCBsbGVuLCBsZW5ndGg7CisgICAgICAgICAgICAgICAgSnBlZzIwMDBDYmxrICpjYmxrID0gcHJlYy0+Y2JsayArIHlpICogY2Jsa253ICsgeGk7CisKKyAgICAgICAgICAgICAgICBpZiAocy0+YnVmX2VuZCAtIHMtPmJ1ZiA8IDIwKSAvLyBhcHByb3hpbWF0ZWx5CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgIC8vIGluY2x1c2lvbiBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIHRhZ190cmVlX2NvZGUocywgcHJlYy0+Y2Jsa2luY2wgKyBwb3MsIDEpOworICAgICAgICAgICAgICAgIGlmICghY2Jsay0+bmluY2xwYXNzZXMpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIC8vIHplcm9iaXRzIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgdGFnX3RyZWVfY29kZShzLCBwcmVjLT56ZXJvYml0cyArIHBvcywgMTAwKTsKKyAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgcGFzc2VzCisgICAgICAgICAgICAgICAgcHV0bnVtcGFzc2VzKHMsIGNibGstPm5pbmNscGFzc2VzKTsKKworICAgICAgICAgICAgICAgIGxlbmd0aCA9IGNibGstPnBhc3Nlc1tjYmxrLT5uaW5jbHBhc3Nlcy0xXS5yYXRlOworICAgICAgICAgICAgICAgIGxsZW4gPSBhdl9sb2cyKGxlbmd0aCkgLSBhdl9sb2cyKGNibGstPm5pbmNscGFzc2VzKSAtIDI7CisgICAgICAgICAgICAgICAgaWYgKGxsZW4gPCAwKXsKKyAgICAgICAgICAgICAgICAgICAgcGFkID0gLWxsZW47CisgICAgICAgICAgICAgICAgICAgIGxsZW4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBsZW5ndGggb2YgY29kZSBibG9jaworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHMsIDEsIGxsZW4pOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHMsIDAsIDEpOworICAgICAgICAgICAgICAgIHB1dF9udW0ocywgbGVuZ3RoLCBhdl9sb2cyKGxlbmd0aCkrMStwYWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGoya19mbHVzaChzKTsKKyAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJsZXZlbC0+bmJhbmRzOyBiYW5kbm8rKyl7CisgICAgICAgIEpwZWcyMDAwQmFuZCAqYmFuZCA9IHJsZXZlbC0+YmFuZCArIGJhbmRubzsKKyAgICAgICAgSnBlZzIwMDBQcmVjICpwcmVjID0gYmFuZC0+cHJlYyArIHByZWNubzsKKyAgICAgICAgaW50IHlpLCBjYmxrbncgPSBwcmVjLT5uYl9jb2RlYmxvY2tzX3dpZHRoOworICAgICAgICBmb3IgKHlpID0wOyB5aSA8IHByZWMtPm5iX2NvZGVibG9ja3NfaGVpZ2h0OyB5aSsrKXsKKyAgICAgICAgICAgIGludCB4aTsKKyAgICAgICAgICAgIGZvciAoeGkgPSAwOyB4aSA8IGNibGtudzsgeGkrKyl7CisgICAgICAgICAgICAgICAgSnBlZzIwMDBDYmxrICpjYmxrID0gcHJlYy0+Y2JsayArIHlpICogY2Jsa253ICsgeGk7CisgICAgICAgICAgICAgICAgaWYgKGNibGstPm5pbmNscGFzc2VzKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmJ1Zl9lbmQgLSBzLT5idWYgPCBjYmxrLT5wYXNzZXNbY2Jsay0+bmluY2xwYXNzZXMtMV0ucmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZzLT5idWYsIGNibGstPmRhdGEsIGNibGstPnBhc3Nlc1tjYmxrLT5uaW5jbHBhc3Nlcy0xXS5yYXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3BhY2tldHMoSnBlZzIwMDBFbmNvZGVyQ29udGV4dCAqcywgSnBlZzIwMDBUaWxlICp0aWxlLCBpbnQgdGlsZW5vKQoreworICAgIGludCBjb21wbm8sIHJlc2xldmVsbm8sIHJldDsKKyAgICBKcGVnMjAwMENvZGluZ1N0eWxlICpjb2RzdHkgPSAmcy0+Y29kc3R5OworICAgIEpwZWcyMDAwUXVhbnRTdHlsZSAgKnFudHN0eSA9ICZzLT5xbnRzdHk7CisKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInRpZXIyXG4iKTsKKyAgICAvLyBsYXktcmxldmVsLWNvbXAtcG9zIHByb2dyZXNzaW9uCisgICAgZm9yIChyZXNsZXZlbG5vID0gMDsgcmVzbGV2ZWxubyA8IGNvZHN0eS0+bnJlc2xldmVsczsgcmVzbGV2ZWxubysrKXsKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBzLT5uY29tcG9uZW50czsgY29tcG5vKyspeworICAgICAgICAgICAgaW50IHByZWNubzsKKyAgICAgICAgICAgIEpwZWcyMDAwUmVzTGV2ZWwgKnJlc2xldmVsID0gcy0+dGlsZVt0aWxlbm9dLmNvbXBbY29tcG5vXS5yZXNsZXZlbCArIHJlc2xldmVsbm87CisgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlc2xldmVsLT5udW1fcHJlY2luY3RzX3ggKiByZXNsZXZlbC0+bnVtX3ByZWNpbmN0c195OyBwcmVjbm8rKyl7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9IGVuY29kZV9wYWNrZXQocywgcmVzbGV2ZWwsIHByZWNubywgcW50c3R5LT5leHBuICsgKHJlc2xldmVsbm8gPyAzKnJlc2xldmVsbm8tMiA6IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW50c3R5LT5uZ3VhcmRiaXRzKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImFmdGVyIHRpZXIyXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRjdXQoSnBlZzIwMDBDYmxrICpjYmxrLCBpbnQ2NF90IGxhbWJkYSwgaW50IGR3dF9ub3JtKQoreworICAgIGludCBwYXNzbm8sIHJlcyA9IDA7CisgICAgZm9yIChwYXNzbm8gPSAwOyBwYXNzbm8gPCBjYmxrLT5ucGFzc2VzOyBwYXNzbm8rKyl7CisgICAgICAgIGludCBkcjsKKyAgICAgICAgaW50NjRfdCBkZDsKKworICAgICAgICBkciA9IGNibGstPnBhc3Nlc1twYXNzbm9dLnJhdGUKKyAgICAgICAgICAgLSAocmVzID8gY2Jsay0+cGFzc2VzW3Jlcy0xXS5yYXRlOjApOworICAgICAgICBkZCA9IGNibGstPnBhc3Nlc1twYXNzbm9dLmRpc3RvCisgICAgICAgICAgIC0gKHJlcyA/IGNibGstPnBhc3Nlc1tyZXMtMV0uZGlzdG86MCk7CisKKyAgICAgICAgaWYgKCgoZGQgKiBkd3Rfbm9ybSkgPj4gV01TRURFQ19TSElGVCkgKiBkd3Rfbm9ybSA+PSBkciAqIGxhbWJkYSkKKyAgICAgICAgICAgIHJlcyA9IHBhc3NubysxOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCB0cnVuY3Bhc3NlcyhKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzLCBKcGVnMjAwMFRpbGUgKnRpbGUpCit7CisgICAgaW50IHByZWNubywgY29tcG5vLCByZXNsZXZlbG5vLCBiYW5kbm8sIGNibGtubywgbGV2OworICAgIEpwZWcyMDAwQ29kaW5nU3R5bGUgKmNvZHN0eSA9ICZzLT5jb2RzdHk7CisKKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHMtPm5jb21wb25lbnRzOyBjb21wbm8rKyl7CisgICAgICAgIEpwZWcyMDAwQ29tcG9uZW50ICpjb21wID0gdGlsZS0+Y29tcCArIGNvbXBubzsKKworICAgICAgICBmb3IgKHJlc2xldmVsbm8gPSAwLCBsZXYgPSBjb2RzdHktPm5yZXNsZXZlbHMtMTsgcmVzbGV2ZWxubyA8IGNvZHN0eS0+bnJlc2xldmVsczsgcmVzbGV2ZWxubysrLCBsZXYtLSl7CisgICAgICAgICAgICBKcGVnMjAwMFJlc0xldmVsICpyZXNsZXZlbCA9IGNvbXAtPnJlc2xldmVsICsgcmVzbGV2ZWxubzsKKworICAgICAgICAgICAgZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCByZXNsZXZlbC0+bnVtX3ByZWNpbmN0c194ICogcmVzbGV2ZWwtPm51bV9wcmVjaW5jdHNfeTsgcHJlY25vKyspeworICAgICAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzbGV2ZWwtPm5iYW5kcyA7IGJhbmRubysrKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJhbmRwb3MgPSBiYW5kbm8gKyAocmVzbGV2ZWxubyA+IDApOworICAgICAgICAgICAgICAgICAgICBKcGVnMjAwMEJhbmQgKmJhbmQgPSByZXNsZXZlbC0+YmFuZCArIGJhbmRubzsKKyAgICAgICAgICAgICAgICAgICAgSnBlZzIwMDBQcmVjICpwcmVjID0gYmFuZC0+cHJlYyArIHByZWNubzsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByZWMtPm5iX2NvZGVibG9ja3NfaGVpZ2h0ICogcHJlYy0+bmJfY29kZWJsb2Nrc193aWR0aDsgY2Jsa25vKyspeworICAgICAgICAgICAgICAgICAgICAgICAgSnBlZzIwMDBDYmxrICpjYmxrID0gcHJlYy0+Y2JsayArIGNibGtubzsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bmluY2xwYXNzZXMgPSBnZXRjdXQoY2Jsaywgcy0+bGFtYmRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdClkd3Rfbm9ybXNbY29kc3R5LT50cmFuc2Zvcm0gPT0gRkZfRFdUNTNdW2JhbmRwb3NdW2xldl0gKiAoaW50NjRfdCliYW5kLT5pX3N0ZXBzaXplID4+IDE1KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBlbmNvZGVfdGlsZShKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzLCBKcGVnMjAwMFRpbGUgKnRpbGUsIGludCB0aWxlbm8pCit7CisgICAgaW50IGNvbXBubywgcmVzbGV2ZWxubywgYmFuZG5vLCByZXQ7CisgICAgSnBlZzIwMDBUMUNvbnRleHQgdDE7CisgICAgSnBlZzIwMDBDb2RpbmdTdHlsZSAqY29kc3R5ID0gJnMtPmNvZHN0eTsKKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHMtPm5jb21wb25lbnRzOyBjb21wbm8rKyl7CisgICAgICAgIEpwZWcyMDAwQ29tcG9uZW50ICpjb21wID0gcy0+dGlsZVt0aWxlbm9dLmNvbXAgKyBjb21wbm87CisKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsImR3dFxuIik7CisgICAgICAgIGlmIChyZXQgPSBmZl9kd3RfZW5jb2RlKCZjb21wLT5kd3QsIGNvbXAtPmlfZGF0YSkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywiYWZ0ZXIgZHd0IC0+IHRpZXIxXG4iKTsKKworICAgICAgICBmb3IgKHJlc2xldmVsbm8gPSAwOyByZXNsZXZlbG5vIDwgY29kc3R5LT5ucmVzbGV2ZWxzOyByZXNsZXZlbG5vKyspeworICAgICAgICAgICAgSnBlZzIwMDBSZXNMZXZlbCAqcmVzbGV2ZWwgPSBjb21wLT5yZXNsZXZlbCArIHJlc2xldmVsbm87CisKKyAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzbGV2ZWwtPm5iYW5kcyA7IGJhbmRubysrKXsKKyAgICAgICAgICAgICAgICBKcGVnMjAwMEJhbmQgKmJhbmQgPSByZXNsZXZlbC0+YmFuZCArIGJhbmRubzsKKyAgICAgICAgICAgICAgICBKcGVnMjAwMFByZWMgKnByZWMgPSBiYW5kLT5wcmVjOyAvLyB3ZSBzdXBwb3J0IG9ubHkgMSBwcmVjaW5jdCBwZXIgYmFuZCBBVE0gaW4gdGhlIGVuY29kZXIKKyAgICAgICAgICAgICAgICBpbnQgY2Jsa3gsIGNibGt5LCBjYmxrbm89MCwgeHgwLCB4MCwgeHgxLCB5MCwgeXkwLCB5eTEsIGJhbmRwb3M7CisgICAgICAgICAgICAgICAgeXkwID0gYmFuZG5vID09IDAgPyAwIDogY29tcC0+cmVzbGV2ZWxbcmVzbGV2ZWxuby0xXS5jb29yZFsxXVsxXSAtIGNvbXAtPnJlc2xldmVsW3Jlc2xldmVsbm8tMV0uY29vcmRbMV1bMF07CisgICAgICAgICAgICAgICAgeTAgPSB5eTA7CisgICAgICAgICAgICAgICAgeXkxID0gRkZNSU4oZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIoYmFuZC0+Y29vcmRbMV1bMF0gKyAxLCBiYW5kLT5sb2cyX2NibGtfaGVpZ2h0KSA8PCBiYW5kLT5sb2cyX2NibGtfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPmNvb3JkWzFdWzFdKSAtIGJhbmQtPmNvb3JkWzFdWzBdICsgeXkwOworCisgICAgICAgICAgICAgICAgaWYgKGJhbmQtPmNvb3JkWzBdWzBdID09IGJhbmQtPmNvb3JkWzBdWzFdIHx8IGJhbmQtPmNvb3JkWzFdWzBdID09IGJhbmQtPmNvb3JkWzFdWzFdKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGJhbmRwb3MgPSBiYW5kbm8gKyAocmVzbGV2ZWxubyA+IDApOworCisgICAgICAgICAgICAgICAgZm9yIChjYmxreSA9IDA7IGNibGt5IDwgcHJlYy0+bmJfY29kZWJsb2Nrc19oZWlnaHQ7IGNibGt5KyspeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzbGV2ZWxubyA9PSAwIHx8IGJhbmRubyA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgeHgwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeHgwID0gY29tcC0+cmVzbGV2ZWxbcmVzbGV2ZWxuby0xXS5jb29yZFswXVsxXSAtIGNvbXAtPnJlc2xldmVsW3Jlc2xldmVsbm8tMV0uY29vcmRbMF1bMF07CisgICAgICAgICAgICAgICAgICAgIHgwID0geHgwOworICAgICAgICAgICAgICAgICAgICB4eDEgPSBGRk1JTihmZl9qcGVnMjAwMF9jZWlsZGl2cG93MihiYW5kLT5jb29yZFswXVswXSArIDEsIGJhbmQtPmxvZzJfY2Jsa193aWR0aCkgPDwgYmFuZC0+bG9nMl9jYmxrX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLT5jb29yZFswXVsxXSkgLSBiYW5kLT5jb29yZFswXVswXSArIHh4MDsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGt4ID0gMDsgY2Jsa3ggPCBwcmVjLT5uYl9jb2RlYmxvY2tzX3dpZHRoOyBjYmxreCsrLCBjYmxrbm8rKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwgeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RzdHktPnRyYW5zZm9ybSA9PSBGRl9EV1Q1Myl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0geXkwOyB5IDwgeXkxOyB5KyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnB0ciA9IHQxLmRhdGFbeS15eTBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSB4eDA7IHggPCB4eDE7IHgrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSBjb21wLT5pX2RhdGFbKGNvbXAtPmNvb3JkWzBdWzFdIC0gY29tcC0+Y29vcmRbMF1bMF0pICogeSArIHhdIDw8IE5NU0VERUNfRlJBQ0JJVFM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0geXkwOyB5IDwgeXkxOyB5KyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnB0ciA9IHQxLmRhdGFbeS15eTBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSB4eDA7IHggPCB4eDE7IHgrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gKGNvbXAtPmlfZGF0YVsoY29tcC0+Y29vcmRbMF1bMV0gLSBjb21wLT5jb29yZFswXVswXSkgKiB5ICsgeF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9IChpbnQ2NF90KSpwdHIgKiAoaW50NjRfdCkoMTYzODQgKiA2NTUzNiAvIGJhbmQtPmlfc3RlcHNpemUpID4+IDE1IC0gTk1TRURFQ19GUkFDQklUUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2NibGsocywgJnQxLCBwcmVjLT5jYmxrICsgY2Jsa25vLCB0aWxlLCB4eDEgLSB4eDAsIHl5MSAtIHl5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRwb3MsIGNvZHN0eS0+bnJlc2xldmVscyAtIHJlc2xldmVsbm8gLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHh4MCA9IHh4MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHh4MSA9IEZGTUlOKHh4MSArICgxIDw8IGJhbmQtPmxvZzJfY2Jsa193aWR0aCksIGJhbmQtPmNvb3JkWzBdWzFdIC0gYmFuZC0+Y29vcmRbMF1bMF0gKyB4MCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeXkwID0geXkxOworICAgICAgICAgICAgICAgICAgICB5eTEgPSBGRk1JTih5eTEgKyAoMSA8PCBiYW5kLT5sb2cyX2NibGtfaGVpZ2h0KSwgYmFuZC0+Y29vcmRbMV1bMV0gLSBiYW5kLT5jb29yZFsxXVswXSArIHkwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJhZnRlciB0aWVyMVxuIik7CisgICAgfQorCisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJyYXRlIGNvbnRyb2xcbiIpOworICAgIHRydW5jcGFzc2VzKHMsIHRpbGUpOworICAgIGlmIChyZXQgPSBlbmNvZGVfcGFja2V0cyhzLCB0aWxlLCB0aWxlbm8pKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiYWZ0ZXIgcmF0ZSBjb250cm9sXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cChKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzKQoreworICAgIGludCB0aWxlbm8sIGNvbXBubzsKKyAgICBKcGVnMjAwMENvZGluZ1N0eWxlICpjb2RzdHkgPSAmcy0+Y29kc3R5OworCisgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBzLT5udW1YdGlsZXMgKiBzLT5udW1ZdGlsZXM7IHRpbGVubysrKXsKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBzLT5uY29tcG9uZW50czsgY29tcG5vKyspeworICAgICAgICAgICAgSnBlZzIwMDBDb21wb25lbnQgKmNvbXAgPSBzLT50aWxlW3RpbGVub10uY29tcCArIGNvbXBubzsKKyAgICAgICAgICAgIGZmX2pwZWcyMDAwX2NsZWFudXAoY29tcCwgY29kc3R5KTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmcy0+dGlsZVt0aWxlbm9dLmNvbXApOworICAgIH0KKyAgICBhdl9mcmVlcCgmcy0+dGlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlaW5pdChKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzKQoreworICAgIGludCB0aWxlbm8sIGNvbXBubzsKKyAgICBmb3IgKHRpbGVubyA9IDA7IHRpbGVubyA8IHMtPm51bVh0aWxlcyAqIHMtPm51bVl0aWxlczsgdGlsZW5vKyspeworICAgICAgICBKcGVnMjAwMFRpbGUgKnRpbGUgPSBzLT50aWxlICsgdGlsZW5vOworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHMtPm5jb21wb25lbnRzOyBjb21wbm8rKykKKyAgICAgICAgICAgIGZmX2pwZWcyMDAwX3JlaW5pdCh0aWxlLT5jb21wICsgY29tcG5vLCAmcy0+Y29kc3R5KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpY3QsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBpbnQgdGlsZW5vLCByZXQ7CisgICAgSnBlZzIwMDBFbmNvZGVyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgYXZjdHgtPndpZHRoKmF2Y3R4LT5oZWlnaHQqOSArIEZGX01JTl9CVUZGRVJfU0laRSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8vIGluaXQ6CisgICAgcy0+YnVmID0gcy0+YnVmX3N0YXJ0ID0gcGt0LT5kYXRhOworICAgIHMtPmJ1Zl9lbmQgPSBwa3QtPmRhdGEgKyBwa3QtPnNpemU7CisKKyAgICBzLT5waWN0dXJlID0gcGljdDsKKworICAgIHMtPmxhbWJkYSA9IHMtPnBpY3R1cmUtPnF1YWxpdHkgKiBMQU1CREFfU0NBTEU7CisKKyAgICBjb3B5X2ZyYW1lKHMpOworICAgIHJlaW5pdChzKTsKKworICAgIGlmIChzLT5idWZfZW5kIC0gcy0+YnVmIDwgMikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnMtPmJ1ZiwgSlBFRzIwMDBfU09DKTsKKyAgICBpZiAocmV0ID0gcHV0X3NpeihzKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAocmV0ID0gcHV0X2NvZChzKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAocmV0ID0gcHV0X3FjZChzLCAwKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAodGlsZW5vID0gMDsgdGlsZW5vIDwgcy0+bnVtWHRpbGVzICogcy0+bnVtWXRpbGVzOyB0aWxlbm8rKyl7CisgICAgICAgIHVpbnQ4X3QgKnBzb3RwdHI7CisgICAgICAgIGlmICghKHBzb3RwdHIgPSBwdXRfc290KHMsIHRpbGVubykpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAocy0+YnVmX2VuZCAtIHMtPmJ1ZiA8IDIpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnMtPmJ1ZiwgSlBFRzIwMDBfU09EKTsKKyAgICAgICAgaWYgKHJldCA9IGVuY29kZV90aWxlKHMsIHMtPnRpbGUgKyB0aWxlbm8sIHRpbGVubykpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwc290cHRyLCBzLT5idWYgLSBwc290cHRyICsgNik7CisgICAgfQorICAgIGlmIChzLT5idWZfZW5kIC0gcy0+YnVmIDwgMikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnMtPmJ1ZiwgSlBFRzIwMDBfRU9DKTsKKworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiZW5kXG4iKTsKKyAgICBwa3QtPnNpemUgPSBzLT5idWYgLSBzLT5idWZfc3RhcnQ7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBqMmtlbmNfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGksIHJldDsKKyAgICBKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBKcGVnMjAwMENvZGluZ1N0eWxlICpjb2RzdHkgPSAmcy0+Y29kc3R5OworICAgIEpwZWcyMDAwUXVhbnRTdHlsZSAgKnFudHN0eSA9ICZzLT5xbnRzdHk7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiaW5pdFxuIik7CisKKyAgICAvLyBkZWZhdWx0czoKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQgc2V0dGluZyBub24tc3RhbmRhcmQgcHJlY2luY3Qgc2l6ZQorICAgIG1lbXNldChjb2RzdHktPmxvZzJfcHJlY193aWR0aHMgLCAxNSwgc2l6ZW9mKGNvZHN0eS0+bG9nMl9wcmVjX3dpZHRocyApKTsKKyAgICBtZW1zZXQoY29kc3R5LT5sb2cyX3ByZWNfaGVpZ2h0cywgMTUsIHNpemVvZihjb2RzdHktPmxvZzJfcHJlY19oZWlnaHRzKSk7CisgICAgY29kc3R5LT5ucmVzbGV2ZWxzMmRlY29kZT0KKyAgICBjb2RzdHktPm5yZXNsZXZlbHMgICAgICAgPSA3OworICAgIGNvZHN0eS0+bG9nMl9jYmxrX3dpZHRoICA9IDQ7CisgICAgY29kc3R5LT5sb2cyX2NibGtfaGVpZ2h0ID0gNDsKKyAgICBjb2RzdHktPnRyYW5zZm9ybSAgICAgICAgPSBhdmN0eC0+cHJlZGljdGlvbl9tZXRob2QgPyBGRl9EV1Q1MyA6IEZGX0RXVDk3X0lOVDsKKworICAgIHFudHN0eS0+bmd1YXJkYml0cyAgICAgICA9IDE7CisKKyAgICBzLT50aWxlX3dpZHRoICAgICAgICAgICAgPSAyNTY7CisgICAgcy0+dGlsZV9oZWlnaHQgICAgICAgICAgID0gMjU2OworCisgICAgaWYgKGNvZHN0eS0+dHJhbnNmb3JtID09IEZGX0RXVDUzKQorICAgICAgICBxbnRzdHktPnF1YW50c3R5ID0gSlBFRzIwMDBfUVNUWV9OT05FOworICAgIGVsc2UKKyAgICAgICAgcW50c3R5LT5xdWFudHN0eSA9IEpQRUcyMDAwX1FTVFlfU0U7CisKKyAgICBzLT53aWR0aCA9IGF2Y3R4LT53aWR0aDsKKyAgICBzLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgcy0+Y2Jwc1tpXSA9IDg7CisKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCl7CisgICAgICAgIHMtPm5jb21wb25lbnRzID0gMzsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR1JBWTgpeworICAgICAgICBzLT5uY29tcG9uZW50cyA9IDE7CisgICAgfSBlbHNleyAvLyBwbGFuYXIgWVVWCisgICAgICAgIHMtPnBsYW5hciA9IDE7CisgICAgICAgIHMtPm5jb21wb25lbnRzID0gMzsKKyAgICAgICAgYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUoYXZjdHgtPnBpeF9mbXQsCisgICAgICAgICAgICAgICAgcy0+Y2hyb21hX3NoaWZ0LCBzLT5jaHJvbWFfc2hpZnQgKyAxKTsKKyAgICB9CisKKyAgICBmZl9qcGVnMjAwMF9pbml0X3RpZXIxX2x1dHMoKTsKKyAgICBmZl9tcWNfaW5pdF9jb250ZXh0X3RhYmxlcygpOworICAgIGluaXRfbHV0cygpOworCisgICAgaW5pdF9xdWFudGl6YXRpb24ocyk7CisgICAgaWYgKHJldD1pbml0X3RpbGVzKHMpKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJhZnRlciBpbml0XG4iKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGoya2VuY19kZXN0cm95KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBKcGVnMjAwMEVuY29kZXJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGNsZWFudXAocyk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfanBlZzIwMDBfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAianBlZzIwMDAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJKUEVHIDIwMDAiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSlBFRzIwMDAsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEpwZWcyMDAwRW5jb2RlckNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGoya2VuY19pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGVuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBqMmtlbmNfZGVzdHJveSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRVhQRVJJTUVOVEFMLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeworICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfR1JBWTgsCisvKiAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLCovCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH0KK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9qYWNvc3ViLmggYi9mZm1wZWcvbGliYXZjb2RlYy9qYWNvc3ViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2NjVhZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2phY29zdWIuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIENsw6ltZW50IELFk3NjaAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBKQUNPc3ViIHNoYXJlZCB1dGlscworICovCisKKyNpZm5kZWYgQVZDT0RFQ19KQUNPU1VCX0gKKyNkZWZpbmUgQVZDT0RFQ19KQUNPU1VCX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworI2RlZmluZSBKU1NfTUFYX0xJTkVTSVpFIDUxMgorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQganNzX3doaXRlc3BhY2UoY2hhciBjKQoreworICAgIHJldHVybiBjID09ICcgJyB8fCAoYyA+PSAnXHQnICYmIGMgPD0gJ1xyJyk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGNvbnN0IGNoYXIgKmpzc19za2lwX3doaXRlc3BhY2UoY29uc3QgY2hhciAqcCkKK3sKKyAgICB3aGlsZSAoanNzX3doaXRlc3BhY2UoKnApKQorICAgICAgICBwKys7CisgICAgcmV0dXJuIHA7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX0pBQ09TVUJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvamFjb3N1YmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvamFjb3N1YmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOTQ5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9qYWNvc3ViZGVjLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQ2zDqW1lbnQgQsWTc2NoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEpBQ09zdWIgc3VidGl0bGUgZGVjb2RlcgorICogQHNlZSBodHRwOi8vdW5pY29ybi51cy5jb20vamFjb3N1Yi9qc2NyaXB0cy5odG1sCisgKi8KKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJhc3MuaCIKKyNpbmNsdWRlICJqYWNvc3ViLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lX2ludGVybmFsLmgiCisKKyN1bmRlZiB0aW1lCisKK3N0YXRpYyBpbnQgaW5zZXJ0X3RleHQoQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqaW4sIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBhdl9icHJpbnRmKGRzdCwgIiVzIiwgYXJnKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnNlcnRfZGF0ZXRpbWUoQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqaW4sIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBjaGFyIGJ1ZlsxNl0gPSB7MH07CisgICAgdGltZV90IG5vdyA9IHRpbWUoMCk7CisgICAgc3RydWN0IHRtIGx0aW1lOworCisgICAgbG9jYWx0aW1lX3IoJm5vdywgJmx0aW1lKTsKKyAgICBzdHJmdGltZShidWYsIHNpemVvZihidWYpLCBhcmcsICZsdGltZSk7CisgICAgYXZfYnByaW50Zihkc3QsICIlcyIsIGJ1Zik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5zZXJ0X2NvbG9yKEFWQlByaW50ICpkc3QsIGNvbnN0IGNoYXIgKmluLCBjb25zdCBjaGFyICphcmcpCit7CisgICAgcmV0dXJuIDE7IC8vIHNraXAgaWQKK30KKworc3RhdGljIGludCBpbnNlcnRfZm9udChBVkJQcmludCAqZHN0LCBjb25zdCBjaGFyICppbiwgY29uc3QgY2hhciAqYXJnKQoreworICAgIHJldHVybiAxOyAvLyBza2lwIGlkCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmZyb207CisgICAgY29uc3QgY2hhciAqYXJnOworICAgIGludCAoKmZ1bmMpKEFWQlByaW50ICpkc3QsIGNvbnN0IGNoYXIgKmluLCBjb25zdCBjaGFyICphcmcpOworfSBhc3NfY29kZXNfbWFwW10gPSB7CisgICAgeyJcXH4iLCAifiIsICAgICAgICBpbnNlcnRfdGV4dH0sICAgICAgIC8vIHRpbGRlIGRvZXNuJ3QgbmVlZCBlc2NhcGluZworICAgIHsifiIsICAgIntcXGh9IiwgICAgaW5zZXJ0X3RleHR9LCAgICAgICAvLyBoYXJkIHNwYWNlCisgICAgeyJcXG4iLCAiXFxOIiwgICAgICBpbnNlcnRfdGV4dH0sICAgICAgIC8vIG5ld2xpbmUKKyAgICB7IlxcRCIsICIlZCAlYiAlWSIsIGluc2VydF9kYXRldGltZX0sICAgLy8gY3VycmVudCBkYXRlCisgICAgeyJcXFQiLCAiJUg6JU0iLCAgICBpbnNlcnRfZGF0ZXRpbWV9LCAgIC8vIGN1cnJlbnQgdGltZQorICAgIHsiXFxOIiwgIntcXHJ9IiwgICAgaW5zZXJ0X3RleHR9LCAgICAgICAvLyByZXNldCB0byBkZWZhdWx0IHN0eWxlCisgICAgeyJcXEkiLCAie1xcaTF9IiwgICBpbnNlcnRfdGV4dH0sICAgICAgIC8vIGl0YWxpYyBvbgorICAgIHsiXFxpIiwgIntcXGkwfSIsICAgaW5zZXJ0X3RleHR9LCAgICAgICAvLyBpdGFsaWMgb2ZmCisgICAgeyJcXEIiLCAie1xcYjF9IiwgICBpbnNlcnRfdGV4dH0sICAgICAgIC8vIGJvbGQgb24KKyAgICB7IlxcYiIsICJ7XFxiMH0iLCAgIGluc2VydF90ZXh0fSwgICAgICAgLy8gYm9sZCBvZmYKKyAgICB7IlxcVSIsICJ7XFx1MX0iLCAgIGluc2VydF90ZXh0fSwgICAgICAgLy8gdW5kZXJsaW5lIG9uCisgICAgeyJcXHUiLCAie1xcdTB9IiwgICBpbnNlcnRfdGV4dH0sICAgICAgIC8vIHVuZGVybGluZSBvZmYKKyAgICB7IlxcQyIsICIiLCAgICAgICAgIGluc2VydF9jb2xvcn0sICAgICAgLy8gVE9ETzogY29sb3IKKyAgICB7IlxcRiIsICIiLCAgICAgICAgIGluc2VydF9mb250fSwgICAgICAgLy8gVE9ETzogZm9udAorfTsKKworZW51bSB7CisgICAgQUxJR05fVkIgPSAxPDwwLCAvLyB2ZXJ0aWNhbCBib3R0b20sIGRlZmF1bHQKKyAgICBBTElHTl9WTSA9IDE8PDEsIC8vIHZlcnRpY2FsIG1pZGRsZQorICAgIEFMSUdOX1ZUID0gMTw8MiwgLy8gdmVydGljYWwgdG9wCisgICAgQUxJR05fSkMgPSAxPDwzLCAvLyBqdXN0aWZ5IGNlbnRlciwgZGVmYXVsdAorICAgIEFMSUdOX0pMID0gMTw8NCwgLy8ganVzdGlmeSBsZWZ0CisgICAgQUxJR05fSlIgPSAxPDw1LCAvLyBqdXN0aWZ5IHJpZ2h0Cit9OworCitzdGF0aWMgdm9pZCBqYWNvc3ViX3RvX2FzcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWQlByaW50ICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgICBpbnQgaSwgdmFsaWduID0gMCwgaGFsaWduID0gMDsKKyAgICBjaGFyIGMgPSBhdl90b3VwcGVyKCpzcmMpOworICAgIGNoYXIgZGlyZWN0aXZlc1sxMjhdID0gezB9OworCisgICAgLyogZXh0cmFjdCB0aGUgb3B0aW9uYWwgZGlyZWN0aXZlcyAqLworICAgIGlmICgoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8IGMgPT0gJ1snKSB7CisgICAgICAgIGNoYXIgKnAgICAgPSBkaXJlY3RpdmVzOworICAgICAgICBjaGFyICpwZW5kID0gZGlyZWN0aXZlcyArIHNpemVvZihkaXJlY3RpdmVzKSAtIDE7CisKKyAgICAgICAgZG8gKnArKyA9IGF2X3RvdXBwZXIoKnNyYysrKTsKKyAgICAgICAgd2hpbGUgKCpzcmMgJiYgIWpzc193aGl0ZXNwYWNlKCpzcmMpICYmIHAgPCBwZW5kKTsKKyAgICAgICAgKnAgPSAwOworICAgICAgICBzcmMgPSBqc3Nfc2tpcF93aGl0ZXNwYWNlKHNyYyk7CisgICAgfQorCisgICAgLyogaGFuZGxlIGRpcmVjdGl2ZXMgKFRPRE86IGhhbmRsZSBtb3JlIG9mIHRoZW0sIGFuZCBtb3JlIHJlbGlhYmx5KSAqLworICAgIGlmICAgICAgKHN0cnN0cihkaXJlY3RpdmVzLCAiVkIiKSkgdmFsaWduID0gQUxJR05fVkI7CisgICAgZWxzZSBpZiAoc3Ryc3RyKGRpcmVjdGl2ZXMsICJWTSIpKSB2YWxpZ24gPSBBTElHTl9WTTsKKyAgICBlbHNlIGlmIChzdHJzdHIoZGlyZWN0aXZlcywgIlZUIikpIHZhbGlnbiA9IEFMSUdOX1ZUOworICAgIGlmICAgICAgKHN0cnN0cihkaXJlY3RpdmVzLCAiSkMiKSkgaGFsaWduID0gQUxJR05fSkM7CisgICAgZWxzZSBpZiAoc3Ryc3RyKGRpcmVjdGl2ZXMsICJKTCIpKSBoYWxpZ24gPSBBTElHTl9KTDsKKyAgICBlbHNlIGlmIChzdHJzdHIoZGlyZWN0aXZlcywgIkpSIikpIGhhbGlnbiA9IEFMSUdOX0pSOworICAgIGlmICh2YWxpZ24gfHwgaGFsaWduKSB7CisgICAgICAgIGlmICghdmFsaWduKSB2YWxpZ24gPSBBTElHTl9WQjsKKyAgICAgICAgaWYgKCFoYWxpZ24pIGhhbGlnbiA9IEFMSUdOX0pDOworICAgICAgICBzd2l0Y2ggKHZhbGlnbiB8IGhhbGlnbikgeworICAgICAgICBjYXNlIEFMSUdOX1ZCIHwgQUxJR05fSkw6IGF2X2JwcmludGYoZHN0LCAie1xcYW4xfSIpOyBicmVhazsgLy8gYm90dG9tIGxlZnQKKyAgICAgICAgY2FzZSBBTElHTl9WQiB8IEFMSUdOX0pDOiBhdl9icHJpbnRmKGRzdCwgIntcXGFuMn0iKTsgYnJlYWs7IC8vIGJvdHRvbSBjZW50ZXIKKyAgICAgICAgY2FzZSBBTElHTl9WQiB8IEFMSUdOX0pSOiBhdl9icHJpbnRmKGRzdCwgIntcXGFuM30iKTsgYnJlYWs7IC8vIGJvdHRvbSByaWdodAorICAgICAgICBjYXNlIEFMSUdOX1ZNIHwgQUxJR05fSkw6IGF2X2JwcmludGYoZHN0LCAie1xcYW40fSIpOyBicmVhazsgLy8gbWlkZGxlIGxlZnQKKyAgICAgICAgY2FzZSBBTElHTl9WTSB8IEFMSUdOX0pDOiBhdl9icHJpbnRmKGRzdCwgIntcXGFuNX0iKTsgYnJlYWs7IC8vIG1pZGRsZSBjZW50ZXIKKyAgICAgICAgY2FzZSBBTElHTl9WTSB8IEFMSUdOX0pSOiBhdl9icHJpbnRmKGRzdCwgIntcXGFuNn0iKTsgYnJlYWs7IC8vIG1pZGRsZSByaWdodAorICAgICAgICBjYXNlIEFMSUdOX1ZUIHwgQUxJR05fSkw6IGF2X2JwcmludGYoZHN0LCAie1xcYW43fSIpOyBicmVhazsgLy8gdG9wIGxlZnQKKyAgICAgICAgY2FzZSBBTElHTl9WVCB8IEFMSUdOX0pDOiBhdl9icHJpbnRmKGRzdCwgIntcXGFuOH0iKTsgYnJlYWs7IC8vIHRvcCBjZW50ZXIKKyAgICAgICAgY2FzZSBBTElHTl9WVCB8IEFMSUdOX0pSOiBhdl9icHJpbnRmKGRzdCwgIntcXGFuOX0iKTsgYnJlYWs7IC8vIHRvcCByaWdodAorICAgICAgICB9CisgICAgfQorCisgICAgLyogcHJvY2VzcyB0aW1lZCBsaW5lICovCisgICAgd2hpbGUgKCpzcmMgJiYgKnNyYyAhPSAnXG4nKSB7CisKKyAgICAgICAgLyogdGV4dCBjb250aW51ZSBvbiB0aGUgbmV4dCBsaW5lICovCisgICAgICAgIGlmIChzcmNbMF0gPT0gJ1xcJyAmJiBzcmNbMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgc3JjICs9IDI7CisgICAgICAgICAgICB3aGlsZSAoanNzX3doaXRlc3BhY2UoKnNyYykpCisgICAgICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNwZWNpYWwgY2hhcmFjdGVyIGNvZGVzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhhc3NfY29kZXNfbWFwKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tID0gYXNzX2NvZGVzX21hcFtpXS5mcm9tOworICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnICA9IGFzc19jb2Rlc19tYXBbaV0uYXJnOworICAgICAgICAgICAgc2l6ZV90IGNvZGVtYXBfbGVuID0gc3RybGVuKGZyb20pOworCisgICAgICAgICAgICBpZiAoIXN0cm5jbXAoc3JjLCBmcm9tLCBjb2RlbWFwX2xlbikpIHsKKyAgICAgICAgICAgICAgICBzcmMgKz0gY29kZW1hcF9sZW47CisgICAgICAgICAgICAgICAgc3JjICs9IGFzc19jb2Rlc19tYXBbaV0uZnVuYyhkc3QsIHNyYywgYXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHNpbXBsZSBjaGFyIGNvcHkgKi8KKyAgICAgICAgaWYgKGkgPT0gRkZfQVJSQVlfRUxFTVMoYXNzX2NvZGVzX21hcCkpCisgICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIiVjIiwgKnNyYysrKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgamFjb3N1Yl9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9zdWJfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgaW50IHJldDsKKyAgICBBVlN1YnRpdGxlICpzdWIgPSBkYXRhOworICAgIGNvbnN0IGNoYXIgKnB0ciA9IGF2cGt0LT5kYXRhOworCisgICAgaWYgKGF2cGt0LT5zaXplIDw9IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgaWYgKCpwdHIpIHsKKyAgICAgICAgQVZCUHJpbnQgYnVmZmVyOworCisgICAgICAgIC8vIHNraXAgdGltZXJzCisgICAgICAgIHB0ciA9IGpzc19za2lwX3doaXRlc3BhY2UocHRyKTsKKyAgICAgICAgcHRyID0gc3RyY2hyKHB0ciwgJyAnKTsgaWYgKCFwdHIpIGdvdG8gZW5kOyBwdHIrKzsKKyAgICAgICAgcHRyID0gc3RyY2hyKHB0ciwgJyAnKTsgaWYgKCFwdHIpIGdvdG8gZW5kOyBwdHIrKzsKKworICAgICAgICBhdl9icHJpbnRfaW5pdCgmYnVmZmVyLCBKU1NfTUFYX0xJTkVTSVpFLCBKU1NfTUFYX0xJTkVTSVpFKTsKKyAgICAgICAgamFjb3N1Yl90b19hc3MoYXZjdHgsICZidWZmZXIsIHB0cik7CisgICAgICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdF9icHJpbnQoc3ViLCAmYnVmZmVyLCBhdnBrdC0+cHRzLCBhdnBrdC0+ZHVyYXRpb24pOworICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZmZlciwgTlVMTCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKK2VuZDoKKyAgICAqZ290X3N1Yl9wdHIgPSBzdWItPm51bV9yZWN0cyA+IDA7CisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX2phY29zdWJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiamFjb3N1YiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkpBQ09zdWIgc3VidGl0bGUiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSkFDT1NVQiwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9hc3Nfc3VidGl0bGVfaGVhZGVyX2RlZmF1bHQsCisgICAgLmRlY29kZSAgICAgICAgID0gamFjb3N1Yl9kZWNvZGVfZnJhbWUsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvamZkY3Rmc3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2pmZGN0ZnN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjZjU5OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2pmZGN0ZnN0LmMKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICoKKyAqIFRoZSBhdXRob3JzIG1ha2UgTk8gV0FSUkFOVFkgb3IgcmVwcmVzZW50YXRpb24sIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsCisgKiB3aXRoIHJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZSwgaXRzIHF1YWxpdHksIGFjY3VyYWN5LCBtZXJjaGFudGFiaWxpdHksIG9yCisgKiBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgIkFTIElTIiwgYW5kCisgKiB5b3UsIGl0cyB1c2VyLCBhc3N1bWUgdGhlIGVudGlyZSByaXNrIGFzIHRvIGl0cyBxdWFsaXR5IGFuZCBhY2N1cmFjeS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQgZXhjZXB0IGFzIHNwZWNpZmllZCBiZWxvdy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgc3ViamVjdCB0bworICogdGhlc2UgY29uZGl0aW9uczoKKyAqICgxKSBJZiBhbnkgcGFydCBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4KKyAqIHRoaXMgUkVBRE1FIGZpbGUgbXVzdCBiZSBpbmNsdWRlZCwgd2l0aCB0aGlzIGNvcHlyaWdodCBhbmQgbm8td2FycmFudHkKKyAqIG5vdGljZSB1bmFsdGVyZWQ7IGFuZCBhbnkgYWRkaXRpb25zLCBkZWxldGlvbnMsIG9yIGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsCisgKiBmaWxlcyBtdXN0IGJlIGNsZWFybHkgaW5kaWNhdGVkIGluIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uLgorICogKDIpIElmIG9ubHkgZXhlY3V0YWJsZSBjb2RlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoZSBhY2NvbXBhbnlpbmcKKyAqIGRvY3VtZW50YXRpb24gbXVzdCBzdGF0ZSB0aGF0ICJ0aGlzIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIHdvcmsKKyAqIG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwIi4KKyAqICgzKSBQZXJtaXNzaW9uIGZvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIG9ubHkgaWYgdGhlIHVzZXIgYWNjZXB0cworICogZnVsbCByZXNwb25zaWJpbGl0eSBmb3IgYW55IHVuZGVzaXJhYmxlIGNvbnNlcXVlbmNlczsgdGhlIGF1dGhvcnMgYWNjZXB0CisgKiBOTyBMSUFCSUxJVFkgZm9yIGRhbWFnZXMgb2YgYW55IGtpbmQuCisgKgorICogVGhlc2UgY29uZGl0aW9ucyBhcHBseSB0byBhbnkgc29mdHdhcmUgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoZSBJSkcKKyAqIGNvZGUsIG5vdCBqdXN0IHRvIHRoZSB1bm1vZGlmaWVkIGxpYnJhcnkuICBJZiB5b3UgdXNlIG91ciB3b3JrLCB5b3Ugb3VnaHQKKyAqIHRvIGFja25vd2xlZGdlIHVzLgorICoKKyAqIFBlcm1pc3Npb24gaXMgTk9UIGdyYW50ZWQgZm9yIHRoZSB1c2Ugb2YgYW55IElKRyBhdXRob3IncyBuYW1lIG9yIGNvbXBhbnkKKyAqIG5hbWUgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoaXMgc29mdHdhcmUgb3IgcHJvZHVjdHMKKyAqIGRlcml2ZWQgZnJvbSBpdC4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZmVycmVkIHRvIG9ubHkgYXMgInRoZSBJbmRlcGVuZGVudAorICogSlBFRyBHcm91cCdzIHNvZnR3YXJlIi4KKyAqCisgKiBXZSBzcGVjaWZpY2FsbHkgcGVybWl0IGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFzIHRoZSBiYXNpcworICogb2YgY29tbWVyY2lhbCBwcm9kdWN0cywgcHJvdmlkZWQgdGhhdCBhbGwgd2FycmFudHkgb3IgbGlhYmlsaXR5IGNsYWltcyBhcmUKKyAqIGFzc3VtZWQgYnkgdGhlIHByb2R1Y3QgdmVuZG9yLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIGZhc3QsIG5vdCBzbyBhY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICogZm9yd2FyZCBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLgorICoKKyAqIEEgMi1EIERDVCBjYW4gYmUgZG9uZSBieSAxLUQgRENUIG9uIGVhY2ggcm93IGZvbGxvd2VkIGJ5IDEtRCBEQ1QKKyAqIG9uIGVhY2ggY29sdW1uLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUKKyAqIG11Y2ggbW9yZSBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hJ3MgYWxnb3JpdGhtIGZvcgorICogc2NhbGVkIERDVC4gIFRoZWlyIG9yaWdpbmFsIHBhcGVyIChUcmFucy4gSUVJQ0UgRS03MSgxMSk6MTA5NSkgaXMgaW4KKyAqIEphcGFuZXNlLCBidXQgdGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gdGhlIFBlbm5lYmFrZXIgJiBNaXRjaGVsbAorICogSlBFRyB0ZXh0Ym9vayAoc2VlIFJFRkVSRU5DRVMgc2VjdGlvbiBpbiBmaWxlIFJFQURNRSkuICBUaGUgZm9sbG93aW5nIGNvZGUKKyAqIGlzIGJhc2VkIGRpcmVjdGx5IG9uIGZpZ3VyZSA0LTggaW4gUCZNLgorICogV2hpbGUgYW4gOC1wb2ludCBEQ1QgY2Fubm90IGJlIGRvbmUgaW4gbGVzcyB0aGFuIDExIG11bHRpcGxpZXMsIGl0IGlzCisgKiBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSBjb21wdXRhdGlvbiBzbyB0aGF0IG1hbnkgb2YgdGhlIG11bHRpcGxpZXMgYXJlCisgKiBzaW1wbGUgc2NhbGluZ3Mgb2YgdGhlIGZpbmFsIG91dHB1dHMuICBUaGVzZSBtdWx0aXBsaWVzIGNhbiB0aGVuIGJlCisgKiBmb2xkZWQgaW50byB0aGUgbXVsdGlwbGljYXRpb25zIG9yIGRpdmlzaW9ucyBieSB0aGUgSlBFRyBxdWFudGl6YXRpb24KKyAqIHRhYmxlIGVudHJpZXMuICBUaGUgQUEmTiBtZXRob2QgbGVhdmVzIG9ubHkgNSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzCisgKiB0byBiZSBkb25lIGluIHRoZSBEQ1QgaXRzZWxmLgorICogVGhlIHByaW1hcnkgZGlzYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgd2l0aCBmaXhlZC1wb2ludCBtYXRoLAorICogYWNjdXJhY3kgaXMgbG9zdCBkdWUgdG8gaW1wcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2FsZWQKKyAqIHF1YW50aXphdGlvbiB2YWx1ZXMuICBUaGUgc21hbGxlciB0aGUgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJ5LCB0aGUgbGVzcworICogcHJlY2lzZSB0aGUgc2NhbGVkIHZhbHVlLCBzbyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgd29yc2Ugd2l0aCBoaWdoLQorICogcXVhbGl0eS1zZXR0aW5nIGZpbGVzIHRoYW4gd2l0aCBsb3ctcXVhbGl0eSBvbmVzLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBmYXN0IEFBTiBkY3QuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImRjdC5oIgorCisjZGVmaW5lIERDVFNJWkUgOAorI2RlZmluZSBHTE9CQUwoeCkgeAorI2RlZmluZSBSSUdIVF9TSElGVCh4LCBuKSAoKHgpID4+IChuKSkKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyogU2NhbGluZyBkZWNpc2lvbnMgYXJlIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBpbiB0aGUgTEwmTSBhbGdvcml0aG07CisgKiBzZWUgamZkY3RpbnQuYyBmb3IgbW9yZSBkZXRhaWxzLiAgSG93ZXZlciwgd2UgY2hvb3NlIHRvIGRlc2NhbGUKKyAqIChyaWdodCBzaGlmdCkgbXVsdGlwbGljYXRpb24gcHJvZHVjdHMgYXMgc29vbiBhcyB0aGV5IGFyZSBmb3JtZWQsCisgKiByYXRoZXIgdGhhbiBjYXJyeWluZyBhZGRpdGlvbmFsIGZyYWN0aW9uYWwgYml0cyBpbnRvIHN1YnNlcXVlbnQgYWRkaXRpb25zLgorICogVGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSBzbGlnaHRseSwgYnV0IGl0IGxldHMgdXMgc2F2ZSBhIGZldyBzaGlmdHMuCisgKiBNb3JlIGltcG9ydGFudGx5LCAxNi1iaXQgYXJpdGhtZXRpYyBpcyB0aGVuIGFkZXF1YXRlIChmb3IgOC1iaXQgc2FtcGxlcykKKyAqIGV2ZXJ5d2hlcmUgZXhjZXB0IGluIHRoZSBtdWx0aXBsaWNhdGlvbnMgcHJvcGVyOyB0aGlzIHNhdmVzIGEgZ29vZCBkZWFsCisgKiBvZiB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCisgKgorICogQWdhaW4gdG8gc2F2ZSBhIGZldyBzaGlmdHMsIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBiZXR3ZWVuIHBhc3MgMSBhbmQKKyAqIHBhc3MgMiBhcmUgbm90IHVwc2NhbGVkLCBidXQgYXJlIHJlcHJlc2VudGVkIG9ubHkgdG8gaW50ZWdyYWwgcHJlY2lzaW9uLgorICoKKyAqIEEgZmluYWwgY29tcHJvbWlzZSBpcyB0byByZXByZXNlbnQgdGhlIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50cyB0byBvbmx5CisgKiA4IGZyYWN0aW9uYWwgYml0cywgcmF0aGVyIHRoYW4gMTMuICBUaGlzIHNhdmVzIHNvbWUgc2hpZnRpbmcgd29yayBvbiBzb21lCisgKiBtYWNoaW5lcywgYW5kIG1heSBhbHNvIHJlZHVjZSB0aGUgY29zdCBvZiBtdWx0aXBsaWNhdGlvbiAoc2luY2UgdGhlcmUKKyAqIGFyZSBmZXdlciBvbmUtYml0cyBpbiB0aGUgY29uc3RhbnRzKS4KKyAqLworCisjZGVmaW5lIENPTlNUX0JJVFMgIDgKKworCisvKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKKyAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgorICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KKyAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KKyAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCisgKi8KKworI2lmIENPTlNUX0JJVFMgPT0gOAorI2RlZmluZSBGSVhfMF8zODI2ODM0MzMgICgoaW50MzJfdCkgICA5OCkgICAgICAgLyogRklYKDAuMzgyNjgzNDMzKSAqLworI2RlZmluZSBGSVhfMF81NDExOTYxMDAgICgoaW50MzJfdCkgIDEzOSkgICAgICAgLyogRklYKDAuNTQxMTk2MTAwKSAqLworI2RlZmluZSBGSVhfMF83MDcxMDY3ODEgICgoaW50MzJfdCkgIDE4MSkgICAgICAgLyogRklYKDAuNzA3MTA2NzgxKSAqLworI2RlZmluZSBGSVhfMV8zMDY1NjI5NjUgICgoaW50MzJfdCkgIDMzNCkgICAgICAgLyogRklYKDEuMzA2NTYyOTY1KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMzgyNjgzNDMzICBGSVgoMC4zODI2ODM0MzMpCisjZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgRklYKDAuNTQxMTk2MTAwKQorI2RlZmluZSBGSVhfMF83MDcxMDY3ODEgIEZJWCgwLjcwNzEwNjc4MSkKKyNkZWZpbmUgRklYXzFfMzA2NTYyOTY1ICBGSVgoMS4zMDY1NjI5NjUpCisjZW5kaWYKKworCisvKiBXZSBjYW4gZ2FpbiBhIGxpdHRsZSBtb3JlIHNwZWVkLCB3aXRoIGEgZnVydGhlciBjb21wcm9taXNlIGluIGFjY3VyYWN5LAorICogYnkgb21pdHRpbmcgdGhlIGFkZGl0aW9uIGluIGEgZGVzY2FsaW5nIHNoaWZ0LiAgVGhpcyB5aWVsZHMgYW4gaW5jb3JyZWN0bHkKKyAqIHJvdW5kZWQgcmVzdWx0IGhhbGYgdGhlIHRpbWUuLi4KKyAqLworCisjaWZuZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORworI3VuZGVmIERFU0NBTEUKKyNkZWZpbmUgREVTQ0FMRSh4LG4pICBSSUdIVF9TSElGVCh4LCBuKQorI2VuZGlmCisKKworLyogTXVsdGlwbHkgYSBpbnQxNl90IHZhcmlhYmxlIGJ5IGFuIGludDMyX3QgY29uc3RhbnQsIGFuZCBpbW1lZGlhdGVseQorICogZGVzY2FsZSB0byB5aWVsZCBhIGludDE2X3QgcmVzdWx0LgorICovCisKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKChpbnQxNl90KSBERVNDQUxFKCh2YXIpICogKGNvbnN0KSwgQ09OU1RfQklUUykpCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcm93X2ZkY3QoaW50MTZfdCAqIGRhdGEpeworICBpbnQgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgaW50IHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBpbnQgejEsIHoyLCB6MywgejQsIHo1LCB6MTEsIHoxMzsKKyAgaW50MTZfdCAqZGF0YXB0cjsKKyAgaW50IGN0cjsKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIHRtcDAgPSBkYXRhcHRyWzBdICsgZGF0YXB0cls3XTsKKyAgICB0bXA3ID0gZGF0YXB0clswXSAtIGRhdGFwdHJbN107CisgICAgdG1wMSA9IGRhdGFwdHJbMV0gKyBkYXRhcHRyWzZdOworICAgIHRtcDYgPSBkYXRhcHRyWzFdIC0gZGF0YXB0cls2XTsKKyAgICB0bXAyID0gZGF0YXB0clsyXSArIGRhdGFwdHJbNV07CisgICAgdG1wNSA9IGRhdGFwdHJbMl0gLSBkYXRhcHRyWzVdOworICAgIHRtcDMgPSBkYXRhcHRyWzNdICsgZGF0YXB0cls0XTsKKyAgICB0bXA0ID0gZGF0YXB0clszXSAtIGRhdGFwdHJbNF07CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDEwID0gdG1wMCArIHRtcDM7ICAgICAgICAvKiBwaGFzZSAyICovCisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisKKyAgICBkYXRhcHRyWzBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLworICAgIGRhdGFwdHJbNF0gPSB0bXAxMCAtIHRtcDExOworCisgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLworICAgIGRhdGFwdHJbMl0gPSB0bXAxMyArIHoxOyAgICAvKiBwaGFzZSA1ICovCisgICAgZGF0YXB0cls2XSA9IHRtcDEzIC0gejE7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsgICAgICAgIC8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OworICAgIHRtcDEyID0gdG1wNiArIHRtcDc7CisKKyAgICAvKiBUaGUgcm90YXRvciBpcyBtb2RpZmllZCBmcm9tIGZpZyA0LTggdG8gYXZvaWQgZXh0cmEgbmVnYXRpb25zLiAqLworICAgIHo1ID0gTVVMVElQTFkodG1wMTAgLSB0bXAxMiwgRklYXzBfMzgyNjgzNDMzKTsgLyogYzYgKi8KKyAgICB6MiA9IE1VTFRJUExZKHRtcDEwLCBGSVhfMF81NDExOTYxMDApICsgejU7ICAgIC8qIGMyLWM2ICovCisgICAgejQgPSBNVUxUSVBMWSh0bXAxMiwgRklYXzFfMzA2NTYyOTY1KSArIHo1OyAgICAvKiBjMitjNiAqLworICAgIHozID0gTVVMVElQTFkodG1wMTEsIEZJWF8wXzcwNzEwNjc4MSk7ICAgICAgICAgLyogYzQgKi8KKworICAgIHoxMSA9IHRtcDcgKyB6MzsgICAgICAgICAgICAvKiBwaGFzZSA1ICovCisgICAgejEzID0gdG1wNyAtIHozOworCisgICAgZGF0YXB0cls1XSA9IHoxMyArIHoyOyAgICAgIC8qIHBoYXNlIDYgKi8KKyAgICBkYXRhcHRyWzNdID0gejEzIC0gejI7CisgICAgZGF0YXB0clsxXSA9IHoxMSArIHo0OworICAgIGRhdGFwdHJbN10gPSB6MTEgLSB6NDsKKworICAgIGRhdGFwdHIgKz0gRENUU0laRTsgICAgICAgICAvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gb25lIGJsb2NrIG9mIHNhbXBsZXMuCisgKi8KKworR0xPQkFMKHZvaWQpCitmZl9mZGN0X2lmYXN0IChpbnQxNl90ICogZGF0YSkKK3sKKyAgaW50IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIGludCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgaW50IHoxLCB6MiwgejMsIHo0LCB6NSwgejExLCB6MTM7CisgIGludDE2X3QgKmRhdGFwdHI7CisgIGludCBjdHI7CisKKyAgcm93X2ZkY3QoZGF0YSk7CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDcgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSBkYXRhcHRyW0RDVFNJWkUqNF07CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDEwID0gdG1wMCArIHRtcDM7ICAgICAgICAvKiBwaGFzZSAyICovCisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSB0bXAxMCArIHRtcDExOyAvKiBwaGFzZSAzICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gdG1wMTAgLSB0bXAxMTsKKworICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSB0bXAxMyArIHoxOyAvKiBwaGFzZSA1ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gdG1wMTMgLSB6MTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OyAgICAgICAgLyogcGhhc2UgMiAqLworICAgIHRtcDExID0gdG1wNSArIHRtcDY7CisgICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKKworICAgIC8qIFRoZSByb3RhdG9yIGlzIG1vZGlmaWVkIGZyb20gZmlnIDQtOCB0byBhdm9pZCBleHRyYSBuZWdhdGlvbnMuICovCisgICAgejUgPSBNVUxUSVBMWSh0bXAxMCAtIHRtcDEyLCBGSVhfMF8zODI2ODM0MzMpOyAvKiBjNiAqLworICAgIHoyID0gTVVMVElQTFkodG1wMTAsIEZJWF8wXzU0MTE5NjEwMCkgKyB6NTsgLyogYzItYzYgKi8KKyAgICB6NCA9IE1VTFRJUExZKHRtcDEyLCBGSVhfMV8zMDY1NjI5NjUpICsgejU7IC8qIGMyK2M2ICovCisgICAgejMgPSBNVUxUSVBMWSh0bXAxMSwgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KKworICAgIHoxMSA9IHRtcDcgKyB6MzsgICAgICAgICAgICAvKiBwaGFzZSA1ICovCisgICAgejEzID0gdG1wNyAtIHozOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjVdID0gejEzICsgejI7IC8qIHBoYXNlIDYgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSB6MTMgLSB6MjsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSB6MTEgKyB6NDsKKyAgICBkYXRhcHRyW0RDVFNJWkUqN10gPSB6MTEgLSB6NDsKKworICAgIGRhdGFwdHIrKzsgICAgICAgICAgICAgICAgICAvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCAyLTQtOCBEQ1Qgb24gb25lIGJsb2NrIG9mIHNhbXBsZXMuCisgKi8KKworR0xPQkFMKHZvaWQpCitmZl9mZGN0X2lmYXN0MjQ4IChpbnQxNl90ICogZGF0YSkKK3sKKyAgaW50IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIGludCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgaW50IHoxOworICBpbnQxNl90ICpkYXRhcHRyOworICBpbnQgY3RyOworCisgIHJvd19mZGN0KGRhdGEpOworCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSoxXTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjNdOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqNF0gKyBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSo2XSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjFdOworICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqMl0gLSBkYXRhcHRyW0RDVFNJWkUqM107CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSo0XSAtIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjZdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gdG1wMTAgKyB0bXAxMTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSB0bXAxMCAtIHRtcDExOworCisgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF83MDcxMDY3ODEpOworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IHRtcDEzICsgejE7CisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gdG1wMTMgLSB6MTsKKworICAgIHRtcDEwID0gdG1wNCArIHRtcDc7CisgICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKKyAgICB0bXAxMiA9IHRtcDUgLSB0bXA2OworICAgIHRtcDEzID0gdG1wNCAtIHRtcDc7CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSB0bXAxMCArIHRtcDExOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IHRtcDEwIC0gdG1wMTE7CisKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzcwNzEwNjc4MSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gdG1wMTMgKyB6MTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqN10gPSB0bXAxMyAtIHoxOworCisgICAgZGF0YXB0cisrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworI3VuZGVmIEdMT0JBTAorI3VuZGVmIENPTlNUX0JJVFMKKyN1bmRlZiBERVNDQUxFCisjdW5kZWYgRklYXzBfNTQxMTk2MTAwCisjdW5kZWYgRklYXzFfMzA2NTYyOTY1CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9qZmRjdGludC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvamZkY3RpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTM5NTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvamZkY3RpbnQuYwpAQCAtMCwwICsxLDI1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgQklUX0RFUFRIIDgKKyNpbmNsdWRlICJqZmRjdGludF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCAxMAorI2luY2x1ZGUgImpmZGN0aW50X3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9qZmRjdGludF90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvamZkY3RpbnRfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWEyZjVkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvamZkY3RpbnRfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKgorICogVGhlIGF1dGhvcnMgbWFrZSBOTyBXQVJSQU5UWSBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwKKyAqIHdpdGggcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLCBpdHMgcXVhbGl0eSwgYWNjdXJhY3ksIG1lcmNoYW50YWJpbGl0eSwgb3IKKyAqIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMgSVMiLCBhbmQKKyAqIHlvdSwgaXRzIHVzZXIsIGFzc3VtZSB0aGUgZW50aXJlIHJpc2sgYXMgdG8gaXRzIHF1YWxpdHkgYW5kIGFjY3VyYWN5LgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgY29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZCBleGNlcHQgYXMgc3BlY2lmaWVkIGJlbG93LgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0IHRvCisgKiB0aGVzZSBjb25kaXRpb25zOgorICogKDEpIElmIGFueSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCwgdGhlbgorICogdGhpcyBSRUFETUUgZmlsZSBtdXN0IGJlIGluY2x1ZGVkLCB3aXRoIHRoaXMgY29weXJpZ2h0IGFuZCBuby13YXJyYW50eQorICogbm90aWNlIHVuYWx0ZXJlZDsgYW5kIGFueSBhZGRpdGlvbnMsIGRlbGV0aW9ucywgb3IgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwKKyAqIGZpbGVzIG11c3QgYmUgY2xlYXJseSBpbmRpY2F0ZWQgaW4gYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24uCisgKiAoMikgSWYgb25seSBleGVjdXRhYmxlIGNvZGUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4gdGhlIGFjY29tcGFueWluZworICogZG9jdW1lbnRhdGlvbiBtdXN0IHN0YXRlIHRoYXQgInRoaXMgc29mdHdhcmUgaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgd29yaworICogb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAiLgorICogKDMpIFBlcm1pc3Npb24gZm9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgb25seSBpZiB0aGUgdXNlciBhY2NlcHRzCisgKiBmdWxsIHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgdW5kZXNpcmFibGUgY29uc2VxdWVuY2VzOyB0aGUgYXV0aG9ycyBhY2NlcHQKKyAqIE5PIExJQUJJTElUWSBmb3IgZGFtYWdlcyBvZiBhbnkga2luZC4KKyAqCisgKiBUaGVzZSBjb25kaXRpb25zIGFwcGx5IHRvIGFueSBzb2Z0d2FyZSBkZXJpdmVkIGZyb20gb3IgYmFzZWQgb24gdGhlIElKRworICogY29kZSwgbm90IGp1c3QgdG8gdGhlIHVubW9kaWZpZWQgbGlicmFyeS4gIElmIHlvdSB1c2Ugb3VyIHdvcmssIHlvdSBvdWdodAorICogdG8gYWNrbm93bGVkZ2UgdXMuCisgKgorICogUGVybWlzc2lvbiBpcyBOT1QgZ3JhbnRlZCBmb3IgdGhlIHVzZSBvZiBhbnkgSUpHIGF1dGhvcidzIG5hbWUgb3IgY29tcGFueQorICogbmFtZSBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhpcyBzb2Z0d2FyZSBvciBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIGl0LiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgcmVmZXJyZWQgdG8gb25seSBhcyAidGhlIEluZGVwZW5kZW50CisgKiBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUiLgorICoKKyAqIFdlIHNwZWNpZmljYWxseSBwZXJtaXQgYW5kIGVuY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgYXMgdGhlIGJhc2lzCisgKiBvZiBjb21tZXJjaWFsIHByb2R1Y3RzLCBwcm92aWRlZCB0aGF0IGFsbCB3YXJyYW50eSBvciBsaWFiaWxpdHkgY2xhaW1zIGFyZQorICogYXNzdW1lZCBieSB0aGUgcHJvZHVjdCB2ZW5kb3IuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgc2xvdy1idXQtYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGZvcndhcmQgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4KKyAqCisgKiBBIDItRCBEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIERDVCBvbiBlYWNoIHJvdyBmb2xsb3dlZCBieSAxLUQgRENUCisgKiBvbiBlYWNoIGNvbHVtbi4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlCisgKiBtdWNoIG1vcmUgY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGFuIGFsZ29yaXRobSBkZXNjcmliZWQgaW4KKyAqICAgQy4gTG9lZmZsZXIsIEEuIExpZ3RlbmJlcmcgYW5kIEcuIE1vc2NoeXR6LCAiUHJhY3RpY2FsIEZhc3QgMS1EIERDVAorICogICBBbGdvcml0aG1zIHdpdGggMTEgTXVsdGlwbGljYXRpb25zIiwgUHJvYy4gSW50J2wuIENvbmYuIG9uIEFjb3VzdGljcywKKyAqICAgU3BlZWNoLCBhbmQgU2lnbmFsIFByb2Nlc3NpbmcgMTk4OSAoSUNBU1NQICc4OSksIHBwLiA5ODgtOTkxLgorICogVGhlIHByaW1hcnkgYWxnb3JpdGhtIGRlc2NyaWJlZCB0aGVyZSB1c2VzIDExIG11bHRpcGxpZXMgYW5kIDI5IGFkZHMuCisgKiBXZSB1c2UgdGhlaXIgYWx0ZXJuYXRlIG1ldGhvZCB3aXRoIDEyIG11bHRpcGxpZXMgYW5kIDMyIGFkZHMuCisgKiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgbm8gZGF0YSBwYXRoIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUKKyAqIG11bHRpcGxpY2F0aW9uOyB0aGlzIGFsbG93cyBhIHZlcnkgc2ltcGxlIGFuZCBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBpbgorICogc2NhbGVkIGZpeGVkLXBvaW50IGFyaXRobWV0aWMsIHdpdGggYSBtaW5pbWFsIG51bWJlciBvZiBzaGlmdHMuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNsb3cgJiBhY2N1cmF0ZSBkY3QuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJkY3QuaCIKKworI2luY2x1ZGUgImJpdF9kZXB0aF90ZW1wbGF0ZS5jIgorCisjZGVmaW5lIERDVFNJWkUgOAorI2RlZmluZSBCSVRTX0lOX0pTQU1QTEUgQklUX0RFUFRICisjZGVmaW5lIEdMT0JBTCh4KSB4CisjZGVmaW5lIFJJR0hUX1NISUZUKHgsIG4pICgoeCkgPj4gKG4pKQorI2RlZmluZSBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkgKCh2YXIpKihjb25zdCkpCisKKyNpZiAxIC8vZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORworI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKCh4KSArICgxIDw8ICgobikgLSAxKSksIG4pCisjZWxzZQorI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKHgsIG4pCisjZW5kaWYKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorI2Vycm9yICAiU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIgorI2VuZGlmCisKKworLyoKKyAqIFRoZSBwb29wIG9uIHRoaXMgc2NhbGluZyBzdHVmZiBpcyBhcyBmb2xsb3dzOgorICoKKyAqIEVhY2ggMS1EIERDVCBzdGVwIHByb2R1Y2VzIG91dHB1dHMgd2hpY2ggYXJlIGEgZmFjdG9yIG9mIHNxcnQoTikKKyAqIGxhcmdlciB0aGFuIHRoZSB0cnVlIERDVCBvdXRwdXRzLiAgVGhlIGZpbmFsIG91dHB1dHMgYXJlIHRoZXJlZm9yZQorICogYSBmYWN0b3Igb2YgTiBsYXJnZXIgdGhhbiBkZXNpcmVkOyBzaW5jZSBOPTggdGhpcyBjYW4gYmUgY3VyZWQgYnkKKyAqIGEgc2ltcGxlIHJpZ2h0IHNoaWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGFsZ29yaXRobS4gIFRoZSBhZHZhbnRhZ2Ugb2YKKyAqIHRoaXMgYXJyYW5nZW1lbnQgaXMgdGhhdCB3ZSBzYXZlIHR3byBtdWx0aXBsaWNhdGlvbnMgcGVyIDEtRCBEQ1QsCisgKiBiZWNhdXNlIHRoZSB5MCBhbmQgeTQgb3V0cHV0cyBuZWVkIG5vdCBiZSBkaXZpZGVkIGJ5IHNxcnQoTikuCisgKiBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgZmFjdG9yIG9mIDggaXMgcmVtb3ZlZCBieSB0aGUgcXVhbnRpemF0aW9uIHN0ZXAKKyAqIChpbiBqY2RjdG1nci5jKSwgTk9UIGluIHRoaXMgbW9kdWxlLgorICoKKyAqIFdlIGhhdmUgdG8gZG8gYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uIG9mIHRoZSBpbnRlZ2VyIGlucHV0cywgd2hpY2gKKyAqIGlzIG5vIHByb2JsZW0sIGFuZCBtdWx0aXBsaWNhdGlvbiBieSBmcmFjdGlvbmFsIGNvbnN0YW50cywgd2hpY2ggaXMKKyAqIGEgcHJvYmxlbSB0byBkbyBpbiBpbnRlZ2VyIGFyaXRobWV0aWMuICBXZSBtdWx0aXBseSBhbGwgdGhlIGNvbnN0YW50cworICogYnkgQ09OU1RfU0NBTEUgYW5kIGNvbnZlcnQgdGhlbSB0byBpbnRlZ2VyIGNvbnN0YW50cyAodGh1cyByZXRhaW5pbmcKKyAqIENPTlNUX0JJVFMgYml0cyBvZiBwcmVjaXNpb24gaW4gdGhlIGNvbnN0YW50cykuICBBZnRlciBkb2luZyBhCisgKiBtdWx0aXBsaWNhdGlvbiB3ZSBoYXZlIHRvIGRpdmlkZSB0aGUgcHJvZHVjdCBieSBDT05TVF9TQ0FMRSwgd2l0aCBwcm9wZXIKKyAqIHJvdW5kaW5nLCB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG91dHB1dC4gIFRoaXMgZGl2aXNpb24gY2FuIGJlIGRvbmUKKyAqIGNoZWFwbHkgYXMgYSByaWdodCBzaGlmdCBvZiBDT05TVF9CSVRTIGJpdHMuICBXZSBwb3N0cG9uZSBzaGlmdGluZworICogYXMgbG9uZyBhcyBwb3NzaWJsZSBzbyB0aGF0IHBhcnRpYWwgc3VtcyBjYW4gYmUgYWRkZWQgdG9nZXRoZXIgd2l0aAorICogZnVsbCBmcmFjdGlvbmFsIHByZWNpc2lvbi4KKyAqCisgKiBUaGUgb3V0cHV0cyBvZiB0aGUgZmlyc3QgcGFzcyBhcmUgc2NhbGVkIHVwIGJ5IFBBU1MxX0JJVFMgYml0cyBzbyB0aGF0CisgKiB0aGV5IGFyZSByZXByZXNlbnRlZCB0byBiZXR0ZXItdGhhbi1pbnRlZ3JhbCBwcmVjaXNpb24uICBUaGVzZSBvdXRwdXRzCisgKiByZXF1aXJlIEJJVFNfSU5fSlNBTVBMRSArIFBBU1MxX0JJVFMgKyAzIGJpdHM7IHRoaXMgZml0cyBpbiBhIDE2LWJpdCB3b3JkCisgKiB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLiAgKEZvciAxMi1iaXQgc2FtcGxlIGRhdGEsIHRoZSBpbnRlcm1lZGlhdGUKKyAqIGFycmF5IGlzIGludDMyX3QgYW55d2F5LikKKyAqCisgKiBUbyBhdm9pZCBvdmVyZmxvdyBvZiB0aGUgMzItYml0IGludGVybWVkaWF0ZSByZXN1bHRzIGluIHBhc3MgMiwgd2UgbXVzdAorICogaGF2ZSBCSVRTX0lOX0pTQU1QTEUgKyBDT05TVF9CSVRTICsgUEFTUzFfQklUUyA8PSAyNi4gIEVycm9yIGFuYWx5c2lzCisgKiBzaG93cyB0aGF0IHRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgYXJlIHRoZSBtb3N0IGVmZmVjdGl2ZS4KKyAqLworCisjdW5kZWYgQ09OU1RfQklUUworI3VuZGVmIFBBU1MxX0JJVFMKKyN1bmRlZiBPVVRfU0hJRlQKKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIENPTlNUX0JJVFMgIDEzCisjZGVmaW5lIFBBU1MxX0JJVFMgIDQgICAvKiBzZXQgdGhpcyB0byAyIGlmIDE2eDE2IG11bHRpcGxpZXMgYXJlIGZhc3RlciAqLworI2RlZmluZSBPVVRfU0hJRlQgICBQQVNTMV9CSVRTCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAxICAgLyogbG9zZSBhIGxpdHRsZSBwcmVjaXNpb24gdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgT1VUX1NISUZUICAgKFBBU1MxX0JJVFMgKyAxKQorI2VuZGlmCisKKy8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cworICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgorICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKKyAqLworCisjaWYgQ09OU1RfQklUUyA9PSAxMworI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgICgoaW50MzJfdCkgIDI0NDYpICAgICAgLyogRklYKDAuMjk4NjMxMzM2KSAqLworI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgICgoaW50MzJfdCkgIDMxOTYpICAgICAgLyogRklYKDAuMzkwMTgwNjQ0KSAqLworI2RlZmluZSBGSVhfMF81NDExOTYxMDAgICgoaW50MzJfdCkgIDQ0MzMpICAgICAgLyogRklYKDAuNTQxMTk2MTAwKSAqLworI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICgoaW50MzJfdCkgIDYyNzApICAgICAgLyogRklYKDAuNzY1MzY2ODY1KSAqLworI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoaW50MzJfdCkgIDczNzMpICAgICAgLyogRklYKDAuODk5OTc2MjIzKSAqLworI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgICgoaW50MzJfdCkgIDk2MzMpICAgICAgLyogRklYKDEuMTc1ODc1NjAyKSAqLworI2RlZmluZSBGSVhfMV81MDEzMjExMTAgICgoaW50MzJfdCkgIDEyMjk5KSAgICAgLyogRklYKDEuNTAxMzIxMTEwKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoaW50MzJfdCkgIDE1MTM3KSAgICAgLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgICgoaW50MzJfdCkgIDE2MDY5KSAgICAgLyogRklYKDEuOTYxNTcwNTYwKSAqLworI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgICgoaW50MzJfdCkgIDE2ODE5KSAgICAgLyogRklYKDIuMDUzMTE5ODY5KSAqLworI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoaW50MzJfdCkgIDIwOTk1KSAgICAgLyogRklYKDIuNTYyOTE1NDQ3KSAqLworI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgICgoaW50MzJfdCkgIDI1MTcyKSAgICAgLyogRklYKDMuMDcyNzExMDI2KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICBGSVgoMC4yOTg2MzEzMzYpCisjZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgRklYKDAuMzkwMTgwNjQ0KQorI2RlZmluZSBGSVhfMF81NDExOTYxMDAgIEZJWCgwLjU0MTE5NjEwMCkKKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICBGSVgoMC43NjUzNjY4NjUpCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQorI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgIEZJWCgxLjE3NTg3NTYwMikKKyNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICBGSVgoMS41MDEzMjExMTApCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQorI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgIEZJWCgxLjk2MTU3MDU2MCkKKyNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICBGSVgoMi4wNTMxMTk4NjkpCisjZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQorI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgIEZJWCgzLjA3MjcxMTAyNikKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGFuIGludDMyX3QgdmFyaWFibGUgYnkgYW4gaW50MzJfdCBjb25zdGFudCB0byB5aWVsZCBhbiBpbnQzMl90IHJlc3VsdC4KKyAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKKyAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKKyAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCisgKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4ICYmIENPTlNUX0JJVFM8PTEzICYmIFBBU1MxX0JJVFM8PTIKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpCisjZWxzZQorI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQorI2VuZGlmCisKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKHJvd19mZGN0KShpbnQxNl90ICpkYXRhKQoreworICBpbnQgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgaW50IHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBpbnQgejEsIHoyLCB6MywgejQsIHo1OworICBpbnQxNl90ICpkYXRhcHRyOworICBpbnQgY3RyOworCisgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLworICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBEQ1Q7ICovCisgIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbMF0gKyBkYXRhcHRyWzddOworICAgIHRtcDcgPSBkYXRhcHRyWzBdIC0gZGF0YXB0cls3XTsKKyAgICB0bXAxID0gZGF0YXB0clsxXSArIGRhdGFwdHJbNl07CisgICAgdG1wNiA9IGRhdGFwdHJbMV0gLSBkYXRhcHRyWzZdOworICAgIHRtcDIgPSBkYXRhcHRyWzJdICsgZGF0YXB0cls1XTsKKyAgICB0bXA1ID0gZGF0YXB0clsyXSAtIGRhdGFwdHJbNV07CisgICAgdG1wMyA9IGRhdGFwdHJbM10gKyBkYXRhcHRyWzRdOworICAgIHRtcDQgPSBkYXRhcHRyWzNdIC0gZGF0YXB0cls0XTsKKworICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OworICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCisgICAgICovCisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworCisgICAgZGF0YXB0clswXSA9IChpbnQxNl90KSAoKHRtcDEwICsgdG1wMTEpICogKDEgPDwgUEFTUzFfQklUUykpOworICAgIGRhdGFwdHJbNF0gPSAoaW50MTZfdCkgKCh0bXAxMCAtIHRtcDExKSAqICgxIDw8IFBBU1MxX0JJVFMpKTsKKworICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKKyAgICBkYXRhcHRyWzJdID0gKGludDE2X3QpIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMywgRklYXzBfNzY1MzY2ODY1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzZdID0gKGludDE2X3QpIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMiwgLSBGSVhfMV84NDc3NTkwNjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4IC0tLSBub3RlIHBhcGVyIG9taXRzIGZhY3RvciBvZiBzcXJ0KDIpLgorICAgICAqIGNLIHJlcHJlc2VudHMgY29zKEsqcGkvMTYpLgorICAgICAqIGkwLi5pMyBpbiB0aGUgcGFwZXIgYXJlIHRtcDQuLnRtcDcgaGVyZS4KKyAgICAgKi8KKworICAgIHoxID0gdG1wNCArIHRtcDc7CisgICAgejIgPSB0bXA1ICsgdG1wNjsKKyAgICB6MyA9IHRtcDQgKyB0bXA2OworICAgIHo0ID0gdG1wNSArIHRtcDc7CisgICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KKworICAgIHRtcDQgPSBNVUxUSVBMWSh0bXA0LCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXA1ID0gTVVMVElQTFkodG1wNSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCisgICAgdG1wNiA9IE1VTFRJUExZKHRtcDYsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLworICAgIHRtcDcgPSBNVUxUSVBMWSh0bXA3LCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KKyAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KKyAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLworICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KKworICAgIHozICs9IHo1OworICAgIHo0ICs9IHo1OworCisgICAgZGF0YXB0cls3XSA9IChpbnQxNl90KSBERVNDQUxFKHRtcDQgKyB6MSArIHozLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNV0gPSAoaW50MTZfdCkgREVTQ0FMRSh0bXA1ICsgejIgKyB6NCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzNdID0gKGludDE2X3QpIERFU0NBTEUodG1wNiArIHoyICsgejMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0clsxXSA9IChpbnQxNl90KSBERVNDQUxFKHRtcDcgKyB6MSArIHo0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgZGF0YXB0ciArPSBEQ1RTSVpFOyAgICAgICAgIC8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK0ZVTkMoZmZfanBlZ19mZGN0X2lzbG93KShpbnQxNl90ICpkYXRhKQoreworICBpbnQgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgaW50IHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBpbnQgejEsIHoyLCB6MywgejQsIHo1OworICBpbnQxNl90ICpkYXRhcHRyOworICBpbnQgY3RyOworCisgIEZVTkMocm93X2ZkY3QpKGRhdGEpOworCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKKworICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OworICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCisgICAgICovCisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gREVTQ0FMRSh0bXAxMCArIHRtcDExLCBPVVRfU0hJRlQpOworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IERFU0NBTEUodG1wMTAgLSB0bXAxMSwgT1VUX1NISUZUKTsKKworICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTMsIEZJWF8wXzc2NTM2Njg2NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9CSVRTICsgT1VUX1NISUZUKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTIsIC0gRklYXzFfODQ3NzU5MDY1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX0JJVFMgKyBPVVRfU0hJRlQpOworCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4IC0tLSBub3RlIHBhcGVyIG9taXRzIGZhY3RvciBvZiBzcXJ0KDIpLgorICAgICAqIGNLIHJlcHJlc2VudHMgY29zKEsqcGkvMTYpLgorICAgICAqIGkwLi5pMyBpbiB0aGUgcGFwZXIgYXJlIHRtcDQuLnRtcDcgaGVyZS4KKyAgICAgKi8KKworICAgIHoxID0gdG1wNCArIHRtcDc7CisgICAgejIgPSB0bXA1ICsgdG1wNjsKKyAgICB6MyA9IHRtcDQgKyB0bXA2OworICAgIHo0ID0gdG1wNSArIHRtcDc7CisgICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KKworICAgIHRtcDQgPSBNVUxUSVBMWSh0bXA0LCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXA1ID0gTVVMVElQTFkodG1wNSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCisgICAgdG1wNiA9IE1VTFRJUExZKHRtcDYsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLworICAgIHRtcDcgPSBNVUxUSVBMWSh0bXA3LCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KKyAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KKyAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLworICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KKworICAgIHozICs9IHo1OworICAgIHo0ICs9IHo1OworCisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gREVTQ0FMRSh0bXA0ICsgejEgKyB6MywgQ09OU1RfQklUUyArIE9VVF9TSElGVCk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjVdID0gREVTQ0FMRSh0bXA1ICsgejIgKyB6NCwgQ09OU1RfQklUUyArIE9VVF9TSElGVCk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gREVTQ0FMRSh0bXA2ICsgejIgKyB6MywgQ09OU1RfQklUUyArIE9VVF9TSElGVCk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gREVTQ0FMRSh0bXA3ICsgejEgKyB6NCwgQ09OU1RfQklUUyArIE9VVF9TSElGVCk7CisKKyAgICBkYXRhcHRyKys7ICAgICAgICAgICAgICAgICAgLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgIH0KK30KKworLyoKKyAqIFRoZSBzZWNyZXQgb2YgRENUMi00LTggaXMgcmVhbGx5IHNpbXBsZSAtLSB5b3UgZG8gdGhlIHVzdWFsIDEtRENUCisgKiBvbiB0aGUgcm93cyBhbmQgdGhlbiwgaW5zdGVhZCBvZiBkb2luZyBldmVuIGFuZCBvZGQsIHBhcnQgb24gdGhlIGNvbHVtbnMKKyAqIHlvdSBkbyBldmVuIHBhcnQgdHdvIHRpbWVzLgorICovCitHTE9CQUwodm9pZCkKK0ZVTkMoZmZfZmRjdDI0OF9pc2xvdykoaW50MTZfdCAqZGF0YSkKK3sKKyAgaW50IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIGludCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgaW50IHoxOworICBpbnQxNl90ICpkYXRhcHRyOworICBpbnQgY3RyOworCisgIEZVTkMocm93X2ZkY3QpKGRhdGEpOworCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjFdOworICAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjNdOworICAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjRdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjZdICsgZGF0YXB0cltEQ1RTSVpFKjddOworICAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjFdOworICAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjNdOworICAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjRdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOworICAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjZdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworCisgICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisKKyAgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gREVTQ0FMRSh0bXAxMCArIHRtcDExLCBPVVRfU0hJRlQpOworICAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSBERVNDQUxFKHRtcDEwIC0gdG1wMTEsIE9VVF9TSElGVCk7CisKKyAgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF81NDExOTYxMDApOworICAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTMsIEZJWF8wXzc2NTM2Njg2NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RfQklUUytPVVRfU0hJRlQpOworICAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTIsIC0gRklYXzFfODQ3NzU5MDY1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9CSVRTK09VVF9TSElGVCk7CisKKyAgICAgdG1wMTAgPSB0bXA0ICsgdG1wNzsKKyAgICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKKyAgICAgdG1wMTIgPSB0bXA1IC0gdG1wNjsKKyAgICAgdG1wMTMgPSB0bXA0IC0gdG1wNzsKKworICAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSBERVNDQUxFKHRtcDEwICsgdG1wMTEsIE9VVF9TSElGVCk7CisgICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IERFU0NBTEUodG1wMTAgLSB0bXAxMSwgT1VUX1NISUZUKTsKKworICAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgIGRhdGFwdHJbRENUU0laRSozXSA9IERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMywgRklYXzBfNzY1MzY2ODY1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9CSVRTICsgT1VUX1NISUZUKTsKKyAgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEyLCAtIEZJWF8xXzg0Nzc1OTA2NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RfQklUUyArIE9VVF9TSElGVCk7CisKKyAgICAgZGF0YXB0cisrOyAgICAgICAgICAgICAgICAgLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2pwZWcyMDAwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9qcGVnMjAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NGUyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9qcGVnMjAwMC5jCkBAIC0wLDAgKzEsNTQ0IEBACisvKgorICogSlBFRyAyMDAwIGVuY29kZXIgYW5kIGRlY29kZXIgY29tbW9uIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDA3IEthbWlsIE5vd29zYWQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBOaWNvbGFzIEJlcnRyYW5kIDxuaWNvaW5hdHRlbmR1QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSlBFRyAyMDAwIGltYWdlIGVuY29kZXIgYW5kIGRlY29kZXIgY29tbW9uIGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImpwZWcyMDAwLmgiCisKKyNkZWZpbmUgU0hMKGEsIG4pICgobikgPj0gMCA/IChhKSA8PCAobikgOiAoYSkgPj4gLShuKSkKKworLyogdGFnIHRyZWUgcm91dGluZXMgKi8KKworLyogYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGFnIHRyZWUgKi8KK3N0YXRpYyBpbnQzMl90IHRhZ190cmVlX3NpemUodWludDE2X3QgdywgdWludDE2X3QgaCkKK3sKKyAgICB1aW50MzJfdCByZXMgPSAwOworICAgIHdoaWxlICh3ID4gMSB8fCBoID4gMSkgeworICAgICAgICByZXMgKz0gdyAqIGg7CisgICAgICAgIGF2X2Fzc2VydDAocmVzICsgMSA8IElOVDMyX01BWCk7CisgICAgICAgIHcgPSAodyArIDEpID4+IDE7CisgICAgICAgIGggPSAoaCArIDEpID4+IDE7CisgICAgfQorICAgIHJldHVybiAoaW50MzJfdCkocmVzICsgMSk7Cit9CisKK3N0YXRpYyBKcGVnMjAwMFRndE5vZGUgKmZmX2pwZWcyMDAwX3RhZ190cmVlX2luaXQoaW50IHcsIGludCBoKQoreworICAgIGludCBwdyA9IHcsIHBoID0gaDsKKyAgICBKcGVnMjAwMFRndE5vZGUgKnJlcywgKnQsICp0MjsKKyAgICBpbnQzMl90IHR0X3NpemU7CisKKyAgICB0dF9zaXplID0gdGFnX3RyZWVfc2l6ZSh3LCBoKTsKKworICAgIHQgPSByZXMgPSBhdl9tYWxsb2N6X2FycmF5KHR0X3NpemUsIHNpemVvZigqdCkpOworICAgIGlmICghcmVzKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHdoaWxlICh3ID4gMSB8fCBoID4gMSkgeworICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgcHcgPSB3OworICAgICAgICBwaCA9IGg7CisKKyAgICAgICAgdyAgPSAodyArIDEpID4+IDE7CisgICAgICAgIGggID0gKGggKyAxKSA+PiAxOworICAgICAgICB0MiA9IHQgKyBwdyAqIHBoOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaDsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHB3OyBqKyspCisgICAgICAgICAgICAgICAgdFtpICogcHcgKyBqXS5wYXJlbnQgPSAmdDJbKGkgPj4gMSkgKiB3ICsgKGogPj4gMSldOworCisgICAgICAgIHQgPSB0MjsKKyAgICB9CisgICAgdFswXS5wYXJlbnQgPSBOVUxMOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHRhZ190cmVlX3plcm8oSnBlZzIwMDBUZ3ROb2RlICp0LCBpbnQgdywgaW50IGgpCit7CisgICAgaW50IGksIHNpeiA9IHRhZ190cmVlX3NpemUodywgaCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6OyBpKyspIHsKKyAgICAgICAgdFtpXS52YWwgPSAwOworICAgICAgICB0W2ldLnZpcyA9IDA7CisgICAgfQorfQorCit1aW50OF90IGZmX2pwZWcyMDAwX3NpZ2N0eG5vX2x1dFsyNTZdWzRdOworCitzdGF0aWMgaW50IGdldHNpZ2N0eG5vKGludCBmbGFnLCBpbnQgYmFuZG5vKQoreworICAgIGludCBoLCB2LCBkOworCisgICAgaCA9ICgoZmxhZyAmIEpQRUcyMDAwX1QxX1NJR19FKSAgPyAxIDogMCkgKworICAgICAgICAoKGZsYWcgJiBKUEVHMjAwMF9UMV9TSUdfVykgID8gMSA6IDApOworICAgIHYgPSAoKGZsYWcgJiBKUEVHMjAwMF9UMV9TSUdfTikgID8gMSA6IDApICsKKyAgICAgICAgKChmbGFnICYgSlBFRzIwMDBfVDFfU0lHX1MpICA/IDEgOiAwKTsKKyAgICBkID0gKChmbGFnICYgSlBFRzIwMDBfVDFfU0lHX05FKSA/IDEgOiAwKSArCisgICAgICAgICgoZmxhZyAmIEpQRUcyMDAwX1QxX1NJR19OVykgPyAxIDogMCkgKworICAgICAgICAoKGZsYWcgJiBKUEVHMjAwMF9UMV9TSUdfU0UpID8gMSA6IDApICsKKyAgICAgICAgKChmbGFnICYgSlBFRzIwMDBfVDFfU0lHX1NXKSA/IDEgOiAwKTsKKworICAgIGlmIChiYW5kbm8gPCAzKSB7CisgICAgICAgIGlmIChiYW5kbm8gPT0gMSkKKyAgICAgICAgICAgIEZGU1dBUChpbnQsIGgsIHYpOworICAgICAgICBpZiAoaCA9PSAyKSByZXR1cm4gODsKKyAgICAgICAgaWYgKGggPT0gMSkgeworICAgICAgICAgICAgaWYgKHYgPj0gMSkgcmV0dXJuIDc7CisgICAgICAgICAgICBpZiAoZCA+PSAxKSByZXR1cm4gNjsKKyAgICAgICAgICAgIHJldHVybiA1OworICAgICAgICB9CisgICAgICAgIGlmICh2ID09IDIpIHJldHVybiA0OworICAgICAgICBpZiAodiA9PSAxKSByZXR1cm4gMzsKKyAgICAgICAgaWYgKGQgPj0gMikgcmV0dXJuIDI7CisgICAgICAgIGlmIChkID09IDEpIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkID49IDMpIHJldHVybiA4OworICAgICAgICBpZiAoZCA9PSAyKSB7CisgICAgICAgICAgICBpZiAoaCt2ID49IDEpIHJldHVybiA3OworICAgICAgICAgICAgcmV0dXJuIDY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGQgPT0gMSkgeworICAgICAgICAgICAgaWYgKGgrdiA+PSAyKSByZXR1cm4gNTsKKyAgICAgICAgICAgIGlmIChoK3YgPT0gMSkgcmV0dXJuIDQ7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorICAgICAgICBpZiAoaCt2ID49IDIpIHJldHVybiAyOworICAgICAgICBpZiAoaCt2ID09IDEpIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordWludDhfdCBmZl9qcGVnMjAwMF9zZ25jdHhub19sdXRbMTZdWzE2XSwgZmZfanBlZzIwMDBfeG9yYml0X2x1dFsxNl1bMTZdOworCitzdGF0aWMgY29uc3QgaW50IGNvbnRyaWJ0YWJbM11bM10gPSB7IHsgIDAsIC0xLCAgMSB9LCB7IC0xLCAtMSwgIDAgfSwgeyAgMSwgIDAsICAxIH0gfTsKK3N0YXRpYyBjb25zdCBpbnQgIGN0eGxibHRhYlszXVszXSA9IHsgeyAxMywgMTIsIDExIH0sIHsgMTAsICA5LCAxMCB9LCB7IDExLCAxMiwgMTMgfSB9Oworc3RhdGljIGNvbnN0IGludCAgeG9yYml0dGFiWzNdWzNdID0geyB7ICAxLCAgMSwgIDEgfSwgeyAgMSwgIDAsICAwIH0sIHsgIDAsICAwLCAgMCB9IH07CisKK3N0YXRpYyBpbnQgZ2V0c2duY3R4bm8oaW50IGZsYWcsIHVpbnQ4X3QgKnhvcmJpdCkKK3sKKyAgICBpbnQgdmNvbnRyaWIsIGhjb250cmliOworCisgICAgaGNvbnRyaWIgPSBjb250cmlidGFiW2ZsYWcgJiBKUEVHMjAwMF9UMV9TSUdfRSA/IGZsYWcgJiBKUEVHMjAwMF9UMV9TR05fRSA/IDEgOiAyIDogMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZyAmIEpQRUcyMDAwX1QxX1NJR19XID8gZmxhZyAmIEpQRUcyMDAwX1QxX1NHTl9XID8gMSA6IDIgOiAwXSArIDE7CisgICAgdmNvbnRyaWIgPSBjb250cmlidGFiW2ZsYWcgJiBKUEVHMjAwMF9UMV9TSUdfUyA/IGZsYWcgJiBKUEVHMjAwMF9UMV9TR05fUyA/IDEgOiAyIDogMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZyAmIEpQRUcyMDAwX1QxX1NJR19OID8gZmxhZyAmIEpQRUcyMDAwX1QxX1NHTl9OID8gMSA6IDIgOiAwXSArIDE7CisgICAgKnhvcmJpdCA9IHhvcmJpdHRhYltoY29udHJpYl1bdmNvbnRyaWJdOworCisgICAgcmV0dXJuIGN0eGxibHRhYltoY29udHJpYl1bdmNvbnRyaWJdOworfQorCit2b2lkIGF2X2NvbGQgZmZfanBlZzIwMDBfaW5pdF90aWVyMV9sdXRzKHZvaWQpCit7CisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgZmZfanBlZzIwMDBfc2lnY3R4bm9fbHV0W2ldW2pdID0gZ2V0c2lnY3R4bm8oaSwgaik7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgZmZfanBlZzIwMDBfc2duY3R4bm9fbHV0W2ldW2pdID0KKyAgICAgICAgICAgICAgICBnZXRzZ25jdHhubyhpICsgKGogPDwgOCksICZmZl9qcGVnMjAwMF94b3JiaXRfbHV0W2ldW2pdKTsKK30KKwordm9pZCBmZl9qcGVnMjAwMF9zZXRfc2lnbmlmaWNhbmNlKEpwZWcyMDAwVDFDb250ZXh0ICp0MSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZWdhdGl2ZSkKK3sKKyAgICB4Kys7CisgICAgeSsrOworICAgIHQxLT5mbGFnc1t5XVt4XSB8PSBKUEVHMjAwMF9UMV9TSUc7CisgICAgaWYgKG5lZ2F0aXZlKSB7CisgICAgICAgIHQxLT5mbGFnc1t5XVt4ICsgMV0gfD0gSlBFRzIwMDBfVDFfU0lHX1cgfCBKUEVHMjAwMF9UMV9TR05fVzsKKyAgICAgICAgdDEtPmZsYWdzW3ldW3ggLSAxXSB8PSBKUEVHMjAwMF9UMV9TSUdfRSB8IEpQRUcyMDAwX1QxX1NHTl9FOworICAgICAgICB0MS0+ZmxhZ3NbeSArIDFdW3hdIHw9IEpQRUcyMDAwX1QxX1NJR19OIHwgSlBFRzIwMDBfVDFfU0dOX047CisgICAgICAgIHQxLT5mbGFnc1t5IC0gMV1beF0gfD0gSlBFRzIwMDBfVDFfU0lHX1MgfCBKUEVHMjAwMF9UMV9TR05fUzsKKyAgICB9IGVsc2UgeworICAgICAgICB0MS0+ZmxhZ3NbeV1beCArIDFdIHw9IEpQRUcyMDAwX1QxX1NJR19XOworICAgICAgICB0MS0+ZmxhZ3NbeV1beCAtIDFdIHw9IEpQRUcyMDAwX1QxX1NJR19FOworICAgICAgICB0MS0+ZmxhZ3NbeSArIDFdW3hdIHw9IEpQRUcyMDAwX1QxX1NJR19OOworICAgICAgICB0MS0+ZmxhZ3NbeSAtIDFdW3hdIHw9IEpQRUcyMDAwX1QxX1NJR19TOworICAgIH0KKyAgICB0MS0+ZmxhZ3NbeSArIDFdW3ggKyAxXSB8PSBKUEVHMjAwMF9UMV9TSUdfTlc7CisgICAgdDEtPmZsYWdzW3kgKyAxXVt4IC0gMV0gfD0gSlBFRzIwMDBfVDFfU0lHX05FOworICAgIHQxLT5mbGFnc1t5IC0gMV1beCArIDFdIHw9IEpQRUcyMDAwX1QxX1NJR19TVzsKKyAgICB0MS0+ZmxhZ3NbeSAtIDFdW3ggLSAxXSB8PSBKUEVHMjAwMF9UMV9TSUdfU0U7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGx1dF9nYWluWzJdWzRdID0geyB7IDAsIDAsIDAsIDAgfSwgeyAwLCAxLCAxLCAyIH0gfTsKKworaW50IGZmX2pwZWcyMDAwX2luaXRfY29tcG9uZW50KEpwZWcyMDAwQ29tcG9uZW50ICpjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwZWcyMDAwQ29kaW5nU3R5bGUgKmNvZHN0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGVnMjAwMFF1YW50U3R5bGUgKnFudHN0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2JwcywgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHVpbnQ4X3QgbG9nMl9iYW5kX3ByZWNfd2lkdGgsIGxvZzJfYmFuZF9wcmVjX2hlaWdodDsKKyAgICBpbnQgcmVzbGV2ZWxubywgYmFuZG5vLCBnYmFuZG5vID0gMCwgcmV0LCBpLCBqOworICAgIHVpbnQzMl90IGNzaXplOworCisgICAgaWYgKGNvZHN0eS0+bnJlc2xldmVsczJkZWNvZGUgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm5yZXNsZXZlbHMyZGVjb2RlICVkIGludmFsaWQgb3IgdW5pbml0aWFsaXplZFxuIiwgY29kc3R5LT5ucmVzbGV2ZWxzMmRlY29kZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChyZXQgPSBmZl9qcGVnMjAwMF9kd3RfaW5pdCgmY29tcC0+ZHd0LCBjb21wLT5jb29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kc3R5LT5ucmVzbGV2ZWxzMmRlY29kZSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZHN0eS0+dHJhbnNmb3JtKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAvLyBjb21wb25lbnQgc2l6ZSBjb21wLT5jb29yZCBpcyB1aW50MTZfdCBzbyBpciBjYW5ub3Qgb3ZlcmZsb3cKKyAgICBjc2l6ZSA9IChjb21wLT5jb29yZFswXVsxXSAtIGNvbXAtPmNvb3JkWzBdWzBdKSAqCisgICAgICAgICAgICAoY29tcC0+Y29vcmRbMV1bMV0gLSBjb21wLT5jb29yZFsxXVswXSk7CisKKyAgICBpZiAoY29kc3R5LT50cmFuc2Zvcm0gPT0gRkZfRFdUOTcpIHsKKyAgICAgICAgY29tcC0+aV9kYXRhID0gTlVMTDsKKyAgICAgICAgY29tcC0+Zl9kYXRhID0gYXZfbWFsbG9jel9hcnJheShjc2l6ZSwgc2l6ZW9mKCpjb21wLT5mX2RhdGEpKTsKKyAgICAgICAgaWYgKCFjb21wLT5mX2RhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbXAtPmZfZGF0YSA9IE5VTEw7CisgICAgICAgIGNvbXAtPmlfZGF0YSA9IGF2X21hbGxvY3pfYXJyYXkoY3NpemUsIHNpemVvZigqY29tcC0+aV9kYXRhKSk7CisgICAgICAgIGlmICghY29tcC0+aV9kYXRhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgY29tcC0+cmVzbGV2ZWwgPSBhdl9tYWxsb2N6X2FycmF5KGNvZHN0eS0+bnJlc2xldmVscywgc2l6ZW9mKCpjb21wLT5yZXNsZXZlbCkpOworICAgIGlmICghY29tcC0+cmVzbGV2ZWwpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgLyogTE9PUCBvbiByZXNvbHV0aW9uIGxldmVscyAqLworICAgIGZvciAocmVzbGV2ZWxubyA9IDA7IHJlc2xldmVsbm8gPCBjb2RzdHktPm5yZXNsZXZlbHM7IHJlc2xldmVsbm8rKykgeworICAgICAgICBpbnQgZGVjbHZsID0gY29kc3R5LT5ucmVzbGV2ZWxzIC0gcmVzbGV2ZWxubzsgICAgLy8gTl9MIC1yIHNlZSAgSVNPL0lFQyAxNTQ0NC0xOjIwMDIgQi41CisgICAgICAgIEpwZWcyMDAwUmVzTGV2ZWwgKnJlc2xldmVsID0gY29tcC0+cmVzbGV2ZWwgKyByZXNsZXZlbG5vOworCisgICAgICAgIC8qIENvbXB1dGUgYm9yZGVycyBmb3IgZWFjaCByZXNvbHV0aW9uIGxldmVsLgorICAgICAgICAgKiBDb21wdXRhdGlvbiBvZiB0cnhfMCwgdHJ4XzEsIHRyeV8wIGFuZCB0cnlfMS4KKyAgICAgICAgICogc2VlIElTTy9JRUMgMTU0NDQtMToyMDAyIGVxLiBCLjUgYW5kIEItMTQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICAgICAgcmVzbGV2ZWwtPmNvb3JkW2ldW2pdID0KKyAgICAgICAgICAgICAgICAgICAgZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIoY29tcC0+Y29vcmRfb1tpXVtqXSwgZGVjbHZsIC0gMSk7CisgICAgICAgIC8vIHVwZGF0ZSBwcmVjaW5jdHMgc2l6ZTogMl5uIHZhbHVlCisgICAgICAgIHJlc2xldmVsLT5sb2cyX3ByZWNfd2lkdGggID0gY29kc3R5LT5sb2cyX3ByZWNfd2lkdGhzW3Jlc2xldmVsbm9dOworICAgICAgICByZXNsZXZlbC0+bG9nMl9wcmVjX2hlaWdodCA9IGNvZHN0eS0+bG9nMl9wcmVjX2hlaWdodHNbcmVzbGV2ZWxub107CisKKyAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzIGZvciBlYWNoIHJlc29sdXRpb24gbGV2ZWwgKi8KKyAgICAgICAgaWYgKHJlc2xldmVsbm8gPT0gMCkKKyAgICAgICAgICAgIHJlc2xldmVsLT5uYmFuZHMgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXNsZXZlbC0+bmJhbmRzID0gMzsKKworICAgICAgICAvKiBOdW1iZXIgb2YgcHJlY2luY3RzIHdoaWNoIHNwYW4gdGhlIHRpbGUgZm9yIHJlc29sdXRpb24gbGV2ZWwgcmVzbGV2ZWxubworICAgICAgICAgKiBzZWUgQi42IGluIElTTy9JRUMgMTU0NDQtMToyMDAyIGVxLiBCLTE2CisgICAgICAgICAqIG51bV9wcmVjaW5jdHNfeCA9IHwtIHRyeF8xIC8gMiBeIGxvZzJfcHJlY193aWR0aCkgLXwgLSAodHJ4XzAgLyAyIF4gbG9nMl9wcmVjX3dpZHRoKQorICAgICAgICAgKiBudW1fcHJlY2luY3RzX3kgPSB8LSB0cnlfMSAvIDIgXiBsb2cyX3ByZWNfd2lkdGgpIC18IC0gKHRyeV8wIC8gMiBeIGxvZzJfcHJlY193aWR0aCkKKyAgICAgICAgICogZm9yIERjaW5lbWEgcHJvZmlsZXMgaW4gSlBFRyAyMDAwCisgICAgICAgICAqIG51bV9wcmVjaW5jdHNfeCA9IHwtIHRyeF8xIC8gMiBeIGxvZzJfcHJlY193aWR0aCkgLXwKKyAgICAgICAgICogbnVtX3ByZWNpbmN0c195ID0gfC0gdHJ5XzEgLyAyIF4gbG9nMl9wcmVjX3dpZHRoKSAtfCAqLworICAgICAgICBpZiAocmVzbGV2ZWwtPmNvb3JkWzBdWzFdID09IHJlc2xldmVsLT5jb29yZFswXVswXSkKKyAgICAgICAgICAgIHJlc2xldmVsLT5udW1fcHJlY2luY3RzX3ggPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXNsZXZlbC0+bnVtX3ByZWNpbmN0c194ID0KKyAgICAgICAgICAgICAgICBmZl9qcGVnMjAwMF9jZWlsZGl2cG93MihyZXNsZXZlbC0+Y29vcmRbMF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzbGV2ZWwtPmxvZzJfcHJlY193aWR0aCkgLQorICAgICAgICAgICAgICAgIChyZXNsZXZlbC0+Y29vcmRbMF1bMF0gPj4gcmVzbGV2ZWwtPmxvZzJfcHJlY193aWR0aCk7CisKKyAgICAgICAgaWYgKHJlc2xldmVsLT5jb29yZFsxXVsxXSA9PSByZXNsZXZlbC0+Y29vcmRbMV1bMF0pCisgICAgICAgICAgICByZXNsZXZlbC0+bnVtX3ByZWNpbmN0c195ID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzbGV2ZWwtPm51bV9wcmVjaW5jdHNfeSA9CisgICAgICAgICAgICAgICAgZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIocmVzbGV2ZWwtPmNvb3JkWzFdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2xldmVsLT5sb2cyX3ByZWNfaGVpZ2h0KSAtCisgICAgICAgICAgICAgICAgKHJlc2xldmVsLT5jb29yZFsxXVswXSA+PiByZXNsZXZlbC0+bG9nMl9wcmVjX2hlaWdodCk7CisKKyAgICAgICAgcmVzbGV2ZWwtPmJhbmQgPSBhdl9tYWxsb2N6X2FycmF5KHJlc2xldmVsLT5uYmFuZHMsIHNpemVvZigqcmVzbGV2ZWwtPmJhbmQpKTsKKyAgICAgICAgaWYgKCFyZXNsZXZlbC0+YmFuZCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXNsZXZlbC0+bmJhbmRzOyBiYW5kbm8rKywgZ2JhbmRubysrKSB7CisgICAgICAgICAgICBKcGVnMjAwMEJhbmQgKmJhbmQgPSByZXNsZXZlbC0+YmFuZCArIGJhbmRubzsKKyAgICAgICAgICAgIGludCBjYmxrbm8sIHByZWNubzsKKyAgICAgICAgICAgIGludCBuYl9wcmVjaW5jdHM7CisKKyAgICAgICAgICAgIC8qIFRPRE86IEltcGxlbWVudGF0aW9uIG9mIHF1YW50aXphdGlvbiBzdGVwIG5vdCBmaW5pc2hlZCwKKyAgICAgICAgICAgICAqIHNlZSBJU08vSUVDIDE1NDQ0LTE6MjAwMiBFLjEgYW5kIEEuNi40LiAqLworICAgICAgICAgICAgc3dpdGNoIChxbnRzdHktPnF1YW50c3R5KSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBnYWluOworICAgICAgICAgICAgICAgIGludCBudW1icHM7CisgICAgICAgICAgICBjYXNlIEpQRUcyMDAwX1FTVFlfTk9ORToKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiB0byB2ZXJpZnkuIE5vIHF1YW50aXphdGlvbiBpbiB0aGlzIGNhc2UgKi8KKyAgICAgICAgICAgICAgICBiYW5kLT5mX3N0ZXBzaXplID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSlBFRzIwMDBfUVNUWV9TSToKKyAgICAgICAgICAgICAgICAvKlRPRE86IENvbXB1dGUgZm9ybXVsYSB0byBpbXBsZW1lbnQuICovCisgICAgICAgICAgICAgICAgbnVtYnBzID0gY2JwcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgbHV0X2dhaW5bY29kc3R5LT50cmFuc2Zvcm0gPT0gRkZfRFdUNTNdW2JhbmRubyArIChyZXNsZXZlbG5vID4gMCldOworICAgICAgICAgICAgICAgIGJhbmQtPmZfc3RlcHNpemUgPSBTSEwoMjA0OCArIHFudHN0eS0+bWFudFtnYmFuZG5vXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKyBudW1icHMgLSBxbnRzdHktPmV4cG5bZ2JhbmRub10pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKUEVHMjAwMF9RU1RZX1NFOgorICAgICAgICAgICAgICAgIC8qIEV4cG9uZW50IHF1YW50aXphdGlvbiBzdGVwLgorICAgICAgICAgICAgICAgICAqIEZvcm11bGE6CisgICAgICAgICAgICAgICAgICogZGVsdGFfYiA9IDIgXiAoUl9iIC0gZXhwbl9iKSAqICgxICsgKG1hbnRfYiAvIDIgXiAxMSkpCisgICAgICAgICAgICAgICAgICogUl9iID0gUl9JICsgbG9nMiAoZ2Fpbl9iICkKKyAgICAgICAgICAgICAgICAgKiBzZWUgSVNPL0lFQyAxNTQ0NC0xOjIwMDIgRS4xLjEgZXFuLiBFLTMgYW5kIEUtNCAqLworICAgICAgICAgICAgICAgIC8qIFRPRE8vV0FSTjogdmFsdWUgb2YgbG9nMiAoZ2Fpbl9iICkgbm90IHRha2VuIGludG8gYWNjb3VudAorICAgICAgICAgICAgICAgICAqIGJ1dCBpdCB3b3JrcyAoY29tcGFyZWQgdG8gT3BlbkpQRUcpLiBXaHk/CisgICAgICAgICAgICAgICAgICogRnVydGhlciBpbnZlc3RpZ2F0aW9uIG5lZWRlZC4gKi8KKyAgICAgICAgICAgICAgICBnYWluICAgICAgICAgICAgPSBjYnBzOworICAgICAgICAgICAgICAgIGJhbmQtPmZfc3RlcHNpemUgID0gcG93KDIuMCwgZ2FpbiAtIHFudHN0eS0+ZXhwbltnYmFuZG5vXSk7CisgICAgICAgICAgICAgICAgYmFuZC0+Zl9zdGVwc2l6ZSAqPSBxbnRzdHktPm1hbnRbZ2JhbmRub10gLyAyMDQ4LjAgKyAxLjA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJhbmQtPmZfc3RlcHNpemUgPSAwOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBxdWFudGl6YXRpb24gZm9ybWF0XG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEZJWE1FOiBJbiBvcGVuamVwZyBjb2RlIHN0ZXNwaXplID0gc3RlcHNpemUgKiAwLjUuIFdoeT8KKyAgICAgICAgICAgICAqIElmIG5vdCBzZXQgb3V0cHV0IG9mIGVudHJvcGljIGRlY29kZXIgaXMgbm90IGNvcnJlY3QuICovCisgICAgICAgICAgICBpZiAoIWF2X2NvZGVjX2lzX2VuY29kZXIoYXZjdHgtPmNvZGVjKSkKKyAgICAgICAgICAgICAgICBiYW5kLT5mX3N0ZXBzaXplICo9IDAuNTsKKworICAgICAgICAgICAgYmFuZC0+aV9zdGVwc2l6ZSA9IGJhbmQtPmZfc3RlcHNpemUgKiAoMSA8PCAxNSk7CisKKyAgICAgICAgICAgIC8qIGNvbXB1dGF0aW9uIG9mIHRieF8wLCB0YnhfMSwgdGJ5XzAsIHRieV8xCisgICAgICAgICAgICAgKiBzZWUgSVNPL0lFQyAxNTQ0NC0xOjIwMDIgQi41IGVxLiBCLTE1IGFuZCB0YmwgQi4xCisgICAgICAgICAgICAgKiBjb2RlYmxvY2sgd2lkdGggYW5kIGhlaWdodCBpcyBjb21wdXRlZCBmb3IKKyAgICAgICAgICAgICAqIERDSSBKUEVHIDIwMDAgY29kZWJsb2NrX3dpZHRoID0gY29kZWJsb2NrX3dpZHRoID0gMzIgPSAyIF4gNSAqLworICAgICAgICAgICAgaWYgKHJlc2xldmVsbm8gPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIGZvciByZXNsZXZlbG5vID0gMCwgb25seSBvbmUgYmFuZCwgeDBfYiA9IHkwX2IgPSAwICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPmNvb3JkW2ldW2pdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9qcGVnMjAwMF9jZWlsZGl2cG93Mihjb21wLT5jb29yZF9vW2ldW2pdIC0gY29tcC0+Y29vcmRfb1tpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsdmwgLSAxKTsKKyAgICAgICAgICAgICAgICBsb2cyX2JhbmRfcHJlY193aWR0aCAgPSByZXNsZXZlbC0+bG9nMl9wcmVjX3dpZHRoOworICAgICAgICAgICAgICAgIGxvZzJfYmFuZF9wcmVjX2hlaWdodCA9IHJlc2xldmVsLT5sb2cyX3ByZWNfaGVpZ2h0OworICAgICAgICAgICAgICAgIC8qIHNlZSBJU08vSUVDIDE1NDQ0LTE6MjAwMiBlcS4gQi0xNyBhbmQgZXEuIEItMTUgKi8KKyAgICAgICAgICAgICAgICBiYW5kLT5sb2cyX2NibGtfd2lkdGggID0gRkZNSU4oY29kc3R5LT5sb2cyX2NibGtfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2xldmVsLT5sb2cyX3ByZWNfd2lkdGgpOworICAgICAgICAgICAgICAgIGJhbmQtPmxvZzJfY2Jsa19oZWlnaHQgPSBGRk1JTihjb2RzdHktPmxvZzJfY2Jsa19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2xldmVsLT5sb2cyX3ByZWNfaGVpZ2h0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogMyBiYW5kcyB4MF9iID0gMSB5MF9iID0gMDsgeDBfYiA9IDAgeTBfYiA9IDE7IHgwX2IgPSB5MF9iID0gMSAqLworICAgICAgICAgICAgICAgIC8qIHgwX2IgYW5kIHkwX2IgYXJlIGNvbXB1dGVkIHdpdGggKChiYW5kbm8gKyAxID4+IGkpICYgMSkgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9ybXVsYSBleGFtcGxlIGZvciB0YnhfMCA9IGNlaWxkaXYoKHRjeF8wIC0gMiBeIChkZWNsdmwgLSAxKSAqIHgwX2IpIC8gZGVjbHZsKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmFuZC0+Y29vcmRbaV1bal0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2pwZWcyMDAwX2NlaWxkaXZwb3cyKGNvbXAtPmNvb3JkX29baV1bal0gLSBjb21wLT5jb29yZF9vW2ldWzBdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChiYW5kbm8gKyAxID4+IGkpICYgMSkgPDwgZGVjbHZsIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHZsKTsKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiBNYW5hZ2UgY2FzZSBvZiAzIGJhbmQgb2Zmc2V0cyBoZXJlIG9yCisgICAgICAgICAgICAgICAgICogaW4gY29kaW5nL2RlY29kaW5nIGZ1bmN0aW9uPyAqLworCisgICAgICAgICAgICAgICAgLyogc2VlIElTTy9JRUMgMTU0NDQtMToyMDAyIGVxLiBCLTE3IGFuZCBlcS4gQi0xNSAqLworICAgICAgICAgICAgICAgIGJhbmQtPmxvZzJfY2Jsa193aWR0aCAgPSBGRk1JTihjb2RzdHktPmxvZzJfY2Jsa193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzbGV2ZWwtPmxvZzJfcHJlY193aWR0aCAtIDEpOworICAgICAgICAgICAgICAgIGJhbmQtPmxvZzJfY2Jsa19oZWlnaHQgPSBGRk1JTihjb2RzdHktPmxvZzJfY2Jsa19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2xldmVsLT5sb2cyX3ByZWNfaGVpZ2h0IC0gMSk7CisKKyAgICAgICAgICAgICAgICBsb2cyX2JhbmRfcHJlY193aWR0aCAgPSByZXNsZXZlbC0+bG9nMl9wcmVjX3dpZHRoICAtIDE7CisgICAgICAgICAgICAgICAgbG9nMl9iYW5kX3ByZWNfaGVpZ2h0ID0gcmVzbGV2ZWwtPmxvZzJfcHJlY19oZWlnaHQgLSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgICAgIGJhbmQtPmNvb3JkWzBdW2pdID0gZmZfanBlZzIwMDBfY2VpbGRpdihiYW5kLT5jb29yZFswXVtqXSwgZHgpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgICAgICAgICBiYW5kLT5jb29yZFsxXVtqXSA9IGZmX2pwZWcyMDAwX2NlaWxkaXYoYmFuZC0+Y29vcmRbMV1bal0sIGR5KTsKKworICAgICAgICAgICAgaWYgKHJlc2xldmVsLT5udW1fcHJlY2luY3RzX3ggKiAodWludDY0X3QpcmVzbGV2ZWwtPm51bV9wcmVjaW5jdHNfeSA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBiYW5kLT5wcmVjID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmJfcHJlY2luY3RzID0gcmVzbGV2ZWwtPm51bV9wcmVjaW5jdHNfeCAqIHJlc2xldmVsLT5udW1fcHJlY2luY3RzX3k7CisgICAgICAgICAgICBiYW5kLT5wcmVjID0gYXZfbWFsbG9jel9hcnJheShuYl9wcmVjaW5jdHMsIHNpemVvZigqYmFuZC0+cHJlYykpOworICAgICAgICAgICAgaWYgKCFiYW5kLT5wcmVjKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgIGZvciAocHJlY25vID0gMDsgcHJlY25vIDwgbmJfcHJlY2luY3RzOyBwcmVjbm8rKykgeworICAgICAgICAgICAgICAgIEpwZWcyMDAwUHJlYyAqcHJlYyA9IGJhbmQtPnByZWMgKyBwcmVjbm87CisgICAgICAgICAgICAgICAgaW50IG5iX2NvZGVibG9ja3M7CisKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiBFeHBsYWluIGZvcm11bGEgZm9yIEpQRUcyMDAgRENJTkVNQS4gKi8KKyAgICAgICAgICAgICAgICAvKiBUT0RPOiBWZXJpZnkgd2l0aCBwcmV2aW91cyBjb3VudCBvZiBjb2RlYmxvY2tzIHBlciBiYW5kICovCisKKyAgICAgICAgICAgICAgICAvKiBDb21wdXRlIFBfeDAgKi8KKyAgICAgICAgICAgICAgICBwcmVjLT5jb29yZFswXVswXSA9IChwcmVjbm8gJSByZXNsZXZlbC0+bnVtX3ByZWNpbmN0c194KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBsb2cyX2JhbmRfcHJlY193aWR0aCk7CisgICAgICAgICAgICAgICAgcHJlYy0+Y29vcmRbMF1bMF0gPSBGRk1BWChwcmVjLT5jb29yZFswXVswXSwgYmFuZC0+Y29vcmRbMF1bMF0pOworCisgICAgICAgICAgICAgICAgLyogQ29tcHV0ZSBQX3kwICovCisgICAgICAgICAgICAgICAgcHJlYy0+Y29vcmRbMV1bMF0gPSAocHJlY25vIC8gcmVzbGV2ZWwtPm51bV9wcmVjaW5jdHNfeCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgbG9nMl9iYW5kX3ByZWNfaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBwcmVjLT5jb29yZFsxXVswXSA9IEZGTUFYKHByZWMtPmNvb3JkWzFdWzBdLCBiYW5kLT5jb29yZFsxXVswXSk7CisKKyAgICAgICAgICAgICAgICAvKiBDb21wdXRlIFBfeDEgKi8KKyAgICAgICAgICAgICAgICBwcmVjLT5jb29yZFswXVsxXSA9IHByZWMtPmNvb3JkWzBdWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IGxvZzJfYmFuZF9wcmVjX3dpZHRoKTsKKyAgICAgICAgICAgICAgICBwcmVjLT5jb29yZFswXVsxXSA9IEZGTUlOKHByZWMtPmNvb3JkWzBdWzFdLCBiYW5kLT5jb29yZFswXVsxXSk7CisKKyAgICAgICAgICAgICAgICAvKiBDb21wdXRlIFBfeTEgKi8KKyAgICAgICAgICAgICAgICBwcmVjLT5jb29yZFsxXVsxXSA9IHByZWMtPmNvb3JkWzFdWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IGxvZzJfYmFuZF9wcmVjX2hlaWdodCk7CisgICAgICAgICAgICAgICAgcHJlYy0+Y29vcmRbMV1bMV0gPSBGRk1JTihwcmVjLT5jb29yZFsxXVsxXSwgYmFuZC0+Y29vcmRbMV1bMV0pOworCisgICAgICAgICAgICAgICAgcHJlYy0+bmJfY29kZWJsb2Nrc193aWR0aCA9CisgICAgICAgICAgICAgICAgICAgIGZmX2pwZWcyMDAwX2NlaWxkaXZwb3cyKHByZWMtPmNvb3JkWzBdWzFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYy0+Y29vcmRbMF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPmxvZzJfY2Jsa193aWR0aCk7CisgICAgICAgICAgICAgICAgcHJlYy0+bmJfY29kZWJsb2Nrc19oZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICBmZl9qcGVnMjAwMF9jZWlsZGl2cG93MihwcmVjLT5jb29yZFsxXVsxXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWMtPmNvb3JkWzFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLT5sb2cyX2NibGtfaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIC8qIFRhZyB0cmVlcyBpbml0aWFsaXphdGlvbiAqLworICAgICAgICAgICAgICAgIHByZWMtPmNibGtpbmNsID0KKyAgICAgICAgICAgICAgICAgICAgZmZfanBlZzIwMDBfdGFnX3RyZWVfaW5pdChwcmVjLT5uYl9jb2RlYmxvY2tzX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWMtPm5iX2NvZGVibG9ja3NfaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBpZiAoIXByZWMtPmNibGtpbmNsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICAgICAgcHJlYy0+emVyb2JpdHMgPQorICAgICAgICAgICAgICAgICAgICBmZl9qcGVnMjAwMF90YWdfdHJlZV9pbml0KHByZWMtPm5iX2NvZGVibG9ja3Nfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYy0+bmJfY29kZWJsb2Nrc19oZWlnaHQpOworICAgICAgICAgICAgICAgIGlmICghcHJlYy0+emVyb2JpdHMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgICAgICBpZiAocHJlYy0+bmJfY29kZWJsb2Nrc193aWR0aCAqICh1aW50NjRfdClwcmVjLT5uYl9jb2RlYmxvY2tzX2hlaWdodCA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlYy0+Y2JsayA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5iX2NvZGVibG9ja3MgPSBwcmVjLT5uYl9jb2RlYmxvY2tzX3dpZHRoICogcHJlYy0+bmJfY29kZWJsb2Nrc19oZWlnaHQ7CisgICAgICAgICAgICAgICAgcHJlYy0+Y2JsayA9IGF2X21hbGxvY3pfYXJyYXkobmJfY29kZWJsb2Nrcywgc2l6ZW9mKCpwcmVjLT5jYmxrKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwcmVjLT5jYmxrKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbmJfY29kZWJsb2NrczsgY2Jsa25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgSnBlZzIwMDBDYmxrICpjYmxrID0gcHJlYy0+Y2JsayArIGNibGtubzsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgQ3gwLCBDeTA7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQ29tcHV0ZSBjb29yZGluYXRlcyBvZiBjb2RlYmxvY2tzICovCisgICAgICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgQ3gwKi8KKyAgICAgICAgICAgICAgICAgICAgQ3gwID0gKHByZWMtPmNvb3JkWzBdWzBdID4+IGJhbmQtPmxvZzJfY2Jsa193aWR0aCkgPDwgYmFuZC0+bG9nMl9jYmxrX3dpZHRoOworICAgICAgICAgICAgICAgICAgICBDeDAgPSBDeDAgKyAoKGNibGtubyAlIHByZWMtPm5iX2NvZGVibG9ja3Nfd2lkdGgpICA8PCBiYW5kLT5sb2cyX2NibGtfd2lkdGgpOworICAgICAgICAgICAgICAgICAgICBjYmxrLT5jb29yZFswXVswXSA9IEZGTUFYKEN4MCwgcHJlYy0+Y29vcmRbMF1bMF0pOworCisgICAgICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgQ3kwKi8KKyAgICAgICAgICAgICAgICAgICAgQ3kwID0gKHByZWMtPmNvb3JkWzFdWzBdID4+IGJhbmQtPmxvZzJfY2Jsa19oZWlnaHQpIDw8IGJhbmQtPmxvZzJfY2Jsa19oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIEN5MCA9IEN5MCArICgoY2Jsa25vIC8gcHJlYy0+bmJfY29kZWJsb2Nrc193aWR0aCkgICA8PCBiYW5kLT5sb2cyX2NibGtfaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgY2Jsay0+Y29vcmRbMV1bMF0gPSBGRk1BWChDeTAsIHByZWMtPmNvb3JkWzFdWzBdKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBDb21wdXRlIEN4MSAqLworICAgICAgICAgICAgICAgICAgICBjYmxrLT5jb29yZFswXVsxXSA9IEZGTUlOKEN4MCArICgxIDw8IGJhbmQtPmxvZzJfY2Jsa193aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYy0+Y29vcmRbMF1bMV0pOworCisgICAgICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgQ3kxICovCisgICAgICAgICAgICAgICAgICAgIGNibGstPmNvb3JkWzFdWzFdID0gRkZNSU4oQ3kwICsgKDEgPDwgYmFuZC0+bG9nMl9jYmxrX2hlaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYy0+Y29vcmRbMV1bMV0pOworICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgY29kZS1ibG9ja3MgY29vcmRpbmF0ZXMgYWNjb3JkaW5nIHN1Yi1iYW5kIHBvc2l0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmICgoYmFuZG5vICsgISFyZXNsZXZlbG5vKSAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPmNvb3JkWzBdWzBdICs9IGNvbXAtPnJlc2xldmVsW3Jlc2xldmVsbm8tMV0uY29vcmRbMF1bMV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC0+cmVzbGV2ZWxbcmVzbGV2ZWxuby0xXS5jb29yZFswXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPmNvb3JkWzBdWzFdICs9IGNvbXAtPnJlc2xldmVsW3Jlc2xldmVsbm8tMV0uY29vcmRbMF1bMV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC0+cmVzbGV2ZWxbcmVzbGV2ZWxuby0xXS5jb29yZFswXVswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGJhbmRubyArICEhcmVzbGV2ZWxubykgJiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5jb29yZFsxXVswXSArPSBjb21wLT5yZXNsZXZlbFtyZXNsZXZlbG5vLTFdLmNvb3JkWzFdWzFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAtPnJlc2xldmVsW3Jlc2xldmVsbm8tMV0uY29vcmRbMV1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5jb29yZFsxXVsxXSArPSBjb21wLT5yZXNsZXZlbFtyZXNsZXZlbG5vLTFdLmNvb3JkWzFdWzFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAtPnJlc2xldmVsW3Jlc2xldmVsbm8tMV0uY29vcmRbMV1bMF07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYmxrLT56ZXJvICAgICAgPSAwOworICAgICAgICAgICAgICAgICAgICBjYmxrLT5sYmxvY2sgICAgPSAzOworICAgICAgICAgICAgICAgICAgICBjYmxrLT5sZW5ndGggICAgPSAwOworICAgICAgICAgICAgICAgICAgICBjYmxrLT5sZW5ndGhpbmMgPSAwOworICAgICAgICAgICAgICAgICAgICBjYmxrLT5ucGFzc2VzICAgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl9qcGVnMjAwMF9yZWluaXQoSnBlZzIwMDBDb21wb25lbnQgKmNvbXAsIEpwZWcyMDAwQ29kaW5nU3R5bGUgKmNvZHN0eSkKK3sKKyAgICBpbnQgcmVzbGV2ZWxubywgYmFuZG5vLCBjYmxrbm8sIHByZWNubzsKKyAgICBmb3IgKHJlc2xldmVsbm8gPSAwOyByZXNsZXZlbG5vIDwgY29kc3R5LT5ucmVzbGV2ZWxzOyByZXNsZXZlbG5vKyspIHsKKyAgICAgICAgSnBlZzIwMDBSZXNMZXZlbCAqcmxldmVsID0gY29tcC0+cmVzbGV2ZWwgKyByZXNsZXZlbG5vOworICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJsZXZlbC0+bmJhbmRzOyBiYW5kbm8rKykgeworICAgICAgICAgICAgSnBlZzIwMDBCYW5kICpiYW5kID0gcmxldmVsLT5iYW5kICsgYmFuZG5vOworICAgICAgICAgICAgZm9yKHByZWNubyA9IDA7IHByZWNubyA8IHJsZXZlbC0+bnVtX3ByZWNpbmN0c194ICogcmxldmVsLT5udW1fcHJlY2luY3RzX3k7IHByZWNubysrKSB7CisgICAgICAgICAgICAgICAgSnBlZzIwMDBQcmVjICpwcmVjID0gYmFuZC0+cHJlYyArIHByZWNubzsKKyAgICAgICAgICAgICAgICB0YWdfdHJlZV96ZXJvKHByZWMtPnplcm9iaXRzLCBwcmVjLT5uYl9jb2RlYmxvY2tzX3dpZHRoLCBwcmVjLT5uYl9jb2RlYmxvY2tzX2hlaWdodCk7CisgICAgICAgICAgICAgICAgdGFnX3RyZWVfemVybyhwcmVjLT5jYmxraW5jbCwgcHJlYy0+bmJfY29kZWJsb2Nrc193aWR0aCwgcHJlYy0+bmJfY29kZWJsb2Nrc19oZWlnaHQpOworICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgcHJlYy0+bmJfY29kZWJsb2Nrc193aWR0aCAqIHByZWMtPm5iX2NvZGVibG9ja3NfaGVpZ2h0OyBjYmxrbm8rKykgeworICAgICAgICAgICAgICAgICAgICBKcGVnMjAwMENibGsgKmNibGsgPSBwcmVjLT5jYmxrICsgY2Jsa25vOworICAgICAgICAgICAgICAgICAgICBjYmxrLT5sZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICBjYmxrLT5sYmxvY2sgPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl9qcGVnMjAwMF9jbGVhbnVwKEpwZWcyMDAwQ29tcG9uZW50ICpjb21wLCBKcGVnMjAwMENvZGluZ1N0eWxlICpjb2RzdHkpCit7CisgICAgaW50IHJlc2xldmVsbm8sIGJhbmRubywgcHJlY25vOworICAgIGZvciAocmVzbGV2ZWxubyA9IDA7CisgICAgICAgICBjb21wLT5yZXNsZXZlbCAmJiByZXNsZXZlbG5vIDwgY29kc3R5LT5ucmVzbGV2ZWxzOworICAgICAgICAgcmVzbGV2ZWxubysrKSB7CisgICAgICAgIEpwZWcyMDAwUmVzTGV2ZWwgKnJlc2xldmVsOworCisgICAgICAgIGlmICghY29tcC0+cmVzbGV2ZWwpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICByZXNsZXZlbCA9IGNvbXAtPnJlc2xldmVsICsgcmVzbGV2ZWxubzsKKyAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXNsZXZlbC0+bmJhbmRzOyBiYW5kbm8rKykgeworICAgICAgICAgICAgSnBlZzIwMDBCYW5kICpiYW5kOworCisgICAgICAgICAgICBpZiAoIXJlc2xldmVsLT5iYW5kKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBiYW5kID0gcmVzbGV2ZWwtPmJhbmQgKyBiYW5kbm87CisgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlc2xldmVsLT5udW1fcHJlY2luY3RzX3ggKiByZXNsZXZlbC0+bnVtX3ByZWNpbmN0c195OyBwcmVjbm8rKykgeworICAgICAgICAgICAgICAgIGlmIChiYW5kLT5wcmVjKSB7CisgICAgICAgICAgICAgICAgICAgIEpwZWcyMDAwUHJlYyAqcHJlYyA9IGJhbmQtPnByZWMgKyBwcmVjbm87CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZwcmVjLT56ZXJvYml0cyk7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZwcmVjLT5jYmxraW5jbCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZwcmVjLT5jYmxrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZiYW5kLT5wcmVjKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmcmVzbGV2ZWwtPmJhbmQpOworICAgIH0KKworICAgIGZmX2R3dF9kZXN0cm95KCZjb21wLT5kd3QpOworICAgIGF2X2ZyZWVwKCZjb21wLT5yZXNsZXZlbCk7CisgICAgYXZfZnJlZXAoJmNvbXAtPmlfZGF0YSk7CisgICAgYXZfZnJlZXAoJmNvbXAtPmZfZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9qcGVnMjAwMC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvanBlZzIwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2RiYTYyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvanBlZzIwMDAuaApAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIEpQRUcgMjAwMCBjb21tb24gZGVmaW5lcywgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS2FtaWwgTm93b3NhZAorICogQ29weXJpZ2h0IChjKSAyMDEzIE5pY29sYXMgQmVydHJhbmQgPG5pY29pbmF0dGVuZHVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSlBFRzIwMDBfSAorI2RlZmluZSBBVkNPREVDX0pQRUcyMDAwX0gKKworLyoqCisgKiBAZmlsZQorICogSlBFRyAyMDAwIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMgY29tbW9uCisgKiB0byBlbmNvZGVyIGFuZCBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1xYy5oIgorI2luY2x1ZGUgImpwZWcyMDAwZHd0LmgiCisKK2VudW0gSnBlZzIwMDBNYXJrZXJzIHsKKyAgICBKUEVHMjAwMF9TT0MgPSAweGZmNGYsIC8vIHN0YXJ0IG9mIGNvZGVzdHJlYW0KKyAgICBKUEVHMjAwMF9TSVogPSAweGZmNTEsIC8vIGltYWdlIGFuZCB0aWxlIHNpemUKKyAgICBKUEVHMjAwMF9DT0QsICAgICAgICAgIC8vIGNvZGluZyBzdHlsZSBkZWZhdWx0CisgICAgSlBFRzIwMDBfQ09DLCAgICAgICAgICAvLyBjb2Rpbmcgc3R5bGUgY29tcG9uZW50CisgICAgSlBFRzIwMDBfVExNID0gMHhmZjU1LCAvLyBwYWNrZWQgcGFja2V0IGhlYWRlcnMsIHRpbGUtcGFydCBoZWFkZXIKKyAgICBKUEVHMjAwMF9QTE0gPSAweGZmNTcsIC8vIHRpbGUtcGFydCBsZW5ndGhzCisgICAgSlBFRzIwMDBfUExULCAgICAgICAgICAvLyBwYWNrZXQgbGVuZ3RoLCBtYWluIGhlYWRlcgorICAgIEpQRUcyMDAwX1FDRCA9IDB4ZmY1YywgLy8gcXVhbnRpemF0aW9uIGRlZmF1bHQKKyAgICBKUEVHMjAwMF9RQ0MsICAgICAgICAgIC8vIHF1YW50aXphdGlvbiBjb21wb25lbnQKKyAgICBKUEVHMjAwMF9SR04sICAgICAgICAgIC8vIHJlZ2lvbiBvZiBpbnRlcmVzdAorICAgIEpQRUcyMDAwX1BPQywgICAgICAgICAgLy8gcHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlCisgICAgSlBFRzIwMDBfUFBNLCAgICAgICAgICAvLyBwYWNrZXQgbGVuZ3RoLCB0aWxlLXBhcnQgaGVhZGVyCisgICAgSlBFRzIwMDBfUFBULCAgICAgICAgICAvLyBwYWNrZWQgcGFja2V0IGhlYWRlcnMsIG1haW4gaGVhZGVyCisgICAgSlBFRzIwMDBfQ1JHID0gMHhmZjYzLCAvLyBjb21wb25lbnQgcmVnaXN0cmF0aW9uCisgICAgSlBFRzIwMDBfQ09NLCAgICAgICAgICAvLyBjb21tZW50CisgICAgSlBFRzIwMDBfU09UID0gMHhmZjkwLCAvLyBzdGFydCBvZiB0aWxlLXBhcnQKKyAgICBKUEVHMjAwMF9TT1AsICAgICAgICAgIC8vIHN0YXJ0IG9mIHBhY2tldAorICAgIEpQRUcyMDAwX0VQSCwgICAgICAgICAgLy8gZW5kIG9mIHBhY2tldCBoZWFkZXIKKyAgICBKUEVHMjAwMF9TT0QsICAgICAgICAgIC8vIHN0YXJ0IG9mIGRhdGEKKyAgICBKUEVHMjAwMF9FT0MgPSAweGZmZDksIC8vIGVuZCBvZiBjb2Rlc3RyZWFtCit9OworCitlbnVtIEpwZWcyMDAwUXVhbnRzdHkgeyAvLyBxdWFudGl6YXRpb24gc3R5bGUKKyAgICBKUEVHMjAwMF9RU1RZX05PTkUsIC8vIG5vIHF1YW50aXphdGlvbgorICAgIEpQRUcyMDAwX1FTVFlfU0ksICAgLy8gc2NhbGFyIGRlcml2ZWQKKyAgICBKUEVHMjAwMF9RU1RZX1NFICAgIC8vIHNjYWxhciBleHBvdW5kZWQKK307CisKKyNkZWZpbmUgSlBFRzIwMDBfTUFYX0NCTEtXIDY0CisjZGVmaW5lIEpQRUcyMDAwX01BWF9DQkxLSCA2NAorCisKKyNkZWZpbmUgSlBFRzIwMDBfTUFYX0RFQ0xFVkVMUyAzMgorI2RlZmluZSBKUEVHMjAwMF9NQVhfUkVTTEVWRUxTIChKUEVHMjAwMF9NQVhfREVDTEVWRUxTICsgMSkKKworLy8gVDEgZmxhZ3MKKy8vIGZsYWdzIGRldGVybWluaW5nIHNpZ25pZmljYW5jZSBvZiBuZWlnaGJvciBjb2VmZmljaWVudHMKKyNkZWZpbmUgSlBFRzIwMDBfVDFfU0lHX04gIDB4MDAwMQorI2RlZmluZSBKUEVHMjAwMF9UMV9TSUdfRSAgMHgwMDAyCisjZGVmaW5lIEpQRUcyMDAwX1QxX1NJR19XICAweDAwMDQKKyNkZWZpbmUgSlBFRzIwMDBfVDFfU0lHX1MgIDB4MDAwOAorI2RlZmluZSBKUEVHMjAwMF9UMV9TSUdfTkUgMHgwMDEwCisjZGVmaW5lIEpQRUcyMDAwX1QxX1NJR19OVyAweDAwMjAKKyNkZWZpbmUgSlBFRzIwMDBfVDFfU0lHX1NFIDB4MDA0MAorI2RlZmluZSBKUEVHMjAwMF9UMV9TSUdfU1cgMHgwMDgwCisjZGVmaW5lIEpQRUcyMDAwX1QxX1NJR19OQiAoSlBFRzIwMDBfVDFfU0lHX04gIHwgSlBFRzIwMDBfVDFfU0lHX0UgIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFRzIwMDBfVDFfU0lHX1MgIHwgSlBFRzIwMDBfVDFfU0lHX1cgIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFRzIwMDBfVDFfU0lHX05FIHwgSlBFRzIwMDBfVDFfU0lHX05XIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFRzIwMDBfVDFfU0lHX1NFIHwgSlBFRzIwMDBfVDFfU0lHX1NXKQorLy8gZmxhZ3MgZGV0ZXJtaW5pbmcgc2lnbiBiaXQgb2YgbmVpZ2hib3IgY29lZmZpY2llbnRzCisjZGVmaW5lIEpQRUcyMDAwX1QxX1NHTl9OICAweDAxMDAKKyNkZWZpbmUgSlBFRzIwMDBfVDFfU0dOX1MgIDB4MDIwMAorI2RlZmluZSBKUEVHMjAwMF9UMV9TR05fVyAgMHgwNDAwCisjZGVmaW5lIEpQRUcyMDAwX1QxX1NHTl9FICAweDA4MDAKKworI2RlZmluZSBKUEVHMjAwMF9UMV9WSVMgICAgMHgxMDAwCisjZGVmaW5lIEpQRUcyMDAwX1QxX1NJRyAgICAweDIwMDAKKyNkZWZpbmUgSlBFRzIwMDBfVDFfUkVGICAgIDB4NDAwMAorCisjZGVmaW5lIEpQRUcyMDAwX1QxX1NHTiAgICAweDgwMDAKKworLy8gQ29kZWJsb2NrIGNvZGluZyBzdHlsZXMKKyNkZWZpbmUgSlBFRzIwMDBfQ0JMS19CWVBBU1MgICAgMHgwMSAvLyBTZWxlY3RpdmUgYXJpdGhtZXRpYyBjb2RpbmcgYnlwYXNzCisjZGVmaW5lIEpQRUcyMDAwX0NCTEtfUkVTRVQgICAgIDB4MDIgLy8gUmVzZXQgY29udGV4dCBwcm9iYWJpbGl0aWVzCisjZGVmaW5lIEpQRUcyMDAwX0NCTEtfVEVSTUFMTCAgIDB4MDQgLy8gVGVybWluYXRlIGFmdGVyIGVhY2ggY29kaW5nIHBhc3MKKyNkZWZpbmUgSlBFRzIwMDBfQ0JMS19WU0MgICAgICAgMHgwOCAvLyBWZXJ0aWNhbCBzdHJpcGUgY2F1c2FsIGNvbnRleHQgZm9ybWF0aW9uCisjZGVmaW5lIEpQRUcyMDAwX0NCTEtfUFJFRFRFUk0gIDB4MTAgLy8gUHJlZGljdGFibGUgdGVybWluYXRpb24KKyNkZWZpbmUgSlBFRzIwMDBfQ0JMS19TRUdTWU0gICAgMHgyMCAvLyBTZWdtZW50YXRpb24gc3ltYm9scyBwcmVzZW50CisKKy8vIENvZGluZyBzdHlsZXMKKyNkZWZpbmUgSlBFRzIwMDBfQ1NUWV9QUkVDICAgICAgMHgwMSAvLyBQcmVjaW5jdHMgZGVmaW5lZCBpbiBjb2Rpbmcgc3R5bGUKKyNkZWZpbmUgSlBFRzIwMDBfQ1NUWV9TT1AgICAgICAgMHgwMiAvLyBTT1AgbWFya2VyIHByZXNlbnQKKyNkZWZpbmUgSlBFRzIwMDBfQ1NUWV9FUEggICAgICAgMHgwNCAvLyBFUEggbWFya2VyIHByZXNlbnQKKworLy8gUHJvZ3Jlc3Npb24gb3JkZXJzCisjZGVmaW5lIEpQRUcyMDAwX1BHT0RfTFJDUCAgICAgIDB4MDAgIC8vIExheWVyLXJlc29sdXRpb24gbGV2ZWwtY29tcG9uZW50LXBvc2l0aW9uIHByb2dyZXNzaW9uCisjZGVmaW5lIEpQRUcyMDAwX1BHT0RfUkxDUCAgICAgIDB4MDEgIC8vIFJlc29sdXRpb24gbGV2ZWwtbGF5ZXItY29tcG9uZW50LXBvc2l0aW9uIHByb2dyZXNzaW9uCisjZGVmaW5lIEpQRUcyMDAwX1BHT0RfUlBDTCAgICAgIDB4MDIgIC8vIFJlc29sdXRpb24gbGV2ZWwtcG9zaXRpb24tY29tcG9uZW50LWxheWVyIHByb2dyZXNzaW9uCisjZGVmaW5lIEpQRUcyMDAwX1BHT0RfUENSTCAgICAgIDB4MDMgIC8vIFBvc2l0aW9uLWNvbXBvbmVudC1yZXNvbHV0aW9uIGxldmVsLWxheWVyIHByb2dyZXNzaW9uCisjZGVmaW5lIEpQRUcyMDAwX1BHT0RfQ1BSTCAgICAgIDB4MDQgIC8vIENvbXBvbmVudC1wb3NpdGlvbi1yZXNvbHV0aW9uIGxldmVsLWxheWVyIHByb2dyZXNzaW9uCisKK3R5cGVkZWYgc3RydWN0IEpwZWcyMDAwVDFDb250ZXh0IHsKKyAgICBpbnQgZGF0YVtKUEVHMjAwMF9NQVhfQ0JMS1ddW0pQRUcyMDAwX01BWF9DQkxLSF07CisgICAgaW50IGZsYWdzW0pQRUcyMDAwX01BWF9DQkxLVyArIDJdW0pQRUcyMDAwX01BWF9DQkxLSCArIDJdOworICAgIE1xY1N0YXRlIG1xYzsKK30gSnBlZzIwMDBUMUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IEpwZWcyMDAwVGd0Tm9kZSB7CisgICAgdWludDhfdCB2YWw7CisgICAgdWludDhfdCB2aXM7CisgICAgc3RydWN0IEpwZWcyMDAwVGd0Tm9kZSAqcGFyZW50OworfSBKcGVnMjAwMFRndE5vZGU7CisKK3R5cGVkZWYgc3RydWN0IEpwZWcyMDAwQ29kaW5nU3R5bGUgeworICAgIGludCBucmVzbGV2ZWxzOyAgICAgICAgICAgLy8gbnVtYmVyIG9mIHJlc29sdXRpb24gbGV2ZWxzCisgICAgaW50IG5yZXNsZXZlbHMyZGVjb2RlOyAgICAvLyBudW1iZXIgb2YgcmVzb2x1dGlvbiBsZXZlbHMgdG8gZGVjb2RlCisgICAgdWludDhfdCBsb2cyX2NibGtfd2lkdGgsCisgICAgICAgICAgICBsb2cyX2NibGtfaGVpZ2h0OyAvLyBleHBvbmVudCBvZiBjb2RlYmxvY2sgc2l6ZQorICAgIHVpbnQ4X3QgdHJhbnNmb3JtOyAgICAgICAgLy8gRFdUIHR5cGUKKyAgICB1aW50OF90IGNzdHk7ICAgICAgICAgICAgIC8vIGNvZGluZyBzdHlsZQorICAgIHVpbnQ4X3QgbmxheWVyczsgICAgICAgICAgLy8gbnVtYmVyIG9mIGxheWVycworICAgIHVpbnQ4X3QgbWN0OyAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgY29tcG9uZW50IHRyYW5zZm9ybWF0aW9uCisgICAgdWludDhfdCBjYmxrX3N0eWxlOyAgICAgICAvLyBjb2RlYmxvY2sgY29kaW5nIHN0eWxlCisgICAgdWludDhfdCBwcm9nX29yZGVyOyAgICAgICAvLyBwcm9ncmVzc2lvbiBvcmRlcgorICAgIHVpbnQ4X3QgbG9nMl9wcmVjX3dpZHRoc1tKUEVHMjAwMF9NQVhfUkVTTEVWRUxTXTsgIC8vIHByZWNpbmN0cyBzaXplIGFjY29yZGluZyByZXNvbHV0aW9uIGxldmVscworICAgIHVpbnQ4X3QgbG9nMl9wcmVjX2hlaWdodHNbSlBFRzIwMDBfTUFYX1JFU0xFVkVMU107IC8vIFRPRE86IGluaXRpYWxpemUgcHJlY19zaXplIGFycmF5IHdpdGggMD8KK30gSnBlZzIwMDBDb2RpbmdTdHlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgSnBlZzIwMDBRdWFudFN0eWxlIHsKKyAgICB1aW50OF90IGV4cG5bSlBFRzIwMDBfTUFYX0RFQ0xFVkVMUyAqIDNdOyAgLy8gcXVhbnRpemF0aW9uIGV4cG9uZW50CisgICAgdWludDE2X3QgbWFudFtKUEVHMjAwMF9NQVhfREVDTEVWRUxTICogM107IC8vIHF1YW50aXphdGlvbiBtYW50aXNzYQorICAgIHVpbnQ4X3QgcXVhbnRzdHk7ICAgICAgLy8gcXVhbnRpemF0aW9uIHN0eWxlCisgICAgdWludDhfdCBuZ3VhcmRiaXRzOyAgICAvLyBudW1iZXIgb2YgZ3VhcmQgYml0cworfSBKcGVnMjAwMFF1YW50U3R5bGU7CisKK3R5cGVkZWYgc3RydWN0IEpwZWcyMDAwUGFzcyB7CisgICAgdWludDE2X3QgcmF0ZTsKKyAgICBpbnQ2NF90IGRpc3RvOworfSBKcGVnMjAwMFBhc3M7CisKK3R5cGVkZWYgc3RydWN0IEpwZWcyMDAwQ2JsayB7CisgICAgdWludDhfdCBucGFzc2VzOworICAgIHVpbnQ4X3QgbmluY2xwYXNzZXM7IC8vIG51bWJlciBjb2Rpbmcgb2YgcGFzc2VzIGluY2x1ZGVkIGluIGNvZGVzdHJlYW0KKyAgICB1aW50OF90IG5vbnplcm9iaXRzOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICB1aW50MTZfdCBsZW5ndGhpbmM7CisgICAgdWludDhfdCBsYmxvY2s7CisgICAgdWludDhfdCB6ZXJvOworICAgIHVpbnQ4X3QgZGF0YVs4MTkyXTsKKyAgICBKcGVnMjAwMFBhc3MgcGFzc2VzWzEwMF07CisgICAgdWludDE2X3QgY29vcmRbMl1bMl07IC8vIGJvcmRlciBjb29yZGluYXRlcyB7e3gwLCB4MX0sIHt5MCwgeTF9fQorfSBKcGVnMjAwMENibGs7IC8vIGNvZGUgYmxvY2sKKwordHlwZWRlZiBzdHJ1Y3QgSnBlZzIwMDBQcmVjIHsKKyAgICB1aW50MTZfdCBuYl9jb2RlYmxvY2tzX3dpZHRoOworICAgIHVpbnQxNl90IG5iX2NvZGVibG9ja3NfaGVpZ2h0OworICAgIEpwZWcyMDAwVGd0Tm9kZSAqemVyb2JpdHM7CisgICAgSnBlZzIwMDBUZ3ROb2RlICpjYmxraW5jbDsKKyAgICBKcGVnMjAwMENibGsgKmNibGs7CisgICAgdWludDE2X3QgY29vcmRbMl1bMl07IC8vIGJvcmRlciBjb29yZGluYXRlcyB7e3gwLCB4MX0sIHt5MCwgeTF9fQorfSBKcGVnMjAwMFByZWM7IC8vIHByZWNpbmN0CisKK3R5cGVkZWYgc3RydWN0IEpwZWcyMDAwQmFuZCB7CisgICAgdWludDE2X3QgY29vcmRbMl1bMl07IC8vIGJvcmRlciBjb29yZGluYXRlcyB7e3gwLCB4MX0sIHt5MCwgeTF9fQorICAgIHVpbnQxNl90IGxvZzJfY2Jsa193aWR0aCwgbG9nMl9jYmxrX2hlaWdodDsKKyAgICBpbnQgaV9zdGVwc2l6ZTsgLy8gcXVhbnRpemF0aW9uIHN0ZXBzaXplCisgICAgZmxvYXQgZl9zdGVwc2l6ZTsgLy8gcXVhbnRpemF0aW9uIHN0ZXBzaXplCisgICAgSnBlZzIwMDBQcmVjICpwcmVjOworfSBKcGVnMjAwMEJhbmQ7IC8vIHN1YmJhbmQKKwordHlwZWRlZiBzdHJ1Y3QgSnBlZzIwMDBSZXNMZXZlbCB7CisgICAgdWludDhfdCBuYmFuZHM7CisgICAgdWludDE2X3QgY29vcmRbMl1bMl07IC8vIGJvcmRlciBjb29yZGluYXRlcyB7e3gwLCB4MX0sIHt5MCwgeTF9fQorICAgIHVpbnQxNl90IG51bV9wcmVjaW5jdHNfeCwgbnVtX3ByZWNpbmN0c195OyAvLyBudW1iZXIgb2YgcHJlY2luY3RzIGluIHgveSBkaXJlY3Rpb24KKyAgICB1aW50OF90IGxvZzJfcHJlY193aWR0aCwgbG9nMl9wcmVjX2hlaWdodDsgLy8gZXhwb25lbnQgb2YgcHJlY2luY3Qgc2l6ZQorICAgIEpwZWcyMDAwQmFuZCAqYmFuZDsKK30gSnBlZzIwMDBSZXNMZXZlbDsgLy8gcmVzb2x1dGlvbiBsZXZlbAorCit0eXBlZGVmIHN0cnVjdCBKcGVnMjAwMENvbXBvbmVudCB7CisgICAgSnBlZzIwMDBSZXNMZXZlbCAqcmVzbGV2ZWw7CisgICAgRFdUQ29udGV4dCBkd3Q7CisgICAgZmxvYXQgKmZfZGF0YTsKKyAgICBpbnQgKmlfZGF0YTsKKyAgICB1aW50MTZfdCBjb29yZFsyXVsyXTsgICAvLyBib3JkZXIgY29vcmRpbmF0ZXMge3t4MCwgeDF9LCB7eTAsIHkxfX0gLS0gY2FuIGJlIHJlZHVjZWQgd2l0aCBsb3dyZXMgb3B0aW9uCisgICAgdWludDE2X3QgY29vcmRfb1syXVsyXTsgLy8gYm9yZGVyIGNvb3JkaW5hdGVzIHt7eDAsIHgxfSwge3kwLCB5MX19IC0tIG9yaWdpbmFsIHZhbHVlcyBmcm9tIGpwZWcyMDAwIGhlYWRlcnMKK30gSnBlZzIwMDBDb21wb25lbnQ7CisKKy8qIG1pc2MgdG9vbHMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZmX2pwZWcyMDAwX2NlaWxkaXZwb3cyKGludCBhLCBpbnQgYikKK3sKKyAgICByZXR1cm4gKGEgKyAoMSA8PCBiKSAtIDEpID4+IGI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZmX2pwZWcyMDAwX2NlaWxkaXYoaW50IGEsIGludCBiKQoreworICAgIHJldHVybiAoYSArIGIgLSAxKSAvIGI7Cit9CisKKy8qIFRJRVItMSByb3V0aW5lcyAqLworCisvKiBTZXQgdXAgbG9va3VwIHRhYmxlcyB1c2VkIGluIFRJRVItMS4gKi8KK3ZvaWQgZmZfanBlZzIwMDBfaW5pdF90aWVyMV9sdXRzKHZvaWQpOworCisvKiBVcGRhdGUgc2lnbmlmaWNhbmNlIG9mIGEgY29lZmZpY2llbnQgYXQgY3VycmVudCBwb3NpdGlvbiAoeCx5KSBhbmQKKyAqIGZvciBuZWlnaGJvcnMuICovCit2b2lkIGZmX2pwZWcyMDAwX3NldF9zaWduaWZpY2FuY2UoSnBlZzIwMDBUMUNvbnRleHQgKnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IG5lZ2F0aXZlKTsKKworZXh0ZXJuIHVpbnQ4X3QgZmZfanBlZzIwMDBfc2lnY3R4bm9fbHV0WzI1Nl1bNF07CisKKy8qIEdldCBjb250ZXh0IGxhYmVsIChudW1iZXIgaW4gcmFuZ2VbMC4uOF0pIG9mIGEgY29lZmZpY2llbnQgZm9yIHNpZ25pZmljYW5jZQorICogcHJvcGFnYXRpb24gYW5kIGNsZWFudXAgY29kaW5nIHBhc3Nlcy4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZmX2pwZWcyMDAwX2dldHNpZ2N0eG5vKGludCBmbGFnLCBpbnQgYmFuZG5vKQoreworICAgIHJldHVybiBmZl9qcGVnMjAwMF9zaWdjdHhub19sdXRbZmxhZyAmIDI1NV1bYmFuZG5vXTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmVmY3R4bm9fbHV0WzJdWzJdID0geyB7IDE0LCAxNSB9LCB7IDE2LCAxNiB9IH07CisKKy8qIEdldCBjb250ZXh0IGxhYmVsIChudW1iZXIgaW4gcmFuZ2VbMTQuLjE2XSkgb2YgYSBjb2VmZmljaWVudCBmb3IgbWFnbml0dWRlCisgKiByZWZpbmVtZW50IHBhc3MuICovCitzdGF0aWMgaW5saW5lIGludCBmZl9qcGVnMjAwMF9nZXRyZWZjdHhubyhpbnQgZmxhZykKK3sKKyAgICByZXR1cm4gcmVmY3R4bm9fbHV0WyhmbGFnID4+IDE0KSAmIDFdWyhmbGFnICYgMjU1KSAhPSAwXTsKK30KKworZXh0ZXJuIHVpbnQ4X3QgZmZfanBlZzIwMDBfc2duY3R4bm9fbHV0WzE2XVsxNl07CitleHRlcm4gdWludDhfdCBmZl9qcGVnMjAwMF94b3JiaXRfbHV0WzE2XVsxNl07CisKKy8qIEdldCBjb250ZXh0IGxhYmVsIChudW1iZXIgaW4gcmFuZ2VbOS4uMTNdKSBmb3Igc2lnbiBkZWNvZGluZy4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZmX2pwZWcyMDAwX2dldHNnbmN0eG5vKGludCBmbGFnLCBpbnQgKnhvcmJpdCkKK3sKKyAgICAqeG9yYml0ID0gZmZfanBlZzIwMDBfeG9yYml0X2x1dFtmbGFnICYgMTVdWyhmbGFnID4+IDgpICYgMTVdOworICAgIHJldHVybiBmZl9qcGVnMjAwMF9zZ25jdHhub19sdXRbZmxhZyAmIDE1XVsoZmxhZyA+PiA4KSAmIDE1XTsKK30KKworaW50IGZmX2pwZWcyMDAwX2luaXRfY29tcG9uZW50KEpwZWcyMDAwQ29tcG9uZW50ICpjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwZWcyMDAwQ29kaW5nU3R5bGUgKmNvZHN0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGVnMjAwMFF1YW50U3R5bGUgKnFudHN0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2JwcywgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmN0eCk7CisKK3ZvaWQgZmZfanBlZzIwMDBfcmVpbml0KEpwZWcyMDAwQ29tcG9uZW50ICpjb21wLCBKcGVnMjAwMENvZGluZ1N0eWxlICpjb2RzdHkpOworCit2b2lkIGZmX2pwZWcyMDAwX2NsZWFudXAoSnBlZzIwMDBDb21wb25lbnQgKmNvbXAsIEpwZWcyMDAwQ29kaW5nU3R5bGUgKmNvZHN0eSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0pQRUcyMDAwX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2pwZWcyMDAwZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9qcGVnMjAwMGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZWU1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9qcGVnMjAwMGRlYy5jCkBAIC0wLDAgKzEsMTcwMSBAQAorLyoKKyAqIEpQRUcgMjAwMCBpbWFnZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS2FtaWwgTm93b3NhZAorICogQ29weXJpZ2h0IChjKSAyMDEzIE5pY29sYXMgQmVydHJhbmQgPG5pY29pbmF0dGVuZHVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBKUEVHIDIwMDAgaW1hZ2UgZGVjb2RlcgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgImpwZWcyMDAwLmgiCisjaW5jbHVkZSAianBlZzIwMDBkc3AuaCIKKworI2RlZmluZSBKUDJfU0lHX1RZUEUgICAgMHg2QTUwMjAyMAorI2RlZmluZSBKUDJfU0lHX1ZBTFVFICAgMHgwRDBBODcwQQorI2RlZmluZSBKUDJfQ09ERVNUUkVBTSAgMHg2QTcwMzI2MworI2RlZmluZSBKUDJfSEVBREVSICAgICAgMHg2QTcwMzI2OAorCisjZGVmaW5lIEhBRF9DT0MgMHgwMQorI2RlZmluZSBIQURfUUNDIDB4MDIKKwordHlwZWRlZiBzdHJ1Y3QgSnBlZzIwMDBUaWxlUGFydCB7CisgICAgdWludDhfdCB0aWxlX2luZGV4OyAgICAgICAgICAgICAgICAgLy8gVGlsZSBpbmRleCB3aG8gcmVmZXJzIHRoZSB0aWxlLXBhcnQKKyAgICBjb25zdCB1aW50OF90ICp0cF9lbmQ7CisgICAgR2V0Qnl0ZUNvbnRleHQgdHBnOyAgICAgICAgICAgICAgICAgLy8gYml0IHN0cmVhbSBpbiB0aWxlLXBhcnQKK30gSnBlZzIwMDBUaWxlUGFydDsKKworLyogUk1LOiBGb3IgSlBFRzIwMDAgRENJTkVNQSAzIHRpbGUtcGFydHMgaW4gYSB0aWxlCisgKiBvbmUgcGVyIGNvbXBvbmVudCwgc28gdGlsZV9wYXJ0IGVsZW1lbnRzIGhhdmUgYSBzaXplIG9mIDMgKi8KK3R5cGVkZWYgc3RydWN0IEpwZWcyMDAwVGlsZSB7CisgICAgSnBlZzIwMDBDb21wb25lbnQgICAqY29tcDsKKyAgICB1aW50OF90ICAgICAgICAgICAgIHByb3BlcnRpZXNbNF07CisgICAgSnBlZzIwMDBDb2RpbmdTdHlsZSBjb2RzdHlbNF07CisgICAgSnBlZzIwMDBRdWFudFN0eWxlICBxbnRzdHlbNF07CisgICAgSnBlZzIwMDBUaWxlUGFydCAgICB0aWxlX3BhcnRbNF07CisgICAgdWludDE2X3QgdHBfaWR4OyAgICAgICAgICAgICAgICAgICAgLy8gVGlsZS1wYXJ0IGluZGV4Cit9IEpwZWcyMDAwVGlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgSnBlZzIwMDBEZWNvZGVyQ29udGV4dCB7CisgICAgQVZDbGFzcyAgICAgICAgICpjbGFzczsKKyAgICBBVkNvZGVjQ29udGV4dCAgKmF2Y3R4OworICAgIEdldEJ5dGVDb250ZXh0ICBnOworCisgICAgaW50ICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQ7CisgICAgaW50ICAgICAgICAgICAgIGltYWdlX29mZnNldF94LCBpbWFnZV9vZmZzZXRfeTsKKyAgICBpbnQgICAgICAgICAgICAgdGlsZV9vZmZzZXRfeCwgdGlsZV9vZmZzZXRfeTsKKyAgICB1aW50OF90ICAgICAgICAgY2Jwc1s0XTsgICAgLy8gYml0cyBwZXIgc2FtcGxlIGluIHBhcnRpY3VsYXIgY29tcG9uZW50cworICAgIHVpbnQ4X3QgICAgICAgICBzZ25kWzRdOyAgICAvLyBpZiBhIGNvbXBvbmVudCBpcyBzaWduZWQKKyAgICB1aW50OF90ICAgICAgICAgcHJvcGVydGllc1s0XTsKKyAgICBpbnQgICAgICAgICAgICAgY2R4WzRdLCBjZHlbNF07CisgICAgaW50ICAgICAgICAgICAgIHByZWNpc2lvbjsKKyAgICBpbnQgICAgICAgICAgICAgbmNvbXBvbmVudHM7CisgICAgaW50ICAgICAgICAgICAgIGNvbG91cl9zcGFjZTsKKyAgICB1aW50MzJfdCAgICAgICAgcGFsZXR0ZVsyNTZdOworICAgIGludDhfdCAgICAgICAgICBwYWw4OworICAgIGludCAgICAgICAgICAgICBjZGVmWzRdOworICAgIGludCAgICAgICAgICAgICB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodDsKKyAgICB1bnNpZ25lZCAgICAgICAgbnVtWHRpbGVzLCBudW1ZdGlsZXM7CisgICAgaW50ICAgICAgICAgICAgIG1heHRpbGVsZW47CisKKyAgICBKcGVnMjAwMENvZGluZ1N0eWxlIGNvZHN0eVs0XTsKKyAgICBKcGVnMjAwMFF1YW50U3R5bGUgIHFudHN0eVs0XTsKKworICAgIGludCAgICAgICAgICAgICBiaXRfaW5kZXg7CisKKyAgICBpbnQgICAgICAgICAgICAgY3VydGlsZW5vOworCisgICAgSnBlZzIwMDBUaWxlICAgICp0aWxlOworICAgIEpwZWcyMDAwRFNQQ29udGV4dCBkc3A7CisKKyAgICAvKm9wdGlvbnMgcGFyYW1ldGVycyovCisgICAgaW50ICAgICAgICAgICAgIHJlZHVjdGlvbl9mYWN0b3I7Cit9IEpwZWcyMDAwRGVjb2RlckNvbnRleHQ7CisKKy8qIGdldF9iaXRzIGZ1bmN0aW9ucyBmb3IgSlBFRzIwMDAgcGFja2V0IGJpdHN0cmVhbQorICogSXQgaXMgYSBnZXRfYml0IGZ1bmN0aW9uIHdpdGggYSBiaXQtc3R1ZmZpbmcgcm91dGluZS4gSWYgdGhlIHZhbHVlIG9mIHRoZQorICogYnl0ZSBpcyAweEZGLCB0aGUgbmV4dCBieXRlIGluY2x1ZGVzIGFuIGV4dHJhIHplcm8gYml0IHN0dWZmZWQgaW50byB0aGUgTVNCLgorICogY2YuIElTTy0xNTQ0NC0xOjIwMDIgLyBCLjEwLjEgQml0LXN0dWZmaW5nIHJvdXRpbmUgKi8KK3N0YXRpYyBpbnQgZ2V0X2JpdHMoSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcywgaW50IG4pCit7CisgICAgaW50IHJlcyA9IDA7CisKKyAgICB3aGlsZSAoLS1uID49IDApIHsKKyAgICAgICAgcmVzIDw8PSAxOworICAgICAgICBpZiAocy0+Yml0X2luZGV4ID09IDApIHsKKyAgICAgICAgICAgIHMtPmJpdF9pbmRleCA9IDcgKyAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpICE9IDB4RkZ1KTsKKyAgICAgICAgfQorICAgICAgICBzLT5iaXRfaW5kZXgtLTsKKyAgICAgICAgcmVzIHw9IChieXRlc3RyZWFtMl9wZWVrX2J5dGUoJnMtPmcpID4+IHMtPmJpdF9pbmRleCkgJiAxOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBqcGVnMjAwMF9mbHVzaChKcGVnMjAwMERlY29kZXJDb250ZXh0ICpzKQoreworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+ZykgPT0gMHhmZikKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+ZywgMSk7CisgICAgcy0+Yml0X2luZGV4ID0gODsKK30KKworLyogZGVjb2RlIHRoZSB2YWx1ZSBzdG9yZWQgaW4gbm9kZSAqLworc3RhdGljIGludCB0YWdfdHJlZV9kZWNvZGUoSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcywgSnBlZzIwMDBUZ3ROb2RlICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaG9sZCkKK3sKKyAgICBKcGVnMjAwMFRndE5vZGUgKnN0YWNrWzMwXTsKKyAgICBpbnQgc3AgPSAtMSwgY3VydmFsID0gMDsKKworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB3aGlsZSAobm9kZSAmJiAhbm9kZS0+dmlzKSB7CisgICAgICAgIHN0YWNrWysrc3BdID0gbm9kZTsKKyAgICAgICAgbm9kZSAgICAgICAgPSBub2RlLT5wYXJlbnQ7CisgICAgfQorCisgICAgaWYgKG5vZGUpCisgICAgICAgIGN1cnZhbCA9IG5vZGUtPnZhbDsKKyAgICBlbHNlCisgICAgICAgIGN1cnZhbCA9IHN0YWNrW3NwXS0+dmFsOworCisgICAgd2hpbGUgKGN1cnZhbCA8IHRocmVzaG9sZCAmJiBzcCA+PSAwKSB7CisgICAgICAgIGlmIChjdXJ2YWwgPCBzdGFja1tzcF0tPnZhbCkKKyAgICAgICAgICAgIGN1cnZhbCA9IHN0YWNrW3NwXS0+dmFsOworICAgICAgICB3aGlsZSAoY3VydmFsIDwgdGhyZXNob2xkKSB7CisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgaWYgKChyZXQgPSBnZXRfYml0cyhzLCAxKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgc3RhY2tbc3BdLT52aXMrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJldCkKKyAgICAgICAgICAgICAgICBjdXJ2YWwrKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHN0YWNrW3NwXS0+dmFsID0gY3VydmFsOworICAgICAgICBzcC0tOworICAgIH0KKyAgICByZXR1cm4gY3VydmFsOworfQorCitzdGF0aWMgaW50IHBpeF9mbXRfbWF0Y2goZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCBjb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicGMsIHVpbnQzMl90IGxvZzJfY2hyb21hX3doLCBpbnQgcGFsOCkKK3sKKyAgICBpbnQgbWF0Y2ggPSAxOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4X2ZtdCk7CisKKyAgICBpZiAoZGVzYy0+bmJfY29tcG9uZW50cyAhPSBjb21wb25lbnRzKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN3aXRjaCAoY29tcG9uZW50cykgeworICAgIGNhc2UgNDoKKyAgICAgICAgbWF0Y2ggPSBtYXRjaCAmJiBkZXNjLT5jb21wWzNdLmRlcHRoX21pbnVzMSArIDEgPj0gYnBjICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvZzJfY2hyb21hX3doID4+IDE0ICYgMykgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2cyX2Nocm9tYV93aCA+PiAxMiAmIDMpID09IDA7CisgICAgY2FzZSAzOgorICAgICAgICBtYXRjaCA9IG1hdGNoICYmIGRlc2MtPmNvbXBbMl0uZGVwdGhfbWludXMxICsgMSA+PSBicGMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAobG9nMl9jaHJvbWFfd2ggPj4gMTAgJiAzKSA9PSBkZXNjLT5sb2cyX2Nocm9tYV93ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvZzJfY2hyb21hX3doID4+ICA4ICYgMykgPT0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICBjYXNlIDI6CisgICAgICAgIG1hdGNoID0gbWF0Y2ggJiYgZGVzYy0+Y29tcFsxXS5kZXB0aF9taW51czEgKyAxID49IGJwYyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2cyX2Nocm9tYV93aCA+PiAgNiAmIDMpID09IGRlc2MtPmxvZzJfY2hyb21hX3cgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAobG9nMl9jaHJvbWFfd2ggPj4gIDQgJiAzKSA9PSBkZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgY2FzZSAxOgorICAgICAgICBtYXRjaCA9IG1hdGNoICYmIGRlc2MtPmNvbXBbMF0uZGVwdGhfbWludXMxICsgMSA+PSBicGMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAobG9nMl9jaHJvbWFfd2ggPj4gIDIgJiAzKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvZzJfY2hyb21hX3doICAgICAgICYgMykgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwpID09IHBhbDggKiBBVl9QSVhfRk1UX0ZMQUdfUEFMOworICAgIH0KKyAgICByZXR1cm4gbWF0Y2g7Cit9CisKKy8vIHBpeF9mbXRzIHdpdGggbG93ZXIgYnBwIGhhdmUgdG8gYmUgbGlzdGVkIGJlZm9yZQorLy8gc2ltaWxhciBwaXhfZm10cyB3aXRoIGhpZ2hlciBicHAuCisjZGVmaW5lIFJHQl9QSVhFTF9GT1JNQVRTICAgQVZfUElYX0ZNVF9QQUw4LEFWX1BJWF9GTVRfUkdCMjQsQVZfUElYX0ZNVF9SR0JBLEFWX1BJWF9GTVRfUkdCNDgsQVZfUElYX0ZNVF9SR0JBNjQKKyNkZWZpbmUgR1JBWV9QSVhFTF9GT1JNQVRTICBBVl9QSVhfRk1UX0dSQVk4LEFWX1BJWF9GTVRfR1JBWThBLEFWX1BJWF9GTVRfR1JBWTE2CisjZGVmaW5lIFlVVl9QSVhFTF9GT1JNQVRTICAgQVZfUElYX0ZNVF9ZVVY0MTBQLEFWX1BJWF9GTVRfWVVWNDExUCxBVl9QSVhfRk1UX1lVVkE0MjBQLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLEFWX1BJWF9GTVRfWVVWNDIyUCxBVl9QSVhfRk1UX1lVVkE0MjJQLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLEFWX1BJWF9GTVRfWVVWNDQ0UCxBVl9QSVhfRk1UX1lVVkE0NDRQLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSxBVl9QSVhfRk1UX1lVVjQyMlA5LEFWX1BJWF9GTVRfWVVWNDQ0UDksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQOSxBVl9QSVhfRk1UX1lVVkE0MjJQOSxBVl9QSVhfRk1UX1lVVkE0NDRQOSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLEFWX1BJWF9GTVRfWVVWNDIyUDEwLEFWX1BJWF9GTVRfWVVWNDQ0UDEwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwLEFWX1BJWF9GTVRfWVVWQTQyMlAxMCxBVl9QSVhfRk1UX1lVVkE0NDRQMTAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMixBVl9QSVhfRk1UX1lVVjQyMlAxMixBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE0LEFWX1BJWF9GTVRfWVVWNDIyUDE0LEFWX1BJWF9GTVRfWVVWNDQ0UDE0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsQVZfUElYX0ZNVF9ZVVY0MjJQMTYsQVZfUElYX0ZNVF9ZVVY0NDRQMTYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQMTYsQVZfUElYX0ZNVF9ZVVZBNDIyUDE2LEFWX1BJWF9GTVRfWVVWQTQ0NFAxNgorI2RlZmluZSBYWVpfUElYRUxfRk9STUFUUyAgIEFWX1BJWF9GTVRfWFlaMTIKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCByZ2JfcGl4X2ZtdHNbXSAgPSB7UkdCX1BJWEVMX0ZPUk1BVFN9Oworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBncmF5X3BpeF9mbXRzW10gPSB7R1JBWV9QSVhFTF9GT1JNQVRTfTsKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgeXV2X3BpeF9mbXRzW10gID0ge1lVVl9QSVhFTF9GT1JNQVRTfTsKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgeHl6X3BpeF9mbXRzW10gID0ge1hZWl9QSVhFTF9GT1JNQVRTfTsKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgYWxsX3BpeF9mbXRzW10gID0ge1JHQl9QSVhFTF9GT1JNQVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBWV9QSVhFTF9GT1JNQVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWX1BJWEVMX0ZPUk1BVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWVpfUElYRUxfRk9STUFUU307CisKKy8qIG1hcmtlciBzZWdtZW50cyAqLworLyogZ2V0IHNpemVzIGFuZCBvZmZzZXRzIG9mIGltYWdlLCB0aWxlczsgbnVtYmVyIG9mIGNvbXBvbmVudHMgKi8KK3N0YXRpYyBpbnQgZ2V0X3NpeihKcGVnMjAwMERlY29kZXJDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIGludCBuY29tcG9uZW50czsKKyAgICB1aW50MzJfdCBsb2cyX2Nocm9tYV93aCA9IDA7CisgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpwb3NzaWJsZV9mbXRzID0gTlVMTDsKKyAgICBpbnQgcG9zc2libGVfZm10c19uYiA9IDA7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpIDwgMzYpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcy0+YXZjdHgtPnByb2ZpbGUgPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJnMtPmcpOyAvLyBSc2l6CisgICAgcy0+d2lkdGggICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJnMtPmcpOyAvLyBXaWR0aAorICAgIHMtPmhlaWdodCAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZzLT5nKTsgLy8gSGVpZ2h0CisgICAgcy0+aW1hZ2Vfb2Zmc2V0X3ggPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJnMtPmcpOyAvLyBYMFNpegorICAgIHMtPmltYWdlX29mZnNldF95ID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZzLT5nKTsgLy8gWTBTaXoKKyAgICBzLT50aWxlX3dpZHRoICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmcy0+Zyk7IC8vIFhUU2l6CisgICAgcy0+dGlsZV9oZWlnaHQgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJnMtPmcpOyAvLyBZVFNpegorICAgIHMtPnRpbGVfb2Zmc2V0X3ggID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZzLT5nKTsgLy8gWFQwU2l6CisgICAgcy0+dGlsZV9vZmZzZXRfeSAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJnMtPmcpOyAvLyBZVDBTaXoKKyAgICBuY29tcG9uZW50cyAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmcy0+Zyk7IC8vIENTaXoKKworICAgIGlmIChzLT5pbWFnZV9vZmZzZXRfeCB8fCBzLT5pbWFnZV9vZmZzZXRfeSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJTdXBwb3J0IGZvciBpbWFnZSBvZmZzZXRzIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAobmNvbXBvbmVudHMgPD0gMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbnVtYmVyIG9mIGNvbXBvbmVudHM6ICVkXG4iLAorICAgICAgICAgICAgICAgcy0+bmNvbXBvbmVudHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAobmNvbXBvbmVudHMgPiA0KSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIlN1cHBvcnQgZm9yICVkIGNvbXBvbmVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmNvbXBvbmVudHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgcy0+bmNvbXBvbmVudHMgPSBuY29tcG9uZW50czsKKworICAgIGlmIChzLT50aWxlX3dpZHRoIDw9IDAgfHwgcy0+dGlsZV9oZWlnaHQgPD0gMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdGlsZSBkaW1lbnNpb24gJWR4JWQuXG4iLAorICAgICAgICAgICAgICAgcy0+dGlsZV93aWR0aCwgcy0+dGlsZV9oZWlnaHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpIDwgMyAqIHMtPm5jb21wb25lbnRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uY29tcG9uZW50czsgaSsrKSB7IC8vIFNzaXpfaSBYUnNpel9pLCBZUnNpel9pCisgICAgICAgIHVpbnQ4X3QgeCAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Zyk7CisgICAgICAgIHMtPmNicHNbaV0gICA9ICh4ICYgMHg3ZikgKyAxOworICAgICAgICBzLT5wcmVjaXNpb24gPSBGRk1BWChzLT5jYnBzW2ldLCBzLT5wcmVjaXNpb24pOworICAgICAgICBzLT5zZ25kW2ldICAgPSAhISh4ICYgMHg4MCk7CisgICAgICAgIHMtPmNkeFtpXSAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Zyk7CisgICAgICAgIHMtPmNkeVtpXSAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Zyk7CisgICAgICAgIGlmICggICAhcy0+Y2R4W2ldIHx8IHMtPmNkeFtpXSA9PSAzIHx8IHMtPmNkeFtpXSA+IDQKKyAgICAgICAgICAgIHx8ICFzLT5jZHlbaV0gfHwgcy0+Y2R5W2ldID09IDMgfHwgcy0+Y2R5W2ldID4gNCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSBzZXBhcmF0aW9uICVkLyVkXG4iLCBzLT5jZHhbaV0sIHMtPmNkeVtpXSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBsb2cyX2Nocm9tYV93aCB8PSBzLT5jZHlbaV0gPj4gMSA8PCBpICogNCB8IHMtPmNkeFtpXSA+PiAxIDw8IGkgKiA0ICsgMjsKKyAgICB9CisKKyAgICBzLT5udW1YdGlsZXMgPSBmZl9qcGVnMjAwMF9jZWlsZGl2KHMtPndpZHRoICAtIHMtPnRpbGVfb2Zmc2V0X3gsIHMtPnRpbGVfd2lkdGgpOworICAgIHMtPm51bVl0aWxlcyA9IGZmX2pwZWcyMDAwX2NlaWxkaXYocy0+aGVpZ2h0IC0gcy0+dGlsZV9vZmZzZXRfeSwgcy0+dGlsZV9oZWlnaHQpOworCisgICAgaWYgKHMtPm51bVh0aWxlcyAqICh1aW50NjRfdClzLT5udW1ZdGlsZXMgPiBJTlRfTUFYL3NpemVvZigqcy0+dGlsZSkpIHsKKyAgICAgICAgcy0+bnVtWHRpbGVzID0gcy0+bnVtWXRpbGVzID0gMDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzLT50aWxlID0gYXZfbWFsbG9jel9hcnJheShzLT5udW1YdGlsZXMgKiBzLT5udW1ZdGlsZXMsIHNpemVvZigqcy0+dGlsZSkpOworICAgIGlmICghcy0+dGlsZSkgeworICAgICAgICBzLT5udW1YdGlsZXMgPSBzLT5udW1ZdGlsZXMgPSAwOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1YdGlsZXMgKiBzLT5udW1ZdGlsZXM7IGkrKykgeworICAgICAgICBKcGVnMjAwMFRpbGUgKnRpbGUgPSBzLT50aWxlICsgaTsKKworICAgICAgICB0aWxlLT5jb21wID0gYXZfbWFsbG9jeihzLT5uY29tcG9uZW50cyAqIHNpemVvZigqdGlsZS0+Y29tcCkpOworICAgICAgICBpZiAoIXRpbGUtPmNvbXApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgaW1hZ2Ugc2l6ZSB3aXRoIHJlZHVjdGlvbiBmYWN0b3IgKi8KKyAgICBzLT5hdmN0eC0+d2lkdGggID0gZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIocy0+d2lkdGggIC0gcy0+aW1hZ2Vfb2Zmc2V0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlZHVjdGlvbl9mYWN0b3IpOworICAgIHMtPmF2Y3R4LT5oZWlnaHQgPSBmZl9qcGVnMjAwMF9jZWlsZGl2cG93MihzLT5oZWlnaHQgLSBzLT5pbWFnZV9vZmZzZXRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVkdWN0aW9uX2ZhY3Rvcik7CisKKyAgICBpZiAocy0+YXZjdHgtPnByb2ZpbGUgPT0gRkZfUFJPRklMRV9KUEVHMjAwMF9EQ0lORU1BXzJLIHx8CisgICAgICAgIHMtPmF2Y3R4LT5wcm9maWxlID09IEZGX1BST0ZJTEVfSlBFRzIwMDBfRENJTkVNQV80SykgeworICAgICAgICBwb3NzaWJsZV9mbXRzID0geHl6X3BpeF9mbXRzOworICAgICAgICBwb3NzaWJsZV9mbXRzX25iID0gRkZfQVJSQVlfRUxFTVMoeHl6X3BpeF9mbXRzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKHMtPmNvbG91cl9zcGFjZSkgeworICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgcG9zc2libGVfZm10cyA9IHJnYl9waXhfZm10czsKKyAgICAgICAgICAgIHBvc3NpYmxlX2ZtdHNfbmIgPSBGRl9BUlJBWV9FTEVNUyhyZ2JfcGl4X2ZtdHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICBwb3NzaWJsZV9mbXRzID0gZ3JheV9waXhfZm10czsKKyAgICAgICAgICAgIHBvc3NpYmxlX2ZtdHNfbmIgPSBGRl9BUlJBWV9FTEVNUyhncmF5X3BpeF9mbXRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgcG9zc2libGVfZm10cyA9IHl1dl9waXhfZm10czsKKyAgICAgICAgICAgIHBvc3NpYmxlX2ZtdHNfbmIgPSBGRl9BUlJBWV9FTEVNUyh5dXZfcGl4X2ZtdHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwb3NzaWJsZV9mbXRzID0gYWxsX3BpeF9mbXRzOworICAgICAgICAgICAgcG9zc2libGVfZm10c19uYiA9IEZGX0FSUkFZX0VMRU1TKGFsbF9waXhfZm10cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcG9zc2libGVfZm10c19uYjsgKytpKSB7CisgICAgICAgIGlmIChwaXhfZm10X21hdGNoKHBvc3NpYmxlX2ZtdHNbaV0sIG5jb21wb25lbnRzLCBzLT5wcmVjaXNpb24sIGxvZzJfY2hyb21hX3doLCBzLT5wYWw4KSkgeworICAgICAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBwb3NzaWJsZV9mbXRzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPT0gcG9zc2libGVfZm10c19uYikgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbmtub3duIHBpeF9mbXQsIHByb2ZpbGU6ICVkLCBjb2xvdXJfc3BhY2U6ICVkLCAiCisgICAgICAgICAgICAgICAiY29tcG9uZW50czogJWQsIHByZWNpc2lvbjogJWQsICIKKyAgICAgICAgICAgICAgICJjZHhbMV06ICVkLCBjZHlbMV06ICVkLCBjZHhbMl06ICVkLCBjZHlbMl06ICVkXG4iLAorICAgICAgICAgICAgICAgcy0+YXZjdHgtPnByb2ZpbGUsIHMtPmNvbG91cl9zcGFjZSwgbmNvbXBvbmVudHMsIHMtPnByZWNpc2lvbiwKKyAgICAgICAgICAgICAgIG5jb21wb25lbnRzID4gMiA/IHMtPmNkeFsxXSA6IDAsCisgICAgICAgICAgICAgICBuY29tcG9uZW50cyA+IDIgPyBzLT5jZHlbMV0gOiAwLAorICAgICAgICAgICAgICAgbmNvbXBvbmVudHMgPiAyID8gcy0+Y2R4WzJdIDogMCwKKyAgICAgICAgICAgICAgIG5jb21wb25lbnRzID4gMiA/IHMtPmNkeVsyXSA6IDApOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gcy0+cHJlY2lzaW9uOworICAgIHJldHVybiAwOworfQorCisvKiBnZXQgY29tbW9uIHBhcnQgZm9yIENPRCBhbmQgQ09DIHNlZ21lbnRzICovCitzdGF0aWMgaW50IGdldF9jb3goSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcywgSnBlZzIwMDBDb2RpbmdTdHlsZSAqYykKK3sKKyAgICB1aW50OF90IGJ5dGU7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpIDwgNSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiAgbnJlc2xldmVscyA9IG51bWJlciBvZiByZXNvbHV0aW9uIGxldmVscworICAgICAgICAgICAgICAgICAgID0gbnVtYmVyIG9mIGRlY29tcG9zaXRpb24gbGV2ZWwgKzEgKi8KKyAgICBjLT5ucmVzbGV2ZWxzID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKSArIDE7CisgICAgaWYgKGMtPm5yZXNsZXZlbHMgPj0gSlBFRzIwMDBfTUFYX1JFU0xFVkVMUykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm5yZXNsZXZlbHMgJWQgaXMgaW52YWxpZFxuIiwgYy0+bnJlc2xldmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChjLT5ucmVzbGV2ZWxzIDw9IHMtPnJlZHVjdGlvbl9mYWN0b3IpIHsKKyAgICAgICAgLyogd2UgYXJlIGZvcmNlZCB0byB1cGRhdGUgcmVkdWN0aW9uX2ZhY3RvciBhcyBpdHMgcmVxdWVzdGVkIHZhbHVlIGlzCisgICAgICAgICAgIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyBiaXRzdHJlYW0sIGFuZCBhcyB3ZSBtaWdodCBoYXZlIHVzZWQgaXQKKyAgICAgICAgICAgYWxyZWFkeSBpbiBzZXR1cCBlYXJsaWVyIHdlIGhhdmUgdG8gZmFpbCB0aGlzIGZyYW1lIHVudGlsCisgICAgICAgICAgIHJlaW5pdGlhbGl6YXRpb24gaXMgaW1wbGVtZW50ZWQgKi8KKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZWR1Y3Rpb25fZmFjdG9yIHRvbyBsYXJnZSBmb3IgdGhpcyBiaXRzdHJlYW0sIG1heCBpcyAlZFxuIiwgYy0+bnJlc2xldmVscyAtIDEpOworICAgICAgICBzLT5yZWR1Y3Rpb25fZmFjdG9yID0gYy0+bnJlc2xldmVscyAtIDE7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogY29tcHV0ZSBudW1iZXIgb2YgcmVzb2x1dGlvbiBsZXZlbHMgdG8gZGVjb2RlICovCisgICAgYy0+bnJlc2xldmVsczJkZWNvZGUgPSBjLT5ucmVzbGV2ZWxzIC0gcy0+cmVkdWN0aW9uX2ZhY3RvcjsKKworICAgIGMtPmxvZzJfY2Jsa193aWR0aCAgPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKSAmIDE1KSArIDI7IC8vIGNibGsgd2lkdGgKKyAgICBjLT5sb2cyX2NibGtfaGVpZ2h0ID0gKGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+ZykgJiAxNSkgKyAyOyAvLyBjYmxrIGhlaWdodAorCisgICAgaWYgKGMtPmxvZzJfY2Jsa193aWR0aCA+IDEwIHx8IGMtPmxvZzJfY2Jsa19oZWlnaHQgPiAxMCB8fAorICAgICAgICBjLT5sb2cyX2NibGtfd2lkdGggKyBjLT5sb2cyX2NibGtfaGVpZ2h0ID4gMTIpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjYmxrIHNpemUgaW52YWxpZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChjLT5sb2cyX2NibGtfd2lkdGggPiA2IHx8IGMtPmxvZzJfY2Jsa19oZWlnaHQgPiA2KSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgImNibGsgc2l6ZSA+IDY0Iik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBjLT5jYmxrX3N0eWxlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKTsKKyAgICBpZiAoYy0+Y2Jsa19zdHlsZSAhPSAwKSB7IC8vIGNibGsgc3R5bGUKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgImV4dHJhIGNibGsgc3R5bGVzICVYXG4iLCBjLT5jYmxrX3N0eWxlKTsKKyAgICB9CisgICAgYy0+dHJhbnNmb3JtID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKTsgLy8gRFdUIHRyYW5zZm9ybWF0aW9uIHR5cGUKKyAgICAvKiBzZXQgaW50ZWdlciA5LzcgRFdUIGluIGNhc2Ugb2YgQklURVhBQ1QgZmxhZyAqLworICAgIGlmICgocy0+YXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCkgJiYgKGMtPnRyYW5zZm9ybSA9PSBGRl9EV1Q5NykpCisgICAgICAgIGMtPnRyYW5zZm9ybSA9IEZGX0RXVDk3X0lOVDsKKworICAgIGlmIChjLT5jc3R5ICYgSlBFRzIwMDBfQ1NUWV9QUkVDKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bnJlc2xldmVsczsgaSsrKSB7CisgICAgICAgICAgICBieXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpOworICAgICAgICAgICAgYy0+bG9nMl9wcmVjX3dpZHRoc1tpXSAgPSAgYnl0ZSAgICAgICAmIDB4MEY7ICAgIC8vIHByZWNpbmN0IFBQeAorICAgICAgICAgICAgYy0+bG9nMl9wcmVjX2hlaWdodHNbaV0gPSAoYnl0ZSA+PiA0KSAmIDB4MEY7ICAgIC8vIHByZWNpbmN0IFBQeQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KGMtPmxvZzJfcHJlY193aWR0aHMgLCAxNSwgc2l6ZW9mKGMtPmxvZzJfcHJlY193aWR0aHMgKSk7CisgICAgICAgIG1lbXNldChjLT5sb2cyX3ByZWNfaGVpZ2h0cywgMTUsIHNpemVvZihjLT5sb2cyX3ByZWNfaGVpZ2h0cykpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogZ2V0IGNvZGluZyBwYXJhbWV0ZXJzIGZvciBhIHBhcnRpY3VsYXIgdGlsZSBvciB3aG9sZSBpbWFnZSovCitzdGF0aWMgaW50IGdldF9jb2QoSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcywgSnBlZzIwMDBDb2RpbmdTdHlsZSAqYywKKyAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwcm9wZXJ0aWVzKQoreworICAgIEpwZWcyMDAwQ29kaW5nU3R5bGUgdG1wOworICAgIGludCBjb21wbm8sIHJldDsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPCA1KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHRtcC5jc3R5ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKTsKKworICAgIC8vIGdldCBwcm9ncmVzc2lvbiBvcmRlcgorICAgIHRtcC5wcm9nX29yZGVyID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKTsKKworICAgIHRtcC5ubGF5ZXJzICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZzLT5nKTsKKyAgICB0bXAubWN0ICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Zyk7IC8vIG11bHRpcGxlIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbgorCisgICAgaWYgKHRtcC5tY3QgJiYgcy0+bmNvbXBvbmVudHMgPCAzKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk1DVCAlIlBSSXU4IiB3aXRoIHRvbyBmZXcgY29tcG9uZW50cyAoJWQpXG4iLAorICAgICAgICAgICAgICAgdG1wLm1jdCwgcy0+bmNvbXBvbmVudHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGdldF9jb3gocywgJnRtcCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcy0+bmNvbXBvbmVudHM7IGNvbXBubysrKQorICAgICAgICBpZiAoIShwcm9wZXJ0aWVzW2NvbXBub10gJiBIQURfQ09DKSkKKyAgICAgICAgICAgIG1lbWNweShjICsgY29tcG5vLCAmdG1wLCBzaXplb2YodG1wKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEdldCBjb2RpbmcgcGFyYW1ldGVycyBmb3IgYSBjb21wb25lbnQgaW4gdGhlIHdob2xlIGltYWdlIG9yIGEKKyAqIHBhcnRpY3VsYXIgdGlsZS4gKi8KK3N0YXRpYyBpbnQgZ2V0X2NvYyhKcGVnMjAwMERlY29kZXJDb250ZXh0ICpzLCBKcGVnMjAwMENvZGluZ1N0eWxlICpjLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnByb3BlcnRpZXMpCit7CisgICAgaW50IGNvbXBubywgcmV0OworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSA8IDIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgY29tcG5vID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKTsKKworICAgIGlmIChjb21wbm8gPj0gcy0+bmNvbXBvbmVudHMpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBjb21wbm8gJWQuIFRoZXJlIGFyZSAlZCBjb21wb25lbnRzIGluIHRoZSBpbWFnZS5cbiIsCisgICAgICAgICAgICAgICBjb21wbm8sIHMtPm5jb21wb25lbnRzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYyAgICAgICs9IGNvbXBubzsKKyAgICBjLT5jc3R5ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKTsKKworICAgIGlmICgocmV0ID0gZ2V0X2NveChzLCBjKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcHJvcGVydGllc1tjb21wbm9dIHw9IEhBRF9DT0M7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEdldCBjb21tb24gcGFydCBmb3IgUUNEIGFuZCBRQ0Mgc2VnbWVudHMuICovCitzdGF0aWMgaW50IGdldF9xY3goSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcywgaW50IG4sIEpwZWcyMDAwUXVhbnRTdHlsZSAqcSkKK3sKKyAgICBpbnQgaSwgeDsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPCAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmcpOyAvLyBTcWNkCisKKyAgICBxLT5uZ3VhcmRiaXRzID0geCA+PiA1OworICAgIHEtPnF1YW50c3R5ICAgPSB4ICYgMHgxZjsKKworICAgIGlmIChxLT5xdWFudHN0eSA9PSBKUEVHMjAwMF9RU1RZX05PTkUpIHsKKyAgICAgICAgbiAtPSAzOworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpIDwgbiB8fAorICAgICAgICAgICAgbiA+IEpQRUcyMDAwX01BWF9ERUNMRVZFTFMqMykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgcS0+ZXhwbltpXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+ZykgPj4gMzsKKyAgICB9IGVsc2UgaWYgKHEtPnF1YW50c3R5ID09IEpQRUcyMDAwX1FTVFlfU0kpIHsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSA8IDIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgeCAgICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmcy0+Zyk7CisgICAgICAgIHEtPmV4cG5bMF0gPSB4ID4+IDExOworICAgICAgICBxLT5tYW50WzBdID0geCAmIDB4N2ZmOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgSlBFRzIwMDBfTUFYX0RFQ0xFVkVMUyAqIDM7IGkrKykgeworICAgICAgICAgICAgaW50IGN1cmV4cG4gPSBGRk1BWCgwLCBxLT5leHBuWzBdIC0gKGkgLSAxKSAvIDMpOworICAgICAgICAgICAgcS0+ZXhwbltpXSA9IGN1cmV4cG47CisgICAgICAgICAgICBxLT5tYW50W2ldID0gcS0+bWFudFswXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG4gPSAobiAtIDMpID4+IDE7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPCAyICogbiB8fAorICAgICAgICAgICAgbiA+IEpQRUcyMDAwX01BWF9ERUNMRVZFTFMqMykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB4ICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZzLT5nKTsKKyAgICAgICAgICAgIHEtPmV4cG5baV0gPSB4ID4+IDExOworICAgICAgICAgICAgcS0+bWFudFtpXSA9IHggJiAweDdmZjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogR2V0IHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIGZvciBhIHBhcnRpY3VsYXIgdGlsZSBvciBhIHdob2xlIGltYWdlLiAqLworc3RhdGljIGludCBnZXRfcWNkKEpwZWcyMDAwRGVjb2RlckNvbnRleHQgKnMsIGludCBuLCBKcGVnMjAwMFF1YW50U3R5bGUgKnEsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHJvcGVydGllcykKK3sKKyAgICBKcGVnMjAwMFF1YW50U3R5bGUgdG1wOworICAgIGludCBjb21wbm8sIHJldDsKKworICAgIG1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisKKyAgICBpZiAoKHJldCA9IGdldF9xY3gocywgbiwgJnRtcCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHMtPm5jb21wb25lbnRzOyBjb21wbm8rKykKKyAgICAgICAgaWYgKCEocHJvcGVydGllc1tjb21wbm9dICYgSEFEX1FDQykpCisgICAgICAgICAgICBtZW1jcHkocSArIGNvbXBubywgJnRtcCwgc2l6ZW9mKHRtcCkpOworICAgIHJldHVybiAwOworfQorCisvKiBHZXQgcXVhbnRpemF0aW9uIHBhcmFtZXRlcnMgZm9yIGEgY29tcG9uZW50IGluIHRoZSB3aG9sZSBpbWFnZQorICogb24gaW4gYSBwYXJ0aWN1bGFyIHRpbGUuICovCitzdGF0aWMgaW50IGdldF9xY2MoSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcywgaW50IG4sIEpwZWcyMDAwUXVhbnRTdHlsZSAqcSwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwcm9wZXJ0aWVzKQoreworICAgIGludCBjb21wbm87CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpIDwgMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBjb21wbm8gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmcpOworCisgICAgaWYgKGNvbXBubyA+PSBzLT5uY29tcG9uZW50cykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIGNvbXBubyAlZC4gVGhlcmUgYXJlICVkIGNvbXBvbmVudHMgaW4gdGhlIGltYWdlLlxuIiwKKyAgICAgICAgICAgICAgIGNvbXBubywgcy0+bmNvbXBvbmVudHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBwcm9wZXJ0aWVzW2NvbXBub10gfD0gSEFEX1FDQzsKKyAgICByZXR1cm4gZ2V0X3FjeChzLCBuIC0gMSwgcSArIGNvbXBubyk7Cit9CisKKy8qIEdldCBzdGFydCBvZiB0aWxlIHNlZ21lbnQuICovCitzdGF0aWMgaW50IGdldF9zb3QoSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcywgaW50IG4pCit7CisgICAgSnBlZzIwMDBUaWxlUGFydCAqdHA7CisgICAgdWludDE2X3QgSXNvdDsKKyAgICB1aW50MzJfdCBQc290OworICAgIHVpbnQ4X3QgVFBzb3Q7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpIDwgOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzLT5jdXJ0aWxlbm8gPSAwOworICAgIElzb3QgPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJnMtPmcpOyAgICAgICAgLy8gSXNvdAorICAgIGlmIChJc290ID49IHMtPm51bVh0aWxlcyAqIHMtPm51bVl0aWxlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzLT5jdXJ0aWxlbm8gPSBJc290OworICAgIFBzb3QgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZzLT5nKTsgICAgICAgLy8gUHNvdAorICAgIFRQc290ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKTsgICAgICAgLy8gVFBzb3QKKworICAgIC8qIFJlYWQgVE5Tb3QgYnV0IG5vdCB1c2VkICovCisgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKTsgICAgICAgICAgICAgICAvLyBUTnNvdAorCisgICAgaWYgKFBzb3QgPiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgKyBuICsgMikgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlBzb3QgJSJQUkl1MzIiIHRvbyBiaWdcbiIsIFBzb3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoVFBzb3QgPj0gRkZfQVJSQVlfRUxFTVMocy0+dGlsZVtJc290XS50aWxlX3BhcnQpKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIlN1cHBvcnQgZm9yICUiUFJJdTgiIGNvbXBvbmVudHMiLCBUUHNvdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBzLT50aWxlW0lzb3RdLnRwX2lkeCA9IFRQc290OworICAgIHRwICAgICAgICAgICAgID0gcy0+dGlsZVtJc290XS50aWxlX3BhcnQgKyBUUHNvdDsKKyAgICB0cC0+dGlsZV9pbmRleCA9IElzb3Q7CisgICAgdHAtPnRwX2VuZCAgICAgPSBzLT5nLmJ1ZmZlciArIFBzb3QgLSBuIC0gMjsKKworICAgIGlmICghVFBzb3QpIHsKKyAgICAgICAgSnBlZzIwMDBUaWxlICp0aWxlID0gcy0+dGlsZSArIHMtPmN1cnRpbGVubzsKKworICAgICAgICAvKiBjb3B5IGRlZmF1bHRzICovCisgICAgICAgIG1lbWNweSh0aWxlLT5jb2RzdHksIHMtPmNvZHN0eSwgcy0+bmNvbXBvbmVudHMgKiBzaXplb2YoSnBlZzIwMDBDb2RpbmdTdHlsZSkpOworICAgICAgICBtZW1jcHkodGlsZS0+cW50c3R5LCBzLT5xbnRzdHksIHMtPm5jb21wb25lbnRzICogc2l6ZW9mKEpwZWcyMDAwUXVhbnRTdHlsZSkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiBUaWxlLXBhcnQgbGVuZ3Roczogc2VlIElTTyAxNTQ0NC0xOjIwMDIsIHNlY3Rpb24gQS43LjEKKyAqIFVzZWQgdG8ga25vdyB0aGUgbnVtYmVyIG9mIHRpbGUgcGFydHMgYW5kIGxlbmd0aHMuCisgKiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgVExNcyBpbiB0aGUgaGVhZGVyLgorICogVE9ETzogVGhlIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGZvciB0aWxlLXBhcnRzIG1hbmFnZW1lbnQsIG5vciBhbnl3aGVyZSBlbHNlLgorICogSXQgY2FuIGJlIHVzZWZ1bCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRpbGUgcGFydHMsIGJlZm9yZSBtYW5hZ2luZyB0aGUgU09UCisgKiBtYXJrZXJzLiBQYXJzaW5nIHRoZSBUTE0gaGVhZGVyIGlzIG5lZWRlZCB0byBpbmNyZW1lbnQgdGhlIGlucHV0IGhlYWRlcgorICogYnVmZmVyLgorICogVGhpcyBtYXJrZXIgaXMgbWFuZGF0b3J5IGZvciBEQ0kuICovCitzdGF0aWMgdWludDhfdCBnZXRfdGxtKEpwZWcyMDAwRGVjb2RlckNvbnRleHQgKnMsIGludCBuKQoreworICAgIHVpbnQ4X3QgU3RsbSwgU1QsIFNQLCB0aWxlX3RsbSwgaTsKKyAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7ICAgICAgICAgICAgICAgLyogWnRsbTogc2tpcHBlZCAqLworICAgIFN0bG0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7CisKKyAgICAvLyB0b28gY29tcGxleCA/IFNUID0gKChTdGxtID4+IDQpICYgMHgwMSkgKyAoKFN0bG0gPj4gNCkgJiAweDAyKTsKKyAgICBTVCA9IChTdGxtID4+IDQpICYgMHgwMzsKKyAgICAvLyBUT0RPOiBNYW5hZ2UgY2FzZSBvZiBTVCA9IDBiMTEgLS0+IHJhaXNlIGVycm9yCisgICAgU1AgICAgICAgPSAoU3RsbSA+PiA2KSAmIDB4MDE7CisgICAgdGlsZV90bG0gPSAobiAtIDQpIC8gKChTUCArIDEpICogMiArIFNUKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZV90bG07IGkrKykgeworICAgICAgICBzd2l0Y2ggKFNUKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJnMtPmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChTUCA9PSAwKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYmUxNigmcy0+Zyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Zyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF90aWxlKEpwZWcyMDAwRGVjb2RlckNvbnRleHQgKnMsIGludCB0aWxlbm8pCit7CisgICAgaW50IGNvbXBubzsKKyAgICBpbnQgdGlsZXggPSB0aWxlbm8gJSBzLT5udW1YdGlsZXM7CisgICAgaW50IHRpbGV5ID0gdGlsZW5vIC8gcy0+bnVtWHRpbGVzOworICAgIEpwZWcyMDAwVGlsZSAqdGlsZSA9IHMtPnRpbGUgKyB0aWxlbm87CisKKyAgICBpZiAoIXRpbGUtPmNvbXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHMtPm5jb21wb25lbnRzOyBjb21wbm8rKykgeworICAgICAgICBKcGVnMjAwMENvbXBvbmVudCAqY29tcCA9IHRpbGUtPmNvbXAgKyBjb21wbm87CisgICAgICAgIEpwZWcyMDAwQ29kaW5nU3R5bGUgKmNvZHN0eSA9IHRpbGUtPmNvZHN0eSArIGNvbXBubzsKKyAgICAgICAgSnBlZzIwMDBRdWFudFN0eWxlICAqcW50c3R5ID0gdGlsZS0+cW50c3R5ICsgY29tcG5vOworICAgICAgICBpbnQgcmV0OyAvLyBnbG9iYWwgYmFuZG5vCisKKyAgICAgICAgY29tcC0+Y29vcmRfb1swXVswXSA9IEZGTUFYKHRpbGV4ICAgICAgICogcy0+dGlsZV93aWR0aCAgKyBzLT50aWxlX29mZnNldF94LCBzLT5pbWFnZV9vZmZzZXRfeCk7CisgICAgICAgIGNvbXAtPmNvb3JkX29bMF1bMV0gPSBGRk1JTigodGlsZXggKyAxKSAqIHMtPnRpbGVfd2lkdGggICsgcy0+dGlsZV9vZmZzZXRfeCwgcy0+d2lkdGgpOworICAgICAgICBjb21wLT5jb29yZF9vWzFdWzBdID0gRkZNQVgodGlsZXkgICAgICAgKiBzLT50aWxlX2hlaWdodCArIHMtPnRpbGVfb2Zmc2V0X3ksIHMtPmltYWdlX29mZnNldF95KTsKKyAgICAgICAgY29tcC0+Y29vcmRfb1sxXVsxXSA9IEZGTUlOKCh0aWxleSArIDEpICogcy0+dGlsZV9oZWlnaHQgKyBzLT50aWxlX29mZnNldF95LCBzLT5oZWlnaHQpOworCisgICAgICAgIGNvbXAtPmNvb3JkWzBdWzBdID0gZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIoY29tcC0+Y29vcmRfb1swXVswXSwgcy0+cmVkdWN0aW9uX2ZhY3Rvcik7CisgICAgICAgIGNvbXAtPmNvb3JkWzBdWzFdID0gZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIoY29tcC0+Y29vcmRfb1swXVsxXSwgcy0+cmVkdWN0aW9uX2ZhY3Rvcik7CisgICAgICAgIGNvbXAtPmNvb3JkWzFdWzBdID0gZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIoY29tcC0+Y29vcmRfb1sxXVswXSwgcy0+cmVkdWN0aW9uX2ZhY3Rvcik7CisgICAgICAgIGNvbXAtPmNvb3JkWzFdWzFdID0gZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIoY29tcC0+Y29vcmRfb1sxXVsxXSwgcy0+cmVkdWN0aW9uX2ZhY3Rvcik7CisKKyAgICAgICAgaWYgKHJldCA9IGZmX2pwZWcyMDAwX2luaXRfY29tcG9uZW50KGNvbXAsIGNvZHN0eSwgcW50c3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2Jwc1tjb21wbm9dLCBzLT5jZHhbY29tcG5vXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNkeVtjb21wbm9dLCBzLT5hdmN0eCkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogUmVhZCB0aGUgbnVtYmVyIG9mIGNvZGluZyBwYXNzZXMuICovCitzdGF0aWMgaW50IGdldG5wYXNzZXMoSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcykKK3sKKyAgICBpbnQgbnVtOworICAgIGlmICghZ2V0X2JpdHMocywgMSkpCisgICAgICAgIHJldHVybiAxOworICAgIGlmICghZ2V0X2JpdHMocywgMSkpCisgICAgICAgIHJldHVybiAyOworICAgIGlmICgobnVtID0gZ2V0X2JpdHMocywgMikpICE9IDMpCisgICAgICAgIHJldHVybiBudW0gPCAwID8gbnVtIDogMyArIG51bTsKKyAgICBpZiAoKG51bSA9IGdldF9iaXRzKHMsIDUpKSAhPSAzMSkKKyAgICAgICAgcmV0dXJuIG51bSA8IDAgPyBudW0gOiA2ICsgbnVtOworICAgIG51bSA9IGdldF9iaXRzKHMsIDcpOworICAgIHJldHVybiBudW0gPCAwID8gbnVtIDogMzcgKyBudW07Cit9CisKK3N0YXRpYyBpbnQgZ2V0bGJsb2NraW5jKEpwZWcyMDAwRGVjb2RlckNvbnRleHQgKnMpCit7CisgICAgaW50IHJlcyA9IDAsIHJldDsKKyAgICB3aGlsZSAocmV0ID0gZ2V0X2JpdHMocywgMSkpIHsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXMrKzsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBqcGVnMjAwMF9kZWNvZGVfcGFja2V0KEpwZWcyMDAwRGVjb2RlckNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBlZzIwMDBDb2RpbmdTdHlsZSAqY29kc3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwZWcyMDAwUmVzTGV2ZWwgKnJsZXZlbCwgaW50IHByZWNubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGF5bm8sIHVpbnQ4X3QgKmV4cG4sIGludCBudW1nYml0cykKK3sKKyAgICBpbnQgYmFuZG5vLCBjYmxrbm8sIHJldCwgbmJfY29kZV9ibG9ja3M7CisKKyAgICBpZiAoIShyZXQgPSBnZXRfYml0cyhzLCAxKSkpIHsKKyAgICAgICAganBlZzIwMDBfZmx1c2gocyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmxldmVsLT5uYmFuZHM7IGJhbmRubysrKSB7CisgICAgICAgIEpwZWcyMDAwQmFuZCAqYmFuZCA9IHJsZXZlbC0+YmFuZCArIGJhbmRubzsKKyAgICAgICAgSnBlZzIwMDBQcmVjICpwcmVjID0gYmFuZC0+cHJlYyArIHByZWNubzsKKworICAgICAgICBpZiAoYmFuZC0+Y29vcmRbMF1bMF0gPT0gYmFuZC0+Y29vcmRbMF1bMV0gfHwKKyAgICAgICAgICAgIGJhbmQtPmNvb3JkWzFdWzBdID09IGJhbmQtPmNvb3JkWzFdWzFdKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIG5iX2NvZGVfYmxvY2tzID0gIHByZWMtPm5iX2NvZGVibG9ja3NfaGVpZ2h0ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYy0+bmJfY29kZWJsb2Nrc193aWR0aDsKKyAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBuYl9jb2RlX2Jsb2NrczsgY2Jsa25vKyspIHsKKyAgICAgICAgICAgIEpwZWcyMDAwQ2JsayAqY2JsayA9IHByZWMtPmNibGsgKyBjYmxrbm87CisgICAgICAgICAgICBpbnQgaW5jbCwgbmV3cGFzc2VzLCBsbGVuOworCisgICAgICAgICAgICBpZiAoY2Jsay0+bnBhc3NlcykKKyAgICAgICAgICAgICAgICBpbmNsID0gZ2V0X2JpdHMocywgMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5jbCA9IHRhZ190cmVlX2RlY29kZShzLCBwcmVjLT5jYmxraW5jbCArIGNibGtubywgbGF5bm8gKyAxKSA9PSBsYXlubzsKKyAgICAgICAgICAgIGlmICghaW5jbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGluY2wgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmNsOworCisgICAgICAgICAgICBpZiAoIWNibGstPm5wYXNzZXMpIHsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IGV4cG5bYmFuZG5vXSArIG51bWdiaXRzIC0gMSAtCisgICAgICAgICAgICAgICAgICAgICAgICB0YWdfdHJlZV9kZWNvZGUocywgcHJlYy0+emVyb2JpdHMgKyBjYmxrbm8sIDEwMCk7CisgICAgICAgICAgICAgICAgaWYgKHYgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbnplcm9iaXRzICVkIGludmFsaWRcbiIsIHYpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2Jsay0+bm9uemVyb2JpdHMgPSB2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChuZXdwYXNzZXMgPSBnZXRucGFzc2VzKHMpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld3Bhc3NlczsKKyAgICAgICAgICAgIGlmICgobGxlbiA9IGdldGxibG9ja2luYyhzKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBsbGVuOworICAgICAgICAgICAgY2Jsay0+bGJsb2NrICs9IGxsZW47CisgICAgICAgICAgICBpZiAoKHJldCA9IGdldF9iaXRzKHMsIGF2X2xvZzIobmV3cGFzc2VzKSArIGNibGstPmxibG9jaykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKHJldCA+IHNpemVvZihjYmxrLT5kYXRhKSkgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJsb2NrIHdpdGggbGVuZ3RoaW5jIGdyZWF0ZXIgdGhhbiAlIlNJWkVfU1BFQ0lGSUVSIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjYmxrLT5kYXRhKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2Jsay0+bGVuZ3RoaW5jID0gcmV0OworICAgICAgICAgICAgY2Jsay0+bnBhc3NlcyAgKz0gbmV3cGFzc2VzOworICAgICAgICB9CisgICAgfQorICAgIGpwZWcyMDAwX2ZsdXNoKHMpOworCisgICAgaWYgKGNvZHN0eS0+Y3N0eSAmIEpQRUcyMDAwX0NTVFlfRVBIKSB7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9wZWVrX2JlMTYoJnMtPmcpID09IEpQRUcyMDAwX0VQSCkKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmcsIDIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVQSCBtYXJrZXIgbm90IGZvdW5kLlxuIik7CisgICAgfQorCisgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCBybGV2ZWwtPm5iYW5kczsgYmFuZG5vKyspIHsKKyAgICAgICAgSnBlZzIwMDBCYW5kICpiYW5kID0gcmxldmVsLT5iYW5kICsgYmFuZG5vOworICAgICAgICBKcGVnMjAwMFByZWMgKnByZWMgPSBiYW5kLT5wcmVjICsgcHJlY25vOworCisgICAgICAgIG5iX2NvZGVfYmxvY2tzID0gcHJlYy0+bmJfY29kZWJsb2Nrc19oZWlnaHQgKiBwcmVjLT5uYl9jb2RlYmxvY2tzX3dpZHRoOworICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IG5iX2NvZGVfYmxvY2tzOyBjYmxrbm8rKykgeworICAgICAgICAgICAgSnBlZzIwMDBDYmxrICpjYmxrID0gcHJlYy0+Y2JsayArIGNibGtubzsKKyAgICAgICAgICAgIGlmICggICBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPCBjYmxrLT5sZW5ndGhpbmMKKyAgICAgICAgICAgICAgICB8fCBzaXplb2YoY2Jsay0+ZGF0YSkgPCBjYmxrLT5sZW5ndGggKyBjYmxrLT5sZW5ndGhpbmMgKyAyCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkJsb2NrIGxlbmd0aCAlIlBSSXUxNiIgb3IgbGVuZ3RoaW5jICVkIGlzIHRvbyBsYXJnZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bGVuZ3RoLCBjYmxrLT5sZW5ndGhpbmMpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVydSgmcy0+ZywgY2Jsay0+ZGF0YSArIGNibGstPmxlbmd0aCwgY2Jsay0+bGVuZ3RoaW5jKTsKKyAgICAgICAgICAgIGNibGstPmxlbmd0aCAgICs9IGNibGstPmxlbmd0aGluYzsKKyAgICAgICAgICAgIGNibGstPmxlbmd0aGluYyA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQganBlZzIwMDBfZGVjb2RlX3BhY2tldHMoSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcywgSnBlZzIwMDBUaWxlICp0aWxlKQoreworICAgIGludCByZXQgPSAwOworICAgIGludCBsYXlubywgcmVzbGV2ZWxubywgY29tcG5vLCBwcmVjbm8sIG9rX3Jlc2xldmVsOworICAgIGludCB4LCB5OworCisgICAgcy0+Yml0X2luZGV4ID0gODsKKyAgICBzd2l0Y2ggKHRpbGUtPmNvZHN0eVswXS5wcm9nX29yZGVyKSB7CisgICAgY2FzZSBKUEVHMjAwMF9QR09EX1JMQ1A6CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIlByb2dyZXNzaW9uIG9yZGVyIFJMQ1AiKTsKKworICAgIGNhc2UgSlBFRzIwMDBfUEdPRF9MUkNQOgorICAgICAgICBmb3IgKGxheW5vID0gMDsgbGF5bm8gPCB0aWxlLT5jb2RzdHlbMF0ubmxheWVyczsgbGF5bm8rKykgeworICAgICAgICAgICAgb2tfcmVzbGV2ZWwgPSAxOworICAgICAgICAgICAgZm9yIChyZXNsZXZlbG5vID0gMDsgb2tfcmVzbGV2ZWw7IHJlc2xldmVsbm8rKykgeworICAgICAgICAgICAgICAgIG9rX3Jlc2xldmVsID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHMtPm5jb21wb25lbnRzOyBjb21wbm8rKykgeworICAgICAgICAgICAgICAgICAgICBKcGVnMjAwMENvZGluZ1N0eWxlICpjb2RzdHkgPSB0aWxlLT5jb2RzdHkgKyBjb21wbm87CisgICAgICAgICAgICAgICAgICAgIEpwZWcyMDAwUXVhbnRTdHlsZSAqcW50c3R5ICA9IHRpbGUtPnFudHN0eSArIGNvbXBubzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2xldmVsbm8gPCBjb2RzdHktPm5yZXNsZXZlbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpwZWcyMDAwUmVzTGV2ZWwgKnJsZXZlbCA9IHRpbGUtPmNvbXBbY29tcG5vXS5yZXNsZXZlbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNsZXZlbG5vOworICAgICAgICAgICAgICAgICAgICAgICAgb2tfcmVzbGV2ZWwgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCBybGV2ZWwtPm51bV9wcmVjaW5jdHNfeCAqIHJsZXZlbC0+bnVtX3ByZWNpbmN0c195OyBwcmVjbm8rKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGpwZWcyMDAwX2RlY29kZV9wYWNrZXQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kc3R5LCBybGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNubywgbGF5bm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFudHN0eS0+ZXhwbiArIChyZXNsZXZlbG5vID8gMyAqIChyZXNsZXZlbG5vIC0gMSkgKyAxIDogMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFudHN0eS0+bmd1YXJkYml0cykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgSlBFRzIwMDBfUEdPRF9DUFJMOgorICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHMtPm5jb21wb25lbnRzOyBjb21wbm8rKykgeworICAgICAgICAgICAgSnBlZzIwMDBDb2RpbmdTdHlsZSAqY29kc3R5ID0gdGlsZS0+Y29kc3R5ICsgY29tcG5vOworICAgICAgICAgICAgSnBlZzIwMDBRdWFudFN0eWxlICpxbnRzdHkgID0gdGlsZS0+cW50c3R5ICsgY29tcG5vOworCisgICAgICAgICAgICAvKiBTZXQgYml0IHN0cmVhbSBidWZmZXIgYWRkcmVzcyBhY2NvcmRpbmcgdG8gdGlsZS1wYXJ0LgorICAgICAgICAgICAgICogRm9yIERDaW5lbWEgb25lIHRpbGUtcGFydCBwZXIgY29tcG9uZW50LCBzbyBjYW4gYmUKKyAgICAgICAgICAgICAqIGluZGV4ZWQgYnkgY29tcG9uZW50LiAqLworICAgICAgICAgICAgcy0+ZyA9IHRpbGUtPnRpbGVfcGFydFtjb21wbm9dLnRwZzsKKworICAgICAgICAgICAgLyogUG9zaXRpb24gbG9vcCAoeSBheGlzKQorICAgICAgICAgICAgICogVE9ETzogQXV0b21hdGUgY29tcHV0aW5nIG9mIHN0ZXAgMjU2LgorICAgICAgICAgICAgICogRml4ZWQgaGVyZSwgYnV0IHRvIGJlIGNvbXB1dGVkIGJlZm9yZSBlbnRlcmluZyBoZXJlLiAqLworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmhlaWdodDsgeSArPSAyNTYpIHsKKyAgICAgICAgICAgICAgICAvKiBQb3NpdGlvbiBsb29wICh5IGF4aXMpCisgICAgICAgICAgICAgICAgICogVE9ETzogYXV0b21hdGUgY29tcHV0aW5nIG9mIHN0ZXAgMjU2LgorICAgICAgICAgICAgICAgICAqIEZpeGVkIGhlcmUsIGJ1dCB0byBiZSBjb21wdXRlZCBiZWZvcmUgZW50ZXJpbmcgaGVyZS4gKi8KKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+d2lkdGg7IHggKz0gMjU2KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAocmVzbGV2ZWxubyA9IDA7IHJlc2xldmVsbm8gPCBjb2RzdHktPm5yZXNsZXZlbHM7IHJlc2xldmVsbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJjeCwgcHJjeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVkdWNlZHJlc25vID0gY29kc3R5LT5ucmVzbGV2ZWxzIC0gMSAtcmVzbGV2ZWxubzsgLy8gID09PiBOX0wgLSByCisgICAgICAgICAgICAgICAgICAgICAgICBKcGVnMjAwMFJlc0xldmVsICpybGV2ZWwgPSB0aWxlLT5jb21wW2NvbXBub10ucmVzbGV2ZWwgKyByZXNsZXZlbG5vOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgoeSAlICgxIDw8IChybGV2ZWwtPmxvZzJfcHJlY19oZWlnaHQgKyByZWR1Y2VkcmVzbm8pKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgPT0gMCkpKSAvLyBUT0RPOiAybmQgY29uZGl0aW9uIHNpbXBsaWZpZWQgYXMgdHJ5MCBhbHdheXMgPTAgZm9yIGRjaW5lbWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoKHggJSAoMSA8PCAocmxldmVsLT5sb2cyX3ByZWNfd2lkdGggKyByZWR1Y2VkcmVzbm8pKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHggPT0gMCkpKSAvLyBUT0RPOiAybmQgY29uZGl0aW9uIHNpbXBsaWZpZWQgYXMgdHJ5MCBhbHdheXMgPTAgZm9yIGRjaW5lbWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYSBwcmVjaW5jdCBleGlzdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHByY3ggICA9IGZmX2pwZWcyMDAwX2NlaWxkaXZwb3cyKHgsIHJlZHVjZWRyZXNubykgPj4gcmxldmVsLT5sb2cyX3ByZWNfd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmN5ICAgPSBmZl9qcGVnMjAwMF9jZWlsZGl2cG93Mih5LCByZWR1Y2VkcmVzbm8pID4+IHJsZXZlbC0+bG9nMl9wcmVjX2hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWNubyA9IHByY3ggKyBybGV2ZWwtPm51bV9wcmVjaW5jdHNfeCAqIHByY3k7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmN4ID49IHJsZXZlbC0+bnVtX3ByZWNpbmN0c194IHx8IHByY3kgPj0gcmxldmVsLT5udW1fcHJlY2luY3RzX3kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxheW5vID0gMDsgbGF5bm8gPCB0aWxlLT5jb2RzdHlbMF0ubmxheWVyczsgbGF5bm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0ganBlZzIwMDBfZGVjb2RlX3BhY2tldChzLCBjb2RzdHksIHJsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY25vLCBsYXlubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW50c3R5LT5leHBuICsgKHJlc2xldmVsbm8gPyAzICogKHJlc2xldmVsbm8gLSAxKSArIDEgOiAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW50c3R5LT5uZ3VhcmRiaXRzKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBKUEVHMjAwMF9QR09EX1JQQ0w6CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIlByb2dyZXNzaW9uIG9yZGVyIFJQQ0wiKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBKUEVHMjAwMF9QR09EX1BDUkw6CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIlByb2dyZXNzaW9uIG9yZGVyIFBDUkwiKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogRU9DIG1hcmtlciByZWFjaGVkICovCisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+ZywgMik7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBUSUVSLTEgcm91dGluZXMgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9zaWdwYXNzKEpwZWcyMDAwVDFDb250ZXh0ICp0MSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwbm8sIGludCBiYW5kbm8sIGludCBicGFzc19jc3R5X3N5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJ0X2NhdXNhbF9jdHhfY3N0eV9zeW1ib2wpCit7CisgICAgaW50IG1hc2sgPSAzIDw8IChicG5vIC0gMSksIHkwLCB4LCB5OworCisgICAgZm9yICh5MCA9IDA7IHkwIDwgaGVpZ2h0OyB5MCArPSA0KQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgIGZvciAoeSA9IHkwOyB5IDwgaGVpZ2h0ICYmIHkgPCB5MCArIDQ7IHkrKykgeworICAgICAgICAgICAgICAgIGlmICgodDEtPmZsYWdzW3krMV1beCsxXSAmIEpQRUcyMDAwX1QxX1NJR19OQikKKyAgICAgICAgICAgICAgICAmJiAhKHQxLT5mbGFnc1t5KzFdW3grMV0gJiAoSlBFRzIwMDBfVDFfU0lHIHwgSlBFRzIwMDBfVDFfVklTKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzX21hc2sgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnRfY2F1c2FsX2N0eF9jc3R5X3N5bWJvbCAmJiB5ID09IHkwICsgMykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzX21hc2sgJj0gfihKUEVHMjAwMF9UMV9TSUdfUyB8IEpQRUcyMDAwX1QxX1NJR19TVyB8IEpQRUcyMDAwX1QxX1NJR19TRSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmZl9tcWNfZGVjb2RlKCZ0MS0+bXFjLCB0MS0+bXFjLmN4X3N0YXRlcyArIGZmX2pwZWcyMDAwX2dldHNpZ2N0eG5vKHQxLT5mbGFnc1t5KzFdW3grMV0gJiBmbGFnc19tYXNrLCBiYW5kbm8pKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvcmJpdCwgY3R4bm8gPSBmZl9qcGVnMjAwMF9nZXRzZ25jdHhubyh0MS0+ZmxhZ3NbeSsxXVt4KzFdLCAmeG9yYml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicGFzc19jc3R5X3N5bWJvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEtPmRhdGFbeV1beF0gPSBmZl9tcWNfZGVjb2RlKCZ0MS0+bXFjLCB0MS0+bXFjLmN4X3N0YXRlcyArIGN0eG5vKSA/IC1tYXNrIDogbWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEtPmRhdGFbeV1beF0gPSAoZmZfbXFjX2RlY29kZSgmdDEtPm1xYywgdDEtPm1xYy5jeF9zdGF0ZXMgKyBjdHhubykgXiB4b3JiaXQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1hc2sgOiBtYXNrOworCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9qcGVnMjAwMF9zZXRfc2lnbmlmaWNhbmNlKHQxLCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MS0+ZGF0YVt5XVt4XSA8IDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHQxLT5mbGFnc1t5ICsgMV1beCArIDFdIHw9IEpQRUcyMDAwX1QxX1ZJUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9yZWZwYXNzKEpwZWcyMDAwVDFDb250ZXh0ICp0MSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwbm8pCit7CisgICAgaW50IHBoYWxmLCBuaGFsZjsKKyAgICBpbnQgeTAsIHgsIHk7CisKKyAgICBwaGFsZiA9IDEgPDwgKGJwbm8gLSAxKTsKKyAgICBuaGFsZiA9IC1waGFsZjsKKworICAgIGZvciAoeTAgPSAwOyB5MCA8IGhlaWdodDsgeTAgKz0gNCkKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICBmb3IgKHkgPSB5MDsgeSA8IGhlaWdodCAmJiB5IDwgeTAgKyA0OyB5KyspCisgICAgICAgICAgICAgICAgaWYgKCh0MS0+ZmxhZ3NbeSArIDFdW3ggKyAxXSAmIChKUEVHMjAwMF9UMV9TSUcgfCBKUEVHMjAwMF9UMV9WSVMpKSA9PSBKUEVHMjAwMF9UMV9TSUcpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGN0eG5vID0gZmZfanBlZzIwMDBfZ2V0cmVmY3R4bm8odDEtPmZsYWdzW3kgKyAxXVt4ICsgMV0pOworICAgICAgICAgICAgICAgICAgICBpbnQgciAgICAgPSBmZl9tcWNfZGVjb2RlKCZ0MS0+bXFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxLT5tcWMuY3hfc3RhdGVzICsgY3R4bm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGhhbGYgOiBuaGFsZjsKKyAgICAgICAgICAgICAgICAgICAgdDEtPmRhdGFbeV1beF0gICAgICAgICAgKz0gdDEtPmRhdGFbeV1beF0gPCAwID8gLXIgOiByOworICAgICAgICAgICAgICAgICAgICB0MS0+ZmxhZ3NbeSArIDFdW3ggKyAxXSB8PSBKUEVHMjAwMF9UMV9SRUY7CisgICAgICAgICAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfY2xucGFzcyhKcGVnMjAwMERlY29kZXJDb250ZXh0ICpzLCBKcGVnMjAwMFQxQ29udGV4dCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicG5vLCBpbnQgYmFuZG5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlZ19zeW1ib2xzLCBpbnQgdmVydF9jYXVzYWxfY3R4X2NzdHlfc3ltYm9sKQoreworICAgIGludCBtYXNrID0gMyA8PCAoYnBubyAtIDEpLCB5MCwgeCwgeSwgcnVubGVuLCBkZWM7CisKKyAgICBmb3IgKHkwID0gMDsgeTAgPCBoZWlnaHQ7IHkwICs9IDQpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGlmICh5MCArIDMgPCBoZWlnaHQgJiYKKyAgICAgICAgICAgICAgICAhKCh0MS0+ZmxhZ3NbeTAgKyAxXVt4ICsgMV0gJiAoSlBFRzIwMDBfVDFfU0lHX05CIHwgSlBFRzIwMDBfVDFfVklTIHwgSlBFRzIwMDBfVDFfU0lHKSkgfHwKKyAgICAgICAgICAgICAgICAgICh0MS0+ZmxhZ3NbeTAgKyAyXVt4ICsgMV0gJiAoSlBFRzIwMDBfVDFfU0lHX05CIHwgSlBFRzIwMDBfVDFfVklTIHwgSlBFRzIwMDBfVDFfU0lHKSkgfHwKKyAgICAgICAgICAgICAgICAgICh0MS0+ZmxhZ3NbeTAgKyAzXVt4ICsgMV0gJiAoSlBFRzIwMDBfVDFfU0lHX05CIHwgSlBFRzIwMDBfVDFfVklTIHwgSlBFRzIwMDBfVDFfU0lHKSkgfHwKKyAgICAgICAgICAgICAgICAgICh0MS0+ZmxhZ3NbeTAgKyA0XVt4ICsgMV0gJiAoSlBFRzIwMDBfVDFfU0lHX05CIHwgSlBFRzIwMDBfVDFfVklTIHwgSlBFRzIwMDBfVDFfU0lHKSkpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmZl9tcWNfZGVjb2RlKCZ0MS0+bXFjLCB0MS0+bXFjLmN4X3N0YXRlcyArIE1RQ19DWF9STCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHJ1bmxlbiA9IGZmX21xY19kZWNvZGUoJnQxLT5tcWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MS0+bXFjLmN4X3N0YXRlcyArIE1RQ19DWF9VTkkpOworICAgICAgICAgICAgICAgIHJ1bmxlbiA9IChydW5sZW4gPDwgMSkgfCBmZl9tcWNfZGVjb2RlKCZ0MS0+bXFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxLT5tcWMuY3hfc3RhdGVzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUUNfQ1hfVU5JKTsKKyAgICAgICAgICAgICAgICBkZWMgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW5sZW4gPSAwOworICAgICAgICAgICAgICAgIGRlYyAgICA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoeSA9IHkwICsgcnVubGVuOyB5IDwgeTAgKyA0ICYmIHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgIGlmICghZGVjKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHQxLT5mbGFnc1t5KzFdW3grMV0gJiAoSlBFRzIwMDBfVDFfU0lHIHwgSlBFRzIwMDBfVDFfVklTKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnc19tYXNrID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVydF9jYXVzYWxfY3R4X2NzdHlfc3ltYm9sICYmIHkgPT0geTAgKyAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzX21hc2sgJj0gfihKUEVHMjAwMF9UMV9TSUdfUyB8IEpQRUcyMDAwX1QxX1NJR19TVyB8IEpQRUcyMDAwX1QxX1NJR19TRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWMgPSBmZl9tcWNfZGVjb2RlKCZ0MS0+bXFjLCB0MS0+bXFjLmN4X3N0YXRlcyArIGZmX2pwZWcyMDAwX2dldHNpZ2N0eG5vKHQxLT5mbGFnc1t5KzFdW3grMV0gJiBmbGFnc19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZG5vKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlYykgeworICAgICAgICAgICAgICAgICAgICBpbnQgeG9yYml0OworICAgICAgICAgICAgICAgICAgICBpbnQgY3R4bm8gPSBmZl9qcGVnMjAwMF9nZXRzZ25jdHhubyh0MS0+ZmxhZ3NbeSArIDFdW3ggKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhvcmJpdCk7CisgICAgICAgICAgICAgICAgICAgIHQxLT5kYXRhW3ldW3hdID0gKGZmX21xY19kZWNvZGUoJnQxLT5tcWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEtPm1xYy5jeF9zdGF0ZXMgKyBjdHhubykgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4b3JiaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAtbWFzayA6IG1hc2s7CisgICAgICAgICAgICAgICAgICAgIGZmX2pwZWcyMDAwX3NldF9zaWduaWZpY2FuY2UodDEsIHgsIHksIHQxLT5kYXRhW3ldW3hdIDwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYyA9IDA7CisgICAgICAgICAgICAgICAgdDEtPmZsYWdzW3kgKyAxXVt4ICsgMV0gJj0gfkpQRUcyMDAwX1QxX1ZJUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2VnX3N5bWJvbHMpIHsKKyAgICAgICAgaW50IHZhbDsKKyAgICAgICAgdmFsID0gZmZfbXFjX2RlY29kZSgmdDEtPm1xYywgdDEtPm1xYy5jeF9zdGF0ZXMgKyBNUUNfQ1hfVU5JKTsKKyAgICAgICAgdmFsID0gKHZhbCA8PCAxKSArIGZmX21xY19kZWNvZGUoJnQxLT5tcWMsIHQxLT5tcWMuY3hfc3RhdGVzICsgTVFDX0NYX1VOSSk7CisgICAgICAgIHZhbCA9ICh2YWwgPDwgMSkgKyBmZl9tcWNfZGVjb2RlKCZ0MS0+bXFjLCB0MS0+bXFjLmN4X3N0YXRlcyArIE1RQ19DWF9VTkkpOworICAgICAgICB2YWwgPSAodmFsIDw8IDEpICsgZmZfbXFjX2RlY29kZSgmdDEtPm1xYywgdDEtPm1xYy5jeF9zdGF0ZXMgKyBNUUNfQ1hfVU5JKTsKKyAgICAgICAgaWYgKHZhbCAhPSAweGEpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiU2VnbWVudGF0aW9uIHN5bWJvbCB2YWx1ZSBpbmNvcnJlY3RcbiIpOworICAgIH0KK30KKworc3RhdGljIGludCBkZWNvZGVfY2JsayhKcGVnMjAwMERlY29kZXJDb250ZXh0ICpzLCBKcGVnMjAwMENvZGluZ1N0eWxlICpjb2RzdHksCisgICAgICAgICAgICAgICAgICAgICAgIEpwZWcyMDAwVDFDb250ZXh0ICp0MSwgSnBlZzIwMDBDYmxrICpjYmxrLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBiYW5kcG9zKQoreworICAgIGludCBwYXNzbm8gPSBjYmxrLT5ucGFzc2VzLCBwYXNzX3QgPSAyLCBicG5vID0gY2Jsay0+bm9uemVyb2JpdHMgLSAxLCB5OworICAgIGludCBjbG5wYXNzX2NudCA9IDA7CisgICAgaW50IGJwYXNzX2NzdHlfc3ltYm9sICAgICAgICAgICA9IGNvZHN0eS0+Y2Jsa19zdHlsZSAmIEpQRUcyMDAwX0NCTEtfQllQQVNTOworICAgIGludCB2ZXJ0X2NhdXNhbF9jdHhfY3N0eV9zeW1ib2wgPSBjb2RzdHktPmNibGtfc3R5bGUgJiBKUEVHMjAwMF9DQkxLX1ZTQzsKKworICAgIGF2X2Fzc2VydDAod2lkdGggIDw9IEpQRUcyMDAwX01BWF9DQkxLVyk7CisgICAgYXZfYXNzZXJ0MChoZWlnaHQgPD0gSlBFRzIwMDBfTUFYX0NCTEtIKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKyAgICAgICAgbWVtc2V0KHQxLT5kYXRhW3ldLCAwLCB3aWR0aCAqIHNpemVvZigqKnQxLT5kYXRhKSk7CisKKyAgICAvKiBJZiBjb2RlLWJsb2NrIGNvbnRhaW5zIG5vIGNvbXByZXNzZWQgZGF0YTogbm90aGluZyB0byBkby4gKi8KKyAgICBpZiAoIWNibGstPmxlbmd0aCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0ICsgMjsgeSsrKQorICAgICAgICBtZW1zZXQodDEtPmZsYWdzW3ldLCAwLCAod2lkdGggKyAyKSAqIHNpemVvZigqKnQxLT5mbGFncykpOworCisgICAgY2Jsay0+ZGF0YVtjYmxrLT5sZW5ndGhdID0gMHhmZjsKKyAgICBjYmxrLT5kYXRhW2NibGstPmxlbmd0aCsxXSA9IDB4ZmY7CisgICAgZmZfbXFjX2luaXRkZWMoJnQxLT5tcWMsIGNibGstPmRhdGEpOworCisgICAgd2hpbGUgKHBhc3Nuby0tKSB7CisgICAgICAgIHN3aXRjaChwYXNzX3QpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZGVjb2RlX3NpZ3Bhc3ModDEsIHdpZHRoLCBoZWlnaHQsIGJwbm8gKyAxLCBiYW5kcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBhc3NfY3N0eV9zeW1ib2wgJiYgKGNsbnBhc3NfY250ID49IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydF9jYXVzYWxfY3R4X2NzdHlfc3ltYm9sKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBkZWNvZGVfcmVmcGFzcyh0MSwgd2lkdGgsIGhlaWdodCwgYnBubyArIDEpOworICAgICAgICAgICAgaWYgKGJwYXNzX2NzdHlfc3ltYm9sICYmIGNsbnBhc3NfY250ID49IDQpCisgICAgICAgICAgICAgICAgZmZfbXFjX2luaXRkZWMoJnQxLT5tcWMsIGNibGstPmRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGRlY29kZV9jbG5wYXNzKHMsIHQxLCB3aWR0aCwgaGVpZ2h0LCBicG5vICsgMSwgYmFuZHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZHN0eS0+Y2Jsa19zdHlsZSAmIEpQRUcyMDAwX0NCTEtfU0VHU1lNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydF9jYXVzYWxfY3R4X2NzdHlfc3ltYm9sKTsKKyAgICAgICAgICAgIGNsbnBhc3NfY250ID0gY2xucGFzc19jbnQgKyAxOworICAgICAgICAgICAgaWYgKGJwYXNzX2NzdHlfc3ltYm9sICYmIGNsbnBhc3NfY250ID49IDQpCisgICAgICAgICAgICAgICAgZmZfbXFjX2luaXRkZWMoJnQxLT5tcWMsIGNibGstPmRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwYXNzX3QrKzsKKyAgICAgICAgaWYgKHBhc3NfdCA9PSAzKSB7CisgICAgICAgICAgICBicG5vLS07CisgICAgICAgICAgICBwYXNzX3QgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBUT0RPOiBWZXJpZnkgZGVxdWFudGl6YXRpb24gZm9yIGxvc3NsZXNzIGNhc2UKKyAqIGNvbXAtPmRhdGEgY2FuIGJlIGZsb2F0IG9yIGludAorICogYmFuZC0+c3RlcHNpemUgY2FuIGJlIGZsb2F0IG9yIGludAorICogZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIERXVCB0cmFuc2Zvcm1hdGlvbi4KKyAqIHNlZSBJU08vSUVDIDE1NDQ0LTE6MjAwMiBBLjYuMSAqLworCisvKiBGbG9hdCBkZXF1YW50aXphdGlvbiBvZiBhIGNvZGVibG9jay4qLworc3RhdGljIHZvaWQgZGVxdWFudGl6YXRpb25fZmxvYXQoaW50IHgsIGludCB5LCBKcGVnMjAwMENibGsgKmNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGVnMjAwMENvbXBvbmVudCAqY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwZWcyMDAwVDFDb250ZXh0ICp0MSwgSnBlZzIwMDBCYW5kICpiYW5kKQoreworICAgIGludCBpLCBqOworICAgIGludCB3ID0gY2Jsay0+Y29vcmRbMF1bMV0gLSBjYmxrLT5jb29yZFswXVswXTsKKyAgICBmb3IgKGogPSAwOyBqIDwgKGNibGstPmNvb3JkWzFdWzFdIC0gY2Jsay0+Y29vcmRbMV1bMF0pOyArK2opIHsKKyAgICAgICAgZmxvYXQgKmRhdGFwID0gJmNvbXAtPmZfZGF0YVsoY29tcC0+Y29vcmRbMF1bMV0gLSBjb21wLT5jb29yZFswXVswXSkgKiAoeSArIGopICsgeF07CisgICAgICAgIGludCAqc3JjID0gdDEtPmRhdGFbal07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyArK2kpCisgICAgICAgICAgICBkYXRhcFtpXSA9IHNyY1tpXSAqIGJhbmQtPmZfc3RlcHNpemU7CisgICAgfQorfQorCisvKiBJbnRlZ2VyIGRlcXVhbnRpemF0aW9uIG9mIGEgY29kZWJsb2NrLiovCitzdGF0aWMgdm9pZCBkZXF1YW50aXphdGlvbl9pbnQoaW50IHgsIGludCB5LCBKcGVnMjAwMENibGsgKmNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBlZzIwMDBDb21wb25lbnQgKmNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBlZzIwMDBUMUNvbnRleHQgKnQxLCBKcGVnMjAwMEJhbmQgKmJhbmQpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHcgPSBjYmxrLT5jb29yZFswXVsxXSAtIGNibGstPmNvb3JkWzBdWzBdOworICAgIGZvciAoaiA9IDA7IGogPCAoY2Jsay0+Y29vcmRbMV1bMV0gLSBjYmxrLT5jb29yZFsxXVswXSk7ICsraikgeworICAgICAgICBpbnQzMl90ICpkYXRhcCA9ICZjb21wLT5pX2RhdGFbKGNvbXAtPmNvb3JkWzBdWzFdIC0gY29tcC0+Y29vcmRbMF1bMF0pICogKHkgKyBqKSArIHhdOworICAgICAgICBpbnQgKnNyYyA9IHQxLT5kYXRhW2pdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgKytpKQorICAgICAgICAgICAgZGF0YXBbaV0gPSAoc3JjW2ldICogYmFuZC0+aV9zdGVwc2l6ZSArICgxIDw8IDE0KSkgPj4gMTU7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWN0X2RlY29kZShKcGVnMjAwMERlY29kZXJDb250ZXh0ICpzLCBKcGVnMjAwMFRpbGUgKnRpbGUpCit7CisgICAgaW50IGksIGNzaXplID0gMTsKKyAgICB2b2lkICpzcmNbM107CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgMzsgaSsrKQorICAgICAgICBpZiAodGlsZS0+Y29kc3R5WzBdLnRyYW5zZm9ybSAhPSB0aWxlLT5jb2RzdHlbaV0udHJhbnNmb3JtKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRyYW5zZm9ybXMgbWlzbWF0Y2gsIE1DVCBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgaWYgKHRpbGUtPmNvZHN0eVswXS50cmFuc2Zvcm0gPT0gRkZfRFdUOTcpCisgICAgICAgICAgICBzcmNbaV0gPSB0aWxlLT5jb21wW2ldLmZfZGF0YTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3JjW2ldID0gdGlsZS0+Y29tcFtpXS5pX2RhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICBjc2l6ZSAqPSB0aWxlLT5jb21wWzBdLmNvb3JkW2ldWzFdIC0gdGlsZS0+Y29tcFswXS5jb29yZFtpXVswXTsKKworICAgIHMtPmRzcC5tY3RfZGVjb2RlW3RpbGUtPmNvZHN0eVswXS50cmFuc2Zvcm1dKHNyY1swXSwgc3JjWzFdLCBzcmNbMl0sIGNzaXplKTsKK30KKworc3RhdGljIGludCBqcGVnMjAwMF9kZWNvZGVfdGlsZShKcGVnMjAwMERlY29kZXJDb250ZXh0ICpzLCBKcGVnMjAwMFRpbGUgKnRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKnBpY3R1cmUpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzLT5hdmN0eC0+cGl4X2ZtdCk7CisgICAgaW50IGNvbXBubywgcmVzbGV2ZWxubywgYmFuZG5vOworICAgIGludCB4LCB5OworICAgIGludCBwbGFuYXIgICAgPSAhIShwaXhkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QTEFOQVIpOworICAgIGludCBwaXhlbHNpemUgPSBwbGFuYXIgPyAxIDogcGl4ZGVzYy0+bmJfY29tcG9uZW50czsKKworICAgIHVpbnQ4X3QgKmxpbmU7CisgICAgSnBlZzIwMDBUMUNvbnRleHQgdDE7CisKKyAgICAvKiBMb29wIG9uIHRpbGUgY29tcG9uZW50cyAqLworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcy0+bmNvbXBvbmVudHM7IGNvbXBubysrKSB7CisgICAgICAgIEpwZWcyMDAwQ29tcG9uZW50ICpjb21wICAgICA9IHRpbGUtPmNvbXAgKyBjb21wbm87CisgICAgICAgIEpwZWcyMDAwQ29kaW5nU3R5bGUgKmNvZHN0eSA9IHRpbGUtPmNvZHN0eSArIGNvbXBubzsKKworICAgICAgICAvKiBMb29wIG9uIHJlc29sdXRpb24gbGV2ZWxzICovCisgICAgICAgIGZvciAocmVzbGV2ZWxubyA9IDA7IHJlc2xldmVsbm8gPCBjb2RzdHktPm5yZXNsZXZlbHMyZGVjb2RlOyByZXNsZXZlbG5vKyspIHsKKyAgICAgICAgICAgIEpwZWcyMDAwUmVzTGV2ZWwgKnJsZXZlbCA9IGNvbXAtPnJlc2xldmVsICsgcmVzbGV2ZWxubzsKKyAgICAgICAgICAgIC8qIExvb3Agb24gYmFuZHMgKi8KKyAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmxldmVsLT5uYmFuZHM7IGJhbmRubysrKSB7CisgICAgICAgICAgICAgICAgaW50IG5iX3ByZWNpbmN0cywgcHJlY25vOworICAgICAgICAgICAgICAgIEpwZWcyMDAwQmFuZCAqYmFuZCA9IHJsZXZlbC0+YmFuZCArIGJhbmRubzsKKyAgICAgICAgICAgICAgICBpbnQgY2Jsa25vID0gMCwgYmFuZHBvczsKKworICAgICAgICAgICAgICAgIGJhbmRwb3MgPSBiYW5kbm8gKyAocmVzbGV2ZWxubyA+IDApOworCisgICAgICAgICAgICAgICAgaWYgKGJhbmQtPmNvb3JkWzBdWzBdID09IGJhbmQtPmNvb3JkWzBdWzFdIHx8CisgICAgICAgICAgICAgICAgICAgIGJhbmQtPmNvb3JkWzFdWzBdID09IGJhbmQtPmNvb3JkWzFdWzFdKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIG5iX3ByZWNpbmN0cyA9IHJsZXZlbC0+bnVtX3ByZWNpbmN0c194ICogcmxldmVsLT5udW1fcHJlY2luY3RzX3k7CisgICAgICAgICAgICAgICAgLyogTG9vcCBvbiBwcmVjaW5jdHMgKi8KKyAgICAgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IG5iX3ByZWNpbmN0czsgcHJlY25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgSnBlZzIwMDBQcmVjICpwcmVjID0gYmFuZC0+cHJlYyArIHByZWNubzsKKworICAgICAgICAgICAgICAgICAgICAvKiBMb29wIG9uIGNvZGVibG9ja3MgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBwcmVjLT5uYl9jb2RlYmxvY2tzX3dpZHRoICogcHJlYy0+bmJfY29kZWJsb2Nrc19oZWlnaHQ7IGNibGtubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpwZWcyMDAwQ2JsayAqY2JsayA9IHByZWMtPmNibGsgKyBjYmxrbm87CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY2JsayhzLCBjb2RzdHksICZ0MSwgY2JsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPmNvb3JkWzBdWzFdIC0gY2Jsay0+Y29vcmRbMF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5jb29yZFsxXVsxXSAtIGNibGstPmNvb3JkWzFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHBvcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBjYmxrLT5jb29yZFswXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjYmxrLT5jb29yZFsxXVswXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZHN0eS0+dHJhbnNmb3JtID09IEZGX0RXVDk3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcXVhbnRpemF0aW9uX2Zsb2F0KHgsIHksIGNibGssIGNvbXAsICZ0MSwgYmFuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVxdWFudGl6YXRpb25faW50KHgsIHksIGNibGssIGNvbXAsICZ0MSwgYmFuZCk7CisgICAgICAgICAgICAgICAgICAgfSAvKiBlbmQgY2JsayAqLworICAgICAgICAgICAgICAgIH0gLyplbmQgcHJlYyAqLworICAgICAgICAgICAgfSAvKiBlbmQgYmFuZCAqLworICAgICAgICB9IC8qIGVuZCByZXNsZXZlbCAqLworCisgICAgICAgIC8qIGludmVyc2UgRFdUICovCisgICAgICAgIGZmX2R3dF9kZWNvZGUoJmNvbXAtPmR3dCwgY29kc3R5LT50cmFuc2Zvcm0gPT0gRkZfRFdUOTcgPyAodm9pZCopY29tcC0+Zl9kYXRhIDogKHZvaWQqKWNvbXAtPmlfZGF0YSk7CisgICAgfSAvKmVuZCBjb21wICovCisKKyAgICAvKiBpbnZlcnNlIE1DVCB0cmFuc2Zvcm1hdGlvbiAqLworICAgIGlmICh0aWxlLT5jb2RzdHlbMF0ubWN0KQorICAgICAgICBtY3RfZGVjb2RlKHMsIHRpbGUpOworCisgICAgaWYgKHMtPmNkZWZbMF0gPCAwKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5uY29tcG9uZW50czsgeCsrKQorICAgICAgICAgICAgcy0+Y2RlZlt4XSA9IHggKyAxOworICAgICAgICBpZiAoKHMtPm5jb21wb25lbnRzICYgMSkgPT0gMCkKKyAgICAgICAgICAgIHMtPmNkZWZbcy0+bmNvbXBvbmVudHMtMV0gPSAwOworICAgIH0KKworICAgIGlmIChzLT5wcmVjaXNpb24gPD0gOCkgeworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHMtPm5jb21wb25lbnRzOyBjb21wbm8rKykgeworICAgICAgICAgICAgSnBlZzIwMDBDb21wb25lbnQgKmNvbXAgPSB0aWxlLT5jb21wICsgY29tcG5vOworICAgICAgICAgICAgSnBlZzIwMDBDb2RpbmdTdHlsZSAqY29kc3R5ID0gdGlsZS0+Y29kc3R5ICsgY29tcG5vOworICAgICAgICAgICAgZmxvYXQgKmRhdGFwID0gY29tcC0+Zl9kYXRhOworICAgICAgICAgICAgaW50MzJfdCAqaV9kYXRhcCA9IGNvbXAtPmlfZGF0YTsKKyAgICAgICAgICAgIGludCBjYnBzID0gcy0+Y2Jwc1tjb21wbm9dOworICAgICAgICAgICAgaW50IHcgPSB0aWxlLT5jb21wW2NvbXBub10uY29vcmRbMF1bMV0gLSBzLT5pbWFnZV9vZmZzZXRfeDsKKyAgICAgICAgICAgIGludCBwbGFuZSA9IDA7CisKKyAgICAgICAgICAgIGlmIChwbGFuYXIpCisgICAgICAgICAgICAgICAgcGxhbmUgPSBzLT5jZGVmW2NvbXBub10gPyBzLT5jZGVmW2NvbXBub10tMSA6IChzLT5uY29tcG9uZW50cy0xKTsKKworCisgICAgICAgICAgICB5ICAgID0gdGlsZS0+Y29tcFtjb21wbm9dLmNvb3JkWzFdWzBdIC0gcy0+aW1hZ2Vfb2Zmc2V0X3k7CisgICAgICAgICAgICBsaW5lID0gcGljdHVyZS0+ZGF0YVtwbGFuZV0gKyB5IC8gcy0+Y2R5W2NvbXBub10gKiBwaWN0dXJlLT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgICAgICBmb3IgKDsgeSA8IHRpbGUtPmNvbXBbY29tcG5vXS5jb29yZFsxXVsxXSAtIHMtPmltYWdlX29mZnNldF95OyB5ICs9IHMtPmNkeVtjb21wbm9dKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0OworCisgICAgICAgICAgICAgICAgeCAgID0gdGlsZS0+Y29tcFtjb21wbm9dLmNvb3JkWzBdWzBdIC0gcy0+aW1hZ2Vfb2Zmc2V0X3g7CisgICAgICAgICAgICAgICAgZHN0ID0gbGluZSArIHggLyBzLT5jZHhbY29tcG5vXSAqIHBpeGVsc2l6ZSArIGNvbXBubyohcGxhbmFyOworCisgICAgICAgICAgICAgICAgaWYgKGNvZHN0eS0+dHJhbnNmb3JtID09IEZGX0RXVDk3KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyB4IDwgdzsgeCArPSBzLT5jZHhbY29tcG5vXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCA9IGxyaW50ZigqZGF0YXApICsgKDEgPDwgKGNicHMgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEQyBsZXZlbCBzaGlmdCBhbmQgY2xpcCBzZWUgSVNPIDE1NDQ0LTE6MjAwMiBHLjEuMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gYXZfY2xpcCh2YWwsIDAsICgxIDw8IGNicHMpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqZHN0ID0gdmFsIDw8ICg4IC0gY2Jwcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICs9IHBpeGVsc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyB4IDwgdzsgeCArPSBzLT5jZHhbY29tcG5vXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCA9ICppX2RhdGFwICsgKDEgPDwgKGNicHMgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEQyBsZXZlbCBzaGlmdCBhbmQgY2xpcCBzZWUgSVNPIDE1NDQ0LTE6MjAwMiBHLjEuMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gYXZfY2xpcCh2YWwsIDAsICgxIDw8IGNicHMpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqZHN0ID0gdmFsIDw8ICg4IC0gY2Jwcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpX2RhdGFwKys7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gcGl4ZWxzaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmUgKz0gcGljdHVyZS0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBzLT5uY29tcG9uZW50czsgY29tcG5vKyspIHsKKyAgICAgICAgICAgIEpwZWcyMDAwQ29tcG9uZW50ICpjb21wID0gdGlsZS0+Y29tcCArIGNvbXBubzsKKyAgICAgICAgICAgIEpwZWcyMDAwQ29kaW5nU3R5bGUgKmNvZHN0eSA9IHRpbGUtPmNvZHN0eSArIGNvbXBubzsKKyAgICAgICAgICAgIGZsb2F0ICpkYXRhcCA9IGNvbXAtPmZfZGF0YTsKKyAgICAgICAgICAgIGludDMyX3QgKmlfZGF0YXAgPSBjb21wLT5pX2RhdGE7CisgICAgICAgICAgICB1aW50MTZfdCAqbGluZWw7CisgICAgICAgICAgICBpbnQgY2JwcyA9IHMtPmNicHNbY29tcG5vXTsKKyAgICAgICAgICAgIGludCB3ID0gdGlsZS0+Y29tcFtjb21wbm9dLmNvb3JkWzBdWzFdIC0gcy0+aW1hZ2Vfb2Zmc2V0X3g7CisgICAgICAgICAgICBpbnQgcGxhbmUgPSAwOworCisgICAgICAgICAgICBpZiAocGxhbmFyKQorICAgICAgICAgICAgICAgIHBsYW5lID0gcy0+Y2RlZltjb21wbm9dID8gcy0+Y2RlZltjb21wbm9dLTEgOiAocy0+bmNvbXBvbmVudHMtMSk7CisKKyAgICAgICAgICAgIHkgICAgID0gdGlsZS0+Y29tcFtjb21wbm9dLmNvb3JkWzFdWzBdIC0gcy0+aW1hZ2Vfb2Zmc2V0X3k7CisgICAgICAgICAgICBsaW5lbCA9ICh1aW50MTZfdCAqKXBpY3R1cmUtPmRhdGFbcGxhbmVdICsgeSAvIHMtPmNkeVtjb21wbm9dICogKHBpY3R1cmUtPmxpbmVzaXplW3BsYW5lXSA+PiAxKTsKKyAgICAgICAgICAgIGZvciAoOyB5IDwgdGlsZS0+Y29tcFtjb21wbm9dLmNvb3JkWzFdWzFdIC0gcy0+aW1hZ2Vfb2Zmc2V0X3k7IHkgKz0gcy0+Y2R5W2NvbXBub10pIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqZHN0OworCisgICAgICAgICAgICAgICAgeCAgID0gdGlsZS0+Y29tcFtjb21wbm9dLmNvb3JkWzBdWzBdIC0gcy0+aW1hZ2Vfb2Zmc2V0X3g7CisgICAgICAgICAgICAgICAgZHN0ID0gbGluZWwgKyAoeCAvIHMtPmNkeFtjb21wbm9dICogcGl4ZWxzaXplICsgY29tcG5vKiFwbGFuYXIpOworICAgICAgICAgICAgICAgIGlmIChjb2RzdHktPnRyYW5zZm9ybSA9PSBGRl9EV1Q5NykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKDsgeCA8IHc7IHggKz0gcy0+IGNkeFtjb21wbm9dKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHZhbCA9IGxyaW50ZigqZGF0YXApICsgKDEgPDwgKGNicHMgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEQyBsZXZlbCBzaGlmdCBhbmQgY2xpcCBzZWUgSVNPIDE1NDQ0LTE6MjAwMiBHLjEuMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gYXZfY2xpcCh2YWwsIDAsICgxIDw8IGNicHMpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGlnbiAxMiBiaXQgdmFsdWVzIGluIGxpdHRsZS1lbmRpYW4gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmRzdCA9IHZhbCA8PCAoMTYgLSBjYnBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFwKys7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gcGl4ZWxzaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IHggPCB3OyB4ICs9IHMtPiBjZHhbY29tcG5vXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCA9ICppX2RhdGFwICsgKDEgPDwgKGNicHMgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEQyBsZXZlbCBzaGlmdCBhbmQgY2xpcCBzZWUgSVNPIDE1NDQ0LTE6MjAwMiBHLjEuMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gYXZfY2xpcCh2YWwsIDAsICgxIDw8IGNicHMpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGlnbiAxMiBiaXQgdmFsdWVzIGluIGxpdHRsZS1lbmRpYW4gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmRzdCA9IHZhbCA8PCAoMTYgLSBjYnBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlfZGF0YXArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBwaXhlbHNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZWwgKz0gcGljdHVyZS0+bGluZXNpemVbcGxhbmVdID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQganBlZzIwMDBfZGVjX2NsZWFudXAoSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcykKK3sKKyAgICBpbnQgdGlsZW5vLCBjb21wbm87CisgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBzLT5udW1YdGlsZXMgKiBzLT5udW1ZdGlsZXM7IHRpbGVubysrKSB7CisgICAgICAgIGlmIChzLT50aWxlW3RpbGVub10uY29tcCkgeworICAgICAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBzLT5uY29tcG9uZW50czsgY29tcG5vKyspIHsKKyAgICAgICAgICAgICAgICBKcGVnMjAwMENvbXBvbmVudCAqY29tcCAgICAgPSBzLT50aWxlW3RpbGVub10uY29tcCAgICsgY29tcG5vOworICAgICAgICAgICAgICAgIEpwZWcyMDAwQ29kaW5nU3R5bGUgKmNvZHN0eSA9IHMtPnRpbGVbdGlsZW5vXS5jb2RzdHkgKyBjb21wbm87CisKKyAgICAgICAgICAgICAgICBmZl9qcGVnMjAwMF9jbGVhbnVwKGNvbXAsIGNvZHN0eSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+dGlsZVt0aWxlbm9dLmNvbXApOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWVwKCZzLT50aWxlKTsKKyAgICBtZW1zZXQocy0+Y29kc3R5LCAwLCBzaXplb2Yocy0+Y29kc3R5KSk7CisgICAgbWVtc2V0KHMtPnFudHN0eSwgMCwgc2l6ZW9mKHMtPnFudHN0eSkpOworICAgIHMtPm51bVh0aWxlcyA9IHMtPm51bVl0aWxlcyA9IDA7Cit9CisKK3N0YXRpYyBpbnQganBlZzIwMDBfcmVhZF9tYWluX2hlYWRlcnMoSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcykKK3sKKyAgICBKcGVnMjAwMENvZGluZ1N0eWxlICpjb2RzdHkgPSBzLT5jb2RzdHk7CisgICAgSnBlZzIwMDBRdWFudFN0eWxlICpxbnRzdHkgID0gcy0+cW50c3R5OworICAgIHVpbnQ4X3QgKnByb3BlcnRpZXMgICAgICAgICA9IHMtPnByb3BlcnRpZXM7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBsZW4sIHJldCA9IDA7CisgICAgICAgIHVpbnQxNl90IG1hcmtlcjsKKyAgICAgICAgaW50IG9sZHBvczsKKworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpIDwgMikgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIEVPQ1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1hcmtlciA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmcy0+Zyk7CisgICAgICAgIG9sZHBvcyA9IGJ5dGVzdHJlYW0yX3RlbGwoJnMtPmcpOworCisgICAgICAgIGlmIChtYXJrZXIgPT0gSlBFRzIwMDBfU09EKSB7CisgICAgICAgICAgICBKcGVnMjAwMFRpbGUgKnRpbGU7CisgICAgICAgICAgICBKcGVnMjAwMFRpbGVQYXJ0ICp0cDsKKworICAgICAgICAgICAgaWYgKCFzLT50aWxlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIFNJWlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+Y3VydGlsZW5vIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBTT1RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aWxlID0gcy0+dGlsZSArIHMtPmN1cnRpbGVubzsKKyAgICAgICAgICAgIHRwID0gdGlsZS0+dGlsZV9wYXJ0ICsgdGlsZS0+dHBfaWR4OworICAgICAgICAgICAgaWYgKHRwLT50cF9lbmQgPCBzLT5nLmJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCB0cGVuZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZ0cC0+dHBnLCBzLT5nLmJ1ZmZlciwgdHAtPnRwX2VuZCAtIHMtPmcuYnVmZmVyKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmcsIHRwLT50cF9lbmQgLSBzLT5nLmJ1ZmZlcik7CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChtYXJrZXIgPT0gSlBFRzIwMDBfRU9DKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJnMtPmcpOworICAgICAgICBpZiAobGVuIDwgMiB8fCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPCBsZW4gLSAyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgc3dpdGNoIChtYXJrZXIpIHsKKyAgICAgICAgY2FzZSBKUEVHMjAwMF9TSVo6CisgICAgICAgICAgICByZXQgPSBnZXRfc2l6KHMpOworICAgICAgICAgICAgaWYgKCFzLT50aWxlKQorICAgICAgICAgICAgICAgIHMtPm51bVh0aWxlcyA9IHMtPm51bVl0aWxlcyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBKUEVHMjAwMF9DT0M6CisgICAgICAgICAgICByZXQgPSBnZXRfY29jKHMsIGNvZHN0eSwgcHJvcGVydGllcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBKUEVHMjAwMF9DT0Q6CisgICAgICAgICAgICByZXQgPSBnZXRfY29kKHMsIGNvZHN0eSwgcHJvcGVydGllcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBKUEVHMjAwMF9RQ0M6CisgICAgICAgICAgICByZXQgPSBnZXRfcWNjKHMsIGxlbiwgcW50c3R5LCBwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEpQRUcyMDAwX1FDRDoKKyAgICAgICAgICAgIHJldCA9IGdldF9xY2QocywgbGVuLCBxbnRzdHksIHByb3BlcnRpZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSlBFRzIwMDBfU09UOgorICAgICAgICAgICAgaWYgKCEocmV0ID0gZ2V0X3NvdChzLCBsZW4pKSkgeworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDEocy0+Y3VydGlsZW5vID49IDApOworICAgICAgICAgICAgICAgIGNvZHN0eSA9IHMtPnRpbGVbcy0+Y3VydGlsZW5vXS5jb2RzdHk7CisgICAgICAgICAgICAgICAgcW50c3R5ID0gcy0+dGlsZVtzLT5jdXJ0aWxlbm9dLnFudHN0eTsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gcy0+dGlsZVtzLT5jdXJ0aWxlbm9dLnByb3BlcnRpZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBKUEVHMjAwMF9DT006CisgICAgICAgICAgICAvLyB0aGUgY29tbWVudCBpcyBpZ25vcmVkCisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nLCBsZW4gLSAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEpQRUcyMDAwX1RMTToKKyAgICAgICAgICAgIC8vIFRpbGUtcGFydCBsZW5ndGhzCisgICAgICAgICAgICByZXQgPSBnZXRfdGxtKHMsIGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBtYXJrZXIgMHglLjQiUFJJWDE2IiBhdCBwb3MgMHglWFxuIiwKKyAgICAgICAgICAgICAgICAgICBtYXJrZXIsIGJ5dGVzdHJlYW0yX3RlbGwoJnMtPmcpIC0gNCk7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nLCBsZW4gLSAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsKCZzLT5nKSAtIG9sZHBvcyAhPSBsZW4gfHwgcmV0KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiZXJyb3IgZHVyaW5nIHByb2Nlc3NpbmcgbWFya2VyIHNlZ21lbnQgJS40IlBSSXgxNiJcbiIsCisgICAgICAgICAgICAgICAgICAgbWFya2VyKTsKKyAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogUmVhZCBiaXQgc3RyZWFtIHBhY2tldHMgLS0+IFQyIG9wZXJhdGlvbi4gKi8KK3N0YXRpYyBpbnQganBlZzIwMDBfcmVhZF9iaXRzdHJlYW1fcGFja2V0cyhKcGVnMjAwMERlY29kZXJDb250ZXh0ICpzKQoreworICAgIGludCByZXQgPSAwOworICAgIGludCB0aWxlbm87CisKKyAgICBmb3IgKHRpbGVubyA9IDA7IHRpbGVubyA8IHMtPm51bVh0aWxlcyAqIHMtPm51bVl0aWxlczsgdGlsZW5vKyspIHsKKyAgICAgICAgSnBlZzIwMDBUaWxlICp0aWxlID0gcy0+dGlsZSArIHRpbGVubzsKKworICAgICAgICBpZiAocmV0ID0gaW5pdF90aWxlKHMsIHRpbGVubykpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHMtPmcgPSB0aWxlLT50aWxlX3BhcnRbMF0udHBnOworICAgICAgICBpZiAocmV0ID0ganBlZzIwMDBfZGVjb2RlX3BhY2tldHMocywgdGlsZSkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpwMl9maW5kX2NvZGVzdHJlYW0oSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcykKK3sKKyAgICB1aW50MzJfdCBhdG9tX3NpemUsIGF0b20sIGF0b21fZW5kOworICAgIGludCBzZWFyY2hfcmFuZ2UgPSAxMDsKKworICAgIHdoaWxlIChzZWFyY2hfcmFuZ2UKKyAgICAgICAgICAgJiYKKyAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpID49IDgpIHsKKyAgICAgICAgYXRvbV9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZzLT5nKTsKKyAgICAgICAgYXRvbSAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZzLT5nKTsKKyAgICAgICAgYXRvbV9lbmQgID0gYnl0ZXN0cmVhbTJfdGVsbCgmcy0+ZykgKyBhdG9tX3NpemUgLSA4OworCisgICAgICAgIGlmIChhdG9tID09IEpQMl9DT0RFU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSA8IGF0b21fc2l6ZSB8fCBhdG9tX2VuZCA8IGF0b21fc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChhdG9tID09IEpQMl9IRUFERVIgJiYKKyAgICAgICAgICAgICAgICAgICBhdG9tX3NpemUgPj0gMTYpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGF0b20yX3NpemUsIGF0b20yLCBhdG9tMl9lbmQ7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgYXRvbTJfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmcy0+Zyk7CisgICAgICAgICAgICAgICAgYXRvbTIgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmcy0+Zyk7CisgICAgICAgICAgICAgICAgYXRvbTJfZW5kICA9IGJ5dGVzdHJlYW0yX3RlbGwoJnMtPmcpICsgYXRvbTJfc2l6ZSAtIDg7CisgICAgICAgICAgICAgICAgaWYgKGF0b20yX3NpemUgPCA4IHx8IGF0b20yX2VuZCA+IGF0b21fZW5kIHx8IGF0b20yX2VuZCA8IGF0b20yX3NpemUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChhdG9tMiA9PSBKUDJfQ09ERVNUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0b20yID09IE1LQkVUQUcoJ2MnLCdvJywnbCcsJ3InKSAmJiBhdG9tMl9zaXplID49IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Zyk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZzLT5nLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb2xvdXJfc3BhY2UgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJnMtPmcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdG9tMiA9PSBNS0JFVEFHKCdwJywnYycsJ2wnLCdyJykgJiYgYXRvbTJfc2l6ZSA+PSA2KSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpLCBzaXplLCBjb2xvdXJfY291bnQsIGNvbG91cl9jaGFubmVscywgY29sb3VyX2RlcHRoWzNdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByLCBnLCBiOworICAgICAgICAgICAgICAgICAgICBjb2xvdXJfY291bnQgPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJnMtPmcpOworICAgICAgICAgICAgICAgICAgICBjb2xvdXJfY2hhbm5lbHMgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmcpOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogRG8gbm90IGlnbm9yZSBjaGFubmVsX3NpZ24KKyAgICAgICAgICAgICAgICAgICAgY29sb3VyX2RlcHRoWzBdID0gKGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+ZykgJiAweDdmKSArIDE7CisgICAgICAgICAgICAgICAgICAgIGNvbG91cl9kZXB0aFsxXSA9IChieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmcpICYgMHg3ZikgKyAxOworICAgICAgICAgICAgICAgICAgICBjb2xvdXJfZGVwdGhbMl0gPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKSAmIDB4N2YpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IChjb2xvdXJfZGVwdGhbMF0gKyA3ID4+IDMpICogY29sb3VyX2NvdW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvdXJfZGVwdGhbMV0gKyA3ID4+IDMpICogY29sb3VyX2NvdW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvdXJfZGVwdGhbMl0gKyA3ID4+IDMpICogY29sb3VyX2NvdW50OworICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3VyX2NvdW50ID4gMjU2ICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91cl9jaGFubmVscyAhPSAzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJfZGVwdGhbMF0gPiAxNiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyX2RlcHRoWzFdID4gMTYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91cl9kZXB0aFsyXSA+IDE2IHx8CisgICAgICAgICAgICAgICAgICAgICAgICBhdG9tMl9zaXplIDwgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiVW5rbm93biBwYWxldHRlIik7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nLCBhdG9tMl9lbmQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMtPnBhbDggPSAxOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3VyX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvdXJfZGVwdGhbMF0gPD0gOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmcpIDw8IDggLSBjb2xvdXJfZGVwdGhbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgciB8PSByID4+IGNvbG91cl9kZXB0aFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmcy0+ZykgPj4gY29sb3VyX2RlcHRoWzBdIC0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvdXJfZGVwdGhbMV0gPD0gOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmcpIDw8IDggLSBjb2xvdXJfZGVwdGhbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgciB8PSByID4+IGNvbG91cl9kZXB0aFsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmcy0+ZykgPj4gY29sb3VyX2RlcHRoWzFdIC0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvdXJfZGVwdGhbMl0gPD0gOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmcpIDw8IDggLSBjb2xvdXJfZGVwdGhbMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgciB8PSByID4+IGNvbG91cl9kZXB0aFsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmcy0+ZykgPj4gY29sb3VyX2RlcHRoWzJdIC0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBhbGV0dGVbaV0gPSAweGZmdSA8PCAyNCB8IHIgPDwgMTYgfCBnIDw8IDggfCBiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdG9tMiA9PSBNS0JFVEFHKCdjJywnZCcsJ2UnLCdmJykgJiYgYXRvbTJfc2l6ZSA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZzLT5nKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IG4+MDsgbi0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY24gICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZzLT5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdl91bnVzZWQgdHlwICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZzLT5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhc29jID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJnMtPmcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNuIDwgNCB8fCBhc29jIDwgNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jZGVmW2NuXSA9IGFzb2M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2Vlaygmcy0+ZywgYXRvbTJfZW5kLCBTRUVLX1NFVCk7CisgICAgICAgICAgICB9IHdoaWxlIChhdG9tX2VuZCAtIGF0b20yX2VuZCA+PSA4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlYXJjaF9yYW5nZS0tOworICAgICAgICB9CisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJnMtPmcsIGF0b21fZW5kLCBTRUVLX1NFVCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBqcGVnMjAwMF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmZl9qcGVnMjAwMGRzcF9pbml0KCZzLT5kc3ApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQganBlZzIwMDBfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVGhyZWFkRnJhbWUgZnJhbWUgPSB7IC5mID0gZGF0YSB9OworICAgIEFWRnJhbWUgKnBpY3R1cmUgPSBkYXRhOworICAgIGludCB0aWxlbm8sIHJldDsKKworICAgIHMtPmF2Y3R4ICAgICA9IGF2Y3R4OworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmcsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisgICAgcy0+Y3VydGlsZW5vID0gLTE7CisgICAgbWVtc2V0KHMtPmNkZWYsIC0xLCBzaXplb2Yocy0+Y2RlZikpOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSA8IDIpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLy8gY2hlY2sgaWYgdGhlIGltYWdlIGlzIGluIGpwMiBmb3JtYXQKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpID49IDEyICYmCisgICAgICAgKGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmcy0+ZykgPT0gMTIpICYmCisgICAgICAgKGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmcy0+ZykgPT0gSlAyX1NJR19UWVBFKSAmJgorICAgICAgIChieXRlc3RyZWFtMl9nZXRfYmUzMnUoJnMtPmcpID09IEpQMl9TSUdfVkFMVUUpKSB7CisgICAgICAgIGlmICghanAyX2ZpbmRfY29kZXN0cmVhbShzKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIEpwZWcyMDAwIGNvZGVzdHJlYW0gYXRvbS5cbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2Vlaygmcy0+ZywgMCwgU0VFS19TRVQpOworICAgIH0KKworICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPj0gMyAmJiBieXRlc3RyZWFtMl9wZWVrX2JlMTYoJnMtPmcpICE9IEpQRUcyMDAwX1NPQykKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+ZywgMSk7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZzLT5nKSAhPSBKUEVHMjAwMF9TT0MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTT0MgbWFya2VyIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmIChyZXQgPSBqcGVnMjAwMF9yZWFkX21haW5faGVhZGVycyhzKSkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICAvKiBnZXQgcGljdHVyZSBidWZmZXIgKi8KKyAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmZnJhbWUsIDApKSA8IDApCisgICAgICAgIGdvdG8gZW5kOworICAgIHBpY3R1cmUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIHBpY3R1cmUtPmtleV9mcmFtZSA9IDE7CisKKyAgICBpZiAocmV0ID0ganBlZzIwMDBfcmVhZF9iaXRzdHJlYW1fcGFja2V0cyhzKSkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBmb3IgKHRpbGVubyA9IDA7IHRpbGVubyA8IHMtPm51bVh0aWxlcyAqIHMtPm51bVl0aWxlczsgdGlsZW5vKyspCisgICAgICAgIGlmIChyZXQgPSBqcGVnMjAwMF9kZWNvZGVfdGlsZShzLCBzLT50aWxlICsgdGlsZW5vLCBwaWN0dXJlKSkKKyAgICAgICAgICAgIGdvdG8gZW5kOworCisgICAganBlZzIwMDBfZGVjX2NsZWFudXAocyk7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIGlmIChzLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpCisgICAgICAgIG1lbWNweShwaWN0dXJlLT5kYXRhWzFdLCBzLT5wYWxldHRlLCAyNTYgKiBzaXplb2YodWludDMyX3QpKTsKKworICAgIHJldHVybiBieXRlc3RyZWFtMl90ZWxsKCZzLT5nKTsKKworZW5kOgorICAgIGpwZWcyMDAwX2RlY19jbGVhbnVwKHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQganBlZzIwMDBfaW5pdF9zdGF0aWNfZGF0YShBVkNvZGVjICpjb2RlYykKK3sKKyAgICBmZl9qcGVnMjAwMF9pbml0X3RpZXIxX2x1dHMoKTsKKyAgICBmZl9tcWNfaW5pdF9jb250ZXh0X3RhYmxlcygpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihKcGVnMjAwMERlY29kZXJDb250ZXh0LCB4KQorI2RlZmluZSBWRCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAibG93cmVzIiwgICJMb3dlciB0aGUgZGVjb2RpbmcgcmVzb2x1dGlvbiBieSBhIHBvd2VyIG9mIHR3byIsCisgICAgICAgIE9GRlNFVChyZWR1Y3Rpb25fZmFjdG9yKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIEpQRUcyMDAwX01BWF9SRVNMRVZFTFMgLSAxLCBWRCB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWUHJvZmlsZSBwcm9maWxlc1tdID0geworICAgIHsgRkZfUFJPRklMRV9KUEVHMjAwMF9DU1RSRUFNX1JFU1RSSUNUSU9OXzAsICAiSlBFRyAyMDAwIGNvZGVzdHJlYW0gcmVzdHJpY3Rpb24gMCIgICB9LAorICAgIHsgRkZfUFJPRklMRV9KUEVHMjAwMF9DU1RSRUFNX1JFU1RSSUNUSU9OXzEsICAiSlBFRyAyMDAwIGNvZGVzdHJlYW0gcmVzdHJpY3Rpb24gMSIgICB9LAorICAgIHsgRkZfUFJPRklMRV9KUEVHMjAwMF9DU1RSRUFNX05PX1JFU1RSSUNUSU9OLCAiSlBFRyAyMDAwIG5vIGNvZGVzdHJlYW0gcmVzdHJpY3Rpb25zIiB9LAorICAgIHsgRkZfUFJPRklMRV9KUEVHMjAwMF9EQ0lORU1BXzJLLCAgICAgICAgICAgICAiSlBFRyAyMDAwIGRpZ2l0YWwgY2luZW1hIDJLIiAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9KUEVHMjAwMF9EQ0lORU1BXzRLLCAgICAgICAgICAgICAiSlBFRyAyMDAwIGRpZ2l0YWwgY2luZW1hIDRLIiAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9VTktOT1dOIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBqcGVnMjAwMF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJqcGVnMjAwMCIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2pwZWcyMDAwX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAianBlZzIwMDAiLAorICAgIC5sb25nX25hbWUgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkpQRUcgMjAwMCIpLAorICAgIC50eXBlICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSlBFRzIwMDAsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihKcGVnMjAwMERlY29kZXJDb250ZXh0KSwKKyAgICAuaW5pdF9zdGF0aWNfZGF0YSA9IGpwZWcyMDAwX2luaXRfc3RhdGljX2RhdGEsCisgICAgLmluaXQgICAgICAgICAgICAgPSBqcGVnMjAwMF9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgICA9IGpwZWcyMDAwX2RlY29kZV9mcmFtZSwKKyAgICAucHJpdl9jbGFzcyAgICAgICA9ICZqcGVnMjAwMF9jbGFzcywKKyAgICAubWF4X2xvd3JlcyAgICAgICA9IDUsCisgICAgLnByb2ZpbGVzICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChwcm9maWxlcykKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9qcGVnMjAwMGRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvanBlZzIwMDBkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2M3ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvanBlZzIwMDBkc3AuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICogSlBFRyAyMDAwIERTUCBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwNyBLYW1pbCBOb3dvc2FkCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTmljb2xhcyBCZXJ0cmFuZCA8bmljb2luYXR0ZW5kdUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImpwZWcyMDAwZHNwLmgiCisKKy8qIEludmVyc2UgSUNUIHBhcmFtZXRlcnMgaW4gZmxvYXQgYW5kIGludGVnZXIuCisgKiBpbnQgdmFsdWUgPSAoZmxvYXQgdmFsdWUpICogKDE8PDE2KSAqLworc3RhdGljIGNvbnN0IGZsb2F0IGZfaWN0X3BhcmFtc1s0XSA9IHsKKyAgICAxLjQwMmYsCisgICAgMC4zNDQxM2YsCisgICAgMC43MTQxNGYsCisgICAgMS43NzJmCit9OworCitzdGF0aWMgY29uc3QgaW50IGlfaWN0X3BhcmFtc1s0XSA9IHsKKyAgICAgOTE4ODEsCisgICAgIDIyNTUzLAorICAgICA0NjgwMiwKKyAgICAxMTYxMzAKK307CisKK3N0YXRpYyB2b2lkIGljdF9mbG9hdCh2b2lkICpfc3JjMCwgdm9pZCAqX3NyYzEsIHZvaWQgKl9zcmMyLCBpbnQgY3NpemUpCit7CisgICAgZmxvYXQgKnNyYzAgPSBfc3JjMCwgKnNyYzEgPSBfc3JjMSwgKnNyYzIgPSBfc3JjMjsKKyAgICBmbG9hdCBpMGYsIGkxZiwgaTJmOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNzaXplOyBpKyspIHsKKyAgICAgICAgaTBmID0gKnNyYzAgKyAoZl9pY3RfcGFyYW1zWzBdICogKnNyYzIpOworICAgICAgICBpMWYgPSAqc3JjMCAtIChmX2ljdF9wYXJhbXNbMV0gKiAqc3JjMSkKKyAgICAgICAgICAgICAgICAgICAgLSAoZl9pY3RfcGFyYW1zWzJdICogKnNyYzIpOworICAgICAgICBpMmYgPSAqc3JjMCArIChmX2ljdF9wYXJhbXNbM10gKiAqc3JjMSk7CisgICAgICAgICpzcmMwKysgPSBpMGY7CisgICAgICAgICpzcmMxKysgPSBpMWY7CisgICAgICAgICpzcmMyKysgPSBpMmY7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpY3RfaW50KHZvaWQgKl9zcmMwLCB2b2lkICpfc3JjMSwgdm9pZCAqX3NyYzIsIGludCBjc2l6ZSkKK3sKKyAgICBpbnQzMl90ICpzcmMwID0gX3NyYzAsICpzcmMxID0gX3NyYzEsICpzcmMyID0gX3NyYzI7CisgICAgaW50MzJfdCBpMCwgaTEsIGkyOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNzaXplOyBpKyspIHsKKyAgICAgICAgaTAgPSAqc3JjMCArICgoKGlfaWN0X3BhcmFtc1swXSAqICpzcmMyKSArICgxIDw8IDE1KSkgPj4gMTYpOworICAgICAgICBpMSA9ICpzcmMwIC0gKCgoaV9pY3RfcGFyYW1zWzFdICogKnNyYzEpICsgKDEgPDwgMTUpKSA+PiAxNikKKyAgICAgICAgICAgICAgICAgICAtICgoKGlfaWN0X3BhcmFtc1syXSAqICpzcmMyKSArICgxIDw8IDE1KSkgPj4gMTYpOworICAgICAgICBpMiA9ICpzcmMwICsgKCgoaV9pY3RfcGFyYW1zWzNdICogKnNyYzEpICsgKDEgPDwgMTUpKSA+PiAxNik7CisgICAgICAgICpzcmMwKysgPSBpMDsKKyAgICAgICAgKnNyYzErKyA9IGkxOworICAgICAgICAqc3JjMisrID0gaTI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByY3RfaW50KHZvaWQgKl9zcmMwLCB2b2lkICpfc3JjMSwgdm9pZCAqX3NyYzIsIGludCBjc2l6ZSkKK3sKKyAgICBpbnQzMl90ICpzcmMwID0gX3NyYzAsICpzcmMxID0gX3NyYzEsICpzcmMyID0gX3NyYzI7CisgICAgaW50MzJfdCBpMCwgaTEsIGkyOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNzaXplOyBpKyspIHsKKyAgICAgICAgaTEgPSAqc3JjMCAtICgqc3JjMiArICpzcmMxID4+IDIpOworICAgICAgICBpMCA9IGkxICsgKnNyYzI7CisgICAgICAgIGkyID0gaTEgKyAqc3JjMTsKKyAgICAgICAgKnNyYzArKyA9IGkwOworICAgICAgICAqc3JjMSsrID0gaTE7CisgICAgICAgICpzcmMyKysgPSBpMjsKKyAgICB9Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9qcGVnMjAwMGRzcF9pbml0KEpwZWcyMDAwRFNQQ29udGV4dCAqYykKK3sKKyAgICBjLT5tY3RfZGVjb2RlW0ZGX0RXVDk3XSAgICAgPSBpY3RfZmxvYXQ7CisgICAgYy0+bWN0X2RlY29kZVtGRl9EV1Q1M10gICAgID0gcmN0X2ludDsKKyAgICBjLT5tY3RfZGVjb2RlW0ZGX0RXVDk3X0lOVF0gPSBpY3RfaW50OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvanBlZzIwMDBkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2pwZWcyMDAwZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxZGRiOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2pwZWcyMDAwZHNwLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIEpQRUcgMjAwMCBEU1AgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS2FtaWwgTm93b3NhZAorICogQ29weXJpZ2h0IChjKSAyMDEzIE5pY29sYXMgQmVydHJhbmQgPG5pY29pbmF0dGVuZHVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSlBFRzIwMDBEU1BfSAorI2RlZmluZSBBVkNPREVDX0pQRUcyMDAwRFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImpwZWcyMDAwZHd0LmgiCisKK3R5cGVkZWYgc3RydWN0IEpwZWcyMDAwRFNQQ29udGV4dCB7CisgICAgdm9pZCAoKm1jdF9kZWNvZGVbRkZfRFdUX05CXSkodm9pZCAqc3JjMCwgdm9pZCAqc3JjMSwgdm9pZCAqc3JjMiwgaW50IGNzaXplKTsKK30gSnBlZzIwMDBEU1BDb250ZXh0OworCit2b2lkIGZmX2pwZWcyMDAwZHNwX2luaXQoSnBlZzIwMDBEU1BDb250ZXh0ICpjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSlBFRzIwMDBEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvanBlZzIwMDBkd3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2pwZWcyMDAwZHd0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjZWRhMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2pwZWcyMDAwZHd0LmMKQEAgLTAsMCArMSw1NzggQEAKKy8qCisgKiBEaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybQorICogQ29weXJpZ2h0IChjKSAyMDA3IEthbWlsIE5vd29zYWQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBOaWNvbGFzIEJlcnRyYW5kIDxuaWNvaW5hdHRlbmR1QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRGlzY3JldGUgd2F2ZWxldCB0cmFuc2Zvcm0KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJqcGVnMjAwMGR3dC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qIERlZmluZXMgZm9yIDkvNyBEV1QgbGlmdGluZyBwYXJhbWV0ZXJzLgorICogUGFyYW1ldGVycyBhcmUgaW4gZmxvYXQuICovCisjZGVmaW5lIEZfTEZUR19BTFBIQSAgMS41ODYxMzQzNDIwNTk5MjRmCisjZGVmaW5lIEZfTEZUR19CRVRBICAgMC4wNTI5ODAxMTg1NzI5NjFmCisjZGVmaW5lIEZfTEZUR19HQU1NQSAgMC44ODI5MTEwNzU1MzA5MzRmCisjZGVmaW5lIEZfTEZUR19ERUxUQSAgMC40NDM1MDY4NTIwNDM5NzFmCisjZGVmaW5lIEZfTEZUR19LICAgICAgMS4yMzAxNzQxMDQ5MTQwMDFmCisjZGVmaW5lIEZfTEZUR19YICAgICAgMS42MjU3MzI0MjJmCisvKiBGSVhNRTogV2h5IHVzZSAxLjYyNTczMjQyMiBpbnN0ZWFkIG9mIDEvRl9MRlRHX0s/CisgKiBJbmNvcnJlY3QgdmFsdWUgaW4gSlBFRzIwMDAgbm9ybS4KKyAqIHNlZSAoSVNPL0lFQyAxNTQ0NDoxICh2ZXJzaW9uIDIwMDIpIEYuMy44LjIgKi8KKworLyogTGlmdGluZyBwYXJhbWV0ZXJzIGluIGludGVnZXIgZm9ybWF0LgorICogQ29tcHV0ZWQgYXMgcGFyYW0gPSAoZmxvYXQgcGFyYW0pICogKDEgPDwgMTYpICovCisjZGVmaW5lIElfTEZUR19BTFBIQSAgMTAzOTQ5CisjZGVmaW5lIElfTEZUR19CRVRBICAgICAzNDcyCisjZGVmaW5lIElfTEZUR19HQU1NQSAgIDU3ODYyCisjZGVmaW5lIElfTEZUR19ERUxUQSAgIDI5MDY2CisjZGVmaW5lIElfTEZUR19LICAgICAgIDgwNjIxCisjZGVmaW5lIElfTEZUR19YICAgICAgMTA2NTQ0CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHRlbmQ1MyhpbnQgKnAsIGludCBpMCwgaW50IGkxKQoreworICAgIHBbaTAgLSAxXSA9IHBbaTAgKyAxXTsKKyAgICBwW2kxXSAgICAgPSBwW2kxIC0gMl07CisgICAgcFtpMCAtIDJdID0gcFtpMCArIDJdOworICAgIHBbaTEgKyAxXSA9IHBbaTEgLSAzXTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4dGVuZDk3X2Zsb2F0KGZsb2F0ICpwLCBpbnQgaTAsIGludCBpMSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDE7IGkgPD0gNDsgaSsrKSB7CisgICAgICAgIHBbaTAgLSBpXSAgICAgPSBwW2kwICsgaV07CisgICAgICAgIHBbaTEgKyBpIC0gMV0gPSBwW2kxIC0gaSAtIDFdOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4dGVuZDk3X2ludChpbnQzMl90ICpwLCBpbnQgaTAsIGludCBpMSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDE7IGkgPD0gNDsgaSsrKSB7CisgICAgICAgIHBbaTAgLSBpXSAgICAgPSBwW2kwICsgaV07CisgICAgICAgIHBbaTEgKyBpIC0gMV0gPSBwW2kxIC0gaSAtIDFdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2RfMWQ1MyhpbnQgKnAsIGludCBpMCwgaW50IGkxKQoreworICAgIGludCBpOworCisgICAgaWYgKGkxID09IGkwICsgMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZXh0ZW5kNTMocCwgaTAsIGkxKTsKKworICAgIGZvciAoaSA9IChpMCsxKS8yIC0gMTsgaSA8IChpMSsxKS8yOyBpKyspCisgICAgICAgIHBbMippKzFdIC09IChwWzIqaV0gKyBwWzIqaSsyXSkgPj4gMTsKKyAgICBmb3IgKGkgPSAoaTArMSkvMjsgaSA8IChpMSsxKS8yOyBpKyspCisgICAgICAgIHBbMippXSArPSAocFsyKmktMV0gKyBwWzIqaSsxXSArIDIpID4+IDI7Cit9CisKK3N0YXRpYyB2b2lkIGR3dF9lbmNvZGU1MyhEV1RDb250ZXh0ICpzLCBpbnQgKnQpCit7CisgICAgaW50IGxldiwKKyAgICAgICAgdyA9IHMtPmxpbmVsZW5bcy0+bmRlY2xldmVscy0xXVswXTsKKyAgICBpbnQgKmxpbmUgPSBzLT5pX2xpbmVidWY7CisgICAgbGluZSArPSAzOworCisgICAgZm9yIChsZXYgPSBzLT5uZGVjbGV2ZWxzLTE7IGxldiA+PSAwOyBsZXYtLSl7CisgICAgICAgIGludCBsaCA9IHMtPmxpbmVsZW5bbGV2XVswXSwKKyAgICAgICAgICAgIGx2ID0gcy0+bGluZWxlbltsZXZdWzFdLAorICAgICAgICAgICAgbWggPSBzLT5tb2RbbGV2XVswXSwKKyAgICAgICAgICAgIG12ID0gcy0+bW9kW2xldl1bMV0sCisgICAgICAgICAgICBscDsKKyAgICAgICAgaW50ICpsOworCisgICAgICAgIC8vIEhPUl9TRAorICAgICAgICBsID0gbGluZSArIG1oOworICAgICAgICBmb3IgKGxwID0gMDsgbHAgPCBsdjsgbHArKyl7CisgICAgICAgICAgICBpbnQgaSwgaiA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaDsgaSsrKQorICAgICAgICAgICAgICAgIGxbaV0gPSB0W3cqbHAgKyBpXTsKKworICAgICAgICAgICAgc2RfMWQ1MyhsaW5lLCBtaCwgbWggKyBsaCk7CisKKyAgICAgICAgICAgIC8vIGNvcHkgYmFjayBhbmQgZGVpbnRlcmxlYXZlCisgICAgICAgICAgICBmb3IgKGkgPSAgIG1oOyBpIDwgbGg7IGkrPTIsIGorKykKKyAgICAgICAgICAgICAgICB0W3cqbHAgKyBqXSA9IGxbaV07CisgICAgICAgICAgICBmb3IgKGkgPSAxLW1oOyBpIDwgbGg7IGkrPTIsIGorKykKKyAgICAgICAgICAgICAgICB0W3cqbHAgKyBqXSA9IGxbaV07CisgICAgICAgIH0KKworICAgICAgICAvLyBWRVJfU0QKKyAgICAgICAgbCA9IGxpbmUgKyBtdjsKKyAgICAgICAgZm9yIChscCA9IDA7IGxwIDwgbGg7IGxwKyspIHsKKyAgICAgICAgICAgIGludCBpLCBqID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGx2OyBpKyspCisgICAgICAgICAgICAgICAgbFtpXSA9IHRbdyppICsgbHBdOworCisgICAgICAgICAgICBzZF8xZDUzKGxpbmUsIG12LCBtdiArIGx2KTsKKworICAgICAgICAgICAgLy8gY29weSBiYWNrIGFuZCBkZWludGVybGVhdmUKKyAgICAgICAgICAgIGZvciAoaSA9ICAgbXY7IGkgPCBsdjsgaSs9MiwgaisrKQorICAgICAgICAgICAgICAgIHRbdypqICsgbHBdID0gbFtpXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDEtbXY7IGkgPCBsdjsgaSs9MiwgaisrKQorICAgICAgICAgICAgICAgIHRbdypqICsgbHBdID0gbFtpXTsKKyAgICAgICAgfQorICAgIH0KK30KK3N0YXRpYyB2b2lkIHNkXzFkOTdfZmxvYXQoZmxvYXQgKnAsIGludCBpMCwgaW50IGkxKQoreworICAgIGludCBpOworCisgICAgaWYgKGkxID09IGkwICsgMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZXh0ZW5kOTdfZmxvYXQocCwgaTAsIGkxKTsKKyAgICBpMCsrOyBpMSsrOworCisgICAgZm9yIChpID0gaTAvMiAtIDI7IGkgPCBpMS8yICsgMTsgaSsrKQorICAgICAgICBwWzIqaSsxXSAtPSAxLjU4NjEzNCAqIChwWzIqaV0gKyBwWzIqaSsyXSk7CisgICAgZm9yIChpID0gaTAvMiAtIDE7IGkgPCBpMS8yICsgMTsgaSsrKQorICAgICAgICBwWzIqaV0gLT0gMC4wNTI5ODAgKiAocFsyKmktMV0gKyBwWzIqaSsxXSk7CisgICAgZm9yIChpID0gaTAvMiAtIDE7IGkgPCBpMS8yOyBpKyspCisgICAgICAgIHBbMippKzFdICs9IDAuODgyOTExICogKHBbMippXSArIHBbMippKzJdKTsKKyAgICBmb3IgKGkgPSBpMC8yOyBpIDwgaTEvMjsgaSsrKQorICAgICAgICBwWzIqaV0gKz0gMC40NDM1MDYgKiAocFsyKmktMV0gKyBwWzIqaSsxXSk7Cit9CisKK3N0YXRpYyB2b2lkIGR3dF9lbmNvZGU5N19mbG9hdChEV1RDb250ZXh0ICpzLCBmbG9hdCAqdCkKK3sKKyAgICBpbnQgbGV2LAorICAgICAgICB3ID0gcy0+bGluZWxlbltzLT5uZGVjbGV2ZWxzLTFdWzBdOworICAgIGZsb2F0ICpsaW5lID0gcy0+Zl9saW5lYnVmOworICAgIGxpbmUgKz0gNTsKKworICAgIGZvciAobGV2ID0gcy0+bmRlY2xldmVscy0xOyBsZXYgPj0gMDsgbGV2LS0peworICAgICAgICBpbnQgbGggPSBzLT5saW5lbGVuW2xldl1bMF0sCisgICAgICAgICAgICBsdiA9IHMtPmxpbmVsZW5bbGV2XVsxXSwKKyAgICAgICAgICAgIG1oID0gcy0+bW9kW2xldl1bMF0sCisgICAgICAgICAgICBtdiA9IHMtPm1vZFtsZXZdWzFdLAorICAgICAgICAgICAgbHA7CisgICAgICAgIGZsb2F0ICpsOworCisgICAgICAgIC8vIEhPUl9TRAorICAgICAgICBsID0gbGluZSArIG1oOworICAgICAgICBmb3IgKGxwID0gMDsgbHAgPCBsdjsgbHArKyl7CisgICAgICAgICAgICBpbnQgaSwgaiA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaDsgaSsrKQorICAgICAgICAgICAgICAgIGxbaV0gPSB0W3cqbHAgKyBpXTsKKworICAgICAgICAgICAgc2RfMWQ5N19mbG9hdChsaW5lLCBtaCwgbWggKyBsaCk7CisKKyAgICAgICAgICAgIC8vIGNvcHkgYmFjayBhbmQgZGVpbnRlcmxlYXZlCisgICAgICAgICAgICBmb3IgKGkgPSAgIG1oOyBpIDwgbGg7IGkrPTIsIGorKykKKyAgICAgICAgICAgICAgICB0W3cqbHAgKyBqXSA9IEZfTEZUR19YICogbFtpXSAvIDI7CisgICAgICAgICAgICBmb3IgKGkgPSAxLW1oOyBpIDwgbGg7IGkrPTIsIGorKykKKyAgICAgICAgICAgICAgICB0W3cqbHAgKyBqXSA9IEZfTEZUR19LICogbFtpXSAvIDI7CisgICAgICAgIH0KKworICAgICAgICAvLyBWRVJfU0QKKyAgICAgICAgbCA9IGxpbmUgKyBtdjsKKyAgICAgICAgZm9yIChscCA9IDA7IGxwIDwgbGg7IGxwKyspIHsKKyAgICAgICAgICAgIGludCBpLCBqID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGx2OyBpKyspCisgICAgICAgICAgICAgICAgbFtpXSA9IHRbdyppICsgbHBdOworCisgICAgICAgICAgICBzZF8xZDk3X2Zsb2F0KGxpbmUsIG12LCBtdiArIGx2KTsKKworICAgICAgICAgICAgLy8gY29weSBiYWNrIGFuZCBkZWludGVybGVhdmUKKyAgICAgICAgICAgIGZvciAoaSA9ICAgbXY7IGkgPCBsdjsgaSs9MiwgaisrKQorICAgICAgICAgICAgICAgIHRbdypqICsgbHBdID0gRl9MRlRHX1ggKiBsW2ldIC8gMjsKKyAgICAgICAgICAgIGZvciAoaSA9IDEtbXY7IGkgPCBsdjsgaSs9MiwgaisrKQorICAgICAgICAgICAgICAgIHRbdypqICsgbHBdID0gRl9MRlRHX0sgKiBsW2ldIC8gMjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc2RfMWQ5N19pbnQoaW50ICpwLCBpbnQgaTAsIGludCBpMSkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChpMSA9PSBpMCArIDEpCisgICAgICAgIHJldHVybjsKKworICAgIGV4dGVuZDk3X2ludChwLCBpMCwgaTEpOworICAgIGkwKys7IGkxKys7CisKKyAgICBmb3IgKGkgPSBpMC8yIC0gMjsgaSA8IGkxLzIgKyAxOyBpKyspCisgICAgICAgIHBbMiAqIGkgKyAxXSAtPSAoSV9MRlRHX0FMUEhBICogKHBbMiAqIGldICAgICArIHBbMiAqIGkgKyAyXSkgKyAoMSA8PCAxNSkpID4+IDE2OworICAgIGZvciAoaSA9IGkwLzIgLSAxOyBpIDwgaTEvMiArIDE7IGkrKykKKyAgICAgICAgcFsyICogaV0gICAgIC09IChJX0xGVEdfQkVUQSAgKiAocFsyICogaSAtIDFdICsgcFsyICogaSArIDFdKSArICgxIDw8IDE1KSkgPj4gMTY7CisgICAgZm9yIChpID0gaTAvMiAtIDE7IGkgPCBpMS8yOyBpKyspCisgICAgICAgIHBbMiAqIGkgKyAxXSArPSAoSV9MRlRHX0dBTU1BICogKHBbMiAqIGldICAgICArIHBbMiAqIGkgKyAyXSkgKyAoMSA8PCAxNSkpID4+IDE2OworICAgIGZvciAoaSA9IGkwLzI7IGkgPCBpMS8yOyBpKyspCisgICAgICAgIHBbMiAqIGldICAgICArPSAoSV9MRlRHX0RFTFRBICogKHBbMiAqIGkgLSAxXSArIHBbMiAqIGkgKyAxXSkgKyAoMSA8PCAxNSkpID4+IDE2OworfQorCitzdGF0aWMgdm9pZCBkd3RfZW5jb2RlOTdfaW50KERXVENvbnRleHQgKnMsIGludCAqdCkKK3sKKyAgICBpbnQgbGV2LAorICAgICAgICB3ID0gcy0+bGluZWxlbltzLT5uZGVjbGV2ZWxzLTFdWzBdOworICAgIGludCAqbGluZSA9IHMtPmlfbGluZWJ1ZjsKKyAgICBsaW5lICs9IDU7CisKKyAgICBmb3IgKGxldiA9IHMtPm5kZWNsZXZlbHMtMTsgbGV2ID49IDA7IGxldi0tKXsKKyAgICAgICAgaW50IGxoID0gcy0+bGluZWxlbltsZXZdWzBdLAorICAgICAgICAgICAgbHYgPSBzLT5saW5lbGVuW2xldl1bMV0sCisgICAgICAgICAgICBtaCA9IHMtPm1vZFtsZXZdWzBdLAorICAgICAgICAgICAgbXYgPSBzLT5tb2RbbGV2XVsxXSwKKyAgICAgICAgICAgIGxwOworICAgICAgICBpbnQgKmw7CisKKyAgICAgICAgLy8gSE9SX1NECisgICAgICAgIGwgPSBsaW5lICsgbWg7CisgICAgICAgIGZvciAobHAgPSAwOyBscCA8IGx2OyBscCsrKXsKKyAgICAgICAgICAgIGludCBpLCBqID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxoOyBpKyspCisgICAgICAgICAgICAgICAgbFtpXSA9IHRbdypscCArIGldOworCisgICAgICAgICAgICBzZF8xZDk3X2ludChsaW5lLCBtaCwgbWggKyBsaCk7CisKKyAgICAgICAgICAgIC8vIGNvcHkgYmFjayBhbmQgZGVpbnRlcmxlYXZlCisgICAgICAgICAgICBmb3IgKGkgPSAgIG1oOyBpIDwgbGg7IGkrPTIsIGorKykKKyAgICAgICAgICAgICAgICB0W3cqbHAgKyBqXSA9ICgobFtpXSAqIElfTEZUR19YKSArICgxIDw8IDE2KSkgPj4gMTc7CisgICAgICAgICAgICBmb3IgKGkgPSAxLW1oOyBpIDwgbGg7IGkrPTIsIGorKykKKyAgICAgICAgICAgICAgICB0W3cqbHAgKyBqXSA9ICgobFtpXSAqIElfTEZUR19LKSArICgxIDw8IDE2KSkgPj4gMTc7CisgICAgICAgIH0KKworICAgICAgICAvLyBWRVJfU0QKKyAgICAgICAgbCA9IGxpbmUgKyBtdjsKKyAgICAgICAgZm9yIChscCA9IDA7IGxwIDwgbGg7IGxwKyspIHsKKyAgICAgICAgICAgIGludCBpLCBqID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGx2OyBpKyspCisgICAgICAgICAgICAgICAgbFtpXSA9IHRbdyppICsgbHBdOworCisgICAgICAgICAgICBzZF8xZDk3X2ludChsaW5lLCBtdiwgbXYgKyBsdik7CisKKyAgICAgICAgICAgIC8vIGNvcHkgYmFjayBhbmQgZGVpbnRlcmxlYXZlCisgICAgICAgICAgICBmb3IgKGkgPSAgIG12OyBpIDwgbHY7IGkrPTIsIGorKykKKyAgICAgICAgICAgICAgICB0W3cqaiArIGxwXSA9ICgobFtpXSAqIElfTEZUR19YKSArICgxIDw8IDE2KSkgPj4gMTc7CisgICAgICAgICAgICBmb3IgKGkgPSAxLW12OyBpIDwgbHY7IGkrPTIsIGorKykKKyAgICAgICAgICAgICAgICB0W3cqaiArIGxwXSA9ICgobFtpXSAqIElfTEZUR19LKSArICgxIDw8IDE2KSkgPj4gMTc7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNyXzFkNTMoaW50ICpwLCBpbnQgaTAsIGludCBpMSkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChpMSA9PSBpMCArIDEpCisgICAgICAgIHJldHVybjsKKworICAgIGV4dGVuZDUzKHAsIGkwLCBpMSk7CisKKyAgICBmb3IgKGkgPSBpMCAvIDI7IGkgPCBpMSAvIDIgKyAxOyBpKyspCisgICAgICAgIHBbMiAqIGldIC09IChwWzIgKiBpIC0gMV0gKyBwWzIgKiBpICsgMV0gKyAyKSA+PiAyOworICAgIGZvciAoaSA9IGkwIC8gMjsgaSA8IGkxIC8gMjsgaSsrKQorICAgICAgICBwWzIgKiBpICsgMV0gKz0gKHBbMiAqIGldICsgcFsyICogaSArIDJdKSA+PiAxOworfQorCitzdGF0aWMgdm9pZCBkd3RfZGVjb2RlNTMoRFdUQ29udGV4dCAqcywgaW50ICp0KQoreworICAgIGludCBsZXY7CisgICAgaW50IHcgICAgID0gcy0+bGluZWxlbltzLT5uZGVjbGV2ZWxzIC0gMV1bMF07CisgICAgaW50MzJfdCAqbGluZSA9IHMtPmlfbGluZWJ1ZjsKKyAgICBsaW5lICs9IDM7CisKKyAgICBmb3IgKGxldiA9IDA7IGxldiA8IHMtPm5kZWNsZXZlbHM7IGxldisrKSB7CisgICAgICAgIGludCBsaCA9IHMtPmxpbmVsZW5bbGV2XVswXSwKKyAgICAgICAgICAgIGx2ID0gcy0+bGluZWxlbltsZXZdWzFdLAorICAgICAgICAgICAgbWggPSBzLT5tb2RbbGV2XVswXSwKKyAgICAgICAgICAgIG12ID0gcy0+bW9kW2xldl1bMV0sCisgICAgICAgICAgICBscDsKKyAgICAgICAgaW50ICpsOworCisgICAgICAgIC8vIEhPUl9TRAorICAgICAgICBsID0gbGluZSArIG1oOworICAgICAgICBmb3IgKGxwID0gMDsgbHAgPCBsdjsgbHArKykgeworICAgICAgICAgICAgaW50IGksIGogPSAwOworICAgICAgICAgICAgLy8gY29weSB3aXRoIGludGVybGVhdmluZworICAgICAgICAgICAgZm9yIChpID0gbWg7IGkgPCBsaDsgaSArPSAyLCBqKyspCisgICAgICAgICAgICAgICAgbFtpXSA9IHRbdyAqIGxwICsgal07CisgICAgICAgICAgICBmb3IgKGkgPSAxIC0gbWg7IGkgPCBsaDsgaSArPSAyLCBqKyspCisgICAgICAgICAgICAgICAgbFtpXSA9IHRbdyAqIGxwICsgal07CisKKyAgICAgICAgICAgIHNyXzFkNTMobGluZSwgbWgsIG1oICsgbGgpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGg7IGkrKykKKyAgICAgICAgICAgICAgICB0W3cgKiBscCArIGldID0gbFtpXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZFUl9TRAorICAgICAgICBsID0gbGluZSArIG12OworICAgICAgICBmb3IgKGxwID0gMDsgbHAgPCBsaDsgbHArKykgeworICAgICAgICAgICAgaW50IGksIGogPSAwOworICAgICAgICAgICAgLy8gY29weSB3aXRoIGludGVybGVhdmluZworICAgICAgICAgICAgZm9yIChpID0gbXY7IGkgPCBsdjsgaSArPSAyLCBqKyspCisgICAgICAgICAgICAgICAgbFtpXSA9IHRbdyAqIGogKyBscF07CisgICAgICAgICAgICBmb3IgKGkgPSAxIC0gbXY7IGkgPCBsdjsgaSArPSAyLCBqKyspCisgICAgICAgICAgICAgICAgbFtpXSA9IHRbdyAqIGogKyBscF07CisKKyAgICAgICAgICAgIHNyXzFkNTMobGluZSwgbXYsIG12ICsgbHYpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbHY7IGkrKykKKyAgICAgICAgICAgICAgICB0W3cgKiBpICsgbHBdID0gbFtpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc3JfMWQ5N19mbG9hdChmbG9hdCAqcCwgaW50IGkwLCBpbnQgaTEpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoaTEgPT0gaTAgKyAxKQorICAgICAgICByZXR1cm47CisKKyAgICBleHRlbmQ5N19mbG9hdChwLCBpMCwgaTEpOworCisgICAgZm9yIChpID0gaTAgLyAyIC0gMTsgaSA8IGkxIC8gMiArIDI7IGkrKykKKyAgICAgICAgcFsyICogaV0gICAgIC09IEZfTEZUR19ERUxUQSAqIChwWzIgKiBpIC0gMV0gKyBwWzIgKiBpICsgMV0pOworICAgIC8qIHN0ZXAgNCAqLworICAgIGZvciAoaSA9IGkwIC8gMiAtIDE7IGkgPCBpMSAvIDIgKyAxOyBpKyspCisgICAgICAgIHBbMiAqIGkgKyAxXSAtPSBGX0xGVEdfR0FNTUEgKiAocFsyICogaV0gICAgICsgcFsyICogaSArIDJdKTsKKyAgICAvKnN0ZXAgNSovCisgICAgZm9yIChpID0gaTAgLyAyOyBpIDwgaTEgLyAyICsgMTsgaSsrKQorICAgICAgICBwWzIgKiBpXSAgICAgKz0gRl9MRlRHX0JFVEEgICogKHBbMiAqIGkgLSAxXSArIHBbMiAqIGkgKyAxXSk7CisgICAgLyogc3RlcCA2ICovCisgICAgZm9yIChpID0gaTAgLyAyOyBpIDwgaTEgLyAyOyBpKyspCisgICAgICAgIHBbMiAqIGkgKyAxXSArPSBGX0xGVEdfQUxQSEEgKiAocFsyICogaV0gICAgICsgcFsyICogaSArIDJdKTsKK30KKworc3RhdGljIHZvaWQgZHd0X2RlY29kZTk3X2Zsb2F0KERXVENvbnRleHQgKnMsIGZsb2F0ICp0KQoreworICAgIGludCBsZXY7CisgICAgaW50IHcgICAgICAgPSBzLT5saW5lbGVuW3MtPm5kZWNsZXZlbHMgLSAxXVswXTsKKyAgICBmbG9hdCAqbGluZSA9IHMtPmZfbGluZWJ1ZjsKKyAgICBmbG9hdCAqZGF0YSA9IHQ7CisgICAgLyogcG9zaXRpb24gYXQgaW5kZXggTyBvZiBsaW5lIHJhbmdlIFswLTUsdys1XSBjZi4gZXh0ZW5kIGZ1bmN0aW9uICovCisgICAgbGluZSArPSA1OworCisgICAgZm9yIChsZXYgPSAwOyBsZXYgPCBzLT5uZGVjbGV2ZWxzOyBsZXYrKykgeworICAgICAgICBpbnQgbGggPSBzLT5saW5lbGVuW2xldl1bMF0sCisgICAgICAgICAgICBsdiA9IHMtPmxpbmVsZW5bbGV2XVsxXSwKKyAgICAgICAgICAgIG1oID0gcy0+bW9kW2xldl1bMF0sCisgICAgICAgICAgICBtdiA9IHMtPm1vZFtsZXZdWzFdLAorICAgICAgICAgICAgbHA7CisgICAgICAgIGZsb2F0ICpsOworICAgICAgICAvLyBIT1JfU0QKKyAgICAgICAgbCA9IGxpbmUgKyBtaDsKKyAgICAgICAgZm9yIChscCA9IDA7IGxwIDwgbHY7IGxwKyspIHsKKyAgICAgICAgICAgIGludCBpLCBqID0gMDsKKyAgICAgICAgICAgIC8vIGNvcHkgd2l0aCBpbnRlcmxlYXZpbmcKKyAgICAgICAgICAgIGZvciAoaSA9IG1oOyBpIDwgbGg7IGkgKz0gMiwgaisrKQorICAgICAgICAgICAgICAgIGxbaV0gPSBkYXRhW3cgKiBscCArIGpdICogRl9MRlRHX0s7CisgICAgICAgICAgICBmb3IgKGkgPSAxIC0gbWg7IGkgPCBsaDsgaSArPSAyLCBqKyspCisgICAgICAgICAgICAgICAgbFtpXSA9IGRhdGFbdyAqIGxwICsgal0gKiBGX0xGVEdfWDsKKworICAgICAgICAgICAgc3JfMWQ5N19mbG9hdChsaW5lLCBtaCwgbWggKyBsaCk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaDsgaSsrKQorICAgICAgICAgICAgICAgIGRhdGFbdyAqIGxwICsgaV0gPSBsW2ldOworICAgICAgICB9CisKKyAgICAgICAgLy8gVkVSX1NECisgICAgICAgIGwgPSBsaW5lICsgbXY7CisgICAgICAgIGZvciAobHAgPSAwOyBscCA8IGxoOyBscCsrKSB7CisgICAgICAgICAgICBpbnQgaSwgaiA9IDA7CisgICAgICAgICAgICAvLyBjb3B5IHdpdGggaW50ZXJsZWF2aW5nCisgICAgICAgICAgICBmb3IgKGkgPSBtdjsgaSA8IGx2OyBpICs9IDIsIGorKykKKyAgICAgICAgICAgICAgICBsW2ldID0gZGF0YVt3ICogaiArIGxwXSAqIEZfTEZUR19LOworICAgICAgICAgICAgZm9yIChpID0gMSAtIG12OyBpIDwgbHY7IGkgKz0gMiwgaisrKQorICAgICAgICAgICAgICAgIGxbaV0gPSBkYXRhW3cgKiBqICsgbHBdICogRl9MRlRHX1g7CisKKyAgICAgICAgICAgIHNyXzFkOTdfZmxvYXQobGluZSwgbXYsIG12ICsgbHYpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbHY7IGkrKykKKyAgICAgICAgICAgICAgICBkYXRhW3cgKiBpICsgbHBdID0gbFtpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc3JfMWQ5N19pbnQoaW50MzJfdCAqcCwgaW50IGkwLCBpbnQgaTEpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoaTEgPT0gaTAgKyAxKQorICAgICAgICByZXR1cm47CisKKyAgICBleHRlbmQ5N19pbnQocCwgaTAsIGkxKTsKKworICAgIGZvciAoaSA9IGkwIC8gMiAtIDE7IGkgPCBpMSAvIDIgKyAyOyBpKyspCisgICAgICAgIHBbMiAqIGldICAgICAtPSAoSV9MRlRHX0RFTFRBICogKHBbMiAqIGkgLSAxXSArIHBbMiAqIGkgKyAxXSkgKyAoMSA8PCAxNSkpID4+IDE2OworICAgIC8qIHN0ZXAgNCAqLworICAgIGZvciAoaSA9IGkwIC8gMiAtIDE7IGkgPCBpMSAvIDIgKyAxOyBpKyspCisgICAgICAgIHBbMiAqIGkgKyAxXSAtPSAoSV9MRlRHX0dBTU1BICogKHBbMiAqIGldICAgICArIHBbMiAqIGkgKyAyXSkgKyAoMSA8PCAxNSkpID4+IDE2OworICAgIC8qc3RlcCA1Ki8KKyAgICBmb3IgKGkgPSBpMCAvIDI7IGkgPCBpMSAvIDIgKyAxOyBpKyspCisgICAgICAgIHBbMiAqIGldICAgICArPSAoSV9MRlRHX0JFVEEgICogKHBbMiAqIGkgLSAxXSArIHBbMiAqIGkgKyAxXSkgKyAoMSA8PCAxNSkpID4+IDE2OworICAgIC8qIHN0ZXAgNiAqLworICAgIGZvciAoaSA9IGkwIC8gMjsgaSA8IGkxIC8gMjsgaSsrKQorICAgICAgICBwWzIgKiBpICsgMV0gKz0gKElfTEZUR19BTFBIQSAqIChwWzIgKiBpXSAgICAgKyBwWzIgKiBpICsgMl0pICsgKDEgPDwgMTUpKSA+PiAxNjsKK30KKworc3RhdGljIHZvaWQgZHd0X2RlY29kZTk3X2ludChEV1RDb250ZXh0ICpzLCBpbnQzMl90ICp0KQoreworICAgIGludCBsZXY7CisgICAgaW50IHcgICAgICAgPSBzLT5saW5lbGVuW3MtPm5kZWNsZXZlbHMgLSAxXVswXTsKKyAgICBpbnQzMl90ICpsaW5lID0gcy0+aV9saW5lYnVmOworICAgIGludDMyX3QgKmRhdGEgPSB0OworICAgIC8qIHBvc2l0aW9uIGF0IGluZGV4IE8gb2YgbGluZSByYW5nZSBbMC01LHcrNV0gY2YuIGV4dGVuZCBmdW5jdGlvbiAqLworICAgIGxpbmUgKz0gNTsKKworICAgIGZvciAobGV2ID0gMDsgbGV2IDwgcy0+bmRlY2xldmVsczsgbGV2KyspIHsKKyAgICAgICAgaW50IGxoID0gcy0+bGluZWxlbltsZXZdWzBdLAorICAgICAgICAgICAgbHYgPSBzLT5saW5lbGVuW2xldl1bMV0sCisgICAgICAgICAgICBtaCA9IHMtPm1vZFtsZXZdWzBdLAorICAgICAgICAgICAgbXYgPSBzLT5tb2RbbGV2XVsxXSwKKyAgICAgICAgICAgIGxwOworICAgICAgICBpbnQzMl90ICpsOworICAgICAgICAvLyBIT1JfU0QKKyAgICAgICAgbCA9IGxpbmUgKyBtaDsKKyAgICAgICAgZm9yIChscCA9IDA7IGxwIDwgbHY7IGxwKyspIHsKKyAgICAgICAgICAgIGludCBpLCBqID0gMDsKKyAgICAgICAgICAgIC8vIHJlc2NhbGUgd2l0aCBpbnRlcmxlYXZpbmcKKyAgICAgICAgICAgIGZvciAoaSA9IG1oOyBpIDwgbGg7IGkgKz0gMiwgaisrKQorICAgICAgICAgICAgICAgIGxbaV0gPSAoKGRhdGFbdyAqIGxwICsgal0gKiBJX0xGVEdfSykgKyAoMSA8PCAxNSkpID4+IDE2OworICAgICAgICAgICAgZm9yIChpID0gMSAtIG1oOyBpIDwgbGg7IGkgKz0gMiwgaisrKQorICAgICAgICAgICAgICAgIGxbaV0gPSAoKGRhdGFbdyAqIGxwICsgal0gKiBJX0xGVEdfWCkgKyAoMSA8PCAxNSkpID4+IDE2OworCisgICAgICAgICAgICBzcl8xZDk3X2ludChsaW5lLCBtaCwgbWggKyBsaCk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaDsgaSsrKQorICAgICAgICAgICAgICAgIGRhdGFbdyAqIGxwICsgaV0gPSBsW2ldOworICAgICAgICB9CisKKyAgICAgICAgLy8gVkVSX1NECisgICAgICAgIGwgPSBsaW5lICsgbXY7CisgICAgICAgIGZvciAobHAgPSAwOyBscCA8IGxoOyBscCsrKSB7CisgICAgICAgICAgICBpbnQgaSwgaiA9IDA7CisgICAgICAgICAgICAvLyByZXNjYWxlIHdpdGggaW50ZXJsZWF2aW5nCisgICAgICAgICAgICBmb3IgKGkgPSBtdjsgaSA8IGx2OyBpICs9IDIsIGorKykKKyAgICAgICAgICAgICAgICBsW2ldID0gKChkYXRhW3cgKiBqICsgbHBdICogSV9MRlRHX0spICsgKDEgPDwgMTUpKSA+PiAxNjsKKyAgICAgICAgICAgIGZvciAoaSA9IDEgLSBtdjsgaSA8IGx2OyBpICs9IDIsIGorKykKKyAgICAgICAgICAgICAgICBsW2ldID0gKChkYXRhW3cgKiBqICsgbHBdICogSV9MRlRHX1gpICsgKDEgPDwgMTUpKSA+PiAxNjsKKworICAgICAgICAgICAgc3JfMWQ5N19pbnQobGluZSwgbXYsIG12ICsgbHYpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbHY7IGkrKykKKyAgICAgICAgICAgICAgICBkYXRhW3cgKiBpICsgbHBdID0gbFtpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGZmX2pwZWcyMDAwX2R3dF9pbml0KERXVENvbnRleHQgKnMsIHVpbnQxNl90IGJvcmRlclsyXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjb21wX2xldmVscywgaW50IHR5cGUpCit7CisgICAgaW50IGksIGosIGxldiA9IGRlY29tcF9sZXZlbHMsIG1heGxlbiwKKyAgICAgICAgYlsyXVsyXTsKKworICAgIHMtPm5kZWNsZXZlbHMgPSBkZWNvbXBfbGV2ZWxzOworICAgIHMtPnR5cGUgICAgICAgPSB0eXBlOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgICAgIGJbaV1bal0gPSBib3JkZXJbaV1bal07CisKKyAgICBtYXhsZW4gPSBGRk1BWChiWzBdWzFdIC0gYlswXVswXSwKKyAgICAgICAgICAgICAgICAgICBiWzFdWzFdIC0gYlsxXVswXSk7CisgICAgd2hpbGUgKC0tbGV2ID49IDApCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIHMtPmxpbmVsZW5bbGV2XVtpXSA9IGJbaV1bMV0gLSBiW2ldWzBdOworICAgICAgICAgICAgcy0+bW9kW2xldl1baV0gICAgID0gYltpXVswXSAmIDE7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgICAgIGJbaV1bal0gPSAoYltpXVtqXSArIDEpID4+IDE7CisgICAgICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEZGX0RXVDk3OgorICAgICAgICBzLT5mX2xpbmVidWYgPSBhdl9tYWxsb2NfYXJyYXkoKG1heGxlbiArIDEyKSwgc2l6ZW9mKCpzLT5mX2xpbmVidWYpKTsKKyAgICAgICAgaWYgKCFzLT5mX2xpbmVidWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBicmVhazsKKyAgICAgY2FzZSBGRl9EV1Q5N19JTlQ6CisgICAgICAgIHMtPmlfbGluZWJ1ZiA9IGF2X21hbGxvY19hcnJheSgobWF4bGVuICsgMTIpLCBzaXplb2YoKnMtPmlfbGluZWJ1ZikpOworICAgICAgICBpZiAoIXMtPmlfbGluZWJ1ZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfRFdUNTM6CisgICAgICAgIHMtPmlfbGluZWJ1ZiA9IGF2X21hbGxvY19hcnJheSgobWF4bGVuICsgIDYpLCBzaXplb2YoKnMtPmlfbGluZWJ1ZikpOworICAgICAgICBpZiAoIXMtPmlfbGluZWJ1ZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9kd3RfZW5jb2RlKERXVENvbnRleHQgKnMsIHZvaWQgKnQpCit7CisgICAgc3dpdGNoKHMtPnR5cGUpeworICAgICAgICBjYXNlIEZGX0RXVDk3OgorICAgICAgICAgICAgZHd0X2VuY29kZTk3X2Zsb2F0KHMsIHQpOyBicmVhazsKKyAgICAgICAgY2FzZSBGRl9EV1Q5N19JTlQ6CisgICAgICAgICAgICBkd3RfZW5jb2RlOTdfaW50KHMsIHQpOyBicmVhazsKKyAgICAgICAgY2FzZSBGRl9EV1Q1MzoKKyAgICAgICAgICAgIGR3dF9lbmNvZGU1MyhzLCB0KTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgZmZfZHd0X2RlY29kZShEV1RDb250ZXh0ICpzLCB2b2lkICp0KQoreworICAgIHN3aXRjaCAocy0+dHlwZSkgeworICAgIGNhc2UgRkZfRFdUOTc6CisgICAgICAgIGR3dF9kZWNvZGU5N19mbG9hdChzLCB0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9EV1Q5N19JTlQ6CisgICAgICAgIGR3dF9kZWNvZGU5N19pbnQocywgdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfRFdUNTM6CisgICAgICAgIGR3dF9kZWNvZGU1MyhzLCB0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl9kd3RfZGVzdHJveShEV1RDb250ZXh0ICpzKQoreworICAgIGF2X2ZyZWVwKCZzLT5mX2xpbmVidWYpOworICAgIGF2X2ZyZWVwKCZzLT5pX2xpbmVidWYpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvanBlZzIwMDBkd3QuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2pwZWcyMDAwZHd0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkMjk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2pwZWcyMDAwZHd0LmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIERpc2NyZXRlIHdhdmVsZXQgdHJhbnNmb3JtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS2FtaWwgTm93b3NhZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSlBFRzIwMDBEV1RfSAorI2RlZmluZSBBVkNPREVDX0pQRUcyMDAwRFdUX0gKKworLyoqCisgKiBAZmlsZQorICogRGlzY3JldGUgd2F2ZWxldCB0cmFuc2Zvcm0KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgRkZfRFdUX01BWF9ERUNMVkxTIDMyIC8vLzwgbWF4IG51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscworCitlbnVtIERXVFR5cGUgeworICAgIEZGX0RXVDk3LAorICAgIEZGX0RXVDUzLAorICAgIEZGX0RXVDk3X0lOVCwKKyAgICBGRl9EV1RfTkIKK307CisKK3R5cGVkZWYgc3RydWN0IERXVENvbnRleHQgeworICAgIC8vLyBsaW5lIGxlbmd0aHMgeyBob3Jpem9udGFsLCB2ZXJ0aWNhbCB9IGluIGNvbnNlY3V0aXZlIGRlY29tcG9zaXRpb24gbGV2ZWxzCisgICAgdWludDE2X3QgbGluZWxlbltGRl9EV1RfTUFYX0RFQ0xWTFNdWzJdOworICAgIHVpbnQ4X3QgbW9kW0ZGX0RXVF9NQVhfREVDTFZMU11bMl07ICAvLy88IGNvb3JkaW5hdGVzICh4MCwgeTApIG9mIGRlY29tcC4gbGV2ZWxzIG1vZCAyCisgICAgdWludDhfdCBuZGVjbGV2ZWxzOyAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGRlY29tcG9zaXRpb24gbGV2ZWxzCisgICAgdWludDhfdCB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMCBmb3IgOS83OyAxIGZvciA1LzMKKyAgICBpbnQzMl90ICppX2xpbmVidWY7ICAgICAgICAgICAgICAgICAgLy8vPCBpbnQgYnVmZmVyIHVzZWQgYnkgdHJhbnNmb3JtCisgICAgZmxvYXQgICAqZl9saW5lYnVmOyAgICAgICAgICAgICAgICAgIC8vLzwgZmxvYXQgYnVmZmVyIHVzZWQgYnkgdHJhbnNmb3JtCit9IERXVENvbnRleHQ7CisKKy8qKgorICogSW5pdGlhbGl6ZSBEV1QuCisgKiBAcGFyYW0gcyAgICAgICAgICAgICAgICAgRFdUIGNvbnRleHQKKyAqIEBwYXJhbSBib3JkZXIgICAgICAgICAgICBjb29yZGluYXRlcyBvZiB0cmFuc2Zvcm1lZCByZWdpb24ge3t4MCwgeDF9LCB7eTAsIHkxfX0KKyAqIEBwYXJhbSBkZWNvbXBfbGV2ZWxzICAgICBudW1iZXIgb2YgZGVjb21wb3NpdGlvbiBsZXZlbHMKKyAqIEBwYXJhbSB0eXBlICAgICAgICAgICAgICAwIGZvciBEV1QgOS83OyAxIGZvciBEV1QgNS8zCisgKi8KK2ludCBmZl9qcGVnMjAwMF9kd3RfaW5pdChEV1RDb250ZXh0ICpzLCB1aW50MTZfdCBib3JkZXJbMl1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY29tcF9sZXZlbHMsIGludCB0eXBlKTsKKworaW50IGZmX2R3dF9lbmNvZGUoRFdUQ29udGV4dCAqcywgdm9pZCAqdCk7CitpbnQgZmZfZHd0X2RlY29kZShEV1RDb250ZXh0ICpzLCB2b2lkICp0KTsKKwordm9pZCBmZl9kd3RfZGVzdHJveShEV1RDb250ZXh0ICpzKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSlBFRzIwMDBEV1RfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvanBlZ2xzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9qcGVnbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTZjNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvanBlZ2xzLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBKUEVHLUxTIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA2IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSlBFRy1MUyBjb21tb24gY29kZS4KKyAqLworCisjaW5jbHVkZSAianBlZ2xzLmgiCisKK3ZvaWQgZmZfanBlZ2xzX2luaXRfc3RhdGUoSkxTU3RhdGUgKnN0YXRlKQoreworICAgIGludCBpOworCisgICAgc3RhdGUtPnR3b25lYXIgPSBzdGF0ZS0+bmVhciAqIDIgKyAxOworICAgIHN0YXRlLT5yYW5nZSAgID0gKHN0YXRlLT5tYXh2YWwgKyBzdGF0ZS0+dHdvbmVhciAtIDEpIC8gc3RhdGUtPnR3b25lYXIgKyAxOworCisgICAgLy8gUUJQUCA9IGNlaWwobG9nMihSQU5HRSkpCisgICAgZm9yIChzdGF0ZS0+cWJwcCA9IDA7ICgxIDw8IHN0YXRlLT5xYnBwKSA8IHN0YXRlLT5yYW5nZTsgc3RhdGUtPnFicHArKykKKyAgICAgICAgOworCisgICAgc3RhdGUtPmJwcCAgID0gRkZNQVgoYXZfbG9nMihzdGF0ZS0+bWF4dmFsKSArIDEsIDIpOworICAgIHN0YXRlLT5saW1pdCA9IDIqKHN0YXRlLT5icHAgKyBGRk1BWChzdGF0ZS0+YnBwLCA4KSkgLSBzdGF0ZS0+cWJwcDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzNjc7IGkrKykgeworICAgICAgICBzdGF0ZS0+QVtpXSA9IEZGTUFYKHN0YXRlLT5yYW5nZSArIDMyID4+IDYsIDIpOworICAgICAgICBzdGF0ZS0+TltpXSA9IDE7CisgICAgfQorfQorCisvKioKKyAqIEN1c3RvbSB2YWx1ZSBjbGlwcGluZyBmdW5jdGlvbiB1c2VkIGluIFQxLCBUMiwgVDMgY2FsY3VsYXRpb24KKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNvX2NsaXAoaW50IHYsIGludCB2bWluLCBpbnQgdm1heCkKK3sKKyAgICBpZiAodiA+IHZtYXggfHwgdiA8IHZtaW4pCisgICAgICAgIHJldHVybiB2bWluOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHY7Cit9CisKK3ZvaWQgZmZfanBlZ2xzX3Jlc2V0X2NvZGluZ19wYXJhbWV0ZXJzKEpMU1N0YXRlICpzLCBpbnQgcmVzZXRfYWxsKQoreworICAgIGNvbnN0IGludCBiYXNpY190MSA9IDM7CisgICAgY29uc3QgaW50IGJhc2ljX3QyID0gNzsKKyAgICBjb25zdCBpbnQgYmFzaWNfdDMgPSAyMTsKKyAgICBpbnQgZmFjdG9yOworCisgICAgaWYgKHMtPm1heHZhbCA9PSAwIHx8IHJlc2V0X2FsbCkKKyAgICAgICAgcy0+bWF4dmFsID0gKDEgPDwgcy0+YnBwKSAtIDE7CisKKyAgICBpZiAocy0+bWF4dmFsID49IDEyOCkgeworICAgICAgICBmYWN0b3IgPSBGRk1JTihzLT5tYXh2YWwsIDQwOTUpICsgMTI4ID4+IDg7CisKKyAgICAgICAgaWYgKHMtPlQxID09IDAgfHwgcmVzZXRfYWxsKQorICAgICAgICAgICAgcy0+VDEgPSBpc29fY2xpcChmYWN0b3IgKiAoYmFzaWNfdDEgLSAyKSArIDIgKyAzICogcy0+bmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmVhciArIDEsIHMtPm1heHZhbCk7CisgICAgICAgIGlmIChzLT5UMiA9PSAwIHx8IHJlc2V0X2FsbCkKKyAgICAgICAgICAgIHMtPlQyID0gaXNvX2NsaXAoZmFjdG9yICogKGJhc2ljX3QyIC0gMykgKyAzICsgNSAqIHMtPm5lYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPlQxLCBzLT5tYXh2YWwpOworICAgICAgICBpZiAocy0+VDMgPT0gMCB8fCByZXNldF9hbGwpCisgICAgICAgICAgICBzLT5UMyA9IGlzb19jbGlwKGZhY3RvciAqIChiYXNpY190MyAtIDQpICsgNCArIDcgKiBzLT5uZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5UMiwgcy0+bWF4dmFsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmYWN0b3IgPSAyNTYgLyAocy0+bWF4dmFsICsgMSk7CisKKyAgICAgICAgaWYgKHMtPlQxID09IDAgfHwgcmVzZXRfYWxsKQorICAgICAgICAgICAgcy0+VDEgPSBpc29fY2xpcChGRk1BWCgyLCBiYXNpY190MSAvIGZhY3RvciArIDMgKiBzLT5uZWFyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmVhciArIDEsIHMtPm1heHZhbCk7CisgICAgICAgIGlmIChzLT5UMiA9PSAwIHx8IHJlc2V0X2FsbCkKKyAgICAgICAgICAgIHMtPlQyID0gaXNvX2NsaXAoRkZNQVgoMywgYmFzaWNfdDIgLyBmYWN0b3IgKyA1ICogcy0+bmVhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPlQxLCBzLT5tYXh2YWwpOworICAgICAgICBpZiAocy0+VDMgPT0gMCB8fCByZXNldF9hbGwpCisgICAgICAgICAgICBzLT5UMyA9IGlzb19jbGlwKEZGTUFYKDQsIGJhc2ljX3QzIC8gZmFjdG9yICsgNyAqIHMtPm5lYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5UMiwgcy0+bWF4dmFsKTsKKyAgICB9CisKKyAgICBpZiAocy0+cmVzZXQgPT0gMCB8fCByZXNldF9hbGwpCisgICAgICAgIHMtPnJlc2V0ID0gNjQ7CisgICAgYXZfZGxvZyhOVUxMLCAiW0pQRUctTFMgUkVTRVRdIFQ9JWksJWksJWlcbiIsIHMtPlQxLCBzLT5UMiwgcy0+VDMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvanBlZ2xzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9qcGVnbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODk5N2M3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvanBlZ2xzLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBKUEVHLUxTIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA2IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSlBFRy1MUyBjb21tb24gY29kZS4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSlBFR0xTX0gKKyNkZWZpbmUgQVZDT0RFQ19KUEVHTFNfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBKcGVnbHNDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7Cit9IEpwZWdsc0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IEpMU1N0YXRlIHsKKyAgICBpbnQgVDEsIFQyLCBUMzsKKyAgICBpbnQgQVszNjddLCBCWzM2N10sIENbMzY1XSwgTlszNjddOworICAgIGludCBsaW1pdCwgcmVzZXQsIGJwcCwgcWJwcCwgbWF4dmFsLCByYW5nZTsKKyAgICBpbnQgbmVhciwgdHdvbmVhcjsKKyAgICBpbnQgcnVuX2luZGV4WzRdOworfSBKTFNTdGF0ZTsKKworLyoqCisgKiBDYWxjdWxhdGUgaW5pdGlhbCBKUEVHLUxTIHBhcmFtZXRlcnMKKyAqLwordm9pZCBmZl9qcGVnbHNfaW5pdF9zdGF0ZShKTFNTdGF0ZSAqc3RhdGUpOworCisvKioKKyAqIENhbGN1bGF0ZSBxdWFudGl6ZWQgZ3JhZGllbnQgdmFsdWUsIHVzZWQgZm9yIGNvbnRleHQgZGV0ZXJtaW5hdGlvbgorICovCitzdGF0aWMgaW5saW5lIGludCBmZl9qcGVnbHNfcXVhbnRpemUoSkxTU3RhdGUgKnMsIGludCB2KQoreworICAgIGlmICh2ID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh2IDwgMCkgeworICAgICAgICBpZiAodiA8PSAtcy0+VDMpCisgICAgICAgICAgICByZXR1cm4gLTQ7CisgICAgICAgIGlmICh2IDw9IC1zLT5UMikKKyAgICAgICAgICAgIHJldHVybiAtMzsKKyAgICAgICAgaWYgKHYgPD0gLXMtPlQxKQorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICBpZiAodiA8IC1zLT5uZWFyKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodiA8PSBzLT5uZWFyKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICh2IDwgcy0+VDEpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgaWYgKHYgPCBzLT5UMikKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBpZiAodiA8IHMtPlQzKQorICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIHJldHVybiA0OworICAgIH0KK30KKworLyoqCisgKiBDYWxjdWxhdGUgSlBFRy1MUyBjb2RlYyB2YWx1ZXMKKyAqLwordm9pZCBmZl9qcGVnbHNfcmVzZXRfY29kaW5nX3BhcmFtZXRlcnMoSkxTU3RhdGUgKnMsIGludCByZXNldF9hbGwpOworCitzdGF0aWMgaW5saW5lIHZvaWQgZmZfanBlZ2xzX2Rvd25zY2FsZV9zdGF0ZShKTFNTdGF0ZSAqc3RhdGUsIGludCBRKQoreworICAgIGlmIChzdGF0ZS0+TltRXSA9PSBzdGF0ZS0+cmVzZXQpIHsKKyAgICAgICAgc3RhdGUtPkFbUV0gPj49IDE7CisgICAgICAgIHN0YXRlLT5CW1FdID4+PSAxOworICAgICAgICBzdGF0ZS0+TltRXSA+Pj0gMTsKKyAgICB9CisgICAgc3RhdGUtPk5bUV0rKzsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmZfanBlZ2xzX3VwZGF0ZV9zdGF0ZV9yZWd1bGFyKEpMU1N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgUSwgaW50IGVycikKK3sKKyAgICBpZihGRkFCUyhlcnIpID4gMHhGRkZGKQorICAgICAgICByZXR1cm4gLTB4MTAwMDA7CisgICAgc3RhdGUtPkFbUV0gKz0gRkZBQlMoZXJyKTsKKyAgICBlcnIgICAgICAgICAqPSBzdGF0ZS0+dHdvbmVhcjsKKyAgICBzdGF0ZS0+QltRXSArPSBlcnI7CisKKyAgICBmZl9qcGVnbHNfZG93bnNjYWxlX3N0YXRlKHN0YXRlLCBRKTsKKworICAgIGlmIChzdGF0ZS0+QltRXSA8PSAtc3RhdGUtPk5bUV0pIHsKKyAgICAgICAgc3RhdGUtPkJbUV0gPSBGRk1BWChzdGF0ZS0+QltRXSArIHN0YXRlLT5OW1FdLCAxIC0gc3RhdGUtPk5bUV0pOworICAgICAgICBpZiAoc3RhdGUtPkNbUV0gPiAtMTI4KQorICAgICAgICAgICAgc3RhdGUtPkNbUV0tLTsKKyAgICB9IGVsc2UgaWYgKHN0YXRlLT5CW1FdID4gMCkgeworICAgICAgICBzdGF0ZS0+QltRXSA9IEZGTUlOKHN0YXRlLT5CW1FdIC0gc3RhdGUtPk5bUV0sIDApOworICAgICAgICBpZiAoc3RhdGUtPkNbUV0gPCAxMjcpCisgICAgICAgICAgICBzdGF0ZS0+Q1tRXSsrOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgUihhLCBpKSAgICAoYml0cyA9PSA4ID8gICgodWludDhfdCAqKShhKSlbaV0gICAgICA6ICAoKHVpbnQxNl90ICopKGEpKVtpXSkKKyNkZWZpbmUgVyhhLCBpLCB2KSAoYml0cyA9PSA4ID8gKCgodWludDhfdCAqKShhKSlbaV0gPSB2KSA6ICgoKHVpbnQxNl90ICopKGEpKVtpXSA9IHYpKQorCisjZW5kaWYgLyogQVZDT0RFQ19KUEVHTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvanBlZ2xzZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9qcGVnbHNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhjMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvanBlZ2xzZGVjLmMKQEAgLTAsMCArMSw1MTEgQEAKKy8qCisgKiBKUEVHLUxTIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBKUEVHLUxTIGRlY29kZXIuCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImdvbG9tYi5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtanBlZy5oIgorI2luY2x1ZGUgIm1qcGVnZGVjLmgiCisjaW5jbHVkZSAianBlZ2xzLmgiCisjaW5jbHVkZSAianBlZ2xzZGVjLmgiCisKKy8qCisgKiBVbmNvbW1lbnQgdGhpcyB0byBzaWduaWZpY2FudGx5IHNwZWVkIHVwIGRlY29kaW5nIG9mIGJyb2tlbiBKUEVHLUxTCisgKiAob3IgdGVzdCBicm9rZW4gSlBFRy1MUyBkZWNvZGVyKSBhbmQgc2xvdyBkb3duIG9yZGluYXJ5IGRlY29kaW5nIGEgYml0LgorICoKKyAqIFRoZXJlIGlzIG5vIEdvbG9tYiBjb2RlIHdpdGggbGVuZ3RoID49IDMyIGJpdHMgcG9zc2libGUsIHNvIGNoZWNrIGFuZAorICogYXZvaWQgc2l0dWF0aW9uIG9mIDMyIHplcm9zLCBGRm1wZWcgR29sb21iIGRlY29kZXIgaXMgcGFpbmZ1bGx5IHNsb3cKKyAqIG9uIHRoaXMgZXJyb3JzLgorICovCisvLyNkZWZpbmUgSkxTX0JST0tFTgorCisvKioKKyAqIERlY29kZSBMU0UgYmxvY2sgd2l0aCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgKi8KK2ludCBmZl9qcGVnbHNfZGVjb2RlX2xzZShNSnBlZ0RlY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGlkOworICAgIGludCB0aWQsIHd0LCBtYXh0YWIsIGksIGo7CisKKyAgICBpbnQgbGVuID0gZ2V0X2JpdHMoJnMtPmdiLCAxNik7CisgICAgaWQgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworCisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGxlbiA8IDEzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgcy0+bWF4dmFsID0gZ2V0X2JpdHMoJnMtPmdiLCAxNik7CisgICAgICAgIHMtPnQxICAgICA9IGdldF9iaXRzKCZzLT5nYiwgMTYpOworICAgICAgICBzLT50MiAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDE2KTsKKyAgICAgICAgcy0+dDMgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAxNik7CisgICAgICAgIHMtPnJlc2V0ICA9IGdldF9iaXRzKCZzLT5nYiwgMTYpOworCisgICAgICAgIGlmKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJDb2RpbmcgcGFyYW1ldGVycyBtYXh2YWw6JWQgVDE6JWQgVDI6JWQgVDM6JWQgcmVzZXQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+bWF4dmFsLCBzLT50MSwgcy0+dDIsIHMtPnQzLCBzLT5yZXNldCk7CisgICAgICAgIH0KKworLy8gICAgICAgIGZmX2pwZWdsc19yZXNldF9jb2RpbmdfcGFyYW1ldGVycyhzLCAwKTsKKyAgICAgICAgLy9GSVhNRSBxdWFudCB0YWJsZT8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBzLT5wYWxldHRlX2luZGV4ID0gMDsKKyAgICBjYXNlIDM6CisgICAgICAgIHRpZD0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgd3QgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworCisgICAgICAgIGlmIChsZW4gPCA1KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKHd0IDwgMSB8fCB3dCA+IE1BWF9DT01QT05FTlRTKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJ3dCAlZCIsIHd0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcy0+bWF4dmFsKQorICAgICAgICAgICAgbWF4dGFiID0gMjU1OworICAgICAgICBlbHNlIGlmICgoNSArIHd0KihzLT5tYXh2YWwrMSkpIDwgNjU1MzUpCisgICAgICAgICAgICBtYXh0YWIgPSBzLT5tYXh2YWw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1heHRhYiA9IDY1NTMwL3d0IC0gMTsKKworICAgICAgICBpZihzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiTFNFIHBhbGV0dGUgJWQgdGlkOiVkIHd0OiVkIG1heHRhYjolZFxuIiwgaWQsIHRpZCwgd3QsIG1heHRhYik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heHRhYiA+PSAyNTYpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIj44Yml0IHBhbGV0dGUiKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBtYXh0YWIgPSBGRk1JTihtYXh0YWIsIChsZW4gLSA1KSAvIHd0ICsgcy0+cGFsZXR0ZV9pbmRleCk7CisKKyAgICAgICAgaWYgKHMtPnBhbGV0dGVfaW5kZXggPiBtYXh0YWIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBpZiAoKHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR1JBWTggfHwgcy0+YXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSAmJgorICAgICAgICAgICAgKHMtPnBpY3R1cmVfcHRyLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9HUkFZOCB8fCBzLT5waWN0dXJlX3B0ci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfUEFMOCkpIHsKKyAgICAgICAgICAgIHVpbnQzMl90ICpwYWwgPSAodWludDMyX3QgKilzLT5waWN0dXJlX3B0ci0+ZGF0YVsxXTsKKyAgICAgICAgICAgIHMtPnBpY3R1cmVfcHRyLT5mb3JtYXQgPQorICAgICAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgICAgICAgICBmb3IgKGk9cy0+cGFsZXR0ZV9pbmRleDsgaTw9bWF4dGFiOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwYWxbaV0gPSAwOworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPHd0OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcGFsW2ldIHw9IGdldF9iaXRzKCZzLT5nYiwgOCkgPDwgKDgqKHd0LWotMSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnBhbGV0dGVfaW5kZXggPSBpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAib3ZlcnNpemUgaW1hZ2UiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgaWQgJWRcbiIsIGlkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2X2Rsb2cocy0+YXZjdHgsICJJRD0laSwgVD0laSwlaSwlaVxuIiwgaWQsIHMtPnQxLCBzLT50Miwgcy0+dDMpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogR2V0IGNvbnRleHQtZGVwZW5kZW50IEdvbG9tYiBjb2RlLCBkZWNvZGUgaXQgYW5kIHVwZGF0ZSBjb250ZXh0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxzX2dldF9jb2RlX3JlZ3VsYXIoR2V0Qml0Q29udGV4dCAqZ2IsIEpMU1N0YXRlICpzdGF0ZSwgaW50IFEpCit7CisgICAgaW50IGssIHJldDsKKworICAgIGZvciAoayA9IDA7IChzdGF0ZS0+TltRXSA8PCBrKSA8IHN0YXRlLT5BW1FdOyBrKyspCisgICAgICAgIDsKKworI2lmZGVmIEpMU19CUk9LRU4KKyAgICBpZiAoIXNob3dfYml0c19sb25nKGdiLCAzMikpCisgICAgICAgIHJldHVybiAtMTsKKyNlbmRpZgorICAgIHJldCA9IGdldF91cl9nb2xvbWJfanBlZ2xzKGdiLCBrLCBzdGF0ZS0+bGltaXQsIHN0YXRlLT5xYnBwKTsKKworICAgIC8qIGRlY29kZSBtYXBwZWQgZXJyb3IgKi8KKyAgICBpZiAocmV0ICYgMSkKKyAgICAgICAgcmV0ID0gLShyZXQgKyAxID4+IDEpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID4+PSAxOworCisgICAgLyogZm9yIE5FQVI9MCwgaz0wIGFuZCAyKkJbUV0gPD0gLSBOW1FdIG1hcHBpbmcgaXMgcmV2ZXJzZWQgKi8KKyAgICBpZiAoIXN0YXRlLT5uZWFyICYmICFrICYmICgyICogc3RhdGUtPkJbUV0gPD0gLXN0YXRlLT5OW1FdKSkKKyAgICAgICAgcmV0ID0gLShyZXQgKyAxKTsKKworICAgIHJldCA9IGZmX2pwZWdsc191cGRhdGVfc3RhdGVfcmVndWxhcihzdGF0ZSwgUSwgcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogR2V0IEdvbG9tYiBjb2RlLCBkZWNvZGUgaXQgYW5kIHVwZGF0ZSBzdGF0ZSBmb3IgcnVuIHRlcm1pbmF0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxzX2dldF9jb2RlX3J1bnRlcm0oR2V0Qml0Q29udGV4dCAqZ2IsIEpMU1N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFJJdHlwZSwgaW50IGxpbWl0X2FkZCkKK3sKKyAgICBpbnQgaywgcmV0LCB0ZW1wLCBtYXA7CisgICAgaW50IFEgPSAzNjUgKyBSSXR5cGU7CisKKyAgICB0ZW1wID0gc3RhdGUtPkFbUV07CisgICAgaWYgKFJJdHlwZSkKKyAgICAgICAgdGVtcCArPSBzdGF0ZS0+TltRXSA+PiAxOworCisgICAgZm9yIChrID0gMDsgKHN0YXRlLT5OW1FdIDw8IGspIDwgdGVtcDsgaysrKQorICAgICAgICA7CisKKyNpZmRlZiBKTFNfQlJPS0VOCisgICAgaWYgKCFzaG93X2JpdHNfbG9uZyhnYiwgMzIpKQorICAgICAgICByZXR1cm4gLTE7CisjZW5kaWYKKyAgICByZXQgPSBnZXRfdXJfZ29sb21iX2pwZWdscyhnYiwgaywgc3RhdGUtPmxpbWl0IC0gbGltaXRfYWRkIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cWJwcCk7CisKKyAgICAvKiBkZWNvZGUgbWFwcGVkIGVycm9yICovCisgICAgbWFwID0gMDsKKyAgICBpZiAoIWsgJiYgKFJJdHlwZSB8fCByZXQpICYmICgyICogc3RhdGUtPkJbUV0gPCBzdGF0ZS0+TltRXSkpCisgICAgICAgIG1hcCA9IDE7CisgICAgcmV0ICs9IFJJdHlwZSArIG1hcDsKKworICAgIGlmIChyZXQgJiAxKSB7CisgICAgICAgIHJldCA9IG1hcCAtIChyZXQgKyAxID4+IDEpOworICAgICAgICBzdGF0ZS0+QltRXSsrOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IHJldCA+PiAxOworICAgIH0KKworICAgIGlmKEZGQUJTKHJldCkgPiAweEZGRkYpCisgICAgICAgIHJldHVybiAtMHgxMDAwMDsKKyAgICAvKiB1cGRhdGUgc3RhdGUgKi8KKyAgICBzdGF0ZS0+QVtRXSArPSBGRkFCUyhyZXQpIC0gUkl0eXBlOworICAgIHJldCAgICAgICAgICo9IHN0YXRlLT50d29uZWFyOworICAgIGZmX2pwZWdsc19kb3duc2NhbGVfc3RhdGUoc3RhdGUsIFEpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBEZWNvZGUgb25lIGxpbmUgb2YgaW1hZ2UKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxzX2RlY29kZV9saW5lKEpMU1N0YXRlICpzdGF0ZSwgTUpwZWdEZWNvZGVDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxhc3QsIHZvaWQgKmRzdCwgaW50IGxhc3QyLCBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgY29tcCwgaW50IGJpdHMpCit7CisgICAgaW50IGksIHggPSAwOworICAgIGludCBSYSwgUmIsIFJjLCBSZDsKKyAgICBpbnQgRDAsIEQxLCBEMjsKKworICAgIHdoaWxlICh4IDwgdykgeworICAgICAgICBpbnQgZXJyLCBwcmVkOworCisgICAgICAgIC8qIGNvbXB1dGUgZ3JhZGllbnRzICovCisgICAgICAgIFJhID0geCA/IFIoZHN0LCB4IC0gc3RyaWRlKSA6IFIobGFzdCwgeCk7CisgICAgICAgIFJiID0gUihsYXN0LCB4KTsKKyAgICAgICAgUmMgPSB4ID8gUihsYXN0LCB4IC0gc3RyaWRlKSA6IGxhc3QyOworICAgICAgICBSZCA9ICh4ID49IHcgLSBzdHJpZGUpID8gUihsYXN0LCB4KSA6IFIobGFzdCwgeCArIHN0cmlkZSk7CisgICAgICAgIEQwID0gUmQgLSBSYjsKKyAgICAgICAgRDEgPSBSYiAtIFJjOworICAgICAgICBEMiA9IFJjIC0gUmE7CisgICAgICAgIC8qIHJ1biBtb2RlICovCisgICAgICAgIGlmICgoRkZBQlMoRDApIDw9IHN0YXRlLT5uZWFyKSAmJgorICAgICAgICAgICAgKEZGQUJTKEQxKSA8PSBzdGF0ZS0+bmVhcikgJiYKKyAgICAgICAgICAgIChGRkFCUyhEMikgPD0gc3RhdGUtPm5lYXIpKSB7CisgICAgICAgICAgICBpbnQgcjsKKyAgICAgICAgICAgIGludCBSSXR5cGU7CisKKyAgICAgICAgICAgIC8qIGRlY29kZSBmdWxsIHJ1bnMgd2hpbGUgYXZhaWxhYmxlICovCisgICAgICAgICAgICB3aGlsZSAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgICAgICAgICBpbnQgcjsKKyAgICAgICAgICAgICAgICByID0gMSA8PCBmZl9sb2cyX3J1bltzdGF0ZS0+cnVuX2luZGV4W2NvbXBdXTsKKyAgICAgICAgICAgICAgICBpZiAoeCArIHIgKiBzdHJpZGUgPiB3KQorICAgICAgICAgICAgICAgICAgICByID0gKHcgLSB4KSAvIHN0cmlkZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFcoZHN0LCB4LCBSYSk7CisgICAgICAgICAgICAgICAgICAgIHggKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBpZiBFT0wgcmVhY2hlZCwgd2Ugc3RvcCBkZWNvZGluZyAqLworICAgICAgICAgICAgICAgIGlmIChyICE9IDEgPDwgZmZfbG9nMl9ydW5bc3RhdGUtPnJ1bl9pbmRleFtjb21wXV0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPnJ1bl9pbmRleFtjb21wXSA8IDMxKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cnVuX2luZGV4W2NvbXBdKys7CisgICAgICAgICAgICAgICAgaWYgKHggKyBzdHJpZGUgPiB3KQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZWNvZGUgYWJvcnRlZCBydW4gKi8KKyAgICAgICAgICAgIHIgPSBmZl9sb2cyX3J1bltzdGF0ZS0+cnVuX2luZGV4W2NvbXBdXTsKKyAgICAgICAgICAgIGlmIChyKQorICAgICAgICAgICAgICAgIHIgPSBnZXRfYml0c19sb25nKCZzLT5nYiwgcik7CisgICAgICAgICAgICBpZiAoeCArIHIgKiBzdHJpZGUgPiB3KSB7CisgICAgICAgICAgICAgICAgciA9ICh3IC0geCkgLyBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKSB7CisgICAgICAgICAgICAgICAgVyhkc3QsIHgsIFJhKTsKKyAgICAgICAgICAgICAgICB4ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHggPj0gdykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJydW4gb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZGVjb2RlIHJ1biB0ZXJtaW5hdGlvbiB2YWx1ZSAqLworICAgICAgICAgICAgUmIgICAgID0gUihsYXN0LCB4KTsKKyAgICAgICAgICAgIFJJdHlwZSA9IChGRkFCUyhSYSAtIFJiKSA8PSBzdGF0ZS0+bmVhcikgPyAxIDogMDsKKyAgICAgICAgICAgIGVyciAgICA9IGxzX2dldF9jb2RlX3J1bnRlcm0oJnMtPmdiLCBzdGF0ZSwgUkl0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9sb2cyX3J1bltzdGF0ZS0+cnVuX2luZGV4W2NvbXBdXSk7CisgICAgICAgICAgICBpZiAoc3RhdGUtPnJ1bl9pbmRleFtjb21wXSkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+cnVuX2luZGV4W2NvbXBdLS07CisKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bmVhciAmJiBSSXR5cGUpIHsKKyAgICAgICAgICAgICAgICBwcmVkID0gUmEgKyBlcnI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChSYiA8IFJhKQorICAgICAgICAgICAgICAgICAgICBwcmVkID0gUmIgLSBlcnI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwcmVkID0gUmIgKyBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8qIHJlZ3VsYXIgbW9kZSAqLworICAgICAgICAgICAgaW50IGNvbnRleHQsIHNpZ247CisKKyAgICAgICAgICAgIGNvbnRleHQgPSBmZl9qcGVnbHNfcXVhbnRpemUoc3RhdGUsIEQwKSAqIDgxICsKKyAgICAgICAgICAgICAgICAgICAgICBmZl9qcGVnbHNfcXVhbnRpemUoc3RhdGUsIEQxKSAqICA5ICsKKyAgICAgICAgICAgICAgICAgICAgICBmZl9qcGVnbHNfcXVhbnRpemUoc3RhdGUsIEQyKTsKKyAgICAgICAgICAgIHByZWQgICAgPSBtaWRfcHJlZChSYSwgUmEgKyBSYiAtIFJjLCBSYik7CisKKyAgICAgICAgICAgIGlmIChjb250ZXh0IDwgMCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQgPSAtY29udGV4dDsKKyAgICAgICAgICAgICAgICBzaWduICAgID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2lnbiA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaWduKSB7CisgICAgICAgICAgICAgICAgcHJlZCA9IGF2X2NsaXAocHJlZCAtIHN0YXRlLT5DW2NvbnRleHRdLCAwLCBzdGF0ZS0+bWF4dmFsKTsKKyAgICAgICAgICAgICAgICBlcnIgID0gLWxzX2dldF9jb2RlX3JlZ3VsYXIoJnMtPmdiLCBzdGF0ZSwgY29udGV4dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByZWQgPSBhdl9jbGlwKHByZWQgKyBzdGF0ZS0+Q1tjb250ZXh0XSwgMCwgc3RhdGUtPm1heHZhbCk7CisgICAgICAgICAgICAgICAgZXJyICA9IGxzX2dldF9jb2RlX3JlZ3VsYXIoJnMtPmdiLCBzdGF0ZSwgY29udGV4dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHdlIGhhdmUgdG8gZG8gc29tZXRoaW5nIG1vcmUgZm9yIG5lYXItbG9zc2xlc3MgY29kaW5nICovCisgICAgICAgICAgICBwcmVkICs9IGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUtPm5lYXIpIHsKKyAgICAgICAgICAgIGlmIChwcmVkIDwgLXN0YXRlLT5uZWFyKQorICAgICAgICAgICAgICAgIHByZWQgKz0gc3RhdGUtPnJhbmdlICogc3RhdGUtPnR3b25lYXI7CisgICAgICAgICAgICBlbHNlIGlmIChwcmVkID4gc3RhdGUtPm1heHZhbCArIHN0YXRlLT5uZWFyKQorICAgICAgICAgICAgICAgIHByZWQgLT0gc3RhdGUtPnJhbmdlICogc3RhdGUtPnR3b25lYXI7CisgICAgICAgICAgICBwcmVkID0gYXZfY2xpcChwcmVkLCAwLCBzdGF0ZS0+bWF4dmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByZWQgJj0gc3RhdGUtPm1heHZhbDsKKyAgICAgICAgVyhkc3QsIHgsIHByZWQpOworICAgICAgICB4ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK2ludCBmZl9qcGVnbHNfZGVjb2RlX3BpY3R1cmUoTUpwZWdEZWNvZGVDb250ZXh0ICpzLCBpbnQgbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvaW50X3RyYW5zZm9ybSwgaW50IGlsdikKK3sKKyAgICBpbnQgaSwgdCA9IDA7CisgICAgdWludDhfdCAqemVybywgKmxhc3QsICpjdXI7CisgICAgSkxTU3RhdGUgKnN0YXRlOworICAgIGludCBvZmYgPSAwLCBzdHJpZGUgPSAxLCB3aWR0aCwgc2hpZnQsIHJldCA9IDA7CisKKyAgICB6ZXJvID0gYXZfbWFsbG9jeihzLT5waWN0dXJlX3B0ci0+bGluZXNpemVbMF0pOworICAgIGxhc3QgPSB6ZXJvOworICAgIGN1ciAgPSBzLT5waWN0dXJlX3B0ci0+ZGF0YVswXTsKKworICAgIHN0YXRlID0gYXZfbWFsbG9jeihzaXplb2YoSkxTU3RhdGUpKTsKKyAgICAvKiBpbml0aWFsaXplIEpQRUctTFMgc3RhdGUgZnJvbSBKUEVHIHBhcmFtZXRlcnMgKi8KKyAgICBzdGF0ZS0+bmVhciAgID0gbmVhcjsKKyAgICBzdGF0ZS0+YnBwICAgID0gKHMtPmJpdHMgPCAyKSA/IDIgOiBzLT5iaXRzOworICAgIHN0YXRlLT5tYXh2YWwgPSBzLT5tYXh2YWw7CisgICAgc3RhdGUtPlQxICAgICA9IHMtPnQxOworICAgIHN0YXRlLT5UMiAgICAgPSBzLT50MjsKKyAgICBzdGF0ZS0+VDMgICAgID0gcy0+dDM7CisgICAgc3RhdGUtPnJlc2V0ICA9IHMtPnJlc2V0OworICAgIGZmX2pwZWdsc19yZXNldF9jb2RpbmdfcGFyYW1ldGVycyhzdGF0ZSwgMCk7CisgICAgZmZfanBlZ2xzX2luaXRfc3RhdGUoc3RhdGUpOworCisgICAgaWYgKHMtPmJpdHMgPD0gOCkKKyAgICAgICAgc2hpZnQgPSBwb2ludF90cmFuc2Zvcm0gKyAoOCAtIHMtPmJpdHMpOworICAgIGVsc2UKKyAgICAgICAgc2hpZnQgPSBwb2ludF90cmFuc2Zvcm0gKyAoMTYgLSBzLT5iaXRzKTsKKworICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiSlBFRy1MUyBwYXJhbXM6ICVpeCVpIE5FQVI9JWkgTVY9JWkgVCglaSwlaSwlaSkgIgorICAgICAgICAgICAgICAgIlJFU0VUPSVpLCBMSU1JVD0laSwgcWJwcD0laSwgUkFOR0U9JWlcbiIsCisgICAgICAgICAgICAgICAgcy0+d2lkdGgsIHMtPmhlaWdodCwgc3RhdGUtPm5lYXIsIHN0YXRlLT5tYXh2YWwsCisgICAgICAgICAgICAgICAgc3RhdGUtPlQxLCBzdGF0ZS0+VDIsIHN0YXRlLT5UMywKKyAgICAgICAgICAgICAgICBzdGF0ZS0+cmVzZXQsIHN0YXRlLT5saW1pdCwgc3RhdGUtPnFicHAsIHN0YXRlLT5yYW5nZSk7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiSlBFRyBwYXJhbXM6IElMVj0laSBQdD0laSBCUFA9JWksIHNjYW4gPSAlaVxuIiwKKyAgICAgICAgICAgICAgICBpbHYsIHBvaW50X3RyYW5zZm9ybSwgcy0+Yml0cywgcy0+Y3VyX3NjYW4pOworICAgIH0KKyAgICBpZiAoaWx2ID09IDApIHsgLyogc2VwYXJhdGUgcGxhbmVzICovCisgICAgICAgIGlmIChzLT5jdXJfc2NhbiA+IHMtPm5iX2NvbXBvbmVudHMpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBzdHJpZGUgPSAocy0+bmJfY29tcG9uZW50cyA+IDEpID8gMyA6IDE7CisgICAgICAgIG9mZiAgICA9IGF2X2NsaXAocy0+Y3VyX3NjYW4gLSAxLCAwLCBzdHJpZGUgLSAxKTsKKyAgICAgICAgd2lkdGggID0gcy0+d2lkdGggKiBzdHJpZGU7CisgICAgICAgIGN1ciAgICs9IG9mZjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+Yml0cyA8PSA4KSB7CisgICAgICAgICAgICAgICAgbHNfZGVjb2RlX2xpbmUoc3RhdGUsIHMsIGxhc3QsIGN1ciwgdCwgd2lkdGgsIHN0cmlkZSwgb2ZmLCA4KTsKKyAgICAgICAgICAgICAgICB0ID0gbGFzdFswXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbHNfZGVjb2RlX2xpbmUoc3RhdGUsIHMsIGxhc3QsIGN1ciwgdCwgd2lkdGgsIHN0cmlkZSwgb2ZmLCAxNik7CisgICAgICAgICAgICAgICAgdCA9ICooKHVpbnQxNl90ICopbGFzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0ID0gY3VyOworICAgICAgICAgICAgY3VyICs9IHMtPnBpY3R1cmVfcHRyLT5saW5lc2l6ZVswXTsKKworICAgICAgICAgICAgaWYgKHMtPnJlc3RhcnRfaW50ZXJ2YWwgJiYgIS0tcy0+cmVzdGFydF9jb3VudCkgeworICAgICAgICAgICAgICAgIGFsaWduX2dldF9iaXRzKCZzLT5nYik7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMTYpOyAvKiBza2lwIFJTVG4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaWx2ID09IDEpIHsgLyogbGluZSBpbnRlcmxlYXZpbmcgKi8KKyAgICAgICAgaW50IGo7CisgICAgICAgIGludCBSY1szXSA9IHsgMCwgMCwgMCB9OworICAgICAgICBzdHJpZGUgPSAocy0+bmJfY29tcG9uZW50cyA+IDEpID8gMyA6IDE7CisgICAgICAgIG1lbXNldChjdXIsIDAsIHMtPnBpY3R1cmVfcHRyLT5saW5lc2l6ZVswXSk7CisgICAgICAgIHdpZHRoID0gcy0+d2lkdGggKiBzdHJpZGU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0cmlkZTsgaisrKSB7CisgICAgICAgICAgICAgICAgbHNfZGVjb2RlX2xpbmUoc3RhdGUsIHMsIGxhc3QgKyBqLCBjdXIgKyBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJjW2pdLCB3aWR0aCwgc3RyaWRlLCBqLCA4KTsKKyAgICAgICAgICAgICAgICBSY1tqXSA9IGxhc3Rbal07CisKKyAgICAgICAgICAgICAgICBpZiAocy0+cmVzdGFydF9pbnRlcnZhbCAmJiAhLS1zLT5yZXN0YXJ0X2NvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGFsaWduX2dldF9iaXRzKCZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDE2KTsgLyogc2tpcCBSU1RuICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdCA9IGN1cjsKKyAgICAgICAgICAgIGN1ciArPSBzLT5waWN0dXJlX3B0ci0+bGluZXNpemVbMF07CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlsdiA9PSAyKSB7IC8qIHNhbXBsZSBpbnRlcmxlYXZpbmcgKi8KKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocy0+YXZjdHgsICJTYW1wbGUgaW50ZXJsZWF2ZWQgaW1hZ2VzIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAocy0+eGZybSAmJiBzLT5uYl9jb21wb25lbnRzID09IDMpIHsKKyAgICAgICAgaW50IHgsIHc7CisKKyAgICAgICAgdyA9IHMtPndpZHRoICogcy0+bmJfY29tcG9uZW50czsKKworICAgICAgICBpZiAocy0+Yml0cyA8PSA4KSB7CisgICAgICAgICAgICB1aW50OF90ICpzcmMgPSBzLT5waWN0dXJlX3B0ci0+ZGF0YVswXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKHMtPnhmcm0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IG9mZjsgeCA8IHc7IHggKz0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3ggIF0gKz0gc3JjW3grMV0gKyAxMjg7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNbeCsyXSArPSBzcmNbeCsxXSArIDEyODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IG9mZjsgeCA8IHc7IHggKz0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3ggIF0gKz0gc3JjW3grMV0gKyAxMjg7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNbeCsyXSArPSAoKHNyY1t4ICBdICsgc3JjW3grMV0pPj4xKSArIDEyODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IG9mZjsgeCA8IHc7IHggKz0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBzcmNbeCswXSAtICgoc3JjW3grMl0rc3JjW3grMV0pPj4yKSArIDY0OworICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3grMF0gPSBzcmNbeCsyXSArIGcgKyAxMjg7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNbeCsyXSA9IHNyY1t4KzFdICsgZyArIDEyODsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1t4KzFdID0gZzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IG9mZjsgeCA8IHc7IHggKz0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHIgICAgPSBzcmNbeCswXSAtICgoICAgICAgICAgICAgICAgICAgICAgICAzNTkgKiAoc3JjW3grMl0tMTI4KSArIDQ5MCkgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZyAgICA9IHNyY1t4KzBdIC0gKCggODggKiAoc3JjW3grMV0tMTI4KSAtIDE4MyAqIChzcmNbeCsyXS0xMjgpICsgIDMwKSA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBiICAgID0gc3JjW3grMF0gKyAoKDQ1NCAqIChzcmNbeCsxXS0xMjgpICAgICAgICAgICAgICAgICAgICAgICAgKyA1NzQpID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3grMF0gPSBhdl9jbGlwX3VpbnQ4KHIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3grMV0gPSBhdl9jbGlwX3VpbnQ4KGcpOworICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3grMl0gPSBhdl9jbGlwX3VpbnQ4KGIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcmMgKz0gcy0+cGljdHVyZV9wdHItPmxpbmVzaXplWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZQorICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocy0+YXZjdHgsICIxNmJpdCB4ZnJtIik7CisgICAgfQorCisgICAgaWYgKHNoaWZ0KSB7IC8qIHdlIG5lZWQgdG8gZG8gcG9pbnQgdHJhbnNmb3JtIG9yIG5vcm1hbGl6ZSBzYW1wbGVzICovCisgICAgICAgIGludCB4LCB3OworCisgICAgICAgIHcgPSBzLT53aWR0aCAqIHMtPm5iX2NvbXBvbmVudHM7CisKKyAgICAgICAgaWYgKHMtPmJpdHMgPD0gOCkgeworICAgICAgICAgICAgdWludDhfdCAqc3JjID0gcy0+cGljdHVyZV9wdHItPmRhdGFbMF07CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IG9mZjsgeCA8IHc7IHggKz0gc3RyaWRlKQorICAgICAgICAgICAgICAgICAgICBzcmNbeF0gPDw9IHNoaWZ0OworICAgICAgICAgICAgICAgIHNyYyArPSBzLT5waWN0dXJlX3B0ci0+bGluZXNpemVbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50MTZfdCAqc3JjID0gKHVpbnQxNl90ICopcy0+cGljdHVyZV9wdHItPmRhdGFbMF07CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICAgICAgICAgIHNyY1t4XSA8PD0gc2hpZnQ7CisgICAgICAgICAgICAgICAgc3JjICs9IHMtPnBpY3R1cmVfcHRyLT5saW5lc2l6ZVswXSAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK2VuZDoKKyAgICBhdl9mcmVlKHN0YXRlKTsKKyAgICBhdl9mcmVlKHplcm8pOworCisgICAgcmV0dXJuIHJldDsKK30KKworQVZDb2RlYyBmZl9qcGVnbHNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAianBlZ2xzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSlBFRy1MUyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9KUEVHTFMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1KcGVnRGVjb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmZfbWpwZWdfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfbWpwZWdfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBmZl9tanBlZ19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9qcGVnbHNkZWMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2pwZWdsc2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYWZhYmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9qcGVnbHNkZWMuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogSlBFRy1MUyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA2IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSlBFRy1MUyBkZWNvZGVyLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19KUEVHTFNERUNfSAorI2RlZmluZSBBVkNPREVDX0pQRUdMU0RFQ19ICisKKyNpbmNsdWRlICJtanBlZy5oIgorI2luY2x1ZGUgIm1qcGVnZGVjLmgiCisKKy8qKgorICogRGVjb2RlIExTRSBibG9jayB3aXRoIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKKyAqLworaW50IGZmX2pwZWdsc19kZWNvZGVfbHNlKE1KcGVnRGVjb2RlQ29udGV4dCAqcyk7CisKK2ludCBmZl9qcGVnbHNfZGVjb2RlX3BpY3R1cmUoTUpwZWdEZWNvZGVDb250ZXh0ICpzLCBpbnQgbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvaW50X3RyYW5zZm9ybSwgaW50IGlsdik7CisKKyNlbmRpZiAvKiBBVkNPREVDX0pQRUdMU0RFQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9qcGVnbHNlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2pwZWdsc2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMDIzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9qcGVnbHNlbmMuYwpAQCAtMCwwICsxLDQ0MSBAQAorLyoKKyAqIEpQRUctTFMgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEpQRUctTFMgZW5jb2Rlci4KKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtanBlZy5oIgorI2luY2x1ZGUgImpwZWdscy5oIgorCisvKioKKyAqIEVuY29kZSBlcnJvciBmcm9tIHJlZ3VsYXIgc3ltYm9sCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsc19lbmNvZGVfcmVndWxhcihKTFNTdGF0ZSAqc3RhdGUsIFB1dEJpdENvbnRleHQgKnBiLCBpbnQgUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyKQoreworICAgIGludCBrOworICAgIGludCB2YWw7CisgICAgaW50IG1hcDsKKworICAgIGZvciAoayA9IDA7IChzdGF0ZS0+TltRXSA8PCBrKSA8IHN0YXRlLT5BW1FdOyBrKyspCisgICAgICAgIDsKKworICAgIG1hcCA9ICFzdGF0ZS0+bmVhciAmJiAhayAmJiAoMiAqIHN0YXRlLT5CW1FdIDw9IC1zdGF0ZS0+TltRXSk7CisKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZXJyICs9IHN0YXRlLT5yYW5nZTsKKyAgICBpZiAoZXJyID49IChzdGF0ZS0+cmFuZ2UgKyAxID4+IDEpKSB7CisgICAgICAgIGVyciAtPSBzdGF0ZS0+cmFuZ2U7CisgICAgICAgIHZhbCAgPSAyICogRkZBQlMoZXJyKSAtIDEgLSBtYXA7CisgICAgfSBlbHNlCisgICAgICAgIHZhbCA9IDIgKiBlcnIgKyBtYXA7CisKKyAgICBzZXRfdXJfZ29sb21iX2pwZWdscyhwYiwgdmFsLCBrLCBzdGF0ZS0+bGltaXQsIHN0YXRlLT5xYnBwKTsKKworICAgIGZmX2pwZWdsc191cGRhdGVfc3RhdGVfcmVndWxhcihzdGF0ZSwgUSwgZXJyKTsKK30KKworLyoqCisgKiBFbmNvZGUgZXJyb3IgZnJvbSBydW4gdGVybWluYXRpb24KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxzX2VuY29kZV9ydW50ZXJtKEpMU1N0YXRlICpzdGF0ZSwgUHV0Qml0Q29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFJJdHlwZSwgaW50IGVyciwgaW50IGxpbWl0X2FkZCkKK3sKKyAgICBpbnQgazsKKyAgICBpbnQgdmFsLCBtYXA7CisgICAgaW50IFEgPSAzNjUgKyBSSXR5cGU7CisgICAgaW50IHRlbXA7CisKKyAgICB0ZW1wID0gc3RhdGUtPkFbUV07CisgICAgaWYgKFJJdHlwZSkKKyAgICAgICAgdGVtcCArPSBzdGF0ZS0+TltRXSA+PiAxOworICAgIGZvciAoayA9IDA7IChzdGF0ZS0+TltRXSA8PCBrKSA8IHRlbXA7IGsrKykKKyAgICAgICAgOworICAgIG1hcCA9IDA7CisgICAgaWYgKCFrICYmIGVyciAmJiAoMiAqIHN0YXRlLT5CW1FdIDwgc3RhdGUtPk5bUV0pKQorICAgICAgICBtYXAgPSAxOworCisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHZhbCA9IC0oMiAqIGVycikgLSAxIC0gUkl0eXBlICsgbWFwOworICAgIGVsc2UKKyAgICAgICAgdmFsID0gMiAqIGVyciAtIFJJdHlwZSAtIG1hcDsKKyAgICBzZXRfdXJfZ29sb21iX2pwZWdscyhwYiwgdmFsLCBrLCBzdGF0ZS0+bGltaXQgLSBsaW1pdF9hZGQgLSAxLCBzdGF0ZS0+cWJwcCk7CisKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgc3RhdGUtPkJbUV0rKzsKKyAgICBzdGF0ZS0+QVtRXSArPSAodmFsICsgMSAtIFJJdHlwZSkgPj4gMTsKKworICAgIGZmX2pwZWdsc19kb3duc2NhbGVfc3RhdGUoc3RhdGUsIFEpOworfQorCisvKioKKyAqIEVuY29kZSBydW4gdmFsdWUgYXMgc3BlY2lmaWVkIGJ5IEpQRUctTFMgc3RhbmRhcmQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxzX2VuY29kZV9ydW4oSkxTU3RhdGUgKnN0YXRlLCBQdXRCaXRDb250ZXh0ICpwYiwgaW50IHJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wLCBpbnQgdHJhaWwpCit7CisgICAgd2hpbGUgKHJ1biA+PSAoMSA8PCBmZl9sb2cyX3J1bltzdGF0ZS0+cnVuX2luZGV4W2NvbXBdXSkpIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIDEpOworICAgICAgICBydW4gLT0gMSA8PCBmZl9sb2cyX3J1bltzdGF0ZS0+cnVuX2luZGV4W2NvbXBdXTsKKyAgICAgICAgaWYgKHN0YXRlLT5ydW5faW5kZXhbY29tcF0gPCAzMSkKKyAgICAgICAgICAgIHN0YXRlLT5ydW5faW5kZXhbY29tcF0rKzsKKyAgICB9CisgICAgLyogaWYgaGl0IEVPTCwgZW5jb2RlIGFub3RoZXIgZnVsbCBydW4sIGVsc2UgZW5jb2RlIGFib3J0ZWQgcnVuICovCisgICAgaWYgKCF0cmFpbCAmJiBydW4pIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIDEpOworICAgIH0gZWxzZSBpZiAodHJhaWwpIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIDApOworICAgICAgICBpZiAoZmZfbG9nMl9ydW5bc3RhdGUtPnJ1bl9pbmRleFtjb21wXV0pCisgICAgICAgICAgICBwdXRfYml0cyhwYiwgZmZfbG9nMl9ydW5bc3RhdGUtPnJ1bl9pbmRleFtjb21wXV0sIHJ1bik7CisgICAgfQorfQorCisvKioKKyAqIEVuY29kZSBvbmUgbGluZSBvZiBpbWFnZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbHNfZW5jb2RlX2xpbmUoSkxTU3RhdGUgKnN0YXRlLCBQdXRCaXRDb250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpsYXN0LCB2b2lkICpjdXIsIGludCBsYXN0MiwgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGNvbXAsIGludCBiaXRzKQoreworICAgIGludCB4ID0gMDsKKyAgICBpbnQgUmEsIFJiLCBSYywgUmQ7CisgICAgaW50IEQwLCBEMSwgRDI7CisKKyAgICB3aGlsZSAoeCA8IHcpIHsKKyAgICAgICAgaW50IGVyciwgcHJlZCwgc2lnbjsKKworICAgICAgICAvKiBjb21wdXRlIGdyYWRpZW50cyAqLworICAgICAgICBSYSA9IHggPyBSKGN1ciwgeCAtIHN0cmlkZSkgOiBSKGxhc3QsIHgpOworICAgICAgICBSYiA9IFIobGFzdCwgeCk7CisgICAgICAgIFJjID0geCA/IFIobGFzdCwgeCAtIHN0cmlkZSkgOiBsYXN0MjsKKyAgICAgICAgUmQgPSAoeCA+PSB3IC0gc3RyaWRlKSA/IFIobGFzdCwgeCkgOiBSKGxhc3QsIHggKyBzdHJpZGUpOworICAgICAgICBEMCA9IFJkIC0gUmI7CisgICAgICAgIEQxID0gUmIgLSBSYzsKKyAgICAgICAgRDIgPSBSYyAtIFJhOworCisgICAgICAgIC8qIHJ1biBtb2RlICovCisgICAgICAgIGlmICgoRkZBQlMoRDApIDw9IHN0YXRlLT5uZWFyKSAmJgorICAgICAgICAgICAgKEZGQUJTKEQxKSA8PSBzdGF0ZS0+bmVhcikgJiYKKyAgICAgICAgICAgIChGRkFCUyhEMikgPD0gc3RhdGUtPm5lYXIpKSB7CisgICAgICAgICAgICBpbnQgUlVOdmFsLCBSSXR5cGUsIHJ1bjsKKworICAgICAgICAgICAgcnVuICAgID0gMDsKKyAgICAgICAgICAgIFJVTnZhbCA9IFJhOworICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmIChGRkFCUyhSKGN1ciwgeCkgLSBSVU52YWwpIDw9IHN0YXRlLT5uZWFyKSkgeworICAgICAgICAgICAgICAgIHJ1bisrOworICAgICAgICAgICAgICAgIFcoY3VyLCB4LCBSYSk7CisgICAgICAgICAgICAgICAgeCArPSBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsc19lbmNvZGVfcnVuKHN0YXRlLCBwYiwgcnVuLCBjb21wLCB4IDwgdyk7CisgICAgICAgICAgICBpZiAoeCA+PSB3KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFJiICAgICA9IFIobGFzdCwgeCk7CisgICAgICAgICAgICBSSXR5cGUgPSBGRkFCUyhSYSAtIFJiKSA8PSBzdGF0ZS0+bmVhcjsKKyAgICAgICAgICAgIHByZWQgICA9IFJJdHlwZSA/IFJhIDogUmI7CisgICAgICAgICAgICBlcnIgICAgPSBSKGN1ciwgeCkgLSBwcmVkOworCisgICAgICAgICAgICBpZiAoIVJJdHlwZSAmJiBSYSA+IFJiKQorICAgICAgICAgICAgICAgIGVyciA9IC1lcnI7CisKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bmVhcikgeworICAgICAgICAgICAgICAgIGlmIChlcnIgPiAwKQorICAgICAgICAgICAgICAgICAgICBlcnIgPSAgKHN0YXRlLT5uZWFyICsgZXJyKSAvIHN0YXRlLT50d29uZWFyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gLShzdGF0ZS0+bmVhciAtIGVycikgLyBzdGF0ZS0+dHdvbmVhcjsKKworICAgICAgICAgICAgICAgIGlmIChSSXR5cGUgfHwgKFJiID49IFJhKSkKKyAgICAgICAgICAgICAgICAgICAgUmEgPSBhdl9jbGlwKHByZWQgKyBlcnIgKiBzdGF0ZS0+dHdvbmVhciwgMCwgc3RhdGUtPm1heHZhbCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBSYSA9IGF2X2NsaXAocHJlZCAtIGVyciAqIHN0YXRlLT50d29uZWFyLCAwLCBzdGF0ZS0+bWF4dmFsKTsKKyAgICAgICAgICAgICAgICBXKGN1ciwgeCwgUmEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgZXJyICs9IHN0YXRlLT5yYW5nZTsKKyAgICAgICAgICAgIGlmIChlcnIgPj0gc3RhdGUtPnJhbmdlICsgMSA+PiAxKQorICAgICAgICAgICAgICAgIGVyciAtPSBzdGF0ZS0+cmFuZ2U7CisKKyAgICAgICAgICAgIGxzX2VuY29kZV9ydW50ZXJtKHN0YXRlLCBwYiwgUkl0eXBlLCBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9sb2cyX3J1bltzdGF0ZS0+cnVuX2luZGV4W2NvbXBdXSk7CisKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+cnVuX2luZGV4W2NvbXBdID4gMCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+cnVuX2luZGV4W2NvbXBdLS07CisgICAgICAgIH0gZWxzZSB7IC8qIHJlZ3VsYXIgbW9kZSAqLworICAgICAgICAgICAgaW50IGNvbnRleHQ7CisKKyAgICAgICAgICAgIGNvbnRleHQgPSBmZl9qcGVnbHNfcXVhbnRpemUoc3RhdGUsIEQwKSAqIDgxICsKKyAgICAgICAgICAgICAgICAgICAgICBmZl9qcGVnbHNfcXVhbnRpemUoc3RhdGUsIEQxKSAqICA5ICsKKyAgICAgICAgICAgICAgICAgICAgICBmZl9qcGVnbHNfcXVhbnRpemUoc3RhdGUsIEQyKTsKKyAgICAgICAgICAgIHByZWQgICAgPSBtaWRfcHJlZChSYSwgUmEgKyBSYiAtIFJjLCBSYik7CisKKyAgICAgICAgICAgIGlmIChjb250ZXh0IDwgMCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQgPSAtY29udGV4dDsKKyAgICAgICAgICAgICAgICBzaWduICAgID0gMTsKKyAgICAgICAgICAgICAgICBwcmVkICAgID0gYXZfY2xpcChwcmVkIC0gc3RhdGUtPkNbY29udGV4dF0sIDAsIHN0YXRlLT5tYXh2YWwpOworICAgICAgICAgICAgICAgIGVyciAgICAgPSBwcmVkIC0gUihjdXIsIHgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaWduID0gMDsKKyAgICAgICAgICAgICAgICBwcmVkID0gYXZfY2xpcChwcmVkICsgc3RhdGUtPkNbY29udGV4dF0sIDAsIHN0YXRlLT5tYXh2YWwpOworICAgICAgICAgICAgICAgIGVyciAgPSBSKGN1ciwgeCkgLSBwcmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGUtPm5lYXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID4gMCkKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gIChzdGF0ZS0+bmVhciArIGVycikgLyBzdGF0ZS0+dHdvbmVhcjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVyciA9IC0oc3RhdGUtPm5lYXIgLSBlcnIpIC8gc3RhdGUtPnR3b25lYXI7CisgICAgICAgICAgICAgICAgaWYgKCFzaWduKQorICAgICAgICAgICAgICAgICAgICBSYSA9IGF2X2NsaXAocHJlZCArIGVyciAqIHN0YXRlLT50d29uZWFyLCAwLCBzdGF0ZS0+bWF4dmFsKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFJhID0gYXZfY2xpcChwcmVkIC0gZXJyICogc3RhdGUtPnR3b25lYXIsIDAsIHN0YXRlLT5tYXh2YWwpOworICAgICAgICAgICAgICAgIFcoY3VyLCB4LCBSYSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxzX2VuY29kZV9yZWd1bGFyKHN0YXRlLCBwYiwgY29udGV4dCwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICB4ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGxzX3N0b3JlX2xzZShKTFNTdGF0ZSAqc3RhdGUsIFB1dEJpdENvbnRleHQgKnBiKQoreworICAgIC8qIFRlc3QgaWYgd2UgaGF2ZSBkZWZhdWx0IHBhcmFtcyBhbmQgZG9uJ3QgbmVlZCB0byBzdG9yZSBMU0UgKi8KKyAgICBKTFNTdGF0ZSBzdGF0ZTIgPSB7IDAgfTsKKyAgICBzdGF0ZTIuYnBwICA9IHN0YXRlLT5icHA7CisgICAgc3RhdGUyLm5lYXIgPSBzdGF0ZS0+bmVhcjsKKyAgICBmZl9qcGVnbHNfcmVzZXRfY29kaW5nX3BhcmFtZXRlcnMoJnN0YXRlMiwgMSk7CisgICAgaWYgKHN0YXRlLT5UMSA9PSBzdGF0ZTIuVDEgJiYKKyAgICAgICAgc3RhdGUtPlQyID09IHN0YXRlMi5UMiAmJgorICAgICAgICBzdGF0ZS0+VDMgPT0gc3RhdGUyLlQzICYmCisgICAgICAgIHN0YXRlLT5yZXNldCA9PSBzdGF0ZTIucmVzZXQpCisgICAgICAgIHJldHVybjsKKyAgICAvKiBzdG9yZSBMU0UgdHlwZSAxICovCisgICAgcHV0X21hcmtlcihwYiwgTFNFKTsKKyAgICBwdXRfYml0cyhwYiwgMTYsIDEzKTsKKyAgICBwdXRfYml0cyhwYiwgOCwgMSk7CisgICAgcHV0X2JpdHMocGIsIDE2LCBzdGF0ZS0+bWF4dmFsKTsKKyAgICBwdXRfYml0cyhwYiwgMTYsIHN0YXRlLT5UMSk7CisgICAgcHV0X2JpdHMocGIsIDE2LCBzdGF0ZS0+VDIpOworICAgIHB1dF9iaXRzKHBiLCAxNiwgc3RhdGUtPlQzKTsKKyAgICBwdXRfYml0cyhwYiwgMTYsIHN0YXRlLT5yZXNldCk7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3BpY3R1cmVfbHMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWN0LCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgY29uc3QgQVZGcmFtZSAqY29uc3QgcCA9IHBpY3Q7CisgICAgY29uc3QgaW50IG5lYXIgICAgICAgICA9IGF2Y3R4LT5wcmVkaWN0aW9uX21ldGhvZDsKKyAgICBQdXRCaXRDb250ZXh0IHBiLCBwYjI7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICB1aW50OF90ICpidWYyLCAqemVybywgKmN1ciwgKmxhc3Q7CisgICAgSkxTU3RhdGUgKnN0YXRlOworICAgIGludCBpLCBzaXplLCByZXQ7CisgICAgaW50IGNvbXBzOworCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR1JBWTggfHwKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HUkFZMTYpCisgICAgICAgIGNvbXBzID0gMTsKKyAgICBlbHNlCisgICAgICAgIGNvbXBzID0gMzsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBhdmN0eC0+d2lkdGggICphdmN0eC0+aGVpZ2h0ICogY29tcHMgKiA0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfTUlOX0JVRkZFUl9TSVpFKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYnVmMiA9IGF2X21hbGxvYyhwa3QtPnNpemUpOworCisgICAgaW5pdF9wdXRfYml0cygmcGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICBpbml0X3B1dF9iaXRzKCZwYjIsIGJ1ZjIsIHBrdC0+c2l6ZSk7CisKKyAgICAvKiB3cml0ZSBvdXIgb3duIEpQRUcgaGVhZGVyLCBjYW4ndCB1c2UgbWpwZWdfcGljdHVyZV9oZWFkZXIgKi8KKyAgICBwdXRfbWFya2VyKCZwYiwgU09JKTsKKyAgICBwdXRfbWFya2VyKCZwYiwgU09GNDgpOworICAgIHB1dF9iaXRzKCZwYiwgMTYsIDggKyBjb21wcyAqIDMpOyAvLyBoZWFkZXIgc2l6ZSBkZXBlbmRzIG9uIGNvbXBvbmVudHMKKyAgICBwdXRfYml0cygmcGIsIDgsIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dSQVkxNikgPyAxNiA6IDgpOyAgLy8gYnBwCisgICAgcHV0X2JpdHMoJnBiLCAxNiwgYXZjdHgtPmhlaWdodCk7CisgICAgcHV0X2JpdHMoJnBiLCAxNiwgYXZjdHgtPndpZHRoKTsKKyAgICBwdXRfYml0cygmcGIsIDgsIGNvbXBzKTsgICAgICAgICAgLy8gY29tcG9uZW50cworICAgIGZvciAoaSA9IDE7IGkgPD0gY29tcHM7IGkrKykgeworICAgICAgICBwdXRfYml0cygmcGIsIDgsIGkpOyAgICAgLy8gY29tcG9uZW50IElECisgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgMHgxMSk7ICAvLyBzdWJzYW1wbGluZzogbm9uZQorICAgICAgICBwdXRfYml0cygmcGIsIDgsIDApOyAgICAgLy8gVGlxLCB1c2VkIGJ5IEpQRUctTFMgZXh0CisgICAgfQorCisgICAgcHV0X21hcmtlcigmcGIsIFNPUyk7CisgICAgcHV0X2JpdHMoJnBiLCAxNiwgNiArIGNvbXBzICogMik7CisgICAgcHV0X2JpdHMoJnBiLCA4LCBjb21wcyk7CisgICAgZm9yIChpID0gMTsgaSA8PSBjb21wczsgaSsrKSB7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgaSk7ICAgLy8gY29tcG9uZW50IElECisgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgMCk7ICAgLy8gbWFwcGluZyBpbmRleDogbm9uZQorICAgIH0KKyAgICBwdXRfYml0cygmcGIsIDgsIG5lYXIpOworICAgIHB1dF9iaXRzKCZwYiwgOCwgKGNvbXBzID4gMSkgPyAxIDogMCk7ICAvLyBpbnRlcmxlYXZpbmc6IDAgLSBwbGFuZSwgMSAtIGxpbmUKKyAgICBwdXRfYml0cygmcGIsIDgsIDApOyAgLy8gcG9pbnQgdHJhbnNmb3JtOiBub25lCisKKyAgICBzdGF0ZSA9IGF2X21hbGxvY3ooc2l6ZW9mKEpMU1N0YXRlKSk7CisgICAgLyogaW5pdGlhbGl6ZSBKUEVHLUxTIHN0YXRlIGZyb20gSlBFRyBwYXJhbWV0ZXJzICovCisgICAgc3RhdGUtPm5lYXIgPSBuZWFyOworICAgIHN0YXRlLT5icHAgID0gKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR1JBWTE2KSA/IDE2IDogODsKKyAgICBmZl9qcGVnbHNfcmVzZXRfY29kaW5nX3BhcmFtZXRlcnMoc3RhdGUsIDApOworICAgIGZmX2pwZWdsc19pbml0X3N0YXRlKHN0YXRlKTsKKworICAgIGxzX3N0b3JlX2xzZShzdGF0ZSwgJnBiKTsKKworICAgIHplcm8gPSBhdl9tYWxsb2N6KEZGQUJTKHAtPmxpbmVzaXplWzBdKSk7CisgICAgaWYgKCF6ZXJvKSB7CisgICAgICAgIGF2X2ZyZWUoc3RhdGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBsYXN0ID0gemVybzsKKyAgICBjdXIgID0gcC0+ZGF0YVswXTsKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HUkFZOCkgeworICAgICAgICBpbnQgdCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgbHNfZW5jb2RlX2xpbmUoc3RhdGUsICZwYjIsIGxhc3QsIGN1ciwgdCwgYXZjdHgtPndpZHRoLCAxLCAwLCA4KTsKKyAgICAgICAgICAgIHQgICAgPSBsYXN0WzBdOworICAgICAgICAgICAgbGFzdCA9IGN1cjsKKyAgICAgICAgICAgIGN1ciArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HUkFZMTYpIHsKKyAgICAgICAgaW50IHQgPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIGxzX2VuY29kZV9saW5lKHN0YXRlLCAmcGIyLCBsYXN0LCBjdXIsIHQsIGF2Y3R4LT53aWR0aCwgMSwgMCwgMTYpOworICAgICAgICAgICAgdCAgICA9ICooKHVpbnQxNl90ICopbGFzdCk7CisgICAgICAgICAgICBsYXN0ID0gY3VyOworICAgICAgICAgICAgY3VyICs9IHAtPmxpbmVzaXplWzBdOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CisgICAgICAgIGludCBqLCB3aWR0aDsKKyAgICAgICAgaW50IFJjWzNdID0geyAwLCAwLCAwIH07CisKKyAgICAgICAgd2lkdGggPSBhdmN0eC0+d2lkdGggKiAzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CisgICAgICAgICAgICAgICAgbHNfZW5jb2RlX2xpbmUoc3RhdGUsICZwYjIsIGxhc3QgKyBqLCBjdXIgKyBqLCBSY1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgMywgaiwgOCk7CisgICAgICAgICAgICAgICAgUmNbal0gPSBsYXN0W2pdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdCA9IGN1cjsKKyAgICAgICAgICAgIGN1ciArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1IyNCkgeworICAgICAgICBpbnQgaiwgd2lkdGg7CisgICAgICAgIGludCBSY1szXSA9IHsgMCwgMCwgMCB9OworCisgICAgICAgIHdpZHRoID0gYXZjdHgtPndpZHRoICogMzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgZm9yIChqID0gMjsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICBsc19lbmNvZGVfbGluZShzdGF0ZSwgJnBiMiwgbGFzdCArIGosIGN1ciArIGosIFJjW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAzLCBqLCA4KTsKKyAgICAgICAgICAgICAgICBSY1tqXSA9IGxhc3Rbal07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0ID0gY3VyOworICAgICAgICAgICAgY3VyICs9IHAtPmxpbmVzaXplWzBdOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJlZXAoJnplcm8pOworICAgIGF2X2ZyZWVwKCZzdGF0ZSk7CisKKyAgICAvKiB0aGUgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgYWZ0ZXIgZG9pbmcgMHhmZiBlc2NhcGluZyB1bnVzZWQgYml0cyBpbgorICAgICAqIHRoZSBsYXN0IGJ5dGUgbXVzdCBiZSBzZXQgdG8gMCwgc28ganVzdCBhcHBlbmQgNyAib3B0aW9uYWwiIHplcm8tYml0cworICAgICAqIHRvIGF2b2lkIHNwZWNpYWwtY2FzaW5nLiAqLworICAgIHB1dF9iaXRzKCZwYjIsIDcsIDApOworICAgIHNpemUgPSBwdXRfYml0c19jb3VudCgmcGIyKTsKKyAgICBmbHVzaF9wdXRfYml0cygmcGIyKTsKKyAgICAvKiBkbyBlc2NhcGUgY29kaW5nICovCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZjIsIHNpemUpOworICAgIHNpemUgLT0gNzsKKyAgICB3aGlsZSAoZ2V0X2JpdHNfY291bnQoJmdiKSA8IHNpemUpIHsKKyAgICAgICAgaW50IHY7CisgICAgICAgIHYgPSBnZXRfYml0cygmZ2IsIDgpOworICAgICAgICBwdXRfYml0cygmcGIsIDgsIHYpOworICAgICAgICBpZiAodiA9PSAweEZGKSB7CisgICAgICAgICAgICB2ID0gZ2V0X2JpdHMoJmdiLCA3KTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgdik7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZwcml2X2FsaWduX3B1dF9iaXRzKCZwYik7CisgICAgYXZfZnJlZShidWYyKTsKKworICAgIC8qIEVuZCBvZiBpbWFnZSAqLworICAgIHB1dF9tYXJrZXIoJnBiLCBFT0kpOworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisKKyAgICBlbW1zX2MoKTsKKworICAgIHBrdC0+c2l6ZSAgID0gcHV0X2JpdHNfY291bnQoJnBiKSA+PiAzOworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGVuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGVuY29kZV9pbml0X2xzKEFWQ29kZWNDb250ZXh0ICpjdHgpCit7CisgICAgY3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFjdHgtPmNvZGVkX2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgY3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKworICAgIGlmIChjdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9HUkFZOCAgJiYKKyAgICAgICAgY3R4LT5waXhfZm10ICE9IEFWX1BJWF9GTVRfR1JBWTE2ICYmCisgICAgICAgIGN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1JHQjI0ICAmJgorICAgICAgICBjdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9CR1IyNCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiT25seSBncmF5c2NhbGUgYW5kIFJHQjI0L0JHUjI0IGltYWdlcyBhcmUgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9qcGVnbHNfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAianBlZ2xzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSlBFRy1MUyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9KUEVHTFMsCisgICAgLmluaXQgICAgICAgICAgID0gZW5jb2RlX2luaXRfbHMsCisgICAgLmNsb3NlICAgICAgICAgID0gZW5jb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9GUkFNRV9USFJFQURTIHwgQ09ERUNfQ0FQX0lOVFJBX09OTFksCisgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX3BpY3R1cmVfbHMsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfQkdSMjQsIEFWX1BJWF9GTVRfUkdCMjQsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWTE2LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2pyZXZkY3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2pyZXZkY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWE3MzkyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvanJldmRjdC5jCkBAIC0wLDAgKzEsMTE2OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKgorICogVGhlIGF1dGhvcnMgbWFrZSBOTyBXQVJSQU5UWSBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwKKyAqIHdpdGggcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLCBpdHMgcXVhbGl0eSwgYWNjdXJhY3ksIG1lcmNoYW50YWJpbGl0eSwgb3IKKyAqIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMgSVMiLCBhbmQKKyAqIHlvdSwgaXRzIHVzZXIsIGFzc3VtZSB0aGUgZW50aXJlIHJpc2sgYXMgdG8gaXRzIHF1YWxpdHkgYW5kIGFjY3VyYWN5LgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgY29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCBUaG9tYXMgRy4gTGFuZS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQgZXhjZXB0IGFzIHNwZWNpZmllZCBiZWxvdy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgc3ViamVjdCB0bworICogdGhlc2UgY29uZGl0aW9uczoKKyAqICgxKSBJZiBhbnkgcGFydCBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4KKyAqIHRoaXMgUkVBRE1FIGZpbGUgbXVzdCBiZSBpbmNsdWRlZCwgd2l0aCB0aGlzIGNvcHlyaWdodCBhbmQgbm8td2FycmFudHkKKyAqIG5vdGljZSB1bmFsdGVyZWQ7IGFuZCBhbnkgYWRkaXRpb25zLCBkZWxldGlvbnMsIG9yIGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsCisgKiBmaWxlcyBtdXN0IGJlIGNsZWFybHkgaW5kaWNhdGVkIGluIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uLgorICogKDIpIElmIG9ubHkgZXhlY3V0YWJsZSBjb2RlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoZSBhY2NvbXBhbnlpbmcKKyAqIGRvY3VtZW50YXRpb24gbXVzdCBzdGF0ZSB0aGF0ICJ0aGlzIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIHdvcmsKKyAqIG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwIi4KKyAqICgzKSBQZXJtaXNzaW9uIGZvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIG9ubHkgaWYgdGhlIHVzZXIgYWNjZXB0cworICogZnVsbCByZXNwb25zaWJpbGl0eSBmb3IgYW55IHVuZGVzaXJhYmxlIGNvbnNlcXVlbmNlczsgdGhlIGF1dGhvcnMgYWNjZXB0CisgKiBOTyBMSUFCSUxJVFkgZm9yIGRhbWFnZXMgb2YgYW55IGtpbmQuCisgKgorICogVGhlc2UgY29uZGl0aW9ucyBhcHBseSB0byBhbnkgc29mdHdhcmUgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoZSBJSkcKKyAqIGNvZGUsIG5vdCBqdXN0IHRvIHRoZSB1bm1vZGlmaWVkIGxpYnJhcnkuICBJZiB5b3UgdXNlIG91ciB3b3JrLCB5b3Ugb3VnaHQKKyAqIHRvIGFja25vd2xlZGdlIHVzLgorICoKKyAqIFBlcm1pc3Npb24gaXMgTk9UIGdyYW50ZWQgZm9yIHRoZSB1c2Ugb2YgYW55IElKRyBhdXRob3IncyBuYW1lIG9yIGNvbXBhbnkKKyAqIG5hbWUgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoaXMgc29mdHdhcmUgb3IgcHJvZHVjdHMKKyAqIGRlcml2ZWQgZnJvbSBpdC4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZmVycmVkIHRvIG9ubHkgYXMgInRoZSBJbmRlcGVuZGVudAorICogSlBFRyBHcm91cCdzIHNvZnR3YXJlIi4KKyAqCisgKiBXZSBzcGVjaWZpY2FsbHkgcGVybWl0IGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFzIHRoZSBiYXNpcworICogb2YgY29tbWVyY2lhbCBwcm9kdWN0cywgcHJvdmlkZWQgdGhhdCBhbGwgd2FycmFudHkgb3IgbGlhYmlsaXR5IGNsYWltcyBhcmUKKyAqIGFzc3VtZWQgYnkgdGhlIHByb2R1Y3QgdmVuZG9yLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYmFzaWMgaW52ZXJzZS1EQ1QgdHJhbnNmb3JtYXRpb24gc3Vicm91dGluZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGFuIGFsZ29yaXRobSBkZXNjcmliZWQgaW4KKyAqICAgQy4gTG9lZmZsZXIsIEEuIExpZ3RlbmJlcmcgYW5kIEcuIE1vc2NoeXR6LCAiUHJhY3RpY2FsIEZhc3QgMS1EIERDVAorICogICBBbGdvcml0aG1zIHdpdGggMTEgTXVsdGlwbGljYXRpb25zIiwgUHJvYy4gSW50J2wuIENvbmYuIG9uIEFjb3VzdGljcywKKyAqICAgU3BlZWNoLCBhbmQgU2lnbmFsIFByb2Nlc3NpbmcgMTk4OSAoSUNBU1NQICc4OSksIHBwLiA5ODgtOTkxLgorICogVGhlIHByaW1hcnkgYWxnb3JpdGhtIGRlc2NyaWJlZCB0aGVyZSB1c2VzIDExIG11bHRpcGxpZXMgYW5kIDI5IGFkZHMuCisgKiBXZSB1c2UgdGhlaXIgYWx0ZXJuYXRlIG1ldGhvZCB3aXRoIDEyIG11bHRpcGxpZXMgYW5kIDMyIGFkZHMuCisgKiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgbm8gZGF0YSBwYXRoIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUKKyAqIG11bHRpcGxpY2F0aW9uOyB0aGlzIGFsbG93cyBhIHZlcnkgc2ltcGxlIGFuZCBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBpbgorICogc2NhbGVkIGZpeGVkLXBvaW50IGFyaXRobWV0aWMsIHdpdGggYSBtaW5pbWFsIG51bWJlciBvZiBzaGlmdHMuCisgKgorICogSSd2ZSBtYWRlIGxvdHMgb2YgbW9kaWZpY2F0aW9ucyB0byBhdHRlbXB0IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZQorICogc3BhcnNlIG5hdHVyZSBvZiB0aGUgRENUIG1hdHJpY2VzIHdlJ3JlIGdldHRpbmcuICBBbHRob3VnaCB0aGUgbG9naWMKKyAqIGlzIGN1bWJlcnNvbWUsIGl0J3Mgc3RyYWlnaHRmb3J3YXJkIGFuZCB0aGUgcmVzdWx0aW5nIGNvZGUgaXMgbXVjaAorICogZmFzdGVyLgorICoKKyAqIEEgYmV0dGVyIHdheSB0byBkbyB0aGlzIHdvdWxkIGJlIHRvIHBhc3MgaW4gdGhlIERDVCBibG9jayBhcyBhIHNwYXJzZQorICogbWF0cml4LCBwZXJoYXBzIHdpdGggdGhlIGRpZmZlcmVuY2UgY2FzZXMgZW5jb2RlZC4KKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgTExNIGlkY3QuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworI2luY2x1ZGUgImRjdC5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKworI2RlZmluZSBFSUdIVF9CSVRfU0FNUExFUworCisjZGVmaW5lIERDVFNJWkUgOAorI2RlZmluZSBEQ1RTSVpFMiA2NAorCisjZGVmaW5lIEdMT0JBTAorCisjZGVmaW5lIFJJR0hUX1NISUZUKHgsIG4pICgoeCkgPj4gKG4pKQorCit0eXBlZGVmIGludDE2X3QgRENUQkxPQ0tbRENUU0laRTJdOworCisjZGVmaW5lIENPTlNUX0JJVFMgMTMKKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qCisgKiBBIDItRCBJRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBJRENUIG9uIGVhY2ggcm93IGZvbGxvd2VkIGJ5IDEtRCBJRENUCisgKiBvbiBlYWNoIGNvbHVtbi4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlCisgKiBtdWNoIG1vcmUgY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGUgcG9vcCBvbiB0aGlzIHNjYWxpbmcgc3R1ZmYgaXMgYXMgZm9sbG93czoKKyAqCisgKiBFYWNoIDEtRCBJRENUIHN0ZXAgcHJvZHVjZXMgb3V0cHV0cyB3aGljaCBhcmUgYSBmYWN0b3Igb2Ygc3FydChOKQorICogbGFyZ2VyIHRoYW4gdGhlIHRydWUgSURDVCBvdXRwdXRzLiAgVGhlIGZpbmFsIG91dHB1dHMgYXJlIHRoZXJlZm9yZQorICogYSBmYWN0b3Igb2YgTiBsYXJnZXIgdGhhbiBkZXNpcmVkOyBzaW5jZSBOPTggdGhpcyBjYW4gYmUgY3VyZWQgYnkKKyAqIGEgc2ltcGxlIHJpZ2h0IHNoaWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGFsZ29yaXRobS4gIFRoZSBhZHZhbnRhZ2Ugb2YKKyAqIHRoaXMgYXJyYW5nZW1lbnQgaXMgdGhhdCB3ZSBzYXZlIHR3byBtdWx0aXBsaWNhdGlvbnMgcGVyIDEtRCBJRENULAorICogYmVjYXVzZSB0aGUgeTAgYW5kIHk0IGlucHV0cyBuZWVkIG5vdCBiZSBkaXZpZGVkIGJ5IHNxcnQoTikuCisgKgorICogV2UgaGF2ZSB0byBkbyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gb2YgdGhlIGludGVnZXIgaW5wdXRzLCB3aGljaAorICogaXMgbm8gcHJvYmxlbSwgYW5kIG11bHRpcGxpY2F0aW9uIGJ5IGZyYWN0aW9uYWwgY29uc3RhbnRzLCB3aGljaCBpcworICogYSBwcm9ibGVtIHRvIGRvIGluIGludGVnZXIgYXJpdGhtZXRpYy4gIFdlIG11bHRpcGx5IGFsbCB0aGUgY29uc3RhbnRzCisgKiBieSBDT05TVF9TQ0FMRSBhbmQgY29udmVydCB0aGVtIHRvIGludGVnZXIgY29uc3RhbnRzICh0aHVzIHJldGFpbmluZworICogQ09OU1RfQklUUyBiaXRzIG9mIHByZWNpc2lvbiBpbiB0aGUgY29uc3RhbnRzKS4gIEFmdGVyIGRvaW5nIGEKKyAqIG11bHRpcGxpY2F0aW9uIHdlIGhhdmUgdG8gZGl2aWRlIHRoZSBwcm9kdWN0IGJ5IENPTlNUX1NDQUxFLCB3aXRoIHByb3BlcgorICogcm91bmRpbmcsIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3Qgb3V0cHV0LiAgVGhpcyBkaXZpc2lvbiBjYW4gYmUgZG9uZQorICogY2hlYXBseSBhcyBhIHJpZ2h0IHNoaWZ0IG9mIENPTlNUX0JJVFMgYml0cy4gIFdlIHBvc3Rwb25lIHNoaWZ0aW5nCisgKiBhcyBsb25nIGFzIHBvc3NpYmxlIHNvIHRoYXQgcGFydGlhbCBzdW1zIGNhbiBiZSBhZGRlZCB0b2dldGhlciB3aXRoCisgKiBmdWxsIGZyYWN0aW9uYWwgcHJlY2lzaW9uLgorICoKKyAqIFRoZSBvdXRwdXRzIG9mIHRoZSBmaXJzdCBwYXNzIGFyZSBzY2FsZWQgdXAgYnkgUEFTUzFfQklUUyBiaXRzIHNvIHRoYXQKKyAqIHRoZXkgYXJlIHJlcHJlc2VudGVkIHRvIGJldHRlci10aGFuLWludGVncmFsIHByZWNpc2lvbi4gIFRoZXNlIG91dHB1dHMKKyAqIHJlcXVpcmUgQklUU19JTl9KU0FNUExFICsgUEFTUzFfQklUUyArIDMgYml0czsgdGhpcyBmaXRzIGluIGEgMTYtYml0IHdvcmQKKyAqIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcuICAoVG8gc2NhbGUgdXAgMTItYml0IHNhbXBsZSBkYXRhIGZ1cnRoZXIsIGFuCisgKiBpbnRlcm1lZGlhdGUgaW50MzIgYXJyYXkgd291bGQgYmUgbmVlZGVkLikKKyAqCisgKiBUbyBhdm9pZCBvdmVyZmxvdyBvZiB0aGUgMzItYml0IGludGVybWVkaWF0ZSByZXN1bHRzIGluIHBhc3MgMiwgd2UgbXVzdAorICogaGF2ZSBCSVRTX0lOX0pTQU1QTEUgKyBDT05TVF9CSVRTICsgUEFTUzFfQklUUyA8PSAyNi4gIEVycm9yIGFuYWx5c2lzCisgKiBzaG93cyB0aGF0IHRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgYXJlIHRoZSBtb3N0IGVmZmVjdGl2ZS4KKyAqLworCisjaWZkZWYgRUlHSFRfQklUX1NBTVBMRVMKKyNkZWZpbmUgUEFTUzFfQklUUyAgMgorI2Vsc2UKKyNkZWZpbmUgUEFTUzFfQklUUyAgMSAgIC8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCisjZW5kaWYKKworI2RlZmluZSBPTkUgICAgICAgICAoKGludDMyX3QpIDEpCisKKyNkZWZpbmUgQ09OU1RfU0NBTEUgKE9ORSA8PCBDT05TVF9CSVRTKQorCisvKiBDb252ZXJ0IGEgcG9zaXRpdmUgcmVhbCBjb25zdGFudCB0byBhbiBpbnRlZ2VyIHNjYWxlZCBieSBDT05TVF9TQ0FMRS4KKyAqIElNUE9SVEFOVDogaWYgeW91ciBjb21waWxlciBkb2Vzbid0IGRvIHRoaXMgYXJpdGhtZXRpYyBhdCBjb21waWxlIHRpbWUsCisgKiB5b3Ugd2lsbCBwYXkgYSBzaWduaWZpY2FudCBwZW5hbHR5IGluIHJ1biB0aW1lLiAgSW4gdGhhdCBjYXNlLCBmaWd1cmUKKyAqIHRoZSBjb3JyZWN0IGludGVnZXIgY29uc3RhbnQgdmFsdWVzIGFuZCBpbnNlcnQgdGhlbSBieSBoYW5kLgorICovCisKKy8qIEFjdHVhbGx5IEZJWCBpcyBubyBsb25nZXIgdXNlZCwgd2UgcHJlY29tcHV0ZWQgdGhlbSBhbGwgKi8KKyNkZWZpbmUgRklYKHgpICAoKGludDMyX3QpICgoeCkgKiBDT05TVF9TQ0FMRSArIDAuNSkpCisKKy8qIERlc2NhbGUgYW5kIGNvcnJlY3RseSByb3VuZCBhbiBpbnQzMl90IHZhbHVlIHRoYXQncyBzY2FsZWQgYnkgTiBiaXRzLgorICogV2UgYXNzdW1lIFJJR0hUX1NISUZUIHJvdW5kcyB0b3dhcmRzIG1pbnVzIGluZmluaXR5LCBzbyBhZGRpbmcKKyAqIHRoZSBmdWRnZSBmYWN0b3IgaXMgY29ycmVjdCBmb3IgZWl0aGVyIHNpZ24gb2YgWC4KKyAqLworCisjZGVmaW5lIERFU0NBTEUoeCxuKSAgUklHSFRfU0hJRlQoKHgpICsgKE9ORSA8PCAoKG4pLTEpKSwgbikKKworLyogTXVsdGlwbHkgYW4gaW50MzJfdCB2YXJpYWJsZSBieSBhbiBpbnQzMl90IGNvbnN0YW50IHRvIHlpZWxkIGFuIGludDMyX3QgcmVzdWx0LgorICogRm9yIDgtYml0IHNhbXBsZXMgd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZywgYWxsIHRoZSB2YXJpYWJsZQorICogYW5kIGNvbnN0YW50IHZhbHVlcyBpbnZvbHZlZCBhcmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMgd2lkZSwgc28gYQorICogMTZ4MTYtPjMyIGJpdCBtdWx0aXBseSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgZnVsbCAzMngzMiBtdWx0aXBseTsKKyAqIHRoaXMgcHJvdmlkZXMgYSB1c2VmdWwgc3BlZWR1cCBvbiBtYW55IG1hY2hpbmVzLgorICogVGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkgYSAxNngxNi0+MzIgbXVsdGlwbHkgaW4gcG9ydGFibGUgQywgYnV0CisgKiBzb21lIEMgY29tcGlsZXJzIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGlmIHlvdSBwcm92aWRlIHRoZSBjb3JyZWN0CisgKiBjb21iaW5hdGlvbiBvZiBjYXN0cy4KKyAqIE5COiBmb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCisgKi8KKworI2lmZGVmIEVJR0hUX0JJVF9TQU1QTEVTCisjaWZkZWYgU0hPUlR4U0hPUlRfMzIgICAgICAgICAgIC8qIG1heSB3b3JrIGlmICdpbnQnIGlzIDMyIGJpdHMgKi8KKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCgoaW50MTZfdCkgKHZhcikpICogKChpbnQxNl90KSAoY29uc3QpKSkKKyNlbmRpZgorI2lmZGVmIFNIT1JUeExDT05TVF8zMiAgICAgICAgICAvKiBrbm93biB0byB3b3JrIHdpdGggTWljcm9zb2Z0IEMgNi4wICovCisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgoKGludDE2X3QpICh2YXIpKSAqICgoaW50MzJfdCkgKGNvbnN0KSkpCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE1VTFRJUExZICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQorI2VuZGlmCisKKworLyoKKyAgVW5saWtlIG91ciBkZWNvZGVyIHdoZXJlIHdlIGFwcHJveGltYXRlIHRoZSBGSVhlcywgd2UgbmVlZCB0byB1c2UgZXhhY3QKK29uZXMgaGVyZSBvciBzdWNjZXNzaXZlIFAtZnJhbWVzIHdpbGwgZHJpZnQgdG9vIG11Y2ggd2l0aCBSZWZlcmVuY2UgZnJhbWUgY29kaW5nCisqLworI2RlZmluZSBGSVhfMF8yMTExNjQyNDMgMTczMAorI2RlZmluZSBGSVhfMF8yNzU4OTkzODAgMjI2MAorI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgMjQ0NgorI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgMzE5NgorI2RlZmluZSBGSVhfMF81MDk3OTU1NzkgNDE3NgorI2RlZmluZSBGSVhfMF81NDExOTYxMDAgNDQzMworI2RlZmluZSBGSVhfMF82MDEzNDQ4ODcgNDkyNgorI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgNjI3MAorI2RlZmluZSBGSVhfMF83ODU2OTQ5NTggNjQzNgorI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgNzM3MworI2RlZmluZSBGSVhfMV8wNjE1OTQzMzcgODY5NworI2RlZmluZSBGSVhfMV8xMTExNDA0NjYgOTEwMgorI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgOTYzMworI2RlZmluZSBGSVhfMV8zMDY1NjI5NjUgMTA3MDMKKyNkZWZpbmUgRklYXzFfMzg3MDM5ODQ1IDExMzYzCisjZGVmaW5lIEZJWF8xXzQ1MTc3NDk4MSAxMTg5MworI2RlZmluZSBGSVhfMV81MDEzMjExMTAgMTIyOTkKKyNkZWZpbmUgRklYXzFfNjYyOTM5MjI1IDEzNjIzCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAxNTEzNworI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgMTYwNjkKKyNkZWZpbmUgRklYXzJfMDUzMTE5ODY5IDE2ODE5CisjZGVmaW5lIEZJWF8yXzE3MjczNDgwMyAxNzc5OQorI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgMjA5OTUKKyNkZWZpbmUgRklYXzNfMDcyNzExMDI2IDI1MTcyCisKKy8qCisgKiBQZXJmb3JtIHRoZSBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgorICovCisKK3ZvaWQgZmZfal9yZXZfZGN0KERDVEJMT0NLIGRhdGEpCit7CisgIGludDMyX3QgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgaW50MzJfdCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgaW50MzJfdCB6MSwgejIsIHozLCB6NCwgejU7CisgIGludDMyX3QgZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3OworICByZWdpc3RlciBpbnQxNl90ICpkYXRhcHRyOworICBpbnQgcm93Y3RyOworCisgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLworICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBJRENUOyAqLworICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKworICBmb3IgKHJvd2N0ciA9IERDVFNJWkUtMTsgcm93Y3RyID49IDA7IHJvd2N0ci0tKSB7CisgICAgLyogRHVlIHRvIHF1YW50aXphdGlvbiwgd2Ugd2lsbCB1c3VhbGx5IGZpbmQgdGhhdCBtYW55IG9mIHRoZSBpbnB1dAorICAgICAqIGNvZWZmaWNpZW50cyBhcmUgemVybywgZXNwZWNpYWxseSB0aGUgQUMgdGVybXMuICBXZSBjYW4gZXhwbG9pdCB0aGlzCisgICAgICogYnkgc2hvcnQtY2lyY3VpdGluZyB0aGUgSURDVCBjYWxjdWxhdGlvbiBmb3IgYW55IHJvdyBpbiB3aGljaCBhbGwKKyAgICAgKiB0aGUgQUMgdGVybXMgYXJlIHplcm8uICBJbiB0aGF0IGNhc2UgZWFjaCBvdXRwdXQgaXMgZXF1YWwgdG8gdGhlCisgICAgICogREMgY29lZmZpY2llbnQgKHdpdGggc2NhbGUgZmFjdG9yIGFzIG5lZWRlZCkuCisgICAgICogV2l0aCB0eXBpY2FsIGltYWdlcyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcywgaGFsZiBvciBtb3JlIG9mIHRoZQorICAgICAqIHJvdyBEQ1QgY2FsY3VsYXRpb25zIGNhbiBiZSBzaW1wbGlmaWVkIHRoaXMgd2F5LgorICAgICAqLworCisgICAgcmVnaXN0ZXIgaW50ICppZGF0YXB0ciA9IChpbnQqKWRhdGFwdHI7CisKKyAgICAvKiBXQVJOSU5HOiB3ZSBkbyB0aGUgc2FtZSBwZXJtdXRhdGlvbiBhcyBNTVggaWRjdCB0byBzaW1wbGlmeSB0aGUKKyAgICAgICB2aWRlbyBjb3JlICovCisgICAgZDAgPSBkYXRhcHRyWzBdOworICAgIGQyID0gZGF0YXB0clsxXTsKKyAgICBkNCA9IGRhdGFwdHJbMl07CisgICAgZDYgPSBkYXRhcHRyWzNdOworICAgIGQxID0gZGF0YXB0cls0XTsKKyAgICBkMyA9IGRhdGFwdHJbNV07CisgICAgZDUgPSBkYXRhcHRyWzZdOworICAgIGQ3ID0gZGF0YXB0cls3XTsKKworICAgIGlmICgoZDEgfCBkMiB8IGQzIHwgZDQgfCBkNSB8IGQ2IHwgZDcpID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBpZiAoZDApIHsKKyAgICAgICAgICAvKiBDb21wdXRlIGEgMzIgYml0IHZhbHVlIHRvIGFzc2lnbi4gKi8KKyAgICAgICAgICBpbnQxNl90IGRjdmFsID0gKGludDE2X3QpIChkMCAqICgxIDw8IFBBU1MxX0JJVFMpKTsKKyAgICAgICAgICByZWdpc3RlciBpbnQgdiA9IChkY3ZhbCAmIDB4ZmZmZikgfCAoKGRjdmFsICogKDEgPDwgMTYpKSAmIDB4ZmZmZjAwMDApOworCisgICAgICAgICAgaWRhdGFwdHJbMF0gPSB2OworICAgICAgICAgIGlkYXRhcHRyWzFdID0gdjsKKyAgICAgICAgICBpZGF0YXB0clsyXSA9IHY7CisgICAgICAgICAgaWRhdGFwdHJbM10gPSB2OworICAgICAgfQorCisgICAgICBkYXRhcHRyICs9IERDVFNJWkU7ICAgICAgIC8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogRXZlbiBwYXJ0OiByZXZlcnNlIHRoZSBldmVuIHBhcnQgb2YgdGhlIGZvcndhcmQgRENULiAqLworICAgIC8qIFRoZSByb3RhdG9yIGlzIHNxcnQoMikqYygtNikuICovCit7CisgICAgaWYgKGQ2KSB7CisgICAgICAgICAgICBpZiAoZDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZDAgIT0gMCwgZDIgIT0gMCwgZDQgIT0gMCwgZDYgIT0gMCAqLworICAgICAgICAgICAgICAgICAgICB6MSA9IE1VTFRJUExZKGQyICsgZDYsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKC1kNiwgRklYXzFfODQ3NzU5MDY1KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IHoxICsgTVVMVElQTFkoZDIsIEZJWF8wXzc2NTM2Njg2NSk7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9IChkMCArIGQ0KSAqIENPTlNUX1NDQUxFOworICAgICAgICAgICAgICAgICAgICB0bXAxID0gKGQwIC0gZDQpICogQ09OU1RfU0NBTEU7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQwICE9IDAsIGQyID09IDAsIGQ0ICE9IDAsIGQ2ICE9IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTFRJUExZKC1kNiwgRklYXzFfMzA2NTYyOTY1KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQ2LCBGSVhfMF81NDExOTYxMDApOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSAoZDAgKyBkNCkgKiBDT05TVF9TQ0FMRTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IChkMCAtIGQ0KSAqIENPTlNUX1NDQUxFOworCisgICAgICAgICAgICAgICAgICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgICAgICAgICAgICAgICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICAgICAgICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkMikgeworICAgICAgICAgICAgICAgICAgICAvKiBkMCAhPSAwLCBkMiAhPSAwLCBkNCAhPSAwLCBkNiA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWShkMiwgRklYXzBfNTQxMTk2MTAwKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQyLCBGSVhfMV8zMDY1NjI5NjUpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSAoZDAgKyBkNCkgKiBDT05TVF9TQ0FMRTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IChkMCAtIGQ0KSAqIENPTlNUX1NDQUxFOworCisgICAgICAgICAgICAgICAgICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgICAgICAgICAgICAgICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICAgICAgICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMCAhPSAwLCBkMiA9PSAwLCBkNCAhPSAwLCBkNiA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDEwID0gdG1wMTMgPSAoZDAgKyBkNCkgKiBDT05TVF9TQ0FMRTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTEgPSB0bXAxMiA9IChkMCAtIGQ0KSAqIENPTlNUX1NDQUxFOworICAgICAgICAgICAgfQorICAgICAgfQorCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4OyB0aGUgbWF0cml4IGlzIHVuaXRhcnkgYW5kIGhlbmNlIGl0cworICAgICAqIHRyYW5zcG9zZSBpcyBpdHMgaW52ZXJzZS4gIGkwLi5pMyBhcmUgeTcseTUseTMseTEgcmVzcGVjdGl2ZWx5LgorICAgICAqLworCisgICAgaWYgKGQ3KSB7CisgICAgICAgIGlmIChkNSkgeworICAgICAgICAgICAgaWYgKGQzKSB7CisgICAgICAgICAgICAgICAgaWYgKGQxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxICE9IDAsIGQzICE9IDAsIGQ1ICE9IDAsIGQ3ICE9IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejEgPSBkNyArIGQxOworICAgICAgICAgICAgICAgICAgICB6MiA9IGQ1ICsgZDM7CisgICAgICAgICAgICAgICAgICAgIHozID0gZDcgKyBkMzsKKyAgICAgICAgICAgICAgICAgICAgejQgPSBkNSArIGQxOworICAgICAgICAgICAgICAgICAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9IE1VTFRJUExZKGQ3LCBGSVhfMF8yOTg2MzEzMzYpOworICAgICAgICAgICAgICAgICAgICB0bXAxID0gTVVMVElQTFkoZDUsIEZJWF8yXzA1MzExOTg2OSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWShkMywgRklYXzNfMDcyNzExMDI2KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQxLCBGSVhfMV81MDEzMjExMTApOworICAgICAgICAgICAgICAgICAgICB6MSA9IE1VTFRJUExZKC16MSwgRklYXzBfODk5OTc2MjIzKTsKKyAgICAgICAgICAgICAgICAgICAgejIgPSBNVUxUSVBMWSgtejIsIEZJWF8yXzU2MjkxNTQ0Nyk7CisgICAgICAgICAgICAgICAgICAgIHozID0gTVVMVElQTFkoLXozLCBGSVhfMV85NjE1NzA1NjApOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKC16NCwgRklYXzBfMzkwMTgwNjQ0KTsKKworICAgICAgICAgICAgICAgICAgICB6MyArPSB6NTsKKyAgICAgICAgICAgICAgICAgICAgejQgKz0gejU7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCArPSB6MSArIHozOworICAgICAgICAgICAgICAgICAgICB0bXAxICs9IHoyICsgejQ7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgKz0gejIgKyB6MzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyArPSB6MSArIHo0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxID09IDAsIGQzICE9IDAsIGQ1ICE9IDAsIGQ3ICE9IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejIgPSBkNSArIGQzOworICAgICAgICAgICAgICAgICAgICB6MyA9IGQ3ICsgZDM7CisgICAgICAgICAgICAgICAgICAgIHo1ID0gTVVMVElQTFkoejMgKyBkNSwgRklYXzFfMTc1ODc1NjAyKTsKKworICAgICAgICAgICAgICAgICAgICB0bXAwID0gTVVMVElQTFkoZDcsIEZJWF8wXzI5ODYzMTMzNik7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSBNVUxUSVBMWShkNSwgRklYXzJfMDUzMTE5ODY5KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTFRJUExZKGQzLCBGSVhfM18wNzI3MTEwMjYpOworICAgICAgICAgICAgICAgICAgICB6MSA9IE1VTFRJUExZKC1kNywgRklYXzBfODk5OTc2MjIzKTsKKyAgICAgICAgICAgICAgICAgICAgejIgPSBNVUxUSVBMWSgtejIsIEZJWF8yXzU2MjkxNTQ0Nyk7CisgICAgICAgICAgICAgICAgICAgIHozID0gTVVMVElQTFkoLXozLCBGSVhfMV85NjE1NzA1NjApOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKC1kNSwgRklYXzBfMzkwMTgwNjQ0KTsKKworICAgICAgICAgICAgICAgICAgICB6MyArPSB6NTsKKyAgICAgICAgICAgICAgICAgICAgejQgKz0gejU7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCArPSB6MSArIHozOworICAgICAgICAgICAgICAgICAgICB0bXAxICs9IHoyICsgejQ7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgKz0gejIgKyB6MzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IHoxICsgejQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZDEgIT0gMCwgZDMgPT0gMCwgZDUgIT0gMCwgZDcgIT0gMCAqLworICAgICAgICAgICAgICAgICAgICB6MSA9IGQ3ICsgZDE7CisgICAgICAgICAgICAgICAgICAgIHo0ID0gZDUgKyBkMTsKKyAgICAgICAgICAgICAgICAgICAgejUgPSBNVUxUSVBMWShkNyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWShkNywgRklYXzBfMjk4NjMxMzM2KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IE1VTFRJUExZKGQ1LCBGSVhfMl8wNTMxMTk4NjkpOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDEsIEZJWF8xXzUwMTMyMTExMCk7CisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoLXoxLCBGSVhfMF84OTk5NzYyMjMpOworICAgICAgICAgICAgICAgICAgICB6MiA9IE1VTFRJUExZKC1kNSwgRklYXzJfNTYyOTE1NDQ3KTsKKyAgICAgICAgICAgICAgICAgICAgejMgPSBNVUxUSVBMWSgtZDcsIEZJWF8xXzk2MTU3MDU2MCk7CisgICAgICAgICAgICAgICAgICAgIHo0ID0gTVVMVElQTFkoLXo0LCBGSVhfMF8zOTAxODA2NDQpOworCisgICAgICAgICAgICAgICAgICAgIHozICs9IHo1OworICAgICAgICAgICAgICAgICAgICB6NCArPSB6NTsKKworICAgICAgICAgICAgICAgICAgICB0bXAwICs9IHoxICsgejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgKz0gejIgKyB6NDsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHoyICsgejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgKz0gejEgKyB6NDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyA9PSAwLCBkNSAhPSAwLCBkNyAhPSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWSgtZDcsIEZJWF8wXzYwMTM0NDg4Nyk7CisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoLWQ3LCBGSVhfMF84OTk5NzYyMjMpOworICAgICAgICAgICAgICAgICAgICB6MyA9IE1VTFRJUExZKC1kNywgRklYXzFfOTYxNTcwNTYwKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IE1VTFRJUExZKC1kNSwgRklYXzBfNTA5Nzk1NTc5KTsKKyAgICAgICAgICAgICAgICAgICAgejIgPSBNVUxUSVBMWSgtZDUsIEZJWF8yXzU2MjkxNTQ0Nyk7CisgICAgICAgICAgICAgICAgICAgIHo0ID0gTVVMVElQTFkoLWQ1LCBGSVhfMF8zOTAxODA2NDQpOworICAgICAgICAgICAgICAgICAgICB6NSA9IE1VTFRJUExZKGQ1ICsgZDcsIEZJWF8xXzE3NTg3NTYwMik7CisKKyAgICAgICAgICAgICAgICAgICAgejMgKz0gejU7CisgICAgICAgICAgICAgICAgICAgIHo0ICs9IHo1OworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgKz0gejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgKz0gejQ7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB6MiArIHozOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gejEgKyB6NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZDMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZDEgIT0gMCwgZDMgIT0gMCwgZDUgPT0gMCwgZDcgIT0gMCAqLworICAgICAgICAgICAgICAgICAgICB6MSA9IGQ3ICsgZDE7CisgICAgICAgICAgICAgICAgICAgIHozID0gZDcgKyBkMzsKKyAgICAgICAgICAgICAgICAgICAgejUgPSBNVUxUSVBMWSh6MyArIGQxLCBGSVhfMV8xNzU4NzU2MDIpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWShkNywgRklYXzBfMjk4NjMxMzM2KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTFRJUExZKGQzLCBGSVhfM18wNzI3MTEwMjYpOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDEsIEZJWF8xXzUwMTMyMTExMCk7CisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoLXoxLCBGSVhfMF84OTk5NzYyMjMpOworICAgICAgICAgICAgICAgICAgICB6MiA9IE1VTFRJUExZKC1kMywgRklYXzJfNTYyOTE1NDQ3KTsKKyAgICAgICAgICAgICAgICAgICAgejMgPSBNVUxUSVBMWSgtejMsIEZJWF8xXzk2MTU3MDU2MCk7CisgICAgICAgICAgICAgICAgICAgIHo0ID0gTVVMVElQTFkoLWQxLCBGSVhfMF8zOTAxODA2NDQpOworCisgICAgICAgICAgICAgICAgICAgIHozICs9IHo1OworICAgICAgICAgICAgICAgICAgICB6NCArPSB6NTsKKworICAgICAgICAgICAgICAgICAgICB0bXAwICs9IHoxICsgejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSB6MiArIHo0OworICAgICAgICAgICAgICAgICAgICB0bXAyICs9IHoyICsgejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgKz0gejEgKyB6NDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyAhPSAwLCBkNSA9PSAwLCBkNyAhPSAwICovCisgICAgICAgICAgICAgICAgICAgIHozID0gZDcgKyBkMzsKKworICAgICAgICAgICAgICAgICAgICB0bXAwID0gTVVMVElQTFkoLWQ3LCBGSVhfMF82MDEzNDQ4ODcpOworICAgICAgICAgICAgICAgICAgICB6MSA9IE1VTFRJUExZKC1kNywgRklYXzBfODk5OTc2MjIzKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTFRJUExZKGQzLCBGSVhfMF81MDk3OTU1NzkpOworICAgICAgICAgICAgICAgICAgICB6MiA9IE1VTFRJUExZKC1kMywgRklYXzJfNTYyOTE1NDQ3KTsKKyAgICAgICAgICAgICAgICAgICAgejUgPSBNVUxUSVBMWSh6MywgRklYXzFfMTc1ODc1NjAyKTsKKyAgICAgICAgICAgICAgICAgICAgejMgPSBNVUxUSVBMWSgtejMsIEZJWF8wXzc4NTY5NDk1OCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCArPSB6MzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IHoyICsgejU7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgKz0gejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgPSB6MSArIHo1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGQxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxICE9IDAsIGQzID09IDAsIGQ1ID09IDAsIGQ3ICE9IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejEgPSBkNyArIGQxOworICAgICAgICAgICAgICAgICAgICB6NSA9IE1VTFRJUExZKHoxLCBGSVhfMV8xNzU4NzU2MDIpOworCisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoejEsIEZJWF8wXzI3NTg5OTM4MCk7CisgICAgICAgICAgICAgICAgICAgIHozID0gTVVMVElQTFkoLWQ3LCBGSVhfMV85NjE1NzA1NjApOworICAgICAgICAgICAgICAgICAgICB0bXAwID0gTVVMVElQTFkoLWQ3LCBGSVhfMV82NjI5MzkyMjUpOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKC1kMSwgRklYXzBfMzkwMTgwNjQ0KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQxLCBGSVhfMV8xMTExNDA0NjYpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgKz0gejE7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSB6NCArIHo1OworICAgICAgICAgICAgICAgICAgICB0bXAyID0gejMgKyB6NTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyArPSB6MTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyA9PSAwLCBkNSA9PSAwLCBkNyAhPSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWSgtZDcsIEZJWF8xXzM4NzAzOTg0NSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSBNVUxUSVBMWShkNywgRklYXzFfMTc1ODc1NjAyKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTFRJUExZKC1kNywgRklYXzBfNzg1Njk0OTU4KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQ3LCBGSVhfMF8yNzU4OTkzODApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkNSkgeworICAgICAgICAgICAgaWYgKGQzKSB7CisgICAgICAgICAgICAgICAgaWYgKGQxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxICE9IDAsIGQzICE9IDAsIGQ1ICE9IDAsIGQ3ID09IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejIgPSBkNSArIGQzOworICAgICAgICAgICAgICAgICAgICB6NCA9IGQ1ICsgZDE7CisgICAgICAgICAgICAgICAgICAgIHo1ID0gTVVMVElQTFkoZDMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsKKworICAgICAgICAgICAgICAgICAgICB0bXAxID0gTVVMVElQTFkoZDUsIEZJWF8yXzA1MzExOTg2OSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWShkMywgRklYXzNfMDcyNzExMDI2KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQxLCBGSVhfMV81MDEzMjExMTApOworICAgICAgICAgICAgICAgICAgICB6MSA9IE1VTFRJUExZKC1kMSwgRklYXzBfODk5OTc2MjIzKTsKKyAgICAgICAgICAgICAgICAgICAgejIgPSBNVUxUSVBMWSgtejIsIEZJWF8yXzU2MjkxNTQ0Nyk7CisgICAgICAgICAgICAgICAgICAgIHozID0gTVVMVElQTFkoLWQzLCBGSVhfMV85NjE1NzA1NjApOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKC16NCwgRklYXzBfMzkwMTgwNjQ0KTsKKworICAgICAgICAgICAgICAgICAgICB6MyArPSB6NTsKKyAgICAgICAgICAgICAgICAgICAgejQgKz0gejU7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9IHoxICsgejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgKz0gejIgKyB6NDsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiArPSB6MiArIHozOworICAgICAgICAgICAgICAgICAgICB0bXAzICs9IHoxICsgejQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZDEgPT0gMCwgZDMgIT0gMCwgZDUgIT0gMCwgZDcgPT0gMCAqLworICAgICAgICAgICAgICAgICAgICB6MiA9IGQ1ICsgZDM7CisKKyAgICAgICAgICAgICAgICAgICAgejUgPSBNVUxUSVBMWSh6MiwgRklYXzFfMTc1ODc1NjAyKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IE1VTFRJUExZKGQ1LCBGSVhfMV82NjI5MzkyMjUpOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKC1kNSwgRklYXzBfMzkwMTgwNjQ0KTsKKyAgICAgICAgICAgICAgICAgICAgejIgPSBNVUxUSVBMWSgtejIsIEZJWF8xXzM4NzAzOTg0NSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWShkMywgRklYXzFfMTExMTQwNDY2KTsKKyAgICAgICAgICAgICAgICAgICAgejMgPSBNVUxUSVBMWSgtZDMsIEZJWF8xXzk2MTU3MDU2MCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9IHozICsgejU7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgKz0gejI7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgKz0gejI7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgPSB6NCArIHo1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGQxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxICE9IDAsIGQzID09IDAsIGQ1ICE9IDAsIGQ3ID09IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejQgPSBkNSArIGQxOworCisgICAgICAgICAgICAgICAgICAgIHo1ID0gTVVMVElQTFkoejQsIEZJWF8xXzE3NTg3NTYwMik7CisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoLWQxLCBGSVhfMF84OTk5NzYyMjMpOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDEsIEZJWF8wXzYwMTM0NDg4Nyk7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSBNVUxUSVBMWSgtZDUsIEZJWF8wXzUwOTc5NTU3OSk7CisgICAgICAgICAgICAgICAgICAgIHoyID0gTVVMVElQTFkoLWQ1LCBGSVhfMl81NjI5MTU0NDcpOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKHo0LCBGSVhfMF83ODU2OTQ5NTgpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSB6MSArIHo1OworICAgICAgICAgICAgICAgICAgICB0bXAxICs9IHo0OworICAgICAgICAgICAgICAgICAgICB0bXAyID0gejIgKyB6NTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyArPSB6NDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyA9PSAwLCBkNSAhPSAwLCBkNyA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWShkNSwgRklYXzFfMTc1ODc1NjAyKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IE1VTFRJUExZKGQ1LCBGSVhfMF8yNzU4OTkzODApOworICAgICAgICAgICAgICAgICAgICB0bXAyID0gTVVMVElQTFkoLWQ1LCBGSVhfMV8zODcwMzk4NDUpOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDUsIEZJWF8wXzc4NTY5NDk1OCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGQzKSB7CisgICAgICAgICAgICAgICAgaWYgKGQxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxICE9IDAsIGQzICE9IDAsIGQ1ID09IDAsIGQ3ID09IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejUgPSBkMSArIGQzOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDEsIEZJWF8wXzIxMTE2NDI0Myk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWSgtZDMsIEZJWF8xXzQ1MTc3NDk4MSk7CisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoZDEsIEZJWF8xXzA2MTU5NDMzNyk7CisgICAgICAgICAgICAgICAgICAgIHoyID0gTVVMVElQTFkoLWQzLCBGSVhfMl8xNzI3MzQ4MDMpOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKHo1LCBGSVhfMF83ODU2OTQ5NTgpOworICAgICAgICAgICAgICAgICAgICB6NSA9IE1VTFRJUExZKHo1LCBGSVhfMV8xNzU4NzU2MDIpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSB6MSAtIHo0OworICAgICAgICAgICAgICAgICAgICB0bXAxID0gejIgKyB6NDsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiArPSB6NTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyArPSB6NTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyAhPSAwLCBkNSA9PSAwLCBkNyA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWSgtZDMsIEZJWF8wXzc4NTY5NDk1OCk7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSBNVUxUSVBMWSgtZDMsIEZJWF8xXzM4NzAzOTg0NSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWSgtZDMsIEZJWF8wXzI3NTg5OTM4MCk7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgPSBNVUxUSVBMWShkMywgRklYXzFfMTc1ODc1NjAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChkMSkgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSAhPSAwLCBkMyA9PSAwLCBkNSA9PSAwLCBkNyA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWShkMSwgRklYXzBfMjc1ODk5MzgwKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IE1VTFRJUExZKGQxLCBGSVhfMF83ODU2OTQ5NTgpOworICAgICAgICAgICAgICAgICAgICB0bXAyID0gTVVMVElQTFkoZDEsIEZJWF8xXzE3NTg3NTYwMik7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgPSBNVUxUSVBMWShkMSwgRklYXzFfMzg3MDM5ODQ1KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyA9PSAwLCBkNSA9PSAwLCBkNyA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSB0bXAxID0gdG1wMiA9IHRtcDMgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IGlucHV0cyBhcmUgdG1wMTAuLnRtcDEzLCB0bXAwLi50bXAzICovCisKKyAgICBkYXRhcHRyWzBdID0gKGludDE2X3QpIERFU0NBTEUodG1wMTAgKyB0bXAzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbN10gPSAoaW50MTZfdCkgREVTQ0FMRSh0bXAxMCAtIHRtcDMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0clsxXSA9IChpbnQxNl90KSBERVNDQUxFKHRtcDExICsgdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzZdID0gKGludDE2X3QpIERFU0NBTEUodG1wMTEgLSB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbMl0gPSAoaW50MTZfdCkgREVTQ0FMRSh0bXAxMiArIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls1XSA9IChpbnQxNl90KSBERVNDQUxFKHRtcDEyIC0gdG1wMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzNdID0gKGludDE2X3QpIERFU0NBTEUodG1wMTMgKyB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNF0gPSAoaW50MTZfdCkgREVTQ0FMRSh0bXAxMyAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7ICAgICAgICAgLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4gKi8KKyAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMsICovCisgIC8qIGFuZCBhbHNvIHVuZG8gdGhlIFBBU1MxX0JJVFMgc2NhbGluZy4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChyb3djdHIgPSBEQ1RTSVpFLTE7IHJvd2N0ciA+PSAwOyByb3djdHItLSkgeworICAgIC8qIENvbHVtbnMgb2YgemVyb2VzIGNhbiBiZSBleHBsb2l0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdlIGRpZCB3aXRoIHJvd3MuCisgICAgICogSG93ZXZlciwgdGhlIHJvdyBjYWxjdWxhdGlvbiBoYXMgY3JlYXRlZCBtYW55IG5vbnplcm8gQUMgdGVybXMsIHNvIHRoZQorICAgICAqIHNpbXBsaWZpY2F0aW9uIGFwcGxpZXMgbGVzcyBvZnRlbiAodHlwaWNhbGx5IDUlIHRvIDEwJSBvZiB0aGUgdGltZSkuCisgICAgICogT24gbWFjaGluZXMgd2l0aCB2ZXJ5IGZhc3QgbXVsdGlwbGljYXRpb24sIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKKyAgICAgKiB0ZXN0IHRha2VzIG1vcmUgdGltZSB0aGFuIGl0J3Mgd29ydGguICBJbiB0aGF0IGNhc2UgdGhpcyBzZWN0aW9uCisgICAgICogbWF5IGJlIGNvbW1lbnRlZCBvdXQuCisgICAgICovCisKKyAgICBkMCA9IGRhdGFwdHJbRENUU0laRSowXTsKKyAgICBkMSA9IGRhdGFwdHJbRENUU0laRSoxXTsKKyAgICBkMiA9IGRhdGFwdHJbRENUU0laRSoyXTsKKyAgICBkMyA9IGRhdGFwdHJbRENUU0laRSozXTsKKyAgICBkNCA9IGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICBkNSA9IGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICBkNiA9IGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICBkNyA9IGRhdGFwdHJbRENUU0laRSo3XTsKKworICAgIC8qIEV2ZW4gcGFydDogcmV2ZXJzZSB0aGUgZXZlbiBwYXJ0IG9mIHRoZSBmb3J3YXJkIERDVC4gKi8KKyAgICAvKiBUaGUgcm90YXRvciBpcyBzcXJ0KDIpKmMoLTYpLiAqLworICAgIGlmIChkNikgeworICAgICAgICAgICAgaWYgKGQyKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQwICE9IDAsIGQyICE9IDAsIGQ0ICE9IDAsIGQ2ICE9IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejEgPSBNVUxUSVBMWShkMiArIGQ2LCBGSVhfMF81NDExOTYxMDApOworICAgICAgICAgICAgICAgICAgICB0bXAyID0gejEgKyBNVUxUSVBMWSgtZDYsIEZJWF8xXzg0Nzc1OTA2NSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgPSB6MSArIE1VTFRJUExZKGQyLCBGSVhfMF83NjUzNjY4NjUpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSAoZDAgKyBkNCkgKiBDT05TVF9TQ0FMRTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IChkMCAtIGQ0KSAqIENPTlNUX1NDQUxFOworCisgICAgICAgICAgICAgICAgICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgICAgICAgICAgICAgICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICAgICAgICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMCAhPSAwLCBkMiA9PSAwLCBkNCAhPSAwLCBkNiAhPSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWSgtZDYsIEZJWF8xXzMwNjU2Mjk2NSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgPSBNVUxUSVBMWShkNiwgRklYXzBfNTQxMTk2MTAwKTsKKworICAgICAgICAgICAgICAgICAgICB0bXAwID0gKGQwICsgZDQpICogQ09OU1RfU0NBTEU7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoZDAgLSBkNCkgKiBDT05TVF9TQ0FMRTsKKworICAgICAgICAgICAgICAgICAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgICAgICAgICAgICAgICAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgICAgICAgICAgICAgICAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgICAgICAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZDAgIT0gMCwgZDIgIT0gMCwgZDQgIT0gMCwgZDYgPT0gMCAqLworICAgICAgICAgICAgICAgICAgICB0bXAyID0gTVVMVElQTFkoZDIsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgPSBNVUxUSVBMWShkMiwgRklYXzFfMzA2NTYyOTY1KTsKKworICAgICAgICAgICAgICAgICAgICB0bXAwID0gKGQwICsgZDQpICogQ09OU1RfU0NBTEU7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoZDAgLSBkNCkgKiBDT05TVF9TQ0FMRTsKKworICAgICAgICAgICAgICAgICAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgICAgICAgICAgICAgICAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgICAgICAgICAgICAgICAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgICAgICAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZDAgIT0gMCwgZDIgPT0gMCwgZDQgIT0gMCwgZDYgPT0gMCAqLworICAgICAgICAgICAgICAgICAgICB0bXAxMCA9IHRtcDEzID0gKGQwICsgZDQpICogQ09OU1RfU0NBTEU7CisgICAgICAgICAgICAgICAgICAgIHRtcDExID0gdG1wMTIgPSAoZDAgLSBkNCkgKiBDT05TVF9TQ0FMRTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDg7IHRoZSBtYXRyaXggaXMgdW5pdGFyeSBhbmQgaGVuY2UgaXRzCisgICAgICogdHJhbnNwb3NlIGlzIGl0cyBpbnZlcnNlLiAgaTAuLmkzIGFyZSB5Nyx5NSx5Myx5MSByZXNwZWN0aXZlbHkuCisgICAgICovCisgICAgaWYgKGQ3KSB7CisgICAgICAgIGlmIChkNSkgeworICAgICAgICAgICAgaWYgKGQzKSB7CisgICAgICAgICAgICAgICAgaWYgKGQxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxICE9IDAsIGQzICE9IDAsIGQ1ICE9IDAsIGQ3ICE9IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejEgPSBkNyArIGQxOworICAgICAgICAgICAgICAgICAgICB6MiA9IGQ1ICsgZDM7CisgICAgICAgICAgICAgICAgICAgIHozID0gZDcgKyBkMzsKKyAgICAgICAgICAgICAgICAgICAgejQgPSBkNSArIGQxOworICAgICAgICAgICAgICAgICAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9IE1VTFRJUExZKGQ3LCBGSVhfMF8yOTg2MzEzMzYpOworICAgICAgICAgICAgICAgICAgICB0bXAxID0gTVVMVElQTFkoZDUsIEZJWF8yXzA1MzExOTg2OSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWShkMywgRklYXzNfMDcyNzExMDI2KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQxLCBGSVhfMV81MDEzMjExMTApOworICAgICAgICAgICAgICAgICAgICB6MSA9IE1VTFRJUExZKC16MSwgRklYXzBfODk5OTc2MjIzKTsKKyAgICAgICAgICAgICAgICAgICAgejIgPSBNVUxUSVBMWSgtejIsIEZJWF8yXzU2MjkxNTQ0Nyk7CisgICAgICAgICAgICAgICAgICAgIHozID0gTVVMVElQTFkoLXozLCBGSVhfMV85NjE1NzA1NjApOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKC16NCwgRklYXzBfMzkwMTgwNjQ0KTsKKworICAgICAgICAgICAgICAgICAgICB6MyArPSB6NTsKKyAgICAgICAgICAgICAgICAgICAgejQgKz0gejU7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCArPSB6MSArIHozOworICAgICAgICAgICAgICAgICAgICB0bXAxICs9IHoyICsgejQ7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgKz0gejIgKyB6MzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyArPSB6MSArIHo0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxID09IDAsIGQzICE9IDAsIGQ1ICE9IDAsIGQ3ICE9IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejIgPSBkNSArIGQzOworICAgICAgICAgICAgICAgICAgICB6MyA9IGQ3ICsgZDM7CisgICAgICAgICAgICAgICAgICAgIHo1ID0gTVVMVElQTFkoejMgKyBkNSwgRklYXzFfMTc1ODc1NjAyKTsKKworICAgICAgICAgICAgICAgICAgICB0bXAwID0gTVVMVElQTFkoZDcsIEZJWF8wXzI5ODYzMTMzNik7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSBNVUxUSVBMWShkNSwgRklYXzJfMDUzMTE5ODY5KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTFRJUExZKGQzLCBGSVhfM18wNzI3MTEwMjYpOworICAgICAgICAgICAgICAgICAgICB6MSA9IE1VTFRJUExZKC1kNywgRklYXzBfODk5OTc2MjIzKTsKKyAgICAgICAgICAgICAgICAgICAgejIgPSBNVUxUSVBMWSgtejIsIEZJWF8yXzU2MjkxNTQ0Nyk7CisgICAgICAgICAgICAgICAgICAgIHozID0gTVVMVElQTFkoLXozLCBGSVhfMV85NjE1NzA1NjApOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKC1kNSwgRklYXzBfMzkwMTgwNjQ0KTsKKworICAgICAgICAgICAgICAgICAgICB6MyArPSB6NTsKKyAgICAgICAgICAgICAgICAgICAgejQgKz0gejU7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCArPSB6MSArIHozOworICAgICAgICAgICAgICAgICAgICB0bXAxICs9IHoyICsgejQ7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgKz0gejIgKyB6MzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IHoxICsgejQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZDEgIT0gMCwgZDMgPT0gMCwgZDUgIT0gMCwgZDcgIT0gMCAqLworICAgICAgICAgICAgICAgICAgICB6MSA9IGQ3ICsgZDE7CisgICAgICAgICAgICAgICAgICAgIHozID0gZDc7CisgICAgICAgICAgICAgICAgICAgIHo0ID0gZDUgKyBkMTsKKyAgICAgICAgICAgICAgICAgICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWShkNywgRklYXzBfMjk4NjMxMzM2KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IE1VTFRJUExZKGQ1LCBGSVhfMl8wNTMxMTk4NjkpOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDEsIEZJWF8xXzUwMTMyMTExMCk7CisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoLXoxLCBGSVhfMF84OTk5NzYyMjMpOworICAgICAgICAgICAgICAgICAgICB6MiA9IE1VTFRJUExZKC1kNSwgRklYXzJfNTYyOTE1NDQ3KTsKKyAgICAgICAgICAgICAgICAgICAgejMgPSBNVUxUSVBMWSgtZDcsIEZJWF8xXzk2MTU3MDU2MCk7CisgICAgICAgICAgICAgICAgICAgIHo0ID0gTVVMVElQTFkoLXo0LCBGSVhfMF8zOTAxODA2NDQpOworCisgICAgICAgICAgICAgICAgICAgIHozICs9IHo1OworICAgICAgICAgICAgICAgICAgICB6NCArPSB6NTsKKworICAgICAgICAgICAgICAgICAgICB0bXAwICs9IHoxICsgejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgKz0gejIgKyB6NDsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHoyICsgejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgKz0gejEgKyB6NDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyA9PSAwLCBkNSAhPSAwLCBkNyAhPSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWSgtZDcsIEZJWF8wXzYwMTM0NDg4Nyk7CisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoLWQ3LCBGSVhfMF84OTk5NzYyMjMpOworICAgICAgICAgICAgICAgICAgICB6MyA9IE1VTFRJUExZKC1kNywgRklYXzFfOTYxNTcwNTYwKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IE1VTFRJUExZKC1kNSwgRklYXzBfNTA5Nzk1NTc5KTsKKyAgICAgICAgICAgICAgICAgICAgejIgPSBNVUxUSVBMWSgtZDUsIEZJWF8yXzU2MjkxNTQ0Nyk7CisgICAgICAgICAgICAgICAgICAgIHo0ID0gTVVMVElQTFkoLWQ1LCBGSVhfMF8zOTAxODA2NDQpOworICAgICAgICAgICAgICAgICAgICB6NSA9IE1VTFRJUExZKGQ1ICsgZDcsIEZJWF8xXzE3NTg3NTYwMik7CisKKyAgICAgICAgICAgICAgICAgICAgejMgKz0gejU7CisgICAgICAgICAgICAgICAgICAgIHo0ICs9IHo1OworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgKz0gejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgKz0gejQ7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB6MiArIHozOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gejEgKyB6NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZDMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZDEgIT0gMCwgZDMgIT0gMCwgZDUgPT0gMCwgZDcgIT0gMCAqLworICAgICAgICAgICAgICAgICAgICB6MSA9IGQ3ICsgZDE7CisgICAgICAgICAgICAgICAgICAgIHozID0gZDcgKyBkMzsKKyAgICAgICAgICAgICAgICAgICAgejUgPSBNVUxUSVBMWSh6MyArIGQxLCBGSVhfMV8xNzU4NzU2MDIpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWShkNywgRklYXzBfMjk4NjMxMzM2KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTFRJUExZKGQzLCBGSVhfM18wNzI3MTEwMjYpOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDEsIEZJWF8xXzUwMTMyMTExMCk7CisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoLXoxLCBGSVhfMF84OTk5NzYyMjMpOworICAgICAgICAgICAgICAgICAgICB6MiA9IE1VTFRJUExZKC1kMywgRklYXzJfNTYyOTE1NDQ3KTsKKyAgICAgICAgICAgICAgICAgICAgejMgPSBNVUxUSVBMWSgtejMsIEZJWF8xXzk2MTU3MDU2MCk7CisgICAgICAgICAgICAgICAgICAgIHo0ID0gTVVMVElQTFkoLWQxLCBGSVhfMF8zOTAxODA2NDQpOworCisgICAgICAgICAgICAgICAgICAgIHozICs9IHo1OworICAgICAgICAgICAgICAgICAgICB6NCArPSB6NTsKKworICAgICAgICAgICAgICAgICAgICB0bXAwICs9IHoxICsgejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSB6MiArIHo0OworICAgICAgICAgICAgICAgICAgICB0bXAyICs9IHoyICsgejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgKz0gejEgKyB6NDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyAhPSAwLCBkNSA9PSAwLCBkNyAhPSAwICovCisgICAgICAgICAgICAgICAgICAgIHozID0gZDcgKyBkMzsKKworICAgICAgICAgICAgICAgICAgICB0bXAwID0gTVVMVElQTFkoLWQ3LCBGSVhfMF82MDEzNDQ4ODcpOworICAgICAgICAgICAgICAgICAgICB6MSA9IE1VTFRJUExZKC1kNywgRklYXzBfODk5OTc2MjIzKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTFRJUExZKGQzLCBGSVhfMF81MDk3OTU1NzkpOworICAgICAgICAgICAgICAgICAgICB6MiA9IE1VTFRJUExZKC1kMywgRklYXzJfNTYyOTE1NDQ3KTsKKyAgICAgICAgICAgICAgICAgICAgejUgPSBNVUxUSVBMWSh6MywgRklYXzFfMTc1ODc1NjAyKTsKKyAgICAgICAgICAgICAgICAgICAgejMgPSBNVUxUSVBMWSgtejMsIEZJWF8wXzc4NTY5NDk1OCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCArPSB6MzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IHoyICsgejU7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgKz0gejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgPSB6MSArIHo1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGQxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxICE9IDAsIGQzID09IDAsIGQ1ID09IDAsIGQ3ICE9IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejEgPSBkNyArIGQxOworICAgICAgICAgICAgICAgICAgICB6NSA9IE1VTFRJUExZKHoxLCBGSVhfMV8xNzU4NzU2MDIpOworCisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoejEsIEZJWF8wXzI3NTg5OTM4MCk7CisgICAgICAgICAgICAgICAgICAgIHozID0gTVVMVElQTFkoLWQ3LCBGSVhfMV85NjE1NzA1NjApOworICAgICAgICAgICAgICAgICAgICB0bXAwID0gTVVMVElQTFkoLWQ3LCBGSVhfMV82NjI5MzkyMjUpOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKC1kMSwgRklYXzBfMzkwMTgwNjQ0KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQxLCBGSVhfMV8xMTExNDA0NjYpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgKz0gejE7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSB6NCArIHo1OworICAgICAgICAgICAgICAgICAgICB0bXAyID0gejMgKyB6NTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyArPSB6MTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyA9PSAwLCBkNSA9PSAwLCBkNyAhPSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWSgtZDcsIEZJWF8xXzM4NzAzOTg0NSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSBNVUxUSVBMWShkNywgRklYXzFfMTc1ODc1NjAyKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTFRJUExZKC1kNywgRklYXzBfNzg1Njk0OTU4KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQ3LCBGSVhfMF8yNzU4OTkzODApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkNSkgeworICAgICAgICAgICAgaWYgKGQzKSB7CisgICAgICAgICAgICAgICAgaWYgKGQxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxICE9IDAsIGQzICE9IDAsIGQ1ICE9IDAsIGQ3ID09IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejIgPSBkNSArIGQzOworICAgICAgICAgICAgICAgICAgICB6NCA9IGQ1ICsgZDE7CisgICAgICAgICAgICAgICAgICAgIHo1ID0gTVVMVElQTFkoZDMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsKKworICAgICAgICAgICAgICAgICAgICB0bXAxID0gTVVMVElQTFkoZDUsIEZJWF8yXzA1MzExOTg2OSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWShkMywgRklYXzNfMDcyNzExMDI2KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQxLCBGSVhfMV81MDEzMjExMTApOworICAgICAgICAgICAgICAgICAgICB6MSA9IE1VTFRJUExZKC1kMSwgRklYXzBfODk5OTc2MjIzKTsKKyAgICAgICAgICAgICAgICAgICAgejIgPSBNVUxUSVBMWSgtejIsIEZJWF8yXzU2MjkxNTQ0Nyk7CisgICAgICAgICAgICAgICAgICAgIHozID0gTVVMVElQTFkoLWQzLCBGSVhfMV85NjE1NzA1NjApOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKC16NCwgRklYXzBfMzkwMTgwNjQ0KTsKKworICAgICAgICAgICAgICAgICAgICB6MyArPSB6NTsKKyAgICAgICAgICAgICAgICAgICAgejQgKz0gejU7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9IHoxICsgejM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgKz0gejIgKyB6NDsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiArPSB6MiArIHozOworICAgICAgICAgICAgICAgICAgICB0bXAzICs9IHoxICsgejQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZDEgPT0gMCwgZDMgIT0gMCwgZDUgIT0gMCwgZDcgPT0gMCAqLworICAgICAgICAgICAgICAgICAgICB6MiA9IGQ1ICsgZDM7CisKKyAgICAgICAgICAgICAgICAgICAgejUgPSBNVUxUSVBMWSh6MiwgRklYXzFfMTc1ODc1NjAyKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IE1VTFRJUExZKGQ1LCBGSVhfMV82NjI5MzkyMjUpOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKC1kNSwgRklYXzBfMzkwMTgwNjQ0KTsKKyAgICAgICAgICAgICAgICAgICAgejIgPSBNVUxUSVBMWSgtejIsIEZJWF8xXzM4NzAzOTg0NSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWShkMywgRklYXzFfMTExMTQwNDY2KTsKKyAgICAgICAgICAgICAgICAgICAgejMgPSBNVUxUSVBMWSgtZDMsIEZJWF8xXzk2MTU3MDU2MCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9IHozICsgejU7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgKz0gejI7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgKz0gejI7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgPSB6NCArIHo1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGQxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxICE9IDAsIGQzID09IDAsIGQ1ICE9IDAsIGQ3ID09IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejQgPSBkNSArIGQxOworCisgICAgICAgICAgICAgICAgICAgIHo1ID0gTVVMVElQTFkoejQsIEZJWF8xXzE3NTg3NTYwMik7CisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoLWQxLCBGSVhfMF84OTk5NzYyMjMpOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDEsIEZJWF8wXzYwMTM0NDg4Nyk7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSBNVUxUSVBMWSgtZDUsIEZJWF8wXzUwOTc5NTU3OSk7CisgICAgICAgICAgICAgICAgICAgIHoyID0gTVVMVElQTFkoLWQ1LCBGSVhfMl81NjI5MTU0NDcpOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKHo0LCBGSVhfMF83ODU2OTQ5NTgpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSB6MSArIHo1OworICAgICAgICAgICAgICAgICAgICB0bXAxICs9IHo0OworICAgICAgICAgICAgICAgICAgICB0bXAyID0gejIgKyB6NTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyArPSB6NDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyA9PSAwLCBkNSAhPSAwLCBkNyA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWShkNSwgRklYXzFfMTc1ODc1NjAyKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IE1VTFRJUExZKGQ1LCBGSVhfMF8yNzU4OTkzODApOworICAgICAgICAgICAgICAgICAgICB0bXAyID0gTVVMVElQTFkoLWQ1LCBGSVhfMV8zODcwMzk4NDUpOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDUsIEZJWF8wXzc4NTY5NDk1OCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGQzKSB7CisgICAgICAgICAgICAgICAgaWYgKGQxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQxICE9IDAsIGQzICE9IDAsIGQ1ID09IDAsIGQ3ID09IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgejUgPSBkMSArIGQzOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDEsIEZJWF8wXzIxMTE2NDI0Myk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWSgtZDMsIEZJWF8xXzQ1MTc3NDk4MSk7CisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoZDEsIEZJWF8xXzA2MTU5NDMzNyk7CisgICAgICAgICAgICAgICAgICAgIHoyID0gTVVMVElQTFkoLWQzLCBGSVhfMl8xNzI3MzQ4MDMpOworICAgICAgICAgICAgICAgICAgICB6NCA9IE1VTFRJUExZKHo1LCBGSVhfMF83ODU2OTQ5NTgpOworICAgICAgICAgICAgICAgICAgICB6NSA9IE1VTFRJUExZKHo1LCBGSVhfMV8xNzU4NzU2MDIpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSB6MSAtIHo0OworICAgICAgICAgICAgICAgICAgICB0bXAxID0gejIgKyB6NDsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiArPSB6NTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyArPSB6NTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyAhPSAwLCBkNSA9PSAwLCBkNyA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWSgtZDMsIEZJWF8wXzc4NTY5NDk1OCk7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSBNVUxUSVBMWSgtZDMsIEZJWF8xXzM4NzAzOTg0NSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWSgtZDMsIEZJWF8wXzI3NTg5OTM4MCk7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgPSBNVUxUSVBMWShkMywgRklYXzFfMTc1ODc1NjAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChkMSkgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSAhPSAwLCBkMyA9PSAwLCBkNSA9PSAwLCBkNyA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSBNVUxUSVBMWShkMSwgRklYXzBfMjc1ODk5MzgwKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IE1VTFRJUExZKGQxLCBGSVhfMF83ODU2OTQ5NTgpOworICAgICAgICAgICAgICAgICAgICB0bXAyID0gTVVMVElQTFkoZDEsIEZJWF8xXzE3NTg3NTYwMik7CisgICAgICAgICAgICAgICAgICAgIHRtcDMgPSBNVUxUSVBMWShkMSwgRklYXzFfMzg3MDM5ODQ1KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMSA9PSAwLCBkMyA9PSAwLCBkNSA9PSAwLCBkNyA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSB0bXAxID0gdG1wMiA9IHRtcDMgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogaW5wdXRzIGFyZSB0bXAxMC4udG1wMTMsIHRtcDAuLnRtcDMgKi8KKworICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChpbnQxNl90KSBERVNDQUxFKHRtcDEwICsgdG1wMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gKGludDE2X3QpIERFU0NBTEUodG1wMTAgLSB0bXAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSAoaW50MTZfdCkgREVTQ0FMRSh0bXAxMSArIHRtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpOworICAgIGRhdGFwdHJbRENUU0laRSo2XSA9IChpbnQxNl90KSBERVNDQUxFKHRtcDExIC0gdG1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKGludDE2X3QpIERFU0NBTEUodG1wMTIgKyB0bXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSAoaW50MTZfdCkgREVTQ0FMRSh0bXAxMiAtIHRtcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpOworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChpbnQxNl90KSBERVNDQUxFKHRtcDEzICsgdG1wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gKGludDE2X3QpIERFU0NBTEUodG1wMTMgLSB0bXAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKTsKKworICAgIGRhdGFwdHIrKzsgICAgICAgICAgICAgICAgICAvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisjdW5kZWYgRENUU0laRQorI2RlZmluZSBEQ1RTSVpFIDQKKyNkZWZpbmUgRENUU1RSSURFIDgKKwordm9pZCBmZl9qX3Jldl9kY3Q0KERDVEJMT0NLIGRhdGEpCit7CisgIGludDMyX3QgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgaW50MzJfdCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgaW50MzJfdCB6MTsKKyAgaW50MzJfdCBkMCwgZDIsIGQ0LCBkNjsKKyAgcmVnaXN0ZXIgaW50MTZfdCAqZGF0YXB0cjsKKyAgaW50IHJvd2N0cjsKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgSURDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisKKyAgZGF0YVswXSArPSA0OworCisgIGRhdGFwdHIgPSBkYXRhOworCisgIGZvciAocm93Y3RyID0gRENUU0laRS0xOyByb3djdHIgPj0gMDsgcm93Y3RyLS0pIHsKKyAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0CisgICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKKyAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgcm93IGluIHdoaWNoIGFsbAorICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KKyAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCisgICAgICogcm93IERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCisgICAgICovCisKKyAgICByZWdpc3RlciBpbnQgKmlkYXRhcHRyID0gKGludCopZGF0YXB0cjsKKworICAgIGQwID0gZGF0YXB0clswXTsKKyAgICBkMiA9IGRhdGFwdHJbMV07CisgICAgZDQgPSBkYXRhcHRyWzJdOworICAgIGQ2ID0gZGF0YXB0clszXTsKKworICAgIGlmICgoZDIgfCBkNCB8IGQ2KSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLworICAgICAgaWYgKGQwKSB7CisgICAgICAgICAgLyogQ29tcHV0ZSBhIDMyIGJpdCB2YWx1ZSB0byBhc3NpZ24uICovCisgICAgICAgICAgaW50MTZfdCBkY3ZhbCA9IChpbnQxNl90KSAoZDAgPDwgUEFTUzFfQklUUyk7CisgICAgICAgICAgcmVnaXN0ZXIgaW50IHYgPSAoZGN2YWwgJiAweGZmZmYpIHwgKChkY3ZhbCA8PCAxNikgJiAweGZmZmYwMDAwKTsKKworICAgICAgICAgIGlkYXRhcHRyWzBdID0gdjsKKyAgICAgICAgICBpZGF0YXB0clsxXSA9IHY7CisgICAgICB9CisKKyAgICAgIGRhdGFwdHIgKz0gRENUU1RSSURFOyAgICAgLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBFdmVuIHBhcnQ6IHJldmVyc2UgdGhlIGV2ZW4gcGFydCBvZiB0aGUgZm9yd2FyZCBEQ1QuICovCisgICAgLyogVGhlIHJvdGF0b3IgaXMgc3FydCgyKSpjKC02KS4gKi8KKyAgICBpZiAoZDYpIHsKKyAgICAgICAgICAgIGlmIChkMikgeworICAgICAgICAgICAgICAgICAgICAvKiBkMCAhPSAwLCBkMiAhPSAwLCBkNCAhPSAwLCBkNiAhPSAwICovCisgICAgICAgICAgICAgICAgICAgIHoxID0gTVVMVElQTFkoZDIgKyBkNiwgRklYXzBfNTQxMTk2MTAwKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHoxICsgTVVMVElQTFkoLWQ2LCBGSVhfMV84NDc3NTkwNjUpOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gejEgKyBNVUxUSVBMWShkMiwgRklYXzBfNzY1MzY2ODY1KTsKKworICAgICAgICAgICAgICAgICAgICB0bXAwID0gKGQwICsgZDQpIDw8IENPTlNUX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoZDAgLSBkNCkgPDwgQ09OU1RfQklUUzsKKworICAgICAgICAgICAgICAgICAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgICAgICAgICAgICAgICAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgICAgICAgICAgICAgICAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgICAgICAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZDAgIT0gMCwgZDIgPT0gMCwgZDQgIT0gMCwgZDYgIT0gMCAqLworICAgICAgICAgICAgICAgICAgICB0bXAyID0gTVVMVElQTFkoLWQ2LCBGSVhfMV8zMDY1NjI5NjUpOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDYsIEZJWF8wXzU0MTE5NjEwMCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9IChkMCArIGQ0KSA8PCBDT05TVF9CSVRTOworICAgICAgICAgICAgICAgICAgICB0bXAxID0gKGQwIC0gZDQpIDw8IENPTlNUX0JJVFM7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGQyKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQwICE9IDAsIGQyICE9IDAsIGQ0ICE9IDAsIGQ2ID09IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTFRJUExZKGQyLCBGSVhfMF81NDExOTYxMDApOworICAgICAgICAgICAgICAgICAgICB0bXAzID0gTVVMVElQTFkoZDIsIEZJWF8xXzMwNjU2Mjk2NSk7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9IChkMCArIGQ0KSA8PCBDT05TVF9CSVRTOworICAgICAgICAgICAgICAgICAgICB0bXAxID0gKGQwIC0gZDQpIDw8IENPTlNUX0JJVFM7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQwICE9IDAsIGQyID09IDAsIGQ0ICE9IDAsIGQ2ID09IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wMTAgPSB0bXAxMyA9IChkMCArIGQ0KSA8PCBDT05TVF9CSVRTOworICAgICAgICAgICAgICAgICAgICB0bXAxMSA9IHRtcDEyID0gKGQwIC0gZDQpIDw8IENPTlNUX0JJVFM7CisgICAgICAgICAgICB9CisgICAgICB9CisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IGlucHV0cyBhcmUgdG1wMTAuLnRtcDEzLCB0bXAwLi50bXAzICovCisKKyAgICBkYXRhcHRyWzBdID0gKGludDE2X3QpIERFU0NBTEUodG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0clsxXSA9IChpbnQxNl90KSBERVNDQUxFKHRtcDExLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbMl0gPSAoaW50MTZfdCkgREVTQ0FMRSh0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzNdID0gKGludDE2X3QpIERFU0NBTEUodG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisKKyAgICBkYXRhcHRyICs9IERDVFNUUklERTsgICAgICAgLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4gKi8KKyAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMsICovCisgIC8qIGFuZCBhbHNvIHVuZG8gdGhlIFBBU1MxX0JJVFMgc2NhbGluZy4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChyb3djdHIgPSBEQ1RTSVpFLTE7IHJvd2N0ciA+PSAwOyByb3djdHItLSkgeworICAgIC8qIENvbHVtbnMgb2YgemVyb2VzIGNhbiBiZSBleHBsb2l0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdlIGRpZCB3aXRoIHJvd3MuCisgICAgICogSG93ZXZlciwgdGhlIHJvdyBjYWxjdWxhdGlvbiBoYXMgY3JlYXRlZCBtYW55IG5vbnplcm8gQUMgdGVybXMsIHNvIHRoZQorICAgICAqIHNpbXBsaWZpY2F0aW9uIGFwcGxpZXMgbGVzcyBvZnRlbiAodHlwaWNhbGx5IDUlIHRvIDEwJSBvZiB0aGUgdGltZSkuCisgICAgICogT24gbWFjaGluZXMgd2l0aCB2ZXJ5IGZhc3QgbXVsdGlwbGljYXRpb24sIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKKyAgICAgKiB0ZXN0IHRha2VzIG1vcmUgdGltZSB0aGFuIGl0J3Mgd29ydGguICBJbiB0aGF0IGNhc2UgdGhpcyBzZWN0aW9uCisgICAgICogbWF5IGJlIGNvbW1lbnRlZCBvdXQuCisgICAgICovCisKKyAgICBkMCA9IGRhdGFwdHJbRENUU1RSSURFKjBdOworICAgIGQyID0gZGF0YXB0cltEQ1RTVFJJREUqMV07CisgICAgZDQgPSBkYXRhcHRyW0RDVFNUUklERSoyXTsKKyAgICBkNiA9IGRhdGFwdHJbRENUU1RSSURFKjNdOworCisgICAgLyogRXZlbiBwYXJ0OiByZXZlcnNlIHRoZSBldmVuIHBhcnQgb2YgdGhlIGZvcndhcmQgRENULiAqLworICAgIC8qIFRoZSByb3RhdG9yIGlzIHNxcnQoMikqYygtNikuICovCisgICAgaWYgKGQ2KSB7CisgICAgICAgICAgICBpZiAoZDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZDAgIT0gMCwgZDIgIT0gMCwgZDQgIT0gMCwgZDYgIT0gMCAqLworICAgICAgICAgICAgICAgICAgICB6MSA9IE1VTFRJUExZKGQyICsgZDYsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKC1kNiwgRklYXzFfODQ3NzU5MDY1KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IHoxICsgTVVMVElQTFkoZDIsIEZJWF8wXzc2NTM2Njg2NSk7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9IChkMCArIGQ0KSA8PCBDT05TVF9CSVRTOworICAgICAgICAgICAgICAgICAgICB0bXAxID0gKGQwIC0gZDQpIDw8IENPTlNUX0JJVFM7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGQwICE9IDAsIGQyID09IDAsIGQ0ICE9IDAsIGQ2ICE9IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IE1VTFRJUExZKC1kNiwgRklYXzFfMzA2NTYyOTY1KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQ2LCBGSVhfMF81NDExOTYxMDApOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSAoZDAgKyBkNCkgPDwgQ09OU1RfQklUUzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IChkMCAtIGQ0KSA8PCBDT05TVF9CSVRTOworCisgICAgICAgICAgICAgICAgICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgICAgICAgICAgICAgICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICAgICAgICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkMikgeworICAgICAgICAgICAgICAgICAgICAvKiBkMCAhPSAwLCBkMiAhPSAwLCBkNCAhPSAwLCBkNiA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBNVUxUSVBMWShkMiwgRklYXzBfNTQxMTk2MTAwKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IE1VTFRJUExZKGQyLCBGSVhfMV8zMDY1NjI5NjUpOworCisgICAgICAgICAgICAgICAgICAgIHRtcDAgPSAoZDAgKyBkNCkgPDwgQ09OU1RfQklUUzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IChkMCAtIGQ0KSA8PCBDT05TVF9CSVRTOworCisgICAgICAgICAgICAgICAgICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgICAgICAgICAgICAgICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgICAgICAgICAgICAgICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICAgICAgICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBkMCAhPSAwLCBkMiA9PSAwLCBkNCAhPSAwLCBkNiA9PSAwICovCisgICAgICAgICAgICAgICAgICAgIHRtcDEwID0gdG1wMTMgPSAoZDAgKyBkNCkgPDwgQ09OU1RfQklUUzsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTEgPSB0bXAxMiA9IChkMCAtIGQ0KSA8PCBDT05TVF9CSVRTOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogaW5wdXRzIGFyZSB0bXAxMC4udG1wMTMsIHRtcDAuLnRtcDMgKi8KKworICAgIGRhdGFwdHJbRENUU1RSSURFKjBdID0gdG1wMTAgPj4gKENPTlNUX0JJVFMrUEFTUzFfQklUUyszKTsKKyAgICBkYXRhcHRyW0RDVFNUUklERSoxXSA9IHRtcDExID4+IChDT05TVF9CSVRTK1BBU1MxX0JJVFMrMyk7CisgICAgZGF0YXB0cltEQ1RTVFJJREUqMl0gPSB0bXAxMiA+PiAoQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpOworICAgIGRhdGFwdHJbRENUU1RSSURFKjNdID0gdG1wMTMgPj4gKENPTlNUX0JJVFMrUEFTUzFfQklUUyszKTsKKworICAgIGRhdGFwdHIrKzsgICAgICAgICAgICAgICAgICAvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCit2b2lkIGZmX2pfcmV2X2RjdDIoRENUQkxPQ0sgZGF0YSl7CisgIGludCBkMDAsIGQwMSwgZDEwLCBkMTE7CisKKyAgZGF0YVswXSArPSA0OworICBkMDAgPSBkYXRhWzArMCpEQ1RTVFJJREVdICsgZGF0YVsxKzAqRENUU1RSSURFXTsKKyAgZDAxID0gZGF0YVswKzAqRENUU1RSSURFXSAtIGRhdGFbMSswKkRDVFNUUklERV07CisgIGQxMCA9IGRhdGFbMCsxKkRDVFNUUklERV0gKyBkYXRhWzErMSpEQ1RTVFJJREVdOworICBkMTEgPSBkYXRhWzArMSpEQ1RTVFJJREVdIC0gZGF0YVsxKzEqRENUU1RSSURFXTsKKworICBkYXRhWzArMCpEQ1RTVFJJREVdPSAoZDAwICsgZDEwKT4+MzsKKyAgZGF0YVsxKzAqRENUU1RSSURFXT0gKGQwMSArIGQxMSk+PjM7CisgIGRhdGFbMCsxKkRDVFNUUklERV09IChkMDAgLSBkMTApPj4zOworICBkYXRhWzErMSpEQ1RTVFJJREVdPSAoZDAxIC0gZDExKT4+MzsKK30KKwordm9pZCBmZl9qX3Jldl9kY3QxKERDVEJMT0NLIGRhdGEpeworICBkYXRhWzBdID0gKGRhdGFbMF0gKyA0KT4+MzsKK30KKworI3VuZGVmIEZJWAorI3VuZGVmIENPTlNUX0JJVFMKKwordm9pZCBmZl9qcmVmX2lkY3RfcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGZmX2pfcmV2X2RjdChibG9jayk7CisgICAgZmZfcHV0X3BpeGVsc19jbGFtcGVkKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworfQorCit2b2lkIGZmX2pyZWZfaWRjdF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgZmZfal9yZXZfZGN0KGJsb2NrKTsKKyAgICBmZl9hZGRfcGl4ZWxzX2NsYW1wZWQoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9qdmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvanZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2U4ZWRjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvanZkZWMuYwpAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIEJpdG1hcCBCcm90aGVycyBKViB2aWRlbyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGV0ZXIgUm9zcyA8cHJvc3NAeHZpZC5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEJpdG1hcCBCcm90aGVycyBKViB2aWRlbyBkZWNvZGVyCisgKiBAYXV0aG9yIFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IEp2Q29udGV4dCB7CisgICAgQmxvY2tEU1BDb250ZXh0IGJkc3A7CisgICAgQVZGcmFtZSAgICpmcmFtZTsKKyAgICB1aW50MzJfdCAgIHBhbGV0dGVbQVZQQUxFVFRFX0NPVU5UXTsKKyAgICBpbnQgICAgICAgIHBhbGV0dGVfaGFzX2NoYW5nZWQ7Cit9IEp2Q29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBKdkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+ZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKyAgICBmZl9ibG9ja2RzcF9pbml0KCZzLT5iZHNwLCBhdmN0eCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVjb2RlIDJ4MiBibG9jaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb2RlMngyKEdldEJpdENvbnRleHQgKmdiLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSkKK3sKKyAgICBpbnQgaSwgaiwgdlsyXTsKKworICAgIHN3aXRjaCAoZ2V0X2JpdHMoZ2IsIDIpKSB7CisgICAgY2FzZSAxOgorICAgICAgICB2WzBdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgbWVtc2V0KGRzdCArIGogKiBsaW5lc2l6ZSwgdlswXSwgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgdlswXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgdlsxXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICAgICAgZHN0W2ogKiBsaW5lc2l6ZSArIGldID0gdltnZXRfYml0czEoZ2IpXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgICAgICAgICBkc3RbaiAqIGxpbmVzaXplICsgaV0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgfQorfQorCisvKioKKyAqIERlY29kZSA0eDQgYmxvY2sKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRlY29kZTR4NChHZXRCaXRDb250ZXh0ICpnYiwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpCit7CisgICAgaW50IGksIGosIHZbMl07CisKKyAgICBzd2l0Y2ggKGdldF9iaXRzKGdiLCAyKSkgeworICAgIGNhc2UgMToKKyAgICAgICAgdlswXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgIG1lbXNldChkc3QgKyBqICogbGluZXNpemUsIHZbMF0sIDQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHZbMF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIHZbMV0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIGZvciAoaiA9IDI7IGogPj0gMDsgaiAtPSAyKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIGRzdFtqICogbGluZXNpemUgKyBpXSA9IHZbZ2V0X2JpdHMxKGdiKV07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIGRzdFsoaiArIDEpICogbGluZXNpemUgKyBpXSA9IHZbZ2V0X2JpdHMxKGdiKV07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaiArPSAyKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKz0gMikKKyAgICAgICAgICAgICAgICBkZWNvZGUyeDIoZ2IsIGRzdCArIGogKiBsaW5lc2l6ZSArIGksIGxpbmVzaXplKTsKKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIDh4OCBibG9jaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb2RlOHg4KEdldEJpdENvbnRleHQgKmdiLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tEU1BDb250ZXh0ICpiZHNwKQoreworICAgIGludCBpLCBqLCB2WzJdOworCisgICAgc3dpdGNoIChnZXRfYml0cyhnYiwgMikpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIHZbMF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIGJkc3AtPmZpbGxfYmxvY2tfdGFiWzFdKGRzdCwgdlswXSwgbGluZXNpemUsIDgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHZbMF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIHZbMV0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIGZvciAoaiA9IDc7IGogPj0gMDsgai0tKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgICAgICBkc3RbaiAqIGxpbmVzaXplICsgaV0gPSB2W2dldF9iaXRzMShnYildOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqICs9IDQpCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSA0KQorICAgICAgICAgICAgICAgIGRlY29kZTR4NChnYiwgZHN0ICsgaiAqIGxpbmVzaXplICsgaSwgbGluZXNpemUpOworICAgIH0KK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBKdkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBidWYgKyBhdnBrdC0+c2l6ZTsKKyAgICBpbnQgdmlkZW9fc2l6ZSwgdmlkZW9fdHlwZSwgaSwgaiwgcmV0OworCisgICAgaWYgKGF2cGt0LT5zaXplIDwgNikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB2aWRlb19zaXplID0gQVZfUkwzMihidWYpOworICAgIHZpZGVvX3R5cGUgPSBidWZbNF07CisgICAgYnVmICs9IDU7CisKKyAgICBpZiAodmlkZW9fc2l6ZSkgeworICAgICAgICBpZiAodmlkZW9fc2l6ZSA8IDAgfHwgdmlkZW9fc2l6ZSA+IGF2cGt0LT5zaXplIC0gNSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ2aWRlbyBzaXplICVkIGludmFsaWRcbiIsIHZpZGVvX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAodmlkZW9fdHlwZSA9PSAwIHx8IHZpZGVvX3R5cGUgPT0gMSkgeworICAgICAgICAgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIDggKiB2aWRlb19zaXplKTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT5oZWlnaHQ7IGogKz0gOCkKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPndpZHRoOyBpICs9IDgpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZTh4OCgmZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZS0+ZGF0YVswXSArIGogKiBzLT5mcmFtZS0+bGluZXNpemVbMF0gKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWUtPmxpbmVzaXplWzBdLCAmcy0+YmRzcCk7CisKKyAgICAgICAgICAgIGJ1ZiArPSB2aWRlb19zaXplOworICAgICAgICB9IGVsc2UgaWYgKHZpZGVvX3R5cGUgPT0gMikgeworICAgICAgICAgICAgaW50IHYgPSAqYnVmKys7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPmhlaWdodDsgaisrKQorICAgICAgICAgICAgICAgIG1lbXNldChzLT5mcmFtZS0+ZGF0YVswXSArIGogKiBzLT5mcmFtZS0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIHYsIGF2Y3R4LT53aWR0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBmcmFtZSB0eXBlICVpXG4iLCB2aWRlb190eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPj0gQVZQQUxFVFRFX0NPVU5UICogMykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVZQQUxFVFRFX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBhbCA9IEFWX1JCMjQoYnVmKTsKKyAgICAgICAgICAgIHMtPnBhbGV0dGVbaV0gPSAweEZGVSA8PCAyNCB8IHBhbCA8PCAyIHwgKChwYWwgPj4gNCkgJiAweDMwMzAzKTsKKyAgICAgICAgICAgIGJ1ZiArPSAzOworICAgICAgICB9CisgICAgICAgIHMtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgIH0KKworICAgIGlmICh2aWRlb19zaXplKSB7CisgICAgICAgIHMtPmZyYW1lLT5rZXlfZnJhbWUgICAgICAgICAgID0gMTsKKyAgICAgICAgcy0+ZnJhbWUtPnBpY3RfdHlwZSAgICAgICAgICAgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgcy0+ZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSBzLT5wYWxldHRlX2hhc19jaGFuZ2VkOworICAgICAgICBzLT5wYWxldHRlX2hhc19jaGFuZ2VkICAgICAgICA9IDA7CisgICAgICAgIG1lbWNweShzLT5mcmFtZS0+ZGF0YVsxXSwgcy0+cGFsZXR0ZSwgQVZQQUxFVFRFX1NJWkUpOworCisgICAgICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBKdkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfanZfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAianYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCaXRtYXAgQnJvdGhlcnMgSlYgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSlYsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEp2Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2tiZHdpbi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMva2Jkd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzMmFlYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2tiZHdpbi5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAia2Jkd2luLmgiCisKKyNkZWZpbmUgQkVTU0VMX0kwX0lURVIgNTAgLy8gZGVmYXVsdDogNTAgaXRlcmF0aW9ucyBvZiBCZXNzZWwgSTAgYXBwcm94aW1hdGlvbgorCithdl9jb2xkIHZvaWQgZmZfa2JkX3dpbmRvd19pbml0KGZsb2F0ICp3aW5kb3csIGZsb2F0IGFscGhhLCBpbnQgbikKK3sKKyAgIGludCBpLCBqOworICAgZG91YmxlIHN1bSA9IDAuMCwgYmVzc2VsLCB0bXA7CisgICBkb3VibGUgbG9jYWxfd2luZG93W0ZGX0tCRF9XSU5ET1dfTUFYXTsKKyAgIGRvdWJsZSBhbHBoYTIgPSAoYWxwaGEgKiBNX1BJIC8gbikgKiAoYWxwaGEgKiBNX1BJIC8gbik7CisKKyAgIGF2X2Fzc2VydDAobiA8PSBGRl9LQkRfV0lORE9XX01BWCk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICB0bXAgPSBpICogKG4gLSBpKSAqIGFscGhhMjsKKyAgICAgICBiZXNzZWwgPSAxLjA7CisgICAgICAgZm9yIChqID0gQkVTU0VMX0kwX0lURVI7IGogPiAwOyBqLS0pCisgICAgICAgICAgIGJlc3NlbCA9IGJlc3NlbCAqIHRtcCAvIChqICogaikgKyAxOworICAgICAgIHN1bSArPSBiZXNzZWw7CisgICAgICAgbG9jYWxfd2luZG93W2ldID0gc3VtOworICAgfQorCisgICBzdW0rKzsKKyAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgd2luZG93W2ldID0gc3FydChsb2NhbF93aW5kb3dbaV0gLyBzdW0pOworfQorCithdl9jb2xkIHZvaWQgZmZfa2JkX3dpbmRvd19pbml0X2ZpeGVkKGludDMyX3QgKndpbmRvdywgZmxvYXQgYWxwaGEsIGludCBuKQoreworICAgIGludCBpOworICAgIGZsb2F0IGxvY2FsX3dpbmRvd1tGRl9LQkRfV0lORE9XX01BWF07CisKKyAgICBmZl9rYmRfd2luZG93X2luaXQobG9jYWxfd2luZG93LCBhbHBoYSwgbik7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgd2luZG93W2ldID0gKGludClmbG9vcigyMTQ3NDgzNjQ3LjAgKiBsb2NhbF93aW5kb3dbaV0gKyAwLjUpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMva2Jkd2luLmggYi9mZm1wZWcvbGliYXZjb2RlYy9rYmR3aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTg1YzQyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMva2Jkd2luLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfS0JEV0lOX0gKKyNkZWZpbmUgQVZDT0RFQ19LQkRXSU5fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKgorICogTWF4aW11bSB3aW5kb3cgc2l6ZSBmb3IgZmZfa2JkX3dpbmRvd19pbml0LgorICovCisjZGVmaW5lIEZGX0tCRF9XSU5ET1dfTUFYIDEwMjQKKworLyoqCisgKiBHZW5lcmF0ZSBhIEthaXNlci1CZXNzZWwgRGVyaXZlZCBXaW5kb3cuCisgKiBAcGFyYW0gICB3aW5kb3cgIHBvaW50ZXIgdG8gaGFsZiB3aW5kb3cKKyAqIEBwYXJhbSAgIGFscGhhICAgZGV0ZXJtaW5lcyB3aW5kb3cgc2hhcGUKKyAqIEBwYXJhbSAgIG4gICAgICAgc2l6ZSBvZiBoYWxmIHdpbmRvdywgbWF4IEZGX0tCRF9XSU5ET1dfTUFYCisgKi8KK3ZvaWQgZmZfa2JkX3dpbmRvd19pbml0KGZsb2F0ICp3aW5kb3csIGZsb2F0IGFscGhhLCBpbnQgbik7Cit2b2lkIGZmX2tiZF93aW5kb3dfaW5pdF9maXhlZChpbnQzMl90ICp3aW5kb3csIGZsb2F0IGFscGhhLCBpbnQgbik7CisKKyNlbmRpZiAvKiBBVkNPREVDX0tCRFdJTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9rZ3YxZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9rZ3YxZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxYmE3NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2tndjFkZWMuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIEtlZ2EgR2FtZSBWaWRlbyAoS0dWMSkgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIERhbmllbCBWZXJrYW1wCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEtlZ2EgR2FtZSBWaWRlbyBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCAqZnJhbWVfYnVmZmVyOworICAgIHVpbnQxNl90ICpsYXN0X2ZyYW1lX2J1ZmZlcjsKK30gS2d2Q29udGV4dDsKKworc3RhdGljIHZvaWQgZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBLZ3ZDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmYy0+ZnJhbWVfYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmYy0+bGFzdF9mcmFtZV9idWZmZXIpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgYXZwa3QtPnNpemU7CisgICAgS2d2Q29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBvZmZzZXRzWzhdOworICAgIHVpbnQ4X3QgKm91dCwgKnByZXY7CisgICAgaW50IG91dGNudCA9IDAsIG1heGNudDsKKyAgICBpbnQgdywgaCwgaSwgcmVzOworCisgICAgaWYgKGF2cGt0LT5zaXplIDwgMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB3ID0gKGJ1ZlswXSArIDEpICogODsKKyAgICBoID0gKGJ1ZlsxXSArIDEpICogODsKKyAgICBidWYgKz0gMjsKKworICAgIGlmICh3ICE9IGF2Y3R4LT53aWR0aCB8fCBoICE9IGF2Y3R4LT5oZWlnaHQpIHsKKyAgICAgICAgYXZfZnJlZXAoJmMtPmZyYW1lX2J1ZmZlcik7CisgICAgICAgIGF2X2ZyZWVwKCZjLT5sYXN0X2ZyYW1lX2J1ZmZlcik7CisgICAgICAgIGlmICgocmVzID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHcsIGgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICghYy0+ZnJhbWVfYnVmZmVyKSB7CisgICAgICAgIGMtPmZyYW1lX2J1ZmZlciAgICAgID0gYXZfbWFsbG9jeihhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogMik7CisgICAgICAgIGMtPmxhc3RfZnJhbWVfYnVmZmVyID0gYXZfbWFsbG9jeihhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogMik7CisgICAgICAgIGlmICghYy0+ZnJhbWVfYnVmZmVyIHx8ICFjLT5sYXN0X2ZyYW1lX2J1ZmZlcikgeworICAgICAgICAgICAgZGVjb2RlX2ZsdXNoKGF2Y3R4KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtYXhjbnQgPSB3ICogaDsKKworICAgIGlmICgocmVzID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXM7CisgICAgb3V0ICA9ICh1aW50OF90KiljLT5mcmFtZV9idWZmZXI7CisgICAgcHJldiA9ICh1aW50OF90KiljLT5sYXN0X2ZyYW1lX2J1ZmZlcjsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIG9mZnNldHNbaV0gPSAtMTsKKworICAgIHdoaWxlIChvdXRjbnQgPCBtYXhjbnQgJiYgYnVmX2VuZCAtIDIgPj0gYnVmKSB7CisgICAgICAgIGludCBjb2RlID0gQVZfUkwxNihidWYpOworICAgICAgICBidWYgKz0gMjsKKworICAgICAgICBpZiAoIShjb2RlICYgMHg4MDAwKSkgeworICAgICAgICAgICAgQVZfV04xNkEoJm91dFsyICogb3V0Y250XSwgY29kZSk7IC8vIHJnYjU1NSBwaXhlbCBjb2RlZCBkaXJlY3RseQorICAgICAgICAgICAgb3V0Y250Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgY291bnQ7CisKKyAgICAgICAgICAgIGlmICgoY29kZSAmIDB4NjAwMCkgPT0gMHg2MDAwKSB7CisgICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIHByZXZpb3VzIGZyYW1lCisgICAgICAgICAgICAgICAgaW50IG9pZHggPSAoY29kZSA+PiAxMCkgJiA3OworICAgICAgICAgICAgICAgIGludCBzdGFydDsKKworICAgICAgICAgICAgICAgIGNvdW50ID0gKGNvZGUgJiAweDNGRikgKyAzOworCisgICAgICAgICAgICAgICAgaWYgKG9mZnNldHNbb2lkeF0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZfZW5kIC0gMyA8IGJ1ZikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBvZmZzZXRzW29pZHhdID0gQVZfUkwyNChidWYpOworICAgICAgICAgICAgICAgICAgICBidWYgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGFydCA9IChvdXRjbnQgKyBvZmZzZXRzW29pZHhdKSAlIG1heGNudDsKKworICAgICAgICAgICAgICAgIGlmIChtYXhjbnQgLSBzdGFydCA8IGNvdW50IHx8IG1heGNudCAtIG91dGNudCA8IGNvdW50KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGlmICghcHJldikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZSByZWZlcmVuY2UgZG9lcyBub3QgZXhpc3RcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtZW1jcHkob3V0ICsgMiAqIG91dGNudCwgcHJldiArIDIgKiBzdGFydCwgMiAqIGNvdW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIGVhcmxpZXIgaW4gdGhpcyBmcmFtZQorICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAoY29kZSAmIDB4MUZGRikgKyAxOworCisgICAgICAgICAgICAgICAgaWYgKCEoY29kZSAmIDB4NjAwMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNvZGUgJiAweDYwMDApID09IDB4MjAwMCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Zl9lbmQgLSAxIDwgYnVmKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gNCArICpidWYrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAob3V0Y250IDwgb2Zmc2V0IHx8IG1heGNudCAtIG91dGNudCA8IGNvdW50KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGF2X21lbWNweV9iYWNrcHRyKG91dCArIDIgKiBvdXRjbnQsIDIgKiBvZmZzZXQsIDIgKiBjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRjbnQgKz0gY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0Y250IC0gbWF4Y250KQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImZyYW1lIGZpbmlzaGVkIHdpdGggJWQgZGlmZlxuIiwgb3V0Y250IC0gbWF4Y250KTsKKworICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoZnJhbWUtPmRhdGFbMF0sIGZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KiljLT5mcmFtZV9idWZmZXIsICBhdmN0eC0+d2lkdGggKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoICogMiwgYXZjdHgtPmhlaWdodCk7CisgICAgRkZTV0FQKHVpbnQxNl90ICosIGMtPmZyYW1lX2J1ZmZlciwgYy0+bGFzdF9mcmFtZV9idWZmZXIpOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU1NTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgZGVjb2RlX2ZsdXNoKGF2Y3R4KTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9rZ3YxX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImtndjEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJLZWdhIEdhbWUgVmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfS0dWMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoS2d2Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmZsdXNoICAgICAgICAgID0gZGVjb2RlX2ZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMva212Yy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMva212Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NzljMzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9rbXZjLmMKQEAgLTAsMCArMSw0MjUgQEAKKy8qCisgKiBLTVZDIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEthcmwgTW9ydG9uJ3MgVmlkZW8gQ29kZWMgZGVjb2RlcgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworI2RlZmluZSBLTVZDX0tFWUZSQU1FIDB4ODAKKyNkZWZpbmUgS01WQ19QQUxFVFRFICAweDQwCisjZGVmaW5lIEtNVkNfTUVUSE9EICAgMHgwRgorI2RlZmluZSBNQVhfUEFMU0laRSAgIDI1NgorCisvKgorICogRGVjb2RlciBjb250ZXh0CisgKi8KK3R5cGVkZWYgc3RydWN0IEttdmNDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisKKyAgICBpbnQgc2V0cGFsOworICAgIGludCBwYWxzaXplOworICAgIHVpbnQzMl90IHBhbFtNQVhfUEFMU0laRV07CisgICAgdWludDhfdCAqY3VyLCAqcHJldjsKKyAgICB1aW50OF90IGZybTBbMzIwICogMjAwXSwgZnJtMVszMjAgKiAyMDBdOworICAgIEdldEJ5dGVDb250ZXh0IGc7Cit9IEttdmNDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBCaXRCdWYgeworICAgIGludCBiaXRzOworICAgIGludCBiaXRidWY7Cit9IEJpdEJ1ZjsKKworI2RlZmluZSBCTEsoZGF0YSwgeCwgeSkgIGRhdGFbYXZfY2xpcCgoeCkgKyAoeSkgKiAzMjAsIDAsIDMyMCAqIDIwMCAtMSldCisKKyNkZWZpbmUga212Y19pbml0X2dldGJpdHMoYmIsIGcpICBiYi5iaXRzID0gNzsgYmIuYml0YnVmID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZyk7CisKKyNkZWZpbmUga212Y19nZXRiaXQoYmIsIGcsIHJlcykge1wKKyAgICByZXMgPSAwOyBcCisgICAgaWYgKGJiLmJpdGJ1ZiAmICgxIDw8IGJiLmJpdHMpKSByZXMgPSAxOyBcCisgICAgYmIuYml0cy0tOyBcCisgICAgaWYoYmIuYml0cyA9PSAtMSkgeyBcCisgICAgICAgIGJiLmJpdGJ1ZiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGcpOyBcCisgICAgICAgIGJiLmJpdHMgPSA3OyBcCisgICAgfSBcCit9CisKK3N0YXRpYyBpbnQga212Y19kZWNvZGVfaW50cmFfOHg4KEttdmNDb250ZXh0ICogY3R4LCBpbnQgdywgaW50IGgpCit7CisgICAgQml0QnVmIGJiOworICAgIGludCByZXMsIHZhbDsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgYngsIGJ5OworICAgIGludCBsMHgsIGwxeCwgbDB5LCBsMXk7CisgICAgaW50IG14LCBteTsKKworICAgIGttdmNfaW5pdF9nZXRiaXRzKGJiLCAmY3R4LT5nKTsKKworICAgIGZvciAoYnkgPSAwOyBieSA8IGg7IGJ5ICs9IDgpCisgICAgICAgIGZvciAoYnggPSAwOyBieCA8IHc7IGJ4ICs9IDgpIHsKKyAgICAgICAgICAgIGlmICghYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+ZykpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGF0YSBvdmVycnVuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGttdmNfZ2V0Yml0KGJiLCAmY3R4LT5nLCByZXMpOworICAgICAgICAgICAgaWYgKCFyZXMpIHsgICAgICAgICAvLyBmaWxsIHdob2xlIDh4OCBibG9jaworICAgICAgICAgICAgICAgIHZhbCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgtPmcpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGJ4ICsgKGkgJiAweDcpLCBieSArIChpID4+IDMpKSA9IHZhbDsKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgLy8gaGFuZGxlIGZvdXIgNHg0IHN1YmJsb2NrcworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbDB4ID0gYnggKyAoaSAmIDEpICogNDsKKyAgICAgICAgICAgICAgICAgICAgbDB5ID0gYnkgKyAoaSAmIDIpICogMjsKKyAgICAgICAgICAgICAgICAgICAga212Y19nZXRiaXQoYmIsICZjdHgtPmcsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrbXZjX2dldGJpdChiYiwgJmN0eC0+ZywgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzKSB7ICAgICAvLyBmaWxsIHdob2xlIDR4NCBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgtPmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwweCArIChqICYgMyksIGwweSArIChqID4+IDIpKSA9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAvLyBjb3B5IGJsb2NrIGZyb20gYWxyZWFkeSBkZWNvZGVkIHBsYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmN0eC0+Zyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXggPSB2YWwgJiAweEY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgPSB2YWwgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGwweC1teCkgKyAzMjAqKGwweS1teSkgPCAwIHx8IChsMHgtbXgpICsgMzIwKihsMHktbXkpID4gMzIwKjE5NyAtIDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgTVZcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPmN1ciwgbDB4ICsgKGogJiAzKSwgbDB5ICsgKGogPj4gMikpID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPmN1ciwgbDB4ICsgKGogJiAzKSAtIG14LCBsMHkgKyAoaiA+PiAyKSAtIG15KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgLy8gZGVzY2VuZCB0byAyeDIgc3ViLXN1Yi1ibG9ja3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMXggPSBsMHggKyAoaiAmIDEpICogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMXkgPSBsMHkgKyAoaiAmIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttdmNfZ2V0Yml0KGJiLCAmY3R4LT5nLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttdmNfZ2V0Yml0KGJiLCAmY3R4LT5nLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcykgeyAgICAgLy8gZmlsbCB3aG9sZSAyeDIgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgtPmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxLKGN0eC0+Y3VyLCBsMXgsIGwxeSkgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCArIDEsIGwxeSkgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCwgbDF5ICsgMSkgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCArIDEsIGwxeSArIDEpID0gdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgLy8gY29weSBibG9jayBmcm9tIGFscmVhZHkgZGVjb2RlZCBwbGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmN0eC0+Zyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteCA9IHZhbCAmIDB4RjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ID0gdmFsID4+IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGwxeC1teCkgKyAzMjAqKGwxeS1teSkgPCAwIHx8IChsMXgtbXgpICsgMzIwKihsMXktbXkpID4gMzIwKjE5OSAtIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBNVlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCwgbDF5KSA9IEJMSyhjdHgtPmN1ciwgbDF4IC0gbXgsIGwxeSAtIG15KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPmN1ciwgbDF4ICsgMSwgbDF5KSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxLKGN0eC0+Y3VyLCBsMXggKyAxIC0gbXgsIGwxeSAtIG15KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPmN1ciwgbDF4LCBsMXkgKyAxKSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxLKGN0eC0+Y3VyLCBsMXggLSBteCwgbDF5ICsgMSAtIG15KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPmN1ciwgbDF4ICsgMSwgbDF5ICsgMSkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPmN1ciwgbDF4ICsgMSAtIG14LCBsMXkgKyAxIC0gbXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgLy8gcmVhZCB2YWx1ZXMgZm9yIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPmN1ciwgbDF4LCBsMXkpID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmN0eC0+Zyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPmN1ciwgbDF4ICsgMSwgbDF5KSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgtPmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCwgbDF5ICsgMSkgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxLKGN0eC0+Y3VyLCBsMXggKyAxLCBsMXkgKyAxKSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgtPmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga212Y19kZWNvZGVfaW50ZXJfOHg4KEttdmNDb250ZXh0ICogY3R4LCBpbnQgdywgaW50IGgpCit7CisgICAgQml0QnVmIGJiOworICAgIGludCByZXMsIHZhbDsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgYngsIGJ5OworICAgIGludCBsMHgsIGwxeCwgbDB5LCBsMXk7CisgICAgaW50IG14LCBteTsKKworICAgIGttdmNfaW5pdF9nZXRiaXRzKGJiLCAmY3R4LT5nKTsKKworICAgIGZvciAoYnkgPSAwOyBieSA8IGg7IGJ5ICs9IDgpCisgICAgICAgIGZvciAoYnggPSAwOyBieCA8IHc7IGJ4ICs9IDgpIHsKKyAgICAgICAgICAgIGttdmNfZ2V0Yml0KGJiLCAmY3R4LT5nLCByZXMpOworICAgICAgICAgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgICAgICAgICBrbXZjX2dldGJpdChiYiwgJmN0eC0+ZywgcmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlcykgeyAgICAgLy8gZmlsbCB3aG9sZSA4eDggYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkRhdGEgb3ZlcnJ1blxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGJ4ICsgKGkgJiAweDcpLCBieSArIChpID4+IDMpKSA9IHZhbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgLy8gY29weSBibG9jayBmcm9tIHByZXZpb3VzIGZyYW1lCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgQkxLKGN0eC0+Y3VyLCBieCArIChpICYgMHg3KSwgYnkgKyAoaSA+PiAzKSkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPnByZXYsIGJ4ICsgKGkgJiAweDcpLCBieSArIChpID4+IDMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgIC8vIGhhbmRsZSBmb3VyIDR4NCBzdWJibG9ja3MKKyAgICAgICAgICAgICAgICBpZiAoIWJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmcpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJEYXRhIG92ZXJydW5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBsMHggPSBieCArIChpICYgMSkgKiA0OworICAgICAgICAgICAgICAgICAgICBsMHkgPSBieSArIChpICYgMikgKiAyOworICAgICAgICAgICAgICAgICAgICBrbXZjX2dldGJpdChiYiwgJmN0eC0+ZywgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGttdmNfZ2V0Yml0KGJiLCAmY3R4LT5nLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMpIHsgICAgIC8vIGZpbGwgd2hvbGUgNHg0IGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmN0eC0+Zyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPmN1ciwgbDB4ICsgKGogJiAzKSwgbDB5ICsgKGogPj4gMikpID0gdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgIC8vIGNvcHkgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteCA9ICh2YWwgJiAweEYpIC0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSA9ICh2YWwgPj4gNCkgLSA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobDB4K214KSArIDMyMCoobDB5K215KSA8IDAgfHwgKGwweCtteCkgKyAzMjAqKGwweStteSkgPiAzMjAqMTk3IC0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBNVlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxLKGN0eC0+Y3VyLCBsMHggKyAoaiAmIDMpLCBsMHkgKyAoaiA+PiAyKSkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxLKGN0eC0+cHJldiwgbDB4ICsgKGogJiAzKSArIG14LCBsMHkgKyAoaiA+PiAyKSArIG15KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgLy8gZGVzY2VuZCB0byAyeDIgc3ViLXN1Yi1ibG9ja3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMXggPSBsMHggKyAoaiAmIDEpICogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMXkgPSBsMHkgKyAoaiAmIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttdmNfZ2V0Yml0KGJiLCAmY3R4LT5nLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttdmNfZ2V0Yml0KGJiLCAmY3R4LT5nLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcykgeyAgICAgLy8gZmlsbCB3aG9sZSAyeDIgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgtPmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxLKGN0eC0+Y3VyLCBsMXgsIGwxeSkgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCArIDEsIGwxeSkgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCwgbDF5ICsgMSkgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCArIDEsIGwxeSArIDEpID0gdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgLy8gY29weSBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmN0eC0+Zyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteCA9ICh2YWwgJiAweEYpIC0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ID0gKHZhbCA+PiA0KSAtIDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGwxeCtteCkgKyAzMjAqKGwxeStteSkgPCAwIHx8IChsMXgrbXgpICsgMzIwKihsMXkrbXkpID4gMzIwKjE5OSAtIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBNVlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCwgbDF5KSA9IEJMSyhjdHgtPnByZXYsIGwxeCArIG14LCBsMXkgKyBteSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCArIDEsIGwxeSkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPnByZXYsIGwxeCArIDEgKyBteCwgbDF5ICsgbXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxLKGN0eC0+Y3VyLCBsMXgsIGwxeSArIDEpID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5wcmV2LCBsMXggKyBteCwgbDF5ICsgMSArIG15KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPmN1ciwgbDF4ICsgMSwgbDF5ICsgMSkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPnByZXYsIGwxeCArIDEgKyBteCwgbDF5ICsgMSArIG15KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgIC8vIHJlYWQgdmFsdWVzIGZvciBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCwgbDF5KSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgtPmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEsoY3R4LT5jdXIsIGwxeCArIDEsIGwxeSkgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxLKGN0eC0+Y3VyLCBsMXgsIGwxeSArIDEpID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmN0eC0+Zyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSyhjdHgtPmN1ciwgbDF4ICsgMSwgbDF5ICsgMSkgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqIGF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBLbXZjQ29udGV4dCAqY29uc3QgY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisgICAgdWludDhfdCAqb3V0LCAqc3JjOworICAgIGludCBpLCByZXQ7CisgICAgaW50IGhlYWRlcjsKKyAgICBpbnQgYmxvY2tzaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKnBhbCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLCBOVUxMKTsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmN0eC0+ZywgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBoZWFkZXIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nKTsKKworICAgIC8qIGJsb2Nrc2l6ZSAxMjcgaXMgcmVhbGx5IHBhbGV0dGUgY2hhbmdlIGV2ZW50ICovCisgICAgaWYgKGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZSgmY3R4LT5nKSA9PSAxMjcpIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmY3R4LT5nLCAzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyNzsgaSsrKSB7CisgICAgICAgICAgICBjdHgtPnBhbFtpICsgKGhlYWRlciAmIDB4ODEpXSA9IDB4RkZVIDw8IDI0IHwgYnl0ZXN0cmVhbTJfZ2V0X2JlMjQoJmN0eC0+Zyk7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZjdHgtPmcsIDEpOworICAgICAgICB9CisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmN0eC0+ZywgLTEyNyAqIDQgLSAzLCBTRUVLX0NVUik7CisgICAgfQorCisgICAgaWYgKGhlYWRlciAmIEtNVkNfS0VZRlJBTUUpIHsKKyAgICAgICAgZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMDsKKyAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgIH0KKworICAgIGlmIChoZWFkZXIgJiBLTVZDX1BBTEVUVEUpIHsKKyAgICAgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgICAgICAvLyBwYWxldHRlIHN0YXJ0cyBmcm9tIGluZGV4IDEgYW5kIGhhcyAxMjcgZW50cmllcworICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IGN0eC0+cGFsc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBjdHgtPnBhbFtpXSA9IDB4RkZVIDw8IDI0IHwgYnl0ZXN0cmVhbTJfZ2V0X2JlMjQoJmN0eC0+Zyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGFsKSB7CisgICAgICAgIGZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKKyAgICAgICAgbWVtY3B5KGN0eC0+cGFsLCBwYWwsIEFWUEFMRVRURV9TSVpFKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5zZXRwYWwpIHsKKyAgICAgICAgY3R4LT5zZXRwYWwgPSAwOworICAgICAgICBmcmFtZS0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisgICAgfQorCisgICAgLyogbWFrZSB0aGUgcGFsZXR0ZSBhdmFpbGFibGUgb24gdGhlIHdheSBvdXQgKi8KKyAgICBtZW1jcHkoZnJhbWUtPmRhdGFbMV0sIGN0eC0+cGFsLCAxMDI0KTsKKworICAgIGJsb2Nrc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgtPmcpOworCisgICAgaWYgKGJsb2Nrc2l6ZSAhPSA4ICYmIGJsb2Nrc2l6ZSAhPSAxMjcpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCbG9jayBzaXplID0gJWlcbiIsIGJsb2Nrc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBtZW1zZXQoY3R4LT5jdXIsIDAsIDMyMCAqIDIwMCk7CisgICAgc3dpdGNoIChoZWFkZXIgJiBLTVZDX01FVEhPRCkgeworICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6IC8vIHVzZWQgaW4gcGFsZXR0ZSBjaGFuZ2VkIGV2ZW50CisgICAgICAgIG1lbWNweShjdHgtPmN1ciwgY3R4LT5wcmV2LCAzMjAgKiAyMDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGttdmNfZGVjb2RlX2ludHJhXzh4OChjdHgsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAga212Y19kZWNvZGVfaW50ZXJfOHg4KGN0eCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCAlaVxuIiwgaGVhZGVyICYgS01WQ19NRVRIT0QpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBvdXQgPSBmcmFtZS0+ZGF0YVswXTsKKyAgICBzcmMgPSBjdHgtPmN1cjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIG1lbWNweShvdXQsIHNyYywgYXZjdHgtPndpZHRoKTsKKyAgICAgICAgc3JjICs9IDMyMDsKKyAgICAgICAgb3V0ICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICAvKiBmbGlwIGJ1ZmZlcnMgKi8KKyAgICBpZiAoY3R4LT5jdXIgPT0gY3R4LT5mcm0wKSB7CisgICAgICAgIGN0eC0+Y3VyID0gY3R4LT5mcm0xOworICAgICAgICBjdHgtPnByZXYgPSBjdHgtPmZybTA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5jdXIgPSBjdHgtPmZybTA7CisgICAgICAgIGN0eC0+cHJldiA9IGN0eC0+ZnJtMTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIC8qIGFsd2F5cyByZXBvcnQgdGhhdCB0aGUgYnVmZmVyIHdhcyBjb21wbGV0ZWx5IGNvbnN1bWVkICovCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCisKKworLyoKKyAqIEluaXQga212YyBkZWNvZGVyCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqIGF2Y3R4KQoreworICAgIEttdmNDb250ZXh0ICpjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICBpZiAoYXZjdHgtPndpZHRoID4gMzIwIHx8IGF2Y3R4LT5oZWlnaHQgPiAyMDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJLTVZDIHN1cHBvcnRzIGZyYW1lcyA8PSAzMjB4MjAwXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBjLT5jdXIgPSBjLT5mcm0wOworICAgIGMtPnByZXYgPSBjLT5mcm0xOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGMtPnBhbFtpXSA9IDB4RkZVIDw8IDI0IHwgaSAqIDB4MTAxMDE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDEyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiRXh0cmFkYXRhIG1pc3NpbmcsIGRlY29kaW5nIG1heSBub3Qgd29yayBwcm9wZXJseS4uLlxuIik7CisgICAgICAgIGMtPnBhbHNpemUgPSAxMjc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+cGFsc2l6ZSA9IEFWX1JMMTYoYXZjdHgtPmV4dHJhZGF0YSArIDEwKTsKKyAgICAgICAgaWYgKGMtPnBhbHNpemUgPj0gKHVuc2lnbmVkKU1BWF9QQUxTSVpFKSB7CisgICAgICAgICAgICBjLT5wYWxzaXplID0gMTI3OworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJLTVZDIHBhbGV0dGUgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9PSAxMDM2KSB7ICAgICAgICAvLyBwYWxldHRlIGluIGV4dHJhZGF0YQorICAgICAgICB1aW50OF90ICpzcmMgPSBhdmN0eC0+ZXh0cmFkYXRhICsgMTI7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgICAgYy0+cGFsW2ldID0gQVZfUkwzMihzcmMpOworICAgICAgICAgICAgc3JjICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgYy0+c2V0cGFsID0gMTsKKyAgICB9CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2ttdmNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAia212YyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkthcmwgTW9ydG9uJ3MgdmlkZW8gY29kZWMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfS01WQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoS212Y0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xhZ2FyaXRoLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9sYWdhcml0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNmQ3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9sYWdhcml0aC5jCkBAIC0wLDAgKzEsNzUyIEBACisvKgorICogTGFnYXJpdGggbG9zc2xlc3MgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IE5hdGhhbiBDYWxkd2VsbCA8c2FpbnRkZXYgKGF0KSBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIExhZ2FyaXRoIGxvc3NsZXNzIGRlY29kZXIKKyAqIEBhdXRob3IgTmF0aGFuIENhbGR3ZWxsCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAiaHVmZnl1dmRzcC5oIgorI2luY2x1ZGUgImxhZ2FyaXRocmFjLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisKK2VudW0gTGFnYXJpdGhGcmFtZVR5cGUgeworICAgIEZSQU1FX1JBVyAgICAgICAgICAgPSAxLCAgICAvKio8IHVuY29tcHJlc3NlZCAqLworICAgIEZSQU1FX1VfUkdCMjQgICAgICAgPSAyLCAgICAvKio8IHVuYWxpZ25lZCBSR0IyNCAqLworICAgIEZSQU1FX0FSSVRIX1lVWTIgICAgPSAzLCAgICAvKio8IGFyaXRobWV0aWMgY29kZWQgWVVZMiAqLworICAgIEZSQU1FX0FSSVRIX1JHQjI0ICAgPSA0LCAgICAvKio8IGFyaXRobWV0aWMgY29kZWQgUkdCMjQgKi8KKyAgICBGUkFNRV9TT0xJRF9HUkFZICAgID0gNSwgICAgLyoqPCBzb2xpZCBncmF5c2NhbGUgY29sb3IgZnJhbWUgKi8KKyAgICBGUkFNRV9TT0xJRF9DT0xPUiAgID0gNiwgICAgLyoqPCBzb2xpZCBub24tZ3JheXNjYWxlIGNvbG9yIGZyYW1lICovCisgICAgRlJBTUVfT0xEX0FSSVRIX1JHQiA9IDcsICAgIC8qKjwgb2Jzb2xldGUgYXJpdGhtZXRpYyBjb2RlZCBSR0IgKG5vIGxvbmdlciBlbmNvZGVkIGJ5IHVwc3RyZWFtIHNpbmNlIHZlcnNpb24gMS4xLjApICovCisgICAgRlJBTUVfQVJJVEhfUkdCQSAgICA9IDgsICAgIC8qKjwgYXJpdGhtZXRpYyBjb2RlZCBSR0JBICovCisgICAgRlJBTUVfU09MSURfUkdCQSAgICA9IDksICAgIC8qKjwgc29saWQgUkdCQSBjb2xvciBmcmFtZSAqLworICAgIEZSQU1FX0FSSVRIX1lWMTIgICAgPSAxMCwgICAvKio8IGFyaXRobWV0aWMgY29kZWQgWVYxMiAqLworICAgIEZSQU1FX1JFRFVDRURfUkVTICAgPSAxMSwgICAvKio8IHJlZHVjZWQgcmVzb2x1dGlvbiBZVjEyIGZyYW1lICovCit9OworCit0eXBlZGVmIHN0cnVjdCBMYWdhcml0aENvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBIdWZmWVVWRFNQQ29udGV4dCBoZHNwOworICAgIGludCB6ZXJvczsgICAgICAgICAgICAgICAgICAvKio8IG51bWJlciBvZiBjb25zZWN1dGl2ZSB6ZXJvIGJ5dGVzIGVuY291bnRlcmVkICovCisgICAgaW50IHplcm9zX3JlbTsgICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIHplcm8gYnl0ZXMgcmVtYWluaW5nIHRvIG91dHB1dCAqLworICAgIHVpbnQ4X3QgKnJnYl9wbGFuZXM7CisgICAgaW50ICAgICAgcmdiX3BsYW5lc19hbGxvY2F0ZWQ7CisgICAgaW50IHJnYl9zdHJpZGU7Cit9IExhZ2FyaXRoQ29udGV4dDsKKworLyoqCisgKiBDb21wdXRlIHRoZSA1MmJpdCBtYW50aXNzYSBvZiAxLyhkb3VibGUpZGVub20uCisgKiBUaGlzIGNyYXp5IGZvcm1hdCB1c2VzIGZsb2F0cyBpbiBhbiBlbnRyb3B5IGNvZGVyIGFuZCB3ZSBoYXZlIHRvIG1hdGNoIHg4NgorICogcm91bmRpbmcgZXhhY3RseSwgdGh1cyBvcmRpbmFyeSBmbG9hdHMgYXJlbid0IHBvcnRhYmxlIGVub3VnaC4KKyAqIEBwYXJhbSBkZW5vbSBkZW5vbWluYXRvcgorICogQHJldHVybiA1MmJpdCBtYW50aXNzYQorICogQHNlZSBzb2Z0ZmxvYXRfbXVsCisgKi8KK3N0YXRpYyB1aW50NjRfdCBzb2Z0ZmxvYXRfcmVjaXByb2NhbCh1aW50MzJfdCBkZW5vbSkKK3sKKyAgICBpbnQgc2hpZnQgPSBhdl9sb2cyKGRlbm9tIC0gMSkgKyAxOworICAgIHVpbnQ2NF90IHJldCA9ICgxVUxMIDw8IDUyKSAvIGRlbm9tOworICAgIHVpbnQ2NF90IGVyciA9ICgxVUxMIDw8IDUyKSAtIHJldCAqIGRlbm9tOworICAgIHJldCA8PD0gc2hpZnQ7CisgICAgZXJyIDw8PSBzaGlmdDsKKyAgICBlcnIgKz0gIGRlbm9tIC8gMjsKKyAgICByZXR1cm4gcmV0ICsgZXJyIC8gZGVub207Cit9CisKKy8qKgorICogKHVpbnQzMl90KSh4KmYpLCB3aGVyZSBmIGhhcyB0aGUgZ2l2ZW4gbWFudGlzc2EsIGFuZCBleHBvbmVudCAwCisgKiBVc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggc29mdGZsb2F0X3JlY2lwcm9jYWwgY29tcHV0ZXMgeC8oZG91YmxlKWRlbm9tLgorICogQHBhcmFtIHggMzJiaXQgaW50ZWdlciBmYWN0b3IKKyAqIEBwYXJhbSBtYW50aXNzYSBtYW50aXNzYSBvZiBmIHdpdGggZXhwb25lbnQgMAorICogQHJldHVybiAzMmJpdCBpbnRlZ2VyIHZhbHVlICh4KmYpCisgKiBAc2VlIHNvZnRmbG9hdF9yZWNpcHJvY2FsCisgKi8KK3N0YXRpYyB1aW50MzJfdCBzb2Z0ZmxvYXRfbXVsKHVpbnQzMl90IHgsIHVpbnQ2NF90IG1hbnRpc3NhKQoreworICAgIHVpbnQ2NF90IGwgPSB4ICogKG1hbnRpc3NhICYgMHhmZmZmZmZmZik7CisgICAgdWludDY0X3QgaCA9IHggKiAobWFudGlzc2EgPj4gMzIpOworICAgIGggKz0gbCA+PiAzMjsKKyAgICBsICY9IDB4ZmZmZmZmZmY7CisgICAgbCArPSAxIDw8IGF2X2xvZzIoaCA+PiAyMSk7CisgICAgaCArPSBsID4+IDMyOworICAgIHJldHVybiBoID4+IDIwOworfQorCitzdGF0aWMgdWludDhfdCBsYWdfY2FsY196ZXJvX3J1bihpbnQ4X3QgeCkKK3sKKyAgICByZXR1cm4gKHggPDwgMSkgXiAoeCA+PiA3KTsKK30KKworc3RhdGljIGludCBsYWdfZGVjb2RlX3Byb2IoR2V0Qml0Q29udGV4dCAqZ2IsIHVpbnQzMl90ICp2YWx1ZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBzZXJpZXNbXSA9IHsgMSwgMiwgMywgNSwgOCwgMTMsIDIxIH07CisgICAgaW50IGk7CisgICAgaW50IGJpdCAgICAgPSAwOworICAgIGludCBiaXRzICAgID0gMDsKKyAgICBpbnQgcHJldmJpdCA9IDA7CisgICAgdW5zaWduZWQgdmFsOworCisgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworICAgICAgICBpZiAocHJldmJpdCAmJiBiaXQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcHJldmJpdCA9IGJpdDsKKyAgICAgICAgYml0ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKGJpdCAmJiAhcHJldmJpdCkKKyAgICAgICAgICAgIGJpdHMgKz0gc2VyaWVzW2ldOworICAgIH0KKyAgICBiaXRzLS07CisgICAgaWYgKGJpdHMgPCAwIHx8IGJpdHMgPiAzMSkgeworICAgICAgICAqdmFsdWUgPSAwOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmIChiaXRzID09IDApIHsKKyAgICAgICAgKnZhbHVlID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmFsICA9IGdldF9iaXRzX2xvbmcoZ2IsIGJpdHMpOworICAgIHZhbCB8PSAxVSA8PCBiaXRzOworCisgICAgKnZhbHVlID0gdmFsIC0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhZ19yZWFkX3Byb2JfaGVhZGVyKGxhZ19yYWMgKnJhYywgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IGksIGosIHNjYWxlX2ZhY3RvcjsKKyAgICB1bnNpZ25lZCBwcm9iLCBjdW11bGF0aXZlX3RhcmdldDsKKyAgICB1bnNpZ25lZCBjdW11bF9wcm9iID0gMDsKKyAgICB1bnNpZ25lZCBzY2FsZWRfY3VtdWxfcHJvYiA9IDA7CisKKyAgICByYWMtPnByb2JbMF0gPSAwOworICAgIHJhYy0+cHJvYlsyNTddID0gVUlOVF9NQVg7CisgICAgLyogUmVhZCBwcm9iYWJpbGl0aWVzIGZyb20gYml0c3RyZWFtICovCisgICAgZm9yIChpID0gMTsgaSA8IDI1NzsgaSsrKSB7CisgICAgICAgIGlmIChsYWdfZGVjb2RlX3Byb2IoZ2IsICZyYWMtPnByb2JbaV0pIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHJhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcHJvYmFiaWxpdHkgZW5jb3VudGVyZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHVpbnQ2NF90KWN1bXVsX3Byb2IgKyByYWMtPnByb2JbaV0gPiBVSU5UX01BWCkgeworICAgICAgICAgICAgYXZfbG9nKHJhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludGVnZXIgb3ZlcmZsb3cgZW5jb3VudGVyZWQgaW4gY3VtdWxhdGl2ZSBwcm9iYWJpbGl0eSBjYWxjdWxhdGlvbi5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGN1bXVsX3Byb2IgKz0gcmFjLT5wcm9iW2ldOworICAgICAgICBpZiAoIXJhYy0+cHJvYltpXSkgeworICAgICAgICAgICAgaWYgKGxhZ19kZWNvZGVfcHJvYihnYiwgJnByb2IpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHJhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcHJvYmFiaWxpdHkgcnVuIGVuY291bnRlcmVkLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByb2IgPiAyNTYgLSBpKQorICAgICAgICAgICAgICAgIHByb2IgPSAyNTYgLSBpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHByb2I7IGorKykKKyAgICAgICAgICAgICAgICByYWMtPnByb2JbKytpXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWN1bXVsX3Byb2IpIHsKKyAgICAgICAgYXZfbG9nKHJhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkFsbCBwcm9iYWJpbGl0aWVzIGFyZSAwIVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBTY2FsZSBwcm9iYWJpbGl0aWVzIHNvIGN1bXVsYXRpdmUgcHJvYmFiaWxpdHkgaXMgYW4gZXZlbiBwb3dlciBvZiAyLiAqLworICAgIHNjYWxlX2ZhY3RvciA9IGF2X2xvZzIoY3VtdWxfcHJvYik7CisKKyAgICBpZiAoY3VtdWxfcHJvYiAmIChjdW11bF9wcm9iIC0gMSkpIHsKKyAgICAgICAgdWludDY0X3QgbXVsID0gc29mdGZsb2F0X3JlY2lwcm9jYWwoY3VtdWxfcHJvYik7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gMTI4OyBpKyspIHsKKyAgICAgICAgICAgIHJhYy0+cHJvYltpXSA9IHNvZnRmbG9hdF9tdWwocmFjLT5wcm9iW2ldLCBtdWwpOworICAgICAgICAgICAgc2NhbGVkX2N1bXVsX3Byb2IgKz0gcmFjLT5wcm9iW2ldOworICAgICAgICB9CisgICAgICAgIGlmIChzY2FsZWRfY3VtdWxfcHJvYiA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocmFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2NhbGVkIHByb2JhYmlsaXRpZXMgaW52YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgaSA8IDI1NzsgaSsrKSB7CisgICAgICAgICAgICByYWMtPnByb2JbaV0gPSBzb2Z0ZmxvYXRfbXVsKHJhYy0+cHJvYltpXSwgbXVsKTsKKyAgICAgICAgICAgIHNjYWxlZF9jdW11bF9wcm9iICs9IHJhYy0+cHJvYltpXTsKKyAgICAgICAgfQorCisgICAgICAgIHNjYWxlX2ZhY3RvcisrOworICAgICAgICBjdW11bGF0aXZlX3RhcmdldCA9IDEgPDwgc2NhbGVfZmFjdG9yOworCisgICAgICAgIGlmIChzY2FsZWRfY3VtdWxfcHJvYiA+IGN1bXVsYXRpdmVfdGFyZ2V0KSB7CisgICAgICAgICAgICBhdl9sb2cocmFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJTY2FsZWQgcHJvYmFiaWxpdGllcyBhcmUgbGFyZ2VyIHRoYW4gdGFyZ2V0IVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzY2FsZWRfY3VtdWxfcHJvYiA9IGN1bXVsYXRpdmVfdGFyZ2V0IC0gc2NhbGVkX2N1bXVsX3Byb2I7CisKKyAgICAgICAgZm9yIChpID0gMTsgc2NhbGVkX2N1bXVsX3Byb2I7IGkgPSAoaSAmIDB4N2YpICsgMSkgeworICAgICAgICAgICAgaWYgKHJhYy0+cHJvYltpXSkgeworICAgICAgICAgICAgICAgIHJhYy0+cHJvYltpXSsrOworICAgICAgICAgICAgICAgIHNjYWxlZF9jdW11bF9wcm9iLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDb21tZW50IGZyb20gcmVmZXJlbmNlIHNvdXJjZToKKyAgICAgICAgICAgICAqIGlmIChiICYgMHg4MCA9PSAwKSB7ICAgICAvLyBvcmRlciBvZiBvcGVyYXRpb25zIGlzICd3cm9uZyc7IGl0IGhhcyBiZWVuIGxlZnQgdGhpcyB3YXkKKyAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgY29tcHJlc3Npb24gY2hhbmdlIGlzIG5lZ2xpZ2libGUgYW5kIGZpeGluZyBpdAorICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJyZWFrcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgICogICAgICBiID0tIChzaWduZWQgaW50KWI7CisgICAgICAgICAgICAgKiAgICAgIGIgJj0gMHhGRjsKKyAgICAgICAgICAgICAqIH0gZWxzZSB7CisgICAgICAgICAgICAgKiAgICAgIGIrKzsKKyAgICAgICAgICAgICAqICAgICAgYiAmPSAweDdmOworICAgICAgICAgICAgICogfQorICAgICAgICAgICAgICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICByYWMtPnNjYWxlID0gc2NhbGVfZmFjdG9yOworCisgICAgLyogRmlsbCBwcm9iYWJpbGl0eSBhcnJheSB3aXRoIGN1bXVsYXRpdmUgcHJvYmFiaWxpdHkgZm9yIGVhY2ggc3ltYm9sLiAqLworICAgIGZvciAoaSA9IDE7IGkgPCAyNTc7IGkrKykKKyAgICAgICAgcmFjLT5wcm9iW2ldICs9IHJhYy0+cHJvYltpIC0gMV07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWRkX2xhZ19tZWRpYW5fcHJlZGljdGlvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRpZmYsIGludCB3LCBpbnQgKmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGVmdF90b3ApCit7CisgICAgLyogVGhpcyBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIGFkZF9oZnl1X21lZGlhbl9wcmVkIGluIGh1ZmZ5dXZkc3AuaC4KKyAgICAgKiBIb3dldmVyIHRoZSAmMHhGRiBvbiB0aGUgZ3JhZGllbnQgcHJlZGljdG9yIHllYWxkcyBpbmNvcnJlY3Qgb3V0cHV0CisgICAgICogZm9yIGxhZ2FyaXRoLgorICAgICAqLworICAgIGludCBpOworICAgIHVpbnQ4X3QgbCwgbHQ7CisKKyAgICBsICA9ICpsZWZ0OworICAgIGx0ID0gKmxlZnRfdG9wOworCisgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICBsID0gbWlkX3ByZWQobCwgc3JjMVtpXSwgbCArIHNyYzFbaV0gLSBsdCkgKyBkaWZmW2ldOworICAgICAgICBsdCA9IHNyYzFbaV07CisgICAgICAgIGRzdFtpXSA9IGw7CisgICAgfQorCisgICAgKmxlZnQgICAgID0gbDsKKyAgICAqbGVmdF90b3AgPSBsdDsKK30KKworc3RhdGljIHZvaWQgbGFnX3ByZWRfbGluZShMYWdhcml0aENvbnRleHQgKmwsIHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgc3RyaWRlLCBpbnQgbGluZSkKK3sKKyAgICBpbnQgTCwgVEw7CisKKyAgICBpZiAoIWxpbmUpIHsKKyAgICAgICAgLyogTGVmdCBwcmVkaWN0aW9uIG9ubHkgZm9yIGZpcnN0IGxpbmUgKi8KKyAgICAgICAgTCA9IGwtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKGJ1ZiwgYnVmLCB3aWR0aCwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTGVmdCBwaXhlbCBpcyBhY3R1YWxseSBwcmV2X3Jvd1t3aWR0aF0gKi8KKyAgICAgICAgTCA9IGJ1Zlt3aWR0aCAtIHN0cmlkZSAtIDFdOworCisgICAgICAgIGlmIChsaW5lID09IDEpIHsKKyAgICAgICAgICAgIC8qIFNlY29uZCBsaW5lLCBsZWZ0IHByZWRpY3QgZmlyc3QgcGl4ZWwsIHRoZSByZXN0IG9mIHRoZSBsaW5lIGlzIG1lZGlhbiBwcmVkaWN0ZWQKKyAgICAgICAgICAgICAqIE5PVEU6IEluIHRoZSBjYXNlIG9mIFJHQiB0aGlzIHBpeGVsIGlzIHRvcCBwcmVkaWN0ZWQgKi8KKyAgICAgICAgICAgIFRMID0gbC0+YXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQID8gYnVmWy1zdHJpZGVdIDogTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRvcCBsZWZ0IGlzIDIgcm93cyBiYWNrLCBsYXN0IHBpeGVsICovCisgICAgICAgICAgICBUTCA9IGJ1Zlt3aWR0aCAtICgyICogc3RyaWRlKSAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgYWRkX2xhZ19tZWRpYW5fcHJlZGljdGlvbihidWYsIGJ1ZiAtIHN0cmlkZSwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAmTCwgJlRMKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGxhZ19wcmVkX2xpbmVfeXV5MihMYWdhcml0aENvbnRleHQgKmwsIHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBzdHJpZGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19sdW1hKQoreworICAgIGludCBMLCBUTDsKKworICAgIGlmICghbGluZSkgeworICAgICAgICBMPSBidWZbMF07CisgICAgICAgIGlmIChpc19sdW1hKQorICAgICAgICAgICAgYnVmWzBdID0gMDsKKyAgICAgICAgbC0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQoYnVmLCBidWYsIHdpZHRoLCAwKTsKKyAgICAgICAgaWYgKGlzX2x1bWEpCisgICAgICAgICAgICBidWZbMF0gPSBMOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChsaW5lID09IDEpIHsKKyAgICAgICAgY29uc3QgaW50IEhFQUQgPSBpc19sdW1hID8gNCA6IDI7CisgICAgICAgIGludCBpOworCisgICAgICAgIEwgID0gYnVmW3dpZHRoIC0gc3RyaWRlIC0gMV07CisgICAgICAgIFRMID0gYnVmW0hFQUQgIC0gc3RyaWRlIC0gMV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBIRUFEOyBpKyspIHsKKyAgICAgICAgICAgIEwgKz0gYnVmW2ldOworICAgICAgICAgICAgYnVmW2ldID0gTDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgIEwgICAgICA9IG1pZF9wcmVkKEwgJiAweEZGLCBidWZbaSAtIHN0cmlkZV0sIChMICsgYnVmW2kgLSBzdHJpZGVdIC0gVEwpICYgMHhGRikgKyBidWZbaV07CisgICAgICAgICAgICBUTCAgICAgPSBidWZbaSAtIHN0cmlkZV07CisgICAgICAgICAgICBidWZbaV0gPSBMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgVEwgPSBidWZbd2lkdGggLSAoMiAqIHN0cmlkZSkgLSAxXTsKKyAgICAgICAgTCAgPSBidWZbd2lkdGggLSBzdHJpZGUgLSAxXTsKKyAgICAgICAgbC0+aGRzcC5hZGRfaGZ5dV9tZWRpYW5fcHJlZChidWYsIGJ1ZiAtIHN0cmlkZSwgYnVmLCB3aWR0aCwgJkwsICZUTCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGxhZ19kZWNvZGVfbGluZShMYWdhcml0aENvbnRleHQgKmwsIGxhZ19yYWMgKnJhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHdpZHRoLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVzY19jb3VudCkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIWVzY19jb3VudCkKKyAgICAgICAgZXNjX2NvdW50ID0gLTE7CisKKyAgICAvKiBPdXRwdXQgYW55IHplcm9zIHJlbWFpbmluZyBmcm9tIHRoZSBwcmV2aW91cyBydW4gKi8KK2hhbmRsZV96ZXJvczoKKyAgICBpZiAobC0+emVyb3NfcmVtKSB7CisgICAgICAgIGludCBjb3VudCA9IEZGTUlOKGwtPnplcm9zX3JlbSwgd2lkdGggLSBpKTsKKyAgICAgICAgbWVtc2V0KGRzdCArIGksIDAsIGNvdW50KTsKKyAgICAgICAgaSArPSBjb3VudDsKKyAgICAgICAgbC0+emVyb3NfcmVtIC09IGNvdW50OworICAgIH0KKworICAgIHdoaWxlIChpIDwgd2lkdGgpIHsKKyAgICAgICAgZHN0W2ldID0gbGFnX2dldF9yYWMocmFjKTsKKyAgICAgICAgcmV0Kys7CisKKyAgICAgICAgaWYgKGRzdFtpXSkKKyAgICAgICAgICAgIGwtPnplcm9zID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbC0+emVyb3MrKzsKKworICAgICAgICBpKys7CisgICAgICAgIGlmIChsLT56ZXJvcyA9PSBlc2NfY291bnQpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGxhZ19nZXRfcmFjKHJhYyk7CisgICAgICAgICAgICByZXQrKzsKKworICAgICAgICAgICAgbC0+emVyb3MgPSAwOworCisgICAgICAgICAgICBsLT56ZXJvc19yZW0gPSBsYWdfY2FsY196ZXJvX3J1bihpbmRleCk7CisgICAgICAgICAgICBnb3RvIGhhbmRsZV96ZXJvczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxhZ19kZWNvZGVfemVyb19ydW5fbGluZShMYWdhcml0aENvbnRleHQgKmwsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqc3JjX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGVzY19jb3VudCkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGNvdW50OworICAgIHVpbnQ4X3QgemVyb19ydW4gPSAwOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19zdGFydCA9IHNyYzsKKyAgICB1aW50OF90IG1hc2sxID0gLShlc2NfY291bnQgPCAyKTsKKyAgICB1aW50OF90IG1hc2syID0gLShlc2NfY291bnQgPCAzKTsKKyAgICB1aW50OF90ICplbmQgPSBkc3QgKyAod2lkdGggLSAyKTsKKworICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShsLT5hdmN0eCwgInplcm9fcnVuX2xpbmUiKTsKKworICAgIG1lbXNldChkc3QsIDAsIHdpZHRoKTsKKworb3V0cHV0X3plcm9zOgorICAgIGlmIChsLT56ZXJvc19yZW0pIHsKKyAgICAgICAgY291bnQgPSBGRk1JTihsLT56ZXJvc19yZW0sIHdpZHRoIC0gaSk7CisgICAgICAgIGlmIChlbmQgLSBkc3QgPCBjb3VudCkgeworICAgICAgICAgICAgYXZfbG9nKGwtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSB6ZXJvcyByZW1haW5pbmcuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KGRzdCwgMCwgY291bnQpOworICAgICAgICBsLT56ZXJvc19yZW0gLT0gY291bnQ7CisgICAgICAgIGRzdCArPSBjb3VudDsKKyAgICB9CisKKyAgICB3aGlsZSAoZHN0IDwgZW5kKSB7CisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAoIXplcm9fcnVuICYmIGRzdCArIGkgPCBlbmQpIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGlmIChpKzIgPj0gc3JjX2VuZCAtIHNyYykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHplcm9fcnVuID0KKyAgICAgICAgICAgICAgICAhKHNyY1tpXSB8IChzcmNbaSArIDFdICYgbWFzazEpIHwgKHNyY1tpICsgMl0gJiBtYXNrMikpOworICAgICAgICB9CisgICAgICAgIGlmICh6ZXJvX3J1bikgeworICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICAgICAgaSArPSBlc2NfY291bnQ7CisgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGkpOworICAgICAgICAgICAgZHN0ICs9IGk7CisgICAgICAgICAgICBsLT56ZXJvc19yZW0gPSBsYWdfY2FsY196ZXJvX3J1bihzcmNbaV0pOworCisgICAgICAgICAgICBzcmMgKz0gaSArIDE7CisgICAgICAgICAgICBnb3RvIG91dHB1dF96ZXJvczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgaSk7CisgICAgICAgICAgICBzcmMgKz0gaTsKKyAgICAgICAgICAgIGRzdCArPSBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAgc3JjIC0gc3JjX3N0YXJ0OworfQorCisKKworc3RhdGljIGludCBsYWdfZGVjb2RlX2FyaXRoX3BsYW5lKExhZ2FyaXRoQ29udGV4dCAqbCwgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IHJlYWQgPSAwOworICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAxOworICAgIGludCBlc2NfY291bnQ7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBsYWdfcmFjIHJhYzsKKyAgICBjb25zdCB1aW50OF90ICpzcmNfZW5kID0gc3JjICsgc3JjX3NpemU7CisgICAgaW50IHJldDsKKworICAgIHJhYy5hdmN0eCA9IGwtPmF2Y3R4OworICAgIGwtPnplcm9zID0gMDsKKworICAgIGlmKHNyY19zaXplIDwgMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBlc2NfY291bnQgPSBzcmNbMF07CisgICAgaWYgKGVzY19jb3VudCA8IDQpIHsKKyAgICAgICAgbGVuZ3RoID0gd2lkdGggKiBoZWlnaHQ7CisgICAgICAgIGlmKHNyY19zaXplIDwgNSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAoZXNjX2NvdW50ICYmIEFWX1JMMzIoc3JjICsgMSkgPCBsZW5ndGgpIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IEFWX1JMMzIoc3JjICsgMSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBzcmMgKyBvZmZzZXQsIHNyY19zaXplIC0gb2Zmc2V0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAobGFnX3JlYWRfcHJvYl9oZWFkZXIoJnJhYywgJmdiKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgZmZfbGFnX3JhY19pbml0KCZyYWMsICZnYiwgbGVuZ3RoIC0gc3RyaWRlKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspCisgICAgICAgICAgICByZWFkICs9IGxhZ19kZWNvZGVfbGluZShsLCAmcmFjLCBkc3QgKyAoaSAqIHN0cmlkZSksIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBlc2NfY291bnQpOworCisgICAgICAgIGlmIChyZWFkID4gbGVuZ3RoKQorICAgICAgICAgICAgYXZfbG9nKGwtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiT3V0cHV0IG1vcmUgYnl0ZXMgdGhhbiBsZW5ndGggKCVkIG9mICUiUFJJdTMyIilcbiIsIHJlYWQsCisgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKyAgICB9IGVsc2UgaWYgKGVzY19jb3VudCA8IDgpIHsKKyAgICAgICAgZXNjX2NvdW50IC09IDQ7CisgICAgICAgIHNyYyArKzsKKyAgICAgICAgc3JjX3NpemUgLS07CisgICAgICAgIGlmIChlc2NfY291bnQgPiAwKSB7CisgICAgICAgICAgICAvKiBaZXJvIHJ1biBjb2Rpbmcgb25seSwgbm8gcmFuZ2UgY29kaW5nLiAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHJlcyA9IGxhZ19kZWNvZGVfemVyb19ydW5fbGluZShsLCBkc3QgKyAoaSAqIHN0cmlkZSksIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19lbmQsIHdpZHRoLCBlc2NfY291bnQpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIHNyYyArPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc3JjX3NpemUgPCB3aWR0aCAqIGhlaWdodCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgLy8gYnVmZmVyIG5vdCBiaWcgZW5vdWdoCisgICAgICAgICAgICAvKiBQbGFuZSBpcyBzdG9yZWQgdW5jb21wcmVzc2VkICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0ICsgKGkgKiBzdHJpZGUpLCBzcmMsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBzcmMgKz0gd2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVzY19jb3VudCA9PSAweGZmKSB7CisgICAgICAgIC8qIFBsYW5lIGlzIGEgc29saWQgcnVuIG9mIGdpdmVuIHZhbHVlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykKKyAgICAgICAgICAgIG1lbXNldChkc3QgKyBpICogc3RyaWRlLCBzcmNbMV0sIHdpZHRoKTsKKyAgICAgICAgLyogRG8gbm90IGFwcGx5IHByZWRpY3Rpb24uCisgICAgICAgICAgIE5vdGU6IG1lbXNldCB0byAwIGFib3ZlLCBzZXR0aW5nIGZpcnN0IHZhbHVlIHRvIHNyY1sxXQorICAgICAgICAgICBhbmQgYXBwbHlpbmcgcHJlZGljdGlvbiBnaXZlcyB0aGUgc2FtZSByZXN1bHQuICovCisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhsLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkludmFsaWQgemVybyBydW4gZXNjYXBlIGNvZGUhICglI3gpXG4iLCBlc2NfY291bnQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGwtPmF2Y3R4LT5waXhfZm10ICE9IEFWX1BJWF9GTVRfWVVWNDIyUCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIGxhZ19wcmVkX2xpbmUobCwgZHN0LCB3aWR0aCwgc3RyaWRlLCBpKTsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIGxhZ19wcmVkX2xpbmVfeXV5MihsLCBkc3QsIHdpZHRoLCBzdHJpZGUsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPT0gbC0+YXZjdHgtPndpZHRoKTsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgYSBmcmFtZS4KKyAqIEBwYXJhbSBhdmN0eCBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW0gZGF0YSBvdXRwdXQgQVZGcmFtZQorICogQHBhcmFtIGRhdGFfc2l6ZSBzaXplIG9mIG91dHB1dCBkYXRhIG9yIDAgaWYgbm8gcGljdHVyZSBpcyByZXR1cm5lZAorICogQHBhcmFtIGF2cGt0IGlucHV0IHBhY2tldAorICogQHJldHVybiBudW1iZXIgb2YgY29uc3VtZWQgYnl0ZXMgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBpZiBkZWNvZGUgZmFpbHMKKyAqLworc3RhdGljIGludCBsYWdfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIHVuc2lnbmVkIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIExhZ2FyaXRoQ29udGV4dCAqbCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVGhyZWFkRnJhbWUgZnJhbWUgPSB7IC5mID0gZGF0YSB9OworICAgIEFWRnJhbWUgKmNvbnN0IHAgID0gZGF0YTsKKyAgICB1aW50OF90IGZyYW1ldHlwZSA9IDA7CisgICAgdWludDMyX3Qgb2Zmc2V0X2d1ID0gMCwgb2Zmc2V0X2J2ID0gMCwgb2Zmc2V0X3J5ID0gOTsKKyAgICB1aW50MzJfdCBvZmZzWzRdOworICAgIHVpbnQ4X3QgKnNyY3NbNF0sICpkc3Q7CisgICAgaW50IGksIGosIHBsYW5lcyA9IDM7CisgICAgaW50IHJldDsKKworICAgIHAtPmtleV9mcmFtZSA9IDE7CisKKyAgICBmcmFtZXR5cGUgPSBidWZbMF07CisKKyAgICBvZmZzZXRfZ3UgPSBBVl9STDMyKGJ1ZiArIDEpOworICAgIG9mZnNldF9idiA9IEFWX1JMMzIoYnVmICsgNSk7CisKKyAgICBzd2l0Y2ggKGZyYW1ldHlwZSkgeworICAgIGNhc2UgRlJBTUVfU09MSURfUkdCQToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjMyOworICAgIGNhc2UgRlJBTUVfU09MSURfR1JBWToKKyAgICAgICAgaWYgKGZyYW1ldHlwZSA9PSBGUkFNRV9TT0xJRF9HUkFZKQorICAgICAgICAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMjQpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF8wUkdCMzI7CisgICAgICAgICAgICAgICAgcGxhbmVzID0gNDsKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmZnJhbWUsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGRzdCA9IHAtPmRhdGFbMF07CisgICAgICAgIGlmIChmcmFtZXR5cGUgPT0gRlJBTUVfU09MSURfUkdCQSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPmhlaWdodDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPndpZHRoOyBpKyspCisgICAgICAgICAgICAgICAgQVZfV04zMihkc3QgKyBpICogNCwgb2Zmc2V0X2d1KTsKKyAgICAgICAgICAgIGRzdCArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT5oZWlnaHQ7IGorKykgeworICAgICAgICAgICAgICAgIG1lbXNldChkc3QsIGJ1ZlsxXSwgYXZjdHgtPndpZHRoICogcGxhbmVzKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gcC0+bGluZXNpemVbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGUkFNRV9TT0xJRF9DT0xPUjoKKyAgICAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMjQpIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IyNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IzMjsKKyAgICAgICAgICAgIG9mZnNldF9ndSB8PSAweEZGVSA8PCAyNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZmcmFtZSwwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBkc3QgPSBwLT5kYXRhWzBdOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPmhlaWdodDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPndpZHRoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMjQpIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfV0IyNChkc3QgKyBpICogMywgb2Zmc2V0X2d1KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBVl9XTjMyKGRzdCArIGkgKiA0LCBvZmZzZXRfZ3UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZSQU1FX0FSSVRIX1JHQkE6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IzMjsKKyAgICAgICAgcGxhbmVzID0gNDsKKyAgICAgICAgb2Zmc2V0X3J5ICs9IDQ7CisgICAgICAgIG9mZnNbM10gPSBBVl9STDMyKGJ1ZiArIDkpOworICAgIGNhc2UgRlJBTUVfQVJJVEhfUkdCMjQ6CisgICAgY2FzZSBGUkFNRV9VX1JHQjI0OgorICAgICAgICBpZiAoZnJhbWV0eXBlID09IEZSQU1FX0FSSVRIX1JHQjI0IHx8IGZyYW1ldHlwZSA9PSBGUkFNRV9VX1JHQjI0KQorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjI0OworCisgICAgICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgb2Zmc1swXSA9IG9mZnNldF9idjsKKyAgICAgICAgb2Zmc1sxXSA9IG9mZnNldF9ndTsKKyAgICAgICAgb2Zmc1syXSA9IG9mZnNldF9yeTsKKworICAgICAgICBsLT5yZ2Jfc3RyaWRlID0gRkZBTElHTihhdmN0eC0+d2lkdGgsIDE2KTsKKyAgICAgICAgYXZfZmFzdF9tYWxsb2MoJmwtPnJnYl9wbGFuZXMsICZsLT5yZ2JfcGxhbmVzX2FsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgbC0+cmdiX3N0cmlkZSAqIGF2Y3R4LT5oZWlnaHQgKiBwbGFuZXMgKyAxKTsKKyAgICAgICAgaWYgKCFsLT5yZ2JfcGxhbmVzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImNhbm5vdCBhbGxvY2F0ZSB0ZW1wb3JhcnkgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lczsgaSsrKQorICAgICAgICAgICAgc3Jjc1tpXSA9IGwtPnJnYl9wbGFuZXMgKyAoaSArIDEpICogbC0+cmdiX3N0cmlkZSAqIGF2Y3R4LT5oZWlnaHQgLSBsLT5yZ2Jfc3RyaWRlOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspCisgICAgICAgICAgICBpZiAoYnVmX3NpemUgPD0gb2Zmc1tpXSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZnJhbWUgb2Zmc2V0c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lczsgaSsrKQorICAgICAgICAgICAgbGFnX2RlY29kZV9hcml0aF9wbGFuZShsLCBzcmNzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1sLT5yZ2Jfc3RyaWRlLCBidWYgKyBvZmZzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSAtIG9mZnNbaV0pOworICAgICAgICBkc3QgPSBwLT5kYXRhWzBdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspCisgICAgICAgICAgICBzcmNzW2ldID0gbC0+cmdiX3BsYW5lcyArIGkgKiBsLT5yZ2Jfc3RyaWRlICogYXZjdHgtPmhlaWdodDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT5oZWlnaHQ7IGorKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT53aWR0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCByLCBnLCBiLCBhOworICAgICAgICAgICAgICAgIHIgPSBzcmNzWzBdW2ldOworICAgICAgICAgICAgICAgIGcgPSBzcmNzWzFdW2ldOworICAgICAgICAgICAgICAgIGIgPSBzcmNzWzJdW2ldOworICAgICAgICAgICAgICAgIHIgKz0gZzsKKyAgICAgICAgICAgICAgICBiICs9IGc7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1ldHlwZSA9PSBGUkFNRV9BUklUSF9SR0JBKSB7CisgICAgICAgICAgICAgICAgICAgIGEgPSBzcmNzWzNdW2ldOworICAgICAgICAgICAgICAgICAgICBBVl9XTjMyKGRzdCArIGkgKiA0LCBNS0JFVEFHKGEsIHIsIGcsIGIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkc3RbaSAqIDMgKyAwXSA9IHI7CisgICAgICAgICAgICAgICAgICAgIGRzdFtpICogMyArIDFdID0gZzsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2kgKiAzICsgMl0gPSBiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwbGFuZXM7IGkrKykKKyAgICAgICAgICAgICAgICBzcmNzW2ldICs9IGwtPnJnYl9zdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGUkFNRV9BUklUSF9ZVVkyOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKKworICAgICAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmZnJhbWUsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmIChvZmZzZXRfcnkgPj0gYnVmX3NpemUgfHwKKyAgICAgICAgICAgIG9mZnNldF9ndSA+PSBidWZfc2l6ZSB8fAorICAgICAgICAgICAgb2Zmc2V0X2J2ID49IGJ1Zl9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmcmFtZSBvZmZzZXRzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgbGFnX2RlY29kZV9hcml0aF9wbGFuZShsLCBwLT5kYXRhWzBdLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+bGluZXNpemVbMF0sIGJ1ZiArIG9mZnNldF9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSAtIG9mZnNldF9yeSk7CisgICAgICAgIGxhZ19kZWNvZGVfYXJpdGhfcGxhbmUobCwgcC0+ZGF0YVsxXSwgKGF2Y3R4LT53aWR0aCArIDEpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0LCBwLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgKyBvZmZzZXRfZ3UsIGJ1Zl9zaXplIC0gb2Zmc2V0X2d1KTsKKyAgICAgICAgbGFnX2RlY29kZV9hcml0aF9wbGFuZShsLCBwLT5kYXRhWzJdLCAoYXZjdHgtPndpZHRoICsgMSkgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQsIHAtPmxpbmVzaXplWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArIG9mZnNldF9idiwgYnVmX3NpemUgLSBvZmZzZXRfYnYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZSQU1FX0FSSVRIX1lWMTI6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworCisgICAgICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmIChidWZfc2l6ZSA8PSBvZmZzZXRfcnkgfHwgYnVmX3NpemUgPD0gb2Zmc2V0X2d1IHx8IGJ1Zl9zaXplIDw9IG9mZnNldF9idikgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAob2Zmc2V0X3J5ID49IGJ1Zl9zaXplIHx8CisgICAgICAgICAgICBvZmZzZXRfZ3UgPj0gYnVmX3NpemUgfHwKKyAgICAgICAgICAgIG9mZnNldF9idiA+PSBidWZfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZnJhbWUgb2Zmc2V0c1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGxhZ19kZWNvZGVfYXJpdGhfcGxhbmUobCwgcC0+ZGF0YVswXSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmxpbmVzaXplWzBdLCBidWYgKyBvZmZzZXRfcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUgLSBvZmZzZXRfcnkpOworICAgICAgICBsYWdfZGVjb2RlX2FyaXRoX3BsYW5lKGwsIHAtPmRhdGFbMl0sIChhdmN0eC0+d2lkdGggKyAxKSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5oZWlnaHQgKyAxKSAvIDIsIHAtPmxpbmVzaXplWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArIG9mZnNldF9ndSwgYnVmX3NpemUgLSBvZmZzZXRfZ3UpOworICAgICAgICBsYWdfZGVjb2RlX2FyaXRoX3BsYW5lKGwsIHAtPmRhdGFbMV0sIChhdmN0eC0+d2lkdGggKyAxKSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5oZWlnaHQgKyAxKSAvIDIsIHAtPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArIG9mZnNldF9idiwgYnVmX3NpemUgLSBvZmZzZXRfYnYpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBMYWdhcml0aCBmcmFtZSB0eXBlOiAlIyJQUkl4OCJcbiIsIGZyYW1ldHlwZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxhZ19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTGFnYXJpdGhDb250ZXh0ICpsID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBsLT5hdmN0eCA9IGF2Y3R4OworCisgICAgZmZfaHVmZnl1dmRzcF9pbml0KCZsLT5oZHNwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbGFnX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIExhZ2FyaXRoQ29udGV4dCAqbCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmbC0+cmdiX3BsYW5lcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9sYWdhcml0aF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsYWdhcml0aCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkxhZ2FyaXRoIGxvc3NsZXNzIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0xBR0FSSVRILAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihMYWdhcml0aENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGxhZ19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBsYWdfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBsYWdfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9sYWdhcml0aHJhYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGFnYXJpdGhyYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2FjMmNmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGFnYXJpdGhyYWMuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogTGFnYXJpdGggcmFuZ2UgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IE5hdGhhbiBDYWxkd2VsbCA8c2FpbnRkZXYgKGF0KSBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRGF2aWQgQ29ucmFkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIExhZ2FyaXRoIHJhbmdlIGRlY29kZXIKKyAqIEBhdXRob3IgTmF0aGFuIENhbGR3ZWxsCisgKiBAYXV0aG9yIERhdmlkIENvbnJhZAorICovCisKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImxhZ2FyaXRocmFjLmgiCisKK3ZvaWQgZmZfbGFnX3JhY19pbml0KGxhZ19yYWMgKmwsIEdldEJpdENvbnRleHQgKmdiLCBpbnQgbGVuZ3RoKQoreworICAgIGludCBpLCBqLCBsZWZ0OworCisgICAgLyogQWNjb3JkaW5nIHRvIHJlZmVyZW5jZSBkZWNvZGVyICIxc3QgYnl0ZSBpcyBnYXJiYWdlIiwKKyAgICAgKiBob3dldmVyLCBpdCBnZXRzIHNraXBwZWQgYnkgdGhlIGNhbGwgdG8gYWxpZ25fZ2V0X2JpdHMoKQorICAgICAqLworICAgIGFsaWduX2dldF9iaXRzKGdiKTsKKyAgICBsZWZ0ICAgICAgICAgICAgICAgID0gZ2V0X2JpdHNfbGVmdChnYikgPj4gMzsKKyAgICBsLT5ieXRlc3RyZWFtX3N0YXJ0ID0KKyAgICBsLT5ieXRlc3RyZWFtICAgICAgID0gZ2ItPmJ1ZmZlciArIGdldF9iaXRzX2NvdW50KGdiKSAvIDg7CisgICAgbC0+Ynl0ZXN0cmVhbV9lbmQgICA9IGwtPmJ5dGVzdHJlYW1fc3RhcnQgKyBsZWZ0OworCisgICAgbC0+cmFuZ2UgICAgICAgID0gMHg4MDsKKyAgICBsLT5sb3cgICAgICAgICAgPSAqbC0+Ynl0ZXN0cmVhbSA+PiAxOworICAgIGwtPmhhc2hfc2hpZnQgICA9IEZGTUFYKChpbnQpbC0+c2NhbGUgLSAxMCwgMCk7CisKKyAgICBmb3IgKGkgPSBqID0gMDsgaSA8IDEwMjQ7IGkrKykgeworICAgICAgICB1bnNpZ25lZCByID0gaSA8PCBsLT5oYXNoX3NoaWZ0OworICAgICAgICB3aGlsZSAobC0+cHJvYltqICsgMV0gPD0gcikKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgbC0+cmFuZ2VfaGFzaFtpXSA9IGo7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGFnYXJpdGhyYWMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2xhZ2FyaXRocmFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkZmVhMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xhZ2FyaXRocmFjLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBMYWdhcml0aCByYW5nZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTmF0aGFuIENhbGR3ZWxsIDxzYWludGRldiAoYXQpIGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOSBEYXZpZCBDb25yYWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTGFnYXJpdGggcmFuZ2UgZGVjb2RlcgorICogQGF1dGhvciBOYXRoYW4gQ2FsZHdlbGwKKyAqIEBhdXRob3IgRGF2aWQgQ29ucmFkCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0xBR0FSSVRIUkFDX0gKKyNkZWZpbmUgQVZDT0RFQ19MQUdBUklUSFJBQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorCit0eXBlZGVmIHN0cnVjdCBsYWdfcmFjIHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgdW5zaWduZWQgbG93OworICAgIHVuc2lnbmVkIHJhbmdlOworICAgIHVuc2lnbmVkIHNjYWxlOyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBiaXRzIG9mIHByZWNpc2lvbiBpbiByYW5nZS4gKi8KKyAgICB1bnNpZ25lZCBoYXNoX3NoaWZ0OyAgICAgICAgLyoqPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCB0byBjYWxjdWxhdGUgaGFzaCBmb3IgcmFkaXggc2VhcmNoLiAqLworCisgICAgY29uc3QgdWludDhfdCAqYnl0ZXN0cmVhbV9zdGFydDsgIC8qKjwgU3RhcnQgb2YgaW5wdXQgYnl0ZXN0cmVhbS4gKi8KKyAgICBjb25zdCB1aW50OF90ICpieXRlc3RyZWFtOyAgICAgICAgLyoqPCBDdXJyZW50IHBvc2l0aW9uIGluIGlucHV0IGJ5dGVzdHJlYW0uICovCisgICAgY29uc3QgdWludDhfdCAqYnl0ZXN0cmVhbV9lbmQ7ICAgIC8qKjwgRW5kIHBvc2l0aW9uIG9mIGlucHV0IGJ5dGVzdHJlYW0uICovCisKKyAgICB1aW50MzJfdCBwcm9iWzI1OF07ICAgICAgICAgLyoqPCBUYWJsZSBvZiBjdW11bGF0aXZlIHByb2JhYmlsaXR5IGZvciBlYWNoIHN5bWJvbC4gKi8KKyAgICB1aW50OF90ICByYW5nZV9oYXNoWzEwMjRdOyAgIC8qKjwgSGFzaCB0YWJsZSBtYXBwaW5nIHVwcGVyIGJ5dGUgdG8gYXBwcm94aW1hdGUgc3ltYm9sLiAqLworfSBsYWdfcmFjOworCit2b2lkIGZmX2xhZ19yYWNfaW5pdChsYWdfcmFjICpsLCBHZXRCaXRDb250ZXh0ICpnYiwgaW50IGxlbmd0aCk7CisKKy8qIFRPRE86IE9wdGltaXplICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGFnX3JhY19yZWZpbGwobGFnX3JhYyAqbCkKK3sKKyAgICB3aGlsZSAobC0+cmFuZ2UgPD0gMHg4MDAwMDApIHsKKyAgICAgICAgbC0+bG93ICAgPDw9IDg7CisgICAgICAgIGwtPnJhbmdlIDw8PSA4OworICAgICAgICBsLT5sb3cgfD0gMHhmZiAmIChBVl9SQjE2KGwtPmJ5dGVzdHJlYW0pID4+IDEpOworICAgICAgICBpZiAobC0+Ynl0ZXN0cmVhbSA8IGwtPmJ5dGVzdHJlYW1fZW5kKQorICAgICAgICAgICAgbC0+Ynl0ZXN0cmVhbSsrOworICAgIH0KK30KKworLyoqCisgKiBEZWNvZGUgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoZSBjb21wcmVzc2VkIHBsYW5lIGRlc2NyaWJlZCBieSAqbC4KKyAqIEBwYXJhbSBsIHBvaW50ZXIgdG8gbGFnX3JhYyBmb3IgdGhlIGN1cnJlbnQgcGxhbmUKKyAqIEByZXR1cm4gbmV4dCBieXRlIG9mIGRlY29kZWQgZGF0YQorICovCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgbGFnX2dldF9yYWMobGFnX3JhYyAqbCkKK3sKKyAgICB1bnNpZ25lZCByYW5nZV9zY2FsZWQsIGxvd19zY2FsZWQ7CisgICAgaW50IHZhbDsKKworICAgIGxhZ19yYWNfcmVmaWxsKGwpOworCisgICAgcmFuZ2Vfc2NhbGVkID0gbC0+cmFuZ2UgPj4gbC0+c2NhbGU7CisKKyAgICBpZiAobC0+bG93IDwgcmFuZ2Vfc2NhbGVkICogbC0+cHJvYlsyNTVdKSB7CisgICAgICAgIC8qIHZhbCA9IDAgaXMgZnJlcXVlbnQgZW5vdWdoIHRvIGRlc2VydmUgYSBzaG9ydGN1dCAqLworICAgICAgICBpZiAobC0+bG93IDwgcmFuZ2Vfc2NhbGVkICogbC0+cHJvYlsxXSkgeworICAgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvd19zY2FsZWQgPSBsLT5sb3cgLyAocmFuZ2Vfc2NhbGVkPDwobC0+aGFzaF9zaGlmdCkpOworCisgICAgICAgICAgICB2YWwgPSBsLT5yYW5nZV9oYXNoW2xvd19zY2FsZWRdOworICAgICAgICAgICAgd2hpbGUgKGwtPmxvdyA+PSByYW5nZV9zY2FsZWQgKiBsLT5wcm9iW3ZhbCArIDFdKQorICAgICAgICAgICAgICAgIHZhbCsrOworICAgICAgICB9CisKKyAgICAgICAgbC0+cmFuZ2UgPSByYW5nZV9zY2FsZWQgKiAobC0+cHJvYlt2YWwgKyAxXSAtIGwtPnByb2JbdmFsXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsID0gMjU1OworICAgICAgICBsLT5yYW5nZSAtPSByYW5nZV9zY2FsZWQgKiBsLT5wcm9iWzI1NV07CisgICAgfQorCisgICAgaWYgKCFsLT5yYW5nZSkKKyAgICAgICAgbC0+cmFuZ2UgPSAweDgwOworCisgICAgbC0+bG93IC09IHJhbmdlX3NjYWxlZCAqIGwtPnByb2JbdmFsXTsKKworICAgIHJldHVybiB2YWw7Cit9CisKKworI2VuZGlmIC8qIEFWQ09ERUNfTEFHQVJJVEhSQUNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGF0bV9wYXJzZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xhdG1fcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyMGY1OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xhdG1fcGFyc2VyLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDggUGF1bCBLZW5kYWxsIDxwYXVsQGtjYmJzLmdlbi5uej4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQUFDIExBVE0gcGFyc2VyCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInBhcnNlci5oIgorCisjZGVmaW5lIExBVE1fSEVBREVSICAgICAweDU2ZTAwMCAgICAgICAgLy8gMHgyYjcgKDExIGJpdHMpCisjZGVmaW5lIExBVE1fTUFTSyAgICAgICAweEZGRTAwMCAgICAgICAgLy8gdG9wIDExIGJpdHMKKyNkZWZpbmUgTEFUTV9TSVpFX01BU0sgIDB4MDAxRkZGICAgICAgICAvLyBib3R0b20gMTMgYml0cworCit0eXBlZGVmIHN0cnVjdCBMQVRNUGFyc2VDb250ZXh0eworICAgIFBhcnNlQ29udGV4dCBwYzsKKyAgICBpbnQgY291bnQ7Cit9IExBVE1QYXJzZUNvbnRleHQ7CisKKy8qKgorICogRmluZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lIGluIHRoZSBiaXRzdHJlYW0uCisgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbmV4dCBmcmFtZSwgb3IgLTEKKyAqLworc3RhdGljIGludCBsYXRtX2ZpbmRfZnJhbWVfZW5kKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzMSwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSkKK3sKKyAgICBMQVRNUGFyc2VDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBQYXJzZUNvbnRleHQgKnBjICAgID0gJnMtPnBjOworICAgIGludCBwaWNfZm91bmQsIGk7CisgICAgdWludDMyX3Qgc3RhdGU7CisKKyAgICBwaWNfZm91bmQgPSBwYy0+ZnJhbWVfc3RhcnRfZm91bmQ7CisgICAgc3RhdGUgICAgID0gcGMtPnN0YXRlOworCisgICAgaWYgKCFwaWNfZm91bmQpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXRlID0gKHN0YXRlPDw4KSB8IGJ1ZltpXTsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBMQVRNX01BU0spID09IExBVE1fSEVBREVSKSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHMtPmNvdW50ICA9IC1pOworICAgICAgICAgICAgICAgIHBpY19mb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGljX2ZvdW5kKSB7CisgICAgICAgIC8qIEVPRiBjb25zaWRlcmVkIGFzIGVuZCBvZiBmcmFtZSAqLworICAgICAgICBpZiAoYnVmX3NpemUgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoKHN0YXRlICYgTEFUTV9TSVpFX01BU0spIC0gcy0+Y291bnQgPD0gYnVmX3NpemUpIHsKKyAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CisgICAgICAgICAgICBwYy0+c3RhdGUgICAgICAgICAgICAgPSAtMTsKKyAgICAgICAgICAgIHJldHVybiAoc3RhdGUgJiBMQVRNX1NJWkVfTUFTSykgLSBzLT5jb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmNvdW50ICAgICAgICAgICAgICs9IGJ1Zl9zaXplOworICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IHBpY19mb3VuZDsKKyAgICBwYy0+c3RhdGUgICAgICAgICAgICAgPSBzdGF0ZTsKKworICAgIHJldHVybiBFTkRfTk9UX0ZPVU5EOworfQorCitzdGF0aWMgaW50IGxhdG1fcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMxLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIExBVE1QYXJzZUNvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIFBhcnNlQ29udGV4dCAqcGMgICAgPSAmcy0+cGM7CisgICAgaW50IG5leHQ7CisKKyAgICBpZiAoczEtPmZsYWdzICYgUEFSU0VSX0ZMQUdfQ09NUExFVEVfRlJBTUVTKSB7CisgICAgICAgIG5leHQgPSBidWZfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXh0ID0gbGF0bV9maW5kX2ZyYW1lX2VuZChzMSwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICAgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUocGMsIG5leHQsICZidWYsICZidWZfc2l6ZSkgPCAwKSB7CisgICAgICAgICAgICAqcG91dGJ1ZiAgICAgID0gTlVMTDsKKyAgICAgICAgICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICB9CisgICAgfQorICAgICpwb3V0YnVmICAgICAgPSBidWY7CisgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIHJldHVybiBuZXh0OworfQorCitBVkNvZGVjUGFyc2VyIGZmX2FhY19sYXRtX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX0FBQ19MQVRNIH0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKExBVE1QYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfcGFyc2UgICA9IGxhdG1fcGFyc2UsCisgICAgLnBhcnNlcl9jbG9zZSAgID0gZmZfcGFyc2VfY2xvc2UKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9sY2wuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL2xjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGMwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9sY2wuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogTENMIChMb3NzTGVzcyBDb2RlYyBMaWJyYXJ5KSBDb2RlYworICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgUm9iZXJ0byBUb2duaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTENMX0gKKyNkZWZpbmUgQVZDT0RFQ19MQ0xfSAorCisjZGVmaW5lIEJNUFRZUEVfWVVWIDEKKyNkZWZpbmUgQk1QVFlQRV9SR0IgMgorCisjZGVmaW5lIElNR1RZUEVfWVVWMTExIDAKKyNkZWZpbmUgSU1HVFlQRV9ZVVY0MjIgMQorI2RlZmluZSBJTUdUWVBFX1JHQjI0IDIKKyNkZWZpbmUgSU1HVFlQRV9ZVVY0MTEgMworI2RlZmluZSBJTUdUWVBFX1lVVjIxMSA0CisjZGVmaW5lIElNR1RZUEVfWVVWNDIwIDUKKworI2RlZmluZSBDT01QX01TWkggMAorI2RlZmluZSBDT01QX01TWkhfTk9DT01QIDEKKyNkZWZpbmUgQ09NUF9aTElCX0hJU1BFRUQgMQorI2RlZmluZSBDT01QX1pMSUJfSElDT01QIDkKKyNkZWZpbmUgQ09NUF9aTElCX05PUk1BTCAtMQorCisjZGVmaW5lIEZMQUdfTVVMVElUSFJFQUQgMQorI2RlZmluZSBGTEFHX05VTExGUkFNRSAyCisjZGVmaW5lIEZMQUdfUE5HRklMVEVSIDQKKyNkZWZpbmUgRkxBR01BU0tfVU5VU0VEIDB4ZjgKKworI2RlZmluZSBDT0RFQ19NU1pIIDEKKyNkZWZpbmUgQ09ERUNfWkxJQiAzCisKKyNlbmRpZiAvKiBBVkNPREVDX0xDTF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9sY2xkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xjbGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTQwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9sY2xkZWMuYwpAQCAtMCwwICsxLDY3OSBAQAorLyoKKyAqIExDTCAoTG9zc0xlc3MgQ29kZWMgTGlicmFyeSkgQ29kZWMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IFJvYmVydG8gVG9nbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTENMIChMb3NzTGVzcyBDb2RlYyBMaWJyYXJ5KSBWaWRlbyBDb2RlYworICogRGVjb2RlciBmb3IgTVNaSCBhbmQgWkxJQiBjb2RlY3MKKyAqIEV4cGVyaW1lbnRhbCBlbmNvZGVyIGZvciBaTElCIFJHQjI0CisgKgorICogRm91cmNjOiBNU1pILCBaTElCCisgKgorICogT3JpZ2luYWwgV2luMzIgZGxsOgorICogVmVyMi4yMyBCeSBLZW5qaSBPc2hpbWEgMjAwMC4wOS4yMAorICogYXZpbXN6aC5kbGwsIGF2aXpsaWIuZGxsCisgKgorICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVjb2RpbmcgYWxnb3JpdGhtIGNhbiBiZSBmb3VuZCBoZXJlOgorICogICBodHRwOi8vd3d3LnBjaXN5cy5uZXQvfm1lbGFuc29uL2NvZGVjcworICoKKyAqIFN1cHBvcnRzOiBCR1IyNCAoUkdCIDI0YnBwKQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsY2wuaCIKKworI2lmIENPTkZJR19aTElCX0RFQ09ERVIKKyNpbmNsdWRlIDx6bGliLmg+CisjZW5kaWYKKworLyoKKyAqIERlY29kZXIgY29udGV4dAorICovCit0eXBlZGVmIHN0cnVjdCBMY2xEZWNDb250ZXh0IHsKKyAgICAvLyBJbWFnZSB0eXBlCisgICAgaW50IGltZ3R5cGU7CisgICAgLy8gQ29tcHJlc3Npb24gdHlwZQorICAgIGludCBjb21wcmVzc2lvbjsKKyAgICAvLyBGbGFncworICAgIGludCBmbGFnczsKKyAgICAvLyBEZWNvbXByZXNzZWQgZGF0YSBzaXplCisgICAgdW5zaWduZWQgaW50IGRlY29tcF9zaXplOworICAgIC8vIERlY29tcHJlc3Npb24gYnVmZmVyCisgICAgdW5zaWduZWQgY2hhciogZGVjb21wX2J1ZjsKKyNpZiBDT05GSUdfWkxJQl9ERUNPREVSCisgICAgel9zdHJlYW0genN0cmVhbTsKKyNlbmRpZgorfSBMY2xEZWNDb250ZXh0OworCisKKy8qKgorICogQHBhcmFtIHNyY3B0ciBjb21wcmVzc2VkIHNvdXJjZSBidWZmZXIsIG11c3QgYmUgcGFkZGVkIHdpdGggYXQgbGVhc3QgNSBleHRyYSBieXRlcworICogQHBhcmFtIGRlc3RwdHIgbXVzdCBiZSBwYWRkZWQgc3VmZmljaWVudGx5IGZvciBhdl9tZW1jcHlfYmFja3B0cgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1zemhfZGVjb21wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzcmNwdHIsIGludCBzcmNsZW4sIHVuc2lnbmVkIGNoYXIgKiBkZXN0cHRyLCB1bnNpZ25lZCBpbnQgZGVzdHNpemUpCit7CisgICAgdW5zaWduZWQgY2hhciAqZGVzdHB0cl9iYWsgPSBkZXN0cHRyOworICAgIHVuc2lnbmVkIGNoYXIgKmRlc3RwdHJfZW5kID0gZGVzdHB0ciArIGRlc3RzaXplOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY3B0cl9lbmQgPSBzcmNwdHIgKyBzcmNsZW47CisgICAgdW5zaWduZWQgbWFzayA9ICpzcmNwdHIrKzsKKyAgICB1bnNpZ25lZCBtYXNrYml0ID0gMHg4MDsKKworICAgIHdoaWxlIChzcmNwdHIgPCBzcmNwdHJfZW5kICYmIGRlc3RwdHIgPCBkZXN0cHRyX2VuZCkgeworICAgICAgICBpZiAoIShtYXNrICYgbWFza2JpdCkpIHsKKyAgICAgICAgICAgIG1lbWNweShkZXN0cHRyLCBzcmNwdHIsIDQpOworICAgICAgICAgICAgZGVzdHB0ciArPSA0OworICAgICAgICAgICAgc3JjcHRyICs9IDQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBvZnMgPSBieXRlc3RyZWFtX2dldF9sZTE2KCZzcmNwdHIpOworICAgICAgICAgICAgdW5zaWduZWQgY250ID0gKG9mcyA+PiAxMSkgKyAxOworICAgICAgICAgICAgb2ZzICY9IDB4N2ZmOworICAgICAgICAgICAgb2ZzID0gRkZNSU4ob2ZzLCBkZXN0cHRyIC0gZGVzdHB0cl9iYWspOworICAgICAgICAgICAgY250ICo9IDQ7CisgICAgICAgICAgICBjbnQgPSBGRk1JTihjbnQsIGRlc3RwdHJfZW5kIC0gZGVzdHB0cik7CisgICAgICAgICAgICBpZiAob2ZzKSB7CisgICAgICAgICAgICAgICAgYXZfbWVtY3B5X2JhY2twdHIoZGVzdHB0ciwgb2ZzLCBjbnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBOb3Qga25vd24gd2hhdCB0aGUgY29ycmVjdCBiZWhhdmlvdXIgaXMsIGJ1dAorICAgICAgICAgICAgICAgIC8vIHRoaXMgYXQgbGVhc3QgYXZvaWRzIHVuaW5pdGlhbGl6ZWQgZGF0YS4KKyAgICAgICAgICAgICAgICBtZW1zZXQoZGVzdHB0ciwgMCwgY250KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3RwdHIgKz0gY250OworICAgICAgICB9CisgICAgICAgIG1hc2tiaXQgPj49IDE7CisgICAgICAgIGlmICghbWFza2JpdCkgeworICAgICAgICAgICAgbWFzayA9ICpzcmNwdHIrKzsKKyAgICAgICAgICAgIHdoaWxlICghbWFzaykgeworICAgICAgICAgICAgICAgIGlmIChkZXN0cHRyX2VuZCAtIGRlc3RwdHIgPCAzMiB8fCBzcmNwdHJfZW5kIC0gc3JjcHRyIDwgMzIpIGJyZWFrOworICAgICAgICAgICAgICAgIG1lbWNweShkZXN0cHRyLCBzcmNwdHIsIDMyKTsKKyAgICAgICAgICAgICAgICBkZXN0cHRyICs9IDMyOworICAgICAgICAgICAgICAgIHNyY3B0ciArPSAzMjsKKyAgICAgICAgICAgICAgICBtYXNrID0gKnNyY3B0cisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFza2JpdCA9IDB4ODA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZGVzdHB0ciAtIGRlc3RwdHJfYmFrOworfQorCisKKyNpZiBDT05GSUdfWkxJQl9ERUNPREVSCisvKioKKyAqIEBicmllZiBkZWNvbXByZXNzIGEgemxpYi1jb21wcmVzc2VkIGRhdGEgYmxvY2sgaW50byBkZWNvbXBfYnVmCisgKiBAcGFyYW0gc3JjIGNvbXByZXNzZWQgaW5wdXQgYnVmZmVyCisgKiBAcGFyYW0gc3JjX2xlbiBkYXRhIGxlbmd0aCBpbiBpbnB1dCBidWZmZXIKKyAqIEBwYXJhbSBvZmZzZXQgb2Zmc2V0IGluIGRlY29tcF9idWYKKyAqIEBwYXJhbSBleHBlY3RlZCBleHBlY3RlZCBkZWNvbXByZXNzZWQgbGVuZ3RoCisgKi8KK3N0YXRpYyBpbnQgemxpYl9kZWNvbXAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGVuLCBpbnQgb2Zmc2V0LCBpbnQgZXhwZWN0ZWQpCit7CisgICAgTGNsRGVjQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHpyZXQgPSBpbmZsYXRlUmVzZXQoJmMtPnpzdHJlYW0pOworICAgIGlmICh6cmV0ICE9IFpfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmZsYXRlIHJlc2V0IGVycm9yOiAlZFxuIiwgenJldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorICAgIGMtPnpzdHJlYW0ubmV4dF9pbiA9ICh1aW50OF90ICopc3JjOworICAgIGMtPnpzdHJlYW0uYXZhaWxfaW4gPSBzcmNfbGVuOworICAgIGMtPnpzdHJlYW0ubmV4dF9vdXQgPSBjLT5kZWNvbXBfYnVmICsgb2Zmc2V0OworICAgIGMtPnpzdHJlYW0uYXZhaWxfb3V0ID0gYy0+ZGVjb21wX3NpemUgLSBvZmZzZXQ7CisgICAgenJldCA9IGluZmxhdGUoJmMtPnpzdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoenJldCAhPSBaX09LICYmIHpyZXQgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5mbGF0ZSBlcnJvcjogJWRcbiIsIHpyZXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBpZiAoZXhwZWN0ZWQgIT0gKHVuc2lnbmVkIGludCljLT56c3RyZWFtLnRvdGFsX291dCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRlY29kZWQgc2l6ZSBkaWZmZXJzICglZCAhPSAlbHUpXG4iLAorICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGMtPnpzdHJlYW0udG90YWxfb3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgcmV0dXJuIGMtPnpzdHJlYW0udG90YWxfb3V0OworfQorI2VuZGlmCisKKworLyoKKyAqCisgKiBEZWNvZGUgYSBmcmFtZQorICoKKyAqLworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBMY2xEZWNDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdW5zaWduZWQgaW50IHBpeGVsX3B0cjsKKyAgICBpbnQgcm93LCBjb2w7CisgICAgdW5zaWduZWQgY2hhciAqZW5jb2RlZCA9IGF2cGt0LT5kYXRhLCAqb3V0cHRyOworICAgIHVpbnQ4X3QgKnlfb3V0LCAqdV9vdXQsICp2X291dDsKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGggPSBhdmN0eC0+d2lkdGg7IC8vIFJlYWwgaW1hZ2Ugd2lkdGgKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsgLy8gUmVhbCBpbWFnZSBoZWlnaHQKKyAgICB1bnNpZ25lZCBpbnQgbXN6aF9kbGVuOworICAgIHVuc2lnbmVkIGNoYXIgeXEsIHkxcSwgdXEsIHZxOworICAgIGludCB1cXZxLCByZXQ7CisgICAgdW5zaWduZWQgaW50IG10aHJlYWRfaW5sZW4sIG10aHJlYWRfb3V0bGVuOworICAgIHVuc2lnbmVkIGludCBsZW4gPSBidWZfc2l6ZTsKKyAgICBpbnQgbGluZXNpemU7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgb3V0cHRyID0gZnJhbWUtPmRhdGFbMF07IC8vIE91dHB1dCBpbWFnZSBwb2ludGVyCisKKyAgICAvKiBEZWNvbXByZXNzIGZyYW1lICovCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01TWkg6CisgICAgICAgIHN3aXRjaCAoYy0+Y29tcHJlc3Npb24pIHsKKyAgICAgICAgY2FzZSBDT01QX01TWkg6CisgICAgICAgICAgICBpZiAoYy0+aW1ndHlwZSA9PSBJTUdUWVBFX1JHQjI0ICYmIGxlbiA9PSBGRkFMSUdOKHdpZHRoICogMywgNCkgKiBoZWlnaHQgfHwKKyAgICAgICAgICAgICAgICBjLT5pbWd0eXBlID09IElNR1RZUEVfWVVWMTExICYmIGxlbiA9PSB3aWR0aCAqIGhlaWdodCAqIDMpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMtPmZsYWdzICYgRkxBR19NVUxUSVRIUkVBRCkgeworICAgICAgICAgICAgICAgIG10aHJlYWRfaW5sZW4gPSBBVl9STDMyKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJsZW4gJWQgaXMgdG9vIHNtYWxsXG4iLCBsZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXRocmVhZF9pbmxlbiA9IEZGTUlOKG10aHJlYWRfaW5sZW4sIGxlbiAtIDgpOworICAgICAgICAgICAgICAgIG10aHJlYWRfb3V0bGVuID0gQVZfUkwzMihidWYgKyA0KTsKKyAgICAgICAgICAgICAgICBtdGhyZWFkX291dGxlbiA9IEZGTUlOKG10aHJlYWRfb3V0bGVuLCBjLT5kZWNvbXBfc2l6ZSk7CisgICAgICAgICAgICAgICAgbXN6aF9kbGVuID0gbXN6aF9kZWNvbXAoYnVmICsgOCwgbXRocmVhZF9pbmxlbiwgYy0+ZGVjb21wX2J1ZiwgYy0+ZGVjb21wX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChtdGhyZWFkX291dGxlbiAhPSBtc3poX2RsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNdGhyZWFkMSBkZWNvZGVkIHNpemUgZGlmZmVycyAoJWQgIT0gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRocmVhZF9vdXRsZW4sIG1zemhfZGxlbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc3poX2RsZW4gPSBtc3poX2RlY29tcChidWYgKyA4ICsgbXRocmVhZF9pbmxlbiwgbGVuIC0gOCAtIG10aHJlYWRfaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZGVjb21wX2J1ZiArIG10aHJlYWRfb3V0bGVuLCBjLT5kZWNvbXBfc2l6ZSAtIG10aHJlYWRfb3V0bGVuKTsKKyAgICAgICAgICAgICAgICBpZiAobXRocmVhZF9vdXRsZW4gIT0gbXN6aF9kbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTXRocmVhZDIgZGVjb2RlZCBzaXplIGRpZmZlcnMgKCVkICE9ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG10aHJlYWRfb3V0bGVuLCBtc3poX2RsZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5jb2RlZCA9IGMtPmRlY29tcF9idWY7CisgICAgICAgICAgICAgICAgbGVuID0gYy0+ZGVjb21wX3NpemU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1zemhfZGxlbiA9IG1zemhfZGVjb21wKGJ1ZiwgbGVuLCBjLT5kZWNvbXBfYnVmLCBjLT5kZWNvbXBfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGMtPmRlY29tcF9zaXplICE9IG1zemhfZGxlbikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRlY29kZWQgc2l6ZSBkaWZmZXJzICglZCAhPSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5kZWNvbXBfc2l6ZSwgbXN6aF9kbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuY29kZWQgPSBjLT5kZWNvbXBfYnVmOworICAgICAgICAgICAgICAgIGxlbiA9IG1zemhfZGxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENPTVBfTVNaSF9OT0NPTVA6IHsKKyAgICAgICAgICAgIGludCBicHB4MjsKKyAgICAgICAgICAgIHN3aXRjaCAoYy0+aW1ndHlwZSkgeworICAgICAgICAgICAgY2FzZSBJTUdUWVBFX1lVVjExMToKKyAgICAgICAgICAgIGNhc2UgSU1HVFlQRV9SR0IyNDoKKyAgICAgICAgICAgICAgICBicHB4MiA9IDY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElNR1RZUEVfWVVWNDIyOgorICAgICAgICAgICAgY2FzZSBJTUdUWVBFX1lVVjIxMToKKyAgICAgICAgICAgICAgICBicHB4MiA9IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElNR1RZUEVfWVVWNDExOgorICAgICAgICAgICAgY2FzZSBJTUdUWVBFX1lVVjQyMDoKKyAgICAgICAgICAgICAgICBicHB4MiA9IDM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJwcHgyID0gMDsgLy8gd2lsbCBlcnJvciBvdXQgYmVsb3cKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW4gPCAoKHdpZHRoICogaGVpZ2h0ICogYnBweDIpID4+IDEpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQlVHISBVbmtub3duIE1TWkggY29tcHJlc3Npb24gaW4gZnJhbWUgZGVjb2Rlci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjaWYgQ09ORklHX1pMSUJfREVDT0RFUgorICAgIGNhc2UgQVZfQ09ERUNfSURfWkxJQjoKKyAgICAgICAgLyogVXNpbmcgdGhlIG9yaWdpbmFsIGRsbCB3aXRoIG5vcm1hbCBjb21wcmVzc2lvbiAoLTEpIGFuZCBSR0IgZm9ybWF0CisgICAgICAgICAqIGdpdmVzIGEgZmlsZSB3aXRoIFpMSUIgZm91cmNjLCBidXQgZnJhbWUgaXMgcmVhbGx5IHVuY29tcHJlc3NlZC4KKyAgICAgICAgICogVG8gYmUgc3VyZSB0aGF0J3MgdHJ1ZSBjaGVjayBhbHNvIGZyYW1lIHNpemUgKi8KKyAgICAgICAgaWYgKGMtPmNvbXByZXNzaW9uID09IENPTVBfWkxJQl9OT1JNQUwgJiYgYy0+aW1ndHlwZSA9PSBJTUdUWVBFX1JHQjI0ICYmCisgICAgICAgICAgICBsZW4gPT0gd2lkdGggKiBoZWlnaHQgKiAzKSB7CisgICAgICAgICAgICBpZiAoYy0+ZmxhZ3MgJiBGTEFHX1BOR0ZJTFRFUikgeworICAgICAgICAgICAgICAgIG1lbWNweShjLT5kZWNvbXBfYnVmLCBidWYsIGxlbik7CisgICAgICAgICAgICAgICAgZW5jb2RlZCA9IGMtPmRlY29tcF9idWY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGMtPmZsYWdzICYgRkxBR19NVUxUSVRIUkVBRCkgeworICAgICAgICAgICAgbXRocmVhZF9pbmxlbiA9IEFWX1JMMzIoYnVmKTsKKyAgICAgICAgICAgIG10aHJlYWRfaW5sZW4gPSBGRk1JTihtdGhyZWFkX2lubGVuLCBsZW4gLSA4KTsKKyAgICAgICAgICAgIG10aHJlYWRfb3V0bGVuID0gQVZfUkwzMihidWYgKyA0KTsKKyAgICAgICAgICAgIG10aHJlYWRfb3V0bGVuID0gRkZNSU4obXRocmVhZF9vdXRsZW4sIGMtPmRlY29tcF9zaXplKTsKKyAgICAgICAgICAgIHJldCA9IHpsaWJfZGVjb21wKGF2Y3R4LCBidWYgKyA4LCBtdGhyZWFkX2lubGVuLCAwLCBtdGhyZWFkX291dGxlbik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHJldCA9IHpsaWJfZGVjb21wKGF2Y3R4LCBidWYgKyA4ICsgbXRocmVhZF9pbmxlbiwgbGVuIC0gOCAtIG10aHJlYWRfaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdGhyZWFkX291dGxlbiwgbXRocmVhZF9vdXRsZW4pOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gemxpYl9kZWNvbXAoYXZjdHgsIGJ1ZiwgbGVuLCAwLCBjLT5kZWNvbXBfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBlbmNvZGVkID0gYy0+ZGVjb21wX2J1ZjsKKyAgICAgICAgbGVuID0gYy0+ZGVjb21wX3NpemU7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCVUchIFVua25vd24gY29kZWMgaW4gZnJhbWUgZGVjb2RlciBjb21wcmVzc2lvbiBzd2l0Y2guXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisKKyAgICAvKiBBcHBseSBQTkcgZmlsdGVyICovCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9aTElCICYmIChjLT5mbGFncyAmIEZMQUdfUE5HRklMVEVSKSkgeworICAgICAgICBzd2l0Y2ggKGMtPmltZ3R5cGUpIHsKKyAgICAgICAgY2FzZSBJTUdUWVBFX1lVVjExMToKKyAgICAgICAgY2FzZSBJTUdUWVBFX1JHQjI0OgorICAgICAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyID0gcm93ICogd2lkdGggKiAzOworICAgICAgICAgICAgICAgIHlxID0gZW5jb2RlZFtwaXhlbF9wdHIrK107CisgICAgICAgICAgICAgICAgdXF2cSA9IEFWX1JMMTYoZW5jb2RlZCtwaXhlbF9wdHIpOworICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAyOworICAgICAgICAgICAgICAgIGZvciAoY29sID0gMTsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyXSA9IHlxIC09IGVuY29kZWRbcGl4ZWxfcHRyXTsKKyAgICAgICAgICAgICAgICAgICAgdXF2cSAtPSBBVl9STDE2KGVuY29kZWQrcGl4ZWxfcHRyKzEpOworICAgICAgICAgICAgICAgICAgICBBVl9XTDE2KGVuY29kZWQrcGl4ZWxfcHRyKzEsIHVxdnEpOworICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTUdUWVBFX1lVVjQyMjoKKyAgICAgICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgICAgICAgICAgIHBpeGVsX3B0ciA9IHJvdyAqIHdpZHRoICogMjsKKyAgICAgICAgICAgICAgICB5cSA9IHVxID0gdnEgPTA7CisgICAgICAgICAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3aWR0aC80OyBjb2wrKykgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGVkW3BpeGVsX3B0cl0gPSB5cSAtPSBlbmNvZGVkW3BpeGVsX3B0cl07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzFdID0geXEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrMV07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzJdID0geXEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrMl07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzNdID0geXEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrM107CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzRdID0gdXEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrNF07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzVdID0gdXEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrNV07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzZdID0gdnEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrNl07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzddID0gdnEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrN107CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElNR1RZUEVfWVVWNDExOgorICAgICAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyID0gcm93ICogd2lkdGggLyAyICogMzsKKyAgICAgICAgICAgICAgICB5cSA9IHVxID0gdnEgPTA7CisgICAgICAgICAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3aWR0aC80OyBjb2wrKykgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGVkW3BpeGVsX3B0cl0gPSB5cSAtPSBlbmNvZGVkW3BpeGVsX3B0cl07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzFdID0geXEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrMV07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzJdID0geXEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrMl07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzNdID0geXEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrM107CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzRdID0gdXEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrNF07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzVdID0gdnEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrNV07CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElNR1RZUEVfWVVWMjExOgorICAgICAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyID0gcm93ICogd2lkdGggKiAyOworICAgICAgICAgICAgICAgIHlxID0gdXEgPSB2cSA9MDsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHdpZHRoLzI7IGNvbCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyXSA9IHlxIC09IGVuY29kZWRbcGl4ZWxfcHRyXTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFtwaXhlbF9wdHIrMV0gPSB5cSAtPSBlbmNvZGVkW3BpeGVsX3B0cisxXTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFtwaXhlbF9wdHIrMl0gPSB1cSAtPSBlbmNvZGVkW3BpeGVsX3B0cisyXTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFtwaXhlbF9wdHIrM10gPSB2cSAtPSBlbmNvZGVkW3BpeGVsX3B0ciszXTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU1HVFlQRV9ZVVY0MjA6CisgICAgICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodC8yOyByb3crKykgeworICAgICAgICAgICAgICAgIHBpeGVsX3B0ciA9IHJvdyAqIHdpZHRoICogMzsKKyAgICAgICAgICAgICAgICB5cSA9IHkxcSA9IHVxID0gdnEgPTA7CisgICAgICAgICAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3aWR0aC8yOyBjb2wrKykgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGVkW3BpeGVsX3B0cl0gPSB5cSAtPSBlbmNvZGVkW3BpeGVsX3B0cl07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzFdID0geXEgLT0gZW5jb2RlZFtwaXhlbF9wdHIrMV07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRbcGl4ZWxfcHRyKzJdID0geTFxIC09IGVuY29kZWRbcGl4ZWxfcHRyKzJdOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVkW3BpeGVsX3B0ciszXSA9IHkxcSAtPSBlbmNvZGVkW3BpeGVsX3B0ciszXTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFtwaXhlbF9wdHIrNF0gPSB1cSAtPSBlbmNvZGVkW3BpeGVsX3B0cis0XTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFtwaXhlbF9wdHIrNV0gPSB2cSAtPSBlbmNvZGVkW3BpeGVsX3B0cis1XTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJVRyEgVW5rbm93biBpbWFnZXR5cGUgaW4gcG5nZmlsdGVyIHN3aXRjaC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb252ZXJ0IGNvbG9yc3BhY2UgKi8KKyAgICB5X291dCA9IGZyYW1lLT5kYXRhWzBdICsgKGhlaWdodCAtIDEpICogZnJhbWUtPmxpbmVzaXplWzBdOworICAgIHVfb3V0ID0gZnJhbWUtPmRhdGFbMV0gKyAoaGVpZ2h0IC0gMSkgKiBmcmFtZS0+bGluZXNpemVbMV07CisgICAgdl9vdXQgPSBmcmFtZS0+ZGF0YVsyXSArIChoZWlnaHQgLSAxKSAqIGZyYW1lLT5saW5lc2l6ZVsyXTsKKyAgICBzd2l0Y2ggKGMtPmltZ3R5cGUpIHsKKyAgICBjYXNlIElNR1RZUEVfWVVWMTExOgorICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgICAgICAgeV9vdXRbY29sXSA9ICplbmNvZGVkKys7CisgICAgICAgICAgICAgICAgdV9vdXRbY29sXSA9ICplbmNvZGVkKysgKyAxMjg7CisgICAgICAgICAgICAgICAgdl9vdXRbY29sXSA9ICplbmNvZGVkKysgKyAxMjg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5X291dCAtPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICB1X291dCAtPSBmcmFtZS0+bGluZXNpemVbMV07CisgICAgICAgICAgICB2X291dCAtPSBmcmFtZS0+bGluZXNpemVbMl07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTUdUWVBFX1lVVjQyMjoKKyAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHdpZHRoIC0gMzsgY29sICs9IDQpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoeV9vdXQgKyBjb2wsIGVuY29kZWQsIDQpOworICAgICAgICAgICAgICAgIGVuY29kZWQgKz0gNDsKKyAgICAgICAgICAgICAgICB1X291dFsgY29sID4+IDEgICAgIF0gPSAqZW5jb2RlZCsrICsgMTI4OworICAgICAgICAgICAgICAgIHVfb3V0Wyhjb2wgPj4gMSkgKyAxXSA9ICplbmNvZGVkKysgKyAxMjg7CisgICAgICAgICAgICAgICAgdl9vdXRbIGNvbCA+PiAxICAgICBdID0gKmVuY29kZWQrKyArIDEyODsKKyAgICAgICAgICAgICAgICB2X291dFsoY29sID4+IDEpICsgMV0gPSAqZW5jb2RlZCsrICsgMTI4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgeV9vdXQgLT0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgdV9vdXQgLT0gZnJhbWUtPmxpbmVzaXplWzFdOworICAgICAgICAgICAgdl9vdXQgLT0gZnJhbWUtPmxpbmVzaXplWzJdOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU1HVFlQRV9SR0IyNDoKKyAgICAgICAgbGluZXNpemUgPSBsZW4gPCBGRkFMSUdOKDMgKiB3aWR0aCwgNCkgKiBoZWlnaHQgPyAzICogd2lkdGggOiBGRkFMSUdOKDMgKiB3aWR0aCwgNCk7CisgICAgICAgIGZvciAocm93ID0gaGVpZ2h0IC0gMTsgcm93ID49IDA7IHJvdy0tKSB7CisgICAgICAgICAgICBwaXhlbF9wdHIgPSByb3cgKiBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICBtZW1jcHkob3V0cHRyICsgcGl4ZWxfcHRyLCBlbmNvZGVkLCAzICogd2lkdGgpOworICAgICAgICAgICAgZW5jb2RlZCArPSBsaW5lc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIElNR1RZUEVfWVVWNDExOgorICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgd2lkdGggLSAzOyBjb2wgKz0gNCkgeworICAgICAgICAgICAgICAgIG1lbWNweSh5X291dCArIGNvbCwgZW5jb2RlZCwgNCk7CisgICAgICAgICAgICAgICAgZW5jb2RlZCArPSA0OworICAgICAgICAgICAgICAgIHVfb3V0W2NvbCA+PiAyXSA9ICplbmNvZGVkKysgKyAxMjg7CisgICAgICAgICAgICAgICAgdl9vdXRbY29sID4+IDJdID0gKmVuY29kZWQrKyArIDEyODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlfb3V0IC09IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIHVfb3V0IC09IGZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgICAgIHZfb3V0IC09IGZyYW1lLT5saW5lc2l6ZVsyXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIElNR1RZUEVfWVVWMjExOgorICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgd2lkdGggLSAxOyBjb2wgKz0gMikgeworICAgICAgICAgICAgICAgIG1lbWNweSh5X291dCArIGNvbCwgZW5jb2RlZCwgMik7CisgICAgICAgICAgICAgICAgZW5jb2RlZCArPSAyOworICAgICAgICAgICAgICAgIHVfb3V0W2NvbCA+PiAxXSA9ICplbmNvZGVkKysgKyAxMjg7CisgICAgICAgICAgICAgICAgdl9vdXRbY29sID4+IDFdID0gKmVuY29kZWQrKyArIDEyODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlfb3V0IC09IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIHVfb3V0IC09IGZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgICAgIHZfb3V0IC09IGZyYW1lLT5saW5lc2l6ZVsyXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIElNR1RZUEVfWVVWNDIwOgorICAgICAgICB1X291dCA9IGZyYW1lLT5kYXRhWzFdICsgKChoZWlnaHQgPj4gMSkgLSAxKSAqIGZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgdl9vdXQgPSBmcmFtZS0+ZGF0YVsyXSArICgoaGVpZ2h0ID4+IDEpIC0gMSkgKiBmcmFtZS0+bGluZXNpemVbMl07CisgICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgaGVpZ2h0IC0gMTsgcm93ICs9IDIpIHsKKyAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgd2lkdGggLSAxOyBjb2wgKz0gMikgeworICAgICAgICAgICAgICAgIG1lbWNweSh5X291dCArIGNvbCwgZW5jb2RlZCwgMik7CisgICAgICAgICAgICAgICAgZW5jb2RlZCArPSAyOworICAgICAgICAgICAgICAgIG1lbWNweSh5X291dCArIGNvbCAtIGZyYW1lLT5saW5lc2l6ZVswXSwgZW5jb2RlZCwgMik7CisgICAgICAgICAgICAgICAgZW5jb2RlZCArPSAyOworICAgICAgICAgICAgICAgIHVfb3V0W2NvbCA+PiAxXSA9ICplbmNvZGVkKysgKyAxMjg7CisgICAgICAgICAgICAgICAgdl9vdXRbY29sID4+IDFdID0gKmVuY29kZWQrKyArIDEyODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlfb3V0IC09IGZyYW1lLT5saW5lc2l6ZVswXSA8PCAxOworICAgICAgICAgICAgdV9vdXQgLT0gZnJhbWUtPmxpbmVzaXplWzFdOworICAgICAgICAgICAgdl9vdXQgLT0gZnJhbWUtPmxpbmVzaXplWzJdOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQlVHISBVbmtub3duIGltYWdldHlwZSBpbiBpbWFnZSBkZWNvZGVyLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgLyogYWx3YXlzIHJlcG9ydCB0aGF0IHRoZSBidWZmZXIgd2FzIGNvbXBsZXRlbHkgY29uc3VtZWQgKi8KKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKKy8qCisgKgorICogSW5pdCBsY2wgZGVjb2RlcgorICoKKyAqLworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMY2xEZWNDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdW5zaWduZWQgaW50IGJhc2VzaXplID0gYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodDsKKyAgICB1bnNpZ25lZCBpbnQgbWF4X2Jhc2VzaXplID0gRkZBTElHTihhdmN0eC0+d2lkdGgsICA0KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGQUxJR04oYXZjdHgtPmhlaWdodCwgNCk7CisgICAgdW5zaWduZWQgaW50IG1heF9kZWNvbXBfc2l6ZTsKKyAgICBpbnQgc3Vic2FtcGxlX2gsIHN1YnNhbXBsZV92OworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFeHRyYWRhdGEgc2l6ZSB0b28gc21hbGwuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogQ2hlY2sgY29kZWMgdHlwZSAqLworICAgIGlmICgoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01TWkggICYmIGF2Y3R4LT5leHRyYWRhdGFbN10gIT0gQ09ERUNfTVNaSCkgfHwKKyAgICAgICAgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9aTElCICAmJiBhdmN0eC0+ZXh0cmFkYXRhWzddICE9IENPREVDX1pMSUIpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29kZWMgaWQgYW5kIGNvZGVjIHR5cGUgbWlzbWF0Y2guIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uXG4iKTsKKyAgICB9CisKKyAgICAvKiBEZXRlY3QgaW1hZ2UgdHlwZSAqLworICAgIHN3aXRjaCAoYy0+aW1ndHlwZSA9IGF2Y3R4LT5leHRyYWRhdGFbNF0pIHsKKyAgICBjYXNlIElNR1RZUEVfWVVWMTExOgorICAgICAgICBjLT5kZWNvbXBfc2l6ZSA9IGJhc2VzaXplICogMzsKKyAgICAgICAgbWF4X2RlY29tcF9zaXplID0gbWF4X2Jhc2VzaXplICogMzsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSW1hZ2UgdHlwZSBpcyBZVVYgMToxOjEuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTUdUWVBFX1lVVjQyMjoKKyAgICAgICAgYy0+ZGVjb21wX3NpemUgPSBiYXNlc2l6ZSAqIDI7CisgICAgICAgIG1heF9kZWNvbXBfc2l6ZSA9IG1heF9iYXNlc2l6ZSAqIDI7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkltYWdlIHR5cGUgaXMgWVVWIDQ6MjoyLlxuIik7CisgICAgICAgIGlmIChhdmN0eC0+d2lkdGggJSA0KSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJVbnN1cHBvcnRlZCBkaW1lbnNpb25zXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU1HVFlQRV9SR0IyNDoKKyAgICAgICAgYy0+ZGVjb21wX3NpemUgPSBiYXNlc2l6ZSAqIDM7CisgICAgICAgIG1heF9kZWNvbXBfc2l6ZSA9IG1heF9iYXNlc2l6ZSAqIDM7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IyNDsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJJbWFnZSB0eXBlIGlzIFJHQiAyNC5cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElNR1RZUEVfWVVWNDExOgorICAgICAgICBjLT5kZWNvbXBfc2l6ZSA9IGJhc2VzaXplIC8gMiAqIDM7CisgICAgICAgIG1heF9kZWNvbXBfc2l6ZSA9IG1heF9iYXNlc2l6ZSAvIDIgKiAzOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDExUDsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJJbWFnZSB0eXBlIGlzIFlVViA0OjE6MS5cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElNR1RZUEVfWVVWMjExOgorICAgICAgICBjLT5kZWNvbXBfc2l6ZSA9IGJhc2VzaXplICogMjsKKyAgICAgICAgbWF4X2RlY29tcF9zaXplID0gbWF4X2Jhc2VzaXplICogMjsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSW1hZ2UgdHlwZSBpcyBZVVYgMjoxOjEuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTUdUWVBFX1lVVjQyMDoKKyAgICAgICAgYy0+ZGVjb21wX3NpemUgPSBiYXNlc2l6ZSAvIDIgKiAzOworICAgICAgICBtYXhfZGVjb21wX3NpemUgPSBtYXhfYmFzZXNpemUgLyAyICogMzsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSW1hZ2UgdHlwZSBpcyBZVVYgNDoyOjAuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBpbWFnZSBmb3JtYXQgJWQuXG4iLCBjLT5pbWd0eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUoYXZjdHgtPnBpeF9mbXQsICZzdWJzYW1wbGVfaCwgJnN1YnNhbXBsZV92KTsKKyAgICBpZiAoYXZjdHgtPndpZHRoICUgKDE8PHN1YnNhbXBsZV9oKSB8fCBhdmN0eC0+aGVpZ2h0ICUgKDE8PHN1YnNhbXBsZV92KSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJVbnN1cHBvcnRlZCBkaW1lbnNpb25zXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogRGV0ZWN0IGNvbXByZXNzaW9uIG1ldGhvZCAqLworICAgIGMtPmNvbXByZXNzaW9uID0gKGludDhfdClhdmN0eC0+ZXh0cmFkYXRhWzVdOworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NU1pIOgorICAgICAgICBzd2l0Y2ggKGMtPmNvbXByZXNzaW9uKSB7CisgICAgICAgIGNhc2UgQ09NUF9NU1pIOgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJDb21wcmVzc2lvbiBlbmFibGVkLlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT01QX01TWkhfTk9DT01QOgorICAgICAgICAgICAgYy0+ZGVjb21wX3NpemUgPSAwOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJObyBjb21wcmVzc2lvbi5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvbXByZXNzaW9uIGZvcm1hdCBmb3IgTVNaSCAoJWQpLlxuIiwgYy0+Y29tcHJlc3Npb24pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjaWYgQ09ORklHX1pMSUJfREVDT0RFUgorICAgIGNhc2UgQVZfQ09ERUNfSURfWkxJQjoKKyAgICAgICAgc3dpdGNoIChjLT5jb21wcmVzc2lvbikgeworICAgICAgICBjYXNlIENPTVBfWkxJQl9ISVNQRUVEOgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJIaWdoIHNwZWVkIGNvbXByZXNzaW9uLlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT01QX1pMSUJfSElDT01QOgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJIaWdoIGNvbXByZXNzaW9uLlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT01QX1pMSUJfTk9STUFMOgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJOb3JtYWwgY29tcHJlc3Npb24uXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKGMtPmNvbXByZXNzaW9uIDwgWl9OT19DT01QUkVTU0lPTiB8fCBjLT5jb21wcmVzc2lvbiA+IFpfQkVTVF9DT01QUkVTU0lPTikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbGV2ZWwgZm9yIFpMSUI6ICglZCkuXG4iLCBjLT5jb21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkNvbXByZXNzaW9uIGxldmVsIGZvciBaTElCOiAoJWQpLlxuIiwgYy0+Y29tcHJlc3Npb24pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCVUchIFVua25vd24gY29kZWMgaW4gY29tcHJlc3Npb24gc3dpdGNoLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGRlY29tcHJlc3Npb24gYnVmZmVyICovCisgICAgaWYgKGMtPmRlY29tcF9zaXplKSB7CisgICAgICAgIGlmICghKGMtPmRlY29tcF9idWYgPSBhdl9tYWxsb2MobWF4X2RlY29tcF9zaXplKSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgYWxsb2NhdGUgZGVjb21wcmVzc2lvbiBidWZmZXIuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEZXRlY3QgZmxhZ3MgKi8KKyAgICBjLT5mbGFncyA9IGF2Y3R4LT5leHRyYWRhdGFbNl07CisgICAgaWYgKGMtPmZsYWdzICYgRkxBR19NVUxUSVRIUkVBRCkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJNdWx0aXRocmVhZCBlbmNvZGVyIGZsYWcgc2V0LlxuIik7CisgICAgaWYgKGMtPmZsYWdzICYgRkxBR19OVUxMRlJBTUUpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiTnVsbGZyYW1lIGluc2VydGlvbiBmbGFnIHNldC5cbiIpOworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWkxJQiAmJiAoYy0+ZmxhZ3MgJiBGTEFHX1BOR0ZJTFRFUikpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUE5HIGZpbHRlciBmbGFnIHNldC5cbiIpOworICAgIGlmIChjLT5mbGFncyAmIEZMQUdNQVNLX1VOVVNFRCkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGZsYWcgc2V0ICglZCkuXG4iLCBjLT5mbGFncyk7CisKKyAgICAvKiBJZiBuZWVkZWQgaW5pdCB6bGliICovCisjaWYgQ09ORklHX1pMSUJfREVDT0RFUgorICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWkxJQikgeworICAgICAgICBpbnQgenJldDsKKyAgICAgICAgYy0+enN0cmVhbS56YWxsb2MgPSBaX05VTEw7CisgICAgICAgIGMtPnpzdHJlYW0uemZyZWUgPSBaX05VTEw7CisgICAgICAgIGMtPnpzdHJlYW0ub3BhcXVlID0gWl9OVUxMOworICAgICAgICB6cmV0ID0gaW5mbGF0ZUluaXQoJmMtPnpzdHJlYW0pOworICAgICAgICBpZiAoenJldCAhPSBaX09LKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluZmxhdGUgaW5pdCBlcnJvcjogJWRcbiIsIHpyZXQpOworICAgICAgICAgICAgYXZfZnJlZXAoJmMtPmRlY29tcF9idWYpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICogVW5pbml0IGxjbCBkZWNvZGVyCisgKgorICovCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTGNsRGVjQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmMtPmRlY29tcF9idWYpOworI2lmIENPTkZJR19aTElCX0RFQ09ERVIKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1pMSUIpCisgICAgICAgIGluZmxhdGVFbmQoJmMtPnpzdHJlYW0pOworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19NU1pIX0RFQ09ERVIKK0FWQ29kZWMgZmZfbXN6aF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtc3poIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTENMIChMb3NzTGVzcyBDb2RlYyBMaWJyYXJ5KSBNU1pIIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01TWkgsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKExjbERlY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfWkxJQl9ERUNPREVSCitBVkNvZGVjIGZmX3psaWJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiemxpYiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkxDTCAoTG9zc0xlc3MgQ29kZWMgTGlicmFyeSkgWkxJQiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9aTElCLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihMY2xEZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGNsZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9sY2xlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFkMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGNsZW5jLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBMQ0wgKExvc3NMZXNzIENvZGVjIExpYnJhcnkpIENvZGVjCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBSb2JlcnRvIFRvZ25pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIExDTCAoTG9zc0xlc3MgQ29kZWMgTGlicmFyeSkgVmlkZW8gQ29kZWMKKyAqIERlY29kZXIgZm9yIE1TWkggYW5kIFpMSUIgY29kZWNzCisgKiBFeHBlcmltZW50YWwgZW5jb2RlciBmb3IgWkxJQiBSR0IyNAorICoKKyAqIEZvdXJjYzogTVNaSCwgWkxJQgorICoKKyAqIE9yaWdpbmFsIFdpbjMyIGRsbDoKKyAqIFZlcjIuMjMgQnkgS2VuamkgT3NoaW1hIDIwMDAuMDkuMjAKKyAqIGF2aW1zemguZGxsLCBhdml6bGliLmRsbAorICoKKyAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGRlY29kaW5nIGFsZ29yaXRobSBjYW4gYmUgZm91bmQgaGVyZToKKyAqICAgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MKKyAqCisgKiBTdXBwb3J0czogQkdSMjQgKFJHQiAyNGJwcCkKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsY2wuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNpbmNsdWRlIDx6bGliLmg+CisKKy8qCisgKiBEZWNvZGVyIGNvbnRleHQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgTGNsRW5jQ29udGV4dCB7CisKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisKKyAgICAvLyBJbWFnZSB0eXBlCisgICAgaW50IGltZ3R5cGU7CisgICAgLy8gQ29tcHJlc3Npb24gdHlwZQorICAgIGludCBjb21wcmVzc2lvbjsKKyAgICAvLyBGbGFncworICAgIGludCBmbGFnczsKKyAgICB6X3N0cmVhbSB6c3RyZWFtOworfSBMY2xFbmNDb250ZXh0OworCisvKgorICoKKyAqIEVuY29kZSBhIGZyYW1lCisgKgorICovCitzdGF0aWMgaW50IGVuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgTGNsRW5jQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIHJldDsKKyAgICBpbnQgenJldDsgLy8gWmxpYiByZXR1cm4gY29kZQorICAgIGludCBtYXhfc2l6ZSA9IGRlZmxhdGVCb3VuZCgmYy0+enN0cmVhbSwgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqIDMpOworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIG1heF9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYoYXZjdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9CR1IyNCl7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRm9ybWF0IG5vdCBzdXBwb3J0ZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHpyZXQgPSBkZWZsYXRlUmVzZXQoJmMtPnpzdHJlYW0pOworICAgIGlmICh6cmV0ICE9IFpfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEZWZsYXRlIHJlc2V0IGVycm9yOiAlZFxuIiwgenJldCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYy0+enN0cmVhbS5uZXh0X291dCAgPSBwa3QtPmRhdGE7CisgICAgYy0+enN0cmVhbS5hdmFpbF9vdXQgPSBwa3QtPnNpemU7CisKKyAgICBmb3IoaSA9IGF2Y3R4LT5oZWlnaHQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBjLT56c3RyZWFtLm5leHRfaW4gPSBwLT5kYXRhWzBdK3AtPmxpbmVzaXplWzBdKmk7CisgICAgICAgIGMtPnpzdHJlYW0uYXZhaWxfaW4gPSBhdmN0eC0+d2lkdGgqMzsKKyAgICAgICAgenJldCA9IGRlZmxhdGUoJmMtPnpzdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgICBpZiAoenJldCAhPSBaX09LKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRlZmxhdGUgZXJyb3I6ICVkXG4iLCB6cmV0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICB6cmV0ID0gZGVmbGF0ZSgmYy0+enN0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmICh6cmV0ICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRlZmxhdGUgZXJyb3I6ICVkXG4iLCB6cmV0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHBrdC0+c2l6ZSAgID0gYy0+enN0cmVhbS50b3RhbF9vdXQ7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICogSW5pdCBsY2wgZW5jb2RlcgorICoKKyAqLworc3RhdGljIGF2X2NvbGQgaW50IGVuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMY2xFbmNDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgenJldDsgLy8gWmxpYiByZXR1cm4gY29kZQorCisgICAgYy0+YXZjdHg9IGF2Y3R4OworCisgICAgYXZfYXNzZXJ0MChhdmN0eC0+d2lkdGggJiYgYXZjdHgtPmhlaWdodCk7CisKKyAgICBhdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeig4ICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWF2Y3R4LT5jb2RlZF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWUgPSAxOworCisgICAgYy0+Y29tcHJlc3Npb24gPSBhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPT0gRkZfQ09NUFJFU1NJT05fREVGQVVMVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9aTElCX05PUk1BTCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfY2xpcChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwsIDAsIDkpOworICAgIGMtPmZsYWdzID0gMDsKKyAgICBjLT5pbWd0eXBlID0gSU1HVFlQRV9SR0IyNDsKKyAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlPSAyNDsKKworICAgIGF2Y3R4LT5leHRyYWRhdGFbMF09IDQ7CisgICAgYXZjdHgtPmV4dHJhZGF0YVsxXT0gMDsKKyAgICBhdmN0eC0+ZXh0cmFkYXRhWzJdPSAwOworICAgIGF2Y3R4LT5leHRyYWRhdGFbM109IDA7CisgICAgYXZjdHgtPmV4dHJhZGF0YVs0XT0gYy0+aW1ndHlwZTsKKyAgICBhdmN0eC0+ZXh0cmFkYXRhWzVdPSBjLT5jb21wcmVzc2lvbjsKKyAgICBhdmN0eC0+ZXh0cmFkYXRhWzZdPSBjLT5mbGFnczsKKyAgICBhdmN0eC0+ZXh0cmFkYXRhWzddPSBDT0RFQ19aTElCOworICAgIGMtPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZT0gODsKKworICAgIGMtPnpzdHJlYW0uemFsbG9jID0gWl9OVUxMOworICAgIGMtPnpzdHJlYW0uemZyZWUgPSBaX05VTEw7CisgICAgYy0+enN0cmVhbS5vcGFxdWUgPSBaX05VTEw7CisgICAgenJldCA9IGRlZmxhdGVJbml0KCZjLT56c3RyZWFtLCBjLT5jb21wcmVzc2lvbik7CisgICAgaWYgKHpyZXQgIT0gWl9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRlZmxhdGUgaW5pdCBlcnJvcjogJWRcbiIsIHpyZXQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqCisgKiBVbmluaXQgbGNsIGVuY29kZXIKKyAqCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMY2xFbmNDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBkZWZsYXRlRW5kKCZjLT56c3RyZWFtKTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl96bGliX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInpsaWIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMQ0wgKExvc3NMZXNzIENvZGVjIExpYnJhcnkpIFpMSUIiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfWkxJQiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTGNsRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGVuY29kZV9lbmQsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMgfCBDT0RFQ19DQVBfSU5UUkFfT05MWSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9CR1IyNCwgQVZfUElYX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGliYWFjcGx1cy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGliYWFjcGx1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NWUyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJhYWNwbHVzLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBJbnRlcmZhY2UgdG8gbGliYWFjcGx1cyBmb3IgYWFjKyAoc2JyK3BzKSBlbmNvZGluZworICogQ29weXJpZ2h0IChjKSAyMDEwIHRpcG9rIDxwaXJhdGZtQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSW50ZXJmYWNlIHRvIGxpYmFhY3BsdXMgZm9yIGFhYysgKHNicitwcykgZW5jb2RpbmcuCisgKi8KKworI2luY2x1ZGUgPGFhY3BsdXMuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBhYWNQbHVzQXVkaW9Db250ZXh0IHsKKyAgICBhYWNwbHVzRW5jSGFuZGxlIGFhY3BsdXNfaGFuZGxlOworICAgIHVuc2lnbmVkIGxvbmcgbWF4X291dHB1dF9ieXRlczsKKyAgICB1bnNpZ25lZCBsb25nIHNhbXBsZXNfaW5wdXQ7Cit9IGFhY1BsdXNBdWRpb0NvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBhYWNQbHVzX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhYWNQbHVzQXVkaW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhYWNwbHVzRW5jQ29uZmlndXJhdGlvbiAqYWFjcGx1c19jZmc7CisKKyAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDwgMSB8fCBhdmN0eC0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5jb2RpbmcgJWQgY2hhbm5lbChzKSBpcyBub3QgYWxsb3dlZFxuIiwgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPnByb2ZpbGUgIT0gRkZfUFJPRklMRV9BQUNfTE9XICYmIGF2Y3R4LT5wcm9maWxlICE9IEZGX1BST0ZJTEVfVU5LTk9XTikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgQUFDIHByb2ZpbGU6ICVkLCBvbmx5IExDIHN1cHBvcnRlZFxuIiwgYXZjdHgtPnByb2ZpbGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPmFhY3BsdXNfaGFuZGxlID0gYWFjcGx1c0VuY09wZW4oYXZjdHgtPnNhbXBsZV9yYXRlLCBhdmN0eC0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+c2FtcGxlc19pbnB1dCwgJnMtPm1heF9vdXRwdXRfYnl0ZXMpOworICAgIGlmICghcy0+YWFjcGx1c19oYW5kbGUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJjYW4ndCBvcGVuIGVuY29kZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8qIGNoZWNrIGFhY3BsdXMgdmVyc2lvbiAqLworICAgIGFhY3BsdXNfY2ZnID0gYWFjcGx1c0VuY0dldEN1cnJlbnRDb25maWd1cmF0aW9uKHMtPmFhY3BsdXNfaGFuZGxlKTsKKworICAgIGFhY3BsdXNfY2ZnLT5iaXRSYXRlID0gYXZjdHgtPmJpdF9yYXRlOworICAgIGFhY3BsdXNfY2ZnLT5iYW5kV2lkdGggPSBhdmN0eC0+Y3V0b2ZmOworICAgIGFhY3BsdXNfY2ZnLT5vdXRwdXRGb3JtYXQgPSAhKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfR0xPQkFMX0hFQURFUik7CisgICAgYWFjcGx1c19jZmctPmlucHV0Rm9ybWF0ID0gYXZjdHgtPnNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFQgPyBBQUNQTFVTX0lOUFVUX0ZMT0FUIDogQUFDUExVU19JTlBVVF8xNkJJVDsKKyAgICBpZiAoIWFhY3BsdXNFbmNTZXRDb25maWd1cmF0aW9uKHMtPmFhY3BsdXNfaGFuZGxlLCBhYWNwbHVzX2NmZykpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJsaWJhYWNwbHVzIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIG91dHB1dCBmb3JtYXQhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IHMtPnNhbXBsZXNfaW5wdXQgLyBhdmN0eC0+Y2hhbm5lbHM7CisKKyAgICAvKiBTZXQgZGVjb2RlciBzcGVjaWZpYyBpbmZvICovCisgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSB7CisKKyAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBkZWNvZGVyX3NwZWNpZmljX2luZm9fc2l6ZTsKKworICAgICAgICBpZiAoYWFjcGx1c0VuY0dldERlY29kZXJTcGVjaWZpY0luZm8ocy0+YWFjcGx1c19oYW5kbGUsICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlY29kZXJfc3BlY2lmaWNfaW5mb19zaXplKSA9PSAxKSB7CisgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jKGRlY29kZXJfc3BlY2lmaWNfaW5mb19zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSBkZWNvZGVyX3NwZWNpZmljX2luZm9fc2l6ZTsKKyAgICAgICAgICAgIG1lbWNweShhdmN0eC0+ZXh0cmFkYXRhLCBidWZmZXIsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYWNQbHVzX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgYWFjUGx1c0F1ZGlvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50MzJfdCAqaW5wdXRfYnVmZmVyID0gKGludDMyX3QgKilmcmFtZS0+ZGF0YVswXTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIHMtPm1heF9vdXRwdXRfYnl0ZXMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QtPnNpemUgPSBhYWNwbHVzRW5jRW5jb2RlKHMtPmFhY3BsdXNfaGFuZGxlLCBpbnB1dF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYW1wbGVzX2lucHV0LCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgKmdvdF9wYWNrZXQgICA9IDE7CisgICAgcGt0LT5wdHMgICAgICA9IGZyYW1lLT5wdHM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhYWNQbHVzX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYWFjUGx1c0F1ZGlvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmV4dHJhZGF0YSk7CisgICAgYWFjcGx1c0VuY0Nsb3NlKHMtPmFhY3BsdXNfaGFuZGxlKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZQcm9maWxlIHByb2ZpbGVzW10gPSB7CisgICAgeyBGRl9QUk9GSUxFX0FBQ19MT1csICJMQyIgfSwKKyAgICB7IEZGX1BST0ZJTEVfVU5LTk9XTiB9LAorfTsKKworQVZDb2RlYyBmZl9saWJhYWNwbHVzX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYmFhY3BsdXMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJhYWNwbHVzIEFBQysgKEFkdmFuY2VkIEF1ZGlvIENvZGVjIHdpdGggU0JSK1BTKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BQUMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKGFhY1BsdXNBdWRpb0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGFhY1BsdXNfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gYWFjUGx1c19lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gYWFjUGx1c19lbmNvZGVfY2xvc2UsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLnByb2ZpbGVzICAgICAgID0gcHJvZmlsZXMsCisgICAgLmNoYW5uZWxfbGF5b3V0cyA9IChjb25zdCB1aW50NjRfdFtdKSB7IEFWX0NIX0xBWU9VVF9NT05PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfU1RFUkVPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGliYXZjb2RlYy52IGIvZmZtcGVnL2xpYmF2Y29kZWMvbGliYXZjb2RlYy52Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjNjZDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJhdmNvZGVjLnYKQEAgLTAsMCArMSw3IEBACitMSUJBVkNPREVDXyRNQUpPUiB7CisgICAgICAgIGdsb2JhbDogYXYqOworICAgICAgICAgICAgICAgICNkZXByZWNhdGVkLCByZW1vdmUgYWZ0ZXIgbmV4dCBidW1wCisgICAgICAgICAgICAgICAgYXVkaW9fcmVzYW1wbGU7CisgICAgICAgICAgICAgICAgYXVkaW9fcmVzYW1wbGVfY2xvc2U7CisgICAgICAgIGxvY2FsOiAgKjsKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJjZWx0X2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGliY2VsdF9kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTYyZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGliY2VsdF9kZWMuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIFhpcGggQ0VMVCBkZWNvZGVyIHVzaW5nIGxpYmNlbHQKKyAqIENvcHlyaWdodCAoYykgMjAxMSBOaWNvbGFzIEdlb3JnZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8Y2VsdC9jZWx0Lmg+CisjaW5jbHVkZSA8Y2VsdC9jZWx0X2hlYWRlci5oPgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworc3RydWN0IGxpYmNlbHRfY29udGV4dCB7CisgICAgQ0VMVE1vZGUgKm1vZGU7CisgICAgQ0VMVERlY29kZXIgKmRlYzsKKyAgICBpbnQgZGlzY2FyZDsKK307CisKK3N0YXRpYyBpbnQgZmZfY2VsdF9lcnJvcl90b19hdmVycm9yKGludCBlcnIpCit7CisgICAgc3dpdGNoIChlcnIpIHsKKyAgICAgICAgY2FzZSBDRUxUX0JBRF9BUkc6ICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisjaWZkZWYgQ0VMVF9CVUZGRVJfVE9PX1NNQUxMCisgICAgICAgIGNhc2UgQ0VMVF9CVUZGRVJfVE9PX1NNQUxMOiByZXR1cm4gQVZFUlJPUihFTk9CVUZTKTsKKyNlbmRpZgorICAgICAgICBjYXNlIENFTFRfSU5URVJOQUxfRVJST1I6ICAgcmV0dXJuIEFWRVJST1IoRUZBVUxUKTsKKyAgICAgICAgY2FzZSBDRUxUX0NPUlJVUFRFRF9EQVRBOiAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBjYXNlIENFTFRfVU5JTVBMRU1FTlRFRDogICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyNpZmRlZiBFTk9UUkVDT1ZFUkFCTEUKKyAgICAgICAgY2FzZSBDRUxUX0lOVkFMSURfU1RBVEU6ICAgIHJldHVybiBBVkVSUk9SKEVOT1RSRUNPVkVSQUJMRSk7CisjZW5kaWYKKyAgICAgICAgY2FzZSBDRUxUX0FMTE9DX0ZBSUw6ICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KK30KKworc3RhdGljIGludCBmZl9jZWx0X2JpdHN0cmVhbV92ZXJzaW9uX2hhY2soQ0VMVE1vZGUgKm1vZGUpCit7CisgICAgQ0VMVEhlYWRlciBoZWFkZXIgPSB7IC52ZXJzaW9uX2lkID0gMCB9OworICAgIGNlbHRfaGVhZGVyX2luaXQoJmhlYWRlciwgbW9kZSwgOTYwLCAyKTsKKyAgICByZXR1cm4gaGVhZGVyLnZlcnNpb25faWQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJjZWx0X2RlY19pbml0KEFWQ29kZWNDb250ZXh0ICpjKQoreworICAgIHN0cnVjdCBsaWJjZWx0X2NvbnRleHQgKmNlbHQgPSBjLT5wcml2X2RhdGE7CisgICAgaW50IGVycjsKKworICAgIGlmICghYy0+Y2hhbm5lbHMgfHwgIWMtPmZyYW1lX3NpemUgfHwKKyAgICAgICAgYy0+ZnJhbWVfc2l6ZSA+IElOVF9NQVggLyBzaXplb2YoaW50MTZfdCkgLyBjLT5jaGFubmVscykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBjZWx0LT5tb2RlID0gY2VsdF9tb2RlX2NyZWF0ZShjLT5zYW1wbGVfcmF0ZSwgYy0+ZnJhbWVfc2l6ZSwgJmVycik7CisgICAgaWYgKCFjZWx0LT5tb2RlKQorICAgICAgICByZXR1cm4gZmZfY2VsdF9lcnJvcl90b19hdmVycm9yKGVycik7CisgICAgY2VsdC0+ZGVjID0gY2VsdF9kZWNvZGVyX2NyZWF0ZV9jdXN0b20oY2VsdC0+bW9kZSwgYy0+Y2hhbm5lbHMsICZlcnIpOworICAgIGlmICghY2VsdC0+ZGVjKSB7CisgICAgICAgIGNlbHRfbW9kZV9kZXN0cm95KGNlbHQtPm1vZGUpOworICAgICAgICByZXR1cm4gZmZfY2VsdF9lcnJvcl90b19hdmVycm9yKGVycik7CisgICAgfQorICAgIGlmIChjLT5leHRyYWRhdGFfc2l6ZSA+PSA0KSB7CisgICAgICAgIGNlbHQtPmRpc2NhcmQgPSBBVl9STDMyKGMtPmV4dHJhZGF0YSk7CisgICAgICAgIGlmIChjZWx0LT5kaXNjYXJkIDwgMCB8fCBjZWx0LT5kaXNjYXJkID49IGMtPmZyYW1lX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdmVybGFwICglZCksIGlnbm9yZWQuXG4iLCBjZWx0LT5kaXNjYXJkKTsKKyAgICAgICAgICAgIGNlbHQtPmRpc2NhcmQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjLT5leHRyYWRhdGFfc2l6ZSA+PSA4KSB7CisgICAgICAgIHVuc2lnbmVkIHZlcnNpb24gPSBBVl9STDMyKGMtPmV4dHJhZGF0YSArIDQpOworICAgICAgICB1bnNpZ25lZCBsaWJfdmVyc2lvbiA9IGZmX2NlbHRfYml0c3RyZWFtX3ZlcnNpb25faGFjayhjZWx0LT5tb2RlKTsKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gbGliX3ZlcnNpb24pCisgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkNFTFQgYml0c3RyZWFtIHZlcnNpb24gMHgleCBtYXkgYmUgIgorICAgICAgICAgICAgICAgICAgICJpbXByb3Blcmx5IGRlY29kZWQgYnkgbGliY2VsdCBmb3IgdmVyc2lvbiAweCV4LlxuIiwKKyAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLCBsaWJfdmVyc2lvbik7CisgICAgfQorICAgIGMtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYmNlbHRfZGVjX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICpjKQoreworICAgIHN0cnVjdCBsaWJjZWx0X2NvbnRleHQgKmNlbHQgPSBjLT5wcml2X2RhdGE7CisKKyAgICBjZWx0X2RlY29kZXJfZGVzdHJveShjZWx0LT5kZWMpOworICAgIGNlbHRfbW9kZV9kZXN0cm95KGNlbHQtPm1vZGUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpYmNlbHRfZGVjX2RlY29kZShBVkNvZGVjQ29udGV4dCAqYywgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBzdHJ1Y3QgbGliY2VsdF9jb250ZXh0ICpjZWx0ID0gYy0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgZXJyOworICAgIGludDE2X3QgKnBjbTsKKworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gYy0+ZnJhbWVfc2l6ZTsKKyAgICBpZiAoKGVyciA9IGZmX2dldF9idWZmZXIoYywgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisgICAgcGNtID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKyAgICBlcnIgPSBjZWx0X2RlY29kZShjZWx0LT5kZWMsIHBrdC0+ZGF0YSwgcGt0LT5zaXplLCBwY20sIGMtPmZyYW1lX3NpemUpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZmZfY2VsdF9lcnJvcl90b19hdmVycm9yKGVycik7CisgICAgaWYgKGNlbHQtPmRpc2NhcmQpIHsKKyAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgLT0gY2VsdC0+ZGlzY2FyZDsKKyAgICAgICAgbWVtbW92ZShwY20sIHBjbSArIGNlbHQtPmRpc2NhcmQgKiBjLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyAqIGMtPmNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgY2VsdC0+ZGlzY2FyZCA9IDA7CisgICAgfQorICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKyAgICByZXR1cm4gcGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX2xpYmNlbHRfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGliY2VsdCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlhpcGggQ0VMVCBkZWNvZGVyIHVzaW5nIGxpYmNlbHQiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQ0VMVCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGxpYmNlbHRfY29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbGliY2VsdF9kZWNfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBsaWJjZWx0X2RlY19jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBsaWJjZWx0X2RlY19kZWNvZGUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJmYWFjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJmYWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljMTg2YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYmZhYWMuYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIEludGVyZmFjZSB0byBsaWJmYWFjIGZvciBhYWMgZW5jb2RpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwMiBHaWxkYXMgQmF6aW4gPGdiYXppbkBuZXRjb3Vycmllci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEludGVyZmFjZSB0byBsaWJmYWFjIGZvciBhYWMgZW5jb2RpbmcuCisgKi8KKworI2luY2x1ZGUgPGZhYWMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYXVkaW9fZnJhbWVfcXVldWUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKKy8qIGxpYmZhYWMgaGFzIGFuIGVuY29kZXIgZGVsYXkgb2YgMTAyNCBzYW1wbGVzICovCisjZGVmaW5lIEZBQUNfREVMQVlfU0FNUExFUyAxMDI0CisKK3R5cGVkZWYgc3RydWN0IEZhYWNBdWRpb0NvbnRleHQgeworICAgIGZhYWNFbmNIYW5kbGUgZmFhY19oYW5kbGU7CisgICAgQXVkaW9GcmFtZVF1ZXVlIGFmcTsKK30gRmFhY0F1ZGlvQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IEZhYWNfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGYWFjQXVkaW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBmZl9hZl9xdWV1ZV9jbG9zZSgmcy0+YWZxKTsKKworICAgIGlmIChzLT5mYWFjX2hhbmRsZSkKKyAgICAgICAgZmFhY0VuY0Nsb3NlKHMtPmZhYWNfaGFuZGxlKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgaW50IGNoYW5uZWxfbWFwc1tdWzZdID0geworICAgIHsgMiwgMCwgMSB9LCAgICAgICAgICAvLzwgQyBMIFIKKyAgICB7IDIsIDAsIDEsIDMgfSwgICAgICAgLy88IEMgTCBSIENzCisgICAgeyAyLCAwLCAxLCAzLCA0IH0sICAgIC8vPCBDIEwgUiBMcyBScworICAgIHsgMiwgMCwgMSwgNCwgNSwgMyB9LCAvLzwgQyBMIFIgTHMgUnMgTEZFCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgRmFhY19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRmFhY0F1ZGlvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZmFhY0VuY0NvbmZpZ3VyYXRpb25QdHIgZmFhY19jZmc7CisgICAgdW5zaWduZWQgbG9uZyBzYW1wbGVzX2lucHV0LCBtYXhfYnl0ZXNfb3V0cHV0OworICAgIGludCByZXQ7CisKKyAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDwgMSB8fCBhdmN0eC0+Y2hhbm5lbHMgPiA2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5jb2RpbmcgJWQgY2hhbm5lbChzKSBpcyBub3QgYWxsb3dlZFxuIiwgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHMtPmZhYWNfaGFuZGxlID0gZmFhY0VuY09wZW4oYXZjdHgtPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZXNfaW5wdXQsICZtYXhfYnl0ZXNfb3V0cHV0KTsKKyAgICBpZiAoIXMtPmZhYWNfaGFuZGxlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgaW4gZmFhY0VuY09wZW4oKVxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBjaGVjayBmYWFjIHZlcnNpb24gKi8KKyAgICBmYWFjX2NmZyA9IGZhYWNFbmNHZXRDdXJyZW50Q29uZmlndXJhdGlvbihzLT5mYWFjX2hhbmRsZSk7CisgICAgaWYgKGZhYWNfY2ZnLT52ZXJzaW9uICE9IEZBQUNfQ0ZHX1ZFUlNJT04pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3cm9uZyBsaWJmYWFjIHZlcnNpb24gKGNvbXBpbGVkIGZvcjogJWQsIHVzaW5nICVkKVxuIiwgRkFBQ19DRkdfVkVSU0lPTiwgZmFhY19jZmctPnZlcnNpb24pOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogcHV0IHRoZSBvcHRpb25zIGluIHRoZSBjb25maWd1cmF0aW9uIHN0cnVjdCAqLworICAgIHN3aXRjaChhdmN0eC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfQUFDX01BSU46CisgICAgICAgICAgICBmYWFjX2NmZy0+YWFjT2JqZWN0VHlwZSA9IE1BSU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX1VOS05PV046CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9BQUNfTE9XOgorICAgICAgICAgICAgZmFhY19jZmctPmFhY09iamVjdFR5cGUgPSBMT1c7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0FBQ19TU1I6CisgICAgICAgICAgICBmYWFjX2NmZy0+YWFjT2JqZWN0VHlwZSA9IFNTUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfQUFDX0xUUDoKKyAgICAgICAgICAgIGZhYWNfY2ZnLT5hYWNPYmplY3RUeXBlID0gTFRQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgQUFDIHByb2ZpbGVcbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgZmFhY19jZmctPm1wZWdWZXJzaW9uID0gTVBFRzQ7CisgICAgZmFhY19jZmctPnVzZVRucyA9IDA7CisgICAgZmFhY19jZmctPmFsbG93TWlkc2lkZSA9IDE7CisgICAgZmFhY19jZmctPmJpdFJhdGUgPSBhdmN0eC0+Yml0X3JhdGUgLyBhdmN0eC0+Y2hhbm5lbHM7CisgICAgZmFhY19jZmctPmJhbmRXaWR0aCA9IGF2Y3R4LT5jdXRvZmY7CisgICAgaWYoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpIHsKKyAgICAgICAgZmFhY19jZmctPmJpdFJhdGUgPSAwOworICAgICAgICBmYWFjX2NmZy0+cXVhbnRxdWFsID0gYXZjdHgtPmdsb2JhbF9xdWFsaXR5IC8gRkZfUVAyTEFNQkRBOworICAgIH0KKyAgICBmYWFjX2NmZy0+b3V0cHV0Rm9ybWF0ID0gMTsKKyAgICBmYWFjX2NmZy0+aW5wdXRGb3JtYXQgPSBGQUFDX0lOUFVUXzE2QklUOworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiAyKQorICAgICAgICBtZW1jcHkoZmFhY19jZmctPmNoYW5uZWxfbWFwLCBjaGFubmVsX21hcHNbYXZjdHgtPmNoYW5uZWxzLTNdLAorICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICogc2l6ZW9mKGludCkpOworCisgICAgYXZjdHgtPmZyYW1lX3NpemUgPSBzYW1wbGVzX2lucHV0IC8gYXZjdHgtPmNoYW5uZWxzOworCisgICAgLyogU2V0IGRlY29kZXIgc3BlY2lmaWMgaW5mbyAqLworICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikgeworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZGVjb2Rlcl9zcGVjaWZpY19pbmZvX3NpemU7CisKKyAgICAgICAgaWYgKCFmYWFjRW5jR2V0RGVjb2RlclNwZWNpZmljSW5mbyhzLT5mYWFjX2hhbmRsZSwgJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVjb2Rlcl9zcGVjaWZpY19pbmZvX3NpemUpKSB7CisgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jKGRlY29kZXJfc3BlY2lmaWNfaW5mb19zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IGRlY29kZXJfc3BlY2lmaWNfaW5mb19zaXplOworICAgICAgICAgICAgbWVtY3B5KGF2Y3R4LT5leHRyYWRhdGEsIGJ1ZmZlciwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGZhYWNfY2ZnLT5vdXRwdXRGb3JtYXQgPSAwOworICAgICAgICB9CisgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICB9CisKKyAgICBpZiAoIWZhYWNFbmNTZXRDb25maWd1cmF0aW9uKHMtPmZhYWNfaGFuZGxlLCBmYWFjX2NmZykpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IGF2Y3R4LT5iaXRfcmF0ZS8xMDAwOyBpIDsgaS0tKSB7CisgICAgICAgICAgICBmYWFjX2NmZy0+Yml0UmF0ZSA9IDEwMDAqaSAvIGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgICAgIGlmIChmYWFjRW5jU2V0Q29uZmlndXJhdGlvbihzLT5mYWFjX2hhbmRsZSwgZmFhY19jZmcpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghaSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJsaWJmYWFjIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIG91dHB1dCBmb3JtYXQhXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdmN0eC0+Yml0X3JhdGUgPSAxMDAwKmk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAibGliZmFhYyBkb2Vzbid0IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBiaXRyYXRlLCB1c2luZyAlZGtiaXQvcyBpbnN0ZWFkXG4iLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2Y3R4LT5pbml0aWFsX3BhZGRpbmcgPSBGQUFDX0RFTEFZX1NBTVBMRVM7CisgICAgZmZfYWZfcXVldWVfaW5pdChhdmN0eCwgJnMtPmFmcSk7CisKKyAgICByZXR1cm4gMDsKK2Vycm9yOgorICAgIEZhYWNfZW5jb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IEZhYWNfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBGYWFjQXVkaW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgYnl0ZXNfd3JpdHRlbiwgcmV0OworICAgIGludCBudW1fc2FtcGxlcyAgPSBmcmFtZSA/IGZyYW1lLT5uYl9zYW1wbGVzIDogMDsKKyAgICB2b2lkICpzYW1wbGVzICAgID0gZnJhbWUgPyBmcmFtZS0+ZGF0YVswXSAgICA6IE5VTEw7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCAoNyArIDc2OCkgKiBhdmN0eC0+Y2hhbm5lbHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBieXRlc193cml0dGVuID0gZmFhY0VuY0VuY29kZShzLT5mYWFjX2hhbmRsZSwgc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2FtcGxlcyAqIGF2Y3R4LT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIGlmIChieXRlc193cml0dGVuIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImZhYWNFbmNFbmNvZGUoKSBlcnJvclxuIik7CisgICAgICAgIHJldHVybiBieXRlc193cml0dGVuOworICAgIH0KKworICAgIC8qIGFkZCBjdXJyZW50IGZyYW1lIHRvIHRoZSBxdWV1ZSAqLworICAgIGlmIChmcmFtZSkgeworICAgICAgICBpZiAoKHJldCA9IGZmX2FmX3F1ZXVlX2FkZCgmcy0+YWZxLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKCFieXRlc193cml0dGVuKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIEdldCB0aGUgbmV4dCBmcmFtZSBwdHMvZHVyYXRpb24gKi8KKyAgICBmZl9hZl9xdWV1ZV9yZW1vdmUoJnMtPmFmcSwgYXZjdHgtPmZyYW1lX3NpemUsICZhdnBrdC0+cHRzLAorICAgICAgICAgICAgICAgICAgICAgICAmYXZwa3QtPmR1cmF0aW9uKTsKKworICAgIGF2cGt0LT5zaXplID0gYnl0ZXNfd3JpdHRlbjsKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZQcm9maWxlIHByb2ZpbGVzW10gPSB7CisgICAgeyBGRl9QUk9GSUxFX0FBQ19NQUlOLCAiTWFpbiIgfSwKKyAgICB7IEZGX1BST0ZJTEVfQUFDX0xPVywgICJMQyIgICB9LAorICAgIHsgRkZfUFJPRklMRV9BQUNfU1NSLCAgIlNTUiIgIH0sCisgICAgeyBGRl9QUk9GSUxFX0FBQ19MVFAsICAiTFRQIiAgfSwKKyAgICB7IEZGX1BST0ZJTEVfVU5LTk9XTiB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGZhYWNfY2hhbm5lbF9sYXlvdXRzW10gPSB7CisgICAgQVZfQ0hfTEFZT1VUX01PTk8sCisgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywKKyAgICBBVl9DSF9MQVlPVVRfU1VSUk9VTkQsCisgICAgQVZfQ0hfTEFZT1VUXzRQT0lOVDAsCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDBfQkFDSywKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLLAorICAgIDAKK307CisKK0FWQ29kZWMgZmZfbGliZmFhY19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJmYWFjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGliZmFhYyBBQUMgKEFkdmFuY2VkIEF1ZGlvIENvZGluZykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGYWFjQXVkaW9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBGYWFjX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IEZhYWNfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IEZhYWNfZW5jb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FIHwgQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLnByb2ZpbGVzICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwocHJvZmlsZXMpLAorICAgIC5jaGFubmVsX2xheW91dHMgPSBmYWFjX2NoYW5uZWxfbGF5b3V0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJmZGstYWFjZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJmZGstYWFjZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjZDk1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYmZkay1hYWNkZWMuYwpAQCAtMCwwICsxLDQwOSBAQAorLyoKKyAqIEFBQyBkZWNvZGVyIHdyYXBwZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8ZmRrLWFhYy9hYWNkZWNvZGVyX2xpYi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyogVGhlIHZlcnNpb24gbWFjcm8gaXMgaW50cm9kdWNlZCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBzZXR0aW5nIGVudW0gd2FzCisgKiBjaGFuZ2VkLCBzbyB0aGlzIGNoZWNrIHNob3VsZCBzdWZmaWNlLiAqLworI2lmbmRlZiBBQUNERUNPREVSX0xJQl9WTDAKKyNkZWZpbmUgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxTCisjZW5kaWYKKworZW51bSBDb25jZWFsTWV0aG9kIHsKKyAgICBDT05DRUFMX01FVEhPRF9TUEVDVFJBTF9NVVRJTkcgICAgICA9ICAwLAorICAgIENPTkNFQUxfTUVUSE9EX05PSVNFX1NVQlNUSVRVVElPTiAgID0gIDEsCisgICAgQ09OQ0VBTF9NRVRIT0RfRU5FUkdZX0lOVEVSUE9MQVRJT04gPSAgMiwKKyAgICBDT05DRUFMX01FVEhPRF9OQiwKK307CisKK3R5cGVkZWYgc3RydWN0IEZES0FBQ0RlY0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZTsKKyAgICBpbnQgaW5pdGlhbGl6ZWQ7CisgICAgdWludDhfdCAqZGVjb2Rlcl9idWZmZXI7CisgICAgdWludDhfdCAqYW5jX2J1ZmZlcjsKKyAgICBlbnVtIENvbmNlYWxNZXRob2QgY29uY2VhbF9tZXRob2Q7CisgICAgaW50IGRyY19sZXZlbDsKKyAgICBpbnQgZHJjX2Jvb3N0OworICAgIGludCBkcmNfaGVhdnk7CisgICAgaW50IGRyY19jdXQ7Cit9IEZES0FBQ0RlY0NvbnRleHQ7CisKKworI2RlZmluZSBETVhfQU5DX0JVRkZTSVpFICAgICAgIDEyOAorI2RlZmluZSBERUNPREVSX01BWF9DSEFOTkVMUyAgICAgNgorI2RlZmluZSBERUNPREVSX0JVRkZTSVpFICAgICAgMjA0OCAqIHNpemVvZihJTlRfUENNKQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGREtBQUNEZWNDb250ZXh0LCB4KQorI2RlZmluZSBBRCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZmRrX2FhY19kZWNfb3B0aW9uc1tdID0geworICAgIHsgImNvbmNlYWwiLCAiRXJyb3IgY29uY2VhbG1lbnQgbWV0aG9kIiwgT0ZGU0VUKGNvbmNlYWxfbWV0aG9kKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBDT05DRUFMX01FVEhPRF9OT0lTRV9TVUJTVElUVVRJT04gfSwgQ09OQ0VBTF9NRVRIT0RfU1BFQ1RSQUxfTVVUSU5HLCBDT05DRUFMX01FVEhPRF9OQiAtIDEsIEFELCAiY29uY2VhbCIgfSwKKyAgICB7ICJzcGVjdHJhbCIsICJTcGVjdHJhbCBtdXRpbmciLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBDT05DRUFMX01FVEhPRF9TUEVDVFJBTF9NVVRJTkcgfSwgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBBRCwgImNvbmNlYWwiIH0sCisgICAgeyAibm9pc2UiLCAgICAiTm9pc2UgU3Vic3RpdHV0aW9uIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ09OQ0VBTF9NRVRIT0RfTk9JU0VfU1VCU1RJVFVUSU9OIH0sICAgSU5UX01JTiwgSU5UX01BWCwgQUQsICJjb25jZWFsIiB9LAorICAgIHsgImVuZXJneSIsICAgIkVuZXJneSBJbnRlcnBvbGF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENPTkNFQUxfTUVUSE9EX0VORVJHWV9JTlRFUlBPTEFUSU9OIH0sIElOVF9NSU4sIElOVF9NQVgsIEFELCAiY29uY2VhbCIgfSwKKyAgICB7ICJkcmNfYm9vc3QiLCAiRHluYW1pYyBSYW5nZSBDb250cm9sOiBib29zdCwgd2hlcmUgWzBdIGlzIG5vbmUgYW5kIFsxMjddIGlzIG1heCBib29zdCIsCisgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZHJjX2Jvb3N0KSwgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gLTEgfSwgLTEsIDEyNywgQUQsIE5VTEwgICAgfSwKKyAgICB7ICJkcmNfY3V0IiwgICAiRHluYW1pYyBSYW5nZSBDb250cm9sOiBhdHRlbnVhdGlvbiBmYWN0b3IsIHdoZXJlIFswXSBpcyBub25lIGFuZCBbMTI3XSBpcyBtYXggY29tcHJlc3Npb24iLAorICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGRyY19jdXQpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IC0xIH0sIC0xLCAxMjcsIEFELCBOVUxMICAgIH0sCisgICAgeyAiZHJjX2xldmVsIiwgIkR5bmFtaWMgUmFuZ2UgQ29udHJvbDogcmVmZXJlbmNlIGxldmVsLCBxdWFudGl6ZWQgdG8gMC4yNWRCIHN0ZXBzIHdoZXJlIFswXSBpcyAwZEIgYW5kIFsxMjddIGlzIC0zMS43NWRCIiwKKyAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChkcmNfbGV2ZWwpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAtMX0sICAtMSwgMTI3LCBBRCwgTlVMTCAgICB9LAorICAgIHsgImRyY19oZWF2eSIsICJEeW5hbWljIFJhbmdlIENvbnRyb2w6IGhlYXZ5IGNvbXByZXNzaW9uLCB3aGVyZSBbMV0gaXMgb24gKFJGIG1vZGUpIGFuZCBbMF0gaXMgb2ZmIiwKKyAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChkcmNfaGVhdnkpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAtMX0sICAtMSwgMSwgICBBRCwgTlVMTCAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmZGtfYWFjX2RlY19jbGFzcyA9IHsKKyAgICAibGliZmRrLWFhYyBkZWNvZGVyIiwgYXZfZGVmYXVsdF9pdGVtX25hbWUsIGZka19hYWNfZGVjX29wdGlvbnMsIExJQkFWVVRJTF9WRVJTSU9OX0lOVAorfTsKKworc3RhdGljIGludCBnZXRfc3RyZWFtX2luZm8oQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZES0FBQ0RlY0NvbnRleHQgKnMgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQ1N0cmVhbUluZm8gKmluZm8gICAgID0gYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKHMtPmhhbmRsZSk7CisgICAgaW50IGNoYW5uZWxfY291bnRzWzB4MjRdID0geyAwIH07CisgICAgaW50IGksIGNoX2Vycm9yICAgICAgID0gMDsKKyAgICB1aW50NjRfdCBjaF9sYXlvdXQgICAgPSAwOworCisgICAgaWYgKCFpbmZvKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGdldCBzdHJlYW0gaW5mb1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaWYgKGluZm8tPnNhbXBsZVJhdGUgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlN0cmVhbSBpbmZvIG5vdCBpbml0aWFsaXplZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IGluZm8tPnNhbXBsZVJhdGU7CisgICAgYXZjdHgtPmZyYW1lX3NpemUgID0gaW5mby0+ZnJhbWVTaXplOworCisgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPm51bUNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGN0eXBlID0gaW5mby0+cENoYW5uZWxUeXBlW2ldOworICAgICAgICBpZiAoY3R5cGUgPD0gQUNUX05PTkUgfHwgY3R5cGUgPiBGRl9BUlJBWV9FTEVNUyhjaGFubmVsX2NvdW50cykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJ1bmtub3duIGNoYW5uZWwgdHlwZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjaGFubmVsX2NvdW50c1tjdHlwZV0rKzsKKyAgICB9CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICIlZCBjaGFubmVscyAtIGZyb250OiVkIHNpZGU6JWQgYmFjazolZCBsZmU6JWQgdG9wOiVkXG4iLAorICAgICAgICAgICBpbmZvLT5udW1DaGFubmVscywKKyAgICAgICAgICAgY2hhbm5lbF9jb3VudHNbQUNUX0ZST05UXSwgY2hhbm5lbF9jb3VudHNbQUNUX1NJREVdLAorICAgICAgICAgICBjaGFubmVsX2NvdW50c1tBQ1RfQkFDS10sICBjaGFubmVsX2NvdW50c1tBQ1RfTEZFXSwKKyAgICAgICAgICAgY2hhbm5lbF9jb3VudHNbQUNUX0ZST05UX1RPUF0gKyBjaGFubmVsX2NvdW50c1tBQ1RfU0lERV9UT1BdICsKKyAgICAgICAgICAgY2hhbm5lbF9jb3VudHNbQUNUX0JBQ0tfVE9QXSAgKyBjaGFubmVsX2NvdW50c1tBQ1RfVE9QXSk7CisKKyAgICBzd2l0Y2ggKGNoYW5uZWxfY291bnRzW0FDVF9GUk9OVF0pIHsKKyAgICBjYXNlIDQ6CisgICAgICAgIGNoX2xheW91dCB8PSBBVl9DSF9MQVlPVVRfU1RFUkVPIHwgQVZfQ0hfRlJPTlRfTEVGVF9PRl9DRU5URVIgfAorICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGNoX2xheW91dCB8PSBBVl9DSF9MQVlPVVRfU1RFUkVPIHwgQVZfQ0hfRlJPTlRfQ0VOVEVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGNoX2xheW91dCB8PSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGNoX2xheW91dCB8PSBBVl9DSF9GUk9OVF9DRU5URVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGZyb250IGNoYW5uZWxzOiAlZFxuIiwKKyAgICAgICAgICAgICAgIGNoYW5uZWxfY291bnRzW0FDVF9GUk9OVF0pOworICAgICAgICBjaF9lcnJvciA9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY2hhbm5lbF9jb3VudHNbQUNUX1NJREVdID4gMCkgeworICAgICAgICBpZiAoY2hhbm5lbF9jb3VudHNbQUNUX1NJREVdID09IDIpIHsKKyAgICAgICAgICAgIGNoX2xheW91dCB8PSBBVl9DSF9TSURFX0xFRlQgfCBBVl9DSF9TSURFX1JJR0hUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHNpZGUgY2hhbm5lbHM6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY291bnRzW0FDVF9TSURFXSk7CisgICAgICAgICAgICBjaF9lcnJvciA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNoYW5uZWxfY291bnRzW0FDVF9CQUNLXSA+IDApIHsKKyAgICAgICAgc3dpdGNoIChjaGFubmVsX2NvdW50c1tBQ1RfQkFDS10pIHsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgY2hfbGF5b3V0IHw9IEFWX0NIX0JBQ0tfTEVGVCB8IEFWX0NIX0JBQ0tfUklHSFQgfCBBVl9DSF9CQUNLX0NFTlRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjaF9sYXlvdXQgfD0gQVZfQ0hfQkFDS19MRUZUIHwgQVZfQ0hfQkFDS19SSUdIVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaF9sYXlvdXQgfD0gQVZfQ0hfQkFDS19DRU5URVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIG51bWJlciBvZiBiYWNrIGNoYW5uZWxzOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NvdW50c1tBQ1RfQkFDS10pOworICAgICAgICAgICAgY2hfZXJyb3IgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNoYW5uZWxfY291bnRzW0FDVF9MRkVdID4gMCkgeworICAgICAgICBpZiAoY2hhbm5lbF9jb3VudHNbQUNUX0xGRV0gPT0gMSkgeworICAgICAgICAgICAgY2hfbGF5b3V0IHw9IEFWX0NIX0xPV19GUkVRVUVOQ1k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBudW1iZXIgb2YgTEZFIGNoYW5uZWxzOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NvdW50c1tBQ1RfTEZFXSk7CisgICAgICAgICAgICBjaF9lcnJvciA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFjaF9lcnJvciAmJgorICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoY2hfbGF5b3V0KSAhPSBpbmZvLT5udW1DaGFubmVscykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAidW5zdXBwb3J0ZWQgY2hhbm5lbCBjb25maWd1cmF0aW9uXG4iKTsKKyAgICAgICAgY2hfZXJyb3IgPSAxOworICAgIH0KKyAgICBpZiAoY2hfZXJyb3IpCisgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IDA7CisgICAgZWxzZQorICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBjaF9sYXlvdXQ7CisKKyAgICBhdmN0eC0+Y2hhbm5lbHMgPSBpbmZvLT5udW1DaGFubmVsczsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZmRrX2FhY19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZES0FBQ0RlY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKHMtPmhhbmRsZSkKKyAgICAgICAgYWFjRGVjb2Rlcl9DbG9zZShzLT5oYW5kbGUpOworICAgIGF2X2ZyZWVwKCZzLT5kZWNvZGVyX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPmFuY19idWZmZXIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBmZGtfYWFjX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGREtBQUNEZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBQUNfREVDT0RFUl9FUlJPUiBlcnI7CisgICAgaW50IHJldDsKKworICAgIHMtPmhhbmRsZSA9IGFhY0RlY29kZXJfT3BlbihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPyBUVF9NUDRfUkFXIDogVFRfTVA0X0FEVFMsIDEpOworICAgIGlmICghcy0+aGFuZGxlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igb3BlbmluZyBkZWNvZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgIGlmICgoZXJyID0gYWFjRGVjb2Rlcl9Db25maWdSYXcocy0+aGFuZGxlLCAmYXZjdHgtPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZjdHgtPmV4dHJhZGF0YV9zaXplKSkgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gc2V0IGV4dHJhZGF0YVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZXJyID0gYWFjRGVjb2Rlcl9TZXRQYXJhbShzLT5oYW5kbGUsIEFBQ19DT05DRUFMX01FVEhPRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29uY2VhbF9tZXRob2QpKSAhPSBBQUNfREVDX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNldCBlcnJvciBjb25jZWFsbWVudCBtZXRob2RcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCA+IDAgJiYKKyAgICAgICAgYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgIT0gQVZfQ0hfTEFZT1VUX05BVElWRSkgeworICAgICAgICBpbnQgZG93bm1peF9jaGFubmVscyA9IC0xOworCisgICAgICAgIHN3aXRjaCAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfU1RFUkVPOgorICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF9TVEVSRU9fRE9XTk1JWDoKKyAgICAgICAgICAgIGRvd25taXhfY2hhbm5lbHMgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUX01PTk86CisgICAgICAgICAgICBkb3dubWl4X2NoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgcmVxdWVzdF9jaGFubmVsX2xheW91dFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb3dubWl4X2NoYW5uZWxzICE9IC0xKSB7CisgICAgICAgICAgICBpZiAoYWFjRGVjb2Rlcl9TZXRQYXJhbShzLT5oYW5kbGUsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfY2hhbm5lbHMpICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJVbmFibGUgdG8gc2V0IG91dHB1dCBjaGFubmVscyBpbiB0aGUgZGVjb2RlclxuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgcy0+YW5jX2J1ZmZlciA9IGF2X21hbGxvYyhETVhfQU5DX0JVRkZTSVpFKTsKKyAgICAgICAgICAgICAgIGlmICghcy0+YW5jX2J1ZmZlcikgeworICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGFuY2lsbGFyeSBidWZmZXIgZm9yIHRoZSBkZWNvZGVyXG4iKTsKKyAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaWYgKGFhY0RlY29kZXJfQW5jRGF0YUluaXQocy0+aGFuZGxlLCBzLT5hbmNfYnVmZmVyLCBETVhfQU5DX0JVRkZTSVpFKSkgeworICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGRvd25taXggYW5jaWxsYXJ5IGJ1ZmZlciBpbiB0aGUgZGVjb2RlclxuIik7CisgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5kcmNfYm9vc3QgIT0gLTEpIHsKKyAgICAgICAgaWYgKGFhY0RlY29kZXJfU2V0UGFyYW0ocy0+aGFuZGxlLCBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgcy0+ZHJjX2Jvb3N0KSAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBzZXQgRFJDIGJvb3N0IGZhY3RvciBpbiB0aGUgZGVjb2RlclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPmRyY19jdXQgIT0gLTEpIHsKKyAgICAgICAgaWYgKGFhY0RlY29kZXJfU2V0UGFyYW0ocy0+aGFuZGxlLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgcy0+ZHJjX2N1dCkgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gc2V0IERSQyBhdHRlbnVhdGlvbiBmYWN0b3IgaW4gdGhlIGRlY29kZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5kcmNfbGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgaWYgKGFhY0RlY29kZXJfU2V0UGFyYW0ocy0+aGFuZGxlLCBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCwgcy0+ZHJjX2xldmVsKSAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBzZXQgRFJDIHJlZmVyZW5jZSBsZXZlbCBpbiB0aGUgZGVjb2RlclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPmRyY19oZWF2eSAhPSAtMSkgeworICAgICAgICBpZiAoYWFjRGVjb2Rlcl9TZXRQYXJhbShzLT5oYW5kbGUsIEFBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04sIHMtPmRyY19oZWF2eSkgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gc2V0IERSQyBoZWF2eSBjb21wcmVzc2lvbiBpbiB0aGUgZGVjb2RlclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBmZGtfYWFjX2RlY29kZV9jbG9zZShhdmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmZGtfYWFjX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEZES0FBQ0RlY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcmV0OworICAgIEFBQ19ERUNPREVSX0VSUk9SIGVycjsKKyAgICBVSU5UIHZhbGlkID0gYXZwa3QtPnNpemU7CisgICAgdWludDhfdCAqYnVmLCAqdG1wcHRyID0gTlVMTDsKKyAgICBpbnQgYnVmX3NpemU7CisKKyAgICBlcnIgPSBhYWNEZWNvZGVyX0ZpbGwocy0+aGFuZGxlLCAmYXZwa3QtPmRhdGEsICZhdnBrdC0+c2l6ZSwgJnZhbGlkKTsKKyAgICBpZiAoZXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJhYWNEZWNvZGVyX0ZpbGwoKSBmYWlsZWQ6ICV4XG4iLCBlcnIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAocy0+aW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBhdmN0eC0+ZnJhbWVfc2l6ZTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKHMtPmFuY19idWZmZXIpIHsKKyAgICAgICAgICAgIGJ1Zl9zaXplID0gREVDT0RFUl9CVUZGU0laRSAqIERFQ09ERVJfTUFYX0NIQU5ORUxTOworICAgICAgICAgICAgYnVmID0gcy0+ZGVjb2Rlcl9idWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYgPSBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVswXTsKKyAgICAgICAgICAgIGJ1Zl9zaXplID0gYXZjdHgtPmNoYW5uZWxzICogZnJhbWUtPm5iX3NhbXBsZXMgKgorICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShhdmN0eC0+c2FtcGxlX2ZtdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBidWZfc2l6ZSA9IERFQ09ERVJfQlVGRlNJWkUgKiBERUNPREVSX01BWF9DSEFOTkVMUzsKKworICAgICAgICBpZiAoIXMtPmRlY29kZXJfYnVmZmVyKQorICAgICAgICAgICAgcy0+ZGVjb2Rlcl9idWZmZXIgPSBhdl9tYWxsb2MoYnVmX3NpemUpOworICAgICAgICBpZiAoIXMtPmRlY29kZXJfYnVmZmVyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBidWYgPSB0bXBwdHIgPSBzLT5kZWNvZGVyX2J1ZmZlcjsKKyAgICB9CisKKyAgICBlcnIgPSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKHMtPmhhbmRsZSwgKElOVF9QQ00gKikgYnVmLCBidWZfc2l6ZSwgMCk7CisgICAgaWYgKGVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgeworICAgICAgICByZXQgPSBhdnBrdC0+c2l6ZSAtIHZhbGlkOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKGVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKSBmYWlsZWQ6ICV4XG4iLCBlcnIpOworICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmICghcy0+aW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKChyZXQgPSBnZXRfc3RyZWFtX2luZm8oYXZjdHgpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgcy0+aW5pdGlhbGl6ZWQgPSAxOworICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IGF2Y3R4LT5mcmFtZV9zaXplOworICAgIH0KKworICAgIGlmICh0bXBwdHIpIHsKKyAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBhdmN0eC0+ZnJhbWVfc2l6ZTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZiAocy0+ZGVjb2Rlcl9idWZmZXIpIHsKKyAgICAgICAgbWVtY3B5KGZyYW1lLT5leHRlbmRlZF9kYXRhWzBdLCBidWYsCisgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgKiBhdmN0eC0+ZnJhbWVfc2l6ZSAqCisgICAgICAgICAgICAgICBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShhdmN0eC0+c2FtcGxlX2ZtdCkpOworCisgICAgICAgIGlmICghcy0+YW5jX2J1ZmZlcikKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5kZWNvZGVyX2J1ZmZlcik7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworICAgIHJldCA9IGF2cGt0LT5zaXplIC0gdmFsaWQ7CisKK2VuZDoKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGZka19hYWNfZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGREtBQUNEZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBQUNfREVDT0RFUl9FUlJPUiBlcnI7CisKKyAgICBpZiAoIXMtPmhhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKChlcnIgPSBhYWNEZWNvZGVyX1NldFBhcmFtKHMtPmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiwgMSkpICE9IEFBQ19ERUNfT0spCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJmYWlsZWQgdG8gY2xlYXIgYnVmZmVyIHdoZW4gZmx1c2hpbmdcbiIpOworfQorCitBVkNvZGVjIGZmX2xpYmZka19hYWNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGliZmRrX2FhYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZyYXVuaG9mZXIgRkRLIEFBQyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BQUMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZES0FBQ0RlY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZka19hYWNfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZmRrX2FhY19kZWNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmRrX2FhY19kZWNvZGVfY2xvc2UsCisgICAgLmZsdXNoICAgICAgICAgID0gZmRrX2FhY19kZWNvZGVfZmx1c2gsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9DSEFOTkVMX0NPTkYsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmZka19hYWNfZGVjX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYmZkay1hYWNlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYmZkay1hYWNlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWFkYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGliZmRrLWFhY2VuYy5jCkBAIC0wLDAgKzEsNDI4IEBACisvKgorICogQUFDIGVuY29kZXIgd3JhcHBlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxmZGstYWFjL2FhY2VuY19saWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImF1ZGlvX2ZyYW1lX3F1ZXVlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQUFDQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgSEFORExFX0FBQ0VOQ09ERVIgaGFuZGxlOworICAgIGludCBhZnRlcmJ1cm5lcjsKKyAgICBpbnQgZWxkX3NicjsKKyAgICBpbnQgc2lnbmFsaW5nOworICAgIGludCBsYXRtOworICAgIGludCBoZWFkZXJfcGVyaW9kOworICAgIGludCB2YnI7CisKKyAgICBBdWRpb0ZyYW1lUXVldWUgYWZxOworfSBBQUNDb250ZXh0OworCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYWFjX2VuY19vcHRpb25zW10gPSB7CisgICAgeyAiYWZ0ZXJidXJuZXIiLCAiQWZ0ZXJidXJuZXIgKGltcHJvdmVkIHF1YWxpdHkpIiwgb2Zmc2V0b2YoQUFDQ29udGV4dCwgYWZ0ZXJidXJuZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgMSwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgImVsZF9zYnIiLCAiRW5hYmxlIFNCUiBmb3IgRUxEIChmb3IgU0JSIGluIG90aGVyIGNvbmZpZ3VyYXRpb25zLCB1c2UgdGhlIC1wcm9maWxlIHBhcmFtZXRlcikiLCBvZmZzZXRvZihBQUNDb250ZXh0LCBlbGRfc2JyKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJzaWduYWxpbmciLCAiU0JSL1BTIHNpZ25hbGluZyBzdHlsZSIsIG9mZnNldG9mKEFBQ0NvbnRleHQsIHNpZ25hbGluZyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgLTEsIDIsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJzaWduYWxpbmciIH0sCisgICAgeyAiZGVmYXVsdCIsICJDaG9vc2Ugc2lnbmFsaW5nIGltcGxpY2l0bHkgKGV4cGxpY2l0IGhpZXJhcmNoaWNhbCBieSBkZWZhdWx0LCBpbXBsaWNpdCBpZiBnbG9iYWwgaGVhZGVyIGlzIGRpc2FibGVkKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAtMSB9LCAwLCAwLCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAic2lnbmFsaW5nIiB9LAorICAgIHsgImltcGxpY2l0IiwgIkltcGxpY2l0IGJhY2t3YXJkcyBjb21wYXRpYmxlIHNpZ25hbGluZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAwIH0sIDAsIDAsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJzaWduYWxpbmciIH0sCisgICAgeyAiZXhwbGljaXRfc2JyIiwgIkV4cGxpY2l0IFNCUiwgaW1wbGljaXQgUFMgc2lnbmFsaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDEgfSwgMCwgMCwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgInNpZ25hbGluZyIgfSwKKyAgICB7ICJleHBsaWNpdF9oaWVyYXJjaGljYWwiLCAiRXhwbGljaXQgaGllcmFyY2hpY2FsIHNpZ25hbGluZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAyIH0sIDAsIDAsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJzaWduYWxpbmciIH0sCisgICAgeyAibGF0bSIsICJPdXRwdXQgTEFUTS9MT0FTIGVuY2Fwc3VsYXRlZCBkYXRhIiwgb2Zmc2V0b2YoQUFDQ29udGV4dCwgbGF0bSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiaGVhZGVyX3BlcmlvZCIsICJTdHJlYW1NdXhDb25maWcgYW5kIFBDRSByZXBldGl0aW9uIHBlcmlvZCAoaW4gZnJhbWVzKSIsIG9mZnNldG9mKEFBQ0NvbnRleHQsIGhlYWRlcl9wZXJpb2QpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMHhmZmZmLCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAidmJyIiwgIlZCUiBtb2RlICgxLTUpIiwgb2Zmc2V0b2YoQUFDQ29udGV4dCwgdmJyKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDUsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYWFjX2VuY19jbGFzcyA9IHsKKyAgICAibGliZmRrX2FhYyIsIGF2X2RlZmF1bHRfaXRlbV9uYW1lLCBhYWNfZW5jX29wdGlvbnMsIExJQkFWVVRJTF9WRVJTSU9OX0lOVAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFhY19nZXRfZXJyb3IoQUFDRU5DX0VSUk9SIGVycikKK3sKKyAgICBzd2l0Y2ggKGVycikgeworICAgIGNhc2UgQUFDRU5DX09LOgorICAgICAgICByZXR1cm4gIk5vIGVycm9yIjsKKyAgICBjYXNlIEFBQ0VOQ19JTlZBTElEX0hBTkRMRToKKyAgICAgICAgcmV0dXJuICJJbnZhbGlkIGhhbmRsZSI7CisgICAgY2FzZSBBQUNFTkNfTUVNT1JZX0VSUk9SOgorICAgICAgICByZXR1cm4gIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIjsKKyAgICBjYXNlIEFBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVI6CisgICAgICAgIHJldHVybiAiVW5zdXBwb3J0ZWQgcGFyYW1ldGVyIjsKKyAgICBjYXNlIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzoKKyAgICAgICAgcmV0dXJuICJJbnZhbGlkIGNvbmZpZyI7CisgICAgY2FzZSBBQUNFTkNfSU5JVF9FUlJPUjoKKyAgICAgICAgcmV0dXJuICJJbml0aWFsaXphdGlvbiBlcnJvciI7CisgICAgY2FzZSBBQUNFTkNfSU5JVF9BQUNfRVJST1I6CisgICAgICAgIHJldHVybiAiQUFDIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gZXJyb3IiOworICAgIGNhc2UgQUFDRU5DX0lOSVRfU0JSX0VSUk9SOgorICAgICAgICByZXR1cm4gIlNCUiBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yIjsKKyAgICBjYXNlIEFBQ0VOQ19JTklUX1RQX0VSUk9SOgorICAgICAgICByZXR1cm4gIlRyYW5zcG9ydCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yIjsKKyAgICBjYXNlIEFBQ0VOQ19JTklUX01FVEFfRVJST1I6CisgICAgICAgIHJldHVybiAiTWV0YWRhdGEgbGlicmFyeSBpbml0aWFsaXphdGlvbiBlcnJvciI7CisgICAgY2FzZSBBQUNFTkNfRU5DT0RFX0VSUk9SOgorICAgICAgICByZXR1cm4gIkVuY29kaW5nIGVycm9yIjsKKyAgICBjYXNlIEFBQ0VOQ19FTkNPREVfRU9GOgorICAgICAgICByZXR1cm4gIkVuZCBvZiBmaWxlIjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlVua25vd24gZXJyb3IiOworICAgIH0KK30KKworc3RhdGljIGludCBhYWNfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBQUNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChzLT5oYW5kbGUpCisgICAgICAgIGFhY0VuY0Nsb3NlKCZzLT5oYW5kbGUpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBmZl9hZl9xdWV1ZV9jbG9zZSgmcy0+YWZxKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYWFjX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBQUNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgIEFBQ0VOQ19JbmZvU3RydWN0IGluZm8gPSB7IDAgfTsKKyAgICBDSEFOTkVMX01PREUgbW9kZTsKKyAgICBBQUNFTkNfRVJST1IgZXJyOworICAgIGludCBhb3QgPSBGRl9QUk9GSUxFX0FBQ19MT1cgKyAxOworICAgIGludCBzY2UgPSAwLCBjcGUgPSAwOworCisgICAgaWYgKChlcnIgPSBhYWNFbmNPcGVuKCZzLT5oYW5kbGUsIDAsIGF2Y3R4LT5jaGFubmVscykpICE9IEFBQ0VOQ19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBvcGVuIHRoZSBlbmNvZGVyOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGFhY19nZXRfZXJyb3IoZXJyKSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5wcm9maWxlICE9IEZGX1BST0ZJTEVfVU5LTk9XTikKKyAgICAgICAgYW90ID0gYXZjdHgtPnByb2ZpbGUgKyAxOworCisgICAgaWYgKChlcnIgPSBhYWNFbmNvZGVyX1NldFBhcmFtKHMtPmhhbmRsZSwgQUFDRU5DX0FPVCwgYW90KSkgIT0gQUFDRU5DX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNldCB0aGUgQU9UICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGFvdCwgYWFjX2dldF9lcnJvcihlcnIpKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoYW90ID09IEZGX1BST0ZJTEVfQUFDX0VMRCArIDEgJiYgcy0+ZWxkX3NicikgeworICAgICAgICBpZiAoKGVyciA9IGFhY0VuY29kZXJfU2V0UGFyYW0ocy0+aGFuZGxlLCBBQUNFTkNfU0JSX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSkgIT0gQUFDRU5DX09LKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBlbmFibGUgU0JSIGZvciBFTEQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGFhY19nZXRfZXJyb3IoZXJyKSk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChlcnIgPSBhYWNFbmNvZGVyX1NldFBhcmFtKHMtPmhhbmRsZSwgQUFDRU5DX1NBTVBMRVJBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSkpICE9IEFBQ0VOQ19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBzZXQgdGhlIHNhbXBsZSByYXRlICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSwgYWFjX2dldF9lcnJvcihlcnIpKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jaGFubmVscykgeworICAgIGNhc2UgMTogbW9kZSA9IE1PREVfMTsgICAgICAgc2NlID0gMTsgY3BlID0gMDsgYnJlYWs7CisgICAgY2FzZSAyOiBtb2RlID0gTU9ERV8yOyAgICAgICBzY2UgPSAwOyBjcGUgPSAxOyBicmVhazsKKyAgICBjYXNlIDM6IG1vZGUgPSBNT0RFXzFfMjsgICAgIHNjZSA9IDE7IGNwZSA9IDE7IGJyZWFrOworICAgIGNhc2UgNDogbW9kZSA9IE1PREVfMV8yXzE7ICAgc2NlID0gMjsgY3BlID0gMTsgYnJlYWs7CisgICAgY2FzZSA1OiBtb2RlID0gTU9ERV8xXzJfMjsgICBzY2UgPSAxOyBjcGUgPSAyOyBicmVhazsKKyAgICBjYXNlIDY6IG1vZGUgPSBNT0RFXzFfMl8yXzE7IHNjZSA9IDI7IGNwZSA9IDI7IGJyZWFrOworLyogVGhlIHZlcnNpb24gbWFjcm8gaXMgaW50cm9kdWNlZCB0aGUgc2FtZSB0aW1lIGFzIHRoZSA3LjEgc3VwcG9ydCwgc28gdGhpcworICAgc2hvdWxkIHN1ZmZpY2UuICovCisjaWZkZWYgQUFDRU5DT0RFUl9MSUJfVkwwCisgICAgY2FzZSA4OgorICAgICAgICBzY2UgPSAyOworICAgICAgICBjcGUgPSAzOworICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID09IEFWX0NIX0xBWU9VVF83UE9JTlQxKSB7CisgICAgICAgICAgICBtb2RlID0gTU9ERV83XzFfUkVBUl9TVVJST1VORDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE1PREVfMV8yXzJfMl8xIGFuZCBNT0RFXzdfMV9GUk9OVF9DRU5URVIgdXNlIHRoZSBzYW1lIGNoYW5uZWwgbGF5b3V0CisgICAgICAgICAgICBtb2RlID0gTU9ERV83XzFfRlJPTlRfQ0VOVEVSOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzICVkXG4iLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmICgoZXJyID0gYWFjRW5jb2Rlcl9TZXRQYXJhbShzLT5oYW5kbGUsIEFBQ0VOQ19DSEFOTkVMTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSkpICE9IEFBQ0VOQ19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gc2V0IGNoYW5uZWwgbW9kZSAlZDogJXNcbiIsIG1vZGUsIGFhY19nZXRfZXJyb3IoZXJyKSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBhYWNFbmNvZGVyX1NldFBhcmFtKHMtPmhhbmRsZSwgQUFDRU5DX0NIQU5ORUxPUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpICE9IEFBQ0VOQ19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gc2V0IHdhdiBjaGFubmVsIG9yZGVyICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgIG1vZGUsIGFhY19nZXRfZXJyb3IoZXJyKSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUVNDQUxFIHx8IHMtPnZicikgeworICAgICAgICBpbnQgbW9kZSA9IHMtPnZiciA/IHMtPnZiciA6IGF2Y3R4LT5nbG9iYWxfcXVhbGl0eTsKKyAgICAgICAgaWYgKG1vZGUgPCAgMSB8fCBtb2RlID4gNSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiVkJSIHF1YWxpdHkgJWQgb3V0IG9mIHJhbmdlLCBzaG91bGQgYmUgMS01XG4iLCBtb2RlKTsKKyAgICAgICAgICAgIG1vZGUgPSBhdl9jbGlwKG1vZGUsIDEsIDUpOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiTm90ZSwgdGhlIFZCUiBzZXR0aW5nIGlzIHVuc3VwcG9ydGVkIGFuZCBvbmx5IHdvcmtzIHdpdGggIgorICAgICAgICAgICAgICAgInNvbWUgcGFyYW1ldGVyIGNvbWJpbmF0aW9uc1xuIik7CisgICAgICAgIGlmICgoZXJyID0gYWFjRW5jb2Rlcl9TZXRQYXJhbShzLT5oYW5kbGUsIEFBQ0VOQ19CSVRSQVRFTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUpKSAhPSBBQUNFTkNfT0spIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNldCB0aGUgVkJSIGJpdHJhdGUgbW9kZSAlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgbW9kZSwgYWFjX2dldF9lcnJvcihlcnIpKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXZjdHgtPmJpdF9yYXRlIDw9IDApIHsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+cHJvZmlsZSA9PSBGRl9QUk9GSUxFX0FBQ19IRV9WMikgeworICAgICAgICAgICAgICAgIHNjZSA9IDE7CisgICAgICAgICAgICAgICAgY3BlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSA9ICg5NipzY2UgKyAxMjgqY3BlKSAqIGF2Y3R4LT5zYW1wbGVfcmF0ZSAvIDQ0OworICAgICAgICAgICAgaWYgKGF2Y3R4LT5wcm9maWxlID09IEZGX1BST0ZJTEVfQUFDX0hFIHx8CisgICAgICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPT0gRkZfUFJPRklMRV9BQUNfSEVfVjIgfHwKKyAgICAgICAgICAgICAgICBhdmN0eC0+cHJvZmlsZSA9PSBGRl9QUk9GSUxFX01QRUcyX0FBQ19IRSB8fAorICAgICAgICAgICAgICAgIHMtPmVsZF9zYnIpCisgICAgICAgICAgICAgICAgYXZjdHgtPmJpdF9yYXRlIC89IDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlcnIgPSBhYWNFbmNvZGVyX1NldFBhcmFtKHMtPmhhbmRsZSwgQUFDRU5DX0JJVFJBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Yml0X3JhdGUpKSAhPSBBQUNFTkNfT0spIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNldCB0aGUgYml0cmF0ZSAlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPmJpdF9yYXRlLCBhYWNfZ2V0X2Vycm9yKGVycikpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENob29zZSBiaXRzdHJlYW0gZm9ybWF0IC0gaWYgZ2xvYmFsIGhlYWRlciBpcyByZXF1ZXN0ZWQsIHVzZQorICAgICAqIHJhdyBhY2Nlc3MgdW5pdHMsIG90aGVyd2lzZSB1c2UgQURUUy4gKi8KKyAgICBpZiAoKGVyciA9IGFhY0VuY29kZXJfU2V0UGFyYW0ocy0+aGFuZGxlLCBBQUNFTkNfVFJBTlNNVVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfR0xPQkFMX0hFQURFUiA/IDAgOiBzLT5sYXRtID8gMTAgOiAyKSkgIT0gQUFDRU5DX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNldCB0aGUgdHJhbnNtdXggZm9ybWF0OiAlc1xuIiwKKyAgICAgICAgICAgICAgIGFhY19nZXRfZXJyb3IoZXJyKSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKHMtPmxhdG0gJiYgcy0+aGVhZGVyX3BlcmlvZCkgeworICAgICAgICBpZiAoKGVyciA9IGFhY0VuY29kZXJfU2V0UGFyYW0ocy0+aGFuZGxlLCBBQUNFTkNfSEVBREVSX1BFUklPRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhlYWRlcl9wZXJpb2QpKSAhPSBBQUNFTkNfT0spIHsKKyAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBzZXQgaGVhZGVyIHBlcmlvZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGFhY19nZXRfZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIG5vIHNpZ25hbGluZyBtb2RlIGlzIGNob3NlbiwgdXNlIGV4cGxpY2l0IGhpZXJhcmNoaWNhbCBzaWduYWxpbmcKKyAgICAgKiBpZiB1c2luZyBtcDQgbW9kZSAocmF3IGFjY2VzcyB1bml0cywgd2l0aCBnbG9iYWwgaGVhZGVyKSBhbmQKKyAgICAgKiBpbXBsaWNpdCBzaWduYWxpbmcgaWYgdXNpbmcgQURUUy4gKi8KKyAgICBpZiAocy0+c2lnbmFsaW5nIDwgMCkKKyAgICAgICAgcy0+c2lnbmFsaW5nID0gYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSID8gMiA6IDA7CisKKyAgICBpZiAoKGVyciA9IGFhY0VuY29kZXJfU2V0UGFyYW0ocy0+aGFuZGxlLCBBQUNFTkNfU0lHTkFMSU5HX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNpZ25hbGluZykpICE9IEFBQ0VOQ19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBzZXQgc2lnbmFsaW5nIG1vZGUgJWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgcy0+c2lnbmFsaW5nLCBhYWNfZ2V0X2Vycm9yKGVycikpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmICgoZXJyID0gYWFjRW5jb2Rlcl9TZXRQYXJhbShzLT5oYW5kbGUsIEFBQ0VOQ19BRlRFUkJVUk5FUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWZ0ZXJidXJuZXIpKSAhPSBBQUNFTkNfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gc2V0IGFmdGVyYnVybmVyIHRvICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHMtPmFmdGVyYnVybmVyLCBhYWNfZ2V0X2Vycm9yKGVycikpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y3V0b2ZmID4gMCkgeworICAgICAgICBpZiAoYXZjdHgtPmN1dG9mZiA8IChhdmN0eC0+c2FtcGxlX3JhdGUgKyAyNTUpID4+IDggfHwgYXZjdHgtPmN1dG9mZiA+IDIwMDAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImN1dG9mZiB2YWxpZCByYW5nZSBpcyAlZC0yMDAwMFxuIiwKKyAgICAgICAgICAgICAgICAgICAoYXZjdHgtPnNhbXBsZV9yYXRlICsgMjU1KSA+PiA4KTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlcnIgPSBhYWNFbmNvZGVyX1NldFBhcmFtKHMtPmhhbmRsZSwgQUFDRU5DX0JBTkRXSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jdXRvZmYpKSAhPSBBQUNFTkNfT0spIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNldCB0aGUgZW5jb2RlciBiYW5kd2lkdGggdG8gJWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jdXRvZmYsIGFhY19nZXRfZXJyb3IoZXJyKSk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChlcnIgPSBhYWNFbmNFbmNvZGUocy0+aGFuZGxlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkgIT0gQUFDRU5DX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIGVuY29kZXI6ICVzXG4iLAorICAgICAgICAgICAgICAgYWFjX2dldF9lcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IGFhY0VuY0luZm8ocy0+aGFuZGxlLCAmaW5mbykpICE9IEFBQ0VOQ19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBnZXQgZW5jb2RlciBpbmZvOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGFhY19nZXRfZXJyb3IoZXJyKSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgYXZjdHgtPmZyYW1lX3NpemUgPSBpbmZvLmZyYW1lTGVuZ3RoOworICAgIGF2Y3R4LT5pbml0aWFsX3BhZGRpbmcgPSBpbmZvLmVuY29kZXJEZWxheTsKKyAgICBmZl9hZl9xdWV1ZV9pbml0KGF2Y3R4LCAmcy0+YWZxKTsKKworICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpIHsKKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gaW5mby5jb25mU2l6ZTsKKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSAgICAgID0gYXZfbWFsbG9jeihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoYXZjdHgtPmV4dHJhZGF0YSwgaW5mby5jb25mQnVmLCBpbmZvLmNvbmZTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CitlcnJvcjoKKyAgICBhYWNfZW5jb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFhY19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCit7CisgICAgQUFDQ29udGV4dCAgICAqcyAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFBQ0VOQ19CdWZEZXNjIGluX2J1ZiAgID0geyAwIH0sIG91dF9idWYgPSB7IDAgfTsKKyAgICBBQUNFTkNfSW5BcmdzICBpbl9hcmdzICA9IHsgMCB9OworICAgIEFBQ0VOQ19PdXRBcmdzIG91dF9hcmdzID0geyAwIH07CisgICAgaW50IGluX2J1ZmZlcl9pZGVudGlmaWVyID0gSU5fQVVESU9fREFUQTsKKyAgICBpbnQgaW5fYnVmZmVyX3NpemUsIGluX2J1ZmZlcl9lbGVtZW50X3NpemU7CisgICAgaW50IG91dF9idWZmZXJfaWRlbnRpZmllciA9IE9VVF9CSVRTVFJFQU1fREFUQTsKKyAgICBpbnQgb3V0X2J1ZmZlcl9zaXplLCBvdXRfYnVmZmVyX2VsZW1lbnRfc2l6ZTsKKyAgICB2b2lkICppbl9wdHIsICpvdXRfcHRyOworICAgIGludCByZXQ7CisgICAgQUFDRU5DX0VSUk9SIGVycjsKKworICAgIC8qIGhhbmRsZSBlbmQtb2Ytc3RyZWFtIHNtYWxsIGZyYW1lIGFuZCBmbHVzaGluZyAqLworICAgIGlmICghZnJhbWUpIHsKKyAgICAgICAgaW5fYXJncy5udW1JblNhbXBsZXMgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbl9wdHIgICAgICAgICAgICAgICAgICAgPSBmcmFtZS0+ZGF0YVswXTsKKyAgICAgICAgaW5fYnVmZmVyX3NpemUgICAgICAgICAgID0gMiAqIGF2Y3R4LT5jaGFubmVscyAqIGZyYW1lLT5uYl9zYW1wbGVzOworICAgICAgICBpbl9idWZmZXJfZWxlbWVudF9zaXplICAgPSAyOworCisgICAgICAgIGluX2FyZ3MubnVtSW5TYW1wbGVzICAgICA9IGF2Y3R4LT5jaGFubmVscyAqIGZyYW1lLT5uYl9zYW1wbGVzOworICAgICAgICBpbl9idWYubnVtQnVmcyAgICAgICAgICAgPSAxOworICAgICAgICBpbl9idWYuYnVmcyAgICAgICAgICAgICAgPSAmaW5fcHRyOworICAgICAgICBpbl9idWYuYnVmZmVySWRlbnRpZmllcnMgPSAmaW5fYnVmZmVyX2lkZW50aWZpZXI7CisgICAgICAgIGluX2J1Zi5idWZTaXplcyAgICAgICAgICA9ICZpbl9idWZmZXJfc2l6ZTsKKyAgICAgICAgaW5fYnVmLmJ1ZkVsU2l6ZXMgICAgICAgID0gJmluX2J1ZmZlcl9lbGVtZW50X3NpemU7CisKKyAgICAgICAgLyogYWRkIGN1cnJlbnQgZnJhbWUgdG8gdGhlIHF1ZXVlICovCisgICAgICAgIGlmICgocmV0ID0gZmZfYWZfcXVldWVfYWRkKCZzLT5hZnEsIGZyYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBUaGUgbWF4aW11bSBwYWNrZXQgc2l6ZSBpcyA2MTQ0IGJpdHMgYWthIDc2OCBieXRlcyBwZXIgY2hhbm5lbC4gKi8KKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBGRk1BWCg4MTkyLCA3NjggKiBhdmN0eC0+Y2hhbm5lbHMpKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgb3V0X3B0ciAgICAgICAgICAgICAgICAgICA9IGF2cGt0LT5kYXRhOworICAgIG91dF9idWZmZXJfc2l6ZSAgICAgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBvdXRfYnVmZmVyX2VsZW1lbnRfc2l6ZSAgID0gMTsKKyAgICBvdXRfYnVmLm51bUJ1ZnMgICAgICAgICAgID0gMTsKKyAgICBvdXRfYnVmLmJ1ZnMgICAgICAgICAgICAgID0gJm91dF9wdHI7CisgICAgb3V0X2J1Zi5idWZmZXJJZGVudGlmaWVycyA9ICZvdXRfYnVmZmVyX2lkZW50aWZpZXI7CisgICAgb3V0X2J1Zi5idWZTaXplcyAgICAgICAgICA9ICZvdXRfYnVmZmVyX3NpemU7CisgICAgb3V0X2J1Zi5idWZFbFNpemVzICAgICAgICA9ICZvdXRfYnVmZmVyX2VsZW1lbnRfc2l6ZTsKKworICAgIGlmICgoZXJyID0gYWFjRW5jRW5jb2RlKHMtPmhhbmRsZSwgJmluX2J1ZiwgJm91dF9idWYsICZpbl9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfYXJncykpICE9IEFBQ0VOQ19PSykgeworICAgICAgICBpZiAoIWZyYW1lICYmIGVyciA9PSBBQUNFTkNfRU5DT0RFX0VPRikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBlbmNvZGUgZnJhbWU6ICVzXG4iLAorICAgICAgICAgICAgICAgYWFjX2dldF9lcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoIW91dF9hcmdzLm51bU91dEJ5dGVzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIEdldCB0aGUgbmV4dCBmcmFtZSBwdHMgJiBkdXJhdGlvbiAqLworICAgIGZmX2FmX3F1ZXVlX3JlbW92ZSgmcy0+YWZxLCBhdmN0eC0+ZnJhbWVfc2l6ZSwgJmF2cGt0LT5wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICZhdnBrdC0+ZHVyYXRpb24pOworCisgICAgYXZwa3QtPnNpemUgICAgID0gb3V0X2FyZ3MubnVtT3V0Qnl0ZXM7CisgICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWUHJvZmlsZSBwcm9maWxlc1tdID0geworICAgIHsgRkZfUFJPRklMRV9BQUNfTE9XLCAgICJMQyIgICAgICAgfSwKKyAgICB7IEZGX1BST0ZJTEVfQUFDX0hFLCAgICAiSEUtQUFDIiAgIH0sCisgICAgeyBGRl9QUk9GSUxFX0FBQ19IRV9WMiwgIkhFLUFBQ3YyIiB9LAorICAgIHsgRkZfUFJPRklMRV9BQUNfTEQsICAgICJMRCIgICAgICAgfSwKKyAgICB7IEZGX1BST0ZJTEVfQUFDX0VMRCwgICAiRUxEIiAgICAgIH0sCisgICAgeyBGRl9QUk9GSUxFX1VOS05PV04gfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjRGVmYXVsdCBhYWNfZW5jb2RlX2RlZmF1bHRzW10gPSB7CisgICAgeyAiYiIsICIwIiB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDY0X3QgYWFjX2NoYW5uZWxfbGF5b3V0W10gPSB7CisgICAgQVZfQ0hfTEFZT1VUX01PTk8sCisgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywKKyAgICBBVl9DSF9MQVlPVVRfU1VSUk9VTkQsCisgICAgQVZfQ0hfTEFZT1VUXzRQT0lOVDAsCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDBfQkFDSywKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLLAorI2lmZGVmIEFBQ0VOQ09ERVJfTElCX1ZMMAorICAgIEFWX0NIX0xBWU9VVF83UE9JTlQxX1dJREVfQkFDSywKKyAgICBBVl9DSF9MQVlPVVRfN1BPSU5UMSwKKyNlbmRpZgorICAgIDAsCit9OworCitzdGF0aWMgY29uc3QgaW50IGFhY19zYW1wbGVfcmF0ZXNbXSA9IHsKKyAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLAorICAgIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgMAorfTsKKworQVZDb2RlYyBmZl9saWJmZGtfYWFjX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgICA9ICJsaWJmZGtfYWFjIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZyYXVuaG9mZXIgRkRLIEFBQyIpLAorICAgIC50eXBlICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FBQywKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKEFBQ0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBhYWNfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgICAgICA9IGFhY19lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgICAgICAgICA9IGFhY19lbmNvZGVfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgICAgICAgICA9IENPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FIHwgQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5zYW1wbGVfZm10cyAgICAgICAgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgICAgID0gJmFhY19lbmNfY2xhc3MsCisgICAgLmRlZmF1bHRzICAgICAgICAgICAgICA9IGFhY19lbmNvZGVfZGVmYXVsdHMsCisgICAgLnByb2ZpbGVzICAgICAgICAgICAgICA9IHByb2ZpbGVzLAorICAgIC5zdXBwb3J0ZWRfc2FtcGxlcmF0ZXMgPSBhYWNfc2FtcGxlX3JhdGVzLAorICAgIC5jaGFubmVsX2xheW91dHMgICAgICAgPSBhYWNfY2hhbm5lbF9sYXlvdXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGliZ3NtZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJnc21kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzQwMTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGliZ3NtZGVjLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBJbnRlcmZhY2UgdG8gbGliZ3NtIGZvciBHU00gZGVjb2RpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbGJhbiBCZWRlbCA8YWxiZXVAZnJlZS5mcj4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBNaWNoZWwgQmFyZGlhdXggPG1iYXJkaWF1eEBtZWRpYXhpbS5iZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSW50ZXJmYWNlIHRvIGxpYmdzbSBmb3IgR1NNIGRlY29kaW5nCisgKi8KKworLy8gVGhlIGlkaW9zeW5jcmFzaWVzIG9mIEdTTS1pbi1XQVYgYXJlIGV4cGxhaW5lZCBhdCBodHRwOi8va2JzLmNzLnR1LWJlcmxpbi5kZS9+anV0dGEvdG9hc3QuaHRtbAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgSEFWRV9HU01fSAorI2luY2x1ZGUgPGdzbS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxnc20vZ3NtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImdzbS5oIgorCit0eXBlZGVmIHN0cnVjdCBMaWJHU01EZWNvZGVDb250ZXh0IHsKKyAgICBzdHJ1Y3QgZ3NtX3N0YXRlICpzdGF0ZTsKK30gTGliR1NNRGVjb2RlQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGxpYmdzbV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpIHsKKyAgICBMaWJHU01EZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICA9IDE7CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgaWYgKCFhdmN0eC0+c2FtcGxlX3JhdGUpCisgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgICAgID0gQVZfU0FNUExFX0ZNVF9TMTY7CisKKyAgICBzLT5zdGF0ZSA9IGdzbV9jcmVhdGUoKTsKKworICAgIHN3aXRjaChhdmN0eC0+Y29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0dTTToKKyAgICAgICAgYXZjdHgtPmZyYW1lX3NpemUgID0gR1NNX0ZSQU1FX1NJWkU7CisgICAgICAgIGF2Y3R4LT5ibG9ja19hbGlnbiA9IEdTTV9CTE9DS19TSVpFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0dTTV9NUzogeworICAgICAgICBpbnQgb25lID0gMTsKKyAgICAgICAgZ3NtX29wdGlvbihzLT5zdGF0ZSwgR1NNX09QVF9XQVY0OSwgJm9uZSk7CisgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplICA9IDIgKiBHU01fRlJBTUVfU0laRTsKKyAgICAgICAgYXZjdHgtPmJsb2NrX2FsaWduID0gR1NNX01TX0JMT0NLX1NJWkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYmdzbV9kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KSB7CisgICAgTGliR1NNRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBnc21fZGVzdHJveShzLT5zdGF0ZSk7CisgICAgcy0+c3RhdGUgPSBOVUxMOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpYmdzbV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGludCBpLCByZXQ7CisgICAgTGliR1NNRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgICAgICA9IGRhdGE7CisgICAgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgaW50MTZfdCAqc2FtcGxlczsKKworICAgIGlmIChidWZfc2l6ZSA8IGF2Y3R4LT5ibG9ja19hbGlnbikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCBpcyB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gYXZjdHgtPmZyYW1lX3NpemU7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzYW1wbGVzID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+ZnJhbWVfc2l6ZSAvIEdTTV9GUkFNRV9TSVpFOyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSBnc21fZGVjb2RlKHMtPnN0YXRlLCBidWYsIHNhbXBsZXMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJ1ZiAgICAgKz0gR1NNX0JMT0NLX1NJWkU7CisgICAgICAgIHNhbXBsZXMgKz0gR1NNX0ZSQU1FX1NJWkU7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGF2Y3R4LT5ibG9ja19hbGlnbjsKK30KKworc3RhdGljIHZvaWQgbGliZ3NtX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkgeworICAgIExpYkdTTURlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBvbmUgPSAxOworCisgICAgZ3NtX2Rlc3Ryb3kocy0+c3RhdGUpOworICAgIHMtPnN0YXRlID0gZ3NtX2NyZWF0ZSgpOworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfR1NNX01TKQorICAgICAgICBnc21fb3B0aW9uKHMtPnN0YXRlLCBHU01fT1BUX1dBVjQ5LCAmb25lKTsKK30KKworI2lmIENPTkZJR19MSUJHU01fREVDT0RFUgorQVZDb2RlYyBmZl9saWJnc21fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGliZ3NtIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGliZ3NtIEdTTSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9HU00sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKExpYkdTTURlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGxpYmdzbV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBsaWJnc21fZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGxpYmdzbV9kZWNvZGVfZnJhbWUsCisgICAgLmZsdXNoICAgICAgICAgID0gbGliZ3NtX2ZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCisjaWYgQ09ORklHX0xJQkdTTV9NU19ERUNPREVSCitBVkNvZGVjIGZmX2xpYmdzbV9tc19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJnc21fbXMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJnc20gR1NNIE1pY3Jvc29mdCB2YXJpYW50IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0dTTV9NUywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTGliR1NNRGVjb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbGliZ3NtX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGxpYmdzbV9kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gbGliZ3NtX2RlY29kZV9mcmFtZSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBsaWJnc21fZmx1c2gsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYmdzbWVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGliZ3NtZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2ZWM2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYmdzbWVuYy5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogSW50ZXJmYWNlIHRvIGxpYmdzbSBmb3IgR1NNIGVuY29kaW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQWxiYW4gQmVkZWwgPGFsYmV1QGZyZWUuZnI+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgTWljaGVsIEJhcmRpYXV4IDxtYmFyZGlhdXhAbWVkaWF4aW0uYmU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEludGVyZmFjZSB0byBsaWJnc20gZm9yIEdTTSBlbmNvZGluZworICovCisKKy8vIFRoZSBpZGlvc3luY3Jhc2llcyBvZiBHU00taW4tV0FWIGFyZSBleHBsYWluZWQgYXQgaHR0cDovL2ticy5jcy50dS1iZXJsaW4uZGUvfmp1dHRhL3RvYXN0Lmh0bWwKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIEhBVkVfR1NNX0gKKyNpbmNsdWRlIDxnc20uaD4KKyNlbHNlCisjaW5jbHVkZSA8Z3NtL2dzbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJnc20uaCIKKworc3RhdGljIGF2X2NvbGQgaW50IGxpYmdzbV9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KSB7CisgICAgZ3NtX2Rlc3Ryb3koYXZjdHgtPnByaXZfZGF0YSk7CisgICAgYXZjdHgtPnByaXZfZGF0YSA9IE5VTEw7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJnc21fZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KSB7CisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNb25vIHJlcXVpcmVkIGZvciBHU00sIGdvdCAlZCBjaGFubmVsc1xuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlICE9IDgwMDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTYW1wbGUgcmF0ZSA4MDAwSHogcmVxdWlyZWQgZm9yIEdTTSwgZ290ICVkSHpcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUpOworICAgICAgICBpZiAoYXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfVU5PRkZJQ0lBTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSAhPSAxMzAwMCAvKiBPZmZpY2lhbCAqLyAmJgorICAgICAgICBhdmN0eC0+Yml0X3JhdGUgIT0gMTMyMDAgLyogVmVyeSBjb21tb24gKi8gJiYKKyAgICAgICAgYXZjdHgtPmJpdF9yYXRlICE9IDAgLyogVW5rbm93bjsgYS5vLiBtb3YgZG9lcyBub3Qgc2V0IGJpdHJhdGUgd2hlbiBkZWNvZGluZyAqLyApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCaXRyYXRlIDEzMDAwYnBzIHJlcXVpcmVkIGZvciBHU00sIGdvdCAlZGJwc1xuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSk7CisgICAgICAgIGlmIChhdmN0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID4gRkZfQ09NUExJQU5DRV9VTk9GRklDSUFMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGF2Y3R4LT5wcml2X2RhdGEgPSBnc21fY3JlYXRlKCk7CisgICAgaWYgKCFhdmN0eC0+cHJpdl9kYXRhKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgc3dpdGNoKGF2Y3R4LT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfR1NNOgorICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IEdTTV9GUkFNRV9TSVpFOworICAgICAgICBhdmN0eC0+YmxvY2tfYWxpZ24gPSBHU01fQkxPQ0tfU0laRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9HU01fTVM6IHsKKyAgICAgICAgaW50IG9uZSA9IDE7CisgICAgICAgIGdzbV9vcHRpb24oYXZjdHgtPnByaXZfZGF0YSwgR1NNX09QVF9XQVY0OSwgJm9uZSk7CisgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gMipHU01fRlJBTUVfU0laRTsKKyAgICAgICAgYXZjdHgtPmJsb2NrX2FsaWduID0gR1NNX01TX0JMT0NLX1NJWkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2Vycm9yOgorICAgIGxpYmdzbV9lbmNvZGVfY2xvc2UoYXZjdHgpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBsaWJnc21fZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIGludCByZXQ7CisgICAgZ3NtX3NpZ25hbCAqc2FtcGxlcyA9IChnc21fc2lnbmFsICopZnJhbWUtPmRhdGFbMF07CisgICAgc3RydWN0IGdzbV9zdGF0ZSAqc3RhdGUgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgYXZjdHgtPmJsb2NrX2FsaWduKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc3dpdGNoKGF2Y3R4LT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfR1NNOgorICAgICAgICBnc21fZW5jb2RlKHN0YXRlLCBzYW1wbGVzLCBhdnBrdC0+ZGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfR1NNX01TOgorICAgICAgICBnc21fZW5jb2RlKHN0YXRlLCBzYW1wbGVzLCAgICAgICAgICAgICAgICAgIGF2cGt0LT5kYXRhKTsKKyAgICAgICAgZ3NtX2VuY29kZShzdGF0ZSwgc2FtcGxlcyArIEdTTV9GUkFNRV9TSVpFLCBhdnBrdC0+ZGF0YSArIDMyKTsKKyAgICB9CisKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworfQorCisKKyNpZiBDT05GSUdfTElCR1NNX0VOQ09ERVIKK0FWQ29kZWMgZmZfbGliZ3NtX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYmdzbSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYmdzbSBHU00iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfR1NNLAorICAgIC5pbml0ICAgICAgICAgICA9IGxpYmdzbV9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBsaWJnc21fZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGxpYmdzbV9lbmNvZGVfY2xvc2UsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CisjZW5kaWYKKyNpZiBDT05GSUdfTElCR1NNX01TX0VOQ09ERVIKK0FWQ29kZWMgZmZfbGliZ3NtX21zX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYmdzbV9tcyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYmdzbSBHU00gTWljcm9zb2Z0IHZhcmlhbnQiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfR1NNX01TLAorICAgIC5pbml0ICAgICAgICAgICA9IGxpYmdzbV9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBsaWJnc21fZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGxpYmdzbV9lbmNvZGVfY2xvc2UsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYmlsYmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYmlsYmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmRkM2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGliaWxiYy5jCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogaUxCQyBkZWNvZGVyL2VuY29kZXIgc3R1YgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbGJjLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IGdldF9tb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpZiAoYXZjdHgtPmJsb2NrX2FsaWduID09IDM4KQorICAgICAgICByZXR1cm4gMjA7CisgICAgZWxzZSBpZiAoYXZjdHgtPmJsb2NrX2FsaWduID09IDUwKQorICAgICAgICByZXR1cm4gMzA7CisgICAgZWxzZSBpZiAoYXZjdHgtPmJpdF9yYXRlID4gMCkKKyAgICAgICAgcmV0dXJuIGF2Y3R4LT5iaXRfcmF0ZSA8PSAxNDAwMCA/IDMwIDogMjA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7Cit9CisKK3R5cGVkZWYgc3RydWN0IElMQkNEZWNDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpTEJDX0RlY19JbnN0X3QgZGVjb2RlcjsKKyAgICBpbnQgZW5oYW5jZTsKK30gSUxCQ0RlY0NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBpbGJjX2RlY19vcHRpb25zW10gPSB7CisgICAgeyAiZW5oYW5jZSIsICJFbmhhbmNlIHRoZSBkZWNvZGVkIGF1ZGlvIChhZGRzIGRlbGF5KSIsIG9mZnNldG9mKElMQkNEZWNDb250ZXh0LCBlbmhhbmNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaWxiY19kZWNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibGliaWxiYyIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGlsYmNfZGVjX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgaWxiY19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSUxCQ0RlY0NvbnRleHQgKnMgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgbW9kZTsKKworICAgIGlmICgobW9kZSA9IGdldF9tb2RlKGF2Y3R4KSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaUxCQyBmcmFtZSBtb2RlIG5vdCBpbmRpY2F0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIFdlYlJ0Y0lsYmNmaXhfSW5pdERlY29kZSgmcy0+ZGVjb2RlciwgbW9kZSwgcy0+ZW5oYW5jZSk7CisKKyAgICBhdmN0eC0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSAgICA9IDgwMDA7CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgICAgID0gQVZfU0FNUExFX0ZNVF9TMTY7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbGJjX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIElMQkNEZWNDb250ZXh0ICpzICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHMtPmRlY29kZXIubm9fb2ZfYnl0ZXMgPiBidWZfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImlMQkMgZnJhbWUgdG9vIHNob3J0ICgldSwgc2hvdWxkIGJlICV1KVxuIiwKKyAgICAgICAgICAgICAgIGJ1Zl9zaXplLCBzLT5kZWNvZGVyLm5vX29mX2J5dGVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBzLT5kZWNvZGVyLmJsb2NrbDsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgV2ViUnRjSWxiY2ZpeF9EZWNvZGVJbXBsKChpbnQxNl90ICopIGZyYW1lLT5kYXRhWzBdLCAoY29uc3QgdWludDE2X3QgKikgYnVmLCAmcy0+ZGVjb2RlciwgMSk7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gcy0+ZGVjb2Rlci5ub19vZl9ieXRlczsKK30KKworQVZDb2RlYyBmZl9saWJpbGJjX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYmlsYmMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJpTEJDIChJbnRlcm5ldCBMb3cgQml0cmF0ZSBDb2RlYykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSUxCQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSUxCQ0RlY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGlsYmNfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gaWxiY19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmaWxiY19kZWNfY2xhc3MsCit9OworCit0eXBlZGVmIHN0cnVjdCBJTEJDRW5jQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaUxCQ19FbmNfSW5zdF90IGVuY29kZXI7CisgICAgaW50IG1vZGU7Cit9IElMQkNFbmNDb250ZXh0OworCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaWxiY19lbmNfb3B0aW9uc1tdID0geworICAgIHsgIm1vZGUiLCAiaUxCQyBtb2RlICgyMCBvciAzMCBtcyBmcmFtZXMpIiwgb2Zmc2V0b2YoSUxCQ0VuY0NvbnRleHQsIG1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDIwIH0sIDIwLCAzMCwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBpbGJjX2VuY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJsaWJpbGJjIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gaWxiY19lbmNfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbGJjX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBJTEJDRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IG1vZGU7CisKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlICE9IDgwMDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IDgwMDBIeiBzYW1wbGUgcmF0ZSBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgIT0gMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9ubHkgbW9ubyBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICgobW9kZSA9IGdldF9tb2RlKGF2Y3R4KSkgPiAwKQorICAgICAgICBzLT5tb2RlID0gbW9kZTsKKyAgICBlbHNlCisgICAgICAgIHMtPm1vZGUgPSBzLT5tb2RlICE9IDMwID8gMjAgOiAzMDsKKyAgICBXZWJSdGNJbGJjZml4X0luaXRFbmNvZGUoJnMtPmVuY29kZXIsIHMtPm1vZGUpOworCisgICAgYXZjdHgtPmJsb2NrX2FsaWduID0gcy0+ZW5jb2Rlci5ub19vZl9ieXRlczsKKyAgICBhdmN0eC0+ZnJhbWVfc2l6ZSAgPSBzLT5lbmNvZGVyLmJsb2NrbDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlsYmNfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBJTEJDRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIDUwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgV2ViUnRjSWxiY2ZpeF9FbmNvZGVJbXBsKCh1aW50MTZfdCAqKSBhdnBrdC0+ZGF0YSwgKGNvbnN0IGludDE2X3QgKikgZnJhbWUtPmRhdGFbMF0sICZzLT5lbmNvZGVyKTsKKworICAgIGF2cGt0LT5zaXplICAgICA9IHMtPmVuY29kZXIubm9fb2ZfYnl0ZXM7CisgICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWQ29kZWNEZWZhdWx0IGlsYmNfZW5jb2RlX2RlZmF1bHRzW10gPSB7CisgICAgeyAiYiIsICIwIiB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkNvZGVjIGZmX2xpYmlsYmNfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGliaWxiYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImlMQkMgKEludGVybmV0IExvdyBCaXRyYXRlIENvZGVjKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9JTEJDLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihJTEJDRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gaWxiY19lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBpbGJjX2VuY29kZV9mcmFtZSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5kZWZhdWx0cyAgICAgICA9IGlsYmNfZW5jb2RlX2RlZmF1bHRzLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZpbGJjX2VuY19jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJtcDNsYW1lLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJtcDNsYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzOTE5YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYm1wM2xhbWUuYwpAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqIEludGVyZmFjZSB0byBsaWJtcDNsYW1lIGZvciBtcDMgZW5jb2RpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwMiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEBnbnUub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBJbnRlcmZhY2UgdG8gbGlibXAzbGFtZSBmb3IgbXAzIGVuY29kaW5nLgorICovCisKKyNpbmNsdWRlIDxsYW1lL2xhbWUuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImF1ZGlvX2ZyYW1lX3F1ZXVlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtcGVnYXVkaW8uaCIKKyNpbmNsdWRlICJtcGVnYXVkaW9kZWNoZWFkZXIuaCIKKworI2RlZmluZSBCVUZGRVJfU0laRSAoNzIwMCArIDIgKiBNUEFfRlJBTUVfU0laRSArIE1QQV9GUkFNRV9TSVpFIC8gNCsxMDAwKSAvLyBGSVhNRTogQnVmZmVyIHNpemUgdG8gc21hbGw/IEFkZGluZyAxMDAwIHRvIG1ha2UgdXAgZm9yIGl0LgorCit0eXBlZGVmIHN0cnVjdCBMQU1FQ29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGxhbWVfZ2xvYmFsX2ZsYWdzICpnZnA7CisgICAgdWludDhfdCAqYnVmZmVyOworICAgIGludCBidWZmZXJfaW5kZXg7CisgICAgaW50IGJ1ZmZlcl9zaXplOworICAgIGludCByZXNlcnZvaXI7CisgICAgaW50IGpvaW50X3N0ZXJlbzsKKyAgICBpbnQgYWJyOworICAgIGZsb2F0ICpzYW1wbGVzX2ZsdFsyXTsKKyAgICBBdWRpb0ZyYW1lUXVldWUgYWZxOworICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOworfSBMQU1FQ29udGV4dDsKKworCitzdGF0aWMgaW50IHJlYWxsb2NfYnVmZmVyKExBTUVDb250ZXh0ICpzKQoreworICAgIGlmICghcy0+YnVmZmVyIHx8IHMtPmJ1ZmZlcl9zaXplIC0gcy0+YnVmZmVyX2luZGV4IDwgQlVGRkVSX1NJWkUpIHsKKyAgICAgICAgaW50IG5ld19zaXplID0gcy0+YnVmZmVyX2luZGV4ICsgMiAqIEJVRkZFUl9TSVpFLCBlcnI7CisKKyAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgInJlc2l6aW5nIG91dHB1dCBidWZmZXI6ICVkIC0+ICVkXG4iLCBzLT5idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICBuZXdfc2l6ZSk7CisgICAgICAgIGlmICgoZXJyID0gYXZfcmVhbGxvY3AoJnMtPmJ1ZmZlciwgbmV3X3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgIHMtPmJ1ZmZlcl9zaXplID0gcy0+YnVmZmVyX2luZGV4ID0gMDsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgcy0+YnVmZmVyX3NpemUgPSBuZXdfc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtcDNsYW1lX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTEFNRUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJnMtPnNhbXBsZXNfZmx0WzBdKTsKKyAgICBhdl9mcmVlcCgmcy0+c2FtcGxlc19mbHRbMV0pOworICAgIGF2X2ZyZWVwKCZzLT5idWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5mZHNwKTsKKworICAgIGZmX2FmX3F1ZXVlX2Nsb3NlKCZzLT5hZnEpOworCisgICAgbGFtZV9jbG9zZShzLT5nZnApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbXAzbGFtZV9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTEFNRUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworCisgICAgLyogaW5pdGlhbGl6ZSBMQU1FIGFuZCBnZXQgZGVmYXVsdHMgKi8KKyAgICBpZiAoIShzLT5nZnAgPSBsYW1lX2luaXQoKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKworICAgIGxhbWVfc2V0X251bV9jaGFubmVscyhzLT5nZnAsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgbGFtZV9zZXRfbW9kZShzLT5nZnAsIGF2Y3R4LT5jaGFubmVscyA+IDEgPyBzLT5qb2ludF9zdGVyZW8gPyBKT0lOVF9TVEVSRU8gOiBTVEVSRU8gOiBNT05PKTsKKworICAgIC8qIHNhbXBsZSByYXRlICovCisgICAgbGFtZV9zZXRfaW5fc2FtcGxlcmF0ZSAocy0+Z2ZwLCBhdmN0eC0+c2FtcGxlX3JhdGUpOworICAgIGxhbWVfc2V0X291dF9zYW1wbGVyYXRlKHMtPmdmcCwgYXZjdHgtPnNhbXBsZV9yYXRlKTsKKworICAgIC8qIGFsZ29yaXRobWljIHF1YWxpdHkgKi8KKyAgICBpZiAoYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsICE9IEZGX0NPTVBSRVNTSU9OX0RFRkFVTFQpCisgICAgICAgIGxhbWVfc2V0X3F1YWxpdHkocy0+Z2ZwLCBhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwpOworCisgICAgLyogcmF0ZSBjb250cm9sICovCisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUVNDQUxFKSB7IC8vIFZCUgorICAgICAgICBsYW1lX3NldF9WQlIocy0+Z2ZwLCB2YnJfZGVmYXVsdCk7CisgICAgICAgIGxhbWVfc2V0X1ZCUl9xdWFsaXR5KHMtPmdmcCwgYXZjdHgtPmdsb2JhbF9xdWFsaXR5IC8gKGZsb2F0KUZGX1FQMkxBTUJEQSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSkgeworICAgICAgICAgICAgaWYgKHMtPmFicikgeyAgICAgICAgICAgICAgICAgICAvLyBBQlIKKyAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlIocy0+Z2ZwLCB2YnJfYWJyKTsKKyAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlJfbWVhbl9iaXRyYXRlX2ticHMocy0+Z2ZwLCBhdmN0eC0+Yml0X3JhdGUgLyAxMDAwKTsKKyAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0JSCisgICAgICAgICAgICAgICAgbGFtZV9zZXRfYnJhdGUocy0+Z2ZwLCBhdmN0eC0+Yml0X3JhdGUgLyAxMDAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGRvIG5vdCBnZXQgYSBYaW5nIFZCUiBoZWFkZXIgZnJhbWUgZnJvbSBMQU1FICovCisgICAgbGFtZV9zZXRfYldyaXRlVmJyVGFnKHMtPmdmcCwwKTsKKworICAgIC8qIGJpdCByZXNlcnZvaXIgdXNhZ2UgKi8KKyAgICBsYW1lX3NldF9kaXNhYmxlX3Jlc2Vydm9pcihzLT5nZnAsICFzLT5yZXNlcnZvaXIpOworCisgICAgLyogc2V0IHNwZWNpZmllZCBwYXJhbWV0ZXJzICovCisgICAgaWYgKGxhbWVfaW5pdF9wYXJhbXMocy0+Z2ZwKSA8IDApIHsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogZ2V0IGVuY29kZXIgZGVsYXkgKi8KKyAgICBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nID0gbGFtZV9nZXRfZW5jb2Rlcl9kZWxheShzLT5nZnApICsgNTI4ICsgMTsKKyAgICBmZl9hZl9xdWV1ZV9pbml0KGF2Y3R4LCAmcy0+YWZxKTsKKworICAgIGF2Y3R4LT5mcmFtZV9zaXplICA9IGxhbWVfZ2V0X2ZyYW1lc2l6ZShzLT5nZnApOworCisgICAgLyogYWxsb2NhdGUgZmxvYXQgc2FtcGxlIGJ1ZmZlcnMgKi8KKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQKSB7CisgICAgICAgIGludCBjaDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBzLT5zYW1wbGVzX2ZsdFtjaF0gPSBhdl9tYWxsb2MoYXZjdHgtPmZyYW1lX3NpemUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+c2FtcGxlc19mbHRbY2hdKSk7CisgICAgICAgICAgICBpZiAoIXMtPnNhbXBsZXNfZmx0W2NoXSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gcmVhbGxvY19idWZmZXIocyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBzLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBpZiAoIXMtPmZkc3ApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworCisgICAgcmV0dXJuIDA7CitlcnJvcjoKKyAgICBtcDNsYW1lX2VuY29kZV9jbG9zZShhdmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBFTkNPREVfQlVGRkVSKGZ1bmMsIGJ1Zl90eXBlLCBidWZfbmFtZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsYW1lX3Jlc3VsdCA9IGZ1bmMocy0+Z2ZwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBidWZfdHlwZSAqKWJ1Zl9uYW1lWzBdLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgYnVmX3R5cGUgKilidWZfbmFtZVsxXSwgZnJhbWUtPm5iX3NhbXBsZXMsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+YnVmZmVyICsgcy0+YnVmZmVyX2luZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmJ1ZmZlcl9zaXplIC0gcy0+YnVmZmVyX2luZGV4KTsgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBtcDNsYW1lX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCit7CisgICAgTEFNRUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1QQURlY29kZUhlYWRlciBoZHI7CisgICAgaW50IGxlbiwgcmV0LCBjaDsKKyAgICBpbnQgbGFtZV9yZXN1bHQ7CisgICAgdWludDMyX3QgaDsKKworICAgIGlmIChmcmFtZSkgeworICAgICAgICBzd2l0Y2ggKGF2Y3R4LT5zYW1wbGVfZm10KSB7CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOgorICAgICAgICAgICAgRU5DT0RFX0JVRkZFUihsYW1lX2VuY29kZV9idWZmZXIsIGludDE2X3QsIGZyYW1lLT5kYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyUDoKKyAgICAgICAgICAgIEVOQ09ERV9CVUZGRVIobGFtZV9lbmNvZGVfYnVmZmVyX2ludCwgaW50MzJfdCwgZnJhbWUtPmRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFRQOgorICAgICAgICAgICAgaWYgKGZyYW1lLT5saW5lc2l6ZVswXSA8IDQgKiBGRkFMSUdOKGZyYW1lLT5uYl9zYW1wbGVzLCA4KSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW5hZGVxdWF0ZSBBVkZyYW1lIHBsYW5lIHBhZGRpbmdcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBhdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF9zY2FsYXIocy0+c2FtcGxlc19mbHRbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKWZyYW1lLT5kYXRhW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjc2OC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRkFMSUdOKGZyYW1lLT5uYl9zYW1wbGVzLCA4KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFTkNPREVfQlVGRkVSKGxhbWVfZW5jb2RlX2J1ZmZlcl9mbG9hdCwgZmxvYXQsIHMtPnNhbXBsZXNfZmx0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghcy0+YWZxLmZyYW1lX2FsbG9jKSB7CisgICAgICAgIGxhbWVfcmVzdWx0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBsYW1lX3Jlc3VsdCA9IGxhbWVfZW5jb2RlX2ZsdXNoKHMtPmdmcCwgcy0+YnVmZmVyICsgcy0+YnVmZmVyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJ1ZmZlcl9zaXplIC0gcy0+YnVmZmVyX2luZGV4KTsKKyAgICB9CisgICAgaWYgKGxhbWVfcmVzdWx0IDwgMCkgeworICAgICAgICBpZiAobGFtZV9yZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJsYW1lOiBvdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCAoYnVmZmVyIGluZGV4OiAlZCwgZnJlZSBieXRlczogJWQpXG4iLAorICAgICAgICAgICAgICAgICAgIHMtPmJ1ZmZlcl9pbmRleCwgcy0+YnVmZmVyX3NpemUgLSBzLT5idWZmZXJfaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcy0+YnVmZmVyX2luZGV4ICs9IGxhbWVfcmVzdWx0OworICAgIHJldCA9IHJlYWxsb2NfYnVmZmVyKHMpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgcmVhbGxvY2F0aW5nIG91dHB1dCBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIGFkZCBjdXJyZW50IGZyYW1lIHRvIHRoZSBxdWV1ZSAqLworICAgIGlmIChmcmFtZSkgeworICAgICAgICBpZiAoKHJldCA9IGZmX2FmX3F1ZXVlX2FkZCgmcy0+YWZxLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogTW92ZSAxIGZyYW1lIGZyb20gdGhlIExBTUUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGFja2V0LCBpZiBhdmFpbGFibGUuCisgICAgICAgV2UgaGF2ZSB0byBwYXJzZSB0aGUgZmlyc3QgZnJhbWUgaGVhZGVyIGluIHRoZSBvdXRwdXQgYnVmZmVyIHRvCisgICAgICAgZGV0ZXJtaW5lIHRoZSBmcmFtZSBzaXplLiAqLworICAgIGlmIChzLT5idWZmZXJfaW5kZXggPCA0KQorICAgICAgICByZXR1cm4gMDsKKyAgICBoID0gQVZfUkIzMihzLT5idWZmZXIpOworICAgIGlmIChmZl9tcGFfY2hlY2tfaGVhZGVyKGgpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbXAzIGhlYWRlciBhdCBzdGFydCBvZiBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgfQorICAgIGlmIChhdnByaXZfbXBlZ2F1ZGlvX2RlY29kZV9oZWFkZXIoJmhkciwgaCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmcmVlIGZvcm1hdCBvdXRwdXQgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbGVuID0gaGRyLmZyYW1lX3NpemU7CisgICAgYXZfZGxvZyhhdmN0eCwgImluOiVkIHBhY2tldC1sZW46JWQgaW5kZXg6JWRcbiIsIGF2Y3R4LT5mcmFtZV9zaXplLCBsZW4sCisgICAgICAgICAgICBzLT5idWZmZXJfaW5kZXgpOworICAgIGlmIChsZW4gPD0gcy0+YnVmZmVyX2luZGV4KSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIGxlbikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIG1lbWNweShhdnBrdC0+ZGF0YSwgcy0+YnVmZmVyLCBsZW4pOworICAgICAgICBzLT5idWZmZXJfaW5kZXggLT0gbGVuOworICAgICAgICBtZW1tb3ZlKHMtPmJ1ZmZlciwgcy0+YnVmZmVyICsgbGVuLCBzLT5idWZmZXJfaW5kZXgpOworCisgICAgICAgIC8qIEdldCB0aGUgbmV4dCBmcmFtZSBwdHMvZHVyYXRpb24gKi8KKyAgICAgICAgZmZfYWZfcXVldWVfcmVtb3ZlKCZzLT5hZnEsIGF2Y3R4LT5mcmFtZV9zaXplLCAmYXZwa3QtPnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdnBrdC0+ZHVyYXRpb24pOworCisgICAgICAgIGF2cGt0LT5zaXplID0gbGVuOworICAgICAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTEFNRUNvbnRleHQsIHgpCisjZGVmaW5lIEFFIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAicmVzZXJ2b2lyIiwgICAgInVzZSBiaXQgcmVzZXJ2b2lyIiwgT0ZGU0VUKHJlc2Vydm9pciksICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMSB9LCAwLCAxLCBBRSB9LAorICAgIHsgImpvaW50X3N0ZXJlbyIsICJ1c2Ugam9pbnQgc3RlcmVvIiwgIE9GRlNFVChqb2ludF9zdGVyZW8pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgMSwgQUUgfSwKKyAgICB7ICJhYnIiLCAgICAgICAgICAidXNlIEFCUiIsICAgICAgICAgICBPRkZTRVQoYWJyKSwgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEFFIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBsaWJtcDNsYW1lX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImxpYm1wM2xhbWUgZW5jb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgbGlibXAzbGFtZV9kZWZhdWx0c1tdID0geworICAgIHsgImIiLCAgICAgICAgICAiMCIgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbGlibXAzbGFtZV9zYW1wbGVfcmF0ZXNbXSA9IHsKKyAgICA0NDEwMCwgNDgwMDAsICAzMjAwMCwgMjIwNTAsIDI0MDAwLCAxNjAwMCwgMTEwMjUsIDEyMDAwLCA4MDAwLCAwCit9OworCitBVkNvZGVjIGZmX2xpYm1wM2xhbWVfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgID0gImxpYm1wM2xhbWUiLAorICAgIC5sb25nX25hbWUgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGlibXAzbGFtZSBNUDMgKE1QRUcgYXVkaW8gbGF5ZXIgMykiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDMsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihMQU1FQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgICA9IG1wM2xhbWVfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgICAgICA9IG1wM2xhbWVfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSBtcDNsYW1lX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQ09ERUNfQ0FQX0RFTEFZIHwgQ09ERUNfQ0FQX1NNQUxMX0xBU1RfRlJBTUUsCisgICAgLnNhbXBsZV9mbXRzICAgICAgICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9TMzJQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLnN1cHBvcnRlZF9zYW1wbGVyYXRlcyA9IGxpYm1wM2xhbWVfc2FtcGxlX3JhdGVzLAorICAgIC5jaGFubmVsX2xheW91dHMgICAgICAgPSAoY29uc3QgdWludDY0X3RbXSkgeyBBVl9DSF9MQVlPVVRfTU9OTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB9LAorICAgIC5wcml2X2NsYXNzICAgICAgICAgICAgPSAmbGlibXAzbGFtZV9jbGFzcywKKyAgICAuZGVmYXVsdHMgICAgICAgICAgICAgID0gbGlibXAzbGFtZV9kZWZhdWx0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJvcGVuY29yZS1hbXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYm9wZW5jb3JlLWFtci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYWQ4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJvcGVuY29yZS1hbXIuYwpAQCAtMCwwICsxLDM3OCBAQAorLyoKKyAqIEFNUiBBdWRpbyBkZWNvZGVyIHN0dWIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImF1ZGlvX2ZyYW1lX3F1ZXVlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIGludCBhbXJfZGVjb2RlX2ZpeF9hdmN0eChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgY29uc3QgaW50IGlzX2Ftcl93YiA9IDEgKyAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9XQik7CisKKyAgICBpZiAoIWF2Y3R4LT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gODAwMCAqIGlzX2Ftcl93YjsKKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiAxKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAibXVsdGktY2hhbm5lbCBBTVIiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICA9IDE7CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgICAgID0gQVZfU0FNUExFX0ZNVF9TMTY7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfTElCT1BFTkNPUkVfQU1STkIKKworI2luY2x1ZGUgPG9wZW5jb3JlLWFtcm5iL2ludGVyZl9kZWMuaD4KKyNpbmNsdWRlIDxvcGVuY29yZS1hbXJuYi9pbnRlcmZfZW5jLmg+CisKK3R5cGVkZWYgc3RydWN0IEFNUkNvbnRleHQgeworICAgIEFWQ2xhc3MgKmF2X2NsYXNzOworICAgIHZvaWQgKmRlY19zdGF0ZTsKKyAgICB2b2lkICplbmNfc3RhdGU7CisgICAgaW50ICAgZW5jX2JpdHJhdGU7CisgICAgaW50ICAgZW5jX21vZGU7CisgICAgaW50ICAgZW5jX2R0eDsKKyAgICBpbnQgICBlbmNfbGFzdF9mcmFtZTsKKyAgICBBdWRpb0ZyYW1lUXVldWUgYWZxOworfSBBTVJDb250ZXh0OworCisjaWYgQ09ORklHX0xJQk9QRU5DT1JFX0FNUk5CX0RFQ09ERVIKK3N0YXRpYyBhdl9jb2xkIGludCBhbXJfbmJfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFNUkNvbnRleHQgKnMgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBhbXJfZGVjb2RlX2ZpeF9hdmN0eChhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHMtPmRlY19zdGF0ZSAgID0gRGVjb2Rlcl9JbnRlcmZhY2VfaW5pdCgpOworICAgIGlmICghcy0+ZGVjX3N0YXRlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGVjb2Rlcl9JbnRlcmZhY2VfaW5pdCBlcnJvclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFtcl9uYl9kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFNUkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgRGVjb2Rlcl9JbnRlcmZhY2VfZXhpdChzLT5kZWNfc3RhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1yX25iX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBBTVJDb250ZXh0ICpzICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJsb2NrX3NpemVbMTZdID0geyAxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsIDUsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBlbnVtIE1vZGUgZGVjX21vZGU7CisgICAgaW50IHBhY2tldF9zaXplLCByZXQ7CisKKyAgICBhdl9kbG9nKGF2Y3R4LCAiYW1yX2RlY29kZV9mcmFtZSBidWY9JXAgYnVmX3NpemU9JWQgZnJhbWVfY291bnQ9JWQhIVxuIiwKKyAgICAgICAgICAgIGJ1ZiwgYnVmX3NpemUsIGF2Y3R4LT5mcmFtZV9udW1iZXIpOworCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IDE2MDsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZGVjX21vZGUgICAgPSAoYnVmWzBdID4+IDMpICYgMHgwMDBGOworICAgIHBhY2tldF9zaXplID0gYmxvY2tfc2l6ZVtkZWNfbW9kZV0gKyAxOworCisgICAgaWYgKHBhY2tldF9zaXplID4gYnVmX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJhbXIgZnJhbWUgdG9vIHNob3J0ICgldSwgc2hvdWxkIGJlICV1KVxuIiwKKyAgICAgICAgICAgICAgIGJ1Zl9zaXplLCBwYWNrZXRfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2X2Rsb2coYXZjdHgsICJwYWNrZXRfc2l6ZT0lZCBidWY9IDB4JVggJVggJVggJVhcbiIsCisgICAgICAgICAgICAgIHBhY2tldF9zaXplLCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10pOworICAgIC8qIGNhbGwgZGVjb2RlciAqLworICAgIERlY29kZXJfSW50ZXJmYWNlX0RlY29kZShzLT5kZWNfc3RhdGUsIGJ1ZiwgKHNob3J0ICopZnJhbWUtPmRhdGFbMF0sIDApOworCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIHBhY2tldF9zaXplOworfQorCitBVkNvZGVjIGZmX2xpYm9wZW5jb3JlX2Ftcm5iX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYm9wZW5jb3JlX2Ftcm5iIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT3BlbkNPUkUgQU1SLU5CIChBZGFwdGl2ZSBNdWx0aS1SYXRlIE5hcnJvdy1CYW5kKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BTVJfTkIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFNUkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGFtcl9uYl9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBhbXJfbmJfZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGFtcl9uYl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CisjZW5kaWYgLyogQ09ORklHX0xJQk9QRU5DT1JFX0FNUk5CX0RFQ09ERVIgKi8KKworI2lmIENPTkZJR19MSUJPUEVOQ09SRV9BTVJOQl9FTkNPREVSCisvKiBDb21tb24gY29kZSBmb3IgZml4ZWQgYW5kIGZsb2F0IHZlcnNpb24qLwordHlwZWRlZiBzdHJ1Y3QgQU1SX2JpdHJhdGVzIHsKKyAgICBpbnQgICAgICAgcmF0ZTsKKyAgICBlbnVtIE1vZGUgbW9kZTsKK30gQU1SX2JpdHJhdGVzOworCisvKiBNYXRjaCBkZXNpcmVkIGJpdHJhdGUgKi8KK3N0YXRpYyBpbnQgZ2V0X2JpdHJhdGVfbW9kZShpbnQgYml0cmF0ZSwgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICAvKiBtYWtlIHRoZSBjb3JyZXNwb25kYW5jZSBiZXR3ZWVuIGJpdHJhdGUgYW5kIG1vZGUgKi8KKyAgICBzdGF0aWMgY29uc3QgQU1SX2JpdHJhdGVzIHJhdGVzW10gPSB7CisgICAgICAgIHsgNDc1MCwgTVI0NzUgfSwgeyA1MTUwLCBNUjUxNSB9LCB7ICA1OTAwLCBNUjU5ICB9LCB7ICA2NzAwLCBNUjY3ICB9LAorICAgICAgICB7IDc0MDAsIE1SNzQgfSwgIHsgNzk1MCwgTVI3OTUgfSwgeyAxMDIwMCwgTVIxMDIgfSwgeyAxMjIwMCwgTVIxMjIgfQorICAgIH07CisgICAgaW50IGksIGJlc3QgPSAtMSwgbWluX2RpZmYgPSAwOworICAgIGNoYXIgbG9nX2J1ZlsyMDBdOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBpZiAocmF0ZXNbaV0ucmF0ZSA9PSBiaXRyYXRlKQorICAgICAgICAgICAgcmV0dXJuIHJhdGVzW2ldLm1vZGU7CisgICAgICAgIGlmIChiZXN0IDwgMCB8fCBhYnMocmF0ZXNbaV0ucmF0ZSAtIGJpdHJhdGUpIDwgbWluX2RpZmYpIHsKKyAgICAgICAgICAgIGJlc3QgICAgID0gaTsKKyAgICAgICAgICAgIG1pbl9kaWZmID0gYWJzKHJhdGVzW2ldLnJhdGUgLSBiaXRyYXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBubyBiaXRyYXRlIG1hdGNoaW5nIGV4YWN0bHksIGxvZyBhIHdhcm5pbmcgKi8KKyAgICBzbnByaW50Zihsb2dfYnVmLCBzaXplb2YobG9nX2J1ZiksICJiaXRyYXRlIG5vdCBzdXBwb3J0ZWQ6IHVzZSBvbmUgb2YgIik7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgYXZfc3RybGNhdGYobG9nX2J1Ziwgc2l6ZW9mKGxvZ19idWYpLCAiJS4yZmssICIsIHJhdGVzW2ldLnJhdGUgICAgLyAxMDAwLmYpOworICAgIGF2X3N0cmxjYXRmKGxvZ19idWYsIHNpemVvZihsb2dfYnVmKSwgInVzaW5nICUuMmZrIiwgcmF0ZXNbYmVzdF0ucmF0ZSAvIDEwMDAuZik7CisgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19XQVJOSU5HLCAiJXNcbiIsIGxvZ19idWYpOworCisgICAgcmV0dXJuIGJlc3Q7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiZHR4IiwgIkFsbG93IERUWCAoZ2VuZXJhdGUgY29tZm9ydCBub2lzZSkiLCBvZmZzZXRvZihBTVJDb250ZXh0LCBlbmNfZHR4KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYW1ybmJfY2xhc3MgPSB7CisgICAgImxpYm9wZW5jb3JlX2Ftcm5iIiwgYXZfZGVmYXVsdF9pdGVtX25hbWUsIG9wdGlvbnMsIExJQkFWVVRJTF9WRVJTSU9OX0lOVAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IGFtcl9uYl9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQU1SQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlICE9IDgwMDAgJiYgYXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfVU5PRkZJQ0lBTCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9ubHkgODAwMEh6IHNhbXBsZSByYXRlIHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBtb25vIHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgYXZjdHgtPmZyYW1lX3NpemUgID0gMTYwOworICAgIGF2Y3R4LT5pbml0aWFsX3BhZGRpbmcgPSA1MDsKKyAgICBmZl9hZl9xdWV1ZV9pbml0KGF2Y3R4LCAmcy0+YWZxKTsKKworICAgIHMtPmVuY19zdGF0ZSA9IEVuY29kZXJfSW50ZXJmYWNlX2luaXQocy0+ZW5jX2R0eCk7CisgICAgaWYgKCFzLT5lbmNfc3RhdGUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFbmNvZGVyX0ludGVyZmFjZV9pbml0IGVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHMtPmVuY19tb2RlICAgID0gZ2V0X2JpdHJhdGVfbW9kZShhdmN0eC0+Yml0X3JhdGUsIGF2Y3R4KTsKKyAgICBzLT5lbmNfYml0cmF0ZSA9IGF2Y3R4LT5iaXRfcmF0ZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYW1yX25iX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQU1SQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBFbmNvZGVyX0ludGVyZmFjZV9leGl0KHMtPmVuY19zdGF0ZSk7CisgICAgZmZfYWZfcXVldWVfY2xvc2UoJnMtPmFmcSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1yX25iX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBBTVJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgd3JpdHRlbiwgcmV0OworICAgIGludDE2X3QgKmZsdXNoX2J1ZiA9IE5VTEw7CisgICAgY29uc3QgaW50MTZfdCAqc2FtcGxlcyA9IGZyYW1lID8gKGNvbnN0IGludDE2X3QgKilmcmFtZS0+ZGF0YVswXSA6IE5VTEw7CisKKyAgICBpZiAocy0+ZW5jX2JpdHJhdGUgIT0gYXZjdHgtPmJpdF9yYXRlKSB7CisgICAgICAgIHMtPmVuY19tb2RlICAgID0gZ2V0X2JpdHJhdGVfbW9kZShhdmN0eC0+Yml0X3JhdGUsIGF2Y3R4KTsKKyAgICAgICAgcy0+ZW5jX2JpdHJhdGUgPSBhdmN0eC0+Yml0X3JhdGU7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgMzIpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgaWYgKGZyYW1lLT5uYl9zYW1wbGVzIDwgYXZjdHgtPmZyYW1lX3NpemUpIHsKKyAgICAgICAgICAgIGZsdXNoX2J1ZiA9IGF2X21hbGxvY3pfYXJyYXkoYXZjdHgtPmZyYW1lX3NpemUsIHNpemVvZigqZmx1c2hfYnVmKSk7CisgICAgICAgICAgICBpZiAoIWZsdXNoX2J1ZikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgbWVtY3B5KGZsdXNoX2J1Ziwgc2FtcGxlcywgZnJhbWUtPm5iX3NhbXBsZXMgKiBzaXplb2YoKmZsdXNoX2J1ZikpOworICAgICAgICAgICAgc2FtcGxlcyA9IGZsdXNoX2J1ZjsKKyAgICAgICAgICAgIGlmIChmcmFtZS0+bmJfc2FtcGxlcyA8IGF2Y3R4LT5mcmFtZV9zaXplIC0gYXZjdHgtPmluaXRpYWxfcGFkZGluZykKKyAgICAgICAgICAgICAgICBzLT5lbmNfbGFzdF9mcmFtZSA9IC0xOworICAgICAgICB9CisgICAgICAgIGlmICgocmV0ID0gZmZfYWZfcXVldWVfYWRkKCZzLT5hZnEsIGZyYW1lKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmZmx1c2hfYnVmKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocy0+ZW5jX2xhc3RfZnJhbWUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZsdXNoX2J1ZiA9IGF2X21hbGxvY3pfYXJyYXkoYXZjdHgtPmZyYW1lX3NpemUsIHNpemVvZigqZmx1c2hfYnVmKSk7CisgICAgICAgIGlmICghZmx1c2hfYnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgc2FtcGxlcyA9IGZsdXNoX2J1ZjsKKyAgICAgICAgcy0+ZW5jX2xhc3RfZnJhbWUgPSAtMTsKKyAgICB9CisKKyAgICB3cml0dGVuID0gRW5jb2Rlcl9JbnRlcmZhY2VfRW5jb2RlKHMtPmVuY19zdGF0ZSwgcy0+ZW5jX21vZGUsIHNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnBrdC0+ZGF0YSwgMCk7CisgICAgYXZfZGxvZyhhdmN0eCwgImFtcl9uYl9lbmNvZGVfZnJhbWUgZW5jb2RlZCAldSBieXRlcywgYml0cmF0ZSAldSwgZmlyc3QgYnl0ZSB3YXMgJSMwMnhcbiIsCisgICAgICAgICAgICB3cml0dGVuLCBzLT5lbmNfbW9kZSwgYXZwa3QtPmRhdGFbMF0pOworCisgICAgLyogR2V0IHRoZSBuZXh0IGZyYW1lIHB0cy9kdXJhdGlvbiAqLworICAgIGZmX2FmX3F1ZXVlX3JlbW92ZSgmcy0+YWZxLCBhdmN0eC0+ZnJhbWVfc2l6ZSwgJmF2cGt0LT5wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICZhdnBrdC0+ZHVyYXRpb24pOworCisgICAgYXZwa3QtPnNpemUgPSB3cml0dGVuOworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgYXZfZnJlZXAoJmZsdXNoX2J1Zik7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbGlib3BlbmNvcmVfYW1ybmJfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlib3BlbmNvcmVfYW1ybmIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPcGVuQ09SRSBBTVItTkIgKEFkYXB0aXZlIE11bHRpLVJhdGUgTmFycm93LUJhbmQpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FNUl9OQiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQU1SQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gYW1yX25iX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGFtcl9uYl9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gYW1yX25iX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfREVMQVkgfCBDT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZhbXJuYl9jbGFzcywKK307CisjZW5kaWYgLyogQ09ORklHX0xJQk9QRU5DT1JFX0FNUk5CX0VOQ09ERVIgKi8KKworI2VuZGlmIC8qIENPTkZJR19MSUJPUEVOQ09SRV9BTVJOQiAqLworCisvKiAtLS0tLS0tLS0tLUFNUiB3aWRlYmFuZCAtLS0tLS0tLS0tLS0qLworI2lmIENPTkZJR19MSUJPUEVOQ09SRV9BTVJXQl9ERUNPREVSCisKKyNpbmNsdWRlIDxvcGVuY29yZS1hbXJ3Yi9kZWNfaWYuaD4KKyNpbmNsdWRlIDxvcGVuY29yZS1hbXJ3Yi9pZl9yb20uaD4KKwordHlwZWRlZiBzdHJ1Y3QgQU1SV0JDb250ZXh0IHsKKyAgICB2b2lkICAqc3RhdGU7Cit9IEFNUldCQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGFtcl93Yl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQU1SV0JDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBhbXJfZGVjb2RlX2ZpeF9hdmN0eChhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHMtPnN0YXRlICAgICAgICA9IERfSUZfaW5pdCgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1yX3diX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBBTVJXQkNvbnRleHQgKnMgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBtb2RlLCByZXQ7CisgICAgaW50IHBhY2tldF9zaXplOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJsb2NrX3NpemVbMTZdID0gezE4LCAyNCwgMzMsIDM3LCA0MSwgNDcsIDUxLCA1OSwgNjEsIDYsIDYsIDAsIDAsIDAsIDEsIDF9OworCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IDMyMDsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgbW9kZSAgICAgICAgPSAoYnVmWzBdID4+IDMpICYgMHgwMDBGOworICAgIHBhY2tldF9zaXplID0gYmxvY2tfc2l6ZVttb2RlXTsKKworICAgIGlmIChwYWNrZXRfc2l6ZSA+IGJ1Zl9zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYW1yIGZyYW1lIHRvbyBzaG9ydCAoJXUsIHNob3VsZCBiZSAldSlcbiIsCisgICAgICAgICAgICAgICBidWZfc2l6ZSwgcGFja2V0X3NpemUgKyAxKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICghcGFja2V0X3NpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJhbXIgcGFja2V0X3NpemUgaW52YWxpZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIERfSUZfZGVjb2RlKHMtPnN0YXRlLCBidWYsIChzaG9ydCAqKWZyYW1lLT5kYXRhWzBdLCBfZ29vZF9mcmFtZSk7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gcGFja2V0X3NpemU7Cit9CisKK3N0YXRpYyBpbnQgYW1yX3diX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQU1SV0JDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIERfSUZfZXhpdChzLT5zdGF0ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbGlib3BlbmNvcmVfYW1yd2JfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlib3BlbmNvcmVfYW1yd2IiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPcGVuQ09SRSBBTVItV0IgKEFkYXB0aXZlIE11bHRpLVJhdGUgV2lkZS1CYW5kKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BTVJfV0IsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFNUldCQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gYW1yX3diX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGFtcl93Yl9kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gYW1yX3diX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19MSUJPUEVOQ09SRV9BTVJXQl9ERUNPREVSICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJvcGVuanBlZ2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlib3BlbmpwZWdkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Y0NmU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlib3BlbmpwZWdkZWMuYwpAQCAtMCwwICsxLDQzMiBAQAorLyoKKyAqIEpQRUcgMjAwMCBkZWNvZGluZyBzdXBwb3J0IHZpYSBPcGVuSlBFRworICogQ29weXJpZ2h0IChjKSAyMDA5IEphaWtyaXNobmFuIE1lbm9uIDxyZWFsaXR5bWFuQGdteC5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEpQRUcgMjAwMCBkZWNvZGVyIHVzaW5nIGxpYm9wZW5qcGVnCisgKi8KKworI2RlZmluZSAgT1BKX1NUQVRJQworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisKKyNpZiBIQVZFX09QRU5KUEVHXzFfNV9PUEVOSlBFR19ICisjIGluY2x1ZGUgPG9wZW5qcGVnLTEuNS9vcGVuanBlZy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8b3BlbmpwZWcuaD4KKyNlbmRpZgorCisjZGVmaW5lIEpQMl9TSUdfVFlQRSAgICAweDZBNTAyMDIwCisjZGVmaW5lIEpQMl9TSUdfVkFMVUUgICAweDBEMEE4NzBBCisKKy8vIHBpeF9mbXRzIHdpdGggbG93ZXIgYnBwIGhhdmUgdG8gYmUgbGlzdGVkIGJlZm9yZQorLy8gc2ltaWxhciBwaXhfZm10cyB3aXRoIGhpZ2hlciBicHAuCisjZGVmaW5lIFJHQl9QSVhFTF9GT1JNQVRTICBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX1JHQkEsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1JHQjQ4LCBBVl9QSVhfRk1UX1JHQkE2NAorCisjZGVmaW5lIEdSQVlfUElYRUxfRk9STUFUUyBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX1lBOCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNgorCisjZGVmaW5lIFlVVl9QSVhFTF9GT1JNQVRTICBBVl9QSVhfRk1UX1lVVjQxMFAsIEFWX1BJWF9GTVRfWVVWNDExUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFA5LCBBVl9QSVhfRk1UX1lVVjQyMlA5LCBBVl9QSVhfRk1UX1lVVjQ0NFA5LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQOSwgQVZfUElYX0ZNVF9ZVVZBNDIyUDksIEFWX1BJWF9GTVRfWVVWQTQ0NFA5LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQMTAsIEFWX1BJWF9GTVRfWVVWQTQyMlAxMCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTQsIEFWX1BJWF9GTVRfWVVWNDQ0UDE0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTYsIEFWX1BJWF9GTVRfWVVWNDQ0UDE2LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQMTYsIEFWX1BJWF9GTVRfWVVWQTQyMlAxNiwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2CisKKyNkZWZpbmUgWFlaX1BJWEVMX0ZPUk1BVFMgIEFWX1BJWF9GTVRfWFlaMTIKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBsaWJvcGVuanBlZ19yZ2JfcGl4X2ZtdHNbXSAgPSB7CisgICAgUkdCX1BJWEVMX0ZPUk1BVFMKK307CitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGxpYm9wZW5qcGVnX2dyYXlfcGl4X2ZtdHNbXSA9IHsKKyAgICBHUkFZX1BJWEVMX0ZPUk1BVFMKK307CitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGxpYm9wZW5qcGVnX3l1dl9waXhfZm10c1tdICA9IHsKKyAgICBZVVZfUElYRUxfRk9STUFUUworfTsKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbGlib3BlbmpwZWdfYWxsX3BpeF9mbXRzW10gID0geworICAgIFJHQl9QSVhFTF9GT1JNQVRTLCBHUkFZX1BJWEVMX0ZPUk1BVFMsIFlVVl9QSVhFTF9GT1JNQVRTLCBYWVpfUElYRUxfRk9STUFUUworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIG9wal9kcGFyYW1ldGVyc190IGRlY19wYXJhbXM7CisgICAgaW50IGxvd3F1YWw7Cit9IExpYk9wZW5KUEVHQ29udGV4dDsKKworc3RhdGljIGlubGluZSBpbnQgbGlib3BlbmpwZWdfbWF0Y2hlc19waXhfZm10KGNvbnN0IG9wal9pbWFnZV90ICppbWFnZSwgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBpbnQgbWF0Y2ggPSAxOworCisgICAgaWYgKGRlc2MtPm5iX2NvbXBvbmVudHMgIT0gaW1hZ2UtPm51bWNvbXBzKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN3aXRjaCAoZGVzYy0+bmJfY29tcG9uZW50cykgeworICAgIGNhc2UgNDoKKyAgICAgICAgbWF0Y2ggPSBtYXRjaCAmJgorICAgICAgICAgICAgICAgIGRlc2MtPmNvbXBbM10uZGVwdGhfbWludXMxICsgMSA+PSBpbWFnZS0+Y29tcHNbM10ucHJlYyAmJgorICAgICAgICAgICAgICAgIDEgPT0gaW1hZ2UtPmNvbXBzWzNdLmR4ICYmCisgICAgICAgICAgICAgICAgMSA9PSBpbWFnZS0+Y29tcHNbM10uZHk7CisgICAgY2FzZSAzOgorICAgICAgICBtYXRjaCA9IG1hdGNoICYmCisgICAgICAgICAgICAgICAgZGVzYy0+Y29tcFsyXS5kZXB0aF9taW51czEgKyAxID49IGltYWdlLT5jb21wc1syXS5wcmVjICYmCisgICAgICAgICAgICAgICAgMSA8PCBkZXNjLT5sb2cyX2Nocm9tYV93ID09IGltYWdlLT5jb21wc1syXS5keCAmJgorICAgICAgICAgICAgICAgIDEgPDwgZGVzYy0+bG9nMl9jaHJvbWFfaCA9PSBpbWFnZS0+Y29tcHNbMl0uZHk7CisgICAgY2FzZSAyOgorICAgICAgICBtYXRjaCA9IG1hdGNoICYmCisgICAgICAgICAgICAgICAgZGVzYy0+Y29tcFsxXS5kZXB0aF9taW51czEgKyAxID49IGltYWdlLT5jb21wc1sxXS5wcmVjICYmCisgICAgICAgICAgICAgICAgMSA8PCBkZXNjLT5sb2cyX2Nocm9tYV93ID09IGltYWdlLT5jb21wc1sxXS5keCAmJgorICAgICAgICAgICAgICAgIDEgPDwgZGVzYy0+bG9nMl9jaHJvbWFfaCA9PSBpbWFnZS0+Y29tcHNbMV0uZHk7CisgICAgY2FzZSAxOgorICAgICAgICBtYXRjaCA9IG1hdGNoICYmCisgICAgICAgICAgICAgICAgZGVzYy0+Y29tcFswXS5kZXB0aF9taW51czEgKyAxID49IGltYWdlLT5jb21wc1swXS5wcmVjICYmCisgICAgICAgICAgICAgICAgMSA9PSBpbWFnZS0+Y29tcHNbMF0uZHggJiYKKyAgICAgICAgICAgICAgICAxID09IGltYWdlLT5jb21wc1swXS5keTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gbWF0Y2g7Cit9CisKK3N0YXRpYyBpbmxpbmUgZW51bSBBVlBpeGVsRm9ybWF0IGxpYm9wZW5qcGVnX2d1ZXNzX3BpeF9mbXQoY29uc3Qgb3BqX2ltYWdlX3QgKmltYWdlKSB7CisgICAgaW50IGluZGV4OworICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcG9zc2libGVfZm10cyA9IE5VTEw7CisgICAgaW50IHBvc3NpYmxlX2ZtdHNfbmIgPSAwOworCisgICAgc3dpdGNoIChpbWFnZS0+Y29sb3Jfc3BhY2UpIHsKKyAgICBjYXNlIENMUlNQQ19TUkdCOgorICAgICAgICBwb3NzaWJsZV9mbXRzICAgID0gbGlib3BlbmpwZWdfcmdiX3BpeF9mbXRzOworICAgICAgICBwb3NzaWJsZV9mbXRzX25iID0gRkZfQVJSQVlfRUxFTVMobGlib3BlbmpwZWdfcmdiX3BpeF9mbXRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTFJTUENfR1JBWToKKyAgICAgICAgcG9zc2libGVfZm10cyAgICA9IGxpYm9wZW5qcGVnX2dyYXlfcGl4X2ZtdHM7CisgICAgICAgIHBvc3NpYmxlX2ZtdHNfbmIgPSBGRl9BUlJBWV9FTEVNUyhsaWJvcGVuanBlZ19ncmF5X3BpeF9mbXRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTFJTUENfU1lDQzoKKyAgICAgICAgcG9zc2libGVfZm10cyAgICA9IGxpYm9wZW5qcGVnX3l1dl9waXhfZm10czsKKyAgICAgICAgcG9zc2libGVfZm10c19uYiA9IEZGX0FSUkFZX0VMRU1TKGxpYm9wZW5qcGVnX3l1dl9waXhfZm10cyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHBvc3NpYmxlX2ZtdHMgICAgPSBsaWJvcGVuanBlZ19hbGxfcGl4X2ZtdHM7CisgICAgICAgIHBvc3NpYmxlX2ZtdHNfbmIgPSBGRl9BUlJBWV9FTEVNUyhsaWJvcGVuanBlZ19hbGxfcGl4X2ZtdHMpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwb3NzaWJsZV9mbXRzX25iOyArK2luZGV4KQorICAgICAgICBpZiAobGlib3BlbmpwZWdfbWF0Y2hlc19waXhfZm10KGltYWdlLCBwb3NzaWJsZV9mbXRzW2luZGV4XSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NzaWJsZV9mbXRzW2luZGV4XTsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIEFWX1BJWF9GTVRfTk9ORTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGlib3BlbmpwZWdfaXNwYWNrZWQoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBpbnQgaSwgY29tcG9uZW50X3BsYW5lOworCisgICAgaWYgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HUkFZMTYpCisgICAgICAgIHJldHVybiAwOworCisgICAgY29tcG9uZW50X3BsYW5lID0gZGVzYy0+Y29tcFswXS5wbGFuZTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgZGVzYy0+bmJfY29tcG9uZW50czsgaSsrKQorICAgICAgICBpZiAoY29tcG9uZW50X3BsYW5lICE9IGRlc2MtPmNvbXBbaV0ucGxhbmUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpYm9wZW5qcGVnX2NvcHlfdG9fcGFja2VkOChBVkZyYW1lICpwaWN0dXJlLCBvcGpfaW1hZ2VfdCAqaW1hZ2UpIHsKKyAgICB1aW50OF90ICppbWdfcHRyOworICAgIGludCBpbmRleCwgeCwgeSwgYzsKKyAgICBmb3IgKHkgPSAwOyB5IDwgcGljdHVyZS0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaW5kZXggICA9IHkgKiBwaWN0dXJlLT53aWR0aDsKKyAgICAgICAgaW1nX3B0ciA9IHBpY3R1cmUtPmRhdGFbMF0gKyB5ICogcGljdHVyZS0+bGluZXNpemVbMF07CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBwaWN0dXJlLT53aWR0aDsgeCsrLCBpbmRleCsrKQorICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGltYWdlLT5udW1jb21wczsgYysrKQorICAgICAgICAgICAgICAgICppbWdfcHRyKysgPSAweDgwICogaW1hZ2UtPmNvbXBzW2NdLnNnbmQgKyBpbWFnZS0+Y29tcHNbY10uZGF0YVtpbmRleF07CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlib3BlbmpwZWdfY29weV90b19wYWNrZWQxNihBVkZyYW1lICpwaWN0dXJlLCBvcGpfaW1hZ2VfdCAqaW1hZ2UpIHsKKyAgICB1aW50MTZfdCAqaW1nX3B0cjsKKyAgICBpbnQgaW5kZXgsIHgsIHksIGM7CisgICAgaW50IGFkanVzdFs0XTsKKyAgICBmb3IgKHggPSAwOyB4IDwgaW1hZ2UtPm51bWNvbXBzOyB4KyspCisgICAgICAgIGFkanVzdFt4XSA9IEZGTUFYKEZGTUlOKGF2X3BpeF9mbXRfZGVzY19nZXQocGljdHVyZS0+Zm9ybWF0KS0+Y29tcFt4XS5kZXB0aF9taW51czEgKyAxIC0gaW1hZ2UtPmNvbXBzW3hdLnByZWMsIDgpLCAwKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBwaWN0dXJlLT5oZWlnaHQ7IHkrKykgeworICAgICAgICBpbmRleCAgID0geSAqIHBpY3R1cmUtPndpZHRoOworICAgICAgICBpbWdfcHRyID0gKHVpbnQxNl90ICopIChwaWN0dXJlLT5kYXRhWzBdICsgeSAqIHBpY3R1cmUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHBpY3R1cmUtPndpZHRoOyB4KyssIGluZGV4KyspCisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgaW1hZ2UtPm51bWNvbXBzOyBjKyspCisgICAgICAgICAgICAgICAgKmltZ19wdHIrKyA9ICgxIDw8IGltYWdlLT5jb21wc1tjXS5wcmVjIC0gMSkgKiBpbWFnZS0+Y29tcHNbY10uc2duZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClpbWFnZS0+Y29tcHNbY10uZGF0YVtpbmRleF0gPDwgYWRqdXN0W2NdOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpYm9wZW5qcGVnX2NvcHl0bzgoQVZGcmFtZSAqcGljdHVyZSwgb3BqX2ltYWdlX3QgKmltYWdlKSB7CisgICAgaW50ICpjb21wX2RhdGE7CisgICAgdWludDhfdCAqaW1nX3B0cjsKKyAgICBpbnQgaW5kZXgsIHgsIHk7CisKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBpbWFnZS0+bnVtY29tcHM7IGluZGV4KyspIHsKKyAgICAgICAgY29tcF9kYXRhID0gaW1hZ2UtPmNvbXBzW2luZGV4XS5kYXRhOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaW1hZ2UtPmNvbXBzW2luZGV4XS5oOyB5KyspIHsKKyAgICAgICAgICAgIGltZ19wdHIgPSBwaWN0dXJlLT5kYXRhW2luZGV4XSArIHkgKiBwaWN0dXJlLT5saW5lc2l6ZVtpbmRleF07CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW1hZ2UtPmNvbXBzW2luZGV4XS53OyB4KyspIHsKKyAgICAgICAgICAgICAgICAqaW1nX3B0ciA9IDB4ODAgKiBpbWFnZS0+Y29tcHNbaW5kZXhdLnNnbmQgKyAqY29tcF9kYXRhOworICAgICAgICAgICAgICAgIGltZ19wdHIrKzsKKyAgICAgICAgICAgICAgICBjb21wX2RhdGErKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpYm9wZW5qcGVnX2NvcHl0bzE2KEFWRnJhbWUgKnBpY3R1cmUsIG9wal9pbWFnZV90ICppbWFnZSkgeworICAgIGludCAqY29tcF9kYXRhOworICAgIHVpbnQxNl90ICppbWdfcHRyOworICAgIGludCBpbmRleCwgeCwgeTsKKyAgICBpbnQgYWRqdXN0WzRdOworICAgIGZvciAoeCA9IDA7IHggPCBpbWFnZS0+bnVtY29tcHM7IHgrKykKKyAgICAgICAgYWRqdXN0W3hdID0gRkZNQVgoRkZNSU4oYXZfcGl4X2ZtdF9kZXNjX2dldChwaWN0dXJlLT5mb3JtYXQpLT5jb21wW3hdLmRlcHRoX21pbnVzMSArIDEgLSBpbWFnZS0+Y29tcHNbeF0ucHJlYywgOCksIDApOworCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaW1hZ2UtPm51bWNvbXBzOyBpbmRleCsrKSB7CisgICAgICAgIGNvbXBfZGF0YSA9IGltYWdlLT5jb21wc1tpbmRleF0uZGF0YTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGltYWdlLT5jb21wc1tpbmRleF0uaDsgeSsrKSB7CisgICAgICAgICAgICBpbWdfcHRyID0gKHVpbnQxNl90ICopKHBpY3R1cmUtPmRhdGFbaW5kZXhdICsgeSAqIHBpY3R1cmUtPmxpbmVzaXplW2luZGV4XSk7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW1hZ2UtPmNvbXBzW2luZGV4XS53OyB4KyspIHsKKyAgICAgICAgICAgICAgICAqaW1nX3B0ciA9ICgxIDw8IGltYWdlLT5jb21wc1tpbmRleF0ucHJlYyAtIDEpICogaW1hZ2UtPmNvbXBzW2luZGV4XS5zZ25kICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkqY29tcF9kYXRhIDw8IGFkanVzdFtpbmRleF07CisgICAgICAgICAgICAgICAgaW1nX3B0cisrOworICAgICAgICAgICAgICAgIGNvbXBfZGF0YSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbGlib3BlbmpwZWdfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIExpYk9wZW5KUEVHQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIG9wal9zZXRfZGVmYXVsdF9kZWNvZGVyX3BhcmFtZXRlcnMoJmN0eC0+ZGVjX3BhcmFtcyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGlib3BlbmpwZWdfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIHVpbnQ4X3QgKmJ1ZiAgICAgICAgICAgID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBMaWJPcGVuSlBFR0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVGhyZWFkRnJhbWUgZnJhbWUgICAgICAgPSB7IC5mID0gZGF0YSB9OworICAgIEFWRnJhbWUgKnBpY3R1cmUgICAgICAgID0gZGF0YTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7CisgICAgb3BqX2RpbmZvX3QgKmRlYzsKKyAgICBvcGpfY2lvX3QgKnN0cmVhbTsKKyAgICBvcGpfaW1hZ2VfdCAqaW1hZ2U7CisgICAgaW50IHdpZHRoLCBoZWlnaHQsIHJldDsKKyAgICBpbnQgcGl4ZWxfc2l6ZSA9IDA7CisgICAgaW50IGlzcGFja2VkICAgPSAwOworICAgIGludCBpOworCisgICAgKmdvdF9mcmFtZSA9IDA7CisKKyAgICAvLyBDaGVjayBpZiBpbnB1dCBpcyBhIHJhdyBqcGVnMmsgY29kZXN0cmVhbSBvciBpbiBqcDIgd3JhcHBpbmcKKyAgICBpZiAoKEFWX1JCMzIoYnVmKSA9PSAxMikgJiYKKyAgICAgICAgKEFWX1JCMzIoYnVmICsgNCkgPT0gSlAyX1NJR19UWVBFKSAmJgorICAgICAgICAoQVZfUkIzMihidWYgKyA4KSA9PSBKUDJfU0lHX1ZBTFVFKSkgeworICAgICAgICBkZWMgPSBvcGpfY3JlYXRlX2RlY29tcHJlc3MoQ09ERUNfSlAyKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBJZiB0aGUgQVZQYWNrZXQgY29udGFpbnMgYSBqcDJjIGJveCwgdGhlbiBza2lwIHRvCisgICAgICAgICAqIHRoZSBzdGFydGluZyBieXRlIG9mIHRoZSBjb2Rlc3RyZWFtLiAqLworICAgICAgICBpZiAoQVZfUkIzMihidWYgKyA0KSA9PSBBVl9SQjMyKCJqcDJjIikpCisgICAgICAgICAgICBidWYgKz0gODsKKyAgICAgICAgZGVjID0gb3BqX2NyZWF0ZV9kZWNvbXByZXNzKENPREVDX0oySyk7CisgICAgfQorCisgICAgaWYgKCFkZWMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBpbml0aWFsaXppbmcgZGVjb2Rlci5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBvcGpfc2V0X2V2ZW50X21ncigob3BqX2NvbW1vbl9wdHIpIGRlYywgTlVMTCwgTlVMTCk7CisgICAgY3R4LT5kZWNfcGFyYW1zLmNwX2xpbWl0X2RlY29kaW5nID0gTElNSVRfVE9fTUFJTl9IRUFERVI7CisgICAgY3R4LT5kZWNfcGFyYW1zLmNwX2xheWVyICAgICAgICAgID0gY3R4LT5sb3dxdWFsOworICAgIC8vIFRpZSBkZWNvZGVyIHdpdGggZGVjb2RpbmcgcGFyYW1ldGVycworICAgIG9wal9zZXR1cF9kZWNvZGVyKGRlYywgJmN0eC0+ZGVjX3BhcmFtcyk7CisgICAgc3RyZWFtID0gb3BqX2Npb19vcGVuKChvcGpfY29tbW9uX3B0cikgZGVjLCBidWYsIGJ1Zl9zaXplKTsKKworICAgIGlmICghc3RyZWFtKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvZGVzdHJlYW0gY291bGQgbm90IGJlIG9wZW5lZCBmb3IgcmVhZGluZy5cbiIpOworICAgICAgICBvcGpfZGVzdHJveV9kZWNvbXByZXNzKGRlYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgLy8gRGVjb2RlIHRoZSBoZWFkZXIgb25seS4KKyAgICBpbWFnZSA9IG9wal9kZWNvZGVfd2l0aF9pbmZvKGRlYywgc3RyZWFtLCBOVUxMKTsKKyAgICBvcGpfY2lvX2Nsb3NlKHN0cmVhbSk7CisKKyAgICBpZiAoIWltYWdlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZGVjb2RpbmcgY29kZXN0cmVhbS5cbiIpOworICAgICAgICBvcGpfZGVzdHJveV9kZWNvbXByZXNzKGRlYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgd2lkdGggID0gaW1hZ2UtPngxIC0gaW1hZ2UtPngwOworICAgIGhlaWdodCA9IGltYWdlLT55MSAtIGltYWdlLT55MDsKKworICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBkb25lOworCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgaWYgKCFsaWJvcGVuanBlZ19tYXRjaGVzX3BpeF9mbXQoaW1hZ2UsIGF2Y3R4LT5waXhfZm10KSkKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBsaWJvcGVuanBlZ19ndWVzc19waXhfZm10KGltYWdlKTsKKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gZGV0ZXJtaW5lIHBpeGVsIGZvcm1hdFxuIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKQorICAgICAgICBpZiAoaW1hZ2UtPmNvbXBzW2ldLnByZWMgPiBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSkKKyAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gaW1hZ2UtPmNvbXBzW2ldLnByZWM7CisKKyAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmZnJhbWUsIDApKSA8IDApCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgIGN0eC0+ZGVjX3BhcmFtcy5jcF9saW1pdF9kZWNvZGluZyA9IE5PX0xJTUlUQVRJT047CisgICAgY3R4LT5kZWNfcGFyYW1zLmNwX3JlZHVjZSA9IGF2Y3R4LT5sb3dyZXM7CisgICAgLy8gVGllIGRlY29kZXIgd2l0aCBkZWNvZGluZyBwYXJhbWV0ZXJzLgorICAgIG9wal9zZXR1cF9kZWNvZGVyKGRlYywgJmN0eC0+ZGVjX3BhcmFtcyk7CisgICAgc3RyZWFtID0gb3BqX2Npb19vcGVuKChvcGpfY29tbW9uX3B0cikgZGVjLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBpZiAoIXN0cmVhbSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDb2Rlc3RyZWFtIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yIHJlYWRpbmcuXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworICAgIC8vIERlY29kZSB0aGUgY29kZXN0cmVhbQorICAgIGltYWdlID0gb3BqX2RlY29kZV93aXRoX2luZm8oZGVjLCBzdHJlYW0sIE5VTEwpOworICAgIG9wal9jaW9fY2xvc2Uoc3RyZWFtKTsKKworICAgIGlmICghaW1hZ2UpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBkZWNvZGluZyBjb2Rlc3RyZWFtLlxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGRlc2MgICAgICAgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKKyAgICBwaXhlbF9zaXplID0gZGVzYy0+Y29tcFswXS5zdGVwX21pbnVzMSArIDE7CisgICAgaXNwYWNrZWQgICA9IGxpYm9wZW5qcGVnX2lzcGFja2VkKGF2Y3R4LT5waXhfZm10KTsKKworICAgIHN3aXRjaCAocGl4ZWxfc2l6ZSkgeworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGlzcGFja2VkKSB7CisgICAgICAgICAgICBsaWJvcGVuanBlZ19jb3B5X3RvX3BhY2tlZDgocGljdHVyZSwgaW1hZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGlib3BlbmpwZWdfY29weXRvOChwaWN0dXJlLCBpbWFnZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoaXNwYWNrZWQpIHsKKyAgICAgICAgICAgIGxpYm9wZW5qcGVnX2NvcHlfdG9fcGFja2VkOChwaWN0dXJlLCBpbWFnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaWJvcGVuanBlZ19jb3B5dG8xNihwaWN0dXJlLCBpbWFnZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICAgICAgaWYgKGlzcGFja2VkKSB7CisgICAgICAgICAgICBsaWJvcGVuanBlZ19jb3B5X3RvX3BhY2tlZDgocGljdHVyZSwgaW1hZ2UpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICBjYXNlIDg6CisgICAgICAgIGlmIChpc3BhY2tlZCkgeworICAgICAgICAgICAgbGlib3BlbmpwZWdfY29weV90b19wYWNrZWQxNihwaWN0dXJlLCBpbWFnZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBwaXhlbCBzaXplICVkXG4iLCBwaXhlbF9zaXplKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKyAgICByZXQgICAgICAgID0gYnVmX3NpemU7CisKK2RvbmU6CisgICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworICAgIG9wal9kZXN0cm95X2RlY29tcHJlc3MoZGVjKTsKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihMaWJPcGVuSlBFR0NvbnRleHQsIHgpCisjZGVmaW5lIFZEIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJsb3dxdWFsIiwgIkxpbWl0IHRoZSBudW1iZXIgb2YgbGF5ZXJzIHVzZWQgZm9yIGRlY29kaW5nIiwKKyAgICAgICAgT0ZGU0VUKGxvd3F1YWwpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgVkQgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG9wZW5qcGVnX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImxpYm9wZW5qcGVnIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbGlib3BlbmpwZWdfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlib3BlbmpwZWciLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPcGVuSlBFRyBKUEVHIDIwMDAiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSlBFRzIwMDAsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKExpYk9wZW5KUEVHQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbGlib3BlbmpwZWdfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gbGlib3BlbmpwZWdfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKKyAgICAubWF4X2xvd3JlcyAgICAgPSAzMSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmb3BlbmpwZWdfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGlib3BlbmpwZWdlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYm9wZW5qcGVnZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2MzNmNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYm9wZW5qcGVnZW5jLmMKQEAgLTAsMCArMSw2NjkgQEAKKy8qCisgKiBKUEVHIDIwMDAgZW5jb2Rpbmcgc3VwcG9ydCB2aWEgT3BlbkpQRUcKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNaWNoYWVsIEJyYWRzaGF3IDxtamJzaGF3IGdtYWlsIGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSlBFRyAyMDAwIGVuY29kZXIgdXNpbmcgbGlib3BlbmpwZWcKKyAqLworCisjZGVmaW5lICBPUEpfU1RBVElDCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2lmIEhBVkVfT1BFTkpQRUdfMV81X09QRU5KUEVHX0gKKyMgaW5jbHVkZSA8b3BlbmpwZWctMS41L29wZW5qcGVnLmg+CisjZWxzZQorIyBpbmNsdWRlIDxvcGVuanBlZy5oPgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICphdmNsYXNzOworICAgIG9wal9pbWFnZV90ICppbWFnZTsKKyAgICBvcGpfY2lvX3QgKnN0cmVhbTsKKyAgICBvcGpfY3BhcmFtZXRlcnNfdCBlbmNfcGFyYW1zOworICAgIG9wal9jaW5mb190ICpjb21wcmVzczsKKyAgICBvcGpfZXZlbnRfbWdyX3QgZXZlbnRfbWdyOworICAgIGludCBmb3JtYXQ7CisgICAgaW50IHByb2ZpbGU7CisgICAgaW50IHByb2dfb3JkZXI7CisgICAgaW50IGNpbmVtYV9tb2RlOworICAgIGludCBudW1yZXNvbHV0aW9uOworICAgIGludCBudW1sYXllcnM7CisgICAgaW50IGRpc3RvX2FsbG9jOworICAgIGludCBmaXhlZF9hbGxvYzsKKyAgICBpbnQgZml4ZWRfcXVhbGl0eTsKK30gTGliT3BlbkpQRUdDb250ZXh0OworCitzdGF0aWMgdm9pZCBlcnJvcl9jYWxsYmFjayhjb25zdCBjaGFyICptc2csIHZvaWQgKmRhdGEpCit7CisgICAgYXZfbG9nKGRhdGEsIEFWX0xPR19FUlJPUiwgIiVzXG4iLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCB3YXJuaW5nX2NhbGxiYWNrKGNvbnN0IGNoYXIgKm1zZywgdm9pZCAqZGF0YSkKK3sKKyAgICBhdl9sb2coZGF0YSwgQVZfTE9HX1dBUk5JTkcsICIlc1xuIiwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgaW5mb19jYWxsYmFjayhjb25zdCBjaGFyICptc2csIHZvaWQgKmRhdGEpCit7CisgICAgYXZfbG9nKGRhdGEsIEFWX0xPR19ERUJVRywgIiVzXG4iLCBtc2cpOworfQorCitzdGF0aWMgb3BqX2ltYWdlX3QgKm1qMl9jcmVhdGVfaW1hZ2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycykKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKKyAgICBvcGpfaW1hZ2VfY21wdHBhcm1fdCBjbXB0cGFybVs0XSA9IHt7MH19OworICAgIG9wal9pbWFnZV90ICppbWc7CisgICAgaW50IGk7CisgICAgaW50IHN1Yl9keFs0XTsKKyAgICBpbnQgc3ViX2R5WzRdOworICAgIGludCBudW1jb21wczsKKyAgICBPUEpfQ09MT1JfU1BBQ0UgY29sb3Jfc3BhY2UgPSBDTFJTUENfVU5LTk9XTjsKKworICAgIHN1Yl9keFswXSA9IHN1Yl9keFszXSA9IDE7CisgICAgc3ViX2R5WzBdID0gc3ViX2R5WzNdID0gMTsKKyAgICBzdWJfZHhbMV0gPSBzdWJfZHhbMl0gPSAxIDw8IGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgc3ViX2R5WzFdID0gc3ViX2R5WzJdID0gMSA8PCBkZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgbnVtY29tcHMgPSBkZXNjLT5uYl9jb21wb25lbnRzOworCisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWUE4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTY6CisgICAgICAgIGNvbG9yX3NwYWNlID0gQ0xSU1BDX0dSQVk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDg6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSMjRQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTI6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE2OgorICAgIGNhc2UgQVZfUElYX0ZNVF9YWVoxMjoKKyAgICAgICAgY29sb3Jfc3BhY2UgPSBDTFJTUENfU1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQxMFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQxMVA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0MFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTI6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDE0OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDE2OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTY6CisgICAgICAgIGNvbG9yX3NwYWNlID0gQ0xSU1BDX1NZQ0M7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoZSByZXF1ZXN0ZWQgcGl4ZWwgZm9ybWF0ICclcycgaXMgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoYXZjdHgtPnBpeF9mbXQpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG51bWNvbXBzOyBpKyspIHsKKyAgICAgICAgY21wdHBhcm1baV0ucHJlYyA9IGRlc2MtPmNvbXBbaV0uZGVwdGhfbWludXMxICsgMTsKKyAgICAgICAgY21wdHBhcm1baV0uYnBwICA9IGRlc2MtPmNvbXBbaV0uZGVwdGhfbWludXMxICsgMTsKKyAgICAgICAgY21wdHBhcm1baV0uc2duZCA9IDA7CisgICAgICAgIGNtcHRwYXJtW2ldLmR4ID0gc3ViX2R4W2ldOworICAgICAgICBjbXB0cGFybVtpXS5keSA9IHN1Yl9keVtpXTsKKyAgICAgICAgY21wdHBhcm1baV0udyA9IChhdmN0eC0+d2lkdGggKyBzdWJfZHhbaV0gLSAxKSAvIHN1Yl9keFtpXTsKKyAgICAgICAgY21wdHBhcm1baV0uaCA9IChhdmN0eC0+aGVpZ2h0ICsgc3ViX2R5W2ldIC0gMSkgLyBzdWJfZHlbaV07CisgICAgfQorCisgICAgaW1nID0gb3BqX2ltYWdlX2NyZWF0ZShudW1jb21wcywgY21wdHBhcm0sIGNvbG9yX3NwYWNlKTsKKworICAgIC8vIHgwLCB5MCBpcyB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZQorICAgIC8vIHgxLCB5MSBpcyB0aGUgd2lkdGgsIGhlaWdodCBvZiB0aGUgcmVmZXJlbmNlIGdyaWQKKyAgICBpbWctPngwID0gMDsKKyAgICBpbWctPnkwID0gMDsKKyAgICBpbWctPngxID0gKGF2Y3R4LT53aWR0aCAgLSAxKSAqIHBhcmFtZXRlcnMtPnN1YnNhbXBsaW5nX2R4ICsgMTsKKyAgICBpbWctPnkxID0gKGF2Y3R4LT5oZWlnaHQgLSAxKSAqIHBhcmFtZXRlcnMtPnN1YnNhbXBsaW5nX2R5ICsgMTsKKworICAgIHJldHVybiBpbWc7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJvcGVuanBlZ19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTGliT3BlbkpQRUdDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBvcGpfc2V0X2RlZmF1bHRfZW5jb2Rlcl9wYXJhbWV0ZXJzKCZjdHgtPmVuY19wYXJhbXMpOworCisgICAgY3R4LT5lbmNfcGFyYW1zLmNwX3JzaXogPSBjdHgtPnByb2ZpbGU7CisgICAgY3R4LT5lbmNfcGFyYW1zLm1vZGUgPSAhIWF2Y3R4LT5nbG9iYWxfcXVhbGl0eTsKKyAgICBjdHgtPmVuY19wYXJhbXMuY3BfY2luZW1hID0gY3R4LT5jaW5lbWFfbW9kZTsKKyAgICBjdHgtPmVuY19wYXJhbXMucHJvZ19vcmRlciA9IGN0eC0+cHJvZ19vcmRlcjsKKyAgICBjdHgtPmVuY19wYXJhbXMubnVtcmVzb2x1dGlvbiA9IGN0eC0+bnVtcmVzb2x1dGlvbjsKKyAgICBjdHgtPmVuY19wYXJhbXMuY3BfZGlzdG9fYWxsb2MgPSBjdHgtPmRpc3RvX2FsbG9jOworICAgIGN0eC0+ZW5jX3BhcmFtcy5jcF9maXhlZF9hbGxvYyA9IGN0eC0+Zml4ZWRfYWxsb2M7CisgICAgY3R4LT5lbmNfcGFyYW1zLmNwX2ZpeGVkX3F1YWxpdHkgPSBjdHgtPmZpeGVkX3F1YWxpdHk7CisgICAgY3R4LT5lbmNfcGFyYW1zLnRjcF9udW1sYXllcnMgPSBjdHgtPm51bWxheWVyczsKKyAgICBjdHgtPmVuY19wYXJhbXMudGNwX3JhdGVzWzBdID0gRkZNQVgoYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsLCAwKSAqIDI7CisKKyAgICBpZiAoY3R4LT5jaW5lbWFfbW9kZSA+IDApIHsKKyAgICAgICAgY3R4LT5lbmNfcGFyYW1zLmlycmV2ZXJzaWJsZSA9IDE7CisgICAgICAgIGN0eC0+ZW5jX3BhcmFtcy50Y3BfbWN0ID0gMTsKKyAgICAgICAgY3R4LT5lbmNfcGFyYW1zLnRpbGVfc2l6ZV9vbiA9IDA7CisgICAgICAgIC8qIG5vIHN1YnNhbXBsaW5nICovCisgICAgICAgIGN0eC0+ZW5jX3BhcmFtcy5jcF90ZHg9MTsKKyAgICAgICAgY3R4LT5lbmNfcGFyYW1zLmNwX3RkeT0xOworICAgICAgICBjdHgtPmVuY19wYXJhbXMuc3Vic2FtcGxpbmdfZHggPSAxOworICAgICAgICBjdHgtPmVuY19wYXJhbXMuc3Vic2FtcGxpbmdfZHkgPSAxOworICAgICAgICAvKiBUaWxlIGFuZCBJbWFnZSBzaGFsbCBiZSBhdCAoMCwwKSAqLworICAgICAgICBjdHgtPmVuY19wYXJhbXMuY3BfdHgwID0gMDsKKyAgICAgICAgY3R4LT5lbmNfcGFyYW1zLmNwX3R5MCA9IDA7CisgICAgICAgIGN0eC0+ZW5jX3BhcmFtcy5pbWFnZV9vZmZzZXRfeDAgPSAwOworICAgICAgICBjdHgtPmVuY19wYXJhbXMuaW1hZ2Vfb2Zmc2V0X3kwID0gMDsKKyAgICAgICAgLyogQ29kZWJsb2NrIHNpemU9IDMyKjMyICovCisgICAgICAgIGN0eC0+ZW5jX3BhcmFtcy5jYmxvY2t3X2luaXQgPSAzMjsKKyAgICAgICAgY3R4LT5lbmNfcGFyYW1zLmNibG9ja2hfaW5pdCA9IDMyOworICAgICAgICBjdHgtPmVuY19wYXJhbXMuY3N0eSB8PSAweDAxOworICAgICAgICAvKiBObyBST0kgKi8KKyAgICAgICAgY3R4LT5lbmNfcGFyYW1zLnJvaV9jb21wbm8gPSAtMTsKKworICAgICAgICBpZiAoY3R4LT5lbmNfcGFyYW1zLnByb2dfb3JkZXIgIT0gQ1BSTCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwcm9nX29yZGVyIGZvcmNlZCB0byBDUFJMXG4iKTsKKyAgICAgICAgICAgIGN0eC0+ZW5jX3BhcmFtcy5wcm9nX29yZGVyID0gQ1BSTDsKKyAgICAgICAgfQorICAgICAgICBjdHgtPmVuY19wYXJhbXMudHBfZmxhZyA9ICdDJzsKKyAgICAgICAgY3R4LT5lbmNfcGFyYW1zLnRwX29uID0gMTsKKyAgICB9CisKKyAgICBjdHgtPmNvbXByZXNzID0gb3BqX2NyZWF0ZV9jb21wcmVzcyhjdHgtPmZvcm1hdCk7CisgICAgaWYgKCFjdHgtPmNvbXByZXNzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgY3JlYXRpbmcgdGhlIGNvbXByZXNzb3JcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGN0eC0+aW1hZ2UgPSBtajJfY3JlYXRlX2ltYWdlKGF2Y3R4LCAmY3R4LT5lbmNfcGFyYW1zKTsKKyAgICBpZiAoIWN0eC0+aW1hZ2UpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBjcmVhdGluZyB0aGUgbWoyIGltYWdlXG4iKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIG9wal9zZXR1cF9lbmNvZGVyKGN0eC0+Y29tcHJlc3MsICZjdHgtPmVuY19wYXJhbXMsIGN0eC0+aW1hZ2UpOworCisgICAgY3R4LT5zdHJlYW0gPSBvcGpfY2lvX29wZW4oKG9wal9jb21tb25fcHRyKSBjdHgtPmNvbXByZXNzLCBOVUxMLCAwKTsKKyAgICBpZiAoIWN0eC0+c3RyZWFtKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgY3JlYXRpbmcgdGhlIGNpbyBzdHJlYW1cbiIpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYWxsb2NhdGluZyBjb2RlZCBmcmFtZVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBtZW1zZXQoJmN0eC0+ZXZlbnRfbWdyLCAwLCBzaXplb2Yob3BqX2V2ZW50X21ncl90KSk7CisgICAgY3R4LT5ldmVudF9tZ3IuaW5mb19oYW5kbGVyICAgID0gaW5mb19jYWxsYmFjazsKKyAgICBjdHgtPmV2ZW50X21nci5lcnJvcl9oYW5kbGVyID0gZXJyb3JfY2FsbGJhY2s7CisgICAgY3R4LT5ldmVudF9tZ3Iud2FybmluZ19oYW5kbGVyID0gd2FybmluZ19jYWxsYmFjazsKKyAgICBvcGpfc2V0X2V2ZW50X21ncigob3BqX2NvbW1vbl9wdHIpIGN0eC0+Y29tcHJlc3MsICZjdHgtPmV2ZW50X21nciwgYXZjdHgpOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgb3BqX2Npb19jbG9zZShjdHgtPnN0cmVhbSk7CisgICAgY3R4LT5zdHJlYW0gPSBOVUxMOworICAgIG9wal9kZXN0cm95X2NvbXByZXNzKGN0eC0+Y29tcHJlc3MpOworICAgIGN0eC0+Y29tcHJlc3MgPSBOVUxMOworICAgIG9wal9pbWFnZV9kZXN0cm95KGN0eC0+aW1hZ2UpOworICAgIGN0eC0+aW1hZ2UgPSBOVUxMOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbGlib3BlbmpwZWdfY29weV9wYWNrZWQ4KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZGcmFtZSAqZnJhbWUsIG9wal9pbWFnZV90ICppbWFnZSkKK3sKKyAgICBpbnQgY29tcG5vOworICAgIGludCB4OworICAgIGludCB5OworICAgIGludCAqaW1hZ2VfbGluZTsKKyAgICBpbnQgZnJhbWVfaW5kZXg7CisgICAgY29uc3QgaW50IG51bWNvbXBzID0gaW1hZ2UtPm51bWNvbXBzOworCisgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgaWYgKGltYWdlLT5jb21wc1tjb21wbm9dLncgPiBmcmFtZS0+bGluZXNpemVbMF0gLyBudW1jb21wcykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvcjogZnJhbWUncyBsaW5lc2l6ZSBpcyB0b28gc21hbGwgZm9yIHRoZSBpbWFnZVxuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbnVtY29tcHM7ICsrY29tcG5vKSB7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyArK3kpIHsKKyAgICAgICAgICAgIGltYWdlX2xpbmUgPSBpbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhICsgeSAqIGltYWdlLT5jb21wc1tjb21wbm9dLnc7CisgICAgICAgICAgICBmcmFtZV9pbmRleCA9IHkgKiBmcmFtZS0+bGluZXNpemVbMF0gKyBjb21wbm87CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyArK3gpIHsKKyAgICAgICAgICAgICAgICBpbWFnZV9saW5lW3hdID0gZnJhbWUtPmRhdGFbMF1bZnJhbWVfaW5kZXhdOworICAgICAgICAgICAgICAgIGZyYW1lX2luZGV4ICs9IG51bWNvbXBzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICg7IHggPCBpbWFnZS0+Y29tcHNbY29tcG5vXS53OyArK3gpIHsKKyAgICAgICAgICAgICAgICBpbWFnZV9saW5lW3hdID0gaW1hZ2VfbGluZVt4IC0gMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IHkgPCBpbWFnZS0+Y29tcHNbY29tcG5vXS5oOyArK3kpIHsKKyAgICAgICAgICAgIGltYWdlX2xpbmUgPSBpbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhICsgeSAqIGltYWdlLT5jb21wc1tjb21wbm9dLnc7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW1hZ2UtPmNvbXBzW2NvbXBub10udzsgKyt4KSB7CisgICAgICAgICAgICAgICAgaW1hZ2VfbGluZVt4XSA9IGltYWdlX2xpbmVbeCAtIGltYWdlLT5jb21wc1tjb21wbm9dLnddOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKy8vIGZvciBYWVogMTIgYml0CitzdGF0aWMgaW50IGxpYm9wZW5qcGVnX2NvcHlfcGFja2VkMTIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkZyYW1lICpmcmFtZSwgb3BqX2ltYWdlX3QgKmltYWdlKQoreworICAgIGludCBjb21wbm87CisgICAgaW50IHgsIHk7CisgICAgaW50ICppbWFnZV9saW5lOworICAgIGludCBmcmFtZV9pbmRleDsKKyAgICBjb25zdCBpbnQgbnVtY29tcHMgID0gaW1hZ2UtPm51bWNvbXBzOworICAgIHVpbnQxNl90ICpmcmFtZV9wdHIgPSAodWludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbnVtY29tcHM7ICsrY29tcG5vKSB7CisgICAgICAgIGlmIChpbWFnZS0+Y29tcHNbY29tcG5vXS53ID4gZnJhbWUtPmxpbmVzaXplWzBdIC8gbnVtY29tcHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3I6IGZyYW1lJ3MgbGluZXNpemUgaXMgdG9vIHNtYWxsIGZvciB0aGUgaW1hZ2VcbiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IG51bWNvbXBzOyArK2NvbXBubykgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgKyt5KSB7CisgICAgICAgICAgICBpbWFnZV9saW5lID0gaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSArIHkgKiBpbWFnZS0+Y29tcHNbY29tcG5vXS53OworICAgICAgICAgICAgZnJhbWVfaW5kZXggPSB5ICogKGZyYW1lLT5saW5lc2l6ZVswXSAvIDIpICsgY29tcG5vOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgKyt4KSB7CisgICAgICAgICAgICAgICAgaW1hZ2VfbGluZVt4XSA9IGZyYW1lX3B0cltmcmFtZV9pbmRleF0gPj4gNDsKKyAgICAgICAgICAgICAgICBmcmFtZV9pbmRleCArPSBudW1jb21wczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoOyB4IDwgaW1hZ2UtPmNvbXBzW2NvbXBub10udzsgKyt4KSB7CisgICAgICAgICAgICAgICAgaW1hZ2VfbGluZVt4XSA9IGltYWdlX2xpbmVbeCAtIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoOyB5IDwgaW1hZ2UtPmNvbXBzW2NvbXBub10uaDsgKyt5KSB7CisgICAgICAgICAgICBpbWFnZV9saW5lID0gaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSArIHkgKiBpbWFnZS0+Y29tcHNbY29tcG5vXS53OworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGltYWdlLT5jb21wc1tjb21wbm9dLnc7ICsreCkgeworICAgICAgICAgICAgICAgIGltYWdlX2xpbmVbeF0gPSBpbWFnZV9saW5lW3ggLSBpbWFnZS0+Y29tcHNbY29tcG5vXS53XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxpYm9wZW5qcGVnX2NvcHlfcGFja2VkMTYoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkZyYW1lICpmcmFtZSwgb3BqX2ltYWdlX3QgKmltYWdlKQoreworICAgIGludCBjb21wbm87CisgICAgaW50IHg7CisgICAgaW50IHk7CisgICAgaW50ICppbWFnZV9saW5lOworICAgIGludCBmcmFtZV9pbmRleDsKKyAgICBjb25zdCBpbnQgbnVtY29tcHMgPSBpbWFnZS0+bnVtY29tcHM7CisgICAgdWludDE2X3QgKmZyYW1lX3B0ciA9ICh1aW50MTZfdCopZnJhbWUtPmRhdGFbMF07CisKKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IG51bWNvbXBzOyArK2NvbXBubykgeworICAgICAgICBpZiAoaW1hZ2UtPmNvbXBzW2NvbXBub10udyA+IGZyYW1lLT5saW5lc2l6ZVswXSAvIG51bWNvbXBzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yOiBmcmFtZSdzIGxpbmVzaXplIGlzIHRvbyBzbWFsbCBmb3IgdGhlIGltYWdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7ICsreSkgeworICAgICAgICAgICAgaW1hZ2VfbGluZSA9IGltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgKyB5ICogaW1hZ2UtPmNvbXBzW2NvbXBub10udzsKKyAgICAgICAgICAgIGZyYW1lX2luZGV4ID0geSAqIChmcmFtZS0+bGluZXNpemVbMF0gLyAyKSArIGNvbXBubzsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7ICsreCkgeworICAgICAgICAgICAgICAgIGltYWdlX2xpbmVbeF0gPSBmcmFtZV9wdHJbZnJhbWVfaW5kZXhdOworICAgICAgICAgICAgICAgIGZyYW1lX2luZGV4ICs9IG51bWNvbXBzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICg7IHggPCBpbWFnZS0+Y29tcHNbY29tcG5vXS53OyArK3gpIHsKKyAgICAgICAgICAgICAgICBpbWFnZV9saW5lW3hdID0gaW1hZ2VfbGluZVt4IC0gMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IHkgPCBpbWFnZS0+Y29tcHNbY29tcG5vXS5oOyArK3kpIHsKKyAgICAgICAgICAgIGltYWdlX2xpbmUgPSBpbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhICsgeSAqIGltYWdlLT5jb21wc1tjb21wbm9dLnc7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW1hZ2UtPmNvbXBzW2NvbXBub10udzsgKyt4KSB7CisgICAgICAgICAgICAgICAgaW1hZ2VfbGluZVt4XSA9IGltYWdlX2xpbmVbeCAtIGltYWdlLT5jb21wc1tjb21wbm9dLnddOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbGlib3BlbmpwZWdfY29weV91bnBhY2tlZDgoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkZyYW1lICpmcmFtZSwgb3BqX2ltYWdlX3QgKmltYWdlKQoreworICAgIGludCBjb21wbm87CisgICAgaW50IHg7CisgICAgaW50IHk7CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgaW50ICppbWFnZV9saW5lOworICAgIGludCBmcmFtZV9pbmRleDsKKyAgICBjb25zdCBpbnQgbnVtY29tcHMgPSBpbWFnZS0+bnVtY29tcHM7CisKKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IG51bWNvbXBzOyArK2NvbXBubykgeworICAgICAgICBpZiAoaW1hZ2UtPmNvbXBzW2NvbXBub10udyA+IGZyYW1lLT5saW5lc2l6ZVtjb21wbm9dKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yOiBmcmFtZSdzIGxpbmVzaXplIGlzIHRvbyBzbWFsbCBmb3IgdGhlIGltYWdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgd2lkdGggID0gYXZjdHgtPndpZHRoIC8gaW1hZ2UtPmNvbXBzW2NvbXBub10uZHg7CisgICAgICAgIGhlaWdodCA9IGF2Y3R4LT5oZWlnaHQgLyBpbWFnZS0+Y29tcHNbY29tcG5vXS5keTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgICAgICBpbWFnZV9saW5lID0gaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSArIHkgKiBpbWFnZS0+Y29tcHNbY29tcG5vXS53OworICAgICAgICAgICAgZnJhbWVfaW5kZXggPSB5ICogZnJhbWUtPmxpbmVzaXplW2NvbXBub107CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkKKyAgICAgICAgICAgICAgICBpbWFnZV9saW5lW3hdID0gZnJhbWUtPmRhdGFbY29tcG5vXVtmcmFtZV9pbmRleCsrXTsKKyAgICAgICAgICAgIGZvciAoOyB4IDwgaW1hZ2UtPmNvbXBzW2NvbXBub10udzsgKyt4KSB7CisgICAgICAgICAgICAgICAgaW1hZ2VfbGluZVt4XSA9IGltYWdlX2xpbmVbeCAtIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoOyB5IDwgaW1hZ2UtPmNvbXBzW2NvbXBub10uaDsgKyt5KSB7CisgICAgICAgICAgICBpbWFnZV9saW5lID0gaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSArIHkgKiBpbWFnZS0+Y29tcHNbY29tcG5vXS53OworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGltYWdlLT5jb21wc1tjb21wbm9dLnc7ICsreCkgeworICAgICAgICAgICAgICAgIGltYWdlX2xpbmVbeF0gPSBpbWFnZV9saW5lW3ggLSBpbWFnZS0+Y29tcHNbY29tcG5vXS53XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxpYm9wZW5qcGVnX2NvcHlfdW5wYWNrZWQxNihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBvcGpfaW1hZ2VfdCAqaW1hZ2UpCit7CisgICAgaW50IGNvbXBubzsKKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgKmltYWdlX2xpbmU7CisgICAgaW50IGZyYW1lX2luZGV4OworICAgIGNvbnN0IGludCBudW1jb21wcyA9IGltYWdlLT5udW1jb21wczsKKyAgICB1aW50MTZfdCAqZnJhbWVfcHRyOworCisgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgaWYgKGltYWdlLT5jb21wc1tjb21wbm9dLncgPiBmcmFtZS0+bGluZXNpemVbY29tcG5vXSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvcjogZnJhbWUncyBsaW5lc2l6ZSBpcyB0b28gc21hbGwgZm9yIHRoZSBpbWFnZVxuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbnVtY29tcHM7ICsrY29tcG5vKSB7CisgICAgICAgIHdpZHRoICAgICA9IGF2Y3R4LT53aWR0aCAvIGltYWdlLT5jb21wc1tjb21wbm9dLmR4OworICAgICAgICBoZWlnaHQgICAgPSBhdmN0eC0+aGVpZ2h0IC8gaW1hZ2UtPmNvbXBzW2NvbXBub10uZHk7CisgICAgICAgIGZyYW1lX3B0ciA9ICh1aW50MTZfdCAqKWZyYW1lLT5kYXRhW2NvbXBub107CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICAgICAgaW1hZ2VfbGluZSA9IGltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgKyB5ICogaW1hZ2UtPmNvbXBzW2NvbXBub10udzsKKyAgICAgICAgICAgIGZyYW1lX2luZGV4ID0geSAqIChmcmFtZS0+bGluZXNpemVbY29tcG5vXSAvIDIpOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpCisgICAgICAgICAgICAgICAgaW1hZ2VfbGluZVt4XSA9IGZyYW1lX3B0cltmcmFtZV9pbmRleCsrXTsKKyAgICAgICAgICAgIGZvciAoOyB4IDwgaW1hZ2UtPmNvbXBzW2NvbXBub10udzsgKyt4KSB7CisgICAgICAgICAgICAgICAgaW1hZ2VfbGluZVt4XSA9IGltYWdlX2xpbmVbeCAtIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoOyB5IDwgaW1hZ2UtPmNvbXBzW2NvbXBub10uaDsgKyt5KSB7CisgICAgICAgICAgICBpbWFnZV9saW5lID0gaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSArIHkgKiBpbWFnZS0+Y29tcHNbY29tcG5vXS53OworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGltYWdlLT5jb21wc1tjb21wbm9dLnc7ICsreCkgeworICAgICAgICAgICAgICAgIGltYWdlX2xpbmVbeF0gPSBpbWFnZV9saW5lW3ggLSBpbWFnZS0+Y29tcHNbY29tcG5vXS53XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxpYm9wZW5qcGVnX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIExpYk9wZW5KUEVHQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBvcGpfY2luZm9fdCAqY29tcHJlc3MgICA9IGN0eC0+Y29tcHJlc3M7CisgICAgb3BqX2ltYWdlX3QgKmltYWdlICAgICAgPSBjdHgtPmltYWdlOworICAgIG9wal9jaW9fdCAqc3RyZWFtICAgICAgID0gY3R4LT5zdHJlYW07CisgICAgaW50IGNweXJlc3VsdCA9IDA7CisgICAgaW50IHJldCwgbGVuOworICAgIEFWRnJhbWUgKmdicmZyYW1lOworCisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWUE4OgorICAgICAgICBjcHlyZXN1bHQgPSBsaWJvcGVuanBlZ19jb3B5X3BhY2tlZDgoYXZjdHgsIGZyYW1lLCBpbWFnZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9YWVoxMjoKKyAgICAgICAgY3B5cmVzdWx0ID0gbGlib3BlbmpwZWdfY29weV9wYWNrZWQxMihhdmN0eCwgZnJhbWUsIGltYWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjQ6CisgICAgICAgIGNweXJlc3VsdCA9IGxpYm9wZW5qcGVnX2NvcHlfcGFja2VkMTYoYXZjdHgsIGZyYW1lLCBpbWFnZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlIyNFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE0OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTY6CisgICAgICAgIGdicmZyYW1lID0gYXZfZnJhbWVfY2xvbmUoZnJhbWUpOworICAgICAgICBpZiAoIWdicmZyYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ2JyZnJhbWUtPmRhdGFbMF0gPSBmcmFtZS0+ZGF0YVsyXTsgLy8gc3dhcCB0byBiZSByZ2IKKyAgICAgICAgZ2JyZnJhbWUtPmRhdGFbMV0gPSBmcmFtZS0+ZGF0YVswXTsKKyAgICAgICAgZ2JyZnJhbWUtPmRhdGFbMl0gPSBmcmFtZS0+ZGF0YVsxXTsKKyAgICAgICAgZ2JyZnJhbWUtPmxpbmVzaXplWzBdID0gZnJhbWUtPmxpbmVzaXplWzJdOworICAgICAgICBnYnJmcmFtZS0+bGluZXNpemVbMV0gPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIGdicmZyYW1lLT5saW5lc2l6ZVsyXSA9IGZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR0JSMjRQKSB7CisgICAgICAgICAgICBjcHlyZXN1bHQgPSBsaWJvcGVuanBlZ19jb3B5X3VucGFja2VkOChhdmN0eCwgZ2JyZnJhbWUsIGltYWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNweXJlc3VsdCA9IGxpYm9wZW5qcGVnX2NvcHlfdW5wYWNrZWQxNihhdmN0eCwgZ2JyZnJhbWUsIGltYWdlKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZnYnJmcmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDEwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDExUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDoKKyAgICAgICAgY3B5cmVzdWx0ID0gbGlib3BlbmpwZWdfY29weV91bnBhY2tlZDgoYXZjdHgsIGZyYW1lLCBpbWFnZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTI6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDE0OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDE2OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTY6CisgICAgICAgIGNweXJlc3VsdCA9IGxpYm9wZW5qcGVnX2NvcHlfdW5wYWNrZWQxNihhdmN0eCwgZnJhbWUsIGltYWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVGhlIGZyYW1lJ3MgcGl4ZWwgZm9ybWF0ICclcycgaXMgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoYXZjdHgtPnBpeF9mbXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFjcHlyZXN1bHQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ291bGQgbm90IGNvcHkgdGhlIGZyYW1lIGRhdGEgdG8gdGhlIGludGVybmFsIGltYWdlIGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjaW9fc2VlayhzdHJlYW0sIDApOworICAgIGlmICghb3BqX2VuY29kZShjb21wcmVzcywgc3RyZWFtLCBpbWFnZSwgTlVMTCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBkdXJpbmcgdGhlIG9waiBlbmNvZGVcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbGVuID0gY2lvX3RlbGwoc3RyZWFtKTsKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgbGVuKSkgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgbWVtY3B5KHBrdC0+ZGF0YSwgc3RyZWFtLT5idWZmZXIsIGxlbik7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbGlib3BlbmpwZWdfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMaWJPcGVuSlBFR0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBvcGpfY2lvX2Nsb3NlKGN0eC0+c3RyZWFtKTsKKyAgICBjdHgtPnN0cmVhbSA9IE5VTEw7CisgICAgb3BqX2Rlc3Ryb3lfY29tcHJlc3MoY3R4LT5jb21wcmVzcyk7CisgICAgY3R4LT5jb21wcmVzcyA9IE5VTEw7CisgICAgb3BqX2ltYWdlX2Rlc3Ryb3koY3R4LT5pbWFnZSk7CisgICAgY3R4LT5pbWFnZSA9IE5VTEw7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKExpYk9wZW5KUEVHQ29udGV4dCwgeCkKKyNkZWZpbmUgVkUgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJmb3JtYXQiLCAgICAgICAgIkNvZGVjIEZvcm1hdCIsICAgICAgT0ZGU0VUKGZvcm1hdCksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gQ09ERUNfSlAyICAgfSwgQ09ERUNfSjJLLCBDT0RFQ19KUDIsICAgVkUsICJmb3JtYXQiICAgICAgfSwKKyAgICB7ICJqMmsiLCAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ09ERUNfSjJLICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJmb3JtYXQiICAgICAgfSwKKyAgICB7ICJqcDIiLCAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ09ERUNfSlAyICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJmb3JtYXQiICAgICAgfSwKKyAgICB7ICJwcm9maWxlIiwgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgT0ZGU0VUKHByb2ZpbGUpLCAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gU1REX1JTSVogICAgfSwgU1REX1JTSVosICBDSU5FTUE0SywgICAgVkUsICJwcm9maWxlIiAgICAgfSwKKyAgICB7ICJqcGVnMjAwMCIsICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gU1REX1JTSVogICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9maWxlIiAgICAgfSwKKyAgICB7ICJjaW5lbWEyayIsICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ0lORU1BMksgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9maWxlIiAgICAgfSwKKyAgICB7ICJjaW5lbWE0ayIsICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ0lORU1BNEsgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9maWxlIiAgICAgfSwKKyAgICB7ICJjaW5lbWFfbW9kZSIsICAgIkRpZ2l0YWwgQ2luZW1hIiwgICAgT0ZGU0VUKGNpbmVtYV9tb2RlKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gT0ZGICAgICAgICAgfSwgT0ZGLCAgICAgICBDSU5FTUE0S18yNCwgVkUsICJjaW5lbWFfbW9kZSIgfSwKKyAgICB7ICJvZmYiLCAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gT0ZGICAgICAgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJjaW5lbWFfbW9kZSIgfSwKKyAgICB7ICIya18yNCIsICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ0lORU1BMktfMjQgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJjaW5lbWFfbW9kZSIgfSwKKyAgICB7ICIya180OCIsICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ0lORU1BMktfNDggfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJjaW5lbWFfbW9kZSIgfSwKKyAgICB7ICI0a18yNCIsICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ0lORU1BNEtfMjQgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJjaW5lbWFfbW9kZSIgfSwKKyAgICB7ICJwcm9nX29yZGVyIiwgICAgIlByb2dyZXNzaW9uIE9yZGVyIiwgT0ZGU0VUKHByb2dfb3JkZXIpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gTFJDUCAgICAgICAgfSwgTFJDUCwgICAgICBDUFJMLCAgICAgICAgVkUsICJwcm9nX29yZGVyIiAgfSwKKyAgICB7ICJscmNwIiwgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTFJDUCAgICAgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9nX29yZGVyIiAgfSwKKyAgICB7ICJybGNwIiwgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUkxDUCAgICAgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9nX29yZGVyIiAgfSwKKyAgICB7ICJycGNsIiwgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUlBDTCAgICAgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9nX29yZGVyIiAgfSwKKyAgICB7ICJwY3JsIiwgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUENSTCAgICAgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9nX29yZGVyIiAgfSwKKyAgICB7ICJjcHJsIiwgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ1BSTCAgICAgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9nX29yZGVyIiAgfSwKKyAgICB7ICJudW1yZXNvbHV0aW9uIiwgTlVMTCwgICAgICAgICAgICAgICAgT0ZGU0VUKG51bXJlc29sdXRpb24pLCBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gNiAgICAgICAgICAgfSwgMSwgICAgICAgICBJTlRfTUFYLCAgICAgVkUgICAgICAgICAgICAgICAgfSwKKyAgICB7ICJudW1sYXllcnMiLCAgICAgTlVMTCwgICAgICAgICAgICAgICAgT0ZGU0VUKG51bWxheWVycyksICAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMSAgICAgICAgICAgfSwgMSwgICAgICAgICAxMCwgICAgICAgICAgVkUgICAgICAgICAgICAgICAgfSwKKyAgICB7ICJkaXN0b19hbGxvYyIsICAgTlVMTCwgICAgICAgICAgICAgICAgT0ZGU0VUKGRpc3RvX2FsbG9jKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMSAgICAgICAgICAgfSwgMCwgICAgICAgICAxLCAgICAgICAgICAgVkUgICAgICAgICAgICAgICAgfSwKKyAgICB7ICJmaXhlZF9hbGxvYyIsICAgTlVMTCwgICAgICAgICAgICAgICAgT0ZGU0VUKGZpeGVkX2FsbG9jKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMCAgICAgICAgICAgfSwgMCwgICAgICAgICAxLCAgICAgICAgICAgVkUgICAgICAgICAgICAgICAgfSwKKyAgICB7ICJmaXhlZF9xdWFsaXR5IiwgTlVMTCwgICAgICAgICAgICAgICAgT0ZGU0VUKGZpeGVkX3F1YWxpdHkpLCBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMCAgICAgICAgICAgfSwgMCwgICAgICAgICAxLCAgICAgICAgICAgVkUgICAgICAgICAgICAgICAgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG9wZW5qcGVnX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImxpYm9wZW5qcGVnIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbGlib3BlbmpwZWdfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlib3BlbmpwZWciLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPcGVuSlBFRyBKUEVHIDIwMDAiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSlBFRzIwMDAsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKExpYk9wZW5KUEVHQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbGlib3BlbmpwZWdfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gbGlib3BlbmpwZWdfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGxpYm9wZW5qcGVnX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IENPREVDX0NBUF9JTlRSQV9PTkxZLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeworICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX1JHQkEsIEFWX1BJWF9GTVRfUkdCNDgsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQTY0LCBBVl9QSVhfRk1UX0dCUjI0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQOSwgQVZfUElYX0ZNVF9HQlJQMTAsIEFWX1BJWF9GTVRfR0JSUDEyLCBBVl9QSVhfRk1UX0dCUlAxNCwgQVZfUElYX0ZNVF9HQlJQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfWUE4LCBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfWVVWQTQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX1BJWF9GTVRfWVVWNDEwUCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVY0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDEyLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTQsIEFWX1BJWF9GTVRfWVVWNDIyUDE0LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LCBBVl9QSVhfRk1UX1lVVkE0MjJQMTYsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9YWVoxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmb3BlbmpwZWdfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGlib3B1cy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlib3B1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Mzk1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJvcHVzLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIGxpYm9wdXMgZW5jb2Rlci9kZWNvZGVyIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG9wdXNfZGVmaW5lcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9lcnJvci5oIgorI2luY2x1ZGUgImxpYm9wdXMuaCIKKworaW50IGZmX29wdXNfZXJyb3JfdG9fYXZlcnJvcihpbnQgZXJyKQoreworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgY2FzZSBPUFVTX0JBRF9BUkc6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgY2FzZSBPUFVTX0JVRkZFUl9UT09fU01BTEw6CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgY2FzZSBPUFVTX0lOVEVSTkFMX0VSUk9SOgorICAgICAgICByZXR1cm4gQVZFUlJPUihFRkFVTFQpOworICAgIGNhc2UgT1BVU19JTlZBTElEX1BBQ0tFVDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgY2FzZSBPUFVTX1VOSU1QTEVNRU5URUQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgY2FzZSBPUFVTX0lOVkFMSURfU1RBVEU6CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgY2FzZSBPUFVTX0FMTE9DX0ZBSUw6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJvcHVzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9saWJvcHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyMjNkMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYm9wdXMuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogbGlib3B1cyBlbmNvZGVyL2RlY29kZXIgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAxMiBOaWNvbGFzIEdlb3JnZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTElCT1BVU19ICisjZGVmaW5lIEFWQ09ERUNfTElCT1BVU19ICisKK2ludCBmZl9vcHVzX2Vycm9yX3RvX2F2ZXJyb3IoaW50IGVycik7CisKKyNlbmRpZiAvKiBBVkNPREVDX0xJQk9QVVNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGlib3B1c2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlib3B1c2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MzYzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJvcHVzZGVjLmMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBPcHVzIGRlY29kZXIgdXNpbmcgbGlib3B1cworICogQ29weXJpZ2h0IChjKSAyMDEyIE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxvcHVzLmg+CisjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZvcmJpcy5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJsaWJvcHVzLmgiCisKK3N0cnVjdCBsaWJvcHVzX2NvbnRleHQgeworICAgIE9wdXNNU0RlY29kZXIgKmRlYzsKKyAgICBpbnQgcHJlX3NraXA7CisjaWZuZGVmIE9QVVNfU0VUX0dBSU4KKyAgICB1bmlvbiB7IGludCBpOyBkb3VibGUgZDsgfSBnYWluOworI2VuZGlmCit9OworCisjZGVmaW5lIE9QVVNfSEVBRF9TSVpFIDE5CisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJvcHVzX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmMpCit7CisgICAgc3RydWN0IGxpYm9wdXNfY29udGV4dCAqb3B1cyA9IGF2Yy0+cHJpdl9kYXRhOworICAgIGludCByZXQsIGNoYW5uZWxfbWFwID0gMCwgZ2Fpbl9kYiA9IDAsIG5iX3N0cmVhbXMsIG5iX2NvdXBsZWQ7CisgICAgdWludDhfdCBtYXBwaW5nX2Fycls4XSA9IHsgMCwgMSB9LCAqbWFwcGluZzsKKworICAgIGF2Yy0+c2FtcGxlX3JhdGUgICAgPSA0ODAwMDsKKyAgICBhdmMtPnNhbXBsZV9mbXQgICAgID0gYXZjLT5yZXF1ZXN0X3NhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFQgPworICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCA6IEFWX1NBTVBMRV9GTVRfUzE2OworICAgIGF2Yy0+Y2hhbm5lbF9sYXlvdXQgPSBhdmMtPmNoYW5uZWxzID4gOCA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBmZl92b3JiaXNfY2hhbm5lbF9sYXlvdXRzW2F2Yy0+Y2hhbm5lbHMgLSAxXTsKKworICAgIGlmIChhdmMtPmV4dHJhZGF0YV9zaXplID49IE9QVVNfSEVBRF9TSVpFKSB7CisgICAgICAgIG9wdXMtPnByZV9za2lwID0gQVZfUkwxNihhdmMtPmV4dHJhZGF0YSArIDEwKTsKKyAgICAgICAgZ2Fpbl9kYiAgICAgPSBzaWduX2V4dGVuZChBVl9STDE2KGF2Yy0+ZXh0cmFkYXRhICsgMTYpLCAxNik7CisgICAgICAgIGNoYW5uZWxfbWFwID0gQVZfUkw4IChhdmMtPmV4dHJhZGF0YSArIDE4KTsKKyAgICB9CisgICAgaWYgKGF2Yy0+ZXh0cmFkYXRhX3NpemUgPj0gT1BVU19IRUFEX1NJWkUgKyAyICsgYXZjLT5jaGFubmVscykgeworICAgICAgICBuYl9zdHJlYW1zID0gYXZjLT5leHRyYWRhdGFbT1BVU19IRUFEX1NJWkUgKyAwXTsKKyAgICAgICAgbmJfY291cGxlZCA9IGF2Yy0+ZXh0cmFkYXRhW09QVVNfSEVBRF9TSVpFICsgMV07CisgICAgICAgIGlmIChuYl9zdHJlYW1zICsgbmJfY291cGxlZCAhPSBhdmMtPmNoYW5uZWxzKQorICAgICAgICAgICAgYXZfbG9nKGF2YywgQVZfTE9HX1dBUk5JTkcsICJJbmNvbnNpc3RlbnQgY2hhbm5lbCBtYXBwaW5nLlxuIik7CisgICAgICAgIG1hcHBpbmcgPSBhdmMtPmV4dHJhZGF0YSArIE9QVVNfSEVBRF9TSVpFICsgMjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXZjLT5jaGFubmVscyA+IDIgfHwgY2hhbm5lbF9tYXApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTm8gY2hhbm5lbCBtYXBwaW5nIGZvciAlZCBjaGFubmVscy5cbiIsIGF2Yy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBuYl9zdHJlYW1zID0gMTsKKyAgICAgICAgbmJfY291cGxlZCA9IGF2Yy0+Y2hhbm5lbHMgPiAxOworICAgICAgICBtYXBwaW5nICAgID0gbWFwcGluZ19hcnI7CisgICAgfQorCisgICAgaWYgKGF2Yy0+Y2hhbm5lbHMgPiAyICYmIGF2Yy0+Y2hhbm5lbHMgPD0gOCkgeworICAgICAgICBjb25zdCB1aW50OF90ICp2b3JiaXNfb2Zmc2V0ID0gZmZfdm9yYmlzX2NoYW5uZWxfbGF5b3V0X29mZnNldHNbYXZjLT5jaGFubmVscyAtIDFdOworICAgICAgICBpbnQgY2g7CisKKyAgICAgICAgLyogUmVtYXAgY2hhbm5lbHMgZnJvbSB2b3JiaXMgb3JkZXIgdG8gZmZtcGVnIG9yZGVyICovCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2Yy0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBtYXBwaW5nX2FycltjaF0gPSBtYXBwaW5nW3ZvcmJpc19vZmZzZXRbY2hdXTsKKyAgICAgICAgbWFwcGluZyA9IG1hcHBpbmdfYXJyOworICAgIH0KKworICAgIG9wdXMtPmRlYyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoYXZjLT5zYW1wbGVfcmF0ZSwgYXZjLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX3N0cmVhbXMsIG5iX2NvdXBsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLCAmcmV0KTsKKyAgICBpZiAoIW9wdXMtPmRlYykgeworICAgICAgICBhdl9sb2coYXZjLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gY3JlYXRlIGRlY29kZXI6ICVzXG4iLAorICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgcmV0dXJuIGZmX29wdXNfZXJyb3JfdG9fYXZlcnJvcihyZXQpOworICAgIH0KKworI2lmZGVmIE9QVVNfU0VUX0dBSU4KKyAgICByZXQgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG9wdXMtPmRlYywgT1BVU19TRVRfR0FJTihnYWluX2RiKSk7CisgICAgaWYgKHJldCAhPSBPUFVTX09LKQorICAgICAgICBhdl9sb2coYXZjLCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byBzZXQgZ2FpbjogJXNcbiIsCisgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHJldCkpOworI2Vsc2UKKyAgICB7CisgICAgICAgIGRvdWJsZSBnYWluX2xpbiA9IHBvdygxMCwgZ2Fpbl9kYiAvICgyMC4wICogMjU2KSk7CisgICAgICAgIGlmIChhdmMtPnNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFQpCisgICAgICAgICAgICBvcHVzLT5nYWluLmQgPSBnYWluX2xpbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3B1cy0+Z2Fpbi5pID0gRkZNSU4oZ2Fpbl9saW4gKiA2NTUzNiwgSU5UX01BWCk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBEZWNvZGVyIGRlbGF5IChpbiBzYW1wbGVzKSBhdCA0OGtIeiAqLworICAgIGF2Yy0+ZGVsYXkgPSBhdmMtPmludGVybmFsLT5za2lwX3NhbXBsZXMgPSBvcHVzLT5wcmVfc2tpcDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbGlib3B1c19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2YykKK3sKKyAgICBzdHJ1Y3QgbGlib3B1c19jb250ZXh0ICpvcHVzID0gYXZjLT5wcml2X2RhdGE7CisKKyAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShvcHVzLT5kZWMpOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFICg5NjAgKiA2KQorCitzdGF0aWMgaW50IGxpYm9wdXNfZGVjb2RlKEFWQ29kZWNDb250ZXh0ICphdmMsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBzdHJ1Y3QgbGlib3B1c19jb250ZXh0ICpvcHVzID0gYXZjLT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgICAgICAgICAgICA9IGRhdGE7CisgICAgaW50IHJldCwgbmJfc2FtcGxlczsKKworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gTUFYX0ZSQU1FX1NJWkU7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2YywgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoYXZjLT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfUzE2KQorICAgICAgICBuYl9zYW1wbGVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGUob3B1cy0+ZGVjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHVzX2ludDE2ICopZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcywgMCk7CisgICAgZWxzZQorICAgICAgICBuYl9zYW1wbGVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVfZmxvYXQob3B1cy0+ZGVjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKWZyYW1lLT5kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMsIDApOworCisgICAgaWYgKG5iX3NhbXBsZXMgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmMsIEFWX0xPR19FUlJPUiwgIkRlY29kaW5nIGVycm9yOiAlc1xuIiwKKyAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3IobmJfc2FtcGxlcykpOworICAgICAgICByZXR1cm4gZmZfb3B1c19lcnJvcl90b19hdmVycm9yKG5iX3NhbXBsZXMpOworICAgIH0KKworI2lmbmRlZiBPUFVTX1NFVF9HQUlOCisgICAgeworICAgICAgICBpbnQgaSA9IGF2Yy0+Y2hhbm5lbHMgKiBuYl9zYW1wbGVzOworICAgICAgICBpZiAoYXZjLT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUKSB7CisgICAgICAgICAgICBmbG9hdCAqcGNtID0gKGZsb2F0ICopZnJhbWUtPmRhdGFbMF07CisgICAgICAgICAgICBmb3IgKDsgaSA+IDA7IGktLSwgcGNtKyspCisgICAgICAgICAgICAgICAgKnBjbSA9IGF2X2NsaXBmKCpwY20gKiBvcHVzLT5nYWluLmQsIC0xLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDE2X3QgKnBjbSA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisgICAgICAgICAgICBmb3IgKDsgaSA+IDA7IGktLSwgcGNtKyspCisgICAgICAgICAgICAgICAgKnBjbSA9IGF2X2NsaXBfaW50MTYoKChpbnQ2NF90KW9wdXMtPmdhaW4uaSAqICpwY20pID4+IDE2KTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBuYl9zYW1wbGVzOworICAgICpnb3RfZnJhbWVfcHRyICAgID0gMTsKKworICAgIHJldHVybiBwa3QtPnNpemU7Cit9CisKK3N0YXRpYyB2b2lkIGxpYm9wdXNfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2YykKK3sKKyAgICBzdHJ1Y3QgbGlib3B1c19jb250ZXh0ICpvcHVzID0gYXZjLT5wcml2X2RhdGE7CisKKyAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG9wdXMtPmRlYywgT1BVU19SRVNFVF9TVEFURSk7CisgICAgLyogVGhlIHN0cmVhbSBjYW4gaGF2ZSBiZWVuIGV4dHJhY3RlZCBieSBhIHRvb2wgdGhhdCBpcyBub3QgT3B1cy1hd2FyZS4KKyAgICAgICBUaGVyZWZvcmUsIGFueSBwYWNrZXQgY2FuIGJlY29tZSB0aGUgZmlyc3Qgb2YgdGhlIHN0cmVhbS4gKi8KKyAgICBhdmMtPmludGVybmFsLT5za2lwX3NhbXBsZXMgPSBvcHVzLT5wcmVfc2tpcDsKK30KKworQVZDb2RlYyBmZl9saWJvcHVzX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYm9wdXMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJvcHVzIE9wdXMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfT1BVUywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGxpYm9wdXNfY29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbGlib3B1c19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBsaWJvcHVzX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBsaWJvcHVzX2RlY29kZSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBsaWJvcHVzX2ZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGlib3B1c2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlib3B1c2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjQ4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJvcHVzZW5jLmMKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBPcHVzIGVuY29kZXIgdXNpbmcgbGlib3B1cworICogQ29weXJpZ2h0IChjKSAyMDEyIE5hdGhhbiBDYWxkd2VsbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8b3B1cy5oPgorI2luY2x1ZGUgPG9wdXNfbXVsdGlzdHJlYW0uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGlib3B1cy5oIgorI2luY2x1ZGUgInZvcmJpcy5oIgorI2luY2x1ZGUgImF1ZGlvX2ZyYW1lX3F1ZXVlLmgiCisKK3R5cGVkZWYgc3RydWN0IExpYm9wdXNFbmNPcHRzIHsKKyAgICBpbnQgdmJyOworICAgIGludCBhcHBsaWNhdGlvbjsKKyAgICBpbnQgcGFja2V0X2xvc3M7CisgICAgaW50IGNvbXBsZXhpdHk7CisgICAgZmxvYXQgZnJhbWVfZHVyYXRpb247CisgICAgaW50IHBhY2tldF9zaXplOworICAgIGludCBtYXhfYmFuZHdpZHRoOworfSBMaWJvcHVzRW5jT3B0czsKKwordHlwZWRlZiBzdHJ1Y3QgTGlib3B1c0VuY0NvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIE9wdXNNU0VuY29kZXIgKmVuYzsKKyAgICBpbnQgc3RyZWFtX2NvdW50OworICAgIHVpbnQ4X3QgKnNhbXBsZXM7CisgICAgTGlib3B1c0VuY09wdHMgb3B0czsKKyAgICBBdWRpb0ZyYW1lUXVldWUgYWZxOworfSBMaWJvcHVzRW5jQ29udGV4dDsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb3B1c19jb3VwbGVkX3N0cmVhbXNbOF0gPSB7CisgICAgMCwgMSwgMSwgMiwgMiwgMiwgMiwgMworfTsKKworLyogT3B1cyBpbnRlcm5hbCB0byBWb3JiaXMgY2hhbm5lbCBvcmRlciBtYXBwaW5nIHdyaXR0ZW4gaW4gdGhlIGhlYWRlciAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb3B1c192b3JiaXNfY2hhbm5lbF9tYXBbOF1bOF0gPSB7CisgICAgeyAwIH0sCisgICAgeyAwLCAxIH0sCisgICAgeyAwLCAyLCAxIH0sCisgICAgeyAwLCAxLCAyLCAzIH0sCisgICAgeyAwLCA0LCAxLCAyLCAzIH0sCisgICAgeyAwLCA0LCAxLCAyLCAzLCA1IH0sCisgICAgeyAwLCA0LCAxLCAyLCAzLCA1LCA2IH0sCisgICAgeyAwLCA2LCAxLCAyLCAzLCA0LCA1LCA3IH0sCit9OworCisvKiBsaWJhdmNvZGVjIHRvIGxpYm9wdXMgY2hhbm5lbCBvcmRlciBtYXBwaW5nLCBwYXNzZWQgdG8gbGlib3B1cyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbGliYXZjb2RlY19saWJvcHVzX2NoYW5uZWxfbWFwWzhdWzhdID0geworICAgIHsgMCB9LAorICAgIHsgMCwgMSB9LAorICAgIHsgMCwgMSwgMiB9LAorICAgIHsgMCwgMSwgMiwgMyB9LAorICAgIHsgMCwgMSwgMywgNCwgMiB9LAorICAgIHsgMCwgMSwgNCwgNSwgMiwgMyB9LAorICAgIHsgMCwgMSwgNSwgNiwgMiwgNCwgMyB9LAorICAgIHsgMCwgMSwgNiwgNywgNCwgNSwgMiwgMyB9LAorfTsKKworc3RhdGljIHZvaWQgbGlib3B1c193cml0ZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgc3RyZWFtX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdXBsZWRfc3RyZWFtX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY2hhbm5lbF9tYXBwaW5nKQoreworICAgIHVpbnQ4X3QgKnAgICA9IGF2Y3R4LT5leHRyYWRhdGE7CisgICAgaW50IGNoYW5uZWxzID0gYXZjdHgtPmNoYW5uZWxzOworCisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZwLCAiT3B1c0hlYWQiLCA4KTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCAxKTsgLyogVmVyc2lvbiAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIGNoYW5uZWxzKTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZwLCBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nKTsgLyogTG9va2FoZWFkIHNhbXBsZXMgYXQgNDhrSHogKi8KKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZwLCBhdmN0eC0+c2FtcGxlX3JhdGUpOyAvKiBPcmlnaW5hbCBzYW1wbGUgcmF0ZSAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJnAsIDApOyAvKiBHYWluIG9mIDBkQiBpcyByZWNvbW1lbmRlZC4gKi8KKworICAgIC8qIENoYW5uZWwgbWFwcGluZyAqLworICAgIGlmIChjaGFubmVscyA+IDIpIHsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgY2hhbm5lbHMgPD0gOCA/IDEgOiAyNTUpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCBzdHJlYW1fY291bnQpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCBjb3VwbGVkX3N0cmVhbV9jb3VudCk7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmcCwgY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVscyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgMCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGxpYm9wdXNfY29uZmlndXJlX2VuY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBPcHVzTVNFbmNvZGVyICplbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlib3B1c0VuY09wdHMgKm9wdHMpCit7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdmN0eC0+Z2xvYmFsX3F1YWxpdHkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiUXVhbGl0eS1iYXNlZCBlbmNvZGluZyBub3Qgc3VwcG9ydGVkLCAiCisgICAgICAgICAgICAgICAicGxlYXNlIHNwZWNpZnkgYSBiaXRyYXRlIGFuZCBWQlIgc2V0dGluZy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldCA9IG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwoZW5jLCBPUFVTX1NFVF9CSVRSQVRFKGF2Y3R4LT5iaXRfcmF0ZSkpOworICAgIGlmIChyZXQgIT0gT1BVU19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IGJpdHJhdGU6ICVzXG4iLCBvcHVzX3N0cmVycm9yKHJldCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfQ09NUExFWElUWShvcHRzLT5jb21wbGV4aXR5KSk7CisgICAgaWYgKHJldCAhPSBPUFVTX09LKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZXQgY29tcGxleGl0eTogJXNcbiIsIG9wdXNfc3RyZXJyb3IocmV0KSk7CisKKyAgICByZXQgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKGVuYywgT1BVU19TRVRfVkJSKCEhb3B0cy0+dmJyKSk7CisgICAgaWYgKHJldCAhPSBPUFVTX09LKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZXQgVkJSOiAlc1xuIiwgb3B1c19zdHJlcnJvcihyZXQpKTsKKworICAgIHJldCA9IG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfVkJSX0NPTlNUUkFJTlQob3B0cy0+dmJyID09IDIpKTsKKyAgICBpZiAocmV0ICE9IE9QVVNfT0spCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCBjb25zdHJhaW5lZCBWQlI6ICVzXG4iLCBvcHVzX3N0cmVycm9yKHJldCkpOworCisgICAgcmV0ID0gb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFVTX1NFVF9QQUNLRVRfTE9TU19QRVJDKG9wdHMtPnBhY2tldF9sb3NzKSk7CisgICAgaWYgKHJldCAhPSBPUFVTX09LKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZXQgZXhwZWN0ZWQgcGFja2V0IGxvc3MgcGVyY2VudGFnZTogJXNcbiIsCisgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHJldCkpOworCisgICAgaWYgKGF2Y3R4LT5jdXRvZmYpIHsKKyAgICAgICAgcmV0ID0gb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfTUFYX0JBTkRXSURUSChvcHRzLT5tYXhfYmFuZHdpZHRoKSk7CisgICAgICAgIGlmIChyZXQgIT0gT1BVU19PSykKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZXQgbWF4aW11bSBiYW5kd2lkdGg6ICVzXG4iLCBvcHVzX3N0cmVycm9yKHJldCkpOworICAgIH0KKworICAgIHJldHVybiBPUFVTX09LOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbGlib3B1c19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTGlib3B1c0VuY0NvbnRleHQgKm9wdXMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmNoYW5uZWxfbWFwcGluZzsKKyAgICBPcHVzTVNFbmNvZGVyICplbmM7CisgICAgaW50IHJldCA9IE9QVVNfT0s7CisgICAgaW50IGNvdXBsZWRfc3RyZWFtX2NvdW50LCBoZWFkZXJfc2l6ZSwgZnJhbWVfc2l6ZTsKKworICAgIGNvdXBsZWRfc3RyZWFtX2NvdW50ID0gb3B1c19jb3VwbGVkX3N0cmVhbXNbYXZjdHgtPmNoYW5uZWxzIC0gMV07CisgICAgb3B1cy0+c3RyZWFtX2NvdW50ICAgPSBhdmN0eC0+Y2hhbm5lbHMgLSBjb3VwbGVkX3N0cmVhbV9jb3VudDsKKyAgICBjaGFubmVsX21hcHBpbmcgICAgICA9IGxpYmF2Y29kZWNfbGlib3B1c19jaGFubmVsX21hcFthdmN0eC0+Y2hhbm5lbHMgLSAxXTsKKworICAgIC8qIEZJWE1FOiBPcHVzIGNhbiBoYW5kbGUgdXAgdG8gMjU1IGNoYW5uZWxzLiBIb3dldmVyLCB0aGUgbWFwcGluZyBmb3IKKyAgICAgKiBhbnl0aGluZyBncmVhdGVyIHRoYW4gOCBpcyB1bmRlZmluZWQuICovCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IDgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ2hhbm5lbCBsYXlvdXQgdW5kZWZpbmVkIGZvciAlZCBjaGFubmVscy5cbiIsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgaWYgKCFhdmN0eC0+Yml0X3JhdGUpIHsKKyAgICAgICAgLyogU2FuZSBkZWZhdWx0IGNvcGllZCBmcm9tIG9wdXNlbmMgKi8KKyAgICAgICAgYXZjdHgtPmJpdF9yYXRlID0gNjQwMDAgKiBvcHVzLT5zdHJlYW1fY291bnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCAqIGNvdXBsZWRfc3RyZWFtX2NvdW50OworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIk5vIGJpdCByYXRlIHNldC4gRGVmYXVsdGluZyB0byAlZCBicHMuXG4iLCBhdmN0eC0+Yml0X3JhdGUpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Yml0X3JhdGUgPCA1MDAgfHwgYXZjdHgtPmJpdF9yYXRlID4gMjU2MDAwICogYXZjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGhlIGJpdCByYXRlICVkIGJwcyBpcyB1bnN1cHBvcnRlZC4gIgorICAgICAgICAgICAgICAgIlBsZWFzZSBjaG9vc2UgYSB2YWx1ZSBiZXR3ZWVuIDUwMCBhbmQgJWQuXG4iLCBhdmN0eC0+Yml0X3JhdGUsCisgICAgICAgICAgICAgICAyNTYwMDAgKiBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGZyYW1lX3NpemUgPSBvcHVzLT5vcHRzLmZyYW1lX2R1cmF0aW9uICogNDgwMDAgLyAxMDAwOworICAgIHN3aXRjaCAoZnJhbWVfc2l6ZSkgeworICAgIGNhc2UgMTIwOgorICAgIGNhc2UgMjQwOgorICAgICAgICBpZiAob3B1cy0+b3B0cy5hcHBsaWNhdGlvbiAhPSBPUFVTX0FQUExJQ0FUSU9OX1JFU1RSSUNURURfTE9XREVMQVkpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJMUEMgbW9kZSBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgZnJhbWUgZHVyYXRpb24gb2YgbGVzcyAiCisgICAgICAgICAgICAgICAgICAgInRoYW4gMTBtcy4gRW5hYmxpbmcgcmVzdHJpY3RlZCBsb3ctZGVsYXkgbW9kZS5cbiIKKyAgICAgICAgICAgICAgICAgICAiVXNlIGEgbG9uZ2VyIGZyYW1lIGR1cmF0aW9uIGlmIHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQuXG4iKTsKKyAgICAgICAgLyogRnJhbWUgc2l6ZXMgbGVzcyB0aGFuIDEwIG1zIGNhbiBvbmx5IHVzZSBNRENUIG1vZGUsIHNvIHN3aXRjaGluZyB0bworICAgICAgICAgKiBSRVNUUklDVEVEX0xPV0RFTEFZIGF2b2lkcyBhbiB1bm5lY2Vzc2FyeSBleHRyYSAyLjVtcyBsb29rYWhlYWQuICovCisgICAgICAgIG9wdXMtPm9wdHMuYXBwbGljYXRpb24gPSBPUFVTX0FQUExJQ0FUSU9OX1JFU1RSSUNURURfTE9XREVMQVk7CisgICAgY2FzZSA0ODA6CisgICAgY2FzZSA5NjA6CisgICAgY2FzZSAxOTIwOgorICAgIGNhc2UgMjg4MDoKKyAgICAgICAgb3B1cy0+b3B0cy5wYWNrZXRfc2l6ZSA9CisgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplICAgICAgPSBmcmFtZV9zaXplICogYXZjdHgtPnNhbXBsZV9yYXRlIC8gNDgwMDA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZSBkdXJhdGlvbjogJWcuXG4iCisgICAgICAgICAgICAgICAiRnJhbWUgZHVyYXRpb24gbXVzdCBiZSBleGFjdGx5IG9uZSBvZjogMi41LCA1LCAxMCwgMjAsIDQwIG9yIDYwLlxuIiwKKyAgICAgICAgICAgICAgIG9wdXMtPm9wdHMuZnJhbWVfZHVyYXRpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPCAwIHx8IGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbCA+IDEwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiQ29tcHJlc3Npb24gbGV2ZWwgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCB0byAxMC4gIgorICAgICAgICAgICAgICAgIkRlZmF1bHRpbmcgdG8gMTAuXG4iKTsKKyAgICAgICAgb3B1cy0+b3B0cy5jb21wbGV4aXR5ID0gMTA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3B1cy0+b3B0cy5jb21wbGV4aXR5ID0gYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y3V0b2ZmKSB7CisgICAgICAgIHN3aXRjaCAoYXZjdHgtPmN1dG9mZikgeworICAgICAgICBjYXNlICA0MDAwOgorICAgICAgICAgICAgb3B1cy0+b3B0cy5tYXhfYmFuZHdpZHRoID0gT1BVU19CQU5EV0lEVEhfTkFSUk9XQkFORDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICA2MDAwOgorICAgICAgICAgICAgb3B1cy0+b3B0cy5tYXhfYmFuZHdpZHRoID0gT1BVU19CQU5EV0lEVEhfTUVESVVNQkFORDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICA4MDAwOgorICAgICAgICAgICAgb3B1cy0+b3B0cy5tYXhfYmFuZHdpZHRoID0gT1BVU19CQU5EV0lEVEhfV0lERUJBTkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjAwMDoKKyAgICAgICAgICAgIG9wdXMtPm9wdHMubWF4X2JhbmR3aWR0aCA9IE9QVVNfQkFORFdJRFRIX1NVUEVSV0lERUJBTkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyMDAwMDoKKyAgICAgICAgICAgIG9wdXMtPm9wdHMubWF4X2JhbmR3aWR0aCA9IE9QVVNfQkFORFdJRFRIX0ZVTExCQU5EOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZyZXF1ZW5jeSBjdXRvZmY6ICVkLiBVc2luZyBkZWZhdWx0IG1heGltdW0gYmFuZHdpZHRoLlxuIgorICAgICAgICAgICAgICAgICAgICJDdXRvZmYgZnJlcXVlbmN5IG11c3QgYmUgZXhhY3RseSBvbmUgb2Y6IDQwMDAsIDYwMDAsIDgwMDAsIDEyMDAwIG9yIDIwMDAwLlxuIiwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y3V0b2ZmKTsKKyAgICAgICAgICAgIGF2Y3R4LT5jdXRvZmYgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgZW5jID0gb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2NyZWF0ZShhdmN0eC0+c2FtcGxlX3JhdGUsIGF2Y3R4LT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdXMtPnN0cmVhbV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdXBsZWRfc3RyZWFtX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B1cy0+b3B0cy5hcHBsaWNhdGlvbiwgJnJldCk7CisgICAgaWYgKHJldCAhPSBPUFVTX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgZW5jb2RlcjogJXNcbiIsIG9wdXNfc3RyZXJyb3IocmV0KSk7CisgICAgICAgIHJldHVybiBmZl9vcHVzX2Vycm9yX3RvX2F2ZXJyb3IocmV0KTsKKyAgICB9CisKKyAgICByZXQgPSBsaWJvcHVzX2NvbmZpZ3VyZV9lbmNvZGVyKGF2Y3R4LCBlbmMsICZvcHVzLT5vcHRzKTsKKyAgICBpZiAocmV0ICE9IE9QVVNfT0spIHsKKyAgICAgICAgcmV0ID0gZmZfb3B1c19lcnJvcl90b19hdmVycm9yKHJldCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBoZWFkZXJfc2l6ZSA9IDE5ICsgKGF2Y3R4LT5jaGFubmVscyA+IDIgPyAyICsgYXZjdHgtPmNoYW5uZWxzIDogMCk7CisgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvYyhoZWFkZXJfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBleHRyYWRhdGEuXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IGhlYWRlcl9zaXplOworCisgICAgb3B1cy0+c2FtcGxlcyA9IGF2X21hbGxvY3ooZnJhbWVfc2l6ZSAqIGF2Y3R4LT5jaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoYXZjdHgtPnNhbXBsZV9mbXQpKTsKKyAgICBpZiAoIW9wdXMtPnNhbXBsZXMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgc2FtcGxlcyBidWZmZXIuXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChlbmMsIE9QVVNfR0VUX0xPT0tBSEVBRCgmYXZjdHgtPmluaXRpYWxfcGFkZGluZykpOworICAgIGlmIChyZXQgIT0gT1BVU19PSykKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IG51bWJlciBvZiBsb29rYWhlYWQgc2FtcGxlczogJXNcbiIsCisgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHJldCkpOworCisgICAgbGlib3B1c193cml0ZV9oZWFkZXIoYXZjdHgsIG9wdXMtPnN0cmVhbV9jb3VudCwgY291cGxlZF9zdHJlYW1fY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3B1c192b3JiaXNfY2hhbm5lbF9tYXBbYXZjdHgtPmNoYW5uZWxzIC0gMV0pOworCisgICAgZmZfYWZfcXVldWVfaW5pdChhdmN0eCwgJm9wdXMtPmFmcSk7CisKKyAgICBvcHVzLT5lbmMgPSBlbmM7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfZGVzdHJveShlbmMpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxpYm9wdXNfZW5jb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBMaWJvcHVzRW5jQ29udGV4dCAqb3B1cyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgaW50IHNhbXBsZV9zaXplICAgPSBhdmN0eC0+Y2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoYXZjdHgtPnNhbXBsZV9mbXQpOworICAgIHVpbnQ4X3QgKmF1ZGlvOworICAgIGludCByZXQ7CisgICAgaW50IGRpc2NhcmRfcGFkZGluZzsKKworICAgIGlmIChmcmFtZSkgeworICAgICAgICByZXQgPSBmZl9hZl9xdWV1ZV9hZGQoJm9wdXMtPmFmcSwgZnJhbWUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmIChmcmFtZS0+bmJfc2FtcGxlcyA8IG9wdXMtPm9wdHMucGFja2V0X3NpemUpIHsKKyAgICAgICAgICAgIGF1ZGlvID0gb3B1cy0+c2FtcGxlczsKKyAgICAgICAgICAgIG1lbWNweShhdWRpbywgZnJhbWUtPmRhdGFbMF0sIGZyYW1lLT5uYl9zYW1wbGVzICogc2FtcGxlX3NpemUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGF1ZGlvID0gZnJhbWUtPmRhdGFbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFvcHVzLT5hZnEucmVtYWluaW5nX3NhbXBsZXMpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYXVkaW8gPSBvcHVzLT5zYW1wbGVzOworICAgICAgICBtZW1zZXQoYXVkaW8sIDAsIG9wdXMtPm9wdHMucGFja2V0X3NpemUgKiBzYW1wbGVfc2l6ZSk7CisgICAgfQorCisgICAgLyogTWF4aW11bSBwYWNrZXQgc2l6ZSB0YWtlbiBmcm9tIG9wdXNlbmMgaW4gb3B1cy10b29scy4gNjBtcyBwYWNrZXRzCisgICAgICogY29uc2lzdCBvZiAzIGZyYW1lcyBpbiBvbmUgcGFja2V0LiBUaGUgbWF4aW11bSBmcmFtZSBzaXplIGlzIDEyNzUKKyAgICAgKiBieXRlcyBhbG9uZyB3aXRoIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHBhY2tldCBoZWFkZXIgb2YgNyBieXRlcy4gKi8KKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCAoMTI3NSAqIDMgKyA3KSAqIG9wdXMtPnN0cmVhbV9jb3VudCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChhdmN0eC0+c2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCkKKyAgICAgICAgcmV0ID0gb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVfZmxvYXQob3B1cy0+ZW5jLCAoZmxvYXQgKilhdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B1cy0+b3B0cy5wYWNrZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IG9wdXNfbXVsdGlzdHJlYW1fZW5jb2RlKG9wdXMtPmVuYywgKG9wdXNfaW50MTYgKilhdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B1cy0+b3B0cy5wYWNrZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkVycm9yIGVuY29kaW5nIGZyYW1lOiAlc1xuIiwgb3B1c19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgcmV0dXJuIGZmX29wdXNfZXJyb3JfdG9fYXZlcnJvcihyZXQpOworICAgIH0KKworICAgIGF2X3Nocmlua19wYWNrZXQoYXZwa3QsIHJldCk7CisKKyAgICBmZl9hZl9xdWV1ZV9yZW1vdmUoJm9wdXMtPmFmcSwgb3B1cy0+b3B0cy5wYWNrZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmF2cGt0LT5wdHMsICZhdnBrdC0+ZHVyYXRpb24pOworCisgICAgZGlzY2FyZF9wYWRkaW5nID0gb3B1cy0+b3B0cy5wYWNrZXRfc2l6ZSAtIGF2cGt0LT5kdXJhdGlvbjsKKyAgICAvLyBDaGVjayBpZiBzdWJ0cmFjdGlvbiByZXN1bHRlZCBpbiBhbiBvdmVyZmxvdworICAgIGlmICgoZGlzY2FyZF9wYWRkaW5nIDwgb3B1cy0+b3B0cy5wYWNrZXRfc2l6ZSkgIT0gKGF2cGt0LT5kdXJhdGlvbiA+IDApKSB7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KGF2cGt0KTsKKyAgICAgICAgYXZfZnJlZShhdnBrdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmIChkaXNjYXJkX3BhZGRpbmcgPiAwKSB7CisgICAgICAgIHVpbnQ4X3QqIHNpZGVfZGF0YSA9IGF2X3BhY2tldF9uZXdfc2lkZV9kYXRhKGF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9TS0lQX1NBTVBMRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwKTsKKyAgICAgICAgaWYoIXNpZGVfZGF0YSkgeworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQoYXZwa3QpOworICAgICAgICAgICAgYXZfZnJlZShhdnBrdCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIEFWX1dMMzIoc2lkZV9kYXRhICsgNCwgZGlzY2FyZF9wYWRkaW5nKTsKKyAgICB9CisKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJvcHVzX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTGlib3B1c0VuY0NvbnRleHQgKm9wdXMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2Rlc3Ryb3kob3B1cy0+ZW5jKTsKKworICAgIGZmX2FmX3F1ZXVlX2Nsb3NlKCZvcHVzLT5hZnEpOworCisgICAgYXZfZnJlZXAoJm9wdXMtPnNhbXBsZXMpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihMaWJvcHVzRW5jQ29udGV4dCwgb3B0cy54KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19BVURJT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbGlib3B1c19vcHRpb25zW10gPSB7CisgICAgeyAiYXBwbGljYXRpb24iLCAgICAiSW50ZW5kZWQgYXBwbGljYXRpb24gdHlwZSIsICAgICAgICAgICBPRkZTRVQoYXBwbGljYXRpb24pLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gT1BVU19BUFBMSUNBVElPTl9BVURJTyB9LCBPUFVTX0FQUExJQ0FUSU9OX1ZPSVAsIE9QVVNfQVBQTElDQVRJT05fUkVTVFJJQ1RFRF9MT1dERUxBWSwgRkxBR1MsICJhcHBsaWNhdGlvbiIgfSwKKyAgICAgICAgeyAidm9pcCIsICAgICAgICAgICAiRmF2b3IgaW1wcm92ZWQgc3BlZWNoIGludGVsbGlnaWJpbGl0eSIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QVVNfQVBQTElDQVRJT05fVk9JUCB9LCAgICAgICAgICAgICAgICAwLCAwLCBGTEFHUywgImFwcGxpY2F0aW9uIiB9LAorICAgICAgICB7ICJhdWRpbyIsICAgICAgICAgICJGYXZvciBmYWl0aGZ1bG5lc3MgdG8gdGhlIGlucHV0IiwgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gT1BVU19BUFBMSUNBVElPTl9BVURJTyB9LCAgICAgICAgICAgICAgIDAsIDAsIEZMQUdTLCAiYXBwbGljYXRpb24iIH0sCisgICAgICAgIHsgImxvd2RlbGF5IiwgICAgICAgIlJlc3RyaWN0IHRvIG9ubHkgdGhlIGxvd2VzdCBkZWxheSBtb2RlcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBPUFVTX0FQUExJQ0FUSU9OX1JFU1RSSUNURURfTE9XREVMQVkgfSwgMCwgMCwgRkxBR1MsICJhcHBsaWNhdGlvbiIgfSwKKyAgICB7ICJmcmFtZV9kdXJhdGlvbiIsICJEdXJhdGlvbiBvZiBhIGZyYW1lIGluIG1pbGxpc2Vjb25kcyIsIE9GRlNFVChmcmFtZV9kdXJhdGlvbiksIEFWX09QVF9UWVBFX0ZMT0FULCB7IC5kYmwgPSAyMC4wIH0sIDIuNSwgNjAuMCwgRkxBR1MgfSwKKyAgICB7ICJwYWNrZXRfbG9zcyIsICAgICJFeHBlY3RlZCBwYWNrZXQgbG9zcyBwZXJjZW50YWdlIiwgICAgIE9GRlNFVChwYWNrZXRfbG9zcyksICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwIH0sICAgIDAsICAgMTAwLCAgRkxBR1MgfSwKKyAgICB7ICJ2YnIiLCAgICAgICAgICAgICJWYXJpYWJsZSBiaXQgcmF0ZSBtb2RlIiwgICAgICAgICAgICAgIE9GRlNFVCh2YnIpLCAgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAxIH0sICAgIDAsICAgMiwgICAgRkxBR1MsICJ2YnIiIH0sCisgICAgICAgIHsgIm9mZiIsICAgICAgICAgICAgIlVzZSBjb25zdGFudCBiaXQgcmF0ZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAwIH0sIDAsIDAsIEZMQUdTLCAidmJyIiB9LAorICAgICAgICB7ICJvbiIsICAgICAgICAgICAgICJVc2UgdmFyaWFibGUgYml0IHJhdGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMSB9LCAwLCAwLCBGTEFHUywgInZiciIgfSwKKyAgICAgICAgeyAiY29uc3RyYWluZWQiLCAgICAiVXNlIGNvbnN0cmFpbmVkIFZCUiIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDIgfSwgMCwgMCwgRkxBR1MsICJ2YnIiIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBsaWJvcHVzX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImxpYm9wdXMiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBsaWJvcHVzX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgbGlib3B1c19kZWZhdWx0c1tdID0geworICAgIHsgImIiLCAgICAgICAgICAgICAgICAgIjAiIH0sCisgICAgeyAiY29tcHJlc3Npb25fbGV2ZWwiLCAiMTAiIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgaW50IGxpYm9wdXNfc2FtcGxlX3JhdGVzW10gPSB7CisgICAgNDgwMDAsIDI0MDAwLCAxNjAwMCwgMTIwMDAsIDgwMDAsIDAsCit9OworCitBVkNvZGVjIGZmX2xpYm9wdXNfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgID0gImxpYm9wdXMiLAorICAgIC5sb25nX25hbWUgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGlib3B1cyBPcHVzIiksCisgICAgLnR5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfT1BVUywKKyAgICAucHJpdl9kYXRhX3NpemUgID0gc2l6ZW9mKExpYm9wdXNFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgID0gbGlib3B1c19lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgID0gbGlib3B1c19lbmNvZGUsCisgICAgLmNsb3NlICAgICAgICAgICA9IGxpYm9wdXNfZW5jb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICAgPSBDT0RFQ19DQVBfREVMQVkgfCBDT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAuY2hhbm5lbF9sYXlvdXRzID0gZmZfdm9yYmlzX2NoYW5uZWxfbGF5b3V0cywKKyAgICAuc3VwcG9ydGVkX3NhbXBsZXJhdGVzID0gbGlib3B1c19zYW1wbGVfcmF0ZXMsCisgICAgLnByaXZfY2xhc3MgICAgICA9ICZsaWJvcHVzX2NsYXNzLAorICAgIC5kZWZhdWx0cyAgICAgICAgPSBsaWJvcHVzX2RlZmF1bHRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnNjaHJvZWRpbmdlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlic2Nocm9lZGluZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwYjI1YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnNjaHJvZWRpbmdlci5jCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEJCQywgQW51cmFkaGEgU3VyYXBhcmFqdSA8YXN1cmFwYXJhanUgYXQgZ21haWwgZG90IGNvbSA+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorKiBAZmlsZQorKiBmdW5jdGlvbiBkZWZpbml0aW9ucyBjb21tb24gdG8gbGlic2Nocm9lZGluZ2VyIGRlY29kZXIgYW5kIGVuY29kZXIKKyovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJzY2hyb2VkaW5nZXIuaCIKKworc3RhdGljIGNvbnN0IFNjaHJvVmlkZW9Gb3JtYXRJbmZvIGZmX3NjaHJvX3ZpZGVvX2Zvcm1hdF9pbmZvW10gPSB7CisgICAgeyA2NDAsICA0ODAsICAyNDAwMCwgMTAwMX0sCisgICAgeyAxNzYsICAxMjAsICAxNTAwMCwgMTAwMX0sCisgICAgeyAxNzYsICAxNDQsICAyNSwgICAgMiAgIH0sCisgICAgeyAzNTIsICAyNDAsICAxNTAwMCwgMTAwMX0sCisgICAgeyAzNTIsICAyODgsICAyNSwgICAgMiAgIH0sCisgICAgeyA3MDQsICA0ODAsICAxNTAwMCwgMTAwMX0sCisgICAgeyA3MDQsICA1NzYsICAyNSwgICAgMiAgIH0sCisgICAgeyA3MjAsICA0ODAsICAzMDAwMCwgMTAwMX0sCisgICAgeyA3MjAsICA1NzYsICAyNSwgICAgMSAgIH0sCisgICAgeyAxMjgwLCA3MjAsICA2MDAwMCwgMTAwMX0sCisgICAgeyAxMjgwLCA3MjAsICA1MCwgICAgMSAgIH0sCisgICAgeyAxOTIwLCAxMDgwLCAzMDAwMCwgMTAwMX0sCisgICAgeyAxOTIwLCAxMDgwLCAyNSwgICAgMSAgIH0sCisgICAgeyAxOTIwLCAxMDgwLCA2MDAwMCwgMTAwMX0sCisgICAgeyAxOTIwLCAxMDgwLCA1MCwgICAgMSAgIH0sCisgICAgeyAyMDQ4LCAxMDgwLCAyNCwgICAgMSAgIH0sCisgICAgeyA0MDk2LCAyMTYwLCAyNCwgICAgMSAgIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF92aWRlb19mb3JtYXRfaWR4KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmV0X2lkeCA9IDA7CisgICAgdW5zaWduZWQgaW50IGlkeDsKKyAgICB1bnNpZ25lZCBpbnQgbnVtX2Zvcm1hdHMgPSBzaXplb2YoZmZfc2Nocm9fdmlkZW9fZm9ybWF0X2luZm8pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmZfc2Nocm9fdmlkZW9fZm9ybWF0X2luZm9bMF0pOworCisgICAgZm9yIChpZHggPSAxOyBpZHggPCBudW1fZm9ybWF0czsgKytpZHgpIHsKKyAgICAgICAgY29uc3QgU2Nocm9WaWRlb0Zvcm1hdEluZm8gKnZmID0gJmZmX3NjaHJvX3ZpZGVvX2Zvcm1hdF9pbmZvW2lkeF07CisgICAgICAgIGlmIChhdmN0eC0+d2lkdGggID09IHZmLT53aWR0aCAmJgorICAgICAgICAgICAgYXZjdHgtPmhlaWdodCA9PSB2Zi0+aGVpZ2h0KSB7CisgICAgICAgICAgICByZXRfaWR4ID0gaWR4OworICAgICAgICAgICAgaWYgKGF2Y3R4LT50aW1lX2Jhc2UuZGVuID09IHZmLT5mcmFtZV9yYXRlX251bSAmJgorICAgICAgICAgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UubnVtID09IHZmLT5mcmFtZV9yYXRlX2Rlbm9tKQorICAgICAgICAgICAgICAgIHJldHVybiBpZHg7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldF9pZHg7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9zY2hyb19xdWV1ZV9pbml0KEZGU2Nocm9RdWV1ZSAqcXVldWUpCit7CisgICAgcXVldWUtPnBfaGVhZCA9IHF1ZXVlLT5wX3RhaWwgPSBOVUxMOworICAgIHF1ZXVlLT5zaXplID0gMDsKK30KKwordm9pZCBmZl9zY2hyb19xdWV1ZV9mcmVlKEZGU2Nocm9RdWV1ZSAqcXVldWUsIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKikpCit7CisgICAgd2hpbGUgKHF1ZXVlLT5wX2hlYWQpCisgICAgICAgIGZyZWVfZnVuYyhmZl9zY2hyb19xdWV1ZV9wb3AocXVldWUpKTsKK30KKworaW50IGZmX3NjaHJvX3F1ZXVlX3B1c2hfYmFjayhGRlNjaHJvUXVldWUgKnF1ZXVlLCB2b2lkICpwX2RhdGEpCit7CisgICAgRkZTY2hyb1F1ZXVlRWxlbWVudCAqcF9uZXcgPSBhdl9tYWxsb2N6KHNpemVvZihGRlNjaHJvUXVldWVFbGVtZW50KSk7CisKKyAgICBpZiAoIXBfbmV3KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBwX25ldy0+ZGF0YSA9IHBfZGF0YTsKKworICAgIGlmICghcXVldWUtPnBfaGVhZCkKKyAgICAgICAgcXVldWUtPnBfaGVhZCA9IHBfbmV3OworICAgIGVsc2UKKyAgICAgICAgcXVldWUtPnBfdGFpbC0+bmV4dCA9IHBfbmV3OworICAgIHF1ZXVlLT5wX3RhaWwgPSBwX25ldzsKKworICAgICsrcXVldWUtPnNpemU7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgKmZmX3NjaHJvX3F1ZXVlX3BvcChGRlNjaHJvUXVldWUgKnF1ZXVlKQoreworICAgIEZGU2Nocm9RdWV1ZUVsZW1lbnQgKnRvcCA9IHF1ZXVlLT5wX2hlYWQ7CisKKyAgICBpZiAodG9wKSB7CisgICAgICAgIHZvaWQgKmRhdGEgPSB0b3AtPmRhdGE7CisgICAgICAgIHF1ZXVlLT5wX2hlYWQgPSBxdWV1ZS0+cF9oZWFkLT5uZXh0OworICAgICAgICAtLXF1ZXVlLT5zaXplOworICAgICAgICBhdl9mcmVlcCgmdG9wKTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorKiBTY2hyb2VkaW5nZXIgdmlkZW8gcHJlc2V0IHRhYmxlLiBFbnN1cmUgdGhhdCB0aGlzIHRhYmxlcyBtYXRjaGVzIHVwIGNvcnJlY3RseQorKiB3aXRoIHRoZSBmZl9zY2hyb192aWRlb19mb3JtYXRfaW5mbyB0YWJsZS4KKyovCitzdGF0aWMgY29uc3QgU2Nocm9WaWRlb0Zvcm1hdEVudW0gZmZfc2Nocm9fdmlkZW9fZm9ybWF0c1tdPXsKKyAgICBTQ0hST19WSURFT19GT1JNQVRfQ1VTVE9NICAgICAsCisgICAgU0NIUk9fVklERU9fRk9STUFUX1FTSUYgICAgICAgLAorICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF9RQ0lGICAgICAgICwKKyAgICBTQ0hST19WSURFT19GT1JNQVRfU0lGICAgICAgICAsCisgICAgU0NIUk9fVklERU9fRk9STUFUX0NJRiAgICAgICAgLAorICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF80U0lGICAgICAgICwKKyAgICBTQ0hST19WSURFT19GT1JNQVRfNENJRiAgICAgICAsCisgICAgU0NIUk9fVklERU9fRk9STUFUX1NENDgwSV82MCAgLAorICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF9TRDU3NklfNTAgICwKKyAgICBTQ0hST19WSURFT19GT1JNQVRfSEQ3MjBQXzYwICAsCisgICAgU0NIUk9fVklERU9fRk9STUFUX0hENzIwUF81MCAgLAorICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF9IRDEwODBJXzYwICwKKyAgICBTQ0hST19WSURFT19GT1JNQVRfSEQxMDgwSV81MCAsCisgICAgU0NIUk9fVklERU9fRk9STUFUX0hEMTA4MFBfNjAgLAorICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF9IRDEwODBQXzUwICwKKyAgICBTQ0hST19WSURFT19GT1JNQVRfREMyS18yNCAgICAsCisgICAgU0NIUk9fVklERU9fRk9STUFUX0RDNEtfMjQgICAgLAorfTsKKworU2Nocm9WaWRlb0Zvcm1hdEVudW0gZmZfZ2V0X3NjaHJvX3ZpZGVvX2Zvcm1hdF9wcmVzZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHVuc2lnbmVkIGludCBudW1fZm9ybWF0cyA9IHNpemVvZihmZl9zY2hyb192aWRlb19mb3JtYXRzKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZmX3NjaHJvX3ZpZGVvX2Zvcm1hdHNbMF0pOworCisgICAgdW5zaWduZWQgaW50IGlkeCA9IGdldF92aWRlb19mb3JtYXRfaWR4KGF2Y3R4KTsKKworICAgIHJldHVybiAoaWR4IDwgbnVtX2Zvcm1hdHMpID8gZmZfc2Nocm9fdmlkZW9fZm9ybWF0c1tpZHhdIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF9DVVNUT007Cit9CisKK2ludCBmZl9nZXRfc2Nocm9fZnJhbWVfZm9ybWF0IChTY2hyb0Nocm9tYUZvcm1hdCBzY2hyb19waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaHJvRnJhbWVGb3JtYXQgICpzY2hyb19mcmFtZV9mbXQpCit7CisgICAgdW5zaWduZWQgaW50IG51bV9mb3JtYXRzID0gc2l6ZW9mKHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2Nocm9fcGl4ZWxfZm9ybWF0X21hcFswXSk7CisKKyAgICBpbnQgaWR4OworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBudW1fZm9ybWF0czsgKytpZHgpIHsKKyAgICAgICAgaWYgKHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXBbaWR4XS5zY2hyb19waXhfZm10ID09IHNjaHJvX3BpeF9mbXQpIHsKKyAgICAgICAgICAgICpzY2hyb19mcmFtZV9mbXQgPSBzY2hyb19waXhlbF9mb3JtYXRfbWFwW2lkeF0uc2Nocm9fZnJhbWVfZm10OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3NjaHJvX2ZyYW1lKFNjaHJvRnJhbWUgKmZyYW1lLCB2b2lkICpwcml2KQoreworICAgIEFWUGljdHVyZSAqcF9waWMgPSBwcml2OworCisgICAgaWYgKCFwX3BpYykKKyAgICAgICAgcmV0dXJuOworCisgICAgYXZwaWN0dXJlX2ZyZWUocF9waWMpOworICAgIGF2X2ZyZWVwKCZwX3BpYyk7Cit9CisKK1NjaHJvRnJhbWUgKmZmX2NyZWF0ZV9zY2hyb19mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Nocm9GcmFtZUZvcm1hdCBzY2hyb19mcmFtZV9mbXQpCit7CisgICAgQVZQaWN0dXJlICpwX3BpYzsKKyAgICBTY2hyb0ZyYW1lICpwX2ZyYW1lOworICAgIGludCB5X3dpZHRoLCB1dl93aWR0aDsKKyAgICBpbnQgeV9oZWlnaHQsIHV2X2hlaWdodDsKKyAgICBpbnQgaTsKKworICAgIHlfd2lkdGggICA9IGF2Y3R4LT53aWR0aDsKKyAgICB5X2hlaWdodCAgPSBhdmN0eC0+aGVpZ2h0OworICAgIHV2X3dpZHRoICA9IHlfd2lkdGggID4+IChTQ0hST19GUkFNRV9GT1JNQVRfSF9TSElGVChzY2hyb19mcmFtZV9mbXQpKTsKKyAgICB1dl9oZWlnaHQgPSB5X2hlaWdodCA+PiAoU0NIUk9fRlJBTUVfRk9STUFUX1ZfU0hJRlQoc2Nocm9fZnJhbWVfZm10KSk7CisKKyAgICBwX3BpYyA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWUGljdHVyZSkpOworICAgIGlmICghcF9waWMgfHwgYXZwaWN0dXJlX2FsbG9jKHBfcGljLCBhdmN0eC0+cGl4X2ZtdCwgeV93aWR0aCwgeV9oZWlnaHQpIDwgMCkgeworICAgICAgICBhdl9mcmVlKHBfcGljKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcF9mcmFtZSAgICAgICAgID0gc2Nocm9fZnJhbWVfbmV3KCk7CisgICAgcF9mcmFtZS0+Zm9ybWF0ID0gc2Nocm9fZnJhbWVfZm10OworICAgIHBfZnJhbWUtPndpZHRoICA9IHlfd2lkdGg7CisgICAgcF9mcmFtZS0+aGVpZ2h0ID0geV9oZWlnaHQ7CisgICAgc2Nocm9fZnJhbWVfc2V0X2ZyZWVfY2FsbGJhY2socF9mcmFtZSwgZnJlZV9zY2hyb19mcmFtZSwgKHZvaWQgKilwX3BpYyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgIHBfZnJhbWUtPmNvbXBvbmVudHNbaV0ud2lkdGggID0gaSA/IHV2X3dpZHRoIDogeV93aWR0aDsKKyAgICAgICAgcF9mcmFtZS0+Y29tcG9uZW50c1tpXS5zdHJpZGUgPSBwX3BpYy0+bGluZXNpemVbaV07CisgICAgICAgIHBfZnJhbWUtPmNvbXBvbmVudHNbaV0uaGVpZ2h0ID0gaSA/IHV2X2hlaWdodCA6IHlfaGVpZ2h0OworICAgICAgICBwX2ZyYW1lLT5jb21wb25lbnRzW2ldLmxlbmd0aCA9CisgICAgICAgICAgICAgICAgIHBfZnJhbWUtPmNvbXBvbmVudHNbaV0uc3RyaWRlICogcF9mcmFtZS0+Y29tcG9uZW50c1tpXS5oZWlnaHQ7CisgICAgICAgIHBfZnJhbWUtPmNvbXBvbmVudHNbaV0uZGF0YSAgID0gcF9waWMtPmRhdGFbaV07CisKKyAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgIHBfZnJhbWUtPmNvbXBvbmVudHNbaV0udl9zaGlmdCA9CisgICAgICAgICAgICAgICAgU0NIUk9fRlJBTUVfRk9STUFUX1ZfU0hJRlQocF9mcmFtZS0+Zm9ybWF0KTsKKyAgICAgICAgICAgIHBfZnJhbWUtPmNvbXBvbmVudHNbaV0uaF9zaGlmdCA9CisgICAgICAgICAgICAgICAgU0NIUk9fRlJBTUVfRk9STUFUX0hfU0hJRlQocF9mcmFtZS0+Zm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwX2ZyYW1lOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGlic2Nocm9lZGluZ2VyLmggYi9mZm1wZWcvbGliYXZjb2RlYy9saWJzY2hyb2VkaW5nZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmZlNTdjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlic2Nocm9lZGluZ2VyLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQkJDLCBBbnVyYWRoYSBTdXJhcGFyYWp1IDxhc3VyYXBhcmFqdSBhdCBnbWFpbCBkb3QgY29tID4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisqIEBmaWxlCisqIGRhdGEgc3RydWN0dXJlcyBjb21tb24gdG8gbGlic2Nocm9lZGluZ2VyIGRlY29kZXIgYW5kIGVuY29kZXIKKyovCisKKyNpZm5kZWYgQVZDT0RFQ19MSUJTQ0hST0VESU5HRVJfSAorI2RlZmluZSBBVkNPREVDX0xJQlNDSFJPRURJTkdFUl9ICisKKyNpbmNsdWRlIDxzY2hyb2VkaW5nZXIvc2Nocm9iaXRzdHJlYW0uaD4KKyNpbmNsdWRlIDxzY2hyb2VkaW5nZXIvc2Nocm9mcmFtZS5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCit0eXBlZGVmIHN0cnVjdCBTY2hyb1ZpZGVvRm9ybWF0SW5mbyB7CisgICAgdWludDE2X3Qgd2lkdGg7CisgICAgdWludDE2X3QgaGVpZ2h0OworICAgIHVpbnQxNl90IGZyYW1lX3JhdGVfbnVtOworICAgIHVpbnQxNl90IGZyYW1lX3JhdGVfZGVub207Cit9IFNjaHJvVmlkZW9Gb3JtYXRJbmZvOworCisvKioKKyogY29udGFpbnMgYSBzaW5nbGUgZW5jb2RlZCBmcmFtZSByZXR1cm5lZCBmcm9tIERpcmFjIG9yIFNjaHJvZWRpbmdlcgorKi8KK3R5cGVkZWYgc3RydWN0IEZGU2Nocm9FbmNvZGVkRnJhbWUgeworICAgIC8qKiBlbmNvZGVkIGZyYW1lIGRhdGEgKi8KKyAgICB1aW50OF90ICpwX2VuY2J1ZjsKKworICAgIC8qKiBlbmNvZGVkIGZyYW1lIHNpemUgKi8KKyAgICB1aW50MzJfdCBzaXplOworCisgICAgLyoqIGVuY29kZWQgZnJhbWUgbnVtYmVyLiBXaWxsIGJlIHVzZWQgYXMgcHRzICovCisgICAgdWludDMyX3QgZnJhbWVfbnVtOworCisgICAgLyoqIGtleSBmcmFtZSBmbGFnLiAxIDogaXMga2V5IGZyYW1lICwgMCA6IGluIG5vdCBrZXkgZnJhbWUgKi8KKyAgICB1aW50MTZfdCBrZXlfZnJhbWU7Cit9IEZGU2Nocm9FbmNvZGVkRnJhbWU7CisKKy8qKgorKiBxdWV1ZSBlbGVtZW50CisqLwordHlwZWRlZiBzdHJ1Y3QgRkZTY2hyb1F1ZXVlRWxlbWVudCB7CisgICAgLyoqIERhdGEgdG8gYmUgc3RvcmVkIGluIHF1ZXVlKi8KKyAgICB2b2lkICpkYXRhOworICAgIC8qKiBQb2ludGVyIHRvIG5leHQgZWxlbWVudCBxdWV1ZSAqLworICAgIHN0cnVjdCBGRlNjaHJvUXVldWVFbGVtZW50ICpuZXh0OworfSBGRlNjaHJvUXVldWVFbGVtZW50OworCisKKy8qKgorKiBBIHNpbXBsZSBxdWV1ZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGluIGxpYnNjaHJvZWRpbmdlcgorKi8KK3R5cGVkZWYgc3RydWN0IEZGU2Nocm9RdWV1ZSB7CisgICAgLyoqIFBvaW50ZXIgdG8gaGVhZCBvZiBxdWV1ZSAqLworICAgIEZGU2Nocm9RdWV1ZUVsZW1lbnQgKnBfaGVhZDsKKyAgICAvKiogUG9pbnRlciB0byB0YWlsIG9mIHF1ZXVlICovCisgICAgRkZTY2hyb1F1ZXVlRWxlbWVudCAqcF90YWlsOworICAgIC8qKiBRdWV1ZSBzaXplKi8KKyAgICBpbnQgc2l6ZTsKK30gRkZTY2hyb1F1ZXVlOworCisvKioKKyogSW5pdGlhbGlzZSB0aGUgcXVldWUKKyovCit2b2lkIGZmX3NjaHJvX3F1ZXVlX2luaXQoRkZTY2hyb1F1ZXVlICpxdWV1ZSk7CisKKy8qKgorKiBBZGQgYW4gZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZQorKi8KK2ludCBmZl9zY2hyb19xdWV1ZV9wdXNoX2JhY2soRkZTY2hyb1F1ZXVlICpxdWV1ZSwgdm9pZCAqcF9kYXRhKTsKKworLyoqCisqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcXVldWUKKyovCit2b2lkICpmZl9zY2hyb19xdWV1ZV9wb3AoRkZTY2hyb1F1ZXVlICpxdWV1ZSk7CisKKy8qKgorKiBGcmVlIHRoZSBxdWV1ZSByZXNvdXJjZXMuIGZyZWVfZnVuYyBpcyBhIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIgdG8KKyogZnJlZSBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLiBUaGUgZGF0YSBmaWVsZCBvZiB0aGUgcXVldWUKKyogZWxlbWVudCBpcyBwYXNzZWQgdG8gaXQuCisqLwordm9pZCBmZl9zY2hyb19xdWV1ZV9mcmVlKEZGU2Nocm9RdWV1ZSAqcXVldWUsIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKikpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgIGZmX3BpeF9mbXQ7CisgICAgU2Nocm9DaHJvbWFGb3JtYXQgc2Nocm9fcGl4X2ZtdDsKKyAgICBTY2hyb0ZyYW1lRm9ybWF0ICBzY2hyb19mcmFtZV9mbXQ7Cit9IHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXBbXSA9IHsKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIwUCwgU0NIUk9fQ0hST01BXzQyMCwgU0NIUk9fRlJBTUVfRk9STUFUX1U4XzQyMCB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjJQLCBTQ0hST19DSFJPTUFfNDIyLCBTQ0hST19GUkFNRV9GT1JNQVRfVThfNDIyIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAsIFNDSFJPX0NIUk9NQV80NDQsIFNDSFJPX0ZSQU1FX0ZPUk1BVF9VOF80NDQgfSwKK307CisKKy8qKgorKiBSZXR1cm5zIHRoZSB2aWRlbyBmb3JtYXQgcHJlc2V0IG1hdGNoaW5nIHRoZSBpbnB1dCB2aWRlbyBkaW1lbnNpb25zIGFuZAorKiB0aW1lIGJhc2UuCisqLworU2Nocm9WaWRlb0Zvcm1hdEVudW0gZmZfZ2V0X3NjaHJvX3ZpZGVvX2Zvcm1hdF9wcmVzZXQgKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKy8qKgorKiBTZXRzIHRoZSBTY2hyb2VkaW5nZXIgZnJhbWUgZm9ybWF0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNjaHJvIGNocm9tYSBmb3JtYXQKKyogcGFzc2VkLiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyovCitpbnQgZmZfZ2V0X3NjaHJvX2ZyYW1lX2Zvcm1hdChTY2hyb0Nocm9tYUZvcm1hdCBzY2hyb19jaHJvbWFfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Nocm9GcmFtZUZvcm1hdCAgKnNjaHJvX2ZyYW1lX2ZtdCk7CisKKy8qKgorKiBDcmVhdGUgYSBTY2hybyBmcmFtZSBiYXNlZCBvbiB0aGUgZGltZW5zaW9ucyBhbmQgZnJhbWUgZm9ybWF0CisqIHBhc3NlZC4gUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBmcmFtZSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCisqLworU2Nocm9GcmFtZSAqZmZfY3JlYXRlX3NjaHJvX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hyb0ZyYW1lRm9ybWF0IHNjaHJvX2ZyYW1lX2ZtdCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0xJQlNDSFJPRURJTkdFUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJzY2hyb2VkaW5nZXJkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnNjaHJvZWRpbmdlcmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTMzNzkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJzY2hyb2VkaW5nZXJkZWMuYwpAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqIERpcmFjIGRlY29kZXIgc3VwcG9ydCB2aWEgU2Nocm9lZGluZ2VyIGxpYnJhcmllcworICogQ29weXJpZ2h0IChjKSAyMDA4IEJCQywgQW51cmFkaGEgU3VyYXBhcmFqdSA8YXN1cmFwYXJhanUgYXQgZ21haWwgZG90IGNvbSA+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorKiBAZmlsZQorKiBEaXJhYyBkZWNvZGVyIHN1cHBvcnQgdmlhIGxpYnNjaHJvZWRpbmdlci0xLjAgbGlicmFyaWVzLiBNb3JlIGRldGFpbHMgYWJvdXQKKyogdGhlIFNjaHJvZWRpbmdlciBwcm9qZWN0IGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vd3d3LmRpcmFjdmlkZW8ub3JnLy4KKyogVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBEaXJhYyBTcGVjaWZpY2F0aW9uIFZlcnNpb24gMi4yLgorKiAoaHR0cDovL2RpcmFjLnNvdXJjZWZvcmdlLm5ldC9zcGVjaWZpY2F0aW9uLmh0bWwpLgorKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJzY2hyb2VkaW5nZXIuaCIKKworI2luY2x1ZGUgPHNjaHJvZWRpbmdlci9zY2hyby5oPgorI2luY2x1ZGUgPHNjaHJvZWRpbmdlci9zY2hyb2RlYnVnLmg+CisjaW5jbHVkZSA8c2Nocm9lZGluZ2VyL3NjaHJvdmlkZW9mb3JtYXQuaD4KKworLyoqIFNjaHJvRnJhbWUgYW5kIFB0cyByZWxhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgTGliU2Nocm9GcmFtZUNvbnRleHQgeworICAgICBTY2hyb0ZyYW1lICpmcmFtZTsKKyAgICAgaW50NjRfdCBwdHM7Cit9IExpYlNjaHJvRnJhbWVDb250ZXh0OworCisvKiogbGlic2Nocm9lZGluZ2VyIGRlY29kZXIgcHJpdmF0ZSBkYXRhICovCit0eXBlZGVmIHN0cnVjdCBTY2hyb0RlY29kZXJQYXJhbXMgeworICAgIC8qKiBTY2hyb2VkaW5nZXIgdmlkZW8gZm9ybWF0ICovCisgICAgU2Nocm9WaWRlb0Zvcm1hdCAqZm9ybWF0OworCisgICAgLyoqIFNjaHJvZWRpbmdlciBmcmFtZSBmb3JtYXQgKi8KKyAgICBTY2hyb0ZyYW1lRm9ybWF0IGZyYW1lX2Zvcm1hdDsKKworICAgIC8qKiBkZWNvZGVyIGhhbmRsZSAqLworICAgIFNjaHJvRGVjb2RlciogZGVjb2RlcjsKKworICAgIC8qKiBxdWV1ZSBzdG9yaW5nIGRlY29kZWQgZnJhbWVzICovCisgICAgRkZTY2hyb1F1ZXVlIGRlY19mcmFtZV9xdWV1ZTsKKworICAgIC8qKiBlbmQgb2Ygc2VxdWVuY2Ugc2lnbmFsbGVkICovCisgICAgaW50IGVvc19zaWduYWxsZWQ7CisKKyAgICAvKiogZW5kIG9mIHNlcXVlbmNlIHB1bGxlZCAqLworICAgIGludCBlb3NfcHVsbGVkOworfSBTY2hyb0RlY29kZXJQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IFNjaHJvUGFyc2VVbml0Q29udGV4dCB7CisgICAgY29uc3QgdWludDhfdCAqYnVmOworICAgIGludCAgICAgICAgICAgYnVmX3NpemU7Cit9IFNjaHJvUGFyc2VVbml0Q29udGV4dDsKKworCitzdGF0aWMgdm9pZCBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2J1ZmZlcl9mcmVlKFNjaHJvQnVmZmVyICpzY2hyb19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnByaXYpCit7CisgICAgYXZfZnJlZXAoJnByaXYpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9jb250ZXh0X2luaXQoU2Nocm9QYXJzZVVuaXRDb250ZXh0ICpwYXJzZV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgcGFyc2VfY3R4LT5idWYgICAgICAgICAgID0gYnVmOworICAgIHBhcnNlX2N0eC0+YnVmX3NpemUgICAgICA9IGJ1Zl9zaXplOworfQorCitzdGF0aWMgU2Nocm9CdWZmZXIgKmZpbmRfbmV4dF9wYXJzZV91bml0KFNjaHJvUGFyc2VVbml0Q29udGV4dCAqcGFyc2VfY3R4KQoreworICAgIFNjaHJvQnVmZmVyICplbmNfYnVmID0gTlVMTDsKKyAgICBpbnQgbmV4dF9wdV9vZmZzZXQgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgKmluX2J1ZjsKKworICAgIGlmIChwYXJzZV9jdHgtPmJ1Zl9zaXplIDwgMTMgfHwKKyAgICAgICAgcGFyc2VfY3R4LT5idWZbMF0gIT0gJ0InIHx8CisgICAgICAgIHBhcnNlX2N0eC0+YnVmWzFdICE9ICdCJyB8fAorICAgICAgICBwYXJzZV9jdHgtPmJ1ZlsyXSAhPSAnQycgfHwKKyAgICAgICAgcGFyc2VfY3R4LT5idWZbM10gIT0gJ0QnKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG5leHRfcHVfb2Zmc2V0ID0gKHBhcnNlX2N0eC0+YnVmWzVdIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAocGFyc2VfY3R4LT5idWZbNl0gPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgIChwYXJzZV9jdHgtPmJ1Zls3XSA8PCAgOCkgKworICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2N0eC0+YnVmWzhdOworCisgICAgaWYgKG5leHRfcHVfb2Zmc2V0ID09IDAgJiYKKyAgICAgICAgU0NIUk9fUEFSU0VfQ09ERV9JU19FTkRfT0ZfU0VRVUVOQ0UocGFyc2VfY3R4LT5idWZbNF0pKQorICAgICAgICBuZXh0X3B1X29mZnNldCA9IDEzOworCisgICAgaWYgKG5leHRfcHVfb2Zmc2V0IDw9IDAgfHwgcGFyc2VfY3R4LT5idWZfc2l6ZSA8IG5leHRfcHVfb2Zmc2V0KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGluX2J1ZiA9IGF2X21hbGxvYyhuZXh0X3B1X29mZnNldCk7CisgICAgaWYgKCFpbl9idWYpIHsKKyAgICAgICAgYXZfbG9nKHBhcnNlX2N0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGlucHV0IGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1lbWNweShpbl9idWYsIHBhcnNlX2N0eC0+YnVmLCBuZXh0X3B1X29mZnNldCk7CisgICAgZW5jX2J1ZiAgICAgICA9IHNjaHJvX2J1ZmZlcl9uZXdfd2l0aF9kYXRhKGluX2J1ZiwgbmV4dF9wdV9vZmZzZXQpOworICAgIGVuY19idWYtPmZyZWUgPSBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2J1ZmZlcl9mcmVlOworICAgIGVuY19idWYtPnByaXYgPSBpbl9idWY7CisKKyAgICBwYXJzZV9jdHgtPmJ1ZiAgICAgICs9IG5leHRfcHVfb2Zmc2V0OworICAgIHBhcnNlX2N0eC0+YnVmX3NpemUgLT0gbmV4dF9wdV9vZmZzZXQ7CisKKyAgICByZXR1cm4gZW5jX2J1ZjsKK30KKworLyoqCisqIFJldHVybnMgRkZtcGVnIGNocm9tYSBmb3JtYXQuCisqLworc3RhdGljIGVudW0gQVZQaXhlbEZvcm1hdCBnZXRfY2hyb21hX2Zvcm1hdChTY2hyb0Nocm9tYUZvcm1hdCBzY2hyb19waXhfZm10KQoreworICAgIGludCBudW1fZm9ybWF0cyA9IHNpemVvZihzY2hyb19waXhlbF9mb3JtYXRfbWFwKSAvCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXBbMF0pOworICAgIGludCBpZHg7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9mb3JtYXRzOyArK2lkeCkKKyAgICAgICAgaWYgKHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXBbaWR4XS5zY2hyb19waXhfZm10ID09IHNjaHJvX3BpeF9mbXQpCisgICAgICAgICAgICByZXR1cm4gc2Nocm9fcGl4ZWxfZm9ybWF0X21hcFtpZHhdLmZmX3BpeF9mbXQ7CisgICAgcmV0dXJuIEFWX1BJWF9GTVRfTk9ORTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYnNjaHJvZWRpbmdlcl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisKKyAgICBTY2hyb0RlY29kZXJQYXJhbXMgKnBfc2Nocm9fcGFyYW1zID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICAvKiBGaXJzdCBvZiBhbGwsIGluaXRpYWxpemUgb3VyIHN1cHBvcnRpbmcgbGlicmFyaWVzLiAqLworICAgIHNjaHJvX2luaXQoKTsKKworICAgIHNjaHJvX2RlYnVnX3NldF9sZXZlbChhdmN0eC0+ZGVidWcpOworICAgIHBfc2Nocm9fcGFyYW1zLT5kZWNvZGVyID0gc2Nocm9fZGVjb2Rlcl9uZXcoKTsKKyAgICBzY2hyb19kZWNvZGVyX3NldF9za2lwX3JhdGlvKHBfc2Nocm9fcGFyYW1zLT5kZWNvZGVyLCAxKTsKKworICAgIGlmICghcF9zY2hyb19wYXJhbXMtPmRlY29kZXIpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGRlY29kZWQgZnJhbWUgcXVldWUuICovCisgICAgZmZfc2Nocm9fcXVldWVfaW5pdCgmcF9zY2hyb19wYXJhbXMtPmRlY19mcmFtZV9xdWV1ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxpYnNjaHJvZWRpbmdlcl9kZWNvZGVfZnJhbWVfZnJlZSh2b2lkICpmcmFtZSkKK3sKKyAgICBzY2hyb19mcmFtZV91bnJlZihmcmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGxpYnNjaHJvZWRpbmdlcl9oYW5kbGVfZmlyc3RfYWNjZXNzX3VuaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNjaHJvRGVjb2RlclBhcmFtcyAqcF9zY2hyb19wYXJhbXMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFNjaHJvRGVjb2RlciAqZGVjb2RlciA9IHBfc2Nocm9fcGFyYW1zLT5kZWNvZGVyOworCisgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdCA9IHNjaHJvX2RlY29kZXJfZ2V0X3ZpZGVvX2Zvcm1hdChkZWNvZGVyKTsKKworICAgIC8qIFRlbGwgRkZtcGVnIGFib3V0IHNlcXVlbmNlIGRldGFpbHMuICovCisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUocF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+aGVpZ2h0LCAwLCBhdmN0eCkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBkaW1lbnNpb25zICglZHglZClcbiIsCisgICAgICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT53aWR0aCwgcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+aGVpZ2h0KTsKKyAgICAgICAgYXZjdHgtPmhlaWdodCA9IGF2Y3R4LT53aWR0aCA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXZjdHgtPmhlaWdodCAgPSBwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT5oZWlnaHQ7CisgICAgYXZjdHgtPndpZHRoICAgPSBwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT53aWR0aDsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IGdldF9jaHJvbWFfZm9ybWF0KHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmNocm9tYV9mb3JtYXQpOworCisgICAgaWYgKGZmX2dldF9zY2hyb19mcmFtZV9mb3JtYXQocF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+Y2hyb21hX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9zY2hyb19wYXJhbXMtPmZyYW1lX2Zvcm1hdCkgPT0gLTEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVGhpcyBjb2RlYyBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBwbGFuYXIgWVVWIDQ6MjowLCA0OjI6MiAiCisgICAgICAgICAgICAgICAiYW5kIDQ6NDo0IGZvcm1hdHMuXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF2Y3R4LT5mcmFtZXJhdGUubnVtID0gcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+ZnJhbWVfcmF0ZV9udW1lcmF0b3I7CisgICAgYXZjdHgtPmZyYW1lcmF0ZS5kZW4gPSBwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT5mcmFtZV9yYXRlX2Rlbm9taW5hdG9yOworfQorCitzdGF0aWMgaW50IGxpYnNjaHJvZWRpbmdlcl9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBpbnQ2NF90IHB0cyAgPSBhdnBrdC0+cHRzOworICAgIFNjaHJvVGFnICp0YWc7CisKKyAgICBTY2hyb0RlY29kZXJQYXJhbXMgKnBfc2Nocm9fcGFyYW1zID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBTY2hyb0RlY29kZXIgKmRlY29kZXIgPSBwX3NjaHJvX3BhcmFtcy0+ZGVjb2RlcjsKKyAgICBTY2hyb0J1ZmZlciAqZW5jX2J1ZjsKKyAgICBTY2hyb0ZyYW1lKiBmcmFtZTsKKyAgICBBVkZyYW1lICphdmZyYW1lID0gZGF0YTsKKyAgICBpbnQgc3RhdGU7CisgICAgaW50IGdvID0gMTsKKyAgICBpbnQgb3V0ZXIgPSAxOworICAgIFNjaHJvUGFyc2VVbml0Q29udGV4dCBwYXJzZV9jdHg7CisgICAgTGliU2Nocm9GcmFtZUNvbnRleHQgKmZyYW1ld2l0aHB0cyA9IE5VTEw7CisKKyAgICAqZ290X2ZyYW1lID0gMDsKKworICAgIHBhcnNlX2NvbnRleHRfaW5pdCgmcGFyc2VfY3R4LCBidWYsIGJ1Zl9zaXplKTsKKyAgICBpZiAoIWJ1Zl9zaXplKSB7CisgICAgICAgIGlmICghcF9zY2hyb19wYXJhbXMtPmVvc19zaWduYWxsZWQpIHsKKyAgICAgICAgICAgIHN0YXRlID0gc2Nocm9fZGVjb2Rlcl9wdXNoX2VuZF9vZl9zdHJlYW0oZGVjb2Rlcik7CisgICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZW9zX3NpZ25hbGxlZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBMb29wIHRocm91Z2ggYWxsIHRoZSBpbmRpdmlkdWFsIHBhcnNlIHVuaXRzIGluIHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICBkbyB7CisgICAgICAgIGlmICgoZW5jX2J1ZiA9IGZpbmRfbmV4dF9wYXJzZV91bml0KCZwYXJzZV9jdHgpKSkgeworICAgICAgICAgICAgLyogU2V0IFNjaHJvdGFnIHdpdGggdGhlIHB0cyB0byBiZSByZWNvdmVyZWQgYWZ0ZXIgZGVjb2RpbmcqLworICAgICAgICAgICAgZW5jX2J1Zi0+dGFnID0gc2Nocm9fdGFnX25ldyhhdl9tYWxsb2Moc2l6ZW9mKGludDY0X3QpKSwgYXZfZnJlZSk7CisgICAgICAgICAgICBpZiAoIWVuY19idWYtPnRhZy0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBTY2hyb1RhZ1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFWX1dOKDY0LCBlbmNfYnVmLT50YWctPnZhbHVlLCBwdHMpOworICAgICAgICAgICAgLyogUHVzaCBidWZmZXIgaW50byBkZWNvZGVyLiAqLworICAgICAgICAgICAgaWYgKFNDSFJPX1BBUlNFX0NPREVfSVNfUElDVFVSRShlbmNfYnVmLT5kYXRhWzRdKSAmJgorICAgICAgICAgICAgICAgIFNDSFJPX1BBUlNFX0NPREVfTlVNX1JFRlMoZW5jX2J1Zi0+ZGF0YVs0XSkgPiAwKQorICAgICAgICAgICAgICAgIGF2Y3R4LT5oYXNfYl9mcmFtZXMgPSAxOworICAgICAgICAgICAgc3RhdGUgPSBzY2hyb19kZWNvZGVyX3B1c2goZGVjb2RlciwgZW5jX2J1Zik7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU0NIUk9fREVDT0RFUl9GSVJTVF9BQ0NFU1NfVU5JVCkKKyAgICAgICAgICAgICAgICBsaWJzY2hyb2VkaW5nZXJfaGFuZGxlX2ZpcnN0X2FjY2Vzc191bml0KGF2Y3R4KTsKKyAgICAgICAgICAgIGdvID0gMTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBvdXRlciA9IDA7CisKKyAgICAgICAgd2hpbGUgKGdvKSB7CisgICAgICAgICAgICAvKiBQYXJzZSBkYXRhIGFuZCBwcm9jZXNzIHJlc3VsdC4gKi8KKyAgICAgICAgICAgIHN0YXRlID0gc2Nocm9fZGVjb2Rlcl93YWl0KGRlY29kZXIpOworICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBTQ0hST19ERUNPREVSX0ZJUlNUX0FDQ0VTU19VTklUOgorICAgICAgICAgICAgICAgIGxpYnNjaHJvZWRpbmdlcl9oYW5kbGVfZmlyc3RfYWNjZXNzX3VuaXQoYXZjdHgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNDSFJPX0RFQ09ERVJfTkVFRF9CSVRTOgorICAgICAgICAgICAgICAgIC8qIE5lZWQgbW9yZSBpbnB1dCBkYXRhIC0gc3RvcCBpdGVyYXRpbmcgb3ZlciB3aGF0IHdlIGhhdmUuICovCisgICAgICAgICAgICAgICAgZ28gPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNDSFJPX0RFQ09ERVJfTkVFRF9GUkFNRToKKyAgICAgICAgICAgICAgICAvKiBEZWNvZGVyIG5lZWRzIGEgZnJhbWUgLSBjcmVhdGUgb25lIGFuZCBwdXNoIGl0IGluLiAqLworICAgICAgICAgICAgICAgIGZyYW1lID0gZmZfY3JlYXRlX3NjaHJvX2ZyYW1lKGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5mcmFtZV9mb3JtYXQpOworICAgICAgICAgICAgICAgIHNjaHJvX2RlY29kZXJfYWRkX291dHB1dF9waWN0dXJlKGRlY29kZXIsIGZyYW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTQ0hST19ERUNPREVSX09LOgorICAgICAgICAgICAgICAgIC8qIFB1bGwgYSBmcmFtZSBvdXQgb2YgdGhlIGRlY29kZXIuICovCisgICAgICAgICAgICAgICAgdGFnICAgPSBzY2hyb19kZWNvZGVyX2dldF9waWN0dXJlX3RhZyhkZWNvZGVyKTsKKyAgICAgICAgICAgICAgICBmcmFtZSA9IHNjaHJvX2RlY29kZXJfcHVsbChkZWNvZGVyKTsKKworICAgICAgICAgICAgICAgIGlmIChmcmFtZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBBZGQgcmVsYXRpb24gYmV0d2VlbiBzY2hyb2ZyYW1lIGFuZCBwdHMuICovCisgICAgICAgICAgICAgICAgICAgIGZyYW1ld2l0aHB0cyA9IGF2X21hbGxvYyhzaXplb2YoTGliU2Nocm9GcmFtZUNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmcmFtZXdpdGhwdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGFsbG9jYXRlIEZyYW1lV2l0aFB0c1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyYW1ld2l0aHB0cy0+ZnJhbWUgPSBmcmFtZTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWV3aXRocHRzLT5wdHMgICA9IEFWX1JONjQodGFnLT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGZmX3NjaHJvX3F1ZXVlX3B1c2hfYmFjaygmcF9zY2hyb19wYXJhbXMtPmRlY19mcmFtZV9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1ld2l0aHB0cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTQ0hST19ERUNPREVSX0VPUzoKKyAgICAgICAgICAgICAgICBnbyA9IDA7CisgICAgICAgICAgICAgICAgcF9zY2hyb19wYXJhbXMtPmVvc19wdWxsZWQgPSAxOworICAgICAgICAgICAgICAgIHNjaHJvX2RlY29kZXJfcmVzZXQoZGVjb2Rlcik7CisgICAgICAgICAgICAgICAgb3V0ZXIgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNDSFJPX0RFQ09ERVJfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAob3V0ZXIpOworCisgICAgLyogR3JhYiBuZXh0IGZyYW1lIHRvIGJlIHJldHVybmVkIGZyb20gdGhlIHRvcCBvZiB0aGUgcXVldWUuICovCisgICAgZnJhbWV3aXRocHRzID0gZmZfc2Nocm9fcXVldWVfcG9wKCZwX3NjaHJvX3BhcmFtcy0+ZGVjX2ZyYW1lX3F1ZXVlKTsKKworICAgIGlmIChmcmFtZXdpdGhwdHMgJiYgZnJhbWV3aXRocHRzLT5mcmFtZSkgeworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgYXZmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgbWVtY3B5KGF2ZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzBdLmRhdGEsCisgICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzBdLmxlbmd0aCk7CisKKyAgICAgICAgbWVtY3B5KGF2ZnJhbWUtPmRhdGFbMV0sCisgICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzFdLmRhdGEsCisgICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzFdLmxlbmd0aCk7CisKKyAgICAgICAgbWVtY3B5KGF2ZnJhbWUtPmRhdGFbMl0sCisgICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzJdLmRhdGEsCisgICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzJdLmxlbmd0aCk7CisKKyAgICAgICAgLyogRmlsbCBmcmFtZSB3aXRoIGN1cnJlbnQgYnVmZmVyIGRhdGEgZnJvbSBTY2hyb2VkaW5nZXIuICovCisgICAgICAgIGF2ZnJhbWUtPnBrdF9wdHMgPSBmcmFtZXdpdGhwdHMtPnB0czsKKyAgICAgICAgYXZmcmFtZS0+bGluZXNpemVbMF0gPSBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzBdLnN0cmlkZTsKKyAgICAgICAgYXZmcmFtZS0+bGluZXNpemVbMV0gPSBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzFdLnN0cmlkZTsKKyAgICAgICAgYXZmcmFtZS0+bGluZXNpemVbMl0gPSBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzJdLnN0cmlkZTsKKworICAgICAgICAqZ290X2ZyYW1lICAgICAgPSAxOworCisgICAgICAgIC8qIE5vdyBmcmVlIHRoZSBmcmFtZSByZXNvdXJjZXMuICovCisgICAgICAgIGxpYnNjaHJvZWRpbmdlcl9kZWNvZGVfZnJhbWVfZnJlZShmcmFtZXdpdGhwdHMtPmZyYW1lKTsKKyAgICAgICAgYXZfZnJlZShmcmFtZXdpdGhwdHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEgICAgICAgPSBOVUxMOworICAgICAgICAqZ290X2ZyYW1lID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTY2hyb0RlY29kZXJQYXJhbXMgKnBfc2Nocm9fcGFyYW1zID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICAvKiBGcmVlIHRoZSBkZWNvZGVyLiAqLworICAgIHNjaHJvX2RlY29kZXJfZnJlZShwX3NjaHJvX3BhcmFtcy0+ZGVjb2Rlcik7CisgICAgYXZfZnJlZXAoJnBfc2Nocm9fcGFyYW1zLT5mb3JtYXQpOworCisgICAgLyogRnJlZSBkYXRhIGluIHRoZSBvdXRwdXQgZnJhbWUgcXVldWUuICovCisgICAgZmZfc2Nocm9fcXVldWVfZnJlZSgmcF9zY2hyb19wYXJhbXMtPmRlY19mcmFtZV9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpYnNjaHJvZWRpbmdlcl9kZWNvZGVfZnJhbWVfZnJlZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGlic2Nocm9lZGluZ2VyX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICAvKiBHb3QgYSBzZWVrIHJlcXVlc3QuIEZyZWUgdGhlIGRlY29kZWQgZnJhbWVzIHF1ZXVlIGFuZCB0aGVuIHJlc2V0CisgICAgICogdGhlIGRlY29kZXIgKi8KKyAgICBTY2hyb0RlY29kZXJQYXJhbXMgKnBfc2Nocm9fcGFyYW1zID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIC8qIEZyZWUgZGF0YSBpbiB0aGUgb3V0cHV0IGZyYW1lIHF1ZXVlLiAqLworICAgIGZmX3NjaHJvX3F1ZXVlX2ZyZWUoJnBfc2Nocm9fcGFyYW1zLT5kZWNfZnJhbWVfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2ZyYW1lX2ZyZWUpOworCisgICAgZmZfc2Nocm9fcXVldWVfaW5pdCgmcF9zY2hyb19wYXJhbXMtPmRlY19mcmFtZV9xdWV1ZSk7CisgICAgc2Nocm9fZGVjb2Rlcl9yZXNldChwX3NjaHJvX3BhcmFtcy0+ZGVjb2Rlcik7CisgICAgcF9zY2hyb19wYXJhbXMtPmVvc19wdWxsZWQgPSAwOworICAgIHBfc2Nocm9fcGFyYW1zLT5lb3Nfc2lnbmFsbGVkID0gMDsKK30KKworQVZDb2RlYyBmZl9saWJzY2hyb2VkaW5nZXJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlic2Nocm9lZGluZ2VyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGlic2Nocm9lZGluZ2VyIERpcmFjIDIuMiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9ESVJBQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU2Nocm9EZWNvZGVyUGFyYW1zKSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gbGlic2Nocm9lZGluZ2VyX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9ERUxBWSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBsaWJzY2hyb2VkaW5nZXJfZmx1c2gsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGlic2Nocm9lZGluZ2VyZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJzY2hyb2VkaW5nZXJlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTRmYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlic2Nocm9lZGluZ2VyZW5jLmMKQEAgLTAsMCArMSw0NTQgQEAKKy8qCisgKiBEaXJhYyBlbmNvZGVyIHN1cHBvcnQgdmlhIFNjaHJvZWRpbmdlciBsaWJyYXJpZXMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBCQkMsIEFudXJhZGhhIFN1cmFwYXJhanUgPGFzdXJhcGFyYWp1IGF0IGdtYWlsIGRvdCBjb20gPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyogQGZpbGUKKyogRGlyYWMgZW5jb2RlciBzdXBwb3J0IHZpYSBsaWJzY2hyb2VkaW5nZXItMS4wIGxpYnJhcmllcy4gTW9yZSBkZXRhaWxzIGFib3V0CisqIHRoZSBTY2hyb2VkaW5nZXIgcHJvamVjdCBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3d3dy5kaXJhY3ZpZGVvLm9yZy8uCisqIFRoZSBsaWJyYXJ5IGltcGxlbWVudHMgRGlyYWMgU3BlY2lmaWNhdGlvbiBWZXJzaW9uIDIuMgorKiAoaHR0cDovL2RpcmFjLnNvdXJjZWZvcmdlLm5ldC9zcGVjaWZpY2F0aW9uLmh0bWwpLgorKi8KKworI2luY2x1ZGUgPHNjaHJvZWRpbmdlci9zY2hyby5oPgorI2luY2x1ZGUgPHNjaHJvZWRpbmdlci9zY2hyb2RlYnVnLmg+CisjaW5jbHVkZSA8c2Nocm9lZGluZ2VyL3NjaHJvdmlkZW9mb3JtYXQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGlic2Nocm9lZGluZ2VyLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorCisKKy8qKiBsaWJzY2hyb2VkaW5nZXIgZW5jb2RlciBwcml2YXRlIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IFNjaHJvRW5jb2RlclBhcmFtcyB7CisgICAgLyoqIFNjaHJvZWRpbmdlciB2aWRlbyBmb3JtYXQgKi8KKyAgICBTY2hyb1ZpZGVvRm9ybWF0ICpmb3JtYXQ7CisKKyAgICAvKiogU2Nocm9lZGluZ2VyIGZyYW1lIGZvcm1hdCAqLworICAgIFNjaHJvRnJhbWVGb3JtYXQgZnJhbWVfZm9ybWF0OworCisgICAgLyoqIGZyYW1lIHNpemUgKi8KKyAgICBpbnQgZnJhbWVfc2l6ZTsKKworICAgIC8qKiBTY2hyb2VkaW5nZXIgZW5jb2RlciBoYW5kbGUqLworICAgIFNjaHJvRW5jb2RlciogZW5jb2RlcjsKKworICAgIC8qKiBidWZmZXIgdG8gc3RvcmUgZW5jb2RlciBvdXRwdXQgYmVmb3JlIHdyaXRpbmcgaXQgdG8gdGhlIGZyYW1lIHF1ZXVlKi8KKyAgICB1bnNpZ25lZCBjaGFyICplbmNfYnVmOworCisgICAgLyoqIFNpemUgb2YgZW5jb2RlciBidWZmZXIqLworICAgIGludCBlbmNfYnVmX3NpemU7CisKKyAgICAvKiogcXVldWUgc3RvcmluZyBlbmNvZGVkIGZyYW1lcyAqLworICAgIEZGU2Nocm9RdWV1ZSBlbmNfZnJhbWVfcXVldWU7CisKKyAgICAvKiogZW5kIG9mIHNlcXVlbmNlIHNpZ25hbGxlZCAqLworICAgIGludCBlb3Nfc2lnbmFsbGVkOworCisgICAgLyoqIGVuZCBvZiBzZXF1ZW5jZSBwdWxsZWQgKi8KKyAgICBpbnQgZW9zX3B1bGxlZDsKKworICAgIC8qIGNvdW50ZXIgZm9yIGZyYW1lcyBzdWJtaXR0ZWQgdG8gZW5jb2RlciwgdXNlZCBhcyBkdHMgKi8KKyAgICBpbnQ2NF90IGR0czsKK30gU2Nocm9FbmNvZGVyUGFyYW1zOworCisvKioKKyogV29ya3Mgb3V0IFNjaHJvLWNvbXBhdGlibGUgY2hyb21hIGZvcm1hdC4KKyovCitzdGF0aWMgaW50IHNldF9jaHJvbWFfZm9ybWF0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgbnVtX2Zvcm1hdHMgPSBzaXplb2Yoc2Nocm9fcGl4ZWxfZm9ybWF0X21hcCkgLworICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY2hyb19waXhlbF9mb3JtYXRfbWFwWzBdKTsKKyAgICBpbnQgaWR4OworCisgICAgU2Nocm9FbmNvZGVyUGFyYW1zICpwX3NjaHJvX3BhcmFtcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9mb3JtYXRzOyArK2lkeCkgeworICAgICAgICBpZiAoc2Nocm9fcGl4ZWxfZm9ybWF0X21hcFtpZHhdLmZmX3BpeF9mbXQgPT0gYXZjdHgtPnBpeF9mbXQpIHsKKyAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmNocm9tYV9mb3JtYXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXBbaWR4XS5zY2hyb19waXhfZm10OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgIlRoaXMgY29kZWMgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgcGxhbmFyIFlVViA0OjI6MCwgNDoyOjIiCisgICAgICAgICAgICIgYW5kIDQ6NDo0IGZvcm1hdHMuXG4iKTsKKworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYnNjaHJvZWRpbmdlcl9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU2Nocm9FbmNvZGVyUGFyYW1zICpwX3NjaHJvX3BhcmFtcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgU2Nocm9WaWRlb0Zvcm1hdEVudW0gcHJlc2V0OworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyaWVzIHRoYXQgbGlic2Nocm9lZGluZ2VyIGRlcGVuZHMgb24uICovCisgICAgc2Nocm9faW5pdCgpOworCisgICAgLyogQ3JlYXRlIGFuIGVuY29kZXIgb2JqZWN0LiAqLworICAgIHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyID0gc2Nocm9fZW5jb2Rlcl9uZXcoKTsKKworICAgIGlmICghcF9zY2hyb19wYXJhbXMtPmVuY29kZXIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5yZWNvdmVyYWJsZSBFcnJvcjogc2Nocm9fZW5jb2Rlcl9uZXcgZmFpbGVkLiAiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIGZvcm1hdC4gKi8KKyAgICBwcmVzZXQgPSBmZl9nZXRfc2Nocm9fdmlkZW9fZm9ybWF0X3ByZXNldChhdmN0eCk7CisgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgIHNjaHJvX2VuY29kZXJfZ2V0X3ZpZGVvX2Zvcm1hdChwX3NjaHJvX3BhcmFtcy0+ZW5jb2Rlcik7CisgICAgc2Nocm9fdmlkZW9fZm9ybWF0X3NldF9zdGRfdmlkZW9fZm9ybWF0KHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQsIHByZXNldCk7CisgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+d2lkdGggID0gYXZjdHgtPndpZHRoOworICAgIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICBpZiAoc2V0X2Nocm9tYV9mb3JtYXQoYXZjdHgpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9PSBBVkNPTF9QUklfQlQ3MDkpIHsKKyAgICAgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+Y29sb3VyX3ByaW1hcmllcyA9IFNDSFJPX0NPTE9VUl9QUklNQVJZX0hEVFY7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29sb3JfcHJpbWFyaWVzID09IEFWQ09MX1BSSV9CVDQ3MEJHKSB7CisgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmNvbG91cl9wcmltYXJpZXMgPSBTQ0hST19DT0xPVVJfUFJJTUFSWV9TRFRWXzYyNTsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgPT0gQVZDT0xfUFJJX1NNUFRFMTcwTSkgeworICAgICAgICBwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT5jb2xvdXJfcHJpbWFyaWVzID0gU0NIUk9fQ09MT1VSX1BSSU1BUllfU0RUVl81MjU7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19CVDcwOSkgeworICAgICAgICBwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT5jb2xvdXJfbWF0cml4ID0gU0NIUk9fQ09MT1VSX01BVFJJWF9IRFRWOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvbG9yc3BhY2UgPT0gQVZDT0xfU1BDX0JUNDcwQkcpIHsKKyAgICAgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+Y29sb3VyX21hdHJpeCA9IFNDSFJPX0NPTE9VUl9NQVRSSVhfU0RUVjsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNvbG9yX3RyYyA9PSBBVkNPTF9UUkNfQlQ3MDkpIHsKKyAgICAgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+dHJhbnNmZXJfZnVuY3Rpb24gPSBTQ0hST19UUkFOU0ZFUl9DSEFSX1RWX0dBTU1BOworICAgIH0KKworICAgIGlmIChmZl9nZXRfc2Nocm9fZnJhbWVfZm9ybWF0KHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmNocm9tYV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfc2Nocm9fcGFyYW1zLT5mcmFtZV9mb3JtYXQpID09IC0xKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoaXMgY29kZWMgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgcGxhbmFyIFlVViA0OjI6MCwgNDoyOjIiCisgICAgICAgICAgICAgICAiIGFuZCA0OjQ6NCBmb3JtYXRzLlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT5mcmFtZV9yYXRlX251bWVyYXRvciAgID0gYXZjdHgtPnRpbWVfYmFzZS5kZW47CisgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+ZnJhbWVfcmF0ZV9kZW5vbWluYXRvciA9IGF2Y3R4LT50aW1lX2Jhc2UubnVtOworCisgICAgcF9zY2hyb19wYXJhbXMtPmZyYW1lX3NpemUgPSBhdnBpY3R1cmVfZ2V0X3NpemUoYXZjdHgtPnBpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQpOworCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWF2Y3R4LT5jb2RlZF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmICghYXZjdHgtPmdvcF9zaXplKSB7CisgICAgICAgIHNjaHJvX2VuY29kZXJfc2V0dGluZ19zZXRfZG91YmxlKHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29wX3N0cnVjdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSFJPX0VOQ09ERVJfR09QX0lOVFJBX09OTFkpOworCisgICAgICAgIGlmIChhdmN0eC0+Y29kZXJfdHlwZSA9PSBGRl9DT0RFUl9UWVBFX1ZMQykKKyAgICAgICAgICAgIHNjaHJvX2VuY29kZXJfc2V0dGluZ19zZXRfZG91YmxlKHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuYWJsZV9ub2FyaXRoIiwgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2Nocm9fZW5jb2Rlcl9zZXR0aW5nX3NldF9kb3VibGUocF9zY2hyb19wYXJhbXMtPmVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdV9kaXN0YW5jZSIsIGF2Y3R4LT5nb3Bfc2l6ZSk7CisgICAgICAgIGF2Y3R4LT5oYXNfYl9mcmFtZXMgPSAxOworICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZHRzID0gLTE7CisgICAgfQorCisgICAgLyogRklYTUUgLSBOZWVkIHRvIGhhbmRsZSBTQ0hST19FTkNPREVSX1JBVEVfQ09OVFJPTF9MT1dfREVMQVkuICovCisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUVNDQUxFKSB7CisgICAgICAgIGlmICghYXZjdHgtPmdsb2JhbF9xdWFsaXR5KSB7CisgICAgICAgICAgICAvKiBsb3NzbGVzcyBjb2RpbmcgKi8KKyAgICAgICAgICAgIHNjaHJvX2VuY29kZXJfc2V0dGluZ19zZXRfZG91YmxlKHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhdGVfY29udHJvbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hST19FTkNPREVSX1JBVEVfQ09OVFJPTF9MT1NTTEVTUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcXVhbGl0eTsKKyAgICAgICAgICAgIHNjaHJvX2VuY29kZXJfc2V0dGluZ19zZXRfZG91YmxlKHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhdGVfY29udHJvbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hST19FTkNPREVSX1JBVEVfQ09OVFJPTF9DT05TVEFOVF9RVUFMSVRZKTsKKworICAgICAgICAgICAgcXVhbGl0eSA9IGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSAvIEZGX1FQMkxBTUJEQTsKKyAgICAgICAgICAgIGlmIChxdWFsaXR5ID4gMTApCisgICAgICAgICAgICAgICAgcXVhbGl0eSA9IDEwOworICAgICAgICAgICAgc2Nocm9fZW5jb2Rlcl9zZXR0aW5nX3NldF9kb3VibGUocF9zY2hyb19wYXJhbXMtPmVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVhbGl0eSIsIHF1YWxpdHkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2Nocm9fZW5jb2Rlcl9zZXR0aW5nX3NldF9kb3VibGUocF9zY2hyb19wYXJhbXMtPmVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYXRlX2NvbnRyb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hST19FTkNPREVSX1JBVEVfQ09OVFJPTF9DT05TVEFOVF9CSVRSQVRFKTsKKworICAgICAgICBzY2hyb19lbmNvZGVyX3NldHRpbmdfc2V0X2RvdWJsZShwX3NjaHJvX3BhcmFtcy0+ZW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJpdHJhdGUiLCBhdmN0eC0+Yml0X3JhdGUpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0lOVEVSTEFDRURfTUUpCisgICAgICAgIC8qIEFsbCBtYXRlcmlhbCBjYW4gYmUgY29kZWQgYXMgaW50ZXJsYWNlZCBvciBwcm9ncmVzc2l2ZQorICAgICAgICAgICBpcnJlc3BlY3RpdmUgb2YgdGhlIHR5cGUgb2Ygc291cmNlIG1hdGVyaWFsLiAqLworICAgICAgICBzY2hyb19lbmNvZGVyX3NldHRpbmdfc2V0X2RvdWJsZShwX3NjaHJvX3BhcmFtcy0+ZW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVybGFjZWRfY29kaW5nIiwgMSk7CisKKyAgICBzY2hyb19lbmNvZGVyX3NldHRpbmdfc2V0X2RvdWJsZShwX3NjaHJvX3BhcmFtcy0+ZW5jb2RlciwgIm9wZW5fZ29wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQ0xPU0VEX0dPUCkpOworCisgICAgLyogRklYTUU6IFNpZ25hbCByYW5nZSBoYXJkY29kZWQgdG8gOC1iaXQgZGF0YSB1bnRpbCBib3RoIGxpYnNjaHJvZWRpbmdlcgorICAgICAqIGFuZCBsaWJkaXJhYyBzdXBwb3J0IG90aGVyIGJpdC1kZXB0aCBkYXRhLiAqLworICAgIHNjaHJvX3ZpZGVvX2Zvcm1hdF9zZXRfc3RkX3NpZ25hbF9yYW5nZShwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hST19TSUdOQUxfUkFOR0VfOEJJVF9WSURFTyk7CisKKyAgICAvKiBTZXQgdGhlIGVuY29kZXIgZm9ybWF0LiAqLworICAgIHNjaHJvX2VuY29kZXJfc2V0X3ZpZGVvX2Zvcm1hdChwX3NjaHJvX3BhcmFtcy0+ZW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdCk7CisKKyAgICAvKiBTZXQgdGhlIGRlYnVnIGxldmVsLiAqLworICAgIHNjaHJvX2RlYnVnX3NldF9sZXZlbChhdmN0eC0+ZGVidWcpOworCisgICAgc2Nocm9fZW5jb2Rlcl9zdGFydChwX3NjaHJvX3BhcmFtcy0+ZW5jb2Rlcik7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBlbmNvZGVkIGZyYW1lIHF1ZXVlLiAqLworICAgIGZmX3NjaHJvX3F1ZXVlX2luaXQoJnBfc2Nocm9fcGFyYW1zLT5lbmNfZnJhbWVfcXVldWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgU2Nocm9GcmFtZSAqbGlic2Nocm9lZGluZ2VyX2ZyYW1lX2Zyb21fZGF0YShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBTY2hyb0VuY29kZXJQYXJhbXMgKnBfc2Nocm9fcGFyYW1zID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBTY2hyb0ZyYW1lICppbl9mcmFtZTsKKyAgICAvKiBJbnB1dCBsaW5lIHNpemUgbWF5IGRpZmZlciBmcm9tIHdoYXQgdGhlIGNvZGVjIHN1cHBvcnRzLiBFc3BlY2lhbGx5CisgICAgICogd2hlbiB0cmFuc2NvZGluZyBmcm9tIG9uZSBmb3JtYXQgdG8gYW5vdGhlci4gU28gdXNlIGF2cGljdHVyZV9sYXlvdXQKKyAgICAgKiB0byBjb3B5IHRoZSBmcmFtZS4gKi8KKyAgICBpbl9mcmFtZSA9IGZmX2NyZWF0ZV9zY2hyb19mcmFtZShhdmN0eCwgcF9zY2hyb19wYXJhbXMtPmZyYW1lX2Zvcm1hdCk7CisKKyAgICBpZiAoaW5fZnJhbWUpCisgICAgICAgIGF2cGljdHVyZV9sYXlvdXQoKGNvbnN0IEFWUGljdHVyZSAqKWZyYW1lLCBhdmN0eC0+cGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9mcmFtZS0+Y29tcG9uZW50c1swXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZnJhbWVfc2l6ZSk7CisKKyAgICByZXR1cm4gaW5fZnJhbWU7Cit9CisKK3N0YXRpYyB2b2lkIGxpYnNjaHJvZWRpbmdlcl9mcmVlX2ZyYW1lKHZvaWQgKmRhdGEpCit7CisgICAgRkZTY2hyb0VuY29kZWRGcmFtZSAqZW5jX2ZyYW1lID0gZGF0YTsKKworICAgIGF2X2ZyZWVwKCZlbmNfZnJhbWUtPnBfZW5jYnVmKTsKKyAgICBhdl9mcmVlKGVuY19mcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgbGlic2Nocm9lZGluZ2VyX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBpbnQgZW5jX3NpemUgPSAwOworICAgIFNjaHJvRW5jb2RlclBhcmFtcyAqcF9zY2hyb19wYXJhbXMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFNjaHJvRW5jb2RlciAqZW5jb2RlciA9IHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyOworICAgIHN0cnVjdCBGRlNjaHJvRW5jb2RlZEZyYW1lICpwX2ZyYW1lX291dHB1dCA9IE5VTEw7CisgICAgaW50IGdvID0gMTsKKyAgICBTY2hyb0J1ZmZlciAqZW5jX2J1ZjsKKyAgICBpbnQgcHJlc2VudGF0aW9uX2ZyYW1lOworICAgIGludCBwYXJzZV9jb2RlOworICAgIGludCBsYXN0X2ZyYW1lX2luX3NlcXVlbmNlID0gMDsKKyAgICBpbnQgcGt0X3NpemUsIHJldDsKKworICAgIGlmICghZnJhbWUpIHsKKyAgICAgICAgLyogUHVzaCBlbmQgb2Ygc2VxdWVuY2UgaWYgbm90IGFscmVhZHkgc2lnbmFsbGVkLiAqLworICAgICAgICBpZiAoIXBfc2Nocm9fcGFyYW1zLT5lb3Nfc2lnbmFsbGVkKSB7CisgICAgICAgICAgICBzY2hyb19lbmNvZGVyX2VuZF9vZl9zdHJlYW0oZW5jb2Rlcik7CisgICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZW9zX3NpZ25hbGxlZCA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBBbGxvY2F0ZSBmcmFtZSBkYXRhIHRvIHNjaHJvIGlucHV0IGJ1ZmZlci4gKi8KKyAgICAgICAgU2Nocm9GcmFtZSAqaW5fZnJhbWUgPSBsaWJzY2hyb2VkaW5nZXJfZnJhbWVfZnJvbV9kYXRhKGF2Y3R4LCBmcmFtZSk7CisgICAgICAgIC8qIExvYWQgbmV4dCBmcmFtZS4gKi8KKyAgICAgICAgc2Nocm9fZW5jb2Rlcl9wdXNoX2ZyYW1lKGVuY29kZXIsIGluX2ZyYW1lKTsKKyAgICB9CisKKyAgICBpZiAocF9zY2hyb19wYXJhbXMtPmVvc19wdWxsZWQpCisgICAgICAgIGdvID0gMDsKKworICAgIC8qIE5vdyBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgb3V0cHV0IGZyb20gdGhlIGVuY29kZXIuICovCisgICAgd2hpbGUgKGdvKSB7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIFNjaHJvU3RhdGVFbnVtIHN0YXRlOworICAgICAgICBzdGF0ZSA9IHNjaHJvX2VuY29kZXJfd2FpdChlbmNvZGVyKTsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIFNDSFJPX1NUQVRFX0hBVkVfQlVGRkVSOgorICAgICAgICBjYXNlIFNDSFJPX1NUQVRFX0VORF9PRl9TVFJFQU06CisgICAgICAgICAgICBlbmNfYnVmID0gc2Nocm9fZW5jb2Rlcl9wdWxsKGVuY29kZXIsICZwcmVzZW50YXRpb25fZnJhbWUpOworICAgICAgICAgICAgaWYgKGVuY19idWYtPmxlbmd0aCA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICAgICAgICAgIHBhcnNlX2NvZGUgPSBlbmNfYnVmLT5kYXRhWzRdOworCisgICAgICAgICAgICAvKiBBbGwgbm9uLWZyYW1lIGRhdGEgaXMgcHJlcGVuZGVkIHRvIGFjdHVhbCBmcmFtZSBkYXRhIHRvCisgICAgICAgICAgICAgKiBiZSBhYmxlIHRvIHNldCB0aGUgcHRzIGNvcnJlY3RseS4gU28gd2UgZG9uJ3Qgd3JpdGUgZGF0YQorICAgICAgICAgICAgICogdG8gdGhlIGZyYW1lIG91dHB1dCBxdWV1ZSB1bnRpbCB3ZSBhY3R1YWxseSBoYXZlIGEgZnJhbWUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmcF9zY2hyb19wYXJhbXMtPmVuY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5lbmNfYnVmX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNfYnVmLT5sZW5ndGgpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1jcHkocF9zY2hyb19wYXJhbXMtPmVuY19idWYgKyBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgIGVuY19idWYtPmRhdGEsIGVuY19idWYtPmxlbmd0aCk7CisgICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplICs9IGVuY19idWYtPmxlbmd0aDsKKworCisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU0NIUk9fU1RBVEVfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5lb3NfcHVsbGVkID0gMTsKKyAgICAgICAgICAgICAgICBnbyA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghU0NIUk9fUEFSU0VfQ09ERV9JU19QSUNUVVJFKHBhcnNlX2NvZGUpKSB7CisgICAgICAgICAgICAgICAgc2Nocm9fYnVmZmVyX3VucmVmKGVuY19idWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDcmVhdGUgb3V0cHV0IGZyYW1lLiAqLworICAgICAgICAgICAgcF9mcmFtZV9vdXRwdXQgPSBhdl9tYWxsb2N6KHNpemVvZihGRlNjaHJvRW5jb2RlZEZyYW1lKSk7CisgICAgICAgICAgICAvKiBTZXQgb3V0cHV0IGRhdGEuICovCisgICAgICAgICAgICBwX2ZyYW1lX291dHB1dC0+c2l6ZSAgICAgPSBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplOworICAgICAgICAgICAgcF9mcmFtZV9vdXRwdXQtPnBfZW5jYnVmID0gcF9zY2hyb19wYXJhbXMtPmVuY19idWY7CisgICAgICAgICAgICBpZiAoU0NIUk9fUEFSU0VfQ09ERV9JU19JTlRSQShwYXJzZV9jb2RlKSAmJgorICAgICAgICAgICAgICAgIFNDSFJPX1BBUlNFX0NPREVfSVNfUkVGRVJFTkNFKHBhcnNlX2NvZGUpKQorICAgICAgICAgICAgICAgIHBfZnJhbWVfb3V0cHV0LT5rZXlfZnJhbWUgPSAxOworCisgICAgICAgICAgICAvKiBQYXJzZSB0aGUgY29kZWQgZnJhbWUgbnVtYmVyIGZyb20gdGhlIGJpdHN0cmVhbS4gQnl0ZXMgMTQKKyAgICAgICAgICAgICAqIHRocm91Z2ggMTcgcmVwcmVzZXNlbnQgdGhlIGZyYW1lIG51bWJlci4gKi8KKyAgICAgICAgICAgIHBfZnJhbWVfb3V0cHV0LT5mcmFtZV9udW0gPSBBVl9SQjMyKGVuY19idWYtPmRhdGEgKyAxMyk7CisKKyAgICAgICAgICAgIGZmX3NjaHJvX3F1ZXVlX3B1c2hfYmFjaygmcF9zY2hyb19wYXJhbXMtPmVuY19mcmFtZV9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2ZyYW1lX291dHB1dCk7CisgICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplID0gMDsKKyAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5lbmNfYnVmICAgICAgPSBOVUxMOworCisgICAgICAgICAgICBzY2hyb19idWZmZXJfdW5yZWYoZW5jX2J1Zik7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0NIUk9fU1RBVEVfTkVFRF9GUkFNRToKKyAgICAgICAgICAgIGdvID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0NIUk9fU1RBVEVfQUdBSU46CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIFNjaHJvIEVuY29kZXIgc3RhdGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ29weSAnbmV4dCcgZnJhbWUgaW4gcXVldWUuICovCisKKyAgICBpZiAocF9zY2hyb19wYXJhbXMtPmVuY19mcmFtZV9xdWV1ZS5zaXplID09IDEgJiYKKyAgICAgICAgcF9zY2hyb19wYXJhbXMtPmVvc19wdWxsZWQpCisgICAgICAgIGxhc3RfZnJhbWVfaW5fc2VxdWVuY2UgPSAxOworCisgICAgcF9mcmFtZV9vdXRwdXQgPSBmZl9zY2hyb19xdWV1ZV9wb3AoJnBfc2Nocm9fcGFyYW1zLT5lbmNfZnJhbWVfcXVldWUpOworCisgICAgaWYgKCFwX2ZyYW1lX291dHB1dCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBwa3Rfc2l6ZSA9IHBfZnJhbWVfb3V0cHV0LT5zaXplOworICAgIGlmIChsYXN0X2ZyYW1lX2luX3NlcXVlbmNlICYmIHBfc2Nocm9fcGFyYW1zLT5lbmNfYnVmX3NpemUgPiAwKQorICAgICAgICBwa3Rfc2l6ZSArPSBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplOworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBwa3Rfc2l6ZSkpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIG1lbWNweShwa3QtPmRhdGEsIHBfZnJhbWVfb3V0cHV0LT5wX2VuY2J1ZiwgcF9mcmFtZV9vdXRwdXQtPnNpemUpOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gcF9mcmFtZV9vdXRwdXQtPmtleV9mcmFtZTsKKyAgICAvKiBVc2UgdGhlIGZyYW1lIG51bWJlciBvZiB0aGUgZW5jb2RlZCBmcmFtZSBhcyB0aGUgcHRzLiBJdCBpcyBPSyB0bworICAgICAqIGRvIHNvIHNpbmNlIERpcmFjIGlzIGEgY29uc3RhbnQgZnJhbWUgcmF0ZSBjb2RlYy4gSXQgZXhwZWN0cyBpbnB1dAorICAgICAqIHRvIGJlIG9mIGNvbnN0YW50IGZyYW1lIHJhdGUuICovCisgICAgcGt0LT5wdHMgPQorICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cHRzID0gcF9mcmFtZV9vdXRwdXQtPmZyYW1lX251bTsKKyAgICBwa3QtPmR0cyA9IHBfc2Nocm9fcGFyYW1zLT5kdHMrKzsKKyAgICBlbmNfc2l6ZSA9IHBfZnJhbWVfb3V0cHV0LT5zaXplOworCisgICAgLyogQXBwZW5kIHRoZSBlbmQgb2Ygc2VxdWVuY2UgaW5mb3JtYXRpb24gdG8gdGhlIGxhc3QgZnJhbWUgaW4gdGhlCisgICAgICogc2VxdWVuY2UuICovCisgICAgaWYgKGxhc3RfZnJhbWVfaW5fc2VxdWVuY2UgJiYgcF9zY2hyb19wYXJhbXMtPmVuY19idWZfc2l6ZSA+IDApIHsKKyAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSArIGVuY19zaXplLCBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1ZiwKKyAgICAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5lbmNfYnVmX3NpemUpOworICAgICAgICBlbmNfc2l6ZSArPSBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplOworICAgICAgICBhdl9mcmVlcCgmcF9zY2hyb19wYXJhbXMtPmVuY19idWYpOworICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAocF9mcmFtZV9vdXRwdXQtPmtleV9mcmFtZSkKKyAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCitlcnJvcjoKKyAgICAvKiBmcmVlIGZyYW1lICovCisgICAgbGlic2Nocm9lZGluZ2VyX2ZyZWVfZnJhbWUocF9mcmFtZV9vdXRwdXQpOworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBsaWJzY2hyb2VkaW5nZXJfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTY2hyb0VuY29kZXJQYXJhbXMgKnBfc2Nocm9fcGFyYW1zID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIC8qIENsb3NlIHRoZSBlbmNvZGVyLiAqLworICAgIHNjaHJvX2VuY29kZXJfZnJlZShwX3NjaHJvX3BhcmFtcy0+ZW5jb2Rlcik7CisKKyAgICAvKiBGcmVlIGRhdGEgaW4gdGhlIG91dHB1dCBmcmFtZSBxdWV1ZS4gKi8KKyAgICBmZl9zY2hyb19xdWV1ZV9mcmVlKCZwX3NjaHJvX3BhcmFtcy0+ZW5jX2ZyYW1lX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgbGlic2Nocm9lZGluZ2VyX2ZyZWVfZnJhbWUpOworCisKKyAgICAvKiBGcmVlIHRoZSBlbmNvZGVyIGJ1ZmZlci4gKi8KKyAgICBpZiAocF9zY2hyb19wYXJhbXMtPmVuY19idWZfc2l6ZSkKKyAgICAgICAgYXZfZnJlZXAoJnBfc2Nocm9fcGFyYW1zLT5lbmNfYnVmKTsKKworICAgIC8qIEZyZWUgdGhlIHZpZGVvIGZvcm1hdCBzdHJ1Y3R1cmUuICovCisgICAgYXZfZnJlZXAoJnBfc2Nocm9fcGFyYW1zLT5mb3JtYXQpOworCisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCisKK0FWQ29kZWMgZmZfbGlic2Nocm9lZGluZ2VyX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYnNjaHJvZWRpbmdlciIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYnNjaHJvZWRpbmdlciBEaXJhYyAyLjIiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRElSQUMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNjaHJvRW5jb2RlclBhcmFtcyksCisgICAgLmluaXQgICAgICAgICAgID0gbGlic2Nocm9lZGluZ2VyX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGxpYnNjaHJvZWRpbmdlcl9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gbGlic2Nocm9lZGluZ2VyX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfREVMQVksCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJzaGluZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlic2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODMzM2JiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlic2hpbmUuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIEludGVyZmFjZSB0byBsaWJzaGluZSBmb3IgbXAzIGVuY29kaW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzaGluZS9sYXllcjMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdWRpb19mcmFtZV9xdWV1ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1wZWdhdWRpby5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RlY2hlYWRlci5oIgorCisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2ICogMjApCisKK3R5cGVkZWYgc3RydWN0IFNISU5FQ29udGV4dCB7CisgICAgc2hpbmVfY29uZmlnX3QgIGNvbmZpZzsKKyAgICBzaGluZV90ICAgICAgICAgc2hpbmU7CisgICAgdWludDhfdCAgICAgICAgIGJ1ZmZlcltCVUZGRVJfU0laRV07CisgICAgaW50ICAgICAgICAgICAgIGJ1ZmZlcl9pbmRleDsKKyAgICBBdWRpb0ZyYW1lUXVldWUgYWZxOworfSBTSElORUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJzaGluZV9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU0hJTkVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPD0gMCB8fCBhdmN0eC0+Y2hhbm5lbHMgPiAyKXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJvbmx5IG1vbm8gb3Igc3RlcmVvIGlzIHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgc2hpbmVfc2V0X2NvbmZpZ19tcGVnX2RlZmF1bHRzKCZzLT5jb25maWcubXBlZyk7CisgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSkKKyAgICAgICAgcy0+Y29uZmlnLm1wZWcuYml0ciA9IGF2Y3R4LT5iaXRfcmF0ZSAvIDEwMDA7CisgICAgcy0+Y29uZmlnLm1wZWcubW9kZSA9IGF2Y3R4LT5jaGFubmVscyA9PSAyID8gU1RFUkVPIDogTU9OTzsKKyAgICBzLT5jb25maWcud2F2ZS5zYW1wbGVyYXRlID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIHMtPmNvbmZpZy53YXZlLmNoYW5uZWxzICAgPSBhdmN0eC0+Y2hhbm5lbHMgPT0gMiA/IFBDTV9TVEVSRU8gOiBQQ01fTU9OTzsKKyAgICBpZiAoc2hpbmVfY2hlY2tfY29uZmlnKHMtPmNvbmZpZy53YXZlLnNhbXBsZXJhdGUsIHMtPmNvbmZpZy5tcGVnLmJpdHIpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgY29uZmlndXJhdGlvblxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHMtPnNoaW5lID0gc2hpbmVfaW5pdGlhbGlzZSgmcy0+Y29uZmlnKTsKKyAgICBpZiAoIXMtPnNoaW5lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gc2hpbmVfc2FtcGxlc19wZXJfcGFzcyhzLT5zaGluZSk7CisgICAgZmZfYWZfcXVldWVfaW5pdChhdmN0eCwgJnMtPmFmcSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGlic2hpbmVfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCit7CisgICAgU0hJTkVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNUEFEZWNvZGVIZWFkZXIgaGRyOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgbG9uZyB3cml0dGVuOworICAgIGludCByZXQsIGxlbjsKKworICAgIGlmIChmcmFtZSkKKyAgICAgICAgZGF0YSA9IHNoaW5lX2VuY29kZV9idWZmZXIocy0+c2hpbmUsIChpbnQxNl90ICoqKWZyYW1lLT5kYXRhLCAmd3JpdHRlbik7CisgICAgZWxzZQorICAgICAgICBkYXRhID0gc2hpbmVfZmx1c2gocy0+c2hpbmUsICZ3cml0dGVuKTsKKyAgICBpZiAod3JpdHRlbiA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAod3JpdHRlbiA+IDApIHsKKyAgICAgICAgaWYgKHMtPmJ1ZmZlcl9pbmRleCArIHdyaXR0ZW4gPiBCVUZGRVJfU0laRSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnRlcm5hbCBidWZmZXIgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocy0+YnVmZmVyICsgcy0+YnVmZmVyX2luZGV4LCBkYXRhLCB3cml0dGVuKTsKKyAgICAgICAgcy0+YnVmZmVyX2luZGV4ICs9IHdyaXR0ZW47CisgICAgfQorICAgIGlmIChmcmFtZSkgeworICAgICAgICBpZiAoKHJldCA9IGZmX2FmX3F1ZXVlX2FkZCgmcy0+YWZxLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKHMtPmJ1ZmZlcl9pbmRleCA8IDQgfHwgIXMtPmFmcS5mcmFtZV9jb3VudCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGF2cHJpdl9tcGVnYXVkaW9fZGVjb2RlX2hlYWRlcigmaGRyLCBBVl9SQjMyKHMtPmJ1ZmZlcikpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZnJlZSBmb3JtYXQgb3V0cHV0IG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbGVuID0gaGRyLmZyYW1lX3NpemU7CisgICAgaWYgKGxlbiA8PSBzLT5idWZmZXJfaW5kZXgpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgbGVuKSkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBtZW1jcHkoYXZwa3QtPmRhdGEsIHMtPmJ1ZmZlciwgbGVuKTsKKyAgICAgICAgcy0+YnVmZmVyX2luZGV4IC09IGxlbjsKKyAgICAgICAgbWVtbW92ZShzLT5idWZmZXIsIHMtPmJ1ZmZlciArIGxlbiwgcy0+YnVmZmVyX2luZGV4KTsKKworICAgICAgICBmZl9hZl9xdWV1ZV9yZW1vdmUoJnMtPmFmcSwgYXZjdHgtPmZyYW1lX3NpemUsICZhdnBrdC0+cHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2cGt0LT5kdXJhdGlvbik7CisKKyAgICAgICAgYXZwa3QtPnNpemUgPSBsZW47CisgICAgICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbGlic2hpbmVfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTSElORUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmZfYWZfcXVldWVfY2xvc2UoJnMtPmFmcSk7CisgICAgc2hpbmVfY2xvc2Uocy0+c2hpbmUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgaW50IGxpYnNoaW5lX3NhbXBsZV9yYXRlc1tdID0geworICAgIDQ0MTAwLCA0ODAwMCwgMzIwMDAsIDAKK307CisKK0FWQ29kZWMgZmZfbGlic2hpbmVfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgID0gImxpYnNoaW5lIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYnNoaW5lIE1QMyAoTVBFRyBhdWRpbyBsYXllciAzKSIpLAorICAgIC50eXBlICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QMywKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKFNISU5FQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgICA9IGxpYnNoaW5lX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICAgICAgICAgPSBsaWJzaGluZV9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgICAgICAgICA9IGxpYnNoaW5lX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5zYW1wbGVfZm10cyAgICAgICAgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLnN1cHBvcnRlZF9zYW1wbGVyYXRlcyA9IGxpYnNoaW5lX3NhbXBsZV9yYXRlcywKKyAgICAuY2hhbm5lbF9sYXlvdXRzICAgICAgID0gKGNvbnN0IHVpbnQ2NF90W10pIHsgQVZfQ0hfTEFZT1VUX01PTk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJzcGVleGRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlic3BlZXhkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY1MmQxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlic3BlZXhkZWMuYwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEYXZpZCBDb25yYWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHNwZWV4L3NwZWV4Lmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXhfaGVhZGVyLmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXhfc3RlcmVvLmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXhfY2FsbGJhY2tzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTcGVleEJpdHMgYml0czsKKyAgICBTcGVleFN0ZXJlb1N0YXRlIHN0ZXJlbzsKKyAgICB2b2lkICpkZWNfc3RhdGU7CisgICAgaW50IGZyYW1lX3NpemU7CisgICAgaW50IHBrdHNpemU7Cit9IExpYlNwZWV4Q29udGV4dDsKKworCitzdGF0aWMgYXZfY29sZCBpbnQgbGlic3BlZXhfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIExpYlNwZWV4Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgU3BlZXhNb2RlICptb2RlOworICAgIFNwZWV4SGVhZGVyICpoZWFkZXIgPSBOVUxMOworICAgIGludCBzcHhfbW9kZTsKKworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhICYmIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSA4MCkgeworICAgICAgICBoZWFkZXIgPSBzcGVleF9wYWNrZXRfdG9faGVhZGVyKGF2Y3R4LT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKCFoZWFkZXIpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBTcGVleCBoZWFkZXJcbiIpOworICAgIH0KKyAgICBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnUycsICdQJywgJ1gnLCAnTicpKSB7CisgICAgICAgIGludCBxdWFsaXR5OworICAgICAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEgfHwgYXZjdHgtPmV4dHJhZGF0YSAmJiBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCA0NykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIG9yIGludmFsaWQgZXh0cmFkYXRhLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIHF1YWxpdHkgPSBhdmN0eC0+ZXh0cmFkYXRhWzM3XTsKKyAgICAgICAgaWYgKHF1YWxpdHkgPiAxMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBxdWFsaXR5IG1vZGUgJWQuXG4iLCBxdWFsaXR5KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPnBrdHNpemUgPSAoKGNvbnN0IGludFtdKXs1LDEwLDE1LDIwLDIwLDI4LDI4LDM4LDM4LDQ2LDYyfSlbcXVhbGl0eV07CisKKyAgICAgICAgc3B4X21vZGUgICAgICAgICAgID0gMDsKKyAgICB9IGVsc2UgaWYgKGhlYWRlcikgeworICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBoZWFkZXItPnJhdGU7CisgICAgICAgIGF2Y3R4LT5jaGFubmVscyAgICA9IGhlYWRlci0+bmJfY2hhbm5lbHM7CisgICAgICAgIHNweF9tb2RlICAgICAgICAgICA9IGhlYWRlci0+bW9kZTsKKyAgICAgICAgc3BlZXhfaGVhZGVyX2ZyZWUoaGVhZGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGF2Y3R4LT5zYW1wbGVfcmF0ZSkgeworICAgICAgICBjYXNlIDgwMDA6ICBzcHhfbW9kZSA9IDA7IGJyZWFrOworICAgICAgICBjYXNlIDE2MDAwOiBzcHhfbW9kZSA9IDE7IGJyZWFrOworICAgICAgICBjYXNlIDMyMDAwOiBzcHhfbW9kZSA9IDI7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogbGlic3BlZXggY2FuIGhhbmRsZSBhbnkgbW9kZSBpZiBpbml0aWFsaXplZCBhcyB1bHRyYS13aWRlYmFuZCAqLworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgc2FtcGxlIHJhdGU6ICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVjb2RpbmcgYXMgMzJrSHogdWx0cmEtd2lkZWJhbmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgc3B4X21vZGUgPSAyOworICAgICAgICB9CisgICAgfQorCisgICAgbW9kZSA9IHNwZWV4X2xpYl9nZXRfbW9kZShzcHhfbW9kZSk7CisgICAgaWYgKCFtb2RlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBTcGVleCBtb2RlICVkIiwgc3B4X21vZGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcy0+ZnJhbWVfc2l6ZSAgICAgID0gIDE2MCA8PCBzcHhfbW9kZTsKKyAgICBpZiAoIWF2Y3R4LT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gODAwMCA8PCBzcHhfbW9kZTsKKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPCAxIHx8IGF2Y3R4LT5jaGFubmVscyA+IDIpIHsKKyAgICAgICAgLyogbGlic3BlZXggY2FuIGhhbmRsZSBtb25vIG9yIHN0ZXJlbyBpZiBpbml0aWFsaXplZCBhcyBzdGVyZW8gKi8KKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNoYW5uZWwgY291bnQ6ICVkLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlY29kaW5nIGFzIHN0ZXJlby5cbiIsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIGF2Y3R4LT5jaGFubmVscyA9IDI7CisgICAgfQorICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGF2Y3R4LT5jaGFubmVscyA9PSAyID8gQVZfQ0hfTEFZT1VUX1NURVJFTyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfTU9OTzsKKworICAgIHNwZWV4X2JpdHNfaW5pdCgmcy0+Yml0cyk7CisgICAgcy0+ZGVjX3N0YXRlID0gc3BlZXhfZGVjb2Rlcl9pbml0KG1vZGUpOworICAgIGlmICghcy0+ZGVjX3N0YXRlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgaW5pdGlhbGl6aW5nIGxpYnNwZWV4IGRlY29kZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPT0gMikgeworICAgICAgICBTcGVleENhbGxiYWNrIGNhbGxiYWNrOworICAgICAgICBjYWxsYmFjay5jYWxsYmFja19pZCA9IFNQRUVYX0lOQkFORF9TVEVSRU87CisgICAgICAgIGNhbGxiYWNrLmZ1bmMgPSBzcGVleF9zdGRfc3RlcmVvX3JlcXVlc3RfaGFuZGxlcjsKKyAgICAgICAgY2FsbGJhY2suZGF0YSA9ICZzLT5zdGVyZW87CisgICAgICAgIHMtPnN0ZXJlbyA9IChTcGVleFN0ZXJlb1N0YXRlKVNQRUVYX1NURVJFT19TVEFURV9JTklUOworICAgICAgICBzcGVleF9kZWNvZGVyX2N0bChzLT5kZWNfc3RhdGUsIFNQRUVYX1NFVF9IQU5ETEVSLCAmY2FsbGJhY2spOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpYnNwZWV4X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBMaWJTcGVleENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lICAgICA9IGRhdGE7CisgICAgaW50MTZfdCAqb3V0cHV0OworICAgIGludCByZXQsIGNvbnN1bWVkID0gMDsKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzE2OworCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IHMtPmZyYW1lX3NpemU7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBvdXRwdXQgPSAoaW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdOworCisgICAgLyogaWYgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhIGxlZnQgZm9yIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBmcmFtZSBvciB0aGUKKyAgICAgICBuZXh0IDUgYml0cyBhcmUgYSB0ZXJtaW5hdG9yIGNvZGUsIHJlc2V0IHRoZSBsaWJzcGVleCBidWZmZXIgdXNpbmcgdGhlCisgICAgICAgY3VycmVudCBwYWNrZXQsIG90aGVyd2lzZSBpZ25vcmUgdGhlIGN1cnJlbnQgcGFja2V0IGFuZCBrZWVwIGRlY29kaW5nCisgICAgICAgZnJhbWVzIGZyb20gdGhlIGxpYnNwZWV4IGJ1ZmZlci4gKi8KKyAgICBpZiAoc3BlZXhfYml0c19yZW1haW5pbmcoJnMtPmJpdHMpIDwgNSB8fAorICAgICAgICBzcGVleF9iaXRzX3BlZWtfdW5zaWduZWQoJnMtPmJpdHMsIDUpID09IDB4RikgeworICAgICAgICAvKiBjaGVjayBmb3IgZmx1c2ggcGFja2V0ICovCisgICAgICAgIGlmICghYnVmIHx8ICFidWZfc2l6ZSkgeworICAgICAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5wa3RzaXplICYmIGJ1Zl9zaXplID09IDYyKQorICAgICAgICAgICAgYnVmX3NpemUgPSBzLT5wa3RzaXplOworICAgICAgICAvKiBzZXQgbmV3IGJ1ZmZlciAqLworICAgICAgICBzcGVleF9iaXRzX3JlYWRfZnJvbSgmcy0+Yml0cywgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgIGNvbnN1bWVkID0gYXZwa3QtPnNpemU7CisgICAgfQorCisgICAgLyogZGVjb2RlIGEgc2luZ2xlIGZyYW1lICovCisgICAgcmV0ID0gc3BlZXhfZGVjb2RlX2ludChzLT5kZWNfc3RhdGUsICZzLT5iaXRzLCBvdXRwdXQpOworICAgIGlmIChyZXQgPD0gLTIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBkZWNvZGluZyBTcGVleCBmcmFtZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA9PSAyKQorICAgICAgICBzcGVleF9kZWNvZGVfc3RlcmVvX2ludChvdXRwdXQsIHMtPmZyYW1lX3NpemUsICZzLT5zdGVyZW8pOworCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgaWYgKCFhdmN0eC0+Yml0X3JhdGUpCisgICAgICAgIHNwZWV4X2RlY29kZXJfY3RsKHMtPmRlY19zdGF0ZSwgU1BFRVhfR0VUX0JJVFJBVEUsICZhdmN0eC0+Yml0X3JhdGUpOworICAgIHJldHVybiBjb25zdW1lZDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYnNwZWV4X2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTGliU3BlZXhDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHNwZWV4X2JpdHNfZGVzdHJveSgmcy0+Yml0cyk7CisgICAgc3BlZXhfZGVjb2Rlcl9kZXN0cm95KHMtPmRlY19zdGF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBsaWJzcGVleF9kZWNvZGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIExpYlNwZWV4Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3BlZXhfYml0c19yZXNldCgmcy0+Yml0cyk7Cit9CisKK0FWQ29kZWMgZmZfbGlic3BlZXhfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlic3BlZXgiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJzcGVleCBTcGVleCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TUEVFWCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTGliU3BlZXhDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBsaWJzcGVleF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBsaWJzcGVleF9kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gbGlic3BlZXhfZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IGxpYnNwZWV4X2RlY29kZV9mbHVzaCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfU1VCRlJBTUVTIHwgQ09ERUNfQ0FQX0RFTEFZIHwgQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJzcGVleGVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlic3BlZXhlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIzOGFhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlic3BlZXhlbmMuYwpAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKdXN0aW4gUnVnZ2xlcworICogQ29weXJpZ2h0IChjKSAyMDA5IFh1Z2dsZSBJbmNvcnBvcmF0ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbGlic3BlZXggU3BlZXggYXVkaW8gZW5jb2RlcgorICoKKyAqIFVzYWdlIEd1aWRlCisgKiBUaGlzIGV4cGxhaW5zIHRoZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHNldCBwcmlvciB0byBpbml0aWFsaXphdGlvbiBpbgorICogb3JkZXIgdG8gY29udHJvbCB2YXJpb3VzIGVuY29kaW5nIHBhcmFtZXRlcnMuCisgKgorICogQ2hhbm5lbHMKKyAqICAgICBTcGVleCBvbmx5IHN1cHBvcnRzIG1vbm8gb3Igc3RlcmVvLCBzbyBhdmN0eC0+Y2hhbm5lbHMgbXVzdCBiZSBzZXQgdG8KKyAqICAgICAxIG9yIDIuCisgKgorICogU2FtcGxlIFJhdGUgLyBFbmNvZGluZyBNb2RlCisgKiAgICAgU3BlZXggaGFzIDMgbW9kZXMsIGVhY2ggb2Ygd2hpY2ggdXNlcyBhIHNwZWNpZmljIHNhbXBsZSByYXRlLgorICogICAgICAgICBuYXJyb3diYW5kICAgICA6ICA4IGtIegorICogICAgICAgICB3aWRlYmFuZCAgICAgICA6IDE2IGtIegorICogICAgICAgICB1bHRyYS13aWRlYmFuZCA6IDMyIGtIegorICogICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSBtdXN0IGJlIHNldCB0byBvbmUgb2YgdGhlc2UgMyB2YWx1ZXMuICBUaGlzIHdpbGwgYmUKKyAqICAgICB1c2VkIHRvIHNldCB0aGUgZW5jb2RpbmcgbW9kZS4KKyAqCisgKiBSYXRlIENvbnRyb2wKKyAqICAgICBWQlIgbW9kZSBpcyB0dXJuZWQgb24gYnkgc2V0dGluZyBDT0RFQ19GTEFHX1FTQ0FMRSBpbiBhdmN0eC0+ZmxhZ3MuCisgKiAgICAgYXZjdHgtPmdsb2JhbF9xdWFsaXR5IGlzIHVzZWQgdG8gc2V0IHRoZSBlbmNvZGluZyBxdWFsaXR5LgorICogICAgIEZvciBDQlIgbW9kZSwgYXZjdHgtPmJpdF9yYXRlIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgY29uc3RhbnQgYml0cmF0ZS4KKyAqICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgJ2Nicl9xdWFsaXR5JyBvcHRpb24gY2FuIGJlIHNldCBmcm9tIDAgdG8gMTAgdG8gc2V0CisgKiAgICAgYSBjb25zdGFudCBiaXRyYXRlIGJhc2VkIG9uIHF1YWxpdHkuCisgKiAgICAgRm9yIEFCUiBtb2RlLCBzZXQgYXZjdHgtPmJpdF9yYXRlIGFuZCBzZXQgdGhlICdhYnInIG9wdGlvbiB0byAxLgorICogICAgIEFwcHJveC4gQml0cmF0ZSBSYW5nZToKKyAqICAgICAgICAgbmFycm93YmFuZCAgICAgOiAyNDAwIC0gMjU2MDAgYnBzCisgKiAgICAgICAgIHdpZGViYW5kICAgICAgIDogNDAwMCAtIDQzMjAwIGJwcworICogICAgICAgICB1bHRyYS13aWRlYmFuZCA6IDQ0MDAgLSA0NTIwMCBicHMKKyAqCisgKiBDb21wbGV4aXR5CisgKiAgICAgRW5jb2RpbmcgY29tcGxleGl0eSBpcyBjb250cm9sbGVkIGJ5IHNldHRpbmcgYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsLgorICogICAgIFRoZSB2YWxpZCByYW5nZSBpcyAwIHRvIDEwLiAgQSBoaWdoZXIgc2V0dGluZyBnaXZlcyBnZW5lcmFsbHkgYmV0dGVyCisgKiAgICAgcXVhbGl0eSBhdCB0aGUgZXhwZW5zZSBvZiBlbmNvZGluZyBzcGVlZC4gIFRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZQorICogICAgIGJpdCByYXRlLgorICoKKyAqIEZyYW1lcy1wZXItUGFja2V0CisgKiAgICAgVGhlIGVuY29kZXIgZGVmYXVsdHMgdG8gdXNpbmcgMSBmcmFtZS1wZXItcGFja2V0LiAgSG93ZXZlciwgaXQgaXMKKyAqICAgICBzb21ldGltZXMgZGVzaXJhYmxlIHRvIHVzZSBtdWx0aXBsZSBmcmFtZXMtcGVyLXBhY2tldCB0byByZWR1Y2UgdGhlCisgKiAgICAgYW1vdW50IG9mIGNvbnRhaW5lciBvdmVyaGVhZC4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyB0aGUKKyAqICAgICAnZnJhbWVzX3Blcl9wYWNrZXQnIG9wdGlvbiB0byBhIHZhbHVlIDEgdG8gOC4KKyAqCisgKgorICogT3B0aW9uYWwgZmVhdHVyZXMKKyAqIFNwZWV4IGVuY29kZXIgc3VwcG9ydHMgc2V2ZXJhbCBvcHRpb25hbCBmZWF0dXJlcywgd2hpY2ggY2FuIGJlIHVzZWZ1bAorICogZm9yIHNvbWUgY29uZGl0aW9ucy4KKyAqCisgKiBWb2ljZSBBY3Rpdml0eSBEZXRlY3Rpb24KKyAqICAgICBXaGVuIGVuYWJsZWQsIHZvaWNlIGFjdGl2aXR5IGRldGVjdGlvbiBkZXRlY3RzIHdoZXRoZXIgdGhlIGF1ZGlvCisgKiAgICAgYmVpbmcgZW5jb2RlZCBpcyBzcGVlY2ggb3Igc2lsZW5jZS9iYWNrZ3JvdW5kIG5vaXNlLiBWQUQgaXMgYWx3YXlzCisgKiAgICAgaW1wbGljaXRseSBhY3RpdmF0ZWQgd2hlbiBlbmNvZGluZyBpbiBWQlIsIHNvIHRoZSBvcHRpb24gaXMgb25seSB1c2VmdWwKKyAqICAgICBpbiBub24tVkJSIG9wZXJhdGlvbi4gSW4gdGhpcyBjYXNlLCBTcGVleCBkZXRlY3RzIG5vbi1zcGVlY2ggcGVyaW9kcyBhbmQKKyAqICAgICBlbmNvZGVzIHRoZW0gd2l0aCBqdXN0IGVub3VnaCBiaXRzIHRvIHJlcHJvZHVjZSB0aGUgYmFja2dyb3VuZCBub2lzZS4KKyAqCisgKiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiAoRFRYKQorICogICAgIERUWCBpcyBhbiBhZGRpdGlvbiB0byBWQUQvVkJSIG9wZXJhdGlvbiwgdGhhdCBhbGxvd3MgdG8gc3RvcCB0cmFuc21pdHRpbmcKKyAqICAgICBjb21wbGV0ZWx5IHdoZW4gdGhlIGJhY2tncm91bmQgbm9pc2UgaXMgc3RhdGlvbmFyeS4KKyAqICAgICBJbiBmaWxlLWJhc2VkIG9wZXJhdGlvbiBvbmx5IDUgYml0cyBhcmUgdXNlZCBmb3Igc3VjaCBmcmFtZXMuCisgKi8KKworI2luY2x1ZGUgPHNwZWV4L3NwZWV4Lmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXhfaGVhZGVyLmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXhfc3RlcmVvLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF1ZGlvX2ZyYW1lX3F1ZXVlLmgiCisKKy8qIFRPRE86IFRoaW5rIGFib3V0IGNvbnZlcnRpbmcgYWJyLCB2YWQsIGR0eCBhbmQgc3VjaCBmbGFncyB0byBhIGJpdCBmaWVsZCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQ2xhc3MgKmNsYXNzOyAgICAgICAgICAgICAvLy88IEFWQ2xhc3MgZm9yIHByaXZhdGUgb3B0aW9ucworICAgIFNwZWV4Qml0cyBiaXRzOyAgICAgICAgICAgICAvLy88IGxpYnNwZWV4IGJpdHdyaXRlciBjb250ZXh0CisgICAgU3BlZXhIZWFkZXIgaGVhZGVyOyAgICAgICAgIC8vLzwgbGlic3BlZXggaGVhZGVyIHN0cnVjdAorICAgIHZvaWQgKmVuY19zdGF0ZTsgICAgICAgICAgICAvLy88IGxpYnNwZWV4IGVuY29kZXIgc3RhdGUKKyAgICBpbnQgZnJhbWVzX3Blcl9wYWNrZXQ7ICAgICAgLy8vPCBudW1iZXIgb2YgZnJhbWVzIHRvIGVuY29kZSBpbiBlYWNoIHBhY2tldAorICAgIGZsb2F0IHZicl9xdWFsaXR5OyAgICAgICAgICAvLy88IFZCUiBxdWFsaXR5IDAuMCB0byAxMC4wCisgICAgaW50IGNicl9xdWFsaXR5OyAgICAgICAgICAgIC8vLzwgQ0JSIHF1YWxpdHkgMCB0byAxMAorICAgIGludCBhYnI7ICAgICAgICAgICAgICAgICAgICAvLy88IGZsYWcgdG8gZW5hYmxlIEFCUgorICAgIGludCB2YWQ7ICAgICAgICAgICAgICAgICAgICAvLy88IGZsYWcgdG8gZW5hYmxlIFZBRAorICAgIGludCBkdHg7ICAgICAgICAgICAgICAgICAgICAvLy88IGZsYWcgdG8gZW5hYmxlIERUWAorICAgIGludCBwa3RfZnJhbWVfY291bnQ7ICAgICAgICAvLy88IGZyYW1lIGNvdW50IGZvciB0aGUgY3VycmVudCBwYWNrZXQKKyAgICBBdWRpb0ZyYW1lUXVldWUgYWZxOyAgICAgICAgLy8vPCBmcmFtZSBxdWV1ZQorfSBMaWJTcGVleEVuY0NvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgcHJpbnRfZW5jX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGliU3BlZXhFbmNDb250ZXh0ICpzKQoreworICAgIGNvbnN0IGNoYXIgKm1vZGVfc3RyID0gInVua25vd24iOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJjaGFubmVsczogJWRcbiIsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgc3dpdGNoIChzLT5oZWFkZXIubW9kZSkgeworICAgIGNhc2UgU1BFRVhfTU9ERUlEX05COiAgbW9kZV9zdHIgPSAibmFycm93YmFuZCI7ICAgICBicmVhazsKKyAgICBjYXNlIFNQRUVYX01PREVJRF9XQjogIG1vZGVfc3RyID0gIndpZGViYW5kIjsgICAgICAgYnJlYWs7CisgICAgY2FzZSBTUEVFWF9NT0RFSURfVVdCOiBtb2RlX3N0ciA9ICJ1bHRyYS13aWRlYmFuZCI7IGJyZWFrOworICAgIH0KKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIm1vZGU6ICVzXG4iLCBtb2RlX3N0cik7CisgICAgaWYgKHMtPmhlYWRlci52YnIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJyYXRlIGNvbnRyb2w6IFZCUlxuIik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiICBxdWFsaXR5OiAlZlxuIiwgcy0+dmJyX3F1YWxpdHkpOworICAgIH0gZWxzZSBpZiAocy0+YWJyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAicmF0ZSBjb250cm9sOiBBQlJcbiIpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAgYml0cmF0ZTogJWQgYnBzXG4iLCBhdmN0eC0+Yml0X3JhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAicmF0ZSBjb250cm9sOiBDQlJcbiIpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAgYml0cmF0ZTogJWQgYnBzXG4iLCBhdmN0eC0+Yml0X3JhdGUpOworICAgIH0KKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImNvbXBsZXhpdHk6ICVkXG4iLAorICAgICAgICAgICBhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZnJhbWUgc2l6ZTogJWQgc2FtcGxlc1xuIiwKKyAgICAgICAgICAgYXZjdHgtPmZyYW1lX3NpemUpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZnJhbWVzIHBlciBwYWNrZXQ6ICVkXG4iLAorICAgICAgICAgICBzLT5mcmFtZXNfcGVyX3BhY2tldCk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJwYWNrZXQgc2l6ZTogJWRcbiIsCisgICAgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplICogcy0+ZnJhbWVzX3Blcl9wYWNrZXQpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAidm9pY2UgYWN0aXZpdHkgZGV0ZWN0aW9uOiAlZFxuIiwgcy0+dmFkKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImRpc2NvbnRpbnVvdXMgdHJhbnNtaXNzaW9uOiAlZFxuIiwgcy0+ZHR4KTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGVuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMaWJTcGVleEVuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IFNwZWV4TW9kZSAqbW9kZTsKKyAgICB1aW50OF90ICpoZWFkZXJfZGF0YTsKKyAgICBpbnQgaGVhZGVyX3NpemU7CisgICAgaW50MzJfdCBjb21wbGV4aXR5OworCisgICAgLyogY2hhbm5lbHMgKi8KKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDwgMSB8fCBhdmN0eC0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaGFubmVscyAoJWQpLiBPbmx5IHN0ZXJlbyBhbmQgIgorICAgICAgICAgICAgICAgIm1vbm8gYXJlIHN1cHBvcnRlZFxuIiwgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvKiBzYW1wbGUgcmF0ZSBhbmQgZW5jb2RpbmcgbW9kZSAqLworICAgIHN3aXRjaCAoYXZjdHgtPnNhbXBsZV9yYXRlKSB7CisgICAgY2FzZSAgODAwMDogbW9kZSA9ICZzcGVleF9uYl9tb2RlOyAgYnJlYWs7CisgICAgY2FzZSAxNjAwMDogbW9kZSA9ICZzcGVleF93Yl9tb2RlOyAgYnJlYWs7CisgICAgY2FzZSAzMjAwMDogbW9kZSA9ICZzcGVleF91d2JfbW9kZTsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTYW1wbGUgcmF0ZSBvZiAlZCBIeiBpcyBub3Qgc3VwcG9ydGVkLiAiCisgICAgICAgICAgICAgICAiUmVzYW1wbGUgdG8gOCwgMTYsIG9yIDMyIGtIei5cbiIsIGF2Y3R4LT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBsaWJzcGVleCAqLworICAgIHMtPmVuY19zdGF0ZSA9IHNwZWV4X2VuY29kZXJfaW5pdChtb2RlKTsKKyAgICBpZiAoIXMtPmVuY19zdGF0ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyBsaWJzcGVleFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3BlZXhfaW5pdF9oZWFkZXIoJnMtPmhlYWRlciwgYXZjdHgtPnNhbXBsZV9yYXRlLCBhdmN0eC0+Y2hhbm5lbHMsIG1vZGUpOworCisgICAgLyogcmF0ZSBjb250cm9sIG1ldGhvZCBhbmQgcGFyYW1ldGVycyAqLworICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FTQ0FMRSkgeworICAgICAgICAvKiBWQlIgKi8KKyAgICAgICAgcy0+aGVhZGVyLnZiciA9IDE7CisgICAgICAgIHMtPnZhZCA9IDE7IC8qIFZBRCBpcyBhbHdheXMgaW1wbGljaXRseSBhY3RpdmF0ZWQgZm9yIFZCUiAqLworICAgICAgICBzcGVleF9lbmNvZGVyX2N0bChzLT5lbmNfc3RhdGUsIFNQRUVYX1NFVF9WQlIsICZzLT5oZWFkZXIudmJyKTsKKyAgICAgICAgcy0+dmJyX3F1YWxpdHkgPSBhdl9jbGlwZihhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgLyAoZmxvYXQpRkZfUVAyTEFNQkRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsIDEwLjBmKTsKKyAgICAgICAgc3BlZXhfZW5jb2Rlcl9jdGwocy0+ZW5jX3N0YXRlLCBTUEVFWF9TRVRfVkJSX1FVQUxJVFksICZzLT52YnJfcXVhbGl0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+aGVhZGVyLmJpdHJhdGUgPSBhdmN0eC0+Yml0X3JhdGU7CisgICAgICAgIGlmIChhdmN0eC0+Yml0X3JhdGUgPiAwKSB7CisgICAgICAgICAgICAvKiBDQlIgb3IgQUJSIGJ5IGJpdHJhdGUgKi8KKyAgICAgICAgICAgIGlmIChzLT5hYnIpIHsKKyAgICAgICAgICAgICAgICBzcGVleF9lbmNvZGVyX2N0bChzLT5lbmNfc3RhdGUsIFNQRUVYX1NFVF9BQlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmhlYWRlci5iaXRyYXRlKTsKKyAgICAgICAgICAgICAgICBzcGVleF9lbmNvZGVyX2N0bChzLT5lbmNfc3RhdGUsIFNQRUVYX0dFVF9BQlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmhlYWRlci5iaXRyYXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3BlZXhfZW5jb2Rlcl9jdGwocy0+ZW5jX3N0YXRlLCBTUEVFWF9TRVRfQklUUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aGVhZGVyLmJpdHJhdGUpOworICAgICAgICAgICAgICAgIHNwZWV4X2VuY29kZXJfY3RsKHMtPmVuY19zdGF0ZSwgU1BFRVhfR0VUX0JJVFJBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmhlYWRlci5iaXRyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIENCUiBieSBxdWFsaXR5ICovCisgICAgICAgICAgICBzcGVleF9lbmNvZGVyX2N0bChzLT5lbmNfc3RhdGUsIFNQRUVYX1NFVF9RVUFMSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmNicl9xdWFsaXR5KTsKKyAgICAgICAgICAgIHNwZWV4X2VuY29kZXJfY3RsKHMtPmVuY19zdGF0ZSwgU1BFRVhfR0VUX0JJVFJBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aGVhZGVyLmJpdHJhdGUpOworICAgICAgICB9CisgICAgICAgIC8qIHN0ZXJlbyBzaWRlIGluZm9ybWF0aW9uIGFkZHMgYWJvdXQgODAwIGJwcyB0byB0aGUgYmFzZSBiaXRyYXRlICovCisgICAgICAgIC8qIFRPRE86IHRoaXMgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgZXhhY3RseSAqLworICAgICAgICBhdmN0eC0+Yml0X3JhdGUgPSBzLT5oZWFkZXIuYml0cmF0ZSArIChhdmN0eC0+Y2hhbm5lbHMgPT0gMiA/IDgwMCA6IDApOworICAgIH0KKworICAgIC8qIFZBRCBpcyBhY3RpdmF0ZWQgd2l0aCBWQlIgb3IgY2FuIGJlIHR1cm5lZCBvbiBieSBpdHNlbGYgKi8KKyAgICBpZiAocy0+dmFkKQorICAgICAgICBzcGVleF9lbmNvZGVyX2N0bChzLT5lbmNfc3RhdGUsIFNQRUVYX1NFVF9WQUQsICZzLT52YWQpOworCisgICAgLyogQWN0aXZpdGluZyBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiAqLworICAgIGlmIChzLT5kdHgpIHsKKyAgICAgICAgc3BlZXhfZW5jb2Rlcl9jdGwocy0+ZW5jX3N0YXRlLCBTUEVFWF9TRVRfRFRYLCAmcy0+ZHR4KTsKKyAgICAgICAgaWYgKCEocy0+YWJyIHx8IHMtPnZhZCB8fCBzLT5oZWFkZXIudmJyKSkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJEVFggaXMgbm90IG11Y2ggb2YgdXNlIHdpdGhvdXQgQUJSLCBWQUQgb3IgVkJSXG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgZW5jb2RpbmcgY29tcGxleGl0eSAqLworICAgIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPiBGRl9DT01QUkVTU0lPTl9ERUZBVUxUKSB7CisgICAgICAgIGNvbXBsZXhpdHkgPSBhdl9jbGlwKGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbCwgMCwgMTApOworICAgICAgICBzcGVleF9lbmNvZGVyX2N0bChzLT5lbmNfc3RhdGUsIFNQRUVYX1NFVF9DT01QTEVYSVRZLCAmY29tcGxleGl0eSk7CisgICAgfQorICAgIHNwZWV4X2VuY29kZXJfY3RsKHMtPmVuY19zdGF0ZSwgU1BFRVhfR0VUX0NPTVBMRVhJVFksICZjb21wbGV4aXR5KTsKKyAgICBhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPSBjb21wbGV4aXR5OworCisgICAgLyogc2V0IHBhY2tldCBzaXplICovCisgICAgYXZjdHgtPmZyYW1lX3NpemUgPSBzLT5oZWFkZXIuZnJhbWVfc2l6ZTsKKyAgICBzLT5oZWFkZXIuZnJhbWVzX3Blcl9wYWNrZXQgPSBzLT5mcmFtZXNfcGVyX3BhY2tldDsKKworICAgIC8qIHNldCBlbmNvZGluZyBkZWxheSAqLworICAgIHNwZWV4X2VuY29kZXJfY3RsKHMtPmVuY19zdGF0ZSwgU1BFRVhfR0VUX0xPT0tBSEVBRCwgJmF2Y3R4LT5pbml0aWFsX3BhZGRpbmcpOworICAgIGZmX2FmX3F1ZXVlX2luaXQoYXZjdHgsICZzLT5hZnEpOworCisgICAgLyogY3JlYXRlIGhlYWRlciBwYWNrZXQgYnl0ZXMgZnJvbSBoZWFkZXIgc3RydWN0ICovCisgICAgLyogbm90ZTogbGlic3BlZXggYWxsb2NhdGVzIHRoZSBtZW1vcnkgZm9yIGhlYWRlcl9kYXRhLCB3aGljaCBpcyBmcmVlZAorICAgICAgICAgICAgIGJlbG93IHdpdGggc3BlZXhfaGVhZGVyX2ZyZWUoKSAqLworICAgIGhlYWRlcl9kYXRhID0gc3BlZXhfaGVhZGVyX3RvX3BhY2tldCgmcy0+aGVhZGVyLCAmaGVhZGVyX3NpemUpOworCisgICAgLyogYWxsb2NhdGUgZXh0cmFkYXRhIGFuZCBjb2RlZF9mcmFtZSAqLworICAgIGF2Y3R4LT5leHRyYWRhdGEgICA9IGF2X21hbGxvYyhoZWFkZXJfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICBzcGVleF9oZWFkZXJfZnJlZShoZWFkZXJfZGF0YSk7CisgICAgICAgIHNwZWV4X2VuY29kZXJfZGVzdHJveShzLT5lbmNfc3RhdGUpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICAvKiBjb3B5IGhlYWRlciBwYWNrZXQgdG8gZXh0cmFkYXRhICovCisgICAgbWVtY3B5KGF2Y3R4LT5leHRyYWRhdGEsIGhlYWRlcl9kYXRhLCBoZWFkZXJfc2l6ZSk7CisgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gaGVhZGVyX3NpemU7CisgICAgc3BlZXhfaGVhZGVyX2ZyZWUoaGVhZGVyX2RhdGEpOworCisgICAgLyogaW5pdCBsaWJzcGVleCBiaXR3cml0ZXIgKi8KKyAgICBzcGVleF9iaXRzX2luaXQoJnMtPmJpdHMpOworCisgICAgcHJpbnRfZW5jX3BhcmFtcyhhdmN0eCwgcyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCit7CisgICAgTGliU3BlZXhFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQxNl90ICpzYW1wbGVzICAgICAgPSBmcmFtZSA/IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF0gOiBOVUxMOworICAgIGludCByZXQ7CisKKyAgICBpZiAoc2FtcGxlcykgeworICAgICAgICAvKiBlbmNvZGUgU3BlZXggZnJhbWUgKi8KKyAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA9PSAyKQorICAgICAgICAgICAgc3BlZXhfZW5jb2RlX3N0ZXJlb19pbnQoc2FtcGxlcywgcy0+aGVhZGVyLmZyYW1lX3NpemUsICZzLT5iaXRzKTsKKyAgICAgICAgc3BlZXhfZW5jb2RlX2ludChzLT5lbmNfc3RhdGUsIHNhbXBsZXMsICZzLT5iaXRzKTsKKyAgICAgICAgcy0+cGt0X2ZyYW1lX2NvdW50Kys7CisgICAgICAgIGlmICgocmV0ID0gZmZfYWZfcXVldWVfYWRkKCZzLT5hZnEsIGZyYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBoYW5kbGUgZW5kLW9mLXN0cmVhbSAqLworICAgICAgICBpZiAoIXMtPnBrdF9mcmFtZV9jb3VudCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAvKiBhZGQgZXh0cmEgdGVybWluYXRvciBjb2RlcyBmb3IgdW51c2VkIGZyYW1lcyBpbiBsYXN0IHBhY2tldCAqLworICAgICAgICB3aGlsZSAocy0+cGt0X2ZyYW1lX2NvdW50IDwgcy0+ZnJhbWVzX3Blcl9wYWNrZXQpIHsKKyAgICAgICAgICAgIHNwZWV4X2JpdHNfcGFjaygmcy0+Yml0cywgMTUsIDUpOworICAgICAgICAgICAgcy0+cGt0X2ZyYW1lX2NvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB3cml0ZSBvdXRwdXQgaWYgYWxsIGZyYW1lcyBmb3IgdGhlIHBhY2tldCBoYXZlIGJlZW4gZW5jb2RlZCAqLworICAgIGlmIChzLT5wa3RfZnJhbWVfY291bnQgPT0gcy0+ZnJhbWVzX3Blcl9wYWNrZXQpIHsKKyAgICAgICAgcy0+cGt0X2ZyYW1lX2NvdW50ID0gMDsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgc3BlZXhfYml0c19uYnl0ZXMoJnMtPmJpdHMpKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0ID0gc3BlZXhfYml0c193cml0ZSgmcy0+Yml0cywgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICAgICAgc3BlZXhfYml0c19yZXNldCgmcy0+Yml0cyk7CisKKyAgICAgICAgLyogR2V0IHRoZSBuZXh0IGZyYW1lIHB0cy9kdXJhdGlvbiAqLworICAgICAgICBmZl9hZl9xdWV1ZV9yZW1vdmUoJnMtPmFmcSwgcy0+ZnJhbWVzX3Blcl9wYWNrZXQgKiBhdmN0eC0+ZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdnBrdC0+cHRzLCAmYXZwa3QtPmR1cmF0aW9uKTsKKworICAgICAgICBhdnBrdC0+c2l6ZSA9IHJldDsKKyAgICAgICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMaWJTcGVleEVuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgc3BlZXhfYml0c19kZXN0cm95KCZzLT5iaXRzKTsKKyAgICBzcGVleF9lbmNvZGVyX2Rlc3Ryb3kocy0+ZW5jX3N0YXRlKTsKKworICAgIGZmX2FmX3F1ZXVlX2Nsb3NlKCZzLT5hZnEpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihMaWJTcGVleEVuY0NvbnRleHQsIHgpCisjZGVmaW5lIEFFIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiYWJyIiwgICAgICAgICAgICAgICAiVXNlIGF2ZXJhZ2UgYml0IHJhdGUiLCAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoYWJyKSwgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgICAxLCBBRSB9LAorICAgIHsgImNicl9xdWFsaXR5IiwgICAgICAgIlNldCBxdWFsaXR5IHZhbHVlICgwIHRvIDEwKSBmb3IgQ0JSIiwgICAgICAgT0ZGU0VUKGNicl9xdWFsaXR5KSwgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSA4IH0sIDAsICAxMCwgQUUgfSwKKyAgICB7ICJmcmFtZXNfcGVyX3BhY2tldCIsICJOdW1iZXIgb2YgZnJhbWVzIHRvIGVuY29kZSBpbiBlYWNoIHBhY2tldCIsIE9GRlNFVChmcmFtZXNfcGVyX3BhY2tldCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMSB9LCAxLCAgIDgsIEFFIH0sCisgICAgeyAidmFkIiwgICAgICAgICAgICAgICAiVm9pY2UgQWN0aXZpdHkgRGV0ZWN0aW9uIiwgICAgICAgICAgICAgICAgICBPRkZTRVQodmFkKSwgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgICAxLCBBRSB9LAorICAgIHsgImR0eCIsICAgICAgICAgICAgICAgIkRpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIiwgICAgICAgICAgICAgICAgT0ZGU0VUKGR0eCksICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsICAgMSwgQUUgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHNwZWV4X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImxpYnNwZWV4IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjRGVmYXVsdCBkZWZhdWx0c1tdID0geworICAgIHsgImIiLCAgICAgICAgICAgICAgICAgIjAiIH0sCisgICAgeyAiY29tcHJlc3Npb25fbGV2ZWwiLCAiMyIgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK0FWQ29kZWMgZmZfbGlic3BlZXhfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlic3BlZXgiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJzcGVleCBTcGVleCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TUEVFWCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTGliU3BlZXhFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBlbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBlbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZW5jb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9ERUxBWSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5jaGFubmVsX2xheW91dHMgPSAoY29uc3QgdWludDY0X3RbXSl7IEFWX0NIX0xBWU9VVF9NT05PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB9LAorICAgIC5zdXBwb3J0ZWRfc2FtcGxlcmF0ZXMgPSAoY29uc3QgaW50W10peyA4MDAwLCAxNjAwMCwgMzIwMDAsIDAgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmc3BlZXhfY2xhc3MsCisgICAgLmRlZmF1bHRzICAgICAgID0gZGVmYXVsdHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGlic3RhZ2VmcmlnaHQuY3BwIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlic3RhZ2VmcmlnaHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZDdlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJzdGFnZWZyaWdodC5jcHAKQEAgLTAsMCArMSw1OTAgQEAKKy8qCisgKiBJbnRlcmZhY2UgdG8gdGhlIEFuZHJvaWQgU3RhZ2VmcmlnaHQgbGlicmFyeSBmb3IKKyAqIEgvVyBhY2NlbGVyYXRlZCBILjI2NCBkZWNvZGluZworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBNb2hhbWVkIE5hdWZhbAorICogQ29weXJpZ2h0IChDKSAyMDExIE1hcnRpbiBTdG9yc2rDtgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8bWFwPgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKK30KKworI2RlZmluZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyIDB4N0ZBMzBDMDAKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0cnVjdCBGcmFtZSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIHNpemVfdCBzaXplOworICAgIGludDY0X3QgdGltZTsKKyAgICBpbnQga2V5OworICAgIHVpbnQ4X3QgKmJ1ZmZlcjsKKyAgICBBVkZyYW1lICp2ZnJhbWU7Cit9OworCitzdHJ1Y3QgVGltZVN0YW1wIHsKKyAgICBpbnQ2NF90IHB0czsKKyAgICBpbnQ2NF90IHJlb3JkZXJlZF9vcGFxdWU7Cit9OworCitjbGFzcyBDdXN0b21Tb3VyY2U7CisKK3N0cnVjdCBTdGFnZWZyaWdodENvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmM7CisgICAgdWludDhfdCogb3JpZ19leHRyYWRhdGE7CisgICAgaW50IG9yaWdfZXh0cmFkYXRhX3NpemU7CisgICAgc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2U7CisgICAgTGlzdDxGcmFtZSo+ICppbl9xdWV1ZSwgKm91dF9xdWV1ZTsKKyAgICBwdGhyZWFkX211dGV4X3QgaW5fbXV0ZXgsIG91dF9tdXRleDsKKyAgICBwdGhyZWFkX2NvbmRfdCBjb25kaXRpb247CisgICAgcHRocmVhZF90IGRlY29kZV90aHJlYWRfaWQ7CisKKyAgICBGcmFtZSAqZW5kX2ZyYW1lOworICAgIGJvb2wgc291cmNlX2RvbmU7CisgICAgdm9sYXRpbGUgc2lnX2F0b21pY190IHRocmVhZF9zdGFydGVkLCB0aHJlYWRfZXhpdGVkLCBzdG9wX2RlY29kZTsKKworICAgIEFWRnJhbWUgKnByZXZfZnJhbWU7CisgICAgc3RkOjptYXA8aW50NjRfdCwgVGltZVN0YW1wPiAqdHNfbWFwOworICAgIGludDY0X3QgZnJhbWVfaW5kZXg7CisKKyAgICB1aW50OF90ICpkdW1teV9idWY7CisgICAgaW50IGR1bW15X2J1ZnNpemU7CisKKyAgICBPTVhDbGllbnQgKmNsaWVudDsKKyAgICBzcDxNZWRpYVNvdXJjZT4gKmRlY29kZXI7CisgICAgY29uc3QgY2hhciAqZGVjb2Rlcl9jb21wb25lbnQ7Cit9OworCitjbGFzcyBDdXN0b21Tb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworcHVibGljOgorICAgIEN1c3RvbVNvdXJjZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHNwPE1ldGFEYXRhPiBtZXRhKSB7CisgICAgICAgIHMgPSAoU3RhZ2VmcmlnaHRDb250ZXh0KilhdmN0eC0+cHJpdl9kYXRhOworICAgICAgICBzb3VyY2VfbWV0YSA9IG1ldGE7CisgICAgICAgIGZyYW1lX3NpemUgID0gKGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiAzKSAvIDI7CisgICAgICAgIGJ1Zl9ncm91cC5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihmcmFtZV9zaXplKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCkgeworICAgICAgICByZXR1cm4gc291cmNlX21ldGE7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICAgICBGcmFtZSAqZnJhbWU7CisgICAgICAgIHN0YXR1c190IHJldDsKKworICAgICAgICBpZiAocy0+dGhyZWFkX2V4aXRlZCkKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnMtPmluX211dGV4KTsKKworICAgICAgICB3aGlsZSAocy0+aW5fcXVldWUtPmVtcHR5KCkpCisgICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcy0+Y29uZGl0aW9uLCAmcy0+aW5fbXV0ZXgpOworCisgICAgICAgIGZyYW1lID0gKnMtPmluX3F1ZXVlLT5iZWdpbigpOworICAgICAgICByZXQgPSBmcmFtZS0+c3RhdHVzOworCisgICAgICAgIGlmIChyZXQgPT0gT0spIHsKKyAgICAgICAgICAgIHJldCA9IGJ1Zl9ncm91cC5hY3F1aXJlX2J1ZmZlcihidWZmZXIpOworICAgICAgICAgICAgaWYgKHJldCA9PSBPSykgeworICAgICAgICAgICAgICAgIG1lbWNweSgoKmJ1ZmZlciktPmRhdGEoKSwgZnJhbWUtPmJ1ZmZlciwgZnJhbWUtPnNpemUpOworICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+c2V0X3JhbmdlKDAsIGZyYW1lLT5zaXplKTsKKyAgICAgICAgICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSxmcmFtZS0+a2V5KTsKKyAgICAgICAgICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgZnJhbWUtPnRpbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhY3F1aXJlIE1lZGlhQnVmZmVyXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyZWVwKCZmcmFtZS0+YnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmluX3F1ZXVlLT5lcmFzZShzLT5pbl9xdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5pbl9tdXRleCk7CisKKyAgICAgICAgYXZfZnJlZXAoJmZyYW1lKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJHcm91cCBidWZfZ3JvdXA7CisgICAgc3A8TWV0YURhdGE+IHNvdXJjZV9tZXRhOworICAgIFN0YWdlZnJpZ2h0Q29udGV4dCAqczsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKK307CisKK3ZvaWQqIGRlY29kZV90aHJlYWQodm9pZCAqYXJnKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IChBVkNvZGVjQ29udGV4dCopYXJnOworICAgIFN0YWdlZnJpZ2h0Q29udGV4dCAqcyA9IChTdGFnZWZyaWdodENvbnRleHQqKWF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhfZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZjdHgtPnBpeF9mbXQpOworICAgIEZyYW1lKiBmcmFtZTsKKyAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgIGludDMyX3QgdywgaDsKKyAgICBpbnQgZGVjb2RlX2RvbmUgPSAwOworICAgIGludCByZXQ7CisgICAgaW50IHNyY19saW5lc2l6ZVszXTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNfZGF0YVszXTsKKyAgICBpbnQ2NF90IG91dF9mcmFtZV9pbmRleCA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGZyYW1lID0gKEZyYW1lKilhdl9tYWxsb2N6KHNpemVvZihGcmFtZSkpOworICAgICAgICBpZiAoIWZyYW1lKSB7CisgICAgICAgICAgICBmcmFtZSAgICAgICAgID0gcy0+ZW5kX2ZyYW1lOworICAgICAgICAgICAgZnJhbWUtPnN0YXR1cyA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGRlY29kZV9kb25lICAgPSAxOworICAgICAgICAgICAgcy0+ZW5kX2ZyYW1lICA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIHB1c2hfZnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgZnJhbWUtPnN0YXR1cyA9ICgqcy0+ZGVjb2RlciktPnJlYWQoJmJ1ZmZlcik7CisgICAgICAgIGlmIChmcmFtZS0+c3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gb3V0Rm9ybWF0ID0gKCpzLT5kZWNvZGVyKS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICBvdXRGb3JtYXQtPmZpbmRJbnQzMihrS2V5V2lkdGggLCAmdyk7CisgICAgICAgICAgICBvdXRGb3JtYXQtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaCk7CisgICAgICAgICAgICBmcmFtZS0+dmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICAgICAgICAgIGlmICghZnJhbWUtPnZmcmFtZSkgeworICAgICAgICAgICAgICAgIGZyYW1lLT5zdGF0dXMgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZGVjb2RlX2RvbmUgICA9IDE7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgZ290byBwdXNoX2ZyYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUtPnZmcmFtZSwgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGZyYW1lLT5zdGF0dXMgPSByZXQ7CisgICAgICAgICAgICAgICAgZGVjb2RlX2RvbmUgICA9IDE7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgZ290byBwdXNoX2ZyYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgT01YLlNFQyBkZWNvZGVyIGRvZXNuJ3Qgc2lnbmFsIHRoZSBtb2RpZmllZCB3aWR0aC9oZWlnaHQKKyAgICAgICAgICAgIGlmIChzLT5kZWNvZGVyX2NvbXBvbmVudCAmJiAhc3RybmNtcChzLT5kZWNvZGVyX2NvbXBvbmVudCwgIk9NWC5TRUMiLCA3KSAmJgorICAgICAgICAgICAgICAgICh3ICYgMTUgfHwgaCAmIDE1KSkgeworICAgICAgICAgICAgICAgIGlmICgoKHcgKyAxNSkmfjE1KSAqICgoaCArIDE1KSZ+MTUpICogMy8yID09IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdyA9ICh3ICsgMTUpJn4xNTsKKyAgICAgICAgICAgICAgICAgICAgaCA9IChoICsgMTUpJn4xNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghYXZjdHgtPndpZHRoIHx8ICFhdmN0eC0+aGVpZ2h0IHx8IGF2Y3R4LT53aWR0aCA+IHcgfHwgYXZjdHgtPmhlaWdodCA+IGgpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggID0gdzsKKyAgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0ID0gaDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3JjX2xpbmVzaXplWzBdID0gYXZfaW1hZ2VfZ2V0X2xpbmVzaXplKGF2Y3R4LT5waXhfZm10LCB3LCAwKTsKKyAgICAgICAgICAgIHNyY19saW5lc2l6ZVsxXSA9IGF2X2ltYWdlX2dldF9saW5lc2l6ZShhdmN0eC0+cGl4X2ZtdCwgdywgMSk7CisgICAgICAgICAgICBzcmNfbGluZXNpemVbMl0gPSBhdl9pbWFnZV9nZXRfbGluZXNpemUoYXZjdHgtPnBpeF9mbXQsIHcsIDIpOworCisgICAgICAgICAgICBzcmNfZGF0YVswXSA9ICh1aW50OF90KilidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgIHNyY19kYXRhWzFdID0gc3JjX2RhdGFbMF0gKyBzcmNfbGluZXNpemVbMF0gKiBoOworICAgICAgICAgICAgc3JjX2RhdGFbMl0gPSBzcmNfZGF0YVsxXSArIHNyY19saW5lc2l6ZVsxXSAqIC0oLWg+PnBpeF9kZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICAgICAgICAgIGF2X2ltYWdlX2NvcHkoZnJhbWUtPnZmcmFtZS0+ZGF0YSwgZnJhbWUtPnZmcmFtZS0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kYXRhLCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworCisgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZvdXRfZnJhbWVfaW5kZXgpOworICAgICAgICAgICAgaWYgKG91dF9mcmFtZV9pbmRleCAmJiBzLT50c19tYXAtPmNvdW50KG91dF9mcmFtZV9pbmRleCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZnJhbWUtPnZmcmFtZS0+cHRzID0gKCpzLT50c19tYXApW291dF9mcmFtZV9pbmRleF0ucHRzOworICAgICAgICAgICAgICAgIGZyYW1lLT52ZnJhbWUtPnJlb3JkZXJlZF9vcGFxdWUgPSAoKnMtPnRzX21hcClbb3V0X2ZyYW1lX2luZGV4XS5yZW9yZGVyZWRfb3BhcXVlOworICAgICAgICAgICAgICAgIHMtPnRzX21hcC0+ZXJhc2Uob3V0X2ZyYW1lX2luZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmcmFtZS0+c3RhdHVzID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKGZyYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVjb2RlX2RvbmUgPSAxOworICAgICAgICAgICAgfQorcHVzaF9mcmFtZToKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcy0+b3V0X211dGV4KTsKKyAgICAgICAgICAgIGlmIChzLT5vdXRfcXVldWUtPnNpemUoKSA+PSAxMCkgeworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5vdXRfbXV0ZXgpOworICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLT5vdXRfcXVldWUtPnB1c2hfYmFjayhmcmFtZSk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5vdXRfbXV0ZXgpOworICAgIH0gd2hpbGUgKCFkZWNvZGVfZG9uZSAmJiAhcy0+c3RvcF9kZWNvZGUpOworCisgICAgcy0+dGhyZWFkX2V4aXRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IFN0YWdlZnJpZ2h0X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFN0YWdlZnJpZ2h0Q29udGV4dCAqcyA9IChTdGFnZWZyaWdodENvbnRleHQqKWF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3A8TWV0YURhdGE+IG1ldGEsIG91dEZvcm1hdDsKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gMDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhIHx8ICFhdmN0eC0+ZXh0cmFkYXRhX3NpemUgfHwgYXZjdHgtPmV4dHJhZGF0YVswXSAhPSAxKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIHMtPmJzZmMgID0gYXZfYml0c3RyZWFtX2ZpbHRlcl9pbml0KCJoMjY0X21wNHRvYW5uZXhiIik7CisgICAgaWYgKCFzLT5ic2ZjKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IG9wZW4gdGhlIGgyNjRfbXA0dG9hbm5leGIgQlNGIVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzLT5vcmlnX2V4dHJhZGF0YV9zaXplID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplOworICAgIHMtPm9yaWdfZXh0cmFkYXRhID0gKHVpbnQ4X3QqKSBhdl9tYWxsb2N6KGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFzLT5vcmlnX2V4dHJhZGF0YSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgbWVtY3B5KHMtPm9yaWdfZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBpZiAoIW1ldGEpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgYXZjdHgtPndpZHRoKTsKKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBhdmN0eC0+aGVpZ2h0KTsKKyAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisKKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisKKyAgICBzLT5zb3VyY2UgICAgPSBuZXcgc3A8TWVkaWFTb3VyY2U+KCk7CisgICAgKnMtPnNvdXJjZSAgID0gbmV3IEN1c3RvbVNvdXJjZShhdmN0eCwgbWV0YSk7CisgICAgcy0+aW5fcXVldWUgID0gbmV3IExpc3Q8RnJhbWUqPjsKKyAgICBzLT5vdXRfcXVldWUgPSBuZXcgTGlzdDxGcmFtZSo+OworICAgIHMtPnRzX21hcCAgICA9IG5ldyBzdGQ6Om1hcDxpbnQ2NF90LCBUaW1lU3RhbXA+OworICAgIHMtPmNsaWVudCAgICA9IG5ldyBPTVhDbGllbnQ7CisgICAgcy0+ZW5kX2ZyYW1lID0gKEZyYW1lKilhdl9tYWxsb2N6KHNpemVvZihGcmFtZSkpOworICAgIGlmIChzLT5zb3VyY2UgPT0gTlVMTCB8fCAhcy0+aW5fcXVldWUgfHwgIXMtPm91dF9xdWV1ZSB8fCAhcy0+Y2xpZW50IHx8CisgICAgICAgICFzLT50c19tYXAgfHwgIXMtPmVuZF9mcmFtZSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAocy0+Y2xpZW50LT5jb25uZWN0KCkgIT0gIE9LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGNvbm5lY3QgT01YIGNsaWVudFxuIik7CisgICAgICAgIHJldCA9IC0xOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcy0+ZGVjb2RlciAgPSBuZXcgc3A8TWVkaWFTb3VyY2U+KCk7CisgICAgKnMtPmRlY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKHMtPmNsaWVudC0+aW50ZXJmYWNlKCksIG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICpzLT5zb3VyY2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ29kZWM6OmtDbGllbnROZWVkc0ZyYW1lYnVmZmVyKTsKKyAgICBpZiAoKCpzLT5kZWNvZGVyKS0+c3RhcnQoKSAhPSAgT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3Qgc3RhcnQgZGVjb2RlclxuIik7CisgICAgICAgIHJldCA9IC0xOworICAgICAgICBzLT5jbGllbnQtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG91dEZvcm1hdCA9ICgqcy0+ZGVjb2RlciktPmdldEZvcm1hdCgpOworICAgIG91dEZvcm1hdC0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KTsKKyAgICBpZiAoY29sb3JGb3JtYXQgPT0gT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciB8fAorICAgICAgICBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX05WMjE7CisgICAgZWxzZSBpZiAoY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlDYllDcikKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVWVY0MjI7CisgICAgZWxzZSBpZiAoY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdENiWUNyWSkKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1VZVlk0MjI7CisgICAgZWxzZQorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKworICAgIG91dEZvcm1hdC0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZzLT5kZWNvZGVyX2NvbXBvbmVudCk7CisgICAgaWYgKHMtPmRlY29kZXJfY29tcG9uZW50KQorICAgICAgICBzLT5kZWNvZGVyX2NvbXBvbmVudCA9IGF2X3N0cmR1cChzLT5kZWNvZGVyX2NvbXBvbmVudCk7CisKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJnMtPmluX211dGV4LCBOVUxMKTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJnMtPm91dF9tdXRleCwgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX2luaXQoJnMtPmNvbmRpdGlvbiwgTlVMTCk7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfYml0c3RyZWFtX2ZpbHRlcl9jbG9zZShzLT5ic2ZjKTsKKyAgICBhdl9mcmVlcCgmcy0+b3JpZ19leHRyYWRhdGEpOworICAgIGF2X2ZyZWVwKCZzLT5lbmRfZnJhbWUpOworICAgIGRlbGV0ZSBzLT5pbl9xdWV1ZTsKKyAgICBkZWxldGUgcy0+b3V0X3F1ZXVlOworICAgIGRlbGV0ZSBzLT50c19tYXA7CisgICAgZGVsZXRlIHMtPmNsaWVudDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IFN0YWdlZnJpZ2h0X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFN0YWdlZnJpZ2h0Q29udGV4dCAqcyA9IChTdGFnZWZyaWdodENvbnRleHQqKWF2Y3R4LT5wcml2X2RhdGE7CisgICAgRnJhbWUgKmZyYW1lOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpbnQgb3JpZ19zaXplID0gYXZwa3QtPnNpemU7CisgICAgQVZQYWNrZXQgcGt0ID0gKmF2cGt0OworICAgIEFWRnJhbWUgKnJldF9mcmFtZTsKKworICAgIGlmICghcy0+dGhyZWFkX3N0YXJ0ZWQpIHsKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJnMtPmRlY29kZV90aHJlYWRfaWQsIE5VTEwsICZkZWNvZGVfdGhyZWFkLCBhdmN0eCk7CisgICAgICAgIHMtPnRocmVhZF9zdGFydGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoYXZwa3QgJiYgYXZwa3QtPmRhdGEpIHsKKyAgICAgICAgYXZfYml0c3RyZWFtX2ZpbHRlcl9maWx0ZXIocy0+YnNmYywgYXZjdHgsIE5VTEwsICZwa3QuZGF0YSwgJnBrdC5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUsIGF2cGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSk7CisgICAgICAgIGF2cGt0ID0gJnBrdDsKKyAgICB9CisKKyAgICBpZiAoIXMtPnNvdXJjZV9kb25lKSB7CisgICAgICAgIGlmKCFzLT5kdW1teV9idWYpIHsKKyAgICAgICAgICAgIHMtPmR1bW15X2J1ZiA9ICh1aW50OF90Kilhdl9tYWxsb2MoYXZwa3QtPnNpemUpOworICAgICAgICAgICAgaWYgKCFzLT5kdW1teV9idWYpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIHMtPmR1bW15X2J1ZnNpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICAgICAgICAgIG1lbWNweShzLT5kdW1teV9idWYsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBmcmFtZSA9IChGcmFtZSopYXZfbWFsbG9jeihzaXplb2YoRnJhbWUpKTsKKyAgICAgICAgaWYgKGF2cGt0LT5kYXRhKSB7CisgICAgICAgICAgICBmcmFtZS0+c3RhdHVzICA9IE9LOworICAgICAgICAgICAgZnJhbWUtPnNpemUgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICAgICAgICAgIGZyYW1lLT5rZXkgICAgID0gYXZwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZID8gMSA6IDA7CisgICAgICAgICAgICBmcmFtZS0+YnVmZmVyICA9ICh1aW50OF90Kilhdl9tYWxsb2MoYXZwa3QtPnNpemUpOworICAgICAgICAgICAgaWYgKCFmcmFtZS0+YnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmZyYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCAqcHRyID0gYXZwa3QtPmRhdGE7CisgICAgICAgICAgICAvLyBUaGUgT01YLlNFQyBkZWNvZGVyIGZhaWxzIHdpdGhvdXQgdGhpcy4KKyAgICAgICAgICAgIGlmIChhdnBrdC0+c2l6ZSA9PSBvcmlnX3NpemUgKyBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBwdHIgKz0gYXZjdHgtPmV4dHJhZGF0YV9zaXplOworICAgICAgICAgICAgICAgIGZyYW1lLT5zaXplID0gb3JpZ19zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGZyYW1lLT5idWZmZXIsIHB0ciwgb3JpZ19zaXplKTsKKyAgICAgICAgICAgIGlmIChhdnBrdCA9PSAmcGt0KQorICAgICAgICAgICAgICAgIGF2X2ZyZWUoYXZwa3QtPmRhdGEpOworCisgICAgICAgICAgICBmcmFtZS0+dGltZSA9ICsrcy0+ZnJhbWVfaW5kZXg7CisgICAgICAgICAgICAoKnMtPnRzX21hcClbcy0+ZnJhbWVfaW5kZXhdLnB0cyA9IGF2cGt0LT5wdHM7CisgICAgICAgICAgICAoKnMtPnRzX21hcClbcy0+ZnJhbWVfaW5kZXhdLnJlb3JkZXJlZF9vcGFxdWUgPSBhdmN0eC0+cmVvcmRlcmVkX29wYXF1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lLT5zdGF0dXMgID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHMtPnNvdXJjZV9kb25lID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAocy0+dGhyZWFkX2V4aXRlZCkgeworICAgICAgICAgICAgICAgIHMtPnNvdXJjZV9kb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcy0+aW5fbXV0ZXgpOworICAgICAgICAgICAgaWYgKHMtPmluX3F1ZXVlLT5zaXplKCkgPj0gMTApIHsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcy0+aW5fbXV0ZXgpOworICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5pbl9xdWV1ZS0+cHVzaF9iYWNrKGZyYW1lKTsKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnMtPmNvbmRpdGlvbik7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcy0+aW5fbXV0ZXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5vdXRfbXV0ZXgpOworICAgICAgICBpZiAoIXMtPm91dF9xdWV1ZS0+ZW1wdHkoKSkgYnJlYWs7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5vdXRfbXV0ZXgpOworICAgICAgICBpZiAocy0+c291cmNlX2RvbmUpIHsKKyAgICAgICAgICAgIHVzbGVlcCgxMDAwMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnX3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmFtZSA9ICpzLT5vdXRfcXVldWUtPmJlZ2luKCk7CisgICAgcy0+b3V0X3F1ZXVlLT5lcmFzZShzLT5vdXRfcXVldWUtPmJlZ2luKCkpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5vdXRfbXV0ZXgpOworCisgICAgcmV0X2ZyYW1lID0gZnJhbWUtPnZmcmFtZTsKKyAgICBzdGF0dXMgID0gZnJhbWUtPnN0YXR1czsKKyAgICBhdl9mcmVlcCgmZnJhbWUpOworCisgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gQVZFUlJPUihFTk9NRU0pKQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEZWNvZGUgZmFpbGVkOiAleFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT5wcmV2X2ZyYW1lKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2X2ZyYW1lKTsKKyAgICBzLT5wcmV2X2ZyYW1lID0gcmV0X2ZyYW1lOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgKihBVkZyYW1lKilkYXRhID0gKnJldF9mcmFtZTsKKyAgICByZXR1cm4gb3JpZ19zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgU3RhZ2VmcmlnaHRfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFN0YWdlZnJpZ2h0Q29udGV4dCAqcyA9IChTdGFnZWZyaWdodENvbnRleHQqKWF2Y3R4LT5wcml2X2RhdGE7CisgICAgRnJhbWUgKmZyYW1lOworCisgICAgaWYgKHMtPnRocmVhZF9zdGFydGVkKSB7CisgICAgICAgIGlmICghcy0+dGhyZWFkX2V4aXRlZCkgeworICAgICAgICAgICAgcy0+c3RvcF9kZWNvZGUgPSAxOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgZGVjb2RlX3RocmVhZCgpIGRvZXNuJ3QgZ2V0IHN0dWNrCisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnMtPm91dF9tdXRleCk7CisgICAgICAgICAgICB3aGlsZSAoIXMtPm91dF9xdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZyYW1lID0gKnMtPm91dF9xdWV1ZS0+YmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzLT5vdXRfcXVldWUtPmVyYXNlKHMtPm91dF9xdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lLT52ZnJhbWUpCisgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lLT52ZnJhbWUpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZmcmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcy0+b3V0X211dGV4KTsKKworICAgICAgICAgICAgLy8gRmVlZCBhIGR1bW15IGZyYW1lIHByaW9yIHRvIHNpZ25hbGxpbmcgRU9GLgorICAgICAgICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCB0byB0ZXJtaW5hdGUgdGhlIGRlY29kZXIoT01YLlNFQykKKyAgICAgICAgICAgIC8vIHdoZW4gb25seSBvbmUgZnJhbWUgaXMgcmVhZCBkdXJpbmcgc3RyZWFtIGluZm8gZGV0ZWN0aW9uLgorICAgICAgICAgICAgaWYgKHMtPmR1bW15X2J1ZiAmJiAoZnJhbWUgPSAoRnJhbWUqKWF2X21hbGxvY3ooc2l6ZW9mKEZyYW1lKSkpKSB7CisgICAgICAgICAgICAgICAgZnJhbWUtPnN0YXR1cyA9IE9LOworICAgICAgICAgICAgICAgIGZyYW1lLT5zaXplICAgPSBzLT5kdW1teV9idWZzaXplOworICAgICAgICAgICAgICAgIGZyYW1lLT5rZXkgICAgPSAxOworICAgICAgICAgICAgICAgIGZyYW1lLT5idWZmZXIgPSBzLT5kdW1teV9idWY7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5pbl9tdXRleCk7CisgICAgICAgICAgICAgICAgcy0+aW5fcXVldWUtPnB1c2hfYmFjayhmcmFtZSk7CisgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcy0+Y29uZGl0aW9uKTsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcy0+aW5fbXV0ZXgpOworICAgICAgICAgICAgICAgIHMtPmR1bW15X2J1ZiA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcy0+aW5fbXV0ZXgpOworICAgICAgICAgICAgcy0+ZW5kX2ZyYW1lLT5zdGF0dXMgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcy0+aW5fcXVldWUtPnB1c2hfYmFjayhzLT5lbmRfZnJhbWUpOworICAgICAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcy0+Y29uZGl0aW9uKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5pbl9tdXRleCk7CisgICAgICAgICAgICBzLT5lbmRfZnJhbWUgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcHRocmVhZF9qb2luKHMtPmRlY29kZV90aHJlYWRfaWQsIE5VTEwpOworCisgICAgICAgIGlmIChzLT5wcmV2X2ZyYW1lKQorICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+cHJldl9mcmFtZSk7CisKKyAgICAgICAgcy0+dGhyZWFkX3N0YXJ0ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAoIXMtPmluX3F1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgIGZyYW1lID0gKnMtPmluX3F1ZXVlLT5iZWdpbigpOworICAgICAgICBzLT5pbl9xdWV1ZS0+ZXJhc2Uocy0+aW5fcXVldWUtPmJlZ2luKCkpOworICAgICAgICBpZiAoZnJhbWUtPnNpemUpCisgICAgICAgICAgICBhdl9mcmVlcCgmZnJhbWUtPmJ1ZmZlcik7CisgICAgICAgIGF2X2ZyZWVwKCZmcmFtZSk7CisgICAgfQorCisgICAgd2hpbGUgKCFzLT5vdXRfcXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgZnJhbWUgPSAqcy0+b3V0X3F1ZXVlLT5iZWdpbigpOworICAgICAgICBzLT5vdXRfcXVldWUtPmVyYXNlKHMtPm91dF9xdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgIGlmIChmcmFtZS0+dmZyYW1lKQorICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUtPnZmcmFtZSk7CisgICAgICAgIGF2X2ZyZWVwKCZmcmFtZSk7CisgICAgfQorCisgICAgKCpzLT5kZWNvZGVyKS0+c3RvcCgpOworICAgIHMtPmNsaWVudC0+ZGlzY29ubmVjdCgpOworCisgICAgaWYgKHMtPmRlY29kZXJfY29tcG9uZW50KQorICAgICAgICBhdl9mcmVlcCgmcy0+ZGVjb2Rlcl9jb21wb25lbnQpOworICAgIGF2X2ZyZWVwKCZzLT5kdW1teV9idWYpOworICAgIGF2X2ZyZWVwKCZzLT5lbmRfZnJhbWUpOworCisgICAgLy8gUmVzZXQgdGhlIGV4dHJhZGF0YSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtcDQgZm9ybWF0LCBzbyB0aGF0CisgICAgLy8gdGhlIG5leHQgaW52b2NhdGlvbiAoYm90aCB3aGVuIGRlY29kaW5nIGFuZCB3aGVuIGNhbGxlZCBmcm9tCisgICAgLy8gYXZfZmluZF9zdHJlYW1faW5mbykgZ2V0IHRoZSBvcmlnaW5hbCBtcDQgZm9ybWF0IGV4dHJhZGF0YS4KKyAgICBhdl9mcmVlcCgmYXZjdHgtPmV4dHJhZGF0YSk7CisgICAgYXZjdHgtPmV4dHJhZGF0YSA9IHMtPm9yaWdfZXh0cmFkYXRhOworICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHMtPm9yaWdfZXh0cmFkYXRhX3NpemU7CisKKyAgICBkZWxldGUgcy0+aW5fcXVldWU7CisgICAgZGVsZXRlIHMtPm91dF9xdWV1ZTsKKyAgICBkZWxldGUgcy0+dHNfbWFwOworICAgIGRlbGV0ZSBzLT5jbGllbnQ7CisgICAgZGVsZXRlIHMtPmRlY29kZXI7CisgICAgZGVsZXRlIHMtPnNvdXJjZTsKKworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcy0+aW5fbXV0ZXgpOworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcy0+b3V0X211dGV4KTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcy0+Y29uZGl0aW9uKTsKKyAgICBhdl9iaXRzdHJlYW1fZmlsdGVyX2Nsb3NlKHMtPmJzZmMpOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2xpYnN0YWdlZnJpZ2h0X2gyNjRfZGVjb2RlciA9IHsKKyAgICAibGlic3RhZ2VmcmlnaHRfaDI2NCIsCisgICAgTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYnN0YWdlZnJpZ2h0IEguMjY0IiksCisgICAgQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIEFWX0NPREVDX0lEX0gyNjQsCisgICAgQ09ERUNfQ0FQX0RFTEFZLAorICAgIE5VTEwsIC8vc3VwcG9ydGVkX2ZyYW1lcmF0ZXMKKyAgICBOVUxMLCAvL3BpeF9mbXRzCisgICAgTlVMTCwgLy9zdXBwb3J0ZWRfc2FtcGxlcmF0ZXMKKyAgICBOVUxMLCAvL3NhbXBsZV9mbXRzCisgICAgTlVMTCwgLy9jaGFubmVsX2xheW91dHMKKyAgICAwLCAgICAvL21heF9sb3dyZXMKKyAgICBOVUxMLCAvL3ByaXZfY2xhc3MKKyAgICBOVUxMLCAvL3Byb2ZpbGVzCisgICAgc2l6ZW9mKFN0YWdlZnJpZ2h0Q29udGV4dCksCisgICAgTlVMTCwgLy9uZXh0CisgICAgTlVMTCwgLy9pbml0X3RocmVhZF9jb3B5CisgICAgTlVMTCwgLy91cGRhdGVfdGhyZWFkX2NvbnRleHQKKyAgICBOVUxMLCAvL2RlZmF1bHRzCisgICAgTlVMTCwgLy9pbml0X3N0YXRpY19kYXRhCisgICAgU3RhZ2VmcmlnaHRfaW5pdCwKKyAgICBOVUxMLCAvL2VuY29kZQorICAgIE5VTEwsIC8vZW5jb2RlMgorICAgIFN0YWdlZnJpZ2h0X2RlY29kZV9mcmFtZSwKKyAgICBTdGFnZWZyaWdodF9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJ0aGVvcmFlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnRoZW9yYWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTA4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ0aGVvcmFlbmMuYwpAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBQYXVsIFJpY2hhcmRzIDxwYXVsLnJpY2hhcmRzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIFRoZW9yYSBlbmNvZGVyIHVzaW5nIGxpYnRoZW9yYS4KKyAqIEBhdXRob3IgUGF1bCBSaWNoYXJkcyA8cGF1bC5yaWNoYXJkc0BnbWFpbC5jb20+CisgKgorICogQSBsb3Qgb2YgdGhpcyBpcyBjb3B5IC8gcGFzdGUgZnJvbSBvdGhlciBvdXRwdXQgY29kZWNzIGluCisgKiBsaWJhdmNvZGVjIG9yIHB1cmUgZ3Vlc3N3b3JrIChvciBib3RoKS4KKyAqCisgKiBJIGhhdmUgdXNlZCB0XyBwcmVmaXhlcyBvbiB2YXJpYWJsZXMgd2hpY2ggYXJlIGxpYnRoZW9yYSB0eXBlcworICogYW5kIG9fIHByZWZpeGVzIG9uIHZhcmlhYmxlcyB3aGljaCBhcmUgbGlib2dnIHR5cGVzLgorICovCisKKy8qIEZGbXBlZyBpbmNsdWRlcyAqLworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jhc2U2NC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKiBsaWJ0aGVvcmEgaW5jbHVkZXMgKi8KKyNpbmNsdWRlIDx0aGVvcmEvdGhlb3JhZW5jLmg+CisKK3R5cGVkZWYgc3RydWN0IFRoZW9yYUNvbnRleHQgeworICAgIHRoX2VuY19jdHggKnRfc3RhdGU7CisgICAgdWludDhfdCAgICAqc3RhdHM7CisgICAgaW50ICAgICAgICAgc3RhdHNfc2l6ZTsKKyAgICBpbnQgICAgICAgICBzdGF0c19vZmZzZXQ7CisgICAgaW50ICAgICAgICAgdXZfaHNoaWZ0OworICAgIGludCAgICAgICAgIHV2X3ZzaGlmdDsKKyAgICBpbnQgICAgICAgICBrZXlmcmFtZV9tYXNrOworfSBUaGVvcmFDb250ZXh0OworCisvKiogQ29uY2F0ZW5hdGUgYW4gb2dnX3BhY2tldCBpbnRvIHRoZSBleHRyYWRhdGEuICovCitzdGF0aWMgaW50IGNvbmNhdGVuYXRlX3BhY2tldCh1bnNpZ25lZCBpbnQqIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0KiBhdmNfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9nZ19wYWNrZXQqIHBhY2tldCkKK3sKKyAgICBjb25zdCBjaGFyKiBtZXNzYWdlID0gTlVMTDsKKyAgICBpbnQgbmV3c2l6ZSA9IGF2Y19jb250ZXh0LT5leHRyYWRhdGFfc2l6ZSArIDIgKyBwYWNrZXQtPmJ5dGVzOworICAgIGludCBlcnIgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKHBhY2tldC0+Ynl0ZXMgPCAwKSB7CisgICAgICAgIG1lc3NhZ2UgPSAib2dnX3BhY2tldCBoYXMgbmVnYXRpdmUgc2l6ZSI7CisgICAgfSBlbHNlIGlmIChwYWNrZXQtPmJ5dGVzID4gMHhmZmZmKSB7CisgICAgICAgIG1lc3NhZ2UgPSAib2dnX3BhY2tldCBpcyBsYXJnZXIgdGhhbiA2NTUzNSBieXRlcyI7CisgICAgfSBlbHNlIGlmIChuZXdzaXplIDwgYXZjX2NvbnRleHQtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgIG1lc3NhZ2UgPSAiZXh0cmFkYXRhX3NpemUgd291bGQgb3ZlcmZsb3ciOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoZXJyID0gYXZfcmVhbGxvY3AoJmF2Y19jb250ZXh0LT5leHRyYWRhdGEsIG5ld3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgIGF2Y19jb250ZXh0LT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICBtZXNzYWdlID0gImF2X3JlYWxsb2MgZmFpbGVkIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobWVzc2FnZSkgeworICAgICAgICBhdl9sb2coYXZjX2NvbnRleHQsIEFWX0xPR19FUlJPUiwgImNvbmNhdGVuYXRlX3BhY2tldCBmYWlsZWQ6ICVzXG4iLCBtZXNzYWdlKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBhdmNfY29udGV4dC0+ZXh0cmFkYXRhX3NpemUgPSBuZXdzaXplOworICAgIEFWX1dCMTYoYXZjX2NvbnRleHQtPmV4dHJhZGF0YSArICgqb2Zmc2V0KSwgcGFja2V0LT5ieXRlcyk7CisgICAgKm9mZnNldCArPSAyOworICAgIG1lbWNweShhdmNfY29udGV4dC0+ZXh0cmFkYXRhICsgKCpvZmZzZXQpLCBwYWNrZXQtPnBhY2tldCwgcGFja2V0LT5ieXRlcyk7CisgICAgKCpvZmZzZXQpICs9IHBhY2tldC0+Ynl0ZXM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3N0YXRzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGVvcykKK3sKKyNpZmRlZiBUSF9FTkNDVExfMlBBU1NfT1VUCisgICAgVGhlb3JhQ29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqYnVmOworICAgIGludCBieXRlczsKKworICAgIGJ5dGVzID0gdGhfZW5jb2RlX2N0bChoLT50X3N0YXRlLCBUSF9FTkNDVExfMlBBU1NfT1VULCAmYnVmLCBzaXplb2YoYnVmKSk7CisgICAgaWYgKGJ5dGVzIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGdldHRpbmcgZmlyc3QgcGFzcyBzdGF0c1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyAgICBpZiAoIWVvcykgeworICAgICAgICBoLT5zdGF0cyA9IGF2X2Zhc3RfcmVhbGxvYyhoLT5zdGF0cywgJmgtPnN0YXRzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnN0YXRzX29mZnNldCArIGJ5dGVzKTsKKyAgICAgICAgbWVtY3B5KGgtPnN0YXRzICsgaC0+c3RhdHNfb2Zmc2V0LCBidWYsIGJ5dGVzKTsKKyAgICAgICAgaC0+c3RhdHNfb2Zmc2V0ICs9IGJ5dGVzOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBiNjRfc2l6ZSA9IEFWX0JBU0U2NF9TSVpFKGgtPnN0YXRzX29mZnNldCk7CisgICAgICAgIC8vIGxpYnRoZW9yYSBnZW5lcmF0ZXMgYSBzdW1tYXJ5IGhlYWRlciBhdCB0aGUgZW5kCisgICAgICAgIG1lbWNweShoLT5zdGF0cywgYnVmLCBieXRlcyk7CisgICAgICAgIGF2Y3R4LT5zdGF0c19vdXQgPSBhdl9tYWxsb2MoYjY0X3NpemUpOworICAgICAgICBhdl9iYXNlNjRfZW5jb2RlKGF2Y3R4LT5zdGF0c19vdXQsIGI2NF9zaXplLCBoLT5zdGF0cywgaC0+c3RhdHNfb2Zmc2V0KTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisjZWxzZQorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibGlidGhlb3JhIHRvbyBvbGQgdG8gc3VwcG9ydCAycGFzc1xuIik7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1VQKTsKKyNlbmRpZgorfQorCisvLyBsaWJ0aGVvcmEgd29uJ3QgcmVhZCB0aGUgZW50aXJlIGJ1ZmZlciB3ZSBnaXZlIGl0IGF0IG9uY2UsIHNvIHdlIGhhdmUgdG8KKy8vIHJlcGVhdGVkbHkgc3VibWl0IGl0Li4uCitzdGF0aWMgaW50IHN1Ym1pdF9zdGF0cyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisjaWZkZWYgVEhfRU5DQ1RMXzJQQVNTX0lOCisgICAgVGhlb3JhQ29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGJ5dGVzOworICAgIGlmICghaC0+c3RhdHMpIHsKKyAgICAgICAgaWYgKCFhdmN0eC0+c3RhdHNfaW4pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gc3RhdHNmaWxlIGZvciBzZWNvbmQgcGFzc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGgtPnN0YXRzX3NpemUgPSBzdHJsZW4oYXZjdHgtPnN0YXRzX2luKSAqIDMvNDsKKyAgICAgICAgaC0+c3RhdHMgICAgICA9IGF2X21hbGxvYyhoLT5zdGF0c19zaXplKTsKKyAgICAgICAgaC0+c3RhdHNfc2l6ZSA9IGF2X2Jhc2U2NF9kZWNvZGUoaC0+c3RhdHMsIGF2Y3R4LT5zdGF0c19pbiwgaC0+c3RhdHNfc2l6ZSk7CisgICAgfQorICAgIHdoaWxlIChoLT5zdGF0c19zaXplIC0gaC0+c3RhdHNfb2Zmc2V0ID4gMCkgeworICAgICAgICBieXRlcyA9IHRoX2VuY29kZV9jdGwoaC0+dF9zdGF0ZSwgVEhfRU5DQ1RMXzJQQVNTX0lOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c3RhdHMgKyBoLT5zdGF0c19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5zdGF0c19zaXplIC0gaC0+c3RhdHNfb2Zmc2V0KTsKKyAgICAgICAgaWYgKGJ5dGVzIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBzdWJtaXR0aW5nIHN0YXRzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICB9CisgICAgICAgIGlmICghYnl0ZXMpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaC0+c3RhdHNfb2Zmc2V0ICs9IGJ5dGVzOworICAgIH0KKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJsaWJ0aGVvcmEgdG9vIG9sZCB0byBzdXBwb3J0IDJwYXNzXG4iKTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TVVApOworI2VuZGlmCit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCogYXZjX2NvbnRleHQpCit7CisgICAgdGhfaW5mbyB0X2luZm87CisgICAgdGhfY29tbWVudCB0X2NvbW1lbnQ7CisgICAgb2dnX3BhY2tldCBvX3BhY2tldDsKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworICAgIFRoZW9yYUNvbnRleHQgKmggPSBhdmNfY29udGV4dC0+cHJpdl9kYXRhOworICAgIHVpbnQzMl90IGdvcF9zaXplID0gYXZjX2NvbnRleHQtPmdvcF9zaXplOworICAgIGludCByZXQ7CisKKyAgICAvKiBTZXQgdXAgdGhlIHRoZW9yYV9pbmZvIHN0cnVjdCAqLworICAgIHRoX2luZm9faW5pdCgmdF9pbmZvKTsKKyAgICB0X2luZm8uZnJhbWVfd2lkdGggID0gRkZBTElHTihhdmNfY29udGV4dC0+d2lkdGgsICAxNik7CisgICAgdF9pbmZvLmZyYW1lX2hlaWdodCA9IEZGQUxJR04oYXZjX2NvbnRleHQtPmhlaWdodCwgMTYpOworICAgIHRfaW5mby5waWNfd2lkdGggICAgPSBhdmNfY29udGV4dC0+d2lkdGg7CisgICAgdF9pbmZvLnBpY19oZWlnaHQgICA9IGF2Y19jb250ZXh0LT5oZWlnaHQ7CisgICAgdF9pbmZvLnBpY194ICAgICAgICA9IDA7CisgICAgdF9pbmZvLnBpY195ICAgICAgICA9IDA7CisgICAgLyogU3dhcCBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIGFzIHRpbWVfYmFzZSBpbiBBVkNvZGVjQ29udGV4dCBnaXZlcyB0aGUKKyAgICAgKiB0aW1lIHBlcmlvZCBiZXR3ZWVuIGZyYW1lcywgYnV0IHRoZW9yYV9pbmZvIG5lZWRzIHRoZSBmcmFtZXJhdGUuICAqLworICAgIHRfaW5mby5mcHNfbnVtZXJhdG9yICAgPSBhdmNfY29udGV4dC0+dGltZV9iYXNlLmRlbjsKKyAgICB0X2luZm8uZnBzX2Rlbm9taW5hdG9yID0gYXZjX2NvbnRleHQtPnRpbWVfYmFzZS5udW07CisgICAgaWYgKGF2Y19jb250ZXh0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkgeworICAgICAgICB0X2luZm8uYXNwZWN0X251bWVyYXRvciAgID0gYXZjX2NvbnRleHQtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtOworICAgICAgICB0X2luZm8uYXNwZWN0X2Rlbm9taW5hdG9yID0gYXZjX2NvbnRleHQtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHRfaW5mby5hc3BlY3RfbnVtZXJhdG9yICAgPSAxOworICAgICAgICB0X2luZm8uYXNwZWN0X2Rlbm9taW5hdG9yID0gMTsKKyAgICB9CisKKyAgICBpZiAoYXZjX2NvbnRleHQtPmNvbG9yX3ByaW1hcmllcyA9PSBBVkNPTF9QUklfQlQ0NzBNKQorICAgICAgICB0X2luZm8uY29sb3JzcGFjZSA9IFRIX0NTX0lUVV9SRUNfNDcwTTsKKyAgICBlbHNlIGlmIChhdmNfY29udGV4dC0+Y29sb3JfcHJpbWFyaWVzID09IEFWQ09MX1BSSV9CVDQ3MEJHKQorICAgICAgICB0X2luZm8uY29sb3JzcGFjZSA9IFRIX0NTX0lUVV9SRUNfNDcwQkc7CisgICAgZWxzZQorICAgICAgICB0X2luZm8uY29sb3JzcGFjZSA9IFRIX0NTX1VOU1BFQ0lGSUVEOworCisgICAgaWYgKGF2Y19jb250ZXh0LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkKKyAgICAgICAgdF9pbmZvLnBpeGVsX2ZtdCA9IFRIX1BGXzQyMDsKKyAgICBlbHNlIGlmIChhdmNfY29udGV4dC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlApCisgICAgICAgIHRfaW5mby5waXhlbF9mbXQgPSBUSF9QRl80MjI7CisgICAgZWxzZSBpZiAoYXZjX2NvbnRleHQtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQKQorICAgICAgICB0X2luZm8ucGl4ZWxfZm10ID0gVEhfUEZfNDQ0OworICAgIGVsc2UgeworICAgICAgICBhdl9sb2coYXZjX2NvbnRleHQsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHBpeF9mbXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmNfY29udGV4dC0+cGl4X2ZtdCwgJmgtPnV2X2hzaGlmdCwgJmgtPnV2X3ZzaGlmdCk7CisKKyAgICBpZiAoYXZjX2NvbnRleHQtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpIHsKKyAgICAgICAgLyogQ2xpcCBnbG9iYWxfcXVhbGl0eSBpbiBRUCB1bml0cyB0byB0aGUgWzAgLSAxMF0gcmFuZ2UKKyAgICAgICAgICAgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBsaWJ2b3JiaXMgaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgIFRoZW9yYSBhY2NlcHRzIGEgcXVhbGl0eSBwYXJhbWV0ZXIgd2hpY2ggaXMgYW4gaW50IHZhbHVlIGluCisgICAgICAgICAgIHRoZSBbMCAtIDYzXSByYW5nZS4KKyAgICAgICAgKi8KKyAgICAgICAgdF9pbmZvLnF1YWxpdHkgICAgICAgID0gYXZfY2xpcGYoYXZjX2NvbnRleHQtPmdsb2JhbF9xdWFsaXR5IC8gKGZsb2F0KUZGX1FQMkxBTUJEQSwgMCwgMTApICogNi4zOworICAgICAgICB0X2luZm8udGFyZ2V0X2JpdHJhdGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHRfaW5mby50YXJnZXRfYml0cmF0ZSA9IGF2Y19jb250ZXh0LT5iaXRfcmF0ZTsKKyAgICAgICAgdF9pbmZvLnF1YWxpdHkgICAgICAgID0gMDsKKyAgICB9CisKKyAgICAvKiBOb3cgaW5pdGlhbGlzZSBsaWJ0aGVvcmEgKi8KKyAgICBoLT50X3N0YXRlID0gdGhfZW5jb2RlX2FsbG9jKCZ0X2luZm8pOworICAgIGlmICghaC0+dF9zdGF0ZSkgeworICAgICAgICBhdl9sb2coYXZjX2NvbnRleHQsIEFWX0xPR19FUlJPUiwgInRoZW9yYV9lbmNvZGVfaW5pdCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBoLT5rZXlmcmFtZV9tYXNrID0gKDEgPDwgdF9pbmZvLmtleWZyYW1lX2dyYW51bGVfc2hpZnQpIC0gMTsKKyAgICAvKiBDbGVhciB1cCB0aGVvcmFfaW5mbyBzdHJ1Y3QgKi8KKyAgICB0aF9pbmZvX2NsZWFyKCZ0X2luZm8pOworCisgICAgaWYgKHRoX2VuY29kZV9jdGwoaC0+dF9zdGF0ZSwgVEhfRU5DQ1RMX1NFVF9LRVlGUkFNRV9GUkVRVUVOQ1lfRk9SQ0UsCisgICAgICAgICAgICAgICAgICAgICAgJmdvcF9zaXplLCBzaXplb2YoZ29wX3NpemUpKSkgeworICAgICAgICBhdl9sb2coYXZjX2NvbnRleHQsIEFWX0xPR19FUlJPUiwgIkVycm9yIHNldHRpbmcgR09QIHNpemVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICAvLyBuZWVkIHRvIGVuYWJsZSAyIHBhc3MgKHZpYSBUSF9FTkNDVExfMlBBU1NfKSBiZWZvcmUgZW5jb2RpbmcgaGVhZGVycworICAgIGlmIChhdmNfY29udGV4dC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1BBU1MxKSB7CisgICAgICAgIGlmICgocmV0ID0gZ2V0X3N0YXRzKGF2Y19jb250ZXh0LCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKGF2Y19jb250ZXh0LT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzIpIHsKKyAgICAgICAgaWYgKChyZXQgPSBzdWJtaXRfc3RhdHMoYXZjX2NvbnRleHQpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qCisgICAgICAgIE91dHB1dCBmaXJzdCBoZWFkZXIgcGFja2V0IGNvbnNpc3Rpbmcgb2YgdGhlb3JhCisgICAgICAgIGhlYWRlciwgY29tbWVudCwgYW5kIHRhYmxlcy4KKworICAgICAgICBFYWNoIG9uZSBpcyBwcmVmaXhlZCB3aXRoIGEgMTZiaXQgc2l6ZSwgdGhlbiB0aGV5CisgICAgICAgIGFyZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgaW50byBsaWJhdmNvZGVjJ3MgZXh0cmFkYXRhLgorICAgICovCisgICAgb2Zmc2V0ID0gMDsKKworICAgIC8qIEhlYWRlcnMgKi8KKyAgICB0aF9jb21tZW50X2luaXQoJnRfY29tbWVudCk7CisKKyAgICB3aGlsZSAodGhfZW5jb2RlX2ZsdXNoaGVhZGVyKGgtPnRfc3RhdGUsICZ0X2NvbW1lbnQsICZvX3BhY2tldCkpCisgICAgICAgIGlmICgocmV0ID0gY29uY2F0ZW5hdGVfcGFja2V0KCZvZmZzZXQsIGF2Y19jb250ZXh0LCAmb19wYWNrZXQpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgdGhfY29tbWVudF9jbGVhcigmdF9jb21tZW50KTsKKworICAgIC8qIFNldCB1cCB0aGUgb3V0cHV0IEFWRnJhbWUgKi8KKyAgICBhdmNfY29udGV4dC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0KiBhdmNfY29udGV4dCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgdGhfeWNiY3JfYnVmZmVyIHRfeXV2X2J1ZmZlcjsKKyAgICBUaGVvcmFDb250ZXh0ICpoID0gYXZjX2NvbnRleHQtPnByaXZfZGF0YTsKKyAgICBvZ2dfcGFja2V0IG9fcGFja2V0OworICAgIGludCByZXN1bHQsIGksIHJldDsKKworICAgIC8vIEVPUywgZmluaXNoIGFuZCBnZXQgMXN0IHBhc3Mgc3RhdHMgaWYgYXBwbGljYWJsZQorICAgIGlmICghZnJhbWUpIHsKKyAgICAgICAgdGhfZW5jb2RlX3BhY2tldG91dChoLT50X3N0YXRlLCAxLCAmb19wYWNrZXQpOworICAgICAgICBpZiAoYXZjX2NvbnRleHQtPmZsYWdzICYgQ09ERUNfRkxBR19QQVNTMSkKKyAgICAgICAgICAgIGlmICgocmV0ID0gZ2V0X3N0YXRzKGF2Y19jb250ZXh0LCAxKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIENvcHkgcGxhbmVzIHRvIHRoZSB0aGVvcmEgeXV2X2J1ZmZlciAqLworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgdF95dXZfYnVmZmVyW2ldLndpZHRoICA9IEZGQUxJR04oYXZjX2NvbnRleHQtPndpZHRoLCAgMTYpID4+IChpICYmIGgtPnV2X2hzaGlmdCk7CisgICAgICAgIHRfeXV2X2J1ZmZlcltpXS5oZWlnaHQgPSBGRkFMSUdOKGF2Y19jb250ZXh0LT5oZWlnaHQsIDE2KSA+PiAoaSAmJiBoLT51dl92c2hpZnQpOworICAgICAgICB0X3l1dl9idWZmZXJbaV0uc3RyaWRlID0gZnJhbWUtPmxpbmVzaXplW2ldOworICAgICAgICB0X3l1dl9idWZmZXJbaV0uZGF0YSAgID0gZnJhbWUtPmRhdGFbaV07CisgICAgfQorCisgICAgaWYgKGF2Y19jb250ZXh0LT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzIpCisgICAgICAgIGlmICgocmV0ID0gc3VibWl0X3N0YXRzKGF2Y19jb250ZXh0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIE5vdyBjYWxsIGludG8gdGhlb3JhX2VuY29kZV9ZVVZpbiAqLworICAgIHJlc3VsdCA9IHRoX2VuY29kZV95Y2Jjcl9pbihoLT50X3N0YXRlLCB0X3l1dl9idWZmZXIpOworICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZTsKKyAgICAgICAgc3dpdGNoIChyZXN1bHQpIHsKKyAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiZGlmZmVyaW5nIGZyYW1lIHNpemVzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRIX0VJTlZBTDoKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiZW5jb2RlciBpcyBub3QgcmVhZHkgb3IgaXMgZmluaXNoZWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtZXNzYWdlID0gInVua25vd24gcmVhc29uIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhhdmNfY29udGV4dCwgQVZfTE9HX0VSUk9SLCAidGhlb3JhX2VuY29kZV9ZVVZpbiBmYWlsZWQgKCVzKSBbJWRdXG4iLCBtZXNzYWdlLCByZXN1bHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBpZiAoYXZjX2NvbnRleHQtPmZsYWdzICYgQ09ERUNfRkxBR19QQVNTMSkKKyAgICAgICAgaWYgKChyZXQgPSBnZXRfc3RhdHMoYXZjX2NvbnRleHQsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogUGljayB1cCByZXR1cm5lZCBvZ2dfcGFja2V0ICovCisgICAgcmVzdWx0ID0gdGhfZW5jb2RlX3BhY2tldG91dChoLT50X3N0YXRlLCAwLCAmb19wYWNrZXQpOworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgY2FzZSAwOgorICAgICAgICAvKiBObyBwYWNrZXQgaXMgcmVhZHkgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSAxOgorICAgICAgICAvKiBTdWNjZXNzLCB3ZSBoYXZlIGEgcGFja2V0ICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmNfY29udGV4dCwgQVZfTE9HX0VSUk9SLCAidGhlb3JhX2VuY29kZV9wYWNrZXRvdXQgZmFpbGVkIFslZF1cbiIsIHJlc3VsdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIC8qIENvcHkgb2dnX3BhY2tldCBjb250ZW50IG91dCB0byBidWZmZXIgKi8KKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjX2NvbnRleHQsIHBrdCwgb19wYWNrZXQuYnl0ZXMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgbWVtY3B5KHBrdC0+ZGF0YSwgb19wYWNrZXQucGFja2V0LCBvX3BhY2tldC5ieXRlcyk7CisKKyAgICAvLyBIQUNLOiBhc3N1bWVzIG5vIGVuY29kZXIgZGVsYXksIHRoaXMgaXMgdHJ1ZSB1bnRpbCBsaWJ0aGVvcmEgYmVjb21lcworICAgIC8vIG11bHRpdGhyZWFkZWQgKHdoaWNoIHdpbGwgYmUgZGlzYWJsZWQgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWVzdGVkKQorICAgIHBrdC0+cHRzID0gcGt0LT5kdHMgPSBmcmFtZS0+cHRzOworICAgIGF2Y19jb250ZXh0LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gIShvX3BhY2tldC5ncmFudWxlcG9zICYgaC0+a2V5ZnJhbWVfbWFzayk7CisgICAgaWYgKGF2Y19jb250ZXh0LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lKQorICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGVuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCogYXZjX2NvbnRleHQpCit7CisgICAgVGhlb3JhQ29udGV4dCAqaCA9IGF2Y19jb250ZXh0LT5wcml2X2RhdGE7CisKKyAgICB0aF9lbmNvZGVfZnJlZShoLT50X3N0YXRlKTsKKyAgICBhdl9mcmVlcCgmaC0+c3RhdHMpOworICAgIGF2X2ZyZWVwKCZhdmNfY29udGV4dC0+Y29kZWRfZnJhbWUpOworICAgIGF2X2ZyZWVwKCZhdmNfY29udGV4dC0+c3RhdHNfb3V0KTsKKyAgICBhdl9mcmVlcCgmYXZjX2NvbnRleHQtPmV4dHJhZGF0YSk7CisgICAgYXZjX2NvbnRleHQtPmV4dHJhZGF0YV9zaXplID0gMDsKKworICAgIHJldHVybiAwOworfQorCisvKiogQVZDb2RlYyBzdHJ1Y3QgZXhwb3NlZCB0byBsaWJhdmNvZGVjICovCitBVkNvZGVjIGZmX2xpYnRoZW9yYV9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJ0aGVvcmEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJ0aGVvcmEgVGhlb3JhIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1RIRU9SQSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVGhlb3JhQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZW5jb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZW5jb2RlX2Nsb3NlLAorICAgIC5lbmNvZGUyICAgICAgICA9IGVuY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfREVMQVksIC8vIG5lZWRlZCB0byBnZXQgdGhlIHN0YXRzZmlsZSBzdW1tYXJ5CisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJ0d29sYW1lLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ0d29sYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxODg1NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnR3b2xhbWUuYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIEludGVyZmFjZSB0byBsaWJ0d29sYW1lIGZvciBtcDIgZW5jb2RpbmcKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSW50ZXJmYWNlIHRvIGxpYnR3b2xhbWUgZm9yIG1wMiBlbmNvZGluZy4KKyAqLworCisjaW5jbHVkZSA8dHdvbGFtZS5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1wZWdhdWRpby5oIgorCit0eXBlZGVmIHN0cnVjdCBUV09MQU1FQ29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IG1vZGU7CisgICAgaW50IHBzeW1vZGVsOworICAgIGludCBlbmVyZ3k7CisgICAgaW50IGVycm9yX3Byb3RlY3Rpb247CisgICAgaW50IGNvcHlyaWdodDsKKyAgICBpbnQgb3JpZ2luYWw7CisgICAgaW50IHZlcmJvc2l0eTsKKworICAgIHR3b2xhbWVfb3B0aW9ucyAqZ2xvcHRzOworICAgIGludDY0X3QgbmV4dF9wdHM7Cit9IFRXT0xBTUVDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgdHdvbGFtZV9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRXT0xBTUVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB0d29sYW1lX2Nsb3NlKCZzLT5nbG9wdHMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdHdvbGFtZV9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVFdPTEFNRUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IFRXT0xBTUVfU0FNUExFU19QRVJfRlJBTUU7CisgICAgYXZjdHgtPmluaXRpYWxfcGFkZGluZyA9IDUxMiAtIDMyICsgMTsKKworICAgIHMtPmdsb3B0cyA9IHR3b2xhbWVfaW5pdCgpOworICAgIGlmICghcy0+Z2xvcHRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgdHdvbGFtZV9zZXRfdmVyYm9zaXR5KHMtPmdsb3B0cywgcy0+dmVyYm9zaXR5KTsKKyAgICB0d29sYW1lX3NldF9tb2RlKHMtPmdsb3B0cywgcy0+bW9kZSk7CisgICAgdHdvbGFtZV9zZXRfcHN5bW9kZWwocy0+Z2xvcHRzLCBzLT5wc3ltb2RlbCk7CisgICAgdHdvbGFtZV9zZXRfZW5lcmd5X2xldmVscyhzLT5nbG9wdHMsIHMtPmVuZXJneSk7CisgICAgdHdvbGFtZV9zZXRfZXJyb3JfcHJvdGVjdGlvbihzLT5nbG9wdHMsIHMtPmVycm9yX3Byb3RlY3Rpb24pOworICAgIHR3b2xhbWVfc2V0X2NvcHlyaWdodChzLT5nbG9wdHMsIHMtPmNvcHlyaWdodCk7CisgICAgdHdvbGFtZV9zZXRfb3JpZ2luYWwocy0+Z2xvcHRzLCBzLT5vcmlnaW5hbCk7CisKKyAgICB0d29sYW1lX3NldF9udW1fY2hhbm5lbHMocy0+Z2xvcHRzLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgIHR3b2xhbWVfc2V0X2luX3NhbXBsZXJhdGUocy0+Z2xvcHRzLCBhdmN0eC0+c2FtcGxlX3JhdGUpOworICAgIHR3b2xhbWVfc2V0X291dF9zYW1wbGVyYXRlKHMtPmdsb3B0cywgYXZjdHgtPnNhbXBsZV9yYXRlKTsKKworICAgIGlmICghYXZjdHgtPmJpdF9yYXRlKQorICAgICAgICBhdmN0eC0+Yml0X3JhdGUgPSBhdmN0eC0+c2FtcGxlX3JhdGUgPCAyODAwMCA/IDE2MDAwMCA6IDM4NDAwMDsKKworICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FTQ0FMRSB8fCAhYXZjdHgtPmJpdF9yYXRlKSB7CisgICAgICAgIHR3b2xhbWVfc2V0X1ZCUihzLT5nbG9wdHMsIFRSVUUpOworICAgICAgICB0d29sYW1lX3NldF9WQlJfbGV2ZWwocy0+Z2xvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmdsb2JhbF9xdWFsaXR5IC8gKGZsb2F0KSBGRl9RUDJMQU1CREEpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlZCUiBpbiBNUDIgaXMgYSBoYWNrLCB1c2UgYW5vdGhlciBjb2RlYyB0aGF0IHN1cHBvcnRzIGl0LlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHdvbGFtZV9zZXRfYml0cmF0ZShzLT5nbG9wdHMsIGF2Y3R4LT5iaXRfcmF0ZSAvIDEwMDApOworICAgIH0KKworICAgIHJldCA9IHR3b2xhbWVfaW5pdF9wYXJhbXMocy0+Z2xvcHRzKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIHR3b2xhbWVfZW5jb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0d29sYW1lX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCit7CisgICAgVFdPTEFNRUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBNUEFfTUFYX0NPREVEX0ZSQU1FX1NJWkUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgc3dpdGNoIChhdmN0eC0+c2FtcGxlX2ZtdCkgeworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUOgorICAgICAgICAgICAgcmV0ID0gdHdvbGFtZV9lbmNvZGVfYnVmZmVyX2Zsb2F0MzJfaW50ZXJsZWF2ZWQocy0+Z2xvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cGt0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwa3QtPnNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFRQOgorICAgICAgICAgICAgcmV0ID0gdHdvbGFtZV9lbmNvZGVfYnVmZmVyX2Zsb2F0MzIocy0+Z2xvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKilmcmFtZS0+ZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2OgorICAgICAgICAgICAgcmV0ID0gdHdvbGFtZV9lbmNvZGVfYnVmZmVyX2ludGVybGVhdmVkKHMtPmdsb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc2hvcnQgaW50ICopZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2UDoKKyAgICAgICAgICAgIHJldCA9IHR3b2xhbWVfZW5jb2RlX2J1ZmZlcihzLT5nbG9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHNob3J0IGludCAqKWZyYW1lLT5kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzaG9ydCBpbnQgKilmcmFtZS0+ZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCAlZC5cbiIsIGF2Y3R4LT5zYW1wbGVfZm10KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IHR3b2xhbWVfZW5jb2RlX2ZsdXNoKHMtPmdsb3B0cywgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICB9CisKKyAgICBpZiAoIXJldCkgICAgIC8vIG5vIGJ5dGVzIHdyaXR0ZW4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHJldCA8IDApICAvLyB0d29sYW1lIGVycm9yCisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgYXZwa3QtPmR1cmF0aW9uID0gZmZfc2FtcGxlc190b190aW1lX2Jhc2UoYXZjdHgsIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKGZyYW1lLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBhdnBrdC0+cHRzID0gZnJhbWUtPnB0cyAtIGZmX3NhbXBsZXNfdG9fdGltZV9iYXNlKGF2Y3R4LCBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdnBrdC0+cHRzID0gcy0+bmV4dF9wdHM7CisgICAgfQorICAgIC8vIHRoaXMgaXMgZm9yIHNldHRpbmcgcHRzIGZvciBmbHVzaGVkIHBhY2tldChzKS4KKyAgICBpZiAoYXZwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcy0+bmV4dF9wdHMgPSBhdnBrdC0+cHRzICsgYXZwa3QtPmR1cmF0aW9uOworCisgICAgYXZfc2hyaW5rX3BhY2tldChhdnBrdCwgcmV0KTsKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihUV09MQU1FQ29udGV4dCwgeCkKKyNkZWZpbmUgQUUgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJtb2RlIiwgIk1wZWcgTW9kZSIsIE9GRlNFVChtb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBUV09MQU1FX0FVVE9fTU9ERSB9LCBUV09MQU1FX0FVVE9fTU9ERSwgVFdPTEFNRV9NT05PLCBBRSwgIm1vZGUifSwKKyAgICAgICAgeyAiYXV0byIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBUV09MQU1FX0FVVE9fTU9ERSB9LCAwLCAwLCBBRSwgIm1vZGUiIH0sCisgICAgICAgIHsgInN0ZXJlbyIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBUV09MQU1FX1NURVJFTyB9LCAwLCAwLCBBRSwgIm1vZGUiIH0sCisgICAgICAgIHsgImpvaW50X3N0ZXJlbyIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBUV09MQU1FX0pPSU5UX1NURVJFTyB9LCAwLCAwLCBBRSwgIm1vZGUiIH0sCisgICAgICAgIHsgImR1YWxfY2hhbm5lbCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBUV09MQU1FX0RVQUxfQ0hBTk5FTCB9LCAwLCAwLCBBRSwgIm1vZGUiIH0sCisgICAgICAgIHsgIm1vbm8iLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gVFdPTEFNRV9NT05PIH0sIDAsIDAsIEFFLCAibW9kZSIgfSwKKyAgICB7ICJwc3ltb2RlbCIsICJQc3ljaG9hY291c3RpYyBNb2RlbCIsIE9GRlNFVChwc3ltb2RlbCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMyB9LCAtMSwgNCwgQUV9LAorICAgIHsgImVuZXJneV9sZXZlbHMiLCJlbmFibGUgZW5lcmd5IGxldmVscyIsIE9GRlNFVChlbmVyZ3kpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgIDAsIDEsIEFFfSwKKyAgICB7ICJlcnJvcl9wcm90ZWN0aW9uIiwiZW5hYmxlIENSQyBlcnJvciBwcm90ZWN0aW9uIiwgT0ZGU0VUKGVycm9yX3Byb3RlY3Rpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgIDAsIDEsIEFFfSwKKyAgICB7ICJjb3B5cmlnaHQiLCAic2V0IE1QRUcgQXVkaW8gQ29weXJpZ2h0IGZsYWciLCBPRkZTRVQoY29weXJpZ2h0KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEFFfSwKKyAgICB7ICJvcmlnaW5hbCIsICJzZXQgTVBFRyBBdWRpbyBPcmlnaW5hbCBmbGFnIiwgT0ZGU0VUKG9yaWdpbmFsKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEFFfSwKKyAgICB7ICJ2ZXJib3NpdHkiLCAic2V0IGxpYnJhcnkgb3B0cHV0IGxldmVsICgwLTEwKSIsIE9GRlNFVCh2ZXJib3NpdHkpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMTAsIEFFfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHR3b2xhbWVfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibGlidHdvbGFtZSBlbmNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjRGVmYXVsdCB0d29sYW1lX2RlZmF1bHRzW10gPSB7CisgICAgeyAiYiIsICIwIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IGludCB0d29sYW1lX3NhbXBsZXJhdGVzW10gPSB7CisgICAgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgMAorfTsKKworQVZDb2RlYyBmZl9saWJ0d29sYW1lX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYnR3b2xhbWUiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJ0d29sYW1lIE1QMiAoTVBFRyBhdWRpbyBsYXllciAyKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFRXT0xBTUVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB0d29sYW1lX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IHR3b2xhbWVfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IHR3b2xhbWVfZW5jb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9ERUxBWSwKKyAgICAuZGVmYXVsdHMgICAgICAgPSB0d29sYW1lX2RlZmF1bHRzLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ0d29sYW1lX2NsYXNzLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfUzE2UCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FCisgICAgfSwKKyAgICAuY2hhbm5lbF9sYXlvdXRzID0gKGNvbnN0IHVpbnQ2NF90W10pIHsKKyAgICAgICAgQVZfQ0hfTEFZT1VUX01PTk8sCisgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgICAgIDAgfSwKKyAgICAuc3VwcG9ydGVkX3NhbXBsZXJhdGVzID0gdHdvbGFtZV9zYW1wbGVyYXRlcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJ1dHZpZGVvLmggYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ1dHZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiMTE3NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnV0dmlkZW8uaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIgRGVyZWsgQnVpdGVuaHVpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBLbm93biBGT1VSQ0NzOgorICogICAgICdVTFkwJyAoWUNiQ3IgNDoyOjApLCAnVUxZMicgKFlDYkNyIDQ6MjoyKSwgJ1VMUkcnIChSR0IpLCAnVUxSQScgKFJHQkEpLAorICogICAgICdVTEgwJyAoWUNiQ3IgNDoyOjAgQlQuNzA5KSwgJ1VMSDInIChZQ2JDciA0OjI6MiBCVC43MDkpCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0xJQlVUVklERU9fSAorI2RlZmluZSBBVkNPREVDX0xJQlVUVklERU9fSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dXR2aWRlby91dHZpZGVvLmg+CisjaW5jbHVkZSA8dXR2aWRlby9Db2RlYy5oPgorCisvKgorICogVXQgVmlkZW8gdmVyc2lvbiAxMi4wLjAgY2hhbmdlZCB0aGUgUkdCIGZvcm1hdCBuYW1lcyBhbmQgcmVtb3ZlZAorICogdGhlIF9XSU4gbmFtZXMsIHNvIGlmIHRoZSBuZXcgbmFtZXMgYXJlIGFic2VudCwgZGVmaW5lIHRoZW0KKyAqIGFnYWluc3QgdGhlIG9sZCBuYW1lcyBzbyBjb21wYXRpYmlsaXR5IHdpdGggcHJlLXYxMiB2ZXJzaW9ucworICogaXMgbWFpbnRhaW5lZC4KKyAqLworI2lmICFkZWZpbmVkKFVUVkZfTkZDQ19CR1JfQlUpCisjZGVmaW5lIFVUVkZfTkZDQ19CR1JfQlUgVVRWRl9SR0IyNF9XSU4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVVRWRl9ORkNDX0JHUkFfQlUpCisjZGVmaW5lIFVUVkZfTkZDQ19CR1JBX0JVIFVUVkZfUkdCMzJfV0lOCisjZW5kaWYKKworLyoKKyAqIFV0IFZpZGVvIHZlcnNpb24gMTMuMC4xIGludHJvZHVjZWQgbmV3IEJULjcwOSB2YXJpYW50cy4KKyAqIFNwZWNpYWwtY2FzZSB0aGVzZSBhbmQgb25seSB1c2UgdGhlbSBpZiB2MTMgaXMgZGV0ZWN0ZWQuCisgKi8KKyNpZiBkZWZpbmVkKFVUVkZfSERZQykKKyNkZWZpbmUgVVRWX0JUNzA5CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IHZlcnNpb247CisgICAgdWludDMyX3Qgb3JpZ2luYWxfZm9ybWF0OworICAgIHVpbnQzMl90IGZyYW1laW5mb19zaXplOworICAgIHVpbnQzMl90IGZsYWdzOworfSBVdFZpZGVvRXh0cmE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQ29kZWMgKmNvZGVjOworICAgIHVuc2lnbmVkIGludCBidWZfc2l6ZTsKKyAgICB1aW50OF90ICpidWZmZXI7Cit9IFV0VmlkZW9Db250ZXh0OworCisjZW5kaWYgLyogQVZDT0RFQ19MSUJVVFZJREVPX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnV0dmlkZW9kZWMuY3BwIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlidXR2aWRlb2RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiODdhOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnV0dmlkZW9kZWMuY3BwCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIERlcmVrIEJ1aXRlbmh1aXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogS25vd24gRk9VUkNDczoKKyAqICAgICAnVUxZMCcgKFlDYkNyIDQ6MjowKSwgJ1VMWTInIChZQ2JDciA0OjI6MiksICdVTFJHJyAoUkdCKSwgJ1VMUkEnIChSR0JBKSwKKyAqICAgICAnVUxIMCcgKFlDYkNyIDQ6MjowIEJULjcwOSksICdVTEgyJyAoWUNiQ3IgNDoyOjIgQlQuNzA5KQorICovCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgImF2Y29kZWMuaCIKK30KKworI2luY2x1ZGUgImxpYnV0dmlkZW8uaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgdXR2aWRlb19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVXRWaWRlb0NvbnRleHQgKnV0diA9IChVdFZpZGVvQ29udGV4dCAqKWF2Y3R4LT5wcml2X2RhdGE7CisgICAgVXRWaWRlb0V4dHJhIGluZm87CisgICAgaW50IGZvcm1hdDsKKyAgICBpbnQgYmVnaW5fcmV0OworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAhPSAxNiAmJiBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgIT0gOCApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFeHRyYWRhdGEgc2l6ZSAoJWQpIG1pc21hdGNoLlxuIiwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFJlYWQgZXh0cmFkYXRhICovCisgICAgaW5mby52ZXJzaW9uID0gQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBpbmZvLm9yaWdpbmFsX2Zvcm1hdCA9IEFWX1JMMzIoYXZjdHgtPmV4dHJhZGF0YSArIDQpOworICAgIGluZm8uZnJhbWVpbmZvX3NpemUgPSBBVl9STDMyKGF2Y3R4LT5leHRyYWRhdGEgKyA4KTsKKyAgICBpbmZvLmZsYWdzID0gQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhICsgMTIpOworCisgICAgLyogUGljayBmb3JtYXQgYmFzZWQgb24gRk9VUkNDICovCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfdGFnKSB7CisjaWZkZWYgVVRWX0JUNzA5CisgICAgY2FzZSBNS1RBRygnVScsICdMJywgJ0gnLCAnMCcpOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CisgICAgICAgIGZvcm1hdCA9IFVUVkZfWVYxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnVScsICdMJywgJ0gnLCAnMicpOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVZVjQyMjsKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CisgICAgICAgIGZvcm1hdCA9IFVUVkZfWVVZMjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIE1LVEFHKCdVJywgJ0wnLCAnWScsICcwJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgICAgICBmb3JtYXQgPSBVVFZGX1lWMTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnTCcsICdZJywgJzInKToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVWVY0MjI7CisgICAgICAgIGZvcm1hdCA9IFVUVkZfWVVZMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnVScsICdMJywgJ1InLCAnRycpOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQ7CisgICAgICAgIGZvcm1hdCA9IFVUVkZfTkZDQ19CR1JfQlU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnTCcsICdSJywgJ0EnKToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjMyOworICAgICAgICBmb3JtYXQgPSBVVFZGX05GQ0NfQkdSQV9CVTsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgVVRWRl9VUVkyCisgICAgY2FzZSBNS1RBRygnVScsICdRJywgJ1knLCAnMicpOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDEwOworICAgICAgICBmb3JtYXQgPSBVVFZGX3YyMTA7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICJOb3QgYSBVdCBWaWRlbyBGT1VSQ0M6ICVYXG4iLCBhdmN0eC0+Y29kZWNfdGFnKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIE9ubHkgYWxsb2NhdGUgdGhlIGJ1ZmZlciBvbmNlICovCisgICAgdXR2LT5idWZfc2l6ZSA9IGF2cGljdHVyZV9nZXRfc2l6ZShhdmN0eC0+cGl4X2ZtdCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyNpZmRlZiBVVFZGX1VRWTIKKyAgICBpZiAoZm9ybWF0ID09IFVUVkZfdjIxMCkKKyAgICAgICAgdXR2LT5idWZfc2l6ZSArPSBhdmN0eC0+aGVpZ2h0ICogKChhdmN0eC0+d2lkdGggKyA0NykgLyA0OCkgKiAxMjg7IC8vIHRoZSBsaW5lc2l6ZSB1c2VkIGJ5IHRoZSBkZWNvZGVyLCB0aGlzIGRvZXMgbm90IHNlZW0gdG8gYmUgZXhwb3J0ZWQKKyNlbmRpZgorICAgIHV0di0+YnVmZmVyID0gKHVpbnQ4X3QgKilhdl9tYWxsb2ModXR2LT5idWZfc2l6ZSAqIHNpemVvZih1aW50OF90KSk7CisKKyAgICBpZiAodXR2LT5idWZmZXIgPT0gTlVMTCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyLlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgb3V0cHV0IGZyYW1lICovCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKworICAgIC8qIFV0IFZpZGVvIG9ubHkgc3VwcG9ydHMgOC1iaXQgKi8KKyAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDg7CisKKyAgICAvKiBJcyBpdCBpbnRlcmxhY2VkPyAqLworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSA9IGluZm8uZmxhZ3MgJiAweDgwMCA/IDEgOiAwOworCisgICAgLyogQXBwYXJlbnRseSBVdCBWaWRlbyBkb2Vzbid0IHN0b3JlIHRoaXMgaW5mby4uLiAqLworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ID0gMTsKKworICAgIC8qCisgICAgICogQ3JlYXRlIGEgVXQgVmlkZW8gaW5zdGFuY2UuIFNpbmNlIHRoZSBmdW5jdGlvbiB3YW50cworICAgICAqIGFuICJpbnRlcmZhY2UgbmFtZSIgc3RyaW5nLCBwYXNzIGl0IHRoZSBuYW1lIG9mIHRoZSBsaWIuCisgICAgICovCisgICAgdXR2LT5jb2RlYyA9IENDb2RlYzo6Q3JlYXRlSW5zdGFuY2UoVU5GQ0MoYXZjdHgtPmNvZGVjX3RhZyksICJsaWJhdmNvZGVjIik7CisKKyAgICAvKiBJbml0aWFsaXplIERlY29kaW5nICovCisgICAgYmVnaW5fcmV0ID0gdXR2LT5jb2RlYy0+RGVjb2RlQmVnaW4oZm9ybWF0LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JHUk9TU1dJRFRIX1dJTkRPV1MsICZpbmZvLCBzaXplb2YoVXRWaWRlb0V4dHJhKSk7CisKKyAgICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIGRlY29kZXIgaW5pdGxpemVkIHByb3Blcmx5ICovCisgICAgaWYgKGJlZ2luX3JldCAhPSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBpbml0aWFsaXplIGRlY29kZXI6ICVkXG4iLCBiZWdpbl9yZXQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXR2aWRlb19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFV0VmlkZW9Db250ZXh0ICp1dHYgPSAoVXRWaWRlb0NvbnRleHQgKilhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKnBpYyA9IGF2Y3R4LT5jb2RlZF9mcmFtZTsKKyAgICBpbnQgdyA9IGF2Y3R4LT53aWR0aCwgaCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICAvKiBTZXQgZmxhZ3MgKi8KKyAgICBwaWMtPnJlZmVyZW5jZSA9IDA7CisgICAgcGljLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwaWMtPmtleV9mcmFtZSA9IDE7CisKKyAgICAvKiBEZWNvZGUgdGhlIGZyYW1lICovCisgICAgdXR2LT5jb2RlYy0+RGVjb2RlRnJhbWUodXR2LT5idWZmZXIsIGF2cGt0LT5kYXRhLCB0cnVlKTsKKworICAgIC8qIFNldCB0aGUgb3V0cHV0IGRhdGEgZGVwZW5kaW5nIG9uIHRoZSBjb2xvcnNwYWNlICovCisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgICAgICBwaWMtPmxpbmVzaXplWzBdID0gdzsKKyAgICAgICAgcGljLT5saW5lc2l6ZVsxXSA9IHBpYy0+bGluZXNpemVbMl0gPSB3IC8gMjsKKyAgICAgICAgcGljLT5kYXRhWzBdID0gdXR2LT5idWZmZXI7CisgICAgICAgIHBpYy0+ZGF0YVsyXSA9IHV0di0+YnVmZmVyICsgKHcgKiBoKTsKKyAgICAgICAgcGljLT5kYXRhWzFdID0gcGljLT5kYXRhWzJdICsgKHcgKiBoIC8gNCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVlWNDIyOgorICAgICAgICBwaWMtPmxpbmVzaXplWzBdID0gdyAqIDI7CisgICAgICAgIHBpYy0+ZGF0YVswXSA9IHV0di0+YnVmZmVyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEwOiB7CisgICAgICAgIHVpbnQxNl90ICp5LCAqdSwgKnY7CisgICAgICAgIGludCBpLGo7CisgICAgICAgIGludCBsaW5lc2l6ZSA9ICgodyArIDQ3KSAvIDQ4KSAqIDEyODsKKworICAgICAgICBwaWMtPmxpbmVzaXplWzBdID0gdyAqIDI7CisgICAgICAgIHBpYy0+bGluZXNpemVbMV0gPQorICAgICAgICBwaWMtPmxpbmVzaXplWzJdID0gdzsKKyAgICAgICAgcGljLT5kYXRhWzBdID0gdXR2LT5idWZmZXIgKyBsaW5lc2l6ZSAqIGg7CisgICAgICAgIHBpYy0+ZGF0YVsxXSA9IHBpYy0+ZGF0YVswXSArIGgqcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgcGljLT5kYXRhWzJdID0gcGljLT5kYXRhWzFdICsgaCpwaWMtPmxpbmVzaXplWzFdOworICAgICAgICB5ID0gKHVpbnQxNl90KilwaWMtPmRhdGFbMF07CisgICAgICAgIHUgPSAodWludDE2X3QqKXBpYy0+ZGF0YVsxXTsKKyAgICAgICAgdiA9ICh1aW50MTZfdCopcGljLT5kYXRhWzJdOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiA9IHV0di0+YnVmZmVyICsgaiAqIGxpbmVzaXplOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpICsgMSA8IHc7IGkgKz0gNiwgaW4gKz0gNCkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGEsYjsKKyAgICAgICAgICAgICAgICBhID0gQVZfUkwzMihpbik7CisgICAgICAgICAgICAgICAgaW4gKz0gNDsKKyAgICAgICAgICAgICAgICBiID0gQVZfUkwzMihpbik7CisgICAgICAgICAgICAgICAgKnUrKyA9IChhICAgICkgJiAweDNGRjsKKyAgICAgICAgICAgICAgICAqeSsrID0gKGE+PjEwKSAmIDB4M0ZGOworICAgICAgICAgICAgICAgICp2KysgPSAoYT4+MjApICYgMHgzRkY7CisgICAgICAgICAgICAgICAgKnkrKyA9IChiICAgICkgJiAweDNGRjsKKworICAgICAgICAgICAgICAgIGlmIChpICsgMyA+PSB3KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGluICs9IDQ7CisgICAgICAgICAgICAgICAgYSA9IEFWX1JMMzIoaW4pOworICAgICAgICAgICAgICAgICp1KysgPSAoYj4+MTApICYgMHgzRkY7CisgICAgICAgICAgICAgICAgKnkrKyA9IChiPj4yMCkgJiAweDNGRjsKKyAgICAgICAgICAgICAgICAqdisrID0gKGEgICAgKSAmIDB4M0ZGOworICAgICAgICAgICAgICAgICp5KysgPSAoYT4+MTApICYgMHgzRkY7CisKKyAgICAgICAgICAgICAgICBpZiAoaSArIDUgPj0gdykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpbiArPSA0OworICAgICAgICAgICAgICAgIGIgPSBBVl9STDMyKGluKTsKKyAgICAgICAgICAgICAgICAqdSsrID0gKGE+PjIwKSAmIDB4M0ZGOworICAgICAgICAgICAgICAgICp5KysgPSAoYiAgICApICYgMHgzRkY7CisgICAgICAgICAgICAgICAgKnYrKyA9IChiPj4xMCkgJiAweDNGRjsKKyAgICAgICAgICAgICAgICAqeSsrID0gKGI+PjIwKSAmIDB4M0ZGOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjMyOgorICAgICAgICAvKiBNYWtlIHRoZSBsaW5lc2l6ZSBuZWdhdGl2ZSwgc2luY2UgVXQgVmlkZW8gdXNlcyBib3R0b20tdXAgQkdSICovCisgICAgICAgIHBpYy0+bGluZXNpemVbMF0gPSAtMSAqIHcgKiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1IyNCA/IDMgOiA0KTsKKyAgICAgICAgcGljLT5kYXRhWzBdID0gdXR2LT5idWZmZXIgKyB1dHYtPmJ1Zl9zaXplICsgcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgYXZfZnJhbWVfbW92ZV9yZWYoKEFWRnJhbWUqKWRhdGEsIHBpYyk7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB1dHZpZGVvX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVXRWaWRlb0NvbnRleHQgKnV0diA9IChVdFZpZGVvQ29udGV4dCAqKWF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICAvKiBGcmVlIG91dHB1dCAqLworICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisgICAgYXZfZnJlZXAoJnV0di0+YnVmZmVyKTsKKworICAgIC8qIEZpbmlzaCBkZWNvZGluZyBhbmQgY2xlYW4gdXAgdGhlIGluc3RhbmNlICovCisgICAgdXR2LT5jb2RlYy0+RGVjb2RlRW5kKCk7CisgICAgQ0NvZGVjOjpEZWxldGVJbnN0YW5jZSh1dHYtPmNvZGVjKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2xpYnV0dmlkZW9fZGVjb2RlciA9IHsKKyAgICAibGlidXR2aWRlbyIsCisgICAgTlVMTF9JRl9DT05GSUdfU01BTEwoIlV0IFZpZGVvIiksCisgICAgQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIEFWX0NPREVDX0lEX1VUVklERU8sCisgICAgMCwgICAgLy9jYXBhYmlsaXRpZXMKKyAgICBOVUxMLCAvL3N1cHBvcnRlZF9mcmFtZXJhdGVzCisgICAgTlVMTCwgLy9waXhfZm10cworICAgIE5VTEwsIC8vc3VwcG9ydGVkX3NhbXBsZXJhdGVzCisgICAgTlVMTCwgLy9zYW1wbGVfZm10cworICAgIE5VTEwsIC8vY2hhbm5lbF9sYXlvdXRzCisgICAgMCwgICAgLy9tYXhfbG93cmVzCisgICAgTlVMTCwgLy9wcml2X2NsYXNzCisgICAgTlVMTCwgLy9wcm9maWxlcworICAgIHNpemVvZihVdFZpZGVvQ29udGV4dCksCisgICAgTlVMTCwgLy9uZXh0CisgICAgTlVMTCwgLy9pbml0X3RocmVhZF9jb3B5CisgICAgTlVMTCwgLy91cGRhdGVfdGhyZWFkX2NvbnRleHQKKyAgICBOVUxMLCAvL2RlZmF1bHRzCisgICAgTlVMTCwgLy9pbml0X3N0YXRpY19kYXRhCisgICAgdXR2aWRlb19kZWNvZGVfaW5pdCwKKyAgICBOVUxMLCAvL2VuY29kZQorICAgIE5VTEwsIC8vZW5jb2RlMgorICAgIHV0dmlkZW9fZGVjb2RlX2ZyYW1lLAorICAgIHV0dmlkZW9fZGVjb2RlX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnV0dmlkZW9lbmMuY3BwIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlidXR2aWRlb2VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5OGU2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnV0dmlkZW9lbmMuY3BwCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIERlcmVrIEJ1aXRlbmh1aXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogS25vd24gRk9VUkNDczoKKyAqICAgICAnVUxZMCcgKFlDYkNyIDQ6MjowKSwgJ1VMWTInIChZQ2JDciA0OjI6MiksICdVTFJHJyAoUkdCKSwgJ1VMUkEnIChSR0JBKSwKKyAqICAgICAnVUxIMCcgKFlDYkNyIDQ6MjowIEJULjcwOSksICdVTEgyJyAoWUNiQ3IgNDoyOjIgQlQuNzA5KQorICovCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorfQorCisjaW5jbHVkZSAibGlidXR2aWRlby5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCB1dHZpZGVvX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBVdFZpZGVvQ29udGV4dCAqdXR2ID0gKFV0VmlkZW9Db250ZXh0ICopYXZjdHgtPnByaXZfZGF0YTsKKyAgICBVdFZpZGVvRXh0cmEgKmluZm87CisgICAgdWludDMyX3QgZmxhZ3MsIGluX2Zvcm1hdDsKKworICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICAgICAgaW5fZm9ybWF0ID0gVVRWRl9ZVjEyOworICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTI7CisgICAgICAgIGlmIChhdmN0eC0+Y29sb3JzcGFjZSA9PSBBVkNPTF9TUENfQlQ3MDkpCisgICAgICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID0gTUtUQUcoJ1UnLCAnTCcsICdIJywgJzAnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IE1LVEFHKCdVJywgJ0wnLCAnWScsICcwJyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVlWNDIyOgorICAgICAgICBpbl9mb3JtYXQgPSBVVFZGX1lVWVY7CisgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19CVDcwOSkKKyAgICAgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnVScsICdMJywgJ0gnLCAnMicpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID0gTUtUQUcoJ1UnLCAnTCcsICdZJywgJzInKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorICAgICAgICBpbl9mb3JtYXQgPSBVVFZGX05GQ0NfQkdSX0JVOworICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMjQ7CisgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnVScsICdMJywgJ1InLCAnRycpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMzI6CisgICAgICAgIGluX2Zvcm1hdCA9IFVUVkZfTkZDQ19CR1JBX0JVOworICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMzI7CisgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnVScsICdMJywgJ1InLCAnQScpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8qIENoZWNrIGJlZm9yZSB3ZSBhbGxvYyBhbnl0aGluZyAqLworICAgIGlmIChhdmN0eC0+cHJlZGljdGlvbl9tZXRob2QgIT0gMCAmJiBhdmN0eC0+cHJlZGljdGlvbl9tZXRob2QgIT0gMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcHJlZGljdGlvbiBtZXRob2QuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBmbGFncyA9ICgoYXZjdHgtPnByZWRpY3Rpb25fbWV0aG9kICsgMSkgPDwgOCkgfCAoYXZjdHgtPnRocmVhZF9jb3VudCAtIDEpOworCisgICAgYXZjdHgtPnByaXZfZGF0YSA9IHV0djsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworCisgICAgLyogQWxsb2MgZXh0cmFkYXRhIGJ1ZmZlciAqLworICAgIGluZm8gPSAoVXRWaWRlb0V4dHJhICopYXZfbWFsbG9jKHNpemVvZigqaW5mbykpOworCisgICAgaWYgKCFpbmZvKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIGV4dHJhZGF0YSBidWZmZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdlIHVzZSB0aGlzIGJ1ZmZlciB0byBob2xkIHRoZSBkYXRhIHRoYXQgVXQgVmlkZW8gcmV0dXJucywKKyAgICAgKiBzaW5jZSB3ZSBjYW5ub3QgZGVjb2RlIHBsYW5lcyBzZXBhcmF0ZWx5IHdpdGggaXQuCisgICAgICovCisgICAgdXR2LT5idWZfc2l6ZSA9IGF2cGljdHVyZV9nZXRfc2l6ZShhdmN0eC0+cGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgdXR2LT5idWZmZXIgPSAodWludDhfdCAqKWF2X21hbGxvYyh1dHYtPmJ1Zl9zaXplKTsKKworICAgIGlmICh1dHYtPmJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIG91dHB1dCBidWZmZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBhIFV0IFZpZGVvIGluc3RhbmNlLiBTaW5jZSB0aGUgZnVuY3Rpb24gd2FudHMKKyAgICAgKiBhbiAiaW50ZXJmYWNlIG5hbWUiIHN0cmluZywgcGFzcyBpdCB0aGUgbmFtZSBvZiB0aGUgbGliLgorICAgICAqLworICAgIHV0di0+Y29kZWMgPSBDQ29kZWM6OkNyZWF0ZUluc3RhbmNlKFVORkNDKGF2Y3R4LT5jb2RlY190YWcpLCAibGliYXZjb2RlYyIpOworCisgICAgLyogSW5pdGlhbGl6ZSBlbmNvZGVyICovCisgICAgdXR2LT5jb2RlYy0+RW5jb2RlQmVnaW4oaW5fZm9ybWF0LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JHUk9TU1dJRFRIX1dJTkRPV1MpOworCisgICAgLyogR2V0IGV4dHJhZGF0YSBmcm9tIGVuY29kZXIgKi8KKyAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSB1dHYtPmNvZGVjLT5FbmNvZGVHZXRFeHRyYURhdGFTaXplKCk7CisgICAgdXR2LT5jb2RlYy0+RW5jb2RlR2V0RXh0cmFEYXRhKGluZm8sIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSwgaW5fZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCR1JPU1NXSURUSF9XSU5ET1dTKTsKKyAgICBhdmN0eC0+ZXh0cmFkYXRhID0gKHVpbnQ4X3QgKilpbmZvOworCisgICAgLyogU2V0IGZsYWdzICovCisgICAgdXR2LT5jb2RlYy0+U2V0U3RhdGUoJmZsYWdzLCBzaXplb2YoZmxhZ3MpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHV0dmlkZW9fZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgVXRWaWRlb0NvbnRleHQgKnV0diA9IChVdFZpZGVvQ29udGV4dCAqKWF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHcgPSBhdmN0eC0+d2lkdGgsIGggPSBhdmN0eC0+aGVpZ2h0OworICAgIGludCByZXQsIHJnYl9zaXplLCBpOworICAgIGJvb2wga2V5ZnJhbWU7CisgICAgdWludDhfdCAqeSwgKnUsICp2OworICAgIHVpbnQ4X3QgKmRzdDsKKworICAgIC8qIEFsbG9jIGJ1ZmZlciAqLworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCB1dHYtPmJ1Zl9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZHN0ID0gcGt0LT5kYXRhOworCisgICAgLyogTW92ZSBpbnB1dCBpZiBuZWVkZWQgZGF0YSBpbnRvIFV0IFZpZGVvIGZyaWVuZGx5IGJ1ZmZlciAqLworICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICAgICAgeSA9IHV0di0+YnVmZmVyOworICAgICAgICB1ID0geSArIHcgKiBoOworICAgICAgICB2ID0gdSArIHcgKiBoIC8gNDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICAgICAgbWVtY3B5KHksIHBpYy0+ZGF0YVswXSArIGkgKiBwaWMtPmxpbmVzaXplWzBdLCB3KTsKKyAgICAgICAgICAgIHkgKz0gdzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaCAvIDI7IGkrKykgeworICAgICAgICAgICAgbWVtY3B5KHUsIHBpYy0+ZGF0YVsyXSArIGkgKiBwaWMtPmxpbmVzaXplWzJdLCB3ID4+IDEpOworICAgICAgICAgICAgbWVtY3B5KHYsIHBpYy0+ZGF0YVsxXSArIGkgKiBwaWMtPmxpbmVzaXplWzFdLCB3ID4+IDEpOworICAgICAgICAgICAgdSArPSB3ID4+IDE7CisgICAgICAgICAgICB2ICs9IHcgPj4gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVZVjQyMjoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykKKyAgICAgICAgICAgIG1lbWNweSh1dHYtPmJ1ZmZlciArIGkgKiAodyA8PCAxKSwKKyAgICAgICAgICAgICAgICAgICBwaWMtPmRhdGFbMF0gKyBpICogcGljLT5saW5lc2l6ZVswXSwgdyA8PCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjoKKyAgICAgICAgLyogVXQgVmlkZW8gdGFrZXMgYm90dG9tLXVwIEJHUiAqLworICAgICAgICByZ2Jfc2l6ZSA9IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfQkdSMjQgPyAzIDogNDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykKKyAgICAgICAgICAgIG1lbWNweSh1dHYtPmJ1ZmZlciArIChoIC0gaSAtIDEpICogdyAqIHJnYl9zaXplLAorICAgICAgICAgICAgICAgICAgIHBpYy0+ZGF0YVswXSArIGkgKiBwaWMtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgIHcgKiByZ2Jfc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogRW5jb2RlIGZyYW1lICovCisgICAgcGt0LT5zaXplID0gdXR2LT5jb2RlYy0+RW5jb2RlRnJhbWUoZHN0LCAma2V5ZnJhbWUsIHV0di0+YnVmZmVyKTsKKworICAgIGlmICghcGt0LT5zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRW5jb2RlRnJhbWUgZmFpbGVkIVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qCisgICAgICogVXQgVmlkZW8gaXMgaW50cmEtb25seSBhbmQgZXZlcnkgZnJhbWUgaXMgYSBrZXlmcmFtZSwKKyAgICAgKiBhbmQgdGhlIEFQSSBhbHdheXMgcmV0dXJucyB0cnVlLiBJbiBjYXNlIHNvbWV0aGluZworICAgICAqIGR1cmFzdGljIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZSwgc3VjaCBhcyBpbnRlciBzdXBwb3J0LAorICAgICAqIGFzc2VydCB0aGF0IHRoaXMgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBhdl9hc3NlcnQyKGtleWZyYW1lID09IHRydWUpOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdXR2aWRlb19lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFV0VmlkZW9Db250ZXh0ICp1dHYgPSAoVXRWaWRlb0NvbnRleHQgKilhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5leHRyYWRhdGEpOworICAgIGF2X2ZyZWVwKCZ1dHYtPmJ1ZmZlcik7CisKKyAgICB1dHYtPmNvZGVjLT5FbmNvZGVFbmQoKTsKKyAgICBDQ29kZWM6OkRlbGV0ZUluc3RhbmNlKHV0di0+Y29kZWMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbGlidXR2aWRlb19lbmNvZGVyID0geworICAgICJsaWJ1dHZpZGVvIiwKKyAgICBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVXQgVmlkZW8iKSwKKyAgICBBVk1FRElBX1RZUEVfVklERU8sCisgICAgQVZfQ09ERUNfSURfVVRWSURFTywKKyAgICBDT0RFQ19DQVBfQVVUT19USFJFQURTIHwgQ09ERUNfQ0FQX0xPU1NMRVNTLAorICAgIE5VTEwsIC8qIHN1cHBvcnRlZF9mcmFtZXJhdGVzICovCisgICAgKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVlWNDIyLCBBVl9QSVhfRk1UX0JHUjI0LAorICAgICAgICBBVl9QSVhfRk1UX1JHQjMyLCBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorICAgIE5VTEwsIC8qIHN1cHBvcnRlZF9zYW1wbGVyYXRlcyAqLworICAgIE5VTEwsIC8qIHNhbXBsZV9mbXRzICovCisgICAgTlVMTCwgLyogY2hhbm5lbF9sYXlvdXRzICovCisgICAgMCwgICAgLyogbWF4X2xvd3JlcyAqLworICAgIE5VTEwsIC8qIHByaXZfY2xhc3MgKi8KKyAgICBOVUxMLCAvKiBwcm9maWxlcyAqLworICAgIHNpemVvZihVdFZpZGVvQ29udGV4dCksCisgICAgTlVMTCwgLyogbmV4dCAqLworICAgIE5VTEwsIC8qIGluaXRfdGhyZWFkX2NvcHkgKi8KKyAgICBOVUxMLCAvKiB1cGRhdGVfdGhyZWFkX2NvbnRleHQgKi8KKyAgICBOVUxMLCAvKiBkZWZhdWx0cyAqLworICAgIE5VTEwsIC8qIGluaXRfc3RhdGljX2RhdGEgKi8KKyAgICB1dHZpZGVvX2VuY29kZV9pbml0LAorICAgIE5VTEwsIC8qIGVuY29kZSAqLworICAgIHV0dmlkZW9fZW5jb2RlX2ZyYW1lLAorICAgIE5VTEwsIC8qIGRlY29kZSAqLworICAgIHV0dmlkZW9fZW5jb2RlX2Nsb3NlLAorICAgIE5VTEwsIC8qIGZsdXNoICovCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGlidm8tYWFjZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ2by1hYWNlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjM4ZDUxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlidm8tYWFjZW5jLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBBQUMgZW5jb2RlciB3cmFwcGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHZvLWFhY2VuYy92b0FBQy5oPgorI2luY2x1ZGUgPHZvLWFhY2VuYy9jbW5NZW1vcnkuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJhdWRpb19mcmFtZV9xdWV1ZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXBlZzRhdWRpby5oIgorCisjZGVmaW5lIEZSQU1FX1NJWkUgMTAyNAorI2RlZmluZSBFTkNfREVMQVkgIDE2MDAKKwordHlwZWRlZiBzdHJ1Y3QgQUFDQ29udGV4dCB7CisgICAgVk9fQVVESU9fQ09ERUNBUEkgY29kZWNfYXBpOworICAgIFZPX0hBTkRMRSBoYW5kbGU7CisgICAgVk9fTUVNX09QRVJBVE9SIG1lbV9vcGVyYXRvcjsKKyAgICBWT19DT0RFQ19JTklUX1VTRVJEQVRBIHVzZXJfZGF0YTsKKyAgICBWT19QQllURSBlbmRfYnVmZmVyOworICAgIEF1ZGlvRnJhbWVRdWV1ZSBhZnE7CisgICAgaW50IGxhc3RfZnJhbWU7CisgICAgaW50IGxhc3Rfc2FtcGxlczsKK30gQUFDQ29udGV4dDsKKworCitzdGF0aWMgaW50IGFhY19lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFBQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+Y29kZWNfYXBpLlVuaW5pdChzLT5oYW5kbGUpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBmZl9hZl9xdWV1ZV9jbG9zZSgmcy0+YWZxKTsKKyAgICBhdl9mcmVlcCgmcy0+ZW5kX2J1ZmZlcik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFhY19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQUFDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQUFDRU5DX1BBUkFNIHBhcmFtcyA9IHsgMCB9OworICAgIGludCBpbmRleCwgcmV0OworCisgICAgYXZjdHgtPmZyYW1lX3NpemUgPSBGUkFNRV9TSVpFOworICAgIGF2Y3R4LT5pbml0aWFsX3BhZGRpbmcgPSBFTkNfREVMQVk7CisgICAgcy0+bGFzdF9mcmFtZSAgICAgPSAyOworICAgIGZmX2FmX3F1ZXVlX2luaXQoYXZjdHgsICZzLT5hZnEpOworCisgICAgcy0+ZW5kX2J1ZmZlciA9IGF2X21hbGxvY3ooYXZjdHgtPmZyYW1lX3NpemUgKiBhdmN0eC0+Y2hhbm5lbHMgKiAyKTsKKyAgICBpZiAoIXMtPmVuZF9idWZmZXIpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHZvR2V0QUFDRW5jQVBJKCZzLT5jb2RlY19hcGkpOworCisgICAgcy0+bWVtX29wZXJhdG9yLkFsbG9jID0gY21uTWVtQWxsb2M7CisgICAgcy0+bWVtX29wZXJhdG9yLkNvcHkgPSBjbW5NZW1Db3B5OworICAgIHMtPm1lbV9vcGVyYXRvci5GcmVlID0gY21uTWVtRnJlZTsKKyAgICBzLT5tZW1fb3BlcmF0b3IuU2V0ID0gY21uTWVtU2V0OworICAgIHMtPm1lbV9vcGVyYXRvci5DaGVjayA9IGNtbk1lbUNoZWNrOworICAgIHMtPnVzZXJfZGF0YS5tZW1mbGFnID0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUjsKKyAgICBzLT51c2VyX2RhdGEubWVtRGF0YSA9ICZzLT5tZW1fb3BlcmF0b3I7CisgICAgcy0+Y29kZWNfYXBpLkluaXQoJnMtPmhhbmRsZSwgVk9fQVVESU9fQ29kaW5nQUFDLCAmcy0+dXNlcl9kYXRhKTsKKworICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIHBhcmFtcy5iaXRSYXRlICAgID0gYXZjdHgtPmJpdF9yYXRlOworICAgIHBhcmFtcy5uQ2hhbm5lbHMgID0gYXZjdHgtPmNoYW5uZWxzOworICAgIHBhcmFtcy5hZHRzVXNlZCAgID0gIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpOworICAgIGlmIChzLT5jb2RlY19hcGkuU2V0UGFyYW0ocy0+aGFuZGxlLCBWT19QSURfQUFDX0VOQ1BBUkFNLCAmcGFyYW1zKQorICAgICAgICAhPSBWT19FUlJfTk9ORSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBzZXQgZW5jb2RpbmcgcGFyYW1ldGVyc1xuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAxNjsgaW5kZXgrKykKKyAgICAgICAgaWYgKGF2Y3R4LT5zYW1wbGVfcmF0ZSA9PSBhdnByaXZfbXBlZzRhdWRpb19zYW1wbGVfcmF0ZXNbaW5kZXhdKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGluZGV4ID09IDE2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpIHsKKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMjsKKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSAgICAgID0gYXZfbWFsbG9jeihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhWzBdID0gMHgwMiA8PCAzIHwgaW5kZXggPj4gMTsKKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YVsxXSA9IChpbmRleCAmIDB4MDEpIDw8IDcgfCBhdmN0eC0+Y2hhbm5lbHMgPDwgMzsKKyAgICB9CisgICAgcmV0dXJuIDA7CitlcnJvcjoKKyAgICBhYWNfZW5jb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFhY19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCit7CisgICAgQUFDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVk9fQ09ERUNCVUZGRVIgaW5wdXQgPSB7IDAgfSwgb3V0cHV0ID0geyAwIH07CisgICAgVk9fQVVESU9fT1VUUFVUSU5GTyBvdXRwdXRfaW5mbyA9IHsgeyAwIH0gfTsKKyAgICBWT19QQllURSBzYW1wbGVzOworICAgIGludCByZXQ7CisKKyAgICAvKiBoYW5kbGUgZW5kLW9mLXN0cmVhbSBzbWFsbCBmcmFtZSBhbmQgZmx1c2hpbmcgKi8KKyAgICBpZiAoIWZyYW1lKSB7CisgICAgICAgIGlmIChzLT5sYXN0X2ZyYW1lIDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHMtPmxhc3Rfc2FtcGxlcyA+IDAgJiYgcy0+bGFzdF9zYW1wbGVzIDwgRU5DX0RFTEFZIC0gRlJBTUVfU0laRSkgeworICAgICAgICAgICAgcy0+bGFzdF9zYW1wbGVzID0gMDsKKyAgICAgICAgICAgIHMtPmxhc3RfZnJhbWUtLTsKKyAgICAgICAgfQorICAgICAgICBzLT5sYXN0X2ZyYW1lLS07CisgICAgICAgIG1lbXNldChzLT5lbmRfYnVmZmVyLCAwLCAyICogYXZjdHgtPmNoYW5uZWxzICogYXZjdHgtPmZyYW1lX3NpemUpOworICAgICAgICBzYW1wbGVzID0gcy0+ZW5kX2J1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZnJhbWUtPm5iX3NhbXBsZXMgPCBhdmN0eC0+ZnJhbWVfc2l6ZSkgeworICAgICAgICAgICAgcy0+bGFzdF9zYW1wbGVzID0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgICAgICAgICBtZW1jcHkocy0+ZW5kX2J1ZmZlciwgZnJhbWUtPmRhdGFbMF0sIDIgKiBhdmN0eC0+Y2hhbm5lbHMgKiBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgICAgICAgICBzYW1wbGVzID0gcy0+ZW5kX2J1ZmZlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNhbXBsZXMgPSAoVk9fUEJZVEUpZnJhbWUtPmRhdGFbMF07CisgICAgICAgIH0KKyAgICAgICAgLyogYWRkIGN1cnJlbnQgZnJhbWUgdG8gdGhlIHF1ZXVlICovCisgICAgICAgIGlmICgocmV0ID0gZmZfYWZfcXVldWVfYWRkKCZzLT5hZnEsIGZyYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBGRk1BWCg4MTkyLCA3NjggKiBhdmN0eC0+Y2hhbm5lbHMpKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaW5wdXQuQnVmZmVyICA9IHNhbXBsZXM7CisgICAgaW5wdXQuTGVuZ3RoICA9IDIgKiBhdmN0eC0+Y2hhbm5lbHMgKiBhdmN0eC0+ZnJhbWVfc2l6ZTsKKyAgICBvdXRwdXQuQnVmZmVyID0gYXZwa3QtPmRhdGE7CisgICAgb3V0cHV0Lkxlbmd0aCA9IGF2cGt0LT5zaXplOworCisgICAgcy0+Y29kZWNfYXBpLlNldElucHV0RGF0YShzLT5oYW5kbGUsICZpbnB1dCk7CisgICAgaWYgKHMtPmNvZGVjX2FwaS5HZXRPdXRwdXREYXRhKHMtPmhhbmRsZSwgJm91dHB1dCwgJm91dHB1dF9pbmZvKQorICAgICAgICAhPSBWT19FUlJfTk9ORSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBlbmNvZGUgZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8qIEdldCB0aGUgbmV4dCBmcmFtZSBwdHMvZHVyYXRpb24gKi8KKyAgICBmZl9hZl9xdWV1ZV9yZW1vdmUoJnMtPmFmcSwgYXZjdHgtPmZyYW1lX3NpemUsICZhdnBrdC0+cHRzLAorICAgICAgICAgICAgICAgICAgICAgICAmYXZwa3QtPmR1cmF0aW9uKTsKKworICAgIGF2cGt0LT5zaXplID0gb3V0cHV0Lkxlbmd0aDsKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworfQorCisvKiBkdXBsaWNhdGVkIGZyb20gYXZwcml2X21wZWc0YXVkaW9fc2FtcGxlX3JhdGVzIHRvIGF2b2lkIHNoYXJlZCBidWlsZAorICogZmFpbHVyZXMgKi8KK3N0YXRpYyBjb25zdCBpbnQgbXBlZzRhdWRpb19zYW1wbGVfcmF0ZXNbMTZdID0geworICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsCisgICAgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwCit9OworCitBVkNvZGVjIGZmX2xpYnZvX2FhY2VuY19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJ2b19hYWNlbmMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBbmRyb2lkIFZpc3VhbE9uIEFBQyAoQWR2YW5jZWQgQXVkaW8gQ29kaW5nKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BQUMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFBQ0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGFhY19lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBhYWNfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGFhY19lbmNvZGVfY2xvc2UsCisgICAgLnN1cHBvcnRlZF9zYW1wbGVyYXRlcyA9IG1wZWc0YXVkaW9fc2FtcGxlX3JhdGVzLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FIHwgQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGlidm8tYW1yd2JlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnZvLWFtcndiZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxOWU3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnZvLWFtcndiZW5jLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBBTVIgQXVkaW8gZW5jb2RlciBzdHViCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDx2by1hbXJ3YmVuYy9lbmNfaWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBNQVhfUEFDS0VUX1NJWkUgICgxICsgKDQ3NyArIDcpIC8gOCkKKwordHlwZWRlZiBzdHJ1Y3QgQU1SV0JDb250ZXh0IHsKKyAgICBBVkNsYXNzICphdl9jbGFzczsKKyAgICB2b2lkICAqc3RhdGU7CisgICAgaW50ICAgIG1vZGU7CisgICAgaW50ICAgIGxhc3RfYml0cmF0ZTsKKyAgICBpbnQgICAgYWxsb3dfZHR4OworfSBBTVJXQkNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiZHR4IiwgIkFsbG93IERUWCAoZ2VuZXJhdGUgY29tZm9ydCBub2lzZSkiLCBvZmZzZXRvZihBTVJXQkNvbnRleHQsIGFsbG93X2R0eCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGFtcndiX2NsYXNzID0geworICAgICJsaWJ2b19hbXJ3YmVuYyIsIGF2X2RlZmF1bHRfaXRlbV9uYW1lLCBvcHRpb25zLCBMSUJBVlVUSUxfVkVSU0lPTl9JTlQKK307CisKK3N0YXRpYyBpbnQgZ2V0X3diX2JpdHJhdGVfbW9kZShpbnQgYml0cmF0ZSwgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICAvKiBtYWtlIHRoZSBjb3JyZXNwb25kYW5jZSBiZXR3ZWVuIGJpdHJhdGUgYW5kIG1vZGUgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IHJhdGVzW10gPSB7ICA2NjAwLCAgODg1MCwgMTI2NTAsIDE0MjUwLCAxNTg1MCwgMTgyNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTg1MCwgMjMwNTAsIDIzODUwIH07CisgICAgaW50IGksIGJlc3QgPSAtMSwgbWluX2RpZmYgPSAwOworICAgIGNoYXIgbG9nX2J1ZlsyMDBdOworCisgICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgeworICAgICAgICBpZiAocmF0ZXNbaV0gPT0gYml0cmF0ZSkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICBpZiAoYmVzdCA8IDAgfHwgYWJzKHJhdGVzW2ldIC0gYml0cmF0ZSkgPCBtaW5fZGlmZikgeworICAgICAgICAgICAgYmVzdCAgICAgPSBpOworICAgICAgICAgICAgbWluX2RpZmYgPSBhYnMocmF0ZXNbaV0gLSBiaXRyYXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBubyBiaXRyYXRlIG1hdGNoaW5nIGV4YWN0bHksIGxvZyBhIHdhcm5pbmcgKi8KKyAgICBzbnByaW50Zihsb2dfYnVmLCBzaXplb2YobG9nX2J1ZiksICJiaXRyYXRlIG5vdCBzdXBwb3J0ZWQ6IHVzZSBvbmUgb2YgIik7CisgICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKyAgICAgICAgYXZfc3RybGNhdGYobG9nX2J1Ziwgc2l6ZW9mKGxvZ19idWYpLCAiJS4yZmssICIsIHJhdGVzW2ldICAgIC8gMTAwMC5mKTsKKyAgICBhdl9zdHJsY2F0Zihsb2dfYnVmLCBzaXplb2YobG9nX2J1ZiksICJ1c2luZyAlLjJmayIsIHJhdGVzW2Jlc3RdIC8gMTAwMC5mKTsKKyAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX1dBUk5JTkcsICIlc1xuIiwgbG9nX2J1Zik7CisKKyAgICByZXR1cm4gYmVzdDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFtcl93Yl9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQU1SV0JDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChhdmN0eC0+c2FtcGxlX3JhdGUgIT0gMTYwMDAgJiYgYXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfVU5PRkZJQ0lBTCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9ubHkgMTYwMDBIeiBzYW1wbGUgcmF0ZSBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgIT0gMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9ubHkgbW9ubyBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIHMtPm1vZGUgICAgICAgICAgICA9IGdldF93Yl9iaXRyYXRlX21vZGUoYXZjdHgtPmJpdF9yYXRlLCBhdmN0eCk7CisgICAgcy0+bGFzdF9iaXRyYXRlICAgID0gYXZjdHgtPmJpdF9yYXRlOworCisgICAgYXZjdHgtPmZyYW1lX3NpemUgID0gMzIwOworICAgIGF2Y3R4LT5pbml0aWFsX3BhZGRpbmcgPSAgODA7CisKKyAgICBzLT5zdGF0ZSAgICAgPSBFX0lGX2luaXQoKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtcl93Yl9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFNUldCQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBFX0lGX2V4aXQocy0+c3RhdGUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtcl93Yl9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCit7CisgICAgQU1SV0JDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBpbnQxNl90ICpzYW1wbGVzID0gKGNvbnN0IGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKyAgICBpbnQgc2l6ZSwgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgTUFYX1BBQ0tFVF9TSVpFKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHMtPmxhc3RfYml0cmF0ZSAhPSBhdmN0eC0+Yml0X3JhdGUpIHsKKyAgICAgICAgcy0+bW9kZSAgICAgICAgID0gZ2V0X3diX2JpdHJhdGVfbW9kZShhdmN0eC0+Yml0X3JhdGUsIGF2Y3R4KTsKKyAgICAgICAgcy0+bGFzdF9iaXRyYXRlID0gYXZjdHgtPmJpdF9yYXRlOworICAgIH0KKyAgICBzaXplID0gRV9JRl9lbmNvZGUocy0+c3RhdGUsIHMtPm1vZGUsIHNhbXBsZXMsIGF2cGt0LT5kYXRhLCBzLT5hbGxvd19kdHgpOworICAgIGlmIChzaXplIDw9IDAgfHwgc2l6ZSA+IE1BWF9QQUNLRVRfU0laRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGVuY29kaW5nIGZyYW1lXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgYXZwa3QtPnB0cyA9IGZyYW1lLT5wdHMgLSBmZl9zYW1wbGVzX3RvX3RpbWVfYmFzZShhdmN0eCwgYXZjdHgtPmluaXRpYWxfcGFkZGluZyk7CisKKyAgICBhdnBrdC0+c2l6ZSA9IHNpemU7CisgICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9saWJ2b19hbXJ3YmVuY19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJ2b19hbXJ3YmVuYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFuZHJvaWQgVmlzdWFsT24gQU1SLVdCICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKEFkYXB0aXZlIE11bHRpLVJhdGUgV2lkZS1CYW5kKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BTVJfV0IsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFNUldCQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gYW1yX3diX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGFtcl93Yl9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gYW1yX3diX2VuY29kZV9jbG9zZSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZhbXJ3Yl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJ2b3JiaXNkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnZvcmJpc2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDA1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ2b3JiaXNkZWMuYwpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNYXJrIEhpbGxzIDxtYXJrQHBvZ28ub3JnLnVrPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8dm9yYmlzL3ZvcmJpc2VuYy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBPZ2dWb3JiaXNEZWNDb250ZXh0IHsKKyAgICB2b3JiaXNfaW5mbyB2aTsgICAgICAgICAgICAgICAgICAgICAvKio8IHZvcmJpc19pbmZvIHVzZWQgZHVyaW5nIGluaXQgICAqLworICAgIHZvcmJpc19kc3Bfc3RhdGUgdmQ7ICAgICAgICAgICAgICAgIC8qKjwgRFNQIHN0YXRlIHVzZWQgZm9yIGFuYWx5c2lzICAgICovCisgICAgdm9yYmlzX2Jsb2NrIHZiOyAgICAgICAgICAgICAgICAgICAgLyoqPCB2b3JiaXNfYmxvY2sgdXNlZCBmb3IgYW5hbHlzaXMgKi8KKyAgICB2b3JiaXNfY29tbWVudCB2YzsgICAgICAgICAgICAgICAgICAvKio8IFZvcmJpc0NvbW1lbnQgaW5mbyAgICAgICAgICAgICAqLworICAgIG9nZ19wYWNrZXQgb3A7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgb2dnIHBhY2tldCAgICAgICAgICAgICAgICAgICAgICovCit9IE9nZ1ZvcmJpc0RlY0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgb2dndm9yYmlzX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmNjb250ZXh0KSB7CisgICAgT2dnVm9yYmlzRGVjQ29udGV4dCAqY29udGV4dCA9IGF2Y2NvbnRleHQtPnByaXZfZGF0YSA7CisgICAgdWludDhfdCAqcD0gYXZjY29udGV4dC0+ZXh0cmFkYXRhOworICAgIGludCBpLCBoc2l6ZXNbM10sIHJldDsKKyAgICB1bnNpZ25lZCBjaGFyICpoZWFkZXJzWzNdLCAqZXh0cmFkYXRhID0gYXZjY29udGV4dC0+ZXh0cmFkYXRhOworCisgICAgaWYoISBhdmNjb250ZXh0LT5leHRyYWRhdGFfc2l6ZSB8fCAhIHApIHsKKyAgICAgICAgYXZfbG9nKGF2Y2NvbnRleHQsIEFWX0xPR19FUlJPUiwgInZvcmJpcyBleHRyYWRhdGEgYWJzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICB2b3JiaXNfaW5mb19pbml0KCZjb250ZXh0LT52aSkgOworICAgIHZvcmJpc19jb21tZW50X2luaXQoJmNvbnRleHQtPnZjKSA7CisKKyAgICBpZihwWzBdID09IDAgJiYgcFsxXSA9PSAzMCkgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspeworICAgICAgICAgICAgaHNpemVzW2ldID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigoY29uc3QgdWludDhfdCAqKikmcCk7CisgICAgICAgICAgICBoZWFkZXJzW2ldID0gcDsKKyAgICAgICAgICAgIHAgKz0gaHNpemVzW2ldOworICAgICAgICB9CisgICAgfSBlbHNlIGlmKCpwID09IDIpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldCA9IDE7CisgICAgICAgIHArKzsKKyAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspIHsKKyAgICAgICAgICAgIGhzaXplc1tpXSA9IDA7CisgICAgICAgICAgICB3aGlsZSgoKnAgPT0gMHhGRikgJiYgKG9mZnNldCA8IGF2Y2NvbnRleHQtPmV4dHJhZGF0YV9zaXplKSkgeworICAgICAgICAgICAgICAgIGhzaXplc1tpXSArPSAweEZGOworICAgICAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG9mZnNldCA+PSBhdmNjb250ZXh0LT5leHRyYWRhdGFfc2l6ZSAtIDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjY29udGV4dCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAidm9yYmlzIGhlYWRlciBzaXplcyBkYW1hZ2VkXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoc2l6ZXNbaV0gKz0gKnA7CisgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgICAgICBoc2l6ZXNbMl0gPSBhdmNjb250ZXh0LT5leHRyYWRhdGFfc2l6ZSAtIGhzaXplc1swXS1oc2l6ZXNbMV0tb2Zmc2V0OworI2lmIDAKKyAgICAgICAgYXZfbG9nKGF2Y2NvbnRleHQsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJ2b3JiaXMgaGVhZGVyIHNpemVzOiAlZCwgJWQsICVkLCAvIGV4dHJhZGF0YV9sZW4gaXMgJWQgXG4iLAorICAgICAgICAgICAgICAgaHNpemVzWzBdLCBoc2l6ZXNbMV0sIGhzaXplc1syXSwgYXZjY29udGV4dC0+ZXh0cmFkYXRhX3NpemUpOworI2VuZGlmCisgICAgICAgIGhlYWRlcnNbMF0gPSBleHRyYWRhdGEgKyBvZmZzZXQ7CisgICAgICAgIGhlYWRlcnNbMV0gPSBleHRyYWRhdGEgKyBvZmZzZXQgKyBoc2l6ZXNbMF07CisgICAgICAgIGhlYWRlcnNbMl0gPSBleHRyYWRhdGEgKyBvZmZzZXQgKyBoc2l6ZXNbMF0gKyBoc2l6ZXNbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGF2Y2NvbnRleHQsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJ2b3JiaXMgaW5pdGlhbCBoZWFkZXIgbGVuIGlzIHdyb25nOiAlZFxuIiwgKnApOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGZvcihpPTA7IGk8MzsgaSsrKXsKKyAgICAgICAgY29udGV4dC0+b3AuYl9vX3M9IGk9PTA7CisgICAgICAgIGNvbnRleHQtPm9wLmJ5dGVzID0gaHNpemVzW2ldOworICAgICAgICBjb250ZXh0LT5vcC5wYWNrZXQgPSBoZWFkZXJzW2ldOworICAgICAgICBpZih2b3JiaXNfc3ludGhlc2lzX2hlYWRlcmluKCZjb250ZXh0LT52aSwgJmNvbnRleHQtPnZjLCAmY29udGV4dC0+b3ApPDApeworICAgICAgICAgICAgYXZfbG9nKGF2Y2NvbnRleHQsIEFWX0xPR19FUlJPUiwgIiVkLiB2b3JiaXMgaGVhZGVyIGRhbWFnZWRcbiIsIGkrMSk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2Y2NvbnRleHQtPmNoYW5uZWxzID0gY29udGV4dC0+dmkuY2hhbm5lbHM7CisgICAgYXZjY29udGV4dC0+c2FtcGxlX3JhdGUgPSBjb250ZXh0LT52aS5yYXRlOworICAgIGF2Y2NvbnRleHQtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKyAgICBhdmNjb250ZXh0LT50aW1lX2Jhc2U9IChBVlJhdGlvbmFsKXsxLCBhdmNjb250ZXh0LT5zYW1wbGVfcmF0ZX07CisKKyAgICB2b3JiaXNfc3ludGhlc2lzX2luaXQoJmNvbnRleHQtPnZkLCAmY29udGV4dC0+dmkpOworICAgIHZvcmJpc19ibG9ja19pbml0KCZjb250ZXh0LT52ZCwgJmNvbnRleHQtPnZiKTsKKworICAgIHJldHVybiAwIDsKKworICBlcnJvcjoKKyAgICB2b3JiaXNfaW5mb19jbGVhcigmY29udGV4dC0+dmkpOworICAgIHZvcmJpc19jb21tZW50X2NsZWFyKCZjb250ZXh0LT52YykgOworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgY29udihpbnQgc2FtcGxlcywgZmxvYXQgKipwY20sIGNoYXIgKmJ1ZiwgaW50IGNoYW5uZWxzKSB7CisgICAgaW50IGksIGo7CisgICAgb2dnX2ludDE2X3QgKnB0ciwgKmRhdGEgPSAob2dnX2ludDE2X3QqKWJ1ZiA7CisgICAgZmxvYXQgKm1vbm8gOworCisgICAgZm9yKGkgPSAwIDsgaSA8IGNoYW5uZWxzIDsgaSsrKXsKKyAgICAgICAgcHRyID0gJmRhdGFbaV07CisgICAgICAgIG1vbm8gPSBwY21baV0gOworCisgICAgICAgIGZvcihqID0gMCA7IGogPCBzYW1wbGVzIDsgaisrKSB7CisgICAgICAgICAgICAqcHRyID0gYXZfY2xpcF9pbnQxNihtb25vW2pdICogMzI3NjcuZik7CisgICAgICAgICAgICBwdHIgKz0gY2hhbm5lbHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMCA7Cit9CisKK3N0YXRpYyBpbnQgb2dndm9yYmlzX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjY29udGV4dCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIE9nZ1ZvcmJpc0RlY0NvbnRleHQgKmNvbnRleHQgPSBhdmNjb250ZXh0LT5wcml2X2RhdGEgOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBmbG9hdCAqKnBjbSA7CisgICAgb2dnX3BhY2tldCAqb3A9ICZjb250ZXh0LT5vcDsKKyAgICBpbnQgc2FtcGxlcywgdG90YWxfc2FtcGxlcywgdG90YWxfYnl0ZXM7CisgICAgaW50IHJldDsKKyAgICBpbnQxNl90ICpvdXRwdXQ7CisKKyAgICBpZighYXZwa3QtPnNpemUpeworICAgIC8vRklYTUUgZmx1c2gKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSA4MTkyKjQ7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y2NvbnRleHQsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG91dHB1dCA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisKKworICAgIG9wLT5wYWNrZXQgPSBhdnBrdC0+ZGF0YTsKKyAgICBvcC0+Ynl0ZXMgID0gYXZwa3QtPnNpemU7CisKKy8vICAgIGF2X2xvZyhhdmNjb250ZXh0LCBBVl9MT0dfREVCVUcsICIlZCAlZCAlZCAlIlBSSWQ2NCIgJSJQUklkNjQiICVkICVkXG4iLCBvcC0+Ynl0ZXMsIG9wLT5iX29fcywgb3AtPmVfb19zLCBvcC0+Z3JhbnVsZXBvcywgb3AtPnBhY2tldG5vLCBidWZfc2l6ZSwgY29udGV4dC0+dmkucmF0ZSk7CisKKy8qICAgIGZvcihpPTA7IGk8b3AtPmJ5dGVzOyBpKyspCisgICAgICBhdl9sb2coYXZjY29udGV4dCwgQVZfTE9HX0RFQlVHLCAiJTAyWCAiLCBvcC0+cGFja2V0W2ldKTsKKyAgICBhdl9sb2coYXZjY29udGV4dCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsqLworCisgICAgaWYodm9yYmlzX3N5bnRoZXNpcygmY29udGV4dC0+dmIsIG9wKSA9PSAwKQorICAgICAgICB2b3JiaXNfc3ludGhlc2lzX2Jsb2NraW4oJmNvbnRleHQtPnZkLCAmY29udGV4dC0+dmIpIDsKKworICAgIHRvdGFsX3NhbXBsZXMgPSAwIDsKKyAgICB0b3RhbF9ieXRlcyA9IDAgOworCisgICAgd2hpbGUoKHNhbXBsZXMgPSB2b3JiaXNfc3ludGhlc2lzX3BjbW91dCgmY29udGV4dC0+dmQsICZwY20pKSA+IDApIHsKKyAgICAgICAgY29udihzYW1wbGVzLCBwY20sIChjaGFyKilvdXRwdXQgKyB0b3RhbF9ieXRlcywgY29udGV4dC0+dmkuY2hhbm5lbHMpIDsKKyAgICAgICAgdG90YWxfYnl0ZXMgKz0gc2FtcGxlcyAqIDIgKiBjb250ZXh0LT52aS5jaGFubmVscyA7CisgICAgICAgIHRvdGFsX3NhbXBsZXMgKz0gc2FtcGxlcyA7CisgICAgICAgIHZvcmJpc19zeW50aGVzaXNfcmVhZCgmY29udGV4dC0+dmQsIHNhbXBsZXMpIDsKKyAgICB9CisKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IHRvdGFsX3NhbXBsZXM7CisgICAgKmdvdF9mcmFtZV9wdHIgICA9IHRvdGFsX3NhbXBsZXMgPiAwOworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworCitzdGF0aWMgaW50IG9nZ3ZvcmJpc19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y2NvbnRleHQpIHsKKyAgICBPZ2dWb3JiaXNEZWNDb250ZXh0ICpjb250ZXh0ID0gYXZjY29udGV4dC0+cHJpdl9kYXRhIDsKKworICAgIHZvcmJpc19pbmZvX2NsZWFyKCZjb250ZXh0LT52aSkgOworICAgIHZvcmJpc19jb21tZW50X2NsZWFyKCZjb250ZXh0LT52YykgOworCisgICAgcmV0dXJuIDAgOworfQorCisKK0FWQ29kZWMgZmZfbGlidm9yYmlzX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYnZvcmJpcyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYnZvcmJpcyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WT1JCSVMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE9nZ1ZvcmJpc0RlY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IG9nZ3ZvcmJpc19kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBvZ2d2b3JiaXNfZGVjb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IG9nZ3ZvcmJpc19kZWNvZGVfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RFTEFZLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnZvcmJpc2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlidm9yYmlzZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxZDFiZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnZvcmJpc2VuYy5jCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIE1hcmsgSGlsbHMgPG1hcmtAcG9nby5vcmcudWs+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDx2b3JiaXMvdm9yYmlzZW5jLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYXVkaW9fZnJhbWVfcXVldWUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZvcmJpcy5oIgorI2luY2x1ZGUgInZvcmJpc19wYXJzZXIuaCIKKworCisvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0aGUgdXNlciBzaG91bGQgc2VuZCBpbiBlYWNoIGNhbGwuCisgKiBUaGlzIHZhbHVlIGlzIHVzZWQgYmVjYXVzZSBpdCBpcyB0aGUgTENEIG9mIGFsbCBwb3NzaWJsZSBmcmFtZSBzaXplcywgc28KKyAqIGFuIG91dHB1dCBwYWNrZXQgd2lsbCBhbHdheXMgc3RhcnQgYXQgdGhlIHNhbWUgcG9pbnQgYXMgb25lIG9mIHRoZSBpbnB1dAorICogcGFja2V0cy4KKyAqLworI2RlZmluZSBMSUJWT1JCSVNfRlJBTUVfU0laRSA2NAorCisjZGVmaW5lIEJVRkZFUl9TSVpFICgxMDI0ICogNjQpCisKK3R5cGVkZWYgc3RydWN0IExpYnZvcmJpc0VuY0NvbnRleHQgeworICAgIEFWQ2xhc3MgKmF2X2NsYXNzOyAgICAgICAgICAgICAgICAgIC8qKjwgY2xhc3MgZm9yIEFWT3B0aW9ucyAgICAgICAgICAgICovCisgICAgdm9yYmlzX2luZm8gdmk7ICAgICAgICAgICAgICAgICAgICAgLyoqPCB2b3JiaXNfaW5mbyB1c2VkIGR1cmluZyBpbml0ICAgKi8KKyAgICB2b3JiaXNfZHNwX3N0YXRlIHZkOyAgICAgICAgICAgICAgICAvKio8IERTUCBzdGF0ZSB1c2VkIGZvciBhbmFseXNpcyAgICAqLworICAgIHZvcmJpc19ibG9jayB2YjsgICAgICAgICAgICAgICAgICAgIC8qKjwgdm9yYmlzX2Jsb2NrIHVzZWQgZm9yIGFuYWx5c2lzICovCisgICAgQVZGaWZvQnVmZmVyICpwa3RfZmlmbzsgICAgICAgICAgICAgLyoqPCBvdXRwdXQgcGFja2V0IGJ1ZmZlciAgICAgICAgICAgKi8KKyAgICBpbnQgZW9mOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGVuZC1vZi1maWxlIGZsYWcgICAgICAgICAgICAgICAqLworICAgIGludCBkc3BfaW5pdGlhbGl6ZWQ7ICAgICAgICAgICAgICAgIC8qKjwgdmQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgICAgICAgICovCisgICAgdm9yYmlzX2NvbW1lbnQgdmM7ICAgICAgICAgICAgICAgICAgLyoqPCBWb3JiaXNDb21tZW50IGluZm8gICAgICAgICAgICAgKi8KKyAgICBkb3VibGUgaWJsb2NrOyAgICAgICAgICAgICAgICAgICAgICAvKio8IGltcHVsc2UgYmxvY2sgYmlhcyBvcHRpb24gICAgICAqLworICAgIEFWVm9yYmlzUGFyc2VDb250ZXh0ICp2cDsgICAgICAgICAgIC8qKjwgcGFyc2UgY29udGV4dCB0byBnZXQgZHVyYXRpb25zICovCisgICAgQXVkaW9GcmFtZVF1ZXVlIGFmcTsgICAgICAgICAgICAgICAgLyoqPCBmcmFtZSBxdWV1ZSBmb3IgdGltZXN0YW1wcyAgICAgKi8KK30gTGlidm9yYmlzRW5jQ29udGV4dDsKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJpYmxvY2siLCAiU2V0cyB0aGUgaW1wdWxzZSBibG9jayBiaWFzIiwgb2Zmc2V0b2YoTGlidm9yYmlzRW5jQ29udGV4dCwgaWJsb2NrKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSAwIH0sIC0xNSwgMCwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgZGVmYXVsdHNbXSA9IHsKKyAgICB7ICJiIiwgICIwIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgdm9yYmlzX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImxpYnZvcmJpcyIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgaW50IHZvcmJpc19lcnJvcl90b19hdmVycm9yKGludCBvdl9lcnIpCit7CisgICAgc3dpdGNoIChvdl9lcnIpIHsKKyAgICBjYXNlIE9WX0VGQVVMVDogcmV0dXJuIEFWRVJST1JfQlVHOworICAgIGNhc2UgT1ZfRUlOVkFMOiByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGNhc2UgT1ZfRUlNUEw6ICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGRlZmF1bHQ6ICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYnZvcmJpc19zZXR1cCh2b3JiaXNfaW5mbyAqdmksIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMaWJ2b3JiaXNFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBkb3VibGUgY2ZyZXE7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FTQ0FMRSB8fCAhYXZjdHgtPmJpdF9yYXRlKSB7CisgICAgICAgIC8qIHZhcmlhYmxlIGJpdHJhdGUKKyAgICAgICAgICogTk9URTogd2UgdXNlIHRoZSBvZ2dlbmMgcmFuZ2Ugb2YgLTEgdG8gMTAgZm9yIGdsb2JhbF9xdWFsaXR5IGZvcgorICAgICAgICAgKiAgICAgICB1c2VyIGNvbnZlbmllbmNlLCBidXQgbGlidm9yYmlzIHVzZXMgLTAuMSB0byAxLjAuCisgICAgICAgICAqLworICAgICAgICBmbG9hdCBxID0gYXZjdHgtPmdsb2JhbF9xdWFsaXR5IC8gKGZsb2F0KUZGX1FQMkxBTUJEQTsKKyAgICAgICAgLyogZGVmYXVsdCB0byAzIGlmIHRoZSB1c2VyIGRpZCBub3Qgc2V0IHF1YWxpdHkgb3IgYml0cmF0ZSAqLworICAgICAgICBpZiAoIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FTQ0FMRSkpCisgICAgICAgICAgICBxID0gMy4wOworICAgICAgICBpZiAoKHJldCA9IHZvcmJpc19lbmNvZGVfc2V0dXBfdmJyKHZpLCBhdmN0eC0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgLyAxMC4wKSkpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBtaW5yYXRlID0gYXZjdHgtPnJjX21pbl9yYXRlID4gMCA/IGF2Y3R4LT5yY19taW5fcmF0ZSA6IC0xOworICAgICAgICBpbnQgbWF4cmF0ZSA9IGF2Y3R4LT5yY19tYXhfcmF0ZSA+IDAgPyBhdmN0eC0+cmNfbWF4X3JhdGUgOiAtMTsKKworICAgICAgICAvKiBhdmVyYWdlIGJpdHJhdGUgKi8KKyAgICAgICAgaWYgKChyZXQgPSB2b3JiaXNfZW5jb2RlX3NldHVwX21hbmFnZWQodmksIGF2Y3R4LT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlLCBtYXhyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Yml0X3JhdGUsIG1pbnJhdGUpKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgLyogdmFyaWFibGUgYml0cmF0ZSBieSBlc3RpbWF0ZSwgZGlzYWJsZSBzbG93IHJhdGUgbWFuYWdlbWVudCAqLworICAgICAgICBpZiAobWlucmF0ZSA9PSAtMSAmJiBtYXhyYXRlID09IC0xKQorICAgICAgICAgICAgaWYgKChyZXQgPSB2b3JiaXNfZW5jb2RlX2N0bCh2aSwgT1ZfRUNUTF9SQVRFTUFOQUdFMl9TRVQsIE5VTEwpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOyAvKiBzaG91bGQgbm90IGhhcHBlbiAqLworICAgIH0KKworICAgIC8qIGN1dG9mZiBmcmVxdWVuY3kgKi8KKyAgICBpZiAoYXZjdHgtPmN1dG9mZiA+IDApIHsKKyAgICAgICAgY2ZyZXEgPSBhdmN0eC0+Y3V0b2ZmIC8gMTAwMC4wOworICAgICAgICBpZiAoKHJldCA9IHZvcmJpc19lbmNvZGVfY3RsKHZpLCBPVl9FQ1RMX0xPV1BBU1NfU0VULCAmY2ZyZXEpKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7IC8qIHNob3VsZCBub3QgaGFwcGVuICovCisgICAgfQorCisgICAgLyogaW1wdWxzZSBibG9jayBiaWFzICovCisgICAgaWYgKHMtPmlibG9jaykgeworICAgICAgICBpZiAoKHJldCA9IHZvcmJpc19lbmNvZGVfY3RsKHZpLCBPVl9FQ1RMX0lCTE9DS19TRVQsICZzLT5pYmxvY2spKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA9PSAzICYmCisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgIT0gKEFWX0NIX0xBWU9VVF9TVEVSRU98QVZfQ0hfRlJPTlRfQ0VOVEVSKSB8fAorICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgPT0gNCAmJgorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ICE9IEFWX0NIX0xBWU9VVF8yXzIgJiYKKyAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCAhPSBBVl9DSF9MQVlPVVRfUVVBRCB8fAorICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgPT0gNSAmJgorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ICE9IEFWX0NIX0xBWU9VVF81UE9JTlQwICYmCisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgIT0gQVZfQ0hfTEFZT1VUXzVQT0lOVDBfQkFDSyB8fAorICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgPT0gNiAmJgorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ICE9IEFWX0NIX0xBWU9VVF81UE9JTlQxICYmCisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgIT0gQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSyB8fAorICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgPT0gNyAmJgorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ICE9IChBVl9DSF9MQVlPVVRfNVBPSU5UMXxBVl9DSF9CQUNLX0NFTlRFUikgfHwKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxzID09IDggJiYKKyAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCAhPSBBVl9DSF9MQVlPVVRfN1BPSU5UMSkgeworICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgICAgICBjaGFyIG5hbWVbMzJdOworICAgICAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhuYW1lLCBzaXplb2YobmFtZSksIGF2Y3R4LT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiJXMgbm90IHN1cHBvcnRlZCBieSBWb3JiaXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgc3RyZWFtIHdpbGwgaGF2ZSBpbmNvcnJlY3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbGF5b3V0LlxuIiwgbmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiTm8gY2hhbm5lbCBsYXlvdXQgc3BlY2lmaWVkLiBUaGUgZW5jb2RlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWxsIHVzZSBWb3JiaXMgY2hhbm5lbCBsYXlvdXQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIGNoYW5uZWxzLlxuIiwgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocmV0ID0gdm9yYmlzX2VuY29kZV9zZXR1cF9pbml0KHZpKSkpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICByZXR1cm4gMDsKK2Vycm9yOgorICAgIHJldHVybiB2b3JiaXNfZXJyb3JfdG9fYXZlcnJvcihyZXQpOworfQorCisvKiBIb3cgbWFueSBieXRlcyBhcmUgbmVlZGVkIGZvciBhIGJ1ZmZlciBvZiBsZW5ndGggJ2wnICovCitzdGF0aWMgaW50IHhpcGhfbGVuKGludCBsKQoreworICAgIHJldHVybiAxICsgbCAvIDI1NSArIGw7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJ2b3JiaXNfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMaWJ2b3JiaXNFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIC8qIG5vdGlmeSB2b3JiaXNlbmMgdGhpcyBpcyBFT0YgKi8KKyAgICBpZiAocy0+ZHNwX2luaXRpYWxpemVkKQorICAgICAgICB2b3JiaXNfYW5hbHlzaXNfd3JvdGUoJnMtPnZkLCAwKTsKKworICAgIHZvcmJpc19ibG9ja19jbGVhcigmcy0+dmIpOworICAgIHZvcmJpc19kc3BfY2xlYXIoJnMtPnZkKTsKKyAgICB2b3JiaXNfaW5mb19jbGVhcigmcy0+dmkpOworCisgICAgYXZfZmlmb19mcmVlcCgmcy0+cGt0X2ZpZm8pOworICAgIGZmX2FmX3F1ZXVlX2Nsb3NlKCZzLT5hZnEpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKworICAgIGF2X3ZvcmJpc19wYXJzZV9mcmVlKCZzLT52cCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYnZvcmJpc19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTGlidm9yYmlzRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgb2dnX3BhY2tldCBoZWFkZXIsIGhlYWRlcl9jb21tLCBoZWFkZXJfY29kZTsKKyAgICB1aW50OF90ICpwOworICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisgICAgaW50IHJldDsKKworICAgIHZvcmJpc19pbmZvX2luaXQoJnMtPnZpKTsKKyAgICBpZiAoKHJldCA9IGxpYnZvcmJpc19zZXR1cCgmcy0+dmksIGF2Y3R4KSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlbmNvZGVyIHNldHVwIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGlmICgocmV0ID0gdm9yYmlzX2FuYWx5c2lzX2luaXQoJnMtPnZkLCAmcy0+dmkpKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImFuYWx5c2lzIGluaXQgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0ID0gdm9yYmlzX2Vycm9yX3RvX2F2ZXJyb3IocmV0KTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcy0+ZHNwX2luaXRpYWxpemVkID0gMTsKKyAgICBpZiAoKHJldCA9IHZvcmJpc19ibG9ja19pbml0KCZzLT52ZCwgJnMtPnZiKSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkc3AgaW5pdCBmYWlsZWRcbiIpOworICAgICAgICByZXQgPSB2b3JiaXNfZXJyb3JfdG9fYXZlcnJvcihyZXQpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHZvcmJpc19jb21tZW50X2luaXQoJnMtPnZjKTsKKyAgICBpZiAoIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKSkKKyAgICAgICAgdm9yYmlzX2NvbW1lbnRfYWRkX3RhZygmcy0+dmMsICJlbmNvZGVyIiwgTElCQVZDT0RFQ19JREVOVCk7CisKKyAgICBpZiAoKHJldCA9IHZvcmJpc19hbmFseXNpc19oZWFkZXJvdXQoJnMtPnZkLCAmcy0+dmMsICZoZWFkZXIsICZoZWFkZXJfY29tbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlcl9jb2RlKSkpIHsKKyAgICAgICAgcmV0ID0gdm9yYmlzX2Vycm9yX3RvX2F2ZXJyb3IocmV0KTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSAxICsgeGlwaF9sZW4oaGVhZGVyLmJ5dGVzKSAgICAgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGlwaF9sZW4oaGVhZGVyX2NvbW0uYnl0ZXMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvZGUuYnl0ZXM7CisgICAgcCA9IGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2MoYXZjdHgtPmV4dHJhZGF0YV9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIXApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBwWzBdICAgID0gMjsKKyAgICBvZmZzZXQgID0gMTsKKyAgICBvZmZzZXQgKz0gYXZfeGlwaGxhY2luZygmcFtvZmZzZXRdLCBoZWFkZXIuYnl0ZXMpOworICAgIG9mZnNldCArPSBhdl94aXBobGFjaW5nKCZwW29mZnNldF0sIGhlYWRlcl9jb21tLmJ5dGVzKTsKKyAgICBtZW1jcHkoJnBbb2Zmc2V0XSwgaGVhZGVyLnBhY2tldCwgaGVhZGVyLmJ5dGVzKTsKKyAgICBvZmZzZXQgKz0gaGVhZGVyLmJ5dGVzOworICAgIG1lbWNweSgmcFtvZmZzZXRdLCBoZWFkZXJfY29tbS5wYWNrZXQsIGhlYWRlcl9jb21tLmJ5dGVzKTsKKyAgICBvZmZzZXQgKz0gaGVhZGVyX2NvbW0uYnl0ZXM7CisgICAgbWVtY3B5KCZwW29mZnNldF0sIGhlYWRlcl9jb2RlLnBhY2tldCwgaGVhZGVyX2NvZGUuYnl0ZXMpOworICAgIG9mZnNldCArPSBoZWFkZXJfY29kZS5ieXRlczsKKyAgICBhdl9hc3NlcnQwKG9mZnNldCA9PSBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgcy0+dnAgPSBhdl92b3JiaXNfcGFyc2VfaW5pdChhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgIGlmICghcy0+dnApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGV4dHJhZGF0YVxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgdm9yYmlzX2NvbW1lbnRfY2xlYXIoJnMtPnZjKTsKKworICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gTElCVk9SQklTX0ZSQU1FX1NJWkU7CisgICAgZmZfYWZfcXVldWVfaW5pdChhdmN0eCwgJnMtPmFmcSk7CisKKyAgICBzLT5wa3RfZmlmbyA9IGF2X2ZpZm9fYWxsb2MoQlVGRkVSX1NJWkUpOworICAgIGlmICghcy0+cGt0X2ZpZm8pIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldHVybiAwOworZXJyb3I6CisgICAgbGlidm9yYmlzX2VuY29kZV9jbG9zZShhdmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsaWJ2b3JiaXNfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIExpYnZvcmJpc0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIG9nZ19wYWNrZXQgb3A7CisgICAgaW50IHJldCwgZHVyYXRpb247CisKKyAgICAvKiBzZW5kIHNhbXBsZXMgdG8gbGlidm9yYmlzICovCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGNvbnN0IGludCBzYW1wbGVzID0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgICAgIGZsb2F0ICoqYnVmZmVyOworICAgICAgICBpbnQgYywgY2hhbm5lbHMgPSBzLT52aS5jaGFubmVsczsKKworICAgICAgICBidWZmZXIgPSB2b3JiaXNfYW5hbHlzaXNfYnVmZmVyKCZzLT52ZCwgc2FtcGxlcyk7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICBpbnQgY28gPSAoY2hhbm5lbHMgPiA4KSA/IGMgOgorICAgICAgICAgICAgICAgICAgICAgZmZfdm9yYmlzX2VuY29kaW5nX2NoYW5uZWxfbGF5b3V0X29mZnNldHNbY2hhbm5lbHMgLSAxXVtjXTsKKyAgICAgICAgICAgIG1lbWNweShidWZmZXJbY10sIGZyYW1lLT5leHRlbmRlZF9kYXRhW2NvXSwKKyAgICAgICAgICAgICAgICAgICBzYW1wbGVzICogc2l6ZW9mKCpidWZmZXJbY10pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJldCA9IHZvcmJpc19hbmFseXNpc193cm90ZSgmcy0+dmQsIHNhbXBsZXMpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgaW4gdm9yYmlzX2FuYWx5c2lzX3dyb3RlKClcbiIpOworICAgICAgICAgICAgcmV0dXJuIHZvcmJpc19lcnJvcl90b19hdmVycm9yKHJldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBmZl9hZl9xdWV1ZV9hZGQoJnMtPmFmcSwgZnJhbWUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghcy0+ZW9mICYmIHMtPmFmcS5mcmFtZV9hbGxvYykKKyAgICAgICAgICAgIGlmICgocmV0ID0gdm9yYmlzX2FuYWx5c2lzX3dyb3RlKCZzLT52ZCwgMCkpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgaW4gdm9yYmlzX2FuYWx5c2lzX3dyb3RlKClcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiB2b3JiaXNfZXJyb3JfdG9fYXZlcnJvcihyZXQpOworICAgICAgICAgICAgfQorICAgICAgICBzLT5lb2YgPSAxOworICAgIH0KKworICAgIC8qIHJldHJpZXZlIGF2YWlsYWJsZSBwYWNrZXRzIGZyb20gbGlidm9yYmlzICovCisgICAgd2hpbGUgKChyZXQgPSB2b3JiaXNfYW5hbHlzaXNfYmxvY2tvdXQoJnMtPnZkLCAmcy0+dmIpKSA9PSAxKSB7CisgICAgICAgIGlmICgocmV0ID0gdm9yYmlzX2FuYWx5c2lzKCZzLT52YiwgTlVMTCkpIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoKHJldCA9IHZvcmJpc19iaXRyYXRlX2FkZGJsb2NrKCZzLT52YikpIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGFkZCBhbnkgYXZhaWxhYmxlIHBhY2tldHMgdG8gdGhlIG91dHB1dCBwYWNrZXQgYnVmZmVyICovCisgICAgICAgIHdoaWxlICgocmV0ID0gdm9yYmlzX2JpdHJhdGVfZmx1c2hwYWNrZXQoJnMtPnZkLCAmb3ApKSA9PSAxKSB7CisgICAgICAgICAgICBpZiAoYXZfZmlmb19zcGFjZShzLT5wa3RfZmlmbykgPCBzaXplb2Yob2dnX3BhY2tldCkgKyBvcC5ieXRlcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGFja2V0IGJ1ZmZlciBpcyB0b28gc21hbGxcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShzLT5wa3RfZmlmbywgJm9wLCBzaXplb2Yob2dnX3BhY2tldCksIE5VTEwpOworICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKHMtPnBrdF9maWZvLCBvcC5wYWNrZXQsIG9wLmJ5dGVzLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBnZXR0aW5nIGF2YWlsYWJsZSBwYWNrZXRzXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgZ2V0dGluZyBhdmFpbGFibGUgcGFja2V0c1xuIik7CisgICAgICAgIHJldHVybiB2b3JiaXNfZXJyb3JfdG9fYXZlcnJvcihyZXQpOworICAgIH0KKworICAgIC8qIGNoZWNrIGZvciBhdmFpbGFibGUgcGFja2V0cyAqLworICAgIGlmIChhdl9maWZvX3NpemUocy0+cGt0X2ZpZm8pIDwgc2l6ZW9mKG9nZ19wYWNrZXQpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKHMtPnBrdF9maWZvLCAmb3AsIHNpemVvZihvZ2dfcGFja2V0KSwgTlVMTCk7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBvcC5ieXRlcykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzLT5wa3RfZmlmbywgYXZwa3QtPmRhdGEsIG9wLmJ5dGVzLCBOVUxMKTsKKworICAgIGF2cGt0LT5wdHMgPSBmZl9zYW1wbGVzX3RvX3RpbWVfYmFzZShhdmN0eCwgb3AuZ3JhbnVsZXBvcyk7CisKKyAgICBkdXJhdGlvbiA9IGF2X3ZvcmJpc19wYXJzZV9mcmFtZShzLT52cCwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICBpZiAoZHVyYXRpb24gPiAwKSB7CisgICAgICAgIC8qIHdlIGRvIG5vdCBrbm93IGVuY29kZXIgZGVsYXkgdW50aWwgd2UgZ2V0IHRoZSBmaXJzdCBwYWNrZXQgZnJvbQorICAgICAgICAgKiBsaWJ2b3JiaXMsIHNvIHdlIGhhdmUgdG8gdXBkYXRlIHRoZSBBdWRpb0ZyYW1lUXVldWUgY291bnRzICovCisgICAgICAgIGlmICghYXZjdHgtPmluaXRpYWxfcGFkZGluZyAmJiBzLT5hZnEuZnJhbWVzKSB7CisgICAgICAgICAgICBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nICAgID0gZHVyYXRpb247CisgICAgICAgICAgICBhdl9hc3NlcnQwKCFzLT5hZnEucmVtYWluaW5nX2RlbGF5KTsKKyAgICAgICAgICAgIHMtPmFmcS5mcmFtZXMtPmR1cmF0aW9uICArPSBkdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChzLT5hZnEuZnJhbWVzLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgcy0+YWZxLmZyYW1lcy0+cHRzICAgICAgIC09IGR1cmF0aW9uOworICAgICAgICAgICAgcy0+YWZxLnJlbWFpbmluZ19zYW1wbGVzICs9IGR1cmF0aW9uOworICAgICAgICB9CisgICAgICAgIGZmX2FmX3F1ZXVlX3JlbW92ZSgmcy0+YWZxLCBkdXJhdGlvbiwgJmF2cGt0LT5wdHMsICZhdnBrdC0+ZHVyYXRpb24pOworICAgIH0KKworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbGlidm9yYmlzX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYnZvcmJpcyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYnZvcmJpcyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WT1JCSVMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKExpYnZvcmJpc0VuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGxpYnZvcmJpc19lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBsaWJ2b3JiaXNfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGxpYnZvcmJpc19lbmNvZGVfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RFTEFZIHwgQ09ERUNfQ0FQX1NNQUxMX0xBU1RfRlJBTUUsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmdm9yYmlzX2NsYXNzLAorICAgIC5kZWZhdWx0cyAgICAgICA9IGRlZmF1bHRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnZweC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlidnB4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyOTg5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnZweC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgR3VpbGxhdW1lIE1hcnRyZXMgPHNtYXJ0ZXJAdWJ1bnR1LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHZweC92cHhfY29kZWMuaD4KKworI2luY2x1ZGUgImxpYnZweC5oIgorCithdl9jb2xkIHZvaWQgZmZfdnA5X2luaXRfc3RhdGljKEFWQ29kZWMgKmNvZGVjKQoreworICAgIGlmICggICAgdnB4X2NvZGVjX3ZlcnNpb25fbWFqb3IoKSA8IDEKKyAgICAgICAgfHwgKHZweF9jb2RlY192ZXJzaW9uX21ham9yKCkgPT0gMSAmJiB2cHhfY29kZWNfdmVyc2lvbl9taW5vcigpIDwgMykpCisgICAgICAgIGNvZGVjLT5jYXBhYmlsaXRpZXMgfD0gQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnZweC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlidnB4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhMjc1YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnZweC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgR3VpbGxhdW1lIE1hcnRyZXMgPHNtYXJ0ZXJAdWJ1bnR1LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0xJQlZQWF9ICisjZGVmaW5lIEFWQ09ERUNfTElCVlBYX0gKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKwordm9pZCBmZl92cDlfaW5pdF9zdGF0aWMoQVZDb2RlYyAqY29kZWMpOworCisjZW5kaWYgLyogQVZDT0RFQ19MSUJWUFhfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGlidnB4ZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ2cHhkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmFlZjNhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlidnB4ZGVjLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWUDggZGVjb2RlciBzdXBwb3J0IHZpYSBsaWJ2cHgKKyAqLworCisjZGVmaW5lIFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVCAxCisjaW5jbHVkZSA8dnB4L3ZweF9kZWNvZGVyLmg+CisjaW5jbHVkZSA8dnB4L3ZwOGR4Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGlidnB4LmgiCisKK3R5cGVkZWYgc3RydWN0IFZQOERlY29kZXJDb250ZXh0IHsKKyAgICBzdHJ1Y3QgdnB4X2NvZGVjX2N0eCBkZWNvZGVyOworfSBWUDhDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgdnB4X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2cHhfY29kZWNfaWZhY2UgKmlmYWNlKQoreworICAgIFZQOENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IHZweF9jb2RlY19kZWNfY2ZnIGRlY2NmZyA9IHsKKyAgICAgICAgLyogdG9rZW4gcGFydGl0aW9ucysxIHdvdWxkIGJlIGEgZGVjZW50IGNob2ljZSAqLworICAgICAgICAudGhyZWFkcyA9IEZGTUlOKGF2Y3R4LT50aHJlYWRfY291bnQsIDE2KQorICAgIH07CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiJXNcbiIsIHZweF9jb2RlY192ZXJzaW9uX3N0cigpKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiJXNcbiIsIHZweF9jb2RlY19idWlsZF9jb25maWcoKSk7CisKKyAgICBpZiAodnB4X2NvZGVjX2RlY19pbml0KCZjdHgtPmRlY29kZXIsIGlmYWNlLCAmZGVjY2ZnLCAwKSAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgY29uc3QgY2hhciAqZXJyb3IgPSB2cHhfY29kZWNfZXJyb3IoJmN0eC0+ZGVjb2Rlcik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZGVjb2RlcjogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIHJldHVybnMgMCBvbiBzdWNjZXNzLCBBVkVSUk9SX0lOVkFMSUREQVRBIG90aGVyd2lzZQorc3RhdGljIGludCBzZXRfcGl4X2ZtdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHN0cnVjdCB2cHhfaW1hZ2UgKmltZykgeworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4ICYmIGltZy0+Zm10ICE9IFZQWF9JTUdfRk1UX0k0MjApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHN3aXRjaCAoaW1nLT5mbXQpIHsKKyAgICAgICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDIwOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyNpZiBDT05GSUdfTElCVlBYX1ZQOV9ERUNPREVSCisgICAgICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMjoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgVlBYX0lNR19GTVRfSTQ0NDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOworICAgICAgICAgICAgcmV0dXJuIDA7CisjaWZkZWYgVlBYX0lNR19GTVRfSElHSEJJVERFUFRICisgICAgICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMDE2OgorICAgICAgICAgICAgaWYgKGltZy0+Yml0X2RlcHRoID09IDEwKSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxMExFOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbWctPmJpdF9kZXB0aCA9PSAxMikgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQMTJMRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMjE2OgorICAgICAgICAgICAgaWYgKGltZy0+Yml0X2RlcHRoID09IDEwKSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMExFOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbWctPmJpdF9kZXB0aCA9PSAxMikgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTJMRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgVlBYX0lNR19GTVRfSTQ0NDE2OgorICAgICAgICAgICAgaWYgKGltZy0+Yml0X2RlcHRoID09IDEwKSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMExFOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbWctPmJpdF9kZXB0aCA9PSAxMikgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTJMRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorfQorCitzdGF0aWMgaW50IHZwOF9kZWNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgVlA4Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpwaWN0dXJlID0gZGF0YTsKKyAgICBjb25zdCB2b2lkICppdGVyID0gTlVMTDsKKyAgICBzdHJ1Y3QgdnB4X2ltYWdlICppbWc7CisgICAgaW50IHJldDsKKworICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKCZjdHgtPmRlY29kZXIsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSwgTlVMTCwgMCkgIT0KKyAgICAgICAgVlBYX0NPREVDX09LKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yICA9IHZweF9jb2RlY19lcnJvcigmY3R4LT5kZWNvZGVyKTsKKyAgICAgICAgY29uc3QgY2hhciAqZGV0YWlsID0gdnB4X2NvZGVjX2Vycm9yX2RldGFpbCgmY3R4LT5kZWNvZGVyKTsKKworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBkZWNvZGUgZnJhbWU6ICVzXG4iLCBlcnJvcik7CisgICAgICAgIGlmIChkZXRhaWwpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIiAgQWRkaXRpb25hbCBpbmZvcm1hdGlvbjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgZGV0YWlsKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChpbWcgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKCZjdHgtPmRlY29kZXIsICZpdGVyKSkpIHsKKyAgICAgICAgaWYgKChyZXQgPSBzZXRfcGl4X2ZtdChhdmN0eCwgaW1nKSkgPCAwKSB7CisjaWZkZWYgVlBYX0lNR19GTVRfSElHSEJJVERFUFRICisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIG91dHB1dCBjb2xvcnNwYWNlICglZCkgLyBiaXRfZGVwdGggKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBpbWctPmZtdCwgaW1nLT5iaXRfZGVwdGgpOworI2Vsc2UKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgb3V0cHV0IGNvbG9yc3BhY2UgKCVkKSAvIGJpdF9kZXB0aCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgIGltZy0+Zm10LCA4KTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoaW50KSBpbWctPmRfdyAhPSBhdmN0eC0+d2lkdGggfHwgKGludCkgaW1nLT5kX2ggIT0gYXZjdHgtPmhlaWdodCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgImRpbWVuc2lvbiBjaGFuZ2UhICVkeCVkIC0+ICVkeCVkXG4iLAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgaW1nLT5kX3csIGltZy0+ZF9oKTsKKyAgICAgICAgICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBpbWctPmRfdywgaW1nLT5kX2gpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpY3R1cmUsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBhdl9pbWFnZV9jb3B5KHBpY3R1cmUtPmRhdGEsIHBpY3R1cmUtPmxpbmVzaXplLCAoY29uc3QgdWludDhfdCAqKilpbWctPnBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICBpbWctPnN0cmlkZSwgYXZjdHgtPnBpeF9mbXQsIGltZy0+ZF93LCBpbWctPmRfaCk7CisgICAgICAgICpnb3RfZnJhbWUgICAgICAgICAgID0gMTsKKyAgICB9CisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdnA4X2ZyZWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZQOENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdnB4X2NvZGVjX2Rlc3Ryb3koJmN0eC0+ZGVjb2Rlcik7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfTElCVlBYX1ZQOF9ERUNPREVSCitzdGF0aWMgYXZfY29sZCBpbnQgdnA4X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHJldHVybiB2cHhfaW5pdChhdmN0eCwgJnZweF9jb2RlY192cDhfZHhfYWxnbyk7Cit9CisKK0FWQ29kZWMgZmZfbGlidnB4X3ZwOF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJ2cHgiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJ2cHggVlA4IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZQOCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVlA4Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdnA4X2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gdnA4X2ZyZWUsCisgICAgLmRlY29kZSAgICAgICAgID0gdnA4X2RlY29kZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfQVVUT19USFJFQURTIHwgQ09ERUNfQ0FQX0RSMSwKK307CisjZW5kaWYgLyogQ09ORklHX0xJQlZQWF9WUDhfREVDT0RFUiAqLworCisjaWYgQ09ORklHX0xJQlZQWF9WUDlfREVDT0RFUgorc3RhdGljIGF2X2NvbGQgaW50IHZwOV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICByZXR1cm4gdnB4X2luaXQoYXZjdHgsICZ2cHhfY29kZWNfdnA5X2R4X2FsZ28pOworfQorCitBVkNvZGVjIGZmX2xpYnZweF92cDlfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlidnB4LXZwOSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYnZweCBWUDkiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVlA5LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWUDhDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2cDlfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB2cDhfZnJlZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSB2cDhfZGVjb2RlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9BVVRPX1RIUkVBRFMgfCBDT0RFQ19DQVBfRFIxLAorICAgIC5pbml0X3N0YXRpY19kYXRhID0gZmZfdnA5X2luaXRfc3RhdGljLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfTElCVlBYX1ZQOV9ERUNPREVSICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJ2cHhlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnZweGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OWFjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ2cHhlbmMuYwpAQCAtMCwwICsxLDkxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZQOCBlbmNvZGVyIHN1cHBvcnQgdmlhIGxpYnZweAorICovCisKKyNkZWZpbmUgVlBYX0RJU0FCTEVfQ1RSTF9UWVBFQ0hFQ0tTIDEKKyNkZWZpbmUgVlBYX0NPREVDX0RJU0FCTEVfQ09NUEFUICAgIDEKKyNpbmNsdWRlIDx2cHgvdnB4X2VuY29kZXIuaD4KKyNpbmNsdWRlIDx2cHgvdnA4Y3guaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYnZweC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9iYXNlNjQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworLyoqCisgKiBQb3J0aW9uIG9mIHN0cnVjdCB2cHhfY29kZWNfY3hfcGt0IGZyb20gdnB4X2VuY29kZXIuaC4KKyAqIE9uZSBlbmNvZGVkIGZyYW1lIHJldHVybmVkIGZyb20gdGhlIGxpYnJhcnkuCisgKi8KK3N0cnVjdCBGcmFtZUxpc3REYXRhIHsKKyAgICB2b2lkICpidWY7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IGNvbXByZXNzZWQgZGF0YSBidWZmZXIgKi8KKyAgICBzaXplX3Qgc3o7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IGxlbmd0aCBvZiBjb21wcmVzc2VkIGRhdGEgKi8KKyAgICB2b2lkICpidWZfYWxwaGE7CisgICAgc2l6ZV90IHN6X2FscGhhOworICAgIGludDY0X3QgcHRzOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgdGltZSBzdGFtcCB0byBzaG93IGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gdGltZWJhc2UgdW5pdHMpICovCisgICAgdW5zaWduZWQgbG9uZyBkdXJhdGlvbjsgICAgICAgICAgLyoqPCBkdXJhdGlvbiB0byBzaG93IGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gdGltZWJhc2UgdW5pdHMpICovCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBmbGFncyBmb3IgdGhpcyBmcmFtZSAqLworICAgIHVpbnQ2NF90IHNzZVs0XTsKKyAgICBpbnQgaGF2ZV9zc2U7ICAgICAgICAgICAgICAgICAgICAvKio8IHRydWUgaWYgd2UgaGF2ZSBwZW5kaW5nIHNzZVtdICovCisgICAgdWludDY0X3QgZnJhbWVfbnVtYmVyOworICAgIHN0cnVjdCBGcmFtZUxpc3REYXRhICpuZXh0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgVlA4RW5jb2RlckNvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIHN0cnVjdCB2cHhfY29kZWNfY3R4IGVuY29kZXI7CisgICAgc3RydWN0IHZweF9pbWFnZSByYXdpbWc7CisgICAgc3RydWN0IHZweF9jb2RlY19jdHggZW5jb2Rlcl9hbHBoYTsKKyAgICBzdHJ1Y3QgdnB4X2ltYWdlIHJhd2ltZ19hbHBoYTsKKyAgICB1aW50OF90IGlzX2FscGhhOworICAgIHN0cnVjdCB2cHhfZml4ZWRfYnVmIHR3b3Bhc3Nfc3RhdHM7CisgICAgaW50IGRlYWRsaW5lOyAvL2kuZS4sIFJUL0dPT0QvQkVTVAorICAgIHVpbnQ2NF90IHNzZVs0XTsKKyAgICBpbnQgaGF2ZV9zc2U7IC8qKjwgdHJ1ZSBpZiB3ZSBoYXZlIHBlbmRpbmcgc3NlW10gKi8KKyAgICB1aW50NjRfdCBmcmFtZV9udW1iZXI7CisgICAgc3RydWN0IEZyYW1lTGlzdERhdGEgKmNvZGVkX2ZyYW1lX2xpc3Q7CisKKyAgICBpbnQgY3B1X3VzZWQ7CisgICAgLyoqCisgICAgICogVlA4IHNwZWNpZmljIGZsYWdzLCBzZWUgVlA4Rl8qIGJlbG93LgorICAgICAqLworICAgIGludCBmbGFnczsKKyNkZWZpbmUgVlA4Rl9FUlJPUl9SRVNJTElFTlQgMHgwMDAwMDAwMSAvLy88IEVuYWJsZSBtZWFzdXJlcyBhcHByb3ByaWF0ZSBmb3Igc3RyZWFtaW5nIG92ZXIgbG9zc3kgbGlua3MKKyNkZWZpbmUgVlA4Rl9BVVRPX0FMVF9SRUYgICAgMHgwMDAwMDAwMiAvLy88IEVuYWJsZSBhdXRvbWF0aWMgYWx0ZXJuYXRlIHJlZmVyZW5jZSBmcmFtZSBnZW5lcmF0aW9uCisKKyAgICBpbnQgYXV0b19hbHRfcmVmOworCisgICAgaW50IGFybnJfbWF4X2ZyYW1lczsKKyAgICBpbnQgYXJucl9zdHJlbmd0aDsKKyAgICBpbnQgYXJucl90eXBlOworCisgICAgaW50IGxhZ19pbl9mcmFtZXM7CisgICAgaW50IGVycm9yX3Jlc2lsaWVudDsKKyAgICBpbnQgY3JmOworICAgIGludCBzdGF0aWNfdGhyZXNoOworICAgIGludCBtYXhfaW50cmFfcmF0ZTsKKworICAgIC8vIFZQOS1vbmx5CisgICAgaW50IGxvc3NsZXNzOworICAgIGludCB0aWxlX2NvbHVtbnM7CisgICAgaW50IHRpbGVfcm93czsKKyAgICBpbnQgZnJhbWVfcGFyYWxsZWw7CisgICAgaW50IGFxX21vZGU7Cit9IFZQOENvbnRleHQ7CisKKy8qKiBTdHJpbmcgbWFwcGluZ3MgZm9yIGVudW0gdnA4ZV9lbmNfY29udHJvbF9pZCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGN0bGlkc3RyW10gPSB7CisgICAgW1ZQOEVfVVBEX0VOVFJPUFldICAgICAgICAgICA9ICJWUDhFX1VQRF9FTlRST1BZIiwKKyAgICBbVlA4RV9VUERfUkVGRVJFTkNFXSAgICAgICAgID0gIlZQOEVfVVBEX1JFRkVSRU5DRSIsCisgICAgW1ZQOEVfVVNFX1JFRkVSRU5DRV0gICAgICAgICA9ICJWUDhFX1VTRV9SRUZFUkVOQ0UiLAorICAgIFtWUDhFX1NFVF9ST0lfTUFQXSAgICAgICAgICAgPSAiVlA4RV9TRVRfUk9JX01BUCIsCisgICAgW1ZQOEVfU0VUX0FDVElWRU1BUF0gICAgICAgICA9ICJWUDhFX1NFVF9BQ1RJVkVNQVAiLAorICAgIFtWUDhFX1NFVF9TQ0FMRU1PREVdICAgICAgICAgPSAiVlA4RV9TRVRfU0NBTEVNT0RFIiwKKyAgICBbVlA4RV9TRVRfQ1BVVVNFRF0gICAgICAgICAgID0gIlZQOEVfU0VUX0NQVVVTRUQiLAorICAgIFtWUDhFX1NFVF9FTkFCTEVBVVRPQUxUUkVGXSAgPSAiVlA4RV9TRVRfRU5BQkxFQVVUT0FMVFJFRiIsCisgICAgW1ZQOEVfU0VUX05PSVNFX1NFTlNJVElWSVRZXSA9ICJWUDhFX1NFVF9OT0lTRV9TRU5TSVRJVklUWSIsCisgICAgW1ZQOEVfU0VUX1NIQVJQTkVTU10gICAgICAgICA9ICJWUDhFX1NFVF9TSEFSUE5FU1MiLAorICAgIFtWUDhFX1NFVF9TVEFUSUNfVEhSRVNIT0xEXSAgPSAiVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCIsCisgICAgW1ZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlNdICA9ICJWUDhFX1NFVF9UT0tFTl9QQVJUSVRJT05TIiwKKyAgICBbVlA4RV9HRVRfTEFTVF9RVUFOVElaRVJdICAgID0gIlZQOEVfR0VUX0xBU1RfUVVBTlRJWkVSIiwKKyAgICBbVlA4RV9TRVRfQVJOUl9NQVhGUkFNRVNdICAgID0gIlZQOEVfU0VUX0FSTlJfTUFYRlJBTUVTIiwKKyAgICBbVlA4RV9TRVRfQVJOUl9TVFJFTkdUSF0gICAgID0gIlZQOEVfU0VUX0FSTlJfU1RSRU5HVEgiLAorICAgIFtWUDhFX1NFVF9BUk5SX1RZUEVdICAgICAgICAgPSAiVlA4RV9TRVRfQVJOUl9UWVBFIiwKKyAgICBbVlA4RV9TRVRfQ1FfTEVWRUxdICAgICAgICAgID0gIlZQOEVfU0VUX0NRX0xFVkVMIiwKKyAgICBbVlA4RV9TRVRfTUFYX0lOVFJBX0JJVFJBVEVfUENUXSA9ICJWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QiLAorI2lmIENPTkZJR19MSUJWUFhfVlA5X0VOQ09ERVIKKyAgICBbVlA5RV9TRVRfTE9TU0xFU1NdICAgICAgICAgICAgICAgID0gIlZQOUVfU0VUX0xPU1NMRVNTIiwKKyAgICBbVlA5RV9TRVRfVElMRV9DT0xVTU5TXSAgICAgICAgICAgID0gIlZQOUVfU0VUX1RJTEVfQ09MVU1OUyIsCisgICAgW1ZQOUVfU0VUX1RJTEVfUk9XU10gICAgICAgICAgICAgICA9ICJWUDlFX1NFVF9USUxFX1JPV1MiLAorICAgIFtWUDlFX1NFVF9GUkFNRV9QQVJBTExFTF9ERUNPRElOR10gPSAiVlA5RV9TRVRfRlJBTUVfUEFSQUxMRUxfREVDT0RJTkciLAorICAgIFtWUDlFX1NFVF9BUV9NT0RFXSAgICAgICAgICAgICAgICAgPSAiVlA5RV9TRVRfQVFfTU9ERSIsCisjZW5kaWYKK307CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgbG9nX2VuY29kZXJfZXJyb3IoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICpkZXNjKQoreworICAgIFZQOENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgY2hhciAqZXJyb3IgID0gdnB4X2NvZGVjX2Vycm9yKCZjdHgtPmVuY29kZXIpOworICAgIGNvbnN0IGNoYXIgKmRldGFpbCA9IHZweF9jb2RlY19lcnJvcl9kZXRhaWwoJmN0eC0+ZW5jb2Rlcik7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIiVzOiAlc1xuIiwgZGVzYywgZXJyb3IpOworICAgIGlmIChkZXRhaWwpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uOiAlc1xuIiwgZGV0YWlsKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBkdW1wX2VuY19jZmcoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHZweF9jb2RlY19lbmNfY2ZnICpjZmcpCit7CisgICAgaW50IHdpZHRoID0gLTMwOworICAgIGludCBsZXZlbCA9IEFWX0xPR19ERUJVRzsKKworICAgIGF2X2xvZyhhdmN0eCwgbGV2ZWwsICJ2cHhfY29kZWNfZW5jX2NmZ1xuIik7CisgICAgYXZfbG9nKGF2Y3R4LCBsZXZlbCwgImdlbmVyaWMgc2V0dGluZ3NcbiIKKyAgICAgICAgICAgIiAgJSpzJXVcbiAgJSpzJXVcbiAgJSpzJXVcbiAgJSpzJXVcbiAgJSpzJXVcbiIKKyAgICAgICAgICAgIiAgJSpzeyV1LyV1fVxuICAlKnMldVxuICAlKnMlZFxuICAlKnMldVxuIiwKKyAgICAgICAgICAgd2lkdGgsICJnX3VzYWdlOiIsICAgICAgICAgICBjZmctPmdfdXNhZ2UsCisgICAgICAgICAgIHdpZHRoLCAiZ190aHJlYWRzOiIsICAgICAgICAgY2ZnLT5nX3RocmVhZHMsCisgICAgICAgICAgIHdpZHRoLCAiZ19wcm9maWxlOiIsICAgICAgICAgY2ZnLT5nX3Byb2ZpbGUsCisgICAgICAgICAgIHdpZHRoLCAiZ193OiIsICAgICAgICAgICAgICAgY2ZnLT5nX3csCisgICAgICAgICAgIHdpZHRoLCAiZ19oOiIsICAgICAgICAgICAgICAgY2ZnLT5nX2gsCisgICAgICAgICAgIHdpZHRoLCAiZ190aW1lYmFzZToiLCAgICAgICAgY2ZnLT5nX3RpbWViYXNlLm51bSwgY2ZnLT5nX3RpbWViYXNlLmRlbiwKKyAgICAgICAgICAgd2lkdGgsICJnX2Vycm9yX3Jlc2lsaWVudDoiLCBjZmctPmdfZXJyb3JfcmVzaWxpZW50LAorICAgICAgICAgICB3aWR0aCwgImdfcGFzczoiLCAgICAgICAgICAgIGNmZy0+Z19wYXNzLAorICAgICAgICAgICB3aWR0aCwgImdfbGFnX2luX2ZyYW1lczoiLCAgIGNmZy0+Z19sYWdfaW5fZnJhbWVzKTsKKyAgICBhdl9sb2coYXZjdHgsIGxldmVsLCAicmF0ZSBjb250cm9sIHNldHRpbmdzXG4iCisgICAgICAgICAgICIgICUqcyV1XG4gICUqcyV1XG4gICUqcyV1XG4gICUqcyV1XG4iCisgICAgICAgICAgICIgICUqcyVkXG4gICUqcyVwKCUiU0laRV9TUEVDSUZJRVIiKVxuICAlKnMldVxuIiwKKyAgICAgICAgICAgd2lkdGgsICJyY19kcm9wZnJhbWVfdGhyZXNoOiIsICAgY2ZnLT5yY19kcm9wZnJhbWVfdGhyZXNoLAorICAgICAgICAgICB3aWR0aCwgInJjX3Jlc2l6ZV9hbGxvd2VkOiIsICAgICBjZmctPnJjX3Jlc2l6ZV9hbGxvd2VkLAorICAgICAgICAgICB3aWR0aCwgInJjX3Jlc2l6ZV91cF90aHJlc2g6IiwgICBjZmctPnJjX3Jlc2l6ZV91cF90aHJlc2gsCisgICAgICAgICAgIHdpZHRoLCAicmNfcmVzaXplX2Rvd25fdGhyZXNoOiIsIGNmZy0+cmNfcmVzaXplX2Rvd25fdGhyZXNoLAorICAgICAgICAgICB3aWR0aCwgInJjX2VuZF91c2FnZToiLCAgICAgICAgICBjZmctPnJjX2VuZF91c2FnZSwKKyAgICAgICAgICAgd2lkdGgsICJyY190d29wYXNzX3N0YXRzX2luOiIsICAgY2ZnLT5yY190d29wYXNzX3N0YXRzX2luLmJ1ZiwgY2ZnLT5yY190d29wYXNzX3N0YXRzX2luLnN6LAorICAgICAgICAgICB3aWR0aCwgInJjX3RhcmdldF9iaXRyYXRlOiIsICAgICBjZmctPnJjX3RhcmdldF9iaXRyYXRlKTsKKyAgICBhdl9sb2coYXZjdHgsIGxldmVsLCAicXVhbnRpemVyIHNldHRpbmdzXG4iCisgICAgICAgICAgICIgICUqcyV1XG4gICUqcyV1XG4iLAorICAgICAgICAgICB3aWR0aCwgInJjX21pbl9xdWFudGl6ZXI6IiwgY2ZnLT5yY19taW5fcXVhbnRpemVyLAorICAgICAgICAgICB3aWR0aCwgInJjX21heF9xdWFudGl6ZXI6IiwgY2ZnLT5yY19tYXhfcXVhbnRpemVyKTsKKyAgICBhdl9sb2coYXZjdHgsIGxldmVsLCAiYml0cmF0ZSB0b2xlcmFuY2VcbiIKKyAgICAgICAgICAgIiAgJSpzJXVcbiAgJSpzJXVcbiIsCisgICAgICAgICAgIHdpZHRoLCAicmNfdW5kZXJzaG9vdF9wY3Q6IiwgY2ZnLT5yY191bmRlcnNob290X3BjdCwKKyAgICAgICAgICAgd2lkdGgsICJyY19vdmVyc2hvb3RfcGN0OiIsICBjZmctPnJjX292ZXJzaG9vdF9wY3QpOworICAgIGF2X2xvZyhhdmN0eCwgbGV2ZWwsICJkZWNvZGVyIGJ1ZmZlciBtb2RlbFxuIgorICAgICAgICAgICAgIiAgJSpzJXVcbiAgJSpzJXVcbiAgJSpzJXVcbiIsCisgICAgICAgICAgICB3aWR0aCwgInJjX2J1Zl9zejoiLCAgICAgICAgIGNmZy0+cmNfYnVmX3N6LAorICAgICAgICAgICAgd2lkdGgsICJyY19idWZfaW5pdGlhbF9zejoiLCBjZmctPnJjX2J1Zl9pbml0aWFsX3N6LAorICAgICAgICAgICAgd2lkdGgsICJyY19idWZfb3B0aW1hbF9zejoiLCBjZmctPnJjX2J1Zl9vcHRpbWFsX3N6KTsKKyAgICBhdl9sb2coYXZjdHgsIGxldmVsLCAiMiBwYXNzIHJhdGUgY29udHJvbCBzZXR0aW5nc1xuIgorICAgICAgICAgICAiICAlKnMldVxuICAlKnMldVxuICAlKnMldVxuIiwKKyAgICAgICAgICAgd2lkdGgsICJyY18ycGFzc192YnJfYmlhc19wY3Q6IiwgICAgICAgY2ZnLT5yY18ycGFzc192YnJfYmlhc19wY3QsCisgICAgICAgICAgIHdpZHRoLCAicmNfMnBhc3NfdmJyX21pbnNlY3Rpb25fcGN0OiIsIGNmZy0+cmNfMnBhc3NfdmJyX21pbnNlY3Rpb25fcGN0LAorICAgICAgICAgICB3aWR0aCwgInJjXzJwYXNzX3Zicl9tYXhzZWN0aW9uX3BjdDoiLCBjZmctPnJjXzJwYXNzX3Zicl9tYXhzZWN0aW9uX3BjdCk7CisgICAgYXZfbG9nKGF2Y3R4LCBsZXZlbCwgImtleWZyYW1pbmcgc2V0dGluZ3NcbiIKKyAgICAgICAgICAgIiAgJSpzJWRcbiAgJSpzJXVcbiAgJSpzJXVcbiIsCisgICAgICAgICAgIHdpZHRoLCAia2ZfbW9kZToiLCAgICAgY2ZnLT5rZl9tb2RlLAorICAgICAgICAgICB3aWR0aCwgImtmX21pbl9kaXN0OiIsIGNmZy0+a2ZfbWluX2Rpc3QsCisgICAgICAgICAgIHdpZHRoLCAia2ZfbWF4X2Rpc3Q6IiwgY2ZnLT5rZl9tYXhfZGlzdCk7CisgICAgYXZfbG9nKGF2Y3R4LCBsZXZlbCwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGNvZGVkX2ZyYW1lX2FkZCh2b2lkICpsaXN0LCBzdHJ1Y3QgRnJhbWVMaXN0RGF0YSAqY3hfZnJhbWUpCit7CisgICAgc3RydWN0IEZyYW1lTGlzdERhdGEgKipwID0gbGlzdDsKKworICAgIHdoaWxlICgqcCkKKyAgICAgICAgcCA9ICYoKnApLT5uZXh0OworICAgICpwID0gY3hfZnJhbWU7CisgICAgY3hfZnJhbWUtPm5leHQgPSBOVUxMOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGZyZWVfY29kZWRfZnJhbWUoc3RydWN0IEZyYW1lTGlzdERhdGEgKmN4X2ZyYW1lKQoreworICAgIGF2X2ZyZWVwKCZjeF9mcmFtZS0+YnVmKTsKKyAgICBpZiAoY3hfZnJhbWUtPmJ1Zl9hbHBoYSkKKyAgICAgICAgYXZfZnJlZXAoJmN4X2ZyYW1lLT5idWZfYWxwaGEpOworICAgIGF2X2ZyZWVwKCZjeF9mcmFtZSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZnJlZV9mcmFtZV9saXN0KHN0cnVjdCBGcmFtZUxpc3REYXRhICpsaXN0KQoreworICAgIHN0cnVjdCBGcmFtZUxpc3REYXRhICpwID0gbGlzdDsKKworICAgIHdoaWxlIChwKSB7CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgICBmcmVlX2NvZGVkX2ZyYW1lKHApOworICAgICAgICBwID0gbGlzdDsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjb2RlY2N0bF9pbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHZwOGVfZW5jX2NvbnRyb2xfaWQgaWQsIGludCB2YWwpCit7CisgICAgVlA4Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjaGFyIGJ1Zls4MF07CisgICAgaW50IHdpZHRoID0gLTMwOworICAgIGludCByZXM7CisKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6IiwgY3RsaWRzdHJbaWRdKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAgJSpzJWRcbiIsIHdpZHRoLCBidWYsIHZhbCk7CisKKyAgICByZXMgPSB2cHhfY29kZWNfY29udHJvbCgmY3R4LT5lbmNvZGVyLCBpZCwgdmFsKTsKKyAgICBpZiAocmVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiRmFpbGVkIHRvIHNldCAlcyBjb2RlYyBjb250cm9sIiwKKyAgICAgICAgICAgICAgICAgY3RsaWRzdHJbaWRdKTsKKyAgICAgICAgbG9nX2VuY29kZXJfZXJyb3IoYXZjdHgsIGJ1Zik7CisgICAgfQorCisgICAgcmV0dXJuIHJlcyA9PSBWUFhfQ09ERUNfT0sgPyAwIDogQVZFUlJPUihFSU5WQUwpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdnA4X2ZyZWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZQOENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICB2cHhfY29kZWNfZGVzdHJveSgmY3R4LT5lbmNvZGVyKTsKKyAgICBpZiAoY3R4LT5pc19hbHBoYSkKKyAgICAgICAgdnB4X2NvZGVjX2Rlc3Ryb3koJmN0eC0+ZW5jb2Rlcl9hbHBoYSk7CisgICAgYXZfZnJlZXAoJmN0eC0+dHdvcGFzc19zdGF0cy5idWYpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+c3RhdHNfb3V0KTsKKyAgICBmcmVlX2ZyYW1lX2xpc3QoY3R4LT5jb2RlZF9mcmFtZV9saXN0KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHZweF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdnB4X2NvZGVjX2lmYWNlICppZmFjZSkKK3sKKyAgICBWUDhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCB2cHhfY29kZWNfZW5jX2NmZyBlbmNjZmc7CisgICAgc3RydWN0IHZweF9jb2RlY19lbmNfY2ZnIGVuY2NmZ19hbHBoYTsKKyAgICB2cHhfY29kZWNfZmxhZ3NfdCBmbGFncyA9IChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1BTTlIpID8gVlBYX0NPREVDX1VTRV9QU05SIDogMDsKKyAgICBpbnQgcmVzOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIiVzXG4iLCB2cHhfY29kZWNfdmVyc2lvbl9zdHIoKSk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIiVzXG4iLCB2cHhfY29kZWNfYnVpbGRfY29uZmlnKCkpOworCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWQTQyMFApCisgICAgICAgIGN0eC0+aXNfYWxwaGEgPSAxOworCisgICAgaWYgKChyZXMgPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KGlmYWNlLCAmZW5jY2ZnLCAwKSkgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBjb25maWc6ICVzXG4iLAorICAgICAgICAgICAgICAgdnB4X2NvZGVjX2Vycl90b19zdHJpbmcocmVzKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYoIWF2Y3R4LT5iaXRfcmF0ZSkKKyAgICAgICAgaWYoYXZjdHgtPnJjX21heF9yYXRlIHx8IGF2Y3R4LT5yY19idWZmZXJfc2l6ZSB8fCBhdmN0eC0+cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5KSB7CisgICAgICAgICAgICBhdl9sb2coIGF2Y3R4LCBBVl9MT0dfRVJST1IsICJSYXRlIGNvbnRyb2wgcGFyYW1ldGVycyBzZXQgd2l0aG91dCBhIGJpdHJhdGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgZHVtcF9lbmNfY2ZnKGF2Y3R4LCAmZW5jY2ZnKTsKKworICAgIGVuY2NmZy5nX3cgICAgICAgICAgICA9IGF2Y3R4LT53aWR0aDsKKyAgICBlbmNjZmcuZ19oICAgICAgICAgICAgPSBhdmN0eC0+aGVpZ2h0OworICAgIGVuY2NmZy5nX3RpbWViYXNlLm51bSA9IGF2Y3R4LT50aW1lX2Jhc2UubnVtOworICAgIGVuY2NmZy5nX3RpbWViYXNlLmRlbiA9IGF2Y3R4LT50aW1lX2Jhc2UuZGVuOworICAgIGVuY2NmZy5nX3RocmVhZHMgICAgICA9IGF2Y3R4LT50aHJlYWRfY291bnQ7CisgICAgZW5jY2ZnLmdfbGFnX2luX2ZyYW1lcz0gY3R4LT5sYWdfaW5fZnJhbWVzOworCisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzEpCisgICAgICAgIGVuY2NmZy5nX3Bhc3MgPSBWUFhfUkNfRklSU1RfUEFTUzsKKyAgICBlbHNlIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1BBU1MyKQorICAgICAgICBlbmNjZmcuZ19wYXNzID0gVlBYX1JDX0xBU1RfUEFTUzsKKyAgICBlbHNlCisgICAgICAgIGVuY2NmZy5nX3Bhc3MgPSBWUFhfUkNfT05FX1BBU1M7CisKKyAgICBpZiAoYXZjdHgtPnJjX21pbl9yYXRlID09IGF2Y3R4LT5yY19tYXhfcmF0ZSAmJgorICAgICAgICBhdmN0eC0+cmNfbWluX3JhdGUgPT0gYXZjdHgtPmJpdF9yYXRlICYmIGF2Y3R4LT5iaXRfcmF0ZSkgeworICAgICAgICBlbmNjZmcucmNfZW5kX3VzYWdlID0gVlBYX0NCUjsKKyAgICB9IGVsc2UgaWYgKGN0eC0+Y3JmID49IDApIHsKKyAgICAgICAgZW5jY2ZnLnJjX2VuZF91c2FnZSA9IFZQWF9DUTsKKyNpZiBDT05GSUdfTElCVlBYX1ZQOV9FTkNPREVSCisgICAgICAgIGlmICghYXZjdHgtPmJpdF9yYXRlICYmIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkpCisgICAgICAgICAgICBlbmNjZmcucmNfZW5kX3VzYWdlID0gVlBYX1E7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmJpdF9yYXRlKSB7CisgICAgICAgIGVuY2NmZy5yY190YXJnZXRfYml0cmF0ZSA9IGF2X3Jlc2NhbGVfcm5kKGF2Y3R4LT5iaXRfcmF0ZSwgMSwgMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUk9VTkRfTkVBUl9JTkYpOworI2lmIENPTkZJR19MSUJWUFhfVlA5X0VOQ09ERVIKKyAgICB9IGVsc2UgaWYgKGVuY2NmZy5yY19lbmRfdXNhZ2UgPT0gVlBYX1EpIHsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlbmNjZmcucmNfZW5kX3VzYWdlID09IFZQWF9DUSkgeworICAgICAgICAgICAgZW5jY2ZnLnJjX3RhcmdldF9iaXRyYXRlID0gMTAwMDAwMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IGVuY2NmZy5yY190YXJnZXRfYml0cmF0ZSAqIDEwMDA7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJOZWl0aGVyIGJpdHJhdGUgbm9yIGNvbnN0cmFpbmVkIHF1YWxpdHkgc3BlY2lmaWVkLCB1c2luZyBkZWZhdWx0IGJpdHJhdGUgb2YgJWRrYml0L3NlY1xuIiwKKyAgICAgICAgICAgICAgICAgICBlbmNjZmcucmNfdGFyZ2V0X2JpdHJhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5xbWluID49IDApCisgICAgICAgIGVuY2NmZy5yY19taW5fcXVhbnRpemVyID0gYXZjdHgtPnFtaW47CisgICAgaWYgKGF2Y3R4LT5xbWF4ID49IDApCisgICAgICAgIGVuY2NmZy5yY19tYXhfcXVhbnRpemVyID0gYXZjdHgtPnFtYXg7CisKKyAgICBpZiAoZW5jY2ZnLnJjX2VuZF91c2FnZSA9PSBWUFhfQ1EKKyNpZiBDT05GSUdfTElCVlBYX1ZQOV9FTkNPREVSCisgICAgICAgIHx8IGVuY2NmZy5yY19lbmRfdXNhZ2UgPT0gVlBYX1EKKyNlbmRpZgorICAgICAgICApIHsKKyAgICAgICAgaWYgKGN0eC0+Y3JmIDwgZW5jY2ZnLnJjX21pbl9xdWFudGl6ZXIgfHwgY3R4LT5jcmYgPiBlbmNjZmcucmNfbWF4X3F1YW50aXplcikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ1EgbGV2ZWwgJWQgbXVzdCBiZSBiZXR3ZWVuIG1pbmltdW0gYW5kIG1heGltdW0gcXVhbnRpemVyIHZhbHVlICglZC0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3JmLCBlbmNjZmcucmNfbWluX3F1YW50aXplciwgZW5jY2ZnLnJjX21heF9xdWFudGl6ZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbmNjZmcucmNfZHJvcGZyYW1lX3RocmVzaCA9IGF2Y3R4LT5mcmFtZV9za2lwX3RocmVzaG9sZDsKKworICAgIC8vMC0xMDAgKDAgPT4gQ0JSLCAxMDAgPT4gVkJSKQorICAgIGVuY2NmZy5yY18ycGFzc192YnJfYmlhc19wY3QgICAgICAgICAgID0gcm91bmQoYXZjdHgtPnFjb21wcmVzcyAqIDEwMCk7CisgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSkKKyAgICAgICAgZW5jY2ZnLnJjXzJwYXNzX3Zicl9taW5zZWN0aW9uX3BjdCAgICAgPQorICAgICAgICAgICAgYXZjdHgtPnJjX21pbl9yYXRlICogMTAwTEwgLyBhdmN0eC0+Yml0X3JhdGU7CisgICAgaWYgKGF2Y3R4LT5yY19tYXhfcmF0ZSkKKyAgICAgICAgZW5jY2ZnLnJjXzJwYXNzX3Zicl9tYXhzZWN0aW9uX3BjdCA9CisgICAgICAgICAgICBhdmN0eC0+cmNfbWF4X3JhdGUgKiAxMDBMTCAvIGF2Y3R4LT5iaXRfcmF0ZTsKKworICAgIGlmIChhdmN0eC0+cmNfYnVmZmVyX3NpemUpCisgICAgICAgIGVuY2NmZy5yY19idWZfc3ogICAgICAgICA9CisgICAgICAgICAgICBhdmN0eC0+cmNfYnVmZmVyX3NpemUgKiAxMDAwTEwgLyBhdmN0eC0+Yml0X3JhdGU7CisgICAgaWYgKGF2Y3R4LT5yY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3kpCisgICAgICAgIGVuY2NmZy5yY19idWZfaW5pdGlhbF9zeiA9CisgICAgICAgICAgICBhdmN0eC0+cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5ICogMTAwMExMIC8gYXZjdHgtPmJpdF9yYXRlOworICAgIGVuY2NmZy5yY19idWZfb3B0aW1hbF9zeiAgICAgPSBlbmNjZmcucmNfYnVmX3N6ICogNSAvIDY7CisgICAgZW5jY2ZnLnJjX3VuZGVyc2hvb3RfcGN0ICAgICA9IHJvdW5kKGF2Y3R4LT5yY19idWZmZXJfYWdncmVzc2l2aXR5ICogMTAwKTsKKworICAgIC8vX2VuY19pbml0KCkgd2lsbCBiYWxrIGlmIGtmX21pbl9kaXN0IGRpZmZlcnMgZnJvbSBtYXggdy9WUFhfS0ZfQVVUTworICAgIGlmIChhdmN0eC0+a2V5aW50X21pbiA+PSAwICYmIGF2Y3R4LT5rZXlpbnRfbWluID09IGF2Y3R4LT5nb3Bfc2l6ZSkKKyAgICAgICAgZW5jY2ZnLmtmX21pbl9kaXN0ID0gYXZjdHgtPmtleWludF9taW47CisgICAgaWYgKGF2Y3R4LT5nb3Bfc2l6ZSA+PSAwKQorICAgICAgICBlbmNjZmcua2ZfbWF4X2Rpc3QgPSBhdmN0eC0+Z29wX3NpemU7CisKKyAgICBpZiAoZW5jY2ZnLmdfcGFzcyA9PSBWUFhfUkNfRklSU1RfUEFTUykKKyAgICAgICAgZW5jY2ZnLmdfbGFnX2luX2ZyYW1lcyA9IDA7CisgICAgZWxzZSBpZiAoZW5jY2ZnLmdfcGFzcyA9PSBWUFhfUkNfTEFTVF9QQVNTKSB7CisgICAgICAgIGludCBkZWNvZGVfc2l6ZTsKKworICAgICAgICBpZiAoIWF2Y3R4LT5zdGF0c19pbikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyBzdGF0cyBmaWxlIGZvciBzZWNvbmQgcGFzc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+dHdvcGFzc19zdGF0cy5zeiAgPSBzdHJsZW4oYXZjdHgtPnN0YXRzX2luKSAqIDMgLyA0OworICAgICAgICBjdHgtPnR3b3Bhc3Nfc3RhdHMuYnVmID0gYXZfbWFsbG9jKGN0eC0+dHdvcGFzc19zdGF0cy5zeik7CisgICAgICAgIGlmICghY3R4LT50d29wYXNzX3N0YXRzLmJ1ZikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlN0YXQgYnVmZmVyIGFsbG9jICglIlNJWkVfU1BFQ0lGSUVSIiBieXRlcykgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgICAgIGN0eC0+dHdvcGFzc19zdGF0cy5zeik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGRlY29kZV9zaXplID0gYXZfYmFzZTY0X2RlY29kZShjdHgtPnR3b3Bhc3Nfc3RhdHMuYnVmLCBhdmN0eC0+c3RhdHNfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnR3b3Bhc3Nfc3RhdHMuc3opOworICAgICAgICBpZiAoZGVjb2RlX3NpemUgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlN0YXQgYnVmZmVyIGRlY29kZSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPnR3b3Bhc3Nfc3RhdHMuc3ogICAgICA9IGRlY29kZV9zaXplOworICAgICAgICBlbmNjZmcucmNfdHdvcGFzc19zdGF0c19pbiA9IGN0eC0+dHdvcGFzc19zdGF0czsKKyAgICB9CisKKyAgICAvKiAwLTM6IEZvciBub24temVybyB2YWx1ZXMgdGhlIGVuY29kZXIgaW5jcmVhc2luZ2x5IG9wdGltaXplcyBmb3IgcmVkdWNlZAorICAgICAgIGNvbXBsZXhpdHkgcGxheWJhY2sgb24gbG93IHBvd2VyZWQgZGV2aWNlcyBhdCB0aGUgZXhwZW5zZSBvZiBlbmNvZGUKKyAgICAgICBxdWFsaXR5LiAqLworICAgaWYgKGF2Y3R4LT5wcm9maWxlICE9IEZGX1BST0ZJTEVfVU5LTk9XTikKKyAgICAgICBlbmNjZmcuZ19wcm9maWxlID0gYXZjdHgtPnByb2ZpbGU7CisKKyAgICBlbmNjZmcuZ19lcnJvcl9yZXNpbGllbnQgPSBjdHgtPmVycm9yX3Jlc2lsaWVudCB8fCBjdHgtPmZsYWdzICYgVlA4Rl9FUlJPUl9SRVNJTElFTlQ7CisKKyAgICBkdW1wX2VuY19jZmcoYXZjdHgsICZlbmNjZmcpOworICAgIC8qIENvbnN0cnVjdCBFbmNvZGVyIENvbnRleHQgKi8KKyAgICByZXMgPSB2cHhfY29kZWNfZW5jX2luaXQoJmN0eC0+ZW5jb2RlciwgaWZhY2UsICZlbmNjZmcsIGZsYWdzKTsKKyAgICBpZiAocmVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBsb2dfZW5jb2Rlcl9lcnJvcihhdmN0eCwgIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5pc19hbHBoYSkgeworICAgICAgICBlbmNjZmdfYWxwaGEgPSBlbmNjZmc7CisgICAgICAgIHJlcyA9IHZweF9jb2RlY19lbmNfaW5pdCgmY3R4LT5lbmNvZGVyX2FscGhhLCBpZmFjZSwgJmVuY2NmZ19hbHBoYSwgZmxhZ3MpOworICAgICAgICBpZiAocmVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgbG9nX2VuY29kZXJfZXJyb3IoYXZjdHgsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhbHBoYSBlbmNvZGVyIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9jb2RlYyBjb250cm9sIGZhaWx1cmVzIGFyZSBjdXJyZW50bHkgdHJlYXRlZCBvbmx5IGFzIHdhcm5pbmdzCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJ2cHhfY29kZWNfY29udHJvbFxuIik7CisgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBWUDhFX1NFVF9DUFVVU0VELCAgICAgICAgICBjdHgtPmNwdV91c2VkKTsKKyAgICBpZiAoY3R4LT5mbGFncyAmIFZQOEZfQVVUT19BTFRfUkVGKQorICAgICAgICBjdHgtPmF1dG9fYWx0X3JlZiA9IDE7CisgICAgaWYgKGN0eC0+YXV0b19hbHRfcmVmID49IDApCisgICAgICAgIGNvZGVjY3RsX2ludChhdmN0eCwgVlA4RV9TRVRfRU5BQkxFQVVUT0FMVFJFRiwgY3R4LT5hdXRvX2FsdF9yZWYpOworICAgIGlmIChjdHgtPmFybnJfbWF4X2ZyYW1lcyA+PSAwKQorICAgICAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIFZQOEVfU0VUX0FSTlJfTUFYRlJBTUVTLCAgIGN0eC0+YXJucl9tYXhfZnJhbWVzKTsKKyAgICBpZiAoY3R4LT5hcm5yX3N0cmVuZ3RoID49IDApCisgICAgICAgIGNvZGVjY3RsX2ludChhdmN0eCwgVlA4RV9TRVRfQVJOUl9TVFJFTkdUSCwgICAgY3R4LT5hcm5yX3N0cmVuZ3RoKTsKKyAgICBpZiAoY3R4LT5hcm5yX3R5cGUgPj0gMCkKKyAgICAgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBWUDhFX1NFVF9BUk5SX1RZUEUsICAgICAgICBjdHgtPmFybnJfdHlwZSk7CisgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBWUDhFX1NFVF9OT0lTRV9TRU5TSVRJVklUWSwgYXZjdHgtPm5vaXNlX3JlZHVjdGlvbik7CisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDgpCisgICAgICAgIGNvZGVjY3RsX2ludChhdmN0eCwgVlA4RV9TRVRfVE9LRU5fUEFSVElUSU9OUywgIGF2X2xvZzIoYXZjdHgtPnNsaWNlcykpOworI2lmIEZGX0FQSV9NUFZfT1BUCisgICAgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGlmIChhdmN0eC0+bWJfdGhyZXNob2xkKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaGUgbWJfdGhyZXNob2xkIG9wdGlvbiBpcyBkZXByZWNhdGVkLCAiCisgICAgICAgICAgICAgICAidXNlIHRoZSBzdGF0aWMtdGhyZXNoIHByaXZhdGUgb3B0aW9uIGluc3RlYWQuXG4iKTsKKyAgICAgICAgY3R4LT5zdGF0aWNfdGhyZXNoID0gYXZjdHgtPm1iX3RocmVzaG9sZDsKKyAgICB9CisgICAgRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIFZQOEVfU0VUX1NUQVRJQ19USFJFU0hPTEQsICBjdHgtPnN0YXRpY190aHJlc2gpOworICAgIGlmIChjdHgtPmNyZiA+PSAwKQorICAgICAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIFZQOEVfU0VUX0NRX0xFVkVMLCAgICAgICAgICBjdHgtPmNyZik7CisgICAgaWYgKGN0eC0+bWF4X2ludHJhX3JhdGUgPj0gMCkKKyAgICAgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsIGN0eC0+bWF4X2ludHJhX3JhdGUpOworCisjaWYgQ09ORklHX0xJQlZQWF9WUDlfRU5DT0RFUgorICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA5KSB7CisgICAgICAgIGlmIChjdHgtPmxvc3NsZXNzID49IDApCisgICAgICAgICAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIFZQOUVfU0VUX0xPU1NMRVNTLCBjdHgtPmxvc3NsZXNzKTsKKyAgICAgICAgaWYgKGN0eC0+dGlsZV9jb2x1bW5zID49IDApCisgICAgICAgICAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIFZQOUVfU0VUX1RJTEVfQ09MVU1OUywgY3R4LT50aWxlX2NvbHVtbnMpOworICAgICAgICBpZiAoY3R4LT50aWxlX3Jvd3MgPj0gMCkKKyAgICAgICAgICAgIGNvZGVjY3RsX2ludChhdmN0eCwgVlA5RV9TRVRfVElMRV9ST1dTLCBjdHgtPnRpbGVfcm93cyk7CisgICAgICAgIGlmIChjdHgtPmZyYW1lX3BhcmFsbGVsID49IDApCisgICAgICAgICAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIFZQOUVfU0VUX0ZSQU1FX1BBUkFMTEVMX0RFQ09ESU5HLCBjdHgtPmZyYW1lX3BhcmFsbGVsKTsKKyAgICAgICAgaWYgKGN0eC0+YXFfbW9kZSA+PSAwKQorICAgICAgICAgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBWUDlFX1NFVF9BUV9NT0RFLCBjdHgtPmFxX21vZGUpOworICAgIH0KKyNlbmRpZgorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJVc2luZyBkZWFkbGluZTogJWRcbiIsIGN0eC0+ZGVhZGxpbmUpOworCisgICAgLy9wcm92aWRlIGR1bW15IHZhbHVlIHRvIGluaXRpYWxpemUgd3JhcHBlciwgdmFsdWVzIHdpbGwgYmUgdXBkYXRlZCBlYWNoIF9lbmNvZGUoKQorICAgIHZweF9pbWdfd3JhcCgmY3R4LT5yYXdpbWcsIFZQWF9JTUdfRk1UX0k0MjAsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgMSwKKyAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIqKTEpOworCisgICAgaWYgKGN0eC0+aXNfYWxwaGEpCisgICAgICAgIHZweF9pbWdfd3JhcCgmY3R4LT5yYXdpbWdfYWxwaGEsIFZQWF9JTUdfRk1UX0k0MjAsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikxKTsKKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIGNvZGVkIGZyYW1lXG4iKTsKKyAgICAgICAgdnA4X2ZyZWUoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGN4X3BrdGNweShzdHJ1Y3QgRnJhbWVMaXN0RGF0YSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdnB4X2NvZGVjX2N4X3BrdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdnB4X2NvZGVjX2N4X3BrdCAqc3JjX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhDb250ZXh0ICpjdHgpCit7CisgICAgZHN0LT5wdHMgICAgICA9IHNyYy0+ZGF0YS5mcmFtZS5wdHM7CisgICAgZHN0LT5kdXJhdGlvbiA9IHNyYy0+ZGF0YS5mcmFtZS5kdXJhdGlvbjsKKyAgICBkc3QtPmZsYWdzICAgID0gc3JjLT5kYXRhLmZyYW1lLmZsYWdzOworICAgIGRzdC0+c3ogICAgICAgPSBzcmMtPmRhdGEuZnJhbWUuc3o7CisgICAgZHN0LT5idWYgICAgICA9IHNyYy0+ZGF0YS5mcmFtZS5idWY7CisgICAgZHN0LT5oYXZlX3NzZSA9IDA7CisgICAgLyogRm9yIGFsdC1yZWYgZnJhbWUsIGRvbid0IHN0b3JlIFBTTlIgb3IgaW5jcmVtZW50IGZyYW1lX251bWJlciAqLworICAgIGlmICghKGRzdC0+ZmxhZ3MgJiBWUFhfRlJBTUVfSVNfSU5WSVNJQkxFKSkgeworICAgICAgICBkc3QtPmZyYW1lX251bWJlciA9ICsrY3R4LT5mcmFtZV9udW1iZXI7CisgICAgICAgIGRzdC0+aGF2ZV9zc2UgPSBjdHgtPmhhdmVfc3NlOworICAgICAgICBpZiAoY3R4LT5oYXZlX3NzZSkgeworICAgICAgICAgICAgLyogYXNzb2NpYXRlIGxhc3Qtc2VlbiBTU0UgdG8gdGhlIGZyYW1lLiAqLworICAgICAgICAgICAgLyogVHJhbnNmZXJzIG93bmVyc2hpcCBmcm9tIGN0eCB0byBkc3QuICovCisgICAgICAgICAgICAvKiBXQVJOSU5HISBUaGlzIG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgUFNOUl9QS1QgY29tZXMKKyAgICAgICAgICAgICAgIGp1c3QgYmVmb3JlIHRoZSBmcmFtZSBpdCByZWZlcnMgdG8hICovCisgICAgICAgICAgICBtZW1jcHkoZHN0LT5zc2UsIGN0eC0+c3NlLCBzaXplb2YoZHN0LT5zc2UpKTsKKyAgICAgICAgICAgIGN0eC0+aGF2ZV9zc2UgPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0LT5mcmFtZV9udW1iZXIgPSAtMTsgICAvKiBzYW5pdHkgbWFya2VyICovCisgICAgfQorICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgZHN0LT5idWZfYWxwaGEgPSBzcmNfYWxwaGEtPmRhdGEuZnJhbWUuYnVmOworICAgICAgICBkc3QtPnN6X2FscGhhID0gc3JjX2FscGhhLT5kYXRhLmZyYW1lLnN6OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZHN0LT5idWZfYWxwaGEgPSBOVUxMOworICAgICAgICBkc3QtPnN6X2FscGhhID0gMDsKKyAgICB9Cit9CisKKy8qKgorICogU3RvcmUgY29kZWQgZnJhbWUgaW5mb3JtYXRpb24gaW4gZm9ybWF0IHN1aXRhYmxlIGZvciByZXR1cm4gZnJvbSBlbmNvZGUyKCkuCisgKgorICogV3JpdGUgaW5mb3JtYXRpb24gZnJvbSBAYSBjeF9mcmFtZSB0byBAYSBwa3QKKyAqIEByZXR1cm4gcGFja2V0IGRhdGEgc2l6ZSBvbiBzdWNjZXNzCisgKiBAcmV0dXJuIGEgbmVnYXRpdmUgQVZFUlJPUiBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHN0b3JlZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBzdHJ1Y3QgRnJhbWVMaXN0RGF0YSAqY3hfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCwgQVZGcmFtZSAqY29kZWRfZnJhbWUpCit7CisgICAgaW50IHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgY3hfZnJhbWUtPnN6KTsKKyAgICB1aW50OF90ICpzaWRlX2RhdGE7CisgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIGN4X2ZyYW1lLT5idWYsIHBrdC0+c2l6ZSk7CisgICAgICAgIHBrdC0+cHRzID0gcGt0LT5kdHMgICAgPSBjeF9mcmFtZS0+cHRzOworICAgICAgICBjb2RlZF9mcmFtZS0+cHRzICAgICAgID0gY3hfZnJhbWUtPnB0czsKKyAgICAgICAgY29kZWRfZnJhbWUtPmtleV9mcmFtZSA9ICEhKGN4X2ZyYW1lLT5mbGFncyAmIFZQWF9GUkFNRV9JU19LRVkpOworCisgICAgICAgIGlmIChjb2RlZF9mcmFtZS0+a2V5X2ZyYW1lKSB7CisgICAgICAgICAgICBjb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgICAgICBwa3QtPmZsYWdzICAgICAgICAgICAgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKworICAgICAgICBpZiAoY3hfZnJhbWUtPmhhdmVfc3NlKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIC8qIEJld2FyZSBvZiB0aGUgWS9VL1YvYWxsIG9yZGVyISAqLworICAgICAgICAgICAgY29kZWRfZnJhbWUtPmVycm9yWzBdID0gY3hfZnJhbWUtPnNzZVsxXTsKKyAgICAgICAgICAgIGNvZGVkX2ZyYW1lLT5lcnJvclsxXSA9IGN4X2ZyYW1lLT5zc2VbMl07CisgICAgICAgICAgICBjb2RlZF9mcmFtZS0+ZXJyb3JbMl0gPSBjeF9mcmFtZS0+c3NlWzNdOworICAgICAgICAgICAgY29kZWRfZnJhbWUtPmVycm9yWzNdID0gMDsgICAgLy8gYWxwaGEKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+ZXJyb3JbaV0gKz0gY29kZWRfZnJhbWUtPmVycm9yW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3hfZnJhbWUtPmhhdmVfc3NlID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3hfZnJhbWUtPnN6X2FscGhhID4gMCkgeworICAgICAgICAgICAgc2lkZV9kYXRhID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfTUFUUk9TS0FfQkxPQ0tBRERJVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3hfZnJhbWUtPnN6X2FscGhhICsgOCk7CisgICAgICAgICAgICBpZighc2lkZV9kYXRhKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHBrdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFWX1dCNjQoc2lkZV9kYXRhLCAxKTsKKyAgICAgICAgICAgIG1lbWNweShzaWRlX2RhdGEgKyA4LCBjeF9mcmFtZS0+YnVmX2FscGhhLCBjeF9mcmFtZS0+c3pfYWxwaGEpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIHBrdC0+c2l6ZTsKK30KKworLyoqCisgKiBRdWV1ZSBtdWx0aXBsZSBvdXRwdXQgZnJhbWVzIGZyb20gdGhlIGVuY29kZXIsIHJldHVybmluZyB0aGUgZnJvbnQtbW9zdC4KKyAqIEluIGNhc2VzIHdoZXJlIHZweF9jb2RlY19nZXRfY3hfZGF0YSgpIHJldHVybnMgbW9yZSB0aGFuIDEgZnJhbWUgYXBwZW5kCisgKiB0aGUgZnJhbWUgcXVldWUuIFJldHVybiB0aGUgaGVhZCBmcmFtZSBpZiBhdmFpbGFibGUuCisgKiBAcmV0dXJuIFN0b3JlZCBmcmFtZSBzaXplCisgKiBAcmV0dXJuIEFWRVJST1IoRUlOVkFMKSBvbiBvdXRwdXQgc2l6ZSBlcnJvcgorICogQHJldHVybiBBVkVSUk9SKEVOT01FTSkgb24gY29kZWQgZnJhbWUgcXVldWUgZGF0YSBhbGxvY2F0aW9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgcXVldWVfZnJhbWVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpjb2RlZF9mcmFtZSkKK3sKKyAgICBWUDhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHN0cnVjdCB2cHhfY29kZWNfY3hfcGt0ICpwa3Q7CisgICAgY29uc3Qgc3RydWN0IHZweF9jb2RlY19jeF9wa3QgKnBrdF9hbHBoYSA9IE5VTEw7CisgICAgY29uc3Qgdm9pZCAqaXRlciA9IE5VTEw7CisgICAgY29uc3Qgdm9pZCAqaXRlcl9hbHBoYSA9IE5VTEw7CisgICAgaW50IHNpemUgPSAwOworCisgICAgaWYgKGN0eC0+Y29kZWRfZnJhbWVfbGlzdCkgeworICAgICAgICBzdHJ1Y3QgRnJhbWVMaXN0RGF0YSAqY3hfZnJhbWUgPSBjdHgtPmNvZGVkX2ZyYW1lX2xpc3Q7CisgICAgICAgIC8qIHJldHVybiB0aGUgbGVhZGluZyBmcmFtZSBpZiB3ZSd2ZSBhbHJlYWR5IGJlZ3VuIHF1ZXVlaW5nICovCisgICAgICAgIHNpemUgPSBzdG9yZWZyYW1lKGF2Y3R4LCBjeF9mcmFtZSwgcGt0X291dCwgY29kZWRfZnJhbWUpOworICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgY3R4LT5jb2RlZF9mcmFtZV9saXN0ID0gY3hfZnJhbWUtPm5leHQ7CisgICAgICAgIGZyZWVfY29kZWRfZnJhbWUoY3hfZnJhbWUpOworICAgIH0KKworICAgIC8qIGNvbnN1bWUgYWxsIGF2YWlsYWJsZSBvdXRwdXQgZnJvbSB0aGUgZW5jb2RlciBiZWZvcmUgcmV0dXJuaW5nLiBidWZmZXJzCisgICAgICAgYXJlIG9ubHkgZ29vZCB0aHJvdWdoIHRoZSBuZXh0IHZweF9jb2RlYyBjYWxsICovCisgICAgd2hpbGUgKChwa3QgPSB2cHhfY29kZWNfZ2V0X2N4X2RhdGEoJmN0eC0+ZW5jb2RlciwgJml0ZXIpKSAmJgorICAgICAgICAgICAgKCFjdHgtPmlzX2FscGhhIHx8CisgICAgICAgICAgICAgKGN0eC0+aXNfYWxwaGEgJiYgKHBrdF9hbHBoYSA9IHZweF9jb2RlY19nZXRfY3hfZGF0YSgmY3R4LT5lbmNvZGVyX2FscGhhLCAmaXRlcl9hbHBoYSkpKSkpIHsKKyAgICAgICAgc3dpdGNoIChwa3QtPmtpbmQpIHsKKyAgICAgICAgY2FzZSBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUOgorICAgICAgICAgICAgaWYgKCFzaXplKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IEZyYW1lTGlzdERhdGEgY3hfZnJhbWU7CisKKyAgICAgICAgICAgICAgICAvKiBhdm9pZCBzdG9yaW5nIHRoZSBmcmFtZSB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5IGFuZCB3ZSBoYXZlbid0IHlldAorICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIGEgZnJhbWUgZm9yIG91dHB1dCAqLworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoIWN0eC0+Y29kZWRfZnJhbWVfbGlzdCk7CisgICAgICAgICAgICAgICAgY3hfcGt0Y3B5KCZjeF9mcmFtZSwgcGt0LCBwa3RfYWxwaGEsIGN0eCk7CisgICAgICAgICAgICAgICAgc2l6ZSA9IHN0b3JlZnJhbWUoYXZjdHgsICZjeF9mcmFtZSwgcGt0X291dCwgY29kZWRfZnJhbWUpOworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cnVjdCBGcmFtZUxpc3REYXRhICpjeF9mcmFtZSA9CisgICAgICAgICAgICAgICAgICAgIGF2X21hbGxvYyhzaXplb2Yoc3RydWN0IEZyYW1lTGlzdERhdGEpKTsKKworICAgICAgICAgICAgICAgIGlmICghY3hfZnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWUgcXVldWUgZWxlbWVudCBhbGxvYyBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjeF9wa3RjcHkoY3hfZnJhbWUsIHBrdCwgcGt0X2FscGhhLCBjdHgpOworICAgICAgICAgICAgICAgIGN4X2ZyYW1lLT5idWYgPSBhdl9tYWxsb2MoY3hfZnJhbWUtPnN6KTsKKworICAgICAgICAgICAgICAgIGlmICghY3hfZnJhbWUtPmJ1ZikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIGJ1ZmZlciBhbGxvYyAoJSJTSVpFX1NQRUNJRklFUiIgYnl0ZXMpIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4X2ZyYW1lLT5zeik7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZjeF9mcmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbWNweShjeF9mcmFtZS0+YnVmLCBwa3QtPmRhdGEuZnJhbWUuYnVmLCBwa3QtPmRhdGEuZnJhbWUuc3opOworICAgICAgICAgICAgICAgIGlmIChjdHgtPmlzX2FscGhhKSB7CisgICAgICAgICAgICAgICAgICAgIGN4X2ZyYW1lLT5idWZfYWxwaGEgPSBhdl9tYWxsb2MoY3hfZnJhbWUtPnN6X2FscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjeF9mcmFtZS0+YnVmX2FscGhhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBidWZmZXIgYWxsb2MgKCUiU0laRV9TUEVDSUZJRVIiIGJ5dGVzKSBmYWlsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3hfZnJhbWUtPnN6X2FscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUoY3hfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY3hfZnJhbWUtPmJ1Zl9hbHBoYSwgcGt0X2FscGhhLT5kYXRhLmZyYW1lLmJ1ZiwgcGt0X2FscGhhLT5kYXRhLmZyYW1lLnN6KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29kZWRfZnJhbWVfYWRkKCZjdHgtPmNvZGVkX2ZyYW1lX2xpc3QsIGN4X2ZyYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZQWF9DT0RFQ19TVEFUU19QS1Q6IHsKKyAgICAgICAgICAgIHN0cnVjdCB2cHhfZml4ZWRfYnVmICpzdGF0cyA9ICZjdHgtPnR3b3Bhc3Nfc3RhdHM7CisgICAgICAgICAgICBpbnQgZXJyOworICAgICAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmc3RhdHMtPmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtPnN6ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5kYXRhLnR3b3Bhc3Nfc3RhdHMuc3opKSA8IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0cy0+c3ogPSAwOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU3RhdCBidWZmZXIgcmVhbGxvYyBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKXN0YXRzLT5idWYgKyBzdGF0cy0+c3osCisgICAgICAgICAgICAgICAgICAgcGt0LT5kYXRhLnR3b3Bhc3Nfc3RhdHMuYnVmLCBwa3QtPmRhdGEudHdvcGFzc19zdGF0cy5zeik7CisgICAgICAgICAgICBzdGF0cy0+c3ogKz0gcGt0LT5kYXRhLnR3b3Bhc3Nfc3RhdHMuc3o7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFZQWF9DT0RFQ19QU05SX1BLVDoKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoIWN0eC0+aGF2ZV9zc2UpOworICAgICAgICAgICAgY3R4LT5zc2VbMF0gPSBwa3QtPmRhdGEucHNuci5zc2VbMF07CisgICAgICAgICAgICBjdHgtPnNzZVsxXSA9IHBrdC0+ZGF0YS5wc25yLnNzZVsxXTsKKyAgICAgICAgICAgIGN0eC0+c3NlWzJdID0gcGt0LT5kYXRhLnBzbnIuc3NlWzJdOworICAgICAgICAgICAgY3R4LT5zc2VbM10gPSBwa3QtPmRhdGEucHNuci5zc2VbM107CisgICAgICAgICAgICBjdHgtPmhhdmVfc3NlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZQWF9DT0RFQ19DVVNUT01fUEtUOgorICAgICAgICAgICAgLy9pZ25vcmUgdW5zdXBwb3J0ZWQvdW5yZWNvZ25pemVkIHBhY2tldCB0eXBlcworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCB2cDhfZW5jb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIFZQOENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IHZweF9pbWFnZSAqcmF3aW1nID0gTlVMTDsKKyAgICBzdHJ1Y3QgdnB4X2ltYWdlICpyYXdpbWdfYWxwaGEgPSBOVUxMOworICAgIGludDY0X3QgdGltZXN0YW1wID0gMDsKKyAgICBpbnQgcmVzLCBjb2RlZF9zaXplOworICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBmbGFncyA9IDA7CisKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgcmF3aW1nICAgICAgICAgICAgICAgICAgICAgID0gJmN0eC0+cmF3aW1nOworICAgICAgICByYXdpbWctPnBsYW5lc1tWUFhfUExBTkVfWV0gPSBmcmFtZS0+ZGF0YVswXTsKKyAgICAgICAgcmF3aW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdID0gZnJhbWUtPmRhdGFbMV07CisgICAgICAgIHJhd2ltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXSA9IGZyYW1lLT5kYXRhWzJdOworICAgICAgICByYXdpbWctPnN0cmlkZVtWUFhfUExBTkVfWV0gPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIHJhd2ltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXSA9IGZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgcmF3aW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdID0gZnJhbWUtPmxpbmVzaXplWzJdOworICAgICAgICBpZiAoY3R4LT5pc19hbHBoYSkgeworICAgICAgICAgICAgdWludDhfdCAqdV9wbGFuZSwgKnZfcGxhbmU7CisgICAgICAgICAgICByYXdpbWdfYWxwaGEgPSAmY3R4LT5yYXdpbWdfYWxwaGE7CisgICAgICAgICAgICByYXdpbWdfYWxwaGEtPnBsYW5lc1tWUFhfUExBTkVfWV0gPSBmcmFtZS0+ZGF0YVszXTsKKyAgICAgICAgICAgIHVfcGxhbmUgPSBhdl9tYWxsb2MoZnJhbWUtPmxpbmVzaXplWzFdICogZnJhbWUtPmhlaWdodCk7CisgICAgICAgICAgICBtZW1zZXQodV9wbGFuZSwgMHg4MCwgZnJhbWUtPmxpbmVzaXplWzFdICogZnJhbWUtPmhlaWdodCk7CisgICAgICAgICAgICByYXdpbWdfYWxwaGEtPnBsYW5lc1tWUFhfUExBTkVfVV0gPSB1X3BsYW5lOworICAgICAgICAgICAgdl9wbGFuZSA9IGF2X21hbGxvYyhmcmFtZS0+bGluZXNpemVbMl0gKiBmcmFtZS0+aGVpZ2h0KTsKKyAgICAgICAgICAgIG1lbXNldCh2X3BsYW5lLCAweDgwLCBmcmFtZS0+bGluZXNpemVbMl0gKiBmcmFtZS0+aGVpZ2h0KTsKKyAgICAgICAgICAgIHJhd2ltZ19hbHBoYS0+cGxhbmVzW1ZQWF9QTEFORV9WXSA9IHZfcGxhbmU7CisgICAgICAgICAgICByYXdpbWdfYWxwaGEtPnN0cmlkZVtWUFhfUExBTkVfWV0gPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICByYXdpbWdfYWxwaGEtPnN0cmlkZVtWUFhfUExBTkVfVV0gPSBmcmFtZS0+bGluZXNpemVbMV07CisgICAgICAgICAgICByYXdpbWdfYWxwaGEtPnN0cmlkZVtWUFhfUExBTkVfVl0gPSBmcmFtZS0+bGluZXNpemVbMl07CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wICAgICAgICAgICAgICAgICAgID0gZnJhbWUtPnB0czsKKyAgICAgICAgaWYgKGZyYW1lLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgICAgICBmbGFncyB8PSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CisgICAgfQorCisgICAgcmVzID0gdnB4X2NvZGVjX2VuY29kZSgmY3R4LT5lbmNvZGVyLCByYXdpbWcsIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT50aWNrc19wZXJfZnJhbWUsIGZsYWdzLCBjdHgtPmRlYWRsaW5lKTsKKyAgICBpZiAocmVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBsb2dfZW5jb2Rlcl9lcnJvcihhdmN0eCwgIkVycm9yIGVuY29kaW5nIGZyYW1lIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChjdHgtPmlzX2FscGhhKSB7CisgICAgICAgIHJlcyA9IHZweF9jb2RlY19lbmNvZGUoJmN0eC0+ZW5jb2Rlcl9hbHBoYSwgcmF3aW1nX2FscGhhLCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnRpY2tzX3Blcl9mcmFtZSwgZmxhZ3MsIGN0eC0+ZGVhZGxpbmUpOworICAgICAgICBpZiAocmVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgbG9nX2VuY29kZXJfZXJyb3IoYXZjdHgsICJFcnJvciBlbmNvZGluZyBhbHBoYSBmcmFtZSIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlZF9zaXplID0gcXVldWVfZnJhbWVzKGF2Y3R4LCBwa3QsIGF2Y3R4LT5jb2RlZF9mcmFtZSk7CisKKyAgICBpZiAoIWZyYW1lICYmIGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzEpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGI2NF9zaXplID0gQVZfQkFTRTY0X1NJWkUoY3R4LT50d29wYXNzX3N0YXRzLnN6KTsKKworICAgICAgICBhdmN0eC0+c3RhdHNfb3V0ID0gYXZfbWFsbG9jKGI2NF9zaXplKTsKKyAgICAgICAgaWYgKCFhdmN0eC0+c3RhdHNfb3V0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlN0YXQgYnVmZmVyIGFsbG9jICglZCBieXRlcykgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgICAgIGI2NF9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfYmFzZTY0X2VuY29kZShhdmN0eC0+c3RhdHNfb3V0LCBiNjRfc2l6ZSwgY3R4LT50d29wYXNzX3N0YXRzLmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnR3b3Bhc3Nfc3RhdHMuc3opOworICAgIH0KKworICAgIGlmIChyYXdpbWdfYWxwaGEpIHsKKyAgICAgICAgYXZfZnJlZXAoJnJhd2ltZ19hbHBoYS0+cGxhbmVzW1ZQWF9QTEFORV9VXSk7CisgICAgICAgIGF2X2ZyZWVwKCZyYXdpbWdfYWxwaGEtPnBsYW5lc1tWUFhfUExBTkVfVl0pOworICAgIH0KKworICAgICpnb3RfcGFja2V0ID0gISFjb2RlZF9zaXplOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihWUDhDb250ZXh0LCB4KQorI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCisKKyNpZm5kZWYgVlBYX0VSUk9SX1JFU0lMSUVOVF9ERUZBVUxUCisjZGVmaW5lIFZQWF9FUlJPUl9SRVNJTElFTlRfREVGQVVMVCAxCisjZGVmaW5lIFZQWF9FUlJPUl9SRVNJTElFTlRfUEFSVElUSU9OUyAyCisjZW5kaWYKKworI2RlZmluZSBDT01NT05fT1BUSU9OUyBcCisgICAgeyAiY3B1LXVzZWQiLCAgICAgICAgIlF1YWxpdHkvU3BlZWQgcmF0aW8gbW9kaWZpZXIiLCAgICAgICAgICAgT0ZGU0VUKGNwdV91c2VkKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgICAgICAgLTE2LCAgICAgMTYsICAgICAgVkV9LCBcCisgICAgeyAiYXV0by1hbHQtcmVmIiwgICAgIkVuYWJsZSB1c2Ugb2YgYWx0ZXJuYXRlIHJlZmVyZW5jZSAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVzICgyLXBhc3Mgb25seSkiLCAgICAgICAgICAgICAgICAgICBPRkZTRVQoYXV0b19hbHRfcmVmKSwgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgICAgICAtMSwgICAgICAxLCAgICAgICBWRX0sIFwKKyAgICB7ICJsYWctaW4tZnJhbWVzIiwgICAiTnVtYmVyIG9mIGZyYW1lcyB0byBsb29rIGFoZWFkIGZvciAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0ZXJuYXRlIHJlZmVyZW5jZSBmcmFtZSBzZWxlY3Rpb24iLCAgICBPRkZTRVQobGFnX2luX2ZyYW1lcyksICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgICAgICAtMSwgICAgICBJTlRfTUFYLCBWRX0sIFwKKyAgICB7ICJhcm5yLW1heGZyYW1lcyIsICAiYWx0cmVmIG5vaXNlIHJlZHVjdGlvbiBtYXggZnJhbWUgY291bnQiLCBPRkZTRVQoYXJucl9tYXhfZnJhbWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgICAgICAtMSwgICAgICBJTlRfTUFYLCBWRX0sIFwKKyAgICB7ICJhcm5yLXN0cmVuZ3RoIiwgICAiYWx0cmVmIG5vaXNlIHJlZHVjdGlvbiBmaWx0ZXIgc3RyZW5ndGgiLCBPRkZTRVQoYXJucl9zdHJlbmd0aCksICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgICAgICAtMSwgICAgICBJTlRfTUFYLCBWRX0sIFwKKyAgICB7ICJhcm5yLXR5cGUiLCAgICAgICAiYWx0cmVmIG5vaXNlIHJlZHVjdGlvbiBmaWx0ZXIgdHlwZSIsICAgICBPRkZTRVQoYXJucl90eXBlKSwgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgICAgICAtMSwgICAgICBJTlRfTUFYLCBWRSwgImFybnJfdHlwZSJ9LCBcCisgICAgeyAiYmFja3dhcmQiLCAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMX0sIDAsIDAsIFZFLCAiYXJucl90eXBlIiB9LCBcCisgICAgeyAiZm9yd2FyZCIsICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMn0sIDAsIDAsIFZFLCAiYXJucl90eXBlIiB9LCBcCisgICAgeyAiY2VudGVyZWQiLCAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gM30sIDAsIDAsIFZFLCAiYXJucl90eXBlIiB9LCBcCisgICAgeyAiZGVhZGxpbmUiLCAgICAgICAgIlRpbWUgdG8gc3BlbmQgZW5jb2RpbmcsIGluIG1pY3Jvc2Vjb25kcy4iLCBPRkZTRVQoZGVhZGxpbmUpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBWUFhfRExfR09PRF9RVUFMSVRZfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJxdWFsaXR5In0sIFwKKyAgICB7ICJiZXN0IiwgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBWUFhfRExfQkVTVF9RVUFMSVRZfSwgMCwgMCwgVkUsICJxdWFsaXR5In0sIFwKKyAgICB7ICJnb29kIiwgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBWUFhfRExfR09PRF9RVUFMSVRZfSwgMCwgMCwgVkUsICJxdWFsaXR5In0sIFwKKyAgICB7ICJyZWFsdGltZSIsICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBWUFhfRExfUkVBTFRJTUV9LCAgICAgMCwgMCwgVkUsICJxdWFsaXR5In0sIFwKKyAgICB7ICJlcnJvci1yZXNpbGllbnQiLCAiRXJyb3IgcmVzaWxpZW5jZSBjb25maWd1cmF0aW9uIiwgT0ZGU0VUKGVycm9yX3Jlc2lsaWVudCksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IDB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImVyIn0sIFwKKyAgICB7ICJtYXgtaW50cmEtcmF0ZSIsICAiTWF4aW11bSBJLWZyYW1lIGJpdHJhdGUgKHBjdCkgMD11bmxpbWl0ZWQiLCAgT0ZGU0VUKG1heF9pbnRyYV9yYXRlKSwgIEFWX09QVF9UWVBFX0lOVCwgIHsuaTY0ID0gLTF9LCAtMSwgICAgICBJTlRfTUFYLCBWRX0sIFwKKyAgICB7ICJkZWZhdWx0IiwgICAgICAgICAiSW1wcm92ZSByZXNpbGllbmN5IGFnYWluc3QgbG9zc2VzIG9mIHdob2xlIGZyYW1lcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFZQWF9FUlJPUl9SRVNJTElFTlRfREVGQVVMVH0sIDAsIDAsIFZFLCAiZXIifSwgXAorICAgIHsgInBhcnRpdGlvbnMiLCAgICAgICJUaGUgZnJhbWUgcGFydGl0aW9ucyBhcmUgaW5kZXBlbmRlbnRseSBkZWNvZGFibGUgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ5IHRoZSBib29sIGRlY29kZXIsIG1lYW5pbmcgdGhhdCBwYXJ0aXRpb25zIGNhbiBiZSBkZWNvZGVkIGV2ZW4gIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgInRob3VnaCBlYXJsaWVyIHBhcnRpdGlvbnMgaGF2ZSBiZWVuIGxvc3QuIE5vdGUgdGhhdCBpbnRyYSBwcmVkaWNpdGlvbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgc3RpbGwgZG9uZSBvdmVyIHRoZSBwYXJ0aXRpb24gYm91bmRhcnkuIiwgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVlBYX0VSUk9SX1JFU0lMSUVOVF9QQVJUSVRJT05TfSwgMCwgMCwgVkUsICJlciJ9LCBcCisgICAgeyAiY3JmIiwgICAgICAgICAgICAgICJTZWxlY3QgdGhlIHF1YWxpdHkgZm9yIGNvbnN0YW50IHF1YWxpdHkgbW9kZSIsIG9mZnNldG9mKFZQOENvbnRleHQsIGNyZiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCA2MywgVkUgfSwgXAorICAgIHsgInN0YXRpYy10aHJlc2giLCAgICAiQSBjaGFuZ2UgdGhyZXNob2xkIG9uIGJsb2NrcyBiZWxvdyB3aGljaCB0aGV5IHdpbGwgYmUgc2tpcHBlZCBieSB0aGUgZW5jb2RlciIsIE9GRlNFVChzdGF0aWNfdGhyZXNoKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIFZFIH0sIFwKKworI2RlZmluZSBMRUdBQ1lfT1BUSU9OUyBcCisgICAgeyJzcGVlZCIsICIiLCBvZmZzZXRvZihWUDhDb250ZXh0LCBjcHVfdXNlZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgLTE2LCAxNiwgVkV9LCBcCisgICAgeyJxdWFsaXR5IiwgIiIsIG9mZnNldG9mKFZQOENvbnRleHQsIGRlYWRsaW5lKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFZQWF9ETF9HT09EX1FVQUxJVFl9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgInF1YWxpdHkifSwgXAorICAgIHsidnA4ZmxhZ3MiLCAiIiwgb2Zmc2V0b2YoVlA4Q29udGV4dCwgZmxhZ3MpLCBGRl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSAwfSwgMCwgVUlOVF9NQVgsIFZFLCAiZmxhZ3MifSwgXAorICAgIHsiZXJyb3JfcmVzaWxpZW50IiwgImVuYWJsZSBlcnJvciByZXNpbGllbmNlIiwgMCwgRkZfT1BUX1RZUEVfQ09OU1QsIHsuZGJsID0gVlA4Rl9FUlJPUl9SRVNJTElFTlR9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImZsYWdzIn0sIFwKKyAgICB7ImFsdHJlZiIsICJlbmFibGUgdXNlIG9mIGFsdGVybmF0ZSByZWZlcmVuY2UgZnJhbWVzIChWUDgvMi1wYXNzIG9ubHkpIiwgMCwgRkZfT1BUX1RZUEVfQ09OU1QsIHsuZGJsID0gVlA4Rl9BVVRPX0FMVF9SRUZ9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImZsYWdzIn0sIFwKKyAgICB7ImFybnJfbWF4X2ZyYW1lcyIsICJhbHRyZWYgbm9pc2UgcmVkdWN0aW9uIG1heCBmcmFtZSBjb3VudCIsIG9mZnNldG9mKFZQOENvbnRleHQsIGFybnJfbWF4X2ZyYW1lcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMTUsIFZFfSwgXAorICAgIHsiYXJucl9zdHJlbmd0aCIsICJhbHRyZWYgbm9pc2UgcmVkdWN0aW9uIGZpbHRlciBzdHJlbmd0aCIsIG9mZnNldG9mKFZQOENvbnRleHQsIGFybnJfc3RyZW5ndGgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gM30sIDAsIDYsIFZFfSwgXAorICAgIHsiYXJucl90eXBlIiwgImFsdHJlZiBub2lzZSByZWR1Y3Rpb24gZmlsdGVyIHR5cGUiLCBvZmZzZXRvZihWUDhDb250ZXh0LCBhcm5yX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gM30sIDEsIDMsIFZFfSwgXAorICAgIHsicmNfbG9va2FoZWFkIiwgIk51bWJlciBvZiBmcmFtZXMgdG8gbG9vayBhaGVhZCBmb3IgYWx0ZXJuYXRlIHJlZmVyZW5jZSBmcmFtZSBzZWxlY3Rpb24iLCBvZmZzZXRvZihWUDhDb250ZXh0LCBsYWdfaW5fZnJhbWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDI1fSwgMCwgMjUsIFZFfSwgXAorCisjaWYgQ09ORklHX0xJQlZQWF9WUDhfRU5DT0RFUgorc3RhdGljIGNvbnN0IEFWT3B0aW9uIHZwOF9vcHRpb25zW10gPSB7CisgICAgQ09NTU9OX09QVElPTlMKKyAgICBMRUdBQ1lfT1BUSU9OUworICAgIHsgTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfTElCVlBYX1ZQOV9FTkNPREVSCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdnA5X29wdGlvbnNbXSA9IHsKKyAgICBDT01NT05fT1BUSU9OUworICAgIHsgImxvc3NsZXNzIiwgICAgICAgICJMb3NzbGVzcyBtb2RlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGxvc3NsZXNzKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCAxLCBWRX0sCisgICAgeyAidGlsZS1jb2x1bW5zIiwgICAgIk51bWJlciBvZiB0aWxlIGNvbHVtbnMgdG8gdXNlLCBsb2cyIiwgICAgICAgICBPRkZTRVQodGlsZV9jb2x1bW5zKSwgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIDYsIFZFfSwKKyAgICB7ICJ0aWxlLXJvd3MiLCAgICAgICAiTnVtYmVyIG9mIHRpbGUgcm93cyB0byB1c2UsIGxvZzIiLCAgICAgICAgICAgIE9GRlNFVCh0aWxlX3Jvd3MpLCAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgMiwgVkV9LAorICAgIHsgImZyYW1lLXBhcmFsbGVsIiwgICJFbmFibGUgZnJhbWUgcGFyYWxsZWwgZGVjb2RhYmlsaXR5IGZlYXR1cmVzIiwgT0ZGU0VUKGZyYW1lX3BhcmFsbGVsKSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCAxLCBWRX0sCisgICAgeyAiYXEtbW9kZSIsICAgICAgICAgImFkYXB0aXZlIHF1YW50aXphdGlvbiBtb2RlIiwgICAgICAgICAgICAgICAgICBPRkZTRVQoYXFfbW9kZSksICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIDMsIFZFLCAiYXFfbW9kZSJ9LAorICAgIHsgIm5vbmUiLCAgICAgICAgICAgICJBcSBub3QgdXNlZCIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMH0sIDAsIDAsIFZFLCAiYXFfbW9kZSIgfSwgXAorICAgIHsgInZhcmlhbmNlIiwgICAgICAgICJWYXJpYW5jZSBiYXNlZCBBcSIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMX0sIDAsIDAsIFZFLCAiYXFfbW9kZSIgfSwgXAorICAgIHsgImNvbXBsZXhpdHkiLCAgICAgICJDb21wbGV4aXR5IGJhc2VkIEFxIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMn0sIDAsIDAsIFZFLCAiYXFfbW9kZSIgfSwgXAorICAgIHsgImN5Y2xpYyIsICAgICAgICAgICJDeWNsaWMgUmVmcmVzaCBBcSIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gM30sIDAsIDAsIFZFLCAiYXFfbW9kZSIgfSwgXAorICAgIExFR0FDWV9PUFRJT05TCisgICAgeyBOVUxMIH0KK307CisjZW5kaWYKKworI3VuZGVmIENPTU1PTl9PUFRJT05TCisjdW5kZWYgTEVHQUNZX09QVElPTlMKKworc3RhdGljIGNvbnN0IEFWQ29kZWNEZWZhdWx0IGRlZmF1bHRzW10gPSB7CisgICAgeyAicW1pbiIsICAgICAgICAgICAgICItMSIgfSwKKyAgICB7ICJxbWF4IiwgICAgICAgICAgICAgIi0xIiB9LAorICAgIHsgImciLCAgICAgICAgICAgICAgICAiLTEiIH0sCisgICAgeyAia2V5aW50X21pbiIsICAgICAgICItMSIgfSwKKyAgICB7IE5VTEwgfSwKK307CisKKyNpZiBDT05GSUdfTElCVlBYX1ZQOF9FTkNPREVSCitzdGF0aWMgYXZfY29sZCBpbnQgdnA4X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHJldHVybiB2cHhfaW5pdChhdmN0eCwgJnZweF9jb2RlY192cDhfY3hfYWxnbyk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGNsYXNzX3ZwOCA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJsaWJ2cHgtdnA4IGVuY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSB2cDhfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbGlidnB4X3ZwOF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJ2cHgiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJ2cHggVlA4IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZQOCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVlA4Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdnA4X2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gdnA4X2VuY29kZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSB2cDhfZnJlZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfREVMQVkgfCBDT0RFQ19DQVBfQVVUT19USFJFQURTLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJmNsYXNzX3ZwOCwKKyAgICAuZGVmYXVsdHMgICAgICAgPSBkZWZhdWx0cywKK307CisjZW5kaWYgLyogQ09ORklHX0xJQlZQWF9WUDhfRU5DT0RFUiAqLworCisjaWYgQ09ORklHX0xJQlZQWF9WUDlfRU5DT0RFUgorc3RhdGljIGF2X2NvbGQgaW50IHZwOV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICByZXR1cm4gdnB4X2luaXQoYXZjdHgsICZ2cHhfY29kZWNfdnA5X2N4X2FsZ28pOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBjbGFzc192cDkgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibGlidnB4LXZwOSBlbmNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gdnA5X29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2xpYnZweF92cDlfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlidnB4LXZwOSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYnZweCBWUDkiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVlA5LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWUDhDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2cDlfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSB2cDhfZW5jb2RlLAorICAgIC5jbG9zZSAgICAgICAgICA9IHZwOF9mcmVlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9ERUxBWSB8IENPREVDX0NBUF9BVVRPX1RIUkVBRFMsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmY2xhc3NfdnA5LAorICAgIC5kZWZhdWx0cyAgICAgICA9IGRlZmF1bHRzLAorICAgIC5pbml0X3N0YXRpY19kYXRhID0gZmZfdnA5X2luaXRfc3RhdGljLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfTElCVlBYX1ZQOV9FTkNPREVSICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJ3YXZwYWNrZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ3YXZwYWNrZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkOThhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYndhdnBhY2tlbmMuYwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8d2F2cGFjay93YXZwYWNrLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisKKyNpbmNsdWRlICJhdWRpb19mcmFtZV9xdWV1ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFdWX0RFRkFVTFRfQkxPQ0tfU0laRSAzMjc2OAorCit0eXBlZGVmIHN0cnVjdCBMaWJXYXZwYWNrQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgV2F2cGFja0NvbnRleHQgKnd2OworICAgIEF1ZGlvRnJhbWVRdWV1ZSBhZnE7CisKKyAgICBBVlBhY2tldCAqcGt0OworICAgIGludCB1c2VyX3NpemU7CisKKyAgICBpbnQgZ290X291dHB1dDsKK30gTGliV2F2cGFja0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgd2F2cGFja19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3Rfb3V0cHV0KQoreworICAgIExpYldhdnBhY2tDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgcy0+Z290X291dHB1dCA9IDA7CisgICAgcy0+cGt0ICAgICAgICA9IHBrdDsKKyAgICBzLT51c2VyX3NpemUgID0gcGt0LT5zaXplOworCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIHJldCA9IGZmX2FmX3F1ZXVlX2FkZCgmcy0+YWZxLCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICByZXQgPSBXYXZwYWNrUGFja1NhbXBsZXMocy0+d3YsIChpbnQzMl90KilmcmFtZS0+ZGF0YVswXSwgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBlbmNvZGluZyBhIGZyYW1lOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBXYXZwYWNrR2V0RXJyb3JNZXNzYWdlKHMtPnd2KSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzLT5nb3Rfb3V0cHV0ICYmCisgICAgICAgICghZnJhbWUgfHwgZnJhbWUtPm5iX3NhbXBsZXMgPCBhdmN0eC0+ZnJhbWVfc2l6ZSkpIHsKKyAgICAgICAgcmV0ID0gV2F2cGFja0ZsdXNoU2FtcGxlcyhzLT53dik7CisgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGZsdXNoaW5nIHRoZSBlbmNvZGVyOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBXYXZwYWNrR2V0RXJyb3JNZXNzYWdlKHMtPnd2KSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPmdvdF9vdXRwdXQpIHsKKyAgICAgICAgZmZfYWZfcXVldWVfcmVtb3ZlKCZzLT5hZnEsIGF2Y3R4LT5mcmFtZV9zaXplLCAmcGt0LT5wdHMsICZwa3QtPmR1cmF0aW9uKTsKKyAgICAgICAgKmdvdF9vdXRwdXQgPSAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9jYWxsYmFjayh2b2lkICppZCwgdm9pZCAqZGF0YSwgaW50MzJfdCBjb3VudCkKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBpZDsKKyAgICBMaWJXYXZwYWNrQ29udGV4dCAqcyAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQsIG9mZnNldCA9IHMtPnBrdC0+c2l6ZTsKKworICAgIGlmIChzLT51c2VyX3NpemUpIHsKKyAgICAgICAgaWYgKHMtPnVzZXJfc2l6ZSAtIGNvdW50IDwgcy0+cGt0LT5zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlByb3ZpZGVkIHBhY2tldCB0b28gc21hbGwuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHMtPnBrdC0+c2l6ZSArPSBjb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBhdl9ncm93X3BhY2tldChzLT5wa3QsIGNvdW50KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYWxsb2NhdGluZyBvdXRwdXQgcGFja2V0LlxuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1lbWNweShzLT5wa3QtPmRhdGEgKyBvZmZzZXQsIGRhdGEsIGNvdW50KTsKKworICAgIHMtPmdvdF9vdXRwdXQgPSAxOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB3YXZwYWNrX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMaWJXYXZwYWNrQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgV2F2cGFja0NvbmZpZyBjb25maWcgPSB7IDAgfTsKKyAgICBpbnQgcmV0OworCisgICAgcy0+d3YgPSBXYXZwYWNrT3BlbkZpbGVPdXRwdXQoZW5jb2RlX2NhbGxiYWNrLCBhdmN0eCwgTlVMTCk7CisgICAgaWYgKCFzLT53dikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgdGhlIGVuY29kZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBpZiAoIWF2Y3R4LT5mcmFtZV9zaXplKQorICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IFdWX0RFRkFVTFRfQkxPQ0tfU0laRTsKKworICAgIGNvbmZpZy5ieXRlc19wZXJfc2FtcGxlID0gNDsKKyAgICBjb25maWcuYml0c19wZXJfc2FtcGxlICA9IDMyOworICAgIGNvbmZpZy5ibG9ja19zYW1wbGVzICAgID0gYXZjdHgtPmZyYW1lX3NpemU7CisgICAgY29uZmlnLmNoYW5uZWxfbWFzayAgICAgPSBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgY29uZmlnLm51bV9jaGFubmVscyAgICAgPSBhdmN0eC0+Y2hhbm5lbHM7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlICAgICAgPSBhdmN0eC0+c2FtcGxlX3JhdGU7CisKKyAgICBpZiAoYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsICE9IEZGX0NPTVBSRVNTSU9OX0RFRkFVTFQpIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbCA+PSAzKSB7CisgICAgICAgICAgICBjb25maWcuZmxhZ3MgfD0gQ09ORklHX1ZFUllfSElHSF9GTEFHOworCisgICAgICAgICAgICBpZiAgICAgIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPj0gOCkKKyAgICAgICAgICAgICAgICBjb25maWcueG1vZGUgPSA2OworICAgICAgICAgICAgZWxzZSBpZiAoYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsID49IDcpCisgICAgICAgICAgICAgICAgY29uZmlnLnhtb2RlID0gNTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbCA+PSA2KQorICAgICAgICAgICAgICAgIGNvbmZpZy54bW9kZSA9IDQ7CisgICAgICAgICAgICBlbHNlIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPj0gNSkKKyAgICAgICAgICAgICAgICBjb25maWcueG1vZGUgPSAzOworICAgICAgICAgICAgZWxzZSBpZiAoYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsID49IDQpCisgICAgICAgICAgICAgICAgY29uZmlnLnhtb2RlID0gMjsKKyAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPj0gMikKKyAgICAgICAgICAgIGNvbmZpZy5mbGFncyB8PSBDT05GSUdfSElHSF9GTEFHOworICAgICAgICBlbHNlIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPCAxKQorICAgICAgICAgICAgY29uZmlnLmZsYWdzIHw9IENPTkZJR19GQVNUX0ZMQUc7CisgICAgfQorCisgICAgcmV0ID0gV2F2cGFja1NldENvbmZpZ3VyYXRpb24ocy0+d3YsICZjb25maWcsIC0xKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcmV0ID0gV2F2cGFja1BhY2tJbml0KHMtPnd2KTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZmZfYWZfcXVldWVfaW5pdChhdmN0eCwgJnMtPmFmcSk7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGNvbmZpZ3VyaW5nIHRoZSBlbmNvZGVyOiAlcy5cbiIsCisgICAgICAgICAgIFdhdnBhY2tHZXRFcnJvck1lc3NhZ2Uocy0+d3YpKTsKKyAgICBXYXZwYWNrQ2xvc2VGaWxlKHMtPnd2KTsKKyAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgd2F2cGFja19lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIExpYldhdnBhY2tDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIFdhdnBhY2tDbG9zZUZpbGUocy0+d3YpOworCisgICAgZmZfYWZfcXVldWVfY2xvc2UoJnMtPmFmcSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9saWJ3YXZwYWNrX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYndhdnBhY2siLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XQVZQQUNLLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihMaWJXYXZwYWNrQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gd2F2cGFja19lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSB3YXZwYWNrX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSB3YXZwYWNrX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfREVMQVkgfCBDT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYndlYnBlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYndlYnBlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWQ1NmFjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlid2VicGVuYy5jCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogV2ViUCBlbmNvZGluZyBzdXBwb3J0IHZpYSBsaWJ3ZWJwCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogV2ViUCBlbmNvZGVyIHVzaW5nIGxpYndlYnAKKyAqLworCisjaW5jbHVkZSA8d2VicC9lbmNvZGUuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IExpYldlYlBDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsgICAgICAgICAvLyBjbGFzcyBmb3IgQVZPcHRpb25zCisgICAgZmxvYXQgcXVhbGl0eTsgICAgICAgICAgLy8gbG9zc3kgcXVhbGl0eSAwIC0gMTAwCisgICAgaW50IGxvc3NsZXNzOyAgICAgICAgICAgLy8gdXNlIGxvc3NsZXNzIGVuY29kaW5nCisgICAgaW50IHByZXNldDsgICAgICAgICAgICAgLy8gY29uZmlndXJhdGlvbiBwcmVzZXQKKyAgICBpbnQgY2hyb21hX3dhcm5pbmc7ICAgICAvLyBjaHJvbWEgbGluZXNpemUgbWlzbWF0Y2ggd2FybmluZyBoYXMgYmVlbiBwcmludGVkCisgICAgaW50IGNvbnZlcnNpb25fd2FybmluZzsgLy8gcGl4ZWwgZm9ybWF0IGNvbnZlcnNpb24gd2FybmluZyBoYXMgYmVlbiBwcmludGVkCisgICAgV2ViUENvbmZpZyBjb25maWc7ICAgICAgLy8gbGlid2VicCBjb25maWd1cmF0aW9uCisgICAgQVZGcmFtZSAqcmVmOworICAgIGludCBjcl9zaXplOworICAgIGludCBjcl90aHJlc2hvbGQ7Cit9IExpYldlYlBDb250ZXh0OworCitzdGF0aWMgaW50IGxpYndlYnBfZXJyb3JfdG9fYXZlcnJvcihpbnQgZXJyKQoreworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgY2FzZSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk6CisgICAgY2FzZSBWUDhfRU5DX0VSUk9SX0JJVFNUUkVBTV9PVVRfT0ZfTUVNT1JZOgorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGNhc2UgVlA4X0VOQ19FUlJPUl9OVUxMX1BBUkFNRVRFUjoKKyAgICBjYXNlIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOgorICAgIGNhc2UgVlA4X0VOQ19FUlJPUl9CQURfRElNRU5TSU9OOgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbGlid2VicF9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTGliV2ViUENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmdsb2JhbF9xdWFsaXR5ID49IDApCisgICAgICAgIHMtPnF1YWxpdHkgPSBhdl9jbGlwZihhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgLyAoZmxvYXQpRkZfUVAyTEFNQkRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwgMTAwLjBmKTsKKworICAgIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPCAwIHx8IGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbCA+IDYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImludmFsaWQgY29tcHJlc3Npb24gbGV2ZWw6ICVkXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsKTsKKyAgICAgICAgYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsID0gYXZfY2xpcChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwsIDAsIDYpOworICAgIH0KKworICAgIGlmIChzLT5wcmVzZXQgPj0gV0VCUF9QUkVTRVRfREVGQVVMVCkgeworICAgICAgICByZXQgPSBXZWJQQ29uZmlnUHJlc2V0KCZzLT5jb25maWcsIHMtPnByZXNldCwgcy0+cXVhbGl0eSk7CisgICAgICAgIGlmICghcmV0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgcy0+bG9zc2xlc3MgICAgICAgICAgICAgID0gcy0+Y29uZmlnLmxvc3NsZXNzOworICAgICAgICBzLT5xdWFsaXR5ICAgICAgICAgICAgICAgPSBzLT5jb25maWcucXVhbGl0eTsKKyAgICAgICAgYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsID0gcy0+Y29uZmlnLm1ldGhvZDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBXZWJQQ29uZmlnSW5pdCgmcy0+Y29uZmlnKTsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworCisgICAgICAgIHMtPmNvbmZpZy5sb3NzbGVzcyA9IHMtPmxvc3NsZXNzOworICAgICAgICBzLT5jb25maWcucXVhbGl0eSAgPSBzLT5xdWFsaXR5OworICAgICAgICBzLT5jb25maWcubWV0aG9kICAgPSBhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWw7CisKKyAgICAgICAgcmV0ID0gV2ViUFZhbGlkYXRlQ29uZmlnKCZzLT5jb25maWcpOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIlcyAtIHF1YWxpdHk9JS4xZiBtZXRob2Q9JWRcbiIsCisgICAgICAgICAgIHMtPmxvc3NsZXNzID8gIkxvc3NsZXNzIiA6ICJMb3NzeSIsIHMtPnF1YWxpdHksCisgICAgICAgICAgIGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsaWJ3ZWJwX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgTGliV2ViUENvbnRleHQgKnMgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICphbHRfZnJhbWUgPSBOVUxMOworICAgIFdlYlBQaWN0dXJlICpwaWMgPSBOVUxMOworICAgIFdlYlBNZW1vcnlXcml0ZXIgbXcgPSB7IDAgfTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGF2Y3R4LT53aWR0aCA+IFdFQlBfTUFYX0RJTUVOU0lPTiB8fCBhdmN0eC0+aGVpZ2h0ID4gV0VCUF9NQVhfRElNRU5TSU9OKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGljdHVyZSBzaXplIGlzIHRvbyBsYXJnZS4gTWF4IGlzICVkeCVkLlxuIiwKKyAgICAgICAgICAgICAgIFdFQlBfTUFYX0RJTUVOU0lPTiwgV0VCUF9NQVhfRElNRU5TSU9OKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBwaWMgPSBhdl9tYWxsb2Moc2l6ZW9mKCpwaWMpKTsKKyAgICBpZiAoIXBpYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldCA9IFdlYlBQaWN0dXJlSW5pdChwaWMpOworICAgIGlmICghcmV0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIHBpYy0+d2lkdGggID0gYXZjdHgtPndpZHRoOworICAgIHBpYy0+aGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjMyKSB7CisgICAgICAgIGlmICghcy0+bG9zc2xlc3MpIHsKKyAgICAgICAgICAgIC8qIGxpYndlYnAgd2lsbCBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgUkdCIGlucHV0IHRvIFlVViB3aGVuCisgICAgICAgICAgICAgICBlbmNvZGluZyBsb3NzeS4gKi8KKyAgICAgICAgICAgIGlmICghcy0+Y29udmVyc2lvbl93YXJuaW5nKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIlVzaW5nIGxpYndlYnAgZm9yIFJHQi10by1ZVVYgY29udmVyc2lvbi4gWW91IG1heSB3YW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInRvIGNvbnNpZGVyIHBhc3NpbmcgaW4gWVVWIGluc3RlYWQgZm9yIGxvc3N5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImVuY29kaW5nLlxuIik7CisgICAgICAgICAgICAgICAgcy0+Y29udmVyc2lvbl93YXJuaW5nID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwaWMtPnVzZV9hcmdiICAgID0gMTsKKyAgICAgICAgcGljLT5hcmdiICAgICAgICA9ICh1aW50MzJfdCAqKWZyYW1lLT5kYXRhWzBdOworICAgICAgICBwaWMtPmFyZ2Jfc3RyaWRlID0gZnJhbWUtPmxpbmVzaXplWzBdIC8gNDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZnJhbWUtPmxpbmVzaXplWzFdICE9IGZyYW1lLT5saW5lc2l6ZVsyXSB8fCBzLT5jcl90aHJlc2hvbGQpIHsKKyAgICAgICAgICAgIGlmICghcy0+Y2hyb21hX3dhcm5pbmcgJiYgIXMtPmNyX3RocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJDb3B5aW5nIGZyYW1lIGR1ZSB0byBkaWZmZXJpbmcgY2hyb21hIGxpbmVzaXplcy5cbiIpOworICAgICAgICAgICAgICAgIHMtPmNocm9tYV93YXJuaW5nID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFsdF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgICAgICBpZiAoIWFsdF9mcmFtZSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFsdF9mcmFtZS0+d2lkdGggID0gZnJhbWUtPndpZHRoOworICAgICAgICAgICAgYWx0X2ZyYW1lLT5oZWlnaHQgPSBmcmFtZS0+aGVpZ2h0OworICAgICAgICAgICAgYWx0X2ZyYW1lLT5mb3JtYXQgPSBmcmFtZS0+Zm9ybWF0OworICAgICAgICAgICAgaWYgKHMtPmNyX3RocmVzaG9sZCkKKyAgICAgICAgICAgICAgICBhbHRfZnJhbWUtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWQTQyMFA7CisgICAgICAgICAgICByZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKGFsdF9mcmFtZSwgMzIpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICBhbHRfZnJhbWUtPmZvcm1hdCA9IGZyYW1lLT5mb3JtYXQ7CisgICAgICAgICAgICBhdl9mcmFtZV9jb3B5KGFsdF9mcmFtZSwgZnJhbWUpOworICAgICAgICAgICAgZnJhbWUgPSBhbHRfZnJhbWU7CisgICAgICAgICAgICBpZiAocy0+Y3JfdGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgaW50IHgseSwgeDIsIHkyLCBwOworICAgICAgICAgICAgICAgIGludCBicyA9IHMtPmNyX3NpemU7CisKKyAgICAgICAgICAgICAgICBpZiAoIXMtPnJlZikgeworICAgICAgICAgICAgICAgICAgICBzLT5yZWYgPSBhdl9mcmFtZV9jbG9uZShmcmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcy0+cmVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFsdF9mcmFtZS0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVZBNDIwUDsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZnJhbWUtPmhlaWdodDsgeSs9IGJzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBmcmFtZS0+d2lkdGg7IHgrPSBicykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXA7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3NlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCAzOyBwKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnMyID0gYnMgPj4gISFwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ID0gRkZfQ0VJTF9SU0hJRlQoZnJhbWUtPndpZHRoICwgISFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCA9IEZGX0NFSUxfUlNISUZUKGZyYW1lLT5oZWlnaHQsICEhcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhzID0geCA+PiAhIXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzID0geSA+PiAhIXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5MiA9IHlzOyB5MiA8IEZGTUlOKHlzICsgYnMyLCBoKTsgeTIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHgyID0geHM7IHgyIDwgRkZNSU4oeHMgKyBiczIsIHcpOyB4MisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlmZiA9ICBmcmFtZS0+ZGF0YVtwXVtmcmFtZS0+bGluZXNpemVbcF0gKiB5MiArIHgyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zLT5yZWYtPmRhdGFbcF1bZnJhbWUtPmxpbmVzaXplW3BdICogeTIgKyB4Ml07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2UgKz0gZGlmZipkaWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHNzZSA8IHMtPmNyX3RocmVzaG9sZCAmJiBmcmFtZS0+ZGF0YVszXSAhPSBzLT5yZWYtPmRhdGFbM107CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IDM7IHArKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnMyID0gYnMgPj4gISFwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdyA9IEZGX0NFSUxfUlNISUZUKGZyYW1lLT53aWR0aCAsICEhcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoID0gRkZfQ0VJTF9SU0hJRlQoZnJhbWUtPmhlaWdodCwgISFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhzID0geCA+PiAhIXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5cyA9IHkgPj4gISFwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHkyID0geXM7IHkyIDwgRkZNSU4oeXMgKyBiczIsIGgpOyB5MisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnMtPnJlZi0+ZGF0YVtwXVtmcmFtZS0+bGluZXNpemVbcF0gKiB5MiArIHhzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBmcmFtZS0+ZGF0YVtwXVtmcmFtZS0+bGluZXNpemVbcF0gKiB5MiArIHhzXSwgRkZNSU4oYnMyLCB3LXhzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHkyID0geTsgeTIgPCBGRk1JTih5K2JzLCBmcmFtZS0+aGVpZ2h0KTsgeTIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmZnJhbWUtPmRhdGFbM11bZnJhbWUtPmxpbmVzaXplWzNdICogeTIgKyB4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPyAwIDogMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oYnMsIGZyYW1lLT53aWR0aC14KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwaWMtPnVzZV9hcmdiICA9IDA7CisgICAgICAgIHBpYy0+eSAgICAgICAgID0gZnJhbWUtPmRhdGFbMF07CisgICAgICAgIHBpYy0+dSAgICAgICAgID0gZnJhbWUtPmRhdGFbMV07CisgICAgICAgIHBpYy0+diAgICAgICAgID0gZnJhbWUtPmRhdGFbMl07CisgICAgICAgIHBpYy0+eV9zdHJpZGUgID0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBwaWMtPnV2X3N0cmlkZSA9IGZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgaWYgKGZyYW1lLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDIwUCkgeworICAgICAgICAgICAgcGljLT5jb2xvcnNwYWNlID0gV0VCUF9ZVVY0MjBBOworICAgICAgICAgICAgcGljLT5hICAgICAgICAgID0gZnJhbWUtPmRhdGFbM107CisgICAgICAgICAgICBwaWMtPmFfc3RyaWRlICAgPSBmcmFtZS0+bGluZXNpemVbM107CisgICAgICAgICAgICBpZiAoYWx0X2ZyYW1lKQorICAgICAgICAgICAgICAgIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhKHBpYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwaWMtPmNvbG9yc3BhY2UgPSBXRUJQX1lVVjQyMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5sb3NzbGVzcykgeworICAgICAgICAgICAgLyogV2UgZG8gbm90IGhhdmUgYSB3YXkgdG8gYXV0b21hdGljYWxseSBwcmlvcml0aXplIFJHQiBvdmVyIFlVVgorICAgICAgICAgICAgICAgaW4gYXV0b21hdGljIHBpeGVsIGZvcm1hdCBjb252ZXJzaW9uIGJhc2VkIG9uIHdoZXRoZXIgd2UncmUKKyAgICAgICAgICAgICAgIGVuY29kaW5nIGxvc3NsZXNzIG9yIGxvc3N5LCBzbyB3ZSBkbyBjb252ZXJzaW9uIHdpdGggbGlid2VicCBhcworICAgICAgICAgICAgICAgYSBjb252ZW5pZW5jZS4gKi8KKyAgICAgICAgICAgIGlmICghcy0+Y29udmVyc2lvbl93YXJuaW5nKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIlVzaW5nIGxpYndlYnAgZm9yIFlVVi10by1SR0IgY29udmVyc2lvbi4gWW91IG1heSB3YW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInRvIGNvbnNpZGVyIHBhc3NpbmcgaW4gUkdCIGluc3RlYWQgZm9yIGxvc3NsZXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgImVuY29kaW5nLlxuIik7CisgICAgICAgICAgICAgICAgcy0+Y29udmVyc2lvbl93YXJuaW5nID0gMTsKKyAgICAgICAgICAgIH0KKworI2lmIChXRUJQX0VOQ09ERVJfQUJJX1ZFUlNJT04gPD0gMHgyMDEpCisgICAgICAgICAgICAvKiBsaWJ3ZWJwIHNob3VsZCBkbyB0aGUgY29udmVyc2lvbiBhdXRvbWF0aWNhbGx5LCBidXQgdGhlcmUgaXMgYQorICAgICAgICAgICAgICAgYnVnIHRoYXQgY2F1c2VzIGl0IHRvIHJldHVybiBhbiBlcnJvciBpbnN0ZWFkLCBzbyBhIHdvcmstYXJvdW5kCisgICAgICAgICAgICAgICBpcyByZXF1aXJlZC4KKyAgICAgICAgICAgICAgIFNlZSBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3dlYnAvaXNzdWVzL2RldGFpbD9pZD0xNzggKi8KKyAgICAgICAgICAgIHBpYy0+bWVtb3J5XyA9ICh2b2lkKikxOyAgLyogc29tZXRoaW5nIG5vbi1udWxsICovCisgICAgICAgICAgICByZXQgPSBXZWJQUGljdHVyZVlVVkFUb0FSR0IocGljKTsKKyAgICAgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJXZWJQUGljdHVyZVlVVkFUb0FSR0IoKSBmYWlsZWQgd2l0aCBlcnJvcjogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+ZXJyb3JfY29kZSk7CisgICAgICAgICAgICAgICAgcmV0ID0gbGlid2VicF9lcnJvcl90b19hdmVycm9yKHBpYy0+ZXJyb3JfY29kZSk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwaWMtPm1lbW9yeV8gPSBOVUxMOyAgLyogcmVzdG9yZSBwb2ludGVyICovCisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIFdlYlBNZW1vcnlXcml0ZXJJbml0KCZtdyk7CisgICAgcGljLT5jdXN0b21fcHRyID0gJm13OworICAgIHBpYy0+d3JpdGVyICAgICA9IFdlYlBNZW1vcnlXcml0ZTsKKworICAgIHJldCA9IFdlYlBFbmNvZGUoJnMtPmNvbmZpZywgcGljKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIldlYlBFbmNvZGUoKSBmYWlsZWQgd2l0aCBlcnJvcjogJWRcbiIsCisgICAgICAgICAgICAgICBwaWMtPmVycm9yX2NvZGUpOworICAgICAgICByZXQgPSBsaWJ3ZWJwX2Vycm9yX3RvX2F2ZXJyb3IocGljLT5lcnJvcl9jb2RlKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgcmV0ID0gZmZfYWxsb2NfcGFja2V0KHBrdCwgbXcuc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZW5kOworICAgIG1lbWNweShwa3QtPmRhdGEsIG13Lm1lbSwgbXcuc2l6ZSk7CisKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisKK2VuZDoKKyNpZiAoV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OID4gMHgwMjAzKQorICAgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmbXcpOworI2Vsc2UKKyAgICBmcmVlKG13Lm1lbSk7IC8qIG11c3QgdXNlIGZyZWUoKSBhY2NvcmRpbmcgdG8gbGlid2VicCBkb2N1bWVudGF0aW9uICovCisjZW5kaWYKKyAgICBXZWJQUGljdHVyZUZyZWUocGljKTsKKyAgICBhdl9mcmVlcCgmcGljKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZhbHRfZnJhbWUpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsaWJ3ZWJwX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTGliV2ViUENvbnRleHQgKnMgID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnJlZik7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTGliV2ViUENvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAibG9zc2xlc3MiLCAgICJVc2UgbG9zc2xlc3MgbW9kZSIsICAgICAgIE9GRlNFVChsb3NzbGVzcyksIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAgMCB9LCAgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICBWRSAgICAgICAgICAgfSwKKyAgICB7ICJwcmVzZXQiLCAgICAgIkNvbmZpZ3VyYXRpb24gcHJlc2V0IiwgICAgT0ZGU0VUKHByZXNldCksICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IC0xIH0sIC0xLCBXRUJQX1BSRVNFVF9URVhULCAgICAgICAgICAgIFZFLCAicHJlc2V0IiB9LAorICAgIHsgIm5vbmUiLCAgICAgICAiZG8gbm90IHVzZSBhIHByZXNldCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IC0xICAgICAgICAgICAgICAgICAgfSwgMCwgMCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAiZGVmYXVsdCIsICAgICJkZWZhdWx0IHByZXNldCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gV0VCUF9QUkVTRVRfREVGQVVMVCB9LCAwLCAwLCBWRSwgInByZXNldCIgfSwKKyAgICB7ICJwaWN0dXJlIiwgICAgImRpZ2l0YWwgcGljdHVyZSwgbGlrZSBwb3J0cmFpdCwgaW5uZXIgc2hvdCIsICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBXRUJQX1BSRVNFVF9QSUNUVVJFIH0sIDAsIDAsIFZFLCAicHJlc2V0IiB9LAorICAgIHsgInBob3RvIiwgICAgICAib3V0ZG9vciBwaG90b2dyYXBoLCB3aXRoIG5hdHVyYWwgbGlnaHRpbmciLCAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFdFQlBfUFJFU0VUX1BIT1RPICAgfSwgMCwgMCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAiZHJhd2luZyIsICAgICJoYW5kIG9yIGxpbmUgZHJhd2luZywgd2l0aCBoaWdoLWNvbnRyYXN0IGRldGFpbHMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gV0VCUF9QUkVTRVRfRFJBV0lORyB9LCAwLCAwLCBWRSwgInByZXNldCIgfSwKKyAgICB7ICJpY29uIiwgICAgICAgInNtYWxsLXNpemVkIGNvbG9yZnVsIGltYWdlcyIsICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBXRUJQX1BSRVNFVF9JQ09OICAgIH0sIDAsIDAsIFZFLCAicHJlc2V0IiB9LAorICAgIHsgInRleHQiLCAgICAgICAidGV4dC1saWtlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFdFQlBfUFJFU0VUX1RFWFQgICAgfSwgMCwgMCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAiY3JfdGhyZXNob2xkIiwiQ29uZGl0aW9uYWwgcmVwbGVuaXNobWVudCB0aHJlc2hvbGQiLCAgICAgT0ZGU0VUKGNyX3RocmVzaG9sZCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gIDAgIH0sICAwLCBJTlRfTUFYLCBWRSAgICAgICAgICAgfSwKKyAgICB7ICJjcl9zaXplIiAgICAgLCJDb25kaXRpb25hbCByZXBsZW5pc2htZW50IGJsb2NrIHNpemUiLCAgICBPRkZTRVQoY3Jfc2l6ZSkgICAgICwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAgMTYgfSwgIDAsIDI1NiwgICAgIFZFICAgICAgICAgICB9LAorICAgIHsgInF1YWxpdHkiICAgICAsIlF1YWxpdHkiLCAgICAgICAgICAgICAgICBPRkZTRVQocXVhbGl0eSksICBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gIDc1IH0sIDAsIDEwMCwgICAgICAgICAgICAgICAgICAgICAgICAgVkUgICAgICAgICAgIH0sCisgICAgeyBOVUxMIH0sCit9OworCisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGNsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImxpYndlYnAiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGNvbnN0IEFWQ29kZWNEZWZhdWx0IGxpYndlYnBfZGVmYXVsdHNbXSA9IHsKKyAgICB7ICJjb21wcmVzc2lvbl9sZXZlbCIsICAiNCIgIH0sCisgICAgeyAiZ2xvYmFsX3F1YWxpdHkiLCAgICAgIi0xIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKworQVZDb2RlYyBmZl9saWJ3ZWJwX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYndlYnAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJ3ZWJwIFdlYlAgaW1hZ2UiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV0VCUCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTGliV2ViUENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGxpYndlYnBfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gbGlid2VicF9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gbGlid2VicF9lbmNvZGVfY2xvc2UsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfUkdCMzIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmY2xhc3MsCisgICAgLmRlZmF1bHRzICAgICAgID0gbGlid2VicF9kZWZhdWx0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJ4MjY0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ4MjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhMGVlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYngyNjQuYwpAQCAtMCwwICsxLDg5NyBAQAorLyoKKyAqIEguMjY0IGVuY29kaW5nIHVzaW5nIHRoZSB4MjY0IGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc3RlcmVvM2QuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIFgyNjRfQVBJX0lNUE9SVFMgMQorI2VuZGlmCisKKyNpbmNsdWRlIDx4MjY0Lmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiBzdHJ1Y3QgWDI2NENvbnRleHQgeworICAgIEFWQ2xhc3MgICAgICAgICpjbGFzczsKKyAgICB4MjY0X3BhcmFtX3QgICAgcGFyYW1zOworICAgIHgyNjRfdCAgICAgICAgICplbmM7CisgICAgeDI2NF9waWN0dXJlX3QgIHBpYzsKKyAgICB1aW50OF90ICAgICAgICAqc2VpOworICAgIGludCAgICAgICAgICAgICBzZWlfc2l6ZTsKKyAgICBjaGFyICpwcmVzZXQ7CisgICAgY2hhciAqdHVuZTsKKyAgICBjaGFyICpwcm9maWxlOworICAgIGNoYXIgKmxldmVsOworICAgIGludCBmYXN0Zmlyc3RwYXNzOworICAgIGNoYXIgKndwcmVkcDsKKyAgICBjaGFyICp4MjY0b3B0czsKKyAgICBmbG9hdCBjcmY7CisgICAgZmxvYXQgY3JmX21heDsKKyAgICBpbnQgY3FwOworICAgIGludCBhcV9tb2RlOworICAgIGZsb2F0IGFxX3N0cmVuZ3RoOworICAgIGNoYXIgKnBzeV9yZDsKKyAgICBpbnQgcHN5OworICAgIGludCByY19sb29rYWhlYWQ7CisgICAgaW50IHdlaWdodHA7CisgICAgaW50IHdlaWdodGI7CisgICAgaW50IHNzaW07CisgICAgaW50IGludHJhX3JlZnJlc2g7CisgICAgaW50IGJsdXJheV9jb21wYXQ7CisgICAgaW50IGJfYmlhczsKKyAgICBpbnQgYl9weXJhbWlkOworICAgIGludCBtaXhlZF9yZWZzOworICAgIGludCBkY3Q4eDg7CisgICAgaW50IGZhc3RfcHNraXA7CisgICAgaW50IGF1ZDsKKyAgICBpbnQgbWJ0cmVlOworICAgIGNoYXIgKmRlYmxvY2s7CisgICAgZmxvYXQgY3BseGJsdXI7CisgICAgY2hhciAqcGFydGl0aW9uczsKKyAgICBpbnQgZGlyZWN0X3ByZWQ7CisgICAgaW50IHNsaWNlX21heF9zaXplOworICAgIGNoYXIgKnN0YXRzOworICAgIGludCBuYWxfaHJkOworICAgIGludCBhdmNpbnRyYV9jbGFzczsKKyAgICBjaGFyICp4MjY0X3BhcmFtczsKK30gWDI2NENvbnRleHQ7CisKK3N0YXRpYyB2b2lkIFgyNjRfbG9nKHZvaWQgKnAsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisgICAgc3RhdGljIGNvbnN0IGludCBsZXZlbF9tYXBbXSA9IHsKKyAgICAgICAgW1gyNjRfTE9HX0VSUk9SXSAgID0gQVZfTE9HX0VSUk9SLAorICAgICAgICBbWDI2NF9MT0dfV0FSTklOR10gPSBBVl9MT0dfV0FSTklORywKKyAgICAgICAgW1gyNjRfTE9HX0lORk9dICAgID0gQVZfTE9HX0lORk8sCisgICAgICAgIFtYMjY0X0xPR19ERUJVR10gICA9IEFWX0xPR19ERUJVRworICAgIH07CisKKyAgICBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gWDI2NF9MT0dfREVCVUcpCisgICAgICAgIHJldHVybjsKKworICAgIGF2X3Zsb2cocCwgbGV2ZWxfbWFwW2xldmVsXSwgZm10LCBhcmdzKTsKK30KKworCitzdGF0aWMgaW50IGVuY29kZV9uYWxzKEFWQ29kZWNDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHgyNjRfbmFsX3QgKm5hbHMsIGludCBubmFsKQoreworICAgIFgyNjRDb250ZXh0ICp4NCA9IGN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IGksIHNpemUgPSB4NC0+c2VpX3NpemUsIHJldDsKKworICAgIGlmICghbm5hbCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbm5hbDsgaSsrKQorICAgICAgICBzaXplICs9IG5hbHNbaV0uaV9wYXlsb2FkOworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGN0eCwgcGt0LCBzaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcCA9IHBrdC0+ZGF0YTsKKworICAgIC8qIFdyaXRlIHRoZSBTRUkgYXMgcGFydCBvZiB0aGUgZmlyc3QgZnJhbWUuICovCisgICAgaWYgKHg0LT5zZWlfc2l6ZSA+IDAgJiYgbm5hbCA+IDApIHsKKyAgICAgICAgaWYgKHg0LT5zZWlfc2l6ZSA+IHNpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yOiBuYWwgYnVmZmVyIGlzIHRvbyBzbWFsbFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHAsIHg0LT5zZWksIHg0LT5zZWlfc2l6ZSk7CisgICAgICAgIHAgKz0geDQtPnNlaV9zaXplOworICAgICAgICB4NC0+c2VpX3NpemUgPSAwOworICAgICAgICBhdl9mcmVlcCgmeDQtPnNlaSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5uYWw7IGkrKyl7CisgICAgICAgIG1lbWNweShwLCBuYWxzW2ldLnBfcGF5bG9hZCwgbmFsc1tpXS5pX3BheWxvYWQpOworICAgICAgICBwICs9IG5hbHNbaV0uaV9wYXlsb2FkOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGF2Zm10Ml9udW1fcGxhbmVzKGludCBhdmZtdCkKK3sKKyAgICBzd2l0Y2ggKGF2Zm10KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgorICAgICAgICByZXR1cm4gMzsKKworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IyNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIHJldHVybiAxOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDM7CisgICAgfQorfQorCitzdGF0aWMgaW50IFgyNjRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmN0eCwgQVZQYWNrZXQgKnBrdCwgY29uc3QgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfcGFja2V0KQoreworICAgIFgyNjRDb250ZXh0ICp4NCA9IGN0eC0+cHJpdl9kYXRhOworICAgIHgyNjRfbmFsX3QgKm5hbDsKKyAgICBpbnQgbm5hbCwgaSwgcmV0OworICAgIHgyNjRfcGljdHVyZV90IHBpY19vdXQgPSB7MH07CisgICAgQVZGcmFtZVNpZGVEYXRhICpzaWRlX2RhdGE7CisKKyAgICB4MjY0X3BpY3R1cmVfaW5pdCggJng0LT5waWMgKTsKKyAgICB4NC0+cGljLmltZy5pX2NzcCAgID0geDQtPnBhcmFtcy5pX2NzcDsKKyAgICBpZiAoeDI2NF9iaXRfZGVwdGggPiA4KQorICAgICAgICB4NC0+cGljLmltZy5pX2NzcCB8PSBYMjY0X0NTUF9ISUdIX0RFUFRIOworICAgIHg0LT5waWMuaW1nLmlfcGxhbmUgPSBhdmZtdDJfbnVtX3BsYW5lcyhjdHgtPnBpeF9mbXQpOworCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB4NC0+cGljLmltZy5pX3BsYW5lOyBpKyspIHsKKyAgICAgICAgICAgIHg0LT5waWMuaW1nLnBsYW5lW2ldICAgID0gZnJhbWUtPmRhdGFbaV07CisgICAgICAgICAgICB4NC0+cGljLmltZy5pX3N0cmlkZVtpXSA9IGZyYW1lLT5saW5lc2l6ZVtpXTsKKyAgICAgICAgfQorCisgICAgICAgIHg0LT5waWMuaV9wdHMgID0gZnJhbWUtPnB0czsKKyAgICAgICAgeDQtPnBpYy5pX3R5cGUgPQorICAgICAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSA/IFgyNjRfVFlQRV9LRVlGUkFNRSA6CisgICAgICAgICAgICBmcmFtZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QID8gWDI2NF9UWVBFX1AgOgorICAgICAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiA/IFgyNjRfVFlQRV9CIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDI2NF9UWVBFX0FVVE87CisKKyAgICAgICAgaWYgKHg0LT5hdmNpbnRyYV9jbGFzcyA8IDApIHsKKyAgICAgICAgaWYgKHg0LT5wYXJhbXMuYl9pbnRlcmxhY2VkICYmIHg0LT5wYXJhbXMuYl90ZmYgIT0gZnJhbWUtPnRvcF9maWVsZF9maXJzdCkgeworICAgICAgICAgICAgeDQtPnBhcmFtcy5iX3RmZiA9IGZyYW1lLT50b3BfZmllbGRfZmlyc3Q7CisgICAgICAgICAgICB4MjY0X2VuY29kZXJfcmVjb25maWcoeDQtPmVuYywgJng0LT5wYXJhbXMpOworICAgICAgICB9CisgICAgICAgIGlmICh4NC0+cGFyYW1zLnZ1aS5pX3Nhcl9oZWlnaHQgIT0gY3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiB8fAorICAgICAgICAgICAgeDQtPnBhcmFtcy52dWkuaV9zYXJfd2lkdGggICE9IGN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pIHsKKyAgICAgICAgICAgIHg0LT5wYXJhbXMudnVpLmlfc2FyX2hlaWdodCA9IGN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW47CisgICAgICAgICAgICB4NC0+cGFyYW1zLnZ1aS5pX3Nhcl93aWR0aCAgPSBjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtOworICAgICAgICAgICAgeDI2NF9lbmNvZGVyX3JlY29uZmlnKHg0LT5lbmMsICZ4NC0+cGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4NC0+cGFyYW1zLnJjLmlfdmJ2X2J1ZmZlcl9zaXplICE9IGN0eC0+cmNfYnVmZmVyX3NpemUgLyAxMDAwIHx8CisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmlfdmJ2X21heF9iaXRyYXRlICE9IGN0eC0+cmNfbWF4X3JhdGUgICAgLyAxMDAwKSB7CisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmlfdmJ2X2J1ZmZlcl9zaXplID0gY3R4LT5yY19idWZmZXJfc2l6ZSAvIDEwMDA7CisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmlfdmJ2X21heF9iaXRyYXRlID0gY3R4LT5yY19tYXhfcmF0ZSAgICAvIDEwMDA7CisgICAgICAgICAgICB4MjY0X2VuY29kZXJfcmVjb25maWcoeDQtPmVuYywgJng0LT5wYXJhbXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHg0LT5wYXJhbXMucmMuaV9yY19tZXRob2QgPT0gWDI2NF9SQ19BQlIgJiYKKyAgICAgICAgICAgIHg0LT5wYXJhbXMucmMuaV9iaXRyYXRlICE9IGN0eC0+Yml0X3JhdGUgLyAxMDAwKSB7CisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmlfYml0cmF0ZSA9IGN0eC0+Yml0X3JhdGUgLyAxMDAwOworICAgICAgICAgICAgeDI2NF9lbmNvZGVyX3JlY29uZmlnKHg0LT5lbmMsICZ4NC0+cGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4NC0+Y3JmID49IDAgJiYKKyAgICAgICAgICAgIHg0LT5wYXJhbXMucmMuaV9yY19tZXRob2QgPT0gWDI2NF9SQ19DUkYgJiYKKyAgICAgICAgICAgIHg0LT5wYXJhbXMucmMuZl9yZl9jb25zdGFudCAhPSB4NC0+Y3JmKSB7CisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmZfcmZfY29uc3RhbnQgPSB4NC0+Y3JmOworICAgICAgICAgICAgeDI2NF9lbmNvZGVyX3JlY29uZmlnKHg0LT5lbmMsICZ4NC0+cGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4NC0+cGFyYW1zLnJjLmlfcmNfbWV0aG9kID09IFgyNjRfUkNfQ1FQICYmCisgICAgICAgICAgICB4NC0+Y3FwID49IDAgJiYKKyAgICAgICAgICAgIHg0LT5wYXJhbXMucmMuaV9xcF9jb25zdGFudCAhPSB4NC0+Y3FwKSB7CisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmlfcXBfY29uc3RhbnQgPSB4NC0+Y3FwOworICAgICAgICAgICAgeDI2NF9lbmNvZGVyX3JlY29uZmlnKHg0LT5lbmMsICZ4NC0+cGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4NC0+Y3JmX21heCA+PSAwICYmCisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmZfcmZfY29uc3RhbnRfbWF4ICE9IHg0LT5jcmZfbWF4KSB7CisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmZfcmZfY29uc3RhbnRfbWF4ID0geDQtPmNyZl9tYXg7CisgICAgICAgICAgICB4MjY0X2VuY29kZXJfcmVjb25maWcoeDQtPmVuYywgJng0LT5wYXJhbXMpOworICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzaWRlX2RhdGEgPSBhdl9mcmFtZV9nZXRfc2lkZV9kYXRhKGZyYW1lLCBBVl9GUkFNRV9EQVRBX1NURVJFTzNEKTsKKyAgICAgICAgaWYgKHNpZGVfZGF0YSkgeworICAgICAgICAgICAgQVZTdGVyZW8zRCAqc3RlcmVvID0gKEFWU3RlcmVvM0QgKilzaWRlX2RhdGEtPmRhdGE7CisgICAgICAgICAgICBpbnQgZnBhX3R5cGU7CisKKyAgICAgICAgICAgIHN3aXRjaCAoc3RlcmVvLT50eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFWX1NURVJFTzNEX0NIRUNLRVJCT0FSRDoKKyAgICAgICAgICAgICAgICBmcGFfdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1NURVJFTzNEX0NPTFVNTlM6CisgICAgICAgICAgICAgICAgZnBhX3R5cGUgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9TVEVSRU8zRF9MSU5FUzoKKyAgICAgICAgICAgICAgICBmcGFfdHlwZSA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1NURVJFTzNEX1NJREVCWVNJREU6CisgICAgICAgICAgICAgICAgZnBhX3R5cGUgPSAzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9TVEVSRU8zRF9UT1BCT1RUT006CisgICAgICAgICAgICAgICAgZnBhX3R5cGUgPSA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9TVEVSRU8zRF9GUkFNRVNFUVVFTkNFOgorICAgICAgICAgICAgICAgIGZwYV90eXBlID0gNTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZnBhX3R5cGUgPSAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZwYV90eXBlICE9IHg0LT5wYXJhbXMuaV9mcmFtZV9wYWNraW5nKSB7CisgICAgICAgICAgICAgICAgeDQtPnBhcmFtcy5pX2ZyYW1lX3BhY2tpbmcgPSBmcGFfdHlwZTsKKyAgICAgICAgICAgICAgICB4MjY0X2VuY29kZXJfcmVjb25maWcoeDQtPmVuYywgJng0LT5wYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRvIHsKKyAgICAgICAgaWYgKHgyNjRfZW5jb2Rlcl9lbmNvZGUoeDQtPmVuYywgJm5hbCwgJm5uYWwsIGZyYW1lPyAmeDQtPnBpYzogTlVMTCwgJnBpY19vdXQpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICByZXQgPSBlbmNvZGVfbmFscyhjdHgsIHBrdCwgbmFsLCBubmFsKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSB3aGlsZSAoIXJldCAmJiAhZnJhbWUgJiYgeDI2NF9lbmNvZGVyX2RlbGF5ZWRfZnJhbWVzKHg0LT5lbmMpKTsKKworICAgIHBrdC0+cHRzID0gcGljX291dC5pX3B0czsKKyAgICBwa3QtPmR0cyA9IHBpY19vdXQuaV9kdHM7CisKKyAgICBzd2l0Y2ggKHBpY19vdXQuaV90eXBlKSB7CisgICAgY2FzZSBYMjY0X1RZUEVfSURSOgorICAgIGNhc2UgWDI2NF9UWVBFX0k6CisgICAgICAgIGN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFgyNjRfVFlQRV9QOgorICAgICAgICBjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBYMjY0X1RZUEVfQjoKKyAgICBjYXNlIFgyNjRfVFlQRV9CUkVGOgorICAgICAgICBjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfQjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVkqcGljX291dC5iX2tleWZyYW1lOworICAgIGlmIChyZXQpCisgICAgICAgIGN0eC0+Y29kZWRfZnJhbWUtPnF1YWxpdHkgPSAocGljX291dC5pX3FwcGx1czEgLSAxKSAqIEZGX1FQMkxBTUJEQTsKKworICAgICpnb3RfcGFja2V0ID0gcmV0OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgWDI2NF9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgWDI2NENvbnRleHQgKng0ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBhdl9mcmVlcCgmeDQtPnNlaSk7CisKKyAgICBpZiAoeDQtPmVuYykKKyAgICAgICAgeDI2NF9lbmNvZGVyX2Nsb3NlKHg0LT5lbmMpOworCisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9QVF9TVFIob3B0LCBwYXJhbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChwYXJhbSAmJiAocmV0ID0geDI2NF9wYXJhbV9wYXJzZSgmeDQtPnBhcmFtcywgb3B0LCBwYXJhbSkpIDwgMCkgeyBcCisgICAgICAgICAgICBpZihyZXQgPT0gWDI2NF9QQVJBTV9CQURfTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIG9wdGlvbiAnJXMnOiAnJXMnXG4iLCBvcHQsIHBhcmFtKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHZhbHVlIGZvciAnJXMnOiAnJXMnXG4iLCBvcHQsIHBhcmFtKTsgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBjb252ZXJ0X3BpeF9mbXQoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgc3dpdGNoIChwaXhfZm10KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEwOiByZXR1cm4gWDI2NF9DU1BfSTQyMDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQyMlA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDogcmV0dXJuIFgyNjRfQ1NQX0k0MjI7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0NDRQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwOiByZXR1cm4gWDI2NF9DU1BfSTQ0NDsKKyNpZmRlZiBYMjY0X0NTUF9CR1IKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgICAgIHJldHVybiBYMjY0X0NTUF9CR1I7CisKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIHJldHVybiBYMjY0X0NTUF9SR0I7CisjZW5kaWYKKyAgICBjYXNlIEFWX1BJWF9GTVRfTlYxMjogICAgICByZXR1cm4gWDI2NF9DU1BfTlYxMjsKKyAgICBjYXNlIEFWX1BJWF9GTVRfTlYxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfTlYyMDogICAgICByZXR1cm4gWDI2NF9DU1BfTlYxNjsKKyAgICB9OworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFBBUlNFX1gyNjRfT1BUKG5hbWUsIHZhcilcCisgICAgaWYgKHg0LT52YXIgJiYgeDI2NF9wYXJhbV9wYXJzZSgmeDQtPnBhcmFtcywgbmFtZSwgeDQtPnZhcikgPCAwKSB7XAorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgb3B0aW9uICclcycgd2l0aCB2YWx1ZSAnJXMnLlxuIiwgbmFtZSwgeDQtPnZhcik7XAorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpO1wKKyAgICB9CisKK3N0YXRpYyBhdl9jb2xkIGludCBYMjY0X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFgyNjRDb250ZXh0ICp4NCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHN3LHNoOworCisgICAgaWYgKGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSA+IDApCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICItcXNjYWxlIGlzIGlnbm9yZWQsIC1jcmYgaXMgcmVjb21tZW5kZWQuXG4iKTsKKworICAgIHgyNjRfcGFyYW1fZGVmYXVsdCgmeDQtPnBhcmFtcyk7CisKKyAgICB4NC0+cGFyYW1zLmJfZGVibG9ja2luZ19maWx0ZXIgICAgICAgICA9IGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfTE9PUF9GSUxURVI7CisKKyAgICBpZiAoeDQtPnByZXNldCB8fCB4NC0+dHVuZSkKKyAgICAgICAgaWYgKHgyNjRfcGFyYW1fZGVmYXVsdF9wcmVzZXQoJng0LT5wYXJhbXMsIHg0LT5wcmVzZXQsIHg0LT50dW5lKSA8IDApIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBzZXR0aW5nIHByZXNldC90dW5lICVzLyVzLlxuIiwgeDQtPnByZXNldCwgeDQtPnR1bmUpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIlBvc3NpYmxlIHByZXNldHM6Iik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyB4MjY0X3ByZXNldF9uYW1lc1tpXTsgaSsrKQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICIgJXMiLCB4MjY0X3ByZXNldF9uYW1lc1tpXSk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiXG4iKTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJQb3NzaWJsZSB0dW5lczoiKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IHgyNjRfdHVuZV9uYW1lc1tpXTsgaSsrKQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICIgJXMiLCB4MjY0X3R1bmVfbmFtZXNbaV0pOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICBpZiAoYXZjdHgtPmxldmVsID4gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5pX2xldmVsX2lkYyA9IGF2Y3R4LT5sZXZlbDsKKworICAgIHg0LT5wYXJhbXMucGZfbG9nICAgICAgICAgICAgICAgPSBYMjY0X2xvZzsKKyAgICB4NC0+cGFyYW1zLnBfbG9nX3ByaXZhdGUgICAgICAgID0gYXZjdHg7CisgICAgeDQtPnBhcmFtcy5pX2xvZ19sZXZlbCAgICAgICAgICA9IFgyNjRfTE9HX0RFQlVHOworICAgIHg0LT5wYXJhbXMuaV9jc3AgICAgICAgICAgICAgICAgPSBjb252ZXJ0X3BpeF9mbXQoYXZjdHgtPnBpeF9mbXQpOworCisgICAgT1BUX1NUUigid2VpZ2h0cCIsIHg0LT53cHJlZHApOworCisgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSkgeworICAgICAgICB4NC0+cGFyYW1zLnJjLmlfYml0cmF0ZSAgID0gYXZjdHgtPmJpdF9yYXRlIC8gMTAwMDsKKyAgICAgICAgeDQtPnBhcmFtcy5yYy5pX3JjX21ldGhvZCA9IFgyNjRfUkNfQUJSOworICAgIH0KKyAgICB4NC0+cGFyYW1zLnJjLmlfdmJ2X2J1ZmZlcl9zaXplID0gYXZjdHgtPnJjX2J1ZmZlcl9zaXplIC8gMTAwMDsKKyAgICB4NC0+cGFyYW1zLnJjLmlfdmJ2X21heF9iaXRyYXRlID0gYXZjdHgtPnJjX21heF9yYXRlICAgIC8gMTAwMDsKKyAgICB4NC0+cGFyYW1zLnJjLmJfc3RhdF93cml0ZSAgICAgID0gYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19QQVNTMTsKKyAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19QQVNTMikgeworICAgICAgICB4NC0+cGFyYW1zLnJjLmJfc3RhdF9yZWFkID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoeDQtPmNyZiA+PSAwKSB7CisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmlfcmNfbWV0aG9kICAgPSBYMjY0X1JDX0NSRjsKKyAgICAgICAgICAgIHg0LT5wYXJhbXMucmMuZl9yZl9jb25zdGFudCA9IHg0LT5jcmY7CisgICAgICAgIH0gZWxzZSBpZiAoeDQtPmNxcCA+PSAwKSB7CisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmlfcmNfbWV0aG9kICAgPSBYMjY0X1JDX0NRUDsKKyAgICAgICAgICAgIHg0LT5wYXJhbXMucmMuaV9xcF9jb25zdGFudCA9IHg0LT5jcXA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoeDQtPmNyZl9tYXggPj0gMCkKKyAgICAgICAgICAgIHg0LT5wYXJhbXMucmMuZl9yZl9jb25zdGFudF9tYXggPSB4NC0+Y3JmX21heDsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPnJjX2J1ZmZlcl9zaXplICYmIGF2Y3R4LT5yY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3kgPiAwICYmCisgICAgICAgIChhdmN0eC0+cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5IDw9IGF2Y3R4LT5yY19idWZmZXJfc2l6ZSkpIHsKKyAgICAgICAgeDQtPnBhcmFtcy5yYy5mX3Zidl9idWZmZXJfaW5pdCA9CisgICAgICAgICAgICAoZmxvYXQpYXZjdHgtPnJjX2luaXRpYWxfYnVmZmVyX29jY3VwYW5jeSAvIGF2Y3R4LT5yY19idWZmZXJfc2l6ZTsKKyAgICB9CisKKyAgICBPUFRfU1RSKCJsZXZlbCIsIHg0LT5sZXZlbCk7CisKKyAgICBpZiAoYXZjdHgtPmlfcXVhbnRfZmFjdG9yID4gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5yYy5mX2lwX2ZhY3RvciAgICAgICAgID0gMSAvIGZhYnMoYXZjdHgtPmlfcXVhbnRfZmFjdG9yKTsKKyAgICBpZiAoYXZjdHgtPmJfcXVhbnRfZmFjdG9yID4gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5yYy5mX3BiX2ZhY3RvciAgICAgICAgID0gYXZjdHgtPmJfcXVhbnRfZmFjdG9yOworICAgIGlmIChhdmN0eC0+Y2hyb21hb2Zmc2V0KQorICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9jaHJvbWFfcXBfb2Zmc2V0ID0gYXZjdHgtPmNocm9tYW9mZnNldDsKKworICAgIGlmIChhdmN0eC0+bWVfbWV0aG9kID09IE1FX0VQWlMpCisgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5pX21lX21ldGhvZCA9IFgyNjRfTUVfRElBOworICAgIGVsc2UgaWYgKGF2Y3R4LT5tZV9tZXRob2QgPT0gTUVfSEVYKQorICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9tZV9tZXRob2QgPSBYMjY0X01FX0hFWDsKKyAgICBlbHNlIGlmIChhdmN0eC0+bWVfbWV0aG9kID09IE1FX1VNSCkKKyAgICAgICAgeDQtPnBhcmFtcy5hbmFseXNlLmlfbWVfbWV0aG9kID0gWDI2NF9NRV9VTUg7CisgICAgZWxzZSBpZiAoYXZjdHgtPm1lX21ldGhvZCA9PSBNRV9GVUxMKQorICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9tZV9tZXRob2QgPSBYMjY0X01FX0VTQTsKKyAgICBlbHNlIGlmIChhdmN0eC0+bWVfbWV0aG9kID09IE1FX1RFU0EpCisgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5pX21lX21ldGhvZCA9IFgyNjRfTUVfVEVTQTsKKworICAgIGlmIChhdmN0eC0+Z29wX3NpemUgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5pX2tleWludF9tYXggICAgICAgICA9IGF2Y3R4LT5nb3Bfc2l6ZTsKKyAgICBpZiAoYXZjdHgtPm1heF9iX2ZyYW1lcyA+PSAwKQorICAgICAgICB4NC0+cGFyYW1zLmlfYmZyYW1lICAgICAgICAgICAgID0gYXZjdHgtPm1heF9iX2ZyYW1lczsKKyAgICBpZiAoYXZjdHgtPnNjZW5lY2hhbmdlX3RocmVzaG9sZCA+PSAwKQorICAgICAgICB4NC0+cGFyYW1zLmlfc2NlbmVjdXRfdGhyZXNob2xkID0gYXZjdHgtPnNjZW5lY2hhbmdlX3RocmVzaG9sZDsKKyAgICBpZiAoYXZjdHgtPnFtaW4gPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5yYy5pX3FwX21pbiAgICAgICAgICA9IGF2Y3R4LT5xbWluOworICAgIGlmIChhdmN0eC0+cW1heCA+PSAwKQorICAgICAgICB4NC0+cGFyYW1zLnJjLmlfcXBfbWF4ICAgICAgICAgID0gYXZjdHgtPnFtYXg7CisgICAgaWYgKGF2Y3R4LT5tYXhfcWRpZmYgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5yYy5pX3FwX3N0ZXAgICAgICAgICA9IGF2Y3R4LT5tYXhfcWRpZmY7CisgICAgaWYgKGF2Y3R4LT5xYmx1ciA+PSAwKQorICAgICAgICB4NC0+cGFyYW1zLnJjLmZfcWJsdXIgICAgICAgICAgID0gYXZjdHgtPnFibHVyOyAgICAgLyogdGVtcG9yYWxseSBibHVyIHF1YW50cyAqLworICAgIGlmIChhdmN0eC0+cWNvbXByZXNzID49IDApCisgICAgICAgIHg0LT5wYXJhbXMucmMuZl9xY29tcHJlc3MgICAgICAgPSBhdmN0eC0+cWNvbXByZXNzOyAvKiAwLjAgPT4gY2JyLCAxLjAgPT4gY29uc3RhbnQgcXAgKi8KKyAgICBpZiAoYXZjdHgtPnJlZnMgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5pX2ZyYW1lX3JlZmVyZW5jZSAgICA9IGF2Y3R4LT5yZWZzOworICAgIGVsc2UgaWYgKHg0LT5sZXZlbCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IG1ibiA9IEZGX0NFSUxfUlNISUZUKGF2Y3R4LT53aWR0aCwgNCkgKiBGRl9DRUlMX1JTSElGVChhdmN0eC0+aGVpZ2h0LCA0KTsKKyAgICAgICAgaW50IGxldmVsX2lkID0gLTE7CisgICAgICAgIGNoYXIgKnRhaWw7CisgICAgICAgIGludCBzY2FsZSA9IFgyNjRfQlVJTEQgPCAxMjkgPyAzODQgOiAxOworCisgICAgICAgIGlmICghc3RyY21wKHg0LT5sZXZlbCwgIjFiIikpIHsKKyAgICAgICAgICAgIGxldmVsX2lkID0gOTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJsZW4oeDQtPmxldmVsKSA8PSAzKXsKKyAgICAgICAgICAgIGxldmVsX2lkID0gYXZfc3RydG9kKHg0LT5sZXZlbCwgJnRhaWwpICogMTAgKyAwLjU7CisgICAgICAgICAgICBpZiAoKnRhaWwpCisgICAgICAgICAgICAgICAgbGV2ZWxfaWQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGV2ZWxfaWQgPD0gMCkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gcGFyc2UgbGV2ZWxcbiIpOworCisgICAgICAgIGZvciAoaSA9IDA7IGk8eDI2NF9sZXZlbHNbaV0ubGV2ZWxfaWRjOyBpKyspCisgICAgICAgICAgICBpZiAoeDI2NF9sZXZlbHNbaV0ubGV2ZWxfaWRjID09IGxldmVsX2lkKQorICAgICAgICAgICAgICAgIHg0LT5wYXJhbXMuaV9mcmFtZV9yZWZlcmVuY2UgPSBhdl9jbGlwKHgyNjRfbGV2ZWxzW2ldLmRwYiAvIG1ibiAvIHNjYWxlLCAxLCB4NC0+cGFyYW1zLmlfZnJhbWVfcmVmZXJlbmNlKTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPnRyZWxsaXMgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5hbmFseXNlLmlfdHJlbGxpcyAgICA9IGF2Y3R4LT50cmVsbGlzOworICAgIGlmIChhdmN0eC0+bWVfcmFuZ2UgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5hbmFseXNlLmlfbWVfcmFuZ2UgICA9IGF2Y3R4LT5tZV9yYW5nZTsKKyAgICBpZiAoYXZjdHgtPm5vaXNlX3JlZHVjdGlvbiA+PSAwKQorICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9ub2lzZV9yZWR1Y3Rpb24gPSBhdmN0eC0+bm9pc2VfcmVkdWN0aW9uOworICAgIGlmIChhdmN0eC0+bWVfc3VicGVsX3F1YWxpdHkgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5hbmFseXNlLmlfc3VicGVsX3JlZmluZSAgID0gYXZjdHgtPm1lX3N1YnBlbF9xdWFsaXR5OworICAgIGlmIChhdmN0eC0+Yl9mcmFtZV9zdHJhdGVneSA+PSAwKQorICAgICAgICB4NC0+cGFyYW1zLmlfYmZyYW1lX2FkYXB0aXZlID0gYXZjdHgtPmJfZnJhbWVfc3RyYXRlZ3k7CisgICAgaWYgKGF2Y3R4LT5rZXlpbnRfbWluID49IDApCisgICAgICAgIHg0LT5wYXJhbXMuaV9rZXlpbnRfbWluID0gYXZjdHgtPmtleWludF9taW47CisgICAgaWYgKGF2Y3R4LT5jb2Rlcl90eXBlID49IDApCisgICAgICAgIHg0LT5wYXJhbXMuYl9jYWJhYyA9IGF2Y3R4LT5jb2Rlcl90eXBlID09IEZGX0NPREVSX1RZUEVfQUM7CisgICAgaWYgKGF2Y3R4LT5tZV9jbXAgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5hbmFseXNlLmJfY2hyb21hX21lID0gYXZjdHgtPm1lX2NtcCAmIEZGX0NNUF9DSFJPTUE7CisKKyAgICBpZiAoeDQtPmFxX21vZGUgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5yYy5pX2FxX21vZGUgPSB4NC0+YXFfbW9kZTsKKyAgICBpZiAoeDQtPmFxX3N0cmVuZ3RoID49IDApCisgICAgICAgIHg0LT5wYXJhbXMucmMuZl9hcV9zdHJlbmd0aCA9IHg0LT5hcV9zdHJlbmd0aDsKKyAgICBQQVJTRV9YMjY0X09QVCgicHN5LXJkIiwgcHN5X3JkKTsKKyAgICBQQVJTRV9YMjY0X09QVCgiZGVibG9jayIsIGRlYmxvY2spOworICAgIFBBUlNFX1gyNjRfT1BUKCJwYXJ0aXRpb25zIiwgcGFydGl0aW9ucyk7CisgICAgUEFSU0VfWDI2NF9PUFQoInN0YXRzIiwgc3RhdHMpOworICAgIGlmICh4NC0+cHN5ID49IDApCisgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5iX3BzeSAgPSB4NC0+cHN5OworICAgIGlmICh4NC0+cmNfbG9va2FoZWFkID49IDApCisgICAgICAgIHg0LT5wYXJhbXMucmMuaV9sb29rYWhlYWQgPSB4NC0+cmNfbG9va2FoZWFkOworICAgIGlmICh4NC0+d2VpZ2h0cCA+PSAwKQorICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV93ZWlnaHRlZF9wcmVkID0geDQtPndlaWdodHA7CisgICAgaWYgKHg0LT53ZWlnaHRiID49IDApCisgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5iX3dlaWdodGVkX2JpcHJlZCA9IHg0LT53ZWlnaHRiOworICAgIGlmICh4NC0+Y3BseGJsdXIgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5yYy5mX2NvbXBsZXhpdHlfYmx1ciA9IHg0LT5jcGx4Ymx1cjsKKworICAgIGlmICh4NC0+c3NpbSA+PSAwKQorICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuYl9zc2ltID0geDQtPnNzaW07CisgICAgaWYgKHg0LT5pbnRyYV9yZWZyZXNoID49IDApCisgICAgICAgIHg0LT5wYXJhbXMuYl9pbnRyYV9yZWZyZXNoID0geDQtPmludHJhX3JlZnJlc2g7CisgICAgaWYgKHg0LT5ibHVyYXlfY29tcGF0ID49IDApIHsKKyAgICAgICAgeDQtPnBhcmFtcy5iX2JsdXJheV9jb21wYXQgPSB4NC0+Ymx1cmF5X2NvbXBhdDsKKyAgICAgICAgeDQtPnBhcmFtcy5iX3Zmcl9pbnB1dCA9IDA7CisgICAgfQorICAgIGlmICh4NC0+YXZjaW50cmFfY2xhc3MgPj0gMCkKKyNpZiBYMjY0X0JVSUxEID49IDE0MgorICAgICAgICB4NC0+cGFyYW1zLmlfYXZjaW50cmFfY2xhc3MgPSB4NC0+YXZjaW50cmFfY2xhc3M7CisjZWxzZQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJ4MjY0IHRvbyBvbGQgZm9yIEFWQyBJbnRyYSwgYXQgbGVhc3QgdmVyc2lvbiAxNDIgbmVlZGVkXG4iKTsKKyNlbmRpZgorICAgIGlmICh4NC0+Yl9iaWFzICE9IElOVF9NSU4pCisgICAgICAgIHg0LT5wYXJhbXMuaV9iZnJhbWVfYmlhcyAgICAgICAgICAgICAgPSB4NC0+Yl9iaWFzOworICAgIGlmICh4NC0+Yl9weXJhbWlkID49IDApCisgICAgICAgIHg0LT5wYXJhbXMuaV9iZnJhbWVfcHlyYW1pZCA9IHg0LT5iX3B5cmFtaWQ7CisgICAgaWYgKHg0LT5taXhlZF9yZWZzID49IDApCisgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5iX21peGVkX3JlZmVyZW5jZXMgPSB4NC0+bWl4ZWRfcmVmczsKKyAgICBpZiAoeDQtPmRjdDh4OCA+PSAwKQorICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuYl90cmFuc2Zvcm1fOHg4ICAgID0geDQtPmRjdDh4ODsKKyAgICBpZiAoeDQtPmZhc3RfcHNraXAgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5hbmFseXNlLmJfZmFzdF9wc2tpcCAgICAgICA9IHg0LT5mYXN0X3Bza2lwOworICAgIGlmICh4NC0+YXVkID49IDApCisgICAgICAgIHg0LT5wYXJhbXMuYl9hdWQgICAgICAgICAgICAgICAgICAgICAgPSB4NC0+YXVkOworICAgIGlmICh4NC0+bWJ0cmVlID49IDApCisgICAgICAgIHg0LT5wYXJhbXMucmMuYl9tYl90cmVlICAgICAgICAgICAgICAgPSB4NC0+bWJ0cmVlOworICAgIGlmICh4NC0+ZGlyZWN0X3ByZWQgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5hbmFseXNlLmlfZGlyZWN0X212X3ByZWQgICA9IHg0LT5kaXJlY3RfcHJlZDsKKworICAgIGlmICh4NC0+c2xpY2VfbWF4X3NpemUgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5pX3NsaWNlX21heF9zaXplID0gIHg0LT5zbGljZV9tYXhfc2l6ZTsKKyAgICBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQWxsb3cgeDI2NCB0byBiZSBpbnN0cnVjdGVkIHRocm91Z2ggQVZDb2RlY0NvbnRleHQgYWJvdXQgdGhlIG1heGltdW0KKyAgICAgICAgICogc2l6ZSBvZiB0aGUgUlRQIHBheWxvYWQuIEZvciBleGFtcGxlLCB0aGlzIGVuYWJsZXMgdGhlIHByb2R1Y3Rpb24gb2YKKyAgICAgICAgICogcGF5bG9hZCBzdWl0YWJsZSBmb3IgdGhlIEguMjY0IFJUUCBwYWNrZXRpemF0aW9uLW1vZGUgMCBpLmUuIHNpbmdsZQorICAgICAgICAgKiBOQUwgdW5pdCBwZXIgUlRQIHBhY2tldC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChhdmN0eC0+cnRwX3BheWxvYWRfc2l6ZSkKKyAgICAgICAgICAgIHg0LT5wYXJhbXMuaV9zbGljZV9tYXhfc2l6ZSA9IGF2Y3R4LT5ydHBfcGF5bG9hZF9zaXplOworICAgIH0KKworICAgIGlmICh4NC0+ZmFzdGZpcnN0cGFzcykKKyAgICAgICAgeDI2NF9wYXJhbV9hcHBseV9mYXN0Zmlyc3RwYXNzKCZ4NC0+cGFyYW1zKTsKKworICAgIC8qIEFsbG93IHNwZWNpZnlpbmcgdGhlIHgyNjQgcHJvZmlsZSB0aHJvdWdoIEFWQ29kZWNDb250ZXh0LiAqLworICAgIGlmICgheDQtPnByb2ZpbGUpCisgICAgICAgIHN3aXRjaCAoYXZjdHgtPnByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfQkFTRUxJTkU6CisgICAgICAgICAgICB4NC0+cHJvZmlsZSA9IGF2X3N0cmR1cCgiYmFzZWxpbmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIOgorICAgICAgICAgICAgeDQtPnByb2ZpbGUgPSBhdl9zdHJkdXAoImhpZ2giKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzEwOgorICAgICAgICAgICAgeDQtPnByb2ZpbGUgPSBhdl9zdHJkdXAoImhpZ2gxMCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDIyOgorICAgICAgICAgICAgeDQtPnByb2ZpbGUgPSBhdl9zdHJkdXAoImhpZ2g0MjIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NDoKKyAgICAgICAgICAgIHg0LT5wcm9maWxlID0gYXZfc3RyZHVwKCJoaWdoNDQ0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfTUFJTjoKKyAgICAgICAgICAgIHg0LT5wcm9maWxlID0gYXZfc3RyZHVwKCJtYWluIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBpZiAoeDQtPm5hbF9ocmQgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5pX25hbF9ocmQgPSB4NC0+bmFsX2hyZDsKKworICAgIGlmICh4NC0+cHJvZmlsZSkKKyAgICAgICAgaWYgKHgyNjRfcGFyYW1fYXBwbHlfcHJvZmlsZSgmeDQtPnBhcmFtcywgeDQtPnByb2ZpbGUpIDwgMCkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHNldHRpbmcgcHJvZmlsZSAlcy5cbiIsIHg0LT5wcm9maWxlKTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJQb3NzaWJsZSBwcm9maWxlczoiKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IHgyNjRfcHJvZmlsZV9uYW1lc1tpXTsgaSsrKQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICIgJXMiLCB4MjY0X3Byb2ZpbGVfbmFtZXNbaV0pOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICB4NC0+cGFyYW1zLmlfd2lkdGggICAgICAgICAgPSBhdmN0eC0+d2lkdGg7CisgICAgeDQtPnBhcmFtcy5pX2hlaWdodCAgICAgICAgID0gYXZjdHgtPmhlaWdodDsKKyAgICBhdl9yZWR1Y2UoJnN3LCAmc2gsIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLCA0MDk2KTsKKyAgICB4NC0+cGFyYW1zLnZ1aS5pX3Nhcl93aWR0aCAgPSBzdzsKKyAgICB4NC0+cGFyYW1zLnZ1aS5pX3Nhcl9oZWlnaHQgPSBzaDsKKyAgICB4NC0+cGFyYW1zLmlfdGltZWJhc2VfZGVuID0gYXZjdHgtPnRpbWVfYmFzZS5kZW47CisgICAgeDQtPnBhcmFtcy5pX3RpbWViYXNlX251bSA9IGF2Y3R4LT50aW1lX2Jhc2UubnVtOworICAgIHg0LT5wYXJhbXMuaV9mcHNfbnVtID0gYXZjdHgtPnRpbWVfYmFzZS5kZW47CisgICAgeDQtPnBhcmFtcy5pX2Zwc19kZW4gPSBhdmN0eC0+dGltZV9iYXNlLm51bSAqIGF2Y3R4LT50aWNrc19wZXJfZnJhbWU7CisKKyAgICB4NC0+cGFyYW1zLmFuYWx5c2UuYl9wc25yID0gYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19QU05SOworCisgICAgeDQtPnBhcmFtcy5pX3RocmVhZHMgICAgICA9IGF2Y3R4LT50aHJlYWRfY291bnQ7CisgICAgaWYgKGF2Y3R4LT50aHJlYWRfdHlwZSkKKyAgICAgICAgeDQtPnBhcmFtcy5iX3NsaWNlZF90aHJlYWRzID0gYXZjdHgtPnRocmVhZF90eXBlID09IEZGX1RIUkVBRF9TTElDRTsKKworICAgIHg0LT5wYXJhbXMuYl9pbnRlcmxhY2VkICAgPSBhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0lOVEVSTEFDRURfRENUOworCisgICAgeDQtPnBhcmFtcy5iX29wZW5fZ29wICAgICA9ICEoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19DTE9TRURfR09QKTsKKworICAgIHg0LT5wYXJhbXMuaV9zbGljZV9jb3VudCAgPSBhdmN0eC0+c2xpY2VzOworCisgICAgeDQtPnBhcmFtcy52dWkuYl9mdWxscmFuZ2UgPSBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVko0MjBQIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVko0MjJQIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVko0NDRQIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfSlBFRzsKKworICAgIGlmIChhdmN0eC0+Y29sb3JzcGFjZSAhPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQpCisgICAgICAgIHg0LT5wYXJhbXMudnVpLmlfY29sbWF0cml4ID0gYXZjdHgtPmNvbG9yc3BhY2U7CisgICAgaWYgKGF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgIT0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEKQorICAgICAgICB4NC0+cGFyYW1zLnZ1aS5pX2NvbG9ycHJpbSA9IGF2Y3R4LT5jb2xvcl9wcmltYXJpZXM7CisgICAgaWYgKGF2Y3R4LT5jb2xvcl90cmMgIT0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEKQorICAgICAgICB4NC0+cGFyYW1zLnZ1aS5pX3RyYW5zZmVyICA9IGF2Y3R4LT5jb2xvcl90cmM7CisKKyAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKQorICAgICAgICB4NC0+cGFyYW1zLmJfcmVwZWF0X2hlYWRlcnMgPSAwOworCisgICAgaWYoeDQtPngyNjRvcHRzKXsKKyAgICAgICAgY29uc3QgY2hhciAqcD0geDQtPngyNjRvcHRzOworICAgICAgICB3aGlsZShwKXsKKyAgICAgICAgICAgIGNoYXIgcGFyYW1bMjU2XT17MH0sIHZhbFsyNTZdPXswfTsKKyAgICAgICAgICAgIGlmKHNzY2FuZihwLCAiJTI1NVteOj1dPSUyNTVbXjpdIiwgcGFyYW0sIHZhbCkgPT0gMSl7CisgICAgICAgICAgICAgICAgT1BUX1NUUihwYXJhbSwgIjEiKTsKKyAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgT1BUX1NUUihwYXJhbSwgdmFsKTsKKyAgICAgICAgICAgIHA9IHN0cmNocihwLCAnOicpOworICAgICAgICAgICAgcCs9ISFwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHg0LT54MjY0X3BhcmFtcykgeworICAgICAgICBBVkRpY3Rpb25hcnkgKmRpY3QgICAgPSBOVUxMOworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZW4gPSBOVUxMOworCisgICAgICAgIGlmICghYXZfZGljdF9wYXJzZV9zdHJpbmcoJmRpY3QsIHg0LT54MjY0X3BhcmFtcywgIj0iLCAiOiIsIDApKSB7CisgICAgICAgICAgICB3aGlsZSAoKGVuID0gYXZfZGljdF9nZXQoZGljdCwgIiIsIGVuLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICAgICAgICAgIGlmICh4MjY0X3BhcmFtX3BhcnNlKCZ4NC0+cGFyYW1zLCBlbi0+a2V5LCBlbi0+dmFsdWUpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIG9wdGlvbiAnJXMgPSAlcycuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuLT5rZXksIGVuLT52YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmZGljdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1cGRhdGUgQVZDb2RlY0NvbnRleHQgd2l0aCB4MjY0IHBhcmFtZXRlcnMKKyAgICBhdmN0eC0+aGFzX2JfZnJhbWVzID0geDQtPnBhcmFtcy5pX2JmcmFtZSA/CisgICAgICAgIHg0LT5wYXJhbXMuaV9iZnJhbWVfcHlyYW1pZCA/IDIgOiAxIDogMDsKKyAgICBpZiAoYXZjdHgtPm1heF9iX2ZyYW1lcyA8IDApCisgICAgICAgIGF2Y3R4LT5tYXhfYl9mcmFtZXMgPSAwOworCisgICAgYXZjdHgtPmJpdF9yYXRlID0geDQtPnBhcmFtcy5yYy5pX2JpdHJhdGUqMTAwMDsKKworICAgIHg0LT5lbmMgPSB4MjY0X2VuY29kZXJfb3BlbigmeDQtPnBhcmFtcyk7CisgICAgaWYgKCF4NC0+ZW5jKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikgeworICAgICAgICB4MjY0X25hbF90ICpuYWw7CisgICAgICAgIHVpbnQ4X3QgKnA7CisgICAgICAgIGludCBubmFsLCBzLCBpOworCisgICAgICAgIHMgPSB4MjY0X2VuY29kZXJfaGVhZGVycyh4NC0+ZW5jLCAmbmFsLCAmbm5hbCk7CisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBwID0gYXZfbWFsbG9jKHMpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBubmFsOyBpKyspIHsKKyAgICAgICAgICAgIC8qIERvbid0IHB1dCB0aGUgU0VJIGluIGV4dHJhZGF0YS4gKi8KKyAgICAgICAgICAgIGlmIChuYWxbaV0uaV90eXBlID09IE5BTF9TRUkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiJXNcbiIsIG5hbFtpXS5wX3BheWxvYWQrMjUpOworICAgICAgICAgICAgICAgIHg0LT5zZWlfc2l6ZSA9IG5hbFtpXS5pX3BheWxvYWQ7CisgICAgICAgICAgICAgICAgeDQtPnNlaSAgICAgID0gYXZfbWFsbG9jKHg0LT5zZWlfc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHg0LT5zZWksIG5hbFtpXS5wX3BheWxvYWQsIG5hbFtpXS5pX3BheWxvYWQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KHAsIG5hbFtpXS5wX3BheWxvYWQsIG5hbFtpXS5pX3BheWxvYWQpOworICAgICAgICAgICAgcCArPSBuYWxbaV0uaV9wYXlsb2FkOworICAgICAgICB9CisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHAgLSBhdmN0eC0+ZXh0cmFkYXRhOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzXzhiaXRbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwKKyAgICBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgQVZfUElYX0ZNVF9ZVVZKNDIyUCwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKKyAgICBBVl9QSVhfRk1UX05WMTIsCisgICAgQVZfUElYX0ZNVF9OVjE2LAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNfOWJpdFtdID0geworICAgIEFWX1BJWF9GTVRfWVVWNDIwUDksCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQOSwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzXzEwYml0W10gPSB7CisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgQVZfUElYX0ZNVF9OVjIwLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNfOGJpdF9yZ2JbXSA9IHsKKyNpZmRlZiBYMjY0X0NTUF9CR1IKKyAgICBBVl9QSVhfRk1UX0JHUjI0LAorICAgIEFWX1BJWF9GTVRfUkdCMjQsCisjZW5kaWYKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgWDI2NF9pbml0X3N0YXRpYyhBVkNvZGVjICpjb2RlYykKK3sKKyAgICBpZiAoeDI2NF9iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgY29kZWMtPnBpeF9mbXRzID0gcGl4X2ZtdHNfOGJpdDsKKyAgICBlbHNlIGlmICh4MjY0X2JpdF9kZXB0aCA9PSA5KQorICAgICAgICBjb2RlYy0+cGl4X2ZtdHMgPSBwaXhfZm10c185Yml0OworICAgIGVsc2UgaWYgKHgyNjRfYml0X2RlcHRoID09IDEwKQorICAgICAgICBjb2RlYy0+cGl4X2ZtdHMgPSBwaXhfZm10c18xMGJpdDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoWDI2NENvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAicHJlc2V0IiwgICAgICAgICJTZXQgdGhlIGVuY29kaW5nIHByZXNldCAoY2YuIHgyNjQgLS1mdWxsaGVscCkiLCAgIE9GRlNFVChwcmVzZXQpLCAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAibWVkaXVtIiB9LCAwLCAwLCBWRX0sCisgICAgeyAidHVuZSIsICAgICAgICAgICJUdW5lIHRoZSBlbmNvZGluZyBwYXJhbXMgKGNmLiB4MjY0IC0tZnVsbGhlbHApIiwgIE9GRlNFVCh0dW5lKSwgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgVkV9LAorICAgIHsgInByb2ZpbGUiLCAgICAgICAiU2V0IHByb2ZpbGUgcmVzdHJpY3Rpb25zIChjZi4geDI2NCAtLWZ1bGxoZWxwKSAiLCBPRkZTRVQocHJvZmlsZSksICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAwIH0sIDAsIDAsIFZFfSwKKyAgICB7ICJmYXN0Zmlyc3RwYXNzIiwgIlVzZSBmYXN0IHNldHRpbmdzIHdoZW4gZW5jb2RpbmcgZmlyc3QgcGFzcyIsICAgICAgT0ZGU0VUKGZhc3RmaXJzdHBhc3MpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IDEgfSwgMCwgMSwgVkV9LAorICAgIHsibGV2ZWwiLCAiU3BlY2lmeSBsZXZlbCAoYXMgZGVmaW5lZCBieSBBbm5leCBBKSIsIE9GRlNFVChsZXZlbCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIDAsIDAsIFZFfSwKKyAgICB7InBhc3Nsb2dmaWxlIiwgIkZpbGVuYW1lIGZvciAyIHBhc3Mgc3RhdHMiLCBPRkZTRVQoc3RhdHMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAwLCAwLCBWRX0sCisgICAgeyJ3cHJlZHAiLCAiV2VpZ2h0ZWQgcHJlZGljdGlvbiBmb3IgUC1mcmFtZXMiLCBPRkZTRVQod3ByZWRwKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgMCwgMCwgVkV9LAorICAgIHsieDI2NG9wdHMiLCAieDI2NCBvcHRpb25zIiwgT0ZGU0VUKHgyNjRvcHRzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgMCwgMCwgVkV9LAorICAgIHsgImNyZiIsICAgICAgICAgICAiU2VsZWN0IHRoZSBxdWFsaXR5IGZvciBjb25zdGFudCBxdWFsaXR5IG1vZGUiLCAgICBPRkZTRVQoY3JmKSwgICAgICAgICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgey5kYmwgPSAtMSB9LCAtMSwgRkxUX01BWCwgVkUgfSwKKyAgICB7ICJjcmZfbWF4IiwgICAgICAgIkluIENSRiBtb2RlLCBwcmV2ZW50cyBWQlYgZnJvbSBsb3dlcmluZyBxdWFsaXR5IGJleW9uZCB0aGlzIHBvaW50LiIsT0ZGU0VUKGNyZl9tYXgpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAtMSB9LCAtMSwgRkxUX01BWCwgVkUgfSwKKyAgICB7ICJxcCIsICAgICAgICAgICAgIkNvbnN0YW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgcmF0ZSBjb250cm9sIG1ldGhvZCIsT0ZGU0VUKGNxcCksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlRfTUFYLCBWRSB9LAorICAgIHsgImFxLW1vZGUiLCAgICAgICAiQVEgbWV0aG9kIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoYXFfbW9kZSksICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsIFZFLCAiYXFfbW9kZSJ9LAorICAgIHsgIm5vbmUiLCAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFgyNjRfQVFfTk9ORX0sICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVkUsICJhcV9tb2RlIiB9LAorICAgIHsgInZhcmlhbmNlIiwgICAgICAiVmFyaWFuY2UgQVEgKGNvbXBsZXhpdHkgbWFzaykiLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFgyNjRfQVFfVkFSSUFOQ0V9LCAgICAgSU5UX01JTiwgSU5UX01BWCwgVkUsICJhcV9tb2RlIiB9LAorICAgIHsgImF1dG92YXJpYW5jZSIsICAiQXV0by12YXJpYW5jZSBBUSAoZXhwZXJpbWVudGFsKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFgyNjRfQVFfQVVUT1ZBUklBTkNFfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJhcV9tb2RlIiB9LAorICAgIHsgImFxLXN0cmVuZ3RoIiwgICAiQVEgc3RyZW5ndGguIFJlZHVjZXMgYmxvY2tpbmcgYW5kIGJsdXJyaW5nIGluIGZsYXQgYW5kIHRleHR1cmVkIGFyZWFzLiIsIE9GRlNFVChhcV9zdHJlbmd0aCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IC0xfSwgLTEsIEZMVF9NQVgsIFZFfSwKKyAgICB7ICJwc3kiLCAgICAgICAgICAgIlVzZSBwc3ljaG92aXN1YWwgb3B0aW1pemF0aW9ucy4iLCAgICAgICAgICAgICAgICAgT0ZGU0VUKHBzeSksICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IC0xIH0sIC0xLCAxLCBWRSB9LAorICAgIHsgInBzeS1yZCIsICAgICAgICAiU3RyZW5ndGggb2YgcHN5Y2hvdmlzdWFsIG9wdGltaXphdGlvbiwgaW4gPHBzeS1yZD46PHBzeS10cmVsbGlzPiBmb3JtYXQuIiwgT0ZGU0VUKHBzeV9yZCksIEFWX09QVF9UWVBFX1NUUklORywgIHswIH0sIDAsIDAsIFZFfSwKKyAgICB7ICJyYy1sb29rYWhlYWQiLCAgIk51bWJlciBvZiBmcmFtZXMgdG8gbG9vayBhaGVhZCBmb3IgZnJhbWV0eXBlIGFuZCByYXRlY29udHJvbCIsIE9GRlNFVChyY19sb29rYWhlYWQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlRfTUFYLCBWRSB9LAorICAgIHsgIndlaWdodGIiLCAgICAgICAiV2VpZ2h0ZWQgcHJlZGljdGlvbiBmb3IgQi1mcmFtZXMuIiwgICAgICAgICAgICAgICBPRkZTRVQod2VpZ2h0YiksICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIFZFIH0sCisgICAgeyAid2VpZ2h0cCIsICAgICAgICJXZWlnaHRlZCBwcmVkaWN0aW9uIGFuYWx5c2lzIG1ldGhvZC4iLCAgICAgICAgICAgIE9GRlNFVCh3ZWlnaHRwKSwgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAtMSB9LCAtMSwgSU5UX01BWCwgVkUsICJ3ZWlnaHRwIiB9LAorICAgIHsgIm5vbmUiLCAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBYMjY0X1dFSUdIVFBfTk9ORX0sICAgSU5UX01JTiwgSU5UX01BWCwgVkUsICJ3ZWlnaHRwIiB9LAorICAgIHsgInNpbXBsZSIsICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBYMjY0X1dFSUdIVFBfU0lNUExFfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJ3ZWlnaHRwIiB9LAorICAgIHsgInNtYXJ0IiwgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBYMjY0X1dFSUdIVFBfU01BUlR9LCAgSU5UX01JTiwgSU5UX01BWCwgVkUsICJ3ZWlnaHRwIiB9LAorICAgIHsgInNzaW0iLCAgICAgICAgICAiQ2FsY3VsYXRlIGFuZCBwcmludCBTU0lNIHN0YXRzLiIsICAgICAgICAgICAgICAgICBPRkZTRVQoc3NpbSksICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIFZFIH0sCisgICAgeyAiaW50cmEtcmVmcmVzaCIsICJVc2UgUGVyaW9kaWMgSW50cmEgUmVmcmVzaCBpbnN0ZWFkIG9mIElEUiBmcmFtZXMuIixPRkZTRVQoaW50cmFfcmVmcmVzaCksQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAtMSB9LCAtMSwgMSwgVkUgfSwKKyAgICB7ICJibHVyYXktY29tcGF0IiwgIkJsdXJheSBjb21wYXRpYmlsaXR5IHdvcmthcm91bmRzLiIsICAgICAgICAgICAgICAgT0ZGU0VUKGJsdXJheV9jb21wYXQpICxBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IC0xIH0sIC0xLCAxLCBWRSB9LAorICAgIHsgImItYmlhcyIsICAgICAgICAiSW5mbHVlbmNlcyBob3cgb2Z0ZW4gQi1mcmFtZXMgYXJlIHVzZWQiLCAgICAgICAgICBPRkZTRVQoYl9iaWFzKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gSU5UX01JTn0sIElOVF9NSU4sIElOVF9NQVgsIFZFIH0sCisgICAgeyAiYi1weXJhbWlkIiwgICAgICJLZWVwIHNvbWUgQi1mcmFtZXMgYXMgcmVmZXJlbmNlcy4iLCAgICAgICAgICAgICAgIE9GRlNFVChiX3B5cmFtaWQpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAtMSB9LCAtMSwgSU5UX01BWCwgVkUsICJiX3B5cmFtaWQiIH0sCisgICAgeyAibm9uZSIsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFgyNjRfQl9QWVJBTUlEX05PTkV9LCAgIElOVF9NSU4sIElOVF9NQVgsIFZFLCAiYl9weXJhbWlkIiB9LAorICAgIHsgInN0cmljdCIsICAgICAgICAiU3RyaWN0bHkgaGllcmFyY2hpY2FsIHB5cmFtaWQiLCAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBYMjY0X0JfUFlSQU1JRF9TVFJJQ1R9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImJfcHlyYW1pZCIgfSwKKyAgICB7ICJub3JtYWwiLCAgICAgICAgIk5vbi1zdHJpY3QgKG5vdCBCbHUtcmF5IGNvbXBhdGlibGUpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWDI2NF9CX1BZUkFNSURfTk9STUFMfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJiX3B5cmFtaWQiIH0sCisgICAgeyAibWl4ZWQtcmVmcyIsICAgICJPbmUgcmVmZXJlbmNlIHBlciBwYXJ0aXRpb24sIGFzIG9wcG9zZWQgdG8gb25lIHJlZmVyZW5jZSBwZXIgbWFjcm9ibG9jayIsIE9GRlNFVChtaXhlZF9yZWZzKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMX0sIC0xLCAxLCBWRSB9LAorICAgIHsgIjh4OGRjdCIsICAgICAgICAiSGlnaCBwcm9maWxlIDh4OCB0cmFuc2Zvcm0uIiwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZGN0OHg4KSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIFZFfSwKKyAgICB7ICJmYXN0LXBza2lwIiwgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGZhc3RfcHNraXApLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IC0xIH0sIC0xLCAxLCBWRX0sCisgICAgeyAiYXVkIiwgICAgICAgICAgICJVc2UgYWNjZXNzIHVuaXQgZGVsaW1pdGVycy4iLCAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChhdWQpLCAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAtMSB9LCAtMSwgMSwgVkV9LAorICAgIHsgIm1idHJlZSIsICAgICAgICAiVXNlIG1hY3JvYmxvY2sgdHJlZSByYXRlY29udHJvbC4iLCAgICAgICAgICAgICAgICBPRkZTRVQobWJ0cmVlKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIFZFfSwKKyAgICB7ICJkZWJsb2NrIiwgICAgICAgIkxvb3AgZmlsdGVyIHBhcmFtZXRlcnMsIGluIDxhbHBoYTpiZXRhPiBmb3JtLiIsICAgT0ZGU0VUKGRlYmxvY2spLCAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgMCB9LCAgMCwgMCwgVkV9LAorICAgIHsgImNwbHhibHVyIiwgICAgICAiUmVkdWNlIGZsdWN0dWF0aW9ucyBpbiBRUCAoYmVmb3JlIGN1cnZlIGNvbXByZXNzaW9uKSIsIE9GRlNFVChjcGx4Ymx1ciksIEFWX09QVF9UWVBFX0ZMT0FULCAgey5kYmwgPSAtMSB9LCAtMSwgRkxUX01BWCwgVkV9LAorICAgIHsgInBhcnRpdGlvbnMiLCAgICAiQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXJ0aXRpb25zIHRvIGNvbnNpZGVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICJQb3NzaWJsZSB2YWx1ZXM6IHA4eDgsIHA0eDQsIGI4eDgsIGk4eDgsIGk0eDQsIG5vbmUsIGFsbCIsIE9GRlNFVChwYXJ0aXRpb25zKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgVkV9LAorICAgIHsgImRpcmVjdC1wcmVkIiwgICAiRGlyZWN0IE1WIHByZWRpY3Rpb24gbW9kZSIsICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZGlyZWN0X3ByZWQpLCAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsIFZFLCAiZGlyZWN0LXByZWQiIH0sCisgICAgeyAibm9uZSIsICAgICAgICAgIE5VTEwsICAgICAgMCwgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFgyNjRfRElSRUNUX1BSRURfTk9ORSB9LCAgICAgMCwgMCwgVkUsICJkaXJlY3QtcHJlZCIgfSwKKyAgICB7ICJzcGF0aWFsIiwgICAgICAgTlVMTCwgICAgICAwLCAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gWDI2NF9ESVJFQ1RfUFJFRF9TUEFUSUFMIH0sICAwLCAwLCBWRSwgImRpcmVjdC1wcmVkIiB9LAorICAgIHsgInRlbXBvcmFsIiwgICAgICBOVUxMLCAgICAgIDAsICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBYMjY0X0RJUkVDVF9QUkVEX1RFTVBPUkFMIH0sIDAsIDAsIFZFLCAiZGlyZWN0LXByZWQiIH0sCisgICAgeyAiYXV0byIsICAgICAgICAgIE5VTEwsICAgICAgMCwgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFgyNjRfRElSRUNUX1BSRURfQVVUTyB9LCAgICAgMCwgMCwgVkUsICJkaXJlY3QtcHJlZCIgfSwKKyAgICB7ICJzbGljZS1tYXgtc2l6ZSIsIkxpbWl0IHRoZSBzaXplIG9mIGVhY2ggc2xpY2UgaW4gYnl0ZXMiLCAgICAgICAgICAgT0ZGU0VUKHNsaWNlX21heF9zaXplKSxBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlRfTUFYLCBWRSB9LAorICAgIHsgInN0YXRzIiwgICAgICAgICAiRmlsZW5hbWUgZm9yIDIgcGFzcyBzdGF0cyIsICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3RhdHMpLCAgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAwIH0sICAwLCAgICAgICAwLCBWRSB9LAorICAgIHsgIm5hbC1ocmQiLCAgICAgICAiU2lnbmFsIEhSRCBpbmZvcm1hdGlvbiAocmVxdWlyZXMgdmJ2LWJ1ZnNpemU7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImNiciBub3QgYWxsb3dlZCBpbiAubXA0KSIsICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKG5hbF9ocmQpLCAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlRfTUFYLCBWRSwgIm5hbC1ocmQiIH0sCisgICAgeyAibm9uZSIsICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFgyNjRfTkFMX0hSRF9OT05FfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJuYWwtaHJkIiB9LAorICAgIHsgInZiciIsICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBYMjY0X05BTF9IUkRfVkJSfSwgIElOVF9NSU4sIElOVF9NQVgsIFZFLCAibmFsLWhyZCIgfSwKKyAgICB7ICJjYnIiLCAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWDI2NF9OQUxfSFJEX0NCUn0sICBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgIm5hbC1ocmQiIH0sCisgICAgeyAiYXZjaW50cmEtY2xhc3MiLCJBVkMtSW50cmEgY2xhc3MgNTAvMTAwLzIwMCIsICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChhdmNpbnRyYV9jbGFzcyksQVZfT1BUX1RZUEVfSU5ULCAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDIwMCAgICwgVkV9LAorICAgIHsgIngyNjQtcGFyYW1zIiwgICJPdmVycmlkZSB0aGUgeDI2NCBjb25maWd1cmF0aW9uIHVzaW5nIGEgOi1zZXBhcmF0ZWQgbGlzdCBvZiBrZXk9dmFsdWUgcGFyYW1ldGVycyIsIE9GRlNFVCh4MjY0X3BhcmFtcyksIEFWX09QVF9UWVBFX1NUUklORywgeyAwIH0sIDAsIDAsIFZFIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB4MjY0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImxpYngyNjQiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgcmdiY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibGlieDI2NHJnYiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgeDI2NF9kZWZhdWx0c1tdID0geworICAgIHsgImIiLCAgICAgICAgICAgICAgICAiMCIgfSwKKyAgICB7ICJiZiIsICAgICAgICAgICAgICAgIi0xIiB9LAorICAgIHsgImZsYWdzMiIsICAgICAgICAgICAiMCIgfSwKKyAgICB7ICJnIiwgICAgICAgICAgICAgICAgIi0xIiB9LAorICAgIHsgImlfcWZhY3RvciIsICAgICAgICAiLTEiIH0sCisgICAgeyAiYl9xZmFjdG9yIiwgICAgICAgICItMSIgfSwKKyAgICB7ICJxbWluIiwgICAgICAgICAgICAgIi0xIiB9LAorICAgIHsgInFtYXgiLCAgICAgICAgICAgICAiLTEiIH0sCisgICAgeyAicWRpZmYiLCAgICAgICAgICAgICItMSIgfSwKKyAgICB7ICJxYmx1ciIsICAgICAgICAgICAgIi0xIiB9LAorICAgIHsgInFjb21wIiwgICAgICAgICAgICAiLTEiIH0sCisvLyAgICAgeyAicmNfbG9va2FoZWFkIiwgICAgICItMSIgfSwKKyAgICB7ICJyZWZzIiwgICAgICAgICAgICAgIi0xIiB9LAorICAgIHsgInNjX3RocmVzaG9sZCIsICAgICAiLTEiIH0sCisgICAgeyAidHJlbGxpcyIsICAgICAgICAgICItMSIgfSwKKyAgICB7ICJuciIsICAgICAgICAgICAgICAgIi0xIiB9LAorICAgIHsgIm1lX3JhbmdlIiwgICAgICAgICAiLTEiIH0sCisgICAgeyAibWVfbWV0aG9kIiwgICAgICAgICItMSIgfSwKKyAgICB7ICJzdWJxIiwgICAgICAgICAgICAgIi0xIiB9LAorICAgIHsgImJfc3RyYXRlZ3kiLCAgICAgICAiLTEiIH0sCisgICAgeyAia2V5aW50X21pbiIsICAgICAgICItMSIgfSwKKyAgICB7ICJjb2RlciIsICAgICAgICAgICAgIi0xIiB9LAorICAgIHsgImNtcCIsICAgICAgICAgICAgICAiLTEiIH0sCisgICAgeyAidGhyZWFkcyIsICAgICAgICAgIEFWX1NUUklOR0lGWShYMjY0X1RIUkVBRFNfQVVUTykgfSwKKyAgICB7ICJ0aHJlYWRfdHlwZSIsICAgICAgIjAiIH0sCisgICAgeyAiZmxhZ3MiLCAgICAgICAgICAgICIrY2dvcCIgfSwKKyAgICB7ICJyY19pbml0X29jY3VwYW5jeSIsIi0xIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKworQVZDb2RlYyBmZl9saWJ4MjY0X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAibGlieDI2NCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGlieDI2NCBILjI2NCAvIEFWQyAvIE1QRUctNCBBVkMgLyBNUEVHLTQgcGFydCAxMCIpLAorICAgIC50eXBlICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihYMjY0Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgPSBYMjY0X2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgPSBYMjY0X2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICAgID0gWDI2NF9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICA9IENPREVDX0NBUF9ERUxBWSB8IENPREVDX0NBUF9BVVRPX1RIUkVBRFMsCisgICAgLnByaXZfY2xhc3MgICAgICAgPSAmeDI2NF9jbGFzcywKKyAgICAuZGVmYXVsdHMgICAgICAgICA9IHgyNjRfZGVmYXVsdHMsCisgICAgLmluaXRfc3RhdGljX2RhdGEgPSBYMjY0X2luaXRfc3RhdGljLAorfTsKKworQVZDb2RlYyBmZl9saWJ4MjY0cmdiX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYngyNjRyZ2IiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJ4MjY0IEguMjY0IC8gQVZDIC8gTVBFRy00IEFWQyAvIE1QRUctNCBwYXJ0IDEwIFJHQiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihYMjY0Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gWDI2NF9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IFgyNjRfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gWDI2NF9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfREVMQVkgfCBDT0RFQ19DQVBfQVVUT19USFJFQURTLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZyZ2JjbGFzcywKKyAgICAuZGVmYXVsdHMgICAgICAgPSB4MjY0X2RlZmF1bHRzLAorICAgIC5waXhfZm10cyAgICAgICA9IHBpeF9mbXRzXzhiaXRfcmdiLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYngyNjUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYngyNjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjNjNzUwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlieDI2NS5jCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogbGlieDI2NSBlbmNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgRGVyZWsgQnVpdGVuaHVpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgWDI2NV9BUElfSU1QT1JUUyAxCisjZW5kaWYKKworI2luY2x1ZGUgPHgyNjUuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgbGlieDI2NUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgeDI2NV9lbmNvZGVyICplbmNvZGVyOworICAgIHgyNjVfcGFyYW0gICAqcGFyYW1zOworCisgICAgY2hhciAqcHJlc2V0OworICAgIGNoYXIgKnR1bmU7CisgICAgY2hhciAqeDI2NV9vcHRzOworfSBsaWJ4MjY1Q29udGV4dDsKKworc3RhdGljIGludCBpc19rZXlmcmFtZShOYWxVbml0VHlwZSBuYWx0eXBlKQoreworICAgIHN3aXRjaCAobmFsdHlwZSkgeworICAgIGNhc2UgTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBX1dfTFA6CisgICAgY2FzZSBOQUxfVU5JVF9DT0RFRF9TTElDRV9CTEFfV19SQURMOgorICAgIGNhc2UgTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBX05fTFA6CisgICAgY2FzZSBOQUxfVU5JVF9DT0RFRF9TTElDRV9JRFJfV19SQURMOgorICAgIGNhc2UgTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSX05fTFA6CisgICAgY2FzZSBOQUxfVU5JVF9DT0RFRF9TTElDRV9DUkE6CisgICAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYngyNjVfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBsaWJ4MjY1Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisKKyAgICB4MjY1X3BhcmFtX2ZyZWUoY3R4LT5wYXJhbXMpOworCisgICAgaWYgKGN0eC0+ZW5jb2RlcikKKyAgICAgICAgeDI2NV9lbmNvZGVyX2Nsb3NlKGN0eC0+ZW5jb2Rlcik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYngyNjVfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGxpYngyNjVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHgyNjVfbmFsICpuYWw7CisgICAgY2hhciBzYXJbMTJdOworICAgIGludCBzYXJfbnVtLCBzYXJfZGVuOworICAgIGludCBubmFsOworCisgICAgaWYgKGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCAmJgorICAgICAgICAhYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCktPmxvZzJfY2hyb21hX3cpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiNDoyOjIgYW5kIDQ6NDo0IHN1cHBvcnQgaXMgbm90IGZ1bGx5IGRlZmluZWQgZm9yIEhFVkMgeWV0LiAiCisgICAgICAgICAgICAgICAiU2V0IC1zdHJpY3QgZXhwZXJpbWVudGFsIHRvIGVuY29kZSBhbnl3YXkuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgY3R4LT5wYXJhbXMgPSB4MjY1X3BhcmFtX2FsbG9jKCk7CisgICAgaWYgKCFjdHgtPnBhcmFtcykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSB4MjY1IHBhcmFtIHN0cnVjdHVyZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmICh4MjY1X3BhcmFtX2RlZmF1bHRfcHJlc2V0KGN0eC0+cGFyYW1zLCBjdHgtPnByZXNldCwgY3R4LT50dW5lKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHByZXNldCBvciB0dW5lLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgY3R4LT5wYXJhbXMtPmZyYW1lTnVtVGhyZWFkcyA9IGF2Y3R4LT50aHJlYWRfY291bnQ7CisgICAgY3R4LT5wYXJhbXMtPmZwc051bSAgICAgICAgICA9IGF2Y3R4LT50aW1lX2Jhc2UuZGVuOworICAgIGN0eC0+cGFyYW1zLT5mcHNEZW5vbSAgICAgICAgPSBhdmN0eC0+dGltZV9iYXNlLm51bSAqIGF2Y3R4LT50aWNrc19wZXJfZnJhbWU7CisgICAgY3R4LT5wYXJhbXMtPnNvdXJjZVdpZHRoICAgICA9IGF2Y3R4LT53aWR0aDsKKyAgICBjdHgtPnBhcmFtcy0+c291cmNlSGVpZ2h0ICAgID0gYXZjdHgtPmhlaWdodDsKKyAgICBjdHgtPnBhcmFtcy0+YkVuYWJsZVBzbnIgICAgID0gISEoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19QU05SKTsKKworICAgIGlmIChhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPiAwICYmIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA+IDApIHsKKyAgICAgICAgYXZfcmVkdWNlKCZzYXJfbnVtLCAmc2FyX2RlbiwKKyAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwgNjU1MzUpOworICAgICAgICBzbnByaW50ZihzYXIsIHNpemVvZihzYXIpLCAiJWQ6JWQiLCBzYXJfbnVtLCBzYXJfZGVuKTsKKyAgICAgICAgaWYgKHgyNjVfcGFyYW1fcGFyc2UoY3R4LT5wYXJhbXMsICJzYXIiLCBzYXIpID09IFgyNjVfUEFSQU1fQkFEX1ZBTFVFKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgU0FSOiAlZDolZC5cbiIsIHNhcl9udW0sIHNhcl9kZW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5waXhfZm10KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMDoKKyAgICAgICAgY3R4LT5wYXJhbXMtPmludGVybmFsQ3NwID0gWDI2NV9DU1BfSTQyMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDoKKyAgICAgICAgY3R4LT5wYXJhbXMtPmludGVybmFsQ3NwID0gWDI2NV9DU1BfSTQyMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDoKKyAgICAgICAgY3R4LT5wYXJhbXMtPmludGVybmFsQ3NwID0gWDI2NV9DU1BfSTQ0NDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA+IDApIHsKKyAgICAgICAgY3R4LT5wYXJhbXMtPnJjLmJpdHJhdGUgICAgICAgICA9IGF2Y3R4LT5iaXRfcmF0ZSAvIDEwMDA7CisgICAgICAgIGN0eC0+cGFyYW1zLT5yYy5yYXRlQ29udHJvbE1vZGUgPSBYMjY1X1JDX0FCUjsKKyAgICB9CisKKyAgICBpZiAoIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpKQorICAgICAgICBjdHgtPnBhcmFtcy0+YlJlcGVhdEhlYWRlcnMgPSAxOworCisgICAgaWYgKGN0eC0+eDI2NV9vcHRzKSB7CisgICAgICAgIEFWRGljdGlvbmFyeSAqZGljdCAgICA9IE5VTEw7CisgICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICplbiA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFhdl9kaWN0X3BhcnNlX3N0cmluZygmZGljdCwgY3R4LT54MjY1X29wdHMsICI9IiwgIjoiLCAwKSkgeworICAgICAgICAgICAgd2hpbGUgKChlbiA9IGF2X2RpY3RfZ2V0KGRpY3QsICIiLCBlbiwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgcGFyc2VfcmV0ID0geDI2NV9wYXJhbV9wYXJzZShjdHgtPnBhcmFtcywgZW4tPmtleSwgZW4tPnZhbHVlKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyc2VfcmV0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBYMjY1X1BBUkFNX0JBRF9OQU1FOgorICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBvcHRpb246ICVzLlxuIiwgZW4tPmtleSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgWDI2NV9QQVJBTV9CQURfVkFMVUU6CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciAlczogJXMuXG4iLCBlbi0+a2V5LCBlbi0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJmRpY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgY3R4LT5lbmNvZGVyID0geDI2NV9lbmNvZGVyX29wZW4oY3R4LT5wYXJhbXMpOworICAgIGlmICghY3R4LT5lbmNvZGVyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IG9wZW4gbGlieDI2NSBlbmNvZGVyLlxuIik7CisgICAgICAgIGxpYngyNjVfZW5jb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikgeworICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSB4MjY1X2VuY29kZXJfaGVhZGVycyhjdHgtPmVuY29kZXIsICZuYWwsICZubmFsKTsKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBlbmNvZGUgaGVhZGVycy5cbiIpOworICAgICAgICAgICAgbGlieDI2NV9lbmNvZGVfY2xvc2UoYXZjdHgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDYW5ub3QgYWxsb2NhdGUgSEVWQyBoZWFkZXIgb2Ygc2l6ZSAlZC5cbiIsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBsaWJ4MjY1X2VuY29kZV9jbG9zZShhdmN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KGF2Y3R4LT5leHRyYWRhdGEsIG5hbFswXS5wYXlsb2FkLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpYngyNjVfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgbGlieDI2NUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgeDI2NV9waWN0dXJlIHgyNjVwaWM7CisgICAgeDI2NV9waWN0dXJlIHgyNjVwaWNfb3V0ID0geyB7IDAgfSB9OworICAgIHgyNjVfbmFsICpuYWw7CisgICAgdWludDhfdCAqZHN0OworICAgIGludCBwYXlsb2FkID0gMDsKKyAgICBpbnQgbm5hbDsKKyAgICBpbnQgcmV0OworICAgIGludCBpOworCisgICAgeDI2NV9waWN0dXJlX2luaXQoY3R4LT5wYXJhbXMsICZ4MjY1cGljKTsKKworICAgIGlmIChwaWMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICB4MjY1cGljLnBsYW5lc1tpXSA9IHBpYy0+ZGF0YVtpXTsKKyAgICAgICAgICAgeDI2NXBpYy5zdHJpZGVbaV0gPSBwaWMtPmxpbmVzaXplW2ldOworICAgICAgICB9CisKKyAgICAgICAgeDI2NXBpYy5wdHMgICAgICA9IHBpYy0+cHRzOworICAgICAgICB4MjY1cGljLmJpdERlcHRoID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCktPmNvbXBbMF0uZGVwdGhfbWludXMxICsgMTsKKyAgICB9CisKKyAgICByZXQgPSB4MjY1X2VuY29kZXJfZW5jb2RlKGN0eC0+ZW5jb2RlciwgJm5hbCwgJm5uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMgPyAmeDI2NXBpYyA6IE5VTEwsICZ4MjY1cGljX291dCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworCisgICAgaWYgKCFubmFsKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBubmFsOyBpKyspCisgICAgICAgIHBheWxvYWQgKz0gbmFsW2ldLnNpemVCeXRlczsKKworICAgIHJldCA9IGZmX2FsbG9jX3BhY2tldChwa3QsIHBheWxvYWQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZ2V0dGluZyBvdXRwdXQgcGFja2V0LlxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGRzdCA9IHBrdC0+ZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBubmFsOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgbmFsW2ldLnBheWxvYWQsIG5hbFtpXS5zaXplQnl0ZXMpOworICAgICAgICBkc3QgKz0gbmFsW2ldLnNpemVCeXRlczsKKworICAgICAgICBpZiAoaXNfa2V5ZnJhbWUobmFsW2ldLnR5cGUpKQorICAgICAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgfQorCisgICAgcGt0LT5wdHMgPSB4MjY1cGljX291dC5wdHM7CisgICAgcGt0LT5kdHMgPSB4MjY1cGljX291dC5kdHM7CisKKyAgICAqZ290X3BhY2tldCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgeDI2NV9jc3BfZWlnaHRbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgeDI2NV9jc3BfdHdlbHZlW10gPSB7CisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgYXZfY29sZCB2b2lkIGxpYngyNjVfZW5jb2RlX2luaXRfY3NwKEFWQ29kZWMgKmNvZGVjKQoreworICAgIGlmICh4MjY1X21heF9iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgY29kZWMtPnBpeF9mbXRzID0geDI2NV9jc3BfZWlnaHQ7CisgICAgZWxzZSBpZiAoeDI2NV9tYXhfYml0X2RlcHRoID09IDEyKQorICAgICAgICBjb2RlYy0+cGl4X2ZtdHMgPSB4MjY1X2NzcF90d2VsdmU7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKGxpYngyNjVDb250ZXh0LCB4KQorI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInByZXNldCIsICAgICAgInNldCB0aGUgeDI2NSBwcmVzZXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChwcmVzZXQpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgMCB9LCAwLCAwLCBWRSB9LAorICAgIHsgInR1bmUiLCAgICAgICAgInNldCB0aGUgeDI2NSB0dW5lIHBhcmFtZXRlciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVCh0dW5lKSwgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgMCB9LCAwLCAwLCBWRSB9LAorICAgIHsgIngyNjUtcGFyYW1zIiwgInNldCB0aGUgeDI2NSBjb25maWd1cmF0aW9uIHVzaW5nIGEgOi1zZXBhcmF0ZWQgbGlzdCBvZiBrZXk9dmFsdWUgcGFyYW1ldGVycyIsIE9GRlNFVCh4MjY1X29wdHMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgMCB9LCAwLCAwLCBWRSB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBjbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJsaWJ4MjY1IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjRGVmYXVsdCB4MjY1X2RlZmF1bHRzW10gPSB7CisgICAgeyAiYiIsICIwIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKworQVZDb2RlYyBmZl9saWJ4MjY1X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAibGlieDI2NSIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGlieDI2NSBILjI2NSAvIEhFVkMiKSwKKyAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0hFVkMsCisgICAgLmluaXQgICAgICAgICAgICAgPSBsaWJ4MjY1X2VuY29kZV9pbml0LAorICAgIC5pbml0X3N0YXRpY19kYXRhID0gbGlieDI2NV9lbmNvZGVfaW5pdF9jc3AsCisgICAgLmVuY29kZTIgICAgICAgICAgPSBsaWJ4MjY1X2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IGxpYngyNjVfZW5jb2RlX2Nsb3NlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgID0gc2l6ZW9mKGxpYngyNjVDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgICA9ICZjbGFzcywKKyAgICAuZGVmYXVsdHMgICAgICAgICA9IHgyNjVfZGVmYXVsdHMsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBDT0RFQ19DQVBfREVMQVkgfCBDT0RFQ19DQVBfQVVUT19USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnhhdnMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnhhdnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDg2YjYxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlieGF2cy5jCkBAIC0wLDAgKzEsNDM2IEBACisvKgorICogQVZTIGVuY29kaW5nIHVzaW5nIHRoZSB4YXZzIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMjAxMCBBbWFuZGEsIFkuTi4gV3UgPGFtYW5kYTExMTkyMDAzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8eGF2cy5oPgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNkZWZpbmUgRU5EX09GX1NUUkVBTSAweDAwMQorCisjZGVmaW5lIFhBVlNfUEFSVF9JOFg4IDB4MDAyIC8qIEFuYWx5emUgaTh4OCAocmVxdWlyZXMgOHg4IHRyYW5zZm9ybSkgKi8KKyNkZWZpbmUgWEFWU19QQVJUX1A4WDggMHgwMTAgLyogQW5hbHl6ZSBwMTZ4OCwgcDh4MTYgYW5kIHA4eDggKi8KKyNkZWZpbmUgWEFWU19QQVJUX0I4WDggMHgxMDAgLyogQW5hbHl6ZSBiMTZ4OCwgYiovCisKK3R5cGVkZWYgc3RydWN0IFhhdnNDb250ZXh0IHsKKyAgICBBVkNsYXNzICAgICAgICAqY2xhc3M7CisgICAgeGF2c19wYXJhbV90ICAgIHBhcmFtczsKKyAgICB4YXZzX3QgICAgICAgICAqZW5jOworICAgIHhhdnNfcGljdHVyZV90ICBwaWM7CisgICAgdWludDhfdCAgICAgICAgKnNlaTsKKyAgICBpbnQgICAgICAgICAgICAgc2VpX3NpemU7CisgICAgaW50ICAgICAgICAgICAgIGVuZF9vZl9zdHJlYW07CisgICAgZmxvYXQgY3JmOworICAgIGludCBjcXA7CisgICAgaW50IGJfYmlhczsKKyAgICBmbG9hdCBjcGx4Ymx1cjsKKyAgICBpbnQgZGlyZWN0X3ByZWQ7CisgICAgaW50IGF1ZDsKKyAgICBpbnQgZmFzdF9wc2tpcDsKKyAgICBpbnQgbWJ0cmVlOworICAgIGludCBtaXhlZF9yZWZzOworCisgICAgaW50NjRfdCAqcHRzX2J1ZmZlcjsKKyAgICBpbnQgb3V0X2ZyYW1lX2NvdW50OworfSBYYXZzQ29udGV4dDsKKworc3RhdGljIHZvaWQgWEFWU19sb2codm9pZCAqcCwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IGxldmVsX21hcFtdID0geworICAgICAgICBbWEFWU19MT0dfRVJST1JdICAgPSBBVl9MT0dfRVJST1IsCisgICAgICAgIFtYQVZTX0xPR19XQVJOSU5HXSA9IEFWX0xPR19XQVJOSU5HLAorICAgICAgICBbWEFWU19MT0dfSU5GT10gICAgPSBBVl9MT0dfSU5GTywKKyAgICAgICAgW1hBVlNfTE9HX0RFQlVHXSAgID0gQVZfTE9HX0RFQlVHCisgICAgfTsKKworICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiBYQVZTX0xPR19ERUJVRykKKyAgICAgICAgcmV0dXJuOworCisgICAgYXZfdmxvZyhwLCBsZXZlbF9tYXBbbGV2ZWxdLCBmbXQsIGFyZ3MpOworfQorCitzdGF0aWMgaW50IGVuY29kZV9uYWxzKEFWQ29kZWNDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgIHhhdnNfbmFsX3QgKm5hbHMsIGludCBubmFsKQoreworICAgIFhhdnNDb250ZXh0ICp4NCA9IGN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IGksIHMsIHJldCwgc2l6ZSA9IHg0LT5zZWlfc2l6ZSArIEZGX01JTl9CVUZGRVJfU0laRTsKKworICAgIGlmICghbm5hbCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbm5hbDsgaSsrKQorICAgICAgICBzaXplICs9IG5hbHNbaV0uaV9wYXlsb2FkOworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGN0eCwgcGt0LCBzaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHAgPSBwa3QtPmRhdGE7CisKKyAgICAvKiBXcml0ZSB0aGUgU0VJIGFzIHBhcnQgb2YgdGhlIGZpcnN0IGZyYW1lLiAqLworICAgIGlmICh4NC0+c2VpX3NpemUgPiAwICYmIG5uYWwgPiAwKSB7CisgICAgICAgIG1lbWNweShwLCB4NC0+c2VpLCB4NC0+c2VpX3NpemUpOworICAgICAgICBwICs9IHg0LT5zZWlfc2l6ZTsKKyAgICAgICAgeDQtPnNlaV9zaXplID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbm5hbDsgaSsrKSB7CisgICAgICAgIHMgPSB4YXZzX25hbF9lbmNvZGUocCwgJnNpemUsIDEsIG5hbHMgKyBpKTsKKyAgICAgICAgaWYgKHMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBwICs9IHM7CisgICAgfQorICAgIHBrdC0+c2l6ZSA9IHAgLSBwa3QtPmRhdGE7CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBYQVZTX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIFhhdnNDb250ZXh0ICp4NCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgeGF2c19uYWxfdCAqbmFsOworICAgIGludCBubmFsLCBpLCByZXQ7CisgICAgeGF2c19waWN0dXJlX3QgcGljX291dDsKKworICAgIHg0LT5waWMuaW1nLmlfY3NwICAgPSBYQVZTX0NTUF9JNDIwOworICAgIHg0LT5waWMuaW1nLmlfcGxhbmUgPSAzOworCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgeDQtPnBpYy5pbWcucGxhbmVbaV0gPSBmcmFtZS0+ZGF0YVtpXTsKKyAgICAgICAgICAgIHg0LT5waWMuaW1nLmlfc3RyaWRlW2ldID0gZnJhbWUtPmxpbmVzaXplW2ldOworICAgICAgIH0KKworICAgICAgICB4NC0+cGljLmlfcHRzICA9IGZyYW1lLT5wdHM7CisgICAgICAgIHg0LT5waWMuaV90eXBlID0gWEFWU19UWVBFX0FVVE87CisgICAgICAgIHg0LT5wdHNfYnVmZmVyW2F2Y3R4LT5mcmFtZV9udW1iZXIgJSAoYXZjdHgtPm1heF9iX2ZyYW1lcysxKV0gPSBmcmFtZS0+cHRzOworICAgIH0KKworICAgIGlmICh4YXZzX2VuY29kZXJfZW5jb2RlKHg0LT5lbmMsICZuYWwsICZubmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lPyAmeDQtPnBpYzogTlVMTCwgJnBpY19vdXQpIDwgMCkKKyAgICByZXR1cm4gLTE7CisKKyAgICByZXQgPSBlbmNvZGVfbmFscyhhdmN0eCwgcGt0LCBuYWwsIG5uYWwpOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICghcmV0KSB7CisgICAgICAgIGlmICghZnJhbWUgJiYgISh4NC0+ZW5kX29mX3N0cmVhbSkpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCA0KSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIHBrdC0+ZGF0YVswXSA9IDB4MDsKKyAgICAgICAgICAgIHBrdC0+ZGF0YVsxXSA9IDB4MDsKKyAgICAgICAgICAgIHBrdC0+ZGF0YVsyXSA9IDB4MDE7CisgICAgICAgICAgICBwa3QtPmRhdGFbM10gPSAweGIxOworICAgICAgICAgICAgcGt0LT5kdHMgPSAyKng0LT5wdHNfYnVmZmVyWyh4NC0+b3V0X2ZyYW1lX2NvdW50LTEpJShhdmN0eC0+bWF4X2JfZnJhbWVzKzEpXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgeDQtPnB0c19idWZmZXJbKHg0LT5vdXRfZnJhbWVfY291bnQtMiklKGF2Y3R4LT5tYXhfYl9mcmFtZXMrMSldOworICAgICAgICAgICAgeDQtPmVuZF9vZl9zdHJlYW0gPSBFTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgKmdvdF9wYWNrZXQgPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cHRzID0gcGljX291dC5pX3B0czsKKyAgICBwa3QtPnB0cyA9IHBpY19vdXQuaV9wdHM7CisgICAgaWYgKGF2Y3R4LT5oYXNfYl9mcmFtZXMpIHsKKyAgICAgICAgaWYgKCF4NC0+b3V0X2ZyYW1lX2NvdW50KQorICAgICAgICAgICAgcGt0LT5kdHMgPSBwa3QtPnB0cyAtICh4NC0+cHRzX2J1ZmZlclsxXSAtIHg0LT5wdHNfYnVmZmVyWzBdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGt0LT5kdHMgPSB4NC0+cHRzX2J1ZmZlclsoeDQtPm91dF9mcmFtZV9jb3VudC0xKSUoYXZjdHgtPm1heF9iX2ZyYW1lcysxKV07CisgICAgfSBlbHNlCisgICAgICAgIHBrdC0+ZHRzID0gcGt0LT5wdHM7CisKKyAgICBzd2l0Y2ggKHBpY19vdXQuaV90eXBlKSB7CisgICAgY2FzZSBYQVZTX1RZUEVfSURSOgorICAgIGNhc2UgWEFWU19UWVBFX0k6CisgICAgICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWEFWU19UWVBFX1A6CisgICAgICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWEFWU19UWVBFX0I6CisgICAgY2FzZSBYQVZTX1RZUEVfQlJFRjoKKyAgICAgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfQjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogVGhlcmUgaXMgbm8gSURSIGZyYW1lIGluIEFWUyBKaVpodW4gKi8KKyAgICAvKiBTZXF1ZW5jZSBoZWFkZXIgaXMgdXNlZCBhcyBhIGZsYWcgKi8KKyAgICBpZiAocGljX291dC5pX3R5cGUgPT0gWEFWU19UWVBFX0kpIHsKKyAgICAgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWUgPSAxOworICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnF1YWxpdHkgPSAocGljX291dC5pX3FwcGx1czEgLSAxKSAqIEZGX1FQMkxBTUJEQTsKKworICAgIHg0LT5vdXRfZnJhbWVfY291bnQrKzsKKyAgICAqZ290X3BhY2tldCA9IHJldDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IFhBVlNfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFhhdnNDb250ZXh0ICp4NCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmV4dHJhZGF0YSk7CisgICAgYXZfZnJlZXAoJng0LT5zZWkpOworICAgIGF2X2ZyZWVwKCZ4NC0+cHRzX2J1ZmZlcik7CisKKyAgICBpZiAoeDQtPmVuYykKKyAgICAgICAgeGF2c19lbmNvZGVyX2Nsb3NlKHg0LT5lbmMpOworCisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgWEFWU19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBYYXZzQ29udGV4dCAqeDQgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgeDQtPnNlaV9zaXplID0gMDsKKyAgICB4YXZzX3BhcmFtX2RlZmF1bHQoJng0LT5wYXJhbXMpOworCisgICAgeDQtPnBhcmFtcy5wZl9sb2cgICAgICAgICAgICAgICA9IFhBVlNfbG9nOworICAgIHg0LT5wYXJhbXMucF9sb2dfcHJpdmF0ZSAgICAgICAgPSBhdmN0eDsKKyAgICB4NC0+cGFyYW1zLmlfa2V5aW50X21heCAgICAgICAgID0gYXZjdHgtPmdvcF9zaXplOworICAgIGlmIChhdmN0eC0+Yml0X3JhdGUpIHsKKyAgICAgICAgeDQtPnBhcmFtcy5yYy5pX2JpdHJhdGUgICA9IGF2Y3R4LT5iaXRfcmF0ZSAvIDEwMDA7CisgICAgICAgIHg0LT5wYXJhbXMucmMuaV9yY19tZXRob2QgPSBYQVZTX1JDX0FCUjsKKyAgICB9CisgICAgeDQtPnBhcmFtcy5yYy5pX3Zidl9idWZmZXJfc2l6ZSA9IGF2Y3R4LT5yY19idWZmZXJfc2l6ZSAvIDEwMDA7CisgICAgeDQtPnBhcmFtcy5yYy5pX3Zidl9tYXhfYml0cmF0ZSA9IGF2Y3R4LT5yY19tYXhfcmF0ZSAgICAvIDEwMDA7CisgICAgeDQtPnBhcmFtcy5yYy5iX3N0YXRfd3JpdGUgICAgICA9IGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzE7CisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzIpIHsKKyAgICAgICAgeDQtPnBhcmFtcy5yYy5iX3N0YXRfcmVhZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHg0LT5jcmYgPj0gMCkgeworICAgICAgICAgICAgeDQtPnBhcmFtcy5yYy5pX3JjX21ldGhvZCAgID0gWEFWU19SQ19DUkY7CisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmZfcmZfY29uc3RhbnQgPSB4NC0+Y3JmOworICAgICAgICB9IGVsc2UgaWYgKHg0LT5jcXAgPj0gMCkgeworICAgICAgICAgICAgeDQtPnBhcmFtcy5yYy5pX3JjX21ldGhvZCAgID0gWEFWU19SQ19DUVA7CisgICAgICAgICAgICB4NC0+cGFyYW1zLnJjLmlfcXBfY29uc3RhbnQgPSB4NC0+Y3FwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHg0LT5hdWQgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5iX2F1ZCAgICAgICAgICAgICAgICAgICAgICA9IHg0LT5hdWQ7CisgICAgaWYgKHg0LT5tYnRyZWUgPj0gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5yYy5iX21iX3RyZWUgICAgICAgICAgICAgICA9IHg0LT5tYnRyZWU7CisgICAgaWYgKHg0LT5kaXJlY3RfcHJlZCA+PSAwKQorICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9kaXJlY3RfbXZfcHJlZCAgID0geDQtPmRpcmVjdF9wcmVkOworICAgIGlmICh4NC0+ZmFzdF9wc2tpcCA+PSAwKQorICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuYl9mYXN0X3Bza2lwICAgICAgID0geDQtPmZhc3RfcHNraXA7CisgICAgaWYgKHg0LT5taXhlZF9yZWZzID49IDApCisgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5iX21peGVkX3JlZmVyZW5jZXMgPSB4NC0+bWl4ZWRfcmVmczsKKyAgICBpZiAoeDQtPmJfYmlhcyAhPSBJTlRfTUlOKQorICAgICAgICB4NC0+cGFyYW1zLmlfYmZyYW1lX2JpYXMgICAgICAgICAgICAgID0geDQtPmJfYmlhczsKKyAgICBpZiAoeDQtPmNwbHhibHVyID49IDApCisgICAgICAgIHg0LT5wYXJhbXMucmMuZl9jb21wbGV4aXR5X2JsdXIgPSB4NC0+Y3BseGJsdXI7CisKKyAgICB4NC0+cGFyYW1zLmlfYmZyYW1lICAgICAgICAgID0gYXZjdHgtPm1heF9iX2ZyYW1lczsKKyAgICAvKiBjYWJhYyBpcyBub3QgaW5jbHVkZWQgaW4gQVZTIEppWmh1biBQcm9maWxlICovCisgICAgeDQtPnBhcmFtcy5iX2NhYmFjICAgICAgICAgICA9IDA7CisKKyAgICB4NC0+cGFyYW1zLmlfYmZyYW1lX2FkYXB0aXZlID0gYXZjdHgtPmJfZnJhbWVfc3RyYXRlZ3k7CisKKyAgICBhdmN0eC0+aGFzX2JfZnJhbWVzICAgICAgICAgID0gISFhdmN0eC0+bWF4X2JfZnJhbWVzOworCisgICAgLyogQVZTIGRvZXNuJ3QgYWxsb3cgQiBwaWN0dXJlIGFzIHJlZmVyZW5jZSAqLworICAgIC8qIFRoZSBtYXggYWxsb3dlZCByZWZlcmVuY2UgZnJhbWUgbnVtYmVyIG9mIEIgaXMgMiAqLworICAgIHg0LT5wYXJhbXMuaV9rZXlpbnRfbWluICAgICAgPSBhdmN0eC0+a2V5aW50X21pbjsKKyAgICBpZiAoeDQtPnBhcmFtcy5pX2tleWludF9taW4gPiB4NC0+cGFyYW1zLmlfa2V5aW50X21heCkKKyAgICAgICAgeDQtPnBhcmFtcy5pX2tleWludF9taW4gPSB4NC0+cGFyYW1zLmlfa2V5aW50X21heDsKKworICAgIHg0LT5wYXJhbXMuaV9zY2VuZWN1dF90aHJlc2hvbGQgICAgICAgID0gYXZjdHgtPnNjZW5lY2hhbmdlX3RocmVzaG9sZDsKKworICAgLy8geDQtPnBhcmFtcy5iX2RlYmxvY2tpbmdfZmlsdGVyICAgICAgID0gYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19MT09QX0ZJTFRFUjsKKworICAgIHg0LT5wYXJhbXMucmMuaV9xcF9taW4gICAgICAgICAgICAgICAgID0gYXZjdHgtPnFtaW47CisgICAgeDQtPnBhcmFtcy5yYy5pX3FwX21heCAgICAgICAgICAgICAgICAgPSBhdmN0eC0+cW1heDsKKyAgICB4NC0+cGFyYW1zLnJjLmlfcXBfc3RlcCAgICAgICAgICAgICAgICA9IGF2Y3R4LT5tYXhfcWRpZmY7CisKKyAgICB4NC0+cGFyYW1zLnJjLmZfcWNvbXByZXNzICAgICAgID0gYXZjdHgtPnFjb21wcmVzczsgLyogMC4wID0+IGNiciwgMS4wID0+IGNvbnN0YW50IHFwICovCisgICAgeDQtPnBhcmFtcy5yYy5mX3FibHVyICAgICAgICAgICA9IGF2Y3R4LT5xYmx1cjsgICAgIC8qIHRlbXBvcmFsbHkgYmx1ciBxdWFudHMgKi8KKworICAgIHg0LT5wYXJhbXMuaV9mcmFtZV9yZWZlcmVuY2UgICAgPSBhdmN0eC0+cmVmczsKKworICAgIHg0LT5wYXJhbXMuaV93aWR0aCAgICAgICAgICAgICAgPSBhdmN0eC0+d2lkdGg7CisgICAgeDQtPnBhcmFtcy5pX2hlaWdodCAgICAgICAgICAgICA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgeDQtPnBhcmFtcy52dWkuaV9zYXJfd2lkdGggICAgICA9IGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bTsKKyAgICB4NC0+cGFyYW1zLnZ1aS5pX3Nhcl9oZWlnaHQgICAgID0gYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuOworICAgIC8qIFRoaXMgaXMgb25seSB1c2VkIGZvciBjb3VudGluZyB0aGUgZnBzICovCisgICAgeDQtPnBhcmFtcy5pX2Zwc19udW0gICAgICAgICAgICA9IGF2Y3R4LT50aW1lX2Jhc2UuZGVuOworICAgIHg0LT5wYXJhbXMuaV9mcHNfZGVuICAgICAgICAgICAgPSBhdmN0eC0+dGltZV9iYXNlLm51bTsKKyAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaW50ZXIgICAgICAgID0gWEFWU19BTkFMWVNFX0k4eDggfFhBVlNfQU5BTFlTRV9QU1VCMTZ4MTZ8IFhBVlNfQU5BTFlTRV9CU1VCMTZ4MTY7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5tZV9tZXRob2QpIHsKKyAgICAgICAgIGNhc2UgIE1FX0VQWlM6CisgICAgICAgICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9tZV9tZXRob2QgPSBYQVZTX01FX0RJQTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSAgTUVfSEVYOgorICAgICAgICAgICAgICAgeDQtPnBhcmFtcy5hbmFseXNlLmlfbWVfbWV0aG9kID0gWEFWU19NRV9IRVg7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgIE1FX1VNSDoKKyAgICAgICAgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5pX21lX21ldGhvZCA9IFhBVlNfTUVfVU1IOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlICBNRV9GVUxMOgorICAgICAgICAgICAgICAgeDQtPnBhcmFtcy5hbmFseXNlLmlfbWVfbWV0aG9kID0gWEFWU19NRV9FU0E7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgIE1FX1RFU0E6CisgICAgICAgICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9tZV9tZXRob2QgPSBYQVZTX01FX1RFU0E7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9tZV9tZXRob2QgPSBYQVZTX01FX0hFWDsKKyAgICB9CisKKyAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9tZV9yYW5nZSA9IGF2Y3R4LT5tZV9yYW5nZTsKKyAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9zdWJwZWxfcmVmaW5lICAgID0gYXZjdHgtPm1lX3N1YnBlbF9xdWFsaXR5OworCisgICAgeDQtPnBhcmFtcy5hbmFseXNlLmJfY2hyb21hX21lICAgICAgICA9IGF2Y3R4LT5tZV9jbXAgJiBGRl9DTVBfQ0hST01BOworICAgIC8qIEFWUyBQMiBvbmx5IGVuYWJsZXMgOHg4IHRyYW5zZm9ybSAqLworICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5iX3RyYW5zZm9ybV84eDggICAgPSAxOyAvL2F2Y3R4LT5mbGFnczIgJiBDT0RFQ19GTEFHMl84WDhEQ1Q7CisKKyAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV90cmVsbGlzICAgICAgICAgID0gYXZjdHgtPnRyZWxsaXM7CisgICAgeDQtPnBhcmFtcy5hbmFseXNlLmlfbm9pc2VfcmVkdWN0aW9uICA9IGF2Y3R4LT5ub2lzZV9yZWR1Y3Rpb247CisKKyAgICBpZiAoYXZjdHgtPmxldmVsID4gMCkKKyAgICAgICAgeDQtPnBhcmFtcy5pX2xldmVsX2lkYyA9IGF2Y3R4LT5sZXZlbDsKKworICAgIHg0LT5wYXJhbXMucmMuZl9yYXRlX3RvbGVyYW5jZSA9CisgICAgICAgIChmbG9hdClhdmN0eC0+Yml0X3JhdGVfdG9sZXJhbmNlL2F2Y3R4LT5iaXRfcmF0ZTsKKworICAgIGlmICgoYXZjdHgtPnJjX2J1ZmZlcl9zaXplKSAmJgorICAgICAgICAoYXZjdHgtPnJjX2luaXRpYWxfYnVmZmVyX29jY3VwYW5jeSA8PSBhdmN0eC0+cmNfYnVmZmVyX3NpemUpKSB7CisgICAgICAgIHg0LT5wYXJhbXMucmMuZl92YnZfYnVmZmVyX2luaXQgPQorICAgICAgICAgICAgKGZsb2F0KWF2Y3R4LT5yY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3kgLyBhdmN0eC0+cmNfYnVmZmVyX3NpemU7CisgICAgfSBlbHNlCisgICAgICAgIHg0LT5wYXJhbXMucmMuZl92YnZfYnVmZmVyX2luaXQgPSAwLjk7CisKKyAgICAvKiBUQUc6ZG8gd2UgaGF2ZSBNQiB0cmVlIFJDIG1ldGhvZCAqLworICAgIC8qIHdoYXQgaXMgdGhlIFJDIG1ldGhvZCB3ZSBhcmUgbm93IHVzaW5nPyBEZWZhdWx0IE5PICovCisgICAgeDQtPnBhcmFtcy5yYy5mX2lwX2ZhY3RvciAgICAgICAgICAgICA9IDEgLyBmYWJzKGF2Y3R4LT5pX3F1YW50X2ZhY3Rvcik7CisgICAgeDQtPnBhcmFtcy5yYy5mX3BiX2ZhY3RvciAgICAgICAgICAgICA9IGF2Y3R4LT5iX3F1YW50X2ZhY3RvcjsKKyAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9jaHJvbWFfcXBfb2Zmc2V0ID0gYXZjdHgtPmNocm9tYW9mZnNldDsKKworICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5iX3BzbnIgPSBhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1BTTlI7CisgICAgeDQtPnBhcmFtcy5pX2xvZ19sZXZlbCAgICA9IFhBVlNfTE9HX0RFQlVHOworICAgIHg0LT5wYXJhbXMuaV90aHJlYWRzICAgICAgPSBhdmN0eC0+dGhyZWFkX2NvdW50OworICAgIHg0LT5wYXJhbXMuYl9pbnRlcmxhY2VkICAgPSBhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0lOVEVSTEFDRURfRENUOworCisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikKKyAgICAgICAgeDQtPnBhcmFtcy5iX3JlcGVhdF9oZWFkZXJzID0gMDsKKworICAgIHg0LT5lbmMgPSB4YXZzX2VuY29kZXJfb3BlbigmeDQtPnBhcmFtcyk7CisgICAgaWYgKCF4NC0+ZW5jKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoISh4NC0+cHRzX2J1ZmZlciA9IGF2X21hbGxvY3pfYXJyYXkoKGF2Y3R4LT5tYXhfYl9mcmFtZXMrMSksIHNpemVvZigqeDQtPnB0c19idWZmZXIpKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogVEFHOiBEbyB3ZSBoYXZlIEdMT0JBTCBIRUFERVIgaW4gQVZTICovCisgICAgLyogV2UgSGF2ZSBQUFMgYW5kIFNQUyBpbiBBVlMgKi8KKyAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSB7CisgICAgICAgIHhhdnNfbmFsX3QgKm5hbDsKKyAgICAgICAgaW50IG5uYWwsIHMsIGksIHNpemU7CisgICAgICAgIHVpbnQ4X3QgKnA7CisKKyAgICAgICAgcyA9IHhhdnNfZW5jb2Rlcl9oZWFkZXJzKHg0LT5lbmMsICZuYWwsICZubmFsKTsKKworICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhID0gcCA9IGF2X21hbGxvYyhzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5uYWw7IGkrKykgeworICAgICAgICAgICAgLyogRG9uJ3QgcHV0IHRoZSBTRUkgaW4gZXh0cmFkYXRhLiAqLworICAgICAgICAgICAgaWYgKG5hbFtpXS5pX3R5cGUgPT0gTkFMX1NFSSkgeworICAgICAgICAgICAgICAgIHg0LT5zZWkgPSBhdl9tYWxsb2MoIDUgKyBuYWxbaV0uaV9wYXlsb2FkICogNCAvIDMgKTsKKyAgICAgICAgICAgICAgICBpZiAoeGF2c19uYWxfZW5jb2RlKHg0LT5zZWksICZ4NC0+c2VpX3NpemUsIDEsIG5hbCArIGkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplID0geGF2c19uYWxfZW5jb2RlKHAsICZzLCAxLCBuYWwgKyBpKTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBwICs9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gcCAtIGF2Y3R4LT5leHRyYWRhdGE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihYYXZzQ29udGV4dCwgeCkKKyNkZWZpbmUgVkUgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJjcmYiLCAgICAgICAgICAgIlNlbGVjdCB0aGUgcXVhbGl0eSBmb3IgY29uc3RhbnQgcXVhbGl0eSBtb2RlIiwgICAgT0ZGU0VUKGNyZiksICAgICAgICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgIHsuZGJsID0gLTEgfSwgLTEsIEZMVF9NQVgsIFZFIH0sCisgICAgeyAicXAiLCAgICAgICAgICAgICJDb25zdGFudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIHJhdGUgY29udHJvbCBtZXRob2QiLE9GRlNFVChjcXApLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IC0xIH0sIC0xLCBJTlRfTUFYLCBWRSB9LAorICAgIHsgImItYmlhcyIsICAgICAgICAiSW5mbHVlbmNlcyBob3cgb2Z0ZW4gQi1mcmFtZXMgYXJlIHVzZWQiLCAgICAgICAgICBPRkZTRVQoYl9iaWFzKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSBJTlRfTUlOfSwgSU5UX01JTiwgSU5UX01BWCwgVkUgfSwKKyAgICB7ICJjcGx4Ymx1ciIsICAgICAgIlJlZHVjZSBmbHVjdHVhdGlvbnMgaW4gUVAgKGJlZm9yZSBjdXJ2ZSBjb21wcmVzc2lvbikiLCBPRkZTRVQoY3BseGJsdXIpLCBBVl9PUFRfVFlQRV9GTE9BVCwgIHsuZGJsID0gLTEgfSwgLTEsIEZMVF9NQVgsIFZFfSwKKyAgICB7ICJkaXJlY3QtcHJlZCIsICAgIkRpcmVjdCBNViBwcmVkaWN0aW9uIG1vZGUiLCAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGRpcmVjdF9wcmVkKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsIFZFLCAiZGlyZWN0LXByZWQiIH0sCisgICAgeyAibm9uZSIsICAgICAgICAgIE5VTEwsICAgICAgMCwgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFhBVlNfRElSRUNUX1BSRURfTk9ORSB9LCAgICAgMCwgMCwgVkUsICJkaXJlY3QtcHJlZCIgfSwKKyAgICB7ICJzcGF0aWFsIiwgICAgICAgTlVMTCwgICAgICAwLCAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gWEFWU19ESVJFQ1RfUFJFRF9TUEFUSUFMIH0sICAwLCAwLCBWRSwgImRpcmVjdC1wcmVkIiB9LAorICAgIHsgInRlbXBvcmFsIiwgICAgICBOVUxMLCAgICAgIDAsICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBYQVZTX0RJUkVDVF9QUkVEX1RFTVBPUkFMIH0sIDAsIDAsIFZFLCAiZGlyZWN0LXByZWQiIH0sCisgICAgeyAiYXV0byIsICAgICAgICAgIE5VTEwsICAgICAgMCwgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFhBVlNfRElSRUNUX1BSRURfQVVUTyB9LCAgICAgMCwgMCwgVkUsICJkaXJlY3QtcHJlZCIgfSwKKyAgICB7ICJhdWQiLCAgICAgICAgICAgIlVzZSBhY2Nlc3MgdW5pdCBkZWxpbWl0ZXJzLiIsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGF1ZCksICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gLTEgfSwgLTEsIDEsIFZFfSwKKyAgICB7ICJtYnRyZWUiLCAgICAgICAgIlVzZSBtYWNyb2Jsb2NrIHRyZWUgcmF0ZWNvbnRyb2wuIiwgICAgICAgICAgICAgICAgT0ZGU0VUKG1idHJlZSksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gLTEgfSwgLTEsIDEsIFZFfSwKKyAgICB7ICJtaXhlZC1yZWZzIiwgICAgIk9uZSByZWZlcmVuY2UgcGVyIHBhcnRpdGlvbiwgYXMgb3Bwb3NlZCB0byBvbmUgcmVmZXJlbmNlIHBlciBtYWNyb2Jsb2NrIiwgT0ZGU0VUKG1peGVkX3JlZnMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgMSwgVkUgfSwKKyAgICB7ICJmYXN0LXBza2lwIiwgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGZhc3RfcHNraXApLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gLTEgfSwgLTEsIDEsIFZFfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHhhdnNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibGlieGF2cyIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgeGF2c19kZWZhdWx0c1tdID0geworICAgIHsgImIiLCAgICAgICAgICAgICAgICAiMCIgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK0FWQ29kZWMgZmZfbGlieGF2c19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJ4YXZzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGlieGF2cyBDaGluZXNlIEFWUyAoQXVkaW8gVmlkZW8gU3RhbmRhcmQpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0NBVlMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFhhdnNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBYQVZTX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gWEFWU19mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBYQVZTX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9ERUxBWSB8IENPREVDX0NBUF9BVVRPX1RIUkVBRFMsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJnhhdnNfY2xhc3MsCisgICAgLmRlZmF1bHRzICAgICAgID0geGF2c19kZWZhdWx0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJ4dmlkLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ4dmlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2ZDJmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnh2aWQuYwpAQCAtMCwwICsxLDg2MSBAQAorLyoKKyAqIEludGVyZmFjZSB0byB4dmlkY29yZSBmb3IgbXBlZzQgZW5jb2RpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwNCBBZGFtIFRoYXllciA8a3Jldm5pa0Bjb21jYXN0Lm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSW50ZXJmYWNlIHRvIHh2aWRjb3JlIGZvciBNUEVHLTQgY29tcGxpYW50IGVuY29kaW5nLgorICogQGF1dGhvciBBZGFtIFRoYXllciAoa3Jldm5pa0Bjb21jYXN0Lm5ldCkKKyAqLworCisjaW5jbHVkZSA8eHZpZC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9maWxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGlieHZpZC5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZiBIQVZFX0lPX0gKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKy8qKgorICogQnVmZmVyIG1hbmFnZW1lbnQgbWFjcm9zLgorICovCisjZGVmaW5lIEJVRkZFUl9TSVpFICAgICAgICAgMTAyNAorI2RlZmluZSBCVUZGRVJfUkVNQUlOSU5HKHgpIChCVUZGRVJfU0laRSAtIHN0cmxlbih4KSkKKyNkZWZpbmUgQlVGRkVSX0NBVCh4KSAgICAgICAoJigoeClbc3RybGVuKHgpXSkpCisKKy8qKgorICogU3RydWN0dXJlIGZvciB0aGUgcHJpdmF0ZSBYdmlkIGNvbnRleHQuCisgKiBUaGlzIHN0b3JlcyBhbGwgdGhlIHByaXZhdGUgY29udGV4dCBmb3IgdGhlIGNvZGVjLgorICovCitzdHJ1Y3QgeHZpZF9jb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICB2b2lkICplbmNvZGVyX2hhbmRsZTsgICAgICAgICAgLyoqPCBIYW5kbGUgZm9yIFh2aWQgZW5jb2RlciAqLworICAgIGludCB4c2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IEZyYW1lIHggc2l6ZSAqLworICAgIGludCB5c2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IEZyYW1lIHkgc2l6ZSAqLworICAgIGludCB2b3BfZmxhZ3M7ICAgICAgICAgICAgICAgICAvKio8IFZPUCBmbGFncyBmb3IgWHZpZCBlbmNvZGVyICovCisgICAgaW50IHZvbF9mbGFnczsgICAgICAgICAgICAgICAgIC8qKjwgVk9MIGZsYWdzIGZvciBYdmlkIGVuY29kZXIgKi8KKyAgICBpbnQgbWVfZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBNb3Rpb24gRXN0aW1hdGlvbiBmbGFncyAqLworICAgIGludCBxc2NhbGU7ICAgICAgICAgICAgICAgICAgICAvKio8IERvIHdlIHVzZSBjb25zdGFudCBzY2FsZT8gKi8KKyAgICBpbnQgcXVpY2t0aW1lX2Zvcm1hdDsgICAgICAgICAgLyoqPCBBcmUgd2UgaW4gYSBRVC1iYXNlZCBmb3JtYXQ/ICovCisgICAgY2hhciAqdHdvcGFzc2J1ZmZlcjsgICAgICAgICAgIC8qKjwgQ2hhcmFjdGVyIGJ1ZmZlciBmb3IgdHdvLXBhc3MgKi8KKyAgICBjaGFyICpvbGRfdHdvcGFzc2J1ZmZlcjsgICAgICAgLyoqPCBPbGQgY2hhcmFjdGVyIGJ1ZmZlciAodHdvLXBhc3MpICovCisgICAgY2hhciAqdHdvcGFzc2ZpbGU7ICAgICAgICAgICAgIC8qKjwgc2Vjb25kIHBhc3MgdGVtcCBmaWxlIG5hbWUgKi8KKyAgICBpbnQgdHdvcGFzc2ZkOworICAgIHVuc2lnbmVkIGNoYXIgKmludHJhX21hdHJpeDsgICAvKio8IFAtRnJhbWUgUXVhbnQgTWF0cml4ICovCisgICAgdW5zaWduZWQgY2hhciAqaW50ZXJfbWF0cml4OyAgIC8qKjwgSS1GcmFtZSBRdWFudCBNYXRyaXggKi8KKyAgICBpbnQgbHVtaV9hcTsgICAgICAgICAgICAgICAgICAgLyoqPCBMdW1pIG1hc2tpbmcgYXMgYW4gYXEgbWV0aG9kICovCisgICAgaW50IHZhcmlhbmNlX2FxOyAgICAgICAgICAgICAgIC8qKjwgVmFyaWFuY2UgYWRhcHRpdmUgcXVhbnRpemF0aW9uICovCisgICAgaW50IHNzaW07ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU1NJTSBpbmZvcm1hdGlvbiBkaXNwbGF5IG1vZGUgKi8KKyAgICBpbnQgc3NpbV9hY2M7ICAgICAgICAgICAgICAgICAgLyoqPCBTU0lNIGFjY3VyYWN5LiAwOiBhY2N1cmF0ZS4gNDogZmFzdC4gKi8KKyAgICBpbnQgZ21jOworfTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgZm9yIHRoZSBwcml2YXRlIGZpcnN0LXBhc3MgcGx1Z2luLgorICovCitzdHJ1Y3QgeHZpZF9mZl9wYXNzMSB7CisgICAgaW50IHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAvKio8IFh2aWQgdmVyc2lvbiAqLworICAgIHN0cnVjdCB4dmlkX2NvbnRleHQgKmNvbnRleHQ7ICAgLyoqPCBQb2ludGVyIHRvIHByaXZhdGUgY29udGV4dCAqLworfTsKKworc3RhdGljIGludCB4dmlkX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisvKgorICogWHZpZCAyLVBhc3MgS2x1ZGdlIFNlY3Rpb24KKyAqCisgKiBYdmlkJ3MgZGVmYXVsdCAyLXBhc3MgZG9lc24ndCBhbGxvdyB1cyB0byBjcmVhdGUgZGF0YSBhcyB3ZSBuZWVkIHRvLCBzbworICogdGhpcyBzZWN0aW9uIHNwZW5kcyB0aW1lIHJlcGxhY2luZyB0aGUgZmlyc3QgcGFzcyBwbHVnaW4gc28gd2UgY2FuIHdyaXRlCisgKiBzdGF0aXN0aWMgaW5mb3JtYXRpb24gYXMgbGliYXZjb2RlYyByZXF1ZXN0cyBpbi4gV2UgaGF2ZSBhbm90aGVyIGtsdWRnZQorICogdGhhdCBhbGxvd3MgdXMgdG8gcGFzcyBkYXRhIHRvIHRoZSBzZWNvbmQgcGFzcyBpbiBYdmlkIHdpdGhvdXQgYSBjdXN0b20KKyAqIHJhdGUtY29udHJvbCBwbHVnaW4uCisgKi8KKworLyoqCisgKiBJbml0aWFsaXplIHRoZSB0d28tcGFzcyBwbHVnaW4gYW5kIGNvbnRleHQuCisgKgorICogQHBhcmFtIHBhcmFtIElucHV0IGNvbnN0cnVjdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlCisgKiBAcGFyYW0gaGFuZGxlIFByaXZhdGUgY29udGV4dCBoYW5kbGUKKyAqIEByZXR1cm4gUmV0dXJucyBYVklEX0VSUl94eHh4IG9uIGZhaWx1cmUsIG9yIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCB4dmlkX2ZmXzJwYXNzX2NyZWF0ZSh4dmlkX3BsZ19jcmVhdGVfdCAqcGFyYW0sIHZvaWQgKipoYW5kbGUpCit7CisgICAgc3RydWN0IHh2aWRfZmZfcGFzczEgKnggPSAoc3RydWN0IHh2aWRfZmZfcGFzczEgKikgcGFyYW0tPnBhcmFtOworICAgIGNoYXIgKmxvZyA9IHgtPmNvbnRleHQtPnR3b3Bhc3NidWZmZXI7CisKKyAgICAvKiBEbyBhIHF1aWNrIGJvdW5kcyBjaGVjayAqLworICAgIGlmICghbG9nKQorICAgICAgICByZXR1cm4gWFZJRF9FUlJfRkFJTDsKKworICAgIC8qIFdlIHVzZSBzbnByaW50ZigpICovCisgICAgLyogVGhpcyBpcyBiZWNhdXNlIHdlIGNhbiBzYWZlbHkgcHJldmVudCBhIGJ1ZmZlciBvdmVyZmxvdyAqLworICAgIGxvZ1swXSA9IDA7CisgICAgc25wcmludGYobG9nLCBCVUZGRVJfUkVNQUlOSU5HKGxvZyksCisgICAgICAgICAgICAgIiMgZmZtcGVnIDItcGFzcyBsb2cgZmlsZSwgdXNpbmcgeHZpZCBjb2RlY1xuIik7CisgICAgc25wcmludGYoQlVGRkVSX0NBVChsb2cpLCBCVUZGRVJfUkVNQUlOSU5HKGxvZyksCisgICAgICAgICAgICAgIiMgRG8gbm90IG1vZGlmeS4gbGlieHZpZGNvcmUgdmVyc2lvbjogJWQuJWQuJWRcblxuIiwKKyAgICAgICAgICAgICBYVklEX1ZFUlNJT05fTUFKT1IoWFZJRF9WRVJTSU9OKSwKKyAgICAgICAgICAgICBYVklEX1ZFUlNJT05fTUlOT1IoWFZJRF9WRVJTSU9OKSwKKyAgICAgICAgICAgICBYVklEX1ZFUlNJT05fUEFUQ0goWFZJRF9WRVJTSU9OKSk7CisKKyAgICAqaGFuZGxlID0geC0+Y29udGV4dDsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZXN0cm95IHRoZSB0d28tcGFzcyBwbHVnaW4gY29udGV4dC4KKyAqCisgKiBAcGFyYW0gcmVmIENvbnRleHQgcG9pbnRlciBmb3IgdGhlIHBsdWdpbgorICogQHBhcmFtIHBhcmFtIERlc3Ryb295IGNvbnRleHQKKyAqIEByZXR1cm4gUmV0dXJucyAwLCBzdWNjZXNzIGd1YXJhbnRlZWQKKyAqLworc3RhdGljIGludCB4dmlkX2ZmXzJwYXNzX2Rlc3Ryb3koc3RydWN0IHh2aWRfY29udGV4dCAqcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHZpZF9wbGdfZGVzdHJveV90ICpwYXJhbSkKK3sKKyAgICAvKiBDdXJyZW50bHkgY2Fubm90IHRoaW5rIG9mIGFueXRoaW5nIHRvIGRvIG9uIGRlc3RydWN0aW9uICovCisgICAgLyogU3RpbGwsIHRoZSBmcmFtZXdvcmsgc2hvdWxkIGJlIGhlcmUgZm9yIHJlZmVyZW5jZS91c2UgKi8KKyAgICBpZiAocmVmLT50d29wYXNzYnVmZmVyKQorICAgICAgICByZWYtPnR3b3Bhc3NidWZmZXJbMF0gPSAwOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEVuYWJsZSBmYXN0IGVuY29kZSBtb2RlIGR1cmluZyB0aGUgZmlyc3QgcGFzcy4KKyAqCisgKiBAcGFyYW0gcmVmIENvbnRleHQgcG9pbnRlciBmb3IgdGhlIHBsdWdpbgorICogQHBhcmFtIHBhcmFtIEZyYW1lIGRhdGEKKyAqIEByZXR1cm4gUmV0dXJucyAwLCBzdWNjZXNzIGd1YXJhbnRlZWQKKyAqLworc3RhdGljIGludCB4dmlkX2ZmXzJwYXNzX2JlZm9yZShzdHJ1Y3QgeHZpZF9jb250ZXh0ICpyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh2aWRfcGxnX2RhdGFfdCAqcGFyYW0pCit7CisgICAgaW50IG1vdGlvbl9yZW1vdmU7CisgICAgaW50IG1vdGlvbl9yZXBsYWNlbWVudHM7CisgICAgaW50IHZvcF9yZW1vdmU7CisKKyAgICAvKiBOb3RoaW5nIHRvIGRvIGhlcmUsIHJlc3VsdCBpcyBjaGFuZ2VkIHRvbyBtdWNoICovCisgICAgaWYgKHBhcmFtLT56b25lICYmIHBhcmFtLT56b25lLT5tb2RlID09IFhWSURfWk9ORV9RVUFOVCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBXZSBjYW4gaW1wbGVtZW50IGEgJ3R1cmJvJyBmaXJzdCBwYXNzIG1vZGUgaGVyZSAqLworICAgIHBhcmFtLT5xdWFudCA9IDI7CisKKyAgICAvKiBJbml0IHZhbHVlcyAqLworICAgIG1vdGlvbl9yZW1vdmUgICAgICAgPSB+WFZJRF9NRV9DSFJPTUFfUFZPUCAmCisgICAgICAgICAgICAgICAgICAgICAgICAgIH5YVklEX01FX0NIUk9NQV9CVk9QICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgflhWSURfTUVfRVhUU0VBUkNIMTYgJgorICAgICAgICAgICAgICAgICAgICAgICAgICB+WFZJRF9NRV9BRFZBTkNFRERJQU1PTkQxNjsKKyAgICBtb3Rpb25fcmVwbGFjZW1lbnRzID0gWFZJRF9NRV9GQVNUX01PREVJTlRFUlBPTEFURSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIFhWSURfTUVfU0tJUF9ERUxUQVNFQVJDSCAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBYVklEX01FX0ZBU1RSRUZJTkUxNiAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWFZJRF9NRV9CRlJBTUVfRUFSTFlTVE9QOworICAgIHZvcF9yZW1vdmUgICAgICAgICAgPSB+WFZJRF9WT1BfTU9ERURFQ0lTSU9OX1JEICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICB+WFZJRF9WT1BfRkFTVF9NT0RFREVDSVNJT05fUkQgJgorICAgICAgICAgICAgICAgICAgICAgICAgICB+WFZJRF9WT1BfVFJFTExJU1FVQU5UICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICB+WFZJRF9WT1BfSU5URVI0ViAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICB+WFZJRF9WT1BfSFFBQ1BSRUQ7CisKKyAgICBwYXJhbS0+dm9sX2ZsYWdzICAgICY9IH5YVklEX1ZPTF9HTUM7CisgICAgcGFyYW0tPnZvcF9mbGFncyAgICAmPSB2b3BfcmVtb3ZlOworICAgIHBhcmFtLT5tb3Rpb25fZmxhZ3MgJj0gbW90aW9uX3JlbW92ZTsKKyAgICBwYXJhbS0+bW90aW9uX2ZsYWdzIHw9IG1vdGlvbl9yZXBsYWNlbWVudHM7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDYXB0dXJlIHN0YXRpc3RpYyBkYXRhIGFuZCB3cml0ZSBpdCBkdXJpbmcgZmlyc3QgcGFzcy4KKyAqCisgKiBAcGFyYW0gcmVmIENvbnRleHQgcG9pbnRlciBmb3IgdGhlIHBsdWdpbgorICogQHBhcmFtIHBhcmFtIFN0YXRpc3RpYyBkYXRhCisgKiBAcmV0dXJuIFJldHVybnMgWFZJRF9FUlJfeHh4eCBvbiBmYWlsdXJlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCB4dmlkX2ZmXzJwYXNzX2FmdGVyKHN0cnVjdCB4dmlkX2NvbnRleHQgKnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dmlkX3BsZ19kYXRhX3QgKnBhcmFtKQoreworICAgIGNoYXIgKmxvZyA9IHJlZi0+dHdvcGFzc2J1ZmZlcjsKKyAgICBjb25zdCBjaGFyICpmcmFtZV90eXBlcyA9ICIgaXBicyI7CisgICAgY2hhciBmcmFtZV90eXBlOworCisgICAgLyogUXVpY2sgYm91bmRzIGNoZWNrICovCisgICAgaWYgKCFsb2cpCisgICAgICAgIHJldHVybiBYVklEX0VSUl9GQUlMOworCisgICAgLyogQ29udmVydCB0aGUgdHlwZSBnaXZlbiB0byB1cyBpbnRvIGEgY2hhcmFjdGVyICovCisgICAgaWYgKHBhcmFtLT50eXBlIDwgNSAmJiBwYXJhbS0+dHlwZSA+IDApCisgICAgICAgIGZyYW1lX3R5cGUgPSBmcmFtZV90eXBlc1twYXJhbS0+dHlwZV07CisgICAgZWxzZQorICAgICAgICByZXR1cm4gWFZJRF9FUlJfRkFJTDsKKworICAgIHNucHJpbnRmKEJVRkZFUl9DQVQobG9nKSwgQlVGRkVSX1JFTUFJTklORyhsb2cpLAorICAgICAgICAgICAgICIlYyAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKyAgICAgICAgICAgICBmcmFtZV90eXBlLCBwYXJhbS0+c3RhdHMucXVhbnQsIHBhcmFtLT5zdGF0cy5rYmxrcywKKyAgICAgICAgICAgICBwYXJhbS0+c3RhdHMubWJsa3MsIHBhcmFtLT5zdGF0cy51YmxrcywKKyAgICAgICAgICAgICBwYXJhbS0+c3RhdHMubGVuZ3RoLCBwYXJhbS0+c3RhdHMuaGxlbmd0aCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEaXNwYXRjaCBmdW5jdGlvbiBmb3Igb3VyIGN1c3RvbSBwbHVnaW4uCisgKiBUaGlzIGhhbmRsZXMgdGhlIGRpc3BhdGNoIGZvciB0aGUgWHZpZCBwbHVnaW4uIEl0IHBhc3NlcyBkYXRhCisgKiBvbiB0byBvdGhlciBmdW5jdGlvbnMgZm9yIGFjdHVhbCBwcm9jZXNzaW5nLgorICoKKyAqIEBwYXJhbSByZWYgQ29udGV4dCBwb2ludGVyIGZvciB0aGUgcGx1Z2luCisgKiBAcGFyYW0gY21kIFRoZSB0YXNrIGdpdmVuIGZvciB1cyB0byBjb21wbGV0ZQorICogQHBhcmFtIHAxIEZpcnN0IHBhcmFtZXRlciAodmFyaWVzKQorICogQHBhcmFtIHAyIFNlY29uZCBwYXJhbWV0ZXIgKHZhcmllcykKKyAqIEByZXR1cm4gUmV0dXJucyBYVklEX0VSUl94eHh4IG9uIGZhaWx1cmUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IHh2aWRfZmZfMnBhc3Modm9pZCAqcmVmLCBpbnQgY21kLCB2b2lkICpwMSwgdm9pZCAqcDIpCit7CisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIFhWSURfUExHX0lORk86CisgICAgY2FzZSBYVklEX1BMR19GUkFNRToKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBYVklEX1BMR19CRUZPUkU6CisgICAgICAgIHJldHVybiB4dmlkX2ZmXzJwYXNzX2JlZm9yZShyZWYsIHAxKTsKKyAgICBjYXNlIFhWSURfUExHX0NSRUFURToKKyAgICAgICAgcmV0dXJuIHh2aWRfZmZfMnBhc3NfY3JlYXRlKHAxLCBwMik7CisgICAgY2FzZSBYVklEX1BMR19BRlRFUjoKKyAgICAgICAgcmV0dXJuIHh2aWRfZmZfMnBhc3NfYWZ0ZXIocmVmLCBwMSk7CisgICAgY2FzZSBYVklEX1BMR19ERVNUUk9ZOgorICAgICAgICByZXR1cm4geHZpZF9mZl8ycGFzc19kZXN0cm95KHJlZiwgcDEpOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBYVklEX0VSUl9GQUlMOworICAgIH0KK30KKworLyoqCisgKiBSb3V0aW5lIHRvIGNyZWF0ZSBhIGdsb2JhbCBWTy9WT0wgaGVhZGVyIGZvciBNUDQgY29udGFpbmVyLgorICogV2hhdCB3ZSBkbyBoZXJlIGlzIGV4dHJhY3QgdGhlIGhlYWRlciBmcm9tIHRoZSBYdmlkIGJpdHN0cmVhbQorICogYXMgaXQgaXMgZW5jb2RlZC4gV2UgYWxzbyBzdHJpcCB0aGUgcmVwZWF0ZWQgaGVhZGVycyBmcm9tIHRoZQorICogYml0c3RyZWFtIHdoZW4gYSBnbG9iYWwgaGVhZGVyIGlzIHJlcXVlc3RlZCBmb3IgTVBFRy00IElTTworICogY29tcGxpYW5jZS4KKyAqCisgKiBAcGFyYW0gYXZjdHggQVZDb2RlY0NvbnRleHQgcG9pbnRlciB0byBjb250ZXh0CisgKiBAcGFyYW0gZnJhbWUgUG9pbnRlciB0byBlbmNvZGVkIGZyYW1lIGRhdGEKKyAqIEBwYXJhbSBoZWFkZXJfbGVuIExlbmd0aCBvZiBoZWFkZXIgdG8gc2VhcmNoCisgKiBAcGFyYW0gZnJhbWVfbGVuIExlbmd0aCBvZiBlbmNvZGVkIGZyYW1lIGRhdGEKKyAqIEByZXR1cm4gUmV0dXJucyBuZXcgbGVuZ3RoIG9mIGZyYW1lIGRhdGEKKyAqLworc3RhdGljIGludCB4dmlkX3N0cmlwX3ZvbF9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZnJhbWVfbGVuKQoreworICAgIGludCB2b19sZW4gPSAwLCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlYWRlcl9sZW4gLSAzOyBpKyspIHsKKyAgICAgICAgaWYgKHBrdC0+ZGF0YVtpXSAgICAgPT0gMHgwMCAmJgorICAgICAgICAgICAgcGt0LT5kYXRhW2kgKyAxXSA9PSAweDAwICYmCisgICAgICAgICAgICBwa3QtPmRhdGFbaSArIDJdID09IDB4MDEgJiYKKyAgICAgICAgICAgIHBrdC0+ZGF0YVtpICsgM10gPT0gMHhCNikgeworICAgICAgICAgICAgdm9fbGVuID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZvX2xlbiA+IDApIHsKKyAgICAgICAgLyogV2UgbmVlZCB0byBzdG9yZSB0aGUgaGVhZGVyLCBzbyBleHRyYWN0IGl0ICovCisgICAgICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvYyh2b19sZW4pOworICAgICAgICAgICAgbWVtY3B5KGF2Y3R4LT5leHRyYWRhdGEsIHBrdC0+ZGF0YSwgdm9fbGVuKTsKKyAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHZvX2xlbjsKKyAgICAgICAgfQorICAgICAgICAvKiBMZXNzIGRhbmdlcm91cyBub3csIG1lbW1vdmUgcHJvcGVybHkgY29waWVzIHRoZSB0d28KKyAgICAgICAgICogY2h1bmtzIG9mIG92ZXJsYXBwaW5nIGRhdGEgKi8KKyAgICAgICAgbWVtbW92ZShwa3QtPmRhdGEsICZwa3QtPmRhdGFbdm9fbGVuXSwgZnJhbWVfbGVuIC0gdm9fbGVuKTsKKyAgICAgICAgcGt0LT5zaXplID0gZnJhbWVfbGVuIC0gdm9fbGVuOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSb3V0aW5lIHRvIGNvcnJlY3QgYSBwb3NzaWJseSBlcnJvbmVvdXMgZnJhbWVyYXRlIGJlaW5nIGZlZCB0byB1cy4KKyAqIFh2aWQgY3VycmVudGx5IGNob2tlcyBvbiBmcmFtZXJhdGVzIHdoZXJlIHRoZSB0aWNrcyBwZXIgZnJhbWUgaXMKKyAqIGV4dHJlbWVseSBsYXJnZS4gVGhpcyBmdW5jdGlvbiB3b3JrcyB0byBjb3JyZWN0IHByb2JsZW1zIGluIHRoaXMgYXJlYQorICogYnkgZXN0aW1hdGluZyBhIG5ldyBmcmFtZXJhdGUgYW5kIHRha2luZyB0aGUgc2ltcGxlciBmcmFjdGlvbiBvZgorICogdGhlIHR3byBwcmVzZW50ZWQuCisgKgorICogQHBhcmFtIGF2Y3R4IENvbnRleHQgdGhhdCBjb250YWlucyB0aGUgZnJhbWVyYXRlIHRvIGNvcnJlY3QuCisgKi8KK3N0YXRpYyB2b2lkIHh2aWRfY29ycmVjdF9mcmFtZXJhdGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBmcmF0ZSwgZmJhc2U7CisgICAgaW50IGVzdF9mcmF0ZSwgZXN0X2ZiYXNlOworICAgIGludCBnY2Q7CisgICAgZmxvYXQgZXN0X2ZwcywgZnBzOworCisgICAgZnJhdGUgPSBhdmN0eC0+dGltZV9iYXNlLmRlbjsKKyAgICBmYmFzZSA9IGF2Y3R4LT50aW1lX2Jhc2UubnVtOworCisgICAgZ2NkID0gYXZfZ2NkKGZyYXRlLCBmYmFzZSk7CisgICAgaWYgKGdjZCA+IDEpIHsKKyAgICAgICAgZnJhdGUgLz0gZ2NkOworICAgICAgICBmYmFzZSAvPSBnY2Q7CisgICAgfQorCisgICAgaWYgKGZyYXRlIDw9IDY1MDAwICYmIGZiYXNlIDw9IDY1MDAwKSB7CisgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UuZGVuID0gZnJhdGU7CisgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UubnVtID0gZmJhc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcHMgICAgID0gKGZsb2F0KSBmcmF0ZSAvIChmbG9hdCkgZmJhc2U7CisgICAgZXN0X2ZwcyA9IHJvdW5kZihmcHMgKiAxMDAwLjApIC8gMTAwMC4wOworCisgICAgZXN0X2ZyYXRlID0gKGludCkgZXN0X2ZwczsKKyAgICBpZiAoZXN0X2ZwcyA+IChpbnQpIGVzdF9mcHMpIHsKKyAgICAgICAgZXN0X2ZyYXRlID0gKGVzdF9mcmF0ZSArIDEpICogMTAwMDsKKyAgICAgICAgZXN0X2ZiYXNlID0gKGludCkgcm91bmRmKChmbG9hdCkgZXN0X2ZyYXRlIC8gZXN0X2Zwcyk7CisgICAgfSBlbHNlCisgICAgICAgIGVzdF9mYmFzZSA9IDE7CisKKyAgICBnY2QgPSBhdl9nY2QoZXN0X2ZyYXRlLCBlc3RfZmJhc2UpOworICAgIGlmIChnY2QgPiAxKSB7CisgICAgICAgIGVzdF9mcmF0ZSAvPSBnY2Q7CisgICAgICAgIGVzdF9mYmFzZSAvPSBnY2Q7CisgICAgfQorCisgICAgaWYgKGZiYXNlID4gZXN0X2ZiYXNlKSB7CisgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UuZGVuID0gZXN0X2ZyYXRlOworICAgICAgICBhdmN0eC0+dGltZV9iYXNlLm51bSA9IGVzdF9mYmFzZTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiWHZpZDogZnJhbWVyYXRlIHJlLWVzdGltYXRlZDogJS4yZiwgJS4zZiUlIGNvcnJlY3Rpb25cbiIsCisgICAgICAgICAgICAgICBlc3RfZnBzLCAoKChlc3RfZnBzIC0gZnBzKSAvIGZwcykgKiAxMDAuMCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UuZGVuID0gZnJhdGU7CisgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UubnVtID0gZmJhc2U7CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgeHZpZF9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IHhlcnIsIGksIHJldCA9IC0xOworICAgIGludCB4dmlkX2ZsYWdzID0gYXZjdHgtPmZsYWdzOworICAgIHN0cnVjdCB4dmlkX2NvbnRleHQgKnggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQxNl90ICppbnRyYSwgKmludGVyOworICAgIGludCBmZDsKKworICAgIHh2aWRfcGx1Z2luX3NpbmdsZV90ICAgICAgc2luZ2xlICAgICAgICAgID0geyAwIH07CisgICAgc3RydWN0IHh2aWRfZmZfcGFzczEgICAgICByYzJwYXNzMSAgICAgICAgPSB7IDAgfTsKKyAgICB4dmlkX3BsdWdpbl8ycGFzczJfdCAgICAgIHJjMnBhc3MyICAgICAgICA9IHsgMCB9OworICAgIHh2aWRfcGx1Z2luX2x1bWltYXNraW5nX3QgbWFza2luZ19sICAgICAgID0geyAwIH07IC8qIEZvciBsdW1pIG1hc2tpbmcgKi8KKyAgICB4dmlkX3BsdWdpbl9sdW1pbWFza2luZ190IG1hc2tpbmdfdiAgICAgICA9IHsgMCB9OyAvKiBGb3IgdmFyaWFuY2UgQVEgKi8KKyAgICB4dmlkX3BsdWdpbl9zc2ltX3QgICAgICAgIHNzaW0gICAgICAgICAgICA9IHsgMCB9OworICAgIHh2aWRfZ2JsX2luaXRfdCAgICAgICAgICAgeHZpZF9nYmxfaW5pdCAgID0geyAwIH07CisgICAgeHZpZF9lbmNfY3JlYXRlX3QgICAgICAgICB4dmlkX2VuY19jcmVhdGUgPSB7IDAgfTsKKyAgICB4dmlkX2VuY19wbHVnaW5fdCAgICAgICAgIHBsdWdpbnNbNF07CisKKyAgICB4LT50d29wYXNzZmQgPSAtMTsKKworICAgIC8qIEJyaW5nIGluIFZPUCBmbGFncyBmcm9tIGZmbXBlZyBjb21tYW5kLWxpbmUgKi8KKyAgICB4LT52b3BfZmxhZ3MgPSBYVklEX1ZPUF9IQUxGUEVMOyAgICAgICAgICAgICAgLyogQmFyZSBtaW5pbXVtIHF1YWxpdHkgKi8KKyAgICBpZiAoeHZpZF9mbGFncyAmIENPREVDX0ZMQUdfNE1WKQorICAgICAgICB4LT52b3BfZmxhZ3MgICAgfD0gWFZJRF9WT1BfSU5URVI0VjsgICAgICAvKiBMZXZlbCAzICovCisgICAgaWYgKGF2Y3R4LT50cmVsbGlzKQorICAgICAgICB4LT52b3BfZmxhZ3MgICAgfD0gWFZJRF9WT1BfVFJFTExJU1FVQU5UOyAvKiBMZXZlbCA1ICovCisgICAgaWYgKHh2aWRfZmxhZ3MgJiBDT0RFQ19GTEFHX0FDX1BSRUQpCisgICAgICAgIHgtPnZvcF9mbGFncyAgICB8PSBYVklEX1ZPUF9IUUFDUFJFRDsgICAgIC8qIExldmVsIDYgKi8KKyAgICBpZiAoeHZpZF9mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkKKyAgICAgICAgeC0+dm9wX2ZsYWdzICAgIHw9IFhWSURfVk9QX0dSRVlTQ0FMRTsKKworICAgIC8qIERlY2lkZSB3aGljaCBNRSBxdWFsaXR5IHNldHRpbmcgdG8gdXNlICovCisgICAgeC0+bWVfZmxhZ3MgPSAwOworICAgIHN3aXRjaCAoYXZjdHgtPm1lX21ldGhvZCkgeworICAgIGNhc2UgTUVfRlVMTDogICAvKiBRdWFsaXR5IDYgKi8KKyAgICAgICAgeC0+bWVfZmxhZ3MgfD0gWFZJRF9NRV9FWFRTRUFSQ0gxNiB8CisgICAgICAgICAgICAgICAgICAgICAgIFhWSURfTUVfRVhUU0VBUkNIODsKKworICAgIGNhc2UgTUVfRVBaUzogICAvKiBRdWFsaXR5IDQgKi8KKyAgICAgICAgeC0+bWVfZmxhZ3MgfD0gWFZJRF9NRV9BRFZBTkNFRERJQU1PTkQ4IHwKKyAgICAgICAgICAgICAgICAgICAgICAgWFZJRF9NRV9IQUxGUEVMUkVGSU5FOCAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgWFZJRF9NRV9DSFJPTUFfUFZPUCAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgWFZJRF9NRV9DSFJPTUFfQlZPUDsKKworICAgIGNhc2UgTUVfTE9HOiAgICAvKiBRdWFsaXR5IDIgKi8KKyAgICBjYXNlIE1FX1BIT0RTOgorICAgIGNhc2UgTUVfWDE6CisgICAgICAgIHgtPm1lX2ZsYWdzIHw9IFhWSURfTUVfQURWQU5DRURESUFNT05EMTYgfAorICAgICAgICAgICAgICAgICAgICAgICBYVklEX01FX0hBTEZQRUxSRUZJTkUxNjsKKworICAgIGNhc2UgTUVfWkVSTzogICAvKiBRdWFsaXR5IDAgKi8KKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBEZWNpZGUgaG93IHdlIHNob3VsZCBkZWNpZGUgYmxvY2tzICovCisgICAgc3dpdGNoIChhdmN0eC0+bWJfZGVjaXNpb24pIHsKKyAgICBjYXNlIDI6CisgICAgICAgIHgtPnZvcF9mbGFncyB8PSAgWFZJRF9WT1BfTU9ERURFQ0lTSU9OX1JEOworICAgICAgICB4LT5tZV9mbGFncyAgfD0gIFhWSURfTUVfSEFMRlBFTFJFRklORThfUkQgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFhWSURfTUVfUVVBUlRFUlBFTFJFRklORThfUkQgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFhWSURfTUVfRVhUU0VBUkNIX1JEICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFhWSURfTUVfQ0hFQ0tQUkVESUNUSU9OX1JEOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKCEoeC0+dm9wX2ZsYWdzICYgWFZJRF9WT1BfTU9ERURFQ0lTSU9OX1JEKSkKKyAgICAgICAgICAgIHgtPnZvcF9mbGFncyB8PSBYVklEX1ZPUF9GQVNUX01PREVERUNJU0lPTl9SRDsKKyAgICAgICAgeC0+bWVfZmxhZ3MgfD0gWFZJRF9NRV9IQUxGUEVMUkVGSU5FMTZfUkQgfAorICAgICAgICAgICAgICAgICAgICAgICBYVklEX01FX1FVQVJURVJQRUxSRUZJTkUxNl9SRDsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBCcmluZyBpbiBWT0wgZmxhZ3MgZnJvbSBmZm1wZWcgY29tbWFuZC1saW5lICovCisjaWYgRkZfQVBJX0dNQworICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dNQykKKyAgICAgICAgeC0+Z21jID0gMTsKKyNlbmRpZgorCisgICAgeC0+dm9sX2ZsYWdzID0gMDsKKyAgICBpZiAoeC0+Z21jKSB7CisgICAgICAgIHgtPnZvbF9mbGFncyB8PSBYVklEX1ZPTF9HTUM7CisgICAgICAgIHgtPm1lX2ZsYWdzICB8PSBYVklEX01FX0dNRV9SRUZJTkU7CisgICAgfQorICAgIGlmICh4dmlkX2ZsYWdzICYgQ09ERUNfRkxBR19RUEVMKSB7CisgICAgICAgIHgtPnZvbF9mbGFncyB8PSBYVklEX1ZPTF9RVUFSVEVSUEVMOworICAgICAgICB4LT5tZV9mbGFncyAgfD0gWFZJRF9NRV9RVUFSVEVSUEVMUkVGSU5FMTY7CisgICAgICAgIGlmICh4LT52b3BfZmxhZ3MgJiBYVklEX1ZPUF9JTlRFUjRWKQorICAgICAgICAgICAgeC0+bWVfZmxhZ3MgfD0gWFZJRF9NRV9RVUFSVEVSUEVMUkVGSU5FODsKKyAgICB9CisKKyAgICB4dmlkX2dibF9pbml0LnZlcnNpb24gICA9IFhWSURfVkVSU0lPTjsKKyAgICB4dmlkX2dibF9pbml0LmRlYnVnICAgICA9IDA7CisgICAgeHZpZF9nYmxfaW5pdC5jcHVfZmxhZ3MgPSAwOworCisgICAgLyogSW5pdGlhbGl6ZSAqLworICAgIHh2aWRfZ2xvYmFsKE5VTEwsIFhWSURfR0JMX0lOSVQsICZ4dmlkX2dibF9pbml0LCBOVUxMKTsKKworICAgIC8qIENyZWF0ZSB0aGUgZW5jb2RlciByZWZlcmVuY2UgKi8KKyAgICB4dmlkX2VuY19jcmVhdGUudmVyc2lvbiA9IFhWSURfVkVSU0lPTjsKKworICAgIC8qIFN0b3JlIHRoZSBkZXNpcmVkIGZyYW1lIHNpemUgKi8KKyAgICB4dmlkX2VuY19jcmVhdGUud2lkdGggID0KKyAgICB4LT54c2l6ZSAgICAgICAgICAgICAgID0gYXZjdHgtPndpZHRoOworICAgIHh2aWRfZW5jX2NyZWF0ZS5oZWlnaHQgPQorICAgIHgtPnlzaXplICAgICAgICAgICAgICAgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgLyogWHZpZCBjYW4gZGV0ZXJtaW5lIHRoZSBwcm9wZXIgcHJvZmlsZSB0byB1c2UgKi8KKyAgICAvKiB4dmlkX2VuY19jcmVhdGUucHJvZmlsZSA9IFhWSURfUFJPRklMRV9TX0wzOyAqLworCisgICAgLyogV2UgZG9uJ3QgdXNlIHpvbmVzICovCisgICAgeHZpZF9lbmNfY3JlYXRlLnpvbmVzICAgICA9IE5VTEw7CisgICAgeHZpZF9lbmNfY3JlYXRlLm51bV96b25lcyA9IDA7CisKKyAgICB4dmlkX2VuY19jcmVhdGUubnVtX3RocmVhZHMgPSBhdmN0eC0+dGhyZWFkX2NvdW50OworCisgICAgeHZpZF9lbmNfY3JlYXRlLnBsdWdpbnMgICAgID0gcGx1Z2luczsKKyAgICB4dmlkX2VuY19jcmVhdGUubnVtX3BsdWdpbnMgPSAwOworCisgICAgLyogSW5pdGlhbGl6ZSBCdWZmZXJzICovCisgICAgeC0+dHdvcGFzc2J1ZmZlciAgICAgPSBOVUxMOworICAgIHgtPm9sZF90d29wYXNzYnVmZmVyID0gTlVMTDsKKyAgICB4LT50d29wYXNzZmlsZSAgICAgICA9IE5VTEw7CisKKyAgICBpZiAoeHZpZF9mbGFncyAmIENPREVDX0ZMQUdfUEFTUzEpIHsKKyAgICAgICAgcmMycGFzczEudmVyc2lvbiAgICAgPSBYVklEX1ZFUlNJT047CisgICAgICAgIHJjMnBhc3MxLmNvbnRleHQgICAgID0geDsKKyAgICAgICAgeC0+dHdvcGFzc2J1ZmZlciAgICAgPSBhdl9tYWxsb2MoQlVGRkVSX1NJWkUpOworICAgICAgICB4LT5vbGRfdHdvcGFzc2J1ZmZlciA9IGF2X21hbGxvYyhCVUZGRVJfU0laRSk7CisgICAgICAgIGlmICgheC0+dHdvcGFzc2J1ZmZlciB8fCAheC0+b2xkX3R3b3Bhc3NidWZmZXIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJYdmlkOiBDYW5ub3QgYWxsb2NhdGUgMi1wYXNzIGxvZyBidWZmZXJzXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICB4LT50d29wYXNzYnVmZmVyWzBdICAgICA9CisgICAgICAgIHgtPm9sZF90d29wYXNzYnVmZmVyWzBdID0gMDsKKworICAgICAgICBwbHVnaW5zW3h2aWRfZW5jX2NyZWF0ZS5udW1fcGx1Z2luc10uZnVuYyAgPSB4dmlkX2ZmXzJwYXNzOworICAgICAgICBwbHVnaW5zW3h2aWRfZW5jX2NyZWF0ZS5udW1fcGx1Z2luc10ucGFyYW0gPSAmcmMycGFzczE7CisgICAgICAgIHh2aWRfZW5jX2NyZWF0ZS5udW1fcGx1Z2lucysrOworICAgIH0gZWxzZSBpZiAoeHZpZF9mbGFncyAmIENPREVDX0ZMQUdfUEFTUzIpIHsKKyAgICAgICAgcmMycGFzczIudmVyc2lvbiA9IFhWSURfVkVSU0lPTjsKKyAgICAgICAgcmMycGFzczIuYml0cmF0ZSA9IGF2Y3R4LT5iaXRfcmF0ZTsKKworICAgICAgICBmZCA9IGF2X3RlbXBmaWxlKCJ4dmlkZmYuIiwgJngtPnR3b3Bhc3NmaWxlLCAwLCBhdmN0eCk7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiWHZpZDogQ2Fubm90IHdyaXRlIDItcGFzcyBwaXBlXG4iKTsKKyAgICAgICAgICAgIHJldCA9IGZkOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHgtPnR3b3Bhc3NmZCA9IGZkOworCisgICAgICAgIGlmICghYXZjdHgtPnN0YXRzX2luKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiWHZpZDogTm8gMi1wYXNzIGluZm9ybWF0aW9uIGxvYWRlZCBmb3Igc2Vjb25kIHBhc3NcbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gd3JpdGUoZmQsIGF2Y3R4LT5zdGF0c19pbiwgc3RybGVuKGF2Y3R4LT5zdGF0c19pbikpOworICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGVsc2UgaWYgKHN0cmxlbihhdmN0eC0+c3RhdHNfaW4pID4gcmV0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlh2aWQ6IENhbm5vdCB3cml0ZSB0byAyLXBhc3MgcGlwZVxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgcmMycGFzczIuZmlsZW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgID0geC0+dHdvcGFzc2ZpbGU7CisgICAgICAgIHBsdWdpbnNbeHZpZF9lbmNfY3JlYXRlLm51bV9wbHVnaW5zXS5mdW5jICA9IHh2aWRfcGx1Z2luXzJwYXNzMjsKKyAgICAgICAgcGx1Z2luc1t4dmlkX2VuY19jcmVhdGUubnVtX3BsdWdpbnNdLnBhcmFtID0gJnJjMnBhc3MyOworICAgICAgICB4dmlkX2VuY19jcmVhdGUubnVtX3BsdWdpbnMrKzsKKyAgICB9IGVsc2UgaWYgKCEoeHZpZF9mbGFncyAmIENPREVDX0ZMQUdfUVNDQUxFKSkgeworICAgICAgICAvKiBTaW5nbGUgUGFzcyBCaXRyYXRlIENvbnRyb2whICovCisgICAgICAgIHNpbmdsZS52ZXJzaW9uID0gWFZJRF9WRVJTSU9OOworICAgICAgICBzaW5nbGUuYml0cmF0ZSA9IGF2Y3R4LT5iaXRfcmF0ZTsKKworICAgICAgICBwbHVnaW5zW3h2aWRfZW5jX2NyZWF0ZS5udW1fcGx1Z2luc10uZnVuYyAgPSB4dmlkX3BsdWdpbl9zaW5nbGU7CisgICAgICAgIHBsdWdpbnNbeHZpZF9lbmNfY3JlYXRlLm51bV9wbHVnaW5zXS5wYXJhbSA9ICZzaW5nbGU7CisgICAgICAgIHh2aWRfZW5jX2NyZWF0ZS5udW1fcGx1Z2lucysrOworICAgIH0KKworICAgIGlmIChhdmN0eC0+bHVtaV9tYXNraW5nICE9IDAuMCkKKyAgICAgICAgeC0+bHVtaV9hcSA9IDE7CisKKyAgICAvKiBMdW1pbmFuY2UgTWFza2luZyAqLworICAgIGlmICh4LT5sdW1pX2FxKSB7CisgICAgICAgIG1hc2tpbmdfbC5tZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgcGx1Z2luc1t4dmlkX2VuY19jcmVhdGUubnVtX3BsdWdpbnNdLmZ1bmMgPSB4dmlkX3BsdWdpbl9sdW1pbWFza2luZzsKKworICAgICAgICAvKiBUaGUgb2xkIGJlaGF2aW9yIGlzIHRoYXQgd2hlbiBhdmN0eC0+bHVtaV9tYXNraW5nIGlzIHNwZWNpZmllZCwKKyAgICAgICAgICogcGx1Z2luc1suLi5dLnBhcmFtID0gTlVMTC4gVHJ5aW5nIHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvciBoZXJlLiAqLworICAgICAgICBwbHVnaW5zW3h2aWRfZW5jX2NyZWF0ZS5udW1fcGx1Z2luc10ucGFyYW0gPQorICAgICAgICAgICAgYXZjdHgtPmx1bWlfbWFza2luZyA/IE5VTEwgOiAmbWFza2luZ19sOworICAgICAgICB4dmlkX2VuY19jcmVhdGUubnVtX3BsdWdpbnMrKzsKKyAgICB9CisKKyAgICAvKiBWYXJpYW5jZSBBUSAqLworICAgIGlmICh4LT52YXJpYW5jZV9hcSkgeworICAgICAgICBtYXNraW5nX3YubWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOworICAgICAgICBwbHVnaW5zW3h2aWRfZW5jX2NyZWF0ZS5udW1fcGx1Z2luc10uZnVuYyAgPSB4dmlkX3BsdWdpbl9sdW1pbWFza2luZzsKKyAgICAgICAgcGx1Z2luc1t4dmlkX2VuY19jcmVhdGUubnVtX3BsdWdpbnNdLnBhcmFtID0gJm1hc2tpbmdfdjsKKyAgICAgICAgeHZpZF9lbmNfY3JlYXRlLm51bV9wbHVnaW5zKys7CisgICAgfQorCisgICAgaWYgKHgtPmx1bWlfYXEgJiYgeC0+dmFyaWFuY2VfYXEgKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgIkJvdGggbHVtaV9hcSBhbmQgdmFyaWFuY2VfYXEgYXJlIGVuYWJsZWQuIFRoZSByZXN1bHRpbmcgcXVhbGl0eSIKKyAgICAgICAgICAgICAgICJ3aWxsIGJlIHRoZSB3b3JzZSBvbmUgb2YgdGhlIHR3byBlZmZlY3RzIG1hZGUgYnkgdGhlIEFRLlxuIik7CisKKyAgICAvKiBTU0lNICovCisgICAgaWYgKHgtPnNzaW0pIHsKKyAgICAgICAgcGx1Z2luc1t4dmlkX2VuY19jcmVhdGUubnVtX3BsdWdpbnNdLmZ1bmMgID0geHZpZF9wbHVnaW5fc3NpbTsKKyAgICAgICAgc3NpbS5iX3ByaW50c3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgID0geC0+c3NpbSA9PSAyOworICAgICAgICBzc2ltLmFjYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB4LT5zc2ltX2FjYzsKKyAgICAgICAgc3NpbS5jcHVfZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0geHZpZF9nYmxfaW5pdC5jcHVfZmxhZ3M7CisgICAgICAgIHNzaW0uYl92aXN1YWxpemUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgICAgIHBsdWdpbnNbeHZpZF9lbmNfY3JlYXRlLm51bV9wbHVnaW5zXS5wYXJhbSA9ICZzc2ltOworICAgICAgICB4dmlkX2VuY19jcmVhdGUubnVtX3BsdWdpbnMrKzsKKyAgICB9CisKKyAgICAvKiBGcmFtZSBSYXRlIGFuZCBLZXkgRnJhbWVzICovCisgICAgeHZpZF9jb3JyZWN0X2ZyYW1lcmF0ZShhdmN0eCk7CisgICAgeHZpZF9lbmNfY3JlYXRlLmZpbmNyID0gYXZjdHgtPnRpbWVfYmFzZS5udW07CisgICAgeHZpZF9lbmNfY3JlYXRlLmZiYXNlID0gYXZjdHgtPnRpbWVfYmFzZS5kZW47CisgICAgaWYgKGF2Y3R4LT5nb3Bfc2l6ZSA+IDApCisgICAgICAgIHh2aWRfZW5jX2NyZWF0ZS5tYXhfa2V5X2ludGVydmFsID0gYXZjdHgtPmdvcF9zaXplOworICAgIGVsc2UKKyAgICAgICAgeHZpZF9lbmNfY3JlYXRlLm1heF9rZXlfaW50ZXJ2YWwgPSAyNDA7IC8qIFh2aWQncyBiZXN0IGRlZmF1bHQgKi8KKworICAgIC8qIFF1YW50cyAqLworICAgIGlmICh4dmlkX2ZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpCisgICAgICAgIHgtPnFzY2FsZSA9IDE7CisgICAgZWxzZQorICAgICAgICB4LT5xc2NhbGUgPSAwOworCisgICAgeHZpZF9lbmNfY3JlYXRlLm1pbl9xdWFudFswXSA9IGF2Y3R4LT5xbWluOworICAgIHh2aWRfZW5jX2NyZWF0ZS5taW5fcXVhbnRbMV0gPSBhdmN0eC0+cW1pbjsKKyAgICB4dmlkX2VuY19jcmVhdGUubWluX3F1YW50WzJdID0gYXZjdHgtPnFtaW47CisgICAgeHZpZF9lbmNfY3JlYXRlLm1heF9xdWFudFswXSA9IGF2Y3R4LT5xbWF4OworICAgIHh2aWRfZW5jX2NyZWF0ZS5tYXhfcXVhbnRbMV0gPSBhdmN0eC0+cW1heDsKKyAgICB4dmlkX2VuY19jcmVhdGUubWF4X3F1YW50WzJdID0gYXZjdHgtPnFtYXg7CisKKyAgICAvKiBRdWFudCBNYXRyaWNlcyAqLworICAgIHgtPmludHJhX21hdHJpeCA9CisgICAgeC0+aW50ZXJfbWF0cml4ID0gTlVMTDsKKyAgICBpZiAoYXZjdHgtPm1wZWdfcXVhbnQpCisgICAgICAgIHgtPnZvbF9mbGFncyB8PSBYVklEX1ZPTF9NUEVHUVVBTlQ7CisgICAgaWYgKChhdmN0eC0+aW50cmFfbWF0cml4IHx8IGF2Y3R4LT5pbnRlcl9tYXRyaXgpKSB7CisgICAgICAgIHgtPnZvbF9mbGFncyB8PSBYVklEX1ZPTF9NUEVHUVVBTlQ7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5pbnRyYV9tYXRyaXgpIHsKKyAgICAgICAgICAgIGludHJhICAgICAgICAgICA9IGF2Y3R4LT5pbnRyYV9tYXRyaXg7CisgICAgICAgICAgICB4LT5pbnRyYV9tYXRyaXggPSBhdl9tYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogNjQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGludHJhID0gTlVMTDsKKyAgICAgICAgaWYgKGF2Y3R4LT5pbnRlcl9tYXRyaXgpIHsKKyAgICAgICAgICAgIGludGVyICAgICAgICAgICA9IGF2Y3R4LT5pbnRlcl9tYXRyaXg7CisgICAgICAgICAgICB4LT5pbnRlcl9tYXRyaXggPSBhdl9tYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogNjQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGludGVyID0gTlVMTDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGludHJhKQorICAgICAgICAgICAgICAgIHgtPmludHJhX21hdHJpeFtpXSA9ICh1bnNpZ25lZCBjaGFyKSBpbnRyYVtpXTsKKyAgICAgICAgICAgIGlmIChpbnRlcikKKyAgICAgICAgICAgICAgICB4LT5pbnRlcl9tYXRyaXhbaV0gPSAodW5zaWduZWQgY2hhcikgaW50ZXJbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBNaXNjIFNldHRpbmdzICovCisgICAgeHZpZF9lbmNfY3JlYXRlLmZyYW1lX2Ryb3BfcmF0aW8gPSAwOworICAgIHh2aWRfZW5jX2NyZWF0ZS5nbG9iYWwgICAgICAgICAgID0gMDsKKyAgICBpZiAoeHZpZF9mbGFncyAmIENPREVDX0ZMQUdfQ0xPU0VEX0dPUCkKKyAgICAgICAgeHZpZF9lbmNfY3JlYXRlLmdsb2JhbCB8PSBYVklEX0dMT0JBTF9DTE9TRURfR09QOworCisgICAgLyogRGV0ZXJtaW5lcyB3aGljaCBjb2RlYyBtb2RlIHdlIGFyZSBvcGVyYXRpbmcgaW4gKi8KKyAgICBhdmN0eC0+ZXh0cmFkYXRhICAgICAgPSBOVUxMOworICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgaWYgKHh2aWRfZmxhZ3MgJiBDT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpIHsKKyAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB3ZSBhcmUgY2xhaW1pbmcgdG8gYmUgTVBFRzQgKi8KKyAgICAgICAgeC0+cXVpY2t0aW1lX2Zvcm1hdCA9IDE7CisgICAgICAgIGF2Y3R4LT5jb2RlY19pZCAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSBhcmUgY2xhaW1pbmcgdG8gYmUgWHZpZCAqLworICAgICAgICB4LT5xdWlja3RpbWVfZm9ybWF0ID0gMDsKKyAgICAgICAgaWYgKCFhdmN0eC0+Y29kZWNfdGFnKQorICAgICAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IEFWX1JMMzIoInh2aWQiKTsKKyAgICB9CisKKyAgICAvKiBCZnJhbWVzICovCisgICAgeHZpZF9lbmNfY3JlYXRlLm1heF9iZnJhbWVzICAgPSBhdmN0eC0+bWF4X2JfZnJhbWVzOworICAgIHh2aWRfZW5jX2NyZWF0ZS5icXVhbnRfb2Zmc2V0ID0gMTAwICogYXZjdHgtPmJfcXVhbnRfb2Zmc2V0OworICAgIHh2aWRfZW5jX2NyZWF0ZS5icXVhbnRfcmF0aW8gID0gMTAwICogYXZjdHgtPmJfcXVhbnRfZmFjdG9yOworICAgIGlmIChhdmN0eC0+bWF4X2JfZnJhbWVzID4gMCAmJiAheC0+cXVpY2t0aW1lX2Zvcm1hdCkKKyAgICAgICAgeHZpZF9lbmNfY3JlYXRlLmdsb2JhbCB8PSBYVklEX0dMT0JBTF9QQUNLRUQ7CisKKyAgICBhdl9hc3NlcnQwKHh2aWRfZW5jX2NyZWF0ZS5udW1fcGx1Z2lucyArICghIXgtPnNzaW0pICsgKCEheC0+dmFyaWFuY2VfYXEpICsgKCEheC0+bHVtaV9hcSkgPD0gRkZfQVJSQVlfRUxFTVMocGx1Z2lucykpOworCisgICAgLyogQ3JlYXRlIGVuY29kZXIgY29udGV4dCAqLworICAgIHhlcnIgPSB4dmlkX2VuY29yZShOVUxMLCBYVklEX0VOQ19DUkVBVEUsICZ4dmlkX2VuY19jcmVhdGUsIE5VTEwpOworICAgIGlmICh4ZXJyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiWHZpZDogQ291bGQgbm90IGNyZWF0ZSBlbmNvZGVyIHJlZmVyZW5jZVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICB4LT5lbmNvZGVyX2hhbmRsZSAgPSB4dmlkX2VuY19jcmVhdGUuaGFuZGxlOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIHh2aWRfZW5jb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHh2aWRfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljdHVyZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIGludCB4ZXJyLCBpLCByZXQsIHVzZXJfcGFja2V0ID0gISFwa3QtPmRhdGE7CisgICAgc3RydWN0IHh2aWRfY29udGV4dCAqeCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqcCAgICAgICAgICAgICA9IGF2Y3R4LT5jb2RlZF9mcmFtZTsKKyAgICBpbnQgbWJfd2lkdGggID0gKGF2Y3R4LT53aWR0aCAgKyAxNSkgLyAxNjsKKyAgICBpbnQgbWJfaGVpZ2h0ID0gKGF2Y3R4LT5oZWlnaHQgKyAxNSkgLyAxNjsKKyAgICBjaGFyICp0bXA7CisKKyAgICB4dmlkX2VuY19mcmFtZV90IHh2aWRfZW5jX2ZyYW1lID0geyAwIH07CisgICAgeHZpZF9lbmNfc3RhdHNfdCB4dmlkX2VuY19zdGF0cyA9IHsgMCB9OworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIG1iX3dpZHRoKm1iX2hlaWdodCpNQVhfTUJfQllURVMgKyBGRl9NSU5fQlVGRkVSX1NJWkUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBTdGFydCBzZXR0aW5nIHVwIHRoZSBmcmFtZSAqLworICAgIHh2aWRfZW5jX2ZyYW1lLnZlcnNpb24gPSBYVklEX1ZFUlNJT047CisgICAgeHZpZF9lbmNfc3RhdHMudmVyc2lvbiA9IFhWSURfVkVSU0lPTjsKKworICAgIC8qIExldCBYdmlkIGtub3cgd2hlcmUgdG8gcHV0IHRoZSBmcmFtZS4gKi8KKyAgICB4dmlkX2VuY19mcmFtZS5iaXRzdHJlYW0gPSBwa3QtPmRhdGE7CisgICAgeHZpZF9lbmNfZnJhbWUubGVuZ3RoICAgID0gcGt0LT5zaXplOworCisgICAgLyogSW5pdGlhbGl6ZSBpbnB1dCBpbWFnZSBmaWVsZHMgKi8KKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9ZVVY0MjBQKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlh2aWQ6IENvbG9yIHNwYWNlcyBvdGhlciB0aGFuIDQyMFAgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgeHZpZF9lbmNfZnJhbWUuaW5wdXQuY3NwID0gWFZJRF9DU1BfUExBTkFSOyAvKiBZVVY0MjBQICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHh2aWRfZW5jX2ZyYW1lLmlucHV0LnBsYW5lW2ldICA9IHBpY3R1cmUtPmRhdGFbaV07CisgICAgICAgIHh2aWRfZW5jX2ZyYW1lLmlucHV0LnN0cmlkZVtpXSA9IHBpY3R1cmUtPmxpbmVzaXplW2ldOworICAgIH0KKworICAgIC8qIEVuY29kZXIgRmxhZ3MgKi8KKyAgICB4dmlkX2VuY19mcmFtZS52b3BfZmxhZ3MgPSB4LT52b3BfZmxhZ3M7CisgICAgeHZpZF9lbmNfZnJhbWUudm9sX2ZsYWdzID0geC0+dm9sX2ZsYWdzOworICAgIHh2aWRfZW5jX2ZyYW1lLm1vdGlvbiAgICA9IHgtPm1lX2ZsYWdzOworICAgIHh2aWRfZW5jX2ZyYW1lLnR5cGUgICAgICA9CisgICAgICAgIHBpY3R1cmUtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSA/IFhWSURfVFlQRV9JVk9QIDoKKyAgICAgICAgcGljdHVyZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QID8gWFZJRF9UWVBFX1BWT1AgOgorICAgICAgICBwaWN0dXJlLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgPyBYVklEX1RZUEVfQlZPUCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhWSURfVFlQRV9BVVRPOworCisgICAgLyogUGl4ZWwgYXNwZWN0IHJhdGlvIHNldHRpbmcgKi8KKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtIDwgMCB8fCBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPiAyNTUgfHwKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuIDwgMCB8fCBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPiAyNTUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHBpeGVsIGFzcGVjdCByYXRpbyAlaS8laSwgbGltaXQgaXMgMjU1LzI1NSByZWR1Y2luZ1xuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKyAgICAgICAgYXZfcmVkdWNlKCZhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sICZhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLCAyNTUpOworICAgIH0KKyAgICB4dmlkX2VuY19mcmFtZS5wYXIgICAgICAgID0gWFZJRF9QQVJfRVhUOworICAgIHh2aWRfZW5jX2ZyYW1lLnBhcl93aWR0aCAgPSBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW07CisgICAgeHZpZF9lbmNfZnJhbWUucGFyX2hlaWdodCA9IGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbjsKKworICAgIC8qIFF1YW50IFNldHRpbmcgKi8KKyAgICBpZiAoeC0+cXNjYWxlKQorICAgICAgICB4dmlkX2VuY19mcmFtZS5xdWFudCA9IHBpY3R1cmUtPnF1YWxpdHkgLyBGRl9RUDJMQU1CREE7CisgICAgZWxzZQorICAgICAgICB4dmlkX2VuY19mcmFtZS5xdWFudCA9IDA7CisKKyAgICAvKiBNYXRyaWNlcyAqLworICAgIHh2aWRfZW5jX2ZyYW1lLnF1YW50X2ludHJhX21hdHJpeCA9IHgtPmludHJhX21hdHJpeDsKKyAgICB4dmlkX2VuY19mcmFtZS5xdWFudF9pbnRlcl9tYXRyaXggPSB4LT5pbnRlcl9tYXRyaXg7CisKKyAgICAvKiBFbmNvZGUgKi8KKyAgICB4ZXJyID0geHZpZF9lbmNvcmUoeC0+ZW5jb2Rlcl9oYW5kbGUsIFhWSURfRU5DX0VOQ09ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnh2aWRfZW5jX2ZyYW1lLCAmeHZpZF9lbmNfc3RhdHMpOworCisgICAgLyogVHdvLXBhc3MgbG9nIGJ1ZmZlciBzd2FwcGluZyAqLworICAgIGF2Y3R4LT5zdGF0c19vdXQgPSBOVUxMOworICAgIGlmICh4LT50d29wYXNzYnVmZmVyKSB7CisgICAgICAgIHRtcCAgICAgICAgICAgICAgICAgID0geC0+b2xkX3R3b3Bhc3NidWZmZXI7CisgICAgICAgIHgtPm9sZF90d29wYXNzYnVmZmVyID0geC0+dHdvcGFzc2J1ZmZlcjsKKyAgICAgICAgeC0+dHdvcGFzc2J1ZmZlciAgICAgPSB0bXA7CisgICAgICAgIHgtPnR3b3Bhc3NidWZmZXJbMF0gID0gMDsKKyAgICAgICAgaWYgKHgtPm9sZF90d29wYXNzYnVmZmVyWzBdICE9IDApIHsKKyAgICAgICAgICAgIGF2Y3R4LT5zdGF0c19vdXQgPSB4LT5vbGRfdHdvcGFzc2J1ZmZlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh4ZXJyID4gMCkgeworICAgICAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICAgICAgcC0+cXVhbGl0eSA9IHh2aWRfZW5jX3N0YXRzLnF1YW50ICogRkZfUVAyTEFNQkRBOworICAgICAgICBpZiAoeHZpZF9lbmNfc3RhdHMudHlwZSA9PSBYVklEX1RZUEVfUFZPUCkKKyAgICAgICAgICAgIHAtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICBlbHNlIGlmICh4dmlkX2VuY19zdGF0cy50eXBlID09IFhWSURfVFlQRV9CVk9QKQorICAgICAgICAgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0I7CisgICAgICAgIGVsc2UgaWYgKHh2aWRfZW5jX3N0YXRzLnR5cGUgPT0gWFZJRF9UWVBFX1NWT1ApCisgICAgICAgICAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIGlmICh4dmlkX2VuY19mcmFtZS5vdXRfZmxhZ3MgJiBYVklEX0tFWUZSQU1FKSB7CisgICAgICAgICAgICBwLT5rZXlfZnJhbWUgPSAxOworICAgICAgICAgICAgcGt0LT5mbGFncyAgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICAgICAgaWYgKHgtPnF1aWNrdGltZV9mb3JtYXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHh2aWRfc3RyaXBfdm9sX2hlYWRlcihhdmN0eCwgcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHZpZF9lbmNfc3RhdHMuaGxlbmd0aCwgeGVycik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcC0+a2V5X2ZyYW1lID0gMDsKKworICAgICAgICBwa3QtPnNpemUgPSB4ZXJyOworCisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghdXNlcl9wYWNrZXQpCisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICBpZiAoIXhlcnIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiWHZpZDogRW5jb2RpbmcgRXJyb3IgT2NjdXJyZWQ6ICVpXG4iLCB4ZXJyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgeHZpZF9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHN0cnVjdCB4dmlkX2NvbnRleHQgKnggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYoeC0+ZW5jb2Rlcl9oYW5kbGUpCisgICAgICAgIHh2aWRfZW5jb3JlKHgtPmVuY29kZXJfaGFuZGxlLCBYVklEX0VOQ19ERVNUUk9ZLCBOVUxMLCBOVUxMKTsKKyAgICB4LT5lbmNvZGVyX2hhbmRsZSA9IE5VTEw7CisKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmV4dHJhZGF0YSk7CisgICAgaWYgKHgtPnR3b3Bhc3NidWZmZXIpIHsKKyAgICAgICAgYXZfZnJlZXAoJngtPnR3b3Bhc3NidWZmZXIpOworICAgICAgICBhdl9mcmVlcCgmeC0+b2xkX3R3b3Bhc3NidWZmZXIpOworICAgICAgICBhdmN0eC0+c3RhdHNfb3V0ID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHgtPnR3b3Bhc3NmZD49MCkgeworICAgICAgICB1bmxpbmsoeC0+dHdvcGFzc2ZpbGUpOworICAgICAgICBjbG9zZSh4LT50d29wYXNzZmQpOworICAgICAgICB4LT50d29wYXNzZmQgPSAtMTsKKyAgICB9CisgICAgYXZfZnJlZXAoJngtPnR3b3Bhc3NmaWxlKTsKKyAgICBhdl9mcmVlcCgmeC0+aW50cmFfbWF0cml4KTsKKyAgICBhdl9mcmVlcCgmeC0+aW50ZXJfbWF0cml4KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKHN0cnVjdCB4dmlkX2NvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAibHVtaV9hcSIsICAgICAiTHVtaW5hbmNlIG1hc2tpbmcgQVEiLCAgICAgICAgICAgIE9GRlNFVChsdW1pX2FxKSwgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwIH0sICAgICAgIDAsICAgICAgIDEsIFZFICAgICAgICAgfSwKKyAgICB7ICJ2YXJpYW5jZV9hcSIsICJWYXJpYW5jZSBBUSIsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHZhcmlhbmNlX2FxKSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDAgfSwgICAgICAgMCwgICAgICAgMSwgVkUgICAgICAgICB9LAorICAgIHsgInNzaW0iLCAgICAgICAgIlNob3cgU1NJTSBpbmZvcm1hdGlvbiB0byBzdGRvdXQiLCBPRkZTRVQoc3NpbSksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMCB9LCAgICAgICAwLCAgICAgICAyLCBWRSwgInNzaW0iIH0sCisgICAgeyAib2ZmIiwgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAwIH0sIElOVF9NSU4sIElOVF9NQVgsIFZFLCAic3NpbSIgfSwKKyAgICB7ICJhdmciLCAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDEgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJzc2ltIiB9LAorICAgIHsgImZyYW1lIiwgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgInNzaW0iIH0sCisgICAgeyAic3NpbV9hY2MiLCAgICAiU1NJTSBhY2N1cmFjeSIsICAgICAgICAgICAgICAgICAgIE9GRlNFVChzc2ltX2FjYyksICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAyIH0sICAgICAgIDAsICAgICAgIDQsIFZFICAgICAgICAgfSwKKyAgICB7ICJnbWMiLCAgICAgICAgICJ1c2UgR01DIiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGdtYyksICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDAgfSwgICAgICAgMCwgICAgICAgMSwgVkUgICAgICAgICB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgeHZpZF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJsaWJ4dmlkIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbGlieHZpZF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJ4dmlkIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGlieHZpZGNvcmUgTVBFRy00IHBhcnQgMiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHh2aWRfY29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0geHZpZF9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSB4dmlkX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSB4dmlkX2VuY29kZV9jbG9zZSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmeHZpZF9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJ4dmlkLmggYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ4dmlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmZTA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnh2aWQuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogY29weXJpZ2h0IChDKSAyMDA2IENvcmV5IEhpY2tleQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTElCWFZJRF9ICisjZGVmaW5lIEFWQ09ERUNfTElCWFZJRF9ICisKKy8qKgorICogQGZpbGUKKyAqIGNvbW1vbiBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoIHRoZSBYdmlkIHdyYXBwZXJzCisgKi8KKworaW50IGZmX3RlbXBmaWxlKGNvbnN0IGNoYXIgKnByZWZpeCwgY2hhciAqKmZpbGVuYW1lKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTElCWFZJRF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9saWJ4dmlkX3JjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9saWJ4dmlkX3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyYmVmMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnh2aWRfcmMuYwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIFh2aWQgcmF0ZSBjb250cm9sIHdyYXBwZXIgZm9yIGxhdmMgdmlkZW8gZW5jb2RlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgSEFWRV9JT19ICisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx4dmlkLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9maWxlLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibGlieHZpZC5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorCithdl9jb2xkIGludCBmZl94dmlkX3JhdGVfY29udHJvbF9pbml0KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGNoYXIgKnRtcF9uYW1lOworICAgIGludCBmZCwgaTsKKyAgICB4dmlkX3BsZ19jcmVhdGVfdCB4dmlkX3BsZ19jcmVhdGUgPSB7IDAgfTsKKyAgICB4dmlkX3BsdWdpbl8ycGFzczJfdCB4dmlkXzJwYXNzMiAgPSB7IDAgfTsKKworICAgIGZkID0gYXZfdGVtcGZpbGUoInh2aWRyYy4iLCAmdG1wX25hbWUsIDAsIHMtPmF2Y3R4KTsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbid0IGNyZWF0ZSB0ZW1wb3JhcnkgcGFzczIgZmlsZS5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPnJjX2NvbnRleHQubnVtX2VudHJpZXM7IGkrKykgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBmcmFtZV90eXBlc1tdID0gIiBpcGJzIjsKKyAgICAgICAgY2hhciB0bXBbMjU2XTsKKyAgICAgICAgUmF0ZUNvbnRyb2xFbnRyeSAqcmNlOworCisgICAgICAgIHJjZSA9ICZzLT5yY19jb250ZXh0LmVudHJ5W2ldOworCisgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICIlYyAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgZnJhbWVfdHlwZXNbcmNlLT5waWN0X3R5cGVdLAorICAgICAgICAgICAgICAgICAoaW50KSBscmludGYocmNlLT5xc2NhbGUgLyBGRl9RUDJMQU1CREEpLAorICAgICAgICAgICAgICAgICByY2UtPmlfY291bnQsIHMtPm1iX251bSAtIHJjZS0+aV9jb3VudCAtIHJjZS0+c2tpcF9jb3VudCwKKyAgICAgICAgICAgICAgICAgcmNlLT5za2lwX2NvdW50LAorICAgICAgICAgICAgICAgICAocmNlLT5pX3RleF9iaXRzICsgcmNlLT5wX3RleF9iaXRzICsgcmNlLT5taXNjX2JpdHMgKyA3KSAvIDgsCisgICAgICAgICAgICAgICAgIChyY2UtPmhlYWRlcl9iaXRzICsgcmNlLT5tdl9iaXRzICsgNykgLyA4KTsKKworICAgICAgICBpZiAod3JpdGUoZmQsIHRtcCwgc3RybGVuKHRtcCkpIDwgMCkgeworICAgICAgICAgICAgaW50IHJldCA9IEFWRVJST1IoZXJybm8pOworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yICVzIHdyaXRpbmcgMnBhc3MgbG9nZmlsZVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGF2X2ZyZWUodG1wX25hbWUpOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsb3NlKGZkKTsKKworICAgIHh2aWRfMnBhc3MyLnZlcnNpb24gICAgID0gWFZJRF9NQUtFX1ZFUlNJT04oMSwgMSwgMCk7CisgICAgeHZpZF8ycGFzczIuZmlsZW5hbWUgICAgPSB0bXBfbmFtZTsKKyAgICB4dmlkXzJwYXNzMi5iaXRyYXRlICAgICA9IHMtPmF2Y3R4LT5iaXRfcmF0ZTsKKyAgICB4dmlkXzJwYXNzMi52YnZfc2l6ZSAgICA9IHMtPmF2Y3R4LT5yY19idWZmZXJfc2l6ZTsKKyAgICB4dmlkXzJwYXNzMi52YnZfbWF4cmF0ZSA9IHMtPmF2Y3R4LT5yY19tYXhfcmF0ZTsKKyAgICB4dmlkXzJwYXNzMi52YnZfaW5pdGlhbCA9IHMtPmF2Y3R4LT5yY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3k7CisKKyAgICB4dmlkX3BsZ19jcmVhdGUudmVyc2lvbiA9IFhWSURfTUFLRV9WRVJTSU9OKDEsIDEsIDApOworICAgIHh2aWRfcGxnX2NyZWF0ZS5mYmFzZSAgID0gcy0+YXZjdHgtPnRpbWVfYmFzZS5kZW47CisgICAgeHZpZF9wbGdfY3JlYXRlLmZpbmNyICAgPSBzLT5hdmN0eC0+dGltZV9iYXNlLm51bTsKKyAgICB4dmlkX3BsZ19jcmVhdGUucGFyYW0gICA9ICZ4dmlkXzJwYXNzMjsKKworICAgIGlmICh4dmlkX3BsdWdpbl8ycGFzczIoTlVMTCwgWFZJRF9QTEdfQ1JFQVRFLCAmeHZpZF9wbGdfY3JlYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnJjX2NvbnRleHQubm9uX2xhdmNfb3BhcXVlKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInh2aWRfcGx1Z2luXzJwYXNzMiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitmbG9hdCBmZl94dmlkX3JhdGVfZXN0aW1hdGVfcXNjYWxlKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgZHJ5X3J1bikKK3sKKyAgICB4dmlkX3BsZ19kYXRhX3QgeHZpZF9wbGdfZGF0YSA9IHsgMCB9OworCisgICAgeHZpZF9wbGdfZGF0YS52ZXJzaW9uICAgICAgID0gWFZJRF9NQUtFX1ZFUlNJT04oMSwgMSwgMCk7CisgICAgeHZpZF9wbGdfZGF0YS53aWR0aCAgICAgICAgID0gcy0+d2lkdGg7CisgICAgeHZpZF9wbGdfZGF0YS5oZWlnaHQgICAgICAgID0gcy0+aGVpZ2h0OworICAgIHh2aWRfcGxnX2RhdGEubWJfd2lkdGggICAgICA9IHMtPm1iX3dpZHRoOworICAgIHh2aWRfcGxnX2RhdGEubWJfaGVpZ2h0ICAgICA9IHMtPm1iX2hlaWdodDsKKyAgICB4dmlkX3BsZ19kYXRhLmZiYXNlICAgICAgICAgPSBzLT5hdmN0eC0+dGltZV9iYXNlLmRlbjsKKyAgICB4dmlkX3BsZ19kYXRhLmZpbmNyICAgICAgICAgPSBzLT5hdmN0eC0+dGltZV9iYXNlLm51bTsKKyAgICB4dmlkX3BsZ19kYXRhLm1pbl9xdWFudFswXSAgPSBzLT5hdmN0eC0+cW1pbjsKKyAgICB4dmlkX3BsZ19kYXRhLm1pbl9xdWFudFsxXSAgPSBzLT5hdmN0eC0+cW1pbjsKKyAgICB4dmlkX3BsZ19kYXRhLm1pbl9xdWFudFsyXSAgPSBzLT5hdmN0eC0+cW1pbjsgICAvLyBGSVhNRSBpL2IgZmFjdG9yICYgb2Zmc2V0CisgICAgeHZpZF9wbGdfZGF0YS5tYXhfcXVhbnRbMF0gID0gcy0+YXZjdHgtPnFtYXg7CisgICAgeHZpZF9wbGdfZGF0YS5tYXhfcXVhbnRbMV0gID0gcy0+YXZjdHgtPnFtYXg7CisgICAgeHZpZF9wbGdfZGF0YS5tYXhfcXVhbnRbMl0gID0gcy0+YXZjdHgtPnFtYXg7ICAgLy8gRklYTUUgaS9iIGZhY3RvciAmIG9mZnNldAorICAgIHh2aWRfcGxnX2RhdGEuYnF1YW50X29mZnNldCA9IDA7ICAgICAgLy8gIDEwMCAqIHMtPmF2Y3R4LT5iX3F1YW50X29mZnNldDsKKyAgICB4dmlkX3BsZ19kYXRhLmJxdWFudF9yYXRpbyAgPSAxMDA7ICAgIC8vICAgICAgKiBzLT5hdmN0eC0+Yl9xdWFudF9mYWN0b3I7CisKKyAgICBpZiAoIXMtPnJjX2NvbnRleHQuZHJ5X3J1bl9xc2NhbGUpIHsKKyAgICAgICAgaWYgKHMtPnBpY3R1cmVfbnVtYmVyKSB7CisgICAgICAgICAgICB4dmlkX3BsZ19kYXRhLmxlbmd0aCAgICAgICAgPQorICAgICAgICAgICAgeHZpZF9wbGdfZGF0YS5zdGF0cy5sZW5ndGggID0gKHMtPmZyYW1lX2JpdHMgKyA3KSAvIDg7CisgICAgICAgICAgICB4dmlkX3BsZ19kYXRhLmZyYW1lX251bSAgICAgPSBzLT5yY19jb250ZXh0Lmxhc3RfcGljdHVyZV9udW1iZXI7CisgICAgICAgICAgICB4dmlkX3BsZ19kYXRhLnF1YW50ICAgICAgICAgPSBzLT5xc2NhbGU7CisgICAgICAgICAgICB4dmlkX3BsZ19kYXRhLnR5cGUgICAgICAgICAgPSBzLT5sYXN0X3BpY3RfdHlwZTsKKyAgICAgICAgICAgIGlmICh4dmlkX3BsdWdpbl8ycGFzczIocy0+cmNfY29udGV4dC5ub25fbGF2Y19vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhWSURfUExHX0FGVEVSLCAmeHZpZF9wbGdfZGF0YSwgTlVMTCkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgInh2aWRfcGx1Z2luXzJwYXNzMihoYW5kbGUsIFhWSURfUExHX0FGVEVSLCAuLi4pIEZBSUxFRFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHMtPnJjX2NvbnRleHQubGFzdF9waWN0dXJlX251bWJlciA9CisgICAgICAgIHh2aWRfcGxnX2RhdGEuZnJhbWVfbnVtICAgICAgICAgICA9IHMtPnBpY3R1cmVfbnVtYmVyOworICAgICAgICB4dmlkX3BsZ19kYXRhLnF1YW50ICAgICAgICAgICAgICAgPSAwOworICAgICAgICBpZiAoeHZpZF9wbHVnaW5fMnBhc3MyKHMtPnJjX2NvbnRleHQubm9uX2xhdmNfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhWSURfUExHX0JFRk9SRSwgJnh2aWRfcGxnX2RhdGEsIE5VTEwpKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAieHZpZF9wbHVnaW5fMnBhc3MyKGhhbmRsZSwgWFZJRF9QTEdfQkVGT1JFLCAuLi4pIEZBSUxFRFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcy0+cmNfY29udGV4dC5kcnlfcnVuX3FzY2FsZSA9IHh2aWRfcGxnX2RhdGEucXVhbnQ7CisgICAgfQorICAgIHh2aWRfcGxnX2RhdGEucXVhbnQgPSBzLT5yY19jb250ZXh0LmRyeV9ydW5fcXNjYWxlOworICAgIGlmICghZHJ5X3J1bikKKyAgICAgICAgcy0+cmNfY29udGV4dC5kcnlfcnVuX3FzY2FsZSA9IDA7CisKKyAgICAvLyBGSVhNRSB0aGlzIGlzIG5vdCBleGFjdGx5IGlkZW50aWNhbCB0byBYdmlkCisgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgcmV0dXJuIHh2aWRfcGxnX2RhdGEucXVhbnQgKiBGRl9RUDJMQU1CREEgKiBzLT5hdmN0eC0+Yl9xdWFudF9mYWN0b3IgKworICAgICAgICAgICAgcy0+YXZjdHgtPmJfcXVhbnRfb2Zmc2V0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHh2aWRfcGxnX2RhdGEucXVhbnQgKiBGRl9RUDJMQU1CREE7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl94dmlkX3JhdGVfY29udHJvbF91bmluaXQoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgeHZpZF9wbGdfZGVzdHJveV90IHh2aWRfcGxnX2Rlc3Ryb3k7CisKKyAgICB4dmlkX3BsdWdpbl8ycGFzczIocy0+cmNfY29udGV4dC5ub25fbGF2Y19vcGFxdWUsIFhWSURfUExHX0RFU1RST1ksCisgICAgICAgICAgICAgICAgICAgICAgICZ4dmlkX3BsZ19kZXN0cm95LCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnp2YmktdGVsZXRleHRkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xpYnp2YmktdGVsZXRleHRkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWMxYTVkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbGlienZiaS10ZWxldGV4dGRlYy5jCkBAIC0wLDAgKzEsNTcxIEBACisvKgorICogVGVsZXRleHQgZGVjb2RpbmcgZm9yIGZmbXBlZworICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAsIDIwMTIgV29sZnJhbSBHbG9nZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMyBNYXJ0b24gQmFsaW50CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hc3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisKKyNpbmNsdWRlIDxsaWJ6dmJpLmg+CisKKyNkZWZpbmUgVEVYVF9NQVhTWiAgICAoMjUgKiAoNTYgKyAxKSAqIDQgKyAyKQorI2RlZmluZSBWQklfTkJfQ09MT1JTIDQwCisjZGVmaW5lIFJHQkEocixnLGIsYSkgKCgoYSkgPDwgMjQpIHwgKChyKSA8PCAxNikgfCAoKGcpIDw8IDgpIHwgKGIpKQorI2RlZmluZSBWQklfUihyZ2JhKSAgICgoKHJnYmEpID4+IDApICYgMHhGRikKKyNkZWZpbmUgVkJJX0cocmdiYSkgICAoKChyZ2JhKSA+PiA4KSAmIDB4RkYpCisjZGVmaW5lIFZCSV9CKHJnYmEpICAgKCgocmdiYSkgPj4gMTYpICYgMHhGRikKKyNkZWZpbmUgVkJJX0EocmdiYSkgICAoKChyZ2JhKSA+PiAyNCkgJiAweEZGKQorI2RlZmluZSBNQVhfQlVGRkVSRURfUEFHRVMgMjUKKyNkZWZpbmUgQklUTUFQX0NIQVJfV0lEVEggIDEyCisjZGVmaW5lIEJJVE1BUF9DSEFSX0hFSUdIVCAxMAorI2RlZmluZSBNQVhfU0xJQ0VTIDY0CisKK3R5cGVkZWYgc3RydWN0IFRlbGV0ZXh0UGFnZQoreworICAgIEFWU3VidGl0bGVSZWN0ICpzdWJfcmVjdDsKKyAgICBpbnQgcGdubzsKKyAgICBpbnQgc3Vibm87CisgICAgaW50NjRfdCBwdHM7Cit9IFRlbGV0ZXh0UGFnZTsKKwordHlwZWRlZiBzdHJ1Y3QgVGVsZXRleHRDb250ZXh0Cit7CisgICAgQVZDbGFzcyAgICAgICAgKmNsYXNzOworICAgIGNoYXIgICAgICAgICAgICpwZ25vOworICAgIGludCAgICAgICAgICAgICB4X29mZnNldDsKKyAgICBpbnQgICAgICAgICAgICAgeV9vZmZzZXQ7CisgICAgaW50ICAgICAgICAgICAgIGZvcm1hdF9pZDsgLyogMCA9IGJpdG1hcCwgMSA9IHRleHQvYXNzICovCisgICAgaW50ICAgICAgICAgICAgIGNob3BfdG9wOworICAgIGludCAgICAgICAgICAgICBzdWJfZHVyYXRpb247IC8qIGluIG1zZWMgKi8KKyAgICBpbnQgICAgICAgICAgICAgdHJhbnNwYXJlbnRfYmc7CisgICAgaW50ICAgICAgICAgICAgIGNob3Bfc3BhY2VzOworCisgICAgaW50ICAgICAgICAgICAgIGxpbmVzX3Byb2Nlc3NlZDsKKyAgICBUZWxldGV4dFBhZ2UgICAgKnBhZ2VzOworICAgIGludCAgICAgICAgICAgICBuYl9wYWdlczsKKyAgICBpbnQ2NF90ICAgICAgICAgcHRzOworICAgIGludCAgICAgICAgICAgICBoYW5kbGVyX3JldDsKKworICAgIHZiaV9kZWNvZGVyICogICB2Ymk7CisjaWZkZWYgREVCVUcKKyAgICB2YmlfZXhwb3J0ICogICAgZXg7CisjZW5kaWYKKyAgICB2Ymlfc2xpY2VkICAgICAgc2xpY2VkW01BWF9TTElDRVNdOworfSBUZWxldGV4dENvbnRleHQ7CisKK3N0YXRpYyBpbnQgY2hvcF9zcGFjZXNfdXRmOChjb25zdCB1bnNpZ25lZCBjaGFyKiB0LCBpbnQgbGVuKQoreworICAgIHQgKz0gbGVuOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIGlmICgqLS10ICE9ICcgJyB8fCAobGVuLTEgPiAwICYmICoodC0xKSAmIDB4ODApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC0tbGVuOworICAgIH0KKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZCBzdWJ0aXRsZV9yZWN0X2ZyZWUoQVZTdWJ0aXRsZVJlY3QgKipzdWJfcmVjdCkKK3sKKyAgICBhdl9mcmVlcCgmKCpzdWJfcmVjdCktPnBpY3QuZGF0YVswXSk7CisgICAgYXZfZnJlZXAoJigqc3ViX3JlY3QpLT5waWN0LmRhdGFbMV0pOworICAgIGF2X2ZyZWVwKCYoKnN1Yl9yZWN0KS0+YXNzKTsKKyAgICBhdl9mcmVlcChzdWJfcmVjdCk7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2Fzc190ZXh0KFRlbGV0ZXh0Q29udGV4dCAqY3R4LCBjb25zdCBjaGFyICp0ZXh0LCBjaGFyICoqYXNzKQoreworICAgIGludCByZXQ7CisgICAgQVZCUHJpbnQgYnVmLCBidWYyOworICAgIGNvbnN0IGludCB0c19zdGFydCAgICA9IGF2X3Jlc2NhbGVfcShjdHgtPnB0cywgICAgICAgICAgQVZfVElNRV9CQVNFX1EsICAgICAgICAoQVZSYXRpb25hbCl7MSwgMTAwfSk7CisgICAgY29uc3QgaW50IHRzX2R1cmF0aW9uID0gYXZfcmVzY2FsZV9xKGN0eC0+c3ViX2R1cmF0aW9uLCAoQVZSYXRpb25hbCl7MSwgMTAwMH0sIChBVlJhdGlvbmFsKXsxLCAxMDB9KTsKKworICAgIC8qIEZpcnN0IHdlIGVzY2FwZSB0aGUgcGxhaW4gdGV4dCBpbnRvIGJ1Zi4gKi8KKyAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgIGZmX2Fzc19icHJpbnRfdGV4dF9ldmVudCgmYnVmLCB0ZXh0LCBzdHJsZW4odGV4dCksICIiLCAwKTsKKyAgICBhdl9icHJpbnRmKCZidWYsICJcclxuIik7CisKKyAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZSgmYnVmKSkgeworICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZiwgTlVMTCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLyogVGhlbiB3ZSBjcmVhdGUgdGhlIGFzcyBkaWFsb2cgbGluZSBpbiBidWYyIGZyb20gdGhlIGVzY2FwZWQgdGV4dCBpbiBidWYuICovCisgICAgYXZfYnByaW50X2luaXQoJmJ1ZjIsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgZmZfYXNzX2JwcmludF9kaWFsb2coJmJ1ZjIsIGJ1Zi5zdHIsIHRzX3N0YXJ0LCB0c19kdXJhdGlvbiwgMCk7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworCisgICAgaWYgKCFhdl9icHJpbnRfaXNfY29tcGxldGUoJmJ1ZjIpKSB7CisgICAgICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnVmMiwgTlVMTCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZjIsIGFzcykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCisvKiBEcmF3IGEgcGFnZSBhcyB0ZXh0ICovCitzdGF0aWMgaW50IGdlbl9zdWJfdGV4dChUZWxldGV4dENvbnRleHQgKmN0eCwgQVZTdWJ0aXRsZVJlY3QgKnN1Yl9yZWN0LCB2YmlfcGFnZSAqcGFnZSwgaW50IGNob3BfdG9wKQoreworICAgIGNvbnN0IGNoYXIgKmluOworICAgIEFWQlByaW50IGJ1ZjsKKyAgICBjaGFyICp2YmlfdGV4dCA9IGF2X21hbGxvYyhURVhUX01BWFNaKTsKKyAgICBpbnQgc3o7CisKKyAgICBpZiAoIXZiaV90ZXh0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3ogPSB2YmlfcHJpbnRfcGFnZV9yZWdpb24ocGFnZSwgdmJpX3RleHQsIFRFWFRfTUFYU1otMSwgIlVURi04IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0YWJsZSBtb2RlKi8gVFJVRSwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgIGNob3BfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLT5jb2x1bW5zLCBwYWdlLT5yb3dzLWNob3BfdG9wKTsKKyAgICBpZiAoc3ogPD0gMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJ2YmlfcHJpbnQgZXJyb3JcbiIpOworICAgICAgICBhdl9mcmVlKHZiaV90ZXh0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorICAgIHZiaV90ZXh0W3N6XSA9ICdcMCc7CisgICAgaW4gID0gdmJpX3RleHQ7CisgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMCwgVEVYVF9NQVhTWik7CisKKyAgICBpZiAoY3R4LT5jaG9wX3NwYWNlcykgeworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBpbnQgbmwsIHN6OworCisgICAgICAgICAgICAvLyBza2lwIGxlYWRpbmcgc3BhY2VzIGFuZCBuZXdsaW5lcworICAgICAgICAgICAgaW4gKz0gc3Ryc3BuKGluLCAiIFxuIik7CisgICAgICAgICAgICAvLyBjb21wdXRlIGVuZCBvZiByb3cKKyAgICAgICAgICAgIGZvciAobmwgPSAwOyBpbltubF07ICsrbmwpCisgICAgICAgICAgICAgICAgaWYgKGluW25sXSA9PSAnXG4nICYmIChubD09MCB8fCAhKGluW25sLTFdICYgMHg4MCkpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICghaW5bbmxdKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gc2tpcCB0cmFpbGluZyBzcGFjZXMKKyAgICAgICAgICAgIHN6ID0gY2hvcF9zcGFjZXNfdXRmOChpbiwgbmwpOworICAgICAgICAgICAgYXZfYnByaW50X2FwcGVuZF9kYXRhKCZidWYsIGluLCBzeik7CisgICAgICAgICAgICBhdl9icHJpbnRmKCZidWYsICJcbiIpOworICAgICAgICAgICAgaW4gKz0gbmw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhdl9icHJpbnRmKCZidWYsICIlc1xuIiwgdmJpX3RleHQpOworICAgIH0KKyAgICBhdl9mcmVlKHZiaV90ZXh0KTsKKworICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKCZidWYpKSB7CisgICAgICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnVmLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBpZiAoYnVmLmxlbikgeworICAgICAgICBpbnQgcmV0OworICAgICAgICBzdWJfcmVjdC0+dHlwZSA9IFNVQlRJVExFX0FTUzsKKyAgICAgICAgaWYgKChyZXQgPSBjcmVhdGVfYXNzX3RleHQoY3R4LCBidWYuc3RyLCAmc3ViX3JlY3QtPmFzcykpIDwgMCkgeworICAgICAgICAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJzdWJ0ZXh0OiVzOnR4ZXRidXNcbiIsIHN1Yl9yZWN0LT5hc3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN1Yl9yZWN0LT50eXBlID0gU1VCVElUTEVfTk9ORTsKKyAgICB9CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmaXhfdHJhbnNwYXJlbmN5KFRlbGV0ZXh0Q29udGV4dCAqY3R4LCBBVlN1YnRpdGxlUmVjdCAqc3ViX3JlY3QsIHZiaV9wYWdlICpwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hvcF90b3AsIHVpbnQ4X3QgdHJhbnNwYXJlbnRfY29sb3IsIGludCByZXN4LCBpbnQgcmVzeSkKK3sKKyAgICBpbnQgaXk7CisKKyAgICAvLyBIYWNrIGZvciB0cmFuc3BhcmVuY3ksIGluc3BpcmVkIGJ5IFZMQyBjb2RlLi4uCisgICAgZm9yIChpeSA9IDA7IGl5IDwgcmVzeTsgaXkrKykgeworICAgICAgICB1aW50OF90ICpwaXhlbCA9IHN1Yl9yZWN0LT5waWN0LmRhdGFbMF0gKyBpeSAqIHN1Yl9yZWN0LT5waWN0LmxpbmVzaXplWzBdOworICAgICAgICB2YmlfY2hhciAqdmMgPSBwYWdlLT50ZXh0ICsgKGl5IC8gQklUTUFQX0NIQVJfSEVJR0hUICsgY2hvcF90b3ApICogcGFnZS0+Y29sdW1uczsKKyAgICAgICAgdmJpX2NoYXIgKnZjbmV4dCA9IHZjICsgcGFnZS0+Y29sdW1uczsKKyAgICAgICAgZm9yICg7IHZjIDwgdmNuZXh0OyB2YysrKSB7CisgICAgICAgICAgICB1aW50OF90ICpwaXhlbG5leHQgPSBwaXhlbCArIEJJVE1BUF9DSEFSX1dJRFRIOworICAgICAgICAgICAgc3dpdGNoICh2Yy0+b3BhY2l0eSkgeworICAgICAgICAgICAgICAgIGNhc2UgVkJJX1RSQU5TUEFSRU5UX1NQQUNFOgorICAgICAgICAgICAgICAgICAgICBtZW1zZXQocGl4ZWwsIHRyYW5zcGFyZW50X2NvbG9yLCBCSVRNQVBfQ0hBUl9XSURUSCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVkJJX09QQVFVRToKKyAgICAgICAgICAgICAgICBjYXNlIFZCSV9TRU1JX1RSQU5TUEFSRU5UOgorICAgICAgICAgICAgICAgICAgICBpZiAoIWN0eC0+dHJhbnNwYXJlbnRfYmcpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZCSV9UUkFOU1BBUkVOVF9GVUxMOgorICAgICAgICAgICAgICAgICAgICBmb3IoOyBwaXhlbCA8IHBpeGVsbmV4dDsgcGl4ZWwrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqcGl4ZWwgPT0gdmMtPmJhY2tncm91bmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBpeGVsID0gdHJhbnNwYXJlbnRfY29sb3I7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGl4ZWwgPSBwaXhlbG5leHQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIERyYXcgYSBwYWdlIGFzIGJpdG1hcCAqLworc3RhdGljIGludCBnZW5fc3ViX2JpdG1hcChUZWxldGV4dENvbnRleHQgKmN0eCwgQVZTdWJ0aXRsZVJlY3QgKnN1Yl9yZWN0LCB2YmlfcGFnZSAqcGFnZSwgaW50IGNob3BfdG9wKQoreworICAgIGludCByZXN4ID0gcGFnZS0+Y29sdW1ucyAqIEJJVE1BUF9DSEFSX1dJRFRIOworICAgIGludCByZXN5ID0gKHBhZ2UtPnJvd3MgLSBjaG9wX3RvcCkgKiBCSVRNQVBfQ0hBUl9IRUlHSFQ7CisgICAgdWludDhfdCBjaSwgY21heCA9IDA7CisgICAgaW50IHJldDsKKyAgICB2YmlfY2hhciAqdmMgPSBwYWdlLT50ZXh0ICsgKGNob3BfdG9wICogcGFnZS0+Y29sdW1ucyk7CisgICAgdmJpX2NoYXIgKnZjZW5kID0gcGFnZS0+dGV4dCArIChwYWdlLT5yb3dzICogcGFnZS0+Y29sdW1ucyk7CisKKyAgICBmb3IgKDsgdmMgPCB2Y2VuZDsgdmMrKykgeworICAgICAgICBpZiAodmMtPm9wYWNpdHkgIT0gVkJJX1RSQU5TUEFSRU5UX1NQQUNFKSB7CisgICAgICAgICAgICBjbWF4ID0gVkJJX05CX0NPTE9SUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNtYXggPT0gMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJkcm9wcGluZyBlbXB0eSBwYWdlICUzeFxuIiwgcGFnZS0+cGdubyk7CisgICAgICAgIHN1Yl9yZWN0LT50eXBlID0gU1VCVElUTEVfTk9ORTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdnBpY3R1cmVfYWxsb2MoJnN1Yl9yZWN0LT5waWN0LCBBVl9QSVhfRk1UX1BBTDgsIHJlc3gsIHJlc3kpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgLy8gWWVzLCB3ZSB3YW50IHRvIGFsbG9jYXRlIHRoZSBwYWxldHRlIG9uIG91ciBvd24gYmVjYXVzZSBBVlN1YnRpdGxlIHdvcmtzIHRoaXMgd2F5CisgICAgc3ViX3JlY3QtPnBpY3QuZGF0YVsxXSA9IE5VTEw7CisKKyAgICB2YmlfZHJhd192dF9wYWdlX3JlZ2lvbihwYWdlLCBWQklfUElYRk1UX1BBTDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3JlY3QtPnBpY3QuZGF0YVswXSwgc3ViX3JlY3QtPnBpY3QubGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgY2hvcF90b3AsIHBhZ2UtPmNvbHVtbnMsIHBhZ2UtPnJvd3MgLSBjaG9wX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJldmVhbCovIDEsIC8qZmxhc2gqLyAxKTsKKworICAgIGZpeF90cmFuc3BhcmVuY3koY3R4LCBzdWJfcmVjdCwgcGFnZSwgY2hvcF90b3AsIGNtYXgsIHJlc3gsIHJlc3kpOworICAgIHN1Yl9yZWN0LT54ID0gY3R4LT54X29mZnNldDsKKyAgICBzdWJfcmVjdC0+eSA9IGN0eC0+eV9vZmZzZXQgKyBjaG9wX3RvcCAqIEJJVE1BUF9DSEFSX0hFSUdIVDsKKyAgICBzdWJfcmVjdC0+dyA9IHJlc3g7CisgICAgc3ViX3JlY3QtPmggPSByZXN5OworICAgIHN1Yl9yZWN0LT5uYl9jb2xvcnMgPSAoaW50KWNtYXggKyAxOworICAgIHN1Yl9yZWN0LT5waWN0LmRhdGFbMV0gPSBhdl9tYWxsb2N6KEFWUEFMRVRURV9TSVpFKTsKKyAgICBpZiAoIXN1Yl9yZWN0LT5waWN0LmRhdGFbMV0pIHsKKyAgICAgICAgYXZfZnJlZXAoJnN1Yl9yZWN0LT5waWN0LmRhdGFbMF0pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjbWF4OyBjaSsrKSB7CisgICAgICAgIGludCByLCBnLCBiLCBhOworCisgICAgICAgIHIgPSBWQklfUihwYWdlLT5jb2xvcl9tYXBbY2ldKTsKKyAgICAgICAgZyA9IFZCSV9HKHBhZ2UtPmNvbG9yX21hcFtjaV0pOworICAgICAgICBiID0gVkJJX0IocGFnZS0+Y29sb3JfbWFwW2NpXSk7CisgICAgICAgIGEgPSBWQklfQShwYWdlLT5jb2xvcl9tYXBbY2ldKTsKKyAgICAgICAgKCh1aW50MzJfdCAqKXN1Yl9yZWN0LT5waWN0LmRhdGFbMV0pW2NpXSA9IFJHQkEociwgZywgYiwgYSk7CisgICAgICAgIGF2X2Rsb2coY3R4LCAicGFsZXR0ZSAlMHhcbiIsICgodWludDMyX3QgKilzdWJfcmVjdC0+cGljdC5kYXRhWzFdKVtjaV0pOworICAgIH0KKyAgICAoKHVpbnQzMl90ICopc3ViX3JlY3QtPnBpY3QuZGF0YVsxXSlbY21heF0gPSBSR0JBKDAsIDAsIDAsIDApOworICAgIHN1Yl9yZWN0LT50eXBlID0gU1VCVElUTEVfQklUTUFQOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVyKHZiaV9ldmVudCAqZXYsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBUZWxldGV4dENvbnRleHQgKmN0eCA9IHVzZXJfZGF0YTsKKyAgICBUZWxldGV4dFBhZ2UgKm5ld19wYWdlczsKKyAgICB2YmlfcGFnZSBwYWdlOworICAgIGludCByZXM7CisgICAgY2hhciBwZ25vX3N0clsxMl07CisgICAgdmJpX3N1Ym5vIHN1Ym5vOworICAgIHZiaV9wYWdlX3R5cGUgdnB0OworICAgIGludCBjaG9wX3RvcDsKKyAgICBjaGFyICpsYW5nOworCisgICAgc25wcmludGYocGdub19zdHIsIHNpemVvZiBwZ25vX3N0ciwgIiUwM3giLCBldi0+ZXYudHR4X3BhZ2UucGdubyk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiZGVjb2RlZCBwYWdlICVzLiUwMnhcbiIsCisgICAgICAgICAgIHBnbm9fc3RyLCBldi0+ZXYudHR4X3BhZ2Uuc3Vibm8gJiAweEZGKTsKKworICAgIGlmIChzdHJjbXAoY3R4LT5wZ25vLCAiKiIpICYmICFzdHJzdHIoY3R4LT5wZ25vLCBwZ25vX3N0cikpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoY3R4LT5oYW5kbGVyX3JldCA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIHJlcyA9IHZiaV9mZXRjaF92dF9wYWdlKGN0eC0+dmJpLCAmcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi0+ZXYudHR4X3BhZ2UucGdubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi0+ZXYudHR4X3BhZ2Uuc3Vibm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkJJX1dTVF9MRVZFTF8zcDUsIDI1LCBUUlVFKTsKKworICAgIGlmICghcmVzKQorICAgICAgICByZXR1cm47CisKKyNpZmRlZiBERUJVRworICAgIGZwcmludGYoc3RkZXJyLCAiXG5TYXZpbmcgcmVzPSVkIGR5MD0lZCBkeTE9JWQuLi5cbiIsCisgICAgICAgICAgICByZXMsIHBhZ2UuZGlydHkueTAsIHBhZ2UuZGlydHkueTEpOworICAgIGZmbHVzaChzdGRlcnIpOworCisgICAgaWYgKCF2YmlfZXhwb3J0X3N0ZGlvKGN0eC0+ZXgsIHN0ZGVyciwgJnBhZ2UpKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZDogJXNcbiIsIHZiaV9leHBvcnRfZXJyc3RyKGN0eC0+ZXgpKTsKKyNlbmRpZgorCisgICAgdnB0ID0gdmJpX2NsYXNzaWZ5X3BhZ2UoY3R4LT52YmksIGV2LT5ldi50dHhfcGFnZS5wZ25vLCAmc3Vibm8sICZsYW5nKTsKKyAgICBjaG9wX3RvcCA9IGN0eC0+Y2hvcF90b3AgfHwKKyAgICAgICAgKChwYWdlLnJvd3MgPiAxKSAmJiAodnB0ID09IFZCSV9TVUJUSVRMRV9QQUdFKSk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICIlZCB4ICVkIHBhZ2UgY2hvcDolZFxuIiwKKyAgICAgICAgICAgcGFnZS5jb2x1bW5zLCBwYWdlLnJvd3MsIGNob3BfdG9wKTsKKworICAgIGlmIChjdHgtPm5iX3BhZ2VzIDwgTUFYX0JVRkZFUkVEX1BBR0VTKSB7CisgICAgICAgIGlmICgobmV3X3BhZ2VzID0gYXZfcmVhbGxvY19hcnJheShjdHgtPnBhZ2VzLCBjdHgtPm5iX3BhZ2VzICsgMSwgc2l6ZW9mKFRlbGV0ZXh0UGFnZSkpKSkgeworICAgICAgICAgICAgVGVsZXRleHRQYWdlICpjdXJfcGFnZSA9IG5ld19wYWdlcyArIGN0eC0+bmJfcGFnZXM7CisgICAgICAgICAgICBjdHgtPnBhZ2VzID0gbmV3X3BhZ2VzOworICAgICAgICAgICAgY3VyX3BhZ2UtPnN1Yl9yZWN0ID0gYXZfbWFsbG9jeihzaXplb2YoKmN1cl9wYWdlLT5zdWJfcmVjdCkpOworICAgICAgICAgICAgY3VyX3BhZ2UtPnB0cyA9IGN0eC0+cHRzOworICAgICAgICAgICAgY3VyX3BhZ2UtPnBnbm8gPSBldi0+ZXYudHR4X3BhZ2UucGdubzsKKyAgICAgICAgICAgIGN1cl9wYWdlLT5zdWJubyA9IGV2LT5ldi50dHhfcGFnZS5zdWJubzsKKyAgICAgICAgICAgIGlmIChjdXJfcGFnZS0+c3ViX3JlY3QpIHsKKyAgICAgICAgICAgICAgICByZXMgPSAoY3R4LT5mb3JtYXRfaWQgPT0gMCkgPworICAgICAgICAgICAgICAgICAgICBnZW5fc3ViX2JpdG1hcChjdHgsIGN1cl9wYWdlLT5zdWJfcmVjdCwgJnBhZ2UsIGNob3BfdG9wKSA6CisgICAgICAgICAgICAgICAgICAgIGdlbl9zdWJfdGV4dCAgKGN0eCwgY3VyX3BhZ2UtPnN1Yl9yZWN0LCAmcGFnZSwgY2hvcF90b3ApOworICAgICAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZjdXJfcGFnZS0+c3ViX3JlY3QpOworICAgICAgICAgICAgICAgICAgICBjdHgtPmhhbmRsZXJfcmV0ID0gcmVzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+cGFnZXNbY3R4LT5uYl9wYWdlcysrXSA9ICpjdXJfcGFnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN0eC0+aGFuZGxlcl9yZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdHgtPmhhbmRsZXJfcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy9UT0RPOiBJZiBtdWx0aXBsZSBwYWNrZXRzIGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBwYWdlLCBwYWdlcyBtYXkgZ290IHF1ZXVlZCB1cCwgYW5kIHRoaXMgbWF5IGhhcHBlbi4uLgorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJCdWZmZXJlZCB0b28gbWFueSBwYWdlcywgZHJvcHBpbmcgcGFnZSAlcy5cbiIsIHBnbm9fc3RyKTsKKyAgICAgICAgY3R4LT5oYW5kbGVyX3JldCA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICB2YmlfdW5yZWZfcGFnZSgmcGFnZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRhdGFfaWRlbnRpZmllcl9pc190ZWxldGV4dChpbnQgZGF0YV9pZGVudGlmaWVyKSB7CisgICAgLyogU2VlIEVOIDMwMSA3NzUgc2VjdGlvbiA0LjQuMi4gKi8KKyAgICByZXR1cm4gKGRhdGFfaWRlbnRpZmllciA+PSAweDEwICYmIGRhdGFfaWRlbnRpZmllciA8PSAweDFGIHx8CisgICAgICAgICAgICBkYXRhX2lkZW50aWZpZXIgPj0gMHg5OSAmJiBkYXRhX2lkZW50aWZpZXIgPD0gMHg5Qik7Cit9CisKK3N0YXRpYyBpbnQgc2xpY2VfdG9fdmJpX2xpbmVzKFRlbGV0ZXh0Q29udGV4dCAqY3R4LCB1aW50OF90KiBidWYsIGludCBzaXplKQoreworICAgIGludCBsaW5lcyA9IDA7CisgICAgd2hpbGUgKHNpemUgPj0gMiAmJiBsaW5lcyA8IE1BWF9TTElDRVMpIHsKKyAgICAgICAgaW50IGRhdGFfdW5pdF9pZCAgICAgPSBidWZbMF07CisgICAgICAgIGludCBkYXRhX3VuaXRfbGVuZ3RoID0gYnVmWzFdOworICAgICAgICBpZiAoZGF0YV91bml0X2xlbmd0aCArIDIgPiBzaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmIChkYXRhX3VuaXRfaWQgPT0gMHgwMiB8fCBkYXRhX3VuaXRfaWQgPT0gMHgwMykgeworICAgICAgICAgICAgaWYgKGRhdGFfdW5pdF9sZW5ndGggIT0gMHgyYykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCBsaW5lX29mZnNldCAgPSBidWZbMl0gJiAweDFmOworICAgICAgICAgICAgICAgIGludCBmaWVsZF9wYXJpdHkgPSBidWZbMl0gJiAweDIwOworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGN0eC0+c2xpY2VkW2xpbmVzXS5pZCA9IFZCSV9TTElDRURfVEVMRVRFWFRfQjsKKyAgICAgICAgICAgICAgICBjdHgtPnNsaWNlZFtsaW5lc10ubGluZSA9IChsaW5lX29mZnNldCA+IDAgPyAobGluZV9vZmZzZXQgKyAoZmllbGRfcGFyaXR5ID8gMCA6IDMxMykpIDogMCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQyOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGN0eC0+c2xpY2VkW2xpbmVzXS5kYXRhW2ldID0gdmJpX3JldjgoYnVmWzQgKyBpXSk7CisgICAgICAgICAgICAgICAgbGluZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzaXplIC09IGRhdGFfdW5pdF9sZW5ndGggKyAyOworICAgICAgICBidWYgKz0gZGF0YV91bml0X2xlbmd0aCArIDI7CisgICAgfQorICAgIGlmIChzaXplKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIiVkIGJ5dGVzIHJlbWFpbmVkIGFmdGVyIHNsaWNpbmcgZGF0YVxuIiwgc2l6ZSk7CisgICAgcmV0dXJuIGxpbmVzOworfQorCitzdGF0aWMgaW50IHRlbGV0ZXh0X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZGF0YV9zaXplLCBBVlBhY2tldCAqcGt0KQoreworICAgIFRlbGV0ZXh0Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVlN1YnRpdGxlICAgICAgKnN1YiA9IGRhdGE7CisgICAgaW50ICAgICAgICAgICAgIHJldCA9IDA7CisKKyAgICBpZiAoIWN0eC0+dmJpKSB7CisgICAgICAgIGlmICghKGN0eC0+dmJpID0gdmJpX2RlY29kZXJfbmV3KCkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKCF2YmlfZXZlbnRfaGFuZGxlcl9hZGQoY3R4LT52YmksIFZCSV9FVkVOVF9UVFhfUEFHRSwgaGFuZGxlciwgY3R4KSkgeworICAgICAgICAgICAgdmJpX2RlY29kZXJfZGVsZXRlKGN0eC0+dmJpKTsKKyAgICAgICAgICAgIGN0eC0+dmJpID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPnBrdF90aW1lYmFzZS5kZW4gJiYgcGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGN0eC0+cHRzID0gYXZfcmVzY2FsZV9xKHBrdC0+cHRzLCBhdmN0eC0+cGt0X3RpbWViYXNlLCBBVl9USU1FX0JBU0VfUSk7CisKKyAgICBpZiAocGt0LT5zaXplKSB7CisgICAgICAgIGludCBsaW5lczsKKyAgICAgICAgY29uc3QgaW50IGZ1bGxfcGVzX3NpemUgPSBwa3QtPnNpemUgKyA0NTsgLyogUEVTIGhlYWRlciBpcyA0NSBieXRlcyAqLworCisgICAgICAgIC8vIFdlIGFsbG93IHVucmVhc29uYWJseSBiaWcgcGFja2V0cywgZXZlbiBpZiB0aGUgc3RhbmRhcmQgb25seSBhbGxvd3MgYSBtYXggc2l6ZSBvZiAxNDcyCisgICAgICAgIGlmIChmdWxsX3Blc19zaXplIDwgMTg0IHx8IGZ1bGxfcGVzX3NpemUgPiA2NTUwNCB8fCBmdWxsX3Blc19zaXplICUgMTg0ICE9IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBjdHgtPmhhbmRsZXJfcmV0ID0gcGt0LT5zaXplOworCisgICAgICAgIGlmIChkYXRhX2lkZW50aWZpZXJfaXNfdGVsZXRleHQoKnBrdC0+ZGF0YSkpIHsKKyAgICAgICAgICAgIGlmICgobGluZXMgPSBzbGljZV90b192YmlfbGluZXMoY3R4LCBwa3QtPmRhdGEgKyAxLCBwa3QtPnNpemUgLSAxKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBsaW5lczsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZjdHgsICJjdHg9JXAgYnVmX3NpemU9JWQgbGluZXM9JXUgcGt0X3B0cz0lNy4zZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgY3R4LCBwa3QtPnNpemUsIGxpbmVzLCAoZG91YmxlKXBrdC0+cHRzLzkwMDAwLjApOworICAgICAgICAgICAgaWYgKGxpbmVzID4gMCkgeworI2lmZGVmIERFQlVHCisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJsaW5lIG51bWJlcnM6Iik7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGluZXM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgJWQiLCBjdHgtPnNsaWNlZFtpXS5saW5lKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB2YmlfZGVjb2RlKGN0eC0+dmJpLCBjdHgtPnNsaWNlZCwgbGluZXMsIDAuMCk7CisgICAgICAgICAgICAgICAgY3R4LT5saW5lc19wcm9jZXNzZWQgKz0gbGluZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgcmV0ID0gY3R4LT5oYW5kbGVyX3JldDsKKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8vIGlzIHRoZXJlIGEgc3VidGl0bGUgdG8gcGFzcz8KKyAgICBpZiAoY3R4LT5uYl9wYWdlcykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgc3ViLT5mb3JtYXQgPSBjdHgtPmZvcm1hdF9pZDsKKyAgICAgICAgc3ViLT5zdGFydF9kaXNwbGF5X3RpbWUgPSAwOworICAgICAgICBzdWItPmVuZF9kaXNwbGF5X3RpbWUgPSBjdHgtPnN1Yl9kdXJhdGlvbjsKKyAgICAgICAgc3ViLT5udW1fcmVjdHMgPSAwOworICAgICAgICBzdWItPnB0cyA9IGN0eC0+cGFnZXMtPnB0czsKKworICAgICAgICBpZiAoY3R4LT5wYWdlcy0+c3ViX3JlY3QtPnR5cGUgIT0gU1VCVElUTEVfTk9ORSkgeworICAgICAgICAgICAgc3ViLT5yZWN0cyA9IGF2X21hbGxvYyhzaXplb2YoKnN1Yi0+cmVjdHMpKTsKKyAgICAgICAgICAgIGlmIChzdWItPnJlY3RzKSB7CisgICAgICAgICAgICAgICAgc3ViLT5udW1fcmVjdHMgPSAxOworICAgICAgICAgICAgICAgIHN1Yi0+cmVjdHNbMF0gPSBjdHgtPnBhZ2VzLT5zdWJfcmVjdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJzZW5kaW5nIGVtcHR5IHN1YlxuIik7CisgICAgICAgICAgICBzdWItPnJlY3RzID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN1Yi0+cmVjdHMpIC8vIG5vIHJlY3Qgd2FzIHBhc3NlZAorICAgICAgICAgICAgc3VidGl0bGVfcmVjdF9mcmVlKCZjdHgtPnBhZ2VzLT5zdWJfcmVjdCk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfcGFnZXMgLSAxOyBpKyspCisgICAgICAgICAgICBjdHgtPnBhZ2VzW2ldID0gY3R4LT5wYWdlc1tpICsgMV07CisgICAgICAgIGN0eC0+bmJfcGFnZXMtLTsKKworICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAqZGF0YV9zaXplID0gMTsKKyAgICB9IGVsc2UKKyAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRlbGV0ZXh0X2luaXRfZGVjb2RlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVGVsZXRleHRDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVuc2lnbmVkIGludCBtYWosIG1pbiwgcmV2OworCisgICAgdmJpX3ZlcnNpb24oJm1haiwgJm1pbiwgJnJldik7CisgICAgaWYgKCEobWFqID4gMCB8fCBtaW4gPiAyIHx8IG1pbiA9PSAyICYmIHJldiA+PSAyNikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkZWNvZGVyIG5lZWRzIHp2YmkgdmVyc2lvbiA+PSAwLjIuMjYuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgaWYgKGN0eC0+Zm9ybWF0X2lkID09IDApIHsKKyAgICAgICAgYXZjdHgtPndpZHRoICA9IDQxICogQklUTUFQX0NIQVJfV0lEVEg7CisgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSAyNSAqIEJJVE1BUF9DSEFSX0hFSUdIVDsKKyAgICB9CisKKyAgICBjdHgtPnZiaSA9IE5VTEw7CisgICAgY3R4LT5wdHMgPSBBVl9OT1BUU19WQUxVRTsKKworI2lmZGVmIERFQlVHCisgICAgeworICAgICAgICBjaGFyICp0OworICAgICAgICBjdHgtPmV4ID0gdmJpX2V4cG9ydF9uZXcoInRleHQiLCAmdCk7CisgICAgfQorI2VuZGlmCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgInBhZ2UgZmlsdGVyOiAlc1xuIiwgY3R4LT5wZ25vKTsKKyAgICByZXR1cm4gKGN0eC0+Zm9ybWF0X2lkID09IDEpID8gZmZfYXNzX3N1YnRpdGxlX2hlYWRlcl9kZWZhdWx0KGF2Y3R4KSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgdGVsZXRleHRfY2xvc2VfZGVjb2RlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVGVsZXRleHRDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZGxvZyhhdmN0eCwgImxpbmVzX3RvdGFsPSV1XG4iLCBjdHgtPmxpbmVzX3Byb2Nlc3NlZCk7CisgICAgd2hpbGUgKGN0eC0+bmJfcGFnZXMpCisgICAgICAgIHN1YnRpdGxlX3JlY3RfZnJlZSgmY3R4LT5wYWdlc1stLWN0eC0+bmJfcGFnZXNdLnN1Yl9yZWN0KTsKKyAgICBhdl9mcmVlcCgmY3R4LT5wYWdlcyk7CisKKyAgICB2YmlfZGVjb2Rlcl9kZWxldGUoY3R4LT52YmkpOworICAgIGN0eC0+dmJpID0gTlVMTDsKKyAgICBjdHgtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZWxldGV4dF9mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgdGVsZXRleHRfY2xvc2VfZGVjb2RlcihhdmN0eCk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFRlbGV0ZXh0Q29udGV4dCwgeCkKKyNkZWZpbmUgU0QgQVZfT1BUX0ZMQUdfU1VCVElUTEVfUEFSQU0gfCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7InR4dF9wYWdlIiwgICAgICAgICJsaXN0IG9mIHRlbGV0ZXh0IHBhZ2UgbnVtYmVycyB0byBkZWNvZGUsICogaXMgYWxsIiwgT0ZGU0VUKHBnbm8pLCAgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICIqIn0sICAgICAgMCwgMCwgICAgICAgIFNEfSwKKyAgICB7InR4dF9jaG9wX3RvcCIsICAgICJkaXNjYXJkcyB0aGUgdG9wIHRlbGV0ZXh0IGxpbmUiLCAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGNob3BfdG9wKSwgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDF9LCAgICAgICAgMCwgMSwgICAgICAgIFNEfSwKKyAgICB7InR4dF9mb3JtYXQiLCAgICAgICJmb3JtYXQgb2YgdGhlIHN1YnRpdGxlcyAoYml0bWFwIG9yIHRleHQpIiwgICAgICAgICAgT0ZGU0VUKGZvcm1hdF9pZCksICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDB9LCAgICAgICAgMCwgMSwgICAgICAgIFNELCAgInR4dF9mb3JtYXQifSwKKyAgICB7ImJpdG1hcCIsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IDB9LCAgICAgICAgMCwgMCwgICAgICAgIFNELCAgInR4dF9mb3JtYXQifSwKKyAgICB7InRleHQiLCAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IDF9LCAgICAgICAgMCwgMCwgICAgICAgIFNELCAgInR4dF9mb3JtYXQifSwKKyAgICB7InR4dF9sZWZ0IiwgICAgICAgICJ4IG9mZnNldCBvZiBnZW5lcmF0ZWQgYml0bWFwcyIsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHhfb2Zmc2V0KSwgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDB9LCAgICAgICAgMCwgNjU1MzUsICAgIFNEfSwKKyAgICB7InR4dF90b3AiLCAgICAgICAgICJ5IG9mZnNldCBvZiBnZW5lcmF0ZWQgYml0bWFwcyIsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHlfb2Zmc2V0KSwgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDB9LCAgICAgICAgMCwgNjU1MzUsICAgIFNEfSwKKyAgICB7InR4dF9jaG9wX3NwYWNlcyIsICJjaG9wcyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgZnJvbSB0ZXh0IiwgICAgICAgT0ZGU0VUKGNob3Bfc3BhY2VzKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDF9LCAgICAgICAgMCwgMSwgICAgICAgIFNEfSwKKyAgICB7InR4dF9kdXJhdGlvbiIsICAgICJkaXNwbGF5IGR1cmF0aW9uIG9mIHRlbGV0ZXh0IHBhZ2VzIGluIG1zZWNzIiwgICAgICAgT0ZGU0VUKHN1Yl9kdXJhdGlvbiksICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDMwMDAwfSwgICAgMCwgODY0MDAwMDAsIFNEfSwKKyAgICB7InR4dF90cmFuc3BhcmVudCIsICJmb3JjZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIG9mIHRoZSB0ZWxldGV4dCIsICAgICAgT0ZGU0VUKHRyYW5zcGFyZW50X2JnKSwgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDB9LCAgICAgICAgMCwgMSwgICAgICAgIFNEfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHRlbGV0ZXh0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImxpYnp2YmlfdGVsZXRleHRkZWMiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9saWJ6dmJpX3RlbGV0ZXh0X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICA9ICJsaWJ6dmJpX3RlbGV0ZXh0ZGVjIiwKKyAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkxpYnp2YmkgRFZCIHRlbGV0ZXh0IGRlY29kZXIiKSwKKyAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9EVkJfVEVMRVRFWFQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFRlbGV0ZXh0Q29udGV4dCksCisgICAgLmluaXQgICAgICA9IHRlbGV0ZXh0X2luaXRfZGVjb2RlciwKKyAgICAuY2xvc2UgICAgID0gdGVsZXRleHRfY2xvc2VfZGVjb2RlciwKKyAgICAuZGVjb2RlICAgID0gdGVsZXRleHRfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgPSBDT0RFQ19DQVBfREVMQVksCisgICAgLmZsdXNoICAgICA9IHRlbGV0ZXh0X2ZsdXNoLAorICAgIC5wcml2X2NsYXNzPSAmdGVsZXRleHRfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbGpwZWdlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xqcGVnZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhZTE1MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xqcGVnZW5jLmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKiBsb3NzbGVzcyBKUEVHIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMyBBbGV4IEJlcmVnc3phc3ppCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogU3VwcG9ydCBmb3IgZXh0ZXJuYWwgaHVmZm1hbiB0YWJsZSwgdmFyaW91cyBmaXhlcyAoQVZJRCB3b3JrYXJvdW5kKSwKKyAqIGFzcGVjdGluZywgbmV3IGRlY29kZV9mcmFtZSBtZWNoYW5pc20gYW5kIGFwcGxlIG1qcGVnLWIgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBsb3NzbGVzcyBKUEVHIGVuY29kZXIuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1qcGVnZW5jX2NvbW1vbi5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgIm1qcGVnLmgiCisjaW5jbHVkZSAibWpwZWdlbmMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTEpwZWdFbmNDb250ZXh0IHsKKyAgICBJRENURFNQQ29udGV4dCBpZHNwOworICAgIFNjYW5UYWJsZSBzY2FudGFibGU7CisgICAgdWludDE2X3QgbWF0cml4WzY0XTsKKworICAgIGludCB2c2FtcGxlWzNdOworICAgIGludCBoc2FtcGxlWzNdOworCisgICAgdWludDE2X3QgaHVmZl9jb2RlX2RjX2x1bWluYW5jZVsxMl07CisgICAgdWludDE2X3QgaHVmZl9jb2RlX2RjX2Nocm9taW5hbmNlWzEyXTsKKyAgICB1aW50OF90ICBodWZmX3NpemVfZGNfbHVtaW5hbmNlWzEyXTsKKyAgICB1aW50OF90ICBodWZmX3NpemVfZGNfY2hyb21pbmFuY2VbMTJdOworCisgICAgdWludDE2X3QgKCpzY3JhdGNoKVs0XTsKK30gTEpwZWdFbmNDb250ZXh0OworCitzdGF0aWMgaW50IGxqcGVnX2VuY29kZV9iZ3IoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBQdXRCaXRDb250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBMSnBlZ0VuY0NvbnRleHQgKnMgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IGludCB3aWR0aCAgICAgICA9IGZyYW1lLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ICAgICAgPSBmcmFtZS0+aGVpZ2h0OworICAgIGNvbnN0IGludCBsaW5lc2l6ZSAgICA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB1aW50MTZfdCAoKmJ1ZmZlcilbNF0gPSBzLT5zY3JhdGNoOworICAgIGNvbnN0IGludCBwcmVkaWN0b3IgICA9IGF2Y3R4LT5wcmVkaWN0aW9uX21ldGhvZCsxOworICAgIGludCBsZWZ0WzNdLCB0b3BbM10sIHRvcGxlZnRbM107CisgICAgaW50IHgsIHksIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICBidWZmZXJbMF1baV0gPSAxIDw8ICg5IC0gMSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgY29uc3QgaW50IG1vZGlmaWVkX3ByZWRpY3RvciA9IHkgPyBwcmVkaWN0b3IgOiAxOworICAgICAgICB1aW50OF90ICpwdHIgPSBmcmFtZS0+ZGF0YVswXSArIChsaW5lc2l6ZSAqIHkpOworCisgICAgICAgIGlmIChwYi0+YnVmX2VuZCAtIHBiLT5idWYgLSAocHV0X2JpdHNfY291bnQocGIpID4+IDMpIDwgd2lkdGggKiAzICogNCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlbmNvZGVkIGZyYW1lIHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgdG9wW2ldPSBsZWZ0W2ldPSB0b3BsZWZ0W2ldPSBidWZmZXJbMF1baV07CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGlmKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfQkdSMjQpeworICAgICAgICAgICAgICAgIGJ1ZmZlclt4XVsxXSA9ICBwdHJbMyAqIHggKyAwXSAtICAgICBwdHJbMyAqIHggKyAxXSArIDB4MTAwOworICAgICAgICAgICAgICAgIGJ1ZmZlclt4XVsyXSA9ICBwdHJbMyAqIHggKyAyXSAtICAgICBwdHJbMyAqIHggKyAxXSArIDB4MTAwOworICAgICAgICAgICAgICAgIGJ1ZmZlclt4XVswXSA9IChwdHJbMyAqIHggKyAwXSArIDIgKiBwdHJbMyAqIHggKyAxXSArIHB0clszICogeCArIDJdKSA+PiAyOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgYnVmZmVyW3hdWzFdID0gIHB0cls0ICogeCArIDBdIC0gICAgIHB0cls0ICogeCArIDFdICsgMHgxMDA7CisgICAgICAgICAgICAgICAgYnVmZmVyW3hdWzJdID0gIHB0cls0ICogeCArIDJdIC0gICAgIHB0cls0ICogeCArIDFdICsgMHgxMDA7CisgICAgICAgICAgICAgICAgYnVmZmVyW3hdWzBdID0gKHB0cls0ICogeCArIDBdICsgMiAqIHB0cls0ICogeCArIDFdICsgcHRyWzQgKiB4ICsgMl0pID4+IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgcHJlZCwgZGlmZjsKKworICAgICAgICAgICAgICAgIFBSRURJQ1QocHJlZCwgdG9wbGVmdFtpXSwgdG9wW2ldLCBsZWZ0W2ldLCBtb2RpZmllZF9wcmVkaWN0b3IpOworCisgICAgICAgICAgICAgICAgdG9wbGVmdFtpXSA9IHRvcFtpXTsKKyAgICAgICAgICAgICAgICB0b3BbaV0gICAgID0gYnVmZmVyW3grMV1baV07CisKKyAgICAgICAgICAgICAgICBsZWZ0W2ldICAgID0gYnVmZmVyW3hdW2ldOworCisgICAgICAgICAgICAgICAgZGlmZiAgICAgICA9ICgobGVmdFtpXSAtIHByZWQgKyAweDEwMCkgJiAweDFGRikgLSAweDEwMDsKKworICAgICAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgICAgIGZmX21qcGVnX2VuY29kZV9kYyhwYiwgZGlmZiwgcy0+aHVmZl9zaXplX2RjX2x1bWluYW5jZSwgcy0+aHVmZl9jb2RlX2RjX2x1bWluYW5jZSk7IC8vRklYTUUgdWdseQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZmZfbWpwZWdfZW5jb2RlX2RjKHBiLCBkaWZmLCBzLT5odWZmX3NpemVfZGNfY2hyb21pbmFuY2UsIHMtPmh1ZmZfY29kZV9kY19jaHJvbWluYW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxqcGVnX2VuY29kZV95dXZfbWIoTEpwZWdFbmNDb250ZXh0ICpzLCBQdXRCaXRDb250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgcHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3gsIGludCBtYl95KQoreworICAgIGludCBpOworCisgICAgaWYgKG1iX3ggPT0gMCB8fCBtYl95ID09IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgdWludDhfdCAqcHRyOworICAgICAgICAgICAgaW50IHgsIHksIGgsIHYsIGxpbmVzaXplOworICAgICAgICAgICAgaCA9IHMtPmhzYW1wbGVbaV07CisgICAgICAgICAgICB2ID0gcy0+dnNhbXBsZVtpXTsKKyAgICAgICAgICAgIGxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplW2ldOworCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgdjsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZDsKKworICAgICAgICAgICAgICAgICAgICBwdHIgPSBmcmFtZS0+ZGF0YVtpXSArIChsaW5lc2l6ZSAqICh2ICogbWJfeSArIHkpKSArIChoICogbWJfeCArIHgpOyAvL0ZJWE1FIG9wdGltaXplIHRoaXMgY3JhcAorICAgICAgICAgICAgICAgICAgICBpZiAoeSA9PSAwICYmIG1iX3kgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT0gMCAmJiBtYl94ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCA9IDEyODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkID0gcHRyWy0xXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ID09IDAgJiYgbWJfeCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCA9IHB0clstbGluZXNpemVdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUNUKHByZWQsIHB0clstbGluZXNpemUgLSAxXSwgcHRyWy1saW5lc2l6ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJbLTFdLCBwcmVkaWN0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX21qcGVnX2VuY29kZV9kYyhwYiwgKnB0ciAtIHByZWQsIHMtPmh1ZmZfc2l6ZV9kY19sdW1pbmFuY2UsIHMtPmh1ZmZfY29kZV9kY19sdW1pbmFuY2UpOyAvL0ZJWE1FIHVnbHkKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZmZfbWpwZWdfZW5jb2RlX2RjKHBiLCAqcHRyIC0gcHJlZCwgcy0+aHVmZl9zaXplX2RjX2Nocm9taW5hbmNlLCBzLT5odWZmX2NvZGVfZGNfY2hyb21pbmFuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnB0cjsKKyAgICAgICAgICAgIGludCB4LCB5LCBoLCB2LCBsaW5lc2l6ZTsKKyAgICAgICAgICAgIGggPSBzLT5oc2FtcGxlW2ldOworICAgICAgICAgICAgdiA9IHMtPnZzYW1wbGVbaV07CisgICAgICAgICAgICBsaW5lc2l6ZSA9IGZyYW1lLT5saW5lc2l6ZVtpXTsKKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHY7IHkrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHByZWQ7CisKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gZnJhbWUtPmRhdGFbaV0gKyAobGluZXNpemUgKiAodiAqIG1iX3kgKyB5KSkgKyAoaCAqIG1iX3ggKyB4KTsgLy9GSVhNRSBvcHRpbWl6ZSB0aGlzIGNyYXAKKyAgICAgICAgICAgICAgICAgICAgUFJFRElDVChwcmVkLCBwdHJbLWxpbmVzaXplIC0gMV0sIHB0clstbGluZXNpemVdLCBwdHJbLTFdLCBwcmVkaWN0b3IpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9tanBlZ19lbmNvZGVfZGMocGIsICpwdHIgLSBwcmVkLCBzLT5odWZmX3NpemVfZGNfbHVtaW5hbmNlLCBzLT5odWZmX2NvZGVfZGNfbHVtaW5hbmNlKTsgLy9GSVhNRSB1Z2x5CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX21qcGVnX2VuY29kZV9kYyhwYiwgKnB0ciAtIHByZWQsIHMtPmh1ZmZfc2l6ZV9kY19jaHJvbWluYW5jZSwgcy0+aHVmZl9jb2RlX2RjX2Nocm9taW5hbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbGpwZWdfZW5jb2RlX3l1dihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFB1dEJpdENvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQoreworICAgIGNvbnN0IGludCBwcmVkaWN0b3IgPSBhdmN0eC0+cHJlZGljdGlvbl9tZXRob2QgKyAxOworICAgIExKcGVnRW5jQ29udGV4dCAqcyAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IGludCBtYl93aWR0aCAgPSAoYXZjdHgtPndpZHRoICArIHMtPmhzYW1wbGVbMF0gLSAxKSAvIHMtPmhzYW1wbGVbMF07CisgICAgY29uc3QgaW50IG1iX2hlaWdodCA9IChhdmN0eC0+aGVpZ2h0ICsgcy0+dnNhbXBsZVswXSAtIDEpIC8gcy0+dnNhbXBsZVswXTsKKyAgICBpbnQgbWJfeCwgbWJfeTsKKworICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBtYl9oZWlnaHQ7IG1iX3krKykgeworICAgICAgICBpZiAocGItPmJ1Zl9lbmQgLSBwYi0+YnVmIC0gKHB1dF9iaXRzX2NvdW50KHBiKSA+PiAzKSA8CisgICAgICAgICAgICBtYl93aWR0aCAqIDQgKiAzICogcy0+aHNhbXBsZVswXSAqIHMtPnZzYW1wbGVbMF0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5jb2RlZCBmcmFtZSB0b28gbGFyZ2VcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IG1iX3dpZHRoOyBtYl94KyspCisgICAgICAgICAgICBsanBlZ19lbmNvZGVfeXV2X21iKHMsIHBiLCBmcmFtZSwgcHJlZGljdG9yLCBtYl94LCBtYl95KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsanBlZ19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljdCwgaW50ICpnb3RfcGFja2V0KQoreworICAgIExKcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBjb25zdCBpbnQgd2lkdGggID0gYXZjdHgtPndpZHRoOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworICAgIGNvbnN0IGludCBtYl93aWR0aCAgPSAod2lkdGggICsgcy0+aHNhbXBsZVswXSAtIDEpIC8gcy0+aHNhbXBsZVswXTsKKyAgICBjb25zdCBpbnQgbWJfaGVpZ2h0ID0gKGhlaWdodCArIHMtPnZzYW1wbGVbMF0gLSAxKSAvIHMtPnZzYW1wbGVbMF07CisgICAgaW50IG1heF9wa3Rfc2l6ZSA9IEZGX01JTl9CVUZGRVJfU0laRTsKKyAgICBpbnQgcmV0LCBoZWFkZXJfYml0czsKKworICAgIGlmKCAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjAKKyAgICAgICAgfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1JBCisgICAgICAgIHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfQkdSMjQpCisgICAgICAgIG1heF9wa3Rfc2l6ZSArPSB3aWR0aCAqIGhlaWdodCAqIDMgKiA0OworICAgIGVsc2UgeworICAgICAgICBtYXhfcGt0X3NpemUgKz0gbWJfd2lkdGggKiBtYl9oZWlnaHQgKiAzICogNAorICAgICAgICAgICAgICAgICAgICAgICAgKiBzLT5oc2FtcGxlWzBdICogcy0+dnNhbXBsZVswXTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgbWF4X3BrdF9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaW5pdF9wdXRfYml0cygmcGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKworICAgIGZmX21qcGVnX2VuY29kZV9waWN0dXJlX2hlYWRlcihhdmN0eCwgJnBiLCAmcy0+c2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYXRyaXgsIHMtPm1hdHJpeCk7CisKKyAgICBoZWFkZXJfYml0cyA9IHB1dF9iaXRzX2NvdW50KCZwYik7CisKKyAgICBpZiggICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1IwCisgICAgICAgIHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfQkdSQQorICAgICAgICB8fCBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjI0KQorICAgICAgICByZXQgPSBsanBlZ19lbmNvZGVfYmdyKGF2Y3R4LCAmcGIsIHBpY3QpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gbGpwZWdfZW5jb2RlX3l1dihhdmN0eCwgJnBiLCBwaWN0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGVtbXNfYygpOworCisgICAgZmZfbWpwZWdfZXNjYXBlX0ZGKCZwYiwgaGVhZGVyX2JpdHMgPj4gMyk7CisgICAgZmZfbWpwZWdfZW5jb2RlX3BpY3R1cmVfdHJhaWxlcigmcGIsIGhlYWRlcl9iaXRzKTsKKworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgcGt0LT5zaXplICAgPSBwdXRfYml0c19wdHIoJnBiKSAtIHBiLmJ1ZjsKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxqcGVnX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTEpwZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisgICAgYXZfZnJlZXAoJnMtPnNjcmF0Y2gpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBsanBlZ19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTEpwZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmICgoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQIHx8CisgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlAgfHwKKyAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDQ0UCB8fAorICAgICAgICAgYXZjdHgtPmNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX01QRUcpICYmCisgICAgICAgIGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTGltaXRlZCByYW5nZSBZVVYgaXMgbm9uLXN0YW5kYXJkLCBzZXQgc3RyaWN0X3N0ZF9jb21wbGlhbmNlIHRvICIKKyAgICAgICAgICAgICAgICJhdCBsZWFzdCB1bm9mZmljaWFsIHRvIHVzZSBpdC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKworICAgIHMtPnNjcmF0Y2ggPSBhdl9tYWxsb2NfYXJyYXkoYXZjdHgtPndpZHRoICsgMSwgc2l6ZW9mKCpzLT5zY3JhdGNoKSk7CisKKyAgICBmZl9pZGN0ZHNwX2luaXQoJnMtPmlkc3AsIGF2Y3R4KTsKKyAgICBmZl9pbml0X3NjYW50YWJsZShzLT5pZHNwLmlkY3RfcGVybXV0YXRpb24sICZzLT5zY2FudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgZmZfemlnemFnX2RpcmVjdCk7CisKKyAgICBmZl9tanBlZ19pbml0X2h2c2FtcGxlKGF2Y3R4LCBzLT5oc2FtcGxlLCBzLT52c2FtcGxlKTsKKworICAgIGZmX21qcGVnX2J1aWxkX2h1ZmZtYW5fY29kZXMocy0+aHVmZl9zaXplX2RjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmh1ZmZfY29kZV9kY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfYml0c19kY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2RjKTsKKyAgICBmZl9tanBlZ19idWlsZF9odWZmbWFuX2NvZGVzKHMtPmh1ZmZfc2l6ZV9kY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmh1ZmZfY29kZV9kY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ19iaXRzX2RjX2Nocm9taW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9kYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9sanBlZ19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsanBlZyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkxvc3NsZXNzIEpQRUciKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTEpQRUcsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKExKcGVnRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbGpwZWdfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gbGpwZWdfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGxqcGVnX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IENPREVDX0NBUF9JTlRSQV9PTkxZLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7CisgICAgICAgIEFWX1BJWF9GTVRfQkdSMjQgICAsIEFWX1BJWF9GTVRfQkdSQSAgICAsIEFWX1BJWF9GTVRfQkdSMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQICwgQVZfUElYX0ZNVF9ZVVY0NDRQICwgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkV9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xvY28uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xvY28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjUyYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbG9jby5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogTE9DTyBjb2RlYworICogQ29weXJpZ2h0IChjKSAyMDA1IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTE9DTyBjb2RlYy4KKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisKK2VudW0gTE9DT19NT0RFIHsKKyAgICBMT0NPX1VOS04gID0gIDAsCisgICAgTE9DT19DWVVZMiA9IC0xLAorICAgIExPQ09fQ1JHQiAgPSAtMiwKKyAgICBMT0NPX0NSR0JBID0gLTMsCisgICAgTE9DT19DWVYxMiA9IC00LAorICAgIExPQ09fWVVZMiAgPSAgMSwKKyAgICBMT0NPX1VZVlkgID0gIDIsCisgICAgTE9DT19SR0IgICA9ICAzLAorICAgIExPQ09fUkdCQSAgPSAgNCwKKyAgICBMT0NPX1lWMTIgID0gIDUsCit9OworCit0eXBlZGVmIHN0cnVjdCBMT0NPQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGludCBsb3NzeTsKKyAgICBpbnQgbW9kZTsKK30gTE9DT0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFJJQ0VDb250ZXh0IHsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBzYXZlLCBydW4sIHJ1bjI7IC8qIGludGVybmFsIHJpY2UgZGVjb2RlciBzdGF0ZSAqLworICAgIGludCBzdW0sIGNvdW50OyAvKiBzdW0gYW5kIGNvdW50IGZvciBnZXR0aW5nIHJpY2UgcGFyYW1ldGVyICovCisgICAgaW50IGxvc3N5OworfSBSSUNFQ29udGV4dDsKKworc3RhdGljIGludCBsb2NvX2dldF9yaWNlX3BhcmFtKFJJQ0VDb250ZXh0ICpyKQoreworICAgIGludCBjbnQgPSAwOworICAgIGludCB2YWwgPSByLT5jb3VudDsKKworICAgIHdoaWxlIChyLT5zdW0gPiB2YWwgJiYgY250IDwgOSkgeworICAgICAgICB2YWwgPDw9IDE7CisgICAgICAgIGNudCsrOworICAgIH0KKworICAgIHJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NvX3VwZGF0ZV9yaWNlX3BhcmFtKFJJQ0VDb250ZXh0ICpyLCBpbnQgdmFsKQoreworICAgIHItPnN1bSArPSB2YWw7CisgICAgci0+Y291bnQrKzsKKworICAgIGlmIChyLT5jb3VudCA9PSAxNikgeworICAgICAgICByLT5zdW0gICA+Pj0gMTsKKyAgICAgICAgci0+Y291bnQgPj49IDE7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBsb2NvX2dldF9yaWNlKFJJQ0VDb250ZXh0ICpyKQoreworICAgIGludCB2OworICAgIGlmIChyLT5ydW4gPiAwKSB7IC8qIHdlIGhhdmUgemVybyBydW4gKi8KKyAgICAgICAgci0+cnVuLS07CisgICAgICAgIGxvY29fdXBkYXRlX3JpY2VfcGFyYW0ociwgMCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB2ID0gZ2V0X3VyX2dvbG9tYl9qcGVnbHMoJnItPmdiLCBsb2NvX2dldF9yaWNlX3BhcmFtKHIpLCBJTlRfTUFYLCAwKTsKKyAgICBsb2NvX3VwZGF0ZV9yaWNlX3BhcmFtKHIsICh2ICsgMSkgPj4gMSk7CisgICAgaWYgKCF2KSB7CisgICAgICAgIGlmIChyLT5zYXZlID49IDApIHsKKyAgICAgICAgICAgIHItPnJ1biA9IGdldF91cl9nb2xvbWJfanBlZ2xzKCZyLT5nYiwgMiwgSU5UX01BWCwgMCk7CisgICAgICAgICAgICBpZiAoci0+cnVuID4gMSkKKyAgICAgICAgICAgICAgICByLT5zYXZlICs9IHItPnJ1biArIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgci0+c2F2ZSAtPSAzOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHItPnJ1bjIrKzsKKyAgICB9IGVsc2UgeworICAgICAgICB2ID0gKCh2ID4+IDEpICsgci0+bG9zc3kpIF4gLSh2ICYgMSk7CisgICAgICAgIGlmIChyLT5ydW4yID4gMCkgeworICAgICAgICAgICAgaWYgKHItPnJ1bjIgPiAyKQorICAgICAgICAgICAgICAgIHItPnNhdmUgKz0gci0+cnVuMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByLT5zYXZlIC09IDM7CisgICAgICAgICAgICByLT5ydW4yID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2OworfQorCisvKiBMT0NPIG1haW4gcHJlZGljdG9yIC0gTE9DTy1JL0pQRUctTFMgcHJlZGljdG9yICovCitzdGF0aWMgaW5saW5lIGludCBsb2NvX3ByZWRpY3QodWludDhfdCogZGF0YSwgaW50IHN0cmlkZSwgaW50IHN0ZXApCit7CisgICAgaW50IGEsIGIsIGM7CisKKyAgICBhID0gZGF0YVstc3RyaWRlXTsKKyAgICBiID0gZGF0YVstc3RlcF07CisgICAgYyA9IGRhdGFbLXN0cmlkZSAtIHN0ZXBdOworCisgICAgcmV0dXJuIG1pZF9wcmVkKGEsIGEgKyBiIC0gYywgYik7Cit9CisKK3N0YXRpYyBpbnQgbG9jb19kZWNvZGVfcGxhbmUoTE9DT0NvbnRleHQgKmwsIHVpbnQ4X3QgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBzdGVwKQoreworICAgIFJJQ0VDb250ZXh0IHJjOworICAgIGludCB2YWw7CisgICAgaW50IGksIGo7CisKKyAgICBpZihidWZfc2l6ZTw9MCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaW5pdF9nZXRfYml0czgoJnJjLmdiLCBidWYsIGJ1Zl9zaXplKTsKKyAgICByYy5zYXZlICA9IDA7CisgICAgcmMucnVuICAgPSAwOworICAgIHJjLnJ1bjIgID0gMDsKKyAgICByYy5sb3NzeSA9IGwtPmxvc3N5OworCisgICAgcmMuc3VtICAgPSA4OworICAgIHJjLmNvdW50ID0gMTsKKworICAgIC8qIHJlc3RvcmUgdG9wIGxlZnQgcGl4ZWwgKi8KKyAgICB2YWwgICAgID0gbG9jb19nZXRfcmljZSgmcmMpOworICAgIGRhdGFbMF0gPSAxMjggKyB2YWw7CisgICAgLyogcmVzdG9yZSB0b3AgbGluZSAqLworICAgIGZvciAoaSA9IDE7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIHZhbCA9IGxvY29fZ2V0X3JpY2UoJnJjKTsKKyAgICAgICAgZGF0YVtpICogc3RlcF0gPSBkYXRhW2kgKiBzdGVwIC0gc3RlcF0gKyB2YWw7CisgICAgfQorICAgIGRhdGEgKz0gc3RyaWRlOworICAgIGZvciAoaiA9IDE7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICAvKiByZXN0b3JlIGxlZnQgY29sdW1uICovCisgICAgICAgIHZhbCA9IGxvY29fZ2V0X3JpY2UoJnJjKTsKKyAgICAgICAgZGF0YVswXSA9IGRhdGFbLXN0cmlkZV0gKyB2YWw7CisgICAgICAgIC8qIHJlc3RvcmUgYWxsIG90aGVyIHBpeGVscyAqLworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgdmFsID0gbG9jb19nZXRfcmljZSgmcmMpOworICAgICAgICAgICAgZGF0YVtpICogc3RlcF0gPSBsb2NvX3ByZWRpY3QoJmRhdGFbaSAqIHN0ZXBdLCBzdHJpZGUsIHN0ZXApICsgdmFsOworICAgICAgICB9CisgICAgICAgIGRhdGEgKz0gc3RyaWRlOworICAgIH0KKworICAgIHJldHVybiAoZ2V0X2JpdHNfY291bnQoJnJjLmdiKSArIDcpID4+IDM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIExPQ09Db250ZXh0ICogY29uc3QgbCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmICAgID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgQVZGcmFtZSAqIGNvbnN0IHAgICAgID0gZGF0YTsKKyAgICBpbnQgZGVjb2RlZCwgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHAtPmtleV9mcmFtZSA9IDE7CisKKyNkZWZpbmUgQURWQU5DRV9CWV9ERUNPREVEIGRvIHsgXAorICAgIGlmIChkZWNvZGVkIDwgMCB8fCBkZWNvZGVkID49IGJ1Zl9zaXplKSBnb3RvIGJ1Zl90b29fc21hbGw7IFwKKyAgICBidWYgKz0gZGVjb2RlZDsgYnVmX3NpemUgLT0gZGVjb2RlZDsgXAorfSB3aGlsZSgwKQorICAgIHN3aXRjaChsLT5tb2RlKSB7CisgICAgY2FzZSBMT0NPX0NZVVkyOiBjYXNlIExPQ09fWVVZMjogY2FzZSBMT0NPX1VZVlk6CisgICAgICAgIGRlY29kZWQgPSBsb2NvX2RlY29kZV9wbGFuZShsLCBwLT5kYXRhWzBdLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5saW5lc2l6ZVswXSwgYnVmLCBidWZfc2l6ZSwgMSk7CisgICAgICAgIEFEVkFOQ0VfQllfREVDT0RFRDsKKyAgICAgICAgZGVjb2RlZCA9IGxvY29fZGVjb2RlX3BsYW5lKGwsIHAtPmRhdGFbMV0sIGF2Y3R4LT53aWR0aCAvIDIsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5saW5lc2l6ZVsxXSwgYnVmLCBidWZfc2l6ZSwgMSk7CisgICAgICAgIEFEVkFOQ0VfQllfREVDT0RFRDsKKyAgICAgICAgZGVjb2RlZCA9IGxvY29fZGVjb2RlX3BsYW5lKGwsIHAtPmRhdGFbMl0sIGF2Y3R4LT53aWR0aCAvIDIsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5saW5lc2l6ZVsyXSwgYnVmLCBidWZfc2l6ZSwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE9DT19DWVYxMjogY2FzZSBMT0NPX1lWMTI6CisgICAgICAgIGRlY29kZWQgPSBsb2NvX2RlY29kZV9wbGFuZShsLCBwLT5kYXRhWzBdLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5saW5lc2l6ZVswXSwgYnVmLCBidWZfc2l6ZSwgMSk7CisgICAgICAgIEFEVkFOQ0VfQllfREVDT0RFRDsKKyAgICAgICAgZGVjb2RlZCA9IGxvY29fZGVjb2RlX3BsYW5lKGwsIHAtPmRhdGFbMl0sIGF2Y3R4LT53aWR0aCAvIDIsIGF2Y3R4LT5oZWlnaHQgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+bGluZXNpemVbMl0sIGJ1ZiwgYnVmX3NpemUsIDEpOworICAgICAgICBBRFZBTkNFX0JZX0RFQ09ERUQ7CisgICAgICAgIGRlY29kZWQgPSBsb2NvX2RlY29kZV9wbGFuZShsLCBwLT5kYXRhWzFdLCBhdmN0eC0+d2lkdGggLyAyLCBhdmN0eC0+aGVpZ2h0IC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmxpbmVzaXplWzFdLCBidWYsIGJ1Zl9zaXplLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMT0NPX0NSR0I6IGNhc2UgTE9DT19SR0I6CisgICAgICAgIGRlY29kZWQgPSBsb2NvX2RlY29kZV9wbGFuZShsLCBwLT5kYXRhWzBdICsgcC0+bGluZXNpemVbMF0qKGF2Y3R4LT5oZWlnaHQtMSksIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1wLT5saW5lc2l6ZVswXSwgYnVmLCBidWZfc2l6ZSwgMyk7CisgICAgICAgIEFEVkFOQ0VfQllfREVDT0RFRDsKKyAgICAgICAgZGVjb2RlZCA9IGxvY29fZGVjb2RlX3BsYW5lKGwsIHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSooYXZjdHgtPmhlaWdodC0xKSArIDEsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1wLT5saW5lc2l6ZVswXSwgYnVmLCBidWZfc2l6ZSwgMyk7CisgICAgICAgIEFEVkFOQ0VfQllfREVDT0RFRDsKKyAgICAgICAgZGVjb2RlZCA9IGxvY29fZGVjb2RlX3BsYW5lKGwsIHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSooYXZjdHgtPmhlaWdodC0xKSArIDIsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1wLT5saW5lc2l6ZVswXSwgYnVmLCBidWZfc2l6ZSwgMyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE9DT19DUkdCQToKKyAgICBjYXNlIExPQ09fUkdCQToKKyAgICAgICAgZGVjb2RlZCA9IGxvY29fZGVjb2RlX3BsYW5lKGwsIHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSooYXZjdHgtPmhlaWdodC0xKSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXAtPmxpbmVzaXplWzBdLCBidWYsIGJ1Zl9zaXplLCA0KTsKKyAgICAgICAgQURWQU5DRV9CWV9ERUNPREVEOworICAgICAgICBkZWNvZGVkID0gbG9jb19kZWNvZGVfcGxhbmUobCwgcC0+ZGF0YVswXSArIHAtPmxpbmVzaXplWzBdKihhdmN0eC0+aGVpZ2h0LTEpICsgMSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXAtPmxpbmVzaXplWzBdLCBidWYsIGJ1Zl9zaXplLCA0KTsKKyAgICAgICAgQURWQU5DRV9CWV9ERUNPREVEOworICAgICAgICBkZWNvZGVkID0gbG9jb19kZWNvZGVfcGxhbmUobCwgcC0+ZGF0YVswXSArIHAtPmxpbmVzaXplWzBdKihhdmN0eC0+aGVpZ2h0LTEpICsgMiwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXAtPmxpbmVzaXplWzBdLCBidWYsIGJ1Zl9zaXplLCA0KTsKKyAgICAgICAgQURWQU5DRV9CWV9ERUNPREVEOworICAgICAgICBkZWNvZGVkID0gbG9jb19kZWNvZGVfcGxhbmUobCwgcC0+ZGF0YVswXSArIHAtPmxpbmVzaXplWzBdKihhdmN0eC0+aGVpZ2h0LTEpICsgMywgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXAtPmxpbmVzaXplWzBdLCBidWYsIGJ1Zl9zaXplLCA0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICB9CisKKyAgICBpZiAoZGVjb2RlZCA8IDAgfHwgZGVjb2RlZCA+IGJ1Zl9zaXplKQorICAgICAgICBnb3RvIGJ1Zl90b29fc21hbGw7CisgICAgYnVmX3NpemUgLT0gZGVjb2RlZDsKKworICAgICpnb3RfZnJhbWUgICAgICA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemUgLSBidWZfc2l6ZTsKK2J1Zl90b29fc21hbGw6CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnB1dCBkYXRhIHRvbyBzbWFsbC5cbiIpOworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTE9DT0NvbnRleHQgKiBjb25zdCBsID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgdmVyc2lvbjsKKworICAgIGwtPmF2Y3R4ID0gYXZjdHg7CisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDEyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXh0cmFkYXRhIHNpemUgbXVzdCBiZSA+PSAxMiBpbnN0ZWFkIG9mICVpXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHZlcnNpb24gPSBBVl9STDMyKGF2Y3R4LT5leHRyYWRhdGEpOworICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgIGNhc2UgMToKKyAgICAgICAgbC0+bG9zc3kgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGwtPmxvc3N5ID0gQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhICsgOCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGwtPmxvc3N5ID0gQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhICsgOCk7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkxPQ08gY29kZWMgdmVyc2lvbiAlaSIsIHZlcnNpb24pOworICAgIH0KKworICAgIGwtPm1vZGUgPSBBVl9STDMyKGF2Y3R4LT5leHRyYWRhdGEgKyA0KTsKKyAgICBzd2l0Y2ggKGwtPm1vZGUpIHsKKyAgICBjYXNlIExPQ09fQ1lVWTI6CisgICAgY2FzZSBMT0NPX1lVWTI6CisgICAgY2FzZSBMT0NPX1VZVlk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExPQ09fQ1JHQjoKKyAgICBjYXNlIExPQ09fUkdCOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE9DT19DWVYxMjoKKyAgICBjYXNlIExPQ09fWVYxMjoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE9DT19DUkdCQToKKyAgICBjYXNlIExPQ09fUkdCQToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUkE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJVbmtub3duIGNvbG9yc3BhY2UsIGluZGV4ID0gJWlcbiIsIGwtPm1vZGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgImxvc3N5OiVpLCB2ZXJzaW9uOiVpLCBtb2RlOiAlaVxuIiwgbC0+bG9zc3ksIHZlcnNpb24sIGwtPm1vZGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbG9jb19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsb2NvIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTE9DTyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9MT0NPLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihMT0NPQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbG9nMl90YWIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xvZzJfdGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhMWRmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xvZzJfdGFiLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cyX3RhYi5jIgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbG9zc2xlc3NfYXVkaW9kc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xvc3NsZXNzX2F1ZGlvZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmNGM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xvc3NsZXNzX2F1ZGlvZHNwLmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIE1vbmtleSdzIEF1ZGlvIGxvc3NsZXNzIGF1ZGlvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCZW5qYW1pbiBab3JlcyA8YmVuQGdlZXhib3gub3JnPgorICogIGJhc2VkIHVwb24gbGliZGVtYWMgZnJvbSBEYXZlIENoYXBtYW4uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibG9zc2xlc3NfYXVkaW9kc3AuaCIKKworc3RhdGljIGludDMyX3Qgc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNl9jKGludDE2X3QgKnYxLCBjb25zdCBpbnQxNl90ICp2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIsIGludCBtdWwpCit7CisgICAgaW50IHJlcyA9IDA7CisKKyAgICB3aGlsZSAob3JkZXItLSkgeworICAgICAgICByZXMgICArPSAqdjEgKiAqdjIrKzsKKyAgICAgICAgKnYxKysgKz0gbXVsICogKnYzKys7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9sbGF1ZGRzcF9pbml0KExMQXVkRFNQQ29udGV4dCAqYykKK3sKKyAgICBjLT5zY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2ID0gc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNl9jOworCisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl9sbGF1ZGRzcF9pbml0X2FybShjKTsKKyAgICBpZiAoQVJDSF9QUEMpCisgICAgICAgIGZmX2xsYXVkZHNwX2luaXRfcHBjKGMpOworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfbGxhdWRkc3BfaW5pdF94ODYoYyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9sb3NzbGVzc19hdWRpb2RzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbG9zc2xlc3NfYXVkaW9kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2VlMmJlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbG9zc2xlc3NfYXVkaW9kc3AuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogTW9ua2V5J3MgQXVkaW8gbG9zc2xlc3MgYXVkaW8gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IEJlbmphbWluIFpvcmVzIDxiZW5AZ2VleGJveC5vcmc+CisgKiAgYmFzZWQgdXBvbiBsaWJkZW1hYyBmcm9tIERhdmUgQ2hhcG1hbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0xMQVVERFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19MTEFVRERTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgTExBdWREU1BDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgc2NhbGFyIHByb2R1Y3Qgb2YgdjEgYW5kIHYyLAorICAgICAqIGFuZCB2MVtpXSArPSB2M1tpXSAqIG11bAorICAgICAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHZlY3RvcnMsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA4CisgICAgICovCisgICAgaW50MzJfdCAoKnNjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MTYpKGludDE2X3QgKnYxIC8qIGFsaWduIDE2ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBtdWwpOworfSBMTEF1ZERTUENvbnRleHQ7CisKK3ZvaWQgZmZfbGxhdWRkc3BfaW5pdChMTEF1ZERTUENvbnRleHQgKmMpOwordm9pZCBmZl9sbGF1ZGRzcF9pbml0X2FybShMTEF1ZERTUENvbnRleHQgKmMpOwordm9pZCBmZl9sbGF1ZGRzcF9pbml0X3BwYyhMTEF1ZERTUENvbnRleHQgKmMpOwordm9pZCBmZl9sbGF1ZGRzcF9pbml0X3g4NihMTEF1ZERTUENvbnRleHQgKmMpOworCisjZW5kaWYgLyogQVZDT0RFQ19MTEFVRERTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9sb3NzbGVzc192aWRlb2RzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbG9zc2xlc3NfdmlkZW9kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDkxNjIxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbG9zc2xlc3NfdmlkZW9kc3AuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIExvc3NsZXNzIHZpZGVvIERTUCB1dGlscworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJsb3NzbGVzc192aWRlb2RzcC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWF0aG9wcy5oIgorCitzdGF0aWMgdm9pZCBhZGRfaW50MTZfYyh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBpbnQgdyl7CisgICAgbG9uZyBpOworICAgIHVuc2lnbmVkIGxvbmcgcHdfbHNiID0gKG1hc2sgPj4gMSkgKiAweDAwMDEwMDAxMDAwMTAwMDFVTEw7CisgICAgdW5zaWduZWQgbG9uZyBwd19tc2IgPSBwd19sc2IgKyAgMHgwMDAxMDAwMTAwMDEwMDAxVUxMOworICAgIGZvciAoaSA9IDA7IGkgPD0gdyAtIChpbnQpc2l6ZW9mKGxvbmcpLzI7IGkgKz0gc2l6ZW9mKGxvbmcpLzIpIHsKKyAgICAgICAgbG9uZyBhID0gKihsb25nKikoc3JjK2kpOworICAgICAgICBsb25nIGIgPSAqKGxvbmcqKShkc3QraSk7CisgICAgICAgICoobG9uZyopKGRzdCtpKSA9ICgoYSZwd19sc2IpICsgKGImcHdfbHNiKSkgXiAoKGFeYikmcHdfbXNiKTsKKyAgICB9CisgICAgZm9yKDsgaTx3OyBpKyspCisgICAgICAgIGRzdFtpXSA9IChkc3RbaV0gKyBzcmNbaV0pICYgbWFzazsKK30KKworc3RhdGljIHZvaWQgZGlmZl9pbnQxNl9jKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMxLCBjb25zdCB1aW50MTZfdCAqc3JjMiwgdW5zaWduZWQgbWFzaywgaW50IHcpeworICAgIGxvbmcgaTsKKyNpZiAhSEFWRV9GQVNUX1VOQUxJR05FRAorICAgIGlmKChsb25nKXNyYzIgJiAoc2l6ZW9mKGxvbmcpLTEpKXsKKyAgICAgICAgZm9yKGk9MDsgaSszPHc7IGkrPTQpeworICAgICAgICAgICAgZHN0W2krMF0gPSAoc3JjMVtpKzBdLXNyYzJbaSswXSkgJiBtYXNrOworICAgICAgICAgICAgZHN0W2krMV0gPSAoc3JjMVtpKzFdLXNyYzJbaSsxXSkgJiBtYXNrOworICAgICAgICAgICAgZHN0W2krMl0gPSAoc3JjMVtpKzJdLXNyYzJbaSsyXSkgJiBtYXNrOworICAgICAgICAgICAgZHN0W2krM10gPSAoc3JjMVtpKzNdLXNyYzJbaSszXSkgJiBtYXNrOworICAgICAgICB9CisgICAgfWVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBwd19sc2IgPSAobWFzayA+PiAxKSAqIDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBwd19tc2IgPSBwd19sc2IgKyAgMHgwMDAxMDAwMTAwMDEwMDAxVUxMOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gdyAtIChpbnQpc2l6ZW9mKGxvbmcpLzI7IGkgKz0gc2l6ZW9mKGxvbmcpLzIpIHsKKyAgICAgICAgICAgIGxvbmcgYSA9ICoobG9uZyopKHNyYzEraSk7CisgICAgICAgICAgICBsb25nIGIgPSAqKGxvbmcqKShzcmMyK2kpOworICAgICAgICAgICAgKihsb25nKikoZHN0K2kpID0gKChhfHB3X21zYikgLSAoYiZwd19sc2IpKSBeICgoYV5iXnB3X21zYikmcHdfbXNiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKDsgaTx3OyBpKyspCisgICAgICAgIGRzdFtpXSA9IChzcmMxW2ldIC0gc3JjMltpXSkgJiBtYXNrOworfQorCitzdGF0aWMgdm9pZCBhZGRfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNl9jKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMsIGNvbnN0IHVpbnQxNl90ICpkaWZmLCB1bnNpZ25lZCBtYXNrLCBpbnQgdywgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKXsKKyAgICBpbnQgaTsKKyAgICB1aW50MTZfdCBsLCBsdDsKKworICAgIGwgID0gKmxlZnQ7CisgICAgbHQgPSAqbGVmdF90b3A7CisKKyAgICBmb3IoaT0wOyBpPHc7IGkrKyl7CisgICAgICAgIGwgID0gKG1pZF9wcmVkKGwsIHNyY1tpXSwgKGwgKyBzcmNbaV0gLSBsdCkgJiBtYXNrKSArIGRpZmZbaV0pICYgbWFzazsKKyAgICAgICAgbHQgPSBzcmNbaV07CisgICAgICAgIGRzdFtpXSA9IGw7CisgICAgfQorCisgICAgKmxlZnQgICAgID0gbDsKKyAgICAqbGVmdF90b3AgPSBsdDsKK30KKworc3RhdGljIHZvaWQgc3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTZfYyh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsIHVuc2lnbmVkIG1hc2ssIGludCB3LCBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApeworICAgIGludCBpOworICAgIHVpbnQxNl90IGwsIGx0OworCisgICAgbCAgPSAqbGVmdDsKKyAgICBsdCA9ICpsZWZ0X3RvcDsKKworICAgIGZvcihpPTA7IGk8dzsgaSsrKXsKKyAgICAgICAgY29uc3QgaW50IHByZWQgPSBtaWRfcHJlZChsLCBzcmMxW2ldLCAobCArIHNyYzFbaV0gLSBsdCkgJiBtYXNrKTsKKyAgICAgICAgbHQgPSBzcmMxW2ldOworICAgICAgICBsICA9IHNyYzJbaV07CisgICAgICAgIGRzdFtpXSA9IChsIC0gcHJlZCkgJiBtYXNrOworICAgIH0KKworICAgICpsZWZ0ICAgICA9IGw7CisgICAgKmxlZnRfdG9wID0gbHQ7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2X2ModWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgdW5zaWduZWQgbWFzaywgaW50IHcsIHVuc2lnbmVkIGFjYyl7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPHctMTsgaSsrKXsKKyAgICAgICAgYWNjKz0gc3JjW2ldOworICAgICAgICBkc3RbaV09IGFjYyAmIG1hc2s7CisgICAgICAgIGkrKzsKKyAgICAgICAgYWNjKz0gc3JjW2ldOworICAgICAgICBkc3RbaV09IGFjYyAmIG1hc2s7CisgICAgfQorCisgICAgZm9yKDsgaTx3OyBpKyspeworICAgICAgICBhY2MrPSBzcmNbaV07CisgICAgICAgIGRzdFtpXT0gYWNjICYgbWFzazsKKyAgICB9CisKKyAgICByZXR1cm4gYWNjOworfQorCisKK3ZvaWQgZmZfbGx2aWRkc3BfaW5pdChMTFZpZERTUENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBjLT5hZGRfaW50MTYgPSBhZGRfaW50MTZfYzsKKyAgICBjLT5kaWZmX2ludDE2PSBkaWZmX2ludDE2X2M7CisgICAgYy0+YWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2ICAgPSBhZGRfaGZ5dV9sZWZ0X3ByZWRfaW50MTZfYzsKKyAgICBjLT5hZGRfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNiA9IGFkZF9oZnl1X21lZGlhbl9wcmVkX2ludDE2X2M7CisgICAgYy0+c3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYgPSBzdWJfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNl9jOworCisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9sbHZpZGRzcF9pbml0X3g4NihjLCBhdmN0eCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9sb3NzbGVzc192aWRlb2RzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbG9zc2xlc3NfdmlkZW9kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDA5MDJlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbG9zc2xlc3NfdmlkZW9kc3AuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogTG9zc2xlc3MgdmlkZW8gRFNQIHV0aWxzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKworI2lmbmRlZiBBVkNPREVDX0xPU1NMRVNTX1ZJREVPRFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19MT1NTTEVTU19WSURFT0RTUF9ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorCit0eXBlZGVmIHN0cnVjdCBMTFZpZERTUENvbnRleHQgeworICAgIHZvaWQgKCphZGRfaW50MTYpKHVpbnQxNl90ICpkc3QvKmFsaWduIDE2Ki8sIGNvbnN0IHVpbnQxNl90ICpzcmMvKmFsaWduIDE2Ki8sIHVuc2lnbmVkIG1hc2ssIGludCB3KTsKKyAgICB2b2lkICgqZGlmZl9pbnQxNikodWludDE2X3QgKmRzdC8qYWxpZ24gMTYqLywgY29uc3QgdWludDE2X3QgKnNyYzEvKmFsaWduIDE2Ki8sIGNvbnN0IHVpbnQxNl90ICpzcmMyLyphbGlnbiAxKi8sIHVuc2lnbmVkIG1hc2ssIGludCB3KTsKKworICAgIHZvaWQgKCpzdWJfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNikodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYzEsIGNvbnN0IHVpbnQxNl90ICpzcmMyLCB1bnNpZ25lZCBtYXNrLCBpbnQgdywgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKTsKKyAgICB2b2lkICgqYWRkX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYpKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICp0b3AsIGNvbnN0IHVpbnQxNl90ICpkaWZmLCB1bnNpZ25lZCBtYXNrLCBpbnQgdywgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKTsKKyAgICBpbnQgICgqYWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2KSh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBpbnQgdywgdW5zaWduZWQgbGVmdCk7Cit9IExMVmlkRFNQQ29udGV4dDsKKwordm9pZCBmZl9sbHZpZGRzcF9pbml0KExMVmlkRFNQQ29udGV4dCAqbGx2aWRkc3AsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cit2b2lkIGZmX2xsdmlkZHNwX2luaXRfeDg2KExMVmlkRFNQQ29udGV4dCAqbGx2aWRkc3AsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKyNlbmRpZiAvL0FWQ09ERUNfTE9TU0xFU1NfVklERU9EU1BfSApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbHBjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9scGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWIwMmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbHBjLmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBMUEMgdXRpbGl0eSBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xscy5oIgorCisjZGVmaW5lIExQQ19VU0VfRE9VQkxFCisjaW5jbHVkZSAibHBjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKKworLyoqCisgKiBBcHBseSBXZWxjaCB3aW5kb3cgZnVuY3Rpb24gdG8gYXVkaW8gYmxvY2sKKyAqLworc3RhdGljIHZvaWQgbHBjX2FwcGx5X3dlbGNoX3dpbmRvd19jKGNvbnN0IGludDMyX3QgKmRhdGEsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp3X2RhdGEpCit7CisgICAgaW50IGksIG4yOworICAgIGRvdWJsZSB3OworICAgIGRvdWJsZSBjOworCisgICAgLyogVGhlIG9wdGltaXphdGlvbiBpbiBjb21taXQgZmE0ZWQ4YyBkb2VzIG5vdCBzdXBwb3J0IG9kZCBsZW4uCisgICAgICogSWYgc29tZW9uZSB3YW50cyBvZGQgbGVuIGV4dGVuZCB0aGF0IGNoYW5nZS4gKi8KKyAgICBhdl9hc3NlcnQyKCEobGVuICYgMSkpOworCisgICAgbjIgPSAobGVuID4+IDEpOworICAgIGMgPSAyLjAgLyAobGVuIC0gMS4wKTsKKworICAgIHdfZGF0YSs9bjI7CisgICAgICBkYXRhKz1uMjsKKyAgICBmb3IoaT0wOyBpPG4yOyBpKyspIHsKKyAgICAgICAgdyA9IGMgLSBuMiArIGk7CisgICAgICAgIHcgPSAxLjAgLSAodyAqIHcpOworICAgICAgICB3X2RhdGFbLWktMV0gPSBkYXRhWy1pLTFdICogdzsKKyAgICAgICAgd19kYXRhWytpICBdID0gZGF0YVsraSAgXSAqIHc7CisgICAgfQorfQorCisvKioKKyAqIENhbGN1bGF0ZSBhdXRvY29ycmVsYXRpb24gZGF0YSBmcm9tIGF1ZGlvIHNhbXBsZXMKKyAqIEEgV2VsY2ggd2luZG93IGZ1bmN0aW9uIGlzIGFwcGxpZWQgYmVmb3JlIGNhbGN1bGF0aW9uLgorICovCitzdGF0aWMgdm9pZCBscGNfY29tcHV0ZV9hdXRvY29ycl9jKGNvbnN0IGRvdWJsZSAqZGF0YSwgaW50IGxlbiwgaW50IGxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICphdXRvYykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvcihqPTA7IGo8bGFnOyBqKz0yKXsKKyAgICAgICAgZG91YmxlIHN1bTAgPSAxLjAsIHN1bTEgPSAxLjA7CisgICAgICAgIGZvcihpPWo7IGk8bGVuOyBpKyspeworICAgICAgICAgICAgc3VtMCArPSBkYXRhW2ldICogZGF0YVtpLWpdOworICAgICAgICAgICAgc3VtMSArPSBkYXRhW2ldICogZGF0YVtpLWotMV07CisgICAgICAgIH0KKyAgICAgICAgYXV0b2NbaiAgXSA9IHN1bTA7CisgICAgICAgIGF1dG9jW2orMV0gPSBzdW0xOworICAgIH0KKworICAgIGlmKGo9PWxhZyl7CisgICAgICAgIGRvdWJsZSBzdW0gPSAxLjA7CisgICAgICAgIGZvcihpPWotMTsgaTxsZW47IGkrPTIpeworICAgICAgICAgICAgc3VtICs9IGRhdGFbaSAgXSAqIGRhdGFbaS1qICBdCisgICAgICAgICAgICAgICAgICsgZGF0YVtpKzFdICogZGF0YVtpLWorMV07CisgICAgICAgIH0KKyAgICAgICAgYXV0b2Nbal0gPSBzdW07CisgICAgfQorfQorCisvKioKKyAqIFF1YW50aXplIExQQyBjb2VmZmljaWVudHMKKyAqLworc3RhdGljIHZvaWQgcXVhbnRpemVfbHBjX2NvZWZzKGRvdWJsZSAqbHBjX2luLCBpbnQgb3JkZXIsIGludCBwcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqbHBjX291dCwgaW50ICpzaGlmdCwgaW50IG1heF9zaGlmdCwgaW50IHplcm9fc2hpZnQpCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIGNtYXgsIGVycm9yOworICAgIGludDMyX3QgcW1heDsKKyAgICBpbnQgc2g7CisKKyAgICAvKiBkZWZpbmUgbWF4aW11bSBsZXZlbHMgKi8KKyAgICBxbWF4ID0gKDEgPDwgKHByZWNpc2lvbiAtIDEpKSAtIDE7CisKKyAgICAvKiBmaW5kIG1heGltdW0gY29lZmZpY2llbnQgdmFsdWUgKi8KKyAgICBjbWF4ID0gMC4wOworICAgIGZvcihpPTA7IGk8b3JkZXI7IGkrKykgeworICAgICAgICBjbWF4PSBGRk1BWChjbWF4LCBmYWJzKGxwY19pbltpXSkpOworICAgIH0KKworICAgIC8qIGlmIG1heGltdW0gdmFsdWUgcXVhbnRpemVzIHRvIHplcm8sIHJldHVybiBhbGwgemVyb3MgKi8KKyAgICBpZihjbWF4ICogKDEgPDwgbWF4X3NoaWZ0KSA8IDEuMCkgeworICAgICAgICAqc2hpZnQgPSB6ZXJvX3NoaWZ0OworICAgICAgICBtZW1zZXQobHBjX291dCwgMCwgc2l6ZW9mKGludDMyX3QpICogb3JkZXIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIGxldmVsIHNoaWZ0IHdoaWNoIHNjYWxlcyBtYXggY29lZmYgdG8gYXZhaWxhYmxlIGJpdHMgKi8KKyAgICBzaCA9IG1heF9zaGlmdDsKKyAgICB3aGlsZSgoY21heCAqICgxIDw8IHNoKSA+IHFtYXgpICYmIChzaCA+IDApKSB7CisgICAgICAgIHNoLS07CisgICAgfQorCisgICAgLyogc2luY2UgbmVnYXRpdmUgc2hpZnQgdmFsdWVzIGFyZSB1bnN1cHBvcnRlZCBpbiBkZWNvZGVyLCBzY2FsZSBkb3duCisgICAgICAgY29lZmZpY2llbnRzIGluc3RlYWQgKi8KKyAgICBpZihzaCA9PSAwICYmIGNtYXggPiBxbWF4KSB7CisgICAgICAgIGRvdWJsZSBzY2FsZSA9ICgoZG91YmxlKXFtYXgpIC8gY21heDsKKyAgICAgICAgZm9yKGk9MDsgaTxvcmRlcjsgaSsrKSB7CisgICAgICAgICAgICBscGNfaW5baV0gKj0gc2NhbGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBvdXRwdXQgcXVhbnRpemVkIGNvZWZmaWNpZW50cyBhbmQgbGV2ZWwgc2hpZnQgKi8KKyAgICBlcnJvcj0wOworICAgIGZvcihpPTA7IGk8b3JkZXI7IGkrKykgeworICAgICAgICBlcnJvciAtPSBscGNfaW5baV0gKiAoMSA8PCBzaCk7CisgICAgICAgIGxwY19vdXRbaV0gPSBhdl9jbGlwKGxyaW50ZihlcnJvciksIC1xbWF4LCBxbWF4KTsKKyAgICAgICAgZXJyb3IgLT0gbHBjX291dFtpXTsKKyAgICB9CisgICAgKnNoaWZ0ID0gc2g7Cit9CisKK3N0YXRpYyBpbnQgZXN0aW1hdGVfYmVzdF9vcmRlcihkb3VibGUgKnJlZiwgaW50IG1pbl9vcmRlciwgaW50IG1heF9vcmRlcikKK3sKKyAgICBpbnQgaSwgZXN0OworCisgICAgZXN0ID0gbWluX29yZGVyOworICAgIGZvcihpPW1heF9vcmRlci0xOyBpPj1taW5fb3JkZXItMTsgaS0tKSB7CisgICAgICAgIGlmKHJlZltpXSA+IDAuMTApIHsKKyAgICAgICAgICAgIGVzdCA9IGkrMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlc3Q7Cit9CisKK2ludCBmZl9scGNfY2FsY19yZWZfY29lZnMoTFBDQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqc2FtcGxlcywgaW50IG9yZGVyLCBkb3VibGUgKnJlZikKK3sKKyAgICBkb3VibGUgYXV0b2NbTUFYX0xQQ19PUkRFUiArIDFdOworCisgICAgcy0+bHBjX2FwcGx5X3dlbGNoX3dpbmRvdyhzYW1wbGVzLCBzLT5ibG9ja3NpemUsIHMtPndpbmRvd2VkX3NhbXBsZXMpOworICAgIHMtPmxwY19jb21wdXRlX2F1dG9jb3JyKHMtPndpbmRvd2VkX3NhbXBsZXMsIHMtPmJsb2Nrc2l6ZSwgb3JkZXIsIGF1dG9jKTsKKyAgICBjb21wdXRlX3JlZl9jb2VmcyhhdXRvYywgb3JkZXIsIHJlZiwgTlVMTCk7CisKKyAgICByZXR1cm4gb3JkZXI7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIExQQyBjb2VmZmljaWVudHMgZm9yIG11bHRpcGxlIG9yZGVycworICoKKyAqIEBwYXJhbSBscGNfdHlwZSBMUEMgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBjb2VmZmljaWVudHMsCisgKiAgICAgICAgICAgICAgICAgc2VlICNGRkxQQ1R5cGUgZm9yIGRldGFpbHMKKyAqLworaW50IGZmX2xwY19jYWxjX2NvZWZzKExQQ0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqc2FtcGxlcywgaW50IGJsb2Nrc2l6ZSwgaW50IG1pbl9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X29yZGVyLCBpbnQgcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29lZnNbXVtNQVhfTFBDX09SREVSXSwgaW50ICpzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICBlbnVtIEZGTFBDVHlwZSBscGNfdHlwZSwgaW50IGxwY19wYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG9tZXRob2QsIGludCBtYXhfc2hpZnQsIGludCB6ZXJvX3NoaWZ0KQoreworICAgIGRvdWJsZSBhdXRvY1tNQVhfTFBDX09SREVSKzFdOworICAgIGRvdWJsZSByZWZbTUFYX0xQQ19PUkRFUl0gPSB7IDAgfTsKKyAgICBkb3VibGUgbHBjW01BWF9MUENfT1JERVJdW01BWF9MUENfT1JERVJdOworICAgIGludCBpLCBqLCBwYXNzID0gMDsKKyAgICBpbnQgb3B0X29yZGVyOworCisgICAgYXZfYXNzZXJ0MihtYXhfb3JkZXIgPj0gTUlOX0xQQ19PUkRFUiAmJiBtYXhfb3JkZXIgPD0gTUFYX0xQQ19PUkRFUiAmJgorICAgICAgICAgICBscGNfdHlwZSA+IEZGX0xQQ19UWVBFX0ZJWEVEKTsKKyAgICBhdl9hc3NlcnQwKGxwY190eXBlID09IEZGX0xQQ19UWVBFX0NIT0xFU0tZIHx8IGxwY190eXBlID09IEZGX0xQQ19UWVBFX0xFVklOU09OKTsKKworICAgIC8qIHJlaW5pdCBMUEMgY29udGV4dCBpZiBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZCAqLworICAgIGlmIChibG9ja3NpemUgIT0gcy0+YmxvY2tzaXplIHx8IG1heF9vcmRlciAhPSBzLT5tYXhfb3JkZXIgfHwKKyAgICAgICAgbHBjX3R5cGUgICE9IHMtPmxwY190eXBlKSB7CisgICAgICAgIGZmX2xwY19lbmQocyk7CisgICAgICAgIGZmX2xwY19pbml0KHMsIGJsb2Nrc2l6ZSwgbWF4X29yZGVyLCBscGNfdHlwZSk7CisgICAgfQorCisgICAgaWYobHBjX3Bhc3NlcyA8PSAwKQorICAgICAgICBscGNfcGFzc2VzID0gMjsKKworICAgIGlmIChscGNfdHlwZSA9PSBGRl9MUENfVFlQRV9MRVZJTlNPTiB8fCAobHBjX3R5cGUgPT0gRkZfTFBDX1RZUEVfQ0hPTEVTS1kgJiYgbHBjX3Bhc3NlcyA+IDEpKSB7CisgICAgICAgIHMtPmxwY19hcHBseV93ZWxjaF93aW5kb3coc2FtcGxlcywgYmxvY2tzaXplLCBzLT53aW5kb3dlZF9zYW1wbGVzKTsKKworICAgICAgICBzLT5scGNfY29tcHV0ZV9hdXRvY29ycihzLT53aW5kb3dlZF9zYW1wbGVzLCBibG9ja3NpemUsIG1heF9vcmRlciwgYXV0b2MpOworCisgICAgICAgIGNvbXB1dGVfbHBjX2NvZWZzKGF1dG9jLCBtYXhfb3JkZXIsICZscGNbMF1bMF0sIE1BWF9MUENfT1JERVIsIDAsIDEpOworCisgICAgICAgIGZvcihpPTA7IGk8bWF4X29yZGVyOyBpKyspCisgICAgICAgICAgICByZWZbaV0gPSBmYWJzKGxwY1tpXVtpXSk7CisKKyAgICAgICAgcGFzcysrOworICAgIH0KKworICAgIGlmIChscGNfdHlwZSA9PSBGRl9MUENfVFlQRV9DSE9MRVNLWSkgeworICAgICAgICBMTFNNb2RlbCAqbSA9IHMtPmxsc19tb2RlbHM7CisgICAgICAgIExPQ0FMX0FMSUdORUQoMzIsIGRvdWJsZSwgdmFyLCBbRkZBTElHTihNQVhfTFBDX09SREVSKzEsNCldKTsKKyAgICAgICAgZG91YmxlIGF2X3VuaW5pdCh3ZWlnaHQpOworICAgICAgICBtZW1zZXQodmFyLCAwLCBGRkFMSUdOKE1BWF9MUENfT1JERVIrMSw0KSpzaXplb2YoKnZhcikpOworCisgICAgICAgIGZvcihqPTA7IGo8bWF4X29yZGVyOyBqKyspCisgICAgICAgICAgICBtWzBdLmNvZWZmW21heF9vcmRlci0xXVtqXSA9IC1scGNbbWF4X29yZGVyLTFdW2pdOworCisgICAgICAgIGZvcig7IHBhc3M8bHBjX3Bhc3NlczsgcGFzcysrKXsKKyAgICAgICAgICAgIGF2cHJpdl9pbml0X2xscygmbVtwYXNzJjFdLCBtYXhfb3JkZXIpOworCisgICAgICAgICAgICB3ZWlnaHQ9MDsKKyAgICAgICAgICAgIGZvcihpPW1heF9vcmRlcjsgaTxibG9ja3NpemU7IGkrKyl7CisgICAgICAgICAgICAgICAgZm9yKGo9MDsgajw9bWF4X29yZGVyOyBqKyspCisgICAgICAgICAgICAgICAgICAgIHZhcltqXT0gc2FtcGxlc1tpLWpdOworCisgICAgICAgICAgICAgICAgaWYocGFzcyl7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBldmFsLCBpbnYsIHJpbnY7CisgICAgICAgICAgICAgICAgICAgIGV2YWw9IG1bcGFzcyYxXS5ldmFsdWF0ZV9sbHMoJm1bKHBhc3MtMSkmMV0sIHZhcisxLCBtYXhfb3JkZXItMSk7CisgICAgICAgICAgICAgICAgICAgIGV2YWw9ICg1MTI+PnBhc3MpICsgZmFicyhldmFsIC0gdmFyWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgaW52ID0gMS9ldmFsOworICAgICAgICAgICAgICAgICAgICByaW52ID0gc3FydChpbnYpOworICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wOyBqPD1tYXhfb3JkZXI7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcltqXSAqPSByaW52OworICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgKz0gaW52OworICAgICAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgICAgIHdlaWdodCsrOworCisgICAgICAgICAgICAgICAgbVtwYXNzJjFdLnVwZGF0ZV9sbHMoJm1bcGFzcyYxXSwgdmFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2cHJpdl9zb2x2ZV9sbHMoJm1bcGFzcyYxXSwgMC4wMDEsIDApOworICAgICAgICB9CisKKyAgICAgICAgZm9yKGk9MDsgaTxtYXhfb3JkZXI7IGkrKyl7CisgICAgICAgICAgICBmb3Ioaj0wOyBqPG1heF9vcmRlcjsgaisrKQorICAgICAgICAgICAgICAgIGxwY1tpXVtqXT0tbVsocGFzcy0xKSYxXS5jb2VmZltpXVtqXTsKKyAgICAgICAgICAgIHJlZltpXT0gc3FydChtWyhwYXNzLTEpJjFdLnZhcmlhbmNlW2ldIC8gd2VpZ2h0KSAqIChibG9ja3NpemUgLSBtYXhfb3JkZXIpIC8gNDAwMDsKKyAgICAgICAgfQorICAgICAgICBmb3IoaT1tYXhfb3JkZXItMTsgaT4wOyBpLS0pCisgICAgICAgICAgICByZWZbaV0gPSByZWZbaS0xXSAtIHJlZltpXTsKKyAgICB9CisKKyAgICBvcHRfb3JkZXIgPSBtYXhfb3JkZXI7CisKKyAgICBpZihvbWV0aG9kID09IE9SREVSX01FVEhPRF9FU1QpIHsKKyAgICAgICAgb3B0X29yZGVyID0gZXN0aW1hdGVfYmVzdF9vcmRlcihyZWYsIG1pbl9vcmRlciwgbWF4X29yZGVyKTsKKyAgICAgICAgaSA9IG9wdF9vcmRlci0xOworICAgICAgICBxdWFudGl6ZV9scGNfY29lZnMobHBjW2ldLCBpKzEsIHByZWNpc2lvbiwgY29lZnNbaV0sICZzaGlmdFtpXSwgbWF4X3NoaWZ0LCB6ZXJvX3NoaWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaT1taW5fb3JkZXItMTsgaTxtYXhfb3JkZXI7IGkrKykgeworICAgICAgICAgICAgcXVhbnRpemVfbHBjX2NvZWZzKGxwY1tpXSwgaSsxLCBwcmVjaXNpb24sIGNvZWZzW2ldLCAmc2hpZnRbaV0sIG1heF9zaGlmdCwgemVyb19zaGlmdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3B0X29yZGVyOworfQorCithdl9jb2xkIGludCBmZl9scGNfaW5pdChMUENDb250ZXh0ICpzLCBpbnQgYmxvY2tzaXplLCBpbnQgbWF4X29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBGRkxQQ1R5cGUgbHBjX3R5cGUpCit7CisgICAgcy0+YmxvY2tzaXplID0gYmxvY2tzaXplOworICAgIHMtPm1heF9vcmRlciA9IG1heF9vcmRlcjsKKyAgICBzLT5scGNfdHlwZSAgPSBscGNfdHlwZTsKKworICAgIHMtPndpbmRvd2VkX2J1ZmZlciA9IGF2X21hbGxvY3ooKGJsb2Nrc2l6ZSArIDIgKyBGRkFMSUdOKG1heF9vcmRlciwgNCkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+d2luZG93ZWRfc2FtcGxlcykpOworICAgIGlmICghcy0+d2luZG93ZWRfYnVmZmVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHMtPndpbmRvd2VkX3NhbXBsZXMgPSBzLT53aW5kb3dlZF9idWZmZXIgKyBGRkFMSUdOKG1heF9vcmRlciwgNCk7CisKKyAgICBzLT5scGNfYXBwbHlfd2VsY2hfd2luZG93ID0gbHBjX2FwcGx5X3dlbGNoX3dpbmRvd19jOworICAgIHMtPmxwY19jb21wdXRlX2F1dG9jb3JyICAgPSBscGNfY29tcHV0ZV9hdXRvY29ycl9jOworCisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9scGNfaW5pdF94ODYocyk7CisKKyAgICByZXR1cm4gMDsKK30KKworYXZfY29sZCB2b2lkIGZmX2xwY19lbmQoTFBDQ29udGV4dCAqcykKK3sKKyAgICBhdl9mcmVlcCgmcy0+d2luZG93ZWRfYnVmZmVyKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2xwYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbHBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhY2IzNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xwYy5oCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogTFBDIHV0aWxpdHkgY29kZQorICogQ29weXJpZ2h0IChjKSAyMDA2ICBKdXN0aW4gUnVnZ2xlcyA8anVzdGluLnJ1Z2dsZXNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTFBDX0gKKyNkZWZpbmUgQVZDT0RFQ19MUENfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xscy5oIgorCisjZGVmaW5lIE9SREVSX01FVEhPRF9FU1QgICAgIDAKKyNkZWZpbmUgT1JERVJfTUVUSE9EXzJMRVZFTCAgMQorI2RlZmluZSBPUkRFUl9NRVRIT0RfNExFVkVMICAyCisjZGVmaW5lIE9SREVSX01FVEhPRF84TEVWRUwgIDMKKyNkZWZpbmUgT1JERVJfTUVUSE9EX1NFQVJDSCAgNAorI2RlZmluZSBPUkRFUl9NRVRIT0RfTE9HICAgICA1CisKKyNkZWZpbmUgTUlOX0xQQ19PUkRFUiAgICAgICAgMQorI2RlZmluZSBNQVhfTFBDX09SREVSICAgICAgIDMyCisKKy8qKgorICogTFBDIGFuYWx5c2lzIHR5cGUKKyAqLworZW51bSBGRkxQQ1R5cGUgeworICAgIEZGX0xQQ19UWVBFX0RFRkFVTFQgICAgID0gLTEsIC8vLzwgdXNlIHRoZSBjb2RlYyBkZWZhdWx0IExQQyB0eXBlCisgICAgRkZfTFBDX1RZUEVfTk9ORSAgICAgICAgPSAgMCwgLy8vPCBkbyBub3QgdXNlIExQQyBwcmVkaWN0aW9uIG9yIHVzZSBhbGwgemVybyBjb2VmZmljaWVudHMKKyAgICBGRl9MUENfVFlQRV9GSVhFRCAgICAgICA9ICAxLCAvLy88IGZpeGVkIExQQyBjb2VmZmljaWVudHMKKyAgICBGRl9MUENfVFlQRV9MRVZJTlNPTiAgICA9ICAyLCAvLy88IExldmluc29uLUR1cmJpbiByZWN1cnNpb24KKyAgICBGRl9MUENfVFlQRV9DSE9MRVNLWSAgICA9ICAzLCAvLy88IENob2xlc2t5IGZhY3Rvcml6YXRpb24KKyAgICBGRl9MUENfVFlQRV9OQiAgICAgICAgICAgICAgLCAvLy88IE5vdCBwYXJ0IG9mIEFCSQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgTFBDQ29udGV4dCB7CisgICAgaW50IGJsb2Nrc2l6ZTsKKyAgICBpbnQgbWF4X29yZGVyOworICAgIGVudW0gRkZMUENUeXBlIGxwY190eXBlOworICAgIGRvdWJsZSAqd2luZG93ZWRfYnVmZmVyOworICAgIGRvdWJsZSAqd2luZG93ZWRfc2FtcGxlczsKKworICAgIC8qKgorICAgICAqIEFwcGx5IGEgV2VsY2ggd2luZG93IHRvIGFuIGFycmF5IG9mIGlucHV0IHNhbXBsZXMuCisgICAgICogVGhlIG91dHB1dCBzYW1wbGVzIGhhdmUgdGhlIHNhbWUgc2NhbGUgYXMgdGhlIGlucHV0LCBidXQgYXJlIGluIGRvdWJsZQorICAgICAqIHNhbXBsZSBmb3JtYXQuCisgICAgICogQHBhcmFtIGRhdGEgICAgaW5wdXQgc2FtcGxlcworICAgICAqIEBwYXJhbSBsZW4gICAgIG51bWJlciBvZiBpbnB1dCBzYW1wbGVzCisgICAgICogQHBhcmFtIHdfZGF0YSAgb3V0cHV0IHNhbXBsZXMKKyAgICAgKi8KKyAgICB2b2lkICgqbHBjX2FwcGx5X3dlbGNoX3dpbmRvdykoY29uc3QgaW50MzJfdCAqZGF0YSwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp3X2RhdGEpOworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYXV0b2NvcnJlbGF0aW9uIG9uIGlucHV0IHNhbXBsZXMgd2l0aCBkZWxheSBvZiAwIHRvIGxhZy4KKyAgICAgKiBAcGFyYW0gZGF0YSAgaW5wdXQgc2FtcGxlcy4KKyAgICAgKiAgICAgICAgICAgICAgY29uc3RyYWludHM6IG5vIGFsaWdubWVudCBuZWVkZWQsIGJ1dCBtdXN0IGhhdmUgYXQKKyAgICAgKiAgICAgICAgICAgICAgbGVhc3QgbGFnKnNpemVvZihkb3VibGUpIHZhbGlkIGJ5dGVzIHByZWNlZGluZyBpdCwgYW5kCisgICAgICogICAgICAgICAgICAgIHNpemUgbXVzdCBiZSBhdCBsZWFzdCAobGVuKzEpKnNpemVvZihkb3VibGUpIGlmIGRhdGEgaXMKKyAgICAgKiAgICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbmVkIG9yIChsZW4rMikqc2l6ZW9mKGRvdWJsZSkgaWYgZGF0YSBpcworICAgICAqICAgICAgICAgICAgICB1bmFsaWduZWQuCisgICAgICogQHBhcmFtIGxlbiAgIG51bWJlciBvZiBpbnB1dCBzYW1wbGVzIHRvIHByb2Nlc3MKKyAgICAgKiBAcGFyYW0gbGFnICAgbWF4aW11bSBkZWxheSB0byBjYWxjdWxhdGUKKyAgICAgKiBAcGFyYW0gYXV0b2Mgb3V0cHV0IGF1dG9jb3JyZWxhdGlvbiBjb2VmZmljaWVudHMuCisgICAgICogICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBhcnJheSBzaXplIG11c3QgYmUgYXQgbGVhc3QgbGFnKzEuCisgICAgICovCisgICAgdm9pZCAoKmxwY19jb21wdXRlX2F1dG9jb3JyKShjb25zdCBkb3VibGUgKmRhdGEsIGludCBsZW4sIGludCBsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKmF1dG9jKTsKKworICAgIC8vIFRPRE86IHRoZXNlIHNob3VsZCBiZSBhbGxvY2F0ZWQgdG8gcmVkdWNlIEFCSSBjb21wYXRpYmlsaXR5IGlzc3VlcworICAgIExMU01vZGVsIGxsc19tb2RlbHNbMl07Cit9IExQQ0NvbnRleHQ7CisKKworLyoqCisgKiBDYWxjdWxhdGUgTFBDIGNvZWZmaWNpZW50cyBmb3IgbXVsdGlwbGUgb3JkZXJzCisgKi8KK2ludCBmZl9scGNfY2FsY19jb2VmcyhMUENDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKnNhbXBsZXMsIGludCBibG9ja3NpemUsIGludCBtaW5fb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9vcmRlciwgaW50IHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZWZzW11bTUFYX0xQQ19PUkRFUl0sIGludCAqc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgZW51bSBGRkxQQ1R5cGUgbHBjX3R5cGUsIGludCBscGNfcGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBvbWV0aG9kLCBpbnQgbWF4X3NoaWZ0LCBpbnQgemVyb19zaGlmdCk7CisKK2ludCBmZl9scGNfY2FsY19yZWZfY29lZnMoTFBDQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqc2FtcGxlcywgaW50IG9yZGVyLCBkb3VibGUgKnJlZik7CisKKy8qKgorICogSW5pdGlhbGl6ZSBMUENDb250ZXh0LgorICovCitpbnQgZmZfbHBjX2luaXQoTFBDQ29udGV4dCAqcywgaW50IGJsb2Nrc2l6ZSwgaW50IG1heF9vcmRlciwKKyAgICAgICAgICAgICAgICBlbnVtIEZGTFBDVHlwZSBscGNfdHlwZSk7Cit2b2lkIGZmX2xwY19pbml0X3g4NihMUENDb250ZXh0ICpzKTsKKworLyoqCisgKiBVbmluaXRpYWxpemUgTFBDQ29udGV4dC4KKyAqLwordm9pZCBmZl9scGNfZW5kKExQQ0NvbnRleHQgKnMpOworCisjaWZkZWYgTFBDX1VTRV9ET1VCTEUKKyNkZWZpbmUgTFBDX1RZUEUgZG91YmxlCisjZWxzZQorI2RlZmluZSBMUENfVFlQRSBmbG9hdAorI2VuZGlmCisKKy8qKgorICogU2NodXIgcmVjdXJzaW9uLgorICogUHJvZHVjZXMgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMgZnJvbSBhdXRvY29ycmVsYXRpb24gZGF0YS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNvbXB1dGVfcmVmX2NvZWZzKGNvbnN0IExQQ19UWVBFICphdXRvYywgaW50IG1heF9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENfVFlQRSAqcmVmLCBMUENfVFlQRSAqZXJyb3IpCit7CisgICAgaW50IGksIGo7CisgICAgTFBDX1RZUEUgZXJyOworICAgIExQQ19UWVBFIGdlbjBbTUFYX0xQQ19PUkRFUl0sIGdlbjFbTUFYX0xQQ19PUkRFUl07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X29yZGVyOyBpKyspCisgICAgICAgIGdlbjBbaV0gPSBnZW4xW2ldID0gYXV0b2NbaSArIDFdOworCisgICAgZXJyICAgID0gYXV0b2NbMF07CisgICAgcmVmWzBdID0gLWdlbjFbMF0gLyBlcnI7CisgICAgZXJyICAgKz0gIGdlbjFbMF0gKiByZWZbMF07CisgICAgaWYgKGVycm9yKQorICAgICAgICBlcnJvclswXSA9IGVycjsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbWF4X29yZGVyOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG1heF9vcmRlciAtIGk7IGorKykgeworICAgICAgICAgICAgZ2VuMVtqXSA9IGdlbjFbaiArIDFdICsgcmVmW2kgLSAxXSAqIGdlbjBbal07CisgICAgICAgICAgICBnZW4wW2pdID0gZ2VuMVtqICsgMV0gKiByZWZbaSAtIDFdICsgZ2VuMFtqXTsKKyAgICAgICAgfQorICAgICAgICByZWZbaV0gPSAtZ2VuMVswXSAvIGVycjsKKyAgICAgICAgZXJyICAgKz0gIGdlbjFbMF0gKiByZWZbaV07CisgICAgICAgIGlmIChlcnJvcikKKyAgICAgICAgICAgIGVycm9yW2ldID0gZXJyOworICAgIH0KK30KKworLyoqCisgKiBMZXZpbnNvbi1EdXJiaW4gcmVjdXJzaW9uLgorICogUHJvZHVjZSBMUEMgY29lZmZpY2llbnRzIGZyb20gYXV0b2NvcnJlbGF0aW9uIGRhdGEuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbXB1dGVfbHBjX2NvZWZzKGNvbnN0IExQQ19UWVBFICphdXRvYywgaW50IG1heF9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ19UWVBFICpscGMsIGludCBscGNfc3RyaWRlLCBpbnQgZmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3JtYWxpemUpCit7CisgICAgaW50IGksIGo7CisgICAgTFBDX1RZUEUgZXJyID0gMDsKKyAgICBMUENfVFlQRSAqbHBjX2xhc3QgPSBscGM7CisKKyAgICBhdl9hc3NlcnQyKG5vcm1hbGl6ZSB8fCAhZmFpbCk7CisKKyAgICBpZiAobm9ybWFsaXplKQorICAgICAgICBlcnIgPSAqYXV0b2MrKzsKKworICAgIGlmIChmYWlsICYmIChhdXRvY1ttYXhfb3JkZXIgLSAxXSA9PSAwIHx8IGVyciA8PSAwKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yKGk9MDsgaTxtYXhfb3JkZXI7IGkrKykgeworICAgICAgICBMUENfVFlQRSByID0gLWF1dG9jW2ldOworCisgICAgICAgIGlmIChub3JtYWxpemUpIHsKKyAgICAgICAgICAgIGZvcihqPTA7IGo8aTsgaisrKQorICAgICAgICAgICAgICAgIHIgLT0gbHBjX2xhc3Rbal0gKiBhdXRvY1tpLWotMV07CisKKyAgICAgICAgICAgIHIgLz0gZXJyOworICAgICAgICAgICAgZXJyICo9IDEuMCAtIChyICogcik7CisgICAgICAgIH0KKworICAgICAgICBscGNbaV0gPSByOworCisgICAgICAgIGZvcihqPTA7IGogPCAoaSsxKT4+MTsgaisrKSB7CisgICAgICAgICAgICBMUENfVFlQRSBmID0gbHBjX2xhc3RbICAgIGpdOworICAgICAgICAgICAgTFBDX1RZUEUgYiA9IGxwY19sYXN0W2ktMS1qXTsKKyAgICAgICAgICAgIGxwY1sgICAgal0gPSBmICsgciAqIGI7CisgICAgICAgICAgICBscGNbaS0xLWpdID0gYiArIHIgKiBmOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhaWwgJiYgZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBscGNfbGFzdCA9IGxwYzsKKyAgICAgICAgbHBjICs9IGxwY19zdHJpZGU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX0xQQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9sc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2xzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZjU5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9sc3AuYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIExTUCByb3V0aW5lcyBmb3IgQUNFTFAtYmFzZWQgY29kZWNzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgKFFDRUxQIGRlY29kZXIpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNkZWZpbmUgRlJBQ19CSVRTIDE0CisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgImxzcC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWlwcy9sc3BfbWlwcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorCit2b2lkIGZmX2FjZWxwX3Jlb3JkZXJfbHNmKGludDE2X3QqIGxzZnEsIGludCBsc2ZxX21pbl9kaXN0YW5jZSwgaW50IGxzZnFfbWluLCBpbnQgbHNmcV9tYXgsIGludCBscF9vcmRlcikKK3sKKyAgICBpbnQgaSwgajsKKworICAgIC8qIHNvcnQgbHNmcSBpbiBhc2NlbmRpbmcgb3JkZXIuIGZsb2F0IGJ1YmJsZSBhZ29yaXRobSwKKyAgICAgICBPKG4pIGlmIGRhdGEgYWxyZWFkeSBzb3J0ZWQsIE8obl4yKSAtIG90aGVyd2lzZSAqLworICAgIGZvcihpPTA7IGk8bHBfb3JkZXItMTsgaSsrKQorICAgICAgICBmb3Ioaj1pOyBqPj0wICYmIGxzZnFbal0gPiBsc2ZxW2orMV07IGotLSkKKyAgICAgICAgICAgIEZGU1dBUChpbnQxNl90LCBsc2ZxW2pdLCBsc2ZxW2orMV0pOworCisgICAgZm9yKGk9MDsgaTxscF9vcmRlcjsgaSsrKQorICAgIHsKKyAgICAgICAgbHNmcVtpXSA9IEZGTUFYKGxzZnFbaV0sIGxzZnFfbWluKTsKKyAgICAgICAgbHNmcV9taW4gPSBsc2ZxW2ldICsgbHNmcV9taW5fZGlzdGFuY2U7CisgICAgfQorICAgIGxzZnFbbHBfb3JkZXItMV0gPSBGRk1JTihsc2ZxW2xwX29yZGVyLTFdLCBsc2ZxX21heCk7Ly9JcyB3YXJuaW5nIHJlcXVpcmVkID8KK30KKwordm9pZCBmZl9zZXRfbWluX2Rpc3RfbHNmKGZsb2F0ICpsc2YsIGRvdWJsZSBtaW5fc3BhY2luZywgaW50IHNpemUpCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgcHJldiA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICBwcmV2ID0gbHNmW2ldID0gRkZNQVgobHNmW2ldLCBwcmV2ICsgbWluX3NwYWNpbmcpOworfQorCisKKy8qIENvc2luZSB0YWJsZTogYmFzZV9jb3NbaV0gPSAoMSA8PCAxNSkgKiBjb3MoaSAqIFBJIC8gNjQpICovCitzdGF0aWMgY29uc3QgaW50MTZfdCB0YWJfY29zWzY1XSA9Cit7CisgIDMyNzY3LCAgMzI3MzgsICAzMjYxNywgIDMyNDIxLCAgMzIxNDUsICAzMTc5MywgIDMxMzY0LCAgMzA4NjAsCisgIDMwMjgwLCAgMjk2MjksICAyODkwNSwgIDI4MTEzLCAgMjcyNTIsICAyNjMyNiwgIDI1MzM2LCAgMjQyODUsCisgIDIzMTc2LCAgMjIwMTEsICAyMDc5MywgIDE5NTI1LCAgMTgyMTAsICAxNjg1MSwgIDE1NDUxLCAgMTQwMTQsCisgIDEyNTQzLCAgMTEwNDMsICAgOTUxNSwgICA3OTY1LCAgIDYzOTUsICAgNDgxMCwgICAzMjE0LCAgIDE2MDksCisgICAgICAxLCAgLTE2MDcsICAtMzIxMSwgIC00ODA4LCAgLTYzOTMsICAtNzk2MiwgIC05NTEzLCAtMTEwNDAsCisgLTEyNTQxLCAtMTQwMTIsIC0xNTQ0OSwgLTE2ODQ4LCAtMTgyMDcsIC0xOTUyMywgLTIwNzkxLCAtMjIwMDksCisgLTIzMTc0LCAtMjQyODMsIC0yNTMzNCwgLTI2MzI0LCAtMjcyNTAsIC0yODExMSwgLTI4OTA0LCAtMjk2MjcsCisgLTMwMjc5LCAtMzA4NTgsIC0zMTM2MywgLTMxNzkyLCAtMzIxNDQsIC0zMjQxOSwgLTMyNjE2LCAtMzI3MzYsIC0zMjc2OCwKK307CisKK3N0YXRpYyBpbnQxNl90IGZmX2Nvcyh1aW50MTZfdCBhcmcpCit7CisgICAgdWludDhfdCBvZmZzZXQ9IGFyZzsKKyAgICB1aW50OF90IGluZCA9IGFyZyA+PiA4OworCisgICAgYXZfYXNzZXJ0MihhcmcgPD0gMHgzZmZmKTsKKworICAgIHJldHVybiB0YWJfY29zW2luZF0gKyAob2Zmc2V0ICogKHRhYl9jb3NbaW5kKzFdIC0gdGFiX2Nvc1tpbmRdKSA+PiA4KTsKK30KKwordm9pZCBmZl9hY2VscF9sc2YybHNwKGludDE2X3QgKmxzcCwgY29uc3QgaW50MTZfdCAqbHNmLCBpbnQgbHBfb3JkZXIpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBDb252ZXJ0IExTRiB0byBMU1AsIGxzcD1jb3MobHNmKSAqLworICAgIGZvcihpPTA7IGk8bHBfb3JkZXI7IGkrKykKKyAgICAgICAgLy8gMjA4NjEgPSAyLjAgLyBQSSBpbiAoMC4xNSkKKyAgICAgICAgbHNwW2ldID0gZmZfY29zKGxzZltpXSAqIDIwODYxID4+IDE1KTsgLy8gZGl2aWRlIGJ5IFBJIGFuZCAoMCwxMykgLT4gKDAsMTQpCit9CisKK3ZvaWQgZmZfYWNlbHBfbHNmMmxzcGQoZG91YmxlICpsc3AsIGNvbnN0IGZsb2F0ICpsc2YsIGludCBscF9vcmRlcikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMDsgaSA8IGxwX29yZGVyOyBpKyspCisgICAgICAgIGxzcFtpXSA9IGNvcygyLjAgKiBNX1BJICogbHNmW2ldKTsKK30KKworLyoqCisgKiBAYnJpZWYgZGVjb2RlcyBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyBmcm9tIExTUAorICogQHBhcmFtW291dF0gZiBkZWNvZGVkIHBvbHlub21pYWwgY29lZmZpY2llbnRzICgtMHgyMDAwMDAwMCA8PSAoMy4yMikgPD0gMHgxZmZmZmZmZikKKyAqIEBwYXJhbSBsc3AgTFNQIGNvZWZmaWNpZW50cyAoLTB4ODAwMCA8PSAoMC4xNSkgPD0gMHg3ZmZmKQorICovCitzdGF0aWMgdm9pZCBsc3AycG9seShpbnQqIGYsIGNvbnN0IGludDE2X3QqIGxzcCwgaW50IGxwX2hhbGZfb3JkZXIpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmWzBdID0gMHg0MDAwMDA7ICAgICAgICAgIC8vIDEuMCBpbiAoMy4yMikKKyAgICBmWzFdID0gLWxzcFswXSA8PCA4OyAgICAgIC8vICoyIGFuZCAoMC4xNSkgLT4gKDMuMjIpCisKKyAgICBmb3IoaT0yOyBpPD1scF9oYWxmX29yZGVyOyBpKyspCisgICAgeworICAgICAgICBmW2ldID0gZltpLTJdOworICAgICAgICBmb3Ioaj1pOyBqPjE7IGotLSkKKyAgICAgICAgICAgIGZbal0gLT0gTVVMTChmW2otMV0sIGxzcFsyKmktMl0sIEZSQUNfQklUUykgLSBmW2otMl07CisKKyAgICAgICAgZlsxXSAtPSBsc3BbMippLTJdIDw8IDg7CisgICAgfQorfQorCit2b2lkIGZmX2FjZWxwX2xzcDJscGMoaW50MTZfdCogbHAsIGNvbnN0IGludDE2X3QqIGxzcCwgaW50IGxwX2hhbGZfb3JkZXIpCit7CisgICAgaW50IGk7CisgICAgaW50IGYxW01BWF9MUF9IQUxGX09SREVSKzFdOyAvLyAoMy4yMikKKyAgICBpbnQgZjJbTUFYX0xQX0hBTEZfT1JERVIrMV07IC8vICgzLjIyKQorCisgICAgbHNwMnBvbHkoZjEsIGxzcCAgLCBscF9oYWxmX29yZGVyKTsKKyAgICBsc3AycG9seShmMiwgbHNwKzEsIGxwX2hhbGZfb3JkZXIpOworCisgICAgLyogMy4yLjYgb2YgRy43MjksIEVxdWF0aW9ucyAyNSBhbmQgIDI2Ki8KKyAgICBscFswXSA9IDQwOTY7CisgICAgZm9yKGk9MTsgaTxscF9oYWxmX29yZGVyKzE7IGkrKykKKyAgICB7CisgICAgICAgIGludCBmZjEgPSBmMVtpXSArIGYxW2ktMV07IC8vICgzLjIyKQorICAgICAgICBpbnQgZmYyID0gZjJbaV0gLSBmMltpLTFdOyAvLyAoMy4yMikKKworICAgICAgICBmZjEgKz0gMSA8PCAxMDsgLy8gZm9yIHJvdW5kaW5nCisgICAgICAgIGxwW2ldICAgID0gKGZmMSArIGZmMikgPj4gMTE7IC8vIGRpdmlkZSBieSAyIGFuZCAoMy4yMikgLT4gKDMuMTIpCisgICAgICAgIGxwWyhscF9oYWxmX29yZGVyIDw8IDEpICsgMSAtIGldID0gKGZmMSAtIGZmMikgPj4gMTE7IC8vIGRpdmlkZSBieSAyIGFuZCAoMy4yMikgLT4gKDMuMTIpCisgICAgfQorfQorCit2b2lkIGZmX2FtcndiX2xzcDJscGMoY29uc3QgZG91YmxlICpsc3AsIGZsb2F0ICpscCwgaW50IGxwX29yZGVyKQoreworICAgIGludCBscF9oYWxmX29yZGVyID0gbHBfb3JkZXIgPj4gMTsKKyAgICBkb3VibGUgYnVmW01BWF9MUF9IQUxGX09SREVSICsgMV07CisgICAgZG91YmxlIHBhW01BWF9MUF9IQUxGX09SREVSICsgMV07CisgICAgZG91YmxlICpxYSA9IGJ1ZiArIDE7CisgICAgaW50IGksajsKKworICAgIHFhWy0xXSA9IDAuMDsKKworICAgIGZmX2xzcDJwb2x5Zihsc3AgICAgLCBwYSwgbHBfaGFsZl9vcmRlciAgICApOworICAgIGZmX2xzcDJwb2x5Zihsc3AgKyAxLCBxYSwgbHBfaGFsZl9vcmRlciAtIDEpOworCisgICAgZm9yIChpID0gMSwgaiA9IGxwX29yZGVyIC0gMTsgaSA8IGxwX2hhbGZfb3JkZXI7IGkrKywgai0tKSB7CisgICAgICAgIGRvdWJsZSBwYWYgPSAgcGFbaV0gICAgICAgICAgICAqICgxICsgbHNwW2xwX29yZGVyIC0gMV0pOworICAgICAgICBkb3VibGUgcWFmID0gKHFhW2ldIC0gcWFbaS0yXSkgKiAoMSAtIGxzcFtscF9vcmRlciAtIDFdKTsKKyAgICAgICAgbHBbaS0xXSAgPSAocGFmICsgcWFmKSAqIDAuNTsKKyAgICAgICAgbHBbai0xXSAgPSAocGFmIC0gcWFmKSAqIDAuNTsKKyAgICB9CisKKyAgICBscFtscF9oYWxmX29yZGVyIC0gMV0gPSAoMS4wICsgbHNwW2xwX29yZGVyIC0gMV0pICoKKyAgICAgICAgcGFbbHBfaGFsZl9vcmRlcl0gKiAwLjU7CisKKyAgICBscFtscF9vcmRlciAtIDFdID0gbHNwW2xwX29yZGVyIC0gMV07Cit9CisKK3ZvaWQgZmZfYWNlbHBfbHBfZGVjb2RlKGludDE2X3QqIGxwXzFzdCwgaW50MTZfdCogbHBfMm5kLCBjb25zdCBpbnQxNl90KiBsc3BfMm5kLCBjb25zdCBpbnQxNl90KiBsc3BfcHJldiwgaW50IGxwX29yZGVyKQoreworICAgIGludDE2X3QgbHNwXzFzdFtNQVhfTFBfT1JERVJdOyAvLyAoMC4xNSkKKyAgICBpbnQgaTsKKworICAgIC8qIExTUCB2YWx1ZXMgZm9yIGZpcnN0IHN1YmZyYW1lICgzLjIuNSBvZiBHLjcyOSwgRXF1YXRpb24gMjQpKi8KKyAgICBmb3IoaT0wOyBpPGxwX29yZGVyOyBpKyspCisjaWZkZWYgRzcyOV9CSVRFWEFDVAorICAgICAgICBsc3BfMXN0W2ldID0gKGxzcF8ybmRbaV0gPj4gMSkgKyAobHNwX3ByZXZbaV0gPj4gMSk7CisjZWxzZQorICAgICAgICBsc3BfMXN0W2ldID0gKGxzcF8ybmRbaV0gKyBsc3BfcHJldltpXSkgPj4gMTsKKyNlbmRpZgorCisgICAgZmZfYWNlbHBfbHNwMmxwYyhscF8xc3QsIGxzcF8xc3QsIGxwX29yZGVyID4+IDEpOworCisgICAgLyogTFNQIHZhbHVlcyBmb3Igc2Vjb25kIHN1YmZyYW1lICgzLjIuNSBvZiBHLjcyOSkqLworICAgIGZmX2FjZWxwX2xzcDJscGMobHBfMm5kLCBsc3BfMm5kLCBscF9vcmRlciA+PiAxKTsKK30KKworI2lmbmRlZiBmZl9sc3AycG9seWYKK3ZvaWQgZmZfbHNwMnBvbHlmKGNvbnN0IGRvdWJsZSAqbHNwLCBkb3VibGUgKmYsIGludCBscF9oYWxmX29yZGVyKQoreworICAgIGludCBpLCBqOworCisgICAgZlswXSA9IDEuMDsKKyAgICBmWzFdID0gLTIgKiBsc3BbMF07CisgICAgbHNwIC09IDI7CisgICAgZm9yKGk9MjsgaTw9bHBfaGFsZl9vcmRlcjsgaSsrKQorICAgIHsKKyAgICAgICAgZG91YmxlIHZhbCA9IC0yICogbHNwWzIqaV07CisgICAgICAgIGZbaV0gPSB2YWwgKiBmW2ktMV0gKyAyKmZbaS0yXTsKKyAgICAgICAgZm9yKGo9aS0xOyBqPjE7IGotLSkKKyAgICAgICAgICAgIGZbal0gKz0gZltqLTFdICogdmFsICsgZltqLTJdOworICAgICAgICBmWzFdICs9IHZhbDsKKyAgICB9Cit9CisjZW5kaWYgLyogZmZfbHNwMnBvbHlmICovCisKK3ZvaWQgZmZfYWNlbHBfbHNwZDJscGMoY29uc3QgZG91YmxlICpsc3AsIGZsb2F0ICpscGMsIGludCBscF9oYWxmX29yZGVyKQoreworICAgIGRvdWJsZSBwYVtNQVhfTFBfSEFMRl9PUkRFUisxXSwgcWFbTUFYX0xQX0hBTEZfT1JERVIrMV07CisgICAgZmxvYXQgKmxwYzIgPSBscGMgKyAobHBfaGFsZl9vcmRlciA8PCAxKSAtIDE7CisKKyAgICBhdl9hc3NlcnQyKGxwX2hhbGZfb3JkZXIgPD0gTUFYX0xQX0hBTEZfT1JERVIpOworCisgICAgZmZfbHNwMnBvbHlmKGxzcCwgICAgIHBhLCBscF9oYWxmX29yZGVyKTsKKyAgICBmZl9sc3AycG9seWYobHNwICsgMSwgcWEsIGxwX2hhbGZfb3JkZXIpOworCisgICAgd2hpbGUgKGxwX2hhbGZfb3JkZXItLSkgeworICAgICAgICBkb3VibGUgcGFmID0gcGFbbHBfaGFsZl9vcmRlcisxXSArIHBhW2xwX2hhbGZfb3JkZXJdOworICAgICAgICBkb3VibGUgcWFmID0gcWFbbHBfaGFsZl9vcmRlcisxXSAtIHFhW2xwX2hhbGZfb3JkZXJdOworCisgICAgICAgIGxwYyBbIGxwX2hhbGZfb3JkZXJdID0gMC41KihwYWYrcWFmKTsKKyAgICAgICAgbHBjMlstbHBfaGFsZl9vcmRlcl0gPSAwLjUqKHBhZi1xYWYpOworICAgIH0KK30KKwordm9pZCBmZl9zb3J0X25lYXJseV9zb3J0ZWRfZmxvYXRzKGZsb2F0ICp2YWxzLCBpbnQgbGVuKQoreworICAgIGludCBpLGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKQorICAgICAgICBmb3IgKGogPSBpOyBqID49IDAgJiYgdmFsc1tqXSA+IHZhbHNbaisxXTsgai0tKQorICAgICAgICAgICAgRkZTV0FQKGZsb2F0LCB2YWxzW2pdLCB2YWxzW2orMV0pOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy9sc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmEyZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbHNwLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBMU1AgY29tcHV0aW5nIGZvciBBQ0VMUC1iYXNlZCBjb2RlY3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19MU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKgorICAoSS5GKSBtZWFucyBmaXhlZC1wb2ludCB2YWx1ZSB3aXRoIEYgZnJhY3Rpb25hbCBhbmQgSSBpbnRlZ2VyIGJpdHMKKyovCisKKy8qKgorICogQGJyaWVmIGVuc3VyZSBhIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiBMU0ZzCisgKiBAcGFyYW1baW4sb3V0XSBsc2ZxIExTRiB0byBjaGVjayBhbmQgYWRqdXN0CisgKiBAcGFyYW0gbHNmcV9taW5fZGlzdGFuY2UgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIExTRnMKKyAqIEBwYXJhbSBsc2ZxX21pbiBtaW5pbXVtIGFsbG93ZWQgTFNGIHZhbHVlCisgKiBAcGFyYW0gbHNmcV9tYXggbWF4aW11bSBhbGxvd2VkIExTRiB2YWx1ZQorICogQHBhcmFtIGxwX29yZGVyIExQIGZpbHRlciBvcmRlcgorICovCit2b2lkIGZmX2FjZWxwX3Jlb3JkZXJfbHNmKGludDE2X3QqIGxzZnEsIGludCBsc2ZxX21pbl9kaXN0YW5jZSwgaW50IGxzZnFfbWluLCBpbnQgbHNmcV9tYXgsIGludCBscF9vcmRlcik7CisKKy8qKgorICogQWRqdXN0IHRoZSBxdWFudGl6ZWQgTFNGcyBzbyB0aGV5IGFyZSBpbmNyZWFzaW5nIGFuZCBub3QgdG9vIGNsb3NlLgorICoKKyAqIFRoaXMgc3RlcCBpcyBub3QgbWVudGlvbmVkIGluIHRoZSBBTVIgc3BlYyBidXQgaXMgaW4gdGhlIHJlZmVyZW5jZSBDIGRlY29kZXIuCisgKiBPbWl0dGluZyB0aGlzIHN0ZXAgY3JlYXRlcyBhdWRpYmxlIGRpc3RvcnRpb24gb24gdGhlIHNpbnVzb2lkYWwgc3dlZXAKKyAqIHRlc3QgdmVjdG9ycyBpbiAzR1BQIFRTIDI2LjA3NC4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBsc2YgICAgTFNGcyBpbiBIZXJ0egorICogQHBhcmFtIG1pbl9zcGFjaW5nICAgIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgbHNmIHZhbHVlcworICogQHBhcmFtIHNpemUgICAgICAgICAgIHNpemUgb2YgdGhlIGxzZiB2ZWN0b3IKKyAqLwordm9pZCBmZl9zZXRfbWluX2Rpc3RfbHNmKGZsb2F0ICpsc2YsIGRvdWJsZSBtaW5fc3BhY2luZywgaW50IHNpemUpOworCisvKioKKyAqIEBicmllZiBDb252ZXJ0IExTRiB0byBMU1AKKyAqIEBwYXJhbVtvdXRdIGxzcCBMU1AgY29lZmZpY2llbnRzICgtMHg4MDAwIDw9ICgwLjE1KSA8IDB4ODAwMCkKKyAqIEBwYXJhbSBsc2Ygbm9ybWFsaXplZCBMU0YgY29lZmZpY2llbnRzICgwIDw9ICgyLjEzKSA8IDB4MjAwMCAqIFBJKQorICogQHBhcmFtIGxwX29yZGVyIExQIGZpbHRlciBvcmRlcgorICoKKyAqIEByZW1hcmsgSXQgaXMgc2FmZSB0byBwYXNzIHRoZSBzYW1lIGFycmF5IGludG8gdGhlIGxzZiBhbmQgbHNwIHBhcmFtZXRlcnMuCisgKi8KK3ZvaWQgZmZfYWNlbHBfbHNmMmxzcChpbnQxNl90ICpsc3AsIGNvbnN0IGludDE2X3QgKmxzZiwgaW50IGxwX29yZGVyKTsKKworLyoqCisgKiBGbG9hdGluZyBwb2ludCB2ZXJzaW9uIG9mIGZmX2FjZWxwX2xzZjJsc3AoKQorICovCit2b2lkIGZmX2FjZWxwX2xzZjJsc3BkKGRvdWJsZSAqbHNwLCBjb25zdCBmbG9hdCAqbHNmLCBpbnQgbHBfb3JkZXIpOworCisvKioKKyAqIEBicmllZiBMU1AgdG8gTFAgY29udmVyc2lvbiAoMy4yLjYgb2YgRy43MjkpCisgKiBAcGFyYW1bb3V0XSBscCBkZWNvZGVkIExQIGNvZWZmaWNpZW50cyAoLTB4ODAwMCA8PSAoMy4xMikgPCAweDgwMDApCisgKiBAcGFyYW0gbHNwIExTUCBjb2VmZmljaWVudHMgKC0weDgwMDAgPD0gKDAuMTUpIDwgMHg4MDAwKQorICogQHBhcmFtIGxwX2hhbGZfb3JkZXIgTFAgZmlsdGVyIG9yZGVyLCBkaXZpZGVkIGJ5IDIKKyAqLwordm9pZCBmZl9hY2VscF9sc3AybHBjKGludDE2X3QqIGxwLCBjb25zdCBpbnQxNl90KiBsc3AsIGludCBscF9oYWxmX29yZGVyKTsKKworLyoqCisgKiBMU1AgdG8gTFAgY29udmVyc2lvbiAoNS4yLjQgb2YgQU1SLVdCKQorICovCit2b2lkIGZmX2FtcndiX2xzcDJscGMoY29uc3QgZG91YmxlICpsc3AsIGZsb2F0ICpscCwgaW50IGxwX29yZGVyKTsKKworLyoqCisgKiBAYnJpZWYgSW50ZXJwb2xhdGUgTFNQIGZvciB0aGUgZmlyc3Qgc3ViZnJhbWUgYW5kIGNvbnZlcnQgTFNQIC0+IExQIGZvciBib3RoIHN1YmZyYW1lcyAoMy4yLjUgYW5kIDMuMi42IG9mIEcuNzI5KQorICogQHBhcmFtW291dF0gbHBfMXN0IGRlY29kZWQgTFAgY29lZmZpY2llbnRzIGZvciBmaXJzdCBzdWJmcmFtZSAgKC0weDgwMDAgPD0gKDMuMTIpIDwgMHg4MDAwKQorICogQHBhcmFtW291dF0gbHBfMm5kIGRlY29kZWQgTFAgY29lZmZpY2llbnRzIGZvciBzZWNvbmQgc3ViZnJhbWUgKC0weDgwMDAgPD0gKDMuMTIpIDwgMHg4MDAwKQorICogQHBhcmFtIGxzcF8ybmQgTFNQIGNvZWZmaWNpZW50cyBvZiB0aGUgc2Vjb25kIHN1YmZyYW1lICgtMHg4MDAwIDw9ICgwLjE1KSA8IDB4ODAwMCkKKyAqIEBwYXJhbSBsc3BfcHJldiBMU1AgY29lZmZpY2llbnRzIGZyb20gdGhlIHNlY29uZCBzdWJmcmFtZSBvZiB0aGUgcHJldmlvdXMgZnJhbWUgKC0weDgwMDAgPD0gKDAuMTUpIDwgMHg4MDAwKQorICogQHBhcmFtIGxwX29yZGVyIExQIGZpbHRlciBvcmRlcgorICovCit2b2lkIGZmX2FjZWxwX2xwX2RlY29kZShpbnQxNl90KiBscF8xc3QsIGludDE2X3QqIGxwXzJuZCwgY29uc3QgaW50MTZfdCogbHNwXzJuZCwgY29uc3QgaW50MTZfdCogbHNwX3ByZXYsIGludCBscF9vcmRlcik7CisKKworI2RlZmluZSBNQVhfTFBfSEFMRl9PUkRFUiAxMAorI2RlZmluZSBNQVhfTFBfT1JERVIgICAgICAoMipNQVhfTFBfSEFMRl9PUkRFUikKKworLyoqCisgKiBSZWNvbnN0cnVjdCBMUEMgY29lZmZpY2llbnRzIGZyb20gdGhlIGxpbmUgc3BlY3RyYWwgcGFpciBmcmVxdWVuY2llcy4KKyAqCisgKiBAcGFyYW0gbHNwIGxpbmUgc3BlY3RyYWwgcGFpcnMgaW4gY29zaW5lIGRvbWFpbgorICogQHBhcmFtIGxwYyBsaW5lYXIgcHJlZGljdGl2ZSBjb2RpbmcgY29lZmZpY2llbnRzCisgKiBAcGFyYW0gbHBfaGFsZl9vcmRlciBoYWxmIHRoZSBudW1iZXIgb2YgdGhlIGFtb3VudCBvZiBMUENzIHRvIGJlCisgKiAgICAgICAgcmVjb25zdHJ1Y3RlZCwgbmVlZCB0byBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvIE1BWF9MUF9IQUxGX09SREVSCisgKgorICogQG5vdGUgYnVmZmVycyBzaG91bGQgaGF2ZSBhIG1pbmltdXggc2l6ZSBvZiAyKmxwX2hhbGZfb3JkZXIgZWxlbWVudHMuCisgKgorICogVElBL0VJQS9JUy03MzMgMi40LjMuMy41CisgKi8KK3ZvaWQgZmZfYWNlbHBfbHNwZDJscGMoY29uc3QgZG91YmxlICpsc3AsIGZsb2F0ICpscGMsIGludCBscF9oYWxmX29yZGVyKTsKKworLyoqCisgKiBTb3J0IHZhbHVlcyBpbiBhc2NlbmRpbmcgb3JkZXIuCisgKgorICogQG5vdGUgTyhuKSBpZiBkYXRhIGFscmVhZHkgc29ydGVkLCBPKG5eMikgLSBvdGhlcndpc2UKKyAqLwordm9pZCBmZl9zb3J0X25lYXJseV9zb3J0ZWRfZmxvYXRzKGZsb2F0ICp2YWxzLCBpbnQgbGVuKTsKKworLyoqCisgKiBDb21wdXRlIHRoZSBQYSAvICgxICsgeigtMSkpIG9yIFFhIC8gKDEgLSB6KC0xKSkgY29lZmZpY2llbnRzCisgKiBuZWVkZWQgZm9yIExTUCB0byBMUEMgY29udmVyc2lvbi4KKyAqIFdlIG9ubHkgbmVlZCB0byBjYWxjdWxhdGUgdGhlIDYgZmlyc3QgZWxlbWVudHMgb2YgdGhlIHBvbHlub21pYWwuCisgKgorICogQHBhcmFtIGxzcCBsaW5lIHNwZWN0cmFsIHBhaXJzIGluIGNvc2luZSBkb21haW4KKyAqIEBwYXJhbVtvdXRdIGYgcG9seW5vbWlhbCBpbnB1dC9vdXRwdXQgYXMgYSB2ZWN0b3IKKyAqCisgKiBUSUEvRUlBL0lTLTczMyAyLjQuMy4zLjUtMS8yCisgKi8KK3ZvaWQgZmZfbHNwMnBvbHlmKGNvbnN0IGRvdWJsZSAqbHNwLCBkb3VibGUgKmYsIGludCBscF9oYWxmX29yZGVyKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL2x6dy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbHp3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzMmMxMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL2x6dy5jCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogTFpXIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwNiBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEBicmllZiBMWlcgZGVjb2Rpbmcgcm91dGluZXMKKyAqIEBhdXRob3IgRmFicmljZSBCZWxsYXJkCisgKiBAYXV0aG9yIG1vZGlmaWVkIGZvciB1c2UgaW4gVElGRiBieSBLb25zdGFudGluIFNoaXNoa292CisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAibHp3LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjZGVmaW5lIExaV19NQVhCSVRTICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBMWldfU0laVEFCTEUgICAgICAgICAgICAgICAgKDE8PExaV19NQVhCSVRTKQorCitzdGF0aWMgY29uc3QgdWludDE2X3QgbWFza1sxN10gPQoreworICAgIDB4MDAwMCwgMHgwMDAxLCAweDAwMDMsIDB4MDAwNywKKyAgICAweDAwMEYsIDB4MDAxRiwgMHgwMDNGLCAweDAwN0YsCisgICAgMHgwMEZGLCAweDAxRkYsIDB4MDNGRiwgMHgwN0ZGLAorICAgIDB4MEZGRiwgMHgxRkZGLCAweDNGRkYsIDB4N0ZGRiwgMHhGRkZGCit9OworCitzdHJ1Y3QgTFpXU3RhdGUgeworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIGludCBiYml0czsKKyAgICB1bnNpZ25lZCBpbnQgYmJ1ZjsKKworICAgIGludCBtb2RlOyAgICAgICAgICAgICAgICAgICAvLy88IERlY29kZXIgbW9kZQorICAgIGludCBjdXJzaXplOyAgICAgICAgICAgICAgICAvLy88IFRoZSBjdXJyZW50IGNvZGUgc2l6ZQorICAgIGludCBjdXJtYXNrOworICAgIGludCBjb2Rlc2l6ZTsKKyAgICBpbnQgY2xlYXJfY29kZTsKKyAgICBpbnQgZW5kX2NvZGU7CisgICAgaW50IG5ld2NvZGVzOyAgICAgICAgICAgICAgIC8vLzwgRmlyc3QgYXZhaWxhYmxlIGNvZGUKKyAgICBpbnQgdG9wX3Nsb3Q7ICAgICAgICAgICAgICAgLy8vPCBIaWdoZXN0IGNvZGUgZm9yIGN1cnJlbnQgc2l6ZQorICAgIGludCBleHRyYV9zbG90OworICAgIGludCBzbG90OyAgICAgICAgICAgICAgICAgICAvLy88IExhc3QgcmVhZCBjb2RlCisgICAgaW50IGZjLCBvYzsKKyAgICB1aW50OF90ICpzcDsKKyAgICB1aW50OF90IHN0YWNrW0xaV19TSVpUQUJMRV07CisgICAgdWludDhfdCBzdWZmaXhbTFpXX1NJWlRBQkxFXTsKKyAgICB1aW50MTZfdCBwcmVmaXhbTFpXX1NJWlRBQkxFXTsKKyAgICBpbnQgYnM7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGJ1ZmZlciBzaXplIGZvciBHSUYKK307CisKKy8qIGdldCBvbmUgY29kZSBmcm9tIHN0cmVhbSAqLworc3RhdGljIGludCBsendfZ2V0X2NvZGUoc3RydWN0IExaV1N0YXRlICogcykKK3sKKyAgICBpbnQgYzsKKworICAgIGlmKHMtPm1vZGUgPT0gRkZfTFpXX0dJRikgeworICAgICAgICB3aGlsZSAocy0+YmJpdHMgPCBzLT5jdXJzaXplKSB7CisgICAgICAgICAgICBpZiAoIXMtPmJzKSB7CisgICAgICAgICAgICAgICAgcy0+YnMgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+YmJ1ZiB8PSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpIDw8IHMtPmJiaXRzOworICAgICAgICAgICAgcy0+YmJpdHMgKz0gODsKKyAgICAgICAgICAgIHMtPmJzLS07CisgICAgICAgIH0KKyAgICAgICAgYyA9IHMtPmJidWY7CisgICAgICAgIHMtPmJidWYgPj49IHMtPmN1cnNpemU7CisgICAgfSBlbHNlIHsgLy8gVElGRgorICAgICAgICB3aGlsZSAocy0+YmJpdHMgPCBzLT5jdXJzaXplKSB7CisgICAgICAgICAgICBzLT5iYnVmID0gKHMtPmJidWYgPDwgOCkgfCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICAgICAgcy0+YmJpdHMgKz0gODsKKyAgICAgICAgfQorICAgICAgICBjID0gcy0+YmJ1ZiA+PiAocy0+YmJpdHMgLSBzLT5jdXJzaXplKTsKKyAgICB9CisgICAgcy0+YmJpdHMgLT0gcy0+Y3Vyc2l6ZTsKKyAgICByZXR1cm4gYyAmIHMtPmN1cm1hc2s7Cit9CisKK3ZvaWQgZmZfbHp3X2RlY29kZV90YWlsKExaV1N0YXRlICpwKQoreworICAgIHN0cnVjdCBMWldTdGF0ZSAqcyA9IChzdHJ1Y3QgTFpXU3RhdGUgKilwOworCisgICAgaWYocy0+bW9kZSA9PSBGRl9MWldfR0lGKSB7CisgICAgICAgIHdoaWxlIChzLT5icyA+IDAgJiYgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSkgeworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIHMtPmJzKTsKKyAgICAgICAgICAgIHMtPmJzID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICAgICAgfQorICAgIH1lbHNlCisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpKTsKK30KKworYXZfY29sZCB2b2lkIGZmX2x6d19kZWNvZGVfb3BlbihMWldTdGF0ZSAqKnApCit7CisgICAgKnAgPSBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3QgTFpXU3RhdGUpKTsKK30KKworYXZfY29sZCB2b2lkIGZmX2x6d19kZWNvZGVfY2xvc2UoTFpXU3RhdGUgKipwKQoreworICAgIGF2X2ZyZWVwKHApOworfQorCisvKioKKyAqIEluaXRpYWxpemUgTFpXIGRlY29kZXIKKyAqIEBwYXJhbSBwIExaVyBjb250ZXh0CisgKiBAcGFyYW0gY3NpemUgaW5pdGlhbCBjb2RlIHNpemUgaW4gYml0cworICogQHBhcmFtIGJ1ZiBpbnB1dCBkYXRhCisgKiBAcGFyYW0gYnVmX3NpemUgaW5wdXQgZGF0YSBzaXplCisgKiBAcGFyYW0gbW9kZSBkZWNvZGVyIHdvcmtpbmcgbW9kZSAtIGVpdGhlciBHSUYgb3IgVElGRgorICovCitpbnQgZmZfbHp3X2RlY29kZV9pbml0KExaV1N0YXRlICpwLCBpbnQgY3NpemUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQgbW9kZSkKK3sKKyAgICBzdHJ1Y3QgTFpXU3RhdGUgKnMgPSAoc3RydWN0IExaV1N0YXRlICopcDsKKworICAgIGlmKGNzaXplIDwgMSB8fCBjc2l6ZSA+PSBMWldfTUFYQklUUykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIHJlYWQgYnVmZmVyICovCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+Z2IsIGJ1ZiwgYnVmX3NpemUpOworICAgIHMtPmJidWYgPSAwOworICAgIHMtPmJiaXRzID0gMDsKKyAgICBzLT5icyA9IDA7CisKKyAgICAvKiBkZWNvZGVyICovCisgICAgcy0+Y29kZXNpemUgPSBjc2l6ZTsKKyAgICBzLT5jdXJzaXplID0gcy0+Y29kZXNpemUgKyAxOworICAgIHMtPmN1cm1hc2sgPSBtYXNrW3MtPmN1cnNpemVdOworICAgIHMtPnRvcF9zbG90ID0gMSA8PCBzLT5jdXJzaXplOworICAgIHMtPmNsZWFyX2NvZGUgPSAxIDw8IHMtPmNvZGVzaXplOworICAgIHMtPmVuZF9jb2RlID0gcy0+Y2xlYXJfY29kZSArIDE7CisgICAgcy0+c2xvdCA9IHMtPm5ld2NvZGVzID0gcy0+Y2xlYXJfY29kZSArIDI7CisgICAgcy0+b2MgPSBzLT5mYyA9IC0xOworICAgIHMtPnNwID0gcy0+c3RhY2s7CisKKyAgICBzLT5tb2RlID0gbW9kZTsKKyAgICBzLT5leHRyYV9zbG90ID0gcy0+bW9kZSA9PSBGRl9MWldfVElGRjsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzCisgKiBOT1RFOiB0aGUgYWxnb3JpdGhtIGhlcmUgaXMgaW5zcGlyZWQgZnJvbSB0aGUgTFpXIEdJRiBkZWNvZGVyCisgKiAgd3JpdHRlbiBieSBTdGV2ZW4gQS4gQmVubmV0dCBpbiAxOTg3LgorICoKKyAqIEBwYXJhbSBwIExaVyBjb250ZXh0CisgKiBAcGFyYW0gYnVmIG91dHB1dCBidWZmZXIKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGRlY29kZQorICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgZGVjb2RlZAorICovCitpbnQgZmZfbHp3X2RlY29kZShMWldTdGF0ZSAqcCwgdWludDhfdCAqYnVmLCBpbnQgbGVuKXsKKyAgICBpbnQgbCwgYywgY29kZSwgb2MsIGZjOworICAgIHVpbnQ4X3QgKnNwOworICAgIHN0cnVjdCBMWldTdGF0ZSAqcyA9IChzdHJ1Y3QgTFpXU3RhdGUgKilwOworCisgICAgaWYgKHMtPmVuZF9jb2RlIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBsID0gbGVuOworICAgIHNwID0gcy0+c3A7CisgICAgb2MgPSBzLT5vYzsKKyAgICBmYyA9IHMtPmZjOworCisgICAgZm9yICg7OykgeworICAgICAgICB3aGlsZSAoc3AgPiBzLT5zdGFjaykgeworICAgICAgICAgICAgKmJ1ZisrID0gKigtLXNwKTsKKyAgICAgICAgICAgIGlmICgoLS1sKSA9PSAwKQorICAgICAgICAgICAgICAgIGdvdG8gdGhlX2VuZDsKKyAgICAgICAgfQorICAgICAgICBjID0gbHp3X2dldF9jb2RlKHMpOworICAgICAgICBpZiAoYyA9PSBzLT5lbmRfY29kZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBzLT5jbGVhcl9jb2RlKSB7CisgICAgICAgICAgICBzLT5jdXJzaXplID0gcy0+Y29kZXNpemUgKyAxOworICAgICAgICAgICAgcy0+Y3VybWFzayA9IG1hc2tbcy0+Y3Vyc2l6ZV07CisgICAgICAgICAgICBzLT5zbG90ID0gcy0+bmV3Y29kZXM7CisgICAgICAgICAgICBzLT50b3Bfc2xvdCA9IDEgPDwgcy0+Y3Vyc2l6ZTsKKyAgICAgICAgICAgIGZjPSBvYz0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlID0gYzsKKyAgICAgICAgICAgIGlmIChjb2RlID09IHMtPnNsb3QgJiYgZmM+PTApIHsKKyAgICAgICAgICAgICAgICAqc3ArKyA9IGZjOworICAgICAgICAgICAgICAgIGNvZGUgPSBvYzsKKyAgICAgICAgICAgIH1lbHNlIGlmKGNvZGUgPj0gcy0+c2xvdCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdoaWxlIChjb2RlID49IHMtPm5ld2NvZGVzKSB7CisgICAgICAgICAgICAgICAgKnNwKysgPSBzLT5zdWZmaXhbY29kZV07CisgICAgICAgICAgICAgICAgY29kZSA9IHMtPnByZWZpeFtjb2RlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpzcCsrID0gY29kZTsKKyAgICAgICAgICAgIGlmIChzLT5zbG90IDwgcy0+dG9wX3Nsb3QgJiYgb2M+PTApIHsKKyAgICAgICAgICAgICAgICBzLT5zdWZmaXhbcy0+c2xvdF0gPSBjb2RlOworICAgICAgICAgICAgICAgIHMtPnByZWZpeFtzLT5zbG90KytdID0gb2M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYyA9IGNvZGU7CisgICAgICAgICAgICBvYyA9IGM7CisgICAgICAgICAgICBpZiAocy0+c2xvdCA+PSBzLT50b3Bfc2xvdCAtIHMtPmV4dHJhX3Nsb3QpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+Y3Vyc2l6ZSA8IExaV19NQVhCSVRTKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnRvcF9zbG90IDw8PSAxOworICAgICAgICAgICAgICAgICAgICBzLT5jdXJtYXNrID0gbWFza1srK3MtPmN1cnNpemVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5lbmRfY29kZSA9IC0xOworICB0aGVfZW5kOgorICAgIHMtPnNwID0gc3A7CisgICAgcy0+b2MgPSBvYzsKKyAgICBzLT5mYyA9IGZjOworICAgIHJldHVybiBsZW4gLSBsOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbHp3LmggYi9mZm1wZWcvbGliYXZjb2RlYy9sencuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjUzYzFjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbHp3LmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExaVyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgTFpXIGRlY29kaW5nIHJvdXRpbmVzCisgKiBAYXV0aG9yIEZhYnJpY2UgQmVsbGFyZAorICogQGF1dGhvciBtb2RpZmllZCBmb3IgdXNlIGluIFRJRkYgYnkgS29uc3RhbnRpbiBTaGlzaGtvdgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19MWldfSAorI2RlZmluZSBBVkNPREVDX0xaV19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RydWN0IFB1dEJpdENvbnRleHQ7CisKK2VudW0gRkZfTFpXX01PREVTeworICAgIEZGX0xaV19HSUYsCisgICAgRkZfTFpXX1RJRkYKK307CisKKy8qIGNsaWVudHMgc2hvdWxkIG5vdCBrbm93IHdoYXQgTFpXU3RhdGUgaXMgKi8KK3R5cGVkZWYgdm9pZCBMWldTdGF0ZTsKKworLyogZmlyc3QgdHdvIGZ1bmN0aW9ucyBkZS9hbGxvY2F0ZSBtZW1vcnkgZm9yIExaV1N0YXRlICovCit2b2lkIGZmX2x6d19kZWNvZGVfb3BlbihMWldTdGF0ZSAqKnApOwordm9pZCBmZl9sendfZGVjb2RlX2Nsb3NlKExaV1N0YXRlICoqcCk7CitpbnQgZmZfbHp3X2RlY29kZV9pbml0KExaV1N0YXRlICpzLCBpbnQgY3NpemUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQgbW9kZSk7CitpbnQgZmZfbHp3X2RlY29kZShMWldTdGF0ZSAqcywgdWludDhfdCAqYnVmLCBpbnQgbGVuKTsKK3ZvaWQgZmZfbHp3X2RlY29kZV90YWlsKExaV1N0YXRlICpsencpOworCisvKiogTFpXIGVuY29kZSBzdGF0ZSAqLworc3RydWN0IExaV0VuY29kZVN0YXRlOworZXh0ZXJuIGNvbnN0IGludCBmZl9sendfZW5jb2RlX3N0YXRlX3NpemU7CisKK3ZvaWQgZmZfbHp3X2VuY29kZV9pbml0KHN0cnVjdCBMWldFbmNvZGVTdGF0ZSAqcywgdWludDhfdCAqb3V0YnVmLCBpbnQgb3V0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhiaXRzLCBlbnVtIEZGX0xaV19NT0RFUyBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmx6d19wdXRfYml0cykoc3RydWN0IFB1dEJpdENvbnRleHQgKiwgaW50LCB1bnNpZ25lZCBpbnQpKTsKK2ludCBmZl9sendfZW5jb2RlKHN0cnVjdCBMWldFbmNvZGVTdGF0ZSAqIHMsIGNvbnN0IHVpbnQ4X3QgKiBpbmJ1ZiwgaW50IGluc2l6ZSk7CitpbnQgZmZfbHp3X2VuY29kZV9mbHVzaChzdHJ1Y3QgTFpXRW5jb2RlU3RhdGUgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqbHp3X2ZsdXNoX3B1dF9iaXRzKShzdHJ1Y3QgUHV0Qml0Q29udGV4dCAqKSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0xaV19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9sendlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL2x6d2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDgwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9sendlbmMuYwpAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIExaVyBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQmFydGxvbWllaiBXb2xvd2llYworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBMWlcgZW5jb2RlcgorICogQGF1dGhvciBCYXJ0bG9taWVqIFdvbG93aWVjCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJsencuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKworI2RlZmluZSBMWldfTUFYQklUUyAxMgorI2RlZmluZSBMWldfU0laVEFCTEUgKDE8PExaV19NQVhCSVRTKQorI2RlZmluZSBMWldfSEFTSF9TSVpFIDE2NDExCisjZGVmaW5lIExaV19IQVNIX1NISUZUIDYKKworI2RlZmluZSBMWldfUFJFRklYX0VNUFRZIC0xCisjZGVmaW5lIExaV19QUkVGSVhfRlJFRSAtMgorCisvKiogT25lIGNvZGUgaW4gaGFzaCB0YWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QgQ29kZXsKKyAgICAvLy8gSGFzaCBjb2RlIG9mIHByZWZpeCwgTFpXX1BSRUZJWF9FTVBUWSBpZiBlbXB0eSBwcmVmaXgsIG9yIExaV19QUkVGSVhfRlJFRSBpZiBubyBjb2RlCisgICAgaW50IGhhc2hfcHJlZml4OworICAgIGludCBjb2RlOyAgICAgICAgICAgICAgIC8vLzwgTFpXIGNvZGUKKyAgICB1aW50OF90IHN1ZmZpeDsgICAgICAgICAvLy88IExhc3QgY2hhcmFjdGVyIGluIGNvZGUgYmxvY2sKK31Db2RlOworCisvKiogTFpXIGVuY29kZSBzdGF0ZSAqLwordHlwZWRlZiBzdHJ1Y3QgTFpXRW5jb2RlU3RhdGUgeworICAgIGludCBjbGVhcl9jb2RlOyAgICAgICAgICAvLy88IFZhbHVlIG9mIGNsZWFyIGNvZGUKKyAgICBpbnQgZW5kX2NvZGU7ICAgICAgICAgICAgLy8vPCBWYWx1ZSBvZiBlbmQgY29kZQorICAgIENvZGUgdGFiW0xaV19IQVNIX1NJWkVdOyAvLy88IEhhc2ggdGFibGUKKyAgICBpbnQgdGFic2l6ZTsgICAgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgdmFsdWVzIGluIGhhc2ggdGFibGUKKyAgICBpbnQgYml0czsgICAgICAgICAgICAgICAgLy8vPCBBY3R1YWwgYml0cyBjb2RlCisgICAgaW50IGJ1ZnNpemU7ICAgICAgICAgICAgIC8vLzwgU2l6ZSBvZiBvdXRwdXQgYnVmZmVyCisgICAgUHV0Qml0Q29udGV4dCBwYjsgICAgICAgIC8vLzwgUHV0IGJpdCBjb250ZXh0IGZvciBvdXRwdXQKKyAgICBpbnQgbWF4Yml0czsgICAgICAgICAgICAgLy8vPCBNYXggYml0cyBjb2RlCisgICAgaW50IG1heGNvZGU7ICAgICAgICAgICAgIC8vLzwgTWF4IHZhbHVlIG9mIGNvZGUKKyAgICBpbnQgb3V0cHV0X2J5dGVzOyAgICAgICAgLy8vPCBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlcworICAgIGludCBsYXN0X2NvZGU7ICAgICAgICAgICAvLy88IFZhbHVlIG9mIGxhc3Qgb3V0cHV0IGNvZGUgb3IgTFpXX1BSRUZJWF9FTVBUWQorICAgIGVudW0gRkZfTFpXX01PREVTIG1vZGU7ICAvLy88IFRJRkYgb3IgR0lGCisgICAgdm9pZCAoKnB1dF9iaXRzKShQdXRCaXRDb250ZXh0ICosIGludCwgdW5zaWduZWQpOyAvLy88IEdJRiBpcyBMRSB3aGlsZSBUSUZGIGlzIEJFCit9TFpXRW5jb2RlU3RhdGU7CisKKworY29uc3QgaW50IGZmX2x6d19lbmNvZGVfc3RhdGVfc2l6ZSA9IHNpemVvZihMWldFbmNvZGVTdGF0ZSk7CisKKy8qKgorICogSGFzaCBmdW5jdGlvbiBhZGRpbmcgY2hhcmFjdGVyCisgKiBAcGFyYW0gaGVhZCBMWlcgY29kZSBmb3IgcHJlZml4CisgKiBAcGFyYW0gYWRkIENoYXJhY3RlciB0byBhZGQKKyAqIEByZXR1cm4gTmV3IGhhc2ggdmFsdWUKKyAqLworc3RhdGljIGlubGluZSBpbnQgaGFzaChpbnQgaGVhZCwgY29uc3QgaW50IGFkZCkKK3sKKyAgICBoZWFkIF49IChhZGQgPDwgTFpXX0hBU0hfU0hJRlQpOworICAgIGlmIChoZWFkID49IExaV19IQVNIX1NJWkUpCisgICAgICAgIGhlYWQgLT0gTFpXX0hBU0hfU0laRTsKKyAgICBhdl9hc3NlcnQyKGhlYWQgPj0gMCAmJiBoZWFkIDwgTFpXX0hBU0hfU0laRSk7CisgICAgcmV0dXJuIGhlYWQ7Cit9CisKKy8qKgorICogSGFzaCBmdW5jdGlvbiBjYWxjdWxhdGVzIG5leHQgaGFzaCB2YWx1ZQorICogQHBhcmFtIGhlYWQgQWN0dWFsIGhhc2ggY29kZQorICogQHBhcmFtIG9mZnNldCBPZmZzZXQgY2FsY3VsYXRlZCBieSBoYXNoT2Zmc2V0CisgKiBAcmV0dXJuIE5ldyBoYXNoIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhhc2hOZXh0KGludCBoZWFkLCBjb25zdCBpbnQgb2Zmc2V0KQoreworICAgIGhlYWQgLT0gb2Zmc2V0OworICAgIGlmKGhlYWQgPCAwKQorICAgICAgICBoZWFkICs9IExaV19IQVNIX1NJWkU7CisgICAgcmV0dXJuIGhlYWQ7Cit9CisKKy8qKgorICogSGFzaCBmdW5jdGlvbiBjYWxjdWxhdGVzIGhhc2ggb2Zmc2V0CisgKiBAcGFyYW0gaGVhZCBBY3R1YWwgaGFzaCBjb2RlCisgKiBAcmV0dXJuIEhhc2ggb2Zmc2V0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhhc2hPZmZzZXQoY29uc3QgaW50IGhlYWQpCit7CisgICAgcmV0dXJuIGhlYWQgPyBMWldfSEFTSF9TSVpFIC0gaGVhZCA6IDE7Cit9CisKKy8qKgorICogV3JpdGUgb25lIGNvZGUgdG8gc3RyZWFtCisgKiBAcGFyYW0gcyBMWlcgc3RhdGUKKyAqIEBwYXJhbSBjIGNvZGUgdG8gd3JpdGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlQ29kZShMWldFbmNvZGVTdGF0ZSAqIHMsIGludCBjKQoreworICAgIGF2X2Fzc2VydDIoMCA8PSBjICYmIGMgPCAxIDw8IHMtPmJpdHMpOworICAgIHMtPnB1dF9iaXRzKCZzLT5wYiwgcy0+Yml0cywgYyk7Cit9CisKKworLyoqCisgKiBGaW5kIExaVyBjb2RlIGZvciBibG9jaworICogQHBhcmFtIHMgTFpXIHN0YXRlCisgKiBAcGFyYW0gYyBMYXN0IGNoYXJhY3RlciBpbiBibG9jaworICogQHBhcmFtIGhhc2hfcHJlZml4IExaVyBjb2RlIGZvciBwcmVmaXgKKyAqIEByZXR1cm4gTFpXIGNvZGUgZm9yIGJsb2NrIG9yIC0xIGlmIG5vdCBmb3VuZCBpbiB0YWJsZQorICovCitzdGF0aWMgaW5saW5lIGludCBmaW5kQ29kZShMWldFbmNvZGVTdGF0ZSAqIHMsIHVpbnQ4X3QgYywgaW50IGhhc2hfcHJlZml4KQoreworICAgIGludCBoID0gaGFzaChGRk1BWChoYXNoX3ByZWZpeCwgMCksIGMpOworICAgIGludCBoYXNoX29mZnNldCA9IGhhc2hPZmZzZXQoaCk7CisKKyAgICB3aGlsZSAocy0+dGFiW2hdLmhhc2hfcHJlZml4ICE9IExaV19QUkVGSVhfRlJFRSkgeworICAgICAgICBpZiAoKHMtPnRhYltoXS5zdWZmaXggPT0gYykKKyAgICAgICAgICAgICYmIChzLT50YWJbaF0uaGFzaF9wcmVmaXggPT0gaGFzaF9wcmVmaXgpKQorICAgICAgICAgICAgcmV0dXJuIGg7CisgICAgICAgIGggPSBoYXNoTmV4dChoLCBoYXNoX29mZnNldCk7CisgICAgfQorCisgICAgcmV0dXJuIGg7Cit9CisKKy8qKgorICogQWRkIGJsb2NrIHRvIExaVyBjb2RlIHRhYmxlCisgKiBAcGFyYW0gcyBMWlcgc3RhdGUKKyAqIEBwYXJhbSBjIExhc3QgY2hhcmFjdGVyIGluIGJsb2NrCisgKiBAcGFyYW0gaGFzaF9wcmVmaXggTFpXIGNvZGUgZm9yIHByZWZpeAorICogQHBhcmFtIGhhc2hfY29kZSBMWlcgY29kZSBmb3IgYnl0ZXMgYmxvY2sKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFkZENvZGUoTFpXRW5jb2RlU3RhdGUgKiBzLCB1aW50OF90IGMsIGludCBoYXNoX3ByZWZpeCwgaW50IGhhc2hfY29kZSkKK3sKKyAgICBzLT50YWJbaGFzaF9jb2RlXS5jb2RlID0gcy0+dGFic2l6ZTsKKyAgICBzLT50YWJbaGFzaF9jb2RlXS5zdWZmaXggPSBjOworICAgIHMtPnRhYltoYXNoX2NvZGVdLmhhc2hfcHJlZml4ID0gaGFzaF9wcmVmaXg7CisKKyAgICBzLT50YWJzaXplKys7CisKKyAgICBpZiAocy0+dGFic2l6ZSA+PSAoMSA8PCBzLT5iaXRzKSArIChzLT5tb2RlID09IEZGX0xaV19HSUYpKQorICAgICAgICBzLT5iaXRzKys7Cit9CisKKy8qKgorICogQ2xlYXIgTFpXIGNvZGUgdGFibGUKKyAqIEBwYXJhbSBzIExaVyBzdGF0ZQorICovCitzdGF0aWMgdm9pZCBjbGVhclRhYmxlKExaV0VuY29kZVN0YXRlICogcykKK3sKKyAgICBpbnQgaSwgaDsKKworICAgIHdyaXRlQ29kZShzLCBzLT5jbGVhcl9jb2RlKTsKKyAgICBzLT5iaXRzID0gOTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFpXX0hBU0hfU0laRTsgaSsrKSB7CisgICAgICAgIHMtPnRhYltpXS5oYXNoX3ByZWZpeCA9IExaV19QUkVGSVhfRlJFRTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGggPSBoYXNoKDAsIGkpOworICAgICAgICBzLT50YWJbaF0uY29kZSA9IGk7CisgICAgICAgIHMtPnRhYltoXS5zdWZmaXggPSBpOworICAgICAgICBzLT50YWJbaF0uaGFzaF9wcmVmaXggPSBMWldfUFJFRklYX0VNUFRZOworICAgIH0KKyAgICBzLT50YWJzaXplID0gMjU4OworfQorCisvKioKKyAqIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorICogQHBhcmFtIHMgTFpXIGVuY29kZSBzdGF0ZQorICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorICovCitzdGF0aWMgaW50IHdyaXR0ZW5CeXRlcyhMWldFbmNvZGVTdGF0ZSAqcyl7CisgICAgaW50IHJldCA9IHB1dF9iaXRzX2NvdW50KCZzLT5wYikgPj4gMzsKKyAgICByZXQgLT0gcy0+b3V0cHV0X2J5dGVzOworICAgIHMtPm91dHB1dF9ieXRlcyArPSByZXQ7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBJbml0aWFsaXplIExaVyBlbmNvZGVyLiBQbGVhc2Ugc2V0IHMtPmNsZWFyX2NvZGUsIHMtPmVuZF9jb2RlIGFuZCBzLT5tYXhiaXRzIGJlZm9yZSBydW4uCisgKiBAcGFyYW0gcyBMWlcgc3RhdGUKKyAqIEBwYXJhbSBvdXRidWYgT3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtIG91dHNpemUgU2l6ZSBvZiBvdXRwdXQgYnVmZmVyCisgKiBAcGFyYW0gbWF4Yml0cyBNYXhpbXVtIGxlbmd0aCBvZiBjb2RlCisgKi8KK3ZvaWQgZmZfbHp3X2VuY29kZV9pbml0KExaV0VuY29kZVN0YXRlICpzLCB1aW50OF90ICpvdXRidWYsIGludCBvdXRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGJpdHMsIGVudW0gRkZfTFpXX01PREVTIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqbHp3X3B1dF9iaXRzKShQdXRCaXRDb250ZXh0ICosIGludCwgdW5zaWduZWQpKQoreworICAgIHMtPmNsZWFyX2NvZGUgPSAyNTY7CisgICAgcy0+ZW5kX2NvZGUgPSAyNTc7CisgICAgcy0+bWF4Yml0cyA9IG1heGJpdHM7CisgICAgaW5pdF9wdXRfYml0cygmcy0+cGIsIG91dGJ1Ziwgb3V0c2l6ZSk7CisgICAgcy0+YnVmc2l6ZSA9IG91dHNpemU7CisgICAgYXZfYXNzZXJ0MChzLT5tYXhiaXRzID49IDkgJiYgcy0+bWF4Yml0cyA8PSBMWldfTUFYQklUUyk7CisgICAgcy0+bWF4Y29kZSA9IDEgPDwgcy0+bWF4Yml0czsKKyAgICBzLT5vdXRwdXRfYnl0ZXMgPSAwOworICAgIHMtPmxhc3RfY29kZSA9IExaV19QUkVGSVhfRU1QVFk7CisgICAgcy0+Yml0cyA9IDk7CisgICAgcy0+bW9kZSA9IG1vZGU7CisgICAgcy0+cHV0X2JpdHMgPSBsendfcHV0X2JpdHM7Cit9CisKKy8qKgorICogTFpXIG1haW4gY29tcHJlc3MgZnVuY3Rpb24KKyAqIEBwYXJhbSBzIExaVyBzdGF0ZQorICogQHBhcmFtIGluYnVmIElucHV0IGJ1ZmZlcgorICogQHBhcmFtIGluc2l6ZSBTaXplIG9mIGlucHV0IGJ1ZmZlcgorICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBvbiBlcnJvcgorICovCitpbnQgZmZfbHp3X2VuY29kZShMWldFbmNvZGVTdGF0ZSAqIHMsIGNvbnN0IHVpbnQ4X3QgKiBpbmJ1ZiwgaW50IGluc2l6ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmKGluc2l6ZSAqIDMgPiAocy0+YnVmc2l6ZSAtIHMtPm91dHB1dF9ieXRlcykgKiAyKXsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT5sYXN0X2NvZGUgPT0gTFpXX1BSRUZJWF9FTVBUWSkKKyAgICAgICAgY2xlYXJUYWJsZShzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBpbnNpemU7IGkrKykgeworICAgICAgICB1aW50OF90IGMgPSAqaW5idWYrKzsKKyAgICAgICAgaW50IGNvZGUgPSBmaW5kQ29kZShzLCBjLCBzLT5sYXN0X2NvZGUpOworICAgICAgICBpZiAocy0+dGFiW2NvZGVdLmhhc2hfcHJlZml4ID09IExaV19QUkVGSVhfRlJFRSkgeworICAgICAgICAgICAgd3JpdGVDb2RlKHMsIHMtPmxhc3RfY29kZSk7CisgICAgICAgICAgICBhZGRDb2RlKHMsIGMsIHMtPmxhc3RfY29kZSwgY29kZSk7CisgICAgICAgICAgICBjb2RlPSBoYXNoKDAsIGMpOworICAgICAgICB9CisgICAgICAgIHMtPmxhc3RfY29kZSA9IHMtPnRhYltjb2RlXS5jb2RlOworICAgICAgICBpZiAocy0+dGFic2l6ZSA+PSBzLT5tYXhjb2RlIC0gMSkgeworICAgICAgICAgICAgY2xlYXJUYWJsZShzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB3cml0dGVuQnl0ZXMocyk7Cit9CisKKy8qKgorICogV3JpdGUgZW5kIGNvZGUgYW5kIGZsdXNoIGJpdHN0cmVhbQorICogQHBhcmFtIHMgTFpXIHN0YXRlCisgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludCBmZl9sendfZW5jb2RlX2ZsdXNoKExaV0VuY29kZVN0YXRlICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmx6d19mbHVzaF9wdXRfYml0cykoUHV0Qml0Q29udGV4dCAqKSkKK3sKKyAgICBpZiAocy0+bGFzdF9jb2RlICE9IC0xKQorICAgICAgICB3cml0ZUNvZGUocywgcy0+bGFzdF9jb2RlKTsKKyAgICB3cml0ZUNvZGUocywgcy0+ZW5kX2NvZGUpOworICAgIGlmIChzLT5tb2RlID09IEZGX0xaV19HSUYpCisgICAgICAgIHMtPnB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7CisKKyAgICBsendfZmx1c2hfcHV0X2JpdHMoJnMtPnBiKTsKKyAgICBzLT5sYXN0X2NvZGUgPSAtMTsKKworICAgIHJldHVybiB3cml0dGVuQnl0ZXMocyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tYWNlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhYTI5NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21hY2UuYwpAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIE1BQ0UgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAyIExhc3psbyBUb3JvayA8dG9yb2tsQGFscGhhLmRmbWsuaHU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1BQ0UgZGVjb2Rlci4KKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisvKgorICogQWRhcHRlZCB0byBsaWJhdmNvZGVjIGJ5IEZyYW5jb2lzIFJldm9sIDxyZXZvbEBmcmVlLmZyPgorICogKHJlbW92ZWQgNjhrIFJFRyBzdHVmZiwgY2hhbmdlZCB0eXBlcywgYWRkZWQgc29tZSBzdGF0aWNzIGFuZCBjb25zdHMsCisgKiBsaWJhdmNvZGVjIGFwaSwgY29udGV4dCBzdHVmZiwgaW50ZXJsYWNlZCBzdGVyZW8gb3V0KS4KKyAqLworCitzdGF0aWMgY29uc3QgaW50MTZfdCBNQUNFdGFiMVtdID0gey0xMywgOCwgNzYsIDIyMiwgMjIyLCA3NiwgOCwgLTEzfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgTUFDRXRhYjNbXSA9IHstMTgsIDE0MCwgMTQwLCAtMTh9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBNQUNFdGFiMltdWzRdID0geworICAgIHsgICAgMzcsICAgIDExNiwgICAgMjA2LCAgICAzMzB9LCB7ICAgIDM5LCAgICAxMjEsICAgIDIxNiwgICAgMzQ2fSwKKyAgICB7ICAgIDQxLCAgICAxMjcsICAgIDIyNSwgICAgMzYxfSwgeyAgICA0MiwgICAgMTMyLCAgICAyMzUsICAgIDM3N30sCisgICAgeyAgICA0NCwgICAgMTM3LCAgICAyNDUsICAgIDM5Mn0sIHsgICAgNDYsICAgIDE0NCwgICAgMjU2LCAgICA0MTB9LAorICAgIHsgICAgNDgsICAgIDE1MCwgICAgMjY3LCAgICA0Mjh9LCB7ICAgIDUxLCAgICAxNTcsICAgIDI4MCwgICAgNDQ5fSwKKyAgICB7ICAgIDUzLCAgICAxNjUsICAgIDI5MywgICAgNDcwfSwgeyAgICA1NSwgICAgMTcyLCAgICAzMDYsICAgIDQ5MH0sCisgICAgeyAgICA1OCwgICAgMTc5LCAgICAzMTksICAgIDUxMX0sIHsgICAgNjAsICAgIDE4NywgICAgMzMzLCAgICA1MzR9LAorICAgIHsgICAgNjMsICAgIDE5NSwgICAgMzQ4LCAgICA1NTd9LCB7ICAgIDY2LCAgICAyMDUsICAgIDM2NCwgICAgNTgzfSwKKyAgICB7ICAgIDY5LCAgICAyMTQsICAgIDM4MCwgICAgNjA5fSwgeyAgICA3MiwgICAgMjIzLCAgICAzOTYsICAgIDYzNX0sCisgICAgeyAgICA3NSwgICAgMjMzLCAgICA0MTQsICAgIDY2M30sIHsgICAgNzksICAgIDI0NCwgICAgNDMzLCAgICA2OTR9LAorICAgIHsgICAgODIsICAgIDI1NCwgICAgNDUzLCAgICA3MjV9LCB7ICAgIDg2LCAgICAyNjUsICAgIDQ3MiwgICAgNzU2fSwKKyAgICB7ICAgIDkwLCAgICAyNzgsICAgIDQ5NSwgICAgNzkyfSwgeyAgICA5NCwgICAgMjkwLCAgICA1MTYsICAgIDgyNn0sCisgICAgeyAgICA5OCwgICAgMzAzLCAgICA1MzgsICAgIDg2Mn0sIHsgICAxMDIsICAgIDMxNiwgICAgNTYyLCAgICA5MDF9LAorICAgIHsgICAxMDcsICAgIDMzMSwgICAgNTg4LCAgICA5NDJ9LCB7ICAgMTEyLCAgICAzNDUsICAgIDYxNCwgICAgOTgzfSwKKyAgICB7ICAgMTE3LCAgICAzNjEsICAgIDY0MSwgICAxMDI3fSwgeyAgIDEyMiwgICAgMzc3LCAgICA2NzAsICAgMTA3NH0sCisgICAgeyAgIDEyNywgICAgMzk0LCAgICA3MDEsICAgMTEyM30sIHsgICAxMzMsICAgIDQxMSwgICAgNzMyLCAgIDExNzJ9LAorICAgIHsgICAxMzksICAgIDQzMCwgICAgNzY0LCAgIDEyMjR9LCB7ICAgMTQ1LCAgICA0NDksICAgIDc5OSwgICAxMjgwfSwKKyAgICB7ICAgMTUyLCAgICA0NjksICAgIDgzNSwgICAxMzM3fSwgeyAgIDE1OSwgICAgNDkwLCAgICA4NzIsICAgMTM5N30sCisgICAgeyAgIDE2NiwgICAgNTEyLCAgICA5MTEsICAgMTQ1OX0sIHsgICAxNzMsICAgIDUzNSwgICAgOTUxLCAgIDE1MjN9LAorICAgIHsgICAxODEsICAgIDU1OCwgICAgOTkzLCAgIDE1OTB9LCB7ICAgMTg5LCAgICA1ODQsICAgMTAzOCwgICAxNjYzfSwKKyAgICB7ICAgMTk3LCAgICA2MTAsICAgMTA4NSwgICAxNzM4fSwgeyAgIDIwNiwgICAgNjM3LCAgIDExMzMsICAgMTgxNX0sCisgICAgeyAgIDIxNSwgICAgNjY1LCAgIDExODMsICAgMTg5NX0sIHsgICAyMjUsICAgIDY5NSwgICAxMjM3LCAgIDE5ODB9LAorICAgIHsgICAyMzUsICAgIDcyNiwgICAxMjkxLCAgIDIwNjh9LCB7ICAgMjQ2LCAgICA3NTksICAgMTM0OSwgICAyMTYxfSwKKyAgICB7ICAgMjU3LCAgICA3OTIsICAgMTQwOSwgICAyMjU3fSwgeyAgIDI2OCwgICAgODI4LCAgIDE0NzIsICAgMjM1N30sCisgICAgeyAgIDI4MCwgICAgODY1LCAgIDE1MzgsICAgMjQ2M30sIHsgICAyOTMsICAgIDkwMywgICAxNjA2LCAgIDI1NzJ9LAorICAgIHsgICAzMDYsICAgIDk0NCwgICAxNjc4LCAgIDI2ODh9LCB7ICAgMzE5LCAgICA5ODYsICAgMTc1MywgICAyODA3fSwKKyAgICB7ICAgMzM0LCAgIDEwMzAsICAgMTgzMiwgICAyOTMzfSwgeyAgIDM0OSwgICAxMDc2LCAgIDE5MTQsICAgMzA2NX0sCisgICAgeyAgIDM2NCwgICAxMTI0LCAgIDE5OTksICAgMzIwMn0sIHsgICAzODAsICAgMTE3NCwgICAyMDg4LCAgIDMzNDR9LAorICAgIHsgICAzOTgsICAgMTIyNywgICAyMTgyLCAgIDM0OTR9LCB7ICAgNDE1LCAgIDEyODEsICAgMjI3OCwgICAzNjQ5fSwKKyAgICB7ICAgNDM0LCAgIDEzMzksICAgMjM4MCwgICAzODExfSwgeyAgIDQ1MywgICAxMzk4LCAgIDI0ODYsICAgMzk4Mn0sCisgICAgeyAgIDQ3MywgICAxNDYxLCAgIDI1OTgsICAgNDE2MH0sIHsgICA0OTUsICAgMTUyNiwgICAyNzE0LCAgIDQzNDZ9LAorICAgIHsgICA1MTcsICAgMTU5NCwgICAyODM1LCAgIDQ1NDB9LCB7ICAgNTQwLCAgIDE2NjUsICAgMjk2MSwgICA0NzQxfSwKKyAgICB7ICAgNTY0LCAgIDE3NDAsICAgMzA5MywgICA0OTUzfSwgeyAgIDU4OSwgICAxODE4LCAgIDMyMzIsICAgNTE3NX0sCisgICAgeyAgIDYxNSwgICAxODk4LCAgIDMzNzUsICAgNTQwNX0sIHsgICA2NDMsICAgMTk4NCwgICAzNTI3LCAgIDU2NDd9LAorICAgIHsgICA2NzEsICAgMjA3MiwgICAzNjgzLCAgIDU4OTh9LCB7ICAgNzAxLCAgIDIxNjQsICAgMzg0OCwgICA2MTYxfSwKKyAgICB7ICAgNzMzLCAgIDIyNjEsICAgNDAyMCwgICA2NDM4fSwgeyAgIDc2NiwgICAyMzYyLCAgIDQxOTksICAgNjcyNH0sCisgICAgeyAgIDgwMCwgICAyNDY3LCAgIDQzODYsICAgNzAyNH0sIHsgICA4MzYsICAgMjU3OCwgICA0NTgzLCAgIDczMzl9LAorICAgIHsgICA4NzMsICAgMjY5MiwgICA0Nzg2LCAgIDc2NjR9LCB7ICAgOTEyLCAgIDI4MTMsICAgNTAwMSwgICA4MDA4fSwKKyAgICB7ICAgOTUyLCAgIDI5MzgsICAgNTIyMywgICA4MzY0fSwgeyAgIDk5NSwgICAzMDcwLCAgIDU0NTcsICAgODczOX0sCisgICAgeyAgMTAzOSwgICAzMjA3LCAgIDU3MDEsICAgOTEyOX0sIHsgIDEwODYsICAgMzM1MCwgICA1OTU2LCAgIDk1Mzd9LAorICAgIHsgIDExMzQsICAgMzQ5OSwgICA2MjIwLCAgIDk5NjB9LCB7ICAxMTg1LCAgIDM2NTUsICAgNjQ5NywgIDEwNDA0fSwKKyAgICB7ICAxMjM4LCAgIDM4MTgsICAgNjc4OCwgIDEwODY5fSwgeyAgMTI5MywgICAzOTg5LCAgIDcwOTEsICAxMTM1NX0sCisgICAgeyAgMTM1MSwgICA0MTY2LCAgIDc0MDcsICAxMTg2MX0sIHsgIDE0MTEsICAgNDM1MiwgICA3NzM4LCAgMTIzOTB9LAorICAgIHsgIDE0NzQsICAgNDU0NywgICA4MDg0LCAgMTI5NDZ9LCB7ICAxNTQwLCAgIDQ3NTAsICAgODQ0NCwgIDEzNTIyfSwKKyAgICB7ICAxNjA5LCAgIDQ5NjIsICAgODgyMSwgIDE0MTI2fSwgeyAgMTY4MCwgICA1MTgzLCAgIDkyMTUsICAxNDc1Nn0sCisgICAgeyAgMTc1NiwgICA1NDE1LCAgIDk2MjYsICAxNTQxNX0sIHsgIDE4MzQsICAgNTY1NywgIDEwMDU3LCAgMTYxMDR9LAorICAgIHsgIDE5MTYsICAgNTkwOSwgIDEwNTA1LCAgMTY4MjJ9LCB7ICAyMDAxLCAgIDYxNzMsICAxMDk3NSwgIDE3NTc0fSwKKyAgICB7ICAyMDkxLCAgIDY0NDgsICAxMTQ2MywgIDE4MzU2fSwgeyAgMjE4NCwgICA2NzM2LCAgMTE5NzQsICAxOTE3NX0sCisgICAgeyAgMjI4MiwgICA3MDM3LCAgMTI1MTAsICAyMDAzMn0sIHsgIDIzODMsICAgNzM1MSwgIDEzMDY4LCAgMjA5MjZ9LAorICAgIHsgIDI0OTAsICAgNzY3OSwgIDEzNjUyLCAgMjE4NjF9LCB7ICAyNjAxLCAgIDgwMjEsICAxNDI2MCwgIDIyODM0fSwKKyAgICB7ICAyNzE3LCAgIDgzODAsICAxNDg5NywgIDIzODU0fSwgeyAgMjgzOCwgICA4NzUzLCAgMTU1NjEsICAyNDkxOH0sCisgICAgeyAgMjk2NSwgICA5MTQ0LCAgMTYyNTYsICAyNjAzMX0sIHsgIDMwOTcsICAgOTU1MywgIDE2OTgyLCAgMjcxOTN9LAorICAgIHsgIDMyMzYsICAgOTk3OSwgIDE3NzQwLCAgMjg0MDd9LCB7ICAzMzgwLCAgMTA0MjQsICAxODUzMiwgIDI5Njc1fSwKKyAgICB7ICAzNTMxLCAgMTA4OTAsICAxOTM1OSwgIDMxMDAwfSwgeyAgMzY4OCwgIDExMzc1LCAgMjAyMjIsICAzMjM4Mn0sCisgICAgeyAgMzg1MywgIDExODgzLCAgMjExMjUsICAzMjc2N30sIHsgIDQwMjUsICAxMjQxNCwgIDIyMDY5LCAgMzI3Njd9LAorICAgIHsgIDQyMDUsICAxMjk2NywgIDIzMDUzLCAgMzI3Njd9LCB7ICA0MzkyLCAgMTM1NDYsICAyNDA4MiwgIDMyNzY3fSwKKyAgICB7ICA0NTg5LCAgMTQxNTEsICAyNTE1NywgIDMyNzY3fSwgeyAgNDc5MywgIDE0NzgzLCAgMjYyODAsICAzMjc2N30sCisgICAgeyAgNTAwNywgIDE1NDQyLCAgMjc0NTIsICAzMjc2N30sIHsgIDUyMzEsICAxNjEzMiwgIDI4Njc4LCAgMzI3Njd9LAorICAgIHsgIDU0NjQsICAxNjg1MSwgIDI5OTU3LCAgMzI3Njd9LCB7ICA1NzA4LCAgMTc2MDMsICAzMTI5NCwgIDMyNzY3fSwKKyAgICB7ICA1OTYzLCAgMTgzODksICAzMjY5MSwgIDMyNzY3fSwgeyAgNjIyOSwgIDE5MjEwLCAgMzI3NjcsICAzMjc2N30sCisgICAgeyAgNjUwNywgIDIwMDY3LCAgMzI3NjcsICAzMjc2N30sIHsgIDY3OTcsICAyMDk2MywgIDMyNzY3LCAgMzI3Njd9LAorICAgIHsgIDcxMDEsICAyMTg5OSwgIDMyNzY3LCAgMzI3Njd9LCB7ICA3NDE4LCAgMjI4NzYsICAzMjc2NywgIDMyNzY3fSwKKyAgICB7ICA3NzQ5LCAgMjM4OTcsICAzMjc2NywgIDMyNzY3fSwgeyAgODA5NSwgIDI0OTY0LCAgMzI3NjcsICAzMjc2N30sCisgICAgeyAgODQ1NiwgIDI2MDc4LCAgMzI3NjcsICAzMjc2N30sIHsgIDg4MzMsICAyNzI0MiwgIDMyNzY3LCAgMzI3Njd9LAorICAgIHsgIDkyMjgsICAyODQ1NywgIDMyNzY3LCAgMzI3Njd9LCB7ICA5NjM5LCAgMjk3MjcsICAzMjc2NywgIDMyNzY3fQorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgTUFDRXRhYjRbXVsyXSA9IHsKKyAgICB7ICAgIDY0LCAgICAyMTZ9LCB7ICAgIDY3LCAgICAyMjZ9LCB7ICAgIDcwLCAgICAyMzZ9LCB7ICAgIDc0LCAgICAyNDZ9LAorICAgIHsgICAgNzcsICAgIDI1N30sIHsgICAgODAsICAgIDI2OH0sIHsgICAgODQsICAgIDI4MH0sIHsgICAgODgsICAgIDI5NH0sCisgICAgeyAgICA5MiwgICAgMzA3fSwgeyAgICA5NiwgICAgMzIxfSwgeyAgIDEwMCwgICAgMzM0fSwgeyAgIDEwNCwgICAgMzUwfSwKKyAgICB7ICAgMTA5LCAgICAzNjV9LCB7ICAgMTE0LCAgICAzODJ9LCB7ICAgMTE5LCAgICAzOTl9LCB7ICAgMTI0LCAgICA0MTZ9LAorICAgIHsgICAxMzAsICAgIDQzNH0sIHsgICAxMzYsICAgIDQ1NH0sIHsgICAxNDIsICAgIDQ3NX0sIHsgICAxNDgsICAgIDQ5NX0sCisgICAgeyAgIDE1NSwgICAgNTE5fSwgeyAgIDE2MiwgICAgNTQxfSwgeyAgIDE2OSwgICAgNTY0fSwgeyAgIDE3NiwgICAgNTkwfSwKKyAgICB7ICAgMTg1LCAgICA2MTd9LCB7ICAgMTkzLCAgICA2NDR9LCB7ICAgMjAxLCAgICA2NzN9LCB7ICAgMjEwLCAgICA3MDN9LAorICAgIHsgICAyMjAsICAgIDczNX0sIHsgICAyMzAsICAgIDc2N30sIHsgICAyNDAsICAgIDgwMX0sIHsgICAyNTEsICAgIDgzOH0sCisgICAgeyAgIDI2MiwgICAgODc2fSwgeyAgIDI3NCwgICAgOTE0fSwgeyAgIDI4NiwgICAgOTU1fSwgeyAgIDI5OSwgICAgOTk3fSwKKyAgICB7ICAgMzEyLCAgIDEwNDF9LCB7ICAgMzI2LCAgIDEwODl9LCB7ICAgMzQxLCAgIDExMzh9LCB7ICAgMzU2LCAgIDExODh9LAorICAgIHsgICAzNzIsICAgMTI0MX0sIHsgICAzODgsICAgMTI5N30sIHsgICA0MDYsICAgMTM1NH0sIHsgICA0MjQsICAgMTQxNX0sCisgICAgeyAgIDQ0MywgICAxNDc4fSwgeyAgIDQ2MiwgICAxNTQ0fSwgeyAgIDQ4MywgICAxNjEzfSwgeyAgIDUwNSwgICAxNjg0fSwKKyAgICB7ICAgNTI3LCAgIDE3NjB9LCB7ICAgNTUxLCAgIDE4Mzh9LCB7ICAgNTc2LCAgIDE5MjF9LCB7ICAgNjAxLCAgIDIwMDd9LAorICAgIHsgICA2MjgsICAgMjA5N30sIHsgICA2NTYsICAgMjE5MH0sIHsgICA2ODYsICAgMjI4OH0sIHsgICA3MTYsICAgMjM4OX0sCisgICAgeyAgIDc0OCwgICAyNDk2fSwgeyAgIDc4MSwgICAyNjA3fSwgeyAgIDgxNiwgICAyNzI0fSwgeyAgIDg1MywgICAyODQ2fSwKKyAgICB7ICAgODkxLCAgIDI5NzN9LCB7ICAgOTMwLCAgIDMxMDR9LCB7ICAgOTcyLCAgIDMyNDN9LCB7ICAxMDE2LCAgIDMzODl9LAorICAgIHsgIDEwNjEsICAgMzUzOX0sIHsgIDExMDgsICAgMzY5OH0sIHsgIDExNTgsICAgMzg2Mn0sIHsgIDEyMDksICAgNDAzNX0sCisgICAgeyAgMTI2NCwgICA0MjE2fSwgeyAgMTMyMCwgICA0NDAzfSwgeyAgMTM3OSwgICA0NTk5fSwgeyAgMTQ0MSwgICA0ODA2fSwKKyAgICB7ICAxNTA1LCAgIDUwMTl9LCB7ICAxNTcyLCAgIDUyNDR9LCB7ICAxNjQyLCAgIDU0Nzd9LCB7ICAxNzE1LCAgIDU3MjJ9LAorICAgIHsgIDE3OTIsICAgNTk3OH0sIHsgIDE4NzIsICAgNjI0NX0sIHsgIDE5NTUsICAgNjUyMn0sIHsgIDIwNDMsICAgNjgxM30sCisgICAgeyAgMjEzNCwgICA3MTE4fSwgeyAgMjIyOSwgICA3NDM2fSwgeyAgMjMyOSwgICA3NzY3fSwgeyAgMjQzMiwgICA4MTE0fSwKKyAgICB7ICAyNTQxLCAgIDg0Nzd9LCB7ICAyNjU1LCAgIDg4NTR9LCB7ICAyNzczLCAgIDkyNTB9LCB7ICAyODk3LCAgIDk2NjN9LAorICAgIHsgIDMwMjYsICAxMDA5NH0sIHsgIDMxNjIsICAxMDU0Nn0sIHsgIDMzMDMsICAxMTAxNn0sIHsgIDM0NTAsICAxMTUwOH0sCisgICAgeyAgMzYwNCwgIDEyMDIwfSwgeyAgMzc2NSwgIDEyNTU2fSwgeyAgMzkzMywgIDEzMTE4fSwgeyAgNDEwOCwgIDEzNzAzfSwKKyAgICB7ICA0MjkyLCAgMTQzMTV9LCB7ICA0NDgzLCAgMTQ5NTN9LCB7ICA0NjgzLCAgMTU2MjF9LCB7ICA0ODkyLCAgMTYzMTh9LAorICAgIHsgIDUxMTEsICAxNzA0Nn0sIHsgIDUzMzksICAxNzgwN30sIHsgIDU1NzcsICAxODYwMn0sIHsgIDU4MjYsICAxOTQzM30sCisgICAgeyAgNjA4NiwgIDIwMzAwfSwgeyAgNjM1OCwgIDIxMjA1fSwgeyAgNjY0MiwgIDIyMTUyfSwgeyAgNjkzOCwgIDIzMTQxfSwKKyAgICB7ICA3MjQ4LCAgMjQxNzN9LCB7ICA3NTcxLCAgMjUyNTJ9LCB7ICA3OTA5LCAgMjYzODB9LCB7ICA4MjYyLCAgMjc1NTd9LAorICAgIHsgIDg2MzEsICAyODc4Nn0sIHsgIDkwMTYsICAzMDA3Mn0sIHsgIDk0MTksICAzMTQxM30sIHsgIDk4MzksICAzMjc2N30sCisgICAgeyAxMDI3OCwgIDMyNzY3fSwgeyAxMDczNywgIDMyNzY3fSwgeyAxMTIxNiwgIDMyNzY3fSwgeyAxMTcxNywgIDMyNzY3fSwKKyAgICB7IDEyMjQwLCAgMzI3Njd9LCB7IDEyNzg2LCAgMzI3Njd9LCB7IDEzMzU2LCAgMzI3Njd9LCB7IDEzOTUzLCAgMzI3Njd9LAorICAgIHsgMTQ1NzYsICAzMjc2N30sIHsgMTUyMjYsICAzMjc2N30sIHsgMTU5MDYsICAzMjc2N30sIHsgMTY2MTUsICAzMjc2N30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGludDE2X3QgKnRhYjE7IGNvbnN0IGludDE2X3QgKnRhYjI7IGludCBzdHJpZGU7Cit9IHRhYnNbXSA9IHsKKyAgICB7TUFDRXRhYjEsICZNQUNFdGFiMlswXVswXSwgNH0sCisgICAge01BQ0V0YWIzLCAmTUFDRXRhYjRbMF1bMF0sIDJ9LAorICAgIHtNQUNFdGFiMSwgJk1BQ0V0YWIyWzBdWzBdLCA0fQorfTsKKworI2RlZmluZSBRVF84U18yXzE2Uyh4KSAoKCh4KSAmIDB4RkYwMCkgfCAoKCh4KSA+PiA4KSAmIDB4RkYpKQorCit0eXBlZGVmIHN0cnVjdCBDaGFubmVsRGF0YSB7CisgICAgaW50MTZfdCBpbmRleCwgZmFjdG9yLCBwcmV2MiwgcHJldmlvdXMsIGxldmVsOworfSBDaGFubmVsRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgTUFDRUNvbnRleHQgeworICAgIENoYW5uZWxEYXRhIGNoZFsyXTsKK30gTUFDRUNvbnRleHQ7CisKKy8qKgorICogTUFDRSB2ZXJzaW9uIG9mIGF2X2NsaXBfaW50MTYoKS4gV2UgaGF2ZSB0byBkbyB0aGlzIHRvIGtlZXAgYmluYXJ5CisgKiBpZGVudGljYWwgb3V0cHV0IHRvIHRoZSBiaW5hcnkgZGVjb2Rlci4KKyAqLworc3RhdGljIGlubGluZSBpbnQxNl90IG1hY2VfYnJva2VuX2NsaXBfaW50MTYoaW50IG4pCit7CisgICAgaWYgKG4gPiAzMjc2NykKKyAgICAgICAgcmV0dXJuIDMyNzY3OworICAgIGVsc2UgaWYgKG4gPCAtMzI3NjgpCisgICAgICAgIHJldHVybiAtMzI3Njc7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gbjsKK30KKworc3RhdGljIGludDE2X3QgcmVhZF90YWJsZShDaGFubmVsRGF0YSAqY2hkLCB1aW50OF90IHZhbCwgaW50IHRhYl9pZHgpCit7CisgICAgaW50MTZfdCBjdXJyZW50OworCisgICAgaWYgKHZhbCA8IHRhYnNbdGFiX2lkeF0uc3RyaWRlKQorICAgICAgICBjdXJyZW50ID0gdGFic1t0YWJfaWR4XS50YWIyWygoY2hkLT5pbmRleCAmIDB4N2YwKSA+PiA0KSAqIHRhYnNbdGFiX2lkeF0uc3RyaWRlICsgdmFsXTsKKyAgICBlbHNlCisgICAgICAgIGN1cnJlbnQgPSAtIDEgLSB0YWJzW3RhYl9pZHhdLnRhYjJbKChjaGQtPmluZGV4ICYgMHg3ZjApID4+IDQpKnRhYnNbdGFiX2lkeF0uc3RyaWRlICsgMip0YWJzW3RhYl9pZHhdLnN0cmlkZS12YWwtMV07CisKKyAgICBpZiAoKCBjaGQtPmluZGV4ICs9IHRhYnNbdGFiX2lkeF0udGFiMVt2YWxdLShjaGQtPmluZGV4ID4+IDUpICkgPCAwKQorICAgICAgY2hkLT5pbmRleCA9IDA7CisKKyAgICByZXR1cm4gY3VycmVudDsKK30KKworc3RhdGljIHZvaWQgY2hvbXAzKENoYW5uZWxEYXRhICpjaGQsIGludDE2X3QgKm91dHB1dCwgdWludDhfdCB2YWwsIGludCB0YWJfaWR4KQoreworCisgICAgaW50MTZfdCBjdXJyZW50ID0gcmVhZF90YWJsZShjaGQsIHZhbCwgdGFiX2lkeCk7CisKKyAgICBjdXJyZW50ID0gbWFjZV9icm9rZW5fY2xpcF9pbnQxNihjdXJyZW50ICsgY2hkLT5sZXZlbCk7CisKKyAgICBjaGQtPmxldmVsID0gY3VycmVudCAtIChjdXJyZW50ID4+IDMpOworICAgICpvdXRwdXQgPSBRVF84U18yXzE2UyhjdXJyZW50KTsKK30KKworc3RhdGljIHZvaWQgY2hvbXA2KENoYW5uZWxEYXRhICpjaGQsIGludDE2X3QgKm91dHB1dCwgdWludDhfdCB2YWwsIGludCB0YWJfaWR4KQoreworICAgIGludDE2X3QgY3VycmVudCA9IHJlYWRfdGFibGUoY2hkLCB2YWwsIHRhYl9pZHgpOworCisgICAgaWYgKChjaGQtPnByZXZpb3VzIF4gY3VycmVudCkgPj0gMCkgeworICAgICAgICBjaGQtPmZhY3RvciA9IEZGTUlOKGNoZC0+ZmFjdG9yICsgNTA2LCAzMjc2Nyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNoZC0+ZmFjdG9yIC0gMzE0IDwgLTMyNzY4KQorICAgICAgICAgICAgY2hkLT5mYWN0b3IgPSAtMzI3Njc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNoZC0+ZmFjdG9yIC09IDMxNDsKKyAgICB9CisKKyAgICBjdXJyZW50ID0gbWFjZV9icm9rZW5fY2xpcF9pbnQxNihjdXJyZW50ICsgY2hkLT5sZXZlbCk7CisKKyAgICBjaGQtPmxldmVsID0gKGN1cnJlbnQqY2hkLT5mYWN0b3IpID4+IDE1OworICAgIGN1cnJlbnQgPj49IDE7CisKKyAgICBvdXRwdXRbMF0gPSBRVF84U18yXzE2UyhjaGQtPnByZXZpb3VzICsgY2hkLT5wcmV2MiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGQtPnByZXYyLWN1cnJlbnQpID4+IDIpKTsKKyAgICBvdXRwdXRbMV0gPSBRVF84U18yXzE2UyhjaGQtPnByZXZpb3VzICsgY3VycmVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGQtPnByZXYyLWN1cnJlbnQpID4+IDIpKTsKKyAgICBjaGQtPnByZXYyID0gY2hkLT5wcmV2aW91czsKKyAgICBjaGQtPnByZXZpb3VzID0gY3VycmVudDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG1hY2VfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCkKK3sKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID4gMiB8fCBhdmN0eC0+Y2hhbm5lbHMgPCAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTZQOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjZV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIGludDE2X3QgKipzYW1wbGVzOworICAgIE1BQ0VDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCBqLCBrLCBsLCByZXQ7CisgICAgaW50IGlzX21hY2UzID0gKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NQUNFMyk7CisKKyAgICBpZiAoYnVmX3NpemUgJSAoYXZjdHgtPmNoYW5uZWxzIDw8IGlzX21hY2UzKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJ1ZmZlciBzaXplICVkIGlzIG9kZFxuIiwgYnVmX3NpemUpOworICAgICAgICBidWZfc2l6ZSAtPSBidWZfc2l6ZSAlIChhdmN0eC0+Y2hhbm5lbHMgPDwgaXNfbWFjZTMpOworICAgICAgICBpZiAoIWJ1Zl9zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IDMgKiAoYnVmX3NpemUgPDwgKDEgLSBpc19tYWNlMykpIC8gYXZjdHgtPmNoYW5uZWxzOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgc2FtcGxlcyA9IChpbnQxNl90ICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhOworCisgICAgZm9yKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgaW50MTZfdCAqb3V0cHV0ID0gc2FtcGxlc1tpXTsKKworICAgICAgICBmb3IgKGo9MDsgaiA8IGJ1Zl9zaXplIC8gKGF2Y3R4LT5jaGFubmVscyA8PCBpc19tYWNlMyk7IGorKykKKyAgICAgICAgICAgIGZvciAoaz0wOyBrIDwgKDEgPDwgaXNfbWFjZTMpOyBrKyspIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHBrdCA9IGJ1ZlsoaSA8PCBpc19tYWNlMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqKmF2Y3R4LT5jaGFubmVscyA8PCBpc19tYWNlMykgKyBrXTsKKworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmFsWzJdWzNdID0ge3twa3QgPj4gNSwgKHBrdCA+PiAzKSAmIDMsIHBrdCAmIDcgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGt0ICYgNyAsIChwa3QgPj4gMykgJiAzLCBwa3QgPj4gNX19OworCisgICAgICAgICAgICAgICAgZm9yIChsPTA7IGwgPCAzOyBsKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzX21hY2UzKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hvbXAzKCZjdHgtPmNoZFtpXSwgb3V0cHV0LCB2YWxbMV1bbF0sIGwpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjaG9tcDYoJmN0eC0+Y2hkW2ldLCBvdXRwdXQsIHZhbFswXVtsXSwgbCk7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IDEgPDwgKDEtaXNfbWFjZTMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK0FWQ29kZWMgZmZfbWFjZTNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibWFjZTMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNQUNFIChNYWNpbnRvc2ggQXVkaW8gQ29tcHJlc3Npb24vRXhwYW5zaW9uKSAzOjEiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTUFDRTMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1BQ0VDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBtYWNlX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IG1hY2VfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CisKK0FWQ29kZWMgZmZfbWFjZTZfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibWFjZTYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNQUNFIChNYWNpbnRvc2ggQXVkaW8gQ29tcHJlc3Npb24vRXhwYW5zaW9uKSA2OjEiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTUFDRTYsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1BQ0VDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBtYWNlX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IG1hY2VfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tYXRob3BzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tYXRob3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmY2EwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21hdGhvcHMuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIHNpbXBsZSBtYXRoIG9wZXJhdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PiBldCBhbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2lmbmRlZiBBVkNPREVDX01BVEhPUFNfSAorI2RlZmluZSBBVkNPREVDX01BVEhPUFNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNkZWZpbmUgTUFYX05FR19DUk9QIDEwMjQKKworZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGZmX2ludmVyc2VbMjU3XTsKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl9yZXZlcnNlWzI1Nl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9zcXJ0X3RhYlsyNTZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfY3JvcF90YWJbMjU2ICsgMiAqIE1BWF9ORUdfQ1JPUF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl96aWd6YWdfZGlyZWN0WzY0XTsKKworI2lmICAgQVJDSF9BUk0KKyMgICBpbmNsdWRlICJhcm0vbWF0aG9wcy5oIgorI2VsaWYgQVJDSF9BVlIzMgorIyAgIGluY2x1ZGUgImF2cjMyL21hdGhvcHMuaCIKKyNlbGlmIEFSQ0hfTUlQUworIyAgIGluY2x1ZGUgIm1pcHMvbWF0aG9wcy5oIgorI2VsaWYgQVJDSF9QUEMKKyMgICBpbmNsdWRlICJwcGMvbWF0aG9wcy5oIgorI2VsaWYgQVJDSF9YODYKKyMgICBpbmNsdWRlICJ4ODYvbWF0aG9wcy5oIgorI2VuZGlmCisKKy8qIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gKi8KKworI2lmbmRlZiBNVUw2NAorIyAgIGRlZmluZSBNVUw2NChhLGIpICgoaW50NjRfdCkoYSkgKiAoaW50NjRfdCkoYikpCisjZW5kaWYKKworI2lmbmRlZiBNVUxMCisjICAgZGVmaW5lIE1VTEwoYSxiLHMpIChNVUw2NChhLCBiKSA+PiAocykpCisjZW5kaWYKKworI2lmbmRlZiBNVUxICitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgTVVMSChpbnQgYSwgaW50IGIpeworICAgIHJldHVybiBNVUw2NChhLCBiKSA+PiAzMjsKK30KKyNlbmRpZgorCisjaWZuZGVmIFVNVUxICitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBVTVVMSCh1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKXsKKyAgICByZXR1cm4gKCh1aW50NjRfdCkoYSkgKiAodWludDY0X3QpKGIpKT4+MzI7Cit9CisjZW5kaWYKKworI2lmbmRlZiBNQUM2NAorIyAgIGRlZmluZSBNQUM2NChkLCBhLCBiKSAoKGQpICs9IE1VTDY0KGEsIGIpKQorI2VuZGlmCisKKyNpZm5kZWYgTUxTNjQKKyMgICBkZWZpbmUgTUxTNjQoZCwgYSwgYikgKChkKSAtPSBNVUw2NChhLCBiKSkKKyNlbmRpZgorCisvKiBzaWduZWQgMTZ4MTYgLT4gMzIgbXVsdGlwbHkgYWRkIGFjY3VtdWxhdGUgKi8KKyNpZm5kZWYgTUFDMTYKKyMgICBkZWZpbmUgTUFDMTYocnQsIHJhLCByYikgcnQgKz0gKHJhKSAqIChyYikKKyNlbmRpZgorCisvKiBzaWduZWQgMTZ4MTYgLT4gMzIgbXVsdGlwbHkgKi8KKyNpZm5kZWYgTVVMMTYKKyMgICBkZWZpbmUgTVVMMTYocmEsIHJiKSAoKHJhKSAqIChyYikpCisjZW5kaWYKKworI2lmbmRlZiBNTFMxNgorIyAgIGRlZmluZSBNTFMxNihydCwgcmEsIHJiKSAoKHJ0KSAtPSAocmEpICogKHJiKSkKKyNlbmRpZgorCisvKiBtZWRpYW4gb2YgMyAqLworI2lmbmRlZiBtaWRfcHJlZAorI2RlZmluZSBtaWRfcHJlZCBtaWRfcHJlZAorc3RhdGljIGlubGluZSBhdl9jb25zdCBpbnQgbWlkX3ByZWQoaW50IGEsIGludCBiLCBpbnQgYykKK3sKKyNpZiAwCisgICAgaW50IHQ9IChhLWIpJigoYS1iKT4+MzEpOworICAgIGEtPXQ7CisgICAgYis9dDsKKyAgICBiLT0gKGItYykmKChiLWMpPj4zMSk7CisgICAgYis9IChhLWIpJigoYS1iKT4+MzEpOworCisgICAgcmV0dXJuIGI7CisjZWxzZQorICAgIGlmKGE+Yil7CisgICAgICAgIGlmKGM+Yil7CisgICAgICAgICAgICBpZihjPmEpIGI9YTsKKyAgICAgICAgICAgIGVsc2UgICAgYj1jOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIGlmKGI+Yyl7CisgICAgICAgICAgICBpZihjPmEpIGI9YzsKKyAgICAgICAgICAgIGVsc2UgICAgYj1hOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiOworI2VuZGlmCit9CisjZW5kaWYKKworI2lmbmRlZiBzaWduX2V4dGVuZAorc3RhdGljIGlubGluZSBhdl9jb25zdCBpbnQgc2lnbl9leHRlbmQoaW50IHZhbCwgdW5zaWduZWQgYml0cykKK3sKKyAgICB1bnNpZ25lZCBzaGlmdCA9IDggKiBzaXplb2YoaW50KSAtIGJpdHM7CisgICAgdW5pb24geyB1bnNpZ25lZCB1OyBpbnQgczsgfSB2ID0geyAodW5zaWduZWQpIHZhbCA8PCBzaGlmdCB9OworICAgIHJldHVybiB2LnMgPj4gc2hpZnQ7Cit9CisjZW5kaWYKKworI2lmbmRlZiB6ZXJvX2V4dGVuZAorc3RhdGljIGlubGluZSBhdl9jb25zdCB1bnNpZ25lZCB6ZXJvX2V4dGVuZCh1bnNpZ25lZCB2YWwsIHVuc2lnbmVkIGJpdHMpCit7CisgICAgcmV0dXJuICh2YWwgPDwgKCg4ICogc2l6ZW9mKGludCkpIC0gYml0cykpID4+ICgoOCAqIHNpemVvZihpbnQpKSAtIGJpdHMpOworfQorI2VuZGlmCisKKyNpZm5kZWYgQ09QWTNfSUZfTFQKKyNkZWZpbmUgQ09QWTNfSUZfTFQoeCwgeSwgYSwgYiwgYywgZClcCitpZiAoKHkpIDwgKHgpKSB7XAorICAgICh4KSA9ICh5KTtcCisgICAgKGEpID0gKGIpO1wKKyAgICAoYykgPSAoZCk7XAorfQorI2VuZGlmCisKKyNpZm5kZWYgTUFTS19BQlMKKyNkZWZpbmUgTUFTS19BQlMobWFzaywgbGV2ZWwpIGRvIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFzayAgPSBsZXZlbCA+PiAzMTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGV2ZWwgPSAobGV2ZWwgXiBtYXNrKSAtIG1hc2s7ICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5kZWYgTkVHX1NTUjMyCisjICAgZGVmaW5lIE5FR19TU1IzMihhLHMpICgoKCBpbnQzMl90KShhKSk+PigzMi0ocykpKQorI2VuZGlmCisKKyNpZm5kZWYgTkVHX1VTUjMyCisjICAgZGVmaW5lIE5FR19VU1IzMihhLHMpICgoKHVpbnQzMl90KShhKSk+PigzMi0ocykpKQorI2VuZGlmCisKKyNpZiBIQVZFX0JJR0VORElBTgorIyBpZm5kZWYgUEFDS18yVTgKKyMgICBkZWZpbmUgUEFDS18yVTgoYSxiKSAgICAgKCgoYSkgPDwgIDgpIHwgKGIpKQorIyBlbmRpZgorIyBpZm5kZWYgUEFDS180VTgKKyMgICBkZWZpbmUgUEFDS180VTgoYSxiLGMsZCkgKCgoYSkgPDwgMjQpIHwgKChiKSA8PCAxNikgfCAoKGMpIDw8IDgpIHwgKGQpKQorIyBlbmRpZgorIyBpZm5kZWYgUEFDS18yVTE2CisjICAgZGVmaW5lIFBBQ0tfMlUxNihhLGIpICAgICgoKGEpIDw8IDE2KSB8IChiKSkKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBQQUNLXzJVOAorIyAgIGRlZmluZSBQQUNLXzJVOChhLGIpICAgICAoKChiKSA8PCAgOCkgfCAoYSkpCisjIGVuZGlmCisjIGlmbmRlZiBQQUNLXzRVMgorIyAgIGRlZmluZSBQQUNLXzRVOChhLGIsYyxkKSAoKChkKSA8PCAyNCkgfCAoKGMpIDw8IDE2KSB8ICgoYikgPDwgOCkgfCAoYSkpCisjIGVuZGlmCisjIGlmbmRlZiBQQUNLXzJVMTYKKyMgICBkZWZpbmUgUEFDS18yVTE2KGEsYikgICAgKCgoYikgPDwgMTYpIHwgKGEpKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUEFDS18yUzgKKyMgICBkZWZpbmUgUEFDS18yUzgoYSxiKSAgICAgUEFDS18yVTgoKGEpJjI1NSwgKGIpJjI1NSkKKyNlbmRpZgorI2lmbmRlZiBQQUNLXzRTOAorIyAgIGRlZmluZSBQQUNLXzRTOChhLGIsYyxkKSBQQUNLXzRVOCgoYSkmMjU1LCAoYikmMjU1LCAoYykmMjU1LCAoZCkmMjU1KQorI2VuZGlmCisjaWZuZGVmIFBBQ0tfMlMxNgorIyAgIGRlZmluZSBQQUNLXzJTMTYoYSxiKSAgICBQQUNLXzJVMTYoKGEpJjB4ZmZmZiwgKGIpJjB4ZmZmZikKKyNlbmRpZgorCisjaWZuZGVmIEZBU1RESVYKKyMgICBkZWZpbmUgRkFTVERJVihhLGIpICgodWludDMyX3QpKCgoKHVpbnQ2NF90KWEpICogZmZfaW52ZXJzZVtiXSkgPj4gMzIpKQorI2VuZGlmIC8qIEZBU1RESVYgKi8KKworc3RhdGljIGlubGluZSBhdl9jb25zdCB1bnNpZ25lZCBpbnQgZmZfc3FydCh1bnNpZ25lZCBpbnQgYSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgYjsKKworICAgIGlmIChhIDwgMjU1KSByZXR1cm4gKGZmX3NxcnRfdGFiW2EgKyAxXSAtIDEpID4+IDQ7CisgICAgZWxzZSBpZiAoYSA8ICgxIDw8IDEyKSkgYiA9IGZmX3NxcnRfdGFiW2EgPj4gNF0gPj4gMjsKKyNpZiAhQ09ORklHX1NNQUxMCisgICAgZWxzZSBpZiAoYSA8ICgxIDw8IDE0KSkgYiA9IGZmX3NxcnRfdGFiW2EgPj4gNl0gPj4gMTsKKyAgICBlbHNlIGlmIChhIDwgKDEgPDwgMTYpKSBiID0gZmZfc3FydF90YWJbYSA+PiA4XSAgIDsKKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBpbnQgcyA9IGF2X2xvZzJfMTZiaXQoYSA+PiAxNikgPj4gMTsKKyAgICAgICAgdW5zaWduZWQgaW50IGMgPSBhID4+IChzICsgMik7CisgICAgICAgIGIgPSBmZl9zcXJ0X3RhYltjID4+IChzICsgOCldOworICAgICAgICBiID0gRkFTVERJVihjLGIpICsgKGIgPDwgcyk7CisgICAgfQorCisgICAgcmV0dXJuIGIgLSAoYSA8IGIgKiBiKTsKK30KKworc3RhdGljIGlubGluZSBpbnQ4X3QgZmZfdThfdG9fczgodWludDhfdCBhKQoreworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDhfdCB1ODsKKyAgICAgICAgaW50OF90ICBzODsKKyAgICB9IGI7CisgICAgYi51OCA9IGE7CisgICAgcmV0dXJuIGIuczg7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX01BVEhPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWF0aHRhYmxlcy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWF0aHRhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2FjNTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tYXRodGFibGVzLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJtYXRob3BzLmgiCisKKy8qIGEqaW52ZXJzZVtiXT4+MzIgPT0gYS9iIGZvciBhbGwgMDw9YTw9MTY5MDk1NTggJiYgMjw9Yjw9MjU2CisgKiBmb3IgYT4xNjkwOTU1OCwgaXMgYW4gb3ZlcmVzdGltYXRlIGJ5IGxlc3MgdGhhbiAxIHBhcnQgaW4gMTw8MjQgKi8KK2NvbnN0IHVpbnQzMl90IGZmX2ludmVyc2VbMjU3XT17CisgICAgICAgICAwLCA0Mjk0OTY3Mjk1VSwyMTQ3NDgzNjQ4VSwxNDMxNjU1NzY2LCAxMDczNzQxODI0LCAgODU4OTkzNDYwLCAgNzE1ODI3ODgzLCAgNjEzNTY2NzU3LAorIDUzNjg3MDkxMiwgIDQ3NzIxODU4OSwgIDQyOTQ5NjczMCwgIDM5MDQ1MTU3MywgIDM1NzkxMzk0MiwgIDMzMDM4MjEwMCwgIDMwNjc4MzM3OSwgIDI4NjMzMTE1NCwKKyAyNjg0MzU0NTYsICAyNTI2NDUxMzYsICAyMzg2MDkyOTUsICAyMjYwNTA5MTEsICAyMTQ3NDgzNjUsICAyMDQ1MjIyNTMsICAxOTUyMjU3ODcsICAxODY3Mzc3MDksCisgMTc4OTU2OTcxLCAgMTcxNzk4NjkyLCAgMTY1MTkxMDUwLCAgMTU5MDcyODYzLCAgMTUzMzkxNjkwLCAgMTQ4MTAyMzIxLCAgMTQzMTY1NTc3LCAgMTM4NTQ3MzMzLAorIDEzNDIxNzcyOCwgIDEzMDE1MDUyNSwgIDEyNjMyMjU2OCwgIDEyMjcxMzM1MiwgIDExOTMwNDY0OCwgIDExNjA4MDE5OCwgIDExMzAyNTQ1NiwgIDExMDEyNzM2NywKKyAxMDczNzQxODMsICAxMDQ3NTUzMDAsICAxMDIyNjExMjcsICAgOTk4ODI5NjEsICAgOTc2MTI4OTQsICAgOTU0NDM3MTgsICAgOTMzNjg4NTUsICAgOTEzODIyODMsCisgIDg5NDc4NDg2LCAgIDg3NjUyMzk0LCAgIDg1ODk5MzQ2LCAgIDg0MjE1MDQ2LCAgIDgyNTk1NTI1LCAgIDgxMDM3MTE5LCAgIDc5NTM2NDMyLCAgIDc4MDkwMzE1LAorICA3NjY5NTg0NSwgICA3NTM1MDMwNCwgICA3NDA1MTE2MSwgICA3Mjc5NjA1NiwgICA3MTU4Mjc4OSwgICA3MDQwOTMwMCwgICA2OTI3MzY2NywgICA2ODE3NDA4NSwKKyAgNjcxMDg4NjQsICAgNjYwNzY0MjAsICAgNjUwNzUyNjMsICAgNjQxMDM5OTAsICAgNjMxNjEyODQsICAgNjIyNDU5MDMsICAgNjEzNTY2NzYsICAgNjA0OTI0OTgsCisgIDU5NjUyMzI0LCAgIDU4ODM1MTY5LCAgIDU4MDQwMDk5LCAgIDU3MjY2MjMxLCAgIDU2NTEyNzI4LCAgIDU1Nzc4Nzk3LCAgIDU1MDYzNjg0LCAgIDU0MzY2Njc1LAorICA1MzY4NzA5MiwgICA1MzAyNDI4OCwgICA1MjM3NzY1MCwgICA1MTc0NjU5NCwgICA1MTEzMDU2NCwgICA1MDUyOTAyOCwgICA0OTk0MTQ4MSwgICA0OTM2NzQ0MSwKKyAgNDg4MDY0NDcsICAgNDgyNTgwNjAsICAgNDc3MjE4NTksICAgNDcxOTc0NDMsICAgNDY2ODQ0MjgsICAgNDYxODI0NDUsICAgNDU2OTExNDIsICAgNDUyMTAxODMsCisgIDQ0NzM5MjQzLCAgIDQ0Mjc4MDE0LCAgIDQzODI2MTk3LCAgIDQzMzgzNTA5LCAgIDQyOTQ5NjczLCAgIDQyNTI0NDI5LCAgIDQyMTA3NTIzLCAgIDQxNjk4NzEyLAorICA0MTI5Nzc2MywgICA0MDkwNDQ1MSwgICA0MDUxODU2MCwgICA0MDEzOTg4MiwgICAzOTc2ODIxNiwgICAzOTQwMzM3MCwgICAzOTA0NTE1OCwgICAzODY5MzQwMCwKKyAgMzgzNDc5MjMsICAgMzgwMDg1NjEsICAgMzc2NzUxNTIsICAgMzczNDc1NDIsICAgMzcwMjU1ODEsICAgMzY3MDkxMjMsICAgMzYzOTgwMjgsICAgMzYwOTIxNjMsCisgIDM1NzkxMzk1LCAgIDM1NDk1NTk4LCAgIDM1MjA0NjUwLCAgIDM0OTE4NDM0LCAgIDM0NjM2ODM0LCAgIDM0MzU5NzM5LCAgIDM0MDg3MDQzLCAgIDMzODE4NjQxLAorICAzMzU1NDQzMiwgICAzMzI5NDMyMSwgICAzMzAzODIxMCwgICAzMjc4NjAxMCwgICAzMjUzNzYzMiwgICAzMjI5Mjk4OCwgICAzMjA1MTk5NSwgICAzMTgxNDU3MywKKyAgMzE1ODA2NDIsICAgMzEzNTAxMjcsICAgMzExMjI5NTIsICAgMzA4OTkwNDYsICAgMzA2NzgzMzgsICAgMzA0NjA3NjEsICAgMzAyNDYyNDksICAgMzAwMzQ3MzcsCisgIDI5ODI2MTYyLCAgIDI5NjIwNDY1LCAgIDI5NDE3NTg1LCAgIDI5MjE3NDY1LCAgIDI5MDIwMDUwLCAgIDI4ODI1Mjg0LCAgIDI4NjMzMTE2LCAgIDI4NDQzNDkzLAorICAyODI1NjM2NCwgICAyODA3MTY4MiwgICAyNzg4OTM5OSwgICAyNzcwOTQ2NywgICAyNzUzMTg0MiwgICAyNzM1NjQ4MCwgICAyNzE4MzMzOCwgICAyNzAxMjM3MywKKyAgMjY4NDM1NDYsICAgMjY2NzY4MTYsICAgMjY1MTIxNDQsICAgMjYzNDk0OTMsICAgMjYxODg4MjUsICAgMjYwMzAxMDUsICAgMjU4NzMyOTcsICAgMjU3MTgzNjgsCisgIDI1NTY1MjgyLCAgIDI1NDE0MDA4LCAgIDI1MjY0NTE0LCAgIDI1MTE2NzY4LCAgIDI0OTcwNzQxLCAgIDI0ODI2NDAxLCAgIDI0NjgzNzIxLCAgIDI0NTQyNjcxLAorICAyNDQwMzIyNCwgICAyNDI2NTM1MiwgICAyNDEyOTAzMCwgICAyMzk5NDIzMSwgICAyMzg2MDkzMCwgICAyMzcyOTEwMiwgICAyMzU5ODcyMiwgICAyMzQ2OTc2NywKKyAgMjMzNDIyMTQsICAgMjMyMTYwNDAsICAgMjMwOTEyMjMsICAgMjI5Njc3NDAsICAgMjI4NDU1NzEsICAgMjI3MjQ2OTUsICAgMjI2MDUwOTIsICAgMjI0ODY3NDAsCisgIDIyMzY5NjIyLCAgIDIyMjUzNzE3LCAgIDIyMTM5MDA3LCAgIDIyMDI1NDc0LCAgIDIxOTEzMDk5LCAgIDIxODAxODY1LCAgIDIxNjkxNzU1LCAgIDIxNTgyNzUxLAorICAyMTQ3NDgzNywgICAyMTM2Nzk5NywgICAyMTI2MjIxNSwgICAyMTE1NzQ3NSwgICAyMTA1Mzc2MiwgICAyMDk1MTA2MCwgICAyMDg0OTM1NiwgICAyMDc0ODYzNSwKKyAgMjA2NDg4ODIsICAgMjA1NTAwODMsICAgMjA0NTIyMjYsICAgMjAzNTUyOTYsICAgMjAyNTkyODAsICAgMjAxNjQxNjYsICAgMjAwNjk5NDEsICAgMTk5NzY1OTMsCisgIDE5ODg0MTA4LCAgIDE5NzkyNDc3LCAgIDE5NzAxNjg1LCAgIDE5NjExNzIzLCAgIDE5NTIyNTc5LCAgIDE5NDM0MjQyLCAgIDE5MzQ2NzAwLCAgIDE5MjU5OTQ0LAorICAxOTE3Mzk2MiwgICAxOTA4ODc0NCwgICAxOTAwNDI4MSwgICAxODkyMDU2MSwgICAxODgzNzU3NiwgICAxODc1NTMxNiwgICAxODY3Mzc3MSwgICAxODU5MjkzMywKKyAgMTg1MTI3OTEsICAgMTg0MzMzMzcsICAgMTgzNTQ1NjIsICAgMTgyNzY0NTcsICAgMTgxOTkwMTQsICAgMTgxMjIyMjUsICAgMTgwNDYwODIsICAgMTc5NzA1NzUsCisgIDE3ODk1Njk4LCAgIDE3ODIxNDQyLCAgIDE3NzQ3Nzk5LCAgIDE3Njc0NzYzLCAgIDE3NjAyMzI1LCAgIDE3NTMwNDc5LCAgIDE3NDU5MjE3LCAgIDE3Mzg4NTMyLAorICAxNzMxODQxNywgICAxNzI0ODg2NSwgICAxNzE3OTg3MCwgICAxNzExMTQyNCwgICAxNzA0MzUyMiwgICAxNjk3NjE1NiwgICAxNjkwOTMyMSwgICAxNjg0MzAxMCwKKyAgMTY3NzcyMTYKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfc3FydF90YWJbMjU2XT17CisgIDAsIDE2LCAyMywgMjgsIDMyLCAzNiwgNDAsIDQzLCA0NiwgNDgsIDUxLCA1NCwgNTYsIDU4LCA2MCwgNjIsIDY0LCA2NiwgNjgsIDcwLCA3MiwgNzQsIDc2LCA3NywgNzksIDgwLCA4MiwgODQsIDg1LCA4NywgODgsIDkwLAorIDkxLCA5MiwgOTQsIDk1LCA5NiwgOTgsIDk5LDEwMCwxMDIsMTAzLDEwNCwxMDUsMTA3LDEwOCwxMDksMTEwLDExMSwxMTIsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywKKzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTYsCisxNTcsMTU4LDE1OSwxNjAsMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OCwxNjksMTcwLDE3MSwxNzEsMTcyLDE3MywxNzQsMTc0LDE3NSwxNzYsMTc2LDE3NywxNzgsMTc5LDE3OSwxODAsMTgxLAorMTgyLDE4MiwxODMsMTg0LDE4NCwxODUsMTg2LDE4NiwxODcsMTg4LDE4OCwxODksMTkwLDE5MCwxOTEsMTkyLDE5MiwxOTMsMTk0LDE5NCwxOTUsMTk2LDE5NiwxOTcsMTk4LDE5OCwxOTksMjAwLDIwMCwyMDEsMjAyLDIwMiwKKzIwMywyMDQsMjA0LDIwNSwyMDUsMjA2LDIwNywyMDcsMjA4LDIwOCwyMDksMjEwLDIxMCwyMTEsMjEyLDIxMiwyMTMsMjEzLDIxNCwyMTUsMjE1LDIxNiwyMTYsMjE3LDIxOCwyMTgsMjE5LDIxOSwyMjAsMjIwLDIyMSwyMjIsCisyMjIsMjIzLDIyMywyMjQsMjI0LDIyNSwyMjYsMjI2LDIyNywyMjcsMjI4LDIyOCwyMjksMjMwLDIzMCwyMzEsMjMxLDIzMiwyMzIsMjMzLDIzMywyMzQsMjM1LDIzNSwyMzYsMjM2LDIzNywyMzcsMjM4LDIzOCwyMzksMjM5LAorMjQwLDI0MCwyNDEsMjQyLDI0MiwyNDMsMjQzLDI0NCwyNDQsMjQ1LDI0NSwyNDYsMjQ2LDI0NywyNDcsMjQ4LDI0OCwyNDksMjQ5LDI1MCwyNTAsMjUxLDI1MSwyNTIsMjUyLDI1MywyNTMsMjU0LDI1NCwyNTUsMjU1LDI1NQorfTsKKworY29uc3QgdWludDhfdCBmZl9yZXZlcnNlWzI1Nl0gPSB7CisweDAwLDB4ODAsMHg0MCwweEMwLDB4MjAsMHhBMCwweDYwLDB4RTAsMHgxMCwweDkwLDB4NTAsMHhEMCwweDMwLDB4QjAsMHg3MCwweEYwLAorMHgwOCwweDg4LDB4NDgsMHhDOCwweDI4LDB4QTgsMHg2OCwweEU4LDB4MTgsMHg5OCwweDU4LDB4RDgsMHgzOCwweEI4LDB4NzgsMHhGOCwKKzB4MDQsMHg4NCwweDQ0LDB4QzQsMHgyNCwweEE0LDB4NjQsMHhFNCwweDE0LDB4OTQsMHg1NCwweEQ0LDB4MzQsMHhCNCwweDc0LDB4RjQsCisweDBDLDB4OEMsMHg0QywweENDLDB4MkMsMHhBQywweDZDLDB4RUMsMHgxQywweDlDLDB4NUMsMHhEQywweDNDLDB4QkMsMHg3QywweEZDLAorMHgwMiwweDgyLDB4NDIsMHhDMiwweDIyLDB4QTIsMHg2MiwweEUyLDB4MTIsMHg5MiwweDUyLDB4RDIsMHgzMiwweEIyLDB4NzIsMHhGMiwKKzB4MEEsMHg4QSwweDRBLDB4Q0EsMHgyQSwweEFBLDB4NkEsMHhFQSwweDFBLDB4OUEsMHg1QSwweERBLDB4M0EsMHhCQSwweDdBLDB4RkEsCisweDA2LDB4ODYsMHg0NiwweEM2LDB4MjYsMHhBNiwweDY2LDB4RTYsMHgxNiwweDk2LDB4NTYsMHhENiwweDM2LDB4QjYsMHg3NiwweEY2LAorMHgwRSwweDhFLDB4NEUsMHhDRSwweDJFLDB4QUUsMHg2RSwweEVFLDB4MUUsMHg5RSwweDVFLDB4REUsMHgzRSwweEJFLDB4N0UsMHhGRSwKKzB4MDEsMHg4MSwweDQxLDB4QzEsMHgyMSwweEExLDB4NjEsMHhFMSwweDExLDB4OTEsMHg1MSwweEQxLDB4MzEsMHhCMSwweDcxLDB4RjEsCisweDA5LDB4ODksMHg0OSwweEM5LDB4MjksMHhBOSwweDY5LDB4RTksMHgxOSwweDk5LDB4NTksMHhEOSwweDM5LDB4QjksMHg3OSwweEY5LAorMHgwNSwweDg1LDB4NDUsMHhDNSwweDI1LDB4QTUsMHg2NSwweEU1LDB4MTUsMHg5NSwweDU1LDB4RDUsMHgzNSwweEI1LDB4NzUsMHhGNSwKKzB4MEQsMHg4RCwweDRELDB4Q0QsMHgyRCwweEFELDB4NkQsMHhFRCwweDFELDB4OUQsMHg1RCwweERELDB4M0QsMHhCRCwweDdELDB4RkQsCisweDAzLDB4ODMsMHg0MywweEMzLDB4MjMsMHhBMywweDYzLDB4RTMsMHgxMywweDkzLDB4NTMsMHhEMywweDMzLDB4QjMsMHg3MywweEYzLAorMHgwQiwweDhCLDB4NEIsMHhDQiwweDJCLDB4QUIsMHg2QiwweEVCLDB4MUIsMHg5QiwweDVCLDB4REIsMHgzQiwweEJCLDB4N0IsMHhGQiwKKzB4MDcsMHg4NywweDQ3LDB4QzcsMHgyNywweEE3LDB4NjcsMHhFNywweDE3LDB4OTcsMHg1NywweEQ3LDB4MzcsMHhCNywweDc3LDB4RjcsCisweDBGLDB4OEYsMHg0RiwweENGLDB4MkYsMHhBRiwweDZGLDB4RUYsMHgxRiwweDlGLDB4NUYsMHhERiwweDNGLDB4QkYsMHg3RiwweEZGLAorfTsKKworI2RlZmluZSB0aW1lczQoeCkgeCwgeCwgeCwgeAorI2RlZmluZSB0aW1lczI1Nih4KSB0aW1lczQodGltZXM0KHRpbWVzNCh0aW1lczQodGltZXM0KHgpKSkpKQorCitjb25zdCB1aW50OF90IGZmX2Nyb3BfdGFiWzI1NiArIDIgKiBNQVhfTkVHX0NST1BdID0gewordGltZXMyNTYoMHgwMCksCisweDAwLDB4MDEsMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgwRSwweDBGLAorMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsMHgxQywweDFELDB4MUUsMHgxRiwKKzB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MjksMHgyQSwweDJCLDB4MkMsMHgyRCwweDJFLDB4MkYsCisweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwweDM2LDB4MzcsMHgzOCwweDM5LDB4M0EsMHgzQiwweDNDLDB4M0QsMHgzRSwweDNGLAorMHg0MCwweDQxLDB4NDIsMHg0MywweDQ0LDB4NDUsMHg0NiwweDQ3LDB4NDgsMHg0OSwweDRBLDB4NEIsMHg0QywweDRELDB4NEUsMHg0RiwKKzB4NTAsMHg1MSwweDUyLDB4NTMsMHg1NCwweDU1LDB4NTYsMHg1NywweDU4LDB4NTksMHg1QSwweDVCLDB4NUMsMHg1RCwweDVFLDB4NUYsCisweDYwLDB4NjEsMHg2MiwweDYzLDB4NjQsMHg2NSwweDY2LDB4NjcsMHg2OCwweDY5LDB4NkEsMHg2QiwweDZDLDB4NkQsMHg2RSwweDZGLAorMHg3MCwweDcxLDB4NzIsMHg3MywweDc0LDB4NzUsMHg3NiwweDc3LDB4NzgsMHg3OSwweDdBLDB4N0IsMHg3QywweDdELDB4N0UsMHg3RiwKKzB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksMHg4QSwweDhCLDB4OEMsMHg4RCwweDhFLDB4OEYsCisweDkwLDB4OTEsMHg5MiwweDkzLDB4OTQsMHg5NSwweDk2LDB4OTcsMHg5OCwweDk5LDB4OUEsMHg5QiwweDlDLDB4OUQsMHg5RSwweDlGLAorMHhBMCwweEExLDB4QTIsMHhBMywweEE0LDB4QTUsMHhBNiwweEE3LDB4QTgsMHhBOSwweEFBLDB4QUIsMHhBQywweEFELDB4QUUsMHhBRiwKKzB4QjAsMHhCMSwweEIyLDB4QjMsMHhCNCwweEI1LDB4QjYsMHhCNywweEI4LDB4QjksMHhCQSwweEJCLDB4QkMsMHhCRCwweEJFLDB4QkYsCisweEMwLDB4QzEsMHhDMiwweEMzLDB4QzQsMHhDNSwweEM2LDB4QzcsMHhDOCwweEM5LDB4Q0EsMHhDQiwweENDLDB4Q0QsMHhDRSwweENGLAorMHhEMCwweEQxLDB4RDIsMHhEMywweEQ0LDB4RDUsMHhENiwweEQ3LDB4RDgsMHhEOSwweERBLDB4REIsMHhEQywweERELDB4REUsMHhERiwKKzB4RTAsMHhFMSwweEUyLDB4RTMsMHhFNCwweEU1LDB4RTYsMHhFNywweEU4LDB4RTksMHhFQSwweEVCLDB4RUMsMHhFRCwweEVFLDB4RUYsCisweEYwLDB4RjEsMHhGMiwweEYzLDB4RjQsMHhGNSwweEY2LDB4RjcsMHhGOCwweEY5LDB4RkEsMHhGQiwweEZDLDB4RkQsMHhGRSwweEZGLAordGltZXMyNTYoMHhGRikKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfemlnemFnX2RpcmVjdFs2NF0gPSB7CisgICAgMCwgICAxLCAgOCwgMTYsICA5LCAgMiwgIDMsIDEwLAorICAgIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsICA0LCAgNSwKKyAgICAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCisgICAgMjcsIDIwLCAxMywgIDYsICA3LCAxNCwgMjEsIDI4LAorICAgIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwKKyAgICAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsCisgICAgNTgsIDU5LCA1MiwgNDUsIDM4LCAzMSwgMzksIDQ2LAorICAgIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MworfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21kY3RfZml4ZWQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21kY3RfZml4ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzJjYjAwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWRjdF9maXhlZC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBGRlRfRkxPQVQgMAorI2RlZmluZSBGRlRfRklYRURfMzIgMAorI2luY2x1ZGUgIm1kY3RfdGVtcGxhdGUuYyIKKworLyogc2FtZSBhcyBmZl9tZGN0X2NhbGN3X2Mgd2l0aCBkb3VibGUtd2lkdGggdW5zY2FsZWQgb3V0cHV0ICovCit2b2lkIGZmX21kY3RfY2FsY3dfYyhGRlRDb250ZXh0ICpzLCBGRlREb3VibGUgKm91dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dCkKK3sKKyAgICBpbnQgaSwgaiwgbiwgbjgsIG40LCBuMiwgbjM7CisgICAgRkZURG91YmxlIHJlLCBpbTsKKyAgICBjb25zdCB1aW50MTZfdCAqcmV2dGFiID0gcy0+cmV2dGFiOworICAgIGNvbnN0IEZGVFNhbXBsZSAqdGNvcyA9IHMtPnRjb3M7CisgICAgY29uc3QgRkZUU2FtcGxlICp0c2luID0gcy0+dHNpbjsKKyAgICBGRlRDb21wbGV4ICp4ID0gcy0+dG1wX2J1ZjsKKyAgICBGRlREQ29tcGxleCAqbyA9IChGRlREQ29tcGxleCAqKW91dDsKKworICAgIG4gPSAxIDw8IHMtPm1kY3RfYml0czsKKyAgICBuMiA9IG4gPj4gMTsKKyAgICBuNCA9IG4gPj4gMjsKKyAgICBuOCA9IG4gPj4gMzsKKyAgICBuMyA9IDMgKiBuNDsKKworICAgIC8qIHByZSByb3RhdGlvbiAqLworICAgIGZvcihpPTA7aTxuODtpKyspIHsKKyAgICAgICAgcmUgPSBSU0NBTEUoLWlucHV0WzIqaStuM10gLSBpbnB1dFtuMy0xLTIqaV0pOworICAgICAgICBpbSA9IFJTQ0FMRSgtaW5wdXRbbjQrMippXSArIGlucHV0W240LTEtMippXSk7CisgICAgICAgIGogPSByZXZ0YWJbaV07CisgICAgICAgIENNVUwoeFtqXS5yZSwgeFtqXS5pbSwgcmUsIGltLCAtdGNvc1tpXSwgdHNpbltpXSk7CisKKyAgICAgICAgcmUgPSBSU0NBTEUoIGlucHV0WzIqaV0gICAgLSBpbnB1dFtuMi0xLTIqaV0pOworICAgICAgICBpbSA9IFJTQ0FMRSgtaW5wdXRbbjIrMippXSAtIGlucHV0WyBuLTEtMippXSk7CisgICAgICAgIGogPSByZXZ0YWJbbjggKyBpXTsKKyAgICAgICAgQ01VTCh4W2pdLnJlLCB4W2pdLmltLCByZSwgaW0sIC10Y29zW244ICsgaV0sIHRzaW5bbjggKyBpXSk7CisgICAgfQorCisgICAgcy0+ZmZ0X2NhbGMocywgeCk7CisKKyAgICAvKiBwb3N0IHJvdGF0aW9uICovCisgICAgZm9yKGk9MDtpPG44O2krKykgeworICAgICAgICBGRlREb3VibGUgcjAsIGkwLCByMSwgaTE7CisgICAgICAgIENNVUxMKGkxLCByMCwgeFtuOC1pLTFdLnJlLCB4W244LWktMV0uaW0sIC10c2luW244LWktMV0sIC10Y29zW244LWktMV0pOworICAgICAgICBDTVVMTChpMCwgcjEsIHhbbjgraSAgXS5yZSwgeFtuOCtpICBdLmltLCAtdHNpbltuOCtpICBdLCAtdGNvc1tuOCtpICBdKTsKKyAgICAgICAgb1tuOC1pLTFdLnJlID0gcjA7CisgICAgICAgIG9bbjgtaS0xXS5pbSA9IGkwOworICAgICAgICBvW244K2kgIF0ucmUgPSByMTsKKyAgICAgICAgb1tuOCtpICBdLmltID0gaTE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWRjdF9maXhlZF8zMi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWRjdF9maXhlZF8zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMzRkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tZGN0X2ZpeGVkXzMyLmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcnM6ICBTdGFuaXNsYXYgT2NvdmFqIChzb2NvdmFqQG1pcHMuY29tKQorICogICAgICAgICAgIEdvcmFuIENvcmRhc2ljICAgKGdvcmFuQG1pcHMuY29tKQorICogICAgICAgICAgIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamVAbWlwcy5jb20pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgRkZUX0ZMT0FUIDAKKyNkZWZpbmUgRkZUX0ZJWEVEXzMyIDEKKyNpbmNsdWRlICJtZGN0X3RlbXBsYXRlLmMiCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tZGN0X2Zsb2F0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tZGN0X2Zsb2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmMmQyMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21kY3RfZmxvYXQuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgRkZUX0ZMT0FUIDEKKyNkZWZpbmUgRkZUX0ZJWEVEXzMyIDAKKyNpbmNsdWRlICJtZGN0X3RlbXBsYXRlLmMiCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tZGN0X3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tZGN0X3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhOGJjYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21kY3RfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIE1EQ1QvSU1EQ1QgdHJhbnNmb3JtcworICogQ29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgImZmdC1pbnRlcm5hbC5oIgorCisvKioKKyAqIEBmaWxlCisgKiBNRENUL0lNRENUIHRyYW5zZm9ybXMuCisgKi8KKworI2lmIEZGVF9GTE9BVAorIyAgIGRlZmluZSBSU0NBTEUoeCkgKHgpCisjZWxzZQorI2lmIEZGVF9GSVhFRF8zMgorIyAgIGRlZmluZSBSU0NBTEUoeCkgKCgoeCkgKyAzMikgPj4gNikKKyNlbHNlIC8qIEZGVF9GSVhFRF8zMiAqLworIyAgIGRlZmluZSBSU0NBTEUoeCkgKCh4KSA+PiAxKQorI2VuZGlmIC8qIEZGVF9GSVhFRF8zMiAqLworI2VuZGlmCisKKy8qKgorICogaW5pdCBNRENUIG9yIElNRENUIGNvbXB1dGF0aW9uLgorICovCithdl9jb2xkIGludCBmZl9tZGN0X2luaXQoRkZUQ29udGV4dCAqcywgaW50IG5iaXRzLCBpbnQgaW52ZXJzZSwgZG91YmxlIHNjYWxlKQoreworICAgIGludCBuLCBuNCwgaTsKKyAgICBkb3VibGUgYWxwaGEsIHRoZXRhOworICAgIGludCB0c3RlcDsKKworICAgIG1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKKyAgICBuID0gMSA8PCBuYml0czsKKyAgICBzLT5tZGN0X2JpdHMgPSBuYml0czsKKyAgICBzLT5tZGN0X3NpemUgPSBuOworICAgIG40ID0gbiA+PiAyOworICAgIHMtPm1kY3RfcGVybXV0YXRpb24gPSBGRl9NRENUX1BFUk1fTk9ORTsKKworICAgIGlmIChmZl9mZnRfaW5pdChzLCBzLT5tZGN0X2JpdHMgLSAyLCBpbnZlcnNlKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHMtPnRjb3MgPSBhdl9tYWxsb2NfYXJyYXkobi8yLCBzaXplb2YoRkZUU2FtcGxlKSk7CisgICAgaWYgKCFzLT50Y29zKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzd2l0Y2ggKHMtPm1kY3RfcGVybXV0YXRpb24pIHsKKyAgICBjYXNlIEZGX01EQ1RfUEVSTV9OT05FOgorICAgICAgICBzLT50c2luID0gcy0+dGNvcyArIG40OworICAgICAgICB0c3RlcCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfTURDVF9QRVJNX0lOVEVSTEVBVkU6CisgICAgICAgIHMtPnRzaW4gPSBzLT50Y29zICsgMTsKKyAgICAgICAgdHN0ZXAgPSAyOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgdGhldGEgPSAxLjAgLyA4LjAgKyAoc2NhbGUgPCAwID8gbjQgOiAwKTsKKyAgICBzY2FsZSA9IHNxcnQoZmFicyhzY2FsZSkpOworICAgIGZvcihpPTA7aTxuNDtpKyspIHsKKyAgICAgICAgYWxwaGEgPSAyICogTV9QSSAqIChpICsgdGhldGEpIC8gbjsKKyAgICAgICAgcy0+dGNvc1tpKnRzdGVwXSA9IEZJWDE1KC1jb3MoYWxwaGEpICogc2NhbGUpOworICAgICAgICBzLT50c2luW2kqdHN0ZXBdID0gRklYMTUoLXNpbihhbHBoYSkgKiBzY2FsZSk7CisgICAgfQorICAgIHJldHVybiAwOworIGZhaWw6CisgICAgZmZfbWRjdF9lbmQocyk7CisgICAgcmV0dXJuIC0xOworfQorCisvKioKKyAqIENvbXB1dGUgdGhlIG1pZGRsZSBoYWxmIG9mIHRoZSBpbnZlcnNlIE1EQ1Qgb2Ygc2l6ZSBOID0gMl5uYml0cywKKyAqIHRodXMgZXhjbHVkaW5nIHRoZSBwYXJ0cyB0aGF0IGNhbiBiZSBkZXJpdmVkIGJ5IHN5bW1ldHJ5CisgKiBAcGFyYW0gb3V0cHV0IE4vMiBzYW1wbGVzCisgKiBAcGFyYW0gaW5wdXQgTi8yIHNhbXBsZXMKKyAqLwordm9pZCBmZl9pbWRjdF9oYWxmX2MoRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpCit7CisgICAgaW50IGssIG44LCBuNCwgbjIsIG4sIGo7CisgICAgY29uc3QgdWludDE2X3QgKnJldnRhYiA9IHMtPnJldnRhYjsKKyAgICBjb25zdCBGRlRTYW1wbGUgKnRjb3MgPSBzLT50Y29zOworICAgIGNvbnN0IEZGVFNhbXBsZSAqdHNpbiA9IHMtPnRzaW47CisgICAgY29uc3QgRkZUU2FtcGxlICppbjEsICppbjI7CisgICAgRkZUQ29tcGxleCAqeiA9IChGRlRDb21wbGV4ICopb3V0cHV0OworCisgICAgbiA9IDEgPDwgcy0+bWRjdF9iaXRzOworICAgIG4yID0gbiA+PiAxOworICAgIG40ID0gbiA+PiAyOworICAgIG44ID0gbiA+PiAzOworCisgICAgLyogcHJlIHJvdGF0aW9uICovCisgICAgaW4xID0gaW5wdXQ7CisgICAgaW4yID0gaW5wdXQgKyBuMiAtIDE7CisgICAgZm9yKGsgPSAwOyBrIDwgbjQ7IGsrKykgeworICAgICAgICBqPXJldnRhYltrXTsKKyAgICAgICAgQ01VTCh6W2pdLnJlLCB6W2pdLmltLCAqaW4yLCAqaW4xLCB0Y29zW2tdLCB0c2luW2tdKTsKKyAgICAgICAgaW4xICs9IDI7CisgICAgICAgIGluMiAtPSAyOworICAgIH0KKyAgICBzLT5mZnRfY2FsYyhzLCB6KTsKKworICAgIC8qIHBvc3Qgcm90YXRpb24gKyByZW9yZGVyaW5nICovCisgICAgZm9yKGsgPSAwOyBrIDwgbjg7IGsrKykgeworICAgICAgICBGRlRTYW1wbGUgcjAsIGkwLCByMSwgaTE7CisgICAgICAgIENNVUwocjAsIGkxLCB6W244LWstMV0uaW0sIHpbbjgtay0xXS5yZSwgdHNpbltuOC1rLTFdLCB0Y29zW244LWstMV0pOworICAgICAgICBDTVVMKHIxLCBpMCwgeltuOCtrICBdLmltLCB6W244K2sgIF0ucmUsIHRzaW5bbjgrayAgXSwgdGNvc1tuOCtrICBdKTsKKyAgICAgICAgeltuOC1rLTFdLnJlID0gcjA7CisgICAgICAgIHpbbjgtay0xXS5pbSA9IGkwOworICAgICAgICB6W244K2sgIF0ucmUgPSByMTsKKyAgICAgICAgeltuOCtrICBdLmltID0gaTE7CisgICAgfQorfQorCisvKioKKyAqIENvbXB1dGUgaW52ZXJzZSBNRENUIG9mIHNpemUgTiA9IDJebmJpdHMKKyAqIEBwYXJhbSBvdXRwdXQgTiBzYW1wbGVzCisgKiBAcGFyYW0gaW5wdXQgTi8yIHNhbXBsZXMKKyAqLwordm9pZCBmZl9pbWRjdF9jYWxjX2MoRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpCit7CisgICAgaW50IGs7CisgICAgaW50IG4gPSAxIDw8IHMtPm1kY3RfYml0czsKKyAgICBpbnQgbjIgPSBuID4+IDE7CisgICAgaW50IG40ID0gbiA+PiAyOworCisgICAgZmZfaW1kY3RfaGFsZl9jKHMsIG91dHB1dCtuNCwgaW5wdXQpOworCisgICAgZm9yKGsgPSAwOyBrIDwgbjQ7IGsrKykgeworICAgICAgICBvdXRwdXRba10gPSAtb3V0cHV0W24yLWstMV07CisgICAgICAgIG91dHB1dFtuLWstMV0gPSBvdXRwdXRbbjIra107CisgICAgfQorfQorCisvKioKKyAqIENvbXB1dGUgTURDVCBvZiBzaXplIE4gPSAyXm5iaXRzCisgKiBAcGFyYW0gaW5wdXQgTiBzYW1wbGVzCisgKiBAcGFyYW0gb3V0IE4vMiBzYW1wbGVzCisgKi8KK3ZvaWQgZmZfbWRjdF9jYWxjX2MoRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpCit7CisgICAgaW50IGksIGosIG4sIG44LCBuNCwgbjIsIG4zOworICAgIEZGVERvdWJsZSByZSwgaW07CisgICAgY29uc3QgdWludDE2X3QgKnJldnRhYiA9IHMtPnJldnRhYjsKKyAgICBjb25zdCBGRlRTYW1wbGUgKnRjb3MgPSBzLT50Y29zOworICAgIGNvbnN0IEZGVFNhbXBsZSAqdHNpbiA9IHMtPnRzaW47CisgICAgRkZUQ29tcGxleCAqeCA9IChGRlRDb21wbGV4ICopb3V0OworCisgICAgbiA9IDEgPDwgcy0+bWRjdF9iaXRzOworICAgIG4yID0gbiA+PiAxOworICAgIG40ID0gbiA+PiAyOworICAgIG44ID0gbiA+PiAzOworICAgIG4zID0gMyAqIG40OworCisgICAgLyogcHJlIHJvdGF0aW9uICovCisgICAgZm9yKGk9MDtpPG44O2krKykgeworICAgICAgICByZSA9IFJTQ0FMRSgtaW5wdXRbMippK24zXSAtIGlucHV0W24zLTEtMippXSk7CisgICAgICAgIGltID0gUlNDQUxFKC1pbnB1dFtuNCsyKmldICsgaW5wdXRbbjQtMS0yKmldKTsKKyAgICAgICAgaiA9IHJldnRhYltpXTsKKyAgICAgICAgQ01VTCh4W2pdLnJlLCB4W2pdLmltLCByZSwgaW0sIC10Y29zW2ldLCB0c2luW2ldKTsKKworICAgICAgICByZSA9IFJTQ0FMRSggaW5wdXRbMippXSAgICAtIGlucHV0W24yLTEtMippXSk7CisgICAgICAgIGltID0gUlNDQUxFKC1pbnB1dFtuMisyKmldIC0gaW5wdXRbIG4tMS0yKmldKTsKKyAgICAgICAgaiA9IHJldnRhYltuOCArIGldOworICAgICAgICBDTVVMKHhbal0ucmUsIHhbal0uaW0sIHJlLCBpbSwgLXRjb3NbbjggKyBpXSwgdHNpbltuOCArIGldKTsKKyAgICB9CisKKyAgICBzLT5mZnRfY2FsYyhzLCB4KTsKKworICAgIC8qIHBvc3Qgcm90YXRpb24gKi8KKyAgICBmb3IoaT0wO2k8bjg7aSsrKSB7CisgICAgICAgIEZGVFNhbXBsZSByMCwgaTAsIHIxLCBpMTsKKyAgICAgICAgQ01VTChpMSwgcjAsIHhbbjgtaS0xXS5yZSwgeFtuOC1pLTFdLmltLCAtdHNpbltuOC1pLTFdLCAtdGNvc1tuOC1pLTFdKTsKKyAgICAgICAgQ01VTChpMCwgcjEsIHhbbjgraSAgXS5yZSwgeFtuOCtpICBdLmltLCAtdHNpbltuOCtpICBdLCAtdGNvc1tuOCtpICBdKTsKKyAgICAgICAgeFtuOC1pLTFdLnJlID0gcjA7CisgICAgICAgIHhbbjgtaS0xXS5pbSA9IGkwOworICAgICAgICB4W244K2kgIF0ucmUgPSByMTsKKyAgICAgICAgeFtuOCtpICBdLmltID0gaTE7CisgICAgfQorfQorCithdl9jb2xkIHZvaWQgZmZfbWRjdF9lbmQoRkZUQ29udGV4dCAqcykKK3sKKyAgICBhdl9mcmVlcCgmcy0+dGNvcyk7CisgICAgZmZfZmZ0X2VuZChzKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21kZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTFhZGFlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWRlYy5jCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogU29ueSBQbGF5U3RhdGlvbiBNREVDIChNb3Rpb24gREVDb2RlcikKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogYmFzZWQgdXBvbiBjb2RlIGZyb20gU2ViYXN0aWFuIEplZHJ1c3praWV3aWN6IDxlbGZAZnJvZ2dlci5ydWxlcy5wbD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU29ueSBQbGF5U3RhdGlvbiBNREVDIChNb3Rpb24gREVDb2RlcikKKyAqIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGludHJhLW9ubHkgTVBFRy0xLgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJic3dhcGRzcC5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJtcGVnMTIuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTURFQ0NvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBCbG9ja0RTUENvbnRleHQgYmRzcDsKKyAgICBCc3dhcERTUENvbnRleHQgYmJkc3A7CisgICAgSURDVERTUENvbnRleHQgaWRzcDsKKyAgICBUaHJlYWRGcmFtZSBmcmFtZTsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIFNjYW5UYWJsZSBzY2FudGFibGU7CisgICAgaW50IHZlcnNpb247CisgICAgaW50IHFzY2FsZTsKKyAgICBpbnQgbGFzdF9kY1szXTsKKyAgICBpbnQgbWJfd2lkdGg7CisgICAgaW50IG1iX2hlaWdodDsKKyAgICBpbnQgbWJfeCwgbWJfeTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrKVs2XVs2NF07CisgICAgdWludDhfdCAqYml0c3RyZWFtX2J1ZmZlcjsKKyAgICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX2J1ZmZlcl9zaXplOworICAgIGludCBibG9ja19sYXN0X2luZGV4WzZdOworfSBNREVDQ29udGV4dDsKKworLy92ZXJ5IHNpbWlsYXIgdG8gTVBFRy0xCitzdGF0aWMgaW5saW5lIGludCBtZGVjX2RlY29kZV9ibG9ja19pbnRyYShNREVDQ29udGV4dCAqYSwgaW50MTZfdCAqYmxvY2ssIGludCBuKQoreworICAgIGludCBsZXZlbCwgZGlmZiwgaSwgaiwgcnVuOworICAgIGludCBjb21wb25lbnQ7CisgICAgUkxUYWJsZSAqcmwgPSAmZmZfcmxfbXBlZzE7CisgICAgdWludDhfdCAqIGNvbnN0IHNjYW50YWJsZSA9IGEtPnNjYW50YWJsZS5wZXJtdXRhdGVkOworICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXggPSBmZl9tcGVnMV9kZWZhdWx0X2ludHJhX21hdHJpeDsKKyAgICBjb25zdCBpbnQgcXNjYWxlID0gYS0+cXNjYWxlOworCisgICAgLyogREMgY29lZmZpY2llbnQgKi8KKyAgICBpZiAoYS0+dmVyc2lvbiA9PSAyKSB7CisgICAgICAgIGJsb2NrWzBdID0gMiAqIGdldF9zYml0cygmYS0+Z2IsIDEwKSArIDEwMjQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29tcG9uZW50ID0gKG4gPD0gMyA/IDAgOiBuIC0gNCArIDEpOworICAgICAgICBkaWZmID0gZGVjb2RlX2RjKCZhLT5nYiwgY29tcG9uZW50KTsKKyAgICAgICAgaWYgKGRpZmYgPj0gMHhmZmZmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGEtPmxhc3RfZGNbY29tcG9uZW50XSArPSBkaWZmOworICAgICAgICBibG9ja1swXSA9IGEtPmxhc3RfZGNbY29tcG9uZW50XSA8PCAzOworICAgIH0KKworICAgIGkgPSAwOworICAgIHsKKyAgICAgICAgT1BFTl9SRUFERVIocmUsICZhLT5nYik7CisgICAgICAgIC8qIG5vdyBxdWFudGlmeSAmIGVuY29kZSBBQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmYS0+Z2IpOworICAgICAgICAgICAgR0VUX1JMX1ZMQyhsZXZlbCwgcnVuLCByZSwgJmEtPmdiLCBybC0+cmxfdmxjWzBdLCBURVhfVkxDX0JJVFMsIDIsIDApOworCisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMTI3KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsICE9IDApIHsKKyAgICAgICAgICAgICAgICBpICAgICs9IHJ1bjsKKyAgICAgICAgICAgICAgICBqICAgICA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gMzsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCBeIFNIT1dfU0JJVFMocmUsICZhLT5nYiwgMSkpIC0gU0hPV19TQklUUyhyZSwgJmEtPmdiLCAxKTsKKyAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJmEtPmdiLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZXNjYXBlICovCisgICAgICAgICAgICAgICAgcnVuID0gU0hPV19VQklUUyhyZSwgJmEtPmdiLCA2KSsxOyBMQVNUX1NLSVBfQklUUyhyZSwgJmEtPmdiLCA2KTsKKyAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZhLT5nYik7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1NCSVRTKHJlLCAmYS0+Z2IsIDEwKTsgU0tJUF9CSVRTKHJlLCAmYS0+Z2IsIDEwKTsKKyAgICAgICAgICAgICAgICBpICAgICs9IHJ1bjsKKyAgICAgICAgICAgICAgICBqICAgICA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gMzsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiAzOworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAtIDEpIHwgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA+IDYzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGEtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJhYy10ZXggZGFtYWdlZCBhdCAlZCAlZFxuIiwgYS0+bWJfeCwgYS0+bWJfeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJsb2NrW2pdID0gbGV2ZWw7CisgICAgICAgIH0KKyAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCAmYS0+Z2IpOworICAgIH0KKyAgICBhLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX21iKE1ERUNDb250ZXh0ICphLCBpbnQxNl90IGJsb2NrWzZdWzY0XSkKK3sKKyAgICBpbnQgaSwgcmV0OworICAgIHN0YXRpYyBjb25zdCBpbnQgYmxvY2tfaW5kZXhbNl0gPSB7IDUsIDQsIDAsIDEsIDIsIDMgfTsKKworICAgIGEtPmJkc3AuY2xlYXJfYmxvY2tzKGJsb2NrWzBdKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSBtZGVjX2RlY29kZV9ibG9ja19pbnRyYShhLCBibG9ja1tibG9ja19pbmRleFtpXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaW5kZXhbaV0pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmYS0+Z2IpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlkY3RfcHV0KE1ERUNDb250ZXh0ICphLCBBVkZyYW1lICpmcmFtZSwgaW50IG1iX3gsIGludCBtYl95KQoreworICAgIGludDE2X3QgKCpibG9jaylbNjRdID0gYS0+YmxvY2s7CisgICAgaW50IGxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplWzBdOworCisgICAgdWludDhfdCAqZGVzdF95ICA9IGZyYW1lLT5kYXRhWzBdICsgKG1iX3kgKiAxNiogbGluZXNpemUgICAgICAgICAgICAgICkgKyBtYl94ICogMTY7CisgICAgdWludDhfdCAqZGVzdF9jYiA9IGZyYW1lLT5kYXRhWzFdICsgKG1iX3kgKiA4ICogZnJhbWUtPmxpbmVzaXplWzFdKSArIG1iX3ggKiA4OworICAgIHVpbnQ4X3QgKmRlc3RfY3IgPSBmcmFtZS0+ZGF0YVsyXSArIChtYl95ICogOCAqIGZyYW1lLT5saW5lc2l6ZVsyXSkgKyBtYl94ICogODsKKworICAgIGEtPmlkc3AuaWRjdF9wdXQoZGVzdF95LCAgICAgICAgICAgICAgICAgICAgbGluZXNpemUsIGJsb2NrWzBdKTsKKyAgICBhLT5pZHNwLmlkY3RfcHV0KGRlc3RfeSArIDgsICAgICAgICAgICAgICAgIGxpbmVzaXplLCBibG9ja1sxXSk7CisgICAgYS0+aWRzcC5pZGN0X3B1dChkZXN0X3kgKyA4ICogbGluZXNpemUsICAgICBsaW5lc2l6ZSwgYmxvY2tbMl0pOworICAgIGEtPmlkc3AuaWRjdF9wdXQoZGVzdF95ICsgOCAqIGxpbmVzaXplICsgOCwgbGluZXNpemUsIGJsb2NrWzNdKTsKKworICAgIGlmICghKGEtPmF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgYS0+aWRzcC5pZGN0X3B1dChkZXN0X2NiLCBmcmFtZS0+bGluZXNpemVbMV0sIGJsb2NrWzRdKTsKKyAgICAgICAgYS0+aWRzcC5pZGN0X3B1dChkZXN0X2NyLCBmcmFtZS0+bGluZXNpemVbMl0sIGJsb2NrWzVdKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIE1ERUNDb250ZXh0ICogY29uc3QgYSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmICAgID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgVGhyZWFkRnJhbWUgZnJhbWUgICAgID0geyAuZiA9IGRhdGEgfTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJmZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGZyYW1lLmYtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGZyYW1lLmYtPmtleV9mcmFtZSA9IDE7CisKKyAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmEtPmJpdHN0cmVhbV9idWZmZXIsICZhLT5iaXRzdHJlYW1fYnVmZmVyX3NpemUsIGJ1Zl9zaXplKTsKKyAgICBpZiAoIWEtPmJpdHN0cmVhbV9idWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYS0+YmJkc3AuYnN3YXAxNl9idWYoKHVpbnQxNl90ICopYS0+Yml0c3RyZWFtX2J1ZmZlciwgKHVpbnQxNl90ICopYnVmLCAoYnVmX3NpemUgKyAxKSAvIDIpOworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmEtPmdiLCBhLT5iaXRzdHJlYW1fYnVmZmVyLCBidWZfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIHNraXAgb3ZlciA0IHByZWFtYmxlIGJ5dGVzIGluIHN0cmVhbSAodHlwaWNhbGx5IDB4WFggMHhYWCAweDAwIDB4MzgpICovCisgICAgc2tpcF9iaXRzKCZhLT5nYiwgMzIpOworCisgICAgYS0+cXNjYWxlICA9IGdldF9iaXRzKCZhLT5nYiwgMTYpOworICAgIGEtPnZlcnNpb24gPSBnZXRfYml0cygmYS0+Z2IsIDE2KTsKKworICAgIGEtPmxhc3RfZGNbMF0gPSBhLT5sYXN0X2RjWzFdID0gYS0+bGFzdF9kY1syXSA9IDEyODsKKworICAgIGZvciAoYS0+bWJfeCA9IDA7IGEtPm1iX3ggPCBhLT5tYl93aWR0aDsgYS0+bWJfeCsrKSB7CisgICAgICAgIGZvciAoYS0+bWJfeSA9IDA7IGEtPm1iX3kgPCBhLT5tYl9oZWlnaHQ7IGEtPm1iX3krKykgeworICAgICAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfbWIoYSwgYS0+YmxvY2spKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgaWRjdF9wdXQoYSwgZnJhbWUuZiwgYS0+bWJfeCwgYS0+bWJfeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiAoZ2V0X2JpdHNfY291bnQoJmEtPmdiKSArIDMxKSAvIDMyICogNDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNREVDQ29udGV4dCAqIGNvbnN0IGEgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYS0+bWJfd2lkdGggID0gKGF2Y3R4LT5jb2RlZF93aWR0aCAgKyAxNSkgLyAxNjsKKyAgICBhLT5tYl9oZWlnaHQgPSAoYXZjdHgtPmNvZGVkX2hlaWdodCArIDE1KSAvIDE2OworCisgICAgYS0+YXZjdHggICAgICAgICAgID0gYXZjdHg7CisKKyAgICBmZl9ibG9ja2RzcF9pbml0KCZhLT5iZHNwLCBhdmN0eCk7CisgICAgZmZfYnN3YXBkc3BfaW5pdCgmYS0+YmJkc3ApOworICAgIGZmX2lkY3Rkc3BfaW5pdCgmYS0+aWRzcCwgYXZjdHgpOworICAgIGZmX21wZWcxMl9pbml0X3ZsY3MoKTsKKyAgICBmZl9pbml0X3NjYW50YWJsZShhLT5pZHNwLmlkY3RfcGVybXV0YXRpb24sICZhLT5zY2FudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgZmZfemlnemFnX2RpcmVjdCk7CisKKyAgICBpZiAoYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX0FVVE8pCisgICAgICAgIGF2Y3R4LT5pZGN0X2FsZ28gPSBGRl9JRENUX1NJTVBMRTsKKyAgICBhdmN0eC0+cGl4X2ZtdCAgPSBBVl9QSVhfRk1UX1lVVko0MjBQOworICAgIGF2Y3R4LT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX0pQRUc7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0X3RocmVhZF9jb3B5KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNREVDQ29udGV4dCAqIGNvbnN0IGEgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYS0+YXZjdHggICAgICAgICAgID0gYXZjdHg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1ERUNDb250ZXh0ICogY29uc3QgYSA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmYS0+Yml0c3RyZWFtX2J1ZmZlcik7CisgICAgYS0+Yml0c3RyZWFtX2J1ZmZlcl9zaXplID0gMDsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX21kZWNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJtZGVjIiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTb255IFBsYXlTdGF0aW9uIE1ERUMgKE1vdGlvbiBERUNvZGVyKSIpLAorICAgIC50eXBlICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTURFQywKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihNREVDQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCisgICAgLmluaXRfdGhyZWFkX2NvcHkgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChkZWNvZGVfaW5pdF90aHJlYWRfY29weSkKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tZV9jbXAuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21lX2NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDE0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tZV9jbXAuYwpAQCAtMCwwICsxLDk5NCBAQAorLyoKKyAqIERTUCB1dGlscworICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImNvcHlfYmxvY2suaCIKKyNpbmNsdWRlICJzaW1wbGVfaWRjdC5oIgorI2luY2x1ZGUgIm1lX2NtcC5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCit1aW50MzJfdCBmZl9zcXVhcmVfdGFiWzUxMl0gPSB7IDAsIH07CisKK3N0YXRpYyBpbnQgc3NlNF9jKE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IHMgPSAwLCBpOworICAgIHVpbnQzMl90ICpzcSA9IGZmX3NxdWFyZV90YWIgKyAyNTY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIHMgICAgKz0gc3FbcGl4MVswXSAtIHBpeDJbMF1dOworICAgICAgICBzICAgICs9IHNxW3BpeDFbMV0gLSBwaXgyWzFdXTsKKyAgICAgICAgcyAgICArPSBzcVtwaXgxWzJdIC0gcGl4MlsyXV07CisgICAgICAgIHMgICAgKz0gc3FbcGl4MVszXSAtIHBpeDJbM11dOworICAgICAgICBwaXgxICs9IHN0cmlkZTsKKyAgICAgICAgcGl4MiArPSBzdHJpZGU7CisgICAgfQorICAgIHJldHVybiBzOworfQorCitzdGF0aWMgaW50IHNzZThfYyhNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQoreworICAgIGludCBzID0gMCwgaTsKKyAgICB1aW50MzJfdCAqc3EgPSBmZl9zcXVhcmVfdGFiICsgMjU2OworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBzICAgICs9IHNxW3BpeDFbMF0gLSBwaXgyWzBdXTsKKyAgICAgICAgcyAgICArPSBzcVtwaXgxWzFdIC0gcGl4MlsxXV07CisgICAgICAgIHMgICAgKz0gc3FbcGl4MVsyXSAtIHBpeDJbMl1dOworICAgICAgICBzICAgICs9IHNxW3BpeDFbM10gLSBwaXgyWzNdXTsKKyAgICAgICAgcyAgICArPSBzcVtwaXgxWzRdIC0gcGl4Mls0XV07CisgICAgICAgIHMgICAgKz0gc3FbcGl4MVs1XSAtIHBpeDJbNV1dOworICAgICAgICBzICAgICs9IHNxW3BpeDFbNl0gLSBwaXgyWzZdXTsKKyAgICAgICAgcyAgICArPSBzcVtwaXgxWzddIC0gcGl4Mls3XV07CisgICAgICAgIHBpeDEgKz0gc3RyaWRlOworICAgICAgICBwaXgyICs9IHN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbnQgc3NlMTZfYyhNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgcyA9IDAsIGk7CisgICAgdWludDMyX3QgKnNxID0gZmZfc3F1YXJlX3RhYiArIDI1NjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgcyArPSBzcVtwaXgxWzBdICAtIHBpeDJbMF1dOworICAgICAgICBzICs9IHNxW3BpeDFbMV0gIC0gcGl4MlsxXV07CisgICAgICAgIHMgKz0gc3FbcGl4MVsyXSAgLSBwaXgyWzJdXTsKKyAgICAgICAgcyArPSBzcVtwaXgxWzNdICAtIHBpeDJbM11dOworICAgICAgICBzICs9IHNxW3BpeDFbNF0gIC0gcGl4Mls0XV07CisgICAgICAgIHMgKz0gc3FbcGl4MVs1XSAgLSBwaXgyWzVdXTsKKyAgICAgICAgcyArPSBzcVtwaXgxWzZdICAtIHBpeDJbNl1dOworICAgICAgICBzICs9IHNxW3BpeDFbN10gIC0gcGl4Mls3XV07CisgICAgICAgIHMgKz0gc3FbcGl4MVs4XSAgLSBwaXgyWzhdXTsKKyAgICAgICAgcyArPSBzcVtwaXgxWzldICAtIHBpeDJbOV1dOworICAgICAgICBzICs9IHNxW3BpeDFbMTBdIC0gcGl4MlsxMF1dOworICAgICAgICBzICs9IHNxW3BpeDFbMTFdIC0gcGl4MlsxMV1dOworICAgICAgICBzICs9IHNxW3BpeDFbMTJdIC0gcGl4MlsxMl1dOworICAgICAgICBzICs9IHNxW3BpeDFbMTNdIC0gcGl4MlsxM11dOworICAgICAgICBzICs9IHNxW3BpeDFbMTRdIC0gcGl4MlsxNF1dOworICAgICAgICBzICs9IHNxW3BpeDFbMTVdIC0gcGl4MlsxNV1dOworCisgICAgICAgIHBpeDEgKz0gc3RyaWRlOworICAgICAgICBwaXgyICs9IHN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbnQgc3VtX2Fic19kY3RlbGVtX2MoaW50MTZfdCAqYmxvY2spCit7CisgICAgaW50IHN1bSA9IDAsIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgc3VtICs9IEZGQUJTKGJsb2NrW2ldKTsKKyAgICByZXR1cm4gc3VtOworfQorCisjZGVmaW5lIGF2ZzIoYSwgYikgKChhICsgYiArIDEpID4+IDEpCisjZGVmaW5lIGF2ZzQoYSwgYiwgYywgZCkgKChhICsgYiArIGMgKyBkICsgMikgPj4gMikKKworc3RhdGljIGlubGluZSBpbnQgcGl4X2FiczE2X2MoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgcyA9IDAsIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMF0gIC0gcGl4MlswXSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMV0gIC0gcGl4MlsxXSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMl0gIC0gcGl4MlsyXSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbM10gIC0gcGl4MlszXSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNF0gIC0gcGl4Mls0XSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNV0gIC0gcGl4Mls1XSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNl0gIC0gcGl4Mls2XSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbN10gIC0gcGl4Mls3XSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbOF0gIC0gcGl4Mls4XSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbOV0gIC0gcGl4Mls5XSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMTBdIC0gcGl4MlsxMF0pOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzExXSAtIHBpeDJbMTFdKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsxMl0gLSBwaXgyWzEyXSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMTNdIC0gcGl4MlsxM10pOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzE0XSAtIHBpeDJbMTRdKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsxNV0gLSBwaXgyWzE1XSk7CisgICAgICAgIHBpeDEgKz0gc3RyaWRlOworICAgICAgICBwaXgyICs9IHN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbnQgcGl4X2FiczE2X3gyX2MoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQoreworICAgIGludCBzID0gMCwgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVswXSAgLSBhdmcyKHBpeDJbMF0sICBwaXgyWzFdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMV0gIC0gYXZnMihwaXgyWzFdLCAgcGl4MlsyXSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzJdICAtIGF2ZzIocGl4MlsyXSwgIHBpeDJbM10pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVszXSAgLSBhdmcyKHBpeDJbM10sICBwaXgyWzRdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNF0gIC0gYXZnMihwaXgyWzRdLCAgcGl4Mls1XSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzVdICAtIGF2ZzIocGl4Mls1XSwgIHBpeDJbNl0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVs2XSAgLSBhdmcyKHBpeDJbNl0sICBwaXgyWzddKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbN10gIC0gYXZnMihwaXgyWzddLCAgcGl4Mls4XSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzhdICAtIGF2ZzIocGl4Mls4XSwgIHBpeDJbOV0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVs5XSAgLSBhdmcyKHBpeDJbOV0sICBwaXgyWzEwXSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzEwXSAtIGF2ZzIocGl4MlsxMF0sIHBpeDJbMTFdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMTFdIC0gYXZnMihwaXgyWzExXSwgcGl4MlsxMl0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsxMl0gLSBhdmcyKHBpeDJbMTJdLCBwaXgyWzEzXSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzEzXSAtIGF2ZzIocGl4MlsxM10sIHBpeDJbMTRdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMTRdIC0gYXZnMihwaXgyWzE0XSwgcGl4MlsxNV0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsxNV0gLSBhdmcyKHBpeDJbMTVdLCBwaXgyWzE2XSkpOworICAgICAgICBwaXgxICs9IHN0cmlkZTsKKyAgICAgICAgcGl4MiArPSBzdHJpZGU7CisgICAgfQorICAgIHJldHVybiBzOworfQorCitzdGF0aWMgaW50IHBpeF9hYnMxNl95Ml9jKE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgcyA9IDAsIGk7CisgICAgdWludDhfdCAqcGl4MyA9IHBpeDIgKyBzdHJpZGU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMF0gIC0gYXZnMihwaXgyWzBdLCAgcGl4M1swXSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzFdICAtIGF2ZzIocGl4MlsxXSwgIHBpeDNbMV0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsyXSAgLSBhdmcyKHBpeDJbMl0sICBwaXgzWzJdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbM10gIC0gYXZnMihwaXgyWzNdLCAgcGl4M1szXSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzRdICAtIGF2ZzIocGl4Mls0XSwgIHBpeDNbNF0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVs1XSAgLSBhdmcyKHBpeDJbNV0sICBwaXgzWzVdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNl0gIC0gYXZnMihwaXgyWzZdLCAgcGl4M1s2XSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzddICAtIGF2ZzIocGl4Mls3XSwgIHBpeDNbN10pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVs4XSAgLSBhdmcyKHBpeDJbOF0sICBwaXgzWzhdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbOV0gIC0gYXZnMihwaXgyWzldLCAgcGl4M1s5XSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzEwXSAtIGF2ZzIocGl4MlsxMF0sIHBpeDNbMTBdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMTFdIC0gYXZnMihwaXgyWzExXSwgcGl4M1sxMV0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsxMl0gLSBhdmcyKHBpeDJbMTJdLCBwaXgzWzEyXSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzEzXSAtIGF2ZzIocGl4MlsxM10sIHBpeDNbMTNdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMTRdIC0gYXZnMihwaXgyWzE0XSwgcGl4M1sxNF0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsxNV0gLSBhdmcyKHBpeDJbMTVdLCBwaXgzWzE1XSkpOworICAgICAgICBwaXgxICs9IHN0cmlkZTsKKyAgICAgICAgcGl4MiArPSBzdHJpZGU7CisgICAgICAgIHBpeDMgKz0gc3RyaWRlOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIGludCBwaXhfYWJzMTZfeHkyX2MoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgcyA9IDAsIGk7CisgICAgdWludDhfdCAqcGl4MyA9IHBpeDIgKyBzdHJpZGU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMF0gIC0gYXZnNChwaXgyWzBdLCAgcGl4MlsxXSwgIHBpeDNbMF0sICBwaXgzWzFdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMV0gIC0gYXZnNChwaXgyWzFdLCAgcGl4MlsyXSwgIHBpeDNbMV0sICBwaXgzWzJdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMl0gIC0gYXZnNChwaXgyWzJdLCAgcGl4MlszXSwgIHBpeDNbMl0sICBwaXgzWzNdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbM10gIC0gYXZnNChwaXgyWzNdLCAgcGl4Mls0XSwgIHBpeDNbM10sICBwaXgzWzRdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNF0gIC0gYXZnNChwaXgyWzRdLCAgcGl4Mls1XSwgIHBpeDNbNF0sICBwaXgzWzVdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNV0gIC0gYXZnNChwaXgyWzVdLCAgcGl4Mls2XSwgIHBpeDNbNV0sICBwaXgzWzZdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNl0gIC0gYXZnNChwaXgyWzZdLCAgcGl4Mls3XSwgIHBpeDNbNl0sICBwaXgzWzddKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbN10gIC0gYXZnNChwaXgyWzddLCAgcGl4Mls4XSwgIHBpeDNbN10sICBwaXgzWzhdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbOF0gIC0gYXZnNChwaXgyWzhdLCAgcGl4Mls5XSwgIHBpeDNbOF0sICBwaXgzWzldKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbOV0gIC0gYXZnNChwaXgyWzldLCAgcGl4MlsxMF0sIHBpeDNbOV0sICBwaXgzWzEwXSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzEwXSAtIGF2ZzQocGl4MlsxMF0sIHBpeDJbMTFdLCBwaXgzWzEwXSwgcGl4M1sxMV0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsxMV0gLSBhdmc0KHBpeDJbMTFdLCBwaXgyWzEyXSwgcGl4M1sxMV0sIHBpeDNbMTJdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMTJdIC0gYXZnNChwaXgyWzEyXSwgcGl4MlsxM10sIHBpeDNbMTJdLCBwaXgzWzEzXSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzEzXSAtIGF2ZzQocGl4MlsxM10sIHBpeDJbMTRdLCBwaXgzWzEzXSwgcGl4M1sxNF0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsxNF0gLSBhdmc0KHBpeDJbMTRdLCBwaXgyWzE1XSwgcGl4M1sxNF0sIHBpeDNbMTVdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMTVdIC0gYXZnNChwaXgyWzE1XSwgcGl4MlsxNl0sIHBpeDNbMTVdLCBwaXgzWzE2XSkpOworICAgICAgICBwaXgxICs9IHN0cmlkZTsKKyAgICAgICAgcGl4MiArPSBzdHJpZGU7CisgICAgICAgIHBpeDMgKz0gc3RyaWRlOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGl4X2FiczhfYyhNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IHMgPSAwLCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBzICAgICs9IGFicyhwaXgxWzBdIC0gcGl4MlswXSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMV0gLSBwaXgyWzFdKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsyXSAtIHBpeDJbMl0pOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzNdIC0gcGl4MlszXSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNF0gLSBwaXgyWzRdKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVs1XSAtIHBpeDJbNV0pOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzZdIC0gcGl4Mls2XSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbN10gLSBwaXgyWzddKTsKKyAgICAgICAgcGl4MSArPSBzdHJpZGU7CisgICAgICAgIHBpeDIgKz0gc3RyaWRlOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIGludCBwaXhfYWJzOF94Ml9jKE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQoreworICAgIGludCBzID0gMCwgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVswXSAtIGF2ZzIocGl4MlswXSwgcGl4MlsxXSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzFdIC0gYXZnMihwaXgyWzFdLCBwaXgyWzJdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMl0gLSBhdmcyKHBpeDJbMl0sIHBpeDJbM10pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVszXSAtIGF2ZzIocGl4MlszXSwgcGl4Mls0XSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzRdIC0gYXZnMihwaXgyWzRdLCBwaXgyWzVdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNV0gLSBhdmcyKHBpeDJbNV0sIHBpeDJbNl0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVs2XSAtIGF2ZzIocGl4Mls2XSwgcGl4Mls3XSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzddIC0gYXZnMihwaXgyWzddLCBwaXgyWzhdKSk7CisgICAgICAgIHBpeDEgKz0gc3RyaWRlOworICAgICAgICBwaXgyICs9IHN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbnQgcGl4X2FiczhfeTJfYyhNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgcyA9IDAsIGk7CisgICAgdWludDhfdCAqcGl4MyA9IHBpeDIgKyBzdHJpZGU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMF0gLSBhdmcyKHBpeDJbMF0sIHBpeDNbMF0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsxXSAtIGF2ZzIocGl4MlsxXSwgcGl4M1sxXSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzJdIC0gYXZnMihwaXgyWzJdLCBwaXgzWzJdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbM10gLSBhdmcyKHBpeDJbM10sIHBpeDNbM10pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVs0XSAtIGF2ZzIocGl4Mls0XSwgcGl4M1s0XSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzVdIC0gYXZnMihwaXgyWzVdLCBwaXgzWzVdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNl0gLSBhdmcyKHBpeDJbNl0sIHBpeDNbNl0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVs3XSAtIGF2ZzIocGl4Mls3XSwgcGl4M1s3XSkpOworICAgICAgICBwaXgxICs9IHN0cmlkZTsKKyAgICAgICAgcGl4MiArPSBzdHJpZGU7CisgICAgICAgIHBpeDMgKz0gc3RyaWRlOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIGludCBwaXhfYWJzOF94eTJfYyhNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IHMgPSAwLCBpOworICAgIHVpbnQ4X3QgKnBpeDMgPSBwaXgyICsgc3RyaWRlOworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBzICAgICs9IGFicyhwaXgxWzBdIC0gYXZnNChwaXgyWzBdLCBwaXgyWzFdLCBwaXgzWzBdLCBwaXgzWzFdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbMV0gLSBhdmc0KHBpeDJbMV0sIHBpeDJbMl0sIHBpeDNbMV0sIHBpeDNbMl0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVsyXSAtIGF2ZzQocGl4MlsyXSwgcGl4MlszXSwgcGl4M1syXSwgcGl4M1szXSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzNdIC0gYXZnNChwaXgyWzNdLCBwaXgyWzRdLCBwaXgzWzNdLCBwaXgzWzRdKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbNF0gLSBhdmc0KHBpeDJbNF0sIHBpeDJbNV0sIHBpeDNbNF0sIHBpeDNbNV0pKTsKKyAgICAgICAgcyAgICArPSBhYnMocGl4MVs1XSAtIGF2ZzQocGl4Mls1XSwgcGl4Mls2XSwgcGl4M1s1XSwgcGl4M1s2XSkpOworICAgICAgICBzICAgICs9IGFicyhwaXgxWzZdIC0gYXZnNChwaXgyWzZdLCBwaXgyWzddLCBwaXgzWzZdLCBwaXgzWzddKSk7CisgICAgICAgIHMgICAgKz0gYWJzKHBpeDFbN10gLSBhdmc0KHBpeDJbN10sIHBpeDJbOF0sIHBpeDNbN10sIHBpeDNbOF0pKTsKKyAgICAgICAgcGl4MSArPSBzdHJpZGU7CisgICAgICAgIHBpeDIgKz0gc3RyaWRlOworICAgICAgICBwaXgzICs9IHN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbnQgbnNzZTE2X2MoTXBlZ0VuY0NvbnRleHQgKmMsIHVpbnQ4X3QgKnMxLCB1aW50OF90ICpzMiwKKyAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IHNjb3JlMSA9IDAsIHNjb3JlMiA9IDAsIHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgc2NvcmUxICs9IChzMVt4XSAtIHMyW3hdKSAqIChzMVt4XSAtIHMyW3hdKTsKKyAgICAgICAgaWYgKHkgKyAxIDwgaCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDE1OyB4KyspCisgICAgICAgICAgICAgICAgc2NvcmUyICs9IEZGQUJTKHMxW3hdICAgICAtIHMxW3ggKyBzdHJpZGVdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczFbeCArIDFdICsgczFbeCArIHN0cmlkZSArIDFdKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZGQUJTKHMyW3hdICAgICAtIHMyW3ggKyBzdHJpZGVdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczJbeCArIDFdICsgczJbeCArIHN0cmlkZSArIDFdKTsKKyAgICAgICAgfQorICAgICAgICBzMSArPSBzdHJpZGU7CisgICAgICAgIHMyICs9IHN0cmlkZTsKKyAgICB9CisKKyAgICBpZiAoYykKKyAgICAgICAgcmV0dXJuIHNjb3JlMSArIEZGQUJTKHNjb3JlMikgKiBjLT5hdmN0eC0+bnNzZV93ZWlnaHQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gc2NvcmUxICsgRkZBQlMoc2NvcmUyKSAqIDg7Cit9CisKK3N0YXRpYyBpbnQgbnNzZThfYyhNcGVnRW5jQ29udGV4dCAqYywgdWludDhfdCAqczEsIHVpbnQ4X3QgKnMyLAorICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQoreworICAgIGludCBzY29yZTEgPSAwLCBzY29yZTIgPSAwLCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgc2NvcmUxICs9IChzMVt4XSAtIHMyW3hdKSAqIChzMVt4XSAtIHMyW3hdKTsKKyAgICAgICAgaWYgKHkgKyAxIDwgaCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDc7IHgrKykKKyAgICAgICAgICAgICAgICBzY29yZTIgKz0gRkZBQlMoczFbeF0gICAgIC0gczFbeCArIHN0cmlkZV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMVt4ICsgMV0gKyBzMVt4ICsgc3RyaWRlICsgMV0pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRkZBQlMoczJbeF0gICAgIC0gczJbeCArIHN0cmlkZV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMlt4ICsgMV0gKyBzMlt4ICsgc3RyaWRlICsgMV0pOworICAgICAgICB9CisgICAgICAgIHMxICs9IHN0cmlkZTsKKyAgICAgICAgczIgKz0gc3RyaWRlOworICAgIH0KKworICAgIGlmIChjKQorICAgICAgICByZXR1cm4gc2NvcmUxICsgRkZBQlMoc2NvcmUyKSAqIGMtPmF2Y3R4LT5uc3NlX3dlaWdodDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBzY29yZTEgKyBGRkFCUyhzY29yZTIpICogODsKK30KKworc3RhdGljIGludCB6ZXJvX2NtcChNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqYSwgdWludDhfdCAqYiwKKyAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfc2V0X2NtcChNRUNtcENvbnRleHQgKmMsIG1lX2NtcF9mdW5jICpjbXAsIGludCB0eXBlKQoreworICAgIGludCBpOworCisgICAgbWVtc2V0KGNtcCwgMCwgc2l6ZW9mKHZvaWQgKikgKiA2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgc3dpdGNoICh0eXBlICYgMHhGRikgeworICAgICAgICBjYXNlIEZGX0NNUF9TQUQ6CisgICAgICAgICAgICBjbXBbaV0gPSBjLT5zYWRbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9DTVBfU0FURDoKKyAgICAgICAgICAgIGNtcFtpXSA9IGMtPmhhZGFtYXJkOF9kaWZmW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkZfQ01QX1NTRToKKyAgICAgICAgICAgIGNtcFtpXSA9IGMtPnNzZVtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX0NNUF9EQ1Q6CisgICAgICAgICAgICBjbXBbaV0gPSBjLT5kY3Rfc2FkW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkZfQ01QX0RDVDI2NDoKKyAgICAgICAgICAgIGNtcFtpXSA9IGMtPmRjdDI2NF9zYWRbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9DTVBfRENUTUFYOgorICAgICAgICAgICAgY21wW2ldID0gYy0+ZGN0X21heFtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX0NNUF9QU05SOgorICAgICAgICAgICAgY21wW2ldID0gYy0+cXVhbnRfcHNucltpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX0NNUF9CSVQ6CisgICAgICAgICAgICBjbXBbaV0gPSBjLT5iaXRbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9DTVBfUkQ6CisgICAgICAgICAgICBjbXBbaV0gPSBjLT5yZFtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX0NNUF9WU0FEOgorICAgICAgICAgICAgY21wW2ldID0gYy0+dnNhZFtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX0NNUF9WU1NFOgorICAgICAgICAgICAgY21wW2ldID0gYy0+dnNzZVtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX0NNUF9aRVJPOgorICAgICAgICAgICAgY21wW2ldID0gemVyb19jbXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9DTVBfTlNTRToKKyAgICAgICAgICAgIGNtcFtpXSA9IGMtPm5zc2VbaV07CisgICAgICAgICAgICBicmVhazsKKyNpZiBDT05GSUdfRFdUCisgICAgICAgIGNhc2UgRkZfQ01QX1c1MzoKKyAgICAgICAgICAgIGNtcFtpXT0gYy0+dzUzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkZfQ01QX1c5NzoKKyAgICAgICAgICAgIGNtcFtpXT0gYy0+dzk3W2ldOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImludGVybmFsIGVycm9yIGluIGNtcCBmdW5jdGlvbiBzZWxlY3Rpb25cbiIpOworICAgICAgICB9CisgICAgfQorfQorCisjZGVmaW5lIEJVVFRFUkZMWTIobzEsIG8yLCBpMSwgaTIpICAgICAgICAgICAgICBcCisgICAgbzEgPSAoaTEpICsgKGkyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbzIgPSAoaTEpIC0gKGkyKTsKKworI2RlZmluZSBCVVRURVJGTFkxKHgsIHkpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgYSwgYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhID0geDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiID0geTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB4ID0gYSArIGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB5ID0gYSAtIGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBCVVRURVJGTFlBKHgsIHkpIChGRkFCUygoeCkgKyAoeSkpICsgRkZBQlMoKHgpIC0gKHkpKSkKKworc3RhdGljIGludCBoYWRhbWFyZDhfZGlmZjh4OF9jKE1wZWdFbmNDb250ZXh0ICpzLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgaSwgdGVtcFs2NF0sIHN1bSA9IDA7CisKKyAgICBhdl9hc3NlcnQyKGggPT0gOCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIC8vIEZJWE1FOiB0cnkgcG9pbnRlciB3YWxrcworICAgICAgICBCVVRURVJGTFkyKHRlbXBbOCAqIGkgKyAwXSwgdGVtcFs4ICogaSArIDFdLAorICAgICAgICAgICAgICAgICAgIHNyY1tzdHJpZGUgKiBpICsgMF0gLSBkc3Rbc3RyaWRlICogaSArIDBdLAorICAgICAgICAgICAgICAgICAgIHNyY1tzdHJpZGUgKiBpICsgMV0gLSBkc3Rbc3RyaWRlICogaSArIDFdKTsKKyAgICAgICAgQlVUVEVSRkxZMih0ZW1wWzggKiBpICsgMl0sIHRlbXBbOCAqIGkgKyAzXSwKKyAgICAgICAgICAgICAgICAgICBzcmNbc3RyaWRlICogaSArIDJdIC0gZHN0W3N0cmlkZSAqIGkgKyAyXSwKKyAgICAgICAgICAgICAgICAgICBzcmNbc3RyaWRlICogaSArIDNdIC0gZHN0W3N0cmlkZSAqIGkgKyAzXSk7CisgICAgICAgIEJVVFRFUkZMWTIodGVtcFs4ICogaSArIDRdLCB0ZW1wWzggKiBpICsgNV0sCisgICAgICAgICAgICAgICAgICAgc3JjW3N0cmlkZSAqIGkgKyA0XSAtIGRzdFtzdHJpZGUgKiBpICsgNF0sCisgICAgICAgICAgICAgICAgICAgc3JjW3N0cmlkZSAqIGkgKyA1XSAtIGRzdFtzdHJpZGUgKiBpICsgNV0pOworICAgICAgICBCVVRURVJGTFkyKHRlbXBbOCAqIGkgKyA2XSwgdGVtcFs4ICogaSArIDddLAorICAgICAgICAgICAgICAgICAgIHNyY1tzdHJpZGUgKiBpICsgNl0gLSBkc3Rbc3RyaWRlICogaSArIDZdLAorICAgICAgICAgICAgICAgICAgIHNyY1tzdHJpZGUgKiBpICsgN10gLSBkc3Rbc3RyaWRlICogaSArIDddKTsKKworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIGkgKyAwXSwgdGVtcFs4ICogaSArIDJdKTsKKyAgICAgICAgQlVUVEVSRkxZMSh0ZW1wWzggKiBpICsgMV0sIHRlbXBbOCAqIGkgKyAzXSk7CisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogaSArIDRdLCB0ZW1wWzggKiBpICsgNl0pOworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIGkgKyA1XSwgdGVtcFs4ICogaSArIDddKTsKKworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIGkgKyAwXSwgdGVtcFs4ICogaSArIDRdKTsKKyAgICAgICAgQlVUVEVSRkxZMSh0ZW1wWzggKiBpICsgMV0sIHRlbXBbOCAqIGkgKyA1XSk7CisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogaSArIDJdLCB0ZW1wWzggKiBpICsgNl0pOworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIGkgKyAzXSwgdGVtcFs4ICogaSArIDddKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogMCArIGldLCB0ZW1wWzggKiAxICsgaV0pOworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIDIgKyBpXSwgdGVtcFs4ICogMyArIGldKTsKKyAgICAgICAgQlVUVEVSRkxZMSh0ZW1wWzggKiA0ICsgaV0sIHRlbXBbOCAqIDUgKyBpXSk7CisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogNiArIGldLCB0ZW1wWzggKiA3ICsgaV0pOworCisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogMCArIGldLCB0ZW1wWzggKiAyICsgaV0pOworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIDEgKyBpXSwgdGVtcFs4ICogMyArIGldKTsKKyAgICAgICAgQlVUVEVSRkxZMSh0ZW1wWzggKiA0ICsgaV0sIHRlbXBbOCAqIDYgKyBpXSk7CisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogNSArIGldLCB0ZW1wWzggKiA3ICsgaV0pOworCisgICAgICAgIHN1bSArPSBCVVRURVJGTFlBKHRlbXBbOCAqIDAgKyBpXSwgdGVtcFs4ICogNCArIGldKSArCisgICAgICAgICAgICAgICBCVVRURVJGTFlBKHRlbXBbOCAqIDEgKyBpXSwgdGVtcFs4ICogNSArIGldKSArCisgICAgICAgICAgICAgICBCVVRURVJGTFlBKHRlbXBbOCAqIDIgKyBpXSwgdGVtcFs4ICogNiArIGldKSArCisgICAgICAgICAgICAgICBCVVRURVJGTFlBKHRlbXBbOCAqIDMgKyBpXSwgdGVtcFs4ICogNyArIGldKTsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKK30KKworc3RhdGljIGludCBoYWRhbWFyZDhfaW50cmE4eDhfYyhNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkdW1teSwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IGksIHRlbXBbNjRdLCBzdW0gPSAwOworCisgICAgYXZfYXNzZXJ0MihoID09IDgpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAvLyBGSVhNRTogdHJ5IHBvaW50ZXIgd2Fsa3MKKyAgICAgICAgQlVUVEVSRkxZMih0ZW1wWzggKiBpICsgMF0sIHRlbXBbOCAqIGkgKyAxXSwKKyAgICAgICAgICAgICAgICAgICBzcmNbc3RyaWRlICogaSArIDBdLCBzcmNbc3RyaWRlICogaSArIDFdKTsKKyAgICAgICAgQlVUVEVSRkxZMih0ZW1wWzggKiBpICsgMl0sIHRlbXBbOCAqIGkgKyAzXSwKKyAgICAgICAgICAgICAgICAgICBzcmNbc3RyaWRlICogaSArIDJdLCBzcmNbc3RyaWRlICogaSArIDNdKTsKKyAgICAgICAgQlVUVEVSRkxZMih0ZW1wWzggKiBpICsgNF0sIHRlbXBbOCAqIGkgKyA1XSwKKyAgICAgICAgICAgICAgICAgICBzcmNbc3RyaWRlICogaSArIDRdLCBzcmNbc3RyaWRlICogaSArIDVdKTsKKyAgICAgICAgQlVUVEVSRkxZMih0ZW1wWzggKiBpICsgNl0sIHRlbXBbOCAqIGkgKyA3XSwKKyAgICAgICAgICAgICAgICAgICBzcmNbc3RyaWRlICogaSArIDZdLCBzcmNbc3RyaWRlICogaSArIDddKTsKKworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIGkgKyAwXSwgdGVtcFs4ICogaSArIDJdKTsKKyAgICAgICAgQlVUVEVSRkxZMSh0ZW1wWzggKiBpICsgMV0sIHRlbXBbOCAqIGkgKyAzXSk7CisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogaSArIDRdLCB0ZW1wWzggKiBpICsgNl0pOworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIGkgKyA1XSwgdGVtcFs4ICogaSArIDddKTsKKworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIGkgKyAwXSwgdGVtcFs4ICogaSArIDRdKTsKKyAgICAgICAgQlVUVEVSRkxZMSh0ZW1wWzggKiBpICsgMV0sIHRlbXBbOCAqIGkgKyA1XSk7CisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogaSArIDJdLCB0ZW1wWzggKiBpICsgNl0pOworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIGkgKyAzXSwgdGVtcFs4ICogaSArIDddKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogMCArIGldLCB0ZW1wWzggKiAxICsgaV0pOworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIDIgKyBpXSwgdGVtcFs4ICogMyArIGldKTsKKyAgICAgICAgQlVUVEVSRkxZMSh0ZW1wWzggKiA0ICsgaV0sIHRlbXBbOCAqIDUgKyBpXSk7CisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogNiArIGldLCB0ZW1wWzggKiA3ICsgaV0pOworCisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogMCArIGldLCB0ZW1wWzggKiAyICsgaV0pOworICAgICAgICBCVVRURVJGTFkxKHRlbXBbOCAqIDEgKyBpXSwgdGVtcFs4ICogMyArIGldKTsKKyAgICAgICAgQlVUVEVSRkxZMSh0ZW1wWzggKiA0ICsgaV0sIHRlbXBbOCAqIDYgKyBpXSk7CisgICAgICAgIEJVVFRFUkZMWTEodGVtcFs4ICogNSArIGldLCB0ZW1wWzggKiA3ICsgaV0pOworCisgICAgICAgIHN1bSArPQorICAgICAgICAgICAgQlVUVEVSRkxZQSh0ZW1wWzggKiAwICsgaV0sIHRlbXBbOCAqIDQgKyBpXSkKKyAgICAgICAgICAgICsgQlVUVEVSRkxZQSh0ZW1wWzggKiAxICsgaV0sIHRlbXBbOCAqIDUgKyBpXSkKKyAgICAgICAgICAgICsgQlVUVEVSRkxZQSh0ZW1wWzggKiAyICsgaV0sIHRlbXBbOCAqIDYgKyBpXSkKKyAgICAgICAgICAgICsgQlVUVEVSRkxZQSh0ZW1wWzggKiAzICsgaV0sIHRlbXBbOCAqIDcgKyBpXSk7CisgICAgfQorCisgICAgc3VtIC09IEZGQUJTKHRlbXBbOCAqIDBdICsgdGVtcFs4ICogNF0pOyAvLyAtbWVhbgorCisgICAgcmV0dXJuIHN1bTsKK30KKworc3RhdGljIGludCBkY3Rfc2FkOHg4X2MoTXBlZ0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIHRlbXAsIFs2NF0pOworCisgICAgYXZfYXNzZXJ0MihoID09IDgpOworCisgICAgcy0+cGRzcC5kaWZmX3BpeGVscyh0ZW1wLCBzcmMxLCBzcmMyLCBzdHJpZGUpOworICAgIHMtPmZkc3AuZmRjdCh0ZW1wKTsKKyAgICByZXR1cm4gcy0+bWVjYy5zdW1fYWJzX2RjdGVsZW0odGVtcCk7Cit9CisKKyNpZiBDT05GSUdfR1BMCisjZGVmaW5lIERDVDhfMUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgczA3ID0gU1JDKDApICsgU1JDKDcpOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzMTYgPSBTUkMoMSkgKyBTUkMoNik7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHMyNSA9IFNSQygyKSArIFNSQyg1KTsgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgczM0ID0gU1JDKDMpICsgU1JDKDQpOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBhMCAgPSBzMDcgKyBzMzQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IGExICA9IHMxNiArIHMyNTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgYTIgID0gczA3IC0gczM0OyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBhMyAgPSBzMTYgLSBzMjU7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IGQwNyA9IFNSQygwKSAtIFNSQyg3KTsgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgZDE2ID0gU1JDKDEpIC0gU1JDKDYpOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBkMjUgPSBTUkMoMikgLSBTUkMoNSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IGQzNCA9IFNSQygzKSAtIFNSQyg0KTsgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgYTQgID0gZDE2ICsgZDI1ICsgKGQwNyArIChkMDcgPj4gMSkpOyBcCisgICAgICAgIGNvbnN0IGludCBhNSAgPSBkMDcgLSBkMzQgLSAoZDI1ICsgKGQyNSA+PiAxKSk7IFwKKyAgICAgICAgY29uc3QgaW50IGE2ICA9IGQwNyArIGQzNCAtIChkMTYgKyAoZDE2ID4+IDEpKTsgXAorICAgICAgICBjb25zdCBpbnQgYTcgID0gZDE2IC0gZDI1ICsgKGQzNCArIChkMzQgPj4gMSkpOyBcCisgICAgICAgIERTVCgwLCBhMCArIGExKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRFNUKDEsIGE0ICsgKGE3ID4+IDIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBEU1QoMiwgYTIgKyAoYTMgPj4gMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERTVCgzLCBhNSArIChhNiA+PiAyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRFNUKDQsIGEwIC0gYTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBEU1QoNSwgYTYgLSAoYTUgPj4gMikpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERTVCg2LCAoYTIgPj4gMSkgLSBhMyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRFNUKDcsIChhNCA+PiAyKSAtIGE3KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworc3RhdGljIGludCBkY3QyNjRfc2FkOHg4X2MoTXBlZ0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQxNl90IGRjdFs4XVs4XTsKKyAgICBpbnQgaSwgc3VtID0gMDsKKworICAgIHMtPnBkc3AuZGlmZl9waXhlbHMoZGN0WzBdLCBzcmMxLCBzcmMyLCBzdHJpZGUpOworCisjZGVmaW5lIFNSQyh4KSBkY3RbaV1beF0KKyNkZWZpbmUgRFNUKHgsIHYpIGRjdFtpXVt4XSA9IHYKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBEQ1Q4XzFECisjdW5kZWYgU1JDCisjdW5kZWYgRFNUCisKKyNkZWZpbmUgU1JDKHgpIGRjdFt4XVtpXQorI2RlZmluZSBEU1QoeCwgdikgc3VtICs9IEZGQUJTKHYpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBEQ1Q4XzFECisjdW5kZWYgU1JDCisjdW5kZWYgRFNUCisgICAgICAgICAgICByZXR1cm4gc3VtOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZGN0X21heDh4OF9jKE1wZWdFbmNDb250ZXh0ICpzLCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjMiwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCB0ZW1wLCBbNjRdKTsKKyAgICBpbnQgc3VtID0gMCwgaTsKKworICAgIGF2X2Fzc2VydDIoaCA9PSA4KTsKKworICAgIHMtPnBkc3AuZGlmZl9waXhlbHModGVtcCwgc3JjMSwgc3JjMiwgc3RyaWRlKTsKKyAgICBzLT5mZHNwLmZkY3QodGVtcCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgc3VtID0gRkZNQVgoc3VtLCBGRkFCUyh0ZW1wW2ldKSk7CisKKyAgICByZXR1cm4gc3VtOworfQorCitzdGF0aWMgaW50IHF1YW50X3BzbnI4eDhfYyhNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQoreworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgdGVtcCwgWzY0ICogMl0pOworICAgIGludDE2X3QgKmNvbnN0IGJhayA9IHRlbXAgKyA2NDsKKyAgICBpbnQgc3VtID0gMCwgaTsKKworICAgIGF2X2Fzc2VydDIoaCA9PSA4KTsKKyAgICBzLT5tYl9pbnRyYSA9IDA7CisKKyAgICBzLT5wZHNwLmRpZmZfcGl4ZWxzKHRlbXAsIHNyYzEsIHNyYzIsIHN0cmlkZSk7CisKKyAgICBtZW1jcHkoYmFrLCB0ZW1wLCA2NCAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICBzLT5ibG9ja19sYXN0X2luZGV4WzAgLyogRklYTUUgKi9dID0KKyAgICAgICAgcy0+ZmFzdF9kY3RfcXVhbnRpemUocywgdGVtcCwgMCAvKiBGSVhNRSAqLywgcy0+cXNjYWxlLCAmaSk7CisgICAgcy0+ZGN0X3VucXVhbnRpemVfaW50ZXIocywgdGVtcCwgMCwgcy0+cXNjYWxlKTsKKyAgICBmZl9zaW1wbGVfaWRjdF84KHRlbXApOyAvLyBGSVhNRQorCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgIHN1bSArPSAodGVtcFtpXSAtIGJha1tpXSkgKiAodGVtcFtpXSAtIGJha1tpXSk7CisKKyAgICByZXR1cm4gc3VtOworfQorCitzdGF0aWMgaW50IHJkOHg4X2MoTXBlZ0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKnNyYzEsIHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgY29uc3QgdWludDhfdCAqc2NhbnRhYmxlID0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCB0ZW1wLCBbNjRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGxzcmMxLCBbNjRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGxzcmMyLCBbNjRdKTsKKyAgICBpbnQgaSwgbGFzdCwgcnVuLCBiaXRzLCBsZXZlbCwgZGlzdG9ydGlvbiwgc3RhcnRfaTsKKyAgICBjb25zdCBpbnQgZXNjX2xlbmd0aCA9IHMtPmFjX2VzY19sZW5ndGg7CisgICAgdWludDhfdCAqbGVuZ3RoLCAqbGFzdF9sZW5ndGg7CisKKyAgICBhdl9hc3NlcnQyKGggPT0gOCk7CisKKyAgICBjb3B5X2Jsb2NrOChsc3JjMSwgc3JjMSwgOCwgc3RyaWRlLCA4KTsKKyAgICBjb3B5X2Jsb2NrOChsc3JjMiwgc3JjMiwgOCwgc3RyaWRlLCA4KTsKKworICAgIHMtPnBkc3AuZGlmZl9waXhlbHModGVtcCwgbHNyYzEsIGxzcmMyLCA4KTsKKworICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbMCAvKiBGSVhNRSAqL10gPQorICAgIGxhc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPQorICAgICAgICBzLT5mYXN0X2RjdF9xdWFudGl6ZShzLCB0ZW1wLCAwIC8qIEZJWE1FICovLCBzLT5xc2NhbGUsICZpKTsKKworICAgIGJpdHMgPSAwOworCisgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgIHN0YXJ0X2kgICAgID0gMTsKKyAgICAgICAgbGVuZ3RoICAgICAgPSBzLT5pbnRyYV9hY192bGNfbGVuZ3RoOworICAgICAgICBsYXN0X2xlbmd0aCA9IHMtPmludHJhX2FjX3ZsY19sYXN0X2xlbmd0aDsKKyAgICAgICAgYml0cyAgICAgICArPSBzLT5sdW1hX2RjX3ZsY19sZW5ndGhbdGVtcFswXSArIDI1Nl07IC8vIEZJWE1FOiBjaHJvbWEKKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydF9pICAgICA9IDA7CisgICAgICAgIGxlbmd0aCAgICAgID0gcy0+aW50ZXJfYWNfdmxjX2xlbmd0aDsKKyAgICAgICAgbGFzdF9sZW5ndGggPSBzLT5pbnRlcl9hY192bGNfbGFzdF9sZW5ndGg7CisgICAgfQorCisgICAgaWYgKGxhc3QgPj0gc3RhcnRfaSkgeworICAgICAgICBydW4gPSAwOworICAgICAgICBmb3IgKGkgPSBzdGFydF9pOyBpIDwgbGFzdDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgIGxldmVsID0gdGVtcFtqXTsKKworICAgICAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgKz0gNjQ7CisgICAgICAgICAgICAgICAgaWYgKChsZXZlbCAmICh+MTI3KSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYml0cyArPSBsZW5ndGhbVU5JX0FDX0VOQ19JTkRFWChydW4sIGxldmVsKV07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBiaXRzICs9IGVzY19sZW5ndGg7CisgICAgICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJ1bisrOworICAgICAgICB9CisgICAgICAgIGkgPSBzY2FudGFibGVbbGFzdF07CisKKyAgICAgICAgbGV2ZWwgPSB0ZW1wW2ldICsgNjQ7CisKKyAgICAgICAgYXZfYXNzZXJ0MihsZXZlbCAtIDY0KTsKKworICAgICAgICBpZiAoKGxldmVsICYgKH4xMjcpKSA9PSAwKSB7CisgICAgICAgICAgICBiaXRzICs9IGxhc3RfbGVuZ3RoW1VOSV9BQ19FTkNfSU5ERVgocnVuLCBsZXZlbCldOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJpdHMgKz0gZXNjX2xlbmd0aDsKKyAgICB9CisKKyAgICBpZiAobGFzdCA+PSAwKSB7CisgICAgICAgIGlmIChzLT5tYl9pbnRyYSkKKyAgICAgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2ludHJhKHMsIHRlbXAsIDAsIHMtPnFzY2FsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2ludGVyKHMsIHRlbXAsIDAsIHMtPnFzY2FsZSk7CisgICAgfQorCisgICAgcy0+aWRzcC5pZGN0X2FkZChsc3JjMiwgOCwgdGVtcCk7CisKKyAgICBkaXN0b3J0aW9uID0gcy0+bWVjYy5zc2VbMV0oTlVMTCwgbHNyYzIsIGxzcmMxLCA4LCA4KTsKKworICAgIHJldHVybiBkaXN0b3J0aW9uICsgKChiaXRzICogcy0+cXNjYWxlICogcy0+cXNjYWxlICogMTA5ICsgNjQpID4+IDcpOworfQorCitzdGF0aWMgaW50IGJpdDh4OF9jKE1wZWdFbmNDb250ZXh0ICpzLCB1aW50OF90ICpzcmMxLCB1aW50OF90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGUgPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZDsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIHRlbXAsIFs2NF0pOworICAgIGludCBpLCBsYXN0LCBydW4sIGJpdHMsIGxldmVsLCBzdGFydF9pOworICAgIGNvbnN0IGludCBlc2NfbGVuZ3RoID0gcy0+YWNfZXNjX2xlbmd0aDsKKyAgICB1aW50OF90ICpsZW5ndGgsICpsYXN0X2xlbmd0aDsKKworICAgIGF2X2Fzc2VydDIoaCA9PSA4KTsKKworICAgIHMtPnBkc3AuZGlmZl9waXhlbHModGVtcCwgc3JjMSwgc3JjMiwgc3RyaWRlKTsKKworICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbMCAvKiBGSVhNRSAqL10gPQorICAgIGxhc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPQorICAgICAgICBzLT5mYXN0X2RjdF9xdWFudGl6ZShzLCB0ZW1wLCAwIC8qIEZJWE1FICovLCBzLT5xc2NhbGUsICZpKTsKKworICAgIGJpdHMgPSAwOworCisgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgIHN0YXJ0X2kgICAgID0gMTsKKyAgICAgICAgbGVuZ3RoICAgICAgPSBzLT5pbnRyYV9hY192bGNfbGVuZ3RoOworICAgICAgICBsYXN0X2xlbmd0aCA9IHMtPmludHJhX2FjX3ZsY19sYXN0X2xlbmd0aDsKKyAgICAgICAgYml0cyAgICAgICArPSBzLT5sdW1hX2RjX3ZsY19sZW5ndGhbdGVtcFswXSArIDI1Nl07IC8vIEZJWE1FOiBjaHJvbWEKKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydF9pICAgICA9IDA7CisgICAgICAgIGxlbmd0aCAgICAgID0gcy0+aW50ZXJfYWNfdmxjX2xlbmd0aDsKKyAgICAgICAgbGFzdF9sZW5ndGggPSBzLT5pbnRlcl9hY192bGNfbGFzdF9sZW5ndGg7CisgICAgfQorCisgICAgaWYgKGxhc3QgPj0gc3RhcnRfaSkgeworICAgICAgICBydW4gPSAwOworICAgICAgICBmb3IgKGkgPSBzdGFydF9pOyBpIDwgbGFzdDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgIGxldmVsID0gdGVtcFtqXTsKKworICAgICAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgKz0gNjQ7CisgICAgICAgICAgICAgICAgaWYgKChsZXZlbCAmICh+MTI3KSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYml0cyArPSBsZW5ndGhbVU5JX0FDX0VOQ19JTkRFWChydW4sIGxldmVsKV07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBiaXRzICs9IGVzY19sZW5ndGg7CisgICAgICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJ1bisrOworICAgICAgICB9CisgICAgICAgIGkgPSBzY2FudGFibGVbbGFzdF07CisKKyAgICAgICAgbGV2ZWwgPSB0ZW1wW2ldICsgNjQ7CisKKyAgICAgICAgYXZfYXNzZXJ0MihsZXZlbCAtIDY0KTsKKworICAgICAgICBpZiAoKGxldmVsICYgKH4xMjcpKSA9PSAwKQorICAgICAgICAgICAgYml0cyArPSBsYXN0X2xlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1biwgbGV2ZWwpXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYml0cyArPSBlc2NfbGVuZ3RoOworICAgIH0KKworICAgIHJldHVybiBiaXRzOworfQorCisjZGVmaW5lIFZTQURfSU5UUkEoc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IHZzYWRfaW50cmEgIyMgc2l6ZSAjIyBfYyhNcGVnRW5jQ29udGV4dCAqYywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzLCB1aW50OF90ICpkdW1teSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHNjb3JlID0gMCwgeCwgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh5ID0gMTsgeSA8IGg7IHkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyB4ICs9IDQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzY29yZSArPSBGRkFCUyhzW3hdICAgICAtIHNbeCArIHN0cmlkZV0pICAgICArICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBGRkFCUyhzW3ggKyAxXSAtIHNbeCArIHN0cmlkZSArIDFdKSArICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBGRkFCUyhzW3ggKyAyXSAtIHNbeCArIDIgKyBzdHJpZGVdKSArICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBGRkFCUyhzW3ggKyAzXSAtIHNbeCArIDMgKyBzdHJpZGVdKTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHNjb3JlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitWU0FEX0lOVFJBKDgpCitWU0FEX0lOVFJBKDE2KQorCisjZGVmaW5lIFZTQUQoc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCB2c2FkICMjIHNpemUgIyMgX2MoTXBlZ0VuY0NvbnRleHQgKmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnMxLCB1aW50OF90ICpzMiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgc2NvcmUgPSAwLCB4LCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeSA9IDE7IHkgPCBoOyB5KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7IHgrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzY29yZSArPSBGRkFCUyhzMVt4XSAtIHMyW3hdIC0gczFbeCArIHN0cmlkZV0gKyBzMlt4ICsgc3RyaWRlXSk7ICAgXAorICAgICAgICBzMSArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgczIgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc2NvcmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitWU0FEKDgpCitWU0FEKDE2KQorCisjZGVmaW5lIFNRKGEpICgoYSkgKiAoYSkpCisjZGVmaW5lIFZTU0VfSU5UUkEoc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IHZzc2VfaW50cmEgIyMgc2l6ZSAjIyBfYyhNcGVnRW5jQ29udGV4dCAqYywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzLCB1aW50OF90ICpkdW1teSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHNjb3JlID0gMCwgeCwgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh5ID0gMTsgeSA8IGg7IHkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyB4ICs9IDQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzY29yZSArPSBTUShzW3hdICAgICAtIHNbeCArIHN0cmlkZV0pICsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBTUShzW3ggKyAxXSAtIHNbeCArIHN0cmlkZSArIDFdKSArICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBTUShzW3ggKyAyXSAtIHNbeCArIHN0cmlkZSArIDJdKSArICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBTUShzW3ggKyAzXSAtIHNbeCArIHN0cmlkZSArIDNdKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHNjb3JlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitWU1NFX0lOVFJBKDgpCitWU1NFX0lOVFJBKDE2KQorCisjZGVmaW5lIFZTU0Uoc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCB2c3NlICMjIHNpemUgIyMgX2MoTXBlZ0VuY0NvbnRleHQgKmMsIHVpbnQ4X3QgKnMxLCB1aW50OF90ICpzMiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBzY29yZSA9IDAsIHgsIHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh5ID0gMTsgeSA8IGg7IHkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgeCsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNjb3JlICs9IFNRKHMxW3hdIC0gczJbeF0gLSBzMVt4ICsgc3RyaWRlXSArIHMyW3ggKyBzdHJpZGVdKTsgICAgICBcCisgICAgICAgIHMxICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzMiArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzY29yZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KK1ZTU0UoOCkKK1ZTU0UoMTYpCisKKyNkZWZpbmUgV1JBUFBFUjhfMTZfU1EobmFtZTgsIG5hbWUxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbnQgbmFtZTE2KE1wZWdFbmNDb250ZXh0ICpzLCB1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgc2NvcmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzY29yZSArPSBuYW1lOChzLCBkc3QsIHNyYywgc3RyaWRlLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzY29yZSArPSBuYW1lOChzLCBkc3QgKyA4LCBzcmMgKyA4LCBzdHJpZGUsIDgpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoaCA9PSAxNikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0ICAgKz0gOCAqIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjICAgKz0gOCAqIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2NvcmUgKz0gbmFtZTgocywgZHN0LCBzcmMsIHN0cmlkZSwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2NvcmUgKz0gbmFtZTgocywgZHN0ICsgOCwgc3JjICsgOCwgc3RyaWRlLCA4KTsgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc2NvcmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworV1JBUFBFUjhfMTZfU1EoaGFkYW1hcmQ4X2RpZmY4eDhfYywgaGFkYW1hcmQ4X2RpZmYxNl9jKQorV1JBUFBFUjhfMTZfU1EoaGFkYW1hcmQ4X2ludHJhOHg4X2MsIGhhZGFtYXJkOF9pbnRyYTE2X2MpCitXUkFQUEVSOF8xNl9TUShkY3Rfc2FkOHg4X2MsIGRjdF9zYWQxNl9jKQorI2lmIENPTkZJR19HUEwKK1dSQVBQRVI4XzE2X1NRKGRjdDI2NF9zYWQ4eDhfYywgZGN0MjY0X3NhZDE2X2MpCisjZW5kaWYKK1dSQVBQRVI4XzE2X1NRKGRjdF9tYXg4eDhfYywgZGN0X21heDE2X2MpCitXUkFQUEVSOF8xNl9TUShxdWFudF9wc25yOHg4X2MsIHF1YW50X3BzbnIxNl9jKQorV1JBUFBFUjhfMTZfU1EocmQ4eDhfYywgcmQxNl9jKQorV1JBUFBFUjhfMTZfU1EoYml0OHg4X2MsIGJpdDE2X2MpCisKK2F2X2NvbGQgdm9pZCBmZl9tZV9jbXBfaW5pdF9zdGF0aWModm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykKKyAgICAgICAgZmZfc3F1YXJlX3RhYltpXSA9IChpIC0gMjU2KSAqIChpIC0gMjU2KTsKK30KKworaW50IGZmX2NoZWNrX2FsaWdubWVudCh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgZGlkX2ZhaWwgPSAwOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50LCBhbGlnbmVkLCBbNF0pOworCisgICAgaWYgKChpbnRwdHJfdClhbGlnbmVkICYgMTUpIHsKKyAgICAgICAgaWYgKCFkaWRfZmFpbCkgeworI2lmIEhBVkVfTU1YIHx8IEhBVkVfQUxUSVZFQworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAiQ29tcGlsZXIgZGlkIG5vdCBhbGlnbiBzdGFjayB2YXJpYWJsZXMuIExpYmF2Y29kZWMgaGFzIGJlZW4gbWlzY29tcGlsZWRcbiIKKyAgICAgICAgICAgICAgICAiYW5kIG1heSBiZSB2ZXJ5IHNsb3cgb3IgY3Jhc2guIFRoaXMgaXMgbm90IGEgYnVnIGluIGxpYmF2Y29kZWMsXG4iCisgICAgICAgICAgICAgICAgImJ1dCBpbiB0aGUgY29tcGlsZXIuIFlvdSBtYXkgdHJ5IHJlY29tcGlsaW5nIHVzaW5nIGdjYyA+PSA0LjIuXG4iCisgICAgICAgICAgICAgICAgIkRvIG5vdCByZXBvcnQgY3Jhc2hlcyB0byBGRm1wZWcgZGV2ZWxvcGVycy5cbiIpOworI2VuZGlmCisgICAgICAgICAgICBkaWRfZmFpbD0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9tZV9jbXBfaW5pdChNRUNtcENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBmZl9jaGVja19hbGlnbm1lbnQoKTsKKworICAgIGMtPnN1bV9hYnNfZGN0ZWxlbSA9IHN1bV9hYnNfZGN0ZWxlbV9jOworCisgICAgLyogVE9ETyBbMF0gMTYgIFsxXSA4ICovCisgICAgYy0+cGl4X2Fic1swXVswXSA9IHBpeF9hYnMxNl9jOworICAgIGMtPnBpeF9hYnNbMF1bMV0gPSBwaXhfYWJzMTZfeDJfYzsKKyAgICBjLT5waXhfYWJzWzBdWzJdID0gcGl4X2FiczE2X3kyX2M7CisgICAgYy0+cGl4X2Fic1swXVszXSA9IHBpeF9hYnMxNl94eTJfYzsKKyAgICBjLT5waXhfYWJzWzFdWzBdID0gcGl4X2FiczhfYzsKKyAgICBjLT5waXhfYWJzWzFdWzFdID0gcGl4X2FiczhfeDJfYzsKKyAgICBjLT5waXhfYWJzWzFdWzJdID0gcGl4X2FiczhfeTJfYzsKKyAgICBjLT5waXhfYWJzWzFdWzNdID0gcGl4X2FiczhfeHkyX2M7CisKKyNkZWZpbmUgU0VUX0NNUF9GVU5DKG5hbWUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjLT5uYW1lWzBdID0gbmFtZSAjIyAxNl9jOyAgICAgICAgICAgICAgICAgIFwKKyAgICBjLT5uYW1lWzFdID0gbmFtZSAjIyA4eDhfYzsKKworICAgIFNFVF9DTVBfRlVOQyhoYWRhbWFyZDhfZGlmZikKKyAgICBjLT5oYWRhbWFyZDhfZGlmZls0XSA9IGhhZGFtYXJkOF9pbnRyYTE2X2M7CisgICAgYy0+aGFkYW1hcmQ4X2RpZmZbNV0gPSBoYWRhbWFyZDhfaW50cmE4eDhfYzsKKyAgICBTRVRfQ01QX0ZVTkMoZGN0X3NhZCkKKyAgICBTRVRfQ01QX0ZVTkMoZGN0X21heCkKKyNpZiBDT05GSUdfR1BMCisgICAgU0VUX0NNUF9GVU5DKGRjdDI2NF9zYWQpCisjZW5kaWYKKyAgICBjLT5zYWRbMF0gPSBwaXhfYWJzMTZfYzsKKyAgICBjLT5zYWRbMV0gPSBwaXhfYWJzOF9jOworICAgIGMtPnNzZVswXSA9IHNzZTE2X2M7CisgICAgYy0+c3NlWzFdID0gc3NlOF9jOworICAgIGMtPnNzZVsyXSA9IHNzZTRfYzsKKyAgICBTRVRfQ01QX0ZVTkMocXVhbnRfcHNucikKKyAgICBTRVRfQ01QX0ZVTkMocmQpCisgICAgU0VUX0NNUF9GVU5DKGJpdCkKKyAgICBjLT52c2FkWzBdID0gdnNhZDE2X2M7CisgICAgYy0+dnNhZFsxXSA9IHZzYWQ4X2M7CisgICAgYy0+dnNhZFs0XSA9IHZzYWRfaW50cmExNl9jOworICAgIGMtPnZzYWRbNV0gPSB2c2FkX2ludHJhOF9jOworICAgIGMtPnZzc2VbMF0gPSB2c3NlMTZfYzsKKyAgICBjLT52c3NlWzFdID0gdnNzZThfYzsKKyAgICBjLT52c3NlWzRdID0gdnNzZV9pbnRyYTE2X2M7CisgICAgYy0+dnNzZVs1XSA9IHZzc2VfaW50cmE4X2M7CisgICAgYy0+bnNzZVswXSA9IG5zc2UxNl9jOworICAgIGMtPm5zc2VbMV0gPSBuc3NlOF9jOworI2lmIENPTkZJR19TTk9XX0RFQ09ERVIgfHwgQ09ORklHX1NOT1dfRU5DT0RFUgorICAgIGZmX2RzcHV0aWxfaW5pdF9kd3QoYyk7CisjZW5kaWYKKworICAgIGlmIChBUkNIX0FMUEhBKQorICAgICAgICBmZl9tZV9jbXBfaW5pdF9hbHBoYShjLCBhdmN0eCk7CisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl9tZV9jbXBfaW5pdF9hcm0oYywgYXZjdHgpOworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfbWVfY21wX2luaXRfcHBjKGMsIGF2Y3R4KTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX21lX2NtcF9pbml0X3g4NihjLCBhdmN0eCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tZV9jbXAuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21lX2NtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZWU1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tZV9jbXAuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NRV9DTVBfSAorI2RlZmluZSBBVkNPREVDX01FX0NNUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKworZXh0ZXJuIHVpbnQzMl90IGZmX3NxdWFyZV90YWJbNTEyXTsKKworCisvKiBtaW5pbXVtIGFsaWdubWVudCBydWxlcyA7KQorICogSWYgeW91IG5vdGljZSBlcnJvcnMgaW4gdGhlIGFsaWduIHN0dWZmLCBuZWVkIG1vcmUgYWxpZ25tZW50IGZvciBzb21lIEFTTSBjb2RlCisgKiBmb3Igc29tZSBDUFUgb3IgbmVlZCB0byB1c2UgYSBmdW5jdGlvbiB3aXRoIGxlc3MgYWxpZ25lZCBkYXRhIHRoZW4gc2VuZCBhIG1haWwKKyAqIHRvIHRoZSBmZm1wZWctZGV2ZWwgbWFpbGluZyBsaXN0LCAuLi4KKyAqCisgKiAhd2FybmluZyBUaGVzZSBhbGlnbm1lbnRzIG1pZ2h0IG5vdCBtYXRjaCByZWFsaXR5LCAobWlzc2luZyBhdHRyaWJ1dGUoKGFsaWduKSkKKyAqIHN0dWZmIHNvbWV3aGVyZSBwb3NzaWJsZSkuCisgKiBJIChNaWNoYWVsKSBkaWQgbm90IGNoZWNrIHRoZW0sIHRoZXNlIGFyZSBqdXN0IHRoZSBhbGlnbm1lbnRzIHdoaWNoIEkgdGhpbmsKKyAqIGNvdWxkIGJlIHJlYWNoZWQgZWFzaWx5IC4uLgorICoKKyAqICFmdXR1cmUgdmlkZW8gY29kZWNzIG1pZ2h0IG5lZWQgZnVuY3Rpb25zIHdpdGggbGVzcyBzdHJpY3QgYWxpZ25tZW50CisgKi8KKworc3RydWN0IE1wZWdFbmNDb250ZXh0OworLyogTW90aW9uIGVzdGltYXRpb246CisgKiBoIGlzIGxpbWl0ZWQgdG8geyB3aWR0aCAvIDIsIHdpZHRoLCAyICogd2lkdGggfSwKKyAqIGJ1dCBuZXZlciBsYXJnZXIgdGhhbiAxNiBhbmQgbmV2ZXIgc21hbGxlciB0aGFuIDIuCisgKiBBbHRob3VnaCBjdXJyZW50bHkgaCA8IDQgaXMgbm90IHVzZWQgYXMgZnVuY3Rpb25zIHdpdGgKKyAqIHdpZHRoIDwgOCBhcmUgbmVpdGhlciB1c2VkIG5vciBpbXBsZW1lbnRlZC4gKi8KK3R5cGVkZWYgaW50ICgqbWVfY21wX2Z1bmMpKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJsazEgLyogYWxpZ24gd2lkdGggKDggb3IgMTYpICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYmxrMiAvKiBhbGlnbiAxICovLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpOworCit0eXBlZGVmIHN0cnVjdCBNRUNtcENvbnRleHQgeworICAgIGludCAoKnN1bV9hYnNfZGN0ZWxlbSkoaW50MTZfdCAqYmxvY2sgLyogYWxpZ24gMTYgKi8pOworCisgICAgbWVfY21wX2Z1bmMgc2FkWzZdOyAvKiBpZGVudGljYWwgdG8gcGl4X2Fic0F4QSBleGNlcHQgYWRkaXRpb25hbCB2b2lkICogKi8KKyAgICBtZV9jbXBfZnVuYyBzc2VbNl07CisgICAgbWVfY21wX2Z1bmMgaGFkYW1hcmQ4X2RpZmZbNl07CisgICAgbWVfY21wX2Z1bmMgZGN0X3NhZFs2XTsKKyAgICBtZV9jbXBfZnVuYyBxdWFudF9wc25yWzZdOworICAgIG1lX2NtcF9mdW5jIGJpdFs2XTsKKyAgICBtZV9jbXBfZnVuYyByZFs2XTsKKyAgICBtZV9jbXBfZnVuYyB2c2FkWzZdOworICAgIG1lX2NtcF9mdW5jIHZzc2VbNl07CisgICAgbWVfY21wX2Z1bmMgbnNzZVs2XTsKKyAgICBtZV9jbXBfZnVuYyB3NTNbNl07CisgICAgbWVfY21wX2Z1bmMgdzk3WzZdOworICAgIG1lX2NtcF9mdW5jIGRjdF9tYXhbNl07CisgICAgbWVfY21wX2Z1bmMgZGN0MjY0X3NhZFs2XTsKKworICAgIG1lX2NtcF9mdW5jIG1lX3ByZV9jbXBbNl07CisgICAgbWVfY21wX2Z1bmMgbWVfY21wWzZdOworICAgIG1lX2NtcF9mdW5jIG1lX3N1Yl9jbXBbNl07CisgICAgbWVfY21wX2Z1bmMgbWJfY21wWzZdOworICAgIG1lX2NtcF9mdW5jIGlsZGN0X2NtcFs2XTsgLy8gb25seSB3aWR0aCAxNiB1c2VkCisgICAgbWVfY21wX2Z1bmMgZnJhbWVfc2tpcF9jbXBbNl07IC8vIG9ubHkgd2lkdGggOCB1c2VkCisKKyAgICBtZV9jbXBfZnVuYyBwaXhfYWJzWzJdWzRdOworfSBNRUNtcENvbnRleHQ7CisKK3ZvaWQgZmZfbWVfY21wX2luaXRfc3RhdGljKHZvaWQpOworCitpbnQgZmZfY2hlY2tfYWxpZ25tZW50KHZvaWQpOworCit2b2lkIGZmX21lX2NtcF9pbml0KE1FQ21wQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK3ZvaWQgZmZfbWVfY21wX2luaXRfYWxwaGEoTUVDbXBDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl9tZV9jbXBfaW5pdF9hcm0oTUVDbXBDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl9tZV9jbXBfaW5pdF9wcGMoTUVDbXBDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl9tZV9jbXBfaW5pdF94ODYoTUVDbXBDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCit2b2lkIGZmX3NldF9jbXAoTUVDbXBDb250ZXh0ICpjLCBtZV9jbXBfZnVuYyAqY21wLCBpbnQgdHlwZSk7CisKK3ZvaWQgZmZfZHNwdXRpbF9pbml0X2R3dChNRUNtcENvbnRleHQgKmMpOworCisjZW5kaWYgLyogQVZDT0RFQ19NRV9DTVBfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWV0YXNvdW5kLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tZXRhc291bmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFiMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWV0YXNvdW5kLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBWb3h3YXJlIE1ldGFTb3VuZCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgS29uc3RhbnRpbiBTaGlzaGtvdgorICogYmFzZWQgb24gVHdpblZRIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBWaXRvciBTZXNzYWsKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZmZ0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsc3AuaCIKKyNpbmNsdWRlICJzaW5ld2luLmgiCisKKyNpbmNsdWRlICJ0d2ludnEuaCIKKyNpbmNsdWRlICJtZXRhc291bmRfZGF0YS5oIgorCitzdGF0aWMgdm9pZCBhZGRfcGVhayhmbG9hdCBwZXJpb2QsIGludCB3aWR0aCwgY29uc3QgZmxvYXQgKnNoYXBlLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcHBjX2dhaW4sIGZsb2F0ICpzcGVlY2gsIGludCBsZW4pCit7CisgICAgaW50IGksIGosIGNlbnRlcjsKKyAgICBjb25zdCBmbG9hdCAqc2hhcGVfZW5kID0gc2hhcGUgKyBsZW47CisKKyAgICAvLyBGaXJzdCBwZWFrIGNlbnRlcmVkIGFyb3VuZCB6ZXJvCisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoIC8gMjsgaSsrKQorICAgICAgICBzcGVlY2hbaV0gKz0gcHBjX2dhaW4gKiAqc2hhcGUrKzsKKworICAgIGZvciAoaSA9IDE7IGkgPCBST1VOREVEX0RJVihsZW4sIHdpZHRoKTsgaSsrKSB7CisgICAgICAgIGNlbnRlciA9IChpbnQpKGkgKiBwZXJpb2QgKyAwLjUpOworICAgICAgICBmb3IgKGogPSAtd2lkdGggLyAyOyBqIDwgKHdpZHRoICsgMSkgLyAyOyBqKyspCisgICAgICAgICAgICBzcGVlY2hbaiArIGNlbnRlcl0gKz0gcHBjX2dhaW4gKiAqc2hhcGUrKzsKKyAgICB9CisKKyAgICAvLyBGb3IgdGhlIGxhc3QgYmxvY2ssIGJlIGNhcmVmdWwgbm90IHRvIGdvIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKKyAgICBjZW50ZXIgPSAoaW50KShpICogcGVyaW9kICsgMC41KTsKKyAgICBmb3IgKGogPSAtd2lkdGggLyAyOyBqIDwgKHdpZHRoICsgMSkgLyAyICYmIHNoYXBlIDwgc2hhcGVfZW5kOyBqKyspCisgICAgICAgIHNwZWVjaFtqICsgY2VudGVyXSArPSBwcGNfZ2FpbiAqICpzaGFwZSsrOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfcHBjKFR3aW5WUUNvbnRleHQgKnRjdHgsIGludCBwZXJpb2RfY29lZiwgaW50IGdfY29lZiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNoYXBlLCBmbG9hdCAqc3BlZWNoKQoreworICAgIGNvbnN0IFR3aW5WUU1vZGVUYWIgKm10YWIgPSB0Y3R4LT5tdGFiOworICAgIGludCBpc2FtcGYgICAgICAgPSB0Y3R4LT5hdmN0eC0+c2FtcGxlX3JhdGUgLyAxMDAwOworICAgIGludCBpYnBzICAgICAgICAgPSB0Y3R4LT5hdmN0eC0+Yml0X3JhdGUgLyAoMTAwMCAqIHRjdHgtPmF2Y3R4LT5jaGFubmVscyk7CisgICAgaW50IHdpZHRoOworCisgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpbXRhYi0+c2l6ZSAvIGlzYW1wZjsKKyAgICBmbG9hdCBtaW5fcGVyaW9kLCBtYXhfcGVyaW9kLCBwZXJpb2RfcmFuZ2UsIHBlcmlvZDsKKyAgICBmbG9hdCBzb21lX211bHQ7CisKKyAgICBmbG9hdCBwZ2Fpbl9iYXNlLCBwZ2Fpbl9zdGVwLCBwcGNfZ2FpbjsKKworICAgIGlmICh0Y3R4LT5hdmN0eC0+Y2hhbm5lbHMgPT0gMSkgeworICAgICAgICBtaW5fcGVyaW9kID0gbG9nMihyYXRpbyAqIDAuMik7CisgICAgICAgIG1heF9wZXJpb2QgPSBtaW5fcGVyaW9kICsgbG9nMig2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtaW5fcGVyaW9kID0gKGludCkocmF0aW8gKiAwLjIgKiA0MDAgICAgICsgMC41KSAvIDQwMC4wOworICAgICAgICBtYXhfcGVyaW9kID0gKGludCkocmF0aW8gKiAwLjIgKiA0MDAgKiA2ICsgMC41KSAvIDQwMC4wOworICAgIH0KKyAgICBwZXJpb2RfcmFuZ2UgPSBtYXhfcGVyaW9kIC0gbWluX3BlcmlvZDsKKyAgICBwZXJpb2QgICAgICAgPSBtaW5fcGVyaW9kICsgcGVyaW9kX2NvZWYgKiBwZXJpb2RfcmFuZ2UgLworICAgICAgICAgICAgICAgICAgICgoMSA8PCBtdGFiLT5wcGNfcGVyaW9kX2JpdCkgLSAxKTsKKyAgICBpZiAodGN0eC0+YXZjdHgtPmNoYW5uZWxzID09IDEpCisgICAgICAgIHBlcmlvZCA9IHBvd2YoMi4wLCBwZXJpb2QpOworICAgIGVsc2UKKyAgICAgICAgcGVyaW9kID0gKGludCkocGVyaW9kICogNDAwICsgMC41KSAvIDQwMC4wOworCisgICAgc3dpdGNoIChpc2FtcGYpIHsKKyAgICBjYXNlICA4OiBzb21lX211bHQgPSAyLjA7IGJyZWFrOworICAgIGNhc2UgMTE6IHNvbWVfbXVsdCA9IDMuMDsgYnJlYWs7CisgICAgY2FzZSAxNjogc29tZV9tdWx0ID0gMy4wOyBicmVhazsKKyAgICBjYXNlIDIyOiBzb21lX211bHQgPSBpYnBzID09IDMyID8gMi4wIDogNC4wOyBicmVhazsKKyAgICBjYXNlIDQ0OiBzb21lX211bHQgPSA4LjA7IGJyZWFrOworICAgIGRlZmF1bHQ6IHNvbWVfbXVsdCA9IDQuMDsKKyAgICB9CisKKyAgICB3aWR0aCA9IChpbnQpKHNvbWVfbXVsdCAvIChtdGFiLT5zaXplIC8gcGVyaW9kKSAqIG10YWItPnBwY19zaGFwZV9sZW4pOworICAgIGlmIChpc2FtcGYgPT0gMjIgJiYgaWJwcyA9PSAzMikKKyAgICAgICAgd2lkdGggPSAoaW50KSgoMi4wIC8gcGVyaW9kICsgMSkgKiB3aWR0aCArIDAuNSk7CisKKyAgICBwZ2Fpbl9iYXNlID0gdGN0eC0+YXZjdHgtPmNoYW5uZWxzID09IDIgPyAyNTAwMC4wIDogMjAwMDAuMDsKKyAgICBwZ2Fpbl9zdGVwID0gcGdhaW5fYmFzZSAvICgoMSA8PCBtdGFiLT5wZ2Fpbl9iaXQpIC0gMSk7CisgICAgcHBjX2dhaW4gICA9IDEuMCAvIDgxOTIgKgorICAgICAgICAgICAgICAgICB0d2ludnFfbXVsYXdpbnYocGdhaW5fc3RlcCAqIGdfY29lZiArIHBnYWluX3N0ZXAgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdhaW5fYmFzZSwgVFdJTlZRX1BHQUlOX01VKTsKKworICAgIGFkZF9wZWFrKHBlcmlvZCwgd2lkdGgsIHNoYXBlLCBwcGNfZ2Fpbiwgc3BlZWNoLCBtdGFiLT5wcGNfc2hhcGVfbGVuKTsKK30KKworc3RhdGljIHZvaWQgZGVjX2JhcmtfZW52KFR3aW5WUUNvbnRleHQgKnRjdHgsIGNvbnN0IHVpbnQ4X3QgKmluLCBpbnQgdXNlX2hpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoLCBmbG9hdCAqb3V0LCBmbG9hdCBnYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gVHdpblZRRnJhbWVUeXBlIGZ0eXBlKQoreworICAgIGNvbnN0IFR3aW5WUU1vZGVUYWIgKm10YWIgPSB0Y3R4LT5tdGFiOworICAgIGludCBpLCBqOworICAgIGZsb2F0ICpoaXN0ICAgICA9IHRjdHgtPmJhcmtfaGlzdFtmdHlwZV1bY2hdOworICAgIGZsb2F0IHZhbCAgICAgICA9ICgoY29uc3QgZmxvYXQgW10pIHsgMC40LCAwLjM1LCAwLjI4IH0pW2Z0eXBlXTsKKyAgICBpbnQgYmFya19uX2NvZWYgPSBtdGFiLT5mbW9kZVtmdHlwZV0uYmFya19uX2NvZWY7CisgICAgaW50IGZ3X2NiX2xlbiAgID0gbXRhYi0+Zm1vZGVbZnR5cGVdLmJhcmtfZW52X3NpemUgLyBiYXJrX25fY29lZjsKKyAgICBpbnQgaWR4ICAgICAgICAgPSAwOworCisgICAgaWYgKHRjdHgtPmF2Y3R4LT5jaGFubmVscyA9PSAxKQorICAgICAgICB2YWwgPSAwLjU7CisgICAgZm9yIChpID0gMDsgaSA8IGZ3X2NiX2xlbjsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmFya19uX2NvZWY7IGorKywgaWR4KyspIHsKKyAgICAgICAgICAgIGZsb2F0IHRtcDIgPSBtdGFiLT5mbW9kZVtmdHlwZV0uYmFya19jYltmd19jYl9sZW4gKiBpbltqXSArIGldICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMS4wIC8gMjA0OCk7CisgICAgICAgICAgICBmbG9hdCBzdDsKKworICAgICAgICAgICAgaWYgKHRjdHgtPmF2Y3R4LT5jaGFubmVscyA9PSAxKQorICAgICAgICAgICAgICAgIHN0ID0gdXNlX2hpc3QgPworICAgICAgICAgICAgICAgICAgICB0bXAyICsgdmFsICogaGlzdFtpZHhdICsgMS4wIDogdG1wMiArIDEuMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdCA9IHVzZV9oaXN0ID8gKDEuMCAtIHZhbCkgKiB0bXAyICsgdmFsICogaGlzdFtpZHhdICsgMS4wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRtcDIgKyAxLjA7CisKKyAgICAgICAgICAgIGhpc3RbaWR4XSA9IHRtcDI7CisgICAgICAgICAgICBpZiAoc3QgPCAwLjEpCisgICAgICAgICAgICAgICAgc3QgPSAwLjE7CisKKyAgICAgICAgICAgIHR3aW52cV9tZW1zZXRfZmxvYXQob3V0LCBzdCAqIGdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10YWItPmZtb2RlW2Z0eXBlXS5iYXJrX3RhYltpZHhdKTsKKyAgICAgICAgICAgIG91dCArPSBtdGFiLT5mbW9kZVtmdHlwZV0uYmFya190YWJbaWR4XTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCByZWFkX2NiX2RhdGEoVHdpblZRQ29udGV4dCAqdGN0eCwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBlbnVtIFR3aW5WUUZyYW1lVHlwZSBmdHlwZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0Y3R4LT5uX2RpdltmdHlwZV07IGkrKykgeworICAgICAgICBpbnQgYnNfc2Vjb25kX3BhcnQgPSAoaSA+PSB0Y3R4LT5iaXRzX21haW5fc3BlY19jaGFuZ2VbZnR5cGVdKTsKKworICAgICAgICAqZHN0KysgPSBnZXRfYml0cyhnYiwgdGN0eC0+Yml0c19tYWluX3NwZWNbMF1bZnR5cGVdW2JzX3NlY29uZF9wYXJ0XSk7CisgICAgICAgICpkc3QrKyA9IGdldF9iaXRzKGdiLCB0Y3R4LT5iaXRzX21haW5fc3BlY1sxXVtmdHlwZV1bYnNfc2Vjb25kX3BhcnRdKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbWV0YXNvdW5kX3JlYWRfYml0c3RyZWFtKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVHdpblZRQ29udGV4dCAqdGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIFR3aW5WUUZyYW1lRGF0YSAgICAgKmJpdHM7CisgICAgY29uc3QgVHdpblZRTW9kZVRhYiAqbXRhYiA9IHRjdHgtPm10YWI7CisgICAgaW50IGNoYW5uZWxzICAgICAgICAgICAgICA9IHRjdHgtPmF2Y3R4LT5jaGFubmVsczsKKyAgICBpbnQgc3ViOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGksIGosIGs7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCBidWZfc2l6ZSAqIDgpOworCisgICAgZm9yICh0Y3R4LT5jdXJfZnJhbWUgPSAwOyB0Y3R4LT5jdXJfZnJhbWUgPCB0Y3R4LT5mcmFtZXNfcGVyX3BhY2tldDsKKyAgICAgICAgIHRjdHgtPmN1cl9mcmFtZSsrKSB7CisgICAgICAgIGJpdHMgPSB0Y3R4LT5iaXRzICsgdGN0eC0+Y3VyX2ZyYW1lOworCisgICAgICAgIGJpdHMtPndpbmRvd190eXBlID0gZ2V0X2JpdHMoJmdiLCBUV0lOVlFfV0lORE9XX1RZUEVfQklUUyk7CisKKyAgICAgICAgaWYgKGJpdHMtPndpbmRvd190eXBlID4gOCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHdpbmRvdyB0eXBlLCBicm9rZW4gc2FtcGxlP1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGJpdHMtPmZ0eXBlID0gZmZfdHdpbnZxX3d0eXBlX3RvX2Z0eXBlX3RhYmxlW3RjdHgtPmJpdHNbdGN0eC0+Y3VyX2ZyYW1lXS53aW5kb3dfdHlwZV07CisKKyAgICAgICAgc3ViID0gbXRhYi0+Zm1vZGVbYml0cy0+ZnR5cGVdLnN1YjsKKworICAgICAgICBpZiAoYml0cy0+ZnR5cGUgIT0gVFdJTlZRX0ZUX1NIT1JUICYmICF0Y3R4LT5pc182a2JwcykKKyAgICAgICAgICAgIGdldF9iaXRzKCZnYiwgMik7CisKKyAgICAgICAgcmVhZF9jYl9kYXRhKHRjdHgsICZnYiwgYml0cy0+bWFpbl9jb2VmZnMsIGJpdHMtPmZ0eXBlKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWI7IGorKykKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbXRhYi0+Zm1vZGVbYml0cy0+ZnR5cGVdLmJhcmtfbl9jb2VmOyBrKyspCisgICAgICAgICAgICAgICAgICAgIGJpdHMtPmJhcmsxW2ldW2pdW2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzKCZnYiwgbXRhYi0+Zm1vZGVbYml0cy0+ZnR5cGVdLmJhcmtfbl9iaXQpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN1YjsgaisrKQorICAgICAgICAgICAgICAgIGJpdHMtPmJhcmtfdXNlX2hpc3RbaV1bal0gPSBnZXRfYml0czEoJmdiKTsKKworICAgICAgICBpZiAoYml0cy0+ZnR5cGUgPT0gVFdJTlZRX0ZUX0xPTkcpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgICAgICAgICAgIGJpdHMtPmdhaW5fYml0c1tpXSA9IGdldF9iaXRzKCZnYiwgVFdJTlZRX0dBSU5fQklUUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgICAgIGJpdHMtPmdhaW5fYml0c1tpXSA9IGdldF9iaXRzKCZnYiwgVFdJTlZRX0dBSU5fQklUUyk7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN1YjsgaisrKQorICAgICAgICAgICAgICAgICAgICBiaXRzLT5zdWJfZ2Fpbl9iaXRzW2kgKiBzdWIgKyBqXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0cygmZ2IsIFRXSU5WUV9TVUJfR0FJTl9CSVRTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBiaXRzLT5scGNfaGlzdF9pZHhbaV0gPSBnZXRfYml0cygmZ2IsIG10YWItPmxzcF9iaXQwKTsKKyAgICAgICAgICAgIGJpdHMtPmxwY19pZHgxW2ldICAgICA9IGdldF9iaXRzKCZnYiwgbXRhYi0+bHNwX2JpdDEpOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbXRhYi0+bHNwX3NwbGl0OyBqKyspCisgICAgICAgICAgICAgICAgYml0cy0+bHBjX2lkeDJbaV1bal0gPSBnZXRfYml0cygmZ2IsIG10YWItPmxzcF9iaXQyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiaXRzLT5mdHlwZSA9PSBUV0lOVlFfRlRfTE9ORykgeworICAgICAgICAgICAgcmVhZF9jYl9kYXRhKHRjdHgsICZnYiwgYml0cy0+cHBjX2NvZWZmcywgMyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgICAgIGJpdHMtPnBfY29lZltpXSA9IGdldF9iaXRzKCZnYiwgbXRhYi0+cHBjX3BlcmlvZF9iaXQpOworICAgICAgICAgICAgICAgIGJpdHMtPmdfY29lZltpXSA9IGdldF9iaXRzKCZnYiwgbXRhYi0+cGdhaW5fYml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHN1YmZyYW1lcyBhcmUgYWxpZ25lZCB0byBuaWJibGVzCisgICAgICAgIGlmIChnZXRfYml0c19jb3VudCgmZ2IpICYgMykKKyAgICAgICAgICAgIHNraXBfYml0cygmZ2IsIDQgLSAoZ2V0X2JpdHNfY291bnQoJmdiKSAmIDMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gKGdldF9iaXRzX2NvdW50KCZnYikgKyA3KSAvIDg7Cit9CisKK3R5cGVkZWYgc3RydWN0IE1ldGFzb3VuZFByb3BzIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgaW50ICAgICAgYml0X3JhdGU7CisgICAgaW50ICAgICAgY2hhbm5lbHM7CisgICAgaW50ICAgICAgc2FtcGxlX3JhdGU7Cit9IE1ldGFzb3VuZFByb3BzOworCitzdGF0aWMgY29uc3QgTWV0YXNvdW5kUHJvcHMgY29kZWNfcHJvcHNbXSA9IHsKKyAgICB7IE1LVEFHKCdWJywnWCcsJzAnLCczJyksICA2LCAxLCAgODAwMCB9LAorICAgIHsgTUtUQUcoJ1YnLCdYJywnMCcsJzQnKSwgMTIsIDIsICA4MDAwIH0sCisKKyAgICB7IE1LVEFHKCdWJywnTycsJ1gnLCdpJyksICA4LCAxLCAgODAwMCB9LAorICAgIHsgTUtUQUcoJ1YnLCdPJywnWCcsJ2onKSwgMTAsIDEsIDExMDI1IH0sCisgICAgeyBNS1RBRygnVicsJ08nLCdYJywnaycpLCAxNiwgMSwgMTYwMDAgfSwKKyAgICB7IE1LVEFHKCdWJywnTycsJ1gnLCdMJyksIDI0LCAxLCAyMjA1MCB9LAorICAgIHsgTUtUQUcoJ1YnLCdPJywnWCcsJ3EnKSwgMzIsIDEsIDQ0MTAwIH0sCisgICAgeyBNS1RBRygnVicsJ08nLCdYJywncicpLCA0MCwgMSwgNDQxMDAgfSwKKyAgICB7IE1LVEFHKCdWJywnTycsJ1gnLCdzJyksIDQ4LCAxLCA0NDEwMCB9LAorICAgIHsgTUtUQUcoJ1YnLCdPJywnWCcsJ3QnKSwgMTYsIDIsICA4MDAwIH0sCisgICAgeyBNS1RBRygnVicsJ08nLCdYJywndScpLCAyMCwgMiwgMTEwMjUgfSwKKyAgICB7IE1LVEFHKCdWJywnTycsJ1gnLCd2JyksIDMyLCAyLCAxNjAwMCB9LAorICAgIHsgTUtUQUcoJ1YnLCdPJywnWCcsJ3cnKSwgNDgsIDIsIDIyMDUwIH0sCisgICAgeyBNS1RBRygnVicsJ08nLCdYJywneCcpLCA2NCwgMiwgNDQxMDAgfSwKKyAgICB7IE1LVEFHKCdWJywnTycsJ1gnLCd5JyksIDgwLCAyLCA0NDEwMCB9LAorICAgIHsgTUtUQUcoJ1YnLCdPJywnWCcsJ3onKSwgOTYsIDIsIDQ0MTAwIH0sCisKKyAgICB7IDAsIDAsIDAsIDAgfQorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IG1ldGFzb3VuZF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGlzYW1wZiwgaWJwczsKKyAgICBUd2luVlFDb250ZXh0ICp0Y3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgY29uc3QgTWV0YXNvdW5kUHJvcHMgKnByb3BzID0gY29kZWNfcHJvcHM7CisKKyAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEgfHwgYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMTYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIG9yIGluY29tcGxldGUgZXh0cmFkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgdGFnID0gQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhICsgMTIpOworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoIXByb3BzLT50YWcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGZpbmQgdGFnICUwOCJQUklYMzIiXG4iLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3BzLT50YWcgPT0gdGFnKSB7CisgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBwcm9wcy0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgICAgPSBwcm9wcy0+Y2hhbm5lbHM7CisgICAgICAgICAgICBhdmN0eC0+Yml0X3JhdGUgICAgPSBwcm9wcy0+Yml0X3JhdGUgKiAxMDAwOworICAgICAgICAgICAgaXNhbXBmICAgICAgICAgICAgID0gYXZjdHgtPnNhbXBsZV9yYXRlIC8gMTAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHByb3BzKys7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA8PSAwIHx8IGF2Y3R4LT5jaGFubmVscyA+IFRXSU5WUV9DSEFOTkVMU19NQVgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHM6ICVpXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGF2Y3R4LT5jaGFubmVscyA9PSAxID8gQVZfQ0hfTEFZT1VUX01PTk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX0NIX0xBWU9VVF9TVEVSRU87CisKKyAgICBpYnBzID0gYXZjdHgtPmJpdF9yYXRlIC8gKDEwMDAgKiBhdmN0eC0+Y2hhbm5lbHMpOworCisgICAgc3dpdGNoICgoYXZjdHgtPmNoYW5uZWxzIDw8IDE2KSArIChpc2FtcGYgPDwgOCkgKyBpYnBzKSB7CisgICAgY2FzZSAoMSA8PCAxNikgKyAoIDggPDwgOCkgKyAgNjoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZmZl9tZXRhc291bmRfbW9kZTA4MDY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgKDIgPDwgMTYpICsgKCA4IDw8IDgpICsgIDY6CisgICAgICAgIHRjdHgtPm10YWIgPSAmZmZfbWV0YXNvdW5kX21vZGUwODA2czsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAoMSA8PCAxNikgKyAoIDggPDwgOCkgKyAgODoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZmZl9tZXRhc291bmRfbW9kZTA4MDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgKDIgPDwgMTYpICsgKCA4IDw8IDgpICsgIDg6CisgICAgICAgIHRjdHgtPm10YWIgPSAmZmZfbWV0YXNvdW5kX21vZGUwODA4czsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAoMSA8PCAxNikgKyAoMTEgPDwgOCkgKyAxMDoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZmZl9tZXRhc291bmRfbW9kZTExMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgKDIgPDwgMTYpICsgKDExIDw8IDgpICsgMTA6CisgICAgICAgIHRjdHgtPm10YWIgPSAmZmZfbWV0YXNvdW5kX21vZGUxMTEwczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAoMSA8PCAxNikgKyAoMTYgPDwgOCkgKyAxNjoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZmZl9tZXRhc291bmRfbW9kZTE2MTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgKDIgPDwgMTYpICsgKDE2IDw8IDgpICsgMTY6CisgICAgICAgIHRjdHgtPm10YWIgPSAmZmZfbWV0YXNvdW5kX21vZGUxNjE2czsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAoMSA8PCAxNikgKyAoMjIgPDwgOCkgKyAyNDoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZmZl9tZXRhc291bmRfbW9kZTIyMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgKDIgPDwgMTYpICsgKDIyIDw8IDgpICsgMjQ6CisgICAgICAgIHRjdHgtPm10YWIgPSAmZmZfbWV0YXNvdW5kX21vZGUyMjI0czsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAoMSA8PCAxNikgKyAoNDQgPDwgOCkgKyAzMjoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZmZl9tZXRhc291bmRfbW9kZTQ0MzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgKDIgPDwgMTYpICsgKDQ0IDw8IDgpICsgMzI6CisgICAgICAgIHRjdHgtPm10YWIgPSAmZmZfbWV0YXNvdW5kX21vZGU0NDMyczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAoMSA8PCAxNikgKyAoNDQgPDwgOCkgKyA0MDoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZmZl9tZXRhc291bmRfbW9kZTQ0NDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgKDIgPDwgMTYpICsgKDQ0IDw8IDgpICsgNDA6CisgICAgICAgIHRjdHgtPm10YWIgPSAmZmZfbWV0YXNvdW5kX21vZGU0NDQwczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAoMSA8PCAxNikgKyAoNDQgPDwgOCkgKyA0ODoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZmZl9tZXRhc291bmRfbW9kZTQ0NDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgKDIgPDwgMTYpICsgKDQ0IDw8IDgpICsgNDg6CisgICAgICAgIHRjdHgtPm10YWIgPSAmZmZfbWV0YXNvdW5kX21vZGU0NDQ4czsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVGhpcyB2ZXJzaW9uIGRvZXMgbm90IHN1cHBvcnQgJWQga0h6IC0gJWQga2JpdC9zL2NoIG1vZGUuXG4iLAorICAgICAgICAgICAgICAgaXNhbXBmLCBpYnBzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICB0Y3R4LT5jb2RlYyAgICAgICAgICA9IFRXSU5WUV9DT0RFQ19NRVRBU09VTkQ7CisgICAgdGN0eC0+cmVhZF9iaXRzdHJlYW0gPSBtZXRhc291bmRfcmVhZF9iaXRzdHJlYW07CisgICAgdGN0eC0+ZGVjX2JhcmtfZW52ICAgPSBkZWNfYmFya19lbnY7CisgICAgdGN0eC0+ZGVjb2RlX3BwYyAgICAgPSBkZWNvZGVfcHBjOworICAgIHRjdHgtPmZyYW1lX3NpemUgICAgID0gYXZjdHgtPmJpdF9yYXRlICogdGN0eC0+bXRhYi0+c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIHRjdHgtPmlzXzZrYnBzICAgICAgID0gaWJwcyA9PSA2OworCisgICAgcmV0dXJuIGZmX3R3aW52cV9kZWNvZGVfaW5pdChhdmN0eCk7Cit9CisKK0FWQ29kZWMgZmZfbWV0YXNvdW5kX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1ldGFzb3VuZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZveHdhcmUgTWV0YVNvdW5kIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01FVEFTT1VORCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVHdpblZRQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbWV0YXNvdW5kX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX3R3aW52cV9kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gZmZfdHdpbnZxX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWV0YXNvdW5kX2RhdGEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21ldGFzb3VuZF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyM2NkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21ldGFzb3VuZF9kYXRhLmMKQEAgLTAsMCArMSwxNTM0MyBAQAorLyoKKyAqIE1ldGFTb3VuZCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibWV0YXNvdW5kX2RhdGEuaCIKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IwODA2c2wwW10gPSB7CisgICAgICAtNDE3LCAgIC0yMjUsICAgIC04NCwgICAgIDE2LCAgIC0xMDYsICAgIC0zNCwgICAtMjQ2LCAgIC0xNjQsCisgICAgICAgMTEyLCAgICAgNDgsICAgIC00NywgICAgIDM2LCAgICAtNjUsICAgIC02OCwgICAtMTcyLCAgLTE2NTUsCisgICAgICAgLTM2LCAgICAxNDAsICAgICAtMywgICAgIC0yLCAgICAgLTIsICAgICAgMiwgICAgICAwLCAgICAgIDAsCisgICAgICAgMTc4LCAgICAgIDcsICAgLTE4MSwgICAtMTc3LCAgICAxMjAsICAgIC02NCwgICAtMTI5LCAgICAgODAsCisgICAgIC02ODI2LCAgICAtMzgsICAgIC0yNSwgICAgMTQ3LCAgICAxNDgsICAgIC0xMywgICAgLTI1LCAgICAxMTAsCisgICAgICAgIDIxLCAgICAgMjEsICAgICAtMSwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAzMzE5LCAgICA2MzIsICAgLTczNCwgICAtMTg3LCAgICAgNDAsICAgLTI0OSwgICAtMTU1LCAgICAgLTEsCisgICAgICAtMTczLCAgICAgOTUsICAgICAyOCwgICAgIC0yLCAgICAgMjAsICAgIC00NCwgICAgIDM1LCAgICAxMjAsCisgICAgICAgLTQ3LCAgIC0yMjEsICAgICAtNSwgICAgICAyLCAgICAgLTcsICAgICAgMSwgICAgICAwLCAgICAgIDAsCisgICAgICAgIDYzLCAgICAyNjgsICAgLTI2MCwgICAtNDE5LCAgICAxODcsICAgIC03NSwgICAtMjI4LCAgICAyOTYsCisgICAgICAtNDcwLCAgICAxNzcsICAgLTUxNSwgICAgMzE4LCAgICAxMjQsICAgIDMwOCwgICAgIDkyLCAgICAzNzEsCisgICAgICAzMDQ2LCAgICAzNjIsICAgICAtMSwgICAgIC0xLCAgICAtMTAsICAgICAgMSwgICAgICAwLCAgICAgIDAsCisgICAgICAtMzU2LCAgICAtMTYsICAgLTE5OSwgICAgMTE3LCAgICAtNzUsICAgICA0NiwgICAtMTA4LCAgICAtMTQsCisgICAgICAtMTI0LCAgIC0xNzMsICAgNDkxNCwgICAgLTc1LCAgIC00NzQsICAgIDEwNSwgICAgIDg3LCAgICAxOTAsCisgICAgICAtMTgzLCAgIC0yMDgsICAgICAgMCwgICAgICAwLCAgICAgIDEsICAgICAgMSwgICAgICAwLCAgICAgLTEsCisgICAgICAgMTYyLCAgICAgODksICAgICA0OSwgICAtMzE0LCAgLTI3ODgsICAgIDI2NSwgICAtMjYzLCAgICAgLTMsCisgICAgIC0zMTU2LCAgICAzMTYsICAgIDExMiwgICAgMTI4LCAgIC0zMzMsICAgLTEzOCwgICAtMTE0LCAgIC0xNDEsCisgICAgICAtMjg3LCAgIC0yMzQsICAgICAtMSwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDEsCisgICAgICAgNzMzLCAgICAxMjYsICAgLTQyNCwgICAtMzg5LCAgICA2NDIsICAgIDQzMiwgICAgMTM0LCAgIC0yNTEsCisgICAgICAgNDA3LCAgICAtNTEsICAgLTE1MSwgICAtNDkxLCAgIC0zMDgsICAgICA5MSwgICAgIDUwLCAgIDM4MzYsCisgICAgICAgIDg3LCAgICAxMDAsICAgICAtNSwgICAgIC02LCAgICAgIDAsICAgICAgMSwgICAgICAwLCAgICAgIDAsCisgICAgICAgMzA0LCAgIDE3MjcsICAgICA4MywgICAgIC04LCAgICAyMTYsICAgIC04MSwgICAtMTg5LCAgICAxNTIsCisgICAgICAgLTY3LCAgICAgMTUsICAgIDMxMCwgICAgLTkzLCAgICAgIDYsICAgIC0zNywgICAgIDU0LCAgIC0xMTAsCisgICAgICAgLTE1LCAgICAgNzgsICAgICAgMCwgICAgICAwLCAgICAgIDEsICAgICAxMiwgICAgICAwLCAgICAgLTEsCisgICAgICAgMTI5LCAgIC0xOTgsICAgICAgMSwgICAgLTQ4LCAgICAtNjYsICAgLTE0NywgICAgIDMwLCAgICAyNjQsCisgICAgICAgLTg0LCAgICAxMDIsICAgICA0MiwgICAgMTI2LCAgICAgIDEsICAtNjQ1MSwgICAgMjI1LCAgICAtNTEsCisgICAgICAgICA4LCAgICAxMjMsICAgICAgMCwgICAgIC0xLCAgICAgIDAsICAgICAtMSwgICAgICAwLCAgICAgIDAsCisgICAgICAtMzc0LCAgICAgNjYsICAgLTI1NiwgICAgLTgwLCAgLTExMzksICAgIDMwMywgICAyMDAyLCAgIC0xOTksCisgICAgICAgLTk4LCAgICAtOTgsICAgIC0zOSwgICAgLTc2LCAgICAxODAsICAgICAxNSwgICAtNDU2LCAgICAxNDgsCisgICAgICAtMTgzLCAgICAxMTgsICAgICAtMiwgICAgICAxLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgMTUxLCAgICAgMTMsICAgLTExNCwgICAgIDY1LCAgIDYxNTYsICAgICA3NiwgICAgLTgyLCAgICAtMzAsCisgICAgICAgLTI2LCAgICAxNjMsICAgICA4MSwgICAgMTY3LCAgICAtODMsICAgLTEwMSwgICAgIDU1LCAgICAtNDAsCisgICAgICAgMTYxLCAgIC03OTMsICAgICAtOCwgICAgICAwLCAgICAgIDAsICAgICAtMSwgICAgIC0xLCAgICAgIDAsCisgICAgICAtMTAyLCAgICAtMzMsICAgICA1NSwgICAtMTMxLCAgICA0MzQsICAgIDEwOCwgICAgIDcwLCAgICAgNjgsCisgICAgICAgIDYyLCAgIDE5MTMsICAgLTEwOSwgICAgMjM1LCAgICAxMTAsICAgIDEyNCwgICAgLTI1LCAgICAtNTgsCisgICAgICAgLTc2LCAgICAgMTgsICAgICAtMSwgICAgIC0xLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAtMTA1LCAgLTczMjIsICAgICAtOSwgICAgIDgyLCAgICAgNTMsICAgIC00MywgICAgIC01LCAgICAgMTgsCisgICAgICAgIDkwLCAgICAgOTEsICAgICAyMCwgICAgLTM0LCAgICAgMjYsICAgIC05MywgICAgLTUwLCAgICAtNDYsCisgICAgICAgLTc3LCAgICAxMDUsICAgICAgMCwgICAgICA2LCAgICAtMTIsICAgICAtNiwgICAgICAxLCAgICAgIDAsCisgICAgIC0xMzM0LCAgICA5ODAsICAgLTE2MywgICAtMzUxLCAgIC01MTQsICAgIDUzNywgICAgIDYyLCAgIC0zMDAsCisgICAgICAgIDgwLCAgIC0zMTgsICAgICAxNCwgIC0zNTcwLCAgICAtNTIsICAgLTExNiwgICAtMjgwLCAgICA1NDAsCisgICAgICAgMjUwLCAgIC03NzUsICAgICAtNywgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgNTA3LCAgICAzMTcsICAgLTQxNywgICAtMjM2LCAgLTI0MzgsICAgIC03MiwgICAtMzQ2LCAgIDI1MDcsCisgICAgICAgMzAyLCAgIC0xODUsICAgICAzMCwgICAxNTM5LCAgICAyMDUsICAgICA4NywgICAtMTEyLCAgIC00ODIsCisgICAgICAtMjk2LCAgICAxMzIsICAgICAtMSwgICAgICAwLCAgICAgLTEsICAgICAgMSwgICAgICAwLCAgICAgIDAsCisgICAgICAgLTY0LCAgIC0yMDgsICAgLTE1OSwgICAgICAxLCAgICAzMzYsICAgIC02MiwgICAgLTE0LCAgICAgMTMsCisgICAgICAgIDgxLCAgICAxMDEsICAgIDM4MiwgICAgIDMyLCAgICAxMTYsICAgICAtNSwgICAgLTQxLCAgICAgMjUsCisgICAgICAtMTc1LCAgLTc4MjksICAgICAgMSwgICAgICAwLCAgICAgIDEsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICA3NTUxLCAgICAgLTcsICAgICA4NiwgICAtMTY1LCAgICAtNTcsICAgIC0xNywgICAgMTgzLCAgIC0yMDcsCisgICAgICAgIDY5LCAgICAgNTQsICAgIC05OSwgICAgLTI1LCAgICAxNjcsICAgIC01OCwgICAgMTA3LCAgICAtODEsCisgICAgICAgMTY1LCAgICAxNzIsICAgICAgMiwgICAgIC0yLCAgICAgIDAsICAgICAgMSwgICAgICAwLCAgICAgLTksCisgICAgICAgIDI2LCAgICAgMjgsICAgICA4NiwgICAtMTgzLCAgIC0zMjAsICAgIC0zMiwgICAgMTE2LCAgICAtNTMsCisgICAgICAgLTQ5LCAgICAtMTUsICAgIDEzMywgICAtMjgzLCAgIC0xNTIsICAgIDU3NiwgICA2NjMwLCAgICAxODUsCisgICAgICAgIDQ0LCAgICAgMjUsICAgICAyMCwgICAgICAxLCAgICAtMTIsICAgICAgMSwgICAgIC0xLCAgICAgIDAsCisgICAgICAtMTQ1LCAgICAtNTEsICAgLTExNCwgICAgLTI5LCAgIC0yMjgsICAgICA3OCwgICAtNDA5LCAgICAyMzUsCisgICAgICAgMTQ3LCAgICAgNDUsICAgLTE5MiwgICAgMTc3LCAgICAtOTEsICAgICA2OCwgIC0yNTcyLCAgICAtNTIsCisgICAgICAgIDgxLCAgICAxODEsICAgICAtNSwgICAgIDEzLCAgICAgLTEsICAgICAtMSwgICAgLTE3LCAgICAgIDAsCisgICAgICAgLTY1LCAgICAtMjMsICAgIC0yOCwgICAgICA5LCAgICAyNDIsICAgICAxNCwgICAgLTM1LCAgICAgODgsCisgICAgICAgIDc3LCAgICAtMjAsICAgICAzNywgIC03MDk3LCAgICAtNTgsICAgICA1MSwgICAgMTM3LCAgICAxMjYsCisgICAgICAgLTkwLCAgICAxMzYsICAgICAgMCwgICAgICA0LCAgICAgLTEsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAtMjY2LCAgICAtODIsICAgLTIwNSwgICAgODE2LCAgIC0zMDksICAgMzI2NywgICAxMDUzLCAgICAzNjksCisgICAgICAtMjE2LCAgIC0zMDIsICAgICAxOCwgICAgMTY4LCAgICAzOTUsICAgIDI3MywgICAgMzQzLCAgICAyNDMsCisgICAgICAgLTk4LCAgICAtNTMsICAgICAgMSwgICAgICAwLCAgICAgIDAsICAgICAgMSwgICAgICAwLCAgICAgIDAsCisgICAgICAgLTY1LCAgICAtNzYsICAgMTg1MCwgICAtOTkxLCAgIC00NTQsICAgLTUzNSwgICAyOTI3LCAgIC0xNDUsCisgICAgICAgMTAxLCAgICAgMjMsICAgICAyMCwgICAgMjM0LCAgICAtNzQsICAgICA3NywgICAgMTE0LCAgICAgIDQsCisgICAgICAtMTA2LCAgICA1MjcsICAgIC0xMSwgICAgICA0LCAgICAgIDAsICAgICAgMSwgICAgIC0xLCAgICAgIDAsCisgICAgICAgNTczLCAgICAtNDYsICAgIDIwNywgICAyNjQwLCAgIC05NTYsICAgICA0NywgICAgIDI2LCAgICAtMTAsCisgICAgICAgMzE3LCAgIC0yMTcsICAgICAtNSwgICAtODY3LCAgICAgLTMsICAgIDIxMywgICAgIDUyLCAgICAgNTMsCisgICAgICAtNDI4LCAgIC0xNzUsICAgICAgMCwgICAgICAwLCAgICAgLTEsICAgICAtMSwgICAgICAwLCAgICAgLTEsCisgICAgICAtMjIzLCAgICAtNTUsICAgIDEzNSwgICAgMTg0LCAgICAzMTMsICAgICAgMCwgICAyODY4LCAgICAyNDUsCisgICAgIC0zMTg3LCAgIC03MjEsICAgLTI5MSwgICAgICA5LCAgIC0yNjUsICAgLTEyMCwgICAtMTA1LCAgICAtMzYsCisgICAgICAgNDU0LCAgICAgNTUsICAgICAtMSwgICAgIDQ5LCAgICAgIDAsICAgICAgMSwgICAgIC0xLCAgICAgIDAsCisgICAgICAtMjkxLCAgICAgNDEsICAgICA4NCwgICAgNTU3LCAgIC0yMDEsICAtMjMwMCwgICAgNDI5LCAgICAyODMsCisgICAgICAgIDIxLCAgICAgLTIsICAgIDEzMiwgICAgMjg2LCAgIC0xMjQsICAgIDE0OSwgICAgLTE0LCAgICAxNDYsCisgICAgICAgMzIwLCAgIC0yOTgsICAgICAgMCwgICAgIC0xLCAgICAgIDEsICAgICAtMiwgICAgICAwLCAgICAgIDAsCisgICAgICAgLTg2LCAgLTM0OTMsICAgIDEzMSwgIC0zNTgxLCAgICAxODUsICAgICAyNiwgICAtMTk3LCAgICAtNjUsCisgICAgICAgLTk2LCAgICAxNDcsICAgIC01MywgICAtMTUwLCAgICAtMzUsICAgIC0zNSwgICAgMTc5LCAgICAgNjgsCisgICAgICAtMTU3LCAgICAgIDAsICAgICAgMCwgICAgICAyLCAgICAgIDAsICAgICAgMSwgICAgICAyLCAgICAgLTEsCisgICAgICAgLTIyLCAgIC0yMTgsICAgICAxMywgIC0xNDQ3LCAgIC00MDAsICAgIDI4OCwgIC0xMjk1LCAgICAgIDAsCisgICAgICAtMTE5LCAgICAgNjksICAgIC01NiwgICAtMTM5LCAgICAxNTcsICAgIC0yNiwgICAtMTIyLCAgICAtNjEsCisgICAgICAgLTM4LCAgIC0xMDgsICAgICAtMSwgICAgICAxLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAtMjI5LCAgIDMzMzUsICAgIDEwMywgICAtMTA4LCAgICAgMTAsICAgMzAwOCwgICAtNzEyLCAgICAgNTAsCisgICAgICAgIDI3LCAgICAxNTIsICAgLTMwNywgICAtMTA2LCAgICAxNDgsICAgIC03NywgICAtMTc4LCAgICAtNDYsCisgICAgICAgICA3LCAgIC0xMTQsICAgICAgMCwgICAgIC05LCAgICAgIDAsICAgICAgMCwgICAgICAxLCAgICAgIDAsCisgICAgICAgOTMyLCAgIC00NDMsICAgIDMxMSwgICAgLTc1LCAgICAgNjIsICAgIC04MCwgICAtMTc5LCAgICA0NTksCisgICAgICAtMjMyLCAgIC0xNjAsICAgICAgMiwgICAgMTY5LCAgICAxMzQsICAgLTI2MCwgICAgIDQxLCAgIC0xNDksCisgICAgICAgIDIzLCAgICAgOTIsICAgICAtMiwgICAgICAwLCAgICAgMTEsICAgICAgMSwgICAgICAwLCAgICAgIDAsCisgICAgICAgIDE2LCAgICAtOTAsICAgLTU3NCwgICAtMTcxLCAgICAxNjMsICAgIDI2MSwgICAtMjk5LCAgIDI5OTQsCisgICAgICAgIDc0LCAgLTM4MTgsICAgLTM5NiwgICAtMTcxLCAgICAgMTMsICAgIC0yOSwgICAgLTQ1LCAgIC0xNjgsCisgICAgICAtMjg3LCAgIC0zOTAsICAgICAgMSwgICAgICAwLCAgICAgIDAsICAgICAtNCwgICAgICAwLCAgICAgLTEsCisgICAgICAgIDg5LCAgIC03MDIsICAgMjIyMywgICAgMTAxLCAgIC0yNDksICAgMjk4MywgICAgIDM2LCAgIC0zMzMsCisgICAgICAtMzgyLCAgICA0MTAsICAgLTI2MiwgICAgMTg1LCAgIC0xNDYsICAgICA5OCwgICAgIC04LCAgIC0zMTcsCisgICAgICAtMjc5LCAgIC04NzksICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICA0LCAgICAgIDAsCisgICAgICAgLTk4LCAgIC0zMjUsICAgICA3NSwgICAtMjI5LCAgICAtMTMsICAgIDExMiwgIC01NzQzLCAgICAtMzQsCisgICAgICAgLTg5LCAgICAyNjMsICAgLTE1NSwgICAgIDgwLCAgICAxNDAsICAgIC01MCwgICAgIDMzLCAgICAxNDMsCisgICAgICAgLTYwLCAgICAtNzcsICAgICAgMSwgICAgIC0yLCAgICAgIDAsICAgICAtMSwgICAgICAxLCAgICAgIDAsCisgICAgICAgIDUyLCAgIC01NzYsICAgLTU0MywgIC0xMTQyLCAgIC05NDcsICAgLTE4NCwgICAgNDQ5LCAgICAtNzEsCisgICAgICAgLTc1LCAgIC0xNTYsICAtMzQxMiwgICAgLTUwLCAgIC00ODcsICAgIDMwNywgICAgNjYzLCAgLTEwMDAsCisgICAgICAtNDE1LCAgLTIzNDgsICAgICAtNywgICAgIC0xLCAgICAgLTEsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgIDY0LCAgICAgIDMsICAgIC0zNSwgICAgIDExLCAgICAgMTQsICAgLTE5OCwgICAgIC0yLCAgLTgwNDIsCisgICAgICAgMTQwLCAgICAtMTEsICAgIC05MywgICAgIDI5LCAgICAtNjUsICAgIDMzMCwgICAgIDM0LCAgICAxMTAsCisgICAgICAgLTE5LCAgIC0xMzcsICAgICAgMiwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAxMjM2LCAgICAzMDMsICAgMjY4MSwgICAgMjM0LCAgIC0yMTcsICAgLTQwNiwgICAtMzk1LCAgIC0zODAsCisgICAgICAgMjQ3LCAgICAzNDksICAgLTEwMSwgICAgLTMzLCAgICAzNzAsICAgIC0zOSwgICAgMTM5LCAgICAgNTksCisgICAgICAgIDE4LCAgICAgMjQsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgMTY2LCAgICAtMjEsICAtNTM5MiwgICAtMTE3LCAgIC0yOTYsICAgIDExNCwgICAgMjMwLCAgIC0yNTUsCisgICAgICAgMTMxLCAgICAtNTMsICAgICAxMywgICAgLTQ1LCAgICAyMDAsICAgICAgNywgICAgLTU2LCAgICAgODcsCisgICAgICAgIDQ2LCAgICAyMjMsICAgIC01OSwgICAgICAwLCAgICAgLTEsICAgICAgMCwgICAgICAwLCAgICAgLTEsCisgICAgICAgMjE0LCAgIC01MTEsICAgIDE3NSwgICAgMjA0LCAgIC0xMjMsICAgIC00NywgICAtNDQwLCAgICAgIDYsCisgICAgICAgIDIzLCAgICAgOTIsICAgLTM1NSwgICAgIDgwLCAgLTQ4ODUsICAgLTIzOCwgICAgLTM3LCAgICAgNzgsCisgICAgICAtMjE4LCAgICAxNzUsICAgICAgMCwgICAgICAyLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAtMTQ2LCAgICAgNzQsICAgIC0xMywgICAgIC00LCAgICAgMjcsICAgIC00NSwgICAgIDUxLCAgICAgODEsCisgICAgICAgLTgwLCAgICAgNTMsICAgIC0xOCwgICAgMTczLCAgIC0xNDYsICAgIC02NCwgICAgIC04LCAgIDgxOTIsCisgICAgICAgIDc5LCAgICAgMTUsICAgICAgMCwgICAgIC0zLCAgICAgIDAsICAgICAgMSwgICAgICAwLCAgICAgIDAsCisgICAgICAgIC0zLCAgICAtMTYsICAgIC0yOCwgICAgMjg4LCAgICAtNjEsICAgICAgNCwgICAtMTg3LCAgICAgIDYsCisgICAgICAgIC01LCAgICAtMTQsICAgICA3NywgICAgLTEyLCAgICAtNTMsICAgICAxNiwgICAgLTQxLCAgICAgLTcsCisgICAgICAgLTEwLCAgICAgLTIsICAgICAgNywgICAgIC0xLCAgICAgLTksICAgICAgMSwgICAgICAwLCAgICAgIDAsCisgICAgICAtMjg1LCAgICAtMzUsICAgICAtOCwgICAgMjIxLCAgICAtNjgsICAgIDExNCwgICAgMTM1LCAgICAgLTgsCisgICAgICAtMjAzLCAgIC0xODEsICAgIC05MSwgICAyMDQzLCAgICAtNTgsICAgIDEyNywgICAgMjAxLCAgICAxMTEsCisgICAgICAgIDQ2LCAgIC0zNDQsICAgIC0xMSwgICAgLTQ5LCAgICAgIDAsICAgICAgMSwgICAgICAwLCAgICAgLTEsCisgICAgICAtMTYwLCAgIC0xODYsICAgICA1OCwgICA0NzYxLCAgICAyODksICAgICA1MSwgICAtMTQ1LCAgICAgNTEsCisgICAgICAgLTMyLCAgICAgNzEsICAgICA2MiwgICAgMTc1LCAgICAtMTMsICAgIDE4MSwgICAgMjAzLCAgICAxNDEsCisgICAgICAtMjAwLCAgICAxMDYsICAgICAtMSwgICAgICA0LCAgICAgLTIsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgODAzLCAgICAtNzYsICAgIC05NiwgICAtOTQwLCAgICAzMDAsICAgMzQyOSwgICAgLTg0LCAgIDMwMzcsCisgICAgICAgMjYyLCAgICAgLTksICAgIC0zOSwgICAgMTIwLCAgIC02MjksICAgLTMwOSwgICAgMjMzLCAgIC0zNzQsCisgICAgICAgMzk4LCAgICA4OTQsICAgIC0xMiwgICAgICAxLCAgICAgIDEsICAgICAgMSwgICAgICAwLCAgICAgIDAsCisgICAgICAtMjgyLCAgIDI1MjUsICAgIC0zMSwgICAtMTc2LCAgLTI0NzMsICAgICA1MywgICAgMTAyLCAgIC02MTAsCisgICAgICAgMTgwLCAgIC0xNDUsICAgICA0MiwgICAgLTUxLCAgICAyMjMsICAgICAyNywgICAgLTY5LCAgICA3MjcsCisgICAgICAgLTE0LCAgICAtNTEsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAtMywgICAgICAwLCAgICAtNDAsCisgICAgICAgMjE0LCAgICAgNzIsICAgICA0MSwgICAgICAxLCAgICAxOTAsICAgICA3OCwgICAtMjI4LCAgIC0yMzUsCisgICAgICAgMTA1LCAgLTQ2MTksICAgLTE0MCwgICAgLTQ2LCAgICAgLTcsICAgICA0OSwgICAgICA5LCAgICAtMTksCisgICAgICAgMTM3LCAgICAgLTIsICAgICAgOSwgICAgICAxLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAtMTQyLCAgIC0yNjIsICAgICAyOSwgICAtMTQyLCAgICAgMzksICAgIC0zOSwgICAgLTkyLCAgICAgOTUsCisgICAgICAgIDUwLCAgIC0yODIsICAgICAgMiwgICAtMTA2LCAgICAxMTQsICAgICAgOCwgICAgIDM1LCAgICAgNzgsCisgICAgICAtMTIxLCAgIDI1ODksICAgICAgMSwgICAgIC00LCAgICAtMTAsICAgICAgMSwgICAgICAxLCAgICAgIDAsCisgICAgICAtMTkyLCAgICAgNTksICAgIDI4NywgICAgNDAwLCAgICAtNjcsICAtNjk4OSwgICAtMzAxLCAgICA0NDYsCisgICAgICAgMTE1LCAgICAgIDcsICAgICAzMywgICAgLTYwLCAgICAxMTEsICAgIDEwMiwgICAgICA4LCAgICAyMDYsCisgICAgICAgIDQ2LCAgICAtMzEsICAgICAtMSwgICAgIC0xLCAgICAgLTIsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAtMTA0LCAgICAzMzIsICAgLTIyMywgICAxMDY2LCAgIC0xODgsICAgMTI3MCwgICAtMjIyLCAgICAzMDksCisgICAgICAtMjk2LCAgICAyNTksICAgIDc4MCwgICAtNDYwLCAgLTE5MTQsICAgIDIxOCwgICAtNTU2LCAgICAyMTAsCisgICAgICAyOTYyLCAgICAxMzAsICAgICAgMSwgICAgIC0yLCAgICAgIDIsICAgICAgMCwgICAgICAxLCAgICAgIDAsCisgICAgICAtMzIwLCAgIC0zNjUsICAgLTI2NiwgICAgODIyLCAgIC0xMTksICAgIDgyNCwgICAtMzEyLCAgICAgNTgsCisgICAgIC0xODU3LCAgICAyMzUsICAgICA0OCwgIC0zOTg1LCAgICAxMTgsICAgLTMwNywgICAtNzAzLCAgIC05MzEsCisgICAgICAtNTYwLCAgICAxMDUsICAgICAtMiwgICAgIC0zLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDEsCisgICAgICAgMTU2LCAgICAtNDgsICAgIDE4NywgICAgMjE0LCAgIC0yMTIsICAgIDE4MCwgICAgMzQyLCAgICAzNzMsCisgICAgICAxOTczLCAgICAxMjgsICAgICAtNSwgICAgMTQ2LCAgICAtNDAsICAgIC0xMSwgICAgIDcxLCAgICAtNjAsCisgICAgICAgIDc2LCAgICAgMTcsICAgICAgMCwgICAgICAwLCAgICAgLTEsICAgICAgMiwgICAgICAwLCAgICAgIDcsCisgICAgICAgMjE0LCAgICAgNjMsICAgIDI3NCwgICAyODc2LCAgICAtNjUsICAgIDMxNCwgICAgNDAwLCAgICAzNDQsCisgICAgICAgMTQwLCAgICAgMzksICAgIDE5MywgICAtMjI2LCAgICAxMjQsICAtMzE3NywgICAgIDY4LCAgICAgNDYsCisgICAgICAgLTYwLCAgIC0zMTcsICAgICAgMiwgICAgICAwLCAgICAgLTEsICAgICAgMCwgICAgICA3LCAgICAgIDAsCisgICAgICAtMTYwLCAgICAxMTgsICAgIDIzMywgICAgMjM5LCAgIC00NjUsICAgICA5NiwgICAgMjUzLCAgIDMxNzgsCisgICAgICAgLTg4LCAgICAyOTksICAgIDM2OCwgICAtMjIwLCAgICAxOTcsICAgIDM5NywgICAtMzUzLCAgIC00NjMsCisgICAgICAtMjAyLCAgIC0xMDMsICAgICAtNCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgNjg3LCAgIC00NDgsICAgLTc0OSwgICAgIDg3LCAgICAtMzUsICAgIDExMiwgICAgMzA5LCAgICAtMzMsCisgICAgICAgLTE2LCAgICAgODgsICAgIDE0MSwgICAgIDYzLCAgICAtNTEsICAgIDI3NCwgICAtMTEzLCAgICAtNzYsCisgICAgICAgIDQ2LCAgIC0yNzMsICAgICAtMSwgICAgICAxLCAgICAgIDAsICAgICAgMSwgICAgICAwLCAgICAgIDEsCisgICAgICAtMjk4LCAgIC0yMDYsICAgIDY3MCwgICAgMzAzLCAgIC00NTEsICAgLTI3NywgICAtNDkzLCAgICA0MDQsCisgICAgICAtMTczLCAgICAyODQsICAgIDE0OCwgICAgNjI2LCAgIC0zMjIsICAgLTI5NiwgICAgLTY4LCAgIDMwNDQsCisgICAgICAtNDQyLCAgIDExMzgsICAgICAtNywgICAgICAyLCAgICAgIDAsICAgICAgMSwgICAgICAwLCAgICAgIDAsCisgICAgIC0xMzM4LCAgICAgMTgsICAgMjg2MiwgICAgMjIzLCAgICAyNTAsICAgIDI2MCwgICAgMTQ0LCAgICAyNTksCisgICAgICAgLTM4LCAgIC02NDcsICAgIDYwMiwgICAtMTYwLCAgICAgNzUsICAgICAtNSwgICAgIC04LCAgICAgMzQsCisgICAgICAgMjM3LCAgICAgNTAsICAgICAgMiwgICAgICAwLCAgICAgIDEsICAgICAtMSwgICAgIC0xLCAgICAgIDAsCisgICAgICAtNDEyLCAgIDIxNTMsICAgIDkzMywgICAgNDc4LCAgICA3NjgsICAgIDE4NiwgICAtNDI0LCAgIC02NTcsCisgICAgIC0zNDU4LCAgIC00NDMsICAgIDI5NCwgICAgMjI0LCAgIC00NjgsICAgIC01OCwgICAtMTIwLCAgLTE1NjUsCisgICAgICAgMjExLCAgIC00MjAsICAgICAgMCwgICAgICAwLCAgICAgIDEsICAgICAtMSwgICAgICAwLCAgICAgIDAsCisgICAgICAgMTk4LCAgICAyMjcsICAgLTExMiwgICAgMzUwLCAgICAyOTcsICAgLTMwMywgICAgMTA4LCAgIC0xOTIsCisgICAgICAgMTUzLCAgICAgMzIsICAtMjcxNywgICAtMTExLCAgLTEwOTMsICAgLTIwMCwgICAgNDc2LCAgICAzMjYsCisgICAgICAtMjcxLCAgICA2MjcsICAgICAgMCwgICAgIC00LCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgLTEsCisgICAgICAgNDYyLCAgIC02MTYsICAgIDEyNiwgICAgMzE2LCAgLTI0MTMsICAgIDIwNCwgICAtMzUwLCAgLTM1NDksCisgICAgICAtMjYzLCAgIC0zODYsICAgLTExMiwgICAgNDgzLCAgLTEzMzksICAgIDYzNiwgICAgIDcwLCAgIC01MzEsCisgICAgICAgIDk2LCAgICAgMzgsICAgICAgOCwgICAgIC0xLCAgICAgIDAsICAgICAtMywgICAgICAwLCAgICAgIDAsCisgICAgICAtMzEwLCAgLTExMjgsICAgIDYxNiwgICAtMzM5LCAgIC0xNjgsICAgLTEyNCwgICAtOTA1LCAgIC0xNTEsCisgICAgICAtMzgzLCAgICAgNzYsICAgIDEzNywgICAgLTQ0LCAgIDM2ODksICAgLTM4OCwgICAgMTg0LCAgIDE3OTksCisgICAgICAtMTAyLCAgIC05MzAsICAgICAgNiwgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgICAwLCAgICAgIDAsCisgICAgICAtMjg0LCAgICAyODAsICAgICAzOSwgICAtNzI4LCAgICAxNDMsICAgICAxNSwgICAgMTgxLCAgICA3OTgsCisgICAgICAgMzgyLCAgICAgMTAsICAgMjI2NywgICAgLTEyLCAgLTM1ODIsICAgIC0yNywgICAgMzU3LCAgICA1MTQsCisgICAgICAtNTY1LCAgIC0xMjEsICAgICAgMCwgICAgIC0xLCAgICAgIDAsICAgICAtOSwgICAgIC0xLCAgICAgIDAsCisgICAgICAgNDI5LCAgICAtMTYsICAgMjk5MywgIC0yOTAzLCAgICAgNDcsICAgLTEzNiwgICAgIDMwLCAgICA3OTIsCisgICAgICAtMzI3LCAgIC0zNDcsICAgIC02OSwgICAgLTUwLCAgICAtOTMsICAgLTIyMywgICAtNDM4LCAgICAxNTgsCisgICAgICAgMjAzLCAgIC00NzUsICAgICAgMCwgICAgIC00LCAgICAgLTEsICAgICAgMiwgICAgICAwLCAgICAgIDAsCisgICAgIC0zNDY1LCAgICA0MTUsICAgLTk2MywgICAgMjUyLCAgICAzOTcsICAgLTk0NSwgICAtNDQ4LCAgIC0yMzEsCisgICAgICAtMTMwLCAgICA2NzMsICAgIDUwNCwgICAgIDU1LCAgIC0zNTUsICAgIDIyMSwgICAgIDI5LCAgICAxNjcsCisgICAgICAgLTE5LCAgICAxMzQsICAgICAtMSwgICAgIC0xLCAgICAgLTQsICAgICAgMCwgICAgLTE0LCAgICAgLTIsCisgICAgICAgIDQ0LCAgICA0MzMsICAgLTUzNSwgICAtMjE2LCAgIDI0ODUsICAgICAzMywgICAgIDE5LCAgIC0xMDAsCisgICAgICAtMTg1LCAgIC0xNzEsICAgICA5MSwgICAgMzM2LCAgIC0yMDgsICAgIDE0MCwgICAgIC0zLCAgICAgNDYsCisgICAgICAgLTY3LCAgIC0xMTYsICAgICAzMiwgICAgICAwLCAgICAgIDUsICAgICAgMywgICAgICAwLCAgICAgIDAsCisgICAgICAgMjIwLCAgICAgOTEsICAgIC02NSwgICAgLTE1LCAgIC0xNjksICAgIDIxNywgICAtMTgzLCAgIC0xNjksCisgICAgICAgLTQ3LCAgICAxODEsICAgLTI3MiwgICAgMTM4LCAgIC0xNjYsICAgIDExMCwgICAgIC05LCAgICAgNDEsCisgICAgIC02OTU3LCAgICAgMzMsICAgICAtNSwgICAgIC0yLCAgICAgIDEsICAgICAgMSwgICAgICAwLCAgICAgLTEsCisgICAgICAgMTY0LCAgLTQwNjIsICAgLTEwOSwgICAgMjMwLCAgIC0yMjAsICAgMTc0OCwgIC0xMzM4LCAgIC0yNDYsCisgICAgICAtMjQyLCAgICAtOTgsICAgIDMwMCwgICAgMjE3LCAgIC0yMDIsICAgLTEzMCwgICAgMTU3LCAgICAgLTMsCisgICAgICAgLTE5LCAgIC00NTMsICAgICAgMCwgICAgICAyLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjA4MDZzbDFbXSA9IHsKKyAgICAgICAgNzUsICAgICA4NywgICAgLTMxLCAgICA2MDcsICAgLTEzMiwgICA1OTYzLCAgIC0yNjIsICAgIDQ5NCwKKyAgICAgICAxMzQsICAgICAtNCwgICAgMTQxLCAgICAgMTksICAgIDIyNSwgICAgMjI5LCAgICAyMzksICAgICA5MywKKyAgICAgICAtMjAsICAgLTE4OSwgICAgICAyLCAgICAgIDAsICAgICAtMywgICAgIC0xLCAgICAgLTEsICAgICAgMCwKKyAgICAgICAyMTQsICAgLTIwNiwgICAgODc3LCAgICAgODMsICAgLTU4OCwgICAgIDgzLCAgICAxMzIsICAgICA3OCwKKyAgICAgICAgIDUsICAgIC04NSwgICAgIDY2LCAgICAtMjQsICAgICA0NywgICAgLTExLCAgICAgMjUsICAgICAyNiwKKyAgICAgICAgLTMsICAgICA0NiwgICAgICAyLCAgICAgLTUsICAgICAgMCwgICAgICAxLCAgICAgLTEsICAgICAgMCwKKyAgICAgIC0xMTMsICAgIDI5NSwgICAgLTgxLCAgICAgNzQsICAgIDIyMywgICAgLTUwLCAgICAtOTMsICAtNTY3MSwKKyAgICAgICAtMjgsICAgIDExNSwgICAgMjU2LCAgIC0yMjgsICAgIC0zMSwgICAtNTM5LCAgICAzMDAsICAgLTI3OCwKKyAgICAgICAtNTksICAgIDQyNiwgICAtMTEwLCAgICAgLTEsICAgICAgMSwgICAgICAxLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAtOTUsICAgLTExNiwgICAgMjY2LCAgICAxNzYsICAgIDc2MSwgICAgIC0zLCAgICAgOTAsICAgIC05MSwKKyAgICAgICAgOTgsICAgLTIwOSwgICAtNDE0LCAgICAtMjcsICAgIC01NiwgICAgIDI2LCAgICAtNzYsICAgICAgNiwKKyAgICAgICAtMzIsICAgNDYzNCwgICAgICAxLCAgICAgIDAsICAgICAtNCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAxNzcsICAgIDE0NywgICAtMjM2LCAgICAtOTMsICAtNzkyNSwgICAgIDExLCAgIC0xMTEsICAgIC03NCwKKyAgICAgICAgMzYsICAgIDE3NiwgICAgMzUyLCAgICAgODgsICAgIDExMiwgICAgIDE2LCAgICAxNDQsICAgLTExMCwKKyAgICAgICAgOTEsICAgIDMyOSwgICAgIC0xLCAgICAgIDIsICAgICAgMCwgICAgICAxLCAgICAgIDAsICAgICAgMSwKKyAgICAgICAxMTksICAgIDMwNCwgICAgLTk0LCAgIC00MjIsICAgIDExMywgICAgMTI5LCAgICAtNzAsICAgIDE1NSwKKyAgICAgICAyNDcsICAgLTExNiwgICAtMTM5LCAgICAzMjcsICAgLTM1NSwgICAgIDc3LCAgICAxNDMsICAtNTM2MiwKKyAgICAgICAgMjcsICAgLTM3NywgICAgIC0xLCAgICAgIDcsICAgICAgMiwgICAgICAxLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAxNzksICAgIDEyNywgICAxNTAwLCAgIC0zMjQsICAgIC0xNSwgICAgNjczLCAgICAxODQsICAtMTM4MiwKKyAgICAgICAxNjcsICAgMTgzMywgIC0zMDU4LCAgICAyMDAsICAtMTIwMywgICAgNDU5LCAgLTE5MDUsICAgMTAyMCwKKyAgICAgIC0yNTksICAgLTEyMCwgICAgIDEwLCAgICAgLTQsICAgICAgMCwgICAgICAxLCAgICAgIDAsICAgICAgMCwKKyAgICAgICA5OTUsICAgLTExMiwgICAgIDM3LCAgIC0xNjAsICAgIC0yMSwgIC00MDExLCAgICAxNzIsICAgIDIyOCwKKyAgICAgIC0yMTAsICAgICA4MCwgICAtMTMxLCAgICAgIDEsICAgICAyMCwgICAtMTI4LCAgIC0yNTIsICAgLTI4OCwKKyAgICAgIC0xMzIsICAgIDMzNywgICAgIC0xLCAgICAgIDAsICAgICAtMSwgICAgICAwLCAgICAgIDEsICAgICAtMSwKKyAgICAgICAtNjAsICAgICA2MSwgICAgMTk3LCAgIC0xODUsICAgIC00MCwgIC0yOTUxLCAgIC01OTIsICAgIC01NywKKyAgICAgICAyMTAsICAtMzI0OCwgICAtMjI2LCAgICAtNDQsICAgIDM5MSwgICAtMTY3LCAgICAgLTcsICAgIDIxOSwKKyAgICAgICAtMTUsICAgIDE3MiwgICAgICAwLCAgICAgLTEsICAgICAgMSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAxMDYsICAgIC03MCwgICAtMjkxLCAgICAxOTIsICAgICA0NSwgICAgMTYyLCAgICAgMzcsICAgIDE0MywKKyAgICAgICAgOTEsICAgICAyMSwgIC03MDMyLCAgICAgMTIsICAgLTE3MywgICAgLTMwLCAgICAgIDEsICAgIDI1OSwKKyAgICAgIC0yODYsICAgIDM4NywgICAgLTM2LCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgLTE1OTMsICAgLTIxMCwgICAgIDgzLCAgICAgNDcsICAgIDE5NCwgICAgIDYxLCAgICAgODUsICAgLTE4MiwKKyAgICAgICAtMjMsICAgICA0MCwgICAgLTc0LCAgICAgMjIsICAgICAxMiwgICAgMjE2LCAgICAgNTksICAgLTE2NSwKKyAgICAgIC0xNjMsICAgLTE1OSwgICAgIC04LCAgICAgIDAsICAgICAgMCwgICAgICAyLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgLTMsICAgIDE4MiwgICAgLTgwLCAgIDIwNjgsICAgIDcwMiwgICAgMTE1LCAgIC0xNjQsICAgIC04NSwKKyAgICAgICAgMjEsICAgLTEyNCwgICAtMTkxLCAgIC0xMTMsICAgIDI2MywgICAgMTM4LCAgIDQyMzUsICAgICAzNywKKyAgICAgICAyMDQsICAgLTQzNiwgICAgICAwLCAgICAgMjQsICAgICAgMSwgICAgIC0xLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAxNDcsICAgICA4MywgICAtMTc3LCAgIC0xNjgsICAgLTYwOSwgICAgIC05LCAgICAtMTYsICAgIC00NiwKKyAgICAgICAxMjcsICAgIDEyMCwgICAgLTI1LCAgIDM0MzUsICAgICA1MSwgICAgIDMxLCAgICAgNDksICAgIDM2NiwKKyAgICAgICAgMzEsICAgLTEyOSwgICAgICAxLCAgICAtMzIsICAgICAgMCwgICAgIC0xLCAgICAgIDAsICAgICAtMiwKKyAgICAgICAyOTUsICAgIDE1OCwgICAgMTE2LCAgICAgMTEsICAgLTI4MCwgICAgNDcxLCAgICAxNjksICAgICAyOSwKKyAgICAgLTI1ODksICAgIDMzOCwgICAgIDMyLCAgICAyOTksICAgIDE3MiwgICAtMTg3LCAgICAtMzIsICAgIDQzNywKKyAgICAgICAtMzgsICAgIDM1OSwgICAgIC0xLCAgICAgLTEsICAgICAgMSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAyNDMsICAgIDQxMywgICAgLTI5LCAgLTQ3NzQsICAgIDE4NywgICAgIDEyLCAgIC0xMTcsICAgIDE2OCwKKyAgICAgIC0xMTQsICAgLTIwOCwgICAgLTU1LCAgICAgIDUsICAgICAgMCwgICAgLTMxLCAgICA0MzYsICAgIDU0NSwKKyAgICAgICAtNDUsICAgIDI3MiwgICAgICAwLCAgICAgLTQsICAgICAgMCwgICAgICAwLCAgICAgIDEsICAgICAgMCwKKyAgICAgICAxMjcsICAgICAzOCwgICA2NjIwLCAgICAtMzMsICAgLTEwMywgICAgIDM0LCAgICAgODQsICAgIC0zNSwKKyAgICAgICAgMzAsICAgLTEzMSwgICAgIC04LCAgICAtNzksICAgLTEyNiwgICAgLTk4LCAgICAgMTcsICAgIC03NSwKKyAgICAgICAtMzEsICAgLTE3NiwgICAgIDE0LCAgICAgLTEsICAgICAgMCwgICAgICAwLCAgICAgLTEsICAgICAtMSwKKyAgICAgICAyNzMsICAgLTIxOSwgICAgMTc2LCAgICAtODMsICAgIDE4NywgICAgLTM2LCAgICAgIDEsICAgMjYzOSwKKyAgICAgICAxNTgsICAgMzgxMiwgICAgMTI3LCAgIC0yMzMsICAgIDE3NSwgICAgMzEwLCAgICAxNDgsICAgIDM4NywKKyAgICAgICAtMTQsICAgIDMwOCwgICAgICAwLCAgICAgLTMsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIDMzMjEsICAgLTQ0NywgICAgMTUzLCAgIC0xMjgsICAgIDI1NCwgICAtMjc1LCAgICAgNzksICAgLTE4MSwKKyAgICAgICAgMTcsICAgIDE0NiwgICAgIDYxLCAgICAgNDYsICAgIC00OCwgICAgMjUzLCAgICAgNTEsICAgIC0xNywKKyAgICAgICAgIDEsICAgICAgMSwgICAgICAwLCAgICAgIDEsICAgICAtMSwgICAgIC0yLCAgICAgIDAsICAgIC0xMywKKyAgICAgICA3OTEsICAgLTEzMCwgICAgIDQwLCAgICAgNzgsICAgIC02NCwgICAtMTc5LCAgICAgNDIsICAgLTQ1NSwKKyAgICAgICA0MjIsICAgIDExMiwgICAgLTE5LCAgLTQ0OTksICAgLTExMywgICAtMzQxLCAgICAgNTIsICAgICA2OSwKKyAgICAgICAgNjcsICAgIDI1NCwgICAgIC02LCAgICAgLTEsICAgICAgNCwgICAgICAwLCAgICAgIDAsICAgICAgMSwKKyAgICAgICAtOTgsICAgLTk3NiwgICAgIDY4LCAgIDE1NjMsICAgIDIyOCwgICAxMDE4LCAgICA0NTgsICAtMTAyMCwKKyAgICAgICA0MTEsICAgIDI0OSwgICAtNjI3LCAgIDIzMjEsICAgIDczOCwgICAtNDYwLCAgLTE0NjksICAgIDM2MiwKKyAgICAgICA4ODQsICAgLTI2MSwgICAgICAwLCAgICAgLTEsICAgICAgMSwgICAgICAxLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC02MDEsICAgIDM3OCwgICAgLTcxLCAgICAgNjEsICAgLTE2MCwgICAgODAwLCAgIC0zODYsICAgLTc3MywKKyAgICAgICAzMDMsICAgIC01MywgICAgMjQ4LCAgICAtMjIsICAgICA1OSwgIC0zODA5LCAgICAtNjEsICAgIDEwMiwKKyAgICAgICAtNDUsICAgIDM5NSwgICAgICAwLCAgICAgIDAsICAgICAyOCwgICAgICAwLCAgICAtMTIsICAgICAgMCwKKyAgICAgICA3MTcsICAgLTQyNCwgICAgNDk5LCAgICAyOTYsICAgIC0xNSwgICAgIDExLCAgIDI3MzIsICAgLTEwMywKKyAgICAgIC0xMTksICAgLTExNiwgICAgMTA3LCAgICAtNTAsICAgIDQ2MiwgICAgIDczLCAgICAtODIsICAgICA3NSwKKyAgICAgICAgNDEsICAgIDEzMSwgICAgICAwLCAgICAgIDMsICAgICAgMSwgICAgIC0xLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC0xMzQsICAgIDEwOSwgICAgIDQ4LCAgLTE4NDcsICAgLTIwNSwgICAgIC02LCAgICAgMjAsICAgLTIwMywKKyAgICAgICAxMzYsICAgIDE5NywgICAgMTEzLCAgICAtNzcsICAgLTEyNCwgICAgLTUwLCAgICAxODQsICAgIDIyNSwKKyAgICAgIC0xNzUsICAgLTI5NSwgICAgIC0xLCAgICAgLTEsICAgICAtNiwgICAgIC0xLCAgICAgLTEsICAgICAgMCwKKyAgICAgICAtNTksICAtMjAxNywgICAtMTkzLCAgIC0yMzcsICAgIDIyNiwgICAgNjMwLCAgIDE5NTAsICAgICAtMiwKKyAgICAgICAxNzksICAtMzY2NiwgICAgLTM0LCAgICAxNDAsICAgICA4OCwgICAgMTU3LCAgICAgNTEsICAgICA4MSwKKyAgICAgIC0yNjMsICAgLTE2OSwgICAgICAxLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAyMjksICAgIC0xNCwgIC0xNTkwLCAgIC0xMjMsICAgIDE2MiwgICAgIDYzLCAgIC0yMjQsICAgLTMzMiwKKyAgICAgICAxMTksICAgMjkzMSwgICAgIDIxLCAgICAtNDgsICAgIDQwNiwgICAgIDE1LCAgICAzMjAsICAgIC01MSwKKyAgICAgICAgNjQsICAgLTIyOCwgICAgIC05LCAgICAgLTEsICAgICAgMCwgICAgIC0xLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC00NTMsICAgICA4NCwgICAtMzIwLCAgIC02NTQsICAgICAtNCwgICAgLTkxLCAgICAtNjEsICAgIDU1OCwKKyAgICAgICAtNjEsICAgLTIzMywgICAgIDMxLCAgIC0yMjQsICAgLTEwNSwgICAgIDYzLCAgICAgODYsICAgMzc3MSwKKyAgICAgICAxNjIsICAtMTUzNSwgICAgICAzLCAgICAgLTMsICAgICAgMSwgICAgICAxLCAgICAgIDAsICAgICAgMSwKKyAgICAgLTE5OTIsICAgLTI3OSwgICAgLTU5LCAgLTMwNDgsICAtMTY5NiwgICAgMTAyLCAgIC0xNjgsICAgIDE5NCwKKyAgICAgICAxNzIsICAgLTE0MiwgICAgIDU1LCAgICAxMzQsICAgIDExNiwgICAtMTQ2LCAgICAtMjksICAgLTI4NywKKyAgICAgICAxMDIsICAgIDI2NSwgICAgIC0zLCAgICAgIDEsICAgICAgMCwgICAgICAxLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAtOTYsICAgICA0NiwgICAgLTE2LCAgIDI0NzQsICAgIC01OCwgICAtNzEyLCAgICAtMjUsICAgLTI5NCwKKyAgICAgICAxODcsICAgICAyMiwgICAgLTM5LCAgIC0xMDIsICAgICA2MiwgICAyNjY2LCAgIC0yMzcsICAgICAtMSwKKyAgICAgICAgMzIsICAgIC00MSwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC0yODIsICAgIC0yNSwgICAtMTk4LCAgIC04NjIsICAgLTEyNywgICAtMzc5LCAgIC0yMTAsICAgIC0yMCwKKyAgICAgICAgNDUsICAgIC03OSwgIC0yODA1LCAgIC0zNjQsICAgIDU3NSwgICAgMTA2LCAgICAyMTUsICAgLTQxMCwKKyAgICAgICAtNzYsICAgIDUxMSwgICAgIDE1LCAgICAtNDQsICAgICAtMSwgICAgICAxLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAzMjksICAgIDIyNCwgICAgMTMwLCAgICAgNDMsICAgICAtMSwgICAtMjU1LCAgICAtNTEsICAgLTI5NywKKyAgICAgIDQ1MjksICAgICA1MiwgICAgMTg2LCAgICA3NTcsICAgIC02OCwgICAgLTg5LCAgICAgNDYsICAgIDI1MCwKKyAgICAgICAgNDYsICAgIC03OSwgICAgICA1LCAgICAgIDEsICAgICAgMCwgICAgICAxLCAgICAgIDAsICAgIC0xOSwKKyAgICAgICAgNzksICAgICA3NCwgICAgIDY1LCAgICAyNTYsICAgIDI2MCwgICAgNDkyLCAgIC0xMDYsICAgLTIxNywKKyAgICAgIC0zNTcsICAgICAyMCwgICAgMTY2LCAgICAyMzMsICAgIDEzMiwgICAgMTY1LCAgICAgMTgsICAgICAtMSwKKyAgICAgIDQ0NDUsICAgIC0yMiwgICAgICA1LCAgICAgIDMsICAgICAtNywgICAgICAwLCAgICAgIDAsICAgICAtNiwKKyAgICAgIC05MjIsICAgMjE1NiwgICAgMjY5LCAgIDEzODUsICAgIDIzNSwgICAtMjA2LCAgICAtOTQsICAgIDEzMCwKKyAgICAgICAxMTIsICAgIDE0NSwgICAtMTI2LCAgICAxNjYsICAgICAgMSwgICAgIDQ1LCAgICAgODMsICAgICAzNiwKKyAgICAgIC0xNTMsICAgLTI1NSwgICAgICAwLCAgICAgLTEsICAgICAgMCwgICAgICAwLCAgICAgIDEsICAgICAgMCwKKyAgICAgICAyNDEsICAgLTIzNywgICAtMTE3LCAgIC01MTAsICAgICA4NSwgICAgICA3LCAgLTQ0MTgsICAgICAzMCwKKyAgICAgICAgOTQsICAgIC05MiwgICAgIDk5LCAgICAtNzEsICAgIDE0MCwgICAtMjY1LCAgICAxNDksICAgICA2OSwKKyAgICAgICAyODYsICAgIDEwNCwgICAgICAwLCAgICAgLTIsICAgICAgMSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC0xNjUsICAgICAyMiwgICAtMjQ1LCAgICAgMjksICAgICA1MCwgICAgMTQ1LCAgICAtNTMsICAgMTY0MSwKKyAgICAgICAtNDAsICAgLTEyOCwgICAtMTEyLCAgIC0xOTAsICAgICA0NywgICAgIDUzLCAgIC0yNDcsICAgIC01MCwKKyAgICAgICAgODgsICAgICAzOSwgICAgICAxLCAgICAgLTEsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC0yODgsICAgIDEzMCwgICAgIDg4LCAgIC0xMzIsICAgNDA1NSwgICAgIC03LCAgICAgNTUsICAgLTEwNSwKKyAgICAgICAyNzcsICAgICA4MSwgICAgIDY5LCAgICAtNjYsICAgIC01MywgICAgIDUyLCAgICAtNTYsICAgICA5MCwKKyAgICAgICAxNjAsICAgIDM4NiwgICAgICAxLCAgICAgLTQsICAgICAgMCwgICAgIC0yLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAxMDcsICAgIDEyNCwgICAgLTM5LCAgICAgNDAsICAgICAyNSwgICAgIC02LCAgIC0yNDgsICAgIC04MSwKKyAgICAgICAgNzAsICAgIC0xMywgICAgIDQ2LCAgICAgIDUsICAgICAyMCwgICAgIDI0LCAgICAgLTUsICAgICAtMiwKKyAgICAgICAtNDEsICAgIC0zNCwgICAgICAxLCAgICAgIDEsICAgICAtOCwgICAgICAwLCAgICAgLTQsICAgICAgMCwKKyAgICAgICAtNjEsICAgICAgMSwgICAgNDU3LCAgICA0NTQsICAgIDc2OCwgICAgIDg5LCAgICA2NDAsICAgICA2MSwKKyAgICAgICAgNjYsICAgLTM2MCwgIC0yNzI3LCAgIC0xNTUsICAgLTM3MCwgICAgLTQ0LCAgIC0yOTIsICAgIDU3MCwKKyAgICAgICAgMzQsICAtMzIwOSwgICAgIC01LCAgICAgLTEsICAgICAgMSwgICAgICAwLCAgICAgLTEsICAgICAgMCwKKyAgICAgICAgMjIsICAgIC04MiwgICAgLTIwLCAgIC0xMjUsICAgIC05MSwgICAgIDk4LCAgIDc4NDMsICAgICAyNSwKKyAgICAgICAgLTIsICAgIC0zMSwgICAgICAyLCAgICAtNTIsICAgIC03MywgICAgLTI1LCAgICAgMzEsICAgIC0zNSwKKyAgICAgICAgLTYsICAgLTExNCwgICAgICAxLCAgICAgLTEsICAgICAgMiwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAyMTcsICAtNTIwMiwgICAgIDg2LCAgICAtNzYsICAgIC03NiwgICAgMTA5LCAgICAzODksICAgIC05NSwKKyAgICAgIC0yNTMsICAgIDEyNCwgICAgMTMwLCAgICAgNTgsICAgIDE5MCwgICAgLTQ0LCAgICAtNjcsICAgLTE0MiwKKyAgICAgICAgNTQsICAgICAgNiwgICAgIC0xLCAgICAgIDEsICAgICAgMSwgICAgICAxLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC0xODMsICAgIDU0NywgICAtMjAwLCAgICAzNDgsICAgIDM3MiwgICAgNDM3LCAgICA0MjUsICAgIDU0NywKKyAgICAgIC00NTcsICAgIDM4OCwgICAgIDg3LCAgICAgMzgsICAgLTUyMiwgICAtMjEwLCAgIC01NTYsICAgICA0MSwKKyAgICAgLTI5NzksICAgIC0xNywgICAgICA3LCAgICAgLTQsICAgICAgNiwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAxODksICAgIDE5NiwgICAgMjQwLCAgICAtNzUsICAgICA0NiwgICAgLTUwLCAgICAxMDEsICAgLTE2MCwKKyAgICAgICAtMTYsICAgLTIyMywgICAgIDkyLCAgICAgNzEsICAtNzYzMywgICAgIDc4LCAgICAgOTAsICAgICA2OSwKKyAgICAgICAxOTAsICAgIC03NSwgICAgICAyLCAgICAgIDEsICAgICAtMiwgICAgIC0xLCAgICAgIDAsICAgICAgMSwKKyAgICAgICAyMDUsICAgLTQzMywgICAtMjY3LCAgIC0xNzUsICAgMzA2OCwgICAtMjEwLCAgIC01MTQsICAgIDMzMCwKKyAgICAgLTMwOTksICAgLTI3MywgICAgMTU1LCAgICAxMzIsICAgLTMwNiwgICAgMzYxLCAgICAzMTYsICAgIC01MywKKyAgICAgIC00MjEsICAgLTEyNSwgICAgIC0zLCAgICAgIDAsICAgIC0xMSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAxNzksICAgIC0zOCwgICAgMTUxLCAgICAtMzYsICAgIDIxNSwgICAtMTAyLCAgIC0xNDUsICAgIDEzOSwKKyAgICAgICAgNTAsICAgIDIwMCwgICAgMzgzLCAgICAgMzcsICAgMzEwMiwgICAgLTI3LCAgICAgIDksICAgLTE1NywKKyAgICAgICAtNjgsICAgIDM2NywgICAgICAxLCAgICAgIDEsICAgICAgMCwgICAgICAwLCAgICAgIDEsICAgICAgMCwKKyAgICAgICAtNTAsICAgIDE3NywgICAgLTI0LCAgICAgMjQsICAgIDExOSwgICAgICA0LCAgICAgNzYsICAgICA5OSwKKyAgICAgIC0xMTEsICAtNzM2NywgICAgIDI2LCAgICAgNTEsICAgIC0xMSwgICAtMTQ2LCAgIC0xMjUsICAgIC00OCwKKyAgICAgICAgNTQsICAgICA1MCwgICAgICAxLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgLTEsICAgICAgMCwKKyAgICAgICAtNzEsICAgIC0xNiwgICAtMTg0LCAgICAtNjEsICAgIC0zNiwgICAtMTUxLCAgICAgNzksICAgLTEyOCwKKyAgICAgIC0xMDIsICAgIDEzNSwgICAtMjI4LCAgICAxOTAsICAgIC03OSwgICAgLTEwLCAgIC0xNzYsICAgLTExMywKKyAgICAgIDEwMDgsICAgLTg1NiwgICAgLTEzLCAgICAgLTQsICAgICAgOCwgICAgIDI4LCAgICAgIDAsICAgICAgMSwKKyAgICAgLTQ5MDksICAgIC05MywgICAtMTY3LCAgIC0xNDEsICAgICA1MSwgICAtMjAzLCAgICAgNzEsICAgLTE5OSwKKyAgICAgICAtNDksICAgIDEwNiwgICAtMTQyLCAgICAtOTQsICAgIDEyNiwgICAtMjI1LCAgICAxNTgsICAgICAzNiwKKyAgICAgICAyNjksICAgIDE1OSwgICAgICAwLCAgICAgIDEsICAgICAgMSwgICAgICAwLCAgICAgIDAsICAgICAtNSwKKyAgICAgICAtNjEsICAgIC03OSwgICAgLTIwLCAgICAzMDYsICAgICA2NywgICAtNjIxLCAgIDE3NzQsICAgIDM0NiwKKyAgICAgIC00NDIsICAgIDEyNSwgICAgMzA1LCAgIC0xNzAsICAgICA1NSwgIC0yNTM3LCAgIC0xMDMsICAgIDExOCwKKyAgICAgICAgODcsICAgIDUwNSwgICAgIDE2LCAgICAgLTcsICAgICAtMiwgICAgICAwLCAgICAgMjAsICAgICAgMCwKKyAgICAgICAgMzUsICAgLTE1NCwgICAtMTU4LCAgICAyMjQsICAgIC0zNiwgICAtMzQ0LCAgICAgNzksICAgNDIzMiwKKyAgICAgICAyMzQsICAgLTIxOSwgICAgLTcxLCAgICAyMDQsICAgLTQ4NCwgICAtMTMxLCAgIDExNTMsICAgICAyMywKKyAgICAgICAxMTEsICAgIDQ5OSwgICAgICA1LCAgICAgIDAsICAgIC0xNywgICAgICAwLCAgICAgIDAsICAgICAgMSwKKyAgICAgIDExMzUsICAtMzQ2OSwgICAtNDg5LCAgIDI1NzIsICAgLTQ1MCwgICAtNDMyLCAgIC0zNTgsICAgIC0zNCwKKyAgICAgICAtNzgsICAgIC0xMCwgICAtNzc1LCAgICAgMTcsICAgLTEzMSwgICAtMTU0LCAgICAyMTgsICAgICA4MiwKKyAgICAgIC0zMTIsICAgIDI3OSwgICAgICAxLCAgICAgIDAsICAgICAgMSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgOTYsICAgIDIzMCwgICAgIDE4LCAgICAgNDcsICAgICAtNSwgICAtMTAyLCAgICA2NDYsICAgLTEyMiwKKyAgICAgICAgMzUsICAgIC04MSwgICAgMTgzLCAgICAxNzEsICAtMTQ3OSwgICAgMjAxLCAgICAgODQsICAgIC0yNCwKKyAgICAgICAxNDMsICAgIDMwMiwgICAgICAxLCAgICAgIDUsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAtMzQsICAgIC00OCwgICAgIDg5LCAgIDc3ODksICAgIC04NSwgICAgLTI3LCAgICAtNTYsICAgICA0NiwKKyAgICAgICAgMzksICAgICAzMCwgICAgIDk4LCAgICAtNDAsICAgIDEzOCwgICAtMTQ3LCAgICAxMDQsICAgIC0zNSwKKyAgICAgICAtNDEsICAgLTE1MSwgICAgICAxLCAgICAgIDksICAgICAgMSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC0xNDAsICAtMTk3MCwgICAtMTcwLCAgICAyNzMsICAgIDIyNiwgICAgIDMzLCAgIC0zMjQsICAgIC0zOCwKKyAgICAgICAgMTEsICAgIDE4OCwgICAgNjAzLCAgICAxODgsICAgLTE4MywgICAgIDk4LCAgICAtNTgsICAgIC02NywKKyAgICAgICAtNjMsICAgICAgNywgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDEsICAgICAgMCwKKyAgICAgICAzODQsICAgIDg5OSwgICAgNDkzLCAgICA3NjUsICAtMTA2MiwgICAgNjQ2LCAgICAyNzUsICAtMjY5OSwKKyAgICAgICAgOTMsICAgIDc5NiwgICAgMTIwLCAgICAtMjUsICAgIDE3NywgICAgLTg1LCAgICA3MjEsICAgLTE4OSwKKyAgICAgIC0yOTUsICAgLTQzNiwgICAgICAwLCAgICAgLTEsICAgICAgMCwgICAgICAwLCAgICAgLTEsICAgICAgMCwKKyAgICAgIC0zNTgsICAgIDExNywgIC0yNDM1LCAgICAzMjUsICAtMzEzNywgICAtMTU4LCAgICAgMjMsICAgICA5NywKKyAgICAgICAgIDYsICAgIDIwNCwgICAgMjg4LCAgIC00MjYsICAgIDE1NiwgICAgIDIyLCAgIC0xMDEsICAgIDE3MSwKKyAgICAgICAtNTYsICAgIDIzNSwgICAgICAwLCAgICAgLTEsICAgICAgMCwgICAgIC0xLCAgICAgIDAsICAgICAgMCwKKyAgICAgICA2NTYsICAgMzg3OCwgICAtMjg2LCAgIC0zODMsICAgICA3NSwgICAgLTUwLCAgICAxMTQsICAgLTM3NywKKyAgICAgIC0xMDUsICAgIDEwNiwgICAgMTU0LCAgICAtMzAsICAgLTIwNCwgICAtMTA1LCAgICAxNzEsICAgIC01NiwKKyAgICAgICAyMzAsICAgLTU4NywgICAgICAwLCAgICAgIDEsICAgICAgMCwgICAgICA4LCAgICAgIDEsICAgICAtMSwKKyAgICAgICAtNTgsICAgIDE3NywgICAgIC03LCAgICAgNDUsICAgLTE1OSwgICAgNDA1LCAgICAgNDUsICAgICA4NCwKKyAgICAgIC0yMDYsICAgICA3NywgICAgMjc3LCAgIC0yNTksICAgIDEyMSwgICAzNzE5LCAgICAxNDAsICAgICA3OSwKKyAgICAgIC0yMDIsICAgIDg0MywgICAgIC04LCAgICAgIDAsICAgICAtMSwgICAgICAxLCAgICAgLTIsICAgICAgMCwKKyAgICAgIC0yNDgsICAgIDU2MCwgICAyNjUxLCAgICAtNDksICAgLTYyNSwgICAtMTQ3LCAgLTI0MTYsICAgIDExOSwKKyAgICAgICAtNzAsICAgICA4NywgICAgMTM3LCAgICAgMTgsICAgLTQwMSwgICAtMTQ3LCAgIC01OTgsICAgLTE1MCwKKyAgICAgICAyMzksICAtMTAwNCwgICAgICA3LCAgICAgIDMsICAgICAxMywgICAgICAxLCAgICAgIDEsICAgICAgMSwKKyAgICAgICAyNzYsICAgIDM0MiwgICAgIDk3LCAgICA2MDAsICAgIDIzMCwgICAgIDk1LCAgICAyMTMsICAgIDE1OSwKKyAgICAgIC0yNTksICAgIC0yNSwgICAtMTc2LCAgIDMzNjAsICAgLTI4MywgICAtMzI1LCAgICAtMzcsICAtMjYyNiwKKyAgICAgIC0xNTEsICAgIDE3OCwgICAgIC0xLCAgICAtMTgsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC0yMzMsICAgIDIzNywgICAgLTc4LCAgICAyOTAsICAgLTI4NCwgICAgMTQxLCAgICAtMjAsICAgIDE0NiwKKyAgICAgICAgNTgsICAgIC0yMSwgICAgIDczLCAgICAtMzUsICAgLTEwMSwgICAgLTIzLCAgLTQwNjgsICAgLTExNiwKKyAgICAgICAgNDksICAgLTE5NiwgICAgIC01LCAgICAgLTIsICAgICAgMCwgICAgICAxLCAgICAgLTEsICAgICAgMCwKKyAgICAgIC0yOTIsICAgLTE5NSwgICAgIDUxLCAgIC03MTQsICAgIDE3MiwgICAgIDQ0LCAgIC0xMTksICAgIDEzNCwKKyAgICAgICAxNjgsICAgIDEwNywgICAgLTc0LCAgLTIzNzksICAgIDMwOCwgICAgMTczLCAgIC0yNTIsICAtMzQ3MCwKKyAgICAgIC0xMzUsICAgIDY0MSwgICAgLTEwLCAgICAgIDAsICAgICAgMCwgICAgICAxLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAxNDYsICAgMjA2MCwgICAgLTg0LCAgIC0xNjQsICAgLTI0NywgICAgIDI2LCAgLTE3MjQsICAgIDIxNiwKKyAgICAgICAyMjYsICAtMjQ5OSwgICAgMzEyLCAgICAtNjYsICAgIDg1MCwgICAgIDQxLCAgICAgLTEsICAgICAyMCwKKyAgICAgLTEzMzksICAgIDQxMSwgICAgICAwLCAgICAgIDAsICAgICAtMSwgICAgLTEyLCAgICAgIDAsICAgICAgMCwKKyAgICAgICA5MjEsICAgICAxNywgIC0zNTEwLCAgIC0xMTksICAgIDMyNSwgICAgIDM0LCAgICAtOTcsICAgLTIwNSwKKyAgICAgICAgIDMsICAgLTE4OCwgICAgMjUyLCAgICAgOTEsICAgICAgMCwgICAtMTM1LCAgICAtNzYsICAgIDIwOCwKKyAgICAgICAxOTksICAgLTIwMiwgICAgIC0xLCAgICAgIDEsICAgICAgMSwgICAgICAyLCAgICAgIDAsICAgICAtMSwKKyAgICAgICAtODgsICAgLTQ2MSwgICAgMzE5LCAgIC05NjMsICAgIDI2NiwgICAxNTQwLCAgICA2NDMsICAtMzQyNCwKKyAgICAgICAgNzYsICAtMTA1OCwgICAgNTAxLCAgICAzNDIsICAgIDI5NywgICAgMjY4LCAgIC0xNTgsICAgLTEwMywKKyAgICAgICAgMjYsICAgIC0zMCwgICAgICAwLCAgICAgLTEsICAgICAtMSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAyMTEsICAgIDI0NSwgICAgMTgzLCAgIDE1NzksICAgIDEwNiwgICAgIDI2LCAgLTM0NTAsICAgIC0yMiwKKyAgICAgLTEwNTMsICAgLTI2NiwgICAtNzM2LCAgICAxMTMsICAgIDQ3NSwgICAtMjQxLCAgICAxMTcsICAgIC04NSwKKyAgICAgIC00OTIsICAgIDM3MiwgICAgICAwLCAgICAgIDEsICAgICAgMSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMDgwNnNzMFtdID0geworICAgICAgLTM4MSwgIC0xNjM4LCAgLTgxOTIsICAgICAgNSwgICAgOTgzLCAgLTE0ODEsICAgIC0yMCwgICAtNzE5LAorICAgICAgLTIzOCwgICAgNzY3LCAgICA1NzEsICAgLTIwMCwgICAgNzU0LCAgICA0NjAsICAgMTY3OCwgICAxMzc2LAorICAgICAgLTE1NSwgIC0xOTk4LCAgICAyOTQsICAgLTQ1NSwgICAgIDgwLCAgICAgIDIsICAgICAyNiwgICAgICAzLAorICAgICAgICAxMCwgICAgIDI1LCAgIC05MzEsICAtMTA5OCwgIC0xMTY2LCAgLTMyMjEsICAtMTk5NSwgICAgNzAyLAorICAgICAgIDEwNCwgIC0yNDI5LCAgLTIyNzAsICAgMTM3MiwgICAyMzI2LCAgICAtMzcsICAtMTQ5MiwgICAxNjkyLAorICAgICAgIDY0NCwgIC0xMjgzLCAgICAzNjMsICAgIDYyNCwgICAtNDgzLCAgICAtMTUsICAgIDM0NiwgICAgIC02LAorICAgICAgICAgMiwgICAgICAwLCAgICAgIDEsICAgICAgMywgICAgICAyLCAgLTI0MjksICAtODE5MiwgICAtOTU2LAorICAgICAgMTE5MCwgICAgNzA2LCAgIC05NTUsICAgIDM2NywgICAgOTU5LCAgIC0xOTQsICAgLTcyMywgIC0xMTA0LAorICAgICAgIDM3NSwgICAgNTU0LCAgIC05NjIsICAgLTIyOSwgICAgIDY2LCAgICAzNjgsICAgICAxOCwgICAtMTUwLAorICAgICAgICA1NiwgICAgOTY4LCAgICAtMTUsICAgICAgMCwgICAgIC0xLCAgICAgLTUsICAgICAgMCwgICAgICA5LAorICAgICAgLTI1MCwgICAtNzIwLCAgIDE5MTAsICAgIDgyNywgICAgMTk4LCAgIC02NDUsICAgMjAyMSwgICAgIDMyLAorICAgICAtMTk3MiwgICAtNzA1LCAgICA0NDEsICAgIDM3MywgICAgODAwLCAgLTIyOTMsICAgMTc0NywgICAxNTA0LAorICAgICAgLTUzNywgIC0xNzMxLCAgLTExOTIsICAgMTU5NywgIC00MDMxLCAgICAgMjQsICAgICAgMCwgICAgIC0yLAorICAgICAgICAgMSwgICAgICAxLCAgICAgIDEsICAgLTEzMSwgICAxNTk0LCAgIC0xNTMsICAgMTEyNywgICAyNzMyLAorICAgICAgIDQ2OSwgICAtNTU4LCAgICAtMTEsICAgMTE5MCwgICAgMTE1LCAgIC05MzMsICAgMTk4OCwgICAxODQxLAorICAgICAtNDUzMCwgICAxMzg1LCAgICA1NzEsICAgMjM5OSwgICAxNzA5LCAgICAtNjMsICAtMzY2MywgIC0yNjgxLAorICAgICAgICA1NywgICAgIC00LCAgICAgMTEsICAgICAtNCwgICAgICAwLCAgICAgLTMsICAgIDQyNiwgIC00MjU3LAorICAgICAgMjc1NSwgICAgLTc2LCAgLTE2NjcsICAgMjQ1MCwgICAtMzczLCAgIDMzNzUsICAgIC05MSwgICAtMjMyLAorICAgICAgIDUxMSwgICAgNjQ4LCAgICA4ODYsICAgMTE4MiwgICAxNjY3LCAgICAgNjUsICAtMzAyOSwgICAtNTc5LAorICAgICAgIDg2NSwgICAyMTg2LCAgIDI5MTEsICAgIDUzNywgICAgICAwLCAgICAgIDIsICAgICAtMywgICAgICAwLAorICAgICAgICAgNywgICAgNTg1LCAgIDgxOTIsICAtMjg1NSwgICA4MTkyLCAgIDU1MjcsICAtNTQ5MSwgIC0xOTI2LAorICAgICAtNDIzMSwgIC0xMjA0LCAgIDE5NTMsICAtMTE5MywgICAgMTkxLCAgIDMyNzgsICAtMTcyNiwgICAgMjU5LAorICAgICAtMjc5NCwgICA0MjA1LCAgIDQzMTUsICAtNjEyMSwgICAtNjA2LCAgLTE5MjIsICAgMzY2NiwgICAtMzI0LAorICAgICAgLTIzOCwgICAtMzEzLCAgIC03MjAsICAtMTQ0NywgICAtNTM5LCAgIC03OTQsICAgMzE1MSwgIC0xNzI2LAorICAgICAgMzQ0NCwgICAgODc2LCAgICA1ODQsICAgLTY3MSwgICAtNDk3LCAgICA0MDcsICAgIDkwOSwgIC0yMTgzLAorICAgICAgMjU3NSwgICAgMjQ2LCAgIC02NzMsICAgIDI3MCwgICAgODI0LCAgIDE3ODQsICAgLTIwMSwgICA3MzI5LAorICAgICAgIDU4OSwgICAgLTcwLCAgICAgLTEsICAgICAgNCwgICAgIC01LCAgICAgLTMsICAgICAtOCwgICAtNDE3LAorICAgICAgIDM4MiwgICAyNzg2LCAgIC05NzIsICAgIDUyMCwgICAxMTU0LCAgICA4ODYsICAgIDUyMSwgICA2MDMyLAorICAgICAgLTY4NywgICAzNzkxLCAgIC01MjIsICAtMTIyNiwgICAgNjA4LCAgICA0MjgsICAgIDg5MSwgIC0xNTI0LAorICAgICAtMTAxNSwgICAxMTQ3LCAgIDEyNzgsICAgIDU1OSwgICAgIC02LCAgICAgIDMsICAgICAgMCwgICAgICA2LAorICAgICAgICAgMiwgICAgIC0zLCAgICAxMTUsICAgMzU4NiwgIC0yODQ3LCAgICAgOTUsICAgIDQ2MCwgICAyODMyLAorICAgICAgMjMyNiwgIC0xNjY1LCAgIDE3MjAsICAgIDQ1MywgICAgOTY1LCAgIDExNTQsICAgIDQ1MiwgIC0xNzIxLAorICAgICAtMTM3NSwgICAtMjY5LCAgIDIxMzgsICAtMjAzMiwgICAgIDU1LCAgIC02NzQsICAgLTg3MCwgICAtMTI0LAorICAgICAgICAgMCwgICAgICA1LCAgICAgIDAsICAgICAtNSwgICAgIC0zLCAgIC0yODMsICAgMTA3NywgICAyNjA0LAorICAgICAgMTI3MCwgIC0xMDgyLCAgLTE3NTMsICAgNjg0MCwgIC0yNTAyLCAgICA5ODgsICAtMTc5MCwgICAxMzc4LAorICAgICAgMTIzMSwgICAgNDM4LCAgLTExODgsICAgIDI4NiwgICAgNTQwLCAgIC0xMzgsICAgMTA1NCwgICAtMTExLAorICAgICAtMjMyMSwgICAgIDc0LCAgICAgNTYsICAgICAtMywgICAgIC0yLCAgICAgIDAsICAgIC0zMiwgICAgICA1LAorICAgICAgMTUzOSwgIC0xMzk5LCAgIDc0MTMsICAgLTkwMywgIC0xNjk4LCAgIDE3ODEsICAgLTI1NSwgICAtNDY2LAorICAgICAtMTQzNiwgICAzNDE5LCAgIDE5MTYsICAgIDg1MiwgICAgNTkwLCAgLTExMjYsICAtMTYxNywgIC0xMzA5LAorICAgICAtNTU2MCwgICAtMjQxLCAgIDMzNjMsICAtMTIyNSwgICAyNjgyLCAgICA2MjAsICAgICAtNiwgICAgIDU4LAorICAgICAgICAgMiwgICAtMTg2LCAgICAtMTcsICAtMjk1OSwgICAgNjE5LCAgIDIyMjgsICAtMjYyNywgIC0zMTE5LAorICAgICAgIDczMCwgICAzNzE2LCAgIC01MzgsICAgLTEwMSwgIC0xODYzLCAgIC01MTYsICAgIDE0MiwgIC0yMzg0LAorICAgICAtMTUxNCwgIC01NTA2LCAgIC04MjUsICAgIDUxNCwgICAgNzE0LCAgICA3NDYsICAtMjc5MCwgICAgNTY5LAorICAgICAgLTQyNSwgICAgICA0LCAgICAtNjgsICAgICA3MCwgICAgIDI0LCAgICAgMTIsICAgIDgxNywgICAtMjc2LAorICAgICAtMzM2MywgIC0yOTQyLCAgICAxMDMsICAgLTU4MSwgICAtOTI1LCAgICA2NTEsICAgIDU2MSwgICAgIDQzLAorICAgICAgIDQzNCwgICAgNzEyLCAgIC01NDEsICAtMjA0MiwgIC0xMjkxLCAgIC00NTMsICAgLTQ0MywgIC00MzEyLAorICAgICAtMTM0NCwgICAxMjc3LCAgICA2MDUsICAgICAtNCwgICAgICAwLCAgICAgLTEsICAgICAtMSwgICAgICAxLAorICAgICAgICAgMiwgICAtOTMwLCAgICAyNzYsICAgMzIxOSwgICAtNDA0LCAgIC05NDQsICAgLTQ5NywgICAgODQwLAorICAgICAgIDI3OCwgICAgLTk4LCAgLTE0MzIsICAtMTEzNiwgIC0xOTc1LCAgLTE4NjMsICAtMTEwMiwgIC0xNDQ2LAorICAgICAgIDkzOCwgICAgNjkzLCAgLTUxODYsICAgICAtMSwgICAxMDg1LCAgLTIyNzUsICAgICAgMSwgICAgICAxLAorICAgICAgICAtMSwgICAgIC0xLCAgICAgLTIsICAgICAgMywgIC0xMTk0LCAgIC0zMTIsICAtMTI1NywgICAxOTczLAorICAgICAgMTU3MCwgIC0xNzAzLCAgLTE2MzcsICAgIDYzOSwgICAtODU1LCAgIDE5MjUsICAgIDk3MCwgICAgNjA0LAorICAgICAgMTMxMywgICAgNzgwLCAgLTUxNzAsICAgLTYwMywgICAgMjIwLCAgIC03MzEsICAgMjk1MiwgICAtODcyLAorICAgICAgIDE2NiwgICAgIDMwLCAgICAgIDAsICAgICAtMiwgICAgIC0xLCAgICAgIDMsICAgICAtMSwgICAtNzQzLAorICAgICAgIDUwNCwgICAxMzYzLCAgIDE0MzYsICAgMTYzMiwgICAtNjM0LCAgIC03MDksICAtMjM0NiwgICAgIDg3LAorICAgICAgMTE0OSwgICAzNDY4LCAgIDIxMzIsICAgMzAyOCwgIC0xMDM5LCAgICAtOTIsICAgMjA4NywgICAtOTkwLAorICAgICAgLTMwMSwgICAgOTY2LCAgIC03NzMsICAtMTA1NywgICAgIDQyLCAgICAgIDAsICAgICAtMiwgICAgICAwLAorICAgICAgICAgMiwgICAgICAyLCAgICAyNTIsICAgIDIxNywgICAzNjI1LCAgLTIzMjMsICAgIDIxMiwgICAtMzgxLAorICAgICAtMTEyMSwgICAxNjY0LCAgIC0zMDcsICAgMTY4MCwgICAyMTkzLCAgLTE4NTQsICAgLTE4NywgIC0zMTAwLAorICAgICAgIDI1NCwgICAtNjczLCAgICA1OTUsICAgMTk5NSwgICAgNjY5LCAgIC02ODcsICAgLTUwOSwgICAgIDEzLAorICAgICAgICAgMCwgICAgICA4LCAgICAgLTMsICAgICAxMSwgICAgIC0zLCAgIC01NTIsICAgIC04NywgICAgICA2LAorICAgICAgMjkzMywgICAtMjY3LCAgLTEzOTIsICAgICA0MCwgICAgNjQ0LCAgICAgMzIsICAgMjk2NiwgIC0xMzg2LAorICAgICAtMjQ4MCwgICAtOTU2LCAgIDExNjAsICAgMTM5OSwgICAxMDQ5LCAgIDM5MDIsICAtMjA5MiwgICAtNTI1LAorICAgICAgMTcyNCwgICAgIDY5LCAgICAtMzMsICAgICAgMCwgICAgIC0yLCAgICAgIDAsICAgICAgMiwgICAgICAyLAorICAgICAgLTQ1MiwgIC00NzM5LCAgLTMyMzcsICAgLTUxMCwgICAtNTk4LCAgLTEzOTcsICAgIDg1NSwgICAxNTczLAorICAgICAgMjE0MywgICAgLTc5LCAgLTE1NDYsICAgIC0xNywgICAtOTczLCAgLTI0MDAsICAgMTY4OSwgICAgMTMzLAorICAgICAtMTIxMywgICAgNzg0LCAgICA3MjYsICAgIDkxNiwgICAtMzg4LCAgIC0zOTAsICAgICAgMSwgICAgIC0xLAorICAgICAgICAtMywgICAgIC0xLCAgICAgIDAsICAgIDE3MCwgICAtMjA1LCAgLTI5MDUsICAgODE5MiwgICAtNDY1LAorICAgICAgMzExOSwgICA0NDA3LCAgIC03MDksICAgLTQwMywgICAgODU5LCAgIC0zNzMsICAtMTMwMSwgIC0xMzk3LAorICAgICAgLTc1MCwgICAgLTg4LCAgICAyNzcsICAtMjA5NywgICAtMjIyLCAgIC0xMzQsICAgIC04OCwgIC0xMTg5LAorICAgICAgIDk3NCwgICAgLTU2LCAgICAtNTcsICAgIC04MywgICAgLTIxLCAgICAxMDIsICAgIDYyNiwgICAtMTE0LAorICAgICAtMjMwNCwgICAgOTc5LCAgLTE4MzYsICAgLTg2OCwgICAxMjYxLCAgIDIyMjYsICAgLTI2MSwgICAgNTc5LAorICAgICAgIDk4MywgICAgNjU1LCAgLTI1NzgsICAgMTgwMywgICAgMTE3LCAgLTExMjgsICAgIDM2NSwgICAzOTcxLAorICAgICAgMzUzOSwgICAgLTIxLCAgIC03OTAsICAgIC02MiwgICAgICAyLCAgICAgIDMsICAgICAyMywgICAgIC0zLAorICAgICAgICAzMSwgICAxMjczLCAgIDMyMTIsICAtMTYxNywgICA0MTE2LCAgIC0yODEsICAgIDcyNSwgICAtMjg0LAorICAgICAgMTA3OSwgICAgMjkzLCAgLTM3NTksICAgMjU4MSwgIC0xNjE3LCAgIC0yNTksICAgIC0xOSwgIC0xOTk5LAorICAgICAgMzA0MCwgIC0zMDc3LCAgLTE1MjIsICAgMTA1NiwgICAgLTkyLCAgICA4OTcsICAgIDI0MywgICAgIC0xLAorICAgICAgICAzNiwgICAgLTE5LCAgICAtMTAsICAgIC00NiwgICAgMjMxLCAgIDExMjksICAgIDM2MywgIC0xOTc4LAorICAgICAgLTg4MiwgIC0xNzg4LCAgICAzMTksICAgNDgwNywgIC0xNzA3LCAgLTEzNzksICAtMTQ2NSwgICAyMzI3LAorICAgICAgLTgyNywgICAtNjgxLCAgICA0MTAsICAtMTgxNiwgIC0yNTA3LCAgIDEwMzYsICAgIDc0MCwgICAgNzMwLAorICAgICAgLTY4NywgICAgMTAwLCAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgIDEsICAgICAtNCwgICAtMjc2LAorICAgICAgIDMwMywgIC0yMzMxLCAgLTI5MTIsICAtMTg2NCwgIC0zNjk0LCAgICA0MTIsICAtMTIxOCwgICAxNjQyLAorICAgICAgNDQ0OCwgICAgNjU4LCAgIC0yMTMsICAgIDg3MiwgICAyODY3LCAgICAyMjcsICAgIDg2OCwgICAtNTkwLAorICAgICAgMjI5MywgICAxNzU5LCAgLTE2NjYsICAtMTU4NSwgICAtMTQwLCAgICAgIDEsICAgICAtMywgICAgIC0xLAorICAgICAgICAyNiwgICAgLTEwLCAgIC0yODcsICAgIDg5OCwgIC0yNDQyLCAgIDM5OTcsICAtMTY1NSwgIC0xMzQxLAorICAgICAgIC01NiwgICAgNjg5LCAgLTE4NjksICAgIDU3MiwgIC0yMDQ0LCAgICA2MTYsICAtMjYwMywgICAtMjc4LAorICAgICAgMjk4NywgICAyMzk3LCAgLTIwNTUsICAgIDI0NywgICAgMTI4LCAgICA1OTgsICAgMTczMiwgICAtMTQ2LAorICAgICAgICAgMCwgICAgICAzLCAgICAgLTEsICAgICAtMywgICAgICA1LCAgICA4NDIsICAgIDU5NywgICAgNzc5LAorICAgICAtMTUyOSwgICAtODAyLCAgIDIxNDIsICAtMTY2OCwgICAyMzM5LCAgLTM1NTAsICAtMjY1MSwgICAxNzMzLAorICAgICAtMTUzMSwgICAgLTQ2LCAgICA2MDAsICAgIDYxOCwgICAtODY3LCAgIC02NjUsICAgMTUyNCwgICAgMzkyLAorICAgICAtMTM4NiwgIC0zMjc5LCAgICAgNDUsICAgICAgMCwgICAgICA5LCAgICAgLTcsICAgICAtMywgICAgIC04LAorICAgICAgLTIyNCwgIC0yNjMyLCAgIC0xNDcsICAgLTUwNSwgICAyMjIzLCAgIDE3NzMsICAgMTc5OSwgIC0xNjk2LAorICAgICAgIDE5NCwgIC0xMTg2LCAgIC01NDMsICAgIDc3NSwgIC0xMTcxLCAgIDU0OTEsICAtMjMxOSwgIC0zMTkzLAorICAgICAgLTMxMywgICAtMzU1LCAgIC0xMzMsICAtMTA5NywgICAgMTI1LCAgICAtMjIsICAgICAtMiwgICAgICAyLAorICAgICAgICAgMSwgICAgIC0zLCAgICAtMTAsICAgLTM1NCwgIC0xNDQ3LCAgIC02NjIsICAgLTMxMywgIC00MzAyLAorICAgICAgMzg4OCwgICAtMTIxLCAgIC0zMjMsICAgMTExMiwgICAtODAxLCAgLTE1MTMsICAgLTgxNCwgIC0xNjQ2LAorICAgICAgLTYxNiwgIC0xMjA3LCAgICAzNDcsICAgIDQ4MywgICAgNjcwLCAgICA5MDAsICAgIC0zNSwgICAtODg1LAorICAgICAgICAxNCwgICAgICAxLCAgICAgIDAsICAgICAgMSwgICAgIC0yLCAgICAgIDcsICAgLTQzMiwgICAtNDg2LAorICAgICAtMTUzOSwgICAgNzg1LCAgIDQ4NTMsICAgIDkwNCwgICAgOTI1LCAgICA4OTUsICAtMTIyMywgIC0yNDY0LAorICAgICAgMzM5NSwgICAtNTA2LCAgIC04MDgsICAgIDIwNywgICAgMTk3LCAgICA4NzQsICAgLTkyOCwgICAxMzQ3LAorICAgICAgLTEwNywgICAxNTEyLCAgIDEwNjMsICAgLTE4MiwgICAgICAxLCAgICAgLTQsICAgICAtMSwgICAgIC02LAorICAgICAgICAgMywgIC0xMjM2LCAgLTEwNDcsICAgIDc3NCwgICAgIDI2LCAgIC02MzAsICAgIDg2MywgICAxMDU1LAorICAgICAtMjYzMiwgIC0xMTg3LCAgIC01MzQsICAgLTYxOSwgIC0xMDc5LCAgLTI1NzQsICAtMjAzNywgICAgNjU4LAorICAgICAgMTIyOSwgICAtMjYyLCAgIDI3MDIsICAtMzM5MywgIC0yMTg3LCAgIDE3NjQsICAgICA2NiwgICAgICAwLAorICAgICAgICAgNywgICAgICAwLCAgICAgIDcsICAgICAtMywgICAgNjc3LCAgIC00NDQsICAtMjExMSwgIC01MjU2LAorICAgICAtNDQ4NSwgIC0xNjY3LCAgIDIwNzcsICAgMTYxMywgICAxNDgzLCAgLTE1MjAsICAgMTYwMCwgICAxNzY3LAorICAgICAgMTE0OCwgICAyMDU0LCAgIDE2NzYsICAgMTg2NiwgICAgNzgzLCAgLTIxOTksICAgIDc2NSwgICAgNTY4LAorICAgICAgMjc3OSwgICAtNjgzLCAgICAgIDQsICAgICAxNywgICAgICAwLCAgICAtMzIsICAgICAxNSwgICAgIDQ1LAorICAgICAgIDIyOCwgIC0yNDQ1LCAgICA3NTIsICAgMjUxMCwgIC0xNjU3LCAgLTEwMzksICAgIDExMywgICAxMTA3LAorICAgICAtMTA1NCwgIC0xNzY1LCAgLTEyNDUsICAtMjUyNywgICAgNTg5LCAgICA0NTUsICAgIDMyOCwgICAgNjQwLAorICAgICAgLTU3OSwgICAyMzcwLCAgIDEzMTMsICAgLTU0MCwgICAgIDMxLCAgICAgIDEsICAgICAtMSwgICAgIC00LAorICAgICAgICAgMiwgICAgIC0zLCAgIC0yMzUsICAgLTU2MCwgICAgNDU1LCAgIDM4MDksICAgIDEwMiwgICAgNDAzLAorICAgICAgIC0yMSwgICAxODQ0LCAgICA0MDIsICAgIDE0OCwgICAgLTMyLCAgIDU1NzMsICAtMzc2NSwgICAtMjY1LAorICAgICAgLTcxOCwgICAtMzk5LCAgIC0zNDksICAgIDM2NiwgIC0xMTA1LCAgICAgOTEsICAgMTg4MSwgICAgIDM0LAorICAgICAgICAgMSwgICAgICAxLCAgICAgIDUsICAgICAgMCwgICAgICA5LCAgICAyODksICAtMTE0NiwgICAgNzk1LAorICAgICAtMjUwNCwgICAgNDEyLCAgIDExNTYsICAgLTMwMiwgICAtOTQ2LCAgIDIwNjMsICAtMjU2OSwgICAtMjczLAorICAgICAtMTQzNCwgICAgMTQxLCAgICA2NDIsICAgLTYzMSwgICA0ODU2LCAgLTEwMDgsICAgIDE2OSwgICAgLTQwLAorICAgICAgIDE5MSwgIC0yMjkzLCAgICAtODYsICAgICAgNiwgICAgICAxLCAgICAgLTIsICAgICAgMCwgICAgICAxLAorICAgICAgIDEzOSwgICAxOTU1LCAgLTExMTEsICAgLTk0NCwgICAgMTQwLCAgLTEwNzQsICAgMTA3MSwgIC0xMzEyLAorICAgICAgLTU0MSwgICAgNjY0LCAgIDE4MDEsICAgLTg5MiwgICAxNjA1LCAgLTE3NTAsICAgLTY1NCwgICAtNjgwLAorICAgICAtODEwMiwgICAgMTIwLCAgICAtMjQsICAgMTAxNCwgICAtMzUxLCAgIC0xMjAsICAgICAgMCwgICAgIC0yLAorICAgICAgICAgMSwgICAgIC0xLCAgICAgLTEsICAgMTAzOCwgICA1MTk5LCAgICA3NzksICAtMTE5NSwgICAgMTI4LAorICAgICAgIDQ2MiwgICAgMTg0LCAgIDM3MDUsICAtMTI5MiwgIC0yMjQ3LCAgLTI0ODEsICAgMjYxMCwgICA0Mzk2LAorICAgICAgNDE2MSwgICA0MDM5LCAgIDExMTEsICAgIDgzOCwgICAgMTg4LCAgIC01NzEsICAgMjgxMSwgIC0xOTE1LAorICAgICAtMTkwOSwgICAgIDEzLCAgICAgOTksICAgIC0yMCwgICAgIC0yLCAgICAgMTEsICAgIDM5NSwgICAgMTU1LAorICAgICAgMjY2NywgICAtMjAyLCAgLTI2MzksICAgMTMwMywgICAtOTEyLCAgLTE3MzQsICAgMTA5NywgICAtNTgzLAorICAgICAgMzUzMiwgICAtMjE4LCAgLTE1MTQsICAtMzg4MSwgICAgMzc4LCAgICAtNDYsICAtMTE4OSwgICAtOTU3LAorICAgICAtMzAxMCwgICAtNzQzLCAgIC02NDgsICAgICAxNSwgICAgICAxLCAgICAgIDMsICAgICAgMywgICAgICA0LAorICAgICAgICAtNCwgICAgMzMwLCAgICAxOTgsICAgLTI3NSwgICAtNjc3LCAgLTgxOTIsICAgLTYyOSwgICAxOTUzLAorICAgICAgLTc4MywgICAgNTkyLCAgICA5MjYsICAgMTQ4NywgICAgLTM5LCAgLTEwMDIsICAgMTEzNCwgICAxNTYwLAorICAgICAgIC0yNywgICAtMTE4LCAgLTEzNjMsICAgLTM2MCwgICAyMTYzLCAgICA0NDIsICAgICA5MiwgICAgICAxLAorICAgICAgICAgMSwgICAgIC0yLCAgICAgIDUsICAgICAgMSwgICAtNjcwLCAgICAzMjYsICAgMjc3MywgICAxMzQ2LAorICAgICAgIC0yNiwgICAgMzI3LCAgICAxODQsICAtMTA5MSwgICAtMTIxLCAgICA1NzYsICAtMTMyNCwgICAgMjEyLAorICAgICAgLTY0NSwgICAgODYwLCAgLTIxMTEsICAgLTQ5MywgIC0yMTE5LCAgICAzMTYsICAgLTY4OCwgICAgNDc1LAorICAgICAgLTY1MiwgICAgLTMzLCAgICAgIDAsICAgICAgMSwgICAgICAyLCAgICAgIDAsICAgICAtMywgICAgIDkyLAorICAgICAgIDE3MCwgICA2MjI0LCAgIDIxNjIsICAgIDc2MSwgIC0xOTk0LCAgIDIxNzYsICAgMTY5MiwgIC0xNzczLAorICAgICAgIDU2MSwgICAtOTY2LCAgIDM0MDYsICAgIC0yMCwgICAtNTkzLCAgICA1NzQsICAgLTY4MSwgICAxMTIxLAorICAgICAgLTMzNSwgICAtNDEyLCAgLTI2NTEsICAtNDcxMiwgICAgLTc5LCAgICAgIDEsICAgICAgMiwgICAgIC0xLAorICAgICAgICAgNCwgICAgIC02LCAgICA5MzIsICAtMjU3OSwgICAgMzQ0LCAgLTI2MTQsICAgMTExOSwgICA2NjIzLAorICAgICAgLTMxNCwgIC0xMDY4LCAgICAzMzgsICAgMTk3NywgIC0xMzc1LCAgLTEzMzgsICAtMTk5NiwgICAxMzEwLAorICAgICAgIDExOCwgICAtNTAwLCAgIC0zOTMsICAgIDYyMiwgIC0xNzk4LCAgLTEyMzIsICAgICAgMywgICAgLTc1LAorICAgICAgICAgMCwgICAgIDE3LCAgICAgIDAsICAgICAtMiwgICAgIC05LCAgICA3MTUsICAgODEzNSwgICAgNDAwLAorICAgICAgMzc0OCwgICAyMTU2LCAgIDE4ODIsICAgIDc3MiwgICAyNzI4LCAgIC00MDMsICAgLTc3NSwgICAyMTEwLAorICAgICAgMTYwMywgICAtNzY2LCAgLTI1OTIsICAgIDc2NywgICAtNjE4LCAgIDQ3MjcsICAgIDY2OCwgICAyMjgwLAorICAgICAtMTE1NywgICAxMjQ2LCAgIC03OTQsICAgIC0xNCwgICAgIC0yLCAgICAgIDIsICAgICAgNSwgICAgIDE2LAorICAgICAgLTEwNywgICAgNjQyLCAgLTE4MDYsICAgLTE1OCwgIC0yNDQ3LCAgICAzMDksICAgLTc2NCwgICAyMzEzLAorICAgICAgLTEwMSwgICAtNzY2LCAgICAyMDksICAgLTY5MSwgICAyMDAxLCAgICAyNjgsICAgLTI3MywgICAgNjE1LAorICAgICAgIDgwMywgICA2MDYyLCAgIC00MzQsICAgMTI4NywgICAtNTQzLCAgICAgLTMsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMSwgICAgICAxLCAgICAgIDAsICAgIDUwMywgICAtNTk4LCAgLTIwNDMsICAtMTE2MCwgICAxMDc0LAorICAgICAgMTI1NSwgICAzMjY5LCAgIDE0MDUsICAgMTE4MiwgICAgMTk3LCAgIDMwOTgsICAgLTEzOCwgICAyMzI2LAorICAgICAgLTI0NCwgICAtNzcyLCAgICA5MDEsICAgLTIyNSwgICAgMzM3LCAgICAtNjUsICAgLTUzNiwgICAtMzMxLAorICAgICAgICAxNSwgICAgICAyLCAgICAgMTMsICAgICAgOCwgICAgIC0zLCAgICAgMjAsICAgIC0zMiwgICAgLTUyLAorICAgICAtMTAxMiwgICAgMjMyLCAgIDE1MDIsICAgIC0xNywgIC0xNTc0LCAgIC03NDEsICAgIC01NywgICAgMTY0LAorICAgICAgIC0yMiwgICAgIDc0LCAgIC0xODEsICAgMTYxNiwgICAgMjk2LCAgLTE0ODMsICAgMTM4NywgICAtMzU3LAorICAgICAtNTM4MCwgICAtMzIyLCAgLTEzNDYsICAgICAgNiwgICAgIC0zLCAgICAgIDIsICAgICAtMywgICAgICAxLAorICAgICAgICAgMCwgICAtMzkyLCAgIC04MTEsICAgLTY1MCwgICAtNDg1LCAgIDMwMzgsICAgMjc1MCwgICAtNzc2LAorICAgICAgLTUwMywgIC0xNjY0LCAgIC0zMjMsICAgIDI1MywgICAtMjgwLCAgLTM0NTksICAtMTMxMywgICAgNTQxLAorICAgICAgMjE4MiwgICAxMjg3LCAgIC03ODIsICAgMTc4NSwgICAtNjk1LCAgICAtNDksICAgICA3MiwgICAgIC00LAorICAgICAgICAgMCwgICAgLTE1LCAgICAgIDMsICAgIC0yMSwgICAtMjExLCAgIDEzODIsICAgLTE0OSwgICAgNjg0LAorICAgICAgMjIxMCwgICAyNjU0LCAgLTE0NDAsICAtMTIwOSwgICAgMTUyLCAgIDEwODAsICAtMzA3OCwgICAtNjk0LAorICAgICAgNDczOCwgICAgOTg1LCAgLTEzMzcsICAgIDgxOSwgICAtNTE4LCAgIDE3OTksICAgLTY3MSwgICAzMjAxLAorICAgICAgMjYzNiwgICAgICA3LCAgICAgIDEsICAgICAtNiwgICAgIDE0LCAgICAtMzEsICAgICAgMCwgICAgLTM0LAorICAgICAgNDI5NiwgICAgLTIzLCAgICAxOTQsICAgMTk3NiwgICAtOTkzLCAgIDEzNTMsICAgIDcwOSwgICAtMzQyLAorICAgICAtMTE0MiwgICAtMTQwLCAgIC0yNzEsICAgMjI5MSwgICAtNzA5LCAgIDE3MzQsICAgIDgxOCwgIC0zNTcxLAorICAgICAgMTEyNSwgICAgOTEyLCAgIC01OTAsICAgIDc4NCwgICAtMjc1LCAgICAgLTIsICAgICAtMSwgICAgIC01LAorICAgICAgICAtMSwgICAgICAwLCAgIC0zODEsICAgMjc1NCwgICAxNTQ1LCAgLTIyNzAsICAgMzYwOCwgICAyMzA4LAorICAgICAtMTg5OSwgICAgMTc4LCAgICAzOTEsICAgMTgyNiwgICAtMTI3LCAgLTE0MTcsICAgLTgyMiwgICAtNzEyLAorICAgICAgMTY4MiwgICAyMjI1LCAgIDIyNDcsICAgIDQ0NiwgICAgOTk0LCAgICAgNTYsICAgIDczNCwgICAgMTk2LAorICAgICAgICAgNywgICAgICAzLCAgICAgIDgsICAgICAgMCwgICAgICA3LCAgICA2MzksICAgIDgzMywgIC0zMzEzLAorICAgICAgIDY3NSwgICAtMjYzLCAgIC02NDgsICAgMzAxNiwgICAtNzAxLCAgICAyMzUsICAtMTMwNCwgICAtNTgyLAorICAgICAtMjkzMCwgICAtMjEwLCAgLTEyNDMsICAgIDM3NCwgIC0zMDk1LCAgLTIwMTMsICAgIDM1NCwgICAgNTk5LAorICAgICAtMTQ2OSwgICAgMTQwLCAgICAtMTcsICAgICAtMSwgICAgIC0zLCAgICAgIDIsICAgICAgMCwgICAgIC0yLAorICAgICAgLTE4MywgICAgMzk5LCAgIC02MDMsICAgIDc5NiwgIC0xNDI0LCAgIDI2ODUsICAtMzkyOSwgICAgNDE2LAorICAgICAtMjI5MSwgICAxNzM3LCAgIDE5MDYsICAgMTY2NywgICAgODEwLCAgIC0yMjIsICAgMzI0MiwgIC0zNjM2LAorICAgICAgNTE5NiwgIC0xNTQyLCAgICA5NDAsICAgLTEyNCwgICAyMDQ3LCAgICAtNjcsICAgICAtNCwgICAgICA2LAorICAgICAgICAtMSwgICAgIDEzLCAgICAgIDIsICAgLTE2MSwgICAgNDE3LCAgIDQxMzIsICAgIDQ5MiwgIC0xMDY4LAorICAgICAgLTgxNywgICAyNzMyLCAgIC0yNTAsICAtMTQ1NywgICAxNzIzLCAgIDIxMDQsICAgMTEyMSwgIC0xMjc2LAorICAgICAgMTE0NywgICAgOTkwLCAgIC01MjMsICAtMTUzMywgICAgMjk3LCAgIDEyMTksICAgMzkwMSwgIC0yNTQ5LAorICAgICAgIC0yMiwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDIsICAtMTYzMiwgICAgMTcyLAorICAgICAgIDgyOSwgICAtNzQ3LCAgLTEyMjksICAtMTk5MCwgIC0xMDcwLCAgIDExMzQsICAgMTYyMywgICAgMjI4LAorICAgICAgMzY4OSwgICAgNjI1LCAgIC03NTcsICAgODE5MiwgICAgLTgyLCAgICA3MzgsICAgIDIxMywgICAxOTAwLAorICAgICAtMTIwMCwgICAgIDkxLCAgICA4OTIsICAgIC00NSwgICAgIDE1LCAgICAgLTEsICAgICAgNSwgICAgIC00LAorICAgICAgICAgNSwgICAgMzkyLCAgLTMwNjcsICAtMTkwMywgICAgMTM5LCAgICA2NjEsICAgICA0MywgICAyMTc0LAorICAgICAtMTkxOSwgICAtMjcwLCAgLTE0OTAsICAgLTU2OSwgICAgICAyLCAgICAgODUsICAtMTA5MSwgICA2NzQwLAorICAgICAgIDg4NiwgICAgIDg1LCAgLTEwNTIsICAgLTY0NywgICAtNTYzLCAgLTI5NzEsICAgLTE0NSwgICAgIC0xLAorICAgICAgICAzOSwgICAgIC01LCAgICAgLTYsICAgICAtNywgIC0xMDIzLCAgLTExMDQsICAtMTc3NCwgIC0zMTU0LAorICAgICAtMTA1OCwgICAzNDg4LCAgLTI1NTEsICAgMzU0NywgICAtMjUzLCAgIC0yMDQsICAgLTIzNSwgIC0xNTQ0LAorICAgICAgIC03MywgICAtNTg0LCAgIC0zMDIsICAtMzExOCwgIC0yMzE0LCAgIC0zMDgsICAgMTc5MCwgICAgOTE2LAorICAgICAgIDE1MiwgICAtMTU1LCAgICAtMTEsICAgICAgNiwgICAgLTI2LCAgICAgLTEsICAgIC0zMSwgICAgIDIxLAorICAgICAgIDkxOSwgIC0xODU2LCAgIC00NTYsICAtMTA1MCwgICAgNjYzLCAgIDE0NTQsICAtMTUxNSwgIC0yNjA2LAorICAgICAtNDI4NywgICAxNTUzLCAgIDM1NjQsICAgMTMzNCwgICAxNzk3LCAgIDE1NDAsICAgLTM5MiwgICAtNzAxLAorICAgICAgLTk3MSwgIC0zNDQyLCAgICAyODEsICAgLTI3MSwgICAgMTMzLCAgICAgIDEsICAgICAgNSwgICAgICA0LAorICAgICAgICAzMiwgICAgICAzLCAgIC01MjEsICAtMTUzMCwgIC0xMzY4LCAgIDE3ODcsICAgLTUxNSwgICAtOTEzLAorICAgICAtMjM5MSwgICAgIDkzLCAgIDI2OTAsICAgLTU3OCwgICAtNTc2LCAgLTE2NTYsICAgIDU1NCwgICAgNjQ5LAorICAgICAtMTUwOSwgICAtMjU4LCAgIC02MDUsICAgMTIzMywgIC0yMjU4LCAgICA2NDAsICAgIDgzNywgICAgLTQzLAorICAgICAgICAgMSwgICAgIC0zLCAgICAgIDAsICAgICAgNSwgICAgICAzLCAgICAxNDgsICAtNDc2MSwgICAxNzgzLAorICAgICAgMzI0NCwgICAtMjc3LCAgLTExMzksICAgMTUzOSwgIC0yMDE2LCAgIDE4OTgsICAtMTI3NiwgICAtNzc2LAorICAgICAtMTcyNSwgIC0xOTAwLCAgICAtNTEsICAgIDU1OSwgICAgMzExLCAgIDE3MzcsICAgLTkyOCwgICAzNjg3LAorICAgICAtMTA4NywgICAxMzI5LCAgICAxMzQsICAgICAgMiwgICAgIC0yLCAgICAgLTcsICAgICAgOSwgICAgICA1LAorICAgICAgIC03NywgIC0xMTE2LCAgIDQ5ODYsICAgLTk0MCwgICAtOTA1LCAgLTMyMjksICAgLTc3MywgICAzMzM1LAorICAgICAgIC0yMywgICAgNTc4LCAgLTIzNzYsICAgIDM4NiwgICAgMTIyLCAgIDEyNTMsICAgIDM2MywgIC0yNzQ4LAorICAgICAgLTUxMiwgIC00NjEyLCAgIDE2OTAsICAgIDg0OCwgIC0xMTE2LCAgICAxOTUsICAgICAgNSwgICAgICAyLAorICAgICAgICAxMSwgICAgICAxLCAgICAgMTgsICAgIDY1OSwgIC0xMjgyLCAgICA1NjIsICAgMTE3MCwgICA0NzAxLAorICAgICAgIDkwMywgICAgNDkwLCAgLTM1MDgsICAgMzQ2OCwgICAgLTM5LCAgICA2NTQsICAtMTE5NiwgICAtOTA5LAorICAgICAgLTI2OCwgICAgOTgwLCAgICAyODMsICAgMzIyMSwgICAgMzQ4LCAgIDExMjEsICAgLTg5NywgIC0xMDExLAorICAgICAgLTEwMywgICAgLTExLCAgICAgLTIsICAgICAtOSwgICAgIDE2LCAgICAgLTgsICAgLTI3NCwgIC00MTAwLAorICAgICAtMjMxMiwgIC0yMzc5LCAgICA2MTcsICAgMTYyOSwgICAyMTU0LCAgIDMwMjYsICAtMTczNywgICAtNjAzLAorICAgICAgLTgwMywgICAtMzY2LCAgICA5NzcsICAgMTAzNSwgIC0xODM1LCAgIC0yNTUsICAgLTI3NSwgIC0xMjQ1LAorICAgICAgMTI3NCwgICAtMTYxLCAgLTQ0NzYsICAgLTE4MSwgICAgIC00LCAgICAgIDAsICAgICAtMiwgICAgICAxLAorICAgICAgICAgMiwgICAgMTU2LCAgICA1NTEsICAgLTgzMiwgICAtNjMwLCAgIDM3NDAsICAtMjExNSwgICAgMzQ0LAorICAgICAgIDIyOSwgICAxMjk1LCAgICAgNjUsICAgIDI5MCwgIC0xNDYyLCAgLTE3OTQsICAgMzI5NywgIC0xMDQ5LAorICAgICAgMjQ1MSwgICAgMzIyLCAgLTI2NDIsICAtMjgxMCwgIC0xMjQ2LCAgICA2MTMsICAgICA5MCwgICAgIC0xLAorICAgICAgICAtMSwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAtMjc3LCAgICA4NTQsICAgMTI1OSwgICAxNTQyLAorICAgICAgLTQzMywgICAzNjAxLCAgIC00NTMsICAgMTA5MSwgICAtMTEzLCAgIDE0MzgsICAgIDk5NCwgIC0yNzQ2LAorICAgICAgLTc4NiwgICAgODY3LCAgIDE0MjIsICAgMTA5MywgIC0xNzIzLCAgLTExNjcsICAtMTM4OSwgIC0xMDYyLAorICAgICAgLTQzNiwgICAgLTgxLCAgICAgIDIsICAgICAgMSwgICAgIDExLCAgICAgIDEsICAgICAyNiwgICAtMTk3LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IwODA2c3MxW10gPSB7CisgICAgICAxNzYwLCAgLTQzMzUsICAgNjM4NCwgIC0yMDM2LCAgIDI4NzQsICAtMjUwNCwgIC0xNTI5LCAgICAxMDIsCisgICAgICA2OTk1LCAgLTEyNjcsICAtMzE0MSwgICAxMDUwLCAgICAtNTksICAgMTU1NiwgIC0xMDAyLCAgIDE1MzYsCisgICAgICAxMDI0LCAgIDE4NjcsICAgICA0MCwgIC0xMTU2LCAgLTI2MjcsICAgLTIxMywgIC0xMDM0LCAgIC02NjAsCisgICAgICAgMjkxLCAgIC05NjMsICAgLTMyMywgICAgNDYyLCAgIC04MDQsICAgMjIxOSwgICAtODU5LCAgIDE3MDksCisgICAgICAgNTUwLCAgLTMzOTAsICAgIDMxOSwgICAgIDI0LCAgICA2NDQsICAgMzE1NCwgICA0NTAzLCAgLTE5NjEsCisgICAgICAgNzQ0LCAgICAxOTQsICAgLTE1MSwgIC0xMjU1LCAgLTEzMTgsICAgMzAzMywgICAtODk5LCAgICAtMTgsCisgICAgICAgICAxLCAgICAgIDAsICAgICAgMiwgICAgICAwLCAgICAgMjgsICAtMTIxMywgIC0zNzI1LCAgLTI1MjUsCisgICAgICAtMTc3LCAgLTExNjQsICAgIDM2MSwgICAtMzU3LCAgIC02NDksICAgLTQ1OSwgICAxMzI0LCAgIDI0NjMsCisgICAgIC0zMTA4LCAgLTMzMjMsICAgLTU3NSwgIC0yNzQ0LCAgIC0xMDgsICAgLTEyMSwgICAtNTA4LCAgIC01NjQsCisgICAgICAtODQ5LCAgIC03NzMsICAgLTI4OCwgICAgICAwLCAgICAgIDgsICAgICAgMCwgICAgIC0yLCAgICAgIDUsCisgICAgICAgNjkxLCAgIC02MDIsICAgMjI2OSwgICAyMzczLCAgLTIwMjcsICAgIDc4NiwgICAzMDExLCAgIDMyMzQsCisgICAgIC0xMzg3LCAgIC0zMTAsICAgIDY1OSwgICAtMzU4LCAgIDEwNTgsICAtMTU1NCwgICAxMDMxLCAgICA3OTUsCisgICAgICAyMjU0LCAgIC01NDksICAgIDMzNCwgICAgMzI1LCAgICA1OTksICAgIC0zNiwgICAgIC0xLCAgICAgLTEsCisgICAgICAgIC0yLCAgICAgIDMsICAgICAgNCwgICAtNDUwLCAgIC01MzMsICAtMTY1NywgIC0xOTI4LCAgLTEwMzQsCisgICAgICAtNjM2LCAgLTE0NDYsICAgLTMyMCwgICAyNjk1LCAgIDExODQsICAgIDY5NywgICAxMTI2LCAgIDExNTksCisgICAgICAyOTcwLCAgICA0NDksICAgIC0zMCwgIC0yMDU4LCAgLTExNzEsICAgLTY4NCwgICAgLTY2LCAgICA5MDUsCisgICAgICAgLTQzLCAgICAgIDEsICAgICAgMCwgICAgICAzLCAgICAgIDAsICAgICAgMywgICAgMjI4LCAgICAyNzIsCisgICAgICAgLTc5LCAgIC03MTgsICAgMTk3OCwgICAgNjY3LCAgLTI3NjAsICAgMTUwNywgIC0xODkzLCAgIC03OTYsCisgICAgICAxMTY0LCAgICAgMzUsICAtNDQ0MCwgIC00NDkyLCAgLTE2NjcsICAgNDE4OSwgICA2NDg1LCAgIC00OTUsCisgICAgICAxNzIxLCAgLTE2MzksICAgLTUyNiwgICAgNDU4LCAgICAgIDAsICAgIDM4NSwgICAtMTgzLCAgICA1MTEsCisgICAgICAtMTUzLCAgLTIwMjUsICAgLTM3NiwgICAyOTQ4LCAgLTI2MDYsICAgLTkxMCwgICAtNzQxLCAgIC00MjcsCisgICAgIC0xMDgwLCAgIDIxMjgsICAgIDU2NSwgICAtNDgzLCAgIDE3OTEsICAtMjIyMiwgICAgLTQ1LCAgLTEyMDQsCisgICAgICAgNzk5LCAgICA1MTIsICAtNDc5MCwgICAxNDYyLCAgICA1MTEsICAtMTkwNiwgICAgIDE1LCAgICAgIDAsCisgICAgICAgICAwLCAgICAgIDEsICAgICAgMywgICAgICA4LCAgIC04NjcsICAgLTY4NSwgICAtMTQwLCAgIDUyOTksCisgICAgICAgMzc2LCAgIC04OTEsICAgMTY1NywgICAxODQzLCAgLTE0NjUsICAtMTI5NywgICAgNTE4LCAgLTQ2NDAsCisgICAgICAgMzAzLCAgIC0yNzcsICAgLTY1MCwgICAgLTk3LCAgIDIzMDgsICAgLTY3OSwgICAgNzIwLCAgIC0xNzEsCisgICAgICAtNDc1LCAgIC0yNjksICAgICAgMCwgICAgIC01LCAgICAgIDQsICAgICAtMSwgICAgICA5LCAgLTExNTUsCisgICAgIC00OTU0LCAgIDE2ODQsICAtMjA0NSwgICAgOTM5LCAgICA4MTksICAgLTc1MSwgICAtMTY1LCAgICAtOTMsCisgICAgIC0yMzI3LCAgICAzMDYsICAgIDk2NSwgICA0OTk5LCAgICA1NTcsICAgIC01NSwgICAtOTk5LCAgICAgMzAsCisgICAgICAgLTM2LCAgICA5ODksICAtMTY4MCwgIC0xNTk0LCAgICAzMTgsICAgICAtMywgICAgIC04LCAgICAgLTQsCisgICAgICAgICAxLCAgICAgLTksICAgLTQwMiwgICA4MTkyLCAgICA0NzUsICAgMjA4MCwgICAtNDE4LCAgLTE3MzksCisgICAgICAtMjczLCAgICAtNTUsICAgLTQ0MSwgICAgNzk0LCAgICAtNzksICAgIDI3MiwgIC0yMDM5LCAgICA3ODksCisgICAgICAyMjY2LCAgICA4NzQsICAgMjQ5NSwgICAgNjI3LCAgIDIyMDMsICAgMTIxMiwgIC0xMDUyLCAgICAzODksCisgICAgICAgIDE0LCAgICAtMjQsICAgIC01OSwgICAgIDEwLCAgICAxMzMsICAgLTUzNSwgIC0xMTYwLCAgLTExMzksCisgICAgICAtMTQ2LCAgICAxODAsICAgMTA2NCwgICAzNzE4LCAgLTE0MTIsICAgMTE1MywgICAxODczLCAgIC01NDksCisgICAgIC0xNjk4LCAgLTE0NzksICAgIDIwOSwgICAgNzI1LCAgIC05NDAsICAgMjE1MiwgICAxODQ4LCAgICA2NzgsCisgICAgICAyNDkzLCAgIDQ2MDgsICAgIC0xMSwgICAgICAwLCAgICAgLTEsICAgICAtMywgICAgIC0zLCAgICAgIDIsCisgICAgICAgMzM0LCAgICA2ODEsICAgIDY3MywgIC04MTkyLCAgIDM5NTgsICAtMzExMSwgICAxNjQxLCAgIDE1MDAsCisgICAgICAxMTg0LCAgIC0yNjgsICAtMzE0NywgICAgNTcxLCAgICA5NTgsICAgLTY2MywgIC0xMDMxLCAgIC04NzAsCisgICAgICAtNjc0LCAgLTEwOTgsICAgLTUyOSwgICAgIDc4LCAgIDEyMTIsICAgIDEyMCwgICAgIC04LCAgICAtMTMsCisgICAgICAgIC01LCAgICAtNDIsICAgIC0zNywgICAtNDk4LCAgIDEzMDQsICAtMjU0MSwgICAxNzMwLCAgIC0zNTUsCisgICAgICAxNDYyLCAgIDIzMTUsICAgMjAxNywgICAtNDAzLCAgLTIwMTAsICAgIDU1NSwgICAxMzkxLCAgICA4ODcsCisgICAgICAyMDM5LCAgICAzNjYsICAgIDEzNSwgICAgIDg1LCAgICAzNzEsICAgMTI5MSwgICAtMjI1LCAgICAzMzUsCisgICAgICAgLTQ1LCAgICAgIDAsICAgICAgMSwgICAgICAyLCAgICAgLTEsICAgICAgMiwgIC0xMDk1LCAgIC0yNjEsCisgICAgICAzMjQ5LCAgIDMyMTIsICAtMTg3NywgICAgOTM0LCAgLTE2NzEsICAtMTI4OSwgICAxMzk4LCAgLTIyODcsCisgICAgICAtMjA1LCAgIDE2NTksICAgIDY0MiwgICAxMTA1LCAgICA3NTEsICAgMjg2NCwgICAxMTcxLCAgLTEwMDEsCisgICAgICAgMzE4LCAgIC0yOTAsICAgICA2MCwgICAgLTU0LCAgICAgIDUsICAgICAgMywgICAgICA1LCAgICAgIDIsCisgICAgICAgICAxLCAgIC0xMDUsICAgIDU5MCwgICAgIDM2LCAgIC0xOTQsICAgMTgzMiwgICAtNjM5LCAgICA3NzcsCisgICAgICAzMjQzLCAgICA1NzgsICAgMjgyMCwgICAgNDI4LCAgIDIwMjAsICAgIDYyMywgIC0yMTA0LCAgICAtNTIsCisgICAgICAtMzMxLCAgLTEwMTUsICAgMzA2NCwgICAtMzQ3LCAgIC0zMDMsICAtMTEwMCwgICAgIDYxLCAgICAgLTEsCisgICAgICAgIC0xLCAgICAgIDAsICAgICAgMiwgICAgIC0xLCAgICA1OTIsICAgIDEyNywgICAgODg3LCAgLTEwOTQsCisgICAgIC0yODE5LCAgIDI1NzMsICAtMjY3MCwgIC0xNjkzLCAgLTI3NzUsICAgICA0OCwgICAtMjY2LCAgIC05NjEsCisgICAgICAxMjIwLCAgIC00NzIsICAgIDE2NywgICAzMjAxLCAgIDExMTgsICAgLTE3MywgICAxMzA0LCAgICAtMjYsCisgICAgICAtODk5LCAgICAgNzYsICAgICAgMCwgICAgICAzLCAgICAgIDAsICAgICAgMSwgICAgIC0xLCAgIC03MTgsCisgICAgICAtNzQ2LCAgICA5NDcsICAgLTUyNCwgICAgMTQyLCAgICA5NTgsICAtMTYwOSwgICAtNzc3LCAgLTEzNjIsCisgICAgICAgMzg1LCAgIC01NzgsICAtNjk0NywgICAgMTU3LCAgIC0yOTAsICAgMTM1NywgIC0xNzAzLCAgICA0ODQsCisgICAgICAgMTE3LCAgLTIyMjQsICAtMzczNiwgICAtODM4LCAgICAtOTYsICAgICAtMSwgICAgIDExLCAgICAgIDUsCisgICAgICAgICA0LCAgICAgIDIsICAgIDQ3NSwgICAtNDI2LCAgICA1MDAsICAgLTc2NywgIC0yMzA0LCAgIDEyNDgsCisgICAgICAyMjAwLCAgLTE4MjksICAgLTk5MiwgICAtMjI1LCAgIC01NzMsICAtMTEwNywgICAtODMyLCAgIDI1NTUsCisgICAgIC0yODY2LCAgIDM0NTMsICAgNDMzNSwgICAgLTg4LCAgLTExNjAsICAtMTY2NiwgICAgLTk0LCAgICAtMzMsCisgICAgICAgICAwLCAgICAgIDAsICAgICAgMSwgICAgIC0yLCAgICAgLTcsICAgLTE0NywgIC04MTkyLCAgIDEyMDQsCisgICAgIC0xMTgxLCAgIC03MDIsICAgLTYwNCwgICAtNzcwLCAgIDEwMzIsICAgLTE3MywgICAgNzcwLCAgICA4NjEsCisgICAgICAgNjExLCAgIC01MDksICAgIDgwMiwgICAtNDY3LCAgICA4MzksICAgIDQ5MSwgICAtNzg1LCAgICA1MjMsCisgICAgICAtNjY5LCAgICAgNzMsICAgIC0zNCwgICAgICAwLCAgICAgIDAsICAgICAtMiwgICAgIC0zLCAgICAgLTMsCisgICAgICAgMjg2LCAgLTIxODMsICAtMTIzOCwgICAxNzQzLCAgICAzODcsICAtMjIyOCwgIC0xNDA0LCAgLTM0MzksCisgICAgIC0xNzAxLCAgLTIzNzEsICAgLTQ1MSwgICAyMjk0LCAgIDIwNjEsICAgMzA2MiwgIC0xMTIyLCAgLTE0ODksCisgICAgIC0xMjc0LCAgICAgNTEsICAgNTY0OSwgICAtMTcwLCAgIDIxOTcsICAgIDM2NSwgICAgIC0xLCAgICAtMTMsCisgICAgICAgICA0LCAgICAgIDMsICAgICAtNSwgICAgLTE1LCAgLTQwOTksICAgIDc4OSwgICA0MTMyLCAgIDQ5ODIsCisgICAgIC0xOTk2LCAgICA3ODQsICAgIDc0OCwgICAyMTIzLCAgIDM1MzUsICAtMTQ5MywgIC0xNDU0LCAgIC0zNDQsCisgICAgICAtODY3LCAgICAgNDAsICAgIDgzMSwgIC0xMTk4LCAgICAgNjYsICAgIDU0MiwgICAxNjMzLCAgLTI0MDIsCisgICAgICAgMTE3LCAgIC0xMTksICAgIC0xOCwgICAgIDQ5LCAgICAgMTgsICAgICA0MCwgICAtNTAwLCAgICA4MDgsCisgICAgICAtNzI2LCAgIDExOTIsICAgMzYyMywgICAxNTI2LCAgIC00ODQsICAgMTA4MCwgIC0yNTAyLCAgIC01NzksCisgICAgICAxMzE1LCAgLTE4ODcsICAgICA4NCwgICAxNzcxLCAgLTI5MDIsICAgMTM4NywgIC0xMDk4LCAgIDE1NTksCisgICAgIC0xMTI2LCAgICA2NTIsICAgLTg5NiwgICAgIDMyLCAgICAgLTEsICAgICAgMywgICAgICAxLCAgICAgIDMsCisgICAgICAgIC0yLCAgICAyMzMsICAgIDc4MiwgICA4MTkyLCAgICA1NjYsICAgLTcwMSwgICAtMzUyLCAgIDEwNDcsCisgICAgICAgNTgxLCAgLTEwNzAsICAgMzE1OSwgIC0xMTU3LCAgLTE1ODUsICAgMTU5OSwgICAtOTc4LCAgIC02NjMsCisgICAgICAtOTMxLCAgLTI1ODEsICAgNTA3NCwgICAgNzgxLCAgIC01NTEsICAgLTU5MCwgICAtMjQ3LCAgICAtNjMsCisgICAgICAgLTU0LCAgICAtNTAsICAgIDI1MywgICAtMTM4LCAgIC0zMTMsICAgIDM4NywgIC0zMDA0LCAgLTExMzYsCisgICAgICAgNjU0LCAgLTEyODMsICAgMTMxOCwgICAgNDM0LCAgICAgODAsICAtMTQ4NiwgICAgNjk0LCAgIC01MTIsCisgICAgICAgMzkzLCAgIC0yMzgsICAgLTcwMCwgICAtMjMyLCAgICA3MDYsICAgMTQ3OCwgIC04MTkyLCAgICAzNzcsCisgICAgICAgNjAxLCAgICAgMTgsICAgICAtMSwgICAgIC0zLCAgICAgIDAsICAgICAtNiwgICAgIC0zLCAgIDIyMjEsCisgICAgICAzNTMxLCAgIC04NjIsICAgMTc5MiwgICAtMjQyLCAgLTM2ODYsICAgIDQyMCwgICAxODkxLCAgICA5MTgsCisgICAgICAxMzI0LCAgICAyMzQsICAgLTgxOSwgICAtNjAxLCAgIDIzNjMsICAtMTA5NywgICAyMzU1LCAgICA3NTQsCisgICAgICAtMTI1LCAgICAyNDUsICAgLTYxNSwgICAzMjg1LCAgICAyMDQsICAgICAgMCwgICAgICA2LCAgICAgLTQsCisgICAgICAgIC0zLCAgICAgLTEsICAgLTYzNywgICAgNjczLCAgIDEyMzMsICAgMjg4NiwgICAgMjY1LCAgIC0xOTUsCisgICAgICAtMjI2LCAgIDI1MjEsICAgIDI4MSwgICAtMjEwLCAgIDE4MDksICAtMjczMywgIC0zODY1LCAgLTIyODcsCisgICAgICAgNjQxLCAgLTI2MDQsICAtNDIzNSwgICAgMTA3LCAgICA3ODksICAgMTE2MywgIC0yNjAwLCAgIC00NjMsCisgICAgICAgIC01LCAgICAgMTAsICAgICAgMiwgICAgLTEwLCAgICAgMzksICAgMTM4MCwgICAgNzU0LCAgLTUwNzcsCisgICAgICA0MDYxLCAgLTE2MzMsICAtMTczOCwgIC0xNjA0LCAgIDE5MzcsICAgMTgxNSwgICAxMDM5LCAgIDM2OTYsCisgICAgICAtNTkzLCAgIDIyMTgsICAtMTA2MSwgICAxMDgxLCAgLTEyMTcsICAgMjA2MiwgICAtNjM3LCAgLTE1ODAsCisgICAgICAgMTQ5LCAgIC02MjYsICAgLTI1MywgICAgIC0zLCAgICAtMTcsICAgICAgMiwgICAgIDMzLCAgICAgIDEsCisgICAgICAgMTE4LCAgICA1MjUsICAgIDE1OCwgICAxMjEzLCAgICA5MTAsICAgLTEwNSwgIC0xNDM3LCAgLTEzMTEsCisgICAgICAyMjU1LCAgIC00MTksICAtMjM5NCwgICAxNTQyLCAgLTM4MzAsICAtMTE2NywgICAtOTk4LCAgLTEwOTksCisgICAgICAxNjM1LCAgIDE2NzgsICAtMTExMiwgICAtMjc1LCAgICAxMjIsICAgIC01MCwgICAgICAwLCAgICAgIDMsCisgICAgICAgICAwLCAgICAgLTEsICAgICAtMSwgICAgOTk4LCAgLTQwMjAsICAtMTkxMywgIC0xMDgzLCAgIC0xNTksCisgICAgICAxODUzLCAgIC00MzYsICAgLTY4MywgICAgMjk4LCAgICAyMTEsICAgIDcxMSwgICA0MTI4LCAgLTE5NzcsCisgICAgICAtOTU4LCAgIDEwNDgsICAgIDY0MiwgICAtNDIwLCAgICAzMjksICAtMTE1MCwgICAgNDU5LCAgIDIxNjEsCisgICAgICAgIDI5LCAgICAgLTQsICAgICAgMCwgICAgIC0xLCAgICAgLTYsICAgICAgMSwgICAxMzY1LCAgIDEwNTMsCisgICAgICAxMDMyLCAgICA5NTIsICAgIDg1NCwgICAyNDA1LCAgIDUxMDYsICAgMTg2MywgICAzMDQ5LCAgICA5ODEsCisgICAgICAtODYzLCAgIC0zOTcsICAgIDUwOCwgIC0xMjgzLCAgIC02MzEsICAgICAxNywgICAgNTMyLCAgLTE0NTMsCisgICAgIC0xMDU2LCAgICAgNjYsICAgIDUwMSwgICAgLTI3LCAgICAgLTEsICAgICAgMywgICAgIC0xLCAgICAtMTMsCisgICAgICAgIC0yLCAgIC0yNzMsICAtMjkyNCwgICAgODM5LCAgIC00MzMsICAgLTM5NSwgICAtMjUyLCAgIDE5NDUsCisgICAgICAgMTk1LCAgIC0zMDcsICAtMTI5NywgIC0xNDc0LCAgIC05ODUsICAgNDQxMiwgIC0xMDE3LCAgIDEwNzQsCisgICAgICAyNzExLCAgICA5OTYsICAgIDkxOSwgICAgMTgzLCAgICAtMTAsICAgLTYwNSwgICAgIDM4LCAgICAgIDEsCisgICAgICAgIC0xLCAgICAgLTEsICAgICAgMiwgICAgICAxLCAgIDIxMTUsICAgLTQyMiwgICAzNjU1LCAgLTE5NzIsCisgICAgICAxNDczLCAgLTIwMzMsICAgMjQ2MSwgIC0xMTEyLCAgLTEyNjcsICAgIDE3OSwgICAtMzk0LCAgIC05MDYsCisgICAgIC0xMjczLCAgIC00MzIsICAgMTA4MiwgICAgMzY3LCAgIC03MjAsICAgMTc0NiwgICAtNjU3LCAgICA1OTUsCisgICAgICAgNzAxLCAgICAgMTYsICAgICAtMSwgICAgICAwLCAgICAgIDAsICAgICAgMiwgICAgIC0zLCAgIC0yNTUsCisgICAgICAgNDQzLCAgLTE4NDAsICAtMjM3OSwgICAgMjk2LCAgICAyNTgsICAgLTY3NSwgICAtMjIxLCAgICA0MDYsCisgICAgICAtMjE2LCAgLTYyOTUsICAtMTA0MSwgICAxMDYyLCAgICAxOTksICAgMTcwNSwgIC0xMDMyLCAgLTE2MjcsCisgICAgIC0yMzk5LCAgICAxOTgsICAtMTA5NywgICAtMjcxLCAgICAtOTksICAgICAgMCwgICAgICAxLCAgICAgLTIsCisgICAgICAgICAyLCAgICAtMTMsICAgIDM0MywgICAtMjE5LCAgLTE0NDcsICAgMTc3OSwgICAgNjMwLCAgLTE5NDQsCisgICAgIC0xMDkzLCAgLTE1NzgsICAgIC02MiwgIC0xMzM0LCAgIDI4MTEsICAgLTgxNSwgICAxMzExLCAgLTMxMDIsCisgICAgICAtMzAwLCAgICAgNjcsICAgICAyNCwgICAgIDk4LCAgICA3NjQsICAtMTI0NiwgICAgMjAzLCAgICAgIDYsCisgICAgICAgICAwLCAgICAgLTQsICAgICAgMCwgICAgICAxLCAgICAgIDAsICAgIC0xOCwgIC0xNzA0LCAgLTE0MjcsCisgICAgICAtMzUyLCAgLTI2NjUsICAgLTU4OCwgICAgMjg3LCAgICA3MTUsICAgLTQ1NCwgICAgNjg4LCAgIC00MjQsCisgICAgICAxNzM2LCAgLTExMjQsICAgMTAyOCwgIC03NTgxLCAgIC03NTIsICAgLTQ4MiwgICAtMzYzLCAgICAtNzUsCisgICAgICAtNzIwLCAgIC02MTksICAgIDQ0OSwgICAgICAwLCAgICAgIDMsICAgICAgMCwgICAgIDE2LCAgICAgLTMsCisgICAgIC0xMjExLCAgIDI0ODQsICAgMzQ5MCwgICAtNTQ3LCAgIC03MDUsICAgMTc3NiwgICAtMjg2LCAgLTE1ODAsCisgICAgICAyODk2LCAgLTIyNTcsICAgLTIxNCwgIC0xNzg0LCAgLTEyNjYsICAgLTU2MiwgIC0xMTcwLCAgIC01NDIsCisgICAgICAgNzg1LCAgIDE2MDYsICAgIDUzNSwgICAgIDUxLCAgLTE0MDUsICAgICAtNywgICAgIC0xLCAgICAgLTEsCisgICAgICAgICAwLCAgICAgLTEsICAgICAgMiwgICAtNDI4LCAgIC01NzksICAtMTA5MSwgIC0yNjI3LCAgIDIyODcsCisgICAgICAtNzU3LCAgIDE0NDUsICAgLTQxMSwgICAtMTYwLCAgICA1NjcsICAgIDEwOCwgIC0xMzA1LCAgLTQzNTYsCisgICAgICAtMzkwLCAgIC05MTcsICAgIDM0NSwgIC0yMTY5LCAgIC04OTYsICAgMzc3MiwgICAxMjI0LCAgICA2OTEsCisgICAgICAgLTI1LCAgICAgIDEsICAgICAgMSwgICAgICAxLCAgICAgLTIsICAgICAgMSwgICAgMjgxLCAgIDEzNjUsCisgICAgIC0xNjI4LCAgIC01ODUsICAgMzQ4NSwgICAgMTY5LCAgICA3NDYsICAgLTM5NSwgICAxMDcyLCAgIDE1NjksCisgICAgIC0xMDczLCAgICA3NDQsICAgMTI3NCwgIC0zNDcyLCAgIDEwMzUsICAgLTkwNiwgIC0zMzk0LCAgLTE1MzcsCisgICAgICAtODY5LCAgIDI4NDEsICAgIDQwMSwgICAgICA0LCAgICAgLTEsICAgICAtMywgICAgIC0zLCAgICAgLTEsCisgICAgICAgIC0zLCAgICAtMzcsICAtMTYyOCwgICAtODg4LCAgICA3ODUsICAgMzMyOCwgICAxMTA1LCAgIDM1NTEsCisgICAgICA2OTQ2LCAgLTE2ODgsICAgMjY5MCwgIC0yMDUxLCAgLTIyMTIsICAtMzc1MCwgIC0xOTAzLCAgIC00OTcsCisgICAgICAxMjUxLCAgIDExODcsICAtNjE5OCwgICAzOTMwLCAgICAgODUsICAtMTA3NywgICAgIDE2LCAgICAtMjMsCisgICAgICAgLTgwLCAgIC0xMzAsICAgICA0MywgICAgIDY2LCAgIC05NzQsICAgIDU3OSwgIC0yMDQ3LCAgLTM2MDcsCisgICAgICAtNjY2LCAgLTIyNDgsICAgNDYxOSwgICA2ODQ2LCAgICAgODgsICAgLTY0OSwgICAxMTI5LCAgIC0yNTUsCisgICAgICAzNTY3LCAgIC0xMjQsICAgICA0MSwgICAgIDU4LCAgICA2MzQsICAtMTI1MiwgICAgNjk2LCAgIDI1MzYsCisgICAgIC0xNTkwLCAgICAyMDksICAgICAxMiwgICAtMTAyLCAgIC0yNzUsICAgICAyNywgICAgMjE2LCAgIDExMTAsCisgICAgICAgMjU5LCAgLTIwOTEsICAgMTc3NSwgIC0zNzY4LCAgICA1OTgsICAgIDQ0MSwgIC0xODA5LCAgIC00MzEsCisgICAgICAgIDIyLCAgIC05OTEsICAgLTYyMSwgICAgIDg0LCAgLTE4MDMsICAgMTU4NSwgICAgNTU5LCAgLTExMDEsCisgICAgICAgIDQyLCAgICA0NTYsICAgLTM5MiwgICAtODc0LCAgICAgLTQsICAgICAgMCwgICAgICAwLCAgICAgIDEsCisgICAgICAgIC0xLCAgICAgIDAsICAgLTM3MSwgICAtMjExLCAgIC0zMzksICAtMTIzMiwgICAgNDM4LCAgLTI2ODMsCisgICAgIC0xMDA3LCAgIDEyNTAsICAgNTM0MywgICAgODYxLCAgLTEzMDUsICAgLTU3NywgICAyMTA3LCAgLTI2NDksCisgICAgIC0zMjI3LCAgIDEwMjAsICAgLTEyNywgICAgNTYyLCAgIDU0OTUsICAtMzEzNiwgICAtNDE0LCAgIC01MjksCisgICAgICAgIDEyLCAgICAtNTMsICAgIC0zNCwgICAgMTUxLCAgICAxMDYsICAtMjk0NiwgICAtNTc1LCAgLTE3OTYsCisgICAgICAzMDk1LCAgIC0yNTcsICAgLTU5MSwgICAgMTI2LCAgICA5NjcsICAgLTU0NywgICAtMjcxLCAgICA1NjAsCisgICAgICAgOTc0LCAgLTMzMzUsICAtMjExMCwgIC0xNDAzLCAgIDU5MTUsICAtMTEwOCwgICAgMzg4LCAgLTEyNjYsCisgICAgICAtNTIyLCAgICAzMzYsICAgIDE2NywgICAgICAxLCAgICAgLTMsICAgICAtMiwgICAgICAyLCAgICAgLTMsCisgICAgICAtMzEyLCAgICAgMTksICAgMzM1NiwgICAxMTIzLCAgIC02NzYsICAgLTI0NywgICAgNjk3LCAgICA1NDgsCisgICAgICAxNzY4LCAgIDExNzQsICAgLTUyNSwgICAtMjUzLCAgIC00MjMsICAgIDU0NiwgIC0yMzczLCAgLTI5NDAsCisgICAgIC0xMDU1LCAgLTIzMDQsICAgIDIwMywgICAxMzA5LCAgIC01NzQsICAgICAtOCwgICAgICAwLCAgICAgLTMsCisgICAgICAgICA0LCAgICAgIDAsICAgICAgNCwgICAtMjE1LCAgIDgxOTIsICAgLTY3MCwgIC0xMjg5LCAgLTE1NDcsCisgICAgICAtMzA0LCAgIDE0OTgsICAgLTk2NywgICAtNTI5LCAgIC01ODIsICAtMjIwNSwgICAxNzUyLCAgICAzMjEsCisgICAgICAgNTczLCAgLTEwOTYsICAgICA2NCwgICAxMTUyLCAgICAtODcsICAgIDU3NCwgICAtMjUwLCAgICA1MzksCisgICAgICAgIDYyLCAgICAgIDcsICAgICAgMiwgICAgIC0xLCAgICAgLTMsICAgICAgMywgICAtNDY1LCAgICAyNDMsCisgICAgIC0xMTc5LCAgICA4MjgsICAtMjUwMSwgICAtMjIzLCAgICAxOTgsICAgLTg4MywgICAtNzQwLCAgIDExMTMsCisgICAgIC0xODIxLCAgLTIwNjgsICAtMzIzNCwgICAxNzE1LCAgIDE5ODksICAgMTgxNywgICAgNzI3LCAgIDE2NDAsCisgICAgICAzMzg2LCAgLTE1MzgsICAgLTg2NCwgICAgIDQ1LCAgICAgIDAsICAgICAtNCwgICAgICAwLCAgICAgIDAsCisgICAgICAgICAyLCAgICA2MDgsICAtMTQ5NSwgICAxMjU5LCAgIC0xMzIsICAgMTMxMSwgICAgMzUwLCAgICA1MzcsCisgICAgICAyNzM1LCAgIDE0MjgsICAgIDE1MSwgICAxMzI0LCAgICA1NDcsICAtMzk4MywgIC0xODkyLCAgICAxMDQsCisgICAgICAyMDIzLCAgIDE5MDgsICAtMTA0MiwgICAxMTMwLCAgIDEyNTIsICAgLTcwMSwgICAgICA5LCAgICAgIDAsCisgICAgICAgIC0yLCAgICAgLTEsICAgICAgMSwgICAgICAxLCAgICA2MDIsICAtODE5MiwgIC0yNzc2LCAgIC02NjEsCisgICAgICAxNjQwLCAgICA0NDMsICAgMzQ1MiwgICAtNzM4LCAgICA4MjksICAgIDYzNywgICAgMjkyLCAgICAyMzIsCisgICAgICAxMzUyLCAgIDQ4NzksICAgMTQyOSwgICAgOTEyLCAgICA2NDksICAgMTU5MywgICAgMzA4LCAgIC0zMzAsCisgICAgICAgIDY4LCAgICAgNjMsICAgICAtMywgICAgICA0LCAgICAtNTcsICAgICAyNiwgICAgIDI1LCAgIDEyNTAsCisgICAgICAgNDAwLCAgLTQ4MzksICAgIDIxMSwgIC0yNzQ4LCAgIC02NjQsICAgIDk5NiwgICAgMzQxLCAgLTEwNTMsCisgICAgICAgMzIxLCAgIDI0NTgsICAgIDc2NCwgICAgNzQzLCAgIC03MjksICAgICAxMiwgICAtMjgzLCAgIC0zNDYsCisgICAgICAgMTE4LCAgIC0yNDksICAgLTE1MywgIC0yMzI5LCAgICAtMzcsICAgICAgMCwgICAgIC0xLCAgICAgIDAsCisgICAgICAgICAxLCAgICAgIDEsICAgIDM1MiwgICAtODc4LCAgIDIzMzYsICAgLTYzNCwgIC0yNjkwLCAgLTM0MTUsCisgICAgIC0yOTQ5LCAgIC01MzEsICAgMTI1OSwgICAgMzk0LCAgICAxNjMsICAgLTk5NCwgICAgODQ1LCAgIDEyNTksCisgICAgICAgODkwLCAgIDE0MDAsICAgIDI3OSwgICAxOTA4LCAgICAxNjEsICAtMjE3NCwgICAxODc2LCAgICAgNzYsCisgICAgICAgICAxLCAgICAgLTEsICAgICAtMSwgICAgIDEwLCAgICAgIDAsICAgICA0NywgIC0xMTIzLCAgIDE2MTEsCisgICAgICAgNDg5LCAgICA2MTgsICAgLTgxNiwgICAgIC03LCAgIDIwMDEsICAtMTE5MCwgICAxODU3LCAgLTI3NDksCisgICAgICAtMzExLCAgIC0zMzEsICAgIDczMywgICAxNDEyLCAgIDEzOTAsICAtMTUyNSwgICAxMjYyLCAgLTEzOTMsCisgICAgICAtMjYzLCAgIDMxMjQsICAgIC05OCwgICAgICAwLCAgICAgIDEsICAgICAgMCwgICAgICAxLCAgICAgLTIsCisgICAgICAgNTE0LCAgLTM1MzMsICAtMjM5NCwgICAzNjIzLCAgICAyNDksICAtMTA1NiwgICAgNTE1LCAgIDEyNzksCisgICAgICAyODIxLCAgICA0NzcsICAgIDE4MywgICAgNjg5LCAgIDExODIsICAgMTM3OCwgICAxMjg3LCAgIC03MTEsCisgICAgICAxMjY0LCAgIC03MTMsICAgLTI3OCwgICAgMjE3LCAgIC02NjQsICAgLTIyNSwgICAgIC0xLCAgICAgIDAsCisgICAgICAgICA2LCAgICAgIDIsICAgICAgOSwgIC0xMTcxLCAgIDMxMTksICAgMTM0MCwgIC0xMjI5LCAgLTE5MjksCisgICAgICAxOTg0LCAgLTEzMzMsICAgMTAxOCwgICAgIDEwLCAgIDEyMDUsICAgICA2MywgICAgMzU4LCAgLTExMDgsCisgICAgICAtNDU1LCAgIC00MTMsICAgIDg1NCwgIC0xNTUwLCAgIC00MjMsICAgLTE4MCwgICAyNTI5LCAgLTgxOTIsCisgICAgICAgLTE4LCAgICAgIDAsICAgICAtMiwgICAgIC0xLCAgICAgIDAsICAgICAgMCwgICAtNjc4LCAgIDM4MTksCisgICAgIC0xMzE2LCAgIDExNTksICAgIDU5MCwgICAtMjMxLCAgIDIyMDMsICAtMTUzMywgICAgOTg2LCAgIDQyODksCisgICAgICAxMTE0LCAgIDExMzUsICAtMTE2MiwgICAtOTIxLCAgICAtNTgsICAgIDY5MSwgICAgIDExLCAgLTE3MTgsCisgICAgICAtMjcwLCAgIC01MzEsICAgIDUzMCwgICAgIDY1LCAgICAgIDAsICAgICAtMSwgICAgICAxLCAgICAgIDQsCisgICAgICAgICAwLCAgLTExODQsICAtMTM1OSwgICA3MjMwLCAgIC01MzMsICAtMjA3NywgIC0xMTg4LCAgICAxMTMsCisgICAgIC0xNDcyLCAgICA0OTAsICAgMTUxOCwgICAxNDc2LCAgLTE4ODUsICAgIDkzNCwgICAgMjQ0LCAgIDE4NDAsCisgICAgICAtNjk2LCAgIC00ODAsICAtMjQ3NiwgICAzMzI0LCAgLTI0MzMsICAgMTEwMiwgICAgMTIwLCAgICAgIDEsCisgICAgICAgLTExLCAgICAgLTIsICAgICAxOCwgICAgIC0zLCAgLTEwMTYsICAgIDE4OSwgIC0zODM1LCAgLTE2NTksCisgICAgICAgLTQ2LCAgIC0xODAsICAtMjY1OSwgICAxOTk4LCAgLTE0MzcsICAgMTEwNywgIC0yMjQ4LCAgICAxNjUsCisgICAgICAtNjU3LCAgLTUwNzksICAgLTIyNCwgICAxMjQ2LCAgICA0NjksICAgIDQyMSwgICAxMTQ1LCAgIDExNDgsCisgICAgICAgIDg0LCAgICAtMTgsICAgICAgMywgICAgICAwLCAgICAgIDAsICAgICAtNiwgICAgICAwLCAgICAtNjYsCisgICAgICAtMjA2LCAgIDIyNzksICAgLTIyMCwgICAxNjA2LCAgIC00MjEsICAtMTQ4MiwgICAtNDEzLCAgLTEyMzcsCisgICAgICAgMzc0LCAgIDM2OTEsICAgIDQ5MSwgICAtNzc0LCAgICA0MTAsICAgIDc5MSwgICAgMzgwLCAgIDMzODUsCisgICAgICAgNjE1LCAgIC05NTAsICAgLTYyMCwgICAtMTk3LCAgICAgNjUsICAgICAtMSwgICAgICAzLCAgICAgLTMsCisgICAgICAgICAyLCAgICAgLTEsICAgLTQ4NCwgICAxMzk2LCAgICAyNzMsICAtMzU5MSwgICAxMzE3LCAgLTEwMTMsCisgICAgICAxNTYzLCAgIC0xMzQsICAgIDYwMiwgIC0xMDY5LCAgICA3MzMsICAtMTE2NywgICAgMjMzLCAgICAzMTksCisgICAgICAtMjYyLCAgICAzNTAsICAgIDc4MCwgICAtNDA3LCAgIC00OTYsICAtMTI4NSwgICAxMzI2LCAgICAtMTMsCisgICAgICAgICAwLCAgICAgIDIsICAgICAtMSwgICAgICAwLCAgICAgLTEsICAgLTMyOCwgICAtNjI2LCAgIC04NDgsCisgICAgICAgNzQ1LCAgLTEwNDcsICAgNDA0OCwgICAtMzgwLCAgIC00NTYsICAtMTg5NCwgICAgODY5LCAgLTEwODUsCisgICAgICAtMzczLCAgIDI4MjksICAgIDYyMiwgICAgNDczLCAgICAzOTQsICAgIDIzNywgIC0yMTc1LCAgIDExNjcsCisgICAgIC00OTQyLCAgICAyNDYsICAgIDEwMCwgICAgIC0xLCAgICAgIDEsICAgICAtNiwgICAgICAxLCAgICAgLTYsCisgICAgICAgLTcwLCAgICAgMzUsICAgMTYxMywgICAyNTk3LCAgIDEzMDcsICAgMTc1NiwgIC0xMTg0LCAgIDEwODIsCisgICAgICAgOTcxLCAgLTIwMDQsICAtMTQ1OSwgICAtNDk0LCAgICAtNDAsICAgIDc0NSwgICAyNzg4LCAgIC04MzAsCisgICAgICAgIDc2LCAgICA1MzYsICAtMjAwMiwgICAgNDAxLCAgICAtNTcsICAgIC0yMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgIC04LCAgICAyNDQsICAgMTkyNywgICAxMTYyLCAgLTI0MTYsCisgICAgIC0xNDE0LCAgICA0NjMsICAgIC04OSwgICAxMjE3LCAgIC03OTgsICAgIDM5NCwgIC0xNTI3LCAgIC03MTksCisgICAgICAtNjY2LCAgICA5OTgsICAgMTUxOCwgIC0yNDU1LCAgLTMwNDksICAtMTE3NCwgIC0yNjk2LCAgLTMxMTksCisgICAgICAgICAyLCAgICAgIDAsICAgICAtMiwgICAgICAyLCAgICAgIDIsICAgICAgMywgICAxMDkzLCAgIC02MjMsCisgICAgICAxNjYwLCAgLTE2MzUsICAgMTQ1NywgICAyNTYwLCAgICA3NjMsICAtMjc1MCwgICAgOTMxLCAgIDE3OTgsCisgICAgICAyNTUwLCAgIDE0MDIsICAgIDkxNCwgICAtOTE5LCAgIDE5MzEsICAgLTM4MywgICAtNDM1LCAgIC01ODMsCisgICAgICAgNDM5LCAgICAgIDksICAtMTEwNiwgICAgLTEyLCAgICAgLTEsICAgICAgMCwgICAgICAwLCAgICAgIDAsCisgICAgICAgIC0yLCAgIC0zMzUsICAgLTczMCwgIC0yMTAyLCAgLTE0MTQsICAgMjU3NiwgIC0zODY5LCAgIDEwMjUsCisgICAgIC0xNjU3LCAgICAgLTIsICAgIDg1NywgICAtMzM2LCAgLTMwMTEsICAgIDIwNSwgICAxMTA4LCAgICAzNjQsCisgICAgICAtNzg5LCAgIC0xNzksICAgIDE3MSwgICAgMzMxLCAgIDIyMDQsICAgIDUyNywgICAgLTEzLCAgICAgIDEsCisgICAgICAgIC0zLCAgICAgIDIsICAgICAgMSwgICAgIC00LCAgIC01NjUsICAgLTIxMSwgICAtMTM5LCAgIDE3OTksCisgICAgICAgMTk1LCAgIC04NzcsICAgLTYzMiwgICAgMzU4LCAgIC0yNDQsICAtMTQ1OSwgICAxMzk4LCAgIDIyNzEsCisgICAgICAgNTUwLCAgIDE5ODcsICAgMjIwNiwgICAtMzM3LCAgICAxOTksICAtNzAzNiwgICAgNTg5LCAgICAxOTUsCisgICAgICAtNDY2LCAgICAgNzIsICAgICAtMSwgICAgICAyLCAgICAgIDEsICAgICAgMCwgICAgICAwLCAgICAtMjcsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjA4MDZzbTBbXSA9IHsKKyAgICAgLTgxOTIsICAgIDM4OSwgICAgMjQ1LCAgICAtNjcsICAgIC00MiwgICAgIDc5LCAgICA1MDMsICAgLTQ4OCwKKyAgICAgIC0zMTAsICAgIDEwNywgICAgLTEzLCAgIC00MzEsICAgLTIwMywgICAgIDk2LCAgICA1MTAsICAgIDE1MSwKKyAgICAgICAyNzAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgIC00NjMsICAgIC0yMywKKyAgICAgICAtNzIsICAgLTMyMiwgICAgIDc0LCAgIDE1ODksICAgLTE1MiwgICAtMTk4LCAgICAgODEsICAgMTEyMCwKKyAgICAgIC0xMjUsICAgLTQzNCwgIC0zMjc1LCAgLTIyMTAsICAgLTM0OCwgICAtMzQ0LCAgICAgOTEsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgLTI1NCwgICAtMjI0LCAgICAgNDYsICAgLTE1NCwKKyAgICAgIC0xMzEsICAgLTQ2NSwgICAgLTU3LCAgIDgxOTIsICAgIDM0NSwgICAgMTEyLCAgIC03MjUsICAgIC00OSwKKyAgICAgICAxODMsICAgLTE5MSwgICAgMjQ2LCAgICAyNjMsICAgIDM3MCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgIDM5LCAgIC03MzksICAtNjYwMywgIC0yNDU0LCAgICAtOTUsICAgIDMxMiwKKyAgICAgICAtNTMsICAgLTM5MiwgICAgIDYzLCAgIC0xNjUsICAgICAzMSwgICAtNTA1LCAgICAxMTEsICAgIDQ4NCwKKyAgICAgIC01MzUsICAgIDE3OSwgICAgMTQzLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIDEyNzksICAgLTEzOSwgIC0xNzY5LCAgICAyNDQsICAgICA1OSwgICAtMTM1LCAgIC00MjksICAgIDcwNywKKyAgICAgICA4MDksICAtNDM1NSwgICAtMzU0LCAgICA0MjgsICAgLTMwMCwgICAgMTA4LCAgIC03OTksICAtMTQyMSwKKyAgICAgICA1OTksICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDQsICAgICAtNSwKKyAgICAgICAgIDcsICAgICA3NSwgICAgIDQ5LCAgIDgxOTIsICAgIDI3NiwgICAgMjAwLCAgICAxOTEsICAgLTE2NywKKyAgICAgICAtMTQsICAgICA4MiwgICAgMjIyLCAgIC0yNzcsICAgLTQ4MywgICAtMjE2LCAgIC00NDEsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIDE3MSwgICAtNDIzLCAgICAxNzQsICAgIDQwMSwKKyAgICAgIC01MTcsICAgLTM3NywgICAtMjM0LCAgIC02NDQsICAgLTgyOSwgICAtMzUwLCAgIC05NzYsICAgLTE0NiwKKyAgICAgIC05MjgsICAgIDI5NiwgICAzMDAzLCAgIDM1NDUsICAgIC0zMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgMTYxLCAgLTY3NTMsICAgMTEzOCwgICAtODU1LCAgIC0xMzIsICAgLTI0MiwKKyAgICAgICA1NTksICAgLTIyNSwgICAtMzQ2LCAgIC0xNjgsICAgICAxMCwgICAtNDgxLCAgICAgLTYsICAtMTIwOCwKKyAgICAgICAyNTIsICAgLTMyMywgICAtMTkxLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC0yNjIsICAgIDU3NCwgICAgNDMzLCAgIC0xNDUsICAgIDYyMiwgICAgMzI5LCAgLTI2MzQsICAgLTQzOSwKKyAgICAgLTExNzgsICAgIDM1MSwgICAtNDMzLCAgIC04NDIsICAgNDEyNSwgICAgMjk2LCAgICAzMDUsICAgIDM1OSwKKyAgICAgICAtMjIsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAtMzQsICAgIC01NiwKKyAgICAgLTEwMTksICAgLTI0NywgICAtMTYzLCAgICAzMDUsICAgIDU3NCwgICAgLTUxLCAgIC0xNzksICAgICAyNCwKKyAgICAgLTEwOTcsICAgIDI0OCwgICAtMTY2LCAgICAtMTgsICAgIDMwMywgICAgMjUyLCAgIC01NTUsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgLTQwMCwgICAtMjU0LCAgIC0yNTYsICAgMjc4MywKKyAgICAgIC0yOTYsICAtMTkwNCwgICAgNTUyLCAgIDEyODQsICAgLTMzNiwgIC0yMzcxLCAgIDMzOTYsICAtMTA5MiwKKyAgICAgICAxMDIsICAgIDE3NiwgICAgMTQwLCAgICA2NDAsICAgLTM1OSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgMzczLCAgICA0NzMsICAtMjE2NywgICAtNzc0LCAgIC0zODgsICAgIDQwNSwKKyAgICAgLTE0MDIsICAtMTM5MSwgIC0xMzE5LCAgIC0xNTUsICAgMTEwNCwgICAtNTMzLCAgICAzODIsICAgMTU2MSwKKyAgICAgLTI5NTgsICAgIDQwNiwgICAgNzg3LCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgLTM4MDAsICAgIC01OCwgICAyMDk4LCAgIC0xODEsICAgLTU3MCwgICAgMzg1LCAgLTQxMjUsICAgIDc1OSwKKyAgICAgLTE1ODQsICAgICAgOSwgICAtMjc4LCAgICAyMDEsICAgLTUyOCwgICAtNTI3LCAgIC00MzUsICAgIDQzNiwKKyAgICAgICA2ODEsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgMzAsICAgIC04MCwKKyAgICAgICAtNjAsICAtNDAzMSwgICAgLTcwLCAgLTMzNjcsICAgIDMxNiwgICAtODYxLCAgICAgNjcsICAgLTE2OSwKKyAgICAgIC0xNDQsICAgMTU5OCwgICAgOTY2LCAgICAgMzIsICAtMTI2MywgICAtNDM0LCAgIC03MzgsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIDE4MSwgICAgIDEyLCAgICAxMTUsICAgICA5MSwKKyAgICAgICAyNTMsICAgIDUxOCwgICAgNTE3LCAgICAyMTYsICAgIDgzMCwgICAgMzM2LCAgIC01NjgsICAtMzEyNSwKKyAgICAgIC03OTYsICAgLTg0NywgICAxNjI3LCAgICAgNTgsICAgLTE1OCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgIDQ4LCAgIC04NTEsICAgLTI4NiwgICAgMzkzLCAgICAzOTAsICAgIDcwNywKKyAgICAgICA1OTUsICAgIDQyNywgICAtMjM1LCAgIC0xMTYsICAgIDgxNCwgICAtMTk4LCAgIDYxNDUsICAtMTU5MCwKKyAgICAgICA2NDcsICAgICAxNSwgICAtMjU5LCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC02MjEsICAgIDE1MiwgICAgNTkwLCAgICAtMTYsICAgIDIxNSwgICAtNjMzLCAgIC03ODQsICAgLTE0MCwKKyAgICAgIDEwODcsICAgIDcyMywgIC00MTkxLCAgIDI3MDEsICAgIDk1MSwgICAtOTcyLCAgICAyNzMsICAgLTU1NCwKKyAgICAgICAzODcsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgIC0xMjQsICAtMjkzOSwKKyAgICAgICAtMzgsICAgIDM4MywgICAgMjM0LCAgICA2ODcsICAtMjg3MywgICAtNDY2LCAgICAgNjEsICAgLTQ3MiwKKyAgICAgICA4NTQsICAgLTM5NiwgICAgMzA1LCAgIC0yMzMsICAgICA4MiwgIC0yNjc3LCAgIC0yMDYsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgLTEyMCwgICAtMjQ2LCAgIC02MTQsICAgLTM5NCwKKyAgICAgIDgxOTIsICAgICA3NSwgICAtNDUwLCAgICAxNzcsICAgLTI1MSwgICAgIDQ1LCAgIC0xNDIsICAgICA2NSwKKyAgICAgLTEyNDgsICAgIC0xNCwgICAgMzg5LCAgICAzNzUsICAgIDExNCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAyODcwLCAgICAxNTgsICAgLTQ3MywgICAtMTY2LCAgICA5MjgsICAgLTYxOCwKKyAgICAgLTE5MDksICAgIDIyNCwgICAtOTMxLCAgIDE4OTgsICAgIC0xNiwgICAgNDI3LCAgICA0NDcsICAtMTA0NCwKKyAgICAgICAgODUsICAgLTMzMywgICAgMTk3LCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgNzgsICAgIDExNCwgICAtMTY3LCAgICAgNzMsICAtMTA3MCwgICAgLTgwLCAgIDM1MTIsICAtMzAwNCwKKyAgICAgLTE1NTMsICAgIDc2OSwgICAgMjEzLCAgICA4NTEsICAgLTM3NywgICAgOTc4LCAgIDEwOTcsICAgICA3MSwKKyAgICAgICAgNjYsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgIC0xMjksICAgIDI0OCwKKyAgICAgICA0NTUsICAgLTM3NiwgICAgMzQ0LCAgICAxMjgsICAgIC02MCwgICAgNTQ2LCAgIC0zMjEsICAtNzg5OCwKKyAgICAgIC03MTksICAgIC01NSwgICAtOTQxLCAgIDEyNDIsICAgIDIwNywgICAgMjE1LCAgICAzMjMsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIC0yNCwgICAtMjI1LCAgICAxMzYsICAgIDE0MiwKKyAgICAgIC03MzksICAgLTExNywgICAgICAyLCAgICAyNDIsICAgLTE1MiwgICAgLTIwLCAgLTE3NzUsICAgLTQ4NCwKKyAgICAgICAtMzYsICAgLTQwOCwgIC0yNzY3LCAgIC00NzEsICAgIDI1MSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgIDIyLCAgICAxMTEsICAgLTE4MCwgIC03NDE3LCAgICAzNjUsICAgIDI5MywKKyAgICAgIC0zMTMsICAgMTAzMSwgICAtMTkxLCAgICAxNTQsICAgLTIxMCwgICAtMjM5LCAgICAxMjEsICAgLTMzMywKKyAgICAgLTE1MDQsICAgIDIwOSwgICAgMTQ2LCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICA4OTgsICAgLTY0MywgICAzMDgwLCAgICA1MjgsICAgIC05MSwgICAtNzE4LCAgIC01MTIsICAgIDI3NSwKKyAgICAgLTM1NjQsICAgIDM5NiwgICAgMTYwLCAgIC04NTAsICAgIDM0NiwgICAtNTk1LCAgIDE1NTgsICAgIDY4NCwKKyAgICAgIC0zMTAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAyMzQsICAgLTQxOSwKKyAgICAgIC03MjQsICAgLTQzMywgICAgMjkyLCAgLTEwMDMsICAgIDY4MiwgICAtMTE3LCAgLTEzMTgsICAgLTkxNCwKKyAgICAgLTUxMzcsICAgIDEyOCwgICAgIDUzLCAgICAyOTEsICAgIDQwOCwgICAxMjY5LCAgIC0yODQsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgLTI1MiwgICAgMTkwLCAgLTI5MTEsICAgIDEzMCwKKyAgICAgICAyNTUsICAgLTE3MiwgIC00MzMxLCAgICAgMjYsICAgLTI2NywgICAgMjgwLCAgIC0xMzMsICAgLTYxMywKKyAgICAgLTEwNjMsICAtMTEzNSwgICAgNzU5LCAgLTEyOTAsICAgIDIxNiwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgMTMzLCAgIC0xNzcsICAgNDA2OSwgICAtMzExLCAgIC0xOTcsICAgMzI2MCwKKyAgICAgICAzNDEsICAgIDIwMSwgICAtMTE3LCAgIC01MTUsICAgIDEwNSwgICAtNjU4LCAgICA5NzUsICAgICA4MSwKKyAgICAgIC0zMzMsICAgLTMzMywgICAgMjYyLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAyNzMsICAgIC04NywgICAgMzIxLCAgICAxOTAsICAgMTM4NSwgICAgMjc0LCAgICAxODIsICAtMjU1MywKKyAgICAgIC0xNTAsICAgIDE2NCwgICAtODMwLCAgICAgODksICAgLTQ1OSwgIC01Mjc5LCAgIC02MjQsICAgLTMzNiwKKyAgICAgICAzOTksICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgIC0xNzIsICAgLTIzMiwKKyAgICAgICAgMTEsICAgICA0NSwgICAgMTIxLCAgIC0yNTQsICAgLTQ1NywgICAgMTk2LCAgLTM0ODcsICAgLTgzOCwKKyAgICAgICA1MTIsICAgLTMxMCwgIC0yODMxLCAgICAtODUsICAgICA5OCwgICAtMTQ1LCAgIC0zMzEsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIC01NSwgICAtMTQ5LCAgIDIwNjgsICAgIC02MSwKKyAgICAgIDMwODcsICAgLTE0MywgICAxNTc0LCAgLTEzODEsICAgMjg1MywgICAxODk5LCAgIC00NTMsICAgLTU4MCwKKyAgICAgIC0xMzcsICAgMTIxMSwgIC0xNDEzLCAgICAxNzEsICAgIDEyNSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAtMjI4LCAgICAgMzAsICAgLTk1NiwgICA1NTY5LCAgICAyMDksICAgIC04OSwKKyAgICAgICAgMjUsICAgIDU3MywgIC0xNjY5LCAgICA1MDcsICAgIDE4MiwgICAtMTMyLCAgICA2OTcsICAgLTEzMiwKKyAgICAgLTI5NjQsICAgLTYzNywgICAgMTM5LCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgLTMwNzgsICAtMzI3OCwgICAtNzcxLCAgICA5MjgsICAgIC0zOCwgICAtNDYzLCAgICA4MjAsICAgMTE0MSwKKyAgICAgLTEyMzQsICAgIDYyMCwgICAgNjUyLCAgLTE3MTAsICAgLTM4MiwgIC0xNjE4LCAgIC00MDksICAgIDE3OSwKKyAgICAgICA0ODMsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgIC0xMDIsICAgNDI1NiwKKyAgICAgICAtMjAsICAgLTE2MiwgICAyMDIxLCAgICA3MzAsICAgMTQzOSwgICAyNzc2LCAgICA0NTksICAgIDQ5OCwKKyAgICAgIC0xNTIsICAgIDQ4MiwgICAgIDM1LCAgIC0yNzEsICAgIDgxMCwgIC0xMzQ1LCAgIC0yNDksICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIDEzMSwgICAgICA1LCAgIC0yODEsICAgIDQzMSwKKyAgICAgLTI0OTgsICAtMTA0NiwgICAgNDgyLCAgICA4NDIsICAgIDI5NywgICAtMzExLCAgLTEyNjAsICAgIDE0OCwKKyAgICAgIC05MDYsICAtNDIxNywgIC0xNDExLCAgIC0xMDIsICAgLTM2MSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgMTE2LCAgLTMwODMsICAgIDIzNSwgIC0xMTk1LCAgICAtMTksICAgLTY0NiwKKyAgICAgICAgNDIsICAgIDQ4NywgICAgMzA5LCAgIDE2NTQsICAgMTA1MSwgIC0xNjQzLCAgICA2ODksICAgLTgyMywKKyAgICAgIDIyNzksICAgMTQ4OCwgICAgNTcxLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgNDIsICAgIC05NSwgICAgIC0zLCAgICAgMzYsICAgLTE3MCwgICAtMTE0LCAgIDgxMDQsICAgIDIxNywKKyAgICAgICAxNDAsICAgLTIxNywgICAgNTk5LCAgIC03NzQsICAgIC02NCwgICAtNjc1LCAgIC0yMTEsICAgIDE2NiwKKyAgICAgICAyMDQsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgOTksICAgIDU5NCwKKyAgICAgICAtNDgsICAgIDIyNCwgICAgIDUyLCAgLTE0OTksICAgIDI3MSwgICAyMjI0LCAgIC0yMTksICAgMzE4NCwKKyAgICAgIC0xNjUsICAgIDgyOCwgIC0xMzQ1LCAgIC03ODUsICAgIDE4MSwgICAgMTMzLCAgICAxMjQsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgLTIzNSwgICAtMjg2LCAgICAyNTQsICAgLTE3MSwKKyAgICAgLTQ5ODAsICAgLTQ1MywgIC0xNDMyLCAgICAgMTIsICAgIDczNCwgICAtMzkxLCAgIC02NDAsICAgIDMzOSwKKyAgICAgICA1MzcsICAgIDMxMywgICAtNzAwLCAgIDEwMTYsICAgIDE0OCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgLTQ5LCAgICAtMTksICAgIDgwMywgICAgOTM1LCAgICA1MjAsICAgIC05MCwKKyAgICAgICA2NDEsICAgMTA1MywgICAtNDU0LCAgIDIzMzgsICAtNjA3MSwgICAtNDc4LCAgICA2MTYsICAgLTU1OSwKKyAgICAgIC0zMzksICAgIDQ0NSwgIC0xNDY0LCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC0xNzUsICAgIDExMSwgICAtMTMyLCAgICAgNjUsICAgLTI2NCwgICAgNzMyLCAgICAyMjEsICAgIDIzMSwKKyAgICAgLTE5NzIsICAgLTMwNSwgICAgMzI1LCAgIC04NTksICAgIDU4MywgICAxMjcyLCAgIC00NDEsICAgMjY1MSwKKyAgICAgICAyMjksICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgIC0yODYsICAtNDY0NiwKKyAgICAgIC0yNjIsICAgIDU5MywgICAgNjEzLCAgICA5MzYsICAgIDMxMCwgICAtNjE1LCAgICAgODMsICAgIDIyMywKKyAgICAgIC04MTYsICAgMTkxMCwgICAyMDQxLCAgICAyODEsICAgLTE5MCwgICAtNDM0LCAgICAxMTQsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgLTEyMywgICAgNjg0LCAgIC0yMDgsICAgIDUyNCwKKyAgICAgIC02MDYsICAtMTIyMywgICAgMjY0LCAgIC05ODMsICAgLTEwOSwgIC0xMDU3LCAgICA2OTYsICAgIDE5NSwKKyAgICAgIC01MjEsICAgIDk0NSwgIC03NTAzLCAgICAxOTMsICAgLTEyMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgIDk4LCAgIC0zNTgsICAtMjE2NSwgICAgMjQ0LCAgICAyNzcsICAgIDM5MywKKyAgICAgICA3NzEsICAgMzM2MCwgICAtMjU4LCAgLTEyMTgsICAgLTEyMiwgIC0xMjUzLCAgLTIyOTcsICAgIDgwNiwKKyAgICAgIC0xOTgsICAgIDU0MCwgICAgICA3LCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgNzgsICAgLTI4MSwgICAtMzY4LCAgIDI4MDksICAgIDE1OSwgICAyNjExLCAgICA4MzMsICAgLTEyMCwKKyAgICAgLTM5ODcsICAgIDkzMywgICAgMzYwLCAgICAtNDksICAgLTUxNSwgICAtMTA2LCAgIC0zNjAsICAgIDY1MCwKKyAgICAgIC0xMjUsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAyMDMsICAgMTM2OSwKKyAgICAgICA3NDksICAgLTUwMiwgIC0yMjk1LCAgIC0zMjYsICAgIDQ0OCwgICAtMzA5LCAgICA2MzAsICAgIC04NCwKKyAgICAgICAzNDUsICAgLTUyMCwgICAgIC00LCAgIC02MjMsICAgMTA2NiwgIC0zOTE1LCAgICAzNzMsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAtNDYwMywgICAtNzk0LCAgIC02MjUsICAgLTM1NSwKKyAgICAgIDEwNzEsICAgLTYwMSwgICAtNTUzLCAgICA1OTMsICAgLTI5NiwgICAgNjI2LCAgIC0zMjgsICAgIDYyMSwKKyAgICAgICAgODUsICAgMTM0OCwgICAgIDkyLCAgIC0yODgsICAgIDIwNCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgIC05LCAgICA2MDIsICAgLTE2MiwgICAtNzQ5LCAgIC0xMDQsICAgIDQ2NCwKKyAgICAgIC0zNzIsICAtMTM3NSwgIC0xOTA1LCAgIDIyMDAsICAgICA2MSwgIC0zMzA4LCAgIC04OTcsICAgIDYzNCwKKyAgICAgIDEwMzYsICAtMjExMiwgICAtMTgyLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAtNzYsICAgMjM0MSwgICAtNjc1LCAgICAtNzIsICAgIC0yOSwgICAgNzA0LCAgIC01MzYsICAgMTY1NiwKKyAgICAgIC01NDEsICAgLTczNiwgIC0xNDIwLCAgLTE1MzksICAgMjQ1OCwgICAtMjI4LCAgICA2NzQsICAtMTI1OCwKKyAgICAgICAgLTMsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgIC0xMzMsICAgMTExMSwKKyAgICAgICAgNjMsICAgIDMyNywgICAgNDcwLCAgIDEyMjYsICAgIDU0MSwgICAtMjc2LCAgLTMwNDIsICAtMTU5NCwKKyAgICAgLTMxOTIsICAgIDM1NywgICAtNjE3LCAgICA2NTgsICAgLTMxNSwgICAtOTc4LCAgICA2MzEsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIDExMSwgICAtMTg4LCAgICA2MTksICAgIDIzNiwKKyAgICAgICAxMDQsICAgICA1NCwgICAgNTQ1LCAgICA0MjQsICAgNTkxMiwgICAtMzMyLCAgICA3MTEsICAtMTI0OSwKKyAgICAgIC01MzMsICAgIDI5MSwgIC0xNTQ0LCAgIC0yMTYsICAgIDExMywgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAtMTk5LCAgICAyNjcsICAgIDE1MiwgICAtMzAxLCAgIC0xNzIsICAgMTI5NCwKKyAgICAgIDIzMTEsICAgLTQ4MiwgIC0yNDUxLCAgICAtODIsICAgMTgzMywgICAgMjE0LCAgICAxMzAsICAtMTE4MywKKyAgICAgLTIyMTIsICAgIDQwMywgICAtNjI1LCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC0xMDYsICAgIDY2MiwgICAgLTQ4LCAgIC0xMzEsICAgIDMyNCwgICAyMzM3LCAgICA0NDUsICAgIDQ2MiwKKyAgICAgIC0zNDksICAgLTE4OSwgICAgNjY5LCAgIDQ5NDUsICAtMTc5NywgICAgIDE2LCAgICAyNjgsICAgLTYwMiwKKyAgICAgICAgIDIsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgNTUsICAgIDE1NCwKKyAgICAgICA4OTIsICAgIC0zNSwgICAtMTQ1LCAgICAzNTcsICAgIDU2MiwgICAgIDQyLCAgICAgLTksICAgLTI4NCwKKyAgICAgICAxNzcsICAgICA4NCwgICAgNDIyLCAgIC0xODEsICAgLTM1OCwgICA3NjE4LCAgICAgMjksICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgLTM1MywgICAgIDY4LCAgICAtNDEsICAtNDA5NiwKKyAgICAgICAxNzcsICAgIC0yMCwgICAtMjY3LCAgICA3ODIsICAgIDk1NCwgICAtNDMwLCAgIDE1NzMsICAgLTY5NiwKKyAgICAgIDE3ODUsICAtMzYxMSwgICAgIDg5LCAgIC0yNDMsICAgIDY4MywgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAtMjIwLCAgIDE5ODMsICAgLTg5MSwgICAgNjE0LCAgICAyMjYsICAgLTIwMiwKKyAgICAgICAgNjcsICAgIDc2MSwgICAxOTA0LCAgICAxNzksICAgIDIyNiwgICAgNDE2LCAgIC02NTcsICAtMzQwOSwKKyAgICAgIDEwMjYsICAgMjgzNCwgICAtNDM4LCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgIC01NTEsICAgLTIyOSwgICAtMzA0LCAgIC00NjIsICAtMjI3NywgICAtNDE5LCAgICA0NTEsICAgLTEyMiwKKyAgICAgIC0xMDgsICAgIDI1OCwgICAgNzg0LCAgIDExMDUsICAgIDM4MiwgICAgMTM3LCAgIDU2OTUsICAgLTI0MSwKKyAgICAgIC00OTEsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgMzQsICAgLTI3MiwKKyAgICAgLTE2ODcsICAgMTc2OSwgICAtMzMyLCAgICAzNjUsICAgICAzMywgIC0yNTk0LCAgIDM3MjksICAgIDMyNSwKKyAgICAgICAgODUsICAgLTI5NSwgICAtMjkwLCAgIC0xNTIsICAgMjIzOCwgICAtNjExLCAgICAtNDEsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIDEwMiwgICAgMTY2LCAgICAyNDEsICAgMTA5OCwKKyAgICAgIC0xMDcsICAgIDc3NSwgICAtNDE0LCAgIDQyNTYsICAgLTI3NywgICAgOTM1LCAgIC0yMDAsICAgIDQ5NSwKKyAgICAgICAyNTUsICAgMTE0NCwgICAgNDY4LCAgIC0xODQsICAgIC01OSwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgIDk0LCAgIC0yODIsICAgIC01NywgICAgIDEyLCAgIC0zOTAsICAgIDI0NSwKKyAgICAgIDE4NzIsICAgLTYyMCwgICAxMDg5LCAgIDM3NTQsICAgIDQzMiwgICAgOTQ3LCAgIC01MDksICAgLTI4NCwKKyAgICAgLTM4MzYsICAgICAyNiwgICAgNDgyLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDksICAgIDk3MSwgICAtMzczLCAgIDExMTEsICAgLTQ4MCwgICAyMzQyLCAgIC0xODIsICAgIDUyOCwKKyAgICAgICA4MDIsICAgMTE5NiwgIC0xMDE3LCAgIC04NzksICAgIDQ5OSwgICAyODAwLCAgIC04MzAsICAgLTIzMCwKKyAgICAgICAgLTQsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgIC0zODIsICAgLTgxNSwKKyAgICAgLTE2NjksICAtMjQzNywgICAtNTkzLCAgICAxOTMsICAgLTY4OCwgICAgNjMyLCAgICA0NzksICAgMjg4MywKKyAgICAgICA1NjUsICAgIDU0MCwgICAgICA1LCAgIDE1OTgsICAgMTYxOCwgICAtNjQwLCAgIC0yNDYsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgLTQyMSwgICAtMTAzLCAgIDE0ODIsICAtMzAyNiwKKyAgICAgICAtNjUsICAgLTEwMSwgICAgICA0LCAgIDM5MjEsICAgIDY4OCwgICAtOTQxLCAgIC0yMzQsICAgICA0OSwKKyAgICAgICAyMDIsICAgMTkwNSwgICAgOTM1LCAgLTExNTUsICAgICAtNCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAgICAgIDAsICAgICAgMCwgICAgMjEwLCAgIC02MjUsICAgLTExOCwgIC0zMjE1LCAgICAzNDQsICAgIDk3OCwKKyAgICAgICAtMTAsICAgIDc3MywgICAtMTI2LCAgIC04MDQsICAtMTUzNCwgICAgMTgyLCAgLTExNDYsICAgLTY0NiwKKyAgICAgIC0xNDYsICAgMjAxMSwgICAgNDYzLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMDgwNnNtMVtdID0geworICAgICAgICAzNSwgICAtMjM3LCAgICA1NDcsICAgIDcwNSwgICAgIC05LCAgIDE2MTIsICAgIDM4MiwgICAgMTk1LAorICAgICAgLTE5MSwgICAtMjUwLCAgIC0xMDEsICAgLTM1NywgICAgNzA5LCAgICAxNTMsICAgIDg1MCwgIC01MDkxLAorICAgICAgLTEwMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAtNjQwNiwgICAtMTU4LAorICAgICAgLTUyNywgICAgMTM3LCAgIC0zMzAsICAgIDU4MCwgICAtNDg0LCAgICAgNjMsICAgIDU0MSwgIC0xMjQ1LAorICAgICAgLTIwNSwgICAgMTM4LCAgICAyNDcsICAgLTQ4OSwgICAtMTQ3LCAgIC0xMzIsICAgLTg2MywgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgIDUzLCAgICAtMzgsICAgIDI4MywgICAgLTIyLAorICAgICAtMTUwNiwgICAtNDY3LCAgIC00MTgsICAgIDExNywgICAgMTMzLCAgLTIxNTIsICAgIC00OCwgICAtOTkxLAorICAgICAgIDgwOCwgIC0xMDQ3LCAgIDI0MDIsICAgIDI2MSwgICAgNDIzLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAtMTQsICAgIDUwMCwgICA0Njk3LCAgIC0xNzQsICAgLTU0NCwgICAgIDg3LAorICAgICAgLTM3OSwgICAtMjQzLCAgICA1NzcsICAgIDY4MiwgICAgMjU4LCAgLTExOTAsICAtMTk4NCwgICAgNTk5LAorICAgICAgIDYwNywgICAtMTIzLCAgIC0yOTAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICA2MCwgICA0MjU0LCAgICAxOTQsICAgIDg4OCwgICAgLTgxLCAgIC0zOTUsICAgIDQyMiwgIC0xNzg2LAorICAgICAgIDkxNiwgICAgMjg4LCAgIDExOTEsICAgLTY1OCwgICAgNTAyLCAgIDIxNzcsICAgLTk3NywgICAtMzAxLAorICAgICAgIDU4NywgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIDIzMiwgICAgMjA0LAorICAgICAgLTQ1MiwgICAtODUzLCAgLTQyNjYsICAgLTIxOSwgICAxMTY0LCAgICAgOTIsICAgICA5MSwgICAxNTYxLAorICAgICAgIDk1MCwgICAtNzA1LCAgLTEyMTcsICAgLTczNCwgICAxNjE3LCAgICAxMjAsICAgLTMyNCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgIC0zNDQyLCAgIC00NTYsICAgLTY2NywgICAgOTg3LAorICAgICAgIC04OSwgICAxMzgzLCAgIC03MDQsICAgLTE4NywgICAtMjgwLCAgIC01ODMsICAgIDM0MSwgICAtNzMyLAorICAgICAgIDY0OSwgIC0yMTI5LCAgLTM1MDUsICAgLTE3NSwgICAtMjE1LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAyMDAsICAgLTYzNSwgICAtNDcxLCAgLTEyMjEsICAgIDIxNSwgICAyODQ0LAorICAgICAgMTYzMywgICAgNTIyLCAgIC03MjAsICAgMTcyMiwgICAtMjcyLCAgICA0NzMsICAgIDE5OCwgICAtNjA0LAorICAgICAgIDQ4MCwgICAgLTg4LCAgICAxNjksICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgLTE2MCwgICAtMjY4LCAgICAxMzAsICAgIDI4NCwgICAtNjEyLCAgICAgOTUsICAgICA0MywgICAgIDQyLAorICAgICAgIDY0MSwgICAtMjU4LCAgLTY4ODQsICAgLTE2NywgICAtNjg5LCAgICAxMjMsICAgIDI3NiwgICAtNTkyLAorICAgICAgIDcxNywgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIDMxMywgICAgLTkwLAorICAgICAtNDMxMCwgICAyNzA2LCAgLTE3MDgsICAgIDY0OCwgICAtNzk2LCAgICA3OTEsICAgIDk5OCwgICAtNDY4LAorICAgICAgIDYzMiwgICAxODkzLCAgICAgNDMsICAgMTkzNywgIC0xMjc5LCAgICAtMjIsICAgIC02NCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAtMTA2LCAgICAxMzUsICAgLTI4NywgICAgMzM1LAorICAgICAtNzk5OSwgICAgIDUxLCAgIC0yNTAsICAgLTM4OCwgICAgIDE2LCAgICAyODUsICAgLTEwMSwgICAgNjg1LAorICAgICAgLTk0NCwgICAgNjA0LCAgIC02MjQsICAgLTc5MiwgICAgMjA5LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICA0OTYsICAgLTIwNSwgICAgNDIyLCAgICAgNDksICAgIDI3NCwgICAtMjI5LAorICAgICAgIDIyMCwgICAgIDczLCAgIC03MzQsICAgIDM4MSwgICAtMzk0LCAgLTgxOTIsICAgLTQwNSwgICAgNzU1LAorICAgICAgICAtOSwgICAgIDQ2LCAgICAxMTYsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgIC0yOCwgICAgMzMyLCAgIDExNTIsICAgLTEyOSwgICAgMjQ0LCAgICAgODQsICAtMjE5MywgICAgNjMyLAorICAgICAtMTg1NCwgICAtMzg0LCAgICAxMTAsICAgLTMwMiwgICAtMjcwLCAgICA0MzUsICAtMTY4OSwgICAtNzk3LAorICAgICAgIDY4NiwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAtMTY2MCwgICAgNjI0LAorICAgICAgLTY2NCwgICAyNjExLCAgICAgMzAsICAtMTE1NSwgICAtNDE5LCAgLTM1MzksICAgLTU2OCwgICAxNzE5LAorICAgICAtMTM3NCwgICAtNjc2LCAgICAtNTUsICAtMTkzNCwgICAgODYzLCAgIDEzOTEsICAgIDQzMywgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgIC0xMDEyLCAgICAyOTAsICAgMjMwMiwgICAtMzMwLAorICAgICAgIC05NSwgIC0yMzU1LCAgICAtNTUsICAgLTc2MywgIC0xOTk1LCAgIC0yOTgsICAgLTY4MCwgICAgNzE1LAorICAgICAgIC04NSwgICAxNjE1LCAgIDEwMTEsICAtMTk4OSwgIC0xMDI4LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgMjEsICAtNTAwMSwgICAgNTA3LCAgICAtNTgsICAgIDIyOSwgICAgLTM3LAorICAgICAgLTExMywgICAgNjMyLCAgIDE4MDksICAgIC02MiwgICAgMzM0LCAgLTEyMDEsICAgLTg5MywgICAtMzQ0LAorICAgICAgICA5OCwgICAgNDM4LCAgICAtNjUsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgMTQzLCAgICAxMzEsICAgIC0xOCwgICAtMTM1LCAgIC0zMDYsICAgIDM5MiwgICAgMjMyLAorICAgICAgIDI2NSwgICAgNTQzLCAgICAzNzYsICAgLTU2MiwgICAgMzYyLCAgIDI0NTgsICAgIDc4NSwgICAzNjUzLAorICAgICAgLTQ1NiwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIDg1NSwgIC00MDA5LAorICAgICAtMTIwNywgICAgMTE4LCAgICAtODYsICAgLTIyMywgICAgMjY2LCAgICAxNTQsICAtMTg4NiwgIC0xMTQ1LAorICAgICAgIDI0MSwgICAtMzk3LCAgICAyNDYsICAgIDI0NCwgICAtNzc2LCAgICA4MDgsICAgLTEzMiwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAyLCAgIC02MzMsICAgIDExMywgICAgLTk0LAorICAgICAgLTE1NCwgICAtMTczLCAgIC0xNjIsICAgLTE2OCwgICAgNDM5LCAgLTY1NDgsICAgIDc3OCwgICAtMzkyLAorICAgICAgIC02MCwgICAgIDk5LCAgLTE5MDEsICAgIDE3MSwgICAtMTMwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAtMTEsICAgLTMyNCwgICAgNzExLCAgIC05MDMsICAgIDU2MCwgIC0xNjU0LAorICAgICAgMTQ3MywgICAtMzAwLCAgIDEwNDgsICAgIDEzNywgIC0xMTQwLCAgLTExMTUsICAtMTMwMiwgIC0xMDA4LAorICAgICAgLTc5MiwgIC0zMjY0LCAgIC01NDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgLTM0NywgICAgIDc4LCAgIC0xMDMsICAgICAtNywgICAgIC0zLCAgICA0MzcsICAgNjA1MywgICAgMjk5LAorICAgICAgLTQzNSwgICAgMzIzLCAgICA2NjQsICAgIDQ3NywgICAxMDk3LCAgICAxNTgsICAgIDY1NiwgICAgMjczLAorICAgICAgIDIwMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgLTEwMSwgICAgIDgwLAorICAgICAgLTE1MywgICAgMTQ0LCAgIC0yMzUsICAgIDQ5MiwgICAtMzk5LCAgICAgLTMsICAgNDk1OCwgICAgNjk5LAorICAgICAgLTU4NiwgICAtMTYyLCAgICAxNTMsICAgLTg2MCwgICAgMTYxLCAgICA2NjUsICAgICAgNCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgLTg3LCAgIC0xODksICAgMTc0NCwgICAtMzUwLAorICAgICAtMTg0MCwgICAgMzI1LCAgLTIzNTQsICAgMTE5MywgICAxMzg2LCAgLTE1ODksICAgICA4MCwgICAxMDU1LAorICAgICAgLTE4OCwgICAgMjczLCAgICA4MDcsICAgMjAzOCwgICAtNDE5LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgNTAsICAgLTE4NSwgICAgIDY4LCAgICAtNTksICAgICAtOSwgICAgIDc4LAorICAgICAgLTU4NSwgICAtMTIxLCAgLTc4ODgsICAgIDc3MSwgICAtOTA4LCAgIC0yODQsICAgIDM0OSwgICAgMTU4LAorICAgICAtMTEyMiwgICAtMTM5LCAgIC0xODksICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgIDMxMCwgICAtMjg2LCAgICAyMzUsICAgLTY4NywgICAtOTE5LCAgIC0zNjQsICAgLTY5NywgICAtMjUzLAorICAgICAgIDQ5MiwgICAgMzAwLCAgIC0yMzgsICAgIDI3MiwgICAgNTE4LCAgIC01MjUsICAtNTg2MywgICAtMTkwLAorICAgICAgIC01OSwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIDE1MSwgICAgNjE2LAorICAgICAtNDQyMCwgICAgMjI3LCAgICAyNDAsICAgLTI1MiwgICAgNTE2LCAgIC0yNTAsICAgICA2OCwgICAgNDExLAorICAgICAgLTE5MiwgICAgLTg3LCAgIC02MDcsICAgIDY3MSwgICAxMjgxLCAgIC0zMTcsICAgLTMwNSwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgIC05LCAgICA4MTcsICAgLTQ1MSwgIC0xMDc5LAorICAgICAgICA4NiwgICA1MDYwLCAgLTExNTcsICAtMTE1OSwgICAtNDIxLCAgICAzMDIsICAgMTYzNiwgICAtMzE2LAorICAgICAgIC02NiwgICAtNTE4LCAgIDEwMTAsICAgMTA2OCwgICAgIDk2LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgIC01NzYsICAgLTM2MiwgICAgMTA3LCAgIDM1MTYsICAgIDMwMywgICAtMzY0LAorICAgICAgLTQwMiwgICAgODA1LCAgICA1NzQsICAgIDk5MywgICAtNTU0LCAgICAyOTgsICAgLTkyNSwgICAgNDEwLAorICAgICAgMTg5OCwgICAgIDEzLCAgICAxMzgsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgLTM0MCwgICAtMTUwLCAgICA1MjgsICAgIDE0MiwgICAtNDY0LCAgIDEwMzQsICAgLTM5NywgICAzOTQ0LAorICAgICAgLTY5NywgICAgOTYyLCAgICA5MDIsICAgMTM5MywgICAyMjEyLCAgLTEwMjEsICAtMTAzNCwgICAtOTYxLAorICAgICAgLTMxOSwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICA1OCwgICAgIDM4LAorICAgICAgIDM4MiwgICAgMjIxLCAgIC0yMTIsICAgIDgyNiwgIC0xMzczLCAgLTQ1NTksICAgMTMyOSwgICAtMTIzLAorICAgICAgIDIxNiwgICAgLTIzLCAgIC03MzYsICAgICA5NSwgICAtMzAwLCAgIC00MTgsICAgICAtNCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgLTU4LCAgIDc4MTQsICAgIDIxOCwgICAgMTQxLAorICAgICAgIC05MCwgICAtMTI0LCAgICA0NTUsICAgIC0yNywgICAgIDQ5LCAgIC0zMTEsICAgLTM2NCwgICAgIDgwLAorICAgICAgLTEzNiwgIC0xMjU3LCAgICAgOTYsICAgIDMzMiwgICAtMjg3LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgLTgsICAgIDYyNCwgICAgMTI3LCAgIDE4NTcsICAgLTQ4MCwgICAtODY5LAorICAgICAgLTU3NSwgIC0xNDYxLCAgIC00OTMsICAgLTI2MSwgICAgIDk3LCAgICAgMzIsICAgLTMyOCwgICAtNDY3LAorICAgICAgIDE3MywgIC0yNTg4LCAgICAxMzIsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgNTI1NywgIC0xMDM3LCAgICAxOTEsICAgLTg0NCwgICAgMjQ3LCAgICAxMzAsICAgLTU3MSwgICAtNTQ4LAorICAgICAgLTQ5NiwgICAgMjE2LCAgIC0xNjEsICAgIDMzNiwgICAgIDYyLCAgICA5OTAsICAgIDEzMCwgICAgNTE3LAorICAgICAgIC02NSwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIC04OSwgICAgICA5LAorICAgICAgLTEzOCwgICAgNDA1LCAgIC03MDEsICAgLTQ3OSwgICAzNjA1LCAgICA2OTksICAgLTYyOSwgICAtMTAyLAorICAgICAgICAyNywgIC0xMzc0LCAgLTEwNTksICAgIC0xOCwgIC0yNzA3LCAgIC0xNzIsICAgLTU1NywgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgLTY3LCAgICAyMDksICAgIDU3MSwgICAgLTkzLAorICAgICAgLTQwNSwgICAtMTcyLCAgIC0yNjAsICAgIC0xOSwgICAgIDg2LCAgICAgMjIsICAgIDY1OSwgICAtNjMwLAorICAgICAgIDIyMiwgIC04MTkyLCAgICAxMDYsICAgIC0zNCwgICAgIDYwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAtMTAsICAtMzM4NiwgICAgMzM2LCAgICA2NTEsICAtMTM3NywgICAgNjgxLAorICAgICAgIC0xNiwgICAgLTQ1LCAgIC0zODIsICAgMTEwMiwgICAtMjgwLCAgICAxNjksICAgLTgyMiwgICAgNTIyLAorICAgICAgIDQzNCwgIC0xMTExLCAgIC0yOTksICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgIDE5NCwgICAtNDQ1LCAgIC0yMzEsICAgLTUzMiwgICAtNDM4LCAgIC0xODAsICAgLTU5MSwgIC0xNjgwLAorICAgICAgIDE3OSwgICA1OTIxLCAgIC0xODQsICAgLTY4NSwgICAtNDY3LCAgICA4NzUsICAgLTU3MywgICAgMjgyLAorICAgICAgIDIzNSwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIDMzOSwgICAgMTM5LAorICAgICAgLTc0NSwgICAgLTY4LCAgIC0yMDEsICAgIDQ2NywgICAtNzQzLCAgICA0NzcsICAgIC0yMywgIC0xMTc3LAorICAgICAgMTM4NCwgICAtMzU3LCAgLTEyNTQsICAtMzc2MCwgICAgNDU0LCAgIDExNzUsICAgIDI1MiwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgMTA5LCAgIC0yNTIsICAgODAyNywgICAtNzY1LAorICAgICAgIDEzNiwgICAgMTExLCAgICAtODYsICAgLTU5MywgICAgLTg0LCAgIC03NTAsICAgLTEyMSwgICAgNzgyLAorICAgICAgIDczOSwgICAtMjk2LCAgICAyODQsICAgIDIxMywgIC0xMTk2LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAtNDAsICAgICA2OSwgICAxOTkyLCAgICA0NTIsICAgIC03NSwgICAgLTg0LAorICAgICAgIDY4MywgICAxNjc4LCAgLTEzNTAsICAtMTg0NiwgICAzMDY4LCAgIC03NDksICAtMTQxMCwgICAtMjcxLAorICAgICAgIDUzNiwgICAxMTIwLCAgICAxMTcsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgNDA1MywgICAgMzQwLCAgICAxMDgsICAgIC04OCwgICAgNDExLCAgICA5OTAsICAgIDIxNywgICAzNjc1LAorICAgICAgIDc1NSwgICAgNzUyLCAgIC0yMDYsICAgIDIwNSwgICAtMjk3LCAgIC01NzMsICAgIDE4OCwgICAgMTI3LAorICAgICAgLTMxMywgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICA0NywgIC0yODcwLAorICAgICAtMzQxNywgICAgMjE2LCAgIDE3MzAsICAgIC04MywgICAgMTg5LCAgLTE2MTUsICAgMTAxNiwgICAgLTQ0LAorICAgICAgLTUwMiwgICAyMTUxLCAgICAgIDYsICAtMTA1NywgICAgNTUwLCAgICAxOTQsICAgLTQ5OCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAtMTMzLCAgICAgIDEsICAgLTM4NywgICAtNDk3LAorICAgICAgIDU4NiwgICAgMTczLCAgICA5MjMsICAtNDA3OCwgIC0xMjMyLCAgICAzMjksICAtMjA4NiwgICAtMTg1LAorICAgICAgIDU5MiwgICAgNjgxLCAgIDMzMjAsICAgLTkxNCwgICAtMzI3LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgIC0xMzIsICAgIDQ5MywgICAtMTc5LCAgICAyMjAsICAgIDE0MiwgIC00MzQ1LAorICAgICAgIDQyMiwgICAtMTczLCAgICAzNTcsICAgMTMxNywgICAgMjQwLCAgIC01MjUsICAgMTYxMywgICAtMTc4LAorICAgICAtMTU4NCwgICAtNzM0LCAgICA1NDksICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgLTMzNywgICAgMTExLCAgLTEyMzgsICAgIDExNiwgICAgMzAyLCAgICAzMjUsICAgIDE4OSwgICAgNjEwLAorICAgICAtMzE4MCwgICAtMjg0LCAgIC04MTcsICAgMTM4MywgICAxNTU5LCAgIC04MDIsICAgIDQyMiwgICAgNDM4LAorICAgICAgIDQ2MCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIC05NiwgICAgMzcyLAorICAgICAgIDMzNSwgICAtODQzLCAgIDM5NjcsICAgIDIyMSwgICAgMzgwLCAgICAyMjcsICAgIDMwOSwgICAgNDQ3LAorICAgICAgLTE5OSwgICAtMjU3LCAgICAzNzIsICAgLTM5NywgICAtNTM0LCAgICA3MzYsICAgLTE1MiwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAtMTQ0LCAgICA0NjMsICAgIC01NCwgICAtMjg4LAorICAgICAgIC04MywgICAgMTE1LCAgIC01NzQsICAgLTIyOSwgICAgNDg1LCAgLTI2NDMsICAgICA1OCwgICA0MzEyLAorICAgICAtMTE1NSwgICAgNjQyLCAgIC02NDcsICAgMTEyMiwgICAgMTE4LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAxNTcsICAgICAgNiwgIC0xMDE3LCAgLTExNTUsICAgIDY4NywgICAtMjg4LAorICAgICAgIDkxOCwgICAtMjEyLCAgIC0zMzIsICAtMjQ4NiwgICAtMTk3LCAgLTEwMjUsICAgLTU0NiwgICA0MDk5LAorICAgICAgIDE1NSwgICAtNzMxLCAgIC0zMzMsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgIC00MywgICAtNDk2LCAgIC01NDYsICAgLTU0MSwgICAgMjgzLCAgIC01MjEsICAgIC00NywgICAgLTE4LAorICAgICAgIDIwOCwgICAtNTUyLCAgIDE4OTksICAgMjEwNywgICAgNTg4LCAgICA4MTgsICAgLTkxMSwgIC0xMTA0LAorICAgICAgIC04NCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIC03MSwgICAgIDQwLAorICAgICAgLTMyNiwgICAgIDkyLCAgICAyMTYsICAgLTEwNiwgICAtMjU1LCAgICAgMjgsICAgIDEyMCwgICAgLTU4LAorICAgICAtMjcyMCwgICAtMTMzLCAgIC0yODgsICAgIC0yOCwgIC0xMTU3LCAgIDE1NjMsICAgIDQwMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgIDQwLCAgICAgLTQsICAgIDU1OSwgICAxMzUwLAorICAgICAgICAzMCwgICAzOTA1LCAgIC02NzUsICAtMTA5MiwgICAtNTg3LCAgLTE1MjQsICAtMTk4NywgIC0xMDMxLAorICAgICAgMTg5MiwgICAtNjc5LCAgIC02MjMsICAgMTA1MSwgICAgLTMzLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAtOTgsICAgIDEwNiwgICAgMTA1LCAgLTU4ODcsICAgLTQ2MywgICAgNDI0LAorICAgICAgIC00MiwgICAtNTA2LCAgIC01ODksICAgIDM3NiwgICAgODQwLCAgICAxNDAsICAgLTY0MCwgICAgNzcxLAorICAgICAgICAyMywgICAtNDQxLCAgICAgLTYsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAyMiwgICAgMjAzLCAgLTM0NTIsICAgLTYzNSwgICAtNjA1LCAgIDE2NjgsICAgIDQyMiwgICAyOTczLAorICAgICAgIDM5NCwgIC0xNjA1LCAgIC05NjgsICAgLTczOSwgICAgMzQ0LCAgLTE0MzgsICAgIDgyMCwgIC0xMzE4LAorICAgICAgIC0yNiwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgIDI1OCwgICAgLTMyLAorICAgICAgMTA2MSwgICAgNjQzLCAgIC0xNTIsICAgICA5MiwgICAtNDU0LCAgLTEzMDUsICAgMTYyMSwgICAgNTU0LAorICAgICAgIDM0NCwgICAgIDgyLCAgIC00MDQsICAgNTIyMiwgICAtMzQ0LCAgICAyODYsICAgIDE3NywgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgIDYzLCAgIC0zNjAsICAgLTEyNywgICAgODE0LAorICAgICAgMzYzOSwgIC0zMzIyLCAgICAzOTAsICAgICAxMiwgICAtNTE1LCAgIC00OTMsICAgMTUxNSwgICAxNzA2LAorICAgICAgLTcyNywgICAgMzk0LCAgIDExNjQsICAgIDM1NywgICAtMjA4LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAtMjcsICAgIDY0OCwgICAtMzQyLCAgIC0xMjUsICAgLTMyNywgICAgMTk0LAorICAgICAtMzYzOSwgICAgNTk4LCAgICAgMjksICAgIDI0NCwgICAgODk4LCAgIC00OTMsICAgIDM3MiwgICAtNjM1LAorICAgICAgIDU2NywgICAgIDMxLCAgIC0yMzcsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgLTE2MCwgICAyNzk4LCAgLTE3NjgsICAtMjE4NiwgICAgNDkzLCAgICA1MTcsICAgIC04MiwgICAtNDY4LAorICAgICAgLTI5MCwgICAyODkwLCAgIC00NjAsICAgIDQ1MCwgICAgNDE0LCAgIC0yNjUsICAtMTEyMSwgICAgMjE5LAorICAgICAtMTExNSwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAxNCwgICAgIDc2LAorICAgICAtMjgwNiwgICAgMzM4LCAgLTE0MjksICAgLTQwMiwgICAgMjUzLCAgIC0xMzAsICAgLTIzNSwgICAtNzk5LAorICAgICAgIDMwOSwgICAtNTI1LCAgIDM4MjMsICAgIDE3NSwgICAgIDM2LCAgICAxMTMsICAgIDI0NywgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgMzUyLCAgICA1MjEsICAgIDIxMywgICAtMTA3LAorICAgICAgIC03MSwgICAtNzYyLCAgICA3OTAsICAgLTg1NiwgICAtMjUyLCAgIC0yNDYsICAgLTcyOSwgICAtNjMxLAorICAgICAgMTI1OCwgIC0zMjc2LCAgIDE1MzQsICAgLTQzNiwgICAtNjM1LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAtNTQsICAgIDExOCwgICAtNDUzLCAgIC0xMjQsICAgIC0zMiwgICAgNTM5LAorICAgICAgIDM1NiwgICAtMTY5LCAgIC0yMDIsICAgLTU5MCwgICAgNzIxLCAgIC00NDQsICAtNjI2MCwgICAtMjc1LAorICAgICAgLTIzOSwgICAtMTA1LCAgICAtNTIsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgLTQ2NCwgICAgNTA3LCAgIC03OTYsICAgMTI3MywgICAyMjk3LCAgICA3OTAsICAgIDY1MiwgICAgMzkyLAorICAgICAgMzM2NCwgIC0xOTQ5LCAgIDIxNTQsICAgLTcwMSwgICAtMjI5LCAgICAgOTksICAgICA4OCwgICAgNDcxLAorICAgICAgLTUyNCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICA3MSwgICAtOTE0LAorICAgICAgMTgzNSwgICAtMTU2LCAgIC0yNDIsICAgLTE5NiwgICAgNTEzLCAgICA0MzEsICAgLTQ4MSwgICAgLTg0LAorICAgICAgLTczNCwgICA0NTAxLCAgIC01MTAsICAgIDExNSwgICAgNDYxLCAgIC00MjgsICAgICA4MywgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgIC0zOTg3LCAgIDEwNjMsICAgLTcxNywgIC0yNjQwLAorICAgICAgLTk2MywgICAtNjY3LCAgIC0xNDcsICAgIDUzNiwgICAgLTY4LCAgICA0MjIsICAgIDM0MSwgIC0xOTE2LAorICAgICAgLTYxNiwgICAgOTk2LCAgICA1MjIsICAgIDU2OCwgICAxMTc0LCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgICAgICAgMCwgICAgICAwLCAgICAgIDgsICAgIDExMiwgICAgNjkzLCAgICAzOTIsICAgIDQ0NSwgICA1MzA5LAorICAgICAgIDI1OSwgICAgMTIxLCAgIDE2NzAsICAgIDM0MywgICAgMTc2LCAgICA0NzIsICAgIDE5NywgICAgNDE5LAorICAgICAgLTI0MCwgIC0xMTc4LCAgIC0xMDcsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IwODA4bDBbXSA9IHsKKyAgICAgICAxNjQsICAtMzYzNywgIC0zNTYzLCAgIC0yNDMsICAgLTEyMywgICAgLTQ3LCAgICAtODcsICAgIC0zMiwKKyAgICAgICAgNjIsICAgIDEyOSwgICAgIC0yLCAgICAxMzEsICAgIC0zNiwgICAtMjAyLCAgIC0xOTcsICAgICAzNywKKyAgICAgICAtMzUsICAgLTQ0MiwgICAtMTM5LCAgICAtNjksICAgIC01OSwgICAgIDI5LCAgICAtNjIsICAgIC02NywKKyAgICAgICAtMTcsICAgIC00MiwgICAgIDc0LCAgICAgMTAsICAgIDEwNywgICAgIDc0LCAgIC0xMDksICAgICA0MCwKKyAgICAtMTAyMTAsICAgIC0zMywgIC0zMjEwLCAgIC00MTAsICAgLTEwNiwgICAgNTEyLCAgICAgNDAsICAgIC0xNywKKyAgICAgICAxMDksICAgICA2NywgICAgIDk5LCAgICAxNzAsICAgICA1MywgICAgIDM0LCAgICAtNjgsICAgIC0xNiwKKyAgICAgIDM4OTUsICAgIC03MSwgICAtMTE2LCAgICAgIDEsICAgIDYwOCwgICAgIDY2LCAgIC0yMTUsICAgICAzNCwKKyAgICAgICAgNzcsICAgICA1MCwgICAgLTQ1LCAgICAtNzMsICAgICAgMywgICAgIDExLCAgICAtMzMsICAgICAxOCwKKyAgICAgICAtMzQsICAgICA1OCwgICAgIDI1LCAgIDQ0MjAsICAgICA5NiwgICAgIDc3LCAgICAtNjcsICAgICAyMywKKyAgICAgICAtODMsICAtNjcyNCwgICAgMjI2LCAgICAtMzIsICAgLTE1MCwgICAtMTU0LCAgICAgMzAsICAgIC0xMiwKKyAgICAgICAgLTgsICAgICAtNywgICAgIDg5LCAgICAgNDIsICAgIDE3MywgICAgLTUxLCAgICAgMzgsICAtMTg1MiwKKyAgICAgICAgNDAsICAgIC00OCwgICAgLTQwLCAgICAgODEsICAgICAzNCwgICAgIDgxLCAgICAgNjYsICAgICAxNiwKKyAgICAgICAgMjAsICAgICAgMywgICAgIDk5LCAgICAgNDEsICAgIDEyMywgICAgIDUyLCAgICAxNTQsICAgICAyMCwKKyAgICAgICAtMzgsICAgICAgNiwgIDEwODg5LCAgICAtNDQsICAgICAyMiwgICAgLTM5LCAgICAgNTUsICAgIC0zNCwKKyAgICAgICAgMjUsICAgIC00NSwgICAgLTIyLCAgICAxMzksICAgICAxOSwgICAgLTIwLCAgICAtNjQsICAtMjI0MiwKKyAgICAgIC00NzMsICAgLTExMywgICAgMzE2LCAgICAxMjcsICAgIC0zMSwgICAgMTI4LCAgIC0zNjMsICAgLTEyNCwKKyAgICAgICAxOTYsICAgIDI1OSwgICAgLTYwLCAgLTM3OTIsICAgIC00MSwgICAtMTAzLCAgICAxMDQsICAgIC04MCwKKyAgICAgIC0zODksICAgIDE3OSwgICAgMTEwLCAgICAgODMsICAgMzE3NCwgICAgIDYwLCAgIC0xOTcsICAgIDEwMSwKKyAgICAgICAgNjYsICAgIC00NywgICAtMTA3LCAgICAgOTYsICAgIC0yNywgICAgIDQ1LCAgICAtMjEsICAgICAgNiwKKyAgICAgICAxMTYsICAgIC01MSwgICAgIC04LCAgIC01OTQsICAgIDM3NywgICAtMjc5LCAgICAxNTgsICAgLTE1OSwKKyAgICAgIDQ1OTUsICAgLTE2MywgICAtMjEwLCAgICAgMTksICAgICAgMywgICAtMjkyLCAgICAtNjcsICAgICAxNCwKKyAgICAgICAxMTUsICAgIC00MSwgICAtMTI1LCAgIC0xNTQsICAgLTI2MywgICAtMTAxLCAgICAgIDQsICAgIC0xMSwKKyAgICAgICAtODksICAgIDEzMCwgICAgIDU4LCAgICAgMzIsICAgICA5MiwgICAgIDE2LCAgICAxMjYsICAgIC05MywKKyAgICAgICAtOTksICAtNDIzOSwgICAgLTY5LCAgICAgODgsICAgICAgNSwgICAtMTEzLCAgICAtMTgsICAgICAzNSwKKyAgICAgICAgMzEsICAgIC00OCwgICAgLTE2LCAgICAgMzUsICAgICA2MiwgIC0yODM5LCAgICAgMTQsICAgIDEyMSwKKyAgICAgICAgMTksICAgICA0MSwgICAgMTI1LCAgIC0xMDIsICAgICAyNiwgLTEzMTQ0LCAgICAgIDYsICAgIC0zMCwKKyAgICAgICAgLTcsICAgICA2MCwgICAgICA0LCAgICAgMzYsICAgIC00MCwgICAgLTI2LCAgICAgNTQsICAgIC01NywKKyAgICAgICAgLTksICAgIC0zMCwgICAgIDEzLCAgICAgLTEsICAgICA3MywgICAtMTMxLCAgICAgMjksICAgIDI1NiwKKyAgICAgICAgMzksICAgIC01MSwgICAgLTEyLCAgIDE3ODgsICAgICAgNCwgICAgIDEwLCAgICAtNTgsICAgICAxNywKKyAgICAgICAtMzYsICAgICAtMiwgICAgIDEzLCAgICAgNTksICAgIC0yMCwgICAgLTIxLCAgICAxNzMsICAgIDEyOSwKKyAgICAgIC00MzUsICAgLTEwNywgICAtMjE0LCAgICAgMzMsICAgMzA3OCwgICAgIDEzLCAgICAgMzEsICAgIDE0OCwKKyAgICAgLTI5NzUsICAgLTMxMSwgICAgIDM4LCAgICAgMjUsICAgLTI0NywgICAtNTQyLCAgICAgMzQsICAgIDEwNiwKKyAgICAgIC0zOTIsICAgICA4NSwgICAtMjAzLCAgICAxODIsICAgLTIzMiwgICAgNDIzLCAgICA2MjksICAgLTE4MywKKyAgICAgICA4MDAsICAgLTQ2NiwgICAzMTQ1LCAgLTI0OTgsICAgLTMwNSwgICAgIDM5LCAgICAgMjIsICAgICA0MSwKKyAgICAgICAgIDAsICAgIC0xNCwgICAgNjcxLCAgIC0xODEsICAgMzE5NywgICAgMTA5LCAgIDI5MDAsICAgICA3MiwKKyAgICAgICAtNjQsICAgICAgOCwgICAgNDE0LCAgICAxMzMsICAgIDI0NCwgICAtMjYzLCAgICAgNTMsICAgIC02OSwKKyAgICAgICAgNzAsIC0xMzc1NiwgICAgLTEzLCAgICAgMjEsICAgICA1MCwgICAgIDEyLCAgICAtMTQsICAgIC0xMiwKKyAgICAgICAgLTcsICAgICA5NywgICAgLTMyLCAgICAgMjQsICAgICA1MSwgICAgLTI0LCAgICAtMjksICAgICA1MywKKyAgICAgICAgMzQsICAgIC0xOSwgIC0yMzQxLCAgICA5NzYsICAgICAyNSwgICAgLTU4LCAgICAgMTgsICAgIC00OCwKKyAgICAgLTI0OTAsICAgIC01NSwgICAgLTMxLCAgIC0xNjUsICAgIC0zNiwgICAgIDI4LCAgICAtMjYsICAgICA5MiwKKyAgICAgICAgNjAsICAgIDEzNywgICAgIDY5LCAgLTUzNDEsICAgLTEyNSwgICAxOTY2LCAgIC0xNTQsICAgIC02NiwKKyAgICAgICAtMTMsICAgIC04NCwgICAgLTEzLCAgICAgODEsICAgIC00NiwgICAgLTk2LCAgICAgNTAsICAgIC01MCwKKyAgICAgIC0xMTQsICAgICAxNSwgICAgIDMwLCAgIC0yMTEsICAgLTE0NywgICAtNTU1LCAgIDM5OTgsICAgICA4OCwKKyAgICAgICAzNTgsICAgLTE1OSwgICAtMTA1LCAgICAtNTEsICAgLTEwOSwgICAgLTE2LCAgICAgNzAsICAgICA5MSwKKyAgICAgICAyNjgsICAgIDEyNSwgICAgLTk1LCAgICAtNjIsICAgICAzOCwgIC0zMjI3LCAgIDM1OTEsICAgIC0xNSwKKyAgICAgICAgOTIsICAgIC03MiwgICAgMTE1LCAgICAxNDQsICAgIC00MCwgICAgMTQyLCAgICAxNzIsICAgICA3MiwKKyAgICAgICAtMTcsICAgICAyMywgICAgICAxLCAgICAgMjgsICAgIC0zOCwgICAtMTM1LCAgICAyMjAsICAgIC04MCwKKyAgICAgIC0xNzksICAgICAgOSwgICAgLTMyLCAgICAgLTYsICAgICAzNywgICAgLTMzLCAgICAgLTMsICAgIC04OSwKKyAgICAgIDczMTQsICAgICAgNSwgICAgMTk0LCAgICAtMTMsICAgICAyMywgICAgIDMxLCAgICAgNDIsICAgICA4NCwKKyAgICAgICAxOTcsICAgLTE2MywgICAtMjUxLCAgIC0yNzMsICAgIDE5MywgICAgMjA2LCAgIC02MTMsICAgIDM5NCwKKyAgICAgIDM0NjksICAgMjU4NywgICAtNzAxLCAgICAgNjIsICAgIDMwMSwgICAtMTA0LCAgICAyMDAsICAgIDE2NCwKKyAgICAgIC0yMDEsICAgLTQ3MywgICAgIDUyLCAgIC00NzMsICAgIDEyOCwgICAtMzgxLCAgICA0MDQsICAgIC02OSwKKyAgICAgIC0yMzAsICAgLTUzNywgICAgMTU3LCAgICAzODksICAgICAtNywgICAyNzgzLCAgIDMwNTgsICAgICA5NSwKKyAgICAgICAtNTksICAgMTYxOCwgICAgICAxLCAgICAgIDQsICAgICA1MywgICAgIC02LCAgICAgMjgsICAgICAxMCwKKyAgICAgICAgIDIsICAgICA4MiwgICAgIDI4LCAgICAgLTgsICAgIC0xNCwgICAgIDI1LCAgICAgNTksICAgICAxMCwKKyAgICAgICAgLTQsICAgICAzNiwgICAtNzc3LCAgLTQ5ODQsICAgICAyOSwgICAgICA4LCAgICAgODUsICAgIC00MywKKyAgICAgIC0xMzcsICAgIC0zNCwgICAgIDUzLCAgICAtNTgsICAgICAgMSwgICAgLTI3LCAgICAgOTEsICAgICAxNSwKKyAgICAgICAgODAsICAgIC0xOSwgICAtMTg2LCAgICA0NjcsICAgICA5NCwgICAtMzgyLCAgICAxMjksICAgIDMyNywKKyAgICAgIDMwNTMsICAgLTIyMSwgICAgMzk5LCAgLTI4MjEsICAgMTA5MCwgICAgMjc4LCAgICAgLTIsICAgLTE2MywKKyAgICAgIC0zOTgsICAgIDEyNiwgICAtMjY2LCAgICAxODAsICAgLTIzNSwgICAgIDcwLCAgICAtMTgsICAgIC0zNCwKKyAgICAgICAtNDUsICAgIDE1OSwgICAgLTMyLCAgICAgNjYsICAgICAxMSwgICAzMTc3LCAgIC0xODgsICAgICAyNywKKyAgICAgICAgMzUsICAgIC01MiwgICAgMTE0LCAgICAtMjgsICAgLTEzNiwgICAgMTg2LCAgIDIxNDYsICAgIDEwMCwKKyAgICAgICAgOTIsICAgICAgNiwgICAgIDU4LCAgICAtNzAsICAgIDE1OSwgICAgLTE0LCAgICAtMzIsICAgICAgOSwKKyAgICAgICAgIDYsICAgIC0yNywgICAgLTczLCAgICAgMjgsICAgICAyMywgICAgLTI0LCAgICAxMDEsICAgIDE0OCwKKyAgICAgICAgODAsICAgIC01MiwgICAgLTI3LCAgICAtNTMsICAgIC0zNiwgICAgICA0LCAgICAtNzQsICAgICA0NywKKyAgICAgICAtMzAsICAgLTEwOCwgICAgIDM0LCAgIDcyMTMsICAgICAxMiwgICAgIDMxLCAgICAtMTcsICAgLTE4NSwKKyAgICAgIDMzMTgsICAgIDE5OSwgICAgMTkyLCAgIDM0NTAsICAgIC04NywgICAgICAzLCAgICAgNDcsICAgICA0NiwKKyAgICAgIC0xNDEsICAgICA0OSwgICAgIDgzLCAgICAtODIsICAgLTEzMiwgICAgLTgyLCAgICAgNjgsICAgIDEzOCwKKyAgICAgLTEwMzEsICAgLTIzNiwgICAgMzkwLCAgICAtMzcsICAgICAyMywgICAgLTk0LCAgICAgLTcsICAgICAgOSwKKyAgICAgLTI5NTgsICAtMTg0NiwgICAgLTQzLCAgICAgMjMsICAgICAyNSwgICAgLTc5LCAgIC0xOTMsICAgIC03NywKKyAgICAgLTMzMzIsICAtMzM1NSwgICAtMTM5LCAgICAgNTYsICAgIDE2MywgIC0zMzAyLCAgICAtODIsICAgIC0yNSwKKyAgICAgICAgMzUsICAgICA5NiwgICAgIDczLCAgICAxNjYsICAgLTE1NCwgICAgMTc0LCAgIC0xMjEsICAgICAxNCwKKyAgICAgICAtODksICAgIDEwMSwgIC0zNzUxLCAgIC0zNDQsICAgLTI0MCwgICAgLTM1LCAgICA0MDEsICAgIC0xNCwKKyAgICAgICAgNDcsICAgIC00OSwgICAgIDI0LCAgICAtNzgsICAgICAyNCwgICAgICA2LCAgICAgNjgsICAgICA1MSwKKyAgICAgIC0xNDUsICAgICAyMCwgICAgIDgzLCAgICAgNTcsICAgIDE0NywgICAtMTAwLCAgICAgNjAsICAgICAzMywKKyAgICAgICAtNTMsICAgICAxMSwgICAgIDM3LCAgLTU3OTMsICAgIC05MywgICAgLTY3LCAgICAgLTksICAgIDExNywKKyAgICAgICAxMTIsICAgIC01MSwgICAgIDYwLCAgICAgNDgsICAgICA0OSwgICAgMzI4LCAgICAyOTMsICAgIDEyNywKKyAgICAgIC0zMTQsICAtMzAyMiwgICAgMzc0LCAgIDMyODMsICAgIC04NiwgICAgNTg4LCAgIC0zNDYsICAgIDQzNiwKKyAgICAgICAgLTcsICAgIC0yNiwgICAgLTg4LCAgICAxMDQsICAgIDIwNSwgICAgMTUwLCAgICAxNDcsICAgICAzNCwKKyAgICAgICAxMjYsICAgICA4NSwgICAgIDQ2LCAgIC0xMjUsICAgLTExOSwgICAgIDc1LCAgICAgMTMsICAgIDE0NCwKKyAgICAgIDM3MjEsICAgIDI3NSwgICAgLTcxLCAgICAgNDMsICAgIDE2MywgICAgLTczLCAgIC0yOTIsICAgLTM4MSwKKyAgICAgICAtNzksICAgICAzMywgICAgIDc5LCAgICAtNzksICAgICAzNCwgICAgLTk0LCAgICAgMTgsICAgIDIyOSwKKyAgICAgICAgNjMsICAgICAyOCwgICAgLTQ0LCAgICAgOTcsICAtMzYwNiwgICAgIDc3LCAgICAtOTUsICAgLTE2MiwKKyAgICAgICAxNjMsICAgICA2MiwgICA2MTgwLCAgICAgODEsICAgIC01MSwgICAgLTE5LCAgICAgLTUsICAgIDEwOSwKKyAgICAgICAgNzEsICAgICAgNywgICAgLTM3LCAgIC0xMDAsICAgIC0zMSwgICAgLTk0LCAgICAxODgsICAgIDE2OSwKKyAgICAgICAtMTQsICAgMjYwNiwgICAtNDE3LCAgICAgMTgsICAtNDM3MSwgICAgLTI1LCAgICAxODAsICAgIDEwOCwKKyAgICAgICAgMTcsICAgICAzMywgICAgIDQ4LCAgICAtNDYsICAgIC05MywgICAgLTc3LCAgICAgMzIsICAgIC0zNywKKyAgICAgICAtNzEsICAgLTI3MSwgICAgLTQ4LCAgIC0yNzMsICAgIC0xNCwgICAgMTE1LCAgICAtNTksICAgLTMxMiwKKyAgICAgLTMzMzQsICAtMzA0NiwgICAgIDcxLCAgIC0xNjYsICAgIDM3OSwgICAgMjA5LCAgIC0xNDIsICAgICAyMiwKKyAgICAgICAgODksICAgIC00MSwgICAgLTQwLCAgICAgLTcsICAgIC01MCwgICAgICA4LCAgICAtMTUsICAgICAxMiwKKyAgICAgICAtNzAsICAgIC0yNywgICAgLTI3LCAgICAgMjUsICAgIC0zMSwgICAgIDM4LCAgICAgLTUsICAgMjgzMSwKKyAgICAgICAtODksICAgICAtOCwgICAgLTUwLCAgIC0xMTAsICAgMTM2OCwgICAgLTU5LCAgLTIzMDcsICAgICAgNiwKKyAgICAgICAxNzksICAgICA3NSwgICAgMTg5LCAgICAxNzAsICAgIC01NSwgICAgMzMwLCAgICAtNzAsICAgIDE3MiwKKyAgICAgICAgNjcsICAgLTQ5MiwgICAgLTU3LCAgLTM0MDgsICAgICAgOSwgICAgLTkzLCAtMTE0MDAsICAgICAxNCwKKyAgICAgICAgLTEsICAgIC0yMSwgICAgIDY1LCAgICAtMTUsICAgICA0NSwgICAgLTIyLCAgICAgNDAsICAgIC0xMCwKKyAgICAgICAtNDEsICAgICAyMywgICAgLTI5LCAgICAtOTYsICAgIC01NSwgICAgLTY2LCAgICAtNTcsICAgIC02MSwKKyAgICAgICAtMjksICAgIC0xNSwgICAtMTAxLCAgLTk4MzEsICAgICAzMywgICAgIDQyLCAgICAtMzUsICAgICA0MiwKKyAgICAgICAtNDQsICAgIC01OCwgICAgIDExLCAgICAtNDAsICAgICAyNywgICAgIDIxLCAgICA3MTUsICAgLTMxNSwKKyAgICAgIC0yNTUsICAgLTExNSwgICAxNzM2LCAgICAgIDQsICAgICA0MSwgICAgLTcwLCAgICAtNTEsICAgLTEwOCwKKyAgICAgICAxNjAsICAgICAtOSwgICAgIDg3LCAgICAgLTYsICAgICAzNiwgICAgLTIwLCAgICAtNjgsICAgICAxMCwKKyAgICAgICAgODIsICAgIC0zMywgICAgLTQyLCAgICAgMTUsICAgIC01NywgICAgLTQwLCAgICAtMzEsICAgICAyMSwKKyAgICAgMTAwMjMsICAgICA2MiwgICAgLTQxLCAgICAtMTAsICAgICA4NSwgICAgLTY1LCAgICAtMTIsICAgIC02MSwKKyAgICAgICAtNzIsICAgLTYxMCwgICAgMTI4LCAgICAtNzYsICAgIDE5OCwgICAgMzY3LCAgLTQ1NjQsICAgICA2MCwKKyAgICAgICAxNTgsICAgIC0xMywgICAtMTM0LCAgICAtNDUsICAgIC0zMywgICAgLTExLCAgICAtNTEsICAgIC03MiwKKyAgICAgICAxMTEsICAgLTE4OCwgICAgMjMyLCAgIC00OTQsICAgIC0yNywgICAgIDQyLCAgICAgNDYsICAgIC0yMywKKyAgICAgICAxMzcsICAgMzE3NCwgIC0zNTk4LCAgICAyMTEsICAgIDE1MiwgICAgMTU1LCAgIC0yOTksICAgICA1NiwKKyAgICAgICAtMjMsICAgLTEyMywgICAgMTMyLCAgICAgNTAsICAgICAyOCwgICAgLTY0LCAgICAgMjgsICAgICAgOSwKKyAgICAgICAtMTcsICAgICAzMSwgICAgMTEyLCAgICAtMTksICAgICAgNCwgICAgIDQ1LCAgLTcxNzUsICAgICA1NCwKKyAgICAgICAtNjEsICAgICAtNywgICAgIDg3LCAgICAxNjQsICAgIDE5NSwgICAgLTI5LCAgICAtNDgsICAgICAyOCwKKyAgICAgICAtNjAsICAgICA3MCwgICAgLTY5LCAgICAxMTIsICAgLTI5NSwgICAgICA1LCAgICAtODksICAgICAzOCwKKyAgICAgICAgMzYsIC0xMTUwMSwgICAgIDE3LCAgICAtMjYsICAgIC02NCwgICAtMjIyLCAgICAgOTEsICAgIC0yMywKKyAgICAgICAtODksICAgICAgMCwgICAgLTk0LCAgIDIxOTEsICAgIC03NCwgICAgLTg0LCAgICAtNjEsICAgIC00MSwKKyAgICAgICAgNTcsICAgICAyNCwgICAgLTM1LCAgICAtMjgsICAgIC0zNywgICAgNDg2LCAgICAxMzEsICAgMzY5OSwKKyAgICAgIC0yNzcsICAgICA2NCwgICAtMTI1LCAgIC0yNDMsICAgIDI3MCwgICAgMzEzLCAgIC0xMTIsICAgIDE0NSwKKyAgICAgICAgNDcsICAtMjg2MiwgICAtMjU0LCAgIC0xMTAsICAgIC0yNywgICAgLTY5LCAgIC0zNDIsICAgLTEyMCwKKyAgICAgICAyMTYsICAgICAzNSwgICAgIDI0LCAgICAgNjIsICAgIC0zOSwgICAgLTI5LCAgIDI0MDIsICAgICAtNywKKyAgICAgICAgLTMsICAgICAxNCwgICAgLTQ3LCAgICAtMjcsICAgICAgNCwgICAgIDI3LCAgICAgMjAsICAgICA4MSwKKyAgICAgICAxMzgsICAgICA3NSwgICAgMTc4LCAgICA0MjEsICAtMjk0MywgIC0zMDgwLCAgICAtODQsICAgIC00MCwKKyAgICAgICAtNTgsICAgLTE5NSwgICAtMTgyLCAgICAxMDEsICAgLTE4NywgICAgICA2LCAgICAtODMsICAgIDI2OSwKKyAgICAgICAtMzIsICAgIC05OSwgICAgIDUxLCAgICAtMzgsICAgICA0NCwgICAgIDgyLCAgICAtMTQsICAgIC0zNSwKKyAgICAgICAgIDAsICAgICAgOCwgICAgLTIzLCAgMTA3NTQsICAgIC03MywgICAgLTU3LCAgICAgNjgsICAgIDEwNywKKyAgICAgICAgODUsICAgICA3NywgICAgMTAxLCAgICAgIDEsICAgIC0yOCwgICAgMTAzLCAgICAtMTAsICAgICA0OCwKKyAgICAgICAgNTUsICAgICAzMywgICAgLTkzLCAgICAtMTgsICAgICAgOCwgICAgIDI4LCAgICAtMTQsICAgLTU3NSwKKyAgICAgICAgMjgsIC0xMTcxMiwgICAgIDkwLCAgIC0xODYsICAgICA1OCwgICAgIDM4LCAgICAtNDIsICAgMjE1NiwKKyAgICAgICAtODIsICAgICAyOCwgICAgLTIzLCAgICAgNDMsICAgICA0MywgICAgICA4LCAgICAgMjUsICAgICA2NSwKKyAgICAgICAgIDAsICAgIC01MywgICAgIDI4LCAgICAtODgsICAgIDM4OCwgICAgLTM2LCAgICAzNjMsICAgICA2NCwKKyAgICAgIDMwNjgsICAgICA1NiwgICAgMzIwLCAgIC0yMDIsICAtMzQzMywgICAgIDczLCAgIC0zMzksICAgLTE1NywKKyAgICAgICAzNzMsICAgLTIxNiwgICAgLTQzLCAgICAxNzEsICAgIDE0MCwgICAtNDM3LCAgIC0xNDMsICAtMjgyMCwKKyAgICAgIC0xMDEsICAgICA1MywgICAtMTExLCAgICAgNjUsICAgIC0zOSwgICAgIDY1LCAgICAtMzAsICAgICA2OSwKKyAgICAgICAtNTUsICAgICA0OSwgICAgIDQ1LCAgICAxMjYsICAgIDE3NCwgICAgMjIwLCAgICAgNzMsICAgLTEwMSwKKyAgICAgICAtNjAsICAgLTE1MSwgICAgLTEzLCAgICAtNDEsICAgIC00OCwgICAgIC05LCAgICAgMjUsICAgLTEyMiwKKyAgICAgICAtODAsICAtMjQ1MCwgICAgIDE5LCAgICAgOTQsICAgICAxNCwgICAgLTE4LCAgICAtMTksICAgICA2MCwKKyAgICAgLTMyNTIsICAgIC0xMCwgICAzMzkwLCAgICAtMTUsICAgLTM2NSwgICAgLTE1LCAgICAtNzMsICAgLTIyMiwKKyAgICAgICAzMDcsICAgICA3MCwgICAgLTk1LCAgICAyMzcsICAgLTE0MiwgICAtMTYzLCAgICAtNDQsICAgLTEzOCwKKyAgICAgICAgLTcsICAgICAgNiwgICAgLTM2LCAgICAtNjcsICAgICAgOSwgICAgLTIyLCAgMTAyMzUsICAgIC01NiwKKyAgICAgICAgLTgsICAgICA0NCwgICAtMTU1LCAgIC0xMTcsICAgIC0yMiwgICAgLTMyLCAgICAtNzQsICAgIC0xNCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMDgwOGwxW10gPSB7CisgICAgICAgLTU4LCAgICAyMjIsICAgLTE1NCwgICAgLTc0LCAgICAtNTMsICAgNDkzOSwgICAgNDIxLCAgICAgNjcsCisgICAgICAgIDI2LCAgICAxMzIsICAgICA2MCwgICAgLTk3LCAgICAgLTEsICAgIC00MywgICAgMzI4LCAgICAgIDIsCisgICAgICAgNDYwLCAgICAtNjYsICAgIC0xMSwgICAgLTQ1LCAgICAtNTYsICAgIC04NiwgLTEwNTY5LCAgIC0xMjksCisgICAgICAgIDU4LCAgICAtMjUsICAgICAzOSwgICAgIDI4LCAgICAgMjYsICAgICA0NSwgICAgLTYxLCAgIC0xMzksCisgICAgICAgLTIyLCAgIC0xMzUsICAgLTI4MiwgICAtNTE3LCAgIC0zNjgsICAgICA1NSwgICAgLTQ3LCAgICAgMzAsCisgICAgICAtMTEwLCAgICAgNDcsICAgICA3NSwgICAgLTEzLCAgICAgNjUsICAgIC00MSwgICAgMTA0LCAgIDQ3NDUsCisgICAgICAtMTQ5LCAgICAtOTksICAgICAyOCwgICAgNDIxLCAgICA1MTcsICAgIC01NiwgICAgIDgxLCAgIC0zMDksCisgICAgICAgIDY3LCAgICAtNDIsICAgICAtNiwgICAgIDE3LCAgICAtNjAsICAgLTE1MSwgICAgIDUwLCAgICAtODQsCisgICAgICAgIC05LCAgICAgMjksICAgIC03MiwgIC0zMDE5LCAgICAgODIsICAgLTE5NSwgICAgIDQxLCAgICAtMTQsCisgICAgICAtMjA2LCAgICAtMzQsICAgIC01OCwgICAgLTE4LCAgICAgMzAsICAgMjE1NCwgICAgLTIwLCAgICAgIDIsCisgICAgICAgIC0xLCAgICAgNDEsICAgIC0xMCwgICAgICA3LCAgICAgODYsICAgIDQ5NCwgICAgMTIzLCAgICAzMjgsCisgICAgICAgIDczLCAgICAyMTMsICAgIC0yOSwgICAgIDE3LCAgICAgNDMsICAgIC05MiwgICAgLTYxLCAgICAgLTksCisgICAgICAtMTMwLCAgIC0xMTMsICAgICAzMywgICAgLTI4LCAgLTY2NzcsICAgLTE5OCwgICAtMTg1LCAgIC0yMzYsCisgICAgICAgMTgzLCAgIC0xMDgsICAgIDczOSwgICAgIDYwLCAgICAgOTgsICAgLTMxNCwgICAgIDY2LCAgICAgMTAsCisgICAgIC0zMTYxLCAgIC0xNTksICAtMjg1MCwgICAgMTE4LCAgICAgMzcsICAgIC00MSwgICAtMTE5LCAgIDMwODcsCisgICAgICAgIDQzLCAgICAtMzYsICAgICA0MiwgICAgMTA2LCAgIC0xNzQsICAtMzM3OSwgICAgLTkyLCAgIC0xNDIsCisgICAgICAtMjM3LCAgICAgOTQsICAgIC01OSwgICAtMTIzLCAgIC0xMTcsICAgIDE0NCwgICAgLTc1LCAgICAxNDYsCisgICAgICAtMjY4LCAgICA1NjEsICAtMTE2MCwgICAgMzM2LCAgIDE0NzcsICAgIDIwNywgICAgIDg5LCAgICAxMzAsCisgICAgICAgMTI3LCAgIDM3NjMsICAgLTM3MiwgICAgIDQ4LCAgICAgOTksICAgIDIwNCwgICAgIDg0LCAgICAyMDksCisgICAgICAgMTAzLCAgICAxMTgsICAgIDEyNSwgICAgMzI2LCAgICAtMjksICAgLTIwNiwgICAgMTM5LCAgICAtNjEsCisgICAgICAgIDk0LCAgICAgNzcsICAgNjYyNCwgICAtMTYzLCAgICAgMjMsICAgICAyNywgICAtMTA0LCAgICAxNTAsCisgICAgICAgLTc2LCAgIC0yMDUsICAgLTE4NiwgICAgLTMwLCAgIC0yMjcsICAgIC01OCwgICAgIDE3LCAgICAgMjUsCisgICAgIC02NTM2LCAgICAtMTksICAgIC02NiwgICAgLTQ1LCAgICAtNzIsICAgICA0MSwgICAgIDQ5LCAgICAtNzksCisgICAgICAgMTA1LCAgICAgLTQsICAgLTExNywgICAgLTM3LCAgIC0xODMsICAgIDIxNiwgICAgLTI3LCAgICAtMjMsCisgICAgICAgLTMxLCAgLTI3MjAsICAgICA1MywgICAgLTIzLCAgICAtNDYsICAgICAtOSwgICAgLTEwLCAgICAgNTAsCisgICAgICAgLTEyLCAgICAtNTAsICAgIC01NiwgICAgIDM1LCAgIDU0OTgsICAgLTExMCwgICAgIC0yLCAgICAgNDQsCisgICAgICAgIC0xLCAgICAgMTMsICAgICA1MiwgICAgLTE4LCAgICAtNjEsICAgIC04MCwgICAgLTI5LCAgICAgMjUsCisgICAgICAgIDYxLCAgICAtMzcsICAgICA5MywgICAgLTE5LCAgICAgNjcsICAgICA3NSwgICAgLTQxLCAgICAyNTQsCisgICAgICAgMTYxLCAgICAxMTgsICAtMzM3OSwgICAgMzk4LCAgICAgLTksICAgLTIwOCwgICAtMTQzLCAgICAyMDcsCisgICAgICAtMTM1LCAgICAtMzIsICAgIDE3MSwgICAgMTg3LCAgIC0xOTQsICAgIDQ2NiwgICAgLTU1LCAgICAxNTgsCisgICAgICAgIDM0LCAgICAxMDUsICAgNDk4NiwgICAgIDI3LCAgICAtNDEsICAgICAyMCwgICAgIDg3LCAgIC0xMTAsCisgICAgICAgIDM5LCAgICAgODAsICAgIC0zNywgICAgICA4LCAgICAtMjUsICAgIC00NCwgICAtMTA4LCAgIC0xNzEsCisgICAgICAtMzY2LCAgICAyMDgsICAgLTIyNSwgICAgICAxLCAgIC0xMjQsICAgICAyMSwgICAgIDgxLCAtMTAzNDksCisgICAgICAgLTUxLCAgICAgMzMsICAgIC01MSwgICAgMTQxLCAgICAtMzYsICAgIDEwNiwgICAtMTAwLCAgICAzMjAsCisgICAgICAgMTIyLCAgICAgIDMsICAgIDI2NiwgICAgIDcyLCAgICAgLTgsICAgLTExMiwgICAgIDU1LCAgIC0xMDcsCisgICAgIC00MTU0LCAgICAtNjksICAgICAgMCwgICAgIDcxLCAgIC0xNTMsICAgIC04MCwgICAgLTUwLCAgICAgMjAsCisgICAgICAtMTEyLCAgICAyMjUsICAtMTk4MiwgICAgMjczLCAgICAtMTksICAgLTEyNywgICAgMTA5LCAgICAtMjUsCisgICAgICAgIDQ3LCAgICAgNTcsICAgIC05OCwgICAgLTEwLCAgICAgNDIsICAgIC0yNSwgICAgIDEwLCAgICAgMjQsCisgICAgICAgIDQxLCAgICAtNzMsICAgICA0NSwgIC0zNTIzLCAgIC0zNzAsICAgMzIxMywgICAgIDU0LCAgICAtODcsCisgICAgICAgIDY3LCAgIC0xODUsICAgIDEwMCwgICAgLTMzLCAgICAtNDEsICAgICAgMywgICAgLTM4LCAgICAgNzAsCisgICAgICAtMTA4LCAgIC0xMjAsICAgIC02NywgICAtMTQ0LCAgIC0xODEsICAgIC0zMywgICAtMTA0LCAgICA0MjksCisgICAgICAgIDg5LCAgICA4NDksICAgMzAyMiwgIC0yNzY1LCAgIC0zNDEsICAgIDE4NCwgICAtMjQ4LCAgICA2MTAsCisgICAgICAgNDA4LCAgIC0yMjIsICAgIDE4NCwgICAgIDg0LCAgICAtNjQsICAgIDQ3OSwgICAtMTQ2LCAgICAgNDcsCisgICAgICAtMTAwLCAgICAgMTMsICAgICAxNywgICAgIC03LCAgICAgNTgsICAgIC0xMywgICAgLTM2LCAgICAtMjMsCisgICAgICAgIC0xLCAgICAtMjUsICAgICAxMCwgICAyNjY2LCAgIC0xMTMsICAgIC00MSwgICAtMTQwLCAgIDMwNjQsCisgICAgICAgMTA1LCAgICAgMzEsICAgMzA0MiwgICAgLTc1LCAgIC0xMzIsICAgLTExMywgICAgIDgwLCAgIC0xMDAsCisgICAgICAgLTM5LCAgICAyMTYsICAgICAtNCwgICAgICA3LCAgICAtNDMsICAgIDI0MiwgICAgIDE5LCAgLTEwMzEsCisgICAgICAgNzMxLCAgLTM2NTksICAgIC0yNCwgICAgLTIwLCAgICAxMDksICAgIDEyNiwgICAyOTgwLCAgICAgMTksCisgICAgICAgLTExLCAgICAtNDgsICAgICA1NywgICAtMTM4LCAgICAtMTEsICAgLTIxMSwgICAtMTUxLCAgICA1NDAsCisgICAgICAtMTEzLCAgIC0xMTAsICAgICAgMCwgICAtNDE1LCAgICAxNTAsICAgIC04MCwgICAgLTgwLCAgICAyMDksCisgICAgICAgLTgyLCAgLTUyMTIsICAgLTEyNSwgICAgMzc2LCAgICAgIDgsICAgIDEzMSwgICAtMTM4LCAgICAgMzAsCisgICAgICAtOTIyLCAgIC0zMjAsICAgIDE4MSwgICAgLTc1LCAgICAxMzgsICAgLTExMiwgICAgMTQ2LCAgICAtNzIsCisgICAgICAgIDY0LCAgICAtNzUsICAgLTI2MiwgICA0ODcyLCAgICAtMTEsICAgIC02MSwgICAgIDM3LCAgIC0yMDUsCisgICAgICAgIDQ4LCAgLTIyNTcsICAgICA4MiwgICAgMTA2LCAgICAgOTMsICAgIC02NiwgICAgIDQ4LCAgICAgNzEsCisgICAgICAgIDI5LCAgICAgNzIsICAgICAzMiwgICAgIDI5LCAgICAgMTcsICAgICAgNSwgICAgIDM0LCAgICAgMjksCisgICAgICAgLTI5LCAgICAtNzIsICAgICA1MCwgIC03NzAyLCAgIC0xMTQsICAgLTExNywgICAgIDQ3LCAgICAgMTEsCisgICAgICAgIDE5LCAgICAxMDAsICAgICA0OCwgICAgLTI4LCAgICAgLTgsICAgICA1MywgICAgIDIxLCAgICAgODAsCisgICAgICAgLTQzLCAgICAgMzcsICAgIDE2NCwgICAgIDIyLCAgICAtMTUsICAtNTI1OCwgICAgLTIzLCAgICAtMzIsCisgICAgICAgMTA4LCAgICAgNTIsICAgICAgNywgICAtMTYxLCAgICAgMTEsICAgICA4NCwgICAgMTQxLCAgICAgLTgsCisgICAgICAgLTEyLCAgICAtMjUsICAgIDExMSwgICAgMTQ2LCAgICAtOTYsICAgICA2NiwgICA3Mzg4LCAgICAgNTQsCisgICAgICAgIDE3LCAgICAtNTQsICAgICA2MiwgICAgIDQ0LCAgICAtNjYsICAgIC0xMywgICAgIDI2LCAgICAgMTMsCisgICAgICAgIDg1LCAgICAtNzksICAgIC0yMSwgICAgIDk4LCAgICAxNTYsICAgIDE4MSwgICAtMTAzLCAgIC0xODgsCisgICAgICAgLTM1LCAgIC0xNzksICAgICA4MywgICAgMTE3LCAgICAtOTIsICAgICA0OSwgICAtMTg1LCAgIDM4MDAsCisgICAgICAgLTkwLCAgICAgMTQsICAgICA0MiwgICAgIDk0LCAgICAtODMsICAgLTE3OCwgICAtMTU2LCAgICAgLTgsCisgICAgICAgIDMzLCAgICAgNDIsICAgIDIwNCwgICAgIDQyLCAgICAgIDEsICAgIC04NSwgICAgIDQ3LCAgICAgMTAsCisgICAgIDEwODA0LCAgICAgMzYsICAgICAgOCwgICAgIDI2LCAgICAtNDcsICAgIC01MSwgICAtMTg5LCAgICAgODMsCisgICAgICAgLTQ3LCAgICAtMjMsICAgIDEwNCwgIC03MTQyLCAgICAtNjcsICAgICA1NSwgICAgIDIxLCAgICAgNjgsCisgICAgICAgICA4LCAgICAtODQsICAgIC02MCwgICAgLTQzLCAgICAxNDIsICAgIC00MSwgICAgIDI3LCAgICAtNzIsCisgICAgICAgLTcwLCAgIC0xNzAsICAgLTE0MSwgICAgMjAyLCAgIC0xOTgsICAgLTEwNSwgICAgIDQxLCAgLTM1NTMsCisgICAgICAgLTM0LCAgIC0xNDgsICAgICAzNCwgICAgLTYyLCAgIC0xNjEsICAgIC0yMCwgICAgLTczLCAgICAxMjgsCisgICAgICAgMTYyLCAgLTgzNDMsICAgICAgNCwgICAgLTcxLCAgICAtNDYsICAgICAxMiwgICAgIDI3LCAgICAgNDgsCisgICAgICAgLTQxLCAgICAgNTAsICAgIC0xOSwgICAgLTg4LCAgICAgIDcsICAgICA3OSwgICAgIDI5LCAgICAtMTksCisgICAgICAgLTMxLCAgICAtNDksICAgLTE0NywgIC0xODg2LCAgIC0xMDMsICAgLTIxMywgICAgIDI4LCAgIC0xODMsCisgICAgICA0MTE5LCAgICAgODcsICAgICAgNiwgICAgIC02LCAgICAgNTEsICAgLTE5MCwgICAtMTY3LCAgIC0xMTYsCisgICAgICAgIDIzLCAgICAtMjYsICAgICAgNywgICAgLTM4LCAgIDU0NDIsICAtMTg2OSwgICAgLTgxLCAgICAxOTcsCisgICAgICAgMTA1LCAgIC0xMjIsICAgICA2NSwgICAgMjIwLCAgICAgMzIsICAgIC01NywgICAgLTM5LCAgICAtMTUsCisgICAgICAgICA0LCAgICAxMTIsICAgIC01NSwgICAtMTM5LCAgIC04MjUsICAgIDk4NSwgICAtMTA5LCAgIDI1NTgsCisgICAgICAgMjE4LCAgICAgOTQsICAgICA2NSwgICAtMTg0LCAgIDMyNjksICAgIDEwMSwgICAgLTY1LCAgICAgNDIsCisgICAgICAgMzcyLCAgICAtMzgsICAgICA1OCwgICAgICA4LCAgIC0xNDMsICAgLTU0NCwgICAtMjY4LCAgICAxMjEsCisgICAgICAgIDM4LCAgICAgNjEsICAgIC02MywgICAgLTEwLCAgICAtMzAsICAgIC01MiwgICAgLTc2LCAgICAtNzQsCisgICAgIC02NjkwLCAgICAgLTUsICAgLTE2MCwgICAgIDc2LCAgICAtNzcsICAgICA3NCwgICAgMzc0LCAgIC05MTcsCisgICAgICAgMjM5LCAgIC0yMDMsICAgIDU1MCwgICAgLTg0LCAgIC0zMDUsICAgIDI5MiwgICAgLTUxLCAgICAgMzYsCisgICAgICAgMTM1LCAgICAtNzksICAgICAyNywgICAgLTY5LCAgIC0zMDksICAgNDU2MSwgICAgLTY3LCAgICAgMTEsCisgICAgICAgLTYwLCAgICAgNDMsICAgICAxOCwgICAgIC0yLCAgICAgIDgsICAgIC0xNSwgICAgIDIwLCAgICAgMjIsCisgICAgICAgIC0yLCAgICAtNDEsICAtMjM5NiwgICAgIDM3LCAgICAtNzksICAgICA2NywgICAgIDI3LCAgICAtODQsCisgICAgICAgMzUzLCAgIC0yMTMsICAtMjMzNiwgICAgIDU4LCAgICAgMzksICAgIDEyNiwgICAgLTc4LCAgICAtOTgsCisgICAgICAgLTkwLCAgICAgLTMsICAgICAtOSwgICAgLTQzLCAgICAgLTIsICAgIC0yOSwgICAgIC01LCAgIC0xNDksCisgICAgICAgIDQyLCAgICAgOTgsICAgLTEwOSwgICAgMTM3LCAgICAgNTgsICAgIC04MywgICAgLTM4LCAgICAgNTEsCisgICAgICA2NTI1LCAgICAgNTAsICAgICA5NywgICAgLTMxLCAgICAgIDgsICAgIDEzMiwgICAgLTcxLCAgICAtNTUsCisgICAgICAgIDExLCAgICAxMjAsICAgICAgMiwgICAgLTQzLCAgICAxMzYsICAgIC0zNywgICAgLTg1LCAgICAxNTAsCisgICAgICAgMTMzLCAgICAgNjcsICAgIC00MSwgICAtNDUyLCAgIC0xMDQsICAgICAgNCwgICAgMTI2LCAgICAxMDAsCisgICAgIC0yNjYwLCAgIC0xMDgsICAgLTEwOSwgICAgLTY0LCAgICA2MTUsICAgIC03NSwgICAgIDQ1LCAgICAgMTAsCisgICAgICAgLTU3LCAgICAtNTcsICAgLTEwOCwgICAgMTY3LCAgIC0yMTgsICAgIC0xMCwgICAtMzMxLCAgICAtMjYsCisgICAgICAgLTIxLCAgIDY1NjEsICAgICA3MywgICAtNTk5LCAgICAxMjYsICAgIC0yMywgICAgMjUwLCAgIC0xMDMsCisgICAgICAgIC00LCAgICAtMjgsICAgIC0yMCwgICAgLTM1LCAgICAtMTksICAgICA1MSwgICAgICA5LCAgICAtMjUsCisgICAgICAgLTQwLCAtMTEyMjAsICAgICAtMiwgICAgIDI4LCAgICAtMTIsICAgICAyMywgICAzNDgxLCAgICAxNjksCisgICAgICAgMTU5LCAgIC0yMTcsICAgIC00OCwgICAgMTE0LCAgICAtOTMsICAgIC0zNCwgICAtMTkxLCAgICAtNjMsCisgICAgICAgIDMxLCAgICAxODIsICAgICA3OSwgICAgIDkwLCAgICAgNTUsICAgICA2NywgICAtMTQ1LCAgICA0MDksCisgICAgICAgMTkwLCAgLTc3OTEsICAgIC0yNiwgICAgIDE4LCAgICAgNzEsICAgLTExMywgICAgLTgwLCAgICAgNjksCisgICAgICAgLTIxLCAgICAtMjcsICAgLTEyMSwgICAgIDUxLCAgIC0xNDgsICAgIDEwMywgICAgMTk2LCAgIDI3MjYsCisgICAgICAgLTY3LCAgIDMwMjIsICAgIC0yOCwgICAgIDI2LCAgICAtOTksICAgICA1MSwgICAgIDI0LCAgICAgNjEsCisgICAgICAgMTA0LCAgICAgODksICAgIC01NywgICAgLTIzLCAgIC0xMTIsICAgICA0MywgICAgICA2LCAgICAgMTMsCisgICAgICAtMTg0LCAgIC0xNjgsICAgIDExNywgICAgLTI5LCAgIDE4NjUsICAgICAtMywgICAgIDIwLCAgICAgIDgsCisgICAgICAgIDMwLCAgICAgMzIsICAgIC04MSwgICAgIDgwLCAgICAtMjAsICAgIC01OSwgICAgIDM3LCAgICAgMTksCisgICAgICAtMTA3LCAgLTM5MjAsICAgLTI1OSwgICAgIDQ0LCAgICAgMjMsICAgLTEyOSwgICAgIDI0LCAgICAtNjYsCisgICAgICAgLTI3LCAgLTMwNzEsICAgIDExNiwgICAgICA5LCAgICAtNzYsICAgICA1NiwgICAgLTgzLCAgICAgMjUsCisgICAgICAgIDU0LCAgICAtMjAsICAgICAgMiwgICAgMjMwLCAgICAgNTYsICAgIC00MSwgICAgMTMxLCAgICAtMTUsCisgICAgICAgLTYyLCAgICAgNjEsICAgICA1NiwgICAgIDc0LCAgICAtMzQsICAgIDExMCwgICA0NjA2LCAgICAgLTQsCisgICAgICAgIDE4LCAgICAtNDcsICAgIDMzMSwgICAtMTA2LCAgICAtNzgsICAgICA3MCwgICAgIDUzLCAgICAgNzAsCisgICAgICAgLTIyLCAgICAgNzcsICAgIC03MSwgICAgLTYwLCAgIC0xMDEsICAgICA3MCwgICAgICA3LCAgICAxMDQsCisgICAgICAgIC03LCAgICAgMzksICAgIC0yNywgICA3MjEwLCAgICAyNTMsICAgIC0xNSwgICAgICAwLCAgICAtOTYsCisgICAgICAgIDMyLCAgICAgNTAsICAgIC0xMCwgICAgIDMzLCAgIDIwNTgsICAgICAxMSwgICAgLTE1LCAgICAgNDIsCisgICAgICAgLTE0LCAgICAgNTEsICAgICAgNCwgICAgIC0zLCAgICAtMTEsICAgIC04NiwgICAgIDEwLCAgICAgMzMsCisgICAgICAgIDIxLCAgICAtMTgsICAgIC0zMSwgICAgIC03LCAgICAgNTMsICAgICAtNywgICAgIDk1LCAgICAgIDcsCisgICAgICAgIDc1LCAtMTEzMTQsICAgICAgNywgICAgIDE3LCAgICAtMTYsICAgIC04MywgICAtNDc1LCAgIC04ODcsCisgICAgIC0xMTQxLCAgICAgIDEsICAgLTEwMSwgICAgICA1LCAgICAtNDYsICAgIDExMCwgICAgLTkwLCAgICAtNDcsCisgICAgICAgLTE1LCAgICAgMTksICAgICA2NiwgIC00MDc4LCAgICAxMDQsICAgICA0MywgICAgMTA1LCAgIC0xMjYsCisgICAgICAgMTgxLCAgICAgNDMsICAtMTY1NSwgICAgLTgxLCAgICAtMTEsICAgICAzMywgICAgLTMzLCAgICAgMzMsCisgICAgICAgIDI4LCAgICAtNDQsICAgICAzNSwgICAgIC02LCAgICAtMzgsICAgICA2OCwgICAgLTQwLCAgICAgNjcsCisgICAgICAgIDczLCAgICAtMjksICAgIDE3MSwgIDExOTgyLCAgICAgNDIsICAgICAtOCwgICAgLTY2LCAgICAtNjYsCisgICAgICAgIDQwLCAgICAtMTksICAgICAxNCwgICAgIDMzLCAgICAtNjMsICAgICAyNCwgICAgIDk0LCAgICAtOTQsCisgICAgICAtMTA2LCAgICA1ODQsICAgIDMzMCwgICAtMTA4LCAgLTM4NDEsICAgIDc4MiwgICAtMzAwLCAgICAtMTEsCisgICAgICAtMzAzLCAgIC0xNzQsICAgLTIxNywgICAgIC0zLCAgICAgMjQsICAgIDE2OCwgICAgMTg3LCAgIC0xNjYsCisgICAgICAgIDU0LCAgICAyMzgsICAgLTI2OSwgICAgLTI3LCAgICAxODIsICAgICAtNCwgICAgLTcyLCAgICAtNDcsCisgICAgICAgIDMyLCAgICAgMzksICAgNzYyMiwgICAgLTQ2LCAgICAtNjcsICAgIC01MywgICAgIDU2LCAgICAxMjMsCisgICAgICAgLTUwLCAgICAgNjksICAgIC0zNiwgICAtMjc1LCAgICA2MjgsICAgIC01NSwgICAgMTk1LCAgICAtNTYsCisgICAgICAtMjY1LCAgIC0xMzIsICAgIC0zOSwgICAgIC00LCAgICAxNjksICAgIDExMywgICAtMTgwLCAgICAtMTksCisgICAgICAgIDg4LCAgLTY0MjcsICAgICA0MiwgICAtMjU3LCAgIDExODAsICAgIDM1OSwgICAgMzM1LCAgIDM4MjEsCisgICAgICAgMTE2LCAgICAgNzksICAgICAgMywgICAgLTkzLCAgICAgNjcsICAgIC00NCwgICAgIDU4LCAgICAtMTYsCisgICAgICAgMjY1LCAgICAxNzIsICAgIC0zOSwgICAgLTQ0LCAgICAgMTgsICAgICA5MiwgICAgICA0LCAgICAyMTgsCisgICAgICAgMTIyLCAgLTI5OTMsICAgIDE1MCwgICAgMTM4LCAgICA2MTgsICAgICA2NiwgICAtNjE4LCAgICA0MDIsCisgICAgICAyMjI3LCAgICAgMTAsICAgICAzOCwgICAgMzA4LCAgICAzMzgsICAgIC03MCwgICAgMjY1LCAgIDEwNDcsCisgICAgICAtMTA0LCAgIC0xODIsICAgIDMwNSwgICAtMTYyLCAgICAtOTksICAgIDUxMCwgICAgLTIwLCAgIC0xMTQsCisgICAgICAgNTI5LCAgICAtNDIsICAtMzU2OSwgICAgIDUyLCAgICAtODAsICAgLTMxNCwgICAgNzE2LCAgICAtMzEsCisgICAgICAgMjU5LCAgICAgNTksICAgIC03MywgICAtMTE3LCAgICAgMzgsICAgIC00NCwgICAgLTE2LCAgICAtNzQsCisgICAgIC01MDYwLCAgICAgMzUsICAgICAxMCwgICAgLTMwLCAgICAgNTQsICAgIDIxNywgICAgIDM2LCAgIC0yMDUsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjA4MDhzMFtdID0geworICAgICAtMjE5MSwgICAtODY1LCAgLTE5MDYsICAgLTI1MSwgICAgMjc0LCAgICA1OTQsICAtMTIxNCwgICAgNjc3LAorICAgICAgIDQ4MiwgIC0xMTc2LCAgICAgNDMsICAtMTA5OCwgICAtMjAzLCAgIC01MzcsICAgMTgzNCwgICAxMzMyLAorICAgICAgIDMwOCwgICAgNDMyLCAgIC0xOTEsICAgMzA5MSwgICAxODkyLCAgICA5MjYsICAgLTQ0NiwgIC0xMjA2LAorICAgICAgLTYxMywgICAgMTk4LCAgICA1NzUsICAgIC0zOCwgICAgMjY0LCAgICAzNzUsICAgIDI3OCwgICAtNjkxLAorICAgICAgLTEwNywgICAgIDE3LCAgIC0yMzksICAgIDI2MSwgICAgODQ4LCAgIC02MjAsICAgIDE4MywgICAgNjI0LAorICAgICAgIDEyMiwgICAtMzU4LCAgICAtNTAsICAgMTAxNywgIC0xMDc1LCAgIC03MDUsICAgLTM0NiwgICAgMzM3LAorICAgICAgLTEyMSwgICAgMTAwLCAgIC0yMTgsICAtMTA1MSwgICAtNDYzLCAgLTQ3MjgsICAgLTUxMywgIC0xMTUxLAorICAgICAgIDczNywgICA0MzU2LCAgICA2ODQsICAtMTM3NCwgICAxNjMwLCAgICA1MjEsICAgLTUyMCwgICAgLTUyLAorICAgICAgICA5MCwgICAgMTE5LCAgICAtNDMsICAgLTEzMSwgICAgIDI0LCAgICAgLTIsICAgLTE4NCwgICAgLTY1LAorICAgICAgIDYxNCwgICAgMzcxLCAgIC00NDgsICAgLTQxNCwgICAxNDE1LCAgIC02ODcsICAgLTIyNCwgICAgNTg0LAorICAgICAgLTc2OCwgIC0xMjEwLCAgIDI5NDEsICAtMzA1NywgICAgMTMyLCAgICA0MDYsICAgLTk1MiwgICAgMjkxLAorICAgICAgIDI5NSwgICAtNzk4LCAgICA2MDgsICAtMTQ3NiwgICAtNTE2LCAgICAgMjEsICAgLTMwMiwgICAyMDg1LAorICAgICAtMTcwMCwgIC0yNjU1LCAgIC0zNTUsICAgIDE3NSwgICAtNDA5LCAgICA2NjIsICAgICA0NiwgICAtMjQ3LAorICAgICAgLTIwMSwgICAtNTgwLCAgICAxNzksICAgIC01NCwgICAgNDU4LCAgICA4MzYsICAgMTU0MywgICAxODI5LAorICAgICAgLTI4MiwgICAtMjc4LCAgICA0MTIsICAgMjQyMiwgICAyMDc3LCAgICAxOTcsICAgLTg5NywgICAgNDUxLAorICAgICAgIDU5NSwgICAxNTQ3LCAgICA1MzgsICAgIDgyNSwgICAgNTYzLCAgICA0NDMsICAgLTU3NiwgICAtODU0LAorICAgICAgLTU3MiwgICAgMjQxLCAgIC00NzEsICAgIDIwMSwgICAtMzExLCAgIC01MjksICAgIDExMiwgIC01MTI4LAorICAgICAgLTE3MywgICAtMjMzLCAgIC00MzUsICAgIDM0MCwgICAgMTU4LCAgICAtNDEsICAgIDI3MywgICAtMjI0LAorICAgICAgIDkxOSwgIC0xNTcwLCAgIDEwNzUsICAgIDI2NSwgICAtMjgyLCAgIDEyNTYsICAgMTAwNywgICAgMjMxLAorICAgICAgIDcyMCwgICAgNDE3LCAgIC00MDEsICAtNDU4OSwgICAtNzQ3LCAgIC00NTMsICAtMTExMiwgICAgIDU0LAorICAgICAgIDE1NiwgICAtNTYxLCAgIDI3NDYsICAgLTQyMiwgICAgLTgzLCAgICAtOTEsICAgLTM4MSwgICAtMjcwLAorICAgICAtMTIyNiwgICAgOTg3LCAgIC05NjUsICAgIDYyNSwgICAtNDc0LCAgICA1NjUsICAgMjg5MCwgICAgLTg1LAorICAgICAgMTI5MSwgICAtMjgwLCAgICA2MjYsICAgIC0yNiwgICAgODQwLCAgIDExMjIsICAtMTkxNSwgICAgNzgwLAorICAgICAgLTcwMiwgICAgNzkyLCAgIC01NzgsICAgLTEyMiwgICAgIC05LCAgIDExNzUsICAgLTE5NCwgICAtNTcxLAorICAgICAgMjk0MCwgICAgNTQwLCAgICAgMzEsICAgMTgxNywgICAtMzUyLCAgICAyNjQsICAgIDk1MywgIC0yMDM1LAorICAgICAgIDIzOCwgICAzMjUwLCAgLTE1NjEsICAgIDY1MywgICAtMzMxLCAgIC0zOTMsICAgIDgyNywgICAtMzgyLAorICAgICAgIDMyMywgICAgMjgxLCAgLTEzMzksICAgLTgxOSwgICAgNTQ1LCAgICAyMDcsICAgICAxNCwgICAgMzM4LAorICAgICAgIDQzMiwgICAgODYwLCAgIDE2OTEsICAgIDE0MiwgICAgNzExLCAgICAzODEsICAtMTE1MSwgICA0MTY0LAorICAgICAgLTg2NywgICAtMjQxLCAgICAxMTEsICAgLTUxMywgICAtODYzLCAgICAgNzgsICAgMTQ1MywgICAtMzYzLAorICAgICAgLTEyOCwgICAtMjMyLCAgLTE4NTMsICAgMjM3MywgIC0xMTU2LCAgICAyMTAsICAgIDY5OCwgICAxMTM0LAorICAgICAgLTg2OSwgICAtMTc3LCAgIC0zNTIsICAgMTUxNCwgIC0xMzcwLCAgIC03ODksICAtMTE5MywgICAgODE5LAorICAgICAgIDM0OCwgICAgIDgwLCAgICA0OTIsICAgIDE3OSwgICAtOTA5LCAgICA1OTEsICAgLTYwMCwgICAtMzc3LAorICAgICAtMTcwOSwgICAgIDU5LCAgIC01MzksICAgIDU1NywgICAgLTQ1LCAgIC0zNjIsICAgIDc3OCwgIC00OTE5LAorICAgICAgLTY0NywgICAgMjAzLCAgICA4NjUsICAgLTMxMywgICAtMjU3LCAgICAxNzMsICAtMjQxNSwgICAxMDA1LAorICAgICAtMTc3MSwgICAgODQzLCAgIC00NzQsICAgMTYxOSwgICAxMTkzLCAgIC0xODYsICAgIDMwNSwgICAgNjM2LAorICAgICAgLTY2MiwgICAxOTc2LCAgICA1NDYsICAgIC04MiwgICAtMTA4LCAgIC03NTEsICAgIDg1MCwgICAgNTIxLAorICAgICAtMTYyNSwgIC0zMTM1LCAgIC0zODgsICAgICA2NCwgICAgMjQ5LCAgLTExODksICAtMTU1MiwgICAyNjI5LAorICAgICAgICAgMiwgICAtMjIxLCAgIC0xMDUsICAgIDc1NCwgICAgMjUxLCAgICAyMTksICAgLTI3MCwgICAtMjAyLAorICAgICAgIDU0NSwgICAgMTQ3LCAgIDEwMTksICAgIDEwOCwgIC0xMzU4LCAgLTEzMTcsICAgMTM2MiwgIC0xMzIzLAorICAgICAtMzMyMiwgICAtNDA1LCAgIC0zNzEsICAgLTU1NCwgICAtMzM0LCAgICAyOTYsICAgIDQ5MywgICAgMjQ4LAorICAgICAgICAtNCwgICAxMzQwLCAgICAxMjMsICAgLTU4NCwgICAtODA0LCAgIC03NjYsICAgLTE2NCwgICAtNDcwLAorICAgICAgIDI5NSwgICAgMjE4LCAgICAgLTMsICAgICA2MiwgICAtMTk0LCAgIC02NTcsICAgNTAxNiwgICAgMjgwLAorICAgICAgICAtNCwgICAgLTY5LCAgIC0yODEsICAgLTk5NCwgICAgMjA5LCAgICAzMDcsICAgODY0OCwgICAgLTM3LAorICAgICAgLTEzOCwgICAgIDQ1LCAgIC0zMjksICAgLTEwMSwgICAgLTY1LCAgICAgOTgsICAgICA1OCwgICAgNzE0LAorICAgICAgICA1NiwgICAtMTcwLCAgICAgNjAsICAgLTIwMywgICAtMjQ4LCAgICAxMDMsICAgIDEwNywgICAtNDA4LAorICAgICAgIDU5NiwgICAgMTcwLCAgICAgNjEsICAgIDU4NCwgICAgNzI3LCAgIC00MzQsICAgLTE4MSwgIC01MTE2LAorICAgICAgLTUwMiwgICAgNDk0LCAgICAgNTIsICAgICA4MywgICAtMTA1LCAgICAzMjUsICAgICA2OCwgICAtNTYxLAorICAgICAgLTI3NCwgICAgMzcxLCAgLTE4MzMsICAgIC03OCwgIC0yOTkwLCAgICAzMjAsICAgIDE0MSwgICAtNzQ4LAorICAgICAgMTc2NCwgICAxMTU3LCAgIC01MzgsICAgLTI3NiwgIC0xNTk0LCAgIC0xNTIsICAgIDgzOCwgICAgLTQ1LAorICAgICAgMTEzNywgICAgIDEzLCAgIC04MDMsICAgLTE2MiwgICAtODM4LCAgLTExOTksICAgMjAwMywgICAgNTgwLAorICAgICAgMzY4NywgICAtODQ0LCAgIC01NTIsICAgLTI3MSwgICAtNDYyLCAgLTEwMzQsICAgIC0yOSwgICAgMjczLAorICAgICAgIDg2MiwgICAgMjY5LCAgICAgOTUsICAgIDE4NiwgICAtMjIyLCAgIC0xMjQsICAgICA3OSwgICAgLTM0LAorICAgICAgLTY4NCwgICAgODA4LCAgLTEwNjEsICAgLTkxNiwgICAgNjEwLCAgICA1MzksICAgMTI4OSwgICAgNzgyLAorICAgICAgMTIxNiwgICAzMjEzLCAgICAtMzgsICAgLTU0NiwgIC0xMjA5LCAgIC0zOTgsICAgICA5OCwgICAgLTM5LAorICAgICAgICA1OCwgIC0xMjcxLCAgIC02MTEsICAgIDU3MywgICAgNDk5LCAgLTIxNzAsICAgLTE1NywgICAtOTQzLAorICAgICAgLTU5NSwgICAgNDM2LCAgIDEyMDMsICAgIDQ4NywgIC0xNDE5LCAgIC01NzAsICAgMTQ2OCwgICAgNzExLAorICAgICAgLTU4OSwgICAtMTAxLCAgIDMyOTksICAgIC00NSwgIC0xNDMyLCAgIC00NTMsICAgMTgyMCwgICAgNjc3LAorICAgICAgMTA1MiwgIC0xNzkzLCAgIDEwNzEsICAgLTQwMCwgICAgMjY4LCAgIC00NjQsICAgIDQ0MywgICAgNTA4LAorICAgICAgLTI3MywgICAtNzM2LCAgIC0yMzMsICAgIDI3MCwgIC0xMTg3LCAgLTE5MzEsICAtMTIwOCwgICAtNTE5LAorICAgICAgLTg3OSwgICAgMzI1LCAgIDEwMzIsICAgIDI4MCwgICAgNTY1LCAgICAyOTQsICAgMjU4OCwgICAtMzAzLAorICAgICAgIDY0MCwgIC0xMzk4LCAgIDEwNzAsICAgIDY3NCwgICAgIDU3LCAgIC0xNjUsICAgIC00NiwgICAgNTEyLAorICAgICAgIDc1NywgIC0zNDcxLCAgIC04MTIsICAgLTg1NCwgICAgIDQ1LCAgICAxMDEsICAgMzE5NSwgICAtNzg2LAorICAgICAgIC02MSwgICAgMTIyLCAgLTEyMzQsICAgIC03NCwgICAgMTE5LCAgIC0zODksICAgIDI1NCwgICAgLTg0LAorICAgICAgIDgyOSwgICAxNDY1LCAgIC05MzAsICAgIDE3MSwgICAtMjQ4LCAgICAyMDEsICAgIDkzOSwgICAgICAxLAorICAgICAgICA1MiwgIC0zNTE3LCAgLTE4NTQsICAgIDE0NywgICAtODQzLCAgICAzMTAsICAgIDUwMiwgICAgNzI5LAorICAgICAgIDE5MSwgICAgNTI1LCAgICAzMzMsICAgLTY2OSwgIC0zMzU4LCAgICAyMTUsICAgIDU1MiwgICAgMTU2LAorICAgICAtMTc3MSwgICAgOTgyLCAgIC03NDYsICAgIDUyMywgICAtMTg3LCAgIC02ODQsICAgIDQ1NiwgICAgMTIzLAorICAgICAtMTU0NCwgICAtMTQ1LCAgICAgNTgsICAtMTA4MywgIC0xNjQ2LCAgLTEzMDksICAgIDc3NSwgICAxNDM2LAorICAgICAgMTQwOSwgIC0xMTE0LCAgIC0xNzEsICAgICAyNiwgIC0xNzc1LCAgIDExMDMsICAgLTM5MiwgIC0yMDUzLAorICAgICAtMTIyMSwgICAgMTAwLCAgLTExMjAsICAgICAyNSwgICAtMjk1LCAgICAzMDYsICAgLTEwNSwgICAtNTE0LAorICAgICAtNDM2MiwgICAgMTU2LCAgLTIxNzIsICAgLTE5MSwgICAgLTkwLCAgICAgIDcsICAgIC02MiwgICAgMjQ0LAorICAgICAgLTEwNywgICAgNTIxLCAgICAzMDksICAgICAyMiwgICAtNjYzLCAgICAyMzksICAgLTIxMywgICAtMjI2LAorICAgICAgIDEwMCwgICAyMjI4LCAgIC0zMzAsICAgLTE5NywgIC0xMjQ3LCAgIC04NzYsICAgMTU2MSwgICAgIC0xLAorICAgICAgLTM1NCwgICAgNDM5LCAgIC0xNjMsICAgLTMxOCwgICAgLTYxLCAgLTExODQsICAtMzAyMiwgICAxNDM0LAorICAgICAgICA2NSwgICAgIDg3LCAgICA4MDYsICAtMjA5MywgICAzMDE2LCAgIDEwMjIsICAgLTc3OSwgICAtMzkxLAorICAgICAgIC0xOCwgIC0xMzcxLCAgIC01NDgsICAgIDkxMCwgICAtOTEwLCAgIC00MzgsICAgIDY3MywgICAgIDQ4LAorICAgICAgMTAyOCwgICAgNTQ4LCAgICAxNTMsICAgLTMzNywgICAgNTU0LCAgICAzNTMsICAgMTY4NiwgICAgNDY4LAorICAgICAgLTE5MCwgICAtMTEzLCAgIC01NjAsICAgIDU0MiwgICAgIDk0LCAgIC0xNDAsICAgLTE5NCwgICAgLTU4LAorICAgICAgIDE2NSwgICAtMTU0LCAgIC0zMTEsICAgNDc0NCwgICAtMTQ4LCAgICAgNDksICAgLTI1MywgICAgMTgwLAorICAgICAgIC02NSwgICAtMTI1LCAgIC0xMzksICAgIC00OSwgICAtMTE1LCAgIC0yNzAsICAgIDQzOSwgICAgMTM5LAorICAgICAgIDIxMCwgICAgMjAyLCAgIC0yMDcsICAgIC02NSwgICAtNDc3LCAgICAxNjgsICAtNDcyMCwgICAgLTk2LAorICAgICAtMTA5MSwgIC0yMDcxLCAgIC01NjcsICAtMTMzMCwgICAgMjM3LCAgICA0MTEsICAgLTEyMywgICAxMTk3LAorICAgICAgMjYyNSwgICAxMzQ4LCAgIC0yMzAsICAgIDM2MiwgICAtMTQ3LCAgIC0xMzksICAgLTY5OSwgICAxMjEwLAorICAgICAgLTI5OSwgICAgIDkyLCAgIDI4MzUsICAgIC0zNiwgICAtMjk2LCAgICAyODcsICAgMjQyNiwgIC0xMTcxLAorICAgICAgLTIxOCwgICAgODg0LCAgIC0zMjAsICAgMTEzMCwgIC0xMDg1LCAgIDExNzcsICAgLTk1MywgICAtNzc2LAorICAgICAgIDYwOSwgICAgODI3LCAgICAtOTAsICAgIDEzMSwgIC0yNzU3LCAgICA1NjcsICAgIDg4NSwgIC0yMzU5LAorICAgICAgIDk1NSwgICAtMjAwLCAgLTE4ODMsICAgIDEzMSwgICAgMjgyLCAgICAtODAsICAgIDE0MSwgICAgIC04LAorICAgICAgIC0zMywgICAgMzMzLCAgICA4MDksICAgIDM1NywgICAgLTEzLCAgICA0OTksICAgIDU5NywgICAgOTIzLAorICAgICAtMTcyNSwgIC0xNTMzLCAgICA0NjUsICAgIC05MywgICAyMTg3LCAgIC04NDEsICAgIDc1MSwgICAgIDc0LAorICAgICAtMjE1OCwgICAgIDk5LCAgLTEwNzgsICAgLTQ1OSwgICAgNjQ4LCAgIC0yNTgsICAgIDM0OSwgICAtOTE3LAorICAgICAgMTIwMCwgICAgMzc0LCAgLTE3NDEsICAtMTAxMywgICAgNzI0LCAgICAtNjEsICAgIDE4MiwgICA0MDMyLAorICAgICAgLTU4MSwgICAxMTIzLCAgIC00MDAsICAgLTQ1OSwgICAtNDQzLCAgIC0zMTYsICAgICAgMywgICAtMjcxLAorICAgICAgLTI0OCwgICAgLTE3LCAgICA1OTUsICAgIDIwNiwgIC0xMTg4LCAgIDI4NjksICAgMTMzOCwgICAtMjUzLAorICAgICAgIDMxNiwgICAtNDc0LCAgIDE2ODAsICAgLTg1NiwgIC0xNDg3LCAgICA1NDcsICAgIDY3OSwgICAgNDI1LAorICAgICAgLTI1OCwgICAgIDkyLCAgICAgLTQsICAgIC0yNCwgICAgMTE3LCAgIC0xNTcsICAgIDM4NSwgICAtMjU3LAorICAgICAgLTMzMiwgIC01NTk3LCAgICAtNjgsICAgLTMyOSwgICAgLTY1LCAgIC0xMDgsICAgLTI3NywgICAgMjAyLAorICAgICAgLTQwMCwgICAgMTI0LCAgICAtNTEsICAgICAgNSwgICAgIDcxLCAgICAgOTAsICAgLTkyNywgICAgOTY2LAorICAgICAgIDc4MCwgICAgMzA1LCAgICA3MDMsICAgIDgwMiwgIC0xNjYxLCAgLTE0MTUsICAgIC02NiwgICAgNDM3LAorICAgICAgLTYxMCwgICAgMzE3LCAgICA3OTUsICAgIDU5OSwgICAtMTg5LCAgICAzMjIsICAgLTUxOSwgIC00MDEwLAorICAgICAgIDcyOSwgICAtNjIwLCAgLTIxMjcsICAgIDM1MSwgICAgNTA2LCAgICAtNjgsICAgIDE2MiwgICAtOTgzLAorICAgICAgLTI4OCwgICAzMTY3LCAgIC0xNDAsICAgIDk5MSwgICAtNTk5LCAgICAxMjgsICAgMTg2OCwgICAgIDY0LAorICAgICAgIC02MywgICAgIC0xLCAgIDIwNDcsICAgIDE1NSwgICAtODcxLCAgIC0xMzAsICAgIDIyNiwgICAgNTA4LAorICAgICAgIDQ5OSwgICAgODgyLCAgIDM3NjIsICAgLTM4MywgICAgLTIzLCAgICAgIDAsICAgLTM0NSwgICAtNDg4LAorICAgICAgIDE2NywgICAgNjQ4LCAgICAzOTUsICAgIDExNCwgICAxMTIxLCAgICAzNDMsICAgIDIzMiwgICAtNTM4LAorICAgICAgICAxNSwgICAgMzQyLCAgIC04MjAsICAgICAzOCwgICAgNDM1LCAgIC00NjgsICAgLTI4MiwgICAtNDE1LAorICAgICAtNTAyMSwgICAtMjkzLCAgICAxNDcsICAgIDUzMywgICAtMTI4LCAgICAtNzAsICAgIDUwMywgICAgODQ0LAorICAgICAgIC04NiwgICAxODM2LCAgLTIxMDMsICAtMTE0MywgICAgLTcwLCAgIC01MTAsICAgIDU3NiwgICAtNjg5LAorICAgICAgIDQxMCwgIC0yMTAxLCAgICA0MzMsICAgIDMzOSwgICAtNDE3LCAgICA4MjAsICAgIDE1NywgICAgMTczLAorICAgICAgIDQ1NCwgICAtNTg2LCAgIDEyMTksICAgIC03MywgIC01MTIzLCAgICAzNDQsICAgIDM5NywgICAgIDUzLAorICAgICAgIDEwNSwgICAgNTAxLCAgICAtNTksICAgIDUxNSwgICAgMTk0LCAgICAzNTYsICAgICA3OCwgICAgNzA2LAorICAgICAgIDMwMywgICAgMzMyLCAgIDQ1MzIsICAgIDczOSwgICAgOTYxLCAgIC01MjEsICAgLTM5MiwgICAgIDIwLAorICAgICAgLTY5NywgICAgODIzLCAgICA2MDcsICAgLTI0MywgICAgMzMyLCAgICAzNjUsICAgLTMzMCwgICAgMzA3LAorICAgICAgIDQyOSwgICAtODY1LCAgICAgLTgsICAgIDU0NSwgICAgIC0zLCAgIDYwNDEsICAgLTMxMCwgICAgMjcyLAorICAgICAgIDQ2NCwgICAgIDIyLCAgIC0xNTYsICAgIDE0MiwgICAgLTYzLCAgICAtODcsICAgIDI5NywgICAgLTI0LAorICAgICAgIDU2MiwgICAgIC05LCAgICAxNDcsICAgIDM0MSwgICAgLTIxLCAgICAxMTksICAgMTM4NiwgICAgOTQ3LAorICAgICAtMTczOCwgICAtNTAwLCAgIC02NTUsICAgICA5NSwgICAgIDMyLCAgICAgMzIsICAgIDE4NywgICAgNTE4LAorICAgICAgMTMzMCwgICAgIDk1LCAgIC0zMjQsICAgMzYyMCwgICAgNzM3LCAgICAtNTQsICAgICA1NSwgICAgNjcwLAorICAgICAtMTI1MiwgICAgOTk1LCAgICA0ODQsICAgMTM0NywgICAtNzQ1LCAgICAyNDQsICAgIDI2MiwgICAgLTgzLAorICAgICAgLTEyMiwgICAxMTk0LCAgIC02NTMsICAtMTExMSwgICAtMzI3LCAgIC0zMjUsICAgMzU3OSwgICAtMjE0LAorICAgICAgIC0zNywgICAtNDEyLCAgIC0yNjcsICAgLTM3NywgICAgLTYyLCAgICAxMzEsICAgIDM2MCwgICAgMjAzLAorICAgICAtNTcxMywgICAgLTQyLCAgICAgOTQsICAgIDI3OSwgICAgNDA2LCAgIC0zNTUsICAgICAzNCwgICAtMTQ0LAorICAgICAgIDE1NiwgICAtMjU2LCAgICAtNDgsICAgIC05OCwgIC0xMzkyLCAgIDEyNzMsICAgIDIwMiwgIC0xMjQ5LAorICAgICAtMzQ1NywgICAtNzEwLCAgIDEwMDcsICAgICAzNywgIC0xNzg4LCAgICAgODYsICAgLTU3MCwgICAgNTM1LAorICAgICAgICAxNywgICAtMzY5LCAgIDE2NDAsICAgIDgxNiwgICAtMTE3LCAgICAxMjgsICAgLTk2OSwgIC0xMzgxLAorICAgICAgIDIyNCwgICAxNTE5LCAgIC05OTYsICAgLTgzMywgICAgOTMxLCAgICAxODUsICAgIDgwNCwgICAgNDY1LAorICAgICAgICA4MiwgICAgIDY5LCAgIC0yNDcsICAgMzMxMiwgICAtNDMwLCAgICAtMjMsICAgIDE3MywgICAtMjIzLAorICAgICAgMzA4MCwgICAxODQ4LCAgLTExODcsICAtMTQ5NCwgICAtNDg1LCAgLTExMzEsICAgIDQ5NiwgICAtNTE3LAorICAgICAgLTU5NiwgICAgMzIwLCAgIC04NTMsICAtMTMwMywgICAgMjQwLCAgIC0yOTgsICAgIDE1OSwgICAgNTI3LAorICAgICAgLTI1NywgICAgNDEyLCAgICA4MzksICAtMTAyMCwgICAgNzA2LCAgLTM0OTksICAgLTE3NSwgIC0xMDg5LAorICAgICAgLTcxNywgICAtMzI1LCAgICAyNjEsICAgIDMxMCwgIC0xNzQwLCAgLTEwMzUsICAgLTQwMywgICAtMjI5LAorICAgICAgLTg2MSwgICAtOTcwLCAgICAtNjIsICAgLTE5MiwgICAgNTM1LCAgLTIxNTQsICAgLTM2NCwgIC0xMTMzLAorICAgICAgIDk3OSwgIC0zMjk5LCAgICAzNTMsICAgIDk4MiwgICAtNTE3LCAgIDExNDQsICAgLTU2MywgICAgNjc1LAorICAgICAgIDI4NSwgICAgIDYzLCAgICAgMTcsICAtMTk1NywgICAgIDgyLCAgICAgMjgsICAgLTUxMywgICAgNTAxLAorICAgICAtMTE4MywgICAxNDc2LCAgIC04MTMsICAgLTI1NCwgIC0xNTg0LCAgLTExODEsICAgLTQyNiwgICAgLTU2LAorICAgICAgLTkxNiwgICAgMjAzLCAgLTI2OTMsICAgIDIwOSwgIC0xMDY2LCAgLTExNzQsICAgIDI3OSwgICAgNDM5LAorICAgICAgIDIwMSwgICAxMTc5LCAgICA3OTcsICAgIDQwNywgICAgODUxLCAgICA5MjcsICAgIDMxNiwgICAtNjQwLAorICAgICAgMTM5OCwgICAtMTI4LCAgIDI3NDEsICAgIDU2MywgIC0xNzg5LCAgICA5ODksICAgIDkzMiwgICAgMjQ3LAorICAgICAgICAgNiwgICAtNjE3LCAgICAyNjgsICAgLTY5MSwgICAxMTEyLCAgIC01NjksICAgIDg4MywgICAgMjk4LAorICAgICAgICAzNywgICAtMzYyLCAgIC02NjEsICAgIC0xNywgICAtMTU0LCAgIC01NzQsICAgIDcyMSwgICA0NTc4LAorICAgICAgIDIwNSwgICAgNTA3LCAgICAgNzcsICAgIC05MCwgICAtNDMzLCAgLTE2MTMsICAgIDI3MCwgICAtNTAwLAorICAgICAtMTA2MSwgICAxNjM0LCAgIC0zODgsICAgLTQzMiwgICAtNjQ4LCAgLTE5ODUsICAgIDYyOSwgICAyODg3LAorICAgICAgLTIwMSwgICAgLTMyLCAgICAyMjMsICAgIDYyMSwgICAgMTQzLCAgICA0NDYsICAgMTM4NCwgICAxMTA5LAorICAgICAgIDI5OSwgICAgMzI5LCAgLTEwMDIsICAgLTM1NiwgICAxNTA0LCAgICAtNzcsICAgICA0OSwgICAgOTUyLAorICAgICAgNDE2NiwgICAtNTQ0LCAgICAtODUsICAgLTQxMiwgICAtMjQ5LCAgICA0NzQsICAgICAyNywgICAtMTA3LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IwODA4czFbXSA9IHsKKyAgICAgIDI2MzIsICAgMTUxMSwgICAgOTQ0LCAgIC0xODAsICAtMjM3NywgICAgIDU0LCAgIC00NzAsICAgLTE4NywKKyAgICAgIC03MTAsICAgLTk5OCwgICAtNTE2LCAgIC05MTYsICAgLTQ0MCwgICAtODQyLCAgICAyODUsICAgICAyMiwKKyAgICAgIC0yODIsICAgLTQ1OSwgICAtMjk5LCAgLTI3NjksICAtMjI4NSwgICAtMzgwLCAgLTIxOTQsICAgIDgwMSwKKyAgICAgIC01OTUsICAgLTI1MiwgICAgNTA0LCAgICAtNjksICAgLTc1MiwgICAgOTcyLCAgICA2MzksICAgIDI3NywKKyAgICAgICA1MDIsICAgIDExNywgIC0xMDcyLCAgIC0xNDUsICAgMTQ2MiwgICAtNTI4LCAgIDIxNjUsICAgIDg4MCwKKyAgICAgIC0xODIsICAtMjk1MywgICAgNzUwLCAgLTEwOTAsICAgIDU5NiwgICAgMTA1LCAgICAxODcsICAgIDU1NSwKKyAgICAgIC0xNTMsICAgLTExMywgICAgODMwLCAgICAxNjEsICAgIDMwOCwgICAgLTQ0LCAgIC0yNTAsICAgIC01OCwKKyAgICAgIC01MDcsICAgLTQwNiwgICAtNjI2LCAgIDE0NTMsICAgMTM1NywgICAgMTE2LCAgIC00NTYsICAgMzI0MiwKKyAgICAgIC02MDcsICAgICA5NCwgICAgMzkwLCAgICAzOTMsICAgIDExNCwgICAxMDY5LCAgICAgLTIsICAgICAgMiwKKyAgICAgIDI0OTcsICAgMTQwNSwgICAtNzU1LCAgIDEzNTMsICAgIDE5MiwgICAxMjg4LCAgIC0xODcsICAgIDI2MiwKKyAgICAgIDE3MjIsICAgICA5MSwgICAgODg1LCAgIC02MjIsICAgLTMyMSwgICAgMjQ2LCAgLTE4MzUsICAgICAxNywKKyAgICAgICAyMTMsICAgIC04MCwgICAtNjU4LCAgLTE5NDAsICAgIDI3NSwgICAgODQ1LCAgIC0zNjUsICAgIDI3NiwKKyAgICAgIDIxNDIsICAgLTIxNiwgIC0zNDAyLCAgIC02NDYsICAgIDU0OSwgICAgLTc4LCAgIC0xNzYsICAgIC01MiwKKyAgICAgICA3ODUsICAtMTMzNSwgICAgIDQ0LCAgICAxNjMsICAgLTQwOSwgICAxMjczLCAgICA2NzksICAgLTM3NywKKyAgICAgICA3ODgsICAtMTM1NSwgIC0xNzIxLCAgICAzMzIsICAgIDIyMywgICAxNDA5LCAgIC0xMDQsICAgIDE2NSwKKyAgICAgICAzNTQsICAgIDMyMiwgICAyNDE0LCAgLTE2MTEsICAgIDIxNiwgICAgIC02LCAgIC0yMzIsICAtMTc3MCwKKyAgICAgLTE5MzEsICAgMjQ5NiwgICAtNTMwLCAgICAyMjgsICAgLTkyNCwgICAtMTczLCAgIC0zMjksICAgLTU3NSwKKyAgICAgLTE3MDksICAgLTkwMCwgICAgMTk5LCAgICAyMjMsICAgIDY5MCwgICAtNjM2LCAgICAgNzMsICAgLTM2NywKKyAgICAgICA0NjAsICAgLTgyMywgIC01MTA1LCAgICA0MzUsICAgIDk1NywgICAgMjI0LCAgICAyNDYsICAgIDQwNiwKKyAgICAgIC02NzMsICAgIDc1MiwgICAgNDEyLCAgIC0xNTgsICAgLTI2NywgICAgICA0LCAgICA2OTQsICAgICAxMCwKKyAgICAgICAtNDUsICAgIDIxOSwgICAxMDQwLCAgICA3NzgsICAtMTkxMCwgICAxODg2LCAgIC02OTEsICAgIDY3NCwKKyAgICAgIDEwODUsICAgLTUzNywgICAgMzc2LCAgIDEwNDgsICAgIDg1OCwgICAtMTYxLCAgICA2MTMsICAgIDM3NiwKKyAgICAgICA1MzUsICAtMTM0OSwgIC0xOTEzLCAgIC01MTgsICAgLTg1MCwgICAgNjY1LCAgICA3NzIsICAtMjk4NSwKKyAgICAgICAtNjYsICAgIC00MiwgICAyMTQyLCAgIC04NDgsICAtMTE1MSwgICAgMjM3LCAgIC0yMTEsICAgLTE2MSwKKyAgICAgLTI3NTMsICAgIDYwMywgICAgNTA3LCAgICAgMzksICAgLTU3NSwgICAgLTYxLCAgLTEwNTMsICAgLTI3MywKKyAgICAgICAyOTAsICAgLTI1OCwgICAtMTYyLCAgICAxMzksICAgICA5NSwgICAgLTEyLCAgIC0yMDEsICAgLTIzNiwKKyAgICAgICA3MDksICAgLTMyOCwgICAtMzE0LCAgIC0xMzAsICAtNTMzNywgICAgMTAwLCAgICAtMTgsICAgIC05NywKKyAgICAgIC0yMDYsICAgMTgyNywgICAxNzIyLCAgICAzMDIsICAgIDkyNCwgICAtMjAzLCAgICA3NjEsICAgLTcxNSwKKyAgICAgICAtMjQsICAgIDM3MiwgICAtNjAwLCAgIDIxMTUsICAgMTE5NywgIC0xNDA2LCAgICA2NzYsICAtMjA2OCwKKyAgICAgIC0xNjcsICAgLTIyMSwgICAtOTM2LCAgIDE0MTksICAgIDM1MywgICAtMzE3LCAgICAyNDUsICAtMjg5MCwKKyAgICAgICA2MjMsICAgIDI2NSwgICAtNjIyLCAgICAyMDQsICAgMjU0OSwgICAgNTk2LCAgICAyMzksICAgIC0yNSwKKyAgICAgIC02NzIsICAgIDU4MywgICAgMTE3LCAgICAtMTMsICAtMjI1MSwgIC0xMzI1LCAgIDE5ODQsICAgMTQzMSwKKyAgICAgLTEzMzUsICAtMTI2OCwgICAgNzM1LCAgICAyNDUsICAgIDEwNSwgICAgNTkzLCAgIC0xOTMsICAgLTYxNCwKKyAgICAgICA5MDksICAgLTMzOSwgIC0xMDMzLCAgICAzODMsICAgIDEwMiwgICAgMzYzLCAgICA3MzIsICAgMTQzOSwKKyAgICAgIDEwMjgsICAgMTI3NSwgICAgNDQyLCAgICA5ODcsICAtMzkwMSwgICAtMjU3LCAgICAtMzYsICAgIDIyNCwKKyAgICAgIC0xMTYsICAgLTQwMiwgICAgMjAwLCAgIC01OTYsICAgLTEyNSwgICAgMzcyLCAgIC01NzIsICAgIDM5OCwKKyAgICAgIC01NDMsICAgMTAyNCwgICAxNzQ2LCAgIC03MzYsICAtMTA1NiwgIC0xNzM2LCAgICA5NTMsICAgMTAyNiwKKyAgICAgIC05NjUsICAgIDQ0MiwgIC0xNTY1LCAgIC00NDgsICAgIC05NiwgICAxNDk4LCAgICAgMzAsICAgLTIzMSwKKyAgICAgIC00ODMsICAgICA3MywgIC0zMTg1LCAgIDE3NjUsICAgMTMxMywgICAtMTAwLCAgICA0NzcsICAgLTE5OCwKKyAgICAgICA3ODIsICAgIDMxNiwgICAgMzY0LCAgIC0xMDcsICAgLTQzMSwgIC0xNzk1LCAgIC0yNDQsICAgIDEyMiwKKyAgICAgIC00MjMsICAgLTM4NSwgICAgNDU3LCAgIC04NzIsICAgLTUzNSwgIC0xMDk4LCAgICAgODAsICAgLTExMCwKKyAgICAgIDE0MjAsICAgIDY0NiwgICAgIDMzLCAgLTMyMjYsICAgIDY0OCwgICAgODYxLCAgICAzMjgsICAtMTI2OSwKKyAgICAgIC01NTgsICAgIDQ5NSwgICAgODgxLCAgICAxMTIsICAgIDQ3OSwgICAgMTcwLCAgIC0zMDksICAgMTkwNCwKKyAgICAgLTE0MTIsICAgLTc2OCwgIC0xMjIwLCAgICAtMzQsICAgIDk5NSwgICAtNjQ5LCAgICAxNjIsICAgICAgMSwKKyAgICAgICAxNTMsICAgIDk4NSwgICAgNzYyLCAgIC0yNjMsICAgLTE4OCwgICAgIDc3LCAgICA3NjAsICAtMjM0NiwKKyAgICAgIDM0MzAsICAgLTQ1MCwgICAxNjc3LCAgIDEwOTAsICAgMTc3MSwgICAyMTA5LCAgICAtMTQsICAgLTExOSwKKyAgICAgIC05OTUsICAgIDI2OCwgICAgMTQxLCAgICAgMzMsICAgICAzNSwgICAgIDMxLCAgICA1MzcsICAgICA2NSwKKyAgICAgIC0zNDUsICAgICA2OSwgICAgMTkyLCAgICA3NjMsICAgIC0xOCwgICAxMDc4LCAgIDM4MjksICAgIDI3NCwKKyAgICAgICA0NDIsICAgLTE3MywgICAtNDEyLCAgICA0MzQsICAgLTY5NSwgICAgOTI0LCAgICAgIDIsICAgMTU1MSwKKyAgICAgICA1NjYsICAgIC04NSwgICAgMjE3LCAgICA5NzYsICAgMjE5NiwgICAtNTAzLCAgLTE0MDEsICAgIDc1OSwKKyAgICAgICA5MjIsICAtMzAyNCwgICAtOTYzLCAgICAgLTMsICAgIDYwMCwgICAtNDUyLCAgIC0xOTMsICAgLTc4NywKKyAgICAgICAgIDcsICAgIDE4NiwgICAgODI4LCAgICA1MTUsICAgIDE0OCwgICAtMjI1LCAgLTEyNTAsICAgLTk4NSwKKyAgICAgICA0NDMsICAgLTUxMSwgICAyMDM3LCAgIDE1NjAsICAgMzIzMCwgICAgNjQ3LCAgIDE0MTgsICAgLTE2NSwKKyAgICAgIC0yNjEsICAgLTM2OSwgICAgMjI0LCAgICA0NTAsICAgLTEwMCwgICAtMjcxLCAgIC0xMjIsICAgLTUxMSwKKyAgICAgIC02OTEsICAtMTQ0NCwgICAgOTA2LCAgIC0xNDQsICAgIDI0OCwgICAgNDUyLCAgICA5NTcsICAgIC03MCwKKyAgICAgIC01MTcsICAgIDExNiwgIC0zNTU5LCAgIC04NzcsICAgLTM5OSwgICAgNDE4LCAgLTEzMDAsICAgLTQxNSwKKyAgICAgIC0xNzcsICAgIDc3MCwgIC0yNTY2LCAgIC0zNzEsICAtMTY3MywgIC0xMDQyLCAgIC01MDAsICAgLTI5MCwKKyAgICAgIC03MDgsICAgLTYzMSwgICAgMTkzLCAgIDI0OTQsICAgIDMxOSwgICAgNTQ1LCAgICA3NjcsICAgIDEwMiwKKyAgICAgICAyMzEsICAgIC00MywgICAtMTM5LCAgICAtOTcsICAgLTcwMCwgIC0xNTkyLCAgICAyODIsICAgMTMyNSwKKyAgICAgLTE0MTksICAgLTY0NywgICAgNDQ5LCAgIDE5OTUsICAgLTczNywgICAgNjYxLCAgIDE2MTcsICAgIDcyNSwKKyAgICAgLTE0NjQsICAgIDYxNSwgICAgOTA2LCAgICAyMDIsICAgLTE1NCwgICAtMjI4LCAgLTIxOTQsICAgLTIzMSwKKyAgICAgICAyOTksICAgIDExMCwgICAxMzE4LCAgIDEwNTMsICAgLTMxMiwgICAgODQzLCAgIC05MzcsICAtMTY5NywKKyAgICAgIC01OTIsICAtMTIyNCwgICAtNjMzLCAgICAtNTAsICAgIDc5MiwgICAxNjAwLCAgLTExODcsICAgLTE3MSwKKyAgICAgICAyMTEsICAgLTc0NCwgICAtMzA2LCAgICAxODYsICAgMTkxNCwgIC0zMTE5LCAgIC05MDQsICAgLTE1OSwKKyAgICAgICAxNzgsICAgLTU5NiwgICAtNjU0LCAgICA4MTcsICAgICA5NCwgICAtMjQyLCAgLTIzNzYsICAgLTIxOCwKKyAgICAgIC00MjEsICAgLTM2NSwgICAtNjk5LCAgICAxNzcsICAgLTQyNywgICAgLTMyLCAgICAyNjUsICAgIC0zMywKKyAgICAgICAyNDUsICAgIC0zNCwgICA1MzA5LCAgIC0zMDcsICAgLTI2MiwgICAtMjk5LCAgICAgODYsICAgIDI3OCwKKyAgICAgICAgMzMsICAgLTIwMCwgICAtMTgwLCAgICAtNTYsICAgIDMzNywgICAxMDM0LCAgIC0yMjksICAgNDk1MiwKKyAgICAgICAzMDYsICAgLTYwOSwgICAgMTg5LCAgICAtMjIsICAgIDI4MCwgICAtMTYwLCAgIC01MDcsICAgIDEzNSwKKyAgICAgLTEyNjUsICAgLTI1MiwgICAgNDM0LCAgIC00MjcsICAgIDE1OCwgICAtNTQ2LCAgIC0xMzAsICAtMjUwMCwKKyAgICAgICA1OTcsICAgIDkwOCwgICAgOTE4LCAgICA3MDYsICAgMTIyNywgICAzMzkwLCAgICA5OTUsICAgIDI5OCwKKyAgICAgIC01NTgsICAgMTMwNywgICAgNzY1LCAgIC0xNDQsICAgIC0zNywgICAtMjg2LCAgICAxMjIsICAgIDIxNSwKKyAgICAgLTEyNTEsICAgMTA5MCwgICAgIDg1LCAgIC05MTQsICAgIDUyMiwgICAgMzE2LCAgIDE4MjksICAgLTcwMSwKKyAgICAgIC0zNjUsICAtMzMxMSwgICAgMzEyLCAgICAgMjIsICAgIDY4MCwgIC0xMzUxLCAgICAyMjAsICAgIDI0MywKKyAgICAgICAxNjYsICAgIC0zNiwgICAgNzgwLCAgIDIzOTUsICAgIC02NCwgICAgODM2LCAgIDEwMzcsICAgIDczNSwKKyAgICAgICA5NjYsICAgIDE3MywgICAxMTE0LCAgICAxOTIsICAgIDUxMCwgIC0xMDU0LCAgIDEzNDEsICAgLTYxNiwKKyAgICAgIDE1NTksICAgIDg5NywgICAgMzM4LCAgICAgLTMsICAgLTE5NCwgICAtMjE0LCAgIC01NzMsICAgLTI2NSwKKyAgICAgICAzMjgsICAgLTM2NSwgICAgNDMzLCAgIC01MDUsICAgIC04NiwgICAgIDMzLCAgIC0xNTYsICAgLTEyOSwKKyAgICAgIC0xMzcsICAgIDExOSwgICAgMTQzLCAgIDU3NzMsICAgIC03NiwgICAgIDY4LCAgICA4MjAsICAgMTIxNSwKKyAgICAgIDEzMTUsICAgIDcxMywgICAgIDEyLCAgIDE1OTAsICAgIDEzMSwgICAtMTkzLCAgIC04ODEsICAgLTIyNywKKyAgICAgICA3MzYsICAgIDU4MSwgICAgNzM2LCAgICAtMzcsICAgLTQzNCwgICAtNDQ5LCAgIC0zNDgsICAgNDE4OSwKKyAgICAgIDIxODAsICAtMTM2MCwgIC0xNjYzLCAgICAtNzQsICAgMTIxNSwgICAgMjc4LCAgIDIwOTIsICAgIC02NiwKKyAgICAgICAzMTMsICAgIDM4OCwgIC0xMzczLCAgICAgMjUsICAgIDU5OSwgICAgODg4LCAgICAtODcsICAgIDI5MywKKyAgICAgICAgMzAsICAgIDM2NywgICAxMDEwLCAgIC04ODMsICAgIDgxOCwgICAtOTEwLCAgLTE5MTgsICAgIDg2NCwKKyAgICAgICA0ODIsICAgLTk2OCwgIC0xMjQ5LCAgICAyMjIsICAgMTEwMCwgICAgIDIzLCAgICAtODcsICAgMjQ5MywKKyAgICAgIC0yNDgsICAgLTYyMiwgICAgMjQwLCAgICAxNTEsICAgIDg3MywgIC0yNzM1LCAgIDEzMjUsICAgLTcwMCwKKyAgICAgIC00MTEsICAgIDI4MiwgIC0yMzYxLCAgLTE4NDMsICAgLTYzMSwgICAtMjA4LCAgICAxMDMsICAgLTQxMSwKKyAgICAgICA4MzEsICAgLTQ0NiwgICAtMjkyLCAgICA0NTAsICAgIDE4NCwgICAtMTU4LCAgICA0ODQsICAtMTk2NCwKKyAgICAgIDQ2NjMsICAgIDEyMywgICAgIDE4LCAgICAxNzQsICAgIDYyMSwgICAgMTU4LCAgIC03ODgsICAgIDIzMywKKyAgICAgICAzMDIsICAgIDQ0MSwgICAtMzM5LCAgICAyMDAsICAgIC02MiwgICAtMTk3LCAgICAgLTksICAgLTIzNiwKKyAgICAgICA5ODQsICAgIDU4NCwgICAtNTIxLCAgIC0zNzMsICAgLTIwNSwgICAgOTEwLCAgICAzOTIsICAgIDg1MCwKKyAgICAgLTI5NjgsICAgICA2OCwgICAtNzI3LCAgIDEzMzAsICAgIDU3OCwgICAgIDM2LCAgIC0zODUsICAgIDc1NCwKKyAgICAgIC01MzgsICAgIC0zNiwgICAgMjcxLCAgICA0MTgsICAgLTU0OCwgICAxNzc1LCAgLTEwNDUsICAgLTg3OSwKKyAgICAgLTE0MDcsICAgIDUyNCwgIC0xMDg1LCAgLTE0NzksICAgIDM3MSwgICAgIDE5LCAgICA4NzMsICAgIDE3MSwKKyAgICAgIDI5MzIsICAgLTIxNiwgICAgIDQyLCAgICAgNzEsICAtMTE4NywgICAtNTcwLCAgIC01MjQsICAgIDM0NCwKKyAgICAgIC03NzAsICAtNDA4NiwgICAtNzM1LCAgIC01MTUsICAgMTA1NSwgICAtNTUxLCAgICA5NDUsICAtMTQwOCwKKyAgICAgICA5MTMsICAtMTAwNSwgICAtMjIyLCAgIC00NDMsICAgICA2MCwgICAtMTk0LCAgIC03MzQsICAgMTkwOCwKKyAgICAgIC01MzQsICAtMTM1MSwgICAgIDcyLCAgIC05MzgsICAgIC02NiwgIC0yNzU2LCAgIDEzMTMsICAgLTE2OSwKKyAgICAgLTE1NTAsICAgIDQ1MCwgICAtNjEwLCAgICA4OTMsICAgMTEwMCwgICAtNTgzLCAgICAgODcsICAgLTE0NSwKKyAgICAgIC0yMTAsICAgIDI4MSwgICAxNDAyLCAgICA2NzQsICAgICAgMCwgICAgLTM4LCAgICA4NzQsICAgLTM2MywKKyAgICAgIDI0MzYsICAgMjE1NiwgIC0xNjU5LCAgIC00ODEsICAgLTEzMCwgICAgLTYzLCAgIC02NjksICAgLTMxNiwKKyAgICAgIC03NjEsICAgLTQxMywgICAgMTA4LCAgIDIzNjIsICAgIDM1NCwgICAgIDc2LCAgLTE3MjUsICAgLTkyNCwKKyAgICAgLTE0NDMsICAgMTI1MSwgICAgODcxLCAgLTIwNTgsICAgIDUxOCwgICAgOTU1LCAgIC0yODMsICAgIDY4MCwKKyAgICAgICAtODUsICAgLTU2MCwgICAtNDY0LCAgICAxMjcsICAgLTIxNiwgIC0xMzgyLCAgIDE5MDgsICAgIDIzOCwKKyAgICAgIC0xODIsICAgIDQ1OSwgIC0xMjI3LCAgIDExNDQsICAgMjI2NiwgICAgLTk2LCAgICA1OTUsICAgLTc1MCwKKyAgICAgICA5MTIsICAgLTE5OCwgICAxNzg2LCAgLTE0MjMsICAgLTYxOCwgICAtNDUwLCAgICAxODUsICAtMTIxMiwKKyAgICAgICA3MDYsICAgLTY4OSwgICAtMTU0LCAgIC0zNjUsICAgLTY4MSwgIC0xMzc4LCAgICA5MTQsICAtMTIwMCwKKyAgICAgIC0yNTMsICAgLTUzMiwgICAzMjQ0LCAgICA0NDQsICAgICAgMSwgICAgLTk2LCAgIC00MDQsICAgIC02NCwKKyAgICAgIC00MTIsICAtMTQwMCwgIC0yODMwLCAgIC03ODUsICAgIDk0MCwgICAtMjE3LCAgICAzNTgsICAgIDYxOCwKKyAgICAgICAyMDgsICAtMjk3NCwgICAtMzY1LCAgICAtMzIsICAgIC02MywgICAtMjMzLCAgIC04NjgsICAgLTQxMywKKyAgICAgICAzNTgsICAgLTQ1MSwgICAxMzEwLCAgIC03NTEsICAtMTMyOSwgIC0yNDgwLCAgICAgNjMsICAgIDQ1OCwKKyAgICAgIC0yNzMsICAgMTI3MCwgICAgMzE2LCAgICAgOTMsICAgLTQ1MywgICAtNDYzLCAgLTEyNTgsICAgIC01NywKKyAgICAgLTEwNzMsICAtMjAzNywgICAgIDQ2LCAgIC0xNjAsICAgNDYwOSwgIC0xMTkzLCAgICAxOTIsICAgLTM1NSwKKyAgICAgIC05NjMsICAgIC05MiwgICAgNzUyLCAgICA1OTMsICAgIDEwMiwgICAgLTgwLCAgIC0xMjEsICAgIDE2NiwKKyAgICAgIC02MDYsICAgLTI3NCwgICAgIDI4LCAgICAyNTgsICAgICA0NSwgICAgLTQ1LCAgICA5MjgsICAgLTk0OSwKKyAgICAgIC0xMzQsICAgLTI2OCwgICAgLTc3LCAgICAyNDIsICAgMTYyMywgIC0xMjkwLCAgICA3MzksICAgIDEwOSwKKyAgICAgICAyODUsICAgIDE3NSwgICAgLTkyLCAgLTQwNTMsICAgLTQ4MiwgICAgMzY2LCAgICAyMTcsICAgLTEyNiwKKyAgICAgIC04NDMsICAgIDk1MCwgIC0xMDY4LCAgICA3NzcsICAgMTgxOCwgICAgNTUwLCAgIC04OTEsICAgIC0zNCwKKyAgICAgIC05OTUsICAgMTk3NiwgICAyNjc3LCAgIC03NjQsICAgICA0NSwgICAgLTQwLCAgLTE4MDAsICAgIDU2OSwKKyAgICAgIC0zMjMsICAgLTEwMiwgIC0xMDY0LCAgIDQwMDAsICAgLTEwOSwgICAtNDIzLCAgIC0yODksICAgIDczOCwKKyAgICAgIC04NzIsICAgIDgwOCwgICAtOTc3LCAgICA1MDQsICAgLTkwMSwgICAgIDQxLCAgICAtNDUsICAgLTI4NywKKyAgICAgIC0xNDAsICAgLTQ0NCwgICAgNDc3LCAgIC0yNzEsICAgLTg3NiwgICAgMzAxLCAgLTI0MjEsICAgMTYzMywKKyAgICAgIC05MTgsICAgLTY2MCwgICAtMTQ5LCAgLTI1NDIsICAgLTUwMywgICAtMjY1LCAgIC0xMDcsICAgLTYyMywKKyAgICAgIC00NDcsICAgLTc4MiwgICAtODU4LCAgIC01MzUsICAgLTIyMCwgICAgNDQyLCAgICA2NjEsICAgLTIwOSwKKyAgICAgICA4NzgsICAtMTYwMSwgICAzNjEwLCAgICAxNDksICAgLTMzMSwgICAgMTkwLCAgICAxMDIsICAgIDI3MCwKKyAgICAgIDE0NTEsICAgIDIzNywgICAgIDEzLCAgLTEwMjYsICAgIDE3OCwgICAxMjkwLCAgIC0yODEsICAgLTIxNywKKyAgICAgICAgMTEsICAtMTcyOCwgICAxMDQzLCAgLTI5OTIsICAgLTcxOCwgICAtNzc2LCAgICAzNTcsICAgLTYxNSwKKyAgICAgIC0yMzEsICAgIDgxMywgICAtNDczLCAgIDE2MzQsICAgIDUzOSwgICAtNTEzLCAgICAyNDAsICAgMTE1OCwKKyAgICAgICAxNDQsICAgICA1NywgICAxMjQ5LCAgIDE0NzksICAgLTQ4MSwgICAtNzMzLCAgIDE2NjMsICAgLTc1NywKKyAgICAgICA2NDEsICAgIDY4MCwgICAtNDY4LCAgLTI2OTcsICAgIC0yOSwgICAgLTYyLCAgIDEyNTMsICAgMTE0MiwKKyAgICAgICAyOTIsICAgIDI0NSwgICAgLTk2LCAgICAyOTUsICAgLTY2NCwgICAtMjY0LCAgIC0zMDgsICAgLTY3MCwKKyAgICAgIC03MDUsICAgIDE1NSwgIC00MDI0LCAgICAzMzAsICAgIDE5MSwgICAgLTc3LCAgLTE1MDIsICAgIDMyNiwKKyAgICAgICAgIDksICAgIDI5NSwgICAtNTY3LCAgICAgMzQsICAgLTEwNCwgICAtMTIzLCAgIC0zMjAsICAgLTI1NSwKKyAgICAgIDExMjQsICAgIDMyMCwgICAgIDk4LCAgIDEyOTksICAgLTQzNiwgICAxNDkxLCAgIC0zNDEsICAgIDkwOCwKKyAgICAgICAgMTEsICAgICAgOCwgICAgOTg4LCAgLTE5MjEsICAgICAgNSwgIC0xMzkxLCAgICA4NTksICAtMTI5MSwKKyAgICAgIC01ODEsICAgIDU0NiwgICAgLTk1LCAgICAyNzIsICAgLTQ0MSwgICAgMTg1LCAgIC0yNTYsICAgIDMxMywKKyAgICAgICA0NjYsICAgLTM5MywgICAgLTUwLCAgIDQ0MzAsICAgLTk0MCwgICAgIDg3LCAgIC0yMjQsICAgIDM5MCwKKyAgICAgIC01MzksICAgLTI5MCwgIC0xMDQ2LCAgICA1MzEsICAtMjMyOSwgICAxMjc1LCAgIC01ODYsICAtMTA0NiwKKyAgICAgLTE2ODIsICAgMTE1OSwgICAgOTA4LCAgIDIwMjMsICAgIDk1MSwgICAtMjczLCAgICAtNjgsICAgIDcxMywKKyAgICAgIC01NTYsICAgIDc3MCwgICAgNzgzLCAgICAyMjMsICAgICA2MCwgICAtODgxLCAgICAtOTcsICAgIDc2MCwKKyAgICAgICA1NTYsICAgLTIzNywgICAtMjYzLCAgIC0yNDYsICAgLTI0MCwgICAgMTY1LCAgICA1MjYsICAgIDgzMiwKKyAgICAgLTQ3NjEsICAgIDQzMiwgICAtMzM5LCAgICAxODYsICAgIDQ5MiwgICAgIDgxLCAgIC0xMzYsICAgLTgyNywKKyAgICAgIC0zOTAsICAtMTAyNiwgICAtMzcxLCAgIC0yOTIsICAgIDkzNywgICAtMjQzLCAgIC0xMzYsICAgICAgNiwKKyAgICAgICAgNDksICAgLTIyMywgICAtNjAwLCAgIC0zNTUsICAgNTMwNiwgICAgMTQwLCAgICAgMzQsICAgIC04NCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMDgwOG0wW10gPSB7CisgICAgIC0zNTU1LCAgIC0xMDYsICAgLTEzMSwgICAgLTUzLCAgIC0xNTYsICAgIDE5NiwgICAtMjA2LCAgIC0xMDQsCisgICAgICAgIDE4LCAgLTI5NDgsICAgIDEyMiwgICAgMTQ2LCAgIC01MjAsICAgICAgMiwgICAgMjk0LCAgIC00MTksCisgICAgICAgIC0xLCAgICAtMjUsICAgLTI1NywgICA5MzM0LCAgICAgODcsICAgIC01NSwgICAgLTQyLCAgICAgMzAsCisgICAgICAgIDkyLCAgICAgMzUsICAgIDE5NSwgICAgIDMxLCAgICAgNTksICAgICA4OCwgICAgIDQ3LCAgICAgNDcsCisgICAgICAtMjIwLCAgICA1NjQsICAtMTY4NiwgICAgNDI2LCAgICAxMDYsICAgIDM5NiwgICAgIDk3LCAgIDEzMTUsCisgICAgICAyMzMxLCAgICAxNjcsICAtMTI2MSwgICAxMDAzLCAgICA3MzIsICAgLTMwMCwgICAtMzQyLCAgICA0MTgsCisgICAgICAgIDg3LCAgICAyMzYsICAgLTI0NSwgICAyMjM1LCAgICAgMTEsICAgIDcyNSwgICAgLTI0LCAgIC0xNjksCisgICAgICAtNDgwLCAgIDI4NDUsICAgICA5NiwgICAgLTM0LCAgICAgNjcsICAgIDg1NywgICAgIDI4LCAgICAgNTAsCisgICAgICAgIDkyLCAgIDIxMDAsICAgIC04NCwgICAtNjAwLCAgLTE5OTAsICAtMjIwOCwgICAtMTYzLCAgICAyOTksCisgICAgICAgNDMxLCAgIC04MjUsICAgLTI4MywgICAgMjk5LCAgICAtOTgsICAgIDM5MSwgICAgLTY1LCAgICAtOTIsCisgICAgICAtMjAwLCAgIC02ODksICAgMjIzNiwgICAgLTgyLCAgICAtODEsICAgIC01MiwgICAgMTI3LCAgICAgODYsCisgICAgICAtMTM3LCAgIC0zMTksICAtMjU2MSwgICAgLTkwLCAgICA1NDcsICAgLTE5OCwgICAgIDEwLCAgICAxOTUsCisgICAgICAtMzY2LCAgLTI2ODgsICAgIC03NywgICAtMjM0LCAgIC0xMTIsICAgLTI0NSwgICAgMjcwLCAgICAxOTksCisgICAgICAyNjc0LCAgICAtNTcsICAgLTY3MywgICAgIC05LCAgIDEwMjksICAgIC0zMSwgICAgMzExLCAgICAtNTAsCisgICAgICAtMTYwLCAgIC0xNzUsICAgMjM3MSwgICAyNzExLCAgICA0MDksICAgIC0xOSwgICAgIDIyLCAgIC0yNDQsCisgICAgICAgMzEyLCAgIC0xNTgsICAgIDI3MCwgICAtMTI1LCAgIC0yNDcsICAgIDExOCwgICAgLTkxLCAgIC02MDIsCisgICAgICAgIDg2LCAgICAxNzQsICAgLTIxNiwgICAgIDE4LCAgIDMwNDgsICAtMTk1MywgICAgMTcxLCAgLTE5ODUsCisgICAgICAtMjk3LCAgICAyOTUsICAgIC0zOCwgICAtMTk4LCAgIC0yMjksICAgIDM2MywgICAgLTEzLCAgICAxMjcsCisgICAgICAgIDEzLCAgIC0yMDIsICAgLTExNywgICAgIDY1LCAgICAgNzQsICAgICA2MywgICAgMTI1LCAgICAtNjIsCisgICAgICAgIC0yLCAgIC01NDMsICAgLTY4MCwgIC00MjY5LCAgIC0xMzAsICAgIDMyNSwgICAgLTQ5LCAgIC0yNDUsCisgICAgICAgLTUwLCAgIC01MDksICAgLTE1MSwgICAgLTE5LCAgICAgIDMsICAgIDE1MiwgICAtOTgwLCAgIC0xMjksCisgICAgICAtMjM0LCAgICAzOTksICAgIDM0OSwgICAgMTcxLCAgIC0xOTYsICAgNDk1MiwgICAgIC0yLCAgICAgMzYsCisgICAgICAgMjg4LCAgICA3NzEsICAgMjMxMywgICAgMjMxLCAgICAtMzksICAgIDU3MiwgIC0zMDEyLCAgICAgNzcsCisgICAgICAtNTAxLCAgIC0yMTUsICAgLTIyOCwgICAtNDQ0LCAgICA4MzAsICAgIDIwMCwgICAtMTg4LCAgIC0xNTcsCisgICAgICAzMjQ4LCAgICAyNzksICAtMzMxOSwgICAgICAwLCAgICAgNzYsICAgICAxMCwgICAgMTYwLCAgICAtODAsCisgICAgICAgMTM1LCAgICAxMDIsICAgLTM0OSwgICAgMTc0LCAgICAtMzAsICAgIC04OCwgICAtMTQ1LCAgIC0yMDUsCisgICAgICAgIDEwLCAgIC0xODUsICAgIDE3NywgICAgLTM0LCAgICAgMjUsICAgICAzMSwgICAgMjE4LCAgICAgLTQsCisgICAgICAgMTkxLCAgICAxNzIsICAgIDIyOCwgICAtMTM2LCAgIC0xNzgsICAgIDI2OCwgICAgNjM4LCAgIDM1NTksCisgICAgICAgIDU1LCAgICAxOTgsICAgIDE0NSwgICAgMzQyLCAgICAtMjUsICAtMTk0MCwgICAyODY2LCAgIC0zMzQsCisgICAgICAtOTIxLCAgIDE5NDEsICAgLTQ2NCwgICAgMjczLCAgIC0xODEsICAgLTUwNiwgICAgLTIxLCAgIC00MTAsCisgICAgICAgMTE2LCAgIC0xNzksICAgIC00OSwgICAtMjczLCAgICAtMjIsICAgIC0zNiwgIC0xMjk4LCAgICAyNzQsCisgICAgIC0xODMxLCAgICAzMjEsICAgLTM4MiwgICAgMjM4LCAgLTM0NjQsICAgIC02OCwgICAtMTk0LCAgICAgMzIsCisgICAgICAgLTk1LCAgIC01MDYsICAgICA3MiwgICAgIDY0LCAgIC0zMjksICAgICAxOSwgICAgLTM5LCAgICAzNDcsCisgICAgICAtMzAyLCAgICAyMDQsICAgIDE0NSwgICAgLTcyLCAgICA4NTUsICAgLTExMiwgIC0zNTk2LCAgICA5ODksCisgICAgIC0yODAxLCAgICAzODYsICAtMjYyMywgICAtNDcxLCAgICAxMDEsICAgLTE1NSwgICAgMjU3LCAgICAyOTEsCisgICAgICAgIDMwLCAgIC0xNTMsICAgIDE4NSwgICAgMTcyLCAgICA1MTEsICAgICAyMCwgICAgMTY2LCAgICAyNzQsCisgICAgICAgIDI5LCAgLTMwMjMsICAgIDEyOSwgICAgIDMzLCAgIC0yMTksICAgLTIwNSwgICAgICA2LCAgICAgNDcsCisgICAgICAtNDA3LCAgICAxMzcsICAgIDU2MywgICAtMTA2LCAgLTIwNjUsICAgICA3NiwgICAgMjAxLCAgICAtOTksCisgICAgICAtMTcwLCAgICAtNzcsICAgIDE3MCwgIC00NTM2LCAgIC00NDAsICAgIC05NiwgICAtOTQwLCAgLTEwNjYsCisgICAgICAgIDgxLCAgICAyMDUsICAgIDM1OCwgICAgNDM1LCAgICAtNzgsICAgLTE0OCwgICAtMjAxLCAgICAtODUsCisgICAgICAtMzA3LCAgIC0zMDYsICAgICAxNCwgICAgLTQ3LCAgIC0xMDEsICAgLTE4NywgICAtMTM2LCAgICAzODAsCisgICAgICAgIC00LCAgICAtMzIsICAgIC0zNCwgICAgLTU0LCAgICA1MjgsICAgIC01OCwgICA2Mzg5LCAgICAzMDIsCisgICAgICAgLTc5LCAgICAgNTIsICAgIC0yOCwgICAgLTY1LCAgICAtNzcsICAgIC0xMiwgICA5MDI0LCAgIC0xMDAsCisgICAgICAgMjYyLCAgICAgMjAsICAgIC02NywgICAgLTMxLCAgICAgNTAsICAgIC0zMywgICAgLTMwLCAgIC0xNDAsCisgICAgICAgMzI2LCAgLTExNzAsICAgLTMwNCwgICAtMTM2LCAgIC0yMzMsICAgIDE3MCwgICAgIDYwLCAgICAzMTQsCisgICAgICAtMTY2LCAgIC0yMDgsICAgLTEwNSwgICAtMjQ1LCAgIC0xNjksICAgIC03MiwgICAgMTM3LCAgLTcxNzMsCisgICAgICAgIC0yLCAgICAzNzUsICAgIDE1MiwgICAgMjI2LCAgIC0yMDYsICAgLTM0MSwgICAgMzAzLCAgICAgNDcsCisgICAgICAxMDEwLCAgIC0xODgsICAgIDU3NywgICAtMjkyLCAgLTM1ODEsICAgIC0xMiwgICAtMTk1LCAgICAgMjAsCisgICAgICAyMTY1LCAgIC0yMDYsICAgIC04OCwgICAgLTgzLCAgIC0xMzIsICAgIC00MCwgICAtNDQzLCAgICAyMzYsCisgICAgICAtMzMzLCAgICAxNzksICAgLTIxMSwgICAgLTU2LCAgICAzMTgsICAgLTQwOSwgICAzMTA2LCAgICAgOTUsCisgICAgIDExNjM2LCAgICAzNDAsICAgIDIwNCwgICAtMzIzLCAgICAxNjcsICAgICA3NiwgICAgIDYxLCAgICAgNjUsCisgICAgICAtMTU3LCAgICAgNzEsICAgIC0yMSwgICAgIDM4LCAgICAgNjYsICAgIDM5MSwgICAgLTUyLCAgICAgMjAsCisgICAgICAgLTE3LCAgICAgMTEsICAgIDI1OSwgICAgIDQ1LCAgIC0xOTQsICAgIDQ0MCwgICAzNDMyLCAgICAxMjIsCisgICAgICAgNDY4LCAgIC01OTUsICAtMTg1NiwgICAgIDk0LCAgIC00MjcsICAgLTEzMywgICAgMTQ5LCAgIC0yNzMsCisgICAgICAgIDYxLCAgLTY2MjIsICAgICA0OCwgICAgIDk3LCAgIC0xNjIsICAgICA5MywgICAgNDAyLCAgIC0xMDQsCisgICAgICAtMjA3LCAgICAgNjQsICAgLTI3OCwgICAgIDkyLCAgICAzODcsICAgICAgMywgICAgIDk2LCAgICAgLTIsCisgICAgICAgLTI3LCAgICAtMzAsICAgICA4NCwgICAgIDY0LCAgICAgMzUsICAgIC02NSwgICAgIDk4LCAgICAgODUsCisgICAgICAgLTE2LCAgIC0yNDgsICAgNzkzMCwgICAgIDc0LCAgICAgIDQsICAgLTEwNCwgICAgIDgzLCAgICAtNDgsCisgICAgICAgIDQwLCAgLTIxMDQsICAgIC04NiwgICAgLTg5LCAgICAgOTksICAgLTE0MiwgICAgIDY1LCAgLTI3MTMsCisgICAgICAgIDYzLCAgIC00MzEsICAgIDUyMywgICAgNjg3LCAgICAyMTIsICAtMTUxNSwgICAgICAzLCAgICAgNTksCisgICAgICAgIDU1LCAgICAgLTYsICAgICAyMiwgICAgIC04LCAgIC0xNDgsICAgIDE4MCwgICAgIDc4LCAgIDc4MzMsCisgICAgICAgLTYzLCAgICAtODMsICAgICAxMywgICAtMTg3LCAgIC0xMTYsICAgIDE1NiwgICAgLTI5LCAgIC0xODYsCisgICAgICAtMTYwLCAgICAxNDgsICAgIC04MiwgICAtMzAzLCAgIC0xNjYsICAgIDExMiwgICAtMTAzLCAgICAtMzksCisgICAgICAtMTY1LCAgIDI4MjcsICAgIC01NCwgICAgLTI2LCAgICAgMjQsICAtMzA1NSwgICAgIDc4LCAgICAgMjEsCisgICAgICAgMTI4LCAgICAtODEsICAgIC0yNSwgICAtMTIyLCAgICAgNTEsICAgIC01NCwgICAgLTE5LCAgICAxODgsCisgICAgICAgLTE4LCAgICAgLTEsICAgLTE0MCwgICAgLTE4LCAgLTgwODUsICAgIDEyNCwgICAgLTQ2LCAgICAgNDUsCisgICAgICAtNTc0LCAgICAgMTIsICAgLTE1MCwgICAgMTQ3LCAgICAgNjUsICAgLTIwOSwgICAtMzk2LCAgIC00NDQsCisgICAgIC0zODgyLCAgIC0yOTEsICAgLTIzMSwgICAgMjk2LCAgICAyNDQsICAgICA3NiwgICAgMTgwLCAgICAgMzYsCisgICAgIC0yNTc1LCAgICA2NTksICAgIC02MywgICAzMjc3LCAgICAtODUsICAgICA0OCwgICAtNTE4LCAgIC0zNTMsCisgICAgICAgMTMwLCAgICAgNTAsICAgICAxMywgICAgMzM4LCAgIC0zNDMsICAgLTI3NiwgICAgLTE2LCAgICAzNTMsCisgICAgIC02MDM2LCAgICAtNzcsICAgICAxOCwgICAgMTM5LCAgICAgNDMsICAgIDMzNSwgICAgMjk0LCAgICAgOTksCisgICAgICAgMjE5LCAgICA0NDIsICAgIC0yNSwgICAgLTUzLCAgICAgNDAsICAgIDI3MSwgICAgMTc1LCAgIC0yODIsCisgICAgICAgLTkxLCAgICA0MzAsICAtNDQyOCwgICAgLTE1LCAgLTI4NTcsICAgIC02MiwgICAgLTI3LCAgIC0xNzAsCisgICAgICAgIDMzLCAgIC02ODEsICAgLTExMCwgICAgLTc2LCAgICAxNTMsICAgICA0MiwgICAtMTM0LCAgIC0xNDUsCisgICAgICAgMjIyLCAgIC0xNzcsICAgIC0zOSwgICAgMzE0LCAgIDIyNzAsICAgIDUyNiwgICAgNTAwLCAgIDI0MTcsCisgICAgICAgMzM5LCAgIDE4MDgsICAgIC0xNywgICAgNDY0LCAgIC01MjUsICAgIC05NywgICAgMTI0LCAgICAtMzIsCisgICAgICAgMzcwLCAgICAgNDgsICAtMTY3NSwgICAgLTYyLCAgIC0xNjksICAgMjY0MiwgICAyNTExLCAgICAtNDMsCisgICAgIC0xMDM3LCAgIC0xODQsICAgICA1NCwgICAtNTY5LCAgIC01MDQsICAgLTI0NywgICAgLTQwLCAgICAzMjcsCisgICAgICAgICA3LCAgICAgODIsICAgLTE5NywgICAyNzc0LCAgICAtMzQsICAtMjkzMSwgICAtMjA0LCAgIC0xMTIsCisgICAgICAgMTk0LCAgIC0zNjIsICAgIDE4NywgICAgIDY1LCAgIC0xNjYsICAgIDExNSwgICAtMTI1LCAgICAgMTQsCisgICAgICAgMjEwLCAgICAxNDQsICAgIC03NSwgICAgIDU3LCAgIC0yNTUsICAgLTE1MSwgIC0zNTY2LCAgIC0xNTMsCisgICAgICAgMTgyLCAgICAgODksICAtMjUzMCwgICAgIDk4LCAgIC0yNjUsICAgLTE3MywgICAtMTMzLCAgICAyNjAsCisgICAgICAgLTI1LCAgLTEyOTIsICAgICAzNSwgICAgMTMxLCAgICAtOTgsICAgIC04NSwgICAtMjM3LCAgICAgODIsCisgICAgICAxMzUzLCAgICAgNDcsICAgMzg0MiwgICAgMTQ4LCAgICAxNzEsICAgIDE4MywgICAgMjM0LCAgICAgODksCisgICAgICAgLTkzLCAgICAgNDcsICAgIDEwMiwgICAgIC00LCAgICAgOTAsICAgMjk4MCwgICAgMjg5LCAgIC0yMzEsCisgICAgICAgMzUzLCAgICA0OTcsICAgLTEwOSwgICAgMTkwLCAgLTI4NjksICAgIDY5NywgICAgMTM2LCAgICAgOTAsCisgICAgICAtMjQ0LCAgICAyOTgsICAgLTExOSwgICAtNTE5LCAgICAtNTAsICAgIDIwNywgICAgLTQzLCAgLTEzNzYsCisgICAgICAgMzU2LCAgIDE5MzQsICAgIDcwMSwgIC0yMzIzLCAgICA2NzEsICAgICA3MSwgICAgLTU2LCAgIC0xNjcsCisgICAgIC0zNzkzLCAgLTM3NDksICAgLTEwMywgICAgMTM0LCAgIC0yMjgsICAgIC0xMywgICAgIDI3LCAgICAtNDUsCisgICAgICAtMTA1LCAgICAxNzIsICAgIC03NywgICAgLTIzLCAgICAgNTMsICAgIDExMCwgICAtMTE4LCAgICAtODAsCisgICAgICAtMTY0LCAgIC0xOTIsICAgLTU2MywgICAgMzkzLCAgICAtNTgsICAgLTQyOCwgICAtMzYwLCAgIDM2OTYsCisgICAgICAgMTYyLCAgIC0xNzMsICAgMTY4MywgICAtNDMwLCAgICA0NTIsICAgIC05MiwgICAgMTA3LCAgICAtNDEsCisgICAgICAgIDI4LCAgICAtODUsICAgIDQyMSwgICAgLTY2LCAgICAzNTQsICAgIC04OCwgICAgNzIzLCAgIDI3NTEsCisgICAgIC0yOTU1LCAgIC00ODEsICAgLTEzNCwgICAtMjMxLCAgIC0xNDUsICAgICAgMywgICAgIDY1LCAgICAtODgsCisgICAgICAgMTg5LCAgICAxODcsICAgIDE1MSwgICAgMTc0LCAgICAtMzYsICAgIDI0MCwgICAtMjUzLCAgIC0yMzUsCisgICAgICAtMTk0LCAgLTU0MTAsICAgIC00NywgICAgLTk4LCAgICAzMzgsICAgLTQ4NywgICAgLTgxLCAgICAtMzUsCisgICAgICAgLTgyLCAgIC00NDAsICAgICAzMSwgICAgMTA5LCAgICAyMTcsICAgIDI3NiwgIC0xODA1LCAgICAyNzgsCisgICAgICAgMjczLCAgIC0zNjksICAgIDYyOSwgICAtMjkzLCAgIC01MjUsICAtMzgzMiwgICAgIDczLCAgICAtNTYsCisgICAgICAtMzYzLCAgIDE3MDksICAgIDE3NywgIC0yODEzLCAgICA3OTYsICAgLTE2MiwgICAtMzQxLCAgIDExNzYsCisgICAgICAgLTc1LCAgICA1MzMsICAgIDg1NCwgICAgNzE5LCAgICAyNDIsICAgLTE5NCwgICAgIDkwLCAgIC0xNDcsCisgICAgICAgMjAzLCAgIC0xMzYsICAgLTEzOCwgICAtNzY0LCAgICAgIDYsICAtMjc4NywgICAgLTEzLCAgIDExMDQsCisgICAgICAxNDk3LCAgIDEwOTcsICAgICA5MCwgICAtODY3LCAgIC03MTgsICAgLTMxNywgICAgMTE5LCAgICAxODAsCisgICAgICAgMTYwLCAgICAyNTcsICAgMjUzMiwgICAtNTU3LCAgICAtNjIsICAgICAxNCwgICAgNjY1LCAgIDE1MjAsCisgICAgICAgNDU2LCAgICA4MjYsICAgIDM5NCwgICAtNjA1LCAgICA5MDgsICAgIDIyMiwgICAtMTQwLCAgICAxMjEsCisgICAgICAgMTIxLCAgICAyMzIsICAgIDEyNCwgICAgIDk2LCAgICAtODcsICAgICA0OCwgICAgLTUxLCAgICAgNDEsCisgICAgIC03ODIxLCAgICAtMzcsICAgIDEzMCwgICAgLTExLCAgICAtMzMsICAgLTEzNywgICAgIDE2LCAgICAgNDIsCisgICAgICAxNTA5LCAgICAgLTgsICAgIDExOSwgICAgLTgzLCAgICAtMTgsICAgICA2NCwgICAgIDQxLCAgIC0xNzgsCisgICAgICAgLTI4LCAgICAxODIsICAgIDUzMiwgICAgNjc4LCAgICAtNzUsICAgIDI3NywgICAtMjMwLCAgICAtNzAsCisgICAgICAgLTcxLCAgICAgLTgsICAgLTE1MCwgICAgMzIxLCAgLTYyOTgsICAgIC0yMCwgICAtMTMxLCAgICAtNjUsCisgICAgICAgMTM5LCAgIC0yMTUsICAgLTE1NSwgICAgLTI3LCAgIC0xMTAsICAgLTI1NywgICAgIDMyLCAgICAyMDEsCisgICAgICAgMjE1LCAgICAxODQsICAgODkzMiwgICAtMTA2LCAgICAtNTAsICAgICA2NiwgICAgIDE1LCAgICAtNDQsCisgICAgICAgMjAzLCAgICAtMzgsICAgICAxOSwgICAgLTc4LCAgICAgNjUsICAgIDEzNSwgICAtMTIzLCAgICAxNjYsCisgICAgICAgMTE3LCAgICAgNzYsICAgICAgNCwgICAgIDM0LCAgICAtOTAsICAgNTk4NCwgICAgIDU5LCAgICAtNzIsCisgICAgICAgMzU2LCAgICAtNjQsICAgICAgNiwgICAgLTYyLCAgICAgNDMsICAgIC04NiwgICAtMTc1LCAgIC0xMDYsCisgICAgICAgIDEwLCAgICAgMjUsICAgMzgxMiwgICAtMTM1LCAgLTMzMTMsICAgIDE0MiwgICAgMzQ4LCAgIC0xMDEsCisgICAgICAgLTM1LCAgICAzNzgsICAgLTI1MCwgICAtMTA2LCAgIC0yOTksICAgIDIzNywgICAgIDQwLCAgICAtMzIsCisgICAgICAgMjM2LCAgIC01MjEsICAgICA2MywgICAtMTQzLCAgICA1MzgsICAgLTI1NiwgICAgIDQzLCAgICAtNDUsCisgICAgICAxNjQyLCAgICA3MjYsICAtMzIyNSwgICAgMTA5LCAgIC05OTcsICAgICAgMywgICAtMjU2LCAgICAtMjcsCisgICAgICAtMTgyLCAgICAtNzgsICAtNDA5MiwgICAgIC05LCAgICAyMzEsICAgICAzNCwgICAgICA5LCAgICAgLTYsCisgICAgICAgMTU1LCAgIDI4NDIsICAgICA1MywgICAtMTMwLCAgIC0zOTAsICAgLTE0NiwgICAgMTY4LCAgICAtNzQsCisgICAgIC0yMDIzLCAgIC05NTUsICAgIDU3NiwgICAtNjI5LCAgICAtNzYsICAgICA3MCwgICAgMTQwLCAgIC0yODcsCisgICAgICAtNDAxLCAgICA5NjYsICAgIDM1OSwgICAxMTg1LCAgIC0yMjYsICAgIDcxMywgICAgNzUzLCAgIC03MzksCisgICAgIC00MjM4LCAgIDMzNjQsICAgICA3NSwgICAtMjEzLCAgICAgMjcsICAgLTE3MiwgICAgLTM0LCAgICAxNzEsCisgICAgICAtMTE4LCAgICAtNDYsICAgLTE2NCwgICAgLTEzLCAgICAtNTQsICAgLTIwMywgICAtMTU0LCAgICAtMTIsCisgICAgICAgIDY1LCAgLTM3NzcsICAtMzQ1MiwgICAgMjk3LCAgIC0xMDQsICAgIC05MywgICAgLTgxLCAgICAgNjksCisgICAgICAtMTc5LCAgIC0zMjEsICAgICA1MSwgICAgIDQ3LCAgICAyNDIsICAgIC0xNSwgICAtMTQ0LCAgICAtNDMsCisgICAgICAyODI3LCAgICAgNjcsICAgLTMwNSwgICAgIDU0LCAgLTMwNDQsICAgICA1NywgICAgLTE1LCAgIC00MjcsCisgICAgICAgMzExLCAgIC0yMDUsICAgIDIyNiwgICAtNDkwLCAgICAgMzcsICAgIDM2MywgICAgLTg4LCAgIC00MDgsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjA4MDhtMVtdID0geworICAgICAgMzMyOSwgICAgIDU5LCAgICAxOTUsICAgIC05MSwgICAgLTcwLCAgIDMyNjIsICAgLTEzMiwgICAgMzYwLAorICAgICAgIDE1NywgICAtNDEwLCAgICAxODQsICAgIC05OSwgICAtMTM4LCAgICAzMzcsICAgIDI4OSwgICAgMzE3LAorICAgICAgIDE1NiwgICAtNTg5LCAgIC0xMjcsICAgLTIwNCwgICAgIDM3LCAgIC0xNzUsICAtNTY2MSwgICAgLTUyLAorICAgICAgIDk0MiwgICAgMTU2LCAgICAgLTEsICAgLTE5NywgICAgMzUzLCAgICAgOTAsICAgICA1NywgICAtMjg3LAorICAgICAgLTIxOCwgICAgNDM4LCAgICAgLTQsICAgLTI2MiwgICAgICA5LCAgICAzMjIsICAgLTE2NywgICAyOTA0LAorICAgICAgIC0xMiwgIC0yNjQ3LCAgIC0yNDgsICAgLTIwMywgICAtMjY3LCAgIC0xMTYsICAgLTEzNSwgICAgMzMzLAorICAgICAgLTIyMCwgICAtMjAwLCAgICAgNDAsICAgIDIyOCwgICAyNjc3LCAgIC00NjIsICAgLTE4MywgICAtMTI5LAorICAgICAgMjg5OCwgICAtNzI4LCAgICA3OTMsICAgIDQyMiwgICAgNTQxLCAgIC0zNTAsICAgICAyOCwgICAgMjIyLAorICAgICAgMjc5MCwgICAtMjMxLCAgIC0xOTUsICAgLTE5MSwgICAzMDAyLCAgICAxODIsICAgLTYxMCwgICAgMTQ1LAorICAgICAgLTIyNiwgICAtMTAyLCAgICAyODUsICAgIDM0NCwgICAtMzU3LCAgICAyMTcsICAgLTE0NiwgICAgLTk4LAorICAgICAgICAxOCwgICAtMjU1LCAgICAgOTYsICAgLTE1MSwgICAgMjY2LCAgICAyMDgsICAgLTQ1OSwgICAtMTMyLAorICAgICAgLTM0NSwgICA0MDU5LCAgIC0zNzEsICAgICA3OSwgICAgIDQ0LCAgICAtNjMsICAgLTIzMywgICAgMzM0LAorICAgICAgICA0NCwgICAzODg0LCAgICAgNDksICAtMzMwMywgICAgIDg4LCAgICAtMjMsICAgLTI4NywgICAtNDYxLAorICAgICAgICA1NywgICAgIDk0LCAgICAtNTMsICAgLTEyOSwgICAgMTA0LCAgICAxNjcsICAgIC0yNSwgICAgLTc5LAorICAgICAgLTEyNSwgICAtNjMwLCAgLTIzNTIsICAgIDE1MCwgICAtNDE5LCAgICAgNDAsICAgIC02MywgICAgNjAzLAorICAgICAgICA2NywgICAgMjA5LCAgICAzMjEsICAtMTc2NSwgICAtMjAwLCAgICAgNjgsICAgIDQ3MywgICAgNjIyLAorICAgICAgICAgNSwgIC0yODgzLCAgICAxMTIsICAgIDE4OCwgICAtMTg5LCAgLTI3NjUsICAgIDE2OSwgICAgMzk3LAorICAgICAgLTMzMCwgICAtNjQyLCAgIC03OTgsICAgIDEyOSwgICAtMTEwLCAgIC0xNjQsICAgIC0yMCwgICAgMTc2LAorICAgICAgLTIxMywgIC01NDE1LCAgICAgMzksICAgICAzMSwgICAgIDEzLCAgICAyNzAsICAgLTQ3NywgICAgMTY2LAorICAgICAgIDE2NywgICAgICA0LCAgICAyMTYsICAgIC0xMiwgICAtNTI4LCAgICAtNzUsICAgLTI5MSwgICAgMzk2LAorICAgICAgLTQ5OSwgIC0yMDExLCAgIC0xNzIsICAgLTI2NSwgICAgIDk2LCAgICAgODMsICAgLTI3OSwgICAgMTE0LAorICAgICAgLTE2NiwgICAgODMzLCAgICAgMzAsICAgMjQ5MywgICAgIDk0LCAgICAxMzAsICAgLTE4MywgICAtNjU5LAorICAgICAgICAgMSwgICAtMjI3LCAgICAgNzUsICAgIDM0OSwgIC0yNzU3LCAgICAgODIsICAgLTExNiwgICAgICA5LAorICAgICAgIDk1MiwgICAtMTEyLCAgLTI0NDQsICAgLTMzMywgICAtMjA2LCAgIC00MDYsICAgIDIwMSwgICAgIDE1LAorICAgICAgLTc2OCwgICAgIDg4LCAgIDEzOTAsICAgIC0zMywgICAtNTU4LCAgICAgOTcsICAgLTIwMSwgICAgIDI5LAorICAgICAgMzQ3MCwgICAgIDUwLCAgICAtNDAsICAgLTI3MSwgICAtMTcxLCAgICAtMjYsICAgICA0NywgICAgNDg1LAorICAgICAgLTI1MCwgICAzMzE4LCAgICAxMTIsICAgIDYzOSwgIC0yOTExLCAgICAxMjMsICAgLTI2NCwgICAgICAzLAorICAgICAgICAgOCwgICAgMzc5LCAgICAgNzMsICAgICA1NCwgICAgIDg4LCAgICAyMjcsICAgICA3MywgICAgIDU4LAorICAgICAgLTU3MiwgICAgNzgyLCAgIC0xODMsICAgIDMwNSwgICAgIDQ5LCAgICAtMjMsICAtMjk2OCwgICAgLTQxLAorICAgICAgIDI5MSwgICAgLTI1LCAgICAxNTcsICAgIDI5NSwgIC0yMTE4LCAgICAxMjUsICAgICAgNSwgICAtMTkzLAorICAgICAgLTE1OSwgICAtNTQzLCAgICAtNzUsICAgMTE4MSwgICAtMTkxLCAgIC01NDcsICAgIC05MywgICAgMTE3LAorICAgICAtMTgzMSwgICAgMjY1LCAgIC02MDcsICAgIC0zMCwgICAgMTk0LCAgLTM5MjksICAgIC03MCwgICAgMTU5LAorICAgICAgICA3OSwgIC0xNTE5LCAgICAgMzgsICAgIDIwMSwgICAgIDE0LCAgICAtMjQsICAgIC03NiwgICAtMzY2LAorICAgICAgICAxNCwgIC0yNzQ4LCAgICAgIDAsICAgLTM3MiwgICAgNDA1LCAgICAgMzksICAgLTE3MCwgICAgMzIwLAorICAgICAgLTI1NywgICAyMTUzLCAgICAtMTIsICAgIDE1OCwgICAgMzIyLCAgLTQwMTMsICAgICAyMiwgICAtMTAxLAorICAgICAgIDIxNywgICAgNjM3LCAgICAyNzMsICAgLTQzMCwgICAgMjI4LCAgIC00MjgsICAgIDEwMiwgICAtMzU2LAorICAgICAgLTI2NiwgICAgIDgyLCAgICAtMzEsICAgICAxNCwgICAtMjIzLCAgLTI1OTUsICAgLTM2MCwgICAyMDk0LAorICAgICAgLTM3OSwgICAgNjI0LCAgIC0xOTIsICAgIDI0NSwgICAgMjk0LCAgIDE0ODQsICAgLTExNywgICAgMTU2LAorICAgICAgIC01MywgICAzNjY4LCAgLTM1NzMsICAgLTExOCwgICAtMjEzLCAgICAyNTcsICAgLTIxMSwgICAgIDY2LAorICAgICAgIC02MiwgICAtMTczLCAgIC0xNjYsICAgLTEyMywgICAgMTYzLCAgICAtODEsICAgIC0zOSwgICAgLTc0LAorICAgICAgIC0yMSwgICAgMTI2LCAgICA3MjIsICAgLTEzNiwgICAyMDUwLCAgIC0yMDYsICAgICA4NiwgICAgMjc1LAorICAgICAgICA3NiwgICAtMjQ5LCAgICAgNTUsICAtMjUwOCwgICAgIDk1LCAgICAtNjAsICAgIC0zNCwgICAtMzYwLAorICAgICAgICAtOSwgICAgMTg3LCAgICAgMzQsICAgIC04NywgICAgLTMwLCAgICAxMzcsICAgICA0OCwgICA0NzYxLAorICAgICAgIDEwOSwgICAgNTExLCAgIC00OTYsICAgIDEwNCwgICAgMzk5LCAgIC0zNjEsICAgIDE2MiwgICAgIDc4LAorICAgICAgIC0yOSwgICAgMTU5LCAgIC0xMTIsICAgIDE4MiwgICAgMjQ2LCAgICAgNTIsICAgIDI1NSwgICAgMzM4LAorICAgICAgIC0zNSwgICAgIC0xLCAgICAtNjgsICAgICAgNSwgICAgMTgyLCAgIDc2NzUsICAgLTExOSwgICAgLTE0LAorICAgICAtMTkwMSwgICAtMTExLCAgIC0xMDYsICAgICAyMiwgICAgLTE2LCAgICAgODEsICAgIDE1OSwgIC0yNDIzLAorICAgICAgIC03MSwgICAgLTI0LCAgIC0xNTMsICAgLTUyMCwgICAgMTI2LCAgICAzNzAsICAgLTE4NiwgICAgMjMwLAorICAgICAgIC01MSwgICAtNDAxLCAgICAyMDYsICAgIC0zMiwgICAgIDUyLCAgICAtNzEsICAgIC03OSwgICAgNTAzLAorICAgICAgLTIzOSwgICAtMjMxLCAgICAgNTUsICAgLTEzMywgICA1MjI2LCAgICAtNDUsICAgLTE2NSwgICAgIDU3LAorICAgICAgMjMxNCwgICAtMjA5LCAgICAzMDIsICAgICA3OCwgICAgMTU0LCAgLTMwOTIsICAgLTYwNSwgICAtNDk4LAorICAgICAgIDQxMCwgICAgMTU5LCAgICAzMzYsICAgLTE0NywgICAtMTIwLCAgICAxNDMsICAgICAzNiwgICAgNTg3LAorICAgICAgLTE4MiwgICAtMTgyLCAgIDE0NTcsICAgMTAwOCwgICAyNTI0LCAgIC00NDYsICAgMjMzMywgICAtNDk3LAorICAgICAgLTc2MSwgICAtMTYyLCAgICAxMjUsICAgIDQyMCwgICAgMjI1LCAgIC0xMTcsICAgLTMyNCwgICAgNDM3LAorICAgICAgIC01MCwgICAgMTkwLCAgICAxMjksICAgIDI1OSwgICAgIDMzLCAgICAgLTIsICAgICAtOSwgICAgIDMyLAorICAgICAgIC0yNCwgICAgIDkxLCAgICAgOTcsICAgIDIwMSwgICAgIDE5LCAgICAxNjksICAgMzUzNSwgICAgNDg1LAorICAgICAgLTE0NCwgICAgMzMwLCAgIC0xOTMsICAtMjcxNSwgICAgNjAzLCAgICAzMDMsICAgMTEyNCwgICAgMTA3LAorICAgICAtMTM4NiwgIC0xNDM3LCAgIC0yMDMsICAgIDE4MCwgICAgLTgxLCAgICAzMDMsICAgIDIwOSwgICAgLTIxLAorICAgICAgIC02NSwgICAgIDI2LCAgICAgOTEsICAgICA5OCwgIC0xMzQ5LCAgICAxOTYsICAgMjEwMywgICAgOTE3LAorICAgICAgLTczMiwgICAgODM0LCAgIDE0NTYsICAgIC05MiwgICAtNDU1LCAgIC0xMzAsICAgLTczMiwgICAtMjg4LAorICAgICAgICAzOSwgICAgLTg1LCAgIC01NTcsICAgIC0zOSwgICAzMjEzLCAgICAyOTcsICAgIDM5MiwgICAtMzc4LAorICAgICAgLTUyMCwgICAgNzk1LCAgLTI0MDcsICAgICAgNiwgICAgICA3LCAgICA0MDYsICAgIDIwMywgICAgLTczLAorICAgICAgLTI0NywgICAgMzE3LCAgLTMzMzYsICAgMzE2NiwgICAgMjA2LCAgICAtMzYsICAgIDE1OSwgICAtMjc5LAorICAgICAgIDQ0MiwgICAgIDU0LCAgIC0zMjQsICAgIC0xOCwgICAgNTQ0LCAgIC0yNTAsICAgIDE0MiwgICAtNDQwLAorICAgICAgIDEwMCwgICAtMTQ1LCAgLTM3NzIsICAgLTE5OSwgICAgMTM5LCAgIC0xNTYsICAgIC0xMSwgICAgIDM0LAorICAgICAgLTE3OCwgICAtMjMzLCAgIC0zNzAsICAgIDYwMSwgICAgLTU4LCAgIDE2NzksICAgLTE3MCwgICAgIDc2LAorICAgICAgIDY4NCwgICAgLTM1LCAgICAtNzMsICAgIC01MiwgICAgLTMzLCAgICAgLTMsICAgIC04OSwgICAgIC01LAorICAgICAgIC04MiwgICAgIDczLCAgICAtMTEsICAgICA1MSwgICAgLTQ4LCAgICAtMTIsICAgLTM3NiwgICA0MzQ4LAorICAgICAgLTIwMywgICAtNDMyLCAgICAxODksICAgIC0zNSwgICAgMTQ0LCAgICAgMzEsICAgIDE4MSwgICAtMTA2LAorICAgICAtNTExMiwgICAgNTUyLCAgICA0ODAsICAgICAgMCwgICAgIDYzLCAgICAgMzEsICAgICAzMywgICAgNTA0LAorICAgICAgMTA1NSwgIC0zMDA3LCAgIC0yMTQsICAgIDE1NCwgICAtMTAwLCAgICAyNDYsICAgIDI2OSwgICAtNDIzLAorICAgICAgIDU3OSwgICAgIDYzLCAgIDE2NjgsICAgLTI5NiwgICAgMzkwLCAgICAxMDksICAgICAyMSwgICAgIC02LAorICAgICAgICA3MSwgICAzMzIxLCAgICAyNDYsICAgIDE5NywgICAgMzU1LCAgIC0xOTgsICAgIDQ3MiwgICAgMTM1LAorICAgICAgIDQzNywgIC0xNzM0LCAgIDEyOTksICAgIDIyNywgICAtNjE4LCAgICAtNDgsICAgLTE5OSwgICAgMjE3LAorICAgICAgLTIzMCwgICAgIDcwLCAgICAgOTksICAgMjYzMiwgICAtMjAzLCAgIDMxMDUsICAgIC04NywgICAgMTQ5LAorICAgICAgIDMwMywgICAgMTI0LCAgICAzNjIsICAgLTMyMiwgICAgLTQ0LCAgICAgMzgsICAgIDEwNCwgICAgLTI4LAorICAgICAgICA0OCwgICAtMTc1LCAgIC00NjgsICAgLTQxMCwgIC00NDUxLCAgIC0xNTIsICAgMjE1NywgICAgIDI2LAorICAgICAgLTI4MSwgICAtNTgxLCAgICAgMzYsICAgLTIwNSwgICAgMTAxLCAgICAyMzAsICAgIDE5MiwgICAtMTI5LAorICAgICAgIDMxOSwgICAgIDIwLCAgICAgNjUsICAgNDg3OSwgICAgMTIzLCAgIC0yMzYsICAgLTE3OCwgICAtMTI4LAorICAgICAgLTM4NywgICAtMTI0LCAgICA1MjgsICAgIDE0MiwgICAtNzc1LCAgIC0zMDEsICAgIC04OCwgICAtMzgwLAorICAgICAgIDEyMCwgICAgLTQyLCAgICAtMTcsICAgICA2NCwgIC0xMDc0LCAgLTMzNTAsICAgMTMzNSwgIC0xMDc4LAorICAgICAgIC0xNCwgICAtNDYyLCAgIC0xMTMsICAgIDI1MywgICAgNDUwLCAgICAgMzYsICAgICAtOCwgICAtMzQ2LAorICAgICAgIC01NCwgICAgIC03LCAgICAgNTIsICAgLTEwMCwgICAgIDc0LCAgIDgyNjYsICAgLTE5MywgICAgLTM2LAorICAgICAgIC01MSwgICAgIDEyLCAgICAgNTksICAgIC02OCwgICAgMTkwLCAgICAtMzYsICAgICA4OSwgICAgIDM4LAorICAgICAgIC01OSwgICAgIDEzLCAgICAyNjksICAgIDEwOSwgICAgLTE1LCAgIC0xNDEsICAgIC02NCwgICAgLTYwLAorICAgICAgIDIzOCwgICAgICA2LCAgLTQzMzgsICAgIDM4MSwgICAxMjUyLCAgICAzNTQsICAgIC00MSwgICAgIDQxLAorICAgICAgIDE5MSwgICAtMjM2LCAgICAxMjIsICAtMjcxMiwgICAgMzUyLCAgIC0xMTcsICAgLTEyMSwgICAtMjg0LAorICAgICAgMTUxNiwgICAgNDczLCAgIC0zMzIsICAgLTI3NywgIC0xNzkyLCAgIC0zMzUsICAgICA4NCwgICAgIDY0LAorICAgICAgOTU5NSwgICAtMjQ2LCAgIC0yNzgsICAgIDQ0NiwgICAgLTk1LCAgICAtMzIsICAgICA2MCwgICAtMTQ2LAorICAgICAgIDEwNCwgICAgLTg0LCAgICAgLTMsICAgIDEwNywgICAtMTE2LCAgIC0zNzcsICAgIDEwMSwgICAtMTQ5LAorICAgICAgIC00NSwgICAgMzY0LCAgICAxMDQsICAgLTE5MywgICAtMjU0LCAgIDI5MjksICAgLTE2NCwgICAgLTkzLAorICAgICAgIDMyNCwgICAgNzQ5LCAgIC05MjgsICAgIDQzNSwgICAyMzU3LCAgICAzNTAsICAgIC00MCwgICAtMTUzLAorICAgICAgIC00OCwgICAtNjI2LCAgICAzOTAsICAgIC00OCwgIC00MjQ4LCAgIC00NTgsICAgLTkzMCwgICAtMjE4LAorICAgICAgLTQ4NiwgICAxNzY5LCAgICAzMzUsICAgIDE1MiwgICAgMTY1LCAgICAxMTEsICAgIDExOCwgICAtNDA3LAorICAgICAgIC04NywgICAtMzczLCAgIC0zMzMsICAgLTEzNCwgICAgIDg2LCAgICAtMzIsICAgLTE0NCwgICAgLTE4LAorICAgICAgIC0xNiwgIC03NTQ5LCAgIC0xNDYsICAgICA0OSwgICAtMTg0LCAgICAxMTYsICAgIC0yOCwgICAgLTUxLAorICAgICAgIDE5MCwgICAgMTE1LCAgICAgODAsICAgICA2OCwgICAgMTI5LCAgICAyMDYsICAgIDI5NCwgICAgMzMxLAorICAgICAgIDE3OSwgICAtMjcwLCAgICAxNzQsICAgMjQ0NCwgICAgIDU1LCAgLTMyNzEsICAgICA3MCwgICAtMTI0LAorICAgICAgIDIyOCwgICAgMzMwLCAgICAtMjEsICAgLTQxOSwgICAgIDYyLCAgIC0xNDAsICAtMjM4OCwgICAgICA3LAorICAgICAtMjY4MywgICAtMTI5LCAgLTEwNTAsICAgLTU0OCwgICAgODExLCAgICAxODksICAgIDM1OSwgICAtMzg1LAorICAgICAgIC04MiwgICA5MDMxLCAgICAgOTUsICAgICA3NywgICAgLTY5LCAgICAxNjQsICAgIDI2MSwgICAgIDYxLAorICAgICAgIC03MywgICAgMjMwLCAgIC0xNjMsICAgIDE0MSwgICAgLTM4LCAgICAtNDMsICAgLTE1MCwgICAgMTY0LAorICAgICAgICAyOCwgICAgMTY0LCAgICAgNTksICAgIC01OCwgICAtMzEyLCAgIC0xMzQsICAgIDEwMiwgICAgLTY3LAorICAgICAgIDE2NiwgICAtMTYzLCAgICAgNjMsICAtNjc5NSwgICAtMTAzLCAgIC0xNDcsICAgICA4MSwgICAgMjczLAorICAgICAgIDEzMywgICAgMTIyLCAgIC0xNjIsICAgLTIwNywgICAgMTI3LCAgICAtNjAsICAgNDYyOCwgICAgIC0xLAorICAgICAgMTMxNSwgICAgNTE4LCAgIC0xNjMsICAgLTI0NiwgICAgIDU0LCAgICAyMzksICAgIDE1NCwgICAtMTU0LAorICAgICAgIDI2NSwgICAyMDAwLCAgICAgMjUsICAgIDIyNywgICAgIDQyLCAgICAxNzksICAgICA4OCwgIC0zNDQ2LAorICAgICAgLTIxNCwgICAgMTgyLCAgICA0MzgsICAgICA5MCwgICAgMTk2LCAgICAtNjksICAgIDEzNCwgICAgLTU2LAorICAgICAgLTQ1MSwgICAgNzE2LCAgLTExMjAsICAgLTI4NywgICAgMTE4LCAgICAyMzAsICAgIC0zNywgICAgMTQ1LAorICAgICAgIDI4NCwgICAtMjUwLCAgICAxMzksICAgLTk0NywgICAgMjAzLCAgLTMxNzYsICAgIC01NywgICAgMTUxLAorICAgICAgMzIwMSwgICAgODE4LCAgICAtODcsICAgIDM0NywgICAtNDg2LCAgIC0yMDEsICAgMTE3NiwgICAtMzI1LAorICAgICAgLTk2NiwgICAtMjYzLCAgIC0xODQsICAgIDIzOCwgICAtMTU2LCAgIC0zOTYsICAgIDE1MiwgICAgOTU5LAorICAgICAgIC01OSwgICAgLTMzLCAgIC0xNTksICAgICAtMywgICA5Mzk0LCAgIC0xMTksICAgIC04MSwgICAgLTUwLAorICAgICAgICA2NywgICAgICA5LCAgICAgMjcsICAgIC02MiwgICAtMTIxLCAgIC0yMTAsICAgICA0OCwgICAtMjExLAorICAgICAgICAgNSwgICAgMzk2LCAgICA2MzMsICAgICAzNCwgICAgLTE2LCAgICAgNjcsICAgLTI0NywgICAgLTc3LAorICAgICAgIDEyOCwgICAgNDQxLCAgIDM4OTYsICAgIDI1MSwgICAgOTcwLCAgICAxMTksICAgLTM4NywgICAgLTM1LAorICAgICAgIDEyNCwgICAgLTY0LCAgIC02NjQsICAtNjU1MCwgICAgMTAxLCAgICAtNTIsICAgICAxOSwgICAgIDQ0LAorICAgICAgLTEzMiwgICAgIDc5LCAgICA3MzEsICAgLTE1NSwgICAtMjYyLCAgIC0xNDAsICAgIC0zMSwgICAtMTkxLAorICAgICAgLTExMCwgICAgMjc2LCAgIC0xNjIsICAgIC00OSwgICAgIDgxLCAgIC0xMTcsICAgICAxNSwgICAtNTcwLAorICAgICAgIDQyMCwgIC0xMjMyLCAgIC0xMjUsICAgMzczNywgICAgLTk1LCAgICA1NDQsICAgLTE0OSwgICAgNDYzLAorICAgICAgLTEyOSwgICAtMzQ1LCAgICAzNTAsICAgIDE4MywgICAgMTczLCAgICAxOTcsICAgIDQ2NCwgICAgMTgwLAorICAgICAgLTI0OSwgICAtMzY1LCAgIC03ODUsICAgICAtOSwgIC0zNDExLCAgIC0yMzUsICAgLTEyNCwgICAgMjI1LAorICAgICAtNDUxNiwgICAgMTk2LCAgIC0xNTAsICAgIC04OSwgICAgLTg5LCAgICAgNTQsICAgLTExMCwgICAgMTM3LAorICAgICAgLTQzMSwgICAgMjcyLCAgICAtMTIsICAgICAtNywgICAgMTE0LCAgIC0yMDEsICAgIDE2NiwgICAxNTcwLAorICAgICAgIC03NCwgICAgLTg4LCAgIDYwMTksICAgIDM1MCwgICAgLTc1LCAgICAgNjgsICAgIC0yOSwgICAgLTgxLAorICAgICAgIC01MCwgICAgIDU3LCAgICAtNjIsICAgIDEwMywgICAgIDYxLCAgICAyNzYsICAgICAyMiwgICAtMTMxLAorICAgICAgLTEzNCwgIC0zMzQ3LCAgICAtNjAsICAtMzM5NywgICAtMzExLCAgIC0xMDUsICAgICA5MCwgICAtMTU5LAorICAgICAgLTIyMiwgICAgMTUxLCAgICAyMjQsICAgLTIxMCwgICAgMjY0LCAgICAxOTIsICAgICAyOSwgICAgLTg0LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IwODA4c2wwW10gPSB7CisgICAgICAgIDI0LCAgLTMxNDgsICAtMzExMSwgICAgMTA2LCAgICAgNDUsICAgLTExNCwgICAgLTg1LCAgIC0yMTEsCisgICAgICAgMTU0LCAgICAxNzIsICAgIDI0NiwgICAgMzY4LCAgIC0xMzAsICAgICA1OCwgICAtMTM1LCAgICAgNzAsCisgICAgICAgMTAyLCAgIC0xNTAsICAgIC03NiwgICAgIC03LCAgICAgMTMsICAgICAtMSwgICAgLTI5LCAgICAgMjAsCisgICAgICAgIC03LCAgICAxMTIsICAgLTIzNCwgICAtMTE1LCAgIC0xMzgsICAgIC00MCwgICAgMTA2LCAgICAxNzgsCisgICAgIC03Mjc2LCAgIC01MzcsICAgICAyNSwgICAgODU2LCAgICA0NjAsICAgMzEwNywgICAgMTQ2LCAgIC01MjAsCisgICAgICAtNjMxLCAgIC0xMTgsICAgIDM5MywgICAgMTc5LCAgICAxNDQsICAgIC04NiwgICAgIDQ3LCAgICAgODIsCisgICAgICAzMDMxLCAgICAgMjgsICAgIDE2NCwgICAtMzA4LCAgIC00MTEsICAgICA3MiwgICAgMTM4LCAgICAzNzgsCisgICAgICAgMjQyLCAgICAyNTMsICAgICAxMiwgICAgMTU4LCAgICAtMjgsICAgIC02MCwgICAgLTI5LCAgICAtNDYsCisgICAgICAgIC01LCAgICAtMTEsICAgICA4NCwgICAyNzUzLCAgIC0xMTMsICAgIC02NSwgICAgICAzLCAgICAgIDUsCisgICAgICAgIDEzLCAgLTUxMTAsICAgIC03NCwgICAtMTI2LCAgIC0xMjksICAgIC04MiwgICAgLTU4LCAgICAxMTYsCisgICAgICAgIDE1LCAgICAgNjgsICAgIDI0MywgICAgLTMyLCAgICAxMjYsICAgIC00OCwgICAgIDExLCAgICAgLTcsCisgICAgICAgIDc1LCAgICAgMTAsICAgIDE2NiwgICAtMTUzLCAgICAgIDgsICAgIC00MywgICAgLTM4LCAgICAgODEsCisgICAgICAgLTQxLCAgICAgMTMsICAgIDEwMCwgICAgIDI3LCAgICAgNDYsICAgLTQ0MSwgICAgLTU2LCAgICAgMzUsCisgICAgICAgICA0LCAgICAgNTEsICAgNzUyOCwgICAgIDUyLCAgIC0xNDEsICAgLTE1MywgICAgIDM5LCAgICAtMzYsCisgICAgICAgLTg2LCAgICAgODAsICAgIC0zNSwgICAgIDUwLCAgICAtNDYsICAgICAyMywgICAgMTc4LCAgLTM5ODYsCisgICAgIC0zMzUwLCAgICAgNTksICAgLTI3OCwgICAgIDM3LCAgICAgLTIsICAgICAxNCwgICAtMTU3LCAgIC0yMDgsCisgICAgICAtMzE3LCAgICAyMTgsICAgICAxNSwgICAtMjk2LCAgICAtMzIsICAgIC01MSwgICAgIDM2LCAgICAtMjcsCisgICAgIC0yMDYyLCAgICAgMjgsICAgIC0zNywgICAgMzIyLCAgIDIyODYsICAgIDIxNCwgICAtMTk2LCAgIC0xNzEsCisgICAgICAgLTY0LCAgIC0xNjMsICAgIDI2NSwgICAgLTUwLCAgICAgIDMsICAgLTE3NywgICAgLTIyLCAgICAgNjgsCisgICAgICAgMTI0LCAgICAgMzcsICAgIC0xNSwgIC0yMjAyLCAgICAgNjAsICAgIDEzMywgICAgICA0LCAgICAzNzEsCisgICAgICAyNzUzLCAgIC0xMTEsICAgIDQ4MCwgICAtNDQ2LCAgICA0ODQsICAgICA0MywgICAgMTUwLCAgIC0zMzEsCisgICAgICAxNDEwLCAgIC03OTEsICAgIDEyMywgICAtMTM2LCAgIC0xOTIsICAgIDI2NywgICAgICAwLCAgICAtODksCisgICAgICAtMTA1LCAgICA0MjEsICAgICA2OCwgICAtMTI2LCAgICAgNzksICAgIDI3OSwgICAgMjAyLCAgIC0xMzIsCisgICAgICAtMjA4LCAgLTMzNDUsICAgLTEwNSwgICAgIDU5LCAgICAxMTgsICAgLTY0NywgICAgLTQ4LCAgICAtMTIsCisgICAgICAgMTQ1LCAgIC00MDMsICAgIDIwMCwgICAgICA3LCAgICAgLTQsICAtMzE5MiwgICAtMjIzLCAgICAgNjQsCisgICAgICAgICAwLCAgICA0MTUsICAgIDM2NiwgICAgMTM2LCAgICAgNDksICAtNzYxMSwgICAgIDc5LCAgIC0xMDUsCisgICAgICAgMTI3LCAgICAtNjksICAgIC00MywgICAgMTAzLCAgICAtOTUsICAgIC05MywgICAgLTEwLCAgICAtMzAsCisgICAgICAgIDk0LCAgICAxMDgsICAgLTEwOSwgICAgICAwLCAgICAtODcsICAgIC03MCwgICAgMzAwLCAgICAtOTMsCisgICAgICAgMTEzLCAgICAgMjUsICAgIC0xNywgICAyMjYzLCAgICAgNDEsICAgIDE5MiwgICAgIDE4LCAgICAgNzMsCisgICAgICAgMTc5LCAgICAxMjksICAgIDE0OSwgICAgLTgxLCAgICAgLTEsICAgICAgMCwgICAgMjAxLCAgICAxODQsCisgICAgICAgNjUxLCAgICAgIDgsICAgICAxOCwgICAgMTE0LCAgIDI4MjAsICAgIDM4MywgICAgLTcxLCAgICAzNzYsCisgICAgIC0yMjgxLCAgLTExOTAsICAgLTE0MywgICAgMTIxLCAgICAtNDUsICAtMjE1NywgICAtNDEwLCAgICAgODEsCisgICAgICAgLTE0LCAgIDE1MzcsICAgLTgzMywgICAgIDI5LCAgIDExNTAsICAgLTQ5NCwgICAgIC04LCAgICAtMTQsCisgICAgICAgMjEwLCAgICAxODgsICAgMzA3MywgIC0xNzc1LCAgIC0xMjMsICAgICA4MCwgICAtMTAzLCAgICAyMjcsCisgICAgICAgMjk2LCAgICAxMTEsICAgMTYzNywgICAtMTk3LCAgIDEzNDksICAgIDE3NCwgICAzMjc2LCAgICAgNDksCisgICAgICAgLTk4LCAgICAgNzQsICAgIDY2MCwgICAgICAzLCAgIC0yNTIsICAgLTM1NiwgICAgIC05LCAgICA1MjcsCisgICAgICAgLTYzLCAgLTc5OTUsICAgIC0xNiwgICAgIDg1LCAgICAyNDksICAgICA3NCwgICAgIDI2LCAgICAgIDIsCisgICAgICAgICAzLCAgICAgMjYsICAgLTEyNCwgICAgLTYxLCAgICAtMjYsICAgLTE0NCwgICAgICA0LCAgICAtNTIsCisgICAgICAgICA2LCAgIC01MTcsICAgIC05NSwgICAyNTY2LCAgICAtMjYsICAgLTE5MCwgICAtMTk2LCAgIC01MDksCisgICAgIC0yOTgyLCAgICAgIDQsICAgLTE3OCwgICAgIC05LCAgICAtNjcsICAgIC0yNSwgICAgICAxLCAgICAxOTMsCisgICAgICAgLTY4LCAgICAtNDYsICAgIC04MiwgIC0zNzM0LCAgICAtMTQsICAgLTMzOSwgICAgLTQ0LCAgIC0xNTEsCisgICAgICAgIDU1LCAgICAyMzAsICAgICAtMywgICAgMTAwLCAgICAtNDcsICAgIC02OSwgICAgIDM1LCAgICAxMDcsCisgICAgICAgMTI3LCAgIC0xNzUsICAgIC0xMSwgICAgLTEwLCAgIC0xNTgsICAgLTE0MCwgICAyOTM0LCAgIC0xMzIsCisgICAgICAyNTcxLCAgIC0xNTgsICAgLTIxNywgICAgMTA2LCAgICAxMzcsICAgLTIyMiwgICAgIDc0LCAgICAtNDIsCisgICAgICAgIDY0LCAgICA1NTksICAgIDEyMiwgICAgIDczLCAgIC0xMTIsICAtMjk2NCwgICAyNTAyLCAgICAgMTMsCisgICAgICAgMzAxLCAgICAtNDEsICAgIDIwMywgICAtMzgyLCAgIC0xNTEsICAgLTIyMSwgICAtMTQ3LCAgICAtMjQsCisgICAgICAgIDgzLCAgICAgMzcsICAgIC00NSwgICAgIDU2LCAgICAgODksICAgICA3MSwgICAgMTA5LCAgICAtMTQsCisgICAgICAgLTQzLCAgIC0xMzAsICAgLTEwOCwgICAgLTE4LCAgICAgNzQsICAgIC0yMywgICAgLTM0LCAgICAgNzksCisgICAgICA3NjYyLCAgICAtODgsICAgICA3MCwgICAgIDIxLCAgIC0xMTAsICAgIDE0NywgICAgIDI2LCAgICAyNTAsCisgICAgICAgIDc0LCAgICAxNjUsICAgICA0OSwgICAgIDQzLCAgICAgNDUsICAgIC0yMiwgICAgLTE0LCAgICAyOTMsCisgICAgICA1Mjc1LCAgICAgNTcsICAgIC03MiwgICAgIDkzLCAgICAgNDAsICAgIDExNSwgICAtMTM5LCAgIC0zMzIsCisgICAgICAgIDk1LCAgICAgOTIsICAgIC0yNiwgICAgIDI2LCAgICAxNjksICAgIC05NCwgICAgMzMyLCAgICAgNzEsCisgICAgICAtNDgyLCAgICAxMzcsICAgIDE5MCwgICAgMTE0LCAgICAgMTQsICAgIDE1MSwgICAzMTI1LCAgICAgIDYsCisgICAgICAgMTA5LCAgICAgIDYsICAgICAgNywgICAxNTQzLCAgICAyODIsICAgIC0yNCwgICAgIDI0LCAgICAxNDIsCisgICAgICAgIDMzLCAgICAxMjMsICAgICA0MSwgICAgLTcyLCAgIC0yNTMsICAgIC0zMywgICAgMzA5LCAgIC0xMDcsCisgICAgICAgLTY0LCAgIC0xMzEsICAgICA1NiwgIC0zNTI4LCAgICAgODIsICAgIC0xNywgICAgNDE3LCAgICAtNDcsCisgICAgICAtNTg4LCAgICAyNzQsICAgIDE1NSwgICAgMTU4LCAgIC0yNDUsICAgIDE4NiwgICAgMTQ3LCAgICAgLTcsCisgICAgICAgLTUwLCAgIC0yMTgsICAgICAxMiwgICAgMTE4LCAgICAtNjIsICAgIDY1MiwgICAgMTQ1LCAgICAgNjQsCisgICAgICAyNDczLCAgIC0xNDYsICAgIDIyMCwgIC0yOTczLCAgICAgOTcsICAgIDI4NCwgICAgIDI5LCAgICAyNjgsCisgICAgICAgIDI5LCAgIC0yMDgsICAgIC00MCwgICAtMjUxLCAgIC0xNzUsICAgIC0xNiwgICAgLTU4LCAgICAtNjUsCisgICAgICAgIDI4LCAgICAgMjYsICAgICA1NSwgICAgIDc0LCAgICAtMTIsICAgMTkxMSwgICAgIDQzLCAgICAtODIsCisgICAgICAtMTUwLCAgICAtMTMsICAgLTExOSwgICAgICA4LCAgICAxMTksICAgIDE1NiwgICAxNTUwLCAgICAtODgsCisgICAgICAtMTAyLCAgICAgNDYsICAgIDIyNiwgICAtMTMyLCAgICAgOTUsICAgIDEwMCwgICAgIDg3LCAgICAgIDcsCisgICAgICAgLTQ2LCAgICAgIDgsICAgIC0zMiwgICAgLTE2LCAgICAtMTIsICAgIDMxNywgICAgLTMzLCAgICAtMjcsCisgICAgICAgMjkxLCAgICAtODgsICAgIDE2OSwgICAgICAxLCAgIC0xMDEsICAgIC02MSwgICAgMTYxLCAgICAxNjIsCisgICAgICAgLTMzLCAgICAgLTEsICAgICAxMSwgICA1MDk3LCAgICAtMzQsICAgIDE0MiwgICAgIDMxLCAgICAgOTQsCisgICAgICAzNjE5LCAgICAtOTQsICAgICA2NywgICAzMzc5LCAgICAtNjUsICAgICAyOCwgICAgMjU0LCAgICAxODksCisgICAgICAgMTEwLCAgICAxMzgsICAgIC00MSwgICAgIDUyLCAgICAgMzIsICAgLTEwNCwgICAgMTU0LCAgICAxNzIsCisgICAgIC0yMzY1LCAgIC00NjQsICAgIDI4MSwgICAgMjA3LCAgICAtNjYsICAgLTE5MCwgICAgMzk5LCAgIC0xNTgsCisgICAgICAgIDEzLCAgIC0xNTUsICAgLTIyMywgICAgIDkyLCAgIC0xMDgsICAgIC0yNSwgICAgNDY4LCAgICAxODksCisgICAgIC00MzU5LCAgICAgNDIsICAgLTEzNSwgICAgMTM4LCAgICAgMzYsICAtMTQwMywgICAtMjY0LCAgIC0zMzYsCisgICAgICAtMTY0LCAgICAtNDksICAgICA1NCwgICAtMTI1LCAgICAtNjEsICAgICA2MiwgICAgIDE2LCAgICAxNzIsCisgICAgICAgMTgyLCAgIDMxMzQsICAtMTM3MywgICAgIDYzLCAgIC0yMjcsICAgLTEwNiwgICAtMTMzLCAgIC0xNjUsCisgICAgICAgLTY5LCAgICAtNTcsICAgLTE4NCwgICAgLTQ2LCAgICAgIDksICAgIC01NywgICAgIDUwLCAgICAgLTMsCisgICAgICAgLTYyLCAgICAtMTUsICAgLTEyMywgICAgMTA4LCAgICAxMTEsICAgICA5MSwgICAtMTYxLCAgICAgMjMsCisgICAgICAgLTgxLCAgICAgIDcsICAgIDIwOCwgIC01Mzg1LCAgIC0yNDQsICAgICAyNCwgICAgIDk1LCAgICAgMTIsCisgICAgICAtMjY0LCAgICAgNjIsICAgIC00NCwgICAgIDIxLCAgIC0yNDAsICAgLTI5OSwgICAgLTEyLCAgICAxMTcsCisgICAgICAgLTYxLCAgLTI1NTEsICAgIDM4OSwgICAyODE2LCAgIC0xNzksICAgIDIwMywgICAtNDIxLCAgICA4OTksCisgICAgICAgIC03LCAgICAxNzQsICAgLTIwMCwgICAgIDk4LCAgIDEwMzYsICAgLTE2NiwgICAgIDExLCAgIC0xMzcsCisgICAgICAgIDc4LCAgICAgLTcsICAgLTEyMSwgICAgMjQ1LCAgICAtNzcsICAgIDEyNCwgICAgMTAyLCAgICAgNTEsCisgICAgICAzMTM2LCAgICAgNzQsICAgLTMxMCwgICAgIDQwLCAgICAyMTIsICAgLTIzOSwgICAtMzczLCAgIC0xNTQsCisgICAgICAgMzk4LCAgIDI5NjcsICAgIDY1NCwgICAgNDg4LCAgICAxMDMsICAgLTIzMCwgICAtMzMwLCAgICA4MzEsCisgICAgICAgLTYzLCAgIC00NzMsICAgIDE1MiwgICAtNTU2LCAgLTIxODYsICAgLTM3MSwgICAgICA0LCAgICAgODYsCisgICAgICAgLTEyLCAgIC0xNDEsICAgNTUwMywgICAgLTg3LCAgIC0xMjMsICAgIC0xNywgICAgLTE1LCAgICAxNTQsCisgICAgICAgMTkyLCAgICAtODYsICAgICA5NywgICAgMTY1LCAgICAzNTIsICAgICA1NiwgICAgMTU0LCAgICAgNDMsCisgICAgICAtMzMxLCAgIDEwMDQsICAgIC01MiwgICAtMTMxLCAgLTMzMTEsICAgICAgMywgICAgMTEwLCAgIC0xNTMsCisgICAgICAgLTcwLCAgICAxMzcsICAgLTE2OCwgICAgLTIwLCAgICAxMTUsICAgIDE0MCwgICAgLTI1LCAgICAtNTQsCisgICAgICAgLTEzLCAgIC0zMDAsICAgICA1NywgICAtMTMxLCAgICAyMTQsICAgIDI2MSwgICAgLTkyLCAgICA2MTgsCisgICAgIC0yNzUyLCAgLTMxNDYsICAgICA2MSwgICAgLTUxLCAgICAyMTAsICAgLTIzMCwgICAgIDg3LCAgIC0xODQsCisgICAgICAgMzMwLCAgICAgMjIsICAgIC0xOSwgICAtMTA3LCAgIC00NzcsICAgIC0zOSwgICAgICAxLCAgICAxMjcsCisgICAgICAgMTc4LCAgICAtNzMsICAgIDQyNSwgICAgIDU2LCAgICAtMjUsICAgIC00MSwgICAgMTM1LCAgIDI0MjMsCisgICAgICAgIDU5LCAgICAtNDYsICAgIC0xMCwgICAgIDQ5LCAgIC0xMTYsICAgIC01MSwgIC0yMjM5LCAgIC0yMjgsCisgICAgICAgLTc1LCAgICAgNDgsICAgICAgMywgICAgMTgxLCAgICAxNjEsICAgLTEzMywgICAtMzU1LCAgICAgODEsCisgICAgICAgICA1LCAgICAgODQsICAgLTIyMiwgICAgLTgzLCAgICAgOTIsICAgICAzMywgIC03NTU4LCAgICAtMzgsCisgICAgICAgIC0zLCAgICAxNTksICAgICAzMywgICAgLTU4LCAgICAtMzcsICAgLTEwNywgICAgIDE2LCAgICAtNjEsCisgICAgICAgLTk0LCAgICAgOTMsICAgICA5NywgICAgIDQ5LCAgIC0yNzUsICAgICAyOSwgICAtMTk4LCAgICAgLTQsCisgICAgICAgLTY4LCAgICAgODcsICAgIDExNiwgIC03MDM5LCAgICAgNDYsICAgICA4MSwgICAgLTI1LCAgICAgIDAsCisgICAgICAgIC03LCAgICAtNDYsICAgIDE1MiwgICAgIDY0LCAgICAtNDAsICAgLTE0MywgICAgLTU2LCAgICAxNDcsCisgICAgICAgNDAzLCAgICAyNTcsICAgMjM4MCwgICAtNTM4LCAgIC00MDAsICAgLTEzMiwgICAgLTg5LCAgICAtMjksCisgICAgIC0yODc4LCAgICA0NTcsICAgLTU1MiwgICAgLTEyLCAgIC0xODksICAgLTM3MCwgICAtMzU3LCAgLTM2NzksCisgICAgICAgNDIyLCAgICAgNjMsICAgIDIwMCwgICAgMTE2LCAgICAgLTksICAgLTIyOSwgICAgLTcyLCAgIC0xMDAsCisgICAgICAzMzQ2LCAgICAgODgsICAgIC0xOCwgICAgIDI4LCAgICAtNDcsICAgIDE1OSwgICAgMTA4LCAgIC0xNjAsCisgICAgICAgMjUzLCAgICAgNTgsICAgMjkzOCwgICAgIDU1LCAgICAzNjYsICAgIC0zMywgIC0zMjA5LCAgICAgMzEsCisgICAgICAtMTQ4LCAgICAtMTAsICAgIC00MCwgICAtNDQzLCAgICAxMjcsICAgIDEyMCwgICAgMTA2LCAgICAgIDksCisgICAgICAgICA0LCAgIC0yNDAsICAgIDIwMCwgICAgMTI5LCAgICAzMjgsICAgLTEwMiwgICAgMTg3LCAgICAxODIsCisgICAgICAgMTEyLCAgIDI3NTcsICAtMzI2MCwgICAgMzE0LCAgIC0xNjMsICAgICAtMywgICAtMTg1LCAgICAzNTQsCisgICAgICAgLTk3LCAgICAtNjksICAgLTE5OSwgICAgIDQxLCAgIC0xNDMsICAgICAxOSwgICAgMTA4LCAgICAtMjIsCisgICAgICAgLTMyLCAgICAtMTgsICAgLTE0OSwgICAgIDM1LCAgICAgMzEsICAgICAtNSwgIC01MDgzLCAgICAgNTIsCisgICAgICAgICA5LCAgICAgIDUsICAgIC00NCwgICAgLTUyLCAgICAgNzYsICAgICAgNywgICAtMTAwLCAgICAgIDcsCisgICAgICAgLTc5LCAgICAgIDAsICAgIC0zMywgICAgMTEwLCAgIC0yMDgsICAgICAyMCwgICAtMTU5LCAgICAtNzYsCisgICAgICAgICAyLCAgLTgxOTIsICAgIDE1NiwgICAgMTE4LCAgIC0zMDYsICAgIC04OCwgICAgMTM2LCAgIC0yOTMsCisgICAgICAtMTc2LCAgICAxNjMsICAgICAgOCwgICAxODcxLCAgIC0xMTIsICAgIDIyOSwgICAgMzExLCAgICAtOTUsCisgICAgICAgLTc1LCAgICAgMTcsICAgIDIxNywgICAgMTUyLCAgICAgNjIsICAgICAxNywgICAtMjQ2LCAgIDM1NzksCisgICAgICAgICA1LCAgICAtODcsICAgIC0yMSwgICAgIDkyLCAgICAxMTQsICAgLTE4NSwgICAgMTE4LCAgICAgIDgsCisgICAgICAgMTk2LCAgIC0xMjQsICAgLTIyMCwgICAgMTc1LCAgICAxMDQsICAgICA1NCwgICAgMTA0LCAgICAtNDAsCisgICAgICAgLTQ1LCAgIC0xNTIsICAgIDM5MiwgICAgMjE2LCAgICAtMjQsICAgIC0yOCwgICAyMDI0LCAgICAgLTYsCisgICAgICAgIDQyLCAgICAtOTEsICAgLTIwMSwgICAgIC05LCAgIC0xOTIsICAgICAzNSwgICAgLTQzLCAgIDE2NjEsCisgICAgICAtMzU2LCAgIDEyMDcsICAtMTMyMiwgICAgMzQwLCAgLTI5MzcsICAgIC0xNiwgICAgMTYzLCAgIC04MDEsCisgICAgICAtNDIzLCAgICAxOTcsICAgLTUxMiwgICAgLTcwLCAgICAyMjksICAgLTQxMiwgICAgMjkxLCAgICA1MTEsCisgICAgICAgLTM2LCAgIC0xNzksICAgIC05OCwgICAgLTU0LCAgICAgOTMsICAgICA4NywgICAgMjYzLCAgICAtNDQsCisgICAgICAgMTY3LCAgICAgNzcsICAgICAtNCwgICA3Mjc4LCAgIC0xMDEsICAgLTE5MywgICAgIDkxLCAgIC0yNTEsCisgICAgICAtMTMxLCAgICAyNjksICAgICAxNSwgICAtMTY4LCAgICAtMjIsICAgIC0yNiwgICAgIDQ0LCAgICAgMjQsCisgICAgICAgMTU0LCAgICAxMTUsICAgIC0xMSwgICAtMTI0LCAgICAgMjgsICAgICAzNywgICAgLTE0LCAgICAtNDYsCisgICAgICAgLTY3LCAgLTgxOTIsICAgIC01MSwgICAtMTY5LCAgICAgNDEsICAgLTMwMiwgICAgLTgxLCAgIDE5OTEsCisgICAgICAgLTExLCAgICAxMzYsICAgLTE3NSwgICAgIDcxLCAgIC0xMDQsICAgICA4OSwgICAgIDYwLCAgICAxMzcsCisgICAgICAgIDE3LCAgICAxMDYsICAgICA5NiwgICAtMjM4LCAgICAtODMsICAgIC01MiwgICAtMTEzLCAgICAgNTMsCisgICAgICAyOTAzLCAgICAtNDcsICAgICAgOSwgICAtMjI3LCAgLTI3ODQsICAgLTI0NSwgICAgMTQ2LCAgIC0xOTYsCisgICAgICAtMjE2LCAgICAgNDEsICAgICAtNiwgICAtMTI4LCAgICAtNTMsICAgICAgMSwgICAtMTI4LCAgIC0xNDUsCisgICAgICAgMTQ5LCAgICAgMzIsICAgICAyNSwgICAgLTU3LCAgICAtMTQsICAgICA3MiwgICAtMTM1LCAgICAgMTAsCisgICAgIC0xOTQ2LCAgICAtNjcsICAgICA3NCwgICAtMTI3LCAgICAxNDEsICAgLTI5OSwgICAgIDU1LCAgICAgIDgsCisgICAgICAgOTQ3LCAgLTIyMzksICAgLTI3MSwgICAgIDc0LCAgIC0yMjcsICAgIC04MSwgICAgIDMxLCAgICAyOTEsCisgICAgICAgLTg2LCAgLTI5MTQsICAgICAyMiwgICAgIC03LCAgICAyOTMsICAgICAgMiwgICAgLTI1LCAgICAgIDksCisgICAgIC0yOTk3LCAgICAgODksICAgMzE1OCwgICAgMTkyLCAgICAtNDYsICAgLTI0NiwgICAtMTQwLCAgICAgNDYsCisgICAgICAgMjg3LCAgICAxMzMsICAgLTExMCwgICAgMzA4LCAgIC0xMTQsICAgIC0zMywgICAtMTA2LCAgICAgIDksCisgICAgICAgLTg5LCAgICAxMDUsICAgIDM2NCwgICAtMTcyLCAgICAxODUsICAgIC02MSwgICA0NDY0LCAgICAtOTIsCisgICAgICAtMjY0LCAgICAtNjYsICAgLTE2MSwgICAgMTAyLCAgIC0xNzgsICAgLTI2NCwgICAgLTIxLCAgICAxMTQsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjA4MDhzbDFbXSA9IHsKKyAgICAgICAyNDYsICAgICAtNiwgICAtMTgwLCAgICAgOTAsICAgIDEyNywgICAzMzIyLCAgICA1OTgsICAgIDE4MiwKKyAgICAgICAgODEsICAgICA4MiwgICAgIDY3LCAgICAtMzksICAgICA4NywgICAgLTYwLCAgICAgLTgsICAgIC04OSwKKyAgICAgICAxODUsICAgICA5OSwgICAgLTI1LCAgICAgMjcsICAgICAgOSwgICAgLTU5LCAgLTc0MjEsICAgICA0OSwKKyAgICAgICAtMTcsICAgIDExNiwgICAgLTg1LCAgICAgIDYsICAgLTMwNSwgICAgIDg4LCAgIC0xNjQsICAgICA5OSwKKyAgICAgICAgNjEsICAgLTQxNSwgICAtMTE0LCAgIC0yODgsICAgICAgMSwgICAtMTY1LCAgICAtMTIsICAgICAgNSwKKyAgICAgIC0xNDMsICAgLTE0MiwgICAtNTIxLCAgIC0yNDUsICAgIC01MywgICAgIDM4LCAgICAtOTksICAgMzcwOSwKKyAgICAgICAtNTIsICAgICAgMCwgICAgLTQxLCAgIC0xMzUsICAgIDE0NywgICAtMjE3LCAgICAgNjIsICAtMjE0NCwKKyAgICAgICAyNTUsICAgIDEzMiwgICAgMjY0LCAgICAgNjUsICAgIC0zNywgICAgMjA0LCAgIC0zMzgsICAgLTI4MCwKKyAgICAgICAxOTIsICAgLTE4NCwgICAtMTU4LCAgLTM2ODUsICAgIC0yNiwgICAgMjAzLCAgICA0MzAsICAgIC0yOSwKKyAgICAgICAtMTYsICAgICA3NywgICAgMjMwLCAgIC0zMTEsICAgIDU5NywgICAyNTUzLCAgLTExMjYsICAgIC02MywKKyAgICAgICAxNTQsICAgLTQzMSwgICAtMTYxLCAgICAzMTUsICAgIDI4NiwgICAtMTQ3LCAgICAxNzcsICAgICAtMywKKyAgICAgICAgOTMsICAgIDQ0OSwgICAgMjUzLCAgICAtMzcsICAgIDEwMSwgICAtMjQ0LCAgICAtNzcsICAgICA0MiwKKyAgICAgIC0zODQsICAgICAyMiwgICAgIDM2LCAgICAyMzUsICAtNDk3MywgICAgMjQzLCAgIC0xMjAsICAgLTEwNSwKKyAgICAgIC0yMjYsICAgLTExNCwgICAtNDU1LCAgIC00MDQsICAgIDE2NCwgICAtNTA1LCAgICA0NzYsICAgLTEyNCwKKyAgICAgLTI4MzcsICAgIC04MiwgIC0yOTIwLCAgICAgLTMsICAgICAgMCwgICAgMTM0LCAgICAtOTQsICAgIDI2NCwKKyAgICAgICAtNTMsICAgIC01MywgICAgMTA4LCAgICAgLTMsICAgLTg0NSwgIC0yODEzLCAgICAyMjgsICAgLTE3OSwKKyAgICAgICAtNjAsICAgICAtMiwgICAgIDY1LCAgICAgMzMsICAgLTE1MywgICAgLTE2LCAgIC0xNDksICAtMjEzNSwKKyAgICAgICAyMDksICAgLTkyOSwgICAtMjg4LCAgICAyMjcsICAgMjY1NiwgICAtMTI1LCAgICAtNDIsICAgICAxNywKKyAgICAgICAgMzAsICAgMzM3NSwgICAtMzY3LCAgICAgNTMsICAgLTI2MiwgICAtMzUxLCAgICAxMDgsICAgLTI3MCwKKyAgICAgICAgMTEsICAgIC01NywgICAtMTgyLCAgICAtNTEsICAgLTE0OSwgICAtMjg3LCAgIC0xMTUsICAgIC0yNCwKKyAgICAgICAgOTksICAgIC03NiwgICA2OTU0LCAgICAtNzUsICAgICAtNCwgICAgIDM4LCAgIC0xNjgsICAgIDEzOCwKKyAgICAgICAxMDksICAgLTIzOSwgICAgLTQ1LCAgICAgNDksICAgICAyOCwgIC0xMzc2LCAgICAgNDksICAgICA2NiwKKyAgICAgICAtODMsICAgLTEyOSwgICAgLTYxLCAgICAtOTksICAgIDEzNSwgICAgIDE0LCAgICAtOTMsICAgIDExMSwKKyAgICAgICAgMzcsICAgIC0xNiwgICAgICAyLCAgICAtNzYsICAgIDM2MCwgICAgLTc3LCAgICAgODIsICAgIDE2MSwKKyAgICAgICAxNDksICAtMTY2MCwgICAgIDE4LCAgICAgOTgsICAgIC0zNCwgICAgLTEyLCAgICAtMzYsICAgIC02NSwKKyAgICAgICAxMjYsICAgIC01NywgICAgIDI4LCAgICA1MTksICAgMjA0NCwgICAgMjk3LCAgICAgNzMsICAgLTIxOCwKKyAgICAgICAgNTEsICAgICAxNywgICAgIDIxLCAgICAtNzAsICAgIC0zMiwgICAgLTczLCAgICAtMzksICAgIC0zOCwKKyAgICAgICAtMTEsICAgICA2MCwgICAgIDM4LCAgIC0xMjksICAgLTEwNSwgICAtMTczLCAgICAyMDAsICAgICAgNywKKyAgICAgICAxMjQsICAgIC03NCwgIC0yNzgwLCAgIDI2MDgsICAgIC01NywgICAtMjEzLCAgICAgNTQsICAgLTIwMCwKKyAgICAgICAxMzQsICAgIDIwOCwgICAgLTM0LCAgICAyMzYsICAgIDE0MywgICAgMTAxLCAgICAzMjcsICAgIDU1OCwKKyAgICAgICAgNzUsICAgIDMxNywgICAzMDkwLCAgIC0xODgsICAgIDU0NCwgICAtMTg2LCAgICAgMTUsICAgIDExNiwKKyAgICAgICAyMzcsICAgICA3NiwgICAtMTA1LCAgICAgMjksICAgLTMwMCwgICAgLTI3LCAgIC0yMTEsICAgICA3MSwKKyAgICAgIC0xNDQsICAgIDE4MywgICAgLTc3LCAgICAgMzgsICAgIC0xNiwgICAgIDM5LCAgICAgNTYsICAtNzMwOCwKKyAgICAgIC0xMTMsICAgLTExNiwgICAgLTMyLCAgICAyMjIsICAgICA2MCwgICAgIDc2LCAgICAtMjEsICAgICA1OSwKKyAgICAgICAgNTIsICAgIDEwNCwgICAgMzgzLCAgICAgNzMsICAgIDE0OSwgICAgIDg4LCAgICAxMjcsICAgICAzNCwKKyAgICAgLTE4MTksICAgIC00NiwgICAgIDUwLCAgICAgMTEsICAgLTE1OSwgICAtMjIzLCAgIC0xNjMsICAgLTE0OSwKKyAgICAgICAgOTUsICAgLTE2MywgIC0yMTY4LCAgICAtMTksICAgLTkzNywgICAtMTgzLCAgICAgNjYsICAgLTQ2NSwKKyAgICAgIC0yNTcsICAgIDM0MSwgICAgLTcwLCAgICAxMTEsICAgIDIyOCwgICAgIDUyLCAgICAgODMsICAgICA2MywKKyAgICAgICAtNTIsICAgLTE4NywgICAgIDE2LCAgLTI1MzksICAgIC01MSwgICAzMjQwLCAgICAtODEsICAgICA4NywKKyAgICAgIC0xMTYsICAgLTE4MywgICAtMTgyLCAgICAgOTYsICAgIC0yMiwgICAtMTkxLCAgIC0xMDcsICAgIDIxNywKKyAgICAgICAtMTAsICAgLTIxNSwgICAgICA5LCAgICAgLTcsICAgIC05NywgICAtMzMxLCAgICAtNTUsICAgIDUxMywKKyAgICAgIC0zOTgsICAgMTM3OCwgICAyNjI3LCAgLTIxMjksICAgIDU2MywgICAxNDYyLCAgIC0zNjksICAgIDQ5OCwKKyAgICAgIDExNzYsICAgLTQ2OSwgICAgMjIwLCAgIC05NTMsICAgLTEyMiwgICAtMjM2LCAgIC0zMDYsICAgLTI3NiwKKyAgICAgICAgMzEsICAgICAzNSwgICAtMTY3LCAgICA1NTgsICAgLTEzNCwgICAgIDQ1LCAgICAtNTQsICAgICAxNiwKKyAgICAgICAgMzYsICAgICAxOCwgICAgMzAwLCAgIDI0MzgsICAgICA2MiwgICAtMTc3LCAgICAgNzcsICAgMjYzOCwKKyAgICAgIC0xMDgsICAgLTExNSwgICAzMzkyLCAgICAyNzQsICAgLTEyMywgICAgLTY2LCAgICAyMDEsICAgLTQwMCwKKyAgICAgICAxNzAsICAgIDE0MiwgICAgMTUxLCAgICAzMzIsICAgICA1MywgICAtNTA3LCAgICAgODEsICAgLTY1MywKKyAgICAgICAtOTMsICAtMzIwNCwgICAgIC01LCAgICAgMTAsICAgIC00MywgICAgIDc5LCAgIDM4NzksICAgICA3NywKKyAgICAgICAxOTEsICAgICAyNCwgICAgIDIzLCAgIC0yMDgsICAgICAgNiwgICAtMTA5LCAgICAtOTcsICAgIDEyNiwKKyAgICAgIC0zMDYsICAgIDYyOSwgICAgIDI2LCAgIC01MTYsICAgICA3OSwgICAgIDIxLCAgICAxMzEsICAgICA0MywKKyAgICAgIC0yNTMsICAtMzQ2MywgICAgODQwLCAgICA2NTMsICAgIC05NSwgICAgLTQ4LCAgICAzMDAsICAtMTAyNiwKKyAgICAgIC0zMjQsICAgLTkwOSwgICAtMzgzLCAgICAxOTUsICAgIDM0MiwgICAtMTM2LCAgIC0xOTIsICAgIDQyMiwKKyAgICAgICAyNjIsICAgIC0xMywgICAgNTM0LCAgIDMxMjUsICAgICAgOCwgICAxNjcyLCAgICAxNzYsICAgLTI5MywKKyAgICAgICAyMTEsICAtMTIxMywgICAgNTM3LCAgICA2MzcsICAgIC0xMCwgICAtMTE2LCAgIC0xNDksICAgICA0NCwKKyAgICAgICAgNTMsICAgIDEwNSwgICAgICA3LCAgICAtOTcsICAgICAgMywgICAgIDE3LCAgICAgIDgsICAgIC0yMSwKKyAgICAgICAgLTcsICAgIC00MSwgICAgLTM4LCAgLTQ5NTksICAgIC04MSwgICAgICAxLCAgICAxNjUsICAgIDE5NiwKKyAgICAgICAgOTgsICAgICAzNSwgICAgLTM1LCAgICAgIDgsICAgIC0yOCwgICAgMTEzLCAgICAtMjAsICAgIDEwOCwKKyAgICAgIC0xMzAsICAgIC02NSwgICAgMTcyLCAgIDI4NTgsICAgICA0MSwgIC0zMjk1LCAgICAxMzgsICAgICAxMCwKKyAgICAgICAtOTUsICAgIC0zMCwgICAtMTczLCAgICAgODUsICAgICA0MiwgICAgIDMwLCAgIC0xMTksICAgIDE2MSwKKyAgICAgICAxOTUsICAgIDEyNSwgICAgLTMyLCAgICAxMzYsICAgIDMxOSwgICAgLTMzLCAgIDUxNDIsICAgICA1MCwKKyAgICAgICAxMDAsICAgIDEyOCwgICAgLTkwLCAgICAtNTMsICAgIC02NywgICAtMjAzLCAgICAgMjgsICAgICAxOSwKKyAgICAgICAgMzcsICAgLTEzNywgICAtMTI0LCAgIC0xMDUsICAgIC0yNSwgIC0zNDA1LCAgIC0yNTAsICAgIDI5NCwKKyAgICAgICA0MDksICAgIC05OSwgIC0xMDcyLCAgIC0zODMsICAgIC0xMiwgICAgMjEyLCAgIC0yNzYsICAgMzM4OSwKKyAgICAgIC0xMDEsICAgIDE3MSwgICAgLTQxLCAgIC01NTQsICAgLTI5NSwgICAtNDM3LCAgICAgODYsICAgIDE1OCwKKyAgICAgIC0yNDIsICAgIDE2NywgICAgMTM1LCAgICAgIDcsICAgLTE0OSwgICAgIDQ4LCAgICAgLTQsICAgIC04NCwKKyAgICAgIDQ5MTEsICAgIDI4MywgICAgICA1LCAgICAtMTQsICAgIDEwNSwgICAtMTA3LCAgIC0zODQsICAgIDEwMiwKKyAgICAgICAxODMsICAgICA0NywgICAgIDY3LCAgLTUxMDUsICAgICAtNSwgICAgIDE2LCAgIC0xNTUsICAgIDE4MSwKKyAgICAgICAxMTAsICAgICAyNCwgICAgLTc3LCAgICAtMzIsICAgIDEyMCwgICAgICAxLCAgICAgMjIsICAgIDE2NywKKyAgICAgICAtOTAsICAgLTE1MCwgICAgIC01LCAgICAxNjMsICAgIC00NCwgICAgLTI4LCAgICAgNTQsICAtMzA1OCwKKyAgICAgIC0xNzQsICAgICA1OCwgICAgMTUyLCAgICAtMzEsICAgLTE3OSwgICAtMTIyLCAgICAtNTcsICAgIDIzMiwKKyAgICAgIC0zOTUsICAtNDk2MSwgICAgIDYxLCAgIC0xMTUsICAgICAzMSwgICAgIDE0LCAgICAgODIsICAgLTEwOSwKKyAgICAgICAtMzksICAgICA1OSwgICAgLTQ5LCAgIC0xMzMsICAgICA1MiwgICAgIDE3LCAgICAgNTcsICAgICA1MiwKKyAgICAgICAtNjMsICAgIDI3NSwgICAgMTQ2LCAgICAxMDQsICAgICA1MywgICAgIDQ3LCAgICAtNTUsICAgIDMxMSwKKyAgICAgIDQ4NzEsICAgIC0yNiwgICAgIDQ4LCAgICAtOTQsICAgIC0xMSwgICAgLTU4LCAgICAgNjMsICAgIDE0MCwKKyAgICAgICAtNzQsICAgIC05NCwgICAtMjY5LCAgICAtNzcsICAgMzM3MiwgIC0zMTE2LCAgICAgMTYsICAgIC00NywKKyAgICAgICAtNzQsICAgLTE2MSwgICAgMTE1LCAgICAgNTgsICAgLTI0NywgICAtMTE5LCAgICAzOTksICAgICA0MiwKKyAgICAgIC0xODEsICAgIDE1NCwgICAtMjE4LCAgICAtMjQsICAgLTIzNywgICAgIDU4LCAgIC0yNzUsICAgMjk3OSwKKyAgICAgICAxODcsICAgLTEyNCwgICAgMzEyLCAgICAzMDEsICAgMjc2NywgICAgIC04LCAgICAgNDAsICAgIC0yMywKKyAgICAgICAgLTYsICAgIC0zOCwgICAgLTUyLCAgIC0zNjMsICAgLTI2NSwgICAgLTc4LCAgIC0yMzAsICAgIDI4NiwKKyAgICAgIC0xMzUsICAgLTMzNywgICAgLTgxLCAgICAxNzAsICAgIC0xMywgICAgLTU4LCAgIC0xMTcsICAgIDUxOSwKKyAgICAgLTQ3ODQsICAgIDE1NywgICAtMTkzLCAgICAgIDksICAgICA2MiwgICAgLTIxLCAgICAxODAsICAgIDEyOCwKKyAgICAgICAzMjYsICAgIDIxMywgICAyNDQwLCAgICAgNjIsICAgLTYwMSwgICAgLTU1LCAgICAgIDIsICAgIC0xOCwKKyAgICAgIC0zNDIsICAgIDE0MiwgICAgMzU4LCAgIC02MzIsICAgLTM3NywgICAzNTkwLCAgIC0yNDgsICAgLTI3OCwKKyAgICAgIC0yMzUsICAgIC0yOCwgICAgMjQyLCAgIC0xMzMsICAgIDE0NCwgICAgIDI2LCAgIC0yNjEsICAgIDExMywKKyAgICAgICAgNDUsICAgIC0yMywgIC0xOTg0LCAgICAtNzcsICAgIDEyOCwgICAgMjQ5LCAgICAgLTgsICAgLTI2NiwKKyAgICAgICAtMzgsICAgICAtNiwgIC0xNjcyLCAgICAtNDUsICAgIC04NCwgICAtMzc3LCAgICAxNTQsICAgICAxNywKKyAgICAgICAtODMsICAgIC00NCwgICAgMTU2LCAgIC0xMzcsICAgICA0MywgICAgIDkxLCAgICAyNTMsICAgICAxNywKKyAgICAgICAtNzEsICAgIC05MiwgICAgMTc4LCAgICAgMTIsICAgICAxOCwgICAgIC04LCAgIC0xMDUsICAgIDEwMSwKKyAgICAgIDcwNjgsICAgICA3MSwgICAgLTgxLCAgICAgODQsICAgIC0zMywgICAgIDc5LCAgICAgNTMsICAgICAtNywKKyAgICAgICAtODUsICAgLTI2NSwgICAgMTE3LCAgICAzMTcsICAgIDExNCwgICAgIDcyLCAgIC00ODIsICAgLTQxOCwKKyAgICAgIC0xODUsICAgIC05NywgICAgMjY4LCAgLTE1NDMsICAgIC03OSwgICAtMTQ2LCAgICAtNDgsICAgIC00NSwKKyAgICAgLTMyNTksICAgLTIxMiwgICAxMTQ5LCAgIC0xNjUsICAgIDE3NywgICAtMTU4LCAgICAtNzcsICAgIDEwMCwKKyAgICAgICAgODYsICAgIC02OSwgICAgMTA3LCAgICAyMTksICAgLTUxMiwgICAtMjUzLCAgIC00MTgsICAgIC00NSwKKyAgICAgICAgMTYsICAgNTUwMSwgICAtMTg0LCAgICAyMDcsICAgICA2NywgICAgIDQ2LCAgICAxMDksICAgIC0yOCwKKyAgICAgICAgLTksICAgICAzMywgICAgIDYzLCAgICAtMTYsICAgICAzOSwgICAgIDkyLCAgICAgMjcsICAgICAyMywKKyAgICAgICAtMTAsICAtODE5MiwgICAgICAwLCAgICAgNTAsICAgIC01NywgICAgIDY4LCAgIC00NDQsICAgMTA4MiwKKyAgICAgICAyNDcsICAgLTEzOCwgICAgMTIwLCAgICA0NzIsICAgLTY5MiwgICAgMjEyLCAgLTE1NzYsICAgICA2NiwKKyAgICAgIDMwNjEsICAgIDQwMiwgICAtMTYwLCAgICAzMzcsICAgLTY4NSwgICAtNTE5LCAgICAyMjcsICAgLTI3OSwKKyAgICAgICAgOTIsICAtNDEzNSwgICAtMzkzLCAgICAtNDQsICAgICAgNiwgICAtMTI5LCAgICAgNTksICAgIDIzOSwKKyAgICAgICAxNTEsICAgIDE1MywgICAgLTM5LCAgICAxMTYsICAgIDEzNCwgICAgLTQwLCAgICAxNzEsICAgIDExOCwKKyAgICAgICAyMDcsICAgMjYxNSwgICAgIDM4LCAgIC0xNjcsICAtMTY3MSwgICAgIDg1LCAgIC0xMzUsICAgLTE4MiwKKyAgICAgICAtODgsICAgIDI0NiwgICAgIDUzLCAgICAgMjksICAgICAtMiwgICAgIDE2LCAgICAyMzIsICAgIDU0NCwKKyAgICAgICAtNDYsICAgLTEzOCwgICAgMTIyLCAgICAtNTIsICAgMTMxMiwgICAgICA5LCAgICAgOTIsICAgICAxMywKKyAgICAgICAgIDQsICAgICA2NiwgICAgLTM1LCAgIC0xMzQsICAgIC01NiwgICAgIDg1LCAgICAtNDMsICAgIC0zMSwKKyAgICAgICAgMjgsICAtMzE4NywgICAgMTAwLCAgIC0xMDMsICAgICA3MCwgICAgIC0zLCAgICAxODYsICAgIC00MywKKyAgICAgICAxMjIsICAtMzA0MCwgICAgLTI3LCAgICAtNDYsICAgLTEyMSwgICAgICAxLCAgICAgMzcsICAgICAgMCwKKyAgICAgICAtNjAsICAgICAgMiwgICAtMTAwLCAgIC0xNTIsICAgLTIxOCwgICAgMTc1LCAgIC00MDYsICAgIDE3NSwKKyAgICAgIC0xOTMsICAgICA2OCwgICAtMjA4LCAgICAtMjMsICAgLTIzMCwgICAgMjIxLCAgIDMzOTcsICAgICA0NSwKKyAgICAgICAgNDgsICAgICAzNywgICAgMzM3LCAgICAgMTEsICAgICAxNSwgICAgLTY5LCAgICAgLTQsICAgIC04MiwKKyAgICAgICAgNTMsICAgICAzMywgICAgLTU2LCAgICAgNzUsICAgIC05OCwgICAgLTY5LCAgICAtMTEsICAgIC0xOSwKKyAgICAgICAtMTIsICAgICA4MSwgICAgLTUyLCAgIDU0MjgsICAgIDEyMSwgICAgIDgyLCAgICA0NjUsICAgICAxMCwKKyAgICAgIC0yMjksICAgIDEyNiwgICAgIDMyLCAgICAxMTksICAgIDQzOSwgICAgMTI2LCAgIDE5OTYsICAgIC04NSwKKyAgICAgICAtODEsICAgIC01NywgICAgIDg4LCAgICAyMzIsICAgIDEwOCwgICAgLTIyLCAgICAtMjQsICAgICAyNywKKyAgICAgIC0xMzYsICAgICA5MSwgICAgLTMyLCAgICAgMTgsICAgIDIyNiwgICAgLTMzLCAgICAgMTUsICAgIDExNywKKyAgICAgICAxNDUsICAtNzczNywgICAgICA5LCAgICAgNTgsICAgLTEwMiwgICAtMTEzLCAgICAgMjYsICAtMjE3NCwKKyAgICAgICAgMjgsICAgLTQyMSwgICAgLTExLCAgICAtNzAsICAgIC0yMywgICAgLTcwLCAgIC0xMTksICAgIC05NiwKKyAgICAgIC0xMzMsICAgIDIwOCwgICAgIDIwLCAgLTM3NTAsICAgIC0xNCwgICAgIDIzLCAgICAgNDEsICAgLTE4MCwKKyAgICAgIDIwOTcsICAgLTEwMywgICAtNTk5LCAgICAxNDYsICAgIDI1MSwgICAgLTc3LCAgIC01NTcsICAgIC03NiwKKyAgICAgICAtOTYsICAgICA2OSwgICAgMjY2LCAgICAzMTYsICAgICA3NCwgICAgLTE3LCAgIC0yMjcsICAgIDIyMywKKyAgICAgICAgMzMsICAgLTI2MSwgICAgMTM1LCAgIDgxMjYsICAgIDI1MCwgICAgIC01LCAgICAtNTcsICAgICAzNSwKKyAgICAgICAzODIsICAgIC00NCwgICAgMTM2LCAgICAgODEsICAgICA0MiwgICAgLTgwLCAgICAxNzksICAgIC03MywKKyAgICAgICAtNzUsICAgIC01NywgICAgMjc0LCAgICAtMTUsICAtMzE0MCwgICAzMjM2LCAgICAxOTYsICAgIDE1MCwKKyAgICAgICAtNTEsICAgIDIyMiwgICAtMTkwLCAgICAgMTMsICAgICA4MywgICAtMzEzLCAgIC0xNDksICAgICA4OSwKKyAgICAgIC0yODEsICAgIC0xMiwgICAgLTQyLCAgICAyOTMsICAgIDU2NywgICAgIDE5LCAgICAtNDMsICAgIDE0NiwKKyAgICAgICAxMDIsICAgIC0zOSwgICAzNjY2LCAgICAgOTUsICAgICA3NiwgICAgIC0xLCAgICAgMTIsICAgICAyNywKKyAgICAgICAgIDcsICAgICAtNSwgICAgMjYxLCAgICAxMzIsICAgLTIxNSwgICAtMjk1LCAgICAtNTEsICAgIDQ5NiwKKyAgICAgICAgNzcsICAgIDEwMCwgICAgIDE2LCAgIC0yODUsICAgIDY0OSwgICAgLTk1LCAgICAyODAsICAgICA3NywKKyAgICAgICAxMjEsICAtMjY3NiwgICAgIDI1LCAgLTExNDgsICAgMjkxMiwgICAtMzQxLCAgICAtOTEsICAgMjM4MCwKKyAgICAgICAtODAsICAgICAtNiwgICAgMjY5LCAgICAtMzQsICAgLTY4NiwgICAtMjA4LCAgICAgMTksICAgIDIyOCwKKyAgICAgICAgMjQsICAgICAtNSwgICAtMTUwLCAgICAgMTEsICAgIDIxNCwgICAtMzE2LCAgIDExODcsICAgIDU5OSwKKyAgICAgICAtNjIsICAtMjI3NCwgICAtMjQwLCAgICAgNDgsICAgIC04NiwgICAgIDg3LCAgICAgODYsICAgIDQ3NywKKyAgICAgIDM4MzIsICAgICA2NywgICAgMTM1LCAgICAgNjgsICAgIDc0NywgICAgMzM5LCAgICAzODUsICAgLTI1NSwKKyAgICAgIC0yMjQsICAgIDE4NCwgICAgIDcwLCAgICAxNzEsICAgLTEzNCwgICAyNjA0LCAgIC0yMzEsICAgICA3MiwKKyAgICAgICAxNzAsICAgICA1MSwgIC0yNzg1LCAgIC01ODAsICAgIC04NiwgICAtMzkzLCAgICAtNjMsICAgIC03OSwKKyAgICAgIC0xNTEsICAgIDMzNCwgICAgIDc4LCAgICAzMjksICAgLTI3OCwgICAgMTAyLCAgICAtMjYsICAgIC01NSwKKyAgICAgLTM1MzEsICAgLTM3OCwgICAtMjQ3LCAgICAxNzYsICAgLTIwMiwgICAgMTQ3LCAgICAxNjksICAgICA4NywKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMDgwOHNzMFtdID0geworICAgICAtMTg3MiwgICAtMzMyLCAgLTEzMTEsICAgLTUxMiwgICAtOTM0LCAgICAtMTEsICAgIDExMiwgICAgMzg5LAorICAgICAgLTE4OSwgIC0xNTEzLCAgIDE1MDgsICAtMTA4MSwgICAgMTg1LCAgICAtODcsICAgMzA5MiwgICAgNTI5LAorICAgICAgLTE2NiwgICAtMTcxLCAgLTE2NDgsICAgMjU0NCwgICAyMTQ0LCAgIC0yNTksICAgLTY4OCwgIC0xMTEzLAorICAgICAgIC03MSwgICAgMzg3LCAgIDExOTQsICAgLTczMywgICAgMTc1LCAgICA4NTYsICAgLTk3NiwgICAgMjY4LAorICAgICAgIDU4OSwgIC0xNzczLCAgIC00MjYsICAgLTEwOSwgICAxMjEwLCAgIC00ODYsICAgIDI5NywgICAgMTk1LAorICAgICAgLTk5MSwgIC0xNTQzLCAgIC00MzIsICAgMTE5MCwgIC0xMDg5LCAgIC01MzEsICAgLTQyMSwgICAgIDgwLAorICAgICAgLTIyNSwgICAgMzU0LCAgIC0yMzEsICAgLTY3MCwgICAtMjk5LCAgLTM2OTQsICAgLTUxMCwgICAtODgyLAorICAgICAgICAzMSwgICAyODA0LCAgICA0NzYsICAgLTQ3OCwgICAxODk3LCAgICA2ODYsICAtMTA2NiwgIC0xMjIyLAorICAgICAgLTg4MiwgICAtMzc0LCAgIC00MjcsICAtMTQ2NCwgICAgOTU3LCAgICA1NDksICAtMTIxMSwgICAtMjA0LAorICAgICAgLTIxOCwgIC0xNDEyLCAgIC01NDUsICAgLTk2OCwgICAgOTQzLCAgIC0zNDIsICAgICA4MCwgICAtMjgxLAorICAgICAgLTI0OSwgICAtOTY4LCAgIDM0MjQsICAtMjM0MiwgICAtMjEyLCAgICA5NDksICAgLTE2NywgICAtMjcxLAorICAgICAgIDYwNywgICAtODM4LCAgIC00MTgsICAgLTg5MSwgICAtMzk4LCAgIC04NzcsICAgIDEzOCwgICAxNjUzLAorICAgICAtMTAzNCwgIC0yNTE1LCAgLTEzNjMsICAtMTUzNSwgICAtMzY0LCAgICA0MzIsICAgLTMyNCwgIC0xMTIwLAorICAgICAgMTUzMSwgICAgNDA3LCAgIC02OTgsICAgIDM5NiwgICAgMzI1LCAgIDE0MzIsICAgIDY0NiwgICAyNzc3LAorICAgICAgIDE3NCwgICAtODM2LCAgIC02MDUsICAgMjI1NywgICAxMDg2LCAgIC04ODgsICAgIDM0OCwgICAgIDM2LAorICAgICAgIDUxMywgICAyMjI5LCAgIDE1NDMsICAgMTI5MywgICAgIDk0LCAgIDI0NDQsICAgLTU3NCwgIC0xMDMwLAorICAgICAgIDkzMywgICAgIC05LCAgIC02NjgsICAgIDU1NSwgICAgMzQ2LCAgICA1MTEsICAgIDcxNSwgIC00MDMzLAorICAgICAgIDQwOSwgICAtMjk5LCAgIC0xNjYsICAgIDcwMCwgICAtNTYwLCAgICA5NTAsICAtMTI2NSwgICAtMjQ1LAorICAgICAgMTQxOCwgIC0xMzYyLCAgICAtMjAsICAgIDg3MCwgICAgMTUyLCAgICA5NDIsICAgLTMzMSwgICAgLTY2LAorICAgICAgIDIyNywgICAtMTg2LCAgICAyNTEsICAtMzYzMiwgIC0xMDU3LCAgIC05ODksICAtMTc5OCwgICAgOTIzLAorICAgICAgIDU0MiwgICAtNjMwLCAgIDI4ODksICAgLTEyOCwgICAxNDc1LCAgICAtOTcsICAgLTk2NCwgICAtODYwLAorICAgICAgIDUzNCwgICAtMjE3LCAgIC03NDYsICAgIDE4MSwgICAgMzIxLCAgLTEwMDcsICAgMjU5NSwgICAtNDExLAorICAgICAgMTI5OCwgICAgNjM1LCAgICAzMTAsICAgMTk1NSwgICAgLTE3LCAgICA4NDYsICAgLTgyNCwgICAgLTExLAorICAgICAgLTk1MiwgICAgMjA4LCAgICAzMjgsICAgLTU0NywgIC0xMDg2LCAgIDE0ODEsICAgLTI2NCwgIC0xNTc0LAorICAgICAgMzU3OSwgICAgNTAwLCAgICAyNDIsICAgMTAzOCwgIC0xMDMwLCAgICAzNTMsICAgIC03NSwgIC0yMTAwLAorICAgICAgLTM0NywgICAyNjYyLCAgLTIzNzgsICAgIDI2MSwgICAgMjEwLCAgLTExNTEsICAgIDUyNSwgICAgMjkxLAorICAgICAgIDM2OCwgICAtMjAwLCAgIC03MDIsICAgIDEwNSwgICAtMTQwLCAgICAtODEsICAgIDY2MywgICAtNzE2LAorICAgICAgIDMzNCwgICAxMjIwLCAgICAyMzksICAgICAyMSwgICAgMTE0LCAgICAzMDEsICAtMTg5OCwgICAzNjQ3LAorICAgICAgLTMwMiwgICAgNTUwLCAgIC00ODksICAgLTQ4NCwgICAtODUzLCAgIC0yNzQsICAgMTUwOSwgICAtNDE5LAorICAgICAgLTMzMCwgIC0xMTIxLCAgLTI2NjYsICAgMjUwNywgICAtNjIxLCAgIC04MTgsICAgMTE4OCwgICAgLTY5LAorICAgICAgLTg4NSwgICAgMjMxLCAgICAzMTYsICAgMTgzNywgICAtNzQwLCAgIC0xODcsICAgLTEwMiwgICAxMTQ4LAorICAgICAgMTIxOSwgICAtMTIzLCAgICA4NTIsICAgMTE1NCwgICAgIDI3LCAgICAxMzksICAgLTM0NCwgICAtNDA0LAorICAgICAtMTEzMywgICAgNDI1LCAgICAzNTMsICAgIDE0NSwgICAtMTIzLCAgICAxNzksICAgICA0OSwgIC01ODM2LAorICAgICAgLTU3MSwgICAgIDM5LCAgICAyNzQsICAgIC0zOCwgICAtNDU3LCAgICAxNzIsICAgIC04MCwgICAgNTkzLAorICAgICAtMTk3NywgICAtMzMxLCAgIC00MjEsICAgMTk2NSwgICAxNzY4LCAgIC0xMTMsICAgICA2NCwgICAyMjcyLAorICAgICAgIDQ3NSwgICAyMTY1LCAgICAyMTAsICAgIDg3MywgICAtODE5LCAgICA3NTcsICAgLTExOSwgICAtNTMwLAorICAgICAtMTQzMSwgIC0yMTY3LCAgLTE1MTcsICAgLTg2NCwgICAxMDYwLCAgIC03NTIsICAtMTM2NiwgICAyMzQ5LAorICAgICAgLTY3MSwgICAxMTgwLCAgIC0xNzksICAgICAxMCwgICAtNDUwLCAgICA3ODEsICAgLTc5OSwgIC0xMzAzLAorICAgICAgLTM5MywgICAgLTYxLCAgIC0xMTMsICAgMjA1MywgICAtNTUwLCAgIC04NDMsICAgMTAyOCwgIC0yMDQ0LAorICAgICAtMjYzMSwgIC0xMzg4LCAgIDEwNzgsICAgIDE3MSwgICAgNTE3LCAgICA0OTYsICAgLTkyOCwgIC0xNjk1LAorICAgICAgIDI5OCwgICAgNzA4LCAgIC01NTcsICAgIDEyMiwgICAtOTE3LCAgIC0xOTcsICAgLTQyMywgICAxMTQyLAorICAgICAgIDExNiwgICAtNTI4LCAgIC01ODUsICAgLTQ3MCwgICAgNDgwLCAgICA0MDAsICAgNDYwNSwgICAgMzg0LAorICAgICAgLTE0MiwgICAgIDU3LCAgLTIzNDAsICAtMTUwNywgICAgLTY3LCAgICA5MDcsICAgODE5MiwgICAgMzU2LAorICAgICAgIC0xOCwgICAtNzA0LCAgICA1MjgsICAgIC0zMiwgICAtMzc5LCAgIC02MTEsICAgIDQxOCwgICAgNzAzLAorICAgICAgLTM5NiwgICAgNTMxLCAgICAxNTUsICAgIDY0MiwgICAgNjc4LCAgIC00MjcsICAgICA4NSwgICAgODE0LAorICAgICAgIDIxMiwgICAgODQ1LCAgIC01NzksICAgLTU5MCwgICAtNDU2LCAgICAxMDMsICAgLTYyNCwgIC00NTQxLAorICAgICAgLTMwNiwgICAgNjM4LCAgIC03NjAsICAgICAzNiwgICAtMTQ5LCAgIDE5MjksICAgMTIyOSwgICAtNzE3LAorICAgICAgLTU0MywgICAgNTMwLCAgIC02OTQsICAgIDE2OSwgIC0yOTk2LCAgICA0MjMsICAgLTM0NiwgICAtODk3LAorICAgICAgMTA3NywgICAgMjU1LCAgLTEwNTQsICAgIC02MywgIC0xNzczLCAgIC00NzksICAgIDQ3OSwgICAtNzAxLAorICAgICAgMTU0NywgIC0xNjgzLCAgIC0zNDIsICAgLTkyNiwgICAgMTEyLCAgIC02NjMsICAgMTYzOCwgICAgIC05LAorICAgICAgMjU4NywgICAgMzExLCAgIC01NjEsICAgLTkzMiwgICAtNTM5LCAgIC0zMzUsICAgIDU4OSwgICAgNzc5LAorICAgICAgMjM0NSwgICAtNDMyLCAgICA3ODgsICAgLTk2NywgICAgMzE5LCAgICAgLTQsICAgIDE5MiwgICAtNTg4LAorICAgICAgLTEwMywgICAgMzU3LCAgLTM1MDgsICAgLTI1NywgICAgNzA3LCAgIC00NzMsICAgMTUyMSwgICAgIC05LAorICAgICAgIDEzMCwgICAzMjkwLCAgICAyNzQsICAgLTI5NiwgICAtODAyLCAgIC0xMzksICAgLTgxNCwgICAgLTE5LAorICAgICAgIDk3MSwgICAgODQ5LCAgICAyNTMsICAgIDQ4NiwgICAgIDQwLCAgLTEyMTYsICAgMTE3OSwgIC0xNzcyLAorICAgICAgLTk5NiwgICAxNDAwLCAgICA4MzgsICAgMTk1NSwgIC0xNDMyLCAgLTE5MjUsICAgMjMyNCwgICAgNzY3LAorICAgICAgIDg5NiwgICAxMzE0LCAgIDM0MDcsICAtMTAwMywgICAtNTUyLCAgIC05NjcsICAgLTE2NiwgICAgLTI2LAorICAgICAgMTA5OSwgIC0xOTY1LCAgICAgIDksICAgIDIzOSwgICAgLTEwLCAgIC0yNDMsICAgIDg2NCwgICAxMjUxLAorICAgICAgICA5MSwgIC0yMjc5LCAgIC02OTEsICAgLTU0MiwgICAtNDczLCAgLTE5MDgsICAtMTIwOCwgIC0xNDQ3LAorICAgICAgLTg5MSwgICAtMzExLCAgLTExMzYsICAgMTYzOCwgICAxMTUwLCAgICA1ODYsICAgMTY1NiwgICAgMjYwLAorICAgICAgIDUzOCwgIC0xNzQ2LCAgIDE0NjAsICAgLTQ3OCwgICAtODYwLCAgICAyOTcsICAgLTYwNSwgICAtMTM5LAorICAgICAgIDgyMiwgIC0zNzE4LCAgIC0xOTQsICAgIDMwNywgICAgNjA5LCAgICAgMzAsICAgMzQxOCwgICAgMjI2LAorICAgICAgLTMzOCwgICAgMTYxLCAgIC0zODcsICAgLTM0NCwgICAtNDcyLCAgICAzNTQsICAgLTE3MCwgICAtNDIxLAorICAgICAgIDQzMywgICAgNjAxLCAgLTE0NDYsICAgIDgyMSwgICAgLTQ4LCAgICAtMzEsICAgIDQ5MywgICAgOTE2LAorICAgICAgLTM0NywgIC0zNzQwLCAgIC04OTksICAgMTM4OSwgICAtMzU1LCAgICAgNzEsICAgIDM4MiwgICAtNjQ0LAorICAgICAgIDQ4NSwgICAgMjE4LCAgICA5NzUsICAgLTU0MiwgIC0zMTkxLCAgICA3NDIsICAgLTEwMiwgICAtNzgzLAorICAgICAtMTYwNywgICAgNDczLCAgICAxOTYsICAgMTY5MiwgICAgLTcxLCAgICAyNTgsICAgMjQ0NiwgICAxNTA3LAorICAgICAgLTk2OCwgIC0xMDI1LCAgLTEwODcsICAgIDYzNywgICAtOTIxLCAgLTE0MDUsICAgMTE5MiwgICAgLTg4LAorICAgICAgMjA0NCwgIC0xODEzLCAgICA5MjIsICAgIDE1NiwgIC0xMDk2LCAgIDEwMDcsICAgLTY5NSwgICAtNDg1LAorICAgICAtMTAxNSwgICAtNDY4LCAgIC0zMTYsICAgMTgyNSwgICAgMTkwLCAgIDIxMzIsICAgLTIwNSwgICAtMjE4LAorICAgICAtMzU1NiwgICAtMjg2LCAgLTEzNTAsICAgLTIxMiwgICAtNjM0LCAgICAxMjAsICAgIDQxNywgICAtMzExLAorICAgICAgIC05MCwgICAgMjE5LCAgICA4NzAsICAgLTMzNCwgIC0xMzA0LCAgICA1MjMsICAgIDk5OSwgICAtMTQ0LAorICAgICAgICA5OCwgICAyMTU3LCAgICAyMDUsICAgICA0NSwgICAtMjQ3LCAgIDE0MDEsICAgMjQyMywgICAgMjc4LAorICAgICAgLTc2NiwgICAgLTY2LCAgICAzMDksICAgLTEyMSwgICAgMzE2LCAgIC01NDMsICAtMzQxOCwgICAgOTMyLAorICAgICAgLTgwMywgICAgNjM3LCAgICA0MzYsICAtMjM0MSwgICAyMDE2LCAgICA5MjgsICAgLTgzNiwgIC0xMjEyLAorICAgICAgIDcwMiwgIC0xMTc5LCAgIC01NDQsICAgICAgNiwgIC0xNDI5LCAgIDEwMTQsICAgIDQ2NCwgICAxMTY2LAorICAgICAgIDU4MSwgICAtMjkxLCAgICAxMzYsICAgICAgMCwgICAgOTgzLCAgIC03OTksICAgIDY5MywgICAtMjMwLAorICAgICAgLTcyNywgICAtMTg2LCAgIC0zMTAsICAgIC03NiwgICAgNjk4LCAgICAgLTYsICAgLTY2MCwgICAgNzYyLAorICAgICAgIDgxNCwgICAgNDUxLCAgIC0zMjgsICAgNDQ2OSwgICAtNDU0LCAgICAgMTQsICAgLTQyMywgICAtMTE2LAorICAgICAgLTEzNCwgICAtNTY4LCAgIDE1MzUsICAgLTU2MiwgICAtNjI5LCAgIC0yNjksICAgIDgyNiwgICAgMzgwLAorICAgICAgICA2OCwgICAgMjgyLCAgIC00MDksICAgIDY0MCwgICAtMzg0LCAgICAyMTgsICAtNTcwMiwgICAtMjgwLAorICAgICAgLTYzOCwgIC0yNTg2LCAgIC01NTcsICAgLTg3NywgICAgIDQ5LCAgICA2NDgsICAgIDQzNCwgICAxMTc4LAorICAgICAgMzQ0MiwgICAgODgzLCAgICAtNzgsICAgMjAyNCwgICAtMjUzLCAgIC0yMTAsICAtMTA5MCwgICAgMTk4LAorICAgICAgIC02NywgICAgLTUyLCAgIDMyMjYsICAgLTY3MSwgIC0xNjA2LCAgICAgNDksICAgMTc3NSwgICAtNDIyLAorICAgICAgLTE3MywgICAgMzA5LCAgIC03MjAsICAgLTY2NywgICAtNTA1LCAgIDIwNzMsICAgLTY3OCwgIC0xMTUyLAorICAgICAgLTIzMSwgICAtNTE5LCAgIC03MTksICAgIDQyMiwgIC0yNjE0LCAgIC0zOTQsICAgIDU0MywgICAtOTkzLAorICAgICAgMTQ0OSwgICAgNDM3LCAgIC00NjMsICAtMTI4NiwgICAxMTkxLCAgLTEyNzQsICAgLTcxMCwgICAtNDYzLAorICAgICAgIDY1OSwgICAxNDkzLCAgICAgNDUsICAgLTgzMiwgICAtNDE0LCAgICAzMDYsICAgICA5NCwgICAxMjg0LAorICAgICAgLTY2OSwgIC0xMzEyLCAgIDEwODIsICAgLTkxNywgICAyNDg5LCAgIC00OTQsICAgIDU0NywgICAgNzM4LAorICAgICAtMTY5NiwgICAtMTc0LCAgICAyODIsICAtMTQ0MiwgIC0xNDU1LCAgIDE2MzMsICAgIDkxMiwgICAtNDI4LAorICAgICAgIDk2NCwgICAgIDEyLCAgLTI0MDQsICAgLTQ4NSwgICAgNjMxLCAgIC0zMTEsICAgMTgxMCwgICAyOTEyLAorICAgICAgIC0xNiwgICAgNTc2LCAgICAgNTAsICAgLTkyNywgICAtMTc1LCAgICAgMzcsICAgIDY3MywgICAtMjAxLAorICAgICAgIDk5NSwgICAgNjg0LCAgIC0yNDQsICAgLTI1MSwgIC0xNDQ0LCAgIDMxOTUsICAgMTg2MywgICAgLTg4LAorICAgICAtMTE4MywgICAtOTY2LCAgIDE3NjksICAgICAzNiwgICAtODI1LCAgICA3NjYsICAgIDQ4OSwgICAgLTg2LAorICAgICAgLTM2NSwgICAtMTA2LCAgLTE0NzcsICAgLTMzMCwgICAgMTI1LCAgIC0yNTMsICAgLTI1MCwgICAtNTIzLAorICAgICAgLTczMSwgIC01MTMwLCAgICA2NTMsICAgIDM5NSwgICAgIDk5LCAgIC04NDUsICAgLTcyMSwgICAgMTI3LAorICAgICAgLTI4NywgICAgODUwLCAgICA0NzksICAgICAyNSwgICAgLTMwLCAgICAgMzYsICAgLTc4MiwgICAgNjExLAorICAgICAgIDQ0OCwgICAgIDk5LCAgICA5MzMsICAgIC0yMCwgICAtODUzLCAgIC05NDksICAgLTI4NiwgICAtMzc5LAorICAgICAgLTY1NCwgICAtMzg1LCAgIDEyOTgsICAgIDU0NywgICAgMjM1LCAgIDEyNDIsICAgLTU4MywgIC00MTQ3LAorICAgICAgICA4MSwgICAtNTQ3LCAgLTExNDIsICAgMTI4MCwgICAtMjIzLCAgLTE3MTIsICAtMTUwMSwgICAgNDU4LAorICAgICAgLTE0MiwgICAyMDY1LCAgICAyMDgsICAgIDg1NSwgIC0xMTE1LCAgIC0xODcsICAgIDg2MSwgICAxMDkwLAorICAgICAgLTc2MCwgIC0yNTUxLCAgIDIzMjYsICAgLTM3OCwgIC0xMjA1LCAgICA0ODgsICAgLTI0MSwgICAgODkzLAorICAgICAgIDExMywgICAgMTc2LCAgIDQwNjAsICAgLTIyNSwgICAgLTQxLCAgIC03MTcsICAgIC0yNiwgICAtNDQyLAorICAgICAgLTQ0NSwgICAtMzEyLCAgICA4MTMsICAgIDQ5NCwgICAgMzE0LCAgIC0yMTAsICAgIC05OCwgICAtNzg4LAorICAgICAgIDI1NSwgICAgNjMyLCAgIC01MDYsICAgIDE2NiwgICAtNzA0LCAgIC0zMzQsICAgLTIxNCwgICAtODYwLAorICAgICAtNTI4MSwgICAgIDYwLCAgICAtMzQsICAgLTIzOCwgICAtMTQ3LCAgICA2NDMsICAgIDUyMCwgICAyMDM4LAorICAgICAgICAyOCwgICAyNDMzLCAgLTE2OTQsICAtMTMxNiwgICAtNjE1LCAgICA1NzIsICAgLTE1MCwgICAtMTA3LAorICAgICAgIDM0OSwgIC0xNzYzLCAgIC0zMDcsICAgICA3OCwgIC0xMTI0LCAgIC02MzEsICAgMTE2MiwgICAtMzI2LAorICAgICAgLTI3NywgICAtNTkxLCAgICA1NTgsICAgMTAxNiwgIC00NjY4LCAgIC0zMjQsICAgLTgxNSwgICAtMjUxLAorICAgICAtMTI4NCwgICAgIDUyLCAgICAyOTQsICAtMTI4MywgICAgNTk4LCAgICA2MzAsICAgLTM0NSwgICAgNjQxLAorICAgICAgIC0zNCwgICAxMDg1LCAgIDQyNDcsICAgIDYzNywgICAxNjk1LCAgIC04NTgsICAgIDIxMiwgICAtMjQzLAorICAgICAgIC02NCwgICAgMzI3LCAgICA1NTcsICAgIDQyNiwgICAtMzIxLCAgICAzNjMsICAgLTY1MiwgICAgMzcyLAorICAgICAgIDc3NywgICAtNTY3LCAgIC03NDksICAtMTcwNCwgICAgNDE0LCAgIDUyOTksICAgIDM4OSwgICAgMjQyLAorICAgICAgICAzOSwgICAgIDMxLCAgIC0zMTUsICAgIDE3OSwgICAtMTAyLCAgICAgMTEsICAgICA2MiwgICAgMjQ4LAorICAgICAgIDU1NywgICAgNzA2LCAgICAzNTksICAgIC04NSwgICAgMzAzLCAgIC00MDMsICAgMTUzMSwgICAgNDA5LAorICAgICAtMjA5MiwgICAgMTQ0LCAgLTEzNTQsICAgICA1NCwgICAgLTQ4LCAgICAgNTEsICAtMTc4NywgICAxMjc4LAorICAgICAgIDk0MiwgICAxMjY0LCAgLTE0OTUsICAgMTY3MSwgICAgIDkyLCAgIC04OTksICAtMTE0OSwgICAxOTA4LAorICAgICAgLTkwMywgICAtNTk2LCAgICAzNDIsICAgMTc0OSwgICAtODI1LCAgICAtMTMsICAgIDUwOSwgIC0xMTYzLAorICAgICAgMTA2NSwgICAyNDA1LCAgIC0yNTMsICAgLTc0MSwgICAxMDk5LCAgIC01MjgsICAgMjk3MSwgICAtNDEyLAorICAgICAgLTIzNSwgICAtODY5LCAgIC0xMzYsICAgLTM1MiwgICAtNDg5LCAgIC0zODQsICAgIDc0NSwgICAtMzk4LAorICAgICAtNDE5NywgICAgIDg0LCAgIDExNTIsICAgLTQ5NywgICAgOTU1LCAgIC0xNjEsICAgIDQ2MSwgICAgLTE2LAorICAgICAgLTg3MSwgICAgODAxLCAgICAtOTMsICAgIC0xNSwgICAtMzUyLCAgIDE4MjYsICAgLTQ5MCwgICAtNTM2LAorICAgICAtMjg1MywgICAtNjMzLCAgICAxMjgsICAtMTUzNywgIC0xNjcwLCAgICA1MzgsICAgIDc4OCwgICAxMjc2LAorICAgICAgIDU1NCwgICAtMzQwLCAgICA1NjUsICAgMTIxNiwgIC0xNzU4LCAgICAzODQsICAtMTMxMywgICAtNjI4LAorICAgICAgICAyNCwgICAgODM1LCAgIC04NjIsICAgLTkyNywgICAxNzkyLCAgLTEwNDIsICAgIDIwOSwgICAtNzg0LAorICAgICAgIDgwNywgICAtMzgzLCAgLTEzOTksICAgMzUzMSwgICAgIDUyLCAgIC01MzcsICAgIDIwNSwgICAtMjcxLAorICAgICAgMzA3MSwgICAxNjc4LCAgIC02OTQsICAtMjMxMywgIC0xMjc5LCAgLTE2NTYsICAgLTQyOCwgIC0xMDYzLAorICAgICAtMTU3NiwgICAtMzIzLCAgIC0zNDIsICAgLTI1NywgICAtMjI3LCAgIC03MTYsICAgLTQ1OCwgICAxMTYxLAorICAgICAgLTE4MCwgICAgLTcxLCAgICAtNDAsICAtMTI3NiwgICAxNzc4LCAgLTMxMjMsICAgLTM3OCwgIC0xMzYzLAorICAgICAgLTgyNywgICAgODgwLCAgICAyNzUsICAgLTI3NCwgICAtNTgxLCAgIC0xODYsICAgICAtOCwgICAgNjYxLAorICAgICAtMTExNCwgICAtMTk5LCAgIC0xNzEsICAgIDM3OSwgICAgNDI5LCAgLTE1NTEsICAgMTY0NSwgICAtODU3LAorICAgICAgLTE2MywgIC0yNjIzLCAgIDEyMTcsICAgMTQ1OCwgICAtNTk2LCAgICAtNjgsICAgIDM4MywgICAgOTczLAorICAgICAgLTQ4NSwgICAtMzU0LCAgIC01OTcsICAtMjg3NSwgICAtNTE2LCAgICAyMzQsICAgIC04MywgICAgMzQwLAorICAgICAgLTM5NiwgICAxMzY1LCAgIC01NzQsICAgLTgxNiwgIC0yMDg2LCAgLTEwNTksICAtMTU4OSwgICAtNTkzLAorICAgICAgLTc3OSwgICAgMzM0LCAgIC01NDYsICAgICA0OSwgIC0xMDY1LCAgLTE5NTksICAgMTczNiwgICAxMTM0LAorICAgICAgIDE4NywgICAxODMzLCAgICAgMTcsICAgIC04MiwgICAgIDY4LCAgICA4MDMsICAgLTQ1NiwgICAgLTg5LAorICAgICAgMTc2MCwgICAgODM2LCAgIDE1NzAsICAgIDEyMiwgICAtOTg1LCAgIDI1NDksICAgMTYxNiwgICAgIDgyLAorICAgICAgMTEwMiwgICAgMjI3LCAgICAyMjIsICAtMTIzNiwgICAtMTU1LCAgLTEwMTIsICAgIDYzMywgICAgNDY3LAorICAgICAgIDE2MywgICAgNDQ1LCAgICAxNjYsICAgIDc2NiwgICAtMjUzLCAgIC0zNDcsICAgMTA0MSwgICA1MTIxLAorICAgICAgIC0yMSwgICAgNzkyLCAgICAgODEsICAgLTQ3OCwgICAgMTI4LCAgIC0xNTgsICAgIDMxNiwgIC0xMTgwLAorICAgICAgLTM3MiwgICAxNjkyLCAgIC04MjgsICAgIC0zMSwgICAxMTIyLCAgLTI1ODMsICAgMTM0NiwgICAyNDgzLAorICAgICAgIDE5NSwgICAgIDcyLCAgICA1NDksICAgIDQyNCwgICAgOTQ3LCAgIC00NzAsICAgMTk0MCwgICAgLTc1LAorICAgICAgIDUwNSwgICAxMzc3LCAgICA1NTAsICAgICA1OCwgICAxNzg1LCAgICAzNDMsICAgLTgxNywgICAgODc0LAorICAgICAgMzQ4MywgICAtMzA3LCAgIC01NzYsICAgIDI0MCwgICAgIDM1LCAgICA4MzcsICAgLTcxNywgICAtMjQ3LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IwODA4c3MxW10gPSB7CisgICAgICAyMzI4LCAgICAxODMsICAgMTY1MiwgICAtOTA3LCAgLTMwMDUsICAgMTMyOSwgICAgLTYxLCAgIC00NjUsCisgICAgICAgICAwLCAgIC00NTMsICAtMTYyMSwgICAgMjIzLCAgICAyMzIsICAgIC01OSwgICAgMjU0LCAgIC0zMTIsCisgICAgICAtMTE3LCAgICAtNTksICAgLTQ3NywgIC0yNjQ4LCAgLTExNzYsICAgLTIyNywgIC0xOTM3LCAgICA5NjIsCisgICAgICAgMTQxLCAgLTE0ODksICAgIDg0OSwgICAgIDkzLCAgLTEyODQsICAgMTAwMCwgICAgMjk1LCAgICAxOTIsCisgICAgICAtMTM5LCAgIC00NjgsICAgLTczNiwgICAtNDM2LCAgIDIxNTUsICAgIDM3MSwgICAyNDc1LCAgIC0zNDgsCisgICAgICAgODU2LCAgLTE5ODUsICAgICAzOCwgICAgIDk0LCAgICA0OTYsICAgIDc1OCwgICAgOTU0LCAgIC0yNDMsCisgICAgICAgMTM0LCAgLTE3NTksICAgIDQ5MSwgIC0xNDA2LCAgIDExMTQsICAtMjU1NCwgICAtNDQ3LCAgIC02OTIsCisgICAgIC0yMTI4LCAgICAgNDQsICAgLTkyMywgICAxNjEwLCAgICA3ODcsICAgIDE1MCwgICAtNTAwLCAgIDM0NDIsCisgICAgICAtNjk4LCAgICAyNzYsICAgLTUxNywgIC0xNTU1LCAgICAzNzksICAgIC03MiwgICAgODEwLCAgLTEzNzMsCisgICAgICAyODk3LCAgICA5MzYsICAgLTU4NiwgICAtNDM4LCAgICA5MjUsICAgMTg4MSwgICAtNDE5LCAgICAyMTEsCisgICAgICAxNzI0LCAgICA3MjEsICAgIDg4NSwgICAgNjE0LCAgICAyNTMsICAgIDYxMywgIC0xNDQwLCAgICA1MDksCisgICAgICAgODQyLCAgLTI0MDcsICAgLTIxNiwgIC0xNzY1LCAgICA0NTEsICAgMTQxOSwgICAgNTk5LCAgICA2ODksCisgICAgICAxNDczLCAgIC0xNzUsICAtMjk3NCwgIC0xMDE1LCAgIDE5ODMsICAgIC02OCwgICAgNjQwLCAgICAgMjEsCisgICAgICAgMTQwLCAgLTEyOTUsICAgLTU1NiwgICAgLTg5LCAgIC04MzYsICAgIDcxOCwgICAtMzQzLCAgLTE5MDMsCisgICAgICAgNDQzLCAgICA1MDIsICAtMTA2NCwgICAxMzI4LCAgICAgODYsICAgMjA0OSwgICAxMjM1LCAgICAxMzAsCisgICAgICAgODkyLCAgIDExMDUsICAgIDY5MiwgIC0yOTY4LCAgIC03NTUsICAgIDQ3MywgICAgNDIzLCAgLTEzNzEsCisgICAgIC0yMDMyLCAgIDE4ODUsICAgIC0yOSwgICAtNTE2LCAgLTExMTgsICAgIDI4NSwgICAgNDgyLCAgICAxNjQsCisgICAgIC0xOTMyLCAgIC02ODUsICAgLTgxOSwgICAgNjk1LCAgICA3MTUsICAtMTUyMCwgICAxMzAwLCAgLTExODgsCisgICAgICAtMTIxLCAgIC0xOTcsICAtNDIzMywgICAtMTQxLCAgIDEyNzksICAgIDI5OSwgICAgMjA4LCAgIDEwNzEsCisgICAgICAgIDIwLCAgICA3NzIsICAgIDY5MiwgICAgNTMxLCAgICAyNTcsICAgIDQyOCwgICAgIDc4LCAgICAyMDIsCisgICAgICAtMzk5LCAgICAtMjcsICAgIDc5MywgICAxMTUwLCAgIC03MzYsICAgIDM4OCwgIC0xOTIyLCAgICAxNTUsCisgICAgICAtNDEwLCAgICAgODUsICAgMTEzNSwgICAgODM1LCAgICAxMzMsICAgIC04OCwgICAgIDY1LCAgICAgNjIsCisgICAgICAtNTM0LCAgIC0xMzYsICAtNDU5MCwgICAtMTYyLCAgIC05NjgsICAgMTM3OCwgICAtNDQ1LCAgLTI4MjUsCisgICAgICAgLTkzLCAgIC01MTksICAgIDQwMiwgICAgIDEyLCAgLTExMTAsICAgLTYzNywgICAtNzY1LCAgICAyMTAsCisgICAgIC0yMzA1LCAgICA2NTQsICAgIDQ0NywgICAgIDI2LCAgIC0yNjUsICAgIC05MSwgICAgIDcxLCAgIC04ODYsCisgICAgICAgMTI2LCAgIC0xMDksICAgICAgNywgICAgMzQ2LCAgICAgMTksICAgLTcxMywgICAtMjU3LCAgICA3NzQsCisgICAgICAxMDgwLCAgIC01NzksICAgIDE4NSwgICAgMjAwLCAgLTU2OTEsICAgIDU0MSwgICAgMjI4LCAgICA0MjQsCisgICAgICAgIDM3LCAgICA1MTIsICAgIC03OCwgICAtMjAxLCAgICA4NDgsICAgLTM2OSwgICAxMDk5LCAgLTEwMDEsCisgICAgICAgMjE0LCAgIC0zMzYsICAgIDI2NiwgICAyNTAyLCAgIDE1ODMsICAtMjEzMSwgICAtNjU0LCAgLTI0NzYsCisgICAgICAgLTk3LCAgIC03ODcsICAgLTczOCwgICAxMDU2LCAgIDEzODUsICAgIDEyNCwgICAgOTQ0LCAgLTM0MjEsCisgICAgICAxMTcyLCAgIC01NDcsICAgLTIyNiwgICAxMjQ5LCAgIDE1NTIsICAgMTE5NCwgICAtMzA4LCAgICA0ODksCisgICAgIC0xMTUyLCAgICA3NTEsICAgIC05MiwgICAtMTY4LCAgLTMxMTIsICAtMTQ1MSwgICAyMDM4LCAgICAgMzUsCisgICAgICAgMzcxLCAgLTE1ODUsICAgIDUzNSwgICAgMzA4LCAgICAgIDUsICAgIC01MywgICAgNTIzLCAgIC0xNjksCisgICAgICAgNTkxLCAgIC0xNzUsICAtMTAyOCwgICAgIDkxLCAgICA3NDMsICAgLTE0NCwgICAgMjMwLCAgIDE4MzEsCisgICAgICAtMTc3LCAgICA1MDksICAgMTI5MSwgICAxODA4LCAgLTMzMjIsICAgLTgxNSwgICAtMjI3LCAgIC00NzUsCisgICAgIC0xMDY0LCAgIC02NDcsICAgICA3OSwgICAxMjIzLCAgICAxNzQsICAgIC0xMCwgICAtNDEyLCAgICAzOTMsCisgICAgICAtMzA1LCAgIDEyMjQsICAgMTMxMCwgICAgIDEyLCAgIC01MjEsICAtMTI2NywgICAxOTExLCAgIDIyNDUsCisgICAgICAgNDA3LCAgICA3MjQsICAtMTIzMiwgIC0yMDE3LCAgICA1NjYsICAgIDUwNiwgICAtNDY3LCAgICA4MTMsCisgICAgICAgNjYwLCAgIC0xOTYsICAtMzY0MywgICAyNDk1LCAgICA4NzAsICAgLTU2MSwgICAgMjg5LCAgICA2NjIsCisgICAgICAgNjU0LCAgIC01MDgsICAgLTczNCwgICAtMzI1LCAgICA2MjIsICAgIDIyMCwgICAtMzA5LCAgIC0zMDcsCisgICAgICAtMTgxLCAgIC00NDUsICAgIDEzMSwgIC0xNjU1LCAgIC04MzUsICAgLTYzMSwgICAgODgzLCAgICAyMTEsCisgICAgICAgNzM3LCAgICA1NTIsICAgLTg4MSwgIC0zMTAzLCAgIC03NjYsICAgIDU5NSwgICAgMTEyLCAgICAxNTEsCisgICAgIC0xMTc3LCAgICA2MDEsICAgIDQ3OSwgICAgLTE0LCAgICAgMzcsICAgLTkyNiwgICAtNTA1LCAgIDEwNjIsCisgICAgIC0xNzU1LCAgIC03OTksICAgLTE3OCwgICAtNTU1LCAgIDI1MDksICAgLTY5NCwgICAtNzkyLCAgICA2NjIsCisgICAgICAgNzM3LCAgICA4NDcsICAgMTYxMSwgICAgMzk3LCAgICAtNjcsICAgLTEzNCwgICAgNDc0LCAgLTIyNTEsCisgICAgICAyNjk4LCAgIC0yNDUsICAgMjA1NCwgICAxNjAzLCAgIDEyOTEsICAgMTE4OCwgICAgIDQwLCAgICA3NjMsCisgICAgICAtMjE2LCAgIDE1NTQsICAgLTI5NywgIC0xNzY5LCAgICA0MTAsICAgMTI3MCwgICAxMDg5LCAgICA0NDAsCisgICAgICAtOTY3LCAgICAyOTQsICAgIC0zNywgICAgMjcwLCAgICA0NzEsICAgMTI4NywgICAzNzczLCAgIC0xMDgsCisgICAgICAtNjEwLCAgIC0yNzUsICAgLTI5OCwgICAgMjcwLCAgIC0zODQsICAgMjA3MiwgICAtNjc1LCAgIDEwMDIsCisgICAgICAgMTc0LCAgICAgMTgsICAgIDE3MSwgICAgNzA0LCAgIDMzMTEsICAgLTEwNSwgIC0xNzc0LCAgICAxMDgsCisgICAgICAgNTExLCAgLTMwMDEsICAgIC02OSwgICAgNTQzLCAgIC0yMjcsICAtMTE5NiwgICAxNDMxLCAgICAtNjMsCisgICAgICAgICA2LCAgIDEyNzksICAgICAtMSwgICAgNjcxLCAgICAyMzksICAtMjEyNywgIC0xOTI0LCAgIC05MzQsCisgICAgICAgMTY4LCAgIC0zMDAsICAgMTA3NSwgICAxMDcxLCAgIDMwODgsICAgLTU5MCwgICAxNDM5LCAgICAzMjksCisgICAgICAxMDczLCAgICAxMjcsICAgIDc2MiwgICAtMTMxLCAgICAyNzQsICAgIDgzNywgICAtMTM0LCAgIC02MTAsCisgICAgICAtMzk5LCAgLTE0MTUsICAgMTA0NywgICAtMTU2LCAgICA0MTUsICAgIDc2NSwgICAgNjk4LCAgICA0MjgsCisgICAgICAtNzQ4LCAgICAyNDEsICAtNDIyNiwgICAgMTUyLCAgIC04MjksICAgMTA0MCwgICAtOTM3LCAgICAxNDUsCisgICAgICAtODUyLCAgICAtODUsICAtMjk1NywgICAtMTMwLCAgIC00MDYsICAgIDcyNiwgICAgMTY4LCAgICAtMzcsCisgICAgIC0xMzIxLCAgLTEwNjksICAtMTI1NSwgICAxMTU5LCAgIDE1NzUsICAgIDU1MiwgICAgNjQ5LCAgLTE5NTMsCisgICAgICAgLTE3LCAgIDEwMjcsICAgMTA3OCwgICAtMzg1LCAgLTI3NjEsICAgLTU1MywgICAtMjAxLCAgICAgNTgsCisgICAgIC0xOTAwLCAgICAtMjQsICAgIDI4MywgICAxMjQ4LCAgICAtOTAsICAgIDQxOSwgICAxMTIyLCAgICA5MDIsCisgICAgIC0xNTQ4LCAgICAtMzIsICAgICAzNCwgICAtMzYwLCAgICA3MDcsICAgICA0NSwgIC0zNDU4LCAgIC0yNDYsCisgICAgICAgMjg3LCAgICAzMDgsICAgIDM5NywgICAgMzkzLCAgICA4MjIsICAgMTMyMywgICAtNTY1LCAgICA1MDUsCisgICAgIC0xNTUzLCAgLTE5MDIsICAgLTY3NywgICAgNjI1LCAgIDEwNzksICAgLTEzNSwgIC0yMTMyLCAgIC0xODcsCisgICAgICAtMTYzLCAgLTEwMDEsICAtMTQ3OSwgICAtOTMyLCAgIDExMzEsICAtMjU4OCwgICAtMzE2LCAgICAgNTMsCisgICAgICAxMjcwLCAgIC03NDcsICAgLTk2NiwgICAgOTgwLCAgICAyNDIsICAgLTI2NiwgIC0xNTc1LCAgLTExNDYsCisgICAgICAtNjA1LCAgIC01MjMsICAgLTIyMSwgICAgNTg1LCAgIC03ODcsICAgMTM2NSwgICAtMjg2LCAgIC0xODMsCisgICAgICAgNDExLCAgICA1NDYsICAgNDc3OSwgICAtMjg2LCAgIC01NzgsICAgLTEwMSwgICAgMzA5LCAgICA4OTYsCisgICAgICAgIDM0LCAgICA0NTEsICAtMTAyMiwgICAtNjk5LCAgICAxNzAsICAgIDkzNSwgICAgNDU4LCAgIDQxNDMsCisgICAgICAgMjI5LCAgIC01NzIsICAgLTkxMiwgICAtMzk3LCAgICAtNDAsICAgLTEzMiwgICAtMTk4LCAgICAgOTgsCisgICAgIC0xODU4LCAgICA2MTIsICAgIDEwMSwgICAgLTk4LCAgICAtMTgsICAgLTM0OSwgICAgMzIyLCAgLTE2MjYsCisgICAgICAxMzA0LCAgICAyNzMsICAgLTIzNSwgICAgNDE4LCAgIC01MDksICAgMzk2MSwgICAtNDkzLCAgIDEwNDAsCisgICAgICAtNDE2LCAgIDE4MDgsICAgIDE2MSwgICAxNDQzLCAgIDEwNTIsICAgLTQ2MCwgICAgIDU1LCAgICAtNjcsCisgICAgICAgIDQxLCAgICA1MTQsICAgMTMwNSwgICAtODM2LCAgLTE2MzYsICAgMTM1MywgICAgMzc5LCAgICAxNDcsCisgICAgICAgMzk4LCAgLTM4MTQsICAgLTY3OSwgICAgMjM1LCAgICAzMjcsICAtMjI5MywgICAtNzE2LCAgIDEyMzQsCisgICAgICAtNzI4LCAgIC0zMjMsICAgIDY5OCwgICAxOTkyLCAgICAgIDQsICAgLTI3NSwgICAgOTQ0LCAgICA4OTUsCisgICAgICAgMjEyLCAgICAzMzQsICAgIDI4NSwgICAtNzEwLCAgIC04OTEsICAtMTMyNSwgICAzMTA3LCAgICAgIDMsCisgICAgICAgMzY3LCAgLTE3NzksICAgIDMwMCwgICAtODY4LCAgICAtNTksICAgLTY0NCwgICAtMzI2LCAgICAxMTEsCisgICAgICAgMjY3LCAgICAtNDMsICAgIDQyMSwgICAgOTc2LCAgICAgNTcsICAgMTQ2MSwgICAtMTcyLCAgICAyNDUsCisgICAgICAtMTg4LCAgICAyOTYsICAgLTIxNSwgICA1MjY5LCAgICAtNDYsICAgIDE3NywgICAgMTk5LCAgIC01MzksCisgICAgICAgIDkyLCAgIC01NDIsICAgIDI1MSwgICAgOTUxLCAgIC0yMzEsICAgIDExNywgICAtNTgwLCAgIC04OTgsCisgICAgICAgNDAyLCAgICA4NDcsICAgICAgNCwgICAgMzg0LCAgIC0yMTUsICAgIDE2MSwgIC0xOTkxLCAgIDQ0MjIsCisgICAgICAyNDYxLCAgLTEyMTksICAgLTc1MSwgICAxODQzLCAgIDE0ODMsICAgMTA3MiwgICAyNjIxLCAgICAtMTYsCisgICAgIC0xMTU3LCAgICAyNDMsICAgLTU1NywgICAgNjUxLCAgICA5NTMsICAgIDQ3NiwgICAtNDE3LCAgIC01MzMsCisgICAgICAgNTA1LCAgIC01OTAsICAgIDcxMywgICAgMTUzLCAgIDEyNjgsICAgLTMxMiwgICAtMjE3LCAgIC0xMjQsCisgICAgICAgODcwLCAgIC00ODQsICAgLTc1MSwgICAtMTYxLCAgICA4OTcsICAgIDc1NSwgICAtODIzLCAgIDQxMTcsCisgICAgIC0xMzExLCAgIC03MjksICAgIDQ0NywgICAtNjQyLCAgICA5MjksICAtMjQwOCwgICAtMzM4LCAgIC05NjcsCisgICAgICAtMTA0LCAgLTEwNDgsICAtMjIxNiwgIC0xNzIyLCAgIC0xMjQsICAgLTIwNCwgICAtMTk2LCAgLTExNTYsCisgICAgICAxNDYwLCAgICAzOTEsICAgLTU0MywgICAgMTIwLCAgICAgNzAsICAgIDIwNCwgICAxMTg1LCAgLTI0OTAsCisgICAgICAyOTUwLCAgIC01MDcsICAgLTYxNSwgICAxMjQzLCAgIC0xNTAsICAgLTM2MywgICAtNDc1LCAgIC01MzEsCisgICAgICAgNzgzLCAgICA2NzEsICAgLTIwNSwgICAtNTkxLCAgICAyMTcsICAgLTUyMywgICAgMjYzLCAgICAtMTQsCisgICAgICAgIDcxLCAgICA5NTgsICAtMTE4NSwgIC0xMDI5LCAgIC0zMzAsICAgIDMyNywgICAtNzA1LCAgIDEyMjksCisgICAgIC0yOTI1LCAgICAxMzEsICAgLTQ5NSwgICAxNzU2LCAgIDIxMDEsICAgIDQ0MSwgICAgLTExLCAgICAxMzMsCisgICAgICAxMjc0LCAgIDEyNTMsICAgLTE1NCwgICAgNzcyLCAgICA1MjIsICAgMTcyNSwgICAtMjc3LCAgLTEwMTIsCisgICAgICAtNzI2LCAgIDEzMzksICAtMTIwMCwgICAtMjQxLCAgIDE2NzYsICAgIDk3NCwgICAyMjU2LCAgICAzNDcsCisgICAgICAyNzQzLCAgIDE0ODIsICAgLTczOCwgICAtMjQxLCAgIC04NjgsICAtMTI5NCwgICAtNjY0LCAgICA4NTUsCisgICAgIC0xMzI5LCAgLTQxNzQsICAtMTY0NywgICAtMTA0LCAgICAxMDEsICAgIDMwNywgICAtNjQ3LCAgIC04MjMsCisgICAgICAgMzQ3LCAgICAgIDQsICAgLTEyMCwgIC0xMTEyLCAgICAzMzQsICAgICAyNywgICAgMjY1LCAgICA5OTAsCisgICAgICAgMzE5LCAgLTE0MTQsICAgIDMxMywgICAtNjAzLCAgICAgNTIsICAtMzEzOCwgICAxNTUyLCAgIC02MTIsCisgICAgICAtODU0LCAgICA2MjYsICAgIDIxMiwgICAgNzczLCAgIDIzMzQsICAgIDY2MiwgICAgNjE0LCAgICA1NjAsCisgICAgICAgNTg5LCAgIC01MzMsICAgMTMzNywgICAgMjI5LCAgICA1NTcsICAgIC0yNiwgICAxNDU4LCAgIC02MjYsCisgICAgICAxODkwLCAgIDIzOTIsICAtMTUyNSwgICAxMDIzLCAgICA2NjcsICAgLTQzMSwgICAgIDcyLCAgIDE2OTEsCisgICAgICAxMDE1LCAgICAtOTcsICAgLTUxNSwgICAxMzgwLCAgICA3OTYsICAgMTE5MiwgICAgLTM5LCAgICAxNjIsCisgICAgIC0yODIxLCAgIDI5NjAsICAgMTU1OCwgIC0xMDU4LCAgIDEzMjcsICAgIDc5MywgICAxMjMxLCAgIC03NDMsCisgICAgIC0xMTkwLCAgIC0yNDUsICAgICAyOSwgICAgNDg2LCAgIC00OTQsICAtMTM3MSwgICAxNjMzLCAgICAtNjYsCisgICAgIC0xODA2LCAgICAyMzEsICAgLTY2NCwgICAtMTQ3LCAgIDI0MDIsICAgLTU4NCwgICAgNDczLCAgIC01MjcsCisgICAgICAxMjcyLCAgICA0NjQsICAgMTk5MSwgIC0xMDA3LCAgIC0yMzUsICAgIDM1NywgICAgMjAxLCAgLTExNzYsCisgICAgICAtMzQxLCAgICAyMjMsICAgIC00NywgIC0yMDg5LCAgICA4MTUsICAgICA0OSwgICAgMTkyLCAgIC03MTksCisgICAgIC0xMDQxLCAgIC0yNDgsICAgMzA0NiwgICAgLTQwLCAgIC01MDEsICAgLTM0NiwgIC0xMzQ3LCAgIC00MDEsCisgICAgICAgIDU3LCAgLTE1ODgsICAtMTAzOSwgICAgNDQzLCAgICA1OTAsICAtMTA4OSwgICAtMTgyLCAgLTEzNjUsCisgICAgIC0xMDEzLCAgLTM5MTcsICAgLTM4MiwgICAgLTk4LCAgIDEwMjUsICAgIC01MSwgICAgNjk4LCAgIC0xOTcsCisgICAgICAgODQ4LCAgICAtNzUsICAgMTU5NiwgICAtNDA4LCAgLTE3OTYsICAtMzE5MSwgICAxMTU1LCAgICAyMzQsCisgICAgICAtMTAwLCAgICA2OTgsICAgIDU3MSwgIC0xMjMzLCAgIC0zMTUsICAtMTUwMiwgICAtNjQ3LCAgIC01NzEsCisgICAgICAtMzIyLCAgICA4NDIsICAtMTA0OCwgIC0xMTE1LCAgIDgxOTIsICAgLTc4NCwgICAtNDcyLCAgICAgMTcsCisgICAgICAtNzE4LCAgICAgMzcsICAgMTE5MCwgICAtMzkzLCAgICAxNDYsICAgLTU0NywgICAgIDkwLCAgIC00MzMsCisgICAgICAtMzIxLCAgLTExNDMsICAgLTUwMSwgICAgNDY4LCAgICAyMzUsICAgLTQ4NiwgICAgLTY0LCAgLTIyMTQsCisgICAgICAtMzMwLCAgIC04MzcsICAgMTIxNCwgICAtMTI3LCAgICA3MDksICAgICAtMywgICAgNjIzLCAgIC0zODQsCisgICAgICAgMjIxLCAgICAyOTcsICAgLTc4MywgIC0zODAyLCAgIC00MDgsICAgIC0xMSwgICAtNzA3LCAgICAgOTIsCisgICAgICAtMjc1LCAgIC0yNjgsICAgLTExNywgICAxNTgwLCAgIDE0NjYsICAgIDcxMCwgIC0xMzAwLCAgICAxNDIsCisgICAgICAtNzQ2LCAgIDE2NDcsICAgMjM5OSwgIC0xMjMxLCAgICAxMTQsICAgMTIyMCwgIC0xMTEyLCAgICA4ODIsCisgICAgICAgNDY3LCAgIC05NzMsICAgLTk3NiwgICAzODU1LCAgIC02NDcsICAgLTE1MCwgIC0xMjQ0LCAgICA5NzMsCisgICAgICAtMzY0LCAgIC0xNTQsICAgIDQ3MywgICAtNjc1LCAgIC04MTcsICAgLTM0NiwgICAtMjY2LCAgIC03NjksCisgICAgICAtNjEzLCAgIC00NzYsICAgMTE4MSwgICAgIC04LCAgLTEwNTQsICAgIDQwNSwgICAtNzY4LCAgIDEzODUsCisgICAgIC0xNTk4LCAgIC04OTIsICAgIDY3MiwgIC0yMTg1LCAgICAgODMsICAgIC0yNywgICAgNTgyLCAgIC00MzQsCisgICAgICAtOTQ0LCAgICAgOTksICAgLTg4OCwgIC0xNjU4LCAgLTE1MTYsICAgMjM5MiwgICAgNzI2LCAgIC0yMjIsCisgICAgICAgMjg0LCAgICAzMjQsICAgNDg0OCwgICAgLTY3LCAgIC03ODIsICAgIC00NSwgICAgNDI0LCAgIC0yMDMsCisgICAgICAtMTk0LCAgLTEyMjksICAgLTExNCwgICAtMTg5LCAgIC0yMTYsICAgIDI3NSwgICAtOTM1LCAgICAtOTMsCisgICAgICAgMTE3LCAgLTE3MjUsICAgIDM2MCwgIC0yNTYxLCAgLTE1NTUsICAtMTE5OSwgICAtNzY5LCAgIC0yODUsCisgICAgICAgIDc0LCAgIDEyNjcsICAgLTM4NywgICAxMzY4LCAgICAxNzksICAgLTExMywgICAgOTUyLCAgIDEwMjUsCisgICAgICAgNzI1LCAgIC01NDIsICAgLTE4NiwgICAxMjU4LCAgLTEzOTYsICAgLTc0NywgICAgNTcyLCAgICA2MDMsCisgICAgICAxOTY1LCAgIC02NjgsICAgIC0xMiwgIC0yNTEyLCAgIDEzMzcsICAgLTI1NSwgICAgMjU0LCAgIDIyODUsCisgICAgICAxMTM2LCAgIDEzOTcsICAgIDU1NywgICAtNjcxLCAgLTExNDksICAgLTYxNCwgICAtNDYyLCAgIC05MTMsCisgICAgICAtNDUyLCAgIDEyMDYsICAtMjkyMiwgICAgNDg1LCAgIC04ODIsICAgIDI3MCwgIC0xMzA5LCAgIC02MDUsCisgICAgICAgLTIxLCAgIC01ODAsICAtMTI4NCwgICAtMTk0LCAgICAxNjksICAtMjMxNCwgICAtMjE2LCAgIC0yMjksCisgICAgICAxMTI0LCAgICAxMDMsICAtMTIwNSwgICAxNTAwLCAgIDExMTgsICAgMTQ1NiwgIC0xMTQ5LCAgICA3ODAsCisgICAgICAtNDY3LCAgIC0zODUsICAgIDU4NSwgIC0xMDYyLCAgICAyODksICAtMzM1NiwgICAgMTk4LCAgIC0zMDksCisgICAgICAtMzEwLCAgICAgOTEsICAgICA0NCwgICAtMzc3LCAgIC02MzIsICAgLTczNywgICAtNTE2LCAgICAgMzAsCisgICAgICAtNzc5LCAgICAgNzMsICAgLTQ4MiwgICA0NjYxLCAgIC0yNzUsICAgICAzOCwgICAtNjMyLCAgICA0NzksCisgICAgICAtMzQ1LCAgIC00MDYsICAgICA3NiwgICAtMjA4LCAgIC0yMzAsICAgICA4MCwgICAtMjIwLCAgIC0zMTMsCisgICAgICAgMjAzLCAgICAgLTMsICAgMTc0MCwgICAtMTMxLCAgICA3NzMsICAgIC0zMCwgICAgMzcyLCAgICA3NjcsCisgICAgICAxNjczLCAgIC03NzAsICAgMzMyNiwgICAxNTg2LCAgICAyMzQsICAgIDQwOCwgICAtMjU3LCAgICA0NzQsCisgICAgICAtNTg0LCAgIC05OTAsICAgMTM3OCwgICAgNjk2LCAgICAgNDcsICAgLTYxMiwgICAtMzEzLCAgICAxODksCisgICAgIC0zOTY0LCAgICA3OTUsICAgLTI4OSwgICAgMjAyLCAgIC00MzcsICAtMTY0OCwgICAgMzczLCAgIC03ODAsCisgICAgICAgLTI0LCAgIC05NTIsICAgIDEyMywgICAgNDM4LCAgICA3OTcsICAgIDUzOSwgICAtNDgxLCAgICAxOTEsCisgICAgICAgMjkxLCAgICAgMzcsICAgLTc5MCwgICAtMzIxLCAgIDQ1MjAsICAgIC00OSwgICAtMjgxLCAgICAyMTEsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjA4MDhzbTBbXSA9IHsKKyAgICAgLTQ2NjQsICAgLTExNSwgICAgIDU5LCAgIC0yODAsICAgLTE5OSwgICAgLTI1LCAgICAyMTMsICAgLTkzNywKKyAgICAgICAzNDQsICAtMjEzNywgICAtODQxLCAgIC0zNzAsICAgIDI1NiwgICAgNTEyLCAgIDEwOTgsICAgLTEzMCwKKyAgICAgICAgNTgsICAgLTEyMSwgICAtNDE0LCAgIDgxOTIsICAgIDQ4OSwgICAtMjk2LCAgICAtMzMsICAgICA5OCwKKyAgICAgICAgNDksICAgLTIxNywgICAgNzIxLCAgICAtNDIsICAgLTQxOCwgICAtMjI3LCAgICAgLTgsICAgIDIwNSwKKyAgICAgIC0yNzYsICAgIDQwNywgIC0xMjE4LCAgIC0xNDYsICAgLTI5MiwgICAtMTQzLCAgICAxMTMsICAgIDk3OCwKKyAgICAgIDI2OTMsICAgICAtOSwgIC0xMDMyLCAgIDE3ODEsICAgMTc3NywgICAtMjE1LCAgIC05NzgsICAgLTgyNCwKKyAgICAgICAgNjgsICAgLTE2MiwgICAgIDU1LCAgIDI5OTEsICAgLTg0NCwgICAgNjgyLCAgICA0OTcsICAgIDQwNiwKKyAgICAgIC05MjIsICAgMjQ3MSwgICAgNTk5LCAgICA3NzQsICAgLTEyOSwgICAxMjkyLCAgLTEwMDQsICAgIDc3NywKKyAgICAgICAgNDIsICAgIDMxNCwgICAtMTAyLCAgIC05NjMsICAtMjc5NCwgIC0yNjIwLCAgICA1MTAsICAgIDM1NSwKKyAgICAgICAzNzIsICAgLTI0OCwgICAtMzkxLCAgIC0xNjMsICAgLTI5OCwgICAgNTYxLCAgICAxMTcsICAgMTE4MywKKyAgICAgICAgMzgsICAgIDE4MiwgICAxODExLCAgICAgLTQsICAgIDMyOCwgICAgLTEzLCAgIC00NTYsICAgIDMwNSwKKyAgICAgICAzNjgsICAtMTY5MSwgIC0yODE4LCAgLTEwNzQsICAgMTAyOSwgICAgMjYxLCAgLTE0NDYsICAgIDM0MywKKyAgICAgICAgMTIsICAtMjc1NywgICAxMDIxLCAgIC0zNzUsICAgICAtMywgICAtMTU1LCAgICAxMTYsICAgIDE5NSwKKyAgICAgIDM0MjAsICAgICA2NCwgICAgMTM5LCAgICA3ODAsICAgIDE4NywgICAtNDY0LCAgICAyNjEsICAgLTMxMywKKyAgICAgIC0xMjgsICAgIDE4NSwgICAzNzAzLCAgIDMxNjAsICAgIDk2MCwgICAgNzA2LCAgICAgNDEsICAgIDQwNSwKKyAgICAgICAgMTAsICAgMTE5MSwgICAgMzUzLCAgIC01NDksICAgIDEzMSwgICAgMTY0LCAgICAxMDUsICAgICAgMSwKKyAgICAgICAgMjMsICAgIDM4NiwgICAgIDczLCAgIC01MDksICAgMjY1MSwgIC0xNDQxLCAgIC04MzQsICAtMTY1NywKKyAgICAgIC02NDUsICAgMTAwNSwgICAtNzc3LCAgICA2OTUsICAgIDIxMiwgICAxNDIwLCAgICAgNjUsICAgIDcwMSwKKyAgICAgICAgMjUsICAgIDMzNSwgICAgMTM2LCAgICAzNTksICAgLTExMiwgICAtMTUwLCAgICAxOTEsICAgIDM5MiwKKyAgICAgIC0yNTgsICAtMTE0MCwgICAgNjUxLCAgLTQ1NTEsICAgIDQxMSwgICAgMjUxLCAgIC0xNjksICAgIDgwNCwKKyAgICAgICAtODMsICAgLTIwOCwgICAtMzYzLCAgICAgODEsICAgIDE1MiwgICAgIDc1LCAgLTExOTQsICAgLTIwMywKKyAgICAgICAgLTksICAgIDE1NywgICAgNDEzLCAgICAtNjIsICAgLTIxMCwgICA1MzkzLCAgICAtMjIsICAgLTQwNywKKyAgICAgICAxMzIsICAgLTI4OCwgICAyMzYwLCAgICAxMzEsICAtMTUzNSwgICAgNTUzLCAgLTI1MjQsICAgLTE0MCwKKyAgICAgICAyNTAsICAgMTI1OSwgICAgLTMwLCAgICAgLTEsICAgMTc2NiwgICAgIDk5LCAgIC01MjksICAgICA5MSwKKyAgICAgIDM5NDgsICAgLTI2MiwgIC0zNzUyLCAgIC0zODIsICAgLTMzOSwgICAtNzAxLCAgIC0xNDAsICAgLTc4NywKKyAgICAgICAgNjcsICAgIC0xMSwgICAgMzMxLCAgIC04MjgsICAgLTQ0MywgICAgNTk2LCAgICAgNDcsICAgMTYzNCwKKyAgICAgICAgMzEsICAgLTMxOCwgICAgIDM5LCAgICAxNDcsICAgLTY3MCwgICAtNzc2LCAgICA3MDcsICAgLTkyMSwKKyAgICAgICAxNzIsICAgIDk3MSwgICAxMTYzLCAgICAgNDgsICAgIC04MSwgIC0xMzU3LCAgIC0xODEsICAgMjg3MiwKKyAgICAgIC0xNTIsICAgIDg5OCwgICAxMDc1LCAgICA1MjksICAgICA5MSwgIC0yMjc5LCAgIDI5MjUsICAgLTg0OCwKKyAgICAgICA1ODksICAgMTkxMCwgICAgNTQ5LCAgIDEwODgsICAgIDc0MywgICAtNjMxLCAgICAgNDIsICAtMTUyOCwKKyAgICAgICAgMjMsICAgIDM4MCwgICAgIC01LCAgICAzODksICAtMTE0NywgICAtMjA5LCAgLTIwNDEsICAgIDIyNCwKKyAgICAgLTE5OTgsICAgIDUyMCwgICAtNzc2LCAgICAxOTMsICAtMjY0OCwgICAgLTc4LCAgICAtMzQsICAgLTEzMSwKKyAgICAgICAgMjIsICAgLTIwMCwgICAgLTI4LCAgICAgMTgsICAgIDMyOCwgICAgMjE1LCAgICAgNjcsICAgICA2MSwKKyAgICAgICAgNTAsICAgIC03MiwgICAgMzAxLCAgIC0yMDcsICAgIDQxMywgICAgNzIwLCAgLTYxOTQsICAgIDk2NywKKyAgICAgLTMyNzUsICAgIDE0OSwgIC0yNDQ0LCAgIC01MjEsICAgLTc3MiwgICAtMjc4LCAgICAxMzcsICAgLTE1OSwKKyAgICAgICA5MzIsICAgLTExMSwgICAxMjE5LCAgICA1MjUsICAgICAxNywgICAtNjg0LCAgLTEyMjksICAtMTc3NiwKKyAgICAgICAgNjYsICAtMjMwNywgICAtMTk1LCAgIC01MjcsICAgIDI3MiwgICAtNDcwLCAgIC0zNTYsICAgICAtNywKKyAgICAgIC0zMzgsICAgIDE0NiwgICAxMDIxLCAgIC04OTMsICAtMjk4MCwgICAgNTkxLCAgICAxMjksICAgLTI1NywKKyAgICAgICAyMDksICAgIC01OCwgICAgNTM4LCAgLTM5NzMsICAgIDU3NiwgICAtOTA1LCAgIC02NDIsICAtMjA5MiwKKyAgICAgICAxNTMsICAgIDczNywgICAtNTk2LCAgICA1NzMsICAgIDIzNiwgICAtODg3LCAgLTE2OTIsICAgLTM3MCwKKyAgICAgIC0xODksICAgLTIxNiwgICAgLTU4LCAgICA3MTQsICAgICAxMCwgICAtNTgyLCAgICA1MTcsICAgIC04NiwKKyAgICAgICA0NTAsICAgLTE0NywgICAtMzEwLCAgICAxNjIsICAgMTc0NywgICAtNjU2LCAgIDM1NzcsICAgIDcwMCwKKyAgICAgICAxOTAsICAgLTY4NSwgICAtMTcwLCAgICAyNDEsICAgICA5MSwgICAtMTI2LCAgIDU1NjcsICAgIDQ0MSwKKyAgICAgICAtNTAsICAgLTY4OCwgICAgLTczLCAgICA5MzgsICAgIDMyMCwgICAtMTMwLCAgIC04MzksICAgMTE1NCwKKyAgICAgICAxNDksICAgLTQ0NiwgICAgLTEwLCAgICAtMTEsICAgICAxMiwgICAtNjU5LCAgIC0xMzgsICAgIDYzNywKKyAgICAgIC00NzAsICAgIDkzMywgICAtNDMxLCAgICAyMzUsICAgIC04NiwgICAgIC0yLCAgIC00MDcsICAtNTg1MSwKKyAgICAgIC0yNTAsICAgMTQxNCwgICAgNTI1LCAgICAxMTAsICAgIDQyMSwgICAgMjU1LCAgIC0xNDksICAgICA4NiwKKyAgICAgICAzNzgsICAgLTMyMSwgICAxMzgwLCAgICAxMTgsICAtMjg0OSwgIC0xMTM4LCAgICAxODAsICAgMTE3NSwKKyAgICAgIDE5MzIsICAgICAzMiwgICAtNDg4LCAgIC0xMjEsICAgLTQxMiwgICAtNDQxLCAgICAzOTcsICAgIDI0OSwKKyAgICAgIC0xNzIsICAgIC05NSwgICAgNDIwLCAgICAzNzUsICAgLTEzMiwgICAtMjE1LCAgIC0xNjcsICAgLTIwNiwKKyAgICAgIDgxOTIsICAgLTExNiwgICAgLTYxLCAgIC0zMTEsICAgIDI2OSwgICAgNjE1LCAgIC0zNTMsICAgLTExNSwKKyAgICAgIC0zODMsICAgIDM2NiwgICAtNjUxLCAgIC0xOTYsICAgIC05OCwgICAgIDg1LCAgICA4NjEsICAgIDU0MywKKyAgICAgIC0yMzEsICAgIDIzNywgICAgNDkzLCAgICAzODAsICAgLTc2NiwgICAtMTY4LCAgIDMyMjcsICAgIDY1OSwKKyAgICAgICA3MDEsICAgIDE4MSwgIC0zMDA0LCAgICAgLTcsICAgIDE1NCwgICAgMjk4LCAgICAyOTgsICAgLTI1NywKKyAgICAgICAtMzIsICAtNTcxMywgICAgIDQ4LCAgICAxMDIsICAgLTc3NiwgICAtMTQ4LCAgIC0xMTAsICAgIDMxNiwKKyAgICAgIC02NDUsICAgIDIxMiwgICAgMjEzLCAgICA1NzUsICAgIC02OSwgICAgIDMxLCAgICA1NTMsICAgLTY3MywKKyAgICAgICAgLTUsICAgIC00OCwgICAtMTQ4LCAgIC0xMzMsICAgICAxMSwgICAgMTQzLCAgICAgMTAsICAgIDE1OSwKKyAgICAgICAzMTksICAgICA0MywgICA3NDYyLCAgICAxNjIsICAgIDIyOCwgICAgLTkwLCAgICAgNzUsICAgIDE1MSwKKyAgICAgICAxMDMsICAtMjU0MiwgICAgLTEzLCAgIC0zMzgsICAgICAxMSwgICAtNDQyLCAgICAxMjMsICAtMzAzOSwKKyAgICAgIC00NTIsICAgICAgNywgICAgMTA2LCAgICA1MDIsICAgIDIyNywgIC0yMDM0LCAgICAgOTAsICAgIDUwMCwKKyAgICAgICAtMjgsICAgLTY0NiwgICAtMjYyLCAgICAtNjIsICAgIC03OCwgICAgIDQwLCAgICA0MTksICAgNjc2MSwKKyAgICAgICAtMTEsICAgICA0MCwgICAgMjA5LCAgICAgNjEsICAgLTE1MSwgICAgLTY4LCAgIC0yNDUsICAgLTQwMSwKKyAgICAgICAgMjYsICAgLTEyMywgICAgMTg5LCAgICAtNTcsICAgIDYxMSwgICAgICA2LCAgLTEyODUsICAgIC05OSwKKyAgICAgIC04OTAsICAgMzYwOSwgICAtMzAyLCAgIC04MDgsICAgIDYzOSwgIC0zMjQ1LCAgIC0yMjYsICAgIDEwNywKKyAgICAgICAgNTQsICAgLTEwOCwgICAtMzE2LCAgICAtNjEsICAgIC01NiwgICAgMjI4LCAgICAtMTYsICAgIDE5NSwKKyAgICAgICAyNzUsICAgIDIxNCwgICAgLTYwLCAgICAgNzcsICAtNzE1NywgICAgMTMwLCAgICAgIDgsICAgIDI0NCwKKyAgICAgLTIxNjAsICAgLTc2MCwgICAgNDUwLCAgIC0xODYsICAgLTM3OCwgICAgIDMyLCAgIC03OTcsICAgIDIxNCwKKyAgICAgLTM1NjksICAgLTQ1MCwgICAgMzA3LCAgICAtMTcsICAgLTE0MSwgICAgIDE2LCAgIDEwMjQsICAgIDQwNCwKKyAgICAgLTIwNjMsICAgLTI4OCwgICAtMTYwLCAgIDQwNTYsICAgIDg3NywgICAtMzQ2LCAgIC05NzAsICAgIC04NywKKyAgICAgICAzMzYsICAgIDk2MSwgICAgNjY2LCAgICA1ODUsICAgLTQ2NSwgIC0xMzI5LCAgICAzNTAsICAgLTMzOCwKKyAgICAgLTU0MjEsICAgLTE3MywgICAtMjk1LCAgICAgNzIsICAgLTIwMSwgICAgNTMzLCAgICA0NjIsICAgLTEzMywKKyAgICAgIC05MzcsICAgMTg5MSwgICAgMjY0LCAgICAgNzEsICAgLTkzNSwgICAgNjQwLCAgICA2ODcsICAgIDg1MiwKKyAgICAgIC0zODYsICAgIC04NSwgIC01NjQ0LCAgICAzMDYsICAgIDI0MCwgICAgNjQwLCAgICAgNjcsICAgICA5NCwKKyAgICAgIC05MDIsICAgLTM1MSwgICAtNDE3LCAgICAgLTMsICAgIDI4NCwgICAgIDM4LCAgIC0xNTYsICAgIDM1OSwKKyAgICAgICAgNTMsICAgIDEzOSwgICAgMTg1LCAgICAyNzQsICAgMjYxMywgICAgMjEzLCAgIDEyODIsICAgMjg2NywKKyAgICAgICAgMzAsICAgMTIzNCwgICAtOTExLCAgICAzNDMsICAgIC05MywgIC0xNjcxLCAgICAgNTcsICAgLTgxNCwKKyAgICAgICAtMTksICAgIDMyNiwgICAtMjU2LCAgIC0xMTMsICAgICA3MiwgICAzMTc3LCAgIDMzOTMsICAgLTEyNSwKKyAgICAgICA0NjAsICAgLTI2MSwgICAtNTAzLCAgLTEwMTksICAgLTY4MSwgICAtMjUzLCAgIC05NTcsICAgLTE1NywKKyAgICAgIC0xMTcsICAgLTIzMSwgICAtMjEyLCAgIDE0NDYsICAgIDIyNSwgIC0zMDA5LCAgICAzMTMsICAgLTQzNSwKKyAgICAgICAzODcsICAgLTkyOCwgICAgNjk2LCAgIC04NTcsICAgLTQ1MiwgICAgIDY2LCAgLTIwNjMsICAgIDc4MiwKKyAgICAgICAgMTQsICAgIC05NCwgICAgIDUxLCAgICAyNDIsICAgLTQyMiwgICAgMjM2LCAgLTM4MjUsICAgLTY2NiwKKyAgICAgICAzNDgsICAgIDE5NiwgIC0yNzcwLCAgICA0MjksICAgLTQxNiwgICAtMjY2LCAgLTEyMTUsICAgLTU4NiwKKyAgICAgICAgODQsICAgIDMyOCwgICAtMzAyLCAgICAyMTksICAgLTQ1NywgICAtNTMyLCAgIC03NjQsICAgICA4NSwKKyAgICAgIDIwMDgsICAgLTgwNiwgICAyOTA2LCAgLTE0MDUsICAgIDM2NywgICAgODM1LCAgICA3MTUsICAgLTk4NiwKKyAgICAgIC0yMTcsICAgICA4OCwgICAtMzI4LCAgICA1NjksICAgLTU4NiwgICAzMDk2LCAgICAyNDksICAgLTYxNSwKKyAgICAgICA0NTMsICAgIDE3NiwgICAtNTQwLCAgICA3OTIsICAtMjQ3MiwgICAyMTg5LCAgICA4NzYsICAgLTM1MywKKyAgICAgICAxMTEsICAgIDIxMiwgICAgIC03LCAgICA1OTcsICAgLTE1NCwgICAgODE4LCAgIC00MDEsICAtMTQwOCwKKyAgICAgICA3NDgsICAgMjUwMiwgICAxNDI2LCAgLTI4OTcsICAgMTA2OSwgICAgMzI2LCAgIC02MDUsICAgIDEyMCwKKyAgICAgLTQxNDksICAtMzA4NywgICAgNzI5LCAgICAgODIsICAgIDIyNCwgICAgMzIwLCAgICAzNTMsICAgIC03NywKKyAgICAgIC0xNjMsICAgLTMyMiwgICAgMjIwLCAgLTEwNzMsICAgICAxMCwgICAgNTQ1LCAgIC01MTgsICAgLTQ1MywKKyAgICAgICAgNTAsICAgLTM4NiwgIC0yMDAyLCAgICA2MTQsICAgLTcwNSwgICAtODA2LCAgIC05MjgsICAgMjk0MSwKKyAgICAgIC01MjAsICAgIC0zNSwgICAxMjA4LCAgICA0MTMsICAgIDkwMCwgICAgMTM4LCAgIC00MTQsICAgLTI4OSwKKyAgICAgICAtMTUsICAgIC03NSwgICAgMTg1LCAgIC0zNzMsICAgIDY0OSwgICAtMjUxLCAgICA2NjYsICAgMjcwOCwKKyAgICAgLTI4MTcsICAgLTc0OSwgICAtMTU5LCAgIC0xMTIsICAgIDQ1NCwgICAtMzg1LCAgIDEwMzcsICAgIC00NiwKKyAgICAgICAtMjUsICAgIC0xNCwgICAgIDY2LCAgICA1NTIsICAgIDE2MCwgICAgLTQwLCAgIC01NTIsICAgLTE1NiwKKyAgICAgICAxNTEsICAtNTI4NywgICAgNTQxLCAgIC0yNDIsICAgIC04MiwgIC0xMTY0LCAgICA4NDksICAgLTc3MywKKyAgICAgIC0xMzYsICAgLTE2MiwgICAgLTc2LCAgICAgMjMsICAgLTM3MSwgICAtMjIyLCAgLTIyNDUsICAgIDQ2OCwKKyAgICAgICA0MjUsICAgLTM1NiwgICAgNDE4LCAgICAgLTMsICAgLTMyMiwgIC0zNTczLCAgICAxNDgsICAgIDI2MCwKKyAgICAgIC0xNTUsICAgMzMwMSwgICAtMTY1LCAgLTMxODYsICAgLTcwOSwgICAtNDU4LCAgICA4NzAsICAgIDM4NiwKKyAgICAgICAgNTksICAgLTE2MSwgICAgNTMzLCAgIC0xNTAsICAgIDU5OCwgICAgMzg0LCAgICA5MDAsICAtMTIzMywKKyAgICAgICAtNzQsICAgLTQ2NCwgICAtNTE5LCAgIC02NjEsICAgIC01NSwgIC0yNTYyLCAgICAyOTAsICAgMTQ4OSwKKyAgICAgIDE3MzksICAgMjI3NywgICAgODc0LCAgLTE0ODMsICAgLTQ0NywgICAgIDkzLCAgICAzMDksICAgIDMxMSwKKyAgICAgIC0yMDMsICAgIC0xOSwgICAyMjcxLCAgLTEyODAsICAgLTEyNSwgICAtNDQzLCAgIC01MzgsICAgMjY1MCwKKyAgICAgICAtNDIsICAgIDI5MCwgICAgMjQ1LCAgIC0xNDksICAgICAyNCwgICAgIDM4LCAgIC0xMzMsICAgMTYzOCwKKyAgICAgICAyMTAsICAgLTIzOSwgICAtMTgwLCAgICA1MTYsICAgIC0xMiwgICAtNzE5LCAgICAtMTksICAgLTUxNywKKyAgICAgLTYxOTAsICAgLTE4MSwgICAgLTg5LCAgICAzMTgsICAgIDQ4NSwgICAgNjMxLCAgICAgMTEsICAgLTIwNSwKKyAgICAgICAtNTcsICAgIDI1NywgICAgNTczLCAgICAtNzIsICAgIDI3MywgICAtNTc5LCAgICAxMDcsICAgICAtNSwKKyAgICAgICAxMTIsICAgIDQyNSwgICAyNDQ5LCAgIDI3NDEsICAgIDc1OCwgICAgNjU2LCAgIC02NjMsICAgLTI4MiwKKyAgICAgICAtNDgsICAgIC00NSwgICAtMjk0LCAgIC00NDgsICAtNTU2MiwgICAgIDYxLCAgICAgLTEsICAgLTQ2NCwKKyAgICAgIC0yNjMsICAgLTY4OCwgICAtMTE1LCAgICAtMTUsICAgLTEwOCwgICAtNTY5LCAgIC00NDgsICAgIC00OCwKKyAgICAgIC0xODAsICAgLTEwNSwgICAgIDE0LCAgIC0xODAsICAgIDQ5MCwgICAgMjc0LCAgICA2MjUsICAgLTU4OCwKKyAgICAgIC0xMjAsICAgLTE5NiwgICAtMzA1LCAgIC0xMjYsICAgIDQzNSwgIC0yNDkwLCAgLTI2OTMsICAtMzQxNCwKKyAgICAgICAgMzEsICAgICA5NywgICAtMTY3LCAgIC0xMTQsICAgIDI0NywgICA3Njk1LCAgIC0xODksICAgLTU4MCwKKyAgICAgICAyMTksICAgIDI0MSwgICAgMTg4LCAgICAzMjcsICAgIDE3OSwgICAtMTkzLCAgICAxMzUsICAgLTE3NiwKKyAgICAgICAxMjcsICAgIDQ3OSwgICAgNTI5LCAgICAyMzQsICAgIDExMiwgICAgMjM0LCAgIC0zNTgsICAgLTI4NiwKKyAgICAgIDExMDksICAgMjk0MCwgICAtNjEwLCAgICAtMTMsICAtMjY1MCwgICAgNDk1LCAgIDEzNTUsICAgLTU3NCwKKyAgICAgICAtNDMsICAtMTQ5NywgICAtMjkyLCAgIC01MDMsICAgIDU2NCwgICAtMzYzLCAgICAgMjQsICAgLTMxMywKKyAgICAgIDEzODcsICAgIDIyMSwgIC0zNjEyLCAgICA3ODMsICAgIDYzNywgICAgIDQzLCAgIDEzNTEsICAgIDIxNywKKyAgICAgICAtMjEsICAgIDE0OSwgIC0zMTA0LCAgICAxOTAsICAgLTI1OSwgICAtMjAxLCAgIC0zNDIsICAgLTIwMSwKKyAgICAgICAxNjYsICAgMjQxMSwgIC0xMDgyLCAgICAyODMsICAgLTM4MiwgICAtNzI1LCAgICAxNTcsICAgIDE1NSwKKyAgICAgLTE2MDksICAgLTU5MiwgICAgNTI3LCAgLTI5NTksICAgICAgOSwgICAgMjE2LCAgICA1MjYsICAgICA3OSwKKyAgICAgICAgNTQsICAgLTEzMiwgICAgMjAyLCAgICA3ODUsICAgIDkyOSwgICAxNzU1LCAgIC02NjMsICAgIDM2NiwKKyAgICAgLTM3MzUsICAgMzI4MiwgICAgMzA1LCAgICA1NzIsICAgIC0zNiwgICAtMTExLCAgIC0yMzEsICAgIDExOSwKKyAgICAgICA2MDMsICAgMTM1NywgICAtMTUzLCAgICA1NTMsICAgIDM2MywgICAtNzYwLCAgLTExODgsICAgIDg5MCwKKyAgICAgICAxNDcsICAtMzg0NCwgIC0zNzg4LCAgICAxNTAsICAgIDI1NywgICAtNTg4LCAgIC0yMzQsICAgIDQ5NywKKyAgICAgICAzNjEsICAgLTU0MywgICAgMjU1LCAgIC0xNzUsICAgLTM3NywgICAgIDQ5LCAgIC02MTYsICAgLTIwMCwKKyAgICAgIDQxMTUsICAgLTU0MSwgICAgMTMwLCAgICA2NzgsICAtMzQ1OCwgICAtNTA2LCAgIC0yMTgsICAtMTMxNywKKyAgICAgICA4ODksICAgICAyOSwgICAtMTA0LCAgICAgLTIsICAgIDUzMiwgICAtMzkzLCAgICA1MTMsICAgLTc5MiwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMDgwOHNtMVtdID0geworICAgICAgNDEyMywgICAgLTc0LCAgICA2MzksICAgIDMyNiwgICAtMTEwLCAgIDE4OTYsICAgIDgyNiwgICAtODU1LAorICAgICAgLTI5OSwgICAtNDUyLCAgICA1MzYsICAgLTMyMywgICAgMjYyLCAgICAgNzksICAgIDQ4NiwgICAgMTQ0LAorICAgICAgIDI3MCwgICAgLTY0LCAgICAyNzcsICAgIDE1NCwgICAgMzk5LCAgICAgNTAsICAtNzI3MCwgICAgLTYxLAorICAgICAgICAxNCwgICAgIC04LCAgICAgMTksICAgLTEwNCwgICAgMzMzLCAgICAxMTksICAgIDM3NCwgICAgMzg5LAorICAgICAgLTE5NiwgICAgIDc3LCAgIC0zMjIsICAgIDI2MSwgICAgIDc1LCAgICAzODYsICAgIDE2MiwgICAyMzYwLAorICAgICAgIDY0NCwgIC0yNzg1LCAgICAzNTUsICAgIDI3NywgICAtMTIxLCAgIC0xNDgsICAgIDE1NiwgICAyMTM2LAorICAgICAgIDExMiwgICAtNDUzLCAgICA0MjksICAgIDE3MSwgICAyNDA1LCAgLTEyNDUsICAgLTc3NSwgICAtMTgxLAorICAgICAgMjExMCwgICAtNTgzLCAgICAxMjcsICAgIDg4OSwgICAtMjkwLCAgIC01NTAsICAgLTE2NSwgICAxMDI3LAorICAgICAgMjE1NSwgICAtMzUxLCAgIC05MzYsICAgIDQzMiwgICAyNjg5LCAgICAyMTcsICAgIC0yMCwgICAgNjQ2LAorICAgICAgLTc4NSwgICAgOTA4LCAgICA2NTQsICAgIDk3MCwgICAtMjk0LCAgICAtNDEsICAgIDQ2NiwgICAtMjQ1LAorICAgICAgIDEzOCwgICAgIDUwLCAgIC0xMDgsICAgLTM2NiwgICAgMTc3LCAgICA0ODEsICAtMjExOCwgICAgOTY4LAorICAgICAgLTU5NCwgICAzODkyLCAgICA1MjgsICAgIDE4OCwgICAtNjEzLCAgICAgMTgsICAgIDI4MywgICAgNzMzLAorICAgICAgIC0zNSwgICAxNTk4LCAgICAzODcsICAgICAgMSwgICAgMTU2LCAgIC0yMDYsICAgLTQzNywgICAgMjAzLAorICAgICAgLTI0NCwgICAtMzQ3LCAgICAzMjUsICAgIDI5NiwgICAgMTAwLCAgIDExNzEsICAgICA0OSwgICAgOTIwLAorICAgICAgLTQxOCwgICAgLTU0LCAgLTI3NTYsICAgICAyNCwgICAgMTIzLCAgIDEwMTgsICAgIDMwMywgICAtNTAxLAorICAgICAgIDkwMSwgICAtNDQ3LCAgICAzMjIsICAtMjM2MSwgICAxMDM5LCAgLTEwNjcsICAgIDg3NywgICAxMzI5LAorICAgICAgLTE0MywgIC0yNzczLCAgICAyNjksICAgMTU2MCwgICAgMzk4LCAgLTMxOTMsICAgIDEwMiwgICAgOTkwLAorICAgICAgIDI3OSwgICAgMzc5LCAgIC0yMDQsICAgLTE0NCwgICAtMTc0LCAgICAxMzksICAgIDQxMSwgICAtMjM0LAorICAgICAgICAyMSwgIC01MDY0LCAgIC0xODgsICAgIDM2NSwgICAgMjc4LCAgICAzNTMsICAgLTE4OSwgICAgIDk0LAorICAgICAgIDU5MywgICAtNDAyLCAgIC0zNTMsICAgLTI1NywgICAtNzg4LCAgICAzODMsICAtMTAzNiwgICAgNTY5LAorICAgICAgIC03MiwgIC0xNzY0LCAgICA1NzEsICAgMTAwMywgICAgNjI5LCAgICA2NzAsICAtMTQwMCwgICAgICAwLAorICAgICAgLTQzNSwgICAgIDY0LCAgICAxODksICAgMjg3NCwgICAgMjM5LCAgIDExMjgsICAgIDk5MiwgICAxMjEzLAorICAgICAgICA2OSwgICAtMTI4LCAgICAyMDcsICAgIDcxMywgIC0yNDM2LCAgIC05MzEsICAgLTM4NywgICAtMTExLAorICAgICAgMTA2NCwgICAtMTcwLCAgLTI4NTMsICAtMTA3MiwgICAtMzY3LCAgLTEwNDgsICAgLTIzOCwgICAgLTYwLAorICAgICAgIC00OSwgICAgMzQwLCAgIDIzODIsICAgIDM3MCwgICAtMjQ1LCAgICAzNTEsICAgIDI0OCwgICAgLTY0LAorICAgICAgMjMzMSwgICAgNDU4LCAgIC00ODQsICAgIC0zNCwgICAgMjgxLCAgICA2ODksICAgIDQ4MywgICAgNjM2LAorICAgICAgIDE5OSwgICAzMTUzLCAgICA2MDcsICAgLTEyNCwgIC0zMjk2LCAgICA5NTMsICAgLTQwNywgICAgIDQ5LAorICAgICAgIDQ1NSwgICAxMDgzLCAgICA2OTAsICAgLTE2OSwgICAtNzI1LCAgICAzMTEsICAgLTQ5MywgIC0xNzYxLAorICAgICAtMzA1NCwgICAgMzc2LCAgIC01NDQsICAgIDQ3OSwgICAgIDkxLCAgICAxNTksICAtMjgzNywgIC0xMjU3LAorICAgICAgLTgzMCwgICAtOTQ4LCAgIC0yNTQsICAgIDI4OSwgIC0xMDM5LCAgICA4NTYsICAgICA4NiwgICAxMTIzLAorICAgICAgIDIwMywgICAtNzY4LCAgIDEwODksICAgICA3MywgICAtODY2LCAgICAzMDgsICAgIDQzNywgICAgNjc0LAorICAgICAtMjA2NywgICAtMjQwLCAgLTEwNzksICAgICAzMywgIC0xMDY5LCAgLTM1MDIsICAgIDc1NiwgICAtNjc2LAorICAgICAgICA0NSwgIC0yNTQ0LCAgICAzNzgsICAgLTM2NSwgICAtMjc1LCAgIC0yOTMsICAgLTM5NCwgICAtNjQ5LAorICAgICAgLTUwNywgIC0yODUwLCAgICA2NzIsICAgIDM3MCwgICAgMTg2LCAgIC00MTcsICAgIDY4MiwgICAgMTg1LAorICAgICAgIC0xNSwgICAyODYzLCAgICAgMjEsICAgLTE2NSwgICAgMzU2LCAgLTM3NzYsICAgLTEwMywgICAgNTM1LAorICAgICAgLTQxNiwgICAtMzQ1LCAgICAtMzEsICAgICAyNCwgICAgLTkwLCAgIC0yMDUsICAgICA5NiwgICAtOTY2LAorICAgICAgICA5NCwgICAgNDI0LCAgICAgLTUsICAgLTE4OCwgICAgMTQ5LCAgLTIxOTMsICAgLTE4MywgICAyMzQyLAorICAgICAgIDQyNSwgICAtNjQ3LCAgLTE2OTcsICAgLTYyNywgICAtNDQ0LCAgIDEyNDgsICAgLTk2NywgICAtNzAyLAorICAgICAgIC00OCwgICAzNjE2LCAgLTM0ODQsICAgIDc3NCwgICAtMjk5LCAgICAgOTQsICAgIDQyMSwgICAgNDcyLAorICAgICAgICA3MSwgICAtMTQ0LCAgIC01MjMsICAgIDExNCwgICAtMTcyLCAgICAzNDksICAgLTI4NSwgICAtMTA2LAorICAgICAgIDEwMSwgICAgIDU5LCAgICA0MjksICAgIDUxMiwgICAzMzYyLCAgICAtMzgsICAgIC02MiwgICAgIDUwLAorICAgICAgLTIyNSwgIC0xNDA4LCAgICA3ODAsICAtMjc0NywgICAtNDA0LCAgICA0ODksICAgLTk3NSwgICAgODQwLAorICAgICAgIDM1NywgICAgOTgyLCAgICA0ODgsICAgLTI3NSwgICAtMTA5LCAgICAzOTMsICAgIDM3NSwgICA0Nzk0LAorICAgICAgIDE4MywgICAtMTEwLCAgICA5MjIsICAgLTc2MCwgICAgIDYxLCAgLTEwNjcsICAgICAtOCwgICAgMzIyLAorICAgICAgICA3NCwgICAtMTAxLCAgICA1NTQsICAgLTM1MCwgICAtNDg2LCAgICAgNjYsICAgIDM4NCwgICAgNzQ4LAorICAgICAgICAxNCwgICAgMjIzLCAgICAtNDUsICAgLTM4NiwgICAgIDY5LCAgIDYyMzEsICAgIDI0NywgICAgMzI1LAorICAgICAgLTMyMCwgICAgLTQ3LCAgICAtNTAsICAgLTE2NSwgICAgMTUzLCAgIC0zODAsICAgIDU4OSwgIC0zMjQzLAorICAgICAgLTE3MywgICAtMTQwLCAgICAzNDEsICAgLTc0NywgIC0xNTU5LCAgICA2MzksICAtMTY1OCwgICAgMzU2LAorICAgICAgIDExMCwgICAtMTUwLCAgIC0yNzMsICAgICA3NiwgICAtNjMyLCAgIC00MjUsICAgLTIyNywgICAgNjQwLAorICAgICAgIDIxMSwgICAgMTkyLCAgIC03NDcsICAgLTE2NSwgICA0NjA4LCAgICAyOTAsICAgLTE2MCwgICAxMjY4LAorICAgICAgMjc1NCwgICAgIC0zLCAgICA1NzgsICAgIDE4OSwgICAtNDg1LCAgLTI3NDcsICAgLTEyMywgIC0xMzA5LAorICAgICAgIDY2MiwgICAgNjAxLCAgICAgNDMsICAgLTEzNiwgICAgIDg0LCAgIDE2MjUsICAtMTExMywgICAxNDAwLAorICAgICAgICA3NSwgICAtMTI2LCAgIDM1ODEsICAgLTI0MywgICAyMzM5LCAgIC01MTQsICAgMjIwMywgICAtNDAwLAorICAgICAgLTQ4MywgICAgNTIxLCAgICAgMzAsICAgLTI0NiwgICAgLTc2LCAgICAzNTksICAgIDEwMSwgICAgNjYzLAorICAgICAgIC00MCwgICAgIDU3LCAgICAgNTIsICAgIDM2MCwgICAtNDQ3LCAgIC0yOTAsICAgIDI1NCwgICAgMTA0LAorICAgICAgIDEwMiwgICAgMTEzLCAgICAyMTUsICAgLTE2MywgICAtMzg4LCAgICAyOTksICAgNDU3MCwgICAgIDMxLAorICAgICAgIDEwOCwgICAgLTQxLCAgICAgNDEsICAtMjYzMywgICAyODkxLCAgIDExODgsICAgLTUwNSwgICAxMDYxLAorICAgICAgLTM0OSwgICAtNjA0LCAgIC00NDksICAgLTM3NCwgICAtMzIwLCAgICA5NjksICAgLTMwNCwgICAtMTkyLAorICAgICAgIDI0NiwgICAtMTUyLCAgICA0NDEsICAgIC00NiwgIC0xNDE2LCAgICAxMzcsICAgMTk4NywgICAgNDk1LAorICAgICAgIC02MywgICAxMDg3LCAgICA4NzUsICAgIDY5OSwgICAgMjAxLCAgICAyMTEsICAtMzE1NywgICAtMjczLAorICAgICAgIC02MCwgICAgMTk1LCAgLTI4MTMsICAgLTIzOSwgICAyNDg2LCAgICAtNTUsICAgIDI5NCwgICAgMzE1LAorICAgICAgLTEzMywgICAgNDQ4LCAgLTE4NDksICAgIDM2MywgICAxMDYzLCAgICAgNzYsICAgLTkyOCwgICAtNTc0LAorICAgICAgIC03MiwgICAgLTU3LCAgICAxNjgsICAgNTY3MywgICAtMTU2LCAgIC0xMTYsICAgIDQwMCwgICAtMTI0LAorICAgICAgICA4MiwgICAgMjE4LCAgIC00ODcsICAgICAzNywgICAgMTEyLCAgICAgNTMsICAgLTU0NCwgICAgMTc4LAorICAgICAgICA5OSwgICAgNDgwLCAgLTcxNzksICAgLTE5NiwgICAgMjcxLCAgIC0xNjAsICAgIDMwOCwgICAgLTYyLAorICAgICAgIDM5MywgICAgMzk0LCAgIC0yMjAsICAgLTc0MCwgICAgLTE0LCAgICAgOTIsICAgIDQwOCwgICAtMzY0LAorICAgICAgIDI5OSwgICAtMzA1LCAgICAgNzYsICAgLTIzOSwgICAgIDI2LCAgIC0zMTIsICAgLTIzNCwgICAgIDM0LAorICAgICAgLTE4OSwgICAgODcxLCAgIC0yOTcsICAgIDM2NCwgICAgMjgyLCAgIC0zMjEsICAgLTkyNywgICA0NTExLAorICAgICAgICAgMiwgICAgICA2LCAgICAzMDgsICAgIC04MiwgICAgIDg3LCAgIC0xMjgsICAgIDUxOCwgICAgIDgyLAorICAgICAtNDUwOSwgICAxMTQ1LCAgICA5NjAsICAgLTEwOSwgICAtMTg2LCAgICAgODMsICAgLTE0NCwgICAgNzUyLAorICAgICAgICA4NCwgIC0yODc2LCAgIC0xNjIsICAgIDg3NywgICAtMjQ5LCAgICAzMTcsICAgIDUxMCwgICAgMzM4LAorICAgICAgIDI5OCwgICAgNzQ0LCAgIDI4OTIsICAgLTc5MSwgICAgMzYzLCAgIDEwODgsICAgIDYzMCwgIC0yNTA2LAorICAgICAgICAtMSwgICAzMTUwLCAgICAyMTksICAgIDEzMCwgICAgMTE5LCAgICAzMTMsICAgLTgyMiwgICAtNjY4LAorICAgICAgMTIwMSwgIC0yOTQ4LCAgIC0yMzcsICAgLTEwNiwgICAtNzExLCAgICA0MDUsICAgIDI3NiwgICAtMjU1LAorICAgICAgICAgMCwgICAgNDQwLCAgICAxNjEsICAgMjU4NywgICAtNzM0LCAgIDMzNzYsICAgIDI3NiwgICAgMTU0LAorICAgICAgIDI4NywgICAtMjAwLCAgICA1OTQsICAgIC0yOSwgICAgMTk4LCAgIC0yMzcsICAgLTYwOCwgICAtNDQ1LAorICAgICAgLTI4NiwgICAgMjAyLCAgIC03ODMsICAgIDExMiwgIC0zODc5LCAgICAgNzgsICAgMjgwOSwgICAtMzM3LAorICAgICAgLTYwNiwgICAtNjg0LCAgIC00MzQsICAgIDU1OSwgICAgMjczLCAgICAyMDEsICAgIDMzMSwgICAgOTAzLAorICAgICAgIC01MywgICAgMzQ2LCAgICA3MDAsICAgMjU5OSwgICAgMzAyLCAgIC01OTAsICAtMjU1MSwgICAtNDk4LAorICAgICAgIC0yNiwgICAtNjY3LCAgICA1NzYsICAgLTU0NiwgICAgNDU3LCAgIC0yODksICAtMTQwOCwgIC0xMDIxLAorICAgICAgIC02MywgICAgIDc4LCAgICAxNTMsICAgIC04MywgICAtNjk2LCAgLTMxMDUsICAgMjQ5OCwgIC0xNTAyLAorICAgICAtMTI0OSwgICAtMjM4LCAgICAyNTQsICAgLTI4NywgICAgMjE1LCAgICAzMTMsICAgIDI3OSwgICAtNTE3LAorICAgICAgICA2NywgICAgLTU4LCAgIC0xNDgsICAtMTExMSwgICAgIDU4LCAgIDUxNTEsICAgIDM0NiwgICAgMjgzLAorICAgICAgLTM2NywgICAtOTAwLCAgICA1NDIsICAgIDIwOSwgICAtNDM4LCAgIC0xMjgsICAgLTEzNSwgICAgIDU0LAorICAgICAgICAgNywgICAgODY5LCAgICAyOTEsICAtMTA3MywgICAgNzc1LCAgICAtNjEsICAgLTE0NSwgICAgNDU3LAorICAgICAgIDU2MiwgICAxMzMyLCAgLTQ1ODksICAgICA5OSwgICAxMzY2LCAgICAxODQsICAgIDk4MCwgICAtOTIwLAorICAgICAgICA4MCwgICAtMjY2LCAgIC0xNTIsICAtMTg3NywgICAtMjY2LCAgICAzNjQsICAtMTQzMiwgICAgMjcyLAorICAgICAgMjI3NSwgICAgNTY3LCAgICAgNjAsICAgICA1MCwgIC0yNTA0LCAgIC0zODYsICAgLTcwMCwgICAgMzczLAorICAgICAgNjc3NSwgICAgLTE1LCAgIC00MzQsICAgIDM0NywgICAgMjE1LCAgIC0zNjksICAgIC0yMCwgICAtMjgxLAorICAgICAgLTI0MywgICAtMzI1LCAgICAyMjcsICAgLTI4MywgICAtNjY1LCAgICAtNzQsICAgIDMzNiwgICAtNjc0LAorICAgICAgLTExMiwgICAtMzY5LCAgICAtNTMsICAgLTM5NiwgICAgMzI4LCAgIDM1ODgsICAgLTU0MSwgICAtNTU3LAorICAgICAgLTE2NCwgICAxMzA1LCAgIC04MTcsICAgLTQ2MiwgICAxOTg2LCAgIDEyNDksICAgLTU3NCwgICAgMTMwLAorICAgICAgIDE1MiwgIC0yMzc1LCAgIC00MjUsICAgIDQ0MiwgIC0zODI3LCAgICAzMjIsICAgLTcyOCwgICAgNTYzLAorICAgICAgLTE3OSwgICAgNTM0LCAgICA2MjAsICAgLTkzNywgICAgNTkwLCAgICAgLTEsICAgIC01OSwgICAgNTg0LAorICAgICAgIDE3NSwgICAtMTkzLCAgIC0xNjgsICAgICAtNSwgICAtMTUwLCAgICAxNTYsICAgLTE3NSwgICAtMTc4LAorICAgICAgLTI0NSwgIC03NDgxLCAgIC0yNzMsICAgIDIxMiwgICAgLTM1LCAgICAzMTgsICAgLTE3OCwgICAgNDQ2LAorICAgICAgIC01NSwgICAgLTI2LCAgICAgNDIsICAgIC00NiwgICAtMjY1LCAgICA3NjcsICAgIDMzMCwgICAgMjk1LAorICAgICAgIDkxMCwgICAgLTU0LCAgICA0OTAsICAgMjk1MiwgICAgNTk4LCAgLTI1NzgsICAgLTY0NCwgICAgNDAzLAorICAgICAgIDE0OSwgICAgLTg4LCAgICA1NDksICAgLTUxMCwgICAgNTk2LCAgIC0yMjUsICAtMjM0MSwgICAtMjg2LAorICAgICAtMjcyNCwgICAgICA1LCAgLTE5NjAsICAgLTI2MiwgICAgOTIyLCAgICA1MzcsICAgIDY0NiwgICAgLTYyLAorICAgICAgIC0xOCwgICA4MTkyLCAgICA0ODQsICAgIDExMiwgICAtMjIyLCAgIC0yMTEsICAgLTIyNCwgICAgMzE3LAorICAgICAgIDExMiwgICAgIDgyLCAgIC04NTMsICAgICAgMSwgICAgMTc2LCAgIC00NzUsICAgLTE2MiwgICAgMjAwLAorICAgICAgLTE5MywgICAgMTY2LCAgIC0yMjgsICAgLTIxNCwgICAgIDcyLCAgICA0MTcsICAgIC0yNywgICAgLTE2LAorICAgICAgICAgNCwgICAgMzk1LCAgIC01MTUsICAtNjgzMiwgICAgIDI4LCAgICAtNDcsICAgIDYyNiwgICAtMTczLAorICAgICAgICA2MywgICAgIDkwLCAgICAxNDEsICAgIDIxNywgICAxMDM3LCAgICAzMzUsICAgNDUyMCwgICAtODk2LAorICAgICAgIDExMSwgICAgIDkxLCAgIC02NTYsICAgLTEwMywgICAtNzI5LCAgICAtMjksICAgIDY1MywgICAtNTk5LAorICAgICAgIC0xMSwgICAyNzM0LCAgIC0zNzgsICAgLTI5MSwgICAgIDYwLCAgICAyMjgsICAgICA0NywgIC0zNjcwLAorICAgICAgLTE5MiwgICAgNjUzLCAgICA3MzMsICAgLTU5NywgICAgODk4LCAgIC00MjAsICAgMTU3MiwgICAtMTMzLAorICAgICAgLTE1NCwgICAgMzI5LCAgIC0yNTksICAgLTIyNSwgICAgMjE4LCAgICAtODIsICAgIDExNywgICAgMzAwLAorICAgICAgLTQ3OSwgICAgMjc3LCAgICA3ODcsICAtMTcxOSwgICAgMTM2LCAgLTM2MDMsICAgIDcwMiwgICAxMzU3LAorICAgICAgMzM0MCwgICAgMzYyLCAgIC00MzgsICAgIDEzMSwgIC0xNDYzLCAgICAzNjcsICAgLTQ2NywgICAxNzIyLAorICAgICAtMjE4NiwgICAgMzQzLCAgIC0zNzksICAgMTIyMSwgICAtNTYyLCAgIC0yNjAsICAgMTE1NywgICAyNjkyLAorICAgICAgICAzNywgICAgLTg5LCAgIC0zMjIsICAgLTMyMiwgICA4MTkyLCAgIC0yODQsICAgIDIzNSwgICAtNTI4LAorICAgICAgIDExMywgICAtMzU5LCAgICAgNDQsICAgICA3NCwgICAgMTE5LCAgIC05MTcsICAgIDQwMywgICAgNDEwLAorICAgICAgLTE1MCwgICAgMTU3LCAgICA1MTQsICAgIDE2OCwgICAgNDA3LCAgIC0yNDYsICAgIC0zMSwgICAgNTEwLAorICAgICAgIDEwNSwgICAgNDQ5LCAgIDQ2MTIsICAgIDYzNSwgICAgLTkwLCAgLTEyNjAsICAgIDc3NCwgICAtMjg0LAorICAgICAgIC04MCwgICAgNDU2LCAgICAgIDcsICAtMzAwMCwgICAtMzI0LCAgIC0yMTIsICAgLTEwNCwgICAtMzc0LAorICAgICAgLTQ0MCwgICAxMjY4LCAgIDI3MzYsICAgICA1MywgIC0xMTc4LCAgIC00MDMsICAgLTQzOCwgICAtNTM0LAorICAgICAgIDEyMSwgICAgMjYxLCAgIC00OTcsICAgIC03MywgICAgIDEwLCAgIC0yNjIsICAgICAxNywgIC0xODcwLAorICAgICAgIDE3OCwgIC0xMzM5LCAgICAyMjQsICAgMzExNSwgICAtNDM2LCAgIC00NDgsICAgIDM4NSwgICAgODk0LAorICAgICAgICAtMSwgICAgMTA1LCAgICAtMTgsICAgIDI2OCwgICAgMzQyLCAgICAyNzAsICAgIDg5MSwgICAgMzY3LAorICAgICAgIDEyMSwgICAtMzI1LCAgLTE2MTAsICAgIC03NSwgIC0zMjMzLCAgIC0xODksICAtMTA1MCwgICAgOTYxLAorICAgICAtMjgzMywgICAtMzA0LCAgICAtNTEsICAgIDQwMCwgICAtMjg0LCAgIC04MTAsICAgIDgyNCwgICAgLTcxLAorICAgICAgLTEzNSwgICAgMTk0LCAgICAyOTcsICAgLTI5NywgICAxMTI5LCAgICA2NjAsICAgIDUxOCwgICAyNDI2LAorICAgICAgLTIyNSwgICAgMjUxLCAgIDQ2NzcsICAgLTE3NiwgICAtNDY0LCAgICAyOTYsICAtMTIwOCwgICAtNDIzLAorICAgICAgLTg3NSwgICAtNTgxLCAgIC03MDcsICAtMTE1MCwgICAgNDk5LCAgIC03NzgsICAgICAyOCwgICAgIDI5LAorICAgICAgIDEwMSwgIC00MjEzLCAgIC0xMjcsICAtMzY4MSwgICAgNDI1LCAgICA0ODEsICAgLTUyOSwgICAtNjc5LAorICAgICAgICAxMSwgICAgMjY2LCAgICAxMjcsICAgLTQ0NSwgICAgNTI3LCAgIC01NzcsICAgIDMxMCwgICAxNDY1LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IxMTEwbDBbXSA9IHsKKyAgICAgLTM3NDgsICAtMzgyMCwgICAtMTA1LCAgICAgMTYsICAgIC0yMiwgICAgIC03LCAgICAxMTIsICAgIC0xNCwKKyAgICAgICAgNTIsICAgICAyOCwgICAgLTQyLCAgIC0xMTMsICAgIDEzMiwgICAgLTgxLCAgICAgLTgsICAgLTExMiwKKyAgICAgICAgMTksICAgICAzMywgICAtMjUxLCAgICAxMTcsICAgIC0zMywgICAgIC05LCAgICAtMTMsICAgIC0yOCwKKyAgICAgICAgNjAsICAgIC0zMCwgICAgIDI5LCAgICAgMjcsICAgIC01OCwgICAgIC03LCAgICAgIDQsICAgICA0MywKKyAgICAtMTAxMDgsICAgIC0zOCwgICAgIC0zLCAgICAgNDgsICAgICAgMywgICAgLTIzLCAgICAyMDIsICAgLTE3NSwKKyAgICAgIC0yMDIsICAgICA3MSwgIC0yMTQzLCAgICAgIDMsICAgIC04MiwgICAgLTM4LCAgIC0xMTMsICAgIDE0MSwKKyAgICAgICAgMzgsICAgIC02NiwgICAtMTE4LCAgICAtMzgsICAgIC0xNCwgICAgMTQ4LCAgIC0yNjQsICAgIDE0MywKKyAgICAgICAtMTMsICAgIC01NiwgICAgIC05LCAgICAtMjEsICAgIC0yOCwgICA4OTMwLCAgICAtMjMsICAgICA1MywKKyAgICAgICAtNDAsICAgICAzMCwgICAgIDcyLCAgICAtNDYsICAgICAyNiwgICAgIDY2LCAgICAgMjIsICAgICAzMiwKKyAgICAgICAgNDQsICAgICAyMiwgICAgLTUwLCAgICAtNjYsICAgLTExNSwgICAtMTQxLCAgICAgMjQsICAtMzAxMywKKyAgICAgLTM0NjAsICAgIDQ5MiwgICAgMjA3LCAgICAtNjIsICAgLTU2NywgICAgMTM0LCAgICAtMjYsICAgIC02NCwKKyAgICAgICAyODcsICAgIDM0MywgICAtMjEzLCAgICAgNDIsICAgLTI3NCwgICAtMTQ0LCAgIC0xNDQsICAgIC03NywKKyAgICAgICAtMjYsICAgIC0zOSwgICAgICA0LCAgICAgLTQsICAgICA0MiwgICAgIDQzLCAgICAgMzAsICAgIC0xNiwKKyAgICAgICAgMzQsICAgIDExMywgICA5MjkxLCAgIC0xNzEsICAgIC0xNywgICAgIDI0LCAgICAtNTMsICAgIC0yNywKKyAgICAgICAgNDUsICAgICA0MiwgICAgNTMzLCAgICAxNDYsICAgIC02NSwgICAgIDMyLCAgICAxNTYsICAgLTE0NCwKKyAgICAgIDI4MjEsICAgIDg4OSwgICAgIC03LCAgICA2MTQsICAgICAxMSwgICAgICAxLCAgIC00NzMsICAgIDQzNCwKKyAgICAgICA2NTksICAgLTMyMywgIC0yNDQ4LCAgICAgMjMsICAgLTEzOCwgICAtNTgyLCAgICA0MzYsICAgLTE1MiwKKyAgICAgICAtMzAsICAgICAyOSwgICAtMjkwLCAgIC0zMDIsICAgMzEyNywgICAgNDk2LCAgICAgMTQsICAgLTM0NiwKKyAgICAgICAtNzAsICAgIDQ1NywgIC0xOTc2LCAgIC0yMjksICAgICA1MywgIC0yMDc3LCAgIC0zMTMsICAgICA1OCwKKyAgICAgICAgMzMsICAgIC05MSwgICAtMTc1LCAgICAxNDEsICAgMjcyOCwgICAzMjMyLCAgLTIxNTAsICAgIDI0NSwKKyAgICAgIC0xNDIsICAgICAxMywgICAtMzE4LCAgICAgNzAsICAgLTE1MiwgICAgLTY0LCAgICAxMzIsICAgLTMyMiwKKyAgICAgICAgNDQsICAgICAzMCwgICAgLTcwLCAgIC0xODQsICAgIDQzMywgICAgLTI1LCAgICAtOTcsICAtMjAzNSwKKyAgICAgICAxNDUsICAgICA0NywgICAgNjQwLCAgICAxNzksICAgLTQ0MSwgICAgIDQ4LCAgIC0xMDgsICAgMTc0MiwKKyAgICAgIC0yODAsICAgICAzMywgIC0zMjU5LCAgICAgNzksICAgLTE0NywgICAgMzI0LCAgICAtODAsICAgICA2NSwKKyAgICAgICAgNDgsICAgICA5MCwgICAgIC03LCAgICAtMjEsICAgICAyMiwgICAgICAzLCAgICAgNTYsICAgIC0zMCwKKyAgICAgICAgMTQsICAgICAtMiwgICAtMTExLCAgICAgMjIsICAgICAtOCwgIC04MjUyLCAgIC0xMDMsICAgIC0zNiwKKyAgICAgICAgNTcsICAgLTIwMywgICAgMjg3LCAgLTI3NjEsICAgLTIyMCwgICAgMTQzLCAgICAgMTEsICAtMzU5NywKKyAgICAgICAgMjEsICAgIC04MSwgICAgIDYyLCAgICAtOTksICAgICA0MSwgICAtMTcyLCAgICAxMDgsICAgICAyOSwKKyAgICAgICAzNTEsICAgLTM3MCwgICAgIDE1LCAgIC0xMjIsICAgLTIwNywgICAgMjc1LCAgICAtOTMsICAtMjc2MCwKKyAgICAgICA0MDAsICAgLTIxMiwgICAgMjI1LCAgICAyMzAsICAgLTIzOSwgIC0zNTMwLCAgICAtNzMsICAgIDIxMSwKKyAgICAgICAyODgsICAgICA4NSwgICAgIC02LCAgIC02MzQsICAgICA1NywgICAgLTc4LCAgICAzNjEsICAgLTE0OSwKKyAgICAgLTE4NDMsICAgIC0yMywgICAgIDE3LCAgICAtMzcsICAgIC03MSwgICAtMTc0LCAgIC0yMzcsICAgICA0MiwKKyAgICAgICAtMjIsICAgLTI0MywgICAgIDYzLCAgIC0xMDEsICAgIDEzMSwgICAgIDM1LCAgICAxMzYsICAtNDAyNSwKKyAgICAgICAgNDEsICAgLTI2MiwgICAgLTU3LCAgICAxOTcsICAgLTI5MCwgICAgMzA3LCAgICAgMzUsICAgIC0xNiwKKyAgICAgICAgIDMsICAgICAtNSwgICAgIDQ1LCAgICAgLTcsICAgICAgMSwgICAgLTQ3LCAgICAgNDEsICAgIC0xOSwKKyAgICAgICAgNzksICAgICA3OCwgICAgIDQyLCAgICAtODUsICAgICA3NCwgICAtNDE0LCAgIDE2OTYsICAgIDcwMywKKyAgICAgICAyOTcsICAtMzI5NiwgICAgMTA4LCAgIC01NDYsICAgMTEyOSwgICAgIDQ0LCAgICA0NDcsICAgLTQzMywKKyAgICAgICAzMTUsICAtMTAxMiwgICAgMTMzLCAgICAxNDEsICAgMTA1MSwgICAgNjAxLCAgICAtMTgsICAgLTUzMiwKKyAgICAgICAtMzAsICAgIDcxMiwgICAtMTI3LCAgIC0yMTAsICAgICAxMCwgICAyNDQyLCAgICAtOTUsICAgIC00NiwKKyAgICAgICAtMTQsICAgICA3NywgICAgIDMyLCAgICAtMTEsICAgICAxMCwgICAtMTAzLCAgICAtMTUsICAgIDYzNywKKyAgICAgICAtNjAsICAgIDM1MiwgICAgNjk0LCAgIC0yMDIsICAgIDI4NCwgIC01NTI0LCAgICAgOTIsICAgIC04MiwKKyAgICAgICAgIDUsICAgIDE0MCwgICAgLTU0LCAgIC0xMTUsICAgICA0NSwgICAgMjg3LCAgICAtMTQsICAgLTMwNywKKyAgICAgIC0zNDIsICAgICAxMCwgICAtMTgxLCAgICAgNTAsICAgIC0zMCwgICAgIC02LCAgMTAxNDQsICAgICA3NywKKyAgICAgICAgNDIsICAgICAxMywgICAgIDI2LCAgICAtMjAsICAgICAzNCwgICAgIDEwLCAgICAgMzcsICAgIC0zNywKKyAgICAgICAtNDcsICAgICA5MCwgICAgIC01LCAgICAtNDQsICAgIC04NSwgICAgLTY0LCAgICAtNTEsICAgICAtMSwKKyAgICAgICAgMTYsICAgLTE1MiwgICAgLTkxLCAgICAyMTIsICAgICAgNCwgICAgLTI1LCAgIC0yMzcsICAtNjEyNCwKKyAgICAgICAgMjIsICAgLTEyMCwgICAgIC0xLCAgICAxNzEsICAgIC0xNywgICAgLTQzLCAgICAxNDEsICAgIC0xMywKKyAgICAgICAtNTcsICAgLTE4NSwgICAgIDgwLCAgICAyNzMsICAgLTQ5MywgICAgMTc4LCAgICAgNDUsICAgICAxMSwKKyAgICAgICAtNTcsICAgICAxNiwgICAgLTIzLCAgICAtMzAsICAgIC0zNywgICAgIDgyLCAgICAgIDQsICAgIC0xMywKKyAgICAgIC0xMzAsICAgICA5OCwgICAgMjcyLCAgIC00NTAsICAgLTE2MSwgICAgMTMzLCAgIDUxMDQsICAgICAxNCwKKyAgICAgIDQ1NzYsICAgLTE5MywgICAgIDExLCAgICAgNTUsICAgIC0zMCwgICAgICAxLCAgICAxMjMsICAgLTI2NSwKKyAgICAgICAtODQsICAgLTM0MCwgICAgLTE4LCAgICAxNTIsICAgIC0yNCwgICAtMjY2LCAgICAgMzMsICAgIC05MCwKKyAgICAgIC0xMDgsICAgLTYzOSwgICAxNjYyLCAgICAyOTksICAgIC0xNCwgICAtMzg5LCAgIDQ2NzksICAgLTIyNiwKKyAgICAgICAgMjEsICAgIDMxMSwgICAtMjk0LCAgICAxNTksICAgLTIwOSwgICAgMTcyLCAgICAxODQsICAgIDI5MiwKKyAgICAgIC0zNzMsICAgIDE2OSwgICAgIDg0LCAgICAgNTUsICAgLTI2OSwgICAxNDUzLCAgICAtNTAsICAgICA0MSwKKyAgICAgICAgNjgsICAgICAtOSwgICAgLTYyLCAgICAgMzUsICAgICAyMywgICAtMTMyLCAgICAgOTYsICAgICA1OCwKKyAgICAgIC0xMjIsICAtMzk1NiwgICAtMzE4LCAgICAyMTAsICAgLTExNywgICAgNjc4LCAgIC0xMDQsICAgIDM3OCwKKyAgICAgIC04NDIsICAgICA2MSwgICAyNTQ5LCAgICAgMzcsICAgIDE0OSwgICAtNTEyLCAgICAgNzAsICAtMjk3MSwKKyAgICAgICAyMjUsICAgLTQxMSwgICAgMjMwLCAgIC0yMTQsICAgIDY5NywgICAgLTU4LCAgIC04NzEsICAgLTI4MSwKKyAgICAgIC0xMjgsICAgLTIwNCwgICAgLTM3LCAgIC0xMjgsICAgICA1MSwgICAtMTc0LCAgIC00MDUsICAgIDQ5NywKKyAgICAgLTQ0NTUsICAgLTIxOSwgICAgMTI0LCAgIC0xMjAsICAgICA2MywgICAgMTM1LCAgICAyMDEsICAgLTEyMiwKKyAgICAgIC00MzUsICAgLTY3NywgICAgMjIxLCAgICAxMzgsICAgIDQ4NiwgICAgNTM1LCAgIDMxNTMsICAgIDE2NSwKKyAgICAgICAgMTEsICAgLTI3NSwgICAgIDk0LCAgIC0xMDAsICAgICA2OSwgICAgIDUyLCAgICAtNjcsICAgLTc0MiwKKyAgICAgICAyMTIsICAgICAxNiwgICAgLTkzLCAgIC00MjgsICAgIDg2MywgICAgLTE3LCAgLTI0NjUsICAgIDc2NywKKyAgICAgICAtMzUsICAgLTEzMCwgICAgIDk3LCAgIDEzODcsICAgICAzNCwgICAgIDcyLCAgICAtMjMsICAgIC0xNywKKyAgICAgIDI4NDUsICAgIC05MCwgICAgLTcxLCAgICAyMTMsICAgIDI5MSwgICAgIDg3LCAgICA4MjYsICAgIC02MywKKyAgICAgICAxODksICAgIDY0MSwgICAtMjU2LCAgICA4MzIsICAgMjA4NywgICAtMTk5LCAgIC0xNzAsICAgLTE5MywKKyAgICAgICAtNjIsICAgICAtNywgICAgIDM3LCAgICAtNjAsICAtNDI3NywgICAgLTQzLCAgICAgMjQsICAgIC02OSwKKyAgICAgICA1NzQsICAgLTE2MywgICAtMTEzLCAgICAyNjMsICAgIC04NiwgICAgIDQ1LCAgICAxNzEsICAgMTA3NSwKKyAgICAgIC0xNTQsICAgIC0zOSwgICAgMTIxLCAgICAgNzQsICAgLTEzMiwgICAgMTgyLCAgICAgMzQsICAgICAxMywKKyAgICAgIC0yNzgsICAgIC00MSwgICAgIDk2LCAgICA3MTYsICAgLTIyMSwgICAtNjI2LCAgIDEyMDUsICAgIDI0NCwKKyAgICAgIC0zNTEsICAgMzkxNCwgICAgLTc4LCAgICAtMzIsICAgMjgzMywgICAtMTUwLCAgICAtMzcsICAgICA5NSwKKyAgICAgIC0yMjcsICAgIC04NCwgIC0zNDMyLCAgICAgNTcsICAgIDIzOCwgICAtMTQzLCAgIC0zNjUsICAgICAzOSwKKyAgICAgICAgMjcsICAgLTIzOCwgICAtMzA3LCAgIC0xNzAsICAgIDEyNCwgICAgIDY2LCAgIC0xMzMsICAgICA0MCwKKyAgICAgICAgNjIsICAgIC0xOSwgICAgIDQyLCAgICAtNjYsICAgICAgMiwgICAgLTgwLCAgICAgLTIsICAgICA2MCwKKyAgICAgICAgIDcsICAgICAxMCwgICAgMjYzLCAgLTQ5ODcsICAgIC02OSwgICAtMzg5LCAgICAgNjIsICAgIC01MywKKyAgICAgICAtNjYsICAgICAyNCwgICAgLTg3LCAgICAgMTMsICAgICAzNCwgICAgLTE1LCAgICAtMjUsICAgIC0yMCwKKyAgICAgICAxOTcsICAgICAgOSwgICAgMTAxLCAgICAtODMsICAgIC03OSwgICAtMTU2LCAgIC0xMDAsICAgICAgMiwKKyAgICAgIC0xMDgsICAgNTY4NywgICAtMTU3LCAgICA4NzgsICAtMTcyOCwgICAgIDMyLCAgICAgNzIsICAgIC02NiwKKyAgICAgICAgNzAsICAgICAtMiwgICAgLTQ2LCAgIC0xNjMsICAgIDIwNiwgICAgIDE3LCAgICAyNDcsICAgMjk3NCwKKyAgICAgICAtNjYsICAgMTM1NCwgICAgMzM1LCAgICAyMzgsICAgLTI0OSwgICAtNDEwLCAgIC01NTMsICAgIDM1NCwKKyAgICAgICAtNDEsICAgIDEzMiwgICAgLTk2LCAgICAgNjgsICAgMjE3NCwgICAtMzI5LCAgICAtNTgsICAgIC03NiwKKyAgICAgICAgIDYsICAgMzA4OSwgICAgMjg0LCAgIC0yNzQsICAgLTM5OCwgICAgNDcxLCAgICAyODMsICAgIDQyNywKKyAgICAgIC0yMjAsICAgICA4MSwgICAyNjc2LCAgICAgNDAsICAgIC0yMywgICAgLTQ2LCAgICAyNTEsICAgIDEwOSwKKyAgICAgLTMwNTksICAgICA1MCwgICAgLTI1LCAgIC01NTEsICAgIDEyNCwgICAtMzg5LCAgICAyMjgsICAgICA5NSwKKyAgICAgICAgNTYsICAtMTMyMCwgICAgLTc5LCAgIDEwMjcsICAtNDkzOCwgICAtMTA1LCAgICAtODIsICAgICAxMywKKyAgICAgIC0xNTksICAgICA1MiwgICAtMTAxLCAgICAgMjMsICAgLTIyMCwgICAgLTc3LCAgIC0xNTMsICAgIDExMywKKyAgICAgIC0yODIsICAgICA0MiwgICAgMTg1LCAgIC0xNDQsICAgLTQwMiwgICAgIDQ2LCAgIC0xNDQsICAgIC05OSwKKyAgICAgLTI4NjIsICAtMzQzMiwgICAgIC0yLCAgICAgMTYsICAgIC0zMiwgICAgIDIzLCAgICAtMjUsICAgLTE0NSwKKyAgICAgICAxODEsICAgICA0OSwgICAgICA2LCAgIC0yMzYsICAgLTIyNiwgICAgLTI4LCAgICAyMzQsICAgIC0yNiwKKyAgICAgICAtODksICAgIC0xNCwgICAtMzU1LCAgICAxNDYsICAgIDExNywgICAgLTUwLCAgICAgNzYsICAgIC0xMCwKKyAgICAgICA0NDEsICAgIC05NSwgICAgIC0yLCAgICAzNDYsICAgLTI0MiwgIC0zNzQ1LCAgICA4ODQsICAgLTMwNSwKKyAgICAgIC0xODQsICAgIDM1MCwgICAgIDE4LCAgIC0yOTMsICAgLTMyOCwgICAgMjU3LCAgICAxMDksICAgICA0OSwKKyAgICAgICAxNTcsICAgIC00NCwgICAgLTcwLCAgICAgMzUsICAgICAgNiwgICAgIDg5LCAgLTQwODUsICAgLTE2NywKKyAgICAgIC0yNjMsICAgIC01OSwgICAgIDM1LCAgICAtMTMsICAgIDQzMCwgICAtMjEyLCAgICAgMTcsICAgLTYxOCwKKyAgICAgICAgLTUsICAtODk2OCwgICAgMTE0LCAgICAgNDEsICAgICA3MywgICAgLTg1LCAgICAxMjIsICAgICAgNSwKKyAgICAgICAgMzgsICAgICAxOSwgICAgLTYwLCAgICAgMTQsICAgIC0zNiwgICAgLTQyLCAgICAtODksICAgICAyMCwKKyAgICAgICAgODUsICAgIC0xNywgICAgIDIwLCAgICAyODIsICAtMzM5NiwgICAgLTI1LCAgIDM3MjIsICAgIDE1MSwKKyAgICAgIC0xODMsICAgIDEwMCwgICAtMTUwLCAgICAgMTksICAgLTIyMSwgICAgMTI2LCAgICAgMzQsICAgIC0yMSwKKyAgICAgICAgNzIsICAgICAyOCwgICAgMTM4LCAgICAtOTAsICAgICAzMCwgICAgMTYyLCAgICAgNDYsICAgICA0MCwKKyAgICAgICAgMjcsICAgICAxNSwgICAgLTU1LCAgICAtMjEsICAgICAzOCwgICAgIDU1LCAgICAgMzIsICAgICA4MywKKyAgICAgIDk2NzUsICAgICAzMSwgICAgIDI2LCAgICAgLTIsICAgICAgNCwgICAgIDk2LCAgICAtNTEsICAgIDEyMCwKKyAgICAgIC0xMzIsICAgIDIxMywgICAyMTA2LCAgICAgMzksICAgLTI1MSwgICAgIDk4LCAgLTI1NzIsICAgLTQyOSwKKyAgICAgIC0zMzEsICAgMTQzNiwgICAyMDc4LCAgICAzMzUsICAgLTM4MSwgICAgMzcxLCAgICAyOTksICAgIDMzOSwKKyAgICAgICAzMDAsICAgLTE0MSwgICAgLTk5LCAgIC0zMDMsICAgMjk1MiwgICAgIDQ5LCAgICAgOTMsICAgICA0MCwKKyAgICAgLTM5NDksICAgIC00NSwgICAgIDUwLCAgIC0yMTUsICAgICA3MywgICAgLTM5LCAgIC0xNjUsICAgLTI4MywKKyAgICAgICAgNDYsICAgLTEyMywgICAtMzQ3LCAgICAgMjMsICAgLTE1OCwgICAgIDQxLCAgICAgMjAsICAgICA0MSwKKyAgICAgICAtNDYsICAgICAxOSwgICAgIDM0LCAgICAgODYsICAtODc3MCwgICAgIDQwLCAgICAgMjAsICAgIC0zMiwKKyAgICAgICAtMzAsICAgIC0xNiwgICAgIDc3LCAgICAgNzIsICAgICAtNCwgICAgIDkyLCAgICAtMzQsICAgIDEwMywKKyAgICAgICAtNzcsICAgIDEyOCwgICAtNTMyLCAgIC0zMTQsICAgICAyNCwgICAgNzI4LCAgICAgNDksICAgIC0zNiwKKyAgICAgIC0xNzgsICAgICA3NiwgICAgIDIyLCAgICAtMTQsICAgLTE2NCwgICAtMTk0LCAgICAgNjksICAgMzEzMywKKyAgICAgIDEwMDcsICAgLTEzMCwgICAtMjgwLCAgIDI1MDIsICAgIDQ4MiwgICAgIC0yLCAgICAgNDUsICAgIC02MiwKKyAgICAgICAgLTcsICAgIC05NCwgICAgIDE3LCAgICAgMjMsICAgICAtNCwgICA5NTE2LCAgICAtMjcsICAgICAxMSwKKyAgICAgICAgMjIsICAgICA1NCwgICAgLTEzLCAgICAgIDIsICAgICAtMiwgICAgICA2LCAgICAtMjIsICAgIC02MywKKyAgICAgICAgNjcsICAgLTY4NiwgICAgMTMwLCAgLTIxODAsICAgLTEyNCwgICAgIDU3LCAgICAtNjEsICAgLTE1OCwKKyAgICAgIDMzNjQsICAgIDUxOCwgICAgICA0LCAgICAzMTUsICAgLTM2NywgICAtMTAzLCAgIC0yOTUsICAgIDI1OSwKKyAgICAgIC01OTcsICAgICA1NiwgICAgIC02LCAgICAgNzIsICAgIC04NiwgICAgLTQ1LCAgICAtMTMsICAgIC00NywKKyAgICAgICAtMTMsICAgIC0yNywgICAgIC0zLCAgICAgNDgsICAgIC0xMiwgICAgLTUyLCAgICAgLTYsICAgIC0xNCwKKyAgICAgICAtMjYsICAgIC0xNiwgICAgLTM0LCAgIDk1NTQsICAgICA4MCwgICAgIDkxLCAgIC0yNzAsICAgICAgMSwKKyAgICAgIC0xMjEsICAgIDExNywgICAgIDMzLCAgICAgIDgsICAgICA0MCwgICAgLTk5LCAgICAtNzksICAgICA0MywKKyAgICAgLTM0NTEsICAgIC05MiwgICAgLTcwLCAgICAtNTcsICAgICA0MywgICAgIDY4LCAgICAgNjQsICAgIDI4NCwKKyAgICAgIC02MzksICAgIDQ1OCwgICAgMTE4LCAgICAtNTQsICAtMjc1NSwgICAgMzcwLCAgICAtNjYsICAgICA1NCwKKyAgICAgICAgMjcsICAgLTE5OCwgICAgMzMxLCAgICAxMTUsICAgIC00MCwgICAtMjA5LCAgIC0zMTIsICAgICA4MiwKKyAgICAgICAtMTYsICAgICAgOCwgICAgMjMwLCAgICAyMTIsICAgMTg1MywgICAgLTk0LCAgIDE5NTcsICAgLTExOCwKKyAgICAgICAxNTMsICAgIC0xMywgICAgLTczLCAgICAgNzEsICAgIDExNiwgICAgLTcyLCAgLTMyODUsICAgIDEwNiwKKyAgICAgICAgMTksICAgLTEyMSwgICAgMTc3LCAgIC0zMDAsICAgIDQ1NSwgICAgLTI5LCAgICAgOTQsICAgIDE5MCwKKyAgICAgICAtMjEsICAgICAtOCwgICAgMjAxLCAgICAgMTYsICAgICAgMiwgICAgIDgzLCAgLTYyODAsICAgICAzMiwKKyAgICAgICAtMTgsICAgICA1OSwgICAgLTE4LCAgICAtNDEsICAgLTEzMiwgICAgIDIyLCAgICAgIDEsICAgIC0zOSwKKyAgICAgIC0yMTIsICAgLTE5OCwgICAgMTg2LCAgIDMxNTQsICAgLTEwMiwgICAzNDYzLCAgIC0yODAsICAgLTExOCwKKyAgICAgIC0xMzIsICAgLTEzMiwgICAgIDYzLCAgICAtMTksICAgIDM1MywgICAgLTI0LCAgICAtNzcsICAgIDIyNCwKKyAgICAgICAgODIsICAgIDE0MywgICAgLTY1LCAgICAxNjUsICAgIC0xNiwgIC0zNzc0LCAgIDM1NDMsICAgIC0yOCwKKyAgICAgICAtNDQsICAgICA5MywgICAgLTQ1LCAgICAtMTMsICAgIC0yNCwgICAgIC01LCAgICAtNDAsICAgICA1OCwKKyAgICAgICAgIDMsICAgICA4OSwgICAgIDcxLCAgICAxMTMsICAgICA0NiwgICAgIDYyLCAgICAgNDQsICAgIDE2MCwKKyAgICAgICAtNzcsICAgICAtOCwgICAgLTU5LCAgLTY1MDUsICAgIDEzNCwgICAgLTQyLCAgICAtNzMsICAgICAgMCwKKyAgICAgICAgODUsICAgICAgMiwgICAgIDE2LCAgICAgMzQsICAgIDE1NywgICAgLTM0LCAgICAtNjAsICAgICA3OCwKKyAgICAgICAgMjQsICAgICA2NCwgICAgIDk2LCAgICA0NzgsICAgIDIzMSwgICAtMTI1LCAgIC0yMTcsICAgICAxMywKKyAgICAgICAgMjEsICAgICA0NCwgICAgIDgzLCAgICAxOTgsICAgIC02OSwgICAgIDIxLCAgIC0xNjcsICAgIC01MiwKKyAgICAgIDQwODUsICAgLTIzNCwgICAtMzkzLCAgICAgMTcsICAgLTQ0NiwgICAtMzU0LCAgICAtMjgsICAgICA0MiwKKyAgICAgICAgNTMsICAgIC0zNywgICAgIDI4LCAgICAgMTUsICAgIC0xNiwgICAgLTEwLCAgICAtODUsICAgOTQ3MSwKKyAgICAgICAtMTYsICAgIC04OSwgICAgLTg3LCAgICAtNTYsICAgICA1MiwgICAgLTk3LCAgICAgODYsICAgICAtNywKKyAgICAgIC0xMDMsICAgIC0xMiwgICAgIDcxLCAgICAtMzksICAgICAxNywgICAgLTQwLCAgICAgMjMsICAgICA2MywKKyAgICAgICAgNjUsICAgIC0xOSwgICAgLTE0LCAgIC0xMDYsICAgICAyOSwgICA5NzA3LCAgICAgLTEsICAgIC0xMiwKKyAgICAgICAgIDEsICAgIC04NiwgICAgMTAwLCAgICAgIDcsICAgMTA5NywgICAgMjY2LCAgICAyNTIsICAgIDE5NywKKyAgICAgICAtNjQsICAgLTIxNCwgICAtMTk3LCAgICAtMjgsICAgMzg0MywgIC0xNTc3LCAgICAzMTAsICAgLTExNywKKyAgICAgICA1OTQsICAgICAxMywgICAgIDkwLCAgIC0zMDksICAgLTM4NCwgICAgMTM0LCAgICAtOTAsICAgLTE5NCwKKyAgICAgIC0zMTYsICAgMjg4NCwgICAgMTU2LCAgIC0xODUsICAgIDE5NiwgICAtMTAzLCAgICAgNzUsICAgMTAwOSwKKyAgICAgICAgNjksICAgIDc2OCwgICAgLTc1LCAgIC02MDUsICAtMTQ4OCwgICAgMzg5LCAgICAyNDIsICAgIDM2OCwKKyAgICAgICAyNzgsICAgLTEyMiwgIC0yNTAwLCAgICAxMjEsICAgICAgNywgICAtMzAzLCAgICAgOTEsICAgIC0xMCwKKyAgICAgIDM2NDIsICAgICAyMywgICAtMTA5LCAgICAtMTMsICAgIDEzOCwgICAtNDA1LCAgICAgMTgsICAgIC00MywKKyAgICAgICAgIDMsICAgICA0MiwgICAgMTk0LCAgIC0xMTIsICAgIDIzNywgIC0yMjQxLCAgICAgMjMsICAgIDI5NiwKKyAgICAgICAtODMsICAgIC0xNCwgICAgLTU4LCAgIC0xNjMsICAgICAtOCwgICAtMTc0LCAgIC0yMzksICAgICA4NSwKKyAgICAgIC0xMDgsICAgIC04MiwgICAgLTc5LCAgICAzNDQsICAgIDIzNiwgICAtNDI3LCAgICAxMjcsICAgICA1MiwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMTExMGwxW10gPSB7CisgICAgICAgLTY0LCAgICAgMTEsICAgIC03NCwgICAgLTk2LCAgICAgMzksICAgNjA3MiwgICAgIDE2LCAgICAgNDYsCisgICAgICAtMjE1LCAgICAxMzcsICAgICA3NywgICAgMTI4LCAgIC0xOTUsICAgLTE5MiwgICAgLTg3LCAgICAgOTYsCisgICAgICAgMzc5LCAgICAtNzMsICAgIDM2NywgICAgNDM3LCAgIC0zNjYsICAgICA4NCwgICAtMTU1LCAgICAtMjksCisgICAgICAgLTY5LCAgICAtNjEsICAgIC0zNCwgICAtMTI5LCAgICAyNjAsICAgLTE3NywgICAzNzM4LCAgICA3MzksCisgICAgICAtMjIxLCAgICAtMTQsICAgIC00MCwgICAgICAyLCAgIC00ODMsICAgLTI2OSwgICAyNjY0LCAgICAxNjYsCisgICAgICAgIDI5LCAgIC0yNTYsICAgICAzMCwgICAgIDkyLCAgICAgNTEsICAgIDExMSwgICAgLTQ1LCAgIDM4OTMsCisgICAgICAgIDkwLCAgICAtMzAsICAgIC05OSwgICAgIDEyLCAgICAgNzQsICAgIDIwMSwgICAgLTUyLCAgICAtOTYsCisgICAgICAtMTk2LCAgICAtODUsICAgIC0zNiwgICAgMTIzLCAgICAtNDQsICAgIC02OCwgICAgICAyLCAgIDg2NjYsCisgICAgICAgIDMzLCAgICAtNDEsICAgICAyNCwgICAgLTEyLCAgICAtNTIsICAgICA2OSwgICAgIDU5LCAgICAtMjcsCisgICAgICAgIDM4LCAgIC0xNDgsICAgIC01NSwgICAgLTIwLCAgICAtNjAsICAgICA1MCwgICAzMzYzLCAgICAgMzAsCisgICAgICAzNzQ5LCAgICAtOTIsICAgIDIyOCwgICAgMTczLCAgIC0yMzksICAgLTE2NywgICAgLTc1LCAgICAtNzksCisgICAgICAgLTg2LCAgIC0yMTcsICAgICAzMiwgICAgIDM0LCAgIC0xMzcsICAgIC0xMywgICAgIDE3LCAgIC0xMjgsCisgICAgIC0xNDYyLCAgIC0xNzAsICAgLTIyNCwgICAtMzkzLCAgLTMzODMsICAtMTI0MywgICAgLTQ3LCAgICAgMjQsCisgICAgICAtMjIzLCAgICAgMjYsICAgIDMxMSwgICAtMzQzLCAgICAtNDcsICAgIDc4NCwgICAgNDU5LCAgIC01NDgsCisgICAgICAgNTU4LCAgICA5ODMsICAgIDEwMywgICAgMjY5LCAgICAgMzIsICAgICAxMywgICAgIDE5LCAgICAtODQsCisgICAgICAgLTM3LCAgICAtMjksICAgIC00NywgIC02Mjg2LCAgICAgIDcsICAgICA0OCwgICAtMTAwLCAgICAgMTMsCisgICAgICAgIDExLCAgIC0yNzEsICAgIC04NiwgICAgMTE1LCAgICAtMTcsICAgIDE4MywgICAzMjQ3LCAgLTMzMzYsCisgICAgICAgIDU3LCAgICAtNjcsICAgLTExNywgICAgLTg3LCAgICAgMTksICAgICA3NCwgICAtMjcxLCAgICAyMzcsCisgICAgICAgLTI0LCAgICAyNDIsICAgICA0OSwgICAtMTc5LCAgICAyOTgsICAgICA4NSwgICAgLTY5LCAgICAzMjgsCisgICAgICAtMjM4LCAgICAtMzQsICAgIDEwMywgICAgLTUwLCAgICAgNzksICAgICAgMiwgICAgLTI3LCAgICAtMTYsCisgICAgICAtMTAzLCAgICAtNjEsICAgNTg2OCwgICAtMTA1LCAgIC0yNjIsICAgICA3NCwgICAgLTc0LCAgIC0xNTgsCisgICAgICAgMjYzLCAgIC0xMTAsICAgIDE1NCwgICAgMjEyLCAgICAgLTMsICAgIC04NCwgICAtMTI2LCAgICAgMjUsCisgICAgICAgLTY3LCAgLTI1MDEsICAgIC0xMiwgICAgLTM1LCAgICAxMzksICAgIDI1OSwgICAgLTk1LCAgIC0xNDEsCisgICAgICAgMTM3LCAgICAgOTAsICAgICAxMiwgICAtMjQ0LCAgIC0xNDIsICAgIDMxNCwgICAgIDE1LCAgIC0xMjQsCisgICAgICAgICAxLCAgICAtMjUsICAgIC0yNywgICAgIC0yLCAgICAgLTYsICAgICAyOCwgICAgLTQ4LCAgICAtMTcsCisgICAgICAgIC0yLCAgICAgNDMsICAgICA2NywgICAgIDQyLCAgIDkwMjMsICAgIC0yNSwgICAgIDE5LCAgICAtMTMsCisgICAgICAgLTIzLCAgICAtNDMsICAgICA3MywgICAgLTMwLCAgICAxNDMsICAgICAtMSwgICAyODg0LCAgIC0xNDIsCisgICAgICAgIC00LCAgIDM1NDksICAgIC00OSwgICAtMzY2LCAgICAxMTAsICAgIDMxNCwgICAgIDE5LCAgICAtNTUsCisgICAgICAgMzYzLCAgICAyMDQsICAgIDQ2OSwgICAgMTg5LCAgICAyMTcsICAgLTE4MSwgICAgMTE5LCAgICAgNDEsCisgICAgICAtMTMzLCAgICAgMjksICAgIC01NSwgICAgLTk0LCAgICAgNzEsICAgIC00OSwgICAgIDQxLCAgICAgODUsCisgICAgICAgLTE0LCAgIDYxNDAsICAgICA3MSwgICAtMTQyLCAgICAgMTAsICAgICAxOCwgICAgMTY5LCAgICAxMzYsCisgICAgICAgMjgyLCAgICAtNDksICAgICAzNiwgICAgNDQ2LCAgICAtOTksICAgIDI2MywgICAgIDkyLCAgIDIyMDEsCisgICAgICAtMTI3LCAgICAgNDMsICAgLTE0MywgICAtMzUwLCAgICAgMzYsICAgIDM4OSwgICAtMjA4LCAgICAgMTUsCisgICAgIC0zNjEwLCAgIC0yNzUsICAgIDM4MywgICAxNTk5LCAgIC0xNzksICAgLTE3NywgIC0xMTAwLCAgICAgLTQsCisgICAgICAgIDY3LCAgICAtMzgsICAgICAgMiwgICAgMjc4LCAgICAgMzksICAgIDEwNywgICAtMTIwLCAgICA0NjUsCisgICAgICAgMjA0LCAgIC0zOTcsICAgIDMwNSwgICAgNDE2LCAgICAgIDcsICAgLTI2MiwgICAgIDY4LCAgIDIzNDEsCisgICAgICAgMTg5LCAgICAtNzUsICAgIC0yMywgICAgIDI1LCAgICAtMjAsICAgIC03NCwgICAgIDU2LCAgICAtNDMsCisgICAgICAtMTI1LCAgICAxNzAsICAgIDUwOSwgICAgIDYzLCAgICAgMjYsICAgIDI2MywgICAtNzQxLCAgICAtMzEsCisgICAgICAgICA4LCAgIC0yOTYsICAgIDEwMSwgICAgIDIwLCAgIC0xNDksICAgMjg0NiwgICAtMjE4LCAgICAzNzksCisgICAgICAtMzEwLCAgICAxNTEsICAgIDkwMSwgICAgIDg0LCAgICAtODUsICAgIC04MywgICAtMzg3LCAgICAxNjEsCisgICAgIC0zMTAyLCAgIC0xNTgsICAgLTQzOCwgICAgIDM4LCAgICAxOTEsICAgIC01OCwgICAtMjAyLCAgICAxMjcsCisgICAgICAgMTI2LCAgICAtODgsICAgLTQzMCwgIC0zMDc3LCAgLTE4MjksICAgLTMzMiwgICAgIDYxLCAgIC0xNTIsCisgICAgICAgLTE0LCAgICAtMzIsICAgLTE1NiwgICAgIC01LCAgIC0zNzUsICAtMTA4MywgIC01MTMwLCAgICAxMTAsCisgICAgICAgIDc3LCAgIC0yMDEsICAgIC0xNSwgICAgICA0LCAgICAgMTMsICAgICA4NiwgICAgMTE5LCAgICAgNjcsCisgICAgICAgMTQ5LCAgICAgODAsICAgIDI2NCwgICAtMjUzLCAgIC0xMjEsICAgICA2MywgICAgMTkzLCAgIC0xMDMsCisgICAgICAtMTI5LCAgICAgNjMsICAgIDEyMCwgICAtMjI2LCAgIC0xMDAsICAgMzE5NiwgICAgIDcyLCAgICAtMTEsCisgICAgICAgICA4LCAgICAtNTYsICAgIDI3OSwgICAgLTczLCAgIC0xOTIsICAgICA0NywgICAgLTg3LCAgICAxMjUsCisgICAgICAgLTQzLCAgIC0xMDgsICAgIDI3NywgICAgMTg4LCAgIC0xMDcsICAgIDI4OSwgICA1OTY2LCAgICAtMjAsCisgICAgICAtMzAzLCAgICAtNzgsICAgIC0yMSwgICAgIDQwLCAgIC0xMzksICAgICA0NCwgICAgIDI4LCAgICAgIDYsCisgICAgICAtMjU0LCAgIC0yNDQsICAgICA0NywgICAgIC0xLCAgIC0xNTEsICAgICAyOSwgICAtMzQ0LCAgLTIzMTgsCisgICAgICAgIDMwLCAgLTM3NjcsICAgIDExNCwgICAgIDg0LCAgIC0xNTUsICAgICA4NSwgICAgLTkwLCAgICAxNTUsCisgICAgICAgMTExLCAgIC01MDYsICAgICAgNiwgICAgNDUzLCAgIC0yNDEsICAgIDIxNSwgICAgMTMxLCAgIC04MDIsCisgICAgICAgIDE1LCAgIC0zNDMsICAgIDE3NiwgICAtNDMwLCAgICAyNTEsICAgIC03NCwgICAgICA2LCAgICAtNDEsCisgICAgICAgLTQ0LCAgIC0xMzEsICAgLTEwNSwgICAtMjQ4LCAgICAzNDYsICAgICAzOSwgIC00NTI0LCAgICAgOTMsCisgICAgICAtMTIwLCAgICAtNzksICAgLTc3NywgICAtNDE2LCAgIC01NzAsICAgLTIyMSwgICAgIDIxLCAgICAgMjgsCisgICAgICAgLTUyLCAgICAgNTYsICAgICA3MSwgICAtMTg3LCAgIDI5NDksICAtMjUzMSwgICAgNjY2LCAgICA3OTksCisgICAgICAtMTM3LCAgICA5NzAsICAgIDI0MywgICAtNjk1LCAgIC0xNDgsICAgLTI4MSwgICAgMzI2LCAgICA0NTAsCisgICAgICAtNzM0LCAgICAtOTksICAtMjA3OCwgICAgMTEyLCAgICAtODMsICAgIC05MCwgICAgLTc4LCAgICAyNjIsCisgICAgICAtMTM4LCAgICAtMzEsICAgICAtNSwgICAgLTc0LCAgIC0xNzEsICAgIC05OSwgICAgMzQ0LCAgICAxNDMsCisgICAgICA0MDM1LCAgICAgNTYsICAgLTEyMSwgICAtOTIxLCAgICAgLTgsICAgICA0NiwgICA0NTc2LCAgICAgOTcsCisgICAgICAtMjE5LCAgICAtMzQsICAgIDEyMywgICAgLTQ0LCAgICAgLTEsICAgICA4NSwgICAgLTM2LCAgICAzOTksCisgICAgICAtMjYwLCAgIC0yMzEsICAgIDEzMiwgICAtMzE4LCAgICAgNTUsICAgLTE4MSwgICAgMTU2LCAgLTMwOTMsCisgICAgICAgMTQyLCAgICAgLTksICAtMzQxOCwgICAgLTMxLCAgICAgNDMsICAgIDEyNiwgICAgMTM2LCAgICAzMDksCisgICAgICAgLTUwLCAgICAtMjAsICAgIDE3MCwgICAgLTkwLCAgICAxODgsICAgLTE3MywgICAgMTc1LCAgICAgNTAsCisgICAgICAgMTQ0LCAgIC0yNDQsICAgICAyMiwgICAgIDY0LCAgIC00NzYsICAgIC0yMiwgICAgLTY2LCAgICAyNzIsCisgICAgICAzODM5LCAgICA3MTUsICAgLTE4OCwgICAgLTgyLCAgIC0yNTAsICAgLTU4NywgICAgIDEwLCAgICAzNjgsCisgICAgICAtNTA3LCAgICAyNDIsICAgIC00MCwgICAtNTMxLCAgICA0NTEsICAgICAzNSwgICAgNTYwLCAgIC0xMDcsCisgICAgICAgMTM4LCAgICAgMTUsICAgIDExMywgICAgIDU2LCAgICAyNDIsICAgICAzMywgICAgLTIzLCAgICAtMjcsCisgICAgICAgIDgxLCAgIC0xNTcsICAgIDMwMSwgICAtMzI3LCAgICAzNTksICAgMzY0OCwgICAgIDYyLCAgLTE0ODksCisgICAgICAtMTY3LCAgICAxMzYsICAgIC0zOSwgICAgMTgzLCAgICAgNTMsICAgLTE1MSwgICAgLTE2LCAgICAtNjAsCisgICAgICAgLTY1LCAgLTUxODIsICAgIC0xNywgICAtMjU3LCAgICAtMTAsICAgICA1NiwgICAtMTA0LCAgICA3MTMsCisgICAgICAgIC0yLCAgICAzMjgsICAgICA3MiwgICAgMzUzLCAgICAgNDMsICAgIC01MSwgIC01OTQ5LCAgICAgNDAsCisgICAgICAgIDMyLCAgICAtODIsICAgIC0zNiwgICAgLTIyLCAgICAgNTcsICAgICA1NiwgICAgIDU1LCAgICAxMTIsCisgICAgICAtMTA0LCAgICAgNzYsICAgICAgNSwgICAgIDgwLCAgICAtMjksICAgIDE3MywgICAtMzYwLCAgIC0xMTMsCisgICAgICAgIDQyLCAgIC0xMTksICAgIDE4MCwgICAgLTI2LCAgICAxMjAsICAgIDI1MCwgIC0zMDI0LCAgICAxOTgsCisgICAgICAgMTE1LCAgIC0xNDAsICAgICAyMiwgICAgMTM2LCAgICAyNzUsICAgIDY5OCwgICAtMTQ5LCAgICA2OTksCisgICAgICAgNDI2LCAgIC0yMjAsICAgIDI3OSwgICAgIDYzLCAgICAgNTUsICAgIC02MywgICAtMTA4LCAgICAtNTEsCisgICAgICAgLTcwLCAgICAtNzAsICAgIDQxOSwgICAtMTU2LCAgIDU4NzAsICAgICAzMywgICAgLTU3LCAgIC0xMTQsCisgICAgICAtMzg4LCAgIC0yMTMsICAgLTE2NCwgICAxNTQzLCAgICAxMTcsICAgIDE2NSwgICAxOTQ0LCAgICAyMjMsCisgICAgICAgLTgzLCAgICAgNDYsICAgIDIwMSwgICAgIDEyLCAgIC0xMDMsICAgIDIyOCwgICAgMTM5LCAgIC0yMDcsCisgICAgICAgMTM2LCAgLTEyMTgsICAgLTU0NCwgICAtNzIzLCAgICAgOTAsICAgLTY1MiwgICAgNzkzLCAgICAgLTEsCisgICAgICAtMTAwLCAgICAtMzIsICAgLTIzNiwgICAgIDQ5LCAgICAxNjQsICAgIDEzOCwgICAgIDE2LCAgICAgODIsCisgICAgIC0zMjIxLCAgICAtNjIsICAgLTE2OCwgICAgIDYyLCAgIC0zMTMsICAgICA5OCwgICAtNjUyLCAgIC00ODQsCisgICAgICAgNjg0LCAgICAtOTEsICAgICAzMywgIC0yOTI2LCAgLTM0NTMsICAgIDU2NiwgICAgIDM0LCAgICAgMzUsCisgICAgICAgMTA0LCAgICAgMTMsICAgIDE4OSwgICAgMjM1LCAgICAtNDksICAgLTMyNCwgICAgMTI2LCAgICAyMjYsCisgICAgICAtMTAyLCAgICAxMjMsICAgLTI1MywgICAtNDAzLCAgICAgMzgsICAgIDE2MCwgICAgIC01LCAgICAxMDAsCisgICAgICAgLTMwLCAgICAgMTYsICAgIC0xOSwgICAgLTQ0LCAgICAgIDIsICAgIC03MCwgICAgLTMwLCAgICAgODIsCisgICAgICAgMTE4LCAgICAgIDYsICAgIDEzMiwgICAgLTE1LCAgICAtMzYsICAgICA1OSwgIC04ODM1LCAgIC00NDgsCisgICAgICAzNzA3LCAgICAzMjQsICAgICA4NywgICAgIDY3LCAgIC0xMTAsICAgIDExNCwgICAgLTc2LCAgICAyOTQsCisgICAgICAgMzU0LCAgICAgIDcsICAgIDE0MCwgICAgIDExLCAgICAzNDAsICAgLTExNywgICAtNTU5LCAgICAgNjcsCisgICAgICAgMTI5LCAgICAyMDEsICAgLTMxNCwgICAgMzI4LCAgIC0yMDksICAgIDEwMiwgICAtMTIxLCAgICAzNzgsCisgICAgIC01MDEwLCAgICAxNDAsICAgICA1MywgICAgIDE1LCAgIC0yNTMsICAgIC0xNCwgICAgNDE0LCAgIC0xODMsCisgICAgICAgLTcwLCAgICAtMjUsICAgIC01MSwgICAgIDM0LCAgIC0zNDcsICAgLTE3MSwgICAgMTQ2LCAgICAtOTgsCisgICAgICAtMTAxLCAgICAgLTMsICAgIC05OSwgICAgIDk2LCAgICAgNjYsICAgICA1MCwgICAgIC01LCAgIC0xMTUsCisgICAgICAgLTIzLCAgICAtNDUsICAgLTM1MSwgIC00MjAyLCAgICAxNDMsICAgIDQ4MCwgICAgLTQ2LCAgICAxNDAsCisgICAgICAgIDE3LCAgLTYzMTIsICAgLTExMCwgICAgLTIzLCAgICAxNTAsICAgICA2MCwgICAgLTM5LCAgICAgLTksCisgICAgICAgLTQ4LCAgICAtNjAsICAgICAtOCwgICAgLTIwLCAgICAgMzcsICAgICA1NywgICAtMTYyLCAgICAgNjAsCisgICAgICAtMTM3LCAgICAgNTUsICAgLTEwMSwgICAgIDY1LCAgICAxMDAsICAtODk1MiwgICAgICAzLCAgICAtNDksCisgICAgICAgIC0zLCAgICAgLTksICAgICAyOCwgICAgIDE1LCAgICAtODksICAgLTEzNiwgICAgIDU5LCAgICAxMjUsCisgICAgICAgLTczLCAgICAtMzUsICAgLTExMSwgICAgLTY5LCAgICAtMjgsICAgIDExMSwgICAgLTE2LCAgICAgNDgsCisgICAgICAgIDI3LCAgIDkyNzIsICAgICA1NSwgICAgIDM0LCAgICAtOTIsICAgICA2NiwgICAgICAzLCAgICAgIDMsCisgICAgICAgLTM4LCAgICAgMTIsICAgICA1OSwgICAgIDk1LCAgIC0xMDAsICAgICAgMywgICAgIDUxLCAgICAxMjEsCisgICAgICAgMTQ2LCAgIC0yMDAsICAgIDE0MiwgICAtMjU0LCAgICAgNjUsICAgICAgMywgICAtMTY5LCAgICAgLTgsCisgICAgICAgLTY1LCAgICAgNDQsICAgICAxMCwgICAgIDE1LCAgICAtOTksICAgICA1NiwgICAgIC02LCAgIC0xMDgsCisgICAgICAgLTIwLCAgLTU0NjEsICAgIC04OSwgICAgMzk1LCAgIDIwODUsICAgIDQ4NiwgICAgLTQ4LCAgICAzMjQsCisgICAgICAgNDIyLCAgLTM3MDMsICAgIDQ2OCwgICAgMTk4LCAgICAyMzksICAgICAgMCwgICAtMjc3LCAgIC0xMTUsCisgICAgICAtMjI3LCAgICAyMjcsICAgIC0yOSwgICAgMTU5LCAgIC0xMjgsICAgLTQ0NywgICAtMjkxLCAgLTE5NTMsCisgICAgICAtMTEwLCAgICAgMjUsICAgMjI3NCwgICAgMTQxLCAgICAxNzcsICAgIDIwNCwgICAgIDM4LCAgIC0yNTgsCisgICAgICAgIDkwLCAgICAgLTgsICAgLTEzMSwgIC0yNjM2LCAgICAgNTUsICAgIDU2MSwgICAgLTk5LCAgIC0yMjAsCisgICAgICAgLTMzLCAgICAxNDIsICAgLTMzNCwgICAtMTYwLCAgIC0xMTcsICAgIC0xMiwgICAgLTMzLCAgICAgIDYsCisgICAgICAgIDcyLCAgICAgLTMsICAgIC0xMSwgICAgIDUwLCAgICAgIDEsICAgIC00NSwgICAgICA4LCAgICAgMjMsCisgICAgICAgLTE1LCAgICAtMzMsICAgIC0xNSwgICAgIDMwLCAgICAtMzIsICAgIDEwNywgICAgMTQ1LCAgICAgMTQsCisgICAgICAgIDYwLCAgICAxMTQsICAgICA0NSwgICAgIDI0LCAgIDg4MTEsICAgICAtOSwgICAgIDYxLCAgICAxOTIsCisgICAgICAgIDE2LCAgICAxMjQsICAgICA0NiwgICAgLTU0LCAgICAtMzEsICAgICA4OSwgICAtMTQ3LCAgIC0xMTIsCisgICAgICAzMzQxLCAgIC0zOTUsICAgICA5MSwgICAtMzIzLCAgICAgNDUsICAgLTE1NiwgICAgIDI1LCAgICAtMTgsCisgICAgICAgIDM0LCAgIC01MzQsICAgIDExOCwgICAgIDgzLCAgIC0xODcsICAgIC05MiwgICAgMTgwLCAgICAgMzQsCisgICAgICAgNjU5LCAgICAxMzUsICAgIDEwMywgIC0yMzQyLCAgICAgNTQsICAgICAgNiwgICAgMTc5LCAgICAgNDAsCisgICAgICAgMTQzLCAgICAyMzIsICAtMzg1OCwgICAtMjAxLCAgICAxNzksICAgICAzMiwgICAgLTU2LCAgICA0MDYsCisgICAgICAtMjM2LCAgICA1NDEsICAgIC03MCwgICAgLTg4LCAgIC0xMjEsICAgIDQ0NywgICAzMDI4LCAgIC0yMjMsCisgICAgICAgMTM4LCAgIC01NTcsICAgIDIzMCwgICAzNDU3LCAgICAgOTYsICAgICAtNCwgICAgLTIyLCAgICAtMTMsCisgICAgICAtMTM2LCAgICAtNDUsICAgLTEyMywgICAgIC04LCAgICAxMDcsICAgIDI3MCwgICAgMTMyLCAgICAtNjQsCisgICAgICAgLTMyLCAgICA0NjQsICAgIC0zMywgICAgLTQ0LCAgLTI1NDQsICAgLTI1MSwgICAtMjQ2LCAgICAtNzEsCisgICAgIC00MDYzLCAgICAgNDAsICAgIDEwNywgICAgMzg0LCAgICAtMjIsICAgLTE5NywgICAgIDY0LCAgICAxNjYsCisgICAgICAtMTM3LCAgICAtNDQsICAgICA5OCwgICAgLTM1LCAgICAxOTMsICAgICAgNCwgIC0yMTAzLCAgICAgNTcsCisgICAgICAtMTA5LCAgICAyNDUsICAgMzQ4NywgICAgLTU1LCAgICAtNjAsICAgICAyMSwgICAgMTg3LCAgIC0yNjcsCisgICAgICAgMjc5LCAgICAgIDMsICAgIDE2NiwgICAgLTc4LCAgICAxMDgsICAgLTEzNSwgICAgMTI2LCAgIC0xMjIsCisgICAgICAgMTcxLCAgIC0xMzMsICAgIC0yMSwgICAtMTM0LCAgICAxODMsICAgICAyNSwgICAgLTU2LCAgLTYyMTAsCisgICAgICAgMTA3LCAgICAxMDksICAgICAyMiwgICAgLTkzLCAgICAgMzksICAgICA5NSwgICAgIDQzLCAgICAtMTEsCisgICAgICAgLTQ0LCAgICAgLTUsICAgIC04MiwgICAgICA2LCAgICAtNTQsICAgIC0yNywgICAtMTE2LCAgICAtMTYsCisgICAgICAgIDg0LCAgICAgNDQsICAgICAyMiwgICAgLTY4LCAgICAgLTEsICAgIC01NywgICAgIDc4LCAgICAgMzUsCisgICAgICAgIDgzLCAgIDQ2NjQsICAgICA0NiwgICAgICAxLCAgIC0xNjQsICAgMzMwMSwgICAtMzU4LCAgLTM3NTcsCisgICAgICAgMjM2LCAgICAxMDQsICAgIC04MSwgICAtMTIxLCAgIC0yNzgsICAgLTExMiwgICAgLTIwLCAgICAgODksCisgICAgICAtMTIzLCAgICAgMzUsICAgIDExMywgICAgIDE3LCAgIC0zMzEsICAgIDI3MywgICAtMTcyLCAgICAxMjUsCisgICAgICAgLTczLCAgICAgNzcsICAgMjUxNSwgIC0zOTQ0LCAgIC0xNzAsICAgIC04NywgICAgMTc0LCAgICAgODQsCisgICAgICAgMTQyLCAgICAxMzgsICAgICAxMywgICAgMjI3LCAgICAxMjcsICAgIDE0NiwgICAgMTQxLCAgICAxOTYsCisgICAgICAgIDM4LCAgICAtNDAsICAgLTExMiwgICAgMTM2LCAgIDIzMTEsICAgIDMyOCwgICAgIDg3LCAgICAtMjIsCisgICAgICAgLTc3LCAgICAtMzQsICAgLTE5NSwgICAgIDU4LCAgIC0zMzMsICAgIDMzNywgICAtMTU5LCAgICA2MjYsCisgICAgIC0zMDA4LCAgICA0MDgsICAgIDUyMywgICAtMzE2LCAgICA1MzksICAgLTU4NywgICAgLTgxLCAgLTI4MjQsCisgICAgICAgIDk4LCAgICAyMDAsICAgIDYxMywgICAtMTA3LCAgIC0xNzAsICAtMTE5MCwgICAxMTIxLCAgICA1MjEsCisgICAgICAgMjI5LCAgIC0yMTcsICAgIDE0MywgICAgMTQ0LCAgLTEyNDgsICAgLTM4NCwgICAxNTM1LCAgICA0NzAsCisgICAgICAtNjU1LCAgICA0OTIsICAgLTQyOSwgICAgLTI2LCAgIC0xMzIsICAgLTE4MCwgICAgIDUyLCAgICAgOTcsCisgICAgICAgIDEwLCAgICAtMzUsICAgIC02MCwgICAgICA3LCAgLTU0MjIsICAgIC0yNiwgICAgMTU0LCAgIC0xMzIsCisgICAgICAtMjIxLCAgICAxMjQsICAgIDEzNiwgICAgLTE3LCAgICAtNjgsICAgICAyNSwgICAgIDI5LCAgICAgIDQsCisgICAgICAgICA1LCAgICAtMTUsICAgICAgOSwgICAgIDY5LCAgICAtMTYsICAgIC00NywgICAgLTc2LCAgICAgIDUsCisgICAgICAgIDQxLCAgICAgIDYsICAgIC0yMiwgICAgIDYzLCAgICAgLTgsICAgOTcwOSwgICAgLTMzLCAgICA2NTAsCisgICAgICAtNTQ1LCAgIC0xNTksICAgICA4MSwgICAgLTc1LCAgICAgNTQsICAgIC05MiwgICAgLTQ5LCAgICAtODAsCisgICAgICAgIDE0LCAgICAtNzgsICAgLTE0NSwgICAtMzk5LCAgLTM5MzUsICAgIDE4NiwgIC0xMTQ0LCAgICAyMDcsCisgICAgICAgIDYwLCAgICAyODYsICAgMjY0MiwgICAgIDQ0LCAgICAxMTcsICAgMzc1OCwgICAtMTU0LCAgICA0MjYsCisgICAgICAgMzMxLCAgIC02MTUsICAgLTIxNiwgICAgMjcxLCAgIC0xMjEsICAgLTEwOSwgICAgNDk1LCAgICAgNDIsCisgICAgICAgODEzLCAgICAtMTksICAgIDU0NSwgICAtMTQ5LCAgICA2MzMsICAtMjQyNCwgIC0yMDg5LCAgICAyNjUsCisgICAgICAtMTM2LCAgICAtNTgsICAgICAgNCwgICAgLTI4LCAgICAxNDcsICAgICAgMiwgICAtMTIzLCAgICAtOTMsCisgICAgICAgIDE0LCAgICAtNTAsICAgIDMxNywgICAgMTMxLCAgIC0xMzAsICAgLTE1MiwgICAgMzIyLCAgIDEwMjMsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjExMTBzMFtdID0geworICAgICAtNjQzMywgICAgNDk1LCAgIC0yNzcsICAgLTYzMCwgICAgNDExLCAgIDEyNDEsICAgLTMyNiwgICAtNDI1LAorICAgICAgIDUyMywgICAgMTE0LCAgIC0yMjUsICAgIC01MywgICAtNTM4LCAgIC03MDIsICAgLTI2MCwgICAtNDE3LAorICAgICAgLTQwMSwgICAtMjIyLCAgIC0yNjMsICAgLTQxNiwgICAgMTYzLCAgLTEyNTYsICAgIDU5MCwgIC0xMTc2LAorICAgICAgMTg2NSwgICAxNDgzLCAgIC05MjcsICAgIC02NSwgICAtNjc0LCAgIDEzMDMsICAgLTE0NywgICAtNzUwLAorICAgICAgLTEzMiwgICAgNDA3LCAgIC0yODMsICAgIDg1MiwgICAxNzg4LCAgLTIyNTcsICAgIDIxMCwgICAtNDUwLAorICAgICAgIDMwMywgICAtMjcyLCAgLTI1MzYsICAgICA5NCwgICAyMDEwLCAgICA0MjgsICAgLTkyMSwgICAgIC0zLAorICAgICAgIC03MSwgICAtODc1LCAgICAxNTYsICAgLTY4MSwgICAgNTIxLCAgICAgNDksICAgICA1MSwgICAtNTIzLAorICAgICAgMTUzMiwgICAxNjE5LCAgIC02OTAsICAgIDQwMiwgICAtOTIzLCAgICAzMTgsICAgIDg2NSwgICAgMTkzLAorICAgICAtMjE4NywgICAtNjYyLCAgICA1NTMsICAtMTEwNCwgICAgLTcwLCAgLTEzMTMsICAgIDQ2MiwgIC0xMDQ1LAorICAgICAgIDMyMCwgICAgOTM3LCAgLTE0NTMsICAgLTUxNCwgICAgNDA0LCAgIC0yMzEsICAtMTc0OCwgIC0xNTkyLAorICAgICAtMjAzOSwgICAtMjE3LCAgIC0zNjQsICAtMTMxMywgICAtNDI4LCAgIDI0MTksICAgMTI1NywgIC0xMjkyLAorICAgICAgICAxOSwgICAyODY3LCAgIC0yNzgsICAtMTgzMiwgICAtMjM5LCAgIC02OTEsICAgLTM4MywgICAgIDYyLAorICAgICAgIDE4NSwgICAtNDU1LCAgLTE1ODksICAgIDExNiwgICAgNDE5LCAgIC0zMTksICAgLTQxOCwgICAgNTM3LAorICAgICAgLTI4MCwgIC0xODM0LCAgIDI2ODEsICAgLTg1NywgICAtMjEwLCAgIC0xNTYsICAtMTE0MywgICAtMTA0LAorICAgICAtMTc3NCwgICAxNzAyLCAgICAxODQsICAgMTAxNywgICAtMTM1LCAgIC02MTAsICAgIDUyNSwgICAgMzM1LAorICAgICAgLTM1NSwgICAtNDk0LCAgIC0yMzEsICAgLTE1NCwgICAgOTg2LCAgICA0MzQsICAgMTEzNCwgICAxMjEzLAorICAgICAgIDkxNCwgICAxNDU3LCAgIC0yNTgsICAtMTA4NiwgICAgNDc3LCAgLTIyNDcsICAgIDQ5OCwgIC0xNzQxLAorICAgICAgLTk3NSwgICAtMjYyLCAgICA4MTIsICAgIDEwOCwgICAgODM0LCAgIC00MTIsICAgIDEyMCwgIC0xMDMyLAorICAgICAgLTUzMywgICAtNDU2LCAgICAxMzksICAgLTMwMSwgICAtMzg3LCAgIC02OTAsICAgIDc5OCwgICAgICAzLAorICAgICAtMTU1NiwgICAxMjYxLCAgICA3NDUsICAtNDQ4NiwgICAgICA4LCAgICAyMTMsICAgIDk3NywgICAtMTUxLAorICAgICAgLTI2OSwgICAtMzQ0LCAgICAgMTMsICAgIDU0NCwgICAtMjcwLCAgIC0xNjYsICAgLTcwNiwgICAgNjcyLAorICAgICAgIDE4NCwgICAtOTQzLCAgLTE3MTQsICAgMTUxMCwgICAtNzM5LCAgIDE4OTEsICAgLTQ3NywgICAgNTI4LAorICAgICAgMTg0NywgIC0xNTcyLCAgICA0MjAsICAgIDEwMywgICAgLTg1LCAgICA1MDgsICAgIDIzMSwgICAyMDI0LAorICAgICAtMTM0MywgICAgIDIwLCAgICAyMzgsICAgLTY1NSwgICAgNjY4LCAgLTE1NjEsICAgLTc0MywgICAtNjUxLAorICAgICAgIDcwOSwgIC0xMTM2LCAgIC0yMDgsICAgIDk3OSwgICAgMjU4LCAgIC02OTMsICAgLTUzNSwgIC0xMTI2LAorICAgICAgLTI4MywgICAtOTQ0LCAgIC0yMDksICAgIDYwMywgIC0xNzk3LCAgLTI5OTgsICAgIDI1MywgICAtMjk2LAorICAgICAgIDg0MiwgICAgIDYzLCAgIC0yMDMsICAgLTQ2OCwgICAgNjc1LCAgICAzMzcsICAgMTQ1OCwgICAgMTE0LAorICAgICAgIDI1OSwgICAzMjAyLCAgICAxNDUsICAgIDQxOSwgICAgNjMxLCAgICAzNTIsICAgMjMwOSwgICAxMzM3LAorICAgICAgIDgxNSwgICAgLTk5LCAgIC04MjQsICAgLTc3OSwgIC0xODM5LCAgLTE0NTUsICAgIDE2NiwgIC0yMDkyLAorICAgICAgMTI5OSwgICAgMTYyLCAgLTEwMjYsICAgLTkxNCwgICAgMTI4LCAgIDEzMjEsICAgIDg5NiwgICAtMjA5LAorICAgICAgIDI1NSwgIC0xMTQ0LCAgICA4MDcsICAtMjg3MCwgICAtNjMyLCAgIC01ODgsICAgIDg2NiwgICAgIDgxLAorICAgICAgIDQ1MywgICAgMTU0LCAgLTEyNTgsICAgLTQ5OSwgICAtNDUyLCAgICAtOTgsICAgMjU5OSwgICAzMDcwLAorICAgICAgIDU0MCwgICAtODM0LCAgIC0yMjgsICAtMTI2OCwgICAtMzEzLCAgIDEyNjksICAgIC02NSwgICAgLTU2LAorICAgICAgMTAzNSwgICAtNDk5LCAgIC01MDcsICAgLTY1NywgICAgNDQ3LCAgICAgMjYsICAgICA5NiwgICAtMTc1LAorICAgICAgIDEzMywgICAtMjkxLCAgIC01MzgsICAgLTI1OSwgICAgICA3LCAgIC0yMDYsICAgIDQxMSwgICAgMTQ1LAorICAgICAgICAyNSwgICAgMjE1LCAgICAyNjcsICAtNDM1NCwgICAtNDQyLCAgICAyNTAsICAgLTgxNCwgICAtMTQzLAorICAgICAgLTQ1OSwgICAtMTgyLCAgIC02NDAsICAtMTI1OCwgICAgMTY5LCAgICAzNzksICAtMTE5NiwgICAgNDI5LAorICAgICAgLTEyOCwgIC0xOTcxLCAgIDI2ODEsICAgIC00NSwgICAxNjQxLCAgICAxNTIsICAgLTU1NiwgICAgOTA5LAorICAgICAgIDM2NSwgICAtNjE4LCAgIC00MTcsICAgLTM2MywgICAtNDM0LCAgICAyNzAsICAtMTM4OCwgICAtNDczLAorICAgICAgICA2MiwgICAgIDU4LCAgICA1MDksICAtMzkwOSwgICAxMzI3LCAgIDE1NzEsICAgIDQ4MiwgICAxMDgxLAorICAgICAgLTg5NiwgICAgNDU5LCAgICA0ODAsICAgLTU1NywgICAtMjY3LCAgICAzOTAsICAgIC0xNSwgICAgNDg0LAorICAgICAgIDI0OCwgICAgIDUyLCAgICAgNDksICAgIDcwMiwgICAgLTEwLCAgICAxNjIsICAgIDI0NSwgICAtNDE2LAorICAgICAgMTM5NywgICAgIDIzLCAgICAxODMsICAgIDMyNSwgICAgNTkxLCAgIC04MTYsICAgNDQyOSwgICAgNjc0LAorICAgICAgLTMzMiwgIC0xMjQzLCAgICAgNjgsICAgIDI4NSwgICAgMjM1LCAgICA3NTksICAgLTMxNSwgICAgNzk5LAorICAgICAgIDMxMywgICAtMzMxLCAgIC0xODIsICAgLTYyOSwgICAgMzk0LCAgLTEwNzksICAgMzg3OSwgICAgLTgxLAorICAgICAgIDY1MSwgICAtNzc0LCAgICAtMjEsICAgLTI5NywgICAgMjMxLCAgLTE4MjYsICAgICA0NywgICAgMTA0LAorICAgICAgIDI4NCwgICAtMTcxLCAgIC0xOTgsICAgLTExMCwgICAtMTkzLCAgICA4ODEsICAgLTcxNSwgICAgMjk0LAorICAgICAgLTQ5MCwgICAgMzk1LCAgLTEyNjEsICAgMjg1OSwgIC0zMTc1LCAgLTE0NzcsICAgIDY2OCwgICAtMjE1LAorICAgICAgIDMxMCwgICAgIDEwLCAgICA3NjIsICAgLTgzNywgICAgMTAxLCAgICAxNDIsICAgIDIwMSwgICAtOTQwLAorICAgICAgIDQ1MywgICAgLTgyLCAgICA0OTMsICAgLTk4MywgICAgIDIzLCAgIC0yMTEsICAgIDk5MCwgICAxMzI3LAorICAgICAgNDY2NCwgICAgLTI3LCAgICA4MjEsICAgIDgwOSwgICAgNTAwLCAgICAyNDMsICAgICA0MSwgICAgNTY4LAorICAgICAgICA0NCwgICAtMzIwLCAgICAxMDUsICAgIDQ2MSwgICAgMzA2LCAgIC00MDgsICAgLTc5MywgICAgLTM1LAorICAgICAgIC0xOCwgICAgMjI5LCAgICAtMTIsICAgLTQxNiwgICAgNTc3LCAgIC0zMDEsICAgNDg3MCwgICAtNTIwLAorICAgICAgIDQ5OSwgICAgIDU3LCAgIC01NDQsICAgIC0yMSwgICAgNjExLCAgICAyMjYsICAgIC0yMCwgICAtNDEyLAorICAgICAgIDQ0MCwgICAtNjgwLCAgICA0NDgsICAgIDQzMCwgICAgMjI2LCAgIC02MTAsICAgLTMxMCwgICAtMjE4LAorICAgICAgMTE2MSwgICAgNTIzLCAgIC00MDAsICAgLTE0OCwgICAgNzgzLCAgICAzOTUsICAgLTEyNiwgICAgMzcwLAorICAgICAgIDY4NiwgICAtNDk3LCAgIC0zMDEsICAgIDE2MSwgICAgIC01LCAgICAyMzgsICAgIDM3NSwgICAgMzU3LAorICAgICAgLTEyNiwgICAgOTU0LCAgIDU5NTIsICAgIC01MywgICAgMTIxLCAgIC00MDUsICAgMTU3MSwgICAgNDM1LAorICAgICAgIDQ2MSwgIC0xMTY2LCAgLTExNjMsICAgMTM0NywgICAxMzk0LCAgICAxNzAsICAgMjAzNSwgIC0xNTgwLAorICAgICAgLTk1OCwgICAgMjc2LCAgIC02ODAsICAgLTk2OCwgICAgMjc1LCAgIC0zMjMsICAgIDUyNCwgICAgIDQ4LAorICAgICAtMTg5NiwgICAgIDQ2LCAgIC00OTUsICAgIDU0OCwgICAtOTI5LCAgIC04NTksICAgIDIyNCwgICAxMDc5LAorICAgICAgIDg2MywgICAzMDgwLCAgLTE1OTQsICAgLTM3OSwgICAgMzAyLCAgIC00MDMsICAgIDcxMCwgICAgNjU1LAorICAgICAgLTI5MywgICAtNzE5LCAgIC02ODMsICAgLTk0NCwgICAgMjI4LCAgIC0zNDEsICAgIDU2MywgICAtNDk1LAorICAgICAgIDkyMCwgICAgNzM4LCAgIC02MTQsICAgIDU1MiwgICAtMjQ5LCAgIC00MDIsICAgLTE2NCwgICAtMjYyLAorICAgICAgLTQyNSwgIC00MDI1LCAgICAxNjQsICAgLTk4NCwgICAtNTE4LCAgICAxNTcsICAtMTE1NiwgICAtNzI5LAorICAgICAgMTAyNCwgICAtNzY4LCAgIDEwMDMsICAgIDQ4MSwgICAtMTE2LCAgICAzMTksICAgLTkxOCwgICAxNTYzLAorICAgICAgLTY2MiwgICA0ODUyLCAgICA2MTcsICAgLTI1MCwgICAgNTQ5LCAgIC0yNjUsICAgIC05MywgICAgNjgwLAorICAgICAgIDQ3MCwgICAgOTI1LCAgIC0yOTMsICAgIDYyOSwgICAgMTQyLCAgICAyMzEsICAgICA0NCwgICAgMTMzLAorICAgICAgICAxMiwgICAgIDQwLCAgIC04NjcsICAgIDI2OSwgICAgLTc3LCAgICA0NDUsICAtMTEzMiwgICAtOTg1LAorICAgICAtMTMwNCwgICAgNzI4LCAgICA0MjQsICAgIDUzMCwgICAtMjU4LCAgIC02MjUsICAgIDM3NywgIC0xNDAwLAorICAgICAtMjUzOCwgICAtNDcwLCAgLTE3MTEsICAgIDQxMywgIC0xNjAzLCAgICAtODEsICAgLTM5MywgIC0xMDEzLAorICAgICAgMTEzMCwgICAgOTA2LCAgICAyODcsICAgIDY0MCwgICAzNzg1LCAgIC00NjMsICAgLTE1OSwgICAgIDQzLAorICAgICAgLTE2NSwgICAtNDQxLCAgIC01MTMsICAgLTI4NywgICAtNTU0LCAgIDE1NDcsICAgIDg0OCwgICAtMjc1LAorICAgICAgIDkzNiwgICAgNjUzLCAgICA3NjksICAgIC01OCwgIC0xMDA3LCAgIC02OTgsICAgLTc5MiwgICAyMTc1LAorICAgICAgIDM5OCwgICAxMzgyLCAgIC0xMjIsICAgIDQ1OSwgICAgIC03LCAgICAyODEsICAgMjc4NSwgICAtNjM3LAorICAgICAgIDYzMiwgICAtMjc5LCAgICAyOTMsICAtMTA3OCwgICAtOTk2LCAgICAgOTYsICAgLTI5MywgIC0xMzM1LAorICAgICAgIC03NCwgICAtNTg3LCAgIC0yODYsICAgLTU2NSwgICAtOTc3LCAgIC0yMjgsICAgNTA4MCwgICAgICAzLAorICAgICAgIDE3MSwgICAgMTExLCAgICAtMzQsICAgLTE3NywgICAtNjE5LCAgICA1NzcsICAgIDQ0OCwgICAtMjgwLAorICAgICAgIDE4OSwgICAxMDMzLCAgIC01NzksICAgIDEzNCwgICAtNzEzLCAgIC05NDcsICAgLTI0OSwgIC0xODk3LAorICAgICAgIDM2NCwgICAxNzQ4LCAgLTIwOTgsICAgICAyMSwgICAgODU5LCAgICAtNzMsICAtMTg4MSwgICAgMTE2LAorICAgICAgICAzNiwgICAxNTkxLCAgIDEzODYsICAtMTEyOCwgICAtMzQ2LCAgLTEwMTUsICAgIC0yNSwgICAgLTkwLAorICAgICAgLTY5MSwgICAtOTg0LCAgIC0xMjAsICAgICAyOSwgICAtNjM1LCAgIC0yMzYsICAgICAyNiwgICAtNjkxLAorICAgICAgLTc0MiwgICAtMjAzLCAgICAyOTQsICAgLTQ3MiwgICAtOTAxLCAgIDI1ODIsICAgLTE3MSwgICAtMzU3LAorICAgICAgIDQwNiwgICAgMTYyLCAgIDE1NjEsICAgLTkxMywgICAgMzA4LCAgLTMzMTksICAgIDQ2MSwgICAgNzc5LAorICAgICAgLTMwNSwgICAtOTI3LCAgICAyOTAsICAgLTk0MSwgICAgNjE1LCAgIC02ODgsICAgLTUwOCwgICAgMjIyLAorICAgICAgLTQzMiwgICAgMzg3LCAgICAxNzAsICAgLTExNSwgIC01MzM4LCAgICA1MDgsICAgLTIxMiwgICAgMTUwLAorICAgICAgICAyNiwgICAgLTM4LCAgICAzMDYsICAgIC0xNSwgICAgIDUwLCAgIDIwMDgsICAtMTExMiwgICAtMTg3LAorICAgICAgICA0NCwgICAgNTkxLCAgIC0yODAsICAgMTE4NywgICAgOTM0LCAgIC0yMjgsICAgIDU1NCwgICAgIDY1LAorICAgICAtMTM4NywgIC0xOTk5LCAgIC04MDUsICAgMjU1NSwgIC0xMjI1LCAgIC0yODMsICAgLTQzNSwgICAtNDMwLAorICAgICAgIC01MCwgICAtNjU1LCAgIC0xMDMsICAgIDI0OCwgICAtMjM0LCAgICAgMzIsICAgLTgyNiwgICAtNzA4LAorICAgICAgLTcwNCwgIC0xMDA2LCAgICAxNzYsICAgIDc4NCwgICAgMjc0LCAgICA2MjYsICAtMjM1MywgICAgNzA3LAorICAgICAgMTg1MiwgICAtMTMyLCAgIC0xOTYsICAgLTE2OSwgICAtNDYzLCAgLTIxMTcsICAgICA1NiwgICAgNDEzLAorICAgICAgLTE0MSwgICAtODE4LCAgIC0zNjUsICAgIDkyMSwgICAtODE2LCAgIC0xMjYsICAgLTEzNSwgICAgNDM4LAorICAgICAgLTk0OCwgICAtMTQ1LCAgIC0zNDksICAgIDcwMCwgICAgMjA1LCAgIDEwMDEsICAtMzYyNiwgICAgMzE0LAorICAgICAgLTQ5MywgIC0xMTgyLCAgICAxMzEsICAgIDczMywgICAyNDA0LCAgLTEyNDQsICAgIDU2NCwgICAtOTYwLAorICAgICAgIDMyOCwgIC0xMTM3LCAgIC0xMDgsICAgLTc1NSwgICAtMTY4LCAgIC05OTUsICAgIDk2NiwgIC0xNzA2LAorICAgICAgLTU2NSwgICAgODA2LCAgIC02OTMsICAgMTM2OSwgICAtMjY5LCAgIC00MjgsICAgIDY3NSwgICAgNzY4LAorICAgICAgIDM0MSwgICAtNzk0LCAgIDIyNjUsICAgLTIwOCwgIC0xODgzLCAgIC04MDEsICAtMTg4OSwgICAgOTYxLAorICAgICAgIDE4MiwgICAtNTA0LCAgIC01OTUsICAgIDg3MSwgIC0xMjgwLCAgICA5NTIsICAgMTM1MSwgICAgNjY1LAorICAgICAgIDQ3NCwgICAxMDMyLCAgICAgNTgsICAgIDQ1MSwgICAtMTk4LCAgICAzNDUsICAgIDE3NiwgICAtODUzLAorICAgICAtMjg5MSwgICAyMjUwLCAgICA2MjQsICAgLTYxNiwgICAgMTgzLCAgICAxNDQsICAgIDczNiwgICAgICAwLAorICAgICAgLTE5OCwgICAtMTM4LCAgLTEyMTgsICAgLTUwMSwgICAtNjU4LCAgICAtMjQsICAgMTIzMiwgICAtMjg2LAorICAgICAgLTIzMywgICAtOTM3LCAgIDIxNTAsICAtMTAzNSwgICAgNDQ5LCAgIC02MjMsICAtMjc0OCwgIC0yMTc2LAorICAgICAgIDkxOCwgICAtMTcwLCAgICA0MjEsICAgMTM3NiwgICAgIDkzLCAgICAxNTMsICAgIDYyNywgICAgNDkzLAorICAgICAgICAyOCwgICAgNTQ5LCAgIC0yOTIsICAgLTE3NSwgICAxMDY2LCAgIDEwMzcsICAgLTQ3NSwgICAgNDEzLAorICAgICAtMjAwNiwgIC0yMDIyLCAgIC0zMzQsICAgIDM2NSwgICAgOTAxLCAgICA5NDUsICAgLTY2MywgICAgNTE1LAorICAgICAgLTM1MSwgICAtNTk3LCAgICAxNTUsICAgMTMxOCwgICAtMTUzLCAgICA0MTcsICAgLTQyNSwgICAgIDQ0LAorICAgICAgIDMzOCwgIC0xOTU4LCAgIC0zNTUsICAgLTU5NiwgIC0yMTM0LCAgICAzNjAsICAgIDM0MSwgICAyNTAxLAorICAgICAgIDgyNCwgIC0yMTA2LCAgIC0yODIsICAtMTcyMywgICAtNzM1LCAgIC01NTAsICAgLTc0MywgICAgMTEzLAorICAgICAgMTAyNywgICAtNDc5LCAgLTIxMTQsICAgIC0xNiwgICAtNjMxLCAgIC0yODIsICAtMTA1NCwgICAxMzIwLAorICAgICAgLTE1OCwgICAtMjM0LCAgIDM0NzksICAgICAyOCwgICAxODE4LCAgICA2MjcsICAgMTQ2NCwgICAtNzk1LAorICAgICAgIC0yMiwgICAgODk3LCAgICAgLTYsICAgIDM5MiwgICAtMjM0LCAgIC0xNzAsICAgIDcxNCwgICAtMzgyLAorICAgICAgMTI2MiwgICAgIDY3LCAgIC02MTgsICAgIDE0NSwgICAgIDI1LCAgIC03MTAsICAgLTI0NywgICAtNTQ1LAorICAgICAtMTM4NiwgIC0xNzk3LCAgIC05OTUsICAgIDg2NSwgICAgNDY1LCAgIC0zNjQsICAgIDgzMCwgICAgLTUzLAorICAgICAtMTEwOCwgICAtMzgzLCAgIC01MzgsICAgICA4NSwgICAgNzMxLCAgIC0xODgsICAgLTgxMywgICAgICAyLAorICAgICAtMTY2NywgICAzMzc5LCAgICAyODksICAgIDQyNSwgICAxMzE5LCAgIC0yNTksICAgLTU5MiwgICAtMjEyLAorICAgICAgIDI3MSwgICAtMjY4LCAgIC0xMjYsICAgMTI4MiwgICAgMzA2LCAgIDM4NTksICAtMTQyMywgICAgNjA3LAorICAgICAgICAyMCwgICAgNzU1LCAgICAxNzQsICAgLTc4MiwgICAgIDcyLCAgIC0yMzQsICAgIDY3NSwgIC0xMTc3LAorICAgICAgMTEwMSwgICAtNjM1LCAgLTE2NDEsICAgMjU3NCwgICAtOTc4LCAgLTEzOTAsICAtMTc0MywgICAyMTgzLAorICAgICAgICA1MywgICAgIDc1LCAgICA2NTAsICAgIC05NywgICAtNDU2LCAgIC0xMjYsICAgLTcxOSwgICAtNjc1LAorICAgICAgIDU1NywgICAtMzc1LCAgICA2NDMsICAgIDg1MywgICAgLTgxLCAgIC0xOTIsICAtMTE3NCwgIC0xMjg4LAorICAgICAgLTk1NCwgICAtODgzLCAgIC04MDYsICAtMjE4MiwgIC0yMTExLCAgLTE0MjYsICAgIDE4MCwgICAtMjY2LAorICAgICAgLTMwMSwgICAgNjI2LCAgIC00NDMsICAgICA2MSwgICAtMTQ5LCAgIC00NDMsICAgLTkzNSwgICAgLTQ4LAorICAgICAgIDY0MiwgICAgMjUwLCAgICAgMTcsICAgIDU5NiwgICAxMzQyLCAgLTIxMjcsICAgIDMyMywgIC0xNDU2LAorICAgICAgMTk5NSwgICAgODM3LCAgLTE0NTYsICAtMTY4MywgICAgOTQ1LCAgIC03MjIsICAtMTQ0NSwgICAgNDUyLAorICAgICAgIDE3OCwgICAtNDQxLCAgIC0yNTAsICAgLTEzNywgICAtMTI4LCAgICAtNTAsICAgLTMxMSwgICAtNjAwLAorICAgICAgMjIzNywgICAgOTIyLCAgICAxMzksICAgLTEwNywgICAtNjM3LCAgIDE3NzAsICAtMjUwMywgICAgNDEzLAorICAgICAgLTgwMywgICAgNDk2LCAgICAyMDksICAgLTM5MSwgICAgNDAxLCAgICA0MTIsICAgLTU1MiwgICAgNjA1LAorICAgICAgIC0zNywgICAtNjY3LCAgLTE2MDksICAgIC0xOSwgIC0xMDczLCAgIDE1MjIsICAgLTcwNSwgICAgNjcwLAorICAgICAgLTk5MiwgICAgODgyLCAgLTEyMTMsICAgLTg1NCwgICAyMTUwLCAgIC0zNzEsICAgICA3MywgIC0xMTY3LAorICAgICAgLTU5MiwgICAtMTUzLCAgIC01MDksICAgLTU4NCwgICAtNDk1LCAgICAtODMsICAgMjA3NSwgIC0xNDg5LAorICAgICAgIDcxOSwgICAxMjQ1LCAgLTExMzgsICAgICA3MiwgICAgOTUwLCAgIC05NTAsICAgIDU0MiwgICAtNTkwLAorICAgICAgIDk4OCwgICAxNjQ2LCAgICAtNjQsICAgIDU2MiwgICAtMjIzLCAgICAgNzMsICAgIDU4MywgICAtMTUxLAorICAgICAgIDIxNSwgICAgOTE0LCAgIDEzOTEsICAtMjk5NywgICAgMTYxLCAgICA0MzYsICAgICA0OSwgICAyMjI1LAorICAgICAgIDI3MSwgICAtMjgzLCAgIDM4NDQsICAgLTU3OCwgICAgMzM1LCAgICAtOTAsICAgLTY5OCwgICAtMTYyLAorICAgICAgMTIzNiwgICAtMTE3LCAgICA0NzAsICAgIDM4MywgICAtNzE4LCAgICA1MjAsICAgIDI5NSwgICAgIDI5LAorICAgICAgIDI5MiwgICAtMTc5LCAgICA3NzQsICAgIDIwNCwgICAgMzcyLCAgIC0yNTEsICAgLTgyNCwgICAtNDg3LAorICAgICAtMTgyMiwgICAtMzEyLCAgIC03MzEsICAgIDU2OCwgIC0xMDA4LCAgIC0yNTUsICAgIDE4OSwgIC0xMTk1LAorICAgICAgIDY1NywgICAtMjI3LCAgIDM0MjIsICAgIDY1MSwgICAtMjIwLCAgLTEyMDQsICAgLTU5MCwgICAgNzEzLAorICAgICAgIDM2NSwgICAtOTc3LCAgICAyMDQsICAgMzExOCwgICAgMzIxLCAgICA5MjIsICAgLTM0NywgICAxNTA1LAorICAgICAgIDM3NSwgICAgLTc3LCAgLTE1MjAsICAtMTQxMSwgICAtNjgwLCAgIC01MDcsICAgIDU0MywgICAtNDkyLAorICAgICAtMTg0NCwgICAgMTM1LCAgICA2ODksICAgIDM4NCwgICAtNDA4LCAgICAxNDAsICAgIDYzMywgIC0xMTkyLAorICAgICAgIDQ3NSwgICAgMjIwLCAgLTE3MTEsICAtMTMxOCwgICAgNjA2LCAgIC0xMDMsICAgLTcxMiwgIC0xNzM0LAorICAgICAgLTIxOCwgICAtODU1LCAgIC04MzUsICAtMzA3MSwgICAtMTA5LCAgIDEzOTEsICAgICA2MiwgICAgIDIxLAorICAgICAgIC03NSwgICAgLTc3LCAgICAzNjksICAgIDIxNiwgIC0xNDg0LCAgIDIwNTcsICAgIDY2MSwgICAgMzE0LAorICAgICAgIDI3NSwgICAxMDQ4LCAgICAxNzUsICAgMTg0MiwgICAgNzQzLCAgICA4MDgsICAgLTU5NCwgICAgMzM4LAorICAgICAtMTIxNywgICAxNjA2LCAgIC01MzEsICAtMTM2MCwgIC0xMDczLCAgICA0NTIsICAgLTUzMSwgICAtNzk4LAorICAgICAgLTc3MSwgIC0xMjkyLCAgIC05MTgsICAgIDYwNiwgIC0xNzc2LCAgIC01MDksICAgIDE3OCwgICAxNDIyLAorICAgICAgMzQyNCwgICAgNjM0LCAgICA3MjIsICAgLTI1NywgICAgNTI1LCAgICA0MzcsICAgLTE5NywgICAtMTMwLAorICAgICAgIDI5MSwgICAtNDExLCAgIC0yNTksICAgLTg5MCwgICAgLTg0LCAgICAzNjgsICAgMTExNywgIC0xMzIxLAorICAgICAgLTMyNCwgIC0yMTIyLCAgICA1MTUsICAgMTE1OCwgICAxNzQ5LCAgIC05NjMsICAgIDY4MSwgICAgIDM5LAorICAgICAgIDI2OCwgICAgNTQ5LCAgICAzMjQsICAgLTYwMSwgICAgMTUxLCAgIC0yMDAsICAgIDgyOSwgICAzODgxLAorICAgICAgIDc5NywgICAgNjYwLCAgIC01NzIsICAgLTY5MywgICAgNjMzLCAgIDEwMjMsICAgLTE0NywgICAtNTgxLAorICAgICAgIDEwMiwgICAtMjA3LCAgIC0xNjMsICAgLTUxMSwgICAgLTMwLCAgIC0xMDIsICAgIDM3OSwgICAgNzc2LAorICAgICAgIDQ5NCwgICAtNTEwLCAgICAgNTUsICAtMTgxMSwgICAxMDczLCAgIDQzODQsICAgLTMxOCwgICAzMjc3LAorICAgICAgMTk1OCwgICAtMjA5LCAgIC01MzksICAgMTgyMywgICAxMjAwLCAgIC0xODIsICAgLTE4NiwgICAgMjEzLAorICAgICAgIDEyMywgICAgNTA2LCAgIC00NzEsICAgLTQzMSwgICAtNjk4LCAgIC0zMzEsICAtMTE2OCwgICAgIDg4LAorICAgICAgIDI3NiwgICAtMTg0LCAgICA3MzMsICAgLTI5NSwgIC0xMDUzLCAgIC03MTcsICAgIDg2MiwgIC0xNDUzLAorICAgICAtNDIzNSwgICAxMDYzLCAgIDEwNDksICAgLTYyMSwgICAtNDI5LCAgICAzNzIsICAgMTA0MywgICAgNTk5LAorICAgICAgIDI3MSwgICAtNjkzLCAgIC02ODksICAgIDEyMiwgICAgNDY2LCAgIC0zMjMsICAgIDMzMiwgICAtNTMzLAorICAgICAgIDY0NSwgICAgNTE2LCAgIC0zNzEsICAgLTIwNywgIC0yMDQ2LCAgICAgNzIsICAtMTEyNSwgICAtMjI5LAorICAgICAtMjc2OSwgICAtMzMwLCAgIDEzODcsICAgIC04OSwgICAgMzQyLCAgIDI3ODYsICAgLTczMCwgICAgMTUyLAorICAgICAgIDYyOSwgICAgODA5LCAgIC00NTksICAgLTI0OCwgICAtMjY2LCAgICAxMTEsICAgIDM4MCwgICAgNzI0LAorICAgICAgLTQxMSwgICAgNjQwLCAgICAtNzIsICAgIDMyMywgICAgIDM0LCAgIC0yNzcsICAgIDQ0MywgICAgMjg5LAorICAgICAgIDE1MSwgIC00ODE2LCAgICA0MDIsICAgLTE3MSwgICAtNzMxLCAgICA2MzUsICAgIC04NCwgICAtMTMzLAorICAgICAgLTMxMCwgICAgMzk3LCAgICA5MDQsICAgMTE5MywgIC0xNTEyLCAgICAtMjUsICAtMTMwNiwgICAgNTg3LAorICAgICAgIDMyMiwgIC0zNzYyLCAgICA1MzcsICAgLTMwNiwgICAtOTgxLCAgICA5MTcsICAgIDE5MCwgICAgNzg3LAorICAgICAgLTYxMywgICAgMTQ5LCAgICAzMDEsICAgLTM3NiwgICAgMzY2LCAgICAzNTAsICAgICAxOCwgICAgODkzLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IxMTEwczFbXSA9IHsKKyAgICAgIC0zMzIsICAgMTMwNiwgICAxNjI2LCAgIDE1NTUsICAtMzUxMCwgICAtMjI1LCAgICA0MTgsICAgMTUyMCwKKyAgICAgIC05NjksICAgIC03NCwgICAtMjg2LCAgICAyMzMsICAgLTMxMywgICAgLTk3LCAgICAzNzUsICAgIDE4MSwKKyAgICAgIC0zMDksICAgMTM0OCwgICAgOTY5LCAgIC01MDQsICAgLTE0MSwgICAgNzg5LCAgLTEyMjQsICAgLTEzNywKKyAgICAgIC03MDQsICAgICA5OCwgICAxMDAzLCAgICA0NjYsICAgMjI1OSwgICAxNDg1LCAgIC0yMjUsICAgICA2MSwKKyAgICAgICAyNzIsICAgLTIyMywgICAtMzQ3LCAgICAtMjMsICAgLTM2OCwgICAgIDk2LCAgIDIzNDUsICAgIDExMiwKKyAgICAgICAzNjMsICAgLTU1MiwgICAgIC02LCAgIC04MDYsICAtMTYzNywgIC0xNzAzLCAgIDE1OTcsICAtMjExNCwKKyAgICAgIC0xOTYsICAgIDI5MywgIC0xMTczLCAgIC02MzAsICAgLTg2MywgIC0xMjI0LCAgICA3ODQsICAgLTcyMiwKKyAgICAgICA3NDQsICAgIDg4NSwgICAgNzk4LCAgIC0zODQsICAgICA5MiwgICAgMjk4LCAgIC04NzMsICAgMTgwOCwKKyAgICAgIDEzODksICAgIDQ4OCwgIC0xNTY5LCAgLTE1NDEsICAtMzA2NCwgICAtNzM0LCAgICAgIDMsICAgIDQ2NywKKyAgICAgIC05ODcsICAgIDM0NiwgICAxOTE1LCAgIC02ODMsICAgIDIwNSwgICAtNDg3LCAgICAzNDEsICAgLTMzMCwKKyAgICAgICAyNzQsICAgIC0yNSwgICAgIDQ5LCAgICAtODMsICAgMTI0NiwgICAtNDA1LCAgIC03NzcsICAgIDI2NiwKKyAgICAgICAxMjEsICAgLTI1MCwgICAgNDY2LCAgLTEyMzIsICAtMzE5NywgICAtODcxLCAgIC02MzgsICAgLTMzMiwKKyAgICAgIDE1NjMsICAgMTkwMCwgICAtNDcwLCAgICA1NTYsICAgLTQ2NSwgICAtNDEyLCAgICA5MDEsICAgIC04NiwKKyAgICAgIC02ODMsICAgLTU3NywgIC0xMDMzLCAgICA4MDgsICAgLTg2MywgICAxMjEyLCAgIC03MjQsICAgMjIyMiwKKyAgICAgICA0MjksICAgMjczMywgICAgNDEzLCAgICA4OTEsICAgMTY2OSwgICAgNTE1LCAgIC00MzksICAgIDE4NywKKyAgICAgIC0zNTksICAgIDQxNCwgICAgMTc2LCAgIC03MDYsICAgIDY3OSwgICAgLTYzLCAgIDEyNDcsICAtMTcyMSwKKyAgICAgICA3NzksICAtMjc3MCwgICAtNDg0LCAgIC02MzMsICAgLTk5MywgICAtMjQzLCAgIDE0NDIsICAgLTMxMiwKKyAgICAgIC0zMjQsICAgLTM3MCwgICAgMzkyLCAgIC00MDcsICAgIDIyOSwgICAgIDk3LCAgIDEyNjcsICAgIC0xOCwKKyAgICAgICAgNDYsICAgLTMwMywgICAtNjg0LCAgICA1MTUsICAgLTE2NiwgICA0MjEyLCAgIC03NzUsICAgIC0yMywKKyAgICAgICAtNTMsICAgICAyMywgICAxOTY2LCAgIC00NjUsICAgIDIzMSwgICAxMTk1LCAgICAyNTIsICAtMTAzNiwKKyAgICAgICAgMTYsICAgLTgyNCwgICAtMTE2LCAgIC01ODIsICAgLTI4NiwgICAgNDcwLCAgIC0xNTksICAgIDIxNywKKyAgICAgIC00NTYsICAgIDU0OSwgICAgNjQ4LCAgICAgNjAsICAtMTExOSwgICAgMjIxLCAgIC03NDcsICAgIDM1NCwKKyAgICAgIC02MjgsICAgLTQ4NiwgICAgODk0LCAgIDEyODAsICAtMjYzMSwgICAgMjQ3LCAgICA0MzAsICAtMTcwMywKKyAgICAgICAgNjksICAgLTIzNiwgICAgMTQ3LCAgIDE0NDUsICAgIDU0MCwgICAtOTM2LCAgICAxODEsICAgLTE2MywKKyAgICAgICA5MzEsICAtMTA0NCwgICAgNjY5LCAgIDI0NTcsICAgIDUxOSwgICAgNTk3LCAgLTIwMzEsICAgICAxMSwKKyAgICAgLTEzMTksICAgICAtNCwgIC0xMTkwLCAgICAgODUsICAgIDI1NCwgIC0xNDk0LCAgICAyMzAsICAgMTU4MywKKyAgICAgIC01NDcsICAgIDI3NywgIC0yMDA2LCAgIC0xMDMsICAgMTE5NSwgIC0yNTIyLCAgIDEzMDEsICAgLTYzMywKKyAgICAgIC0xMDQsICAgLTUxMSwgICAgNTczLCAgIDE2MjgsICAgLTQ1MSwgIC0xMDIyLCAgICA1NjQsICAgLTY5MiwKKyAgICAgICAyNTUsICAgMTAyOSwgICAtNDA4LCAgICA3NTcsICAgIDE3MiwgICAtMzk1LCAgIC00NzIsICAtMTcwMywKKyAgICAgLTE4NTYsICAgLTM3OSwgICAgMjg5LCAgICA1MDksICAgLTYyOCwgIC0xMzQ5LCAgIC0yMDcsICAgIDQwNCwKKyAgICAgIC0zOTksICAgMTY3MSwgICAgMzkyLCAgIC05MzUsICAgLTE5MCwgICAgOTUyLCAgLTEyNjcsICAgMTE1MCwKKyAgICAgIDE1NjIsICAgLTYwOSwgICAgNDkxLCAgIC0zNDYsICAgLTI3MCwgICAtNDgzLCAgICAzMTAsICAgMTQyMCwKKyAgICAgLTEwMTcsICAgMTcxNCwgICAtNjQ1LCAgICA4OTcsICAtMTMyNywgICAzMTU0LCAgLTEwNDYsICAgLTg1NywKKyAgICAgIC00OTksICAgLTQ5NiwgIC0xMzQ4LCAgICAzOTksICAgICA2MywgICAtNjUzLCAgIC0zMTUsICAgIDgyMCwKKyAgICAgIDE2NDUsICAgIDYxNCwgICAyMjAyLCAgICA3NzksICAgMzAwMSwgICAxMzgyLCAgICAzODcsICAgLTg0MywKKyAgICAgLTE4NDAsICAgIDQyMiwgIC0xMDE3LCAgICAyNDYsICAgLTIxOSwgICAtNTUwLCAgICAxMDUsICAgLTYwOCwKKyAgICAgICA0MjYsICAgLTM0NiwgICAtMjI0LCAgICAzNzUsICAgICAyMiwgICAtNDQ4LCAgIC0yNzAsICAtMTE1MCwKKyAgICAgIC04OTcsICAgNDI5OCwgICAtODgyLCAgICAgNDksICAgIDYzMywgICAtOTM3LCAgIC02OTQsICAgIDY3NSwKKyAgICAgIC0zMjIsICAgLTc5MywgICAtNTE2LCAgIC0zNjAsICAgLTI0OCwgICAxMTkwLCAgICA1NzUsICAgLTg0MywKKyAgICAgICAtMTMsICAgICA1MCwgICAtODAxLCAgIDExODEsICAgIDQ1MiwgICAtMzM1LCAgIC00OTUsICAgLTEwMiwKKyAgICAgLTEwNTcsICAgIDUwNiwgICAtMjA2LCAgICAgNjYsICAgLTY0NywgICAgOTkxLCAgICAyNTksICAgIDI1OSwKKyAgICAgIC00NjgsICAgIDE5NywgICAgMzczLCAgLTQyMTYsICAgLTc1MCwgICAgMjI0LCAgIC0xODIsICAgIDUyMCwKKyAgICAgIC01MzAsICAgMTg4OCwgIC0yMDE4LCAgLTE0OTIsICAgIDY1NiwgIC0xNDQ3LCAgICA5OTMsICAgLTc5MCwKKyAgICAgIC03ODUsICAgIDc5MiwgICAxNjU4LCAgICAzNzMsICAgIDEzMSwgICAtNDYwLCAgIC03MDMsICAgMTA4MCwKKyAgICAgIC04NzUsICAgLTIxMiwgICAtNjk0LCAgICA3NDcsICAgLTYzOSwgIC0yMjY3LCAgIDEyNjMsICAgLTQxNSwKKyAgICAgIC03NDksICAtMTI3OCwgICAgNTkxLCAgIC03NDUsICAgLTIyNSwgIC0xNjc3LCAgICAgNjksICAgIDYyNSwKKyAgICAgIC0xNDYsICAgIDIxMiwgICAgMzQ1LCAgICA3MjgsICAgLTU1MywgICAxMTE3LCAgICA0NzEsICAgIDU1MCwKKyAgICAgIC00OTgsICAgLTcyOSwgIC0yMDcwLCAgIDEwMDYsICAgLTMzMCwgICAgOTM5LCAgIDM2MzYsICAgICAzNCwKKyAgICAgICAzNDksICAgIDc2MSwgICAtMTMxLCAgICAzNzIsICAgIDYxMCwgICAtMzk5LCAgICAgMTAsICAgICA4NiwKKyAgICAgICAxMTAsICAgIDkzMSwgIC0xMTU5LCAgIC0xNzUsICAgIDYzMywgICAgNTY4LCAgICAxNDAsICAgIDcxMiwKKyAgICAgIDI4MDAsICAtMTU1OCwgICAyMzQzLCAgICAgIDMsICAgLTk3NCwgICAtNjczLCAgICAyMzMsICAgMTQzNiwKKyAgICAgIC03ODMsICAgIDU5OSwgICAtNDQyLCAgICA4NTIsICAgIDYzOSwgICAgNDQ3LCAgIC05NzYsICAgLTU2NCwKKyAgICAgIDE1MTEsICAgICAzNiwgICAgNTI5LCAgICA0MzMsICAgIDY3NywgICAxOTcxLCAgIDI3NzcsICAgLTgyMCwKKyAgICAgIC02NTUsICAtMTQ2MywgIC0xMzkyLCAgLTExNDIsICAgLTM1MiwgICAgNDMyLCAgICA3MzAsICAgIDQzOSwKKyAgICAgIC0yNzMsICAgIDg0NCwgICAgMTA4LCAgICAxMTUsICAgIDQwOCwgICAtMzYxLCAgICA1MDQsICAgIDMzNywKKyAgICAgICAgNTgsICAgMTA3NCwgIC0xNjQ1LCAgLTE2MjMsICAgLTQ5MywgICAgLTcwLCAgLTE1ODUsICAgMjg3OCwKKyAgICAgIC03NDEsICAgIDYzNiwgICAtMjI0LCAgIC05NzQsICAgIDcyMiwgICAtMTQ3LCAgICAxNDksICAgIDEzNSwKKyAgICAgIC0xMDcsICAgLTE1NCwgIC0xMDI3LCAgICAtMTgsICAgLTk4OSwgICAgMjgyLCAgIDMxNzMsICAgMTEyMywKKyAgICAgIC03NzgsICAgMTM4OSwgICAtNTkxLCAgICAzMzcsICAgMTY2MCwgICAtMjg4LCAgIDExNjIsICAgIC02NSwKKyAgICAgICA2NjAsICAgIDMyNiwgICAgMTQxLCAgICAzNTgsICAgIDY3OSwgICAtMjIyLCAgICA0NjAsICAgIDEwNSwKKyAgICAgICA1MTIsICAgICAzNiwgICAtODU0LCAgIC00NzcsICAgLTk0MiwgIC0yMzYyLCAgICAyNjUsICAgMjI1MiwKKyAgICAgIC0xNjQsICAtMjA1OSwgICAgMTA2LCAgICA2NjYsICAgLTQyMCwgICAgNTIxLCAgIC0xNzgsICAgIDM5NiwKKyAgICAgLTE4MzYsICAgIDQ3NSwgICAgIDgyLCAgICAzNTYsICAgIDIwNywgICAgNDMzLCAgLTEwMDUsICAgICA5NywKKyAgICAgICAzODUsICAgLTMwNCwgICAtODUzLCAgIDEyODIsICAgLTIzOSwgIC0yMTM0LCAgICAgODMsICAgICA4NCwKKyAgICAgICAyMDEsICAtMTg5NCwgIC0xNjAzLCAgICA2ODMsICAtMTk1NywgICAtMTEzLCAgICA4MzksICAgMTE4NywKKyAgICAgIC0zMTMsICAgIDc3NCwgICAtNzU0LCAgICA5NDEsICAgLTczOSwgICAgNzQ4LCAgICAxMTYsICAgIDcxNiwKKyAgICAgIDExMzQsICAgLTUzMCwgIC0yMTc4LCAgICAgNzEsICAgLTYxMSwgICAxNTQ0LCAgIDM1MjcsICAgICAtMywKKyAgICAgICAyODMsICAgIDUyNywgICAgNDU3LCAgICAzOTksICAgIDc2MiwgICAgIDE3LCAgIC0yNzksICAgIDE5NiwKKyAgICAgIC01MTgsICAgLTE2MCwgIC0xMjA0LCAgIC0yODksICAtMTM1NCwgICAgMTMyLCAgIC0zMTUsICAgLTI5MCwKKyAgICAgLTIxNzksICAgIDY3NiwgIC0xNDc0LCAgLTEwMTAsICAtMTM5NywgICAgMzYzLCAgICAtNDUsICAgIDc4MywKKyAgICAgIDEzMjYsICAgIC0zMywgICAtMTA5LCAgIC02MTcsICAgLTI3MSwgICAtOTY3LCAgIC0xMDMsICAgMTg2NywKKyAgICAgICA3NjksICAgIDc0MCwgICAtODE4LCAgIDEwMTEsICAgMTQxMSwgICAtNjkzLCAgLTI0NTgsICAgIDgwOCwKKyAgICAgICA4MDYsICAgLTIxMywgICAgNDY4LCAgICAgMzEsICAgIC03MCwgICAgMTY2LCAgICAyMzAsICAgLTQwNSwKKyAgICAgICAxNjMsICAgICA3MCwgICAgNjUyLCAgIDEwNzcsICAgLTE5MCwgICAtNjIyLCAgIDIzNDMsICAtMTMyOCwKKyAgICAgICA2MDEsICAgIDkyOCwgIC0xNjYxLCAgICAxNzQsICAgIDQyOSwgIC0yNDc5LCAgICA1MDEsICAgIDUwMywKKyAgICAgICAtNDEsICAgMTM2NSwgICAgNjcxLCAgIDEwMDYsICAtMTk2OCwgICAgICA3LCAgICAxMDMsICAgLTM5OSwKKyAgICAgIC0zODIsICAgIDU3MywgICAgLTI3LCAgICA1NTQsICAtMjI2MywgIC0zMTc0LCAgICAyNzcsICAgIDE3NywKKyAgICAgICA4MDcsICAgLTMyOCwgICAtODE2LCAgICA0NTMsICAtMTU0OCwgICAgODI4LCAgIC0zMjcsICAgIDE4NywKKyAgICAgIC0zOTMsICAgLTc0NSwgICAgLTc2LCAgIC04MDgsICAgIDU3NSwgICAgIC04LCAgIC0zMjYsICAtMjA2MiwKKyAgICAgICA2MDEsICAgIDU2NiwgICAgNzU1LCAgICA3NzUsICAgIDU5NSwgICAgNDE5LCAgLTM5MjUsICAgLTIyNiwKKyAgICAgICAyNzIsICAgIDM2OCwgICAgMzk1LCAgICAgNTksICAgMTExNywgICAgNTQ4LCAgIC02NDksICAgLTQyOSwKKyAgICAgICAzMjEsICAgIDU0OSwgICAtNzQ0LCAgICAzMTksICAgICA4MiwgICAgMTM1LCAgICAgNzMsICAgICAxNCwKKyAgICAgICAzNzQsICAgICA5MywgICAtMjcwLCAgIC00NTMsICAgIDE3NywgICA0OTkxLCAgICA1NjksICAgIDE2OSwKKyAgICAgICAxMTEsICAgLTI0NiwgICAtMzYyLCAgICAtODgsICAgIC00OSwgICAgNTgzLCAgICAtMzUsICAgICA2MCwKKyAgICAgIC03NTksICAgMTMyNywgICAxNzY4LCAgICA3NjYsICAgLTM1MCwgICAtODgwLCAgIC0xMDYsICAgLTQ0OSwKKyAgICAgIC0xMTMsICAgLTY4MywgICAtNDE4LCAgIC05OTksICAgIDk5MiwgICAgNTU5LCAgIC0yOTAsICAgLTE0NywKKyAgICAgIC0zMjQsICAgICA5MywgICAtOTQ3LCAgLTM5MzIsICAgIC0zNywgICAgMzA3LCAgIDEwODcsICAgLTMxNCwKKyAgICAgIC0yOTMsICAgIDQzMiwgICAgODMwLCAgIC0xMzAsICAgLTIwOCwgICAgIDU5LCAgICA3MTksICAgLTM0OCwKKyAgICAgIDQ1MTEsICAgIDIyNCwgICAgNDg4LCAgIC0xNzQsICAgIDU4OCwgICAgNzk1LCAgIC0zMDEsICAgLTI0NiwKKyAgICAgIC00NDcsICAgIDY4MiwgICAgOTE3LCAgLTEyMDcsICAgLTUwMywgICAtNDUwLCAgICA1NzUsICAgLTExNiwKKyAgICAgIC0xMjYsICAgIDU5NCwgICAgLTIyLCAgIC0xMDEsICAgICAgNSwgIC0xMTg4LCAgIC00MzEsICAgMTE0NiwKKyAgICAgLTM4NjksICAgIC03MiwgICAgNDAyLCAgIC00MTcsICAgLTM5MCwgICAgMzUwLCAgIDExNDEsICAgLTEzOCwKKyAgICAgICA2OTcsICAgICA3NywgIC0zMjU1LCAgIC0yNjgsICAgLTc4NiwgICAtMTA2LCAgLTEzODYsICAgIDQwMCwKKyAgICAgIC04NTYsICAgLTY5MSwgICAtNDM4LCAgLTE1NTAsICAgLTIyOCwgICAyMTYyLCAgICAyMzYsICAgICA2NCwKKyAgICAgIC0zODIsICAgICAgMSwgICAxMDMyLCAgICAxNTMsICAgLTY1OSwgICAxNTYzLCAgIC00MTAsICAgMTI4MCwKKyAgICAgIDE1NzMsICAtMzY3NSwgIC0xMDQxLCAgICAyNDAsICAgIDQwMSwgICAgMjE1LCAgIC0zNTMsICAtMTE0MCwKKyAgICAgICAyNjUsICAgLTEwMywgICAtODI0LCAgICAtOTMsICAgLTMxOSwgICAtODQ5LCAgICAyNTMsICAgLTQ3NywKKyAgICAgIC00NjMsICAgIDE1MywgIC0xMDE3LCAgICA1MzgsICAgMTIzMywgIC0xMDQxLCAgICAgMTEsICAgIDk5OCwKKyAgICAgIC00MzcsICAgLTU2OSwgICAtOTcwLCAgIDIxMTgsICAtMTU3NywgICAgICAxLCAgICAzMjEsICAgMTc4NCwKKyAgICAgIC0yOTgsICAgMjMxNSwgICAgIDcyLCAgICAtMjAsICAgICA4MywgICAgOTA1LCAgLTEyODksICAgLTI0NiwKKyAgICAgICA3MzEsICAgNDA3NiwgIC0xNDc3LCAgICA2MDIsICAgLTkxMSwgICAgOTc4LCAgICA2OTgsICAgLTIzOSwKKyAgICAgICAzOTEsICAgLTcyOSwgICAtMjc2LCAgICAyMjUsICAgIDE0MywgICAtNDE3LCAgIC01MDAsICAgIC0yNywKKyAgICAgLTEyMjAsICAgICA4OSwgICAtNDAzLCAgLTE0NTMsICAtMjU0NiwgICAxMDE1LCAgICAgNzAsICAgICA3OCwKKyAgICAgIDIzNjQsICAgLTE1OSwgICAtNzc1LCAgICAgMjksICAgICAzNywgICAtMjMxLCAgICAgNzMsICAgIDQzMywKKyAgICAgICA0MjYsICAgLTUyOSwgICAgNDIwLCAgIC02MTMsICAgLTEwMCwgICAtNjA1LCAgIDE0NjMsICAgMTAwMSwKKyAgICAgIDExNTksICAtNDA4MiwgICAtNTUzLCAgICAzNDgsICAgLTgwNiwgICAgNjI0LCAgIC0xNjIsICAtMTEyMSwKKyAgICAgICAtMjUsICAgIDkxOSwgICAgLTYyLCAgICAgOTAsICAgLTI3NSwgICAgMjMzLCAgICAyMDMsICAgICAzMiwKKyAgICAgICA3NDUsICAgLTIyMSwgICAgNDU4LCAgICA1MjksICAgIDkwMSwgICAxMDg4LCAgICAgMzgsICAgMTIwOSwKKyAgICAgICA0NTAsICAgIDQ1MSwgICAyMjUwLCAgIC00MTEsICAgLTIwNSwgICAgNzYxLCAgICAyNDksICAtMTIyNiwKKyAgICAgIC0yNjYsICAtMzE5NSwgICAtODAxLCAgICAtMzEsICAgMTAxNSwgICAtMzI0LCAgIC01OTYsICAgIC00MiwKKyAgICAgICAxNTAsICAgIDIwNywgICAyNTk3LCAgIDEwNDEsICAtMTA0NSwgIC0yMjU0LCAgLTE0MjgsICAgIDI1MCwKKyAgICAgICAyMTcsICAgICA2OSwgICAtOTMzLCAgIDE0MjQsICAgIDI4MCwgICAgNDQ2LCAgICA1MjQsICAgIDU0MCwKKyAgICAgICA2MzksICAtMTAyNywgICAgIDIzLCAgICA0MTIsICAgICAzNiwgICAgLTY3LCAgICA0NzUsICAtMTEyNiwKKyAgICAgIC03MzksICAgMTE2MCwgICAgNTE0LCAgIC0xNTcsICAtMjgzMiwgIC0xNDMyLCAgICA1NTksICAgICA3NywKKyAgICAgICA3NDAsICAgLTg4OCwgICAgMTM0LCAgIDEzMDQsICAgLTI2NywgICAtMjY3LCAgICAzMjksICAgICAgOCwKKyAgICAgIDE3MjEsICAgMTQ4OCwgICAgLTI5LCAgLTE3NjAsICAtMTkwNCwgIC0yNjM0LCAgLTEzNDIsICAgLTUyOCwKKyAgICAgIDIyMzMsICAgLTIxOSwgICAtMTk0LCAgLTI5MTksICAgIDEyOCwgICAxMjAzLCAgIC02MjMsICAgLTEyNywKKyAgICAgICA0ODgsICAgLTM4NiwgICAtMTMzLCAgIC0zMjksICAgICA2MiwgICAgIDg1LCAgIDEyNzEsICAgLTE4NSwKKyAgICAgIC00NzksICAgLTU4OCwgIC0yOTY0LCAgICA1NDYsICAgMTY1MSwgICAxNTI2LCAgIC04MzAsICAgMTA0NiwKKyAgICAgICAzNDcsICAgICA2MywgIC0xMDQ4LCAgICAyMzksICAgMTQwMiwgICAgLTIyLCAgICAzMDcsICAtMTYwNiwKKyAgICAgICA3NjgsICAgIDk5OSwgICAgMzA0LCAgIC01MTIsICAgLTE3NSwgICAtMjQ2LCAgIC0zNzMsICAgIDUyOSwKKyAgICAgICAgOTMsICAgLTUyMSwgICAxMzEwLCAgIC01MDgsICAtNDM2NiwgICAgIDI3LCAgIC03NjgsICAgLTM1OCwKKyAgICAgIC01NzUsICAgICAtMiwgICAtNTkzLCAgICAtMjEsICAgLTgzOCwgICAgNjM1LCAgICAxOTcsICAgIDYzNCwKKyAgICAgICAzMjEsICAgLTI2MywgICAtMzc3LCAgIC01NDksICAgICAyMCwgICAgNzM5LCAgICAzOTUsICAgICAtOSwKKyAgICAgIC0zOTIsICAgICA3MCwgICA1Njc5LCAgIC0xMzMsICAgLTEzMCwgICAtMjQwLCAgIC02NzgsICAgIDQyMSwKKyAgICAgIC0xMDEsICAgIDQxMiwgICAgMTQzLCAgICAyMDksICAgIDE5NCwgICAgMjE2LCAgICAyMDAsICAgIC0yMiwKKyAgICAgIC03NDgsICAgLTM5OSwgICAyODYzLCAgICAyODQsICAgIDIzMSwgICAgNjkxLCAgICA1NzEsICAtMzQ2MCwKKyAgICAgIC0yMDAsICAgIDMxMiwgICAgNDgwLCAgLTEzMzgsICAgLTYwMywgICAgNDM1LCAgIC0zMDgsICAgLTYxNSwKKyAgICAgICA1MjAsICAgIDE3OCwgICAgIDY4LCAgIC03MTYsICAgICA0NSwgICAtNTkzLCAgICAtMzIsICAtMTM5MywKKyAgICAgIC01NTQsICAtMTAwMCwgICAtODY3LCAgICA2MTMsICAgIDI4OCwgICAgNTA3LCAgICAyMDIsICAgLTExMywKKyAgICAgICAgMTcsICAgICA5MywgICAtMTQxLCAgICAtNDcsICAgIDY2NSwgICAgNTU5LCAgIC04MDgsICAtNDA5MSwKKyAgICAgIC01NzUsICAgLTE5MywgICAtODczLCAgIC03OTAsICAgIDY3MywgICAtNjA4LCAgIC05NDEsICAgIDc0NSwKKyAgICAgIDE1NjIsICAtMTA2MCwgICAgOTg4LCAgIDExOTIsICAgICAyOSwgIC0xMjA3LCAgICAyMDcsICAgIDY1MywKKyAgICAgIC02MjIsICAgLTEzMiwgICAgMzcwLCAgIDE0MzUsICAgMTk3NywgIC0xODc4LCAgIC0xMTksICAgIDEwMSwKKyAgICAgIC0xMDAsICAgLTE1NCwgICAtODY5LCAgLTIzNzUsICAgMTI1NCwgICAgMTIyLCAgICAxODgsICAgIDg3NywKKyAgICAgICAxODgsICAgLTgzOCwgICAtMzU1LCAgICA2NjcsICAgMzgxMywgICAxMDc2LCAgICAzNjksICAgLTc3MSwKKyAgICAgIC03MTIsICAgLTY2OSwgICAgLTE0LCAgICAxMDcsICAgMTAyNywgICAgMTEyLCAgIDIzMDYsICAgMTQxOCwKKyAgICAgICAxMzMsICAgMTA1NSwgICAgMzc3LCAgICAyNDksICAgMTAyMywgICAtOTI3LCAgICAgMTIsICAtMTk4MywKKyAgICAgIDExNzQsICAgIDIyMywgICAgMzg1LCAgICA4MjcsICAgMTQyNSwgIC0xNjk0LCAgLTExNzgsICAgIC05NCwKKyAgICAgIC01OTMsICAgLTI4NiwgICAxMjYzLCAgIC02NzEsICAgLTQyNSwgICAyMDAyLCAgICA3MDEsICAgMTU0NiwKKyAgICAgICA1NDcsICAgIDE4MiwgICAxMDEzLCAgICAxMjgsICAgIDM1MSwgICAtMjQzLCAgICA0MDcsICAgMjM0OSwKKyAgICAgIC0zNzYsICAgIDQ0NSwgICAgLTkzLCAgICA5NjgsICAgLTMzNywgICAtNjAxLCAgIDEzNDIsICAgIDk4NywKKyAgICAgLTE0OTksICAgLTY0NCwgICAgNTIxLCAgICAzMjcsICAgLTU1NywgICAxODAwLCAgICAgMTIsICAgIDI4NSwKKyAgICAgICAxMjcsICAgLTI2OSwgIC0xOTg5LCAgIC00NDksICAgICA4NywgIC0xMDQyLCAgICAxODQsICAgLTQ5OSwKKyAgICAgIDEyMzEsICAtMTY2NCwgICAtMzUyLCAgICAgIDQsICAgMTI1MywgICAgNDAzLCAgLTEwNjQsICAgIDgzNywKKyAgICAgLTE3MDIsICAgIDEzMywgICAxNjg3LCAgLTEzMDAsICAgMjI0OCwgICAgMTc5LCAgIC04NDcsICAgLTYxNywKKyAgICAgICA0NjAsICAgIDQ1MCwgICAtMjYwLCAgICAgOTQsICAgLTc4MCwgICAtNjc1LCAgIDEyMDksICAgICAzOCwKKyAgICAgICA0NTMsICAgIDg1NywgICAtNjMxLCAgICAzMTcsICAgIDUzNSwgICAxMDg2LCAgIC0xOTYsICAgIDYzOCwKKyAgICAgIC0yODgsICAgLTM4OSwgICAgNjg4LCAgICAtOTMsICAgMTI3MSwgIC00MjkwLCAgICAtOTYsICAgIDQ0NSwKKyAgICAgICAgNjQsICAgLTIxMSwgICAgMTQ4LCAgICAtNzQsICAgIDQ4NiwgIC0xODczLCAgIDEyMTQsICAgMTgzNiwKKyAgICAgIC03MDgsICAgMTgwMCwgICAxNjQ0LCAgICA1NzYsICAtMTA4OCwgIC0xMjEyLCAgIDExNDcsICAgLTQ1NiwKKyAgICAgICAxNzMsICAgLTkxMSwgICAgNDg5LCAgIC00NDMsICAgIDY0NCwgICAgNTM0LCAgICA4NDYsICAtMTUyMiwKKyAgICAgIC03ODYsICAgIDQ5NywgICAtNDAxLCAgLTEwODcsICAgMTQxMCwgICAxMzkxLCAgICA4MzcsICAgLTI1MywKKyAgICAgICAxMjQsICAgLTU5OCwgICAtMjU0LCAgLTM5NDUsICAtMTE2OSwgICAgMTAzLCAgIC0xOTMsICAgICA1MCwKKyAgICAgICA4NDYsICAtMTAxNCwgICAgMzUzLCAgICA0NTUsICAgIDc4NCwgICAxMzQzLCAgIDMwNTUsICAgIDE3OCwKKyAgICAgIC02MjgsICAgLTE0OCwgICAtMjY2LCAgIC0zMjQsICAgIC05NiwgICAtMTkwLCAgIC05MzAsICAgIDExNSwKKyAgICAgICA0NzUsICAgLTY1MSwgICAtMzE0LCAgICAtODIsICAgLTIzNiwgICAgLTg4LCAgLTM3NTMsICAtMTA0OCwKKyAgICAgIC0yODMsICAgLTE3OCwgICAgMzUxLCAgIC02NzEsICAgIDMyNSwgICAxMDU0LCAgICAgMjgsICAgIDU0MCwKKyAgICAgICAxMTMsICAgIC03MywgICAgNzYzLCAgICA4NDQsICAgIDU0MywgICAgIC02LCAgICA3OTksICAgIDI0NSwKKyAgICAgICAxNzYsICAgIDEyNCwgICAgMjYyLCAgIC0xMTIsICAgMTAxMCwgICAgMzYxLCAgIC04NDMsICAgMzI5MCwKKyAgICAgLTM3NDEsICAgIDkxNCwgIC0xODM1LCAgIC0yNTksICAgMjQ2NywgICAgMjk3LCAgLTEyMDUsICAgIDE2OCwKKyAgICAgLTE5MTcsICAgIDE1NiwgICAgIDg3LCAgICA2MzcsICAgLTY3NywgICAtOTU1LCAgICAzMTIsICAgMTI0NiwKKyAgICAgIC0yMTksICAgICA5MiwgICAxMDkwLCAgIC0yOTIsICAgLTc3MywgICAgMzQzLCAgIC01MjMsICAgIDI5OSwKKyAgICAgIC01MTMsICAgMTMyMSwgICAtNTM2LCAgICA1ODYsICAtMTMyNCwgICAyMzQ1LCAgIDIzODQsICAgLTcxOSwKKyAgICAgIC05MzYsICAgMTM4OSwgICAgLTI3LCAgICA4ODAsICAgIDMzOCwgICAtMTI3LCAgIC02NjYsICAgLTQ0MSwKKyAgICAgIDE2MDMsICAgIDE0MywgICAtMjE4LCAgIDIxNjcsICAtMTMzNSwgICAgNDY5LCAgLTEyMjQsICAgMjQ4OSwKKyAgICAgIDEzNjUsICAgIDU2OCwgICAgIDE5LCAgLTEzMjIsICAgLTczNiwgICAgMjA4LCAgIC00OTQsICAgLTQ1NCwKKyAgICAgICA5OTAsICAgLTI1MCwgICAgMzA1LCAgIC01NzUsICAgIDIwNiwgICAtMTY4LCAgLTExNzcsICAgIDI4MiwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMTExMG0wW10gPSB7CisgICAgICAgNDI5LCAgIC0xMDQsICAgLTIxMCwgICAgMjE2LCAgICAzNjEsICAtMjU4NiwgICAgMjUzLCAgLTEzNTAsCisgICAgICAgMTQ1LCAgIDI3OTUsICAgICAtNSwgICAgNjYzLCAgIC0yNjIsICAgICAzNywgICAtMTIyLCAgICAyMDUsCisgICAgICAgMjcwLCAgICAzMjEsICAgMjYyMywgICAgMjU2LCAgICAgIDQsICAgIC00MiwgICAgLTM3LCAgICAxMTIsCisgICAgICAtMzQ2LCAgICAgMjAsICAgIC01MSwgICAgICA5LCAgICAtOTAsICAtMzM0MiwgICAgIDc4LCAgICAgNTIsCisgICAgICAtMjM5LCAgIC00NTQsICAgLTIwNywgICAgMzU1LCAgIC0xMzYsICAgIC0xOSwgICAgMzk0LCAgIC0yMTIsCisgICAgICAtMTY2LCAgICAtNzMsICAgIC02OCwgICAxMDQ5LCAgLTI5NDUsICAgIDM4NSwgICAtNTQ1LCAgIC0yMTEsCisgICAgICAgMTE2LCAgICAtMTUsICAgIDY4NywgICAtMjMyLCAgIDE4MjQsICAgIC02NiwgICAgMTMzLCAgIC00MDMsCisgICAgICAgLTYzLCAgICAgIDMsICAgICA0NiwgICAtMTA0LCAgIC0xMDEsICAgIDEzNiwgICAgLTYxLCAgICA0MjAsCisgICAgICAgMTQ5LCAgICAtMjQsICAgICAtOSwgICA0Mjc3LCAgIC0xNDksICAgLTE2NiwgICAgIDk2LCAgICAtMzUsCisgICAgICAxNzg2LCAgLTEwNDQsICAgIDExNSwgIC0xMzI2LCAgIDMzODEsICAgLTUyMCwgICAgIDcwLCAgIC0xMzQsCisgICAgICAtNDMzLCAgIC0xOTgsICAgIDE0NiwgICAtNjE1LCAgIC0xNDMsICAgIDIwMSwgICAgMzQyLCAgICA0MTIsCisgICAgICAtMTYyLCAgICAgMjIsICAgIDExMSwgICAgIDE2LCAgICAtODUsICAgICAxNCwgICAtMTIwLCAgICAgNzksCisgICAgICAgLTMwLCAgICAtODQsICAgICA1NiwgICAgLTM0LCAgICAtNTIsICAgLTE0NywgICAgIDE5LCAgICAxNTUsCisgICAgICAgIDE3LCAgIC0xMjAsICAgNTg1MywgICAgIDk2LCAgICA3NjcsICAgIDI2MiwgICAtMTk0LCAgICAxMjQsCisgICAgICAtMTgwLCAgICAgMTMsICAgMzA4MSwgICAgIDM5LCAgICA0MDIsICAgICA5MCwgICAgMjkyLCAgICAgODQsCisgICAgICAxOTk5LCAgICAtMTYsICAgIDg2NiwgICAgMjkyLCAgICA0MTYsICAgLTMxNCwgICAgMTc3LCAgICAgLTEsCisgICAgICAgIDY4LCAgICAgIDMsICAgIC0yOCwgICAgLTU2LCAgICAtNTQsICAgICAxMCwgICAgIC01LCAgICAtNjMsCisgICAgICAgIDg5LCAgICAtNjksICAgLTI1MSwgICAgIDcwLCAgIDc1MjMsICAgIC04MywgICAgIDY3LCAgICAgNjIsCisgICAgICAgMTc4LCAgLTE3MjMsICAgIC03NiwgICAgMTAxLCAgICAzNjksICAgLTEzOSwgICAgIDU4LCAgICAxMzUsCisgICAgICAgLTMyLCAgICAxMzgsICAgMzM5MywgICAtNTc1LCAgICA1ODYsICAgIDI5MiwgICAtMjk2LCAgIC01MDUsCisgICAgICAtNjM0LCAgICAgNTIsICAgIDI4MCwgICAgIDc4LCAgICAgMTQsICAgIDExNywgICAgLTM5LCAgICAgNzcsCisgICAgICAgMjMxLCAgICAxMzYsICAgICAxNCwgICAgIDUxLCAgICAxNzMsICAgIC05NiwgICAgICA1LCAgICAzNzgsCisgICAgICAgLTUyLCAgLTQzNDAsICAgLTI2MywgICAgIDYxLCAgICAgMjIsICAtMjg5NiwgICAgLTIwLCAgICAxODAsCisgICAgICAgIDIxLCAgIDM2MzYsICAgLTEzOCwgICAgMTA0LCAgIC0yNzksICAgICA1NiwgICAtNDA3LCAgICAgLTgsCisgICAgICAtMTIzLCAgICAxMzQsICAgIC05NSwgICAtNTAwLCAgICAyNjYsICAgIC02NCwgICAgLTQzLCAgICAgIDEsCisgICAgICAtMTcwLCAgICAgMzEsICAgIDExMCwgICAgIDUzLCAgICAgNTYsICAtNTkzOCwgICAgMTUxLCAgICAgNDksCisgICAgICAgLTc2LCAgIC0xNjYsICAgICAzNCwgICAgIC04LCAgICAxOTMsICAgIDE5OCwgICAtMTE4LCAgICAgLTQsCisgICAgICAgLTQ0LCAgICAyNDksICAgIC0yOCwgICAtMTAyLCAgLTM2MTQsICAgICA0OSwgICAgNDY0LCAgIC0zODgsCisgICAgICAtNzQ0LCAgIC01MDAsICAgIDYwMywgICAgLTg4LCAgICAtMTksICAgMTYwNiwgICAgMzI1LCAgIC0yMjcsCisgICAgICAtMjc3LCAgIC0xNDIsICAgIDIzMiwgIC0xODM1LCAgICAxNTAsICAgIC04OSwgICAgIDI5LCAgICAgIDksCisgICAgICAgIDc2LCAgICA0MjUsICAgLTMyMCwgICAgMTc5LCAgICAyMzEsICAgMTcyMCwgICAgNDI0LCAgLTI3MzAsCisgICAgICAtMjk4LCAgICA2NjYsICAgICA3MiwgICAtNDI4LCAgLTEyNDMsICAgLTI5OSwgICAgIDkzLCAgICAtMTIsCisgICAgICAgLTIwLCAgICAtOTYsICAgLTEyMywgICAgIDE4LCAgICAxODgsICAgICAtMSwgICAtMjM1LCAgICAgLTIsCisgICAgICAzMzI4LCAgICAxMDcsICAtMTQ4OSwgICAgMTk5LCAgICA4OTMsICAgIC02MywgICAgIDQ2LCAgIDM3OTksCisgICAgICAgIDIyLCAgIC0xMTgsICAgLTEyNywgICAgMjgzLCAgICAyNTQsICAtMjA5MSwgICAgMjkzLCAgICAzMzEsCisgICAgICAgODU3LCAgICAtOTIsICAgICA0NiwgICAgIDEzLCAgIC00NTcsICAgIDE2OSwgICAgODUxLCAgICAtMTksCisgICAgICAtMjMxLCAgLTg3MzUsICAgIC02MiwgICAgIDY5LCAgIC0xOTAsICAgLTEwMywgICAgLTMxLCAgICAxMDgsCisgICAgICAgIDY2LCAgICAgOTUsICAgICA1MywgICAgIC02LCAgICAgMTIsICAgICAxOSwgICAgLTczLCAgICAxMDUsCisgICAgICAgLTQwLCAgICAtMjksICAgICA2MCwgICAtMjYzLCAgIC0xMDcsICAgMjIzMywgICAtMjQ2LCAgICA0ODUsCisgICAgICAgMzQyLCAgIDE3MzIsICAgICA3NiwgICAyNDg5LCAgICAgNDAsICAgICA0NCwgICAtMzAwLCAgICAyODAsCisgICAgICAtMTA5LCAgIC0xMDcsICAgLTk5MCwgICAgLTQ1LCAgIDEwMTQsICAtNTA3MywgICAgICAxLCAgIC0xNjksCisgICAgICAgIDI1LCAgICAtNTUsICAgLTM0MCwgICAtNDI3LCAgICA2MDMsICAgIDIwNiwgICAgMTUxLCAgICAzNjAsCisgICAgICAgMzEyLCAgICAtNDQsICAgLTEwNiwgICAgNTE0LCAgICA2ODMsICAgICA5OCwgICAzMzMxLCAgICAgMTksCisgICAgICAtMTA2LCAgICAxMDYsICAtMzM4MywgICAgIDg1LCAgIC0xNjEsICAgIC04OCwgICAgICA4LCAgICAgMTIsCisgICAgICAtMTYzLCAgICAxODMsICAgLTM5MywgICAgMTE3LCAgIC0yNDMsICAgLTQ5OCwgICAgLTYwLCAgICAyOTIsCisgICAgICAtMzIyLCAgLTIxMDUsICAgIDkyMCwgICAgMzAxLCAgICAgNDEsICAgIC0xOSwgICAtMTQyLCAgLTI0ODUsCisgICAgICAgNjMxLCAgIC0yODksICAgLTg0OSwgICAgMTMyLCAgICA4MDAsICAgLTI1NSwgICAtMzkwLCAgICAxMzcsCisgICAgICAtODUwLCAgIC00MTEsICAgICA0MSwgICAgLTkzLCAgLTg2NTMsICAgICAgOSwgICAgLTI1LCAgICAxMzQsCisgICAgICAgLTY2LCAgICAyMjIsICAgIDE1MiwgICAgIDU5LCAgICAgMjksICAgLTE5MywgICAtMTI5LCAgIC0xMDUsCisgICAgICAgIDM5LCAgICAtMjEsICAgIDE4OCwgICAgMTExLCAgICAgMjUsICAgICAtMywgICAgICAwLCAgICAtNzksCisgICAgICA4OTA3LCAgICAtMjQsICAgIC0xOCwgICAgIDM3LCAgICAtMzMsICAgIC00MiwgICAgIDg3LCAgICAtNDQsCisgICAgICAgIDU2LCAgICAtNzksICAgIC02NywgICAgLTUyLCAgICAgMTgsICAgLTEzMiwgICAxOTI1LCAgICAzMDksCisgICAgICAgMTQ1LCAgIC00NDMsICAgMTI3OSwgICAgMjAwLCAgIDEyMTUsICAgIDI4MSwgICAzMzQzLCAgICAzMTEsCisgICAgICAgMzkwLCAgIC0xNTQsICAgLTExOSwgICAtNTIzLCAgICAgMTksICAgLTUyOSwgICAgMTkwLCAgICAyNzIsCisgICAgICAgNTQxLCAgIC0zOTMsICAgIDI3OCwgICAgMTYxLCAgICAgMTMsICAgIDE2MSwgICAgODkxLCAgICAtNjUsCisgICAgICAtMTk5LCAgLTEzNzYsICAgLTM1MCwgIC0xNDA5LCAgICAzNDAsICAgMjExNSwgICAtMjA5LCAgIDI0NTksCisgICAgICAgIDMwLCAgIC01MDksICAgIDE0MSwgICAgIDExLCAgIC01NTcsICAtMTU2MCwgIC0xOTEyLCAgIC0yMzQsCisgICAgICAgIDc2LCAgICA3ODcsICAgMjc4MSwgICAgIDQ1LCAgIC0xNTgsICAgIDMzMCwgICAtNjIzLCAgICA2NTUsCisgICAgICAtODQ1LCAgIC00NjMsICAgLTExOSwgICAtMjUyLCAgIC0yOTksICAtMTk0MCwgICAgMTQ1LCAgICAgMTcsCisgICAgICAtMTgzLCAgICAtNzEsICAgICA5OCwgICAgIDY3LCAgICAxNDUsICAgLTEzNCwgICAgLTg4LCAgICAgLTUsCisgICAgIC0zNjM2LCAgICAgIDMsICAgICAzNCwgICAgMjMxLCAgICA5ODEsICAgICAzMywgICAtOTUzLCAgIC00MDMsCisgICAgICAgMTI5LCAgICAyMTUsICAgIC0xMSwgICAgMTA5LCAgIC0xODgsICAgICA1MSwgICA1MTc2LCAgICAtODksCisgICAgICAtMTEzLCAgICAgNjAsICAgLTEzOCwgICAgLTk0LCAgICAxNDIsICAgIDIxNiwgICAgMzIyLCAgICAtMzMsCisgICAgICAgMzUwLCAgIC0yODUsICAgIDE4MiwgICAgIDkyLCAgICAtMTYsICAgICAxMiwgICAgIDE1LCAgICAxMjYsCisgICAgICAgLTI3LCAgICAgIDUsICAtNTIyMCwgICAtMTU0LCAgICAgMTMsICAgIDEwOSwgICAgIDE4LCAgIC0zMjYsCisgICAgICAtMjU3LCAgICAxMTgsICAgIDMxMywgICAgMzQyLCAgIDIyODksICAgIC0zNSwgICAgLTIyLCAgICAxMTUsCisgICAgICAtMjU2LCAgLTI5MDgsICAgICA2OCwgICAxMjExLCAgICAyMDMsICAgLTczNSwgICAtMzgwLCAgIC0xMzQsCisgICAgICAgMjQ5LCAgICA1MjIsICAgIDEwOSwgICAgLTQ4LCAgLTUxMTQsICAgICAzMiwgICAgLTQyLCAgICAgODUsCisgICAgICAgLTk5LCAgICAyNjUsICAgLTE4NywgICAgLTkzLCAgICAzNzMsICAgIDM0MSwgICAtMjU0LCAgICAgMTYsCisgICAgICAtMTIxLCAgICAtOTIsICAgLTI2MCwgICAgLTgwLCAgICAgLTIsICAgLTMyMiwgICAgMjM0LCAgICAtOTYsCisgICAgIC0yODM0LCAgICAyMzAsICAgIDE0NiwgICAtMjY0LCAgLTMyODcsICAgLTE1MywgICAgIDQxLCAgIC0zNDksCisgICAgICAtMTQ5LCAgICAtOTgsICAgIDE0MCwgICAtMTE1LCAgICA2MjgsICAgIC0xMSwgICAgMjkyLCAgICAgIDQsCisgICAgICAtMTY2LCAgICAgODIsICAtNDU0OCwgICAgMTE2LCAgICAtMjMsICAgLTMxMSwgICAgNjEyLCAgIC0zMzQsCisgICAgICAgNDUxLCAgICAyNTksICAgIDU1OSwgICAgMzIwLCAgIC0yNjcsICAgIDUxNywgICAtMTM5LCAgIC0xNjYsCisgICAgICAgMTI2LCAgICAgMjcsICAgIC04OSwgICAtMTU2LCAgICAgMTQsICAgICA2MywgICAgIC0zLCAgICAgMzEsCisgICAgICAgMTA5LCAgICAtNDMsICAgICAxMCwgIC03NjgyLCAgICAgMzYsICAgIC0yMywgICAgIDczLCAgICAxMjksCisgICAgICAgICAwLCAgIC0xMTYsICAgICA2NiwgICAgICA1LCAgICAxMzcsICAgIC0xNywgICAyNTIzLCAgICAyMDMsCisgICAgICAgNDMxLCAgLTI3MjksICAgIDE3NSwgICAgNTQwLCAgICA0NTQsICAgLTE3NSwgICAtMjk3LCAgICAtNjAsCisgICAgICAgMzQ4LCAgICAgNTMsICAgIDY4OCwgICAgLTQ5LCAgICAxMzMsICAgIC03MiwgICAgMjAwLCAgIC0zNDgsCisgICAgICAgMTM2LCAgIC0xNDIsICAtMjI1OSwgIC0zMDQ3LCAgICAtNjAsICAgLTczNywgICAgIDQ4LCAgIC0zMzEsCisgICAgICAgIDg1LCAgIC0xMzQsICAgIDIxOCwgICAtOTYyLCAgIC0yNzgsICAgLTE0OCwgIC0xMDc3LCAgIC0xMzEsCisgICAgICAgIDUzLCAgIC0xMjcsICAtMjI2NSwgICAgIDgyLCAgICAtMzEsICAgLTI2MiwgICAgMjI2LCAgIC0zODUsCisgICAgICAgIDgzLCAgICA3NTYsICAtMjcxNSwgICAtNDkyLCAgIC0xMTUsICAgIDY2MywgICAtMzEyLCAgICAyNDAsCisgICAgICAtMzE4LCAgIC04MTksICAgMzA0MCwgICAtMTgxLCAgICAxNDgsICAgIDE2NSwgICAgMzc2LCAgICAgOTIsCisgICAgICAtMjMzLCAgICAxODgsICAgLTEwMCwgICAgOTAyLCAgIC00MDEsICAgMTAwNSwgICAgLTUyLCAgICAxNjIsCisgICAgICAgMjE5LCAgIDE4MzEsICAgIC02OCwgICAgLTY2LCAtMTAwMjMsICAgIC05MCwgICAgLTIzLCAgICAgMzksCisgICAgICAgLTkxLCAgIC0yMzEsICAgICAyMywgICAgMTc0LCAgICAgNDIsICAgICA3OSwgICAgLTU3LCAgICAtNTgsCisgICAgICAgIDE4LCAgICAxNzUsICAgICAzMiwgICAgMTIyLCAgIC0xODUsICAgIDI2NiwgICAgMTYyLCAgICAzMDAsCisgICAgIC0zMTU4LCAgLTMzODEsICAgICAtMywgICAtMzEyLCAgICAxNzgsICAgIC0yNCwgICAtMjM0LCAgICAyNDgsCisgICAgICAgIDY4LCAgICAyOTMsICAgIDM2MCwgICAtMTQ2LCAgICAtMzAsICAgICAtMiwgICAgMTc3LCAgICAxMTMsCisgICAgIC0xMjE1LCAgIC01MzgsICAgLTI3NCwgICAgIDc5LCAgICAgLTIsICAgIC0xNywgICAyNzkxLCAgICAgNzEsCisgICAgIC0xMzAwLCAgICAgOTMsICAgLTgxOCwgICAtNTU4LCAgIC0zMzEsICAgIDExNSwgICAgMjE1LCAgIC02MDMsCisgICAgICAtMjAyLCAgICAxMTMsICAgIC04NywgICAgIDM5LCAgIC0yNzcsICAgMzU2NCwgICAgIDc1LCAgIC00NDQsCisgICAgICAgMjAxLCAgICAxMTEsICAgLTM2OSwgIC0xMDcyLCAgICAyMTIsICAgLTI3NiwgICAtMzIyLCAgIC00ODQsCisgICAgICAtNzAwLCAgICAgMzcsICAgLTMwMiwgICAgMTc3LCAgICAgODYsICAgICAxMCwgICAgLTg3LCAgICAgNTYsCisgICAgICAgIDc2LCAgLTg5NDEsICAgIC0yNywgICAgLTczLCAgIC0xMzMsICAgIC01MSwgICAtMTA2LCAgICAtMjgsCisgICAgICAgLTUyLCAgICAgNDksICAgICA2OCwgICAgIDI2LCAgICAgMTYsICAgIC04MSwgICAtNDIzLCAgIDI4MzQsCisgICAgICAgICA3LCAgICAtNTQsICAgLTEwNywgICAgMTQ0LCAgLTM4MTIsICAgICAxNywgICAtMzU1LCAgICAgIDMsCisgICAgICAgLTMyLCAgICAtMjQsICAgICAxNCwgICAgIDc2LCAgICAxNjksICAgLTI2MCwgICAgMzQ5LCAgIC0xNTksCisgICAgICAzNjkxLCAgIC0xODQsICAgNDM0NSwgICAgLTQ2LCAgICAxNDYsICAgIC0xNCwgICAgMTQzLCAgIC0zODQsCisgICAgICAgLTc1LCAgICAgMTIsICAgIDE0NCwgICAgMTA1LCAgICAgNDcsICAgIDE0MSwgICAgLTMyLCAgICAtMzEsCisgICAgICAgIDQ4LCAgICAxODcsICAgICA3NCwgICAgMTM5LCAgICAxMzIsICAgICA4NiwgICAgLTE1LCAgIC0zMTcsCisgICAgICAtMjY3LCAgIDMxMTIsICAgMTgyMSwgICAtMzYzLCAgIC0xMjUsICAtMTE1MiwgICAtMjk0LCAgIC00NDksCisgICAgICAgMjc3LCAgIDExNTEsICAgLTM0MSwgICAgIDEyLCAgICAtNDEsICAgIDIxMCwgICAgLTUxLCAgICAgIDYsCisgICAgICAgIDE4LCAgICAgNTMsICAgICAxMSwgICAgIDM3LCAgICAtMzYsICAgIC03MCwgICAgIDY1LCAgICAgNDQsCisgICAgIC03MzAyLCAgICAgMTUsICAgLTEzMywgICAgIDU2LCAgICAxNTAsICAgICA2MywgICAgNTE1LCAgICAyNzEsCisgICAgICAgLTMyLCAgICAgNDcsICAgICA0MSwgICAtMTMwLCAgICAxNjgsICAgLTE1OCwgICAtMjM5LCAgICAtNjAsCisgICAgICAgMjI2LCAgICAyNDcsICAgLTU5MywgICAtMjM3LCAgLTM1NTksICAgICA2NSwgICAgNjIzLCAgICAgMTYsCisgICAgICAtMjEyLCAgICAgMjYsICAgLTE4MSwgICAgIDgxLCAgICAgODMsICAgICAyNiwgICAgLTI1LCAgICAtOTIsCisgICAgICAgIC01LCAgICAgMzYsICAgIC0zMSwgICAgMjc3LCAgIC0yNjMsICAgIDEzNSwgICAgIDc4LCAgIC0xNzMsCisgICAgICAgMjIwLCAgLTUyNjAsICAgMjIzOSwgICAgLTk2LCAgICAtMTksICAgIC05NSwgICAgIDc1LCAgICAtMjUsCisgICAgICAgLTY0LCAgICAyNDQsICAgLTE1NCwgIC0yNjQ2LCAgIC00NDYsICAgIDk4MCwgICAgNTEyLCAgICAzOTIsCisgICAgICAtNDAyLCAgLTEwNTAsICAgIDI3NiwgICAtNDU2LCAgLTEzMzQsICAgMTg2MywgICAgNjM2LCAgLTE1MTIsCisgICAgICAgMjM0LCAgICAxOTksICAgIDIzNywgICAgMzYzLCAgICAgNjYsICAgIDI4NCwgICAgMTk4LCAgIC0yNzcsCisgICAgICAtMjY3LCAgIC01NDAsICAgLTMyOSwgICAgODU2LCAgIC00ODIsICAgLTY0NSwgICAgMTc4LCAgIC0yNDAsCisgICAgICAtMTc4LCAgIDY2MzMsICAgICAtNSwgICAgMTI3LCAgICAtODAsICAgLTE2NywgICAgMzA3LCAgICAgIDcsCisgICAgICAgMjQ4LCAgICAgMTMsICAgICA1MywgICAgMTI0LCAgICAyMTUsICAgLTMxMCwgICAgMjU1LCAgIC0xOTQsCisgICAgIC0zMDY2LCAgICAtMjIsICAgMzUyNCwgICAgIDUxLCAgICAxOTMsICAgIDE2NSwgICAgIDgyLCAgICAtODAsCisgICAgICAgIDU0LCAgIC0xOTEsICAgLTI3OCwgICAgLTE5LCAgICAzNzksICAgIDI4NSwgICAgLTU4LCAgIC0xNTcsCisgICAgICAtMTY4LCAgIC0xODMsICAgIDM4OCwgICAtMTk4LCAgICAxOTEsICAgIDEwNywgICAgIDEwLCAgICAgLTIsCisgICAgIC02MTQ4LCAgICAgNDUsICAgIC01OCwgICAgIDQ4LCAgIC0xNTAsICAgIC03MiwgICAgMTEyLCAgIC0xMjQsCisgICAgICAgLTQxLCAgIC0xMjksICAgICAzNiwgICAgLTY2LCAgLTMzMTEsICAtNDA5MiwgICAgIDE1LCAgICAtMTEsCisgICAgICAgIDkzLCAgICAtNTQsICAgICA3MiwgICAtMTA1LCAgICAxMzEsICAgICA2NiwgICAgIDI5LCAgICAtNTQsCisgICAgICAgMjAxLCAgIC0yMTAsICAgIDIyMSwgICAgIDQ3LCAgICAgNTUsICAgIC05OSwgICAgIDMxLCAgLTM2MjYsCisgICAgIC0zNjIzLCAgIC0xNzUsICAgICA5MSwgICAgLTUzLCAgICAgNDAsICAgIC05OCwgICAgLTc2LCAgICAyMjQsCisgICAgICAgIDE1LCAgICAxNzIsICAgICA4NSwgICAgMTAzLCAgIC0xNDcsICAgLTEzNSwgICAtMjE0LCAgIC0zMTMsCisgICAgICAxMzA0LCAgICAxNDMsICAgIDE5MCwgICAgIDE5LCAgLTI1MjYsICAgIC05MSwgICAtMTY4LCAgICA4NzUsCisgICAgICAgLTI3LCAgICA3ODksICAgIDc5MSwgICAtNDYyLCAgICA5MTIsICAgLTU4MCwgICAgIDcwLCAgIDE1MjMsCisgICAgICAgNzg3LCAgIC0xNTAsICAgIDU2NywgICAyNzE3LCAgICAgLTUsICAgMjk0MywgICAtMTA3LCAgICAxNTUsCisgICAgICAgIDMyLCAgICAgNjUsICAgIDE1OCwgICAgMTMzLCAgIC0xOTEsICAgIC00NCwgICAgMTQxLCAgIC0xNDksCisgICAgICAgMTk5LCAgICAxNzcsICAgIDI3MCwgICAgLTE0LCAgICAtNTcsICAtMzY2OSwgICAzODkxLCAgIC0xNTgsCisgICAgICAgMjM5LCAgICAtMTcsICAgICA1MiwgICAgMjQ0LCAgIC0zNDMsICAgLTExOCwgICAgMTg2LCAgICAtNTQsCisgICAgICAtMTM0LCAgICAxMDYsICAgLTEzMywgICAtMTE2LCAgICAxODYsICAgLTE0OSwgICAtODk0LCAgICAtMjIsCisgICAgICAtMzk5LCAgICAgIDEsICAgIDI4OCwgIC0zOTg4LCAgIC0yNjAsICAgIDExMywgICAgIDY2LCAgIC0yNzYsCisgICAgICAgMTc5LCAgIC0yMjYsICAgIDExOSwgICAgNDIwLCAgICAgNTEsICAgLTQ4MywgICAgNTUxLCAgICAxMjksCisgICAgICAgMjQ1LCAgIDIwMTMsICAgIDYzOSwgICAgLTg3LCAgIDUwNTgsICAgICA0MSwgICAgLTUzLCAgIC0xMTYsCisgICAgICAtMTMwLCAgIC0yMjMsICAgLTEwNCwgICAtNzYwLCAgICAyNzYsICAgIDExNywgICAgMzM4LCAgIC0xMzcsCisgICAgICAtMjMzLCAgICAtNjUsICAgIDExOSwgICAgMTAwLCAgLTMyNDUsICAgICAgMiwgICAzODc3LCAgICAxMjYsCisgICAgICAgMTcyLCAgICAgLTIsICAgIC03MiwgICAtMTUzLCAgICAyMDAsICAgLTEwOSwgICAgLTYyLCAgICAxMzUsCisgICAgICAgMTk0LCAgICAtODIsICAgLTE1MCwgICAgIDk4LCAgICA1NTAsICAgLTI1MSwgICAtMjc0LCAgICAgNzEsCisgICAgICAgMTYwLCAgICAxMjEsICAgIC0xMywgICAtMzY1LCAgICAzNTYsICAgLTIxMiwgICAtMjcxLCAgIDUwNjcsCisgICAgICAtMjAzLCAgIC0yNTEsICAgIDIyMiwgICAgIDc1LCAgIC0xMzEsICAgICAxNywgICAgMTAzLCAgIC05MTEsCisgICAgICAtMzQ4LCAgICAtMjYsICAgICAgNiwgICAgMTEwLCAgICAxMjAsICAgLTY0NSwgICAgMzU1LCAgIC02NDksCisgICAgICAtMTMyLCAgLTM0MTYsICAgICA2NSwgIC0xNDc4LCAgICA0NjEsICAgLTEwOSwgICAgMjU4LCAgICAtMTUsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjExMTBtMVtdID0geworICAgICAgLTExMCwgICAyNzQzLCAgICAtMzEsICAgICA4NiwgICAgLTExLCAgIDM3MDUsICAgIDE5MiwgICAgLTg5LAorICAgICAgICA1NywgICAtMjUyLCAgICAtMTEsICAgLTIxMiwgICAgMTYzLCAgICAgIDAsICAgLTEzNywgICAgNDA1LAorICAgICAgIC05OSwgICAtMTI0LCAgIC0xMzcsICAgLTQwNywgICAgMTI1LCAgICAxMDYsICAgLTkyMiwgICAxNTY3LAorICAgICAgICA4NSwgICAgMTY1LCAgICAyNDEsICAgIDExMCwgICAyOTE4LCAgICA1OTgsICAgLTQ0MywgICAgODEyLAorICAgICAgIDE1OSwgICAgNTE4LCAgICA1NTUsICAtMTg4NiwgICAgLTY1LCAgICAtNTIsICAgICAtMywgICAgLTI3LAorICAgICAgICA1NiwgICAgLTMwLCAgIC0xMjYsICAgIDEyNiwgICAgIDIzLCAgICAgNzQsICAgIDE1NywgICA2OTkwLAorICAgICAgIC0zNCwgICAgIDU2LCAgIC0yNTcsICAgLTE3MiwgICAgMTE1LCAgICAtMjMsICAgLTYxNiwgICAtMjQzLAorICAgICAgLTQ0MSwgICAgIDM0LCAgICAxNTksICAgICAgNiwgICAgIDc4LCAgIC0xMTksICAgICA0OSwgICAgIDM0LAorICAgICAgLTEzMywgICAgOTg4LCAgLTEwMDcsICAgIDQ3NCwgICAgIDc3LCAgIC0yNzQsICAgIDM1NCwgICA0OTA3LAorICAgICAgIDIyMiwgICAgLTE2LCAgICAgNjksICAgICAtNCwgICAgOTI0LCAgICAtMTgsICAgMzUzNSwgICAtMjk5LAorICAgICAgIC0zOCwgICAgLTgzLCAgIC0xMTEsICAgIDk3NywgICAtMTM4LCAgLTEwNzUsICAgLTQ0NCwgICAgNTQwLAorICAgICAgIDE5OSwgICAgMjAyLCAgIC01MDIsICAgLTE5NCwgICAtMTk4LCAgICAyNDksICAgIDEwMSwgICAgMjc2LAorICAgICAgIC04OSwgICAgIDk2LCAgIC0zMDEsICAgICAgNiwgIC00MDIzLCAgICAtNzAsICAgIDE3NCwgICAgIDkzLAorICAgICAgIDE5MiwgICAtMTIwLCAgICA3NTUsICAgLTU2MCwgICAgLTIyLCAgICAgNzgsICAgICA1NiwgICAgIDI5LAorICAgICAgICAyOCwgICAgLTQ0LCAgICAgNjUsICAgICAtNCwgICAgICAwLCAgICAgNDksICAgLTI1MCwgICAgIDg3LAorICAgICAgICA0NiwgICAgIDQ0LCAgICAtNDEsICAtNzAzNSwgICAgIDE0LCAgICAyODgsICAgIDYzMiwgICAtMjU5LAorICAgICAgIC02NCwgICAgIDIwLCAgIC0xNzgsICAgLTM0MywgICAtMjc0LCAgICAxMDYsICAgMjg0MiwgICAgMzM2LAorICAgICAgLTI4MywgICAgMjQ1LCAgIC02MTIsICAgICAtNSwgICAgNTAwLCAgICAgNzcsICAgMjQ5MiwgICAtMjUwLAorICAgICAgICA2NCwgICAgMTcxLCAgIC05ODgsICAgICAgNCwgICAgLTUxLCAgICAtMzQsICAgLTU1NSwgICAtMTcxLAorICAgICAtMjYyOSwgICAgMjcyLCAgIDI4NTIsICAgLTE2MiwgICAgLTk4LCAgIC0yMzcsICAgLTI3OCwgICAtNDg5LAorICAgICAgIDY0MSwgICAgLTk2LCAgIDc4MTUsICAgLTEzOSwgICAtMTE2LCAgIC0xMzcsICAgLTEyMSwgICAtMzE0LAorICAgICAgLTE2MSwgICAgMjExLCAgICAgNzYsICAgIDEzNiwgICAgLTM1LCAgIC0xMjQsICAgIC0yNywgICAgIDc2LAorICAgICAgIC05OCwgICAgMTMzLCAgICAgODUsICAgIDMzMiwgIC00MzUyLCAgICA1MDcsICAgIC0xNCwgICAtMjc1LAorICAgICAgLTIxMiwgICAgMzA4LCAgICAyNTgsICAgIDEyOSwgICAtMTY1LCAgIC0xOTcsICAgLTEwNCwgICAtMTUwLAorICAgICAgLTEwNCwgICAgIDYwLCAgICAxMjUsICAgIDU2OCwgICAgIC0zLCAgIDE2OTQsICAgICA2MiwgICAgLTcwLAorICAgICAgIDEwOSwgICAgMTIyLCAgICAtNTcsICAgIC0xOCwgICA4NjQyLCAgICAxMDAsICAgICA1MCwgICAgIDkyLAorICAgICAgICAxNywgICAgLTg2LCAgICAtOTMsICAgIC02OCwgICAtMTIxLCAgICAtNjEsICAgIC0zMiwgICAgIDI3LAorICAgICAgLTE4OCwgICAgNTAyLCAgICAxMjMsICAgIC04MSwgICAgIDM3LCAgICAgNDgsICAgIDE4NywgICAgIDc1LAorICAgICAgIC0zMCwgICAgLTIyLCAgIC0yMjQsICAgLTI5MiwgICAgIDk5LCAgICAtNDksICAgNDI3MywgICAgIDEwLAorICAgICAgIDgzNCwgICAgLTI1LCAgICAyMjUsICAgMjc3MywgICAgIDc4LCAgLTMyODEsICAgLTE4MSwgICAgMjM0LAorICAgICAgLTEzMCwgICAgLTc0LCAgICAxMDEsICAgIDIxNCwgICAgLTI2LCAgIC0xMTMsICAgLTI2OCwgICAtMTY4LAorICAgICAgIC05MCwgICAtNDM1LCAgICAtMjYsICAgICAzOCwgICAtNTY5LCAgLTQwMDksICAgICAtMSwgICAgIDExLAorICAgICAgICA2OSwgICAgICAzLCAgICAyNDksICAgICA5OCwgICAgMTc4LCAgICAxMzEsICAgIDMwMCwgICAtODI2LAorICAgICAgICA0OCwgICAgMzM3LCAgIC04MjgsICAgLTM3MSwgICAgIDk2LCAgICAzMTIsICAgIDcxMiwgICAtNjY3LAorICAgICAgIC03MCwgIC0yMDcwLCAgIC0yNDIsICAgIDUxOSwgICAtNjc2LCAgICAxNDMsICAgLTYxMywgICAgODkzLAorICAgICAtMjE5MywgICAgNDcxLCAgIDEwNzEsICAgIDIxMywgIC0xMjMxLCAgIC0xOTYsICAgLTU4MCwgICAgMTU1LAorICAgICAgIDQwMSwgICAgIDc4LCAgICAtNjQsICAgICAyNywgICAtMjM4LCAgICAgMjIsICAgIC03MywgICAgLTE5LAorICAgICAgIDE5NCwgICAgIDYwLCAgICAtODcsICAgLTIxMCwgICAtMTU1LCAgICAyNDQsICAgLTEyMywgICAtMTY5LAorICAgICAtNDQ0MiwgICAgMTY5LCAgIDMxMzIsICAgLTE4MSwgICAgIDY1LCAgIDM5NTAsICAgLTM5NiwgICAgMjA5LAorICAgICAgICAzOSwgICAgLTUyLCAgICAtMjYsICAgIDE2NiwgICAgICAxLCAgIC0xNjQsICAgIDE0MywgICAgLTY2LAorICAgICAgIDE2OSwgICAgIDQ2LCAgICAtMTYsICAgLTI5NSwgICAgIDM5LCAgICAgNDIsICAgICA0MCwgICAgIDY3LAorICAgICAgICAyNSwgICAgIDE3LCAgICAgLTEsICAtODkyMCwgICAgLTgyLCAgICAtNDIsICAgICA0OSwgICAgIDgxLAorICAgICAgIC02MSwgICAgICAxLCAgICAgMzksICAgIC00MCwgICAgIDE4LCAgICAgNzQsICAgIDIwNiwgICAtMTMxLAorICAgICAgIC03MSwgICAgMTA2LCAgICAgIDcsICAgICA4OCwgICAgLTEzLCAgICAgNjksICAgLTExMywgICAgLTg5LAorICAgICAgIDIxMiwgICAgIC00LCAgIDQzNzMsICAgIC0zNCwgICAgMjgzLCAgICAxMDUsICAgIDI1MiwgICAgIDU5LAorICAgICAtMjU3OCwgICAtMjk4LCAgIDE4NDYsICAgLTExMCwgICAtMTA1LCAgIC0zMTAsICAgLTE0MywgICAtMTI3LAorICAgICAgIDI3NCwgICAgMjI1LCAgICA4NjEsICAgIDI2MiwgICAtODE1LCAgIC0zMTEsICAgIC0yNiwgICAtNjg1LAorICAgICAgIDI0MywgICAtNjIwLCAgIC0zNzQsICAgMjk5MiwgICAtMTEyLCAgICAtMzUsICAgMjkwMywgICAgLTk0LAorICAgICAgIC01NiwgICAtMjEzLCAgICAgNjUsICAgIDM4MywgICAgIDQxLCAgICA1MDgsICAgLTI1OCwgICAtMTAzLAorICAgICAgLTQ0MCwgICAtMjM3LCAgICA0MjgsICAgIDEzMiwgICAyNzkzLCAgICAtNzcsICAgLTExMywgICAgLTU4LAorICAgICAgIC0xOSwgIC0zODU3LCAgICAtMjUsICAgICA0MCwgICAtMTY3LCAgIC0yNDMsICAgLTIzMywgICAgLTQxLAorICAgICAgLTI3OSwgICAgMjEzLCAgICAtMjIsICAgICAgOCwgICAgMTIwLCAgICAxMjYsICAgIDE1OSwgICAtMjEyLAorICAgICAgLTI0NCwgICAgMTgzLCAgIDE2MDUsICAgICA2MiwgICAgLTEyLCAgIC0yNDQsICAgIDUxOSwgICAgNzgwLAorICAgICAgIDExNiwgIC0zMTk3LCAgIC05OTIsICAgIDM0MSwgICAgMjIyLCAgICA2ODEsICAgLTM1NywgICAtNjY5LAorICAgICAgICA1NSwgICAxMjEzLCAgICAxMDAsICAgIDQ0MSwgICAgICAxLCAgICAtNTcsICAgIDIzMiwgICAgIDEwLAorICAgICAgLTExNCwgICAgMzE4LCAgIC0xNDcsICAgICA4OSwgICAgMTg4LCAgICA0NDgsICAgLTMyNywgICAzNzM1LAorICAgICAgLTI5MiwgICAgODc1LCAgIC0yMTYsICAgIDIxMSwgICAgMTExLCAgICAxNjAsICAgIDE3MiwgICAgMjg2LAorICAgICAtMzUxMywgICAtODQ5LCAgIC0xODUsICAgICAtOSwgICAgIDMxLCAgICA0NDIsICAgIDc0NywgIC0xMDQ1LAorICAgICAgIDE4NywgICAgNzA0LCAgIC0yMTksICAgIDUwOSwgICAgIDQ4LCAgICAgNjksICAgIC0yNSwgICAgLTEwLAorICAgICAgICA3NSwgICAgIDIzLCAgICAgMTAsICAgICAyMywgICAgLTMyLCAgICAgODksICAgODYyOCwgICAgLTc3LAorICAgICAgIC0xOSwgICAgIDI3LCAgICAgIDAsICAgLTIzMiwgICAgIDIyLCAgICAtNTAsICAtMTkwNCwgICAtMTM3LAorICAgICAgLTE2OSwgICAgMTI4LCAgICAxMzgsICAgICA3OCwgICAtNDQzLCAgICAyNDMsICAgIDE1NywgIC0zODA5LAorICAgICAgIDIzMSwgICAgMjc3LCAgIC0zNDEsICAgICA3MywgICAgLTcwLCAgICA1OTYsICAgIDI1OSwgICAgMTU3LAorICAgICAgMjE5NywgICAgNTc1LCAgIDI0NDUsICAgICAxMSwgICAgLTUzLCAgICAxMTgsICAgLTExNSwgICAgNTYyLAorICAgICAgIDEwOCwgICAgIDMwLCAgIC0yNDEsICAgICAzMCwgICAtMzk0LCAgIC0xNTUsICAgLTE4NiwgICAtMzQ0LAorICAgICAgLTIzNywgICAtMzE5LCAgLTIyNTgsICAgIDM0MywgICAtMzExLCAgICAgMTQsICAgIDE2OSwgICAgIDU5LAorICAgICAgIC0xNSwgICAgMjMzLCAgICA3MzIsICAgIDM2NSwgICAtNjkyLCAgIC0xMDgsICAgMTQxNiwgICAtNDYzLAorICAgICAgLTI3OSwgICAtMjQ4LCAgLTE3MzEsICAgLTQwNiwgICAtMjc4LCAgICAyOTgsICAgIDIwOSwgICA1MzMzLAorICAgICAgLTE5OCwgICAtMTY3LCAgICAgNTAsICAgIDQzOSwgICAgMTQyLCAgICAgOTEsICAgLTUyMywgICAgMjI2LAorICAgICAgIDI2MiwgICAtMTMwLCAgICAtMTUsICAgIDU3MywgICAgIC00LCAgICAyNzEsICAgICAtMiwgICAgLTQ3LAorICAgICAgICAgNywgIC05MTA2LCAgICAtNjksICAgIC00NCwgICAtMTQ0LCAgICAtOTgsICAgIDE5OSwgICAtMTgxLAorICAgICAgICAgNiwgICAgIDQ1LCAgICAgNDcsICAgICAzNywgICAgLTUxLCAgICAtNjgsICAgIC01MCwgICAtMTE2LAorICAgICAgLTEwNSwgICAgIDQ5LCAgICAzNzYsICAgLTQyMCwgICAgMTg3LCAgIDI4OTQsICAgICAyOSwgICAtNDcxLAorICAgICAgLTIyMSwgICAgNDU1LCAgICAgLTEsICAgLTg1OCwgICAgIDU1LCAgIC0xOTcsICAgIDM1OSwgIC0xOTcyLAorICAgICAgLTE4OCwgICAgOTIxLCAgIC0xMzQsICAgIDE4NiwgICAtODQzLCAgLTI1NDIsICAgIDMyMiwgICAgIC0xLAorICAgICAgLTE1OCwgICAtMzUyLCAgIC0zMDcsICAgLTU3OCwgICAgLTYwLCAgICAxNDMsICAtMTMwMiwgICAgMzMzLAorICAgICAgIDY4MSwgICAxMzczLCAgLTEwMjEsICAgICAxOCwgICAgMjg0LCAgICAtMjgsICAgICAgOCwgICAgLTU3LAorICAgICAgIC0xNiwgICAgIDE1LCAgICAgNTgsICAgICAzMSwgICA4Mzg5LCAgICAtMzUsICAgICAxOCwgICAgIDc3LAorICAgICAgIC03OCwgICAgIDE1LCAgICAgMzYsICAgICAxNywgICAtMTM0LCAgICAtMTcsICAgIDMxNiwgICAtNjgwLAorICAgICAgIDQ5MSwgICAgIDM4LCAgIC0yMTcsICAgLTI3OCwgICAgMjc2LCAgIC0yOTksICAgIC03NSwgIC00MDMwLAorICAgICAgLTI5MywgICAtNTA3LCAgICAtNjIsICAgLTM0NCwgICAgIDY0LCAgIC00MzgsICAgLTM0NCwgICAtMjU2LAorICAgICAgIDM0MSwgICAgMTk5LCAgICAtNjYsICAgICAyOCwgICAgLTE3LCAgICAtMTcsICAgICAgMiwgICAgMTQyLAorICAgICAgICAgNiwgICAgLTQ4LCAgIC0xNjksICAgIC0yNywgICAtMTE3LCAgIDY3MzksICAgICA0MiwgICAgLTYxLAorICAgICAgIDE0MCwgICAgMjQ2LCAgIDMzNTcsICAtMzI0MywgICAgIDQ4LCAgICAtNTUsICAgICA0OSwgICAgIDI3LAorICAgICAgICAgNCwgICAgMTcyLCAgIC0xNjksICAgICAgNiwgICAgIDY5LCAgIC0yNjUsICAgICA3MCwgICAgIDI1LAorICAgICAgIDIyMywgICAgIDI4LCAgICAxMjksICAgIDIzMSwgICAgIDU3LCAgLTE2MDgsICAgMjY0MCwgICAgLTI4LAorICAgICAgLTE5NywgICAgIDI5LCAgICAtMTEsICAgIDEzOCwgICAgNjIxLCAgICA0MjcsICAgICAyMCwgICAgNTE0LAorICAgICAgIDY2MywgICAgNTYyLCAgICA0NDcsICAgLTE1OCwgICAtOTA5LCAgICAzNDMsICAgLTMyMSwgICAtMjU3LAorICAgICAgNjY0MSwgICAgIC0xLCAgICAtMjAsICAgIC03MCwgICAgIDYyLCAgICAyNDEsICAgICA1MSwgICAgLTgzLAorICAgICAgIC00OCwgICAtMTU2LCAgIC0yNjYsICAgLTMzNSwgICAgLTQzLCAgICA0MjEsICAgIDM1MCwgICAgMzA2LAorICAgICAgIDE2NSwgICAtNTQxLCAgICAgNDcsICAgICAgNSwgICAgLTQwLCAgICAzNjQsICAgICAyMSwgICAgMTkwLAorICAgICAtNDU4NCwgICAtMTI1LCAgIC00NDEsICAgIDQ4OSwgICAtNTcxLCAgICAtNDcsICAgIC0xMCwgICAgMjA1LAorICAgICAgICA2MCwgICAgLTczLCAgIC01ODQsICAgIDQxNywgICAgMjMzLCAgICAtMzQsICAgLTEwOSwgICAgIDg1LAorICAgICAgICA0MSwgICAgMTM0LCAgICA0ODUsICAgLTE3MSwgICAtMTgzLCAgLTE1MjIsICAgIDIwMiwgICAgMzkwLAorICAgICAtMzExMiwgICAgMTQ0LCAgIDE2NzUsICAgIDY1MSwgICAgNDAyLCAgIDE5NTMsICAgIDEyMCwgICAgIDkzLAorICAgICAgLTI3NiwgIC0xOTMwLCAgIC0xOTcsICAgIC02MSwgICAgMTAwLCAgICAgODEsICAgLTI1MCwgICAtMTU1LAorICAgICAgIC0xOSwgICAgMzM2LCAgIC0xNzgsICAtMjM0MCwgICAgIDg4LCAgIC01NDMsICAgIDIyNiwgIC0yNTA3LAorICAgICAgIC02MCwgICAgLTYyLCAgICAyMTgsICAgICAtOSwgICAgMTU4LCAgLTM2MTcsICAgIC02NiwgICAgIDMyLAorICAgICAgIDMxNCwgICAtMTkyLCAgIC0xMjEsICAgIDM3MiwgICAgMzM0LCAgICA1MTYsICAgIDQxMiwgICAgMjQ3LAorICAgICAgLTYwOSwgIC0xMjM3LCAgICAzMTIsICAgLTEyMCwgICAgLTM5LCAgICAgNDcsICAgICA2MSwgICAgLTYzLAorICAgICAgIC05MCwgICA0NTAwLCAgIC0xOTEsICAgLTM1MywgICAgIDEwLCAgICAgNTQsICAgLTE2MywgICAtMzQ1LAorICAgICAgIDEyMSwgICAtMzE4LCAgIC0yMzUsICAgIDE5MCwgICAgLTk5LCAgICAxODEsICAtMzM2OSwgICAgICA0LAorICAgICAgLTE4OCwgICAgLTg3LCAgICAxMjgsICAgIDE2NywgICAtNTA3LCAgLTExMzIsICAgLTY2NiwgICAtMzU0LAorICAgICAgIDEyMSwgICAgIDQzLCAgIC01NDYsICAgIDYwMSwgICAtNDA5LCAgICAxODEsICAgIC00NywgICAtMzE1LAorICAgICAgIDEyNywgIC0yODQ1LCAgICA0ODcsICAgIDE4NiwgIC0yNzI0LCAgICAzNDMsICAgIDE3NywgICAtODM3LAorICAgICAgIDM4NywgICAgLTg0LCAgICAyNTksICAgIDEyMiwgICAtMTU5LCAgICAgODgsICAgIDExNywgICAgMTM3LAorICAgICAgICA3OSwgICAgMTI2LCAgIDE1ODQsICAgLTUyMSwgIC0yNDQ4LCAgIDI2NDgsICAgLTI0NiwgICAgLTc1LAorICAgICAgIDU2NywgICAgMTE0LCAgICAyNDQsICAgIDY1MywgICAtNTUxLCAgIC0xOTYsICAgLTYyMywgICAgMjA1LAorICAgICAgIDgxNiwgICAgIDQ4LCAgIC0zMjYsICAgICA2NiwgICAgLTk0LCAgICAtMzMsICAgIDEzMywgICAgNDEyLAorICAgICAgLTI0MSwgICAgNDkxLCAgICAtMzIsICAgLTcxMiwgICAtMjQ5LCAgLTM3NTYsICAgLTE4NSwgICAtMjI5LAorICAgICAgIDI0OCwgICAgMjY4LCAgICA1NTcsICAgICA3MywgICAgMTY0LCAgICAgMjQsICAgIC03MCwgICAgLTI3LAorICAgICAgICA1NCwgICAtMTU2LCAgICAtNTEsICAgIC00NywgICAgLTI2LCAgICAgNDMsICAgIDE4NywgICAgMTc5LAorICAgICAgIC0zOCwgICAtMTM3LCAgICAyMTgsICAgMTkxNiwgICA0NjE0LCAgICA0MzUsICAgIC0xNSwgICAgIDIxLAorICAgICAgIDE0NSwgICAxODY4LCAgICAyNDEsICAgIDI0MCwgICAgMjk5LCAgIC0yMDQsICAgICA3MywgICAgLTI0LAorICAgICAgLTExOCwgICAtMzcyLCAgICAtODksICAgICAyMywgICAtMjk4LCAgICA0NzksICAgMjgzNywgICAgOTU5LAorICAgICAgIC03NiwgICAgLTg1LCAgICAgLTIsICAgICAyOCwgICAgIDk0LCAgLTMyNDUsICAgICAyOCwgICAtMTMwLAorICAgICAgIDE1OSwgICAgMjk1LCAgICAyNjQsICAgLTQxOSwgICAgLTk4LCAgICAtMTYsICAgLTE1OSwgICAgMzQ5LAorICAgICAgIDIwMiwgICAtMTU4LCAgLTI2ODAsICAgLTIxMCwgICAtMzkwLCAgICAtMTgsICAgICAtOCwgICAgMzY0LAorICAgICAgMTM2NywgICAtMTEwLCAgICA5MzIsICAgLTIzMiwgICAxMzQ4LCAgICAtODAsICAgIDg2NSwgICAtMjkxLAorICAgICAgLTQwOCwgICAgNDA2LCAgIC0xMTgsICAgNjQ2MiwgICAgLTU1LCAgICAgMTAsICAgLTE1MiwgICAtMTYxLAorICAgICAgLTEzMiwgICAgMjMxLCAgICAyNTgsICAgIDEzNSwgICAgLTEzLCAgIC0xMDQsICAgIDI0NywgICAgMjA3LAorICAgICAgLTIzOCwgICAgMjEyLCAgICAtMTksICAgIC0zMSwgIC0zMzAzLCAgIC0xNjAsICAgIC0yNCwgICAzNDAyLAorICAgICAgICA1MCwgICAgMTE2LCAgIC0xOTEsICAgICA5NywgICAtMTM5LCAgIC0xMDAsICAgICA3MSwgICAgLTQ5LAorICAgICAgLTI5MywgICAgMTMzLCAgIC0xMjAsICAgIC0xMCwgICAgMTk3LCAgICAxOTYsICAgLTUxNiwgICAtNjg2LAorICAgICAgICA3OSwgICAgLTUyLCAgIDYwMDIsICAgIC00NywgICAgIDg4LCAgIC0yMDEsICAgIDE0NiwgICAgMTM2LAorICAgICAgICA1NCwgICAgMTYyLCAgIC0xODAsICAgIDI4NywgICAgIDY3LCAgICAgNzAsICAgIC01NSwgICAgMjEwLAorICAgICAtMTkzOCwgICAgNjM1LCAgIC0xNjIsICAgICA4MiwgICAtMTIwLCAgIC00NTYsICAgIC03NSwgIC0zNzUzLAorICAgICAgIC04MywgICAgMTc2LCAgICAxMzcsICAgICAxOCwgICAgIC02LCAgIC0yODEsICAgIDIzMiwgICAgMTM3LAorICAgICAgLTE2NywgICAgMzczLCAgICAgNzgsICAtMjYyMiwgICAgLTM4LCAgIC0yOTMsICAgICA4OSwgICAgIDY5LAorICAgICAtMzQ3NiwgICAgICA4LCAgICAxNTIsICAgIDEzNiwgICAgIDMyLCAgICAtMTUsICAgLTE0MCwgICAgIDExLAorICAgICAgICAgNiwgICAgIDEzLCAgICA0ODEsICAgLTE3NSwgICAtMjI4LCAgIC0yNTQsICAgIDE1OCwgIC0zNDIzLAorICAgICAgIDIwNiwgICAgIDIyLCAgICA5MDAsICAgMjAyNSwgICAgMjY2LCAgIC00MDIsICAgIDEzMiwgICAtMzU2LAorICAgICAgIDU1OCwgICAtNTkyLCAgIC0yNjIsICAgLTQxOSwgICAxMDAyLCAgICAgNzMsICAgLTI0NiwgICAgLTI0LAorICAgICAtMzE0NSwgICAzMjIwLCAgICAtMzMsICAgIDI4MywgICAgMzk4LCAgICAtMzEsICAgIC0yNSwgICAgIC03LAorICAgICAgIDEwMywgICAgLTkzLCAgIC0xNDMsICAgICAgMSwgICAgIDMyLCAgIC00OTcsICAgIDIwNiwgICAgLTM1LAorICAgICAgMTQyNCwgICAgMTE0LCAgICAxNDAsICAgMjM5MywgICAzMjQ1LCAgIC0yMTgsICAgLTE2MywgICAgMTEzLAorICAgICAgIDE5MSwgICAtMTY0LCAgIC0yMTUsICAgIDUwNCwgICAtMjU2LCAgICAxNDAsICAgLTM2NCwgICAtMjI2LAorICAgICAgLTM0MCwgICAgIDkxLCAgIC00NjQsICAgICAzMiwgICAgMTg4LCAgICAgIDQsICAgICAxNSwgIC02MDY4LAorICAgICAgICA2OSwgICAgMTA5LCAgICAyMTksICAgICA3NSwgICAgMTk2LCAgICAtMjQsICAgIC04NCwgICAtMjE4LAorICAgICAgICAyNywgICAgIDU3LCAgICAtOTcsICAgICAgOCwgICAtMzM4LCAgICAgLTQsICAgIDM1OCwgICAgIDIzLAorICAgICAgIC01MiwgICAgLTY4LCAgICA1NTIsICAgNDAyMywgICAtMjU1LCAgICA2ODQsICAgIDE0NCwgICAgMTg4LAorICAgICAgIDEwMCwgICAtMjkzLCAgICA0NjIsICAgIDU1MywgICAgICA5LCAgICA2NjUsICAgICAxMiwgICAtNjQwLAorICAgICAtNTA5OSwgICAtMTU4LCAgIC0yNDUsICAgIC03NCwgICAtMTY4LCAgICAyNjMsICAgLTM1NSwgICAtMzcwLAorICAgICAgLTY1MywgICAtMTYzLCAgIC00NzMsICAgLTM5NCwgICAtMjMzLCAgICA3NTAsICAgICAxNywgICAgLTMxLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IxMTEwc2wwW10gPSB7CisgICAgIC0zNzM2LCAgLTM3MzcsICAgIC0xOCwgICAtMjg1LCAgICAzODMsICAgLTE0NCwgICAtMTU1LCAgIC0yMDQsCisgICAgICAgMjk2LCAgIC0zOTksICAgLTY2MywgICAgMzU2LCAgIC0zNjQsICAgIDMyOSwgICAtMzMwLCAgICAgLTUsCisgICAgICAgLTUyLCAgICAtODgsICAgIC00MSwgICAgMjI4LCAgICAtMjEsICAgIC00NSwgICAtMTM2LCAgIC0yODAsCisgICAgICAtMTA5LCAgICAtODYsICAgICA1NywgICAgIDkxLCAgIC0yMTIsICAgIDE1OCwgICAtMTA2LCAgICAtOTAsCisgICAgIC04MTkyLCAgICAgNzAsICAgLTI1NSwgICAgIDc4LCAgICAgLTgsICAgIC04OSwgICAtMTEwLCAgICAtNTgsCisgICAgICAgMTA0LCAgICAtNTEsICAtMjU5OCwgICAgNDExLCAgICAtOTQsICAgLTU2NywgICAgMjA5LCAgIC00NjQsCisgICAgICAgMTM5LCAgIC0yMzQsICAgLTMzNiwgICAgNzU0LCAgICA4NjMsICAgIDM5OSwgICAgMzQ1LCAgICAxMTcsCisgICAgIC0zNDM1LCAgIC0yMTksICAgIDM2OSwgICAgIDU5LCAgIC0zMjUsICAgMjQzOSwgICAtMTQ4LCAgICAgIDYsCisgICAgICAgLTQ4LCAgICAgODQsICAgIC0xNCwgICAgIDcxLCAgICAgOTQsICAgICAxMCwgICAgICA2LCAgICAgNzMsCisgICAgICAgMTA2LCAgIC00OTAsICAgLTIwMCwgICAgMTg2LCAgICAzNDUsICAgICAtOCwgICAgIDk5LCAgLTM2ODcsCisgICAgIC0xNTcxLCAgIDE4MzYsICAtMTU5MywgICAxMTExLCAgLTM3MDAsICAgIDQ3MCwgICAgIC02LCAgICA0MDEsCisgICAgICAtMTgyLCAgIC0xMTksICAgIDQzOCwgICAtMjYzLCAgICAyMjgsICAgIDc4NSwgICAtMzYxLCAgICAtNTYsCisgICAgICAtNDkyLCAgICA0NjUsICAgIDMzMywgICAgIDYxLCAgICAgNTMsICAgIDIzNCwgICAgLTIzLCAgICAtODcsCisgICAgICAgIDM5LCAgICAxMDUsICAgNzI4MiwgICAgIDU5LCAgICAtNDcsICAgIC01NywgICAgLTc3LCAgICAtNDUsCisgICAgICAtMTcyLCAgICAgMTIsICAgIDE3OSwgICAtMTM0LCAgICAgMzcsICAgLTE1NywgICAgLTE5LCAgIC0yMDYsCisgICAgICAgICA5LCAgIDExODYsICAgLTI2NCwgICAgNjAwLCAgICAzNTAsICAgIDM3NCwgICAgMTE1LCAgICAtNTUsCisgICAgICAgNzI3LCAgIC0xNjQsICAtMzkwMywgICAtNzM1LCAgICA1ODYsICAgIC0yNCwgICAgMTQ1LCAgIC03ODYsCisgICAgICAtMTE4LCAgICA5NDMsICAgIDUxNCwgICAgMzk2LCAgIDM0MzUsICAgIC0zNSwgICAgIDgzLCAgICAyOTQsCisgICAgICAgMTA3LCAgICAgMTYsICAtMzYzNiwgICAgLTkzLCAgICAzNjAsICAgLTMwNywgICAtMTA1LCAgIC0xNzIsCisgICAgICAgMjA0LCAgICAzMjAsICAgLTE0OCwgICAgNDEwLCAgICAxNzUsICAgIDMzNSwgICAgICAwLCAgIC0xNzgsCisgICAgICAgIDEyLCAgICAgOTQsICAgIC00NywgICAgLTkxLCAgICAtNDksICAgLTE1OSwgICAtMTU1LCAgICAtNjUsCisgICAgICAgLTE3LCAgIC0xNTksICAgLTMxNiwgICAgIDY0LCAgICAxNTUsICAgLTI2MCwgICAgIDgxLCAgLTQ3NjYsCisgICAgICAtMTUwLCAgIC0xMTYsICAgLTMzMiwgICAgMTI4LCAgICA2NzUsICAgLTEwNSwgICAtNDc5LCAgICA1NjMsCisgICAgICAtMTAxLCAgICAxMDEsICAgLTM3OSwgICAgIDMzLCAgICAgMzcsICAgICAgMSwgICAgMTA2LCAgICAxNTEsCisgICAgICAgIDY5LCAgICAxNDAsICAgICAtNiwgICAgLTc0LCAgICAxNTcsICAgLTEyNSwgICAtMTIwLCAgICAtMzMsCisgICAgICAtMTc4LCAgIC0yODYsICAgICA2MCwgICAtMTU4LCAgICAgNDMsICAtNzI5MSwgICAtMjk1LCAgICAtNjgsCisgICAgICAgLTM0LCAgICAtNjgsICAgIC01OCwgICAgICA4LCAgICAxNzYsICAgIC00MiwgICAtMjEyLCAgICAxNzYsCisgICAgICAtNTMzLCAgICAtNjIsICAgIC0yNywgICAgMTY3LCAgICAyOTEsICAgICA1OSwgICAgMzExLCAgLTMwNTAsCisgICAgICAgNTUyLCAgIC00OTMsICAgLTIwNywgICAyNTc2LCAgIC05OTEsICAgLTM3NSwgICAtMTAyLCAgIC05ODAsCisgICAgICAxMTMwLCAgIC01NjUsICAgLTE5OSwgICAgNTU5LCAgLTEzOTAsICAgLTQyOCwgICAtNjE4LCAgICAgNzAsCisgICAgICAtNDM3LCAgIC0yNDUsICAtMTEzMiwgIC0xMzAyLCAgIC00NTMsICAgICA4MywgICAgMjIyLCAgLTE1NTUsCisgICAgICAtMTc4LCAgLTEzOTYsICAtMTE3NiwgICAtMjI4LCAgICA3MzAsICAtMzEyMSwgIC0xMDg1LCAgICAgODQsCisgICAgICAtMzI2LCAgICAgNzEsICAgLTE4NSwgICAtMzE1LCAgICA4ODksICAgIDgwMywgIC0yOTEwLCAgLTM2MDksCisgICAgICAtNjM5LCAgIC0xOTksICAgIDE4NywgICAgMTM3LCAgIC02MjIsICAgIDQ3MywgICAgMTIxLCAgICAxODEsCisgICAgICAgIDg1LCAgICAzOTUsICAgIDUyMywgICAgNTg5LCAgICAgNzEsICAgIDcwMywgICAgMTIzLCAgICAzNjEsCisgICAgICAgIDQ3LCAgIC02NzUsICAgIDI5OSwgICAtNDQ2LCAgICAzMDcsICAgIDU5MSwgICAzMzQxLCAgICAgNjQsCisgICAgICAgNTI2LCAgLTE1NDEsICAgIC01MCwgIC0xMzY5LCAgICA3MDEsICAgLTE0NCwgICAxNzIwLCAgIC03MTMsCisgICAgICAgNTYyLCAgICAyOTcsICAgIDE0NiwgICAgLTM0LCAgIDEzMTUsICAgIDk1NiwgICAgNzYxLCAgIC00MTUsCisgICAgIC0xMzExLCAgICA2MzcsICAtMTI2MywgIC0xMDk2LCAgIC0zODUsICAgMzIyOCwgICAtMzk1LCAgICAzMTcsCisgICAgICAtMzU0LCAgIC01MDMsICAgIDI1NSwgICAtNTI2LCAgICAyNDUsICAgIDU5OCwgICAgODUzLCAgIC0yNjksCisgICAgICAtMTEwLCAgIDEzNTQsICAgIDMzMywgICAgMTEwLCAgICA4NTUsICAtMzM0NiwgICAgNjM1LCAgICA2MzYsCisgICAgICAtOTE3LCAgIC01NzcsICAgIDI2MCwgICAgMTQ3LCAgIDEwNDEsICAgMTI3MywgICAgMzg1LCAgIC04NjIsCisgICAgICAxNzUxLCAgLTEwOTksICAgICA4MCwgICAtMTQ4LCAgICAxMjAsICAgLTExOCwgICA1NTY1LCAgIC00ODQsCisgICAgICAgLTc0LCAgICAzMjYsICAgIDI5MSwgICAgMjM0LCAgICAtNDEsICAgIDIxMiwgICAgMTkyLCAgICAyMDcsCisgICAgICAtMTA4LCAgICAxOTgsICAgIDExOCwgICAtMzg5LCAgICAxNzgsICAgLTE1MSwgICAtMjUyLCAgICAtNjksCisgICAgICAtMjQzLCAgIC04MDAsICAgMjY0MCwgICAtNTMxLCAgICAgODQsICAgLTMwMSwgICAgMTU3LCAgLTM0MjgsCisgICAgICAgICAzLCAgIC00MTgsICAgLTE3MywgICAtMTY2LCAgIC03MjIsICAgIDIwNywgICAgNDQ4LCAgIC0zODcsCisgICAgICAtNTA0LCAgICAyMDIsICAgIDQ1MywgICAgMjEwLCAgIC0yMDMsICAgIDMwNCwgICAgMTkwLCAgIC0yNjQsCisgICAgICAgMTAxLCAgICAtMjMsICAgICAzNiwgICAgIDc0LCAgIC0xNDYsICAgICAyNiwgICAgIDI5LCAgICAtMzMsCisgICAgICAgIDU5LCAgIC0xMjcsICAgICAyMiwgICAgMjEzLCAgIC0xNjcsICAgIDEwMywgICA4MTkyLCAgICAxODMsCisgICAgICAyNzA5LCAgIC0xMjUsICAgIDMyNCwgICAtOTY0LCAgIC0yNTksICAgLTQwMCwgICAgLTQxLCAgIC00MzAsCisgICAgICAgMzY3LCAgICAxMjcsICAgIDI2NiwgICAgMzY5LCAgIDEwODEsICAgLTE5MCwgICAtMjIwLCAgLTEwODMsCisgICAgICAgNjQxLCAgLTI3MzMsICAgIDc1MCwgICAgNTI1LCAgIC02MjMsICAgIC0xOCwgICAzMTU5LCAgICA2ODYsCisgICAgICAtMjc4LCAgLTIwODMsICAgMTY4MCwgICAgNTg3LCAgICAxMjMsICAgICAtNiwgICAtMjY2LCAgICAzNzYsCisgICAgICAgNTIyLCAgIC00MzMsICAgLTQ5OSwgICAgMTY5LCAgICAxMDYsICAgMjA0MSwgICAgMTc0LCAgICA1NzEsCisgICAgICAtMTA4LCAgICAxMjksICAgLTExNiwgICAgLTg3LCAgIC0yNTIsICAgICA4OSwgICAgLTE0LCAgICAgMTQsCisgICAgICAgMTIwLCAgLTc4NzQsICAgLTIwNCwgICAgIDE1LCAgICAgMTksICAgLTExMCwgICAgLTgyLCAgICAtNTQsCisgICAgICAgIDY2LCAgICAgMzEsICAgIDIxMCwgICAgIDU1LCAgICAzMzksICAgICA2MSwgICAtMjE5LCAgLTMyMDUsCisgICAgICAxMjkyLCAgICAgODAsICAgIDM0NCwgICAtNzMzLCAgIDMxNzIsICAgIC0yMSwgICAgLTU1LCAgICA3MTIsCisgICAgICAtMTkyLCAgICAgMzgsICAgIDQwOCwgICAgNDg5LCAgICAzODgsICAgLTM0MywgICAtNzYzLCAgICA0MzgsCisgICAgIC0xODEyLCAgICAgLTYsICAgLTEyOSwgIC0xMzkyLCAgIC0zODIsICAgIC0yOCwgICAgMTA1LCAgIC0yODQsCisgICAgICAtMTY4LCAgIC00NjIsICAgLTI4NCwgICAgIDIyLCAgICAxMTMsICAgMTIwMywgICAzMjUzLCAgIC01ODksCisgICAgICAtNjE5LCAgICAzNDgsICAgIDExMywgICAgODQ3LCAgICAgIDMsICAgLTU1NywgICAgNDYwLCAgIC02MzYsCisgICAgICAtNjAxLCAgIC03NDIsICAgICA0NiwgICAtMTExLCAgICAgNTEsICAgIC02NiwgIC0yODY3LCAgICA1NTEsCisgICAgICAgNDU1LCAgICA4OTgsICAgICAxNywgICAyMjA1LCAgIDEwMDQsICAgIC00NiwgIC0xNDc1LCAgIC0zNjcsCisgICAgICAyODQ5LCAgICA3NjYsICAgIC0zMiwgICAtMTE5LCAgICA2MjQsICAgLTcyMiwgICAzMzcxLCAgICAxNzIsCisgICAgICAtMzMwLCAgICAgOTMsICAgLTIyMSwgICAgNDU3LCAgIC00NTMsICAgICA4NCwgICAtMjgxLCAgIC0zNjAsCisgICAgICAgMTA4LCAgICA0ODcsICAgLTMwMSwgICAgMTY2LCAgLTI2MTEsICAgIDU3NywgICAgMTkyLCAgICAgMzQsCisgICAgICAxMTA1LCAgICA3MDUsICAgICAzNCwgICAgIDI5LCAgLTMwNDEsICAgLTg5OCwgICAgMTcyLCAgICA1NzgsCisgICAgICAgMzA3LCAgICA0ODMsICAgLTQzOSwgICAtMzI3LCAgICAzNjAsICAgLTkzNSwgICAgLTc2LCAgICAzODcsCisgICAgIC0yNDg1LCAgICA4MDAsICAgIDMzMywgICAgNjAxLCAgIC03MTIsICAgLTk3MywgICAgLTY1LCAgIC00NDIsCisgICAgICAgMjIwLCAgIDM1NzcsICAgLTQyOCwgICAtMjEwLCAgICA1NjUsICAgIDc1NywgICAtMzgyLCAgICAyODksCisgICAgICAgNzI2LCAgICAtMTksICAgLTE4MiwgICAgMzg0LCAgICAtMzIsICAgICAzOCwgICAtODEwLCAgIC0xODEsCisgICAgIC0yOTc4LCAgICAyNTksICAgLTIxMywgICAtNDczLCAgIC0xODcsICAgLTgyMywgICAtMjc5LCAgIDE1MTgsCisgICAgICAgIDI2LCAgIC0zODUsICAgMTE0MywgICAtNDA5LCAgIDEzMTAsICAgIDY3NiwgIC0yNDcyLCAgICAgNjQsCisgICAgICAtMzkxLCAgIC0xMDIsICAgIDQ1NSwgIC01NzUxLCAgICAyNzgsICAgICAzMCwgICAgIDY0LCAgIC0xNzcsCisgICAgICAtMTEzLCAgIC0xNzAsICAgICA5NCwgICAtMjM0LCAgIC0xNjcsICAgIDEwMSwgICAgIC0yLCAgIC0xNDksCisgICAgICAtMTMxLCAgICAzNTEsICAgLTI1NCwgICAtMTM4LCAgICAxNDksICAgIC00MiwgICAgNjMxLCAgICAtMjEsCisgICAgICAgMjM3LCAgIDI4OTMsICAgLTI5MSwgICAyOTE3LCAgLTEyNDAsICAgIDIxMSwgICAtMjE1LCAgICAgMjIsCisgICAgICAtODI3LCAgIC0xNjAsICAgIDE0MCwgICAtMjEzLCAgICAxNTYsICAgLTI1MCwgIC0xMjMzLCAgICA2OTEsCisgICAgICAgNDk4LCAgICAtMzAsICAgIDM1MCwgICAgLTI4LCAgICAtMTIsICAgIDIxNywgICAgIDM0LCAgIC0zNDgsCisgICAgICAgLTcwLCAgIC0xNDAsICAgIDEwMywgICAgLTYwLCAgICAzNTMsICAgLTIwMCwgICAtMzE0LCAgICAtNzQsCisgICAgICAgMTEyLCAgIDQ0MzUsICAgIC04MCwgICAtMjg3LCAgICA0MTMsICAgIC05OSwgICAxNDA3LCAgIDE1MTksCisgICAgIC0yMjMwLCAgICAxMTQsICAgMzE3OSwgICAtNTIzLCAgICAgMzksICAgIDM0MCwgICAtMzc5LCAgICAzNzMsCisgICAgIC0xNTUyLCAgIC0xMzgsICAgLTQ0NiwgICAtMTA2LCAgIC03NjIsICAtMTAxNywgICAtMjk3LCAgIC0xODMsCisgICAgICAgNDk4LCAgIC00ODEsICAgIDM3NCwgICAgMjcxLCAgLTU2MDksICAgIDI5NywgICAgIDk4LCAgIC0zNzgsCisgICAgICAgMTg3LCAgICAtNzgsICAgLTEyNSwgICAgMzMzLCAgICAxMTQsICAgIC04MSwgICAgIDYyLCAgIC0xNDUsCisgICAgICAgIDE0LCAgICAzNjIsICAgIDUxOCwgICAgMTM0LCAgICAxOTUsICAgIDEzMCwgICAgLTM0LCAgICAtNzIsCisgICAgIC0zMDg4LCAgLTI5NjUsICAgLTExNCwgICAgNTg1LCAgICAtNzgsICAgICAgNiwgICAgNTUyLCAgIC02MzMsCisgICAgICAgLTk4LCAgIC0yMjQsICAgIDk4MCwgICAgMzM4LCAgICAtODMsICAtMTA2NCwgICAgIDQyLCAgICAxMDYsCisgICAgICAtMTE5LCAgICA2NDQsICAgLTI5MywgICAgNDk2LCAgICAgNjcsICAgIDEyOCwgICAtMTI5LCAgICA2MjAsCisgICAgICAgIDIwLCAgICA1MjYsICAgLTE3NywgICAgIDY4LCAgICAzNTEsICAtMzcwMywgICAxNDY1LCAgICA5MDUsCisgICAgICAtMjQ1LCAgICAgODYsICAgIDUxMSwgICAgIDM5LCAgIC01MTIsICAgLTE1MCwgICAgMjM5LCAgICAgODYsCisgICAgICAgIDYwLCAgICAgMzksICAgIC03OSwgICAgIC05LCAgICAtNjUsICAgICA3NywgIC03OTkzLCAgICAgNTcsCisgICAgICAgLTE5LCAgICAgNTYsICAgIC0zOCwgICAgMTYxLCAgIC0yMjEsICAgLTEyOSwgICAgICA4LCAgICAgOTMsCisgICAgICAgIDUyLCAgLTU2MjIsICAgLTExNCwgICAgMTMzLCAgICAgMjYsICAgICA2NCwgICAtMTk0LCAgIC0zMTYsCisgICAgICAtMTQzLCAgICAyMjUsICAgIC02NiwgICAgLTgxLCAgICAtNzQsICAgIDI0MCwgICAgMTMwLCAgICAxMzcsCisgICAgICAtNTQ5LCAgICAgMTEsICAgIDM1MiwgICAgLTUzLCAgLTQwMjksICAgIDUxMywgICAzMTY0LCAgIC0yMDUsCisgICAgICAgMTI3LCAgICAgODAsICAgLTE5MywgICAtMTk3LCAgICAtMzYsICAgLTg4NSwgICAgMjIzLCAgIC04NTgsCisgICAgICAgICA1LCAgIC00NTgsICAgIDI5MCwgICAgNDU5LCAgICAyNDcsICAgLTI4NCwgICAtMTc2LCAgIC03NDgsCisgICAgICAgMTczLCAgICAxOTEsICAgIDExNCwgICAgNDA2LCAgICAxMjYsICAgICAgMywgICAgIDkxLCAgICAgODQsCisgICAgICA4MDI3LCAgICAzNzksICAgIC01NiwgICAgIDQ3LCAgICAgMzUsICAgIDI0NiwgICAtMTQzLCAgICAgNjUsCisgICAgICAgLTM2LCAgICAgIDgsICAgICA1OSwgICAgIDY3LCAgICAtNjksICAgLTQyMSwgIC0zNDkyLCAgICAzMTIsCisgICAgICAtMjUyLCAgICAyNjEsICAgMzM2NywgICAgMzE5LCAgICAtNjcsICAgICA3NywgICAtMzQ2LCAgICAzODYsCisgICAgICAgIDM0LCAgICAyMzcsICAgICAxOCwgICAgMTExLCAgICAzNDgsICAgLTU0NywgICAgMTg2LCAgICAtOTMsCisgICAgIC0zNTU4LCAgIC0xNzgsICAtMzgwMSwgICAtMTMzLCAgICAtMjcsICAgLTU2MSwgICAtMzA4LCAgICAxMTIsCisgICAgICAtMjI0LCAgICAyNzIsICAgLTE5NSwgICAtMjcwLCAgIC0xNzksICAgLTE2NSwgICAgMTk5LCAgIC01MjQsCisgICAgICAgNjgxLCAgIC0xMTcsICAgLTQyOSwgICAgIDM3LCAgLTU4OTEsICAgICA5NCwgICAgLTU1LCAgIC00MzMsCisgICAgICAtMzU0LCAgICAxMjIsICAgIC02MCwgICAgIDY3LCAgIC0yMDAsICAgIC04MCwgICAgMjY3LCAgIC0xMzYsCisgICAgICAgLTQyLCAgICAxMzAsICAgLTMyNCwgICAgLTI1LCAgICAxNTYsICAgIDE2NywgICAgLTQ3LCAgICAxNzgsCisgICAgICAgICA4LCAgICAyODksICAgIDE1NywgICAgIDg4LCAgICAtMjgsICAgIC0zOSwgICAtMjYyLCAgICAtMTEsCisgICAgICAgICA5LCAgIC0xMTMsICAgICA3NiwgICA4MTkyLCAgICAgODksICAgIDExNSwgICAtMjk4LCAgICAxMzcsCisgICAgICAgIDM0LCAgICAgIDAsICAgIDI2MSwgICAgLTMwLCAgICAgNDksICAgIDI3NCwgICAgMTMwLCAgICA4MjQsCisgICAgICAtOTQ0LCAgICAtNTYsICAgMTA3NCwgICAtMzE0LCAgICAtNzYsICAgIDUyNywgICAgIDc1LCAgLTMzMjEsCisgICAgICAgNzMzLCAgIC03OTgsICAgLTM1MiwgIC0xMDM4LCAgIDEwNDksICAgICA3MiwgICAtMjMzLCAgICAzMTIsCisgICAgICAzMzYzLCAgICAgNjksICAgIDEwNCwgICAtMTQ5LCAgICAgMjIsICAgIDI4MywgICAgLTIwLCAgIC0xMDEsCisgICAgIC0zMzUwLCAgICAxNjQsICAgLTMyOCwgICAtMzYyLCAgIC05OTMsICAgIDQzMCwgICAgIDc4LCAgICAxMjUsCisgICAgICAgMjY5LCAgICAtMjksICAgIDM2MiwgICAgLTczLCAgICAtMzAsICAtMTE4OSwgICAxMzk2LCAgICAgNTksCisgICAgIC0xMjg1LCAgIC0yMTYsICAgLTEyMSwgICAzODkzLCAgICAgODQsICAgLTQ2NCwgICAgLTM4LCAgIC0xMTMsCisgICAgICAtMzY5LCAgIC0xODEsICAgLTkzMCwgIC0xMDEyLCAgICAzOTQsICAgIDEyMCwgICAgMjc0LCAgIC01NTIsCisgICAgICAtODAwLCAgICAxMDUsICAgLTE0MSwgICAgLTEyLCAgICAyNDEsICAgLTY2NywgICAgNTQzLCAgIC00MTYsCisgICAgICAgIDI4LCAgIC0xODIsICAgICA1MSwgICAgOTA1LCAgLTM5NjQsICAtMTIxMywgICAgIDEyLCAgIC0yNzEsCisgICAgICAgMzc4LCAgIC0yMzQsICAgIDgzOCwgICAtMTEzLCAgICAgNTYsICAgIDU2NywgICAgIDM1LCAgICAgNDgsCisgICAgICAgNDkwLCAgIC0xODAsICAgMTA5NywgICAgMTcwLCAgIDI1OTYsICAgIC0yOCwgICAzMDk4LCAgIC0yMjAsCisgICAgICAgNDI0LCAgICA4ODUsICAgIC00MiwgICAgNzgzLCAgICAtMzAsICAgIDkwNywgICAgIDYzLCAgICAgNDYsCisgICAgICAtMTMxLCAgICAgMjgsICAgIC01NSwgICAgIDU0LCAgICAtNDYsICAgIC0yNSwgICAgIDMwLCAgICAgNTgsCisgICAgICAgLTE1LCAgIC0yMDAsICAgICAtNiwgICAgIDExLCAgICAtNzAsICAgICA2NiwgIC04MDg5LCAgICAgODYsCisgICAgICAtMTM2LCAgICAgOTYsICAgIC01NiwgICAtMTAxLCAgICAzMDAsICAgLTY2MSwgICAgLTQxLCAgIC0yMDEsCisgICAgICAgNzYwLCAgIC0yNTIsICAgIDk1NSwgICAgMTg5LCAgIDE0NTksICAgMzU2MiwgICAtNDU3LCAgICAgMzUsCisgICAgICAgLTU0LCAgIC0xNjQsICAgLTMyOSwgIC0xMjQ1LCAgIC04MzAsICAgLTM2NSwgICAtMzk5LCAgICAtMjMsCisgICAgICAgNjE2LCAgIC0yMzgsICAtMTMwMSwgICAtMTk4LCAgICAzMzUsICAtMzQwMCwgICAgMTQ5LCAgICAxNzUsCisgICAgICAgLTk3LCAgIC0yNzksICAgLTU5NCwgICAgLTkyLCAgIC05MTUsICAgLTgzMCwgICAgNDY4LCAgICA2MjgsCisgICAgICAgNzI4LCAgIDEwMjQsICAgLTU0OSwgICAxMDczLCAgICAyMjIsICAgLTE0MiwgICAgMjk2LCAgICAtNzUsCisgICAgICAtMTY4LCAgICAgLTUsICAgIC02NywgIC03MzExLCAgICAtNTAsICAgLTI1NiwgICAtMzIxLCAgICAxMjEsCisgICAgICAgMzU4LCAgIC0yNzIsICAgICAzMCwgICAgMjU4LCAgICAxMDUsICAgLTE2MSwgICAtMjkxLCAgICA0NjIsCisgICAgICAgIC03LCAgIC0yMTEsICAgLTIyNywgICAtMTA0LCAgIC0xNTEsICAgLTE1MiwgICAgLTcyLCAgICAtOTgsCisgICAgICAgLTU5LCAgICAtMjMsICAgIC05OCwgICAtMjAzLCAgICAxMDMsICAgICA4OSwgICAgMjM5LCAgIC00ODQsCisgICAgICA3NzQ5LCAgICAxMTAsICAgICAzNSwgICAgMzQ1LCAgICAyODIsICAgLTU3OCwgICAgMTQwLCAgICAtNTEsCisgICAgICAgLTYyLCAgIC0yMzgsICAgIDEwMiwgICAgNDU0LCAgICAgNjQsICAgLTEwNywgICAtMjIzLCAgIC0xNzQsCisgICAgICAgMjg1LCAgICAxMTAsICAgLTE5MCwgICAgLTE2LCAgIDE2MjQsICAgIDE0MiwgICAzODEzLCAgIC04NDksCisgICAgICAgIDQzLCAgICAyMzQsICAgICA4NCwgICAgICAwLCAgIC0xMzIsICAgIDEzMSwgICAtMTM1LCAgICAtNzAsCisgICAgICAgIC0xLCAgICAxMjUsICAgIC04MywgICAgMTcxLCAgICAxMDksICAgODA0NCwgICAgIDk3LCAgICAtMzgsCisgICAgICAgMTQzLCAgICAgNjQsICAgICAxMywgICAgICA0LCAgIC0yMjUsICAgIDE4MSwgICAgNzEyLCAgICA2MjYsCisgICAgICAgIDIwLCAgICAxNjcsICAgLTQ2NywgICAgMTg2LCAgIDM4MDEsICAtMjE3OSwgICAtNjQ3LCAgIC0xMTksCisgICAgICAtMTEyLCAgIC0xODMsICAgLTIyMywgICAgMjk1LCAgIC00MzgsICAgLTQwNywgICAgLTI5LCAgICAgMzYsCisgICAgICAgLTM0LCAgIDI1MzYsICAgIC00NywgICAtNDAyLCAgICAtMzMsICAgIC02MiwgICAtMTM2LCAgIDI0NDQsCisgICAgICAtMTUyLCAgIC03MTcsICAgLTg2OCwgICAgIDg2LCAgLTIzMjMsICAgIDkzMSwgICAgNjU5LCAgLTEyODEsCisgICAgICAgLTk4LCAgICA2MzgsICAgLTE2MiwgICAgMTk1LCAgICAgLTUsICAgIC00MCwgICAgLTg4LCAgIDMwMTksCisgICAgICAzNDY2LCAgIC0zMjMsICAgIDMxNiwgICAtNzg0LCAgIC03MTUsICAgICAgNSwgICAgMTg4LCAgICAgNDIsCisgICAgICAgMTU1LCAgIC02MDgsICAgIDUwMCwgICAgMTg1LCAgICA0NzUsICAgIDEwMCwgICAgLTUxLCAgICA4NzksCisgICAgICAtODkxLCAgIC0xNTgsICAgICAxOCwgICAtNDUzLCAgICAzODAsICAgLTIwNywgICAtMTQzLCAgICA0MDEsCisgICAgICAtMTUzLCAgICA5MjYsICAgLTE4NCwgICAyNzc1LCAgIDMxNzYsICAgLTc5NywgICAtMTk4LCAgIC04ODgsCisgICAgICAgNDA1LCAgICA0NjAsICAgIDMwOSwgICAgMzA0LCAgIC0xMTQsICAgMjM4NiwgICAyMzE5LCAgICA2NTgsCisgICAgIC0yMjAwLCAgICAyMTYsICAgIDQzNSwgIC0xMjEwLCAgIC02NTUsICAgIDE1NCwgICAgIDgxLCAgICA1MzgsCisgICAgICAgOTA4LCAgICAyMjAsICAgLTExOCwgICAgNDgyLCAgIC04NjQsICAgLTUyNiwgICAtMjQxLCAgICA4NTcsCisgICAgICAtNDczLCAgICA3NzQsICAgLTI4OCwgICAtODg2LCAgICAgNDYsICAgIDI1MCwgICAgLTk2LCAgICAzMDEsCisgICAgICAgMTIwLCAgIC00ODgsICAgLTEyOCwgICAtMjMzLCAgICA0MjIsICAgICAzOCwgIC0zNDE2LCAgIC05NzQsCisgICAgICAtMjQzLCAgIC0yMjYsICAgIDM4MSwgICAyMzk0LCAgICA2NTIsICAgMzEyNCwgICAtMjA1LCAgLTEzMDMsCisgICAgICAxNDg0LCAgIC0xNTksICAgLTE1MiwgIC0xMDM3LCAgIC0xMDUsICAgLTEyMSwgICAtNDY2LCAgICAtNzYsCisgICAgICAgNjA1LCAgICAxODEsICAgIC01NSwgICAtMzI2LCAgIC01MjcsICAgLTEyNiwgICAxNjkxLCAgIDEzMTYsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjExMTBzbDFbXSA9IHsKKyAgICAgIC03NDMsICAgLTMwMCwgICAtMzQ3LCAgIC00NDEsICAgICA4NSwgICA1MjgyLCAgIC0yNTAsICAgICAzMiwKKyAgICAgICAgMjgsICAgLTMwNiwgICAtNDM0LCAgICAgNzgsICAgLTE3OCwgICAtMTEyLCAgICAtMjgsICAgLTE2MiwKKyAgICAgIC0xODgsICAgIC00MywgICAgIDE3LCAgICAgOTQsICAgLTI0MiwgICAtMjU4LCAgLTI2OTEsICAgLTQ3MSwKKyAgICAgIC01NTYsICAgLTgxNSwgICAgMTIwLCAgICAtNTcsICAgIC0zNiwgICAtMzI1LCAgIDMyODIsICAgLTc2NSwKKyAgICAgICAzNTUsICAgICAgMiwgICAtMTYyLCAgIC00NTQsICAgIC03MiwgICAgMTkyLCAgICAgODYsICAgIDIxOSwKKyAgICAgIC0xMjMsICAgIDIzNywgICAgMTM1LCAgICAtNDIsICAgIDQ5MiwgICAtNDcxLCAgIC0xMTQsICAgNTE0NiwKKyAgICAgIC0xNjQsICAgICAyOCwgICAgIDc3LCAgICAgNzAsICAgIDI3NiwgICAtMTQ4LCAgICAzMzMsICAgICA2NCwKKyAgICAgICAtODksICAgIC00NiwgICAtMTM1LCAgICA0NzQsICAgLTIxOCwgICAtMTE5LCAgICAzNTEsICAgNzYxOSwKKyAgICAgICAgOTMsICAgIC04MCwgICAgLTg0LCAgICAtNTEsICAgLTExMCwgICAtMjIzLCAgICAtMTMsICAgLTExNiwKKyAgICAgIC0xNjAsICAgLTEwMiwgICAgLTY0LCAgIC0xNDAsICAgLTM3NiwgICAgMTU2LCAgIC0xNDMsICAgLTQyMSwKKyAgICAgICAxMDUsICAgIDEwMiwgICAgNTE5LCAgIDEyNTYsICAgIDc4NiwgICAtMjg0LCAgLTMwMjksICAtMzAyMSwKKyAgICAgIC0zNjUsICAgLTUxNSwgIC0xMzU4LCAgIC0yNzMsICAgIDM5NCwgICAgNDg5LCAgIC0yNDIsICAgICAzMSwKKyAgICAgICAyMzksICAtMTMyOCwgICAgMTY5LCAgIC00ODgsICAtMzA2OSwgICAtMzk4LCAgICAzMDMsICAgLTI3NCwKKyAgICAgICA0OTgsICAtMjc1OCwgICAtNzQ4LCAgIC0yMDgsICAgLTMyNCwgICAtMjg1LCAgICAgNzgsICAgLTM4NiwKKyAgICAgLTEwNjMsICAgIDI5OCwgICAgICA1LCAgICA2OTMsICAgIDE2MCwgICAtNjI5LCAgIDE2NTYsICAgIDE4NiwKKyAgICAgICA0NTcsICAgIDc0MiwgICAgNDIyLCAgLTM3MjMsICAgMTk5NywgICAxMDI1LCAgICAtMjQsICAgIDI5MSwKKyAgICAgIC01ODgsICAgICAxNiwgICAtMzI3LCAgICA0NTksICAgLTUyMSwgICAgNDIxLCAgIDEyNzksICAgLTQwOCwKKyAgICAgICAgLTIsICAtMTMyMCwgICAgMTAxLCAgIC0zNzIsICAgIC02NiwgICAgMTAwLCAgIC02MDUsICAgMzIxNCwKKyAgICAgIC0zNzQsICAgLTY2MCwgICAtMzcxLCAgICAyMDcsICAgIDE3NSwgICAtNTUzLCAgIC01NzQsICAgMjk2MiwKKyAgICAgICAxMTksICAgLTU1MSwgICAtMTQwLCAgICAtNjIsICAgICA1MCwgICAtNjA4LCAgIC0yMzcsICAgLTEwMCwKKyAgICAgICAxMDgsICAgIDEwMSwgICAzMjU4LCAgICAtMzEsICAgIC00NSwgICAgMzc1LCAgIC0xNjEsICAgIDEzMiwKKyAgICAgIDI4NDIsICAgMTQ1OCwgICAgMjM1LCAgICA4MDAsICAgLTExMywgICAgNzE5LCAgIC0yOTEsICAgIC0yOSwKKyAgICAgIC01MTIsICAgLTI2NywgICAgIDUzLCAgICA3ODAsICAgIC01OSwgICAzMzg3LCAgIC0xNzUsICAgICA4OCwKKyAgICAgICAtNzgsICAgLTQ3NSwgICAtNTM2LCAgICA1ODQsICAtMzAyNSwgICAgLTE5LCAgIC0xMDUsICAgICA5MSwKKyAgICAgICA4NzUsICAgIC01NSwgICAtNzcxLCAgICAxNDMsICAgIDM4NCwgICAgODEwLCAgIC0zNzIsICAgLTI1MywKKyAgICAgICAxNjAsICAgLTEyOCwgICAgMjMyLCAgICAgOTgsICAgNzc1NSwgICAgMTgxLCAgICAtMTksICAgLTE3NywKKyAgICAgICAgNDYsICAgIC0zOSwgICAgLTMwLCAgIC0yMTIsICAgLTI4OSwgICAgIDc1LCAgICAxMjcsICAgLTExNCwKKyAgICAgICAgODAsICAgICA3OSwgICAgMzI1LCAgIC0xMjgsICAgLTQzNiwgICAyNTQ3LCAgICAtNzMsICAgIC0yOSwKKyAgICAgIDEwNDYsICAgIDM0NCwgICAzMzQwLCAgIC0zMzUsICAgIDQ1OCwgICAgNjM3LCAgIC0xNzUsICAgLTY5NSwKKyAgICAgIC0zNjYsICAgIDI5NCwgICAtMzIyLCAgICA1NjQsICAgIDU0MiwgICAgMjA5LCAgICA1MjQsICAgIC02MiwKKyAgICAgICA0NDQsICAgMjgyNywgICAgLTUzLCAgICAgNjYsICAgLTk1OSwgICAgIDg0LCAgICA0ODQsICAgLTE0NywKKyAgICAgICAxNTgsICAgIDI1OSwgICAtNDc5LCAgIDMyMTYsICAgIDIzMiwgICAgLTY4LCAgICA1ODMsICAgLTgxMCwKKyAgICAgICAxMDcsICAgICA5MywgICAgNjI5LCAgIC0xNjgsICAgIDE0MywgICAtNTUyLCAgICAgOTYsICAgIC03MSwKKyAgICAgLTM5MDMsICAgLTQzOCwgICAgMzM1LCAgIC0xMzMsICAgLTE4NiwgICAtMjc4LCAgICAgNzMsICAgLTU3NSwKKyAgICAgIC0yNTMsICAgLTczMywgICAgLTkxLCAgICAgLTgsICAtMTE0OSwgICAgMzUwLCAgICAxNDAsICAgICAxMiwKKyAgICAgIDM5MzUsICAgLTIzNiwgICAgMTAzLCAgICA0NjksICAgIDYxMCwgICAtNTM2LCAgIC0zMDUsICAgMzExMiwKKyAgICAgICAgMTMsICAgLTE4MiwgICAtNjg2LCAgICA2MzcsICAgIDUyNSwgICAgMzI3LCAgICAxMDIsICAgIC00OSwKKyAgICAgIC00NTAsICAgIC0xNiwgICAtNDgwLCAgICAyMzMsICAgIC04MiwgICAtMTMyLCAgLTM5NzksICAgIDQyNiwKKyAgICAgICA3NTcsICAgICA1NCwgICAgMTUyLCAgIC03MDEsICAgIDUxMywgICAyMzMwLCAgICAxNDgsICAgIDI0MiwKKyAgICAgIDE3MDksICAgIDE2MiwgICAtMTY4LCAgICAxNDYsICAgICAgMCwgICAgODkxLCAgIC02NDQsICAgIDEwOSwKKyAgICAgIC01NDksICAgIDEwNCwgICAgLTUwLCAgICAyNzUsICAgLTE5MywgICAgLTU1LCAgIC0xNDQsICAgLTExNywKKyAgICAgICAgMzEsICAgLTIzNCwgICAgIDY4LCAgLTUzNjksICAgICA3MiwgICAgIDU0LCAgICAgNTQsICAgIDExOSwKKyAgICAgIC0xNDAsICAgIDE5MiwgICAgMjg2LCAgICAtNDIsICAgLTI3OCwgIC0zNTI0LCAgLTM2MDksICAgIDY5MiwKKyAgICAgIC0zNjYsICAgIC0xNSwgICAgMzQzLCAgIC04ODUsICAgLTI2NywgICAgMjk0LCAgIC0zODcsICAgLTIxNSwKKyAgICAgICAtODMsICAgLTQ2OSwgICAgNzkwLCAgICAgODUsICAgIDQyOCwgICAtNjEzLCAgICAxMTQsICAgIDYzNCwKKyAgICAgICAyNzksICAgLTU3MCwgICAgNjE2LCAgIC04MTMsICAgLTExNywgICAzMDczLCAgIDMxMjEsICAgLTcxNywKKyAgICAgIC0yMDAsICAgIDI4NSwgIC0xMDYxLCAgICAtNDQsICAgIDk0NSwgICAgMzg2LCAgIC0xNjYsICAgIDQ5NCwKKyAgICAgICA3NzYsICAgICAzNiwgICAgLTI1LCAgIC00NDQsICAgLTI2MCwgICAgNDA3LCAgIDM4ODUsICAgMTA0OSwKKyAgICAgIDEzNDgsICAgIDE4NSwgICAgNDU0LCAgIC0xMzYsICAtMjI3NSwgICAxMDY0LCAgIC0yNzEsICAgLTMxNiwKKyAgICAgICA2NDUsICAtMTA1MCwgICAgNDgzLCAgICA0MzAsICAgICAzMiwgICAgNTY5LCAgIC02NzYsICAgLTMzNSwKKyAgICAgIC0zMjgsICAtMjk4MiwgICAtMzcwLCAgICAgNTAsICAgIDE4OSwgICAgMTU1LCAgIDEwNTgsICAgLTExOSwKKyAgICAgIC00MDcsICAgLTMxMCwgICAgNDYxLCAgIDMyOTMsICAgLTYwNCwgICAgMTk1LCAgICAgNDgsICAgICA2OCwKKyAgICAgICAxOTYsICAgIDE5NCwgICAgNTQ3LCAgIC0yMTAsICAgIDc4NSwgICAtMzgzLCAgIC00MTAsICAgLTI2OCwKKyAgICAgIC0xNDksICAgIDE5MiwgICAgLTg4LCAgICAtMTMsICAgICAyMCwgICAgLTgwLCAgLTUxNDYsICAgIC04NiwKKyAgICAgIC0xMTEsICAgICA0MCwgICAgLTM2LCAgIC0xMzgsICAgICAxMiwgICAgMjM5LCAgICAtMzYsICAgIC04NCwKKyAgICAgIC01MTIsICAgIDE0OSwgICAtMjM3LCAgIC02NzIsICAgMzQ3NywgIC0zNDQ2LCAgIDExOTgsICAgIDIyMCwKKyAgICAgICAxNDYsICAgLTc0NywgICAgMjQyLCAgICAgNDgsICAgLTE0NiwgICAtMTk2LCAgIC0zMzUsICAgLTc3NywKKyAgICAgIC00MDUsICAgIDYyMCwgICAtMzQwLCAgIC0zNjcsICAgLTM4OSwgICAtMTA4LCAgICAtMjcsICAgLTE4NCwKKyAgICAgLTIwMjQsICAgIDUxOCwgICAgMjQxLCAgIC0xMDQsICAgIDQxNywgIC0xMzU2LCAgLTE5NjEsICAgIDEzNCwKKyAgICAgIDMyMjEsICAgLTQyMywgICAgMjg2LCAgICAtNjAsICAgLTExMCwgICAtNTY4LCAgICAgMTQsICAgICA3NiwKKyAgICAgIC0xNDQsICAgIDE1OSwgICAgNzA0LCAgIC00MTAsICAgIDU0MiwgICAgLTQzLCAgICAyMjMsICAgIDEwNSwKKyAgICAgIC0xNTQsICAgLTE0MSwgICAgLTg0LCAgIC0xMzIsICAgLTI3MSwgICAtMjM1LCAgIC0yODUsICAgLTI0OCwKKyAgICAgICA0ODAsICAgIDQzMCwgIC00NzExLCAgIC00ODcsICAgIC04NiwgICAgNDgyLCAgICAgODAsICAgICA0NiwKKyAgICAgIC0yMzksICAgIC05MywgICAtMTE1LCAgICAtNTQsICAgICAtMSwgICAgICA3LCAgICAgOTcsICAgIC0xMiwKKyAgICAgICAxNTEsICAgLTE4MCwgICAgMTU5LCAgICAtNjMsICAgICA2NSwgICAtMjE1LCAgICAgNTQsICAgNTcxMiwKKyAgICAgIDI4ODYsICAgLTExNSwgICAtMjM2LCAgICAxMTMsICAgIC0yNSwgICAtMzAxLCAgIC00NTAsICAgLTI3NiwKKyAgICAgICAtNzgsICAgIDE5NywgICAgLTU1LCAgIC0yNzgsICAgLTUxMSwgICAgMTYzLCAgIDM0NDIsICAgLTkxMCwKKyAgICAgICAtNzQsICAgLTIyNSwgICAtMTAzLCAgICAgNjMsICAgLTIwNCwgICAgLTQzLCAgIC0xMjYsICAgLTMzNCwKKyAgICAgICAyMjMsICAgIDE5MiwgICAtMTMxLCAgICAyMDIsICAgIC04MywgICA1MDAwLCAgICAtNjYsICAgIDQ0MSwKKyAgICAgICAgMzMsICAgICAgMCwgICAtMTE2LCAgICAyMzcsICAgLTIzOCwgICAgLTM3LCAgICA0NDUsICAgIC00OCwKKyAgICAgICAgIDcsICAtMTg1NSwgIC0xMTU0LCAgIC0yNTEsICAgLTExNywgICAtMTg1LCAgICAxMjUsICAgMTg3NywKKyAgICAgICAzNzUsICAgIDM4OCwgICAtOTA0LCAgICAyMDIsICAgIDY0OSwgICAgMzc2LCAgLTMyMzEsICAgIDg5NywKKyAgICAgICAxMDEsICAgLTYzNywgICAgMzc2LCAgICAgMTYsICAgICAgMSwgICAgODQ1LCAgIC01NTAsICAgLTYxMCwKKyAgICAgIC0zODAsICAtMTM2MywgICAtOTU1LCAgICAgNzEsICAgMTMwMywgICAgMjk2LCAgIC0yNjQsICAgLTU4NCwKKyAgICAgICAyNDcsICAgMzI0NywgICAgIDk4LCAgIDEwMzUsICAgLTY3MCwgICAgNDE2LCAgLTIwMDgsICAgLTQ0OCwKKyAgICAgICAtNTYsICAgLTE2OSwgIC0xNzg3LCAgIDMzMTQsICAgIDQwOCwgICAyNTQxLCAgIC04MzMsICAgICAtMiwKKyAgICAgIC0xNjksICAgLTE4NCwgICAgMTkzLCAgIC01NzUsICAgIC04MSwgICAgNDEwLCAgIC0yOTMsICAgLTQ3OCwKKyAgICAgICAgMjEsICAgIDE5NCwgICAgMjIzLCAgIC0xMTEsICAgNDY0OCwgICAgIDYwLCAgICAzNTQsICAgLTU5MywKKyAgICAgLTI0MjksICAgLTY3MSwgICAgMTUwLCAgIC0zNTAsICAgIDE1MSwgICAtNDQ4LCAgICAgLTUsICAgIDM4NiwKKyAgICAgIC00NDEsICAgIDEzMSwgICAtMzM5LCAgICAgODcsICAgIDgxNSwgICAgMjc5LCAgICAgNTEsICAgIDEzMSwKKyAgICAgICAgNTYsICAtMzE5NCwgICAtMTcwLCAgLTM4OTksICAgLTI5NywgICAgMjcwLCAgICAgMjEsICAgLTIxNSwKKyAgICAgICAgIDcsICAgIDIwNSwgICAtMzA1LCAgICAxNDEsICAgIDU3NywgICAgIDgzLCAgIC0yODksICAgLTUwMiwKKyAgICAgICAtNjYsICAgIC05NiwgICAgNDMzLCAgIC0xMDYsICAgLTY4NSwgICAtMTk0LCAgICAtODIsICAgICAzMywKKyAgICAgICAgOTgsICAgIDMxNSwgICAgMjU4LCAgLTI0NTMsICAtMjk1NywgICAgNjA4LCAgICA2NzIsICAgIDE1MiwKKyAgICAgIC02ODEsICAgMTgwNCwgICAgLTc0LCAgIC00NTksICAgLTQyMywgICAgMTE0LCAgLTExODMsICAgLTEwMCwKKyAgICAgIC03OTgsICAgIDM1NywgICAgLTc5LCAgLTM0MTgsICAgLTY3NiwgICAgNTgwLCAgLTE2MzcsICAgLTUwNiwKKyAgICAgICAzMDYsICAgIDQzNywgICAxMDAxLCAgICA3MzEsICAgLTg4NSwgIC0xMjc2LCAgIC01ODMsICAgLTM1OSwKKyAgICAgICA2NTAsICAgICAxNSwgICAtMTg5LCAgICAxOTAsICAgICA4NiwgICAgIDM5LCAgLTc5ODcsICAgLTEzMywKKyAgICAgICAzMjQsICAgIDE3NCwgICAgIDIyLCAgICAgODYsICAgLTE0NCwgICAtMTI1LCAgICAtNDMsICAgIC04MSwKKyAgICAgICAtNDksICAgICA2OCwgICAgIDM5LCAgIC0yMDQsICAgLTE1OSwgICAtMjkxLCAgIC0yMTcsICAgIC02OCwKKyAgICAgICAyNjQsICAgIDE5MywgICAgNDA2LCAgICAyNDcsICAgICAyNywgICAtMjcyLCAgIC0xNjgsICAgIDUzNiwKKyAgICAgLTU3NDAsICAgLTE0MSwgICAgIDM4LCAgICAgMTgsICAgICAtNywgICAgMjU4LCAgIC0xMTEsICAgIDEyNSwKKyAgICAgICA0NzYsICAgLTM2NCwgICAgICA1LCAgICAgNzIsICAtMjY2OCwgICAtMTk3LCAgIC02MDUsICAgLTY3MSwKKyAgICAgICAtODIsICAgIDIwMSwgICAtNzUyLCAgICAyMjcsICAgIDI0MCwgICAgMzQ1LCAgICAtMTEsICAgLTEzOCwKKyAgICAgICA1NTEsICAgLTM1MSwgICAtMjI4LCAgLTI3NzQsICAgLTEzMiwgICAxMTE1LCAgLTEwMzgsICAgIC0xOCwKKyAgICAgICA3OTEsICAtMzEzNiwgICAgIDgxLCAgICAyMTksICAgIDM1NywgICAgNzU1LCAgICA1NzksICAgICAyNiwKKyAgICAgLTMxMjksICAgLTM5OCwgICAtNzE5LCAgICAxOTMsICAgIDQ5NSwgICAgMjkwLCAgLTExMjMsICAgIDg1NCwKKyAgICAgIC0zODEsICAgLTUzNSwgICAgIDMzLCAgICAyMzIsICAgMjM0MCwgIC00NTc3LCAgICAtOTQsICAgMTAyMywKKyAgICAgIC0xMTcsICAgICAzOSwgICAgLTU0LCAgICAgMTUsICAgLTE2MSwgICAtODYwLCAgICAgNjQsICAgLTIwOSwKKyAgICAgIC01OTcsICAgIDQxNSwgICAtMTM1LCAgIC00MDcsICAgMTA2OCwgICAgODk0LCAgIC03ODQsICAgIDEwOCwKKyAgICAgICAyNjcsICAgNzUwNiwgICAgMTQwLCAgICAgNjcsICAgIDE5OCwgICAgIDc0LCAgICAgNTIsICAgLTM4OCwKKyAgICAgIC0xODQsICAgIC0yNCwgICAgLTU0LCAgICAtMjQsICAgIDE3MiwgICAgMTcyLCAgICAtNTAsICAgLTE4NCwKKyAgICAgIC0xMTMsICAgIDE2NCwgICAgMTI4LCAgICAtMzksICAgIDI1MiwgICAgIDkwLCAgICAzNTYsICAgLTMxMywKKyAgICAgICAtOTAsICAgLTMxMywgICAtMzU1LCAgICAtNzMsICAgICAxOSwgICAgMTM5LCAgICAxNDEsICAgLTEyMiwKKyAgICAgIC0yMzEsICAtNDU0OCwgICAtMTU3LCAgIC0yMjcsICAgICA0NywgICAgMjMxLCAgIC00MjEsICAgICA2MCwKKyAgICAgICAtODAsICAtMzYxOSwgICA0MjUyLCAgIC0zNTQsICAgICA2OSwgICAgMTQ4LCAgICAzMzYsICAgIDQ0NiwKKyAgICAgIC0xODMsICAgICA4NiwgICAgMjQ4LCAgICAgMzUsICAgICA3MywgICAgMTIwLCAgICAxNTcsICAgIDE1NiwKKyAgICAgIC0yOTEsICAgLTUyMywgICAgIDM1LCAgIC0yNjQsICAgMzQzNCwgICAgMTg5LCAgICA0OTUsICAgIC01OSwKKyAgICAgICA1MzMsICAgLTM0MywgICAtNTU0LCAgLTMwMTQsICAgLTQxNSwgICAgIDE3LCAgICA0MzYsICAgIDU1MiwKKyAgICAgIC0yNDAsICAgLTM5NCwgICAtNzYxLCAgICAgNDMsICAgLTc2NiwgICAgIDQ2LCAgLTExMTksICAgLTI1NCwKKyAgICAgIDE1NDAsICAgIDE5NSwgICAtMjk4LCAgIC04MzMsICAgICA0NSwgICAgLTkzLCAgICAgNjEsICAgICA0MCwKKyAgICAgIC0xNzEsICAgIDE2NywgICAgIDgyLCAgICAxMDcsICAgICAxNiwgICAgIDQwLCAgIC0xNjYsICAgIC00NiwKKyAgICAgICAxMjAsICAgLTE4NSwgICAgIDEzLCAgICAxNTEsICAgODE1MSwgICAtMjM1LCAgICAgOTIsICAgIC0yMywKKyAgICAgICAyMTQsICAgIDIwNiwgICAgMjYwLCAgICAgOTMsICAgIDE2MywgICAgIDc4LCAgICAxODQsICAgIC02MCwKKyAgICAgICAtMTIsICAgLTE3MSwgICAtNDk5LCAgIC0xNTEsICAgLTIxOSwgICAgIDExLCAgIC0yMjEsICAgIDIyMSwKKyAgICAgIDMyNTMsICAgLTM3NiwgIC0xMDc5LCAgIC00ODEsICAgIDc2MywgICAtMjU3LCAgIC0xMjAsICAgIC0xMCwKKyAgICAgICAgMzQsICAgLTY0MCwgICAgMzQxLCAgLTI5NTMsICAgIDUyOCwgICAgNTY3LCAgIC02NzIsICAgLTMzNSwKKyAgICAgIC0xNzUsICAgIC02MSwgICAgNTgxLCAgIC0yNjAsICAgMTE1OSwgICAtODAyLCAgIDEwNzAsICAgICAxMiwKKyAgICAgICAxNjgsICAgMjMwNSwgICAgMjkxLCAgICAyMDMsICAgIC0xNSwgICAtNTY5LCAgIDMyNDcsICAgLTE3OSwKKyAgICAgICA2MjAsICAgIDMzOSwgICAgMjI0LCAgICA3MTAsICAgLTQxNiwgICAgNTEyLCAgICAtODYsICAgIDU3MSwKKyAgICAgICA0MzksICAgLTE2NywgICAgNTcxLCAgICAtNzIsICAgLTE0NCwgICAgMjM2LCAgIC0zODIsICAgICAxMSwKKyAgICAgICAyNjgsICAgLTE3NiwgICAtMTM2LCAgIC0zMzcsICAgIDIyMCwgICAgIDY0LCAgICAzNDEsICAgIDM2MSwKKyAgICAgLTQ0NzQsICAgICAyNSwgICAgMzg1LCAgICA0NTMsICAgLTE1MywgICAgIDg5LCAgIC01NzIsICAgIDI0NSwKKyAgICAgIC0xOTcsICAgICAzMywgICAgIDc1LCAgICA1ODgsICAgICA1MSwgICAtMTk5LCAgICAtNzQsICAgLTE0OSwKKyAgICAgICAyMjQsICAgIDIxMCwgICA0Njg5LCAgICAyODIsICAgICAyMCwgICAgLTQ3LCAgICAxMjksICAgIDIyMSwKKyAgICAgICAtNzIsICAgICAyNywgICAgIDc2LCAgICAgOTMsICAgIDMzMSwgICAgMjE1LCAgICAgLTUsICAgIC0yMCwKKyAgICAgICAgNzQsICAgIC04MCwgICAgMTY5LCAgICAxMjYsICAgIC00MCwgICAtMTM3LCAgICAtMjQsICAtODEwMSwKKyAgICAgICAtMjMsICAgIDE2NSwgICAgMjcxLCAgICA0MDMsICAgIC0zNCwgICAgLTE5LCAgICAyOTAsICAgLTE5OSwKKyAgICAgICAtMTQsICAgIDIwNSwgICAgNjU3LCAgICAzMDEsICAgLTg4NSwgICAyNDU3LCAgLTE5NjUsICAtMjI2NiwKKyAgICAgLTEwMDQsICAgLTIyNCwgICAtNTU0LCAgICAxODIsICAgLTIyMCwgICAtNDY3LCAgIC02MTEsICAgMTAxMiwKKyAgICAgIC0xMjIsICAgMzMwMywgICAgLTczLCAgIC0yMDUsICAgICA5MywgICAzNTQ5LCAgICAyMTcsICAgLTIyMywKKyAgICAgICAgNTUsICAgLTQ1OSwgICAgNTQxLCAgICAyODYsICAgIC00NiwgICAgMTI4LCAgICAzNTQsICAgIDEzNywKKyAgICAgICA4MjQsICAgLTMxMywgICAgIDMyLCAgICAzMDEsICAgIDEzOSwgICAtNDkyLCAgICAxNzAsICAgIDEzNiwKKyAgICAgICAtMzUsICAgLTc1MiwgICA0NjEzLCAgIC04MzAsICAgIC0zNCwgICAgIDQxLCAgICAzNDQsICAgIDI3OSwKKyAgICAgICA2NDMsICAgLTM5NCwgICAtNDYxLCAgICAxNjMsICAgLTMzMCwgICAgMTk5LCAgIC0yMTUsICAgICA4MywKKyAgICAgIDEwOTYsICAgIDYxMywgICAtNDczLCAgICA4MTYsICAgMzUzNCwgICAgMjEwLCAgIC03NzIsICAgIDkzNSwKKyAgICAgIC0yNzUsICAgLTYwMCwgICAtMzQxLCAgICA2MDIsICAgIDEwNCwgICAtNTk4LCAgIC0yMTcsICAgLTc4OSwKKyAgICAgLTI0MjgsICAgIDg3MCwgICAtMzUxLCAgICA0NzQsICAgICA1MCwgICAgMzIxLCAgIC0xNDgsICAtMjkyOSwKKyAgICAgICAgMjUsICAgLTEzNSwgICAgLTQ2LCAgICAgMTEsICAgLTU2NiwgIC0zMDU3LCAgIC02NjQsICAgIDcwMCwKKyAgICAgIC0zMDAsICAgIDI1NiwgICAtOTYwLCAgICAzNTAsICAgLTQ4MCwgICAgNDE0LCAgICA0MzEsICAgICAyNCwKKyAgICAgICAtNTEsICAgLTIyOCwgICAgNDA3LCAgICAxNDIsICAgLTMyMSwgICAgMzE2LCAgIC0yOTAsICAgIDE0OSwKKyAgICAgICAgNTYsICAgIC04NCwgICAtMzU5LCAgIC0xMTgsICAtNDk0OCwgICAgMTM4LCAgICAzNzMsICAgIC00OSwKKyAgICAgICAxNDIsICAgICA3MSwgICAtMTYzLCAgICAtMTMsICAgLTI3OSwgICAgIDM4LCAgIC0xMjEsICAgICAzNSwKKyAgICAgICAtNDcsICAgIC03MCwgICAgLTQzLCAgICAxMTYsICAgICAgMywgICAtMTU5LCAgICAtMTEsICAgICA5NywKKyAgICAgIC0xMTYsICAgIC02MiwgICAgMTU2LCAgICAzMDcsICAgLTE3MywgICA3Mjk0LCAgIC0xNDMsICAgIDI4OCwKKyAgICAgICAtMzQsICAgIDY3MSwgICAgNjEzLCAgICAgMTYsICAgLTI0MCwgICAtMjI5LCAgIC00MTQsICAgLTQ5NCwKKyAgICAgICAtNDMsICAgLTE2OSwgICAtODU0LCAgICAzMzYsICAgLTk5MSwgICAgNzE5LCAgIC0zNTMsICAgLTE2MywKKyAgICAgIC03NTAsICAgMjY4NSwgICAyODM3LCAgIC01NTgsICAgIDEyOSwgICAyMDc2LCAgICAtNDcsICAgIDY0MSwKKyAgICAgICAtMzcsICAgIC05MywgICAgMjI2LCAgICAtNjksICAgIDU5OCwgICAtMjg0LCAgICAxMjcsICAgIDEwNiwKKyAgICAgIC00MjYsICAgLTU1NSwgICAtOTQ3LCAgICA0ODUsICAgICA1NCwgIC0zMTc1LCAgICA2MjIsICAgLTM0MSwKKyAgICAgIC01NDQsICAgIDI3OCwgICAtMjA1LCAgIC02ODksICAgIDM5MSwgICAgMjM4LCAgICAgIDksICAgIDE1MiwKKyAgICAgIC0yMzMsICAgLTM5MiwgICAgIDI4LCAgICAgMzYsICAgLTM5NCwgIC0xMDU5LCAgICAxMzIsICAgMzc2MSwKKyAgICAgIC00ODAsICAgICA4NywgICAtNjU2LCAgIDEzMDQsICAgIDQ3OCwgICAtMjcyLCAgICAgNjUsICAgLTE0NywKKyAgICAgICAgOTEsICAgIDUyMCwgICAtODk2LCAgICAxNjYsICAgICA2MiwgICAgLTMwLCAgICAtMjgsICAgIDE5NCwKKyAgICAgICA1NDIsICAgICAgMywgICAgNjI1LCAgIDE3OTUsICAgMzYxMywgICAxMDk3LCAgIDEwMzAsICAgIDkwNiwKKyAgICAgICA0MDAsICAgIDEzMywgICAtMTI3LCAgICAyMTksICAgIDk1OCwgICAgIDkzLCAgIC01NDYsICAgLTcwMiwKKyAgICAgIDI5MzcsICAgLTUyNCwgICAtMjcwLCAgIC03NjcsICAgLTE5MiwgICAgNzI1LCAgIC04OTcsICAgLTY0MywKKyAgICAgIDI1MDIsICAgIDE0MSwgIC0xMTQ3LCAgICAyNTcsICAgIDI3OSwgICAgNDcwLCAgLTMwMDEsICAgLTEwNCwKKyAgICAgICAgNzksICAgIDUwOCwgICAgNDUwLCAgICAyNjUsICAgIC0yMSwgICAgLTc0LCAgIC00MzcsICAgIDY0NywKKyAgICAgLTI3NTUsICAgLTQwNywgICAtODE2LCAgICA2MjAsICAgICAyNCwgICAgNTM3LCAgIC02NjgsICAgIDYwNCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMTExMHNzMFtdID0geworICAgICAtODE4NywgICAgIDkwLCAgIC02OTQsICAgLTE2OCwgICAtNDUyLCAgICAgLTQsICAgLTI1OSwgICAtMzMyLAorICAgICAgIDM1MiwgICAtNTU0LCAgICAgNDMsICAgIDM4OSwgICAgMjM2LCAgICA1MDgsICAgLTE3NSwgICAgNDYxLAorICAgICAgLTI3NywgICAgMTE4LCAgICA2NTEsICAgLTI0NSwgICAgNjk2LCAgLTE0MjMsICAgIDM2OCwgIC0xNDE3LAorICAgICAgMTc4MiwgICAxNjUwLCAgIC01NDAsICAgICAyNywgICAtNDYxLCAgICA1MTYsICAgLTU5OSwgICAtMTg1LAorICAgICAgIDQyMiwgICAgLTExLCAgIC0xODEsICAgICAxOSwgICAxODA5LCAgLTMyMjYsICAgLTgzOSwgICAtMTkxLAorICAgICAgIDQ2OCwgICAgMTgwLCAgIC01NTAsICAgIDE5OCwgICAyNDg3LCAgIC05MjMsICAtMTMzNSwgIC0xMDA4LAorICAgICAgMTAyOSwgICAxNzE2LCAgICA1ODgsICAgIDM3MSwgICAgOTAyLCAgLTEyMTQsICAgIDE3OSwgICAxMDI2LAorICAgICAgMTU2MCwgICAxODE1LCAgLTE3MTQsICAgMTIzMCwgICAtNzEyLCAgIDE2NzUsICAgMTg2NywgICAtMTU0LAorICAgICAtMjg2MCwgICAtNDg0LCAgIDIyODksICAtMTAxOCwgICAgIDMzLCAgLTE0OTQsICAgIDYxNCwgIC0yMzQwLAorICAgICAgLTcyNCwgIC0xMDg4LCAgLTE5MzAsICAgLTc3NSwgICAtODc2LCAgICA2NDIsICAtMTM1OCwgICAtMTQ0LAorICAgICAtMjUxOCwgICAgIDYyLCAgICA1NDMsICAtMTA0OSwgIC0xMDgxLCAgICA2NzIsICAgMTMwNSwgIC0xNTA2LAorICAgICAgIC04NiwgICAyOTIwLCAgICA1MTgsICAtMTgzNiwgICAtNTQ2LCAgIC0xMzIsICAgIC00NSwgICAtNjQyLAorICAgICAgIDM4MSwgICAtNDA0LCAgLTIyMDYsICAtMTIxMSwgICAgNjk4LCAgIC03MDMsICAgLTY2NywgICAtNjA2LAorICAgICAgLTY3NywgIC0yMjQ2LCAgICA1MjYsICAtMTE1NywgICAgMTc3LCAgICA1MTAsICAtMTQyMCwgICAtNjE3LAorICAgICAtMTgxOSwgICAxNzEwLCAgIDE2MzEsICAgMTA0OSwgIC0xNjk3LCAgIC00OTUsICAgIDk2MSwgIC0xMjUwLAorICAgICAgICAzOSwgICAgNDgyLCAgICA0NDUsICAgLTk1NiwgICAgLTcxLCAgICA5NzcsICAgIDQyNiwgICAxODI2LAorICAgICAgIDI4NiwgICAgIDM2LCAgICAyOTUsICAgMTc4NiwgICAgNzk0LCAgLTM0NTYsICAgMTY0NSwgICAtNzY2LAorICAgICAtMTU4MCwgIC0yNDM1LCAgIDExMDgsICAgLTI4NiwgICAgNzMxLCAgIC02NTksICAgIDk2MCwgIC0xNzU5LAorICAgICAgLTk3OCwgICAgMzE2LCAgIC0zNTAsICAgICA5MSwgICAgLTM1LCAgIC0yMjIsICAtMTQxNywgICAgLTUzLAorICAgICAgLTUyOSwgICAtNjc5LCAgICA2ODEsICAtNDcwMCwgICAtNTI0LCAgICAtMzksICAgLTM1MCwgICAgMTk2LAorICAgICAgIDE5OSwgICAgMTkxLCAgICA2NTMsICAgMTM0NCwgICAtOTQyLCAgIC00MjgsICAgIDE1NiwgICAgMTczLAorICAgICAgIDYzNiwgIC0xNTM4LCAgIDE3OTUsICAgMTcwOSwgICAtMTkwLCAgIDEyNjUsICAgIDE2NCwgICAgNjUwLAorICAgICAgMjMwMiwgIC0xNzU3LCAgIDE3NjIsICAgIDQxMywgICAtODUxLCAgICAgNDQsICAtMTM3MSwgICAgMzQzLAorICAgICAtMzg0NSwgICAtMTIyLCAgIDE4NjQsICAgLTQ4OSwgICAgNjAxLCAgIC03NDgsICAgLTQwMiwgICAgNTkwLAorICAgICAgLTEyNCwgIC0xOTg4LCAgLTE1MzYsICAgLTk5OSwgICAgMzk5LCAgIC03NTMsICAgIDI5NSwgICAtMzg0LAorICAgICAtMTMxNiwgICAgIDU1LCAgIC02NjksICAgIDI2MiwgIC0xMTU3LCAgLTM3NjYsICAgIDk5MiwgICAtMTExLAorICAgICAtMjkyOCwgIC0xNDI0LCAgICAtOTgsICAgIC02MiwgICAtMzM0LCAgLTE4NDgsICAgIDM3NywgICAxNTYwLAorICAgICAgIDk0NywgICAxNTY4LCAgIDE1NTQsICAgIDIwNiwgICAgNjY0LCAgIDIwMTQsICAgMjA5OCwgICAtMTY0LAorICAgICAgLTY0MCwgIC0yODk3LCAgIC02NDcsICAtMTY3NSwgIC0yMzA3LCAgIC0yNTQsICAgLTU1NSwgIC0yNDI2LAorICAgICAgMTQ5NywgICAgNDY1LCAgLTE1MjUsICAtMTE0OCwgICAgIDU1LCAgICA2MzIsICAgIDU1NCwgICAyMDY4LAorICAgICAgIDQ1MSwgIC0xNTMyLCAgIC03MTUsICAtMjA2NSwgIC0xMTc3LCAgIC02MjMsICAgIDQ3OCwgICAgLTg4LAorICAgICAtMTE0MCwgICAgLTcyLCAgIC00NTAsICAgLTI0OCwgIC0xMTExLCAgIC0yNTAsICAgMTM1NiwgICAyNzE3LAorICAgICAtMTg0MSwgICAgNDIwLCAgLTEyOTksICAtMTcxNSwgICAgNzQ2LCAgIC0xMDEsICAgIDYwMCwgICAxMTMwLAorICAgICAgLTkwMywgICAtNDczLCAgIDEyMjUsICAgLTg3NiwgICAgMTkzLCAgICA2OTQsICAgLTE5MywgICAtNDgyLAorICAgICAtMTgzOCwgICAgIDk0LCAgICAxNTcsICAgMTEzMSwgICAgMjY3LCAgIC0yNDIsICAgMjAyMSwgICAgLTM5LAorICAgICAgIDc5NSwgICAtMjg1LCAgICA0MzgsICAtNDMyMiwgICAxMDk3LCAgIC02MjEsICAgLTUxOCwgICAtMzM4LAorICAgICAgLTI4OSwgICAtMTE0LCAgIC02NzEsICAgMTcwMCwgICAtNDc3LCAgICA0NDksICAtMTY2NCwgICAtNjkzLAorICAgICAgMTQwMywgIC0zNjI5LCAgIDE0ODAsICAgLTk5MSwgICAtMjM0LCAgIC0yMTMsICAgIDM1NCwgICAtMjY5LAorICAgICAtMTE0MCwgICAgLTQwLCAgIDE0NTUsICAgLTc1OCwgICAxMjczLCAgICA0OTcsICAgLTY4NiwgICAtOTQ1LAorICAgICAgICA1OSwgICAgLTY2LCAgIC03NjksICAtMjkzMCwgICAyMzQzLCAgIDI0NTIsICAtMTU3NiwgICAgOTk1LAorICAgICAgLTczNCwgICAxMDA5LCAgICAgOTgsICAgLTM1MCwgIC0xMTE2LCAgICA1NDUsICAgIDE4OSwgICAgIDk5LAorICAgICAgIDU2NiwgICAtOTE2LCAgICAgMjAsICAgIDExNywgICAtODA3LCAgICA5ODYsICAgLTQyOCwgICAgMTc3LAorICAgICAgMTI0NywgICAgNDg1LCAgIC02ODAsICAgMTEzOSwgIC0xMjYzLCAgIC0yNTYsICAgNDgyOCwgICAgIDg5LAorICAgICAgICAyNywgIC0xMzM5LCAgLTEwOTEsICAgIDE0OSwgICAtNjQxLCAgIC03MDMsICAgLTU3MCwgICAtMTEyLAorICAgICAgIDM0NiwgICAgLTkzLCAgIC02NDEsICAgIC05NywgICAtOTkxLCAgLTIyNDcsICAgMjI4NCwgICAgODQ3LAorICAgICAgMjExMCwgIC0xMzkzLCAgIC0zMTUsICAtMTQ2OCwgICAgNTE0LCAgLTE0OTMsICAgIC00NiwgICAxMTM1LAorICAgICAtMTIzMSwgICAgIDM5LCAgIC05MTMsICAgLTI3OCwgICAtNzYyLCAgIDE3NzUsICAgLTY4NCwgICAgNzM1LAorICAgICAtMTY3NiwgICAgMzg2LCAgLTIwMzAsICAgMjUzNCwgIC0yMzcxLCAgLTE2NjEsICAgMTIwNCwgICAtMTExLAorICAgICAgICAtOCwgICAtNjA3LCAgIDEyMzMsICAtMTUzMiwgIC0xMjYzLCAgIDE1MzAsICAgLTUzNywgIC0xNzI4LAorICAgICAgLTMzNSwgICAgMjY5LCAgIC02MTQsICAgICAxMiwgIC0xMTg3LCAgIC03NzAsICAgIDQ3MSwgICAgMzczLAorICAgICAgNDc0MywgICAgIDEyLCAgICAxOTcsICAgIDYxMCwgICAtMTAxLCAgICA0MTcsICAgLTM1MCwgICAgNTUxLAorICAgICAgIDU0NCwgICAtODk4LCAgICAzODcsICAgLTY4MiwgIC0xMjE2LCAgICAxMjYsICAgICA5NiwgICAgIDk0LAorICAgICAgLTI2OCwgICAgNTM1LCAgICAxMjYsICAgLTc3OCwgICAxNTk1LCAgLTEzNzksICAgMzM2NiwgICAgIDQ5LAorICAgICAgIDQ2MCwgICAxNzcyLCAgICAxOTgsICAgLTg5NiwgICAgIDc1LCAgICAyNTMsICAtMTM3NiwgICAgIDY4LAorICAgICAgIDgzOCwgIC0xMTIxLCAgIC01NzgsICAgLTYzMCwgICAtNzE4LCAgIC05NzUsICAgLTU2NSwgICAxMzAzLAorICAgICAgIDM1NCwgICAtNzY5LCAgICAtMzgsICAgLTI0NiwgICAtMTkzLCAgIC00MDgsICAgICA0MSwgICAgMTY1LAorICAgICAgIDM3NCwgICAgLTg3LCAgIC0xNTUsICAgICAtOCwgICAtNzQ2LCAgIC00MzAsICAgLTg2OSwgIC0xODQyLAorICAgICAgLTM4NSwgICAgMjgxLCAgIDUxMTksICAgIDQzMiwgICAxMTE5LCAgIC04MDcsICAgMTc1NiwgICAgODE2LAorICAgICAgIDEzMSwgICAtNTQ4LCAgIC01MjgsICAgMTM0NywgICAgNDc4LCAgIDE0ODIsICAgMjk0MiwgICAtMjkwLAorICAgICAgIDY1MCwgICAxMDEyLCAgICAxNjMsICAgIDg0MCwgICAtODA0LCAgICAgOTQsICAgMjUwNywgICAxNTE0LAorICAgICAgLTk1MywgICAtMjg5LCAgICAgMjMsICAgMTEyOCwgICAtODk1LCAgLTEwMDksICAgMTg3MSwgICAtMzcwLAorICAgICAgIDY5OSwgICAgNjU5LCAgLTMwNjksICAgLTY5NSwgIC0xNTU5LCAgIDE0MzUsICAgIDY3MiwgICAgIDk0LAorICAgICAgMTQ5NiwgICAtNjM3LCAgLTIyMDgsICAgMTA4MywgICAgNjg4LCAgICA0ODUsICAgIDI1MSwgICAtODI4LAorICAgICAgMTMxMywgICAgLTIxLCAgLTE5NDgsICAgIDIzMCwgICAtNjAzLCAgICA3ODMsICAgLTgyOSwgICAgNTI0LAorICAgICAtMTE0MiwgIC0zODQ1LCAgLTEzODMsICAgIDMyMywgICAxMjk1LCAgICA3MzIsICAgIDc1OSwgICAgNTkxLAorICAgICAgICA2OCwgIC0xODY5LCAgIC03NTYsICAgMTcyNywgICAgMzM5LCAgLTE1NjUsICAgLTUxMCwgICAyNjIzLAorICAgICAgIDM1OCwgICAzMDcxLCAgICAyODEsICAgLTc5MCwgICAxMTI5LCAgICAyNDMsICAgLTU4OCwgICAtNDMxLAorICAgICAgIDQ5MiwgICAgMzcyLCAgICAgOTYsICAgIDg5MCwgICAtOTM1LCAgIC03MjcsICAgLTIzNiwgICAtNDE2LAorICAgICAgIDE3MSwgICAgMjI2LCAgLTEwOTAsICAgMTI1NywgIC0xMDYzLCAgIC0zMDMsICAgLTgxNywgIC0xNTA2LAorICAgICAgLTk0NywgICAyMjgyLCAgIC02NTksICAgLTQwNiwgICAgIDc5LCAgICA3NzIsICAgLTgxNiwgIC0yNjEwLAorICAgICAtMTgwMiwgIC0xMDE5LCAgIC04MTYsICAtMTg4NiwgIC0xMzA2LCAgIDEzNjUsICAgIDYyNCwgIC0yMzE0LAorICAgICAgIC01NywgICAxMDEyLCAgICAyMTUsICAgLTEzMCwgICAzNDA0LCAgIC04NjQsICAgIDk1OSwgICAgMjAyLAorICAgICAgIC0yNiwgIC0xMDE1LCAgLTEyMTIsICAgIC0zNCwgICAtNDA4LCAgIDM0OTQsICAgLTI4NCwgICAgODQ1LAorICAgICAgIDI3NSwgIC0xMDA1LCAgICA0NTgsICAgIDg0MCwgIC0yMjU4LCAgICAtMTMsICAgLTEyOSwgICAyNTM2LAorICAgICAgMTI2OSwgICAxMjE2LCAgIDIwNzEsICAgLTI0MywgICAgNjI0LCAgICA1ODQsICAgMjE5MiwgICAgNzIwLAorICAgICAgIDYwNCwgIC0xMzk3LCAgICA3NjYsICAgIDk4NCwgIC0xMDUwLCAgICAxNTcsICAgLTI0NiwgICAgNDM4LAorICAgICAgIDI0MCwgICAtNTg3LCAgIDEyNTEsICAgLTY0OSwgICAgLTIyLCAgICAgMzMsICAgNTgxOCwgICAgNjA4LAorICAgICAgLTk5NiwgICAgNDc0LCAgIC01MjMsICAgLTQ1NCwgICAxMjUyLCAgIC03OTEsICAgIDYzMSwgICAtNDY1LAorICAgICAgIDY2MywgICAgNDUyLCAgIDE3OTMsICAgIDg1MywgICAgIDM5LCAgIDM3MzIsICAgIDc1OCwgIC0xMzI5LAorICAgICAgICAxMSwgICAyMjE3LCAgIC0xMzYsICAgLTU0MCwgICAxMzM1LCAgICAgNjUsICAtMjA0NywgICAgOTQzLAorICAgICAgIDcwMSwgICAxODg2LCAgIDIwODUsICAgLTg5MCwgICAgLTE2LCAgIC0xODQsICAgIDMyNSwgIC0xMDc3LAorICAgICAgLTI3MSwgIC0xMjQ2LCAgICAzOTEsICAtMTY4NiwgICAtNjUxLCAgICAtNzcsICAgIDMxOSwgICAgMjkyLAorICAgICAgLTE2MCwgICAxMjA0LCAgIDEwOTMsICAgIDc3NiwgICAtMzEwLCAgIDE1MTIsICAtMTE5NiwgICAgMTQ5LAorICAgICAgICA0NiwgICAgNTkzLCAgIDE3MzgsICAgLTU2NiwgICAgIDk3LCAgLTM2NjcsICAgLTQ4NSwgICAtNjgzLAorICAgICAgLTEyMSwgICAtMjE2LCAgIC0xNDksICAgLTM0NCwgICAgNDA2LCAgIC05ODksICAgLTMxMSwgICAgMzgzLAorICAgICAgIDk3OSwgICAtODI4LCAgICAzOTQsICAgIC0yMiwgIC01MTQzLCAgLTEzNjgsICAgIC0xOCwgICAtNDMzLAorICAgICAgIDM1OSwgICAgNjA3LCAgICA5OTYsICAtMTE0NCwgICAtMjI5LCAgIDEzNjUsICAtMTI0MywgICAgNDEzLAorICAgICAgLTU5MSwgICAtNjIxLCAgICA4MDMsICAgMTM1NiwgICAtNjI1LCAgIDExNDksICAgLTIzNCwgICAgMTgyLAorICAgICAtMTI4NSwgIC0yNDg3LCAgICAzNTksICAgMjY0MCwgIC0xNDI2LCAgICAtNjYsICAgLTY4OCwgICAgMjM3LAorICAgICAgMTMwNywgICAtMzYxLCAgICAxMDgsICAgIDIwNywgICAxMDI2LCAgIC01MDAsICAtMTE1NiwgIC0xMDQzLAorICAgICAtMjE5MiwgIC0yMjMyLCAgIDE3OTAsICAgMTEzNSwgICAxNzQyLCAgIDE0OTQsICAtMTE1NiwgICAtNjk4LAorICAgICAgMjUyMCwgIC0yNTk2LCAgIC02MjAsICAgIDQzMSwgICAgNzQ4LCAgICAgODgsICAgIDkxMiwgICAgODMyLAorICAgICAgMTEyMiwgICAtNDgzLCAgIDE4MzcsICAgMTgyMSwgICAtODI2LCAgIDExMTIsICAgLTQyNCwgICAtMzA2LAorICAgICAgLTc1MCwgICAxMDg1LCAgICAyNjAsICAgIDE1MiwgICAtMTE0LCAgLTEwNjUsICAtNDUxOCwgICAtMzAwLAorICAgICAgLTk3NiwgICAgMTQzLCAgIDE0NTIsICAgMTM5NSwgICAxNjc3LCAgICAgNTksICAgIC01MSwgIC0xMDcyLAorICAgICAgIDg2OCwgICAtMTcxLCAgICAtMjYsICAgLTkxNCwgICAtMTA5LCAgLTI0MjAsICAgIC00OCwgICAgIDY5LAorICAgICAgLTIzMCwgICAgNjMwLCAgIC01MjIsICAgMjI3NCwgICAxMjY1LCAgLTE2MTIsICAgMjU3MCwgICAgODM2LAorICAgICAtMjA0MiwgIC0xOTIyLCAgIDI5NzAsICAgIDc3NSwgICAtMzIwLCAgLTI0ODYsICAtMjkzNSwgICAgNTUzLAorICAgICAgIDE3OCwgICAgOTk0LCAgLTEwNTQsICAtMTMyMSwgICAgNjk5LCAgICA3NDksICAgMTAwMiwgICAgNTEzLAorICAgICAgIDU4NiwgICAxNTUwLCAgICAgMzUsICAgIDY1NCwgICAtOTk1LCAgIDE3NDMsICAtMTA0OSwgICAtNDA1LAorICAgICAtMzQzMSwgICAxOTQzLCAgICA3MDAsICAgIDU1NSwgICAgMTExLCAgICAtNjcsICAgMTAwNywgICAgMTExLAorICAgICAgIC01NywgICAgNjYxLCAgICA0MDQsICAgLTYyOCwgICAgNDI1LCAgIDIxODUsICAgIDg2MCwgICAtNTE2LAorICAgICAgLTUyMywgICAgNDUyLCAgICAyMzgsICAtMTc3OCwgICAtMzc4LCAgIC03MjEsICAtMjE5NywgICAgMjE4LAorICAgICAgIDg2NCwgIC0xMDMxLCAgIC04MzIsICAgIDEzNSwgIC0yNTQzLCAgIC00NDcsICAgIDc4OSwgICAxMTE3LAorICAgICAtMTQ5MSwgICAgMTIwLCAgIDEyOTQsICAgLTcwMiwgICAgNjI3LCAgIC00MTIsICAgLTkwMiwgICAgNDA0LAorICAgICAtMTg0MywgICAtNzg2LCAgIC01OTcsICAgIDkwMCwgICAxOTYzLCAgICAgMjIsICAgLTg0MywgICAxMTY4LAorICAgICAtMTA0NSwgICAtNzk3LCAgICA3NjQsICAgLTQyMywgICAgMzI5LCAgIDIzMDgsICAtMTk1MCwgICAgMzMxLAorICAgICAtMTA5MCwgIC0yNDY2LCAgIC00ODMsICAgMjAyMywgIC0zMzYzLCAgIDIxMjYsICAgIDQ5NSwgICAyODEyLAorICAgICAgMTkyMiwgIC0xNDg4LCAgLTEwNDEsICAgLTc5OCwgICAgMTM1LCAgICA0MDgsICAgICAzMywgICAgNTYzLAorICAgICAgMTMzMywgICAgLTM2LCAgLTIxODEsICAgLTc4NywgICAgNzA5LCAgICAyODcsICAgLTk3MSwgICAgIDkzLAorICAgICAgLTQ1OSwgICAtOTc1LCAgIDI0MTIsICAgIDI4MCwgICAyNTU1LCAgICAgMzIsICAgMjIxNywgIC0xODI1LAorICAgICAgIDY1MCwgICAgMzEzLCAgICA1ODUsICAgLTk0NywgICAxMTcwLCAgICAgNDUsICAgMTEwOCwgICAtNDM1LAorICAgICAgMTA5MiwgICAgMjIwLCAgIC0xNTUsICAgIDUxMiwgICAgNDYwLCAgICAyMTEsICAgLTIzMSwgICAtNjI3LAorICAgICAgLTgzNiwgIC0yMjA1LCAgIC0xODEsICAgLTExMywgICAgMTMwLCAgICAyMjYsICAgLTMyMSwgICAtNzY1LAorICAgICAtMTMyNywgIC0xMTkwLCAgIC02NzYsICAgLTM1NywgICAgNjkxLCAgICAyMzIsICAgLTM2NSwgIC0xODE4LAorICAgICAtMzAwNywgICAyMjEwLCAgICA5OTcsICAgIDYwMSwgICAyMTU2LCAgIC03ODIsICAgMTYyNiwgIC0xMDgxLAorICAgICAgIC00OSwgICAtNjE2LCAgICA2ODUsICAgIC0xMiwgICAgIDQwLCAgIDM0ODAsICAgIDU2MywgICAgNTE1LAorICAgICAgIDI0NSwgICAgIDUxLCAgICAyOTAsICAgMTIyNywgICAgMTcxLCAgLTEwNzgsICAgIDUyMCwgICAtNDgzLAorICAgICAgIDI4MCwgIC0xNTE3LCAgLTEzMzEsICAgMjEzMiwgIC0xMTc2LCAgLTEzODEsICAtMTU0NiwgICAxNDM2LAorICAgICAgLTg1MiwgICAtNTA1LCAgICA2NzIsICAgLTgwNywgICAgNjIzLCAgIC0yNDQsICAgLTEyNSwgIC0xOTU4LAorICAgICAgIDUxNiwgICAgNzk4LCAgIDExODUsICAgIDkyMiwgICAgNDQxLCAgICA2NTEsICAgLTYxMCwgIC0xNDMwLAorICAgICAtMTg4NywgICAgMTE0LCAgIC04NjksICAtMjAyNCwgIC0xNjI3LCAgLTIyNzYsICAgMjAwOCwgIC0xMjI0LAorICAgICAgIDEyNSwgICAtNjA5LCAgICAzNzEsICAtMTEwNCwgICAtNTA2LCAgIC05NDIsICAgLTYyNCwgICAtNDc4LAorICAgICAgIDE5NywgICAgMTQxLCAgIC0yNDIsICAtMTA1MSwgICAxNTMyLCAgLTEyNjksICAgIDY2NiwgIC0xMDU1LAorICAgICAgMTY4OSwgICAgNDQ0LCAgIDE3MjAsICAgICAxNiwgICAgMzAxLCAgLTIzMTEsICAgMTE5NiwgICAxMTA4LAorICAgICAgMTI5OCwgICAtNTY0LCAgLTExOTcsICAtMTg1OCwgICAgNDM5LCAgIC0xOTgsICAgIDMyNCwgIC0xODg0LAorICAgICAgMzE5MywgICAyMjgxLCAgICAyMDEsICAgIDU4NywgIC0yMDI4LCAgIDE5NjksICAtMTA4NywgICAtMzUyLAorICAgICAgIC04NywgICAtNjMyLCAgICAxNDQsICAgIDE2NSwgICAgIDY4LCAgIDExNTAsICAgIDE3MywgICAgNDc4LAorICAgICAgLTgzNywgICAtNDcwLCAgIC00NjQsICAgLTE5NSwgICAtMjA1LCAgIDIxMTEsICAgICAxNSwgICAgNjQzLAorICAgICAgLTQ1MywgICAtMzM5LCAgLTExMjgsICAtMTM2OCwgICAxMTgyLCAgICA4MjIsICAgIDY1NCwgIC0yMzMxLAorICAgICAtMTY2OCwgICAtMjE1LCAgIC02NzgsICAtMjQ2MCwgICAxMTY5LCAgIC02NjQsICAgIDc3NywgICAtMzQ4LAorICAgICAgMjU3MCwgICAtNzY3LCAgIC01NjMsICAgIDI1NCwgICAgNTYyLCAgIC01NTcsICAgICAgNCwgICAgLTk3LAorICAgICAgMTk5MCwgICAgMzczLCAgIC03ODAsICAgLTY3NywgICAxOTk2LCAgLTE1MjcsICAgLTM2NSwgICAtNDE2LAorICAgICAgLTMyNSwgICAgNTg3LCAgICA5MTAsICAtMzc4MCwgICAtNTUzLCAgICAxMDQsICAgMTcwNSwgICAgMjQwLAorICAgICAgLTcxOSwgIC0xNzE3LCAgIDI3NjUsICAgLTU4MiwgICAgLTc2LCAgICAzOTksICAtMTE1MiwgICAyMzc5LAorICAgICAgMzE2OSwgIC0xMTUzLCAgIC03MjUsICAgIC0zNSwgIC0xMjE0LCAgICAzNjIsICAgMTYwMCwgICAtNzI0LAorICAgICAgIDQyNCwgICAtNzIyLCAgICA0NzIsICAgIDg3MiwgICAgNjk0LCAgIC0xMjYsICAtMTY0OSwgIC0xMzE0LAorICAgICAtMTgxNCwgICAgLTk1LCAgIC0zMTIsICAgIC0zNCwgICAgNzgwLCAgIC04ODQsICAgIDgyNCwgICAtODY0LAorICAgICAgIDUyNiwgICAtMTAwLCAgIDM4MjAsICAgIC01NiwgICAtNDUyLCAgICAgNDMsICAgIDU2NCwgICAgNDg3LAorICAgICAgIDE3NywgICAgODkwLCAgLTE0MjMsICAgIDg5NCwgICAtNTUyLCAgIDE0MzgsICAgIDIwNCwgICAxMDE1LAorICAgICAgICAtNCwgICAgMzI3LCAgLTMzMjcsICAgLTQzMywgICAtMzM1LCAgIC04NjksICAgMTMxMiwgICAtNDg4LAorICAgICAtMTI4NywgICAtMTY5LCAgIDIwMTgsICAgIDQzNSwgICAgIDczLCAgICA1MDgsICAgMTE2MCwgIC0xMDYwLAorICAgICAgLTEzNCwgIC0xMzA0LCAgIC0zNDEsICAgIDYyMywgICAgMTI1LCAgICAtMTUsICAtMTEyMCwgICAgMTA4LAorICAgICAgIC03MSwgIC0xNDg3LCAgIC0xODksICAtMzY0MCwgICAxNDI0LCAgIDE3NDAsICAgMTExNiwgICAgNTc5LAorICAgICAgMTYwMywgIC0zMjk0LCAgIDEyNDEsICAgLTIyNSwgICAxNDgxLCAgIDI3NzUsICAgMTMyNiwgICAtMjQyLAorICAgICAgLTYzMiwgIC0xNTYwLCAgICA1NjMsICAgIDU1OSwgICAgMTM4LCAgICAxMTUsICAgLTU1NywgICAyMDA0LAorICAgICAtMTc3MSwgICAgNzE3LCAgLTEwNTIsICAtMTExNSwgIC0xNjM0LCAgICA4ODksICAgLTQ0MSwgICAxOTU0LAorICAgICAgLTE2NCwgIC0xNTA3LCAgLTEzMTIsICAgLTQwNywgICAgNjYyLCAgIC04NjcsICAgLTg5NiwgICAgMjI1LAorICAgICAgMjU3NiwgICAtMjI0LCAgIC0xMDcsICAgIDIzNywgICAtNjk0LCAgICA4NTksICAgIDE5MiwgIC0xMDMzLAorICAgICAgMjI1NSwgIC0xMjI1LCAgIC04OTEsICAtMTk5NCwgICAgLTkwLCAgICAzMzksICAgLTM4MiwgICAtNzc0LAorICAgICAgMTQ2MCwgIC0xNTUzLCAgICA2NDgsICAgLTUyMSwgICAyMzcwLCAgICAxNjAsICAgIDcxNCwgICAgIDU0LAorICAgICAgLTkwNiwgICAxNDM1LCAgLTE3NTIsICAgLTI3NCwgICAtNTIzLCAgICAtMzYsICAgMTIwOCwgICAxNTUzLAorICAgICAgLTMzOSwgICAxMDAwLCAgIC0xNzgsICAgIDIwOSwgIC0xMDAxLCAgICA5MTYsICAgIDQ5NSwgICAgMzEwLAorICAgICAgIDcyNiwgICAgMTI3LCAgIC0zOTEsICAgIDEwNywgICAtNTEzLCAgLTEwNTIsICAgLTM3NiwgICAgMjk3LAorICAgICAgLTMwNywgICAgOTMzLCAgIC0yMzMsICAgLTI1MywgICAxMTk2LCAgIDQ2MTksICAtMTI3OCwgICAgNzYyLAorICAgICAgIC0xMywgICAtMzg3LCAgIC05NzMsICAgMjE1MywgICAgIDY4LCAgICAzNjIsICAgLTg4NywgIC0xOTIyLAorICAgICAgLTEwNiwgICAgMjk4LCAgLTExMjcsICAtMjYwMSwgIC0yMTg0LCAgIC0xMTEsICAgIDExMSwgIC0xNTg4LAorICAgICAgMTAwMiwgICAtMzY1LCAgLTIyMjYsICAgLTI5MCwgICAtNTk5LCAgICA2MTAsICAgIDU1MSwgIC0xMzY4LAorICAgICAtNDM0NCwgICAgNjE4LCAgIC0xNzIsICAgIDM0OSwgICAtOTE0LCAgIC01MzAsICAgLTE5MiwgICAgNzE4LAorICAgICAgIDM0OCwgICAtNjc1LCAgIC04ODQsICAgIDkxMywgICAgLTk0LCAgICAyMTUsICAgLTgzNCwgICAgMzUzLAorICAgICAgIDc1MywgICAtODExLCAgICAtODQsICAgLTkwNSwgICAtMTI4LCAgIC00ODMsICAtMTc4MiwgIC0xMjU1LAorICAgICAtMjMzMywgIC0xMTEwLCAgICA0NzcsICAgLTU2NiwgICAgMzQ2LCAgIDIwMTgsICAtMTY0NCwgICAtMzI1LAorICAgICAgMTM2NSwgIC0xMjIzLCAgICAxNTgsICAtMTc4NiwgICAgNTY2LCAgICAyMDMsICAgIDc0MiwgICAgMjgxLAorICAgICAgLTU1NSwgICAgNTczLCAgIC05NzgsICAgLTQ1OSwgIC0xNjcxLCAgICAzNzgsICAgLTY4OSwgICAgMzQ5LAorICAgICAgIDYwNiwgIC01OTYxLCAgICA1NjIsICAgIC0xMywgICAtMjIzLCAgIC00MTksICAgLTQ0MiwgICAtNDQ3LAorICAgICAgIDEyNSwgIC0xMDUyLCAgICAgNTMsICAgMjU5NCwgIC0xMzc3LCAgICAyMDksICAtMTU0OSwgICAgNTMzLAorICAgICAgLTExOCwgIC0yNTM4LCAgIDE4MDgsICAgLTM2NCwgICAgLTM3LCAgIDEyMjEsICAgIDYwNywgICAgNTkzLAorICAgICAgIDMwOSwgICAtMjQwLCAgIDE1NzQsICAgIDI1NCwgICAgNDM0LCAgIC0xNDEsICAgLTIyMCwgIC0yMDE4LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IxMTEwc3MxW10gPSB7CisgICAgICAgNjMxLCAgIDMwNDEsICAgMTIxNSwgICAyMzc2LCAgLTE4NDMsICAgLTEwMywgICAgNzUwLCAgICAxNDQsCisgICAgICAgLTg3LCAgIC0yNDksICAgIDcxNSwgICAtMjAxLCAgICA3NTgsICAgIDIwMiwgICAtMTk3LCAgIC0xMzUsCisgICAgICAtNTIzLCAgIDEyNDMsICAgIDQ1NywgICAtNzE3LCAgIC03MDAsICAgMTY2MiwgICAgOTE4LCAgICAtNDgsCisgICAgIC0xMDA4LCAgICAxODAsICAgIDQxMSwgICAgOTQ4LCAgIDIxOTIsICAgMjYwNywgICAtODI2LCAgIC05NjIsCisgICAgIC0xMTMwLCAgICAtNTksICAtMTA0NywgICAtMzA1LCAgIC0zMjUsICAtMTAzMiwgICAyMDk2LCAgIC0yODcsCisgICAgICAgMzk1LCAgLTE1NDMsICAgLTI2OCwgIC0xMjE4LCAgLTIwNDUsICAtMTY3NCwgICAgOTUxLCAgLTE4NDYsCisgICAgICAtNjM2LCAgICAyNjMsICAgLTEzOCwgICAtMjg3LCAgIC0zMjcsICAtMjIwOCwgICAtNjY0LCAgICA0OTYsCisgICAgICAyMTc5LCAgIDE2NDUsICAgIDM0MCwgICAtNjAxLCAgICA0NzMsICAgIDY3MCwgICAgOTUwLCAgIDI3NzQsCisgICAgICAgMzY0LCAgICA2MTMsICAtMTg5NiwgIC0xODc2LCAgLTMxNzcsICAgLTEwNSwgICAgNTA2LCAgIC0xNjQsCisgICAgICAgMjgxLCAgICA3MTgsICAgMjQxOSwgIC0xMDc3LCAgICAtNTAsICAgIDM2NSwgIC0xNjMxLCAgIC0xMzQsCisgICAgICAtMzg0LCAgICAyMzEsICAgIDc2NywgICAtMjg1LCAgIDEyNjgsICAgIDMyMSwgIC0xNDA4LCAgICAyMTcsCisgICAgICAtNDA5LCAgIC03MjUsICAgMTIyNSwgIC0yNTUxLCAgLTI2MjIsICAgLTI3NCwgICAgNDczLCAgIDI3NTIsCisgICAgICAgLTExLCAgICAzNDIsICAgLTQ5NSwgICAxNjI3LCAgICAgNzksICAgIDI0MCwgICAgICAyLCAgLTEwMjEsCisgICAgICAgNjQwLCAgIC01MDgsICAgLTI2OSwgICAgNjQ4LCAgIC0xMTYsICAtMTI4MywgICAtMjE3LCAgICAgMTMsCisgICAgIC0xNjc0LCAgIDI0MDIsICAgLTg3OSwgICAxNzkxLCAgIDI3NTMsICAgMjM4NiwgICAxMTk1LCAgIC03MDAsCisgICAgICAtMjgyLCAgIC00MjgsICAgLTY3MSwgICAgLTkyLCAgIDExODcsICAgLTY3MiwgICAxMDM3LCAgLTE5MTMsCisgICAgICAgMjQ2LCAgIC04MTYsICAgIC02OSwgIC0yMjg0LCAgIC03MTIsICAgLTk5NiwgICAyNDk4LCAgICA5MDIsCisgICAgICAgODA5LCAgIC0xNDksICAgICA2NiwgICAgNzc1LCAgICAtNDQsICAgLTU2NiwgICAgOTU1LCAgLTEwNzMsCisgICAgIC0xNDM4LCAgIC04OTQsICAgLTk3OCwgICAgMjc0LCAgIC0zOTAsICAgNTUyOCwgICAxMTUzLCAgICAgMTcsCisgICAgICAtNzUwLCAgICAgNjMsICAgIDU0NSwgICAtNzI1LCAgIC0zMDEsICAgLTMyMywgICAgNjYxLCAgIC04MTMsCisgICAgICAtMzQ3LCAgICA3MzksICAgIDMzNSwgICAgMTM2LCAgICAyMDMsICAgIDM0MiwgICAgODAyLCAgIC0xOTksCisgICAgICAtODE4LCAgIC02NzksICAgLTI4MiwgICAyMTk1LCAgLTE3MTQsICAgLTc1NywgICAtMTU0LCAgICAxODIsCisgICAgICAgMTMyLCAgLTE3MzcsICAgIDQwNSwgICAyMzk0LCAgLTM3MjcsICAgMTM0OSwgICAgMjEzLCAgIC0xOTMsCisgICAgIC0yNDk1LCAgLTEzNTQsICAgLTYyOSwgIC0xMTcxLCAgIDE0MjksICAgIC0xNiwgICAgODM0LCAgLTEyNjAsCisgICAgICAgMTYwLCAgLTE4OTIsICAgIDg3NCwgICAxNzU0LCAgIC01NjcsICAgIDM0NCwgIC0zNDk5LCAgIDE2MTIsCisgICAgICAtOTg3LCAgIC00MjQsICAgLTk5NywgIC0xNjQwLCAgICA1OTQsICAgMTA1OCwgICAtNzgzLCAgICA1MTEsCisgICAgICAtNjA0LCAgLTE0ODAsICAtMTc1NCwgICAtNDI0LCAgIDIyNjIsICAtMTk5MSwgICAxMjk3LCAgIC02MzgsCisgICAgICAgMzUwLCAgIC01ODgsICAgIC01NSwgICAxNDgzLCAgIC00NTYsICAgLTU2NywgICAgMTQ2LCAgIC05NDYsCisgICAgICAgNzMxLCAgIDE1NDEsICAgLTc1OSwgICAgNTkyLCAgIDEyMzEsICAgLTI3MCwgICAgMTcxLCAgLTE5NzUsCisgICAgIC0yNzA3LCAgIC00NTYsICAgLTIyNywgICAgMzkyLCAgIC04OTEsICAgMTAwOCwgIC0xMDY2LCAgIC00ODcsCisgICAgICAgMjMxLCAgIDEzNzIsICAgIC01MSwgICAtNTk5LCAgIC0yMjcsICAgIDY5NiwgICAtODIwLCAgICAzNTQsCisgICAgICAxOTI4LCAgICAtNDgsICAtMTMwMiwgICAtNTcwLCAgICAzMTYsICAgLTI4MywgICAtODQ4LCAgIDI1NjMsCisgICAgICAtMjY2LCAgIDI4MjEsICAgIDU0MCwgICAgNTUzLCAgLTEyNzIsICAgMTEyMCwgIC0xMTY0LCAgIC00NTEsCisgICAgICAgMzg0LCAgLTEwNTgsICAtMTAxOCwgICAxNzM1LCAgICA5OTIsICAtMTIyMCwgICAgLTgzLCAgIDE0OTAsCisgICAgICAyMzA0LCAgICAxMjIsICAgMTYzMCwgICAxMTA4LCAgIDE5OTcsICAgMjM0NiwgICAtNjQ3LCAgICAzMDEsCisgICAgIC0xNzQ2LCAgIC0yMTgsICAgIDMxMywgICAgNDYyLCAgIDE0ODYsICAgLTUzNiwgICAtNTA4LCAgIC00NjMsCisgICAgICAgMTA0LCAgICA5MzAsICAgIDYwNSwgICAyMTE2LCAgICA3OTMsICAgMjg4MSwgICAtNzI0LCAgLTEzNzksCisgICAgICAgLTUzLCAgIDQ0NTgsICAgIDc5MywgICAgMjc1LCAgIC0xODAsICAgLTUxNiwgICAtNDg5LCAgIC03NzQsCisgICAgICAtMjY1LCAgICA3MDQsICAgIDExMiwgICAgMTc1LCAgICAxMTIsICAgLTEyMSwgICAgNjUyLCAgICAzMTAsCisgICAgICAgNTY0LCAgIC00NDAsICAgIDc3MywgICAxODg1LCAgICA5MjcsICAgLTY3MiwgICAtNzczLCAgIDE3MjYsCisgICAgICAtNjE0LCAgICA4MTgsICAgMTU4OSwgICAtMzcyLCAgIC0yMDcsICAgIDQ5OSwgICAtODk0LCAgICA5ODcsCisgICAgICAgNzk2LCAgICA2NTIsICAtMTIyOCwgIC00MDEwLCAgLTIyMDgsICAgIDQ1OCwgICAgNjQ1LCAgICA0OTgsCisgICAgICAtMjc5LCAgIC04NTIsICAtMTg5NywgIC0xODIwLCAgICAtMzUsICAgIDY3NCwgICAgMjAxLCAgICA0NzQsCisgICAgICAgIDc3LCAgICAgOTQsICAgMjMyNywgICAgNzIzLCAgLTEwODEsICAgIDI2MSwgICAgMjA5LCAgIDExNzksCisgICAgIC0xMTc1LCAgICA2MjMsICAtMTI5MywgICAyMTU0LCAgIC0xMTcsICAtMzcwNywgICAgOTQwLCAgICA4MTMsCisgICAgIC0xMDU5LCAgIC0zMzUsICAgMTMwNiwgICAgNTI1LCAgIC0xOTEsICAtMjA2NiwgICAtNDI1LCAgICAgMTksCisgICAgICAtMzY2LCAgICA1MjksICAgLTE0NSwgICAgODIyLCAgIC05MTMsICAgIDI1NCwgICAgNDI0LCAgIC0zNTQsCisgICAgICAtMTY3LCAgLTI0MzcsICAtMTQzMywgICAgNjAzLCAgIC0zMTgsICAtMTUxNywgICA0MjUwLCAgICA1NDEsCisgICAgIC0xMzYwLCAgICA0NTAsICAgLTUzMSwgICAgMjAwLCAgICA1MzQsICAgMTIwMCwgICAtMjIyLCAgIC01MzUsCisgICAgICAtMTYyLCAgLTEyMTEsICAgLTExNiwgICAtMTQ0LCAgIC00NjIsICAgLTEzOSwgICAtNDgyLCAgICA1MTEsCisgICAgICAyMDY4LCAgLTIxMDAsICAgIDk3MSwgIC0xNDg3LCAgLTEwNTAsICAtMzE1MCwgICAtNzAxLCAgICAxMTksCisgICAgICAgIDE2LCAgIDE1MzUsICAgIDI3MiwgIC0xMTg0LCAgIDIyNDIsICAgIDQ4OCwgICAtNDkyLCAgIC05MTUsCisgICAgICAxNjYwLCAgICAyMTIsICAgLTgyNiwgICAtNDQ0LCAgIDEwMDMsICAgMjcwNSwgICAzNTkxLCAgIC0xNzQsCisgICAgICAtMzMzLCAgIC00MzEsICAgIC01OSwgICAtOTAzLCAgICAgNjEsICAgIDc1MSwgICAxMDg3LCAgICAtNDUsCisgICAgIC0xMDMxLCAgICA2MTcsICAgIDY4NiwgICAgLTE1LCAgICA4NDgsICAgLTM0OCwgICAgOTQ3LCAgICAzOTYsCisgICAgICAgOTMxLCAgIDE3ODUsICAgLTU1MiwgICAtOTIwLCAgIC02NjksICAgIC02MywgIC0xODY5LCAgIDIzNTcsCisgICAgIC0xNTQ5LCAgICA4MDcsICAgIDg4OSwgIC0xNTgxLCAgLTEwNzEsICAgMTU4NywgIC0xMTA4LCAgIDEzMDAsCisgICAgICAtNjU4LCAgIC02MjUsICAgIDMwMCwgICAtMjg1LCAgIC05NzcsICAgMTY1NiwgICA0MTgzLCAgIDE0ODcsCisgICAgICAtMTkxLCAgICA2NTgsICAgLTMwMCwgICAgNDk3LCAgIDEzNzgsICAgLTMwMCwgICAxMDMxLCAgICAzMjIsCisgICAgICAgMTE0LCAgIC00NDksICAgIDY2NiwgICAxMjUwLCAgICAyNjQsICAgIDEyNSwgICAtMTA5LCAgICA3NDgsCisgICAgICAtNTAzLCAgICAtNDAsICAgIDE5OSwgIC0xMjEyLCAgLTE2NDMsICAtMjUyMiwgICAgMTUxLCAgICAxMjEsCisgICAgIC0xMTI4LCAgLTMyMDAsICAgIDg3NiwgICAtNDQ2LCAgICA4NzgsICAgLTk4OSwgICAxNTEwLCAgIDIyNjEsCisgICAgIC0xNTA3LCAgIDE3OTMsICAgLTQwMiwgICAgIDMwLCAgICAyMjgsICAgIC01MCwgICAgOTg1LCAgLTE1NjgsCisgICAgICAgNzU1LCAgIDE1NTksICAgLTY4OCwgICAxMzQyLCAgIC00MjMsICAtMTUwNywgICAgIDk2LCAgIC01MDEsCisgICAgICAgNDc0LCAgLTI5MjYsICAtMjQ5MywgICAtMTMxLCAgIC02NTYsICAgIDQ1MCwgICAxMDM1LCAgICA4MTIsCisgICAgICAgLTE0LCAgIC05MzMsICAgIDk0MSwgICAxMzk2LCAgIC05NTcsICAgLTYyMSwgICAtNTE2LCAgICAzNzksCisgICAgICAtMjI1LCAgLTIwNjMsICAtMjA0OCwgICAgNjY5LCAgICAyODcsICAgMTY4OCwgICAxNzI3LCAgICAyOTksCisgICAgICAtNjU4LCAgICA4NTIsICAgIDc0NSwgICAtMjYwLCAgICA5OTMsICAgIDE1OCwgIC0xMjM2LCAgLTE0MjIsCisgICAgICAgIDMzLCAgICA2MTEsICAgLTExMiwgICAtMzIzLCAgIC0xOTQsICAgIDgzOSwgIC0xNDA3LCAgLTE1MDUsCisgICAgIC0yMDEwLCAgIDEyNjcsICAgLTM1NSwgICAtNjc1LCAgLTM3NzksICAgIDc2OCwgICAtMjI4LCAgIC02NDMsCisgICAgICAgNjYxLCAgIDEzMTMsICAgLTUyOSwgICAgOTYyLCAgIC05NDgsICAgLTIxMiwgICAxMDQzLCAgIDE1NjAsCisgICAgICAtMTc0LCAgIDE3NDQsICAgLTkzOCwgICAgMjg5LCAgIDE5NDIsICAtMjIyOCwgIC0xOTMyLCAgIDEwNTYsCisgICAgICAtNTkwLCAgIC05NDAsICAgIDkyMiwgICAgNjAxLCAgIC04NTMsICAgLTc5MSwgICAtNjM3LCAgICAgLTIsCisgICAgICAgLTUyLCAgICAtODMsICAgLTIwOSwgICAxNDIyLCAgICA4NTYsICAtMTE0MSwgICAyNTAwLCAgLTExOTUsCisgICAgICAgNzczLCAgIDEwODcsICAtMTM4OSwgICAgNDA5LCAgICA0MzksICAtMzY3NCwgICAgNDUzLCAgIDE2MzcsCisgICAgICAgLTE1LCAgIDEwMTMsICAgMjYzNSwgICAxNTMwLCAgLTExMDQsICAgIDQ0MCwgICAgODk1LCAgIC0yMTAsCisgICAgICAxMTE4LCAgICAgLTYsICAgICA0NSwgICAgIDY1LCAgLTExMTAsICAtMzMwNywgICAtMzMxLCAgICA0NzgsCisgICAgICAtMTU1LCAgIC00MTAsICAgLTcyMSwgIC0xMjM0LCAgICAxMjksICAgLTk3MSwgIC0xMTE3LCAgICAtMjcsCisgICAgIC0xMTMyLCAgLTEyODksICAgMTg4OCwgIC0xMTEyLCAgICAyMDMsICAtMTA5MSwgICAgNDQyLCAgLTIyMDcsCisgICAgICAgNTAxLCAgIC0zNDMsICAgIDQ2OCwgICAgLTUyLCAgICAzODUsICAgIDI2OSwgIC0zMTAyLCAgIC0zNjYsCisgICAgICAtNDY5LCAgICAzOTEsICAgIDUwNSwgICAgMTc2LCAgICAzNTYsICAgIC02OSwgICAtOTI5LCAgIDExNTUsCisgICAgICAtMjgwLCAgLTEyNjQsICAgLTg5NywgICAxMDA2LCAgIC00OTQsICAgIDE1NSwgICAgIDM2LCAgIC02MjcsCisgICAgICAgOTI0LCAgIC04MTYsICAgIDE1NCwgICAtNzUwLCAgIC04MzcsICAgNTI2MywgIC0xMDk5LCAgICAgOTEsCisgICAgICAtNDgxLCAgICAgNzEsICAgLTY4MSwgICAtNTc0LCAgIDEyMjksICAgIDY3NSwgICAxMjE3LCAgIDEwNzMsCisgICAgICAtNjk1LCAgICAyNzQsICAgLTM4MSwgICAtMTQwLCAgIDEzNzIsICAgLTUyNCwgICAxMTY0LCAgICAzNDEsCisgICAgICAtMTQ5LCAgIC04NTYsICAgIDc5MywgIC0xMjk0LCAgICA5ODEsICAgLTk2MSwgICAgMzcxLCAgIDExNzgsCisgICAgICAxNDYzLCAgICAzNzMsICAgMTM3NSwgIC00Mzg0LCAgICAyMzksICAgIDEzNiwgICAgIDY3LCAgLTExOTYsCisgICAgICAtMTI2LCAgLTEwMDEsICAgLTIyOCwgICAgMTUwLCAgICA0MzcsICAtMTgzMCwgICAgNDc3LCAgICA0OTgsCisgICAgICA0MjQ2LCAgICA3OTMsICAgLTY2MSwgICAgMjYwLCAgLTE4MTAsICAgMTQwNSwgICAgIDc2LCAgICA5MDIsCisgICAgICAtODQ0LCAgICA5MDgsICAgMTgzMCwgICAgIDI3LCAgIC0xMjQsICAgIDI1NywgICAgNzY1LCAgICAtOTgsCisgICAgICAgNTkyLCAgICA0ODcsICAgLTEzMiwgICAgMjAyLCAgICA2NzUsICAgLTY2OSwgICAtNjc5LCAgIDEzMDksCisgICAgIC00MDAyLCAgIC0yMDYsICAgIC02NiwgICAtMzkwLCAgIC0yNTMsICAgLTE5MCwgICAtOTIxLCAgICAtODMsCisgICAgICAxNDExLCAgIC00MTcsICAtMjU2MCwgICAtNjQ2LCAgIDE4NTMsICAgLTE0OCwgICAgNTQ4LCAgIC0zNzAsCisgICAgICAtNzIzLCAgICA5NTksICAgLTkwNiwgIC0zMDU4LCAgIC0yNzYsICAgIDQ2NywgIC0xMjgwLCAgICA5NzAsCisgICAgICAgNjg3LCAgICA0ODQsICAgIDUwNiwgICAxMTQzLCAgLTE1MDksICAgIDgyOCwgIC0yMTY5LCAgIDI5MzEsCisgICAgICAxMzIyLCAgIC01NzksICAgMTAzMywgICAgMjA5LCAgIC05NzksICAgIDIxNywgICAtNDM0LCAgLTE0MzgsCisgICAgICAgMzE0LCAgIDIzODQsICAgLTkwNiwgICAgLTI5LCAgLTE0NzgsICAgIC0zMSwgICAgNTc0LCAgIC0zNzMsCisgICAgICAxNDc4LCAgIC0xMjQsICAgLTY4MCwgICAgMzMwLCAgICA3OTQsICAgLTc1MywgICAtOTc3LCAgIDExNTEsCisgICAgIC0xMTkwLCAgLTE0NzksICAgLTY0MiwgICAxNjU4LCAgLTIyMDEsICAtMTQ2OSwgICAxNTg5LCAgICA1ODcsCisgICAgICAgIDUyLCAgIDEyOTgsICAgMjA5MiwgIC0xNDgzLCAgICA2NzgsICAgMTk4OCwgICAgOTE4LCAgIC02NDgsCisgICAgICAgMzI4LCAgIDIwOTYsICAtMTA5MCwgICAyMTUzLCAgLTE0MTYsICAgIDI5NSwgICAgNTM3LCAgICAyNjEsCisgICAgICAgMzk4LCAgLTEzODksICAgLTM5OSwgICAxMTA1LCAgICAgMTAsICAgLTM5NSwgICAxMTY5LCAgIC00MzEsCisgICAgICAtNDIzLCAgLTE2MTcsICAgIDc2NiwgIC0xOTAwLCAgLTMyMDUsICAgIDEzMSwgICAtNzQ2LCAgIC04NTIsCisgICAgICAyMjE1LCAgIC0zMTcsICAgLTIzMiwgICAxMDc5LCAgICAyOTMsICAgLTcyNywgICAgIDUwLCAgIC00NDYsCisgICAgICAtNzEzLCAgIC04OTcsICAgIDc2OCwgICAtODk2LCAgIC02NjcsICAgLTI4MSwgICAgMzc3LCAgICAxMTUsCisgICAgICAxNjk1LCAgLTQ4NzAsICAgIDcxMywgICAtMzkzLCAgICAyNTEsICAgMTI2OCwgICAgNDc3LCAgIC00OTcsCisgICAgICAgMjk0LCAgICAgMTgsICAgLTM1OSwgICAgNTU2LCAgICAzMDgsICAgLTc1MiwgICAtODYzLCAgIC0yMTYsCisgICAgICAgMTUxLCAgIC0xNjMsICAgIDY5NSwgICAgNTg3LCAgICA4MTAsICAgMjEwNywgICAtMTA3LCAgICA5MjEsCisgICAgICAxMjAzLCAgIC00NzIsICAgMTI4MCwgICAgMzcyLCAgICAxMTAsICAgLTU4MSwgICAtMjI1LCAgIC03MTQsCisgICAgICAgLTU4LCAgLTI1ODcsICAtMTk4MCwgICAtMTg2LCAgIC0zNzIsICAtMTQxMCwgIC0xNTA0LCAgLTEwMjAsCisgICAgICAtNzQ1LCAgICAtODgsICAgMjM3MywgICAtNTY4LCAgLTI4NDEsICAtMjA0MSwgIC0xODQxLCAgIDIwNjUsCisgICAgICAgMzg5LCAgIC00MzAsICAgMTE2MywgICAtMjA4LCAgICA1NjksICAgIDM3NSwgICAgNjUwLCAgICAzMTcsCisgICAgICAxMTE0LCAgLTEwMzYsICAgLTk1OSwgICAtODk2LCAgIDEwNjAsICAgMTAxNCwgICAtNTk5LCAgLTE3NDMsCisgICAgICAxMTIxLCAgICA4MDgsICAgMTU1NiwgICAgMzI2LCAgLTI4NzYsICAtMTU1NiwgIC0xMjgzLCAgICAzODQsCisgICAgIC0xMTAyLCAgICAzNzgsICAgMTQzMywgICAgNzAyLCAgIDE0NTQsICAtMTI0MywgICAtNzI1LCAgICAyMjQsCisgICAgICAtNjEwLCAgIC00NTUsICAgMTQxMywgIC0xNzQ3LCAgLTI1MTYsICAgLTU3MiwgIC0xNDU1LCAgIC0zMTMsCisgICAgICAgMjMxLCAgICA3ODAsICAgMTUzMSwgIC0yNDc1LCAgICAtMzQsICAgIDkyMSwgIC0xNjUwLCAgICAyNjksCisgICAgICAgODE4LCAgICAgIDUsICAgIDgzNSwgICAtMjA5LCAgIC05MTEsICAgLTQzMiwgIC0xMTA0LCAgICAxNjUsCisgICAgIC0xNjM4LCAgICAtNDYsICAtMjAzMSwgICAtNDQ1LCAgIDEzMDgsICAgMTUxOSwgIC0xOTkyLCAgIDE2MDYsCisgICAgICAgOTU2LCAgICA3NTcsICAgMTEzOSwgICAgMTE2LCAgICA4MjksICAtMTM3NiwgICAgMjA5LCAgIC04OTMsCisgICAgICAgOTYzLCAgIC01NjksICAgLTQ2NiwgICAtMTg1LCAgLTEzNDUsICAgMTUyNCwgICAxNzE0LCAgICAyNjksCisgICAgICAgMjE5LCAgIC0xNjEsICAgIDQ4MiwgIC0xMTc4LCAgLTM2MjEsICAgLTgzMSwgICAtNjY4LCAgIDE4NzEsCisgICAgICAtNTI5LCAgIC05ODMsICAgIDU1OCwgICAtODE4LCAgICAgODEsICAgIDU1NSwgICAgIDMzLCAgIC00NzMsCisgICAgICAtMTg3LCAgICAxMTMsICAgIDg5OSwgICAtNTc3LCAgLTEwOTMsICAgMTQwOCwgICAgOTAyLCAgIC0yNTgsCisgICAgICAtMTExLCAgIC02NDgsICAgNDM0MCwgICAtNzgwLCAgIC02NTEsICAgIDc4OSwgICAgLTkyLCAgIDIzMTAsCisgICAgICAtNDAxLCAgICA2NjksICAgLTIxMywgICAgMzY5LCAgIC0xMDQsICAgLTgyMCwgICAtMjkwLCAgICAgNDgsCisgICAgICAtOTE3LCAgICAgNzEsICAgMTA3MCwgICAtMjM5LCAgIC03NDQsICAgIDg5MSwgICAgIDIzLCAgLTUxMzAsCisgICAgICAtNzYxLCAgICAzMTIsICAgIDMxOSwgICAgODQyLCAgICAyODAsICAgICA3OCwgICAtMTQ5LCAgICAzNTIsCisgICAgICAtNTk0LCAgIC0zNjEsICAgIDM1NCwgICAtOTA2LCAgICAgNDIsICAtMTYxMCwgICAgODM1LCAgICAxNTcsCisgICAgICAtNjMxLCAgIDExMDAsICAgLTI5NywgICAxMDgxLCAgICAtOTYsICAgIDQ4NCwgICAtODI1LCAgLTIxMzIsCisgICAgICAgNTQ5LCAgIDEzMDUsICAgIDEyOCwgICAtMzE0LCAgLTE3MzMsICAgLTI2NSwgICAxMjg1LCAgLTQwNjEsCisgICAgICAtMzQ4LCAgIC0xMzYsICAgLTk0MCwgICAtNTA3LCAgIC0yMzIsICAtMTUxMSwgICAtODc2LCAgICAgNzgsCisgICAgICAyMTIwLCAgICAxNzUsICAgMjIxNiwgICAxMTc5LCAgICA0OTcsICAgIDMzNSwgICAgMzUwLCAgICAtMTgsCisgICAgIC0xMzA3LCAgIC0zODcsICAtMjIwNywgICAgNTg3LCAgIDMyMDksICAgLTM3MCwgICAxMTU1LCAgIDE1MDEsCisgICAgIC0xNjg3LCAgIC03OTYsICAtMTQxNywgICAtNzMzLCAgIC0yNjksICAgIDgwMSwgICAgIDgzLCAgIDExNzMsCisgICAgICAgNzE4LCAgLTI3MDIsICAgICAxOSwgICAtMzE1LCAgIDQ1MDEsICAgMTAyNSwgICAtMzY1LCAgICAzNDgsCisgICAgICAtNDE3LCAgIC01MTAsICAgLTE3MiwgIC0xMjAxLCAgIDE0NzgsICAgIDY3MSwgICAxOTMzLCAgIDE3NTksCisgICAgICAgNjc2LCAgICA0MTYsICAgICAzMCwgICAgNDAwLCAgICA1MzEsICAgIDM1MSwgIC0xMTc2LCAgLTI4MDcsCisgICAgICAxOTY5LCAgLTEzOTgsICAgMTE1OSwgICAtNTY4LCAgICA3NTQsICAgLTE0OSwgIC0xODgwLCAgIC0yNzQsCisgICAgIC0xMjAzLCAgICAtNDMsICAgMTM5MSwgICAgMzgzLCAgICA3MDIsICAgMjExNiwgICAxMjk5LCAgIDE5NTIsCisgICAgICAgNjQ2LCAgIC03MTksICAgMTczNSwgICAtOTg2LCAgICAxMDAsICAgLTk1NiwgICAxMDQwLCAgIDIyODcsCisgICAgIC0xNjA2LCAgICA2MTIsICAgMTc2MCwgICAgNzMzLCAgLTI0NTMsICAgIDUzMSwgICAgLTE0LCAgICAgLTEsCisgICAgIC0zMjE0LCAgLTE5OTMsICAgIDM3MSwgICAgMjI3LCAgICAgNDUsICAgMjAxMSwgICAtNTMxLCAgIDEwODksCisgICAgIC0xMDI5LCAgICAyODIsICAtMjQyNiwgICAtNTI1LCAgICA5ODksICAgLTQ2OSwgICAgMjg1LCAgIDE3ODcsCisgICAgICAgOTI3LCAgIC0zMzUsICAgMTEyNywgICAtMzA1LCAgIDExNDMsICAgLTQxMiwgIC0xNjI2LCAgIDE3NTksCisgICAgIC0yNTY3LCAgICAtODIsICAgMTE3MCwgIC0zMDUxLCAgIDEyNjYsICAgMTUyMiwgICAtMTI0LCAgLTE5MzUsCisgICAgICAgNTUyLCAgIDExMjIsICAgIC01MSwgICAgMzQ3LCAgIC02NzQsICAgLTM2MCwgICAxMTgzLCAgICAyMjMsCisgICAgICAzMDE1LCAgICA5NTUsICAgLTgyNiwgICAxMTA4LCAgIDIzMjUsICAgIDg2OCwgICAxMTUyLCAgIDEwNzksCisgICAgICAgMjIzLCAgICAyMTcsICAgLTQyOCwgICAgMzgyLCAgICA2NDIsICAtMjg0OSwgICAtNzY3LCAgICAtNzAsCisgICAgICAgNDA3LCAgICAxNDcsICAgLTM5MiwgICAtNDA3LCAgICAtNTUsICAgLTUwOCwgICAxNzg1LCAgIC02ODMsCisgICAgICAtODg1LCAgICA4NTEsICAgMzg3OSwgICAgNDcxLCAgIC02NzQsICAgLTIzMSwgICAxNDkzLCAgIDE2MjEsCisgICAgIC0xNjk4LCAgICA1MjgsICAgIDYyMywgICAgMzAwLCAgIDEzNjcsICAgLTU4OCwgICAgODE2LCAgICAtMjQsCisgICAgICAgNjAwLCAgIC0xODIsICAgLTg0MSwgICAgODU0LCAgICAzNzAsICAgIDcxNSwgICAgMTE2LCAgICA3MTQsCisgICAgIC0xMzA4LCAgIDE0MzUsICAgMTgwMiwgIC0yNjI3LCAgIC04MTQsICAgIDM2MywgICAtMzE4LCAgICAtNzMsCisgICAgICAgODUwLCAgLTE3NDQsICAgMjUwOSwgICAtMzAzLCAgIDEwNzcsICAgIDY2MCwgICAyMTQ1LCAgIDIxMzAsCisgICAgICAtNzMwLCAgICAtODgsICAgLTExNSwgICAtNTE3LCAgIC0xNTQsICAgIDE2MCwgICAtMzM3LCAgICAgMjcsCisgICAgICAxNTAyLCAgICA1MDksICAgIC03MCwgICAgNTAyLCAgICA4MjAsICAgLTMwOSwgIC0zNzQwLCAgLTEyOTQsCisgICAgICAtNjEwLCAgICAyNDEsICAgLTY2MiwgICAtNTI0LCAgIDEzMTksICAgIDQ1NiwgICAgOTI2LCAgICA5NTgsCisgICAgICAtMTExLCAgLTEwMDQsICAgMTc5NSwgICAtNjA0LCAgIDEwODYsICAgIDQ2MiwgICAtMTI3LCAgIC0xMjUsCisgICAgICAgMjY0LCAgLTEwOTMsICAgMTQyNywgICAgMzM0LCAgICA4MzgsICAgMTk3OSwgICAtNTc2LCAgIDMwNTIsCisgICAgIC0zNTkwLCAgIDE2MDcsICAgIDM1NiwgICAgNzI4LCAgIDE2MTksICAgLTQwMCwgICAgMjc5LCAgICA1NzAsCisgICAgICAtNDM0LCAgICA3NzcsICAtMTQ0OCwgICAtODg4LCAgICAxNTYsICAgLTI3NywgIC0xNTI5LCAgIDExMjIsCisgICAgICAyMjM1LCAgIC03OTQsICAgMzQxNywgICAtODMwLCAgICAtODIsICAgLTY2NCwgIC0xODM3LCAgICA5NDYsCisgICAgICAtMzcwLCAgIDE0MzQsICAgIC01MCwgICAgNzQyLCAgLTIzNjgsICAgMTQzOCwgICAxMjY0LCAgIDExNzIsCisgICAgIC0xMzM4LCAgIC0xMDgsICAgLTIyNiwgICAtOTU4LCAgLTIxMzAsICAgICAtMiwgICAgOTE3LCAgICA4OTYsCisgICAgICAxNTYzLCAgIDIxODEsICAgMjY4NCwgICAyMzQzLCAgICAyMzcsICAgLTQwNywgIC0yNjg1LCAgIDE0NDcsCisgICAgICAxMDI4LCAgIC03MjgsICAgIDEwOSwgICAtNjIwLCAgICA0NzgsICAgICA0NiwgICAtNTQyLCAgIC03ODksCisgICAgICAtODc5LCAgIC00MzgsICAgMTI0NCwgICAxMDc1LCAgLTE3MzAsICAgIDExOSwgICAtNjk0LCAgICAxMzcsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjExMTBzbTBbXSA9IHsKKyAgICAgICA5MTYsICAgLTI2OSwgICAgLTQ0LCAgICAzNDMsICAgIDYyMywgIC0yNTEyLCAgIC0xNzEsICAtMTkwNCwKKyAgICAgIDEwMDEsICAgMjc3NiwgICAgMjI2LCAgIDE0ODcsICAgIDcwNSwgICAgNzYzLCAgIC02MTYsICAgIDI4OCwKKyAgICAgIC0yMTIsICAgLTUzNSwgICAzMDgwLCAgIC0zNTIsICAgLTM2NywgICAgNTEyLCAgIC02NzMsICAgIDYyMCwKKyAgICAgIC04NzQsICAgIDc2OSwgICAtOTU2LCAgICA0NjAsICAgLTYwMSwgIC0yNzkzLCAgIC0xMDIsICAgLTc2NSwKKyAgICAgIC00MzEsICAtMTM2OSwgICAgMTQ5LCAgICA0ODEsICAgIC00OSwgICAgMTA5LCAgIC00MTIsICAgIDY3MCwKKyAgICAgIC02MTUsICAgIDI4NywgICAgMTUwLCAgICAzMjEsICAtMzI5MywgICAtMjM3LCAgLTE2MjcsICAgIDE4OCwKKyAgICAgIDE4NjcsICAgMTQ4MSwgICAgMzUzLCAgIC0xMzQsICAgMjcwNiwgICAgMTQ3LCAgICAgNzQsICAgIC03NywKKyAgICAgIC0xNDgsICAgLTIyNCwgICAgMTk2LCAgICAtNjAsICAgIDE3OSwgICAgMTI1LCAgICAtMTMsICAgMTAxMSwKKyAgICAgIC0xODksICAgLTE3MiwgICAgNjU4LCAgIDQ0NDEsICAgLTU0MCwgICAgNTMxLCAgICAyMzksICAgLTMyOSwKKyAgICAgIDI3ODIsICAgIDM5MiwgICAgIDk3LCAgIC02NjAsICAgMzQ4OCwgICAgLTc4LCAgIDEzMDgsICAgLTU3NCwKKyAgICAgIC05MDMsICAgLTE3MCwgICAtMjc5LCAgICAxNzMsICAgIC03MCwgICAgNjAxLCAgIC0zODUsICAgIDEyMywKKyAgICAgIC00MjMsICAgLTUxMiwgICAtMTkzLCAgIC0yMzMsICAgIDEwNiwgICAgMTc1LCAgICAyMTAsICAgIDE4NSwKKyAgICAgICA0ODksICAgLTIzNiwgICAgMTUzLCAgIC02NzAsICAgICAyNSwgICAgIDYxLCAgIC0xOTYsICAgIDIxMywKKyAgICAgICAgNjcsICAgIDMzOSwgICA1NDQzLCAgICAxMTYsICAgLTY0NywgICAgMTQ5LCAgIC0xMzAsICAgIDE5NywKKyAgICAgICAtMTEsICAgIDMwNSwgICAyNjY5LCAgIDEyMTIsICAgIDI5OCwgICAgIDg0LCAgICAyMTksICAgIC0yNiwKKyAgICAgIDI2NjEsICAgIDY1MCwgICAxMzQ4LCAgICAtNjUsICAgIDU3NCwgIC0xNDgyLCAgIC0yNjgsICAgIC0zMCwKKyAgICAgICA2MjYsICAgIDMyOCwgICAgMjc5LCAgIC0yNDUsICAgICA4NywgICAgIDk0LCAgIC0yMDIsICAgICAgMiwKKyAgICAgICAzNjYsICAgLTUwNSwgICAtNTkyLCAgICAgIDIsICAgNTY2NiwgICAgMzg0LCAgICAgMjIsICAgIDIyNywKKyAgICAgICAyMDgsICAtMTIyMSwgICAgIDc4LCAgICAxNTUsICAgIDI2MCwgIC0xMTExLCAgICAxNjUsICAgIDM5NiwKKyAgICAgIC02NzgsICAgLTczOSwgICAyNTAzLCAgLTIzOTUsICAgMjAyNSwgICAxNDI0LCAgIC0zNDMsICAgLTc1OSwKKyAgICAgIC04MzcsICAgIDEwMSwgICAgIDU1LCAgICAyNzQsICAgLTQ4MSwgICAgIDIyLCAgIC01NjgsICAgMTA0NCwKKyAgICAgIC0yNzEsICAgLTEyNCwgICAtNjA5LCAgIC04MzMsICAgLTIwNiwgICAgIDUzLCAgIC01OTEsICAgMTE1MCwKKyAgICAgLTE5NTAsICAtMjg3NSwgICAxOTQ5LCAgICAgNTksICAgLTMzNCwgIC0zMjMwLCAgICAxNzYsICAgMTEzMywKKyAgICAgIC0zNzIsICAgMjkzNywgICAtODAzLCAgIC02NjMsICAgIDYzMSwgICAtNjU5LCAgICAtMzIsICAgIC04MiwKKyAgICAgICA4NTEsICAgIDExMywgICAgLTYwLCAgIC02MjUsICAgIDU1NiwgICAgMTc3LCAgICAxMTIsICAgLTc1MywKKyAgICAgICAtMzMsICAgIDMxMywgICAgLTMzLCAgIC0yMDgsICAgLTE3NywgIC01NDk2LCAgICAgNTUsICAgLTUzMywKKyAgICAgIC04MTUsICAgIDEyMywgICAtNzU1LCAgIC0yMTUsICAgIDYzOCwgICAgMjIzLCAgIC0xNTYsICAgLTkxNywKKyAgICAgIC0xNjYsICAgIC0zMywgICAgNTA0LCAgICA3MDQsICAtMzAwMSwgICAgMTI0LCAgIC0xNTMsICAtMTgwOSwKKyAgICAgIC05NzcsICAgLTcxNywgICAxNzE4LCAgICA0NzYsICAgIDIxMiwgICAxNjYxLCAgICA5NTMsICAtMTQyMiwKKyAgICAgLTEwMTQsICAgIC05NCwgICAtNTI0LCAgLTI1NjIsICAgLTI2NywgICAgMzcxLCAgICAxMDQsICAgIC02MywKKyAgICAgIC01NDYsICAgIDI2MiwgICAgMTkzLCAgLTE3MTQsICAgIDI2MSwgICAxODY3LCAgICA3MzgsICAtMTg3OCwKKyAgICAgICA0MDAsICAgMTc1NCwgICAtNDQ1LCAgIC00MDUsICAgLTg0MSwgICAtNDM5LCAgICA3MDksICAgICA0NCwKKyAgICAgICA2NzUsICAgIDI0OCwgICAgNjQwLCAgIC0xMzgsICAgMTIxNywgICAgMzkzLCAgLTE0MDIsICAgIDY1MywKKyAgICAgIDMxMTAsICAgLTkzOCwgIC0yNDkxLCAgIC02ODgsICAgMTIxNCwgICAtNjQ5LCAgLTEzNTYsICAgMjUwNiwKKyAgICAgICAyMDMsICAgIDE3MiwgICAgNjc5LCAgIDEwMDMsICAgIDc3MiwgIC0zMDEwLCAgICAgODIsICAgLTk5OCwKKyAgICAgIDEwMTEsICAgLTk4MCwgICAgLTI4LCAgIC0xMzgsICAgLTQzMCwgICAgNjE0LCAgICA0MjcsICAgLTM0MSwKKyAgICAgICAyMDEsICAtODA4MiwgICAtMTE4LCAgICAyMjQsICAtMTE2NywgICAgMTk1LCAgIC05MjAsICAgLTM1MiwKKyAgICAgIC02NTcsICAgICAgNSwgICAgIDQ2LCAgICAtMzksICAgIC03MiwgICAgNjk4LCAgIC0xMzYsICAgIC00MCwKKyAgICAgICAzOTEsICAgIDI4NywgICAgMTU3LCAgLTExOTcsICAgIC02MCwgICAyODA4LCAgIC0xMjMsICAgIDQ4OSwKKyAgICAgICAxNTIsICAgMjMxOCwgICAtODA1LCAgICA5NTgsICAgICA5OCwgIC0xNDk2LCAgIC04MzUsICAgLTg0NiwKKyAgICAgICA1ODksICAgIDQ1NSwgICAtODY4LCAgICAyNDUsICAgIC0xMCwgIC01MDQ3LCAgICAgMTIsICAgIC01MCwKKyAgICAgIDEyNzcsICAgIC05NSwgICAgNDU2LCAgICAtNDksICAgIDU3MCwgICAgNjA4LCAgIC02NTgsICAgLTM1MiwKKyAgICAgIC0yNzcsICAgLTI2OCwgICAgMjE0LCAgICAzODgsICAgMTg2NSwgICAgICAyLCAgIDMwMzMsICAgLTI2OSwKKyAgICAgICAyNTksICAgIC03NSwgIC0zNDM3LCAgICA4MDAsICAgLTE5MCwgICAgNjY4LCAgIC0yNjMsICAgLTExMSwKKyAgICAgICAyMjksICAgIC00MywgICAtMTM5LCAgICA2NTksICAgLTI5MCwgICAgNzgyLCAgICAtMTgsICAgLTg1NCwKKyAgICAgICAyNzEsICAtMjIyMywgICAgIDMwLCAgIC0xNjIsICAgICA3MSwgICAgIDQ3LCAgICA3NTYsICAtMTI2OSwKKyAgICAgICAzMzYsICAgIDg2MywgIC0xOTk4LCAgICAtMTYsICAgMTE3MiwgICAgMjM2LCAgICA5MjksICAgLTQ3NywKKyAgICAgLTI0NDYsICAgIC05MiwgICAtNDI1LCAgIC0xOTMsICAtODE5MiwgICAgMzIxLCAgIC0xMDIsICAgICA4NSwKKyAgICAgICAtODUsICAgIDEwOCwgICAgMzE4LCAgICAxNDksICAgIC0yNywgICAtMTgyLCAgICAgNjksICAgLTIzNywKKyAgICAgICAgMzUsICAgIDQ1MSwgICAtMjYzLCAgIC04OTAsICAgLTM0OCwgICAtMjk1LCAgICAgNjQsICAgIDQxMCwKKyAgICAgIDY0MjcsICAgIDU2OSwgICAgNjA0LCAgICA1NDMsICAgICAzOCwgICAgIDMxLCAgICAtMTUsICAgIDE0OCwKKyAgICAgICAyNDksICAgIC04MywgICAgLTY3LCAgICA0NTcsICAgIC03NiwgICAtNTYwLCAgICA2OTQsICAgLTc5NywKKyAgICAgICAxOTAsICAgLTExMywgICAyMDA2LCAgICAxMzYsICAgMTcwNSwgICAtNDI4LCAgIDM1NDksICAgLTU1MCwKKyAgICAgICAgNzAsICAgICAtMywgICAtMTQ3LCAgIC0yODgsICAgMTE0MiwgICAtOTE5LCAgICA0OTMsICAtMTMwNSwKKyAgICAgIC00NjAsICAgLTE1MSwgICAgODMxLCAgICA2MjMsICAgLTc2OCwgICAtMjExLCAgICAgMzEsICAgLTI5NiwKKyAgICAgICAxNjcsICAtMjcyMSwgICAgLTE2LCAgIC02NTQsICAgIDI0MywgICAyNTU1LCAgIC0zMTEsICAgMTg0NSwKKyAgICAgIC01MzEsICAgLTU3NiwgICAgMTQzLCAgIC01NzQsICAgIDQ5MCwgIC0xMDg5LCAgLTIzMDIsICAgMTA4MCwKKyAgICAgICA3MDEsICAgIDQ3MiwgICAyNzgyLCAgICAzMjAsICAtMTQ1NSwgICAtNjMyLCAgIC0yMTgsICAgIDI4MSwKKyAgICAgLTE0OTIsICAgLTY2MSwgIC0xMzc5LCAgIC01MzgsICAgLTIzNiwgIC0xOTI4LCAgIC01MDIsICAgLTU2NSwKKyAgICAgIC00ODAsICAgIDUyNSwgICAgLTgxLCAgICAgMzgsICAgIDI2MywgICAgICAzLCAgICAzNjYsICAgIDE2MywKKyAgICAgLTMxNDAsICAgIDg4MiwgICAgMTg5LCAgIDExMjMsICAgIDM4MiwgIC0xNzQ4LCAgLTEyMTAsICAgIDM3MSwKKyAgICAgIC02MDIsICAgIDY5NiwgICAtNDEzLCAgIC0yMDcsICAgIDM1OCwgICAtNjE2LCAgIDQ3MjUsICAgLTQ3MywKKyAgICAgIC03ODQsICAgIDI0OSwgICAgNjIxLCAgICA3NjQsICAgLTI2NSwgIC0xMDA0LCAgIC01NzAsICAgIDMzOSwKKyAgICAgIC02NDMsICAgLTEyMywgICAgMzAyLCAgICAyODQsICAgICAgMSwgICAtMTU5LCAgIC0zMjEsICAgIDI1MCwKKyAgICAgIC0yOTcsICAgIC00MywgIC0zNTEyLCAgLTEwNjQsICAgLTQ5MywgICAgNTU2LCAgLTExODQsICAgLTI2MywKKyAgICAgIDEzMTQsICAgMjAyOCwgICAxMDc0LCAgICAgIDksICAgMjk0MSwgICAtOTk4LCAgIC0yNzEsICAgIDk2NiwKKyAgICAgIC03NTQsICAtMjU4OSwgICAgIDg4LCAgICA3NDEsICAgLTMwNywgICAgMTM0LCAgICAxNTIsICAgIC04NiwKKyAgICAgICAzMTEsICAgIDkwNCwgICAtOTE3LCAgIDExOTksICAtNTA5MCwgICAgMTE4LCAgICAxODEsICAgLTMxMSwKKyAgICAgIC00MTIsICAgIDQ3NSwgICAtNjQ3LCAgIC03MTcsICAgLTYzNywgICAtMjIxLCAgIC0yOTEsICAgLTQ2OSwKKyAgICAgICAgNzcsICAgIDk0NiwgIC0xMTk2LCAgIC0xMTksICAgLTE3NSwgICAgNTMwLCAgIC00NjUsICAgIDM4MywKKyAgICAgLTEyNTMsICAgIDU4OSwgICAgODI2LCAgICA4MzUsICAtMzU3OCwgICAtMzE5LCAgICAtODAsICAgIDQ4OCwKKyAgICAgIC0yMzgsICAgLTQ5NywgICAgMzYwLCAgICA4MzksICAgMTg3MCwgICAgNzYyLCAgLTE2NjksICAgLTc2OSwKKyAgICAgICA0MjksICAgIDc3OCwgIC0zMTIxLCAgIC0zMjUsICAgIC01NSwgICAtMTI4LCAgIDI2MDYsICAgLTg3NCwKKyAgICAgIDEwNDMsICAgLTkwMiwgICAxNzQ2LCAgIC03MjUsICAgIDExNSwgICAgMTY3LCAgICAxNDIsICAgIDYwNCwKKyAgICAgIC0xMDEsICAgLTcyNSwgICAgLTExLCAgIC00NTgsICAgIC0yNywgICAgNDUwLCAgICAyOTMsICAgICAgMiwKKyAgICAgIC0zODMsICAgICAyMywgICAgMTcyLCAgLTY3MjUsICAgIDQwMCwgICAtMjA1LCAgICAxNjUsICAgICA0NSwKKyAgICAgICAtMzgsICAgICA4NiwgICAgMzcyLCAgICAzNTQsICAgIC02OCwgICAgMzkwLCAgIDI0NDQsICAgIDUyMSwKKyAgICAgICAgIDQsICAtMzU4NiwgICAgMzU3LCAgICAxMjksICAgIDY2NSwgICAtMzI4LCAgICA1MjQsICAgIDExMywKKyAgICAgIC00NDYsICAgLTUxNCwgICAxMTMyLCAgICAyODksICAgLTU2MCwgICAgMjM5LCAgICAxNjcsICAgLTM0OSwKKyAgICAgIC03MjQsICAgIDEwMSwgIC0zMTY1LCAgLTMxMzksICAgLTE2MywgICAtMTQ3LCAgICA4NjUsICAgLTYxNywKKyAgICAgICAgIDAsICAgLTc4OSwgICAgNzk3LCAgLTEwMjYsICAgIDQzMiwgICAgMzU5LCAgIC00NjAsICAgLTEwNSwKKyAgICAgIDExMTksICAgIDQ4NiwgICAtMjMzLCAgIC0zNjAsICAgLTE3NSwgICAtMzQ5LCAgICA4MzcsICAgIDQ2OSwKKyAgICAgIC0yNTAsICAgLTUyMSwgIC00NDcwLCAgIC0xMDgsICAgMTAwOSwgICAtNTc1LCAgICAyODMsICAgICAyMiwKKyAgICAgIC01NTUsICAgLTY4MiwgICAtMjM0LCAgIC0yNDksICAgIC0zMywgICAtMTA2LCAgICA1MjEsICAgIDUxNSwKKyAgICAgIC0yODMsICAgIC03OCwgICAgMTAxLCAgIC0xMzUsICAgLTY0OCwgICAgNTA2LCAgICAxODEsICAgIDM5MiwKKyAgICAgIC01MTcsICAgNTQwNSwgICAgNDQyLCAgIC0xMDYsICAtODE2OCwgICAgIDUxLCAgIC0zMTAsICAgLTgxMywKKyAgICAgICAgNDksICAgLTMxNCwgICAgNTg2LCAgIC00NzksICAgIDM3NiwgICAgMTEzLCAgICAzMzcsICAgLTE1MSwKKyAgICAgICAyNDUsICAgIDI3MCwgICAgIC0xLCAgICA2MTksICAgLTMxMiwgICAgLTM3LCAgIC0yMTUsICAgLTQ4MiwKKyAgICAgLTMwNTUsICAtMzI2MSwgICAtMzQ2LCAgIC00OTMsICAgLTM1NywgICAgMzA2LCAgIC0xNjAsICAgIC0yMSwKKyAgICAgICAyNTgsICAgIDg3MiwgICAtNTc3LCAgIC0xNDEsICAgICAxOCwgICAgLTg0LCAgICA2OTMsICAgIDE1MSwKKyAgICAgICAyMTgsICAgLTUzMywgICAgLTM3LCAgICA1NDAsICAgICA2MSwgICAgIDQwLCAgIDMxNTAsICAgIDE1NywKKyAgICAgLTI1NDksICAgLTMyNCwgICAgMjY3LCAgIC00NTYsICAtMTIzNiwgICAgNzk4LCAgICA1MTcsICAgLTIyNCwKKyAgICAgIC0xOTYsICAgIDU4NywgICAtNDk1LCAgICAgMTgsICAgIDI1OCwgICAzMTQ3LCAgICAtMTUsICAgLTU2OCwKKyAgICAgICA5NTcsICAgLTQ0NCwgICAgNjM3LCAgIC0zNTQsICAgIDgyOCwgICAxMTgyLCAgIC03NjksICAgLTEzNywKKyAgICAgLTIxMzAsICAgIDQwOCwgIC0xNjY3LCAgICAyNTIsICAgIDI4MiwgICAgMjAxLCAgICAyMzksICAgIDE1NCwKKyAgICAgICAxMjUsICAtNzg4MiwgICAtMzMyLCAgICAxOTgsICAgIC00NywgICAgMjY1LCAgIC0yODksICAgIDM1OCwKKyAgICAgICAgLTQsICAgIDEwMywgICAtNzk1LCAgICAyMDcsICAgICA4MiwgICAgMjI5LCAgICA0MjksICAgIDM2MSwKKyAgICAgICAyNjMsICAgLTQwOSwgICAtNDUxLCAgLTEwMzYsICAtMzQxOSwgICAgODk5LCAgIC01NjgsICAtMTQ4MCwKKyAgICAgICA4OTgsICAgIDI4NCwgICAgLTUzLCAgICAxNzksICAgIDk3NSwgIC0xMjgzLCAgICA3NTksICAgLTE1MCwKKyAgICAgIDMyNDQsICAgIDQwOCwgICAyNTc5LCAgIC00MTgsICAgLTExNywgICAgMjI2LCAgICA1ODMsICAgIDIxMCwKKyAgICAgICAtNjIsICAtMTUxMywgICAtMTQ4LCAgIC04MjAsICAgMTA3MywgICAxMjkwLCAgIC0yNjMsICAgLTQ1NCwKKyAgICAgICA2NTMsICAgIDU1NSwgICAgMjg2LCAgICAyMTgsICAgLTEwNSwgICAtMTM1LCAgICAyMzEsICAgLTg5MiwKKyAgICAgIC0yODQsICAgMjUxMywgICAyNzE1LCAgLTE1MzAsICAgLTE2NSwgIC0xNDE5LCAgIC0yMjMsICAgIC02NiwKKyAgICAgICA1MjUsICAgMTU1NiwgICAgLTE4LCAgIC02NjQsICAgIC0xOSwgICAgODU2LCAgICAxNzksICAgIDUzNSwKKyAgICAgIC0zMzksICAgLTI0NSwgICAgNDk4LCAgICAxOTMsICAgIDIzNSwgICAgMzI4LCAgIC00OTEsICAgIDIzMSwKKyAgICAgLTU2MjksICAgICA2NSwgICAgLTg1LCAgICAzMTMsICAgLTM5NSwgICAgICA2LCAgICAzNDQsICAgIDI2NywKKyAgICAgICA2NzIsICAgLTk5MSwgICAgMTc4LCAgLTEzMzUsICAgIC02NCwgICAgICA5LCAgLTE1MDgsICAgIC02OSwKKyAgICAgICAgNTcsICAgLTMxMCwgIC0xNzkzLCAgIC04NTAsICAtMzY2OSwgICAgNDI3LCAgICAtNzksICAgLTcyMCwKKyAgICAgICAyMTksICAgIDM2NiwgICAgMTMxLCAgICA1MjMsICAgIDE0MSwgIC0xMDU1LCAgICAtNjYsICAgICAxMywKKyAgICAgIC04NDMsICAgIC01NSwgICAtNzk0LCAgICA2NjEsICAgIDExMiwgICAtNDA3LCAgIC00OTYsICAgIDU1MCwKKyAgICAgICA5MzEsICAtMzkzOCwgICAxNzgwLCAgIC01MDksICAgLTU0MywgICAtMTU3LCAgIC0yNzAsICAtMTAxNSwKKyAgICAgICA1NjQsICAgLTIzMSwgICAtODU0LCAgLTMzNzIsICAgLTMyNywgICAgODY5LCAgIC0xOTYsICAgLTk4MSwKKyAgICAgIC0yMDUsICAgLTIxNSwgICAgNjA1LCAgICA3NDYsICAtMjE4OCwgICAyMjUwLCAgICAgNzQsICAtMjk3OSwKKyAgICAgIC0yNDIsICAgIDgzMiwgICAtMTkwLCAgICAzNjUsICAtMTMyNywgICAgNDUzLCAgICAgOTUsICAgICA3NiwKKyAgICAgICAxNTgsICAgLTY4MywgICAgNjI4LCAgICAyOTcsICAgLTg2NywgICAtNTQyLCAgIC0xNDMsICAgLTU2OCwKKyAgICAgIC00MTQsICAgNjAxOCwgICAgLTQwLCAgICAtMzUsICAgLTQ1NiwgICAtNjMyLCAgIC03NzksICAgLTIyNiwKKyAgICAgIC00NDIsICAgLTI5NSwgICAgMzEwLCAgIC03NjYsICAgIDU3OCwgICAtMTk3LCAgICAgODQsICAgLTk2MSwKKyAgICAgLTMzNDYsICAgLTEwNiwgICAzMjY2LCAgICAgLTMsICAgLTQ3NywgICAgIC04LCAgICA2NTIsICAgIDEyMiwKKyAgICAgIC02MDYsICAgICA0OSwgICAgIDM0LCAgICA2ODYsICAgIDM4NSwgICAtMjU4LCAgICAyMTQsICAgLTU3MiwKKyAgICAgICAtNzIsICAgLTE5MywgICAgMTI0LCAgICA0NDAsICAgICA0OCwgICAgIDQ1LCAgICAgNzUsICAgICAgOSwKKyAgICAgLTc3MjQsICAgIDIwMCwgICAtMzY0LCAgICA1NzgsICAgIDMxOCwgICAtNDYxLCAgICAgODQsICAgLTIzMywKKyAgICAgICAgNDYsICAgLTQwNCwgICAgMTg1LCAgICA0NzAsICAtMzM4NywgIC0zMzk3LCAgICAzNzQsICAgLTUxOSwKKyAgICAgIC0zMjAsICAgLTM3OCwgICAgIDI3LCAgICA5MjEsICAgLTI4MCwgICAgMTg4LCAgIC0yNDUsICAgIC02OSwKKyAgICAgIC0zMjIsICAgIDUwNCwgICAgLTcyLCAgICA0NjAsICAgIC04MCwgICAgLTM1LCAgIC0yMjAsICAtMzA5OCwKKyAgICAgLTM2NzgsICAgIDQ3NywgICAgMjQ4LCAgIC04MDEsICAgIDU4MCwgICAgMTg3LCAgICA0NjgsICAgLTYzNiwKKyAgICAgIC0zNjQsICAgLTQzMiwgICAgMTgzLCAgICAtODIsICAgIC03OSwgICAgMjY2LCAgIC03ODcsICAgLTc0MCwKKyAgICAgICA1NTIsICAgIDIyOCwgICAgMjM4LCAgICA0ODIsICAtMjIyOSwgICAgMjc1LCAgICAxNDksICAgLTM2MCwKKyAgICAgIC0zNTAsICAgMjc3NCwgICAgODcxLCAgIC0xMTgsICAgICA1NSwgICAtOTYxLCAgIC0xNjUsICAgMjQyOSwKKyAgICAgICA5ODIsICAgIDMxMywgICAtNTAyLCAgIDMwOTQsICAgLTQzMSwgICAzNDg1LCAgICA0NzMsICAgLTM0NywKKyAgICAgICAxNzEsICAgIDU0NCwgICAgMjUzLCAgIC0zMjQsICAgIC01MCwgICAgNDY0LCAgICAxMTYsICAgIDY1MCwKKyAgICAgIDExMDIsICAgIDQ5NSwgICAgNDIwLCAgIC00MDQsICAgICAtMSwgIC0yOTkxLCAgIDQwNTUsICAgIDIwNywKKyAgICAgICAzNzQsICAgLTE4NywgICAtMTIxLCAgICAxMzAsICAgLTQ1MSwgICAtOTUzLCAgICA4MjIsICAgIDUyNiwKKyAgICAgICAyODcsICAgIDEyMCwgICAtOTc5LCAgICAzNzYsICAgIDU5NCwgICAgLTc5LCAgIC0xMzAsICAgLTM2MiwKKyAgICAgIC05NzksICAgIDE2NiwgICAgNjkzLCAgLTQxMDgsICAgICA4NCwgICAtMTM1LCAgIC0xOTUsICAgLTcwMywKKyAgICAgLTE1MDYsICAtMTA5OCwgICAtNjExLCAgICA4NzAsICAgIDkzNSwgICAtMTU2LCAgICA5NzQsICAgIDI4NiwKKyAgICAgICAtODYsICAgICA4MywgICAyOTc1LCAgIC02ODEsICAgMzIxOCwgICAtMjg2LCAgIC00NTIsICAgIC03MCwKKyAgICAgIC0xMTMsICAgLTM5NSwgICAgMTM3LCAgLTEyOTUsICAgLTUwMywgICAgODUzLCAgICAyOTcsICAgLTM1MiwKKyAgICAgLTEwMDQsICAgLTExNywgICAgNDc2LCAgIC00MzEsICAtMjg0OCwgICAgIC03LCAgIDM2MDEsICAgIDQwMiwKKyAgICAgIC01MzQsICAgIDMxMiwgICAgIDg2LCAgIDE1MjQsICAgLTM1OCwgICAtMTY0LCAgICAtNDMsICAgIDkxMywKKyAgICAgIDEwMDMsICAgIDIzOSwgICAtMzY0LCAgICAtODgsICAgLTQ2OCwgICAtNjcyLCAgICAyMjAsICAgLTIxMSwKKyAgICAgIC0zMjYsICAgLTQzMSwgICAgNDM4LCAgIC0yOTcsICAgIDM4MCwgICAgMTI1LCAgIC0xNDYsICAgNDU1MCwKKyAgICAgIC0yNzEsICAgLTgzMSwgICAgNzY4LCAgLTEzNjAsICAgIC00NSwgICAgMjY2LCAgIC0yNzgsICAgLTI0NiwKKyAgICAgICA2MjUsICAgLTEzMiwgICAgMTUzLCAgICA1MTQsICAgIDExNSwgIC0xMzExLCAgICA3MDcsICAgLTM2MSwKKyAgICAgIC02MDEsICAtMzIyNCwgICAgMzc2LCAgLTIxMDcsICAgLTI1OSwgIC0xMTU1LCAgICA0MjYsICAgLTY0NiwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMTExMHNtMVtdID0geworICAgICAgIDM2MCwgICAzMTA2LCAgIC01MTgsICAgIDE4NSwgICAtOTA2LCAgIDMyNDUsICAgIDUwOCwgICAgLTkxLAorICAgICAgIDkzOCwgIC0xMjcwLCAgIC00OTIsICAgICAzNiwgICAgMTY4LCAgIC05OTcsICAgLTIwOCwgICAgOTkxLAorICAgICAgICA5OSwgICAxNTUzLCAgIC0yOTQsICAgIDIwNCwgICAgLTIyLCAgIC0xMDgsICAtMjQwNSwgICAyODkzLAorICAgICAgICA0OSwgICAgIDcyLCAgIC00OTAsICAgLTUyOSwgICAtMjE4LCAgIDEzNDMsICAgLTc4NiwgICAgOTAzLAorICAgICAgIDQxMSwgICAgMjA3LCAgICAxMzEsICAgLTYzNiwgICAtMTI5LCAgIC0xMzQsICAgIDYyMSwgICAtMjUzLAorICAgICAgIDMxOSwgICAgMTM1LCAgIC0yMzQsICAgIC03NSwgICAtMjkzLCAgICAgNDYsICAgIDIwNywgICA1OTg1LAorICAgICAgIDI4MCwgICAgLTg2LCAgICAtNzgsICAgIDY5MCwgICAgOTg0LCAgIC03NzAsICAgLTU2NSwgICAtMjI2LAorICAgICAgLTI0MiwgICAgMzc0LCAgICAgMjYsICAgLTY5NiwgICAgIDgxLCAgIC0yNzcsICAgICAtOSwgICAgNjM5LAorICAgICAgLTczMCwgICAgMjUwLCAgIC0yMzIsICAgLTQ4OCwgICAtMjg0LCAgICA0NjAsICAgLTM5OCwgICA0MzM2LAorICAgICAgLTMwMywgICAtMjY2LCAgICA1NDYsICAgLTI5MiwgICAyOTM2LCAgICAgNzAsICAgMjA3NywgICAgMzczLAorICAgICAgLTE0MSwgICAgMjkyLCAgIDIxMDIsICAgIDM0MCwgICAtMzEyLCAgIC01MjMsICAgLTM0MSwgICAxMDE3LAorICAgICAgIDQ1NywgICAgMjI0LCAgICAzMTUsICAgIDI3MSwgICAxMDgwLCAgICAxNTIsICAgIDE5MiwgICAgNTY4LAorICAgICAgMTAxNCwgICAgMTU1LCAgICAgODUsICAgIDMyOSwgIC01MjM1LCAgICAxMzcsICAgLTUwMywgICAgMTQxLAorICAgICAgIDI3NSwgICAgIC03LCAgICA3NTIsICAgIDI4MiwgICAtMjY3LCAgICAzMjEsICAgLTczNSwgICAgNzQ2LAorICAgICAgIDQ4OSwgICAgNDUwLCAgICA0NzgsICAgIDQzMiwgICAtMTUyLCAgICA0NTEsICAtMTE5MiwgICAxMjY3LAorICAgICAgLTM0MSwgICAxMTM2LCAgICAxMDAsICAtMzUzOCwgIC0xNTUxLCAgIDE1NDcsICAgLTU1MSwgICAgMjk0LAorICAgICAgLTQ3MywgICAtODIxLCAgICAtNTEsICAgIDcxOCwgICAtNjU1LCAgICAtMTEsICAgMjgxNywgICAgLTI2LAorICAgICAgICA3MywgICAtNDU5LCAgLTE1NjksICAgIDE4MSwgICAgNTE2LCAgIC0xNTEsICAgMjg0NiwgICAtMTEyLAorICAgICAgIDE4NiwgICAgNzE0LCAgIC0yMjgsICAgLTIxMCwgICAtNDUxLCAgICA5MjAsICAgIC05OSwgICAtMTMyLAorICAgICAtMjY2MiwgICAgNTg5LCAgIDMwNDAsICAgIDM3NiwgICAgNjYyLCAgIC04MzQsICAgIDc4MiwgICAgNTQyLAorICAgICAgMTQ4NSwgICAgNTM4LCAgIDM1MzEsICAgIDEwNywgICAgIDQ3LCAgICAgNjIsICAgIDM5OCwgICAgLTExLAorICAgICAgIC0xNSwgICAtNzMzLCAgICA0NzEsICAgLTIzMSwgICAgNjY4LCAgIC0yMTIsICAgICAzOCwgICAtNTM2LAorICAgICAtMTkwNSwgICAyNzY5LCAgIC0xNDksICAgMTYyMywgIC0zNDE4LCAgICAyMzcsICAgICA1NSwgICAtMzI4LAorICAgICAgLTc3MCwgICAgMzM1LCAgIDI3NTUsICAgIDM0MCwgICAgIDYyLCAgIC00NjYsICAgIDI2NywgICAtOTQ2LAorICAgICAgIDQyNywgICAgMjY2LCAgICAgODAsICAgMTEzNCwgICAgIDM0LCAgICA5NDksICAgIDM2NiwgICAtMzM5LAorICAgICAgLTExMiwgICAgICAzLCAgIC0xMDUsICAgIDQ0MiwgICA1MTE3LCAgICA1NDUsICAgIC05MywgICAgNjExLAorICAgICAgLTE4NiwgICAgNTY2LCAgICAtMzksICAgLTE3MiwgICAgLTU5LCAgLTExMjAsICAgIDM4OCwgICAgNzAzLAorICAgICAgIDYxOSwgICAtMzU5LCAgIC0xMTcsICAgIC02OCwgICAgNTY5LCAgICAxNDgsICAgLTIxNCwgICAtMjQ1LAorICAgICAgIDI4MSwgICAgNjE3LCAgLTIzMzcsICAgIC04OCwgICAtMjU1LCAgICAxMjQsICAgMzI5MiwgICAgNDQzLAorICAgICAgIDQzNCwgICAgLTE3LCAgLTExNTcsICAgMzA5MCwgICAtMjA1LCAgIC0yNDUsICAgLTk4MywgICAgMjUwLAorICAgICAtMTA4NiwgICAgNjQzLCAgIDEzOTIsICAgIDgzMSwgICAgNzMzLCAgICAtNTksICAtMTE5OSwgICAxNzQ3LAorICAgICAgLTQxNSwgICAxMDczLCAgICAyNzksICAgIDQyOCwgICAtNTEyLCAgLTMzOTIsICAgICAgMCwgICAgIC02LAorICAgICAgIDUyNiwgICAgMjc1LCAgICAtNzksICAgIDQ3NywgICAgNDExLCAgICAgODUsICAgMTQ4NSwgICAgNzk1LAorICAgICAgLTIwOSwgICAgNDk1LCAgLTI2MjgsICAgIDM2NywgIC0xNzM0LCAgICA5MDAsICAgIDMwMSwgICAgMjM5LAorICAgICAgIC01MywgIC0yMDY4LCAgICA0MDMsICAgMTMzMywgIC0xMzA0LCAgIC01NjYsICAtMTQyMCwgICAtNzcxLAorICAgICAtMjMwMCwgICAgLTE1LCAgICA4NDIsICAgIDM0MiwgIC0yMzczLCAgICAgNjEsICAtMTM3OSwgICAgMzAzLAorICAgICAgIDczMywgICAtMTA4LCAgIC0zMTYsICAgICA5NCwgICAtNDc3LCAgIC0yNTQsICAgLTIxMSwgICAgODA3LAorICAgICAgIDI3MywgICAtNzkyLCAgICAxNTksICAgIC02NiwgICAtODU3LCAgIDEwOTIsICAtMTAwMSwgICAgLTY5LAorICAgICAtMzc3MCwgICAgOTk5LCAgIDI0MTgsICAgIDg1NCwgICAgMTczLCAgIDIyODEsICAgLTY4MSwgICAgNDg1LAorICAgICAgIDU3OCwgICAgMTQ1LCAgLTEyNDUsICAgIDg0NSwgICAtMzc1LCAgICAyMTksICAgLTI1OSwgICAgMzc0LAorICAgICAgIDc1MSwgICAgMjI2LCAgLTEzNDcsICAgLTgyNSwgICAgIDY2LCAgICAzMTksICAgLTE3MywgICAgMTkxLAorICAgICAgIDQ0NSwgICAgMjg0LCAgICAgNjIsICAtODE1MCwgICAgLTcxLCAgICAgNTMsICAgIDYzNywgICAgLTk2LAorICAgICAgIDIyNywgICAgIDc1LCAgICAgNzMsICAgIC04OCwgICAgNjU0LCAgICAtMjQsICAgLTQ2NiwgICAgNDc3LAorICAgICAgIDY3MSwgICAtMTI1LCAgIC05NDIsICAgIDEwNCwgICAgMjQ4LCAgIC0xNTEsICAgLTM4MywgICAgIDExLAorICAgICAgIDMyMiwgICAgMzMyLCAgIDQxNjAsICAgIDEwOCwgICAtMzAxLCAgICA0NjMsICAgLTQwMiwgICAgMzUyLAorICAgICAtMTc5OSwgICAgNTgwLCAgIDE0NDMsICAgIDM5NiwgICAgMjg3LCAgIC0xNTgsICAgLTQyMSwgICAgMzQwLAorICAgICAgLTM0OSwgICAgMTA5LCAgICAgNjEsICAgICA0NywgIC0yODE2LCAgIC0yOTgsICAgLTk0NywgICAtODE3LAorICAgICAgIDY3MywgICAgMTg5LCAgICAgMzYsICAgNDA2OSwgICAtNTg0LCAgIC0zMzUsICAgMjYwOCwgICAgIDEwLAorICAgICAgLTM3OCwgICAtNjMwLCAgIC04MDEsICAgIDIyOCwgICAgOTQ2LCAgIC00MDUsICAtMTE4NiwgICAgNDczLAorICAgICAgIDYyNSwgICAgIC0yLCAgIC03NDEsICAgIDUyMywgICAzNzQ3LCAgICAzMTgsICAgIDczMywgICAgMTcxLAorICAgICAgIDI2OCwgIC0yNTU0LCAgICA0MDIsICAgLTI1MiwgICAtMjA1LCAgICAyOTIsICAgLTM1MSwgICAgIDY0LAorICAgICAgIDI4OSwgICAgODAxLCAgICA5ODksICAgIDQzNSwgICAtMTAwLCAgIC0xNjMsICAtMTIxNSwgICAtNDY3LAorICAgICAgIDY2MSwgICAtNzE0LCAgICAxNjUsICAgLTIyOCwgICAtNjM3LCAgIDEzNTcsICAgLTQ5OCwgICAgLTUyLAorICAgICAgIDQ4OCwgIC0zODgyLCAgICAxMzAsICAtMTA1MywgICAgNzk2LCAgIDEwNDAsICAgIDM4MSwgICAtNzI5LAorICAgICAgIDE0NywgICAgODAzLCAgICAxNjksICAgICA0NiwgICAtMTU3LCAgICAxNjcsICAgLTIwOSwgICAgMTI2LAorICAgICAtMTAxNiwgICAgIDg4LCAgLTEwMTgsICAgLTQ1OCwgICAtNTI3LCAgIDEyNTksICAgIDYyMSwgICAzODQ3LAorICAgICAgLTUyNSwgICAxMjQ3LCAgICAgMTgsICAgIDI1MywgICAgNjQyLCAgICAzNDAsICAgLTcwNSwgICAgODM4LAorICAgICAtMjc2OSwgICAtNjcyLCAgICAxNTMsICAgIDExNSwgICAgNDUzLCAgICA3NzMsICAgICAgOSwgIC0yMjg1LAorICAgICAgLTI5MSwgICAgICA2LCAgIC0yMTksICAgIDYyOCwgICAgMjg0LCAgIC0zMzAsICAgIDU2OCwgICAtMjQwLAorICAgICAgLTIwNiwgICAtMTI3LCAgICAyNzMsICAgIDM3MywgICAgMzY3LCAgIC00OTQsICAgODE5MiwgICAtNTk1LAorICAgICAgLTI1NSwgICAtMTU4LCAgIC0zMjYsICAgIC02MCwgICAgNTEzLCAgICAzMzQsICAgLTY2NywgICAtNTQ5LAorICAgICAgLTExMCwgICAgICAyLCAgICA1NzMsICAgMTA4NiwgICAtNjEwLCAgIC0zNjgsICAgIDI1OSwgIC0zNjExLAorICAgICAgLTQ1NSwgICAxNTc3LCAgIC01MjQsICAgICAxMSwgICAgOTA0LCAgICAzOTAsICAgIDMxMywgICAgNzA3LAorICAgICAgMjY3MCwgICAtMjIzLCAgIDI3MTAsICAgIDU5MywgICAgLTI1LCAgICAyMjgsICAgIDU0MCwgICAgNjYzLAorICAgICAgIDc0MCwgIC0xMTA4LCAgICAyOTgsICAgMTIyMywgICAtNTMxLCAgLTE5NzgsICAgIDI0OCwgICAtNjYxLAorICAgICAgLTM0MSwgICAtOTEwLCAgLTI0MzQsICAgIDExMSwgICAgMjE3LCAgICA3NDgsICAgIDIzMSwgICAtMzA1LAorICAgICAgLTQxOSwgICAxODczLCAgIDEwOTQsICAgLTkzNiwgIC0xNzQxLCAgIDExMzMsICAgMTg4MSwgICAtNjcxLAorICAgICAgICA0MSwgICAgMjY4LCAgLTE4MjYsICAgIDQ2NiwgICAgMTM1LCAgICAgMzcsICAgLTIwMCwgICA0NjIzLAorICAgICAtMTIxMiwgICAtOTY5LCAgICA1NDEsICAgMTI3OCwgICAgNjUyLCAgIDEwNjEsICAgLTc1OSwgICAtNzQ3LAorICAgICAgLTQyNywgICAtMTA3LCAgLTEzMjksICAgLTU4MywgICAtMjU1LCAgICAtNjcsICAgLTMxMSwgICAgLTEwLAorICAgICAgLTQyMSwgIC04MTkyLCAgICAzMjIsICAgLTE4MSwgICAtNDQyLCAgICAgNzYsICAgIDE3NiwgICAtNzQyLAorICAgICAgLTE3NSwgICAgMTQ3LCAgICAzODUsICAgLTI3NSwgICAgLTg3LCAgIC03MDQsICAgLTU0NSwgICAtMzE1LAorICAgICAgLTQxNCwgICAgNTY5LCAgICAgODEsICAgLTM4NywgICAgNjI4LCAgIDI5NTQsICAgLTYwNCwgIC0xNDU5LAorICAgICAgIC0yOSwgICAxNjkzLCAgICA4NDAsICAtMTAyNCwgICAgLTY2LCAgIC0zMTcsICAgIDI2NiwgIC0yNDY1LAorICAgICAgLTkxNywgICAgLTE0LCAgICAxNTEsICAgLTM2OSwgICAgMzY2LCAgLTIzODgsICAgICAgMSwgICAtNzczLAorICAgICAgMTMzMywgICAgLTk5LCAgICAyMjMsICAgLTY5NCwgIC0xMTY5LCAgICA5MTcsICAtMjQ5NiwgIC0xMjkwLAorICAgICAgLTI4NiwgIC0xMDA3LCAgIC01MDgsICAgIDczNCwgICAgNDUxLCAgIC0yNTYsICAgIDI2NiwgICAtMTA1LAorICAgICAgLTE0MywgICAgNDM5LCAgIC0xMjAsICAgLTE0NiwgICA3NjkwLCAgIC0xODMsICAgIDE4OCwgICAgIDY4LAorICAgICAgLTM4NSwgICAgICA3LCAgIC0yNzgsICAgIC0yNCwgICAgLTY2LCAgICAyOTIsICAgIDEzNywgICAgMTQzLAorICAgICAgICAyMSwgICAtNDk1LCAgIC01MjcsICAgLTI4NCwgICAgIDg5LCAgLTE1ODQsICAgIC02NCwgIC0zNjY0LAorICAgICAgIDI4NiwgIC0yMjU4LCAgICAgODAsICAgLTkzMiwgICAtNzcxLCAgIC0zMzgsICAgLTgzMCwgIC0xMDI5LAorICAgICAgIC05OSwgICAgLTMyLCAgIC04MDAsICAgIDM1MSwgICAgLTg3LCAgICA2MDAsICAgIC05MywgICAgMTMzLAorICAgICAgIDM4OSwgICAtNjkwLCAgICAyNjksICAgIDIwMSwgICAtMzI4LCAgIDU0ODksICAgIDU1OCwgICAtNzAyLAorICAgICAgLTQ4NywgICAgMjEwLCAgIDMxMDcsICAtMzYyOCwgICAgLTk2LCAgIC0zODgsICAgLTE2OSwgICAtMjIxLAorICAgICAgIDMzOSwgICAgNDAzLCAgIC04MTYsICAgIC0yNCwgICAgNDY5LCAgIC0xMTIsICAgIDU2MCwgICAgODQ0LAorICAgICAgLTQ0MSwgICAgNjk4LCAgICAxNjksICAgLTM3OCwgICAtMjgzLCAgIC05MjQsICAgMjg0MiwgICAtNDc5LAorICAgICAgLTY5NCwgICAtMTE3LCAgICAtOTQsICAgIDUyMywgICAgOTc0LCAgIDEzNTYsICAgLTYzOCwgICAgNTkwLAorICAgICAgIDgyMCwgICAyMTY0LCAgICAyNDcsICAgLTUzMiwgICAgNjQ4LCAgIC0yNDMsICAgLTU5OSwgICAgLTY3LAorICAgICAgNTY4NiwgICAgMTc0LCAgICAgNzgsICAgLTYwOCwgICAgMjMwLCAgIC0xNzIsICAgIDM2OSwgICAgMzQyLAorICAgICAgLTExMywgICAgMTExLCAgIC0zNDUsICAgLTMxMSwgICAgNTk0LCAgICAzNTAsICAgLTI2MCwgIC0xNDIzLAorICAgICAgLTQyNSwgICAtNDA3LCAgLTEwMTcsICAgLTI5OCwgICAtMTgwLCAgIC03MzgsICAgLTg5MSwgICAgIDY2LAorICAgICAtMzMxMiwgIC0xMTU3LCAgICAgIDEsICAgIDgxMSwgIC0xNDMxLCAgICA2MTIsICAgIDc5NywgIC0xMzQ0LAorICAgICAgLTg5MCwgICAtOTU5LCAgICAzMTgsICAgIDM5MiwgICAtMTkwLCAgICA3MzUsICAgIDE5NiwgICAtMzQ3LAorICAgICAgICA2MSwgICAtMTE2LCAgICAzNDQsICAgIDI0MywgICAtNDExLCAgIC00NDYsICAgICA2MiwgICAtMTI4LAorICAgICAtMzM4NiwgICAgNDc2LCAgIDI2OTUsICAgLTE5MywgICAgLTM5LCAgIDE5NjAsICAgICAtNywgICAgOTA5LAorICAgICAgLTExOCwgIC0yMjc1LCAgICAtMjgsICAgLTk5NywgICAtMjEwLCAgICAzNzQsICAgLTU4NiwgICAgLTgyLAorICAgICAgIDkxNCwgICAgMzIzLCAgICAtNzMsICAtMjc0MywgICAgODU4LCAgICAtNjUsICAgICA0MywgIC0yNDQ0LAorICAgICAgLTI0NiwgICAgMTQ1LCAgICAgNzgsICAgLTYzOCwgICAgODQ0LCAgLTIwNzksICAgIDM1MiwgICAtMzMyLAorICAgICAgIDYxNSwgICAtNzc5LCAgICAyNzAsICAgMTc5OSwgICAgNjgwLCAgICA1MDAsICAgIDY4NiwgICAxMTY4LAorICAgICAgLTM5NywgIC0yMjMzLCAgICAtMzEsICAgLTE2MywgICAgLTE4LCAgICA2MDIsICAgLTIzMiwgICAtOTE1LAorICAgICAgLTk0MSwgICAzNzA4LCAgIC0zMzcsICAgLTU1OSwgICAgMzE1LCAgIC00MDEsICAgICA0MiwgICAgIDI2LAorICAgICAgIDMxNiwgICAtMTAwLCAgIC0xOTEsICAgICAzNiwgICAgMjA2LCAgICAyMTQsICAtMzMzNiwgICAtNDA3LAorICAgICAgIDQ5NCwgICAgNzQ5LCAgIC00OTEsICAgLTE2MiwgICAgLTU1LCAgLTI5MDIsICAtMTUxNSwgICAtMTk4LAorICAgICAgLTMxMSwgICAtMzU5LCAgICA0MzksICAgIDM1OSwgICAtOTM1LCAgICAyMDMsICAgLTIxNCwgIC0yNDAxLAorICAgICAgLTYwNywgIC0yODQzLCAgICA4MTgsICAgLTU3OSwgIC0yMDY2LCAgICAzODgsICAgLTUxNCwgICAtOTEyLAorICAgICAgIDc4NywgICAgNTY0LCAgICAxNDksICAgLTEwMywgICAtNzU3LCAgICAzODksICAgIDE3MywgICAtMzAzLAorICAgICAgIDE1NCwgICAgODE0LCAgIDE2MzEsICAgLTM5MywgIC0yMjY0LCAgIDE2NjQsICAgLTgwMiwgICAgOTA0LAorICAgICAgIDU0MSwgICAgNzg0LCAgIDEwNjMsICAgMTE1MiwgIC0yNTEwLCAgICAyOTcsICAgICA4NCwgICAtMTU0LAorICAgICAgIDE2MCwgICAtNDk3LCAgICAtNzgsICAgMTUwMywgICAtNTk4LCAgIC01NDMsICAgICA4NiwgICAxNjgzLAorICAgICAgLTMzMCwgICAgIDQ2LCAgICAtMjQsICAgLTg5MiwgICAgNzQ3LCAgLTMzMzYsICAgLTM5MywgIC0yMjY4LAorICAgICAgIDEwNywgICAgNzEwLCAgIDE2ODIsICAgLTI3NywgICAtMjc4LCAgIC0yNzYsICAgMTI1MywgICAgMzI3LAorICAgICAgLTk4NiwgICAgODAyLCAgICAxOTEsICAgLTczMiwgICAgMjg2LCAgIC03NjEsICAgMTAwOCwgICAgNDYxLAorICAgICAgMTYxNSwgIC0xMDQxLCAgIDIxMjcsICAgMjQ1NiwgICAzOTI3LCAgIC0xNjAsICAgIDE4NywgICAgIDMxLAorICAgICAgLTEwMSwgICAzMjU4LCAgICAyMDIsICAgIC03NSwgICAgMzMwLCAgICAzNzUsICAgLTMwMSwgICAtMjc1LAorICAgICAgLTc4MiwgICAgOTQ5LCAgICAgMTIsICAgLTYyMSwgICAtNjE3LCAgICA1NzIsICAgMTAwNywgICAgNDE0LAorICAgICAgIC05MSwgICAtNDI4LCAgIC0zOTIsICAgLTk4NSwgICAtNjkyLCAgLTM0MjIsICAgIDE5OSwgICAgODQ1LAorICAgICAgICA5MSwgICAgNDE4LCAgICAyOTAsICAgLTk4MywgICAgNzIxLCAgLTEyNjUsICAgIDIwOCwgICAxMjAwLAorICAgICAgICA5MSwgICAtNzU4LCAgLTI2NDksICAgLTQ1MSwgICAtODE0LCAgIC02MjMsICAgLTQ1OCwgICAgMjcyLAorICAgICAgMjc3NywgICAgODA5LCAgIDEyODIsICAgIDc2MywgICAxMTIyLCAgICAgMjEsICAgIDUyMCwgICAgIDUwLAorICAgICAtMTAxOCwgICAgNDI4LCAgICAzODUsICAgNjE0OSwgICAtMjU1LCAgICAgIDgsICAgIC0xMiwgICAgIDIxLAorICAgICAgICAyMCwgICAgMjkzLCAgIC0zMTUsICAgLTQ0NiwgICAtNDIzLCAgICA1NDksICAgIDQyOCwgICAgLTU2LAorICAgICAgLTQ5NywgICAgMTAxLCAgICA2NTMsICAgLTE3NywgIC0zOTc1LCAgICAgNTYsICAgLTEyNywgICAzMjE0LAorICAgICAgIDI5MSwgICAtMzg0LCAgIC03MjEsICAgIDQ3OCwgICAtMzE0LCAgIC0yMzEsICAgLTQ2OSwgICAtMzYyLAorICAgICAgLTY4MiwgICAgNzY1LCAgIC0zMDgsICAgIDQyMCwgICAgNDU2LCAgICAzMjIsICAgIC01NCwgICAgIC0yLAorICAgICAgICAxMCwgICAtMjM5LCAgIDY5MTYsICAgLTQ2MSwgICAtNDgyLCAgIC0yMTEsICAgLTI4NiwgICAtMTEwLAorICAgICAgLTg3NywgICAtNzExLCAgIC00NzAsICAgIDE1OSwgICAgMjYwLCAgICAgNTksICAgIDI1MiwgICAgLTk3LAorICAgICAtMjk3OCwgICAtNjQ2LCAgICAtMzUsICAgIDE1NiwgICAtMTIzLCAgICAzNjAsICAgIDU1NiwgIC0zMjU0LAorICAgICAgLTQ3NSwgICAtMzEzLCAgIC0yNjgsICAtMTc3MSwgICAtNTM4LCAgICAyMDMsICAgIDk2NywgICAgMjgzLAorICAgICAgLTY1MywgICAtNTY1LCAgICAzODcsICAtMzA5NywgICAtMjU1LCAgICAgMjUsICAgIDI5NSwgICAgMjY0LAorICAgICAtMzcxNiwgICAgNTA1LCAgIDEwMjQsICAgLTMxNSwgICAtMjE1LCAgIC0yMjIsICAgLTc4MCwgICAgNjYwLAorICAgICAgIDQzMSwgICAtMzQxLCAgIC01MjEsICAgICA0NiwgICAgMTI3LCAgIC0yNDQsICAgLTc3MiwgIC0zNzQxLAorICAgICAgIDE5MCwgICAtMzM1LCAgICAtMTcsICAgMjEzNSwgICAgNzQ0LCAgICAtMzUsICAgIDYyNywgIC0xMTE1LAorICAgICAgIDY4MSwgICAtMzQzLCAgICAxMjMsICAtMTUzNCwgICAgLTg2LCAgIC01NDIsICAgLTI5NywgICAgLTgyLAorICAgICAtMjc3MiwgICAzOTE0LCAgICAtNzUsICAgIDUyNiwgICAgMTI0LCAgIC01MjMsICAgLTExMiwgICAgNTAwLAorICAgICAgIDg2MywgICAgMzcxLCAgICAxOTAsICAgMTAzNiwgICAgMTQxLCAgLTEwMTEsICAgIDM3MywgICAgNzk2LAorICAgICAgIDQyMSwgICAtNjgyLCAgICA0MDMsICAgMjkyNCwgICAzNzMwLCAgICAgIDYsICAgIDIxMSwgICAtNjkxLAorICAgICAgLTE2NywgICAtMzkxLCAgIC02NTUsICAgIDE2MiwgICAgMzQ4LCAgICAyMTYsICAgLTIyNywgICAtNTM1LAorICAgICAgLTE0NywgICAgMzY3LCAgIC0xODksICAgIDMzMSwgICAtMTkxLCAgICAxNTksICAgICA0OSwgIC00OTA1LAorICAgICAgLTI1MiwgICAtMjkwLCAgICA2MDksICAgLTQ1MiwgICAxMDQyLCAgIDEwMjcsICAgLTY0NSwgICAtMTU5LAorICAgICAgLTYzMywgICAtNTQyLCAgIC05MjUsICAgLTI2MiwgICAgLTkxLCAgICAxOTIsICAgMTI2NiwgICAgIC0yLAorICAgICAgLTE2NCwgICAgNTg3LCAgICAxODgsICAgMzQzNCwgIC0xMDE0LCAgICAgIDIsICAgMTM3MywgICAxODMyLAorICAgICAtMTIyNCwgICAtOTY1LCAgICA4MzEsICAgLTk4NywgICAxMTgwLCAgIDEzODksICAgLTkyNSwgICAgIDQ4LAorICAgICAtMzIzOSwgICAgMjYzLCAgIC0zMjksICAgLTY2MCwgICAtNzMzLCAgICAyNjIsICAgLTk4OCwgICAgNTk4LAorICAgICAtMjQyMSwgICAgNjMwLCAgICA3MjAsICAgLTkyNSwgICAtNDU1LCAgICAyMDgsICAgMTA5MiwgICAtMjk0LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IxNjE2bDBbXSA9IHsKKyAgICAgICAtMTUsICAtNzcwNywgICAgMTE1LCAgICAgMzAsICAgIC0zNiwgICAgLTI3LCAgICAtMjIsICAgIC00MywKKyAgICAgICAgIDIsICAgICAgNSwgICAgIDMxLCAgICAgLTEsICAgICA4NywgICAgICAyLCAgICAgNDEsICAgICAyMSwKKyAgICAgICAyNzAsICAgICAxNiwgICAzNzQ3LCAgIC03NzMsICAgMzAyNywgICAgMjI0LCAgICAgOTIsICAgLTE2OCwKKyAgICAgICAgLTcsICAgIC02MiwgICAgLTc5LCAgICAtNDQsICAgICAtOSwgICAgIC00LCAgICAtNTgsICAgIC03OCwKKyAgICAgIDEwNjMsICAgIDIwMywgICAgIC0yLCAgICAgNzYsICAgIDI4OSwgICAgLTM2LCAgICAgOTIsICAgIC0yOSwKKyAgICAgICAtNzgsICAgLTE0OCwgIC01MTc2LCAgICAxMzcsICAgIDIxOSwgICAgMjk5LCAgICAgODksICAgLTIzMywKKyAgICAgICAgNjIsICAgLTEyOSwgICAgIDMzLCAgICAxMjMsICAgIC0zMCwgICAgMTk3LCAgIDQwMTgsICAgIC0zNywKKyAgICAgICAtMzgsICAgIDEzOSwgICAgIDQxLCAgICAxNTMsICAgICA3MSwgICAgLTI2LCAgICAgMjcsICAgICA1MywKKyAgICAgICAgNzIsICAgMzM1OCwgICAgLTY4LCAgIC0xMjIsICAgIDI5MywgICAgLTE5LCAgIC0zNTUsICAgIDEwNCwKKyAgICAgICAgMzQsICAgMzEyMSwgICAgIDE2LCAgICAgMjksICAgLTM0NCwgICAgIDM3LCAgICAxNzQsICAgIC0yOCwKKyAgICAgICAtNDMsICAgLTEwMiwgICAgLTU5LCAgLTE2NjEsICAgICAxNCwgICAgICA1LCAgICAtNjIsICAgICAtMSwKKyAgICAgICAgMTQsICAgICAxNSwgICAgLTQyLCAgICAgIDQsICAgIC0zMSwgICAgIC0yLCAgICAgMTMsICAgICAyMywKKyAgICAgICA5NTcsICAgLTQxOSwgICAgIDIwLCAgICAgMzEsICAgIC0xNCwgICAgIDUxLCAgICAgMjQsICAgIC00NiwKKyAgICAgICAgIDgsICAgIC0xNiwgICAgIDI3LCAgICAtNzUsICAgIC0yNywgICAgLTMzLCAgICAtMjgsICAgICAxOCwKKyAgICAgICAtNjcsICAgLTE1MiwgICAgLTQ4LCAgICAgNDcsICAgICA5MCwgICAgIDQ4LCAgICAtNzQsICAgLTEwMywKKyAgICAgICAtMTgsICAgNDg2MywgICAgICAzLCAgICAxMzIsICAgIDQxNCwgICAgLTg2LCAgICAtNjAsICAgIDI4NSwKKyAgICAgICAgMTYsICAgICAzMiwgICAgLTQ0LCAgICAgIDAsICAgICAyMiwgICAtMTYzLCAgICAgMjMsICAgICAtMywKKyAgICAgICAgMjMsICAgIC02MSwgIDEzMjI0LCAgICAgNTIsICAgLTEzOSwgICAgLTEzLCAgICAxNzEsICAgIDIxNSwKKyAgICAgICAtNTEsICAgIC0yMSwgICAgLTQ4LCAgICAgMzMsICAgIC0xMCwgICAgLTE3LCAgICAtMjEsICAtNzY2MiwKKyAgICAgICAtNTcsICAgIC00NCwgICAgLTUxLCAgICAgMzUsICAgICAzNSwgICAgIDM0LCAgICAxMDUsICAgIDE3OCwKKyAgICAgICAtNzcsICAgICA3NywgICAgMTQ3LCAgICAgNjcsICAgLTgxNiwgICAyOTEzLCAgLTMwODcsICAgIDUxNiwKKyAgICAgIC0xMTIsICAgLTI5NiwgICAgIDIxLCAgICAxMzMsICAgIDIxMSwgICAgMTYyLCAgICAgODcsICAgIC0yNSwKKyAgICAgIC01MzUsICAgLTgzMCwgICAgLTEyLCAgICAgNDYsICAgIC01OSwgICAgLTEwLCAgICAgLTQsICAgICA0MiwKKyAgICAgICAgIDAsICAgIC05MSwgICAgIC05LCAgICAgNDcsICAgIC05MCwgICAgLTI5LCAgICAgNzQsICAgIDMyMiwKKyAgICAgIC0xMDYsICAgICA4MywgICAgIDQ0LCAgIDQ2OTMsICAgLTc4OCwgICAgLTczLCAgICAtODUsICAgLTEwNSwKKyAgICAgICAtNzYsICAtMTAzMSwgICAgIDM0LCAgICAgIDYsICAgICA3OCwgICAgLTM0LCAgICAxNjAsICAgIC00OCwKKyAgICAgIC03MDcsICAgIC0xMiwgICAgIC05LCAgICAgMzksICAgICAxNCwgICAgIDIzLCAgICAgODgsICAtMjI4NiwKKyAgICAgICAgMjEsICAgIC0yNSwgICAgIDQyLCAgICAxMzAsICAgICAzOSwgICAgMjUxLCAgICAgMTYsICAgIC01MCwKKyAgICAgICAzOTcsICAgLTIyNiwgIC0yNTcwLCAgICAgODgsICAgLTEyOSwgICAtMzQ3LCAgICAxNTksICAgICA5MiwKKyAgICAgICAgIDAsICAgIC00NCwgICAgLTQ5LCAgICAyMzUsICAgLTE5NiwgICAgLTI0LCAgICAtMzYsICAgIDExMywKKyAgICAgMTMzODcsICAgICA0NSwgICAgIDIyLCAgICAgNTQsICAgIC0yMCwgICAgIDI5LCAgICAgMjcsICAgIC0yNywKKyAgICAgICAgNTQsICAgICAzOCwgICAgLTYzLCAgICAtMTIsICAgIC03NCwgICAgIDQ1LCAgICAgLTgsICAgLTExNSwKKyAgICAgICA1OTEsICAgICA0NiwgICAgICA1LCAgIC0yMzQsICAgICA1NywgICAgMTI0LCAgICAgODYsICAtMzc5NCwKKyAgICAgICAtNTEsICAgIDI5MiwgICAtMTYwLCAgIC0xNTIsICAgICA5NiwgICAtMzM0LCAgICAzNDgsICAgICA5NiwKKyAgICAgIC0xODYsICAtMzg3MCwgIC0zNzE1LCAgICAgNTQsICAgICAgMCwgICAgLTI5LCAgICAtNjUsICAgIC02OCwKKyAgICAgICAgIDYsICAgIDEzMiwgICAgIDQ3LCAgIC0xNTUsICAgICA2MiwgICAgIDI2LCAgICAgNjYsICAgIC0xMCwKKyAgICAgICAtNDYsICAtMzA5MywgICAgIDY2LCAgIDM2MzMsICAgIDE4MywgICAtMTcxLCAgIC0xMzIsICAgIC0yNCwKKyAgICAgICAxNTQsICAgIDE1NywgICAgMTI5LCAgIC0xODUsICAgICAxMiwgICAgLTI2LCAgICAgOTYsICAgIC0xMiwKKyAgICAgICAgODgsICAgIC0zNCwgICAgIDQyLCAgICAtMTUsICAgICAzNywgIC02NjI1LCAgICAtMjcsICAgICAxMywKKyAgICAgICAgNDEsICAgIC0zMCwgICAgIDYyLCAgICAxNDIsICAgIC05MywgICAtMTY4LCAgICAgODQsICAgIC0yMiwKKyAgICAgICAxMzksICAgIC0xOSwgICAgIDE4LCAgMTA1OTAsICAgLTExMSwgICAgIDM2LCAgICAgMTMsICAgIC00NCwKKyAgICAgICAgIDQsICAgIC00NSwgICAgIC0zLCAgICAgLTMsICAgICAyOCwgICAgLTI1LCAgICAgLTQsICAgIDExNSwKKyAgICAgICAxMTksICAgIC00OSwgICAgIDQxLCAgICAgMzMsICAgICA4NywgICAgLTg1LCAgMTI0NDQsICAgICA3MywKKyAgICAgICAgNzEsICAgLTExMSwgICAgIDYxLCAgICAtMTUsICAgIDExNywgICAgIDIzLCAgICAtMjQsICAgICAtNSwKKyAgICAgICAxMzEsICAgIC0zMSwgICAgIC0xLCAgICAtMjIsICAgIC01NywgICAgLTEyLCAgICAgNTAsICAgICAzNSwKKyAgICAgLTE1NTUsICAgIC0yMCwgICAgIDM4LCAgICAgODIsICAgIC01MiwgICAgIDI3LCAgIC0xMjgsIC0xNDEwNiwKKyAgICAgICA4MDgsICAgIDE5MCwgICAgIDg5LCAgICA1OTUsICAgICA2MywgICAtMjkxLCAgICAyODIsICAgIC00OCwKKyAgICAgICAgMzIsICAgLTcwNiwgICAtNDMzLCAgIC02NzMsICAgMzI4NSwgICAxMzExLCAgICA4MzAsICAgMzc0NSwKKyAgICAgIC0yMDQsICAtMTE4NSwgICAtNTg0LCAgICAtNTEsICAgIDk1MiwgICAxMDA1LCAgIC01NjYsICAgMTc2NCwKKyAgICAgICAxODYsICAgMTIxMSwgICAtNDk1LCAgIC0xMTIsICAgMTIxMywgICAgMTkyLCAgIDIzMjAsICAgIC00MywKKyAgICAgICAtMzAsICAgICAyNCwgIC0xMTUyLCAgICAgIDIsICAgICAgMiwgICAgIDMyLCAgICAtNTUsICAgIC0yNSwKKyAgICAgICAgLTIsICAgIC0xNywgICAgLTE0LCAgICAgLTYsICAgICAyMiwgICAgLTU0LCAgICAgMzIsICAgICA0NSwKKyAgICAgICAgMTAsICAgIC04NSwgICAgLTI2LCAgICAtMTYsICAgIC02NiwgICAgLTYwLCAgIC0yMTAsICAgLTEwNCwKKyAgICAgICAyMDgsICAgLTI0OCwgICAgIDYyLCAgICAtMjgsIC0xNDU1MiwgICAgLTExLCAgICAtNDQsICAgMTYwMSwKKyAgICAgICAgNDcsICAgLTEzOCwgICAgIDQ2LCAgICAtMzUsICAgMjY0NywgICAgLTgxLCAgICAgLTMsICAgIC0zOCwKKyAgICAgICAtNjYsICAgIC01OSwgICAgLTMzLCAgICAtMTksICAgICA0MywgICAgLTE3LCAgICAtNzksICAgICA1MywKKyAgICAgIDE4MjEsICAtMTU3MiwgICAyNTgyLCAgICAgODUsICAgICA0OCwgICAtMTQwLCAgICAgNzgsICAgLTE1NSwKKyAgICAgIC0xNzMsICAgICA5NiwgICAgLTMyLCAgICAxMjEsICAgIC01OCwgICAgMjAxLCAgIC0xNzQsICAgIC01NCwKKyAgICAgICAgNzQsICAtMjQ0MiwgICAtMjgyLCAgIC03NzEsICAgICAzNywgIC0yOTMwLCAgICAgMTUsICAgMTc2MiwKKyAgICAgICAxNTQsICAgIDI2MywgICAgLTE1LCAgICAtMTksICAgIDEzOSwgICAgMjQ2LCAgIC0yNDMsICAgIC0zMSwKKyAgICAgICAgODQsICAgIDE0NSwgICAgICA4LCAgICAxNTIsICAgICA0MywgICAgMTI4LCAgICA2NzksICAgMTgyOCwKKyAgICAgIDM0NzYsICAgICAxNywgICAgIDkyLCAgICAxMDIsICAgIDI1OCwgICAgLTI5LCAgIC0yNzUsICAgIC0zOSwKKyAgICAgIC0xODcsICAgICA4OCwgICAgIDcwLCAgICAgMjgsICAgICAgMiwgICAyMTQzLCAgICAyNzQsICAgIDIwMiwKKyAgICAgICAtNjcsICAgIC0xMywgICAgLTIyLCAgICAgNjgsICAgIC0zNSwgICAgMTM1LCAgICAxMTQsICAgIDEwOCwKKyAgICAgICAgMjcsICAgICAgMSwgLTExMjQ4LCAgIC0xMDAsICAgICAxNCwgICAgIDI2LCAgICAgNTksICAgICAxMCwKKyAgICAgICAtMjQsICAgICAzMCwgICAgICAxLCAgICAtMzgsICAgICAtOSwgICAgIDIxLCAgICAgMTgsICAgICAtMSwKKyAgICAgIDIwMjksICAgIC04MywgICAtMzQyLCAgIDM0NDMsICAgIC0yNSwgICAgICA3LCAgICAgIDAsICAgICA1NCwKKyAgICAgICAgNzgsICAgIDE5OCwgICAgIDQ1LCAgICAyMzMsICAgICAtNiwgICAgICAwLCAgIC0xMDksICAgLTE3MiwKKyAgICAgLTIyNTAsICAgICA0MSwgICAgLTc5LCAgIDI4MjAsICAgICA0NCwgICAgMjE2LCAgICAgMzksICAgICA1OSwKKyAgICAgICAtNDEsICAgICA1MiwgICAgIDc5LCAgICAtNTIsICAgICAxMiwgICAgIDIzLCAgICAtNzIsICAgLTEyNSwKKyAgICAgICAgODMsICAgICAxNywgICAgLTI4LCAgICAtMzIsICAgICAxMywgICAgICAyLCAgICAgMjgsICAgICAgMCwKKyAgICAgICAtMjYsICAgICA3NSwgICAgLTgxLCAgICAgNjYsICAgICAyNSwgICAgLTgxLCAgIDY1MTYsICAgICAgOSwKKyAgICAgICAtOTMsICAgICA0OSwgIC00MDM2LCAgLTI0ODQsICAgIC00MiwgICAgLTcxLCAgICAxNzgsICAgICA5OSwKKyAgICAgIC0xMzMsICAgICA3OSwgICAgLTQxLCAgIC0xMTIsICAgICA1NywgICAgIDY2LCAgICAtMjgsICAgICAxMywKKyAgICAgICAgMzksICAgICA2NCwgICAtMTIzLCAgIDMxNzQsICAgMzA2MSwgICAgMjU5LCAgICAgNTUsICAgIDEyMywKKyAgICAgIC0xMjMsICAgIDI0NiwgICAtMTM4LCAgICAxMzksICAgICA3NSwgICAgIDMxLCAgIC0yMTUsICAgLTE1NCwKKyAgICAgIC0yMTgsICAgICAyNiwgICAgIDE2LCAgICAgMjEsICAgIDEyNiwgICAgIDI2LCAgICAtMzMsICAgIC0xMCwKKyAgICAgICAtMTUsICAgICAxNiwgICAgLTIwLCAgICAtNTMsICAgICAyMSwgIDE1NTI2LCAgICAtMzUsICAgIC01OSwKKyAgICAgICAtNTAsICAgIC0xMSwgICAgLTU4LCAgICAgNjcsICAgIC0xMSwgICAgMTA3LCAgICAtMjQsICAgIC0zNywKKyAgICAgIDgxNTUsICAgICAzMSwgICAtMTExLCAgICAtNjIsICAgIDEzOCwgICAgLTYwLCAgICAtMTAsICAgICA4NCwKKyAgICAgIC0xMjgsICAgICAzNywgICAgIDI0LCAgICAtNDUsICAgIC0xMCwgICAgMTI5LCAgICAtNjgsICAgIC0zNywKKyAgICAgICAgNDIsICAgIC04MCwgICAtMjA1LCAgICAtNzksICAgNTk5NCwgICAgLTkzLCAgIC0yNzAsICAgLTQwMCwKKyAgICAgICAgMjAsICAgIC04OSwgICAgLTM5LCAgIC0yMDAsICAgIDIzMCwgICAgMTk3LCAgICAzMjUsICAgLTMwNSwKKyAgICAgIC0yOTQsICAgICA5NCwgICAzMjA3LCAgICAxMjgsICAgMzExOSwgICAgMjI2LCAgICAgMjgsICAgIC00OSwKKyAgICAgICAyNjQsICAgIDE4NiwgICAgICA4LCAgICAtMjksICAgIC0xMywgICAgIDI3LCAgICAgMjIsICAgIC02MywKKyAgICAgICAgNDMsICAgICA4NCwgICAgLTE5LCAgICAgNTcsICAtMjYwNSwgICAgMzE2LCAgICAyNTksICAgIC00MywKKyAgICAgICAgNTAsICAtMjI0MSwgICAgMTA1LCAgICAtMTIsICAgIC0yMywgICAgLTM2LCAgICAgODksICAgICA0MSwKKyAgICAgICAtMTUsICAgIDE0NSwgICAgIDEwLCAgICAtODEsICAgICAgNywgICAgLTUwLCAgICAgNzAsICAgICA2MCwKKyAgICAgICAtMjMsICAgICA1NSwgICAgLTYyLCAgICAgIDAsICAgICA1MiwgICAgLTc3LCAgICAxODAsICAgICA3NCwKKyAgICAgICAgNzksIC0xNDI5NywgICAgICA2LCAgICAgMjQsICAgIDI5OSwgICAtMTA3LCAgICAgIDQsICAgIC0yOSwKKyAgICAgLTMyNTIsICAgIC01MSwgICAgIDQwLCAgIC0xNDMsICAgMzU1MCwgICAgLTI4LCAgICAxMDIsICAgICAyNCwKKyAgICAgICAyMTUsICAgIDE0NywgICAtMTY5LCAgICAtNjAsICAgIC00MywgICAtNDg2LCAgICAgIDUsICAgICAtMSwKKyAgICAgICAgNjIsICAgLTExNiwgIC0yOTE3LCAgICA0MzAsICAgICA1MCwgICAyOTI3LCAgICAxMzksICAgIDEyNywKKyAgICAgICAgNjMsICAgIC01MywgICAgMTQxLCAgIC0yNTUsICAgIC04NSwgICAgIDk1LCAgIC0xMDEsICAgLTE3NiwKKyAgICAgICAxOTUsICAgIDEwNCwgIC0zMDY2LCAgICAtNTYsICAgMzIzOSwgICAtMTYxLCAgIC0yMTQsICAgICA1NywKKyAgICAgICAgMjQsICAgLTM3NSwgICAtMTgxLCAgICAgIDAsICAgLTI1OSwgICAgMTMwLCAgIC0xMjAsICAgICAtMiwKKyAgICAgICAgLTYsICAgIDE3NSwgICAtMTQ3LCAgIC0xODUsICAgICA2OCwgICAgMjE5LCAgICA0MjUsICAgMjY4NSwKKyAgICAgLTMxMjAsICAgIDI2NiwgICAgMjQ2LCAgIC0yNzAsICAgIC03MCwgICAgMjczLCAgICAxNjgsICAgIDEyMSwKKyAgICAgIC0xNDMsICAgMjY0MSwgICAtNTUzLCAgIC01NDcsICAgIDYzOCwgICAgMTEzLCAgIDI5NjUsICAgLTE2MSwKKyAgICAgICAgMjksICAgLTM3NCwgICAgMTA1LCAgIC04NjksICAgIDEwOCwgICAgIDcwLCAgICAgMTUsICAgIDIzMCwKKyAgICAgICAtNTQsICAgLTEwNiwgICAgLTIxLCAgICAgLTQsICAgICA4NiwgICAgIDg1LCAgICAxNTUsICAgLTEyMCwKKyAgICAgICAtMTcsICAgIC0yMSwgIC0yNTM0LCAgICAgNTcsICAgIDE0OSwgICAtMTI5LCAgICAgMjEsICAgLTE2OSwKKyAgICAgLTIyODksICAgLTEyNywgICAgLTE5LCAgICAtMjYsICAgICAgMywgICAgIDYwLCAgICAgMzUsICAgICAgMSwKKyAgICAgICAtMjgsICAgICAtNywgICAgIDM2LCAgIC0xODAsICAgIC0xMywgICAgIDg3LCAgICAtNjgsICAgICA1NiwKKyAgICAgICAgODAsICAgICA2NCwgICAgIC04LCAgICAtNzMsICAgNjY5MSwgICAgLTMyLCAgICAgNDcsICAgICA0OCwKKyAgICAgICAgLTYsICAgICA2MSwgICAgIDM2LCAgICAgLTgsICAgIC00MSwgICAgIC0xLCAgICAgMTMsICAgICA2OCwKKyAgICAgICAxNDAsICAgIC01MSwgICAgIDI1LCAgICAgMTIsICAgICAgMywgICAgIDU3LCAgICAtNTQsICAgIC0zMywKKyAgICAgICAtMTksICAgICAxMiwgICAgIDI4LCAgICAtNjAsICAgIC01NiwgIC0yMzk5LCAgICAtMTQsICAgIDEyNywKKyAgICAgIDE5MzUsICAgICA4NCwgICAgMTI3LCAgIC0xOTMsICAgICAtMywgICAzMzA3LCAgICAtNTYsICAgICAxNSwKKyAgICAgICAgMzEsICAgLTExNiwgICAtMTg3LCAgICAyMzYsICAgLTI4OSwgICAgMjYxLCAgICAgNjksICAgIDE0NCwKKyAgICAgIDE3MjMsICAgICA3OSwgICAgLTY4LCAgICAxMDIsICAgIDcyNywgICAgIDY5LCAgICA2NTQsICAgIC02MCwKKyAgICAgICAgMjEsICAgIDEyNCwgICAzNDk3LCAgICAyNDgsICAgLTY4NCwgICAxNDY5LCAgICAzNjgsICAgLTI1NCwKKyAgICAgIC0yMTEsICAtMjYwMCwgICAgNzcxLCAgIC0xMzgsICAgIDM2OCwgICAzMDg5LCAgICAgNTIsICAgLTIwNiwKKyAgICAgICAxNDcsICAgIDIwMCwgICAgLTE1LCAgIC0xMzYsICAgIDE5NCwgICAtMTY0LCAgIC0zNTIsICAgLTE1MiwKKyAgICAgLTQ4NzAsICAgICAgNSwgICAgMTkxLCAgICAgLTMsICAgIC05NywgICAgIDI4LCAgICAtNDEsICAgIDEwNywKKyAgICAgICAgIDIsICAgICAxMSwgICAgIDYwLCAgICAtNzYsICAgIC0zNSwgICAgLTQyLCAgICAxMjksICAgIC03NywKKyAgICAgLTI2MTAsICAgLTI5NSwgICAtMjE4LCAgIC0zNjksICAgICAxMCwgICAgMjUzLCAgICAgMTUsICAgLTEyNSwKKyAgICAgICAgNzQsICAgIC04NywgICAgLTcwLCAgIDMzNjYsICAgIDExNSwgICAgMjQwLCAgIC0xMDYsICAgIC05MywKKyAgICAgICAxMjEsICAgICAxMCwgICAgIDM2LCAgICAgIDksICAgIC0xOCwgICAgLTY2LCAgICAtNzcsICAgICAgNywKKyAgICAgICAgMzcsICAgIC03NiwgICAgLTIyLCAgIDI5MTMsICAgIDI0MiwgICAgIDIyLCAgICAxNzIsICAgIDEwMiwKKyAgICAgICAxODYsICAgLTIzMSwgICAgIDkwLCAgICAtMTEsICAgIC01NywgICAgIDQ1LCAgICAtMTAsICAgIC00NCwKKyAgICAgICAtODQsICAgICA0NCwgICAtMTE3LCAgICAtNDMsICAgICA0OSwgICA1NTg1LCAgICAgMTgsICAgLTE2NiwKKyAgICAgICAtNDMsICAgICA2NCwgICAgIDI4LCAgICAgLTksICAgICAyNiwgICAtMTYwLCAgICAgMzEsICAgIC0yOCwKKyAgICAgICAgMjksICAgICA1NiwgICAgIDI5LCAgICAtNTcsICAgIDEwOSwgICAgLTI1LCAgIDMxNDAsICAgLTEzMSwKKyAgICAgICAgNTcsICAgIC0yMCwgICAgIDI3LCAgICAtMjcsICAgICAtNSwgICAgLTQyLCAgICAtNTIsICAgICAxOCwKKyAgICAgICAgMjMsICAgIC01NiwgICAgLTM4LCAgICAtMTQsICAgIDIxMywgICAgLTMzLCAgICAtODYsICAtNDc0MSwKKyAgICAgIC0xNTEsICAgIC00NiwgICAgICAxLCAgICAtMTcsICAgICA0NiwgICAgICA3LCAgICAtMTMsICAgICAgMCwKKyAgICAgICAgNTAsICAgICAyOCwgICAgLTU3LCAgLTcyOTEsICAgIC0yMCwgICAgIDEyLCAgICAgNjYsICAgIDIxNCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMTYxNmwxW10gPSB7CisgICAgICAgLTgxLCAgICAgIDUsICAgIC0xNiwgICAgIDM0LCAgICAgMTksICAxMDkzOCwgICAgMTQxLCAgICAtMjEsCisgICAgICAgIDI3LCAgIC0xMDUsICAgLTExMCwgICAgIDMyLCAgICAtNjcsICAgIC03NSwgICAgIDE5LCAgIC0xMzgsCisgICAgICAgICAzLCAgICAtMTQsICAgLTQwOCwgICAtMzAyLCAgICAgMzYsICAtNDYxMiwgICAgIDIzLCAgIC01NzksCisgICAgICAgLTM1LCAgICAgMTksICAgLTMxMiwgICAgIDM1LCAgICAxMjAsICAgICA5NywgICAgIDgyLCAgIC0xMDksCisgICAgICAgIDQxLCAgLTE3NDUsICAgLTE1OCwgICAgMjk5LCAgLTMwNjksICAgICA4NCwgICAgIDE4LCAgIC00NDcsCisgICAgICAgLTMzLCAgICAgNjUsICAgIC0zMiwgICAgIDQ1LCAgICAgLTcsICAgIDE0NCwgICAgIDg2LCAgICAxMDAsCisgICAgIC0xNzM4LCAgICAyNTAsICAgLTIyNiwgICAtMTM3LCAgICAxNTksICAgIC00NSwgICAgMTM0LCAgICA0MzgsCisgICAgICAgMTAyLCAgICAgMzcsICAgIC0xNSwgICAtMTYxLCAgICAtMjMsICAgNDIyMSwgICAgMTc0LCAgICAgNDcsCisgICAgICAtMjY0LCAgIC0xODIsICAgLTE4MiwgICAgNjg2LCAgIC0yNDgsICAgICA4OSwgICAgLTQxLCAgICAgODAsCisgICAgIC0yNjg3LCAgIC0xOTQsICAgMjU1MiwgICAgNDA3LCAgLTExMDYsICAgLTk3MCwgICAtMTgxLCAgIC0yMjgsCisgICAgICA0Mzk1LCAgICAxMTgsICAgMTAyNywgICAtMjU1LCAgICAxMzYsICAgIDEwMCwgICAgLTQzLCAgICAyNDYsCisgICAgICAgIDgwLCAgICAgMTUsICAgICAzNCwgICAgIDgyLCAgICAtNTQsICAgLTM2NywgICAgNjk4LCAgICAyMzIsCisgICAgICAtMTc3LCAgICAgNDUsICAgIC02NywgICAgIDQ5LCAgICAxMzgsICAgLTE1OCwgICAgMTY4LCAgICAyMDIsCisgICAgICAgIDQzLCAgICAtNzAsICAgLTEwMSwgICAgIDIwLCAgICAtOTcsICAtMzQ2NSwgICAtMzQyLCAgIC0yNTUsCisgICAgICAgMTI3LCAgICAgMjUsICAgIC01MiwgICAgIC01LCAgICAgIDcsICAgICA3NiwgICAgIC0zLCAgICAgMTksCisgICAgICAgLTE5LCAgICAgNDIsICAgICAxMCwgICAgLTYzLCAgICAgMTYsICAgIDEyMSwgICAgNzMyLCAgLTMxMjcsCisgICAgICAgLTQzLCAgICAxMTYsICAgICAzNiwgIC0yNTE5LCAgICAgMjMsICAgICAxOCwgICAgMTgxLCAgICAgNDEsCisgICAgICAgLTMyLCAgICAtMTEsICAgICAyMiwgICAgIDUxLCAgICAgMzUsICAgICAxNiwgICAgLTM0LCAgICAtNjIsCisgICAgICAxNzQ0LCAgICAgOTQsICAgIDE3MywgIC0xMjQzLCAgIC0yNjIsICAgICAxMSwgICAzMjE4LCAgICAyMzksCisgICAgICAgMTQ5LCAgIC0yMTksICAgICAyOSwgICAgMTE4LCAgIC0zODIsICAgLTI4OSwgICAgLTQyLCAgICAxNjEsCisgICAgICAgIDE3LCAgICAgLTEsICAgMjU1MSwgICAgLTgzLCAgICAgOTAsICAgLTEyOCwgICAgMTM4LCAgIDMyMzgsCisgICAgICAgIDQzLCAgICAtMjksICAgLTExMiwgICAgMTEwLCAgIC0yNjgsICAgIDI5MywgICAgIDIzLCAgIC0xMTcsCisgICAgICAgLTY0LCAgIC0xMzcsICAgICA3OSwgICAgLTcwLCAtMTA3NDcsICAgIC02NiwgICAgIDczLCAgICAgOTAsCisgICAgICAgIDM1LCAgICAgOTAsICAgIC0yOSwgICAgLTc4LCAgIC0xMTEsICAgICA3NSwgICAgIDQ4LCAgICAgIDgsCisgICAgICAtMTY5LCAgIDI5NDQsICAgICAxNiwgICAgIDg5LCAgICAxODYsICAgIC0zNCwgICAgIDgyLCAgICAyNDEsCisgICAgICAgLTQ2LCAgICAyNTcsICAgLTI0MywgICAgIDkzLCAgIDI5NjYsICAgIDE3OCwgICAtMjU2LCAgICAtMTgsCisgICAgICAgLTMzLCAgICAxMDMsICAgLTMyMCwgICAtMjcxLCAgIDMwODgsICAgMjg5MywgICAtMjUwLCAgICAxMDIsCisgICAgICAgNjk2LCAgICAxMjQsICAgLTIxMSwgICAgIDE4LCAgIC0xNDMsICAgICA5NywgICAgMjE2LCAgICAtOTksCisgICAgICAgMTk1LCAgICAgNDAsICAgIC0zNSwgICAgMTQ0LCAgICAgMjYsICAgIDEzNSwgICAtMTUyLCAgIC0yMTUsCisgICAgICAgMTIwLCAgICAgMjUsICAgLTI1NCwgIC0xODc1LCAgICA2NTcsICAgIDE5NywgIC0zNTI3LCAgIC0zMzIsCisgICAgICAgMzEwLCAgICAtMTEsICAgMTk1OCwgICAgMTAyLCAgICAtMTIsICAgIC00NSwgICAgICAyLCAgIC0xMjcsCisgICAgICAgICA0LCAgICAgIDEsICAgIC0xOSwgICAgIDQ3LCAgICAtMjAsICAgIC01MiwgICAgIDk3LCAgICAtMzAsCisgICAgIC03NzM4LCAgICAgNTEsICAgICAyNiwgICAgICA1LCAgICAtMjEsICAgICAxOCwgICAgIDE1LCAgICAgMTUsCisgICAgICAgIDY2LCAgICAgMzAsICAgICAtOCwgICAgIC03LCAgICAtMzEsICAgICAtMSwgICAgLTMzLCAgICAgMzgsCisgICAgICAgMTY0LCAgICAgOTAsICAgNjc5OCwgICAgLTMzLCAgICAtOTAsICAgIC0xNywgICAgIC01LCAgICAgMTQsCisgICAgICAgLTQyLCAgICAgMjEsICAgIC0yMCwgICAgLTQxLCAgICAgNDgsICAgICAtNiwgICAgLTM2LCAgICAgIDYsCisgICAgICAtMjA3LCAgLTQzNjMsICAgNTA3NSwgICAgIDMxLCAgICAgIDYsICAgIDEwMCwgICAgIDY1LCAgICAgODYsCisgICAgICAgIDE5LCAgIC0xNTgsICAgICAyOCwgICAtMTM0LCAgICAtOTEsICAgIC02OCwgICAgICA5LCAgICAtMjYsCisgICAgICAgLTM3LCAgIDI1ODgsICAgIDMwNywgICAzNDY3LCAgIC00NTEsICAgIDEwMSwgICAtNDQxLCAgICAzMjMsCisgICAgICAgIDYyLCAgICAxODgsICAgLTEzMiwgICAtMjk0LCAgICAgOTgsICAgIC0yMiwgICAgMTUyLCAgICAtNDYsCisgICAgICAgIDY1LCAgICAtMzksICAgIC0zNywgICAgLTgyLCAgICAgLTksICAgICAxOCwgICAgIDQzLCAgICAgMTcsCisgICAgICAgICA4LCAgICAgNTYsICAgICA5NywgLTExNTY0LCAgICAgMjEsICAgICAxNSwgICAgIDc1LCAgICAgODUsCisgICAgICAgMTU1LCAgICAgMTUsICAgICAzMiwgICAgICAwLCAgICAgMjAsICAgIC00NSwgICA3NDEyLCAgICAgNDgsCisgICAgICAgICAzLCAgICAgMzgsICAgICA3MiwgICAgIDMwLCAgICAgMjMsICAgICA0MiwgICAgLTIwLCAgIC0xMTAsCisgICAgICAtNDU0LCAgIC0yMzMsICAgIDY1MywgICAtMzI1LCAgIC0yNzYsICAgIDUwNCwgICAtNDgxLCAgICA1ODMsCisgICAgICAgMjcwLCAgIC02NDksICAgIDQ4MSwgIC0zMTY2LCAgIDE2MTksICAgIDE2NCwgICAgLTkwLCAgICAxNTAsCisgICAgICAgIDMyLCAgICAtOTYsICAgIC00NywgICAgIDQ5LCAgICAtMTMsICAgIDExNSwgICAtMTgzLCAgICAgNzUsCisgICAgICAgIDYyLCAgLTkwMjYsICAgICAxMiwgICAgLTkzLCAgIC03MTUsICAgICAgNiwgICAgMTM3LCAgIC0zMzgsCisgICAgICAgODEwLCAgICAtMzksICAgLTI3NywgICAtMTA4LCAgICAtMjAsICAgIDMxNSwgICAgNTcyLCAgICAgLTMsCisgICAgIC00NTcwLCAgIDEwNTMsICAgLTEzMiwgICAgIDEzLCAgICAzODgsICAgLTIyMywgICAtMzU1LCAgICAgMzEsCisgICAgICAgLTQ3LCAgICAgNjEsICAgLTExMywgICAgICA1LCAgICAtMzgsICAgICA0MywgICAgLTQ3LCAgICAtODAsCisgICAgICAyNTUwLCAgICAgMjcsICAgIDI0NywgICAgMjc3LCAgICAtODYsICAgIDMzNiwgICAgMTM5LCAgICAxNDYsCisgICAgICAtMTExLCAgICAtNzMsICAgIDE4NywgICAtMzEyLCAgICAgNjgsICAgLTI3NiwgICAgIDcyLCAgICA2MzgsCisgICAgICAgIDczLCAgICA3OTIsICAgLTE3MCwgICAxMzgzLCAgICA0MjEsICAgLTcwMywgIC0zODEzLCAgICAxMTIsCisgICAgICAgMzkxLCAgIC0xOTUsICAgLTE2MiwgICAgLTI4LCAgICAtMjUsICAgIDMxNywgICAgMjI4LCAgICAtODMsCisgICAgICA0NjExLCAgICA2NTQsICAgIDM1MywgICAtMzgwLCAgIC0yODMsICAgLTYyNywgICAtMzAxLCAgICAxNjEsCisgICAgICAtMTU2LCAgICAtODEsICAgICAgNSwgICAgLTE1LCAgICAtMTMsICAgIC0xNywgICAgIDUzLCAgICAtNTAsCisgICAgICAgIDM2LCAgICAtNjYsICAtNzkyMSwgICAgIC0yLCAgICAtNTQsICAgIC00MSwgICAgLTI2LCAgICAgNDcsCisgICAgICAgIC0zLCAgICAgMjIsICAgICAtNiwgICAgIDExLCAgICAgNjMsICAgICAgMiwgICAgIDQyLCAgICAgNzEsCisgICAgICAgLTUwLCAgICAtODcsICAgIC0zOSwgICAgICAyLCAgICAtNTYsICAgICAtMiwgIDExMTY1LCAgICAgNDQsCisgICAgICAtMTE5LCAgICAtNzQsICAgIDEzMSwgICAgMTM0LCAgICAgIDUsICAgIDExNSwgICAgLTM5LCAgICAxNDQsCisgICAgICAgLTIzLCAgICAgIDAsICAgIDE4NiwgICA0NjQ4LCAgICAzNTEsICAgICAzNiwgICAgLTcwLCAgICAtNzEsCisgICAgICAxNzA2LCAgIDIxMzEsICAgLTIyOCwgICAgIDQyLCAgICAgIDYsICAgICAgOCwgICAgICA0LCAgICAtNDMsCisgICAgICAgLTEyLCAgICAtNDAsICAgIC00NCwgICAgIC03LCAgICAtMTQsICAgICAxMSwgICAgIDgzLCAgICAtOTMsCisgICAgICAtMTQ0LCAgICAxODYsICAgIC00NiwgICAgIC05LCAgICAgMTMsICAgIC04NywgICAtMTIwLCAgICAgNzAsCisgICAgICAtMjA5LCAgICAxMTUsICAtMzUxMywgICAgMTM5LCAgICAtNDYsICAgIDEzMywgICAgIDk2LCAgICAgMjUsCisgICAgICAgMjE1LCAgICAtMzUsICAgLTQzNywgICAgMTI2LCAgICA0MDMsICAgLTExNSwgICAgMTQ1LCAgICAyMDMsCisgICAgICAgLTY5LCAgIC0zMzQsICAgICAzNywgICAgOTM0LCAgIC00ODEsICAgMzE2MywgIC0yNTI4LCAgICAtNDksCisgICAgICAgIDU3LCAgICAxMDAsICAgICA3NiwgICAgIDgyLCAgICAyNTEsICAgIDI4OCwgICAtMTE0LCAgICAgNDYsCisgICAgICAtMjAxLCAgIC0xNjEsICAgLTE2MSwgICAtNzE2LCAgLTQwODAsICAgIDM3OCwgICAtODMwLCAgIC0yNTQsCisgICAgICAgIDEyLCAgLTIxMTAsICAgLTMwMCwgICAgIDc4LCAgICAyODgsICAgICA0OCwgICAgLTkwLCAgICAtOTksCisgICAgICAgLTMxLCAgIC0xMTAsICAgIDIwMSwgICAgIDY2LCAgICAzMjcsICAgIDExOSwgICAtMTgwLCAgICAxNDgsCisgICAgICAgNjMzLCAgICAgNzEsICAtNDEwMCwgICAgIDMzLCAgICAgNTcsICAgICAtOSwgICAgLTQ4LCAgICAxNTEsCisgICAgICAgLTIwLCAgICAgNzIsICAgICA3MSwgICAgLTExLCAgICAgMzksICAgIC02NywgICAgMTc2LCAgICAgMjcsCisgICAgICAgMTQzLCAgICAxOTgsICAgIDM4MywgICAgMTU1LCAgIDMxODIsICAgLTEyOCwgICAtMTUyLCAgLTMyMDksCisgICAgICAtMTcyLCAgIC0yNjIsICAgIC0xMywgICAgMTI5LCAgIC0xNjcsICAgLTEyOCwgICAgIDU1LCAgICAgNDYsCisgICAgICAgLTM3LCAgICAgNzAsICAgIDEwNywgICAgICA3LCAgICAtMjMsICAtMjA4MiwgICAgMjQxLCAgICAyMzYsCisgICAgICAgLTQ3LCAgICAtODUsICAgIDEwNSwgICAgLTQ3LCAgIC0yMDIsICAgIDIwOCwgICAgMjAxLCAgICAgMzAsCisgICAgICAtMTA2LCAgICAtMTQsICAgIC0zOCwgICAgIDE0LCAgICAtNDUsICAgICAyNCwgICAgLTI0LCAgMTIwODMsCisgICAgICAgIDIyLCAgICAxNTEsICAgIC01OCwgICAgIC05LCAgICAgNTksICAgIDE3MCwgICAgMTEzLCAgICAtODIsCisgICAgICAgMzY5LCAgIC0xNTUsICAgICA1MywgICAgIDk3LCAgIC0xODUsICAgIC01NywgICAgMjAzLCAgICAzMTEsCisgICAgICAgMjM2LCAgIDQ3ODksICAgIC0yNCwgICAtNTkxLCAgLTE0NjMsICAgIDExOCwgICAgIDk0LCAgIC0yNzQsCisgICAgICAzMTg4LCAgIC0xNDUsICAgLTQwNiwgICAgMTgzLCAgICAgIDAsICAgIC01NCwgICAgIDE3LCAgICAtMjIsCisgICAgICAgIDM3LCAgICAtNTUsICAgIC0zNCwgICAgIDYzLCAgIC0zNDAsICAgIDE3NSwgICAtMzAwLCAgICAxMDYsCisgICAgICAtMTkwLCAgICAtMzgsICAgICA2NywgICAgIC0yLCAgICAgMTksICAgIC00NiwgICAgLTQyLCAgICAgMTEsCisgICAgICAgLTMzLCAgICAtMzMsICAgIC0yOCwgICAgLTEwLCAgICAtMjcsICAtOTIzNSwgICAgIDI5LCAgICAgNjIsCisgICAgICAtOTI3LCAgIDEyODUsICAgICA0OSwgICAgIDcyLCAgICAgNjUsICAgICA4OSwgICAgIDU3LCAgICAtNDQsCisgICAgICAgIC05LCAgICAtMTUsICAgICA4NSwgICAgIC0xLCAgICAgNzQsICAgICA4MSwgICAtMTIzLCAgICAxNjAsCisgICAgICAgIDY5LCAgLTI4MDMsICAgIC0yMiwgICAgIDQ3LCAgIC00NjcsICAgIC03NCwgICAgNzQ4LCAgICAxNjgsCisgICAgICAgIC05LCAgICAyMzUsICAtMzE1NSwgICAtMTU0LCAgICAgNDgsICAgIDQ4MywgICAtMzQxLCAgICAgNzQsCisgICAgICAyNDAzLCAgICAgOTcsICAgICA5MywgICAtMTA2LCAgICAyMTksICAgIDEzNiwgICAtMTkxLCAgICAtNTAsCisgICAgICAgICA3LCAgICAgNzEsICAgLTEwMywgICAgMjYxLCAgIDMyODMsICAgLTEyNCwgICAtNjI0LCAgLTI1NzAsCisgICAgICAgIDczLCAgICAtMzEsICAgICAxMCwgICAgLTczLCAgICAgMzAsICAgIC0xNSwgIC0yMjU2LCAgICAgLTIsCisgICAgICAgLTczLCAgICAgNTUsICAgICA3MywgICAgIDE0LCAgICAtNzQsICAgIC04MSwgICAgIDM4LCAgICAzNTIsCisgICAgICAgMTA4LCAgICAtMTgsICAgICAyNSwgICAgIDYxLCAgICAgNTQsICAgICAgMSwgICAgIC01LCAgICAxMDksCisgICAgICAgIDI1LCAgLTI2NzYsICAgIC0yNSwgICAgLTUyLCAgIC0zMTYsICAgICAgMiwgICAgIDM2LCAgICAtMzYsCisgICAgICAtMzU1LCAgICAgNDAsICAgIC0xOSwgICAgMTIwLCAgICAgMjcsICAgICAtNCwgICAgLTUxLCAgICAgLTgsCisgICAgICAgIDQyLCAgICAtMTAsICAgIC0yOCwgICAgLTkwLCAgIC0xNDMsICAgICAyOSwgICAgLTEwLCAgLTg0NDIsCisgICAgICAgLTIyLCAgIC01NjYsICAgICA1OSwgICAgLTM5LCAgICAgLTEsICAgICAyNywgICAgIDI5LCAgICAtMjAsCisgICAgICAgICA2LCAgICAgMTksICAgICAgMCwgICAgLTM2LCAgICAgMzgsICAgICA2OCwgICAgLTQzLCAgICAgMzUsCisgICAgICAgIDIyLCAgICAtNDcsICAgLTE0NiwgICAzNTY3LCAgICAgMTMsICAgICAxMiwgICAzMjMwLCAgICAtMTgsCisgICAgICAgLTMyLCAgICAgNzUsICAgLTExMiwgICAgIC04LCAgIC0xNTcsICAgIC0yMywgICAgMTAxLCAgICAxNjUsCisgICAgICAgMTk4LCAgICAgOTMsICAgIDM4MywgICAxMjM2LCAgIDEwNzcsICAtMzU5MiwgIC0xNDAxLCAgIDExMzUsCisgICAgICAgODQ0LCAgIC0yNjYsICAgIC03NCwgICAgLTcwLCAgIC0yODAsICAgIC05OCwgICAgIDY3LCAgIC0xMDksCisgICAgICAgIDM4LCAgLTUxMDksICAgIC02NiwgICAgLTU3LCAgICAgODksICAgIC0yMSwgICAgICA2LCAgICAgMTksCisgICAgICAgLTIxLCAgICAgNzAsICAgICA2MCwgICAgIDc2LCAgICAgMzUsICAgICAxOCwgICAgIDQ0LCAgICAgNTEsCisgICAgICAgIDQ1LCAgICAgNDAsICAgICA1NCwgIC02Njg1LCAgICAtNjcsICAgICAgOSwgICAgMTEzLCAgICAtMjksCisgICAgICAgLTEwLCAgICAtOTYsICAgICA4MCwgICAgIDk4LCAgICAxMDMsICAgIC00MCwgICAgIC04LCAgICAtMjAsCisgICAgICAtMTMxLCAgICAgMTUsICAgIDI2MiwgICAgIDQ3LCAgIC0yNTMsICAgLTExNiwgICAgLTEyLCAgLTQ4MDcsCisgICAgICAgICAyLCAgICAtODEsICAgICA3NiwgICAgLTQ2LCAgICAgMzcsICAgIDM1MywgICAtMTMwLCAgIC0xOTEsCisgICAgICAtMTI3LCAgICAtMTAsICAgIC0zNSwgICAgIDkxLCAgIC0xMjIsICAgIDE3MywgICAtMTY1LCAgICAgLTgsCisgICAgLTE1MTc5LCAgICAgODYsICAgLTE4NiwgICAgMTIzLCAgIC0yOTUsICAgIC0yNSwgICAgIDIxLCAgICAgNjMsCisgICAgICAgLTkzLCAgICA3MzAsICAgICAyMCwgICAtMTIwLCAgLTQ2MjQsICAgIDM0MCwgICAtMjUzLCAgIC00NzMsCisgICAgICAgIDQ0LCAgICAtMTgsICAgIC05OSwgICAgLTM3LCAgICAtNTQsICAgLTMxNywgICAgIDY1LCAgICAtNTIsCisgICAgICAyMTY3LCAgICAgNjgsICAgLTI0NSwgICAgMjI0LCAgICAxMTcsICAgLTE4MCwgIC00Njk1LCAgIC0yNzYsCisgICAgICAgMTE4LCAgICAxNDIsICAgLTEwMSwgICAgMjAyLCAgIC0zMDEsICAgIC0zMywgICAtMTI5LCAgIC0zMDMsCisgICAgICAgLTkwLCAgICAtNzUsICAgICA1MCwgICAgIDk4LCAgICAtNTYsICAgIC02OCwgICAtMTUzLCAgICAtMzgsCisgICAgICAgMTY4LCAgIC0yNzgsICAgIC0yMiwgICAgLTY0LCAgIDk3NTcsICAgIC05MSwgICAgLTIzLCAgIDEyODQsCisgICAgICAgIDUzLCAgICAgNTYsICAgIC0xMSwgICAgLTQ2LCAgLTE2NDUsICAgICAxMSwgICAgIDE1LCAgICAgMTIsCisgICAgICAgICA4LCAgICAtNDAsICAgICAtMiwgICAgIDg0LCAgICAtNTYsICAgICAxNywgICAgIC03LCAgICAtMzAsCisgICAgIC00MDEwLCAgLTM1NTcsICAgLTI1MiwgICAgIDU2LCAgICAtNzksICAgIC04NywgICAgIC03LCAgICAgIDgsCisgICAgICAgIDc5LCAgICAgMTYsICAgICAyMSwgICAgIDUxLCAgICAtNjMsICAgIC0yMiwgICAgMTE4LCAgICAyMjgsCisgICAgIC0xNTI1LCAgICAtNzgsICAgIC0yMiwgICAgIC0yLCAgICAgMTYsICAgIC00OSwgICAgIDE3LCAgICAtMzcsCisgICAgICAgIC0zLCAgICAtMTQsICAgICAxMCwgICAgIDMxLCAgICAgMTcsICAgLTExMSwgICAgIDMyLCAgIC0xNDQsCisgICAgIC0zNjEyLCAgIDM0NzMsICAgICA3OSwgICAgIDIzLCAgICAtODksICAgICA3NCwgICAgIDMzLCAgICAtMjksCisgICAgICAgIDExLCAgICAtNDIsICAgIC00MiwgICAtMTI5LCAgICAtNDEsICAgIDE1NSwgICAgIDUyLCAgICAgMzEsCisgICAgICAtMTYyLCAgMTI2MDksICAgIDE0NywgICAgIDE3LCAgICAgNjgsICAgICAgMiwgICAgIDE1LCAgICAtMTIsCisgICAgICAgLTM5LCAgICAgNTAsICAgLTEwOCwgICAgLTY2LCAgICAxMjEsICAgICA2OSwgICAgLTI3LCAgICAgOTQsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjE2MTZzMFtdID0geworICAgICAgMTIxMywgIC0xMzAyLCAgLTExMzAsICAgICA5MCwgICAgLTY5LCAgICAgMjIsICAgLTM2MCwgICAgMzYwLAorICAgICAgIC01NSwgICAgNDUzLCAgIC03MDUsICAgNDQxNiwgICAgMjI3LCAgICAxNzMsICAgICAtOCwgICAgMTQ5LAorICAgICAgIDIxMCwgICAtMTE4LCAgICAgNTEsICAtMzc1OSwgICAgOTQ5LCAgIDI0MTgsICAgLTIzOCwgICAgMjAxLAorICAgICAgLTU5NywgICAgIDk0LCAgIC0yNTMsICAgICAyNCwgICAgMjI1LCAgIC00OTcsICAgIC01OSwgICAgMjczLAorICAgICAgIDU3NiwgICAgNjUxLCAgICA2MDgsICAgLTQ4MywgICAgMzM1LCAgIC0xMjUsICAgIDI1NiwgIC0yODczLAorICAgICAgIDMxOCwgICAtMTQ2LCAgIC02NTAsICAgLTMwNiwgIC0yMDIxLCAgIDEwNDQsICAgICA0MSwgICAtNDU1LAorICAgICAtMTEyMCwgICAgODMyLCAgICA5NzgsICAgIDIxMiwgICAtNDYzLCAgIC0yMDksICAgICAxMiwgICAtMjc1LAorICAgICAgIC0yMCwgICAgMTE4LCAgICAgMzEsICAgIDYzOSwgICA1OTMzLCAgIC0xODAsICAgLTEyMSwgICAtMjg1LAorICAgICAgICA2NSwgICAgMjEyLCAgICA0MzksICAgLTEzNSwgICAgNTM4LCAgICAxMTYsICAgLTMwMiwgICAtMjQ1LAorICAgICAgMjUzNCwgICAtNjIzLCAgIDE1NDksICAgIC0zNCwgICAgNzI3LCAgLTE3NTAsICAgMTQ3NywgICAgIDc5LAorICAgICAgMTY2OSwgICAtODI4LCAgICA2MTgsICAgLTg1NiwgICAgNzczLCAgIC0yODYsICAgIDM0MywgICAgLTk0LAorICAgICAgIDEwNywgICAtMzIwLCAgLTMxNDQsICAgLTM4MCwgICAgNjk0LCAgICAtODAsICAgIDg0MywgICAgMTAzLAorICAgICAgLTcwMCwgICAtMjY5LCAgICA0NTIsICAtNjg0NywgICAgLTEyLCAgIC01MjcsICAgICA5NywgICAgLTIxLAorICAgICAgIC03NiwgICAtMjQ2LCAgICAgIDIsICAgLTEwNCwgICAgLTY4LCAgICAgOTgsICAgIDMxMiwgICAgMTE3LAorICAgICAgLTM0MiwgICAxMDI1LCAgICAyMDcsICAgIDgzOCwgICAgLTcxLCAgIDI0NjMsICAgICA2MCwgIC0xMjk0LAorICAgICAgMTU0OSwgIC0xMzEwLCAgIC0yMDIsICAtMTU4NSwgICAgNjgyLCAgICAzMjcsICAgIDYwOCwgICAgNjQ5LAorICAgICAgIDY2NCwgICAtODAxLCAgICA1ODgsICAgIDEzNywgICAtNDY4LCAgICAyODYsICAgIDIzNCwgIC02NzI2LAorICAgICAgLTEwNywgICAgMTc3LCAgIC0xNDcsICAgIDI3OCwgICAgMTE4LCAgICAtODEsICAgLTI0MiwgICAgIDk3LAorICAgICAgLTIzNSwgICAxNTk5LCAgIC04NzcsICAgMTk4NSwgICAgNDQ4LCAgIC0zMTksICAgLTc0NSwgICAtNTA0LAorICAgICAgLTQzMywgIC0xODU5LCAgICAtMzUsICAgIDI4NiwgICAtNjY1LCAgLTE0NDksICAgLTEyNCwgICAgLTk3LAorICAgICAgIDkzMCwgICAyNjIyLCAgICA2ODIsICAgIDY5OCwgICAxODk4LCAgIDExMjAsICAgLTMyMywgICAtMTQyLAorICAgICAgLTY3OSwgICAgMjk0LCAgIC0xNjIsICAgLTUzOSwgIC0xNjQ5LCAgICAxNTIsICAgICAyMywgICAtNDE0LAorICAgICAgMTQ5MywgICAgNjAyLCAgICA5MTMsICAgMTQyOCwgIC0zMjEyLCAgIC0xMDMsICAgLTMzMCwgICAgNTU3LAorICAgICAgIDQ2MywgICAgIDkyLCAgICAyNTEsICAgIDMzOSwgICAgIDE2LCAgICA5MzYsICAgLTExNiwgICAgMjI5LAorICAgICAgLTgyNywgICAtNTA0LCAgIDIwMTUsICAgMTU1MywgICAtNTAzLCAgIC0zNTAsICAgIDIxNCwgICAgMzg2LAorICAgICAgIDI5NSwgICAyNjk3LCAgICA0MjksICAgICA3MiwgICAtNzA1LCAgIC0xMjAsICAgIDQyNywgICAtMTM5LAorICAgICAgLTMzNCwgICAtMzE4LCAgLTY2MTMsICAgLTQ2OCwgICAgIDEwLCAgIC0xMjIsICAgICA1OSwgICAtMzIyLAorICAgICAgLTE2NSwgICAtMTQ0LCAgICAgNDUsICAgLTQyNywgICAgLTEyLCAgICAtNzksICAgLTIwMiwgICAtMjY2LAorICAgICAgIDk4MSwgICAtMjczLCAgICAyNDAsICAgLTQ1NCwgICAgLTMwLCAgIC0xMTksICAgIDM0MCwgICAgIDkyLAorICAgICAgLTI1MSwgICAgMjQ3LCAgICAxODksICAgICA3MSwgICAgMjQzLCAgLTU2NDgsICAgLTYwMSwgICAtNDM0LAorICAgICAgLTY3NCwgICAgODY3LCAgIC03MTMsICAgLTQyOCwgICAtMTAxLCAgIC0yMzEsICAgMTE0NCwgICAgLTg5LAorICAgICAgIC0xMCwgICAgIDU3LCAgICAzMDIsICAgIDE1NCwgICAgMzYyLCAgIC00MjUsICAgMjAxNCwgICAyNTc3LAorICAgICAtODY1OSwgICAgMzg5LCAgICAtOTAsICAgICA3NiwgICAgIDE1LCAgICAxNDcsICAgICAzMCwgICAtMjAyLAorICAgICAgIC05OSwgICAtMjU1LCAgIC0yNDIsICAgLTE2NSwgICAgMjU3LCAgICAgOTcsICAgICA0MSwgICAgLTcyLAorICAgICAgIDI2MywgICAgNjEzLCAgICAyNzIsICAgIDQwMCwgICA1MDIwLCAgIC0xOTksICAgLTE5NiwgICAtMTc3LAorICAgICAgLTI3NiwgICAgLTI1LCAgICAgMjgsICAgICA5NywgICAtMTU1LCAgICAxMTksICAgIDc2MywgICAgIDMzLAorICAgICAtMzU0MCwgIC0xNDQ3LCAgICAgMTYsICAgLTE2OSwgICAgMTQ4LCAgIC0xNDMsICAgIDcwNywgIC0yNDgzLAorICAgICAgIDE3OCwgICAgIDgzLCAgICAtODMsICAgIDE1NCwgICAgLTc1LCAgICAtMTUsICAgIDE1MywgICAgMjgzLAorICAgICAgLTMyMywgICAtMTM5LCAgLTEzOTAsICAgICA2OSwgICAgNzI1LCAgLTE3NDQsICAgIDMzMSwgIC0zNjY1LAorICAgICAgIDQxNSwgICAtNTE0LCAgIC0zNjYsICAgIDEyNCwgICAgNjYwLCAgIC0yOTUsICAgIDE4MCwgICAgIDc3LAorICAgICAgLTIyOCwgICAgMTkyLCAgICA2ODQsICAgLTE5MywgICAgICA0LCAgIDQ0MDksICAgIDI5OCwgICAgNDI3LAorICAgICAgIDU5MSwgICAgMjkwLCAgIC0xNTksICAgLTE2NiwgICAtMzcyLCAgIC01MTQsICAtMTg0MCwgICAtNTYyLAorICAgICAgIDc5NSwgIC0xNzY1LCAgIC0zNDksICAgMTE3OCwgIC0xNjE5LCAgIC0zOTEsICAgIDYxNSwgICAtNzg0LAorICAgICAgMTM1MywgICAgNzQ2LCAgIC04NzEsICAgLTk5NCwgICAgMTgyLCAgIC00NjQsICAgLTQ5OCwgICAgLTk2LAorICAgICAgLTMwNiwgICAtNzI5LCAgICA3NDMsICAgIDI3MCwgICAgMjIzLCAgIC03MzEsICAgICA3MywgICAyNjkyLAorICAgICAgMTExMCwgIC0yMzU0LCAgIC0zMjgsICAgIC0yMSwgICAtMTcyLCAgIC0zMzksICAgLTUyOCwgICAgIDkzLAorICAgICAgLTMzOCwgICAgNTQ4LCAgIDE0OTgsICAgIDMwOSwgICAtMTM0LCAgICAxNjAsICAgLTI0NywgICAtNjE5LAorICAgICAgMTEyNywgICAgNzgzLCAgLTE1NTcsICAgIDQwMCwgICAxMDM1LCAgIC00NDUsICAgLTE1NSwgIC0yNDQzLAorICAgICAgIDU5MCwgICAtNzkwLCAgICAxMzcsICAgIDM4OCwgICAxMTg4LCAgICA4NDQsICAgLTM5NSwgICAxMDA1LAorICAgICAgICA1NSwgICAxMTQxLCAgIC0xMjIsICAtMzE3NCwgICAgMTM4LCAgICAxNTUsICAgLTUwNiwgICAgMzA2LAorICAgICAtMzI1NSwgICAyNDMyLCAgIC0xMTYsICAtMTI4OSwgICAtNzQ0LCAgIC0zNTAsICAgICAgMywgICAgMTkyLAorICAgICAgLTE1NiwgICAgIDk1LCAgIC01NTIsICAgIC01NywgICAgMzI5LCAgIC00MDUsICAgIDczNywgICAgMTM4LAorICAgICAgLTgzNSwgICA0MDk2LCAgLTEwMzcsICAgIDc5NywgICAtNDE3LCAgIC00MTgsICAgLTUwNywgICAtNjk0LAorICAgICAgLTI1NiwgICAgIDc4LCAgICAtOTQsICAgIC02MywgICAgLTkzLCAgICA3NTQsICAgLTU1NSwgICAgLTkwLAorICAgICAtMTUxOCwgICAtODc4LCAgICAxNjcsICAgLTM5MiwgICAtMTAwLCAgICAtNzgsICAgIC04MCwgICAgLTQ1LAorICAgICAgNDc3NCwgICAgMTE0LCAgIC0yODQsICAgLTU2MCwgICAgLTIxLCAgICAyNzUsICAgICAxNSwgICAtMTk1LAorICAgICAtMTY5MiwgICAtNzExLCAgLTEwNTcsICAgIDE2NywgIC0xNTU1LCAgIC02OTAsICAgLTI2MywgICAtMjY3LAorICAgICAgIDMxMCwgICAtMjI5LCAgICAtMTQsICAgLTg4MCwgICAgNDI2LCAgLTI4MjYsICAgIDMyMCwgICAgLTQ5LAorICAgICAtMTIyMywgICAtNzI1LCAgIDM1MzgsICAgLTI3MCwgICAtNjA2LCAgLTE4MTIsICAgIDQ4MSwgICAtNzAzLAorICAgICAgIDE3NiwgICAtMjg0LCAgIC0xNzMsICAgIDI3MSwgICAgODQ3LCAgICA3MTEsICAgIDIzOSwgICAgMzE0LAorICAgICAgMTIzMywgICAgLTYxLCAgICA0NzcsICAgIDQyOSwgICAtNjkxLCAgIC0xNTYsICAgNjcxMiwgICAgODUwLAorICAgICAgIDM2NSwgICAgMjI5LCAgIC0xOTcsICAgLTM1NSwgICAgMjk4LCAgICAyNTAsICAgIDIwNywgICAtNDM3LAorICAgICAtMTY0NywgICAtMjYxLCAgICAxNjUsICAgIDExNCwgICAgMTY1LCAgIDExNjUsICAgIC01OCwgICAtNTk3LAorICAgICAtMzI5MCwgICAtNTE3LCAgIC00NzgsICAgLTg0MiwgICAtMTg3LCAgIC00NDgsICAgLTMwMiwgICAtMjA0LAorICAgICAgIDQxMCwgICAgNTQ0LCAgICA2NjksICAtMjAxMiwgICAgNDc2LCAgICA0MzQsICAgIDIxNCwgICAgNjk4LAorICAgICAgIDMwMiwgICAgMTAwLCAgICAgNjEsICAgICA2MywgICAtMzg2LCAgICA5MTgsICAgNDQzNCwgICAtMjMwLAorICAgICAgIDE1NywgIC0xMDE5LCAgLTE0ODcsICAgMjIzOSwgICAtNzc0LCAgIC0yMzQsICAgLTM3OCwgICAgNzcyLAorICAgICAgLTE5MCwgICAgMjcwLCAgICAtNjEsICAgIC0xOSwgICAgMzIyLCAgICA0ODgsICAgIDkzNywgIC0zNTgyLAorICAgICAgLTQxNSwgICAyMDkxLCAgIDE4NjIsICAgICA4MSwgICAtMTM0LCAgIDEyODUsICAtMjczMiwgICAgMjIxLAorICAgICAgLTIzNSwgICAgMzg4LCAgIC0yMTYsICAgIC02MywgICAgNjY0LCAgIC0xMDUsICAgIC0zNywgICAgMTY1LAorICAgICAgIDg5OSwgICAtMzczLCAgICAyODQsICAgLTM3NSwgICAgMjg2LCAgIC0yNjMsICAgLTI5NSwgICAgMjc2LAorICAgICAgLTI0NiwgICAgMTg4LCAgIDUyODUsICAgLTMwMywgICAgMjkwLCAgICAtNjAsICAgICAtMSwgICAgIDk1LAorICAgICAgLTcwMywgICAtMjg4LCAgICAgNzQsICAgLTcxNywgICAtMTI3LCAgICAtNTMsICAgLTQyMiwgICAtNDUyLAorICAgICAgIDE2NiwgICAgLTU0LCAgICAtMTUsICAgIDI2OCwgICAgMjM4LCAgICAtMzEsICAgLTI3OSwgIC01ODcyLAorICAgICAgIDg2MywgICAtOTA3LCAgIC0xMDEsICAgIDg4NSwgICAgNTUyLCAgICA0NDIsICAtMjMzNiwgIC0yMTQyLAorICAgICAgLTgwNCwgICAtMTQ3LCAgIC03OTEsICAgMTAwMCwgICAgIDk2LCAgICAyNTAsICAgLTMwNiwgICAgMTM0LAorICAgICAgIDc0MywgIC0xNjQ4LCAgIC04NjcsICAgIDY3MywgICAxNTk0LCAgIDM3MjUsICAgIDUyNywgICAtNjc2LAorICAgICAgLTY2MSwgICAgMjM4LCAgICAyNjIsICAgIDU2MCwgICAgMjc3LCAgICAtNTgsICAgIDQ0NCwgICAgMTY2LAorICAgICAtMTAzOSwgICAtNzAyLCAgICA1NTgsICAgLTk3MCwgIC0xNzYzLCAgLTExOTgsICAgIDU4MCwgICAgMzc4LAorICAgICAgLTQyMSwgICAtOTcyLCAgICA2MzAsICAgLTI3OSwgIC0yNDU2LCAgLTEyMjIsICAgLTIzMiwgICAtNzQ5LAorICAgICAtMzMyNSwgICAgMTc0LCAgICA3ODksICAgIDcyOSwgICAtNDg3LCAgICA1ODMsICAgLTE1NywgICAxNTAzLAorICAgICAgLTgwMSwgICAgLTM4LCAgICAtMTEsICAgIDU1NiwgICAgIDgxLCAgIDE1MDgsICAgLTE0MCwgICAgIDc0LAorICAgICAgMTM3MywgICAgOTEyLCAgIDE0NzEsICAgICAgNCwgIC0xMDgwLCAgIC0xMDUsICAgIC01OCwgICAtMTA0LAorICAgICAgIC01NCwgICAtNTQ0LCAgLTIzOTIsICAgMTU1MCwgICAgMzE4LCAgIC01MDYsICAgIC0xMSwgICAtMTgwLAorICAgICAtMTg5MSwgICAtMjMwLCAgIC0yNTksICAtMTE4MiwgICAtMTU0LCAgICA1MjQsICAgLTU2OCwgICAxOTcyLAorICAgICAgIDU0NiwgICAgNDY5LCAgIC03MjAsICAgMTA4OSwgIC0xNTMwLCAgIC02ODAsICAgMTM0OSwgICAgNDI5LAorICAgICAgICA4MiwgIC0xNTI0LCAgIDE4OTQsICAgIC05MCwgICAgMTg4LCAgIC0xNDUsICAgICAxNSwgIC0xMTEzLAorICAgICAgICAxNSwgICAgIDUzLCAgICAyODIsICAgMjIxMiwgICAtNzM2LCAgIC05NDEsICAtMTE0OCwgICAtMzQ0LAorICAgICAgMTQ3MywgICAgMzQ0LCAgICAzOTIsICAgLTMzMywgICAtNTU2LCAgIC00ODAsICAtMzgzMywgICAgIDM1LAorICAgICAgLTE2MCwgICAtNTI1LCAgICAxNTEsICAgLTUzNCwgICAtNzgyLCAgICAgMzgsICAgIDUyMCwgICAtNDE2LAorICAgICAgLTM4NCwgICA3NTgyLCAgIC0xNTgsICAgIC0yOSwgICAgIDc0LCAgICAtNTcsICAgIC0yMywgICAgIDczLAorICAgICAgLTM5MywgICAtMjQ1LCAgICAtMTIsICAgLTI2MCwgICAtMTU0LCAgIC0zMTksICAgIDM1NywgICAgMjQ3LAorICAgICAgLTMwNiwgICAgMzUxLCAgICAyNzMsICAgIDc1NSwgICAgMjI3LCAgICAgODksICAgIDI4MywgICAtMTUyLAorICAgICAgICAxNywgICA1MTI5LCAgICAxOTEsICAgLTIxMywgICAtNTMxLCAgICAyNTUsICAgLTQ2OCwgICAtMjA5LAorICAgICAgMTEyOCwgICAgIDcyLCAgIC04MDcsICAgIDIyNSwgICAtMzE5LCAgIDE2MzgsICAgICA0MiwgICAgIDIwLAorICAgICAgIDkzNSwgICAgLTUyLCAgIC0zMjYsICAgIDU0MSwgIC0xMTc0LCAgICAxMzAsICAgIDI4NCwgICAtMTEyLAorICAgICAgIDQ0NCwgICAzOTU5LCAgICAyNjIsICAgLTYzMSwgICAtMjYyLCAgICAyNzUsICAgMTAyNSwgICAgMTkwLAorICAgICAgMTEyNSwgICAtMjY1LCAgICAtOTUsICAgIDI2NSwgICAgIDM1LCAgICAyNzAsICAgIC05MiwgICAgLTMwLAorICAgICAgLTE0MSwgICAgMzI1LCAgIC00MzUsICAgICA0NSwgICAtNjU5LCAgICAxNDksICAgMzY0OCwgICAgMzM5LAorICAgICAtMTcwMSwgIC0xMzM4LCAgIC0xNDQsICAgLTk4OSwgICAtNjA0LCAgICAgODQsICAgLTM5NCwgICAgMTY4LAorICAgICAgLTMwMiwgIC0xMjk0LCAgIC00MzMsICAgLTkyMSwgICAxMjcxLCAgICAgNzcsICAgIDM3NCwgICAtNjA0LAorICAgICAgLTIzMCwgICAgIDk3LCAgICAyMDYsICAgLTEzOCwgICAyOTA5LCAgICA0NzgsICAgIDcwNywgICAgICAwLAorICAgICAgMTI0MiwgICAtMzQwLCAgLTE2NTksICAgIDM0OSwgICAyNzUxLCAgLTExNzUsICAgLTE0NiwgICAxMDM4LAorICAgICAgICA2NSwgICAtNzc1LCAgIC00MjMsICAgICAxNCwgICAgIDIyLCAgICAgNDEsICAgLTkwNSwgICAgMjg3LAorICAgICAgIDI4MCwgICAtOTMzLCAgICAxOTUsICAtMTgxNywgICAgNTQwLCAgLTIzNzQsICAgLTY2MSwgIC0xMTAyLAorICAgICAgIDg3OSwgICAxMjMyLCAgICAgMjksICAtMTY4MywgICAgMjg2LCAgIC0xMzYsICAgIDY1OCwgICAtMzk1LAorICAgICAtMTc4MiwgIC0yODIzLCAgIC02MjQsICAgLTIyMywgICAtMjk5LCAgIDI4NTksICAgLTEwMywgICAgLTQ1LAorICAgICAgIDU0NCwgICAgIDgyLCAgICAtMjEsICAgLTI2MywgICAtNjY2LCAgIC0zNjIsICAgLTczMiwgICAgMjQ5LAorICAgICAgMTA4NywgICAtMjQyLCAgICAgMzAsICAgIDY2MywgICAtMzg2LCAgIC0zNTAsICAgMTI0MCwgICAtNDkyLAorICAgICAgLTg2OCwgICAgIDY5LCAgICAtNDEsICAgICAzNSwgICAgIDMwLCAgLTE3OTEsICAgMzg3MCwgICAtNDU1LAorICAgICAgMTM1NSwgICAxMDk4LCAgIDI5MzMsICAgIDM0NywgICAgMzYxLCAgICAgNzksICAgMjg1NSwgICAgLTI2LAorICAgICAgIC02NiwgICAtNTk4LCAgICAtNDMsICAgICAyMSwgICAtMzg2LCAgIC04MDIsICAgIC04MSwgICAtNDM2LAorICAgICAgIDg0NiwgICAtNjczLCAgICAzNzcsICAgLTMyNiwgIC0xMjE3LCAgIDE0NjUsICAgLTQ4MCwgICAtMjA1LAorICAgICAtMjE2OCwgIC0xNjg5LCAgICA2OTAsICAgIDM1NSwgICAxMTkyLCAgICA3MzQsICAgLTExMywgICAgIDM5LAorICAgICAgLTQ4NiwgICAtNjQ0LCAgICA0MzgsICAgMTA5NiwgICAtNzIzLCAgIC01MjQsICAtMTYzNCwgICAtNjIxLAorICAgICAgLTM5NCwgICAgMjI2LCAgICAxNjcsICAgLTYyNSwgICAtNzA5LCAgICA4NTQsICAgMzAwNSwgICAtOTEwLAorICAgICAgICAxMywgICAtNzkzLCAgLTE1MTcsICAtMTI1NCwgICAgIDE4LCAgIC00NDAsICAgLTgzNiwgICAgNjUxLAorICAgICAgIC0zMSwgICAgMjI5LCAgLTEwODEsICAgLTEyNiwgICAtMTkxLCAgLTM2MTIsICAgIDQ4NywgICAgNDUxLAorICAgICAgLTI5MiwgICAgOTQzLCAgLTIwMTgsICAgLTYxOCwgICAtMjU5LCAgIC02NDksICAgLTcyMywgICAtNDQ3LAorICAgICAgLTIzOCwgICAxMDk2LCAgLTIyMjgsICAgIDY3NSwgICAgNTYzLCAgIC0zMTYsICAtMTI0OCwgICAgIDMyLAorICAgICAgIC0yOCwgICAgMjkzLCAgLTE4MTcsICAgIDIyNiwgICAgMjY3LCAgIDEyOTEsICAgIDYyNCwgIC0yMjc5LAorICAgICAgIDE0MywgICAgNjUwLCAgICAgIDUsICAgLTU2MywgICAtNTA0LCAgLTIxMjQsICAgIC05NCwgIC0xNjEzLAorICAgICAtMzA1MCwgICAgNzA4LCAgLTM0NTgsICAgIDQ0MiwgICAgIDMwLCAgICAgNjUsICAgIC04MCwgICAgIDg5LAorICAgICAgIDIwNCwgICAtMjQ1LCAgICAgOTQsICAgICAyOCwgICAgIC0yLCAgIC0yMzEsICAgIDYyMywgICAtMTg5LAorICAgICAgLTQwNSwgIC0yMTQ3LCAgIDExNDcsICAgMzEyNCwgICAgODA2LCAgIDEwNDgsICAgMTE0NSwgICAgNjUzLAorICAgICAgICA0NywgICAgIDg2LCAgICAgLTQsICAgICA0NiwgICAgNDM3LCAgICAyMjksICAgLTE5MCwgICAgMzEwLAorICAgICAgMTk5NSwgICAgLTQ4LCAgLTEwMTUsICAtMTgwNiwgICAtMjY2LCAgIC05NDEsICAgIDM2MSwgICAgMTc5LAorICAgICAgIDE3MiwgICAgMzk3LCAgICAxODIsICAgIDMyMywgICAtNTE2LCAgIDM0MzUsICAgICAgNywgICAgIC01LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IxNjE2czFbXSA9IHsKKyAgICAgLTI1MjEsICAgLTUxOCwgICAxODMwLCAgICA5ODUsICAgLTUwMCwgICAgMTA5LCAgIC04MDcsICAgLTE5NywKKyAgICAgICA1NDMsICAtMTAzNiwgICAgMTA0LCAgIDE5ODksICAgIDQyOCwgICAgNzQwLCAgIDExMTAsICAgLTM2NiwKKyAgICAgIDE0ODIsICAgIDg5OSwgIC0xODI4LCAgICAxNTksICAtMzAxNSwgICAtMzExLCAgIC03OTIsICAgIC00MiwKKyAgICAgICAgIDMsICAgLTQxMiwgICAtMTU3LCAgICAtMTMsICAgIDg2MywgICAtMjQ4LCAgICAyNjEsICAgLTE4NywKKyAgICAgIC00MDksICAgIDE1NiwgICAgNzcyLCAgICAyNzEsICAgIDMxOCwgICAtMjYyLCAgICAgNzgsICAgLTU3MSwKKyAgICAgICAgMjgsICAgIDM3MCwgICAgMTE5LCAgICAzMDIsICAtNDc5NCwgICAgMTA2LCAgIC0xMjMsICAgLTE1MywKKyAgICAgIDE4NTcsICAgLTcwMiwgICAxMDkwLCAgIC0zMTksICAgIDQxNSwgICAtMzI3LCAgIDIxMjQsICAgLTE3MCwKKyAgICAgIC00MTEsICAgIDE3NCwgICAgIDYyLCAgICAgLTcsICAgIDkyMSwgICAtMTI4LCAgICA3MzUsICAgLTEyNywKKyAgICAgICA5NzIsICAgMTY3OCwgICAgMTY2LCAgLTE0NzEsICAgLTIwOCwgICAtMjI0LCAgICA4NzEsICAgLTkwMCwKKyAgICAgIC0yMjMsICAgLTgxNywgICAgMjg4LCAgIC00NzIsICAgICAxMCwgICAgIDMxLCAgIC00MDEsICAtMzIwMSwKKyAgICAgLTEyOTAsICAgICAtMywgICAtMzAxLCAgICAxODMsICAgIDczMCwgICAgNDczLCAgICA0MzgsICAgIC04MSwKKyAgICAgICA4ODIsICAgIC02NCwgICAyODk4LCAgIC0yNDIsICAgIDQwOCwgICAtMjExLCAgIC0zMzMsICAgLTI1NCwKKyAgICAgIC04MjAsICAgIDYxMiwgIC0xMTI4LCAgICAtNjAsICAgIC03MywgIC0yNTE2LCAgICAgNDUsICAgIDYzNywKKyAgICAgIC0xMzAsICAgIDQ1OSwgICAtMzEyLCAgIC0yMjMsICAgLTYyOSwgICAxNDkwLCAgIDE3OTIsICAgLTE5OSwKKyAgICAgICAtMjEsICAgLTU0NSwgICAxNzcyLCAgLTEwODQsICAgLTE3MywgICAgMzgxLCAgICAzODAsICAgMTI4OSwKKyAgICAgIC0xMTcsICAgIDQ4MywgICAgMTM4LCAgLTEyMDAsICAgLTUxOSwgICAgNTk4LCAgLTM0NTMsICAgIDM0OSwKKyAgICAgLTMxMDIsICAgMTI2MCwgICAtMTcwLCAgICAyMzgsICAgLTY4NCwgICAgIDQ4LCAgIC00ODMsICAgLTg4MywKKyAgICAgIC04NzksICAgIDEzOSwgICAgMjk4LCAgIC0xMTAsICAgLTIwMywgICAtOTU1LCAgICAxOTUsICAgICA1NywKKyAgICAgIC01NTAsICAgMTk0NSwgICAtNzExLCAgIC02ODgsICAtMTQ3MCwgICAxNTI3LCAgICAgNTgsICAgIDMxNywKKyAgICAgICA2NTYsICAgIDMxMCwgICAgIDU3LCAgICAxNjIsICAgMjAwNiwgICAxMzg3LCAgICA4NDUsICAgLTEyNywKKyAgICAgIC0zOTgsICAgIDMxOCwgICAyNTIwLCAgIDIwMDIsICAgLTkwNiwgICAtMzIzLCAgIC0xOTQsICAgIDkwNywKKyAgICAgICA1ODgsICAgLTIyOCwgICAtMzU3LCAgIC0zMTYsICAgIDU1NywgICAtNTk2LCAgLTE1NTksICAgICAtMywKKyAgICAgIDE2MTQsICAgMTMxNywgIC0xNzAxLCAgICA5MzYsICAgIC04OSwgIC0yMjcwLCAgIDEzMjcsICAgMTA0NiwKKyAgICAgICA0MDAsICAgLTIzMywgICAgIDE4LCAgIC03MzAsICAgIC0yMywgICAtMTgxLCAgIC01OTMsICAgICA3NCwKKyAgICAgIC01NzAsICAgLTk2OSwgICAgNDMyLCAgIC0yNjEsICAgLTgzMywgICAgLTkwLCAgLTQ2NzUsICAgIDc4NiwKKyAgICAgIC01NjYsICAgLTE4MywgICAtODU5LCAgIC01NTQsICAgIDM0NiwgICAtNDkzLCAgIC0yMDEsICAgLTIyMCwKKyAgICAgICAyNDEsICAgLTkxOSwgIC0xODk2LCAgICAyNjUsICAgLTgwMiwgICAxMzgwLCAgIC03MTgsICAtMTEwMywKKyAgICAgIC01NzQsICAgIDMwNywgICAgMTM4LCAgLTEyNjAsICAgIDE3NSwgICAyNTQwLCAgICAtODIsICAgICA1OCwKKyAgICAgIDEwNDYsICAtMTM4MSwgICAyNDg2LCAgICA1ODIsICAgIDQ1NSwgICAgNDg1LCAgIC04MjQsICAgLTE1MCwKKyAgICAgICAgNTcsICAgIC00NSwgICAtMTU1LCAgIC00OTAsICAtMTEwOCwgIC0yMTkxLCAgICA4MzMsICAgIDQyMywKKyAgICAgLTIwMTEsICAgIDI2NywgICAgNzc5LCAgICAxNDAsICAgIC0yOCwgICAgIDU3LCAgICAgOTQsICAgICAgNiwKKyAgICAgIC0zMDEsICAgICAgNSwgICAtODMzLCAgLTEyMjYsICAgLTE5MywgICAxMTEwLCAgICAtNjMsICAgICA3OSwKKyAgICAgIC00OTIsICAtMTQ2NSwgIC0yNzMzLCAgICA0NDQsICAgICA1NiwgIC0xMTE2LCAgIC02MDEsICAgICAyMCwKKyAgICAgIC02MTgsICAtMTMxNSwgICAtNjk1LCAgIDExNDYsICAgIC02NiwgICAgMzM2LCAgIC0xNjYsICAgIDE1OCwKKyAgICAgICA1MzAsICAgIC01MywgICAtMzcxLCAgIC01OTQsICAgLTY4NSwgICAgMTE0LCAgIC0xNDYsICAgIDM3MywKKyAgICAgICAxNzQsICAgICAtMSwgICAgIDQ3LCAgICAxMTksICAgLTEyNCwgICAtMTIxLCAgLTY2OTcsICAgIC05NCwKKyAgICAgLTM1NDQsICAgMTUwNiwgICAxMjIxLCAgIC0xMDEsICAgMjE2MCwgICAgNTU4LCAgIC0yNTQsICAgLTcyOCwKKyAgICAgICA1MTEsICAgIDM3OCwgICAtMzgzLCAgICAgMTIsICAgIDYyNiwgICAgMTcyLCAgICAxODMsICAgIDM1NCwKKyAgICAgICAgNDksICAgMTY2OSwgICAxMTg4LCAgIDM4MTAsICAgIDQwOSwgICAgMTUyLCAgICA2OTQsICAtMjUyMCwKKyAgICAgICAzNDIsICAgICA2MSwgICAgLTg1LCAgICAtMzgsICAgLTE3MCwgICAgICA1LCAgICAzMDUsICAgIDE1NCwKKyAgICAgIC0zNDgsICAgIDY5OSwgICAgMzMyLCAgIDI1NDIsICAgIDY3MywgIC0xMTMwLCAgLTI2MDEsICAgIDU1NCwKKyAgICAgIDE0ODMsICAgIDQ2NiwgICAgMjcxLCAgICA0OTAsICAgLTY0NCwgICAgODIyLCAgICAtOTYsICAgIDQ3NywKKyAgICAgICAxMzEsICAtMjA1MSwgICAtMTExLCAgICAgNDMsICAgIC0zMSwgICAgLTYyLCAgIC03NjcsICAtMzI1NywKKyAgICAgICA2NjMsICAgIDQ4OCwgICAxODIzLCAgICA1MjIsICAgLTUyNSwgICAtMjQ5LCAgICA0ODEsICAgICAtNywKKyAgICAgLTEyOTgsICAgLTk0MSwgICAtMzM1LCAgIC01NjYsICAgIDMwNSwgICAgNTM0LCAgIC03MzUsICAgIDIwNywKKyAgICAgICA3MDksICAtMzE3MCwgICAgIDE5LCAgICAtMjAsICAtMTg4OCwgICAgMjcxLCAgLTE2OTcsICAgIDExNywKKyAgICAgIDE4MzcsICAgMjY5MCwgICAgMzA1LCAgIC00ODMsICAgLTQ2MywgICAgNDA3LCAgIC03MDYsICAgIDQ2NywKKyAgICAgICA1MTgsICAgMTgwNiwgICAgMjQ0LCAgICAtODAsICAgLTQ1MywgICAtNTA1LCAgICA4ODIsICAgIDg0MywKKyAgICAgIDEzMjgsICAgLTI4MCwgICAgMTc1LCAgICAzMTksICAgLTg0MiwgICAgMTkyLCAgIC02ODAsICAgLTQ2OSwKKyAgICAgIDU0NDAsICAgLTIwNSwgICAtMTg3LCAgICAgNTMsICAgIDMzMiwgICAgMjA0LCAgIC0xODQsICAgICA5NiwKKyAgICAgIDEwMjYsICAgLTUyNSwgICAgIDIwLCAgICA5NzUsICAgIDEyNSwgIC0xNTYyLCAgLTE4NzMsICAgLTc1NywKKyAgICAgIC0xMzcsICAgIDEzMywgICAgLTEwLCAgIC0zNDAsICAgLTc4MywgIC0xNDg0LCAgLTIyMDYsICAgMTIzOCwKKyAgICAgLTUyMTIsICAgLTQ2NiwgICAgMTI5LCAgIC0yMjQsICAgICAxNywgICAgNDk3LCAgICAtNDEsICAgIDg0NiwKKyAgICAgICAgODgsICAgIC00MSwgICAgMjg1LCAgICAyODQsICAgLTE1NSwgICAgIDIxLCAgIC0yMjUsICAgIDE1MCwKKyAgICAgICAyMjMsICAgLTgwNywgICAtNDQ0LCAgLTExNDEsICAgLTkwOCwgICAgMjkyLCAgIC0zMjYsICAgIDU1OSwKKyAgICAgIC00NDYsICAgLTI4MywgICAgLTQxLCAgIC0yNzcsICAtMzQ3OSwgICAtNjY3LCAgICA1MzIsICAgICA4MywKKyAgICAgICAyNTcsICAgIDM4MywgIC0yOTg2LCAgIDE2ODUsICAgIDY5NywgICAgNzc3LCAgIDE1NTEsICAgLTE0MiwKKyAgICAgIDE3ODYsICAgIDU3OSwgICAtNTMxLCAgICA3ODcsICAgIDcxMiwgICAtOTg0LCAgICA2MDMsICAgLTE3NCwKKyAgICAgIC00NTksICAgMTMwMywgICAtOTQzLCAgICA3NDEsICAgMTEwMywgICAgLTczLCAgICA2MDAsICAgLTQwMywKKyAgICAgICAtNDIsICAgLTE2OSwgICAgLTkwLCAgICAyMjAsICAgIDIwOCwgICAgMTA1LCAgLTQwODMsICAtMTA2OSwKKyAgICAgICA5ODEsICAgLTkyNiwgICAgMTI0LCAgICAyNzMsICAgLTE0NSwgICAtMTMzLCAgICAzMDcsICAgNDcyMCwKKyAgICAgICAyMDksICAgIDMyNCwgICAgLTc5LCAgICAgMTIsICAgIC00MSwgICAtMjIwLCAgICAyMTEsICAgLTE4NCwKKyAgICAgICA0MzUsICAgIDMwNywgIC0xNTQ0LCAgICAgODMsICAgMTU2NSwgICAtNDQ1LCAgIC0yMTcsICAgLTY0OCwKKyAgICAgIC0zNzksICAtMTI3MCwgIC0xNTkwLCAgLTIzMzcsICAgLTg2MCwgICAgMzQ4LCAgICA2NDgsICAgLTE1NywKKyAgICAgIC03ODUsICAgMzMxOCwgICAtMTIzLCAgIC0xMzgsICAgLTQxMiwgICAtODc2LCAgICAzNTgsICAgLTE3MywKKyAgICAgIC0yODAsICAgIC04MSwgICAtMTQ5LCAgIC0xNjcsICAgLTE2MCwgIC0yMTEzLCAgICAgMjAsICAgIC00MCwKKyAgICAgIDEwMjIsICAgIDQzMiwgICAtNzIxLCAgICAgNTUsICAgLTY1MSwgICAgIDE3LCAgLTExMzUsICAgLTM4MCwKKyAgICAgIC01NDIsICAtMTEyOCwgICAyOTE5LCAgIC00NzUsICAgLTE0MywgICAgLTUzLCAgICAxNzYsICAgLTE1MiwKKyAgICAgICAgIDcsICAgIC0yOSwgICAtMTcyLCAgICAxNzQsICAgIDE5NSwgIC04MDA1LCAgICAyNzcsICAgIDEwNSwKKyAgICAgICAgMzUsICAgIDExNSwgICAtMzE0LCAgICAxMzcsICAgLTI1MywgICAgIDc1LCAgIC0yNzgsICAgICA5MCwKKyAgICAgLTE1MDgsICAgICA3OSwgICAtMTUzLCAgIC01NjAsICAgMTAyNywgICAtMzQ5LCAgIC0yOTIsICAgLTQ2NiwKKyAgICAgLTExMDEsICAgLTMyNCwgICAgLTg0LCAgIDQyNTEsICAgIDgyMiwgICAtNDIwLCAgICAgNTUsICAgICA0MywKKyAgICAgIDE4ODYsICAgIDI4MSwgICAgOTY0LCAgIDI0MDgsICAgIDQyNSwgICAxMTg3LCAgICAtMjcsICAgIC04NCwKKyAgICAgLTEyNzcsICAgICA2MywgICAtOTc4LCAgIC0xNDMsICAgIDUwNiwgICAgNzI3LCAgIC0xNTUsICAgLTM4NCwKKyAgICAgIDM0MzQsICAgIDU5MiwgICAtMjYyLCAgIC00MzgsICAgIC0zMCwgICAyODQ5LCAgICAtNjksICAgIC01OCwKKyAgICAgIC0xODEsICAgIC04NywgICAgIDIwLCAgICAyOTksICAgIDQxMiwgICAtMjYzLCAgICA3MDIsICAgIDEzMSwKKyAgICAgIC0yNzEsICAgIC0xMCwgICAgNzM2LCAgICAxMjEsICAtNjI5OSwgICAtMTMyLCAgIC0xMTYsICAgICAyNiwKKyAgICAgIC0yNTMsICAgLTU4NiwgICAgIDMyLCAgIC0xNDUsICAgLTI1MSwgICAgLTEyLCAgICA0NzEsICAgIDEzNSwKKyAgICAgICA1ODUsICAgIDYwNCwgICAgIDI5LCAgICA4NzMsICAgIDM2MywgICAgIC0yLCAgLTE1OTUsICAgICA0MSwKKyAgICAgLTExNDcsICAgLTE0MiwgICAgNjY1LCAgLTI3NTIsICAgMTMwMiwgICAtMzU4LCAgIC0xMzQsICAgICAyOSwKKyAgICAgIC02OTEsICAgIC0xMiwgICAtNzAyLCAgIC00NTksICAgIDEwMCwgICAgMjc4LCAgICAgIDksICAgICA1NCwKKyAgICAgICAgNjYsICAgLTQ1OCwgICAgIDUzLCAgICAyMTMsICAgIDE5MywgICAgIDE0LCAgIC00MDAsICAgNDg3MCwKKyAgICAgIC05NTAsICAgLTIwOSwgICAgIDUwLCAgICA0NzAsICAgIDQ0OSwgICAgICAzLCAgIC0xMTgsICAgMjI4NywKKyAgICAgIC00NjksICAgIC01OCwgICAgMTI2LCAgIDEwMTEsICAgLTgyNiwgICAgMzg2LCAgLTEwMTksICAtMjM5MCwKKyAgICAgIC01ODYsICAtMTQwMSwgICAgMTM3LCAgICA3NjAsICAgIDE0MSwgICAgLTg5LCAgICAxMTcsICAgLTI1MiwKKyAgICAgIDMxMDYsICAgLTkzNiwgICAtMTk4LCAgICAzOTAsICAgIDQ2MywgICAtMjQ1LCAgIC01MDksICAgLTEyMywKKyAgICAgIDMwNTcsICAgMTIwMCwgICAzNDUxLCAgICAyODIsICAgLTMzMiwgICAtNTg1LCAgIC02NjIsICAgLTk1NSwKKyAgICAgICAxNjUsICAgLTI3NiwgICAgIDczLCAgICAzNzMsICAgIDIwMiwgICAgNTA2LCAgICAzNTYsICAgIDEyNSwKKyAgICAgICAxNDEsICAgLTYxMywgICAtNjcwLCAgICA0NDYsICAgMjAzMSwgICAxNTIxLCAgIC00NDYsICAgMTMzOSwKKyAgICAgICAxOTgsICAgLTExMiwgICAgMjE0LCAgICAgNzAsICAgIDI2NSwgIC0xMzEwLCAgIDI0OTIsICAgLTEzMywKKyAgICAgLTE4ODAsICAgLTM0NywgICAtOTYxLCAgICAzMTIsICAtMzcxNCwgICAtNDc1LCAgICAxMDIsICAgIDM5MSwKKyAgICAgICAgNjQsICAgMTA5MSwgICAtNjg2LCAgIC0xMDEsICAgIDE0NCwgICAgNDQ3LCAgICAxNzMsICAgICA2NiwKKyAgICAgIC0zNzQsICAgIDM0MiwgICAgIDY5LCAgLTMzNzksICAtMTMzMSwgICAxMTYwLCAgIC04ODksICAgLTg1OCwKKyAgICAgICA5ODIsICAtMTYxMywgICAtMjIzLCAgICAgNTcsICAgIDE4NiwgICAgNDI4LCAgICAyMjYsICAgLTQ3NywKKyAgICAgICA0NDksICAtMTA1MiwgICAtNjYxLCAgIC0zODIsICAgIDQ1OSwgICAgMjc3LCAgIC0yNzcsICAgLTI1MCwKKyAgICAgICAgMTIsICAgNDA3NywgICAtMjYwLCAgIC0xNjEsICAgLTE2MywgICAgIDM4LCAgICAxNTksICAgIDI0MywKKyAgICAgICAxMzEsICAgIDQ1NywgIC0yMjUzLCAgIC0zMDEsICAtMTYyNiwgICAgIDM3LCAgICA4MDYsICAgIDEwNCwKKyAgICAgICAxOTEsICAgMTg5OSwgICAgMzQ2LCAgICAzOTgsICAtMTEwOCwgICAtNjIzLCAgIC0zOTEsICAgMTA5MiwKKyAgICAgIDEyNTIsICAgMTEyNiwgICAgIDgxLCAgIC0xMTYsICAgMTE5MiwgICAgNjc0LCAgLTEzMjEsICAgIC0zMiwKKyAgICAgIDE3MzksICAgLTcwOCwgICAtMjMwLCAgIC04NDQsICAgLTUwNywgICAgNDE1LCAgICAyNjEsICAgIDIxMSwKKyAgICAgIC02MTksICAgLTE5MSwgICA1NDYwLCAgICAgIDgsICAgIDEzOSwgICAgMTk3LCAgICAzOTIsICAgLTU1NiwKKyAgICAgIC0yMTUsICAgICA2NiwgICAgIDY0LCAgIC04MDgsICAgICAgMCwgICAtMTM2LCAgICAxNTEsICAgIDE1NiwKKyAgICAgICAyNjAsICAgICA5NCwgICAgNDE4LCAgLTE0NDYsICAgMTgxNSwgICAtNTQwLCAgIC03OTMsICAgIDQ1MSwKKyAgICAgIC00NzcsICAgMTc4OCwgICAtMTI0LCAgICAzMzAsICAgMTYzOCwgICAgMzQyLCAgIC01MDMsICAgLTM4NCwKKyAgICAgLTEyMDEsICAgLTc2MiwgICAgOTI5LCAgLTI4ODYsICAgIDg4OCwgICAgLTYzLCAgICAzMTgsICAgIDU5OCwKKyAgICAgICAgNDIsICAtMTIyNiwgICAtNDAwLCAgIC00NjIsICAgLTEzNiwgICAgMzIxLCAgIDE4NzIsICAgIDM3NiwKKyAgICAgIDEyNjAsICAgIDE0MiwgICAgLTc5LCAgIDQzNzcsICAgICAgOSwgICAgMjk0LCAgICAtNzEsICAgLTE5MCwKKyAgICAgICAtMjEsICAtMjYxMiwgICAtMjQwLCAgICAgMjYsICAgIC0xOCwgICAtMjI3LCAgICA4NjQsICAgICA3OSwKKyAgICAgIDI1ODgsICAgLTg4MiwgICAgIDg3LCAgLTI5NzYsICAgICAgOSwgICAgNDgwLCAgLTE1NzMsICAgLTE3MCwKKyAgICAgIC00MjksICAgIDIwMSwgICAtMTI0LCAgICAxNzEsICAgIDYzMiwgICAgLTYwLCAgIC00NDcsICAgICA2NCwKKyAgICAgICAtMzcsICAtMTE4MiwgICAgLTg2LCAgIC0xMDUsICAgMjkwMSwgIC0zNTU3LCAgIC0xMzQsICAgIDQ4NiwKKyAgICAgICAxNDEsICAgLTI1OSwgICAgMjM5LCAgICA0NjUsICAgIDQ2NywgICAxMDA5LCAgIC00MDksICAgICAzNCwKKyAgICAgICAyNTQsICAgMjQ2OSwgICAxMDAyLCAgICA4MzQsICAgIDU1NywgICAtODQ1LCAgICAxNDksICAgLTc0NywKKyAgICAgIC01MDQsICAgIDQ5NCwgICAxMzgyLCAgIDEwNjcsICAgIDM1MywgICAgMTkxLCAgLTExMDUsICAgMTcwNSwKKyAgICAgIC01ODYsICAgMTQ3MiwgICAtNDQ0LCAgLTEzMDMsICAgIDE5OCwgICAgNjAyLCAgICA0NzEsICAgIDQ2OCwKKyAgICAgIDQ4NTUsICAgIDEyNywgICAtMTQxLCAgICA0ODcsICAgLTQ1NCwgICAtMTM4LCAgIC0zOTIsICAgLTExOCwKKyAgICAgIC00OTEsICAgLTk0OCwgICAgIDU4LCAgIC0yOTAsICAgICAtNywgICAtNjYyLCAgICAyMjksICAgLTI2OCwKKyAgICAgICAgLTIsICAgLTUzNywgICAtNjIwLCAgLTQ3NzAsICAgMTE1MiwgICAtMTczLCAgICAxNjYsICAgIC02OSwKKyAgICAgICAgMzIsICAtMjU1NSwgICAgNDMzLCAgIC01ODMsICAtMjIxOSwgICAxMTA3LCAgIDEwODIsICAgLTk0MiwKKyAgICAgIC0xNzMsICAgIDM5OSwgICAtNjAxLCAgICAyNTAsICAgIDQyMywgICAgMTI1LCAgIC00NDgsICAgIDM1MiwKKyAgICAgIC01NzEsICAgLTQwNiwgICAgICAwLCAgIDQ3MzUsICAgLTI2NCwgICAtMTc0LCAgLTEwMjAsICAgMTEwNSwKKyAgICAgLTExNDksICAgLTE3MSwgICAtMjUyLCAgIC0xMzAsICAgLTIwMiwgICAgLTc0LCAgICA2MDEsICAgIDYwMSwKKyAgICAgICA1NzAsICAtMjc0MiwgIC0xNDAzLCAgIDMxMjksICAgLTM0OSwgICAgMTk0LCAgICAzMDksICAgIDEzMCwKKyAgICAgICAyNjEsICAgICA5MywgICAgMTU0LCAgIC0xMTcsICAgLTQxOCwgICAtNjU3LCAgICAyNzAsICAgLTE2MCwKKyAgICAgIDE2NjAsICAgLTgxOCwgICAgNjEzLCAgLTE0NTgsICAgLTY1MywgIC0zNzYzLCAgIC0yMzIsICAgICA5MCwKKyAgICAgIC0yNjUsICAgIC05OSwgICAgLTI4LCAgICAtMTMsICAgLTI4MSwgICAtNTUzLCAgICAgMTEsICAgLTE0MiwKKyAgICAgLTE3NjQsICAtNDU0OCwgICAgOTM2LCAgICAtMjEsICAgLTY4MywgICAgLTg4LCAgIC04MDYsICAgLTE4NywKKyAgICAgICAgMjgsICAgICA3OCwgICAgLTcwLCAgICAtOTksICAgICAtMiwgICAtNDkzLCAgICAtMTYsICAgICA0OCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMTYxNm0wW10gPSB7CisgICAgIC0zODIxLCAgLTMzOTcsICAgIDIwMywgICAgLTI1LCAgICAtMjIsICAgICA2OCwgICAgMTg5LCAgICAtMTMsCisgICAgICAtMjg2LCAgICAgOTQsICAgICAxOCwgICAgMjg4LCAgICAgMjksICAgICAtNSwgICAgICAzLCAgIC00MTQsCisgICAgICAxNDgzLCAgIC0xNzIsICAtMTI3NSwgICAtMTgwLCAgLTM3OTIsICAgIDM2MCwgICAgMTQ1LCAgIC0xNDMsCisgICAgICAgNDQ0LCAgIC0xMzksICAgLTE5OCwgICAgIDcwLCAgICAtMTcsICAgLTM1MywgICAtMTIxLCAgICAgLTYsCisgICAgICAgIDc2LCAgICAtNTAsICAgMjk4NywgICAgMTczLCAgLTMwNzAsICAgLTIyOSwgICAgLTE2LCAgICAxOTIsCisgICAgICAgMTM0LCAgICAtNTUsICAgIC04NiwgICAtMjAwLCAgICAxMjgsICAtMjA1MiwgICAgLTU5LCAgICAtMTEsCisgICAgICAgIC00LCAgICAzMDksICAgIDE3OSwgICAgNDk0LCAgIC0xMzgsICAgLTM2MywgICAtMzM2LCAgICAxMTksCisgICAgICAtMTI3LCAgIDI0OTcsICAgLTE2OSwgICAtMzE2LCAgICAtODcsICAgLTUzOCwgICAgIDQyLCAgIC01MzQsCisgICAgICAgMzE1LCAgIDIzNjQsICAgICA2MSwgICAgMjY5LCAgICAtODcsICAgIC05NCwgICAgIDgyLCAgLTIwNjksCisgICAgICAgIDE4LCAgIDEyMzgsICAgICAtNywgICAgIDc5LCAgICAgLTksICAgICA0MSwgICAgIDcwLCAgICAgNTAsCisgICAgICAgMjA5LCAgIC0xNTgsICAgLTEzNiwgICAgIDI4LCAgIC0yNzUsICAgICA2MiwgICAgMjk2LCAgICAgNzcsCisgICAgICA2MjY5LCAgIC0xODQsICAgICA3MywgICAgLTE5LCAgICAtMjUsICAgIC01NywgICAgMTM0LCAgICAtNTIsCisgICAgICA4NTY5LCAgIC0xNzYsICAgICAtOCwgICAgIDE3LCAgICAgMTUsICAgICA3OSwgICAgIDM2LCAgIC0xMzcsCisgICAgICAgIDEyLCAgICAgNDQsICAgLTI3MCwgICAyMzM1LCAgICAxMTEsICAgIDUxNywgICAgLTgzLCAgICAyMDcsCisgICAgICAtMjc2LCAgIDI1NzcsICAgLTE5OCwgICAgIDgzLCAgICAzNzYsICAgIC03NSwgICAtMjczLCAgICAgNjIsCisgICAgICAgMTA5LCAgICAgIDQsICAgIC00OCwgICAgMTIyLCAgICAtNDEsICAgICA5OSwgICAgLTg3LCAgICAgMTQsCisgICAgIC03Njk2LCAgIC0xMTgsICAgIC02NiwgICAgMTcxLCAgICAgOTYsICAgIC0zMSwgICAgMTIzLCAgIC0yMTcsCisgICAgICAtNjc2LCAgIC00MzksICAgIDQwNywgICAgIDk3LCAgIC0yODEsICAgMTg3MywgICAgNjI2LCAgIC0xNDgsCisgICAgICAtNTQ4LCAgIDE2MzQsICAgIDcwNCwgICAgIDk3LCAgLTIwNzYsICAgLTMzNiwgICAgNjMyLCAgIC0zNzEsCisgICAgICAgMTEzLCAgICA1NDQsICAgIC04OCwgICAgMTg0LCAgLTIyMDAsICAgLTQyMCwgICAtNTkyLCAgIC0xNjgsCisgICAgICAgNzU5LCAgICAyOTEsICAgMjIxNSwgICAgNzA0LCAgIC0xNDAsICAgLTE0NSwgIC00MDg4LCAgICAyOTUsCisgICAgICAgMTg2LCAgIC0yNzAsICAgIDI4MywgICAgMjk0LCAgICAtNDIsICAgICA3NiwgICAgIDY5LCAgICAgNDEsCisgICAgICAtMTQwLCAgIDE2MzUsICAgLTIwMCwgICAtNjgyLCAgICAzMDIsICAgLTE5MiwgICAgOTAyLCAgIC01NDAsCisgICAgICAtODQzLCAgIC00OTQsICAgLTUyOSwgICAgMTAyLCAgIC03NTksICAgLTE2NSwgICAzMTYwLCAgIC0xODAsCisgICAgIC0xNDUwLCAgIC00MjQsICAgIC0xNiwgICAgICA2LCAgIC01NDgsICAgIDI5NiwgIC0zMDU2LCAgICAyMTksCisgICAgIC0xODgzLCAgIC0xMDksICAgLTU2NiwgICAtNDMxLCAgICAgOTUsICAgLTQyMiwgICAtNTMyLCAgICAtMjYsCisgICAgICAgMTIwLCAgICAtNDYsICAgICAyMywgICAgMTc0LCAgICAxNzUsICAgLTM2OSwgICAgMTEwLCAgICAgLTIsCisgICAgICAgIDI1LCAgICAxMzIsICAgICAtMSwgIC0zMzM4LCAgICAtNjcsICAgMjE0MCwgICAgLTI1LCAgICA1NjYsCisgICAgICAtMTI5LCAgICAgMzUsICAgMTE4NywgICAgMzM3LCAgIDE5OTksICAgMjcxMiwgICAgLTcxLCAgICAgNDUsCisgICAgICAtMTc3LCAgICAgOTQsICAgLTMyMSwgICAtMTk3LCAgIC01NzMsICAgICA5OCwgICAgMjI1LCAgICAgNDYsCisgICAgICAgIDUzLCAgICAgNzgsICAgIC00MCwgICAgIDgyLCAgICAgMjMsICAgMjcxOCwgICAyNTM0LCAgICAgODksCisgICAgICAgLTY1LCAgICAgNzcsICAgIDIwNiwgICAgMzQzLCAgICA1MjcsICAgIDEwMiwgICAtMTkxLCAgICAgOTQsCisgICAgICAgNDYzLCAgICAxMTEsICAtNDUyOSwgICAgIDk3LCAgICA4NzYsICAgLTIwNSwgICAtOTQ0LCAgICAxODEsCisgICAgICAtMTMyLCAgICA0NjcsICAgIDM2NiwgICAgIDg1LCAgIC0zMDIsICAgLTEwMCwgICAgLTMzLCAgICAtNzYsCisgICAgIC0zMDg3LCAgLTI1NDYsICAgIDIxNSwgICAgMjc3LCAgICAtNTIsICAgIDM1MiwgICAgMTM3LCAgICAtNDUsCisgICAgICAgMTYyLCAgICA1OTAsICAgIDQwNiwgICAgMzgyLCAgICAgODUsICAtMjgyNCwgICAgMTQxLCAgICAyMTksCisgICAgIC0zNzkwLCAgICAgNDAsICAgIDEyNiwgICAgIDMyLCAgICAgMzAsICAgIDEwMCwgICAgMTIxLCAgIC0yMTAsCisgICAgICAgMTk2LCAgIC0yNjgsICAgIDE3OCwgICAgMTAyLCAgIDEyMjksICAgIC04MCwgICAtNzUwLCAgICAtMTEsCisgICAgICAgLTU3LCAgICAgODQsICAgIDIzOCwgICAzNTcxLCAgICAyNzQsICAgLTI1NCwgICAgIDU1LCAgLTE2MTYsCisgICAgICAtMTc2LCAgIC03NTUsICAgICA0NiwgIC0xMzA2LCAgIC0yMDEsICAgLTIyOCwgICAgMTAxLCAgICAxOTcsCisgICAgICAgLTkzLCAgIC0xNTYsICAgIDMxOSwgICAgIDgyLCAgIC0zODUsICAgIC0xNywgIC00NjYwLCAgICAxODAsCisgICAgICAxMjc4LCAgIC0xMTMsICAgLTIxNSwgICAgMTAzLCAgICA4MzIsICAgLTIzMywgICAgNDEyLCAgICAyNDksCisgICAgICAtOTAwLCAgIC0xMzIsICAtMzQyNywgICAgIDUyLCAgICA0MTYsICAgIDI2NywgICAgMzE3LCAgIC0zODQsCisgICAgICAgMTMwLCAgICAgNzgsICAgICA5MSwgICAtMzYwLCAgICAgNzUsICAgIDM4NiwgICAyMjE5LCAgIC0zNjAsCisgICAgIC0yOTc1LCAgICAgMTcsICAgIDI4NiwgICAtMjk0LCAgIC0yMTMsICAgIDIzMSwgICAgMTMxLCAgICA4MjEsCisgICAgICAtMzU4LCAgICAyMjIsICAgLTIzMCwgICAgLTQ0LCAgICAtOTMsICAtMTE1MSwgICAgMjk0LCAgIC0zMTYsCisgICAgICAgIC04LCAgICAxMjksICAgIDIzMSwgICAtOTkzLCAgICAtNTgsICAgMzMxOSwgICAgIDQ4LCAgLTI1NDYsCisgICAgICAtMjEzLCAgICAtMTQsICAgMzIwOCwgICAgMTYyLCAgIC0yNDAsICAgLTE3NiwgICAgMzA3LCAgIC0xNjUsCisgICAgICAgLTIwLCAgICAzNDgsICAgLTExMywgICAgLTc4LCAgICAtOTEsICAgICAtOCwgICAtMjYxLCAgIDgwMzMsCisgICAgICAtMTc5LCAgICAgNjQsICAgICAtNywgICAtMTEzLCAgICAtNTksICAgIC0zMiwgICAtMTcwLCAgICAgNTIsCisgICAgICAgIDU1LCAgICAtODAsICAgIDE0MCwgICAgIDY0LCAgICAtMzksICAgIDkxNSwgICAgIDI4LCAgICA0MTYsCisgICAgICAgIDM4LCAgLTIzMjgsICAgIDIwNiwgICAgMTE1LCAgICAzNjYsICAgIC05MiwgICAgNjUyLCAgICAxMTAsCisgICAgIC0yODM4LCAgICAtNTksICAgIDYxMywgICAgIDIzLCAgICAxMDksICAgLTE1MSwgICAtMTk4LCAgICAxODUsCisgICAgICAzMDMzLCAgIC0xMjIsICAgMjg2MywgICAtMjczLCAgICAgODYsICAgICA0MSwgICAgMTE0LCAgICAtOTksCisgICAgICAgMzE1LCAgICAzNzIsICAgICAxNCwgICAyMTkxLCAgIC0xNzEsICAgIDUzMSwgICAgLTE4LCAgICAtMzQsCisgICAgICAtMzUyLCAgICAxMzAsICAgLTM2MCwgICAgMTE3LCAgLTI4OTYsICAgICAgMiwgICAtNTY0LCAgICAgNTEsCisgICAgICAgMjIzLCAgICAgNTcsICAgLTI1NywgICAzMTYxLCAgIDMxMzAsICAgLTM4NCwgICAgMTI2LCAgICAtNDAsCisgICAgICAtMTYwLCAgIC0yMzIsICAgLTEzOCwgICAgIDgxLCAgICAtMzQsICAgIC05NiwgICAgIDgyLCAgICAgIDksCisgICAgICAgIDYyLCAgIC0xNjEsICAgIDM0NCwgICAgMTAwLCAgICA3OTAsICAgLTI0MywgICAtMzQ0LCAgIC0zOTMsCisgICAgICAtNTMxLCAgICA0MDEsICAgICA5MCwgICAgMTcxLCAgICAxNDQsICAgLTMyOSwgICAgICA3LCAgLTQ2MzksCisgICAgICAtMTM1LCAgICAgLTYsICAgIDM1MSwgICAgLTIxLCAgIC0xOTUsICAgIDIyNCwgICAgLTI1LCAgIDYwMjcsCisgICAgICAgMjI0LCAgICAtMTQsICAgIDM0NCwgICAgMTcwLCAgIC0xNjksICAgIC05NywgICAgMjUyLCAgIC00ODgsCisgICAgICAtMzc5LCAgICAtNzMsICAgIDYyOSwgICAgIC05LCAgICAyNjYsICAgIDE1MiwgICAgLTY0LCAgICAzMzAsCisgICAgICAgIC04LCAgIDIwODAsICAgIC05MSwgIC0zMzE1LCAgICAyMjksICAgICAyNSwgICAgIDQ1LCAgIC01MjgsCisgICAgICAtMTIzLCAgIDI5NTEsICAgICA0MCwgICAgLTg1LCAgICAgLTQsICAtMjY5NSwgICAgLTM4LCAgIC0xMTIsCisgICAgICAgIDg0LCAgICAtMzAsICAgICA3OSwgICAgNzYyLCAgICAxNTEsICAtNDA4OSwgICAgLTk1LCAgIC0xNTEsCisgICAgICAgICA5LCAgICAxMzgsICAgLTIwNiwgICAgIC0zLCAgLTIxMTQsICAgICA5OSwgICAtMTAwLCAgICAxMTYsCisgICAgICAtNDAzLCAgICAtNTYsICAgICAtOCwgICAgLTM2LCAgICAxMTUsICAgIC0xOCwgICAtMTk1LCAgICAtMzgsCisgICAgICAtMjQwLCAgICAgIDgsICAgIC0zMiwgICAgMTIyLCAgICAxMjUsICAtNzQwNiwgICAgIDQ1LCAgIC0yMTAsCisgICAgICAgMTExLCAgIC0xNTIsICAgLTE1MiwgICAgLTM1LCAgICAtNzIsICAgICAyOCwgICAtMTU0LCAgICAzMDMsCisgICAgIC0zMTQ3LCAgICA0NTksICAtMjg4MSwgICAgLTE0LCAgICAtMTMsICAgIC01NiwgICAtMTI2LCAgICAtNjksCisgICAgICAtMjEzLCAgICAtOTcsICAgIDIwMiwgICAgLTg4LCAgIC0yNzcsICAgLTU1NywgICAgNDUxLCAgIC0zNzYsCisgICAgICAgLTkxLCAgICAzMTksICAgIDE0MSwgICAyNzI4LCAgICAgMjMsICAgMjUwNiwgICAtMTAxLCAgICA2MzIsCisgICAgICAgIDYyLCAgIC0zMTQsICAgIDE1OSwgICAgIDQ0LCAgIDEyMzEsICAgIC02NSwgICAgLTM3LCAgICAxOTIsCisgICAgICAzMTE4LCAgIC0xODYsICAgLTM5NiwgICAtMTA4LCAgICAgNzEsICAgMjExMSwgICAgNTg2LCAgICAgOTUsCisgICAgICAgIDE1LCAgICAtMjgsICAgIDE3NiwgICAgIDIwLCAgICAtNjcsICAgICAgMywgICAtMjY1LCAgICAxMDEsCisgICAgICAtMTgyLCAgICAtMjEsICAgLTQ1NSwgICAgLTE1LCAgLTYyMjUsICAgIC00NSwgICAtMzUzLCAgIC0zODQsCisgICAgICAgLTIyLCAgICAxMTMsICAgIC00MCwgICAgLTQ3LCAgICAgNTcsICAgIC03MywgICAtNTAzLCAgICAxMzQsCisgICAgICAgNzM2LCAgICAtNzAsICAgLTEyNSwgICAgIC01LCAgIC0yNTAsICAgICA2MiwgICAgMTY1LCAgICAxODIsCisgICAgICAgMTg1LCAgIC0xMzIsICAgIDQyNiwgICAtMjc2LCAgICAxMDAsICAgLTQ5NywgICAgLTIzLCAgICAgODEsCisgICAgICAtMTEyLCAgLTM1MjgsICAtMTk5NywgICAtMjM0LCAgIC0xNTQsICAgIC05MSwgICAtMTI1LCAgICAtMjYsCisgICAgICAgMTc5LCAgIC02MTEsICAgIDY1NSwgICAgNzY3LCAgLTEwNjQsICAgIDEzMCwgICAtMjY0LCAgICAxMDcsCisgICAgICAyODExLCAgLTEzOTEsICAgIDI5OCwgICAgLTIwLCAgICAgMzcsICAgIC03NCwgICAgLTEyLCAgIC0xNTcsCisgICAgICAtMjcwLCAgIC0xMDYsICAgMjU1OSwgICAgLTg5LCAgLTMxMDcsICAgICA1NSwgICAgMTg3LCAgIC0yNjUsCisgICAgICAgMTk1LCAgICAxNDAsICAgICAgMSwgICAtNDg0LCAgICA3MTMsICAgIDE3MSwgIC0xMTIzLCAgIC0yMjYsCisgICAgICAzNjY2LCAgIC0zNjcsICAgLTUxNiwgICAtMjQ5LCAgICAgMzgsICAgIDE5NSwgICAgMjM2LCAgIC0zNzgsCisgICAgICAtMzgzLCAgIC0yMDUsICAgIC03MiwgICAgIC03LCAgICAgMTUsICAtOTMyOSwgICAgIC02LCAgICAtMjYsCisgICAgICAgIDU2LCAgICAxNDEsICAgICA0OCwgICAgICA2LCAgIC0xNDEsICAgIC05NSwgICAgLTY5LCAgICAtNDAsCisgICAgICAgLTk5LCAgICAtODAsICAgICA3MywgICAtMjUzLCAgICA0NTYsICAgLTE3NCwgICAgIDUxLCAgIC0yNTAsCisgICAgICAgLTQ4LCAgLTIxMTUsICAgIC02MywgIC0yNTU1LCAgICAtMjUsICAtMjA1OCwgICAgLTU4LCAgICAgNjYsCisgICAgICAgMTc2LCAgICAgMTQsIC0xMDA1MywgICAgLTIzLCAgICAtMzksICAgIC0zNywgICAgLTE1LCAgICAgMzgsCisgICAgICAgIDgyLCAgICAgMTEsICAgICA5NywgICAgMTY5LCAgICAgIDUsICAgIC02NywgICAgIDU3LCAgICAgNjEsCisgICAgIC0yMjQ4LCAgICAxMDgsICAgIC0xOSwgICAgMjU2LCAgIC0xNjksICAgLTEyMiwgICAtMzM2LCAgIC00MzEsCisgICAgICAgLTc3LCAgIC0yNTAsICAgLTE1NiwgICAtNzQ1LCAgICAxODQsICAgIDY4NCwgIDEwNTU5LCAgIC0xOTksCisgICAgICAgLTM0LCAgICAtMzcsICAgICA5NiwgICAgLTgyLCAgICAtMTcsICAgICA2MCwgICAgIDY1LCAgICAgMjEsCisgICAgICAgLTY3LCAgIC0zMzcsICAgICA2MiwgICAgIDM1LCAgICAgNzQsICAgLTIxNCwgICAgIDM4LCAgICAgNDcsCisgICAgICAtMTI5LCAgIDYxMzksICAgLTEzOSwgICAgLTU3LCAgIC0xNTQsICAgIDI2MSwgICAgICA3LCAgIC0xMjcsCisgICAgICAgMTA5LCAgICAgNDAsICAgIDE3OSwgICAgLTk5LCAgICAxOTgsICAgIC01MSwgICAgIDQ4LCAgICAtMzYsCisgICAgIC0yMzc3LCAgIC0xOTQsICAgLTMzNCwgIC0yODI2LCAgICAxMDMsICAgLTIyMCwgICAgLTU3LCAgICAgNDEsCisgICAgICAgOTc5LCAgIC04OTUsICAgICA2OCwgICAtMjE3LCAgLTE3MTIsICAgLTQzMCwgICAgLTk4LCAgICAgOTEsCisgICAgICAtMTA3LCAgLTE3NTUsICAgMjYxNSwgICAgIDg0LCAgIC01MDAsICAgIDIzMSwgICAgNDgwLCAgICAtMzEsCisgICAgICAgMTQ2LCAgIC0xNTcsICAgLTEyMCwgICAgMTUyLCAgIDIzNDIsICAgIC0zNiwgIC0xOTY5LCAgICAgNTcsCisgICAgICAtMTA5LCAgICA0NzYsICAgLTI0MywgICAgMjYxLCAgICAtNTgsICAgMTk5OCwgICAgICA0LCAgIDEzODgsCisgICAgICAgLTk4LCAgICAgNDUsICAgLTE0MCwgICAgNDAwLCAgICAtNzYsICAgLTMyMSwgICAgLTIyLCAgICAgLTksCisgICAgICAgMjEwLCAgICA1MTcsICAgICAgNSwgIC00NzA4LCAgICAgNjYsICAgLTMzMCwgICAtNDA1LCAgICAtMTksCisgICAgICAyMTU4LCAgICAtNjUsICAtMjE2MywgICAgMjQ0LCAgICAtMTYsICAgLTE5MiwgICAgNDk0LCAgIC0zODEsCisgICAgICAtMTk0LCAgICA0MTMsICAgICA4OSwgICAgMjIwLCAgICA0NTUsICAgIC01NCwgICAgICA0LCAgICAyMDYsCisgICAgICAgMjIxLCAgLTQ5OTgsICAgICA2MywgICAtMzY1LCAgICAzNTQsICAgIDM2NCwgICAgNjc3LCAgICAyMDcsCisgICAgICAgLTY2LCAgICAtMjcsICAgLTQ3NywgICAtMTgyLCAgICA4NDEsICAgICA4NSwgICAgLTQwLCAgICAxNjYsCisgICAgICAtMTg1LCAgICAzMjEsICAgLTI5MywgICAtMTgxLCAgIC00MjksICAgLTIzMSwgICAxNDAxLCAgIC0xMjIsCisgICAgICAgOTM4LCAgICAgNjcsICAgLTE4NSwgICAgIDUxLCAgIDMxODgsICAgLTgwMiwgICAgNDIxLCAgLTMyMzAsCisgICAgICAxNDMyLCAgIC00MzIsICAgLTY1OCwgICAtNTg3LCAgIC04NDMsICAgIDQyMSwgICAgMTc3LCAgICA0NDYsCisgICAgICAgNTEwLCAgIC0xNDAsICAgIC05MCwgICAtMTI3LCAgICAtNzgsICAgICAgMiwgICAxMDg5LCAgIC0xODUsCisgICAgICAgMzAxLCAgIC0zOTMsICAgNDEwMCwgICAtMTUyLCAgICAyNjUsICAgIDIyNCwgICAgIDI1LCAgICAgOTUsCisgICAgICAgNTM0LCAgICAyODAsICAgLTI1NCwgICAgLTQ1LCAgICAgLTUsICAgLTIwNywgICAgIDQ5LCAgIC0xMjYsCisgICAgICA4OTIyLCAgICAgNDMsICAgICAgOSwgICAgIDIxLCAgICAgMjgsICAgICAyMSwgICAgLTQyLCAgICAtODQsCisgICAgICAgIDM4LCAgICAgOTAsICAtMjAxNCwgICAgIDYxLCAgIC0xNDksICAgIDE4OCwgIC0zMzUwLCAgIC0xMjAsCisgICAgICAgLTQzLCAgICAgMTAsICAgICAxNCwgICAgMTU1LCAgIC0yMjUsICAgLTM1MSwgICAtMTE0LCAgICAgMjgsCisgICAgICAgLTIzLCAgLTQ0MDAsICAgIDM2NywgICAgLTUxLCAgICAgNzYsICAgIC04OSwgICAtMTEzLCAgICAxMjIsCisgICAgICAyMDA3LCAgICAgMjUsICAgLTM0OCwgICAtMjI3LCAgIC0zNzAsICAgIC02MSwgICAgMTM1LCAgICAtNzksCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjE2MTZtMVtdID0geworICAgICAgLTMyMSwgICAgIC03LCAgLTY3MjUsICAgIC0zNiwgICAgIDc3LCAgICAtMjAsICAgLTEwMSwgICAtNTI5LAorICAgICAgLTE2NiwgICAgIDk3LCAgICAtNzYsICAgLTIzMiwgICAgLTcwLCAgICAgMTYsICAgICAxMywgICAgIDkzLAorICAgICAgIC01MCwgICAgMjIyLCAgIC0yNTgsICAtNDQyNCwgICAtMTI1LCAgICAxMjUsICAgICA4MywgICAgMzEzLAorICAgICAgLTI0NiwgICAtMzI1LCAgICAxMDgsICAgLTMzMSwgICAgNDg0LCAgIC0xODgsICAgIDE5MiwgICAtOTY0LAorICAgICAgMjYwMywgICAgLTM4LCAgLTIyMzYsICAgICA1OCwgICAgMzM3LCAgIC0yNTQsICAgIC0xNywgICAgLTkwLAorICAgICAgIC04OCwgICAgIDQwLCAgIC0xNDEsICAtMTI5MywgICAgLTU2LCAgIC04MTEsICAgIDI0NywgICAgLTc4LAorICAgICAgIC0zNCwgICAgMTQ0LCAgICAxMTIsICAgICA0MywgICAgMTQyLCAgIC0xMzcsICAgLTE0NywgICAgIDU2LAorICAgICAgLTQwNiwgICAgIDEyLCAgICAyMTAsICAgIDEzMiwgICAzNzA3LCAgICAxMDksICAgLTg5NiwgICAtMjY4LAorICAgICAtMjI5NSwgICAtNTA5LCAgICAgMzIsICAgLTIxOSwgICAgMTEzLCAgIC0xMDQsICAgIDE0MSwgICAgMjczLAorICAgICAgICAxOCwgICAtMzU4LCAgICAgMTYsICAtMzM1NCwgICAzNDc0LCAgIC0xNjcsICAgIDIyMCwgICAgIDEwLAorICAgICAgIDEwNCwgICAtMTc1LCAgICAgLTgsICAgIC03MSwgICAgLTc3LCAgICAtNDgsICAgIDI3NywgICAgIDgyLAorICAgICAgICA4NiwgICAgIDM1LCAgIC03MTIsICAgIC0zMiwgICAgIDM2LCAgICAtNjUsICAgIDIxMywgICAgMTIxLAorICAgICAgIC03NiwgICAtNzQyLCAgICAyOTEsICAtNDU4NywgICAtMTY5LCAgIC0xMjIsICAgIC03NywgICAtMjg1LAorICAgICAgICA1NCwgICAtMTIwLCAgICAgODksICAgICA3MSwgICAgIDEyLCAgIC0xMzMsICAgICA1NCwgICAtMjE1LAorICAgICAtMTkwNiwgICAtMTE1LCAgIDMyMjAsICAgLTE5NCwgICAtMzkxLCAgICAgODcsICAgIDQxNSwgICAtMjEyLAorICAgICAgLTIxMCwgICAtMTM4LCAgICAxODIsICAgIDU5MCwgICAgNzEzLCAgICA5NDQsICAgIDMyMCwgICAgMTQyLAorICAgICAtMTk3MCwgICAgMTk3LCAgICAtNzksICAgLTU0OCwgICAgNDU4LCAgIDI4MzYsICAgICAzMywgICAgLTYyLAorICAgICAgLTE4MywgICAtMTQ5LCAgIC02NDAsICAgIDE0NywgICAtNDI3LCAgIC0xMTMsICAgLTE3OCwgIC0xNjMxLAorICAgICAgLTEwOCwgICAyNjY2LCAgICAtNTgsICAgMjIxMCwgICAtMjUxLCAgICAyODgsICAgICAxNiwgICAgMzgyLAorICAgICAgMjEyMywgICAgNjM2LCAgICAgLTQsICAgMTExOCwgICAgMjMyLCAgICAzMzUsICAgIC0zMywgICAtMTE0LAorICAgICAgICAyNCwgICAgLTY4LCAgIDEzMDksICAgIC0zOCwgICAyMDgwLCAgICA1MzQsICAgIDI4OCwgICAtMTYyLAorICAgICAgLTYzMCwgICAtMzYwLCAgIC02NDMsICAgICAxMCwgICAgIDYyLCAgLTIyMjksICAgIDI2MywgICAgIDE5LAorICAgICAgIDMxMCwgICAgLTQ0LCAgICA0MTksICAgMjg0NiwgIC0yNTc5LCAgIC0xNTksICAgLTI0NiwgICAgNjg1LAorICAgICAgIC02NywgICAgMzk0LCAgICAzMTQsICAgLTM1NiwgICAtMTU4LCAgICAgMTksICAgICA5MCwgICAgMTE2LAorICAgICAtMjI2MSwgICAgMTYzLCAgICA2NjQsICAgIDE2MywgICAtMTkxLCAgICAtNDksICAgIC0xOCwgICAtMzA4LAorICAgICAgIC0xNSwgICAyNTA4LCAgIC0zNzAsICAgIDY5MywgICAgLTYyLCAgICA4MTgsICAgLTMwNywgICAtNjU4LAorICAgICAgIDEzMywgICAxODU4LCAgLTQ5MDAsICAgICA1MywgIC0yNDg1LCAgICAtNDgsICAgICAtOSwgICAgMTI2LAorICAgICAgIDE1OSwgICAgICA2LCAgICAtNzEsICAgIDI5MSwgICAgMTAyLCAgIC0zNjcsICAgIC02MiwgICAgIDI3LAorICAgICAgICA4OCwgICAgIC02LCAgICAyMDQsICAgIC02NSwgICAtNzI1LCAgICAgMzEsICAgLTE1OSwgICAgIC0xLAorICAgICAgICAtNSwgICAgIDQ1LCAgIC0xMzMsICAgLTE0NiwgICAgMjYxLCAgLTQ0ODEsICAgIC0xOSwgICAgNjk0LAorICAgICAgLTI2MSwgICAtNDc4LCAgIC0xNzcsICAgICA4OCwgICAgMjE0LCAgIC04MzYsICAgIC0xNCwgICAtNzYyLAorICAgICAgLTExMSwgICAgNTAxLCAgICAgIDAsICAgIDI1NCwgICAxOTcxLCAgLTEwMjQsICAgMjY3OCwgICAtMTQxLAorICAgICAtNjA2NCwgICAgIDc2LCAgICA0MzAsICAgIDE2MCwgICAtMTk1LCAgIC01ODIsICAgIDI4MCwgICAgNTgwLAorICAgICAgIDE4MywgICAtMzE1LCAgICAtMTMsICAgIDY2NSwgICAgLTUzLCAgICAzMTUsICAgLTE5OSwgICAgNDM4LAorICAgICAgIDIyMCwgICAzMjY3LCAgICAxOTQsICAgICAgMiwgICAyODA4LCAgICAtODgsICAgICA0MiwgICAgMTUwLAorICAgICAgLTE3OSwgICAgMjM3LCAgIC0xNTUsICAgIDE0MywgICAgIDQ2LCAgICAgOTksICAgICAyNywgICAgIDMwLAorICAgICAtNjEzNywgICAgLTUxLCAgICAtODksICAgIDIwMSwgICAgMTQ1LCAgIC0xNzksICAgICAxMywgICAtMzU4LAorICAgICAgICA1NSwgICAgIDcxLCAgICAgLTMsICAgICAyOCwgICAgIC05LCAgICAtMTYsICAgIDEyNSwgICAgMTYwLAorICAgICAgIDE1OSwgICAgLTIxLCAgLTU0MDcsICAgLTQ4NSwgICAgIC00LCAgICAtODgsICAgIC04OSwgICAgIDQ0LAorICAgICAgICAgMywgICAgMTY2LCAgICAgMjIsICAgLTQxMywgICAgOTkzLCAgICAgODAsICAgIDQ4NSwgICAtMTA3LAorICAgICAgIDQ0NiwgICAtOTQzLCAgIDEwMjUsICAgIDI2MSwgICAgIC0zLCAgIDI5OTEsICAgIDU0NywgICAtMjY4LAorICAgICAgLTEwOSwgICAgNTM2LCAgICAtMTAsICAgIDE4NywgICAgIDE3LCAgICAzODgsICAgLTEyMCwgICAgLTcxLAorICAgICAgLTM0MywgICAtNDE2LCAgICAxNjIsICAgICA2OSwgICAgIC05LCAgICAgNDYsICAgLTQ3NywgICAgIDgzLAorICAgICAgNjEzNCwgICAgMTQ2LCAgIC0yMzYsICAgLTEyNSwgICAgLTk0LCAgICAtNTUsICAgLTI3NCwgICAtMjMxLAorICAgICAgMTEyMCwgICAgMTcxLCAgIC0xMzksICAtMjcxNCwgICAgIDgwLCAgIC0xMTEsICAgICAyMCwgICAyNDc1LAorICAgICAgLTEzNSwgIC0xNzEwLCAgICAzMTcsICAgLTc2MiwgICAgMTU1LCAgIDEyMjIsICAgICA2OCwgICAxMTkyLAorICAgICAgIC0xNSwgICAxODI1LCAgICAtMzYsICAgIC00NSwgICAtMTIwLCAgIC00ODQsICAgLTEzMSwgICAtMTYyLAorICAgICAgLTEyOCwgICAgMTYzLCAgIC00MDcsICAgICA3MiwgICAtMjIyLCAgICAtNDYsICAgLTIyMiwgIC01MzE5LAorICAgICAgIDI3OCwgICAtMzczLCAgIC00MzYsICAgIDI4NCwgICAgMTM4LCAgIC0yNDMsICAgLTEwNCwgICAgIDI4LAorICAgICAgIC03NywgICAzMDIyLCAgICAgOTMsICAgIC0xNSwgICAtNTgxLCAgIC00OTgsICAgIDI5MiwgICAtMTY1LAorICAgICAtMTc0MCwgICAgMTIxLCAgICAxOTUsICAtMTM2OCwgICAtMTM0LCAgICAtNjgsICAgIC0yMCwgICAgLTc1LAorICAgICAgIC0xMCwgICAgMTEzLCAgICAxMjgsICAgLTM4MSwgICAtNTA3LCAgIC0yMzcsICAgLTcwOSwgICAgIDEzLAorICAgICAgIC0yMiwgICAgMTU1LCAgLTUwNjUsICAgIC05NSwgICAgMjQ2LCAgIC0yMjYsICAgIDE5MywgICAgNjg3LAorICAgICAgMTgzOSwgICAgMjQ2LCAgIC0yMzIsICAgLTM1OSwgICAgNDc1LCAgICAxMDYsICAgIDI5NywgICAgMjA1LAorICAgICAtMjcwMiwgICAtMzc4LCAgIC0yMTksICAgIC0yMCwgICAgMTQwLCAgLTMxOTgsICAgIDE5MiwgIC0zMDc3LAorICAgICAgLTEzNSwgICAgLTM4LCAgICAtMjMsICAgIDIxMywgICAgLTcyLCAgICAyNTUsICAgIC05MCwgICAtMTMwLAorICAgICAgLTE1MCwgICAgIDYyLCAgIC00ODQsICAgIC05NCwgIC0yNjI1LCAgICAtODksICAgIDM0NCwgICAtMTI5LAorICAgICAgMjY1NSwgICAgMzY5LCAgICAtMzUsICAgICAxNywgICAtNjk3LCAgICAyNTEsICAgLTM0MywgICAgIDY4LAorICAgICAgICA1MywgICAgMTc2LCAgIDMxMDQsICAgIDIzNywgICAgLTc1LCAgLTMwMjAsICAgIDE3OCwgICAgIDQ1LAorICAgICAgIC04NiwgICAgIDQ1LCAgIC0xMTUsICAgIDE4MywgICAgIDQ5LCAgICAgMjYsICAgIDE0MCwgICAgIDc3LAorICAgICAgICA0MCwgIC0yMzE1LCAgICAyNDksICAgMTc5MSwgICAgIDQ4LCAgIC03NTUsICAgIC0xMiwgICAgMjAxLAorICAgICAgLTQ1NSwgICAtMjUwLCAgICAtNjIsICAgMTcyOSwgICAtMTEzLCAgIC05NTksICAgIDIzOCwgICAtMTE0LAorICAgICAgIDI4OSwgICAtMTM1LCAgLTIyMDgsICAgMjc0OCwgICAgIDY1LCAgICAzMDYsICAgIC04MywgICAgICAzLAorICAgICAgLTUxMywgICAtNDgxLCAgICAtNDksICAgLTE2MywgICAtNTY4LCAgICAtODgsICAgIDY2OCwgICAgLTUxLAorICAgICAtMjU4NiwgICAgMTA2LCAgICAtMjIsICAgIDU4NCwgICAtNDUzLCAgIC0zNTAsICAgIDMzMywgICAtMTc3LAorICAgICAgLTIzNiwgICAtNjU3LCAgICA1MzYsICAgLTM0OSwgICAgMzk0LCAgICAtNTYsICAgICAxNCwgICAgMTMzLAorICAgICAgIC01NSwgICAgLTg0LCAgICAyMTAsICAgIC0xOSwgIC04NjQ3LCAgICAxNTQsICAgICA4MCwgICAgIDI3LAorICAgICAgICAtNywgICAgLTc2LCAgIC0xMTcsICAgIDEwMCwgICAtMjAxLCAgICAgIDEsICAgIDI5NiwgICAtMTAxLAorICAgICAgICAtNiwgICA1NjQyLCAgICAxMzcsICAgIC01OSwgICAgLTkzLCAgICAgOTUsICAgLTExMCwgICAtMjgwLAorICAgICAgIC02MSwgICAtMzAwLCAgICAgMjUsICAgIDg4NywgICAgIDQzLCAgICAtMzAsICAgMjQ5MywgICAgIDc2LAorICAgICAgIC0yMiwgICAtMzQzLCAgICA0ODksICAgIDI2NiwgICAgMzA4LCAgICAxNjMsICAgIDEzMiwgICAtMzQ5LAorICAgICAgMjAyMSwgICAgIDE4LCAgMTU1MzYsICAgICA2MSwgICAgIDExLCAgICAtNDEsICAgIC00MiwgICAgIDQxLAorICAgICAgICAtNCwgICAtMTgzLCAgICAtNDAsICAgIC0yNCwgICAgIDI2LCAgICAyNDEsICAgLTEwMiwgICAtMTE1LAorICAgICAgLTE2NCwgICAyMDQ0LCAgICAtMzUsICAgLTIxNywgICAtMjI2LCAgICA3MzQsICAgLTIyOCwgIC0yNTQ2LAorICAgICAgIDIxOCwgICAgICAwLCAgICAxMjIsICAgLTE1MCwgICAtNTI4LCAgIC0xODgsICAtMTI3MywgICAgMTU1LAorICAgICAgIDEwNywgICAgLTMzLCAgICAtMzcsICAgLTI5MywgICAgICA2LCAgICAxMTIsICAgLTE1NSwgICAtMjI4LAorICAgICAgIDE5MiwgIC0yMzc4LCAgICAxNTMsICAtMTA0NSwgICAgMjEzLCAgIDI5NzUsICAgICAzOSwgICAtMTU5LAorICAgICAgIC0xMCwgICAgLTQxLCAgICAgMzQsICAgLTEyNSwgICAgICA0LCAgICAtMzAsICAgMzkwNywgICAgLTQxLAorICAgICAgIDg0OCwgICAtMzQ2LCAgICAxOTEsICAgLTE5NSwgICAtMjkyLCAgIC0xMjYsICAgMzQyMSwgICAgLTI0LAorICAgICAgLTI0NCwgICAgIDkyLCAgICA2OTMsICAgICA2NCwgICAtMTkzLCAgICAxOTIsICAgIDEyMSwgICAgLTMzLAorICAgICAgLTE0MSwgICAgNTIzLCAgIC0xNjIsICAgMjc1NCwgICAgIDcxLCAgICAgNTksICAgICA0MCwgICAgLTYzLAorICAgICAgLTE0MiwgICAtMTAwLCAgIC0zMzgsICAgIDM3OSwgICAtMTM2LCAgICAtNjQsICAgLTE5NiwgICAgIDExLAorICAgICAgMzE5OCwgICAgMTYyLCAgIDIwOTcsICAgLTEzMiwgIC0yMzU5LCAgIC0xOTMsICAgLTM5OCwgICAtMzE4LAorICAgICAgIDg0MiwgICAtNjM1LCAgIC0xNjgsICAgIDQyNSwgICAyMDAxLCAgIC0xMzYsICAgIDI5MCwgICAgMjA2LAorICAgICAgIDU2MiwgICAgLTk2LCAgICAgLTgsICAgLTIxNCwgICAgLTQ1LCAgICAtMTEsICAgICAgNCwgICAgIDUyLAorICAgICAgIDE3NywgICAtMTQ4LCAgICAyMjksICAgICAzMywgICAgLTQ4LCAgICAtNDYsICAgNjUzOCwgICAtMTA2LAorICAgICAgIC0yNywgICAgLTIyLCAgIDY1MjcsICAgICAyMCwgICAtNDA1LCAgICAxNTcsICAgICA4NywgICAgMjA4LAorICAgICAgLTExNywgICAgIC00LCAgICAgMzAsICAgICA4NywgICAgIDI4LCAgIC0zNTYsICAgIC03NiwgICAtMTA4LAorICAgICAgIC0zMywgICAtNTY4LCAgIC0yNzAsICAgIDE3NywgICAgIDQ5LCAgIC00NTcsICAtMzIxMCwgICAgMTE5LAorICAgICAgIDEwMywgICAgMjU2LCAgIC0xODAsICAgIDIxMSwgIC0xMjA5LCAgIC0zNjksICAgLTI1NiwgICAgIDM3LAorICAgICAgIC00NywgICA0OTc2LCAgICAgODQsICAgIDIwNywgICAgMjI1LCAgICAyMjQsICAgLTQyNSwgICAgMzk2LAorICAgICAgIDkyMSwgICAgIDU4LCAgIC0xNTAsICAgIDEwNCwgICAxNTA5LCAgICAgMTUsICAgIC01OCwgICAxNzI0LAorICAgICAgICA0NywgICAgLTI0LCAgICAgMjEsICAgIDM3NiwgICAgMzUzLCAgICA0ODIsICAgLTIzNiwgICAgNjM0LAorICAgICAgIDMwNiwgICAzMTc5LCAgICAgNzMsICAgIC0zMywgICAgLTU0LCAgIC0xNjksICAgLTIxNCwgICAgMTQ2LAorICAgICAgNDMyMiwgICAtMjE2LCAgIC02NDQsICAgIDMwNSwgICAgMzA1LCAgIC00NTMsICAgICA1MywgICAgMTQzLAorICAgICAgICAtOSwgIC0xNDcyLCAgIC0xNDEsICAgMTMxNCwgICAgIDU3LCAgICAgNDAsICAgIC01NSwgICAgLTgwLAorICAgICAgICA2NywgICA5MjY0LCAgICAgNTcsICAgICA4NiwgICAgIDIyLCAgIC0xNDcsICAgICAgMSwgICAgIC02LAorICAgICAgICAgMCwgICAgIDM5LCAgICAgIDcsICAgIDExNCwgICAgLTUxLCAgIC0xMzcsICAgIDE1NSwgICAgLTE1LAorICAgICAgLTEyMiwgICAgICA1LCAgICAxMzcsICAgIDEyNSwgICAgMjEzLCAgICAgLTYsICAgNzE1OCwgICAgIDM2LAorICAgICAgIC01MiwgICAgLTU0LCAgICAxNDksICAgIDkwMSwgICAgODU5LCAgICA3MDMsICAgIDM2NiwgICAgNjczLAorICAgICAgIC0xMywgICAxMTg2LCAgICA1ODgsICAgLTIwMiwgICAtNDUxLCAgICAgMTgsICAgLTU4NSwgICAtMjUwLAorICAgICAtMjYzMiwgICAtMTM0LCAgICAgNjEsICAtMzAzOCwgICAxMDIyLCAgICAgNzgsICAgLTY3MiwgICAtMjc2LAorICAgICAgICA5NiwgICAgODM4LCAgICA1MzMsICAgLTI1NCwgICAtNTI1LCAgIC0xMDYsICAgLTM3OCwgICAxNjI3LAorICAgICAgICAxMiwgICAgIDMxLCAgICAzMTcsICAgLTExOCwgICAgIDgxLCAgICAzMTMsICAgLTE4NiwgICAgMTk3LAorICAgICAgIDQ1MiwgIC0yOTcxLCAgICAgODMsICAgMTMyNiwgICAgNDE5LCAgLTIzNjYsICAgLTMyOCwgICAgLTg3LAorICAgICAgLTEwMywgICAtMjQzLCAgIC0yODAsICAgICAyNSwgICAtMjQwLCAgICA1OTAsICAgLTIzMiwgICAgMTA1LAorICAgICAtMjk2NiwgIC0yMzkxLCAgIC0zMjYsICAgIDMzOCwgICAgIDgwLCAgIC0zOTIsICAgLTI0MywgICAgMjcxLAorICAgICAgICAtNywgICAxMTI3LCAgICAgIDEsICAgMTkwMSwgIC0yMjc5LCAgIC0yMDcsICAgICAzMiwgICAgLTk5LAorICAgICAgIDU2MCwgICAtMTkzLCAgICAzNzEsICAgIDQ5NCwgICAgNTA2LCAgICAyNTUsICAgIDMzMiwgIDEwNzM3LAorICAgICAgICA0OCwgICAgICA4LCAgICAtMzMsICAgIC0zMywgICAgIDMyLCAgICAtMzMsICAgICA0NSwgICAtMTA0LAorICAgICAgLTI1OSwgICAgLTk5LCAgICAtMzcsICAgLTEzNCwgICAgIDcyLCAgICAtNTAsICAgIDEzOCwgICAgNDI4LAorICAgICAtMjI1OCwgICAgIDc3LCAgICA3NDQsICAgICAgNSwgICAgIDk2LCAgIDMwMjAsICAgLTI2OSwgICAgIDQ5LAorICAgICAgIDExMiwgICAtMjIzLCAgICAxODYsICAgICA0OCwgICAgMjI0LCAgIDI1NzEsICAgIDM0MCwgICAtMTI5LAorICAgICAgIC0zOSwgIC0xOTAwLCAgICAtNDUsICAgMTk3OCwgICAtMjYxLCAgICAyMjMsICAgIDI5NCwgICAgIDIyLAorICAgICAgLTEwOCwgICAgLTU4LCAgICAxMDksICAgIC0zMSwgIC0zMjUyLCAgIC0xMzgsICAtMjk2OSwgICAgLTE5LAorICAgICAgLTEzMywgICAgMTkwLCAgICAtMzYsICAgIDEzMiwgICAtMTM2LCAgICAgNjMsICAgLTE3NSwgICAgMzUxLAorICAgICAgIC03NiwgICAgMjMyLCAgLTI3MDgsICAgIC0xNywgICAgLTI0LCAgIC0xMzAsICAgLTQ3NCwgICAgIDc0LAorICAgICAtMjk3OCwgICAgIDQ1LCAgIC0xMzksICAgIC0yMywgICAgMjI3LCAgICAtNDIsICAgLTE0MSwgICAgMjc4LAorICAgICAgICA4MSwgICAgICA4LCAgLTI0OTEsICAgLTQ0NiwgICAgMzE1LCAgICAtNjQsICAgLTE2NywgICAtNjQzLAorICAgICAgLTI3NSwgICAgMTAwLCAgICAgIDAsICAgMjQ4NCwgICAtNDgyLCAgIC0xMjgsICAgLTE0NCwgICAtMjA2LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IxNjE2c2wwW10gPSB7CisgICAgICAgLTQ2LCAgLTUwNzMsICAgIDExOSwgICAgLTY4LCAgICAgIDgsICAgLTE2MCwgICAgMjAxLCAgICAtMTUsCisgICAgICAgIDU1LCAgICAgNDQsICAgICA0NCwgICAtMTk3LCAgIC0xMTAsICAgIC04MywgICAgLTkwLCAgICAtNjYsCisgICAgICAgLTI5LCAgIC0xMjgsICAgMjQ0OSwgICAtMTgyLCAgIDIyMjYsICAgIDI5OCwgICAgLTY5LCAgICAxODksCisgICAgICAtMTY3LCAgICAxOTksICAgIC03OCwgICAgIDYwLCAgIC0xNTQsICAgLTE2OSwgICAtMjQyLCAgICAxODksCisgICAgICAgMjE0LCAgICAxMzIsICAgIC00MSwgICAgMTY5LCAgICAyMjIsICAgLTEzMCwgICAgMjA5LCAgICAgMjAsCisgICAgICAtMTU0LCAgIC0zMjcsICAtMzQ1OCwgICAgMTg2LCAgIDEzNTYsICAgIDY3MiwgICAgMTMzLCAgICAxMDAsCisgICAgICAgMzc1LCAgIC00OTEsICAgIC01MiwgICAgLTg3LCAgICAxNTMsICAgIDUzNywgICAyNTEzLCAgIC0zNDksCisgICAgICAgIDQ3LCAgICAtMjcsICAgIDExOCwgICAtMzAxLCAgICAyNTAsICAgICA0NSwgICAgMTkxLCAgIC0xNTAsCisgICAgICAgMjc5LCAgIDIzNjcsICAgIC03MCwgICAgMTkxLCAgIC0zMDEsICAgLTIwNiwgICAgIC01LCAgICAtNDAsCisgICAgICAtMjAxLCAgIDM2ODAsICAgIC02NywgICAgIDM2LCAgIC0zNDEsICAgLTEzMywgICAtMTk3LCAgIC0zODMsCisgICAgICAtMTAxLCAgICAgMjEsICAgIC02OCwgIC0xMjQwLCAgICAgNjksICAgICAtOCwgICAgIC03LCAgICAtMTYsCisgICAgICAgIDI4LCAgICAtNDcsICAgLTE0NSwgICAtMTY5LCAgICAgMzIsICAgIDE3MCwgICAgMjQ2LCAgICAxNDksCisgICAgICAzMDM5LCAgLTI2MTcsICAgIC00MiwgICAgLTk1LCAgICAxODQsICAgIC03NCwgICAgIDcxLCAgICAtNTYsCisgICAgICAgLTIyLCAgICAtODUsICAgLTIwMywgICAgMTI5LCAgICAgOTcsICAgLTEwNSwgICAgLTkxLCAgIC0zMDQsCisgICAgICAgICA0LCAgICAgOTMsICAgICA4OSwgICAyNzI0LCAgIDI4MDksICAgLTE3OCwgICAgIDUyLCAgIC0xNTUsCisgICAgICAtMTUyLCAgICAxNDksICAgICA0NywgICAgMTgyLCAgICAxMjQsICAgIC03NSwgICAgIDI0LCAgICAyNTYsCisgICAgICAgLTM4LCAgICAgNTMsICAgLTEzNSwgICAgIDYzLCAgICAgNzAsICAgICA1OSwgICAgLTU5LCAgICAgIDcsCisgICAgICAgICA2LCAgICAgNDYsICAgODE5MiwgICAtMTU3LCAgICAxNDIsICAgICA4MSwgICAgMTIxLCAgICAxMzYsCisgICAgICAgLTg3LCAgIC0xNDcsICAgIC03MSwgICAgIDU5LCAgICAgNTcsICAgIDExOSwgICAgIDIxLCAgLTE5MzgsCisgICAgICAgIDQ2LCAgICAxODYsICAgIDEwMCwgICAtMTU4LCAgICAtNTIsICAgICAzNCwgICAgIDk1LCAgICAgMjIsCisgICAgICAgIDIwLCAgICAxNzksICAgIDExMiwgICAgMTE2LCAgICAyMzQsICAgMjU1MSwgIC0zMDEyLCAgIC0xNjcsCisgICAgICAgLTkzLCAgIC0zNzksICAgIC05MCwgICAgIDI0LCAgICAyMDgsICAgIDI1NywgICAgMjUzLCAgICAgMjMsCisgICAgIC0xMzYxLCAgICAyMDksICAgICA3NSwgICAgMTkxLCAgICAtMjMsICAgLTExNSwgICAyMDI0LCAgICAyNjQsCisgICAgICAgIDc3LCAgIC0xNTksICAgICA3NywgICAtMjE5LCAgIC0yMzcsICAgLTE1NCwgICAgIDEzLCAgICAyNzMsCisgICAgIC0zMzM4LCAgICAxMjIsICAgLTIwNSwgICAzNzk2LCAgICAtOTYsICAgIDEwMywgICAtMTM2LCAgICAtNjAsCisgICAgICAgMTE1LCAgICAtODEsICAgICAxOSwgICAgIDY5LCAgICAzOTYsICAgIDIyNSwgICAtMjgwLCAgICAgODYsCisgICAgICAgMzI5LCAgICAyODQsICAgIDUwNSwgICAgNDAzLCAgICAtMzcsICAgIDIwMywgICAgMzEwLCAgLTI1ODcsCisgICAgIC0yMzc0LCAgIC0yNDEsICAgIC0xNywgICAgNDkyLCAgICAtNDIsICAgIC0zMiwgICAgMjYxLCAgICAxMTIsCisgICAgICAgMTIzLCAgICAtMzMsICAtMTI3MSwgICAtMTEyLCAgICAtNDEsICAgICAxMiwgICAgIDgyLCAgICAgNjcsCisgICAgICAgLTcxLCAgICAgNTYsICAgIC0xMCwgICAgLTgzLCAgICAtMjgsICAgICAxNSwgICAgLTEyLCAgICAgNDIsCisgICAgICAyMjkyLCAgICAyOTcsICAgLTIzNSwgICAgIC0zLCAgICA1MjgsICAgIC01NywgICAgMTU5LCAgIC0xODUsCisgICAgICAgLTU0LCAgICAtODQsICAgLTE1MiwgICAgNzc1LCAgICAgMTUsICAgICA1NCwgICAgNDUxLCAgIC0yOTQsCisgICAgICAgIDUzLCAgICAgLTIsICAgIDE0MSwgICAgIDM5LCAgICAtNjUsICAgICA3NSwgICAgMTQ5LCAgLTU0NjAsCisgICAgICAgIDE3LCAgICAtNTgsICAgLTEyNiwgICAtMjgxLCAgICAyNjQsICAgIDE1MSwgICAgMzYyLCAgICAtOTgsCisgICAgICAgIDYyLCAgLTIzNjEsICAtMjU2MCwgICAgMTczLCAgICAgNDIsICAgLTI5MCwgICAtMTYxLCAgICAtOTYsCisgICAgICAgLTUyLCAgICAgODIsICAgIDEzMCwgICAgLTg2LCAgIC0xNTAsICAgICA0OCwgICAgIDIwLCAgICAtNTcsCisgICAgICAgIDUyLCAgLTIyNjMsICAgIC05NiwgICAyNjYyLCAgICAtNjYsICAgICAyMSwgICAgIDc0LCAgICAtMzcsCisgICAgICAgIDIyLCAgICAzMjMsICAgICA2NCwgICAgMjcwLCAgIC0xNDEsICAgLTU5OSwgICAtMzAwLCAgIC0xMjEsCisgICAgICAgLTEyLCAgIC0xMjgsICAgIC05NiwgICAgIC0zLCAgIC0xMjksICAtNDMzOSwgICAtMjkzLCAgICAtNTUsCisgICAgICAgIDMxLCAgICAtODIsICAgICAgOCwgICAgIDgyLCAgICAtMjAsICAgICA1OCwgICAgIDE1LCAgIC0yMzgsCisgICAgICAgMTQwLCAgIC0xMjUsICAgIC05OCwgICA3NjMyLCAgICAtMTQsICAgICA5NiwgICAtMTI5LCAgICAtMTIsCisgICAgICAgLTM5LCAgICAgODUsICAgICAgMCwgICAtMTA0LCAgIC0yMjUsICAgICAyNCwgICAgICAzLCAgICAgOTUsCisgICAgICAgLTg3LCAgICAxMTUsICAgIDE2OCwgICAgIDE5LCAgICAgMjIsICAgICA5NSwgICA4MDU2LCAgICAgMzYsCisgICAgICAgLTEyLCAgICAxMDYsICAgIC05OSwgICAgLTE1LCAgICAtODcsICAgIDExMiwgICAtMTIyLCAgICAgNTUsCisgICAgICAgIDE0LCAgICAyODIsICAgIC0zMSwgICAgIDgwLCAgICAgNDIsICAgICAtNCwgICAgIDgxLCAgICAtNzMsCisgICAgICAgIDc0LCAgICAtMTAsICAgICA4MiwgICAgIDM1LCAgICAxNzMsICAgIC0yMCwgICAgLTQwLCAgLTgxOTIsCisgICAgICAgLTM1LCAgIC0zODYsICAgIDI3MCwgICAgMjYzLCAgIC0yMzEsICAgLTE0MiwgICAgIDQyLCAgIC00NDUsCisgICAgICAgMjA0LCAgICAxNzcsICAgLTMzMCwgICAtODU5LCAgICA3MTUsICAgMjczMSwgICAgIDU5LCAgIDI1NzgsCisgICAgICAgMjIwLCAgIC00NzgsICAgICAgMywgICAgNDEwLCAgICAtNDcsICAgICA2MSwgICAtMjE0LCAgIDI3NjUsCisgICAgICAtMjA2LCAgICAxNzQsICAgICA1NiwgICAgNDI3LCAgICA0NDIsICAgIDExOCwgICAyNzA4LCAgICAtNjYsCisgICAgICAgLTQwLCAgICAgNDEsICAgIDExOSwgICAgLTY1LCAgICAtNzEsICAgIC0yMSwgICAgMTI0LCAgICAxMDYsCisgICAgICAgLTE4LCAgLTI1ODYsICAgIC0zNSwgICAgMTA2LCAgIC0zNjQsICAgIDI4NiwgICAgLTE2LCAgIC0xNzgsCisgICAgICAtMTQ2LCAgICAtODIsICAgIDE1NywgICAgIDkyLCAgICAgLTQsICAgLTQzNywgICAtMTMxLCAgICAtODUsCisgICAgICAgLTI3LCAgICAtOTAsICAgICAyMywgICAgLTU4LCAgLTUzMzIsICAgIDExNSwgICAgLTY5LCAgICAtMjUsCisgICAgICAgLTE0LCAgICAgMTMsICAgICA1MiwgICAgIDE0LCAgIC0yODYsICAgIC0xMywgICAgLTYwLCAgICAgMTYsCisgICAgICAgIDE5LCAgICAgNTMsICAgICAzNSwgICAgICA3LCAgICAtMjEsICAgICAgNywgICAgMjMxLCAgICAgNDgsCisgICAgICAyNDk1LCAgICAtODIsICAgMjgzNiwgICAgIDQ0LCAgIC0xMzQsICAgIC03NiwgICAgIDMzLCAgIC0zOTQsCisgICAgICAgIDQ3LCAgIC0xMjQsICAgLTE3NSwgICAgIDk1LCAgICAxMDMsICAgIDE2MSwgICAgIDU3LCAgICAtMzcsCisgICAgICAgMTc0LCAgIC00OTksICAgIDEzMSwgICAtMzk0LCAgIDIwMDcsICAtMjU5NiwgICAtNDgxLCAgICAyOTQsCisgICAgICAgMTUyLCAgICA2MDEsICAgIDE0NCwgICAtNDM4LCAgICAxMDksICAgLTIwNCwgICAgMzE3LCAgICAgMzcsCisgICAgICAgMzYyLCAgIC0xNTMsICAgIDIxNiwgICAgMjY5LCAgICAtMzksICAgMTI1MCwgICAgNTA1LCAgICA1MDUsCisgICAgICAyNTcxLCAgIC0xMTUsICAgLTU5NSwgICAtODA2LCAgIC05OTgsICAgMTIyNiwgICAgLTcxLCAgICAgMjYsCisgICAgICAgLTY3LCAgICAyNjIsICAgICA1MSwgICAtMTYxLCAgICAxODMsICAgMTYyMiwgICAgLTMyLCAgICAyMzMsCisgICAgICAgICAzLCAgIC0yMTcsICAgICAxOSwgICAgLTE2LCAgICAyMDksICAgICA1MSwgICAgIDQwLCAgICAtNDAsCisgICAgICAgLTQzLCAgICAtMjcsICAtNzIyNywgICAgIDEzLCAgIC0xMjgsICAgIC0xOCwgICAgIDgyLCAgICAxNTQsCisgICAgICAgMTMzLCAgIC0xMjEsICAgICAzMywgICAgLTY2LCAgICAgIDgsICAgLTEwMiwgICAgIDcxLCAgICAgIDgsCisgICAgICAyNzgwLCAgICAtNDMsICAgICA3OSwgICAzMjEyLCAgIC0yODIsICAgLTE2NSwgICAgMTI1LCAgICAgNzgsCisgICAgICAtMTAxLCAgICAtNTksICAgICA1OSwgICAtMTM2LCAgICAzMDgsICAgIC02MSwgICAtMjk1LCAgIC0yNDEsCisgICAgICAgLTI5LCAgICAgMjcsICAgLTMyNiwgICAyOTMyLCAgIC01NjMsICAgIDMwOCwgICAtMjY5LCAgICAtMzQsCisgICAgICAtMTU4LCAgICAtMjYsICAgIC02NCwgICAtNDExLCAgICAtNzUsICAgIDQyMCwgICAtMjk0LCAgIC0yMzksCisgICAgICAgLTExLCAgICA0MjksICAgICA0NCwgICAgIDM2LCAgICAgNjksICAgLTIwMCwgICAgLTU2LCAgICAyNzksCisgICAgICAgIDgwLCAgIC0yMTgsICAgLTI5NCwgICAtMjk0LCAgICAyNTIsICAgICA2NCwgICA3NzkzLCAgICAgIDcsCisgICAgICAtMTU1LCAgICAtNTYsICAtMzExOCwgIC0yNzQ5LCAgIC0xNzgsICAgICA2MiwgICAgNDQxLCAgICAxMDUsCisgICAgICAgLTQ1LCAgICAgMjMsICAgICAyMywgICAtMTAxLCAgIC0xMDksICAgIC0yNiwgICAtMTQ5LCAgICA1NjYsCisgICAgICAgLTI5LCAgIC0zOTQsICAgLTg1MCwgICAxNjk5LCAgIDE5ODYsICAgIDI0MywgICAtNjY1LCAgICA1NjUsCisgICAgICAgMTU1LCAgLTE3NDYsICAgICA5NiwgICAtMzQ0LCAgIC02NTEsICAgIDM4NywgICAtMzYzLCAgICAyODMsCisgICAgICAgMjQxLCAgICAxMDEsICAgICA3MSwgICAgLTE4LCAgICAgLTksICAgICA0MywgICAgMTE0LCAgICAtMjIsCisgICAgICAgICA5LCAgIC0xMDksICAgLTExOSwgICAgLTkyLCAgICAxMTcsICAgODE5MiwgICAgLTY3LCAgICAgODcsCisgICAgICAgMTc0LCAgICAtNDIsICAgLTE5NSwgICAgNTI3LCAgIC0xNTUsICAgLTE5NSwgICAtMTY3LCAgLTE2MTksCisgICAgICAyNjM4LCAgIC04MjQsICAgIDEyMSwgICAgIDQ0LCAgICAxMzgsICAgLTgwOCwgICAgNDA3LCAgICA1ODQsCisgICAgICAtMjE3LCAgICAtOTAsICAgLTI3OCwgICAgNTQ5LCAgIC0xMTgsICAtMTI3OCwgICAgODM3LCAgICAyMjAsCisgICAgICAgMTQyLCAgIC05NTYsICAgLTI5NCwgICAgIDg5LCAgIDI2MjcsICAgIDI2OSwgICAtMTI5LCAgICAyNTMsCisgICAgICAgIDEwLCAgICAgMTUsICAgIDE2NywgICAgMTYzLCAgICAgODcsICAgLTI2MiwgICAgIDg5LCAgICAgNDgsCisgICAgICAgIDE0LCAgICAgMjQsICAgMjk2NywgICAtMTc1LCAgIDI1NTAsICAgICA1MSwgICAgIDExLCAgIC0xNTIsCisgICAgICAtMTExLCAgICAyMzAsICAgLTI2NywgICAgLTc5LCAgICAzMjEsICAgLTY0MSwgICAgNTA3LCAgICAtMzIsCisgICAgICAgLTIwLCAgIC0yMzgsICAgICAyMywgICAtMzIyLCAgLTI1MDYsICAgIDE3MywgICAyMjA1LCAgICAtOTEsCisgICAgICAgLTIxLCAgLTE1OTQsICAgIDQyMCwgICAtMTU3LCAgICAgOTcsICAgICA2NCwgICAgMTI2LCAgICAtMzgsCisgICAgICAgLTg0LCAgICAgMTAsICAgIC04NSwgICAgIDkzLCAgICAtMjEsICAgIDI3MiwgICAtNDI3LCAgICAgMzAsCisgICAgICAgLTYwLCAgICAgNjEsICAgIC04MSwgICAgLTQwLCAgICAgMjcsICAgICAxOCwgICAgLTI5LCAgIC0yMDgsCisgICAgICAgLTcwLCAgLTgxOTIsICAgICAxNiwgICAgIDE1LCAgICAgNTMsICAgICAzNCwgICAgIDQ5LCAgICAtMjYsCisgICAgIC0yNTEyLCAgIC0xNTIsICAgICAyMywgICAgLTc3LCAgIDMwMTUsICAgICA4NywgICAtMTY0LCAgICAyNDcsCisgICAgICAgMTE5LCAgICAgOTEsICAgIDQ0NCwgICAgLTQzLCAgIC0xNjYsICAgIC0yNiwgICAgMjUzLCAgICAtOTMsCisgICAgICAgIDUwLCAgICA0MDgsICAtMzI3NCwgICAgOTEzLCAgICAxMDQsICAgIDExOSwgICAgIDE3LCAgICAtNTQsCisgICAgICAgIDQyLCAgICAgMTksICAgLTI5NCwgICAtMjk4LCAgIC00MTYsICAgIC04MiwgICAgIDM4LCAgIC0yNjMsCisgICAgICAgMTM3LCAgICAxMzIsICAtMjYwOSwgICAgLTQ0LCAgIDI3ODMsICAgIC0zNCwgICAgIC05LCAgICAyNjYsCisgICAgICAgICA4LCAgICAgMTgsICAgLTE4MywgICAgNTIwLCAgICA1MTUsICAgIC05MywgICAtMTU5LCAgICAtMjEsCisgICAgICAgMTg2LCAgICAgMjcsICAgIC04OSwgICAgMTM3LCAgICAgNzcsICAgIC02MCwgICAgLTMzLCAgICAgMzQsCisgICAgIC01MTE1LCAgICAtNDQsICAgLTE3MiwgICAtMTIyLCAgICAgLTksICAgLTEwNCwgICAgIDY5LCAgICAgMTYsCisgICAgICAgIDk0LCAgIDI4MTMsICAgLTIwMCwgICAtMTQyLCAgICAtNTAsICAgIDM3NSwgICAzMjc2LCAgIC0yNzIsCisgICAgICAgLTQ0LCAgICAgNDcsICAgIC00MSwgICAtMTg4LCAgICAyNjMsICAgLTIzNywgICAgLTI0LCAgICAzMTIsCisgICAgICAgMTIwLCAgIC0zMjYsICAgIDgyMywgICAgMTkzLCAgICA0MTAsICAgIC05NSwgICAgMzU2LCAgICA1NjUsCisgICAgICAgMjk2LCAgIDEyMDIsICAtMjczNywgICAtOTY4LCAgICAgODcsICAgLTIwNCwgIC0xMzI5LCAgIC04MjYsCisgICAgICAtODI3LCAgICA1ODQsICAgIDE5NCwgICAgLTMxLCAgICAtMTIsICAgLTEwOSwgICAgLTM5LCAgICAgLTcsCisgICAgICAgIDczLCAgICAgMjksICAgICAyNCwgICAgLTEyLCAgICAyNTYsICAgIC05OCwgICAgLTQ2LCAgICAgNjMsCisgICAgICAgMjA3LCAgICAgLTgsICAgICA3MywgICAtMzQyLCAgIDQ1NzgsICAgIC0zNywgICAgIDYwLCAgICAtNjYsCisgICAgICAgICA4LCAgICAtMzksICAgLTE3NiwgICAtMTI1LCAgICAtMzQsICAgICA1NywgICAtMTQxLCAgICAtNTIsCisgICAgICAgLTM5LCAgIC0xMjgsICAgIC01MCwgICAtMTQzLCAgICAtODUsICAgLTEwNywgICAgIDE5LCAgICAtMzgsCisgICAgICAgIDc0LCAgICAtNDAsICAgLTE2MSwgICAgLTU0LCAgICAtNjMsICAtMzQ1MiwgICAgMTc2LCAgICAxMTYsCisgICAgICA1Mjc0LCAgICAgMTksICAgIC00MiwgICAgMTk4LCAgICAgIDMsICAgICAzMywgICAgIDgwLCAgICAtOTksCisgICAgICAtMTExLCAgICAgMTEsICAgIC05MCwgICAgIDk3LCAgICAgLTYsICAgICAtMywgICAgLTUyLCAgICAzMDEsCisgICAgICAyMzM1LCAgICAxNDgsICAgLTE3MSwgICAgLTg4LCAgICAgNDQsICAgLTQwNCwgICAgMTI0LCAgICAgIDQsCisgICAgICAgLTgwLCAgICAxODksICAgMjgzOCwgICAgIDYyLCAgIC0yNDcsICAgIDM5NCwgICAtMjMwLCAgICAtOTEsCisgICAgICAgIDkyLCAgLTI1ODcsICAgICA4NCwgICAtMTM5LCAgICAtMzEsICAgMzAxNCwgICAgIDI1LCAgICAyMDEsCisgICAgICAtMTM3LCAgICAtNjQsICAgIDM4MywgICAgICAyLCAgICAtNzAsICAgLTExNSwgICAtMjEwLCAgICAgNDMsCisgICAgIC0xMTExLCAgIC00MDMsICAgLTM3OSwgICAgIC05LCAgICAyNDMsICAgICA3NywgICAtMjIwLCAgICAtNjAsCisgICAgICAgLTM4LCAgICAtMTUsICAgICAgNywgICAgMTA5LCAgICAgNDEsICAgIDE0MywgICAgIDU2LCAgIC0yMTEsCisgICAgIC0yNDkyLCAgICAtNDgsICAgLTIxOCwgICAtMTE1LCAgIC0zMjEsICAgLTM1OCwgICAgMzg4LCAgICAtMTAsCisgICAgICAtMTcyLCAgICAtNTIsICAgIDE3NywgICAyOTk2LCAgICAtOTYsICAgIDQ4MCwgICAgLTIzLCAgICAtMTUsCisgICAgICAgMTc3LCAgIC0yMjUsICAgIDIxNywgICAgIDEwLCAgICAzNjcsICAgIDEyOSwgICAgLTQ1LCAgIC0xMTQsCisgICAgICAgIDIzLCAgICAyNTcsICAgIC00OCwgICAyNDk3LCAgICAyMzYsICAgICAxMiwgICAgMTk3LCAgICAyNDUsCisgICAgICAgIDE5LCAgIC0xNzMsICAgLTMyMSwgICAgMzEwLCAgICA0MDYsICAgLTI4MCwgICAgLTcyLCAgIC0yNzksCisgICAgICAgIDczLCAgIDMzMDcsICAgIDI0NSwgICAgIDc4LCAgIC0xODYsICAgMjkyOCwgICAgMjY0LCAgICAyNjMsCisgICAgICAtMjI3LCAgICAgNTAsICAgIDE3MiwgICAgIDkxLCAgICAyOTMsICAgICAyNCwgICAtMTQ4LCAgIC0yNDUsCisgICAgICAgLTYxLCAgICAyMTksICAgIC04OCwgICAgMTY5LCAgICAyMjAsICAgIC05OSwgICAzMjIyLCAgICAgIDMsCisgICAgICAgICAwLCAgICAxMDMsICAgICAxOSwgICAgMTE2LCAgICAgNjksICAgLTE4MCwgICAgIC03LCAgICAtNDksCisgICAgICAgIDI2LCAgICAtNTksICAgIC05MywgICAgLTY4LCAgICAxMjMsICAgIDM1NywgICAgMjQxLCAgLTMzMDgsCisgICAgICAtMjk3LCAgICAxOTgsICAgICA0MCwgICAgLTgwLCAgICAyODUsICAgIDE2MSwgICAgIDkwLCAgICAtNDYsCisgICAgICAtMTY1LCAgICAtMzIsICAgICA4NywgIC01Njc2LCAgICAyNTQsICAgIC0zNywgICAgICA3LCAgICAtMjAsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjE2MTZzbDFbXSA9IHsKKyAgICAgICAgNzMsICAgICA3OCwgICAgLTY0LCAgICAgNzYsICAgICAxNywgICA2MjUwLCAgICAgLTQsICAgLTE2NywKKyAgICAgICAgNTIsICAgICAgNCwgICAgIC0zLCAgICAgMTEsICAgLTE4OSwgICAgLTE5LCAgIC0xMzYsICAgLTIyMCwKKyAgICAgICAgMTUsICAgICAgNiwgICAtNDIwLCAgLTIyMDUsICAgICAzOCwgIC0yOTQ0LCAgICAgMTYsICAgIDExOCwKKyAgICAgIC0xMTYsICAgICA2MSwgICAgMTE5LCAgIC0zOTAsICAgIDIxNywgICAgNTQ4LCAgICAgMjQsICAgIDE2MSwKKyAgICAgICAtMjQsICAtMjM0MiwgICAtMTQ4LCAgIC0xNTksICAtMjc4MywgICAgMjI1LCAgICA0MDEsICAgLTIyNiwKKyAgICAgICAyMTAsICAgIDY0MywgICAtMzY2LCAgICAyNDAsICAgIDI2NCwgICAgMTY3LCAgICAxMTUsICAgIDgyNywKKyAgICAgICAtMzksICAgLTE2MSwgICAgIDMwLCAgIC0xNzMsICAgICA0MiwgICAgIDI5LCAgICAgOTgsICAgIDM3NywKKyAgICAgICAtNTgsICAgLTE2MywgICAgLTQxLCAgICAgMjcsICAgICAyNSwgICA0MzY4LCAgICAgODcsICAtMjgzNiwKKyAgICAgIC0xNzUsICAgIC03MSwgICAgLTYyLCAgICAtODQsICAgLTQ3NiwgICAgICA0LCAgIDI0NjYsICAgIDExMywKKyAgICAgLTI4MzAsICAgLTkxNiwgICAgNTkzLCAgICAyNzYsICAgLTM1NiwgICAtNDI3LCAgIC02ODYsICAgLTIxNSwKKyAgICAgIDI3NTIsICAgIDM5NSwgICAgIC05LCAgIC0zNDUsICAgIDExNywgICAtMTIyLCAgIC0zMjcsICAgICA5MiwKKyAgICAgICAxMDcsICAgLTEwNiwgICAgIDMyLCAgICAyNzAsICAgIDI3MSwgICAgMTcxLCAgIDMxMzgsICAgIDE5OCwKKyAgICAgICAtNDYsICAgIC03MCwgICAgIDQ2LCAgICA1MDIsICAgICA5MSwgICAgIDc3LCAgICAtMTksICAgIDIxNiwKKyAgICAgICAgOTQsICAgIDEyMiwgICAgLTY0LCAgIC0zOTIsICAgIC0zMSwgIC0yNjk2LCAgIC0zNjQsICAgLTEzMSwKKyAgICAgIC0zMTUsICAgIDEyOSwgICAtNDYxLCAgICAyMjksICAgIDE5MiwgICAgMjM2LCAgICAxODUsICAgLTI2MywKKyAgICAgIC0xNzMsICAgICA0NCwgICAgIDI0LCAgIC0yNjcsICAgIC00MCwgICAtMTc3LCAgIC0xNDksICAtMjQ3MSwKKyAgICAgICAgMjYsICAgIDExMywgICAtMTgzLCAgLTE2OTMsICAgLTE4OCwgICAgIDQ4LCAgICAgMjIsICAgIC03MywKKyAgICAgICAgNTAsICAgLTEzMywgICAgIDU4LCAgICAtNzAsICAgLTE3MywgICAtMzA4LCAgIC00NDIsICAgLTE4OCwKKyAgICAgICAgOTIsICAgIDM4OSwgICAgLTM1LCAgICAxNjcsICAgIDIzNSwgICAgIDY2LCAgIDI1OTMsICAgMjQzNSwKKyAgICAgICAyNDQsICAgIDYzMCwgICAgLTIyLCAgICAyMzUsICAgIDExMiwgICAgLTMyLCAgICA1MzMsICAgLTE1OCwKKyAgICAgICAgODEsICAgICA3MSwgICAgIDQ0LCAgICAtNTksICAgLTE1OCwgICAgLTIzLCAgICAgMjgsICAgODE5MiwKKyAgICAgICAtNTgsICAgLTE4MSwgICAgIDM5LCAgICAyMjAsICAgIC01NCwgICAtMTI0LCAgICAtNTksICAgLTI3NywKKyAgICAgICAgNzEsICAgICA0MSwgICAgLTgyLCAgIC0xNTcsICAtNjg2MCwgICAgIC00LCAgICAgNDQsICAgIC04NCwKKyAgICAgICAtNDgsICAgIDEzNCwgICAtMTkzLCAgICAxNTksICAgIC00NSwgICAgMjE4LCAgICAtNDcsICAgLTEzMywKKyAgICAgICAxNDcsICAgMTc0OSwgICAgNzY1LCAgICAtODQsICAgIDE4NCwgICAtMzE3LCAgIC0yODYsICAgIC0xNywKKyAgICAgIC0zNDAsICAgLTI2MiwgICAtMjQ0LCAgICAtMjEsICAgMzEyMiwgICAgMjkwLCAgIC0xMjcsICAgLTExOSwKKyAgICAgICAxNzksICAgLTEyOCwgICAtMTI1LCAgIC00MzksICAgMjc2NiwgICAxOTE3LCAgICAgODUsICAgICA1NywKKyAgICAgICAtMzIsICAgIDM3MywgICAgLTE2LCAgICAxNzAsICAgIC03NCwgICAgIDMxLCAgICA0MjUsICAgIDYyNiwKKyAgICAgICAgIDEsICAgLTUxMSwgICAgIDY0LCAgICAzODcsICAgIDE0MiwgICAtNjIxLCAgICAxODMsICAgLTIyNCwKKyAgICAgICAyMjAsICAgMTE5NSwgICAgMzg2LCAgLTMzNjAsICAgIDMzMiwgICAgNDg0LCAgLTExMTIsICAgIC05NiwKKyAgICAgICAxODcsICAgICA0MywgICAxODM4LCAgICAgMzksICAgIC0zNiwgICAgIDEzLCAgIC0xMzIsICAgICAtOCwKKyAgICAgICAgLTEsICAgIC00MywgICAgIDI5LCAgIC0xMzIsICAgIC0xOSwgICAgIDEwLCAgICAgMTAsICAgLTIxOCwKKyAgICAgLTM2NTksICAgIDExOSwgICAtMTAzLCAgICAtMjcsICAgIC0yOSwgICAtMTA4LCAgICAgMTMsICAgIDE4MSwKKyAgICAgICAgMzksICAgLTExNywgICAgIDkyLCAgICAgMzcsICAgIC0xNywgICAtMTk4LCAgICAzMzAsICAgIDUzOCwKKyAgICAgICAgMTcsICAgIDExMywgICA0NzU4LCAgICAgIDEsICAgICAyOCwgICAgLTEwLCAgICAgODcsICAgICAyMiwKKyAgICAgICAgOTYsICAgIC0xNCwgICAgLTk5LCAgICAtNTYsICAgLTEzMCwgICAgICAwLCAgICAtNTUsICAgICA0NSwKKyAgICAgICAtNjMsICAtMjg0NSwgICAyNzUxLCAgICA0NjQsICAgIC0zMSwgICAgLTYyLCAgICAgNzYsICAgLTE1NCwKKyAgICAgICAgODgsICAgICA4MSwgICAgMTI1LCAgICAzNzMsICAgLTM0OCwgICAgNTg3LCAgIC0zMTQsICAgLTI3OCwKKyAgICAgICAtNTMsICAgMjAzOSwgICAtNTE2LCAgIDI0MzcsICAgIDE5MSwgICAtMjEyLCAgICAgODcsICAgICAtMiwKKyAgICAgICAxODEsICAgLTI0MiwgICAgMTE3LCAgICAgMjMsICAgIC02MywgICAgMzM0LCAgICAxNDUsICAgIDQ1NCwKKyAgICAgICAzNDMsICAgLTIzNSwgICAgIDkxLCAgICAgNjksICAgICAtOCwgICAgICAyLCAgIC0xMDYsICAgLTEwOCwKKyAgICAgICAgLTUsICAgIDEzNywgICAtMTY4LCAgLTc4MTgsICAgLTIzMSwgICAgIDI1LCAgICAgMzcsICAgICA3NSwKKyAgICAgIC0xMzgsICAgICA1NiwgICAgMTQyLCAgIC01OTYsICAgIDEzMCwgICAtMTE0LCAgIDMyOTMsICAgLTM2NiwKKyAgICAgICAyOTAsICAgIDE2MCwgICAgIC0yLCAgIC0yMTksICAgICA4MywgICAgODQzLCAgICAtMTgsICAgMTI4OSwKKyAgICAgIC0xNzcsICAgIDIyNiwgICAgNjY3LCAgICAyNTIsICAgLTY4MywgICAgODE2LCAgICAgMjYsICAgIDE1NywKKyAgICAgICAxNjgsICAgLTQ4NywgICAgLTQ5LCAgLTMyODIsICAgIDQzMiwgICAgMTg0LCAgIDEyMDcsICAgICAyMywKKyAgICAgICAxNjQsICAgIDU0NCwgICAgOTY1LCAgICAgLTEsICAgICA2MSwgICAtMTE4LCAgICAgOTIsICAgMTM1OSwKKyAgICAgICAgODksICAtMzIzNCwgICAgIDE1LCAgICA0OTYsICAgIDI0NCwgICAgMTc3LCAgIC02MTMsICAgLTE2MCwKKyAgICAgICAtMjMsICAgLTE5NSwgICAtMTExLCAgIC0zNzIsICAgLTExNSwgICAgMjc4LCAgICAgOTYsICAgICA3NywKKyAgICAgLTI1NjcsICAgICA0OSwgICAtNDIzLCAgIC00NjgsICAgICAxMywgICAtNDg0LCAgIDEzNDUsICAgLTI5OCwKKyAgICAgICAxOTQsICAgLTEyMywgICAtMjQ4LCAgIC0xMzksICAgIDczOCwgICAgMTAyLCAgIDExNTQsICAgLTMzNSwKKyAgICAgIDI2OTQsICAgMTMyNiwgICAgMjEzLCAgICA3NTgsICAgICAxNywgICAgMTU0LCAgICA2MDksICAgLTUxOCwKKyAgICAgIC0zNjcsICAgIDIwMSwgICAtMTQ0LCAgICAgNjEsICAgICA2NiwgICAyMjg4LCAgICAgNTAsICAgMjY4OCwKKyAgICAgICAtODcsICAgICA0NSwgICAgLTEzLCAgIC0xMDEsICAgIDEyNywgICAtMTkwLCAgICAtNDAsICAgLTI4NiwKKyAgICAgICAgIDYsICAgIDEyMSwgICAgIDMyLCAgICAgMzEsICAgIDExOSwgICAgLTg1LCAgICAgMjgsICAgICA5MywKKyAgICAgIDgxOTIsICAgIDI3MywgICAgMTY5LCAgICAgNDQsICAgICAzNywgICAgMjU1LCAgIC0yMjQsICAgIDIxOSwKKyAgICAgICAtMzQsICAgLTEyNywgICAtMTM0LCAgICAxNjUsICAgIDE2OSwgICAgMTI2LCAgIC0xODgsICAgIC01MiwKKyAgICAgICAgOTgsICAgICAxNSwgIC01ODIwLCAgIC0xOTMsICAgLTMzMSwgICAtMzk1LCAgICAgLTEsICAgICA0OSwKKyAgICAgIC0xODcsICAgICA1NSwgICAtMTIxLCAgIC0xOTYsICAgIDExNCwgICAgIDEwLCAgICAyNTgsICAgLTE0NSwKKyAgICAgICAtMTQsICAgLTM4NSwgICAgMTA1LCAgIC0xODcsICAgICA1OSwgICAgMzgzLCAgIDUzMjIsICAgIDE0NywKKyAgICAgIC0xMTAsICAgIC02OSwgICAgMzc4LCAgICAxMzgsICAgLTM1MiwgICAgLTY5LCAgICAgMTUsICAgLTI2NywKKyAgICAgICAgNzUsICAgIDE2MiwgICAgIC02LCAgIDMxNDgsICAgIDUxNSwgICAgMjMxLCAgICAtNzQsICAgLTQzNiwKKyAgICAgIDEyODgsICAgMTIzNCwgICAtMTA1LCAgICAgNjgsICAgIC05NiwgICAtMTY2LCAgICAtNDksICAgIC02NCwKKyAgICAgICAxNDQsICAgIC02NywgICAgMTM1LCAgICAyNTgsICAgIC03MSwgICAtMTYyLCAgICAxNTYsICAgLTM2NiwKKyAgICAgICAgLTcsICAgIC02NywgICAtMTMzLCAgICAtMjAsICAgLTExOSwgICAgIDcxLCAgICAtODQsICAgICAzMSwKKyAgICAgICAgMjYsICAgIDExNiwgIC0yMjM3LCAgICAyMTIsICAgICA0MywgICAgMzgwLCAgICAtNzQsICAgICAxMywKKyAgICAgICAgLTcsICAgIDc3NCwgIC0xMjc2LCAgIC0xMDMsICAgLTEyNCwgICAgLTQ4LCAgIC0xNzgsICAgLTMxOSwKKyAgICAgICAgMjYsICAgIDQzNSwgICAtMTExLCAgICA4NTgsICAgIDI5NSwgICAxNjAxLCAgLTI3MjcsICAgLTI0MiwKKyAgICAgICAgIDgsICAgICAzNiwgICAgLTYxLCAgICAtMjAsICAgIC0xOSwgICAgLTE5LCAgICAgMzEsICAgIDI1OCwKKyAgICAgICAgMjEsICAgIC0xNCwgICAgMzgxLCAgIC0xNTMsICAtODE5MiwgICAgLTk5LCAgICAzMjcsICAgICA3MiwKKyAgICAgICAxNzUsICAtMTE4MSwgICAtMjcxLCAgICAxMDQsICAgIC0zMCwgICAtMTM1LCAgIC0xNjksICAgICAyMSwKKyAgICAgICAgMjksICAgLTE4MiwgICAgLTI1LCAgICAxMjUsICAgIDE2NSwgICAgLTgyLCAgICAgNzMsICAgIC0yNiwKKyAgICAgIDIzMTEsICAgIC04NSwgIC0yOTgzLCAgIC0xMjUsICAgICA4NSwgICAtMjA2LCAgIC0xMDAsICAgLTEwMCwKKyAgICAgICAgMzYsICAgICAtMywgICAgLTc3LCAgIC0xODAsICAgICAzNSwgICAgICAwLCAgIC0xNzAsICAgIDEyMywKKyAgICAgICAxNjgsICAgLTMwMiwgICAgMzY2LCAgIC0zMzQsICAgMjkzNiwgICAgLTcwLCAgICA0MDQsICAtMjg3MCwKKyAgICAgICAgMTMsICAgICA3OSwgICAgMjI2LCAgIC0xNjMsICAgLTI0MiwgICAtMTI0LCAgICAtNDAsICAgLTE3MSwKKyAgICAgIC0xMDksICAgIDE4OSwgICAgIDIwLCAgICAtNTIsICAgIDE0NCwgIC0xODY5LCAgICAtODgsICAgIDIzMCwKKyAgICAgICAgLTgsICAgIC0yNywgICAgIDQ1LCAgICAxMzEsICAgIC0xMSwgICAtMTg4LCAgICAgOTMsICAgLTIyNywKKyAgICAgIC00NTIsICAgLTIyOSwgICAgMTU4LCAgICAzNzcsICAgICAtOSwgIC0xNzM2LCAgICAgMTYsICAgMzI2OCwKKyAgICAgIC0xNjQsICAgICA0MSwgICAgMzA1LCAgIC00MTQsICAgLTY0MiwgICAtMTExLCAgIC0xMDAsICAgIDExOCwKKyAgICAgIC0xNTUsICAgLTIzNiwgICAgOTM2LCAgIC0xMTQsICAgICA1MSwgICAgIDMxLCAgICAgNjAsICAgMTI5OSwKKyAgICAgICAgIDUsICAgMzA0OCwgICAgMjc0LCAgICAyNzMsICAgLTE5NywgICAtMjg5LCAgIC0yNDUsICAgLTI4OCwKKyAgICAgIDE5MjcsICAgICAtNywgICAgIDI3LCAgICAzMDcsICAgIDE3NCwgICAtMjQzLCAgICAtOTUsICAgLTEzNCwKKyAgICAgICAgMTQsICAgICAyNCwgICAtMTE5LCAgIC0xMzIsICAtMjgxMSwgICAtMjU0LCAgICAgMzUsICAgICA5NSwKKyAgICAgICAgMjIsICAgIDEzNSwgICAgIDIxLCAgIC0xNTUsICAgIC04MCwgICAtMTQzLCAgICAtNjAsICAgICAtNiwKKyAgICAgICAxODIsICAgICA3NywgICAgIDExLCAgIC0xOTcsICAgICAtOCwgIC02MDgwLCAgICAgMjgsICAgIDE1NSwKKyAgICAgICAgMTEsICAgIC0yNywgICAgIDIyLCAgICAtNDgsICAgICAtOCwgICAgLTUwLCAgIC0xMjIsICAgICAxMSwKKyAgICAgICAtMzQsICAgIDM0MiwgICAgIC0xLCAgICAgNDAsICAgLTIwOCwgICAgMTE3LCAgICAtMzUsICAgIC02OSwKKyAgICAgICAxNTAsICAtMzk0NCwgICAtNDI1LCAgICAgNDYsICAgIDQ1NiwgICAgMTgyLCAgIC00NTEsICAgLTIxOSwKKyAgICAgICAgMzgsICAgICAxNSwgICAtMjAzLCAgICA3NjYsICAgLTIzMiwgICAgMjQzLCAgICAtNzAsICAgIDE3OSwKKyAgICAgIDIxMDcsICAgLTIyMiwgICAgMzQ2LCAgIC0xNjYsICAgIDE0MywgICAgMjM5LCAgICAyNDUsICAgICA1OSwKKyAgICAgIC0xMzcsICAgICAxNywgICAgNDc1LCAgICAtNjgsICAgMjY3OSwgICAtNDIzLCAgICAgMjAsICAgLTMxMywKKyAgICAgICAgNzQsICAgIDE1MiwgICAgMTcxLCAgIC0yNjksICAgICA2OCwgICAgIDM5LCAgLTQ3NDMsICAgICA5NCwKKyAgICAgICAgLTMsICAgIDExMCwgICAgMTM0LCAgIC0xNjgsICAgICA3MywgICAgMTgwLCAgIC0xMTYsICAgIDI3NiwKKyAgICAgICAtNzQsICAgLTIwMywgICAgICAyLCAgICAtODMsICAgICAxNywgICAgMTcwLCAgICAgOTYsICAgIDE2OSwKKyAgICAgICAgNzUsICAtNTU0MSwgICAgIDQ2LCAgICAgMjAsICAgLTE2OCwgICAgLTIyLCAgICAgMzUsICAgIC03NCwKKyAgICAgICAxMDQsICAgLTE1MywgICAgMjY0LCAgICAgIDQsICAgIC01NywgICAgIDk0LCAgIC0xOTIsICAgIDE2MSwKKyAgICAgICAgMTUsICAgICAgNywgICAgIDQ1LCAgIC0xODYsICAgICAxNSwgICAtMTI1LCAgICAxMjEsICAtNDk4MSwKKyAgICAgIC0yNTQsICAgIDE3OSwgICAgMjgyLCAgICAgNzIsICAgIDU0MywgICAgLTk3LCAgICAzNjMsICAgICAtNSwKKyAgICAgICAtNjcsICAgLTM4OSwgICAgLTY2LCAgICAxNzgsICAgIDQyNywgICAtMjc2LCAgLTI2NzUsICAgIDQ0NywKKyAgICAgICAgLTIsICAgLTEyNSwgICAtMjIzLCAgIDI4NjksICAgLTUwMiwgICAgMTE3LCAgIDIwMTcsICAgIC03MSwKKyAgICAgICAgNDEsICAgICAgOSwgICAgMTI0LCAgICAgMTksICAgIDM1NywgICAtNTYyLCAgICAgMjUsICAgLTM4NSwKKyAgICAgICAgODAsICAgIC01MywgICAtMTc1LCAgIDI1MzIsICAgIC03MywgIC0yOTkwLCAgIC0xNjQsICAgICA1NywKKyAgICAgIC0xMjgsICAgLTI1NCwgICAgIDUzLCAgIC0xNTAsICAgLTE4MCwgICAgIDE2LCAgICAtNDUsICAgIDMyMiwKKyAgICAgICAyNjYsICAtMjQxOCwgICAtMjY0LCAgICAzMTcsICAgIDM3MSwgICAgICA1LCAgICAxOTcsICAgICAgNywKKyAgICAgLTI0NzYsICAgIC05MywgICAgMTUyLCAgICAgOTAsICAgLTE2NSwgICAgIDExLCAgIC0yNTksICAgIC0yNCwKKyAgICAgICAtNTUsICAgIC0xNiwgICAgIDk4LCAgLTQ5MDQsICAgLTExNiwgICAgIDUzLCAgICAyMDUsICAgIC00NSwKKyAgICAgICAtNTcsICAgIDExNiwgICAgIDc1LCAgICAxNjEsICAgIC01NSwgICAgIDk3LCAgIC0yOTIsICAgICAyNywKKyAgICAgLTEzOTYsICAgIDEwNSwgICAtMTI3LCAgICAxMzMsICAgLTI2NSwgICAgLTMzLCAgICAgIDUsICAtMzYyMiwKKyAgICAgICAgMjUsICAgICAtMywgICAtMTA0LCAgICAgIDgsICAgLTI4MywgICAtMjI5LCAgICAyMzYsICAgLTIwOCwKKyAgICAgICAxNDUsICAgIDYyNywgICAtMjQwLCAgICAxMTgsICAgIDI5NiwgICAgMTA4LCAgIC0zMDksICAgICA0OCwKKyAgICAgLTMzNDUsICAgIDU4MiwgICAgNDk4LCAgICAyNTksICAgICAyMCwgICAgNzg1LCAgIC0xMzgsICAgIDQyMSwKKyAgICAgICAgOTcsICAgIDM3MCwgICAgMTYxLCAgICAxNDEsICAtMjc5MywgICAgMTA2LCAgIC0yNDYsICAgLTE0MCwKKyAgICAgIC0xNzIsICAgICA0MiwgICAtMTk0LCAgIC0yMDIsICAgLTMxOSwgICAtMTA3LCAgICAtMjQsICAgIDQyMywKKyAgICAgIDcyOTMsICAgLTEwOSwgICAgLTEzLCAgIC0yNDIsICAgICA1NSwgICAgMTcxLCAgICAgMTMsICAgIC05MywKKyAgICAgICAxMzEsICAgLTE0MSwgICAgIDg4LCAgICAxMzIsICAgICA3NiwgICAgMTc2LCAgICAgNzgsICAgIDE1MywKKyAgICAgICAtNjMsICAgIC01NSwgICAtNDEwLCAgICAtMzksICAgICAgNiwgICAgIDI3LCAgIC0yMjMsICAgLTE3NCwKKyAgICAgICAgNjEsICAgIDY0NSwgICAgMTY3LCAgICAtMzUsICAgMzA3OSwgICAtMTczLCAgICA5NTAsICAgICAgMSwKKyAgICAgIC0xMDksICAgLTExOCwgICAtMTA2LCAgICAgMTUsICAtMTM0NSwgICAgLTE0LCAgICAgNTAsICAgIC03MCwKKyAgICAgICAtNjksICAgICAyNCwgICAgMTA5LCAgICAxODIsICAgICA4NCwgICAgIDMxLCAgIC0xNzksICAgIC05MywKKyAgICAgLTMxNTIsICAtMzAxMywgICAgLTYwLCAgICAgNTYsICAgIC02MCwgICAgIDU4LCAgICAxNjYsICAgLTE2MSwKKyAgICAgICAgMjQsICAgIDEyOSwgICAgICAxLCAgICAxODEsICAgIDEyOCwgICAgLTEyLCAgICAyNzMsICAgIC00MywKKyAgICAgLTEyNTYsICAgIDEzNCwgICAgMTU5LCAgICAtMzYsICAgIDE3NSwgICAgIDQzLCAgICAtNDksICAgICA0MSwKKyAgICAgICAgNDgsICAgIC0zOCwgICAgLTQ1LCAgICAgNTksICAgIC0zNiwgICAgLTgyLCAgICAgNDgsICAgIC03NCwKKyAgICAgIC0xMDQsICAgMjk0NCwgICAtMTI0LCAgICAtMjQsICAgICA5OCwgICAgMjQ4LCAgIC0xNDYsICAgLTIzMSwKKyAgICAgIC0yNDEsICAgICA3MiwgICAtMTE0LCAgICA3NzYsICAgLTQ5OCwgICAgMjQyLCAgIC0zNTcsICAgIDI1MCwKKyAgICAgIC0xMDIsICAgNzEyMSwgICAgMTA5LCAgICAgMTEsICAgICA5NCwgICAgLTUzLCAgICAgMzcsICAgIC0zNywKKyAgICAgIC0xMzMsICAgICAyNCwgICAtMTU3LCAgICAgNDcsICAgIC00NiwgICAgLTY5LCAgICAgNjIsICAgIC03OSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMTYxNnNzMFtdID0geworICAgICAgMTQwMSwgICAgMzczLCAgIC01MTYsICAgIDMzMCwgICAtNzExLCAgIC03NTIsICAgLTQ3NSwgICAtMjI0LAorICAgICAgIDEzOSwgICAgNDkyLCAgIC01NTYsICAgNDYyOSwgICAxMDM5LCAgICAzMzMsICAgIDg3MiwgICAtNTQyLAorICAgICAgIDQ3NCwgICAtMzYwLCAgIC0zNzgsICAtMzQ1OSwgICAgMjU0LCAgIDExOTksICAgIDExMywgICAtNTI1LAorICAgICAtMTcwNSwgICAgMjMxLCAgICAgNDYsICAgIDE4OCwgICAgLTUwLCAgLTEwMzgsICAgICAzMiwgICAtMTk4LAorICAgICAgLTEwOSwgICAgNjE5LCAgIDEwNzEsICAtMTYwMSwgICAxMDAyLCAgIC00MTEsICAgLTE4OSwgIC0zMjc2LAorICAgICAgIDYxNSwgICAtNDY4LCAgIC00NjcsICAgLTI3NSwgIC0xMjg2LCAgICA3MzYsICAgIDU0MSwgIC0xMTA3LAorICAgICAgIDQyMywgICAgMTkxLCAgICA0MzksICAgLTIwNSwgICAgIDE3LCAgICAtODcsICAgIDUwMCwgICAgMTc2LAorICAgICAgIDI2MiwgICAtMzQxLCAgIC0xNDIsICAgIDI2OCwgICA4MTY0LCAgICAgLTIsICAgIDExMiwgICAtMTkwLAorICAgICAgIDIyNywgICAgLTUwLCAgIC0xNDMsICAgLTMyNiwgICAgNjQ3LCAgICA2MDEsICAgIDQ4MiwgICAgNDQzLAorICAgICAgMjc2MSwgICAtNDk3LCAgICA5NzksICAgLTI5OCwgICAgNDU0LCAgLTI5MjcsICAgIDc0NiwgICAtNzM1LAorICAgICAgMzkyMSwgICAgNDgwLCAgIC0xNjcsICAgLTMxNywgICAxMzAzLCAgICAxMTEsICAgIDIxNiwgICAtOTYxLAorICAgICAgIDExMCwgICAtNTk1LCAgICAyNDQsICAgIDI0NiwgICAtMjIyLCAgIC0yMDUsICAgICA0NiwgICAgIDYxLAorICAgICAgLTc5OCwgICAgMjU4LCAgICAzNjAsICAtNzAzOCwgICAtNjU0LCAgICAtOTUsICAgICA3NSwgICAgNDk4LAorICAgICAgIC0yNCwgICAtMjUwLCAgICAgNzEsICAgIDEzOCwgICAgNTI3LCAgICAyNDAsICAgLTIxNSwgICAgMjUwLAorICAgICAgLTQwOCwgICAgNTUyLCAgIC0zMjUsICAgIDMzMywgICAtOTg5LCAgIDI2NDgsICAgLTQ4MywgIC0xMTIxLAorICAgICAgMjM0NCwgIC0xNjQ3LCAgIC0xMTYsICAgLTkwMSwgICAgNjE1LCAgICAzMjcsICAgICAgMSwgICAgNDk3LAorICAgICAgIDQxMSwgICAtMTM4LCAgICAzMzIsICAgIDI4MSwgICAtMTQ1LCAgICAzMzcsICAgIDE2MywgIC03Mzc5LAorICAgICAgICA3MCwgICAgMjY1LCAgICAzNjUsICAgIDIzOCwgICAgNjA0LCAgICAgOTksICAgLTE0OSwgICAgMjMzLAorICAgICAgIDEwOSwgICAgODI3LCAgIC03MDQsICAgMTM2NywgICAxMjA4LCAgIC03MTcsICAgIC0xNywgICAtMjIzLAorICAgICAgICAxNSwgIC0zMjU5LCAgICAgNTMsICAgLTQ4NSwgICAtNjMxLCAgICAyODUsICAgIDUxMSwgICAgIC04LAorICAgICAgIDI0MiwgICAgNTQ3LCAgICAxMjksICAgIDE0NSwgICAyMDQ2LCAgICA1MjAsICAgICA0NCwgICAtMTc3LAorICAgICAgIDM4MiwgICAgMjgzLCAgIC0xNjksICAgLTM0NiwgIC0yNzM3LCAgICAyOTQsICAtMTMxMSwgICAgMTQ1LAorICAgICAgMTg3MywgICAgODE1LCAgIDEwNzgsICAgIDY3NywgIC0zNDE5LCAgIC00MzQsICAgIDQ4NCwgICAgMTQ0LAorICAgICAgIC0yNywgICAgNjY5LCAgICAxNTMsICAgLTI0MiwgICAtMjQyLCAgICA4MTQsICAgIDM1MCwgICAgMzYxLAorICAgICAgLTQ2MiwgICAgLTYzLCAgIDIzMTcsICAgMTI1OSwgICAtMzczLCAgIC00ODksICAgLTUzNCwgICAgMzAwLAorICAgICAgIDg2NywgICAyNjIxLCAgIC0xMTcsICAgLTE2OCwgICAtNDE0LCAgIC0yMzksICAgIDgxMiwgICAgODQwLAorICAgICAgIDExMiwgICAtNDYzLCAgLTYyODYsICAgLTY5MywgICAtODMwLCAgICAxNDAsICAgLTE2OCwgICAgNDQ4LAorICAgICAgIDU0OSwgICAtMTQ5LCAgICA0MTgsICAgLTEwNSwgICAgMTM3LCAgICAgMzEsICAgIC00MCwgICAgLTQzLAorICAgICAgIDQyMiwgICAgLTk5LCAgICAyOTcsICAgICAgMywgICAtMjIwLCAgICAtMTUsICAgICA4MSwgICAgIDQ1LAorICAgICAgLTY0NywgICAtNTM1LCAgIC00NDgsICAgLTczMSwgICAgMjUwLCAgLTY3NDIsICAgLTMyMCwgICAtMzUwLAorICAgICAgLTE5MiwgICAxNTQwLCAgLTExMTIsICAtMTA0MywgICAxMzE3LCAgLTEyMDMsICAgMTAzNSwgICAtNTA2LAorICAgICAgIDY3MywgICAgNzIxLCAgICA4NTQsICAtMTQ4NywgICAgNzgwLCAgIC0yOTQsICAgMTE3MywgICAyMTQyLAorICAgICAtODE5MiwgICAtMTcwLCAgIC0xMzgsICAgIC01NCwgICAgLTU0LCAgIC0yMzMsICAgLTEyNywgICAgMTQ1LAorICAgICAgLTIzMywgICAtMTg1LCAgICAgODcsICAgICAyMCwgICAgNTMwLCAgIC0zMDUsICAgIDE0MSwgICAtMzk0LAorICAgICAgIDMxMCwgICAgIDQwLCAgICA2NDUsICAgIDgwOSwgICA0ODAxLCAgIC0xODYsICAgLTQzMiwgICAtNDUxLAorICAgICAgIDMxMiwgICAtMTQ0LCAgICAtNjUsICAgICA2NSwgICAgMTM1LCAgICAtNjQsICAgIC0xNSwgICAtMzU3LAorICAgICAtMzU0NiwgIC0xMjk5LCAgICAyMTYsICAgIDI0OSwgICAgMjYxLCAgIC0yMDcsICAgIDExNywgIC0zMTM4LAorICAgICAgIDUyNywgICAgIDE0LCAgIC0xNDIsICAgIDI4NiwgICAgMTAwLCAgICAzNDAsICAgIDU4MSwgICAgMTU3LAorICAgICAgIDIzNCwgICAgNzM5LCAgLTI1MjEsICAgICAtMywgICAgNjM5LCAgLTE0NDAsICAgIDEzMSwgIC0zNzk2LAorICAgICAgIDE1OSwgICAgIDM5LCAgICAgNDEsICAgLTY1OSwgICAgMjg0LCAgICAxNjUsICAgMTEwMCwgICAtMzQ2LAorICAgICAgLTQ4MSwgICAgMjk1LCAgICA4MDYsICAgLTIyNywgICAtMjg4LCAgIDQ1MjAsICAgIDI1MywgICAgNDg3LAorICAgICAgLTI1MiwgICAgIDg4LCAgICAtNDMsICAtMTYxMiwgICAgIC01LCAgICAtNTcsICAgIC02NiwgICAgIDE4LAorICAgICAgICAxOSwgICAgNTU3LCAgIC0zMzcsICAgMTUyNiwgIC0yODk3LCAgICAxNDQsICAgIDg0NCwgICAtNDA0LAorICAgICAgMTk3NiwgICAgNzg3LCAgICAyNDYsICAgIDI2NCwgICAtNDA2LCAgICA3NzgsICAgLTkxOCwgICAgIDUxLAorICAgICAgLTExMywgICAtMjM1LCAgICA1MTgsICAgIDYwMiwgICAtMzA3LCAgLTIwNDYsICAgLTY5MiwgICAyNzc1LAorICAgICAgIDQwMCwgIC0yMTY1LCAgIC0xODQsICAgIDEzOSwgICAgNDAzLCAgLTE4NTUsICAtMTMxNywgICAgMjg5LAorICAgICAgIDcxMCwgICAxMTI0LCAgIDE4ODgsICAgLTUxNywgICAgMjc2LCAgICAxOTAsICAgIDYzNywgICAtNDQxLAorICAgICAgIDcxNywgICAgOTcyLCAgIC0zNzAsICAgIDQ3OCwgICAgNjI2LCAgIC0zNTQsICAgIDI0MSwgIC0zNjUxLAorICAgICAgIDE0NSwgICAgICA3LCAgIC03MzgsICAgIDM5NywgICAgOTkxLCAgIC0zNDMsICAgLTgyNiwgICAgMTQyLAorICAgICAgIDY3MiwgICAyNDI1LCAgIC02MTYsICAtMzI3OCwgICAgNzUxLCAgIC0xOTMsICAgLTk0NCwgICAgLTM1LAorICAgICAtMTA2MSwgICAxMjU4LCAgICA2MzEsICAgLTcyMSwgICAgMTQ1LCAgIC0xMTIsICAgIC02OSwgICAgODI4LAorICAgICAgIC0zOSwgICAtMTk2LCAgIC0yMzcsICAgIC03MywgICAgNzcxLCAgIC0xOTUsICAgIDIzOSwgICAtNTMzLAorICAgICAtMTY3MywgICAzNDc3LCAgIC01NTksICAgIDEwNCwgICAtNjQ3LCAgIC03OTgsICAgIDE2NywgICAtNDk3LAorICAgICAgLTU1OSwgICAgNTkxLCAgICAyNTksICAgIDMwMCwgICAgLTI1LCAgICA0MjIsICAgICA5MywgICAgIDM5LAorICAgICAgIC02MywgICAgMjMzLCAgICAxNDQsICAtMTE3MCwgICAgMTQyLCAgIC00NTYsICAgICA3MywgICAgNDExLAorICAgICAgNjkyMCwgICAtMzM4LCAgIC0zMDcsICAgIDQzNiwgICAgMTQzLCAgICA0MjAsICAgIDE1MiwgICAgIC05LAorICAgICAtMTc4OCwgIC0xMDk2LCAgLTI5OTgsICAgLTcyNywgICAtNTI0LCAgICAxMjgsICAgIDQ2MCwgICAgNzgyLAorICAgICAgLTEwMiwgICAtNTc2LCAgIC0xMzgsICAgLTk3NiwgICAxMDM1LCAgLTMxOTYsICAgLTQzNiwgICAgLTI3LAorICAgICAtMTA0NywgIC0xMzg5LCAgIDMyNDQsICAgLTE0MywgICAtODgzLCAgLTEwMTIsICAgICAgNCwgICAgMzI3LAorICAgICAgICAxNiwgICAgNDExLCAgIC00OTcsICAgMTQ0NCwgICAgNTE2LCAgIDExODMsICAgIDI1MiwgICAgNTEwLAorICAgICAgLTY5OCwgICAtNjc2LCAgICA1NjksICAgIC03MCwgICAtMzk3LCAgIC0yMjcsICAgNzgyOSwgICAgMzEyLAorICAgICAgLTQxMCwgICAgIDIwLCAgICAgNDEsICAgIC02NSwgICAtMjE5LCAgICAxNzUsICAgIDI5NywgICAgIDQwLAorICAgICAtMTUzNCwgICAtNDk4LCAgICAxOTQsICAgIDg3MSwgICAgNDA5LCAgICAyODAsICAgMTA5OCwgIC0xNDcxLAorICAgICAtMjgyNSwgICAgOTMxLCAgIC0xMDUsICAgLTU0NSwgICAtODAxLCAgIC03OTUsICAgLTM3MiwgICAgIDczLAorICAgICAgIDMzMSwgICAgMTAwLCAgICA0ODgsICAtMjEwMSwgICAgNTYwLCAgICAgNDQsICAgIDg4NSwgICAxMDY1LAorICAgICAgIDM4MCwgICAtMTk1LCAgICAyNzYsICAgIDEyNCwgICAgLTg3LCAgICAxOTMsICAgMzk3OSwgICAgIDMwLAorICAgICAgICA5NSwgICAtNTA5LCAgIC05MzEsICAgMjczNywgICAtNDU3LCAgICA4MDUsICAgICAxMCwgICAgIDUzLAorICAgICAgIC03MywgICAtMjAzLCAgIC01ODcsICAgLTE3NywgICAgMjQyLCAgICAyMzgsICAgIDY1NiwgIC0zNDAzLAorICAgICAgLTM4MCwgICAyMzY0LCAgIDI5MDIsICAgLTIyNiwgICAgMjA0LCAgIDE1NTksICAtMjIxOSwgICAgLTQwLAorICAgICAgLTQ0MiwgICAgMTExLCAgIC03MDMsICAgLTQyNCwgICAtMjUyLCAgIC0yNDEsICAgIDQ2MSwgICAgNzQ5LAorICAgICAgIDY1OCwgICAtNDgxLCAgICAxMjUsICAgLTM2NiwgICAgNjAxLCAgIC0yNDYsICAgLTI4NiwgICAgMTMyLAorICAgICAgIDI5NywgICAtMjMyLCAgIDUyMzEsICAgLTE0MSwgICAgMTk2LCAgIC0xMjEsICAgLTIzNSwgICAgNDA2LAorICAgICAgLTE5OSwgICAtMTc0LCAgICAgODcsICAgLTEwNywgICAgMzYzLCAgICAyNzIsICAgLTU2MywgICAtNjIwLAorICAgICAgIDIzNSwgICAgMjIzLCAgIC02MjcsICAgLTMzOSwgICAtNDY3LCAgICAzNDksICAtMTU5NiwgIC01NDk2LAorICAgICAgIDY0NCwgICAgLTk2LCAgICAtODEsICAgMTkzOCwgICAgNzQ5LCAgIC0xNjAsICAtMTk3NiwgIC0xNDM2LAorICAgICAtMTA1NiwgIC0xMDQ1LCAgLTEwOTgsICAgMjMyNywgICAgOTc2LCAgICAtNTcsICAgLTEyNCwgICAxMTM5LAorICAgICAgIDI3NSwgICAtMjA5LCAgIC02MzYsICAgIDI5OCwgICAyNDg0LCAgIDI3NjQsICAgIDk2MiwgICAgLTM5LAorICAgICAgIDEwOCwgICAtNzE4LCAgIC00NDIsICAgICAgOSwgICAgNzk3LCAgIDExMjMsICAgMTA5MiwgICAxMTc5LAorICAgICAtMTE3MCwgICAtNzAxLCAgIC0zODEsICAgLTIzNywgIC0xMjY2LCAgLTEwNDUsICAgLTMzNywgICAtMzUxLAorICAgICAgLTI3NCwgICAtOTgxLCAgIC0yNzIsICAgLTExMSwgIC0zNDA5LCAgIC0zODcsICAgIDQyMSwgICAtNDA2LAorICAgICAtMjEyMywgICAgNjIzLCAgICAtMTgsICAgMjQ3MywgICAgNjE3LCAgICAxNzYsICAgICAyNiwgICAxNDAyLAorICAgICAtMTM1MSwgICAgMjEyLCAgICAgMjMsICAgLTE3MiwgICAgMjk2LCAgIDE1NzIsICAgIC02MywgICAtNDAyLAorICAgICAgIDgzNywgICAtNTIxLCAgIDIyMDksICAgLTYxMywgICAtMzI5LCAgIC0zMDksICAgLTE4MCwgIC0xMTUyLAorICAgICAgLTUzNSwgIC0xMzgwLCAgLTI2MTcsICAgIDQ3NSwgICAgMzg1LCAgIC02NzIsICAgIDE4MiwgICAgIDkyLAorICAgICAtMjIxMSwgICAgMzIwLCAgICAxMDksICAgLTYzMywgICAtNTgyLCAgIDEyMDgsICAtMTUzNiwgICAxMDA5LAorICAgICAgIDg5NiwgICAxOTkxLCAgIC0zNzQsICAgMTc1MCwgIC0xMjU5LCAgIC0zNDEsICAgMTc3NCwgICAxMDYzLAorICAgICAgIDY3OCwgIC0yMDg0LCAgICA5ODcsICAgLTMzNywgICAgIDQ4LCAgIC0yMDUsICAgIC04MiwgICAtMjg4LAorICAgICAgIDM4OCwgICAgMjE3LCAgIDEyNjMsICAgMjQyNywgIC0xNDcyLCAgLTEwNzMsICAgLTk2NCwgICAtODM2LAorICAgICAgMjA4NiwgICAtMTYxLCAgICA0MzgsICAgLTQ0OSwgICAgLTM3LCAgIC05MjYsICAtMzcwNiwgICAgMTY0LAorICAgICAgLTM3MiwgICAtNjE2LCAgICAxNjAsICAgLTU3MiwgICAtNzI1LCAgICA3MjcsICAgICAxMSwgICAgIDUzLAorICAgICAgIC04NCwgICA3NDk0LCAgICAtNzQsICAgIDUyMywgICAtMTcyLCAgICA0NjQsICAgIDQ1MiwgICAtNDI2LAorICAgICAgIDgwMywgICAgMTA2LCAgIC0yNjIsICAgICAzMiwgICAgMjk4LCAgIC00OTEsICAgLTE4MSwgICAtNzYwLAorICAgICAgLTkwOCwgICAgMzAzLCAgICA3NDcsICAgMTMxNiwgICAgMjcyLCAgICA5MDYsICAgIDc2NywgICAgMTA1LAorICAgICAgIDI0NywgICA2MTIwLCAgICA5NDgsICAgLTU1NywgICAtOTI4LCAgIC01OTUsICAgLTM0MiwgICAtNDUwLAorICAgICAgIDY4NiwgICAtODE1LCAgLTEyNDMsICAgLTE1NywgICAgNTcyLCAgIDE0MTQsICAgIDE2NiwgICAtMjI5LAorICAgICAgMzMxNywgICAxOTQwLCAgIC0yODMsICAgIDYyMywgICAtNzgxLCAgICA3MTcsICAgLTIxMiwgICAtNzA3LAorICAgICAgICAzMCwgICAzNjM1LCAgIDExNDcsICAgLTY5NiwgICAtOTI4LCAgIC02MzcsICAgIDkyNSwgICAgNzk3LAorICAgICAgIDg0MywgIC0xMzU5LCAgICAyMTQsICAgMTA5NiwgICAxMDMxLCAgICA4NTIsICAgIC04NCwgICAtMjI4LAorICAgICAgIC0zNCwgICAxMDY3LCAgLTExMDksICAgIDM5MiwgICAgMjkyLCAgIC03NTUsICAgMzQ5NSwgICAgLTQwLAorICAgICAtMTgwNiwgICAtNjM3LCAgIC0yMzYsICAgLTYwMiwgICAtMjY0LCAgIC0xNDcsICAgIC02OCwgICAtMjMzLAorICAgICAgIC01NSwgIC0yMDA1LCAgIC0yNzEsICAgLTY0NywgICAgOTYzLCAgICAzMDksICAgICAtNSwgICAgIDU2LAorICAgICAgLTI3NSwgICAtMzk4LCAgICAgMzQsICAgLTQ5NiwgICAyNTU2LCAgIDEyNDksICAgIC04NywgICAtMTEyLAorICAgICAgMTY2MywgICAtNTU0LCAgLTE5MjYsICAgIDYyNywgICAyNTE1LCAgLTExMjgsICAgLTU2NiwgICAxNTM5LAorICAgICAgIDc0MCwgICAgIDM4LCAgIC02MTQsICAgIDI3MiwgICAtMjMyLCAgIC0xNTIsICAgLTc4MiwgICAtNDIwLAorICAgICAgLTMwNCwgIC0yMzEzLCAgICAtMzMsICAgLTk0NCwgICAgLTc3LCAgLTM0NjgsICAgIC02OSwgIC0xNzMwLAorICAgICAgIC0yMSwgICAgNjY1LCAgIC0zMTQsICAtMTY0MCwgICAgNjYwLCAgICA2NjEsICAgIDEwNiwgICAgLTIxLAorICAgICAtMTUwNSwgIC0yODg4LCAgIC00MjcsICAgLTg2NiwgICAtNjY2LCAgIDMxMjgsICAgIDc4NiwgICAgLTU1LAorICAgICAgIDczOSwgICAgMTEyLCAgICAgIDgsICAgIDU2NywgICAtNjAyLCAgIC0zNTAsICAgIDE2NSwgICAgMTA4LAorICAgICAgIDc2NywgICAgIDY0LCAgIC03MTUsICAgIDk4MCwgICAgNjczLCAgIC0xODYsICAgIDc2OCwgICAtNTQ1LAorICAgICAgLTI5OCwgICAtMjMzLCAgIC01MjQsICAgIC03MCwgICAgNTExLCAgLTIwNTEsICAgMzgxNiwgIC0xMTA0LAorICAgICAgIDUyOSwgICAxMDEyLCAgIDI1NzcsICAgIDc3NywgICAgMzQyLCAgIC0zODcsICAgMjczMCwgICAgMjQ3LAorICAgICAgIC0yMCwgICAtMjI3LCAgIC00MzIsICAgLTI2MywgICAtODg1LCAgLTExOTIsICAgLTY0NCwgICAtMjU5LAorICAgICAgMjMxNCwgICAgIDM4LCAgICAxMDgsICAgIDYxNCwgICAtMzg2LCAgICA0NzAsICAgIC03OCwgICAgNjgxLAorICAgICAtMzMzNCwgIC0xMDQ5LCAgIC0zMDAsICAgIDE3NywgICAtMTc0LCAgIC00MjIsICAgIDExMCwgICAtNjQxLAorICAgICAgLTQwNiwgICAtNDcyLCAgICA0NjgsICAgIDg4NSwgICAtNzMwLCAgIC04NzcsICAtMTk3MiwgIC0xMzcyLAorICAgICAgLTQxMCwgICAgNTQ1LCAgICA1NDMsICAgLTgwMCwgIC0xMTU2LCAgICAyNzksICAgMzI5MCwgIC0xMzA1LAorICAgICAgLTIxMywgICAtMjYyLCAgIC04MzIsICAgLTk5NCwgIC0xMTEwLCAgICA3MTgsICAgLTM2NCwgICAxNDE2LAorICAgICAgICAtNywgICAgOTYzLCAgICA0NTIsICAgIDY4MCwgICAgMTY1LCAgLTM4MTUsICAgIDkwMywgICAgODA2LAorICAgICAgIDE0OSwgICAgIDExLCAgLTEzMzIsICAgLTYyMiwgICAtNDUxLCAgICAxNTIsICAgLTYxOCwgICAtMzA5LAorICAgICAgIDI0NiwgICAgNDM1LCAgLTIwOTgsICAgIDQ4NywgICAgNDY5LCAgIC00NTEsICAtMTU3NCwgICAtMjA0LAorICAgICAgLTE4NywgICAgNTUyLCAgIC0zMzMsICAgIDUxNSwgICAtMzMxLCAgIDE0NTIsICAgIDI3OCwgIC0yNjkxLAorICAgICAgLTE0NiwgICAxMDA5LCAgICAzNTMsICAgLTgzOSwgICAgICA2LCAgLTMyMDYsICAtMTA4MCwgICAtNTcyLAorICAgICAtMjY5OCwgICAgNzUyLCAgLTE3MjYsICAgLTMxOCwgICAgMzk3LCAgIC0xNTIsICAgLTEyOCwgICAgLTc3LAorICAgICAgIC0zNiwgICAtNTA2LCAgICA0NTYsICAgMTA5NCwgICAgMjgxLCAgIC0xNTgsICAgIC0xOSwgICAtMTQ5LAorICAgICAgICA0OCwgIC0yODMxLCAgIDIwNDIsICAgMjU0NSwgICAtMTYxLCAgICA2MTksICAgMTEyOSwgICAgMjc0LAorICAgICAgICAyNCwgICAgICAxLCAgICAzMTMsICAgLTE2NCwgICAgNjU1LCAgICAxNTcsICAgIDc3MCwgICAgMTgyLAorICAgICAgMTk0MiwgICAgMjQxLCAgIC04OTgsICAtMTc0OCwgICAtNTg5LCAgICAyNTYsICAgIDMyMiwgICAgNjgzLAorICAgICAgIC02NSwgICAgLTczLCAgICA2MjEsICAgICA3NCwgICAtMzE3LCAgIDI1ODUsICAgIDE4NSwgICAtNDY1LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IxNjE2c3MxW10gPSB7CisgICAgIC0zMjE4LCAgIC02MDcsICAgMTY2NSwgICAxMTAwLCAgIC01NjMsICAgIDQyMSwgICAgMzc3LCAgICA0NDUsCisgICAgICAtMjcwLCAgICAgLTMsICAtMTUwMywgICAgMjI0LCAgIC01OTMsICAgLTMxNiwgICAgIDMxLCAgICAzNjIsCisgICAgICAxMTg2LCAgICAzODksICAtMTgxNywgICAgNTg5LCAgLTI4NDIsICAgIDI4OSwgIC0xOTI1LCAgIC0zNTYsCisgICAgICAtMjI4LCAgIC0xNDgsICAgIDYxOCwgICAgMTM1LCAgICAzNTgsICAgIDIzOCwgICAgICAxLCAgIC03NjcsCisgICAgICAtMjY2LCAgICAgIDEsICAgIDEwMSwgICAgMjQ1LCAgICAyMzEsICAgLTE2NywgICAgNDA4LCAgICAgIDEsCisgICAgICAgMTYyLCAgICAtMzUsICAgIDI0MSwgICAgMjE1LCAgLTQ3MDIsICAgIDQ4NiwgICAgNTQ2LCAgIC0zMzksCisgICAgICAgMzQ5LCAgIC0yOTIsICAgMTM0MiwgICAtODgxLCAgICAxODQsICAgLTY3NSwgICAyNjM5LCAgIC0yODQsCisgICAgICAtOTk1LCAgICAzNDYsICAgLTQ5OSwgICAxNDk5LCAgIDE2MTYsICAgIDU3OCwgICAgNDQ1LCAgICAtNzgsCisgICAgICAgODQ0LCAgIDE4MDAsICAgLTY4NiwgICAtNDE0LCAgLTE0MjUsICAgIDc5NSwgICAgNzU0LCAgLTE0MTgsCisgICAgICAtMTc4LCAgLTIyMjYsICAgIDUxNSwgICAtMTQzLCAgICAgNDMsICAgIDU2OSwgICAgOTY3LCAgLTIzMzMsCisgICAgIC0xOTkxLCAgICAyODIsICAgIDUyOCwgICAxNDEwLCAgIC0zNzcsICAgIDczNiwgICAgMzk0LCAgIC0yMzAsCisgICAgICAtMzY1LCAgIC0yNDIsICAgMjc3MywgICAgMTM2LCAgIC03MzgsICAgIC0zNiwgIC0xMTcxLCAgICAtNzYsCisgICAgICAtMTMyLCAgIC0zMDAsICAgLTIyMywgICAtNjgwLCAgIC00MTYsICAtMjczOCwgICAgIDkzLCAgICA0MTQsCisgICAgICAgNDkwLCAgIC0zNDYsICAgICA3NSwgIC0xMDg5LCAgLTExMzIsICAgMjIzNywgICAxODQ0LCAgICAzOTUsCisgICAgICAgMzI1LCAgLTE1MTQsICAgMTkxMywgIC0xODUwLCAgIDExNjIsICAgLTQ0MiwgICAgNjg5LCAgICAtNjYsCisgICAgICAgLTcxLCAgICAtODMsICAgIDM0MiwgICAtMTk3LCAgIC05NDAsICAgIDIwNiwgIC0zMzgxLCAgLTEyNzUsCisgICAgICAtNDIzLCAgICAtODcsICAgLTQ1NSwgICAgNDk4LCAgICA4NjUsICAgIDM1NSwgICAxMjI1LCAgIC0xMTUsCisgICAgIC0zMzMzLCAgIC00MDQsICAgLTU4OCwgICAxMDIxLCAgLTIxODAsICAtMTQ3MCwgICAxMjI1LCAgICA3MjgsCisgICAgICAgIDU5LCAgIDI1OTIsICAgLTMzNSwgICAgMTk0LCAgIC02NDksICAgMzU4NiwgICAtOTUxLCAgIC0xNDIsCisgICAgICAtOTQ3LCAgICA4OTgsICAgIC05OSwgICAtMjY5LCAgICA5NzcsICAgMTUyMCwgICAgNDg4LCAgIC0zNjQsCisgICAgICAtMjUzLCAgICAxMjcsICAgMjUyNCwgICAgODQ5LCAgLTExNjYsICAgLTE5MSwgICAgNjI3LCAgICAzNzIsCisgICAgICAgNzcyLCAgICAxNDUsICAgIC0yMSwgICAgMjc5LCAgICA0MDIsICAgLTg2MywgIC0yNjk1LCAgIDEyMTcsCisgICAgICAxNTQzLCAgIDEwMDUsICAtMTQxOSwgICAxNzEyLCAgICAxMTAsICAtMjE5MSwgICAgOTY5LCAgIDE1NjMsCisgICAgICAgMTgzLCAgICA4MTEsICAgLTIxOCwgIC0xMDc4LCAgIC0yMjAsICAtMTA5MiwgICAtMzIyLCAgICA4MDMsCisgICAgICAtNTMzLCAgIC0zNTksICAgIDQwNSwgICAgLTcwLCAgIC03NzEsICAgLTI2NywgIC00NzMwLCAgICAyMzUsCisgICAgICAtNjA3LCAgIC0zODcsICAgLTI4NSwgICAgLTY4LCAgICAgNDgsICAgIC02MCwgICAtMjIyLCAgICAyMjksCisgICAgIC0xMDg3LCAgLTEyNjEsICAtMjI0OSwgICAxMjY1LCAgLTE2MjQsICAgIDg2NCwgICAgLTY1LCAgICAyMjMsCisgICAgICAtMzIyLCAgICAzMzcsICAgLTI2MiwgIC0zMTcwLCAgICAtMTIsICAgNDU3MSwgICAgIDE5LCAgICAxOTgsCisgICAgICAgNDU4LCAgLTEwMjksICAgMjU2MCwgICAgIC0zLCAgIC0xMTUsICAgIDYxOSwgICAtNjQ1LCAgIC04MzYsCisgICAgICAtMzk5LCAgICAyNDYsICAgIC04MSwgICAgLTEyLCAgLTEwNTcsICAtMjExOSwgICAyNzgwLCAgICAgMjUsCisgICAgIC0xNTU5LCAgICAyOTEsICAgIDU5MiwgICAtNTEzLCAgICAgNjIsICAgIDE1NywgICAgNTUzLCAgICA1NzAsCisgICAgICAtNjU3LCAgICAgNzIsICAgLTExOCwgICAtMjg0LCAgIC00NTQsICAgMzg1MywgICAgMTQ1LCAgICAyNTksCisgICAgIC0xNzA5LCAgLTIxNjEsICAtMzE2NywgICAgMTg5LCAgIC0yMzMsICAtMTA5OSwgICAgMTQxLCAgICAxMTQsCisgICAgICAtNTA2LCAgLTEwMTIsICAgLTc3NSwgICAgNDc0LCAgICAzMzEsICAgIDc5OCwgICAgNDY5LCAgIDE5MTUsCisgICAgICAgIDk2LCAgIC0yNjYsICAgLTM4NSwgICAtMzI5LCAgIC02NTgsICAgIDE5MiwgICAgIDE2LCAgICAgOTcsCisgICAgICAgLTQ3LCAgICAyODQsICAgLTE2MywgICAgMjAwLCAgICAxODksICAgICAxOCwgIC03NDUzLCAgICAxNjAsCisgICAgIC0yOTg4LCAgIDI3MjUsICAgIDUyMCwgICAtMTMyLCAgIDI1OTMsICAgIDYyNywgICAtNjk0LCAgICAtMjYsCisgICAgICAtNTU4LCAgICAgNDQsICAgLTIwOSwgICAgIDQwLCAgICAzNzcsICAgIDQ5MSwgICAgLTY4LCAgICAzODQsCisgICAgICAgMjcxLCAgIDIxMTcsICAgIDY0MiwgICAzMTY2LCAgIC01NjksICAgIDcwMiwgICAgNTEzLCAgLTE4NTgsCisgICAgICAgMTA4LCAgICA5NDQsICAgIDI0OCwgICAgMTY2LCAgICA2ODEsICAgIDQwOCwgICAtOTA4LCAgICA1MjUsCisgICAgICAtMTQ1LCAgIDEwMzUsICAgIDE4OSwgICAyODEyLCAgICAxMzUsICAgLTM1NiwgIC0yNTUxLCAgICA0MDEsCisgICAgICAgMTUwLCAgIC01MDgsICAgLTI2NSwgICAgMjQ0LCAgICA0NjEsICAgIDk1OCwgICAtMjMzLCAgIC0yMDQsCisgICAgICAgNzQ0LCAgLTE2MDMsICAgIDM5NywgICAtMjI5LCAgIC0xNzQsICAgIDUzOSwgICAtMTM5LCAgLTQ0NzMsCisgICAgICAgODM3LCAgIC0zMTAsICAgIDI1MywgICAtNjM1LCAgICAzOTcsICAgIC04MCwgICAgNjAxLCAgIC0zNzEsCisgICAgIC0yMDE1LCAgIC0yNjEsICAgLTM2NCwgICAgIDUwLCAgICAzMzEsICAgICA4OSwgICAtOTM4LCAgICA3MDksCisgICAgICAxNDQ0LCAgLTI5MTAsICAgLTIyOCwgICAtMTYyLCAgICA0MTksICAgICA2MiwgICAtMzE5LCAgIC0yNjYsCisgICAgICAgNTg0LCAgIDM3MjgsICAgICA1NywgICAgMjIwLCAgIC01NDMsICAgIDc2OCwgICAtNjMwLCAgICAzNjEsCisgICAgICAgMzYxLCAgICA2NDIsICAgLTMxMywgICAgMTgyLCAgIC00ODgsICAgIC00OCwgICAzMDAxLCAgIC0zOTcsCisgICAgICAgNjQwLCAgICAxNzksICAgICAgOCwgICAxMDgxLCAgLTExNjEsICAgIC01OCwgICAgLTcwLCAgICAtNjQsCisgICAgICA0NDU2LCAgICAzMjMsICAgIDg4MywgICAtMTkxLCAgICAtMTYsICAgICA2MSwgICAgNDE5LCAgICA0MjksCisgICAgICAgNjI3LCAgIC04OTgsICAgLTg4MywgICAgNzUwLCAgICA0OTksICAtMTMzNSwgICAtNDY3LCAgLTE0MTAsCisgICAgICAgIC01LCAgICAyODMsICAgLTMwMSwgICAgMjc2LCAgLTE2MzYsICAgIDMxMCwgICAgMTE0LCAgIC00MjgsCisgICAgIC04MTkyLCAgICAgMTIsICAgLTExNCwgICAgIDc0LCAgICAyMTUsICAgIDUxMSwgICAgMzE3LCAgIC0zMTQsCisgICAgICAgLTg2LCAgICAxOTgsICAgIDEzOCwgICAgMzE1LCAgIC0yNzEsICAgIDI0NiwgICAtMzYzLCAgICA0MjYsCisgICAgICAgNjA4LCAgIC03MTQsICAgIDM2NywgIC0xMzU2LCAgLTIyMTcsICAgMTE3OCwgICAtMzg1LCAgIDE0NDIsCisgICAgICAgIDI4LCAgIC02NDIsICAgLTM3MSwgICAgLTg3LCAgLTI4OTUsICAgLTcxMCwgICAgMzAzLCAgIC0xNTAsCisgICAgICAtMzk4LCAgIC04NjgsICAtMTcyNywgICAxNTQ4LCAgICA5ODIsICAgMTE3NywgICAgMzMyLCAgIC0zNzcsCisgICAgICAxNTgwLCAgICA5NjIsICAtMTAyOCwgICAxOTIyLCAgIDE0OTQsICAgLTgyNCwgICAgIDkzLCAgLTEzNjIsCisgICAgICAtNTUyLCAgIDE2NDEsICAtMTcyOSwgICAgMjI4LCAgIDEwNTQsICAgIDQyMSwgICAtMTg1LCAgIC01MzYsCisgICAgICAgIDUxLCAgICAgODcsICAgLTIwNCwgICAgIDg4LCAgIC04NDcsICAgLTc1NCwgIC0zNzYxLCAgLTI3MDYsCisgICAgICAtMTM4LCAgLTEyNDIsICAgICAzNSwgICAgIDY0LCAgICA0MTgsICAgLTQ2MCwgICAgNzEzLCAgIDM5NjAsCisgICAgICAgNzMzLCAgICA0NjgsICAgLTE1MCwgICAtODIzLCAgIC0yMTEsICAgLTY3NCwgICAgMzY2LCAgIC0yNjksCisgICAgICAgMTgwLCAgIC0yOTQsICAgLTM4NCwgICAgNjA0LCAgIDE4MjksICAgLTEyMSwgICAgMjcxLCAgICAyNDEsCisgICAgICAgMTkyLCAgIC0yMTEsICAtMjY3MiwgIC0xNDgzLCAgLTExMDIsICAgIDk2MCwgICAgIDkwLCAgICAgNDksCisgICAgIC0xMTQ0LCAgIDI1NTIsICAgLTg4NywgICAgLTMyLCAgIC0zMDEsICAgICA2MiwgICAtMTgzLCAgICAxOTMsCisgICAgICAgIDc4LCAgIC03ODEsICAgIDE5MywgICAtNjA2LCAgIC0yODUsICAtMzA4MiwgICAgMjQwLCAgICAzOTIsCisgICAgICAgNzA0LCAgICAgMjAsICAtMTEwMywgICAtMTk1LCAgICAxNjYsICAgIDU3NywgICAtMTA1LCAgICAtNDUsCisgICAgICAtMzEwLCAgIC0xMDYsICAgMzAzNSwgICAgIDI4LCAgIC0zNjksICAgIDcyNSwgICAgIDUzLCAgICAgODcsCisgICAgICAtMjMyLCAgIC0xOTEsICAgICAgNywgICAtMjgyLCAgIC01NzIsICAtODE5MiwgICAgMzI1LCAgICAgOTksCisgICAgICAgMTYyLCAgIC0xMTMsICAgLTIzNywgICAtMjA5LCAgICA0MTIsICAgLTU3MywgICAgMjk1LCAgIC0zODksCisgICAgIC0xNjAzLCAgICAtNjYsICAgLTQ4NSwgICAtODY3LCAgICA0NjYsICAgLTg4MiwgICAgODYyLCAgIC0yMTYsCisgICAgICAgMjIxLCAgICAgNTAsICAgIC01MSwgICAzOTI3LCAgICA1NTcsICAgIDQ0MSwgICAgMjIzLCAgICAyMzQsCisgICAgICA0MDQ4LCAgIC0xNzMsICAgIDQyMCwgICAxNjcwLCAgICA0MzYsICAgIDM0MSwgICAgMTc1LCAgIC00NDEsCisgICAgICAtMjAxLCAgICAgNzUsICAgLTU0OSwgICAgMzE1LCAgICAxNzIsICAgIDQxOCwgICAtMTU5LCAgICAgIDcsCisgICAgICAyOTczLCAgICAgLTMsICAgLTIyMCwgIC0xMzYwLCAgICAgMjYsICAgMjc4MSwgICAgMTMyLCAgICAyOTUsCisgICAgICAgLTE1LCAgICAyMTcsICAgLTE2NiwgICAgMTg3LCAgIC0yODIsICAgIDM1NywgICAtMTIxLCAgICA0ODAsCisgICAgICAtMjE2LCAgICAyOTQsICAgIDI2MywgICAgIDk1LCAgLTczNjcsICAgIDU4OSwgICAgLTYzLCAgIC00MTIsCisgICAgICAtMTAzLCAgIC0yMDEsICAgIDMzNSwgICAgLTk2LCAgIC0yMDMsICAgIDI0MCwgICAgMjIzLCAgIC00MzUsCisgICAgICAgMzY2LCAgIC00NjcsICAgIDExOCwgICAgNTI4LCAgIC00NzIsICAgLTU1OSwgICAtNDE3LCAgIC0xODksCisgICAgICAtNjQxLCAgICAzMzksICAgMTU0NiwgIC0yNzQxLCAgIDE0MTMsICAgLTI2NSwgICAgNjM3LCAgLTE1NTYsCisgICAgICAgLTQ5LCAgICA0MjIsICAgLTE5NSwgICAgMzkyLCAgICAtMjEsICAgICAgMywgICAgIC0yLCAgICAyODIsCisgICAgICAtMTMwLCAgIC0yNzIsICAgLTQ4MywgICAtODYwLCAgIC02NzUsICAgIDc2MiwgIC0xNDU1LCAgIDUyMTIsCisgICAgICAgMTc4LCAgICAxOTcsICAgLTQ2OCwgICAgMjcwLCAgIC0zMTAsICAgMTAzOCwgICAgNDA2LCAgIDI2OTksCisgICAgICAtNTM3LCAgICAtMzMsICAgIDI3MiwgICAgMjI1LCAgLTE5ODYsICAgMTI5NSwgICAtODU3LCAgLTI5MDYsCisgICAgICAtOTA0LCAgLTE4NjEsICAgLTIwNiwgICAgODY2LCAgIC0xNDUsICAgLTIwNywgICAgMjUyLCAgIC04MjUsCisgICAgICAzMDUxLCAgLTEzNjEsICAgLTQ0MSwgICAgIDg1LCAgIC0xODYsICAgLTEyNywgICAgMTM5LCAgICAyODUsCisgICAgICAzMDY3LCAgIC0zMzIsICAgMTE2MywgICAgMjQ4LCAgIC00ODMsICAgLTE3NywgICAgMjY4LCAgICA2OTEsCisgICAgICAgNzMzLCAgIC0xMDQsICAgIC01NCwgICAyNTQxLCAgLTEwNDIsICAgLTIyNiwgICAgMTY1LCAgICAyNTAsCisgICAgICAgICA3LCAgIC0yNTksICAgLTM4MywgICAgMzI3LCAgIDIxNjQsICAgMjI3MiwgICAtNzUwLCAgIDI0ODIsCisgICAgICAtOTMwLCAgIC0xMzksICAgMTIwMywgICAgNzY2LCAgICAxNTAsICAgIDMyMCwgICAgOTcwLCAgICAgMjgsCisgICAgIC0xMzUxLCAgICA0NjcsICAgIDU0NCwgICAgNTIxLCAgLTI5MDgsICAgIC03NSwgICAtOTAyLCAgICA2MTEsCisgICAgICAgNTc1LCAgIDEyMTYsICAgLTIwOSwgICAgIC03LCAgICA1NDEsICAgIDMzMCwgICAgNTI4LCAgICAzNDcsCisgICAgICAtMTg1LCAgIC0zMDYsICAgLTQzMiwgIC0zMzg0LCAgLTE4NDQsICAgLTM4MCwgICAgMTU1LCAgLTEyMzAsCisgICAgICAgNjI5LCAgLTEwODUsICAgLTQxMywgICAgMTE5LCAgICAxMTQsICAgMTA5MywgICAgMTk4LCAgICA4MDYsCisgICAgICAgNDkxLCAgIC0xMzcsICAgLTUxOCwgICAgNTM2LCAgICAtNjQsICAgIDM4NywgIC0xNzEyLCAgICA2MDgsCisgICAgICAgLTI0LCAgIDQ5NjEsICAgIDE0OSwgICAgMjk5LCAgIC0zNDIsICAgIDUwNSwgICAgNTAzLCAgIC0zODcsCisgICAgICAtOTQ0LCAgIC0yOTcsICAtMjQyMywgICAgLTk4LCAgLTEwMjcsICAgLTQzMiwgICAtMjU5LCAgICA3MzYsCisgICAgICAgMTI3LCAgIDM1NjEsICAgLTQ3MywgICAtNjIzLCAgIC03NTEsICAgIDExNCwgICAtNDM4LCAgICA2NTcsCisgICAgICAyNDQ4LCAgICA4NjMsICAgLTQxMywgICAgLTgxLCAgIDIwNjYsICAgIDk4OCwgICAtNTM5LCAgIC01MjgsCisgICAgICAtMTExLCAgICAzMTQsICAgIDM5MCwgIC0xMjI4LCAgIC04NjMsICAgICAxOSwgICAgNzYzLCAgIDIyMjcsCisgICAgICAtODQ0LCAgICAtMjQsICAgNDE2NCwgICAgMTM5LCAgICAxMzAsICAgLTExMSwgICAtNjMwLCAgIC00MjgsCisgICAgICAgNTM4LCAgIC02MDYsICAgIDk0MCwgICAtODc3LCAgICAxMjIsICAgIDUyNiwgICAgMTk0LCAgIC0xMDQsCisgICAgICAgMTI3LCAgICAxMTcsICAgIDkwNywgICAtNzg5LCAgIDI4NjUsICAgIDUyNiwgICAtNTQ4LCAgIC0yNTMsCisgICAgICAgMjg5LCAgIDIzMjksICAgIDE3NiwgICAgLTcwLCAgICA3NzUsICAgIDY4MSwgICAgIDIxLCAgICAgMzgsCisgICAgIC0xNDgxLCAgICA3NjYsICAgMjA5MywgIC0yOTc0LCAgIC0yODksICAgLTU3MSwgICAtNDQ1LCAgIDE4MzMsCisgICAgICAgMzMzLCAgICAtODQsICAgLTI0MywgICAtNDEzLCAgICAxODgsICAgLTQ5MiwgICAgLTIyLCAgIC04NjcsCisgICAgICAgNjA1LCAgIC0zMzMsICAgIDkwNCwgICAzMTkyLCAgICAtMjksICAgIDQ5MSwgICAtNDExLCAgICAzNzAsCisgICAgICAtNTU2LCAgLTI2NzEsICAgLTI5NCwgICAgMTMyLCAgIC0yNDMsICAgLTIzMywgICAgMTgwLCAgICAxODEsCisgICAgICAgMzgzLCAgICAtNzksICAgICAyNiwgIC0zNTM5LCAgICA2NDIsICAgMTEyNywgIC0yMTI1LCAgIC0xNzAsCisgICAgICAtMzg2LCAgIC0xMzUsICAgLTcwMywgICAtMjkwLCAgIC0xNTcsICAgLTQ0NCwgICAtODg1LCAgIC0zNDEsCisgICAgICAtOTIwLCAgICA0NjAsICAgLTQwNywgICAtMTc2LCAgIDMxNTMsICAtMzA4NCwgICAtNTA1LCAgICA1NDMsCisgICAgICAgICA3LCAgICAgNzksICAgMTE5MSwgICAxMTQ4LCAgIC00MDEsICAgIC0xNywgICAgMjg5LCAgIC03MzUsCisgICAgICAgMzAwLCAgIDE5NzEsICAgIDYyNiwgICAtMTQ2LCAgICAxMTAsICAtMTI4MSwgICAtNjEzLCAgIC02NDksCisgICAgICAtMjA2LCAgIDE4NTAsICAgIDcwMSwgICAxMTM4LCAgIC04MDMsICAgIDc0MiwgIC0xMzkyLCAgICAxNDcsCisgICAgICAgNTU0LCAgIDE4NjEsICAgLTY1OCwgIC0xNDgxLCAgICAxMDgsICAgIDg1NiwgICAxMDIxLCAgICA1NzQsCisgICAgICAzMzE0LCAgICA1MTgsICAtMTE1NiwgICAtMzA3LCAgICAgNDIsICAgIC05MiwgICAtMTMyLCAgICAyNzgsCisgICAgICAtMzUyLCAgICAtMzcsICAgICAzNSwgICAgMTQ2LCAgICAtOTMsICAgLTY2MiwgICAgMjE2LCAgICAxMjUsCisgICAgICAgODIzLCAgIC04NzYsICAgLTE3MCwgIC01MDI3LCAgICA0NDQsICAgLTE4MiwgICAgODQ0LCAgICAxODksCisgICAgICAtNDkwLCAgLTE0NDEsICAgLTMzNSwgICAtOTA3LCAgIC0xNzMsICAgMTEzOCwgICAtNDcyLCAgLTE1MDUsCisgICAgIC0xNjQxLCAgICA2NDgsICAgICA2NiwgICAgNjI3LCAgICAgNjQsICAtMTA5NiwgICAtNjIwLCAgIDE1ODgsCisgICAgICAtNTA2LCAgICAzMDksICAgLTEwMCwgICA1NzAyLCAgIC01NTUsICAgLTE1NywgICAtMTc5LCAgICAtODUsCisgICAgICAtMjk5LCAgIC0xMTQsICAgIC0yMCwgICAgMTc4LCAgICA0MTUsICAgIDExOCwgICAtNTgxLCAgIC0xMzIsCisgICAgICAxMDI1LCAgLTI2MzEsICAtMTE1NCwgICAyNjIzLCAgIC0yODYsICAgIDIwMSwgICAgMzQwLCAgICA5NDksCisgICAgICAgMjM1LCAgICAxNzEsICAgIDY0OSwgICAgMzI4LCAgICAzOTcsICAgLTE0MiwgICAxMzY5LCAgICAgLTcsCisgICAgICAyMzA1LCAgIC0zNzMsICAgIDY1OCwgIC0xNjgxLCAgIC03NDQsICAtMzU3NCwgICAgIDM0LCAgIC0xODMsCisgICAgICAtNTA0LCAgICAxNjUsICAgICA4MSwgICAgIDIxLCAgICA2MzUsICAgLTMwNywgICAgNDI4LCAgIC01MjAsCisgICAgICAgMTY0LCAgLTQ3MDEsICAgIDc0NCwgICAgMjQ5LCAgIC04NDQsICAgICAtNywgICAtMzM0LCAgICAgMzgsCisgICAgICAgNTM5LCAgICAyNjcsICAgLTIxMywgICAgIDczLCAgICAxMzQsICAgLTI1MSwgICAtMjQ4LCAgIC05MjMsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjE2MTZzbTBbXSA9IHsKKyAgICAgLTQxMTksICAtMjg2MSwgICAgLTc2LCAgICAtNDksICAgLTE5MiwgICAtNTQyLCAgICAgIDAsICAgICA5NCwKKyAgICAgIC01NTAsICAgICAgNiwgICAgNjAxLCAgICAyMzYsICAgLTQ0NiwgICAtMjAyLCAgICAxNjcsICAgIDIzOCwKKyAgICAgIDI2MDksICAgLTY4OCwgICAtNDA2LCAgICAyNjUsICAtMzA3OCwgICAgMzIxLCAgICAgNTksICAgLTYwMSwKKyAgICAgICAxNTcsICAgIDIwMCwgICAtMjY1LCAgICAgNzgsICAgLTY5OSwgICAtNjc5LCAgICAgMTgsICAgIC01NCwKKyAgICAgICAyMDMsICAgLTY4NywgICAyNjgzLCAgIC0xMTEsICAtMzAzNywgICAtNjI3LCAgIC00OTMsICAgIDQxMywKKyAgICAgIC00ODAsICAgICA1NCwgICAgIDc1LCAgICAyNzYsICAgIDIwNiwgIC0xODYxLCAgICAgMTcsICAgLTQyMCwKKyAgICAgIC0xNjksICAgIDMxMiwgICAgMzYxLCAgIC0yNzcsICAgIC0xMiwgICAtMzYzLCAgIC01OTIsICAgIDc1OCwKKyAgICAgIC0xMjMsICAgMzI2NywgICAgIDc4LCAgIC04NjIsICAgICA4MSwgICAtMzU2LCAgICA1OTYsICAgLTUzNiwKKyAgICAgICA3MjksICAgMjIzOSwgICAgLTQ5LCAgICA1NTMsICAgIDExMiwgICAgNDQ0LCAgICA2NTIsICAtMjk5MCwKKyAgICAgICAtNzAsICAgMTA4NCwgICAtNDM2LCAgICAgMzQsICAgICA1MywgICAgLTEwLCAgICAtMjMsICAgICA0MSwKKyAgICAgICAgLTMsICAgLTEyNiwgICAgMjA3LCAgIC0xMzAsICAgLTIwOCwgICAgIDYzLCAgICA0ODAsICAgIDE5MSwKKyAgICAgIDYyMjksICAgIC00NSwgICAgLTMzLCAgICAtODIsICAgICAzNSwgICAgIDU2LCAgICAyNTksICAgICAgMSwKKyAgICAgIDgwMzQsICAgIC05NywgICAgIDUyLCAgIC0xNTksICAgLTMzNCwgICAgLTQxLCAgICAgNTAsICAgIC01NywKKyAgICAgICAgNTYsICAgLTE5NCwgICAtNTY3LCAgIDIwNTAsICAgIDE0NiwgICAgOTg3LCAgIC0zODMsICAgIDQxNiwKKyAgICAgIC0yNTgsICAgMjg0NiwgICAgIDUxLCAgICAgIDgsICAgIDY5MCwgICAtMTI2LCAgIC03MDQsICAgIDMxNiwKKyAgICAgICAgMTYsICAgICAtNCwgICAgLTkwLCAgICAxNTksICAgICAzNCwgICAgMTI2LCAgICAgNjUsICAgIDIxOCwKKyAgICAgLTcwMzcsICAgLTI2MSwgICAgLTg3LCAgICAtMjEsICAgLTE4NSwgICAgIDE0LCAgICAxMTIsICAgICA0MiwKKyAgICAgIC0xNjQsICAgIDI3NCwgICAtMjY5LCAgIDExMzgsICAgLTIwOCwgICAgNTc0LCAgICA1ODksICAgLTE0MywKKyAgICAgIC00NzksICAgMjc0NSwgICAgNzgyLCAgICAtMTMsICAtMjQ5MiwgICAtMTMyLCAgICA0OTgsICAgLTQwNiwKKyAgICAgICAyNjAsICAgIDgyOCwgICAtNTgwLCAgICA1NTgsICAtMjg2MSwgICAtNjAwLCAgIC00NDcsICAgLTMxMywKKyAgICAgIDEzMTYsICAgIDgwMCwgICAxNzcyLCAgIDExMzEsICAgIDMyMywgICAgLTQ4LCAgLTM5NzIsICAgIDY5NywKKyAgICAgICAgIDUsICAgLTQwMywgICAgIDQ2LCAgICAgOTUsICAgIDEzMCwgICAgIDg0LCAgICAtMzksICAgIDIxOSwKKyAgICAgICAxMTcsICAgMTYyOSwgICAtMTg5LCAgLTEzNzEsICAgICAyNSwgICAtMTE2LCAgIDIzMTEsICAgLTY4MSwKKyAgICAgIC00MTEsICAgLTY4NSwgIC0xMzQwLCAgIC00MDksICAgIDIyMywgICAtNDYyLCAgIDI1MzAsICAgLTgxNiwKKyAgICAgLTExMTgsICAgIDMxNCwgICAtODkzLCAgIC0xMDksICAgLTI2MiwgICAgMzc2LCAgLTI3OTUsICAgIC00OCwKKyAgICAgLTI4NzgsICAgICAtNiwgICAgMTgwLCAgICAgNTMsICAgLTUwMCwgICAtMTgxLCAgICAxMjUsICAgLTI5MSwKKyAgICAgIC0yNjUsICAgLTE1NCwgICAgLTIzLCAgIC0xODQsICAgIDE4NSwgICAtNTYzLCAgLTExNTksICAgIDY3NSwKKyAgICAgICAgMjQsICAgLTIxMywgICAgMjczLCAgLTI5MDUsICAgLTI0MiwgICAyMzczLCAgICAgLTYsICAgLTE2NiwKKyAgICAgICAgOTIsICAgIDI3NiwgICAxMzc1LCAgICAtMjgsICAgMTg3OSwgICAyNTcyLCAgICAyMDUsICAgLTEyMSwKKyAgICAgICAgNTEsICAgIDM1NiwgICAtODczLCAgIC0zMDgsICAtMTA2MCwgICAgOTUyLCAgICA3MTksICAgIDQ1NiwKKyAgICAgICAxMDYsICAgIDExNiwgICAtMTA3LCAgIC0yMTEsICAgIC0yMSwgICAzMzE5LCAgIDIxMDksICAgLTE3MiwKKyAgICAgIC0xNzIsICAgIDE0MywgICAtNzE4LCAgIC0xMzgsICAgMTEzNSwgICAgMjMyLCAgLTEzNjEsICAgIDE1NywKKyAgICAgICAtOTksICAgIDUyMiwgIC00MzY3LCAgICAgODQsICAgIDYwNSwgICAgMzE5LCAgIC05MzcsICAgLTM5NywKKyAgICAgICAxMTcsICAgLTQzNCwgICAgIDgyLCAgICA2MzMsICAgIDI3NCwgIC0xNTU1LCAgIC0yMjEsICAgIC01OSwKKyAgICAgLTI0MTksICAtMjQ4NiwgICAtMTEyLCAgICAxMzYsICAgLTE4MiwgICAtNDgwLCAgICAgMjcsICAgLTU0OCwKKyAgICAgIC0yMzcsICAgIDgxNywgICAgNTMwLCAgICA2NTYsICAgIDI1MiwgIC0yNjg1LCAgICAtMjYsICAgIDcwMywKKyAgICAgLTMyNjgsICAgIDM4MSwgICAtMzgzLCAgIC0zMjMsICAgIDEwNSwgICAtNTAwLCAgICAgNjYsICAgLTI5OSwKKyAgICAgLTEwNTYsICAgLTM2MywgICAgLTY5LCAgICAgMjEsICAgIDI5MiwgICAgMzk4LCAgIC0zNzksICAgLTEwNiwKKyAgICAgIC0zNTYsICAgICAzOCwgICAgMTY5LCAgIDI4NjYsICAgIDIwNiwgICAtNTIzLCAgIC0yNzcsICAtMjg3NSwKKyAgICAgIC01ODIsICAgIC02OSwgICAgNjQ5LCAgICAgLTMsICAgIDE5OCwgICAgLTMwLCAgICAgOTgsICAgIDE0NSwKKyAgICAgIC0xMjUsICAgLTE4NiwgICAgLTE5LCAgIC0xMDcsICAgLTEwMiwgICAtMTczLCAgLTcyOTksICAgIC02MiwKKyAgICAgIC01MDMsICAgLTIzMSwgICAgIDI0LCAgICAxNDUsICAgMTM2NywgICAtMzU1LCAgIC0xNzUsICAgIDM3MywKKyAgICAgIC05NTMsICAgLTcwNCwgIC0zNDU0LCAgICAxNzAsICAgIDg5OSwgICAgMzg2LCAgICA1OTIsICAgLTc1NCwKKyAgICAgICA2MjAsICAgICA4MSwgICAgIDg2LCAgICAtNjUsICAgICA4NCwgICAgNjgzLCAgIDMwNTQsICAgLTI4MCwKKyAgICAgLTI4MjUsICAgLTc1NywgICAgIDUzLCAgICAtMTAsICAgIDQ0MSwgICAtMTQ1LCAgICAxMzgsICAgMTM2NCwKKyAgICAgICAgLTIsICAgIC05MiwgICAtMzAwLCAgICAyMjUsICAgLTE5OSwgIC0yMDg3LCAgIDEwOTUsICAgLTM2MywKKyAgICAgICAtNzUsICAgIDI4OCwgICAgNzY1LCAgIC04NjksICAgICAtNywgICAzMjYxLCAgICAgIDksICAtMjg2MCwKKyAgICAgIC0zMzAsICAgLTM4MiwgICAzMzA5LCAgICAgMjgsICAgIDYyOSwgICAgMjQ0LCAgIC0xNDMsICAgLTI5OCwKKyAgICAgIC01MTIsICAgLTQwOSwgICAtMjQxLCAgICAxMDQsICAgICAtNiwgICAtMjcxLCAgICAgLTIsICAgODE5MiwKKyAgICAgIC0xMzcsICAgIDEzOSwgICAtMzA0LCAgICAtMTQsICAgICA4MSwgICAgMjYyLCAgICAtMzYsICAgICA1MSwKKyAgICAgICAzODAsICAgICAxMSwgICAgMTAxLCAgICAxMDAsICAgLTE1MywgICAyMTY3LCAgIC0yNzEsICAgIDI2NywKKyAgICAgICAzMDYsICAtMzAwOCwgICAgNTc5LCAgIC0yNzcsICAgIDMxNiwgICAgMzI3LCAgIDExNjgsICAgICA3MSwKKyAgICAgLTE0MDEsICAgIDM4OSwgICAgLTI1LCAgIC0yNjUsICAgIDEwMSwgICAgLTUzLCAgIC0xNzAsICAgLTIyNiwKKyAgICAgIDI4NjEsICAgIDE0NSwgICAzMDQwLCAgIC0xNTksICAgICA3NywgICAgLTE2LCAgICAyMzMsICAgLTU3MCwKKyAgICAgICA0OTAsICAgIDY2MSwgICAgNDUyLCAgIDE5ODYsICAgLTUyMiwgICAgMjEyLCAgIC0xMDcsICAgIDE5NiwKKyAgICAgIC0yNDcsICAgIDMwOCwgICAtMzUzLCAgICAxODYsICAtMjY4OSwgICAgNDg2LCAgICAtNDYsICAgIDgxMywKKyAgICAgICAtMjQsICAgIDIzMywgICAtMTY2LCAgIDMzMDUsICAgMjgzMiwgICAtMzQzLCAgICAtODIsICAgIDQ3NSwKKyAgICAgICAyNjcsICAgLTM4NSwgICAgIDI2LCAgICAtMzUsICAgLTIyNiwgICAgIDI3LCAgICA0MTYsICAgIDIzMSwKKyAgICAgICAgMTIsICAgICA4OCwgICAtMjA5LCAgIC0xMzksICAgIDQwNCwgICAtMjM5LCAgIC0xMDksICAgLTE4MiwKKyAgICAgIC04NTEsICAgIDI2MCwgICAgMjQyLCAgICAxMDksICAgICAxMSwgIC0xMDk2LCAgICAgODUsICAtNDIyNiwKKyAgICAgIC0xMjQsICAgICAxMiwgICAtMTM5LCAgIC0xMDAsICAgLTYwNCwgICAgLTg3LCAgICAgODksICAgNTgyMCwKKyAgICAgICAgNTksICAgIC00MywgICAgLTg0LCAgICAyNjQsICAgLTU0MywgICAgICAwLCAgICA0MjgsICAgIC0xNiwKKyAgICAgIC0xNDYsICAgLTU1NiwgICAtMTk1LCAgIC0xNTksICAgIDg3NSwgICAgIDI3LCAgICAyNjEsICAgIDIwNywKKyAgICAgIC0xODIsICAgMjM2NywgICAtNjIyLCAgLTMxOTMsICAgIDQ4MSwgICAtMjg5LCAgICAgNTIsICAgICAxMiwKKyAgICAgICAgMzQsICAgMzAxNCwgICAgIDEwLCAgIC0zNDUsICAgIC05NCwgIC0yODgzLCAgICAtNjIsICAgIDQwMCwKKyAgICAgICAyNDksICAgICA1MSwgICAtMTc4LCAgIDExOTAsICAgLTEyOCwgIC0zOTQwLCAgICAgNDEsICAgLTI5NiwKKyAgICAgICAtNDgsICAgICAxMywgICAgLTI2LCAgICAyMjMsICAtMjM5MiwgICAgNTE2LCAgIC0zODQsICAgICAzMywKKyAgICAgICAtNDYsICAgLTE2MSwgICAgLTQzLCAgIC0yMjQsICAgIC04OSwgICAgIC00LCAgIC0zNDksICAgIDEzNSwKKyAgICAgICA1NDAsICAgLTEyMCwgICAtMjc2LCAgIC0xOTgsICAgIDEyOSwgIC01MTEzLCAgICAxNzUsICAgIC00NSwKKyAgICAgICAtMzQsICAgLTEwOSwgICAgNDE5LCAgICAtNDUsICAgLTEwNCwgICAtMTg1LCAgIC0zOTMsICAgIDQxNiwKKyAgICAgLTM1MTQsICAgIDE0OSwgIC0zMDg4LCAgIC0xMTUsICAgIC03OCwgICAgNDMxLCAgIC0xNzIsICAgICAyMSwKKyAgICAgIC0yOTAsICAgLTE2MiwgICAgMjE2LCAgICAgNDEsICAgIC01NiwgICAtNDg3LCAgICA3MDUsICAgLTE5NCwKKyAgICAgLTEwMDMsICAgIDEwMCwgICAgMTcyLCAgIDI3OTMsICAgIC04MywgICAyNTg0LCAgIC0xODksICAgMTE5OCwKKyAgICAgICA1NTEsICAgLTExOSwgICAgLTczLCAgICAtOTEsICAgMjEwMywgICAtNjE5LCAgICAxMjQsICAgIDEyOCwKKyAgICAgIDI2MjgsICAgIDE5MiwgICAgMTYwLCAgIC0xMTAsICAgIDI3MCwgICAxNzM5LCAgIDEwNjIsICAgLTU2OCwKKyAgICAgICAtNzMsICAgIC01NiwgICAgMzI4LCAgICAxMDAsICAgIDM4NCwgICAtMTczLCAgICAgODMsICAgICAzOSwKKyAgICAgIC0yMzYsICAgIC0yNSwgICAtNDU3LCAgICAgNTMsICAtNjQxMywgICAgMzQ1LCAgIC00NTksICAgLTExMCwKKyAgICAgICAgMjgsICAgLTEyNywgICAtMTA5LCAgIC01OTMsICAgICAzMiwgICAgMTQxLCAgIC04NzksICAgIDI1NCwKKyAgICAgIDIxMzIsICAgLTQxMCwgICAtNjIzLCAgIDExMDMsICAtMjMwMiwgICAgNTI4LCAgICAxNTYsICAgICAyOCwKKyAgICAgICAgODEsICAgIDYxMywgICAgNjAyLCAgICAxNzEsICAgIDUwMCwgIC0yMzU2LCAgICA2MjAsICAgICAxNywKKyAgICAgIC01MjMsICAtMjk2MSwgICAtOTIxLCAgIC0xMDcsICAgLTQwNSwgICAtMjMwLCAgIC0xMjksICAgICAxOCwKKyAgICAgICAzNjMsICAgLTg4MSwgICAxMjgyLCAgIDE0MjcsICAgLTM2MywgICAgNjU4LCAgICAyMDUsICAgIC01MSwKKyAgICAgIDI4MzUsICAtMjAwMywgICAgMTg4LCAgICAtMjYsICAgICA3MywgICAtMjMxLCAgICAzNTIsICAgICA3NCwKKyAgICAgIC00OTAsICAgLTIyMiwgICAyNDIzLCAgIC0zNDEsICAtMjc2MiwgICAgLTE0LCAgICAtNTYsICAgLTI2MCwKKyAgICAgICAtNDEsICAgICAzMywgICAgMTY5LCAgIC0xOTAsICAgMTI0OCwgICAgLTc3LCAgLTIzMjIsICAgLTYwNywKKyAgICAgIDM2MTAsICAgLTEwNCwgICAtMjAwLCAgICAtOTAsICAgIC04MSwgICAgNzE5LCAgICAtNTIsICAgLTM1OSwKKyAgICAgICAzOTQsICAgLTMwMSwgICAgIDY2LCAgICAtMzksICAgIC01NiwgIC04MTkyLCAgICAgODcsICAgICA1NiwKKyAgICAgIC0yOTEsICAgICA1MCwgICAgMjMxLCAgICAyODQsICAgLTIxMSwgICAgLTE2LCAgICAtODYsICAgIC04NCwKKyAgICAgICAtMjgsICAgICA1MiwgICAgICAzLCAgICAtNTEsICAgIDMwNCwgICAtMjI0LCAgICAyMjgsICAgLTM3NCwKKyAgICAgICA0NTgsICAtMTk1OCwgICAtMjEwLCAgLTI2MTMsICAgIDQwMSwgIC0yMTI4LCAgIC0xMTksICAgIC0xMiwKKyAgICAgICAtNjAsICAgIC0xNCwgIC04MTkyLCAgICAgNTMsICAgICAyNywgICAgMTEzLCAgICAyODksICAgICAtNywKKyAgICAgICAgMjIsICAgICA2MCwgICAtMTkyLCAgICAzMzMsICAgICA3MiwgICAtMzQ0LCAgICAyMzgsICAgIDE0NywKKyAgICAgLTIyMzUsICAgIDMyNCwgICAgMTI0LCAgICAxNzYsICAgLTQxNSwgICAgNDUwLCAgIC00NzYsICAgLTU1OCwKKyAgICAgIC00MjksICAgLTI0NiwgICAtNTUxLCAgIC0yODcsICAgIDY3MiwgICAyMTQ1LCAgIDgxOTIsICAgIDE2MSwKKyAgICAgIC0xNjUsICAgIC0zNCwgICAgMTkzLCAgIC0xMDgsICAgLTEzNywgICAgLTk2LCAgICAtNjgsICAgIDE1NiwKKyAgICAgICAzMDgsICAgLTE4MiwgICAgICA1LCAgICA0MzgsICAgIC03MSwgICAgLTI3LCAgIC0xNjQsICAgIDE4NywKKyAgICAgIC0xMTAsICAgNTc4NiwgICAgLTgyLCAgIC0xMzAsICAgLTEyNiwgICAgMTk3LCAgIC0yNjIsICAgLTE4MiwKKyAgICAgIC0xMTgsICAgLTExMCwgICAgMTIxLCAgICAtOTMsICAgIDIzNSwgICAgLTU2LCAgICAtOTksICAgLTIxMiwKKyAgICAgLTMwMTMsICAgLTE5MywgICAgLTEwLCAgLTI5NDQsICAgICA1OCwgICAtMTM1LCAgIC02MjQsICAgLTE3MCwKKyAgICAgICAgODQsICAgIDMzOSwgICAgMTE1LCAgICAtODUsICAtMTg4NiwgICAgMjUwLCAgICAxMjMsICAgLTEwNCwKKyAgICAgIC0zNzQsICAtMjI0MSwgICAyNDU0LCAgIC00MzgsICAgLTE2OCwgICAgNjMyLCAgIC0xMzYsICAgLTcyNSwKKyAgICAgIC0zMjksICAgLTM5NCwgICAgLTYwLCAgICAgMTksICAgMjc5NSwgICAgNDM4LCAgIC03OTYsICAgIDE0MSwKKyAgICAgIC0xNDMsICAgIDEzMiwgICAgMjUxLCAgICAgMzcsICAgIDI4NiwgICAxODU4LCAgICAgMzksICAgMjM4MSwKKyAgICAgICAgLTksICAgIC04NSwgICAtMTEwLCAgICAxNDksICAgLTQxNSwgICAgMzU1LCAgIC0xNzIsICAgICAtOSwKKyAgICAgIC0xNDksICAgIDU1NCwgICAtMzI0LCAgLTQ5MzEsICAgLTUzNywgICAtMjYxLCAgIC01ODUsICAgLTI5MSwKKyAgICAgICA3NjQsICAgIC05MiwgICAtMTM5LCAgICAgLTgsICAgIC04MCwgICAgIDY1LCAgICAgLTYsICAgIC0yNiwKKyAgICAgICAtODEsICAgICAzNywgICAgLTE0LCAgICAgNDUsICAgIDExNSwgICAgMTcxLCAgIC0zMjEsICAgIDMxMywKKyAgICAgICAzMDgsICAtNDYzNywgICAtMTI4LCAgIC0xMjAsICAgLTE3NCwgICAgMTQ4LCAgICA3NjgsICAgIDQ5MCwKKyAgICAgICAgODEsICAgLTE3NSwgICAtMjYxLCAgIC0xMzYsICAgMTUwMSwgICAgMzQ1LCAgICAgMjUsICAgIC01NiwKKyAgICAgIC0yMTIsICAgLTMyNCwgICAtODM2LCAgICAyMDcsICAgLTY1MiwgICAtNzUyLCAgIDI0MDYsICAgLTMzMiwKKyAgICAgICA0ODksICAgLTI3NSwgICAtOTMyLCAgICAyODQsICAgMzEwMywgICAtMzE1LCAgICA2MTQsICAtMjcxMSwKKyAgICAgIDE3MDYsICAtMTA3MiwgICAtMTYzLCAgICAtNzUsICAtMTEwNCwgICAgMTYzLCAgIC00MjEsICAgMTUzMiwKKyAgICAgICAtOTIsICAgLTE2MywgICAtODExLCAgIC0xMTgsICAgIC0zOCwgICAtNzU0LCAgICA0NjYsICAgLTMxNCwKKyAgICAgICAyMzIsICAgLTU5NSwgICAzNjEzLCAgICAtMzAsICAgIDU3MCwgICAgLTYyLCAgICA3ODUsICAgMTYyNiwKKyAgICAgIDEwODAsICAgIDU1MywgICAtNDA3LCAgICAgMzIsICAgLTEwNSwgICAgIDgyLCAgIC0xNTYsICAgIC03NSwKKyAgICAgIDgwNjMsICAgIC02NywgICAgMTE0LCAgICAtNjUsICAgIC02NSwgICAtMjQyLCAgICAgOTgsICAgLTEyNCwKKyAgICAgICAgMzgsICAgIDQ0MSwgIC0yNjQ1LCAgICAtOTIsICAgICA2OSwgICAgIDE3LCAgLTMyODQsICAgLTI3OCwKKyAgICAgIC0yNzgsICAgIDExNiwgICAgNTY3LCAgIC03NDIsICAgIDE4MiwgICAtMzA0LCAgICA0MzIsICAgIDI2MSwKKyAgICAgICAgODYsICAtNDEwOSwgICAgMzg5LCAgICA3OTUsICAgLTEzOCwgICAgMTUxLCAgICAxMTEsICAgLTIyMywKKyAgICAgIDIzOTIsICAgIDM5OSwgICAtMTM1LCAgIC01NDUsICAgIDE4MiwgICAtMjI2LCAgICAgNjEsICAgIDIzNCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMTYxNnNtMVtdID0geworICAgICAgIC0yOSwgICAgLTEzLCAgLTYyMTcsICAgLTEzNiwgICAtMTk2LCAgICAgMjQsICAgLTIyOCwgICAtMzAxLAorICAgICAgLTE1NSwgICAgLTM3LCAgICAtNTQsICAgIC05MSwgICAgIC00LCAgIC0xMzAsICAgLTQyNCwgICAgLTg5LAorICAgICAgLTE4MSwgICAgNjU3LCAgICAxMTAsICAtNDUyNiwgICAtMzkxLCAgICA3NjIsICAgMTAzMywgICAtMzEwLAorICAgICAgLTgwOCwgICAtMjgyLCAgIC03MjEsICAgLTY5MCwgICAgMjU4LCAgIC0yNTksICAgICAxNiwgICAtNTU1LAorICAgICAgMjY3NSwgICAtMzc5LCAgLTI1ODAsICAgIDM1NiwgICAgMTk4LCAgIC00NTUsICAgICA5NSwgICAtMTk0LAorICAgICAgLTc1NCwgICAgMzgzLCAgIC0yNjMsICAgLTg3MywgICAgMjcxLCAgIC0xMDcsICAgLTE5MSwgICAgLTI4LAorICAgICAgICAxMSwgICAgLTY2LCAgICAgOTEsICAgICAyNSwgICAtMjE1LCAgICAgIDksICAgIDE1MiwgICAgIDExLAorICAgICAgLTEyNCwgICAgIDY2LCAgICA0MjIsICAgIDUyMSwgICA1NDAxLCAgICAxMDMsICAgLTE3OSwgICAtMjkxLAorICAgICAgLTgyMSwgIC0xMjY1LCAgIC0zOTYsICAgIDE1MCwgICAgLTY5LCAgICAtMTUsICAgIDE1NCwgICAxNTA0LAorICAgICAgLTQ0NSwgICAgMTE2LCAgIC0xMzYsICAtMzUyOCwgICAyODE5LCAgICAgLTUsICAgIDE3NCwgICAgMTY2LAorICAgICAgIDI4OSwgICAgLTYwLCAgICAxNTgsICAgLTcwMSwgICAgIDgzLCAgIC02MzYsICAgLTQwNywgICAgMTk0LAorICAgICAgLTI0MCwgICAtMTM4LCAgICAxMjQsICAgIC05NCwgICAgMTMyLCAgIC0xMDUsICAgLTEwNiwgICAgIDcyLAorICAgICAgIDEzOSwgICAgMTAxLCAgICAgOTcsICAtNzkyOCwgICAgICA2LCAgICAxMTIsICAgIDE2NCwgICAgLTgzLAorICAgICAgLTMyOSwgICAgIDQxLCAgICAxMjQsICAgIDM4OSwgICAgLTIyLCAgIC0xOTQsICAgIDE1NywgICAtMzc4LAorICAgICAtMjI1NSwgICAtNDMxLCAgIDMxNzYsICAgLTE5OSwgICAtMzEwLCAgICAgNDksICAgIDQ4MywgICAtMjA4LAorICAgICAgLTIzNSwgICAgIDExLCAgICAgNDUsICAgIDYzNywgICAxMjIwLCAgIDIzMDksICAgICA5MywgICAgNTE0LAorICAgICAtMTkzOSwgICAgMTM2LCAgICAyNzYsICAgLTE2NSwgICAgMTM3LCAgIDI0OTYsICAgICA1NiwgICAgIDMxLAorICAgICAgIDIzOCwgICAtNTM4LCAgIC00MzMsICAgIDY5MCwgICAtMzE4LCAgICAtNDQsICAgIDgzNCwgIC0xNjg0LAorICAgICAgLTEzMiwgICAyNjE5LCAgIC0xNTcsICAgMTk1OSwgICAtNTY2LCAgICAxMTksICAgIDE4MywgICAgMjI3LAorICAgICAgMjA2NiwgICAgNDAxLCAgICAtNDgsICAgMTI1NywgICAgNjA0LCAgIDEzMDYsICAgIDE0OSwgICAgMjczLAorICAgICAgIDU4NiwgICAtMTk5LCAgIDIxNjYsICAgIDI1NywgICAyMDQ3LCAgICAtNDYsICAgLTM3NywgICAtNzYxLAorICAgICAgIC0yNSwgICAtNDU0LCAgLTE1OTIsICAgIC00MiwgICAgNDMyLCAgLTIzMTIsICAgIDIyMiwgICAtNTI4LAorICAgICAgIC04NywgICAtMjg3LCAgICA1MzIsICAgMjkwNiwgIC0yMDExLCAgICA3MjAsICAgIDU1NCwgICAgNDIzLAorICAgICAgLTU3NiwgICAgNDI1LCAgICAyODAsICAgLTg5NCwgICAtMjMyLCAgIC0xNzksICAgIDQ4NSwgICAgNjI4LAorICAgICAtMjkxOCwgICAgNDA1LCAgICAyMjksICAgICAtMiwgICAtMTQ2LCAgICAxMjcsICAgLTMyOSwgICAtMjQzLAorICAgICAgIDE5NCwgICAyNDQzLCAgIC01MzEsICAgIDU5MiwgICAgLTE0LCAgIDE2NzksICAgIDI5MiwgICAtOTE0LAorICAgICAgLTMzMiwgICAyMzgyLCAgLTMwNDAsICAgIDI5NywgIC0yODU2LCAgICAtODgsICAgIDIzNiwgICAtNDg1LAorICAgICAgIDQzOCwgICAgMjQxLCAgIC0yODMsICAgIDQ0OCwgICAgNTc5LCAgIC02NjAsICAgIDI3NywgICAgMjMzLAorICAgICAgIDIwMSwgICAgMTI2LCAgICAgMTUsICAgLTQxMSwgICAtNTYwLCAgIC01ODIsICAgLTM4OSwgICAtMzkyLAorICAgICAgICAtNywgICAgMjM4LCAgICAgIDEsICAgIDM0NCwgICAtMjE2LCAgLTQ2MDEsICAgLTQ1NywgICAxMDI3LAorICAgICAgLTExNCwgICAgIDEzLCAgIC0zMDEsICAgIDI4OCwgICAgMTcyLCAgIC00ODgsICAgLTEyNCwgIC0yNzIxLAorICAgICAgIDEwMCwgICAtMTA1LCAgICA0MzQsICAgIC0xMywgICAyNzkxLCAgIC04MjcsICAgMTYwMCwgICAtMjE5LAorICAgICAtNDk5MiwgICAtMTAwLCAgICA0MTEsICAgIDMyNiwgICAtNjA4LCAgIC03NzksICAgICA5NCwgICAgOTc0LAorICAgICAgIDQ1MywgIC0xMzI2LCAgIC0yMzYsICAgIDQyOSwgICAtMTg5LCAgICA4MzAsICAgICAzMiwgICAgMTg3LAorICAgICAgIDQ1OSwgICAyNDg5LCAgICA0NzYsICAgIDE2NSwgICAzMjYxLCAgIC00NDUsICAgIDE2OSwgICAgMTc5LAorICAgICAgLTExMywgICAgMTY4LCAgIC0zOTMsICAgICA1MiwgICAtMzgzLCAgICAtMzMsICAgICA3MywgICAgMTM3LAorICAgICAtNjAyMSwgICAtMjU5LCAgIC0xMjEsICAgIC0yOSwgICAgLTQ2LCAgIC0xNTYsICAgICA2OCwgICAtMjI1LAorICAgICAgIDIxNywgICAgMTUyLCAgIC0yODAsICAgICAgNywgICAgIDYyLCAgICAgIDMsICAgICAxNywgICAgMjk1LAorICAgICAgIDIyMSwgICAtMTU4LCAgLTU0MDYsICAgLTMzNSwgICAgMjMyLCAgIC00NTQsICAgLTMyMCwgICAgNDY3LAorICAgICAgIC00NSwgICAgIDk2LCAgIC0xNzAsICAgLTI2NywgICAxMjczLCAgICAyODcsICAgIDI1OCwgICAgNTM2LAorICAgICAgLTY5NSwgICAtOTUzLCAgIDExMzQsICAgIDQyOCwgICAgMjUxLCAgIDMzMzEsICAgIDcxNywgICAtODA0LAorICAgICAgIDYyNywgICAxMDk5LCAgICAxMjAsICAgICAgNCwgICAgIDQyLCAgICAxOTEsICAgICAtOSwgICAgMjU5LAorICAgICAgLTMzNSwgICAtMzM3LCAgICAtMjUsICAgIC01NiwgICAgMTE2LCAgIC0yMjgsICAgLTM1MSwgICAtNDYzLAorICAgICAgNTk0MiwgICAgMTkzLCAgIC0xMTQsICAgIC02NCwgICAtMjY4LCAgICAzMDAsICAgIDE0NiwgICAgLTE1LAorICAgICAgIDY1NywgICAgMzY3LCAgICAgLTIsICAtMjkxMSwgICAgODM4LCAgIC0yNTEsICAgICAtMSwgICAyODk3LAorICAgICAgIC03OCwgICAtNjA5LCAgIC01NDUsICAgLTU4OCwgICAgNDg4LCAgIDEzODMsICAgIDQ4NiwgICAxODIwLAorICAgICAgIDEyNiwgICAyOTcxLCAgIC0xNTEsICAgICAxMSwgICAgIDEwLCAgIC0zNDksICAgLTI3OSwgICAtMjYwLAorICAgICAgLTI2NSwgICAgMTQyLCAgIC02ODMsICAgLTE5MSwgICAgMTcyLCAgICAgMzAsICAgLTI5MywgIC01MTAzLAorICAgICAgIC02MSwgICAtMjQ3LCAgICAtMzgsICAgIDcyMiwgICAgMjc1LCAgIC0zMjYsICAgIC0zNCwgICAgMTMyLAorICAgICAgIDI5NywgICAzMzA1LCAgICAtNDYsICAgIDIyNywgIC0xMDUyLCAgLTExMTQsICAgIDU2MiwgICAgIDYyLAorICAgICAtMTYxOCwgICAgNjk5LCAgICAzNjIsICAtMTYyNCwgICAtNDU1LCAgICAxNTAsICAgLTExMCwgICAgIDYxLAorICAgICAgLTI2NiwgICAtMTY4LCAgIC0xNjgsICAgLTM5MSwgICAgMTM2LCAgIC01NjksICAgLTc3MiwgICAtMjAzLAorICAgICAgIDQ2NywgICAgIDIwLCAgLTQ3NDcsICAgLTE3MCwgICAgMTQyLCAgIC0xMzgsICAgIDEyOSwgICAxNzE5LAorICAgICAgMTg5NiwgICAgMjEwLCAgLTEwMDgsICAgIDIwNiwgICAgNTg1LCAgIC0zMjUsICAgIDI5NSwgICAgMTc1LAorICAgICAtMjU0MiwgICAtNDg5LCAgICAxMjEsICAgIC05NCwgICAgLTM4LCAgLTI3NjYsICAgLTExNSwgIC0zMjA2LAorICAgICAgLTMwNSwgICAgMzIwLCAgIC0xNzksICAgIDUwMywgICAgIDgzLCAgICAtNzIsICAgLTEyMiwgICAgLTUyLAorICAgICAgLTE4MSwgICAgIDk4LCAgICAgMzksICAgLTUwNiwgIC0yNzUxLCAgICAtOTMsICAgICAtMSwgICAgLTU5LAorICAgICAgMjY0NSwgICAgMjQ4LCAgIC0zMDksICAgLTIwMywgICAgMTM4LCAgICAzMjQsICAgLTU2NywgICAgNjk2LAorICAgICAgLTQ5MywgICAgMTcwLCAgIDI0NDAsICAgIDkxOSwgICAtNDIwLCAgLTMwMjksICAgLTMzNSwgICAtNTkzLAorICAgICAgIC03MiwgICAgNTM2LCAgICAtODIsICAgIDIwMiwgICAgIDc4LCAgICA1MTAsICAgIDE4NCwgICAgIC0yLAorICAgICAgIDIyNywgIC0yODMwLCAgICAgMTksICAgMTU5MCwgICAtMjgxLCAgICAzODcsICAgIC00NiwgICAgNDA4LAorICAgICAgLTQ2MywgICAtNTM2LCAgICAyNjIsICAgMjIxNCwgICAtMTE1LCAgLTE2MTQsICAgLTM4NSwgICAgMjAzLAorICAgICAgICAzMiwgICAtODg1LCAgLTI2MDYsICAgMjMzOCwgICAgIDk3LCAgICAyOTIsICAgLTQ0OSwgICAgNDQ5LAorICAgICAtMTAzOCwgICAtNTgyLCAgICAgIDAsICAgIC02OCwgICAgMjExLCAgIC0xNjAsICAgICA2MiwgICAtMjg2LAorICAgICAtMjQ2NiwgICAtNDIxLCAgICAtNDgsICAgMTkwMywgIC0xMDM3LCAgIC0xNzMsICAgMTMzOSwgICAtNTkxLAorICAgICAgIDE1MiwgIC0xMjMxLCAgICA3OTIsICAgIDUyNCwgICAgMjE0LCAgICAtOTIsICAgICAyOSwgICAgMTgxLAorICAgICAgLTIyNSwgICAtMTUwLCAgICAgLTEsICAgIDEzOSwgIC04MTM1LCAgICAyMzgsICAgLTExOSwgICAgMTg5LAorICAgICAgICAzNCwgICAtMTQwLCAgIC0xODgsICAgIDE0MSwgICAtMTEyLCAgICAgNTYsICAgLTE3NiwgICAgMTU0LAorICAgICAgICA5MSwgICA1NjUzLCAgICAyOTgsICAgLTMxNiwgICAgLTIzLCAgICAyMzIsICAgIC03NCwgICAtMzE3LAorICAgICAgICAtNCwgICAtNjMwLCAgIC01MDYsICAgIDEwNSwgIC0xNjU1LCAgIC0xMjYsICAgMjQxNywgICAgMTEzLAorICAgICAgIC05NSwgICAtNDcyLCAgICAxMzQsICAgIDI5MCwgICAtNzU1LCAgICAxNTIsICAtMTIyMiwgICAgLTU4LAorICAgICAgIDk4MSwgICAtMjM2LCAgIDgxOTIsICAgLTE1NCwgICAgIDc1LCAgICAyMTgsICAgLTE4NSwgICAgMTA3LAorICAgICAgIC0xMCwgICAgIDM5LCAgICAyNjUsICAgLTIyNSwgICAgLTg3LCAgICAgIDksICAgIDEyMywgICAtOTA2LAorICAgICAgLTM4MiwgICAyNTQ0LCAgICAgNDQsICAtMTk4NSwgICAtMTAyLCAgICA0MDcsICAgIC05MSwgIC0xODM1LAorICAgICAgLTEwOCwgICAgMTIyLCAgICAxNDIsICAgIDE2OSwgICAgMTM0LCAgIC03MjEsICAtMTUzMCwgICAgIC00LAorICAgICAgLTEzMywgICAgIDQ1LCAgICAzNzQsICAtMTA0OSwgICAgLTc2LCAgICAgMTYsICAgLTM1NywgICAgMjc3LAorICAgICAgIDE1OCwgIC0yNTk2LCAgICAgLTQsICAtMTQ4NCwgICAgLTEzLCAgIDI2NjAsICAgLTE5OCwgICAgICA5LAorICAgICAgLTIxOCwgICAgNDA4LCAgICAtNjMsICAgIDE3NywgICAgLTcxLCAgIC0xOTUsICAgNDI5MywgICAgIC04LAorICAgICAgIDIyOCwgICAgIDM0LCAgIC00MjEsICAgIDY5NSwgIC0xNDA5LCAgICAgODUsICAgMjc0MCwgICAgMzUwLAorICAgICAgICA0NCwgICAgNDczLCAgICAxNDEsICAgIC05MywgICAgMTQ0LCAgICAtNTksICAgLTIyMCwgICAtMTU0LAorICAgICAgLTE0OCwgICAtMTY4LCAgIC0yMDUsICAgMzA0OSwgICAgMjI5LCAgICAxOTQsICAgLTEwNywgICAgIDkwLAorICAgICAgLTM1MywgICAgNTA4LCAgIC0zNDMsICAgIDQ3MywgICAtNDQ2LCAgICA0NTcsICAgLTQ1MiwgICAtMTE2LAorICAgICAgMzQ5MywgICAgNTA0LCAgIDIxNTIsICAgLTIyOCwgIC0xODMyLCAgIC00NjMsICAgLTY1NywgICAgNTU1LAorICAgICAgIDY1NywgICAgNTQwLCAgICA1NDYsICAgIDYwNCwgICAyMjE0LCAgICAtNjgsICAgIDI1NCwgICAgNTYzLAorICAgICAgIDI2NywgICAgMjI3LCAgICAgOTIsICAgLTEwNywgICAgMTQzLCAgICAyNjAsICAgICAyMywgICAgIDQyLAorICAgICAgICA2NCwgICAgLTY3LCAgICAxMzgsICAgLTE2NywgICAgIDcyLCAgICA0NTcsICAgNDk1OCwgICAgIDYxLAorICAgICAgLTkzMywgICAgICAxLCAgIDUzNDEsICAgIC0zMiwgICAgIDg5LCAgICAxNjEsICAgIDUwNCwgICAgODIzLAorICAgICAgIDMxMSwgICAgIDExLCAgIC0xODQsICAgLTU3NCwgICAgLTc5LCAgLTE2NTQsICAgIC03NCwgICAtMzY2LAorICAgICAgIDE2NCwgICAtMzYzLCAgICAxMTcsICAgICA1MywgICAgNzA2LCAgIC03MDEsICAtMjk2NiwgICAgMjMzLAorICAgICAgICAxMSwgICAgMTY1LCAgICAzOTQsICAgIDQ2MiwgIC0yNjMyLCAgICA3MDMsICAgLTI5MSwgICAgLTY1LAorICAgICAgIC00OSwgICA0MDgwLCAgIC04NjIsICAgIC02NSwgICAgLTE5LCAgIC0xMTAsICAgLTg3MiwgICAgMzIzLAorICAgICAgIDgzMywgICAtMTU0LCAgICAzNjksICAgIDQ3NSwgICAyMjExLCAgICAgMjAsICAgLTIxMiwgICAxNzExLAorICAgICAgIC0yNCwgICAgLTI4LCAgICAtNTgsICAgICAzMiwgICAxNzQ2LCAgICAgNDEsICAgLTc3OSwgICAgNjE0LAorICAgICAgIDUwOCwgICAzMDUwLCAgICA2ODcsICAgIDQyMywgICAtMTgyLCAgIC00ODQsICAgIC02MCwgICAgMjQyLAorICAgICAgMzg5NSwgICAtNTY1LCAgIC00NTMsICAgIDExMCwgICAgNTQ3LCAgIC05NjEsICAgIDMyMCwgICAgLTM0LAorICAgICAgLTM0NywgIC0xOTYzLCAgIC0xMTYsICAgIDczMCwgICAtNDM1LCAgICAtMzQsICAgICA0MSwgICAgIDI2LAorICAgICAgIC01MSwgICA4MTkyLCAgIC0xMTUsICAgIDMxMiwgICAgMTg0LCAgIC0xNDgsICAgLTE5OSwgICAgMTU3LAorICAgICAgIDE1MywgICAgIDgyLCAgICAgOTksICAgIDEzOCwgICAgLTMyLCAgICAtMTksICAgIC02NCwgICAtMTM5LAorICAgICAgIDEwNywgICAgIDQzLCAgICAxMzMsICAgIC04NywgICAgIDQyLCAgIC0xNDgsICAgNzA4MCwgICAtMTU4LAorICAgICAgLTMzNSwgICAtMjQ5LCAgICAtNjQsICAgICA4MSwgICAgMTU3LCAgICA4MTMsICAgLTI3OSwgICAyMjI2LAorICAgICAgIC0xNiwgICAxMTkxLCAgIC03MDUsICAgIDYwNywgICAgMjA1LCAgICAtMTEsICAtMTM0MSwgICAtNTQ4LAorICAgICAtMjI1MSwgICAtMzI2LCAgIC0xNDksICAtMjUzNiwgICAgMTM5LCAgIC03NTAsICAgICA3MywgICAtMzk0LAorICAgICAgLTIxOCwgICAgLTM1LCAgICAxODEsICAgIDkyNSwgICAtNTU3LCAgICAyMjYsICAgIC02MywgICAyNTgyLAorICAgICAgLTczNywgICAgMTY0LCAgICAxODEsICAgLTE2NywgICAtMjMwLCAgICA0MTMsICAgIDMyOCwgICAgNDA2LAorICAgICAgLTI4NywgIC0yOTkyLCAgICA1MzksICAgMTEzMywgICAgLTg1LCAgLTIxNjIsICAgLTE1NCwgICAtMzU3LAorICAgICAgLTI0NSwgICAgIC04LCAgICAxNjIsICAgLTExOCwgICAgMTExLCAgIDEyNzUsICAgICA0NywgICAtMzE0LAorICAgICAtMjA0MywgIC0yNzMyLCAgLTEwNTIsICAgIC0yOCwgICAgNjI1LCAgIC04MTAsICAgLTQ4NywgICAgIDQwLAorICAgICAgLTEzMSwgICAgMjczLCAgICAxMDUsICAgMjYwNSwgIC0yOTc0LCAgICAyNjgsICAgIC0xOSwgICAtMjU3LAorICAgICAgIDg0MiwgICAtNjYyLCAgICA4NTUsICAgIDUwNSwgICAgNTkwLCAgIC0yNDMsICAgICA2OCwgICA2OTc4LAorICAgICAgIDExOCwgICAtMTAxLCAgICAzNDksICAgLTIzMiwgICAtMjU4LCAgIC0zMTgsICAgIDIxMiwgICAgIDU1LAorICAgICAgLTY4NiwgICAtMTc3LCAgIC0xNzMsICAgLTEwMiwgICAgNDgwLCAgICAgMzUsICAgIDE0OSwgICAgMjYzLAorICAgICAtMjgzOCwgICAtMTk4LCAgICA5NDIsICAgIDM5MiwgICAgMTM1LCAgIDI5ODAsICAgICAzNCwgICAgIDkyLAorICAgICAgLTIzNywgICAtNjcyLCAgICAyMjQsICAgLTI5OCwgICAgMjk4LCAgIDIxMjgsICAgIDM1OSwgICAgMjU0LAorICAgICAgIDE1MCwgICAtODM5LCAgIDEwMDEsICAgMzIzNCwgICAtMTY5LCAgICAyNjEsICAgLTMwMiwgICAgIDc0LAorICAgICAgLTI3NywgICAgNDk4LCAgICAzMjEsICAgIDE5NCwgIC0zMjc1LCAgIC0xNTIsICAtMjc4NiwgICAgIDMzLAorICAgICAgICA3MCwgICAgMjM2LCAgIC0yMjIsICAgICA4OCwgICAtMzkzLCAgICAgNDcsICAgLTYzNiwgICAgODY5LAorICAgICAgLTc1NCwgICAgODQyLCAgLTIzMjYsICAgLTQ2MCwgICAgMTMzLCAgICAgIDAsICAgIDI2NCwgICAgMTcyLAorICAgICAtMjk1NSwgICAtMjg2LCAgIC0yNDMsICAgIDM5OSwgICAgODgyLCAgIC03MjIsICAgLTM4MiwgICAgODcyLAorICAgICAgLTExOSwgICAgLTY1LCAgLTI0MDMsICAgLTExOSwgICAtMjQ2LCAgIC04OTAsICAgLTE4NSwgICAgMTAyLAorICAgICAgIC0zMiwgICAtNTczLCAgICAyMjUsICAgMzA0NCwgICAtNDg0LCAgICAtNDAsICAgLTgwOSwgICAgNDAzLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IyMjI0bDBbXSA9IHsKKyAgICAgLTM1NDYsICAgLTQzMywgICAgLTc2LCAgICAgNDYsICAgICAyNCwgICAtNjQxLCAgICAyMTQsICAgIDExNCwKKyAgICAgIC03NzksICAgLTkzMCwgICAgLTU3LCAgIC00NjIsICAgLTU2OSwgICAtODQ4LCAgIC00MTMsICAgICA1MywKKyAgICAgICAgNDUsICAtMzE3MiwgICAyOTE1LCAgIC03MzQsICAgIDE1MiwgICAgNDg3LCAgIC0xMTMsICAgIDI0NiwKKyAgICAgIC0xOTYsICAgLTE4NywgICAtMTM2LCAgICA0NjksICAgIDQ3NSwgICAgMzgyLCAgICAyMTMsICAgLTg4NiwKKyAgICAgIC0yNzUsICAgIDMxMywgICAzMTQ4LCAgICAtNjIsICAgLTc3MywgICAgNzg1LCAgICAtMjQsICAtMTQ5OSwKKyAgICAgICAtNjUsICAgLTE3NSwgIC0xOTQyLCAgIC0zMjUsICAgICA3OCwgICAgLTE1LCAgICAtMzgsICAgICAgMiwKKyAgICAgICAgIDYsICAgIC0yOSwgICAgLTE2LCAgIDk2OTAsICAgIC0xNSwgICAgLTQ5LCAgICAtMTMsICAgICAxMiwKKyAgICAgICAtMjEsICAgICAxMSwgICAgLTQ1LCAgICAtNjMsICAgLTUyOCwgICAgMTkyLCAgIC0xMzcsICAgIDIwMSwKKyAgICAgICAxMzgsICAgLTE1NCwgICAgIDU3LCAgICAtODgsICAtMTY5NSwgICAgMTU1LCAgICAxMDUsICAgIDEyMSwKKyAgICAgIDQyNDksICAgIC01OSwgICAgNDY3LCAgIC00MzksICAgNDQ4MywgICAtMTMwLCAgICAtMzksICAgIDI2MiwKKyAgICAgICAtMjEsICAgLTM3NywgICAgNDQxLCAgIC0zNTMsICAgLTc2OCwgICAgMzY2LCAgICAgMjMsICAgIDg0MSwKKyAgICAgICA1MjksICAgIDE5NSwgICAyNzIyLCAgIDI4OTIsICAgLTI1NSwgICAgLTY3LCAgICA2MjgsICAgLTQ5OCwKKyAgICAgICAgMzMsICAgIDI0MSwgICAgMjEyLCAgLTEwMjAsICAgIC05NywgICAtNzIzLCAgICA1OTQsICAgICAzNSwKKyAgICAgICAtMzEsICAgMTQ1OSwgICAgIDE5LCAgICAtNzUsICAgIC0yNywgICAgIC0xLCAgICAgNDgsICAgICAyOCwKKyAgICAgICAyNjcsICAgLTI3NSwgICAzNzgwLCAgIC01MTUsICAgLTQ2NywgICAgIDM2LCAgIC00MDUsICAgLTI3MiwKKyAgICAgLTE5NjgsICAgICA2MCwgICAgIDQ0LCAgICA0NDksICAtMjg3NywgICAtMTI0LCAgLTE1MjQsICAgMTE5NSwKKyAgICAgIDEwNDIsICAgIDExNywgICAgMTE1LCAgIC0zMDUsICAgIDIyNSwgICAgMjE1LCAgIC0zNTcsICAgIDE0NCwKKyAgICAgICAgMzUsICAgIC0yMywgICAgIDg5LCAgIDIxMzMsICAgICAgMiwgICAgIDY1LCAgICAtMjcsICAgIC00OCwKKyAgICAgIC0yNDMsICAgLTIxNiwgICAtODA3LCAgICA3MDAsICAgMTI1OCwgICAgICA2LCAgIC0xNDAsICAgICAgNCwKKyAgICAgICAtMzEsICAgIC0yMSwgICAgIDQyLCAgICAgNjcsICAgICA5NywgICAgIC0yLCAgICAxMDQsICAgIC0xMCwKKyAgICAgLTc3MzQsICAgIDEzNCwgICAgLTUwLCAgICAtOTUsICAgIC04OCwgICAtMjY5LCAgICAxMDUsICAgIC0xOCwKKyAgICAgIC0yMjksICAgIDQ1MywgICAxMDM4LCAgLTI2MDksICAtMjk0NCwgICAgLTU3LCAgICAgMjcsICAgIDM3MiwKKyAgICAgICAgNTksICAgLTU1NiwgICAgLTg3LCAgIC0yNDIsICAgIDExNCwgICAxMDgzLCAgIC0xMTksICAgLTEzOSwKKyAgICAgICAxNzUsICAgIDE0NiwgICAgLTU1LCAgIDE2ODksICAgIDM0MiwgICAgNTAxLCAgIDI3MjIsICAtMTI3MywKKyAgICAgIDE2MjYsICAgIDg2OCwgICAtMjkwLCAgIC0xNDUsICAgICA2MiwgICAgMTk0LCAgICAtMjMsICAgLTE3OSwKKyAgICAgIDE1NDAsICAgIC04NSwgICAgMzYwLCAgICAyNTQsICAgIDMzOSwgICAtNjgxLCAgIDIwODEsICAgMjczMCwKKyAgICAgICA4MzgsICAgLTEyOCwgICAgIDMxLCAgLTIxMzMsICAgLTE3MywgICAgNDgzLCAgIC0xMzgsICAgMjcwNiwKKyAgICAgIDIwMDcsICAgICA5MSwgICAgMjkzLCAgIC02NDIsICAgICAzNSwgICAgMjgwLCAgIC0xMzIsICAgIDQ1NCwKKyAgICAgICAtNjYsICAtNjI2MywgICAgLTI0LCAgICAgODIsICAgIC0zMSwgICAgLTM5LCAgICAgIDUsICAgICA0MSwKKyAgICAgICAgNjYsICAgIDIzOSwgICAgIDE4LCAgICAtNTcsICAgICA2MSwgICAtMTE3LCAgICAxMDMsICAgICAxNiwKKyAgICAgLTEyMzEsICAgMTM4NCwgICAtMTY0LCAgICAxMDQsICAgIDM3MCwgIC0xODkxLCAgIDIyMzcsICAgLTQ0MCwKKyAgICAgLTEzOTksICAtMTM5NCwgICAgICAzLCAgICAyNzQsICAgIDIyMywgICAgLTMwLCAgICAtNzAsICAgIDU3OSwKKyAgICAgICAzNjEsICAgIDQyMywgICAgMzU1LCAgIC0xNzYsICAgLTE2NCwgICAtNDQzLCAgIC0zMDYsICAtMjM4MiwKKyAgICAgICA3MTMsICAtMjk4NywgICAtMzQwLCAgIC02OTEsICAgMTQwNywgICAgIC01LCAgICA0MzksICAgLTI2NCwKKyAgICAgICAtODYsICAgMTk2NCwgICAgLTE3LCAgICAgODgsICAgIDE3NSwgICAgIDU2LCAgIC0xMTksICAgICAzMSwKKyAgICAgICA0NjYsICAgMTk4MCwgICAgMTc2LCAgICA1MTMsICAgMTgwOSwgICAgIDE3LCAgIDMwMDAsICAgMTg2MSwKKyAgICAgICAtNzEsICAgIDMxNCwgICAtMjU1LCAgIDIwNDEsICAgIDU3NiwgICAgMjAzLCAgICA0NDMsICAgLTM5MiwKKyAgICAgIC01MzksICAgLTM4MCwgICAtNjg1LCAgIC0yMDQsICAgLTE2MSwgICAgMjg3LCAgICAzNzgsICAgLTUwMiwKKyAgICAgIDE4OTgsICAgMTU0MCwgICAxMDczLCAgIDIyODIsICAgIDU3MywgICAgODY3LCAgICAxMjIsICAgMTA2NCwKKyAgICAgIC02MjgsICAgLTU2NCwgICAgIDk3LCAgICAyODAsICAgIC0zNiwgICAxNjAxLCAgICAtOTAsICAgLTE3NCwKKyAgICAgICAtMTAsICAgICA0NSwgICAgLTU3LCAgICAxNTksICAgLTQ5NiwgICAgNjQxLCAgIC05NTksICAgIC05MSwKKyAgICAgICAtOTAsICAgMzA1NywgICAxNjgwLCAgICAtODMsICAgICA4MCwgICAgIDE5LCAgICAgNjMsICAgLTExOSwKKyAgICAgICAgIDEsICAgIC03MiwgICAgNDY2LCAgIC0zMzUsICAgIDQ1MywgICAtMTc3LCAgIDM5MzAsICAgIC0yMSwKKyAgICAgICAzMjcsICAgLTE5OSwgICAtNjUxLCAgICAtMzgsICAgICAtNiwgICAgLTEzLCAgICAgIDcsICAgIC03NywKKyAgICAgICAgIDEsICAgICAgOCwgICAgIDQwLCAgIC0xMjUsICAgICAzNiwgICAtMTM2LCAgICAyNzIsICAgNjI2NiwKKyAgICAgLTMyOTksICAgMzMzMSwgICAgIDI0LCAgICAgMTgsICAgIC03MSwgICAgICA5LCAgICAtNzksICAgLTM3NCwKKyAgICAgIC0yNzcsICAgIDEyOCwgICAtMjMzLCAgIC0xNzUsICAgLTM1MCwgICAtMjE2LCAgICAgODEsICAgLTY5MywKKyAgICAgICAtNDksICAgICAzMywgICAgLTQ0LCAgICAtMzcsICAtNDI2MCwgICAgLTcwLCAgICAgOTYsICAgIDE3NywKKyAgICAgIC0zMTksICAgIDEzMywgICAgMTc4LCAgIC0zNzcsICAgIC00NSwgICAgMTgyLCAgICAxNTYsICAgLTE1NSwKKyAgICAgICAtMzQsICAgICAxMCwgICAgIDIyLCAgICAgNTMsICAgLTIxMSwgICAgICA0LCAgIDU3NDAsICAgICA0OCwKKyAgICAgICAtNDIsICAgIDExNCwgICAgMTQ5LCAgICAtMzAsICAgIDEyMiwgICAtMTA2LCAgIC0zMDksICAgLTE0OCwKKyAgICAgICAtODIsICAgICAyMCwgICAgMTMwLCAgIDI3MzQsICAgIC00MCwgICAtNTk2LCAgIDEzMDksICAgMTE2MywKKyAgICAgLTE0NzAsICAgIDM5NiwgICAtMjY0LCAgICA4ODQsICAgIDE0MiwgIC0xODE4LCAgICAgNjcsICAgICAtMSwKKyAgICAgICAgMzgsICAgIC01MiwgICAgLTczLCAgICAgIDEsICAgIDI3OSwgICAgMTQzLCAgICAyNzgsICAgIC00NSwKKyAgICAgIDE1NDEsICAgLTg4NiwgICAtNjc3LCAgLTI2MDksICAgIC04OCwgIC0zNzY2LCAgIC0yMDEsICAgIDIzNywKKyAgICAgICAtNDAsICAgIDE5NSwgICAgLTUwLCAgIC0zNjYsICAgICA4OCwgICAgMTY2LCAgICA0MDMsICAgIDIzNiwKKyAgICAgIC0xMzAsICAgIDIwNSwgICAgLTQ1LCAgLTg2MzYsICAgIC0xMywgICAgLTI3LCAgICAtNTAsICAgICAgOCwKKyAgICAgICAgNDAsICAgICAyMSwgICAgIDQxLCAgICAtMzYsICAgIC0yNSwgICAgLTQwLCAgICAtMTQsICAgIC0xNCwKKyAgICAgICAgNDIsICAgIDI5NiwgICAyNDk1LCAgICAzNzIsICAgLTM2MSwgICAtNTAxLCAgIDE5NTEsICAtMjE0MSwKKyAgICAgICAyMjAsICAgLTg0NywgICAgIDk4LCAgICAyMjgsICAgLTI1MCwgICAgNTYzLCAgLTExMjEsICAgIC0yOSwKKyAgICAgIDI4ODgsICAgLTE5NiwgICAgMTUxLCAgICAtMTksICAgLTI4NywgIC0yMjk4LCAgICAgNjUsICAgLTQ4MiwKKyAgICAgIC0xMjQsICAgLTE4NiwgICAxMjE1LCAgICA0NjgsICAgLTc4MSwgICAtMjI3LCAgICA2MjEsICAgIDI5OCwKKyAgICAgICAtNDIsICAgIC00NCwgICAtMTE1LCAgICAgIDAsICAgICA1MCwgICAgMTc5LCAgICAgMjMsICAgICAgOSwKKyAgICAgICAtNjUsICAgICAtOCwgICAgIDEwLCAgIC0xMDEsICAtNDk5OCwgICAgIDc3LCAgIDExODEsICAgLTMwNCwKKyAgICAgICAxMzksICAgIDI1MCwgIC0yMjU3LCAgICAtOTcsICAgIDg0NywgICAgNDMzLCAgICAzODUsICAtMjQxMSwKKyAgICAgICA4MDAsICAgLTg1MiwgICAtNTI4LCAgICA0MzUsICAgLTk1MywgICAgLTIzLCAgICAgIDQsICAgIDkyOCwKKyAgICAgIC0xMDgsICAgLTYzNCwgICAtMjczLCAgIC04NzksICAgMjU2NiwgIC0yNjA5LCAgICA2MjEsICAgIDgwNywKKyAgICAgICAyOTUsICAgIC03NywgICAgNjI3LCAgLTExMTQsICAgLTI5NywgICAtMTA5LCAgIDIxMDMsICAgIC01MywKKyAgICAgICAgLTksICAgICA0NCwgICAgIDMyLCAgICAzMzksICAgIDY3OSwgICAgIDc3LCAgLTMxODYsICAgLTQxNiwKKyAgICAgIDEyMzQsICAgLTgwMSwgICAgNDcyLCAgICA0MDgsICAgIDE1MywgICAgNDY1LCAgIDE3MDMsICAgIDg3OSwKKyAgICAgLTI0MTEsICAgLTU1MywgICAgNDQwLCAgIDIwOTksICAgLTg5OSwgICAtMjg4LCAgICAzMTAsICAgIDY2NSwKKyAgICAgICAtNDcsICAgLTE0OCwgICAxNDU3LCAgIDM5MzIsICAgLTIxMywgICAgMjQzLCAgLTE3NjMsICAgICAtMiwKKyAgICAgICAyODgsICAgLTQyNSwgICAtOTcyLCAgICA0NzgsICAgLTMwMiwgICAgNTUyLCAgIC0zNzcsICAgLTM1MiwKKyAgICAgICAxNzksICAgLTQ4MCwgICAxNDY2LCAgIDIwMTksICAgMjgxNywgICAgICA1LCAgICA4MjQsICAgICAxMywKKyAgICAgIC0zODQsICAgLTU4MiwgICAtMjk3LCAgLTExNjUsICAgIDY4OSwgICAtMTIwLCAgICA3MDMsICAgLTExOCwKKyAgICAgICA2NjMsICAgIDIwNiwgICAgLTQ5LCAgLTI4NTMsICAgIC03NiwgICAgIDMyLCAgICAxNzAsICAgICAxMSwKKyAgICAgICAgNDIsICAgLTUwMywgIC0xMTM5LCAgIDE1NDgsICAgLTI4NywgIC0xMTEyLCAgICA3NjUsICAgLTQ1NSwKKyAgICAgICAtMzUsICAgMjQ1MiwgICAgIDIyLCAgIC0xMzQsICAgIDE0NCwgICAxODY3LCAgIC0xNDksICAgMjc3MSwKKyAgICAgICAgMTksICAgIDI2NCwgICAgNzAwLCAgICAtNDgsICAgIDI4NiwgICAtNTkzLCAgLTI2MzcsICAgIDQwOCwKKyAgICAgIDIzMDQsICAgIC0xNCwgICAgMTg3LCAgIC0xMzUsICAgLTIxMCwgICAgNzQ1LCAgICAyODIsICAgIDcyNCwKKyAgICAgICA4NjEsICAgICAyMSwgICAtNDE0LCAgICA2MDYsICAgIDgzNiwgICAtNTY0LCAgICAyMTIsICAgIDIwMywKKyAgICAgICAgNjQsICAgNDcwNiwgICAgLTMwLCAgICAtNDMsICAgIC04NSwgICAgLTYxLCAgICAtOTAsICAgIDY0NCwKKyAgICAgIC0yODEsICAgIDI4NywgICAtMTIyLCAgIC0zNDAsICAgLTEzNywgICAgIDM2LCAgICAgLTQsICAgIC0yMiwKKyAgICAgICAgIDgsICAgOTQ4NiwgICAgIC0zLCAgICAgIDQsICAgICAxMCwgICAgICA0LCAgICAgODYsICAgICA1OCwKKyAgICAgICAgLTgsICAgICAgNiwgICAtMTA1LCAgICAtMTUsICAgICAxNSwgICAgLTYzLCAgICAtNTgsICAgIC0zMCwKKyAgICAgICAgMTUsICAgICAgMCwgICAgLTE5LCAgICAgNzgsICAtODI2NywgICAtMTM0LCAgICAgLTgsICAgIC00NSwKKyAgICAgICAxNjMsICAgIC0xOSwgICAgMTQ5LCAgIC0yOTgsICAgLTE2NywgICAgIDM0LCAgICAxOTAsICAgIC0zOSwKKyAgICAgLTIyMjksICAgMjgyMSwgICAgMTI2LCAgICAxODUsICAgLTc5MSwgIC0xMjI5LCAgIDEwMDMsICAgLTMzMSwKKyAgICAgICA5ODAsICAgIDY1OSwgICAgLTYwLCAgICAtNjAsICAgIC00OCwgICAgIDIwLCAgICAgMTIsICAgLTE2NywKKyAgICAgICAtNjAsICAgIC0zOSwgICAgIDY2LCAgICAxODAsICAgIC0yMiwgICAgLTIwLCAgICAgODQsICAgLTEwOCwKKyAgICAgICAxMzEsICAgIC0xMCwgIC04NDkzLCAgICAgLTEsICAgIC0xOCwgICAgIC00LCAgICAtNTMsICAgICAyNSwKKyAgICAgICAtNjMsICAgIC0xNCwgICAgIDIwLCAgICAgMjUsICAgIC00MSwgICAgIDQwLCAgICAgLTUsICAtMjMzMCwKKyAgICAgICAtNzQsICAgICA1OSwgICAgIC03LCAgIC0xNTQsICAgLTI5MywgICAgLTY0LCAgLTI3MDIsICAgIDgxOSwKKyAgICAgICAgNzUsICAgIDk3NywgICAtNjAyLCAgIDExMzgsICAgIDE2MCwgICAgMjYyLCAgICAgMjYsICAgIC04MSwKKyAgICAgICAgMTgsICAgNTU1OCwgICAgMTE4LCAgIC0xNjcsICAgICA5OCwgICAgMTEwLCAgICAgLTUsICAgIC00NCwKKyAgICAgICAtMjcsICAgICA3MiwgICAgIDUxLCAgIC0xODksICAgICAgMCwgICAxODY4LCAgICA3NDMsICAgLTI3NSwKKyAgICAgIDI1MzAsICAgICAgNiwgICAgMTgwLCAgLTEwMTksICAtMTMwNywgICAgNzEwLCAgICAzMDMsICAgLTE1MiwKKyAgICAgIC0xMTUsICAtMTQ5OCwgICAtNTAxLCAgIC00OTUsICAgLTEwMywgICAgLTc2LCAgICAgNzgsICAgICAtNywKKyAgICAgLTkzMzcsICAgICAtNiwgICAgIDMxLCAgICAtMjEsICAgICAxNiwgICAgLTE0LCAgICAgNTcsICAgICAzNiwKKyAgICAgICAtODEsICAgIC02NywgICAgLTMwLCAgIC01MzUsICAgIDIxNiwgICAgMzEzLCAgICAzMTAsICAgLTE1NywKKyAgICAgIDI4MzAsICAgLTkxNCwgICAgMTIyLCAgIDEzNTMsICAtMTg0MiwgICAgMjk4LCAgLTExNjUsICAgIC0xMywKKyAgICAgIC0yNTMsICAgLTEwMCwgICAtNTYwLCAgICAtNjEsICAgICA0MCwgICAgIDI0LCAgICAgIDMsICAgICA1NiwKKyAgICAgICAtMTgsICAgNTcwOSwgICAgIDQxLCAgICAgMTMsICAgIC0yMywgICAgLTU1LCAgICAtOTgsICAgIDIxNCwKKyAgICAgICAxMDksICAgLTIwNSwgICAgLTQ1LCAgICAgMjcsICAgIC0yNiwgICAgMTc3LCAgIC0yOTAsICAgICA4OSwKKyAgICAgICAgIDgsICAgMTMxNSwgICAzMTAyLCAgIDE2NTcsICAgIDIxMCwgIC0xMDMyLCAgICA3NzQsICAgLTIxMSwKKyAgICAgIC01ODEsICAgIC01MSwgICAgODk2LCAgICA4NTIsICAgIDMzMSwgICAgMzQ5LCAgIC00NzQsICAgLTExOSwKKyAgICAgIC04NjUsICAgLTE0NSwgICAyMjcwLCAgICA3MDMsICAtMTk2NywgIC0yMDg4LCAgICA2MTAsICAgLTcwMCwKKyAgICAgICAxMTMsICAgLTIzMSwgICAyMDYyLCAgIC0xNTIsICAgLTU5OSwgICAtNDc0LCAgICAtMzgsICAgLTYwMSwKKyAgICAgICA0MzIsICAgLTk4MywgICAtNzMxLCAgICA3NDQsICAtMjg4MCwgICAgMTU2LCAgIC0yNDAsICAtMTkwMywKKyAgICAgIDI0OTcsICAgIC04OSwgICAtOTYzLCAgLTIxNzksICAtMTIwOCwgICAgMTg5LCAgICAzMTgsICAgIDE1MCwKKyAgICAgICAyMDQsICAgICAyOSwgICAtMTY3LCAgIC0xMzgsICAgIC05MywgICAgIDczLCAgICAyOTIsICAtMzIyNSwKKyAgICAgIC0zMTAsICAgLTUxMCwgICAgMTczLCAgICAtOTAsICAgIDE1NCwgICAxODMxLCAgICAzODAsICAtMTE5MSwKKyAgICAgIC05NzYsICAtMTQ2MCwgICAtNTE0LCAgICAyMzUsICAgICAxMywgIC0yOTUwLCAgICAgMjIsICAgIC05NSwKKyAgICAgICAyMjgsICAgICA4NSwgICAgIDEwLCAgICAyNjQsICAtMzE2NSwgICAgIDQ2LCAgIC0xODQsICAgLTc4MiwKKyAgICAgICAxNDMsICAgICAtOSwgICAgIDM3LCAgICAgMTIsICAgIDEwOCwgICAgLTY1LCAgICAtNjQsICAgIDExNSwKKyAgICAgICAgODYsICAgNTAzOSwgICAgLTU1LCAgIC0yMDMsICAgLTE2MywgICAtNDYyLCAgICAgNzcsICAgIC05MiwKKyAgICAgICA0MjMsICAgIDEzOSwgICAgMjM5LCAgICAgLTUsICAgMTg4NywgICAgNDI2LCAgICA3MjksICAgIDExOCwKKyAgICAgIC0xNTksICAtMjgyMSwgICAtMTI0LCAgIDIxNDcsICAgLTE2NywgIC0xMDIzLCAgICAgOTIsICAgIC0yMywKKyAgICAgICAxNjIsICAgLTE1OSwgICAgLTQ3LCAgICAgLTMsICAgICAxNCwgICAgLTM0LCAgICAgMzcsICAgIC0yOSwKKyAgICAgICAtOTcsICAgICA0MSwgICAgLTkyLCAgICAtNzUsICAtNjk4MywgICAtMjI0LCAgICAyNTAsICAgIC04MCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMjIyNGwxW10gPSB7CisgICAgIC0yODg4LCAgIC0xODMsICAgMzYwNiwgICAgICAwLCAgICAgMzMsICAgICA5OSwgICAgLTc2LCAgIC0yNjQsCisgICAgICAtMzUxLCAgIC01MDgsICAgLTU0NiwgICAtMTAzLCAgICAyNTIsICAgIC00OSwgICAgIDQ2LCAgICAtMzIsCisgICAgICAgIDQ4LCAgIC0yNDUsICAgICA2NywgIC0yNDA4LCAgICAzNDAsICAgMzE1MywgICAtMTU0LCAgIC0yODAsCisgICAgICAtNDQwLCAgICAzNzQsICAgLTIyNCwgICAgLTM5LCAgIC03MjAsICAgLTI4OSwgICAtMTM2LCAgLTMwOTUsCisgICAgICAgLTk4LCAgICAtMzcsICAgIC04NiwgICAgMTQ1LCAgICAgNTEsICAgIDEzMiwgICAgNzczLCAgLTExNTgsCisgICAgICAtMzMwLCAgIC00NDksICAgLTE0MSwgIC0xODMxLCAgICA2NjYsICAtMjY4MCwgICAtMTEwLCAgIC05MDYsCisgICAgICAtMzA3LCAgLTMyOTksICAgIDI4NywgICAgIDU1LCAgIC01MjEsICAgLTE3MywgICAtNDMxLCAgIC0zODMsCisgICAgICAgIDY3LCAgICAtMjgsICAgICAzNCwgICAgMjQ3LCAgIDI4MTQsICAgMTQ3OSwgICAgIDMyLCAgLTIxOTYsCisgICAgIC0xNjI1LCAgICAxMzUsICAgICA3MiwgICAgICAzLCAgICA2MzQsICAgICA3NiwgICAgNTAyLCAgIC0zMDYsCisgICAgICAtMzY2LCAgIC0xMjAsICAgLTIxOSwgICAxOTM0LCAgICAzNzIsICAgLTEzMCwgICAtMTEzLCAgICAyNTUsCisgICAgICAgLTE0LCAgICAgMzAsICAgLTY4NywgICAtNTc2LCAgICA3OTcsICAgIDMwNiwgIC0yMzYwLCAgIC0yNDIsCisgICAgICAyMDYyLCAgICAgNjksICAgMjI3MywgICAgIDI2LCAgICAtMjAsICAgIC0yMSwgICAgLTY4LCAgICAtNjksCisgICAgIC00NjE4LCAgICAgNjAsICAgLTE3MSwgICAtMjM1LCAgIC0yNzEsICAgIDE3NSwgICAtMTEwLCAgICAxNDcsCisgICAgICAgMTAwLCAgIDE2MjgsICAgLTE5NywgICAgIC0yLCAgLTQwMDIsICAgIDUyMCwgIC0xMjM2LCAgICAtMjEsCisgICAgICAgIDYyLCAgIC0zOTYsICAgIDUxMywgICAtMzY5LCAgIC0xNjgsICAgIDI4NSwgICAgNTYxLCAgICAxMzEsCisgICAgICAxMzQ3LCAgICAgODMsICAgLTEwMSwgICAgIDg5LCAgICAyMDYsICAgICAgNSwgICA0NTU2LCAgICAtMjMsCisgICAgICAxMTkxLCAgICAgMzksICAgIDM1MiwgICAtMTU4LCAgICAgOTksICAgLTE5NSwgICAgLTMzLCAgICA0ODEsCisgICAgICAtNDQ2LCAgIC0xMjUsICAgIDE4MSwgICAyNjc4LCAgIDI4NjAsICAgLTUyNCwgICAtMjM5LCAgICAgNTUsCisgICAgICAtMzYwLCAgIC0zNTgsICAgLTU2MCwgICAgIDkzLCAgICAzMDcsICAgIDI4NSwgICAgIDc3LCAgIC0yOTUsCisgICAgICAgLTkwLCAgICAxMTQsICAgIC00NSwgICAgIDU0LCAgIC0zMjgsICAgICA5NCwgICAtMjIyLCAgICAtMzAsCisgICAgIC01MDA0LCAgIC0xNjQsICAgIDEwMCwgICAgMzc5LCAgICAyMDgsICAgIDQyNCwgICAgLTExLCAgICAgMjYsCisgICAgICAgIDEwLCAgICAtMjYsICAgIC0zMiwgICAgMTE0LCAgICAgMzAsICAgICAxOCwgICAgLTQ0LCAgIC0yMjEsCisgICAgICAtMTg0LCAgICAtMzIsICAgICAgMCwgICAgLTk5LCAgLTkwMDEsICAgICAtNywgICAgLTMzLCAgICAgIDEsCisgICAgICAgIDQxLCAgICAgLTMsICAgICAxMywgICAgICA5LCAgICAtNDYsICAgIC04NiwgICAgIDQ3LCAgICAgNTYsCisgICAgICAgIDcyLCAgICAgLTcsICAgICAgNSwgIC0xMTYyLCAgICAxMDEsICAgIDQ1NiwgICAtMjE3LCAgIDM0NDAsCisgICAgICAtMjIwLCAgICA0MDAsICAgIDEwMCwgICAxNTAzLCAgICAzNjUsICAgIDY1NSwgICAtMjMwLCAgICAgNDIsCisgICAgICAxMTI5LCAgICA3NjcsICAgIDE5MiwgICAgLTE2LCAgLTM0NDAsICAgIC03OSwgICAtMjM2LCAgICAgIDMsCisgICAgICAgLTgwLCAgICAgNTEsICAgIC0xMSwgICAtOTg0LCAgIC0xNDIsICAgICAyOSwgICAgNTU0LCAgICAzMzksCisgICAgICAxODUxLCAgICAxMDUsICAgLTI3OSwgIC0yOTE1LCAgICAxMTYsICAgMzA5MCwgICAtNDMxLCAgICAyMzMsCisgICAgICAgMzM3LCAgICAgNjEsICAgIDkyNywgICAgIDMyLCAgIC0xNzQsICAgIDIzNywgICAgMjU1LCAgIC0yNTAsCisgICAgICAgNjA0LCAgICAxMTUsICAgMjAzNiwgICAgIDc4LCAgICAtNzksICAgIC01MCwgICAtMzQ5LCAgICAzMzgsCisgICAgICAgMjg1LCAgICAxNjksICAgIDM5NCwgICAgLTQ5LCAgIDExOTQsICAtMjk2NiwgICAgNDQ3LCAgICAgNTcsCisgICAgIC0yNTkxLCAgICA0MTUsICAgLTU4NiwgIC0yNjE2LCAgIC0xOTcsICAgIC02MSwgICAgNTk2LCAgLTExNTksCisgICAgICAgMTMwLCAgIC00NDEsICAgIDM1NiwgICAgIDQ3LCAgIDExOTIsICAgIDQ5NiwgIC0xODAxLCAgICAtMTUsCisgICAgICAtMTQyLCAgICAtMjMsICAgIDEzMiwgICAgIDIxLCAgICAgODQsICAgIDIzNCwgICAtMTM3LCAgICAgMjMsCisgICAgICAtMTQ3LCAgLTMyNTQsICAgIDQwNywgICAgMTA3LCAgIDExMzIsICAgIDEzMCwgICAgIDc0LCAgICAxNTMsCisgICAgICAzMTQ4LCAgIDIxODQsICAgLTQ2NCwgICAxMjk0LCAgICAyMjIsICAgIDU4OSwgICAgNDU3LCAgIC0zOTcsCisgICAgICAgLTg3LCAgIC02MDUsICAgLTYzMSwgICAgMzExLCAgIC03MDMsICAgIDExMCwgICAgIDIwLCAgICAtMjMsCisgICAgICAgLTc1LCAgICAgMTgsICAgIC00MywgICAtMTgyLCAgICAgIDgsICAgIC05NCwgICAgMTUxLCAgIDQ5ODksCisgICAgICAtNjE5LCAgICA2NjIsICAgICA4MiwgICAgICA4LCAgICAgNjksICAgICAtNCwgICAgMTI2LCAgICAtMzUsCisgICAgICAgLTk5LCAgIC0yNzcsICAgLTIyNywgIC0yMjEyLCAgIDMxODgsICAgMTExNSwgICAtNDY3LCAgIC02MTgsCisgICAgICAtOTg5LCAgICA2ODEsICAgIDIxOCwgICAgLTI1LCAgICAtMzcsICAgICAtOSwgICAgIDMyLCAgICAtNDYsCisgICAgICAgIDk3LCAgICAgMTUsICAgIC0yMywgICAgLTk1LCAgICAgLTYsICAgICA1NSwgICAgIDE5LCAgIDc5MDQsCisgICAgICAgLTE0LCAgIC01MDgsICAgICAgMywgICAgIDE0LCAgICAtMTIsICAgIC01OCwgICAgIDI4LCAgICAxNTQsCisgICAgICAgIDExLCAgICAyNzEsICAgLTU5MywgICAgMzQ0LCAgIC0zMzYsICAgMzQ4OSwgICAgLTQxLCAgLTI5OTgsCisgICAgICAgNjIyLCAgLTI3MzksICAgMjc5NiwgICAxNTM2LCAgICAzMTAsICAgIDE3NiwgICAtMzE4LCAgICAzOTksCisgICAgICAgLTcwLCAgIC0yOTgsICAgLTUwOSwgICAgMjU2LCAgIC0zODEsICAgLTE1OCwgICAgMzIyLCAgIC0xOTcsCisgICAgICAgICAzLCAgICAtNTMsICAgICAzNywgICAgIDk4LCAgLTYxMzYsICAgIC0yNSwgICAgLTU0LCAgICAgNTcsCisgICAgICAgMTM4LCAgICAtNzQsICAgIDIzOSwgICAgLTQ2LCAgICAtMTgsICAgICAyOSwgICAtMjY1LCAgLTIyNzgsCisgICAgICAgIDIyLCAgICAxMTAsICAgIC0yMSwgICAtMTQ3LCAgICAyNjYsICAgICA4NSwgICAtMjg2LCAgICAxMzcsCisgICAgICAzNDM0LCAgIC00ODUsICAgICA2OCwgICAgNDc1LCAgICAgLTMsICAgIDE1OSwgICAtMTgxLCAgIC0yMzcsCisgICAgICAxNTk1LCAgICA3NTksICAgIDc4NiwgICAxNDkwLCAgICA5MjYsICAtMjg0MSwgICAtMTYwLCAgIDEwOTIsCisgICAgICAgIC03LCAgICAxMzAsICAgIDg5NSwgICAtMzQ1LCAgICAtOTUsICAgIC0zMSwgICAgLTM1LCAgICAxMzksCisgICAgICAgLTk4LCAgIDIxMDYsICAgIDMwNSwgICAgNjcyLCAgICAtNjYsICAgIDM0OSwgICAgMjI5LCAgLTE1NjEsCisgICAgIC0xNjk0LCAgLTE3ODYsICAgLTc0MywgICAgLTc2LCAgICAtNjcsICAgMTY2NiwgICAgIDc2LCAgICAgMTAsCisgICAgICAgLTIyLCAgICAgNjAsICAgIC00NSwgICAgICA1LCAgICA0MDksICAgLTQ1OCwgICAgNTgzLCAgIC00MDUsCisgICAgICAyNTg2LCAgIC0yNjQsICAgIDE3NSwgICAgNjMzLCAgICA4NDIsICAgMzIwOCwgIC0xNDg4LCAgIC04MDIsCisgICAgICAgIDQwLCAgIC0xMTksICAgLTE5NywgICAgLTg0LCAgIDE2NDUsICAgIDMyOCwgICAgODIzLCAgIC0xNzUsCisgICAgICAgMzQyLCAgICAgMTIsICAgLTIxNywgICAgIDY3LCAgICAxMjQsICAgLTE4MCwgICAtMTA2LCAgLTI4NzcsCisgICAgICAtMzM2LCAgICAxNzEsICAgIDE4NSwgICAgMTMyLCAgLTIyNjMsICAgIC03NSwgICAtNjIyLCAgIC02MzEsCisgICAgIC0yNDA0LCAgICAxNzYsICAgLTEzMiwgICAgIDM1LCAgICAxNzksICAtMTQ5OCwgICAgMTgyLCAgICAgNjgsCisgICAgICAgNjk5LCAgICA1OTcsICAtMjcyOCwgICAgMzI1LCAgICAgNTIsICAgIDQyMSwgICAtODYzLCAgICA2MDksCisgICAgICAgIDUzLCAgIC0xNTksICAgIDI1OCwgICAtMzA3LCAgIDI5MTksICAgICA0NCwgICAtODI2LCAgIC00NjcsCisgICAgICAgIDkxLCAgICA1NDIsICAgMTg4MywgICAgODE1LCAgIC02ODIsICAgIDU0OCwgICAtNDE5LCAgICA1OTMsCisgICAgICAgIDgyLCAgLTIxMDgsICAgLTE1OCwgICAgLTc1LCAgIC01MjQsICAgMjQ0MCwgICAtNTI4LCAgIC00NjksCisgICAgICAgNzIzLCAgICAtMTQsICAtMTgxNywgICAtNDg3LCAgICA0NDgsICAgICAgNCwgICAtMTU1LCAgICAtNzAsCisgICAgIC0xNzE1LCAgICAgMzQsICAgIC01NSwgICAgMTM0LCAgICAgIDAsICAgICAxOSwgICAgMTA3LCAgICA0MTksCisgICAgICAgMzM0LCAgICAgNzQsICAgIDQ0NiwgICAxMjQxLCAgLTQyODgsICAgICA2MSwgICAgLTY1LCAgICAgMjEsCisgICAgICAgIDcxLCAgICAxMzMsICAgICAgMiwgICAgLTg4LCAgIC0yMzgsICAgIDMyMiwgICAtMjgzLCAgICAgLTYsCisgICAgICAgNDA0LCAgICAgOTgsICAgICA3OCwgIC0xOTUxLCAgICA0MTIsICAtMTk0MiwgICAgNDE4LCAgICAyNTcsCisgICAgICAgLTQyLCAgLTI0NDQsICAgIC05NywgICAxNDkxLCAgICA0NjQsICAgIDM0NiwgICAgMjI5LCAgIC0xNTQsCisgICAgICAgIDk2LCAgICAyNjEsICAgICAyOSwgICAgMzAyLCAgICAgMzksICAgLTIwMSwgICAgLTQwLCAgICAtOTgsCisgICAgICAtMTU3LCAgICAzMzUsICAtMzYyNCwgICAtMzQ5LCAgIC01NzMsICAgIDYzMywgICAtMTE2LCAgIC0zMTIsCisgICAgICAgLTgyLCAgICAyNjMsICAgICAtMiwgICAtMTAxLCAgICAtNTcsICAgMTgxNywgICAtNDI0LCAgICAgIDMsCisgICAgICAtMjQ1LCAgICAzODYsICAgICA3NCwgICAgNjA5LCAgIDIxNzEsICAgIC03NywgIC0yNjA0LCAgLTEwMzYsCisgICAgICAtMTE3LCAgIDE1ODUsICAgICAtMiwgICAgICA5LCAgICAtMjMsICAgICAzMSwgICAgLTEyLCAgICAgNDgsCisgICAgICAgMjE1LCAgICAgODQsICAgICAxMywgICAgMjE5LCAgICA0MTksICAgLTI3NSwgICA0MzczLCAgICAtOTEsCisgICAgICAgIC02LCAgICAgMTgsICAgMjIyOCwgICAgLTQ2LCAgICAxNTcsICAgLTQwOCwgICAyMjg4LCAgICA2NTQsCisgICAgICAtNzI1LCAgIC0yNDUsICAgIC0xMCwgIC0xMTgyLCAgIDE3MjYsICAgIDMyNCwgICAgMzY3LCAgIDMwMTMsCisgICAgICAzNDI5LCAgIC0xNDAsICAgIDM2MCwgICAtMTIyLCAgIC01NzQsICAgLTE2NSwgICAgMTA5LCAgIC0zMzAsCisgICAgICAgLTgyLCAgICAzNDAsICAgLTEzMywgICAgMjEwLCAgICAzNTUsICAgICAtOCwgICAgIDQ3LCAgICAtNTIsCisgICAgICA4MDY0LCAgICAgIDUsICAgICA2MCwgICAgLTQyLCAgICAtOTUsICAgICAtMywgICAgIDkxLCAgICAtNjksCisgICAgICAgLTQ3LCAgICAtNDIsICAgIDEwMSwgICAgMTE4LCAgICAtNDQsICAgIC0xNiwgICAgLTE0LCAgICAgLTksCisgICAgICAgIDI3LCAgICAgIDgsICAgIC0zMywgICAgIC0zLCAgLTkzMDIsICAgICAyNywgICAgIDQ5LCAgICAgLTYsCisgICAgICAgIDYxLCAgICAgNzQsICAgIDIwNCwgICAgNDMwLCAgICAyNTIsICAgLTI1OSwgICAgIDczLCAgICAxMjUsCisgICAgICAgMzY2LCAgIC00NTgsICAtMjg0NiwgICAgIDg5LCAgLTI2OTQsICAgLTEwNiwgICAtMzQ0LCAgIC03MDIsCisgICAgICAgODA5LCAgICA0NTEsICAgICA2OSwgICAgNTg1LCAgLTE4OTcsICAgIDYwOCwgIC0xMTM4LCAgICAgNTIsCisgICAgICAgNjE4LCAgICAxMDYsICAgIDc3MSwgICAyOTkyLCAgICAyNjYsICAgMTAwNywgICAgMTg0LCAgIC00ODYsCisgICAgICAgIDM2LCAgIDMzMTcsICAgLTMxMSwgICAgIDM4LCAgICAxMDUsICAgIC04OSwgICAgIDE2LCAgICAgOTcsCisgICAgICAgLTg4LCAgICAgMjgsICAgIDE4MywgIC0yODM0LCAgICAtNDQsICAgIDM4NywgICAgLTQ5LCAgICA0NjcsCisgICAgIC0yNTI0LCAgICAgNzcsICAgIC01NiwgIC0zNzI3LCAgICAgODEsICAgLTMwOCwgICAgIDYzLCAgIC0xMzcsCisgICAgICAgMjAzLCAgICAtNzcsICAgIDEzOSwgICAgMjU0LCAgICAtNjUsICAgLTI2NCwgICAgLTU4LCAgICA2MzEsCisgICAgIC0yNTU5LCAgICA3MzksICAtMTM0MywgICAgNTk1LCAgIC0xMTcsICAgLTE5MywgIC0yNTcyLCAgICAzMjIsCisgICAgICAgMjY3LCAgICAxODUsICAgIDY2OSwgICAtMTEwLCAgICA2NDEsICAgIDIxMiwgICAgIDQ1LCAgICAtMTYsCisgICAgICAgIDEyLCAgICAgMTQsICAgICAtMywgICAgLTEyLCAgICAgNzgsICAgIC00OCwgICAtMTk2LCAgIC0xMjgsCisgICAgICAgMTc5LCAgICAxNDYsICAtNzM0OCwgICAgMTc3LCAgIC0xMzgsICAgIC00OCwgICAgMTQyLCAgICAtMzMsCisgICAgICAgIDM0LCAgLTYwMzcsICAgICAxNSwgICAtMTA1LCAgICAxMDMsICAgIDEzNiwgICAgLTQ4LCAgICAyMTcsCisgICAgICAtMTY5LCAgICAgODgsICAgIC0zMSwgICAgICA5LCAgICAgMjQsICAgICA0MSwgICAxNzMzLCAgLTI3NTcsCisgICAgICAtMzM1LCAgIDE3ODMsICAgIDk4OCwgICAtMTYxLCAgIDEwMTQsICAgIDYzMywgICAgLTY2LCAgLTExMTQsCisgICAgICAgNTI1LCAgIC0yNjYsICAgIDQ2MSwgICAxMTM3LCAgICAtMjYsICAgLTE3MywgICAgIDg5LCAgICAgODIsCisgICAgIC0zMzY1LCAgICAgNjcsICAgLTE5OCwgICAtMTA3LCAgICAgNDQsICAgIDM1MiwgICAtNzkzLCAgICA4NjcsCisgICAgICAtODA3LCAgIC0xNjYsICAgIDEwNywgICAgICA0LCAgICAgNzEsICAgICA2MSwgICAgMTI0LCAgICAgMjcsCisgICAgIC0yNDc3LCAgICAxNzgsICAgIC0zMiwgICAtMTcyLCAgIDI4OTUsICAgMTMwMSwgICAgNzk4LCAgICA3MDcsCisgICAgICAgMjY3LCAgIC03MjAsICAgLTQwMywgICAgMTY3LCAgIC0xNTcsICAgMjU3MiwgICAtMjEwLCAgICA1MjcsCisgICAgICAtMzEyLCAgLTE2NjQsICAgLTIxNCwgIC0xNTU2LCAgIC0zMzIsICAgIDU5NSwgIC0xNjM0LCAgICAtNTgsCisgICAgICAgMjAzLCAgLTE3NzcsICAgLTQ2OSwgICAgIDI0LCAgICAxODgsICAgIC01OSwgICAtODYwLCAgICA4NzksCisgICAgICAgIDE1LCAgICA4NTUsICAtMTUzNCwgICAyOTEwLCAgICA1MzQsICAgIC03MSwgICAgMjc2LCAgICA0NzEsCisgICAgICAgIDQxLCAgICAtMjUsICAgIDEwNSwgICAgLTM3LCAgIC0xNTAsICAgIDExMCwgICAgMjI2LCAgIC0yNzcsCisgICAgIC00Njg3LCAgICA1NzQsICAgIDEzOSwgICAtMTUyLCAgIC01ODYsICAgICA2NywgIC0xMDgyLCAgICAyNjEsCisgICAgICAgLTY4LCAgICAgMjUsICAgLTIxNiwgICAgMTEwLCAgICAgNDYsICAtMzcwMywgICAgMjgxLCAgICAzNTUsCisgICAgICAtNTA2LCAgICAgODAsICAgLTIxOCwgICAgMTY0LCAgIC0zOTgsICAgICA3NSwgICAgLTk3LCAgIDU3ODIsCisgICAgICAgIDM5LCAgICAtNjgsICAgICAyNiwgICAgIDc2LCAgICAgNzQsICAgICAzOCwgICAtMTAzLCAgICAxMDUsCisgICAgICAgIDQ0LCAgICAxMTYsICAgIDE4NywgICAgMjg4LCAgICAgOTAsICAgNTg0NywgICAgLTQxLCAgICAgMjgsCisgICAgICAgLTE5LCAgICAgMjAsICAgIDEyOSwgICAgLTk5LCAgICAyNTgsICAgICAyMiwgICAgLTI4LCAgIC0xMjAsCisgICAgICAtMTAxLCAgIC0xMjEsICAgICA3OSwgICAtMTgwLCAgICAtMjMsICAgICAyMiwgICAgIC01LCAgICAtNjAsCisgICAgICAgIDYzLCAgICAgMzUsICAtODk4NywgICAgLTExLCAgICAgIDIsICAgIC0xNSwgICAgIC0zLCAgICAtMjgsCisgICAgICAgIDQ3LCAgICAgMjksICAgIDI0MSwgICAgMTMyLCAgIC0xNjYsICAgLTI1OSwgICAgLTQ4LCAgICAxMDIsCisgICAgICAgIDcwLCAgIDI4MzAsICAgMzE2MywgICAgMjg1LCAgIC04MTMsICAgICAgMCwgICAgMTA1LCAgICAxNzYsCisgICAgICAtNDU1LCAgICAxNDEsICAgMTM4MiwgICAtNDgxLCAgLTIyODIsICAgMjk3MSwgICAtMjAwLCAgIC00NzMsCisgICAgICAgIDM3LCAgIC05MzAsICAtMTE2MiwgICAgOTMwLCAgICA4OTAsICAgIDQxMiwgICAgMTkwLCAgIC0xNjAsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjIyMjRzMFtdID0geworICAgICAtNTc4OSwgICAxMjI5LCAgIC0xMzgsICAgMTAxMCwgICAgODIzLCAgIC02MDIsICAgLTk4NywgICAtMjM3LAorICAgICAgICA0NywgICAgLTI5LCAgICA0MjgsICAgIDIxMCwgICAgIDg3LCAgICAtMTEsICAgIC0yMCwgICAtMjYxLAorICAgICAtMzE0OCwgICAxMjE5LCAgLTIwNzQsICAgLTEzMiwgICAtMjU4LCAgICA3MDcsICAgLTYzNCwgICAgODc4LAorICAgICAgLTQ4NiwgICAgOTg5LCAgIC0yNzYsICAgLTEzNywgICAtMjYzLCAgICA1OTIsICAgMTI0OCwgICAgNDc0LAorICAgICAgLTI5MywgICAtOTgxLCAgIDIxMjUsICAgLTY1MywgIC0xNDUxLCAgIC04MzMsICAtMTUyMiwgICAgMzg3LAorICAgICAgLTI2OSwgICAgMzQ5LCAgICA2OTgsICAgIDI5NSwgICAgODcwLCAgICA2NjEsICAgMTUzMiwgICAgMjAyLAorICAgICAgIDY1NCwgICAgMzYyLCAgLTEyNjUsICAgMzk3MiwgICAtNjUxLCAgICAyMjQsICAgIDIxMywgICAtNzI4LAorICAgICAgIC04MywgICAgNTc1LCAgIC01MDMsICAgLTc2NiwgICAgNTU5LCAgIC02NTcsICAgICA4NiwgICAgOTQxLAorICAgICAgMTQ5OCwgICAgLTcyLCAgIDIyOTcsICAgMTQxMywgICAtMzc2LCAgICA2OTcsICAgLTczOCwgICAgMzg0LAorICAgICAgLTgwNywgICAtMzU0LCAgIDExNDEsICAgIDM3NCwgICAxMTg2LCAgIC01OTcsICAgIDIyMiwgICAgNjMwLAorICAgICAgLTcxNywgIC0xNjUzLCAgICAxMDYsICAtMTM3NywgICAtOTI5LCAgICA5ODIsICAtMzQ2OSwgICAtMzIxLAorICAgICAgLTIwMSwgIC0xMTg1LCAgIC0xNDcsICAgIC0xMywgICAgMjY4LCAgICAxMDMsICAgMjk2NywgIC0yMDgzLAorICAgICAgLTQxNiwgICAgNzAyLCAgICAzNzcsICAtMTEyNiwgICAgIDkyLCAgICA5NjMsICAgLTQ5NCwgICAgLTk0LAorICAgICAgLTQzNiwgICAxODkzLCAgIDE0MDEsICAgIC00MCwgIC0xNDY0LCAgLTE2MDgsICAgMTk4MCwgICAgIDQ0LAorICAgICAgIDI1NCwgICAgNjc2LCAgICA1MjksICAgLTg5MSwgICAgLTk1LCAgICAgIDksICAgLTE3MiwgICAtMTI5LAorICAgICAgIDE1OCwgICAtNDAzLCAgLTExNDcsICAgMTAyNiwgICAtNDEwLCAgICAgODYsICAgMjU5MywgIC0xMDYwLAorICAgICAgLTYyMSwgICAgNDgwLCAgICAyNTQsICAgLTc4MCwgICAgNjkxLCAgLTEwMjAsICAgICA3OSwgICAtMTkyLAorICAgICAtMjI2NCwgIC0xMjE5LCAgIC03NDgsICAgIDYwMiwgICAgMjQzLCAgICAzMzgsICAgIDU1MCwgICAtNDQ0LAorICAgICAgLTEzMCwgICAgIDc5LCAgICAgMjQsICAgMzM5NiwgICAgMTI0LCAgIC01NzIsICAgIDc0OSwgICAgOTc2LAorICAgICAgICAzMywgICAtODgzLCAgIC0zNjgsICAgLTYwOSwgICAgNjk0LCAgIC01NjksICAgLTU2MCwgICAgMTkyLAorICAgICAgIDg2OCwgICAgNjQ0LCAgICAxNzMsICAgICA4NiwgIC00MzAyLCAgICA2MzMsICAgNzg5OSwgICAtMzYwLAorICAgICAgIDQ3OCwgICAgNDkzLCAgIC0zMDYsICAgICAxNCwgICAgMjQ0LCAgICAgOTYsICAgICA3MSwgICAtMTY5LAorICAgICAgIDMzNiwgICAgMzQ2LCAgICAgNzQsICAgIC01MiwgICAxNzc5LCAgICA4MjgsICAgLTI1MiwgICAgNzM5LAorICAgICAtMTAwNSwgICAtNzU1LCAgICAgMzEsICAgIC00NiwgICAgMjAwLCAgICA1ODEsICAgIC0xMSwgICAgODAyLAorICAgICAgMTEwNCwgICAzMjUyLCAgLTEwNTMsICAgIDcyMywgICAtNDkxLCAgLTI0OTIsICAtMjMzMCwgICAtMjQ1LAorICAgICAgIDMwOCwgIC0xMDIxLCAgIC0zMTIsICAgIDU2MywgICAgLTg1LCAgICA5OTEsICAgIC0xNiwgICAgMjI0LAorICAgICAgIC04NSwgICAtOTU3LCAgIDIyNjIsICAtNDU4NSwgIC0xNDc1LCAgICAxMDIsICAgIDMxMCwgICAgMjk4LAorICAgICAgLTg3NSwgICAgIC02LCAgIC0yNjgsICAgICAgOCwgICAtMjg0LCAgICAzMjQsICAgLTQ3MSwgICAtMjI0LAorICAgICAgIDEzMywgICAxNTAyLCAgLTE3MTQsICAtMTA5NSwgICAtMTA0LCAgICA4MDksICAgMjU4NCwgICAtMjczLAorICAgICAtMTAxNCwgICAtMjk2LCAgICAxMzAsICAgIDczMiwgICAtMjU5LCAgIC0zMzUsICAgLTc0NSwgICAtNjE5LAorICAgICAgLTcxNiwgICAgMjQ3LCAgICA1MDMsICAgIDg2MiwgICAtMjc3LCAgIC0xMzcsICAgLTIyNCwgIC00ODk3LAorICAgICAgIDEyNCwgICAgMjc3LCAgICAyOTgsICAgIC00MCwgICAgMTY5LCAgICA2NzgsICAgIDU1NywgICA0Mzc5LAorICAgICAgIDY3NywgIC0yMDE2LCAgIC01MDYsICAgLTEwOCwgICAgLTQ3LCAgICAgNDksICAgLTExNSwgICAtMjYwLAorICAgICAgLTMwMCwgICAgMjA2LCAgIDExOTYsICAgIC0xNywgICAgMjAyLCAgICAzNjUsICAgLTgwOCwgICAtNDczLAorICAgICAgLTE2MCwgICAtNjA5LCAgICA1MjYsICAtMTEyNCwgICAxNjI5LCAgLTI5MjQsICAgIDcxMywgICAtNDg3LAorICAgICAgLTEwOSwgICAgNTQwLCAgIC01MTEsICAgIDIyMSwgICAtMzk0LCAgLTE0MjAsICAgMTAyMywgICAtNDYwLAorICAgICAgIDQyNCwgICAgLTg2LCAgIC04NzUsICAtMTU1NywgICAgLTg4LCAgIC0yNDQsICAtMTU5NywgIC0zMDE1LAorICAgICAgIDM1NSwgICAgMTY2LCAgICAzMzAsICAgLTMzNCwgICAtMzI1LCAgICA1MDUsICAgMzYzMiwgIC0xNzYwLAorICAgICAgMTYyNiwgICAtNDI3LCAgICA1NzMsICAgMTE5NywgICAtMzE3LCAgIC01NjYsICAgLTY2MywgICAgNDYwLAorICAgICAgIDMzOCwgICAtNDQyLCAgIC01OTcsICAgMTU2NSwgICAtODU0LCAgIC01MzQsICAgLTIxOSwgICAtMTI4LAorICAgICAtMjE3NSwgICAgNzM5LCAgIDEwNjQsICAgMjA1MCwgICAgLTYxLCAgIC0zNDksICAgIDM2MSwgICAtMzc1LAorICAgICAgMTExMSwgICAtMTIyLCAgIC0xMjEsICAgLTE2NCwgIC0yNTczLCAgICA5MzgsICAgMTc1OCwgICAgLTE1LAorICAgICAgIDg4NCwgICAgODY1LCAgIC02MzAsICAgLTU3MywgICAgOTk0LCAgIDExMTIsICAgIC0yNiwgICAgICA5LAorICAgICAgIC0zMCwgICAzODkzLCAgICAtMzgsICAgMTM4NiwgICAgNjA1LCAgICA1NjgsICAgLTY4MCwgICAgMTE3LAorICAgICAgICAzNywgICAgNTcyLCAgICAyNDUsICAgIC01MywgIC0xMDMwLCAgIC0yNDEsICAgIDM5NywgICAgMzYzLAorICAgICAtMTYzMiwgICAtNTY3LCAgICAtMjYsICAgLTY5OCwgIC0yMTA5LCAgLTEwMzMsICAtMTM4OSwgICAxMzgxLAorICAgICAgLTQxOCwgICAgNDAyLCAgIC01MzQsICAgICAgOSwgICAxMTQzLCAgICA5OTEsICAgIDY5MywgICAyNTU3LAorICAgICAtMTI2OCwgICAxMjczLCAgIC0xOTIsICAgMTIyNSwgICAgODc2LCAgICA0NzIsICAgIDgzNSwgICAgNTA5LAorICAgICAgLTQ1MiwgIC0xNTE5LCAgICA0ODIsICAgMTEwMywgICAtNjI2LCAgIC0yOTksICAgMTU4MCwgIC0xNTMyLAorICAgICAgIDU5OSwgICAyMjQ1LCAgICA1MDMsICAgLTExMCwgIC0xODc5LCAgICA5NzgsICAtMTE1OCwgICAtMTMwLAorICAgICAgLTY2NSwgICAgNDQ4LCAgLTEyNDcsICAgIDYwNCwgICAtNTI4LCAgIC02NzcsICAgLTcxMSwgICAgIDc4LAorICAgICAgLTU2MywgICAtMzQ5LCAgICAtNTMsICAgIDI2MSwgICAgOTUyLCAgIC0zMzgsICAgLTUzNCwgICAgIDQzLAorICAgICAgICAtMiwgIC0yNTU1LCAgIDE5NzYsICAgMjM5MywgICAxNzE1LCAgICA5OTYsICAgNTYyOCwgICAxMDM2LAorICAgICAgIDE3MSwgICAgLTI4LCAgIC0xOTksICAgIC04MywgICAtMTI2LCAgICAtMzUsICAgLTI0OCwgICAtMzkzLAorICAgICAgICAzNiwgICAgMjA5LCAgICAgNzcsICAtMTc5MywgICAgMjQ0LCAgIC0xMDgsICAgLTEzMCwgICAgLTQxLAorICAgICAgLTU3OCwgIC0yMzQ3LCAgIC02ODcsICAgMTY1MCwgICAgMTMxLCAgIC0xMzgsICAgIDQwNywgICAtMjI4LAorICAgICAtMTM0OCwgICAtMjA5LCAgIC04NDEsICAgMTMzMiwgICAtNTQyLCAgICAyMjAsICAgLTE5MywgICAgODQzLAorICAgICAgLTEwMywgICAgODUzLCAgICAyNjEsICAgLTY1MywgICAgMjE3LCAgIC0xMDcsICAgLTExMywgICAgLTU0LAorICAgICAtNDE1MSwgIC0xMzAzLCAgIC0yODcsICAgNDA2NSwgICAtMzc2LCAgICAtNzEsICAgICA0MywgIC0xNDgxLAorICAgICAgLTM1OSwgICAtNDgxLCAgICAgNzgsICAgIDUyOSwgICAgNjg5LCAgIC0xOTQsICAgIDE3OCwgICAgIDYwLAorICAgICAgLTk5NywgIC0xNTU1LCAgIDE2ODcsICAgIDM0NSwgICAgMTY5LCAgICAyNjYsICAgMjg5NCwgICAgIDgzLAorICAgICAgLTUwMCwgICAtNDI1LCAgIC0zOTYsICAgLTI0NSwgICAgICA2LCAgICA1MTcsICAgIDExMiwgICAgMTI5LAorICAgICAgIDcyNSwgICAtMTIxLCAgIC00MDQsICAgIDIzNCwgICAgIDQ3LCAgICAtNjEsICAgLTEyMiwgICAgNzEwLAorICAgICAtNDI4MywgICAgOTg1LCAgICAgNTYsICAgLTEwNSwgICAgLTQ1LCAgIDEwNDMsICAgIDcyMCwgICAgIDczLAorICAgICAgIDMyMSwgICA0NDUyLCAgLTE2MTQsICAgICA5MSwgICAtNjIwLCAgIC0yOTksICAgIDUwNiwgICAgNzY2LAorICAgICAgLTg4MiwgICAgNjUwLCAgIC0xMzgsICAgIDEyMywgICAtNjA4LCAgICAyMTAsICAtMTU4MiwgICAtNTM4LAorICAgICAgIC02MiwgICAgMjQ2LCAgICA0NjQsICAgLTMzMiwgIC0xNTYwLCAgIDIyNzEsICAgMTU1OSwgICAtMTk5LAorICAgICAgLTgzMiwgIC0xMTMzLCAgIC03OTcsICAgIDM0MSwgICAxODYwLCAgIDE2MjgsICAtMTEzMywgICAtNjA3LAorICAgICAgIDYzNywgICAtNDA0LCAgICA0MzcsICAtMTE0OCwgICAgNTQyLCAgIC00NzQsICAgLTg4MiwgICAtNjEwLAorICAgICAtMTM0MCwgICAtMTU5LCAgIDE1MjQsICAgMTQyNCwgICAgMTY5LCAgICAgLTYsICAgICA1MiwgICAgNDQ3LAorICAgICAtNTUxMywgICAtNTkyLCAgICAyNDQsICAgLTI5NCwgICAgIDQ0LCAgICAxNjQsICAgIC01MSwgICAgMTQ3LAorICAgICAgIDIwMiwgICAgLTQ4LCAgICAxMzksICAgIDExMywgICAtMzk5LCAgICAtMTcsICAgLTE3MywgICAtMTk5LAorICAgICAgICAgMSwgICAgIDE3LCAgIC0xNjYsICAgICAxNSwgICAtMjU4LCAgICAgLTcsICAgIDIzOCwgIC01NzQ4LAorICAgICAgLTM5NCwgICAtODUyLCAgIC0yNDgsICAgIC00NiwgICAgMTkyLCAgICAtMzIsICAtMTAzMywgICAtMzQ5LAorICAgICAgIDE1MSwgICAgNDgzLCAgICAxMzAsICAtMTYyOCwgIC0zMzkxLCAgIDE1MjcsICAgIDY5NCwgICAtMzA1LAorICAgICAgIDc0MCwgICAtMzU3LCAgIC00OTEsICAgLTE4NiwgIC0xNjQ5LCAgLTEzOTQsICAgLTg3MywgICAgMjEzLAorICAgICAgIDY1MiwgIC0xOTc1LCAgICAzMTksICAtMTEzMSwgICAtMTAzLCAgICAtNDgsICAgIDY3MywgICAgMTU1LAorICAgICAgLTYyNywgICAxMTE1LCAgICA0NjksICAtMTEyMiwgICAxOTAxLCAgIC0xODQsICAgLTIzNywgICAtMjk2LAorICAgICAtMjg4NywgICAtMTIwLCAgICAyMTEsICAgIDgzNSwgICAgIDU3LCAgIC04MjYsICAgMTI3MiwgICAtMjU1LAorICAgICAgLTkzNywgICAgMjQyLCAgIC01MjUsICAgIDgzNiwgICAtMzM0LCAgICAzOTMsICAgLTYyNCwgICAgMTExLAorICAgICAgLTM0NywgICAtMTc4LCAgLTM0NDEsICAgIDIxOSwgICAtMzUyLCAgIDE4MzEsICAgLTI5NiwgICAgNTg3LAorICAgICAgLTM1NywgIC0xMDk5LCAgICAgIDUsICAgIDMxMywgIC0zODA2LCAgIC0zOTQsICAgIDgxNCwgICAtMTE4LAorICAgICAgLTIzMywgICAgLTIzLCAgIC0xMjUsICAgIC0yMSwgIC0xNDE0LCAgICA4MTMsICAgLTQwMywgICAyNDgyLAorICAgICAgIDQ0MiwgICAtMTg0LCAgICA5MzQsICAgIDM0MCwgICAgNDcyLCAgICAzNzQsICAgMTA3MywgICAtMjgzLAorICAgICAtMjM0OCwgICAgNDc3LCAgIC0zODcsICAgLTcxMywgICAxMDcxLCAgIC04OTksICAgIDI1MiwgIC0xMjk5LAorICAgICAgLTUwMiwgICAtMzc1LCAgIC00MTAsICAtMTc4NSwgICAgNjg2LCAgIC02MDUsICAgLTE0MSwgICAtODcxLAorICAgICAtMTc3NywgICAyNzgwLCAgICAgNTMsICAgLTIzNywgICAtMjM3LCAgIDI3MDEsICAgIDk0NCwgICAgIDQ0LAorICAgICAgIDU5NSwgICAgICAzLCAgIDEyNjMsICAtMTU1OCwgIC0yMjY3LCAgIC05OTgsICAgIDIyMSwgICAgMzU1LAorICAgICAgLTMxOSwgICAtNzM5LCAgLTExNjAsICAgLTU5NCwgICAyOTc3LCAgICAxOTEsICAgIC00MSwgICAtMjg0LAorICAgICAgICA4MywgICAgNDg0LCAgICA0ODEsICAgIC03MywgICAgLTEzLCAgICAxMzgsICAtMjc2MSwgICAtOTA5LAorICAgICAgLTU3OCwgICAtMTM5LCAgLTEwNTYsICAgIDE4OSwgICAtNjQ1LCAgIC0xNDcsICAgIC02MSwgICAtMTY4LAorICAgICAgIDM2OCwgICAgMTMwLCAgICAzOTAsICAgNDE4NywgICAgMTAxLCAgICAgNzksICAgIC00NSwgICAgNDUxLAorICAgICAtMTM3NCwgIC0xOTQxLCAgIC01MzQsICAgLTMwMSwgICAtOTc5LCAgIC02NjgsICAgLTUzMywgIC0yOTc4LAorICAgICAgIDM4NiwgICAgNTc0LCAgIC00NTQsICAgICAtNCwgICAgNTU0LCAgIC0xMjAsICAgIDM2NiwgICAgIDgzLAorICAgICAgMTA3OSwgICAtMzUxLCAgICAxNTYsICAgIDM4OSwgICA3NzI0LCAgICAgODMsICAgIDEwMiwgICAtMTkxLAorICAgICAtMTA1OSwgICAtMjU1LCAgICAtODYsICAgIDQ1MSwgICAtMjExLCAgICAxNzUsICAgIDc3NCwgICAgMzA2LAorICAgICAgLTI1MywgICAyMzg2LCAgIDExNjYsICAtMjAyNSwgICAgMjIzLCAgICA0MzgsICAgMTI3OSwgICAxNzIxLAorICAgICAgIC0yMywgICAgLTkxLCAgICA2MDYsICAtMTI4NSwgICAtNzc1LCAgLTMyMjgsICAgLTUzNiwgICAgNTQzLAorICAgICAgIDg3NywgICAxMTQwLCAgLTE2MTYsICAgLTYwMywgICAgNTUwLCAgIC02NzgsICAgLTQ2MiwgICAgMjQ4LAorICAgICAgIDIwOSwgICAtNTE1LCAgIC0zMTAsICAtMjUzOCwgIC0yMDAyLCAgICAyMzEsICAgLTQ5NSwgICAgMzE5LAorICAgICAgIDUzOCwgICAgNTA5LCAgIC0xMTMsICAgIC0xNywgICAgMTQzLCAgLTMwNjIsICAgIC0yOSwgICAgLTUyLAorICAgICAgIDI5OSwgICAgNjgxLCAgICA1OTUsICAgIDM5MCwgICAgNTMwLCAgIC0zOTgsICAgLTk2OSwgICAgNDcyLAorICAgICAtMTE0NSwgICAgODYwLCAgIDQxMTMsICAgIDMyOSwgIC0xMTgzLCAgIC02OTEsICAgLTYwNSwgICAgODU5LAorICAgICAgIDMwNSwgICAgOTg2LCAgICAtODEsICAgMjAyOSwgICAgNDA4LCAgICAgIDIsICAtMjQ0MiwgICAgIDU5LAorICAgICAgIC04NSwgICAtOTExLCAgIC0yODUsICAgLTUzMiwgICAgIDI4LCAgICA0MzQsICAtMjI5NSwgICAgLTc2LAorICAgICAtMjk3NywgICAgIDUxLCAgICA4MjQsICAtMTc4NiwgICAyMzAxLCAgICA2MjIsICAgLTU5MywgICAgIC05LAorICAgICAgIDY0MywgICAgMjQ2LCAgICA0MjcsICAgIDE5MywgICAgIDUxLCAgICAxMTgsICAgICAgNCwgICAgMjM0LAorICAgICAgIDQ1OSwgICAgIDMxLCAgIC00MDgsICAgIDcxMCwgICAtMjY0LCAgICAxNDQsICAgLTQwNCwgICAtNDc2LAorICAgICAgIDI3OCwgIC00ODM2LCAgIC0xMTMsICAgIDM4MiwgICAgLTI5LCAgICAxNzcsICAgIDM0NSwgICAgLTMzLAorICAgICAgIC0xNywgICAgLTg1LCAgIDYwMjcsICAgICA3MiwgICAtMTY1LCAgICA1NDQsICAgLTE5OCwgICAgIDc1LAorICAgICAgLTI3OCwgICAtMjYyLCAgICAxNTUsICAgIDUwMSwgICAtMzA1LCAgIC0yNzksICAgLTQzOSwgICAxNTA2LAorICAgICAgIDgyNywgICAtODc1LCAgLTI1OTIsICAtMTE5NiwgIC0xMjAxLCAgICAxNDksICAgICAxNiwgICAgNTQ3LAorICAgICAgMTAyMCwgICAtNjE2LCAgICAzNzQsICAgLTE5MywgICAtMTU1LCAgLTM2MjcsICAgIDIzMSwgICAgMjY0LAorICAgICAtMjE0MywgICAgIDkwLCAgICA0MTksICAgIDU3NCwgICAtNzk1LCAgICAxNzcsICAgIDMyOCwgICAgNzUyLAorICAgICAgLTI5NSwgICAgMjEwLCAgIC0zNjAsICAtMTI1MCwgICAyNjM5LCAgLTMxNzIsICAgIC0xMywgICAgLTM0LAorICAgICAgIDQ4OSwgICAgNDg0LCAgIC0zOTAsICAgLTE1OSwgICAtMjg1LCAgICAgMjcsICAgIDQ0NCwgICAtMjUyLAorICAgICAgIDI2NSwgICAgNTMwLCAgLTI3MTQsICAgLTM0MCwgIC0xNTQzLCAgIDIzMzAsICAtMTE1MiwgICAtMTE0LAorICAgICAgIDQ1MiwgICAgMzA0LCAgIC0yMjQsICAgLTQ1MSwgICAtMzE3LCAgIC01NzksICAgIDMwMSwgICAtNTY3LAorICAgICAgMTIxNCwgICAtNTk0LCAgIC02MjEsICAtMjcxOCwgICAgIDU5LCAgICAyNTcsICAgIDQxMCwgICAgIC0zLAorICAgICAgIDE0NSwgICAgIDcwLCAgICA4NzcsICAtMzEwMywgICAgMjQ0LCAgLTExMzQsICAgIDIzNiwgIC0xMTQ4LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IyMjI0czFbXSA9IHsKKyAgICAgIDg0ODgsICAgIDI3NywgICAgIDYzLCAgICAxNzMsICAgIDIyNCwgICAgLTMwLCAgIC0xNTgsICAgICA2NCwKKyAgICAgICAxMzMsICAgLTEzMywgICAgMjM0LCAgICAyMDUsICAgIC02NSwgICAgNDA4LCAgICAyNDksICAgLTU0NiwKKyAgICAgICAtMzAsICAgICAtMSwgICAtNDMwLCAgICAgODAsICAgIDEwMiwgICAtNDUwLCAgIC0xNjAsICAtNTYzNCwKKyAgICAgICAxNDUsICAgLTQwNiwgICAtMzUxLCAgICAgMzcsICAgIDI4MiwgICAgMjMyLCAgIC04OTgsICAgIDQzMCwKKyAgICAgIDMzMDEsICAtMTE3NSwgICAtNTU5LCAgICA0OTUsICAgMjY4NSwgICAgLTIxLCAgIC0yMTUsICAgIC04NywKKyAgICAgICA3MjgsICAgIC01NSwgICAgMjM1LCAgICA0MzAsICAgLTI1MCwgICAtNTA1LCAgICA1MDYsICAgLTEyOCwKKyAgICAgICAtNzIsICAgMzI4OCwgICAxNTg4LCAgICAyOTEsICAgICAgNywgICAgLTM5LCAgIC05NDQsICAgIDQ3OCwKKyAgICAgIDE3MTksICAgIDE2OCwgIC0xMDg1LCAgICAyMjUsICAgIDMzMCwgICAxNDgwLCAgIC0xODMsICAgLTU5NywKKyAgICAgLTYxMzEsICAgIDY2OCwgICAtMzg3LCAgICA2NzIsICAgLTE3MywgICAgLTU1LCAgICAxMTMsICAgICA0MCwKKyAgICAgIC0xMTMsICAgIC00NCwgICAgMzQxLCAgIC0zNDAsICAgLTU5NCwgIC0xMDAxLCAgIDE3NTcsICAgIDEyNywKKyAgICAgICAtNTksICAgIDUzNywgIC0xODM0LCAgIDE0MDEsICAgIDg1NiwgIC0xMTUzLCAgIC0yMzQsICAgMTIzMiwKKyAgICAgIC01NjIsICAgIDQ3NiwgICAgMTEwLCAgIDIxODgsICAgIDE0NiwgICAgMTE5LCAgIDIxMTksICAgLTg3MiwKKyAgICAgICA0NTAsICAgIDU5NywgICAtMzcxLCAgLTEzNTAsICAgLTk5NiwgICAtMTIwLCAgIC00OTUsICAgIDgyOSwKKyAgICAgICAxMTEsICAgLTg5NywgIC01NDQ1LCAgIC02NzAsICAgIDM5MCwgICAtMTE4LCAgICAgIDQsICAgIDEwOSwKKyAgICAgICA3NzIsICAgIDQ5NSwgICAgMTk2LCAgICA0MTAsICAgLTEyNSwgICAgODEyLCAgICA0MjYsICAgIDkwMCwKKyAgICAgICA0MzYsICAgMTE1NSwgICAtNTUzLCAgLTEyMjMsICAgIDI3NSwgICAgMjY2LCAgIC04OTEsICAgICA2MywKKyAgICAgLTEyNjcsICAgIDUyMywgICAtNTQ4LCAgLTI0NDUsICAgIDIzOSwgICAxMTYzLCAgICAgNzIsICAgIC02OCwKKyAgICAgLTE1NzYsICAgMjIxMiwgICAtMzQwLCAgIDE0OTksICAgIDQ5NCwgICAtNjcxLCAgICAtNzMsICAgLTI4MSwKKyAgICAgICA1OTgsICAgMTkwMSwgIC0xNjUyLCAgIC04NDUsICAgIDI2NiwgICAgNzk1LCAgIC01NDUsICAgLTU3NCwKKyAgICAgICAgMTksICAgLTQ2MSwgICAgMzcxLCAgICAyODgsICAtMzk1OSwgICAgNDIxLCAgICAyOTksICAgLTEyMSwKKyAgICAgLTI1NjEsICAgIC02NSwgICAgMTE4LCAgICAxODEsICAgLTIyNywgICAgNzE5LCAgICAtOTIsICAtMjMzNCwKKyAgICAgLTMxNzgsICAtMjQ5NywgICAtMTk4LCAgICAgNTgsICAgMTI3OSwgICAtMzA5LCAgICAxNTIsICAgLTcxNSwKKyAgICAgICA0NjYsICAgLTMxNiwgICAgIDEwLCAgICAgOTgsICAgMTU2OCwgIC0xMDE1LCAgICAtMTgsICAgLTQzNSwKKyAgICAgICAtNDIsICAgMjYwNiwgICAxOTcxLCAgIC0xMTksICAgIDcwNSwgICAgMjU0LCAgICA0NDMsICAgICAzNiwKKyAgICAgICA3ODgsICAgMTEzNSwgICAxMjM0LCAgIDIyODEsICAgIDk0MiwgICAgMTE1LCAgICA1ODEsICAgLTExMywKKyAgICAgIC0xOTQsICAgLTY5NCwgICAgNDM0LCAgICAtMzAsICAgMjgzNSwgICAtNDIzLCAgICA0MzYsICAgIDUyMiwKKyAgICAgICA0MDYsICAgMTMyOSwgICAxMTkxLCAgLTI2MjgsICAgIDQyMSwgIC0yNjAxLCAgICA2NDYsICAgLTIwMiwKKyAgICAgICA2MzcsICAgIDYxMCwgICAtNTg0LCAgICAzNTcsICAtMTU4NiwgICAtNDk5LCAgLTEyMzAsICAgIDEzNCwKKyAgICAgICAtODMsICAtMTI2NCwgICAyNDM0LCAgICAtNTgsICAtMjkyNCwgICAgNjQxLCAgIC0yODUsICAgIDE3MiwKKyAgICAgIC00NzgsICAgLTQwMiwgICAgNTg0LCAgLTExODAsICAgLTEzNywgICAtMjM4LCAgIC0xNTEsICAgLTY3OSwKKyAgICAgIC02MTksICAgLTQ5NSwgICAxMDQ0LCAgIDEyODEsICAtMTE4MCwgICAtNDQ0LCAgICAzNzYsICAgMTk2OSwKKyAgICAgIC02OTMsICAgLTI4MywgICAgNjE4LCAgICAxMjgsICAtMjYyMiwgICAgLTkwLCAgIC0xMTUsICAgIDY3MiwKKyAgICAgIDE3MzgsICAgLTQ1OSwgICAgNTE5LCAgIC05MjQsICAgMjU4MiwgICAgOTM3LCAgIC01NTUsICAgIDY3MiwKKyAgICAgICAxMzEsICAgICAzMSwgICAgNzc1LCAgICAzMDcsICAgLTI4MiwgICAtNTI3LCAgLTEyOTksICAgLTUxNiwKKyAgICAgICAgMTAsICAgIDIzOSwgIC00MDY5LCAgICAxMTgsICAgICAxMCwgICAtNjY1LCAgICAtMTUsICAgLTQ4NCwKKyAgICAgICA0NzIsICAgIDI2MiwgICAgMjc5LCAgICA2NzcsICAgLTc1NSwgICAxMjg4LCAgLTEyNzgsICAgIDQwMywKKyAgICAgICA2NjYsICAgLTM5NCwgIC0xMjMwLCAgLTI4MTksICAgLTIyMSwgICAgMTA5LCAgICA2MDMsICAgIDc1NCwKKyAgICAgICA5NTEsICAgIDQ4OCwgICAtMTQ3LCAgIC0xMDcsICAgLTQyNiwgICAxODc1LCAgIDIwNTYsICAgLTEyOSwKKyAgICAgICAyMzksICAgLTU2MSwgICAgIDgxLCAgIC0zMjQsICAgIDI0MywgICAgMzQ5LCAgICAxOTcsICAgLTgxMSwKKyAgICAgIC0xNDYsICAgLTkyOSwgICAxMTkzLCAgIDE0MzMsICAgLTc3NiwgICAzMjA5LCAgICA0MzQsICAgICAtNiwKKyAgICAgIDI0NjUsICAgLTIzMSwgICAgLTU3LCAgICAzMTIsICAgIDg5OSwgICAtMzk2LCAgIC0xNzAsICAgLTU0OSwKKyAgICAgICAzNDYsICAgIDEzNSwgICAgIDE3LCAgIC01OTYsICAgIDQwMSwgICAgMjY5LCAgICA0OTksICAgIC02NCwKKyAgICAgIC0zMjEsICAgLTM0MiwgICAtMTMyLCAgIC0zMTIsICAgNTg0NSwgICAgMjc2LCAgIC0xMDQsICAgICAtOSwKKyAgICAgICAtNTAsICAgLTY3OCwgICAtNDc4LCAgLTExMjUsICAtMTQ3NywgICAyMDU4LCAgICAxNTYsICAgIDUzOCwKKyAgICAgICA0NTEsICAgMjU3MiwgICAgNDk1LCAgICAxMDEsICAgICA3NCwgICAtNzUzLCAgICAgOTgsICAgIDY4NSwKKyAgICAgIDI0MjQsICAtMTk5OSwgICAxMDUwLCAgIC0yODAsICAtMTAzMCwgICAgIDI5LCAgIC0xNzgsICAgLTI0NCwKKyAgICAgIC0xMzQsICAgIDEzMCwgICAtMTM3LCAgIC0xMDMsICAgLTI0NSwgICAyMTYxLCAgIC00NDYsICAtMTAxNiwKKyAgICAgICA0NjQsICAgIDU3MywgICAtNDczLCAgICA0NDYsICAtMzgyMiwgICAgOTQyLCAgLTEyNjEsICAgLTMzNCwKKyAgICAgICA1NjgsICAgLTUyOCwgICAtMzAxLCAgICA0MTUsICAgLTc0MCwgICAgNjYxLCAgIC04MTMsICAgIDg0OSwKKyAgICAgIDE0OTEsICAgIDc3NCwgICAtNzc0LCAgIDE2MzcsICAgLTk3NywgICAtMjQ2LCAgICA2NDcsICAgLTU3MiwKKyAgICAgIC0xNDAsICAtMjk0NiwgICAtNjU0LCAgIC02NTAsICAgLTMxMSwgICAgMzM5LCAgIC0xNjUsICAgIDc1NywKKyAgICAgICA4MDMsICAgLTk1OCwgICAgNzA0LCAgICAxNzEsICAgIDM4MCwgICAgNzYzLCAgICAxNTksICAgMjcyMSwKKyAgICAgLTE1OTksICAgMTAwNiwgICAtMTE4LCAgIC01OTcsICAgMjk4NSwgICAyNjk5LCAgICAgNjksICAgIDM5NSwKKyAgICAgICA1MjMsICAgIDY1NywgICAgNDM4LCAgICAxOTAsICAgICA3MiwgICAgMTY0LCAgIC0yNjgsICAgLTE0NSwKKyAgICAgICA1MDYsICAgLTU1MCwgICAgMjIyLCAgLTM2NDEsICAgICAgNSwgICAtMTczLCAgICAgNjAsICAgLTE5NCwKKyAgICAgICA2NzcsICAgIDY4NiwgICAgNzI0LCAgIC0xMDcsICAgIDg4MiwgICAtMzM5LCAgICAgMTQsICAgIC01NCwKKyAgICAgICA1NTUsICAgIDQ4MywgICAxNTIzLCAgICAxMTksICAgLTE0MiwgICAtMzk0LCAgLTE2ODMsICAgLTk4NCwKKyAgICAgICAgMTgsICAgLTEwOCwgICAtMTkwLCAgICAxNDEsICAgIDU0MCwgICAgMjgxLCAgLTEyMzgsICAtMjE5NSwKKyAgICAgIC0zNDEsICAgLTMyNywgIC0xMDE0LCAgIC05OTAsICAgNDY5NCwgICAgIDQ2LCAgLTEwMTgsICAgIDM2MCwKKyAgICAgIC02NzEsICAgIC04MywgICAgMjE4LCAgICA4NTcsICAgIDE0NCwgICAtMTg4LCAgICA0NjMsICAgLTM3OSwKKyAgICAgIC01NzEsICAgLTg2NSwgIC0xMzQ1LCAgIC00NDcsICAgIC0xOCwgICAgLTY0LCAgIDUyMDEsICAgIDEzMiwKKyAgICAgICAgOTAsICAgLTE1OCwgICAtMTMyLCAgICAzODEsICAgIC04NSwgICAtMTA3LCAgIC0xMDMsICAgIDk3MCwKKyAgICAgIC01NTUsICAtMTIwNCwgICAxODAyLCAgIDEyMzAsICAgIDI1MywgICAgNTQwLCAgIC0zNzIsICAtMjM0NywKKyAgICAgIC0zODYsICAgIDgzNSwgICAtNzA1LCAgIC00MzcsICAgIDk0MSwgICAgNzk1LCAgIC0xODIsICAgLTM2OCwKKyAgICAgIDEwODgsICAgIDE2OCwgICAgMjU2LCAgICAyMTAsICAgLTY2NywgICAgMjkwLCAgIDE3ODMsICAgLTYzNiwKKyAgICAgICAxNjUsICAgLTM2MywgICAgNjM4LCAgLTM1MjcsICAgMTg3MiwgICAxOTk3LCAgIDE1MDMsICAgLTE4OSwKKyAgICAgLTI1ODcsICAgLTM1OSwgICAgMzg0LCAgICA0OTMsICAgLTM4NCwgICAtNjU4LCAgLTE3NTgsICAgIDk5MywKKyAgICAgIC0zMDYsICAgIDE0OCwgICAgMTk4LCAgICAxNjMsICAgIDQzMCwgICAtMzEzLCAgIC0xNDksICAgLTMzNywKKyAgICAgICAzNTIsICAgLTM1NCwgICAgNDg0LCAgICAzNTgsICAgLTI2NCwgIC00NTI1LCAgIC01NjAsICAgIC01NSwKKyAgICAgICAxNTQsICAgIDM3NCwgICAtMzE3LCAgIC00MjYsICAgMTQ0NiwgICAtMTYxLCAgIC0yODUsICAgLTExMCwKKyAgICAgICAyMDksICAgIDI5OSwgICAyMzI5LCAgICAgOTksICAgMTQwNiwgICAxMzc0LCAgICA5OTMsICAgMTE3OCwKKyAgICAgIC00MTMsICAgLTY0MiwgICAtMTAzLCAgIDM2NzgsICAtMTgyOSwgICAtNzU0LCAgLTEzNTgsICAgLTM0OSwKKyAgICAgICA2NDgsICAgLTQ5MiwgICAgNzU1LCAgICAxODgsICAgIDExNCwgICAtNDQ0LCAgIC05MzAsICAgLTIyNCwKKyAgICAgICAzMTksICAgIDIxMiwgICAxMjIzLCAgIC02NDgsICAgIDU5MywgICAxMjkzLCAgLTEyODksICAgICAyNCwKKyAgICAgIC03MTIsICAgMjU5MSwgICAtNDk0LCAgIDE1MDMsICAgICAtOSwgICAgNTM0LCAgICA5MjMsICAgMTQ5MCwKKyAgICAgICA5ODUsICAgIDQ5MSwgICAgMjcyLCAgICA5ODgsICAgIDM0OCwgICAtNTAzLCAgIC00NTQsICAgIDg5MywKKyAgICAgICA0MDksICAgLTQyMiwgIC0xMTg3LCAgIDMwOTcsICAgIDYwMiwgICAtNDAyLCAgICA0NjIsICAgMTU5OCwKKyAgICAgIC0yMTksICAgIDk4MiwgICAgMzE5LCAgICAxMjUsICAgIDU1OCwgICAtMTAwLCAgIC0yNjEsICAgIDEwOCwKKyAgICAgICAtNTksICAtMzQzNSwgICAgIDc2LCAgLTEwNjUsICAgLTE1MCwgIC0xNzU4LCAgLTE5OTcsICAgMTkyMSwKKyAgICAgIDEyMzksICAgIDQyNiwgICAgNTA3LCAgICAxNzMsICAgLTg1NiwgICAtODI5LCAgIC01MzgsICAgIDI0NywKKyAgICAgLTEyMDMsICAgIDQ4OCwgIC0xMDk0LCAgICA0NTMsICAtMTEwNCwgICAxMDIxLCAgIDIxODUsICAtMjg1NSwKKyAgICAgICA0MjcsICAgIDE3NywgICAtNzc4LCAgIC0xODIsICAgIDY0MSwgICAtNjcwLCAgICAgOTEsICAgIDU2OSwKKyAgICAgICAgNTAsICAgIC05MCwgICAgNTcxLCAgICAxMDgsICAgLTM3NCwgICAgMTc0LCAgIDE5OTcsICAgIDk2NCwKKyAgICAgICA2NDQsICAgLTQyOCwgIC0xODY4LCAgICA2NjgsICAgIDE3MSwgICAgMzIwLCAgICA2NzYsICAgIDEyMSwKKyAgICAgIC0yMTgsICAgMTkwMSwgICAtODU3LCAgIC03MjEsICAgLTE5NCwgIC0yNDMzLCAgICAtMzQsICAtMTY3MSwKKyAgICAgICAzNTIsICAgLTY0NCwgICAgMjk1LCAgICA1NzEsICAgIDI1MywgICAtMjg4LCAgLTE3ODYsICAgICAzMiwKKyAgICAgICAgNzQsICAgIC03MywgICAtOTAyLCAgLTE5NTQsICAtMTEyNiwgIC0zNDI3LCAgICAxNjgsICAgLTMxOCwKKyAgICAgICAgMjMsICAgLTc1NSwgICAtNDQxLCAgICAyMDEsICAgIC04NCwgICAgNDk5LCAgICAzNjcsICAgLTE1MywKKyAgICAgIC00MjYsICAgIDcxNiwgICAgNjUwLCAgIC00NTcsICAgICA4MCwgICAtNzA5LCAgICA4NTksICAtMjA5OCwKKyAgICAgIC03MjMsICAgLTE5NywgIC0xMDMwLCAgIC0yNTMsICAgIDI4MywgIC0xMTg3LCAgIC04OTksICAgMTQwMywKKyAgICAgIC0xMTcsICAgIC0yNSwgICA3NjE3LCAgICAtNjMsICAgLTM1NSwgICAtMjgzLCAgIC01NjAsICAgIC04NSwKKyAgICAgIC0zNTgsICAgIC00NSwgICAgIDYzLCAgICAxNzksICAgLTE5MywgICAgMTMwLCAgIC0yOTQsICAgLTY3NiwKKyAgICAgIC01MjUsICAgLTkwNywgICAtNDMwLCAgIC02MjcsICAtNTI2NywgICAtNTM5LCAgICAyNTcsICAgIDU5NCwKKyAgICAgIC0xNzMsICAgIDg5MCwgICAgMjAzLCAgICAtMzMsICAgLTEzNiwgICAtODAzLCAgICA0NzksICAgIC01NiwKKyAgICAgIC02MzQsICAgIDQ2NCwgICAtOTE5LCAgIC0xNDYsICAgIDMwNiwgICAgICA1LCAgICAxOTgsICAgIC05MCwKKyAgICAgIC0xMzgsICAgLTMzNywgICA0ODI2LCAgIC0zMTAsICAgIDI1OSwgICAxNjUxLCAgIC02ODcsICAtMTY3NiwKKyAgICAgICA0MjQsICAgMjcyOSwgICAtOTY2LCAgICAtNjEsICAgIDM4NiwgICAgIDYwLCAgICA3NjksICAgIC03MiwKKyAgICAgLTE2NTIsICAgICA0OSwgICAgMTA2LCAgICA1MDMsICAtMTQ2MiwgIC0xMDU2LCAgICA4OTIsICAgIDM1OSwKKyAgICAgICAyMDksICAgLTEyOSwgICAgMjYwLCAgIC0xMzAsICAtMjA4MSwgICAgNzk4LCAgICA0ODgsICAgIDg0NiwKKyAgICAgIC04MzYsICAgLTM2NiwgICAxNzg2LCAgLTIyMzcsICAgLTQ4NCwgICAgIDcyLCAgLTI2ODAsICAgLTgyOCwKKyAgICAgIC04NTcsICAgIDkyMCwgICAgNTYwLCAgICA5MzAsICAgLTE5NywgICAgIDU2LCAgIC04NzIsICAgIC0zNCwKKyAgICAgIC0zNTUsICAgIDkyOSwgICAgIDM1LCAgIC00NDksICAgIDUxNCwgICAgIDcwLCAgLTEyNzcsICAgIDIwOCwKKyAgICAgICAzNTMsICAgMzY1NCwgICAtMjU2LCAgICAxMzQsICAgLTg5NSwgICAtMTg0LCAgICAzNzUsICAgIDQwMiwKKyAgICAgIDE1NzYsICAgMTUxNSwgICAtMTAwLCAgIC00MzgsICAgLTY3OSwgICAgMzg0LCAgIDExNDMsICAgIC0yNCwKKyAgICAgICAxMDAsICAtMjgxOCwgICAgNTU0LCAgIC0yMTksICAgIDEwNSwgICAgNjUyLCAgLTI3NzgsICAgLTEwOCwKKyAgICAgICAgNDQsICAgIDMwNiwgICAgNDQ1LCAgIC00NzAsICAtMTE1MSwgIC0xMTcwLCAgIDEzMDUsICAgLTc0MSwKKyAgICAgIDEyMjMsICAgLTQ0MywgICAtODM4LCAgICAzNzQsICAtMzAwMCwgICAgIDcyLCAgIC01OTAsICAgLTU4NywKKyAgICAgIDM2ODYsICAgICA3NiwgICAtNDkzLCAgICAyNDYsICAgMTM0OCwgIC0xMjE1LCAgICA0NzMsICAgLTI0NCwKKyAgICAgIC0zMDQsICAgMTkzNywgICAgLTY4LCAgIC02MjYsICAgIDI3OCwgICAgMzkyLCAgIDExNjcsICAtMTg5OSwKKyAgICAgIC0zMDksICAgIDQ3NCwgICAgMjI2LCAgIC00MjEsICAgIC05NSwgICAtNDgzLCAgICAxMDUsICAgLTE0OCwKKyAgICAgICA3NDksICAgLTQzMCwgIC0zMDU3LCAgIC03ODksICAtMTc5MywgIC0xODU3LCAgIC0xNTgsICAgLTQ4OSwKKyAgICAgIC02NzYsICAgLTIwNCwgICAgODA2LCAgIC05MzAsICAtMzE5MiwgICAtMjA0LCAgIC0xMDYsICAgLTgxMiwKKyAgICAgIDExNTksICAgIDY0OCwgICAgMTE5LCAgICAtOTMsICAgLTIwNSwgICAtMTM5LCAgICAyODAsICAtNzc4NiwKKyAgICAgIC0zODgsICAgLTEzMiwgICAgLTEyLCAgIC0zMzIsICAgICAzMiwgICAtMTc0LCAgICAxMDAsICAgIDE1MywKKyAgICAgICAgLTcsICAgIDI4OSwgICAgLTI5LCAgIC05ODQsICAgLTMyOSwgICAtNTkyLCAgIDI1NjgsICAgIDcwNCwKKyAgICAgICA1NDQsICAgICA2NiwgICAgNTIxLCAgIC02NjEsICAtMTYzMiwgICAtODY4LCAgIC0zMTAsICAgIDMxMywKKyAgICAgIC00NjYsICAgLTM0NywgICAtMTQ2LCAgICAxOTcsICAgIDI2NiwgICAgNzY1LCAgIC0yNDAsICAgLTIwMSwKKyAgICAgIC0yNjUsICAtMTEyOSwgICAgLTM1LCAgIC01NjMsICAgLTM1NiwgICAgMTcyLCAgICA4NjIsICAgMzgzMSwKKyAgICAgIDE1NDcsICAtMTYxOCwgIC0xNDQ1LCAgLTM3MjYsICAgIDM4OCwgICAgNTQ4LCAgIC00NTcsICAgIDE0MywKKyAgICAgICAtMzgsICAgIDQwMiwgICAgMjU1LCAgICA4NDAsICAgLTcwMywgICAtMTU0LCAgICA3NzYsICAtMTAzOCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMjIyNG0wW10gPSB7CisgICAgIC03MDc4LCAgIDI4NDYsICAgICA3OSwgICAtMTExLCAgICAtMjAsICAgIDMzMCwgICAgMjI3LCAgICAtMzYsCisgICAgICAgMzA1LCAgICAgNDUsICAgICA4MSwgICAgMTQ4LCAgICAtMTMsICAgICA2OCwgICAgMzY0LCAgIC0zMTcsCisgICAgICAgLTcyLCAgIDIwMjEsICAgICAyOCwgICAgIDkzLCAgICAzMjgsICAgLTI1NiwgICAtMTgxLCAgIDI1NDcsCisgICAgICAgMjM1LCAgLTExMDIsICAgIDEzMCwgICAtNTc3LCAgIC0xNjQsICAgMTI5MCwgICAxODg1LCAgIC0xNzEsCisgICAgICAtMTQ3LCAgLTMyNDcsICAgIDMyNCwgICAgLTcyLCAgIC0zMTMsICAgIC02MiwgICAgIDMyLCAgICAyODQsCisgICAgICAtMTM4LCAgICAgLTksICAgLTE0NiwgICAxNzA5LCAgIC0zOTAsICAgMTgzMywgICAgMjg5LCAgICAxMjUsCisgICAgICAyMzY5LCAgICAgNjAsICAgIDIyMywgICAtMTM3LCAgICA2NDIsICAgLTExMywgICAgMjA0LCAgICAyODgsCisgICAgIC0xNTE2LCAgIC0xMzgsICAgIDIyOCwgICAgMzY4LCAgICAyMTksICAgLTYyMiwgICAgMjczLCAgIDMyMTEsCisgICAgICAtMjE1LCAgIC00MjMsICAgIDEzOSwgICAgIDY1LCAgICAgODUsICAgLTIwMywgICAtOTUzLCAgICAgMTEsCisgICAgICAgMTkzLCAgICAyOTQsICAgIDI3OSwgICAzMjY3LCAgICAyNDYsICAtMjM3NywgICAgLTU5LCAgIC0zMjQsCisgICAgICAgMTM2LCAgIC00OTIsICAgICAyMywgICAgLTU2LCAgICAgNzksICAgIDMwNywgICAgMTE1LCAgIC0xNDYsCisgICAgICAyMjI5LCAgICAzMjUsICAtMTY4MCwgICAtNTk3LCAgIC00MjMsICAgMjIwMCwgICAgLTQ0LCAgICAgNDgsCisgICAgICAgMzg2LCAgICAzOTYsICAgLTEyMiwgICAgLTM2LCAgICAgMzUsICAgOTc2MywgICAgIDMzLCAgICAtNjcsCisgICAgICAgIDE5LCAgICAtMzQsICAgICAxNSwgICAgIDQxLCAgICAtMjUsICAgIC0zMCwgICAgLTYxLCAgICAgMjAsCisgICAgICAtMTIxLCAgICAxMTcsICAgLTE1NSwgICAgLTI4LCAgICAtNjUsICAgIC0yNywgICAgIDQwLCAgICAxMzcsCisgICAgICAgMTg4LCAgIC0yMTEsICAgLTI0MCwgICAgIDcxLCAgICAtMzMsICAtNDg3MywgICAxOTkyLCAgICAgNTYsCisgICAgIC0yNzAxLCAgICAgLTEsICAgIDE1MSwgICAgLTk2LCAgICAyODYsICAgLTM5OCwgICAtNDE4LCAgIC0yMjEsCisgICAgICAgMjk1LCAgIC0zOTQsICAgLTExOSwgICAtMTgyLCAgIC0xMjQsICAgICA3NywgICAgICA3LCAgICAtNDQsCisgICAgICAgMTY4LCAgICAtMzQsICAgLTE1NCwgICAgMjU3LCAgICAgIDQsICAgLTExNCwgICAgNjM0LCAgICAxMzEsCisgICAgICA0OTMwLCAgIC0xMTgsICAtMjM2NCwgICAgIDQ2LCAgIC0yMDQsICAgLTEyOSwgIC0zMTY4LCAgIC0xMzgsCisgICAgICAtNDg5LCAgICA0NTQsICAgIC05NiwgICAgMTIwLCAgIC00NDcsICAgICAgOSwgICAtMjMwLCAgICAxNzQsCisgICAgIDExMzU5LCAgICA0NTYsICAgLTI2MSwgICAgLTc0LCAgIC0yNDksICAgIC0yOCwgICAgMTQ5LCAgICAtNzksCisgICAgICAgLTM2LCAgICAyMTEsICAgIC0xMCwgICAgMjEzLCAgIC0xMTAsICAgIDMzNywgIC0zODAwLCAgICAgIDQsCisgICAgICAtMjIzLCAgICAtMTgsICAgIDEzNiwgICAtMjkwLCAgIC0xNTUsICAgLTIzNSwgICAgIDU3LCAgICA0NDcsCisgICAgICAtNDk1LCAgIC0yMzEsICAgIC0xNSwgIC0xMDM2LCAgICAtODUsICAgLTE1NCwgIC00NDIxLCAgICAtMTksCisgICAgICAtMjM3LCAgLTExOTEsICAgICAxMiwgICAgLTE5LCAgICAgIDIsICAgIC04OCwgICAgLTg0LCAgICAyNjksCisgICAgICAgIC03LCAgICA0MzEsICAgIC0yNiwgIC0yNjc2LCAgIC0xMDAsICAgIDI4NywgICAgLTMxLCAgLTI5MTYsCisgICAgICAtMTYwLCAgICAtODMsICAgLTE5OCwgICAgICA5LCAgICAxODMsICAgLTI3OSwgICAgLTY4LCAgICAtMjMsCisgICAgICAgLTU1LCAgIDI5NTUsICAgLTEyMSwgICAgLTcxLCAgICAxODMsICAgLTcwMiwgICAtMzIzLCAgIDE2ODksCisgICAgICAtMTMyLCAgICAzMDksICAgIDEzNiwgIC0xMjE3LCAgICA0NDAsICAgLTEyNSwgIC0xNjcxLCAgIDE1NjksCisgICAgICAtMTYxLCAgIC0xMDgsICAgIDIzMiwgICAgMjY5LCAgIC01MTYsICAgICAzNywgICAgIDIxLCAgIC0yNjAsCisgICAgICAtMjMwLCAgICA1NjQsICAgLTM3NSwgICAgMjI0LCAgICAxMjksICAgNDMzMiwgICAtMTIwLCAgIDMzMDYsCisgICAgICAgMTUzLCAgICAtMjUsICAgLTI2MCwgICAgLTg0LCAgICAxMjMsICAgICAyMSwgICAgICA1LCAgICAtMTcsCisgICAgICAtMTQ1LCAgICAtNDQsICAgICAgNywgICAgIC0xLCAgICAyOTAsICAtMjM5NCwgICAtMTgyLCAgICAgNTEsCisgICAgICAgOTMzLCAgIDEwMzcsICAgICAyNiwgICAgMjExLCAgICAxODcsICAtMTc4MywgICAgIDY4LCAgIC03NDksCisgICAgICAgLTUyLCAgIDE0MjgsICAtMTU3MSwgICAtMjYxLCAgICAgMzQsICAgLTE5OSwgICAgNzIyLCAgIC0xMjcsCisgICAgICAtMTE4LCAgIC0xMTQsICAtMjM4NSwgICAgMTQ2LCAgLTEwNDIsICAgIC03MSwgIC0xNDc1LCAgIC0xNTAsCisgICAgIC0yMTk1LCAgICAxNTEsICAgIC0yOSwgICAgICA2LCAgICAgOTYsICAtMTIxMywgICAgMjgyLCAgICAyMTksCisgICAgICAgNDY2LCAgICAxNDQsICAgLTMwMCwgICAgMTA5LCAgICAtNzQsICAgIDEyNSwgICAyODYzLCAgICAgIDIsCisgICAgIC0yOTYzLCAgIC0yMTgsICAgIDIzNSwgICAgICAzLCAgICAzNTksICAgIDMxOSwgICAgMzcyLCAgIC01MDAsCisgICAgICAtMjcxLCAgICA0OTQsICAgMjY5NSwgICAgLTY1LCAgICAtMjksICAgICA0NywgICAgIDc0LCAgICAtMzQsCisgICAgICAgLTk1LCAgICAtNDgsICAgIC03NiwgICAgLTcxLCAgLTI5ODUsICAgIC0zMCwgICAgLTExLCAgICAgMjYsCisgICAgICAtMTc2LCAgICAxMDcsICAgICA5NiwgICAgIDIyLCAgICAtNjAsICAgIDExNCwgICAgLTcwLCAgIC0xNDcsCisgICAgICAgLTQzLCAgIDY5ODEsICAgIDExMCwgICAgLTg2LCAgICAgMzMsICAgICA2NiwgICAgICA4LCAgICAtNjEsCisgICAgICAgIDUyLCAgIC0xNjksICAgICA4MiwgICAgMjMzLCAgICAgNTYsICAgLTExNSwgICAtMjk1LCAgICAyNDEsCisgICAgIC0xMDUzLCAgLTM5MTQsICAgIC03OSwgICAgMzYxLCAgIC04NjksICAgLTE0NCwgICAtMTQ0LCAgIC04MDUsCisgICAgICAgMTU4LCAgIC0yNzgsICAgIDUxNSwgICAgICA0LCAgIC0zMTcsICAgIDkxNywgICAtNjY5LCAgIDMzMTQsCisgICAgICAgMjUzLCAgIDEzMTYsICAgIDI1OSwgICAgIDEyLCAgIDgxNzAsICAgICAxNSwgICAgMTI5LCAgIC0yMDAsCisgICAgICAgMTIwLCAgICAtMTEsICAgICAzNCwgICAgLTc3LCAgICAtMTMsICAgIDI1NywgICAgIDc5LCAgICAgIDksCisgICAgICAgIDIzLCAgICAgNTQsICAgICA3MywgICAgICAwLCAgLTk5NzIsICAgICAgNSwgICAgICA3LCAgICAgNDMsCisgICAgICAgIDI5LCAgICAgIDQsICAgLTEwNCwgICAgIDQzLCAgICAtMzYsICAgICA3NiwgICAtMjI4LCAgICAgIDEsCisgICAgICAgLTc3LCAgIC0xNTYsICAgIC02OSwgICAtMjA5LCAgICAgODQsICAtMjgyNiwgICAgMjQyLCAgLTE0NjEsCisgICAgICAtNzE4LCAgICAtMTQsICAgMTc4NCwgICAgNTI3LCAgICAyMjYsICAgOTg1MiwgICAgIDgzLCAgICAtMTUsCisgICAgICAtMzg5LCAgICAgMzQsICAgICA1MSwgICAgLTE2LCAgICAtNDYsICAgICAtMSwgICAgMjMyLCAgICAxMTUsCisgICAgICAgIDI2LCAgICAtNDIsICAgLTEyNCwgICAgLTc4LCAgICAgNTgsICAgMzA5MiwgIC0yNzU3LCAgIC0xMTEsCisgICAgICAgMjIzLCAgIC0yODYsICAgICAyMywgICAtMTcwLCAgIC0xNjYsICAgLTI2NCwgICAgMzMxLCAgIC0xNzIsCisgICAgICAgLTQ5LCAgICAtMjYsICAgIDE2NiwgICAyNjE2LCAgICAxMjgsICAgMzExOCwgICAgIDU5LCAgICA4NDQsCisgICAgICAtMTIxLCAgIC01MDQsICAgLTE5MywgICAgLTUzLCAgICAtOTUsICAgIDI4MiwgICAgLTIxLCAgICAgLTgsCisgICAgICAgLTExLCAgICAgNTgsICAgIC00OCwgICA5ODMwLCAgICAgMjUsICAgIC0yNiwgICAgIDUzLCAgICAxMTMsCisgICAgICAgIDk2LCAgICAxMjUsICAgICAxMiwgICAgLTY0LCAgICAxODUsICAgIC0zMSwgICAgIDE5LCAgIC0yNTEsCisgICAgICAtMzA3LCAgIC0xMzYsICAgMTM4MywgICAgLTM3LCAgIC0xMjgsICAgICA1NiwgICA0MzAzLCAgIC0yMzIsCisgICAgICAtMjcyLCAgICAgNDQsICAgLTE5MiwgICAgNTMxLCAgIC0xNDMsICAgLTY5NywgIC0yMjkxLCAgICAgNzAsCisgICAgICAgMjI5LCAgIC00MzIsICAgLTU5MiwgICAxMjYyLCAgICA5MDYsICAgLTIwNywgICAxNTIyLCAgICAyNjEsCisgICAgIC03ODQ4LCAgICAtMzksICAgLTk3NiwgICAgMTUwLCAgICAxMTUsICAgLTEzOSwgICAgIDYxLCAgICAtMjYsCisgICAgICAtMjExLCAgICA4MDcsICAgIC0yNSwgICAgMzExLCAgICAtOTgsICAgLTI5NywgICAgMTMzLCAgICA0NjEsCisgICAgICAtMTA5LCAgICAgLTYsICAtMTAzMSwgICAgMjM2LCAgLTI4NTEsICAgICA4NiwgICAyMTg0LCAgIC0yNTQsCisgICAgICAgLTgzLCAgIC0xMTksICAgIDg3OCwgICAtMTA3LCAgICAtMjUsICAgMTYzNiwgICAxNjk2LCAgIDE1MTcsCisgICAgICAgMjQ5LCAgICAtNDEsICAgLTI4MywgICAgLTY2LCAgICA3NDEsICAgIDcwNCwgICAtODk4LCAgICAzMDIsCisgICAgICAgNDcwLCAgICAzNjAsICAgICAtNywgIC02MDAyLCAgICAgMjYsICAgIDI2OCwgICAtMTA5LCAgICAxNTAsCisgICAgICAgMjAyLCAgICAxOTYsICAgLTI2MiwgICAgLTU3LCAgICAxNjAsICAgIDE1NSwgICAgICA3LCAgICAgIDksCisgICAgIC01NzcwLCAgICAgMjgsICAgIDEyNywgICAgMTEyLCAgICAtNzYsICAgLTc5MCwgICAgIDQ1LCAgIC0xMTgsCisgICAgICAgMjAxLCAgIC04MzEsICAgICA2NywgICAgLTgxLCAgICAxOTksICAgIDI5NiwgICAxNjkyLCAgICAtMzAsCisgICAgICAtMTI2LCAgIC0xMjEsICAgICAyOSwgICAgMzg3LCAgICAyMTUsICAgIDI2OSwgICAtNTE4LCAgIC0yMzIsCisgICAgICAgMTU1LCAgIDI3MzUsICAgLTIzNSwgICAgLTgyLCAgICAtMzMsICAgMzA4OSwgIC0zNjk2LCAgICAtMzksCisgICAgICAgLTUxLCAgICAxMjQsICAgLTIyMCwgICAgIDM3LCAgICAgNTEsICAgLTEyOSwgICAgMTk0LCAgICAtODAsCisgICAgICAgIDgxLCAgICAgIDAsICAgLTIzOSwgIC0xOTI0LCAgIC0yNDQsICAgIDEwNywgICAgMzcyLCAgICAxMTEsCisgICAgICAgMjA2LCAgICA0MTgsICAgICAzOSwgICAtMTE4LCAgLTIwNTksICAgLTQ0NiwgICAxMzc4LCAgICA2NjEsCisgICAgIC0yMTM1LCAgICAxMjIsICAgLTEwNSwgICAgIDYwLCAgICAyNzIsICAgIC05MSwgICAtMjI3LCAgICAgNDgsCisgICAgIC0zMjI2LCAgICAtODgsICAgLTEwOSwgICAgMTk5LCAgICA1NjYsICAgIDE1OCwgICAyNDEyLCAgLTQzODAsCisgICAgICAtMTc3LCAgICAxNTMsICAgIDI1MiwgICAgIDI0LCAgIC0zMjMsICAgIDI2NCwgICAtMTE2LCAgICAtMTIsCisgICAgICAtMzMzLCAgICAgOTksICAgLTE4MSwgICAtMTI0LCAgICAyNTYsICAgLTEzMSwgICAgLTM5LCAgICAtNDUsCisgICAgICAgLTg4LCAgICAgNjksICAgIC0yNiwgICAtMTczLCAgLTQ4MjAsICAgIDI4NiwgICAtMTcxLCAgICAtODIsCisgICAgICAgNDMxLCAgICAgMTgsICAgLTgyNywgICAtMTA3LCAgICAxNDIsICAgICA2MCwgICAgMzAwLCAgICA0MjIsCisgICAgICAgMjYzLCAgICAgNjEsICAgIDM1MCwgICAgIDg1LCAgIDEwODgsICAgLTEzMywgIC0xMjg0LCAgICAgNzAsCisgICAgIC00NTc3LCAgICAgIDUsICAgIDExNCwgICAgLTIzLCAgICAgMjMsICAgMjkwNywgICAgMTc0LCAgICAgNDMsCisgICAgICAgIDE4LCAgICAgMzMsICAgIC0zMSwgICAgMzIwLCAgICAgLTksICAgIDI5MCwgICAgICAyLCAgICAgLTcsCisgICAgICAgIDM5LCAgICAtMTEsICAgICA1MiwgICAgIDMyLCAgICAgLTQsICAgODQ1NCwgICAgIDE4LCAgICAgMTAsCisgICAgICAgIDY3LCAgICAgMjAsICAgICAyMiwgICAgIC0zLCAgIC0yMDksICAgLTEwMywgICAtMjEyLCAgIC0xMDEsCisgICAgICAtMTAxLCAgIC00MjAsICAtMjgzNywgICAgLTI4LCAgICAzOTgsICAgIDE0MCwgICAxMDI3LCAgIC0xODcsCisgICAgIC0yMzM4LCAgICA0MDYsICAgLTE1MiwgICAtMjg4LCAgICA3MjMsICAgLTQxMiwgIC0xODUxLCAgICAxODUsCisgICAgICAgNjQxLCAgIC0xOTAsICAgIDEwNywgICAgIC03LCAgLTMxOTQsICAgLTEyOCwgICAtMzgyLCAgICAxNjUsCisgICAgICAtMjU2LCAgICAgODUsICAgICA5NiwgICAgMTU1LCAgIC0xNDQsICAgIDQzMSwgICAtMzU2LCAgICAzNDIsCisgICAgIC0yNTA4LCAgLTIxOTAsICAgLTI2NSwgICAtMzIwLCAgLTEzNDUsICAgICAyNywgIC0xOTgxLCAgLTE5NDksCisgICAgICAgIDk1LCAgICAtNzgsICAgLTQ1NiwgICAtMzU5LCAgICAzODIsICAgLTIxOCwgICAtMTAyLCAgICAxNjQsCisgICAgICAgMzgyLCAgICA5MDcsICAgIDU5OSwgICAgNjY1LCAgIDI4NDMsICAgNDI3NSwgICAgIDE3LCAgIC0xNTYsCisgICAgICAtMjY0LCAgICAgNzMsICAgIDEwNCwgICAgLTI1LCAgIC0xMjAsICAgICA5MSwgICAgIDg0LCAgICAzMjUsCisgICAgICAgMTcwLCAgICAtNjUsICAgLTI0NSwgICAgLTIzLCAgICAgODksICAgICA1MiwgICA0NjUxLCAgICAxMjQsCisgICAgICAgMTg1LCAgICAgMzAsICAgIDMyMSwgICAgMTQ1LCAgICAxMTEsICAtMTI2NSwgICAgMTI4LCAgIC0xNTYsCisgICAgICAgIDY0LCAgICAgMjQsICAtMTkzNCwgICAgMTMzLCAgICAtODQsICAgIC0xMCwgICAgIDM0LCAgICA4MDEsCisgICAgICAtMTQ4LCAgICAtODgsICAgIDE2OSwgIC0xNjg3LCAgICA0MTksICAgMTczOSwgICAtMjA0LCAgICAtNzAsCisgICAgICAgMTg1LCAgICAxMTcsICAgIDM3OSwgICAtNDIwLCAgICAxNDUsICAtMzY1MCwgICAtMjY0LCAgIDExMTgsCisgICAgICAgMzMxLCAgIC04MTgsICAgLTY2NSwgICAtNDIwLCAgICAgNzQsICAgICAzMiwgICAtMTUyLCAgIC0yMjYsCisgICAgICAgICA2LCAgICAyMTYsICAgNDE3MywgICAgIDIzLCAgIDEyMzAsICAgIDIzOSwgICAgICAyLCAgICAtNTcsCisgICAgICAtNjkwLCAgICA1MTYsICAgICA5MCwgICAgIDU4LCAgICAtMjQsICAgIC02MSwgICAgMTc1LCAgLTI3OTYsCisgICAgICAtMTEzLCAgIC0yNzAsICAgICA5NCwgIC0yMzE5LCAgIC0xNTgsICAtMTA3NSwgICAtMjc1LCAgIC02NDcsCisgICAgIC0zODM5LCAgICAgMzcsICAgNDI2NywgICAgIDIwLCAgICAtNDksICAgIC04OCwgICAgIDcyLCAgIC0xNzEsCisgICAgICAtMTk1LCAgICAgNDUsICAgIC0yMywgICAtMTU5LCAgICAtNjQsICAgIDExMCwgICAtMjExLCAgICAgNDIsCisgICAgICAtMjExLCAgIDE1OTEsICAgIDI3NiwgIC0zNjYyLCAgICAyMTMsICAgICA1NCwgICAtMTgwLCAgICA3ODYsCisgICAgICAgLTkyLCAgIC0zMjksICAgIDM4MiwgICAgMzQ0LCAgICAxNjUsICAgIC02MywgICAgIDE0LCAgICAgLTcsCisgICAgICAgIDY2LCAgICAgMjksICAgODg3NSwgICAgIDQzLCAgICAtNTAsICAgICA2NSwgICAgIDEzLCAgICAgMTUsCisgICAgICAgIDQ4LCAgICAtNDAsICAgIDExNCwgICAgMTI1LCAgICAtMjcsICAgIDE1OCwgICAgICAzLCAgICA4NDMsCisgICAgICAgICA4LCAgIC02NDYsICAgIDEwMCwgIC0zMTIxLCAgIDE3MjAsICAgICA4OCwgICAgODk4LCAgICAzNDYsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjIyMjRtMVtdID0geworICAgICAgOTU4MSwgICAtMTk4LCAgIC0xMDAsICAgIC0yMiwgICAgMjM3LCAgICAtMTUsICAgLTEwMSwgICAgLTIzLAorICAgICAgICA0NiwgICAgMTI5LCAgICAgNjMsICAgLTE0MywgICAgICA1LCAgIC0zMDcsICAgLTE0MywgICAgIC05LAorICAgICAgICAyNywgICAgIDUwLCAgICAgNDAsICAgNjA0OCwgICAgIDI1LCAgICAgNTgsICAgIC0xNiwgICAtMTYxLAorICAgICAgLTEwOSwgICAtMTU3LCAgICAxMzcsICAgIDExNSwgICAgMTIxLCAgICAxNjQsICAgICAgNCwgICAgLTU0LAorICAgICAgNjQ3NywgICAgLTY4LCAgIC0xMjAsICAgIC0yOSwgICAgIDQ1LCAgICAgLTgsICAgIC0xMywgICAgMzM0LAorICAgICAgIC04NywgICAgMTA1LCAgLTE0NjAsICAgICAyOCwgICAtMzM0LCAgIC0xNjMsICAgIC02NCwgIC0zNjI5LAorICAgICAgIC03MSwgICAgMTc2LCAgIC0xOTUsICAgICA1MywgICAgIC0xLCAgICAtOTYsICAgLTU2MCwgICAgLTIxLAorICAgICAgIDEzNSwgICAgMTc4LCAgICAtNzcsICAtNDIwMiwgICAgIDIwLCAgIDI1NDQsICAgLTIwNSwgICAgIDg1LAorICAgICAgLTMzMiwgICAgMTU4LCAgICAgNjEsICAgLTEwNSwgICAgMzk4LCAgICAtODgsICAgICAxNCwgICAgMjQxLAorICAgICAgLTE0OSwgICAgIDYyLCAgIC0xMjQsICAgLTEzNiwgICAtMTUzLCAgICAgMjcsICAgIDE5MCwgICAyNTk1LAorICAgICAgICAyNSwgIC0yNDk5LCAgIC01MzAsICAgMTgwOSwgICAtMTA0LCAgLTI3NTMsICAgIDI5OCwgICAgMTQ1LAorICAgICAgLTc3MSwgICAgMTM5LCAgICAxNjUsICAgMjQ2MiwgICAtNTAyLCAgICA4NjAsICAgLTE3NCwgICAgMTk5LAorICAgICAgICA3NCwgICAgMTYzLCAgIC02ODYsICAgIC0yNSwgICAgIDU3LCAgIC0xMDMsICAgLTMwOSwgICAtMzYwLAorICAgICAgICAzOSwgICAtMjk2LCAgLTI3NjUsICAgLTMxOSwgICAtOTUwLCAgIC02NzgsICAtMTE1OSwgIC0xNzQzLAorICAgICAgMTQ5OSwgICAxNzc2LCAgIC0xNzYsICAgICAgOSwgICAgIDQ0LCAgIC01ODEsICAgICA2OSwgICAgIDM5LAorICAgICAgIDE2MiwgICAgMzI2LCAgICAtOTYsICAgIDMyOSwgICAgIC05LCAgIDEyNzQsICAtMjQ0MywgICAtMTA1LAorICAgICAgIC01MCwgICA0MjEyLCAgICAtMjMsICAgIDE0NiwgICAtMjMxLCAgICAtMjIsICAgIC01MCwgICAtMTI4LAorICAgICAgICAxMSwgICAgIDI4LCAgICAxMTYsICAgLTIxNSwgICAgIDQ2LCAgICAyMTcsICAgIDIwNCwgICAgMTUzLAorICAgICAgIC03MywgICAtMTU2LCAgIC0xMDAsICAgIC0zMSwgICAyNjMyLCAgIC0xOTAsICAtMjI1OCwgICAgMTk5LAorICAgICAtMTc1NywgICAgMTk0LCAgICAgNTMsICAgICAzOCwgIC01NzIzLCAgICAgNjYsICAgIDE2OSwgICAgMzUyLAorICAgICAgIC0zOSwgICAtMTUwLCAgICAgLTEsICAgLTQ2MiwgICAgIDQxLCAgICAtOTgsICAgLTExMCwgICAgLTQwLAorICAgICAtNTc2MywgICAtMTkwLCAgIC0xNTgsICAtMTM4MCwgICAgMjA1LCAgIC0yMjcsICAgLTQwMiwgICAgIDgxLAorICAgICAgLTE3MSwgICAgNDA3LCAgIC0xMjUsICAgLTMyMCwgICAtNDU2LCAgIC0zMTcsICAgIDQ4OSwgICAgNjk4LAorICAgICAgLTMwOCwgICAzOTg5LCAgIC0xNzIsICAgIDQwMiwgICAgMTk2LCAgIC00NTcsICAtMTIzOCwgICAtMTkyLAorICAgICAgLTU4MSwgICAgLTYzLCAgIC0yMzUsICAgIDE1MywgIC0xMDk0LCAgICAtNTMsICAgIC00NSwgICAgLTg2LAorICAgICAgIDI0MCwgICAtMTkyLCAgLTI2NjAsICAgMjM1NiwgICAgMTUzLCAgICAtNjAsICAgIDI3NywgICAgIDMzLAorICAgICAgIDE5OCwgICAgLTU3LCAgIDEyMjEsICAtMjk4NCwgICAtMzI3LCAgIC0zMjYsICAgIC00OCwgICAgIDYxLAorICAgICAgICA5MywgICAgLTM0LCAgIC0xNjcsICAgLTMxMSwgICAgOTA0LCAgICAzNDgsICAgIDQxNSwgICAgIDU3LAorICAgICAgMjAwMCwgICAgLTc3LCAgICAyMzgsICAgICA0MCwgIC0zMDcyLCAgICAtMzYsICAgIDI4MywgICAgLTU0LAorICAgICAgLTY1NSwgICAtMjUwLCAgICAtMjIsICAgLTU2OSwgICAtNTg0LCAgICAtMTgsICAgIDczMywgICAtMjUxLAorICAgICAgIC03MiwgICAgLTI4LCAgICAgODAsICAgLTMwNiwgICAgMjExLCAgICAxODgsICAgLTE0OSwgICA0NTk2LAorICAgICAgIDMwNSwgICAgMzcyLCAgICAzNTEsICAgIC04MiwgICAtMTg0LCAgICAtNzksICAgIC02NSwgICAyNjg4LAorICAgICAgMjY3MCwgICAgLTU0LCAgICAtODEsICAgLTE3MCwgICAgIDE5LCAgICAtODgsICAgIDEyMiwgICAtMTE3LAorICAgICAgICAzMywgICAgIDUxLCAgICAtMjksICAgLTExMywgIC0yOTczLCAgICAgNDYsICAtMzI5NCwgICAgIDkwLAorICAgICAgICAgOCwgICAtMTgwLCAgIC0yMjcsICAgIC02MiwgICAgIDQzLCAgICAtMjUsICAgIDE4NywgICAtMzgwLAorICAgICAgIC0yOSwgICAgLTg5LCAgICAxMzgsICAgLTM1MiwgICAgMjMxLCAgIDI2MzIsICAgIDE1OCwgICAxOTkzLAorICAgICAgIC0xNSwgICAgMzUwLCAgICAxMDcsICAgLTk4MiwgICAgLTE2LCAgLTExMjAsICAgIDEzNiwgICAtMTcxLAorICAgICAgIC00MiwgICAyNjA1LCAgIC0xODYsICAgIDExMCwgICAgMTY3LCAgIDE2NzMsICAgMTE0MCwgICAgLTI5LAorICAgICAgLTY4OSwgICAgIDgxLCAgICA5MDksICAgLTQ1NSwgICAyOTc5LCAgICAgNDQsICAgICAgMSwgICAtMjYwLAorICAgICAgICAyNiwgICAgIDI4LCAgICAtOTAsICAgLTU2OCwgICAtMTIzLCAgIC0xNzUsICAgIDIzMiwgICAgLTM4LAorICAgICAgMjM3MiwgICAgMTExLCAgICAzMTIsICAgIDUyOSwgICAgLTY1LCAgICAzMzEsICAgIDEwMCwgICAgNDg4LAorICAgICAgICAxMiwgICAtNTk2LCAgIC00OTcsICAgMjMxMSwgIC0xMDk3LCAgIDEyNDIsICAgIC05NCwgIC0yMjkwLAorICAgICAgLTE1OCwgIC0yNjUxLCAgICAgMTYsICAgLTIzMiwgICAzMzUyLCAgICAgMjQsICAgIC01MywgICAgLTgzLAorICAgICAgICAtNSwgICAgLTUyLCAgICAyMDUsICAgLTEwNCwgICAtMjk0LCAgICAyMTcsICAgLTE5NiwgICAgLTM3LAorICAgICAgICAtNywgICAgICAwLCAgICAtMjgsICAgIC00NSwgICAgIDYwLCAgICAgMTMsICAgICA0MSwgICAgMTExLAorICAgICAgIDE0MiwgIC03MzMxLCAgICAtNDAsICAgLTIwMCwgICAgIDE4LCAgIC0xNjYsICAtMTI2NiwgICAgLTQ3LAorICAgICAgLTI1MCwgICAtNTkyLCAgIC02MDQsICAgICAzMywgICAgIDgzLCAgIC0yMDQsICAtMTEzMSwgICAtMTY2LAorICAgICAgMTM0OCwgIC0xMzM3LCAgICAxODQsICAgICA1MCwgLTEwMDY2LCAgICAgMzAsICAgICAyNCwgICAtMTg0LAorICAgICAgIDEzNywgICAgIDUzLCAgICAgMzIsICAgICA4NywgICAgLTI3LCAgICAxNTEsICAgIDEwMCwgICAgIDEwLAorICAgICAgIC00NywgICAgIDI4LCAgIC0xMzgsICAgICAxMiwgIC0yOTc3LCAgIC0zNzYsICAgICA1OCwgICAgMTY4LAorICAgICAgMTY0MiwgICAgMTQ0LCAgIDEwMzksICAgLTM5OSwgICAtODA3LCAgICAgIDUsICAtMTcxNSwgICAgIDEyLAorICAgICAgLTE0MiwgICAgLTc3LCAgIC0zMDYsICAgIDc1OCwgICAgNjc0LCAgICAtODIsICAgMzIxNiwgICAtMzY5LAorICAgICAgICA2MCwgICAgNDgwLCAgICAyNzYsICAgLTQyMywgICA1MTAyLCAgIDMzMjUsICAgIDE2OSwgICAgIDQ3LAorICAgICAgIDIzNSwgICAgIDM3LCAgICAgODEsICAgIC04NiwgICAgLTI4LCAgICAtNTYsICAgIC01OSwgICAtMjA1LAorICAgICAgLTEyNiwgICAgIDI4LCAgICAyNzksICAtODQzMywgICAgMTM3LCAgICAtMjYsICAgLTQwOSwgICAgLTE5LAorICAgICAgIDEwNiwgICAtMTYzLCAgICAtNzYsICAgIC01NywgICAgMjM1LCAgICAgIDcsICAgIDEzMSwgICAgLTgxLAorICAgICAgLTE5NywgICAtMzE4LCAgIDEyODEsICAgIDMxMCwgIC0yOTM0LCAgICA5NzIsICAtMTMzNSwgICAgIDM1LAorICAgICAgLTMwOCwgICAgLTkzLCAgIC0xMjgsICAgIDQzMywgICAgNTI3LCAgIC0xOTMsICAtMTMwMywgICAgMTYyLAorICAgICAgIC0zNCwgICAgLTg3LCAgIC0xNTcsICAgIDI2MiwgICA0OTk5LCAgICAgMjUsICAgLTMxMSwgICAtMzQ5LAorICAgICAgICA5NCwgICAtMjYyLCAgICAgIDAsICAgLTIxOSwgICAgIDU3LCAgICAgMTIsICAgICAtNCwgICAgIDEwLAorICAgICAgIC0xNywgICAgIDM4LCAgIC0zMjAsICAgICA0OCwgICAgMTU2LCAgICAgODAsICAgNTg4MCwgICAgIDQ4LAorICAgICAgICA0NSwgICAgIDMxLCAgLTEwMjIsICAgICAzMSwgICAgMjI3LCAgIC03MjcsICAgLTEzNSwgICAgMjYxLAorICAgICAgIC0yMSwgICAtNjg4LCAgICAzMDcsICAgMzE5NiwgICAgNTY1LCAgICA2MjcsICAgLTU0NiwgICAgMjM3LAorICAgICAtMjM2NywgICAgLTMzLCAgIDE2MjIsICAgIC04NywgICAxNzIyLCAgIC0yMDEsICAgIDcyMCwgICAtNTM5LAorICAgICAgLTI4OCwgIC0xMDEyLCAgICAxNDEsICAgLTM4OCwgICAgLTcyLCAgICAtMjAsICAgIC01OSwgIC0yMDQyLAorICAgICAgIC01MywgICAtMTAxLCAgICAyMDgsICAgLTIzMywgICAtODM1LCAgICAtMTYsICAgMzA5MiwgICAgICAyLAorICAgICAgIDMxMCwgICAgIDk0LCAgIC0zNjIsICAgLTE2MywgICAtMTI4LCAgICAgMzAsICAgIC0yMiwgICAtMTQ1LAorICAgICAgIDQyMCwgICAgIC0xLCAgICAzMjIsICAgLTUyNCwgICAyNzQyLCAgIC0yNzYsICAgIDIwNiwgIC0yNDc1LAorICAgICAgIDU3NSwgICAtNjUzLCAgIC0zNDIsICAgMTQxMiwgICAgICAxLCAgICAgNzUsICAgIC0xNCwgICAgIDU0LAorICAgICAgIDE3MCwgICAgIDY2LCAgICAzNDIsICAgLTI2MSwgICAgNzA5LCAgICAtNzUsICAgMjI0MCwgICAtMTM0LAorICAgICAgICAzMiwgICAgNjY1LCAgICAxNzEsICAgLTEzNCwgICAxODIyLCAgICAxMDksICAgIDU2OSwgICAzMTI5LAorICAgICAgIDE2OCwgICAtMzU2LCAgICAgNTMsICAgMTI1OSwgICAgLTY3LCAgICAgNDMsICAgIDEyMCwgICAtMTI0LAorICAgICAgMjE4NSwgICAyNDYxLCAgICAtMTcsICAgLTI1NSwgICAtMzQ5LCAgIC0xNjcsICAgLTE1OCwgICAgLTE5LAorICAgICAgICA4NCwgICAtNzMyLCAgIC05NzIsICAgIDI4NiwgICAgIDg3LCAgIDQ2MDMsICAgLTE2MCwgICAgICA3LAorICAgICAgIDE0MSwgICAgICAxLCAgICAyODYsICAgIDMxMCwgICAtMzE1LCAgICAtOTksICAgIDI4MiwgICAgMzg0LAorICAgICAgICA2OCwgICAgIDkzLCAgLTE4MTUsICAgICA2MywgICAgLTg2LCAgICAxMjEsICAgLTI5MywgICAgMjEwLAorICAgICAgIDExNSwgICAgIDYzLCAgIC0xNzQsICAgIDYxNiwgIC0xODQ4LCAgIC0xMjQsICAgMTI3NSwgICAgMjk4LAorICAgICAgIDE4NSwgICAtMjY3LCAgIDM1MTYsICAgLTEwNSwgICAtMTYyLCAgIC0yNTMsICAgLTQzNCwgICAtNjc0LAorICAgICAgIC05MCwgIC0yMjMyLCAgICAgMzgsICAgIDE2OCwgICAtMjYxLCAgICAyODksICAgICA3MCwgICAzNzE0LAorICAgICAgNDA5NiwgICAgLTgxLCAgICAgMTcsICAgICA1NiwgICAgIDU3LCAgICAgNjgsICAgIC0yMCwgICAtMTQ2LAorICAgICAgICAyOCwgICAtMTUyLCAgICAtMTcsICAgIC05NywgICAtMTMxLCAgIDI2NDgsICAgICA3MSwgIC0zMzU5LAorICAgICAgICA0MCwgICAtMjc3LCAgICAzMTMsICAgICA4NSwgICAgLTI2LCAgICAgNDEsICAgLTIwMiwgICAgIDc2LAorICAgICAgICAgOCwgICAgLTgwLCAgIC0xNjAsICAgLTEwMiwgICAgLTE3LCAgICAxNTUsICAgIDE4OSwgICAxNTUyLAorICAgICAtMzQ5OCwgICAtNDQ2LCAgIC0xMDMsICAgLTIzMiwgICAtMjA1LCAgIC01NzQsICAgLTEzMiwgICAgMTY5LAorICAgICAgIDIwNiwgICAxNjg5LCAgIDEwNDMsICAgLTczNiwgICAtMTc4LCAgICAtOTMsICAtMjk2OSwgICAgIDI2LAorICAgICAgLTI1MSwgICAtMTQ4LCAgICAxMzksICAgICA3MCwgICAtMzI1LCAgICAxMTcsICAtMzA3MywgICAgICA5LAorICAgICAgICA0MywgICAgLTExLCAgIC0zODAsICAgLTE5MCwgICAtMzE0LCAgLTMwMTIsICAgICA1MCwgICAtMzMwLAorICAgICAgIC0yNiwgICAgNzEwLCAgICAxNTMsICAgICAxOSwgIC0yOTQzLCAgICAgNTgsICAtMzA1MiwgICAgLTU2LAorICAgICAgICAgNywgICAgIDQwLCAgICAgIDksICAgIDMyMSwgICAgLTM3LCAgIC00NjEsICAgIC0yMiwgICAtMzc0LAorICAgICAgICA1NywgICAtMjAzLCAgICAgMTYsICAgIC0xNSwgICAgLTI1LCAgICAtMTYsICAgIC0zNywgICAgIC04LAorICAgICAgIC00MSwgICAtMTE2LCAgIDc5NjQsICAgICA3MCwgICAgLTU5LCAgICAgNzcsICAgIDIwMCwgICAgICAwLAorICAgICAgIC00MywgICAgMTE4LCAgICAtNzIsICAgIC02NywgICAgMTA0LCAgICAgLTYsICAgICA3OCwgICAgMTcxLAorICAgICAgICAxMywgICAtMTAzLCAgICA3OTMsICAgICA5OCwgIC00NzM4LCAgIC0yMDQsICAgICAxMSwgICAgIDMwLAorICAgICAgIC03MiwgICAgIDMzLCAgICAtNjIsICAgICA0NywgICAgMTU3LCAgICAyMzYsICAgLTE0NywgICAtNDE2LAorICAgICAgLTcyNiwgICAgNTc4LCAgICAgIDUsICAgNDAzOCwgICAgMTYyLCAgICAgLTIsICAgMjM2NywgICAtMTM4LAorICAgICAgLTE4NSwgICAgNDcwLCAgIDMxMjEsICAgICA3MCwgICAgMTg1LCAgICAtMjIsICAgLTIwNSwgICAgIDM3LAorICAgICAgIC02MywgICAtMzM1LCAgIC0zOTcsICAgICA0MywgICAgIDEwLCAgLTY1NTcsICAgLTExMiwgICAtMjU0LAorICAgICAgIDEwNiwgICAtMTI5LCAgIC0yMzYsICAgICAgMCwgICAtMjUwLCAgICAgNDIsICAgLTEyOCwgICAgIDg0LAorICAgICAgLTUzMSwgICAgLTI3LCAgIDIyNTksICAgLTI4MiwgICAgLTIxLCAgICAtNzAsICAgLTQwOCwgICAgIDE5LAorICAgICAgLTY2NCwgICAgOTQ1LCAgIC0xOTYsICAtMTA3NCwgICAxMzY5LCAgICAtNDAsICAtMzIzMywgICAgIDI4LAorICAgICAgICAyMCwgIC0yMTMzLCAgICAxMjUsICAgIDM0MywgICAgMTEzLCAgICA1ODQsICAgIC0xNCwgICAgIDUwLAorICAgICAgLTEzMCwgICAtNDY0LCAgICA1MTMsICAgIDgwNywgIC00NDc0LCAgICAtNjMsICAgICA1NywgICAxMTIwLAorICAgICAgICA2NCwgICAgLTMwLCAgICAzNDYsICAgIDQ2MiwgICAgMTI5LCAgICAyMTksICAgIC0zMCwgICAgMjg3LAorICAgICAgIDQ0OCwgICAgMzg0LCAgICAxOTgsICAgLTM1OSwgICAxMDk3LCAgIC0yNTYsICAgIDgyOCwgIC0yNjM1LAorICAgICAgLTMxNCwgICAgMzM2LCAgICA1MDYsICAgLTE0NCwgICAgMTk0LCAgICAxNjcsICAgMTMyMywgICAtMjczLAorICAgICAtNDE2OCwgICAyODA1LCAgIC0xMTgsICAgICAtOCwgICAgMTM2LCAgICAtODIsICAgLTIxMiwgICAgIDUzLAorICAgICAgLTI1OSwgICAgLTYxLCAgICAgOTQsICAgIDIxNCwgICAgIDExLCAgICAgMjksICAgLTI2MiwgICAgLTY5LAorICAgICAgICAyNCwgICAgMTAyLCAgICAgNDUsICAgIC0zMSwgICAtMTg2LCAgICAgNTgsICAgIDY0MSwgICAgNjU5LAorICAgICAgLTE3MiwgICAzNjI4LCAgIC0xOTIsICAgLTQyMywgICAgIDM0LCAgICAgIDMsICAgICA0NSwgICAgIDE5LAorICAgICAgIDM0OSwgICAgMTE3LCAgICAgLTUsICAtNDkyMywgICAgIDk5LCAgIC0xNDgsICAgIDE4MCwgICAgNjMxLAorICAgICAgICA1MCwgICAtMjA0LCAgICA2NDEsICAgIC05MiwgICAgMTU2LCAgLTE5ODUsICAgMTA3NywgICAgMjAxLAorICAgICAgICA1NiwgICAtNDA1LCAgICA3MTAsICAgLTIyMCwgIC0xOTE3LCAgIC0yNzMsICAgLTIzNCwgICAgMTAwLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IyMjI0c2wwW10gPSB7CisgICAgIC0zMTEzLCAgICAgOTcsICAgIDIyOSwgICAgMzA5LCAgIC0xNTYsICAgLTIyNiwgICAtNDY5LCAgICA1ODIsCisgICAgIC0zMjAyLCAgIC0zMzYsICAgIDEwMiwgICAgIDIwLCAgICAgOTYsICAgLTk2MCwgICAgMjk3LCAgIC0yMjcsCisgICAgICAgNTkyLCAgLTMzNTIsICAgMjc5OCwgICAtNjM3LCAgIC0xMzMsICAgIDE5MSwgICAtNDA3LCAgICAxNzAsCisgICAgICAtNTc2LCAgIC0yMDMsICAgLTI4MCwgICAgODA4LCAgICA4NTMsICAgLTUwMiwgICAtMTEzLCAgLTE3MDQsCisgICAgIC0xMDI1LCAgICA0MTEsICAgMjgwMiwgICAgMjMzLCAgIC01NjgsICAgIDM2MCwgICAtNjE2LCAgLTE3MTUsCisgICAgICAgIDQ3LCAgICAzOTEsICAtMjExNywgICAtNDU4LCAgIC0yOTEsICAgLTE0OSwgICAgLTgyLCAgICAgMjYsCisgICAgICAgLTI5LCAgICAtODgsICAgLTE1NiwgICA3OTA1LCAgICAgMzIsICAgIC03NSwgICAtMTU0LCAgICAtNzgsCisgICAgICAgLTQ0LCAgICAxNTUsICAgICAtMSwgICAtMzM4LCAgIC04OTEsICAgIDE3MCwgICAgLTc1LCAgICAxNTUsCisgICAgICAgMjI2LCAgIC0xOTIsICAgLTMyOCwgICAtMjM5LCAgIC01NzQsICAgIC05MSwgICAgIDk1LCAgIC02MDAsCisgICAgICA0MjcxLCAgICAgMjUsICAgIDk5MCwgICAtMjA3LCAgIDQ2NzYsICAgICA1OSwgICAtMzI0LCAgICA4ODQsCisgICAgICAgMzYzLCAgICAgNjUsICAgIDQyMywgICAtNzc2LCAgIC05MDYsICAgIC03OSwgICAgIC00LCAgIDE0NzUsCisgICAgICAgNTQ5LCAgIC0yNTIsICAgMzU4NCwgICAzNTQzLCAgIC00MDksICAgIDI4MiwgICAgMjc4LCAgICAxMjUsCisgICAgICAtMzc5LCAgICAxMjUsICAgLTE4MCwgICAtMTIzLCAgIC0yNTIsICAgLTMxNiwgICAtMTkzLCAgICAzNDcsCisgICAgICAgIDUzLCAgIDIwMDksICAgIDE5NSwgICAgMTUyLCAgIC0xMDQsICAgIDIzMywgICAgLTc1LCAgIC01NDYsCisgICAgICAgNTY0LCAgIC0xNzcsICAgMzI0MywgICAtODY1LCAgIC05MjQsICAgIDUxOCwgICAtNjkyLCAgIC0zODEsCisgICAgIC0xODg1LCAgIC0xMTAsICAgLTE4OCwgICAxMTQwLCAgLTIwNDMsICAgLTQzOCwgIC0xNzIxLCAgIDEwMTksCisgICAgICAxNjc4LCAgICAgMTMsICAgIDI3MywgICAtNzUxLCAgICA5MjIsICAgLTI5MSwgICAgLTE1LCAgICAgNzUsCisgICAgICAgMjMyLCAgIC0xMTIsICAgICA2MCwgICAyNzAyLCAgICAgODgsICAgIDE3NSwgICAtMTE5LCAgICAgNDMsCisgICAgICAtNTQ5LCAgLTEwOTQsICAtMTg3OSwgICAgNDAxLCAgIDE1ODcsICAgMTI4NywgICAgLTQxLCAgICAgNDEsCisgICAgICAtMTE2LCAgICAtMjMsICAgIDMxMywgICAgMTY4LCAgICAxNDcsICAgLTEwMSwgICAgLTU3LCAgIC0xMTUsCisgICAgIC02OTkwLCAgICAgNTQsICAgIC0xNCwgICAtMjQwLCAgIC0xNjQsICAgIDEyNywgICAgIDI1LCAgIC03MDMsCisgICAgICAtMzYxLCAgICA3NjksICAgMTU1NSwgIC0yNDQwLCAgLTI2MTYsICAgLTE5MiwgICAgIDg2LCAgICA3NjksCisgICAgICAgLTI5LCAgIC03MjEsICAgIDU1NCwgICAtNjYzLCAgICAzMjcsICAgIDY1OSwgICAgLTMxLCAgICAtNzksCisgICAgICAgIDkxLCAgICAzNjUsICAgIC03NCwgICAxMjY4LCAgICAxMTUsICAgIDQ4MCwgICAzMDU0LCAgLTE3NTgsCisgICAgICAxNzA0LCAgICA3NTksICAgLTY1NywgICAtMjcyLCAgIC0zMjksICAgICAzMSwgICAtMTQ1LCAgIC01MzQsCisgICAgICAxMjY1LCAgICAgNzMsICAgIDQzNSwgICAgLTU0LCAgICA0ODAsICAgLTg2NywgICAyNzI0LCAgIDIzNzMsCisgICAgICAgODkwLCAgIC0zMTQsICAgLTExMiwgIC0yNTc2LCAgIC01OTgsICAgIDQ3MywgICAgMTIxLCAgIDI3NjQsCisgICAgICAxNjU5LCAgICAxMDUsICAgIDU3OSwgICAtNDE2LCAgICAtODcsICAgIDE1OCwgICAgMzAwLCAgICA0NDcsCisgICAgICAtMjgxLCAgLTYxMDksICAgICAzNSwgICAgMjE3LCAgICAxODUsICAgICA1NiwgICAtMzU3LCAgICAxNTEsCisgICAgICAgMTA4LCAgICAtNDksICAgLTI4MiwgICAtNDg0LCAgIC0yMjAsICAgIC03OCwgICAtMTQxLCAgICAyNTYsCisgICAgIC0xMDk1LCAgIDE4MTIsICAgLTk4NSwgICAxMTE1LCAgICA1NTUsICAtMjExNiwgICAyMzE3LCAgLTExNDEsCisgICAgICAtNzkyLCAgIC04NjYsICAgLTExOSwgICAgMTg3LCAgICA2MTUsICAgLTE5NCwgICAgIDczLCAgICAtNDMsCisgICAgICAgMjY4LCAgICA0MzcsICAgIDI1MCwgICAgLTUyLCAgICA0NzcsICAgLTI0OSwgICAtNDc1LCAgLTI2MjEsCisgICAgICAgNTkwLCAgLTI5ODcsICAgLTYwMywgICAtNjUyLCAgICA5NzEsICAgLTY4NCwgICAgMzM3LCAgIC0xNDAsCisgICAgICAtMzM2LCAgIDIzNDIsICAgIDM5MCwgICAtMjA0LCAgICAyOTUsICAgICA4NSwgICAgLTQ0LCAgICAzMjEsCisgICAgICAgNzU0LCAgIDI2NjAsICAgICA2MSwgICAgNzgyLCAgIDE2NTQsICAgIC03NiwgICAyNzI3LCAgIDE1OTAsCisgICAgIC0xMDk5LCAgICAzNTQsICAgICA0OSwgICAyNzg0LCAgICA0NDMsICAgLTc2MiwgICAgODI4LCAgIC0zMDgsCisgICAgICAtNDkzLCAgIC03NTUsICAgLTM3MCwgICAtMzM2LCAgIC0yMDcsICAgIDM4OCwgICAgNjMwLCAgIC0xMjcsCisgICAgICAxOTU1LCAgIDE5MjksICAgMTI3MCwgICAyMDU0LCAgICA1MjUsICAgIDM4OCwgICAgNTYyLCAgICA5NDIsCisgICAgICAtNzg5LCAgIC00NTMsICAgIDE1OCwgICAgOTk1LCAgICAtOTksICAgMjI1OCwgICAtMzE3LCAgIC00OTMsCisgICAgICAgMzg1LCAgICAtOTAsICAgIC03OSwgICAgMTk5LCAgLTExODcsICAgIDUxOSwgICAtMjU0LCAgICAxNzksCisgICAgICAgNTczLCAgIDI4MDMsICAgMjM0MSwgICAgNDA3LCAgICAgOTUsICAgIDUxNSwgICAgMzMyLCAgICAgIDEsCisgICAgICAgIC02LCAgIC0zMzcsICAgIDE0MiwgICAtMzE2LCAgICA0MTgsICAgIDU0MiwgICAzMjgxLCAgICAgMTAsCisgICAgICAgNjA0LCAgIC01NDIsICAtMTU5NSwgICAgIDQzLCAgICAgNzksICAgICAxMCwgICAgIDc1LCAgIC0xMjIsCisgICAgICAgMTAwLCAgICAtNTUsICAgIDIxMiwgICAtMjIzLCAgIC0zNTMsICAgLTU1NywgICAgNDkwLCAgIDQ4NzAsCisgICAgIC0zNjg5LCAgIDM1OTQsICAgLTE0NSwgICAtMTkyLCAgICAtNDcsICAgLTI1MiwgICAtMzgwLCAgIC0xODAsCisgICAgICAtMjIxLCAgICA2NTYsICAgICA3OCwgICAtMTg4LCAgICAxMjAsICAgIDEzNSwgICAtMjUzLCAgIC00MzcsCisgICAgICAtMjA4LCAgIC0xNTEsICAgLTUwNCwgICAgMjE3LCAgLTM3MTUsICAgLTE1MCwgICAgNTI4LCAgICAxMjEsCisgICAgIC0xNDY4LCAgICAzODMsICAgIDgyMywgICAgLTU1LCAgLTExNjcsICAgICAtOCwgICAtMTk4LCAgIC01MTUsCisgICAgICAtMjk2LCAgICAtMjQsICAgICA4NCwgICAgMTI5LCAgIC00NzIsICAgICAgNywgICA1MDcxLCAgIC0xMTQsCisgICAgICAtMjAwLCAgICAtMTYsICAgLTI3MSwgICAgIDU5LCAgIC00MzAsICAgLTE0MiwgICAtMzE1LCAgICAgOTAsCisgICAgICAgMjczLCAgICAtNTYsICAgIDM3MCwgICAzMzQyLCAgIC0xNTksICAgIDIzNSwgICAgOTM0LCAgIDE2MDUsCisgICAgIC0xNDk5LCAgICAyMDcsICAtMTY1MCwgICAxMTM3LCAgICAzOTYsICAtMjI1MCwgICAgMjc2LCAgIC0zMjAsCisgICAgICAtMzE3LCAgICAtMjMsICAgIDI3NiwgICAtNTE5LCAgICAxNjMsICAgIDU2NiwgICAgMzY2LCAgICAgLTYsCisgICAgICAyMjYyLCAgLTIwMzUsICAgLTY2MiwgIC0zMzAwLCAgIC0xMzMsICAtMzgxMSwgICAtMzYyLCAgIC0zNDgsCisgICAgICAgMTEzLCAgICAxNDYsICAgIC03OSwgICAtMjk4LCAgICAyMzgsICAgIDIyMSwgICAgIDk5LCAgICAxOTQsCisgICAgICAgMzI2LCAgICAzMjUsICAgLTExMiwgIC04MTYwLCAgICAtNTksICAgIC0xNSwgICAgICA4LCAgICAtNDEsCisgICAgICAtMjYxLCAgICAtMjAsICAgICAtNiwgICAgLTY4LCAgIC0xNDAsICAgIC00MSwgICAgMTY3LCAgIC0xMjUsCisgICAgICAgMTI5LCAgICAzMzcsICAgMjQwNCwgICAgMjgxLCAgIC0zMzYsICAgLTQ3NSwgICAyMDg1LCAgLTI2NDYsCisgICAgICAgNTcyLCAgLTEzMDgsICAgIDM3NiwgICAgMTE0LCAgIC01MDYsICAgMTA2MiwgICAtNTc1LCAgIC01MjksCisgICAgICAzMzQ3LCAgIC0yMTIsICAgIDUyMCwgICAgMjc0LCAgIC0xNjMsICAtMzA1OCwgICAgLTkzLCAgIC0yMDMsCisgICAgICAtOTMyLCAgIC0yMDcsICAgIC0zNiwgICAgMzAzLCAgIC0xMTcsICAgIDI3OCwgICAgMjg3LCAgICAyMDQsCisgICAgICAgMjA1LCAgIC0yMjgsICAgLTI0MiwgICAgMjI3LCAgICAgIDMsICAgIDYxMSwgICAtMTkwLCAgIC00NTgsCisgICAgICAgLTQ0LCAgIC0yMDksICAgIDEyMiwgICAtMzkwLCAgLTQ1NjEsICAgLTEzOSwgICAxMzc4LCAgIC0zMjksCisgICAgICAgNDQwLCAgICA5ODksICAtMTc4MiwgICAtMzQ4LCAgIDEyNDEsICAgIDk2NywgICAtNDc3LCAgLTIzMTIsCisgICAgICAgNTU0LCAgIC05NzAsICAtMTEwMywgICAgNDczLCAgIC03NzEsICAgIC01MCwgICAgMTUwLCAgICAzMjcsCisgICAgICAgMzk0LCAgIC0yNjcsICAgLTY0OCwgICAtNjgwLCAgIDIzNzYsICAtMjU0MywgICAgMjc2LCAgIDEyMjAsCisgICAgICAgNTUyLCAgICAgMTAsICAgMTM5OSwgIC0xNDk4LCAgIC04MDEsICAgICAgOSwgICAyMzUxLCAgICAtNTUsCisgICAgICAgMTU1LCAgICAzMjcsICAgICA4OCwgICAgODY0LCAgICA0MjgsICAgIDE3OSwgIC0zMjM0LCAgICAgIDYsCisgICAgICAgNTQ0LCAgIC02NDcsICAgLTMwNiwgICAgMTMyLCAgICAzMjksICAgMTE0NywgICAxOTIwLCAgIDE0MzYsCisgICAgIC0yMTA3LCAgLTExMjIsICAgIDM0MSwgICAyMDIwLCAgIC00MzIsICAgIC05NywgICAgMTE3LCAgICA3OTMsCisgICAgICAgMTAwLCAgIC02OTMsICAgIDE3NCwgICAzNjM5LCAgIC01NzAsICAgIDkxMCwgIC0yNzcxLCAgICAyMzEsCisgICAgICAtMTQ4LCAgIC05NjAsICAtMTA4NSwgICAgIDU3LCAgICAxODgsICAgIDc0NCwgICAtNzA5LCAgIC00NDEsCisgICAgICAgNTMzLCAgIC0yOTUsICAgMTI4NywgICAyOTM5LCAgIDI5ODcsICAgIDg4NSwgICAgNjExLCAgICA3MDAsCisgICAgICAgMzY0LCAgIC0yMDUsICAgLTg1NSwgICAtNjE3LCAgICAgNDgsICAgLTE2MiwgICAtMjQ0LCAgIC0zMTgsCisgICAgICAgMjA4LCAgICA3NzIsICAgLTEyNCwgIC0yNTA1LCAgICA0NTQsICAgIDMzMCwgICAtMjIwLCAgICAzMzUsCisgICAgICAtMzYyLCAgIC04OTksICAgLTgyNywgICAyMTg4LCAgICAtNDAsICAtMTYzOCwgICAgMzU2LCAgIC0xNjAsCisgICAgICAtMTI3LCAgIDI4ODYsICAgIC02OSwgICAgLTQxLCAgICAyMDksICAgMTg0NywgICAtMjM2LCAgIDI3NTIsCisgICAgICAgLTI0LCAgICAzODcsICAgIDM1NCwgICAtMTExLCAgICA1MjYsICAgLTIzNywgIC0yMTY5LCAgIDEzMTksCisgICAgICAyMjExLCAgICAxNDQsICAgLTM0OCwgICAtNDM0LCAgIC0zMTksICAgMTM3MywgICAgIDc4LCAgICA5MDYsCisgICAgICAgNzAxLCAgICA1MzksICAgLTEzNCwgICAgNDE0LCAgICA0OTYsICAgLTMyNSwgICAgLTM2LCAgICAxMTYsCisgICAgICAgMTI0LCAgIDQxOTgsICAgIC0zNSwgICAtNDM5LCAgIC0yMDgsICAgLTUzMSwgICAtMTAwLCAgIDE0NTMsCisgICAgICAtMTc1LCAgICA3MjMsICAgLTkwOCwgICAtNDYxLCAgICAgODcsICAgIDEyNywgICAgLTkxLCAgIC0xMjUsCisgICAgICAtMTQwLCAgIDgwMTIsICAgLTE4NiwgICAgIDIzLCAgICAtOTMsICAgIDEwNywgICAgMTc2LCAgICAyMTgsCisgICAgICAgIDM1LCAgICAxOTMsICAgIDE3NCwgICAgLTI3LCAgICAgLTQsICAgICA3NywgICAtMTAzLCAgIC0xOTksCisgICAgICAgMTE2LCAgICAtNDEsICAgIC04MCwgICAgMTg2LCAgLTY5NjUsICAgLTE4OCwgICAgMTI1LCAgICAtNTQsCisgICAgICAgIDQzLCAgICAgIDksICAgIC00OSwgICAtMTkyLCAgICAgNjksICAgLTEzNiwgICAgLTI0LCAgIC0xMTcsCisgICAgIC0yMjQ0LCAgIDIyODksICAgIDE0NSwgICAgMjI2LCAgLTExNjEsICAtMTk1MCwgICAgODgxLCAgIC0xNTIsCisgICAgICAxNjExLCAgIDEwMTUsICAgLTE3NCwgICAtMjc3LCAgIC0xNTgsICAgIDM2OSwgICAgIDQ5LCAgIC0yMzMsCisgICAgICAgMjIxLCAgICAyNzUsICAgICA2OSwgICAgMTA4LCAgICAxMzYsICAgLTEyNCwgICAgICAxLCAgIC00NzAsCisgICAgICAgMzc2LCAgICAxNDksICAtNzU5NiwgICAgIDU1LCAgICAgNTMsICAgIDIxMywgICAtMjQ3LCAgICAgODAsCisgICAgICAtMjE3LCAgICAtMTEsICAgIDE4OSwgICAgMTI1LCAgICAtMTcsICAgLTE0MSwgICAgMTY1LCAgLTI4OTAsCisgICAgICAgIDE0LCAgICAyMDEsICAgIDEwNiwgICAgMjQyLCAgIC0yNTQsICAgLTMwNiwgIC0zMTU3LCAgICA0NTksCisgICAgICAgLTEwLCAgICAgMjQsICAgLTI3MSwgICAgODc3LCAgICA0MzcsICAgLTQzOCwgICAgIDE4LCAgIC0xMjYsCisgICAgICAgIC05LCAgIDU1NTMsICAgICA2MywgICAgIDIyLCAgICAgNTUsICAgIDE3MiwgICAgIDIxLCAgIC0zMzUsCisgICAgICAgMTI3LCAgICAxNjAsICAgIDIwOCwgICAgMTIxLCAgICAgMTMsICAgMTk4OSwgICAgNjc2LCAgIC0yOTQsCisgICAgICAyMjA4LCAgICAtNzgsICAgIDYzNCwgIC0xNTE4LCAgLTEwMzcsICAgMTMwOSwgICAgMTI0LCAgICAtMzksCisgICAgICAtMzIyLCAgLTE0MjAsICAgLTQwNCwgICAgMzc3LCAgICAtMzUsICAgIC0xNCwgICAgMTc4LCAgICAxMTAsCisgICAgIC04MTQ2LCAgICAgMjYsICAgIC05OCwgICAtMTUzLCAgIC0yNDMsICAgIDE0NSwgICAgMjgwLCAgICAgLTgsCisgICAgICAgIDI5LCAgICAtNTcsICAgICA4NSwgICAtMzA5LCAgICAyODEsICAgIDI4MiwgICAgLTQ3LCAgICAtMjcsCisgICAgICAyODI3LCAgIC05NDcsICAgIDE0MSwgICAgODU2LCAgLTI0ODEsICAgIDQwNiwgICAtNjM4LCAgIC0zNjIsCisgICAgIC0xMDMxLCAgICAyMzAsICAgLTM0MSwgICAtMTE5LCAgICAtMTcsICAgICAgMSwgICAgMTkwLCAgICAgNDEsCisgICAgICAgLTE1LCAgIDUxMTEsICAgICA1OSwgICAgIDc0LCAgICAxMjMsICAgLTI4MiwgICAgLTI1LCAgIC0zMDAsCisgICAgICAgICA0LCAgIC00NjAsICAgLTIxNiwgICAgMjk1LCAgIC0yMTcsICAgICAyNiwgICAgMjI3LCAgICAgNjIsCisgICAgICAgMzg1LCAgICA3NDgsICAgMjkyMywgICAxOTQ2LCAgICAzOTEsICAtMTY3NiwgICAgNTk5LCAgICAxNDgsCisgICAgICAtNDU2LCAgICAtOTYsICAgMTA2NiwgICAgNDc4LCAgICAxMTcsICAgIDI1NSwgICAtMTY5LCAgIC02NjksCisgICAgIC0xOTM5LCAgIC02NTYsICAgMjY3NiwgICAgNjc3LCAgLTIwMjAsICAtMTMxNCwgICAgNDI1LCAgIC01MjUsCisgICAgICAgLTg5LCAgIC01MjIsICAgMjcwNywgICAgMTUzLCAgICAgIDUsICAgLTIwNywgICAgMjQ0LCAgLTEwNDUsCisgICAgICAgMzMxLCAgLTEzMTUsICAgIC04MiwgICAgNDQ5LCAgLTI0NDQsICAgIDMyNiwgICAtNDg0LCAgLTIyMzIsCisgICAgICAyMzgwLCAgIC01OTEsICAgLTk5OSwgIC0yNTUyLCAgLTE1ODEsICAgIDM0OSwgICAtNDQwLCAgICAyMTcsCisgICAgICAgMjk4LCAgIC03MjksICAgICAtNiwgICAtMzk2LCAgICAtNzQsICAgIDExMCwgICAgLTcwLCAgLTM1NDMsCisgICAgICAtMzg4LCAgICAtNTEsICAgIDU5NiwgICAgMTI2LCAgICAyOTUsICAgMjA3NSwgICAtMTIzLCAgIC02OTMsCisgICAgIC0xMDcyLCAgLTE3NzksICAgLTQyMCwgICAgMTI3LCAgICA0MzIsICAtMzI0MSwgICAtMjMxLCAgIC0yNDYsCisgICAgICAgMTA1LCAgIC00MzcsICAgIC02NywgICAtMTE5LCAgLTI5NDEsICAgLTI1NywgICAgIDQ3LCAgIC05NjksCisgICAgICAgMzc5LCAgICA2MTgsICAgIC05MywgICAgICA3LCAgICAyMDIsICAgLTQyNSwgICAgLTM4LCAgICAxNDAsCisgICAgICAgNDU4LCAgIDM1OTksICAgIDI0MiwgICAgLTI0LCAgIC04MTEsICAgLTYyNCwgICAgLTE5LCAgICA1MjQsCisgICAgICAyMzk4LCAgIC0zMDAsICAgIDExMSwgICAgMzc2LCAgIDIwMTUsICAgIDQzMSwgICAgMTI1LCAgICAyMzEsCisgICAgICAtMjkzLCAgLTIzNzksICAgLTYzNCwgICAxODQyLCAgICAgLTEsICAtMTMyNiwgICAtNjEwLCAgICAtODgsCisgICAgICAgMTI4LCAgICAgODAsICAgICA3NSwgICAgIDMwLCAgICAxNzIsICAgLTIzNSwgICAgIDM0LCAgICAyMDYsCisgICAgICAgLTc5LCAgICAzMjgsICAgIDEyOCwgICAtMjgzLCAgLTY4NjIsICAgLTEwMSwgICAgMjYwLCAgICAgNjgsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjIyMjRzbDFbXSA9IHsKKyAgICAgLTM3MTAsICAgLTM0MCwgICAzMTgzLCAgICAyMDAsICAgLTEyNCwgICAgNDIzLCAgIC00MTcsICAgLTQzMiwKKyAgICAgICAyMzIsICAgLTgwOCwgICAgIDg1LCAgIC0xNDUsICAgICAzOSwgICAgMTk2LCAgIC0xOTcsICAgIC02MCwKKyAgICAgIC0xNTQsICAgLTIxMywgICAtMzIwLCAgLTI5NDEsICAgIDk5MywgICAzMDQ0LCAgIC01MDgsICAgICA2MSwKKyAgICAgIC04NTMsICAgICA3NSwgICAgIDQwLCAgICA4NzMsICAgLTc2NSwgICAtMzY1LCAgIC02MjEsICAtMjY3MCwKKyAgICAgICAxODgsICAgICA1NywgICAtNDAzLCAgIC0yMzAsICAgLTEzNywgICAgIDQwLCAgICA1NjUsICAtMTkxMCwKKyAgICAgLTExMjAsICAtMTAxOSwgICAtNjAzLCAgLTE5MjcsICAgIDE1MCwgIC0zMDg5LCAgICAgMjMsICAgLTQxNiwKKyAgICAgIC0xOTksICAtMzI2NSwgICAgIDE1LCAgICAxMjgsICAgLTUyNSwgICAtNTMxLCAgICAgOTEsICAgIC0zOSwKKyAgICAgICA1NzgsICAgLTM4OCwgICAgMzE1LCAgICAgNDAsICAgMjM3NiwgICAxNzYyLCAgICAgIDIsICAtMTQ3NSwKKyAgICAgLTE3NzQsICAgIDExMSwgICAgOTM0LCAgIC00NTksICAgIDc3NywgICAtNTgyLCAgICAxMTQsICAgLTIxOCwKKyAgICAgICAtODIsICAgLTE5NSwgICAgMTY1LCAgIDIxNzEsICAgIDYzMiwgICAgLTY3LCAgICAyMzksICAgIDM0NSwKKyAgICAgIC0yNTcsICAgIDEwNCwgICAgLTM0LCAgIC04NzksICAgIDQ4OCwgICAtNDIyLCAgLTIxNTYsICAgLTgyMywKKyAgICAgIDE5NDAsICAgIDY5OSwgICAyOTExLCAgIC0yMzMsICAgLTEyNSwgICAtMjE4LCAgIC0xMTEsICAgLTMzNSwKKyAgICAgLTM0NzUsICAgIC02MSwgICAgLTcxLCAgIC00NDUsICAgIDI0OSwgICAtMzMwLCAgICAxMDIsICAgIDM3NiwKKyAgICAgIC0xMTYsICAgMjY2NywgICAtNDUzLCAgICAgMTksICAtNDEyOSwgICAgIDkwLCAgIC01MDcsICAgIDIzNiwKKyAgICAgICA0MTgsICAgICA0MywgICAgIDc5LCAgICAgNjEsICAgIDI5NiwgICAgMTgxLCAgICAxOTAsICAgIDQwOCwKKyAgICAgICAyMTYsICAgIDE5OCwgICAgIDMyLCAgICAtODEsICAgIDI0NSwgICAtMTU3LCAgIDU1NTUsICAgLTE2MiwKKyAgICAgICAzMTgsICAgIDE3OSwgICAgMzM5LCAgIC00NjMsICAgLTQ0OCwgICAtMjU0LCAgIC01MjYsICAgLTE5MiwKKyAgICAgIC00MjcsICAgIDU3NSwgICAgNTg4LCAgIDI3OTIsICAgMjY4MywgICAtODUzLCAgIC01NjYsICAgICAxOSwKKyAgICAgICAtMjYsICAgIDEwNiwgICAtMjIwLCAgICA1MTgsICAgIDczNCwgICAtMjMzLCAgICAgNjgsICAgLTYwNCwKKyAgICAgIC0yMzEsICAgIDI1NiwgICAtMTg3LCAgICAtNTksICAgLTQwNSwgICAgMjA2LCAgICAzMzEsICAgIC0yNSwKKyAgICAgLTQ4MzcsICAgLTMyMywgICAgMTQ2LCAgICA1NDEsICAgIDcyMywgICAgOTE1LCAgIC0xNDQsICAgIDQ1MCwKKyAgICAgICAxMDIsICAgLTM3MSwgICAgIDI3LCAgICAgODgsICAgIC04MCwgICAgMjc2LCAgICAyMzksICAgIDEwMSwKKyAgICAgICAxNTcsICAgIC02OSwgICAgLTE0LCAgICAyMzQsICAtODE5MiwgICAgLTE4LCAgIC0xMTAsICAgIC01MiwKKyAgICAgICAgLTgsICAgICA0OCwgICAgIDc5LCAgICAtNDMsICAgIDE1MywgICAgMTg3LCAgICAyMTEsICAgLTExOCwKKyAgICAgIC0xMTEsICAgIDIzOCwgICAgIDExLCAgLTIwMDYsICAgIDY4MCwgICAgNDc4LCAgIC02OTUsICAgMzA3OCwKKyAgICAgICAtMzAsICAgIDg5MiwgICAgLTIzLCAgIDE1MTIsICAgLTE5NCwgICAgNDIzLCAgICAtMTYsICAgLTMxOCwKKyAgICAgICA4OTUsICAgIDQwNiwgICAgNjM0LCAgICAgNDcsICAtMzI3NywgICAtMjA1LCAgIC03NjQsICAgIDI5NywKKyAgICAgIC0zNTcsICAgIC02MSwgICAtMTg4LCAgLTE1NDcsICAgLTg2OCwgICAtMTc0LCAgICAzNDIsICAgIDI2MSwKKyAgICAgIDE5MjYsICAgICA4OCwgICAgLTM1LCAgLTMyNTAsICAgIC0yMCwgICAzMTY4LCAgIC0zNjgsICAgIDc3OCwKKyAgICAgICAzNzYsICAgIDE2NywgICAgNTk4LCAgICA0NDIsICAgIDEzNCwgICAgNDg3LCAgICAxNjQsICAgIC0zMiwKKyAgICAgICAyNDUsICAgIDQzNiwgICAyMDY3LCAgICA1OTUsICAgLTU3OCwgICAgIDQ5LCAgIC0xNjMsICAgIDYzMywKKyAgICAgICAxMzgsICAgLTI3OSwgICAgLTk5LCAgICAxMTgsICAgMTE0MSwgIC0zMTY4LCAgICA1ODAsICAgIC05MCwKKyAgICAgLTMxOTIsICAgIDU1MSwgICAtNjYzLCAgLTI2NzMsICAgIC01NSwgICAgMTQ3LCAgIDEzMDcsICAgICAgOSwKKyAgICAgICAgMTUsICAgIDQzMiwgICAgMzA3LCAgICA1MjcsICAgMTAwMiwgICAtNDY5LCAgLTIzODAsICAgLTM0MiwKKyAgICAgIC0yOTMsICAgIC03MywgICAtMjU5LCAgICA0MTAsICAgIDMwOSwgICAgIDc2LCAgIC0zMjAsICAgLTE2MSwKKyAgICAgICAyODIsICAtMzMwMCwgICAgIC03LCAgICAxNjAsICAgIDczMiwgICAgNDg0LCAgICAtNjUsICAgIDE0NywKKyAgICAgIDI5MjMsICAgMjMyMSwgICAtODQwLCAgIDE5MzMsICAgIDI2OCwgICAgNjg0LCAgIDExNzIsICAgLTM3NywKKyAgICAgIC0zNjUsICAgLTU2OCwgICAtMjgzLCAgICA0OTIsICAgLTUzOCwgICAgNDA5LCAgIC0xOTQsICAgICAxNywKKyAgICAgIC0yOTcsICAgIC01MiwgICAtMTIzLCAgIC0yNzAsICAgIDE2MSwgICAgLTk0LCAgICAgOTIsICAgNDQ5NSwKKyAgICAgIC0zOTYsICAgIDU0MCwgICAgMjI5LCAgICAtMzAsICAgLTEwOCwgICAgIDI5LCAgICAgIDEsICAgIDE5OCwKKyAgICAgICA0OTIsICAgLTU3MiwgICAtMzk0LCAgLTIzODYsICAgMjc4NywgICAgODg1LCAgLTExNzUsICAgLTEyOSwKKyAgICAgLTExMzcsICAgIDIyMCwgICAgMTQ4LCAgICAyNjEsICAgIC02NSwgICAtMjQ0LCAgICAgIDEsICAgICA1OCwKKyAgICAgICAxOTUsICAgIC00OSwgICAtMjkwLCAgICAtOTQsICAgIC0yMSwgICAgMTA1LCAgICAgNzEsICAgNjY0MSwKKyAgICAgIC0yMDAsICAgLTQwNywgICAtNDk2LCAgICAtNzUsICAgIDIzMywgICAgMjIyLCAgICA1NDksICAgIDM2MywKKyAgICAgICAxODgsICAgIDczOSwgICAtODY5LCAgICAxMjIsICAgLTM1NSwgICAzMzI2LCAgICAzMjMsICAtMjM2NiwKKyAgICAgICAxMTUsICAtMzIwNywgICAyNzgzLCAgIDIwMTUsICAgIDE0OCwgICAgOTI0LCAgIC0xNTMsICAgLTEzMywKKyAgICAgIC0xNzUsICAgLTI4NywgICAgNDAwLCAgICAgNzMsICAgLTE4MSwgICAtMTc0LCAgICAgNzIsICAgICA0NSwKKyAgICAgICAyMTksICAgIC05MiwgICAgLTExLCAgICAgNTksICAtNTQwNywgICAtMzYyLCAgIC0xODgsICAgLTEyMCwKKyAgICAgICAyMzksICAgIDI0OSwgICAgMTMzLCAgIC0yMjksICAgIDE1OCwgICAgMTgwLCAgIC01NzUsICAtMjM4NiwKKyAgICAgIC0zNTQsICAgIDI0OCwgICAgNTMyLCAgIC01OTAsICAgIDYxNSwgICAgLTg1LCAgICAtNjksICAgIDM5NCwKKyAgICAgIDMwNTIsICAgLTg3NywgICAtMzIwLCAgICA0ODQsICAgIDIxOCwgICAtNDYzLCAgIC0yMDIsICAgLTg0MSwKKyAgICAgIDE3MjksICAgIDI4NCwgICAxMjUzLCAgIDIxOTMsICAgIDUyNiwgIC0yNDQ0LCAgIC0zNTEsICAgMTI4NywKKyAgICAgIC0zNzMsICAgIDM4NywgICAgNDQwLCAgIC0yMDMsICAgIDE2MywgICAtMTUzLCAgICAyMDYsICAgIC01NywKKyAgICAgICAtOTYsICAgMjYxNiwgICAgLTg0LCAgICA1NTIsICAgICAzMywgICAgNzA1LCAgIC03MzEsICAgLTg0MywKKyAgICAgLTIxOTcsICAtMjEzOCwgICAtNTcwLCAgICAgMjIsICAgLTI2NCwgICAyMTQzLCAgICA3MjUsICAgLTEzMiwKKyAgICAgIC0zOTIsICAgIDQ3MSwgICAtMjQ1LCAgICAgNTEsICAgIDczOSwgIC0xMDU3LCAgIDEwNDksICAgLTc2MCwKKyAgICAgIDI3MDEsICAgIDQ1NiwgICAgIDIwLCAgICA0ODQsICAgIDU5NSwgICAzMjQ4LCAgLTE0MTUsICAgLTg2MiwKKyAgICAgICAzMzIsICAgLTQxNywgICAgMzIzLCAgIC00MzEsICAgMjA4MiwgICAgIDc4LCAgICA2ODQsICAgLTE2OSwKKyAgICAgICA1OTYsICAgLTIyOCwgICAtMjE5LCAgICAxNzIsICAgIDE2MCwgICAtMTgwLCAgIC0yMjgsICAtMzE5MywKKyAgICAgIC01MjAsICAgLTEwMCwgICAtNDQ3LCAgIC02MjksICAtMjE3OCwgICAtMjU5LCAgIC0yNDYsICAtMTc4OCwKKyAgICAgLTIyNjQsICAgIDIyMywgICAgMTE1LCAgICAtNzQsICAgIDIzMCwgIC0yNTE1LCAgICAyMTIsICAgLTE3OSwKKyAgICAgICA0NTYsICAgIDIwOSwgIC0yMzc5LCAgIC0yNDYsICAgLTM0NSwgICAtMTAyLCAgIC01NTksICAgIDI1OSwKKyAgICAgIC0yNzAsICAgLTQyNiwgICAgMzMzLCAgIC0zNTgsICAgMjg2NiwgICAtNTg5LCAgLTE0OTQsICAgLTQxOCwKKyAgICAgIC0xNjAsICAgLTEzOCwgICAyMDg4LCAgICA2ODMsICAtMTMxMywgICAxMDYxLCAgICAtODgsICAgIDkxNiwKKyAgICAgIC0xNDgsICAtMjMyOSwgICAtMzAxLCAgIC0yNzEsICAgLTI0OSwgICAyODIyLCAgIC01MjUsICAgLTQwNSwKKyAgICAgICA1OTIsICAgLTMyMiwgIC0xMzI4LCAgICAtMTYsICAgIDEzNSwgICAtNTgyLCAgIC02NzYsICAgLTUwMywKKyAgICAgLTIxNjIsICAgLTMyNywgICAtMjM3LCAgICAzNjEsICAgIDE2NiwgICAgNjAwLCAgIDExNzYsICAgMTAxNSwKKyAgICAgICAgOTcsICAgICAtNSwgICAgNDY1LCAgIDIzMjEsICAtNDU0NCwgICAgMjAyLCAgIC0zNTAsICAgIDMxMywKKyAgICAgICAxNDksICAgIDU0NCwgICAtNDIwLCAgICA1NTIsICAgIDE4MywgICAgMzUxLCAgLTE2NjMsICAgIDY4OCwKKyAgICAgICAyMzgsICAgIDU4NywgICAgOTA3LCAgLTE3MTksICAgMTI2NywgIC0yMzI1LCAgICAzNjgsICAgIDIzNiwKKyAgICAgICAyOTYsICAtMjYwOCwgICAgMjQwLCAgICA5OTcsICAgIDQ5NiwgICAgMTA1LCAgICAgNzUsICAgLTE3OSwKKyAgICAgICAyMzUsICAgIDEyNSwgICAgLTQwLCAgICAgNTcsICAgIC0yMiwgICAtNDEyLCAgIC00NjQsICAgLTQ5NCwKKyAgICAgICAtODEsICAgIDU3NiwgIC0zNDYxLCAgLTEwMzcsICAgLTc0NCwgICAxMzU4LCAgIC04NTYsICAgLTI4NCwKKyAgICAgIC01MzYsICAgIDM4NywgICAtMzU4LCAgICAxODQsICAgIC04NSwgICAyMTUwLCAgLTExNDIsICAgLTEyNCwKKyAgICAgICAxMTksICAgMTI0MiwgICAgNjQ4LCAgICA3MTEsICAgMjE2MSwgICAtNTkxLCAgLTE4NjQsICAgLTY3MiwKKyAgICAgICAgNjIsICAgMTg3OSwgICAgLTEzLCAgICAgNTUsICAgIDI4NSwgICAtMTY3LCAgICAxNDIsICAgLTEzMCwKKyAgICAgICAzMjIsICAgICAgOCwgICAgLTM1LCAgIC0yMzAsICAgIDYzMiwgICAtNjk5LCAgIDQxMTQsICAgLTUwMCwKKyAgICAgIC0xODksICAgIC00OCwgICAyNzQ2LCAgICAgNDcsICAgIDQyMSwgIC0xMjAwLCAgIDI0MTgsICAgIDQ2MCwKKyAgICAgIC0zMDYsICAgIDMzMSwgICAgMTY0LCAgLTEzNTgsICAgIDgwMiwgICAgNDUzLCAgICA0NTgsICAgMzU5NCwKKyAgICAgIDMwNjUsICAgIC0yNCwgICAtMTM0LCAgIC00MzcsICAgLTg5MiwgICAtMTEwLCAgICAyNDEsICAgLTM2OCwKKyAgICAgICAzMzYsICAgIDY3MywgICAtMTQ3LCAgICAxMzAsICAgIDE1NCwgICAgIDg5LCAgICAgODEsICAgLTM0MSwKKyAgICAgIDcxNTEsICAgIDE3NSwgICAgMTE4LCAgIC0yMjcsICAgLTI4MiwgICAgMjYyLCAgICAyNzYsICAgLTExOCwKKyAgICAgIC0xMTgsICAgLTI0NSwgICAgICA3LCAgICAxNDQsICAgIC04NywgICAtMTM2LCAgIC0xNDYsICAgLTQ4NCwKKyAgICAgICAgNzAsICAgIDIyMSwgICAtMjIwLCAgICAtMTMsICAtNzYzOCwgICAgIDkzLCAgICAtMzgsICAgLTMxOSwKKyAgICAgIC00NzgsICAgICAyNiwgICAgLTI4LCAgICAyODEsICAgLTE4MCwgICAgMTgyLCAgIC0xODYsICAgICA5MCwKKyAgICAgICAxOTIsICAgICA1MCwgIC0yOTE5LCAgICAxNTMsICAtMjY1MSwgICAgMjg5LCAgICAgNDcsICAgLTc4MywKKyAgICAgICA3NjgsICAgIDM4NCwgICAgIDM5LCAgICAxOTQsICAtMjM1OCwgICAxMjQyLCAgLTE2NzksICAgICA4MCwKKyAgICAgIDEyOTIsICAgICAyOCwgICAgNjgyLCAgIDI4MDcsICAgIDM0MiwgICAgNDY2LCAgICAyOTksICAgLTM4MCwKKyAgICAgICAzNzYsICAgNDQ2NiwgICAgIDEyLCAgICA1NTMsICAgIDE1MywgICAtNDQ3LCAgICA3MzMsICAgICA5OSwKKyAgICAgICAgIDgsICAgLTE0MiwgICAgNjA2LCAgLTIzNjQsICAgIDE2OCwgICAgMTY3LCAgICAtNjIsICAgIDQwNCwKKyAgICAgLTMxNDQsICAgIDM1MiwgICAgMTE1LCAgLTM3MzQsICAgIDM2MCwgICAtMjAyLCAgIC00NjIsICAgLTE5NiwKKyAgICAgICA0NjQsICAgLTQxMiwgICAgMTkyLCAgIC0zNjMsICAgLTQxMywgICAtNDA1LCAgICAyNTQsICAgIDM1NywKKyAgICAgLTI4MDEsICAgMTA1NCwgIC0xNjAyLCAgICA2NDIsICAgLTI1NCwgICAtNDMwLCAgLTIyNTksICAgIC05NywKKyAgICAgICAgMTYsICAgLTMxMSwgICAgNzU3LCAgICAtNjQsICAgIDQxMiwgICAgMzM5LCAgIC0yMjcsICAgLTIxNiwKKyAgICAgICAtMjksICAgIDIxOSwgICAgIDY3LCAgICAgNjMsICAgICAyNiwgICAtMjMyLCAgIC0xMzgsICAgLTMwMSwKKyAgICAgICAyNDEsICAgIC01MiwgIC02MTE4LCAgICAyMjMsICAgLTM3OSwgICAtMTU3LCAgIC0yMjEsICAgLTIwMSwKKyAgICAgICAtOTMsICAtNTYzMCwgICAtMjg2LCAgIC0xOTQsICAgIDEzMywgICAgIDQ2LCAgICAxNTEsICAgIDQ0NCwKKyAgICAgIC00NzIsICAgIDEwMywgICAtMTE1LCAgIC0yNTksICAgIC01MywgICAgNjczLCAgIDE3NDQsICAtMjM3NCwKKyAgICAgICAzNTksICAgMjU0MSwgICAgNjEzLCAgIC0zOTMsICAgMTIzNSwgICAgMjIxLCAgIC0xMTcsICAgLTg0MiwKKyAgICAgIDExNjYsICAgIDEwNSwgICAtMTQyLCAgIDE0MjYsICAgICAgMywgICAtNDIzLCAgICAgMzYsICAgIDM5OCwKKyAgICAgLTI3NDIsICAgIDcyMywgICAtNzQwLCAgICA5ODUsICAgIDQ5OCwgICAgNDMxLCAgLTEzMTIsICAgIDgzMiwKKyAgICAgLTE2NDQsICAgIDE0NiwgICAgLTY5LCAgIC0xMTAsICAgIDQyMCwgICAtMTMwLCAgICAzMzUsICAgIDI2OSwKKyAgICAgLTI4NjUsICAgIC02NywgICAgLTg4LCAgICAgNTAsICAgMjczNSwgICAxMDM4LCAgICA5NzMsICAgIDM3MSwKKyAgICAgICA2NTQsICAgLTE2OSwgICAtMTEyLCAgICA1NzksICAgLTMxOSwgICAyNDM0LCAgIC03NjAsICAgIDcxMCwKKyAgICAgICAyNDEsICAtMTg4OSwgICAgIDM5LCAgLTE4MDcsICAgIC0zMCwgICAxMzgzLCAgLTEwODAsICAgIDQ0OSwKKyAgICAgICA2MzksICAtMjQ3OCwgICAtNzYwLCAgICA1NTksICAgIDI5OCwgICAgIDU2LCAgIC00MjEsICAgIDgxOCwKKyAgICAgIC00NDIsICAgMTU1OCwgIC0xNjEwLCAgIDIxMzYsICAgIC0xMiwgICAgLTExLCAgICA1OTIsICAgICA3MywKKyAgICAgICAgNzcsICAgLTE3MiwgICAgIDc3LCAgICAgOTIsICAgLTExMywgICAgMjgxLCAgICA1ODEsICAgLTU4NCwKKyAgICAgLTQ0NDgsICAgIDUwNywgICAtMTk1LCAgICAxODMsICAgLTUwOCwgICAgMzEyLCAgIC03MjQsICAgMTA0MywKKyAgICAgICAtMTgsICAgIC0xMCwgICAtNzc2LCAgIC01MzQsICAgIDI0OSwgIC0zMTc4LCAgICA5MDQsICAgMTIzNCwKKyAgICAgIC00ODIsICAgIDM4MiwgIC0xMDQwLCAgIC00NDgsICAgLTU3OSwgICAgMjI3LCAgICAtODIsICAgNTYyOCwKKyAgICAgIC0xNjUsICAgIDI1NSwgICAgMTA5LCAgIC0xNDEsICAgICAgNywgICAgLTI4LCAgICAgNjMsICAgICA5MywKKyAgICAgIC0yMTEsICAgICAgMCwgICAgMTYyLCAgICA1ODEsICAgLTE1MywgICA1ODQ0LCAgICAtNjYsICAgIDEyMiwKKyAgICAgIC0xMDIsICAgIC05MCwgICAtMjA1LCAgIC0xODEsICAgIDI0MywgICAgMzEyLCAgICAxMTEsICAgLTQzNSwKKyAgICAgIC0xMDUsICAgLTM0MywgICAgMjcyLCAgIC0xNDEsICAgICAgNiwgICAgLTk4LCAgICAtMTYsICAgIC03MywKKyAgICAgICAtMjYsICAgLTEyNSwgIC03NjI3LCAgICAtNzMsICAgIC02NiwgICAgMTA4LCAgIC0xNzUsICAgIDE4NiwKKyAgICAgIC0xODksICAgLTEwMiwgICAtMjQwLCAgICAtMzcsICAgLTM1NCwgICAtMjYwLCAgIC0xMjAsICAgICAzMCwKKyAgICAgICAgODcsICAgMjU2MCwgICAzMTU3LCAgICAzNjksICAgLTY2MiwgICAgMzM4LCAgIC01MDMsICAgIC02NiwKKyAgICAgLTE0MDUsICAgIDE3OCwgICAxMTAwLCAgIC02ODMsICAtMjYxOCwgICAyNDU5LCAgLTEyOTEsICAgLTI0OCwKKyAgICAgIC0xMzksICAgLTY4MywgICAtODY1LCAgIDE0NDUsICAgIDE2NSwgICAgMzY4LCAgICA1MDcsICAgLTU4NSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMjIyNHNzMFtdID0geworICAgICAtNjg4MCwgICAgNjU3LCAgIC02MjEsICAgICA2OSwgICAgMjE5LCAgIC01ODgsICAgIDY4MSwgICAgMjI5LAorICAgICAgIDI0OCwgICAtMzAyLCAgIC0xMTAsICAgIDczNCwgICAgIDEyLCAgICAyNTMsICAgLTQ1NCwgICAtODkwLAorICAgICAtMzU5NiwgICAgNzc4LCAgLTI2MDAsICAgLTI1NiwgICAgNTI5LCAgICAzMzIsICAgIC02OSwgICAgMjk1LAorICAgICAgLTQ1NSwgICAgOTgyLCAgIC0yNjUsICAgIC03MCwgICAtMzMyLCAgIC0zNjcsICAgMTQ5NCwgICAgNTg2LAorICAgICAgLTE1OCwgIC0xMDU0LCAgIDI1MjksICAgLTMxMywgICAtNjYxLCAgLTEzMDIsICAtMjQ4NiwgICAgNDc2LAorICAgICAgICAgNSwgICAgMTI2LCAgICA1ODEsICAgIDM2MSwgICAxNjE4LCAgICA2NTAsICAgMjAzMywgICAgMjAyLAorICAgICAgICA3NiwgICAtMjY1LCAgIC0xNjEsICAgMzY1OSwgICAtODAwLCAgIDEwNjksICAgLTE2NywgIC0xNzkyLAorICAgICAgIDM4OSwgICAtNTgwLCAgICA1OTcsICAgLTI2OCwgICAgNjIxLCAgLTEwMzUsICAgIDcxMCwgICAgODU0LAorICAgICAgMjAwNCwgICAtNzg1LCAgIDI3MTQsICAgMTY1OSwgICAgNzg1LCAgICA4MDAsICAgIC04MCwgICAgICA5LAorICAgICAgLTM0MSwgIC0xMDMyLCAgICA3ODksICAgIDY1MSwgICAxMDY4LCAgIC02MDksICAgIDY2MSwgICAgNzQ3LAorICAgICAgLTkyOCwgICAtOTk5LCAgLTEzNjksICAtMTE3MywgICAtNDE2LCAgIDE1OTYsICAtMjgwMCwgICAgMzMwLAorICAgICAgIDU0NiwgIC0xMjc1LCAgIC03NDYsICAgLTM5MiwgICAtNTI5LCAgIC0zNzgsICAgMzU3MSwgIC0yNzk1LAorICAgICAgLTczMSwgICAtMTgzLCAgIC0zMzAsICAtMTU5MSwgICAgMzcxLCAgICA4NjYsICAgIDMyMywgICAtNTE2LAorICAgICAgIC04OSwgICAyMjc3LCAgIDE1OTMsICAgIDk2MCwgIC0xNzI2LCAgLTIyMjksICAgIDcyNywgICAtNDE1LAorICAgICAgIDE4OSwgICAgNTAwLCAgIC0xNDUsICAgLTE3NywgICAgNTUwLCAgICA0NjcsICAgIDI0MCwgICAxMTMxLAorICAgICAgIDQ3NCwgICAtNDE5LCAgLTEyMzYsICAgIDY3NCwgICAtNjE2LCAgIC01MTksICAgMjQzOSwgIC0xMjEzLAorICAgICAgLTY1MCwgICAgODY3LCAgICA5NzQsICAgLTkwOCwgICAxMjI5LCAgIC01MTIsICAgIDkzMiwgICAtNDk1LAorICAgICAtMjUyMSwgICAtODY1LCAgIC00NjYsICAgICAgOCwgICAtNDI2LCAgICA5MTIsICAgIC03NywgICAtMjM2LAorICAgICAgLTQwNywgICAgNDMzLCAgICAxMjgsICAgMzY1MywgICAgODU0LCAgICAyNDMsICAgIDc3MCwgICAgMTkxLAorICAgICAgIDIyNCwgICAgLTY4LCAgIC00NTMsICAgLTM4MywgICAgMjc5LCAgIC03MDEsICAgLTY5MSwgICAgMjgyLAorICAgICAgLTQ0OSwgICAxMTQ4LCAgIC03ODMsICAgIDI0MSwgIC01MDIxLCAgICA2NDMsICAgODExMywgICAtMzQ1LAorICAgICAgICAxMywgICAgIDkwLCAgICAtNTcsICAgIDQ3NSwgICAgIDY0LCAgIC0yNjgsICAgLTE2MywgICAtMTAwLAorICAgICAgIC05NSwgICAgNTE4LCAgICA1NzcsICAgIDU0MSwgICAyMDU1LCAgICAzNTgsICAgLTE1NywgICAgMzYwLAorICAgICAgIDI4MCwgICAtODQwLCAgLTExNjEsICAgIDUwMCwgICAgIDk1LCAgICAzMDIsICAgLTY2MiwgICAxMTM0LAorICAgICAgIDgyNywgICAzMzAwLCAgICA2OTUsICAgIDc3NSwgICAtNzk4LCAgLTI2NTEsICAtMjg5MSwgIC0xMTIzLAorICAgICAgIDU1NSwgIC0xMTI1LCAgICAxNTYsICAgIDMyOCwgICAgNjcxLCAgICA3NTEsICAgLTM0NywgICAtOTcyLAorICAgICAgLTM5MiwgIC0xMjE2LCAgIDI3MjUsICAtNTE1MiwgICAtNDAyLCAgICAtMTUsICAgIDE1MCwgICAgIDMxLAorICAgICAgLTE4MiwgICAtMjc4LCAgICAyNDUsICAgICA4MSwgICAgIC0zLCAgICAtNDYsICAgIDMxMCwgICAgLTcyLAorICAgICAgLTEzOCwgICAxNTExLCAgLTE3NjIsICAtMTg0MCwgICAtMzY0LCAgICAxMjMsICAgMjgwMSwgICAgLTE2LAorICAgICAgLTU0MywgIC0xMzEyLCAgICA1NjIsICAgLTI2MiwgICAgMTQ4LCAgICA1MjEsICAgLTcxMSwgICAgIDYxLAorICAgICAgLTg2MywgICAgMTQ1LCAgICAzMjksICAgIDc2MSwgICAgIDc2LCAgIC0xNTUsICAgIDEwMSwgIC00OTg2LAorICAgICAgIDE5MiwgICAgMjY5LCAgIC0zNjQsICAgLTE3NCwgICAgNjQwLCAgIC0yNjEsICAgIDYyOSwgICAzNjM4LAorICAgICAgIDM5NywgIC0xNzU3LCAgLTExNzcsICAgIDM0MiwgICAgMzg4LCAgIDEwODksICAgIDgyNCwgICAgMTE1LAorICAgICAgIDE1MCwgICAgMTI1LCAgICA4MDYsICAgMTI3MSwgICAtMTk4LCAgICA4MDAsICAgLTE3NSwgICAtODk3LAorICAgICAgLTY0OSwgICAtODM3LCAgICA2OTAsICAgLTc1NSwgICAxNDE2LCAgLTIzNDcsICAgMTE3OSwgICAtNzgxLAorICAgICAgIDgyNiwgICAxNTY3LCAgIC0xNDgsICAgLTE1NiwgIC0xMDM2LCAgLTE1NzIsICAgMTI0OCwgICAtMTg3LAorICAgICAgIDQ2NCwgICAtMjYwLCAgIC03NDksICAtMTA3MCwgICAgIDg1LCAgIC00NjYsICAtMjE2MCwgIC0yODAyLAorICAgICAgIDIzMywgICAtMTgxLCAgICA0NDcsICAgLTQ4MiwgICAgMTEzLCAgICA1NDgsICAgMjk1NywgIC0xNjAwLAorICAgICAgMTM0MSwgICAtNTU5LCAgICA4MDMsICAgMjA4NSwgICAtODA3LCAgIC03MTEsICAtMTE2OSwgICAtNDU2LAorICAgICAgIDY1NywgICAgLTc2LCAgIC0xNDcsICAgMTkzMiwgIC0xMDU0LCAgIC05NjcsICAtMTEwMCwgICAgLTQ5LAorICAgICAtMjgyOSwgICAxNDEyLCAgICA5MjksICAgMTIwNywgICAgIDU4LCAgIC0xNDYsICAgICA3NywgICAtNDU4LAorICAgICAgIDUzOCwgICAtNjI3LCAgICAtMTIsICAgIDIxNCwgIC0yMzk3LCAgICA2OTIsICAgMTI4NCwgICAgMzY2LAorICAgICAgMTI4NiwgICAxOTk3LCAgIC04NTYsICAgIDI2NywgICAxODY2LCAgIDEyMzYsICAgICAyNSwgICAgMjU0LAorICAgICAtMTE4NywgICAzNDU2LCAgICAyODMsICAgIDU4NCwgICAyMzQ4LCAgICA2MDQsICAtMTEzMCwgICAgICA3LAorICAgICAgIDUwMCwgICAgMjMyLCAgICAtNTEsICAgIDEyMCwgICAtNjk1LCAgIC05MzAsICAgIDMxNywgICAgIDY3LAorICAgICAtMTM0NiwgICAtNTAwLCAgICAzMTIsICAtMTA2MCwgIC0yMzM4LCAgLTE4NjAsICAtMTQ5MSwgICAxNTM5LAorICAgICAtMTcwNywgICAgNzc4LCAgIC02NTMsICAgIC00MSwgICAgNDAxLCAgICAzMTEsICAgIC0xMywgICAyMTU1LAorICAgICAtMTAxMSwgICAxMTYzLCAgICA3MTIsICAgMjA5MCwgICAxMzM2LCAgIC03MjYsICAgIDU3NCwgICAxMjAwLAorICAgICAtMTI1NCwgIC0xNTY3LCAgICA3MjMsICAgIDY4MywgICAtODc3LCAgIC02NTMsICAgMTEzNywgIC0xNTk0LAorICAgICAgMTEyNywgICAyNjQxLCAgICA0NjUsICAgIDI1OSwgIC0yMDk1LCAgICA2OTYsICAgLTQwNSwgICAgIDQwLAorICAgICAgLTI1OSwgICAtODA4LCAgIC05NDIsICAgIDM5NSwgICAtMTgwLCAgLTExMTksICAgLTk2NiwgICAtMjMwLAorICAgICAgLTUzNCwgICAtMTE0LCAgICAgODgsICAgLTY2MSwgICAgNzU3LCAgICAgNzUsICAgLTI4NiwgICAtMTE5LAorICAgICAgIDkyNCwgIC0yOTI1LCAgIDI0ODMsICAgMTY2MiwgICAxODIzLCAgICA1OTAsICAgNDMwNywgICAgODEwLAorICAgICAgIDQ0NywgICAgMTY1LCAgICAyNDMsICAgLTE4NCwgICAtMTYyLCAgICA0MzYsICAgLTEyNiwgICAtMTk0LAorICAgICAgIDM2NSwgICAgNjAxLCAgIC0zNTQsICAtMTk4MywgICAtMjExLCAgIC02NjMsICAgIDI3NiwgICAgMTU1LAorICAgICAgLTY5NiwgIC0yNTQyLCAgIC04MzAsICAgMjM3NCwgICAtMjM1LCAgIC01ODUsICAgLTQ2OSwgICAtNDc4LAorICAgICAgICAyMSwgICAgODY3LCAgLTE2MzMsICAgMTk0OSwgICAtOTQ5LCAgIC0zMzAsICAgLTU0NiwgICAgMzI4LAorICAgICAgLTIyNCwgICAxMjM2LCAgICAyNjYsICAtMTExNywgICAgIDM2LCAgICAtNjEsICAgIDIyMSwgICAgMTUzLAorICAgICAtMzQ5MSwgIC0xNDYzLCAgIC0yMzcsICAgNDY3NiwgICAtMjQxLCAgICAyNzMsICAgIDI2OCwgICAgMzQ3LAorICAgICAgLTM5MywgICAtMjc3LCAgICAxNjgsICAgIDQyNiwgICAgMTU1LCAgICAtNjUsICAgLTYwNSwgICAtNTY5LAorICAgICAtMTQxNiwgIC0xMzAzLCAgIDEyNDgsICAgIDU5NSwgICAtMTQ4LCAgICA1MTIsICAgMzYyMiwgICAgMjkxLAorICAgICAgLTQ0NCwgICAtNTIzLCAgICA2MTYsICAgIDEwNSwgICAgMTAxLCAgIDEzNTcsICAgIDc3MiwgICAtMzM3LAorICAgICAgIDQ5NCwgICAgNTcwLCAgICAgMTUsICAgIDE1MCwgICAtNDAwLCAgICA1NzIsICAgIDU5MCwgICAxNjc0LAorICAgICAtNDEwNiwgICAgOTQwLCAgICAxNjcsICAgLTMyNywgICAtMzM2LCAgICA2OTYsICAgIDU5MSwgICAgMzYyLAorICAgICAgIDI3OSwgICA0NDg5LCAgLTEzMjUsICAgIDYwOCwgICAgMjk0LCAgICAtNDEsICAgIDU0OSwgICAgOTgyLAorICAgICAgIC0zMSwgICAtMTg0LCAgICAzNjcsICAgICA3NywgICAtNDY2LCAgICAzOTgsICAtMTkyOCwgICAtNjA3LAorICAgICAgIDIzOSwgICAgIDU1LCAgICAgMTUsICAgMTAzMSwgICAtNDg2LCAgIDI3ODgsICAgMjE1MSwgICAtNTE5LAorICAgICAtMTE5NywgIC0xMTQ0LCAgICAyNzQsICAgIDY3MSwgICAxNjIwLCAgIDIwNzksICAtMTU1NSwgICAtOTYxLAorICAgICAgIDU0MywgICAgLTExLCAgICAgMjYsICAgLTYyNywgICAgNzc3LCAgIC01ODEsICAtMTA2MCwgIC0xMTc3LAorICAgICAgLTgwOCwgICAgODA3LCAgIDI4NjMsICAgIDYwNywgICAgMTQ0LCAgICAxOTUsICAgLTI3NCwgICAgIDE4LAorICAgICAtNTY1NiwgICAtMzU1LCAgLTEwMjYsICAgICA1NiwgICAgMTE2LCAgIC00MzEsICAgLTQ5MywgICAgNTE3LAorICAgICAgIDI4NiwgICAgMzUzLCAgICAzNTMsICAgIDE5OSwgICAtNjUxLCAgIC04NjMsICAgLTI3NiwgICAtNTU2LAorICAgICAgLTU2MiwgICAtODY3LCAgIC0xNDMsICAgLTM1NSwgICAtMzIzLCAgICAtMTQsICAgIC01NCwgIC01MzU0LAorICAgICAgIC00MywgIC0xNTkyLCAgICAgIDgsICAgLTU0MywgICAgIDI0LCAgICAgOTQsICAgLTczMSwgICAtNTQ1LAorICAgICAgIDcwNSwgICAtMTcxLCAgICA1MDQsICAtMTA3OCwgIC0zMzY3LCAgIDEzNDksICAgIDQ1MiwgICAtMTQ4LAorICAgICAgMTE4MywgIC0xNjUwLCAgLTE0MDAsICAgLTI0NiwgIC0xMDMyLCAgIC0xMTksICAgLTMwOSwgICAtNTY2LAorICAgICAgIDk5OCwgIC0zMjQwLCAgIC00NDQsICAgLTY1OCwgICAtNjA1LCAgIC0xODYsICAgIDQ5MSwgICAgNDM5LAorICAgICAgLTE5MCwgICAgNjg4LCAgICAtMjksICAgLTk2NSwgICAyNTYyLCAgIC0xMTIsICAgLTMyOSwgICAgLTI1LAorICAgICAtMjU5MywgICAgMzU1LCAgICAtNTMsICAgIDY5MiwgICAgIDEyLCAgIC01OTMsICAgMTkzMCwgICAtODA0LAorICAgICAgIC04MiwgICAgMzg2LCAgIC02MzIsICAgIDkyNywgICAxMDA2LCAgIC0yMjksICAtMTE0NywgICAtMTgxLAorICAgICAtMTA3NSwgICAtMjQ1LCAgLTM2NzgsICAgIDkwNCwgICAtMjk4LCAgIDIyNjMsICAgICA1MCwgICAgNTYzLAorICAgICAgIDMzNywgIC0xMDUxLCAgICAxNzMsICAgIDMxMCwgIC0zNTQwLCAgIC02MTUsICAgLTUwNCwgICAgNzQ5LAorICAgICAgIDE5MiwgICAgLTkwLCAgIC0xMTMsICAgLTczMCwgIC0xOTk0LCAgICA4MDIsICAgIC00NSwgICAyMjM0LAorICAgICAgIDE2NywgICAgMjg5LCAgIDE3MjIsICAgLTU2MiwgICAgNjgyLCAgICA0NTMsICAgMTU3MSwgICAgMTcxLAorICAgICAtMjQyOSwgICAtNDQxLCAgIC0yMzAsICAtMTE0NCwgICAgOTg1LCAgLTE2MDIsICAgIDM1OCwgICAtNjg1LAorICAgICAgIC0yMywgICAtNTIzLCAgIC01MjksICAtMjQzOCwgICAgNzAwLCAgIC02MjQsICAgICAzNywgIC0xNDc1LAorICAgICAtMTMxOCwgICAzMjkyLCAgICA3MDIsICAgIDM5NCwgICAtNzk4LCAgIDI1NjMsICAgMTA1NywgICAtMzM1LAorICAgICAgIDYxNCwgICAgMjcwLCAgIDMxMzUsICAtMTI4MSwgIC0yMDg5LCAgIC0yNTAsICAgLTE0MCwgICAgIDQ1LAorICAgICAgLTUxNywgICAtNDcwLCAgLTE0MjksICAgLTE3MiwgICAyNjM3LCAgICAyNjcsICAgICA1NSwgIC0xMDM3LAorICAgICAgLTE3NCwgICAgOTEyLCAgIC04NjUsICAgLTc4NiwgICAtNDA2LCAgICA1MzcsICAtMjgwNSwgICAtNjQyLAorICAgICAtMTU5OSwgICAgODg4LCAgLTEwNDQsICAgLTE3NSwgICAgMzEyLCAgICAgMjgsICAtMTE1NywgICAtMjQwLAorICAgICAgLTE4MSwgICAgMjk4LCAgICA1MjEsICAgMzgwMiwgICAgLTg3LCAgICAgOTMsICAgICA0OCwgICAxMzM2LAorICAgICAtMTA3MSwgIC0xODcwLCAgICAzMzksICAtMTEwNiwgICAtOTQ0LCAgLTEwMzYsICAgIDM2MSwgIC0zNzE5LAorICAgICAgLTE0NywgICAgNjI1LCAgICAzMjYsICAgLTEyMiwgICAgNDA3LCAgIC0yMTcsICAgIDM5NiwgICAgMjczLAorICAgICAgICAtMiwgICAtMzE1LCAgIC0yNjIsICAgIDYzMiwgICA2ODY4LCAgICAyMjgsICAgLTI2NywgICAgMjA3LAorICAgICAgIC0yOSwgICAtMjc0LCAgICAxOTIsICAgICA2MywgICAtMzUzLCAgICA1ODgsICAgIDU1MCwgICAgIC0zLAorICAgICAgIDE1NiwgICAyMTE1LCAgIDE1ODAsICAtMjM2NiwgICAgMzA2LCAgICA2MzMsICAgMTM1NCwgICAyMzEzLAorICAgICAgLTM2MCwgICAtMzQ1LCAgICAyNzAsICAgLTQ5OSwgICAtOTc2LCAgLTM2ODUsICAtMTMwNSwgICAgOTA3LAorICAgICAgMTQzMSwgICAxNTQ1LCAgLTEzMzQsICAgICAxOCwgICAxMTU5LCAgICAyMjksICAgLTEyNCwgICAgMTU3LAorICAgICAgIDQ3MCwgICAtMTA1LCAgICA3MDAsICAtMTc4NiwgIC0xODk1LCAgICA3OTUsICAtMTA1MiwgICAtMjc4LAorICAgICAgIDc0NSwgICAtMTExLCAgICAtNDUsICAgIDY5NCwgICAgNTk5LCAgLTM0NjksICAgIDU1MiwgICAgLTcwLAorICAgICAgLTIyMiwgICAgIDQ1LCAgICA4OTYsICAgLTI1MSwgICAgICAxLCAgICAyNTAsICAgLTc2OSwgICAgMzAxLAorICAgICAtMTE1MSwgICAxMzEzLCAgIDQzMTQsICAgIDcxMCwgICAgNjgwLCAgIC0xNjksICAgLTY2MywgICAgIDQwLAorICAgICAgIDM5OSwgICAxMTcxLCAgICA1ODEsICAgIDc3NSwgICAgOTM2LCAgIC00ODgsICAtMjkxOCwgICAgMTU1LAorICAgICAgLTE2OSwgIC0xNTYwLCAgIC04NjIsICAgLTQ3MywgICAgNzgzLCAgICAtNzIsICAtMTc5MSwgICAgNTY3LAorICAgICAtMjEwOSwgICAtMTU2LCAgIDEyNTAsICAtMTQ4NiwgICAzMjUzLCAgICAgNjEsICAgIC01MCwgICAtMzc0LAorICAgICAgLTI3NywgICAgOTQyLCAgICAxMTEsICAgIDYwNywgICAtMzE2LCAgICAxOTcsICAgLTc0OCwgICAgODcxLAorICAgICAgIDYxMiwgICAtMjQyLCAgIC0yOTYsICAgICA1MywgICAtMTkzLCAgIDEyMzMsICAgICAxMSwgICAtOTYyLAorICAgICAgIDUwNSwgIC00NDkyLCAgICAgMjEsICAgIDc1NCwgICAtMTUwLCAgICA0NTEsICAgIDE4MywgICAgODgxLAorICAgICAgLTY1MiwgICAtMTU5LCAgIDYzODQsICAgIDE3MCwgICAgMjcxLCAgIDEwMzUsICAgIDQwMSwgICAgIDQ4LAorICAgICAgLTQ2MywgICAtMjQwLCAgICAtOTUsICAgLTYyNSwgICAgNjEzLCAgICAtOTEsICAtMTEzOCwgICAxMTcyLAorICAgICAgIDU0MiwgIC0xNDgzLCAgLTI2MzgsICAtMTM5NiwgIC0xMTczLCAgICA2MTIsICAgIDUxMiwgICAxMzU1LAorICAgICAgIDk3NywgICAtMzYyLCAgICAtMjIsICAgIC0xNywgICAgMTI0LCAgLTMxNzgsICAgLTUzMiwgICAgMzUyLAorICAgICAtMjY5MSwgICAgNjEwLCAgICA1NjksICAgIDc0MCwgIC0xNjAzLCAgICAgLTUsICAgLTQ5MiwgICAgNzA0LAorICAgICAgLTQzNiwgICAgLTk2LCAgIC01OTUsICAtMTQ5NSwgICAyNzMwLCAgLTMwODksICAgLTE2NCwgICAgNTY1LAorICAgICAgMTMwMCwgICAtNDc3LCAgIC01NjksICAgMTA2OSwgICAgMjk0LCAgIC0yMzMsICAgLTEzMywgICAgNzA4LAorICAgICAgIDE1MCwgICAgMzg4LCAgLTIxMDgsICAtMTA0MiwgIC0xNjAzLCAgIDIyNzUsICAtMTcyMiwgICAgNTYxLAorICAgICAgIDE0MCwgICAgNTA3LCAgIC04OTksICAgLTI4MSwgICAgMTYyLCAgLTEyOTcsICAgMTUwNCwgICAtMTU4LAorICAgICAgIDE5MywgICAtNzMwLCAgIC05NDQsICAtMjQ4NCwgICAgNjE1LCAgICAtMzAsICAgICAzMiwgICAtMzU0LAorICAgICAgLTM4MywgICAgIDg2LCAgICAzMjksICAtMzQzNCwgICAtMzgyLCAgLTE2MDQsICAgLTI5OSwgICAgMjA4LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2IyMjI0c3MxW10gPSB7CisgICAgICA4MTkyLCAgIC0xODcsICAgLTQ3MSwgICAtMjAxLCAgICAxODUsICAgLTQ2NSwgICAgOTc2LCAgICAyNTcsCisgICAgICAgIDgzLCAgIC01MzAsICAgIDMxMCwgICAgNjc2LCAgICAzNDEsICAgICA0OCwgICAgMjY1LCAgIC0zNTEsCisgICAgICAgMzA2LCAgICAyODAsICAgIDMwMiwgICAgIDQ4LCAgICA0OTYsICAgLTMzOSwgICAgNDI0LCAgLTUyNTAsCisgICAgICAtMjUzLCAgICA2MDQsICAgLTMxNywgICAtMjg5LCAgICAyNzgsICAgIDU3MywgICAtNTc5LCAgICAgNzksCisgICAgICAzMjE4LCAgIC01NzQsICAgLTM3NywgICAgMjc2LCAgIDI4MzEsICAgLTI4NywgICAtMjU0LCAgICAzMzIsCisgICAgICAtMjI1LCAgICAgNDIsICAgIDE2MiwgICAtNDU3LCAgIC05NTksICAtMTQyMSwgICAgNjgzLCAgICAtNTksCisgICAgICAgLTMzLCAgIDMzNjIsICAgIDM5MywgICAgNjA2LCAgICAyNDksICAgLTg3MywgICAtOTMwLCAgIDEyMjQsCisgICAgICAxNDY5LCAgICAgMzcsICAtMTU5MiwgICAxNjY1LCAgIC01ODIsICAgMTcyOSwgICAgMjg0LCAgICAxMDYsCisgICAgIC00NzUzLCAgIC0xMjAsICAgLTQ3NSwgICAgODY3LCAgIC00NDQsICAgLTIwMywgICAgNDMxLCAgICAtMTEsCisgICAgICAtNTI2LCAgIC0zMjQsICAgIDczMiwgIC0xMDcwLCAgIC0xNjAsICAgLTYxMSwgICAxODA4LCAgIC0yOTcsCisgICAgICAtNTM2LCAgIC0xOTQsICAgLTgyMiwgICAxMjI0LCAgIDIyMjAsICAtMjMzMCwgICAgIDcyLCAgIDEwMDQsCisgICAgICAtNzg3LCAgIC0xNDksICAgIDU1NywgICAyOTI1LCAgICAgMjksICAgIDgwOSwgICAyMzk3LCAgLTExNDMsCisgICAgICAgNjQ4LCAgICA5MDQsICAgLTU2OCwgICAtNzA3LCAgIC04MzksICAgLTI3NCwgIC0xMzIyLCAgIDExNzcsCisgICAgICAtNDY3LCAgIC00ODIsICAtNTE4MSwgICAgMjM0LCAgICAyMjMsICAgIDM1NCwgICAgMzg2LCAgICA3MzcsCisgICAgICAxMjczLCAgICAyMzQsICAgLTM1MywgICAgIDMxLCAgICAgLTgsICAgLTM5MiwgICAgIDg1LCAgIC0yMzQsCisgICAgICAxMzY2LCAgIDE0NDksICAgIDEyMCwgICAtNjk1LCAgICA4MzgsICAgLTYyMiwgICAgLTk2LCAgICAzODIsCisgICAgIC0xNDIxLCAgICA2MTIsICAgLTE3MywgIC0zMTk5LCAgIC0xNTAsICAgIDQ3NCwgICAtMzk0LCAgIC01NjEsCisgICAgIC0xMTcxLCAgIDI1NDEsICAgLTI3MSwgICAyNTEzLCAgICA2NzAsICAgIDI4NSwgICAgNjM2LCAgIC00NTIsCisgICAgICAtMjAyLCAgIDEzMTksICAtMjE4MiwgICAtOTM1LCAgIC01ODYsICAgIDI0MywgICAtODEzLCAgICAtNDEsCisgICAgICAgLTUzLCAgLTEwNDEsICAgIDIxMiwgICAgIDU4LCAgLTM0MjQsICAgIDExMSwgICAgMjY4LCAgICA5NjQsCisgICAgIC0zMjMxLCAgIC01MDAsICAgIDg2NywgICAtMTkxLCAgICAyMDcsICAgIDU0MywgICAgMzgzLCAgLTE1MDksCisgICAgIC0yNzEyLCAgLTI3NTIsICAgIDIwMSwgICAgNDI4LCAgICA3MjEsICAgIDQ5OCwgICAgIDE5LCAgIC03NDcsCisgICAgICAgIDY3LCAgICAgODcsICAgIDUwMCwgICAxMjAwLCAgIDIyNDQsICAtMTE1OCwgICAgNDY2LCAgLTEwMzIsCisgICAgICAtMTUzLCAgIDExOTcsICAgMjczNywgICAtMzI0LCAgIDIwMDIsICAgLTMzOCwgICAgIDg5LCAgIC00MjgsCisgICAgICAgIDc4LCAgICA1NzUsICAgIDMzMCwgICAyMDEzLCAgICAxNzUsICAgIDMwNSwgICAgNTY3LCAgIC01MzksCisgICAgICAgIDE3LCAgICAzODQsICAgIDQ4NSwgICAgODYwLCAgIDMzMzAsICAgIDE3MywgICAgNTg2LCAgICA2NDksCisgICAgICAgMzg4LCAgICA5NjMsICAgMTgyMCwgIC0yNjEwLCAgICAyNTEsICAtMjk2NiwgICAxMzgzLCAgIC0xNTMsCisgICAgICAtMTQ2LCAgICA1NjQsICAgLTcxOCwgICAgOTk4LCAgLTEyODMsICAgLTU2NiwgICAtNjE5LCAgICAzOTQsCisgICAgICAgNDU5LCAgLTEyMzMsICAgMjU2NiwgICAtMzU3LCAgLTI2MDEsICAgICA5OCwgICAtOTI5LCAgIC0zNjcsCisgICAgICAtNTAxLCAgICAgOTYsICAgMTIxNywgIC0xNjk1LCAgIC0zMjQsICAgIDM5MywgICAgMjYxLCAgIDE3NDUsCisgICAgIC0xMDk1LCAgIC03NTEsICAgIDkyNCwgICAxMDQ0LCAgIC0zMzcsICAtMTI0MywgICAgMzkzLCAgIDI0NTQsCisgICAgIC0xNDk5LCAgIC0yNDUsICAgIDkwMiwgICAgOTI1LCAgLTIxMjYsICAgIDE2NywgICAgODM4LCAgICA2MzgsCisgICAgICAyMjk2LCAgIC0yOTQsICAgIDMwNiwgICAtNzE1LCAgIDI3OTQsICAgMTUyMiwgICAtMzM5LCAgICAgMjEsCisgICAgICAgMzE4LCAgICAtOTUsICAgMTMzNCwgICAgIDc1LCAgIC0xNzMsICAgIC05MSwgIC0yMDEyLCAgIC05MjAsCisgICAgICAtODAxLCAgICAzMzQsICAtMzM2MywgICAtMzQ4LCAgICA1NTAsICAgLTkxMSwgICAtMjYxLCAgLTEwNzMsCisgICAgICAgMTg1LCAgIC00MjUsICAgIDQzMSwgICAgNTE1LCAgIC0zMzksICAgMTgxNywgIC0xNTg5LCAgICAyNDEsCisgICAgICAgNTQ4LCAgIC0zMzcsICAgLTQ3MSwgIC0zNTMyLCAgLTExNjYsICAgIDg4OCwgICAgMTQxLCAgIC0yNzcsCisgICAgICAxMzUzLCAgICAzMTAsICAgLTY1NCwgICAgMTk4LCAgIC01MTYsICAgMjk1MSwgICAyMjUxLCAgIC01MzQsCisgICAgICAgNzAxLCAgICAyMzcsICAgICAyMCwgICAtNTk3LCAgIC0zMDEsICAgICAgMywgICAgNDEwLCAgIC00NTYsCisgICAgICAtNTgxLCAgLTEyNTQsICAgMTA1MiwgICAxMzIxLCAgICAxNjUsICAgMzEwOCwgICAgNDc3LCAgICAxOTYsCisgICAgICAyNzE2LCAgICAgODUsICAgICAgNSwgICAgLTM0LCAgICA3MjEsICAgLTU2MiwgICAgICA0LCAgICAgODQsCisgICAgICAtNzkzLCAgICA3NDQsICAgIDI0MywgICAgMTM0LCAgIC0zODUsICAgLTEyOSwgICAtMTIyLCAgIC0xMjgsCisgICAgICAtMzMzLCAgIC00ODMsICAgLTYwNCwgICAgMjY5LCAgIDYyMDksICAgICAgMywgICAgNTE1LCAgICAtNjMsCisgICAgICAtNjM0LCAgIC01NTEsICAgLTc5NSwgIC0xNjk2LCAgLTIyMTAsICAgMjE4NCwgICAgMzQ4LCAgICAgMzAsCisgICAgICAgNDEzLCAgIDI1MzEsICAgIDIxNCwgICAgMjE0LCAgIC0xODYsICAgIC03MiwgICAtNTUyLCAgICA5NTgsCisgICAgICAxNzI3LCAgLTE2MzksICAgIDYxOCwgICAgLTYxLCAgIC00MzIsICAgIDM2NSwgICAtNzUzLCAgICAgMTUsCisgICAgICAgLTE0LCAgICAgMzMsICAgIDk3NiwgICAtOTQwLCAgIC0zNTUsICAgMzMxOCwgICAgNjc3LCAgLTE5MzgsCisgICAgICAgIDIxLCAgICA4ODEsICAgLTMyNiwgICAgLTgzLCAgLTMzNTUsICAgMTQ4MywgIC0xMjExLCAgIC02NzQsCisgICAgICAgMTY2LCAgICAxMzksICAgLTI3NiwgICAgMTU4LCAgIC03MzYsICAgMTAzOCwgIC0xMDA1LCAgIDExMjksCisgICAgICAxMjE5LCAgIDExMTUsICAgLTM5MiwgICAgNTU4LCAgICAgOTYsICAgLTE4OCwgICAgMzE0LCAgICA1MzYsCisgICAgICAtNDIzLCAgLTMyNjIsICAgIDM5NSwgICAtMTMwLCAgIDEwOTksICAgIDMwNCwgICAtMTgxLCAgICA4NTMsCisgICAgICAtMTYwLCAgLTEyNzIsICAgIDQyOCwgICAtMTc5LCAgICA2MzQsICAgIDYwOCwgICAtMTczLCAgIDI2OTAsCisgICAgIC0yMTkxLCAgIDEzODUsICAgLTUxOCwgICAtNDE2LCAgIDMyMzksICAgMzI1MCwgICAgMzEzLCAgICAtMjMsCisgICAgICAgMjAwLCAgICA2NDMsICAgLTYzOSwgICAgLTE3LCAgIC0yMDgsICAgICAyNywgICAtMTgyLCAgICAyNjIsCisgICAgICAtMjAzLCAgIC02NzEsICAgIDE1NywgIC00MTMxLCAgICAzODMsICAgLTQwNCwgICAgMzM3LCAgICAgNTEsCisgICAgICAgNDMxLCAgICAgOTIsICAgIDEzOCwgICAtNDM4LCAgICAgMjksICAgIDMzNywgICAgNDg4LCAgIC0yNTIsCisgICAgICAgNjU2LCAgICA1MDksICAgMjAzNywgICAtNjM1LCAgLTEwNzQsICAtMTExNSwgIC0yMTM1LCAgIC03NzIsCisgICAgICAtMzg2LCAgIC0yMTQsICAgLTY1NCwgICAtNDQxLCAgIDE2NjEsICAgIDU0MiwgICAtMzgzLCAgLTE3MjAsCisgICAgICAgIDIyLCAgIC0xMDMsICAtMTQ3NCwgIC0xMjg4LCAgIDQzNjEsICAgIDI4MiwgIC0xMjUyLCAgICA3MzQsCisgICAgICAtODU4LCAgIC01NTYsICAgIDI5NCwgICAgMjQzLCAgICAyOTMsICAgIDEzMywgICAgODQ4LCAgICAgNjUsCisgICAgICAtNzI3LCAgIC04ODcsICAtMTMxNCwgICAgNDQzLCAgICAtOTYsICAgLTQyMiwgICA0MjY4LCAgICA2NzIsCisgICAgICAgMTQyLCAgICA2MDgsICAgLTQ0MiwgICAgODQzLCAgICAzNjUsICAgLTg2NiwgICAtMTU3LCAgICA3ODAsCisgICAgICAgMTA3LCAgIC04ODgsICAgMjA4OSwgICAxNzY5LCAgICAgNzMsICAgIDczOSwgICAgLTE1LCAgLTE3MzAsCisgICAgIC0xMjM1LCAgICA5MjAsICAtMTcxMywgICAgMTYzLCAgICA1NTIsICAgMTQ3OSwgICAtNjkyLCAgIC03NTUsCisgICAgICAxNDMwLCAgIC0xOTMsICAgLTI3NiwgICAtMjY0LCAgIC02OTAsICAgIDc3MiwgICAxNDAzLCAgICAtNDAsCisgICAgICAgNjc5LCAgIC0yNjAsICAgIDY0MiwgIC0zNTYyLCAgICA5NjIsICAgMjA1MywgICAxMzQ4LCAgICAgMzYsCisgICAgIC0yOTc0LCAgICAxNTUsICAgIDMwMywgICAgODIxLCAgIC05NDQsICAgLTE3OSwgICAtOTY3LCAgICA2MzIsCisgICAgICAtNzI1LCAgICA0MTEsICAgLTQ0NywgICAtNDYzLCAgICA2OTQsICAgLTMzNywgICAtMTQ2LCAgICAgNTksCisgICAgICAgIC0xLCAgIC00MTYsICAgICAxMiwgICAgNTI0LCAgIC00OTcsICAtNDY4MiwgICAtNzQ1LCAgICA2MjUsCisgICAgICAxMDExLCAgICAgMjAsICAgLTQ2MiwgICAtNTAzLCAgIDIwMTIsICAgLTQ3NSwgICAgLTI3LCAgICAgODUsCisgICAgIC0xMTkwLCAgICA1MzQsICAgMjI1MCwgICAgIDg3LCAgIDI1OTEsICAgMTE5NSwgICAxNjY1LCAgICA0MjMsCisgICAgICAtODEzLCAgIC01NzEsICAgLTM3MiwgICAyNjAxLCAgLTIwMTMsICAgLTg1MywgICAtNzM0LCAgIC00MDMsCisgICAgICAgNzkzLCAgIC01NDksICAgMTI0MywgICAgMzEyLCAgICA3MjIsICAtMTAxMywgIC0xNDM0LCAgIC03NDksCisgICAgICAtNTcxLCAgICA0OTQsICAgIC04OCwgICAtMTI5LCAgIDEzMzEsICAgIDgwNiwgIC0xMjI3LCAgICAzMjYsCisgICAgIC0xMTY0LCAgIDI0ODcsICAgIC01OSwgICAyMzQ2LCAgICA1ODMsICAgIDUxOSwgICAgMzY4LCAgICA3OTMsCisgICAgICAxMTc4LCAgICA2NjEsICAgIDE0MCwgICAxMjI2LCAgICAzNzgsICAgLTQyOSwgIC0xMjE0LCAgIDE0MzgsCisgICAgICAtMzE5LCAgICAtNzcsICAtMTQ5NSwgICAzNTk4LCAgICAzNjEsICAgICAyMSwgICAgIDM5LCAgIDE5MzAsCisgICAgICAgMTk4LCAgIDEwNTAsICAgIDUzMSwgICAgMjc0LCAgICAgMzIsICAgLTQ5OSwgICAtMzQ5LCAgICAgLTUsCisgICAgICAtMTMzLCAgLTMzMjQsICAgLTM3OSwgICAtNzQyLCAgIC0yNTAsICAtMTYxOCwgIC0xNTM2LCAgIDIwODQsCisgICAgICAxMzY5LCAgICA3NjUsICAgLTEzMiwgICAtMzI0LCAgICA0MDYsICAtMjE5OCwgICAgMzE0LCAgICA1MDIsCisgICAgIC0xNDMxLCAgICA3NTksICAgLTcyOSwgICAgMzIwLCAgLTIxMjAsICAgMTQ4NCwgICAyNDY4LCAgLTMyODMsCisgICAgICAgICA0LCAgICAyNzIsICAgICAtMiwgICAgNDkyLCAgICAgOTEsICAgLTgwMywgICAgIDQ4LCAgICA2OTEsCisgICAgICAgMzc1LCAgICAgODcsICAgLTUwOCwgICAtNzI1LCAgIC02MzIsICAgIDI2OCwgICAyOTI5LCAgIDEzMDIsCisgICAgICAgLTExLCAgIC02MjgsICAtMjIyNSwgICAgNzIzLCAgICA1MzMsICAgIDkwOSwgICAgOTM0LCAgICA2ODIsCisgICAgICAgMzUwLCAgIDE1MDksICAgLTcwNywgIC0xMTQyLCAgICAxMDYsICAtMjE3NCwgICAgMzQyLCAgIC05NjUsCisgICAgICAgNDU2LCAgIC02NTUsICAgMTEzNywgICAtNTUzLCAgICA0MTUsICAgLTQxOCwgIC0yNjMxLCAgIC0xMjEsCisgICAgICAgMjM3LCAgICAgIDMsICAtMTEyMywgIC0xNTU1LCAgLTE0MTMsICAtMzMzMywgICAgNzE3LCAgICAxMTUsCisgICAgIC0xMDMwLCAgLTEwMDcsICAgLTgxOSwgICAgMTMwLCAgIC04NTEsICAgIDI4MSwgICAgLTQzLCAgIC00NzMsCisgICAgIC0xMDkxLCAgICAzMjYsICAgIDg2OSwgICAtMzc3LCAgICAyNzgsICAgLTE0OCwgICAgNDE4LCAgLTIxMDQsCisgICAgICAtNDIyLCAgICA2MjMsICAtMTc3NywgICAgNjMzLCAgIDEwMzMsICAtMjAzMSwgIC0xMjIxLCAgIDQxMjYsCisgICAgICAgLTYwLCAgICAtMTYsICAgODAyNSwgICAgMjQzLCAgIC0zNDAsICAgLTU5OSwgICAtNTAxLCAgIC0yODksCisgICAgICAtMjE5LCAgIC0xMDQsICAgLTIzMCwgICAgNDY0LCAgICAxOTEsICAgICAxOCwgICAgMzQ1LCAgICAtNjUsCisgICAgICAgLTY4LCAgIC00ODEsICAgIDYyNSwgICAtODIyLCAgLTQwMTEsICAgLTUxNiwgICAgNzQxLCAgICA3MzQsCisgICAgICAtMzE2LCAgICA1MzAsICAgIDEyMiwgICAgOTQ1LCAgICAzNzEsICAgLTI5OCwgICAxMTk0LCAgIC0yNTAsCisgICAgICAtMTY3LCAgICAzOTIsICAgIC05NSwgICAtMTUxLCAgICAgLTEsICAgLTQ4NiwgICAgMTg5LCAgICAgOTAsCisgICAgICAtMTQwLCAgICAgMzAsICAgNDQ4NSwgICAgNTgxLCAgICAgNTQsICAgMTkwNSwgICAtODk1LCAgLTIwMzIsCisgICAgICAtMTc0LCAgIDI0NzMsICAgLTY4OCwgICAtMTA0LCAgIC0zMTUsICAgLTM3NiwgICAgODMwLCAgICAyOTYsCisgICAgICAtNTQ4LCAgICA3NTQsICAgIDE5NSwgICAtOTAxLCAgLTE1NDgsICAtMTkzMSwgICAgNzkyLCAgICA1MTAsCisgICAgICAgMjk0LCAgICAxNTMsICAgIDYxOSwgIC0xMDM0LCAgLTMwMzgsICAgMTEzNCwgICAgMTQyLCAgICAtMjksCisgICAgICAtODA2LCAgIC0xMTgsICAgIC0yOSwgIC0yMzE0LCAgIC0xNTksICAgIDc3MCwgIC0yODk5LCAgICAgMjMsCisgICAgIC0xMDQ1LCAgIDEwMzcsICAgMTQ5NiwgICAxMTA0LCAgIC01MjcsICAgIDEzNSwgICAtMjgxLCAgIC0zMTAsCisgICAgICAgLTU5LCAgICAyMDIsICAgLTM0NiwgICAtNjEyLCAgICAyMDYsICAgICAyNywgICAtNDU2LCAgICA3NTgsCisgICAgICAgIDY3LCAgIDM1NDcsICAgIDg2NywgICAgMjI3LCAgICAgLTMsICAgIDU3MywgICAxNDQwLCAgICA0MjEsCisgICAgICAgMTcwLCAgIDE0OTEsICAgLTY5MSwgICAgLTQzLCAgICAgLTgsICAgIDc4NCwgICAgMzA3LCAgICA1NTcsCisgICAgICAgNjE4LCAgLTIzODcsICAgIDU2NiwgICAtMzk2LCAgICAxODIsICAgIDg3NywgIC0yNjY2LCAgIC0xNjMsCisgICAgICAgNTUzLCAgIC0xNTUsICAgIDY5MSwgICAtMTg4LCAgLTE1ODQsICAtMTA4NSwgICAxMDMzLCAgIC0zMDgsCisgICAgICAxMzU2LCAgIC01NzAsICAgLTcyMSwgICAtMjMyLCAgLTMxNDUsICAgIDEwNCwgICAgNTExLCAgIC05NjQsCisgICAgICAyNzgzLCAgIC02ODUsICAgLTE2OCwgICAgLTUxLCAgIDE1NTQsICAtMTgxNiwgICAyNDMxLCAgICAzMjcsCisgICAgICAtNDQwLCAgIDExNzQsICAgLTI2NSwgICAgLTM2LCAgICAxMjAsICAgLTM5NywgICAxMDk0LCAgLTEyNTQsCisgICAgICAtOTczLCAgICA1NzQsICAgMTA4NSwgICAtMTM5LCAgIC03NTEsICAgLTUyOSwgICAtMjQwLCAgICAgMjUsCisgICAgICAxMTM3LCAgIC00NjcsICAtMzQ3MSwgICAgMzM4LCAgIC04MDYsICAtMjAyOCwgICAgIDk0LCAgICAtOTgsCisgICAgICAtMzM2LCAgIC01MzcsICAgMTE4OSwgICAtODgwLCAgLTM2MDcsICAgLTE2OCwgICAgLTU5LCAgICAxMDAsCisgICAgICAgMzA5LCAgIDEwOTcsICAgIDI5NSwgICAgMjYyLCAgICAxMDYsICAgICAtOCwgICAgMjEwLCAgLTc0NjEsCisgICAgICAgMzk1LCAgIC0yNDgsICAgIDQ2MSwgICAgNDkwLCAgIC0zMjYsICAgIDI2NCwgICAgMTA1LCAgICAgMTMsCisgICAgICAtMTYwLCAgICA2MDgsICAgLTQ0MywgIC0xMzMxLCAgICA4MzUsICAtMTM0MiwgICAzNTA3LCAgICA3NjMsCisgICAgICAgOTY2LCAgICAxMDEsICAgMTA0NywgICAtNDY5LCAgLTE0NTUsICAtMTA4MCwgICAgIDI4LCAgICAgOTksCisgICAgICAgLTQ0LCAgICAyNzAsICAgLTc1MiwgICAgMTMwLCAgICAgIDIsICAgICA1NywgICAgMzU4LCAgIC00MDksCisgICAgICAgICAyLCAgIC02NTgsICAgLTgxMiwgICAtODk5LCAgICAxNTUsICAgIDE0MSwgICAyMTAxLCAgIDM2MTYsCisgICAgICAgIDQwLCAgLTE5NTcsICAtMTAyOCwgIC00MTM3LCAgICAyMTIsICAgMTU4MCwgICAgNTc4LCAgIDEwMTksCisgICAgICAtNTEyLCAgICAxNjcsICAgIDM2NiwgICAtNTgwLCAgICA0NDgsICAgIDIxNiwgICAgIDc5LCAgIC0xNDksCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjIyMjRzbTBbXSA9IHsKKyAgICAgLTQzMzQsICAgMTQzNCwgICAtMjI4LCAgIDE0NzcsICAtMTMyOSwgICAgMjMwLCAgICA2ODYsICAgLTU1OCwKKyAgICAgICA0ODYsICAgLTE4OCwgICAgNDI0LCAgIC00NTQsICAgLTU2OCwgICAtMTQxLCAgIC0zMjYsICAgLTEzMiwKKyAgICAgICAtMzksICAgMjQ4OCwgICAgICA5LCAgICA2MzEsICAgIDUxMywgICAgNDYwLCAgIC00MTcsICAgMjY1NiwKKyAgICAgICA2MzMsICAtMTQwNCwgICAgLTgxLCAgIC0yODMsICAgLTI4NywgICAgNDgwLCAgIDI1NTgsICAgIC0xOSwKKyAgICAgIC0xNTgsICAtMjY5OSwgICAgNDA1LCAgICAyNzYsICAgLTYzOSwgICAtMTUxLCAgICA1MjksICAgIDI0MSwKKyAgICAgIC05NDEsICAgLTc5NiwgICAtMjEzLCAgIDExMjUsICAgLTM5MSwgICAyNTE1LCAgICAgNzgsICAgLTE3NywKKyAgICAgIDI2NzcsICAgIDIxNywgICAgOTU1LCAgIC02ODcsICAgIDg2NywgICAtNDg1LCAgIC0xMjEsICAgMTAyMywKKyAgICAgLTE1NzIsICAgLTU5MSwgICAgMTM5LCAgICA3OTgsICAgMTI2MiwgICAtNDY3LCAgICA3MjIsICAgMjY0MywKKyAgICAgIC0yMzcsICAtMTA0OCwgICAgMzg2LCAgIC00MzIsICAgIDE4MCwgICAtNzg4LCAgIC0xNzgsICAgIDIzNCwKKyAgICAgICA0MDMsICAgIDI2NywgICAgMzEyLCAgIDI2NjEsICAgIDU4NSwgIC0yNzc1LCAgIC02ODYsICAgIC04OCwKKyAgICAgICAtMTYsICAtMTI0MywgICAtNDQ1LCAgIC0yNTksICAgIDMwMywgICAgMjk4LCAgICAyODUsICAgIDI3NywKKyAgICAgIDIzNTUsICAgIDE2MywgIC0yMzk5LCAgIC00MTYsICAgIDExNSwgICAyMjc3LCAgIC03MDcsICAgIDE5NCwKKyAgICAgICAyODMsICAgMTE4MywgICAgIDIzLCAgICAxMTksICAgICA5NywgICA4MTkyLCAgICAtNDAsICAgICA2NywKKyAgICAgIC0xMDEsICAgIDE1MSwgICAgMTY5LCAgICAgMjEsICAgLTE0NywgICAtMTYwLCAgICAgNTUsICAgLTIwNywKKyAgICAgICA1NTAsICAgIC0zNiwgICAtNTAwLCAgICAtMzIsICAgIDIyNSwgICAgMjA2LCAgICAgNzIsICAgIDE3OSwKKyAgICAgICA0NjQsICAgLTQwNiwgICAgIDUyLCAgICA2OTYsICAgIC0xOCwgIC00ODI3LCAgIDE1NDcsICAgLTUxNiwKKyAgICAgLTIyNzUsICAgIDg1NSwgICAgNDMwLCAgIC01MjMsICAgICA4MywgIC0xNjMzLCAgLTE4OTgsICAgIDI4NSwKKyAgICAgICAyMDIsICAgLTY0NSwgICAtMTY3LCAgICAxMDIsICAgLTEyNCwgICAgMzgyLCAgICAgMjQsICAgIDIzNiwKKyAgICAgICA4MzAsICAgIDMyNCwgICAgLTg0LCAgICA0OTEsICAgIC05NSwgICAtMTU0LCAgICA3NjcsICAgICAyNSwKKyAgICAgIDQ3NDEsICAgLTU3NCwgIC0yNTc2LCAgIC0yOTcsICAgLTI1MCwgICAtMzQ2LCAgLTI4NjcsICAgIC02NCwKKyAgICAgLTExMTksICAgMTAwNywgICAtODgzLCAgICA0NTcsICAgLTMyOCwgICAtODU0LCAgIC05ODEsICAgIC01NSwKKyAgICAgIDY5MjIsICAgIDU2OSwgICAtMzA3LCAgICAyNjEsICAgLTEwMCwgICAtODMyLCAgICAxMjksICAgIDQxNiwKKyAgICAgIC0xNTQsICAgIDY4MSwgICAtMTM2LCAgIDExNTIsICAgLTE0NCwgICAgLTI2LCAgLTIyNjYsICAgLTMyMCwKKyAgICAgIC0xNDEsICAgLTg5NywgICAgNTQ0LCAgIC0yMDYsICAgIDg0NSwgICAtNTkwLCAgICAgODgsICAgIDIxMSwKKyAgICAgLTE3NjEsICAgLTU3NCwgICAtNjUzLCAgLTI3ODgsICAgIDI1MiwgICAtMjY2LCAgLTQyNTIsICAgIDI5NSwKKyAgICAgICAgOTcsICAtMjExMiwgICAgMjA5LCAgIC0xNDQsICAgIDY1NSwgICAgLTg5LCAgIC0zNjksICAgIDU5MSwKKyAgICAgICAyMDUsICAgMTEzNywgICAgIDMwLCAgLTI5MDcsICAgICA4OCwgICAgIDkyLCAgIC0yNDAsICAtMzEwNiwKKyAgICAgICAtMTYsICAgLTM5OCwgICAtNTc2LCAgIC03MjAsICAgIDQyMSwgICAgNDI3LCAgIC00MjMsICAgLTE5NSwKKyAgICAgICAtMTgsICAgMjUwMywgICAtMTMzLCAgIC05MTgsICAgIDEwNCwgICAtNTEyLCAgIC00ODksICAgMjYyMywKKyAgICAgIC0zMTQsICAgIDIxNSwgICAtMTAzLCAgLTEwMTQsICAgIDc2MSwgICAgMzgyLCAgLTE0NTYsICAgMTcxOSwKKyAgICAgIC05ODAsICAgIDI0OCwgICAgIDU1LCAgICA2NDQsICAtMTk0NSwgICAgIDQyLCAgIC0xNjIsICAgIC0zNSwKKyAgICAgIC04NTIsICAgMTk5MywgICAtMTg5LCAgICA2NjQsICAgLTE0OSwgICAzMTMyLCAgICAtNTAsICAgMzQzOCwKKyAgICAgICA1NTAsICAgLTIzNCwgICAtNTY2LCAgICA0MzQsICAgICA2NCwgICAgMzc5LCAgIC0xNjksICAgLTI5MSwKKyAgICAgIC03MTgsICAgLTYwOCwgICAgIDMxLCAgIC0yMDcsICAgIDY1MSwgIC0yNTY3LCAgIC03OTAsICAgIDkwNiwKKyAgICAgICA1MTgsICAgMTc0MCwgICAgMzczLCAgIDExNTgsICAgIDExNCwgIC0yMDQ0LCAgICAyODUsICAtMTEzNiwKKyAgICAgIC0zNzMsICAgIDkzMiwgIC0yMTg1LCAgIC00ODgsICAgIDE0OCwgICAgICAzLCAgICA3MjQsICAgIDYyMywKKyAgICAgIC01NjgsICAgLTM1OSwgIC0yNzQ4LCAgICA3NTEsICAtMTA5OCwgICAtODU4LCAgLTExNDAsICAgLTI1MywKKyAgICAgLTIzNzcsICAgLTQwMiwgICAtMzEyLCAgIC0zOTgsICAgIC00NywgIC0yNjE4LCAgICA4MTYsICAgLTU2OCwKKyAgICAgIDEyNzQsICAgLTE1OCwgICAgMTE4LCAgICAxMDcsICAgIDE4MSwgICAgMzk0LCAgIDI3NTgsICAgICA4MCwKKyAgICAgLTMwNTcsICAgICAyMCwgICAtMjc5LCAgICAxMTAsICAgIDQ4MiwgICAxMDEwLCAgIC0xNjIsICAtMTA4MSwKKyAgICAgICAtNTYsICAgIDY4NSwgICAyMjA3LCAgICAtMTAsICAgICA4MiwgICAgNDQwLCAgICA1OTMsICAgICA0MywKKyAgICAgIDEwMTAsICAgLTg1MywgICAtNjI0LCAgICAyODgsICAtMzA0NSwgICAtNDI2LCAgICAgIDksICAgIDEzMiwKKyAgICAgICAxMDQsICAgIDE1NywgICAgNDY2LCAgIC0xMTgsICAgIDExNiwgICAgMjI2LCAgIC0yMTQsICAgLTIxOSwKKyAgICAgICAyOTksICAgNjA5MywgICAgMTIyLCAgICAgIDcsICAgIDE3NCwgICAgNDQ0LCAgICAyMDAsICAgIC00MiwKKyAgICAgICAgLTQsICAgLTMxMywgICAgIDk5LCAgICAyMTgsICAgIDI5MiwgICAtMTU5LCAgIC00MDksICAgIDUyMywKKyAgICAgLTEzNTcsICAtNDA5OCwgICAgLTk2LCAgICA5NjgsICAgICAgOCwgICAtMTcyLCAgIC00NDQsICAtMTA0MCwKKyAgICAgICA3NTUsICAgLTQ3NiwgICAgOTY3LCAgICAxNzUsICAgLTEwMCwgICAxNjg5LCAgIC04MTMsICAgMzE3NSwKKyAgICAgICAzNjksICAgMTgyOCwgICAgMjQ4LCAgIC0xNjEsICAgNjY5MywgICAgNjMxLCAgICA1MzYsICAgLTEyNSwKKyAgICAgICAyNzQsICAgLTQ2NywgICAgMjU5LCAgIC00MjcsICAgIDEzMCwgICAtNTIzLCAgICAzNjEsICAgIDU4NCwKKyAgICAgICAgMjcsICAgICA2MCwgICAgLTU3LCAgICAtMzAsICAtODE5MiwgICAgMTQ4LCAgICAtNjQsICAgIDIxNywKKyAgICAgIC0zMDgsICAgIDE2MywgICAtMTE2LCAgICAgODksICAgIDEwOCwgICAgMTkxLCAgIC0xMjksICAgLTE0OSwKKyAgICAgICAxMjgsICAgICA2MCwgICAgNTc1LCAgICAyNTMsICAgLTM4NSwgIC0yOTM3LCAgICA4ODgsICAtMTQwMiwKKyAgICAgIC01NDMsICAgLTYwNywgICAyNjM5LCAgICAxNTYsICAgIDI1MSwgICA2OTY2LCAgIC0xNDcsICAgLTM4MiwKKyAgICAgIC0zODgsICAgICAzOSwgICAgNDc2LCAgICAyNjAsICAtMTA0OCwgICAgNTc1LCAgICA0MDEsICAgLTI0NSwKKyAgICAgIC00NDEsICAgIDEyMSwgICAgMzg5LCAgIC02NjYsICAgICA5NSwgICAyOTE5LCAgLTIyMTIsICAgLTc2NSwKKyAgICAgICAxNjksICAgLTE2MSwgICAgMTg0LCAgIC0zMjAsICAgLTMxNSwgICAtNDk3LCAgICAxMzYsICAgLTQ3MCwKKyAgICAgICA0NzksICAgLTU0MSwgICAgNzEyLCAgIDI5NjYsICAgIDUxOSwgICAyNTk1LCAgICAtNzcsICAgMTA4OSwKKyAgICAgICAgMTgsICAgLTY5NywgICAtNjE2LCAgICAyNDEsICAgIC01NCwgICAgMzg4LCAgICA0NjEsICAgIDM2OCwKKyAgICAgICAxNDQsICAgLTE0OSwgICAgMTgxLCAgIDc2OTksICAgICAxMSwgICAgICAzLCAgIC0zNjgsICAgICA2NSwKKyAgICAgICAzMDQsICAgIDM1OCwgICAgLTI5LCAgICAyNTUsICAgLTE2MiwgICAtMTY5LCAgIC00NzAsICAgIC0xNiwKKyAgICAgICAxOTgsICAgICA5MiwgICAyMTM3LCAgICAyMzMsICAgIDI3MywgICAgMjU1LCAgIDQwNzgsICAgLTI3OSwKKyAgICAgIC0xOTQsICAgLTI3NCwgICAgMTAxLCAgICAgNDUsICAgLTIyNSwgICAtNzE2LCAgLTI1MjIsICAgLTE4OCwKKyAgICAgICAgMTAsICAgLTU5MCwgICAtNzQ1LCAgICA4OTQsICAgMTk3NiwgICAgLTQ4LCAgIDIzMDIsICAgICAtNCwKKyAgICAgLTQ2OTEsICAgIC02NywgIC0xMzI1LCAgIC01MDYsICAgIDYwNSwgICAtMjk3LCAgICAzMTcsICAgLTI3MSwKKyAgICAgIC0xNzYsICAgMTcwNiwgICAgNTQxLCAgICAgIDEsICAgICAzMSwgICAtNTgwLCAgICAxMDMsICAgIDE0OCwKKyAgICAgIC0xMjIsICAgLTE0MSwgICAtODQ5LCAgICAgNzYsICAtMzA5NCwgICAgLTY3LCAgIDI3NzUsICAgIC0zOCwKKyAgICAgIC01OTgsICAgLTMxNCwgICAgNzkzLCAgICAgNDAsICAgIDMyNCwgICAxNDc0LCAgIDE5ODYsICAgMTUwNSwKKyAgICAgICA4MzIsICAgLTUwNCwgICAgNzM5LCAgLTEyMzMsICAgMTIwMSwgICAgNjk1LCAgLTEzNjMsICAgIDY3MCwKKyAgICAgICA4MDUsICAgIDY5NiwgICAtMTM3LCAgLTQ5NzcsICAgLTMwNiwgICAgMTM3LCAgIC04ODUsICAgIDQ1NSwKKyAgICAgIDEwMjEsICAgIDYwMCwgIC0xNzExLCAgICA1MzYsICAgIDIzNSwgICAtMTQ5LCAgICAgMzEsICAgICAtNSwKKyAgICAgLTM3NDcsICAgLTQwNSwgICAgMzk0LCAgICAxNDAsICAgIDEwMiwgIC0xNTc2LCAgICAxOTAsICAgIDQwOCwKKyAgICAgICA2NjMsICAtMjA3NSwgICAtNzQ3LCAgICA0NjYsICAgIDYzMSwgICAgODA3LCAgIDE4NjcsICAgLTY1NSwKKyAgICAgICAxMDIsICAgIDM0MSwgICAgNDM1LCAgICA1NTEsICAgIDUwMCwgICAgNDI2LCAgIC02NTAsICAgIC04OCwKKyAgICAgICAtMjYsICAgMjY3MiwgIC0xNzkxLCAgICAgMzQsICAgIC04NiwgICAyOTYzLCAgLTMzMzAsICAgLTc5MywKKyAgICAgIC0zMDcsICAgIDI3NywgICAtNTg0LCAgIC0yNDAsICAgLTE0MSwgICAgMjU4LCAgICA3MDgsICAgLTI0MiwKKyAgICAgIC00OTksICAgIDgwOCwgICAtMTA0LCAgLTIwNjEsICAgLTUxOCwgICAgNjg0LCAgICA4ODksICAgIDQwNiwKKyAgICAgICAyNTksICAgIDIxMSwgICAgNDYyLCAgICA0MjgsICAtMjU5NywgIC0xMTQ3LCAgIDE3MjksICAgIDY4MywKKyAgICAgLTIxNzMsICAgLTE2NywgICAgMzkyLCAgICA0NDAsICAgIDU5OSwgICAtODE1LCAgIC02MjQsICAgLTM2OCwKKyAgICAgLTI5NjIsICAgLTE3MiwgICAgODQ1LCAgICA0MjMsICAgIDM2MiwgICAgNzExLCAgIDIxMzEsICAtMzg5OSwKKyAgICAgICAgODQsICAgIDE0NywgICAgODI2LCAgIC0zOTksICAgLTYzNywgICAxMTMyLCAgICAxMDgsICAgLTQ4MCwKKyAgICAgICAyMzAsICAgIDI2NSwgICAtNDIzLCAgICAgNDgsICAgICAxMSwgICAgMjM5LCAgIC01OTksICAgLTI4MSwKKyAgICAgICAgMTAsICAgIDU0MSwgICAtMzk3LCAgICAxNDIsICAtNDMyMiwgICAxMTcyLCAgIC0yNTcsICAgLTEwMSwKKyAgICAgICAyOTIsICAgLTMyMSwgICAtNDAxLCAgICAgNjAsICAgLTMwOSwgICAgNDY4LCAgICAyNjcsICAgIDYxMSwKKyAgICAgICA0MzgsICAgLTYzOCwgICAyMTk0LCAgICAzNDYsICAgMTQyMSwgIC0xMTkyLCAgLTMxMDksICAgLTE3MCwKKyAgICAgLTMzMzYsICAgIC00OSwgICAgLTY5LCAgICAtNzUsICAgIDE4NCwgICAzMDk0LCAgICA1OTEsICAgICA4MiwKKyAgICAgIC0zNzMsICAgIDE0MCwgICAgLTIyLCAgICA4NDgsICAgIDEyNCwgICAgNTg5LCAgICAxNTcsICAgICAtNCwKKyAgICAgICAyNjAsICAgLTE3NywgICAgMTQ3LCAgICAgNzMsICAgLTI4NCwgICA2MjUzLCAgICAxMTEsICAgIDMwMiwKKyAgICAgICAtNzQsICAgIDM1NiwgICAgMzgxLCAgIC01NDcsICAgIC0xNiwgICAtMjc1LCAgIC01MDAsICAgICA5MywKKyAgICAgICAzNDQsICAgLTM0NiwgIC0yODM3LCAgICAzNjQsICAgIC00MywgICAtNTkyLCAgIDE3NDEsICAgLTcwMiwKKyAgICAgLTIyNDcsICAgIDg0OCwgICAtMjAzLCAgICAxNjgsICAgIDc1OCwgICAtODQ5LCAgLTI0NTQsICAgIDU2MiwKKyAgICAgIDExMDQsICAgLTE2OSwgICAgNDYzLCAgIC0zOTgsICAtMjc1OSwgICAtMjk5LCAgIC05MDMsICAgIDY0NywKKyAgICAgICAtNjIsICAgLTEyNCwgICAgMzAxLCAgICAzMzcsICAgLTIwMSwgICAgNDYzLCAgICAtODYsICAgLTEzOSwKKyAgICAgLTIxODksICAtMjQyNCwgICAtOTQyLCAgIC0zNzYsICAtMjA0MywgICAgLTgwLCAgLTE3OTEsICAtMTU4MCwKKyAgICAgICA1MTMsICAgICAyOSwgIC0xMTE1LCAgIC01ODIsICAgMTIxNCwgICAtNjQyLCAgICAzNTUsICAgIDI0MCwKKyAgICAgICAyODUsICAgMTc1OSwgICAxMjA5LCAgICA4NjIsICAgMTcwNywgICAzMzUzLCAgIC0yMjMsICAgIDI0NSwKKyAgICAgIC01MTUsICAgLTkyOCwgICAgNzk0LCAgIC0xOTAsICAgLTI4MiwgICAxMDk3LCAgICAtMzIsICAgMTY3NSwKKyAgICAgICA4NTcsICAgLTczMCwgICAgLTE1LCAgICAxMDIsICAgIDM1NiwgICAtMzA5LCAgIDM4NjcsICAgICAyNCwKKyAgICAgICAgOTMsICAgIDg5OSwgICAtNjA4LCAgIC00OTcsICAgLTIxNSwgIC0yMjQ0LCAgICA3MzUsICAgLTE5NCwKKyAgICAgICAxMDIsICAgIC01MSwgIC0xOTM5LCAgICA4NDYsICAgICA3NCwgICAtMTE2LCAgICAgIDcsICAgMTk4MSwKKyAgICAgICA1MTIsICAgIDIzMywgICAgNTc0LCAgLTI1MDgsICAgICA4MywgICAxOTY2LCAgIC0yNTEsICAgIC05NiwKKyAgICAgICA1MzIsICAgICA5NywgICAgODk3LCAgLTExMjAsICAgIDM5MCwgIC0zMTkyLCAgIC02NTIsICAgMjA0NSwKKyAgICAgICAxOTMsICAgLTg4MCwgICAtMzk4LCAgIC0xNDgsICAgIDU0OCwgICAtMjgxLCAgICAtMTksICAgLTk4NywKKyAgICAgICA0NjcsICAgLTMyNiwgICAyNzc3LCAgICAxOTUsICAgMTU2MCwgICAxMDM0LCAgIC04MjgsICAgIDEwMiwKKyAgICAgLTE1MzEsICAgMTI5MiwgICAtMTI2LCAgICA1MzksICAgLTI0NywgICAgIDM2LCAgICAgNTUsICAtMjQ4NywKKyAgICAgIC0yOTcsICAgLTM2MiwgICAgNDgyLCAgLTIyNDEsICAtMTAyMSwgIC0xNTM1LCAgIC0yNDQsICAgICAzOCwKKyAgICAgLTM0MTYsICAgIDE0MSwgICAzNDA4LCAgICAgMzUsICAgIC02NywgICAgIDk1LCAgICAzMzMsICAgLTQyNywKKyAgICAgIC0yMzUsICAgLTEyOCwgICAgMzA0LCAgIC01NDgsICAgIDMzNywgICAtMzQ5LCAgIC0zMzAsICAgICAyMywKKyAgICAgIC00NTAsICAgMTY1NywgICAgMzI3LCAgLTMwODcsICAgIDY5NSwgICAtMjczLCAgLTEwOTAsICAgMTI2MiwKKyAgICAgIC0xMTEsICAgLTg2OCwgICAxNTE2LCAgICAyNjksICAgIDExOSwgICAgMTkyLCAgICAgMTQsICAgIDIwMCwKKyAgICAgICAxNDEsICAgLTM5NSwgICA3MTQ1LCAgICAgNDgsICAgIDMzNCwgICAgMTQzLCAgIC0xMzksICAgIDE1NCwKKyAgICAgIC0xMDIsICAgLTMxMiwgICAgIC0yLCAgICAyODMsICAgIDIzOCwgICAgLTMwLCAgICA2MjYsICAgMTMyOCwKKyAgICAgICAyNDIsICAgLTQxNiwgICAgNDQyLCAgLTMwNTAsICAgMTM4OCwgICAtMTAwLCAgIDEyMTUsICAgIDgxNywKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiMjIyNHNtMVtdID0geworICAgICAgODE5MiwgICAgLTEzLCAgICAzNDYsICAgIC01MiwgICAgICA1LCAgICAxMzEsICAgLTI5NCwgICAtMTY3LAorICAgICAgIC02NSwgICAtMzQ3LCAgIC00MzgsICAgLTU1OSwgICAgIDU3LCAgICAtODYsICAgLTIyMywgICAtMjI0LAorICAgICAgLTI1MSwgICAgNjI5LCAgICAtNTgsICAgNTI0OSwgICAgMTI3LCAgIC00NjQsICAgIDY0NCwgICAgMjEwLAorICAgICAgLTE1NCwgICAtNDgwLCAgICAxNjUsICAgIDIxMSwgICAgIDEzLCAgICAzMTgsICAgIDE1MiwgICAtMTczLAorICAgICAgNTQ1MSwgICAgMjM1LCAgICAxNzAsICAgLTEwMCwgICAgIC02LCAgIC00NjAsICAgLTI0OSwgICAgMzkwLAorICAgICAgICA1NCwgICAgOTkzLCAgLTE2MzcsICAgLTI4OCwgICAtOTc4LCAgIC0xOTcsICAgIDIzNCwgIC0yODc3LAorICAgICAgLTU3MCwgICAtMTUxLCAgICAtODIsICAgIDc3MiwgICAgMTk5LCAgIC0zODUsICAtMTg5OSwgICAgMzQ1LAorICAgICAgIC0yNSwgICAgNTI3LCAgIC00NzcsICAtMjkxOCwgICAgMzg1LCAgIDI3ODQsICAgICA3OCwgICAtNTI0LAorICAgICAgLTc1OSwgICAgNzk1LCAgICA0MzMsICAgIDUxMSwgICAgODU2LCAgIC0yNzUsICAgIDUxMSwgICAgMTM2LAorICAgICAgLTQ0NCwgICAgMTUxLCAgICAyMzMsICAgIDIwOCwgICAtNTg5LCAgIC0zNzUsICAgIDI4MiwgICAyODg2LAorICAgICAgICAzMCwgIC0yNzQ5LCAgIC05MzAsICAgMTA3OSwgICAgIDg2LCAgLTIyODUsICAgIDk4MCwgICAtMjI5LAorICAgICAtMTM2OSwgICAgIDkzLCAgICAtODAsICAgMjMxNCwgICAtMTcwLCAgIDEyMjQsICAgIDM5NywgICAgNDA1LAorICAgICAgIDQ2MywgICAxMDE0LCAgIC0zNzcsICAgIC05MCwgICAtMjY5LCAgICAtODIsICAgLTM3NiwgICAtNzczLAorICAgICAgIDY4NCwgICAgLTk0LCAgLTI4OTMsICAgLTMyMywgICAtNjQ0LCAgIC04NDksICAtMTg5MiwgIC0yMjQ0LAorICAgICAgIDQxNywgICAyMTY1LCAgIC0xNjQsICAgIDIyMSwgICAgNDU0LCAgLTIzMzcsICAgIDE0MiwgICAgIDk5LAorICAgICAgIDQxOCwgICAgNDg2LCAgICAtNDksICAgICA5NywgICAgMTM4LCAgIDIyMjEsICAtMjMwMSwgICAtMTU2LAorICAgICAgLTU3OCwgICAzOTYzLCAgICAxOTYsICAgIDE0MCwgICAtMzc0LCAgICAxODAsICAgIDQ1MSwgICAgMzU0LAorICAgICAgLTk1MiwgICAgOTQ2LCAgIC00NzksICAgLTg3NCwgICAtMTU5LCAgICAxNDUsICAgIDI5MCwgICAgMjQwLAorICAgICAgLTI0MCwgICAtMjMzLCAgIC00MTgsICAgIDIyNiwgICAyODc4LCAgIC01NzEsICAtMjQ5MSwgICAgNzQxLAorICAgICAtMTQzOCwgICAgNTU3LCAgICAxOTcsICAgLTM3MCwgIC00NzIwLCAgICAzNzksICAgICAzMiwgICAgODIxLAorICAgICAgICAzOSwgICAtNTQ1LCAgIC0xNDEsICAtMTUwNywgICAgMTkyLCAgLTExNTAsICAgIDkwNSwgIC0xMDk1LAorICAgICAtNTAyOCwgICAtMTY5LCAgICA1MzMsICAgIC0yMywgICAgMzcxLCAgICAxNjIsICAtMTE5OCwgICAgNDY1LAorICAgICAgLTM2OSwgICAgLTE0LCAgIC04NjEsICAgLTY1NiwgICAtNzAxLCAgIC0yOTYsICAgICAzMSwgICAgNDUwLAorICAgICAgLTM4NywgICAzMDYwLCAgIC02OTYsICAgIDU5NywgICAgIDE0LCAgLTEwMTksICAtMjc0MSwgICAtMjA4LAorICAgICAtMTE4NiwgICAtMzM4LCAgICA3MTIsICAgIC02NCwgICAtMzQ0LCAgICAgNDEsICAgIDMyNywgICAgICA5LAorICAgICAgIDU3NiwgICAtMzQ5LCAgLTI4MDgsICAgMjQyOCwgICAgNDMzLCAgIC01NjYsICAgIDkwOCwgICAtMTA4LAorICAgICAgLTE0NSwgIC0xMDExLCAgICAyMDEsICAtMzA0MiwgICAtMzI3LCAgICAyMTAsICAgLTM2OCwgICAgMjMwLAorICAgICAgLTMxMCwgICAtNDAwLCAgICAgMTIsICAtMTAzNCwgICAxNzM0LCAgICA5OTIsICAgMTg0MiwgICAxMDIyLAorICAgICAgMjE2MiwgICAgNTg4LCAgICAzNjYsICAgIDE1NCwgIC0zMDc4LCAgIC01ODcsICAgMTA5NiwgICAgMjE1LAorICAgICAtMTA3MiwgICAtNzg0LCAgICA0NzIsICAtMTA4OSwgICAgIDk0LCAgICA0ODcsICAgICAxOCwgICAgIDcyLAorICAgICAgICAzNCwgICAgLTE1LCAgIC0zNzQsICAgLTYwNywgICAgMzE2LCAgICA4MzAsICAgLTE0NiwgICA0Mzc3LAorICAgICAgLTMwMSwgICAgMzkwLCAgICA4MzgsICAgIDEyMSwgICAtMTEwLCAgIC0xNDMsICAgIC05MywgICAyOTg4LAorICAgICAgMjkxNCwgICAtMzUyLCAgIC0zNTMsICAgLTc0NCwgICAtMTE1LCAgICAgOTksICAgIDQ5NSwgICAtMzQzLAorICAgICAgIDMwOSwgICAxMjYxLCAgIC01MTksICAgIDEwMSwgIC0yNjYyLCAgICAtNDQsICAtMzEzOSwgICAtNDkxLAorICAgICAgMTE0MiwgICAtMzIzLCAgICAtNTAsICAgIDc3NiwgICAgIDg2LCAgICAxODcsICAgIDQ4MCwgICAgMjcxLAorICAgICAgLTE2NywgICAgICAxLCAgIC0yNjcsICAgIC05OSwgICAgOTkxLCAgIDI0OTIsICAgLTE1MiwgICAyNDIzLAorICAgICAgLTIyNSwgICAgIDM0LCAgICA1NzYsICAtMTQ4NiwgICAtMjM2LCAgIC0zNzUsICAgIDE2MCwgICAtMTc2LAorICAgICAgLTE0NSwgICAyNTI1LCAgIC0xMzEsICAgIDE5NCwgICAgMzE3LCAgIDEyMTUsICAgMTU1MywgICAgMjk1LAorICAgICAtMTQwOCwgICAgMTMwLCAgIDIyNzksICAtMTE4NSwgICAyNjcxLCAgIC0xMzcsICAgLTMyNCwgICAgLTIzLAorICAgICAgICAyNiwgICAtNzc5LCAgIC00MzEsICAgICAtNCwgICAgNDg4LCAgIC0xODYsICAgIDE3NCwgICAtMTE5LAorICAgICAgMzA2MiwgICAtMTQ5LCAgIC0xNjgsICAgIDE5MSwgICAgMTY5LCAgIDExMjQsICAgIDMwMSwgICAxNDcxLAorICAgICAgLTQwOSwgICAtOTk5LCAgIC0xNjYsICAgMjE3NCwgIC0xNDA1LCAgICA5OTIsICAgLTE3OSwgIC0yNjA2LAorICAgICAgIC03MSwgIC0zMTUxLCAgICAgOTIsICAgLTk3NiwgICAzMDkxLCAgIC0zMjIsICAgIDMxMCwgICAtMzc0LAorICAgICAgLTc3OSwgICAgNTk5LCAgICAtNTUsICAgIDQyNSwgICAtNjk3LCAgICAgNjMsICAgICAyNywgICAgLTM4LAorICAgICAgICA4NiwgICAgMTcwLCAgICAtMTEsICAgLTYxNiwgICAgLTk3LCAgICA1MjUsICAgICA3OCwgICAgIDE0LAorICAgICAgIDY4NCwgIC01NTU2LCAgIC0zMDgsICAgLTQ0NCwgICAgMjY2LCAgIC0zOTYsICAtMTY2NSwgICAgIDg2LAorICAgICAgLTcyMiwgIC0xMDg3LCAgIC05MjEsICAgLTUyNSwgICAgICAzLCAgIC00MzksICAtMTYwMCwgICAgLTM3LAorICAgICAgMjAzOCwgIC0yNjcyLCAgIC0xODcsICAgIDM2MSwgIC04MTkyLCAgICA0MjUsICAgIDM2NSwgICAgIDU0LAorICAgICAgIDM0MywgICAtNzAzLCAgICAyNTMsICAgIDI4NCwgICAgLTU3LCAgIC0zMjcsICAgLTE1NCwgICAgMzkyLAorICAgICAgICA5OSwgICAtMTgxLCAgICAyMTMsICAgIDM5NSwgIC0yNDEyLCAgIC0zMDMsICAgIDE4MiwgICAgIDgyLAorICAgICAgMjMxMSwgICAgIDQ1LCAgIDE4MDEsICAgLTIwOSwgICAtOTg4LCAgICAgNDIsICAtMTQzMCwgICAgIDM4LAorICAgICAgLTcyMSwgICAgMTE4LCAgIC0xNjMsICAgMTI3OSwgICAyMTg0LCAgICAtMTgsICAgMjg1MSwgICAgMjc0LAorICAgICAgLTM2MywgICAgMjk3LCAgICAxNTAsICAgLTIyMCwgICAzNjUzLCAgIDMxMzUsICAgLTM4MSwgICAgMzM1LAorICAgICAgIDI1NCwgICAgMzc4LCAgICAtNTIsICAgICA1MiwgICAgMzI4LCAgIC0zODMsICAgIC02MSwgICAtODAyLAorICAgICAgLTQwOSwgICAgLTQ5LCAgICAgNDksICAtODE5MiwgICAgMzYyLCAgICAtNDgsICAgLTQzMCwgICAgLTU0LAorICAgICAgIDI1NSwgICAgMjQzLCAgIC01MjUsICAgICAxNCwgICAgMTUyLCAgICAgMTAsICAgLTM5MiwgICAtMzAxLAorICAgICAgLTU5NCwgICAtNTM5LCAgIDEyMDAsICAgIDYyNiwgIC0yOTc5LCAgICAyMzMsICAtMTUwNCwgICAgNjY0LAorICAgICAgLTcyOCwgIC0xMjkzLCAgIC00OTEsICAgIDM5NCwgICAxMzE3LCAgICAyOTgsICAgIDE2OSwgICAgMjE0LAorICAgICAgLTQyOSwgIC0xMDgzLCAgICAgNDIsICAgIDM4OSwgICA0NzUxLCAgICA1MTAsICAgIDI5OSwgICAtNTQyLAorICAgICAgIDQ1NiwgICAtODUyLCAgICAgMzAsICAgIDIwOCwgICAgLTYzLCAgIC0xMzEsICAgICA3MiwgICAtNDI1LAorICAgICAgICA3MywgICAgMjEzLCAgIC0yODcsICAgLTI3NywgICAgIDQzLCAgICAxMjgsICAgNTUyOCwgICAgMTY1LAorICAgICAgLTMxNiwgICAtMTM1LCAgIC01NzYsICAgLTU4MywgICAgMjE3LCAgLTEyOTgsICAgICA0NywgICAgMTM0LAorICAgICAgIDEwMywgIC0xODk0LCAgICAxNDgsICAgMzQwNiwgICAgODgwLCAgICA5NjQsICAgLTY5NywgICAgLTk0LAorICAgICAtMTYyNiwgICAgMjIzLCAgIDEyNTYsICAgLTUxNCwgICAyMDc5LCAgIC01MjksICAgMTkxNywgIC0xNDUyLAorICAgICAgLTYxNiwgICAtNjA1LCAgICAzODUsICAgLTk2MywgICAgMzk1LCAgICAxMDUsICAgLTE1NCwgIC0xNjI3LAorICAgICAgLTIxNCwgICAgIDQwLCAgICA5NjksICAgLTcwOCwgIC0xNDkyLCAgIC04MjQsICAgMjQ1NywgICAgMjc1LAorICAgICAgIDQwNCwgICAgODc2LCAgIC03ODEsICAtMTAyOSwgICAgIDM0LCAgICAgNzIsICAgIDIyOSwgICAtMTM3LAorICAgICAgIDI2NCwgICAtMzg3LCAgICAzMDUsICAgIC01NywgICAyOTA4LCAgIC0xNDMsICAgLTI0OSwgIC0yNDczLAorICAgICAgIDIwMiwgIC0xNDY3LCAgIC0zNjQsICAgMjA5NCwgICAtNTIxLCAgICAtNzAsICAgIDI2MCwgICAgMTMyLAorICAgICAgIDQ2NSwgICAgIDcxLCAgICA5ODIsICAgIC0zNiwgICAxNzkyLCAgICAzMDYsICAgMjkwNywgICAgLTU1LAorICAgICAgIDI1NCwgICAgNDIxLCAgICAyMzEsICAgIDE0MCwgICAxNzI3LCAgICA0NzQsICAgIDc2MSwgICAzMTUzLAorICAgICAgIC0xOCwgICAtMzU2LCAgICA0MTQsICAgMjIxOCwgICAgNTY0LCAgIC0yNDcsICAgLTUxMCwgICAgIDY3LAorICAgICAgMjM5MCwgICAyNTMxLCAgICAyNDAsICAgIDExNywgICAtNDg3LCAgIC0zMTAsICAgIDI2MSwgICAgMjIyLAorICAgICAgLTI4NiwgICAtODYxLCAgLTIxODAsICAgIDQ4MCwgICAgLTc1LCAgIDQ3NjksICAgLTQwNywgICAgMjQ4LAorICAgICAgIDIyNywgICAtMjI0LCAgICAzMDIsICAgIDkwMSwgIC0xMjAwLCAgIC03MjgsICAgMTAyNSwgICAgNzM0LAorICAgICAgLTMzNiwgICAgMTE1LCAgLTE3MjYsICAgLTE3OSwgICAgMTMxLCAgICAgNDMsICAgLTM1NywgICAgMzY0LAorICAgICAgLTY4MSwgICAgMjgzLCAgIC0xODksICAgIDcxNSwgIC0yNzkzLCAgIC02OTIsICAgMTM2NywgICAgOTE2LAorICAgICAgICAyOCwgICAtNTAwLCAgIDMwOTQsICAgLTU0MywgICAtNjI3LCAgIC03MDksICAgLTUwNiwgIC0xMDk0LAorICAgICAgICAzNCwgIC0yNDY0LCAgICA0MzQsICAgIDI1NywgICAgMzU3LCAgICAgMTAsICAgLTM5MCwgICAzMjA2LAorICAgICAgMzQ4MywgICAgMTM3LCAgICAxNDcsICAgIDE4MCwgICAgMjMxLCAgIC0yNjAsICAgLTcwNywgICAtODE4LAorICAgICAgIDQ3NiwgICAtNTI4LCAgICA2NTYsICAgIDgyNCwgICAgIC04LCAgIDMwNzMsICAgIDM2MiwgIC0zMDM0LAorICAgICAgLTE5OSwgICAgIDQ3LCAgICA2OTQsICAgLTI1MiwgICAgODE5LCAgIC0xNDcsICAgLTQ3OSwgICAgLTMyLAorICAgICAgIDUzMCwgICAtMTQxLCAgICAtOTEsICAgIDI1MSwgICAtMTU0LCAgICAzNzYsICAgLTYwMywgICAyMzA1LAorICAgICAtMjg1MywgICAtNjIyLCAgICAzMTYsICAgLTY4MCwgICAgNDAyLCAgIC04MTksICAgIDMyMywgICAgNDcxLAorICAgICAgIC00NywgICAxNzcyLCAgIDE1MDcsICAtMTA1MiwgICAtNjg1LCAgICAgMTgsICAtMjUwOSwgICAtNDE4LAorICAgICAgIDM3NywgICAgLTMxLCAgIC00MTIsICAgIDEwNSwgICAtOTA2LCAgIC0yNjcsICAtMjgwNiwgICAtMTg5LAorICAgICAgIC05NywgICAgMTk4LCAgIC04MDIsICAgIC04MiwgICAtNjU4LCAgLTI5ODAsICAgIDc5NSwgICAtNDQ3LAorICAgICAgIDY0NiwgICAxMDM3LCAgICA0ODYsICAgLTY4OSwgIC0yNjU0LCAgICAgNTUsICAtMzUzNCwgICAgNTQwLAorICAgICAgIC02OCwgICAgNTAyLCAgICAtOTAsICAgIDI3NywgICAgLTg3LCAgIC00OTcsICAgICAyNCwgICAtMjQ2LAorICAgICAgIDQwMCwgICAgMzkyLCAgICAzNDgsICAgICA3NiwgICAtMzQ1LCAgIC0yMzEsICAgIC03MSwgICAgMTU1LAorICAgICAgICAtNywgICAtMjI2LCAgIDY1NTMsICAgIDM3MSwgICAgMjYxLCAgIC0yOTAsICAgICA4OCwgICAgLTQ0LAorICAgICAgIDMxMSwgICAgNDcwLCAgICAgLTUsICAgIDE4MiwgICAtMTA1LCAgICAgNTYsICAgLTMyNCwgICAgMjY3LAorICAgICAgIDI0MSwgICAgMzI3LCAgICA5NjYsICAgIDIxOCwgIC00Njk1LCAgIC05NjgsICAgICAyNywgICAtMzUyLAorICAgICAgLTMxNSwgICAgMjAyLCAgIC0yMDQsICAgIDQzNSwgICAgMzYwLCAgIC01MzksICAgLTM3NSwgICAtNTI3LAorICAgICAtMTE1NywgICAxMDEwLCAgIC0yNDEsICAgNDE3MSwgICAtMjkyLCAgICAgNjYsICAgMjM0MywgICAgMzEwLAorICAgICAgLTY4MiwgICAgNTk1LCAgIDMwNDAsICAgIDUzOSwgICAtMTE4LCAgIC01NzMsICAgLTEyOCwgICAgOTUyLAorICAgICAgLTE3MiwgICAtNTQ3LCAgIC0yODUsICAgICAtMSwgICAgMzQ1LCAgLTU3MDEsICAgIDM0NSwgICAtMTUzLAorICAgICAgICA3NywgICAgMzQ5LCAgIC0yMjUsICAgLTM2NCwgICAtNjU1LCAgIC0yNzAsICAgLTcxNiwgICAtODI1LAorICAgICAgICAyNywgICAgIDU1LCAgIDIxNzksICAgLTE1NCwgICAtMjc1LCAgICAzNTksICAgLTUwMSwgICAtOTkyLAorICAgICAgLTY2NSwgICAxNTM4LCAgIC0yMTgsICAtMTE1OSwgICAyMTc2LCAgIC04NDUsICAtMzAxOCwgICAgMTA1LAorICAgICAgLTQ1OSwgIC0zMTQ2LCAgICAgNjcsICAgLTE5NywgICAtMjkzLCAgICA1MzksICAgIDExNSwgICAgLTc0LAorICAgICAgIDExOSwgICAtMTU4LCAgICAtODksICAgMTQ0OSwgIC0zMDA2LCAgICAxMDQsICAgIDY1MSwgICAgODg2LAorICAgICAgLTMxMCwgICAtMjQyLCAgIDEyMTksICAgMTgwNSwgICAgMTc2LCAgIDIyMzUsICAgIDU3OSwgICAgMjk0LAorICAgICAgIDYzNCwgICAxMzQ1LCAgICAgLTEsICAgLTQ1NCwgICAgNzU1LCAgLTEwMzAsICAgMTc2MCwgIC0yNDA0LAorICAgICAgLTQwNiwgICAgODk0LCAgICA2MTQsICAgIC03NCwgICAgMTEzLCAgLTEzMjUsICAgMTg0MywgICAtMzkyLAorICAgICAtMzIzOSwgICAyNDQwLCAgICAtNTQsICAgIDIyMiwgICAxMzQ5LCAgIC02OTUsICAtMTAwOSwgICAgNDM0LAorICAgICAgLTQ2OCwgICAtNTA5LCAgIC0yODAsICAgIDQ2MiwgICAgMjI4LCAgICA1NzMsICAgIDIxMywgICAgIDU1LAorICAgICAgIDMyNSwgICAgNTU3LCAgICAxMDAsICAgLTcyMSwgICAtNjc0LCAgICA2MDAsICAgIDc5NSwgICAxNTY3LAorICAgICAgIDQwNywgICAzMjczLCAgICAtNTgsICAtMTMzMCwgICAgMzQ5LCAgIC0xODEsICAgIDQxNywgICAtNTAzLAorICAgICAgIDkxMSwgICAgMzUwLCAgIC02ODEsICAtNDUwMiwgICAtMTI3LCAgICAtMjYsICAgIDMzMCwgICAgNjE4LAorICAgICAgIDI0MSwgICAtMTQ3LCAgICAyODQsICAgLTIyNiwgICAtMTI3LCAgLTI2OTIsICAgIDQ4NCwgICAtMTQ2LAorICAgICAgIC0xOCwgICAtNDE2LCAgICA3NTUsICAgICA4NSwgIC0zMTE5LCAgIC00MDQsICAgICAgMCwgICAtNDc4LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2I0NDMybDBbXSA9IHsKKyAgICAgLTM3NjQsICAgLTIyNywgICAgMTg0LCAgIC0yNTgsICAtMTcxMywgICAgMTIyLCAgICA0MTAsICAgIC0zMiwKKyAgICAgIC0yNDQsICAtMTMzNywgICAtMzI4LCAgICAtMjAsICAgLTIzNiwgICAtMzU5LCAgICAtMTMsICAgIC01MiwKKyAgICAgICAtNzUsICAgLTI2MCwgICAgNDI2LCAgICAtOTYsICAgIC0zNywgICAgLTM4LCAgICAxMTcsICAgLTkzOCwKKyAgICAgICA0ODcsICAgICA2MCwgICAgMjg2LCAgICA1NzEsICAgIDM2OCwgICAtNTUxLCAgICAxOTgsICAgLTEwMiwKKyAgICAgICAgMTUsICAgIC0xMSwgICA0NTM1LCAgIC0xMjcsICAgLTI0MSwgICAgMTE0LCAgICAtNzcsICAgLTMxNiwKKyAgICAgICAzMDIsICAgIDE5NSwgICAtMTQ5LCAgICAtNzMsICAgIDM1NywgICAtMTI4LCAgICAtMjMsICAgICAzNCwKKyAgICAgICAzMTksICAgIC05NywgICAgMTg5LCAgIDU5MTgsICAgIC0yMCwgICAtMTM0LCAgICAtNDcsICAgLTI0OSwKKyAgICAgICAgIDcsICAgICAgMywgICAgMTE2LCAgICAgIDcsICAgICA0OCwgICAgIDQ3LCAgICAgOTIsICAgICAxOSwKKyAgICAgICAgMTQsICAgICAzMSwgICAtMzg4LCAgIC0zMjksICAtMTg3OCwgICAtOTQ0LCAgICA5NTgsICAgIDYzMiwKKyAgICAgIDE5NzMsICAgIDE4MiwgICAtMTMwLCAgIC0xOTMsICAgMjMwOSwgICAtODY4LCAgICAgNjMsICAgIDI2MCwKKyAgICAgICAtMTIsICAgIC04OSwgICAgLTg4LCAgIC0yMDgsICAgIDEyNywgICAtMTY4LCAgICAyMzcsICAgICA3NCwKKyAgICAgIDExNTMsICAgIDkyNSwgICAyMjkyLCAgIDI5OTIsICAgIC0zNSwgICAgMjA0LCAgICA3NjYsICAgLTkzMCwKKyAgICAgICAtODcsICAgIDM0MSwgICAtMTAxLCAgICA1MDEsICAgICAzNSwgICAtMTgyLCAgICAxMTIsICAgICA5MSwKKyAgICAgICAtMjgsICAgICA3OSwgICAgMTkzLCAgICAtNzMsICAgIC03MSwgICAgIDUyLCAgICAgODIsICAgLTQyNywKKyAgICAgIC0xNDcsICAgIC02OSwgICA0NzIyLCAgICA0NjgsICAgLTE4NywgICAgIDk4LCAgIC0yOTUsICAgIDI5MiwKKyAgICAgIC05OTEsICAgICA0MywgICAgIDk4LCAgICAyMjUsICAgLTU1NSwgICAtNTk1LCAgICAtNjYsICAgLTE4MSwKKyAgICAgICAgOTEsICAgLTE1MiwgICAgIC0zLCAgICAgODksICAgLTIxOSwgICAgMzU2LCAgIC0zNzUsICAgLTExNCwKKyAgICAgLTE1NDYsICAgLTYyMCwgICAgNjQ4LCAgIDE5NDYsICAgICAzOSwgICAtNjA4LCAgIC05NDIsICAgIDEwMywKKyAgICAgICAxNzksICAgIDE3MCwgIC0yMzUwLCAgICAxNTcsICAgMTEzMiwgICAtOTQ0LCAgIC0yODMsICAgICA2NCwKKyAgICAgIC0zOTMsICAgICAxNSwgICAgLTkwLCAgICA3NjEsICAgLTE4NSwgICAgNjQ0LCAgIC0zNjAsICAgICAgNSwKKyAgICAgLTUyMTIsICAgIDEwNiwgICAtMTM2LCAgICAtNDAsICAgLTE1OSwgICAgLTQwLCAgIC0xMjAsICAgIC00MywKKyAgICAgICAgLTgsICAgLTE5NSwgICAgMjA4LCAgIC0xNzksICAgLTI5NSwgICAgLTYzLCAgICAgMTksICAgICAzMiwKKyAgICAgIC0xMDQsICAgIC0yMywgICAgMTMyLCAgICA2NjAsICAgLTQ2MCwgICAgMjM3LCAgICA1MjMsICAgLTY3NiwKKyAgICAgIC0zNzgsICAgIC04MSwgICAtMTg0LCAgIDI3MTgsICAgICA2NCwgICAgNTMxLCAgIDIxMTksICAtMTU2NCwKKyAgICAgICA2MTQsICAgIDkzMywgICAgICA2LCAgICAgNjUsICAgIC01MCwgICAgIDU1LCAgICAyNDMsICAgLTUzOSwKKyAgICAgIDExNjgsICAgIDk1MywgICAtMjgzLCAgICAgNDUsICAgIDQ3NiwgICAtMzQ2LCAgIDIyODUsICAgMTg5MiwKKyAgICAgICA2MTUsICAgLTUyMSwgICAgIDIzLCAgLTIwNzksICAgICA1NywgICAgLTExLCAgICAyMDgsICAgMTAyOSwKKyAgICAgICAzNzEsICAgICAyOCwgICAgMTcwLCAgICAtNjMsICAgLTE2NywgICAgMTg0LCAgIC0yMTcsICAgICA3NiwKKyAgICAgIC0zMjAsICAtMjc0NywgICAgNTQyLCAgLTIwOTgsICAgLTQwNywgICAgLTEwLCAgIC04NzYsICAtMTQ3NywKKyAgICAgIC0zMDYsICAgIDU2NSwgICAgIDU3LCAgICAtNDksICAgLTExMSwgICAgMTg1LCAgIC0yNTAsICAgIDEyMCwKKyAgICAgIC0xODYsICAgIDIxNCwgICAtNTIwLCAgICA0NjMsICAgIDc5MiwgIC0yNDIwLCAgIDI3NjAsICAgLTM4MywKKyAgICAgIC03ODMsICAtMTA5NywgICAtNDQxLCAgIC01MzUsICAgMTA3MCwgICAgIDc4LCAgICAgOTYsICAgIDEyMiwKKyAgICAgIC0xOTMsICAgIDUxNiwgICAgMTE0LCAgICAxMDAsICAgLTQxMywgICAgMTAwLCAgICAtMjMsICAgLTE1MywKKyAgICAgIDEyNjcsICAtNDIxMCwgICAtNzQyLCAgICAyMjgsICAgIDY1OSwgICAgMzk5LCAgIC0xNjksICAgIDQxMiwKKyAgICAgICAtODEsICAgMTA1NiwgICAgICA0LCAgIC0yNTQsICAgIDE3MywgICAgMTA5LCAgIC0yMTgsICAgIDE5NiwKKyAgICAgICAgNjQsICAgICAyNiwgICAtMTEzLCAgICAtNjAsICAgICAtOCwgICAgIDE1LCAgIDU0OTcsICAgIC03NiwKKyAgICAgICAxNjksICAgLTI5NCwgICAtMzk0LCAgICA1OTYsICAgIDM3OSwgICAgIDEyLCAgICAtNjQsICAgLTIwMywKKyAgICAgIC0xMzgsICAgICA0MSwgICAtMjQ5LCAgICAtNTMsICAgIC00NCwgICAgLTE5LCAgICAgNTUsICAgIC0zNCwKKyAgICAgICAgOTksICAgICAzNiwgICAgLTcwLCAgICAgIDgsICAgICA0NiwgICAyNzg3LCAgICA4NDIsICAgMTkxNywKKyAgICAgIC02OTMsICAgLTQyNCwgICAgMTUxLCAgICA0NjQsICAtMTE2MiwgICAxMDI3LCAgICAxNDgsICAtMTAyNywKKyAgICAgIC0xNzMsICAgIDMyOCwgICAgIDIzLCAgICA3OTIsICAgLTE4NCwgICAgMzk1LCAgIC02ODQsICAgIDIyOSwKKyAgICAgIC0xMzksICAgICAtNywgICAyNzg4LCAgICA0MDQsICAgICA0MywgIC0xNTA4LCAgIC01OTAsICAgICAgNiwKKyAgICAgIC0xODQsICAgIDkwNCwgICAgNDc1LCAgICAtMzcsICAgIDI3NiwgICAtMzYxLCAgIDE5MjQsICAgLTE4OCwKKyAgICAgIC0xMTMsICAtMTMzNCwgICAtMTc2LCAgICAgMTEsICAgIC0zNCwgICAgLTcwLCAgICAtNjgsICAgICA5NSwKKyAgICAgIC00MzMsICAgIDIyNSwgICAgNDM3LCAgIC00NTEsICAgIDQ3MSwgICAtMjcyLCAgIC0zODUsICAgMjc5MywKKyAgICAgLTI2ODUsICAgIDU0NCwgICAgODgxLCAgICA0MDksICAgLTc4OSwgICAgNzAwLCAgICAgLTUsICAgLTE0NCwKKyAgICAgICAgNjYsICAgIC0xNywgICAgNTA0LCAgIC0zOTcsICAgIDI2NCwgICAgIDc0LCAgICAtODEsICAtMTgwMywKKyAgICAgICA0NDQsICAgLTU3MywgICAgNjMzLCAgIC0zOTEsICAtMzMzOSwgICAgMTkyLCAgICA0ODQsICAgMTEyNiwKKyAgICAgIC0zMDYsICAgIDE1MywgICAgMzAzLCAgICAgNjEsICAgLTI1MywgICAtMjU1LCAgICAtNTcsICAgLTI3NywKKyAgICAgICAtODgsICAgLTEwMCwgICAgIDMyLCAgICAgNzksICAtMTMyMCwgICAtODU3LCAgIDMwODAsICAgMTE3OCwKKyAgICAgICAzMjMsICAgIDM1MywgICAtMTQ5LCAgIDEzMTYsICAgLTM5OSwgICAgMjM2LCAgIC0xMjksICAgIDIzMSwKKyAgICAgICAzMjMsICAgIDY5NiwgICAgIDU5LCAgIDEyMTcsICAgLTU2NywgICAtMjY4LCAgICA2NDIsICAgIDM4NCwKKyAgICAgIC0zMjcsICAgIC00NywgICAgNDY2LCAgIDE1MzAsICAgMTA5MiwgIC0xMTc2LCAgICA2MTIsICAgIDI1NywKKyAgICAgIC0xNDMsICAgLTI3MCwgICAgNDg3LCAgICAtNjIsICAgIDMzMiwgICAxMDg5LCAgICA5NjEsICAgLTcwNiwKKyAgICAgICA5MzgsICAgICA3OCwgICAgIDk3LCAgLTI4MDUsICAtMTA4OCwgICAtODcxLCAgIC0yNzMsICAgICA4NywKKyAgICAgIC0zNDUsICAgIDE0OCwgICAgMTEzLCAgICAxNjcsICAgICA5NywgICAgIDMxLCAgICAgNjgsICAgIC00NywKKyAgICAgICAtNTMsICAgICA1MywgICAgIDI5LCAgLTU3MjMsICAgIC01MywgICAgLTEyLCAgICAyNDEsICAgICA5MiwKKyAgICAgICAxMzEsICAgIDEzOSwgICAgIDQ4LCAgICAxMDIsICAgIC0yNiwgICAgLTQ3LCAgICA2NjQsICAgLTU4MCwKKyAgICAgICAgLTcsICAgMTI4NywgICAyNTMxLCAgIDEwNjEsICAgLTcxMCwgICAgIDI0LCAgIDEzODksICAtMTc0MiwKKyAgICAgICAyNTQsICAtMTE0NywgICAgNTM5LCAgIC0xNTAsICAgIC0yNCwgICAgNDk1LCAgIC0yMDQsICAgLTE3MSwKKyAgICAgICA5NTUsICAgIDIwMiwgICAtMTExLCAgICAxNDcsICAtMTQ1OCwgIC0zOTczLCAgICA0MjEsICAgLTQxNiwKKyAgICAgIC01NDQsICAgIDM5MiwgICAxNDE5LCAgIC0xNzgsICAgLTE2OCwgICAgLTUzLCAgICAgNTAsICAgLTUzNywKKyAgICAgICAgLTcsICAgLTM0NiwgICAtMjg5LCAgICAtNTIsICAgIC0zOCwgICAtMjU5LCAgIC0xMTUsICAgLTEzNiwKKyAgICAgIC0xMzgsICAgIC04OSwgICAtMjA1LCAgIC02NjEsICAtNDQyOSwgICAtMTEwLCAgICAzODAsICAgLTcyMSwKKyAgICAgIC0xODAsICAgIDEyNywgIC0xMzcxLCAgICAtNzgsICAgIDI3NiwgICAgMzE5LCAgICAyMjksICAgLTkzNCwKKyAgICAgICAyNjcsICAgLTM1MywgICAgIDQ0LCAgICAgNjUsICAgIDQ0OSwgICAgLTMyLCAgICAxNTksICAgIC0xMSwKKyAgICAgICAtMjIsICAgLTU3MSwgICAgMTAwLCAgIC02NzYsICAgMjg5MiwgIC0yNzQwLCAgICA5MDcsICAgIDUxMSwKKyAgICAgICAyNDgsICAgIDQ0MSwgICAgLTYyLCAgIC01MTcsICAgLTM0NywgICAtMjM1LCAgICAzMTksICAgICAtOCwKKyAgICAgIC0xNDAsICAgIDMwOSwgICAgMjU4LCAgIC0xMDYsICAgIDIxNSwgICAgICAxLCAgLTMyNTIsICAgIDQyNiwKKyAgICAgICA0NTUsICAtMjIxMywgICAxMDMxLCAgICA0MzAsICAgIDc0NiwgICAgMzY3LCAgICA2MDIsICAgIDE4NywKKyAgICAgIC0xNDcsICAgLTIwMCwgICAgIDk3LCAgICA1NTUsICAgLTEwNywgICAtMjQ5LCAgICAtNzEsICAgIDEwMSwKKyAgICAgICAgNTksICAgIC05NCwgICAgLTY0LCAgICAtMzMsICAgIDIyMSwgICAgMTg0LCAgIC03OTEsICAgIDY3MSwKKyAgICAgIC0xOTEsICAgIDI4NCwgIC0xMzExLCAgICA0MDIsICAgIC0yOSwgICAgMjUwLCAgIC0xOTAsICAgLTUwMywKKyAgICAgICAgMzgsICAgIDEwNiwgICAgNTg2LCAgIDQ3NjcsICAgIDUyNiwgICAgMTQ3LCAgIC0xODIsICAgIDI0OSwKKyAgICAgICAxNDYsICAgICAxNywgICAgMjkzLCAgLTEwOTUsICAgMTA3OSwgICAtMTYxLCAgICAxNDEsICAgICAtMiwKKyAgICAgICA2ODEsICAgLTI3NSwgICAtMTcxLCAgLTQ1MDQsICAgICA2MSwgICAtMTA1LCAgIC0zMDYsICAgIC02NiwKKyAgICAgICAyMjksICAgICAyMCwgICAtMTAyLCAgICAtOTMsICAgIDMzNCwgICAtMTg5LCAgICAgIDUsICAgICAtNiwKKyAgICAgICA0MTcsICAgMjU1MSwgICAgLTYzLCAgIC04NTIsICAgMTYwOCwgICAxODIwLCAgICA2NzAsICAgMTU5MiwKKyAgICAgICAxMDIsICAgIDIwMywgICAgMTQ3LCAgIC03NjcsICAgLTE0NywgICAgMzEwLCAgIC03MTgsICAgIDE3NSwKKyAgICAgICA1NTEsICAgIC05OCwgICAtMjAyLCAgICAzMDksICAgICA3MCwgICAgIDgxLCAgICAtNTUsICAgMTUxOCwKKyAgICAgICAyMjIsICAgIDMzOCwgICAtMzU2LCAgICAzNDksICAgICA5NywgICAgIDg2LCAgICA0OTUsICAgLTIzMywKKyAgICAgIC0xMjEsICAgMjkzNiwgICAgMjAwLCAgICA5MzUsICAgLTM4MSwgICAyNDc0LCAgICAgNTMsICAgIDQ5NCwKKyAgICAgICAyNDgsICAgLTEzOSwgICAgLTQ1LCAgICAxMDAsICAtMTI4NywgICAtMTgxLCAgIC0zNzAsICAgIDMxMSwKKyAgICAgICAyODcsICAgMzAxNiwgICAgLTk2LCAgIC0xMjgsICAgMjE0NiwgICAgNTY3LCAgIC0zODMsICAgLTU1MSwKKyAgICAgICAtOTYsICAgIDE0NCwgICAgNDk1LCAgICA0MjgsICAgIC0zMiwgICAgMTM3LCAgICAgMjcsICAgLTI3MiwKKyAgICAgIC0xNDksICAgICAgOSwgICAgLTYxLCAgICAxNzcsICAtNTIzNiwgICAgIDkxLCAgIC04MzcsICAgIDYxMSwKKyAgICAgIC0yNzksICAgIC03NCwgICAgNjUyLCAgICAgMTQsICAgLTE3OCwgICAgLTgyLCAgICAtODksICAgIDM0NywKKyAgICAgIC0yNDUsICAgIDY0NywgICAgLTYyLCAgICAgNDksICAgLTIxNSwgICAgIDI5LCAgICAtNTUsICAgIC0yNywKKyAgICAgICAxNzgsICAgICA3OSwgICAgLTE5LCAgICAtNTksICAgIDE3NywgICAtMTUyLCAgICAgIDAsICAgIDE4OSwKKyAgICAgICAtMTAsICAgIDEyOCwgICAtMTE1LCAgICAgMzMsICAgICA2MSwgICAtMTA2LCAgICAgNTYsICAgIC0xMywKKyAgICAgICAxMzUsICAgIDExNiwgIC01NzcyLCAgICAxNTcsICAgICA0MywgICAgIDI2LCAgICAtMTEsICAgIDEwMiwKKyAgICAgICAgLTQsICAgIC01MiwgICAgMjA4LCAgIC0xODYsICAgIDE5OCwgICAgIDk5LCAgICAgODEsICAgIC0yOSwKKyAgICAgIC0xMDMsICAgIDE5MywgICAgLTM1LCAgICAtODQsICAgICAtNCwgICAtMTExLCAgLTUyNTEsICAgICA4NCwKKyAgICAgICAgNzEsICAgIC04NSwgICAgLTc3LCAgICAgNTUsICAgIDIzNCwgICAgIDM4LCAgICAgIDAsICAgIC0zNSwKKyAgICAgICAgNjAsICAgNTg3NSwgICAgIDk4LCAgICAgMzYsICAgLTIxOSwgICAgLTE3LCAgIC00MTksICAgLTEzNiwKKyAgICAgICAgNDcsICAgICAzNCwgICAgIDU1LCAgICAtMjEsICAgIC0xNywgICAgIC0xLCAgICAgNzIsICAgICA5NCwKKyAgICAgICAgNTIsICAgICAtMywgICAtNzAzLCAgLTE0MzcsICAgLTUxOCwgICAgNTU3LCAgICAxMjEsICAgIDM1NiwKKyAgICAgIC0zNDUsICAgLTcxNywgICAtNDM4LCAgIC0yNzksICAgICAxMywgICAgIDcwLCAgICAtOTUsICAgICAtMiwKKyAgICAgLTQxNzAsICAgICA0MCwgICAgMTM2LCAgICAgMTcsICAgLTE1MywgICAgICA4LCAgIC0xNDksICAgIC0yNywKKyAgICAgIC01NTksICAgIDI2OCwgICAtMjM3LCAgICAtODIsICAgLTIyMCwgICAtOTIxLCAgIC01ODgsICAgLTE1MCwKKyAgICAgIDM0ODEsICAtMTkwNiwgICAgNjQ3LCAgICA2NzUsICAgLTQ1NSwgICAgNTk4LCAgIC0zODYsICAgIC01MiwKKyAgICAgICAgLTcsICAgIDIyMiwgICAtMjAxLCAgICAgOTAsICAgICA1NCwgICAgIDc1LCAgIC0yODMsICAgIDExOCwKKyAgICAgIC0zNzUsICAgNTc2OCwgICAgIDIwLCAgIC0xMjYsICAgLTE0MSwgICAgLTk5LCAgICAgNjQsICAgIDExNiwKKyAgICAgICAgMTYsICAgIC01OCwgICAgICAwLCAgICAtMzEsICAgIC0xNSwgICAgMjUwLCAgIC0xMDQsICAgIC0zMCwKKyAgICAgIC0xNDQsICAgIDExNSwgICAgIDEyLCAgICAxMTcsICAgLTQ4MiwgIC0xNzA5LCAgIC00MzYsICAgIDEyMiwKKyAgICAgIC0yNDYsICAgICAtNywgICAgMjcxLCAgIDE5NjEsICAgIDE1NCwgICAgMTQ5LCAgICAtODYsICAgIDE0NywKKyAgICAgICAyNTgsICAgIDUzMSwgICAxNzYwLCAgICA5MTQsICAtMTE5NiwgIC0xODAwLCAgICA4MTIsICAgLTYyMSwKKyAgICAgICAxMjUsICAgLTE2MSwgICAxMzYxLCAgICAgNTAsICAgLTY1MSwgIC0xMzA3LCAgICAzNjAsICAgLTc4NSwKKyAgICAgICAyMDUsICAgLTE1NiwgICAgMjk0LCAgICAgMjEsICAtMzQ4NCwgICAgLTE4LCAgICAtNzksICAgLTI2NiwKKyAgICAgICA3NzAsICAgIDMwNywgICAgIDI5LCAgIC03NjUsICAgLTI1MCwgICAgMTgzLCAgICAgNTUsICAgIDEzMSwKKyAgICAgIDE0NTIsICAgIDI2MCwgICAgMjI0LCAgICAyMjEsICAgLTM0NywgICAgMzYwLCAgIC0zNTIsICAtMjE4OCwKKyAgICAgIC02NjQsICAgLTUwMywgICAgMzEzLCAgICA0MDYsICAgLTI1MSwgICAzMjY4LCAgICAyMTAsICAgIC00NiwKKyAgICAgICAxMjksICAgLTI3NiwgICAgMzQzLCAgIC0xNDMsICAgIDEwNCwgICAgLTU1LCAgICA0NjEsICAgICAxNywKKyAgICAgIC01NzYsICAgLTI4NywgICAtMjg5LCAgICAgMzMsICAtMjUwMCwgICAgLTg1LCAgIC00MjgsICAtMTEzNywKKyAgICAgICA5MTgsICAgLTI0NSwgICAtNDkwLCAgIC0yNjAsICAgLTI3MCwgICAtMTMzLCAgIC01OTEsICAgIDE5OSwKKyAgICAgIC0yOTQsICAgMjc4NCwgICAgMTAyLCAgICAgMTksICAgLTEwOSwgICAtNzQ1LCAgICAgOTEsICAgLTUyNCwKKyAgICAgICAtNDQsICAgICAyOCwgICAgMjUyLCAgIC01MTEsICAgIC04MCwgICAtMTQ2LCAgICAyNzEsICAgIDUxOSwKKyAgICAgIC0yMTYsICAtMjI4MCwgICAtNDExLCAgIDM2OTksICAgLTM2OCwgICAtNTM4LCAgICA0MjcsICAgLTE1OCwKKyAgICAgICAxMTQsICAgIC01MCwgICAtNTg5LCAgIC0zNDAsICAgLTE4MCwgICAgNzAzLCAgIC0xODYsICAgIDQ4NywKKyAgICAgIC02NDksICAgIDY2OCwgICAtOTE2LCAgIC00MzYsICAtMzY4NCwgIC0xMDE2LCAgICA4NzcsICAgIC02NSwKKyAgICAgIC0xNTMsICAgIC02MiwgICAtMTQ4LCAgICAtMTcsICAgLTEwNiwgICAgMTQyLCAgICAtNzMsICAgICAtMSwKKyAgICAgICAtNjgsICAgIDU2NywgICAtNjU4LCAgICA4MTUsICAgMjI3MCwgICAtNTYzLCAgIC01MTksICAgLTIyNiwKKyAgICAgIC0yMjMsICAgLTI4MiwgICAgNTg0LCAgICAyNDAsICAtMTUyMiwgIC0xOTM1LCAgIDExNjksICAgIDg4MCwKKyAgICAgICAxMjcsICAtMTI3NiwgICAtMTI3LCAgICAzOTksICAgICA2MywgICAgIDI1LCAgLTEyOTcsICAgMjEzMSwKKyAgICAgICA1OTIsICAgMTY1MiwgICAyNjA5LCAgICAgNjksICAgLTU4MSwgICAtMTc5LCAgICA5NDcsICAgIDU5NywKKyAgICAgICAxNTAsICAgICAzNSwgICAgICAwLCAgIC0yNTUsICAgLTIzMiwgICAtNzI4LCAgICAyMzksICAgICA5MSwKKyAgICAgICAxMzAsICAgLTIzNCwgICAgMjMxLCAgICAgNTYsICAtMjE4MSwgICAxNzc0LCAgLTIxOTYsICAgMTYzMywKKyAgICAgLTEwNjUsICAgLTY2MiwgICAgNzc3LCAgIC0xNzUsICAgLTEyOCwgICAgMjY3LCAgICAgLTcsICAgICA1MSwKKyAgICAgICAgMjcsICAgLTEzMywgICAgIDk1LCAgIC01MDAsICAgIDE4OCwgICAtMTY3LCAgICAgOTQsICAgLTE3NiwKKyAgICAgICAtMjksICAgIC02NSwgICAtMTYxLCAgIC0xNDEsICAgLTY5NCwgICAtOTY4LCAgICA1OTQsICAgLTI2OSwKKyAgICAgIC00MjIsICAgLTQ3MiwgICAtNzMxLCAgIDEyMTAsICAgLTgxNiwgICAyMTQyLCAgLTEzMjEsICAtMTc0NiwKKyAgICAgIC0xNDksICAgLTk4MywgICAxMzEwLCAgIC04MzksICAgIDc2MiwgICAgMjg0LCAgICAgOTksICAgIC0zMSwKKyAgICAgLTExNjksICAgIC04NCwgIC0xMTE5LCAgICAtNTUsICAgLTcyMCwgICAtOTQ0LCAgLTExMTUsICAgLTI3MSwKKyAgICAgLTEwMzIsICAgMTA2NCwgICAgMTg3LCAgLTEwMTMsICAgMjk4NywgICAgIDI2LCAgIC0yMDksICAgIDUxNiwKKyAgICAgICAgLTgsICAgIDEwNywgICAgLTI0LCAgICAxODgsICAgIDI3OCwgICAgLTUzLCAgICA2MjQsICAgIDQ2MCwKKyAgICAgIC0yNzUsICAtMTg4MSwgIC0yMDAxLCAgICA4NTEsICAtMTc0MCwgICAtNDA3LCAgIDE2NDMsICAgLTM1MiwKKyAgICAgICAtMTcsICAgLTUyOCwgICAtNTM4LCAgIC0xNzUsICAgIDE3OSwgICAgNDE2LCAgIC0yOTcsICAgICA1NCwKKyAgICAgICAxMzIsICAgLTQ5MSwgICAgLTc2LCAgICAgMzQsICAgLTQ0MCwgICAgMTc1LCAgIDIwNjUsICAtMjAwNiwKKyAgICAgIC0xNjQsICAgICAzOCwgICAtNDAzLCAgICA5MDIsICAgLTEyOSwgICAgMjE1LCAgIDE1NDUsICAgLTQxNCwKKyAgICAgLTExODMsICAgLTUzMiwgICAgNTc4LCAgICAyNDgsICAgLTMwOCwgICAgMTg5LCAgIC01NjMsICAgLTM0NSwKKyAgICAgIC05NDksICAgLTI3OSwgICAxNjkzLCAgIC05NTksICAgIDEwMSwgICAgNzgzLCAgICAgIDksICAgMTY0MSwKKyAgICAgIDE0OTQsICAgIDE2NywgICAtMjk0LCAgIC01MzgsICAgIDk1MSwgICAgMTE1LCAgICA1OTAsICAgIDEwNSwKKyAgICAgIC04NDcsICAtMTAwMywgICAgNDY0LCAgIC0zNjgsICAtMTI2OCwgICAgNjQxLCAgICAyNTQsICAgIDI0MywKKyAgICAgICA0ODgsICAgMjYzNiwgIC0xMjA5LCAgIC0yNzIsICAgIDQzNywgICAgNDQ1LCAgICA3ODEsICAgLTQ2MywKKyAgICAgIC00MTUsICAgIDUzOCwgICAtODExLCAgICA1ODgsICAgMTA4MywgICAgMjA2LCAgIC01NDcsICAgIDE3MSwKKyAgICAgIC01ODUsICAgLTc0NCwgICAgMzQzLCAgIC02MDQsICAgIDM5NSwgICAgLTc2LCAgICA5MTAsICAgLTUyMywKKyAgICAgIC0xMDgsICAgLTQ0OSwgICAgNjI1LCAgIC0zMjUsICAtMTA3OSwgICAgMjczLCAgLTE0NzMsICAtMTA5NiwKKyAgICAgIC0xMzcsICAgLTU2NSwgICAyMDc3LCAgIC02MjMsICAgIDIxNCwgICAtMzQyLCAgIC0yNzMsICAgIDc2OSwKKyAgICAgIDExMzcsICAgLTg3OSwgICAtNzMxLCAgICAgNTYsICAtMTA5OCwgICAgMjExLCAgICA4MjIsICAgIDU3OSwKKyAgICAgIC04MzksICAgIDE2NCwgICAtNjAwLCAgICAtODAsICAgICA2MSwgICAgMzE2LCAgICA2NDQsICAgMTQ0NSwKKyAgICAgICA4OTEsICAtMTc5NiwgIC0xNzk4LCAgIC0xNjIsICAtMTYzMSwgICAtNDkyLCAgIC02MjYsICAgIDU5MywKKyAgICAgICA1NDQsICAgICA2NiwgICAgIDYzLCAgIC04NTcsICAtMTI3MywgICAgNDA2LCAgIDE2NjUsICAgIDg5OSwKKyAgICAgIC00NjcsICAgICA4NywgICAtMTE3LCAgIC00NjksICAgIDEyNiwgICAgIDMwLCAgIC05MzEsICAgMTQ0NiwKKyAgICAgIC0xOTAsICAgIDM4OCwgIC0xNjA4LCAgIC0zMTYsICAtMjE5OSwgICAtMTI3LCAgICA0ODQsICAgIC01MSwKKyAgICAgICAgNTYsICAgLTUyNCwgICAxNTI0LCAgIC0xMDMsICAgMTIzMSwgICAtNzQwLCAgICA3MTcsICAgLTg2MSwKKyAgICAgICA4MjMsICAgLTY2NSwgIC0xNzkwLCAgICA0MTEsICAgLTY5MCwgICAgMzAzLCAgLTE2MTUsICAgICA2MywKKyAgICAgIC0yMzIsICAgICAxOSwgICAxMDkwLCAgICAtOTYsICAgIDEzNywgICAgIDgwLCAgLTEwMjcsICAgIDU4MSwKKyAgICAgICAtNjEsICAgIDY3MiwgICAgMTMzLCAgICA0NDQsICAgLTc2NywgICAgNzY2LCAgICAtNDIsICAtMzE3NCwKKyAgICAgIC0yNzAsICAgIC0yMywgICAtMTI2LCAgLTExMTEsICAgICA2NywgIC0xMzY3LCAgICAgIDQsICAgIDMxNSwKKyAgICAgICAtNTMsICAgIC05MCwgICAtMTY1LCAgICAgNDgsICAtMTY1NywgICAtMTE3LCAgICAzOTIsICAgIDM1NiwKKyAgICAgICA3OTIsICAgLTYxMCwgICAtNjE4LCAgIC0yMTksICAgIDQ0NiwgICAgMTAyLCAgICAzNzQsICAgIDIwNywKKyAgICAgIDEwMjYsICAgMjQ4MCwgICAtNDYxLCAgIC03ODIsICAgMTE2MSwgIC0xMzUxLCAgIDEwMzIsICAgIDQ4NiwKKyAgICAgIC0zMDgsICAgIDI5MCwgICAtMjcyLCAgICA4OTksICAgMTkxMiwgICAgIDM2LCAgIC02MjQsICAgIDI4NiwKKyAgICAgIC00MjgsICAgLTYyMywgICAtNjY1LCAgICAgMTIsICAgLTYyMSwgIC0xOTg1LCAgICAtMzQsICAgIDQ2OCwKKyAgICAgICAzMTgsICAgLTQ2NywgICAgMTI3LCAgIC05NzIsICAgIC0zOSwgICAtNjYzLCAgIDIzMDcsICAgIC0yNiwKKyAgICAgICA0MDYsICAgLTQ2OCwgICAtNjU3LCAgLTE0MDQsICAgLTM0MiwgICAyMzU2LCAgIC0zOTUsICAtMTQyMiwKKyAgICAgLTEyNDMsICAgIDQ2NSwgICAgIDkwLCAgIC02NjUsICAgLTI4MCwgICAtMjkwLCAgICAtMjEsICAtMTc1MiwKKyAgICAgICAyODAsICAgIDI3MSwgICAgMzk1LCAgICAyNDAsICAgLTQwMiwgICAgIDU1LCAgIDEwNzcsICAgIDE0OCwKKyAgICAgIC0zMDksICAgMTgxOCwgICAgNDgzLCAgLTEyOTMsICAgICA0MywgICAgMjYxLCAgICA1NjYsICAgLTEzMSwKKyAgICAgICA5NDcsICAgLTgxNSwgICAtODcyLCAgLTEwMjEsICAtMTAwMSwgICAtMzk1LCAgICAyNjMsICAgLTU1NSwKKyAgICAgICAgNzgsICAtMjE5MywgICAtMzYwLCAgICAtNzYsICAtMTAyOSwgICAtNDkzLCAgIC00NjQsICAgMTMzOSwKKyAgICAgICAtNTMsICAgIDc1MCwgICAtNjcxLCAgLTEzNDksICAgIDEzMywgICAgLTcwLCAgICAxMTQsICAgIDUwMSwKKyAgICAgICA3NjYsICAgLTgxNiwgICAgNzAzLCAgIC05OTIsICAgLTEyMiwgICAtNTIwLCAgLTEzMjMsICAtMjUzOSwKKyAgICAgIC0zNjUsICAgIC0zNSwgICAtNTU1LCAgIC04ODgsICAgMTUxNSwgICAtMTkxLCAgIDEzMjIsICAgMTYzMywKKyAgICAgIC02NzQsICAgIDQ1MSwgIC0xMjQ2LCAgICAyNzAsICAgLTg2OCwgICAgNzAzLCAgIC0zOTQsICAgIDEwNiwKKyAgICAgIC03NzksICAgIDc1NCwgICAgNjUwLCAgIDEwNjYsICAgLTQxNywgIC0xMzA1LCAgICAxNDksICAgLTE2NSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiNDQzMmwxW10gPSB7CisgICAgIC0zODY3LCAgIC00NDgsICAgMjIwMiwgICAgMTI5LCAgIC0xMDAsICAgIDM5MywgICAgIDM3LCAgIC0yNjcsCisgICAgICAtMTU2LCAgICAgMjMsICAgLTI3NCwgICAgMjIyLCAgICAgMzMsICAgLTE5MSwgICAgMTA0LCAgIC0xNDAsCisgICAgICAgLTUwLCAgICAtMjgsICAgLTE0OCwgICAtMTgxLCAgICAtMjIsICAgICAgNiwgICAgNDg5LCAgICA5OTMsCisgICAgIC0yNzY0LCAgIDExOTEsICAgLTc3MywgICAgNzgxLCAgIC00NjAsICAgIDg0MywgICAgLTc3LCAgLTE0MTcsCisgICAgICAgMzkwLCAgICAxMjQsICAgLTIwMywgICAgMjA1LCAgICA2NjIsICAgIC0xNiwgICAgNTY5LCAgIC05NjMsCisgICAgICAgNjA5LCAgIC0xNTUsICAgICA2NCwgICAtMjkzLCAgIDI2NDksICAtMjUzMywgICAgIDcwLCAgIC00NzIsCisgICAgICAtNDgyLCAgLTE3MzIsICAgIDIzNSwgICAgIC01LCAgIC00ODUsICAgIDExNiwgICAtMTc3LCAgIC0xMDQsCisgICAgICAgMzE0LCAgIC0zNTUsICAgIDExOCwgICAgIDI1LCAgICA5MjEsICAgIDI4NSwgICAgMTMwLCAgICAtOTQsCisgICAgICAgIDc3LCAgICAxMjEsICAgMTA2OCwgICAtNDM1LCAgIDE0MDcsICAgIDQ0NywgICAtNDI3LCAgLTEwOTYsCisgICAgICAtNzU3LCAgICAyNTgsICAgICAxOSwgICAzMjM2LCAgICA3MDIsICAgIDM2MiwgICAtOTI4LCAgIC0zNDgsCisgICAgICAtMTUwLCAgIC03ODQsICAgLTY4NywgICAtMzg4LCAgIC0xNzYsICAgIC0zOCwgICAgIDE2LCAgICAtMTQsCisgICAgICAxMDE3LCAgICA4NzksICAgIDkzNSwgICAxMjgwLCAgIDEwMTQsICAgIC04NSwgICAtMjU2LCAgIC0xMDMsCisgICAgIC0zMzg0LCAgIC05MjgsICAgLTIwMCwgICAtNDA2LCAgIC0xNzUsICAgIDMwNCwgICAgLTU0LCAgICAxOTUsCisgICAgICAgLTc4LCAgICA2NzYsICAgLTM1NiwgICAtMTY3LCAgIC0xNjUsICAgIC01NiwgIC0zMTMzLCAgICAxNTYsCisgICAgICAtMTcxLCAgIC02ODQsICAgLTY5OCwgICAtMTM1LCAgICAyMzAsICAgIC0zMCwgICAgIDMyLCAgICA1NDIsCisgICAgICAxOTU5LCAgIC0xMjQsICAgIC03NiwgICAgMTYyLCAgICAxODIsICAgLTE3NCwgICAxMDExLCAgICAtOTcsCisgICAgICAgNjc4LCAgICAgMTAsICAgIDE4OCwgICAgIDMwLCAgIDEwODYsICAgLTI2MiwgICAtMTU3LCAgICAyNTAsCisgICAgICAgMjQxLCAgICAyMzMsICAgLTU4NCwgICAzMjc2LCAgIDIxMjYsICAgIC01MCwgICAtMjA3LCAgICA2MzcsCisgICAgICAtNDQwLCAgICAzMzEsICAgLTQzNCwgICAgMjUxLCAgIC0yNjcsICAgIDI2OSwgICAtMzkyLCAgICAgNjgsCisgICAgICAtMjQ0LCAgICAgIDgsICAgIDkyOCwgICAgODI3LCAgLTEwOTYsICAgLTMwOSwgICAtMzU2LCAgIC0zNzUsCisgICAgIC0zMjA0LCAgICA0MjIsICAgIDY5NSwgICAgICAyLCAgICAyNDAsICAgIDU5NSwgICAgNjQxLCAgICA1ODIsCisgICAgICAgMzQyLCAgICAgNDIsICAgICAgNywgICAgNTM5LCAgICAtNjQsICAgLTExNiwgICAgIDgyLCAgICAgMTYsCisgICAgICAgIDI2LCAgIC0xMzYsICAgLTEyMiwgICAtMTE0LCAgLTU4MTQsICAgICAyMiwgICAtMjcyLCAgICAgMTAsCisgICAgICAgMTEzLCAgICAxODYsICAgLTQyMiwgICAgLTk1LCAgICAzMDksICAgIDMwOCwgICAtMTE4LCAgIC0yMDgsCisgICAgICAgIDUyLCAgIC0xNzUsICAgICAxMiwgICAtMTA2LCAgICAgLTYsICAgICAyMCwgICAgIDU4LCAgIDYwNTMsCisgICAgICAtMTAxLCAgICAtMjAsICAgICAxMCwgICAgIDcwLCAgICAxODksICAgICA1NywgICAgLTExLCAgICAyMTAsCisgICAgICAgIDgzLCAgICAyMzksICAgICAtNiwgICAgLTc5LCAgIC0yMzMsICAgIC01OSwgICAgIDMxLCAgICAtMzAsCisgICAgICAgLTYyLCAgICAgNjQsICAgIC0zOCwgICAgIDI1LCAgICAtNzgsICAgLTIwMiwgICAtMjE1LCAgIC0xMTUsCisgICAgICAxNDc3LCAgICAyNTUsICAgIDEwMSwgIC0yNTc1LCAgICAxODYsICAgMzE0MCwgICAgLTQ2LCAgICAtNDUsCisgICAgICAgIDUzLCAgIC0xODMsICAgIC04OSwgICAtNDEyLCAgICAxODMsICAgLTIyMiwgICAgIDUwLCAgIC0yMzcsCisgICAgICAgIDk2LCAgICAgMzUsICAgMTY4NCwgICAtNTIxLCAgIC0xNjksICAgLTQzNiwgICAtMjk1LCAgIDEzOTAsCisgICAgICAgMjYxLCAgICAgMjcsICAgIDE2MywgICAgMzUyLCAgICAgNjgsICAtMzY3NywgICAgIDEyLCAgICAzMTAsCisgICAgICAtNTk5LCAgICAzMzEsICAgIDEzOCwgICAtMzMzLCAgIC0yNjksICAgLTEzMCwgICAgLTQ0LCAgICAtMTQsCisgICAgICAgMjY1LCAgIC02MjYsICAgIDI1OCwgICAgLTU5LCAgICAgMzEsICAgIC0xNywgICAgMjIyLCAgICAtMTAsCisgICAgICAtMzY0LCAgICAyODAsICAgLTE4MywgICAtMjM1LCAgIC0yMTcsICAgICA3MywgICAgLTY3LCAgICAxMTQsCisgICAgICAgMTk2LCAgLTUxMzIsICAgIDI2OSwgICAgMTU5LCAgICAgLTYsICAgIC0zNiwgICAtMjQ4LCAgICAyNzQsCisgICAgICAtMzI4LCAgIDI3MTIsICAgLTM5MywgICAyNzYzLCAgICA1MDcsICAgLTExMCwgICAtMTY2LCAgICAtODQsCisgICAgICAgLTcyLCAgLTExMTEsICAgIC0xOSwgICAgMzcwLCAgICAgMjUsICAgICAgNSwgICAgMTU2LCAgICAtMzIsCisgICAgICAgMjM3LCAgICAtNTcsICAgLTEwNiwgICAgLTIyLCAgICAzNzAsICAgLTIyOSwgICAxMDk5LCAgIDQyOTcsCisgICAgICAgMTUyLCAgICAgNzIsICAgIC01NiwgICAgMzQ3LCAgICAgNjQsICAgLTUwMSwgICAgLTU3LCAgICAxNzgsCisgICAgICAgMTc1LCAgICAtMTQsICAgIC04NCwgICAtNjI2LCAgICA1NTUsICAgIDE1NSwgICAgIDIwLCAgICAtNzUsCisgICAgICAgIDIwLCAgICAtMzMsICAgLTI1NCwgICAtMTI1LCAgICAgLTksICAgIDE1MCwgICAgIDkxLCAgICAgLTcsCisgICAgICAgLTQ1LCAgICAyMzksICAgLTEwOSwgICAgIDcyLCAgICAtNjYsICAgLTE3MiwgICAtMjExLCAgIDYwNjMsCisgICAgICAtMjA1LCAgICAxNzEsICAgIC03NSwgICAgIDUwLCAgICAtNzUsICAgICAyMiwgICAgMTA5LCAgICAgMjEsCisgICAgICAgLTU4LCAgICAgNTgsICAgLTEwNSwgICAtNDMyLCAgICAzMTAsICAgMzc4MiwgICAgLTE4LCAgLTEwNzEsCisgICAgICAgIDE5LCAgICAgMjAsICAgMTQ1NSwgICAgMzM3LCAgIC0yNTcsICAgLTI4OCwgICAgLTUyLCAgICA1MTksCisgICAgICAgIDQzLCAgICAgODAsICAgLTE3NSwgICAtMjE4LCAgICAgIDksICAgIDE3NiwgICAgLTI4LCAgIC00MTgsCisgICAgICAgMjAwLCAgIC01MTQsICAgIDM1MSwgICAgMTE5LCAgLTU5MjAsICAgIC05NiwgICAgLTMzLCAgIC0yODksCisgICAgICAgIDc0LCAgICAgMjYsICAgIDEyMCwgICAgLTM3LCAgICAxMTMsICAgICA0NywgICAtMTQ1LCAgICAtMTcsCisgICAgICAgMzM0LCAgICAgNDYsICAgICA0NywgICAgIDE5LCAgICAyNzQsICAgIDE3MiwgICAgMTU5LCAgIC00MDQsCisgICAgICAzMTUxLCAgIC00MDgsICAgLTU1OSwgICAgOTg3LCAgIC0xNzgsICAgIDI1MywgICAgLTkwLCAgIC00OTgsCisgICAgICAxNDU0LCAgIDExODMsICAgIDM5MiwgICAgNzYyLCAgICAyMjAsICAtMTIwNywgICAtMjIwLCAgICAtNjksCisgICAgICAgLTg1LCAgICAgMjIsICAgMTY0NCwgICAxODU4LCAgICA3MjUsICAgMTA4NCwgICAgICAwLCAgIC0yNTcsCisgICAgICAgMjkwLCAgIDE3MTIsICAgLTE1MSwgICAtMTg4LCAgIC0zOTAsICAgIDYzOCwgICAtMzI3LCAgLTIxODUsCisgICAgICAtMzIyLCAgLTExMTYsICAgLTE1MCwgICAgMTIwLCAgIC0xNDAsICAgIDE5OCwgICAgMTYyLCAgICAtODMsCisgICAgICAxMzIxLCAgICAyMzIsICAgIDI0MiwgICAgLTUyLCAgIC00NTYsICAgIDc3OCwgICAtMjg4LCAgICAgNjUsCisgICAgICAyNDMxLCAgICAgMzcsICAgICA4NSwgICAtNDg5LCAgICA4NjIsICAgMjc3NiwgICAgMjYwLCAgICAtNzIsCisgICAgICAgNzkyLCAgICAxMDAsICAgICAxNywgICAtMjEwLCAgICA1ODgsICAgICA0OSwgICAgNjAwLCAgICAyNDYsCisgICAgICAtMjU4LCAgICAxMjgsICAgIC01MSwgICAtNDkyLCAgIC0zOTUsICAgLTQ4OSwgICAgIDUwLCAgLTUzMDgsCisgICAgICAgLTY3LCAgICAzMTQsICAgIDEyNCwgICAgIDQ2LCAgIC0xODgsICAgIC02NCwgICAtMTAxLCAgICAgNTEsCisgICAgICAtNTM1LCAgICAxMDgsICAgICA1NiwgICAgIC00LCAgIC0xOTEsICAgLTkyMywgICAgNDg1LCAgICA1NzgsCisgICAgICAxMzIwLCAgICAyMjgsICAgLTUzNSwgICAgMzEwLCAgICAyMjcsICAgIDM5NSwgIC0xNDQxLCAgIDI2NjAsCisgICAgICAgMjI2LCAgIC0zOTIsICAgIDIyMSwgICAtNjg2LCAgIDE3NDksICAgLTE3NSwgICAtOTA0LCAgIC01NzEsCisgICAgICAtMTI5LCAgICAxNTQsICAgMjYyMiwgICAgNjA5LCAgIC0yNDcsICAgLTI0MCwgICAtODkzLCAgICAgOTgsCisgICAgICAgMjkxLCAgLTIyNzcsICAgIDQxMSwgICAgMjYwLCAgIC0xNjAsICAgMjA2MSwgICAtMjAzLCAgIC00MzcsCisgICAgICAgMzU5LCAgICAgMjEsICAgLTEwMSwgICAgIDE5LCAgICAgNDksICAgICAxNSwgICAgLTk4LCAgICAgODIsCisgICAgICAgICAzLCAgIC01NTUsICAgIDE2NCwgICAtMTUyLCAgICAtNTgsICAgICAzOCwgICAgMTc1LCAgIC00MzksCisgICAgICAgLTM3LCAgICAgNjgsICAgIC0yMSwgICAtMTgxLCAgLTU1NTYsICAgIC0yNywgICAgICA4LCAgICAgNDgsCisgICAgICAgIDIxLCAgIC0xNTEsICAgIDM4MSwgICAgICAzLCAgIC0xNTIsICAgIC03NCwgICAgMjAyLCAgICAtMjksCisgICAgICAxODYzLCAgIDE3MTMsICAgLTkyMiwgIC0xOTc2LCAgICA1NTEsICAtMTUyMiwgICAgNTI1LCAgIC0xMTYsCisgICAgICAgMTQ2LCAgLTE3MzAsICAgLTIzOCwgICAgLTcyLCAgIC0xODMsICAgIDEyNiwgICAgMjM0LCAgIC0yNDAsCisgICAgICAgIDgyLCAgICAxMzgsICAgIC02MCwgICAtMTMxLCAgLTIyMjYsICAgIDIyNiwgICAtNzAyLCAgICAxODMsCisgICAgICAgLTgxLCAgICA0NjIsICAtMjg1MSwgIC0xNDE5LCAgLTEwMDUsICAgIDEyNCwgICAgLTgxLCAgIC0yNTIsCisgICAgICAgLTY1LCAgICAxNDcsICAgIC01OCwgICAtMTc5LCAgICAzMDYsICAgIDE1NCwgICAgMTIyLCAgICAtNjksCisgICAgICAgIDY5LCAgICAgMTEsICAgIDExNSwgICAgMjk2LCAgIDMzNDAsICAgLTUwMSwgIC0yNTgwLCAgIC04MDQsCisgICAgICAgICA5LCAgICA1OTEsICAgIC04NiwgICAgIDg4LCAgICAxMjcsICAgIDU4OCwgICAgMTgzLCAgICAgNDgsCisgICAgICAgIDc5LCAgICAtMzgsICAgLTE5OSwgICAgIDYzLCAgIC0xNDAsICAgICAyOSwgICAgIDg4LCAgICAtMjgsCisgICAgICAgMjU5LCAgICAgNjksICAgMTc0MywgICAtNTMxLCAgICAxMTAsICAgIC0xOCwgICAgNzc2LCAgICAtMTgsCisgICAgICAtMTc3LCAgICAxMTIsICAgICAzNiwgICAtMjQzLCAgIC0yMDgsICAgIDUyOCwgICAgLTQ3LCAgIDQ3MDksCisgICAgICAgMTA3LCAgIC0xMjUsICAgIDE0MCwgICAgIC0xLCAgICAgMjIsICAgICAxNSwgICAgNDE2LCAgIC0xOTQsCisgICAgICAtMjY3LCAgICAtNDksICAgICA0MywgICAgIC0zLCAgIC0zMDgsICAgIDIxNCwgICAtMTI4LCAgICAxNDAsCisgICAgICA1MzcyLCAgIC0xMjMsICAgICA3MCwgICAgMjc1LCAgICAyMTAsICAgIDE4MiwgICAtMTQ3LCAgIC0xMzEsCisgICAgICAgLTg0LCAgICAgNjksICAgIDExNiwgICAgIDI5LCAgIC00MDEsICAgLTE2MiwgICAtMjM2LCAgIC0xNzMsCisgICAgICAgMzc4LCAgICAgNDUsICAgIC0xMiwgICAgLTc3LCAgLTYyMDksICAgLTEwMywgICAgMTI2LCAgICAgNTQsCisgICAgICAgLTE5LCAgICAtMjAsICAgICA0MywgICAgIDY0LCAgICAgOTIsICAgICAtOCwgICAgLTEyLCAgICAxMTgsCisgICAgICAtMTIzLCAgICAgNTgsICAtMzYyOCwgICAtNDE0LCAgLTIxNDcsICAgICA3NiwgICAgIDk1LCAgICAtOTksCisgICAgICAgMzU3LCAgICAtMTAsICAgIDI3OCwgICAgICA0LCAgIC02MDgsICAgIDUwNCwgICAgMTA1LCAgICAtNzIsCisgICAgICAtMTA5LCAgICAtOTIsICAgIC01NSwgICAgMzY3LCAgIC0xNjcsICAgICA0MCwgICAgLTM0LCAgICAgNzYsCisgICAgICAgMjIwLCAgIDM0MzQsICAgLTM2NiwgICAgMTkxLCAgICAyNDgsICAgICAyOSwgICAgMTg3LCAgIC0xNzcsCisgICAgICAgMTU1LCAgIC0zNDgsICAgLTM0MSwgIC0yNDY2LCAgICAyNzIsICAgLTEzNiwgICAgNTEwLCAgICAxMzksCisgICAgICAgIDgxLCAgICAxODQsICAgICAzMywgICAtMjk5LCAgICAgOTIsICAgIC00NCwgICAtNDAyLCAgIC01ODMsCisgICAgICAtNzI1LCAgIC00MDAsICAgLTE1OSwgICAgNzUxLCAgIC0yMjUsICAgIDM3NywgICAtMTYwLCAgIDE1NTYsCisgICAgIC0yNjUyLCAgICA2ODUsICAtMTA3NywgICAxMjc2LCAgICAzMzIsICAgLTI1NywgIC0xNDQ5LCAgIC0yODIsCisgICAgICAtMjMxLCAgIC0xNDUsICAgICA1OCwgICAgMTczLCAgICA0MjEsICAgIDI3MSwgICAgNDAxLCAgIC0xODYsCisgICAgICAgIDc5LCAgIC0yNTgsICAgIDEyNywgICAgMjUyLCAgICAyMTQsICAgICA5NiwgICAgMTU3LCAgICAxOTUsCisgICAgICAgMjA1LCAgICAxMTgsICAtNDc3MSwgICAgLTk1LCAgIC0xNjQsICAgIDIxNywgICAgNDc3LCAgICAtNTEsCisgICAgICAgIC00LCAgICAgIDgsICAgMTQ1MCwgICAgLTUxLCAgICAtNTIsICAgIDk1MiwgICAgNjc1LCAgICA5MjksCisgICAgICAtMjczLCAgICA0NzUsICAgICAgOSwgICAgMjgyLCAgIC0yNDksICAgIDIzNiwgICAgNzQ2LCAgLTE0MDcsCisgICAgICAtMjcyLCAgIDE4NDUsICAgIDY5MiwgICAtMTA1LCAgIDI2OTAsICAgIDE2OCwgICAgICAxLCAgICAgLTEsCisgICAgICAgMTU3LCAgIC01OTksICAgIDMwNSwgICAgMjU1LCAgLTIyNTIsICAgICA0NSwgICAtMTk5LCAgICAxMTksCisgICAgIC0zNDg5LCAgIC0xNjEsICAgICAgNiwgICAtMjYzLCAgIC0yNTksICAgIDMzOCwgICAtMjUxLCAgICAgNjEsCisgICAgICAgMTUzLCAgIC0xMjQsICAgIDQzMiwgICAgIC03LCAgICAxMzEsICAgICAgNSwgICAgMzA1LCAgIC0zMjIsCisgICAgIC0zMjgzLCAgICAtMzIsICAgLTMzNiwgICAtMjczLCAgIDIyNDMsICAgIDg2MywgICAgIC0xLCAgICA2ODEsCisgICAgICAtMzY1LCAgIC0yNDYsICAgLTE1MiwgICAgMzc1LCAgIC0xMzMsICAgIC0xNSwgICAtMjA4LCAgIC0xMDQsCisgICAgICAgIDg5LCAgICAxMjgsICAgLTEzNSwgICAgIDQ0LCAgIC0yNTUsICAgIDU0OSwgIC0yNzUxLCAgICAtNDgsCisgICAgICAgMjcwLCAgLTI1ODQsICAgLTU0OSwgICAtNjMxLCAgICA0NDUsICAgIDE4MiwgICAtMTk4LCAgICA3NDMsCisgICAgICAtMjE1LCAgICAtNjAsICAgLTQwMCwgICAxMzgzLCAgICAxNjcsICAgIC02NSwgICAgMjUwLCAgICAxNDYsCisgICAgICAgMTg1LCAgICAgMjIsICAgLTQ4NCwgICAtMTYxLCAgICAgODYsICAgMTc1OCwgICAgOTY0LCAgICA0MDQsCisgICAgIC0yNTc0LCAgIDEwMjYsICAgICAgNiwgICAtNTE2LCAgIC03MjQsICAgIDMxNSwgIC0xODkxLCAgICAzMTEsCisgICAgICAgICAyLCAgICAzMzksICAgIC0zOSwgICAgMzI0LCAgICAyOTksICAgLTQ5NywgICAgLTEyLCAgICAxNzksCisgICAgIC0xMjQyLCAgICAzNjQsICAgLTE4NSwgICAtMTk3LCAgLTE0NzQsICAgIDIzMiwgICAtNDkwLCAgIDQwNDIsCisgICAgICAtMTA1LCAgICA4ODcsICAgICAzMSwgICAgNTM5LCAgICAyMzUsICAgICA3NSwgICAtMTEyLCAgIC0yMDAsCisgICAgICAgLTMxLCAgICAgNzQsICAgIC03NiwgICAgLTE2LCAgICAtMjAsICAgICAzOCwgICAtMTU5LCAgIC0xNDMsCisgICAgICAgMTE0LCAgICAtNzcsICAgLTExMCwgICAgIDI4LCAgICAtMTgsICAgIC04NCwgICAgLTI3LCAgICAtNTMsCisgICAgICAgLTgyLCAgIC0yMjQsICAgICA3NSwgICAgICAwLCAgICAtNDYsICAgIC02NCwgICAgIDQ0LCAgIC0xMTIsCisgICAgICAgIDg0LCAgICAtODUsICAtNjAzMCwgICAgLTI0LCAgICA2NjEsICAgLTQ3NCwgICAtMTc4LCAgICAgIDgsCisgICAgIC0xMDIzLCAgIC0zOTYsICAgIDE5OSwgICAgLTE5LCAgICAtNTAsICAgIC05MywgICAgMzg1LCAgICAyMDksCisgICAgIC0xMjI3LCAgIDI0OTIsICAgMjE2MywgICAgOTg2LCAgLTEzNTksICAgIDM5OSwgICAgODQ4LCAgICA2ODEsCisgICAgICAtODI5LCAgICAyMTEsICAgIDY5NiwgICAtNTk5LCAgLTEzOTgsICAgMTk1MSwgICAtMTEzLCAgICAzNzQsCisgICAgICAgLTE3LCAgLTExMTMsICAtMTcwOCwgICAxMjk0LCAgICA2NjYsICAgMTc3NCwgICAgNjIzLCAgICAyNTksCisgICAgICAgMTA1LCAgICA5NjEsICAgIC04NywgICAgIDQzLCAgIC00NjMsICAgICA2NSwgICAgMTU1LCAgICAtMjYsCisgICAgICAgLTMxLCAgLTE0NzcsICAgLTUwOCwgICAxMDkxLCAgLTE0NjMsICAgLTUyNCwgIC0xODUzLCAgIDEzNTQsCisgICAgICAgNDM0LCAgICAgODYsICAgIDg5MywgICAtODcxLCAgICAxNTEsICAtMTg4NywgICAgMjA1LCAgICA0MjMsCisgICAgICAgODU3LCAgICAtNTUsICAgIC0xMSwgICAgLTM5LCAgICAzNDEsICAgICA2MSwgICAxMTU4LCAgIDI2NTAsCisgICAgICAgODk5LCAgLTI0OTEsICAgLTU5MywgICAtODQzLCAgLTEzOTksICAgIC0xNSwgICAtNzEzLCAgIC0xNzEsCisgICAgICAtMTk1LCAgIC01MjMsICAgIC00NiwgICAgMjQzLCAgICAxMTcsICAgIDI0MSwgICAgIC04LCAgICAxNDAsCisgICAgICAtMTQ5LCAgIC0xOTEsICAgICA3MCwgICAgMTM0LCAgLTExNTgsICAgMTkzMywgICAxMTM1LCAgLTIyODQsCisgICAgIC0xMDQ5LCAgIDE3MTcsICAgIDM3OCwgICAtMTU1LCAgICAtMzcsICAgIDE3MSwgICAtNjkyLCAgIC0yODAsCisgICAgICAgOTE4LCAgIC03ODYsICAgLTEyMywgICAgNTU4LCAgICA1NzEsICAgICAzOSwgICAtMzE1LCAgICAgNjIsCisgICAgICAgIDI3LCAgICAgNTksICAgIDcwOCwgICAtMTM0LCAgIC0yMDAsICAgLTE2OCwgICAtMTM0LCAgICAxNDgsCisgICAgICAtMTQyLCAgICAgMjUsICAgIDE2NCwgICAtMjgyLCAgICAyODQsICAgIC05NSwgICAgLTM1LCAgICAzNzYsCisgICAgICAgMTY1LCAgICAzNjcsICAgLTMzNSwgICAgMjcxLCAgICAyNDksICAtNDUyMCwgICAgMTc2LCAgICAtMzYsCisgICAgICAtMjE2LCAgLTEzMDMsICAgIDM3NSwgICAgIDkyLCAgICA2MDIsICAgLTg4OSwgICAtMzkwLCAgICAyODQsCisgICAgICAgIDc4LCAgLTEzMTgsICAgMTI1OSwgICAxODY1LCAgIDE0OTgsICAgMjA2MywgICAtMjM0LCAgIC04NDAsCisgICAgICAtMzkxLCAgICAgODgsICAgIDE2OCwgICAtMjM1LCAgICAtNzQsICAgICAzMSwgICAtMjM5LCAgIDEyMjEsCisgICAgICAgIDcxLCAgLTE2MzcsICAgMTUxMywgICAgIDY4LCAgIDIyMDEsICAgMTUxMywgIC0xMDk5LCAgIC02MjIsCisgICAgICAgNDI2LCAgICAzNDMsICAgLTMzMCwgICAtNjQ4LCAgICAzODEsICAgLTE1NiwgICAgIDI3LCAgICAtMzEsCisgICAgICAgLTkyLCAgICAxMzMsICAgIDIxMCwgICAgMTAzLCAgIC0xNTUsICAgMjA2MSwgICAtMzY2LCAgLTExNzMsCisgICAgICAgLTMxLCAgIC0yNzQsICAgLTcxMywgICAtNDcxLCAgICA1MDksICAgMTA0NCwgICAgMjA4LCAgICA0MDMsCisgICAgICAgNDg2LCAgICAtNjYsICAgLTUyMSwgIC0xODgzLCAgIC0xODAsICAgLTUzNywgICAxMjgzLCAgICAtOTgsCisgICAgIC0xNDY0LCAgIC00NTYsICAgIDUwOCwgICAtNjE5LCAgIC01NDYsICAgIDY4NSwgICAgOTQ0LCAgICAtODUsCisgICAgICAgMzExLCAgIDExNzIsICAgLTE5NCwgICAxNDA2LCAgICAtOTksICAgLTgyNywgICAxNTA2LCAgICAzOTYsCisgICAgICAgMTk2LCAgLTE1MzQsICAtMTE4MSwgICAxNTg4LCAgIDEyNTAsICAgICA0NywgICAxMDM0LCAgIC0xNzEsCisgICAgIC0xMjQ3LCAgICAtOTgsICAgLTEyMCwgICAxMTgxLCAgLTIxOTUsICAgLTM4NCwgICAgOTQ1LCAgICA2MjcsCisgICAgICAgIDI2LCAgIC0yNDgsICAgMTM3MiwgICAtNjcxLCAgICAyMTQsICAgLTY0OSwgICAgLTE3LCAgICAtNDQsCisgICAgICAtNTAwLCAgIC01NTksICAgIDU3NywgICAtNjAxLCAgICAgMzIsICAgIDQyMSwgICAgNTMxLCAgICAzNDQsCisgICAgIC0xMjMzLCAgICAxNDUsICAgIDM0OCwgICAgNjE0LCAgIC01NjAsICAgLTI0NCwgICAtMzU3LCAgIC0yMDIsCisgICAgICAgODE0LCAgIC00OTQsICAtMjMyMCwgICAgMzA4LCAgLTIyNzcsICAgLTQ4MSwgICAtNTE4LCAgIC00MzEsCisgICAgICAtODUxLCAgICAgNDMsICAgLTIwNCwgICAgLTI2LCAgIC03NDIsICAgMTA4MywgICAtMTMwLCAgIDIwMDIsCisgICAgICAxNjQyLCAgLTExNTYsICAgMTc0NiwgICAtNTI5LCAgICA5MzcsICAgLTU0NCwgICAgNDE2LCAgIC03NDEsCisgICAgICAgNzYzLCAgIC0yMzIsICAgIDUwOSwgICAgMjQzLCAgIC00NTgsICAgICA3OCwgICAtMTMwLCAgICAxNDMsCisgICAgICAtMTIzLCAgICAgNzEsICAgLTY2NiwgICAtMTA1LCAgICAgMzEsICAtMTA2MSwgICAgNDQxLCAgICAtNDgsCisgICAgICAgNDExLCAgLTE1NDcsICAgIDE1NSwgICAtNzMwLCAgICA0MzksICAgMTYyNCwgICAgODczLCAgIC02MTEsCisgICAgICAtNDcwLCAgIDIzNDgsICAgLTE1NywgICAxMTg0LCAgICA2NzgsICAgLTE3NCwgICAgNTQyLCAgICAtOTUsCisgICAgICAgLTEyLCAgIC00MDUsICAgIDIzNywgICAgMzIyLCAgLTExOTQsICAgMTkwMywgICAxNDk2LCAgICAzNTcsCisgICAgICAgLTM0LCAgIC02NjEsICAtMTAyNCwgICAyMjM2LCAgICA4NjAsICAgLTI1NiwgICAgNjE3LCAgICA3NTYsCisgICAgICAtNDg1LCAgIC0yNzMsICAgLTU4OSwgICAgNTM2LCAgICAyMTQsICAgLTI4NiwgICAgNzgyLCAgICA0MTgsCisgICAgICAgMzQ2LCAgIC00NjIsICAgIDQ0MywgICAxMDU2LCAgIC05MTQsICAgLTMwNCwgICAtNTY0LCAgIC0zMzIsCisgICAgICAxODIzLCAgIDIwNzksICAgICA5MywgICAtOTc1LCAgIC04OTEsICAtMTA4OSwgICAtNzIwLCAgLTExMjcsCisgICAgICAgNzAyLCAgICAzMDAsICAgIDc4NywgICAgMzc0LCAgICAtNzgsICAgMTA3MCwgICAgNjkxLCAgIDEzMzksCisgICAgICAtNzk3LCAgICAgNTcsICAgIDQ4MiwgICAgNDMyLCAgICA3NDgsICAgMTUzOCwgICAgNjczLCAgIDE4ODUsCisgICAgICAtNTA0LCAgIDE5MTMsICAgLTE5MCwgICAtMTM1LCAgICA4ODEsICAgLTEzOSwgICAgIDg0LCAgICAzNzksCisgICAgICAtMTc2LCAgIC0xMjksICAgLTMzMSwgICAgLTM0LCAgIC02OTAsICAgIDI4MiwgICAtNTYzLCAgICAgNTEsCisgICAgICAgIDcxLCAgIC03MTQsICAgLTEwMywgICAxMDc0LCAgIC02NTEsICAgLTU4MiwgICAxMzg4LCAgIC0zMjAsCisgICAgIC0xMTE1LCAgIDE1NDcsICAtMTA4OCwgICAgLTY1LCAgLTI2MzQsICAgLTIwMSwgICAtNjUzLCAgICAxMTYsCisgICAgICAtMjM4LCAgIC0yMTgsICAgIDQ3NiwgICAxNDE3LCAgIDE2NzEsICAgMTEzNSwgIC0xMDI1LCAgICA2MTQsCisgICAgICAtNjYyLCAgICAxMjcsICAgIDg2MywgICAtMTE3LCAgICA3MjYsICAgLTk3MSwgICAxMzgyLCAgIC0yODYsCisgICAgICAgNDY1LCAgIDExOTUsICAgLTcxNSwgICAgODYyLCAgLTEyNTYsICAgIDEwNSwgICAgIDM3LCAgLTExOTAsCisgICAgICAtNDQyLCAgLTE3NzcsICAgICA1MCwgICAgMTYyLCAgIDE1NzcsICAgIDU4MCwgICAgNzYyLCAgICAyNTMsCisgICAgICAgIDkyLCAgIC0zMDgsICAtMTIzOCwgICAtMTYxLCAgICAyOTUsICAgLTE1MCwgICAxNzMzLCAgIDE4MzEsCisgICAgICAtNTI3LCAgIC01MjcsICAgIC0yOCwgICAgIDcwLCAgIC0zNTksICAtMTU5MCwgICAgODYwLCAgIC0yMjEsCisgICAgICAgIDQ3LCAgLTEyMDEsICAgLTI1NCwgICAgIDM5LCAgICA3ODAsICAgLTMyNiwgICAxMDk3LCAgLTEwMTksCisgICAgICAgODM0LCAgICAzNjIsICAgIDM1NywgICAgIDQxLCAgICA2OTMsICAtMTA5OSwgIC0yNjg3LCAgICA2MTQsCisgICAgICAgMjcwLCAgIC0xMjgsICAgLTMyMiwgIC0xMTQ5LCAgICA2MzEsICAgIC00NiwgICAtMzQzLCAgIDE0OTUsCisgICAgICAtODk2LCAgIC04NjQsICAgMTU0NSwgICAgMjAwLCAgIC05MjIsICAtMTEzMywgICAtNjM3LCAgLTEyMzEsCisgICAgICAgNDg0LCAgIC03OTYsICAgLTc0MywgICAtMzcxLCAgICA5OTksICAgMTMwMCwgICAgMTczLCAgICAtMTksCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjQ0MzJzMFtdID0geworICAgICAtMjU1OCwgICAyNzUxLCAgIC00NDAsICAgMTIwMCwgICAxMDY3LCAgIC03MjUsICAgLTQ5MiwgICAgNTg4LAorICAgICAgIDIzNCwgICAtMjA5LCAgIC0xMDgsICAgLTIzMCwgICAgMjIzLCAgIC0yMzEsICAgLTIzNSwgICAtMTMyLAorICAgICAgIC01MSwgICAgIDg4LCAgIC0yOTAsICAgLTIxNCwgICAgLTk5LCAgICAtNjAsICAgIDE3NSwgICAyNTQ2LAorICAgICAgLTk5MSwgICAgOTA3LCAgICA0NDYsICAgIDYzNSwgICAgMjg0LCAgICA3MDcsICAgIDIzOCwgICAgMjIwLAorICAgICAgLTMwOCwgICAgMjU5LCAgICAgIDgsICAgLTQzNSwgIC0yMjA3LCAgLTE0ODcsICAtMTU3OSwgICAgIDQ2LAorICAgICAgIDI4NSwgICAtMjQ5LCAgICAxNTQsICAgLTM3MCwgICAgIDM3LCAgICAgNDIsICAgMTUyNCwgIC0xODUzLAorICAgICAgMTM5MywgICAxMjA0LCAgICAxMjYsICAgMTc1MSwgICAgIDgyLCAgICAxMzYsICAgIDM2MywgIC0yNDExLAorICAgICAgLTc4MiwgICAtMTI4LCAgIC04MTgsICAgLTIzMiwgICAgNzY1LCAgIC0xNzMsICAgLTEyNywgICAgNzMyLAorICAgICAgIDI2MCwgICAtMTAxLCAgICA4NjgsICAgLTI0OSwgICAgMjkwLCAgICAgMzIsICAgIDY0NSwgICAgIDU1LAorICAgICAtMTc0MiwgIC0xMDc3LCAgICAzOTIsICAgLTU2OCwgICAgNjI5LCAgIC05MjAsICAgLTI0MywgICAgNzkxLAorICAgICAgLTYwNCwgICAtMzYzLCAgICAxMTcsICAtMTM2MCwgICAgLTE1LCAgIC0yNDUsICAtMzY1NSwgICAgIDU0LAorICAgICAgLTI5NywgICAgIDEwLCAgICAxMjQsICAgICAxMSwgIC0xMTE0LCAgIC01NjcsICAgMzg4MiwgIC0yMDQyLAorICAgICAtMTEyMCwgICAgLTQyLCAgIC0xMTQsICAgLTkxNCwgICAgNDE5LCAgICAzMDcsICAgICA0NCwgICAgMjc3LAorICAgICAgLTEwMSwgICAgNDI5LCAgICAxNzAsICAgIDE4NywgICAtNTI4LCAgIC03MDUsICAgIDM0OCwgICAgLTE5LAorICAgICAgIDE4MCwgICAgLTc2LCAgICAgOTEsICAtMTg2MSwgICAtMTgxLCAgIC0xNzEsICAgIDgwNCwgICAtNzMwLAorICAgICAgIDIyMiwgICAtMTg0LCAgICAzNDksICAgIDE5MSwgICAtMTI1LCAgICAgMTQsICAgNDI3MCwgICAtNDY3LAorICAgICAgLTI3MiwgICAgIDI5LCAgIC0yMTYsICAgIDIxMiwgICAgNDI2LCAgIC0yMjIsICAgICAxMSwgICAgLTE2LAorICAgICAgLTg1MiwgICAgMTAxLCAgICA1NzYsICAgIDE3OCwgICAgMzUxLCAgICA2NDcsICAgICA5MCwgICAgMTc5LAorICAgICAgLTY4MSwgICAtMTg3LCAgICAgNzcsICAgNDExNSwgICAtOTc2LCAgIC03MjYsICAgIDcxMSwgICAgNzYzLAorICAgICAgIDU3MiwgIC0xMTY2LCAgICAtNDYsICAgLTQ0NSwgICAtMTAzLCAgICAxMzUsICAgIDI5NCwgICAgMzAwLAorICAgICAgICAxMCwgICAgNzM3LCAgICAzODYsICAgLTM5OSwgICAtMzQ5LCAgICAtNTIsICAgNTM5MywgICAtMTA3LAorICAgICAgIC0zMiwgICAtMjI5LCAgIC0xNTQsICAgLTE4MSwgICAgIDgyLCAgICAtNjgsICAgIC0xMywgICAgLTc3LAorICAgICAgICA0OCwgICAgIDc1LCAgICAxMTcsICAgIC01MCwgICAgMjU0LCAgICAyMzMsICAgICA5OCwgICAgIDc1LAorICAgICAtMjIxOCwgIC0yMjE0LCAgIDE0OTEsICAgIDgzMiwgICAgMjI1LCAgLTEwNTcsICAgIDI2NywgICAgNTM5LAorICAgICAgMTk2MywgICAtMjQ1LCAgIC0zNTMsICAgIDQ1NCwgICAtNDMwLCAgICAtNTQsICAgLTc0NywgICAgLTU4LAorICAgICAgLTQzOCwgICAgLTkwLCAgICAtNjQsICAgIDI3NywgICAgMjE0LCAgIC0xMDUsICAgIC00NywgIC0xMzAxLAorICAgICAgLTQwNCwgIC0xMTc5LCAgICA2ODIsICAtNDA5MywgICAgNzY0LCAgIC0yNzAsICAgLTM0MiwgICAtMzY3LAorICAgICAtMTM3OCwgICAgICA2LCAgICAtODMsICAgIDQyOSwgICAgMzk4LCAgICAgNjEsICAgLTE0OSwgICAgMTgwLAorICAgICAgICAzMSwgICAgMTY5LCAgIC0yMTgsICAgIDE1MiwgICAgLTcxLCAgICAtMzgsICAgMjYwNSwgICAgNjc5LAorICAgICAgLTE3NSwgICAtNTMzLCAgIDE3ODcsICAgIDYxMSwgICAgNDg0LCAgIC0zMjIsICAgIDE1OCwgICAtNTYxLAorICAgICAgIDEyNSwgICAgLTM1LCAgICAtNDIsICAgLTE5MCwgICAgNTI5LCAgICA0NDksICAgIDE1NywgIC0zMTA1LAorICAgICAgIDEwNiwgICAgMTY4LCAgICAgLTgsICAgIC02NiwgICAgLTgwLCAgIDE0NjMsICAgMTEzNiwgICA0NzkzLAorICAgICAgIC05OCwgICAtNDMyLCAgICA1MzgsICAgLTE0NSwgICAgMjQxLCAgIC0xNTgsICAgIDEwNSwgICAtMzcyLAorICAgICAgICAzOSwgICAtMTYwLCAgICAgOTIsICAgLTIyMywgICAgIDgxLCAgICAyNDUsICAgLTE0MiwgICAtMTYyLAorICAgICAgLTE2NywgICAtMjk3LCAgICAtNDksICAgIC05OCwgICAgNTgyLCAgLTUxNzgsICAgMTEzMCwgICAtMjcxLAorICAgICAgIDU2NywgICAtMjUxLCAgICAgNTUsICAgIDQ4NywgICAtMzAzLCAgICAgMzEsICAgIC0yNSwgICAgIDg3LAorICAgICAgIC03MCwgICAgMTU0LCAgICAtMjMsICAgLTIyMSwgICAgIDcwLCAgICAyMDgsICAgICA0OCwgICAtMTM3LAorICAgICAgICA0NiwgICAgIDU5LCAgICAgLTksICAtMTM5NywgICAtOTcwLCAgICAyMjQsICAgIDcxNCwgICAgMTYxLAorICAgICAgICAyNCwgICAtMzA3LCAgIDEyOTUsICAgMTQ2NywgICAtMTU1LCAgIC01MDUsICAgLTUyMSwgICAtMjQ0LAorICAgICAgIDUwMywgICAgLTI1LCAgIC05ODksICAgMzY2NCwgICAtMTQ4LCAgICAgMTIsICAgLTEzNSwgICAgMjE4LAorICAgICAgLTE1OSwgICAtMTU2LCAgIC03NjksICAgLTQyMSwgICAgNTUzLCAgICA3MTUsICAgIDY5NywgICAtMTgxLAorICAgICAgMTQyNiwgICAgNDI1LCAgICAtMzksICAgLTEwMywgIC00NTU4LCAgICAxNzEsICAgIDM0NywgICAgMTYxLAorICAgICAgIDE3MCwgICAgMTI4LCAgIC0yMTAsICAgIC0zNSwgICAgIDMxLCAgICAxMjUsICAgLTI2NCwgICAtMTM1LAorICAgICAgLTEwMCwgICAyNjg1LCAgIC0yMzAsICAgMjA2MiwgICAxNjE4LCAgICAtOTksICAgLTg3NCwgICAgOTI2LAorICAgICAgIDc1NywgICAgMzgwLCAgICA0MDQsICAgIC03MywgICAgIDMwLCAgICAgMjksICAgIDQ2MiwgICAgNzI1LAorICAgICAgLTM4OSwgICAtMjQ2LCAgICAgMjAsICAgIDE1MCwgICAtMjM0LCAgICAtNTgsICAgLTE4MywgICAgIDEwLAorICAgICAgIDE1NiwgICAgNDgyLCAgIC0yMzIsICAgIDEyNCwgICAgMTE1LCAgICAxODAsICAgLTYxNSwgICAtMzk1LAorICAgICAgIDMzMCwgICAgLTg1LCAgIC00MzUsICAgMzI3OSwgICAxNDkzLCAgICA2ODYsICAgMTE1NywgICAgMjQ1LAorICAgICAtMTA2NywgIC0xOTUzLCAgICAgMjMsICAgIDc5NiwgICAtNTQwLCAgICAxNzUsICAgICA1NiwgIC0xOTMxLAorICAgICAgICA4OSwgICAgNzA1LCAgIC0zNDIsICAgIDU1MSwgIC0xOTk5LCAgIDE5NTEsICAtMjMwNSwgICAtNDk3LAorICAgICAgLTI2NiwgICAgMjc1LCAgLTE1MDMsICAgIDM1MSwgICAtMzU1LCAgIC0zNTMsICAgIDIzNiwgICAtMzU4LAorICAgICAgLTI3MSwgICAgLTQwLCAgICAxMzYsICAgIDIxNywgICAgLTEzLCAgICAtNDUsICAtMjA5MSwgICAxMTQxLAorICAgICAgIDczMCwgIC0xODg4LCAgIDExMzEsICAgIDY2MCwgICAxMjcxLCAgICA0MzksICAgMjU5NywgICAgIDkyLAorICAgICAgIDMxOSwgICAgLTkxLCAgICAgNjIsICAgIDMxNiwgICAgMjg3LCAgIC0yNjAsICAgIDEyMSwgICAgLTMzLAorICAgICAgLTExNywgICAgLTIyLCAgICAtNzksICAgLTE3MCwgICAtMTY0LCAgIDE0ODYsICAgIDEzNCwgICAgLTYyLAorICAgICAgIC0zNiwgIC0zMzY3LCAgIC0yMzUsICAgMTIyMSwgICAxMjM5LCAgICAgNzgsICAgIC01NCwgICAtNDg5LAorICAgICAgIDI2OCwgICAtNTYwLCAgIC03NzQsICAgIDg1MSwgICAtOTczLCAgICAtNjIsICAgLTE3NCwgICAtMTM4LAorICAgICAgLTQ1OSwgICAgMzkwLCAgICAtMjIsICAgIC00MiwgICAgIDgzLCAgIDEzMzksICAgMTMwNywgICAgNDYyLAorICAgICAtMzc2OCwgICAgNTExLCAgICAzMDAsICAgLTUyNSwgICAtNzg3LCAgICAtODksICAgIDY3NSwgIC0yMDc0LAorICAgICAgICAzNywgICAgLTQ4LCAgICAyNTIsICAgIDU5OCwgICAtMzMyLCAgICAgNjcsICAgLTE4NywgICAgICAyLAorICAgICAgLTEwNiwgICAgLTM1LCAgIC0xNDgsICAgLTE4NiwgICAtNTQyLCAgICA3OTksICAgMjM2MywgICAtMTU1LAorICAgICAgLTY2NSwgIC0yODY3LCAgIC0yMDksICAgLTIwMCwgICAgLTgwLCAgIDE2ODIsICAgMTA4MiwgICAgICAyLAorICAgICAgIDUxNiwgICAtNDgxLCAgICAyNzYsICAgICAtMSwgICAtMjIwLCAgICAgNTQsICAgIC0xMiwgICAgMjU5LAorICAgICAgIDE2MSwgICAtMTQ4LCAgICA1NjYsICAtMTQ4OSwgICAtNzMxLCAgIDEyNjIsICAgIDQ5OSwgICAtODE2LAorICAgICAgIDExNSwgICA0MDU3LCAgICAtNzEsICAgIDcwMSwgICAgIDM5LCAgIC0xMzIsICAgLTIyMywgICAgLTE2LAorICAgICAgIDIyOSwgICAgIC0yLCAgICAtNDAsICAgIC02MSwgICAgMjM0LCAgICA0MDUsICAgIDEwOCwgICAgMzA0LAorICAgICAgIC02MiwgICAtMzk2LCAgIDEzNjksICAtMTQzOCwgIC0yMDQ1LCAgIDE5NTQsICAgIDc1OSwgICAgOTY5LAorICAgICAgLTE2NiwgICAtMjM1LCAgIC0xMTUsICAgIC02OCwgICAxOTIzLCAgIDE4MTUsICAgLTc3NiwgICAtODU1LAorICAgICAgICAzNCwgICAgLTYzLCAgICAgMTcsICAgICA4NywgICAgMjIzLCAgIC0xNDUsICAgLTEzMCwgICAgLTE2LAorICAgICAgLTMxMywgIC0xNzA0LCAgIC00NTgsICAgLTMzMiwgICAgNDIwLCAgIDEzMzIsICAgIDY3NiwgICAgODc4LAorICAgICAtMzg0NywgICAtMzYwLCAgICA0MjcsICAgIDUzNywgICAgNjUxLCAgIC0xNjcsICAgLTQ1MSwgICAtMTk3LAorICAgICAgIDI3NywgICAgMTM2LCAgIC0yMDEsICAgIDUxNywgICAgIDEwLCAgIC0xNTYsICAgICAzNSwgICAtOTI3LAorICAgICAgMTI1MCwgICAtMTczLCAgIDEwMDQsICAgLTE2OSwgICAgMzIyLCAgIC0xNDAsICAgLTU1OSwgIC00NjU2LAorICAgICAgLTM0MywgICAtMjY0LCAgICAtNjEsICAgIC0xMiwgICAgMTk1LCAgICAtMTAsICAgLTEyMywgICAgLTIzLAorICAgICAgIC0yMCwgICAgIC02LCAgIC0zNjcsICAgLTEwMiwgICAtMjE1LCAgICAgNDEsICAgIDgzOCwgICAxNTEzLAorICAgICAgIDU1MiwgIC0xNjA5LCAgIC03NTMsICAgLTc2MywgICAtNjU2LCAgIC02MzMsICAgICAxNCwgICAgIDM1LAorICAgICAgIDE0MSwgICAgMTE3LCAgIC0xMjEsICAgIDg1NywgIC0xNDk0LCAgICA1NzgsICAgMjU0NiwgICAxMDM0LAorICAgICAgLTY3NiwgICAgNTcxLCAgICA4MTcsICAgLTIxOCwgICAtMTExLCAgIDE0MjQsICAgIC01MSwgICAgODc4LAorICAgICAtMjg2MCwgICAtMjU3LCAgICAxMDQsICAgLTUyNiwgICAgNzgyLCAgICA3MDgsICAgMjM1MCwgICAtNTAwLAorICAgICAgLTM0MiwgICAgMjE5LCAgIC00MDYsICAgIDgzNiwgICAtMTE3LCAgICAyODgsICAgLTQxNSwgICAgNzk4LAorICAgICAgICAxNCwgICAtMzExLCAgIC00NTUsICAgICAgMywgICAtNDEwLCAgIC0xNDQsICAgIC0zMCwgICAtOTc3LAorICAgICAgLTE0NSwgIC0yNDY2LCAgIC05NTcsICAgMTM3MCwgIC0zMjAxLCAgIC0zMjcsICAgIC04NSwgICAgMTQ5LAorICAgICAgLTU4MCwgICAgMTk4LCAgICAzNTAsICAgIDE0MCwgICAtMTA0LCAgICAzMjcsICAgLTEyOCwgICAtMTc4LAorICAgICAgICA1OCwgICAgMjk0LCAgICAgNTAsICAgMTgxNCwgICAgNTgxLCAgIC05MDksICAgIDI4NywgICAtMjY3LAorICAgICAtMzk5MiwgICAgIDYxLCAgIC04NjAsICAgIDI1OCwgICAtMjcxLCAgIC0yMjMsICAgIDIzNywgICAtMjkxLAorICAgICAgICAtMywgICAgIDY2LCAgICAxMTAsICAgLTYyMCwgICAgMzE5LCAgICAtNjIsICAgIDE3NywgICAgMzY0LAorICAgICAgIDExMCwgICAtMTYzLCAgIC05MjEsICAgLTg2MywgICAgMjUxLCAgIDQ5MjIsICAgIDI4MCwgICAgMTIxLAorICAgICAgIDEyOCwgICAgMjA5LCAgIC0xMjYsICAgIDU3OCwgICAgLTU2LCAgICAgNDEsICAgIDEyNCwgICAgMzUwLAorICAgICAgIDI0NSwgICAtNDY1LCAgICAtNjcsICAgICAgNSwgICAgNjUxLCAgICAxNDcsICAgIDIwMCwgICAgICAwLAorICAgICAgICAyMSwgICAtNjA5LCAgIC0zMzIsICAgICAtMywgICAgMjQ3LCAgIC00MTIsICAgIDEyOCwgICAgIDQyLAorICAgICAtMTQwNSwgICAtMzAxLCAgIC0zNDEsICAgLTQ4NCwgICAtNDkxLCAgICAtNTUsICAgIDM2MSwgICAtMTAwLAorICAgICAgIC0zMCwgICAtNDA1LCAgICA2NDMsICAgNDI0OSwgICAgLTMxLCAgICAtOTEsICAgIC0xMCwgICAgICA2LAorICAgICAgIDQyNSwgICAtMzUwLCAgLTE1MDEsICAgIDgxNywgIC0xMzQ4LCAgIC0yMDEsICAgLTM0NSwgIC0zNjQzLAorICAgICAgIDIzNSwgICAgNjkxLCAgICAzMzIsICAgIDIxOSwgICAgMTk5LCAgIC0zOTgsICAgIDEzMCwgICAgLTUwLAorICAgICAgLTE5MCwgICAgIDg5LCAgICAtMjMsICAgIDEwMCwgICAxMzI3LCAgIC0yMDAsICAgIDE0NiwgICAgNDgyLAorICAgICAgLTYyNCwgICAtNDc5LCAgIC0zOTEsICAgIDE4OCwgICAgMTI5LCAgICA2MTQsICAgLTMzNSwgICAtNTY0LAorICAgICAgMTAyMSwgICAtMTA3LCAgIC0xOTksICAgIDE0NSwgICAgMjAxLCAgICA1NzEsICAgMTI3NiwgICA0MjUzLAorICAgICAgICA1OCwgICAgMTIxLCAgICAyOTUsICAgICAzOCwgICAgIDI2LCAgICAgNDcsICAtMTMzMywgICAxMTM4LAorICAgICAgMzEyNSwgICAgMzU3LCAgICAtNzIsICAgIDM0NywgICAgMjc2LCAgIC0yNzIsICAgIDEyMCwgICAgLTc3LAorICAgICAgIDUzNSwgICAgMjQ3LCAgICAtNzEsICAtMjA1NCwgIC0xODYwLCAgICAtNzMsICAgIC02MiwgICAgMjY2LAorICAgICAgIC0zMCwgICAgMTgzLCAgICAgMTcsICAgIC00NiwgICAgIC03LCAgIC0xNDAsICAgIDk5NywgICAgNTI2LAorICAgICAgIC00NywgICAgLTU5LCAgIDE1NDAsICAgIDM3MywgICAgMTYyLCAgIC0xNTAsICAgLTEwNywgICAgLTc0LAorICAgICAgLTI3OCwgICAgLTM3LCAgIDQyNjgsICAgIC0yMSwgICAtMjY5LCAgICAzNTksICAgIDExMSwgICAtMTE1LAorICAgICAgICAtNSwgICAtMjA2LCAgICAtODcsICAgIC00NCwgICAtNTE3LCAgICAgNTQsICAtMjg1OSwgICAgMTg5LAorICAgICAgLTI5NywgICAtODYzLCAgIC05MTgsICAgLTkyOSwgICAtNTQzLCAgICAgMjUsICAtMjg2NiwgICAgLTc5LAorICAgICAtMTEwMSwgICAtMjc1LCAgIC00MTAsICAgLTQ1OCwgICAgLTc1LCAgIC0yMTEsICAgLTQyMCwgICAgIDk2LAorICAgICAgIDQ2NywgICAgLTY2LCAgICAtMTUsICAgLTU4MCwgICAtNDIwLCAgIC01ODYsICAgICAtNywgICAgMTA5LAorICAgICAgIDIzNiwgICAgMjI3LCAgIC00ODgsICAgIDEwNiwgICAgMjU4LCAgICAgNzYsICAgICA3OCwgICAgIC04LAorICAgICAgLTE5OSwgIC00ODg4LCAgIC0xMzQsICAgLTIwNSwgICAgLTMzLCAgIC0yNDMsICAgIC0xOSwgICAgLTEwLAorICAgICAgIDE1NywgICAgMTI5LCAgICAxMjAsICAgLTkyOCwgICAgNjA0LCAgIC0zNDUsICAgIC00NywgICAtNDMwLAorICAgICAgLTI1NywgICAgMjczLCAgICAgODEsICAgMTk0OSwgICAgNDkwLCAgICAyNzIsICAgLTIwNSwgICAyNDYwLAorICAgICAgIC01NCwgICAgMTAzLCAgLTI5MjQsICAgLTUyOSwgICAtMjExLCAgICAtNjAsICAgIDI3OSwgICAgMjIwLAorICAgICAgIC01NywgICAgMzQyLCAgICAyMDksICAgIDk4NCwgIC0xNDEwLCAgLTMzNjMsICAtMTAyOCwgIC0xMzAxLAorICAgICAtMTI5MywgICAgMjI3LCAgIDExNDIsICAtMTA2OCwgICAtNTEyLCAgICA3NTgsICAgIDM2NCwgICAgIDQ2LAorICAgICAgLTM1OCwgICAgIDE2LCAgICAyNTcsICAgLTE1OCwgICAtMjUzLCAgIC0xODIsICAgICAtMiwgICAgMTgxLAorICAgICAgMTQ3NSwgICAxNTc0LCAgICAyMTUsICAgLTk2OCwgICAgMjQ2LCAgICAzNjksICAgLTI3MywgICAtNzE3LAorICAgICAgIDU0NiwgICAgIDc0LCAgLTM4NzIsICAgIDI5MywgICAgIDk4LCAgICAxMzAsICAgLTI0NCwgICAgIDQxLAorICAgICAgIDE0MywgICAgNjk5LCAgICAtNTYsICAgLTEyNiwgICAgIDY3LCAgICAgNTQsICAgICAtMiwgICAtODc4LAorICAgICAgMjMzNCwgICAgODgzLCAgICAyMTUsICAtMTk3OSwgICAgMjQ2LCAgIC03NTksICAgIDQ5OSwgICAgMjQ4LAorICAgICAgIDc1MSwgICAtMjAyLCAgICA1ODAsICAtMzAxOCwgICAgMzU5LCAgIC0xMzksICAgIDIxMCwgICAgLTQ3LAorICAgICAgLTE2OCwgICAgIDg5LCAgIC02NTksICAgIDI1OSwgICAgLTU0LCAgICAtNDAsICAgLTQ5MCwgICAtMTY5LAorICAgICAgLTc2OSwgICAgNTY5LCAgIC0xNzEsICAgICA2NCwgICAtODQ1LCAgICA1MTksICAgMTI1MSwgICAgLTcxLAorICAgICAgLTQ1OSwgIC00NDM2LCAgICAyNTcsICAgLTMzNCwgICAtODI2LCAgIC0xODMsICAgIDExNSwgICAtNDA4LAorICAgICAgIC03NywgICAgNTQ0LCAgICAxNzMsICAgLTI1OCwgICAgIDQ4LCAgICAzMzEsICAgMTczNSwgICAxMDM1LAorICAgICAgMjc5MywgICAxMTU0LCAgLTE5MDEsICAgIDI3NSwgICAtMTA5LCAgLTExODUsICAgLTQwMywgICAxMzMyLAorICAgICAgLTI4MiwgICAgIDM2LCAgIC0zNjcsICAgICAyMSwgICAgIDI3LCAgICAzNjIsICAgLTQyNSwgICAgMjE3LAorICAgICAgIDE1MCwgICAtMzA0LCAgICAxOTIsICAgICA1MywgIC0xMTAwLCAgICAgMjcsICAgIDYyOCwgICAgNjk4LAorICAgICAgLTYzNCwgICAgLTI1LCAgICAgODQsICAgICAgOCwgICAtMTAzLCAgICA1MzMsICAgLTMwMSwgICAgMjE4LAorICAgICAgNDM1MCwgICAgMTE5LCAgIC0xMDksICAgIDMwOSwgICAgIDI0LCAgIC0zNTIsICAgLTE0NywgICAtMjc0LAorICAgICAgIDE1NiwgICAgIDg1LCAgICAgIDksICAgMTcwNiwgICAtODU0LCAgIDIwMTIsICAtMTU3MywgICAgMTEyLAorICAgICAgLTY3MywgIC0xNTM4LCAgICAtOTEsICAgIDQxNSwgIC0xNTI1LCAgICA4NjYsICAgMTQ5MywgICAtNjIxLAorICAgICAgLTM5NiwgICAgMjc3LCAgIC02MDQsICAgLTM2MywgICAgMTE0LCAgIC0zNjAsICAgLTI1MiwgICAgLTE4LAorICAgICAgIC0zMSwgICAgLTc3LCAgIC01OTEsICAgMjQ4MywgICAgNTM1LCAgLTE1MjAsICAtMTA1NywgIC0yMTg5LAorICAgICAgIC01MSwgICAgNzk4LCAgICAyNzYsICAtMTQyNiwgICAgIDcyLCAgIC0zMDMsICAgIDQwMiwgICAgMTExLAorICAgICAgIDMyNywgICAgMjcyLCAgICAgLTgsICAgLTIxNiwgICAgMTg5LCAgIDEyODIsICAgIDE1MiwgICAgLTQ1LAorICAgICAgIC0zMywgICAxNTI0LCAgIDIzMDEsICAgLTM0MSwgICAxOTkyLCAgICA5MzksICAgMTY3OCwgICAxMDExLAorICAgICAgIDExNCwgICAgMTY3LCAgICA1ODYsICAgLTUwMCwgICAgIDQwLCAgIC00NzMsICAgLTI3NCwgICAgNTk2LAorICAgICAgMTIzNywgICAtMTI2LCAgICAyMDUsICAgIDI1NCwgICAtMjg0LCAgIC0zNjcsICAgLTExOSwgICAgIDY0LAorICAgICAgMTkxNSwgICAgNDM3LCAgIC01ODUsICAgICAgMSwgICAgNDAyLCAgIC0yNzEsICAgLTk4NCwgICAgNTMwLAorICAgICAgIDI2NywgICAzNjM0LCAgICA0OTUsICAgLTIxOSwgICAtNzI4LCAgICAtNjcsICAtMTM0MCwgICAgOTgzLAorICAgICAgIDEyMiwgICAgICA2LCAgICAxMTAsICAgLTE2NiwgICAgMTExLCAgICAxMDIsICAgLTEzOSwgIC0yNDk5LAorICAgICAgIDc1MywgICAxMDExLCAgIDE3NTUsICAtMTI1MiwgICAgODcyLCAgIC01MTAsICAtMTg0NCwgICAxMzg4LAorICAgICAgLTc4MiwgICAgMjg3LCAgICA0NjEsICAgICAzNiwgICAgIDc3LCAgICA0MzcsICAgLTM2MSwgICAtMjE2LAorICAgICAgLTQxNSwgICAgMTU4LCAgICAtNzcsICAgLTEyMywgICAgIDU3LCAgICAtOTMsICAgMzQwOCwgICAgNTA0LAorICAgICAgLTk0MiwgICAgNDM0LCAgIC02NDgsICAgLTI1MSwgICAtNDIwLCAgIC0zODcsICAgMTM3MywgICAtMjI5LAorICAgICAgIDIzNiwgICAtMTkxLCAgICAgIDMsICAgIDIwNCwgICAgNjEyLCAgICAzOTMsICAgLTI4NSwgICAgNTYwLAorICAgICAgLTE2NCwgICAtMTk5LCAgICAzMDMsICAgIDE0NiwgICAgIDkzLCAgIDEyNDgsICAgMjQyNSwgICAxMDAxLAorICAgICAgMTI2MSwgICAtMjM5LCAgIDEwODUsICAtMTg3OCwgICAtMzc1LCAgIC01NDQsICAgLTk5NSwgICAtMTkyLAorICAgICAgLTMxOSwgICAgNTQyLCAgICAyODAsICAgLTcxNiwgIC0xMzIzLCAgICAtNjcsICAgIC0zNCwgICAgMjUyLAorICAgICAgIC0zNiwgICAgMjA2LCAgIC0xMjYsICAgIC0yOCwgICAgIDI2LCAgLTExMzUsICAgMjc5OSwgICAgNTI3LAorICAgICAgIC00NywgIC0yMDA4LCAgICA1MDksICAgLTIzMiwgICAtOTUzLCAgICAzMzIsICAgLTM4NiwgICAtMTA4LAorICAgICAgIDI5MCwgICAgNTA3LCAgICA1NzgsICAgLTgwOSwgICAgMzc1LCAgICA4NTAsICAtMTQxMywgICAgODMxLAorICAgICAgLTEzNywgICAgMjU5LCAgICAgMjUsICAtMTA3NSwgICAgNDA3LCAgIDE3ODQsICAtMTUzOSwgICAxNjU4LAorICAgICAgMTQ1MCwgICAtOTY5LCAgICA0NjcsICAgICAgNCwgICAgNzg1LCAgIC01OTUsICAgIDkxMiwgICAgIDM0LAorICAgICAgICA5MSwgICAgMjg2LCAgIDEwMzUsICAgLTUyNCwgICAgMjc2LCAgIC0zMjIsICAgICAxMSwgICAgNjUxLAorICAgICAgIDczMywgICAgMjQzLCAgICAgNDUsICAgLTE0NSwgICAgMzU3LCAgICA1MjQsICAgLTY5NywgICAtMjU5LAorICAgICAgLTc1NywgIC0xMDU3LCAgICAxODEsICAgMTMyNCwgICAgMTQ4LCAgIC01MDIsICAgIC02NCwgICAtMzc5LAorICAgICAgLTc0NiwgICAxMzg1LCAgICAzOTUsICAgIDE4NCwgICAtNzQ5LCAgIC0xOTcsICAtMzM3NSwgICAtNTQ2LAorICAgICAgICAtNCwgICAgNTMyLCAgIC0yNzAsICAgIDY4NywgICAgNTAxLCAgICAyODUsICAgIDQwMSwgICAgNDMxLAorICAgICAtMTg4OCwgICAtNjM5LCAgICA2NTUsICAgLTMyNSwgICAxODk2LCAgLTE4ODMsICAgICA1MywgIC0xMDE4LAorICAgICAtMTQ3NSwgICAgODAyLCAgIC00ODYsICAgIC02OCwgICAgMjMyLCAgIDEzMzcsICAgIDQyOCwgICAgMjMyLAorICAgICAgMTc1NCwgIC0xNjg3LCAgIC01MTgsICAgLTM3MiwgICAgNTA4LCAgLTEyNjksICAgIDMyNywgICAtOTAwLAorICAgICAgLTQ2OCwgICAxMTI3LCAgIDEzOTcsICAgMTU5NywgICAgODM3LCAgICA2NTksICAgLTYxNywgICAgIDk5LAorICAgICAgIDI2NCwgICAtNDYwLCAgICAyOTYsICAgICA0NCwgICAtMjk1LCAgIC0yMDksICAgLTE3NCwgICAxMTA1LAorICAgICAgIDg5NiwgICAxMDY1LCAgIC0xNzQsICAgICAgNSwgICAgODQ1LCAgIDEzMTEsICAgMTM3MCwgIC0yNTQ4LAorICAgICAgIDM1MSwgICAtNjYwLCAgICAtMjQsICAtMTA4OSwgICAtNzg3LCAgLTEzMTIsICAgIC0yMiwgICAtNTg1LAorICAgICAgLTE5NywgICAgNzQ5LCAgICAyOTMsICAgLTExMiwgICAtMTY5LCAgICAtMjMsICAgICAgMywgICAxMTUxLAorICAgICAgIDUyOSwgICAxMTczLCAgICAyMjQsICAtMTUxNywgICAgOTMwLCAgICAtNTIsICAgIDI2OCwgIC0xMjgyLAorICAgICAgLTU1OSwgICAgNDY2LCAgIC01MjgsICAgMTUwNiwgICAtMjMxLCAgIC0zMzcsICAgIDk5MywgIC0xMzE0LAorICAgICAgLTI1MCwgIC0zMDQyLCAgICAgNTcsICAgICAxOSwgICAgIDE1LCAgIDE4MTIsICAgIDY5NywgICAtMzg5LAorICAgICAgLTIwMSwgICAgNjQ3LCAgIC03MjMsICAtMTA5OCwgICAtMTc3LCAgIC0yMjUsICAtMjY5NCwgICAtNDk1LAorICAgICAgLTQzMSwgICAtMjM4LCAgICAzODgsICAtMTczMSwgICAgOTk3LCAgICAyMjcsICAgLTc2NSwgICAtMjIyLAorICAgICAgICA5NCwgICAtNjExLCAgICAgMzUsICAgIDE4NywgICAtOTM1LCAgLTE0NzAsICAgMTAxMywgICAxMDUxLAorICAgICAgLTM3OCwgICAgMzExLCAgIC03MTAsICAgLTU2NiwgICAtNTMyLCAgIC0zNjksICAtMTU5OSwgICAgNTUzLAorICAgICAgIDE2NywgICAgNDUwLCAgLTEwNjgsICAgMjgzNCwgICAtMTI1LCAgICA2MDEsICAgLTExMywgICAtNTAzLAorICAgICAgICA0MCwgICAgIDE0LCAgICAtMzYsICAgLTIyMCwgIC0xNTQzLCAgICA4NjcsICAgLTYxMiwgIC0xODM0LAorICAgICAgIDg4OCwgIC0xNzkxLCAgIDEyOTYsICAgLTIyOSwgICAtNTkzLCAgIC03NjAsICAgLTE5NywgICAgNDI4LAorICAgICAtMTI5MCwgICAgODkyLCAgICAtNjIsICAgMTExMywgIC0xMjI4LCAgIC05NjUsICAgIC05MCwgICAtMzAwLAorICAgICAgIDI4OCwgICAtMTMzLCAgICA3NzksICAtMTIxMSwgICAtNjI3LCAgICAyNjgsICAgIDE4MCwgICAgOTEzLAorICAgICAgMjIzMCwgICAtNDEzLCAgIC0xNDYsICAgLTIxNywgICAgMTcwLCAgLTExNTcsICAtMTU1MSwgICAgODc3LAorICAgICAgICA3NSwgICAxNzg0LCAgIC0xNzQsICAgLTIzMCwgICAtNzU3LCAgIDEyNDMsICAgIDYyNSwgICAgLTQ5LAorICAgICAgIDExNCwgICAtMjE4LCAgIC00MDksICAgIDE5NSwgIC0xMTY1LCAgIDE0OTIsICAgIDIxMywgICAxMTAwLAorICAgICAgLTEwMSwgICAtOTU3LCAgIDEwMTYsICAgIDY2MywgICAtNzA0LCAgICA4MTcsICAgICA5NCwgICAtMjc5LAorICAgICAgLTI1NiwgICAgNDY5LCAgICAtNzUsICAgLTEyMywgIC0yOTU0LCAgICA5NDgsICAgLTQwNywgICAgMjc1LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2I0NDMyczFbXSA9IHsKKyAgICAgIDU0MTYsICAgLTIyMywgICAtMTIzLCAgICAxNTYsICAgIC0zMywgICAgMTg1LCAgIC0xNDQsICAgLTEwOCwKKyAgICAgIC0xOTksICAgIC02OCwgICAgLTM2LCAgICAgMTEsICAgICAzNywgICAgMTI0LCAgIC0zMDEsICAgICA1OCwKKyAgICAgICAtMjEsICAgIDE1NSwgICAgIDk5LCAgICAtMTAsICAgIC03OCwgICAgLTI2LCAgICAtNzAsICAtMzE2MCwKKyAgICAgLTEwMzcsICAgICA5OCwgICAgMTU1LCAgIC0zNzMsICAgIDgzNCwgICAgNjUyLCAgIC0yNzcsICAgLTQyOSwKKyAgICAgIC01MjksICAgLTEwMywgICAtMzU4LCAgICAxODcsICAgMTE2MSwgICAtMTU3LCAgICAxNDcsICAgLTQwMCwKKyAgICAgICA0NjEsICAgIDE1NiwgICAgMjM3LCAgICA0ODEsICAgIC02NywgICAgIDk5LCAgICA5MzksICAgMTE3OSwKKyAgICAgIC02NTksICAgMTMzNywgICAgNTc4LCAgIC00ODksICAgLTQ4MSwgICAtNDI3LCAgIC02MjIsICAgIDEzMSwKKyAgICAgIDE4MjYsICAgLTczNCwgICAtOTk1LCAgICAgLTUsICAgLTQ2MSwgICAgNTE0LCAgICAtODMsICAgLTI3MSwKKyAgICAgLTI5MjgsICAgIC04NiwgICAtMzgyLCAgIC0yMDUsICAgLTEzMywgICAtMzg2LCAgIC0xOTUsICAgIC02NywKKyAgICAgICA1MDgsICAgIDU4NiwgICAgNjA3LCAgIC05MTAsICAgLTE4MSwgIC0yMDQ2LCAgIDEyMTIsICAgLTE3OSwKKyAgICAgICAgMjMsICAgIDQwOCwgIC0xOTI5LCAgIDIwNDQsICAgMjE2MCwgICAtODc5LCAgICAgNzQsICAgIDE3OSwKKyAgICAgICAgNzIsICAgLTE2NCwgICAgIDQ3LCAgICAxNjIsICAgMTQ5NywgICAgODI2LCAgIDI5NzgsICAgLTkxMiwKKyAgICAgICA0NTQsICAgLTYxOCwgIC0xOTA3LCAgIC01MDEsICAgLTQ5NCwgICAtMjk5LCAgICAgOTYsICAgLTEzOCwKKyAgICAgIC0xMTQsICAgIC01MSwgICAtMTcxLCAgICA0NDUsICAgMTE0NCwgICAtMTg3LCAgICAyMTcsICAgIDIyNCwKKyAgICAgICA0MDIsICAgICAxMywgICAgIDQyLCAgICAtNTgsICAtMTY5MiwgICA0MTYyLCAgIDEyNzIsICAgIDk3MCwKKyAgICAgIC0yNzgsICAgIDMyNywgICAgIDg4LCAgICAtMzEsICAgLTE4MiwgICAgMjc5LCAgIC02MTAsICAgICA3OCwKKyAgICAgIC00MzIsICAgLTE0NywgICAtMTQyLCAgIC03MjUsICAgIC0xNywgICAgLTk1LCAgICAzODgsICAgIDEzMywKKyAgICAgICAtNjEsICAgICAyOCwgIC0xMzY1LCAgIDE0NDEsICAgIDYwNiwgICAgNDExLCAgICA5MjMsICAgLTMzMiwKKyAgICAgIDE4NDMsICAgMTkzNCwgIC0xNDUxLCAgIC01MTQsICAgLTI4MywgICAgNzY4LCAgICA5NDAsICAgLTQyOCwKKyAgICAgICAgMzEsICAgMTEwNSwgICAgMjQ4LCAgICAtNzgsICAtMTQ3NywgICAtMzY3LCAgICA0MDQsICAgICA2OCwKKyAgICAgIC0xNzgsICAgICAxNywgICAgNjkxLCAgIC0yNjUsICAgLTEwNSwgICAxNjgxLCAgIC00NzYsICAtMTMwNywKKyAgICAgLTM0MzQsICAtMTcwMCwgICAtNTI0LCAgIC04NzEsICAgIDQ3MiwgICAtMTcxLCAgICAyMzcsICAgIDEwNCwKKyAgICAgIC0xNDIsICAgLTIzMSwgICAtMjkyLCAgIC0yODUsICAgIDI2NiwgICAtMjU5LCAgIC0xNjYsICAgIC05NywKKyAgICAgIC00MzIsICAgNDAwMywgICAxMjIwLCAgIC0zNTYsICAgMjExMCwgICAtMjIwLCAgIC00NjUsICAgIC00OCwKKyAgICAgICAxMTcsICAgLTE3OCwgICAgMjkwLCAgICAtMjEsICAgIDIwNSwgICAgLTE5LCAgICAzMjEsICAgLTM0MywKKyAgICAgIC0zMjgsICAgIC01NywgICAgMjE1LCAgIC0zNDUsICAgIDMwNCwgICAgICAyLCAgICAgMTAsICAtMjA3MSwKKyAgICAgICAxODUsICAgIDQzMywgICAgMjEyLCAgLTExNjUsICAgIDExMiwgICAgMjQyLCAgIC0yOTQsICAgLTE2MiwKKyAgICAgIDExMDcsICAgMTE3NiwgICAtMzk2LCAgIDE0MDAsICAtMjYwMCwgICAtNDM0LCAgIC02NDAsICAgIDQ1NywKKyAgICAgICAxMDAsICAgLTI2OCwgICAgODA5LCAgICAxMjgsICAgLTIzNiwgICAgLTY2LCAgICAtOTQsICAgLTg0MiwKKyAgICAgICAgODIsICAgIDE2MywgICAgMjI3LCAgLTI2NDEsICAgLTQ4NSwgICAgMjkxLCAgIC0zMjYsICAgICA0MiwKKyAgICAgICAyMzQsICAgLTY0OCwgICAxMzU1LCAgIDMwMTYsICAtMTQwMywgICAgLTcxLCAgICAxODgsICAgIDc5MiwKKyAgICAgICAgMTUsICAgIC0xNiwgICAtNTIyLCAgICAtNzUsICAgIDEwNiwgICAtODI0LCAgIDExMzMsICAgIDk0NywKKyAgICAgICA0NzcsICAgLTY0MiwgICAtNTMxLCAgIC04MDgsICAgNDEwMCwgICAgLTM0LCAgIC00MDcsICAgIDEzMywKKyAgICAgICAgMzMsICAgICAxNSwgICAgIDYzLCAgICAgNzIsICAgLTIyMywgICAgLTE1LCAgIC00OTEsICAgICAzOCwKKyAgICAgICAgNDcsICAgIDI1OCwgICAtMjM2LCAgICAxOTIsICAgMTYyOCwgICAgMTczLCAgLTIxMTYsICAgIDY4NywKKyAgICAgICAyOTUsICAgIC03NCwgICAtMTgzLCAgICAgOTUsICAgIDUyOSwgICAgMTQ5LCAgIC0zNzIsICAgIDE4MiwKKyAgICAgIDEzMTcsICAgICAyMSwgIC0xNDI0LCAgLTMxNTYsICAgLTExMSwgICAgLTk2LCAgICA1ODAsICAgIDI4NCwKKyAgICAgIC0yNzQsICAgICA0MSwgICAgMTQ1LCAgIDEzMTQsICAgICA3OSwgICAxODMwLCAgICAyNjIsICAgLTMyNSwKKyAgICAgICAtMTYsICAgIDE2OSwgICAtMjQ1LCAgLTIwMzgsICAgMTk1OSwgICAgODkyLCAgICA5NDYsICAgIDMwMywKKyAgICAgIC0xNzEsICAgLTQzMiwgICAgODgzLCAgICAgMzQsICAgLTIzOCwgICAyNDYzLCAgIC0yOTQsICAgICAyNSwKKyAgICAgICAgMjQsICAgLTEwNiwgICAgLTQ1LCAgICA1MDksICAgLTE1NCwgICAgNDk2LCAgICAxMDksICAgIDExNSwKKyAgICAgICAxNjksICAgIDcwMiwgICAgMzk2LCAgICAtOTcsICAgIDY1NywgICAtMjUxLCAgIC0xMTIsICAgLTExNCwKKyAgICAgIC0xNDQsICAgLTIzMCwgICAgNTE3LCAgIC0xOTAsICAgNDg4NSwgICAgLTQ1LCAgIC0xNTIsICAgICAtOSwKKyAgICAgIC0xNzAsICAtMjAyMSwgICAgNTQxLCAgIC05MDUsICAtMjAxNSwgICAyNTg4LCAgIC05MzYsICAgIC0yMCwKKyAgICAgIC0zMDAsICAgIDM4NCwgICAgNDMzLCAgIC0xMjMsICAgIDExOSwgICAtNTA1LCAgIC0xMjYsICAgIDI5NSwKKyAgICAgICA1MjYsICAtMTM1MiwgICAgNDUwLCAgICAxNDIsICAgLTEyNiwgICAtMTE1LCAgICAgIDEsICAgLTE0MCwKKyAgICAgIC03MzQsICAgIDY3MiwgICAtMTQ3LCAgIC02NjAsICAgLTc0NywgICAgNjUyLCAgICAxNjEsICAgLTE2MywKKyAgICAgICAgNTEsICAgLTYxNiwgIC0xOTc0LCAgIDE0MTMsICAtMzE0NSwgICAgOTIyLCAgLTEyODksICAgIDIxNSwKKyAgICAgICAxODIsICAgLTgzOCwgICAtMTcxLCAgICAxMDcsICAgLTMzMywgICAgIDM0LCAgICAyMTYsICAgLTMwNywKKyAgICAgIC0zNTksICAgIDQ5NiwgICAtMzQzLCAgIC0zMjUsICAtMjU1MiwgIC0xNTczLCAgICA1ODgsICAgLTQ0MSwKKyAgICAgIDEyOTYsICAtMzA3NSwgICAgMTE5LCAgIC0xMzEsICAgICA1NCwgICAgMjA2LCAgICAyNzgsICAgIDEwNiwKKyAgICAgIC0xMDAsICAgIDExMiwgICAgMjIwLCAgICAtNDksICAgIC04MCwgICAtMjI5LCAgIDEwNTEsICAgMzI3MSwKKyAgICAgLTEzMDAsICAgIDMyNCwgICAgLTMxLCAgLTEwMjUsICAgMTY1OSwgICAxNTI2LCAgIC0xNjEsICAgIDY2OSwKKyAgICAgICAtNTYsICAgIDQzMCwgICAgMjAxLCAgIC01MzUsICAgLTEyNiwgICAgIC05LCAgIC0zODAsICAgIDIyMiwKKyAgICAgICAyMTIsICAgLTM0NSwgICAtMjgyLCAgICAxOTUsICAgIC00MSwgIC0xMjM1LCAgIC01OTMsICAgLTU5MywKKyAgICAgIDE1NTcsICAgICA3MSwgICAxMDIzLCAgIC04MzEsICAgIDU0NSwgICAtODc1LCAgICAxNjEsICAgLTc3MiwKKyAgICAgICAgOTksICAgLTE5MCwgICAxNjE2LCAgICAzMzgsICAgLTI1MSwgICAtMjAxLCAgLTMxMDQsICAgLTc3NCwKKyAgICAgICAgIDQsICAgLTEyMSwgICAgMTc4LCAgICAtODAsICAgIDY1MiwgIC0xMDE4LCAgIC00NDEsICAgLTM0MywKKyAgICAgIC0yMzYsICAgLTI0MCwgICAtMjQ0LCAgICAtMjYsICAgMjE5MiwgICAgIDc1LCAgLTEzNDgsICAgMzc3MSwKKyAgICAgICAtMjIsICAgLTg1MCwgICAtMjUxLCAgICAzMTYsICAgIDEzMiwgICAgLTIxLCAgICAgNjMsICAgIDEwNCwKKyAgICAgICAxNTIsICAgIDE4NSwgICAgLTQwLCAgICAyNzUsICAtMTM1NiwgICAgNDgyLCAgIDMwODEsICAgIDU3MSwKKyAgICAgIC00ODEsICAtMTM4NywgICAgODE1LCAgIDEyODUsICAgLTM1MiwgICAgLTk4LCAgICAtNDEsICAgIDU3MywKKyAgICAgIC0zMDcsICAtMTg3OSwgICAgNDI3LCAgICAxOTYsICAgIDE2OSwgICAgLTI2LCAgIC0yMzIsICAgIC05OCwKKyAgICAgIC00MTEsICAgLTIzMSwgIC0yMDM0LCAgIC05NjksICAgIDI3MSwgICAxNDIxLCAgLTE0ODUsICAgLTQwNywKKyAgICAgIDE0MDQsICAgLTM0MywgICAgODYxLCAgICA4ODgsICAgIC0xMSwgICAgMjAyLCAgIC0yNDUsICAgLTM5NywKKyAgICAgICAxMDQsICAgIDIyOSwgICAgMzA5LCAgLTI3NTcsICAgIDMxNSwgICAgNDE2LCAgICAzOTMsICAgIDE5NCwKKyAgICAgIC0xNzYsICAgLTY2MywgICAtMTY2LCAgIC0yMjksICAgIDI0NCwgICAtMTUyLCAgICAxODMsICAgICAyNCwKKyAgICAgIC0yMDUsICAgICA5NywgICAtMjU1LCAgIC0yOTksICAgIDEyMywgICAgLTEyLCAgICAgNTMsICAgIDEwMiwKKyAgICAgIC0zNjIsICAgIDM3MSwgICAgMjIzLCAgICAgNDYsICAgIDEzMiwgIC01MTc3LCAgICAxNTcsICAgIC05MiwKKyAgICAgLTExMTQsICAgIC0yOCwgICAgMTM1LCAgIC04MzEsICAgIDYyNywgICAtNDI4LCAgLTExMTYsICAgIDQyMSwKKyAgICAgICA3NjEsICAgIDQ1OCwgICAzMjU2LCAgIC0xNjcsICAgIDM1NSwgICAyMDQ1LCAgICAxMTMsICAgIDIzNCwKKyAgICAgIC0xNTQsICAgICAyMCwgICAgLTM5LCAgICAgNjEsICAgIC04MSwgICAgIDYzLCAgICAgOTgsICAgLTE3MSwKKyAgICAgIDE3MjcsICAtMTE5MywgICAyMTAzLCAgICA0MTYsICAgLTQyMSwgICAtNTc1LCAgIC02MzYsICAgLTExNCwKKyAgICAgICA3MDAsICAgLTI2MCwgICAxNjEwLCAgIC0zMzYsICAgIDUyMSwgICAyNTkxLCAgIC03MzgsICAgICA0MywKKyAgICAgICAxMDMsICAgIC02MywgICAtMzM1LCAgICAxNjgsICAgIDExMCwgICAgIDQxLCAgIDE5OTUsICAgMzU1NCwKKyAgICAgIDE0NDMsICAgIC01MywgICAtMjA2LCAgICA5OTIsICAgIDc2NywgICAtMzcyLCAgICAxNDEsICAgIC0yNCwKKyAgICAgICAxNzMsICAgICA2MCwgICAtMjM3LCAgICAgNjksICAgLTE3MywgICAgLTczLCAgICAxMzcsICAgIDE2NywKKyAgICAgIC0xNjQsICAgLTE1OSwgICAgMzEyLCAgIC0xNTEsICAgIC03OCwgICAgNjE5LCAgIC0xOTIsICAgIDY4OSwKKyAgICAgICAtNjksICAtMjgwNSwgICAtMjU5LCAgIC0yODgsICAgLTIzMSwgICAgIDI4LCAgLTE2ODIsICAgMjMxNiwKKyAgICAgIDIyOTgsICAgLTMzNiwgICAtMTMxLCAgICAgNTksICAgIDU0MiwgICAtMjE4LCAgIC0yODEsICAgLTIxNCwKKyAgICAgICAtNDEsICAgIDExNiwgICAgMTM4LCAgICAgIDgsICAgLTI5NywgICAgLTQ1LCAgIC0yMTUsICAgLTE2NywKKyAgICAgIDE1ODcsICAtMTA2MSwgIC0xOTc2LCAgIC00NDUsICAgIDQwMSwgIC0yMzkyLCAgICAtNDIsICAgIDU4MSwKKyAgICAgIC01MTksICAgLTIzMCwgICAxNDYxLCAgICA1NDIsICAgIDExMywgICAtNjM0LCAgIDE3NzYsICAgIDMzMiwKKyAgICAgICAxOTEsICAgICAgNSwgICAgMTc0LCAgIDE5MzksICAgIC0yNiwgICAtMjQyLCAgICAxMjAsICAgIDIzMCwKKyAgICAgIC05ODYsICAgMzUwMSwgIC0xMTI1LCAgICAtODksICAgICAgMywgICAtNTgwLCAgIC0yMTksICAgLTI1NSwKKyAgICAgICAgMzcsICAgLTExOSwgICAgIDk0LCAgICAtMTcsICAgLTI5NywgICAtMTc2LCAgIC00MzQsICAgLTIzNCwKKyAgICAgICAgNTUsICAgIC02MywgIC0xMTY3LCAgIC00OTIsICAtMTc1MywgIC0zMzk3LCAgICAxODUsICAgLTc5NCwKKyAgICAgICA2ODksICAgIDgxOSwgICAgLTMyLCAgIC04MzYsICAgIDMzNSwgICAtMTMzLCAgICA3MjQsICAgLTI5OSwKKyAgICAgIC0zMTgsICAgIDQyNCwgICAgNTU4LCAgIC02NTQsICAgIDExOSwgICAtNDQ3LCAgICAxNDAsICAgLTEwMCwKKyAgICAgICAgNzIsICAgLTg3MiwgIC0xNDMyLCAgIC0yMDMsICAgIC00MCwgICAgLTE0LCAgICAtNTksICAgIDU1MCwKKyAgICAgICAgODUsICAgIC01MywgICA1MDA3LCAgICAyNTgsICAgIDQwMSwgICAtMTg0LCAgIC0zMTMsICAgLTE3MCwKKyAgICAgICAgNjYsICAgLTE4NSwgICAgLTgyLCAgICAtNjEsICAgIDIxMCwgICAgIDQ4LCAgIC0yMDQsICAgIC05NiwKKyAgICAgICAxMzAsICAgLTU2MiwgIC0xNzAwLCAgLTEwMzcsICAtMzkyNiwgICAtODg0LCAgIDExMTUsICAgICAtNiwKKyAgICAgIC0xMDAsICAgIDg0MiwgICAtNDUwLCAgICA4NzcsICAgICA3NiwgICAgNTY4LCAgIC02MjMsICAgICAyNywKKyAgICAgICAgNzMsICAgLTE5NSwgICAgMzI4LCAgICAgNDEsICAgIC0yNCwgICAgMTI0LCAgICAtNzcsICAgMTQ5OSwKKyAgICAgICA1NDAsICAtMTA2NCwgICA0NTE3LCAgICAtMjIsICAgIC0zNSwgICAgODM5LCAgICAtNDgsICAgIDI1MywKKyAgICAgIC0yNTksICAgICA5NiwgICAgNDA5LCAgICAgOTAsICAgICAyNiwgICAtMTc3LCAgICAzNjUsICAgIC00OCwKKyAgICAgIC0zMjQsICAgIC0yNiwgICAgLTIzLCAgICAtODMsICAgIC03NywgICAgLTgwLCAgIDE1OTksICAgMTQ4NiwKKyAgICAgICAyNjYsICAgIDY1OSwgICAgMjM2LCAgICAyMzEsICAgIC0xNiwgICAgMzU5LCAgIC0xNjMsICAgIDQ1NSwKKyAgICAgIC05OTksICAtMTE2OSwgICAyNDUzLCAgIC01OTksICAgLTk0NSwgICAgICA0LCAgLTIxMTAsICAgLTE3NCwKKyAgICAgIC03MzYsICAgIDM0NCwgICAgMjMyLCAgICAxNDIsICAgICAzMiwgICAgLTk5LCAgICA3NjMsICAgIDEzMywKKyAgICAgIC0zMjUsICAgIC01NiwgICAxNjM1LCAgIC00MzksICAgIDg0MywgICAgICAyLCAgLTE3MDQsICAgIC0xMywKKyAgICAgICA3NzEsICAgMzY4MCwgICAgLTg5LCAgICAxODIsICAgICAgNCwgICAgIDQyLCAgICAzOTQsICAgIDQwNCwKKyAgICAgICAgODIsICAgIDMxMiwgICAgIDkxLCAgICAxNDEsICAtMTU3NywgICAxNzY1LCAgIDMxNDEsICAgIDYyNSwKKyAgICAgIC0yNzEsICAtMjEyMiwgICAgNDIzLCAgICAzNTMsICAgIDQ4OSwgICAgNjA2LCAgIC0yOTAsICAgLTE5MCwKKyAgICAgICA0ODYsICAgLTEzMSwgICAgMTE4LCAgICAyMzYsICAgIDI0OCwgICAtMjA5LCAgICAgLTIsICAgLTE2MiwKKyAgICAgICAtOTUsICAgICA5NSwgICAgMTcwLCAgICAyNzgsICAtMjIzMywgICAgNTQ5LCAgICAgMzQsICAgLTg0NiwKKyAgICAgIDM1OTUsICAgIDQ0NSwgICAtNDAwLCAgICAtNjUsICAgIDEzMSwgICAgLTE0LCAgICAtMTYsICAgIDYxMSwKKyAgICAgIC0xMTYsICAgMTI5MywgICAgIDk4LCAgIC02ODAsICAgIDE4OSwgICAgMjE3LCAgICAtMTUsICAgLTU0OSwKKyAgICAgICAxMzEsICAgICAgOCwgICAtNzY4LCAgLTEwODIsICAgIDg0MSwgICAtMzQ2LCAgICAxMjksICAgIC0zMywKKyAgICAgIC03NzgsICAgIDMyMiwgIC0yNTA4LCAgLTIxMjgsICAtMTg5NSwgIC0yMDIxLCAgICAtMjcsICAgIC00MiwKKyAgICAgICAtNTEsICAgLTUzNiwgICAgMjM5LCAgICAgLTEsICAgICA3OCwgICAgMTA1LCAgICAgNDgsICAgICA3OSwKKyAgICAgICAyMDcsICAgIDQyMiwgICAtMTgxLCAgICAgMTgsICAgIC05NCwgICAtMTUyLCAgIC0xODEsICAtNTAxMiwKKyAgICAgIC0xODcsICAgICAtMywgICAtMTE4LCAgIC0zOTcsICAgIC04NCwgICAgLTQ5LCAgICAxMjksICAgLTI3NiwKKyAgICAgICAxODgsICAgICA0NSwgICAtMTQ2LCAgIC0yMzUsICAgLTEwOSwgICAgIDgzLCAgICAgMzIsICAgIC03OSwKKyAgICAgIDIwMzksICAgLTYxNiwgICAgMjU3LCAgLTE1NzUsICAtMTc1NiwgIC0yMzY0LCAgICAyMjIsICAgIDE5NSwKKyAgICAgLTExMzgsICAgLTI5MCwgICAgIDU4LCAgIC02NDEsICAgLTI1MiwgICAgLTExLCAgICA0MDIsICAgIC0zMSwKKyAgICAgLTEwNDAsICAgLTU5MiwgICAgNjc2LCAgIC0xMTgsICAgLTIzMSwgICAgIDk0LCAgIC0xMjMsICAgMTY0MiwKKyAgICAgIDE0MDQsICAgLTMzNCwgICAtNzI4LCAgLTM0MjUsICAgIDM4MiwgICAgMTExLCAgIC0xOTQsICAgIDY3NywKKyAgICAgICAxNzcsICAgLTE4MiwgICAgNDM0LCAgICA4NjAsICAtMTAyMiwgICAgIDg0LCAgIDEyMTQsICAgLTczMywKKyAgICAgICAzMDAsICAgICAtMiwgICAtMjU5LCAgICAxNDAsICAgICAzNSwgICAgIDk2LCAgIDExNjQsICAtMTQ3NiwKKyAgICAgIC03NTcsICAgIC03NCwgICAgMjM5LCAgIC0yMDMsICAgMTc5NiwgICAxMjA3LCAgIDE3MzIsICAtMzAyOSwKKyAgICAgIC02MTAsICAgIDY1OCwgICAgNDkwLCAgIC00NjUsICAgIDEzNiwgICAgIDU2LCAgIC02MTQsICAgLTYxMiwKKyAgICAgIC0xMjMsICAgICA5MywgICAtMTUxLCAgICAxNjIsICAgICA1NiwgICAgNTAyLCAgIDE2MzQsICAtMTgyNSwKKyAgICAgICAgNDUsICAgMTAzMywgICAxNTU0LCAgLTIzODAsICAgMTYxNSwgICAxMzE3LCAgICA3ODYsICAgIDM4NywKKyAgICAgIC0yNTUsICAgLTQyMywgICAgLTQ0LCAgIC0yNDYsICAgLTIxMywgICAtMTQ5LCAgICAxMDcsICAgIC03NCwKKyAgICAgICAtOTQsICAgICA0NSwgICAtMjA0LCAgICAgMTMsICAtMTk1OSwgICAgOTM2LCAgIDIwMjMsICAgMTAwMCwKKyAgICAgIDEwMzEsICAgIDExMiwgICAgNTc0LCAgICAzMjMsICAgIDE2MywgICAgOTQ3LCAgIC02NTcsICAgIDQ5MiwKKyAgICAgLTI2MjQsICAgIC00NCwgICAgNzM5LCAgIC0zMDUsICAgIC0zMSwgICAgMjQ3LCAgICAyNzAsICAgIDIxMywKKyAgICAgICAtNDYsICAgIC05MCwgICAgIDQzLCAgLTE1MDQsICAgIDkzMSwgICAgLTYxLCAgIDQwNDUsICAgLTg2MywKKyAgICAgICAzODksICAgLTM4NiwgICAtMTMwLCAgIC0zNzQsICAgLTU4MywgICAtODAwLCAgIC05MDAsICAgIDE1OCwKKyAgICAgIC00NTUsICAgIDE2OSwgICAgMTM0LCAgIC0xNjQsICAgICA1NCwgICAtMTE3LCAgIC0xODUsICAgIC05MCwKKyAgICAgIC0yMDMsICAgIC00MSwgICAtODExLCAgLTIwODIsICAgIDE2OSwgICAgMjg3LCAgIC0zNzgsICAgIC0xNSwKKyAgICAgICAyMzEsICAgICA4MywgICAgIDg5LCAgIC0xODcsICAgIDE5OCwgICAgIDE4LCAgICAxNzgsICAgIC0xOCwKKyAgICAgICA1MjcsICAgIC00MCwgICAgIDk0LCAgICAgNTQsICAgICA3OSwgIC00MzU2LCAgICAyNDgsICAgIDE2MiwKKyAgICAgICAtOTQsICAtMTQzMSwgICAgLTMxLCAgLTIwNDgsICAgIDY1MSwgICAxMjMxLCAgIC01MDgsICAtMTA4OSwKKyAgICAgLTEyNTUsICAgIDc2NiwgICAxNjczLCAgICAzNTcsICAgICAxMywgICAtODEzLCAgLTI0MDMsICAgIDE3OSwKKyAgICAgIC00NzAsICAgICA2NSwgICAtMzM5LCAgICAxNTQsICAgICAgOSwgICAgIDU2LCAgICAyNDYsICAgICA2NiwKKyAgICAgLTIzMDgsICAgMTQ0MywgICAtOTQ3LCAgIC03NDQsICAtMjQ3MywgIC0xMjQ4LCAgIC0xMTMsICAgMTAxNywKKyAgICAgIC02MDgsICAgIDE0OSwgICAtMTgyLCAgICAgNDEsICAgLTUyNCwgICAgIDE2LCAgICAyODUsICAgLTI2OCwKKyAgICAgIC03ODEsICAgIC01NywgICAtMzQ2LCAgICAxOTQsICAgIDI1NiwgICAgLTUxLCAgICAxMDcsICAgLTQ4NCwKKyAgICAgIC0xOTAsICAgLTEyNSwgICAtNjQ1LCAgICA0ODcsICAgIDMxNCwgICAgIDc0LCAgIC01NTUsICAtMTAxMiwKKyAgICAgICAzMjUsICAgICA3NiwgICAgMjMzLCAgIC0yMDUsICAgLTE4OSwgICAgLTQ4LCAgLTQ1OTMsICAgLTEyMiwKKyAgICAgICAgMTAsICAgIDEyMSwgICAgLTkxLCAgICAxMDgsICAgIC00OSwgICAgMjU0LCAgLTE2NjIsICAgMjUwMCwKKyAgICAgICAgODcsICAtMTU0MCwgICAtMjAwLCAgICAyODcsICAgLTMyOSwgICAgLTUwLCAgIC00MDEsICAgIDE4MiwKKyAgICAgLTEzMDAsICAgIDY4OSwgICAgOTE1LCAgIC0yMjQsICAgLTc2OCwgICAgNDcxLCAgIC0zMzksICAgIDEzMywKKyAgICAgICA0MDcsICAgLTM0NCwgICAgIDk5LCAgICAgOTYsICAgIDExMSwgICAxMjI0LCAgLTE0MzEsICAgMjA2OSwKKyAgICAgIC0yODIsICAgIDEyNywgICAgMzk3LCAgIC0xMTksICAgMTMzMiwgIC0xMjk5LCAgICA3NDQsICAgLTUzNSwKKyAgICAgICA4MDAsICAgIDMyNywgICAgODc0LCAgICA3MDAsICAgLTQyNCwgIC0xNTk2LCAgIDEzNjUsICAgLTY1MSwKKyAgICAgIC0xNTEsICAgIDExMywgICAgMTAyLCAgICAtMjQsICAgIDQ2NCwgICAgMTI1LCAgICA5MTEsICAtMTU4MywKKyAgICAgIC0zNzIsICAgIDc0NywgICAgICAyLCAgICA0MjksICAgIC00NywgICAgLTY0LCAgICAgMzQsICAgMTcwMCwKKyAgICAgIC03NDEsICAgIDM0MywgICAgNzI4LCAgIC0yMjYsICAgMTg4OSwgICAgIDc4LCAgIC01MTUsICAgMjgyNywKKyAgICAgICAgNzcsICAgIC02NiwgICAgMTA4LCAgICA1MTUsICAgICA5MCwgICAyMjI3LCAgIC02NzgsICAgMTMwMSwKKyAgICAgIC05NzQsICAgIDEyMiwgICAtOTgzLCAgIDIzNTcsICAgICA2NCwgIC0xNDc5LCAgICAxODYsICAgMTQzNiwKKyAgICAgIC0yNDUsICAgIDIwNCwgICAgNDYwLCAgICAxOTEsICAgLTY3NywgICAtMzM1LCAgIC0yMDAsICAgLTEzNSwKKyAgICAgIC0xMDYsICAgLTEwMSwgICAxMTEyLCAgLTI3MzMsICAgLTY0MSwgICAgIDczLCAgIDEyNjUsICAtMTI4MSwKKyAgICAgLTEzMzIsICAgLTc0MywgICAgNjc1LCAgICAxMjksICAtMTE0NCwgIC0xMTY5LCAgICAzMzEsICAgLTE0MywKKyAgICAgICAtODcsICAgIDgwOSwgICAtODkxLCAgIC04NDgsICAgIDI0NiwgICAgMjQzLCAgICAgOTcsICAgLTE3MCwKKyAgICAgICAgMzYsICAtMTEwOSwgICAgMTAyLCAgIDEwNTUsICAtMTM5NSwgICAxMzg0LCAgIDExNTUsICAgIDQzOSwKKyAgICAgLTE1NDksICAgLTMwMCwgIC0yMDY5LCAgIDEwMTQsICAgIDE4NywgICAtNzgyLCAgICA5ODAsICAgLTk3MSwKKyAgICAgIC0zNDUsICAgLTU4MywgICAgLTY2LCAgIC0xMzgsICAgLTMxNywgICAtMTI0LCAgICAgNDgsICAgLTE1MiwKKyAgICAgICAtOTgsICAgICA5MiwgICAyNDQ2LCAgICAxMjgsICAtMTIzMiwgICAyMTQ4LCAgIC0zMzcsICAgLTYxNSwKKyAgICAgICA0NjcsICAgMTU3MywgICAtNjEzLCAgICA4NTcsICAgIDMwMywgICAgNDIyLCAgLTEzNDAsICAgLTQyMCwKKyAgICAgICAzMDUsICAgLTYyNiwgICAgIDk0LCAgIC00OTYsICAgLTM4NiwgICAtMTI5LCAgICAyNDMsICAgICAyNywKKyAgICAgIC0yMDAsICAtMTM3MywgICAxNDY4LCAgLTIwNDAsICAgIDE1MSwgICAtNjc1LCAgICAgNjUsICAgMTQ2NCwKKyAgICAgIC00MzIsICAgIDU0NSwgICAgMjY5LCAgIC01MTAsICAgIDU4NCwgIC0xOTM1LCAgICA5NzAsICAgLTMxOSwKKyAgICAgIDE0NjUsICAgIDQ5MCwgICAgMjYzLCAgICA1NTUsICAgLTI1NiwgICAgLTQ5LCAgICAzMTUsICAgLTI0MiwKKyAgICAgIC0zOTQsICAgLTMxMiwgICAgLTg4LCAgICAyMDEsICAgLTEyMSwgICAtMzAyLCAgICAxNzIsICAgICA0OSwKKyAgICAgICAyMzQsICAgICA1OSwgICAgMzI3LCAgICAxNTUsICAgIDE5OSwgICAtMTg3LCAgICAtNDEsICAgIC03NCwKKyAgICAgICAgNTIsICAgIC0zMSwgICAgLTU5LCAgLTU1NzQsICAgLTEyMSwgICAgMjgyLCAgICAzNDMsICAgLTEyNSwKKyAgICAgIC0yMDAsICAgLTU3NSwgICAxMzI4LCAgICAxNTUsICAtMTkyOCwgICAgMjUwLCAgICA3MDIsICAgICAyMSwKKyAgICAgLTI3MTgsICAgLTE1MywgICAtMTAyLCAgIDIxMzEsICAgIDYxMiwgICAgNDMyLCAgLTEwNzIsICAgLTQ1NywKKyAgICAgICAyMjIsICAgIDQyNywgICAgMTQ0LCAgICAxNDksICAgLTQzMywgIC0xNTczLCAgIDEzMzcsICAgLTY1MCwKKyAgICAgICAxNzYsICAgICAxMywgIC0xMjczLCAgICAyODAsICAgLTc1MSwgICAtMjM2LCAgICA0NTMsICAgIDIwNCwKKyAgICAgLTE1OTUsICAtMjg5NiwgICAtMjcyLCAgICAyMzMsICAgIDQ4NSwgICAgIDgyLCAgIC0xMzksICAgLTUyOCwKKyAgICAgIC0xNDAsICAgLTM5OSwgICAgLTU2LCAgIC0yNzQsICAgLTMzNSwgICAgMTc2LCAgIC03NTYsICAgIDI0MywKKyAgICAgIDIyNTAsICAgLTMwNSwgICAgNzIxLCAgIDE3MTEsICAgICAgNywgIC0xMjMwLCAgLTE1OTAsICAtMTg3MiwKKyAgICAgIC0xMzcsICAgLTcxNCwgICAgMjYzLCAgLTE2NDMsICAgIDM2MiwgICAtMjY2LCAgIC0xNzYsICAgICA2NCwKKyAgICAgICAtMzYsICAgIC02MywgICAgNjg3LCAgIC00ODMsICAtMTQ4OCwgICAgNzA5LCAgICA5MjksICAgMTM0OSwKKyAgICAgLTEyNDUsICAgIDY0NSwgIC0xNjE5LCAgICA3MzUsICAgLTY1MSwgICAxODUwLCAgIDEwMzEsICAgIDE1OSwKKyAgICAgIC02MjUsICAgIDgzOCwgICAgMjQyLCAgIC0zOTYsICAgLTM5NywgICAgLTQxLCAgIDEyMzcsICAgIDMwNCwKKyAgICAgICAgODEsICAgIC05NCwgICAtNzM2LCAgICA1NzgsICAgMTI3OSwgICAxMDY0LCAgICAgODEsICAgMTkwMCwKKyAgICAgIC0xNzksICAgIDIyNCwgICAgMjY2LCAgIC00MjksICAgIDczNCwgICAgNTAwLCAgICA5OTUsICAgLTg4MiwKKyAgICAgIDE1NjMsICAgMTgxMywgICAtNTE5LCAgICA3NTgsICAgIDUzMiwgICAgLTI3LCAgICAgMjcsICAgIDQ1MywKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiNDQzMm0wW10gPSB7CisgICAgIC02MTMyLCAgIC0yNjIsICAgLTI3MywgIC0xMjUwLCAgIC01NzcsICAgIDk4NCwgICAtNDMwLCAgIC00MTAsCisgICAgICAtNDY0LCAgICA1NzcsICAgLTU3OCwgICAtMTc4LCAgICAtMzIsICAgIDM2OSwgICAtNjI0LCAgICAyNjcsCisgICAgICAgLTY4LCAgICA0NzQsICAgLTQ4MCwgICAtMjI1LCAgICAxNjYsICAgLTQwOSwgICAgNDM3LCAgIDQ2MzMsCisgICAgICAgIDk4LCAgLTE1NjAsICAgLTQ2NCwgICAtODY5LCAgICAxMDMsICAgIDE5MywgICAgNDYxLCAgICAgNzIsCisgICAgICAgMjkyLCAgIC0yNDUsICAgMTEwMiwgICAgNDE3LCAgIC0zMjUsICAgIDQ2MSwgICAgIDc0LCAgICAgNDMsCisgICAgICAtMTIwLCAgIC0yMTMsICAgIDMzMywgICAgMTYwLCAgIC00NjgsICAgLTIxMiwgICAgIDMxLCAgICAtODEsCisgICAgICA2NTE2LCAgICAxODIsICAgIDIwMSwgICAtMjEyLCAgICAtNjYsICAgIC00OSwgICAtMjY2LCAgICAxNDgsCisgICAgICAtMTA4LCAgICAgOTgsICAgIC00NiwgICAgLTExLCAgICAtNTksICAgIC0yMCwgICAgLTIwLCAgIDIzMzIsCisgICAgICAtMjk0LCAgIC01NjAsICAgIDE5OCwgICAtNjQ3LCAgICAtNDcsICAgLTYzOCwgIC0zODc3LCAgICAgMTEsCisgICAgICAgODM0LCAgICA1NDcsICAgICA0NywgICAyNTQxLCAgIC0xMjYsICAgICAtNSwgICAtMzY2LCAgICAzMzksCisgICAgICAgICAzLCAgICAgIDIsICAgIC02NiwgICAgIDYwLCAgIC01MjYsICAgIDkxNCwgICAgMzIxLCAgIC02NTgsCisgICAgICAzNjA1LCAgICAgNTksICAtMjM5MiwgICAtNjU1LCAgICAzODQsICAgIDc3NSwgICAgMzY2LCAgICAzMjcsCisgICAgICAgMzU2LCAgICAzODYsICAgIDc1MSwgICAtMzc1LCAgICAgMzgsICAgLTIwNSwgICAgLTE1LCAgIC00NDIsCisgICAgICAtMjEyLCAgLTEyNDEsICAgMTkxMywgICAtNDIxLCAgIC03NTUsICAgICA0NSwgIC0xNjM3LCAgICAtMzYsCisgICAgIC0yNDM1LCAgIDE1MDQsICAtMTI0OCwgICAtNzYzLCAgIC02NjQsICAgIDEzMywgICAtMTIzLCAgICA4MTQsCisgICAgICAgMjQxLCAgIC0yNDMsICAgLTQ0NiwgICAgIDY2LCAgIC0xMzEsICAgLTIxMywgICAyMDM2LCAgIDEyOTQsCisgICAgIC0yMTM4LCAgICA2NzcsICAtMTA0MiwgICAtNzcxLCAgICAyOTQsICAgIDM3MSwgICAgNDc0LCAgICAgODUsCisgICAgICAxNDAzLCAgLTI2MTgsICAgLTQ3OCwgICAtNTM3LCAgICAyNzUsICAgLTgyNiwgICAgMzQ5LCAgICAgODQsCisgICAgICAgMjY0LCAgIC0yNzIsICAgIC02MSwgICAtNzA1LCAgICAxNzUsICAgLTk3MiwgICAgODY4LCAgICAgMjUsCisgICAgICA0MTgzLCAgICA4ODEsICAgLTYzOSwgICAtODMzLCAgIC03NTcsICAtMTA2MywgICAtOTkxLCAgIC0yNTcsCisgICAgICAtMTM3LCAgIC02MTksICAgLTI4NSwgICAtNDU0LCAgICAgNzcsICAgLTE2OSwgICAgMzE2LCAgICAtNDUsCisgICAgICA0MzYyLCAgIC0yMDMsICAtMjEzMiwgICAtNDI0LCAgIC04MjAsICAgLTUwMywgICAgMzQwLCAgICAzNDAsCisgICAgICAtNjEyLCAgICA2NDgsICAgICAgMiwgICAtMzQyLCAgICAgODEsICAgIDYzMCwgIC0xNTE4LCAgICAyMzUsCisgICAgICAgMjE2LCAgICAyMTAsICAgIDY2NSwgICAgMjMxLCAgICAxMzAsICAgLTg3OSwgICAgIDM4LCAgICA2NzUsCisgICAgICAtMTM2LCAgICAtNDgsICAgIDU0MCwgICAtMjM0LCAgIC0xNTIsICAgLTE2OSwgIC01NzQ1LCAgIC0yOTQsCisgICAgICAgLTI0LCAgICAgIDgsICAgLTEyOSwgICAgIC04LCAgICAzMDgsICAgIC0xNCwgICAgLTE2LCAgICAxNDcsCisgICAgICAgIDYyLCAgICAgNzAsICAgIDI0OCwgIC0yMDE0LCAgICAgNzYsICAgLTE5MCwgICAtMzI4LCAgLTE4OTksCisgICAgICAtMzUzLCAgIC0xNDAsICAgIDgzNiwgICAtMzY1LCAgIC0xMTIsICAtMzk0NSwgICAtNzM2LCAgICA0NjcsCisgICAgICAtMjU4LCAgICA2MDEsICAgIDYxNywgICAgIDc0LCAgICAgNjIsICAgIDM5NCwgICAgMTgwLCAgIDExNTEsCisgICAgICAtODEwLCAgICAgMzYsICAgIDQ1NywgICAgNDA2LCAgICAgNzUsICAgICAtOCwgIC01MDA0LCAgIDIzMzUsCisgICAgICAtMTA4LCAgIC0xMjMsICAgIDI5OSwgICAtMzM1LCAgICAxMTIsICAgLTQ5OSwgICAtMjY4LCAgIC0xODUsCisgICAgICAgNDYxLCAgICAyMDgsICAgIC0zOCwgICAtMTY0LCAgICA3NjQsICAgLTUwNCwgICAgMjcyLCAgIDQ4NTMsCisgICAgICAgMzk2LCAgICAyNjUsICAtMTEzMywgICAtNDMzLCAgICA3NjksICAgLTQ1OCwgICAxMDA1LCAgICA2NDUsCisgICAgICAgIDgxLCAgIC0xNzIsICAgIDM4NSwgICAgLTU2LCAgIC0xMzAsICAgLTM5MywgICAgMTI4LCAgICAtNzMsCisgICAgICAgIDMxLCAgIDIwMzgsICAgIDEyNywgICAtNDM2LCAgICAxMjMsICAtMjUyNSwgICAgMjgyLCAgIC00NDgsCisgICAgICAtNDg5LCAgIC0yOTUsICAgIC0xNCwgICAgIDg1LCAgIC00NjIsICAgIC00OSwgICAgMjYyLCAgICAtOTMsCisgICAgICAgMjM4LCAgIC0xNDgsICAtMzk1MywgICAtNDE0LCAgIC0yNTksICAgICAzMywgICAtODkyLCAgICA0NTksCisgICAgIC0yMTg2LCAgICAgNjAsICAgIDQ0NCwgICAtNjEwLCAgICA4NDQsICAgLTQ4NiwgICAtMjk5LCAgICAyMTksCisgICAgICAtNDMzLCAgICAgMTksICAtMTE4MywgICAgMjc2LCAgICAtMjksICAgIDM4OCwgICAzMzI3LCAgICAxMDIsCisgICAgICAtOTE0LCAgIC0yMjEsICAgIDQ4NiwgICAtODkyLCAgIC01NTAsICAgIDE5MCwgICAgMTUxLCAgIC0xNDEsCisgICAgICAtMzM2LCAgICAxOTQsICAgLTI0MiwgICAtMjI0LCAgICA0MDUsICAgIDg3OSwgICAxNjAwLCAgICAzNDksCisgICAgIC0yMDgyLCAgICAtMzgsICAgLTUxNCwgICAgIDE4LCAgLTM1NzQsICAgIDE2MSwgICAtMTQyLCAgICAtMzgsCisgICAgIC0xODE1LCAgICA1NDAsICAgIDIyOCwgICAgIDMzLCAgICAxNjQsICAgMTA3NCwgICAgICA0LCAgIC0yNzgsCisgICAgICAgLTU4LCAgIDQwODUsICAgLTI5NSwgICAtNzk1LCAgICAgMzEsICAgIDQ5NCwgICAgNTU1LCAgIC0yNTAsCisgICAgICAgIDIyLCAgIC0yMDIsICAgLTMxMiwgICAgIDkyLCAgICAxMDksICAgLTIzOCwgICAtNDQ4LCAgIC02MjIsCisgICAgIC0xNTExLCAgLTQzNDYsICAgLTQxNywgICAtNzA2LCAgICAgMzcsICAgMTE1NywgICAgLTk2LCAgIC0xOTksCisgICAgICAgLTU5LCAgICAyODUsICAgIC00MywgICAtMjE3LCAgICAtMjIsICAgIC05NSwgICAgMTAzLCAgIDIyNDIsCisgICAgICAgMjQ0LCAgICAgNDUsICAgIC03NCwgICAgIC03LCAgICAzNjYsICAgIC03OSwgICAtMzU5LCAgIC0yODYsCisgICAgICAgMTg4LCAgICAtMTQsICAgICAzNCwgICAgIDQ5LCAgICAyNDUsICAgLTEwOCwgICAgLTg0LCAgICAgODgsCisgICAgICAtMzMzLCAgIC0yMTYsICAgIC03OSwgICAgIDE1LCAgLTU3MTAsICAgIC0zNiwgICAtMTAyLCAgIC01NTIsCisgICAgICAtMjEzLCAgICAgLTgsICAgLTM1NiwgICAgNTE1LCAgICAyMTIsICAgLTI2NSwgICAgIDgwLCAgICAzMTYsCisgICAgIC0xMTYzLCAgIC01NjEsICAgLTUxNywgICAtNzE0LCAgIC0zNzUsICAtNDE3NiwgICAgIDczLCAgIC02NjYsCisgICAgICAtMzYzLCAgICAtMjgsICAgMTI0OCwgICAgLTY4LCAgICA0NzgsICAgMjY0OCwgICAgNjQyLCAgIC03MTAsCisgICAgICAtNTU1LCAgIC03NDQsICAgLTE2NiwgICAtNzQ0LCAgIC01OTYsICAgIDEzOCwgICAgNDk5LCAgICAgNTksCisgICAgICAgNDUzLCAgIC01ODMsICAgLTI5MCwgICAgLTExLCAgICAtNDgsICAgNDE3NCwgICAtMjUyLCAgICAtNzQsCisgICAgICAgLTc4LCAgICAtNjIsICAgIDQ0OSwgICAtMjY1LCAgIC04MTgsICAgLTM1NywgICAgMTcxLCAgIC01MTMsCisgICAgICAgIDcyLCAgICAxMDYsICAgIC00NSwgICAgNjQ5LCAgICAxNDUsICAgNTU1OCwgICAgLTYwLCAgIC0xMzYsCisgICAgICAgIDY5LCAgIC0xNzIsICAgLTEzNCwgICAgLTY2LCAgICAtNjgsICAgIDEwMCwgICAgNjgzLCAgIC00MjcsCisgICAgICAgNzk1LCAgIC00MDcsICAgIDM0NSwgICA0OTMwLCAgIC04MzgsICAgIDM2MSwgICAgMjc5LCAgIC0xOTAsCisgICAgICAgMTczLCAgIC0zNDEsICAgICAtOSwgICAgNzIyLCAgICAzODMsICAgLTE0MCwgICAgMTIzLCAgIC0yNjksCisgICAgICAgMTU0LCAgICAgMzEsICAgIDMzNSwgICAtNDY1LCAgICAzMTEsICAgICA0NiwgICA0NTM1LCAgIC0xMzEsCisgICAgICAgIDkwLCAgICAxNTEsICAgIDI4NywgICAgLTExLCAgIC01MjYsICAgLTYxNCwgIC0yMjUzLCAgIC0zMjEsCisgICAgICAgLTkzLCAgIC01NTAsICAgLTEyOCwgICAgIDI1LCAgICAzMDMsICAgLTEzOSwgICAgIDE5LCAgICAgIDAsCisgICAgIC0zMjU1LCAgIC0xNjEsICAgIDI3NiwgICAgMTAzLCAgIC0yNDUsICAgLTUxNSwgICAgODE2LCAgLTEwNDIsCisgICAgIC0xNDQ5LCAgIDE2OTMsICAgLTYyNywgICAxMjg3LCAgIC04MzcsICAgLTcyNywgICAgLTgwLCAgIC00NzgsCisgICAgICAtMzM3LCAgICAxMTYsICAgICAgMSwgICAtMjcwLCAgIC01NjcsICAgLTMxMSwgICAtNDA3LCAgLTE2NTYsCisgICAgICAtMjE2LCAgICAxOTYsICAgMzAwNCwgICAtMjg1LCAgIC01MjEsICAgMTUxMCwgICAxODE4LCAgIDEzOTIsCisgICAgICAgIDQyLCAgICAtNDQsICAgLTI0NCwgICAtMzQ5LCAgICA5NTksICAgLTE4MywgICAgIDI1LCAgICAgNTgsCisgICAgICAgIDQzLCAgIC0zNDUsICAgLTMxMCwgIC04MTkyLCAgICAtODQsICAgIDMxMSwgICAgLTYwLCAgIC0zNDgsCisgICAgICAgMTI1LCAgICAgMzMsICAgIC03OSwgICAtMTM4LCAgICAgODgsICAgIDEzOCwgICAtMTIxLCAgICAtMzcsCisgICAgICAtMjExLCAgIC0xMTgsICAgLTE0MiwgICAgLTM3LCAgIC0xMzIsICAgIDE4MSwgICAgMTYyLCAgLTE0MjMsCisgICAgICAxNzgxLCAgLTM0NTMsICAgMTI2MSwgICAgMTM0LCAgICA2NzAsICAgMTIxOCwgICAgNzYxLCAgICAyOTIsCisgICAgICAtMTQ2LCAgIC04MjUsICAgIDY3MiwgICAgNzM3LCAgICAyOTMsICAgIDQzMywgICAgMjQ1LCAgIC0zOTIsCisgICAgICAgIDQ2LCAgICA1OTgsICAgIDI1NywgICAtMjM0LCAgLTEyMDEsICAgIDcxOCwgIC00NTQ5LCAgIC01NzMsCisgICAgICAtNjk2LCAgIC0yMjQsICAgIC04NSwgICAgIDc1LCAgIC0yNjgsICAgIDI0NCwgICAxODE3LCAgICAzNDEsCisgICAgICAtMTY2LCAgICA0MzYsICAgLTM4NiwgIC0xMjQ3LCAgICAgMjIsICAgLTExMiwgICAgLTU1LCAgIC00NTEsCisgICAgICAgMTA2LCAgICAzODgsICAgIC0zMiwgICAtMjU0LCAgLTI0MDAsICAgLTM3MywgICAgODkyLCAgICAzMzQsCisgICAgIC00MTE0LCAgIC0zMDcsICAgLTEwNywgICAtMzE2LCAgICAgNDEsICAgLTIxNCwgICAtNDAzLCAgICAtNTYsCisgICAgICAtNDY5LCAgIC0yNDYsICAgIDEyMCwgICAtMjM3LCAgICAyNjYsICAgICA0MywgICAzMjU3LCAgLTM5MjUsCisgICAgICAgMjkxLCAgICAyMzksICAgIDc1MiwgICAtNDExLCAgICAxNjIsICAgIDQzNywgICAgMTU5LCAgICAyNTYsCisgICAgICAgIDM3LCAgICAgNzEsICAgIC03OSwgICAtMTM2LCAgIC00NzUsICAgIDEyNCwgICAtMjA4LCAgIC0yMTYsCisgICAgICAtMjQ1LCAgICAgMTYsICAgICA0MCwgICAtNDU5LCAgLTQzMjAsICAgIDM0MCwgIC0xNDYyLCAgICA5MTQsCisgICAgICAgIDEwLCAgICA0OTAsICAgIDQzNiwgICAgMTYyLCAgICAyNzEsICAgLTIzOCwgICAgLTM4LCAgIDIyMTksCisgICAgICAgIDI1LCAgIC0xNDEsICAgIDQwNSwgICAgMTA3LCAgICAyMzUsICAgIDI4MiwgICAgLTU1LCAgICAgLTcsCisgICAgIC0zNDI5LCAgICA1NjUsICAtMTA5NSwgICAtNjc4LCAgIDE5NzksICAgIDIzMywgICAtODc0LCAgICA1OTIsCisgICAgICAtNDc0LCAgICA2ODAsICAgIDQwMiwgICAtNzM4LCAgICAgMjEsICAgIDI3NCwgICAtMzIxLCAgICA2NTUsCisgICAgICAtMzQ4LCAgIC01NDYsICAgIDUxMCwgICAgIDYyLCAgICAgMjMsICAgNDcyMiwgICAgNTcyLCAgICA0MjMsCisgICAgICAtMjU2LCAgICA0NzMsICAgMTI0MCwgICAtOTk3LCAgIC04OTksICAgIC01MywgICAgLTczLCAgICAzMzIsCisgICAgICAtOTAyLCAgIC03NzEsICAgLTMzNSwgICAgICAwLCAgICA3NjksICAgLTU4NywgICAgNTkyLCAgIC03MDMsCisgICAgICAtNjAwLCAgICAtNzcsICAgIC05NCwgICAtMjA3LCAgICA3OTIsICAgLTEzMywgICAtNzU4LCAgICA1MDAsCisgICAgICAgLTE0LCAgICAzMzAsICAgICAyMiwgICAtMjgxLCAgLTU0NjAsICAgIDE1MiwgICAgNjA3LCAgICAzMzcsCisgICAgICAgLTM5LCAgIC0xMTgsICAgIC04MCwgICAgLTUxLCAgICAyMjgsICAgICA2NSwgICAgIC02LCAgICA1NDAsCisgICAgIC0zNTE1LCAgLTE3MTIsICAgLTQ0OSwgICAtMTU3LCAgIC0xNjQsICAgLTE5NSwgIC0xNjU1LCAgLTEyODUsCisgICAgICAgIDkwLCAgIC01MTcsICAgLTExNiwgICAgIDExLCAgIDE0MDIsICAgLTE2MiwgICAgLTY0LCAgIC0xMDMsCisgICAgICAgIDQ2LCAgICAzMDIsICAgICAzNywgICAgIDcxLCAgIDI5MDMsICAgMjk1MiwgICAgNzgwLCAgIC00ODcsCisgICAgICAtMjk3LCAgIC00MjYsICAgLTM2OSwgICAgMTUwLCAgIC0xMjksICAgLTIzMywgICAgODEzLCAgIDE2MzksCisgICAgICAgMTkwLCAgICAzMTAsICAgLTMxMSwgICAgMzIwLCAgICAgOTQsICAgLTI0NywgICAxNDg0LCAgICAtMzIsCisgICAgICAgIDcwLCAgIC0yMjAsICAgIDU2MCwgICAgMzcyLCAgICAgNTQsICAgIDIwNSwgICAgIDk2LCAgLTM1NjcsCisgICAgICAtNjgwLCAgIDE2ODMsICAtMjM3NywgICAgIDE3LCAgICA1NDgsICAgLTI2NiwgICAgMjU3LCAgICA2NTYsCisgICAgICAgMzMxLCAgICAyMDUsICAgLTEyMSwgICAtODE0LCAgICAxMzksICAgIDMyNiwgICAtMzcwLCAgICA2MjUsCisgICAgICAyMDM1LCAgICA4MTgsICAgIDc3NSwgIC0xMTY1LCAgICAtNDEsICAtNDI1OCwgICAgIDQxLCAgIDExMDksCisgICAgICAgOTg0LCAgIC04ODUsICAgIC00MywgICAtMzE0LCAgICAyMDQsICAgIDIwNCwgICAgIDk1LCAgICA0MDcsCisgICAgICAtMzUxLCAgICAxMDEsICAgIDEzMywgICAtOTI5LCAgICA4OTksICAgICAtNiwgICAgMzg0LCAgIC0xNzcsCisgICAgICAtMzMwLCAgICAyNDAsICAgICA5MCwgICAgIDc4LCAgIC0zMTgsICAgLTQ1NSwgICAgIC01LCAgIC0zNjUsCisgICAgICAgLTYxLCAgICAtODAsICAgIC03MiwgIC00ODUwLCAgIC0zMzgsICAgLTM4NCwgICAgIDMwLCAgICAxODEsCisgICAgIC0yNzIxLCAgIC03NjcsICAgMzIxNywgICAgNDUzLCAgIC0yMjYsICAgLTU4MiwgICAgMjgzLCAgICAxMzUsCisgICAgICAtMTAzLCAgICAyNjUsICAgIDQ5NCwgIC0xNDQ0LCAgIC0xMjAsICAgICA3MCwgICAtOTc2LCAgICAtNjcsCisgICAgICAgLTkwLCAgICA2NjAsICAgIDM2NiwgICAtNjA5LCAgICAgMzIsICAgIDIwNSwgICAgIDczLCAgICAgNTEsCisgICAgICAgMzQ2LCAgICAgLTYsICAgLTEyMCwgICAgLTEwLCAgICAzMDAsICAgICAzMiwgICAgMjcwLCAgICAxMzksCisgICAgICAgLTU1LCAgICA0NTMsICAgNTcxMiwgICAgMzUzLCAgIC0xNDUsICAgIDE3NiwgICAtMTY4LCAgICAyMTYsCisgICAgICAgMjA1LCAgICAtMzAsICAgLTMwNCwgICAxMDg1LCAgICAyMjEsICAgIDQ2NCwgICAtNDI2LCAgIDE2NjIsCisgICAgIC0xMzk3LCAgLTExMTQsICAgIDMwMSwgIC0xMDU4LCAgIDM1NTMsICAgLTM4OCwgICAgNzQzLCAgICA2OTYsCisgICAgICAtODkzLCAgIC0yOTYsICAgIC01NywgICAtMjU0LCAgIC0yNTEsICAgLTE3OCwgICAgNDE3LCAgICAgODIsCisgICAgICAtOTg4LCAgLTM1NjYsICAgMjE3MSwgIC0xMzEyLCAgIC05NTQsICAgIC0yMywgIC0xMzQ5LCAgICA0ODAsCisgICAgICAgNTY2LCAgICAgMjQsICAgLTY0MywgICAtMjkyLCAgICAtNjgsICAgIDMwMywgICAgIDczLCAgICAtODEsCisgICAgICAgMjk2LCAgICAgIDcsICAgIDM3MSwgICAgIDk0LCAgIDE3MTgsICAgIDQ5OCwgICAtNzc0LCAgICA4NTcsCisgICAgICAxMDE0LCAgICAzNTgsICAgIDQzNiwgICAgMjEwLCAgLTM0ODEsICAgLTIwMiwgICAtNDE2LCAgICAgNTksCisgICAgICAxOTg3LCAgICAxMzcsICAgLTQ3NiwgICAgIDMyLCAgIC02MjcsICAgIDE5MywgICAgMzY4LCAgICAgLTMsCisgICAgICAtMjkwLCAgLTMwMzUsICAgLTM1MiwgICAtNDU1LCAgIC02MDksICAgLTE3NSwgICAgIC01LCAgIC02MDAsCisgICAgICAtMTgxLCAgIC0yNDksICAtMjU1MSwgICAgMjI2LCAgICAxMDUsICAgLTI0OSwgICAxODUxLCAgICAtODYsCisgICAgIC0xMjAzLCAgICAyMTQsICAgIC01NywgICAtNTA1LCAgIC01MjIsICAgLTI0NywgICAtMTU0LCAgICAtNDAsCisgICAgICAgLTE3LCAgIC01MjMsICAgIDMzMywgIC0xNzc3LCAgIC0zNTQsICAtMTU2OCwgIC0zNDkyLCAgIDEwMzIsCisgICAgICAxNTc3LCAgICAgOTAsICAgIDE1MywgICAgNTM0LCAgIC0xMDYsICAgLTUzOCwgICAgMTAyLCAgICAgIDMsCisgICAgICAtMTk4LCAgICAtOTksICAgIC0yMywgICAgODM1LCAgIDM0OTUsICAtMTA5OSwgICAgIDQ0LCAgICA3MzIsCisgICAgICAtMzUwLCAgICA5MjYsICAgLTQ3MiwgICAgNTMzLCAgIDE1MjksICAgICA1NCwgICAtODQ0LCAgIDEyOTUsCisgICAgICAgNTczLCAgICA0MTQsICAgIC0yMywgICAgLTcxLCAgICAyNzksICAgLTg5MSwgICAgMjg3LCAgICAxMjYsCisgICAgICAxNDU2LCAgICA5NzMsICAgIDQ1NiwgICAxNjA4LCAgIC02NDYsICAtMTI0NCwgICAgNDUyLCAgICA2NTEsCisgICAgICAgNjk0LCAgICA4NTUsICAgLTIzNSwgICAtNTAzLCAgICA3NDUsICAgLTU0NCwgIC0zNTEyLCAgIC0xMzgsCisgICAgICAgNjc4LCAgICA0NzMsICAgIDIyMCwgICAtMjczLCAgICAgLTksICAgIDI2NSwgIC0xODc0LCAgICAzOTcsCisgICAgICAxMTk2LCAgICAyODQsICAgLTk2MywgICAgMjk4LCAgICAzMTgsICAtMjMwOSwgICAtMTYyLCAgICAzMjIsCisgICAgIC0xMjUwLCAgICAtMTYsICAtMTAwNCwgICAgIC01LCAgIDI4MDAsICAgIC02NCwgICAgIDcyLCAgIC00ODIsCisgICAgICAtMTYyLCAgIC00MTIsICAtMjkyMiwgICAgNzc0LCAgIC0zMzUsICAgIDIzOCwgIC0xMTQ0LCAgIC0xMzQsCisgICAgICAxNDI4LCAgICA1NTgsICAgMTk2OSwgICAtNjU5LCAgICA5MDIsICAtMTY5OCwgICAgNzkzLCAgIC04NTgsCisgICAgICAtNjEzLCAgICA5OTgsICAgIDI1MywgICAtMzM2LCAgIC0zNDgsICAgIC04MCwgICAtMTE3LCAgIC0yNjQsCisgICAgICAgMzU1LCAgICA4MDgsICAgIDc4NCwgICAtNTU5LCAgIDIwMzAsICAgMTk1MiwgICAtMjQ0LCAgLTExMzAsCisgICAgICAtOTg2LCAgIDE4ODMsICAgMTE3MSwgICAtNDkzLCAgIC0zMjYsICAgLTg4MCwgICAyNTg4LCAgIC0yNDMsCisgICAgICAtMjA0LCAgICAxOTQsICAgLTE3MiwgICAgLTY1LCAgIDIwMjYsICAgIDQyNCwgICAgNTg3LCAgIC0zMTcsCisgICAgICAyNTUwLCAgIC02MDEsICAgIDIwMywgICAtNjY5LCAgICA0NzUsICAgLTY3NiwgIC0xNDkyLCAgICAgMjcsCisgICAgICAgIDQxLCAgLTEwNzgsICAgLTI5OSwgICAtNjMwLCAgICAxNzcsICAgLTE2NCwgICAtNDI5LCAgIC0yNDYsCisgICAgICAtMzU3LCAgIDExOTEsICAgLTg2NywgIC0xMzYzLCAgIDE2MjEsICAgLTExMCwgICAgOTE2LCAgICAyMTcsCisgICAgIC0xMjY5LCAgICA2MjIsICAgLTQzNCwgIC0xMTEzLCAgICA4ODgsICAgIC00MSwgICAxMDIwLCAgLTE3NzQsCisgICAgICAgIDQ2LCAgICAgODAsICAgLTQ4MywgICAtODkyLCAgICAtNjEsICAgLTQ3MiwgICAgMTkzLCAgIC0xOTIsCisgICAgICAyMDAwLCAgIC0xMDMsICAgIDc0MCwgICAtMjIzLCAgIDI0OTMsICAgIDQyMiwgICAyNTA4LCAgIC0zMzEsCisgICAgICAgNDcwLCAgLTEyMzMsICAgICA0NywgICAgNTk1LCAgICA3OTUsICAgLTQ2NSwgICAtMzIwLCAgIC0xNjMsCisgICAgICAgMTI4LCAgICAgIDYsICAgLTIwOSwgICAgNjAzLCAgICA1MzYsICAgLTQxNiwgIC0xNDU1LCAgICAtODcsCisgICAgIC0xMTkxLCAgICAtOTgsICAgLTI4MSwgICAxMDAzLCAgIDE0MjEsICAgIDM4OCwgICAxMTYzLCAgLTExNDYsCisgICAgICAgLTgxLCAgIC0yOTksICAgMjUxOCwgIC0xMDcyLCAgICAyMDcsICAgLTQ0MywgICAgNTA2LCAgIC0yMjAsCisgICAgICAtMzQ2LCAgICAgOTgsICAgMjExOSwgICAtNDE2LCAgLTIyNjgsICAgLTQ5OCwgICAgMTA5LCAgLTEzNDIsCisgICAgICAtMzM1LCAgIDExMjUsICAgLTcxMiwgICAgMTU2LCAgLTEwODgsICAtMjA5MiwgICAxMTY0LCAgIC01MDAsCisgICAgICAgMTEzLCAgICAtMTcsICAgIDU1MSwgICAtMTk5LCAgICAyNjIsICAgIC0yNywgICAtNjkyLCAgIC02MjksCisgICAgICAgMjA0LCAgLTE0NDgsICAtMTYwNiwgIC0xNTU0LCAgICAyODksICAgIDM4MiwgICAtNjkxLCAgIDEyMjksCisgICAgICAgNDE0LCAgLTE3NDYsICAtMTE5OCwgICAxMTEzLCAgIC0zODYsICAgIDMxMCwgICAxMzU0LCAgICAtMTIsCisgICAgICAtMjg0LCAgIC01NjksICAgICA0NiwgICAtNTU4LCAgIDE0OTUsICAgIDE3MiwgICAtODk5LCAgICA2MTcsCisgICAgICAgODI3LCAgIC0zNjUsICAgIDEwMCwgICAxMDA4LCAgICAxMzYsICAgMjExMSwgICAgIDEwLCAgIDIzMjAsCisgICAgICAtMjkxLCAgICAzNjQsICAgLTQwMSwgICAtNDA4LCAgIC01MjgsICAgLTYxMiwgICAgMTI3LCAgIDEyMTgsCisgICAgICAtMzg0LCAgICAxMjksICAtMTYwMywgICAgNDM4LCAgIDEwMjksICAgMjUzNiwgICAtMTUwLCAgLTE0MzIsCisgICAgICAtODU2LCAgIDEwNjgsICAgIDc3MywgICAtNzYyLCAgIC04MDgsICAgIDY3NiwgICAtNjkzLCAgICA0MDQsCisgICAgICAgMTQ1LCAgICAgIDQsICAgICAyNywgICAtMTQ4LCAgIC0zMTgsICAtMTAxOSwgICAtMjc3LCAgIDE0MDQsCisgICAgICAgODgwLCAgLTExMzUsICAgIDg2MSwgICAgOTAzLCAgICA3MzksICAgIDMwMywgICAgMTM5LCAgIDE5MTgsCisgICAgICAtOTUyLCAgICA4MDEsICAgLTMwNiwgIC0yNDM5LCAgICAgLTMsICAgIDQ0MiwgICAtNTkwLCAgLTEwMzQsCisgICAgICAgMTc4LCAgICA0MzAsICAgIDE1MywgICAxODUzLCAgIDE5OTcsICAgIDc0MiwgICAxNzQ1LCAgIC02MDgsCisgICAgICAtMjM3LCAgICAxNjAsICAgIDUyMywgICAgOTUwLCAgICAgODIsICAtMTQ2OCwgIC0xNTkyLCAgICA4MDcsCisgICAgICAgNzE5LCAgICA2MTgsICAgIDMxOSwgICAgIDU3LCAgICAyMzUsICAgIDI4NywgICAxMzQ0LCAgICAtNTAsCisgICAgICAgMzI0LCAgIC0xODIsICAgLTM2NSwgICAtMzgxLCAgIC0zNzcsICAgMTk4OSwgICAgMTQ3LCAgIC01NzMsCisgICAgICAxMjQ2LCAgIDE3NjksICAgLTQ3MywgICAtMTc4LCAgICA5NjEsICAtMTI5NywgICAtNzUwLCAgLTE0MjgsCisgICAgIC0xMjQ2LCAgICA3ODksICAgIDE1OCwgICAgNjEyLCAgICAgMTcsICAgLTI5MiwgICAtMjI3LCAgIC0xNDIsCisgICAgICAgIDY0LCAgICAgNTEsICAgIC0xNiwgICAtMzAxLCAgIC0yODcsICAgIC02MCwgICAtNDA0LCAgIC0yNjcsCisgICAgICAgMTA5LCAgIC0xMDgsICAgIDE4OSwgICAtNDM4LCAgICAgNDgsICAgICA5NSwgIC01MDU5LCAgICAtNDIsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjQ0MzJtMVtdID0geworICAgICAgNzU2NywgICAgMjczLCAgICAyNjgsICAgIC03NCwgICAgMjAxLCAgICAyNzQsICAgLTE0OSwgICAtMTQ2LAorICAgICAgLTI2MiwgICAgMjQzLCAgIC0yNzMsICAgICA2MywgICAtMTI3LCAgICAxMzUsICAgLTE2MCwgICAgMjMxLAorICAgICAgIDEyMCwgICAgMjA5LCAgICAtOTEsICAgLTIxOCwgICAgLTM4LCAgLTEyMDYsICAgLTQ2OCwgICAtMTU5LAorICAgICAgIDI3OCwgICAgNTM2LCAgIC05OTUsICAgIC02MCwgICAgIDIyLCAgIDEwNDEsICAgLTU1MCwgICAtMTIxLAorICAgICAgLTI0MSwgICAtNjY0LCAgICA0MjcsICAgLTQxNiwgIC0xMzk1LCAgIC03MzIsICAgIDE1MiwgICAzMjQ3LAorICAgICAgIC02NywgICAtMTU0LCAgLTI0MzAsICAgIDQyMSwgICAtNDA1LCAgIC01NTgsICAgIC03MywgIC0yODg3LAorICAgICAgLTI3MiwgICAgLTYwLCAgICAzNjUsICAgIDc0NSwgICAgMjg3LCAgIC02MjIsICAtMTEwMywgICAgNDEyLAorICAgICAgIDI2NiwgICAgIDgyLCAgICAgNjEsICAtMjE3MiwgICAtMzc5LCAgICA1MjksICAgLTEyNSwgIC0xNDgyLAorICAgICAgIDMxOSwgICAgNjQzLCAgICAyMjIsICAgLTUwOCwgICAyNDUxLCAgIC05NzAsICAgICA3MSwgICAgMjM3LAorICAgICAgLTI4MCwgICAgMjAyLCAgICA5ODMsICAgLTIyMywgICAtMzA3LCAgIC0xMzAsICAgIDIxNywgICAzMjA5LAorICAgICAgICA0OSwgICAgLTMwLCAgICAyNzUsICAgIC0xMiwgICAtMjYwLCAgLTM5NTksICAgMTIxOSwgICAtMTA0LAorICAgICAtMjcwMCwgICAtMjAxLCAgICAgNTQsICAgIDg1MSwgICAtNTkwLCAgICA2OTEsICAgLTI1NCwgICAgNDA4LAorICAgICAgIDI5NiwgICAgLTQ4LCAgIC0zNjQsICAgIDIxNiwgICAgIDE2LCAgICAyMjAsICAgLTQxNSwgICAgMjE4LAorICAgICAgICA4MywgICAgIDQzLCAgLTQwMzIsICAtMTM1OSwgICAgIDI1LCAgICAgMTUsICAgLTI3OSwgIC0yMDkyLAorICAgICAgIDc5NCwgICAtNDMzLCAgIC0xOTUsICAgLTE2MiwgICAgNjA2LCAgICAxNjYsICAgICA4NywgICAtMzE2LAorICAgICAgIDUwOCwgICAgMjQyLCAgIC0zNTksICAgIDY4NywgICAtMTc4LCAgICAgMTQsICAtMjk2OSwgICAtNTAwLAorICAgICAtMTA0MSwgICAzMjM0LCAgICA2NzksICAgIDE3MCwgICAtNzkxLCAgIC0xMjcsICAgLTYzMCwgICAgLTE2LAorICAgICAgIC0xOSwgICAgMTgxLCAgICAgLTIsICAgLTE4NSwgICAtMTcyLCAgICAtODgsICAgLTExOCwgICAtMTY3LAorICAgICAgIDEyOCwgICAgMTIxLCAgICAyMzksICAgIDMyMSwgICAtMTI1LCAgICAyMTcsICAtNzI2MCwgICAtMTU3LAorICAgICAgLTE2MSwgICAtMzQ3LCAgIC0yNTcsICAgIDEwMiwgIC0xMTgxLCAgICAgNzEsICAgLTM3OSwgICAtMjA1LAorICAgICAgLTI2OCwgICAgMTQ0LCAgIC0xNzQsICAgLTEwNiwgICAgMzA1LCAgICAgMjMsICAgIC00NywgICAgMjAyLAorICAgICAgLTExMCwgICAgNjYwLCAgICAgNTQsICAtMjk2MywgICAtMTE5LCAgLTEzNzEsICAtMjgyMywgICAxMTcxLAorICAgICAgLTcyNiwgICAgNjkwLCAgICA1MzQsICAgIDE2MSwgICAtNDM1LCAgICA3NTMsICAgICA1OCwgICAgMjI3LAorICAgICAgIDI0MSwgICAgMTM4LCAgICAtNzYsICAgIDQ3MywgICAgMTkzLCAgLTE5MjYsICAtMjE4MywgIC0yNTI2LAorICAgICAtMTQyOCwgICAgMjg0LCAgLTEyNzAsICAgIDMzNiwgIC0xNDU4LCAgICAyMDgsICAgICA0MSwgICAtMzU2LAorICAgICAgIDM0NSwgICAgMTUzLCAgIC0yNzMsICAgLTE2NiwgICAgNTAwLCAgICAgNDIsICAgIDEyMCwgICAgLTM1LAorICAgICAgIC04MSwgICAgIDU2LCAgIDE3NDcsICAtMzA1MCwgIC0yMDI5LCAgIC03NjQsICAgLTk0NywgICAgODg4LAorICAgICAgIDQyMiwgICAgMzc0LCAgICAxNDMsICAgLTMxOCwgICAtMjI1LCAgICA2MDQsICAgIDM0MywgICAgLTkxLAorICAgICAgMTYyNiwgICAgIDc1LCAgIC0yMTEsICAgIDE2MCwgICAtNjY3LCAgIC0xOTUsICAgICAzOCwgICAtNDQ2LAorICAgICAtMTI2OSwgICAtMTA4LCAgIC05NTksICAgLTYxNiwgICAtNTMwLCAgICA1NTQsICAgMjg2NSwgICAtMTU2LAorICAgICAgLTM1OCwgICAtNDI5LCAgIC0yNjEsICAgICAyMywgICAgNTExLCAgICAzNDAsICAgLTU0OCwgICAyMzQ3LAorICAgICAgIDEwNSwgICAgIDEyLCAgICAtMzIsICAgIDE2NCwgICAgMTcwLCAgIC0xNjgsICAgIDI2OCwgICAyNTg3LAorICAgICAgMzUxMSwgICAgNjEyLCAgICAzMjksICAgIDE1OSwgICAgNDU2LCAgICAyNzMsICAgLTQ1MiwgICAgMTY4LAorICAgICAgLTM5NCwgICAgNzk5LCAgICAtNTgsICAgIDE2MCwgICAtNDgwLCAgIC0yNTcsICAgIDI0MiwgICAgMTY3LAorICAgICAgICA0NiwgIC0xNDMzLCAgLTE2MzEsICAgICA1MCwgICAgODUyLCAgICA1MDksICAgIDg2NCwgICAtMzgxLAorICAgICAgLTMwNiwgICAtNjk4LCAgICAyNjEsICAgLTcwMiwgICAgLTE5LCAgIDQxMTMsICAgIC0zOCwgICAtMTUzLAorICAgICAgIC0xMSwgICAgNDA1LCAgIC00NDEsICAgLTEyMCwgICAgMTM5LCAgIC0yNjUsICAgIDIyNSwgICAgMzQyLAorICAgICAgIDE5OSwgICAyMDg1LCAgICAyMzcsICAgIDI3OCwgICAgMjUyLCAgIDE1MzcsICAgIDExOSwgICAgMTgyLAorICAgICAgLTE3NCwgICAtMTkzLCAgIDI0ODYsICAgICA4NywgICAyOTAzLCAgIC0zMTEsICAgLTMwNCwgICAgMjczLAorICAgICAgLTIxNywgICAtMjU2LCAgIC0yNjQsICAgLTY3NSwgICAtODE5LCAgIC0xODgsICAgLTYxNSwgIC0xMTgzLAorICAgICAgIDQ5NSwgICAtMTU0LCAgIC02ODcsICAgMjQyMywgICAgMTk3LCAgICAtNjMsICAgLTE0NiwgICAxMTUxLAorICAgICAgIDg5NiwgIC0xMTI5LCAgICAtNTgsICAgMTExNCwgIC0xNjQ0LCAgIDEyMTksICAgLTY0OCwgICAgLTcxLAorICAgICAgLTEzMCwgIC0yNjQzLCAgICA1MzMsICAgLTIxOCwgICAzOTQyLCAgICAtODMsICAgIDIwOCwgICAtNzI0LAorICAgICAgIDE5OCwgICAtNjQzLCAgICA1OTAsICAgLTk0NCwgICAgLTU2LCAgIC00MjAsICAgIDExNSwgICAgIDIzLAorICAgICAgLTQxNCwgICAtMTQ0LCAgICAyOTUsICAgIDIxOSwgICAgLTM2LCAgICAzOTMsICAgLTE3NCwgICAgIDkxLAorICAgICAgIDI5MCwgIC03MDY2LCAgICAxNTgsICAgLTI3NSwgICAgLTcwLCAgIC0xMTksICAgICAtMSwgICAgMzAyLAorICAgICAgLTI2MiwgICAgLTczLCAgICAtNjEsICAgIDExMCwgICAtMTk2LCAgICAtMjUsICAgICA4NywgICAtNDQ2LAorICAgICAgLTE1OSwgICAgIC02LCAgIC0xMDcsICAgIDExNSwgIC03NTYyLCAgICAgIDUsICAgIC0zMywgICAgMjg0LAorICAgICAgLTEwNiwgICAgIDM0LCAgIC0xNDAsICAgIDE2MCwgICAtMzA0LCAgIC0yNzIsICAgLTE2OSwgICAgIDI1LAorICAgICAgICA5MywgICAtMjA1LCAgICAgMjgsICAgIDE2OSwgICAtMTY1LCAgICAtMzQsICAgIC01MCwgICAgMzQzLAorICAgICAgMjIwNCwgICAxNDQwLCAgICA4MTcsICAtMTkyMSwgICAtNTkwLCAgIC01MjcsICAgICA4MSwgICAtMzY0LAorICAgICAgLTM1NCwgICAgMTYzLCAgLTEwNTgsICAgMTk3NywgICAgMjQ0LCAgICAtNzUsICAgMTIwMSwgICAtMjA3LAorICAgICAgIDI5MywgICAtMjg5LCAgIC0xMDUsICAgLTEyMSwgICAzNTg4LCAgICA5MjUsICAgICAtMiwgICAtMjAxLAorICAgICAgLTg2MCwgICAgOTE3LCAgICAxMDAsICAgIDI2NSwgICAtMjAwLCAgICAtNDQsICAgLTUyOSwgICAgMzUxLAorICAgICAgLTU3OSwgICAtMTAzLCAgICAxODYsICAtMzYyMiwgICAgIDUyLCAgICAxODEsICAgLTI1OSwgICAtNDExLAorICAgICAgICAtNCwgICAtMzI4LCAgICAzODAsICAgIDUxNywgICAgMzA2LCAgICAgNTcsICAgIDM0MCwgICAgLTY1LAorICAgICAgLTI2MywgICAtMzExLCAgICA0OTQsICAgIDMyNiwgIC02MTM2LCAgICA3NDcsICAgLTE0MSwgICAgMjk2LAorICAgICAgIDIxNywgICAgIC0yLCAgIC0xMjUsICAgICAgOCwgICAgLTg4LCAgICAyNTQsICAtMjkzNCwgICAtMjU5LAorICAgICAgIDk0NiwgICAtOTA1LCAgICA2NTMsICAgIDQzNiwgICAzMzkzLCAgIC0xNDcsICAgLTE1NywgICAgIDI3LAorICAgICAgIDE2NiwgICAgMjk5LCAgICAgIDgsICAgIC0xNiwgICAgNjQzLCAgICAxMTQsICAgIDIxNywgICAgIDU3LAorICAgICAgIC0yMSwgICAtMjk4LCAgICAgMTksICAgIDEyOSwgICAxNzIxLCAgIC0xMzQsICAgMjMzNywgICAgNzgxLAorICAgICAgLTQ4MywgICAtNzQ4LCAgICAxMTgsICAgLTMzMCwgICAtMjI2LCAgLTM3NjIsICAgIDIyMiwgICAtNDE3LAorICAgICAgLTE1NCwgICAgLTI0LCAgICAtMTMsICAgMTEzOCwgICAgMjEwLCAgICAzNTcsICAgLTEyMiwgICAgMjU3LAorICAgICAgLTM2OSwgICAgODYzLCAgICAgMTMsICAgLTMyMCwgICAtNDM5LCAgIC00MzMsICAgMzQ2OSwgICAtODY5LAorICAgICAgIDExNiwgIC0yNzcyLCAgICAyMDIsICAgMTA2NSwgICAtMTMwLCAgIC0yODcsICAgIDE0MiwgICAtMjg4LAorICAgICAgICA1NCwgICAgMzE4LCAgICAxMzEsICAgIC0xNiwgICAgIDg0LCAgICAyMzgsICAgLTM2MSwgICAgOTM0LAorICAgICAgMTM0MSwgICAgIDM3LCAgICAxMzAsICAgLTQxMiwgICAgMTQ2LCAgIC03MjQsICAgICAtMywgICAtODIzLAorICAgICAgMjU1NSwgIC0xMjYzLCAgICAgMTEsICAgLTE0NywgICAzMTY0LCAgICAtODMsICAgIC0zOSwgICAtMTI3LAorICAgICAgIDI1OCwgICAgIDI2LCAgLTExODEsICAgMzMzOSwgICAtNjc2LCAgICAtMzAsICAgIC01NiwgICAgNjkxLAorICAgICAgIDg2NywgICAgNzE1LCAgIC05MDMsICAgIDI5MywgICAtMjA1LCAgIC0zOTIsICAgIC0yMiwgICAgNTI5LAorICAgICAgIC03NiwgICAyMjAxLCAgICA0MzMsICAgIDEzNCwgICAxMzM4LCAgICAtMTgsICAgICA4NSwgICAzMTI4LAorICAgICAgICAzMywgICAgOTI0LCAgICAyNTcsICAgMTY2MiwgICAtNzY5LCAgICAzMjEsICAgLTQ0OSwgICAtMzc0LAorICAgICAgIC01OCwgICAtNTk3LCAgLTE2NzAsICAgICA5NywgICAgMjIyLCAgIC05OTgsICAgIDQwNCwgICAtMTU1LAorICAgICAgIDEzMywgICAgMzU4LCAgIC0yNTAsICAgLTEyNSwgICAgMTYzLCAgIDYwMjcsICAgLTIyOCwgICAtMTE2LAorICAgICAgIC02MSwgICAtODc4LCAgIC02OTMsICAgIDcxMCwgICAtNTE2LCAgIC0xOTEsICAgIC0yNywgICAgNDQzLAorICAgICAgICA4MywgICAtMTc0LCAgIC02OTUsICAgLTExNywgICAtMTA3LCAgICAtNTMsICAgLTE0MiwgICAgIDkyLAorICAgICAgLTE0NSwgICAtMTE0LCAgICAtNjIsICAgLTcxMCwgIC0zMTkyLCAgIC04NzIsICAgMzI4NCwgICAtNTIxLAorICAgICAgIC0zNiwgICAtOTQ4LCAgICAyNTIsICAgLTI1MywgICAtMTQzLCAgICAyNjAsICAgIDEwOSwgICAgLTI0LAorICAgICAgIDI2MiwgICAtMTY5LCAgIC0xOTYsICAgIDE5NSwgICAgMTA1LCAgICAgMjcsICAgLTEzNSwgICAxNzIyLAorICAgICAgMTg2MiwgICAtNTEzLCAgIC0yNzAsICAgLTE0NCwgICAtNDE0LCAgICAtNTksICAgICA5MSwgICAtMjg4LAorICAgICAgIC05NiwgICAgLTU2LCAgIC0yMDQsICAgIDI3MywgICAgMTcwLCAgIC0xNzEsICAgIC02MiwgIC00OTkzLAorICAgICAgLTEyNSwgICAgLTY3LCAgICAtNTAsICAgIDIyNiwgICAtMjc1LCAgICA2MDAsICAgIDEwNSwgICAtMjE3LAorICAgICAgLTQ1MCwgICAgLTg3LCAgICAtMjAsICAgLTM1MywgICAgIDI0LCAgICAtNzQsICAgIDE2NywgICAxODgxLAorICAgICAtNDI2MCwgICAtMTQ0LCAgICAgNDgsICAgICA5MiwgICAgMTg3LCAgICAzMTksICAgIDM0MSwgICAgIDIyLAorICAgICAgICAtNCwgICAgNDA1LCAgICAxNDcsICAgIDIzNywgICAtMTIwLCAgICAxMjIsICAgLTIzNywgICAgIDU2LAorICAgICAgLTUxNSwgICAtMTUzLCAgICAzMzMsICAgIDgzNCwgICAgNDAxLCAgICAyMTAsICAtNTUxNiwgICAgICA3LAorICAgICAgIDEyNywgICAgMTQ3LCAgIC0xNDAsICAgLTQ3OSwgICAgLTI2LCAgLTE2NjksICAgIC0yMSwgICAtMTQ3LAorICAgICAgICA2MCwgICAgMzg3LCAgICA1NjUsICAgLTE0MCwgIC01ODI3LCAgIC0yNjksICAtMTExOSwgICAtMzI0LAorICAgICAgIDExOCwgICAtMTk5LCAgICAtMTEsICAgIDEwNSwgICAgLTQ5LCAgICAxNTAsICAgLTE0OCwgICAgMTc4LAorICAgICAgIDE4MiwgICAgMTYyLCAgICAxNTAsICAgICA2OCwgICAtMjI3LCAgICAgIDMsICAgIDIyMSwgICAtMzMwLAorICAgICAgIC0yMywgICAgIDY1LCAgIDYyNjIsICAgICA3MSwgICAgIDQ4LCAgICAtNDEsICAgIC0xMCwgICAgIC0xLAorICAgICAgIC00NCwgICAtMjU1LCAgICAtNTAsICAgLTEzOCwgICAtMTA5LCAgICAtNTQsICAgIC0zMSwgICAgNDkyLAorICAgICAgLTIxNCwgICAgMjM5LCAgIC0xOTQsICAgICAzNSwgIC02MzQ4LCAgIC0xNDgsICAgICAgOSwgICAgIDI1LAorICAgICAgLTEyMywgICAgIDg0LCAgIC00NDgsICAgIDI0MSwgICAgMTQ4LCAgICAtMzUsICAgICA1MiwgICAgIDM1LAorICAgICAgICAgNywgICAgIDk5LCAgICAtMTYsICAgICA1NywgICAgLTQzLCAgIC0yNTYsICAgMzMzNiwgICAgMzczLAorICAgICAgIDIxMSwgICAtNTEzLCAgIDIzMjgsICAgICA4NiwgICAtMjc0LCAgICAzODYsICAgICA3NCwgICAtMTc0LAorICAgICAgIDYyNCwgIC0xMDM3LCAgLTExNTQsICAgICAzNiwgICAtMjA5LCAgLTEwMjgsICAgLTEwMSwgICAtNDEyLAorICAgICAgLTEwMywgICAtMjY3LCAgIC0xMDcsICAgLTEyNiwgICAgMTYzLCAgIC0zOTQsICAtMTA5NywgICAtMTAwLAorICAgICAtMTU3NSwgICAtNTQyLCAgIDMzMjYsICAtMjE0OSwgICAgNTQ3LCAgICA2MjYsICAgLTI3OCwgICAtNDE0LAorICAgICAgLTc4MSwgICAgNDg2LCAgIC0xODYsICAgLTE1OSwgICAgMTM4LCAgIC0xODcsICAgLTgyMSwgICAgNDE5LAorICAgICAgIDM5MywgIC00MjY2LCAgICA4MjgsICAgIDQzMSwgICAgIDg2LCAgICA3NDUsICAgMTMxMywgICAxNDg0LAorICAgICAgIDI2MCwgICAgIDUyLCAgICAxNjMsICAgLTQ1NSwgIC0xMDcxLCAgICAxODYsICAgIDUyMiwgICAgMjg4LAorICAgICAgIDQyMSwgICAgIDE4LCAgICAgOTcsICAgMTI2NywgICAgMjAwLCAgIDI2MzcsICAgLTE4OSwgICAgNzI5LAorICAgICAgIDc0NiwgICAgMjAzLCAgIC02MzksICAgLTg0MywgICAyMTY0LCAgICA2NzEsICAgICA4NCwgIC0yMzg0LAorICAgICAgIDQzMCwgICAtMTYxLCAgICA0MDQsICAgIDE2NiwgICAgLTMzLCAgICAtMTcsICAgIDU5MSwgICAtMjI3LAorICAgICAtMzg0OSwgICAxNTc5LCAgICAxNzUsICAgLTcxOCwgICAgIDk5LCAgIC00MTAsICAgLTg0NCwgICAtMjM5LAorICAgICAgICAzMiwgICAgMjEyLCAgICAxNjMsICAgIDQ4MCwgICAgODQzLCAgIC0zNzksICAgLTYyMSwgICAtMzE3LAorICAgICAgLTQyNCwgICAgMTEzLCAgIC0yNjIsICAgICA0NCwgICAgLTkzLCAgICA1MjksICAgIDE0NCwgICAtMjE4LAorICAgICAgIDE0MCwgICAzMjU3LCAgIC01NzUsICAtMjY5NywgICAgMTQ0LCAgICAtODMsICAgLTE4NiwgICAgLTQ0LAorICAgICAgIDk3NywgICAgMTUzLCAgIC0yMzAsICAtMTUzMCwgICAgMjM0LCAgICAyMTIsICAgIDIxMiwgICAgMzMxLAorICAgICAgIDQxMiwgICAtMTI1LCAgICAgLTMsICAgIDQyMiwgICAtMzI5LCAgLTIxODEsICAgMTQwNiwgICAgMzYzLAorICAgICAgIC05MCwgICAgLTg2LCAgICAzMjksICAgLTI2NywgIC00NDYyLCAgIC0xODksICAgIC04NywgICAgMTU0LAorICAgICAgICA2NiwgICAtMjAwLCAgICAgMzcsICAgICA4MCwgICAtMTA5LCAgIC0xOTksICAgIDEyNSwgICAxOTgzLAorICAgICAgIDI2MCwgICAtNDM4LCAgLTI0MTcsICAgMzI1OSwgICAtOTc0LCAgICA0NTMsICAgICA0MSwgICAgLTc3LAorICAgICAgLTUzOCwgICAxMTIzLCAgICAxMTksICAgIDEyMCwgICAgMjU0LCAgIC0yMzksICAgLTEzNCwgICAgIDMzLAorICAgICAgLTM4NCwgICAtNDA3LCAgICAgMjcsICAgIDQ2NSwgICAxODEwLCAgIC05MTAsICAgIDk4MCwgICAgLTE1LAorICAgICAtMTMwNywgICAtOTE5LCAgIDE4ODAsICAgLTMyNywgICAtMzAzLCAgIC0xOTgsICAgIDE0OSwgICAgNDEzLAorICAgICAgMjE3NiwgICAyMjY5LCAgIC03MDcsICAgIDM0MywgICAgMzYwLCAgICAxNjksICAgIDE0OCwgICAgMTgyLAorICAgICAgIDEwNCwgICAgMTYzLCAgICA4NTcsICAgIDI5MSwgICAtMTUzLCAgICAzMDMsICAgLTY3OSwgICAtMzg2LAorICAgICAgLTg2OCwgICAyMjgzLCAgIC0zMjAsICAgIDE2NywgICAzMjU3LCAgIDE3NDEsICAgIDMzOCwgICAgNDY3LAorICAgICAgIDIwOSwgICAgMjA3LCAgICA4MzQsICAgLTIyNiwgICAtNDc5LCAgIC0xMjAsICAgMTY3NCwgICAgLTYxLAorICAgICAgIDY5NiwgICAgLTkzLCAgLTEzMjcsICAgMjE3NiwgICAgNzE2LCAgICA0MDIsICAgMTY4OCwgICAyMjE5LAorICAgICAgLTMzOSwgICAgNzc5LCAgICAzNjYsICAgIDM1OCwgICAgMjQxLCAgIC02OTUsICAgLTI3MiwgICAtMTM2LAorICAgICAgIC00OCwgICAgIDM2LCAgIC0yNjksICAgIDg2MiwgICAtNjE2LCAgIC0xMTgsICAtMjAyOCwgICAxNjc4LAorICAgICAgMTk3MSwgICAgMTE1LCAgICAyOTAsICAgICA3MSwgICAtNzY1LCAgICAgMzEsICAtMjg3NCwgICAgMTIyLAorICAgICAgICAxMywgICAtNDI0LCAgIC0yODEsICAgLTMyMCwgICAgMjMzLCAgLTEwMzIsICAgICA0MCwgICAtMTg2LAorICAgICAgMTIwOCwgICAgMjc0LCAgLTIzMTAsICAtMTU5NCwgICAgMjg5LCAgICAyMzAsICAgMTI2NCwgICAgOTYyLAorICAgICAgLTMxMCwgICAgIDIzLCAgIC01NDgsICAgICAxMiwgICAgLTM4LCAgLTI3MzQsICAgIDY2NCwgICAgIDM3LAorICAgICAgIDM0NiwgICAtNjIwLCAgICAyNjYsICAgIC05OCwgICAgIDgyLCAgIDIzNjksICAgIDk2MywgIC0xMzkxLAorICAgICAgLTQ1MSwgICAgODMzLCAgICAgODIsICAgIDE3NSwgICAgNDQ4LCAgIDE4NzQsICAgIDM0NSwgICAtNDQwLAorICAgICAgIDE1NSwgICAgMTMwLCAgICAgOTQsICAgIDMyNiwgICAzMjIzLCAgICAyMzQsICAgLTE2MywgICAtMzg0LAorICAgICAgLTM1NCwgICAtNTM5LCAgICA4MjcsICAgICAtOSwgICAgNTMwLCAgIC0yMjYsICAgIC0yMSwgICAgMzMyLAorICAgICAtMjI5OCwgICAzMjIxLCAgIDE0NzAsICAgLTI4MiwgICAtODAwLCAgICAyMzEsICAgIDMxNCwgICAtOTk4LAorICAgICAtMTA1MSwgICAtNjQ4LCAgIC00MzQsICAgIDc0MywgICAgLTcyLCAgICAxMTksICAgICA5MSwgICAgNDE0LAorICAgICAgIDM3OSwgICAxMzcwLCAgIC02MzcsICAgLTk5OCwgICAgODUxLCAgLTI5MDQsICAgLTI2NiwgIC0xNjUyLAorICAgICAtMTM1NiwgIC0xMzM5LCAgLTE2NzksICAgLTE4MSwgICAgMjQ1LCAgICA3MzEsICAgLTIzMSwgICAgIC0yLAorICAgICAgIDIyMSwgICAtMTgyLCAgIC0zMjUsICAgLTQxMSwgICAgMzQ2LCAgICAyNDYsICAtMjYyOSwgICAxNzM2LAorICAgICAgLTM2MSwgICAgIDI0LCAgICAyMjksICAgMTE2OCwgICAgNzQ3LCAgICAzMDksICAgIDQyNSwgICAtMTI4LAorICAgICAgLTMyMCwgICAtNDk2LCAgICAxMDksICAgMTQ5NiwgICAgLTcwLCAgIC03OTcsICAgICAzNywgICAtMjcxLAorICAgICAgIC0zOSwgICAgOTA2LCAgICAtNjIsICAgLTE5NCwgICAxNzUzLCAgICAzMTEsICAgIDY4OSwgICAxMzU0LAorICAgICAtMTAzNSwgICAtOTczLCAgIC00MzgsICAgMTE2NiwgICAyMTk3LCAgICAtOTksICAgLTM4MCwgICAtMjc0LAorICAgICAtMTU2NSwgICAgNDQ3LCAgICAxMDAsICAgIDM0OSwgICAgNDg1LCAgICA2NTMsICAgIDc0NCwgICAgIDUwLAorICAgICAgLTU4MiwgICAtMTIzLCAgLTEzOTYsICAgIDE1NiwgICAgLTI3LCAgICAzNDksICAtMTA2NywgIC0xMzgyLAorICAgICAgMTM4OCwgIC0xMDYxLCAgIC01NTQsICAgIDg5NCwgICAgLTgwLCAgIC03ODMsICAtMTUwMCwgICAtNzM2LAorICAgICAgIDg5NywgICAxMTU4LCAgLTEzODYsICAgIC00MCwgICAtMjgwLCAgIC04MTksICAgLTY3MiwgICAtODk1LAorICAgICAgIDk5NCwgICAtMzA4LCAgIC00NjYsICAgLTU3OCwgICAgNDU1LCAgLTE1MzYsICAgIDg3OSwgICAtNDQ4LAorICAgICAgIDU0MiwgICAxNTA4LCAgICA4NTAsICAtMjQ2NSwgICAgODE2LCAgICA2NDEsICAgLTQyNywgICAgMzEwLAorICAgICAgLTE2OCwgICAgLTQxLCAgIC05MDgsICAgLTMwMiwgICAxNTEzLCAgICAtMjksICAtMTE0NCwgICAgNTg4LAorICAgICAtMTcwMywgICAxMTQ0LCAgIDI2MjMsICAgICA5MCwgICAgMjg0LCAgICA4NjYsICAgIDMzNSwgICAtMzUxLAorICAgICAgIDQxOSwgICAtNzQ1LCAgICA4NzksICAgLTE4MywgICAtODI0LCAgLTE3MTMsICAgIC0zNCwgICAgLTE1LAorICAgICAgLTkxMywgICAgIDM3LCAgIC00NjAsICAgIDc3OCwgICAyMTMwLCAgIC0xNDUsICAgLTE1MywgICAxNzYxLAorICAgICAgMTQyMCwgICAtMjQzLCAgICAtMzIsICAgLTg3NywgICAgMTQwLCAgIC03MDAsICAgIDYxMiwgIC0yMDUzLAorICAgICAgIDMyMSwgICAgLTc4LCAgIC0xNjUsICAgIDIwMCwgICAgNTI2LCAgLTEwMDIsICAgMjE3NiwgIC0xMDIyLAorICAgICAgMTQzNiwgICAgMjk4LCAgICAtMjEsICAtMTM3OCwgICAgNTE1LCAgICAzMDQsICAgIDk3NCwgICAxNzIyLAorICAgICAgMjA1NCwgICAgNjYxLCAgICA0MjUsICAgIDI4MiwgICAgNDcxLCAgICA0MzgsICAgICA3MCwgICAgMTY5LAorICAgICAgMTU4NywgIC0yMDc2LCAgICAtNDAsICAgLTcwMiwgICAgMjY0LCAgIC0xNDYsICAtMTQ5OSwgICAtODYzLAorICAgICAtMTc3NSwgIC0xMDU5LCAgIC00OTAsICAgICA5MiwgICAgNjMxLCAgLTExOTQsICAtMTAzMSwgICAgMzM1LAorICAgICAgIDI1NywgIC0xMjk5LCAgICAyNDEsICAgLTI3MCwgICAtMzI1LCAgIC0zMjIsICAgIC0zNywgICAgICAwLAorICAgICAgLTY4NSwgICAgODk3LCAgICA5ODQsICAgLTkwOSwgICAxNTU2LCAgIDEyODEsICAgMTM2NywgIC0xMjY5LAorICAgICAtMTU5MSwgICAgNDE1LCAgLTExNTYsICAgLTM3NCwgICAtMTEwLCAgIDE1NTIsICAgLTY5NSwgICAgIDc0LAorICAgICAgLTE2NywgICAtNDczLCAgIDE0MjEsICAgLTYxMSwgICAgMTc1LCAgIDE1MjEsICAgMTMyMiwgICAgNDM2LAorICAgICAgMTk2OSwgICAtNzg3LCAgIDEwNDEsICAgLTczMCwgICAtNTk4LCAgICAxODgsICAgLTc5NCwgICAtNTMxLAorICAgICAtMjE5OCwgICAtMzE3LCAgICAtMTEsICAgICAtOCwgICAtNDA3LCAgICAxOTgsICAtMTE4MCwgIC0xNjc1LAorICAgICAgIDE3NCwgICAgOTgxLCAgICA0NjcsICAgLTE0OSwgICAtODkwLCAgICAyNjMsICAgMTAzMCwgICAtMTIxLAorICAgICAgMjE0NywgICAtMTM1LCAgIDE5NzUsICAgLTYzNCwgICAgNDMxLCAgIC0yMzgsICAgLTY5NSwgICAxMzM4LAorICAgICAgLTE3MiwgICAgMTEwLCAgICAxNDcsICAgLTMzNCwgICAtNzI2LCAgICAgNjUsICAgLTg3MywgICAgNjY3LAorICAgICAgIDk5NywgIC0xMTE4LCAgIC0zMzksICAgIDE0NCwgICAtNzAwLCAgIDEzMDMsICAgLTIwNywgICAtNjA5LAorICAgICAtMTYxNywgICAtNzY1LCAgICA4MzksICAgIDUwNSwgICAgLTM2LCAgICAtNTgsICAtMjg5NCwgICAgMjI2LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2I0NDQwc2wwW10gPSB7CisgICAgIC0zNjI0LCAgIC00OTUsICAgIDE1OCwgICAtMjQ2LCAgIC01MjksICAgLTgxMywgICAgNjg5LCAgICA1MDQsCisgICAgICAtNTI3LCAgLTIyMTYsICAgLTE5OCwgICAtMzIzLCAgIC02OTAsICAgLTU5MSwgICAgMTc1LCAgICAyNjIsCisgICAgICAgMjQzLCAgLTM2NzYsICAgMjY0OCwgICAtOTg2LCAgICAxNjYsICAgIDI0MywgICAgMzAxLCAgIC03MDAsCisgICAgICAgMzI0LCAgIC0zMjQsICAgICAxMywgICAgMzYyLCAgICAyMjIsICAgLTQ3MCwgICAgIDMwLCAgICAgMjAsCisgICAgICAgLTQ2LCAgIC0xNDcsICAgNDA1MCwgICAgLTk3LCAgIC01NjAsICAgIDI4NCwgICAgMzE3LCAgLTE2MTEsCisgICAgICAgNjU1LCAgIC00MTYsICAtMTU4MiwgICAtNjc1LCAgICAzODksICAgLTEyNCwgICAgMTUwLCAgICAtMjcsCisgICAgICAgMzI1LCAgICAtODQsICAgICA0OCwgICA3NDc0LCAgICAgOTcsICAgIDEwNSwgICAgIDE5LCAgICAgMzgsCisgICAgICAgMTMzLCAgICAgMTksICAgICAyOCwgICAgIDI1LCAgICAgNDAsICAgICAzNCwgICAgLTU5LCAgICAgMjIsCisgICAgICAgIDExLCAgICAgMjcsICAgICAyMSwgICAgICA1LCAgLTE1OTYsICAgLTQyOCwgICAgNDM5LCAgICAzNTMsCisgICAgICAyMjg4LCAgICAtMTgsICAgIDM1NywgICAtMjc0LCAgIDI1ODIsICAgLTEyNiwgICAgLTkwLCAgICAgNzEsCisgICAgICAgIC05LCAgIC03MDQsICAgIDIwNSwgICAgIDIyLCAgICAgNDQsICAgLTEyMCwgICAgLTQzLCAgICA1MTcsCisgICAgICAgODE3LCAgIDEzNzAsICAgMjE1MSwgICAyODE4LCAgIC00NzAsICAgICA5MCwgICAgMzk1LCAgLTEyNDMsCisgICAgICAtMzQ1LCAgICA5NTksICAgICAxOSwgICAgIC0xLCAgICAxMjMsICAgLTEwOCwgICAgMzQ3LCAgICAgMjUsCisgICAgICAtMTM4LCAgICAgMTUsICAgIDExOSwgICAtMTE3LCAgIC0xNDYsICAgIDE0MiwgICAgMTgzLCAgIC0yNTQsCisgICAgICAtMjc2LCAgIC0xNzQsICAgNTk4MCwgICAgMjgzLCAgIC0zMTcsICAgICA3MCwgICAgIDUxLCAgICAtMTUsCisgICAgIC0yNDQ3LCAgICAtNzksICAgIDIzNCwgICAgNzM2LCAgLTI2MDAsICAgLTY0MSwgIC0xMTYyLCAgICAzNzYsCisgICAgICAgOTU5LCAgIC0yNTAsICAgIDcwMSwgICAgLTQwLCAgIC0xMDIsICAgIDIwNCwgICAgLTM4LCAgICAtMjQsCisgICAgICAtODkzLCAgIC0zODcsICAgIDMzOSwgICAxMzM4LCAgICAtOTEsICAgLTY1NSwgICAtODY0LCAgICAgNzgsCisgICAgICAgMjk5LCAgICAyMjgsICAtMjczMiwgICAgMjM0LCAgIDE5OTUsICAtMTMyMSwgICAtMTM5LCAgICA1MDAsCisgICAgICAtMzE2LCAgIC0xNDAsICAgICAgMiwgICAgLTgwLCAgICAxODYsICAgICAxMSwgICAgIDE2LCAgICAtNjksCisgICAgIC03NTM0LCAgICAgODUsICAgLTI2MywgICAgMTg5LCAgICAgLTcsICAgICAtMSwgICAgLTY3LCAgICAtNjgsCisgICAgICAgICAzLCAgICAgMjQsICAgIDM5MSwgIC0zMjk5LCAgLTI5NTIsICAgLTEyMSwgICAtMzkzLCAgICAxMDMsCisgICAgICAgLTYwLCAgIC0xMTMsICAgIDE0MSwgICAgMTg1LCAgIC0xMTksICAgIDI0MCwgICAgMjcwLCAgIC0zOTIsCisgICAgICAtMTA1LCAgICAgIDksICAgIC0zOSwgICAyNTI5LCAgICAtMTcsICAgIDM1MywgICAyOTY2LCAgIC04NTUsCisgICAgICAxMDQyLCAgIDEyOTQsICAgIDEzMiwgICAtMjU3LCAgIC0yNTcsICAgLTQ5NiwgICAgMTEyLCAgIC0xNzksCisgICAgICAgNDI0LCAgICA0ODYsICAgIC02MywgICAgIDc3LCAgICAyNzUsICAgLTE5OCwgICAyMDI2LCAgIDE2NTcsCisgICAgICAgOTEzLCAgIC0yNTUsICAgLTE0NywgIC0xNzQ4LCAgICAgLTUsICAgIDQxOCwgICAgMzU2LCAgIDIwMjIsCisgICAgICAgOTI3LCAgIC0yOTUsICAgIDE5NCwgICAgMTY1LCAgICAgMjgsICAgIDEwOSwgICAgIDEzLCAgICAyMDksCisgICAgICAtMTMzLCAgLTI4MDIsICAgIDQyMCwgIC0xODczLCAgIC02NDgsICAgIDMwOSwgIC0xMTcyLCAgLTE4MjUsCisgICAgICAgLTM2LCAgICA4NDAsICAgIDI4MCwgICAgIDQ0LCAgIC0xMTgsICAgIDEyOCwgICAgIDM0LCAgICAyNDEsCisgICAgIC0xMDA1LCAgIDExNjAsICAgLTMwMywgICAgMzE4LCAgICA3MjYsICAtMTcxNiwgICAyNjI1LCAgIC05NTAsCisgICAgICAtODM5LCAgLTEyNTcsICAgLTkwMSwgICAtMjM4LCAgIDExMjMsICAgIDEzMSwgICAgMjUyLCAgICAgIDEsCisgICAgICAgNDQwLCAgIDE0NTUsICAgIC0xNCwgICAtMjc0LCAgIC00NjEsICAgICA4NywgICAtNTE1LCAgLTIyOTksCisgICAgICAgOTI4LCAgLTI4NjcsICAgLTgwNCwgICAtMjE1LCAgICA2ODAsICAgIDE0NywgICAgIDgwLCAgICAyMTUsCisgICAgICAgIDE1LCAgIDEzMzksICAgIDE0MSwgICAgLTk1LCAgICAxMzQsICAgIC0zNSwgICAgMTIyLCAgICAgNTMsCisgICAgICAgNDI5LCAgICAxNjgsICAgIDQ3NiwgICAgLTQ1LCAgICA3NDUsICAgIDIzNiwgICA0MjI5LCAgICAzMTgsCisgICAgICAgMjQ3LCAgIC0yMDEsICAgLTM3MiwgICAyMjg5LCAgICAxNjEsICAgIDQzMSwgICAgMzM3LCAgIC03MDcsCisgICAgIC0xMDI0LCAgICAxMjEsICAtMTc3MywgICAtNzk1LCAgLTExODcsICAgLTQwMSwgICAgMzk0LCAgLTE0MzEsCisgICAgICAxNTI2LCAgICAtMzUsICAgIDQzMiwgICAyOTI5LCAgICAgOTAsICAgMTg4MCwgICAgNjI4LCAgIDEyOTgsCisgICAgICAtNTUyLCAgIC00OTgsICAgIDIwNywgICAgLTk3LCAgLTE0MzEsICAgMTEwNSwgICAgIDI5LCAgIC03MzksCisgICAgICAgLTU2LCAgICAgNjIsICAgICA5NCwgICAgNTM3LCAgIC03MzIsICAgMTI1NSwgICAtNzY2LCAgICAyMDAsCisgICAgICAtMzY1LCAgIDI4NDYsICAgMjEzOSwgICAgNDM1LCAgICAgOTIsICAgLTcxMCwgICAtNTEyLCAgICAzNjAsCisgICAgICAtMzM5LCAgIDEwMjEsICAgIDQ3NCwgICAtMTMyLCAgICA0MDUsICAgLTQ0MCwgICAzNDM1LCAgICAgNzUsCisgICAgICAtMjU0LCAgLTI0NDMsICAgLTg4MCwgICAgMzI1LCAgICAzNDMsICAgIDI4NSwgICAgMjMwLCAgIC00MzEsCisgICAgICAtMTkxLCAgICAyMTUsICAgIDIwMSwgICAtNDQzLCAgICAgOTMsICAgIC04MSwgICAtMTMxLCAgIDI5ODEsCisgICAgIC0yOTg2LCAgIDEwMDMsICAgIDQzNywgICAgNDM0LCAgIC0zODYsICAgICAxNywgICAgMjIyLCAgICAgNzAsCisgICAgICAgMTczLCAgIC01NTAsICAgIDI2NywgICAtMTIxLCAgICAtNDMsICAgIDExNCwgICAgLTExLCAgIC03OTUsCisgICAgICAgNTYxLCAgIC0xNDcsICAgIDE4NywgICAtMTk4LCAgLTQ5NjksICAgICA1MCwgICAgIDU5LCAgICA2NzQsCisgICAgICAtODUzLCAgICAxNjMsICAgICA3MSwgICAtMjA1LCAgIC0yODQsICAgIC01MCwgICAgLTI4LCAgLTE0MTIsCisgICAgICAtMTA1LCAgICAyNjIsICAgIDI3MiwgICAgNTY1LCAgIC04MjQsICAgLTU0MSwgICAzMzgxLCAgICA0MzAsCisgICAgICAgLTgxLCAgICAyMjgsICAgLTQyNiwgICAgOTc4LCAgIC0yOTQsICAgIDQyMiwgICAtNTM4LCAgICAgMTMsCisgICAgICAgICA5LCAgICA0MzAsICAgIDE4MCwgICAyMzI5LCAgIC01NjQsICAtMTA4MiwgICAxNzQwLCAgIDExMDgsCisgICAgIC0yMDExLCAgICAgMTEsICAgIDM0MywgICAgODY4LCAgICA3MjMsICAgLTgwNiwgICAgMzQyLCAgICAzMzksCisgICAgICAtMTQxLCAgIC0xNzMsICAgIDE4NiwgICAgIDUwLCAgICAyOTcsICAgIDcwNSwgICAgNzgzLCAgIC01OTMsCisgICAgICAxNjA5LCAgICAyMTIsICAgIDUyOCwgIC0yNTQ3LCAgIC04NjMsICAtMjQ1NywgICAtODc2LCAgICAxNjQsCisgICAgICAgMTYyLCAgICAzNjUsICAgICA2OCwgICAgIDMwLCAgICAgMTEsICAgICA0OCwgICAgIDQ3LCAgIC0yODUsCisgICAgICAgLTY0LCAgICAxNjYsICAgIC0yMSwgIC02ODgwLCAgIC0xOTEsICAgLTIyNiwgICAgIDg5LCAgICAgLTEsCisgICAgICAgIDIyLCAgICAtOTMsICAgICAtNiwgICAgIDQ0LCAgICAyODIsICAgICA1MiwgICAgMjk0LCAgIC02OTAsCisgICAgICAtMTQ3LCAgICAzNzIsICAgMjI0NywgICAgODA0LCAgIC02MzcsICAgICA1NCwgICAyMzg1LCAgLTE3OTksCisgICAgICAgMzE1LCAgIC05MjksICAgIDY5MiwgICAgLTY1LCAgICAtNTQsICAgIDIxOCwgICAtNzUyLCAgIC01MTksCisgICAgICAyMTcxLCAgICAxNzcsICAgIDkwNywgICAgIDIyLCAgIC03NzgsICAtMjY1NiwgICAgIDYyLCAgIC00MTgsCisgICAgICAtNDM0LCAgICAzMDcsICAgMTkwNiwgICAtMjgwLCAgICAxOTYsICAgICA3NiwgICAgIDU4LCAgICAtNDYsCisgICAgICAgIDcwLCAgIC0zNjcsICAgIC02NywgICAgIDUwLCAgICAxMjUsICAgICA3NywgICAtNTQ3LCAgIC0yODcsCisgICAgICAgLTk3LCAgICAtMTAsICAgIC04NCwgICAtMjcxLCAgLTQ4NTYsICAgICAxMCwgICAgNDkwLCAgIC01NjAsCisgICAgICAgLTIxLCAgICAgNjYsICAtMjQ2OSwgICAtMzIyLCAgIDEwMjEsICAgIDkzNiwgICAgNjI1LCAgLTI1MjAsCisgICAgICAxMTQ0LCAgIC0zNzMsICAgIDI3MCwgICAgODA0LCAgICA2MDMsICAgIC05MSwgICAgMjYyLCAgICA2NTksCisgICAgICAgICA5LCAgIC0zMjQsICAgICA1MCwgICAtNzEyLCAgIDI3MDUsICAtMzAxNiwgICAgNTk0LCAgICAgODcsCisgICAgICAgLTg4LCAgICA2OTcsICAgLTIwNSwgICAtNzk5LCAgIC0xMjgsICAgICAzNywgICAgNTA0LCAgICAgNTksCisgICAgICAtMjc0LCAgICA2NTUsICAgIDY3MiwgICAgLTIwLCAgIDEyOTQsICAgLTIyMSwgIC0yOTU0LCAgICAxOTgsCisgICAgICAgNjc0LCAgLTE2NzYsICAgIDg2MywgICAgMzI0LCAgICA5NjgsICAgIDczMSwgICAxMTI1LCAgICAtNDEsCisgICAgICAtMTQ5LCAgIC0zMDMsICAgIDIyMywgICAxMzcwLCAgICAtNjcsICAgLTE5NCwgICAgIC0xLCAgIC0xOTQsCisgICAgICAgMjUxLCAgIC00NTksICAgIC0zOSwgICA0NDc3LCAgICAxMTMsICAgIC03NCwgICAtMzg2LCAgICAyMTQsCisgICAgICAgLTcyLCAgICAtNzcsICAtMTU5MywgICAgNTExLCAgIC00NjEsICAgIDc1MiwgICAtNTU5LCAgIC00NzYsCisgICAgICAgMjA0LCAgIC03MjIsICAgMTA1MCwgICAyMDgwLCAgIDI0NjgsICAgLTE1NCwgICAtMjA4LCAgICA5NjQsCisgICAgICAgMTAzLCAgICAtNTgsICAgIDM5MCwgIC0xODYzLCAgICA5MTAsICAgLTMwNywgICAgMjA5LCAgICAtMzIsCisgICAgICAgNjYzLCAgICAxMDMsICAgLTEzMywgIC0zMTM3LCAgIC00MjMsICAgIDI1OSwgICAtNjA1LCAgIC0yNDIsCisgICAgICAgMTM5LCAgIC0zOTEsICAgLTQ4OCwgICAgIDc3LCAgIC0yNjYsICAtMTY5NCwgICAgMzk3LCAgIC02NTksCisgICAgICAgMjM3LCAgIDIwNjgsICAgICAtMywgICAtODY3LCAgICA4NzAsICAgMTY0NywgICAgNjQ1LCAgIDE4NDgsCisgICAgICAgIDY4LCAgICAzODIsICAgIDQ1NSwgICAtNTUxLCAgICAtODcsICAgIC05OSwgIC0yOTI2LCAgICAzNzIsCisgICAgICAyNDM4LCAgLTExNjYsICAgICAtNiwgICAgNTIxLCAgIC0xOTUsICAgMTI1OSwgICAtMTYyLCAgICA5MTcsCisgICAgICAgMTQwLCAgICAyNzUsICAgLTI3MywgICAgMTMzLCAgICAzMTgsICAgIC0yNSwgICAgMjUyLCAgIC0xMTksCisgICAgICAtMTMyLCAgIDMxMjAsICAgIDM5NywgICAgMzk4LCAgIC00MjAsICAgMTc1NiwgICAgNjY2LCAgIDIxNzYsCisgICAgICAtMTQxLCAgICAyNzEsICAgIC01MSwgICAgIDIyLCAgIC00OTQsICAgIC0zNiwgICAgIDU3LCAgICAzMDgsCisgICAgICAgMjIyLCAgIDM1ODUsICAgICAxNiwgICAtMjY1LCAgIDI2MjgsICAgIC0yNCwgICAgMTYyLCAgICAgMTMsCisgICAgICAtMjQwLCAgICAtOTYsICAgIDYyMCwgICAgMzMxLCAgIC00NDksICAgIDcxMCwgICAtMTIzLCAgIC0xMDUsCisgICAgICAgIDIzLCAgIC0xNzAsICAgICAyMCwgICAgMjU2LCAgLTUyMjgsICAgIDM5OCwgICAtMTg2LCAgICAyNzIsCisgICAgICAgMTI5LCAgICAxNzUsICAgIDU5OCwgICAgLTE2LCAgIC01MDIsICAgICAxMSwgICAtMjE1LCAgICAgMjgsCisgICAgICAtMTEwLCAgIDM1NzAsICAgICA2OCwgICAgMTk5LCAgLTI1MzUsICAgLTkzMywgICAgNzgxLCAgIC03NjIsCisgICAgICAgMzI1LCAgICAgMTgsICAgLTQzOCwgICAtMzE5LCAgICA0NzMsICAgLTY3NywgICAgMTc2LCAgICAyOTAsCisgICAgICAgICAwLCAgICAgNjcsICAgICAtNiwgICAtMTU2LCAgICAgMzEsICAgICAzNSwgICAtMTMxLCAgIC0xMjcsCisgICAgICAgIDI0LCAgIC0xMDAsICAtNjgyNiwgICAtMTE3LCAgICAtNTMsICAgIC00MCwgICAgIDk5LCAgICAtNTAsCisgICAgICAgLTkzLCAgICAgMzEsICAgICAzNCwgICAtMjUxLCAgICAxODYsICAgIDQ4NywgICAtMjAzLCAgIC02NjIsCisgICAgICAtMTgyLCAgICAtOTYsICAgIDIzOSwgICAgMzA4LCAgICAzMzgsICAgIC04NiwgIC00ODcxLCAgICAyNjQsCisgICAgICAgLTQ4LCAgICAzMTQsICAgIC02NiwgICAgMTAwLCAgIC0xODgsICAgIDE1MSwgICAgIDI0LCAgICAxOTgsCisgICAgICAgICA0LCAgIDUwNDYsICAgIC00NywgICAtNjU0LCAgICAtNDMsICAgICA0MSwgICAgMTA5LCAgICAxMDMsCisgICAgICAtMjYyLCAgICAgOTMsICAgLTExOCwgICAgLTYzLCAgICAgNTgsICAgMjA4OCwgICAgMzM2LCAgIC0zMjAsCisgICAgICAyMzI2LCAgICA1NDgsICAgLTgxMCwgIC0xMzE1LCAgIC04NjQsICAgIDQ2MSwgICAgMTcxLCAgICAgNzYsCisgICAgIC0xMTA5LCAgLTE1MTAsICAgLTg3NCwgICAtNjIwLCAgICAgOTcsICAgICA4OCwgICAgIDQwLCAgICAgLTQsCisgICAgIC03Mjk1LCAgIC0xMjgsICAgIC0zOSwgICAgIDIzLCAgIC0xMDAsICAgICAtOSwgICAgLTc0LCAgICAxMTIsCisgICAgICAtMTUxLCAgICAgNjcsICAgICAyMSwgICAgIDUzLCAgICAgIDIsICAgIC0yOSwgICAgLTMzLCAgICAgNTIsCisgICAgICAzMjg3LCAgLTIxNzgsICAgIDYyNiwgICAgMzM5LCAgIC04MTcsICAgIDM0OSwgIC0xMTg3LCAgIC01NTAsCisgICAgICAtMzkwLCAgICAgNTcsICAgIC00MSwgICAgMjk1LCAgICA3NTYsICAgIDE4NSwgICAtMjE1LCAgICAgMTcsCisgICAgICAgICAzLCAgIDc1MDIsICAgLTEzNCwgICAtMTIyLCAgICAtMzEsICAgIC01MywgICAgIDkxLCAgIC0xNzAsCisgICAgICAgLTcxLCAgICAxMzMsICAgIC0zNCwgICAgIDU3LCAgIC0xMTIsICAgICAtNSwgICAgLTY2LCAgICAgMTcsCisgICAgICAgICAxLCAgIDIzMjgsICAgMzcxNCwgICAgMjE0LCAgIC0xMjMsICAgLTgzOSwgICAgICA5LCAgICAtNjIsCisgICAgICAgIDU0LCAgICAgNzAsICAgIC0xOCwgICAgODE3LCAgICAxODYsICAgIC02MSwgICAtMjUyLCAgICAgMzcsCisgICAgICAgIDk4LCAgICAgIDksICAgMjAxMCwgICAgNzM4LCAgLTE2NTEsICAtMTkyNCwgICAxMTA2LCAgIC02MjQsCisgICAgICAgMTQzLCAgIC01NDgsICAgIDg0NywgICAtMTk4LCAgIC0xNDAsICAgLTY5MSwgICAgNDc4LCAgIC03NTgsCisgICAgICAgIDU2LCAgICAgNTQsICAgICAtNywgICAgMjA5LCAgLTI2NjUsICAgIDEwOSwgICAtMTI3LCAgIC0xMzQsCisgICAgICAyMDk5LCAgICAzMzMsICAgLTYwMiwgIC0yMjE3LCAgIC03NDMsICAgIDM0NiwgICAgIDc0LCAgICAyMTYsCisgICAgICAgNTc5LCAgICAyMjMsICAgICA2MSwgICAgLTMwLCAgICAgNTcsICAgICA5NCwgICAgMjI0LCAgLTI1OTUsCisgICAgICAtNTY2LCAgIC04NTEsICAgIDI0NiwgICAgMzE0LCAgICAgNjUsICAgMjg1NywgICAgMTE0LCAgIC03NjAsCisgICAgICAgIDc3LCAgIC02MTEsICAgIDExOSwgICAgMTgxLCAgICAgIDQsICAtMjU1NiwgICAgMTI3LCAgICAxMzgsCisgICAgICAtMTY0LCAgIC0yMTksICAgLTExNiwgICAgMTU3LCAgLTMxNDMsICAgIDE5NywgICAgLTk4LCAgLTEwNDAsCisgICAgICAgMjM1LCAgIC0zMzIsICAgLTQyNCwgICAtMTUyLCAgIC0zMzgsICAgIC0zMywgICAtMjIwLCAgICAyMDcsCisgICAgICAgMjU0LCAgIDU0NjksICAgLTEwMiwgICAtMzkwLCAgIC0xMjUsICAgLTQyMCwgICAgMTEzLCAgIC0yMzMsCisgICAgICAgMzI5LCAgICAtMzQsICAgIDEwOSwgICAtMTcxLCAgICAxMDMsICAgICA1MCwgICAgIDU4LCAgICAgOTYsCisgICAgICAtNTAwLCAgLTIzMTcsICAgLTI1OSwgICAyMTc4LCAgICAxMDksICAtMjAzMCwgICAgNzU5LCAgIC03ODAsCisgICAgICAgNDQ4LCAgICA2NzgsICAgLTM4NCwgICAtMjcxLCAgICAyMTMsICAgIDMzNCwgICAtMjcxLCAgICAgMjMsCisgICAgIC0xMTIxLCAgICA2MzYsICAtMTEwMywgICAtNDgyLCAgLTMwNTksICAtMTIwMCwgICAxMTYwLCAgICAxMDksCisgICAgICAtMjMyLCAgICA1NDEsICAgLTc4OCwgICAgMTMwLCAgIC0xNjYsICAgLTMwMCwgICAgNjY0LCAgICAyMzMsCisgICAgICAgLTk3LCAgICAtMjksICAgLTI4NiwgICAgIDMzLCAgIDEyNzIsICAgLTI5OCwgICAtMzgyLCAgIC0yNDIsCisgICAgICAtMTk5LCAgICAgNDcsICAgIDQ3OSwgICAgMjI0LCAgLTE3NjEsICAtMTkwNCwgICAxNzgwLCAgIDE0MzksCisgICAgICAtNjgxLCAgLTE5NzMsICAgLTExOCwgICAgLTkwLCAgIC0xNDgsICAgIDI0NywgICAtNzU4LCAgIDE5MzYsCisgICAgICAgMTgyLCAgIDEzNzMsICAgMjM0NiwgICAgMTIwLCAgIC03NTgsICAgLTQ3NiwgICAxNzg5LCAgIDExNzcsCisgICAgICAgNjExLCAgIC0zOTQsICAgIC0xNCwgICAgLTM5LCAgIC05OTQsICAgLTY3NCwgICAxMDQ5LCAgICAtNDEsCisgICAgICAgODM2LCAgIC0zOTEsICAgIDk0MiwgIC0xMDQwLCAgLTE0MzcsICAgMTM3NiwgIC0xOTE2LCAgIDExMjksCisgICAgIC0xMDE4LCAgIC02NTMsICAgMTI4NCwgICAgLTcyLCAgIC0xNjYsICAgIDMyMSwgICAgMTk0LCAgIC0xNDIsCisgICAgICAtMTUxLCAgICAtNzcsICAgIDI1MSwgICAtMTYyLCAgICA3MzIsICAgLTc5MCwgICAgMTA3LCAgIC0yOTIsCisgICAgICAtNjc1LCAgLTQyNDgsICAgIC01MSwgICAgLTg2LCAgIC0yOTksICAgLTQ5NSwgICAgNDEzLCAgIC0xMjgsCisgICAgICAtNDU1LCAgIC0xMDUsICAgLTg0MiwgICAgODgxLCAgIC00OTIsICAgMTI0MSwgIC0xNDMyLCAgLTEyOTYsCisgICAgICAgLTUyLCAgIC00MzAsICAgMjUzMywgIC0xNzY1LCAgICA4MzgsICAgICA4NCwgICAgLTI0LCAgIC03OTgsCisgICAgICAtNDI4LCAgIC0xNTQsICAgLTY1OCwgICAgIDM3LCAgIC0zODgsICAgLTU5MSwgICAtOTMxLCAgIC00MzMsCisgICAgIC0xODM3LCAgIDEzNjMsICAgLTY4MywgICAtNzE3LCAgIDMxMTUsICAgIDEwNCwgICAgICAwLCAgIDExMDQsCisgICAgICAgMjA4LCAgICAxNDgsICAgIDQwNCwgICAgMTAxLCAgICAgMTgsICAgIDIxNywgICAgIDU4LCAgICAgNDksCisgICAgICAgICA0LCAgICAtNDksICAgLTE5NSwgICAgMTg3LCAgIC0yMzksICAgIC0yMSwgICAgMjk0LCAgIC0xMzgsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjQ0NDBzbDFbXSA9IHsKKyAgICAgLTMwNTcsICAgLTg1MywgICAzMjEyLCAgIC0zMzQsICAgICAgNSwgICAgMjI0LCAgICAgNjMsICAgLTI1MCwKKyAgICAgIC0zNDUsICAgLTEwMiwgICAtMjg5LCAgIC0xMTUsICAgICA3NSwgICAgLTk5LCAgICAyMDYsICAgICAtOCwKKyAgICAgICAgMTksICAgICA5NiwgICAtMjU0LCAgLTI1NjYsICAgIDMzNCwgICAyNzczLCAgICAxMzYsICAgIDE5OSwKKyAgICAgLTEwNzYsICAgIDM0NywgICAtMTg3LCAgICA0ODEsICAgIC02NCwgICAgNjU0LCAgICAgLTksICAtMTA5NCwKKyAgICAgICAxOTYsICAgICA0MCwgICAgLTk1LCAgICAgIDUsICAgIDE2MywgICAtMTM1LCAgICAyNTMsICAtMTA1MywKKyAgICAgICAzMTYsICAgLTIzMSwgICAgIDI0LCAgLTIzMDcsICAgMTQ4MCwgIC0yMDUyLCAgICAtMTgsICAgLTQ1OSwKKyAgICAgIC01NTAsICAtMTg2MCwgICAgLTE1LCAgICAgOTgsICAtMTQwNiwgICAgLTY2LCAgIC0yNTAsICAgICAyMSwKKyAgICAgICA0OTcsICAgLTQwNCwgICAgLTU0LCAgIC0yMjgsICAgMjQ3NywgICAyMDExLCAgIC0xNDUsICAtMTk1NywKKyAgICAgIC00MjYsICAgLTkwNiwgICAgNjA4LCAgICAgMTUsICAgMTQ1MywgICAgMjE4LCAgICAtNzksICAgLTYzNiwKKyAgICAgLTEwMDUsICAgLTMzMiwgICAgMzA0LCAgIDIzMzgsICAgMTM1NiwgICAgIDgxLCAgLTEyMDEsICAgLTE3MCwKKyAgICAgIC0xMjYsICAtMTE3NywgIC0xNjQ0LCAgLTEwNDYsICAgICAxNiwgICAgMTgyLCAgIC0zMjgsICAgLTM0NywKKyAgICAgICAzNDYsICAgIDU5MSwgICAgNDE4LCAgICA2MjMsICAgLTExMCwgICAtMzQyLCAgIC0yMjcsICAgICAxMCwKKyAgICAgLTUwNTUsICAgLTQxMSwgICAgMTI4LCAgIC0xMDMsICAgICA4NywgICAgLTI4LCAgIC0xMzMsICAgIDE5NiwKKyAgICAgICAzMzMsICAgMTc4NSwgICAtNDc5LCAgIC00NDIsICAtMjg5MiwgICAgNDUzLCAgLTIyOTIsICAgIC0xOSwKKyAgICAgIC0zODMsICAgIC00NCwgICAtNDM1LCAgIC0xOTMsICAgIDUwMywgICAgMTMwLCAgICAgIDQsICAgIDE0NCwKKyAgICAgIDIxODQsICAgLTI0NSwgICAgIC03LCAgICA0NTgsICAgICA4MiwgICAgLTc2LCAgIDMwNTIsICAgLTM3NSwKKyAgICAgIDEyOTksICAgIC03NiwgICAgMzY0LCAgIC0xNDUsICAgIDM3MiwgICAgIDM2LCAgICAgNTksICAgIC0zOSwKKyAgICAgICAgNDgsICAgIDM4NSwgICAtMjMwLCAgIDI3NjQsICAgMjk1NiwgICAtNzQxLCAgIC0zNzIsICAgIDQyOCwKKyAgICAgIC01MDQsICAgLTIyMCwgICAtODIxLCAgICAtNDcsICAgIC00OSwgICAgNjA5LCAgICAtNjIsICAgICA1NiwKKyAgICAgICAgIDYsICAgIDIxNiwgICAgMzc2LCAgICA1MTksICAgLTUxMiwgICAgIDU0LCAgIC0zMTgsICAgLTE4MywKKyAgICAgLTQ1NjMsICAgIDI5NywgICAgNzk1LCAgIC0xODIsICAgIDEwOCwgICAgMjM0LCAgICA0MDQsICAgIDIxOCwKKyAgICAgIC0xMjMsICAgIC0xNywgICAtMTkyLCAgICAxNzAsICAgIDM0OSwgICAgMTM0LCAgICAtOTEsICAgICA0MywKKyAgICAgIC0xMzUsICAgIC0yNCwgICAgIC02LCAgICAtMzIsICAtNjY4MSwgICAgIDUwLCAgIC0xMzgsICAgIC04OSwKKyAgICAgICAtMTgsICAgICAxNSwgICAgIDI0LCAgIC00MTYsICAgIDM1NiwgICAgMzExLCAgICAgODMsICAgLTI2NywKKyAgICAgICAgODEsICAgIDIwOSwgICAtMTU1LCAgIC0zNjgsICAgIDM5NiwgICAgMzU4LCAgICAyMzIsICAgNDY5NiwKKyAgICAgIC0zNDcsICAgIDcyNCwgICAgMTEyLCAgICAgMTAsICAgIDMzMSwgICAgMzU4LCAgICAxOTcsICAgICA1NCwKKyAgICAgICA4MjQsICAgIDY0NiwgICAtMjE0LCAgICAxMTMsICAtNDQyNSwgICAgMTg0LCAgICAtMTEsICAgIDEwMSwKKyAgICAgIC0zMTMsICAgIDE4NiwgICAgMjUzLCAgICAxNjksICAgICA3OCwgICAgIDUyLCAgICAtNzAsICAgLTEwOCwKKyAgICAgIDE2NjksICAgIC0yMiwgICAgLTE4LCAgLTI2MDAsICAgIC0yNywgICAyODA2LCAgICAyODgsICAgLTEwNiwKKyAgICAgICA1MDYsICAgIDE3NiwgICAgNjE2LCAgIC0yOTksICAgICA1OCwgICAgLTMwLCAgICAgIDEsICAgLTIyMCwKKyAgICAgICA0MDAsICAgLTE3NywgICAgODc0LCAgICAgNzAsICAgIC0zNiwgICAtMjc0LCAgIC0xMzksICAgMTE0OCwKKyAgICAgICAzNzIsICAgICA0MCwgICAgMjM2LCAgICA1MDUsICAgIDYxOSwgIC00MDAyLCAgICAtOTUsICAgIC00OCwKKyAgICAgLTI4NTQsICAgIDExNCwgICAgLTY5LCAgLTI4MDUsICAgLTQwMSwgICAgIC05LCAgICAyMDMsICAtMTAxMSwKKyAgICAgICA0NzIsICAtMTA2NiwgICAgNDEyLCAgIC0yMjAsICAgIDI0NSwgICAtMTgzLCAgICAtMjcsICAgICAzNSwKKyAgICAgIC03NjIsICAgIDMxMiwgICAtMTM3LCAgIC0yOTIsICAgLTI0MiwgICAgODk2LCAgICAxNzIsICAgLTM0NSwKKyAgICAgICAxMDYsICAtNDQ5MCwgICAgNTA2LCAgICA1NjksICAgIC0xMSwgICAtMzUyLCAgIC0xMDgsICAgIDMzNCwKKyAgICAgIC0xNjUsICAgMjM4OSwgICAtODk1LCAgIDI3NjEsICAgIDQ2NywgICAgMjAxLCAgICAxNTAsICAgLTUxNiwKKyAgICAgICAgMzksICAtMTEwNSwgICAgICA0LCAgICA1ODcsICAgLTE1MiwgICAtNzY0LCAgIC0xODQsICAgIC0xNSwKKyAgICAgIC0xMzcsICAgIC0zMCwgICAgLTEyLCAgICAgIDcsICAgIDM4MiwgICAtNDYxLCAgIDE1NzcsICAgMzUxOSwKKyAgICAgIC0xNzMsICAgMTM3MCwgICAgIDgwLCAgICA0OTksICAgIDM0NCwgICAtNzcxLCAgICAxMjMsICAgIC0xMywKKyAgICAgICAyODgsICAgIDIzMywgICAgMTExLCAgLTI0NzIsICAgMzk1MiwgICAgNzcxLCAgICAyMTYsICAgLTUwNSwKKyAgICAgIC00NDYsICAgIDUzMSwgICAtMjMwLCAgICAxMDMsICAgIC03MiwgICAgIDM0LCAgICAgNjEsICAgIDI0OSwKKyAgICAgIC0xNzUsICAgIDM1MywgICAgIDgzLCAgICAgNTEsICAgIDE2OSwgICAgLTk3LCAgICAtNjAsICAgNzgyNywKKyAgICAgICAgOTUsICAgICA3NSwgICAgLTEzLCAgICAyMDEsICAgIC0yNywgICAgMTAzLCAgICAtMTEsICAgICAgMSwKKyAgICAgICAgIDMsICAgIDEyMSwgICAgLTczLCAgICAtMjgsICAgICAgNywgICAyOTA4LCAgIC0yMDksICAgLTk4NywKKyAgICAgIC0xMjksICAgLTM0MSwgICAyODQwLCAgICA4ODksICAgLTE0NywgICAtNTIxLCAgICAxMjMsICAgICA5NSwKKyAgICAgIC0yMzksICAgIDU1MiwgICAtNzM4LCAgICAyNzksICAgIC02NiwgICAgICAwLCAgICAgMTYsICAgIDExNiwKKyAgICAgICAtNDUsICAgIC0yOCwgICAgLTQzLCAgICAtMzgsICAtNzYyNywgICAgIDMwLCAgICAtNTIsICAgLTIwOSwKKyAgICAgICAyODEsICAgIC00NiwgICAgIDIzLCAgICAtMjQsICAgICA1NiwgICAgLTI1LCAgICAtMjMsICAtMjUzNCwKKyAgICAgIC0xMDcsICAgIC00NiwgICAgLTkzLCAgICAtNDksICAgIDIzOCwgICAgLTI1LCAgICAgOTYsICAgLTM1NiwKKyAgICAgIDM0ODMsICAgLTQ1OSwgICAtNDE0LCAgICAyMDUsICAgIDEwMiwgICAgMjAyLCAgIC0xNTAsICAgLTExNiwKKyAgICAgIDE3ODUsICAgMTM5OSwgICAgNzkzLCAgICA1NDMsICAgIDY4NSwgIC0yODM3LCAgICAyNTUsICAgIDM2MiwKKyAgICAgICAtOTYsICAgIDQxMCwgICAgOTI2LCAgIDEwNjgsICAgIDQxNiwgICAgNTU4LCAgIC0xNjksICAgIDI0NiwKKyAgICAgICAxMzgsICAgMjEzNiwgICAgIDM5LCAgICAtOTYsICAgLTYwNSwgICAgMjc5LCAgIC0xMzAsICAtMjc0MSwKKyAgICAgLTExMDEsICAgLTkzNSwgICAgLTIwLCAgIC0yMjcsICAgIDQ1MywgICAxMjYxLCAgICAxMDMsICAgIDI3NSwKKyAgICAgICAzNTgsICAgICA0MywgICAgMTk3LCAgICAtMjMsICAgLTI1MSwgICAgMzIyLCAgICAtMjIsICAgIDIzMywKKyAgICAgIDI1NjAsICAgLTIxNCwgICAgICAyLCAgIC0xMDEsICAgIDY0NSwgICAyODY0LCAgICAyODcsICAgLTQ3OSwKKyAgICAgICA5MDQsICAgIC02NSwgICAgIDczLCAgICAyMjQsICAgMjQxOCwgICAgLTk1LCAgICA0MjgsICAgLTY3OCwKKyAgICAgIC0yNzgsICAgICA3MSwgICAtNTQ1LCAgIC01NzEsICAgLTU2NiwgICAtMTgxLCAgIC0yMTIsICAtMjk0NywKKyAgICAgICAyMjIsICAgIDc4MCwgICAtMzY1LCAgICAxMjQsICAtMjcwMywgICAtMTk4LCAgICAtNjksICAgLTI0NiwKKyAgICAgLTMwNTYsICAgLTE4NCwgICAtNTk4LCAgICAtNzUsICAgLTE0NSwgICAtNjkwLCAgICAzODAsICAgIDE5NCwKKyAgICAgICA0ODUsICAgIDIxNCwgICAtNDg0LCAgICAgNTQsICAgIDE2MywgICAgMzYzLCAgIC05MjQsICAgMTY4NCwKKyAgICAgICAyMDEsICAgICAzNCwgICAgMjM2LCAgIC01MzksICAgMjM3NCwgICAtMTUwLCAgIC00OTAsICAtMTMxMywKKyAgICAgICAtNjEsICAgIDMxNywgICAyMTIzLCAgICAzMTUsICAgLTU1MSwgICAgLTI2LCAgIC0zMjgsICAgIDIwNywKKyAgICAgICAyNTMsICAtMzAxNSwgICAgMTY2LCAgICAxMDksICAgLTY2MiwgICAyNDY2LCAgIC0xNTcsICAgLTc0MCwKKyAgICAgICA3NTEsICAgIDI1NCwgICAtNzg4LCAgIC0zNjksICAgICAtNiwgICAgMTAwLCAgIC0yMTEsICAgIDEwNywKKyAgICAgIC0zMDksICAgIC0zOSwgICAgLTQ3LCAgICAyNzksICAgLTEyNiwgICAgLTkxLCAgICAgOTcsICAgLTcwNSwKKyAgICAgICAyMzUsICAgLTIzMSwgICAgMTgyLCAgICAyODMsICAtNTA5NywgICAgLTY4LCAgICAyODUsICAgICA0OSwKKyAgICAgICAgNTAsICAgIDYzNywgICAgMTExLCAgICAgMzksICAgLTM4NiwgICAgOTIzLCAgICAyMjMsICAgIDExNSwKKyAgICAgIDE2MzgsICAgMTIxNCwgICAtNjQwLCAgLTIxNjgsICAgIDQ4MiwgIC0yMjI4LCAgICA4NTcsICAgIDE3MiwKKyAgICAgICAgMTUsICAtMjIwNywgICAgLTg5LCAgICAzMzUsICAgIC0xOCwgICAgMjk1LCAgICA3MTgsICAgLTk1NiwKKyAgICAgICAgMjYsICAgIDYwNCwgICAtNDM2LCAgIDI4NTYsICAtMTEzMSwgICAgIDk4LCAgIC03NTQsICAgIDI0MywKKyAgICAgICAgIDksICAgICAyOSwgIC00MDI4LCAgLTE3MjUsICAtMTc0MSwgICAgNDMyLCAgIC0yMTEsICAgIC02MCwKKyAgICAgIC01MzUsICAgIDIwMSwgICAtMjczLCAgICAxMTEsICAgIDQ0NCwgICAgNjA3LCAgIC0yNTAsICAgIDEyMiwKKyAgICAgICAgOTgsICAgIDE1OSwgICAgIDk3LCAgICAyODEsICAgMzA3MSwgICAtNDEyLCAgLTI4NDksICAgLTcyMSwKKyAgICAgICAtMTQsICAgIDk2MCwgICAgLTQzLCAgICA3OTQsICAgLTQyNywgICAgMjk3LCAgICA0NzgsICAgIDM3OSwKKyAgICAgICAtNDcsICAgIC0yMiwgICAgIDY5LCAgICAtNjAsICAgIC0zMCwgICAtNzMyLCAgIDI0NTYsICAgIDE3MCwKKyAgICAgICAxNDIsICAgICAgNiwgICAyNTIwLCAgIC02NDQsICAgLTIwMSwgICAgLTE2LCAgIDE2MDIsICAgIC0yMCwKKyAgICAgIC0yOTMsICAgIDU0MiwgICAtNDUxLCAgIC0xNjcsICAgICAtOSwgICAgIDE0LCAgIDEwNTIsICAgMjcwNywKKyAgICAgIDI5ODAsICAgLTExNywgICAgNDc5LCAgIC0yMDIsICAgIC05MiwgICAgIDM2LCAgICA5MDQsICAgIC02NiwKKyAgICAgLTEwODgsICAgIC0zMSwgICAgIDc1LCAgICAtNjIsICAgLTExMCwgICAgLTI5LCAgICAxMTIsICAgLTEwMiwKKyAgICAgIDUyMTcsICAgIC04NSwgICAgIDE0LCAgIC0xOTEsICAgLTIwMiwgICAtMTc1LCAgICAtNzEsICAgIDE4MiwKKyAgICAgIC0yMzEsICAgIDI3NSwgICAgMTQ0LCAgICAgLTEsICAgLTIwMiwgICAgLTEzLCAgICAtMjksICAgIC0xOSwKKyAgICAgICAgNzAsICAgICAzOSwgICAgIDQ2LCAgICAgNTYsICAtNzYwOCwgICAgLTUzLCAgIC0xMDQsICAgIC02MSwKKyAgICAgICAgNDQsICAgICAyMywgICAgICAxLCAgIC0xNTcsICAgICA0MiwgICAgIDEyLCAgICAgMzgsICAgICAzNywKKyAgICAgICAzMzEsICAgLTYwOSwgIC0yNTE2LCAgIC0xNzQsICAtMjQ5MSwgICAgMjU4LCAgIC0yNTYsICAgLTkyNiwKKyAgICAgICA5ODMsICAgIDEwMCwgICAgIDgzLCAgICAxNzMsICAgLTk2NSwgICAgNjUwLCAgIC0zMDQsICAgIC05NywKKyAgICAgICAgOTgsICAgLTE2NiwgICAgNTM0LCAgIDI1NzAsICAgLTYxMSwgICAgNDkzLCAgICAxMDMsICAgIC05OCwKKyAgICAgICAxNDgsICAgMzA4MSwgICAtMTMxLCAgICAyODUsICAgICAxMywgICAtMzY3LCAgICAyMDUsICAgIC01MywKKyAgICAgICAgNDEsICAgICAyOSwgICAtMTU0LCAgLTI2NTcsICAgIC01MSwgICAtMzEyLCAgICAxMzQsICAgICA1MCwKKyAgICAgLTE1MTQsICAgIDYzNCwgICAgNDExLCAgLTI4ODUsICAgLTM5MSwgICAgMzY1LCAgIC0zNzMsICAgIC01NCwKKyAgICAgICAtNzQsICAgLTE1MSwgICAgIDgwLCAgICAxNTIsICAgIC05MSwgICAgLTY0LCAgIC0yMDksICAgMTEzNCwKKyAgICAgLTI5MjEsICAgIDMxNiwgICAtOTUxLCAgIDExMjQsICAgIDcxMywgICAgICAyLCAgLTIyMTIsICAgICAzMSwKKyAgICAgICAxNjQsICAgLTI2MCwgICAgMTAzLCAgICAgMzYsICAgIDIyOSwgICAgMTExLCAgICAtMjMsICAgIC02NSwKKyAgICAgICAtMzcsICAgLTIyMCwgICAtMTA4LCAgICAtMzAsICAgICA4NiwgICAgIDE3LCAgICAgODcsICAgIDIwNSwKKyAgICAgICAxNjMsICAgICA2MywgIC01NzYzLCAgICAyNTQsICAgIDE3OCwgICAgLTE4LCAgIDE3NjAsICAgLTM4MCwKKyAgICAgIDE0NTMsICAtMzE1MSwgICAgNzEwLCAgICAxMDYsICAgICA2NiwgICAgMzg3LCAgICAyMzUsICAgIDQ2MywKKyAgICAgIC0yOTUsICAgIDY4OCwgICAtMTI0LCAgICAzMjIsICAgLTE5MywgICAgIDgyLCAgIDEwMTIsICAtMjAzMywKKyAgICAgIC02NTYsICAgMTM2MiwgICAgODA1LCAgIC03NDcsICAgMjUyNywgICAgNDcwLCAgICAgNDMsICAtMTAwMSwKKyAgICAgICAxMDAsICAgIC04MywgICAgMTYxLCAgICAgNzQsICAtMTEyOCwgICAtMzA3LCAgICAtODIsICAgLTE5NywKKyAgICAgLTU0NzAsICAgIDIyNiwgICAtMzI3LCAgICAxMzcsICAgLTEzMSwgICAgNDcxLCAgIC00MzIsICAgIC0xNiwKKyAgICAgICAyNDMsICAgIDIyNCwgICAgMTY4LCAgIC0xNjQsICAgIC01OCwgICAgMTI1LCAgICAgMjMsICAgICAtMiwKKyAgICAgLTI3NTIsICAgIDI2OCwgICAgLTkyLCAgIC00NjYsICAgMjg3NiwgICAgODc0LCAgICAxODIsICAgIDU0MCwKKyAgICAgIC00MDcsICAgLTMzOCwgICAtMzk2LCAgICA1NjIsICAgLTM3NiwgICAgNTM2LCAgIC0yMjUsICAgIDE2MCwKKyAgICAgICAgNDQsICAtMTUwMSwgICAtMjQ2LCAgLTEwNjIsICAgLTM3OCwgICAgNDQ2LCAgLTI0NDgsICAgLTEyNCwKKyAgICAgICA0OTksICAtMjI5NywgICAtMzUzLCAgIC02MzcsICAgIDM5NSwgICAgNTk4LCAgIC03NDcsICAgIDQxOCwKKyAgICAgIC00OTUsICAgICAgNSwgIC0xMDE0LCAgIDIxMzgsICAgIDI4OSwgICAgLTc1LCAgICAzMDEsICAgIDk0NCwKKyAgICAgICAgNjYsICAgLTQ1NywgICAtNDU5LCAgIC0yNTMsICAgICAtMiwgICAgNjc4LCAgICAzNjcsICAgIDExNiwKKyAgICAgLTI5MDEsICAgIDQzNiwgICAtMjM5LCAgIC0zMDMsICAgLTk3MywgICAgMzg0LCAgLTI1NzQsICAgICAgNiwKKyAgICAgIC0yMjUsICAgLTE2NCwgICAtNDQwLCAgICA2MjcsICAgIDM4OCwgIC0zMDc0LCAgIC0yNjMsICAgIDE1NiwKKyAgICAgIC04MDUsICAgIDM4MSwgICAgIC05LCAgIC0xMTIsICAtMTQ4MSwgICAgNTM2LCAgIC03MTEsICAgMzc3MCwKKyAgICAgIC00OTYsICAgIDkwOCwgICAgNDgzLCAgICA0NzQsICAgIDI5OCwgICAtNDI0LCAgIC03OTMsICAgLTIwMywKKyAgICAgIC0zMzQsICAgIDEzNCwgICAgLTkxLCAgICAyMDgsICAgIC03MywgICA1NDQwLCAgIC0zMTYsICAgLTMwNCwKKyAgICAgICAyNDksICAgICAtMSwgICAgLTk4LCAgIC0yMTQsICAgIDE5MCwgICAgMjQyLCAgICAtNTcsICAgIC0zOCwKKyAgICAgICAyNDQsICAgLTIxOSwgICAgIDMwLCAgIC0yMjQsICAgICA2NiwgICAgLTMwLCAgICAgMjIsICAgICAyNCwKKyAgICAgICAgMjQsICAgLTEwOSwgIC03NTk0LCAgIC0xMTUsICAgICA5MCwgICAtMTQ3LCAgICAtODMsICAgICAyMSwKKyAgICAgIC0yNTcsICAgIC01MiwgICAgMTM0LCAgICAtNDksICAgICA5MiwgICAtMTE3LCAgICAgMzAsICAgICAtOCwKKyAgICAgIC02MzYsICAgMTU1MSwgICAyMjA3LCAgICAtNjYsICAtMTk2MiwgICAgMjEyLCAgICA1NjcsICAgIDk2OSwKKyAgICAgLTE1OTUsICAgLTU2MiwgICAgMzU1LCAgIC00NjcsICAgLTg2MSwgICAgOTM3LCAgIC0xNDgsICAgICAxNSwKKyAgICAgICAtNjgsICAtMTUxNiwgIC0yMTE4LCAgIDE0NzcsICAgIDc3NywgICAxNDU4LCAgICA5NzYsICAgIDUyMiwKKyAgICAgICAzMjUsICAgIDk1NywgICAtMTMwLCAgIC0xMzIsICAgLTkxOCwgICAgNDQ4LCAgIDEwODgsICAgIDEwMiwKKyAgICAgICAxNDIsICAgLTY0NCwgICAtMjg0LCAgICA2ODcsICAgLTY2NSwgICAtMTMyLCAgLTE4NzAsICAgMTM4NywKKyAgICAgICA3MzMsICAgIC04NCwgICAgOTIwLCAgIC01MDgsICAgICA1MywgIC0yMTgzLCAgICAyNTQsICAgIDU2NSwKKyAgICAgIDIwNTYsICAgICA5NywgICAgIDU3LCAgICAyMTksICAgIDY4OCwgICAtMzQ0LCAgICA2NTksICAgMjAzMywKKyAgICAgICA5NjMsICAtMTcxNywgICAtMjkwLCAgIC05MzQsICAtMjExOSwgICAgIDU3LCAgLTE0NTIsICAgICAyNCwKKyAgICAgIC02MzksICAgLTczOSwgICAtMjMyLCAgICAxNzAsICAgICAyOCwgICAgMzU5LCAgIC0zMTIsICAgIDMxMCwKKyAgICAgIC0xMDMsICAtMTA2NywgICAtOTUzLCAgIDEwODEsICAgLTg1NywgICAxOTI2LCAgIDEzNjQsICAtMTcxOSwKKyAgICAgIC04NjMsICAgMTgzMiwgICAgNzg2LCAgICAgNTUsICAgIDE2NiwgICAgMzgzLCAgLTEzNzMsICAgLTM0NywKKyAgICAgIDE3MTAsICAgLTkwOCwgICAgIDkxLCAgIDEyNTcsICAgMjAxMywgICAtNTkyLCAgLTEzMzcsICAgMTQzMSwKKyAgICAgICAtOTAsICAgIDYxNywgICAgNTQ5LCAgIC0zNTYsICAgIC02OCwgICAgMTM0LCAgICAtNDgsICAgLTEzMywKKyAgICAgIC0xNzYsICAgIC0xOCwgICAgLTY1LCAgICAgMjMsICAgICA4NCwgICAgLTIzLCAgICAtMzYsICAgICAtNCwKKyAgICAgICAyMzAsICAgIDI5NywgICAtMjA0LCAgIC0xNTAsICAgICA4NiwgIC00OTY1LCAgICA3NDIsICAgICA0MCwKKyAgICAgICAgMzIsICAtMTA3MCwgICAgMTQ5LCAgICAgMzgsICAgIDMwMiwgICAtMzI5LCAgIC0zODYsICAgIC01NywKKyAgICAgICAgNDUsICAtMTYyMiwgICAxNDI1LCAgIDE4MTcsICAgMTU2OCwgICAyMjAyLCAgICAgIDcsICAtMTE5MiwKKyAgICAgIC0yMDEsICAgIC00MiwgICAgLTYyLCAgIC0xNzAsICAgIC0zMiwgICAtMTE3LCAgICAtMzgsICAgIDIyOSwKKyAgICAgICAgNDQsICAgLTIyNiwgICAgMTU1LCAgICAgNzAsICAgIDc0NywgICAgMjU5LCAgIC0yNjEsICAgLTEyMCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiNDQ0MHNzMFtdID0geworICAgICAtMzAyMSwgICAyMDQ4LCAgIC00NTAsICAgMTE0NywgICAxNDg3LCAgIC03OTYsICAgLTY1NywgICAgNDU5LAorICAgICAgIDYwOSwgICAgIDYzLCAgIC0xNTMsICAtMTE3NCwgICAtMTQ0LCAgICAgMzcsICAgLTE3NiwgICAtMTYwLAorICAgICAgICA0MywgICAgLTMxLCAgLTI1NzcsICAgICA4OCwgICAtNzk3LCAgIDExNzksICAgLTcwNywgICAzMTU0LAorICAgICAgLTU0MywgICAgODc1LCAgICAxMTYsICAgIC00MCwgICAtMTUwLCAgICAzMjYsICAgIDI5MywgICAtMTEyLAorICAgICAgIC03MywgICAgLTM0LCAgICAgNjEsICAgICAgOCwgIC0yMjUxLCAgLTE1NTEsICAtMjUwNywgICAgICA2LAorICAgICAgIC01MiwgICAgIC01LCAgIC0zMjMsICAgLTMxMywgICAxMDc2LCAgICA5MjAsICAgMTExNiwgIC0xMTAwLAorICAgICAgMTEwMywgICAgMzEwLCAgIC0xNDQsICAgIDkwNCwgICAgMTQ5LCAgICAtNTksICAgIDYzNiwgIC0xNTA4LAorICAgICAgLTM3OCwgICAgMzgxLCAgIC05MTcsICAgLTg2OCwgICAxMzg4LCAgLTEyMjUsICAgIC02OCwgICAxNDkxLAorICAgICAgIDY4NSwgICAtMjIwLCAgIDMyNTMsICAgICA0OCwgICAtNTA0LCAgICAxOTIsICAgIDExNCwgICAgLTExLAorICAgICAtMTcxOCwgICAtOTE2LCAgICA2NjAsICAgLTI0MCwgICAgNzY3LCAgLTEwNjEsICAgIDMzMiwgICAgNTkxLAorICAgICAgLTQ3NywgICAtMjc4LCAgICAgMjUsICAtMTQ4NSwgICAgIDU1LCAgICAyMTYsICAtMzIzOCwgICAgLTE5LAorICAgICAgLTMyMCwgICAtMTQ4LCAgICAyNzMsICAgLTg3NiwgICAgIDIyLCAgIC01MjksICAgMzI2MywgIC0yNTM1LAorICAgICAgLTc1NiwgICAtMTMzLCAgIC00ODEsICAtMTAyNCwgICAgIDM0LCAgICA0MTgsICAgLTQxNSwgICAgNDEyLAorICAgICAgIC05MiwgICAgLTkwLCAgICAxNjEsICAgIC00OSwgIC0xNjk5LCAgLTI3MzcsICAgMjkyMywgICAtMjQzLAorICAgICAgIDEyMiwgICAgIDg3LCAgICA5ODQsICAgLTM3NywgICAgLTM3LCAgICAxMjgsICAgIDM1MCwgICAtNDQ0LAorICAgICAgIC05OCwgICAgLTUyLCAgICAgMTQsICAgIC0xNCwgICAgLTg2LCAgICAyNTUsICAgMTk5NywgIC0xMjM5LAorICAgICAgICA0MiwgICAgMjQ3LCAgICAtMTUsICAgICAxNiwgICAgNDA1LCAgICAzMDIsICAgIC0xNywgICAgIDg0LAorICAgICAtNDAzMywgICAgLTEyLCAgICAyNTQsICAgLTM2NSwgICAtMjA1LCAgIC0xNjIsICAgIDMyOSwgICAgIDMxLAorICAgICAtMTE1OCwgICAtMjEwLCAgIC0zNzYsICAgMzk1OCwgIC0xNjAxLCAgLTExMjgsICAgIDczNywgICAgNzMxLAorICAgICAgIDMwMCwgICAtNzg1LCAgIC03NzcsICAgLTQwMywgICAgNDYzLCAgIC0yMjYsICAgLTEwOSwgICAtMjc3LAorICAgICAgIC03MCwgICAgLTUzLCAgIC04NTYsICAgLTc4NSwgICAtOTk3LCAgICAgNzEsICAgNTU2NSwgICAgMzE3LAorICAgICAgIDQ0NywgICAtMjc5LCAgIC0zNTcsICAgIDI1NCwgICAgIDkzLCAgICAtNDcsICAgLTIwNiwgICAgMTMzLAorICAgICAgICA4OCwgICAgMjcyLCAgICAgIDcsICAgICA0NCwgICAyMjI5LCAgIDE2NjYsICAgIDIzNCwgICAgNTE5LAorICAgICAtMTk5NiwgIC0xMTk1LCAgICA1NDksICAgIDQ0OSwgICAgMTc0LCAgLTEwMTAsICAgIDYyMiwgICAgNDI1LAorICAgICAgMjI4OCwgICAgIC05LCAgIC0zOTAsICAgIDYxMiwgICAgLTQwLCAgICAgMzIsICAtMTg2NywgICAtNjczLAorICAgICAgIC03MCwgIC0xMTc0LCAgICAxMDYsICAgIDEzNCwgICAgMzU0LCAgICAgNjEsICAgLTE0NCwgICAtMjkwLAorICAgICAgICA4MiwgICAtNjA0LCAgICAyMDIsICAtMzk1NCwgICAgMjQ4LCAgICAtNzYsICAgICAgNywgICAgMjI0LAorICAgICAtMTg0NCwgICAgIDk5LCAgIC0xNDYsICAgIDIwNiwgICAtMzM1LCAgICAyNDMsICAgICAyNSwgICAgIDYwLAorICAgICAgIDE4NiwgICAgMTE3LCAgICAgNjcsICAgLTEzNywgICAgMTE5LCAgICAgNDYsICAgNDU2MywgICAgIDQ1LAorICAgICAgIC00NiwgICAgIC0yLCAgICA4NzQsICAgIDUzMywgICAgMjE2LCAgICAtMzgsICAgIDE4NSwgICAtNTQwLAorICAgICAgLTE5MSwgICAtMTYzLCAgIC0xMjYsICAgLTEwOCwgICAtMTg0LCAgICAxOTMsICAgIC0zOSwgIC00NzY4LAorICAgICAgIDExMSwgICAgLTg5LCAgICAtNjEsICAgICAxNywgICAxMDY0LCAgIDE2NzgsICAgIDg5NCwgICA0MzM0LAorICAgICAgIDEzOSwgICAtODkyLCAgICAzMTcsICAgLTM1MSwgICAgNDE3LCAgICAtODcsICAgIC0yMiwgICAgMTk1LAorICAgICAgICAyMCwgICAgMTQwLCAgICAyMzQsICAgLTE5NywgICAtMjY4LCAgICAgLTUsICAtMTYxOCwgICAtNzU2LAorICAgICAgLTExOSwgIC0xNzQ5LCAgIC03MDQsICAgLTk0MywgICAgNDIxLCAgLTM0ODgsICAgIDg3MSwgICAtNDY4LAorICAgICAgIDY1NiwgICAgMjY2LCAgICAtNzksICAgIDMyNSwgICAtMzAzLCAgICAgNDUsICAgICAtMywgICAgLTMxLAorICAgICAgMTE0MCwgICAtNzA3LCAgLTE1NzgsICAtMTQzNCwgICAgMjkwLCAgICAzMjcsICAtMTM2NSwgIC0yOTEzLAorICAgICAgMTA0OCwgICAgIDM4LCAgIC0xMzYsICAgLTg3MSwgICAtNTcyLCAgICAtMzAsICAgIDE4NiwgICAgMzQzLAorICAgICAgIC0zMCwgICAtMTU3LCAgIDEzMDEsICAgMTkxMywgICAtNTE1LCAgIC04NDIsICAgLTcyMywgICAgLTg0LAorICAgICAgLTM0MCwgICAgMjcwLCAgIC05MTgsICAgMzIxMywgIC0xNTMwLCAgIC0zOTQsICAgLTE4NCwgICAgLTYwLAorICAgICAgLTM5MSwgICAgLTI3LCAgIC0xMTAsICAgICA4NCwgICAgMTA0LCAgICA0MTksICAgMTIwMSwgICAtODEwLAorICAgICAgMTU0NiwgICAgIDM5LCAgIC05MTQsICAgLTMzNCwgIC00MjU3LCAgICA0MjcsICAgIC05NSwgICAtNDI2LAorICAgICAgIC05NCwgICAgMjU2LCAgIC0xNDgsICAgIDI0NiwgICAgLTgwLCAgICAgIDksICAgLTQ2MiwgIC0xMTI1LAorICAgICAgIDY0NCwgICAzNTQxLCAgIC0xNDAsICAgMjM0NiwgICAxMDQ1LCAgIC0zMzUsICAgLTg2NywgICAgODA5LAorICAgICAgIDQzMiwgICAgMzg2LCAgICAgLTYsICAgIDE1OSwgICAgIDcwLCAgICAtMTAsICAgIDIxOCwgICAgIDQzLAorICAgICAtMjIyOSwgICAtNjA3LCAgICA1MzcsICAgLTkyNCwgIC0zMDM4LCAgIC05NDMsICAgLTk2OCwgICAxMjYxLAorICAgICAgICAyOCwgICAgMTk3LCAgIC0yODUsICAgICA2MSwgICAgMTM3LCAgICAgNjksICAgICAtMiwgICAtMjUxLAorICAgICAgIDExMSwgICAgLTE5LCAgIC0zMTQsICAgMjA2NCwgICAgOTYwLCAgIDE1MjksICAgMTA1NiwgICAgOTI2LAorICAgICAgLTMxOSwgIC0xNjE3LCAgIDEzMDUsICAgMTQ3MywgICAtODY3LCAgICA2ODQsICAgMTM1NywgICAtODM0LAorICAgICAgIC02NiwgICAgNDc3LCAgICAgNzQsICAgIC0xNSwgIC0xNzY5LCAgIDE5MjUsICAtMjQ0OCwgIC0xNzc3LAorICAgICAgLTUwNywgICAgMjY0LCAgLTE3NDAsICAgIDE3NiwgICAtNTE4LCAgICAtNTgsICAgICAzMiwgICAtMTA4LAorICAgICAgIDE2NSwgICAgLTY4LCAgICAxODksICAgICAzNSwgICAgIDQwLCAgICAtODUsICAtMTE1MiwgICAgMjU1LAorICAgICAgICAzNiwgIC0xOTIyLCAgIDE1MDAsICAgMTQxNSwgICAgODQxLCAgICAtOTIsICAgMzMwNSwgICAtMTEwLAorICAgICAgICAgMywgICAtMjE5LCAgICAxNjcsICAgIDU3MywgICAgMjE5LCAgICAzMTAsICAgICAyNywgICAgMTk1LAorICAgICAgIDM1OSwgICAtMjQ0LCAgICA1MzgsICAtMjA0MiwgICAgMzU1LCAgICA2NTYsICAgICA1MSwgICAtMTk5LAorICAgICAgLTIwNCwgIC0zNjExLCAgIC0zOTYsICAgIDgzOSwgICAgNzQzLCAgIC0yNDEsICAgIC04MCwgICAtMjEwLAorICAgICAgLTEwMSwgICAgIDI4LCAgLTEzOTksICAgMTA2MiwgICAtOTU1LCAgICAgNTQsICAgLTYzMCwgICAtMTc4LAorICAgICAgLTM3NiwgICAgMjEyLCAgICAyMzcsICAgLTIxOSwgICAgIDQ3LCAgICA4MDUsICAgIDIxNiwgICAgIDI2LAorICAgICAtNDMzNCwgICAgNDU1LCAgICAgIDQsICAgICAgNCwgIC0xNTg3LCAgICAgOTUsICAgMTE4NiwgIC0zMTAxLAorICAgICAgLTE0MCwgICAtODYyLCAgICA5MTYsICAgMjA2MywgICAgMjExLCAgICAgOTYsICAgIDMzNywgICAtMTg1LAorICAgICAgLTE5NSwgICAgNDI0LCAgIDEyMDcsICAgIC0zMSwgICAtMTYyLCAgICAyMDYsICAgMjQ4NSwgICAgLTQ2LAorICAgICAgLTQ1MSwgIC0xNzc4LCAgICAtNDAsICAgIDE0NCwgICAtMTU1LCAgIDI4ODQsICAgIDgwMywgICAgMzk2LAorICAgICAgMTE5NiwgICAtNjM1LCAgICAyOTcsICAgIC03NiwgICAtMTIxLCAgIC0xNjIsICAgLTIwNiwgICAtMTQ5LAorICAgICAtMjIwNCwgICAxMDM1LCAgICAyMzIsICAgLTgxNSwgICAgLTQ5LCAgIDEwMDYsICAgIDU1MywgICAtNDA3LAorICAgICAgIDE2MSwgICAzNjUwLCAgIC0yNjQsICAgIDM3MCwgICAtNDE4LCAgICAtMjgsICAgIDE0MSwgICAtMTc3LAorICAgICAgLTExMywgICAgLTkwLCAgIC0zMTUsICAgIDYyNiwgICAgIDYyLCAgIDEzOTIsICAtMTgxNSwgICAgMzM2LAorICAgICAtMTI3NiwgICAtNDAyLCAgICA0ODYsICAtMTA2MCwgIC0xODQ4LCAgIDI2MTAsICAgIDgyNiwgICAgNDg1LAorICAgICAgLTI1MCwgICAgIDM5LCAgICAyMDgsICAgICAxNCwgICAyNTU1LCAgIDI4NjksICAgLTgxMywgIC0yMDc0LAorICAgICAgIDMzNywgICAgNjAxLCAgICA4NTUsICAgLTY1NSwgICAgNTY2LCAgIC03MDcsICAgIDE4OSwgICAgLTc3LAorICAgICAgIDEzNywgICAtNTEwLCAgIC0yODIsICAgICA3OSwgICAgIDQyLCAgICAgNzMsICAgICA2MiwgICAgNjUwLAorICAgICAtNDczMiwgICAtNDg2LCAgICAzNTQsICAgIDQyMCwgICAgODI4LCAgIC02NDUsICAgLTQ5MiwgICAgMzg4LAorICAgICAgIDc1MywgICAgIDE4LCAgICAgIDIsICAgIDc2NiwgICAtMjEyLCAgICAxMjYsICAgIC00MywgICAgIDQ1LAorICAgICAgIDQ0NywgICAtMjgzLCAgICA2MDcsICAgIDI1MSwgICAtMTY2LCAgICAtMTAsICAgICA0OCwgIC01ODUwLAorICAgICAgLTI1MSwgICAgMTI4LCAgIC0yMDUsICAgIC05NSwgICAgIDkwLCAgICAgOTAsICAgICA2NywgICAgIDI0LAorICAgICAgIC01MCwgICAgLTQ4LCAgIC0xNjcsICAtMzIzMSwgIC0yOTI2LCAgIDE4MzEsICAgIDE5OSwgICAgNDg0LAorICAgICAgIDE2OSwgICAtNjE0LCAgIC0xMzUsICAgLTM3NCwgICAtNDE4LCAgIC0yMzksICAgIC04OSwgICAtMTIxLAorICAgICAgICA0NSwgICAgIDc1LCAgICAtMTEsICAgICAxNiwgIC0xMDU4LCAgICAzNTQsICAgMTYzMywgICAgNTg5LAorICAgICAtMTIyMywgICAxMjE4LCAgICA4NDIsICAtMTE0NiwgICAyMTg2LCAgICAzNzQsICAgLTM2MywgICAgMjE2LAorICAgICAtMjE1MywgICAtNDI5LCAgICA0MjksICAgLTU5NywgICAgIDkzLCAgICAxNDgsICAgMTg0OSwgICAtNzk3LAorICAgICAgLTE2MiwgICAgIDMxLCAgIC0zMjUsICAgIDM0MywgICAtMzIzLCAgICAxNjEsICAgLTM3MywgICAgNjg0LAorICAgICAgLTM2NywgICAtNDUyLCAgLTQzMDYsICAgIC04OCwgICAgIDI4LCAgICAtNTYsICAgIC01OSwgICAgIDQzLAorICAgICAgIC00OSwgIC0xOTk4LCAgIC05NTYsICAgMTMzMSwgIC00MjE0LCAgIC0xMjksICAgICAzMCwgICAgIDc5LAorICAgICAgIC05MCwgICAtMTI5LCAgICAxMDksICAgIDEzMCwgICAtMTYwLCAgICA0MDksICAgIDEwNSwgICAgMjk4LAorICAgICAgIDIwOCwgICAgMTc4LCAgIDE3MjQsICAgIDczMSwgICAgNzczLCAgICAxMjgsICAgIDgxNywgICAtNDI1LAorICAgICAtNDA0NiwgICAgMTgwLCAgIC03ODIsICAgLTExNiwgICAgMTkxLCAgIC0yNTksICAgIDE4MSwgICAgLTMxLAorICAgICAgIDE2MiwgICAgIDQzLCAgICAtNDEsICAgIC02OSwgICAxNDYzLCAgLTE3NjksICAgICAtMiwgICAtNDQyLAorICAgICAgLTYzNiwgICAxNDk1LCAgIC0yMTgsICAgLTEyMywgICAgLTU4LCAgIDM2MTYsICAgIDQ1NCwgICAtNDc1LAorICAgICAgIDI0NywgICAtMzgzLCAgICAzMDQsICAgIDE4NSwgICAgMTU1LCAgICAgNDAsICAgMTEwNCwgICAxMDQ2LAorICAgICAgICAtOCwgICAtNzM2LCAgLTExNTUsICAgLTExNSwgICAzOTI1LCAgIC0yNTcsICAgIC0zNSwgICAtNTk5LAorICAgICAgLTQzNywgICAtMTM1LCAgIC0yNTYsICAgICA1NSwgICAgMjE0LCAgICAtODgsICAgIDIxNSwgICAgLTU3LAorICAgICAtMTA5NywgICAgMTgzLCAgIC01MDEsICAgLTYwOCwgICAtMTM1LCAgICAxNDgsICAgIDQwNSwgICAgMjk1LAorICAgICAgICA5NiwgICAtNTEzLCAgIDEwMTMsICAgNDM1MCwgICAtMTYyLCAgICAtNjEsICAgIDQyNywgICAgMzE1LAorICAgICAgICAyNCwgICAgLTc3LCAgLTEyNzgsICAgLTE2NywgIC0xNzc0LCAgIC0xMzMsICAgLTMyMywgIC00MzM5LAorICAgICAgIDczMiwgICAgNTk3LCAgICAtMzAsICAgLTEwMywgICAgIDc5LCAgIC0yNDEsICAgIDE3NywgICAtMzg4LAorICAgICAgICAgNywgICAgIDQ0LCAgICAxNzUsICAgLTE0MywgICA1MDMwLCAgICAyNzcsICAgICA1OCwgICAgIDQyLAorICAgICAgLTIyMiwgICAtMTMzLCAgIC0zMTksICAgICAgNiwgICAgMjQwLCAgICAyMTcsICAgLTIzOCwgICAtMTk4LAorICAgICAgIDIxOCwgICAgLTQzLCAgICA0MzksICAgICA0OSwgICAgIDM3LCAgICAxMDYsICAgMTEyMywgICAyMTk2LAorICAgICAgIDE1OCwgICAgMTcxLCAgICA0NTgsICAgLTkzMiwgICAtNDM1LCAgLTI3ODMsICAgLTMwMCwgICAgNDQ0LAorICAgICAgMjMxNywgICAtMTQ2LCAgIC0zMzksICAgLTE2MiwgICAgMTU3LCAgIC0yMTYsICAgICAgMSwgICAgIDY2LAorICAgICAgIDk4NywgICAtMTkwLCAgIC03MjgsICAtMzE4OCwgIC0zMTY3LCAgICAzNzgsICAgICAtMSwgICAgMTU4LAorICAgICAgIDQ1OSwgICAgIDc4LCAgICAtNDIsICAgIDM4NiwgICAtMTMzLCAgICAxNTUsICAgIDI5NCwgICAgMzU5LAorICAgICAgIC0yOSwgICAgIDc4LCAgIDE3NjMsICAgIDc4MCwgICAxMDE5LCAgIC0zMzAsICAgIDE3OSwgICAgLTUxLAorICAgICAgLTM5MywgICAgMzM4LCAgIDQ0MjIsICAgLTI5NiwgICAtMzkyLCAgICAxNzAsICAgICAgMiwgICAgIDUyLAorICAgICAgIDI1MywgICAgMTUwLCAgIC0xOTEsICAgIDEzOSwgICAtMzcxLCAgICAxNjEsICAtMjIwMiwgICAgMTU2LAorICAgICAgICAzNywgIC0xMDA0LCAgIC0zODQsICAgLTQ2NiwgICAgIDIzLCAgICAxODMsICAtMzcwMSwgICAgIDk3LAorICAgICAtMTI5MywgICAtMzU1LCAgICAtODMsICAgIC02MywgICAgLTI2LCAgICAgNjksICAtMTgxNywgICAgNjQxLAorICAgICAgMjk5NiwgICAgLTE2LCAgIDIwMTEsICAgLTQwNiwgICAtNjQ3LCAgIC02NTIsICAgIDMzMiwgICAgNzg4LAorICAgICAgIDQ4NCwgICAgOTE4LCAgIC00NDAsICAgMTI0NiwgICAgMTY1LCAgICAgNTIsICAgLTI2MCwgICAgIDMxLAorICAgICAgLTI1NSwgIC03MjM3LCAgICAgMTQsICAgICA5MCwgICAtMTM1LCAgICAxMjIsICAgICAxNCwgICAgMTU0LAorICAgICAgICAgNSwgICAgLTc4LCAgICAxMTEsICAgLTI1NCwgICAgMTU0LCAgICAtMjMsICAgIC0yNCwgICAgLTgzLAorICAgICAgICAtOSwgICAgIDQ5LCAgIC00MjYsICAgMTY1NywgICAgIDk5LCAgICAtMzYsICAgLTE5MSwgICAyNjI1LAorICAgICAgIDY1NSwgICAgLTIwLCAgLTI3MjMsICAgLTk3NywgICAtMjIyLCAgICAtNDgsICAgIDE1NSwgICAgIDQxLAorICAgICAgICAyMCwgICAgMTk0LCAgICAtNzMsICAgIC0yNiwgIC0xMjA2LCAgLTM1MTcsICAgLTQ3MSwgICAtODE1LAorICAgICAtMTE0NCwgICAtMzcxLCAgIDEzNTMsICAtMTA2OSwgIC0xMjM4LCAgICA4MjksICAgLTIyNywgICAgNDg3LAorICAgICAgLTI5NywgICAtMTAxLCAgICA5MTQsICAgIDEwMCwgICAgLTE3LCAgICAxMTUsICAgLTgwNiwgICAtNzk4LAorICAgICAgIDU4NSwgICAxMDk3LCAgICAgLTEsICAgLTc5MiwgICAgODE4LCAgICAgMjksICAgLTI1NiwgICAtNDE3LAorICAgICAgIDk0MiwgICAgIDY4LCAgLTQxNjUsICAgICAzNCwgICAtNDA4LCAgIC0yNTIsICAgICA1NSwgICAgLTc3LAorICAgICAgIDI0NiwgICAyMDU1LCAgICAgLTQsICAgLTMxMywgICAtNjYxLCAgIC04MzYsICAgIDU1OSwgICAtMzkzLAorICAgICAgMjA0MywgICAgMTUzLCAgICAyODYsICAtMjcwMCwgICAgIDk4LCAgIC0xNzcsICAgMTIwMSwgICAgIDk5LAorICAgICAgIDMwOCwgICAgLTczLCAgIDE0NDEsICAtMzkwMiwgICAgNzMwLCAgLTE2MTAsICAgIDg4NiwgICAtNTk5LAorICAgICAgLTEyNiwgICAgNDczLCAgICAgNDMsICAgLTI1MiwgICAgIDQ1LCAgICAgOTUsICAgLTI5MSwgICAgMTAxLAorICAgICAgLTMwNywgICAgMjU5LCAgIC0xNDksICAgICAyNiwgICAtNTEwLCAgICA0OTgsICAgMTQwMywgICAgLTc4LAorICAgICAtMTAzOSwgIC0yNTUxLCAgICA3NzMsICAtMTE3NiwgIC0xNTI1LCAgIC00MDUsICAgLTI1OSwgICAtMjgzLAorICAgICAgIDM5OCwgICAyMDgwLCAgIC0xOTksICAgICA2MiwgICAgMjM5LCAgICAtMjYsICAgIDk2MCwgICAgNTgyLAorICAgICAgMjUxNiwgICAgNzk5LCAgLTIxMjcsICAgIDMyNSwgICAtMjUzLCAgLTE2NTIsICAgLTk2NSwgICAxNDEzLAorICAgICAgICAgOCwgICAtMTE5LCAgICAzOTYsICAgLTM0MiwgICAgMjc3LCAgICA1NDEsICAgIDE4NiwgICAtMTQyLAorICAgICAgMTIxMCwgICAtNzMyLCAgICA3OTgsICAgIC00NywgICAtNTU3LCAgICAtMTIsICAgICA2MywgICAgNTM3LAorICAgICAgIDE0OCwgICAtMTI4LCAgICAzMjgsICAgIDI5MCwgICAgMjAzLCAgICAzNjEsICAgLTMyOCwgICAgLTY0LAorICAgICAgNDAwNCwgICAgMTk3LCAgIC02NDAsICAgIDk5NiwgICAgLTkzLCAgLTIzMTQsICAgICA3NiwgICAtOTE0LAorICAgICAgMTQzNywgICAtOTY0LCAgLTE3MzUsICAgIDk4NCwgICAtNTc4LCAgIDEzODksICAtMTAyNSwgICAgLTY2LAorICAgICAgLTEyMCwgIC0xMjExLCAgICAtMzIsICAgICAgNSwgIC0xMjE1LCAgICA3NzEsICAgMTYyMSwgICAtOTM0LAorICAgICAgLTk4NCwgICAgMTQ4LCAgLTE1OTIsICAgLTQ0NiwgICAgIDE5LCAgIC05NzYsICAtMTcwOSwgIC0xMTEzLAorICAgICAgLTIxOCwgICAgMTkxLCAgIC0yNzksICAgMjE4MywgICAgIDEwLCAgICAtMzcsICAgLTg0MiwgIC0xNTgyLAorICAgICAgIC05MiwgICAgNTU4LCAgICAyMjcsICAgLTcwMiwgICAtMzY1LCAgIC01NzYsICAgLTEwMCwgICAgNjcwLAorICAgICAgLTMwNSwgICAgMjg1LCAgICAgNDgsICAgLTMyOSwgICAgMjUzLCAgIDM4NzgsICAgIDE1NiwgICAgIDcwLAorICAgICAtMTAwOCwgICAgNjQxLCAgIDE1NDEsICAgLTIzNCwgICAxNDQwLCAgICA0MjEsICAgMTA4OCwgICAgNzM1LAorICAgICAgLTIwNiwgICAgLTgzLCAgICA0NjAsICAgLTEzOSwgICAgMTA3LCAgLTExNjAsICAgICAtNiwgICAyMDg3LAorICAgICAgMTg5NCwgICAtMTE3LCAgICA5NjIsICAgIDExMywgICAtOTkwLCAgICAgOTMsICAgIC0yOSwgICAgNTc5LAorICAgICAgMTIxNywgICAgLTUyLCAgIC0zNDIsICAgLTQ1MSwgICAgNjcwLCAgICAyMDIsICAtMTA3MCwgICAgODM3LAorICAgICAgLTEzMiwgICAzNTA3LCAgICAtNTksICAgLTExNCwgICAtNjkxLCAgICAyMDgsICAtMTE3MCwgICAxMDg5LAorICAgICAgIDMwNSwgICAtMjAwLCAgICA2MDMsICAtMTMwMSwgICAtOTQyLCAgLTE2MzEsICAgMTI5MSwgIC0yNzI3LAorICAgICAgIDQxNCwgICAgIDgwLCAgICA4MTUsICAgLTQ0MywgICAgIDU0LCAgICAtMzQsICAtMTE0MSwgICAxMzAxLAorICAgICAtMTE5OSwgICAgMzcyLCAgICAxMDIsICAgLTI1NywgICAgIDcwLCAgICA0NTAsICAgIC01NSwgICAgIDgwLAorICAgICAgLTIyNywgICAgMjE4LCAgICAyNjQsICAgIDczOSwgICAgLTUyLCAgIC0yMDAsICAgMzg3MywgICAgIDgzLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2I0NDQwc3MxW10gPSB7CisgICAgICA2ODc1LCAgIC0xMDQsICAgIC02NiwgICAgMTYxLCAgICAgNTcsICAgICAyNCwgICAgIC00LCAgICAgNzYsCisgICAgICAtMTIyLCAgIC0xMDAsICAgICAzMSwgICAgMTg4LCAgIC0xMTksICAgIC01MCwgICAtMjQ0LCAgICAgNDksCisgICAgICAgICAxLCAgIC0xMDAsICAgIDU1NSwgICAgMjUzLCAgICA0MzMsICAgIDYzMywgICAtMTYzLCAgLTUzNDUsCisgICAgICAtMTcwLCAgIC0yMTcsICAgIC00OSwgICAgLTI5LCAgICAzMzEsICAgIDYzMywgICAgLTg3LCAgICAtNDYsCisgICAgICAgLTI5LCAgICAgNDQsICAgLTE3NCwgICAgLTc0LCAgIDIxODgsICAgIDQzNCwgICAgNjYwLCAgIC01OTMsCisgICAgICAxNTQ4LCAgICAzNzksICAgMTQ0MywgICAxNjc2LCAgICAtNjMsICAtMjEyNSwgICAgMjQ2LCAgICA1MzQsCisgICAgICAtNDYzLCAgICA4NzIsICAgLTE2OSwgICAgLTEyLCAgICAgMzMsICAgIDIxMSwgICAtNDA5LCAgICA0MDgsCisgICAgICAxNTE0LCAgIC0xODksICAgLTI3NywgICAgMzkxLCAgIC0zNjEsICAgIC0zNSwgICAgMTQ1LCAgIC0zNjIsCisgICAgIC00NjY5LCAgICAyMTIsICAgIC05NywgICAgLTY1LCAgICAzODcsICAgIC04MSwgICAgIDcwLCAgICAgMzYsCisgICAgICAgNDQ4LCAgICAzMDMsICAgIDMzMiwgIC0xMDc3LCAgIC0yNTgsICAtMTM1MywgICAxMTg1LCAgICAtNTAsCisgICAgICAgLTEyLCAgICAtNzQsICAtMjEwMSwgICAyNDI5LCAgIDE4MTcsICAgLTkzOSwgICAgMzkzLCAgICAxNjksCisgICAgICAgLTIyLCAgICAtMzYsICAgMTIxOSwgICAzMjM3LCAgICA4MTYsICAgIDQ1MiwgICAxODA3LCAgIC02NDYsCisgICAgICAgNDA3LCAgIC00NDcsICAtMTc3OCwgICAtMzcwLCAgIC01MjgsICAgLTEyNywgICAgMTA0LCAgICA0MTYsCisgICAgICAtMTIxLCAgIC0xMzQsICAgIC02MiwgICAgIDIwLCAgIDE3NTEsICAgLTY0MCwgICAtMjIyLCAgICA5NTAsCisgICAgICAxNjAzLCAgICA1NTUsICAgICAgOSwgICAgMjE5LCAgLTEyNzIsICAgMjcyNCwgICAxMDA0LCAgIDEyMzcsCisgICAgICAtMzk1LCAgICAzNTYsICAgLTQ1MywgICAgLTk4LCAgICAtMjQsICAgICA4MCwgIC0xNjIxLCAgICA0NzQsCisgICAgIC0xOTQ3LCAgIC0yMzcsICAtMTA1OSwgIC0yMDkxLCAgICA3ODAsICAgMTIxMSwgICAgOTM5LCAgICAyNjgsCisgICAgICAtNDEyLCAgIDE5MjMsICAgLTQxOSwgICAgODUxLCAgICAyMzAsICAgIDU2NywgICAgMTQzLCAgICAgNDgsCisgICAgICAxNTA2LCAgIDIyMjgsICAtMTIyNiwgICAtNDUzLCAgICAyNDYsICAgIDQ2OSwgICAgNTQwLCAgIC01MzgsCisgICAgICAgLTk2LCAgICA5NzcsICAgIDUwOCwgICAgMTA1LCAgLTMxNTAsICAgLTE0MiwgICAgLTM3LCAgICAzOTUsCisgICAgICAgICA5LCAgICAtMzgsICAgICAgMSwgICAtMTM1LCAgIC0zOTEsICAgMTcwMiwgICAtMTc5LCAgLTE1NjYsCisgICAgIC0zMTgxLCAgLTE2NzksICAgIDIwMywgICAtMTUxLCAgICAzODcsICAgIDI1MCwgICAgNTYzLCAgICAyMDMsCisgICAgICAgNDQzLCAgIC0xNjgsICAgICA4MiwgICAgIDYxLCAgIDE2MDQsICAtMTg3OCwgICAgMjI5LCAgICAtODIsCisgICAgICAgMjA4LCAgIDI5NjUsICAgMTA5MywgICAgMjUxLCAgIDE1OTIsICAgLTQzMiwgICAtNTMyLCAgICAxNTMsCisgICAgICAgNDA3LCAgICAxNTcsICAgIDE5MSwgICAtMjE2LCAgICAgNTIsICAgIC01OCwgICAgOTM1LCAgLTIxNjEsCisgICAgICAtNDA5LCAgIC01MTMsICAgIDk3NywgICAtMTEzLCAgIDMyNDcsICAtMTIwNywgICAtNzQzLCAgLTExNzgsCisgICAgICAgMTM2LCAgICAyMDYsICAgIDE4NCwgICAtODg1LCAgICAtNjQsICAgICAxNiwgICAgLTIzLCAgICAtMjQsCisgICAgICAgNzMxLCAgIDE3NjksICAgLTk0MSwgICAxNTQzLCAgLTIzODYsICAgLTY2OSwgICAtOTU4LCAgICAyMzMsCisgICAgICAgMTA1LCAgLTExMjQsICAgIDk0OCwgICAgIDk3LCAgLTE5NDksICAgICA1OSwgICAtMTUyLCAgICAtNjUsCisgICAgICAgMTE0LCAgICAgODIsICAgIDM4NywgIC0xOTA4LCAgIC00OTIsICAgIDEyOSwgICAtNjI0LCAgICAgOTMsCisgICAgICAgNjU4LCAgIC03NTMsICAgMTAzMiwgICAyNDgwLCAgLTE3NzYsICAgIDM2MCwgICAgLTM4LCAgIDE5MjQsCisgICAgICAgMTY4LCAgICAtMTIsICAgIC0xMCwgICAtMTI4LCAgLTE3MTIsICAgLTQ0NiwgICAgOTM5LCAgICA0NjUsCisgICAgICAgNjA1LCAgIC01ODYsICAgLTI5OSwgICAtMzkzLCAgIDM4NzgsICAgIDExMSwgICAtMzc5LCAgICAxNDYsCisgICAgICAgMTg2LCAgICAtNTAsICAgLTI3OSwgICAgLTMwLCAgICAgLTMsICAgICAzNSwgIC0xOTQxLCAgICAzNjAsCisgICAgICAgLTc5LCAgIC0xMTEsICAtNDI4NywgICAgIC02LCAgICA2NzEsICAgLTIxNCwgICAtNzkyLCAgICAyNzcsCisgICAgICAgIDc3LCAgICAgNTgsICAgICAgOCwgICAgIDE2LCAgICAxMzMsICAgIDE2MSwgICAgIDIxLCAgICAgMzMsCisgICAgICAxNTM1LCAgIC0yOTYsICAtMjY2OCwgIC0zMTk4LCAgICAtMjgsICAgLTM4NiwgICAxMTU2LCAgICAxNDQsCisgICAgICAtMjAxLCAgICAyNTYsICAgLTQxMSwgICAgMjk4LCAgICAgNjcsICAgIDY3MCwgICAgIDExLCAgIC0yMjcsCisgICAgICAgIC00LCAgIC0xMDQsICAgICAxMiwgIC0xMDAwLCAgIDExOTIsICAgIDg2MCwgICAgODEzLCAgICAzNjAsCisgICAgICAgIDI1LCAgICAgOTMsICAgIDc5MiwgICAtMzUwLCAgICAgODEsICAgNDA0NiwgICAtMTc4LCAgICAxMjIsCisgICAgICAgMzMyLCAgICAgMjgsICAgLTExMiwgICAgIC04LCAgICAyODgsICAgIDUzOSwgICAgLTE3LCAgICAtNjMsCisgICAgICAgICA4LCAgICAyMzEsICAgICA1NSwgICAtNTE0LCAgICAxMDUsICAgLTM0NCwgICAgMjUyLCAgIC0xNTMsCisgICAgICAgIDU5LCAgICAtMTAsICAgIC0yMSwgICAgIDUxLCAgIDY3OTMsICAgICA0NSwgICAgMjU5LCAgICAzODQsCisgICAgICAgMjA5LCAgLTIwMTAsICAgIDMxMSwgICAtNzY5LCAgLTE5NTcsICAgMjc5MSwgICAtNDYzLCAgIC0yOTMsCisgICAgICAtMjE4LCAgIDEwMjYsICAgIDg5NywgICAtNzk4LCAgICAgNDcsICAgLTUyNSwgICAgIDMxLCAgICAtNDIsCisgICAgICAyMDE4LCAgLTI3NjcsICAgMTY1OCwgICAgNjg1LCAgLTE5NDcsICAgICA0NiwgIC0xNDY4LCAgICAzNDAsCisgICAgICAtMjcyLCAgICAzMTgsICAgICAyMSwgICAtNDIxLCAgIC0zOTYsICAgIDI0NCwgICAgLTUxLCAgICAyOTAsCisgICAgICAgIDQ1LCAgICAgIDMsICAtMTUzMCwgICAxMzU5LCAgLTM2ODEsICAgMTQ4NywgIC0xNjg5LCAgICAyMDksCisgICAgICAgNDM4LCAgIC03ODUsICAgLTIyMCwgICAgICAyLCAgICAtNTUsICAgLTQ4MywgICAgLTM1LCAgICAgNDAsCisgICAgICAgICA2LCAgICAxODksICAgLTIwMCwgICAgICAyLCAgLTIwMjYsICAtMTc0NywgICAgODM4LCAgIC04ODAsCisgICAgICAxMTI4LCAgLTMxMDgsICAgIDE4NCwgICAtNjcxLCAgIC0yNjEsICAgICAgOCwgICAgMjk2LCAgIC0xMzAsCisgICAgICAgLTc4LCAgIC0yNjgsICAgLTEwMCwgICAgIDE4LCAgIC0xMDUsICAgICAtOSwgICAgNDQ4LCAgIDMxODQsCisgICAgICAtNTcwLCAgICA2NTYsICAgLTM3NiwgICAtOTY5LCAgIDE2ODIsICAgMjYzNSwgICAtMjc3LCAgICA1NzcsCisgICAgICAgMjE3LCAgICAyODEsICAgIDIxOSwgICAtMzUxLCAgICAgMzEsICAgICA2NCwgICAgMTAxLCAgICAgODIsCisgICAgICAgOTU3LCAgLTE4ODUsICAgIDc3NCwgIC0zNTM2LCAgIC0xNjgsICAgLTQzMSwgICAtMTA2LCAgIC00NzksCisgICAgICAxMDQxLCAgIC0xMDMsICAgIDc3NCwgICAtMTQyLCAgICA4OTQsICAgLTcyNCwgICAgLTk0LCAgIC03NjYsCisgICAgICAgLTU4LCAgICAxMTIsICAgMjAyOCwgICAgNTY2LCAgIC0zNDYsICAgLTEzOSwgIC0yNjcxLCAgLTE5MDcsCisgICAgICAxMDM5LCAgICAxODksICAgIC0zMywgICAxNjkwLCAgICAyNjMsICAgLTUxNCwgICAtMjI1LCAgIC0yMzcsCisgICAgICAgMTQ1LCAgIC0zMTksICAgICAzOCwgICAgMTE2LCAgIDI4OTEsICAgIC03NywgIC0yMDY1LCAgIDI1NTksCisgICAgICAtMzI3LCAgIC03NjMsICAgICA4NiwgICAtMTcyLCAgIC0yODMsICAgLTE0NywgICAgMTM3LCAgICAyNDUsCisgICAgICAtMzMzLCAgICAyMjAsICAgICA5MiwgICAgMTk0LCAgIC0xNzYsICAgIDEwNSwgICAzMTA4LCAgICAzMjksCisgICAgICAtMzcyLCAgLTExODgsICAgIDY3MCwgICAgNzczLCAgIC0yMzUsICAgICAzNCwgICAtMTQ2LCAgICA4NzYsCisgICAgICAtMjU5LCAgLTE1ODAsICAgIDg3NiwgICAgMTA1LCAgICA1ODIsICAgIDI1OSwgICAgLTYzLCAgICAtOTksCisgICAgIC0xNTU4LCAgIDExMjIsICAtMTU0MSwgICAtNDM4LCAgICAyMjcsICAgMTIyMSwgIC0xMjk3LCAgIC03NDYsCisgICAgICAyNjk4LCAgICAtMjksICAgMTE2OSwgICAgOTk1LCAgICAgLTIsICAgIDIwMSwgICAgMzkyLCAgIC00MDUsCisgICAgICAgLTIyLCAgICAtMzYsICAgIDc1NywgIC00MDM5LCAgICA3MjUsICAgMTk2MCwgICAxNDc4LCAgIC0xMDcsCisgICAgICAgIDY3LCAgIC0zNjcsICAgIC05NywgICAgLTg4LCAgICAxNTQsICAgIC04MCwgICAgICAwLCAgIC0yNjUsCisgICAgICAtMTYzLCAgICAgMTQsICAgLTEwOSwgICAgIDMzLCAgICA1OTcsICAgIDExNSwgICAgNTQzLCAgICA0NjgsCisgICAgICAtNzU3LCAgICA4MjYsICAgIDUwOSwgICAtMTc2LCAgIC0zMDUsICAtNDk1OSwgICAtMTE4LCAgIC00NjQsCisgICAgICAtNDIxLCAgICAtNzIsICAgICAgMSwgICAtMTg3LCAgICAxMjMsICAgIC04OCwgIC0xMDg2LCAgICAgMjYsCisgICAgICAgMzY4LCAgICA2MTAsICAgMzM5NCwgICAtMzM3LCAgICAzNjQsICAgMjU5NCwgICAgNDkxLCAgICA3NTksCisgICAgICAtMzA5LCAgICAzOTUsICAgIDE1MiwgICAgMzM4LCAgICAyNDksICAgIDMwMywgICAtMTIyLCAgICAgNjMsCisgICAgICAxMDE5LCAgIC04NjQsICAgMTU0NiwgICAgMTk2LCAgICAgNzUsICAgLTYzMywgICAgLTkzLCAgIC02MzEsCisgICAgICAgNzc3LCAgICAtNzQsICAgMTIzNSwgICAtNzQ1LCAgICAzNzcsICAgMzExMywgICAtMTc0LCAgIC0yODIsCisgICAgICAgLTI0LCAgICAgODksICAgLTkyMCwgICAyMTI0LCAgICA2MjAsICAgIDU2NiwgICAxMjkwLCAgIDI5NzcsCisgICAgICAxMTgwLCAgICAyNzgsICAgIDE4OCwgICAgNzUwLCAgICA5ODEsICAgLTM1NywgICAgIDgwLCAgICAgNjksCisgICAgICAgIDc3LCAgIC0xNTEsICAgIDE1MCwgICAgLTE1LCAgICA4MzQsICAgLTg5MywgICAgODE4LCAgIDE2NTUsCisgICAgICAtNTAwLCAgICAyMzcsICAgIDEzMywgICAgMjQzLCAgICA0MDUsICAgIDIzOSwgICAgIDE2LCAgIC0xNTIsCisgICAgICAgLTcwLCAgLTM2OTIsICAgLTExMCwgICAgMTQ1LCAgICAgNTgsICAgIC01NywgIC0yNTI3LCAgIDMwNzIsCisgICAgICAyMjI2LCAgICAyMTgsICAgLTgyNCwgICAgMzg0LCAgICAtOTYsICAgIDExOSwgICAtMjI4LCAgIC0xOTQsCisgICAgICAgMTM2LCAgICAxMTEsICAgLTI1MSwgICAtMTA5LCAgIC0xNzksICAgIC0zNCwgICAgMTQzLCAgICAxMDksCisgICAgICAxMTU3LCAgIC0yMTYsICAtMTQyOSwgICAtNzAyLCAgICAzMjMsICAtMTE5OSwgICAgLTYwLCAgICA2MzIsCisgICAgICAtNTg1LCAgIC0zNDAsICAgMTA0MCwgICAgNDcxLCAgICAtMzIsICAgLTM4MCwgICAzNDMyLCAgICA0NTUsCisgICAgICAtMTM4LCAgICAtMzksICAtMjQxNiwgICAgNjUyLCAgIC0yNTMsICAgIDE0NSwgICAgMjgxLCAgICAzOTMsCisgICAgICAtNjcxLCAgIDI4NDEsICAtMTYxNiwgICAgLTQ2LCAgIC0zODUsICAtMTQxNywgICAtMjczLCAgIC0xNjgsCisgICAgICAgMzE4LCAgIC0yNjMsICAgICAtMiwgICAgLTY5LCAgIC02MzgsICAgLTEzNywgIC0yNjY4LCAgIC0zNTksCisgICAgICAgLTg2LCAgICAgNzksICAgLTc3NywgICAtNDA0LCAgIC01NjAsICAtMzUzMywgICAgMTIyLCAgIC0xMTMsCisgICAgICAgNjE3LCAgICA0OTcsICAgIDExNywgICAtMjY4LCAgICAxMTAsICAgICA3MywgICAgNzUyLCAgLTExMDUsCisgICAgICAtNTIxLCAgICA3NjIsICAgIDY5NSwgICAtNTg3LCAgIC0xNDcsICAtMTIzNSwgICAxODY2LCAgLTIyNTAsCisgICAgICAtNjcxLCAgIC01MTEsICAtMjE3OCwgICAtODIwLCAgIC02MTksICAgIDE2MiwgICAgLTM3LCAgICAxMDIsCisgICAgICAtMzQyLCAgIC0yNzgsICAgNjgzNywgICAtMjc4LCAgICAxODUsICAgICAxMCwgICAgMzYxLCAgICAtNTIsCisgICAgICAtMTcxLCAgICAyNDYsICAgIDE4NCwgICAtMTc1LCAgICAgMTksICAgIDE2NiwgICAgLTQ4LCAgICAtNDEsCisgICAgICAgIDkyLCAgIC0xNTIsICAtMTIyNywgICAtOTgzLCAgLTM5ODUsICAgLTcwMywgICAxMTQzLCAgICAyMDQsCisgICAgICAtNTIzLCAgIDEwNTMsICAgLTYyMywgICAxMDAyLCAgICAyMzEsICAgICA1MywgICAtMjc3LCAgIC00MDksCisgICAgICAgLTY3LCAgICAtNTYsICAgIC05MCwgICAgLTQ3LCAgICA0NDgsICAgIDc1NCwgICAgNTU0LCAgICA5NzIsCisgICAgICAgNTA1LCAgIC0zMzEsICAgNDk0NiwgICAtMTkzLCAgICAgODksICAgIDUzMCwgICAgLTI0LCAgIC0xNzIsCisgICAgICAgMjU0LCAgICAyNDQsICAgIDE0MCwgICAgLTEwLCAgICAgNDAsICAgIC03NywgICAxNjU1LCAgIC00MzgsCisgICAgIC0yNzc2LCAgICAgNTEsICAgLTU1MywgICAgNTkyLCAgLTI5MDIsICAgIDI4MCwgICAgODA0LCAgICA3NzYsCisgICAgICAgMTMxLCAgICAgNjksICAgLTIwNywgICAgMTMxLCAgICAgIDcsICAgIDIwOSwgICAgIDkzLCAgICAtMTksCisgICAgIC0xMTQ4LCAgIC03MzMsICAgMjY3NCwgIC0xNjI4LCAgLTEyNDMsICAgLTUwNiwgIC0yMzQ2LCAgIC04NTcsCisgICAgIC0xMDI4LCAgICA2NjYsICAgIDM2NSwgICAtMzUzLCAgICAxMDUsICAgIDEyMCwgICAgMjEwLCAgICAtODUsCisgICAgICAgIDM3LCAgICAtNDAsICAgMTAyNywgICAgIDExLCAgIDEyMzQsICAgICAtNSwgIC0xOTc2LCAgICA1MTUsCisgICAgICAgMjg5LCAgIDM4MTUsICAgLTE0MiwgICAtMTg4LCAgIC0yNDgsICAgLTI3MywgICAtMjY1LCAgICA1OTMsCisgICAgICAgMjA1LCAgICAxNjQsICAgIC02NSwgICAgIDcwLCAgIC05OTIsICAgMTU4NiwgICAyMTMwLCAgICA3NzksCisgICAgICAgIDkyLCAgLTMwNjcsICAgIDQyMSwgICAgICAxLCAgIDExNzIsICAgIDQ5NiwgICAtOTE3LCAgIC03NjAsCisgICAgICAgMTY5LCAgICAtNjQsICAgICAxNCwgICAgLTQwLCAgIC0yNDcsICAgIC05NSwgICAxNzY5LCAgIC0xNDUsCisgICAgICAgNzEyLCAgIC03OTQsICAgLTU3MSwgICAgMjQwLCAgLTE3NzQsICAgIC0zOCwgICAtMTI5LCAgIC04MzYsCisgICAgICAzMzcyLCAgICA4ODcsICAgLTQ1MSwgICAgIDczLCAgIC0xMDcsICAgIDE4MiwgICAgMTAwLCAgICAgMTQsCisgICAgICAtNzAzLCAgIDI1NTksICAgIDQ5MCwgICAtODM5LCAgIC0zMzMsICAgIDEzNCwgICAgODA0LCAgLTM1NDksCisgICAgICAgIDUwLCAgIC0xOTksICAgLTIxNSwgICAtMzcwLCAgICA0NTMsICAgIC04NiwgICAgMTUxLCAgICAtOTgsCisgICAgICAgLTU4LCAgICAxMjgsICAtMjYyNCwgIC0xNTA3LCAgLTE2MjMsICAtMjE4NiwgICAgLTg5LCAgICAtNTUsCisgICAgICAtNDcyLCAgIC02NjcsICAgICAgMiwgICAtNDM5LCAgLTE0NTMsICAgLTI2MiwgICAgNTY1LCAgICAgNTYsCisgICAgICAtMTE4LCAgICAyODgsICAgIC01NiwgICAgIDg3LCAgIC0zOTgsICAgIDcyOSwgICAgIDQwLCAgLTYwMTUsCisgICAgICAgMjE5LCAgIC0yMTIsICAgIDI4NywgICAtMjUwLCAgIC0yMTEsICAgIC0yOSwgICAgLTYxLCAgICAtNTUsCisgICAgICAtMTIwLCAgICAtOTIsICAgICAzMCwgICAgMTI5LCAgIC0xMjIsICAgIDExMSwgICAyMDM3LCAgIDEyNjAsCisgICAgICAgOTQzLCAgIC0yNTIsICAgIC0xMywgICAtNzk0LCAgLTI1NzAsICAtMTExNywgICAgMjk3LCAgICAzNzQsCisgICAgIC0xNjI5LCAgICAgLTEsICAgLTQwNywgICAtNTk3LCAgIC0zMjQsICAgLTE3OSwgICAgNDA4LCAgICAgNTgsCisgICAgICAtOTAyLCAgLTE2NzIsICAgIDYxMSwgICAtMTk4LCAgICAtNjEsICAgIDEwMywgICAgMzY2LCAgICA5MTUsCisgICAgICAgODExLCAgIC0yODAsICAgLTQwMSwgIC0zODQ5LCAgIC0xMTEsICAgIDIyMSwgICAgMzUzLCAgICAyMzIsCisgICAgICAgICA0LCAgICAtMTgsICAgIDY3MywgICAxNzkyLCAgLTIzNTAsICAgIDEzMiwgICAxOTc5LCAgLTIzMTgsCisgICAgICAtNDE3LCAgIC02ODksICAgIDMyNiwgICAgNzY4LCAgIC0zNzcsICAgLTUyMiwgICAgMzczLCAgIC0zODksCisgICAgICAtMTA1LCAgIC0xMDMsICAgICAzMywgICAgLTQ4LCAgIDE0OTcsICAgMTEyNSwgICAxODkzLCAgLTI3NDQsCisgICAgIC0xMjE5LCAgICA5MjEsICAgIDQ3MiwgICAtMTY1LCAgIC00MzgsICAgLTEyOSwgICAtNjgyLCAgIC03ODMsCisgICAgICAtNjg1LCAgICAxNjcsICAgLTcxNSwgICAgMTU2LCAgICAgNjQsICAgICA2MSwgICAxMTQ3LCAgIC04OTIsCisgICAgICAgLTcyLCAgICA1NzksICAgMTE5MSwgIC0yNzU5LCAgIDE4MzEsICAgMTg5NSwgICAgNjYzLCAgICA4MTYsCisgICAgICAgLTk4LCAgICAtNjEsICAgLTIyMywgICAtMzY2LCAgIC00MjksICAgICAzMSwgICAtMTI5LCAgIC0xMjEsCisgICAgICAtMjU1LCAgIDE4MDQsICAgIDEzOCwgICAgMTgwLCAgLTEwNjMsICAgIDU5OCwgICAgNzYzLCAgICA3MjAsCisgICAgICAgMzg1LCAgIC01MjYsICAgIDE0MywgICAgIDgwLCAgICAxNjgsICAgIDk3NiwgICAtNzE0LCAgICAyMzYsCisgICAgIC0zMjA0LCAgICAgOTMsICAgIDg3NCwgICAgMjM4LCAgIC0zNTksICAgMTU5NSwgICAgMTkxLCAgICA1NjgsCisgICAgICAtMTgyLCAgICAgMjAsICAgLTYwOCwgICAtMjg4LCAgICA2MDIsICAgLTIyNCwgICAzODc0LCAgIC0zMDgsCisgICAgICAgLTcwLCAgIC04MjYsICAgLTEwOSwgICAgLTQyLCAgIC04ODIsICAtMTQyMSwgIC0xNjAzLCAgICA2MjUsCisgICAgIC0xMjA2LCAgICAgMzEsICAgIDc4MiwgICAtMTA2LCAgIC03MDAsICAgLTI0NiwgICAtNTcxLCAgIC0xMjQsCisgICAgICAtODQ4LCAgIC0zOTAsICAgLTUyMywgIC0yOTAzLCAgICAgLTksICAgICAzOSwgICAtMTA5LCAgIC0xOTksCisgICAgICAgNDk3LCAgICAtMTEsICAgIDM3NywgICAgICA1LCAgICAgMjUsICAgLTExNSwgICAgLTYxLCAgICAyODMsCisgICAgICAgIDI3LCAgIC0xMzEsICAgLTE5MywgICAgMjgwLCAgICAxNzgsICAtNTQzOSwgICAgIDQ0LCAgICAtNTIsCisgICAgIC0xMjEwLCAgIC02MTcsICAgLTE2MiwgIC0xMDk3LCAgICAgLTMsICAgIDc0OCwgICAgLTQ1LCAgLTExOTcsCisgICAgIC0xMDU4LCAgICA5MDksICAgMTYwNywgICAgNjkzLCAgICAgNDIsICAgLTc0OSwgIC0zMDAxLCAgICA0MDcsCisgICAgICAgLTYyLCAgICAgNDUsICAgIDIxNCwgICAtMzEyLCAgLTEwNTQsICAgIDQ5OCwgICAxMjkxLCAgIDExODksCisgICAgIC0xMjY4LCAgIDEwODMsICAgLTc1NywgICAtMzE5LCAgLTI3OTYsICAgLTcxNiwgICAgMzEwLCAgIDE1ODMsCisgICAgICAtNjA4LCAgICAzMTksICAgIC04NCwgICAtMTE5LCAgLTE0MTUsICAgLTYwMiwgICAgNjI4LCAgICA0NjMsCisgICAgIC0xMjEzLCAgIC03OTQsICAgLTQ3NCwgICAyNjgyLCAgICA5MzEsICAgIDI0MCwgICAyNDkxLCAgICAgNzYsCisgICAgICAtMjM0LCAgIC0xNjEsICAgLTY5MCwgICAgMzU5LCAgICAgMjgsICAgIC0xOSwgICAtNzc0LCAgLTEwMjMsCisgICAgICAgNzM4LCAgICA2NzUsICAgIDI0OCwgICAgIDUyLCAgIC0zNDgsICAgLTU0NSwgIC0yNzE1LCAgIC01OTksCisgICAgICAtMjUyLCAgICA2NjAsICAgLTM4NywgICAtMTA0LCAgIDIzMTYsICAgIDQ1NiwgICAgLTkwLCAgICAxMDAsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjQ0NDBzbTBbXSA9IHsKKyAgICAgLTY0NDgsICAgIC01OSwgICAgMjk4LCAgIC02NTksICAgIC01OSwgICAgMzI5LCAgIC01NjksICAgIDM5NywKKyAgICAgIC0yMjQsICAgIDEyOCwgICAtMjE2LCAgICAxNTMsICAgLTEwMCwgICAgMzE5LCAgICAtNTMsICAgIC05MCwKKyAgICAgICAgNTAsICAgMzMxMywgICAgICA0LCAgIC0yMTUsICAgIDQwNSwgICAtMjU2LCAgICAgNzgsICAgMjg5MCwKKyAgICAgIC0xODcsICAgLTk2OSwgICAgMTk1LCAgLTEwMjIsICAgLTExOSwgICAgMjE0LCAgICAyNTQsICAgLTM2MCwKKyAgICAgIC0yMjIsICAgICAzOSwgICAyMTM5LCAgICAgOTEsICAgLTI5MCwgICAgNTI5LCAgICAtNzMsICAgIC0xNiwKKyAgICAgIC0zMTgsICAgIDEyOCwgICAtMzQ4LCAgICA1NjUsICAtMTE5MCwgICAgMjAyLCAgIC0xODUsICAgLTIzNCwKKyAgICAgIDM0OTgsICAgICA0OCwgICAgIDY4LCAgLTE5MTcsICAgMTY5NCwgICAgMjEyLCAgIC00NzcsICAgIDIzOSwKKyAgICAgLTMzMDEsICAgLTQ4OSwgICAgNDI0LCAgICA0MTgsICAgIC04MiwgICAgLTYxLCAgICA1OTksICAgMTUzMCwKKyAgICAgIC0yMDAsICAgLTI1MiwgICAgMTYyLCAgIC0yNDMsICAgICA0MywgICAtNTM0LCAgLTI2OTUsICAgIDI1NSwKKyAgICAgICAzMTcsICAgIDQ4OSwgICAgMjc5LCAgIDMzMzcsICAgIDI0NiwgICAtMzQ5LCAgIC0xNDksICAgLTEyOCwKKyAgICAgIC0xNDYsICAgIDI1NiwgICAtNDU1LCAgICAxMzcsICAgIC03NSwgICAgODM2LCAgICAyMDksICAgLTM0OSwKKyAgICAgIDM0OTQsICAgIDI1NSwgIC0xOTQ4LCAgIC03MzIsICAgIDM2NywgICAxMzczLCAgIC0yMTEsICAgIDYwOCwKKyAgICAgICAzNDUsICAgIC0xNywgICAgIDQzLCAgICAxMDIsICAgICAxOSwgICAtMjE5LCAgICAxNzMsICAtMjM2MSwKKyAgICAgICAxMzAsICAgLTg2MiwgICAgNjM3LCAgIC0xMDMsICAgLTU4OSwgICAgMjE5LCAgLTEyNjEsICAgLTIzOCwKKyAgICAgLTI1MjgsICAgMTY0MywgIC0xNTg3LCAgIC02OTAsICAgLTE2NiwgICAgICA3LCAgICAtNTcsICAgMTIyMSwKKyAgICAgICAzMjYsICAgIDEwMywgICAtODMwLCAgICA2MDgsICAgIDE5NiwgIC0zNzA1LCAgIDExMDMsICAgIDU2OCwKKyAgICAgLTE2MDIsICAgIDU0MywgICAtMTUzLCAgIC00MTYsICAgICA3NCwgICAgMTg1LCAgICAxNTYsICAgICAzNCwKKyAgICAgIDEzMjksICAgLTc5OCwgICAtMjE0LCAgIC01MTUsICAgIDEyMSwgICAtNzk3LCAgICA3NDksICAgIDM0NiwKKyAgICAgICA2MjksICAgLTYwOSwgICAtODc3LCAgICAtNjAsICAgIDE4NCwgICAtMTU3LCAgICAyNTAsICAgIDE5MywKKyAgICAgIDQzODUsICAgIDM2OSwgICAtMTgxLCAgIC0xOTEsICAgLTMwOCwgICAtMzE0LCAgIC0zOTUsICAgLTE3MywKKyAgICAgICAtODgsICAgLTM4OCwgICAgLTQzLCAgICAgNDYsICAgICAgOSwgICAtMTY3LCAgICAxODksICAgLTE5MiwKKyAgICAgIDYwODYsICAgLTIyNiwgIC0xNzk1LCAgICAxMjYsICAgLTk0MSwgICAtNDIzLCAgICAzOTcsICAgIDM4MCwKKyAgICAgICA0NjEsICAgIDMxOSwgICAgMzY0LCAgIC0xOTQsICAgIDQzMywgICAxMjE0LCAgLTM3MTUsICAgLTI3NCwKKyAgICAgICAgIDksICAgLTMyNywgICAgMjEyLCAgIC0zNzUsICAgIDEzMCwgICAtOTE3LCAgICAtNjMsICAgMTEyMCwKKyAgICAgIC02NTEsICAgLTIxMSwgICAgMTQ5LCAgLTExMjgsICAgIDI2NSwgICAgLTczLCAgLTQ2MzAsICAgIDQ5MywKKyAgICAgICAtODMsICAgIC0yMCwgICAtMzE0LCAgICAtOTEsICAgIDkxMCwgICAtMTA5LCAgICAgLTMsICAgLTQxNywKKyAgICAgIC0xMDksICAgIDM3NCwgICAgMzU3LCAgLTI3NzMsICAgIDI1MywgICAtMjM0LCAgIC0zMDYsICAtMzA2MCwKKyAgICAgIC03NjIsICAgICA1MywgICAgNDc2LCAgIC0yOTksICAgIC04OSwgIC0yNDQwLCAgIC02NTgsICAgIC04MywKKyAgICAgIC04NTQsICAgMzc3MCwgICAgMzc0LCAgICA1NTIsICAgIDQ1MCwgICAgIDUxLCAgICAzNDYsICAgIDg4NywKKyAgICAgIC00NjMsICAgIDE4OSwgICAgMjU0LCAgICAxODIsICAgICAxNSwgICAgLTM3LCAgLTMyNjMsICAgMjU5NCwKKyAgICAgIC02NDcsICAgIC04MywgICAgNDA0LCAgICA3NzAsICAgIDY5MSwgICAtNjU0LCAgIC0zMDEsICAgICA4MSwKKyAgICAgICAtMTMsICAgIDc0MiwgICAgMzcxLCAgICAgNTQsICAgICAzMSwgICAgLTgzLCAgICAtNTksICAgNDE5NiwKKyAgICAgICA2NTMsICAgIDI1NiwgIC0xMDc1LCAgIC01MzksICAgMTA4NCwgIC0xMDc3LCAgIDEyMzgsICAgIDI1OSwKKyAgICAgICAgMjAsICAgLTE5MSwgICAgODU0LCAgICAxNzksICAgIC00NywgIC0xMDI1LCAgIC0xODksICAgIDI4MSwKKyAgICAgIDI1NTYsICAgMTc2NSwgICAgMTA2LCAgICAtNzksICAgIDMyMCwgIC0zMDY2LCAgICAyMjgsICAgLTUwMCwKKyAgICAgICAgIDEsICAgLTE4MywgICAgLTQ2LCAgICAyMjAsICAgLTIzMywgICAgLTUwLCAgICAtOTgsICAgLTI2MSwKKyAgICAgICAtODQsICAgIC0yNSwgIC00Mzc4LCAgIC00MjgsICAtMTM5NSwgICAtNTgyLCAgIC02MTksICAgIDQ0MywKKyAgICAgLTE0NTYsICAgIDM3NSwgICAgMTQ0LCAgICAtMzIsICAgIDM1NiwgICAtNDU0LCAgICAgMjgsICAgIDEzNiwKKyAgICAgICAgIDUsICAgIDI0NywgIC0xMDU3LCAgICA3MDksICAgLTM2MiwgICAgMjkzLCAgIDMwODQsICAgIDU0NSwKKyAgICAgLTI4MDQsICAgLTYyNSwgICAgIDE2LCAgIC0yMjgsICAgLTIzOCwgICAgMTY0LCAgIC0yMDEsICAgLTExNCwKKyAgICAgIC0xNDksICAgICA1OCwgICAgLTc0LCAgICAyMDMsICAgIDI3MSwgICAgNDYyLCAgIDEwMzcsICAgIDE1OSwKKyAgICAgLTE2NTIsICAgLTU5MSwgICAtODQ2LCAgIC0xNjYsICAtMzI3MiwgICAgNzEwLCAgICA3NzMsICAgIDgyNCwKKyAgICAgLTExMzgsICAgIDYzMCwgICAgLTE0LCAgICAyMDksICAgIDM0OCwgICAxNDc2LCAgICAzMjIsICAgLTM3MSwKKyAgICAgICAyNDEsICAgNDEzMywgICAtODc3LCAgIC00NzYsICAgLTM5MSwgICAgNjAyLCAgIDEyNTksICAtMTIwNCwKKyAgICAgICAzNTIsICAgICA5MCwgICAtNDczLCAgICAgNDMsICAgLTE1MiwgICAtNDM5LCAgIC0xMzEsICAgLTIxNywKKyAgICAgLTE1NTksICAtNTAyOSwgICAtMTg2LCAgIC0yMzksICAgIC00NCwgICAgNzUwLCAgICAgMzMsICAgLTE2NywKKyAgICAgIC0yMTEsICAgIC02NywgICAgLTkxLCAgIC0xNDMsICAgIDEyNCwgICAgIDMyLCAgICAtMTYsICAgODE5MiwKKyAgICAgICAgNjgsICAgLTEwMiwgICAgMTYzLCAgICAtMzEsICAgIDQ1OCwgICAgIDM4LCAgICAyNDksICAgICAyMSwKKyAgICAgICAxNTcsICAgIC02MywgICAgIDM2LCAgICAgNDksICAgIC0yMiwgICAgIDg5LCAgICAgIDksICAgIDE1MywKKyAgICAgICAgNDYsICAgICA2MCwgICAtMTQ2LCAgICAtMTMsICAtNzUwNiwgICAtMTA0LCAgICAxMDEsICAgLTE0MSwKKyAgICAgICAgMjUsICAgIDE2NSwgICAgLTg0LCAgICAyMTksICAgICA1MywgICAtMTgyLCAgICAtOTQsICAgICA0NiwKKyAgICAgLTEzMTQsICAgLTM3MSwgICAtMjk4LCAgIC01MjcsICAgICAgNiwgIC0xOTU1LCAgICAgNTIsICAgLTcxNCwKKyAgICAgIC00NjEsICAgIDE3NCwgICAxNDUwLCAgIC0yOTgsICAgIDEwNywgICAyOTY1LCAgICAyNTAsICAgIC02NSwKKyAgICAgICAgNDYsICAgLTE3MSwgICAgMjk2LCAgIC03ODUsICAgLTc4NCwgICAgIDM1LCAgICAgMzYsICAgICAyOSwKKyAgICAgICA5MTUsICAgLTg5MSwgICAtMzkxLCAgICAxNjgsICAgIDUwOSwgICAzNzYzLCAgLTEyNjcsICAgLTEzOCwKKyAgICAgICAxMzIsICAgIDQyNCwgICAgLTUzLCAgIC02NjksICAtMTQ5MSwgICAtOTI3LCAgICA3MTIsICAgLTYzOCwKKyAgICAgIC00NDAsICAgLTI5OSwgICAgNTIyLCAgIDE1OTMsICAgIDQ0NSwgICAzMjM0LCAgICA1NDcsICAgIDQ5OCwKKyAgICAgICA0NDAsICAgIDE0NSwgICAtMTM1LCAgIC0xODgsICAgLTI5NiwgICAxMDgwLCAgICA0NjgsICAgICA3NywKKyAgICAgICAxNzYsICAgLTMxNSwgICAgMjIxLCAgIDQ3ODQsICAgLTY2NiwgICAgMjc0LCAgICA3NjIsICAgIC00MiwKKyAgICAgICAyMTgsICAgIC04NiwgICAtMjczLCAgICAxMTYsICAgIDgxNCwgICAgLTIxLCAgICA0MDIsICAgLTI2NiwKKyAgICAgIC0zOTIsICAgLTQyNSwgICAxMTI2LCAgICAtNjgsICAgIDE0MiwgICAgMzU3LCAgIDUxNDMsICAgIDM2MywKKyAgICAgIC0yMjQsICAgLTE5OCwgICAgMTE1LCAgIC0yMjEsICAgLTI2MiwgICAtNzM2LCAgLTI3NzQsICAgLTE5NiwKKyAgICAgIC0yMDgsICAgLTYxMywgICAgMTYzLCAgICA2OTYsICAgIDc4OSwgICAgMTMyLCAgICAxMTQsICAgIDEyMSwKKyAgICAgLTMxMzgsICAgIDE2NCwgICAgMTcyLCAgIC0xODksICAgIDIzMiwgICAgIDUzLCAgICAzMTAsICAgIC01MCwKKyAgICAgIC00MDcsICAgMTIwNywgICAtNDc0LCAgICAyNDksICAgLTgwNiwgICAgIDIxLCAgICAgMjAsICAgICA3MiwKKyAgICAgIC01MzQsICAgIDEwMSwgICAgLTQ3LCAgIC0yMjMsICAtNDU2OCwgICAtMTI4LCAgICAtMjksICAgLTkxMCwKKyAgICAgIC0yNTQsICAgIDEwNSwgICAzMTYzLCAgIC0xMTksICAgLTEzNSwgICAxNzQ1LCAgIDE3NDQsICAgMTEwNSwKKyAgICAgICAyOTEsICAgLTMzMywgICAtMjc4LCAgIC00NDEsICAgIDY2MCwgICAgMTQxLCAgIC0yOTEsICAgIDMxNCwKKyAgICAgICAxNDksICAgIDE0MiwgICAtMTIxLCAgLTc4NzgsICAgLTI0MCwgICAtMjA0LCAgICAxODksICAgIDM3NiwKKyAgICAgICAgIDMsICAgLTEyOSwgICAgIDU5LCAgICAgNDYsICAgIDE3MCwgICAgIDgyLCAgIC0xNTAsICAgIC0zNCwKKyAgICAgICAgNjcsICAgLTExMCwgICAgNjM1LCAgICAxNDgsICAgIDI1NiwgIC0yOTM5LCAgICAxNTcsICAgLTUwOSwKKyAgICAgIDE0MzksICAtMjQ3MCwgICAgNzk0LCAgIC0yOTgsICAgIDQwNywgICAgOTgwLCAgICA4MDUsICAgIDM0OSwKKyAgICAgICAyMDgsICAgIC0zNSwgICAxMDA5LCAgIDExODAsICAgLTExNCwgICAgNzc2LCAgIC0zMzksICAgLTc3NiwKKyAgICAgICAyNTAsICAgMTk1MSwgICAtNTU3LCAgICAxNzIsICAgLTM5NSwgICAgNzk1LCAgLTMwNzUsICAgLTM0OCwKKyAgICAgIC0xMDYsICAgIDEyMiwgICAgLTQ3LCAgICAgLTksICAgICA1NSwgICAgIDQwLCAgIDMwMDIsICAgIDQyMSwKKyAgICAgICA1MzgsICAgICAtMSwgICAtMjc3LCAgLTMwNjIsICAgIC0xNSwgICAgMTY4LCAgICA0NjEsICAgIDUyMSwKKyAgICAgIC01MjUsICAgIDQxMywgICAtMTk2LCAgICAxNTksICAtMzMxNCwgICAgLTg1LCAgICA5ODMsICAgIDU2NSwKKyAgICAgLTMxMTMsICAgICAzOCwgICAgIDc5LCAgIC0xNzIsICAgICAyMCwgICAtMjI4LCAgIC01MjAsICAgIDM0NiwKKyAgICAgICAgNDcsICAgIDQ4NSwgICAtMTc3LCAgICAgNTEsICAgIDE3NSwgICAgNDQ0LCAgIDM0NzUsICAtMzQxNiwKKyAgICAgICAtODEsICAgIDExOCwgICAgMjY0LCAgIC0xNjIsICAgICAyMCwgICAtMTkyLCAgIC0yMTksICAgLTExMSwKKyAgICAgICAtNTcsICAgLTIyNSwgICAgMTU5LCAgIC0yMTgsICAgIDExNywgICAgLTI4LCAgIC0xNTAsICAtMTEwMCwKKyAgICAgIC02ODEsICAgIDQ0NCwgICAgLTU0LCAgICAtMTEsICAtNDY2OSwgICAtMjE2LCAgLTExNTEsICAgIDg1OCwKKyAgICAgICAxNjgsICAgIC0zOSwgICAgIDUyLCAgICAzODcsICAgICA3NCwgICAgLTM5LCAgIC0xNTQsICAgMjc2NywKKyAgICAgICAzMDcsICAgLTEzMiwgICAgNTMxLCAgICAxNzUsICAgIDkwNiwgICAgIDE0LCAgIC0xMjksICAgICA0OSwKKyAgICAgLTMzODksICAgIDQ3NiwgICAtMTI3LCAgIC0zMjksICAgIDQ3OSwgICAgMTE4LCAgICAtODUsICAgIDIwOSwKKyAgICAgICAgIDQsICAgIDIyNywgICAgMTU0LCAgICAgLTIsICAgLTIzOCwgICAgMjYzLCAgICAtMjQsICAgIDU1MywKKyAgICAgIC0yMzEsICAgICA3OCwgICAgICAyLCAgIC0xODMsICAgICAzMSwgICA1OTMzLCAgICAxMTcsICAgICA4NiwKKyAgICAgICAzODYsICAgIDM1OSwgICAgMTUzLCAgICAxMDEsICAgLTc4NCwgICAtNTUzLCAgICAtMTMsICAgIDI1NiwKKyAgICAgIC0zNDcsICAtMTMxMSwgICAtOTM2LCAgICAtNjQsICAgMTcxOCwgICAtNDQ0LCAgICAxNjgsICAgLTU5MCwKKyAgICAgLTMyNTIsICAgLTE5NCwgICAtMjQzLCAgIC0yNjksICAgMjA5NiwgICAtOTk0LCAgLTEwODEsICAgIDMwOSwKKyAgICAgIDEwMDMsICAgIDI5MCwgICAgLTY2LCAgICAzMDYsICAtMzIzOSwgICAgLTI1LCAgICA3MDAsICAgIDM2NSwKKyAgICAgIC03NzAsICAgIDE0NCwgICAgICA0LCAgICAyNTksICAgLTE4NSwgICAxNDkzLCAgIC0xNTgsICAgIDcyNiwKKyAgICAgLTMxODAsICAtMTY4MywgICAtMTE5LCAgICAgNDUsICAgLTQ5MywgICAtMjA1LCAgLTE3MjgsICAtMTIyNiwKKyAgICAgIC0yMzUsICAgIC04NywgICAgLTg4LCAgICAtODcsICAgMTk2NiwgICAgICA4LCAgICAxNDIsICAgIDQ5NiwKKyAgICAgICAyMzksICAgIDgyOCwgICAgIDMwLCAgIC01MTcsICAgMzE1MCwgICAyMjY2LCAgICA0MDIsICAgLTMxNSwKKyAgICAgICAgNzQsICAgLTMxMiwgICAtNDE0LCAgICAtMTYsICAgIDQ1OCwgICAgMzgxLCAgICAzNzYsICAgMTI4NywKKyAgICAgIDEwOTMsICAgLTQxMCwgICAtOTY3LCAgICAgODAsICAgIDM4MiwgICAtMTA2LCAgIDQ0MTksICAgIDQ0NSwKKyAgICAgICAyOTMsICAgLTI4MywgICAgMjgyLCAgICAzMjQsICAgIC04MCwgICAgLTI1LCAgICAxMTUsICAtMTY2NywKKyAgICAgIC03NTYsICAgMTg5MywgIC0yNzcyLCAgICAzOTUsICAgICAgMywgICAtMzQ5LCAgICAxMzgsICAgMTA5NCwKKyAgICAgICA0MDYsICAgIDQzMiwgICAgMjE0LCAgLTEzMjgsICAgIDYzMiwgICAtMTMyLCAgIC0xMDAsICAgIDEzNSwKKyAgICAgIDE2MjcsICAgMTA2MiwgICAxMDI2LCAgLTEzNDEsICAgICAyNCwgIC0zMzUyLCAgIC0xNzMsICAgMTI2NSwKKyAgICAgICA4NjEsICAgLTgyMSwgICAgLTg3LCAgIC0zNjcsICAgIDI3OCwgICAgMTUxLCAgIC0xMDEsICAgIC0zMiwKKyAgICAgICAxNjEsICAgIDM4NywgICA1Nzc4LCAgIC01NjQsICAgIDQ5MiwgICAgIDgzLCAgICAzMjQsICAgICAyOSwKKyAgICAgIC00MjMsICAgICA5MSwgICAtMTMyLCAgICAxOTAsICAgLTMxMCwgICAtNDU3LCAgICAtNjIsICAgIC05OSwKKyAgICAgICAxNzEsICAgLTIxNCwgICAtMTU5LCAgLTI1MDAsICAgLTY5MywgIC0xNTM4LCAgIC0zMTEsICAgLTc4NCwKKyAgICAgLTI0MjIsICAgLTQ5OCwgICAxNzgxLCAgICAzNDIsICAgLTQ2NywgICAgLTc4LCAgICA0NjYsICAgLTI1MiwKKyAgICAgICAyNDEsICAgIDE5NywgICAgMTg2LCAgLTEwMzksICAgLTE5MCwgICAgMzQ2LCAgLTE4ODEsICAgLTI0MCwKKyAgICAgICAtNjUsICAgMTQzOCwgICAxMDAxLCAgLTMwMDksICAgIC01MiwgICAgMjIxLCAgIC00OTAsICAgMTIyNCwKKyAgICAgICAtNjMsICAgIC0zOSwgICAgIDUzLCAgICAxNjksICAgIDEzMCwgICAgIDg2LCAgICAtNTYsICAgIC05MCwKKyAgICAgICAxMTYsICAgICAgNCwgICA3MDk4LCAgICAgLTUsICAgICA2MSwgICAtMTcyLCAgICAtNjUsICAgIDE2MCwKKyAgICAgICAtOTQsICAgIC0zMCwgICAtMTExLCAgICAyNzAsICAgLTY1MywgICAgNTIxLCAgIC00MjYsICAgMTA4NCwKKyAgICAgLTExNjksICAtMTE1OCwgICAgNTg0LCAgLTI0OTksICAgMjQ5NCwgICAtMzIxLCAgICA2OTUsICAgIDgyMywKKyAgICAgIC00MjksICAgICAzNSwgICAgNTI5LCAgIC0yODAsICAgIC00NSwgICAtMjg2LCAgIDI5OTcsICAgIDIwNywKKyAgICAgIC02MzMsICAtMjIwNywgICAxNzA4LCAgIC0yOTgsICAgLTQxMywgICAgNjczLCAgLTEwMTcsICAgIDI5MiwKKyAgICAgICA0OTMsICAgICA3NiwgICAtMTM2LCAgIC0zNjUsICAgIC02NSwgICAgMjY2LCAgICA4NTIsICAgIDUxMiwKKyAgICAgICA3OTEsICAgLTEyOSwgICAxMzY0LCAgLTEwNjUsICAgMTM3MSwgICAgMzgzLCAgIC01MjQsICAgIDUwNSwKKyAgICAgICA5NDMsICAgIDE0NywgICAgMjI5LCAgICAgMzksICAtMjk2OSwgICAgIDcwLCAgIC0yOTUsICAgICA2NiwKKyAgICAgIDI3NTksICAgIC0xNiwgICAtNDM1LCAgIC00NzQsICAtMTA1OCwgICAgNzYyLCAgICAgNTQsICAgLTI1NywKKyAgICAgICA1NjAsICAtMzE2NywgICAtNTcyLCAgIC00MTgsICAgLTQ3OCwgICAgMzcwLCAgICAgNzIsICAgIC0yMCwKKyAgICAgICAyOTYsICAgICA1NCwgIC0yNjgzLCAgICA1NTAsICAgIC0xNSwgICAtMTU1LCAgIDIxNDYsICAgLTE0MywKKyAgICAgLTExNDQsICAgIDQ2MywgICAtMTE3LCAgLTE2OTAsICAtMTkxNywgICAgIDQyLCAgICAyNDksICAgLTI3OCwKKyAgICAgIC0zMTksICAgLTUxMywgICAgNTQ0LCAgLTIwMzMsICAgLTMxNywgIC0xOTU1LCAgLTI2NDYsICAgMTM0NSwKKyAgICAgICA3NTksICAgIDI2OCwgICAgMjA3LCAgIDEyNDMsICAgIDI1NiwgICAgLTMyLCAgICAtNDUsICAgLTc1MCwKKyAgICAgIC0yMTEsICAgLTE4NCwgICAyMzk3LCAgICA0NzMsICAgMjU3MiwgICAtNDg5LCAgICAyNjAsICAgIDM4OSwKKyAgICAgIC0yMzcsICAgIDYwMiwgICAtNDYzLCAgICA1NjksICAgMTY3MywgICAtMTc2LCAgIC0yMjcsICAgIDk2NCwKKyAgICAgICAyMDMsICAgIDEzMCwgICAtMjY5LCAgIC0xOTAsICAgMTMzOSwgICAtOTc4LCAgICA5NzMsICAgMTk4NiwKKyAgICAgIDExNDUsICAgMTI1OCwgICAgMjcyLCAgIDE3NzksICAgLTQzNiwgIC0xMzA2LCAgICA2NTIsICAgIDgwNywKKyAgICAgICA1NzQsICAgMTQwMSwgICAgIDUzLCAgIC0xODMsICAgMTYxMiwgICAtODI4LCAgLTMwOTQsICAgIC04MiwKKyAgICAgIDEwNjEsICAgMTA0MiwgICAtMjAwLCAgIC04OTEsICAgLTEyNiwgICAgMTgxLCAgLTEzMjQsICAgIDU0OSwKKyAgICAgICA1NTUsICAgICAtNCwgICAtODY4LCAgICAgNzksICAgIDE1NywgIC0xNTMzLCAgICAgMTgsICAgIDIzMCwKKyAgICAgLTEwOTYsICAgLTMzNSwgICAtNjY5LCAgIC0xNjYsICAgMTg1MywgICAtMzEwLCAgIC0zNDAsICAgIDI0OSwKKyAgICAgIC05NTQsICAgLTU5NCwgIC0yOTI5LCAgICA0MTUsICAgICAgNSwgICAgMTM1LCAgLTEzMTUsICAgLTIzNywKKyAgICAgIDE4NjgsICAgIDc4NywgICAxOTEyLCAgLTExMDAsICAgMTEzOSwgIC0xMTAzLCAgIC0yMTcsICAgLTM4MiwKKyAgICAgIC02NTQsICAgMjA3OCwgICAgNTI4LCAgICAxMzMsICAgLTExNSwgICAgLTU2LCAgICAtNDEsICAgLTIwNywKKyAgICAgICAgNjksICAgIDQ2MSwgICAgNDY1LCAgIC0zOTYsICAgMTcyNSwgICAxMzA2LCAgIC00NDMsICAgLTcyMCwKKyAgICAgLTE2MDAsICAgMTE3NiwgICAgNjUyLCAgIC05OTcsICAgLTMwNiwgIC0xMDQwLCAgIDIyNTgsICAgIC03NSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiNDQ0MHNtMVtdID0geworICAgICAgODE5MiwgICAgIDk2LCAgICAyMTQsICAgLTM5NSwgICAtMTA2LCAgICAyOTEsICAgLTQwMSwgICAgMzA1LAorICAgICAgLTEwMiwgICAgMTk0LCAgICAtNzMsICAgICAzMSwgICAgIDcxLCAgICAtMTksICAgLTM0OSwgICAgIDY1LAorICAgICAgLTE4MywgICAgIDI2LCAgICAtMjEsICAgODE1NCwgICAgMTA3LCAgIC0xMzYsICAgIC0zNywgICAgLTM1LAorICAgICAgICA4NSwgICAgMTI3LCAgIC0yMDIsICAgICA0MywgICAtMTk1LCAgICAyMjUsICAgIC01MSwgICAgLTY5LAorICAgICAgIC01NywgICAtMTA3LCAgICAxNDEsICAgLTEyMCwgICAtMjg0LCAgIC0yMjcsICAgICAyOCwgICAgNjgwLAorICAgICAgIDIxOCwgICAgIDI5LCAgLTE4MDAsICAgIDQ4OCwgICAtMjA3LCAgIC00NTMsICAgIC05OSwgIC0zNjgwLAorICAgICAgLTIxMCwgICAgIDM5LCAgICAyNzksICAgMTQwNiwgICAgMjc4LCAgICAtMzcsICAtMTU5NiwgICAgMjMyLAorICAgICAgIDM3NiwgICAgIDkwLCAgICAyMzQsICAtMzM0OCwgICAgMjQyLCAgIDE3NjUsICAgIDU1NSwgICAtODgzLAorICAgICAgIDExOCwgICAgMTE1LCAgICAgNDgsICAgLTExNiwgICAyMTY2LCAgIC0yOTIsICAgIDEzNiwgICAgNTI3LAorICAgICAgLTIzNiwgICAgLTE4LCAgICA0MTEsICAgIC0yMCwgICAtMTkwLCAgIC00ODAsICAgIDY2NSwgICAzMzMyLAorICAgICAgIDM3OCwgICAtMjg3LCAgICAzMzcsICAgIDE5OSwgICAgIC01LCAgLTM5MDQsICAgIDMxMSwgICAtMjk3LAorICAgICAtMjcyMCwgICAtMTkzLCAgICAtMTcsICAgIDkxMSwgICAtMjI0LCAgICA0NTcsICAgIC00OCwgICAgMjU0LAorICAgICAgIDI3MSwgICAgLTI0LCAgICAtNzcsICAgIDE2NSwgICAgIDIzLCAgICAxODIsICAtMTEyMiwgICAgMTIyLAorICAgICAgLTUyMCwgICAgMzA5LCAgLTM2MDQsICAtMTAxMywgICAtNDA1LCAgIC02NDcsICAgLTE0NSwgIC0xMTYyLAorICAgICAgMTAxOSwgICAtMTkwLCAgIC0yNzgsICAgICA2OSwgICAgMzYyLCAgIC0xODUsICAgIC03OCwgICAtMjQ1LAorICAgICAgIDQ3MiwgICAgNjcwLCAgIC00OTMsICAgIDYyMCwgICAgIDc2LCAgICA3MTcsICAtMjI5NiwgICAtMTExLAorICAgICAgLTQ1NCwgICAzMjI0LCAgICAgMjcsICAgICA0NywgICAtMzUxLCAgIC0xNTQsICAgLTI5MywgICAgMTg3LAorICAgICAgIC05MywgICAgIDk2LCAgICAgODcsICAgLTQ1MywgICAtMTMyLCAgICAgIDksICAgIDEyNSwgICAtMjA5LAorICAgICAgIC0yNiwgICAgMjg0LCAgIC01NTIsICAgIDI1NSwgICAgIDg3LCAgICAyMjcsICAtNTQ0NSwgICAgMTEyLAorICAgICAgIDE3MiwgICAgLTE1LCAgIC00NDgsICAgIDQ3NSwgIC01NzQ3LCAgICAzNjcsICAgIDE0OSwgICAtMjI4LAorICAgICAgLTc5NywgICAgMzcxLCAgICAgNjcsICAgLTEwMiwgICAtMTE4LCAgIC00MTgsICAgIDMzMiwgICAgIDM4LAorICAgICAgLTEwMCwgICAgIDkwLCAgIC0xODMsICAtMzMwMiwgICAgIDE1LCAgLTEwNDksICAtMTU2MCwgICAxMjk5LAorICAgICAgLTcxMCwgICAxMjU3LCAgICA2OTgsICAgIDMxNiwgICAtMjgzLCAgICA5NTUsICAgIDI0MCwgICAgMTgyLAorICAgICAgIDI2OSwgICAgIDEyLCAgICAtMzcsICAgMTgxNywgICAgNjQ5LCAgLTEyNzMsICAtMjA3MSwgIC0xNzE5LAorICAgICAgLTc2NSwgICAgOTc3LCAgLTExNTksICAgIDM1MSwgIC0xNTgzLCAgICAtODUsICAgLTc3MSwgICAtMjE1LAorICAgICAgIDEyMywgICAgMzE0LCAgIC0xNTgsICAgICAzMiwgICAgNTYwLCAgICAyMDgsICAgIDI2NSwgICAtNDUxLAorICAgICAgLTQxMywgICAgIDMyLCAgIDE5NTQsICAtMzU5OCwgIC0xNjgwLCAgIC04MzIsICAgLTY0NiwgICAgNzYxLAorICAgICAgIDI3MiwgICAgMzk0LCAgICAyMTMsICAgIC0zNSwgICAgLTQ0LCAgICAzNDMsICAgIDMwOSwgICAgMjQ0LAorICAgICAgMzA0MSwgICAtMzk5LCAgICAtNTAsICAgLTEyNiwgIC0yNzU1LCAgIC0xNDYsICAgIDI0MywgICAtMzY3LAorICAgICAgLTYwMCwgICAtMTY2LCAgIC04MzIsICAgLTUzNywgICAgMjY5LCAgICAtNDgsICAgMjQxOSwgICAtNTI2LAorICAgICAgLTMwOSwgICAgLTE3LCAgIC0yMzUsICAgICA3MywgICAgMzQxLCAgICAzNTEsICAgLTg0MCwgICAzMjQxLAorICAgICAgIC05NCwgICAtNDMyLCAgICA0MDQsICAgLTU4OCwgICAgMTU4LCAgIC0xMjcsICAgIC00OSwgICAzMjU5LAorICAgICAgMzU0MywgICAgMTM0LCAgIC0yNTYsICAgLTEwNiwgICAgNjIyLCAgICAtNDUsICAgLTE3MCwgICAtMTA5LAorICAgICAgICA2OCwgICAgMzc3LCAgICAtODQsICAgIDIxMCwgICAtMjUwLCAgIC0yNjcsICAgIDI1NywgICAgLTc3LAorICAgICAgICAgNiwgIC0xMTA5LCAgLTE0OTgsICAgLTMyNywgICAxMDYzLCAgICA5OTIsICAgIDYzMiwgICAtMjQ1LAorICAgICAgLTY1NiwgIC0xMTAwLCAgICAtNjAsICAgLTQ1NiwgICAtMTcwLCAgIDMyMDgsICAgICAtNiwgICAgIDEzLAorICAgICAgIC05NSwgICAgNjA2LCAgIC01OTQsICAtMjAzOSwgICAtMzY5LCAgLTE3NDMsICAgIDI3NSwgICAgLTkzLAorICAgICAgIDExNywgICAyODI4LCAgIC0xMzgsICAgLTEwOCwgICAgMjA2LCAgIDE4MTksICAgICA5OCwgICAgLTQ1LAorICAgICAgICA0NSwgICAtMTYzLCAgIDI5NjIsICAgLTM5OCwgICAzNTM2LCAgIC0xODMsICAgLTI1OSwgICAtNTgxLAorICAgICAgICA2NSwgICAtNDk4LCAgIC0yODgsICAgLTM1NywgICAtMzM5LCAgICAtMTMsICAgIC03MSwgICAtNDA5LAorICAgICAgICAzNiwgICAgLTE1LCAgIC01NDUsICAgMTQzMywgICAgMTM1LCAgIC0yMjAsICAgICA5OSwgICAgNzUyLAorICAgICAgIDE3NywgICAtNDU1LCAgIC0yNTEsICAgMTE3MiwgIC0xMjc0LCAgIDEwNjIsICAgLTc3NCwgICAtOTk5LAorICAgICAgIC02MywgIC0yNzU2LCAgICAgOTksICAgIC04NiwgICA0Njk1LCAgIC0xNzEsICAgLTEyOSwgICAtODU2LAorICAgICAgICAyNiwgICAtNTQzLCAgICA2MTAsICAtMTM1MCwgICAgIC0yLCAgICAyNzEsICAgIDQ1NSwgICAtMTUwLAorICAgICAgIDM1OCwgICAgMTAxLCAgICA1MzYsICAgIDEyNSwgICAgMTAxLCAgICAgODgsICAgIC0xNiwgICAgLTEyLAorICAgICAgIDQ4OCwgIC03NDc5LCAgICAxMTAsICAgIDI2NCwgICAgMTQwLCAgIC0zMDIsICAgIDExMCwgICAgMjMyLAorICAgICAgICAgMCwgICAgIDE1LCAgICAgNzAsICAgIC0yOCwgICAgLTI3LCAgIC0xMTAsICAgIC05OSwgICAgMjAxLAorICAgICAgICA3OCwgICAgMjE1LCAgIC0xMDgsICAgLTI2NywgIC03NTQ4LCAgICAgMzQsICAgIDMxMiwgICAgLTg2LAorICAgICAgIDE5NywgICAgMTI1LCAgICAgODAsICAgIC03NSwgICAtMTE3LCAgICAgLTIsICAgIDEyOCwgICAtMjA3LAorICAgICAgLTEzMSwgICAtNTEzLCAgICA2MTQsICAgICAzMywgIC00ODQ0LCAgIC0zMDIsICAgLTMyMywgICAgMTYwLAorICAgICAgIDgwOCwgICAgNjQ1LCAgICAyNDMsICAgLTYwMywgICAgIDY4LCAgICAtNzAsICAgIDE1OCwgICAtMTMxLAorICAgICAgLTIxMiwgICAgLTM0LCAgIC0yNDcsICAgIDYyNSwgICAgMTM0LCAgICAtNDIsICAgIDUyNSwgICAgLTg5LAorICAgICAgICAzMSwgICAgMTE2LCAgICAgLTEsICAgIDUwOCwgICA1MDIxLCAgICAzOTUsICAgIDExMSwgICAgLTg2LAorICAgICAgLTE3MiwgICAxNDMzLCAgIC0xMTQsICAgLTEyNiwgICAtMTQ4LCAgIC0zMzcsICAgLTI2MCwgICAgMjMzLAorICAgICAgLTQ3OSwgICAgMjc1LCAgIC0yNDcsICAtNTY3MiwgICAgMzg2LCAgIC0xMTAsICAgIC05OSwgICAtMTQyLAorICAgICAgLTE3MSwgICAtMTU0LCAgIC0zNTgsICAgICAzMCwgICAxMDI4LCAgICAtNzgsICAgIDU3NSwgICAgNTIzLAorICAgICAgLTU4NiwgICAtNzM5LCAgIDE1ODYsICAgMTA3NiwgIC0yNTE5LCAgIDE1NzIsICAtMTQ0OCwgICAtMjAxLAorICAgICAgIDE2NiwgICAgLTU0LCAgICAxMzcsICAgMTI2OCwgICAxMTU3LCAgIC00MTEsICAtMjkwNSwgICAgMTk1LAorICAgICAgIDQ4OSwgICAtNzQwLCAgICAxNTQsICAgIDUyMiwgICAyMjc2LCAgIC02MDQsICAgIDE5NCwgIC0xMTEyLAorICAgICAgIDE5MiwgICAgNDAwLCAgIC0yNzEsICAgIDI1MCwgICAgNDEzLCAgICAyNzMsICAgIDE1OCwgICAtMjk5LAorICAgICAgLTg3NCwgICAtMjI4LCAgLTI0NTQsICAgIDE2MiwgICAgODE5LCAgICA0NTcsICAgMzQwMSwgICAgNjg5LAorICAgICAgLTIwOCwgICAtMjk4LCAgIC00NjEsICAgLTM2MCwgICAgLTcwLCAgLTIxMzMsICAgLTExNCwgICAtMTI0LAorICAgICAgICA4MSwgICAtMjI4LCAgICA2MjUsICAgMzUyNSwgICAgOTA5LCAgICAyNTQsICAgLTIzNCwgICAxMzE2LAorICAgICAgLTc3MywgICAgNTMxLCAgICAtMzAsICAgIC0xNiwgICAtMTY0LCAgICAtODQsICAgMjM2MCwgIC0xOTAwLAorICAgICAgIDM1MSwgIC0yOTc5LCAgICA1NDUsICAgIDY1MywgICAgNDE2LCAgICAyNzMsICAgIC03OSwgICAtODI1LAorICAgICAgLTEwNywgICAgIDcxLCAgICA0OTUsICAgIDIyMywgICAtMTc2LCAgICAxMjksICAgICA0MCwgICAgNDI0LAorICAgICAgMTYyNywgICAgMjA3LCAgICAgNDcsICAgICAtOCwgICAtMjczLCAgIC03MTUsICAgICA2MCwgIC0xMjUzLAorICAgICAgMTUwMSwgIC0xMTk5LCAgIC0yNDgsICAgICAzOSwgICAyODU5LCAgIC00MzIsICAgICA4OSwgICAgMjk5LAorICAgICAgIDk0OCwgIC0yNjA4LCAgIC04OTYsICAgMzQ2OCwgICAgIDg0LCAgICA1MTEsICAgICA1NSwgICAgMTUxLAorICAgICAgIDczMywgICAgMjcwLCAgIC0zNTQsICAgIDQ3MCwgICAtMjE5LCAgIC0xMTUsICAgLTEwNSwgICAgIDkxLAorICAgICAgLTI1OSwgICAxOTQxLCAgICA3NzUsICAgICAxMiwgICAyNzY0LCAgICA0ODQsICAgIDU1NywgICAyMjg4LAorICAgICAgLTExOCwgICAgMjk0LCAgICAtMzIsICAgIDcxOSwgICAgLTYyLCAgICAtNjQsICAgLTI5NSwgICAgLTgyLAorICAgICAgLTE0NSwgICAtMjg1LCAgIC00OTIsICAgICA4NywgICAtMTM1LCAgICAtOTgsICAgIDE5NCwgICAtMjg4LAorICAgICAgICAtOCwgICAgMjYzLCAgIC00NzUsICAgIC01MywgICAtMzg4LCAgIDU2MjEsICAgICA0MSwgICAgLTI4LAorICAgICAgICAzNCwgICAtMzIzLCAgICAxMzgsICAgMTkzNSwgIC0xODA2LCAgIC0xODUsICAgIDM0MCwgICAxMzgwLAorICAgICAgICA0OCwgICAtNTQyLCAgLTI5NjUsICAgLTMzOSwgICAgIDg4LCAgICA1NTQsICAgICA0MSwgICAgICA0LAorICAgICAgLTE1MSwgICAgMTgyLCAgICAtMzksICAgLTE5MywgIC0zMzU1LCAgIC0zMTIsICAgMzEwNiwgICAtMjAzLAorICAgICAgIDQ0MiwgICAtMTEwLCAgICAzMTcsICAgLTI2OSwgICAgMjI1LCAgICAgMzEsICAgIC02MiwgICAtMjc3LAorICAgICAgIDE2MywgICAtNzY2LCAgIC00MDgsICAgIDIxMCwgICAgLTU4LCAgICAxMjgsICAgIDE2MSwgICAzMzA4LAorICAgICAgMzMyMSwgICAtMTM4LCAgIC0yNzgsICAgLTE0OSwgICAgMjE2LCAgICAxMzQsICAgLTI1MywgICAtMTM1LAorICAgICAgLTE1NCwgICAtMTIzLCAgICAyNTQsICAgIDIwMCwgICAgIC0yLCAgICAxMzMsICAgLTMwNywgIC02MjUzLAorICAgICAgIDMxMCwgICAgIC02LCAgICA5NTksICAgICAyNiwgICAgMTkxLCAgICAzMTUsICAgIDUyOCwgICAgLTc1LAorICAgICAgLTIzMCwgICAtMjAzLCAgICAxNTMsICAgLTI2NSwgICAgLTk0LCAgICAtNjEsICAgICAtMiwgICAyNzYxLAorICAgICAtNDYyMywgICAtMzUzLCAgICAtMTksICAgIDEwMiwgICAtMTM5LCAgICAgNTQsICAgIDQzOCwgICAgMjY3LAorICAgICAgIC03MywgICAgNDQ3LCAgICAyMjYsICAgICA3MSwgICAgLTE5LCAgICAgNzUsICAgIC00MCwgICAgLTMyLAorICAgICAgLTg1MCwgICAtNTAwLCAgICA0MjIsICAgMTIzNywgICAtNjg4LCAgICAzNTcsICAtMzE1OCwgICAtNDY4LAorICAgICAgLTQ1MCwgICAtMjc5LCAgIC02OTQsICAtMTEwOSwgICAgNzM0LCAgLTE2MDIsICAgLTExNywgICAgMTIyLAorICAgICAgIDI2MSwgICAgOTc5LCAgICAtMjAsICAgIDM4NSwgIC0yOTI5LCAgICAzNDIsICAtMzE2NCwgICAtMTQ2LAorICAgICAgIDI1MiwgICAtMTA0LCAgICAgNjIsICAgIDQ2OSwgICAgMjg5LCAgICAyNDksICAgLTIxNCwgICAgLTM4LAorICAgICAgICA3MywgICAgIDgzLCAgICAgLTcsICAgICAxOCwgICAtMzk0LCAgICAgLTUsICAgLTE0MCwgICAtMjY3LAorICAgICAgIDMzMSwgICAtMTQ3LCAgIDY1NDAsICAgIDM5NSwgICAtMTAzLCAgIC0xNDcsICAgLTI3MSwgICAgLTIwLAorICAgICAgIDE5MSwgICAgIDczLCAgIC0xNTUsICAgIDE5NywgICAgIDcxLCAgICA1MDMsICAgICAxOSwgICAgMTM4LAorICAgICAgLTEyOSwgICAgMzM1LCAgICAyMDksICAgICA3NSwgIC02MjA3LCAgICAxNDAsICAgLTE3NiwgICAgIC01LAorICAgICAgICAzNSwgICAgLTQwLCAgICAtNjEsICAgLTE0NiwgICAxMDgwLCAgICAgNTgsICAgIDMyNywgICAgLTQ5LAorICAgICAgLTg0MiwgICAxNDMxLCAgICA1OTUsICAgMzQ2MSwgICAgICAxLCAgICAxNDIsICAgMjAwMSwgICAgMjk3LAorICAgICAgIC0xNiwgICAtNDI1LCAgIDExNTYsICAgLTEwMSwgICAgLTU0LCAgIDEwNjAsICAgLTIyMiwgICAtMjk1LAorICAgICAgIDkzOCwgIC0xMjEyLCAgLTIzNzQsICAgICA3MywgICAtMjcyLCAgLTMzMTgsICAgICAtOCwgICAtNzE4LAorICAgICAgIDExNCwgICAtMTU0LCAgICAgODUsICAgICAtOSwgICAgIDcyLCAgICAgODYsICAtMTMzMCwgICAgMjI2LAorICAgICAtMTQxNCwgICAtNTIxLCAgIDMxNjEsICAtMTg1NiwgICAgMTMzLCAgICAyNDAsICAgLTQ5OSwgICAtMzcxLAorICAgICAgLTc0NSwgICAgNzc5LCAgIC00NjMsICAgLTUwNiwgICAgNDYzLCAgIC0yMjksICAgLTIyNiwgICAgMzg5LAorICAgICAgIDEzNSwgIC00MTM3LCAgICAzNjAsICAgIDczNSwgICAtMzE4LCAgICA3NzcsICAgIDU5MywgICAgOTc3LAorICAgICAgLTE3NCwgICAgMjg2LCAgICAxODcsICAgIC05NSwgIC0xNjI2LCAgICAyNDUsICAgICA5NywgICAgICA5LAorICAgICAgIDI3NywgICAgMjk5LCAgIDE1NjgsICAgMTA2NiwgICAgMzc1LCAgIDEzNDIsICAgLTM5MCwgICAgODg0LAorICAgICAgIDI3MSwgICAgMTg1LCAgIC0yNTgsICAtMTEwMCwgICAyMTEzLCAgIC0xMDcsICAgLTQ0NywgIC0xOTE3LAorICAgICAgIC01OCwgICAgLTI5LCAgIDEwODEsICAgLTQ1NSwgICAtNTI0LCAgIC0xOTYsICAgMTg2OSwgICAtNjc3LAorICAgICAtMzU2NCwgICAxNDQzLCAgICAgMjksICAgLTQyNSwgICAgLTI4LCAgIC0zNzAsICAgLTM0MiwgICAgLTI4LAorICAgICAgICAzMCwgICAtMTE4LCAgICAgNTgsICAgIDYwNywgICAgNDU0LCAgICAgNDUsICAgLTEyMCwgICAgMjMyLAorICAgICAgICAyMCwgICAgIDIxLCAgIC0xNzUsICAgLTExMiwgICAtMjM2LCAgICA0OTIsICAgIDQxMSwgICAgIDQyLAorICAgICAgIC00MiwgICA0MDQxLCAgICAgMzksICAtMjU3OSwgICAgMjM1LCAgIC0xNDYsICAgIDEyMiwgICAgIDI0LAorICAgICAgMTMwMSwgICAgMTIzLCAgIC00NjEsICAtMzI2NCwgICAgMzE2LCAgICAtODgsICAgLTIwOSwgICAgMTQwLAorICAgICAgIDM4NywgICAtNDMwLCAgICAgNzgsICAgIDUwOCwgICAgMTQ5LCAgLTM1ODgsICAgMTEwNywgICAgODIwLAorICAgICAgLTE0MCwgICAgNjU0LCAgICA4MTIsICAgLTU2NiwgIC0yNTc4LCAgIC00MDMsICAgIC03MiwgICAgMTIwLAorICAgICAgIDM1NSwgICAtMTM2LCAgIC0xMjEsICAgIDIwOSwgICAgMjQwLCAgICAxMTYsICAgIDIzMSwgICAxNjMwLAorICAgICAgIDIwOCwgICAtMTc4LCAgLTMxNjAsICAgMjIwMywgICAgLTUyLCAgICA0NTEsICAgICA4NCwgICAtMzEwLAorICAgICAtMTE5OSwgICAgNTk2LCAgICAgNjksICAgIDI4NSwgICAgMjQyLCAgICAgMTUsICAgICA0OSwgICAgMzQxLAorICAgICAgLTE1NCwgIC0yMjg2LCAgIDEyMDYsICAgLTEwOSwgICAxMDQ4LCAgIC02NDcsICAgMTEyNywgICAgIDk4LAorICAgICAtMTI2NCwgICAtODA4LCAgIDE3NDQsICAtMTU5NywgICAgIDEzLCAgICAgMjYsICAgLTIxNiwgICAgMjYzLAorICAgICAgMzI3NiwgICAzMTkyLCAgIC0xMDUsICAgLTM5MCwgICAgLTMxLCAgICA2NzYsICAgICA3MywgICAgMjY1LAorICAgICAgICAzMSwgICAgMTAxLCAgICA0NzksICAgIC02OSwgICAgMTIzLCAgICAtMjQsICAgIC00OSwgICAgIDMyLAorICAgICAgLTY1MywgICAyMjUzLCAgICAgNDksICAgLTM0NiwgICAxNDc2LCAgIDE4MjAsICAgIDM5NiwgICAgNjM5LAorICAgICAgLTIxOSwgICAgNzkyLCAgIDE3MjgsICAgIDE0NywgICAtNzY1LCAgIC0xNDAsICAgMTE4MSwgICAgIDk4LAorICAgICAgIDE1MywgICAgLTk4LCAgIC03NTUsICAgMjQ3MywgICAgNDUyLCAgICAyMzEsICAgMjAzMSwgICAyNDY4LAorICAgICAgLTQxNiwgICAgNTg3LCAgICA3MjQsICAgIDE0OCwgICAgNTAwLCAgIC05MzMsICAgLTIyOSwgICAgIDU1LAorICAgICAgIDEwMiwgICAgIDc0LCAgIC0xNjQsICAgIDY1MiwgICAtNDI1LCAgICAxMDAsICAtMjY4NCwgICAxMzU4LAorICAgICAgMTYyNiwgICAtMzUwLCAgICA1NDQsICAgLTMwMSwgIC0xNTg5LCAgIC0zMDUsICAtMTI2NiwgICAgIDExLAorICAgICAgIDI0MywgICAtMTI1LCAgIC0zMzAsICAgIDI5NCwgICAxNDcxLCAgLTI5MjIsICAgMTU4MSwgICAtNTQ2LAorICAgICAgIDU4MiwgICAgMjMxLCAgLTE0MDcsICAgLTg3NywgICAgNjAyLCAgICAyMTksICAgIDM1MCwgICAxMTMwLAorICAgICAgIC04NiwgICAgMjE0LCAgICAtNTYsICAgIDIwMSwgICAtMTgxLCAgLTIxNDAsICAgMTEwOCwgICAgNDkzLAorICAgICAgIDQ1NiwgICAtNTQyLCAgIC0xMTMsICAgLTg1MiwgICAxNjQ3LCAgIDE4OTcsICAgIDg0MCwgIC0xMTc4LAorICAgICAgLTM2OSwgICAgNzg4LCAgICA0ODgsICAgIDI1NiwgICAgMzY2LCAgIDIyOTgsICAgMTE2NywgICAtMjA1LAorICAgICAgIDI1NiwgICAgNTg1LCAgIC01NTUsICAgIDI5MiwgICAyNjE1LCAgICA3NDgsICAgLTI0NywgIC0xMTAyLAorICAgICAtMTY4MiwgICAgMjI2LCAgICA0MTUsICAgICAyMCwgICAgIDI3LCAgICAxMDAsICAgICAgOSwgICAgNDM2LAorICAgICAtMTc0NiwgICAyNjIxLCAgIDE1ODMsICAgLTIxMSwgICAtODMzLCAgICA0NDEsICAgICA1NCwgIC0xMTgzLAorICAgICAgLTgyNiwgICAtOTE2LCAgIC03MDcsICAgIDU2NCwgICAtMjMyLCAgICAtMTQsICAgIDE0NywgICAgNDUzLAorICAgICAgICA3MCwgICAxMDk0LCAgIC05MDMsICAgLTMzNywgICAgNDUwLCAgLTE1NDYsICAgLTY2MiwgIC0xMDQ3LAorICAgICAtMjM0NSwgICAtODExLCAgLTEwMzcsICAgICA5NiwgICAgNTYwLCAgIDEzODEsICAgLTExOSwgICAtMzgzLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2I0NDQ4c2wwW10gPSB7CisgICAgIC0zODUwLCAgLTEyODksICAgLTQ0OSwgICAgLTM2LCAgLTExNzgsICAtMTE3NSwgICAgNzA1LCAgICAtOTcsCisgICAgICAgIDM3LCAgIC02NTAsICAgIDQyNiwgICAtNDc3LCAgIC0xNDUsICAgIDEyNCwgICAgICA2LCAgICAyMDcsCisgICAgICAgLTk2LCAgLTMxNDUsICAgMjkxNywgICAtMjYwLCAgICAzNDksICAgIDY2OCwgICAgLTcyLCAgICAgIDYsCisgICAgICAgMTU3LCAgICAtNjIsICAgLTEyOCwgICAgIDIwLCAgICAtODIsICAtMTM1NywgICAtNzA3LCAgIC02MTksCisgICAgICAtMzEzLCAgIC0yMjksICAgMzAxMCwgICAtMTY5LCAgICAtMjcsICAgIDczOCwgICAgOTcxLCAgLTE0NTAsCisgICAgICAgMjQ2LCAgICAxNTQsICAgLTE2MywgICAgLTE1LCAgICAtOTMsICAgICAgNSwgICAgLTM1LCAgICAtNDIsCisgICAgICAgIDI0LCAgICAgMzEsICAgIC0yNSwgICA2ODAzLCAgICAgMzMsICAgIC0zMiwgICAgLTY4LCAgICAtNjgsCisgICAgICAgLTQ0LCAgICAzMTcsICAgICA0MywgICAtMTA2LCAgICA2MDgsICAgLTk5OSwgICAtNjk5LCAgICA1ODIsCisgICAgICAgIDQ2LCAgIDE2MzEsICAgIDgzMCwgIC0xNTcwLCAgLTI2NDUsICAgIDk5MiwgICAyMTI2LCAgICAxMzIsCisgICAgICAyMzc3LCAgIDE1NTEsICAgIDI0NywgICAtMjQ3LCAgIDE1MDgsICAgIC0zNCwgICAgMTYyLCAgIC0yNzUsCisgICAgICAgLTgxLCAgIC02NTQsICAgLTYyNSwgICAgMTI1LCAgICAtMzMsICAgLTIxMCwgICAgMzA5LCAgICA5MDAsCisgICAgICAgNTcxLCAgICA3MjYsICAgMjY5MSwgICAyODIxLCAgIC02OTgsICAgICA2MCwgICAgIDQ2LCAgIC00ODMsCisgICAgICAgIDE0LCAgIC0yMTAsICAgLTI5NSwgICAgMTAyLCAgICAyMTQsICAgIDIyNiwgICAyNjIyLCAgICAtODIsCisgICAgICAtMzkwLCAgIDE0MzYsICAgIDEwNywgICAgNTU0LCAgICAzODEsICAgMTMwNywgICAyMjgzLCAgIC0xOTAsCisgICAgICAgIDI3LCAgICAtMzUsICAgNTU1NywgICAgMjgzLCAgICAxMDMsICAgIDE4MCwgICAgMTA0LCAgICAtODksCisgICAgICAtMTg2LCAgIC0zMTksICAgLTIyNSwgICAtMTQxLCAgICAgOTIsICAgICAgMSwgIC0xOTQyLCAgIDEwMjUsCisgICAgICAgOTA2LCAgICAgMzIsICAgICAtMywgIC0xMDg5LCAgICAxODIsICAgLTc5OSwgICAgNDgzLCAgIC0zNjgsCisgICAgIC0xNzM0LCAgIC0xMDMsICAgMTY4MCwgICAgNDc0LCAgIC0xMzMsICAtMTA2NywgICAtNTQ1LCAgIC0yMTksCisgICAgICAtMTE4LCAgIC02MzUsICAtMjU1OSwgICAxMDAyLCAgIDI1NTQsICAgLTY0MCwgICAtNTA1LCAgICAxNzksCisgICAgICAtMzQ0LCAgICAtODEsICAgIDEwNywgICAgLTYxLCAgICAgNzksICAgIC0xMiwgICAgLTI5LCAgICAtMzcsCisgICAgIC03NTc0LCAgICAtOTIsICAgICA2NCwgICAgIDkyLCAgIC0xNjQsICAgIC0yMCwgICAgLTYxLCAgICAtMzUsCisgICAgICAtMzEyLCAgIC0xNTksICAgIDMzMywgIC0zNDAxLCAgLTI1OTYsICAgLTM0NCwgICAgIDg4LCAgICA2MDQsCisgICAgICAgNTM1LCAgICAtODcsICAgIDM2NSwgICAgLTEzLCAgICAtNzcsICAgIDEzMSwgICAgMTI3LCAgICA1ODgsCisgICAgICAgMzAyLCAgICAtOTQsICAgLTUwNiwgICAyNDI3LCAgICAgOTksICAgIDMwNCwgICAyNjUzLCAgLTExMDQsCisgICAgICAxMzgwLCAgICA5NzYsICAgLTUzMCwgICAtMTIwLCAgIC0xMDUsICAgIDI5MywgICAgICA5LCAgIC04MjYsCisgICAgICAgMzg4LCAgICAtNjYsICAgIDQyMSwgICAtMjAyLCAgICA2MDUsICAgIDY3NSwgICA0MDYwLCAgICA5NzgsCisgICAgICAgMTQzLCAgICAtOTQsICAgICAyMSwgIC0yNDQ0LCAgICAtMzAsICAgIDU1NCwgICAgNjk1LCAgIDI4NzgsCisgICAgICAgNjU3LCAgIC0xMDQsICAgLTQzNSwgICAtMzI2LCAgICAzMDcsICAgICAyMCwgICAgIDIwLCAgICAxNTksCisgICAgICAgMTA2LCAgLTM0NzMsICAgIDMyNiwgIC0xMDI5LCAgIC0zMDQsICAgIDY3MCwgIC0yMTA5LCAgIC00MzEsCisgICAgICAgNTczLCAgICA3MDQsICAgIDI5MywgICAgLTQ1LCAgIC0xNjksICAgLTExOSwgICAtMTkxLCAgICA1OTksCisgICAgICAtOTEwLCAgIDE5NzYsICAgLTE2NSwgICAgNTgxLCAgIDEyMDksICAtMTY4OSwgICAyMzY1LCAgIC0zNzAsCisgICAgICAtNjAxLCAgIC02OTYsICAgIDM3NCwgICAgMjAyLCAgIC0xMTQsICAgIC02MSwgICAgICAzLCAgICAtNjMsCisgICAgICAgIDMwLCAgICAzNjksICAgLTE1OCwgICAtMTI4LCAgICAxOTgsICAgICA1MiwgICAgLTk4LCAgICAtNDQsCisgICAgICAtMzIzLCAgLTUxMTgsICAtMTEwMCwgICAtNjY5LCAgIDIyNTYsICAgICAzMiwgICAgLTY2LCAgICAyMDYsCisgICAgICAgIDY1LCAgIDI4MDEsICAgIDc4MywgICAtNDcwLCAgIC05NzMsICAgIDQ3MSwgICAtMjExLCAgICAtMjcsCisgICAgICAxODc5LCAgICAzMDIsICAgLTM4OCwgICAtMjQ5LCAgICAzMDEsICAgIDUzNywgICAyNzYxLCAgICAzMjEsCisgICAgICAgNTcxLCAgICAgMjAsICAgIDMzNywgICAxMzM2LCAgICA1MjIsICAgIDIzMSwgICAgMzY4LCAgIC0zNjMsCisgICAgIC0yMDY1LCAgICAtNTcsICAtMjU2NSwgICAtNTg0LCAgIC02MTEsICAgICA1NiwgICAgODE0LCAgIC0zODIsCisgICAgICAxNjcxLCAgICA0MDgsICAgIDQ5MiwgICAgIDEyLCAgIDEyMDEsICAgMTUxMywgICAgMjQ3LCAgIDIxNjUsCisgICAgICAtNTkyLCAgLTEyNDYsICAgLTQ5MywgIC0xMDEyLCAgLTEzMzAsICAgMTI1MSwgICAgIDc1LCAgIC0xMDAsCisgICAgICAgMTgyLCAgICAgNTIsICAgIC00NywgICAgNzEwLCAgLTExMzcsICAgMjQyMCwgICAtNTU5LCAgICAyNjYsCisgICAgICAtODAxLCAgIDI1MjMsICAgMTIyOSwgICAgNzM2LCAgIC00MDksICAgIC00OSwgICAgMjY5LCAgIC0xNzQsCisgICAgICAtMTc5LCAgICAtMjQsICAgIDM0OCwgICAtNjYxLCAgICAyNTEsICAtMTAzOSwgICAyNjQ3LCAgICAyODMsCisgICAgICAgNzI4LCAgLTE4NTAsICAtMjA4OCwgICAgMTk2LCAgICAgMzksICAgIC03MiwgICAgLTM1LCAgICAtOTQsCisgICAgICAtNTQwLCAgICAyNjYsICAgIDM0MCwgICAtNDUwLCAgICA3NjMsICAgICAtNSwgICAgMTEzLCAgIDI2MTgsCisgICAgIC0yNzM3LCAgIDEwNDcsICAgLTI0NiwgICAtNTIyLCAgIC0xODIsICAgIDM3NiwgICAxMDY4LCAgICAyMDMsCisgICAgICAxMjM4LCAgIC05MzgsICAgIDIxMSwgICAtMzA4LCAgIC0zOTUsICAgLTYyOSwgICAgNTk2LCAgLTI2MzQsCisgICAgICAxNDUyLCAgLTExNTUsICAgICA4MywgICAgLTg5LCAgLTMxMjEsICAgIDQxOSwgICAgIDQwLCAgIDI2OTEsCisgICAgICAtMzA2LCAgIC0zNDMsICAgICAgNCwgICAtMzQ3LCAgIC03MjUsICAgLTExNywgICAtMzE1LCAgICAxMTUsCisgICAgICAtMjE1LCAgICAgMjYsICAgIDQyOSwgICAxMDc0LCAgLTE4MzEsICAtMTg1MCwgICAyNjA5LCAgICAgNzIsCisgICAgICAgNDY3LCAgICAxOTEsICAgIDQzMiwgICAgODU3LCAgIC0xODYsICAgICAgMCwgICAtNDQzLCAgICAtMjQsCisgICAgICAgNTAwLCAgICA1NDEsICAgICAzMCwgICAyMzI0LCAgLTExNjAsICAtMTE1MywgICAxNzgzLCAgIDEyODIsCisgICAgIC0xOTkyLCAgICAxMDEsICAgLTEwOCwgICAtMTA4LCAgICA1NTYsICAtMjAxMiwgICAgNTA2LCAgICA2OTEsCisgICAgICAgLTY1LCAgIC02MTAsICAgIDQwMiwgICAgNjEwLCAgIDE5NDEsICAgLTEyMSwgICAgOTQyLCAgICA1ODksCisgICAgICAxODc5LCAgICAgNTgsICAgIDMxMiwgIC0yMjE4LCAgLTIwNTYsICAtMjI4NCwgICAtMzUwLCAgIC00NTMsCisgICAgICAgMzA2LCAgICAgMzgsICAgLTU3OSwgICAtMTg1LCAgIC0xMDEsICAgLTE5NiwgICAtMTUwLCAgICAxNTYsCisgICAgICAgMTI2LCAgICAtNDQsICAgLTE0MywgIC03OTIzLCAgICAxMjYsICAgLTEyMCwgICAtMTM4LCAgIC0yMzMsCisgICAgICAgIDk3LCAgICAtMjAsICAgLTEyMSwgICAtMTc1LCAgICAgLTgsICAgIC0xMywgICAtMTIzLCAgIC0zNjUsCisgICAgICAgMjUxLCAgICA3MzAsICAgMjg4MywgICAgNjY3LCAgIC00MTgsICAgLTIwOCwgICAyMTcwLCAgLTE0NDIsCisgICAgICAgMTk2LCAgIC0zODksICAgLTUxNiwgICAgMjUyLCAgICAtOTgsICAgIDUyNSwgIC0xODE5LCAgIC02NDcsCisgICAgICAxNTc1LCAgICA3NjgsICAgMTEyNCwgICAtNDI4LCAgLTEwMTAsICAtMjAyNywgICAgNDExLCAgIC00NzMsCisgICAgICAgODYzLCAgICAyMTAsICAgIDkwOCwgICAgIDQwLCAgICAxNDUsICAgICAzNywgICAgMTkyLCAgICAxODksCisgICAgICAgIDUyLCAgIC0yMTcsICAgLTE2OCwgICAgIDYzLCAgICAgLTcsICAgIC01MywgICAtMTIxLCAgICAgMTMsCisgICAgICAtMTQ1LCAgICAgIDAsICAgIC0zNywgICAgIDYxLCAgLTc5NzksICAgLTE0MiwgICAgIDMyLCAgICAxMTgsCisgICAgICAgMTkwLCAgICAgLTcsICAgIC0xMywgICAgMTEzLCAgICAgMzYsICAgICAzMSwgICAxNDYxLCAgLTIwODgsCisgICAgICAyMzkxLCAgIC05MzksICAgIC02NiwgICAgODIyLCAgICAyODAsICAgIDI0NiwgICAtMTU3LCAgIC0xODMsCisgICAgICAtNDMzLCAgIC0zNTYsICAgICA4OCwgICAtMTAxLCAgIDM5NjksICAtMzM4OCwgICAgLTg0LCAgICAgODQsCisgICAgICAgMTMwLCAgICAgMzUsICAgICA3NCwgICAgIDM3LCAgICAxODEsICAgLTE5NSwgICAgMjE5LCAgICAtMjksCisgICAgICAgLTIzLCAgICAtMzIsICAgICA2OSwgICAgNjI1LCAgIDIzMjgsICAgLTE5MiwgIC0yNjE3LCAgICAyODcsCisgICAgICAgNTQzLCAgLTE2MDQsICAgIDgyMywgICAtNTQ3LCAgIC0yNzcsICAgIDc2NCwgICAgMjc2LCAgICAxNTYsCisgICAgICAgMTk4LCAgICAgMTcsICAgICA4NCwgICAgMzQ2LCAgICAtMjcsICAgLTEyOSwgICAgMTQzLCAgICAyMTcsCisgICAgICAgMjEyLCAgIC0yNDksICAgICAyMCwgICA2NDQ5LCAgICAgIDcsICAgICA1MSwgICAtODg5LCAgICAtODgsCisgICAgICAgMjY1LCAgICAyODIsICAtMTk1NiwgICAxMzI3LCAgLTEwMjUsICAgMTMzOCwgIC0xNzA5LCAgLTEwMDgsCisgICAgICAgMzcyLCAgICAgNTcsICAgMTQwNCwgICAgMjM0LCAgIDI2MjEsICAgIC0xOCwgICAgNjYzLCAgICAzMDEsCisgICAgICAgICAwLCAgICAxNjcsICAgLTM3MiwgIC0yNTM0LCAgIDE5NDUsICAgLTE5MSwgICAgMTk4LCAgICAzNTksCisgICAgICAgLTQzLCAgICAgOTIsICAgICAyNCwgIC01NDk4LCAgICAtNjMsICAgIDE4OSwgICAgIDM2LCAgIC0zNjksCisgICAgICAgMzUyLCAgICAzODEsICAgLTIwNSwgICAtMTQ0LCAgIC0xMTksICAgLTI2NywgICAgLTYwLCAgICAtMTAsCisgICAgICAgMzg3LCAgIDIzODgsICAgLTE1NSwgICAtNDUwLCAgICA0NjUsICAgMTUyOSwgICAtMjE2LCAgIDI2NzMsCisgICAgICAtMTQ2LCAgICAxMTgsICAgICA1MCwgICAgMjkwLCAgICAxNDcsICAgICAxMSwgIC0yOTEyLCAgICA4NjMsCisgICAgICAyMTg0LCAgIC02ODksICAgIC00NCwgICAgIDU5LCAgIC02NjMsICAgIDY2MywgICAgNjc1LCAgICAyOTUsCisgICAgICAxMzMxLCAgIC0xMTUsICAgIC0xMCwgICAgLTU0LCAgICAgLTEsICAgICAzMSwgICAxNjk5LCAgICAxMjcsCisgICAgICAgMjE1LCAgIDI5NjYsICAgIDE2MywgICAgNDE2LCAgLTEwNTMsICAgMTIxNiwgICAgMzU2LCAgIDE0MjgsCisgICAgICAtMTY2LCAgIC0xNzIsICAgICAtMiwgICAtMzU1LCAgIC0xNjksICAgLTMzMSwgICAgLTk0LCAgICAtNzgsCisgICAgICAtMTIzLCAgIDQ4NzUsICAgIDMxMSwgICAgIDY3LCAgIDExNDUsICAgIDM5NywgICAtMjg4LCAgICAyMTIsCisgICAgICAtMzQ0LCAgIC0yOTAsICAgIDEyNiwgICAgIDE2LCAgICAxNzYsICAgIDQ4NSwgICAgNTUxLCAgIC01MjYsCisgICAgICAgIDExLCAgICAxMjAsICAgLTI3NCwgICAgIDgzLCAgLTUzOTksICAgLTE1NCwgIC0xNjExLCAgICA4ODcsCisgICAgICAgMzIxLCAgIC00NDYsICAgMTE2NiwgICAtMzMzLCAgICA2NTIsICAgIDMxMCwgICAtODk1LCAgICAgNjIsCisgICAgICAtMjE5LCAgIDI4NDAsICAgLTc1MywgICAgLTM0LCAgLTMyMDMsICAtMzYwMCwgICAgNDY0LCAgIC0yNDksCisgICAgICAgMzM2LCAgICAyOTcsICAgIC04NSwgICAgMzE2LCAgICAxNDQsICAgIDMwNiwgICAtMjQ5LCAgICAxNDksCisgICAgICAgMTEyLCAgICAgNzMsICAgIDE5MiwgICAgLTg5LCAgICAgMTgsICAgIDE5NywgICAgMTE2LCAgICAgNTEsCisgICAgICAgIDM3LCAgICAyMTIsICAtNzI0OCwgICAgMTYzLCAgICAgMzEsICAgIC01MiwgICAgLTMxLCAgIC0xMDEsCisgICAgIC0xMzY2LCAgIC0zNTMsICAgLTMyNSwgIC0xMzM1LCAgIC00NDAsICAgMTE5MywgICAgNjcwLCAgLTI2MzUsCisgICAgICAgODcyLCAgIDE0MDAsICAgIDczMywgICAgMzk1LCAgICAxMjIsICAgIDEzMCwgIC00MTQ2LCAgICAgIDAsCisgICAgICAtMzgyLCAgIDE0ODYsICAgIDMwOCwgICAxMTc5LCAgIC00MTIsICAgIDI4OCwgICAgNzAxLCAgICAxNjEsCisgICAgICAgMTQ3LCAgICA5NTksICAgICA2MCwgICAgIDc3LCAgIC0xMjMsICAgICAxNywgICAgMTkzLCAgICAyMDQsCisgICAgICAtMjI2LCAgICAzODgsICAgIDI3MiwgICAtNTg4LCAgIC0xNTcsICAgMjgyMywgICAgNzM1LCAgIC03NDUsCisgICAgICAyMzY4LCAgICAzNTksICAtMTA4OCwgIC0yMDA0LCAgLTEyOTMsICAgMjAxOCwgICAgNDgzLCAgICAzMjAsCisgICAgIC0xMDE0LCAgIC04MDYsICAgLTQ3OSwgICAgLTY4LCAgICAtNTEsICAgIDE2OCwgICAgODczLCAgICAgMjcsCisgICAgIC03OTA2LCAgICAgNTcsICAgICAxOSwgICAgLTIzLCAgICAgMjcsICAgICA0MywgICAgLTEzLCAgICAtNTAsCisgICAgICAgIDkzLCAgICAgMTYsICAgICAyOSwgICAgIDMxLCAgICAtMjYsICAgICAzMiwgICAgLTIyLCAgICA0NTMsCisgICAgICAyOTIyLCAgLTI1NjAsICAgIDEzOCwgICAgOTIzLCAgLTEyNDUsICAgLTQwNSwgICAgIDEwLCAgICAyMjgsCisgICAgICAtMjcwLCAgICAxNDUsICAgLTE5MiwgICAgIDgzLCAgICAgNDgsICAgIDEwMSwgICAgIDc3LCAgIC0yMjYsCisgICAgICAgIDM2LCAgIDc3OTIsICAgIDEyNiwgICAtMjc1LCAgICAtMzcsICAgIC0zNiwgICAgICA5LCAgICAgNDUsCisgICAgICAgLTg5LCAgICAgMTMsICAgIDE0OCwgICAgMTI1LCAgICAgMjQsICAgLTQ0MiwgICAgMTExLCAgICAtMTIsCisgICAgICAgNTQwLCAgIDE3OTQsICAgMzAwOCwgICAxNjIwLCAgIC0xODUsICAtMTM5NCwgICAtMTYxLCAgICAtMjUsCisgICAgICAtMzEzLCAgIC0zMTcsICAgIDU5MSwgICAyNTA3LCAgICAxMzQsICAgLTM2OSwgICAgIDc3LCAgICA1MjcsCisgICAgICAtNjE5LCAgIC0yMzYsICAgMjY4MSwgICAgIDg3LCAgLTEwNjAsICAgIC0zNCwgICAxODk0LCAgLTExMjMsCisgICAgICAgMzczLCAgIC02MjgsICAgMTkzNCwgIC0xMjc5LCAgLTE2ODksICAgLTYwOSwgICAtNDcyLCAgIC01OTgsCisgICAgICAgNDA1LCAgICAyMjksICAgIDQxNCwgICAgIDEyLCAgLTI5MjMsICAgIC0zMywgICAtNDM1LCAgICAtNDksCisgICAgICAyMzgwLCAgICAtMzQsICAgLTM0NCwgIC0yMTcxLCAgIC0yODQsICAgIDI3NCwgICAgMjI2LCAgIC0yODcsCisgICAgICAgLTg0LCAgICAtNTcsICAgICAtMSwgICAtMTY5LCAgICAtNTAsICAgIDQ3OSwgICAgNzA3LCAgLTI3NzQsCisgICAgICAtNTMyLCAgIC02NDAsICAgLTI0NCwgICAgIDQ0LCAgICA0NTgsICAgMjUxOSwgICAtNTkwLCAgIC00NzIsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjQ0NDhzbDFbXSA9IHsKKyAgICAgLTI4NzgsICAgLTcxNCwgICAzMDk4LCAgICAtNzYsICAgIC01MSwgICAgMjMyLCAgICAxMTgsICAgLTc4MCwKKyAgICAgIC02OTEsICAgLTI2NywgICAtMzA5LCAgICAxMDUsICAgLTE3OSwgICAgIC01LCAgICAtODQsICAgIC0xMSwKKyAgICAgIC0xMjAsICAgLTM3OSwgICAgNDU4LCAgLTMxNjEsICAgICA2NSwgICAyOTk0LCAgICAgNjQsICAgIDM3NCwKKyAgICAgIC00NDAsICAgICA2MiwgICAtMTgzLCAgICAgMjgsICAgLTU2MSwgICAgIDczLCAgICAgNTksICAtMjU2NSwKKyAgICAgICA0NDUsICAgLTQ1MSwgIC0xMDI2LCAgICA0MzcsICAgICAxMCwgICAtMTczLCAgIDEyNDMsICAtMjI3OCwKKyAgICAgIC00ODEsICAgLTM5NSwgICAtMTU0LCAgLTI0MDIsICAgIDk0NSwgIC0yNzg5LCAgICAxMTcsICAtMTE4NCwKKyAgICAgICAgNzUsICAgLTcwNCwgICAgNTI3LCAgICA0NzgsICAgLTU4OSwgICAgIDE3LCAgICAxMzEsICAgLTExMCwKKyAgICAgICA1NzQsICAtMTA1NSwgICAtNjI4LCAgIC0yNzcsICAgMjc5OCwgICAxNDgzLCAgIC02NTcsICAtMTk5NiwKKyAgICAgIC0yNDgsICAgIDE5NCwgICAtMjg0LCAgICA4MjIsICAgIDIyNSwgICAtMTcwLCAgICAtMTAsICAgLTMwMiwKKyAgICAgIC00MjcsICAtMTcwMCwgICAgLTkwLCAgIDI3NTYsICAgMjEyNCwgICAgLTQ5LCAgIC05NjQsICAgIDM3MiwKKyAgICAgIC02MzcsICAgIDQ0MywgICAgIDEzLCAgICAtNjksICAgIC03MSwgICAgMTk2LCAgLTE5NzEsICAgIDExMCwKKyAgICAgIDExNDcsICAgIDY5OCwgICAxMzMzLCAgIDEzNjksICAgIDUyNywgICAgMTY1LCAgICA5MDMsICAgIDU3NywKKyAgICAgLTIxMzQsICAgICA1NiwgICAgLTMzLCAgICAgMzQsICAgIDE4MywgICAgMjQ3LCAgIC0zNDIsICAgIDk3NCwKKyAgICAgIDEwNzksICAgMjQ3OCwgICAgLTI2LCAgICAgODAsICAtMjM3NywgICAgNDMwLCAgLTE0MjIsICAgIDQyOCwKKyAgICAgLTIxODcsICAgLTQ2OSwgIC0xMjgwLCAgIC0zMjYsICAgIC00MCwgICAgMTg4LCAgICA5MTEsICAgIDQwNSwKKyAgICAgIDI3NzIsICAgIDI3OSwgICAtNDkzLCAgICAyNjUsICAgIDc2OCwgICAgIDQ1LCAgIDU3NzgsICAgICA0NCwKKyAgICAgICAxMjEsICAgLTI1NywgICAtMTM1LCAgICAxMjQsICAgIDI2MywgICAgIDE1LCAgICAxOTcsICAgLTExNCwKKyAgICAgICAgIDUsICAgIC0xNCwgICAgIC04LCAgICAtODIsICAgMzk4OSwgICAtNTExLCAgICAxOTcsICAgMjQ0NiwKKyAgICAgIC0yOTIsICAgLTIwNSwgICAtOTE5LCAgICAxNjIsICAgLTEyMSwgICAgMTQ1LCAgICAtNDAsICAgICA3MSwKKyAgICAgIC0xMDUsICAgICA3MiwgICAyMDM1LCAgICA5NjAsICAgLTE0NSwgICAtNDY3LCAgIC01MTgsICAgIDE2NywKKyAgICAgLTI5ODgsICAgIDQyMSwgICAgODYwLCAgICAzMjAsICAgICA0MCwgICAtNDQ2LCAgICAzMTksICAgIDE2MCwKKyAgICAgICAxNDAsICAgIDUxMSwgICAgLTU1LCAgICAyMTMsICAgLTE0OCwgICAtNTI3LCAgIC02NjYsICAgIDY4NywKKyAgICAgICAgIDksICAgICAyMywgICAgMzQ0LCAgIC0xNTYsICAtNDY0NiwgICAtMTI1LCAgIC0yMjAsICAgICAgOSwKKyAgICAgICAxMzQsICAgIC0yNSwgICAgIDE2LCAgLTEzMTksICAgIDc2MywgICAgIDU4LCAgLTE1ODYsICAgLTQzOCwKKyAgICAgICAzMDEsICAgLTQxMSwgICAtMzM3LCAgLTMzOTgsICAgIDM1OCwgICAgLTY4LCAgIC0xMTEsICAgNTQ4MywKKyAgICAgICAtMzYsICAgLTQ1NiwgICAgLTk0LCAgIC0xMTYsICAgIDIwNCwgICAgIDk1LCAgICAgODQsICAgIC03MywKKyAgICAgIC0xNjMsICAgICA2OSwgICAtMTkwLCAgICAgNjQsICAtMzcxNiwgICAtMzI2LCAgIDE4MTUsICAgLTg0MywKKyAgICAgICAzMTIsICAgLTQ5OCwgICAgNjg0LCAgIC02NDEsICAgLTc2NiwgICAtMTA0LCAgICA2MDYsICAgICA3MCwKKyAgICAgIDI2MzAsICAgICA1MSwgICAtMTcwLCAgLTM1ODQsICAgIDE2NywgICAgNDYxLCAgIC0xNjIsICAgIDEzMiwKKyAgICAgICA0OTYsICAgICA5MSwgICAgMTcxLCAgICAyNTUsICAgICA0OCwgICAgICAyLCAgIC0xMjAsICAtMTE5NiwKKyAgICAgICA1MzQsICAgLTQzMSwgICAyNjY5LCAgIC00MDMsICAgICAgOCwgICAgMjg3LCAgIC0zOTEsICAgMjU1NywKKyAgICAgICA4NDksICAgIDE2NywgICAtMjc1LCAgIC0xODQsICAgIDYwNSwgIC0zNTcwLCAgICAxMTMsICAgICAyMiwKKyAgICAgLTI1ODYsICAgIDY2OCwgICAgMjk0LCAgIC05MTAsICAgICA2NywgICAtMTQxLCAgICAgIDAsICAgIDQxOCwKKyAgICAgICAyNzEsICAgICA3NSwgICAgIDkwLCAgIC0xMjQsICAgIDQ0NiwgICAtMTQyLCAgIC02MzUsICAgIDYzMSwKKyAgICAgIC05NTYsICAgMTU2NiwgICAgIDI1LCAgLTE5ODIsICAgIDc5MCwgICAyNzcwLCAgICAgMzMsICAgLTUyMCwKKyAgICAgICAgMjMsICAtNzQ4OCwgICAgIDY3LCAgICAtNzMsICAgICA2MCwgICAgIDY0LCAgICAtNDYsICAgIC0zNiwKKyAgICAgICAgNzYsICAgICAgMywgICAgIDIyLCAgICAxNDksICAgICA2MSwgICAgIDM0LCAgICAyNTUsICAgLTM4MCwKKyAgICAgIC0yODQsICAtMjUzMSwgIC0xNDIzLCAgIDE1MDcsICAgLTkyNiwgIC0xMDc0LCAgIC05MjksICAtMTQzMCwKKyAgICAgIC0xNDEsICAgIDE2NSwgICAgLTgwLCAgIC0yNjgsICAgICAyMSwgICAtNzY3LCAgIDE1NDIsICAgMzE5NywKKyAgICAgIC0xOTEsICAgMjAxNCwgICAtMzA0LCAgICA1OTUsICAgIDUzNiwgICAtOTA2LCAgIC0xMjYsICAgLTM1NCwKKyAgICAgICAtNzYsICAgLTE2MiwgICAtMTI1LCAgLTMxMzksICAgMzE5NywgICAgOTM0LCAgICAzNjYsICAgLTkyMywKKyAgICAgIC0zMzAsICAgIDI3NywgICAtMjg0LCAgIC0xNjMsICAgIC0xMiwgICAgNDAyLCAgICAgMTUsICAgLTE0NiwKKyAgICAgICAgMjAsICAgICA4MywgICAgMTExLCAgICAxOTYsICAgICAyMywgICAgIDcxLCAgICAgNzcsICAgNzI4NywKKyAgICAgIC0xNzUsICAgIC0xMywgICAtMjI3LCAgICAtNTksICAgIC01NiwgICAgLTI4LCAgICAgIDEsICAgIDE2MywKKyAgICAgICAtNTAsICAgICA1OSwgICAgNjM1LCAgICAxNTAsICAgICA5NSwgICAyNzUwLCAgICA3NzUsICAtMjA1NywKKyAgICAgICA0MjMsICAtMTA3OCwgICAxNzQ5LCAgICAgLTMsICAgLTY1NSwgICAtMzY1LCAgIC0zNTcsICAgIDE0NSwKKyAgICAgICAtNzYsICAgICAgNSwgICAgLTkzLCAgICAyMjQsICAgIDE1MCwgICAgMTA4LCAgICAtMzQsICAgIDE3MywKKyAgICAgICAxNDgsICAgLTM3MSwgICAgIDM0LCAgICAgNDgsICAtODAzNywgICAgIDY1LCAgICAgNTAsICAgIDEwMywKKyAgICAgICAtNDIsICAgIC0xMCwgICAgLTk2LCAgICAtOTAsICAgICAtMywgICAgIDYwLCAgICAgOTIsICAgIC03OSwKKyAgICAgICAtNzYsICAgIDM4NiwgICAgMTE0LCAgLTE5NDcsICAgIDgzMywgIC0xMjc5LCAgIC00ODQsICAgIDIxNywKKyAgICAgIDMxNTYsICAgIDIyNiwgICAgNDg1LCAgIDExOTEsICAgIDQyNSwgICAgIDg4LCAgICAtNTksICAgLTI0MywKKyAgICAgIDIyOTIsICAgMTY4MSwgICAgNjcxLCAgICAgNjIsICAgIDg5OSwgIC0yNDUzLCAgIC0xMDAsICAgMTAzOSwKKyAgICAgICA3MTMsICAgLTEwNCwgICAgNTU0LCAgICAyMTksICAgIDM1NiwgICAgOTYzLCAgICA3NDEsICAgLTEwMiwKKyAgICAgICA0NTUsICAgMjA2NywgICAtMzI0LCAgICAxNzIsICAgICAyOCwgICAgNzcyLCAgICA3NTIsICAtMjM1MSwKKyAgICAgLTE0MzgsICAgLTg2NSwgIC0xNjY4LCAgICAxMDUsICAgMTAzNCwgICAxMTk1LCAgICAgMTQsICAgLTM1MCwKKyAgICAgIC00MjUsICAgLTY0OCwgICAyMDg2LCAgIC01MzIsICAgIDYzNCwgICAxNTM3LCAgICAtMzMsICAgLTU5OCwKKyAgICAgIDI4ODgsICAgIC04NSwgICAgMTg0LCAgICAxNTgsICAgLTE2NCwgICAzMzM5LCAgICAyMzcsICAgLTI4NCwKKyAgICAgICAtNTQsICAgLTI0NiwgICAgIDQ2LCAgIC0yNTQsICAgIDM2NSwgICAgIDU1LCAgIDE5MjgsICAgLTM0NiwKKyAgICAgIC0zNTcsICAgIDMzMSwgICAgMTM5LCAgICAgMTYsICAgIDY3NCwgICAtMzg0LCAgICAtNjcsICAtMzM5OSwKKyAgICAgICAxNjUsICAgICA3NiwgICAgMjE1LCAgICAxMzcsICAtMzE4NywgICAtMTQ2LCAgIC0yNjQsICAgLTE2NSwKKyAgICAgLTMwMzksICAgIDIzNSwgICAtNTQxLCAgIC02MzAsICAgIC0zMiwgICAgLTMzLCAgIC0yMTEsICAgIDE2MCwKKyAgICAgIC0xMjEsICAgLTExMSwgIC0xMjk2LCAgICAtNDcsICAgLTEyOCwgICAgMjkyLCAgLTE1MjMsICAgMTU0MCwKKyAgICAgICA3NzEsICAgLTE2NiwgICAtNTA5LCAgICAyMTIsICAgMjc1OCwgICAtMzI3LCAgIC00MTgsICAgLTMwNSwKKyAgICAgICAgLTksICAgIDQ2NSwgICAyNTEzLCAgICAxOTUsICAgIC03MCwgICAtMjA5LCAgICAtNjYsICAgIDEyNywKKyAgICAgIC0xNDcsICAtMzE2MSwgICAtMTkyLCAgIC01NDEsICAgLTU1NSwgICAgMTMxLCAgIC04NTgsICAtMTYwOSwKKyAgICAgICA5NzMsICAgLTE1NiwgIC0xODc3LCAgICAgNjAsICAgMTAxMSwgICAgIDY2LCAgIC0zNDgsICAgIDkxMiwKKyAgICAgLTE3MzEsICAtMTI5NiwgICAgMzA1LCAgIC0zNjksICAgLTU2MCwgICAgNDcwLCAgICAgNDYsICAgLTg2MywKKyAgICAgIC0xMjQsICAgIC0zNywgICAgIDQwLCAgIC0zOTUsICAtNDg4NiwgICAgLTIwLCAgICAyMjEsICAgIDIyOCwKKyAgICAgICAxNzcsICAgIDE4MiwgICAgIDk4LCAgIC0xNTEsICAgLTE5NSwgICAgODU0LCAgIC0xOTQsICAgLTM3NCwKKyAgICAgICAzMDEsICAgIDU4NiwgICAgIDU4LCAgIC05MDgsICAgIC0xOSwgIC00MTk4LCAgIC0xNzEsICAgIDMzMCwKKyAgICAgICAgNDgsICAtMzMxMiwgICAtMTY0LCAgIDE5MTMsICAgMTE4MywgICAgLTQyLCAgIDEyODcsICAgLTM1MywKKyAgICAgICA3NTcsICAgIDYyMCwgICAtNTQ3LCAgICAyNTEsICAgLTUyMCwgICAgIDU5LCAgICAgNDMsICAgLTE3OSwKKyAgICAgIC0xOTEsICAgLTEzMSwgIC0yOTUxLCAgIC05NDQsICAtMjQ3OSwgICAgMzQ0LCAgIC04MTMsICAgIDEwNCwKKyAgICAgIC02OTcsICAgIC00NCwgICAtMjcwLCAgICAxOTgsICAgIDI0NSwgICAyODY2LCAgICAyMDgsICAgIDE3OCwKKyAgICAgIC0yNDgsICAgICAzOCwgICAgIDE5LCAgICA1NzcsICAgMjgxMiwgICAtNzY1LCAgIC04NTUsICAgLTQzOSwKKyAgICAgICAtNjAsICAgIC0zMCwgICAtMzUyLCAgIDE1MjEsICAtMTA2OSwgICAgNDU3LCAgICA0MTUsICAgIDU3MiwKKyAgICAgIC03NDksICAgLTE0NCwgICAgMTAwLCAgICA1MTUsICAgLTc5NCwgIC0xNTU0LCAgIDI1MDcsICAgLTI3MCwKKyAgICAgICAgMTAsICAgICA2MiwgICAyNTA3LCAgLTE1NTAsICAgIC03NSwgICAgIDcwLCAgIDI1MzAsICAgIDU2MiwKKyAgICAgICAxMzIsICAgLTE0MSwgICAgMjUxLCAgICAxNTYsICAgIDgzNSwgICAgMTAyLCAgICA3MTcsICAgMzIyNiwKKyAgICAgIDMzMjcsICAgIDE3MiwgICAgIDg0LCAgIC0yMDUsICAgIC0xMSwgICAgMjA4LCAgIC0zMTAsICAgIDE2NCwKKyAgICAgICAtMjcsICAgICAxMSwgICAgMjgxLCAgICAgMzcsICAgLTUxOCwgICAgIDIwLCAgICAtNzYsICAgICA4MiwKKyAgICAgIDU0MzYsICAgLTU0MywgICAtMzAxLCAgICAxMTIsICAgIDM1OSwgICAtMTQwLCAgICAtOTQsICAgICA3OCwKKyAgICAgICAtMTgsICAgICAzOCwgICAtMTk2LCAgICAtOTIsICAgICAxMywgICAtMTExLCAgICAtMjMsICAgICAzMCwKKyAgICAgICAtMTUsICAgIC05NCwgICAgMTAxLCAgICAxNDIsICAtNjQ1NSwgICAgMzIxLCAgICAzMjIsICAgICA1MCwKKyAgICAgIC0yMTYsICAgLTMyMSwgICAgLTEwLCAgIC00NjUsICAgIDEwMSwgICAgIDQ1LCAgIC01ODUsICAgLTk2OSwKKyAgICAgIDEyNDgsICAgLTQ1NiwgIC0yNTIzLCAgIC04NTIsICAtMjEyOSwgICAtODg5LCAgICAgMzMsICAtMTQyNCwKKyAgICAgIDE0NjIsICAgIDU4MywgICAgNzQ5LCAgICA1MjcsICAtMTczNywgICAxMjYyLCAgIC01OTQsICAgIDQxNCwKKyAgICAgIC0yMTUsICAtMTE4NCwgICAgNDEyLCAgIDE3NTgsICAtMTgzNiwgICAxMjQ4LCAgICA0NDAsICAgLTE3OCwKKyAgICAgICA3ODQsICAgMzU5MSwgICAtMjI3LCAgICAgNDMsICAgLTQ5MywgICAtNzY2LCAgIC0yNzAsICAgIDE1MCwKKyAgICAgICAxNTEsICAgIC01NiwgICAtMTEwLCAgLTI4MzIsICAgIC03MywgICAtMTY2LCAgICA0NzAsICAgLTE3OSwKKyAgICAgIC02ODEsICAgICA3MSwgICAtMTE0LCAgLTI3NDMsICAgLTgwNiwgICAtNTYwLCAgICAgNjMsICAgLTI0NCwKKyAgICAgICAtOTAsICAgIDE4MiwgICAtMTQzLCAgICA5OTUsICAgIDQwNCwgICAgLTEzLCAgLTEzNDMsICAgMTUyNCwKKyAgICAgLTI0NzIsICAgMTcxOCwgICAtOTU3LCAgIDEyMjksICAgIDQ1OCwgICAtMzk1LCAgLTI4MTcsICAgLTU3OSwKKyAgICAgICAtOTksICAgIDM0MCwgICAxNTM4LCAgICA2ODQsICAgLTQ5MiwgICAxMTU2LCAgICAtNDUsICAgIC02NSwKKyAgICAgIC0zMDUsICAtMTQwOCwgICAtMzI1LCAgIC0yNzAsICAgLTM1OCwgICAtMTI3LCAgICAgOTIsICAgIC05NywKKyAgICAgICA0MTUsICAgICA4NSwgIC00NzQ5LCAgICAxNzMsICAgLTI5NiwgICAtMjAzLCAgICAzMzEsICAgIDMxNSwKKyAgICAgICAxODQsICAgIC00NiwgICAxMzE1LCAgIC0xNDYsICAgIC01NSwgICAgNDI3LCAgICAgMzcsICAgIDI1NSwKKyAgICAgIC0yMDksICAgIDI3MiwgICAgNzM1LCAgICA1MDYsICAgIDEwNSwgICAgMTAzLCAgICA5MDIsICAtMzQ0OSwKKyAgICAgICAxMTYsICAgMjMwNCwgICAgNjE2LCAgLTE1NjQsICAgMTUwOCwgICAgNDc4LCAgICAzMjAsICAtMjQxOCwKKyAgICAgICAyNDQsICAgLTE3NiwgICAgLTMyLCAgICAyMzgsICAgICA5MiwgICAgMjkwLCAgIC0xNjgsICAgIC03OCwKKyAgICAgLTM0NjQsICAgIDI3MCwgIC0xOTAyLCAgICAgIDIsICAgIDY5NiwgICAgIDkyLCAgLTE2MTAsICAgLTIwNiwKKyAgICAgICAtNDksICAgIDE3OCwgICAgMTIxLCAgICAgMjcsICAgIDExOSwgICAgIDcyLCAgIC0yNTMsICAgLTM5OCwKKyAgICAgLTI3MjAsICAgIC04MSwgICAtMTYyLCAgIC01NTAsICAgMjU5NSwgICAxNDQ1LCAgICAyNDksICAgLTEwNCwKKyAgICAgICAyMTgsICAgLTMxMCwgICAgLTk1LCAgICAgMTgsICAgLTQ3MywgICAxOTA4LCAgICA0MzIsICAgLTIyNywKKyAgICAgIC0xNjgsICAtMjcyNSwgICAtMjQwLCAgLTE4MzAsICAgIDE5OSwgICAgNDM3LCAgLTEzOTIsICAgIDMwNCwKKyAgICAgIDE0NjEsICAtMjM5NCwgICAtNjAzLCAgIC01NDAsICAgIDc2OSwgICAgMzQwLCAgIC0xMDQsICAgMTU2OSwKKyAgICAgICAtMjEsICAgIDMzOCwgICAtODc0LCAgIDE1MzMsICAgIDI4MSwgICAgLTU5LCAgICA0ODcsICAgMjEyMCwKKyAgICAgICAxNzksICAgLTE0MCwgICAtMzI4LCAgICAtNTcsICAgICA2MywgICAtMTEwLCAgLTEzMzAsICAgLTQ4NSwKKyAgICAgLTI0MjcsICAgMTE1OSwgICAgMzU1LCAgICAtMjYsICAtMjA1NSwgICAgMTU0LCAgIC01NjMsICAgLTEzMiwKKyAgICAgICAgNDksICAgLTMyOSwgICAtMTg3LCAgICAtMjQsICAgIC03MSwgIC0zOTcwLCAgICAyNzYsICAgIDE1OCwKKyAgICAgICAgOTIsICAgLTIwMiwgICAgICA3LCAgIC00MjIsICAgLTU3OCwgICAgMTg2LCAgIC00MDcsICAgNDk2MCwKKyAgICAgIC01OTUsICAgMTAyNywgICAgNDE3LCAgICA2OTEsICAgICA2OSwgICAgMTMzLCAgICAxMjMsICAgLTE0NywKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiNDQ0OHNzMFtdID0geworICAgICAtMjY4MCwgICAyNDk5LCAgIC0zMjgsICAgMjIxMiwgICAxMjg4LCAgICAtNTcsICAgLTcyNywgICAgIDc2LAorICAgICAgLTIxMCwgICAtMjE4LCAgICAgNDEsICAgLTM0MywgICAgLTI2LCAgICAtMzgsICAgICA0MywgICAgNjA2LAorICAgICAgLTYxOSwgICAtNTMxLCAgLTIwODIsICAgICA4NywgIC0xMTI3LCAgIDEyODIsICAgIC0yMywgICAyMjcyLAorICAgICAtMTgxNiwgICAgMTA0LCAgICAtMzEsICAgICA4NSwgICAgLTIyLCAgICAgNjAsICAgMTI5MywgICAgMTM4LAorICAgICAgIDM4MiwgICAgNDMyLCAgICA0ODksICAgLTM3MiwgIC0xNjQ5LCAgLTI4MDksICAtMjU1NiwgICAgLTk4LAorICAgICAgLTIzMiwgICAtMjMzLCAgICAxNjksICAgIDE4NiwgICAgIDc5LCAgIDExNTcsICAgMjExMywgICAtOTQyLAorICAgICAgIDYzNiwgICAgODc3LCAgIC02MDEsICAgMjI3NywgICAxNDExLCAgIDExNjUsICAgMTAyOSwgICAtNjEzLAorICAgICAgLTM0OCwgICAgLTM4LCAgICAtMTksICAgICA0NSwgICAxMzE4LCAgLTE5ODAsICAgICAxMiwgICAyNzYyLAorICAgICAgMTUxOSwgICAgMTg0LCAgIDE5ODAsICAgIC00OSwgICAtMjcwLCAgICAzNjEsICAgLTE3MiwgICAtNjAxLAorICAgICAgLTE5NiwgICAgMTg2LCAgICAtNjcsICAgLTEyNCwgICAxNTAzLCAgLTEwMTEsICAgIDI2MywgICAgMjIzLAorICAgICAgLTM4NCwgICAgMTUzLCAgICAtMjEsICAtMTA2MywgICAtMjM5LCAgIDExNzEsICAtMzUwMSwgICAgNTEyLAorICAgICAgLTE2MiwgICAtMTgwLCAgICAxMzksICAgLTY4MCwgICAgNjA5LCAgLTE5MTksICAgMjk2OSwgIC0yMzIxLAorICAgICAgLTE4MywgICAgMTk0LCAgIC01NTgsICAgICAyNiwgICAgIDkxLCAgICAzNDAsICAgIC0yNSwgICAgLTMxLAorICAgICAgIDEyNywgICAgNjYyLCAgICAxODIsICAgIDE5MSwgIC0yMjAxLCAgLTI2MDMsICAgMjI1MiwgICAtNTIzLAorICAgICAgIDI3NywgICAgIDUwLCAgICAzNTUsICAgIDI5NSwgICAgLTY1LCAgICAzNTUsICAgIDIwNywgICAgIDgyLAorICAgICAgLTQ4OSwgICAtMTQzLCAgIC0yMTgsICAgICA4OSwgICAgNjY2LCAgIC0zNTksICAgMjcxNiwgIC0yMzEwLAorICAgICAtMTkxMiwgICAgNDE3LCAgICA0MDAsICAgICA0MywgICAgMTEwLCAgICAtOTMsICAgLTE0MiwgICAgIDYxLAorICAgICAtMzAwMCwgICAgNDU0LCAgIC0xNTMsICAgICAgMCwgICAtNDEzLCAgICA0NjksICAgIDMzOSwgICAgMzE4LAorICAgICAgLTE5NywgICAgIDc1LCAgICAtODAsICAgMjg5NCwgICAtMTI5LCAgICAgODIsICAgMTQzMSwgICAxMTgzLAorICAgICAgIDQyOSwgIC0xNTU2LCAgLTEzMzksICAtMTU3MywgICAgLTkyLCAgIC05MTEsICAgLTIzMCwgICAgLTEyLAorICAgICAgICAtNCwgICAtMTQ1LCAgIC0zODgsICAgLTQxOSwgICAgIC01LCAgIC0yNDEsICAgNzEyMCwgICAgMTY1LAorICAgICAgLTEyNSwgICAtMTIyLCAgICAxMjYsICAgLTE1MCwgICAgMTA5LCAgIC0xNDYsICAgIC02MSwgICAgLTQ5LAorICAgICAgICA0NywgICAgIDcwLCAgICAtNDMsICAgICA0MCwgICAxODY3LCAgIDE0NzMsICAtMTI3OCwgICAxMjI5LAorICAgICAtMjI1NiwgICAgLTkwLCAgICAgMTAsICAgLTc0NCwgICAxMTk2LCAgIC0xMDksICAgIDQwMiwgICAgMjU4LAorICAgICAgIDY5MCwgICAgLTc0LCAgICAgMjYsICAgMTI5NCwgIC0xMDc5LCAgICAxNDIsICAtMjM4NCwgICAtMzI0LAorICAgICAtMTY5NiwgIC0yNzQxLCAgICAzMjEsICAgICA2NiwgICAgIDgzLCAgIC0xMjcsICAgLTEzMSwgICAgMTU2LAorICAgICAgIDE2NiwgICAgMTM1LCAgIDE4MTIsICAtMzQ0NSwgICAgIDEwLCAgICA1MzUsICAgLTU0NywgICAgNDgxLAorICAgICAtMjI0MywgICAgMjg3LCAgIC0zMzUsICAgIDIxOCwgICAgMTk1LCAgICAgLTEsICAgIC0yNSwgICAgLTk0LAorICAgICAgIDE5NSwgICAxNDMzLCAgLTE0MjgsICAtMTQ0NCwgICAgNTIwLCAgICAyMTksICAgMzM2MywgICAtMzg4LAorICAgICAgLTgwNywgICAtNDU0LCAgICAtMjksICAgIDMxNiwgICAgMTI1LCAgICAxNTksICAgLTE0NCwgICAtMTU2LAorICAgICAgLTMxNywgICAgNzUyLCAgICAyNTYsICAgIDIxNiwgICAgMzQwLCAgICA0ODgsICAgIDE0NywgIC01NjYyLAorICAgICAgICA1NSwgICAtMTEwLCAgICAzODcsICAgLTEwMiwgICAtMjExLCAgICAtNjYsICAgIC0yNiwgICAzNjg4LAorICAgICAgLTE3MiwgIC0yMzY2LCAgIC0yNDQsICAgICAtNSwgICAgMzUzLCAgICAgMTEsICAgIDUwMywgICAgIDg4LAorICAgICAgIDIyNywgICAgIDY5LCAgIC0yNDAsICAgLTE4NywgICAgLTU4LCAgIC0zODksICAtMTc4MywgIC0xNDI3LAorICAgICAgICAyMCwgICAtNjE4LCAgICA1NDQsICAtMTMzNywgICAgNjI4LCAgLTMxODAsICAgIDcwOCwgICAtNTM4LAorICAgICAgLTQyMywgICAgMTE1LCAgICAgNDksICAgLTE2MSwgICAgMTg0LCAgIC02ODIsICAgLTIyMywgICAgNjg5LAorICAgICAgMTI5OSwgICAtODkxLCAgLTEwNzMsICAtMTIyOCwgICAtMzA1LCAgICAgNDcsICAtMjIyMSwgIC0xNTU5LAorICAgICAgIDU5OCwgICAtMzgwLCAgICAxNjYsICAgIDE0MywgICAtMzY2LCAgICAyODcsICAgMjEyMiwgICAgNTA5LAorICAgICAgIDYyOSwgICAgMjM1LCAgIDE1MjMsICAgMjkwMCwgICAtNjQwLCAgIC00MjUsICAgLTQ2MiwgICAtMjMxLAorICAgICAgIC01MywgICAgLTI3LCAgIC0yNjMsICAgMjA5MCwgIC0xODkyLCAgLTExNDcsICAgIC00MiwgICAgODY2LAorICAgICAtMjMwMSwgICAgNDYxLCAgLTEwODIsICAgLTYyNSwgICAgLTg1LCAgICAxNDgsICAgIDIyOSwgICAgLTI1LAorICAgICAgICA4NSwgICAgIDUzLCAgICAyNTksICAgIC04MSwgIC00MDcyLCAgIDI1NzcsICAgIC0xMiwgICAgIC03LAorICAgICAgIDMzNSwgICAtMTUxLCAgIC02OTEsICAgLTEzNywgICAgIDk4LCAgICAzNzIsICAgIC0zNywgICAtMTkyLAorICAgICAgIC0xNywgICAzMzE4LCAgIC01NTgsICAgMjA2NCwgICAgMzk2LCAgICAyNTgsICAtMTA2NywgICAgMjI5LAorICAgICAgMTEyMiwgICAgMjk4LCAgICAtMjUsICAgICA0MCwgICAgIDI3LCAgIC0xMzQsICAgLTE2NiwgICAtMjQ3LAorICAgICAtMjAxMCwgICAtNDQwLCAgIDEwNjYsICAtMTQwMCwgIC0zNDU0LCAgIC0yODksICAgIDQyOCwgICAgNjI5LAorICAgICAgLTE1OCwgICAgMTI2LCAgICAxMjksICAgIDE4MywgICAgLTEyLCAgIC0xNzEsICAgLTEyMCwgICAgNDIxLAorICAgICAgLTQ0NSwgICAgIDY2LCAgIC05MDAsICAgMzY4MCwgICAxNTgzLCAgIDE5ODUsICAgICAyNSwgICAgMjI5LAorICAgICAgLTUzNSwgICAgIC0xLCAgICAgNDUsICAgIDIwNywgICAgLTU0LCAgICAtMzAsICAgMTU4MSwgICAtOTM4LAorICAgICAgLTcwMywgICAgNDA1LCAgICA4NzgsICAgLTM5OCwgIC0xMDY5LCAgIDE3NDgsICAtMjU4NywgIC0xNDE5LAorICAgICAgLTM3NSwgICAtNDQxLCAgIC00ODcsICAgIDEwOSwgICAgIDIxLCAgLTEzOTksICAgIDY0OCwgICAtMjcxLAorICAgICAgLTcwMSwgICAgNjM1LCAgICAxMTUsICAgLTEzOCwgICAtNDU4LCAgIC02MDAsICAtMTg5MSwgICAgNTg1LAorICAgICAgIDQyMCwgIC0xOTE2LCAgIDExMzUsICAgICAgNywgICAxNTg0LCAgICA5MTAsICAgNDI2NywgICAxMzI4LAorICAgICAgIDI3OSwgICAgMzk1LCAgICAtMzUsICAgIC05OSwgICAtMTY4LCAgICA1MDMsICAgIDIxNiwgICAtMTI2LAorICAgICAgIDIxMSwgICAgMjEyLCAgICAxOTMsICAtMjIwNSwgICAgNDkxLCAgICA2OTYsICAgICA0MSwgICAgMjgzLAorICAgICAgIDY0OSwgIC0zNDI1LCAgIC05OTksICAgIDIwMCwgICAgNjI1LCAgIC0yNjEsICAgLTM3OCwgICAgLTQ3LAorICAgICAgIC0xNSwgICAgLTMwLCAgLTEyNjIsICAgMTcwMCwgIC0yMTkxLCAgICAxOTYsICAtMTc3MywgICAtMjUxLAorICAgICAgICA4NCwgICAgNDk4LCAgIC0yNjEsICAgIDE1MCwgICAgNDUxLCAgICAgNDEsICAgIDMzNiwgICAgIDI3LAorICAgICAgIC01NiwgICAgNTYyLCAgICAtODYsICAgICAtMSwgIC0xMDczLCAgIDE0NjEsICAgMjE0OCwgIC0yOTYxLAorICAgICAgLTMyNiwgICAtMjU3LCAgICA0NDAsICAgIC00MiwgICAgLTQ4LCAgIC0zMjAsICAgIDEyMiwgICAgIDk0LAorICAgICAtMTI2NywgICAtODMwLCAgIDI4MTAsICAgIC05NCwgICAtMjAxLCAgICA5OTAsICAgMjQxNSwgICAtNzQwLAorICAgICAgLTE2NiwgICAtMjY3LCAgIC0xNTcsICAgICA2OCwgICAgMzAxLCAgICAyOTAsICAgICA2NSwgICAgOTMxLAorICAgICAgMTk2OSwgICAtMTcwLCAgICAgIDYsICAgIDE0OSwgICAtMjcyLCAgIC0xMDUsICAgIDU0MiwgICAgLTExLAorICAgICAtMzg4OCwgICAgMTA1LCAgICAzMDUsICAgIDMzMywgICAgLTE0LCAgICAtMzksICAgMTk0NCwgIC0xMTY0LAorICAgICAgICA4OCwgICAzODI5LCAgLTExOTAsICAgLTUzNSwgICAtNjQ0LCAgIC0zMzAsICAgIDUwOSwgICAgLTkzLAorICAgICAgLTMxNCwgICAtMjI4LCAgIC0yOTQsICAgLTM0MiwgICAgLTI2LCAgIDExNDMsICAtMjM3MSwgICAtNDAwLAorICAgICAgICA3NCwgICAgMTAxLCAgICAtNjgsICAgLTU4MywgIC0xMDkxLCAgIDMzNjcsICAgMTE0NiwgICAtNjM4LAorICAgICAgLTQzNiwgICAgMTM2LCAgICAgNDEsICAgIC05MiwgICAxNTE4LCAgIDI4MTgsICAtMjIxNCwgIC0yMDQ0LAorICAgICAgIDYzNiwgICAgIC0yLCAgICAgNzksICAgLTUwOCwgICAgNjc2LCAgIC00MzksICAgLTM1OCwgICAtMTk4LAorICAgICAgIC02OSwgICAgMjcxLCAgICAgNTksICAgMTYzOCwgICAgNDY4LCAgICAgOTcsICAgIDI2NCwgICAgIC04LAorICAgICAtNTE1MiwgICAtMTUyLCAgICAxNTIsICAgIDI1MiwgICAgNDAxLCAgIC0zNzUsICAgIC0xNywgICAtMTMyLAorICAgICAgICA1MSwgICAgIDYzLCAgICA2MzMsICAgLTE4MCwgICAgMzY3LCAgICAxMTEsICAgIC0xOCwgICAgIDE1LAorICAgICAgIC01MiwgICAgMTI4LCAgICAtNTQsICAgICAxMSwgICAgIDk2LCAgIC0xMjIsICAgIC0yNiwgIC03MjU3LAorICAgICAgIC00MiwgIC0xMjIxLCAgIC02ODgsICAgIDE5NywgICAtMTA3LCAgIC0yMTcsICAgIDE0MSwgICAtMjg5LAorICAgICAgIDE0MSwgICAgMjY5LCAgICA0MzksICAgLTc0NywgIC0zNzQzLCAgIDIwOTgsICAgIDIyNiwgICAgMTM3LAorICAgICAgICAyNiwgIC0xNjQ1LCAgLTE3MzUsICAgIC04MCwgICAgIDQzLCAgIC0yMTYsICAgIDI0NSwgICAgNTQ0LAorICAgICAgIDE1NywgICAgIDQwLCAgICAyMzgsICAgIDIzNywgICAtOTg5LCAgICAzNzksICAgICA4OCwgICAgNjM5LAorICAgICAtMTMzNSwgICAxNTQyLCAgIDExNDcsICAgLTUxMCwgICAxMDA4LCAgIC0xMzQsICAgLTYyNiwgICAgNjk2LAorICAgICAtMzAzNCwgICAgMzM0LCAgIC02ODksICAgIDExNSwgICAtMTY4LCAgICAgMzksICAgMTc1MCwgICAtNjQ5LAorICAgICAgLTIzMywgICAgLTk5LCAgIC0yMzEsICAgIDUxNSwgICAgMTEyLCAgICAtMTEsICAgLTE2MiwgICAtMTMzLAorICAgICAgLTEzOCwgICAtNDg2LCAgLTQxMzcsICAgIDIwNCwgICAtMTAyLCAgICA4NjcsICAtMTAzMCwgICAgMjE5LAorICAgICAgLTI1NCwgIC0yNzg3LCAgIC0xMjgsICAgIDk2MSwgIC0yODM3LCAgIC00ODIsICAgLTE5NSwgICAgNjkxLAorICAgICAgLTE3MCwgICAtMTc4LCAgICAxNjQsICAgIC01NCwgIC0yMDA4LCAgIC0xMTYsICAgICA3NCwgICAgMzk4LAorICAgICAgIC05NiwgICAtNDcyLCAgICA0MDcsICAgICAyNywgICAgMjg3LCAgICA2MjgsICAgICA5NywgIC0xNDI1LAorICAgICAtMzkyMywgICAgICA2LCAgICAxMTcsICAtMTA4MSwgICAgOTMwLCAgICAzOTYsICAgIDQ1MiwgICAgIDg3LAorICAgICAgLTQ0MSwgICAtMTU1LCAgIC03MzgsICAgMTA4OSwgICAyMTI4LCAgLTMxMzMsICAgIC0yMSwgICAtNjIyLAorICAgICAgIC00OCwgICAtMTI3LCAgICA1MDYsICAgIDk4NSwgICAtMjAwLCAgIDMzNjEsICAgIDE4NCwgICAtNTIyLAorICAgICAgICA0MSwgICAgNTAzLCAgICAyMDksICAgICAxNCwgICAgLTk2LCAgICA3OTEsICAgMTI2MywgICAgMjg5LAorICAgICAgLTEwMSwgIC0xNzI4LCAgLTEwNzMsICAgLTUxNywgICA0MTU2LCAgIC02ODUsICAgIDIxNCwgICAtNzIxLAorICAgICAgLTYwOCwgICAtMTAyLCAgIC0yOTUsICAgLTExNCwgICAgMTI2LCAgIC0zNDAsICAgIDEwOSwgICAgIDg4LAorICAgICAtMTU4OCwgICAgIDgyLCAgIC01NDksICAgLTM3NiwgICAgIDc2LCAgICAgODQsICAgLTIxMCwgICAgIDU5LAorICAgICAgLTEzMCwgICAgMzIxLCAgICA2NzgsICAgNDcwNCwgICAgNTY0LCAgICAgLTEsICAgIDEwMCwgICAgMzI1LAorICAgICAgLTI5NiwgICAgMjU2LCAgIC05MzYsICAgLTg4NiwgIC0xMDg4LCAgIC0xOTEsICAgIDQ3NiwgIC0zNjg0LAorICAgICAgMTM1OSwgICAgIDEyLCAgIC0zOTcsICAgIC03MCwgICAgLTE3LCAgICAgNTgsICAgIDU2OSwgICAgMzUzLAorICAgICAgIDgyMSwgICAgLTc3LCAgICAyNTMsICAgIDE1MywgICA1Njk3LCAgIC0xNzEsICAgIDE4MSwgICAgICAzLAorICAgICAgIC05MCwgICAtNDEzLCAgIC0yNjUsICAgIDE0MiwgICAgIDYyLCAgICA5NTksICAgIDE1MSwgICAtMTAzLAorICAgICAgIDg0NSwgICAtMzQwLCAgIC0yODAsICAgLTczMywgICAtNTkyLCAgIC0yNDQsICAgMjUzNCwgICAzMDg5LAorICAgICAgIDkzNSwgICAtMzkzLCAgIC0xMDUsICAgIDE0NSwgICAtNjY2LCAgLTI4NjUsICAtMTUzMiwgICAgNzE3LAorICAgICAgMjg2NywgICAgMjA2LCAgIC04MDAsICAgLTEyNSwgICAgLTM0LCAgIC0xODksICAgLTEzOCwgICAgIDQyLAorICAgICAgIDE4OSwgICAtMTQxLCAgICAxMDcsICAtMzAzMCwgIC0zNzk1LCAgIC00OTQsICAgIDEwOCwgICAtMTQ5LAorICAgICAgIDM4MiwgICAgNzYwLCAgIC0xNDIsICAgIDMzNywgICAtODQ0LCAgICAyMjgsICAgIDEyNCwgICAgMjMyLAorICAgICAgIC0yMywgICAgIC0xLCAgIDIyOTgsICAgIDc1MCwgICAgNjM2LCAgIC0zNTMsICAgIDE1NywgICAgNjc2LAorICAgICAgLTE5MSwgICAgODEyLCAgIDM0MzQsICAgIDc1OSwgICAgNTQzLCAgICAtMTcsICAgLTIxMywgICAgLTk1LAorICAgICAgIDMxNiwgICAtNjkzLCAgIC02MDQsICAtMTA1OSwgICAgIDMyLCAgIC00OTYsICAtMzMzNCwgICAtMjcyLAorICAgICAgLTEwNCwgICAtNDk1LCAgIC0xMzAsICAgIDYyNywgICAtMzc2LCAgICAgNzQsICAgLTU5OSwgICAgIDU1LAorICAgICAtMjE4NSwgICAtOTY4LCAgICA1MTcsICAgLTM0MywgICAgIDIxLCAgIC0yNDksICAgLTk2MywgICAgMjY4LAorICAgICAgMzMzOSwgICAgMjM5LCAgICA3NzEsICAgLTEzNCwgICAgIDQyLCAgICAyMzEsICAgICA3NSwgICAxNjMzLAorICAgICAgIDMzMSwgICAtMTI1LCAgIC00MTQsICAgIDQ1NywgICAtMzE2LCAgICAxMTEsICAgLTQ3NSwgICAgMzYzLAorICAgICAgLTY4NywgIC00MTA1LCAgICA0NjksICAgIDQ0MywgICAgMTEzLCAgICAgNzIsICAgMTQ5OCwgICAgNDA2LAorICAgICAgIDkxNSwgICAtMjI5LCAgICA1NjQsICAgLTM3NywgICAgIDg5LCAgICAxMzcsICAgICAzOSwgICAgICAyLAorICAgICAgIC0yOSwgICAtNDE2LCAgIC0xNDksICAgMzU5OCwgICAtMjUzLCAgICAgMTIsICAtMTAxNSwgICAzMDE2LAorICAgICAgIDkxNiwgICAtNzI2LCAgLTIyODYsICAgIC05OSwgIC0xMDg1LCAgIC0yMzgsICAgIDY5MCwgICAgLTQ0LAorICAgICAgIC01MSwgICAtMTE1LCAgICAgMjUsICAgICA1NiwgICAtOTA1LCAgLTMwNTAsICAtMTEyMSwgICAgLTI0LAorICAgICAtMjE2MCwgIC0xNDI0LCAgIDEwMDksICAgLTE4MCwgICAtNDI0LCAgICAxODgsICAgLTQxNywgICAgLTY2LAorICAgICAgIC04NiwgICAgIDc0LCAgICAtMjgsICAgLTIyNSwgICAtOTM3LCAgICAtOTAsICAgIDI1MSwgIC0xODUwLAorICAgICAgMTkzOSwgICAxODQzLCAgICA4MzMsICAtMTg3OSwgICAtMTkyLCAgIC0zMTgsICAgIDEwMywgICAtMzYzLAorICAgICAgIC0yMiwgICAgLTU3LCAgLTI4MzMsICAgLTExOCwgICAtMjc3LCAgICAtOTgsICAgIC04NSwgICAtNDk1LAorICAgICAgLTg3NCwgICAzMDI3LCAgIC0xNDEsICAtMTQ5MCwgICAtMTcyLCAgIC0yNjYsICAgIC0zMiwgICAgMTkwLAorICAgICAgIC0xMiwgICAtMzY0LCAgIC0zODAsICAtMjEwNywgICAgMjQ5LCAgIC0yMTcsICAgIDY2MiwgICAtNTg0LAorICAgICAgICA4OSwgICAtNTYzLCAgIDExNTMsICAtMzA5MSwgICAtNjU2LCAgICA0NjMsICAgIDE0NCwgICAgLTI2LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY2I0NDQ4c3MxW10gPSB7CisgICAgICA2NDc1LCAgICAtNjAsICAgIDE2MiwgICAgIDQyLCAgICAtNzEsICAgICA1MCwgICAgLTg1LCAgIC0yNzgsCisgICAgICAgLTE0LCAgICAtNjAsICAgIC01MywgICAgMTMyLCAgICAgMjgsICAgIC02NSwgICAgLTcxLCAgICAtNjIsCisgICAgICAgICA2LCAgICAxMTksICAgIDE5NSwgICAtMTQwLCAgICAgMjgsICAgICAzNywgICAtNjAzLCAgLTQ5NTYsCisgICAgICAtMjkwLCAgICA3MDAsICAgLTI0MSwgICAgIDExLCAgIC0zMDEsICAgIDI5NywgIC0xMDA5LCAgICA0NjgsCisgICAgICAgODg1LCAgICAxOTIsICAgICA0MCwgICAgNDk1LCAgICA4NDYsICAgIC0yOCwgICAgMjAxLCAgIC0yNTUsCisgICAgICAgOTI3LCAgIC02NDQsICAgMjQyNCwgICAyODgyLCAgICAtODIsICAtMTc2NCwgICAxMDc3LCAgICAzMTUsCisgICAgICAgOTQ2LCAgICA4NDMsICAgIDM5OSwgICAgMTc2LCAgICA1NjcsICAgIDU0NiwgICAgMzc3LCAgICAyODMsCisgICAgICAyNDY5LCAgLTE4MTUsICAgIC02NSwgICAgIDEyLCAgICA0MjIsICAgLTM2OCwgICAtNjM5LCAgIC00OTMsCisgICAgIC01NjA2LCAgICAgODQsICAgIDEyMiwgICAgMjQxLCAgICAyNjcsICAgICAtOCwgICAtMjU3LCAgICAtMjMsCisgICAgICAtMjIwLCAgIC0xMTgsICAgIDEzOSwgIC0xNTgyLCAgIC0yMTgsICAtMjQzNiwgICAyNTM5LCAgIC0yNzAsCisgICAgICAgMTQ2LCAgIC0yNjIsICAgLTQ4OSwgICAxNTUxLCAgICA2MDQsICAgLTIyNSwgICAgMzYzLCAgICAyMzQsCisgICAgICAtMTEwLCAgIC0xNjYsICAgMTA1OCwgICAyMzQyLCAgIDE5NTAsICAgICA0MywgICAyMzYyLCAgLTExODksCisgICAgICAgNDkyLCAgICAxNzIsICAgLTI5NiwgICAgMTU5LCAgIC00MzAsICAgLTMxMSwgICAtMTM1LCAgIC0xODIsCisgICAgICAgIDc3LCAgIC00NDQsICAtMTk5NSwgICAtODU1LCAgIDIwODAsICAgLTQ1NywgICAgMzg5LCAgICA4NzIsCisgICAgICAyNTQ5LCAgICA5MzUsICAgLTEyOCwgICAgNTE5LCAgIC0zNzQsICAgIDMxMCwgICAgIDk2LCAgICAxMTksCisgICAgICAtMjYzLCAgIDE5ODEsICAtMTAxOSwgICAtNjI4LCAgICAyMTIsICAgLTE3MywgIC0yMjkyLCAgIDEwNjYsCisgICAgIC0xOTg1LCAgIC00MjYsICAgIDExNSwgICAtNzQ2LCAgICAxNDcsICAgICAgMywgICAgIDk0LCAgICAxOTUsCisgICAgIC0xNzYyLCAgIDE3MTMsICAgLTMzNywgICAxODg0LCAgIC0xMjMsICAgLTQ4MCwgICAgIDk1LCAgICA3NzcsCisgICAgICAxMDczLCAgIDIxMTcsICAgLTk2OSwgICAgIDE2LCAgICAgMTEsICAgIDEyMywgICAgMzc0LCAgIC0zOTQsCisgICAgIC0xNDE5LCAgICA4MjksICAgMTY1NywgICAxMjk0LCAgLTI3NzAsICAgIDI4NiwgICAgODEzLCAgIC0yOTAsCisgICAgICAtMTE1LCAgICAxMTEsICAgIDMxMiwgICAgIDUzLCAgICAgNDQsICAgIDg5NiwgICAgIDM0LCAgLTIyODgsCisgICAgIC0zNDQzLCAgLTIwNTMsICAgICA5OCwgICAgMjkzLCAgICA0MjksICAgLTE2OCwgICAgIDc0LCAgICAtNTgsCisgICAgICAgMjIxLCAgIC0zODMsICAgIDEwMCwgICAgIDYzLCAgIDE5MjUsICAtMTIwNywgICAgMTk5LCAgICAgOTQsCisgICAgICAgLTk0LCAgIDMwNjAsICAgMTgyNSwgICAgNjExLCAgICAyOTIsICAgLTE0MSwgICAgMzgyLCAgICAxNDEsCisgICAgICAgMTA1LCAgIC0xNTEsICAgICAgMCwgICAxNDQ4LCAgIC0yNjcsICAgIDIwNiwgICAgOTMyLCAgIC02ODIsCisgICAgICAgMjUxLCAgIC0xODMsICAgMTA4MCwgICAgMTYxLCAgIDQzMzQsICAgLTM5NywgICAgNTI1LCAgICAtOTEsCisgICAgICAgMTI3LCAgIC0xMDQsICAgIDkyMSwgIC0yMjgyLCAgIC0yNzQsICAtMTA3MCwgICAgMzg3LCAgIC0zMTIsCisgICAgICAxMzgwLCAgIDI3NjksICAgLTU1NCwgICAxNTAxLCAgIC05MjEsICAgIDEwMiwgICAtMTgzLCAgIC0xMDQsCisgICAgICAgLTY2LCAgLTE2NTYsICAgMjA0OSwgICAgMTIyLCAgLTIyNzEsICAgICA4NCwgICAtMjc2LCAgIC0yMDQsCisgICAgICAgMzUzLCAgICAzODAsICAgLTQxNCwgIC0xNzU3LCAgLTEwMzUsICAgLTMxOCwgICAtMTMwLCAgICAtMTAsCisgICAgICAgMTYzLCAgIC00NzEsICAgMjQyNSwgICAyODY0LCAgLTE4OTIsICAgIDI5NCwgICAgODE3LCAgICA3NTQsCisgICAgICAgMjc3LCAgICAtMjksICAgLTIxNCwgICAgLTM5LCAgIC0zMTIsICAgIC01NywgICAgLTU0LCAgICA5ODYsCisgICAgICAyMjg2LCAgIC01NzQsICAgICAzNCwgICAtNjQxLCAgIDM3ODMsICAgIDIxNCwgICAtMzk5LCAgIC0xNTUsCisgICAgICAgIDM4LCAgIC0xNDgsICAgIC00MiwgICAgLTg5LCAgICAgOTcsICAgIC0xNywgIC0yMTkyLCAgICA3MjksCisgICAgICAgMjcyLCAgIDExNjgsICAtMzU5MywgICAgMTUwLCAgICAgOTYsICAgLTQ3MywgICAgMjExLCAgICAtNjAsCisgICAgICAgMTM2LCAgICAtMjYsICAgIDE0MiwgICAtMjg1LCAgICAgOTMsICAgIDY2NiwgICAtNDY1LCAgIC0xODEsCisgICAgICAyMDE2LCAgIC0zMzgsICAtMjE4NiwgIC0yNjA4LCAgIC00NDksICAgIDEwNywgICAgLTE4LCAgICAgNDUsCisgICAgICAgIDI0LCAgICAyNDUsICAgLTExOSwgICAgMjQ0LCAgICA0NDIsICAgMTUwOSwgICAgMTU4LCAgICAyNDIsCisgICAgICAgMTY5LCAgICAtMTYsICAgLTIyMSwgICAgMTA0LCAgICAxMTUsICAgICAxNiwgICAtMjE3LCAgICAgMjMsCisgICAgICAgLTI1LCAgICAxMzAsICAgNDA3NiwgICAgNjYyLCAgIC0zMTUsICAgMzA2OCwgICAgLTM1LCAgICAgMzYsCisgICAgICAyNzg1LCAgIC0yMjMsICAgLTUyOCwgICAtMTU3LCAgICAgNDMsICAgIDE4NiwgICAtNTE0LCAgIC0yNDAsCisgICAgICAgIDE1LCAgIC0yNDUsICAgIDUyMCwgICAtMTEwLCAgIC03ODEsICAgLTY0MSwgICAgMjk0LCAgICAtMjAsCisgICAgICAgIDY0LCAgICAtNDQsICAgIDQwMCwgICAtMTA5LCAgIDQ3NTYsICAgMTMzNCwgICAtNDIxLCAgIC0xOTUsCisgICAgICAgMTMwLCAgLTIxODIsICAgICA2NCwgICAtODk3LCAgLTE0MjMsICAgMzA4MSwgICAtNTIzLCAgICAzNzgsCisgICAgICAtMTY0LCAgICA5NjgsICAgIDU5MywgICAtMTkyLCAgICAgNzEsICAgIDExNCwgICAtMTQzLCAgICAtMTAsCisgICAgICAxOTYxLCAgLTMxNDEsICAgMzE3MywgICAgLTM5LCAgIC0xMTAsICAgIC01NywgICAgMTQ0LCAgICAtNjgsCisgICAgICAtNDI5LCAgICAgMzAsICAgIC0xMCwgICAgNDY3LCAgICAxNTksICAgICA0MCwgICAgIDY3LCAgICAyNjAsCisgICAgICAgODE0LCAgIC0xNjgsICAgLTgzNiwgICAxMDczLCAgLTM1NjIsICAgMTc4NiwgIC0xMjA1LCAgIC0xNDgsCisgICAgICAtMTA1LCAgICAgOTQsICAgICAgNSwgICAgMTQzLCAgICAxMzgsICAgICAxOCwgIC0xMzg0LCAgICAgMjAsCisgICAgICAgNjM1LCAgIC0xMjYsICAgIC03MSwgICAgLTg3LCAgIC0zMjAsICAgLTQwNywgICAgNTU5LCAgIC0xNTEsCisgICAgICAxMzEyLCAgLTQzOTUsICAgLTc1NSwgICAtMjYzLCAgICAtNzcsICAgMTY1NywgICAgNjk5LCAgICA0MjYsCisgICAgICAgNDY5LCAgIC00NjksICAgIDI1MywgICAgLTgwLCAgICAzMTcsICAgIC03MSwgICAgMjY4LCAgIDM1OTIsCisgICAgIC0yMDUxLCAgICAzMDQsICAgIDE1NywgICAgIDQzLCAgIDE4NzIsICAgMzc5NCwgIC0xNTM3LCAgIDEyMjYsCisgICAgICAtMTU5LCAgIC0zMzUsICAgIDM0MCwgICAtMzg1LCAgIC0yNTMsICAgLTE5NSwgICAgIDIxLCAgICAxMDYsCisgICAgICAgLTMxLCAgIC0xODcsICAgIC02MywgIC0yNzcxLCAgICA0NDYsICAgLTcwOCwgICAgMjAyLCAgIC0xODYsCisgICAgICAgNTQ4LCAgICA4MzIsICAgMTc1NywgIC0xMjc0LCAgIDEyMzQsICAgLTc1NiwgICAtMTYwLCAgICAgNzYsCisgICAgICAgLTgyLCAgICAgNjQsICAgMjE2OSwgICAgIDEzLCAgIC04NDksICAgIDI0NCwgIC0yNDg2LCAgLTIxMzgsCisgICAgICAgODQ0LCAgIC0xNzgsICAgIDI3MCwgICAgMjk3LCAgICAxNTAsICAgIDIwMiwgICAgLTQxLCAgIC0xODgsCisgICAgICAgMTIxLCAgLTEyNzIsICAgIDM3MSwgICAtMzE5LCAgIDI4NDgsICAgLTQ2OSwgIC0yMDU5LCAgIDEyOTAsCisgICAgICAtNDU3LCAgIC0zODAsICAgIDY5MCwgICAgMTQ4LCAgICAtNTEsICAgLTM0MCwgICAgMTEzLCAgICAgNTcsCisgICAgIC0xMjU5LCAgIC0zOTYsICAtMTQwNCwgICAgMzM2LCAgIC01MTEsICAgIDU3NiwgICA0NDQxLCAgICAxMjQsCisgICAgICAgMTQzLCAgIC00ODMsICAgICA4NSwgICAgMTM4LCAgICAxOTYsICAgICAzOCwgICAtMTg4LCAgIDExNzcsCisgICAgICAtNzY0LCAgLTIwNjcsICAgIDgyMCwgICAtMjY0LCAgICAyMTgsICAgLTMwMCwgICAtNTAxLCAgIC0yMzAsCisgICAgIC0yNTI5LCAgIDEzNDksICAtMTYwNiwgICAtMTk5LCAgICAgOTIsICAgIC01NSwgIC0xMzI0LCAgIC03MDIsCisgICAgICAyMDc4LCAgLTEyNjksICAgIDQxNCwgICAgLTUwLCAgICAgMjksICAgICAxMiwgICAgIDg3LCAgIC01OTMsCisgICAgICAgMjE3LCAgICAtODIsICAgICA5NCwgIC0yMzkyLCAgICAzMDgsICAgMjMxNSwgICAyMTg4LCAgICA3NjgsCisgICAgIC0xMTAzLCAgICAtNzcsICAgIDU3OSwgICAxNzA2LCAgIC04MjYsICAgLTIyNCwgICAtMjk3LCAgICAxNDUsCisgICAgICAtNjQwLCAgICA1NzAsICAgIDE0NiwgICAtMTk5LCAgIDExODcsICAgLTg3MiwgICAgMzI3LCAgIC0zMTAsCisgICAgICAtMTIyLCAgICAtMjMsICAgIC0xMywgICAgODA4LCAgIC0xMzksICAtNDQyNSwgICAtNjcwLCAgICA0MTIsCisgICAgICAgIC00LCAgICAtNzAsICAgLTE2MiwgIC0xMDU2LCAgICA2ODUsICAgLTMxMiwgICAtOTU3LCAgICAzMzksCisgICAgICAgODkzLCAgIC0yNTIsICAgNDA0MCwgICAtMTA1LCAgICAgNzYsICAgIDk5MywgICAgMjgxLCAgICAtNzksCisgICAgICAtMTM5LCAgICAxNjgsICAgLTI5OCwgICAgNzk1LCAgLTExMDcsICAgIDM5NSwgICAgMzg2LCAgIC01MjQsCisgICAgICAxMDUyLCAgLTIzNDEsICAgMjUzNywgICAgNDc0LCAgICA3MjYsICAtMTAyOCwgICAtMzU3LCAgICAtNTIsCisgICAgICAgMTE1LCAgICAgLTksICAgMTM0OSwgIC0yMjQwLCAgICA3ODUsICAgMjc1MSwgICAgIDc3LCAgICA5MjIsCisgICAgICAgMzg1LCAgIC01MzksICAgLTE0OCwgICAgNDEwLCAgICAyNTEsICAgIC03MCwgICAgMTk5LCAgICAgNTEsCisgICAgICAxNzI4LCAgIC0yMDYsICAgMTE4MSwgICAxMTgyLCAgIDEzODgsICAgLTc5MSwgICAgMTIxLCAgICAgLTMsCisgICAgICAgICA4LCAgIC0xNDcsICAgIC05NSwgICAgMTAxLCAgICA4ODYsICAtMjQxMiwgICAgIDE5LCAgIDI0MDEsCisgICAgICAtMTE2LCAgICA3MTgsICAgLTU5MiwgICAtMjIxLCAgICA3MjQsICAgIC0zMywgICAgNjkwLCAgIC0xODAsCisgICAgICAgODY4LCAgLTMzMzAsICAgIDM3NywgICAtMzM2LCAgICAxMjgsICAgIDI2NywgIC0yMDc1LCAgIDI4NDgsCisgICAgICAyOTk0LCAgIC0zMDAsICAgICAgMywgICAtMTUzLCAgICAgNDEsICAgLTQ1NiwgICAgIDM4LCAgICAtMzEsCisgICAgICAgMzA5LCAgIC0xMDYsICAgIC05MiwgICAgLTE0LCAgICAgOTYsICAgIDY3MiwgICAgNjM0LCAgICAyMDcsCisgICAgICAxNTU2LCAgICA0MzgsICAtMjE0NywgICAgMjgyLCAgIDI0NDMsICAtMTY2MiwgICAgNTExLCAgICA0NTcsCisgICAgICAtMjU5LCAgIC01MDUsICAgIDE3MywgICAtMjA0LCAgIC04NTgsICAgLTExNywgICAyNzUxLCAgICA4NTIsCisgICAgICAgMjIwLCAgIC01MTIsICAtMjU3NiwgICAxNTQyLCAgICAzNTcsICAgIC03NywgICAgIC00LCAgICAxNjUsCisgICAgICAgLTYzLCAgICAxODksICAgIDMwMiwgICAtNjk5LCAgIC03NjQsICAtMTU1OSwgICAgIDI1LCAgIC0yMzMsCisgICAgICAgNDA1LCAgICAxNzMsICAgIDY5OCwgICAgLTczLCAgIC0zMDAsICAtMTQ0MiwgIC0yOTIzLCAgLTEzMjYsCisgICAgICAgLTI1LCAgICAgOTgsICAgLTE5NiwgIC0yOTE1LCAgLTExNjksICAtMzM5MiwgICAgNjkxLCAgICAzNTMsCisgICAgICAtMTk2LCAgICAgOTYsICAgICA0MSwgICAgMTgwLCAgICAxOTgsICAgIDI4MCwgICAgMjA3LCAgIC0xNTgsCisgICAgICAgLTE5LCAgIDE1NTYsICAgIDk5MSwgICAtNTIzLCAgIC0yODAsICAtMTU5OSwgICAxMzY4LCAgLTMyNDcsCisgICAgICAtOTk2LCAgICAxNTksICAgLTEzNiwgICAtNDY5LCAgICAtNDgsICAgICAgMCwgICAgIDMwLCAgICAgOTUsCisgICAgICAtNzY1LCAgICAgMzMsICAgNjU4MCwgICAtMTgwLCAgICAzMTYsICAgLTE3NiwgICAgMTA1LCAgICAtMjEsCisgICAgICAgIC05LCAgICAxNjYsICAgIDE0OCwgICAgLTUyLCAgICAtNDksICAgICA0MiwgICAgICAyLCAgICAzMTgsCisgICAgICAgLTU1LCAgICAtOTEsICAtMTQ2MSwgIC0xNDc0LCAgLTMwODYsICAgLTc1NiwgICAxNDc5LCAgICAtMjksCisgICAgICAtNjY4LCAgIC0yNTUsICAgIC01MSwgICAgMjQxLCAgICAyNDksICAgLTIxMiwgICAgMTMyLCAgIC0xMjksCisgICAgICAtNDEwLCAgICAxMTMsICAgICAxNywgICAgMzAxLCAgICAxODUsICAgICA5NiwgICAgIDEwLCAgICAxODgsCisgICAgICAgIDM4LCAgIC03NzIsICAgNTE1MiwgICAgLTEzLCAgICAtMTAsICAgMTUyNywgICAgODA2LCAgICAtMjMsCisgICAgICAgLTc5LCAgIDExMDIsICAgIC03NywgICAgMzI5LCAgICAtOTksICAgLTQwNCwgICAyMjc2LCAgIC04NzMsCisgICAgIC0yNjgxLCAgIC03NjUsICAgICA3MSwgICAgIDIwLCAgLTI0NDgsICAgLTgwMywgICAxODI3LCAgIDExMTUsCisgICAgICAtMTYwLCAgICAtMTUsICAgIDI4OCwgICAgLTQ2LCAgICA1NzMsICAgIDEwMCwgICAtNzI2LCAgIC02OTQsCisgICAgICAtNDA2LCAgICAyODgsICAgICA2MSwgIC0yMjE2LCAgIC05MDQsICAgICA3NywgIC0yOTgzLCAgIC05NjIsCisgICAgIC0xNDM4LCAgICA4MDksICAgIC0zOCwgICAgLTc5LCAgICAgOTUsICAgICA1MiwgICAtMjMxLCAgICA1MTgsCisgICAgICAgMTE1LCAgICAgNDEsICAgIDkwOCwgICAgNzgwLCAgICA4MDUsICAgLTIwNywgIC0yMTYxLCAgICA1NTQsCisgICAgICAgOTY4LCAgIDMxMTEsICAgIDEzMywgICAtMTU4LCAgICAtMTMsICAgIC0zNCwgICAtMTgyLCAgICAtNjAsCisgICAgICAgMTA1LCAgICA3MTgsICAtMTI0NSwgICAgMjI3LCAgIC04MTgsICAgMTE4NCwgICAgOTAzLCAgICA2MDMsCisgICAgICAtOTg4LCAgLTI2NDcsICAgMTg0NywgICAgMTQxLCAgICA4MTcsICAgLTMzNywgICAgMTMxLCAgICAzOTMsCisgICAgICAxNjUzLCAgICA4MzksICAgLTI2MSwgICAgNDY2LCAgICA0NjUsICAgLTI5NywgICAxNDQwLCAgIC00MzEsCisgICAgICAyMDU4LCAgLTE4NTcsICAtMTQxNiwgICAgMzEwLCAgIC03MjIsICAgIC01NCwgICAgMjAzLCAgIC0yNjYsCisgICAgICAzNzcwLCAgICAxNzIsICAgLTU5MywgICAgLTczLCAgIC01MDgsICAgIC02MSwgICAxMTEwLCAgIDEyNjEsCisgICAgICAgMjc1LCAgIDE2ODEsICAgIDQ0NywgICAtMTQ3LCAgICAtOTUsICAgICAzMywgICAxMjgxLCAgLTMxMTksCisgICAgICAgIDI0LCAgIC0zMDgsICAgIDM2NiwgICAtNDY4LCAgICAyMzIsICAgIDM1OCwgICAgNjY3LCAgIC05NDIsCisgICAgICAgNjk2LCAgIC05MjQsICAtMjA1OSwgICAgLTYyLCAgICAxNTEsICAtMjEwMiwgICAgMzMyLCAgICAyNTgsCisgICAgICAtMTg2LCAgIC02MzYsICAgIDY4NSwgICAgMjE0LCAgLTMxNzQsICAtMTI0MywgICAgNTczLCAgIC0yNzYsCisgICAgICAgICA5LCAgIC0yNjIsICAgIC0yMCwgICAgMTU4LCAgIC0xNzQsICAgIC0yMSwgICAgNTkzLCAgLTYxOTgsCisgICAgICAtMjY2LCAgIC0yNzAsICAgIC02MywgICAtMjAzLCAgICAgNjMsICAgLTM5NiwgICAtMTAwLCAgICAxOTEsCisgICAgICAgMjEyLCAgICAgODUsICAgIDEyMCwgICAtNzkxLCAgICAgMzcsICAgIC00NywgICAyMTA4LCAgICA2NTIsCisgICAgICAgNTE5LCAgICAzNDYsICAgIDEwNiwgIC0xODQwLCAgLTI1NjYsICAgLTU2MywgICAgIDE0LCAgICAyNjYsCisgICAgICAgIDEwLCAgICAyMTQsICAgIDUwNCwgIC0xMjY5LCAgICAgNTAsICAgIDE2NCwgICAgMTIwLCAgIC0xMDUsCisgICAgICAtNTQ2LCAgIC0yMTIsICAgIC03OSwgICAgIDQxLCAgIC0xNzEsICAgIDY3NSwgICAtMjUyLCAgIDQzNzMsCisgICAgICAgLTE2LCAgLTE2OTcsICAtMTQ5MSwgIC0zNTg4LCAgIC01ODcsICAgIDYyMywgICAgIDY3LCAgICAyNjksCisgICAgICAgNDg0LCAgICAtMjUsICAgMTA2NywgICAgNTgwLCAgIC01OTgsICAgIDE5NSwgICAgIDQ3LCAgICAtMTcsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjYjQ0NDhzbTBbXSA9IHsKKyAgICAgLTUxMTQsICAgIDE2NiwgICAtNzg1LCAgICA2MzUsICAgLTUyOCwgICAtMTAyLCAgICAyNjksICAgIDQ5MiwKKyAgICAgIC0xODUsICAgLTYxNCwgICAgMTIyLCAgIC0xMjQsICAgICA4NSwgICAgMTQ1LCAgICAyNzAsICAgLTE1NCwKKyAgICAgICAgMzksICAgMjUyNCwgICAgIDU4LCAgICAtNTcsICAgIDExOSwgICAgICA1LCAgICAzNDMsICAgMjg3MywKKyAgICAgIC0yNzgsICAgLTc4NywgICAgMTM3LCAgICAgNjIsICAgLTE2OSwgICAyMDQ5LCAgIDE0NzYsICAgLTMyNSwKKyAgICAgICAxMzAsICAgLTcwMiwgICAyODgyLCAgICAtMTksICAgIDMxMCwgICAtMjU4LCAgIC0xMzUsICAgICA4OCwKKyAgICAgIC0yNjgsICAgICA2OSwgICAgIDY5LCAgICA2OTUsICAtMTkzNSwgICAgODE1LCAgICA2NzgsICAgICA0NCwKKyAgICAgIDMwODUsICAgIDI3OCwgICAtNTg3LCAgLTEzMjYsICAgIDM2MCwgICAgMTQ1LCAgICAtMTcsICAgICA2NiwKKyAgICAgLTI0NzUsICAgLTU5NCwgICAgMTMyLCAgICAzNTgsICAgIDQwNiwgICAtMzY5LCAgIC0yMzcsICAgMzM2MywKKyAgICAgICAzMjksICAgLTQyNCwgICAgIDUyLCAgICAgNDksICAgIDI5MSwgICAtMjM2LCAgLTIzMzIsICAgLTI2MSwKKyAgICAgICAgNDksICAgIC0yNywgICAgMTcwLCAgIDM2NTYsICAgLTIxNCwgICAtNjAzLCAgICAyNjQsICAgICA2MCwKKyAgICAgICAtODcsICAgIDE0NSwgICAgMTE2LCAgICAxNzksICAgIDE5MCwgICAgNjc5LCAgICAzMzksICAgLTM0MCwKKyAgICAgIDMyNzIsICAgIDY0MSwgIC0yNjMxLCAgICA0ODQsICAgIDE1OSwgICAgMzA1LCAgICAyOTAsICAgIDIwOCwKKyAgICAgICAyMjYsICAgICA2OCwgICAgMTAyLCAgIC0xNDUsICAgLTM1NiwgICAgMTUzLCAgICA2NDcsICAtMjA0NiwKKyAgICAgICA5MzcsICAtMTY2NiwgICAxMDkzLCAgICAtMjksICAtMTE2MSwgICAgNzQ5LCAgLTIzNjAsICAgIDE3MSwKKyAgICAgLTIxODUsICAgIDg0MSwgIC0xNDA2LCAgLTEwNTcsICAtMTc2NCwgICAtMzAwLCAgIC0yMDUsICAgIDQ1MiwKKyAgICAgIDIxNjgsICAgLTIxNCwgICAtMTUzLCAgICAyOTEsICAgLTEwNiwgICAgIDc5LCAgIDE3MTcsICAgIC0yMCwKKyAgICAgLTE3NzEsICAgIDI4NiwgICAtNDY2LCAgICA2ODYsICAgIDE2NywgICAgMTM3LCAgICAgIDUsICAgICA0MywKKyAgICAgIDEwNzUsICAtMjYwMSwgICAgMjYxLCAgICAtODYsICAgLTMzMywgICAtNzI0LCAgICAxNjIsICAgIDE4NiwKKyAgICAgICAgIDQsICAgLTMzNCwgICAtNDEyLCAgIC0zMDksICAgIDg4OCwgICAtMTE0LCAgICA1MzEsICAgIDI5NywKKyAgICAgIDQyODQsICAgIDI5NywgIC0xNjk1LCAgIC0yMTIsICAgICA3NSwgICAtMjYzLCAgLTIzMTMsICAgIDEwMiwKKyAgICAgIC00MzQsICAgIDM1MiwgIC0xODEzLCAgIC00NzIsICAgIDExNCwgICAtMTg1LCAgICAgIDYsICAgICA2NiwKKyAgICAgIDgwNjEsICAgIDQxNCwgICAtNTc3LCAgICA2NzIsICAgLTE1MiwgICAgMTUyLCAgICAgIDEsICAgICAzOCwKKyAgICAgICAtNjYsICAgICA0OCwgICAgLTM1LCAgICAgNjIsICAgIC05OCwgICAgLTE5LCAgLTM3NjIsICAgICA5OCwKKyAgICAgICAyNDIsICAgIDExNCwgICAgMzU5LCAgIC0xNjIsICAgIDExNSwgIC0zMDM4LCAgICAzNDAsICAgIDI1MywKKyAgICAgIC01MjYsICAgLTE0NCwgICAgIDE0LCAgIC0xNDcsICAgICAyOCwgICAtMzUyLCAgLTU4NTgsICAgICA0NiwKKyAgICAgIC01OTcsICAgLTM5MiwgICAgMjI2LCAgICAtNTQsICAgIC03MCwgICAgLTQ3LCAgICAtNDUsICAgICAxNiwKKyAgICAgICAgNTMsICAgIDEzNywgICAgMTcyLCAgLTMwMTcsICAgIC0yMiwgICAtMTYzLCAgIC0yNjcsICAtMzI4OSwKKyAgICAgICAtMzEsICAgLTE3NCwgICAgMTEwLCAgICA3OTQsICAgIDQyNSwgICAgIDY3LCAgICAgNTgsICAgIC03MiwKKyAgICAgIC0xNTYsICAgMzkzNywgICAtNTg1LCAgIDIxMTYsICAgICA5OSwgIC0xMTE1LCAgIC0yNTcsICAgIDgwMSwKKyAgICAgICAyNzAsICAgLTMyOSwgICAtMjU3LCAgICAtMTgsICAgIDEyMiwgICAtMzY5LCAgLTIxOTYsICAgMTc0NiwKKyAgICAgIC0zMDUsICAgIDU5OSwgICAgODAwLCAgICA3NDksICAgMTQ2NiwgICAtMjk5LCAgLTE1MTksICAgLTI1NSwKKyAgICAgIC0yMzMsICAgIDIxNywgICAtMTE3LCAgIC0yNTYsICAgIDMwMSwgICAtMjQ5LCAgIC0zMjcsICAgNTUzMCwKKyAgICAgICAgODYsICAgIDEzNSwgICAtNzg0LCAgIC0xMzcsICAgIDYxMCwgICAgIC03LCAgICAgNTUsICAgICA5MywKKyAgICAgIC0xMDYsICAgIC01MCwgICAgMjY3LCAgIC0yMjksICAgIC0yNiwgIC0xMDcwLCAgICAgMTMsICAgIC03NSwKKyAgICAgIDE3MzMsICAgMjkyOSwgICAtMTMwLCAgIC03MTMsICAgICAxNSwgIC0yMTQ0LCAgICAxMDQsICAgLTMxOCwKKyAgICAgICAyODIsICAgICAtOCwgICAtMjg1LCAgIC00NjgsICAgLTEyNCwgICAgIDU5LCAgICA1MjAsICAgIC03OCwKKyAgICAgIC0zMzIsICAgLTY1NCwgIC01MDQ4LCAgICAyMTIsICAgLTM4OCwgICAgIDk3LCAgLTE1MjMsICAgIDIyNywKKyAgICAgLTI1NDUsICAgMjE1OSwgICAtMTI3LCAgIDEwMjAsICAgICA3OSwgICAtNjY0LCAgICA0MDMsICAgIC0zMSwKKyAgICAgIC0zNTYsICAgICAtMSwgICAtNDM2LCAgICAtODYsICAgICA3NSwgICAgNjEwLCAgIDMwNDgsICAgIDIzNSwKKyAgICAgLTMxMzMsICAtMTE4OSwgICAgLTQ0LCAgICAtMjMsICAgLTMyNCwgICAgMjYwLCAgICA0NjksICAgLTExMywKKyAgICAgICAgMjIsICAgICA1MywgICAgNTI1LCAgICA0MjcsICAgIDQ2OSwgICAxMDE2LCAgICA0MjAsICAgIDQ5MywKKyAgICAgLTEyMjksICAgLTIzOCwgIC0yNjcxLCAgICAzNjEsICAtMjc0NSwgICAgMTkzLCAgIC0yNTMsICAgIC01OSwKKyAgICAgICAgMTUsICAgICA1MywgICAgLTU3LCAgICAgMzYsICAgLTE0NCwgICAgMTI3LCAgICAgMjUsICAgICAxMSwKKyAgICAgICAtMzQsICAgNjU2MCwgICAgLTEyLCAgICAtODAsICAgIC03MiwgICAgIDcwLCAgICA2NTQsICAtMTEzNSwKKyAgICAgICAxNTgsICAgIDI3OSwgICAgMjk4LCAgICA3NDYsICAgLTE5MCwgIC0xMzgyLCAgICAxMzgsICAgIDUyNywKKyAgICAgLTE1MDQsICAtMjc1MywgICAtMTA2LCAgICAtNTUsICAgIDIyNSwgICAgIDU0LCAgICAxMzYsICAgICA1MywKKyAgICAgICA1MDYsICAgIDE3NCwgICAgMjY4LCAgIC01MzMsICAgIC00MywgICAtNDE2LCAgIC0xOTYsICAgNjI2NiwKKyAgICAgICAtODEsICAgICAyMiwgICAtMTU4LCAgICAzNTAsICAgMTE3NywgICAtNzI4LCAgICA1OTQsICAgICAzNCwKKyAgICAgIC0zNjgsICAgLTIyNiwgICAtNTg0LCAgICAyNDcsICAgIDgwNCwgIC0xMTQxLCAgICAgNzgsICAgMzkyMywKKyAgICAgICAtNTMsICAgIDMwOSwgICAgIDU4LCAgICAtNDUsICAtNzYzNCwgICAgLTczLCAgICAgMzksICAgLTE1MiwKKyAgICAgICAgNTUsICAgIC03NywgICAgLTQ1LCAgICAtNjIsICAgIC0yNSwgICAtMjQ3LCAgIC0xNjEsICAgICAyOCwKKyAgICAgLTI2MjksICAgLTQwMSwgICAtMjk1LCAgIC02ODcsICAgIDI5OCwgIC0zMjQwLCAgICAgIDAsICAgLTI1MSwKKyAgICAgICAgIDcsICAgIC00OSwgICAgNDk0LCAgIC0xOTgsICAgIDIwMiwgICAyMjAxLCAgIC0zMDEsICAgICA4MywKKyAgICAgICAgNDUsICAgLTk2NCwgICAgMjU2LCAgLTE0OTksICAtMjM5NCwgICAgIDI0LCAgIC0yNjcsICAgLTU5OSwKKyAgICAgICAgNDYsICAgIDE2MSwgICAtMzcwLCAgICAgODEsICAgIDYzNiwgICAzMTQ2LCAgLTIwNzcsICAgLTk2NCwKKyAgICAgICAzMjIsICAgIDQwMCwgICAtNjM1LCAgIC02ODgsICAgLTYzMCwgICAgLTkyLCAgIC0yMzUsICAgIDEwNCwKKyAgICAgICAtNzcsICAgLTU0MSwgICAgNTExLCAgIDI3MjIsICAgIDQ0MSwgICAyNzU3LCAgICA5NTIsICAgIDczOSwKKyAgICAgIC0yNTcsICAgLTI1NCwgICAtNDM4LCAgIC0xMjIsICAgLTE1MSwgICAgIDEyLCAgICA1NzgsICAgIC05MiwKKyAgICAgIC00NDAsICAgIC02MywgICAgIDkzLCAgIDQ5NzEsICAgLTQ5OSwgICAgNDE5LCAgIDEzNzQsICAgLTE2NSwKKyAgICAgIC00MTcsICAgICA2NCwgICAgLTEzLCAgIC0yMzUsICAgMTA4MCwgICAgLTc3LCAgICA1MzYsICAgICA2OCwKKyAgICAgIC04NDIsICAgLTc3MiwgICAxNjI3LCAgIC00NzEsICAtMTM1MCwgICAtMTQ0LCAgIDI4NDksICAgIDIxOSwKKyAgICAgICAxMTQsICAgICA2OCwgICAgLTU1LCAgICAzNTAsICAgIC0xMSwgIC0xMzM0LCAgLTMwNDIsICAgMTE2NiwKKyAgICAgIC0xNDcsICAgLTg5MSwgICAtNDgzLCAgIDE0NjEsICAgIDMzOSwgICAgODA4LCAgICAzNjIsICAgLTEwMSwKKyAgICAgLTI4MDcsICAgIC0yNCwgICAtMzc3LCAgICA1MTgsICAgLTQzOCwgICAgMTk0LCAgIC0xMTAsICAgIDE5NCwKKyAgICAgIC04MjYsICAgMzM4MCwgICAgLTgxLCAgICAtMzAsICAgIC00MywgICAgMTAzLCAgICAtOTksICAgMTUzOSwKKyAgICAgIC02MTQsICAgIC0xMywgIC0xMTU0LCAgICAxOTYsICAtMzEyMiwgICAtNTIxLCAgIDE0NTQsICAgLTMxOSwKKyAgICAgICAxNTksICAgLTQyOCwgICAgNzIyLCAgIC0yMDgsICAgIDE2MiwgICAxODcxLCAgIDI1MzQsICAgMjI4NywKKyAgICAgICA5NDYsICAgIDI2MSwgICAtNDgzLCAgIC02NDUsICAgICAyNiwgICAtMTcwLCAgICAtMzEsICAgICAxNywKKyAgICAgICAxNjQsICAgIDEwNCwgICAgLTQ0LCAgLTgxOTIsICAgIC0yMCwgICAgIDk0LCAgIC0yMzUsICAgICA1NiwKKyAgICAgICAgNjgsICAgIC01OCwgICAgMzgwLCAgICAtMjUsICAgLTE3MCwgICAgIDE3LCAgICAgMTYsICAgLTE1NCwKKyAgICAgICAgNjMsICAgIDQ3NywgICAxMjgwLCAgICA2MTQsICAgLTUyOSwgIC0yMzQ3LCAgIC0zNjAsICAgIDE1OSwKKyAgICAgIDE5NjcsICAtMjA4NSwgICAgNDg1LCAgICAzMzUsICAgIDM3OCwgICAgMTc4LCAgIDE2MzMsICAgLTQzNywKKyAgICAgICAtNDYsICAgICAyMywgICAgNjQwLCAgIDE0NjUsICAgIC05MSwgICAxMjc5LCAgLTEwMjUsICAtMTAwNywKKyAgICAgIC0yMzYsICAgMjYzMiwgICAtMjU3LCAgICAyNjIsICAgIDE3NywgICAzMDI5LCAgLTMxNDksICAtMTAwMSwKKyAgICAgICAyMzEsICAgLTI2MiwgICAgIDg3LCAgIC0yNDMsICAgIC02OCwgICAtNTk3LCAgICAxMDksICAgICA2MiwKKyAgICAgIC0yNjQsICAgICAzNywgICAtNDYzLCAgLTMxMDUsICAgLTYzMywgICAgODgxLCAgIDEwMjYsICAgIC04NiwKKyAgICAgICA0MTcsICAgIDcwNSwgIC0xMTQ0LCAgICAtNjgsICAtMjA4NCwgICAgIDQ2LCAgICAxMjQsICAgIC0zNiwKKyAgICAgLTI0NjEsICAgIC03MywgICAtMTI2LCAgIC0zMDMsICAgMTA3OSwgICAtMzU4LCAgLTI3NjQsICAgLTc2MSwKKyAgICAgLTE0NTQsICAgLTI0NSwgICAgMjAzLCAgICAgIDAsICAgLTE3OSwgICAtMTE3LCAgIDI1NzEsICAtNDc1MSwKKyAgICAgICAtMjAsICAgIDE5NCwgICAgMjk4LCAgICAyNTgsICAgIDM5MCwgICAgMjcwLCAgICAtMzYsICAgIDE4MiwKKyAgICAgICAxNTIsICAgIC01NiwgICAgLTk3LCAgICAtNDcsICAgIDEzOCwgICAtMjMzLCAgIC0xMTEsICAtMTQ5MCwKKyAgICAgIC00OTAsICAgLTMyOSwgICAgNjYyLCAgIC0zMjAsICAtNDY5NywgICAgNDQzLCAgICAgNjYsICAgIDM1MiwKKyAgICAgICAyMDMsICAgLTExNCwgICAtMTE5LCAgICAxODYsICAgIDY0OSwgICAtMTA2LCAgICAgLTUsICAgMjI4MCwKKyAgICAgIDExMzIsICAgLTM3NiwgICAxMTY4LCAgICA5MTksICAgMTg1OCwgICAgMjcxLCAgLTE3NDEsICAgLTEzMCwKKyAgICAgLTMzODgsICAgIDI2NCwgICAgNjE4LCAgLTIzNzUsICAgIDI2MCwgICAxMjc5LCAgICAxMTAsICAgIDczMiwKKyAgICAgICAxMjgsICAgLTM3MywgICAgIDU0LCAgIC0xODIsICAgICA5OSwgICAtMTMxLCAgICAgIDksICAgICAzMCwKKyAgICAgICAtODMsICAgICAyNywgICAgMjA0LCAgICAxMDksICAgLTMwNiwgICA2OTAzLCAgICAxMzAsICAgICAtNywKKyAgICAgIC0xMTUsICAgICA5MiwgICAtMjQxLCAgICAxMTksICAgLTY0MCwgICAtODcxLCAgICAtNDAsICAgIDM3MiwKKyAgICAgICAtNjgsICAgLTE0NywgIC0xNTAzLCAgICAtNTgsICAgIDkyMCwgICAtNDY2LCAgICAzMTEsICAgIDE0NCwKKyAgICAgLTM2NDgsICAgLTEyMSwgICAtMzU3LCAgICAgIDUsICAgMTk2OCwgICAtNzM3LCAgLTE0OTEsICAgIDU5NiwKKyAgICAgICA4MTgsICAgIDEyMiwgICAgNjg4LCAgIC0xMzcsICAtMjQxNSwgICAtMzY4LCAgICAyMzYsICAgICA3MSwKKyAgICAgIC01OTcsICAgLTE5MywgICAtMzk1LCAgICA3OTUsICAgIDg1NSwgICAgNjU3LCAgICAtNDksICAgIDg0NCwKKyAgICAgLTMzMjAsICAtMTkyMSwgICAgODQ2LCAgICAgMTcsICAgLTI5MywgICAgLTE3LCAgLTE2NzYsICAtMTgyNiwKKyAgICAgIC0xMzgsICAgIDg5NywgICAtMjA3LCAgICAgLTMsICAgMTgzOCwgICAtOTAxLCAgICAgODYsICAgIDI3NSwKKyAgICAgICA5NjQsICAgIDIzMCwgICAgNTEwLCAgICAtMTAsICAgMjg3OSwgICAzOTQ5LCAgICAzMzIsICAgIDI4OSwKKyAgICAgICAxMDksICAgLTIyOSwgICAgIDE4LCAgICAyMzgsICAgIDI0NCwgICAgMjg3LCAgICAgNDQsICAgIDEwMywKKyAgICAgICAzNjcsICAgICAyMSwgIC0xMTM0LCAgIC0zNzgsICAgMTMzOCwgICAtODI4LCAgIDM1MDAsICAgICAgNSwKKyAgICAgIDEwMjcsICAgIDQ3NSwgICAgMjA4LCAgICA2NTQsICAgIDU4OSwgICAgLTkyLCAgICAyMzYsICAgIC04NSwKKyAgICAgIC0xMTUsICAgMTA5NSwgIC0yNTA0LCAgICA4MjcsICAgLTg4NSwgICAtODA2LCAgIC0xNTUsICAgMjExMiwKKyAgICAgIC0zNDYsICAgMTEyMCwgICAtMzUwLCAgIC05MTEsICAgLTIzNCwgICAgMjMxLCAgICAgNTUsICAgICA4NywKKyAgICAgIDE5NTcsICAgIDYwMSwgICAgNzU1LCAgLTEyNDgsICAgIDc1MywgIC0yNzI2LCAgIC00ODEsICAgMjAzOCwKKyAgICAgICAgOTYsICAgLTM2MywgICAgMzA5LCAgICAxNTAsICAgIDI5OSwgICAtNTYxLCAgIC02OTgsICAtMTAzMCwKKyAgICAgICAxMTgsICAgMTIyNCwgICAzMjQwLCAgLTE1MjMsICAgMTQ3NiwgICAgMzQyLCAgIC02ODgsICAgIC03NiwKKyAgICAgICAxOTIsICAgICAtOCwgICAtMzE5LCAgICAzNTAsICAgIDE0OSwgICAtMzMxLCAgICAxNTUsICAgLTQzNiwKKyAgICAgICAyODYsICAgLTk5NCwgICAgMTYwLCAgLTI2OTYsICAgLTQyMywgIC0yNzk4LCAgIC0xMzUsICAgLTEwOCwKKyAgICAgLTI4NDYsICAgLTI1NCwgICAzNTkwLCAgICAzNTAsICAgIDEzMCwgICAtODEwLCAgICA0NjMsICAgLTEyMywKKyAgICAgICAgNTksICAgLTI1NiwgICAgMjUxLCAgIC03NTAsICAgIC03NiwgICAgIC04LCAgLTE2MzMsICAgIDE1MCwKKyAgICAgIC05MzEsICAgMTk1OCwgICAxNTIzLCAgLTI1MjcsICAgIDIzOSwgICAtMjg3LCAgICAxNzIsICAgIDMzMiwKKyAgICAgICAtMTMsICAgIDQ4NiwgICAgMjQ3LCAgICAtMjYsICAgIDE0OSwgICAgIDU5LCAgICAxMzAsICAgIDI2NSwKKyAgICAgICAgMTksICAgIDIwOSwgICA3MjIwLCAgICAtMjMsICAgIC05OSwgICAgLTY5LCAgICAtNjYsICAgIC03MCwKKyAgICAgICAtNTQsICAgIC03NSwgICAgIDYwLCAgIC0yNjQsICAgLTEwMiwgICAxMDc5LCAgIC01MzUsICAgMTU4NywKKyAgICAgIC01NTcsICAtMTQ5OSwgICAgMjQxLCAgLTI1OTYsICAgMTE1NywgICAtMTQwLCAgICAyNzAsICAgICAzMywKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNiNDQ0OHNtMVtdID0geworICAgICAgNzg5NCwgICAtMzMxLCAgICAzODMsICAgLTU1NiwgICAgIDYzLCAgIC0zNzEsICAgIC0yMywgICAgIDczLAorICAgICAgICA0NiwgICAtMTQ1LCAgICAxMDUsICAgICA0MywgICAtMTk5LCAgICAtNTIsICAgIC04NSwgICAgLTg1LAorICAgICAgICAxMywgICAgLTIxLCAgIC0yMzAsICAgNzM3OSwgICAgMjY4LCAgIC0yNDMsICAgLTQ2MCwgICAgMjUxLAorICAgICAgICA3MywgICAgIDEyLCAgICAxMTUsICAgIC0xOCwgICAtMjQ3LCAgICA0MzMsICAgIC05MCwgICAtNTE4LAorICAgICAgIDk2MiwgICAgICAwLCAgIC05NjAsICAgIDE4NCwgICAtMzA1LCAgLTIwMDMsICAgIDI3NiwgICAxNjk2LAorICAgICAgMjQxOCwgICAgMjcwLCAgLTIxNDAsICAgLTIxNSwgICAtNTM0LCAgIC0zODksICAgLTQwMywgIC0zNTAwLAorICAgICAgIDQxNiwgICAgNTY3LCAgIC0zOTMsICAgLTE4MywgICAgMjUzLCAgIC0xMDAsICAgLTI4NSwgICAtMTA3LAorICAgICAgIDEwMCwgICAgMjgxLCAgIC01MjcsICAtMjk0NCwgICAgLTg2LCAgIDI2NTIsICAgIDMxMSwgICAtNzg1LAorICAgICAgLTgxMSwgICAtMjgzLCAgICA0MjUsICAgIC03NywgICAgMzkzLCAgICAxMzYsICAgIDE3MCwgICAxMjkwLAorICAgICAgLTc2NSwgICAgMTA4LCAgICA2NzYsICAgLTIxMywgIC0xMjI2LCAgIC00NzAsICAgIDQyNywgICAzNDk5LAorICAgICAgIDYxNiwgIC0xMjExLCAgIC0yMjYsICAgIC0zNywgICAgIDg4LCAgLTI3OTIsICAgIDM1MSwgICAgIDc4LAorICAgICAtMjk3NSwgICAgIDk5LCAgICAxOTIsICAgMTM5MCwgICAtMzM4LCAgICAgNDcsICAgICAtOCwgICAgIDU4LAorICAgICAgLTI1NSwgICAgIDUwLCAgICAyMjEsICAgIC00OSwgICAtNzg4LCAgIC0yMDcsICAtMjEyMiwgICAtMTY3LAorICAgICAgLTY5MiwgICAgMzc5LCAgLTMyMzksICAgLTk2NSwgICAtNjk4LCAgIC00NjMsICAgIC00NSwgICAgIDM0LAorICAgICAgMTc4NSwgICAxMDI2LCAgLTExMDcsICAgIDExMywgICAgMTI0LCAgIC0yNTgsICAgLTI3NywgICAtNzE0LAorICAgICAgMjc2NCwgICAtMTc4LCAgIC0yMDAsICAgIDkwNywgICAgLTQ1LCAgIC0yMTMsICAtMjU3NSwgICAtNTMwLAorICAgICAgLTExMiwgICAzNjE2LCAgIC0xMjgsICAgICA3NiwgICAtMzY2LCAgIC0xMzUsICAgIC0yMiwgICAgLTUxLAorICAgICAgIDEyNSwgICAtMTAwLCAgICAtNzksICAgIDE0MiwgICAgIDU0LCAgICAxMDcsICAgICA4NywgICAgNDkzLAorICAgICAgIC0zNCwgICAtMjIxLCAgIC00NDgsICAgLTI0MywgICAgOTk0LCAgICA4NDUsICAtNDY1NiwgICAtMTA1LAorICAgICAgLTQ4NywgICAgIDQxLCAgIC0xMTIsICAgIDM0OSwgIC00MzI4LCAgICAtNzIsICAgIDUxMywgICAtMTEyLAorICAgICAgLTY4NSwgICAtNDcwLCAgIC0xMzgsICAgLTU0MSwgICAgMzQwLCAgLTE1MDUsICAgIC0yNCwgICAgIDM3LAorICAgICAgIDE2OSwgICAtNDA1LCAgIC00MzQsICAtMjk5NCwgICAgLTQyLCAgIC00MTYsICAtMTkyNywgICAxNTUxLAorICAgICAtMTQ4OCwgICAgNDIwLCAgICAxNzksICAgIC02NiwgICAgIDE0LCAgICAgOTIsICAgIDE0NywgICAgMTQxLAorICAgICAgIDQ5NywgICAgNDA0LCAgIC00MTIsICAgMjMwMSwgICAgMzM2LCAgLTI4NzcsICAtMTg0NSwgICAtOTQ4LAorICAgICAgLTc4NCwgICAgMjYyLCAgIC0yMTEsICAgICAgNiwgIC0xNjc4LCAgIC00MzQsICAtMTQzMywgICAtNzI3LAorICAgICAgMTI1NCwgICAgNTQyLCAgLTE0MzAsICAgLTMwMiwgICAxNTU4LCAgICAxMDcsICAgIDYxNywgICAtODMzLAorICAgICAgLTM2OSwgICAtMTc4LCAgIDE2ODIsICAtMjU2OSwgIC0xMjMyLCAgLTE1NTYsICAgIC04NywgICAtMTc4LAorICAgICAgIDQwMCwgICAtMTc4LCAgIC00MjcsICAgLTEyNCwgICAgLTYzLCAgICAxNDIsICAgLTIyMSwgICAgIDMzLAorICAgICAgMjg4MCwgICAtMjI3LCAgIC0zNTYsICAgLTQ2NiwgIC0zMzYyLCAgIC0zOTgsICAgLTE2NywgICAgMTY0LAorICAgICAgIDEyNiwgICAgIDU5LCAgICAgLTEsICAgICAgNSwgICAgMjEyLCAgICAgMjUsICAgMjA2MiwgICAtNDYyLAorICAgICAgIC0zMywgICAgLTQ2LCAgICAgNDUsICAgLTIwMSwgICAgODIzLCAgIC0yNjgsICAgLTMwMiwgICAzNjIzLAorICAgICAgIDM4OSwgICAgMzgyLCAgICAxMzYsICAgIC0zMCwgICAgLTY0LCAgICAgIDIsICAgLTYwMCwgICAzMTE0LAorICAgICAgMjcyMCwgICAgMjczLCAgIC01ODgsICAgLTIzNSwgICAtMzEzLCAgIC0xNDEsICAgICAzNywgICAgLTI4LAorICAgICAgIDM1NSwgICAgMTg0LCAgIC00MzMsICAgLTExMCwgICAtNTc2LCAgICAtNTYsICAgIDEzNCwgICAtNjIzLAorICAgICAgLTI3MSwgIC0yNTI5LCAgLTI3NTMsICAgIDk0NywgICAxMzE5LCAgICAgLTIsICAgIDYyMCwgICAgIDM2LAorICAgICAgLTQxMiwgIC0xOTg2LCAgICAyMjEsICAgLTQwNCwgICAgNTE0LCAgIDMyMjMsICAgLTEwNiwgICAxNDk3LAorICAgICAgLTM2OCwgICAtMTY3LCAgIC0xNDIsICAgLTM2NiwgICAtMTI1LCAgICAgMTYsICAgIDE0MiwgICAtNDM1LAorICAgICAgLTE2MCwgICAyODQ1LCAgIC0xNTMsICAgIDQ3MCwgICAgMzg3LCAgIDMxMTcsICAgIC03NSwgICAtMzc1LAorICAgICAgIDY1OCwgICAgMjU5LCAgICA3NTUsICAgICAtMywgICAzNzQ0LCAgIC01MTcsICAtMTQ0NiwgICAtNjY3LAorICAgICAgMTM3MiwgIC0xNjkyLCAgICAxMTcsICAgIC05NiwgICAgMTk1LCAgIC0yMDEsICAgLTEzNCwgICAgLTc2LAorICAgICAgIDE3OSwgICAgIDk3LCAgICAgNzEsICAgMTg4NywgICAgMTYxLCAgICAzNjUsICAgIDIyOCwgICAxMTc3LAorICAgICAgIDIzNSwgICAtODM0LCAgICAtNDgsICAgMTY2NywgIC0xMTIzLCAgIDIyMTcsICAgLTIwOSwgICAgMTAwLAorICAgICAgLTIxOSwgIC0yNzc4LCAgICAgODEsICAgLTU3OSwgICAzNDIxLCAgIC0zMjYsICAgLTQ5MiwgICAtMjMzLAorICAgICAgICA3OCwgICAgIDMyLCAgICAxMTcsICAgIC03NCwgICAgLTgwLCAgICAgODUsICAgLTI4MiwgICAgNDUzLAorICAgICAgIDUwMCwgICAgNzIxLCAgICA4MDAsICAgICA4MywgICAtNjI0LCAgIDEwMDAsICAgIDE2NSwgICAgLTIwLAorICAgICAgLTUxNiwgIC00MTkzLCAgIC0zMzQsICAgIDEwNywgICAxMjIxLCAgLTE1MDcsICAgIC0xMCwgICAgNTIzLAorICAgICAgICA4NSwgICAgLTQ0LCAgICAgMjEsICAgICAzNCwgICAgMTk5LCAgIC0xMDYsICAtMjIzMywgICAgNTI1LAorICAgICAgMjEzOCwgICAgIDQwLCAgICAtNTUsICAgIC02MywgIC04MTc5LCAgICAzMjYsICAgIDMzMywgICAtMTUyLAorICAgICAgIC0yNywgICAgMTM3LCAgICAyMTIsICAgIDEzMCwgICAgLTEwLCAgICAgNzYsICAgIC02MSwgICAtMTEzLAorICAgICAgLTU0NCwgICAtMTc5LCAgIC0xODcsICAgICAgMCwgIC01MzA4LCAgICAzMjIsICAgLTMyNiwgICAgNTEzLAorICAgICAgIDQxNSwgICAgMzc1LCAgICAtOTIsICAgLTM1NCwgICAgIDY5LCAgICAgNzcsICAgICA2NSwgICAgIDkzLAorICAgICAgLTM1MiwgICAtMTY1LCAgLTE4MzcsICAgMTc5MCwgICAgOTE0LCAgIC0yNzYsICAgMjIxNSwgIC0xNDE4LAorICAgICAgIDM0MywgICAgMjgxLCAgICAgIDQsICAgIDI4MywgICA0Mzk4LCAgIDE2OTUsICAgLTI0OCwgICAgMTUzLAorICAgICAgLTE2NiwgICAgNzUxLCAgICA4MjIsICAgLTQwNiwgICAtNDU2LCAgIC0yNTEsICAgIDE4NSwgICAtMjUxLAorICAgICAgLTIyMiwgICAtMTY5LCAgIC0yNjYsICAtNjMyMywgICAgMjQ5LCAgICAtNDAsICAgIC00NSwgICAtMjAzLAorICAgICAgICA0NywgICAgLTgzLCAgIC02MjEsICAgLTE3NCwgICAgMzI3LCAgICAgMzAsICAgIDExNCwgICAgLTI5LAorICAgICAgLTUwNSwgICAtMjI0LCAgIDE4MDQsICAgMTU4MiwgIC0yMjkyLCAgIDIxMDIsICAgLTc0NiwgICAtNDIxLAorICAgICAgIDE3MCwgICAgNDM4LCAgIC0xNzEsICAgIDE1MywgICAgIDg0LCAgIC0xNTcsICAtMjkzNywgICAtMTIzLAorICAgICAgIC04MSwgICAtMjI3LCAgICAtOTgsICAgIDI2MywgICAzNTMxLCAgICAgMzYsICAgIDEwNSwgICAtNDc5LAorICAgICAgIC05NCwgICAtMzU3LCAgICAtMjIsICAgLTEyNCwgICAgMjc5LCAgIC0xMTYsICAgIDU0MywgICAgMjAxLAorICAgICAgLTM5MywgICAtMjI2LCAgLTIyNTUsICAgLTEzMywgICAxNjEzLCAgIC0xMjMsICAgMjY4NywgICAgIDcwLAorICAgICAgIDE5MSwgICAgMjQwLCAgIC05OTYsICAgLTY3NiwgICAgNjA2LCAgLTEyNDUsICAgLTMwNiwgICAgNDEzLAorICAgICAgLTI3MiwgICAtNTM5LCAgICA0ODUsICAgMzU4MywgICAtMjI0LCAgICA0MzIsICAgIDM4OSwgICAgIDMxLAorICAgICAgLTg4OCwgICAgMzE4LCAgIC0xNDksICAgLTIyOCwgICAgNzY0LCAgIC00MjYsICAgMTYwOCwgIC0yNjU2LAorICAgICAgIDI1NCwgIC0yMTkzLCAgICAyNTIsICAgIDQ4NCwgICAgLTkwLCAgIC0xMTcsICAgLTI1NywgIC0yMjEwLAorICAgICAgLTE1NiwgICAgNTUzLCAgICA1NTksICAgIDY4MCwgICAgMjk4LCAgICAtMTYsICAgLTUxOSwgICAxMTcyLAorICAgICAgMjE3MiwgICAxMjg4LCAgIC0xMTMsICAgIDE4NiwgICAtMTk5LCAgLTE0MTUsICAgIC04MywgIC0xOTg0LAorICAgICAgIDY2NywgIC0xMDEzLCAgICAzNDQsICAgLTM5OSwgICAyODg5LCAgLTExNzUsICAgLTkwOCwgICAgMTg2LAorICAgICAgIDE4NSwgICAgLTIyLCAgIC0zMjgsICAgMzEzMiwgIC0xMTY2LCAgICAyMDksICAgLTIxMywgICAgMzg2LAorICAgICAgMjE0MCwgICAgNTUyLCAgIDEwMjMsICAgIDcxOSwgICAgNTI5LCAgIC0xNjksICAgIDQyMSwgICAgMTk2LAorICAgICAgICA3NiwgICAxOTk1LCAgICA1MzIsICAgIC03NSwgICAyMDYwLCAgIC01MjYsICAgIDM5NiwgICAyOTc0LAorICAgICAgLTI2NCwgICAtMzQ4LCAgICAxNDksICAgIDU4NiwgICAgIDIyLCAgICAgOTcsICAgLTMzNywgICAtMjUyLAorICAgICAgIDM1NywgICAgMTAzLCAgLTIzMDgsICAtMjU3OCwgIC0xODM2LCAgIC0yNzcsICAgIDM0NiwgICAtMzE0LAorICAgICAgLTk4OSwgICAgMTg1LCAgIC0zMTQsICAgIDEwMiwgICAgIDU2LCAgIDM3NzksICAgLTI2NSwgIC0xMDI5LAorICAgICAgIC0xMiwgICAtMTI2LCAgIC00MzEsICAgIDM1NiwgIC0yNDkzLCAgICAtODYsICAgIDE3MiwgICAgMTE2LAorICAgICAgICA2MSwgICAtMTQ2LCAgLTIyMjAsICAgIDIxMSwgICAtMTY1LCAgICAyMzMsICAgLTMyNywgICAgIDczLAorICAgICAgICAtNywgICAtMTA0LCAgIC01NDYsICAgIDI1MywgIC0yNDA2LCAgICAzNjEsICAgMjI1MiwgICAgNDg2LAorICAgICAgIDY3NSwgICAtMTc3LCAgIDI2NDMsICAgIDYwMywgICAgMzAwLCAgIDExMjMsICAgLTY0MiwgICAgMzYxLAorICAgICAgIDY4NCwgIC0yMTUxLCAgICA1NjksICAtMTAxNCwgICAgMTIwLCAgICAtNTAsICAgIDMyMSwgICAzMTc0LAorICAgICAgMzA4MCwgICAtNzMzLCAgIC00MjcsICAgIDI5OSwgICAgMTY5LCAgIC0xMjMsICAgLTE0MCwgICAgLTEzLAorICAgICAgLTMxNSwgICAgIDIxLCAgIC0xMjAsICAgIC0yNCwgICAgMTc0LCAgIC0xOTEsICAgLTM1MCwgIC03ODQyLAorICAgICAgLTE0NSwgICAtMTY5LCAgIC00MTksICAgIC0xNSwgICAgMTUwLCAgIC0xMzAsICAgIC03MywgICAgMTYyLAorICAgICAgICAtOSwgICAgIDM4LCAgIC0yODcsICAgIDEwOSwgICAgMzkwLCAgICAxNDcsICAgIDE1MSwgICAxOTA3LAorICAgICAtNDI0MywgICAgICA3LCAgIC0yMDcsICAgLTE0NywgICAtMjMwLCAgIC0zNDMsICAgLTExNywgICAtMTExLAorICAgICAgIDEwNywgICAgMTMyLCAgIDE0NTcsICAgIC04OCwgICAgIC04LCAgIC00NDUsICAgLTE3NiwgICAtMTcyLAorICAgICAtMTc5OSwgICAtODEzLCAgICA0ODYsICAgMTE1MCwgIC0zMDI2LCAgIC0xNjgsICAtMjYyMCwgICAtNTg0LAorICAgICAgIDE3OCwgICAtNTQzLCAgLTE4NjgsICAgLTM1OSwgICAtMTEzLCAgLTE3ODMsICAgIDIxNCwgICAtNjYzLAorICAgICAgIDQ3MywgICAgODY2LCAgIC0xMzYsICAgIDE2OSwgIC0zMzI0LCAgIC0xMjksICAtMzQwNCwgICAtMjQ5LAorICAgICAgIDIzNCwgICAgNDIyLCAgICAyNTEsICAgIDM0MCwgICAtMzQzLCAgICAyMzEsICAgIDEzNCwgICAgLTQyLAorICAgICAgICAzMiwgICAgIDY0LCAgIC0yMDksICAgICAxMiwgICAgMjM2LCAgIC0yNjcsICAgLTQxOSwgICAgICAxLAorICAgICAgIDI2MCwgICAtMTA5LCAgIDY1MDgsICAgIDEwNSwgICAgICA3LCAgIC0yNzMsICAgLTEyMywgICAtMTA3LAorICAgICAgLTE1MiwgICAtMjc0LCAgIC0xNTcsICAgICA3NSwgICAgIDc0LCAgIC0yMDEsICAgICA0NiwgICAgIDM3LAorICAgICAgIDMzOCwgICAgLTIxLCAgIC0xODAsICAgIDIwOCwgIC02NDE3LCAgICA3OTQsICAgIDI1MCwgICAgLTgxLAorICAgICAgLTU4NSwgICAgICA0LCAgIC0xMTksICAgLTMxNCwgICAgNTI5LCAgICAyMTksICAgIDE1OSwgICAtMTMyLAorICAgICAgLTI3NywgICAgIDc2LCAgIC02MTMsICAgNDkzMywgICAgIDE1LCAgICAyMTMsICAgMjQ2MSwgICAgMjg2LAorICAgICAgIDU0MiwgICAgMTc3LCAgIDI3NjcsICAgIDM4OSwgICAgMTM2LCAgICA3NTAsICAgIDU1OSwgICAtOTk0LAorICAgICAgIDY4NCwgICAgLTEyLCAgLTIwODEsICAgLTU0NiwgICAgLTg5LCAgLTM3MzMsICAgIDU0OCwgICAtNjIwLAorICAgICAgIDY3NSwgICAgMTE4LCAgIC0xMjEsICAgIDE5MCwgICAgLTUyLCAgICAgMTksICAgIC0xOSwgICAgIDI1LAorICAgICAtMTIyNCwgICAgMzQ0LCAgIDMwOTQsICAtMjA2NywgICAgICA3LCAgICAyNzMsICAtMTI2OCwgICAtMzc1LAorICAgICAgLTI5NywgICAtMjAxLCAgICAyNzEsICAgLTE5MSwgICAgMTIzLCAgICAgIDYsICAgLTI2MCwgICAyMjg0LAorICAgICAgLTMwOCwgIC0zMDYyLCAgICAyNDIsICAgIDY2OCwgICAtMjIxLCAgIDExNDYsICAgMTIxOCwgICAgNDczLAorICAgICAgLTEzMywgICAgIDgyLCAgICAgNTcsICAgIDExMiwgIC0xNjc3LCAgICAgNzgsICAgLTIyOSwgICAgMzU0LAorICAgICAgLTQ2MywgICAgNzYzLCAgIDE2MjgsICAgMjI0MywgICAxMzg2LCAgIDE2MzAsICAgLTE0NSwgICAgMjU1LAorICAgICAgIC02MCwgICAgMjI4LCAgICAxOTUsICAgLTg2NCwgICAyNTM5LCAgIC00NjYsICAgIDk4NSwgIC0zMDc1LAorICAgICAgICAgMiwgICAgMTE4LCAgICAyMjEsICAgLTM5NSwgICAtNDUwLCAgIC0yNTYsICAgLTE1OCwgICAgLTMyLAorICAgICAtMzgyOSwgICAyMDEyLCAgICAtNTAsICAgLTQ2NSwgICAgMTQ2LCAgLTEwOTEsICAgLTMxOCwgICAgMjcxLAorICAgICAgIC0xMiwgICAgNTk2LCAgICAxNjAsICAgIDEyMCwgICAgIDkyLCAgIC0yMDksICAgLTMzNSwgICAgMTA0LAorICAgICAgIC0yOCwgICAgNjg5LCAgICAzMDUsICAgLTU0OCwgICAtODQ5LCAgIDE2MTcsICAgIDYwNSwgICAgMTg1LAorICAgICAgLTQxNCwgICAzODk5LCAgIC0yNzMsICAgICA1MSwgICAgMTgyLCAgIC0xOTIsICAgIDEyMSwgICAgNjE2LAorICAgICAgMTIxOSwgICAgNDE0LCAgIC05NTksICAtNDIxOSwgICAxMzE5LCAgICAgNjAsICAgIDI0NiwgICAtNDY4LAorICAgICAgIC0zMiwgICAgMjI1LCAgICAzMzgsICAgIC0zOSwgICAxMjM1LCAgLTIwNzksICAgMjI1MCwgICAgNjI2LAorICAgICAgIDEyMSwgICAgMjk2LCAgIC0xMzcsICAgLTMzOSwgIC0xODcwLCAgICAtNDcsICAgLTM5NywgICAgMTI0LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiOGxbXSA9IHsKKyAgICAgLTEyMzksICAtMTMxMCwgIC0xMjQwLCAgLTExNDYsICAtMTMzNywgICAxMzAzLCAgIC00ODIsICAgMjIxNSwKKyAgICAgIDIwMjYsICAgMjIyMiwgIC0xMTQ0LCAgLTExODgsICAtMTIwOSwgICAyNTM1LCAgLTExMTEsICAgLTg0NCwKKyAgICAgIDE0ODUsICAgIDYyNSwgICAxMjU0LCAgIDEyMDQsICAgNTkzMiwgIC0xMTE2LCAgLTEyMzUsICAtMTIwOCwKKyAgICAgIC04MDEsICAtMTAyMCwgICAtNTU4LCAgIDEzODcsICAgMTUxMywgIC0xMDc5LCAgIDMyMjAsICAgLTg5NiwKKyAgICAgLTEwODMsICAtMTE2NiwgICAyMjQ2LCAgLTEyMTAsICAgLTgzOCwgICAtOTUwLCAgIC05NjAsICAgIDc2NCwKKyAgICAgMTM5NDEsICAtMTMwNywgICAtODE3LCAgLTEyNTMsICAgMTg1MCwgIC0xMzIwLCAgLTEzNjEsICAtMTIxOCwKKyAgICAgIC02NzEsICAgIDc4MCwgICAtODM5LCAgLTEwNjgsICAgLTc3NiwgICAyOTc3LCAgIC03MTQsICAgLTk0NCwKKyAgICAgIC04MjMsICAgLTU4MCwgICAgMzU3LCAgICA1OTEsICAgIDMwMiwgIC0xMDc4LCAgIC04OTUsICAtMTAyMCwKKyAgICAgIDMxMTYsICAtMTE0NCwgICAxNDM4LCAgIC04OTEsICAgIC03MSwgICAxNTI4LCAgIC0yMzgsICAtMTI5NywKKyAgICAgLTEwMjAsICAgNDYxNiwgIC0xMTg1LCAgIC01MTQsICAtMTE1NCwgIC0xMTU3LCAgIDE5MDEsICAgMjM3MiwKKyAgICAgLTExMzEsICAtMTI4OSwgIC0xMjczLCAgLTEyODksICAtMTMxMSwgIC0xMzMxLCAgLTEzNDAsICAgIDQzOSwKKyAgICAgICA0NTUsICAgMjM5NSwgICAtNTM3LCAgLTExODAsICAgMjQwOSwgIC0xMDg0LCAgIC01ODAsICAgMTkzNywKKyAgICAgICA4NDYsICAgIC01MSwgICAgNjE1LCAgIDEwOTksICAgMzg1NCwgIC0xMTc3LCAgIC05MTIsICAtMTA5NSwKKyAgICAgICA2NTYsICAgLTk5NSwgICAtNjQ3LCAgIDMyOTgsICAgLTk3NiwgICAtNDM2LCAgMTIzMjMsICAtMTI5MSwKKyAgICAgLTExODcsICAtMTM0MSwgICA0Nzc5LCAgLTEzNjgsICAtMTM1NywgIC0xMzE3LCAgIC05ODUsICAgMTQwNywKKyAgICAgIC01MTMsICAtMTM4NywgIC0xMjI0LCAgLTEwNjksICAtMTIxOCwgIC0xMTE3LCAgIC0xODEsICAtMTIwOSwKKyAgICAgIDUzNzYsICAgNDI1NiwgICAgLTIyLCAgLTEyMzIsICAtMTE3MywgICAtODM0LCAgLTEwNTQsICAgLTk0NywKKyAgICAgIC02MTEsICAgLTgyMiwgICAtMjA2LCAgIDU1NzIsICAgLTk4OCwgICAxMDY3LCAgIC04MzcsICAgIDczOCwKKyAgICAgIC0zMzIsICAgIC0zOCwgICAgLTU5LCAgICAxNDMsICAgIDI0OCwgICAgMzg2LCAgIC00NDcsICAtMTIzMywKKyAgICAgLTEyNTgsICAtMTE2OSwgICAzNjUzLCAgLTEwNDUsICAgLTY1NywgICAtOTI2LCAgIDIwMDQsICAgMjIwMSwKKyAgICAgLTExNjQsICAgNzA0MiwgIC0xMzAyLCAgLTEzMTMsICAgLTgxMiwgICAgMTUwLCAgIC0xMjksICAgIDMwNSwKKyAgICAgICA0NDIsICAgIDc0MiwgIC0xMTg1LCAgLTEyOTMsICAtMTIyMCwgICAtODcyLCAgLTEzMDQsICAtMTI2MCwKKyAgICAgIC04NTMsICAtMTI5MywgICAyOTYyLCAgIDMwMTEsICAgLTE3OCwgIC0xMTg3LCAgLTEwODcsICAgLTg5NiwKKyAgICAgIC04OTUsICAtMTA1MywgICAzNzg4LCAgICAgNTksICAgLTE2OSwgICAxNjMyLCAgLTEyMDEsICAtMTI4OSwKKyAgICAgIDUyNjMsICAgLTg5NiwgICAgMzMxLCAgIC04NTIsICAgIDIxOCwgICAgODI1LCAgIDExMjksICAgMTAyNCwKKyAgICAgICAtMzksICAtMTE4NiwgIC0xMDU0LCAgIDE4NjIsICAtMTE5OCwgICAyMDEwLCAgLTEwNzUsICAtMTAwNSwKKyAgICAgICA3MDIsICAgMTU1MCwgICA0NDkxLCAgLTEwNTUsICAgLTg5MCwgICAtNjQ1LCAgIC05ODcsICAgMjQ2NSwKKyAgICAgICA1MjksICAgIDE5NCwgICAgLTcyLCAgICAzNzAsICAgMTU0NywgICAtOTY4LCAgIC04NDksICAtMTE1MywKKyAgICAgIDY0NTksICAtMTE2NCwgIC0xMDYxLCAgLTEwMjAsICAgLTgzOCwgICAgMTI1LCAgIDM2OTgsICAtMTE2OCwKKyAgICAgLTEwNjYsICAgMTg4MiwgIC0xMTU5LCAgIC00MzksICAtMTAxNywgICAtNzU5LCAgICA3NDQsICAgMTMwMiwKKyAgICAgIC04MTIsICAgLTk4NSwgIC0xMDAyLCAgLTEwMjksICAgLTg3MSwgICAzNjkwLCAgIC0xNzAsICAgIDYwNCwKKyAgICAgICA2MjMsICAgMTI3MiwgICA2MTM1LCAgLTEwMTIsICAtMTIzMSwgIC0xMDY2LCAgIC05MjcsICAtMTA4MiwKKyAgICAgIDIzOTMsICAgLTg0MywgICAxNTM3LCAgIDEyNDAsICAgLTg2NiwgIC0xMTYxLCAgIC04NjYsICAgNjYzOSwKKyAgICAgIC05OTQsICAgLTg2MCwgICAtMjY0LCAgIC0yOTgsICAgIDQ2OSwgICAxMTg0LCAgIC04NjgsICAtMTI2MiwKKyAgICAgIDIxNjcsICAtMTE3NywgICAyMTMyLCAgIC05ODcsICAgLTU2MywgICAgOTY5LCAgIDExNDUsICAgMTUwOCwKKyAgICAgIC03MzUsICAtMTIzMiwgIC0xMDkwLCAgLTEyMDQsICAgMTUwNywgIC0xMTAxLCAgIC0zOTMsICAgIDc1NSwKKyAgICAgICA5NzUsICAgMTI0NiwgICAxOTQ0LCAgLTEwNjgsICAtMTE2OSwgIC0xMDQwLCAgIC05ODcsICAtMTMwMSwKKyAgICAgIDU0ODgsICAtMTA1NywgICAzMTUwLCAgIDE4OTAsICAtMTEzMywgICAyNzI1LCAgLTExMjMsICAgLTk2MywKKyAgICAgIDE5MDEsICAgIDI2MCwgICAtNDg0LCAgICA0NDksICAgIDU2NCwgICAxMTQ0LCAgICA2NzksICAtMTExOCwKKyAgICAgIC05ODksICAgLTcwMiwgICAtNTU2LCAgICAxNjIsICAgIDY4OSwgICAgNzEyLCAgICA2NzMsICAgIDQ0MywKKyAgICAgIC02OTUsICAtMTI0NywgIC0xMDE5LCAgLTEwNjUsICAgLTQwNiwgIC0xMTQzLCAgIDE3NTAsICAgLTc0MywKKyAgICAgIDI2NDQsICAgMjQwMiwgIC0xMTcxLCAgLTExNTcsICAtMTA1OSwgICAtODIzLCAgIC02ODgsICAgMTMxNCwKKyAgICAgIDE0NTgsICAgIDYyOSwgICAgODU3LCAgICA4NTYsICAgLTg3NSwgIC0xMzE2LCAgIDM0NzAsICAtMTA2MSwKKyAgICAgIC04NDYsICAgLTc2MSwgICAtNzEyLCAgIC05NTUsICAgIDk3OCwgICAxOTY3LCAgIC05ODAsICAgMzUxNywKKyAgICAgIC05OTQsICAgLTk1MywgICAtOTAzLCAgICAgNTYsICAgIDIyOCwgICAgLTMwLCAgICAzNTksICAgIDU2MCwKKyAgICAgIDk5MjYsICAtMTE3OCwgIC0xMDU2LCAgIC02MjcsICAgLTk1MiwgICAtNDgxLCAgLTExNjgsICAgLTI2OCwKKyAgICAgIC03MDEsICAgLTU1NSwgICAtODg3LCAgLTEyMTIsICAgMTc2OCwgIC0xMTU2LCAgIC0zOTYsICAgLTc1NSwKKyAgICAgIC0xMTksICAgMTU5NCwgICAgOTQ5LCAgIDEyMDEsICAgLTg0NCwgICAxNzM0LCAgIDEzMTIsICAgLTMzMSwKKyAgICAgIC01MDAsICAgLTI4MCwgICAtMTI1LCAgIC0yMTksICAgLTEzOSwgICAgNDk2LCAgLTExMjEsICAtMTIyNywKKyAgICAgLTExNDUsICAgLTIxNSwgIC0xMTIzLCAgIC03NjUsICAgLTE3MywgICA0MDU1LCAgIDEwODYsICAgMTQ2NSwKKyAgICAgIC03MTQsICAgLTkwNCwgICAtOTAxLCAgIC03MTMsICAtMTA3MywgICAxMjMzLCAgIC03OTcsICAgIDY0NSwKKyAgICAgICAgNTgsICAgIDg5NywgICAtNTE4LCAgIC02MjQsICAgLTQ0MSwgICAtNTU0LCAgIDExMzksICAgIDU0OSwKKyAgICAgICAxNDcsICAgICA3MiwgICAgMTI3LCAgICA0MjgsICAtMTEwNCwgICAtOTc5LCAgIDI0MzMsICAgMTg2NywKKyAgICAgIC0yMzcsICAgLTc0NSwgICAtMjgwLCAgICAxMTAsICAgIDc5NCwgICAgNjMxLCAgLTEwNDksICAgMTE0MSwKKyAgICAgIC05NzQsICAgLTkyMCwgICAtODQ5LCAgIC0zOTIsICAgIDYzNCwgICAgNDE0LCAgICA2MTQsICAgIDc5NywKKyAgICAgLTExNjIsICAtMTM0NCwgIC0xMTkyLCAgLTEyNTksICAtMTA3OSwgICAtOTEyLCAgIDI3MTcsICAgMjU0OCwKKyAgICAgIDE4NDcsICAgMTkyMCwgIC0xMDA0LCAgLTEwOTEsICAtMTAwNiwgICAtNjkyLCAgICAtODUsICAgIC0yNCwKKyAgICAgIDEwMTQsICAgMTQyNywgICAgNzUxLCAgIC01ODQsICAgNjA1NywgIC0xMjA2LCAgLTEwNzIsICAgLTc5NSwKKyAgICAgIC05MjEsICAtMTEwMywgIC0xMTU3LCAgIC02MjMsICAgLTgxOCwgICAyNjQxLCAgIDMxMjEsICAtMTA4NCwKKyAgICAgLTEwOTUsICAgLTkzOSwgICAtNjY0LCAgIC02OTQsICAgIDg4NCwgICAgNTU1LCAgICAxNDQsICAgIDU5MywKKyAgICAgIC04NzQsICAtMTA3NCwgICAgNDE3LCAgLTEwMjcsICAgICAtNiwgICAtNzkwLCAgIDE2ODcsICAgICA4MCwKKyAgICAgIDEwMTgsICAgIDczOCwgICAtNTI3LCAgIC05NTgsICAgLTcwMSwgICAtMzc3LCAgICAgLTQsICAgIDE1NSwKKyAgICAgICAzMDQsICAgLTM0OCwgICAtOTQ3LCAgIC0zNDIsICAgMjI2OSwgIC0xMDQwLCAgIDExMjQsICAgLTQ5NCwKKyAgICAgICAtNzYsICAgICA3NiwgICAgICAyLCAgICAxMTQsICAgLTE5NCwgICAgMzQ4LCAgICA5MDQsICAgIDQ2NiwKKyAgICAgIC01NzcsICAgLTcxNywgICAgMTA3LCAgICAtMzksICAgIC0yOSwgICAgMTU4LCAgICAxMDEsICAgIDE0OSwKKyAgICAgIC05NjgsICAgLTkyMSwgICAgNTU4LCAgIC0yNjQsICAgLTQ0NSwgICAgMTM4LCAgIC0xMjEsICAgIC0zMywKKyAgICAgICAxMDUsICAgIDI0MywgICAtNDc4LCAgLTEwNDcsICAgLTkzNywgICAtNzUxLCAgIC02MDksICAgLTgyMiwKKyAgICAgIC03MDksICAgLTk3NiwgIC0xMDA2LCAgIDI4MDAsICAtMTEwOCwgIC0xMjkyLCAgLTEwNTUsICAtMTI3MiwKKyAgICAgLTEyOTUsICAtMTE1MiwgICAgMzA1LCAgLTExNDQsICAgIDYzNSwgICAyMDY3LCAgIC01ODQsICAtMTEzNSwKKyAgICAgIC02NjMsICAtMTEzMCwgICAtNzU0LCAgLTEwMDksICAgLTkzNywgICAtNTE1LCAgIDE0NzMsICAgIDg0MSwKKyAgICAgLTEyMzUsICAtMTMzOCwgIC0xMzA1LCAgLTExNDEsICAtMTEwOSwgIC0xMjE3LCAgIC0yMzgsICAgMTkxNSwKKyAgICAgIDM1NTAsICAgMjMwNiwgICAtOTYzLCAgIC05ODUsICAgLTg3NCwgICAgNzYzLCAgIC04MjYsICAgLTY5NCwKKyAgICAgICAgMTksICAgIDM5MSwgICAgMzc5LCAgICA3NzYsICAgLTU4MiwgIC0xMjE2LCAgLTEyODUsICAtMTE2NCwKKyAgICAgLTEyNzYsICAtMTMwNSwgIC0xMjczLCAgIDI2MzEsICAgLTU3OSwgICAyNDg3LCAgIDEwNTgsICAgLTY1NSwKKyAgICAgIC04MDgsICAgLTg3OCwgICAtOTEwLCAgLTEwMDYsICAtMTEyMiwgICAtNTkwLCAgIC02NjMsICAgIDQyOCwKKyAgICAgIDIxODUsICAtMTEyNSwgIC0xMDMyLCAgLTEwNzYsICAgLTg3MywgIC0xMTM5LCAgLTEwMjksICAgLTQ3NywKKyAgICAgIDE3MjAsICAgMTIzOCwgIC0xMTExLCAgLTEzMTEsICAtMTM0MywgICAxMDc0LCAgLTEzMjgsICAtMTE4MSwKKyAgICAgIC05NzAsICAgLTM4NiwgICAyMzU5LCAgIDE3NzcsICAtMTA0NSwgIC0xMTg5LCAgLTExMTcsICAtMTA1MywKKyAgICAgIC05NDIsICAgLTMyOSwgICAgNTAxLCAgIDEyMzcsICAgIDgwOCwgICAxMDIyLCAgIC04NjYsICAtMTA0OCwKKyAgICAgIC02NzgsICAgMTU5NywgICAxNTI4LCAgIC0yNjIsICAgLTI1NiwgICAgMjMxLCAgICA0MTgsICAgIDcyOCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGZjYjhzW10gPSB7CisgICAgIC0xMDIyLCAgIC04NTgsICAgLTc3MywgICAgMzA0LCAgIC04ODEsICAgLTc3MSwgICAtMzQxLCAgICA5MzcsCisgICAgICAgMjcwLCAgICA0MjAsICAgLTY4NCwgIC0xMDAwLCAgIC03OTUsICAgLTkwMywgICAtNjcxLCAgIC01NzUsCisgICAgICAgIDE0LCAgIDMzMjcsICAgIDUyOCwgICAgODkzLCAgICA5NjUsICAgLTU0MSwgICAtOTQ3LCAgLTEwMjcsCisgICAgICA0MDA4LCAgLTEwODEsICAgLTc0MywgICAtOTkxLCAgIC04MDgsICAgIDkzMywgIC0xNDA2LCAgLTExNzMsCisgICAgICA3NTEzLCAgIC04MjQsICAgLTIxMywgICAtNzk3LCAgIC02NDgsICAgIC00MCwgICAgMTc2LCAgICAyMTcsCisgICAgIC0xMjk4LCAgIDY3NDMsICAgLTc1NSwgICAtMjMyLCAgIC00NDAsICAgLTY4MCwgICAtMjY5LCAgICAtNjAsCisgICAgICAgLTgwLCAgICAtODUsICAgLTg5MywgIC0xMDQ0LCAgIC03MjYsICAgLTczMywgICAtODM0LCAgIC02NDEsCisgICAgICAgMjMxLCAgIC03NzksICAgLTUwMSwgICAxODMyLCAgLTEyOTYsICAgMjU0OCwgICAyNzU0LCAgICAgMTksCisgICAgICAtMjEwLCAgIC03MDgsICAgLTIwNSwgICAgLTc0LCAgICAgMTgsICAgICA1NSwgIC0xMjI1LCAgLTExMjMsCisgICAgIC0xMjM5LCAgIDY5OTEsICAgLTY4OSwgICAgMjcyLCAgIC0yOTAsICAgICA1NiwgICAgMzU2LCAgICA2NzUsCisgICAgICAxNjIzLCAgLTExMzQsICAgLTYwNywgICAxNDI2LCAgIC04NzIsICAgIDUxMSwgIC0xMDYwLCAgICA0MDgsCisgICAgICAgMjUzLCAgICA0MjMsICAgMTk2MCwgIC0xMzM3LCAgLTExNTIsICAgLTk4NSwgICAtOTI0LCAgIDIwMjAsCisgICAgICAtMzk4LCAgICAzNDgsICAgNDE4OCwgICAxMDQ0LCAgIC02NTAsICAgLTgzMSwgICAyOTA5LCAgIDIwODMsCisgICAgICAtNDU3LCAgICAgLTUsICAtMTAzNywgICAtOTY0LCAgIC0xMjgsICAgIC00MCwgICA2MDE5LCAgIC04NTgsCisgICAgICAtOTM3LCAgIC01NTksICAgLTYyNCwgICAtNjAxLCAgIC00MTEsICAgIDEyMCwgICAtMjg5LCAgICA0MTIsCisgICAgIC0xMjcxLCAgLTEzNTEsICAgMzg1OCwgIC0xMjE0LCAgIDIyMjQsICAgLTMyNSwgICAtMTY1LCAgICA1MzUsCisgICAgICAgNTU5LCAgICAzODYsICAgMTg2OCwgICAgNjQ5LCAgICAyNjksICAgIDI0NSwgICAtNzA4LCAgIC03NzgsCisgICAgICAtMTc5LCAgICAtMTIsICAgIDEwMSwgICAgLTEyLCAgLTEyMzUsICAgLTg5MiwgICAtODI5LCAgIDI1NzAsCisgICAgICAtNTc0LCAgIC00MzEsICAgIDE3MCwgICAgMTY3LCAgICA0OTIsICAgIDUzMSwgICAtOTMwLCAgLTEwOTMsCisgICAgIC0xMDM3LCAgLTExNzcsICAtMTE1MSwgICAtOTEyLCAgIC00NjYsICAgIDMwMywgICAxNjAxLCAgIDQwODksCisgICAgIC0xMjM0LCAgIDMxNjAsICAgLTYzMSwgIC0xMDkwLCAgIC03NDEsICAgLTI3NCwgICAgMTAzLCAgICAgMTMsCisgICAgICAgMzU2LCAgICAyODksICAgMjcwOSwgIC0xMTE1LCAgLTEwMTEsICAgLTk2NSwgICAtOTQ4LCAgIC01NjMsCisgICAgICAxOTM5LCAgICA4NzAsICAgMTE4NywgICAgNTUwLCAgLTEwMjgsICAtMTIxNywgICAtNzI2LCAgIC05NTQsCisgICAgICAtNjk0LCAgIC03NTMsICAgMzcyOSwgICAgMTQxLCAgICA1MTgsICAgIDg1NCwgIC0xMTAyLCAgIDExMzgsCisgICAgICAtOTQ3LCAgIC02MjAsICAgLTM3OSwgICAtNDM2LCAgICAgNzIsICAgIDQ0OSwgICAgNDMyLCAgICA0MjgsCisgICAgIC0xMTEyLCAgIDEyNzYsICAgIDU0NCwgICAtMzM0LCAgIC00NDUsICAgIDE3OSwgICAgLTMyLCAgICAtMzcsCisgICAgICAgICA5LCAgICAgMjgsICAtMTI1MiwgICAyOTgzLCAgIC05NjMsICAgMTI1NiwgICAgNDE5LCAgICAtMTAsCisgICAgICAgIDE3LCAgICAyMTEsICAgIDIxOCwgICAgMTkxLCAgICAxMjYsICAgLTk0MiwgICAtNjkxLCAgIC01MjksCisgICAgICAtNTMzLCAgIC0xOTMsICAgMTIxNiwgICAgMTUwLCAgICAzODksICAgIDE1MiwgIC0xMTkxLCAgIC05ODcsCisgICAgICAtOTQyLCAgIC04NjAsICAgLTQ2MywgICAtNzA1LCAgIC0xNTksICAgIDE4NCwgICAxODkzLCAgIDEwODAsCisgICAgICAxNzUzLCAgIC02OTQsICAgLTYwOSwgICAtNjk5LCAgICAgNjEsICAgIDI2OSwgICAtMTI2LCAgICAgOTMsCisgICAgICAgMjM2LCAgICAzODAsICAgLTUyNywgICAtOTY2LCAgIC0zMzQsICAgIDE2MywgICAtNjYyLCAgIDMyOTUsCisgICAgICAtNDc3LCAgICA1OTEsICAgIDI1OSwgICAgNjM4LCAgICAzOTcsICAgIDE4MSwgICAtNTk4LCAgIC0xMjksCisgICAgICAgIDM1LCAgICAtNTEsICAgLTEyMiwgICAgIDY0LCAgICAtMzIsICAgIC05OCwgIC0xMzUxLCAgLTExNDAsCisgICAgICAzMzcyLCAgIC03NTMsICAgLTc3NiwgICAgNzE4LCAgICA1MTMsICAgIDEzNCwgICAgNDIwLCAgICAzNTQsCisgICAgIC0xMTI4LCAgIC01NDYsICAgLTc0MywgICAgMjk3LCAgIDE4MTksICAgIC03NywgICAgMTc5LCAgICAgMTcsCisgICAgICAgMTgxLCAgICAyMDYsICAtMTAyOCwgIC0xMDI3LCAgIC03NTcsICAgLTc1NSwgICAtMzg5LCAgIDEwMzUsCisgICAgICAgMjI3LCAgICAyNDksICAgIDMxNSwgICAgMzk1LCAgIC05MzEsICAgLTg4MSwgICAxMjA3LCAgIC03NzcsCisgICAgICAtMTY1LCAgIC01MzEsICAgLTM3NSwgICAgIDczLCAgICAzNDYsICAgIDMzMiwgIC0xMTU5LCAgIC03ODgsCisgICAgICAxMTk2LCAgICA5NTksICAgLTQzMiwgICAtMzM3LCAgICAyNDMsICAgIDE3NiwgICAgMzIxLCAgICAgLTcsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBmY2I4bVtdID0geworICAgICAtMTM3OSwgIC0xMzMxLCAgLTEyNzcsICAtMTI2NiwgICAtOTI3LCAgICAgIDAsICAgMjU1MiwgICAyNTc1LAorICAgICAgIDQyNSwgICAgIDQ4LCAgIDI1NjgsICAgIC0yNiwgICAtODQxLCAgIC03NjIsICAgLTY3OSwgICAtNTYyLAorICAgICAgLTQyMCwgICAgMTg2LCAgICAgNjgsICAgICA2OSwgICAtNzQzLCAgIC0xOTMsICAgIDI2NiwgICAgIDkyLAorICAgICAgMTcxNCwgICAtMjQxLCAgIC0zNTcsICAgIC05MywgICAtMjUyLCAgIC0yMjIsICAgLTg4NCwgICAtMzg1LAorICAgICAgMjQzNiwgICAtNDQ2LCAgIC0xNTAsICAgLTUzMywgICAtMTkyLCAgICAtMzMsICAgIDIyNiwgICAgICA4LAorICAgICAgLTc1NiwgIC0xMTgwLCAgLTEyMzgsICAtMTI1OCwgIC0xMjUwLCAgLTExNDcsICAgLTc2NCwgICAgMTQxLAorICAgICAgMzA3NSwgICA0MTM2LCAgLTEyNTUsICAtMTI4OCwgIC0xMjAyLCAgLTExODgsICAtMTIyMiwgIC0xMjU3LAorICAgICAgLTUwMCwgICAxOTg5LCAgIDQwNjIsICAgMTMyOCwgICAtMzAwLCAgIC0xODYsICAgLTM5OSwgICAtMzI5LAorICAgICAgLTMzMCwgICAtNTMzLCAgIC0zMTMsICAgMjAzMCwgICAgMTkzLCAgIC0xMjgsICAgLTkzMywgIC0xMDE2LAorICAgICAgICA2NiwgICAxNjQ4LCAgIC0yMjgsICAgLTMyMSwgICAgMjM2LCAgICAxMTQsICAgIDM1NiwgICAgMjEyLAorICAgICAgLTY3NywgICAtODI2LCAgIC03ODQsICAgLTY3MCwgICAtNDg0LCAgIC00MjMsICAgLTE4OCwgICAgMjE1LAorICAgICAgMjQ3NiwgICAgNjUyLCAgIDM0MjQsICAgMTk5MSwgICAgOTQwLCAgIC01NzYsICAgLTk0MiwgIC0xMDM4LAorICAgICAtMTA5NywgIC0xMTYxLCAgLTExMjAsICAgLTk1NiwgICAtNzYzLCAgIC00MTYsICAgMjgyNCwgICAxNDI5LAorICAgICAgLTY5MywgICAtNzU1LCAgIC00NTUsICAgLTY3MCwgICAtNTM1LCAgIC0yMjUsICAgNDgxNCwgICAgMTE2LAorICAgICAgLTk0MCwgICAtOTUzLCAgLTEwMDgsICAgLTg1NiwgICAtNzk3LCAgIC01ODIsICAgLTUzMSwgICAtMjEzLAorICAgICAgLTQxMiwgICAyNDc5LCAgIC0xNTYsICAgLTIxOCwgICAtMzE5LCAgIC0xNjgsICAgLTIzNiwgICAtMjQ4LAorICAgICAgLTMwNSwgICAtNTE1LCAgIC0yMjQsICAgLTM4MiwgICAtNTAxLCAgIC03NTksICAgIDEzOSwgICAxNzg5LAorICAgICAgLTI1OCwgICAtMzQzLCAgIC0xNjcsICAgIDcyMSwgIC0xMDE0LCAgLTEwOTIsICAgLTk3NSwgIC0xMDcwLAorICAgICAtMTEyNiwgICAtNzc4LCAgIC0xNzgsICAgICAzNiwgICAgNTIyLCAgIDUzNzEsICAgLTQwMiwgIC0xMzUxLAorICAgICAtMTU3NywgIC0xNjYyLCAgLTE2NDIsICAtMTU2MCwgIC0xMjQ5LCAgIC04NzAsICAgIDYwMiwgICA4OTY4LAorICAgICAtMTEyNiwgIC0xMTAyLCAgLTExMTgsICAtMTA3MiwgICAtOTQ2LCAgIC01MTEsICAgIDQ4MiwgICAxNjM1LAorICAgICAgMTEwOCwgICAyNDcxLCAgIC05MzUsICAgLTc0OCwgICAtMzAyLCAgIC00NDUsICAgLTgxMCwgICAtMzU5LAorICAgICAgMTQzMywgICAgLTgzLCAgICAzMzYsICAgMTgzNCwgICAtNzEyLCAgIC03NzMsICAgLTc1MiwgICAtNjA5LAorICAgICAgLTM5MSwgICAgNjI1LCAgIDI1NTAsICAgIDQwMywgICAtNDQ3LCAgICAtMTgsICAgLTI2MSwgICAgIDkxLAorICAgICAgNTA5NiwgICAtMTk5LCAgIC04ODcsICAtMTAxOCwgICAtNzI4LCAgIC05MzAsICAgLTkyMSwgICAtNjg0LAorICAgICAgIC0yMiwgICAyNDIyLCAgIDIxMTgsICAgLTQxNywgICAtNzU3LCAgIC03ODksICAgLTczMiwgICAtNzk0LAorICAgICAgLTc4NSwgICAtNjY0LCAgIC02MjcsICAgIDg4NSwgICAgNDcxLCAgICA3OTgsICAgLTQyOSwgICAtNjg0LAorICAgICAgLTQ1NCwgICAtMTg1LCAgICAxODUsICAgIC0yNiwgICAtOTkwLCAgIC0zNjksICAgMTA0OCwgICAgLTI1LAorICAgICAgIC05OCwgICAgNzIwLCAgICAgNDEsICAgIC02MCwgICAgIC0zLCAgICAtOTIsICAgLTc5MCwgICAtMTQ3LAorICAgICAgIDg0NiwgICA0MDA3LCAgIC0zNDYsICAgLTkwNywgICAtODQ5LCAgIC03MzAsICAgLTYzOSwgICAtODQyLAorICAgICAgOTA5NiwgICAgNjE3LCAgLTExNjQsICAtMTI3NSwgIC0xMzgwLCAgLTEzOTYsICAtMTM5MSwgIC0xMzY0LAorICAgICAtMTM0MiwgIC0xMDgwLCAgICA2NTUsICAgNTY4NywgICAgNTA1LCAgIC04MTgsICAtMTEzNCwgIC0xMTI1LAorICAgICAtMTEzNiwgIC0xMTIzLCAgLTEwODgsICAgLTk5NiwgICAgICAzLCAgICAgMzYsICAgIC00OCwgICAgLTI4LAorICAgICAgIDEyMSwgICAgLTU1LCAgICAxNzIsICAgIC00MywgICAgIDIxLCAgICAtNzQsICAgMTUzNywgICAgLTY5LAorICAgICAgIDM3OCwgICAgLTM4LCAgIC0xMTMsICAgIDE1OSwgICAtMTQ5LCAgIC02MDksICAgLTY5MywgICAtNzk2LAorICAgICAgLTcxNSwgICAgNTg4LCAgICAzNzYsICAgLTc0NCwgICAtNjU5LCAgIC0zMTYsICAgIDE0NSwgICAgNDQ4LAorICAgICAgIDY1OSwgICAgMzIwLCAgICA3ODcsICAgLTMxNSwgICAtOTU2LCAgIC02ODIsICAgLTU5NSwgICAtMzI3LAorICAgICAgIDE0NiwgICAgMzQ4LCAgICA4MzcsICAgIDU3NywgIC0xMDExLCAgLTEwMTQsICAgLTY0NywgICAtMTU5LAorICAgICAgIDY3OSwgICAgMTU4LCAgICAyOTQsICAgIDY3MCwgICAgNTA3LCAgICA1NDAsICAgIDQxOCwgICAgNTU4LAorICAgICAgICAxMiwgICAtNjc0LCAgIC05MDEsICAgLTg5NywgICAtODI3LCAgIC02ODIsICAgIDMyMywgICAyNTgwLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiOHNsW10gPSB7CisgICAgIC0xMjY5LCAgLTE2MzcsICAtMTM0OSwgIC0xNjcyLCAgLTE0MjEsICAgMjc1MCwgICAgMjEyLCAgIDM1NjMsCisgICAgICAgLTc0LCAgIDE1NTUsICAtMTQ5NSwgIC0xMTQ4LCAgLTExNzIsICAgMTM1MSwgICAtNDg0LCAgIC00NzMsCisgICAgICAxNDE4LCAgICA1NTcsICAgIDg5OSwgICAgNjM1LCAgIDYxMjQsICAtMTE0MCwgIC0xMTU0LCAgICA3ODMsCisgICAgIC0xNDQ0LCAgLTE1MDksICAtMTA0MSwgICAxNzkzLCAgIDQ0NTksICAgMTMyNSwgICAyMDU1LCAgIC05MjEsCisgICAgICAtNzk0LCAgIC03MTMsICAgMTYyNSwgICAgLTUwLCAgICAgNzgsICAgLTE1OSwgICAgMzYxLCAgICA4NTUsCisgICAgIDEwMjgyLCAgLTE1MzMsICAtMTEwNSwgIC0xNTgyLCAgLTE3MDQsICAtMTY5NywgIC0xNDQwLCAgLTEwMDEsCisgICAgICAgODY0LCAgIDIwMzgsICAtMTM0NywgICAtODQ3LCAgLTE0MTksICAgMTQ3NCwgIC0xMzY5LCAgLTExODksCisgICAgIC0xMTI1LCAgIC02NTUsICAgLTEzNCwgICAgOTUwLCAgLTEzOTgsICAgLTIyMiwgIC0xNDk4LCAgLTEyNjIsCisgICAgICAyNTk3LCAgICA3MjksICAgMjUyMSwgICAtNTQ0LCAgICA0NTcsICAgMjA1OCwgICAzODIxLCAgLTE1NjgsCisgICAgIC0xNTc3LCAgIDIwMTMsICAtMTcxNywgIC0xNjIwLCAgLTEyOTIsICAgMjc3MSwgICAyNTU5LCAgIDQ5NDIsCisgICAgIC0xNDk3LCAgLTE1NzYsICAtMTcyNCwgIC0xNTUwLCAgLTE3NzUsICAtMTczNCwgIC0xMDk3LCAgIC02MzUsCisgICAgICAxOTM0LCAgIDI3MDYsICAtMTM5OSwgICAtOTk0LCAgIDE2ODUsICAtMTE0MiwgICAtNTExLCAgIDE1OTUsCisgICAgICAtMjc1LCAgICA4NjEsICAgIDQ4NCwgICAgOTU4LCAgLTEzNzQsICAgLTc2NCwgIC0xMTA1LCAgLTE0OTMsCisgICAgIC0xNjc4LCAgLTE2MzAsICAgLTUyMSwgICA1MTM4LCAgICAgNTMsICAgMTMzMSwgICA0OTA5LCAgLTEzNzYsCisgICAgICAyMTM0LCAgLTE2MzgsICAgMTU2MiwgIC0xNTY1LCAgLTE0ODcsICAtMTYyNSwgICAzMjMyLCAgIDQ3NDIsCisgICAgIC0xMDE3LCAgLTEzNTMsICAtMTIxMiwgIC0xNTg1LCAgLTEzMDksICAtMTEzOSwgICAgLTcxLCAgIC04MjAsCisgICAgICA1OTI4LCAgIDI5ODcsICAgLTY0MSwgIC0xMzE0LCAgLTExOTgsICAtMTE4MiwgIC0xMDA1LCAgIC01NDIsCisgICAgIC0xMjg3LCAgLTEyMTAsICAtMTEwMywgICA2ODY1LCAgLTExMzAsICAgMTM3NSwgICAtODg0LCAgIDEyNDEsCisgICAgICAtNTMyLCAgIC0xNzMsICAgIC02OCwgICAgIDE1LCAgICAzMDksICAgIDE5MiwgIC0xMTI4LCAgLTExMDcsCisgICAgICAtODQ5LCAgLTEzNDMsICAgMjIzMywgIC0xMjgxLCAgIC01MzUsICAgLTY3OSwgICAzODc4LCAgIDE4NjUsCisgICAgIC0xNDI3LCAgIDQ1MDgsICAtMTAyMiwgICAtNzQ3LCAgLTExMTcsICAtMTEwNCwgICAgLTMzLCAgICA2NjksCisgICAgICAxMjE2LCAgIDE0ODIsICAtMTM2MCwgIC0xMDc1LCAgLTE0ODMsICAtMTM5MCwgIC0xMzY2LCAgIC03NTQsCisgICAgIC0xMDQyLCAgIC03NjYsICAgMzQ2NywgICAtNjI0LCAgIC05NjgsICAtMTEwMSwgICAtMzkzLCAgIC04OTAsCisgICAgICAtNDQ3LCAgIC05OTUsICAgMjM0NiwgICAtOTA5LCAgIC03ODQsICAgIDk3NywgIC0xMTQxLCAgLTEyMDEsCisgICAgICA1MjU2LCAgLTE1NTIsICAgLTUzNiwgIC0xNDE5LCAgICAgIDAsICAgIDU5NiwgICAgNTU2LCAgIDE2NTQsCisgICAgIC0xMTI0LCAgLTEyMjUsICAgLTgzMCwgICAxMjY3LCAgIC03MTksICAgMTc5MSwgICAtNTQ2LCAgIC0yOTcsCisgICAgICAgOTc4LCAgICAzNzgsICAgMjY3NCwgIC0xMjYxLCAgLTExNTksICAgLTk1MSwgIC0xMDI3LCAgIDI1MzcsCisgICAgICAtNDcwLCAgIC0zNjAsICAgLTI2OCwgICAxMDk4LCAgLTExNTQsICAtMTUxMywgICAtNzI5LCAgLTE0NTUsCisgICAgICA1NjcxLCAgLTEyMzYsICAgLTgwMCwgICAtODc0LCAgIDE2MzAsICAgMTI3MywgICAxOTA5LCAgIC02MjMsCisgICAgICAtNzI0LCAgIDE0MTcsICAgLTU1OSwgICAtMzI2LCAgIC0yNTcsICAgLTE4OSwgICAgMjY1LCAgICAyMjAsCisgICAgICAtMjg0LCAgLTEzMDIsICAtMTI3MiwgIC0xMjIzLCAgIC04NDIsICAgNDMzOCwgICAtOTM0LCAgLTEwMDEsCisgICAgICAtNDk1LCAgIDI5NDQsICAgNDI5NSwgICAtOTI0LCAgLTEwMDQsICAtMTA5NywgIC0xMDI0LCAgIC0zMjgsCisgICAgICAxNzM2LCAgICAxMDYsICAgIDQ1MiwgICAgMTU4LCAgLTEwMjQsICAgLTU0MSwgIC0xMjk2LCAgIDQzNzYsCisgICAgIC0xMTE3LCAgLTEyMjQsICAgLTg0MywgICAxMDk3LCAgIDExMjEsICAgMTI1MSwgICAtODI5LCAgLTEzNzQsCisgICAgICAyMjkyLCAgLTE1MDUsICAgMTg1MCwgIC0xMTUzLCAgIC05NDMsICAgLTk3OSwgICAtNTM0LCAgIDE0NDQsCisgICAgIC0xNTEwLCAgLTE0OTQsICAtMTE0NywgIC0xMzk3LCAgIDE1MzUsICAgLTc5NCwgICAgLTIxLCAgIDEzMTMsCisgICAgICAgNjM4LCAgIDEwMTUsICAtMTA3MiwgIC0xMjc1LCAgLTExNjYsICAtMTYwMiwgIC0xNjE4LCAgLTEzNzksCisgICAgICA0NTQxLCAgIC0yMjYsICAgMjE2OSwgICAgODg4LCAgLTEzNjksICAgMjM5MiwgIC0xMDg3LCAgIC05NDgsCisgICAgICAxMDc0LCAgICA2NzQsICAgIDM4NCwgICAgMTI0LCAgICA1MDAsICAgIDc0OSwgICAgMzk4LCAgLTEwOTEsCisgICAgICAtNzIxLCAgIC0xMTQsICAgIC0xNSwgICAgNDEzLCAgICAyMDAsICAgIDEzNSwgICAgMjkwLCAgICAxODksCisgICAgIC0xMTg1LCAgLTExODgsICAtMTMzOSwgIC0xNTQ5LCAgIC04NzEsICAgLTU3NCwgICAyMzMzLCAgIC0zNDYsCisgICAgICAgNTU0LCAgIDM3NzMsICAtMTI0NywgIC0xNTMxLCAgLTE0MDgsICAtMTMxMCwgIC0xMDA3LCAgIDI4NjEsCisgICAgICAyNDY1LCAgICA2MDgsICAgMTA4MCwgICAxMjI0LCAgLTExMDMsICAtMTQ3NywgICAxODg0LCAgLTE0MTIsCisgICAgICAtOTA0LCAgLTE0NzMsICAgLTg0NiwgICAtMTg4LCAgICA3ODIsICAgMjA0OSwgIC0xNDczLCAgIDE1MzEsCisgICAgIC0xNTMwLCAgLTE0NTksICAtMTU0NiwgIC0xMjYwLCAgIC04NTYsICAgMTE5MSwgICAgNjUyLCAgICA5MzMsCisgICAgICA1MDcyLCAgLTE0NTYsICAtMTY1MywgICAzNzU5LCAgLTE3NTEsICAgLTUzMSwgIC0xMzkxLCAgIDQyOTcsCisgICAgICAtMzc0LCAgIC03NTEsICAtMTU3MCwgIC0xMjQyLCAgIDE0NjEsICAtMTI4NiwgICAtOTEzLCAgIC02MjEsCisgICAgICAxNzY4LCAgIDEyNDYsICAgMTI5MSwgICAgNzc5LCAgLTEzNjAsICAgMTY0MSwgICAxMTIyLCAgIC02MjksCisgICAgICAtMzI4LCAgIC0xOTcsICAgIDI0MSwgICAgMzU5LCAgICA1NjAsICAgIDUzNiwgIC0xNDc0LCAgIC01MDYsCisgICAgIC0xNTIzLCAgICAyOTgsICAtMTU1MSwgIC0xMjU0LCAgIC05ODUsICAgMzYwMywgICA0MzE3LCAgICA5NTgsCisgICAgICAtODg1LCAgIC0yNDEsICAtMTE1OSwgICAtOTMwLCAgLTEyNDksICAgMTQ5MCwgICAtODI1LCAgICAyNzQsCisgICAgICAgMzQ3LCAgICAzMDcsICAtMTA2MCwgIC0xMDI3LCAgIC04MDksICAtMTA2MywgICAxNTU0LCAgIDE3MDgsCisgICAgICAtMjQyLCAgICAtMjMsICAgIDQyNCwgICAgODA0LCAgLTEzMTcsICAgLTg1MywgICAxNTcxLCAgIDE4OTgsCisgICAgICAgMjM5LCAgIC01NTYsICAgIDI5OCwgICAtMTYxLCAgICA3NzcsICAgIDc2NSwgIC0xNDY0LCAgIDEwNTMsCisgICAgIC0xMTk4LCAgLTExNTYsICAgLTkxNywgICAgICAwLCAgIDE0NjAsICAgIDQ0NywgICAxMTc4LCAgICA2MjksCisgICAgIC0xNDU1LCAgLTE1OTEsICAgIDI5NiwgIC0xNzg1LCAgLTE2OTQsICAtMTYzMSwgICAzNjY5LCAgIDM4MTksCisgICAgICAzNDM3LCAgIDMyNzQsICAgLTk1NiwgICAtNjY2LCAgIC04NzQsICAgLTI4NCwgICAtODU4LCAgIC0yMDIsCisgICAgICAtNjg3LCAgIDE3MjgsICAgLTUxMiwgICAtOTUxLCAgIDQ2OTIsICAtMTM2MCwgIC0xMjQyLCAgLTExODgsCisgICAgIC0xNTEzLCAgIC00NDksICAtMTU2NiwgIC0xNTE1LCAgLTEyMjYsICAgMzg1NywgICAxMjQ2LCAgLTEyMjUsCisgICAgICAtODYwLCAgLTEwNjgsICAgLTc0OCwgICAgLTI3LCAgICAzODAsICAgMTE5MCwgICAgNTkxLCAgICA1NTIsCisgICAgIC0xMzkxLCAgICAxOTQsICAgLTc2MywgICAtNDYzLCAgICAzMzEsICAgLTI2NSwgICAgNzAyLCAgICAxODEsCisgICAgICAgMjkwLCAgIC0xNDUsICAgLTgzOCwgIC0xMzU5LCAgLTEzODEsICAtMTU2OSwgIC0xMzk5LCAgLTEwODgsCisgICAgIC0xMzU3LCAgLTEyOTUsICAgLTQ4NiwgICAtNjEyLCAgIDE2MzgsICAgLTU4NiwgICAxNDU4LCAgIC03NzQsCisgICAgICAtMjIzLCAgIC02MjAsICAgLTEwNCwgICAgMTg5LCAgICAzNDQsICAgIDI2OSwgICAxNTU1LCAgIDE0MjgsCisgICAgICAtODY3LCAgIC02MjEsICAgLTI5NCwgICAtMjA2LCAgICAgMzIsICAgIDIzNSwgICAgMjYxLCAgICAxNjEsCisgICAgIC0xMDIxLCAgIC0xMDUsICAgIDY1NCwgICAtMjM1LCAgIC0yODIsICAgICAtNywgICAgMTg5LCAgIC0xNTksCisgICAgICAtMjE4LCAgICAxMTMsICAtMTA5NiwgIC0xMzE4LCAgLTEyNTYsICAtMTMzNSwgICAtOTMxLCAgIC00NzYsCisgICAgIC0xMDQxLCAgLTExOTksICAtMTEzNCwgICAyNzgxLCAgLTE0NzksICAtMTIyMiwgIC0xMzk3LCAgIC04NjcsCisgICAgICAtODE1LCAgIC02NjEsICAgIDc0MCwgICAtMjQwLCAgIDExNTgsICAgIDczNSwgIC0xNDM1LCAgLTEwMDMsCisgICAgICAgMzUxLCAgIC05OTAsICAgLTI0NSwgICAgLTcyLCAgIC0zNDcsICAgIC03MiwgICAxNDA4LCAgICA2MzQsCisgICAgIC0xNjk3LCAgLTE3MjcsICAtMTUzNCwgIC0xNzE2LCAgLTE0MzYsICAgLTEwMiwgICAgNDAyLCAgIDE1MTgsCisgICAgICAxOTAzLCAgIDEzMTEsICAtMTQ3NywgICAtOTMwLCAgIC0zNTUsICAgIDUwOCwgICAtMTYyLCAgICAgMjEsCisgICAgICAgLTQ2LCAgICA0NTQsICAgIDM4NywgICAgMTczLCAgLTEzMTIsICAtMTI4NCwgIC0xNDg2LCAgLTExNzIsCisgICAgIC0xMzU2LCAgIC05NjUsICAtMTEwNiwgICAxNzYwLCAgIC02NzAsICAgMjE2MywgICAgLTcwLCAgICA0MTcsCisgICAgICAtNTU5LCAgIC02NjcsICAgLTU0NSwgICAtOTQ1LCAgIC00MjksICAgLTM2MywgICAgMTU3LCAgIDEyODAsCisgICAgICAyMDU5LCAgLTEzMTksICAtMTI5MSwgICAtOTc1LCAgLTEzNTQsICAtMTI0OSwgICAtNzgwLCAgIC00NzYsCisgICAgICAxNDEwLCAgIDEyNTIsICAtMTE5MywgICAtOTI3LCAgLTE0NjIsICAgIDg3MSwgIC0xMjgxLCAgLTEzMjcsCisgICAgICAtOTAwLCAgIDE1NDAsICAgMTUzMSwgICAxMjI3LCAgLTE2NTEsICAtMTMzNCwgIC0xMDczLCAgIC03NTIsCisgICAgICAtMTU0LCAgICA3MTAsICAgIDgzMCwgICAgNzczLCAgICAyNzksICAgIDMwNywgIC0xMjk0LCAgIC03OTYsCisgICAgICAtNzYxLCAgIDEwMTIsICAgMTU4MywgICAtNDIwLCAgIC0xNzcsICAgLTMyMywgICAgMTU0LCAgICA1ODIsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBmY2I4c3NbXSA9IHsKKyAgICAgLTE0ODEsICAtMTA2OSwgIC0xMDgyLCAgIC03MjYsICAgLTgxOCwgICAtNTUwLCAgIC00MTcsICAgIDM0MywKKyAgICAgICA0ODksICAgIDI3NSwgICAtODE0LCAgIC01MTAsICAgLTcxMiwgICAtOTMzLCAgIC01NTgsICAgLTIzNiwKKyAgICAgICAgMzIsICAgMzA1MSwgICAgNDUxLCAgICAzMDEsICAgLTQxNCwgICAtMjM3LCAgIC02ODMsICAgLTU5OSwKKyAgICAgIDM2MjcsICAgLTQ0NSwgICAtMjMyLCAgICAgNTYsICAgICA1OCwgICAgMTEyLCAgLTEyMjYsICAgLTYzOSwKKyAgICAgIDQwOTYsICAgLTY0NCwgICAtMjI2LCAgICAtMjMsICAgICA5MCwgICAgMTYyLCAgICAzMTMsICAgIDEwNCwKKyAgICAgLTEzODUsICAgNTYwNywgICAtNDI4LCAgIC04NjAsICAgLTQ0NywgICAtMjY1LCAgIC0xNDUsICAgLTEzMiwKKyAgICAgICAxMTUsICAgLTIwMCwgIC0xMzQ5LCAgLTEyODAsICAtMTIxNiwgIC0xMDQ2LCAgIC02NTcsICAgICA0MywKKyAgICAgIDEzMzMsICAgIDgzMSwgICAgNjc1LCAgIDExNzQsICAtMTM5NCwgICAyMjg4LCAgIDE4NDAsICAgLTY4MiwKKyAgICAgIC00OTcsICAgLTI1NiwgICAgIDIyLCAgICAgMjIsICAgIDI2MSwgICAgIDcwLCAgLTEzNjksICAgLTgyNiwKKyAgICAgIC05NzUsICAgMjI4NiwgICAtMzI5LCAgIC0yNjcsICAgIDE0MiwgICAgIDM2LCAgICA0MzcsICAgIDMxMywKKyAgICAgIDE1NzAsICAgICA1MiwgICAtNDcwLCAgICA2MjIsICAgLTI0NCwgICAtMjQ3LCAgIC0xMTQsICAgICAyMiwKKyAgICAgIC0xMTcsICAgLTU0MSwgIC0xMTY3LCAgIC01OTYsICAgLTgwOSwgICAtOTI5LCAgIC02NjksICAgLTMyNywKKyAgICAgICAxMDIsICAgIDUxNiwgICAyNzkwLCAgICA1OTcsICAtMTMxNywgICAtODcwLCAgIDEzMjcsICAgIDk4NywKKyAgICAgICAtMjUsICAgIDM5MSwgICAgLTQ4LCAgICAtODIsICAgIDIwOSwgICAtMjQyLCAgIDQ0MjQsICAgLTMxMSwKKyAgICAgIC0zOTYsICAgLTc2NSwgICAtMzgyLCAgIC0zMzYsICAgLTM2NSwgICAtNDE0LCAgICAtNzQsICAgIC0xMywKKyAgICAgIDExMjcsICAgLTU4OCwgICAxMzYzLCAgIC03MTQsICAgIDM2OCwgICAtNDUwLCAgIC0zOTAsICAgLTM2NCwKKyAgICAgICAgODQsICAgIDEzOSwgICAxODY0LCAgIDE4ODEsICAgIC0xNSwgICAtNzkwLCAgIC0yODEsICAgLTI4NiwKKyAgICAgICAgMzgsICAgLTE4NiwgICAgLTMxLCAgIC0yMzgsICAtMTI0OSwgICAgMjYyLCAgIC04NDEsICAgIDczMSwKKyAgICAgIC00MTQsICAgIC02MSwgICAtMjc0LCAgICAyODAsICAgIDEwMCwgICAgNTU3LCAgIC04NDEsICAgLTc3NSwKKyAgICAgLTEwMDcsICAtMTA2MywgICAtNjg3LCAgIC0zNzQsICAgLTM2MCwgICAgIDMxLCAgIDEwNDgsICAgMzQ3MSwKKyAgICAgLTEzODUsICAgMjQ2NCwgICAtODQwLCAgLTExMDUsICAgLTcxNCwgICAtNDAwLCAgICAgNTYsICAgIDQ0NSwKKyAgICAgICA1ODgsICAgIDQyNywgICAxNzg1LCAgLTEwOTMsICAgLTc4MywgICAtODQ3LCAgICAgNDEsICAgIC0yMywKKyAgICAgICA0NjUsICAgIDM5MiwgICAgMzgyLCAgICA0MjgsICAgLTUxOCwgICAtMjQ5LCAgICAtNTgsICAgLTc5MSwKKyAgICAgIC02ODksICAgLTU4MSwgICAzMTQ2LCAgIC0xODMsICAgIDI5NiwgICAgIDY2LCAgLTEyNDMsICAgMTA1OSwKKyAgICAgLTEwNzYsICAgLTg3NCwgICAgNDE2LCAgICA1NDQsICAgIDI1MywgICAgIDY2LCAgICAxNjgsICAgIDIxMSwKKyAgICAgLTEzODgsICAgMTI1MywgICAgMTM4LCAgIC03MjcsICAgLTUwOSwgICAgOTA1LCAgICAzMTksICAgLTI5NywKKyAgICAgICAgNjcsICAgLTUyNSwgIC0xNDcwLCAgIDIyMzcsICAgIC04NywgICAgNTQ3LCAgICA1NTYsICAgLTIzOSwKKyAgICAgICAgOTAsICAgLTE0NywgICAtMTE0LCAgIC0zMDIsICAtMTAxNywgICAtODI0LCAgIC01ODUsICAgICAyNSwKKyAgICAgICAgIDAsICAgICA2MiwgICAxNDIyLCAgIC0xNTUsICAgIC00MSwgICAtMzIwLCAgLTExMjUsICAtMTA2OSwKKyAgICAgLTExMzQsICAgLTc4MywgICAxMTI5LCAgICAgNDUsICAgIDE4MywgICAgIDQ3LCAgICA3MTYsICAgIDY3MiwKKyAgICAgICA0MDksICAtMTE2OSwgICAtOTEwLCAgIC00NDcsICAgIC0zNCwgICAgIDc5LCAgICAgOTUsICAgIDQ1NSwKKyAgICAgICA1MDQsICAgIDM4MSwgICAgMzQyLCAgIC04NzcsICAgLTUwNiwgICAtODEyLCAgIC04MDUsICAgMzAzMSwKKyAgICAgIC0yNDksICAgLTUxOCwgICAgLTY5LCAgICA1NjQsICAgIDI0MywgICAgMjYxLCAgIC0zMzIsICAgLTQzNCwKKyAgICAgIC0xNzMsICAgIC0zNywgICAgIDYxLCAgICAgNDUsICAgICAtNSwgICAgICA2LCAgLTE0MzMsICAtMTAwOSwKKyAgICAgIDE0MjgsICAgLTk1MSwgICAtNTgyLCAgICAxNTQsICAgIDE0MywgICAgNjI1LCAgICAzODMsICAgIDM4NywKKyAgICAgLTEzOTIsICAtMTIyMiwgICAtNTc4LCAgICAyMjksICAgMTI5NCwgICAgMjE4LCAgIC0xNDIsICAgIDM1NSwKKyAgICAgIC0xNDksICAgIDIwMSwgIC0xMzQxLCAgLTExMzUsICAgLTg1NywgICAtNzY3LCAgIC0yNzMsICAgMjA1OSwKKyAgICAgICAyNTUsICAgIDU3OCwgICAgMzUwLCAgICAzMTUsICAtMTA0MSwgICAtNjE3LCAgICAyNTQsICAgLTUwNCwKKyAgICAgIC0yNTUsICAgIC05NiwgICAtNTM3LCAgIC0zOTYsICAgIDM2MywgICAxMDc0LCAgLTEzNjEsICAgIDQ4NCwKKyAgICAgICA1MzgsICAgLTc4OSwgICAtNzA0LCAgIC00NDcsICAgIDIwMCwgICAgNTIxLCAgICAyMTMsICAgICA5MCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGZjYjhzbVtdID0geworICAgICAtMTE4MywgIC0xMTcwLCAgIC04NjcsICAgLTk0OCwgICAtNzQ2LCAgICA0OTIsICAgMTUzMSwgICAxNDEyLAorICAgICAgIDUyNCwgICAgIDgyLCAgICA1OTAsICAgLTk5NCwgICAtOTE2LCAgIC04NTksICAgLTY4MCwgICAgIDEyLAorICAgICAgIDc0MiwgICAgOTYxLCAgICAyMzAsICAgIDI1NSwgICAgIDM0LCAgICAgMzgsICAgLTE3NiwgICAgIC0xLAorICAgICAgMTg4MCwgICAtMjQwLCAgIC03NjksICAgLTUzMSwgICAgMjY5LCAgICAtMzIsICAgLTc3MiwgICAtNDk0LAorICAgICAgIDc1NywgICAtNTgzLCAgIC02NzcsICAgLTI4MSwgICAgNzE3LCAgICA0NDAsICAgIDU2MSwgICAgIDkxLAorICAgICAtMTEyMSwgIC0xMDU0LCAgLTExODksICAtMTEwMCwgICAtNzQ1LCAgIC00MTcsICAgIC02MSwgICAgMzAyLAorICAgICAgMzA3OSwgICAxODE3LCAgLTEzODQsICAtMTQ3OSwgIC0xNDc3LCAgLTE1MDksICAtMTA3NywgICAtMzIzLAorICAgICAgIDkwMiwgICAyMzQ4LCAgIDE0NjQsICAgMTAzOCwgICAtNDg3LCAgIC0xNzksICAgLTQ0NywgICAtMzExLAorICAgICAgLTI5NiwgICAtNDM5LCAgIC0xNzIsICAgMjE2NiwgICAgMjQ1LCAgICAtMjgsICAtMTA1MCwgICAtMzkwLAorICAgICAgLTIzOCwgICAgNjMzLCAgICAzMDIsICAgLTMzNSwgICAgODQzLCAgICAtNTIsICAgIDE4NSwgICAgMjMwLAorICAgICAgLTExMCwgICAtNDMzLCAgIC02OTAsICAgIDE0OCwgICAgIDYzLCAgIC0yODksICAgLTQwNCwgICAtNDY5LAorICAgICAgMTk0OCwgICAgMjQ1LCAgIDIwMTYsICAgMTMzNywgICAtMzQxLCAgIC01NTQsICAgLTYxNywgICAtNDU3LAorICAgICAgLTQzNiwgICAtNDU5LCAgIC00MDAsICAgLTUyMCwgICAtNjYxLCAgICAgLTcsICAgMTA3OCwgICAgOTcxLAorICAgICAgLTMyNiwgICAtMzMyLCAgICAtMjMsICAgLTc0OSwgICAgIDgzLCAgIC0xMDQsICAgMjEwNiwgICAtOTQ3LAorICAgICAgLTg2NywgICAtODgzLCAgIC03MDUsICAgLTQzMywgICAgLTM1LCAgICAxNjQsICAgIDQyNywgICAgNjQ2LAorICAgICAgLTkyNCwgICAyMTk2LCAgIC02NTYsICAgLTc5OCwgICAtMjgyLCAgICAyMTcsICAgLTIyNywgICAgMTM0LAorICAgICAgIDQ0NiwgICAgLTE1LCAgIC01ODQsICAgICAzMywgICAgMTg1LCAgIC01NzEsICAgLTE1OSwgICAxODUyLAorICAgICAgLTQwNSwgICAgLTk0LCAgICAtNjEsICAgIC04MywgICAtMzI5LCAgIC01MTYsICAgLTM5NCwgICAtNDUwLAorICAgICAgLTE3MywgICAtMTQwLCAgICAtNTQsICAgLTE1NiwgICAgMjI2LCAgIDE4NTAsICAgLTc1MiwgIC0xMzA0LAorICAgICAtMTM3OCwgIC0xMjc1LCAgLTEwMTcsICAgLTY4MCwgICAtMzM3LCAgICAzNTYsICAgMTEzMSwgICA0MTQzLAorICAgICAtMTEyMCwgIC0xMjUzLCAgLTEyNjksICAgLTg2MCwgICAgIDkwLCAgICA5NzMsICAgIDE1MiwgICAgODg2LAorICAgICAgIDYwOSwgICAxNDU0LCAgICAtMjksICAgICAzNiwgICAtMTE3LCAgIC04MTUsICAgLTY1MSwgICAtMzQ2LAorICAgICAgMjA4NSwgICAtNDE0LCAgICAgMjQsICAgIC05MywgICAtMjM1LCAgLTExMDMsICAtMTEzMiwgICAtNzU4LAorICAgICAgIC05OCwgICAxNDk3LCAgIDEyODUsICAgLTI4OSwgICAgLTM0LCAgICA0MDIsICAgLTY0NiwgICAgNjM3LAorICAgICAgMjE0NywgICAtNjc3LCAgIC0zNTAsICAgLTI2NiwgICAtMjMyLCAgICAtNjEsICAgLTE5OSwgICAtMzU5LAorICAgICAgIDE2NywgICAxNTQ2LCAgICA4MTYsICAgLTQ1MywgICAgLTM1LCAgIC0yNTEsICAgLTQ2OCwgICAtNDkxLAorICAgICAgLTM3MSwgICAtNTkzLCAgIC04NzgsICAgMTQ0NSwgICAtNzk1LCAgICA2NTEsICAgIDEwOCwgICAtMTU1LAorICAgICAgLTIwMSwgICAgLTE0LCAgICAyNTAsICAgLTI3MSwgICAtNzMyLCAgICA3OTMsICAgIDE1NCwgICAtMjg4LAorICAgICAgIC04NiwgICAgIDE2LCAgICA1NTcsICAgIDY0MiwgICAtNTkyLCAgIC01ODcsICAgIC04NywgICAtMzY1LAorICAgICAgLTMwOSwgICAxNzUzLCAgICAtNDAsICAgICA5NSwgICAtNTI5LCAgICAtODcsICAgLTIxNCwgICAtMjM0LAorICAgICAgNDk5OSwgICAtNDY2LCAgIC03NTUsICAgLTgwMCwgICAtNzg1LCAgIC03MjIsICAgLTUzMiwgICAtNzAzLAorICAgICAgLTUyNiwgICAtNDY1LCAgICA1OTEsICAgMzkzNywgICAtMjI5LCAgIC04MDQsICAgLTgwOCwgICAtNjk4LAorICAgICAgLTU3NiwgICAtNjEzLCAgIC01MDYsICAgLTcyNSwgICAgIDEwLCAgICAgMTMsICAgLTExNywgICAgLTU1LAorICAgICAgIDEwMSwgICAgIDUyLCAgICAxMjUsICAgIC03NiwgICAgLTI1LCAgICAtMjgsICAgMTQ2OSwgICAtMjQ1LAorICAgICAgICAgOCwgICAgLTI1LCAgICAgNjUsICAgIC01MywgICAtMjYyLCAgIC0yODIsICAgLTQxMSwgICAtNTg4LAorICAgICAgLTY2NywgICAxMzc0LCAgICAzMDQsICAgLTc4NywgICAtNjYxLCAgIC02NzUsICAgICA1NSwgICAgMzIwLAorICAgICAgIDcyMCwgICAgIC00LCAgICAzNjYsICAgLTEwMywgICAtMTM2LCAgIC0zMzIsICAgLTMxNCwgICAtMjkzLAorICAgICAgIC0zOCwgICAgMTI3LCAgICAxNTEsICAgIDM4MCwgIC0xMzMwLCAgLTEzMzgsICAgLTYxOCwgICAgLTQwLAorICAgICAgMTI4NCwgICAxNTAwLCAgICA0NjYsICAgLTUxNSwgICAgMTA1LCAgIC0xNjEsICAgICAxOSwgICAgNjk3LAorICAgICAgLTQxNywgICAtNTU5LCAgIC0zMTcsICAgLTcxMiwgICAtNzU2LCAgIC01NjcsICAgIDc1NCwgICAxNDgxLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMTFsW10gPSB7CisgICAgIC0xMjkxLCAgLTEyMzcsICAtMTE3NSwgIC0xMTg2LCAgLTExMzksICAgIDUyNCwgICAxMjI1LCAgIDE0NjQsCisgICAgIC0xMDQyLCAgIC03MjEsICAgLTkwMSwgICAgIDQxLCAgIC03MjgsICAgIDgyMiwgICAtNjU3LCAgIDEwNzgsCisgICAgICAtNDgzLCAgIDE1MzAsICAgLTQ4OSwgICAxMjUzLCAgICA5MjYsICAgLTMyNiwgICAgNDA0LCAgICAgODksCisgICAgIC0xMTkxLCAgLTExNzAsICAtMTIzNywgICAxNjMzLCAgIDE0OTMsICAgLTQ2NSwgICAgOTg2LCAgIDExODQsCisgICAgICAtODU3LCAgIC04MzIsICAgLTMwMCwgICAtODExLCAgIC05MzYsICAgLTY2NywgICAtMjU0LCAgICA0OTIsCisgICAgICA0MDQ0LCAgLTExMzYsICAgLTk4MywgICAtODU1LCAgIC01OTIsICAgLTE5OSwgICAgMzgzLCAgICA4NzYsCisgICAgICAyMDc2LCAgLTEwNDIsICAtMTAxOSwgICAtNzI5LCAgIDE0MzUsICAgIC0yNSwgICAgIDY0LCAgICA4NDUsCisgICAgICAtOTkxLCAgIC05MjEsICAgLTg2MSwgICAgOTE2LCAgIC00MDIsICAgLTU1MSwgICAgMjM2LCAgICA0MjksCisgICAgICA1MjUzLCAgLTEyMzMsICAtMTI2OCwgICAtNDE0LCAgIDE3OTMsICAgLTQ2MywgICAtNTY5LCAgIDE2OTMsCisgICAgIC0xMTk3LCAgIDYzMjIsICAgLTg4NywgICAtMjExLCAgIC05NDUsICAgLTU0MCwgICAgNjI2LCAgICA5MDMsCisgICAgICAtOTkzLCAgIDE1MDAsICAgLTQ5MCwgICAxNDQ1LCAgIC03NjQsICAgLTEzNiwgICAgMzIxLCAgICA1NDgsCisgICAgICAgNDYyLCAgIC0yMjgsICAgIDEyNywgICAtMzIyLCAgICA0ODEsICAgLTE4MywgICAgIDg4LCAgICAxNTUsCisgICAgICAtODA5LCAgIC04NDQsICAgLTk1OSwgICA0MDExLCAgIC01ODEsICAgLTIzMiwgICAgMzMwLCAgICA5ODYsCisgICAgICAtOTAwLCAgIC05MTYsICAtMTA2OSwgICAtODY2LCAgIC05NzksICAgLTQzOSwgICA0MDE2LCAgIDE1NTgsCisgICAgIC0xMDIzLCAgIDIxMjEsICAgMTcxNywgICAtNjEyLCAgIC01ODgsICAgLTQ0NiwgICAgMjIzLCAgICA0MzAsCisgICAgICAyNTY3LCAgIC05NzIsICAgMjExOCwgIC0xMDMwLCAgIC05MDAsICAgLTY2NCwgICAgMTgwLCAgICA4NTgsCisgICAgICAzMjMyLCAgIC05OTEsICAtMTEzMiwgICAyMTE5LCAgIC00NDYsICAgLTU0OCwgICAtMjU4LCAgICA4OTUsCisgICAgICAtOTYyLCAgIC0xODQsICAgMjYzOSwgICAxMDgxLCAgIC02NjEsICAgLTIyMiwgICAgMjkyLCAgICA1MzAsCisgICAgICAtOTUyLCAgIDE3NjcsICAgLTIxMywgICAtNzAxLCAgIDEwNzksICAgICAzNywgICAgMTMxLCAgICA0ODksCisgICAgICAtODc1LCAgIC03NDksICAgMzE2NywgICAtNzc2LCAgIDEyNDcsICAgLTEwOSwgICAgLTgzLCAgICA2MzYsCisgICAgIC0xMTQ2LCAgLTEwNzAsICAtMTAwMSwgIC0xMDY0LCAgIC05NDIsICAgMjg5MSwgICAxMTM3LCAgIDE1ODUsCisgICAgIC0xMzE0LCAgIC02MzIsICAtMTE3OSwgIC0xMTA1LCAgIDExMDEsICAgICA1MSwgICAyMDM4LCAgIDIwMzYsCisgICAgICAtOTI2LCAgIC03MjcsICAgIDE4MCwgICAxNTE1LCAgIC01NjYsICAgMTE5MSwgICAgMTAxLCAgICA1OTUsCisgICAgICAyMjQ3LCAgIC0zNjQsICAgLTMxNSwgICAtMTA1LCAgIC0xMzAsICAgIC03OSwgICAgMTIxLCAgICAyMTAsCisgICAgICA3OTk0LCAgLTEzMDIsICAgLTg5OCwgICAtNzg1LCAgIC03NTgsICAgLTc3NywgICAgIDMxLCAgICA0MTUsCisgICAgICAgNzQ0LCAgIC02NTIsICAgIDY4OCwgICAxMjI2LCAgIC02NDksICAgLTYwNSwgICAtMjY4LCAgICAzMTQsCisgICAgICAgNjExLCAgICA2NjIsICAgLTI0MCwgICAtNDExLCAgIC02OTgsICAgLTQzNCwgICAgMzc3LCAgICAzMzksCisgICAgICAgOTUzLCAgIC04MTAsICAgLTkzMSwgICAxMDU0LCAgIC00ODQsICAgLTI5OCwgICAgNzIxLCAgICA1MjIsCisgICAgICAgOTIyLCAgLTEwNDYsICAgLTk1MiwgICAtODcxLCAgIC02MTgsICAgLTI3MCwgICAgNDE5LCAgICA2MzUsCisgICAgICAxMDA2LCAgICAxMjksICAgLTgzOCwgICAtNzI0LCAgICAyMjAsICAgIDQ4MSwgICAgMjUzLCAgICAzMjksCisgICAgICAgMjA1LCAgIC00NTYsICAgLTcyNCwgICAgNjc1LCAgICA1OTgsICAgIDMzMiwgICAgLTE0LCAgICAyOTEsCisgICAgIC0xMDE2LCAgIC02OTUsICAgIDU0MiwgICAxMjcwLCAgICA0OTgsICAgLTQ1NiwgICAtMTEzLCAgICAzNjIsCisgICAgICAtNTQ3LCAgLTEwNjgsICAtMTE3OCwgIC0xMjYxLCAgLTExNjEsICAgLTkwNSwgICAgMzkwLCAgIDIyMDQsCisgICAgIC0xMDU2LCAgLTExMDIsICAgNTYxMSwgIC0xMTAwLCAgLTEwNzYsICAgLTkwMiwgICAgMzYwLCAgICA5NzgsCisgICAgICAtNTM4LCAgIC0yODYsICAgMTI1MywgICAtNDMwLCAgIC00NTcsICAgLTE0OCwgICAgIC0xLCAgICAtNjAsCisgICAgIC0xMTE2LCAgIC05NTUsICAgMjg2OSwgICAtOTI2LCAgIC02ODAsICAgMTExMSwgICAgNzA2LCAgICA4NDIsCisgICAgIC0xMzExLCAgLTEyNzUsICAtMTE1MCwgICAtMjM2LCAgICA2NzUsICAgIDg5NywgICAgNzU4LCAgICA5MTIsCisgICAgICAxODg2LCAgLTExMTUsICAgLTk5OSwgICAgLTg0LCAgIC01ODgsICAgMjE5MCwgICAtMTcxLCAgICA3MzksCisgICAgICAtNzM3LCAgICAxNTAsICAgLTkwMiwgICAtODU0LCAgIC05MTcsICAgIDMzNCwgICAgNTU3LCAgICA1MzQsCisgICAgICAtODUxLCAgICAtMzksICAgIC0yNSwgICAgMjE0LCAgIC0xMzYsICAgIC03MywgICAgMjYzLCAgICAyMzQsCisgICAgIC0xMDIxLCAgIDEzMzIsICAgLTU0MywgICAtNjU1LCAgIC03MTIsICAgLTY1MSwgICAgIDgwLCAgICA0NzksCisgICAgICAxNTU1LCAgIDE5MzMsICAgLTcwNywgICAtNDg1LCAgIC0yMDYsICAgIDEzOSwgICAgMzEyLCAgICA0MDUsCisgICAgICAyNDcyLCAgLTExNzIsICAgLTk0NSwgICAtOTM5LCAgIC03MTMsICAgIDU2OCwgICAxNDIxLCAgICA2ODQsCisgICAgICAgIDcwLCAgLTEyNjMsICAtMTIzNSwgICAgNTg2LCAgIC0xOTUsICAtMTA2NSwgICAtNDQ5LCAgIDMxODIsCisgICAgIC0xMTQzLCAgICA1MjksICAgLTkyNiwgICAtNTU4LCAgICA0MTksICAgIDM5MCwgICAgMzc1LCAgICA1NjMsCisgICAgIC0xMDkwLCAgIDMzNzAsICAgLTY4OCwgICAtNTI4LCAgIC0zNDYsICAgIDEzNiwgICAgMzE3LCAgICA2MTUsCisgICAgICAtODAzLCAgIC05NzcsICAtMTA4MiwgICAtODA2LCAgIDM2MDcsICAgLTQ0MywgICAtMTU2LCAgIDExMzAsCisgICAgIC0xMjg4LCAgIDE1ODUsICAtMTIxOCwgIC0xMjI2LCAgIC05NzksICAgIDM1OSwgICAxNTU1LCAgIDE0MDIsCisgICAgICAtMzQxLCAgIC00MTYsICAgLTQ4MCwgICAtMzYwLCAgIC00MTUsICAgIDU0MiwgICAtMTQ4LCAgIC0zMjIsCisgICAgIC0xMDk1LCAgLTEwNzQsICAgIDc2MiwgICAtODY0LCAgIC02MzQsICAgMTc3MCwgICAgMzQwLCAgICA0NjYsCisgICAgIC0xMDQwLCAgIC04MzQsICAgMTUwOCwgICAtNzA3LCAgICAxNDMsICAgICA3NCwgICAxNDE4LCAgICA5MDUsCisgICAgIC0xMDk0LCAgIC03MTAsICAgLTU0OSwgICAtODYwLCAgICAzNzMsICAgMTQ5MiwgICAyMDI0LCAgICA3NDEsCisgICAgICAtOTM4LCAgIC05MTAsICAgMjY2MSwgIC0xMDg3LCAgLTExMDUsICAgLTkwMSwgICAgMzgzLCAgICA5MDYsCisgICAgICAgNzU1LCAgIC04MTksICAgIDU4MSwgICAtNjEyLCAgIC00MjAsICAgIDMwNSwgICAgMzQ0LCAgICAzNjMsCisgICAgICAtMzU2LCAgIC05OTEsICAgLTg0NSwgIC0xMDUxLCAgIDIxMTIsICAgMTczOCwgICAgNTU0LCAgICA5NTQsCisgICAgIC0xMDI4LCAgIC05NDMsICAgLTg5MiwgICAtODk2LCAgIC0yMzYsICAgLTY3NCwgICAxMDc2LCAgICA2NzksCisgICAgICAtNjExLCAgLTEwOTksICAgLTg1OSwgICAtOTE0LCAgIC00NDQsICAgIDkxMCwgICAgNDkxLCAgICA3MDksCisgICAgIC0xMDYzLCAgICA3NzUsICAgIDQ5NiwgICAtNjY5LCAgIC0zMDQsICAgIDY3MiwgICAgMjYxLCAgICA0OTYsCisgICAgIC0xMDg2LCAgIC05NjMsICAgMTAzNywgICAtNjM5LCAgIC0xMzQsICAgLTU3NywgICAgIDMzLCAgICA2MDcsCisgICAgIC0xMDcwLCAgIC02NDksICAgIDczMCwgICAtNzQ4LCAgIDE4ODQsICAgIC0xOCwgICAgMzQ2LCAgICA2MjcsCisgICAgIC0xMDg5LCAgLTExMTgsICAgLTk1NSwgICAgNzUxLCAgIC02OTAsICAgIDYwNiwgICAxMjA0LCAgIDEwMzcsCisgICAgIC0xMDE2LCAgLTEwOTUsICAgIDQ3MywgICAtOTE5LCAgLTEwMzYsICAgLTY4NSwgICAxNzQ0LCAgIDEyMTYsCisgICAgICAtODM0LCAgIC05MTYsICAgLTkyMCwgICAtNjM0LCAgIDEwODYsICAgLTQ3NCwgICAgMTYxLCAgICA2MjAsCisgICAgICAtOTk3LCAgIC04OTksICAgIC0yNSwgICAtNDk5LCAgICAzOTksICAgIDQwNSwgICAgMTYzLCAgICA0MDEsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBmY2IxMXNbXSA9IHsKKyAgICAgLTExNDgsICAtMTEzNCwgIC0xMDAwLCAgIC01ODUsICAgIDcxNSwgICAgNzc0LCAgICA2MjYsICAgIDY1MCwKKyAgICAgIDIxMDksICAgLTg5OCwgICAtNzI5LCAgIC0yMzksICAgLTIxMywgICAgODQ3LCAgICAgNzcsICAgIDM3MSwKKyAgICAgIC05MDIsICAgLTc5MCwgICAxODUzLCAgIC04NzEsICAgLTgxNiwgICAgMTYzLCAgICAyOTUsICAgIDM3NywKKyAgICAgIDE3MTgsICAtMTA3MCwgICAtODQwLCAgIC03OTEsICAgMTYxMiwgICAtMTI5LCAgICAxNDQsICAgIDQ1MCwKKyAgICAgIC04MzAsICAgMTkwOSwgICAtNTM5LCAgICA4MDMsICAgLTQxMSwgICAtMTg4LCAgICAxMjIsICAgIDE0OCwKKyAgICAgIDEyMDIsICAgIDcwNSwgICAtNjk2LCAgIC01NzgsICAgLTIxMywgICAgLTI1LCAgICAxMjYsICAgIDE0MiwKKyAgICAgIDMzMDksICAtMTA4MywgICAtODY1LCAgIC03NzEsICAgLTQ3MCwgICAtMjM3LCAgICA5ODAsICAgIDUyMSwKKyAgICAgICA0MjgsICAgLTk5NSwgIC0xMDAzLCAgIDMwODgsICAtMTAwMCwgICAtNDU1LCAgICAzMjAsICAgIDUwMywKKyAgICAgIC02MTUsICAgMTc0NiwgICAtNzUxLCAgIC03MzQsICAgMTA5MiwgICAgIDMxLCAgICAgOTcsICAgIDIyNSwKKyAgICAgLTExNzUsICAgMjI4NywgICAxMjc4LCAgIC00MjEsICAgLTMxNSwgICAgIDkxLCAgICAxMzAsICAgIDEyMCwKKyAgICAgLTEyMDMsICAgNDIxMSwgICAtOTcwLCAgIC04NzgsICAgLTIyOCwgICAgIDcxLCAgICAzMjcsICAgIDI4OCwKKyAgICAgLTEwMTIsICAgLTg1MCwgICAxNDcxLCAgIC03MzIsICAgMTIyOCwgICAgMjAxLCAgICAxNDYsICAgIDI3MSwKKyAgICAgIC04NjgsICAgLTUyOCwgICAxMTk2LCAgICA3NDQsICAgLTE4NiwgICAgIDg1LCAgICAgMzgsICAgIDE1MywKKyAgICAgLTEwODEsICAgLTg5NSwgICAtNzQyLCAgIDEwMTQsICAgMTExMCwgICAgIDY2LCAgICAyMzcsICAgIDMzNSwKKyAgICAgLTEwMTIsICAtMTEzNywgICA0MzU3LCAgLTEwNjIsICAgLTU2OSwgICAgMzc3LCAgICAyNjgsICAgIDQ0NSwKKyAgICAgIDEyMDMsICAgLTcxNywgICAxMDcwLCAgIC01NDEsICAgIC03MiwgICAgLTI5LCAgICAgOTEsICAgIDEwNCwKKyAgICAgIDY0NDgsICAtMTE0OCwgIC0xMDY5LCAgIC04MTAsICAgLTY1OSwgICAgMTE4LCAgIC0yODQsICAgIDMwMCwKKyAgICAgLTEwODUsICAgLTk0MCwgICAtMjE0LCAgIC02MjEsICAgLTc4MSwgICAtNjIyLCAgIDE3ODksICAgIDcxMSwKKyAgICAgLTExNjUsICAgMTY0MywgICAtODkwLCAgIC04MDksICAgLTUzMywgICAgMTQ4LCAgICAzODQsICAgIDM3MywKKyAgICAgIC05MTAsICAgLTk4NiwgICAtODU1LCAgLTEwMzIsICAgMzY0NywgICAtNDc4LCAgIC0xMzIsICAgIDcxMywKKyAgICAgICAgLTMsICAgLTY3NCwgIC0xMDM2LCAgIC05NTYsICAgLTg5OSwgICAyNjk4LCAgICA2MjksICAgIDY2NSwKKyAgICAgIC03NjQsICAtMTA2NiwgIC0xMTczLCAgLTEwNTgsICAgLTY5MiwgICAtMTQ0LCAgIDExMTQsICAgMzE5NSwKKyAgICAgLTEwMTIsICAgLTY0MywgICAtNjcwLCAgIDE1NDcsICAgLTU3NiwgICAgMzUxLCAgICAyNTEsICAgIDI3MywKKyAgICAgIC05NTAsICAgIDU2MywgICAtNzQyLCAgICAyNDgsICAgLTE0OSwgICAgNTE0LCAgICAxMDAsICAgIDE4NSwKKyAgICAgIC0xOTMsICAgLTYxNiwgICAtNjU1LCAgICAyNTUsICAgLTM2NCwgICAtMzIzLCAgICAxNzIsICAgIDI1NiwKKyAgICAgICAzMDgsICAgIDIyOCwgICAgIDE2LCAgIC0xODcsICAgLTI0MywgICAgMjE5LCAgICAgODgsICAgICA1MywKKyAgICAgLTEwMjQsICAgIDY2NCwgICAgNDUwLCAgIC00MTYsICAgLTE4OSwgICAtMjM5LCAgICAgNDMsICAgIDEwMiwKKyAgICAgICAtNjQsICAgLTQ5OSwgICAtMTU5LCAgIC00MDAsICAgIDkwNSwgICAgLTY0LCAgICAtNjgsICAgICA0NiwKKyAgICAgLTEwNTUsICAgIC03NywgICAtODEzLCAgIC02NjEsICAgICA1OSwgICAgLTc3LCAgICAyMjYsICAgIDMyMSwKKyAgICAgIDEyMjQsICAgLTU1MywgICAtNDM2LCAgICA3OTMsICAgLTE1NSwgICAgLTgzLCAgICAgLTUsICAgICA3MiwKKyAgICAgIC02NTIsICAgLTg5NywgICAtMTU3LCAgIC01NzksICAgLTUzOSwgICAgODQ2LCAgICAxODEsICAgIDMxOCwKKyAgICAgICA3ODIsICAgLTk2NywgICAtODAyLCAgIC01NjksICAgICAtNiwgICAgMzY0LCAgICA1NDAsICAgIDUxMywKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGZjYjExbVtdID0geworICAgICAgLTQ1MywgIC0xMDg3LCAgLTExMzMsICAtMTEyNSwgICAtODUyLCAgIC0xNTgsICAgMTE1MiwgICAzMzEzLAorICAgICAgMTAxNSwgICAtNDQ0LCAgIDEwODUsICAgLTQ2NSwgICAtMzE3LCAgIC0yOTgsICAgLTQ3MSwgICAtMjM4LAorICAgICAgLTY0NywgICAxNDI2LCAgIC0yNDEsICAgIDE0OSwgICAtMzAwLCAgIC0xNjksICAgIC0xOSwgICAtMjI4LAorICAgICAgMzI4MiwgICAtMjY5LCAgLTEwMjUsICAtMTA2OSwgIC0xMDk3LCAgLTEwNzEsICAgLTUzOSwgICAxMzAzLAorICAgICAgMTExMSwgICAtOTMzLCAgIC03NDEsICAgLTgwMSwgICAtNTUzLCAgICAgOTgsICAgIDM5MywgICAxMDMxLAorICAgICAgLTc4NiwgICAtNzI5LCAgIC04MzUsICAgLTgxMCwgICAgLTc4LCAgIDE1NjksICAgIDYzMSwgICAgOTQ0LAorICAgICAgMTAzMSwgICAgNjUxLCAgIC00MDksICAgLTM5NywgICAtMzQ2LCAgIC0yMjEsICAgIC05OSwgICAtMjE2LAorICAgICAgIC04OCwgICAtMjExLCAgIC00MTksICAgIDE5MywgICAxMjk4LCAgICAxOTYsICAgLTIyMSwgICAtODc5LAorICAgICAtMTAzNiwgIC0xMzAzLCAgLTEyODIsICAtMTA1MiwgICAtNTc1LCAgICAyODMsICAgMzExMCwgICAxMzM3LAorICAgICAgIDQ4OSwgICAtNDYzLCAgIC02NDAsICAgIDExMiwgICAgMzQxLCAgIC0zMjIsICAgIDI2MSwgICAgMjY2LAorICAgICAgMTY0NiwgICAtODE3LCAgLTEyNTYsICAtMTI3MywgIC0xMjE3LCAgLTEwMzEsICAgLTE0MiwgICAzNjkxLAorICAgICAgMzAxMiwgICAxNTY0LCAgIC0yODksICAgLTgzMCwgICAtOTcwLCAgLTEwMzIsICAtMTA3NSwgICAtOTg5LAorICAgICAgIDU1NiwgICAgIDUyLCAgIC01ODgsICAgLTU4OSwgICAtNjEzLCAgIC03NDgsICAgLTM1MiwgICAyMDU0LAorICAgICAgIC02OSwgICAtNzg1LCAgIC03MTgsICAgLTQ5OSwgICAtMTQxLCAgICAxOTIsICAgMTM5NiwgICAgNDQ2LAorICAgICAgICAtMywgICAtNTE0LCAgIC02MTIsICAgICAgMywgICAgMTcxLCAgIDEwNjcsICAgLTExNCwgICAtMTA5LAorICAgICAgLTgxMiwgICAtODkzLCAgIC03NzYsICAgLTM0MiwgICAxNDI4LCAgICA0MjEsICAgIDQzOCwgICAgNTUyLAorICAgICAgLTkzMywgIC0xMTQzLCAgIC0yMDcsICAgMTMxMiwgICAgNzkxLCAgICAxNjYsICAgLTE5OCwgICAgLTc5LAorICAgICAgLTYzMiwgICAxMTIyLCAgIC01MzcsICAgLTYyMCwgICAgNDUwLCAgICAgOTcsICAgIC04NSwgICAgMTc0LAorICAgICAgMTc2MCwgICAgMTIzLCAgIC0xNjgsICAgIDQ4NSwgICAgLTc3LCAgIC01NjcsICAgLTc3NiwgICAtOTUyLAorICAgICAgLTc1OCwgIC0xMTc2LCAgLTEzMjIsICAtMTM1NSwgIC0xMjA3LCAgIC05MjgsICAgLTE3NywgICA2MjI5LAorICAgICAgLTQxMywgICAgMjYxLCAgIC0zMjcsICAgLTg0OCwgICAtNzI1LCAgIC0zOTUsICAgIDg0OSwgICAxNTMzLAorICAgICAgLTIwMSwgICAtMTI0LCAgIDI5NzYsICAgLTMzNSwgICAtNzAzLCAgIC02NzQsICAgLTcyNywgICAtOTQ5LAorICAgICAgLTUyMSwgICAgMjA5LCAgIDEwMDQsICAgIDgzOCwgICAgIDU2LCAgIC00NzcsICAgLTc1MSwgICAtNjAzLAorICAgICAgLTkyMiwgICAtNjE1LCAgIDE4MzIsICAgLTQ0OCwgICAtMzI5LCAgIC0xNDgsICAgICA3MywgICAgNDY3LAorICAgICAgNDk5MSwgICAgLTg2LCAgIC04MDksICAgLTkyOCwgICAtOTUxLCAgIC05NTYsICAgLTgxOSwgICAtNzUxLAorICAgICAgMTg0MSwgICAtNzkwLCAgIC03MTIsICAgLTExNiwgICAtMTEzLCAgICAtOTEsICAgICAgMCwgICAtMzg4LAorICAgICAgLTcyOSwgICAtMTk2LCAgICA3NTgsICAgLTM3NywgICAgIDY4LCAgICAgODUsICAgIDQyOCwgICAgLTM1LAorICAgICAgICAtNSwgICAgICAyLCAgICAgLTksICAgICAxOCwgICAgLTMxLCAgICAgNTMsICAgIC0yMywgICAgIDI2LAorICAgICAgLTg5NiwgICAtNDQ1LCAgIC0xODgsICAgIDgxOCwgICAtMzQ3LCAgICAtNDQsICAgIDUwMiwgICAgNTc4LAorICAgICAgIDEwMSwgICAyOTY4LCAgICAyNjksICAgLTcyNCwgICAtNzAyLCAgIC03NDcsICAgLTcxOSwgICAtNjczLAorICAgICAgNzU4NywgICAgIDY4LCAgLTExNzEsICAtMTM3NywgIC0xNDQxLCAgLTE0NTUsICAtMTQ3MywgIC0xMTc4LAorICAgICAgIDY5OSwgICAgNTg1LCAgICAgMTUsICAgMjI1NywgICAtNTAzLCAgIC05NDAsICAtMTA4NSwgIC0xMjg4LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMTFzbFtdID0geworICAgICAtMTUwMiwgIC0xNDYzLCAgLTEzMzYsICAtMTE3NywgICAtMzY3LCAgICAgODksICAgIDQ3NSwgICAgODY3LAorICAgICAgIDU1MCwgICAgODIwLCAgIC04MDUsICAgLTU4MCwgICAtODAzLCAgICAtODksICAgLTgxNywgICAxNjkxLAorICAgICAgLTMwNCwgICAgMTIwLCAgICAgMzYsICAgIDU2NCwgICAgNDA5LCAgIC01MjUsICAgLTgyMCwgICAgMzYyLAorICAgICAgLTk2OSwgICAtODcwLCAgIC02MDUsICAgMTk4MywgICAgOTkzLCAgICA3MjIsICAgMTUwNSwgICAxMTAxLAorICAgICAgLTg0MiwgICAtODQ4LCAgIC05MTgsICAgLTM3OSwgICAgLTcxLCAgICAyNTcsICAgIDQ5OSwgICAgNjA3LAorICAgICAgMTYxOSwgICAtOTU2LCAgLTEwMjQsICAgLTg2OSwgICAtNzQ0LCAgICAtNzQsICAgIDc5NSwgICAgNjg0LAorICAgICAgIDUzMiwgICAgNjM0LCAgLTEzNjAsICAgLTgxOCwgICAgIDQ5LCAgIC05ODEsICAgIDExMSwgICAtNDczLAorICAgICAgLTcxOCwgICAtNDc3LCAgICAzNzcsICAgIDcxMCwgIC0xMzk5LCAgLTExMDUsICAtMTE1MiwgIC0xMDI0LAorICAgICAgMjQyNiwgICAtMzU2LCAgIC0xOTEsICAgMTA3OSwgICAgOTExLCAgIDExNjQsICAgLTgwOSwgICAtNzkxLAorICAgICAgLTkxOSwgICAyNzMxLCAgIC04NTEsICAgLTQwMCwgICAtMTEzLCAgICAyNDIsICAgIDUwOCwgICAgODQ3LAorICAgICAtMTIyOSwgICAxMTk5LCAgIC05MTAsICAgMTEyNywgICAtNjg2LCAgIC0zODMsICAgICAyNiwgICAgMzUyLAorICAgICAgIDUzNiwgICAgNjQ2LCAgIC03OTAsICAtMTI0MywgIC0xMTAzLCAgLTExNzAsICAtMTEzMiwgIC0xMDY1LAorICAgICAgLTc4OCwgICAtNTIxLCAgICAxNjEsICAgMzg0MiwgIC0xMDk4LCAgIC04ODMsICAtMTA1MiwgICAgICA4LAorICAgICAtMTEwMywgICAtNzQ3LCAgIC01NTIsICAgLTQ4MCwgICAtMjQxLCAgICA4MjAsICAgMzM5MiwgICAtNzcwLAorICAgICAgLTc3MCwgICAtNzI0LCAgIC01ODgsICAgLTQyNiwgICAtMTUzLCAgICA0MjYsICAgIDYzOSwgICAgNzI0LAorICAgICAgMTYyNiwgICAtNzEzLCAgIDExNTcsICAgLTczNiwgICAtNDkyLCAgIC01MTIsICAgLTE2MCwgICAgNDYxLAorICAgICAgIDU2OSwgICAgNTgzLCAgLTEzNTEsICAgMTMzMiwgIC0xMjIyLCAgLTEzNTgsICAgIDI0MCwgICAxNTQxLAorICAgICAgLTcyNCwgICAgNjEyLCAgIDE1ODMsICAgMTE5NCwgIC0xMDYxLCAgIC05OTAsICAgLTY3MSwgICAtOTY5LAorICAgICAgLTk1MiwgICAyMzY4LCAgIC00NDIsICAgLTQxMywgICAxOTMzLCAgIDEwMjMsICAgLTE0NCwgICAtMjgzLAorICAgICAgLTk5MiwgICAtOTQwLCAgICA5ODMsICAgLTIzMiwgICAgODE4LCAgICAzNDEsICAgIDUwMiwgICAgNTQ5LAorICAgICAtMTQyMCwgIC0xMjY4LCAgLTEyNzksICAtMTIxMywgICAtNjIxLCAgIDIwMTksICAgIDY4NSwgICAxOTQ4LAorICAgICAgMTI2NCwgICAxMjAwLCAgLTEyOTMsICAgLTY2NCwgICAgMzkyLCAgIC04NDgsICAgIDg2NiwgICAxMTkxLAorICAgICAgLTIyMCwgICAgIDk1LCAgICA0NTAsICAgIDY0MCwgIC0xMzM0LCAgIDEwOTgsICAgLTc1MSwgICAtNzAxLAorICAgICAgMTI5NiwgICAtMzQ3LCAgICAtOTIsICAgIDIzMywgICAgNTMyLCAgICA1OTksICAgLTk1MiwgICAtNjk0LAorICAgICAgMzA4NSwgICAtOTA4LCAgIC0yNTYsICAgLTQ5NCwgICAtMTc3LCAgICAxMjMsICAgIDgwOSwgICAgOTQxLAorICAgICAgICAxOCwgIC0xMDg5LCAgIC04MDEsICAgIDMwMywgICAtNzYxLCAgICAgMTEsICAgIDYzMiwgICAgMjg4LAorICAgICAgIDQ3NiwgICAgNTE4LCAgIC0yNDEsICAtMTEzOCwgIC0xMDY4LCAgIC04NjksICAgIDI5MiwgICAgMTIxLAorICAgICAgIC0yNiwgICAgLTk2LCAgICA0NTcsICAgIDU0OCwgICAtMTA2LCAgIC03ODQsICAgIDkzMCwgICAtNzAwLAorICAgICAgMTg0MiwgICAtODEyLCAgIC02MTcsICAgLTMwNywgICAgNDMwLCAgICA2NTUsICAgLTY5OCwgICAxMTU3LAorICAgICAgIDk0NywgICAtODAzLCAgIC02NjIsICAgLTc0MywgICAgLTQ5LCAgIDExMjAsICAgIDM0OCwgICAgNTc4LAorICAgICAgIDg1NSwgIC0xMDQ5LCAgIC03NTMsICAgIC02NywgICAgNzEwLCAgIC0zNDcsICAgIC0yOCwgICAgNjk0LAorICAgICAgIDQxMSwgICAgNDY4LCAgICAtNjEsICAgIDIzOSwgICAgIDIzLCAgLTEwNzIsICAgLTc1NywgICAgNDc3LAorICAgICAgLTY1OCwgICAtMzYyLCAgICAyMzksICAgIDU3NiwgIC0xNDc5LCAgLTEyNzksICAtMTI4NiwgICAtNjc3LAorICAgICAgLTkzOSwgICAtNzIyLCAgIDMyMTcsICAgIDMzOCwgICAxNTYyLCAgIDE1NjYsICAgIDkyNSwgICAgOTE3LAorICAgICAgLTY5NywgICAtNzA4LCAgICA2NDUsICAgLTQ0NywgICAtMjgwLCAgICA3MTQsICAgIDUwMywgICAgNTUyLAorICAgICAtMTA1MCwgIC0xMDIxLCAgICA4ODksICAgLTk1NiwgICAtOTM0LCAgICA3MDUsICAgIDQ1NywgICAgNjE2LAorICAgICAgIDU1NiwgICAgNjY3LCAgLTEzMzEsICAgIC01MSwgICAtMjU2LCAgICAtNDgsICAgLTIzNCwgICAgMjQwLAorICAgICAgIDc1NywgICAgLTc0LCAgICAxNDgsICAgIDM1NiwgIC0xMjc4LCAgIDE1MzgsICAgIDIzNCwgICAtMzcyLAorICAgICAgLTQ3MiwgICAtMjIxLCAgIC00MjQsICAgLTQ5NCwgICAgMTcwLCAgICA1NTEsICAgIDIxNiwgICAgMjk0LAorICAgICAgLTg4NSwgICAgMjMxLCAgIC0yNjMsICAgIDMzNCwgICAgLTY0LCAgICAtNTQsICAgIDI5MSwgICAgMzUwLAorICAgICAtMTE0MCwgIC0xMDc0LCAgLTExOTksICAtMTM3NCwgIC0xMjc4LCAgIC04NDUsICAgLTU0NywgICAgNjY3LAorICAgICAgNDU0NCwgICAxOTIyLCAgIC04OTksICAgLTkzMCwgICAtOTU0LCAgLTExMjAsICAtMTA5MiwgICAxMTU2LAorICAgICAgMTg4OSwgICAtNDA0LCAgICAyNTksICAgMTExNCwgICAtOTU2LCAgIC04MzYsICAgIDg4MSwgICAtMzE2LAorICAgICAgLTk3NywgICAtODYwLCAgICAyMDIsICAgLTI0OSwgICAgMTIxLCAgICA4MTYsICAtMTE4OCwgICAzNjQ0LAorICAgICAgLTgyOSwgICAtODc2LCAgIC02NzAsICAgLTQ3MywgICAtMTYxLCAgICA0MjAsICAgIDg1MSwgICAgODg2LAorICAgICAtMTAxNCwgICAxMTkxLCAgIC05MzgsICAgLTk1OCwgICAtODY0LCAgICA3NDEsICAgIDI0MSwgICAgOTU3LAorICAgICAgIDI4OCwgICAgNjI5LCAgLTExNTUsICAgLTg5OCwgICAxMTA0LCAgIC03ODksICAgICAyOCwgICAtODY3LAorICAgICAgLTU4MCwgICAyNTg4LCAgICA4MzYsICAgMTIzNCwgICAtOTUzLCAgIC03NDksICAgIDkzNCwgICAxMTM3LAorICAgICAgLTMxMCwgICAtMTc3LCAgIC0xMTMsICAgIDI0NCwgICAgNTMyLCAgICA0MjQsICAgLTM0MSwgICAtNjAyLAorICAgICAgLTg4MCwgIC0xMTA1LCAgIC0zMDMsICAgLTM4MSwgICAtNTI3LCAgIDE5NDMsICAgIDEyNiwgICAgNzU5LAorICAgICAtMTI3NywgIC0xMDM3LCAgICAgNTksICAgLTc4MywgICAgNDg1LCAgIC01ODksICAgMTM0MSwgICAgNzM3LAorICAgICAgIDQ4OCwgICAgNzA5LCAgLTE0NzMsICAtMTIwOCwgIC0xMDgyLCAgICA1ODksICAgIDc5MSwgICAgNzM1LAorICAgICAgIDQ0NywgICAgMzIyLCAgICA4MzUsICAgIDczMSwgIC0xMTE2LCAgIC02ODEsICAgLTU5MiwgICAgNzA0LAorICAgICAgIDUyMCwgICAtNTQ1LCAgIC0xMDQsICAgIC0yNCwgICAgMjYzLCAgICA0NTgsICAgIDYzMiwgICAtNzIxLAorICAgICAtMTA4NiwgIC0xMjIzLCAgLTExNTAsICAgLTg2NiwgICAxNTM3LCAgIDI4MTUsICAgIDEyMywgICAxMDk3LAorICAgICAtMTIzOCwgICAtODYxLCAgLTEyMTcsICAtMTIzOCwgIC0xMjYxLCAgIC05MTQsICAgMTE2NSwgICAgNDIyLAorICAgICAgIDcxMSwgICAgODgzLCAgLTExOTYsICAgLTk3MiwgICAtNDI4LCAgIC0yMzAsICAgIDE3MSwgICAgICA4LAorICAgICAgLTQ0OCwgICAxMTk1LCAgICA0NDUsICAgIDQ0MCwgICAtNDEzLCAgIC0xMzksICAgLTM3NSwgICAtNTY4LAorICAgICAgLTc4MSwgICAtNTIwLCAgICA2MTEsICAgLTU4NiwgICAgODgxLCAgICA1ODksICAgLTcyNCwgICAgOTcyLAorICAgICAgLTkwNywgICAtNzk0LCAgIC04MTksICAgLTY0MSwgICAxNjUwLCAgICAgNjYsICAgIDI1NCwgICAgNzAzLAorICAgICAtMTM4MCwgIC0xMTY4LCAgIC05NjcsICAgIDY3NiwgICAtNzY1LCAgIC01MzcsICAgIDU3OCwgICAxNTQyLAorICAgICAgIDY4NywgICAgODMzLCAgIDExNTEsICAgLTgxMSwgICAtOTQ4LCAgIC05OTUsICAgLTI0NiwgICAxMzAxLAorICAgICAgLTM3NywgICAgMjYyLCAgICA2MzIsICAgIDY1MiwgICAxNTMwLCAgIC02NzksICAgLTY4MiwgICAgOTkzLAorICAgICAgLTY2NiwgICAtNDU3LCAgICAtNzIsICAgIC0yMCwgICAgMzE3LCAgICA1MTYsICAgIDg2MSwgICAtNTI4LAorICAgICAgICAyNCwgICAtNTc5LCAgIC0zODYsICAgICA1MywgICAgNTI2LCAgICAtNzYsICAgICA2NiwgICAgMzQ1LAorICAgICAgIC01OSwgICAtNjEyLCAgICAxNjUsICAgLTE4MSwgICAgLTk4LCAgICAtMzQsICAgIC02NiwgICAgMjg2LAorICAgICAgICA5NSwgICAgMTA4LCAgLTExMTgsICAgLTE0NywgICAgNjQzLCAgLTEwNTUsICAgLTc2OCwgICAtNTAyLAorICAgICAgLTU4NywgICAgIDI3LCAgIDIxMTMsICAgIDgxMSwgIC0xMjE5LCAgIC05NDcsICAgLTgxMSwgIC0xMTg4LAorICAgICAgMTE0MywgICAtNjA5LCAgIC03NTMsICAgICA4OCwgICAyODQ0LCAgIDE0MjQsICAtMTQyOCwgIC0xMDgyLAorICAgICAtMTI3MywgICAxMDg2LCAgLTEyMDYsICAtMTE3MSwgICAgMjc5LCAgIC01MTAsICAgMjMyNSwgICAxNzU3LAorICAgICAtMTQzNywgICAgNjU0LCAgLTEyNzgsICAtMTI2NywgIC0xMTE3LCAgIC05NTAsICAgIDc3OSwgICAyMjA1LAorICAgICAgMTE1MCwgICAxMTAxLCAgLTE0ODQsICAtMTAwOSwgIC0xMTk5LCAgLTE0MTYsICAtMTIxNSwgICAgNjU3LAorICAgICAgLTczNywgICAgNjM0LCAgIDEyNjYsICAgMTc0MiwgIC0xNDQ1LCAgLTExOTMsICAtMTM1OCwgIC0xMTU4LAorICAgICAtMTAxNSwgICAtOTk1LCAgIC02NTUsICAgNDAzNSwgICAxOTY2LCAgIDE5MDMsICAtMTA2OSwgICAgOTU0LAorICAgICAtMTA5OSwgIC0xMTcxLCAgLTEwMjksICAgLTgxOCwgICAtNTc2LCAgIC0xMDQsICAgMTM5MCwgICAxMDY5LAorICAgICAgIDU1OSwgICAtOTE0LCAgLTEwMzQsICAtMTE1MiwgICAtOTg3LCAgIC01ODIsICAgLTIyMiwgICAgMzk0LAorICAgICAgMTIwNCwgICAgNzc1LCAgLTE0NjQsICAgIC01MSwgICAtOTU5LCAgLTEwMDUsICAgLTQ1MiwgICAgMzQ3LAorICAgICAgIC05NCwgICAgICAxLCAgICA1MjUsICAgIDU5NSwgIC0xMzI0LCAgLTEyMjYsICAtMTEwMiwgICAtODI1LAorICAgICAgLTkyNywgICAtNzc2LCAgIC01ODIsICAgIDE3NSwgICAxNjc1LCAgICA2MzIsICAgLTg1OSwgICAgIDI4LAorICAgICAgLTkxNCwgICAtMjA5LCAgIC00NjgsICAgLTYyNSwgICAtMjMwLCAgICA2NDYsICAgIDU3OSwgICAgNDQ2LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMTFzc1tdID0geworICAgICAtMTM1MSwgIC0xMjI5LCAgLTExNzQsICAgLTc2NywgICAxNDAzLCAgICAxODIsICAgIDUzMiwgICAgNDQ1LAorICAgICAgIDQxNSwgICAgNjEwLCAgLTEwOTUsICAgLTc3MSwgIC0xMTQyLCAgIDMyMjEsICAgLTgwMywgICAtNjgwLAorICAgICAgLTMwMiwgICAgMzE4LCAgICA0NDEsICAgIDQzOCwgIC0xMTg4LCAgIDExNDUsICAgMTU1MiwgICAtNTI4LAorICAgICAgIDg4NywgICAtNTQ3LCAgIC00MjksICAgIDEyNCwgICAgIDk5LCAgICAxMjgsICAgLTc2OCwgICAxMDQ5LAorICAgICAgLTU2MiwgICAxMTIxLCAgIC01OTMsICAgIC05NiwgICAtMTA1LCAgICAxMDUsICAgIDI1MSwgICAgMTU0LAorICAgICAgMTY4NCwgICAxNTk4LCAgIC02MzUsICAgLTY4NSwgICAtMTc3LCAgIC0yMTEsICAgLTI2OCwgICAgMjM0LAorICAgICAgLTExOCwgICAgLTQ5LCAgIC03MTksICAgLTg3MywgIC0xMDkyLCAgIC05ODUsICAgLTY3OCwgICAtNDA2LAorICAgICAgLTIzNCwgICAgNDA3LCAgICA2NTMsICAgMzE5NSwgICAgOTkxLCAgIC01ODQsICAgLTg3NCwgICAgLTE0LAorICAgICAgLTY4MywgICAyOTY0LCAgIC03NjksICAgLTQ1MCwgICAgMjg3LCAgICAzNTAsICAgIDg1MywgICAtODAzLAorICAgICAgLTU3NCwgICAxNzYxLCAgIC00MTAsICAgIC02MCwgICAtMjMwLCAgICAtNzgsICAgIC0yMSwgICAgIDE5LAorICAgICAtMTI3MSwgICA0NDM1LCAgIC02NzMsICAgLTc5MCwgICAgMTEwLCAgIC0yNDMsICAgIC04MSwgICAgMTQ3LAorICAgICAgIDE5MSwgICAgMTQ1LCAgIDU1NzEsICAgLTYxMSwgICAtNjM0LCAgIC02OTksICAgLTE5NSwgICAtMjgxLAorICAgICAgLTI0OSwgICAtMzAyLCAgIC0yNzIsICAgIC02NywgICAtODkzLCAgIC02NTYsICAgLTc0NSwgICAtNjk3LAorICAgICAgLTU1MCwgICAtNjM5LCAgIC00MDksICAgMzA4NSwgICAgMzgzLCAgICA3OTgsICAgLTMxMSwgICAtMzQwLAorICAgICAgLTU2NCwgICAtNzg3LCAgIDM2MjgsICAgLTMzMiwgICAtNTEwLCAgIC0yMTksICAgIDQ2NSwgICAgMzUxLAorICAgICAgLTc0NywgIC0xMDg0LCAgIC05NzIsICAgLTcyNywgICAtNDA0LCAgIC02MzAsICAgLTE3NiwgICAgNDM3LAorICAgICAgMzM1MiwgICAgOTc4LCAgIC04ODYsICAgLTc1MSwgICAtNzY3LCAgIC01ODAsICAgLTY5MywgICAtOTQyLAorICAgICAgLTgwMywgICAtMTU4LCAgICAtMzYsICAgICAtMywgICAtOTY2LCAgIC02NzQsICAgMzA3NSwgICAtOTI2LAorICAgICAgLTE3MiwgICAgIC05LCAgICAtNDAsICAgIDExMSwgICAgMTY5LCAgICAyMTIsICAgIDE4MSwgICAtODExLAorICAgICAgLTcxNSwgICAtOTg2LCAgIC01MjEsICAgLTY4NiwgICAzOTE1LCAgICAgMTgsICAgIC01OCwgICAgNDk5LAorICAgICAgIDIxMCwgIC0xMTg3LCAgIC05MDMsICAgLTkxNSwgICAtNTIyLCAgIDEwMzgsICAgIDQ3NywgICAgNzg4LAorICAgICAgIDI5MCwgICAgNDEyLCAgLTEwMTAsICAgLTc5MSwgICAtNzAwLCAgIC03MTAsICAgICAzNCwgICAxNzc0LAorICAgICAgLTI1NiwgICAgIDk2LCAgICAxMzEsICAgIDI0MSwgIC0xMjUxLCAgIDIwODYsICAgICAtNSwgICAtNzY1LAorICAgICAgLTQ0NiwgICAgMTQxLCAgICAgOTMsICAgIDE2MCwgICAgIDg4LCAgICAxMjksICAtMTE1MywgICAxMTcxLAorICAgICAtMTE5MiwgIC0xMDczLCAgIC0zOTEsICAgLTE4NywgICAgMjA2LCAgICA0MTYsICAgIDQ0NCwgICAgNjQ4LAorICAgICAgIDcwNywgICAtNTQyLCAgIC01MDQsICAgLTc1MCwgICAtNjIzLCAgIC02NDgsICAgIDc3NiwgICAgNjkyLAorICAgICAgIDE2NSwgICAgMzMwLCAgIDExMTIsICAtMTE5OSwgICAtODc2LCAgIC00MjgsICAgIDk0OSwgICAgIDY1LAorICAgICAgIDI1MCwgICAgMTA0LCAgICAxMDgsICAgIDE3MywgICAyMTQ3LCAgIC05MDUsICAgLTg0NiwgICAtNTQwLAorICAgICAgLTM3NiwgICAtMTMxLCAgIC0xMTMsICAgIDEyNCwgICAgMzE0LCAgICA0ODUsICAgMTI1MywgICAtNTE1LAorICAgICAgMTQzNSwgICAtNTI3LCAgICAgMjEsICAgLTEwMCwgICAtMzY4LCAgICAtODQsICAgLTExOSwgICAtMTQ0LAorICAgICAtMTM3NSwgIC0xMTg5LCAgLTExODksICAgLTk5OSwgICAtNzIzLCAgIC0xOTAsICAgIDc5NiwgICAgNjM5LAorICAgICAgIDY5OSwgICAgODE2LCAgLTExODgsICAgLTkxOSwgICAgNjgzLCAgICA4NDIsICAgIDE3NywgICAgLTYyLAorICAgICAgIC0yNSwgICAgIDcxLCAgICAgMTUsICAgICAxNiwgICAgMTU3LCAgICAgODAsICAgLTMzMSwgICAtMzQzLAorICAgICAgICAxMiwgICAgMTkzLCAgIC0xMzMsICAgIC05NCwgICAgLTk0LCAgICAtNjQsICAtMTMwNiwgICAgNTMxLAorICAgICAgLTkxNywgICAtMTQyLCAgIDEyNzQsICAgIDEwMiwgICAgLTE1LCAgICAxODQsICAgIDE1OSwgICAgMTQ4LAorICAgICAgIC00MywgIC0xMTAzLCAgIC01ODEsICAgLTQxOSwgICAgNDQ3LCAgIC0xMzIsICAgLTIwNCwgICAgMTg3LAorICAgICAgIDYzMSwgICAgNDYxLCAgLTEzMDIsICAtMTE2MiwgICAtOTI3LCAgICA4OTYsICAgIDIwMywgICAgMTY0LAorICAgICAgIC01NSwgICAgMjg3LCAgICA1NDQsICAgIDQ4NSwgIC0xMjU4LCAgIC03OTEsICAgIDY3NywgICAtOTQ1LAorICAgICAgLTI0NCwgICAtMTAxLCAgICA0MjMsICAgIDM2MiwgICAgMjk4LCAgICAzODksICAgLTgyNSwgICAtNjQwLAorICAgICAgLTY0NiwgICAgMjc0LCAgICAtNzMsICAgLTI3NCwgICAxNDczLCAgICAtMTMsICAgIDEzMiwgICAgMTY5LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMTFzbVtdID0geworICAgICAgLTc2NywgIC0xMTc5LCAgLTExODgsICAtMTA2OSwgICAtNjkwLCAgIC0xNzIsICAgIDc4NywgICAxMzg5LAorICAgICAgMTYyMywgICAgODQ0LCAgIC0xNjksICAgLTg5NCwgICAtOTE5LCAgICAgNTEsICAgICAxNSwgICAgNDI2LAorICAgICAgLTMyNiwgICAxNTc5LCAgICAxODIsICAgICA3NywgICAgMjAyLCAgIC00MTcsICAgLTM1NywgICAgLTE3LAorICAgICAgMjE1NCwgICAgLTc3LCAgIC02MDcsICAgLTU4OSwgICAtMzc1LCAgIC0yNjEsICAgLTM3NiwgICAgMTc1LAorICAgICAgLTgyOSwgICAtODAxLCAgIC01NzksICAgLTI5MCwgICAtMjQ0LCAgICA1MzMsICAgMTMwNywgICAgODczLAorICAgICAgLTg3NywgIC0xMTc1LCAgLTExNTcsICAgLTcyNiwgICAgNDYxLCAgIDE3MjksICAgIDQzMywgICAgMjE5LAorICAgICAgIDI0NiwgICAgNjA2LCAgIC03OTEsICAgLTgyNywgICAgNjQ5LCAgICA4OTEsICAgIDgyMCwgICAgNzIwLAorICAgICAgIDQwNywgICAtNjQxLCAgIC03MjcsICAgLTcwOCwgICAyNDk4LCAgICA5NjEsICAgIC05OSwgICAtNTQyLAorICAgICAgLTUzMCwgICAtNTA3LCAgIC01MzYsICAgLTYwOCwgICAtNjQyLCAgIC02MjIsICAgIDMxNiwgICAgMTk1LAorICAgICAgLTcyMSwgICAtNTQ5LCAgIC0yNTMsICAgMTUyMCwgICAgMTcxLCAgICAtODEsICAgLTM3MiwgICAtMzMzLAorICAgICAgMTE2NiwgIC0xMDcyLCAgLTEyMzAsICAtMTEyMywgIC0xMDMxLCAgIC04NjgsICAgLTM3MCwgICAgMjA5LAorICAgICAgMTU2MSwgICAxNzUxLCAgICAxMTMsICAgLTM2NywgICAgMzk5LCAgIC02NjMsICAgIC0xMCwgICAtMjcxLAorICAgICAgIDk1MCwgICAgMTE4LCAgIC0zMzUsICAgLTI3MiwgICAtODYzLCAgICAgNjAsICAgLTg3NSwgICAxODUwLAorICAgICAgLTI0MiwgICAtMjc2LCAgICAtMzgsICAgLTEwNiwgICAgNDcxLCAgICAgMzAsICAgIDgyMywgICAtMzQ0LAorICAgICAgLTc1MiwgICAtNzE0LCAgIC0zMDksICAgLTQxOSwgICAgIDg2LCAgIDE2MDQsICAgLTI1MCwgICAtMTg1LAorICAgICAgLTgzOSwgICAtNzAzLCAgIC01NjEsICAgLTI4MSwgICAxODEzLCAgICAtNTcsICAgIDI1NSwgICAgMjY2LAorICAgICAgIC0zMiwgICAgIDk5LCAgICA0MDAsICAgMjUyMCwgICAgMzE1LCAgIC0zNzIsICAgLTMwNiwgICAtNTExLAorICAgICAgLTU0OSwgICAtNjU5LCAgIC03NjAsICAgLTcyOSwgICAtNTU5LCAgIC0xMzcsICAgLTYxMCwgICAgMTc0LAorICAgICAgIDkyNCwgICAtMzEwLCAgIC03MDUsICAgLTMwNywgICAgODg1LCAgICA1MTIsICAgLTYxMSwgIC0xMDk3LAorICAgICAtMTE3MiwgIC0xMDcyLCAgIC03NTgsICAgLTUyNywgICAtMTkyLCAgICAyNzgsICAgIDc0MCwgICAzMzk4LAorICAgICAtMTEzNiwgICAgNDA5LCAgIC0yMzAsICAgLTM1MywgICAtMTM3LCAgICAzMjIsICAgIDMyNiwgICAgMzY1LAorICAgICAgIDEzMywgICAgMTczLCAgIDIyOTEsICAgLTY0NCwgICAtNzI1LCAgIC01OTYsICAgLTUzNSwgICAtMzQwLAorICAgICAgIC04OCwgICAgLTY1LCAgICAtNTMsICAgIDI3MywgICAtNzYwLCAgIC0zOTAsICAgLTY0OSwgICAgMTE5LAorICAgICAgLTI0MywgICAtMjIyLCAgIDE3MjYsICAgLTExMywgICAgIDQ0LCAgICAzMjYsICAgLTYxOCwgICAgMzExLAorICAgICAgMjM0NSwgICAtMjQxLCAgIC0zOTgsICAgLTM5OSwgICAtMzgyLCAgIC0zMjIsICAgLTQ0NCwgICAtNDU3LAorICAgICAgMTg3MywgICAtNDU0LCAgIC01MDUsICAgICA0MiwgICAgNDgxLCAgICAxODcsICAgIC00OSwgICAtNTA1LAorICAgICAgLTYzNCwgICAtNzU0LCAgIDEwNTIsICAgLTU5NywgICAxMzE1LCAgICAyOTcsICAgLTQxMiwgICAtMTEwLAorICAgICAgLTIwNSwgICAtNTUyLCAgIC02ODIsICAgLTUyNCwgIC0xMDU1LCAgIC00MzEsICAgIDk3MSwgICAtMzYzLAorICAgICAgLTUzOSwgICAtMzY2LCAgICAgMzksICAgIDk5NSwgICAgMTgxLCAgICA0NzYsICAgIDY2MiwgICAgMjI5LAorICAgICAgLTQ0NSwgICAxNjgyLCAgIC0yMDUsICAgLTE4MSwgICAtMjczLCAgIC00OTcsICAgLTY4NSwgICAtNjI4LAorICAgICAgNjEzNSwgICAgLTIxLCAgIC04MzQsICAgLTkzNCwgIC0xMDAyLCAgLTEwNjYsICAgLTkzMSwgICAtOTc0LAorICAgICAgLTkwMiwgICAtNjQzLCAgIC04MjAsICAgMTg5MSwgICAtNzA2LCAgIC0yODgsICAgLTI1MiwgICAtMjMxLAorICAgICAgIC03OSwgICAgMTI2LCAgICAgMzUsICAgICAzNywgICAgIDEwLCAgICAtMTAsICAgIC0zNiwgICAgIC02LAorICAgICAgICAtOSwgICAgLTQ3LCAgICAgLTcsICAgICAgMSwgICAgIDExLCAgICAgLTIsICAgIDY0NCwgICAgMzE1LAorICAgICAgIDE0NSwgICAtMzUzLCAgIC0zOTYsICAgLTQyOCwgICAtMzU3LCAgICAtNjAsICAgIDI3NSwgICAgMTA5LAorICAgICAtMTE3OSwgICAtOTUyLCAgIC02OTgsICAgIDEzOCwgICAgMjg2LCAgICAxNzEsICAgIDM5NCwgICAgMjYzLAorICAgICAgIDgxNCwgICAgNDk1LCAgIC00OTAsICAgIDExMCwgICAgMzY5LCAgICA1OTksICAgICAgOSwgICAgNTk5LAorICAgICAgLTQzMSwgICAtMjMzLCAgIC0zMjgsICAgIC02OSwgICAgNDEwLCAgLTEwMDIsICAgLTQ2MiwgICAgIDc3LAorICAgICAgICA5NywgICAgMTk2LCAgICAxMzMsICAgIC05MSwgICAgNTEyLCAgICAgNDksICAgIDYyMSwgICAtNDM2LAorICAgICAgLTM1MiwgICAtMzkwLCAgIC0yMTEsICAgLTE4OCwgICAtNDU0LCAgIC0zMTgsICAgICA0NCwgICAxNDI0LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMTZsW10gPSB7CisgICAgICAgLTEzLCAgIC03OTgsICAgLTc3MiwgICAgMjM1LCAgICA1MTUsICAgLTE4MSwgICAtMTIwLCAgIC01MDksCisgICAgICAtMzkyLCAgLTExNTksICAgLTg0NCwgIC0xMDQxLCAgIC04ODEsICAtMTE5MywgICAxMTAzLCAgLTEwODAsCisgICAgICAgMjE0LCAgIDE2MTUsICAgMTgxOSwgICAxNTEwLCAgIC05MTQsICAtMTE5MCwgICAtMjczLCAgLTEwOTksCisgICAgICAtNTIyLCAgIC05OTYsICAgLTIwNiwgICAzOTQ2LCAgICA5OTYsICAgMTY3OCwgIC0xMjIwLCAgLTEyMDEsCisgICAgICAyODUwLCAgLTEwMjIsICAgMTEwMSwgICAtODE0LCAgIC0xODgsICAgIDg3OSwgICAxNTQ5LCAgIDEyNzksCisgICAgIC0xMTI5LCAgIDE5MjgsICAgMTU1MCwgICAgIDM4LCAgIC0zNTYsICAgLTU3NCwgICAtMTU3LCAgICAyODYsCisgICAgICAgNDgxLCAgICA0NzUsICAtMTA3OSwgIC0xMTc2LCAgIC04NjEsICAgLTU0OCwgICAtNjU3LCAgIC0zODEsCisgICAgICAgNTM4LCAgICA5NDgsICAgLTgzOCwgICAgNzc5LCAgLTExNDksICAgLTk2MiwgICAxNzg4LCAgIC03NzksCisgICAgICAtNzQyLCAgIC0zMTEsICAgIDIwNSwgICAgMjk5LCAgICA0NzIsICAgIDcxNSwgICAgNzAyLCAgIC04NDMsCisgICAgICAtOTMxLCAgIC03OTAsICAgLTYyNCwgICAtMzMyLCAgICAzMjQsICAgIDc3OCwgICAgNzg1LCAgICA2NzAsCisgICAgIC0xMTM3LCAgLTEyMDUsICAgLTEwMywgIC0xMTgyLCAgLTEwNzEsICAgLTk1MCwgICAgMTAxLCAgICA1MjcsCisgICAgICAxNTk2LCAgIDEwMDQsICAgIDY4MiwgICAtNTY0LCAgLTEwNTMsICAgLTg0NCwgIC0xMTg0LCAgIDE3MzIsCisgICAgICAtODYyLCAgIDE5OTQsICAgLTk4OCwgICAxMTMxLCAgLTEwNjksICAtMTI3NiwgIC0xMDUzLCAgIDY0MTQsCisgICAgIC0xMjU5LCAgIC0xODYsICAgLTkzMCwgICAgMTE4LCAgICAzNzUsICAgMTA5MiwgICA2MjE1LCAgIC05MDAsCisgICAgICAtOTIwLCAgIC05MzUsICAgLTk4MSwgICAtOTcwLCAgIC03NjYsICAgLTkwMiwgICAtMzM0LCAgIDE2MjksCisgICAgIC0xMDk0LCAgLTExNDIsICAtMTE1NSwgICAtNzc5LCAgLTEwOTIsICAgMTAxMSwgICAtNDkwLCAgIDEwNjMsCisgICAgICAxNTY5LCAgIDEzNDAsICAgMjI0MiwgIC0xMzEzLCAgIDYwMjcsICAtMTMxOSwgIC0xMzM3LCAgIC03ODksCisgICAgIC0xMjk2LCAgIC00NTcsICAgIDgxOSwgICAyMjc2LCAgLTEwNzEsICAtMTA2NSwgICAtNzE1LCAgICA4MDIsCisgICAgICAtOTk2LCAgICAzOTcsICAgMjM5NiwgICAgLTI3LCAgIDEyMjUsICAgIDkzNSwgICAxNDAwLCAgIC04NjIsCisgICAgICAtODAyLCAgIDE4NDYsICAgLTUxMywgICAtMjQ5LCAgIC03MDQsICAgIDUxNSwgICAgODcyLCAgICA2NjIsCisgICAgIC0xMTQxLCAgIDU4NzYsICAgLTY5MSwgICAtNDA0LCAgIC02MDMsICAgLTE0OCwgICAgLTU3LCAgICAxODcsCisgICAgICAgNjQ5LCAgICA3ODgsICAtMTExNiwgICAtOTE1LCAgIC01NTEsICAgMzg0MywgICAtNzM3LCAgIC0xMzMsCisgICAgICAgNDk4LCAgICAxNTUsICAgIDIyNywgICAgNzE4LCAgIDE3OTgsICAgMTM5NywgICAtODY4LCAgIC03MTYsCisgICAgICAtNTg2LCAgIC01ODAsICAgIC03MSwgICAgLTY3LCAgICAzMTEsICAgIDUzNiwgICAyNDY1LCAgIC01MjQsCisgICAgICAxODM3LCAgIC0yMzEsICAgLTIxMCwgICAgMjYzLCAgICAyMzEsICAgIC0xMCwgICAtMTY0LCAgIC0zMjQsCisgICAgICAtOTUxLCAgLTExMzAsICAgNTIwNiwgICAtNTI1LCAgIC02MDMsICAgLTQwMSwgICAgMjIzLCAgICA0MzgsCisgICAgICAxMDExLCAgIDEwNzcsICAgLTcyNiwgIC0xMTAyLCAgLTEwMTMsICAgLTM4NiwgICAtNzg2LCAgIDQyODEsCisgICAgICAtMzI5LCAgICAyNjIsICAgIDU1MCwgICAxMjkyLCAgIC02MjksICAgLTk0MywgICAtOTc2LCAgICA3NzMsCisgICAgICAtODY3LCAgICA5MDgsICAgLTY4MCwgICAtMTU0LCAgICAzNjIsICAgMTA1NiwgIC0xMDUxLCAgIC03MDMsCisgICAgIC0xMzMzLCAgLTE0MjQsICAtMTAyNiwgICAtNzkzLCAgIC04NTksICAgLTg4MiwgICAtMTQ4LCAgIDk5NTgsCisgICAgIC0xMTkzLCAgLTExNTYsICAtMTA3NywgICAxMjQxLCAgLTEwMTMsICAgLTcyNiwgICAtMTM5LCAgICA1NTEsCisgICAgICAxMTUwLCAgIDEwMTksICAgLTczMywgICAtOTk3LCAgIC02NTEsICAgLTYyNSwgICAgLTU0LCAgICA3MjIsCisgICAgICAgIDczLCAgICAtMTQsICAgIDM2MSwgICAgNDM1LCAgIDQwMTMsICAtMTI2MCwgIC0xMTk1LCAgIDE0NTIsCisgICAgIC0xMTA1LCAgIDEyNzMsICAgLTY3MCwgICAxNTQ2LCAgIDEwMzgsICAgMTY4MCwgICAtODEyLCAgLTEwNjAsCisgICAgICAtODUzLCAgLTEwNTgsICAgMjA5NCwgICAtODAxLCAgIC00NTcsICAgLTMyMCwgICAgNjgzLCAgICA5NjAsCisgICAgIC0xMDE5LCAgLTExNTgsICAtMTExOCwgIC0xMDM0LCAgIC02MTcsICAgIDQwNCwgICAxMzc2LCAgICA4NDcsCisgICAgICAxMDE0LCAgICA5NTEsICAgIC0xMiwgIC0xMDA0LCAgLTEyMjEsICAtMTEzMSwgICAgNjQ5LCAgLTEwNTIsCisgICAgICAgNDQyLCAgIC0xNjcsICAgLTg1OSwgICAzODY4LCAgLTEyMTYsICAtMTI5OCwgIC0xMzExLCAgIDI4NjYsCisgICAgIC0xMzEwLCAgIC02MzksICAtMTA3OSwgICAxNTc2LCAgIDE3NjAsICAgMTgzNywgICAgMTE4LCAgLTEwODAsCisgICAgICAtODYyLCAgIC04NDUsICAtMTA2NSwgIC0xMDY5LCAgIDIxOTksICAgLTc2NiwgICAgNDk1LCAgIDEzMDksCisgICAgICAtOTk2LCAgLTEwNDAsICAgLTc0MSwgICAxMzU3LCAgIDE3MjYsICAgIDM4MiwgICAgMjY0LCAgICAgOTIsCisgICAgICAgNjU5LCAgICA2NjUsICAgLTc4MSwgIC0xMzU2LCAgIDIwNTUsICAtMTE5OCwgICAgIDE1LCAgIDIxNDMsCisgICAgICAgNjMxLCAgICA1NjksICAgIDkxOCwgICAxMTIwLCAgIC05NDgsICAtMTI1MywgIC0xMjM0LCAgIDI0NDIsCisgICAgIC0xMDYyLCAgIDIyMDYsICAgICA0OCwgICAgNjYwLCAgIDE4MjIsICAgMTQ4MCwgICAtNjM5LCAgICA2MjcsCisgICAgICAtNDMyLCAgIC00NzcsICAgIDg0NSwgICAgMjE2LCAgICAyMjgsICAgIDE1MiwgICAgMTU3LCAgICAyOTUsCisgICAgICAyNDQ0LCAgIC05MDgsICAgLTQ2NSwgICAtNzY4LCAgICAxMDksICAgIDI1MSwgICAgIDcyLCAgICAtNTksCisgICAgICAgMTY5LCAgICA0MDUsICAgNDM5NSwgICAtODM3LCAgIC05MzEsICAgLTgzOSwgICAtMjE1LCAgIC01NjQsCisgICAgICAgNjU1LCAgICAzNTksICAgIDUwMywgICAgMjk2LCAgIDM1MTQsICAtMTA4MiwgIC0xMTg1LCAgIC04MjcsCisgICAgICAyODc5LCAgLTEyMjQsICAgLTgxMSwgICAtOTcwLCAgICA4MDQsICAgIDkxMSwgICAzMDI4LCAgLTEyODQsCisgICAgICAtNjg4LCAgLTEyMjYsICAtMTI1MSwgICAtNTUxLCAgLTEyNDcsICAgLTI3NSwgICAzNDQxLCAgIDIzMjIsCisgICAgICAtNjMwLCAgLTEyMTMsICAgLTEwOCwgIC0xMTkxLCAgIDExMjksICAgLTg1NCwgICAyODQ4LCAgIDE2MDksCisgICAgICAxMDQ4LCAgIDE1MzUsICAgMjc4NCwgIC0xMjQ1LCAgICA3NzIsICAtMTIzMCwgIC0xMjk4LCAgIC02ODYsCisgICAgIC0xMjkzLCAgIC02MzksICAgIDI3OCwgICAyNDU1LCAgIDk5NzUsICAtMTA3NywgIC0xMjMzLCAgLTEwNTUsCisgICAgICAtMTM5LCAgIC04NTMsICAgIC00OCwgICAgIDI0LCAgIC03MjAsICAgIDUzMywgIC0xMTkxLCAgIDI4MDksCisgICAgIC0xMDE1LCAgIC04OTksICAgIC0yOCwgICAtNzY1LCAgIC0xNDcsICAgIDE0NiwgICAgNTkyLCAgICA4MTQsCisgICAgIDEyNDkzLCAgLTEyNzQsICAtMTA3MiwgIC0xMjk3LCAgICA4NzcsICAtMTA2OCwgIC0xMTc5LCAgLTEwMzIsCisgICAgICAxMDIzLCAgLTExNzgsICAgLTg0MCwgICAgOTMwLCAgIC02NjAsICAgMTIxNiwgICAtMzY2LCAgIC00MDYsCisgICAgICAgLTk3LCAgICAgNzcsICAgIDE3OSwgICAgMzQwLCAgIC05NzMsICAgLTk5MywgICAyMjgwLCAgIDE3NzUsCisgICAgICAtNjMxLCAgICAtMTcsICAgLTE4NiwgICAgNTA3LCAgICA0NTksICAgIDY0NSwgICAyMDk1LCAgLTEwMTksCisgICAgIC0xMDY3LCAgIC05NDksICAgLTg1NywgIC0xMjAyLCAgIC05MDQsICAgIC00OCwgICAxMTU2LCAgIDEyNzMsCisgICAgIC0xMjMwLCAgLTEyNDUsICAtMTIwMywgIC0xMDM2LCAgLTExNTAsICAgLTk1NSwgICAxMTkzLCAgIDE5NDMsCisgICAgICAxNDM3LCAgIDEzMjksICAgLTYxOCwgIC0xMDU1LCAgIC03MzAsICAtMTAxNCwgICA0OTUzLCAgLTExMjUsCisgICAgICAxMDg5LCAgIDEwODUsICAgMTA0NywgICAxMDQ1LCAgICA4MTMsICAtMTAzNiwgICAxMjcwLCAgIC03MTUsCisgICAgICAtNjg0LCAgICAtOTYsICAgLTEzMSwgICAgMjg5LCAgICA3ODIsICAgIDYyOCwgICAtOTc5LCAgIDEwNjAsCisgICAgICAtOTc1LCAgIC05NjQsICAgLTgxMSwgICAgLTE0LCAgICAyMjMsICAgIDQyMiwgICAgNTYzLCAgICA2OTYsCisgICAgICAtOTAxLCAgIC02MzMsICAgIDQ5NiwgICAtMTM2LCAgICAgMjIsICAgIC04MywgICAgLTUyLCAgICAyNjQsCisgICAgICAgIDI0LCAgICAxNDcsICAgLTQ0NiwgIC0xMTk3LCAgLTEyNTgsICAgLTY4NywgIC0xMjM5LCAgIC03OTUsCisgICAgIC0xMDY2LCAgLTExOTYsICAgIDE0NywgICAyNjUzLCAgLTEyMzEsICAtMTI3NSwgIC0xMjQwLCAgLTEwNDEsCisgICAgIC0xMjYwLCAgLTExNTksICAgMTk2MSwgICAgLTM0LCAgIDI5MzcsICAgMjEyOCwgIC0xMzE4LCAgLTEzNTUsCisgICAgIC0xMzI2LCAgLTEzMDAsICAtMTM0NSwgIC0xMzI2LCAgIC04NzAsICAgLTI5OCwgICAyMDE0LCAgIDM4OTAsCisgICAgICAtOTMzLCAgLTEwMTQsICAgLTg1OSwgIC0xMDc0LCAgIC01MDYsICAtMTE2MywgICAtOTU0LCAgIC04MTksCisgICAgICAgNDQwLCAgICA3MzIsICAgLTU4MiwgIC0xMjY4LCAgLTEyMDYsICAtMTAzNywgIC0xMDgxLCAgLTEyNTUsCisgICAgIC0xMTUwLCAgIC04MzUsICAgMjM2MCwgICAxNDY5LCAgLTEyMzIsICAtMTM4NCwgIC0xMzg4LCAgICA1NDIsCisgICAgIC0xMzU5LCAgIC02MDYsICAtMTMzNSwgICAxODUyLCAgIDIxNDIsICAgMzcyMiwgIC0xMjE4LCAgLTEzMjEsCisgICAgIC0xMjY4LCAgLTEyMDcsICAtMTIwMywgIC0xMzE2LCAgIC05NTQsICAgLTY5NiwgICA0NzMwLCAgIDI5MjAsCisgICAgIC0xMjI1LCAgLTEzMDYsICAtMTEzMSwgIC0xMjczLCAgLTEyNzYsICAtMTIzOCwgIC0xMDQwLCAgIDIwNzksCisgICAgICAyNjUyLCAgIDE5MzEsICAtMTE2NywgIC0xMzAyLCAgICA2NTksICAgLTUzMiwgICAtNjUwLCAgIC01NjAsCisgICAgIC0xMDI4LCAgICAxODYsICAgMTIyNCwgICAyODExLCAgIC04OTYsICAgLTQ0OSwgICAtOTk5LCAgIC04MjMsCisgICAgICAgLTgxLCAgIC04NzYsICAgIDUwMiwgICAtMjkzLCAgICA2ODAsICAgIDczMywgICAtODM2LCAgLTExMTEsCisgICAgIC0xMTMyLCAgIC04NjUsICAtMTE0MSwgICAtOTM4LCAgIC05ODAsICAgMTI4NywgICAgNTgxLCAgIDE0MzgsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBmY2IxNnNbXSA9IHsKKyAgICAgIDEyNjAsICAtMTQyNywgIC0xNDAwLCAgIC05OTYsICAgLTk1OCwgIC0xMTk1LCAgIDYyNjEsICAgICAzMSwKKyAgICAgICA5NjcsICAgIDc1MiwgICAzNzc2LCAgIC05NzUsICAgLTg0MCwgICAtNzA3LCAgIC02OTYsICAgLTU1NSwKKyAgICAgICAgNDUsICAgMTE1OSwgICAgICA0LCAgICAzNTgsICAgNDcxOCwgIC0xNDcxLCAgLTE0NjQsICAtMTI5MSwKKyAgICAgLTEzNjQsICAgLTkzNCwgICAtODc4LCAgIDUxOTgsICAgLTI3MywgICAxNTU1LCAgLTE0MzgsICAtMTcyOSwKKyAgICAgLTE1NzksICAtMTQ3MCwgIC0xODIwLCAgLTE0MzYsICAtMTI1NSwgICAtNjMxLCAgIDQyODcsICAgNDAyNSwKKyAgICAgIDEyMzMsICAgLTY4NCwgICAtNzQ4LCAgIC03NDIsICAgLTU0NywgICAtMjI5LCAgICAzMjEsICAgIDEyNiwKKyAgICAgICA3OTQsICAgIDY3MCwgICA2Njg5LCAgLTEwNDEsICAtMTE2MCwgICAtODYxLCAgLTEwMDIsICAgLTk3NiwKKyAgICAgICAxNDcsICAgLTY2OCwgICAgNTIxLCAgICA5NDAsICAtMTE4NiwgICAyMDk3LCAgIC01NzAsICAgMTc1OSwKKyAgICAgIC0yNTEsICAgLTQ0MiwgICAgLTkyLCAgICAgNDYsICAgICA5OSwgICAgIDEyLCAgLTEzMzYsICAtMTA2MSwKKyAgICAgIDQ0MjcsICAgLTk0NSwgICAtODYxLCAgIC00NjAsICAgLTMwNiwgICAgNDk0LCAgICA0ODEsICAgIDUzNiwKKyAgICAgLTExMDEsICAtMTEwNSwgICAyNjk1LCAgICAzMTYsICAgLTgwMSwgICAtMTU5LCAgIDEwNDIsICAgLTU3NywKKyAgICAgICAtNzgsICAgIDM0MCwgICAyMzQ3LCAgIDE0NDgsICAgIDEzNSwgICAtMzgxLCAgIC02ODgsICAgLTQ5MywKKyAgICAgIC0yNTQsICAgLTIzNCwgICAgLTc0LCAgICAtODAsICAtMTA0NywgIC0xMjQ2LCAgIC03MjksICAgLTk4NSwKKyAgICAgIDUzOTksICAtMTAxOCwgICAgNjQzLCAgICA4MjIsICAgIDg4OSwgICAgNDMyLCAgIC0zMjgsICAtMTM4NiwKKyAgICAgLTE0MjAsICAgLTcwMiwgIC0xNDUwLCAgIDY5MjcsICAtMTEwNywgICAgNDY1LCAgIDE2MjUsICAgMTExNiwKKyAgICAgLTEyNTgsICAgMjg0NywgICAtODkzLCAgIC04OTUsICAgLTUyMSwgICAtMjYzLCAgICAxMTIsICAgIDE1NywKKyAgICAgICA1NTYsICAgIDUwMCwgICAgMTgyLCAgIC02NTIsICAgLTIyNiwgICAgMjU4LCAgIC02MzgsICAgLTU2NiwKKyAgICAgIC00MTksICAgLTY2OSwgICAtMjI0LCAgIC0yMjEsICAtMTE5NywgICAtMjI3LCAgIC01ODIsICAgICA5MiwKKyAgICAgIDE5MTQsICAgLTE4NCwgICAgLTExLCAgICAtMTgsICAgIDI3MCwgICAgMTY2LCAgLTEyOTQsICAgIC02MiwKKyAgICAgIDE1MzYsICAgMjQ3MCwgICAtNDEzLCAgIC02MTksICAgLTM5OSwgICAgIDI0LCAgICAxMDYsICAgICA1NCwKKyAgICAgLTEyMjMsICAgMjY3MiwgICAyNDAwLCAgICAtNTQsICAgLTU3NywgICAtNjkyLCAgIC0zMDEsICAgICAtMywKKyAgICAgICAyMDYsICAgICA4OSwgIC0xNDI0LCAgLTE0OTEsICAgODQyNSwgIC0xMDcyLCAgIC0yNDIsICAgLTQyMCwKKyAgICAgIC0xOTQsICAgICAtMSwgICAgNDg5LCAgICAzMzEsICAgLTkzOCwgIC0xMzE5LCAgIDI0OTMsICAtMTM1NSwKKyAgICAgICA1NTEsICAgMjI5NywgICAgMTk3LCAgICAgLTksICAgIDcxNywgICAgNDM0LCAgLTEyMzcsICAgLTc3MywKKyAgICAgLTEwMjEsICAgMzk0NSwgICAtNTY2LCAgICAxMTYsICAgIDI0NiwgICAgMTUwLCAgICA1MTAsICAgIDM3MCwKKyAgICAgMTE4MDQsICAgLTQ1NywgIC0xMDA2LCAgLTEyMzEsICAtMTE3NSwgIC0xMDg2LCAgLTEyMjEsICAgIDU4OSwKKyAgICAgIC02NzksICAgLTc1NywgIC0xMTgzLCAgIDY1MDIsICAgLTU4NCwgICAtNDU0LCAgIC02MjksICAgLTU3MCwKKyAgICAgIC00MTMsICAgLTM1MiwgICAtMjc5LCAgICAtMzIsICAtMTIzNiwgICAtOTQ2LCAgIC03NjAsICAgMTUzNSwKKyAgICAgIC04NjUsICAgLTcxMiwgICAtMjI0LCAgICAzNDMsICAgIDY0NywgICAgNjEzLCAgLTEzNDgsICAgLTkzOCwKKyAgICAgIC05NjEsICAgODI3MywgIC0xMTMwLCAgIC01OTEsICAgLTIyNSwgICAgMjEwLCAgICA0MjAsICAgIDE0MCwKKyAgICAgLTEyNDcsICAtMTE2NiwgICAtOTY2LCAgIC05ODYsICAtMTEyMCwgICAtOTA3LCAgIC0xODEsICAgIDQ3MCwKKyAgICAgIDE4ODgsICAgMTE2MSwgIC0xMDc2LCAgLTEyOTgsICAgMzQ3OSwgIC0xMTUxLCAgIDI0MTAsICAgLTM5NiwKKyAgICAgICAgIDEsICAgIC00NCwgICAgMzU3LCAgICA1OTQsICAgLTg5NiwgICAgNzQ1LCAgICAtMzMsICAgLTQyMiwKKyAgICAgIC0zMzIsICAgLTI1OSwgICAgICAwLCAgICAgNDgsICAgIDE0MywgICAgMTkwLCAgLTEwMDksICAgLTgzNywKKyAgICAgIC04NzYsICAgLTM3MSwgICAtMzcwLCAgIDE1MjAsICAgLTE1MCwgICAgMjUxLCAgICAyNDAsICAgIDQ0OCwKKyAgICAgLTEwMjQsICAtMTAwOCwgICAtNTY4LCAgIC00NTAsICAgLTYxMSwgICAtNTM2LCAgIDE3NjMsICAgIC0zNCwKKyAgICAgICAzNTUsICAgIDQ1NCwgICAtNzY5LCAgIC01OTksICAgLTYzOSwgICAtNzM3LCAgIC05MTIsICAgLTcyNSwKKyAgICAgIC01MDQsICAgLTIzMCwgICAgNTMyLCAgIDMyOTQsICAtMTA3NywgICAtMjg5LCAgIC04NzUsICAgLTU0MiwKKyAgICAgIC01NzQsICAgLTYwNCwgICAtMzM5LCAgIDI1MTEsICAgIDQ3OSwgICAgNzQyLCAgLTEyMTgsICAgLTk0NiwKKyAgICAgIDEzMjEsICAgLTUyMiwgICAtNTQ0LCAgIC05NTAsICAgLTc2NSwgICAgNjMyLCAgICA2MzksICAgIDQ5NywKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGZjYjE2bVtdID0geworICAgICAgLTk0MCwgIC0xMTk3LCAgLTExOTAsICAtMTIwMCwgIC0xMTkyLCAgIC05NjAsICAgLTcxOCwgICAgNjEwLAorICAgICAgMzMwMCwgICAzMjUzLCAgLTE1MTUsICAtMTY4OSwgIC0xNzk4LCAgLTE3OTgsICAtMTc5MywgIC0xNzY0LAorICAgICAtMTYxNiwgICAgIDMzLCAgIDIzNzcsICAgNzc3OCwgICAtNjY4LCAgIDE3NDUsICAgMTUwMSwgICAgNzg1LAorICAgICAgLTMzNiwgICAtODIzLCAgIC03MDgsICAgLTQ0NiwgICAtNDU1LCAgIC04MTIsICAgODg2MiwgICAgMTU5LAorICAgICAtMTE0MSwgIC0xMjYxLCAgLTEzMjMsICAtMTI5OSwgIC0xMjYxLCAgLTEyMjcsICAtMTIxNCwgIC0xMDkwLAorICAgICAgMzU4NCwgICAyMDkyLCAgICA2ODgsICAgLTUzMSwgICAtODQ4LCAgLTEwMDAsICAtMTA0NywgIC0xMTkyLAorICAgICAtMTEwNCwgICAtODg3LCAgIDUxNjMsICAgLTM0NywgIC0xMTI5LCAgLTEyODUsICAtMTMzNiwgIC0xMjkxLAorICAgICAtMTI0OSwgIC0xMTA5LCAgIC00OTgsICAgMjUxMSwgICAtNjExLCAgIC03MDMsICAgLTUxNiwgICAtMjQwLAorICAgICAgIC02OCwgICAgMzk5LCAgIDE1NzAsICAgIDI1MiwgICAgIC01LCAgICAgNDMsICAtMTE2MywgIC0xMTY4LAorICAgICAtMTAwOCwgICAtOTIxLCAgIC05OTUsICAgLTU2OSwgICAgOTI1LCAgIDE1MTEsICAgMTAwMSwgICAyMDIzLAorICAgICAxMjkyNiwgICAgMTM1LCAgLTE1OTgsICAtMTc3OCwgIC0xODQ3LCAgLTE4NTAsICAtMTgzNiwgIC0xNzM0LAorICAgICAtMTY5NSwgIC0xNjkwLCAgICA2MjEsICAgNDY0NywgICAgNTg4LCAgIC03NTIsICAgLTk3MywgICAtOTk2LAorICAgICAgLTk1MywgIC0xMDgxLCAgLTEwNjAsICAgLTY3MiwgICAtODY4LCAgICAyNTksICAgNDk0MCwgICAtMTE3LAorICAgICAgLTcxOCwgICAtOTA3LCAgIC04MjgsICAgLTc3NiwgICAtNjA2LCAgIC05ODEsICAtMTAwMiwgICAtNTI2LAorICAgICAgLTM4NSwgICAgNTI3LCAgIDE1MDEsICAgLTIzOSwgICAgIDM4LCAgICAgMjUsICAgIDExMiwgICAgLTc3LAorICAgICAgMTEyMiwgICAtMjUwLCAgIC0zNTIsICAtMTExMywgIC0xMTAxLCAgIC05NDIsICAgLTY4MSwgICA1MTU2LAorICAgICAgLTgwMCwgICAtNjM2LCAgIDU4MTQsICAgLTE2MCwgICAtNzc3LCAgIC04MjUsICAgLTg0NCwgICAtNzQ3LAorICAgICAgLTY5NywgICAtNjQ1LCAgIC02NjgsICAgLTQ5MiwgICAtOTM2LCAgICA0OTEsICAgLTI4MCwgICAyNTczLAorICAgICAgLTI2OSwgICAtNzM2LCAgIC0zNzUsICAgLTI2NSwgICAgLTk4LCAgIC0yNDMsICAgLTkyMCwgICAtMjM2LAorICAgICAgIDQ0NiwgICAxMDk1LCAgIC02NjYsICAgLTYwMCwgICAtMjQ2LCAgICA3ODMsICAgIDI4MiwgICAgICAwLAorICAgICAtMTA2NCwgICAtMTE2LCAgIDIyNzEsICAgLTExOCwgICAtNDgyLCAgIC0yNDAsICAgLTE4NywgICAtMjcxLAorICAgICAgICAzNiwgICAgIDkxLCAgIC02OTUsICAgLTI1NCwgICAtMzgzLCAgIC05NDgsICAgIDc0NSwgICAyNzIyLAorICAgICAgLTEyOSwgICAtNzk5LCAgICAyMzgsICAgLTM3OSwgICAyODcyLCAgIC01MTYsICAgLTg2OCwgICAtNjIzLAorICAgICAgLTU1MSwgICAtMjc1LCAgICAgMjIsICAgIDM3OSwgICAtMTg1LCAgIC0yMzAsICAgMTUyNCwgICAtNjcyLAorICAgICAtMTA2MiwgIC0xMTY0LCAgLTExNzcsICAtMTEzNywgIC0xMDU4LCAgIC03OTAsICAgICAgNiwgICA0OTI4LAorICAgICAgLTU1MSwgICAtMzg5LCAgIC00NjAsICAgLTM5NCwgICAtNjc0LCAgIC01ODYsICAgLTMyNywgICAtMTc4LAorICAgICAgIDYxNSwgICAyODY4LCAgLTE0NjcsICAtMTIwMywgIC0xMzE2LCAgLTExMjAsICAgLTk5NiwgICAgNzQ3LAorICAgICAgLTIxOSwgICAyMDIzLCAgIDE4NzUsICAgIDI1NCwgICAtODcxLCAgIC05OTIsICAtMTA2MiwgIC0xMTEwLAorICAgICAtMTE0OSwgICAtOTkyLCAgIC00OTIsICAgICA0MCwgICAgNTI4LCAgIDUzNzQsICAgICA4MywgICAtNTU5LAorICAgICAgLTg2MiwgICAtNzYwLCAgIC01NDEsICAgICAyOCwgICAgMjA3LCAgICA2MjksICAgIDUwMiwgICAxMjYwLAorICAgICAgLTQ3MywgIC0xMTEwLCAgLTEzMzYsICAtMTM5MCwgIC0xNDEyLCAgLTEzNzksICAtMTMyOSwgIC0xMDgxLAorICAgICAgLTIzOCwgICA5ODQ0LCAgLTEzMzIsICAtMTMwNiwgIC0xMjc1LCAgIC04ODEsICAtMTI2NywgIC0xMjQ5LAorICAgICAgLTIzNywgICAyODgyLCAgIDM1MzUsICAgIDU4NCwgICAgLTEzLCAgICAgNTIsICAgIC01MCwgICAgIC00LAorICAgICAgICAgNywgICAgICA1LCAgICAgMjAsICAgIC01NSwgICAgICA1LCAgICAgNDUsICAgMTU4NywgICAgMzUwLAorICAgICAgIDE5MSwgICAgNjE3LCAgICAxNTMsICAgLTIzNiwgICAtMzM2LCAgIC02NDksICAgLTc5OCwgIC0xMDYzLAorICAgICAgMTQ1MSwgICAgNzA3LCAgICAyNTMsICAgLTczMywgICAtOTIzLCAgIC04NTksICAgLTYyMSwgICAtNzM4LAorICAgICAgLTU1NSwgICAxNjIzLCAgIDE3MjcsICAgLTQxMSwgICAtNzI0LCAgIC03NzIsICAgLTc0NiwgICAtNjc1LAorICAgICAgLTY4OCwgICAtMjA5LCAgICA5MTUsICAgIDYyMiwgIC0xMDM4LCAgIC00NzQsICAgLTM0MywgICAgLTkxLAorICAgICAgLTE3MywgICAtMTA0LCAgICAyNTUsICAgICA5NiwgICAxNTQ3LCAgICA3NzMsICAgLTYyNSwgICAyMjcyLAorICAgICAgIC05MCwgICAtNTA5LCAgIC01MjcsICAgLTI0NywgICAtMTQ3LCAgIC0yMzQsICAgIC00NSwgICAgMTY2LAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMTZzbFtdID0geworICAgICAtMTMzNywgIC0xMTIyLCAgLTE1NTksICAtMTQ1MiwgIC0xMzUzLCAgIC05NzMsICAgMzg1OCwgICAxMTQ1LAorICAgICAgMTIyNSwgICAyMTAzLCAgIC02MDcsICAgLTE4MSwgICAgNTU3LCAgIC00MjksICAgICAxNSwgICAtNDk2LAorICAgICAgLTQ0NCwgICAtNTIzLCAgLTE4NjYsICAtMTEzNCwgIC0xMjcwLCAgIDMwMjksICAtMTExMCwgICAtNzk4LAorICAgICAgLTgyNCwgICAtNjU5LCAgICAgNDQsICAgIDYxNCwgICAxMDU5LCAgIDExNzMsICAgIDcxNCwgICAtOTMyLAorICAgICAtMTA5NSwgIC0xMDYxLCAgIC05MjEsICAtMTAzNCwgICAtODczLCAgICAgIDcsICAgLTg3MiwgICAgNjYwLAorICAgICAtMTMzNSwgIC0xNDk2LCAgLTE2MjMsICAtMTQwNSwgIC0xMDcwLCAgIC02ODAsICAgIDk0MywgICAgMTM0LAorICAgICAgLTE5MCwgICAyODM3LCAgLTEwMzQsICAgLTIyMSwgICAtMzM3LCAgIC01NDAsICAgLTU3MSwgICAtMTczLAorICAgICAgLTQxMSwgICAyMzE0LCAgIC0xMTEsICAgIDk3MCwgIC0xMjIwLCAgLTEwMzYsICAtMTA5NiwgICAtMTQ3LAorICAgICAgMTA4NywgICAgNjA0LCAgIC0zNjcsICAgICA4MywgICAgNDYxLCAgICA2NzksICAtMTMzMywgICAgMTk0LAorICAgICAtMTI5MiwgIC0xMTM5LCAgLTEwOTcsICAgLTU3MCwgICAtNTA4LCAgIC0xMDksICAgICA1NCwgICAgOTYyLAorICAgICAgMjU5MiwgIC0xMTEyLCAgIC05NDQsICAgLTYzNiwgICAtNTIxLCAgICAgMTIsICAgIDIzMCwgICAgNDQyLAorICAgICAgIDU2MiwgICAgNjI0LCAgLTExMDcsICAtMTE5MCwgICAxNTU0LCAgIC05ODEsICAgMTUwNywgIC0xMDEzLAorICAgICAgLTM5NCwgICAgNTk1LCAgICA4MjMsICAgMTA5NCwgIC0xNDUzLCAgLTEyOTgsICAgIDI0MiwgIC0xMTg1LAorICAgICAgLTY4NiwgICAtNTQxLCAgICA4NTgsICAgIDMzMSwgICAgNjk1LCAgIDExOTcsICAtMTI1OSwgICAgOTY4LAorICAgICAtMTE4MCwgIC0xMjU0LCAgIC03NTIsICAgMTQ3MywgICAgMjIyLCAgICAzNDIsICAgIDk3MywgICAxMDI5LAorICAgICAtMTYzMSwgIC0xNTAwLCAgLTE2MTksICAtMTUxNywgIC0xMjk5LCAgIDE2ODMsICAgMjIwMywgICAxMTYzLAorICAgICAgMTIyNSwgICAxNDk3LCAgLTExODksICAgLTkzNywgICAtOTMxLCAgIDMxOTMsICAgLTk3NywgICAtNzA4LAorICAgICAgLTI2MiwgICAgNTQ5LCAgICA5MTcsICAgMTQ2NSwgICAgNzA0LCAgIC01NjUsICAgLTcwOCwgICAgODQ2LAorICAgICAgLTEzMCwgICAtMzIyLCAgIC0yNTcsICAgIDIyMSwgICAgMzY3LCAgICAzMDksICAtMTQxNiwgIC0xMTIzLAorICAgICAtMTMyMywgIC0xMjYwLCAgIC00MDUsICAgMzMwMywgICAtMjEwLCAgICA3ODUsICAgMTAwNywgICAxNjE2LAorICAgICAtMTA0MywgICAtNzE3LCAgICAgNDQsICAgIDgyNCwgICAgNDE5LCAgIC00OTIsICAgLTU3OSwgICAtNjA0LAorICAgICAgIC0xNSwgICAgNjc2LCAgLTEwNjcsICAtMTA3OSwgICAzODk3LCAgLTEyMTEsICAgLTQ3NCwgIC0xMDIwLAorICAgICAgLTU4OSwgICAgMTE0LCAgICA1OTMsICAgMTUwNCwgIC0xNDgxLCAgLTEyNDksICAtMTAzNiwgIC0xMDEyLAorICAgICAgLTcxOSwgICAgODQ2LCAgIC0xODksICAgLTI5NywgICAgLTMxLCAgIDEyMDksICAtMTc2MSwgIC0xNTY2LAorICAgICAtMTQ0OSwgIC0xNjQ1LCAgLTE0NjQsICAgMTQyMiwgICAgIDI0LCAgIDIxNTMsICAgMTM3NywgICAxOTQ4LAorICAgICAtMTQ4MCwgICAgNjUyLCAgIC05MjksICAgLTQxNSwgICAtNjg5LCAgIC0zODYsICAgMTYyOCwgICAgNDg5LAorICAgICAgIDQ4NywgICAgNzU2LCAgLTE0MjQsICAgLTgwNSwgICAxMjQxLCAgICAyMjgsICAgLTY5NywgICAtMzE2LAorICAgICAgIDQyMywgICAgNjYwLCAgICA1NTcsICAgIDU4NywgICAxMjQ4LCAgIC03NzcsICAgMTA4OCwgICAtODQ4LAorICAgICAgLTQ5OCwgICAtMzk5LCAgICAtNjAsICAgIDE2OSwgICAgNDk3LCAgICA2ODksICAgNTY3OSwgICAtNzc4LAorICAgICAtMTEwOSwgIC0xMTE4LCAgIC04OTUsICAtMTA0MiwgICAtNTA0LCAgICAzOTAsICAgMTY3MCwgICAgNDY5LAorICAgICAgIDk3NywgICAtOTI5LCAgLTExNzMsICAtMTA1OCwgICAtOTk5LCAgIC02OTYsICAgMTkxMiwgICAgIDUyLAorICAgICAgMTI5NywgICAxMDgxLCAgLTE0NjksICAtMTI0MywgIC0xMDU1LCAgICAzODUsICAgLTUyOSwgICAgOTEwLAorICAgICAgICA3OSwgICAgNTA4LCAgIDEyMjUsICAgIDc1MywgICAgNjU2LCAgLTEzMDcsICAtMTIzOSwgIC0xNDcwLAorICAgICAtMTExMCwgIC0xMjU1LCAgIC0zNjIsICAgMjM1MSwgICAgODg5LCAgIDE2ODcsICAtMTU2NiwgIC0xMzMxLAorICAgICAtMTQxMCwgIC0xMzg1LCAgICA3NzksICAgLTQ5OSwgICAtMjE3LCAgICA5MzYsICAgMjA2NCwgICAxNDkzLAorICAgICAtMTQ5OSwgIC0xMzQ1LCAgLTExNjIsICAgIDc5MCwgIC0xMTE1LCAgIC02NzMsICAgMjA4MywgICAxMDEwLAorICAgICAgIDU4OCwgICAxMjY1LCAgLTE0MzksICAtMTE2OCwgIC0xMjk0LCAgICA3NTIsICAtMTQyMSwgIC0xMjM0LAorICAgICAgLTE2OSwgICAtNTI5LCAgIDE2MDYsICAgMjEzMSwgIC0xNTU2LCAgLTE0NDIsICAtMTQ0NCwgICAgNDg3LAorICAgICAtMTI2MCwgIC0xMTM5LCAgICAzNjAsICAgMjUyOCwgICAxOTk0LCAgIDE2ODYsICAtMTU0OCwgIC0xNDczLAorICAgICAgLTU2MywgIC0xMTI1LCAgICA5NjcsICAgMTQ5MCwgICAxNTAzLCAgICA0ODcsICAgIDk5MSwgICAxMDI0LAorICAgICAtMTQzMCwgIC0xMTUxLCAgLTEyMTUsICAgLTcyOSwgICAtNzQ2LCAgIC03NjIsICAgLTQ3MiwgICAgNzc4LAorICAgICAgIDg4OSwgICAgNzc0LCAgLTEzMjksICAtMTEyOSwgICAxMzgzLCAgLTEyMzAsICAgLTcyMywgICAxNDc4LAorICAgICAgIDM3OSwgICAgMTYxLCAgIDEyNjYsICAgMTIzOCwgIC0xNDY3LCAgIC04NDMsICAtMTI3NywgIC0xMzIzLAorICAgICAgLTcxNSwgICAgIDU4LCAgIC0xODIsICAgNTE0MCwgICAgNzYyLCAgIDE3MjMsICAtMTI4NSwgICAxMTM0LAorICAgICAtMTE3NSwgIC0xMDU3LCAgIDEyOTQsICAgICAtNCwgICAtNDE3LCAgICA1NTcsICAgIDkzOSwgICAxMTgyLAorICAgICAgICAzOSwgICAgNTY1LCAgIC04MDksICAgLTcwMywgICAtNzgzLCAgIC04ODMsICAgLTExMiwgICAgNDEyLAorICAgICAgMTA1NiwgICAgNjkxLCAgIC0yNzMsICAtMTMzNCwgICAtODk4LCAgLTEzNDUsICAtMTA2OSwgIC0xMjQ3LAorICAgICAgLTEwNSwgICAgNjM4LCAgIDY4MTEsICAgMTE1NywgICAgOTgyLCAgIC04NTYsICAgLTgwNSwgIC0xMDkzLAorICAgICAgMTI2NywgICAtNzQ3LCAgIC02NTAsICAgIDMxMSwgICAgMjgxLCAgIDEwNzYsICAgMTM3MSwgICAxNjE0LAorICAgICAgLTg5MSwgICAtODg2LCAgIC0zOTYsICAgLTI0NiwgICAgLTY1LCAgICAgNzcsICAgIDQ3MiwgICAgNjA1LAorICAgICAgLTk0MywgICAgMTc4LCAgIC01MDksICAgIDExMiwgICAtMTQyLCAgICA1MTIsICAgIC02NiwgICAgMTA5LAorICAgICAgIDE0NCwgICAgIDc2LCAgIDI5MzQsICAtMTIwMywgIC0xNDI4LCAgLTE1MjUsICAtMTI2OSwgIC0xNjE4LAorICAgICAtMTEyOSwgICAtMTg0LCAgIC0yMjUsICAgMzE1NywgICAtMjQ5LCAgLTEyNzYsICAtMTA1NSwgICAtNDM5LAorICAgICAgLTE2MSwgICAtMjY4LCAgICAyODQsICAgIDYxNCwgICAgNzc4LCAgICA2NzAsICAtMTI0MywgICAxNjgyLAorICAgICAgIDkxOSwgICAtNDY4LCAgIC00NzksICAgLTM0MSwgICAgIDMxLCAgICA0NjgsICAgIDMyNSwgICAgNjA2LAorICAgICAtMTA4MSwgICAtNzIzLCAgICAgODMsICAgLTM5OSwgICAtMjc1LCAgIC02NTgsICAgIDI0MCwgICAgMTQ5LAorICAgICAgMjc0NiwgICAgNjc5LCAgLTE1NzMsICAtMTI4NywgICAtNDk0LCAgICA3NzUsICAgIDk3NSwgICAtNzUxLAorICAgICAgIC00NywgICAxNzU4LCAgICA2NTIsICAgMTE1NSwgIC0xNDY1LCAgLTEwNzMsICAtMTA4NywgIC0xMDI2LAorICAgICAgIDI4OSwgICAgMzQwLCAgICA0NDgsICAgMTM0OCwgICAgMzUxLCAgICA2ODIsICAgMjA2NSwgIC0xMTgzLAorICAgICAtMTMxMywgIC0xNTYyLCAgIC00NjYsICAtMTU0NiwgIC0xMDc3LCAgIC00NzcsICAgMzAxMiwgICAyNTEyLAorICAgICAtMTU2MCwgIC0xNTMyLCAgLTE0NDEsICAtMTIyOSwgICAgODYxLCAgIC00MjEsICAgMTUxNSwgICAyMTk1LAorICAgICAgMTE2MywgICAxNDE4LCAgLTEyNjgsICAtMTEwMywgICAtODA0LCAgLTEwOTQsICAgMzI1NCwgICAtNzExLAorICAgICAgLTU1OCwgICAgNzEzLCAgIDE0MTQsICAgMTY4NCwgICAgNTQyLCAgIC03ODEsICAgLTgyNywgICAtODE0LAorICAgICAgLTI0NSwgICAxMTI5LCAgIC0xNjAsICAgIDIxMCwgICAgMzg2LCAgICA2MTgsICAtMTYzMywgICAgNDg4LAorICAgICAtMTU4NCwgIC0xNTcxLCAgLTEzNDksICAgLTY2MiwgICAgNzExLCAgIDE1MTYsICAgMTY2MSwgICAxNjczLAorICAgICAtMTUxMCwgIC0xNTMwLCAgIDEwMTMsICAtMTE3MiwgICAgNDI1LCAgLTE0MTUsICAgLTg1NiwgICAyOTYzLAorICAgICAgMjI1OCwgICAxOTE5LCAgIC03NDQsICAtMTIwOCwgICAtODYzLCAgIC02MzQsICAgLTcyOSwgIC0xMDY4LAorICAgICAgLTg1NywgICAtMjg5LCAgICA3MDEsICAgNjcwMywgIC0xNTAyLCAgLTEzNTMsICAtMTUzMSwgIC0xMzcyLAorICAgICAtMTM4OCwgIC0xMDY3LCAgIDEzOTIsICAgIDEwMCwgICAyNTcwLCAgIDE3MDMsICAtMTU1MSwgIC0xNTAwLAorICAgICAtMTU4NywgIC0xNjkzLCAgLTE3NTMsICAtMTQzMSwgIC0xMDQ4LCAgIDExNjIsICAgMTMwOCwgICAzMDczLAorICAgICAgLTk5OCwgIC0xNTc1LCAgIC01MTcsICAtMTM0NiwgIC0xMjkzLCAgLTE0OTMsICAtMTM3NSwgIC0xMTA5LAorICAgICAgLTgwMywgICAyOTcyLCAgLTE0NDYsICAtMTMxNiwgIC0xMTE0LCAgLTE0MDUsICAtMTI0MCwgIC0xMDU3LAorICAgICAtMTEwOSwgICAtNTg5LCAgIDI2MjMsICAgMTYyNiwgIC0xNTU1LCAgLTEwMjYsICAtMTM0NiwgIC0xNDY3LAorICAgICAgLTkwMiwgICAxMjkxLCAgICAxNzYsICAgIDYzMCwgICA0MjkzLCAgIDE5NDksICAtMTIzMywgIC0xMzYyLAorICAgICAgLTkzMCwgIC0xMTc1LCAgLTExMTgsICAtMTM3NSwgIC0xMTcyLCAgIC05NjcsICAgNDg5NiwgICA0MTk1LAorICAgICAtMTc0NCwgIC0xNTYyLCAgLTE3OTcsICAtMTgxNSwgIC0xNTc3LCAgLTExOTQsICAgIDM3MSwgICAzMzI2LAorICAgICAgMzE4MywgICAzMDcxLCAgLTE0MjUsICAtMTc3MywgIC0xNTYyLCAgLTEzNTgsICAgLTU0NywgICAtMjQ2LAorICAgICAgICAyNCwgICAtNTI2LCAgLTE1MDIsICAyOTM3NiwgICAtODYwLCAgIC02MTQsICAgLTg1NywgICAtNzk1LAorICAgICAgIDc5MywgICAtNjE2LCAgIDE2OTEsICAgLTEyNSwgICAgMTU2LCAgICA1NTksICAtMTY0MywgIC0xNDYyLAorICAgICAtMTUyMywgIC0xNDEzLCAgLTEyNTEsICAgLTU5MiwgICAxMDE0LCAgIDE4ODgsICAgIDI0MywgICAxMDQxLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMTZzc1tdID0geworICAgICAgIDMwOCwgICAtNTMyLCAgIC04MTEsICAgLTk3NCwgICAtNjQxLCAgIC00MzEsICAgMzQwOSwgICAgMjU4LAorICAgICAgIDU2NywgICAgNjQxLCAgIDEzMTUsICAgLTcyMywgICAtNzM4LCAgIC01MDIsICAgIDE0MiwgICAgNjc4LAorICAgICAgIC02NywgICAtMTcwLCAgICAgNzMsICAgIC02NSwgICAyNzE3LCAgIC04MDQsICAgLTk1OCwgICAtODc4LAorICAgICAgLTUzMiwgICAtNTYyLCAgICAyMzgsICAgIDQ5NywgICAgNTQ4LCAgICA3MTgsICAgLTg2OCwgICAtNjY5LAorICAgICAgLTkzMiwgIC0xMDA0LCAgIC01MTgsICAgLTUwMiwgICAtMjg2LCAgICA0MDUsICAgMjk4NywgICAxNDIwLAorICAgICAgIDE3NCwgICAtNzc5LCAgIC03NDgsICAgLTU3NSwgICAtMTUzLCAgICAtNDAsICAgIDM0MCwgICAgNDEzLAorICAgICAgIDI3NSwgICAgMzg3LCAgICA5NjUsICAgICA4MiwgICAtNTUwLCAgIC03NDQsICAgLTU5MiwgICAtNTkxLAorICAgICAgLTYwNCwgICAtMTYzLCAgICA0MjgsICAgIDg0MywgIC0xMjgwLCAgIDE3NTYsICAgLTM2OCwgICAgNzc3LAorICAgICAgIC0yOSwgICAtNDUzLCAgICAtNjEsICAgICA0MywgICAgIDUwLCAgICAxMzcsICAgIDk1MCwgICAtMjI5LAorICAgICAgMTUwNCwgICAtNDkxLCAgIC0zNTMsICAgLTE2NywgICAtMjg1LCAgIC0xNTgsICAgIC05NCwgICAtMTg1LAorICAgICAtMTQzMSwgICAgMzAzLCAgICA2NzMsICAgLTc1OCwgICAtNjEwLCAgIC0zMDgsICAgMTI0NywgICAgMzQ4LAorICAgICAgICA5NSwgICAgIDMxLCAgIDE2MzEsICAgMTk2MywgICAtNjI0LCAgIC03NzAsICAgLTQ2NiwgICAtMTUwLAorICAgICAgLTEyMiwgICAtMTIzLCAgICAgMzQsICAgLTE0MSwgICAtODgzLCAgIC0zNzQsICAgLTk0OCwgICAtNjI5LAorICAgICAgMzQyMCwgICAtNzcyLCAgIC0zOTIsICAgIC0zMSwgICAgNjAzLCAgICA2NDYsICAgLTc2MCwgICAtODcxLAorICAgICAgLTkzNiwgICAtOTQ4LCAgIC03MjcsICAgMzU2MywgICAtMzc2LCAgICA4NTgsICAgIDY5OSwgICAgNTYxLAorICAgICAtMTM3MCwgICAyMzY2LCAgIC03NzUsICAtMTI0MSwgIC0xMTA1LCAgIC0yNDcsICAgIDE3NywgICAgNDMyLAorICAgICAgIDQxNCwgICAgMzc5LCAgLTEzNjAsICAtMTA1NywgICAtOTQ1LCAgIC04NDgsICAgLTU2OCwgICAtNzc5LAorICAgICAgLTYzMiwgICAtMzI4LCAgIC0yOTUsICAgIDQyNSwgICAtMzQ5LCAgICA2MzAsICAgLTI3NSwgICAtNTI3LAorICAgICAgIDQzOCwgICAgIDQ3LCAgIC0xOTQsICAgIC05NiwgICAtMjM5LCAgIC01NDUsICAtMTM4MSwgICAtNjg5LAorICAgICAgMTY0NCwgICAxMTY1LCAgIC00MzcsICAgLTE1MywgICAtMTkzLCAgICAzMDcsICAgIDE4MywgICAgIDY2LAorICAgICAtMTMzNSwgICAyNTkwLCAgIDIxNjksICAgLTQ0NywgICAtNDM1LCAgIC0zMTcsICAgIC04MiwgICAgMjA0LAorICAgICAgICA0NSwgICAtMTQ1LCAgLTEzMjQsICAgLTIwNSwgICA0MDE5LCAgIC05NzMsICAgLTU3OCwgICAgIDI4LAorICAgICAgIDE3NSwgICAgNTA2LCAgICAyMzUsICAgIC05OCwgICAtOTA4LCAgIC0yOTQsICAgMTQ0MywgICAtODUwLAorICAgICAgLTU1NiwgICAxNzA3LCAgIC0yNzcsICAgICA1OCwgICAgMjQxLCAgIC0xODgsICAgLTg1MywgICAtNTcyLAorICAgICAgLTU3NywgICAxMjU4LCAgIDEwMDcsICAgLTE5MCwgICAgICAxLCAgICAgLTMsICAgIDEwMywgICAgLTQ5LAorICAgICAgNTM4NSwgICAgMTM3LCAgIC03MDcsICAgLTgzNCwgICAtNTEwLCAgIC01MTcsICAgLTM5MiwgICAtMzkwLAorICAgICAgLTIzMSwgICAtMjc1LCAgLTEyNDksICAgNTIyOSwgICAtODEyLCAgIC04OTMsICAgLTM1MywgICAtNjYzLAorICAgICAgIC0yOSwgICAgMTg3LCAgICAgNDUsICAgICAxMCwgIC0xMzg4LCAgLTExNzEsICAtMTA1MSwgICAgNDEyLAorICAgICAgLTM3OSwgICAtNDExLCAgICAyNDAsICAgIDU3NCwgICAgNjMyLCAgICAyODQsICAgLTgzOCwgICAtOTEyLAorICAgICAgLTkyNCwgICAzMDYyLCAgIC02OTUsICAgLTQwOSwgICAtMjI0LCAgICA0MjIsICAgIDI5MywgICAgMjY3LAorICAgICAtMTQzNiwgIC0xMjM3LCAgLTEzMDMsICAtMTMwNSwgICAtOTE0LCAgIC0yNDMsICAgIDgyMSwgICAgODM5LAorICAgICAgMTA0MywgICAxMjg0LCAgLTExNzgsICAgLTQ5NiwgICAxNTk0LCAgIC03MzYsICAgMTc1MiwgICAtNjAxLAorICAgICAgLTM5NiwgICAgMzMwLCAgICAyMzEsICAgICA0OCwgIC0xMjUzLCAgICA4MDgsICAgLTg5NiwgICAtOTY3LAorICAgICAgLTY1MywgICAgLTg0LCAgICAgIDQsICAgIDQ0MiwgICAgMzYzLCAgICA1ODksICAtMTAwNSwgICAtNjcyLAorICAgICAgLTY4NywgICAgLTkzLCAgIC0yNzQsICAgMTM3NiwgICAtMjMyLCAgICAtNTIsICAgIDM5OSwgICAgMjU1LAorICAgICAtMTA4NSwgIC0xMjE0LCAgLTEwODgsICAgLTc0OCwgICAxMDM2LCAgICA0MTQsICAgIDIyMCwgICAgNTA5LAorICAgICAgIDQzNiwgICAgNDk5LCAgIC02NDgsICAgLTc2NSwgICAtOTMxLCAgIC05ODMsICAgLTc1OCwgICAtNTQzLAorICAgICAgLTM3OSwgICAtMTE1LCAgICA3ODAsICAgMzMyNywgIC0xMDg2LCAgIC04OTMsICAgLTc3MywgICAtODgxLAorICAgICAgLTY4MywgICAgLTExLCAgIC0zMjIsICAgMzQxOCwgICAgNzM5LCAgICA5NjEsICAtMTM2MywgICAtOTI5LAorICAgICAgIDg5OSwgIC0xMDA1LCAgIC03OTIsICAgLTMzOCwgICAtMTg1LCAgICA3MDIsICAgIDYyNywgICAgNjM4LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMTZzbVtdID0geworICAgICAtMTEyNSwgIC0xMzg1LCAgLTE0MzksICAtMTM4NywgIC0xMTIwLCAgIC02ODEsICAgLTEzNSwgICAgNjE2LAorICAgICAgMzA4NiwgICAyNTM3LCAgLTE0NDAsICAtMTIwOSwgIC0xMDI3LCAgLTEyMDksICAgLTYyNiwgICAgMTczLAorICAgICAgIDY2MiwgICAgODk5LCAgICA4NjEsICAgMjE4MCwgICAgMzg3LCAgIDEwMzIsICAgIDkzNiwgICAgMTQwLAorICAgICAgLTM1MywgICAtMzAyLCAgIC0yOTAsICAgLTMzMCwgICAtNTUxLCAgLTEwMTksICAgMzU1NSwgICAgLTY4LAorICAgICAgLTQ0MSwgICAtNTM5LCAgIC01MDAsICAgIC0yNywgICAtNDIzLCAgIC01MDYsICAgLTUyMiwgICAtNDE1LAorICAgICAgMjM0NywgICAxODkwLCAgIC0zMTIsICAgLTc0MiwgICAtNjc5LCAgIC02NzksICAgLTY1MywgICAtNjA5LAorICAgICAgLTQzMywgICAtNDcyLCAgIDI3MDksICAgLTc1NSwgIC0xMTUzLCAgLTEwNjYsICAtMTAyOCwgICAtODYyLAorICAgICAgLTgyNiwgICAtMzE1LCAgICAgNzgsICAgMTY5OSwgICAtMzYzLCAgIC00MjksICAgLTY5MCwgICAtMTkwLAorICAgICAgLTM1OCwgICAtNjY3LCAgIDE5MDksICAgICAzOSwgICAgIC0xLCAgICAxMzgsICAtMTU5MiwgIC0xNTU5LAorICAgICAtMTM1NywgIC0xNTU0LCAgIC03NTAsICAgIDgxMywgICAxNjc2LCAgIDE1MzcsICAgIDk3NywgICAtMjY5LAorICAgICAgODMyMCwgICAtNjAyLCAgLTExNDAsICAtMTE1MywgIC0xMTM2LCAgLTExNzQsICAtMTAwNCwgIC0xMDkxLAorICAgICAtMTM4OCwgIC0xMTg3LCAgIC01MDcsICAgMzEwMywgICAtMjAwLCAgIC02NjUsICAgLTU5MCwgICAtMzgxLAorICAgICAgLTM2NSwgICAgLTQwLCAgIC0yOTUsICAgLTU5MSwgICAtOTYzLCAgICAyNzEsICAgMjIzMSwgICAtNTQ3LAorICAgICAgIC02NSwgICAtMjcwLCAgICAtNjQsICAgIDI0MywgICAtMTgzLCAgIC01NDgsICAgLTc5NiwgICAtMjc3LAorICAgICAgICAtNywgICAtMTY4LCAgIDE1NzUsICAgLTM2MSwgICAgIDM1LCAgICAtMTksICAgIDE5MiwgICAtMTU0LAorICAgICAgLTM4NCwgICAgMTQ0LCAgIC00MjYsICAgLTUyOCwgICAtNTk4LCAgIC03NzgsICAgLTI5NywgICAxODQ3LAorICAgICAgIDU2NCwgICAgMjE4LCAgICA4NjQsICAgLTY1NCwgICAtNDg1LCAgIC00MzUsICAgICA0NSwgICAgNzA5LAorICAgICAgIDYzMCwgICAgLTExLCAgIC02OTEsICAgLTExMSwgICAtNzc1LCAgIC0zNTYsICAgLTUyMiwgICAyMjQ3LAorICAgICAgIC03OSwgICAtNDMzLCAgIC02MjAsICAgIDU5NCwgICAgIDc5LCAgICAgNjAsICAgLTgyOCwgICAtNDc1LAorICAgICAgIDc2OCwgICAgLTc5LCAgIC02NTUsICAgIDU1MCwgICAtMjAxLCAgICAgNzcsICAgIDg1OCwgICAgLTExLAorICAgICAgLTgwMywgICAxMTczLCAgIDEwMjcsICAgLTk3MSwgICAtNjU2LCAgIC02NDgsICAgIC00MCwgICAgIDE3LAorICAgICAgIDcyMCwgICAgMTc2LCAgLTEwNTUsICAgLTkzNiwgICAtMjU4LCAgICA1NTAsICAgMTA4NiwgICAxMDY1LAorICAgICAgICAgMCwgICAtNDczLCAgIC0zNjQsICAgICAzMCwgICAgIDUzLCAgICAgLTYsICAgIC01NCwgICAgLTI0LAorICAgICAgICAyMSwgICAgLTgxLCAgICAtODgsICAgIC00NSwgICAgLTE0LCAgICAgODEsICAgIDY3NCwgIC0xMTg5LAorICAgICAtMTA0OSwgICAtODQ2LCAgIC00ODksICAgIC0yNCwgICAgLTQ3LCAgICAxNjUsICAgIDY1OCwgICAxOTA5LAorICAgICAgLTI0MSwgICAtMzkwLCAgIC0zODcsICAgLTQ1NCwgICAtMzE5LCAgIC01NDksICAgLTMwNywgICAtMTEyLAorICAgICAgIDc3OCwgICAxNDg2LCAgIC0zMTQsICAgICAzNCwgICAgLTkzLCAgIC03OTksICAgLTUzOCwgICAyMjE5LAorICAgICAgLTQ0NSwgICAgIDM5LCAgICAtMzgsICAgLTI1OCwgICAtNDI3LCAgIC05NDMsICAgLTc2MCwgICAtNjAyLAorICAgICAgLTU3NSwgICAtNDUwLCAgICAzNzYsICAgIDY2OCwgICAgODc5LCAgIDEyMTUsICAtMTIxNiwgICAtNzg0LAorICAgICAgLTY0NiwgICAtMjkxLCAgICAyNzUsICAgMTAxOSwgICAgLTc3LCAgICAxMjQsICAgIDI1NiwgICAxMTY2LAorICAgICAgLTQxMCwgICAtOTkzLCAgLTExNDUsICAtMTExOCwgICAtOTQwLCAgIC04MjUsICAgLTU2MCwgICAtMTMxLAorICAgICAgMTAwNiwgICA0ODc4LCAgLTE0MDEsICAtMTI4NiwgIC0xMzE2LCAgLTEzOTQsICAgIDE3NywgICAtOTE5LAorICAgICAgIDE2MiwgICAyMjkyLCAgIDE3OTIsICAgMTI0MiwgICAtNzYyLCAgICA5MzcsICAgLTE2OCwgICAtOTAwLAorICAgICAgLTgyOSwgICAgMjAzLCAgIDEyMjUsICAgIDYyNiwgICAtMTIyLCAgIC01MTUsICAgIDk5MiwgICAtMTk4LAorICAgICAgLTc4MiwgICAgLTI1LCAgICAgNzQsICAgMTAxOSwgICAtNjA2LCAgIC0zNjQsICAgLTM1MCwgICAgIC01LAorICAgICAgIDQ1MSwgICAgMzI0LCAgICAyNjUsICAtMTE0MywgICAtODIwLCAgICAzODIsICAgLTM2MiwgICAgIDg1LAorICAgICAgLTc5NywgICAgNjkzLCAgIDE1OTQsICAgLTMzNSwgICAtMjI5LCAgIC0zOTYsICAgLTIxMSwgICAtMzU2LAorICAgICAgIC05NywgICAtMTE1LCAgICAgOTIsICAgICA0OSwgICAtNDc2LCAgLTExMjQsICAtMTA4NCwgICAtNTk0LAorICAgICAgLTIyOCwgICAgNzI4LCAgICAgMTYsICAgIDU4OSwgICAxMjEzLCAgICA4NDEsICAgLTgyOSwgICAxODc0LAorICAgICAgLTkwNywgIC0xMDAwLCAgIDE0MTEsICAgLTYyMSwgICAtNzA3LCAgICAzNTYsICAgIDQzNywgICAgIDM3LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMjJsW10gPSB7CisgICAgICAyNzM1LCAgLTEyMjQsICAtMTE5OCwgIC0xMDczLCAgLTExMTUsICAtMTA1NCwgICAtNzEzLCAgIDE2OTMsCisgICAgIC0xMTA2LCAgLTEyNTksICAgIDcyMiwgIC0xMjU2LCAgLTEyMjMsICAgMTY4NiwgICAxNTg5LCAgIDIwMDMsCisgICAgICAtOTA2LCAgIDI1MjksICAgMjE0MSwgICAtMzk2LCAgIC0zMzgsICAgIC0zNiwgICAgIDUyLCAgICA0NzYsCisgICAgICAgMzE5LCAgIC00MjAsICAgIDU2MSwgICAtNDkyLCAgIC01MjYsICAgLTM1OSwgICAtMjIxLCAgIC0yNTQsCisgICAgICAtNzUyLCAgLTExMzYsICAgLTY5MCwgICAtODk2LCAgIDQzMDcsICAgLTM2MywgICAgLTQyLCAgIDEzNjMsCisgICAgICAtNzE3LCAgLTEwMzYsICAgLTg3NCwgICAyMzE1LCAgIC05NTIsICAgLTg3MiwgICAgMjYyLCAgIDE0MTgsCisgICAgICAgNzM3LCAgIDEzNzQsICAgLTUwNiwgICAtNDcwLCAgIC0yNzUsICAgLTEyNiwgICAgMjQyLCAgICA0MjgsCisgICAgICAtNjc4LCAgIC02ODEsICAgLTU4MSwgICAxMDE2LCAgIC01NTMsICAgLTUwOSwgICAtNDg1LCAgIC00MDgsCisgICAgICA5NTk1LCAgLTEwMTUsICAtMTE2OCwgICAtOTMyLCAgIC04MTIsICAgLTY5MCwgICAtMTY3LCAgICA3NTMsCisgICAgICAtOTM1LCAgIC00MzksICAgMjEwNSwgICAtNTI2LCAgIC03MTAsICAgLTU3MCwgICAgICA5LCAgICA1NDgsCisgICAgICAgNTMwLCAgLTEzMDgsICAtMTA2MCwgICAtMzUxLCAgIC05NzQsICAtMTAzOCwgICAgIDkzLCAgIDU1NzksCisgICAgICAtNzM3LCAgLTEyODIsICAgMTM4NiwgIC0xMjg0LCAgLTEyNDMsICAtMTEwNSwgICAgNzkwLCAgIDIxNjksCisgICAgICAtNzAxLCAgIC02NjAsICAgLTU1NSwgICAxMzE3LCAgIDI4MDUsICAgIDc5MiwgICAyMjA5LCAgIC00OTAsCisgICAgICAtNzU4LCAgLTEyNjIsICAtMTA4MywgIC0xMDczLCAgICA5MzAsICAgLTgxMCwgICAtMTcwLCAgIDIzMjYsCisgICAgIC0xMjEzLCAgLTEyODYsICAgMzQzNSwgIC0xMTM1LCAgLTEwNTEsICAgIDIyMCwgICAzMDQwLCAgIDE5OTksCisgICAgICAtOTMzLCAgIC02NjMsICAgLTcxNCwgICAtODU1LCAgIC0zNzIsICAgLTU5OSwgICAtNDM3LCAgICAzNzMsCisgICAgICA1ODczLCAgIC05ODcsICAtMTA4MSwgIC0xMDAzLCAgIC03NDcsICAgLTI3MSwgICAgNTgyLCAgIDEwNjksCisgICAgICAtOTE3LCAgIC03NTQsICAgNTY3NiwgICAtNTY1LCAgIC02MTYsICAgLTM5NiwgICAgMTc3LCAgICA5MDgsCisgICAgICAzMTA2LCAgIDE0NTksICAgLTY3OCwgICAtNTQzLCAgIC0zNDAsICAgICA0NywgICAgMzM2LCAgICA0OTMsCisgICAgIC0xMDYwLCAgIDE0MjcsICAgLTU2MCwgICAtNzYzLCAgIC03MTAsICAgLTY2MSwgICAgMTkzLCAgICA1OTUsCisgICAgICAtOTk2LCAgIDI0ODgsICAgLTU4OCwgICAtNzUyLCAgIDEzMDYsICAgIDExNCwgICAgMjkyLCAgICA2ODksCisgICAgIC0xMjAyLCAgIDIzMzQsICAtMTE3MywgIC0xMTY3LCAgIC03NTUsICAgIDM1MywgICAxNzExLCAgIDE1NzIsCisgICAgICAtOTMyLCAgIC03NTEsICAgMjA5OSwgICAyMDI1LCAgIC00MTcsICAgICA2MiwgICAgNDU4LCAgICA2MTEsCisgICAgICAtOTgxLCAgIDQzODcsICAgLTYzOSwgICAtNTYwLCAgIC01MjAsICAgLTE1MiwgICAgMjYyLCAgICA3NDgsCisgICAgICAtODI4LCAgIC04MTgsICAgLTY4MiwgICA1MjUwLCAgIC02NDAsICAgLTI3MCwgICAgMzg1LCAgIDEwNDksCisgICAgIC0xMDcyLCAgIC03NzQsICAgMTg3MCwgICAtNjY4LCAgIDE1MTQsICAgLTE1OCwgICAgMjgzLCAgICA3OTMsCisgICAgIC0xMDg3LCAgLTExNTAsICAgLTg5OSwgICAtODc1LCAgIC0xODgsICAgLTE4NCwgICA2NjU2LCAgIDIzMTEsCisgICAgICAtOTA2LCAgIDE2NTQsICAgLTQ0NiwgICAxNjc3LCAgIC02NTQsICAgLTEwMSwgICAgMzY0LCAgICA3MjEsCisgICAgIC0xMjcyLCAgIDc5MjgsICAgLTgxMiwgICAtNTc2LCAgIC03MDgsICAgLTM0NywgICAgMzk3LCAgIDExMjgsCisgICAgICAzODMwLCAgLTEwMzQsICAtMTA1NSwgICAyMjQ0LCAgIC03NTksICAgLTcwNiwgICAgIDc5LCAgICA4OTMsCisgICAgICAtOTIyLCAgLTEwNjcsICAgMjc0MCwgICAtODY4LCAgIC04NTgsICAgMTEyOSwgICAgIDM0LCAgIDEwOTYsCisgICAgICAyNDU1LCAgIC02OTQsICAgMTk3MCwgICAtNjUwLCAgIC02NzQsICAgLTEzMSwgICAgMzcwLCAgICA2OTcsCisgICAgIC0xMDY5LCAgLTExMzcsICAgLTk0OCwgIC0xMDQ1LCAgLTEwODcsICAgLTk2NCwgICAgMzY3LCAgIDEwOTEsCisgICAgICA0MDk2LCAgIC05NjAsICAgLTkyMSwgICAtODcwLCAgIDEzOTcsICAgLTUxMSwgICAtMTkwLCAgICA1NDUsCisgICAgICAtNjU3LCAgLTExOTQsICAgLTUzNiwgICAtOTUxLCAgLTEwOTQsICAgIDExNywgICAtNzIwLCAgIDI1MzIsCisgICAgIC0xMDk4LCAgLTExNDcsICAtMTE3NywgICAxNzY0LCAgIC03NTcsICAgLTEyMSwgICAyMzcyLCAgIDIwMTAsCisgICAgICAzNjYyLCAgIC05NTIsICAgLTk5NSwgICAtODk0LCAgIC02MjUsICAgIDQ2NCwgICAgNzMxLCAgICA4NjMsCisgICAgICAtNjA3LCAgIC01MDUsICAgIDQwMSwgICAtNDIzLCAgIC01NDAsICAgMjE0NCwgICAgNzU1LCAgIC00MzAsCisgICAgIC0xNDk5LCAgLTEyNDIsICAtMTIwMiwgIC0xMTkwLCAgIC02MjYsICAgMTI0OSwgICAzMzg4LCAgIDIzNzksCisgICAgICAtOTgzLCAgLTEwOTAsICAgLTkwNywgIC0xMDIxLCAgLTEwMTIsICAgLTg3MCwgICAyNzIzLCAgIDE1ODksCisgICAgICAtOTEzLCAgICAzMzIsICAgLTEwMiwgICAgIDk5LCAgICAyMjYsICAgICAgNiwgICAgMTc2LCAgICAzNTQsCisgICAgICAgMTU2LCAgICAtMzYsICAgLTgyOSwgICAtNzc0LCAgIC02ODUsICAgIC0xNSwgICAgNDk4LCAgICA1MDMsCisgICAgICAyMDMwLCAgIC00MDksICAgLTU5OSwgICAtNTcyLCAgIC0zNDEsICAgICAtMiwgICAgMTExLCAgICAzMDIsCisgICAgICAgNzg4LCAgLTEwMDIsICAgLTk3OCwgICAtOTI5LCAgLTEwMDEsICAgLTg4NiwgICAgNTc4LCAgICA5OTUsCisgICAgICAxMjM3LCAgIC03NDcsICAgLTY5NiwgICAtNjUzLCAgIDExNDMsICAgICA2MiwgICAgNTA2LCAgICA1NzEsCisgICAgICAgOTk0LCAgIC05OTMsICAgLTkwMiwgICAtODcxLCAgIC02NjIsICAgMTUyNywgICAgMzcwLCAgICA5NzksCisgICAgICAgOTgwLCAgIC00NjYsICAgLTQ4NCwgICAgNzg3LCAgIC0yNjEsICAgICA2MSwgICAgMjUwLCAgICAzNzcsCisgICAgICAtMTEyLCAgIC02NzYsICAgLTUzNSwgICAtMzQ0LCAgICAyNzQsICAgIDM2MywgICAgMTg1LCAgICAzMzQsCisgICAgICAgLTQ4LCAgLTExNDQsICAtMTA5NSwgIC0xMDExLCAgIC01NTIsICAgIDQ0NSwgICAxMzU1LCAgIDEyMDcsCisgICAgIC0xMTA4LCAgLTExMjgsICAtMTA4NSwgICAtODI2LCAgICAtODMsICAgMjAwMSwgICAxMjY1LCAgIDE0MjksCisgICAgIC0xMDI0LCAgIDExOTksICAgLTY3MSwgICAtNzAxLCAgIC00NDQsICAgMTE5MiwgICAgMTg3LCAgICA2NzMsCisgICAgIC0xMDM5LCAgLTEwNTYsICAgLTk1MywgICAtNzMyLCAgICAzNTksICAgIDcxNCwgICAgNzg3LCAgICA5MzUsCisgICAgIC0xMTg3LCAgLTExMzMsICAtMTExMiwgICAtOTcxLCAgIDIxNTgsICAgMTcyMCwgICAgODAxLCAgIDIwMTYsCisgICAgIC0xMDU2LCAgLTEwNjgsICAgLTg4OSwgICAxODA4LCAgICA1MDMsICAgIDg5MiwgICAgMzU4LCAgIDEwNDEsCisgICAgIC0xMTgwLCAgLTExODQsICAtMTA2OCwgICAtNzg4LCAgIDE0MjMsICAgLTU3MywgICAyMTQxLCAgIDE5NDksCisgICAgIC0xMDQyLCAgIC05MjQsICAgLTg0OSwgICAgNTEyLCAgIC02MjksICAgLTI3MiwgICAgNzc5LCAgICA4MTUsCisgICAgICAxOTM5LCAgLTEwNjksICAtMTA5MiwgIC0xMDI3LCAgIC03NzAsICAgICA0OCwgICAxNTU0LCAgIDEyODUsCisgICAgIC0xMTA5LCAgLTExNDgsICAtMTE1NywgIC0xMDMzLCAgIC05MzQsICAgIDc3OSwgICAxMzU4LCAgIDE1NjAsCisgICAgIC0xMDUzLCAgICAyMjIsICAtMTA5NSwgIC0xMDAxLCAgIC02ODEsICAgIC0yNiwgICAxMTEyLCAgIDEwMzUsCisgICAgIC0xMTY4LCAgLTEyODUsICAtMTE2OSwgIC0xMTgwLCAgLTEwODUsICAtMTA5NywgICAxMzEzLCAgIDMxMTIsCisgICAgICAtOTI4LCAgIC02NTUsICAgLTgxMSwgICAtNjE4LCAgIDE1NTUsICAgLTQ4MCwgICAgIDcxLCAgICA0NjcsCisgICAgIC0xMjIwLCAgLTExMjMsICAtMTAwOCwgICAtNTc3LCAgIC04NDUsICAgMzg1NCwgICAgNDkxLCAgIDE4NzgsCisgICAgIC0xMDUxLCAgIC03NjEsICAgIDYxNywgICAtNjUwLCAgIC00NTMsICAgICA1MSwgICAgNzg0LCAgICA3NTcsCisgICAgICAtOTkzLCAgIC04ODMsICAgLTkwNSwgICAtNzA4LCAgIC04NjksICAgIDk2OSwgICAgLTY0LCAgICA2NTUsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBmY2IyMnNbXSA9IHsKKyAgICAgIDk4NTQsICAgLTQ3OSwgIC0xMTYzLCAgLTExNDcsICAtMTMxNiwgIC0xMTM3LCAgIC05OTEsICAgLTk0MiwKKyAgICAgICA1MjIsICAgIDczOSwgIC0xMDQyLCAgLTEzMDYsICAtMTA0MCwgICAtMTI2LCAgIDExNDcsICAgMzUyNiwKKyAgICAgIDE4ODAsICAgLTQ3NywgICAtNDgzLCAgIC0zMjgsICAgLTg5OSwgICAxMDYzLCAgIDEyNDMsICAgLTYxMCwKKyAgICAgIC03MjEsICAgLTUyNywgICAtMzcyLCAgICAxNzEsICAgICA5MCwgICAgMTk2LCAgIDY2MTUsICAtMTE2NywKKyAgICAgLTExODksICAtMTA3OSwgICAtOTU0LCAgIC04MTcsICAgLTgzMywgICAyMjQ2LCAgICA0MzksICAgMTAzOCwKKyAgICAgLTEwNTMsICAtMTEzNiwgICAtOTM4LCAgIC04MDUsICAtMTAyMiwgIC0xMDQxLCAgIC03MTcsICAgMjAyMSwKKyAgICAgICAzNDEsICAgIDkzNSwgIC0xMTY0LCAgLTEyMzAsICAgLTU3MywgICAxNzY4LCAgMTExMTEsICAtMTExMywKKyAgICAgIC04NzQsICAgLTYzMSwgICAtMzY3LCAgICAgIDcsICAtMTA3NywgICAtOTI1LCAgIDE1NTgsICAgLTg1MCwKKyAgICAgIC05MTgsICAgLTc1NSwgICAtNTEyLCAgICA0NTIsICAgIDI2MCwgICAgNDAwLCAgIC03ODcsICAgLTk2NiwKKyAgICAgIC02OTAsICAgLTU4NCwgICAtODQzLCAgIC04MDIsICAgMjA5MiwgICAgMTIwLCAgICAxMDMsICAgIDU4MCwKKyAgICAgIC03NDYsICAgLTUxMiwgICAtMjQxLCAgIC02MjEsICAgMjc3MSwgICAtNDg2LCAgIC0yNjgsICAgIDI1OCwKKyAgICAgICAxNzEsICAgIDIzMiwgIC0xMjY1LCAgLTEyNTMsICAxNTEyOCwgIC0xMTIzLCAgLTEwMzcsICAgLTg4NSwKKyAgICAgLTExMDksICAgLTY2NCwgICAtNjU5LCAgIC0yNDAsICAgMTU1OCwgICAtOTA5LCAgLTExNjAsICAtMTI0NywKKyAgICAgLTEyMjMsICAtMTAzMSwgICAtOTg5LCAgIC00MTUsICAgMzUwNCwgICAxNTY5LCAgIC02NTEsICAtMTI0MSwKKyAgICAgLTExNDUsICAtMTAxNCwgIC0xMzIyLCAgLTEwMDAsICAgLTM1NCwgICAgIDU5LCAgICA3MDksICAgNDIwNiwKKyAgICAgLTExMjQsICAgLTk4NiwgICAtNjMzLCAgIC05NzYsICAgLTkwNywgICAtNjM2LCAgIC0zNzEsICAgIDI1NSwKKyAgICAgIDExOTUsICAgIDg3NiwgICAtMTQ1LCAgLTExNDYsICAtMTAxOCwgICAtOTkyLCAgIC00ODAsICAgLTc2MiwKKyAgICAgIDY5MDQsICAgLTcwMywgICAtNDMxLCAgIDEwNDMsICAtMTA0OCwgICAtNjM4LCAgIC0xNDIsICAgIDM5NCwKKyAgICAgIC04NTIsICAgLTczMCwgICAtNTMzLCAgIC0zNjEsICAgIDIzNCwgICAgMjIxLCAgLTEwNzAsICAgLTkzMCwKKyAgICAgIC03NjQsICAgMzIxMCwgICAtNzgwLCAgIC0yNTYsICAgMTc3NywgICAgMjU4LCAgICAzMDcsICAgIDM4MiwKKyAgICAgLTEyMjQsICAgIDk4NywgICA0ODk0LCAgIDM1MjUsICAgLTQxMiwgICAtNTU4LCAgIC04MTksICAgLTg2MywKKyAgICAgIC01NzIsICAgLTQ5NywgIC0xMTc1LCAgLTExOTcsICAgNzYzNywgIC0xMTA5LCAgIC03NDgsICAgLTExNiwKKyAgICAgIC0zMDYsICAgICAyNywgICAgMzg2LCAgICA2MzAsICAtMTMzNCwgIC0xMzc4LCAgLTEzMDIsICAxMjU5MiwKKyAgICAgLTEzMjcsICAgLTk3MSwgICAgIDg5LCAgIC03MzEsICAgIDI1OSwgICAgMjAxLCAgLTExMzUsICAgLTk1MSwKKyAgICAgIC01ODUsICAgIC02NCwgICAzNDg5LCAgIDI3NjUsICAgICA0MywgICAgIDc1LCAgIC01MjcsICAgLTE2MiwKKyAgICAgIDI4NjUsICAtMTM0NCwgIC0xMzk0LCAgLTEzOTEsICAtMTIzMSwgICAtNzQ4LCAgIC05NjIsICAgNTQwMywKKyAgICAgICA3MTksICAgMTQxOCwgICAtNzI0LCAgLTExMDEsICAgLTk1NSwgICAtNzQzLCAgIC05MzcsICAtMTA2NCwKKyAgICAgLTEwOTUsICAgLTYwMSwgICAgLTYwLCAgICA0MTEsICAtMTExMywgICAtODczLCAgIC02MDMsICAgMjkxMywKKyAgICAgIDI1MTIsICAgLTMzOSwgICAgLTM2LCAgICAgMjYsICAgIC0zOSwgICAgIDc4LCAgIC03NTcsICAgLTk5OCwKKyAgICAgIC01MjIsICAgLTgzOCwgICA1NTA3LCAgIC05NzMsICAgIDc5NiwgICAgNTM2LCAgICAyNTAsICAgIDMxMiwKKyAgICAgLTEzNjMsICAgLTk0NCwgICA2MDIxLCAgICAtNTgsICAgNTMxMywgICAtNjkwLCAgIC01NDksICAgLTQ4NSwKKyAgICAgICAtNjYsICAgLTEzMywgIC0xMjU3LCAgIDYwMDQsICAgNjM3NCwgICAxNDg3LCAgIC05NzYsICAgLTk4NywKKyAgICAgIC05NjksICAgLTgwMywgIC0xMDI3LCAgIC02MjQsICAgLTk2NywgICAxNzQ0LCAgIDM1MDQsICAgICAgNiwKKyAgICAgIC02NTksICAgLTY5MSwgICAtMzI2LCAgIC0xMjksICAgIC00OSwgICAgMTQ4LCAgLTEwMzIsICAgLTY4MywKKyAgICAgIDE4MTksICAgMTgwNCwgICAtNDkxLCAgIC00NTIsICAgLTI5NSwgICAgIDMzLCAgICAtMjAsICAgICA0MiwKKyAgICAgLTEyMjYsICAtMTA4NiwgICAtNzkyLCAgIDY0MTIsICAgLTY1NywgICAtMjc4LCAgIC0xMDMsICAgIC0yNSwKKyAgICAgICAtODIsICAgIDIwNywgICAyNDUwLCAgICAgLTYsICAgMjQxNywgICAgMjUxLCAgIC02MjIsICAgLTU5MywKKyAgICAgIC00MDksICAgLTE5MywgICAtMzM5LCAgIC0zMDQsICAgLTg2MiwgICAtNjY3LCAgIDI0NTcsICAgLTUwMCwKKyAgICAgIC00MzgsICAgLTUwNCwgICAxNDA4LCAgICAxNDMsICAgIDIwMywgICAgMjY1LCAgLTExMjgsICAtMTE0OCwKKyAgICAgIDI3OTEsICAgLTM3MywgICAtOTUxLCAgIDIxMjksICAgLTg0MiwgICAtMjc4LCAgICAgODEsICAgIDMwNywKKyAgICAgIC03ODcsICAgLTgyMiwgICAyNjU1LCAgIC02MDQsICAgMjAyOCwgICAtNzg3LCAgICAgIDQsICAgIDMzNSwKKyAgICAgICAxNzAsICAgIDIxOSwgICAgNjQ5LCAgIC00NTcsICAgIDk3MiwgICAtNjA3LCAgIC0zNTksICAgLTQ3MCwKKyAgICAgIC0yMzgsICAgICA2OCwgICAgLTU3LCAgICAxMDcsICAgMjI4NSwgICAtNTI2LCAgIC00OTAsICAgLTYwNCwKKyAgICAgICAxNzksICAgIC00MSwgICAgMjMwLCAgICAgNjQsICAgICAyMCwgICAgIDUwLCAgIC04MDIsICAgMTE2OCwKKyAgICAgIC0yMzUsICAgLTI2NCwgICAtMzE2LCAgIDE0NjksICAgLTQ5OSwgICAgMTA4LCAgICAxODMsICAgIDE1MCwKKyAgICAgLTEwNjgsICAgLTgwNiwgICAtMzk5LCAgIDEyNDQsICAgLTM1NSwgICAgNDg3LCAgICAtNTcsICAgIDQ1MCwKKyAgICAgICAxOTUsICAgIDI0OCwgIC0xMTIyLCAgLTEwOTYsICAgMzMyNywgICAtOTU2LCAgIDEwODQsICAgMTMwNiwKKyAgICAgICAyNDcsICAgIDQ0MiwgICAgMTY5LCAgICAyODMsICAgMzQxNiwgICAtNjA5LCAgIC04OTEsICAgLTg3OSwKKyAgICAgIC04NTMsICAgLTU3MywgICAtMjg1LCAgIC0xNDcsICAgIDM4MCwgICAgNjA4LCAgIDEyNzEsICAgLTg3NCwKKyAgICAgIC05MzEsICAgICA0MCwgICAtOTg5LCAgIDE0MzIsICAgMTk4MSwgICAgLTM0LCAgICAyODUsICAgIDE5MCwKKyAgICAgIC05MDIsICAgLTk3NCwgICA0MTE3LCAgIC04NjgsICAgLTc4NCwgICAtNTg0LCAgIC0zNTgsICAgIDIwMCwKKyAgICAgICAyNjEsICAgIDUyMSwgICAtOTQ1LCAgIC05ODEsICAgLTc3MywgICAzNTE3LCAgIC05NjEsICAgMjQyMCwKKyAgICAgICAgIDksICAgIDMxOCwgICAgMTg3LCAgICAzMjIsICAtMTAwNiwgICAtNzc5LCAgIC01MjYsICAgMjk3MiwKKyAgICAgIC03MTIsICAgLTU3OCwgICAtNTc2LCAgICAxNjcsICAgIDE1NiwgICAgMjcwLCAgICA0NjAsICAgIC03NCwKKyAgICAgIC0yMzcsICAgIDkzOSwgICAtNDQwLCAgIC01MTUsICAgIDEyNiwgICAgIDYzLCAgICAgODIsICAgICA2NywKKyAgICAgLTEwNjksICAtMTEwNCwgICAtOTIzLCAgIC02MzQsICAgLTE5MCwgICAxMTUxLCAgICA1MjYsICAgMjkyMCwKKyAgICAgICAxMjUsICAgIDU2NiwgIC0xMTQ0LCAgIDQxOTksICAgMTMxNCwgICAtNDU4LCAgIC01NjgsICAgLTMzNiwKKyAgICAgIC01MTUsICAgLTMzMiwgICAtMzUyLCAgIC0xNDMsICAgLTc3MCwgICAgMjgzLCAgIC03NzAsICAgLTc4NSwKKyAgICAgIC04MDcsICAgLTM0OCwgICAgIDkzLCAgICA0MjcsICAgIDE4MSwgICAgMzM0LCAgIC03OTgsICAgLTgzMCwKKyAgICAgIC0zMDAsICAgLTUwOSwgICAxMjU3LCAgIC01NTQsICAgMTM0MSwgICAgICA2LCAgICAyNDIsICAgIDI3MiwKKyAgICAgLTEwMzAsICAgICA2MiwgICAxMjkzLCAgICAzNDAsICAgIDc1MiwgICAtNDkzLCAgICAgLTYsICAgIC0zNCwKKyAgICAgICAgMzMsICAgICA4NSwgICAtODkzLCAgLTEyMDIsICAgIDI0NCwgICAtMTMxLCAgIC0zMDYsICAgNzU5MCwKKyAgICAgIC04MzIsICAgIDQyMCwgICAgIDgwLCAgICA0MjMsICAgLTc5OSwgICAtODcwLCAgIC05MzAsICAgLTcyMCwKKyAgICAgIC02NDAsICAgMjM5MCwgICAtNDA5LCAgIC0xNzcsICAgICA5MSwgICAgMzcwLCAgIC04NjQsICAgLTk0OSwKKyAgICAgICA4MzgsICAgLTU3NCwgICAtMjM0LCAgICA1NTUsICAgICA0NiwgICAgIC05LCAgICAtODMsICAgIDE0NiwKKyAgICAgIC04MjUsICAgLTQ3OCwgICAtNjY0LCAgICAtNTcsICAgIDg2NywgICAtMjk2LCAgIC0zODAsICAgIC03MywKKyAgICAgICAgNzAsICAgIDE3MSwgIC0xMTI0LCAgMTA1MjIsICAgLTIyOCwgICAtNjA5LCAgIC05NTgsICAtMTAyNSwKKyAgICAgIC01NDgsICAgLTM4NCwgICAtMjU3LCAgICAgNTUsICAgNTQxNCwgICAgNDM2LCAgIC02NTEsICAgLTc0OCwKKyAgICAgIC02NzEsICAgLTUyNSwgICAgLTI1LCAgIC0yNzMsICAgLTI2NCwgICAgIDU3LCAgLTExMjksICAgMTk3NCwKKyAgICAgIC0xNDUsICAgMTY1MCwgICAtMzE3LCAgIC01MTQsICAgLTMwNSwgICAgLTc4LCAgIC0xNTQsICAgICA1OSwKKyAgICAgIDEyNjksICAgMTAwOCwgICAtNTEwLCAgIC03MTEsICAgLTUzNCwgICAtMzU4LCAgICAxOTQsICAgIDExNywKKyAgICAgICAxMDIsICAgICA1NywgICAtODM3LCAgIDEyNjAsICAgLTEyNiwgICAtNDk0LCAgICAgNDcsICAgLTE2MiwKKyAgICAgICA5MjQsICAgIC03MiwgICAgMTMwLCAgICAgOTcsICAgIDc0MiwgICAtODAzLCAgIC03MTEsICAgLTc1NSwKKyAgICAgIC00MDIsICAgLTE4OCwgICAgIDI0LCAgICAzMDksICAgIDE4NywgICAgMzc5LCAgLTEwOTIsICAgNTg2MiwKKyAgICAgIC02NDcsICAgLTgwNywgICAtNzE1LCAgIC02OTYsICAgLTQwOCwgICAgLTI5LCAgICAxMDQsICAgIDM1MywKKyAgICAgIDMyOTgsICAgMjE5MywgICAtMjYzLCAgIC03NzIsICAgLTkwOCwgICAtNzU0LCAgIC00NDksICAgLTE2NCwKKyAgICAgIC0xNTcsICAgIC00NCwgICAtOTg2LCAgIDIzMTMsICAgLTU5NiwgICAgIDU2LCAgIDIwNTcsICAgLTQ3OCwKKyAgICAgICAgNzQsICAgIC01MSwgICAgIDUxLCAgICAxMjEsICAgLTg5OSwgICAxNzkzLCAgIC01OTUsICAgLTY2OSwKKyAgICAgIC03NDMsICAgLTY4OSwgICAtNTQ2LCAgICAgNzEsICAgIDIwMSwgICAgMzgyLCAgLTEwNjEsICAgMzM3NSwKKyAgICAgIC03NzYsICAgLTg3NiwgICAtNjQ4LCAgIC00MDcsICAgIC00NCwgICAgMjYwLCAgICAyNTgsICAgIDM5MywKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGZjYjIybVtdID0geworICAgICAxMTUyMiwgICAgODY4LCAgLTE0NDQsICAtMTU3MiwgIC0xNjc0LCAgLTE3NDUsICAtMTg0NCwgIC0xNjE2LAorICAgICAtMTcyMywgIC0xNTA4LCAgICAgMjcsICAgLTMyMSwgICAtNjkzLCAgIC01OTcsICAgLTM3NCwgICAtMzgwLAorICAgICAgIDMyNywgICAgMjA5LCAgICA2MTEsICAgMTE4MiwgICAtNTQ4LCAgICAxNzYsICAgLTU0NCwgICAtNDg1LAorICAgICAgLTM0MSwgICAtMzc2LCAgIC0zODMsICAgMTAyNCwgICAxMzE2LCAgICAgLTQsICAgIDE5MiwgICAtNjQ5LAorICAgICAgLTk3OSwgICAtOTQ1LCAgIC04MDIsICAgLTE4MywgICAzNzQ5LCAgICA4MTIsICAgLTQxNiwgICAtNTI3LAorICAgICAgLTczNCwgICAxMDU5LCAgIC01MjEsICAgIDkyNCwgICAtNDYyLCAgIC02MzEsICAgIC03NiwgICAgMTgyLAorICAgICAgIDEyNiwgICAgMTAwLCAgIC02NTMsICAgLTY0MywgIC0xMTg5LCAgLTEyNjQsICAtMTMxMiwgIC0xMzExLAorICAgICAtMTIxMiwgIC0xMDE2LCAgIC0yMTgsICAgODQxNSwgIC0xMDA1LCAgICA3MzQsICAgMTMwMywgICAtMjcyLAorICAgICAgLTM5NywgICAtNTIxLCAgIC0yNDUsICAgIDM4OSwgICAgMjQyLCAgIC0yMzQsICAgIDQ1OCwgICAtOTEyLAorICAgICAtMTIxNSwgIC0xMjI4LCAgLTEyODgsICAtMTEzMSwgICAtODQ1LCAgIC00MDQsICAgIDkxMiwgICA1NDk3LAorICAgICAgIDQxMywgICAzMTYxLCAgIC00MzIsICAgLTE0OCwgICAxNzA0LCAgIC02NjMsICAgLTk5NiwgIC0xMDA5LAorICAgICAtMTQxOSwgICAtOTI5LCAgICAtMzYsICAgLTQ3MSwgICAtNjQwLCAgIC01NzEsICAgLTE5NywgICAtNTczLAorICAgICAgLTQ2MiwgICAyNTg2LCAgIC0xNzksICAgLTM4MiwgICAtNzU3LCAgIC04OTUsICAtMTA5NiwgIC0xMTQwLAorICAgICAtMTIxNiwgIC0xMDUxLCAgIC02ODgsICAgIC00NCwgICAzMzExLCAgIDM1MTgsICAgLTQ3NCwgICAyNTMwLAorICAgICAgMTQ3NSwgICAtNjc2LCAgIC03MDIsICAgLTc3NywgICAtMzgwLCAgIC0zMTYsICAgLTUzOCwgICAtNDY4LAorICAgICAgLTcwOCwgICAgNTQyLCAgIC0yMTMsICAgLTcxMywgICAtOTExLCAgIC00ODIsICAgLTY5NiwgICAtMTM1LAorICAgICAgMTI4MiwgICAyMDA2LCAgIDU3MDcsICAgIDQ3NiwgICAtNzA3LCAgIC03NzEsICAgLTY1MCwgICAtNzg4LAorICAgICAgLTc3OCwgICAtODUzLCAgIC05NjIsICAgLTkyNiwgICAgIDEwLCAgICAtMTEsICAgICAgMywgICAgICAxLAorICAgICAgIC0xMiwgICAgLTE0LCAgICAgMjEsICAgICAgNywgICAgLTEzLCAgICAtMTAsICAtMTQxMCwgIC0xNzEyLAorICAgICAgMTM3OSwgICA1NzU3LCAgICAyMTgsICAtMTIzMiwgICAtNTYzLCAgIC05MjksICAgLTY4NCwgICAtODI3LAorICAgICAgLTI2MSwgICAxMDQwLCAgIC0xNTQsICAgLTMwOSwgICAgLTk5LCAgICAgNjIsICAgIDg1NiwgICAgMTk5LAorICAgICAgLTYxNCwgICAtOTI2LCAgIC02MjYsICAgMTU2OCwgICAtMjU4LCAgICAzNzQsICAgMTA3MSwgICAtMTQwLAorICAgICAgLTI1MCwgICAtMzMyLCAgIC04MzIsICAgLTcwNiwgICAtODYzLCAgIC03MTQsICAgLTc0OSwgICAzMDgxLAorICAgICAgIDQ5OCwgICAtNjk1LCAgIC0zOTUsICAgLTYwMCwgICAtMjc5LCAgICA1ODgsICAgIDI0NSwgICAzMTIyLAorICAgICAgLTMyOSwgICAtNjc3LCAgIC0yNjIsICAgICA2NywgICAgIDE5LCAgIC01MzAsICAgLTg4MiwgICAtODYyLAorICAgICAtMTAzMywgICAtMTYwLCAgIDE1NDIsICAgMTkxNiwgICAtNDE2LCAgIC02MDAsICAgLTU1MywgICAtMjE5LAorICAgICAgLTEzMCwgICAtNDk3LCAgIC02OTksICAgMTcxOSwgICAgMTYwLCAgIDMyOTMsICAgLTIxMiwgICAtOTIzLAorICAgICAtMTA0NSwgICAtNzYxLCAgLTEyMzgsICAtMTAzOCwgICAxNTQzLCAgICA3MzgsICAgLTU0OCwgICAtNTQxLAorICAgICAgLTQwMywgICAtMjgxLCAgIC0xMTUsICAgIC05NSwgICAtMzEzLCAgICAtMTksICAgLTI5MiwgICAxMTM2LAorICAgICAgMzU5MiwgICAgNjk2LCAgIC02NTQsICAgLTg1NiwgICAtNzI2LCAgIC02OTMsICAtMTA1NywgIC0xMjY3LAorICAgICAgLTcyMiwgICAtMzgxLCAgIC02ODMsICAgMTM2NCwgICAgLTMwLCAgICA1ODksICAgIDQ1NCwgICAgMjYyLAorICAgICAgIC01NywgIC0xMDE4LCAgIC0zMTIsICAgIDg0NiwgICAtMTM5LCAgIC01ODcsICAgLTEyNywgICAyNDgyLAorICAgICAgLTE3OCwgICAtMjMzLCAgIC05NzcsICAgLTc5NiwgICAgIC02LCAgICAyNTAsICAgIDIyMCwgICAxNTc3LAorICAgICAgMTE0MSwgICAtMjUxLCAgIC02NDksICAgLTgwOSwgIC0xMDUxLCAgIC04NzMsICAgLTc2MiwgICAtOTkwLAorICAgICAtMTAxMCwgICAtODkwLCAgIC04OTcsICAgLTYzOSwgICAtNjcxLCAgIDE5NjQsICAgIDc4OCwgICAyMzEwLAorICAgICAgNjAwMSwgICAgIDIwLCAgLTEwMDgsICAtMTE1OSwgIC0xMjA4LCAgLTEyMDgsICAtMTMxOCwgIC0xMjI3LAorICAgICAgLTgyOSwgICAxNjgwLCAgLTEwMjMsICAgLTk5OCwgIC0xMjI0LCAgIC05NDUsICAgLTc2OSwgICAgLTQxLAorICAgICAgMjAzMywgICAgMTk2LCAgICA5MTcsICAgMTYxNSwgICAyMDI2LCAgIC02NTQsICAtMTAxNCwgICAtOTE4LAorICAgICAgLTc1MCwgICAtNjc1LCAgIC04MzksICAgMTU0MSwgICAgMjgyLCAgICA0MzAsICAtMTA1OSwgICAtNzA4LAorICAgICAgLTUwNywgICAtNTIyLCAgIC0xNjksICAgIDQzOCwgICAgMTk2LCAgICA4MzUsICAgIDc3OCwgICAgODk3LAorICAgICAgIDQyMCwgICAgNTI2LCAgIDEyMzksICAgIDE5OCwgICAtNzM2LCAgIC05NTMsICAgLTgzNSwgICAtMjI5LAorICAgICAgLTM0OCwgICAgNzI2LCAgIC03NjcsICAgMTMxMSwgICAgMjQ4LCAgIC0zNTMsICAgLTU1MCwgICAxMDE3LAorICAgICAgLTI1MCwgICAtNzMyLCAgICAyNTYsICAgLTE3NSwgICAtNjM4LCAgICA3NjMsICAgLTc2MSwgICAtOTU3LAorICAgICAgLTU1NCwgICAgNTM5LCAgICAyNTIsICAgIDI5OSwgICAgNDMxLCAgICA2MTMsICAgNDM5OCwgICAtMzc4LAorICAgICAtMTAyMiwgIC0xMDIwLCAgIC05OTAsICAgLTc1NywgICAtNjIxLCAgICAtODMsICAgIC0zNCwgICAgMTIyLAorICAgICAgLTQ3NiwgICAgIDc3LCAgIC03OTksICAgLTExNiwgICA0NTQ2LCAgIC03ODcsICAgLTczNSwgICAtNDYyLAorICAgICAgLTg3NSwgICAtOTA3LCAgLTEzNzMsICAtMTM1NCwgIC0xMzU1LCAgLTEyMjAsICAtMTAyNCwgICAgLTg4LAorICAgICAgMTI5OCwgICAyODQ0LCAgICA5NDAsICAgMTEzNSwgICAyMjYxLCAgIDIxNDIsICAgIDE4MSwgICAtNzM1LAorICAgICAgLTkyNCwgICAtOTQxLCAgIC03OTksICAgLTcxNSwgICAtNjYyLCAgICAgODYsICAgLTcxOSwgICAtNTIxLAorICAgICAgIDExNSwgICAtNTc2LCAgIC02OTksICAgMTA1MiwgICAxMjk1LCAgICAtNTcsICAgICA0MiwgICAgMjMwLAorICAgICAgMjg3NiwgICAgNTAxLCAgIC0yOTQsICAgLTE1OCwgICAgMTA0LCAgIC0xNTcsICAgLTUxNSwgICAtNjYyLAorICAgICAgLTk4NywgIC0xMDY5LCAgIC03MDMsICAgLTk4NSwgIC0xMDYxLCAgIC05NDYsICAgLTg3OCwgICAtMjY3LAorICAgICAgIDM5NywgICAgMTMyLCAgICA1MzQsICAgMzY0MiwgICAxMjk4LCAgIC01NjAsICAgLTcwMSwgICAtNTI2LAorICAgICAgLTI5NCwgICAgMTk3LCAgICAzMTAsICAgICA3NSwgICAgIC0zLCAgICAyNjcsICAgLTM0MiwgICAyMDU4LAorICAgICAgLTMyOCwgICAtNDI3LCAgIC03MDksICAgLTY4OCwgICAgIDE0LCAgICAtNDMsICAgIDIzNywgICAgNTA2LAorICAgICAgMjgyMiwgICAtMzM3LCAgIC05MDAsICAgLTgxOCwgICAtNjM4LCAgIC0xOTIsICAgIDg4MywgICAgLTE0LAorICAgICAgLTI3MSwgICAtNTU5LCAgIDI4MjIsICAgLTE2NSwgICAtOTg4LCAgIC05MzMsICAgLTkxNywgICAtNjAzLAorICAgICAgLTU4MywgICAtMzk3LCAgICA0NjcsICAgMTA5MiwgIC0xMDQ0LCAgIC00NzksICAgMjQ3OCwgICAtMzg2LAorICAgICAgLTUzNSwgICAtMjUzLCAgICAgNjMsICAgIC00OSwgICAgIDc5LCAgICAgMjcsICAgLTE4MiwgICAtMTAwLAorICAgICAgIDM2MiwgICAtNjI4LCAgIC02NjEsICAgLTcwNywgICAxNTU3LCAgICAxMzYsICAgIDMzNSwgICAgIDg5LAorICAgICAgLTE5NywgICA1Njk3LCAgICAyMjAsICAgLTQ3MywgICAtNDcyLCAgLTEwNTMsICAtMTAyMywgIC0xMDg3LAorICAgICAtMTIwMywgICAtNzU2LCAgIC0zNzcsICAgLTkxNywgICAtOTI1LCAgIC01NjgsICAgLTIzNywgICAxNDIyLAorICAgICAgIDE5NywgICAgLTk4LCAgICA2MTQsICAgIDg2NywgICAtODMxLCAgIC04MjksICAgLTk2OSwgICAtNzIwLAorICAgICAgIDQxNCwgICAxMDgwLCAgIDE3MDcsICAgIDgyOCwgICAtMTIxLCAgIC03NTcsICAtMTA0NCwgICAtMjg5LAorICAgICAgIDgxNiwgICAgMjg0LCAgICA4MDksICAgIC04NCwgICAgLTIyLCAgIC01NTIsICAgICAtOSwgICAgMTkzLAorICAgICAgLTM1OSwgICAgIDY2LCAgIC01ODIsICAgLTY3NCwgICAxOTkyLCAgICAtMzEsICAgICA1OCwgICAgNDI3LAorICAgICAgLTUxNSwgICAtMjk5LCAgICA5MzIsICAgLTYwOCwgIC0xMTAzLCAgLTEwNjgsICAtMTAxNiwgICAtNzcwLAorICAgICAgIDIwMCwgICAxMDMxLCAgIDExMTIsICAgMTAyNiwgICAtNTk4LCAgIC04MTgsICAgLTg5MSwgICAtNjM1LAorICAgICAgLTgyOCwgICAtODY2LCAgIC02NTAsICAgNDc5NSwgICAtNDA3LCAgICAyMTUsICAgLTg1MywgICAgMzczLAorICAgICAgLTY5NiwgICAgMTU5LCAgICA5OTUsICAgIDQ2NSwgICAtNTA5LCAgICAxMDksICAgICA2MCwgICAgIDEwLAorICAgICAgODQ1NSwgICAgMTk4LCAgIC05OTksICAtMTEzMSwgIC0xMTExLCAgLTExOTUsICAtMTI0NiwgIC0xMTkyLAorICAgICAtMTE4MSwgICAtOTM0LCAgIC0zNjUsICAgLTc2NCwgICAtNjg5LCAgIC01ODksICAgLTczNCwgICAyNDc5LAorICAgICAgLTk2MCwgICAxMjc5LCAgICAxMDQsICAgLTIwOSwgIC0xMDEyLCAgIC04MjQsICAtMTA1OSwgICAtOTIxLAorICAgICAgLTgxMiwgICAtMjA0LCAgICAxOTksICAgIDYwMSwgICAzMTM2LCAgICA2MzcsICAgMzAyMSwgICAzODUxLAorICAgICAgLTQ5MCwgICAgLTE4LCAgIC05MzAsICAtMTA4MSwgIC0xMTMzLCAgLTExODIsICAtMTI2OCwgICAtOTgwLAorICAgICAgLTg2NCwgICAtOTQ1LCAgIC0yNzgsICAgIDk2MSwgICAtNTE0LCAgIC0xMjMsICAgIDU2MiwgICAgODc0LAorICAgICAgLTEzMCwgICAgMzM2LCAgIDMzMTQsICAgLTMzMSwgIC0xMTEyLCAgLTExNjIsICAtMTIyNywgIC0xMjMwLAorICAgICAtMTE3MiwgICAtOTg4LCAgIC0zMTksICAgMzU4MiwgICAgODkwLCAgICAgNTAsICAgLTY4MSwgICAtNzg4LAorICAgICAgLTkwNiwgICAtODc2LCAgIC04MjksICAgLTgyNywgICAgLTQxLCAgIDM0MTYsICAgLTc0MCwgICAtOTEzLAorICAgICAgLTg5MywgICAgNDA0LCAgIDIwNTksICAgLTY1MSwgICAtNDc0LCAgICAzMDIsICAgIDUxNiwgICAgNTc4LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMjJzbFtdID0geworICAgICAgMTA5OCwgIC0xMTA3LCAgLTExMjUsICAgLTk4MywgICAtNzcwLCAgIC0yMzMsICAgIDIwMSwgICAgODIzLAorICAgICAtMTQzMywgIC0xMjk0LCAgICAtMTcsICAtMTE1NiwgICAtMzAxLCAgIDExODUsICAgMTMwNywgICAxMTA4LAorICAgICAtMTI0NywgICAxODI5LCAgIDEzNTMsICAgLTUzNywgICAtNDU3LCAgICAxMTYsICAgIDU3NCwgICAgNzEyLAorICAgICAgIDE1OSwgICAtNDg5LCAgICA1MTEsICAgLTM0MCwgICAgIDU0LCAgICAxMTksICAgIDIxMywgICAgMzUxLAorICAgICAtMTQ4OSwgIC0xMjU2LCAgLTEzMjQsICAtMTEzMiwgICAzNzEwLCAgICAyNjIsICAgMTA4NywgICAxNDY1LAorICAgICAtMTQzNCwgIC0xMDI3LCAgLTExMTYsICAgIDgyNSwgICAtNjYyLCAgIC00MjgsICAgLTEwOSwgICAxMDQ1LAorICAgICAgIDIyOSwgICAgNzUzLCAgIC02MDQsICAgLTQyMiwgICAgMTIyLCAgIC0yMjAsICAgIDI3OSwgICAgMzc1LAorICAgICAgLTM0OSwgICAtNjg0LCAgIC0xOTcsICAgIDQ5MCwgICAtMTYwLCAgIC0xMTYsICAgLTEyMCwgICAgMTQ2LAorICAgICAgNTE5NSwgICAtODk1LCAgIC05NzQsICAgLTc1OCwgICAtNTI0LCAgICAgMjEsICAgIDc2MSwgICAxMDE2LAorICAgICAtMTIxNiwgICAgMTUxLCAgICA4NjQsICAgLTYwMiwgICAtNzE1LCAgIC01OTEsICAgLTM0NywgICAgNTkyLAorICAgICAtMTI2NSwgIC0xMzI4LCAgLTEzNzUsICAgLTg3OCwgICAtNjYwLCAgIC01NDksICAgIDE0MywgICA0MzAyLAorICAgICAtMTQzMywgIC0xMjc3LCAgICAzNjAsICAtMTAzMiwgICAtODM1LCAgIC0zODUsICAgIDMzNywgICAxMTExLAorICAgICAtMTM0NSwgIC0xMjUwLCAgLTExNTYsICAgIDkxNCwgICAxNTk0LCAgICAgMjIsICAgIDkxMiwgICAxMDEyLAorICAgICAtMTU3NiwgIC0xNDExLCAgLTEzNjQsICAtMTE1MywgICAgODQyLCAgIC0xODQsICAgIDI0MCwgICAxMzAyLAorICAgICAtMTQ4NiwgIC0xMTYyLCAgIDEyNDYsICAgLTg4MCwgICAtODMwLCAgICAgMTQsICAgMjQ4NywgICAxNjA3LAorICAgICAtMTM4NCwgICAtMTU4LCAgIC01NzIsICAgLTk3NywgICAgIDQzLCAgICAtMzAsICAgLTE4NCwgICAgNTcyLAorICAgICAgMjc1OSwgICAtODkyLCAgIC03NjgsICAgLTUyMiwgICAtMjg5LCAgICAtNDQsICAgIDM1MSwgICAgNTc1LAorICAgICAtMTI5MiwgICAtNTQ2LCAgIDM3MzYsICAgLTYwOSwgICAtNTM4LCAgICAtMjUsICAgIDUxNCwgICAgOTI0LAorICAgICAgMTc3MiwgICAxNjM5LCAgIC05MDMsICAgLTU5NSwgICAtMjYzLCAgICAzNDAsICAgIDU3OSwgICAgNjcwLAorICAgICAtMTQyNSwgICAgNzcwLCAgLTExNzksICAgLTkyMCwgIC0xMTU4LCAgIC02NzUsICAgIDQ5NiwgICAxMjA4LAorICAgICAtMTMzNywgICAxMjQwLCAgLTEwMzAsICAtMTA0NCwgICAxODQwLCAgICAzMTIsICAgIDgwOSwgICAgOTA4LAorICAgICAtMTQ1NywgICAxNDEwLCAgLTEyNDAsICAtMTA4MywgICAtNTQxLCAgICA1NjgsICAgMjc2OCwgICAxNDMyLAorICAgICAtMTI0OSwgICAtODkwLCAgIDEwNzgsICAgMTI3OCwgICAtNTU4LCAgICAgNjMsICAgIDU3MywgICAgNzc4LAorICAgICAtMTI4NSwgICAxOTMyLCAgLTEwMDQsICAgLTkwMiwgICAtMzM5LCAgICAgNTksICAgICAxNywgICAgNjU5LAorICAgICAtMTM1MiwgICAtOTM1LCAgIC04NzcsICAgMzQyMSwgICAtNDU1LCAgICAxNjAsICAgIDgyMCwgICAxMjMwLAorICAgICAtMTMyNiwgICAtOTc4LCAgICA5ODYsICAgLTc5MCwgICAxNTQxLCAgICAgNDEsICAgIDU0MiwgICAgNzQzLAorICAgICAtMTQ5MSwgIC0xMTYyLCAgLTEzODksICAtMTI2NSwgICAtOTI4LCAgIC0xMzksICAgNTA0NSwgICAyMjU5LAorICAgICAtMTE4MiwgICAxMzU4LCAgIC05NTMsICAgMTMzOCwgICAtNTAyLCAgICAxMjIsICAgIDc0OSwgICAgODM5LAorICAgICAtMTI4NCwgICA0Mzg5LCAgLTEwMDEsICAgLTgxMywgICAtNDIxLCAgICAgNDQsICAgIDg1NSwgICAxMDcyLAorICAgICAgMTY1OCwgICAtODgxLCAgIC04MjEsICAgMTQwOSwgICAtMjk5LCAgICAgIDQsICAgIDQ1MywgICAgNzAwLAorICAgICAtMTE0NCwgIC0xMTEyLCAgIDEyMzAsICAgLTc5MCwgICAtNDIxLCAgIDEyNTAsICAgIC0xMiwgICAgNjU1LAorICAgICAgMTU0NSwgICAtODcyLCAgIDExOTksICAgLTYzMiwgICAtMzY1LCAgICAgNTYsICAgIDQxNSwgICAgNjYzLAorICAgICAtMTQwMSwgIC0xMTg5LCAgLTE0MDMsICAtMTE4OSwgIC0xMTQ1LCAgIC02ODcsICAgLTExNiwgICAxMTIwLAorICAgICAgMTc2OCwgIC0xMDY4LCAgLTEwMjQsICAgLTYyOSwgICAxNDQwLCAgICAgODgsICAgIDU3OCwgICAgNzExLAorICAgICAtMTY1MSwgIC0xNTYxLCAgLTE1NjQsICAtMTQzMCwgIC0xMDM3LCAgIDEyNjQsICAgIC0yMSwgICAxOTQ0LAorICAgICAtMTU1MiwgIC0xMzM2LCAgLTEyNzcsICAgIDkxNiwgICAtNDEyLCAgICAgMjcsICAgMjQ1NCwgICAxNjYxLAorICAgICAgMTk5NiwgIC0xMDg3LCAgLTEyMjMsICAgLTkyNCwgICAtMzkzLCAgIDE2NzMsICAgIDc5NCwgICAxMDE3LAorICAgICAtMTM2MiwgICAtMTMyLCAgICAxNTEsICAgIDUzNywgICAtOTkyLCAgIDE4MzAsICAgIDc3NywgICAgOTkxLAorICAgICAtMTU5MSwgIC0xMzU1LCAgLTE0OTQsICAtMTQyMCwgICAtNjY2LCAgIDI0MDcsICAgMzIxMCwgICAyMDkyLAorICAgICAtMTExNCwgICAtNjI0LCAgLTEwODcsICAgLTkwMywgICAtODA4LCAgIC00MzgsICAgMTg4MSwgICAgNjU0LAorICAgICAtMTE0MCwgICAgMjU0LCAgIC0xMDUsICAgIDIxMiwgICAgMzg2LCAgICAgNDksICAgIDI1NiwgICAgMzE0LAorICAgICAgICA4MywgICAgIDk4LCAgLTExMjgsICAgLTkwMSwgICAtNTc4LCAgICAzNjIsICAgIDcwMiwgICAgNjkxLAorICAgICAgMTE5MSwgICAtMjA0LCAgIC0zMzUsICAgLTIyNiwgICAtMTAyLCAgICAtNDQsICAgICAtNSwgICAgMTIwLAorICAgICAgICA1NywgIC0xMTEwLCAgIC00MDMsICAgLTY1MSwgICAtODA2LCAgIC0yMDIsICAgIDU2NywgICAgNjkwLAorICAgICAgIDM0OSwgICAtOTA4LCAgLTEwNzUsICAgLTk0MSwgICAxNDg3LCAgICA0NjQsICAgIDc2MywgICAgNzgyLAorICAgICAgIDM4NywgIC0xMDcwLCAgIC05OTAsICAgLTc2NSwgICAtMjk1LCAgIDE2NjksICAgIDM0MSwgICAgODgxLAorICAgICAgIDIzMiwgIC0xMDEzLCAgLTEwNDMsICAgIDcyMywgICAtMzExLCAgICAyOTQsICAgIDY0NiwgICAgNTc0LAorICAgICAgICA3MiwgIC0xMTkxLCAgIC01NDYsICAgLTE4MywgICAgNDkzLCAgICAxNjEsICAgIDIwMSwgICAgNDY1LAorICAgICAgLTE4NSwgIC0xNDM0LCAgLTEzNjgsICAtMTA1MSwgICAgIDY0LCAgICAzODUsICAgIDc0OCwgICAgOTg2LAorICAgICAgLTc0MCwgICAtNTMwLCAgLTExOTksICAgLTU2MiwgICAgMTQyLCAgIDEzODgsICAgMTQ4NywgICAgNzE1LAorICAgICAtMTM1OSwgICAgODczLCAgLTExODcsICAgLTkyMywgICAtNDU1LCAgIDE5MTQsICAgIDQwMywgICAxMDE2LAorICAgICAtMTI0NSwgIC0xMjIzLCAgIC02MjQsICAgLTQ5NSwgICAgNzI0LCAgICA2NTIsICAgIDQzMywgICAgNTg1LAorICAgICAtMTQ5OSwgIC0xMjc3LCAgLTEzODEsICAtMTE0OCwgICAxNjc5LCAgIDIxMzgsICAgIDk5NSwgICAxNDI0LAorICAgICAtMTM0NSwgIC0xMzE5LCAgLTEyOTYsICAgIDkwNiwgICAtMjI4LCAgIDE1MzQsICAgIDUwNiwgICAxMDI0LAorICAgICAtMTYyOCwgIC0xNDEwLCAgLTE0MjIsICAtMTE5NywgICAxMzkzLCAgICAtMjIsICAgMjcyOCwgICAxNzg0LAorICAgICAtMTI0NSwgIC0xMDU2LCAgIC05NDIsICAgICAgMiwgICAtMTY1LCAgIC0xMTUsICAgIDg0MCwgICAgNTY5LAorICAgICAgMTAxNiwgIC0xMTkxLCAgLTEwOTEsICAgLTg2MiwgICAtNDU3LCAgICAgOTUsICAgMjA4NywgICAxMDI5LAorICAgICAtMTQ2MCwgIC0xNDg2LCAgLTE0NTksICAtMTEwNCwgICAtNTcxLCAgICA5MjUsICAgMTIzNCwgICAgOTM1LAorICAgICAtMTU2OCwgICAgLTQ5LCAgLTEzMjUsICAtMTI1NSwgICAgLTY0LCAgICAzMTUsICAgIDgzOCwgICAgOTYyLAorICAgICAtMTY1MSwgIC0xNTYyLCAgLTE2MDYsICAtMTU3MSwgIC0xMzA4LCAgIC0zODAsICAgMTk4OCwgICAyMTE3LAorICAgICAgLTg0OCwgICAtNDEyLCAgIC05ODcsICAgLTM3MCwgICAxMjI0LCAgIC0zMDQsICAgICAxMCwgICAgNDk4LAorICAgICAtMTUyMywgIC0xMzQ4LCAgLTEzNzMsICAgLTk1OSwgICAtNzcyLCAgIDM3NjcsICAgIDYyMSwgICAxNzczLAorICAgICAgLTkzMSwgICAtNjI4LCAgICAxNjksICAgLTUxMywgICAgIDYxLCAgIC0zMDYsICAgIDk5NCwgICAgNDc2LAorICAgICAtMTExNiwgICAtODc5LCAgIC04NzUsICAgLTQ4NCwgICAtNzk1LCAgICA5NTgsICAgLTE2MiwgICAgNDQ0LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMjJzc1tdID0geworICAgICAgNjc2NSwgICAtNjM4LCAgLTExMDgsICAgLTk3NywgICAtNjc5LCAgIC00NDYsICAgLTMyNSwgICAtNDMyLAorICAgICAgLTEyNywgICAgIDk2LCAgIC01NjksICAgLTYyMSwgIC0xMDUwLCAgIC04NDEsICAgLTgwMCwgICAxNDc0LAorICAgICAgMTE3MCwgICAgIDYwLCAgICAzMzAsICAgIDIyMywgIC0xMzE3LCAgICA4NTUsICAgIDMwNywgICAtOTMxLAorICAgICAgLTY0OCwgICAtNTQ5LCAgIC0xNDgsICAgIDUzNSwgICAgNjQyLCAgICA0NDUsICAgMzY2NiwgIC0xMTQ2LAorICAgICAtMTE2NywgICAtOTQ0LCAgIC01ODQsICAgIDk0MiwgICAtMjg0LCAgICAgMjUsICAgIDU3MywgICAgNDcyLAorICAgICAtMTA0MSwgIC0xMDk2LCAgLTEyMDksICAtMTA4MiwgICAtNzcwLCAgIC03MzcsICAgLTEzOSwgICAyMDczLAorICAgICAgIDc1MywgICAgODMyLCAgICA1MDcsICAgLTgyOCwgIC0xMTEyLCAgLTExMzAsICAgNDI4NCwgICAtNzIyLAorICAgICAgLTI2MSwgICAgLTU3LCAgICA0OTksICAgIDMwMCwgIC0xMzgwLCAgLTExMzAsICAgIDEzNSwgICAtODk4LAorICAgICAgLTgxNiwgICAtMzk1LCAgICAxOTUsICAgIDQ1MywgICAgNjUwLCAgICA1MzcsICAgLTk1MywgIC0xMTA5LAorICAgICAtMTIyMSwgICAtOTgxLCAgIC03NDcsICAgLTY0NywgICAyMzYwLCAgICA0NjcsICAgIDg0NSwgICAgNjg0LAorICAgICAtMTE3NywgICAtNzkyLCAgLTEyNTQsICAtMTE0OCwgICAxMzQ0LCAgIC03NDUsICAgLTMyMywgICAgMTgwLAorICAgICAgIDcyOSwgICAgNzM5LCAgLTEwMjAsICAgIDE4MywgICA1MjI2LCAgIC02MzgsICAgLTM1OCwgICAgLTg2LAorICAgICAgLTI2OCwgICAtMTQzLCAgICAgODQsICAgLTExNSwgICAgNDgwLCAgIC01NDMsICAtMTIyOSwgIC0xMDk3LAorICAgICAgLTU5NCwgICAtOTgzLCAgIC03OTIsICAgLTM5MSwgICAyNjM3LCAgIDE0MDUsICAgLTc2MSwgICAtODY2LAorICAgICAtMTE4NiwgICAtOTczLCAgIC03OTIsICAgLTY0MCwgICAtMjIwLCAgIC0xMDIsICAgMTE2NSwgICAzMTU5LAorICAgICAtMTI0MSwgIC0xMDU3LCAgLTEzMjIsICAtMTAwNywgICAtNzMxLCAgICAgNDQsICAgIDI2NCwgICAgNjY4LAorICAgICAgMjY0NSwgICAxNTkyLCAgIDI4ODUsICAtMTE1NSwgIC0xMzQ3LCAgLTEyMDksICAgLTMwOSwgIC0xMTYxLAorICAgICAgNDIxNiwgICAgLTY0LCAgICA4MzAsICAgIDYxNiwgICAtNjg4LCAgIC02MzgsICAgLTU5NiwgICAgMjAyLAorICAgICAgLTY2NSwgICAtNjIzLCAgIC00OTksICAgLTI0OCwgICAgNTEyLCAgICA3NDksICAtMTM5NSwgICAtNzA4LAorICAgICAtMTA4NiwgICAxMjA5LCAgIC03NDUsICAgLTM2NywgICAxMzk3LCAgICAyNzksICAgIDM3NCwgICAgMjU5LAorICAgICAtMTM1NywgICAtMjU0LCAgIDIzMTAsICAgMTgzOSwgICAtMTQ3LCAgICAgMzYsICAgLTQwMiwgICAgMzAwLAorICAgICAgIC00OSwgICAgIDQ3LCAgLTEzMjgsICAgLTk5MiwgICAzNDUzLCAgIC04ODksICAgLTYyMSwgICAgMTM1LAorICAgICAgIDQzNywgICAgIDcwLCAgICA2NjMsICAgIDM0NiwgIC0xMzM5LCAgLTExMzYsICAtMTI3NSwgICA2Njc1LAorICAgICAtMTMwOSwgICAyMjg1LCAgIC04NjksICAgMTE1NCwgICAgNjQwLCAgICA2MTcsICAgLTUwNSwgIC0xMDQyLAorICAgICAgLTk4NCwgICAtNzAyLCAgIDEyODMsICAgMTU3MywgICAtMTY4LCAgICAxMzUsICAgIDI0OSwgICAgMjUzLAorICAgICAgLTc4MywgIC0xMTE5LCAgLTEzNDIsICAgLTk3NSwgIC0xMTI3LCAgIDEzOTEsICAgLTcwNSwgICA0NDM5LAorICAgICAgMTE2MCwgICAgODQ1LCAgLTEyODMsICAtMTIyNCwgIC0xMjg2LCAgLTExNDIsICAtMTAxOSwgICAtOTAxLAorICAgICAgLTY1OCwgICAtMTU3LCAgICAyMzEsICAgIDYxMSwgICAtOTk0LCAgIC00NjMsICAtMTAxNywgICAxMDgyLAorICAgICAgMTgzMSwgICAtNDU5LCAgIC0xNjQsICAgIDExNCwgICAgICAwLCAgICAxMDgsICAtMTM4NiwgIC0xMDc5LAorICAgICAtMTMxOCwgIC0xMDkxLCAgIDI1NDAsICAgLTcxNywgICAgNzYyLCAgIDE0MTQsICAgIDg0OSwgICAgNTc2LAorICAgICAtMTQwNSwgICAtNTY2LCAgIDI3MDQsICAgLTk5NiwgICAyMTMzLCAgIC02NzgsICAgIDQwNCwgICAgMjgxLAorICAgICAgICAgNCwgICAgLTMyLCAgLTE0NzQsICAgMzUzMCwgICAyMzAxLCAgIC03MTEsICAgLTkxOSwgICAtMzA1LAorICAgICAgLTEyNSwgICAgMTg0LCAgICA0NTAsICAgICA3MywgIC0xMTMyLCAgIDE1NjcsICAgMTYyMCwgICAtNTUxLAorICAgICAgLTE5OCwgICAtNjQ1LCAgICAgMTksICAgICAgOCwgICAgMTkwLCAgICAxOTEsICAgLTc0MSwgICAtNzI4LAorICAgICAgIDQxMCwgICAxMDY3LCAgIC0zMjIsICAgLTIzOSwgICAgIDg2LCAgICAgMTEsICAgLTEzNywgICAtMjIwLAorICAgICAgLTQ4OSwgICAtNjA3LCAgIC05NjMsICAgMzYzMCwgICAtNjI0LCAgIC00NzgsICAgIC0xMiwgICAgMTI0LAorICAgICAgIDIxOSwgICAgIDYzLCAgIDIwNDAsICAgICA3NSwgICAxMzM4LCAgIC0yOTMsICAgLTMzMywgICAtMzM2LAorICAgICAgLTMzMCwgICAtMjQ2LCAgIC0zNjAsICAgLTM0NCwgICAtOTUzLCAgIC0zOTMsICAgMTU1MCwgICAtNzAxLAorICAgICAgLTYxNiwgICAtMjU0LCAgIDE5MDgsICAgIDIxMSwgICAgMzI4LCAgICAtNDMsICAtMTA4OSwgICAtMjk5LAorICAgICAgMTA3MCwgICAtNzIzLCAgIC05MjMsICAgMjE3MCwgICAtNDAwLCAgICAtMTMsICAgIC0yOCwgICAgMTA4LAorICAgICAgLTgxMiwgICAtNDAwLCAgICA4NzYsICAgLTY1MCwgICAxMzA4LCAgIC03NzIsICAgLTI1NiwgICAtMjAwLAorICAgICAgIDExNywgICAgMzI5LCAgICA2NDksICAgLTYzOSwgICAgNDM3LCAgIC03MDQsICAgLTU2NywgICAgLTIwLAorICAgICAgLTIxMSwgICAgMTk3LCAgICAzMzAsICAgIDM0MiwgICAxNjcwLCAgIC00NjgsICAgLTkyMCwgICAtNTg4LAorICAgICAgIDk3MiwgICAtMzEwLCAgICAgIDksICAgIC00NiwgICAgIDcwLCAgICAtMjksICAtMTMxMywgICAxNjg0LAorICAgICAgLTc5NCwgICAtOTc5LCAgIC03NTIsICAgMTg2NCwgICAtMTczLCAgICAxMDgsICAgIDI0OCwgICAgMjkyLAorICAgICAtMTI0NywgIC0xMjI2LCAgLTEwNTksICAgIDI4OCwgICAtMTEyLCAgICAxODksICAgICAyMCwgICAgNTQwLAorICAgICAgIDQ1NCwgICAgMzgwLCAgLTEwMzUsICAgLTgwMywgICAxMjY3LCAgIC03NjcsICAgIDc0NiwgICAxMzMxLAorICAgICAgIDEwNywgICAgMzE3LCAgICAxNTgsICAgLTExNiwgICAyMDkzLCAgIC03MjMsICAtMTA2NCwgICAtOTA2LAorICAgICAgLTcxMywgICAtNzg5LCAgIC01MTgsICAgICA0OCwgICAgNDk0LCAgIDEwMTgsICAgMTgzNSwgIC0xMzUzLAorICAgICAtMTMwMywgIC0xMDk4LCAgIC01NTksICAgIDgwMCwgICAgNTIwLCAgICA2NjIsICAgIDYxNSwgICAgNTc0LAorICAgICAtMTI4MiwgICAtNTI2LCAgIDE4MjksICAtMTA4NiwgICAtODg1LCAgIC0zNTYsICAgLTUzOSwgICAgLTUwLAorICAgICAgIDQ5MywgICAgNDAyLCAgIC03NzcsICAgLTM3NCwgICAtNzU0LCAgIDE3MjEsICAgLTcwMSwgICAyMDg2LAorICAgICAgLTM0OCwgICAgMjE4LCAgICAxMzgsICAgIDEwOSwgIC0xMzY3LCAgLTEyMjYsICAtMTA0MSwgICAxOTQ5LAorICAgICAgLTQzMywgICAtMjkxLCAgIC0zNjMsICAgIDU2NywgICAgNjEzLCAgICA1NjAsICAgMTE2NiwgICAtNDgxLAorICAgICAgLTczNywgICAxMTkzLCAgIC00NzksICAgLTE2MywgICAgLTY5LCAgICAgIDIsICAgIDEzMywgICAgMjM5LAorICAgICAtMTQ0NCwgIC0xNDQ4LCAgLTEzNTAsICAgLTk4NywgICAtMjk2LCAgICA2MDYsICAgIDc1NSwgICAgNTQzLAorICAgICAgIDc0MSwgICAgODA2LCAgIC04NTEsICAgMjQzNywgICAgIDIzLCAgIC02ODEsICAgLTY3MCwgICAtMjcxLAorICAgICAgLTQzOSwgICAtMjI3LCAgIC0yNDMsICAgLTE5OCwgIC0xMzA3LCAgICA0MjQsICAtMTIxMiwgICAtOTg3LAorICAgICAgLTc0NSwgICAtMzY5LCAgICAxNjIsICAgIDY0MSwgICAgOTE1LCAgICA2MTEsICAgIC0yNCwgICAtNzI4LAorICAgICAtMTA2MSwgICAtNjU5LCAgICA4MDgsICAgLTUzMiwgICAxMjQxLCAgIC0yMzMsICAgIDI2NiwgICAgMzUzLAorICAgICAgIDE3NSwgICAgMjEwLCAgIC0yNjIsICAgLTMyOCwgICAgMTAxLCAgIC0yMzgsICAgICA2NiwgICAtMzM5LAorICAgICAgLTQ3MiwgICAtNDE1LCAgICA5NTIsICAtMTQ5MCwgIC0xMzAyLCAgIC05NTUsICAtMTI3MCwgICA1Nzc2LAorICAgICAgLTc5MiwgICAgNzc3LCAgIDEwOTcsICAgIDgwNywgIC0xMzM0LCAgLTExNzIsICAtMTIxMSwgICAtOTI0LAorICAgICAgLTg3NywgICAyNDU4LCAgIC0zNTUsICAgIDU5MywgICAgOTM2LCAgICA2OTksICAgLTMzNiwgICAtNzAwLAorICAgICAgLTc2MiwgICAtNTY5LCAgIC0zMzcsICAgIDY0MiwgICAgIDk3LCAgICA0NDEsICAgLTE4OCwgICAtNTMzLAorICAgICAtMTA2MiwgICAgMTg4LCAgIC04NzMsICAgLTgwMSwgICAgNDE4LCAgIC0xNjcsICAgIC01NywgICAgLTI5LAorICAgICAgICA3OSwgICAgMjQxLCAgLTExMTAsICAgNjQzMCwgICAtODE2LCAgIC04MDcsICAgLTQ2MiwgICAtNjAxLAorICAgICAgIC01NiwgICAgLTQ1LCAgICAxODgsICAgICA3NCwgICAyODY5LCAgICAgNDMsICAtMTEyMiwgICAtNzk5LAorICAgICAgLTc3MiwgICAtODQ3LCAgIDEzOTQsICAgIC0zNiwgICAgMjk0LCAgICAgMTMsICAtMTMwNCwgICAyMTU1LAorICAgICAgLTUzNCwgICAxNTQ1LCAgIC0zMTUsICAgLTMyNSwgICAgMTgzLCAgICAgMzEsICAgIDM3MiwgICAgMTg3LAorICAgICAgIDg3MywgICAxMzc2LCAgLTEwMzcsICAgLTgxMCwgICAtNTE2LCAgIC0yMzUsICAgIDQ4NSwgICAgIDk5LAorICAgICAgIDI4NywgICAgMzI3LCAgLTEwNzQsICAgMTIwMywgIC0xMDg5LCAgIC04ODIsICAgLTUxNSwgICAtNTQ0LAorICAgICAgMjA0MSwgICAgLTQwLCAgICAyMDgsICAgIDE5MSwgICAgNTk3LCAgLTExNDEsICAtMTI3NCwgICAtODg1LAorICAgICAgLTM4NiwgICAgMTA2LCAgICA1OTMsICAgIDM5NCwgICAgNjcxLCAgICA2NzgsICAtMTI5MiwgICAzODYxLAorICAgICAtMTA4NSwgIC0xMTUwLCAgIC03NDgsICAgLTIxOCwgICAgNTAwLCAgICAgNTUsICAgIDMzNSwgICAgNDY5LAorICAgICAgMzIxNywgICAyODg4LCAgIC04ODIsICAgLTY0MywgICAtNTkwLCAgIC01MDYsICAgICA0MywgICAtNDU5LAorICAgICAgLTIxMCwgICAtMjIyLCAgIC05NjUsICAgMjQ1MywgICAtODMwLCAgIC03NzksICAgMTgwOCwgICAtNTg4LAorICAgICAgIDEzMCwgICAgICA0LCAgICAxMzAsICAgIC0yMywgIC0xMjY5LCAgIDEzNzQsICAtMTIzOCwgIC0xMTQ4LAorICAgICAgLTUyMywgICAtNjU5LCAgIC0xNzAsICAgLTMwMiwgICAxMDU1LCAgIDEzODksICAtMTQ2NywgICAyNTA1LAorICAgICAgLTkzMCwgIC0xMTgxLCAgIC04NDIsICAgLTUxNiwgICAgMzk5LCAgICA4ODYsICAgIDg0OSwgICAgNzM4LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiMjJzbVtdID0geworICAgICAgNTc2MSwgICAtMzk4LCAgIC03NDMsICAgLTk0OCwgICAtOTQ0LCAgIC04NDUsICAgLTg4MywgICAtODk2LAorICAgICAgLTgxMSwgICAtNjA0LCAgLTExNDIsICAtMTM4OCwgIC0xMTkwLCAgIC02ODUsICAgLTExOCwgICAxNDk4LAorICAgICAgMTU5MCwgICAgMjkzLCAgICA1NjQsICAgIDM1MiwgICAgMTI0LCAgICA4NTEsICAgLTEzMSwgICAtNjUyLAorICAgICAgLTU3MywgICAtMjc5LCAgIC03NTYsICAgLTQ3OCwgICAgODMzLCAgICA2NzAsICAgMjYwOSwgIC0xMTM4LAorICAgICAtMTEwNywgIC0xMDI0LCAgIC03MzksICAgLTY0NiwgICAtMzg3LCAgICAgMzMsICAgIDYzNSwgICAxMDM3LAorICAgICAgLTcxNywgICAtOTkwLCAgLTExNjEsICAgLTk0OCwgICAtNjYwLCAgIC0yMzAsICAgICA2OSwgICAyNTEwLAorICAgICAgMTI3NCwgICAgODQxLCAgICAtNDksICAgLTg3MiwgICAtNzY0LCAgIC0yMTEsICAgMzA0NiwgICAgLTMwLAorICAgICAgLTE0MywgICAtMzExLCAgIC0zMjQsICAgLTQxMywgICAtNzYwLCAgICAgNjcsICAgIDYxOSwgICAtNjk5LAorICAgICAgLTcyNSwgICAgMzA1LCAgIC00ODQsICAgMTI5MiwgICAgNDcyLCAgIC0xNTYsICAgLTU2OCwgIC0xMjQzLAorICAgICAtMTI1NiwgICAtOTk0LCAgIC04MDMsICAgLTM4NiwgICAxNjkyLCAgICA1OTYsICAgMTMyNSwgICAxMjkwLAorICAgICAgLTQ5MiwgIC0xMDA3LCAgIC03MzIsICAgLTc4OCwgICAxMTM2LCAgIC02MTAsICAgICA0NSwgICAxMzA3LAorICAgICAgIDQyMCwgICAgNjQ5LCAgIC01MzQsICAtMTA3NSwgICAtOTQ5LCAgIC0zNjcsICAgIDIxOSwgICAgNDQ0LAorICAgICAgLTEyMCwgICAgMjUxLCAgICA0NzYsICAgMTgwNiwgICAgOTAyLCAgIC05MjcsICAtMTE1MSwgICAtODc5LAorICAgICAgLTY1OSwgICAtNzQxLCAgICAgLTUsICAgIDI5OCwgICAxODYxLCAgICA5OTUsICAgLTI0NCwgIC0xMDMxLAorICAgICAtMTE0MiwgIC0xMDg1LCAgIC05NTIsICAgLTc3MywgICAtNDY4LCAgICAgLTksICAgMTYzNywgICAzNTkyLAorICAgICAgLTk3MSwgIC0xMTUwLCAgLTExOTksICAgLTk4NSwgICAtNjg5LCAgIC0zMTcsICAgIDE1MCwgICAgNTQwLAorICAgICAgMjcyNywgICAxNjc4LCAgIC0yMjMsICAgLTQwMywgICAgMTAyLCAgIC05MDIsICAgLTc3MywgICAtMjIzLAorICAgICAgMzE4MiwgICAtNDU3LCAgICAgNzUsICAgLTE4OCwgICAtMjkxLCAgIC00MjgsICAgLTEwMSwgICAtMzY1LAorICAgICAgLTQ0MiwgICAtMzM2LCAgIC0xMjgsICAgIC0zMywgICAgNzgxLCAgIDEyNDIsICAgIDUwMSwgICAtNzUzLAorICAgICAgLTg0NiwgICAgNzU3LCAgIC00NDQsICAgLTMxMSwgICAxMTgyLCAgICAgIDQsICAgICAtOCwgICAtMTIyLAorICAgICAgMTg2NiwgICAtNTI4LCAgIC0xNDIsICAgMTU5OCwgICAgLTE1LCAgIC0yMTksICAgLTU1NywgICAtODA0LAorICAgICAgLTkxNiwgICAtOTY1LCAgICAxMTQsICAgIDEzMCwgICAzNjcyLCAgICAtMTksICAgLTg3MywgICAtMjgwLAorICAgICAgLTc3NywgICAtOTE5LCAgIC04MjQsICAgLTY1NCwgICAxMDc4LCAgICAgMzksICAgIC01MCwgICAgMTE5LAorICAgICAgLTQxMSwgICAtMzExLCAgIC0zNTksICAgIC01NywgICAtMTM3LCAgICAgIDcsICAgLTc4MCwgICAtODkyLAorICAgICAgLTc2NywgICAtMTY3LCAgIDEzMDIsICAgMTY5MywgICAtMjA1LCAgICAtNTEsICAgLTE3NCwgICAgLTcxLAorICAgICAgIDgzOCwgICAtMjIwLCAgLTExMzMsICAgLTk5MywgICAtNzEwLCAgIC0zNDAsICAgIDY1MCwgICAxMzQxLAorICAgICAgIDE5MSwgICAgIC01LCAgICA3NDMsICAgLTU0MywgICAtMTI1LCAgIC01NjcsICAgICA3MCwgICAgLTQyLAorICAgICAgLTUwMSwgICAtNDQ4LCAgICAgNDcsICAgMTE1MSwgICAgNDAwLCAgIC03NzQsICAgLTc4MSwgICAxMzI0LAorICAgICAgMTA4OSwgICAgIDMyLCAgIC0yNTYsICAgLTQxNSwgICAtMzUyLCAgIC0yMTQsICAgIDkxMiwgIC0xMTQxLAorICAgICAgLTk4OCwgICAtNjM4LCAgIDEzNDksICAgIDI1MSwgICAgMTI0LCAgICAgLTQsICAgICA4OSwgICAgLTE2LAorICAgICAgLTY3OCwgICAtNTY5LCAgIDE1MDIsICAgIDE0NiwgICAgMTE0LCAgICA4MTYsICAgIC05OCwgICAtMjY5LAorICAgICAgLTYyMiwgICAtODA4LCAgIC02MzQsICAgMzMxOSwgICAxMjE4LCAgIC0zMjMsICAgLTc1MCwgICAtNTQ4LAorICAgICAgLTUyNSwgICAtNTc1LCAgIC01OTEsICAgLTczMCwgICAgIDM1LCAgICA3NjQsICAgMTQyMywgICAgNTc0LAorICAgICAgLTM1MiwgICAtNjcyLCAgIC04MDIsICAgLTMxNCwgICAtMzA4LCAgICAtMjksICAtMTA0MCwgICAtNzE3LAorICAgICAgIDQ2OSwgICAgNDIxLCAgIC01MjcsICAgLTQyMCwgICAgNTg5LCAgICAxOTUsICAgIDU1NiwgICAgNDcyLAorICAgICAgLTYyNiwgICAtODY0LCAgIC0xMzMsICAgMzUzMSwgICAtNjY3LCAgIC00NjAsICAgLTUyMywgICAgMTAzLAorICAgICAgICAyMywgICAtMzA5LCAgIDIzODEsICAgIDEzNiwgICAxMTk3LCAgIC0zOTksICAgLTM5OSwgICAtNTAxLAorICAgICAgLTYzOCwgICAtODk5LCAgIC04MTMsICAgLTcwNywgICAtMjQ5LCAgICA3MTksICAgIDgyMSwgICAtOTg5LAorICAgICAgLTYyOSwgICAtNTY4LCAgICA2NDIsICAgICAtNCwgICAgMjk3LCAgICAgNzAsICAtMTEwNSwgICAgNDU0LAorICAgICAgIDQwMCwgICAtMjM1LCAgIC01NjIsICAgMTYwNywgICAtMTE2LCAgIC0yMDUsICAgICAgMSwgICAtNDkwLAorICAgICAgICAgNywgICAtNTIzLCAgICA3NjQsICAgIDMyOSwgICAgOTkyLCAgIC0yNDAsICAgLTI0OSwgICAtMjc1LAorICAgICAgLTM2NiwgICAtMjY1LCAgICA2NjIsICAgLTgwMywgICAgMzkzLCAgIC01NjcsICAgLTUwMSwgICAgLTMyLAorICAgICAgIDE3OCwgICAgMzcxLCAgICAxMjYsICAgLTE0NiwgICAxNzQ4LCAgIC01MTYsICAgLTYzNCwgICAtMzk1LAorICAgICAgIDI2OCwgICAgODkzLCAgICAxNTQsICAgIC0zNiwgICAtNjIwLCAgIC05OTksICAgIDMwNCwgICAxNDkwLAorICAgICAgLTUxMiwgICAtODIxLCAgIC00NzksICAgMTkyMiwgICAtNjEwLCAgIC00ODEsICAgLTQ4MiwgICAtODA1LAorICAgICAgLTk5NiwgICAgLTE2LCAgIC01NjcsICAgIDU0MiwgICAgLTIyLCAgICA1ODksICAgLTExNCwgICAgIDY5LAorICAgICAgIDMyMiwgICAgMzU4LCAgIC04NDgsICAgMTIwNSwgICAgNTA5LCAgIC01MjcsICAgICAyNSwgICAgMTExLAorICAgICAgLTI0MywgICAtMTk3LCAgICAtMjAsICAgICA2MiwgICAxNTAwLCAgIC05NzcsICAgLTk3NCwgICAtMzkxLAorICAgICAgLTU1NSwgICAgNDQ4LCAgIC0yNTYsICAgICA3OSwgICAgMzkyLCAgICA1NDcsICAgMTQ3MiwgIC0xMjc2LAorICAgICAtMTIwMywgICAtOTg3LCAgIC0zMTUsICAgIDUxNSwgICAgODU1LCAgICAxODMsICAgIDIzMSwgICAgIDYyLAorICAgICAtMTE3NiwgICAtMzk3LCAgIDI4MzEsICAgLTUyNywgICAtNTc1LCAgIC00MzUsICAgIDE3NCwgICAtMzM3LAorICAgICAgIDcyMywgICAgMTA3LCAgIC01MDIsICAgLTc2NSwgICAtNDU1LCAgIDExMjQsICAgLTIxOCwgICAxNDQ0LAorICAgICAgICA1MywgICAtMjAxLCAgIC0xMzUsICAgLTI2NywgICAtNTEwLCAgLTEwNTgsICAgLTg2OSwgICAxMTMwLAorICAgICAgLTEyOCwgICAtMzk0LCAgICAgMTYsICAgIDg3MywgICAgNTk3LCAgICA0NTUsICAgICAxNiwgICAgICAwLAorICAgICAgIC0xMSwgICAgIDE0LCAgICAtMTIsICAgICAgOSwgICAgICA2LCAgICAtMTQsICAgIC0xMSwgICAgLTIzLAorICAgICAgLTQ1MywgIC0xMDU2LCAgIC05ODgsICAgLTcxMywgICAtMjY3LCAgICA3OTQsICAgIDk1NCwgICAxMzYxLAorICAgICAgIDgyMiwgICAtNDQ4LCAgICAzNzksICAgMTE2MywgICAgMzM2LCAgIC03MjQsICAgICA1NSwgICAgMTA5LAorICAgICAgIDIzNywgICAgLTgwLCAgIC03MzIsICAtMTAxNywgICAtMjY0LCAgICA2NTQsICAtMTA0MywgIC0xMDE1LAorICAgICAgLTY1NCwgICAgIDkxLCAgICAgMTcsICAgIDU0OCwgICAgNTA0LCAgICA5MzIsICAtMTA1NywgIC0xMTUxLAorICAgICAgLTk2NCwgICAtMTMwLCAgIDExNzEsICAgLTE0NiwgICAgNzQwLCAgICAxMzQsICAgIDc5MCwgICAgNTM5LAorICAgICAgLTU5MSwgICAtNTc3LCAgIC0zODgsICAgIDE1NCwgICAgNjA5LCAgICAzNDEsICAgIDY1NywgICAgODM4LAorICAgICAgLTM3OSwgICAtODcyLCAgICA3MTEsICAgLTY2NSwgICAtODE4LCAgIC01NDksICAgLTE1MSwgICAyNTAxLAorICAgICAgIC0yOCwgICAtMTg5LCAgIC0yNTUsICAgLTM3OCwgICAtMzYzLCAgLTExNTcsICAgLTkyOSwgICAtODg3LAorICAgICAgLTMzOCwgICAxOTI2LCAgICAtMzMsICAgIC0yNiwgICAxMDA5LCAgICA3NjUsICAgIC03OSwgICAgLTk4LAorICAgICAgIC0zNywgICAtOTY3LCAgIC01NjYsICAgMTAxMiwgICAgOTA1LCAgIC0yNDUsICAgICA0MSwgICAgMzIyLAorICAgICAgIDE5NCwgICAtMTQ4LCAgIC0yMjAsICAgLTE3MSwgICAtMjM5LCAgIC0yNDIsICAgLTE0NywgICAgLTE0LAorICAgICAgIDIyMSwgICAgNTc1LCAgIDE3NTQsICAgMzA1OSwgICAtMjQ2LCAgIC03MTMsICAgLTY5NiwgICAtNjM2LAorICAgICAgLTY0MCwgICAtODQzLCAgIC04NDEsICAgLTc1NSwgICAyNTU0LCAgIC01MDQsICAgLTU2OCwgICAtMzE4LAorICAgICAgLTMyNCwgICAtMTcxLCAgIC0yOTQsICAgLTIzOCwgICAtMjg4LCAgIC0xNzQsICAgLTI4OSwgICAxMjczLAorICAgICAgLTIzMSwgICAxMDUzLCAgIC0yODQsICAgLTMzOCwgICAtMzk0LCAgIC0yMjcsICAgLTMwMywgICAtMjI2LAorICAgICAgIDk2NiwgICAgNzQyLCAgIC04NzMsICAgLTUwMywgICAtNTg2LCAgIC0yODYsICAgIDExOSwgICAgLTU5LAorICAgICAgIDMzOSwgICAgLTM4LCAgIC04NDMsICAgIDk3NywgICAtNDQ4LCAgIC0yMzgsICAgIDIyNywgICAgLTc3LAorICAgICAgIDcyOSwgICAgICA2LCAgICAgNDUsICAgLTQ5MywgICAgMjc3LCAgLTEzODUsICAtMTI4OSwgICAtODQ2LAorICAgICAgLTExNywgICAgMzc2LCAgICA3NjMsICAgIDU1MywgICAgNzY5LCAgICA2NzAsICAgLTY1MiwgICAzMjgwLAorICAgICAgLTc2MiwgICAtODgyLCAgIC0zOTYsICAgLTI5OSwgICAgMTI0LCAgIC0yNzAsICAgIC0zMSwgICAtMjEwLAorICAgICAgMjQxMywgICAgNjQ0LCAgIC03OTAsICAgLTkxMiwgICAtNTgxLCAgIC01MDcsICAgLTExMCwgICAtNDA4LAorICAgICAgIC01NCwgICAgLTMwLCAgICA2MzIsICAgIDk2OSwgICAtNjMyLCAgIC0yMDYsICAgIDk1NSwgICAgLTk1LAorICAgICAgLTU3OCwgICAtMzM3LCAgIC0zNzcsICAgLTQ2NywgICAxMjY0LCAgICAgNjcsICAgLTg1NCwgICAtODYzLAorICAgICAgLTkwOSwgICAtNzUxLCAgIC02MTYsICAgLTQ3OSwgICAgNTYzLCAgIDIwNzAsICAgLTk3MiwgICAxNDc4LAorICAgICAgLTQ1MCwgICAtNzE1LCAgIC04NTksICAgLTY4OSwgICAgMTkwLCAgICA3MzYsICAgIDYxNywgICAgNTMwLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiNDRzbFtdID0geworICAgICAgMjQzMywgICAtOTI1LCAgLTEwMTUsICAtMTAwOSwgICAtODc1LCAgIC0yNzYsICAgIDM3OCwgICAgNDY0LAorICAgICAgIDY5NCwgICAgNzk1LCAgLTEwNDQsICAgLTYwMSwgICAtNjU4LCAgICAyNTcsICAgLTg5OCwgICAtNTA5LAorICAgICAgLTM0NiwgICAyMTYwLCAgICA2OTQsICAgIDk1MiwgIC0xMzAyLCAgIC02MTksICAgIDUwMiwgICAtMzc4LAorICAgICAgLTYyNCwgICAtMTc4LCAgICAzNDksICAgLTEwMCwgICAgMjA0LCAgICA1NDYsICAtMTQ1MCwgIC0xMTI3LAorICAgICAtMTMwMiwgIC0xMjk3LCAgLTEwNTEsICAgLTg0MCwgICAzNDI2LCAgIDEzNDYsICAgMTU3NywgICAxNzIzLAorICAgICAtMTI2NywgICAtNzEwLCAgIC04NzIsICAgIDQ0OCwgIC0xMDIzLCAgIC03MjgsICAgLTUyMSwgICAtMTM0LAorICAgICAgIDg3NCwgICAgOTM2LCAgLTExMzQsICAgLTU0OSwgICAgMjAzLCAgIC05MzIsICAtMTA1MSwgICAgNzU1LAorICAgICAgLTYwOCwgICAtMTk5LCAgICA4NTgsICAgMTAwOCwgICAxODE5LCAgIC04NDIsICAgLTc3MywgICAtNzM5LAorICAgICAgIDgxOCwgICAtMzcxLCAgICAyODksICAgIDI5MywgICAgNjU2LCAgICA3MDQsICAgIDMwOCwgIC0xMDA5LAorICAgICAgLTk1OSwgIC0xMDg5LCAgICA0NjYsICAgLTQ2OCwgICAgMjc5LCAgICA4OTcsICAgIDc2NCwgICAgNzk3LAorICAgICAtMTQzMywgIC0xMjc2LCAgLTEyNTMsICAtMTMyNiwgIC0xMTgyLCAgIC05OTIsICAgIC04NSwgICA0MzM5LAorICAgICAgMjEzNSwgICAyMTM2LCAgIDExMzEsICAgLTkxNywgICAtOTY2LCAgIC04NTksICAgLTg4OSwgICAxMTc4LAorICAgICAgICA2MiwgICAgNjU5LCAgICA3NzEsICAgIDg4MiwgICAxODQ0LCAgIC02MDcsICAgMTE4NCwgICAtNzY2LAorICAgICAgLTgwNSwgICAtMzg1LCAgICAtNjEsICAgIDUwMiwgICAgNjQ4LCAgICA3MzIsICAtMTI0NSwgICAxMzE1LAorICAgICAgLTgxOCwgICAtODI3LCAgICA2MjEsICAgLTU4OCwgICAgMTkzLCAgICA0ODAsICAgIDY0OSwgICAgNzc2LAorICAgICAtMTE3OCwgIC0xMjAyLCAgLTExNTIsICAtMTA4OCwgICAtODU3LCAgIC0xOTEsICAgIC00OSwgICAgMTI5LAorICAgICAgMTk1MCwgICAxMjM3LCAgLTE0NjEsICAtMTI5MCwgIC0xMzQyLCAgLTE0MDEsICAtMTMzOCwgIC0xMjEzLAorICAgICAgLTYyMywgICAgMjI0LCAgIDQwODYsICAgMjUxNywgIC0xMTUwLCAgIC04MTQsICAgLTc0NywgICAgOTE2LAorICAgICAgIDgwNywgICAtMjg4LCAgICAzMTksICAgIDQzNiwgICAgNTYwLCAgICA3MTgsICAgIDM5MiwgICAtOTczLAorICAgICAgLTk4OCwgICAgNDExLCAgIC05NTQsICAgLTUwMiwgICAgMjE0LCAgICA2MjEsICAgIDg1NiwgICAgODMxLAorICAgICAtMTI2OCwgICA0MDEyLCAgIC04NTIsICAtMTAwMiwgIC0xMDE0LCAgIC01NzcsICAgICAzMiwgICAgNTUyLAorICAgICAgIDk4NywgICAxMTM4LCAgLTEyMDUsICAtMTMxOSwgIC0xMTQ1LCAgIC05MjgsICAgICA4MCwgICAgMzcxLAorICAgICAgIDI3NywgICAgNzc5LCAgICA4NTksICAgIDkwMiwgIC0xMTQxLCAgIC05OTEsICAgLTk1NywgICAgNzA3LAorICAgICAgLTg5MiwgICAxMDk4LCAgICAxMjYsICAgIDM4MSwgICAgNjY4LCAgICA4NzAsICAtMTI1NCwgICAtOTk1LAorICAgICAtMTE2MywgICAtOTI2LCAgLTExNDksICAgMjU3MiwgICAgLTE3LCAgICA3NDcsICAgMTQ1NiwgICAxNTA5LAorICAgICAtMTAwNCwgICAtODY3LCAgIDEyMDUsICAgLTc5NywgICAgOTM4LCAgIC02NTcsICAgIDM0NiwgICAgNTIwLAorICAgICAgIDc4MiwgICAgODcyLCAgLTEzMjgsICAtMTA4MCwgIC0xMTExLCAgLTEwNjcsICAgMjIyNywgICAtODkyLAorICAgICAgIDY2NSwgICAxNjA0LCAgIDE0MjUsICAgMTQ3NywgICAxODY5LCAgIC02NjgsICAgLTcxMiwgICAxMDQ0LAorICAgICAgLTgwMCwgICAtMTM5LCAgICAgIDAsICAgIDM1NSwgICAgNjA5LCAgICA3MTcsICAtMTE5MiwgICAtNjMyLAorICAgICAgMzU0NiwgICAtNzgwLCAgIC04NzAsICAgLTUwMSwgICAgMTQxLCAgICA1MDQsICAgIDkyMSwgICAxMDI3LAorICAgICAtMTEyNSwgIC0xMDg3LCAgIDExNTQsICAgLTY2MCwgICAtOTg3LCAgICA5MzcsICAgICA4MiwgICAxMzkwLAorICAgICAgMTM2MCwgICAxMjQzLCAgIDEyNTksICAgLTU1MCwgICAtNzY5LCAgIC03ODcsICAgLTc0MywgICAtMzYyLAorICAgICAgIC0xMiwgICAgMTc3LCAgICAzMjEsICAgIDUwNSwgIC0xMTQ3LCAgIC04OTksICAgLTk0NywgICAtODQ5LAorICAgICAgMTM3MSwgICAtNDYyLCAgIC0xMjcsICAgICAxNiwgICAgNzUyLCAgICA5NTQsICAtMTQwNSwgICAgNDQ4LAorICAgICAtMTE4MSwgIC0xMjU5LCAgLTEyMDQsICAgLTg2OCwgICAtNDY4LCAgICAxMTAsICAgMTI5MywgICAxMjYzLAorICAgICAtMTI2NywgIC0xMTgwLCAgLTEyMzgsICAgLTkzMCwgICAtOTQwLCAgICA5MTYsICAgMTc5MywgICAgNjUzLAorICAgICAgMTA3MCwgICAxMTM3LCAgIC0yMTYsICAgLTk5NywgICAtODQ1LCAgIC02NTksICAgLTY5OSwgICAtMTc0LAorICAgICAgIDc1OCwgICAgOTYxLCAgICA0MTcsICAgIDYzMCwgIC0xMTIzLCAgIDE2OTEsICAgMTIyOSwgICAtNzMyLAorICAgICAgLTkzNywgICAtNDkxLCAgICAtNzgsICAgIDI2NSwgICAgNzQ0LCAgICA4NjQsICAgNDc3MSwgICAtODU2LAorICAgICAtMTAwNSwgIC0xMDA3LCAgIC05MzQsICAgLTQ4NCwgICAgLTE3LCAgICA1NzksICAgIDg2MSwgICAgOTU5LAorICAgICAtMTI2NCwgICAgIDcwLCAgIC05NjEsICAgLTg2NCwgICAtODYwLCAgIC0zMDIsICAgIDMxNCwgICAgNzg4LAorICAgICAgIDQ4NywgICAgNjg2LCAgLTExMzMsICAgLTc5MCwgICAtNDY2LCAgICA1NjEsICAgLTgxMiwgICAtMjU2LAorICAgICAgMjA3OCwgICAgLTU4LCAgICA3NTcsICAgIDk1MywgIC0xMTMzLCAgIC0yODYsICAgLTY1NSwgICAtNDc2LAorICAgICAgIC0yMywgICAtNjI5LCAgICAgIDcsICAgIDE4MiwgICAgNDI2LCAgICA1MDQsICAtMTExMCwgICAgMzE0LAorICAgICAgIDQ5NywgICAtODIyLCAgIC02NjIsICAgLTc1NCwgICAxMTc5LCAgIDE3MjYsICAgIDY5NiwgICAgOTU1LAorICAgICAgMTc5MywgIC0xMTQzLCAgLTEyNjgsICAtMTI3OSwgIC0xMjA3LCAgIC04NzMsICAgLTE4MywgICAxNTQ2LAorICAgICAgMTQ0MCwgICAxMzA1LCAgLTEyNzgsICAgMTM5NiwgICAtNzc5LCAgICA1NTgsICAgLTg0MCwgICAgLTMyLAorICAgICAgIC0xOCwgICAgMjU3LCAgICA2MTYsICAgIDc1NywgICAgMjY1LCAgIC05MDYsICAgIDQ5OSwgICAtODk3LAorICAgICAgLTg0NiwgICAtNDM1LCAgICAzNjIsICAgIDQzNCwgICAgNzUyLCAgICA3MzIsICAgIDQ1MywgICAgMTUwLAorICAgICAtMTAyOSwgIC0xMTgyLCAgLTExOTUsICAgLTk0MCwgICAtMjk3LCAgICA4NzYsICAgMTA4NCwgICAxMDUxLAorICAgICAtMTM3NywgICAxMzU0LCAgLTExNDgsICAtMTMxMywgIC0xMjExLCAgIC05MzcsICAgLTM2NiwgICAxOTQyLAorICAgICAgMTMyMywgICAxNDEwLCAgICAzMTEsICAgLTI3MCwgICAgLTgxLCAgIC0xNTksICAgICA0MiwgICAgIDQyLAorICAgICAgICAgNywgICAgMzU3LCAgICAyNTUsICAgIDI4NSwgICAxOTczLCAgIDEzODYsICAgLTc1MiwgICAtODczLAorICAgICAgLTkxNiwgICAtNDY2LCAgICAtMzksICAgIDQ5MywgICAgNjM4LCAgICA3NTksICAtMTMzOCwgICAxMTA3LAorICAgICAtMTA4MSwgIC0xMTY1LCAgLTEwMzgsICAgLTQ4NCwgICAxNzIyLCAgICA1MzQsICAgMTAzOCwgICAxMTAyLAorICAgICAtMTQ0NiwgIC0xMjEyLCAgLTEzMzcsICAtMTQ1MiwgIC0xNDIyLCAgLTEyOTEsICAgLTY5MCwgICAxNjM0LAorICAgICAgMTM0OCwgICAxNjQwLCAgLTEwNDQsICAgLTE4NCwgICAtNzU3LCAgIC02ODMsICAgLTEwMCwgICAxMDQ0LAorICAgICAgIDM2OSwgICAgMzQ5LCAgICA0MzIsICAgIDU4NCwgIC0xMTM3LCAgIC01MjgsICAgMTQyNSwgICAxMjk0LAorICAgICAgLTg0MiwgICAtMjU3LCAgICAtMzIsICAgIDI4OSwgICAgNjM5LCAgICA3OTYsICAtMTQxOCwgIC0xMjI5LAorICAgICAtMTI4MiwgIC0xMzkxLCAgLTE0MjEsICAtMTIzNCwgICAtODUyLCAgIC03NjUsICAgIDczNywgICAyMDc2LAorICAgICAtMTEwNCwgICAtOTI4LCAgIC05MzYsICAtMTA4OCwgICAgMzc4LCAgIC03NjUsICAgMTYwMywgICAgNTgxLAorICAgICAgIDc1MywgICAgOTI1LCAgLTExOTEsICAgLTg0MSwgICAtOTE5LCAgIDI4ODYsICAgLTkwNywgICAtMjMyLAorICAgICAgIDE4MCwgICAgNTQzLCAgICA5NTYsICAgMTA3MCwgIC0xMzE0LCAgIC04NDMsICAgIDgwNCwgIC0xMDk0LAorICAgICAtMTIwOSwgIC0xMDMxLCAgIC02MjYsICAgIDY5OCwgICAxMDQ5LCAgIDExNTIsICAgIDI1NiwgICAgODMxLAorICAgICAgLTg0MSwgICAtODE0LCAgIC04NDEsICAgIC01NCwgICAgMTM0LCAgICAzNDcsICAgIDUzNSwgICAgNjU4LAorICAgICAgIDEwNCwgICAtODAxLCAgIC05NTksICAgLTUxOSwgICAtNDA2LCAgICAxNTYsICAgICAxMiwgICAgIDEzLAorICAgICAgIDM4MCwgICAgNDk0LCAgLTExNDQsICAtMTExMiwgICAtOTczLCAgIC05NjUsICAgLTkxNiwgICAtNDc0LAorICAgICAgLTIyNSwgICAgNDYwLCAgICA0MDIsICAgIDczNCwgIC0xNDQ4LCAgLTEzMTYsICAtMTI3OCwgICAgMjMxLAorICAgICAtMTA4NiwgICAtNTc4LCAgICA1ODQsICAgMTExNSwgICAxMjc1LCAgIDEyNjAsICAtMTMyMSwgICAtOTYzLAorICAgICAtMTEyNywgIC0xMjg4LCAgICAgNDEsICAtMTEwMiwgICAgLTMxLCAgIDEzMzEsICAgMTAwMywgICAxMTQ1LAorICAgICAgIDExMiwgIC0xMjcwLCAgLTEzNDMsICAtMTM3NiwgIC0xMTE0LCAgIC03NzgsICAgIDM5MiwgICAxOTE4LAorICAgICAgMTE2NSwgICAxMjQ2LCAgLTEyNDcsICAgLTg3MCwgIC0xMjMyLCAgLTExNDcsICAtMTA3NSwgICAgNTcwLAorICAgICAgIDE4MSwgICAxOTgzLCAgICA5NzEsICAgMTIxNiwgIC0xMzA5LCAgLTExOTksICAgIDI2MCwgIC0xMTM2LAorICAgICAgLTk1MCwgICAtNzQyLCAgIDEwNjcsICAgIDcwMywgICAxMTUwLCAgIDExNDQsICAtMTQwNSwgIC0xNTMzLAorICAgICAtMTU2NCwgIC0xNTQ5LCAgLTEyNjQsICAgLTczNywgICAxMDg1LCAgIDE3MDYsICAgMTgwNiwgICAxNzg1LAorICAgICAgIDI4MiwgIC0xMTczLCAgLTExMjgsICAtMTE4OCwgICAtOTcxLCAgIC04ODUsICAgLTI5MSwgICAgMjU0LAorICAgICAgIDg0MSwgICAgOTg3LCAgIC0xNDIsICAtMTA2OCwgIC0xMjY0LCAgLTEyMzIsICAtMTA1OCwgICAgMTM4LAorICAgICAgIDU0NiwgICAgNTIxLCAgIDEwOTYsICAgIDk4NywgICAgODkwLCAgIC05MzYsICAtMTAyMCwgIC0xMDUxLAorICAgICAgLTg3MSwgICAtNTIxLCAgIDE2ODYsICAgIDYyNSwgICAgOTMwLCAgICA5MzYsICAtMTM0MywgICAtOTI0LAorICAgICAtMTIzMSwgIC0xMjQ3LCAgLTEwNTIsICAgLTk1MSwgICAxMTEwLCAgICAxMjUsICAgIDgyNiwgICAxMTE2LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiNDRzc1tdID0geworICAgICAgNjU3NSwgICAtODgxLCAgLTEyOTEsICAtMTI1OCwgIC0xMDkwLCAgIC01MTcsICAgLTI2OCwgICAgLTU2LAorICAgICAgIDEwNiwgICAgMjk1LCAgIC0zMDMsICAtMTEzNCwgIC0xMTEzLCAgIC02NTAsICAgLTUwOCwgICAxODQzLAorICAgICAgLTIzNSwgICAtMTQxLCAgICA0NTQsICAgIDgzMiwgIC0xMjEyLCAgICA4NTYsICAgLTQwNCwgICAtNjIwLAorICAgICAgLTY4MiwgICAtNDg3LCAgICAtNjksICAgIDg2NSwgICAgMzQxLCAgICAgOTUsICAgMzYyNiwgIC0xMDM3LAorICAgICAtMTM2NiwgIC0xMzQ5LCAgLTExMjYsICAgLTU1OCwgICAgMTg3LCAgICAzNDMsICAgIDY1NywgICAgNzY1LAorICAgICAgLTQxMCwgICAtNzM1LCAgLTEwNDYsICAtMTAyMywgICAtODk3LCAgIC02NzMsICAgLTM2NiwgICAzMTc0LAorICAgICAgMTI2NCwgICAgNzIwLCAgIC03MzAsICAgLTkyMiwgICAtNTIzLCAgIC04MjEsICAgNDA0MiwgICAtNDYzLAorICAgICAgICA0NSwgICAgMzI5LCAgICAyMTMsICAgIC05MywgICAgMzAxLCAgLTEwMTEsICAgIDI3NywgICAtODQwLAorICAgICAgLTgyMCwgICAtNDUxLCAgICA0MTcsICAgIDQ3MCwgICAgNzM5LCAgICA5NTMsICAtMTIxOSwgIC0xMjg2LAorICAgICAtMTU0NSwgIC0xNDI2LCAgLTEyMDksICAgLTgwMywgICAxMTU2LCAgIDEzMTEsICAgMTMyOSwgICAxMzI5LAorICAgICAgLTY0MywgIC0xMTM2LCAgLTEyMDAsICAgLTkxMiwgICAxMjIxLCAgIC02OTUsICAgIDM0MiwgICAgOTEwLAorICAgICAgIDkwNSwgICAgODEyLCAgIC05OTYsICAgLTM2NSwgICA0ODY4LCAgIC03MzgsICAgLTU5MSwgICAtNjIxLAorICAgICAgICAxNywgICAgLTQyLCAgICAgIDAsICAgIDEwMCwgICAyMDg1LCAgLTEyMTQsICAtMTQzNCwgIC0xNDMyLAorICAgICAtMTI0MywgICAtNTc3LCAgIC02MjYsICAgIDE0MCwgICAxMzU3LCAgIDE4MjEsICAtMTA2NCwgIC0xMjYxLAorICAgICAtMTYyOSwgIC0xNTI1LCAgLTE0ODgsICAtMTEwMSwgICAtNjMxLCAgICA1NTEsICAgMzU1NiwgICAzOTc0LAorICAgICAgLTYzNSwgICAtODQ2LCAgLTEwMDUsICAgLTY0NiwgICAtODAzLCAgICAxMjMsICAgLTE1MSwgICAgMzU3LAorICAgICAgMjEzNywgICAgOTUzLCAgLTExNjgsICAtMTA1NSwgIC0xMTE1LCAgLTEwNjEsICAgLTgyMywgICAtNjUxLAorICAgICAgMzg0MiwgICAgNjA2LCAgICA0OTEsICAgIDQ5MSwgIC0xMjk3LCAgLTEwNjMsICAgLTk5MCwgIC0xMDUxLAorICAgICAtMTIwMiwgICAtOTgzLCAgIC00NjgsICAgIC00NywgICAgMTYzLCAgICAzMzYsICAtMTEzMSwgICAtNDQ2LAorICAgICAgLTY4MywgICAgNjQ0LCAgIC02NjAsICAgLTY3NSwgICAxMjUxLCAgICAzNzMsICAgIDE5NSwgICAtMTIzLAorICAgICAtMTEwOSwgICAtNDMwLCAgIDE4MjAsICAgMTg4MywgICAtODYyLCAgIC03NDMsICAgLTI2NSwgICAgMTE5LAorICAgICAgICA2NiwgICAgLTQxLCAgLTEyODEsICAgLTc2OCwgICAxOTQxLCAgIC05NTUsICAtMTA1NCwgICAtODU2LAorICAgICAgIDUyOCwgICAgMzYzLCAgICA0ODgsICAgIDU0NSwgICAtOTM2LCAgIC02ODIsICAgLTgxNCwgICA1NTM0LAorICAgICAgLTgyNiwgICAtMzQ3LCAgICAgNTgsICAgIC0zOCwgICAgMTY4LCAgICAgMTQsICAgMTIyNCwgICAtNzE5LAorICAgICAgLTMwMCwgICAtNzY2LCAgIC00MDcsICAgIDYzMCwgICAgMjY5LCAgICAgMzksICAgLTIzMCwgICAtNzAxLAorICAgICAgMTYwMSwgICAtOTU4LCAgIC05NDUsICAgLTk1NSwgICAtNzM0LCAgIC00ODcsICAgIC0yMCwgICAxMzkyLAorICAgICAgIDU0NCwgICAgMjgyLCAgIC0xMTgsICAtMTEzMywgIC0xMTYxLCAgLTEwNjUsICAgLTkzOSwgICAtMjEzLAorICAgICAgLTEyOSwgICAtMjcxLCAgICA0NTEsICAgMjU3MCwgICAtODk1LCAgIC04MDUsICAgLTUzNiwgICAxNDU1LAorICAgICAgMTQ5NiwgICAtNjQ3LCAgIC0xOTksICAgIDExNCwgICAgIDk1LCAgICAtNDIsICAgMjIzMCwgICAtODU1LAorICAgICAgLTcxNSwgICAtODE5LCAgIDE3NjIsICAgLTY5OSwgICAgLTUwLCAgIC0xMDksICAgIDE2MywgICAgMjA3LAorICAgICAgLTMzNCwgICAtNzU5LCAgIDMyOTcsICAgLTY0NSwgICAyNTYxLCAgICAgNzcsICAgLTIzOSwgICAtMjU5LAorICAgICAgLTI3NSwgICAtNDQ1LCAgLTEzMDQsICAgMzUzNiwgICAxNjEwLCAgIC01MjYsICAgLTkyNiwgICAtNTgyLAorICAgICAgIC0xMiwgICAgIDQ0LCAgIC0xODAsICAgIC02OSwgICAtODA0LCAgIDExMDcsICAgMTQ1MSwgICAtODY4LAorICAgICAgLTg1MSwgICAtNTg5LCAgIC0zNTQsICAgIC04NSwgICAgIDg4LCAgICAzMzYsICAgLTUzNywgICAtNDQ0LAorICAgICAgICA0MCwgICAgMjMxLCAgIC03MTUsICAgLTUyMywgICAtMzUxLCAgIC0zNzksICAgLTEyMywgICAgMTcxLAorICAgICAgMTIyMywgICAtMzI4LCAgIC01NjcsICAgMjE4MiwgICAtMjkxLCAgIC0zNTIsICAgICAyMCwgICAtMTU3LAorICAgICAgLTMzOCwgICAtNjM1LCAgIDIxOTQsICAgLTQ3NiwgICAxNjI0LCAgIC04MDIsICAgLTc2MiwgICAtNTg1LAorICAgICAgLTI0NSwgICAgIDQ4LCAgICAgNjMsICAgIC00NSwgICAgLTMyLCAgIC02NDYsICAgIDg0NywgICAtNTU2LAorICAgICAgLTcyNywgICAtMjU5LCAgIDEzMDksICAgIDIzOSwgICAtMTI4LCAgIC03NTUsICAtMTAxOCwgICAtNjQwLAorICAgICAgIDg3NiwgICAtNjQyLCAgIC05MDYsICAgMTM5NCwgICAgLTI2LCAgICAzMzgsICAgIDIwNCwgICAgMTQ4LAorICAgICAgLTk4OCwgICAtNTIxLCAgICAxMzUsICAgLTgwNywgICAxMDY1LCAgIC01MjUsICAgIC04MCwgICAtMjQ4LAorICAgICAgIDM4MywgICAgODM2LCAgICA1MjEsICAgICAxMywgICAtNTUzLCAgIC04NjUsICAgLTkyOCwgICAtNjMxLAorICAgICAgLTEzNywgICAgLTgzLCAgICA0NDYsICAgIDIyMSwgICAxOTI0LCAgICAgNDgsICAgLTYyMSwgICAtODQ1LAorICAgICAgLTc4MiwgICAtNTQ0LCAgIC01MzEsICAgLTQxOCwgICAgLTc5LCAgICA5MTUsICAgLTcxMSwgICAxMjQ3LAorICAgICAgLTkzOCwgICAtNzY2LCAgIC05OTUsICAgMTQ1OSwgICAgIDMxLCAgICAxOTksICAgIDI2MSwgICAgMTkwLAorICAgICAgLTY3MCwgIC0xMjA3LCAgLTEwMTMsICAgIDEwOCwgICAtNjcwLCAgICAyMDQsICAgIDQwNywgICAgMjY2LAorICAgICAgIDQ3MywgICAgOTk4LCAgIC02MDYsICAgLTkyMywgICAxODQ1LCAgLTEwNjEsICAgIDkxMCwgICAtNzc0LAorICAgICAgIDI2OCwgICAgNDkzLCAgICAxNzgsICAgICA2MSwgICAxOTM4LCAgLTEyMzcsICAtMTAxMCwgIC0xMDk3LAorICAgICAgLTc4MCwgICAtMzY4LCAgIDExMjUsICAgIDM1NCwgICAgMzk4LCAgICA1NTAsICAgMTAzMiwgIC0xMTI4LAorICAgICAtMTE5NiwgICAtOTA4LCAgIC03NjcsICAgIDUyOSwgICAyMzI2LCAgICA3MjgsICAgIDIyNywgICAgLTEzLAorICAgICAtMTExMywgICAtMzY3LCAgICAzODIsICAgLTkzOSwgIC0xMDk0LCAgIC04OTYsICAgLTQ2MywgICAgNDQ2LAorICAgICAgIDg5NiwgICAxMTI4LCAgIC01OTEsICAgLTgyMywgICAtODk0LCAgIDMwNTIsICAgLTk2OCwgICAyMTU3LAorICAgICAgLTE1MywgICAgLTcxLCAgICAxMTEsICAgIDExOCwgIC0xMTA2LCAgIC05MzAsICAgLTkxMSwgICAxNjYzLAorICAgICAgLTkwNSwgICAtNjkxLCAgIC0yMjYsICAgIDUwMywgICAgNjY1LCAgICA3MDIsICAgMjA2NywgIC0xMTQ5LAorICAgICAgLTgyOCwgICAgOTkwLCAgIC04NTAsICAgLTQyNiwgICAtMTU5LCAgICAxNDgsICAgIDM3OSwgICAgNTEyLAorICAgICAtMTI2OCwgIC0xMzkwLCAgLTE0OTIsICAtMTM0MywgIC0xNDE5LCAgIDIyNDYsICAgLTIyNCwgICAyMTI0LAorICAgICAgMTUyMywgICAxMzM4LCAgICA1MjIsICAgMTYxMywgICAtMzQ0LCAgIC02OTQsICAgLTQ4NywgICAtMzI1LAorICAgICAgIDI5MywgICAgIDk2LCAgIC0zNzQsICAgLTY3OSwgICAtMzY0LCAgICAxMjQsICAtMTIwMSwgIC0xMjc0LAorICAgICAtMTA3OCwgICAtNTEzLCAgICAgMTUsICAgMTA0NSwgICAgNTI5LCAgICA2ODAsICAgIDEzMSwgIC0xMDY3LAorICAgICAtMTAzMCwgICAtODg4LCAgIC04MDYsICAgLTEyMiwgICAxMDAyLCAgIDEzMDIsICAgIDc1NywgICAtNDczLAorICAgICAgLTUzMCwgICAtNTM4LCAgIC04MjEsICAgLTM3MywgICAgIDcyLCAgICA3OTcsICAgIDg2NCwgICAgMjY1LAorICAgICAgLTU0MiwgIC0xMDkwLCAgIC0yNDEsICAtMTA5NSwgIC0xMjA1LCAgIC05OTEsICAtMTE3MiwgICA1MDI1LAorICAgICAgLTQyMCwgICAgNzI4LCAgICA0NjEsICAgIDEwMywgICAyMzI1LCAgIC05MTUsICAtMTAxMiwgICAtODU0LAorICAgICAtMTExNywgICAyMDE4LCAgIC0zNzcsICAgIC0zNSwgICAgMjY2LCAgICA0NDMsICAgLTk0OSwgIC0xMTYzLAorICAgICAtMTA2NCwgIC0xMDU3LCAgIC04MDIsICAgIDcyMSwgICAxMjc4LCAgICA0NzAsICAgIDMwOCwgICAgMjYzLAorICAgICAgIDQ3NCwgICAtNzczLCAgLTEwMzMsICAgLTg5MiwgICAgMjI3LCAgICAtMzAsICAgICAzOSwgICAgMTAxLAorICAgICAgIDQ1NiwgICAgNDc2LCAgLTEyNjMsICAgNzI3NSwgICAtOTQ2LCAgLTExNTcsICAtMTMwNCwgICAtOTIyLAorICAgICAgIDI0OCwgICAgMTQzLCAgICAtOTgsICAgIDMxMiwgICAzNDE5LCAgIC00MDIsICAgLTY0OSwgICAtNjI5LAorICAgICAgLTU1NCwgICAgLTQ4LCAgICA0ODcsICAgICA3MiwgICAtMTcxLCAgIC02ODcsICAtMTE2NywgICAxODY5LAorICAgICAgLTUyNCwgICAxNDkwLCAgIC04NjksICAgLTIzNiwgICAgMTExLCAgICAgNjgsICAgICA3NywgICAgLTg1LAorICAgICAgMTQ4MSwgICAgOTA2LCAgLTExODksICAtMTMyMSwgIC0xMTI0LCAgIC01NTQsICAgIDQyOSwgICAgMzIxLAorICAgICAgIDgxNCwgICAgNjk5LCAgLTEwNDgsICAgIDQ4NiwgICAtODU4LCAgLTEwOTYsICAtMTA3MiwgICAtNzQ0LAorICAgICAgMTY3NiwgICAgLTczLCAgICA1OTMsICAgIDYzMiwgICAgNzc5LCAgLTEyNjUsICAtMTQ3MCwgIC0xMzc5LAorICAgICAtMTA1MCwgICAtNTQ4LCAgICA3ODEsICAgIDUyNCwgICAxMDIyLCAgIDEwNzksICAtMTE0OSwgICAzNzE5LAorICAgICAtMTA2NCwgIC0xMTgwLCAgLTExNTksICAgLTc3NSwgICAtMjExLCAgICAyNDEsICAgIDQ5MiwgICAgNTU1LAorICAgICAgMzAyNSwgICAyODI4LCAgIC04NDksICAtMTEzMywgIC0xMDYzLCAgIC01NjcsICAgIC03MCwgICAtMTQyLAorICAgICAgLTE3NiwgICAgLTYyLCAgIC02MTQsICAgMTc0NSwgICAtNjg0LCAgIC02MTAsICAgMTQ3OCwgICAtNjE5LAorICAgICAgLTIzNSwgICAtMzYxLCAgICAtODQsICAgIC00NCwgIC0xMTU1LCAgIDE0OTQsICAtMTE4MywgIC0xMjEwLAorICAgICAtMTI5NCwgIC0xMDE3LCAgIC0zMzAsICAgIDIxMCwgICAgOTMxLCAgIDEzNjgsICAtMTMwNiwgICAyNzE0LAorICAgICAtMTA1MiwgIC0xMTI4LCAgLTEyMjAsICAgLTkwOCwgICAyNDA5LCAgICA0NDEsICAgIDMxMCwgICAgMzE4LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmNiNDRzbVtdID0geworICAgICAgNTYxOSwgICAtMTYzLCAgLTEwMDUsICAgLTg1NiwgICAtODMxLCAgIC02NDQsICAgLTYxMiwgICAtNzU5LAorICAgICAgLTc3MCwgICAtNDU2LCAgICAxOTksICAgLTU1MSwgIC0xMzQ4LCAgICAtODAsICAgIDEzMSwgICAtNDgxLAorICAgICAgIDMzNCwgICAgMjAyLCAgICAzNjYsICAgMTI0NiwgIC0xMjQ1LCAgICA0OTksICAtMTQ1NCwgICAtMzk2LAorICAgICAgLTY3NSwgICAtMjU3LCAgICA1MjUsICAgMTAwMSwgICAgODc4LCAgIDEwNzUsICAtMTAwNCwgIC0xMDEwLAorICAgICAtMTEyNywgICAtOTQ3LCAgIC05NzYsICAgIDMzMiwgICAzNTMzLCAgIDEzMTUsICAgIDI2NSwgICAtNjgzLAorICAgICAtMTExNCwgICAxMDU2LCAgLTEwMDksICAgMTE1NCwgICAtNzI4LCAgIC0yMTIsICAgIDYyMCwgICAgMTY5LAorICAgICAgIDEwMiwgICAtMTEwLCAgIC02NTgsICAgLTkwMiwgIC0xMjM4LCAgLTEyMTMsICAtMTIzOCwgICAtOTI2LAorICAgICAgLTczNSwgICAtNDU1LCAgIDExMzAsICAgNTEzOSwgIC0xMTg0LCAgICAxOTAsICAgMTU5MCwgICAtNjA0LAorICAgICAgLTgwMCwgICAtMzczLCAgIC0zNjYsICAgIDI1MSwgICAgNzIwLCAgICA1NzEsICAgICAtNiwgICAgMzA0LAorICAgICAtMTIyOCwgICAtMzY5LCAgIC02NTksICAgLTUwNiwgICAgLTI1LCAgIC0yMzQsICAgIDMxMywgICAyMzY2LAorICAgICAgIDYyMywgICAxNDczLCAgIC0zMTUsICAgIDc4MCwgICAxMDQ4LCAgIC00MTYsICAgLTU4NiwgICAtNzM3LAorICAgICAtMTAyOSwgIC0xMDk0LCAgICA0ODMsICAgLTcyNSwgICAtNzcxLCAgIC0zNzksICAgLTI2OCwgICAgLTE1LAorICAgICAgIDY5NywgICAxNzc0LCAgICAgLTEsICAgLTk5OSwgICAtOTg3LCAgIC04NjcsICAtMTMzOSwgIC0xMjU1LAorICAgICAtMTAxOCwgICAtNjUyLCAgIC0xMjUsICAgIDY0MywgICAzMDA2LCAgIDI0MTcsICAgLTU0MywgICAxNjI5LAorICAgICAgMTU1NywgICAtNjg0LCAgIC01NjgsICAgLTQ3NCwgICAtMTMyLCAgIC0yOTEsICAgLTMzOCwgICAtMzIxLAorICAgICAtMTI1MCwgICAgNjQxLCAgIC0xNTgsICAgLTkzNSwgICAtNTc1LCAgIC01NzUsICAgIDE1NCwgICAgNDE1LAorICAgICAgIDc5OCwgICAxNDIxLCAgIDMxNDcsICAgMTkwMywgICAtMzM1LCAgIC03NjcsICAgLTcyOSwgICAtNjI3LAorICAgICAgLTYxMSwgICAtNzUyLCAgIC04MzYsICAgLTczNSwgICAgNjc4LCAgICA1MDIsICAgLTk0NiwgICAgNTU2LAorICAgICAgLTgyMSwgICAgLTUxLCAgIC0yNTYsICAgICA5NCwgICAgMTUxLCAgICAgNzAsICAgLTgwOCwgICAtMzI0LAorICAgICAgLTM1OSwgICAzNjM3LCAgICAyODYsICAgIC05MCwgICAtMzY1LCAgIC02MTMsICAgLTc4MiwgICAtODcxLAorICAgICAgICA3NSwgICAxMDUxLCAgIC03ODAsICAgLTQ4NywgICAgIDQ3LCAgICAyNzMsICAgMTc2OCwgICAtMTAyLAorICAgICAgLTgyOCwgIC0xMjY3LCAgLTEwOTMsICAgMTQyMCwgICAtNjI0LCAgICAyMjUsICAgMTMwNywgICAgIDg1LAorICAgICAgIDIzOSwgICAtMTUyLCAgIC02NDksICAgLTg1MywgIC0xMDcyLCAgIC03OTYsICAgLTY0NCwgICAxMzgzLAorICAgICAgMTE0MywgICAtMTk5LCAgICAgOTQsICAgIC0yNSwgICAgIDcwLCAgICAgNTIsICAtMTA2NCwgICAyNDg3LAorICAgICAgLTg0NCwgICAtNjA3LCAgIC01ODcsICAgIDE0OCwgICAgNzI2LCAgICAyMjQsICAgLTIzOCwgICAtNDg0LAorICAgICAgLTk1NywgICAtNzI5LCAgIDE1MTcsICAgMTMzNCwgICAtNDc1LCAgIC0zMTcsICAgLTI1MywgICAtMTg2LAorICAgICAgICAgMSwgICAgIDE3LCAgIC04MzIsICAgMTQ1MCwgICAgNDIzLCAgIDE0MDgsICAgLTU3NiwgICAtODI1LAorICAgICAgLTYzMCwgICAtNTc5LCAgIC0zMTIsICAgIDMxNCwgICAgNzg4LCAgICAzODIsICAtMTAwMCwgIC0xMDYwLAorICAgICAgLTc2MywgICAgOTY4LCAgIC0xMzUsICAgICA1NiwgICAgMTQzLCAgICA0NzcsICAgLTczNiwgICAgIDMwLAorICAgICAgNDAyMywgICAgIDY4LCAgIC0yNjYsICAgLTQyMCwgICAtNTM4LCAgIC03NTEsICAgLTg5MywgICAtODc5LAorICAgICAgLTkzNSwgICAgIDU5LCAgICA0NjUsICAgIDg4NywgICAtMzUxLCAgIDEzOTYsICAgIDE3NiwgICAtMjUwLAorICAgICAgLTY4NCwgIC0xMDE5LCAgIC01MTUsICAgLTgxNSwgICAtOTU3LCAgIC00MzksICAgIDE4OCwgICAzNzk0LAorICAgICAgICA4NiwgICAgLTk4LCAgIC0yNDUsICAgLTgyOSwgICAxODk0LCAgIC0zODYsICAgLTg2NSwgICAxNTEzLAorICAgICAgICAyNCwgICAtNTA2LCAgIC0yODEsICAgLTYxNSwgICAtNDc2LCAgIC0zNjQsICAtMTI4MywgICAtOTYzLAorICAgICAgLTMzOSwgICAtMTMzLCAgIC0xNjEsICAgLTQ4MCwgICAgIDI1LCAgICAyMzAsICAgMTM2NCwgICAxODE1LAorICAgICAgMTc2NiwgICAtODQ0LCAgLTE0MjMsICAtMTE4NSwgICAtOTcyLCAgIC00NTgsICAgLTI3NSwgICAgMTM4LAorICAgICAgMTMxNywgICAxNzc4LCAgLTEyOTUsICAgLTg3NCwgIC0xMjExLCAgIC03OTIsICAgLTYwMSwgICAtNTAwLAorICAgICAgMjMwMSwgICAgOTAxLCAgIDEzMzYsICAgIDg0MiwgICAxMzU1LCAgIC00MjYsICAtMTE2MCwgICAtOTU5LAorICAgICAgLTgwMSwgICAtNDMzLCAgIDE4NTIsICAgIDE0NCwgICAgMjg0LCAgICAxNjksICAtMTEyMiwgICAtODUxLAorICAgICAgLTk1NywgICAgMjcyLCAgIC0zOTMsICAgIDgxNywgICAgODYyLCAgICAyNjIsICAgIDMzMywgICAgODAyLAorICAgICAgIDMyMCwgICAtNTc2LCAgIDE2MTUsICAgLTYxNSwgICAtODg2LCAgIC0zMTEsICAgIDEwOCwgICAgIDEzLAorICAgICAgICAgMSwgICAgMzIwLCAgLTEyMDUsICAgIDk2MiwgICAtNDgzLCAgIC03OTEsICAgLTc0OSwgICAxMTU4LAorICAgICAgIDY3NywgICAgLTU3LCAgICAxNjYsICAgIDI3OSwgICAtODYwLCAgIDEyMzcsICAgLTk3MSwgIC0xMDU3LAorICAgICAgLTU5OCwgICAtMjg1LCAgICA4ODQsICAgMTE3NCwgICAgNjU3LCAgIC0zMDMsICAgMjI1NCwgICAtNzA2LAorICAgICAtMTExMywgICAtNjU1LCAgICA3MTksICAgIDIzNCwgICAtMTI0LCAgIC0xOTksICAgLTEzNSwgICAtMzYwLAorICAgICAgLTc1OCwgICAtNjIzLCAgIC0zODUsICAgIC0xOCwgICAzMjQzLCAgICA0NzAsICAgLTEzOSwgICAtMjg2LAorICAgICAgLTUyMCwgICAtOTUzLCAgLTExOTMsICAtMTE0MCwgIC0xMjk3LCAgLTExMzcsICAgLTc2NCwgICAgIDI1LAorICAgICAgIDIzNSwgICAyMjE3LCAgIDE1MDEsICAgMTM2OSwgICAyMDI0LCAgICA3ODEsICAtMTM1MywgICAtODM1LAorICAgICAgLTgyNCwgICAtNjAxLCAgIC0yNTksICAgLTE0MCwgICAgMzg3LCAgICA2NzEsICAgICAgMywgICAtOTc0LAorICAgICAgLTc2MCwgICAtODg0LCAgIC00ODUsICAgIDcwOSwgICAxNTA1LCAgICAtOTUsICAgIDMyMSwgICAgNzM5LAorICAgICAgMTYxMCwgICAtMTU2LCAgIDE1MTUsICAgIC03NiwgICAtNDIwLCAgIC0zNjksICAgLTE4OSwgICAtNTA2LAorICAgICAgLTcwNSwgICAtOTA3LCAgLTEwNTIsICAgLTUxNiwgIC0xMDQ4LCAgIC05OTYsICAgLTQ3MSwgICAxMTk1LAorICAgICAgIDIxMiwgICAgMTg0LCAgICA4MDAsICAgMTY2NSwgICAgNzQ3LCAgLTEwMjksICAtMTAxMywgICAgNzg5LAorICAgICAgLTcwMywgICAgNTU5LCAgIC0xMzksICAgIC05OCwgICAgMzgwLCAgICA1MjMsICAgLTM1NSwgICAyMDQ3LAorICAgICAgLTc2NiwgICAtOTkxLCAgIC04MDksICAgLTU2NiwgICAtMjU3LCAgIC0yNDIsICAgIDQ4NSwgICAxMzIyLAorICAgICAgMTk4OSwgICAtMzMwLCAgIC05NDUsICAgLTU1OSwgICAtNDQ4LCAgIDEyNDEsICAgIDgxMSwgICAgIDEwLAorICAgICAgLTc2NywgIC0xMjE4LCAgIDE2MDAsICAgLTc1NSwgICAgNDI4LCAgIC03MjksICAgLTM1NSwgICAtNjY1LAorICAgICAgLTQxNiwgICAtMTIwLCAgICAzODEsICAgIDU0OCwgICAtNzE3LCAgICAtMTQsICAgMTU4NywgICAtODg2LAorICAgICAgICAtOSwgICAgMzUzLCAgICA4MzksICAgIDIwMSwgICAtNDU0LCAgLTExMTIsICAtMTMzNCwgICAtMzA5LAorICAgICAgIDY2MCwgICAtMzc1LCAgIC02NjEsICAgLTUxMSwgICAxNDM3LCAgICA1NDAsICAgIDQ5MiwgICAgICAwLAorICAgICAgICA5NSwgICAzOTExLCAgIC0yMzcsICAgLTMwMSwgICAtNTYyLCAgIC00ODMsICAgLTU2OSwgICAtNzk5LAorICAgICAgLTg4MywgICAtNTgwLCAgIC02NzAsICAgLTk4MCwgIC0xMDU2LCAgIC04OTYsICAgLTc5NywgICAxNTUxLAorICAgICAgIDI2NywgICAxMDAwLCAgIDE2MTcsICAgICA3NSwgIC0xMTMyLCAgIC00MDMsICAgLTk4OCwgICAtODMwLAorICAgICAgLTYyNywgICAxMTY0LCAgIDEzMTUsICAgMTU5NCwgICAgMzEwLCAgIC01NjQsICAtMTA5MSwgICAtNTYzLAorICAgICAgMTE5NSwgICAtNDQyLCAgIDEwODYsICAgLTM0NCwgICAtMTc2LCAgIC0yNTgsICAgIDE3NSwgICAgNDc2LAorICAgICAgIDkyMywgICAgLTM3LCAgIC02MjksICAgLTkxOSwgICAxMjc4LCAgIC02MTAsICAgIDExMywgICAtMzE0LAorICAgICAgIC04MSwgICAgMTkyLCAgICA3MzEsICAgLTk0NCwgIC0xMjk3LCAgLTExMDgsICAgLTkzNCwgICAtMjU5LAorICAgICAgIDY0MCwgICAxMTY0LCAgIDEzMjYsICAgIDU1OCwgICAtNzY3LCAgIC01MTksICAgLTg3NSwgICAtOTMwLAorICAgICAgLTgxNywgICAtNTMzLCAgICA0OTYsICAgMjYwNSwgICAxMzU5LCAgIC0xMzEsICAtMTAxMCwgICAgOTEyLAorICAgICAtMTA1NSwgICAtMzA5LCAgICA3NjgsICAgLTE5OCwgICAtMTY2LCAgICAtNzYsICAgIDQyOSwgICAgNjQwLAorICAgICAgMzI4MywgICAtODk1LCAgLTEyMjksICAgLTg1MywgICAtODUzLCAgIC0zOTksICAgIDE0NywgICAgIDQ0LAorICAgICAgIDIzNywgICAgNDk1LCAgIC04MzMsICAgLTkwOSwgIC0xMDA0LCAgIC04MTEsICAgMTAzOSwgICAxNjI3LAorICAgICAgLTE5NCwgICAgMjk1LCAgICA3MzgsICAgIDI5MCwgICAtNzcxLCAgICAyMzcsICAgLTkxMiwgICAtNDc5LAorICAgICAgLTY0OCwgICAtNTE4LCAgIC0yMjYsICAgIDU3MywgICAyMzQ2LCAgICA0MTksICAgMTAxMywgICAxNTEwLAorICAgICAgLTg2NSwgICAtODczLCAgIC05ODIsICAgLTU1NywgICAgNTk4LCAgICAgNTAsICAgICA4MSwgICAgLTgxLAorICAgICAtMTE1MCwgICAtNjQwLCAgLTEwMTEsICAgMTk5MSwgICAtNTYxLCAgIC0xNDAsICAgICA0MiwgICAgMTc1LAorICAgICAgIDUyMSwgICAgNzk5LCAgIDMyMzEsICAgIC00NiwgIC0xMDA0LCAgIC05OTQsICAtMTE0MCwgIC0xMDk0LAorICAgICAgLTk1NywgICAtODYwLCAgICAgIDgsICAgMjM0NiwgICAgMjEyLCAgIC00OTksICAgIC01NSwgICAtOTk3LAorICAgICAgLTYyMywgICAtNTg4LCAgICAgMzgsICAgIC01OCwgICAgOTc1LCAgIDE1MjksICAgLTk4NiwgICAtODkxLAorICAgICAtMTEyMSwgICAtNjE5LCAgIDE5NjcsICAgLTQ2MywgICAgIC03LCAgICA2MzIsICAgIDc2OCwgICAgOTUzLAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGxzcDhbXSA9IHsKKyAgICAgMC4yNzAyLCAgMC41MDk2LCAgMC42NDM3LCAgMC43NjcyLCAgMC45NjM5LCAgMS4wNjk2LCAgMS4yNjI1LCAgMS41Nzg5LAorICAgICAxLjkyODUsICAyLjIzODMsICAyLjUxMjksICAyLjg0NzAsICAwLjE3NDAsICAwLjM2NzcsICAwLjYwODIsICAwLjgzODcsCisgICAgIDEuMTA4NCwgIDEuMzcyMSwgIDEuNjM2MiwgIDEuODczMywgIDIuMDY0MCwgIDIuMzQ0MiwgIDIuNjA4NywgIDIuODU0OCwKKyAgICAgMC4xNTM2LCAgMC4zMjc5LCAgMC41MTQzLCAgMC42ODU5LCAgMC45NzYzLCAgMS4yNzQ0LCAgMS41NjA1LCAgMS44NTY2LAorICAgICAyLjEwMDcsICAyLjM0NTAsICAyLjYwNzUsICAyLjg4NTAsICAwLjIwNzUsICAwLjQ1MzMsICAwLjc3MDksICAxLjAzNzcsCisgICAgIDEuMjk1MywgIDEuNTEzMiwgIDEuNzgyNiwgIDIuMDM1MSwgIDIuMjU5MCwgIDIuNDk5NiwgIDIuNjc5NSwgIDIuODc0OCwKKyAgICAgMC4xMzkzLCAgMC4yNDUzLCAgMC4zNzU0LCAgMC41NDUzLCAgMC44MTQ4LCAgMS4xMjg5LCAgMS40Mzg5LCAgMS43NTkyLAorICAgICAyLjAzNTMsICAyLjMyMTUsICAyLjU5MzQsICAyLjg1ODgsICAwLjEyNTAsICAwLjM2MjcsICAwLjc2MTMsICAxLjEzODAsCisgICAgIDEuNDE2MywgIDEuNTU2NSwgIDEuNjkyMCwgIDEuODEzMCwgIDEuODY3OCwgIDIuMDQyNywgIDIuNDMxOCwgIDIuODU0NCwKKyAgICAgMC4yMjU2LCAgMC40MjIzLCAgMC42NDUyLCAgMC44NTk5LCAgMS4wNjczLCAgMS4zMTE4LCAgMS41NDg2LCAgMS44MzY2LAorICAgICAyLjA3NTksICAyLjMwMjYsICAyLjUyODQsICAyLjgwMzAsICAwLjIzMDQsICAwLjQ0MDQsICAwLjY4OTEsICAwLjg5NjQsCisgICAgIDEuMTUxMCwgIDEuNDIwMiwgIDEuNjQ4MywgIDEuODU4MCwgIDIuMTE4MSwgIDIuMzY4NiwgIDIuNjA3OCwgIDIuOTEyOCwKKyAgICAgMC4yMjMwLCAgMC4zODE2LCAgMC41NTIwLCAgMC42MDYyLCAgMC43OTA5LCAgMS4wOTg4LCAgMS40MzMwLCAgMS43ODQ2LAorICAgICAyLjA3MTMsICAyLjM0NTcsICAyLjYwNDgsICAyLjg3MDgsICAwLjI0NDcsICAwLjU4MDAsICAwLjgyNDksICAwLjk5MDUsCisgICAgIDEuMTcyMSwgIDEuMzk5MCwgIDEuNjY5NCwgIDEuOTA2NCwgIDIuMTMwNywgIDIuNDI1NSwgIDIuNjgxNSwgIDIuOTExNywKKyAgICAgMC4xOTc0LCAgMC4zODEyLCAgMC41ODAyLCAgMC43NzU5LCAgMC45MjgwLCAgMS4xNTQ3LCAgMS40MTcwLCAgMS42MzY5LAorICAgICAxLjg4OTAsICAyLjI1ODcsICAyLjU2MjYsICAyLjgyMzksICAwLjEyMDksICAwLjI1MTAsICAwLjQ4NDEsICAwLjgwNDgsCisgICAgIDEuMTE5NywgIDEuMzU2MywgIDEuNjA3MywgIDEuODkyNiwgIDIuMTM1MCwgIDIuMzY2OSwgIDIuNjI5MSwgIDIuODk4NSwKKyAgICAgMC4yMzUyLCAgMC40MzQ3LCAgMC42NTgyLCAgMC44MTc4LCAgMC45NTQ4LCAgMS4xNjU0LCAgMS40OTQyLCAgMS44ODEyLAorICAgICAyLjE3MDMsICAyLjM3NzksICAyLjY0MTIsICAyLjg4NzEsICAwLjIwOTEsICAwLjQwODQsICAwLjY3MzAsICAwLjkxNTEsCisgICAgIDEuMTI1OSwgIDEuMzI2MiwgIDEuNTkzNywgIDEuODEyOSwgIDIuMDIzNywgIDIuMzMxNywgIDIuNTc3OCwgIDIuODYyMCwKKyAgICAgMC4xMTY3LCAgMC4yNDA2LCAgMC40NTIwLCAgMC43Mjk4LCAgMC45ODQ4LCAgMS4yNDQ4LCAgMS41MTM3LCAgMS43ODc0LAorICAgICAyLjAyODAsICAyLjMwMjAsICAyLjU5MTQsICAyLjg3OTQsICAwLjMwMDMsICAwLjQ5NjYsICAwLjY1MjAsICAwLjg1MDUsCisgICAgIDEuMTYwMCwgIDEuMzk4MSwgIDEuNTgwNSwgIDEuODM0NiwgIDIuMDc1NywgIDIuMzEwMiwgIDIuNTc2MCwgIDIuODQ5OSwKKyAgICAgMC4yNDUxLCAgMC40MTYzLCAgMC41OTYwLCAgMC43ODA1LCAgMC45NTA3LCAgMS4yNDM4LCAgMS41NTg3LCAgMS44NTgxLAorICAgICAyLjA3MzUsICAyLjMxOTgsICAyLjU3MDQsICAyLjgyMjAsICAwLjMxMTIsICAwLjU1MTcsICAwLjcwMzIsICAwLjg1MjgsCisgICAgIDEuMTQ4OSwgIDEuNDI1NywgIDEuNjg0OCwgIDEuOTM4OCwgIDIuMTU3NywgIDIuNDI2NSwgIDIuNjY3OCwgIDIuOTA1MSwKKyAgICAgMC4yMjQ5LCAgMC4zODk3LCAgMC41NTU5LCAgMC43NDczLCAgMS4wMTU4LCAgMS4zNTgxLCAgMS42OTE0LCAgMS45OTMwLAorICAgICAyLjE4NDMsICAyLjM1MzQsICAyLjU1MTIsICAyLjgwNjUsICAwLjI2MDAsICAwLjQ1NzQsICAwLjczNDksICAwLjk2OTEsCisgICAgIDEuMTY5NiwgIDEuMzg0OCwgIDEuNjMzNSwgIDEuOTAyMSwgIDIuMTE3NCwgIDIuMzQ4MSwgIDIuNTkwMiwgIDIuODM5MCwKKyAgICAgMC4yMjQ2LCAgMC4zMzcyLCAgMC40NTYwLCAgMC41MjQ5LCAgMC43MDU2LCAgMS4wMjczLCAgMS4zODEwLCAgMS43MTMyLAorICAgICAxLjk4MTksICAyLjI1NzQsICAyLjU0MTAsICAyLjg0OTEsICAwLjE0MTksICAwLjQ4MzQsICAwLjg4MzUsICAxLjE0NTMsCisgICAgIDEuMjgzOSwgIDEuNDIyNCwgIDEuNTU5MywgIDEuNzg3NywgIDIuMTI4NSwgIDIuNDA3MCwgIDIuNjA0MywgIDIuODUxMSwKKyAgICAgMC4xODg2LCAgMC4zNjc3LCAgMC41NjE3LCAgMC44MDk5LCAgMS4xMjc3LCAgMS4zODQxLCAgMS41ODA0LCAgMS44MTM2LAorICAgICAyLjAzMDcsICAyLjI4MDUsICAyLjUzOTksICAyLjgzMjIsICAwLjIzNTEsICAwLjQxNTEsICAwLjY2NzUsICAwLjg3MTMsCisgICAgIDEuMDQ2NCwgIDEuMzI5MiwgIDEuNjU4NiwgIDEuOTI4MSwgIDIuMTM1NSwgIDIuMzQ5NSwgIDIuNjIyMiwgIDIuODc4MiwKKyAgICAgMC4yNzAwLCAgMC40NDg5LCAgMC42MjA2LCAgMC43MTIxLCAgMC43NzM3LCAgMC45ODQ4LCAgMS4zNjU4LCAgMS43NDMzLAorICAgICAyLjAxMzksICAyLjIyNDMsICAyLjQ4MDYsICAyLjgxNzUsICAwLjI0NzksICAwLjQ0MjUsICAwLjY0OTAsICAwLjg3NDUsCisgICAgIDEuMTE2MSwgIDEuMzg0OSwgIDEuNjc3MywgIDEuOTU2NiwgIDIuMTQ5MSwgIDIuMzYyNCwgIDIuNTY4NSwgIDIuODExNCwKKyAgICAgMC4yMDM1LCAgMC4zNzAxLCAgMC41NTY3LCAgMC43OTUzLCAgMS4wMDgyLCAgMS4yNzU4LCAgMS41MzczLCAgMS43ODIyLAorICAgICAyLjAxNzUsICAyLjI2MDEsICAyLjQ3NTksICAyLjc3NzEsICAwLjE4NTYsICAwLjM0NjEsICAwLjU5OTgsICAwLjkwNDEsCisgICAgIDEuMjM4MywgIDEuNDYxMiwgIDEuNjY2NywgIDEuOTMwNSwgIDIuMTYxNywgIDIuNDEwNywgIDIuNjQ3NywgIDIuODY1NiwKKyAgICAgMC4yMTA3LCAgMC4zNzE1LCAgMC41Mjg5LCAgMC42NjUxLCAgMC44NDIwLCAgMS4xMTY4LCAgMS40NDAxLCAgMS43MjMwLAorICAgICAxLjk5MDEsICAyLjI2ODcsICAyLjU0NTIsICAyLjg2NTUsICAwLjEyMTgsICAwLjI5OTksICAwLjYzNDgsICAwLjk0ODIsCisgICAgIDEuMjc0NSwgIDEuNTg3NiwgIDEuOTEyOSwgIDIuMjM0OCwgIDIuNDAyMCwgIDIuNDkyMiwgIDIuNjM1MSwgIDIuODM1NywKKyAgICAgMC4xNjE3LCAgMC4zNDgzLCAgMC41ODY5LCAgMC44MTYzLCAgMS4wMzY2LCAgMS4yMzQ0LCAgMS40NjA5LCAgMS43MDI5LAorICAgICAxLjk0NzYsICAyLjIzMzcsICAyLjUyNTgsICAyLjg0NDIsICAwLjI1MDUsICAwLjQ4OTQsICAwLjc1MTAsICAwLjkxNTIsCisgICAgIDEuMDg0NSwgIDEuMzY1NywgIDEuNjUyOCwgIDEuODM0NiwgIDIuMDE2MCwgIDIuMjgxMSwgIDIuNTMzOCwgIDIuODEzNiwKKyAgICAgMC4wOTQ3LCAgMC4xMTU4LCAgMC4wNTc4LCAtMC4wMzM3LCAtMC4wMDY2LCAgMC4wMTA0LCAtMC4wNDQ3LCAtMC4wNTA1LAorICAgIC0wLjA3NzgsIC0wLjAyOTMsICAwLjAyNTEsIC0wLjAxNDMsICAwLjAzNDksIC0wLjAyMjcsIC0wLjA5MDksICAwLjA1MjMsCisgICAgIDAuMDMyNSwgLTAuMDQxMCwgLTAuMTA0NSwgLTAuMDg5OSwgLTAuMDAwOSwgIDAuMDA3NSwgLTAuMDU3NSwgLTAuMDg1NSwKKyAgICAtMC4wMTI5LCAgMC4wNTc1LCAgMC4wNTk3LCAgMC4wMzkxLCAgMC4wMzcxLCAtMC4wMTg0LCAtMC4wMDgzLCAgMC4wMjg3LAorICAgICAwLjAxNDMsICAwLjAxNjcsICAwLjAxMjAsIC0wLjAxNjgsICAwLjA0NTIsICAwLjAyMjMsIC0wLjAzNTIsICAwLjAxMTksCisgICAgLTAuMDQ5NiwgLTAuMDk2NSwgLTAuMDY2MSwgLTAuMDA3MiwgIDAuMTA5OSwgIDAuMDg0MywgLTAuMDA4NywgLTAuMDQ3OCwKKyAgICAtMC4wMTI4LCAtMC4wMTIwLCAtMC4wMDA0LCAgMC4wNzMxLCAgMC4xMDQ3LCAgMC4wNjMwLCAgMC4wMTk2LCAtMC4wMTAzLAorICAgIC0wLjAzOTksIC0wLjA5ODYsIC0wLjA5MTIsIC0wLjAzOTAsIC0wLjAyNDcsIC0wLjA2OTQsIC0wLjA3NDksIC0wLjAwNjYsCisgICAgIDAuMDIyMywgIDAuMDYzNCwgIDAuMDM0MywgLTAuMDEzNCwgIDAuMDcyNywgIDAuMDI0MSwgIDAuMDA2NiwgIDAuMDQzNywKKyAgICAgMC4wNjEwLCAgMC4wMzY0LCAgMC4wMjQ4LCAtMC4wMzU4LCAtMC4wNjg2LCAtMC4wMTA0LCAgMC4wNDI2LCAgMC4wMDg4LAorICAgIC0wLjAxMzcsIC0wLjAxNjUsICAwLjA2NzEsICAwLjA4MTUsIC0wLjA4NjMsIC0wLjA2NDQsIC0wLjAwODgsICAwLjAwMjMsCisgICAgIDAuMDQ4MiwgIDAuMTE3NCwgIDAuMTI3MCwgIDAuMDU5NCwgIDAuMDE2NSwgIDAuMDk0OSwgIDAuMTA5OCwgIDAuMDEzNywKKyAgICAgMC40OTUxLCAgMC40OTk5LCAgMC40OTU4LCAgMC40OTA3LCAgMC40OTg0LCAgMC40OTY1LCAgMC40OTU4LCAgMC40OTk2LAorICAgICAwLjQ5ODcsICAwLjQ5NTgsICAwLjQ5ODYsICAwLjQ5NzcsICAwLjI4NDEsICAwLjIxODYsICAwLjE0NzQsICAwLjE2ODcsCisgICAgIDAuMjIxNywgIDAuMjYzMiwgIDAuMjcwNiwgIDAuMjYyNCwgIDAuMjE2MiwgIDAuMjQ1MywgIDAuMjQ2MCwgIDAuMjUzMSwKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBsc3A4c1tdID0geworICAgICAwLjI3MDIsICAwLjUwOTYsICAwLjY0MzcsICAwLjc2NzIsICAwLjk2MzksICAxLjA2OTYsICAxLjI2MjUsICAxLjU3ODksCisgICAgIDEuOTI4NSwgIDIuMjM4MywgIDIuNTEyOSwgIDIuODQ3MCwgIDAuMTc0MCwgIDAuMzY3NywgIDAuNjA4MiwgIDAuODM4NywKKyAgICAgMS4xMDg0LCAgMS4zNzIxLCAgMS42MzYyLCAgMS44NzMzLCAgMi4wNjQwLCAgMi4zNDQyLCAgMi42MDg3LCAgMi44NTQ4LAorICAgICAwLjE1MzYsICAwLjMyNzksICAwLjUxNDMsICAwLjY4NTksICAwLjk3NjMsICAxLjI3NDQsICAxLjU2MDUsICAxLjg1NjYsCisgICAgIDIuMTAwNywgIDIuMzQ1MCwgIDIuNjA3NSwgIDIuODg1MCwgIDAuMjA3NSwgIDAuNDUzMywgIDAuNzcwOSwgIDEuMDM3NywKKyAgICAgMS4yOTUzLCAgMS41MTMyLCAgMS43ODI2LCAgMi4wMzUxLCAgMi4yNTkwLCAgMi40OTk2LCAgMi42Nzk1LCAgMi44NzQ4LAorICAgICAwLjEzOTMsICAwLjI0NTMsICAwLjM3NTQsICAwLjU0NTMsICAwLjgxNDgsICAxLjEyODksICAxLjQzODksICAxLjc1OTIsCisgICAgIDIuMDM1MywgIDIuMzIxNSwgIDIuNTkzNCwgIDIuODU4OCwgIDAuMTI1MCwgIDAuMzYyNywgIDAuNzYxMywgIDEuMTM4MCwKKyAgICAgMS40MTYzLCAgMS41NTY1LCAgMS42OTIwLCAgMS44MTMwLCAgMS44Njc4LCAgMi4wNDI3LCAgMi40MzE4LCAgMi44NTQ0LAorICAgICAwLjIyNTYsICAwLjQyMjMsICAwLjY0NTIsICAwLjg1OTksICAxLjA2NzMsICAxLjMxMTgsICAxLjU0ODYsICAxLjgzNjYsCisgICAgIDIuMDc1OSwgIDIuMzAyNiwgIDIuNTI4NCwgIDIuODAzMCwgIDAuMjMwNCwgIDAuNDQwNCwgIDAuNjg5MSwgIDAuODk2NCwKKyAgICAgMS4xNTEwLCAgMS40MjAyLCAgMS42NDgzLCAgMS44NTgwLCAgMi4xMTgxLCAgMi4zNjg2LCAgMi42MDc4LCAgMi45MTI4LAorICAgICAwLjIyMzAsICAwLjM4MTYsICAwLjU1MjAsICAwLjYwNjIsICAwLjc5MDksICAxLjA5ODgsICAxLjQzMzAsICAxLjc4NDYsCisgICAgIDIuMDcxMywgIDIuMzQ1NywgIDIuNjA0OCwgIDIuODcwOCwgIDAuMjQ0NywgIDAuNTgwMCwgIDAuODI0OSwgIDAuOTkwNSwKKyAgICAgMS4xNzIxLCAgMS4zOTkwLCAgMS42Njk0LCAgMS45MDY0LCAgMi4xMzA3LCAgMi40MjU1LCAgMi42ODE1LCAgMi45MTE3LAorICAgICAwLjE5NzQsICAwLjM4MTIsICAwLjU4MDIsICAwLjc3NTksICAwLjkyODAsICAxLjE1NDcsICAxLjQxNzAsICAxLjYzNjksCisgICAgIDEuODg5MCwgIDIuMjU4NywgIDIuNTYyNiwgIDIuODIzOSwgIDAuMTIwOSwgIDAuMjUxMCwgIDAuNDg0MSwgIDAuODA0OCwKKyAgICAgMS4xMTk3LCAgMS4zNTYzLCAgMS42MDczLCAgMS44OTI2LCAgMi4xMzUwLCAgMi4zNjY5LCAgMi42MjkxLCAgMi44OTg1LAorICAgICAwLjIzNTIsICAwLjQzNDcsICAwLjY1ODIsICAwLjgxNzgsICAwLjk1NDgsICAxLjE2NTQsICAxLjQ5NDIsICAxLjg4MTIsCisgICAgIDIuMTcwMywgIDIuMzc3OSwgIDIuNjQxMiwgIDIuODg3MSwgIDAuMjA5MSwgIDAuNDA4NCwgIDAuNjczMCwgIDAuOTE1MSwKKyAgICAgMS4xMjU5LCAgMS4zMjYyLCAgMS41OTM3LCAgMS44MTI5LCAgMi4wMjM3LCAgMi4zMzE3LCAgMi41Nzc4LCAgMi44NjIwLAorICAgICAwLjExNjcsICAwLjI0MDYsICAwLjQ1MjAsICAwLjcyOTgsICAwLjk4NDgsICAxLjI0NDgsICAxLjUxMzcsICAxLjc4NzQsCisgICAgIDIuMDI4MCwgIDIuMzAyMCwgIDIuNTkxNCwgIDIuODc5NCwgIDAuMzAwMywgIDAuNDk2NiwgIDAuNjUyMCwgIDAuODUwNSwKKyAgICAgMS4xNjAwLCAgMS4zOTgxLCAgMS41ODA1LCAgMS44MzQ2LCAgMi4wNzU3LCAgMi4zMTAyLCAgMi41NzYwLCAgMi44NDk5LAorICAgICAwLjI0NTEsICAwLjQxNjMsICAwLjU5NjAsICAwLjc4MDUsICAwLjk1MDcsICAxLjI0MzgsICAxLjU1ODcsICAxLjg1ODEsCisgICAgIDIuMDczNSwgIDIuMzE5OCwgIDIuNTcwNCwgIDIuODIyMCwgIDAuMzExMiwgIDAuNTUxNywgIDAuNzAzMiwgIDAuODUyOCwKKyAgICAgMS4xNDg5LCAgMS40MjU3LCAgMS42ODQ4LCAgMS45Mzg4LCAgMi4xNTc3LCAgMi40MjY1LCAgMi42Njc4LCAgMi45MDUxLAorICAgICAwLjIyNDksICAwLjM4OTcsICAwLjU1NTksICAwLjc0NzMsICAxLjAxNTgsICAxLjM1ODEsICAxLjY5MTQsICAxLjk5MzAsCisgICAgIDIuMTg0MywgIDIuMzUzNCwgIDIuNTUxMiwgIDIuODA2NSwgIDAuMjYwMCwgIDAuNDU3NCwgIDAuNzM0OSwgIDAuOTY5MSwKKyAgICAgMS4xNjk2LCAgMS4zODQ4LCAgMS42MzM1LCAgMS45MDIxLCAgMi4xMTc0LCAgMi4zNDgxLCAgMi41OTAyLCAgMi44MzkwLAorICAgICAwLjIyNDYsICAwLjMzNzIsICAwLjQ1NjAsICAwLjUyNDksICAwLjcwNTYsICAxLjAyNzMsICAxLjM4MTAsICAxLjcxMzIsCisgICAgIDEuOTgxOSwgIDIuMjU3NCwgIDIuNTQxMCwgIDIuODQ5MSwgIDAuMTQxOSwgIDAuNDgzNCwgIDAuODgzNSwgIDEuMTQ1MywKKyAgICAgMS4yODM5LCAgMS40MjI0LCAgMS41NTkzLCAgMS43ODc3LCAgMi4xMjg1LCAgMi40MDcwLCAgMi42MDQzLCAgMi44NTExLAorICAgICAwLjE4ODYsICAwLjM2NzcsICAwLjU2MTcsICAwLjgwOTksICAxLjEyNzcsICAxLjM4NDEsICAxLjU4MDQsICAxLjgxMzYsCisgICAgIDIuMDMwNywgIDIuMjgwNSwgIDIuNTM5OSwgIDIuODMyMiwgIDAuMjM1MSwgIDAuNDE1MSwgIDAuNjY3NSwgIDAuODcxMywKKyAgICAgMS4wNDY0LCAgMS4zMjkyLCAgMS42NTg2LCAgMS45MjgxLCAgMi4xMzU1LCAgMi4zNDk1LCAgMi42MjIyLCAgMi44NzgyLAorICAgICAwLjI3MDAsICAwLjQ0ODksICAwLjYyMDYsICAwLjcxMjEsICAwLjc3MzcsICAwLjk4NDgsICAxLjM2NTgsICAxLjc0MzMsCisgICAgIDIuMDEzOSwgIDIuMjI0MywgIDIuNDgwNiwgIDIuODE3NSwgIDAuMjQ3OSwgIDAuNDQyNSwgIDAuNjQ5MCwgIDAuODc0NSwKKyAgICAgMS4xMTYxLCAgMS4zODQ5LCAgMS42NzczLCAgMS45NTY2LCAgMi4xNDkxLCAgMi4zNjI0LCAgMi41Njg1LCAgMi44MTE0LAorICAgICAwLjIwMzUsICAwLjM3MDEsICAwLjU1NjcsICAwLjc5NTMsICAxLjAwODIsICAxLjI3NTgsICAxLjUzNzMsICAxLjc4MjIsCisgICAgIDIuMDE3NSwgIDIuMjYwMSwgIDIuNDc1OSwgIDIuNzc3MSwgIDAuMTg1NiwgIDAuMzQ2MSwgIDAuNTk5OCwgIDAuOTA0MSwKKyAgICAgMS4yMzgzLCAgMS40NjEyLCAgMS42NjY3LCAgMS45MzA1LCAgMi4xNjE3LCAgMi40MTA3LCAgMi42NDc3LCAgMi44NjU2LAorICAgICAwLjIxMDcsICAwLjM3MTUsICAwLjUyODksICAwLjY2NTEsICAwLjg0MjAsICAxLjExNjgsICAxLjQ0MDEsICAxLjcyMzAsCisgICAgIDEuOTkwMSwgIDIuMjY4NywgIDIuNTQ1MiwgIDIuODY1NSwgIDAuMTIxOCwgIDAuMjk5OSwgIDAuNjM0OCwgIDAuOTQ4MiwKKyAgICAgMS4yNzQ1LCAgMS41ODc2LCAgMS45MTI5LCAgMi4yMzQ4LCAgMi40MDIwLCAgMi40OTIyLCAgMi42MzUxLCAgMi44MzU3LAorICAgICAwLjE2MTcsICAwLjM0ODMsICAwLjU4NjksICAwLjgxNjMsICAxLjAzNjYsICAxLjIzNDQsICAxLjQ2MDksICAxLjcwMjksCisgICAgIDEuOTQ3NiwgIDIuMjMzNywgIDIuNTI1OCwgIDIuODQ0MiwgIDAuMjUwNSwgIDAuNDg5NCwgIDAuNzUxMCwgIDAuOTE1MiwKKyAgICAgMS4wODQ1LCAgMS4zNjU3LCAgMS42NTI4LCAgMS44MzQ2LCAgMi4wMTYwLCAgMi4yODExLCAgMi41MzM4LCAgMi44MTM2LAorICAgICAwLjA5NDcsICAwLjExNTgsICAwLjA1NzgsIC0wLjAzMzcsIC0wLjAwNjYsICAwLjAxMDQsIC0wLjA0NDcsIC0wLjA1MDUsCisgICAgLTAuMDc3OCwgLTAuMDI5MywgIDAuMDI1MSwgLTAuMDE0MywgIDAuMDM0OSwgLTAuMDIyNywgLTAuMDkwOSwgIDAuMDUyMywKKyAgICAgMC4wMzI1LCAtMC4wNDEwLCAtMC4xMDQ1LCAtMC4wODk5LCAtMC4wMDA5LCAgMC4wMDc1LCAtMC4wNTc1LCAtMC4wODU1LAorICAgIC0wLjAxMjksICAwLjA1NzUsICAwLjA1OTcsICAwLjAzOTEsICAwLjAzNzEsIC0wLjAxODQsIC0wLjAwODMsICAwLjAyODcsCisgICAgIDAuMDE0MywgIDAuMDE2NywgIDAuMDEyMCwgLTAuMDE2OCwgIDAuMDQ1MiwgIDAuMDIyMywgLTAuMDM1MiwgIDAuMDExOSwKKyAgICAtMC4wNDk2LCAtMC4wOTY1LCAtMC4wNjYxLCAtMC4wMDcyLCAgMC4xMDk5LCAgMC4wODQzLCAtMC4wMDg3LCAtMC4wNDc4LAorICAgIC0wLjAxMjgsIC0wLjAxMjAsIC0wLjAwMDQsICAwLjA3MzEsICAwLjEwNDcsICAwLjA2MzAsICAwLjAxOTYsIC0wLjAxMDMsCisgICAgLTAuMDM5OSwgLTAuMDk4NiwgLTAuMDkxMiwgLTAuMDM5MCwgLTAuMDI0NywgLTAuMDY5NCwgLTAuMDc0OSwgLTAuMDA2NiwKKyAgICAgMC4wMjIzLCAgMC4wNjM0LCAgMC4wMzQzLCAtMC4wMTM0LCAgMC4wNzI3LCAgMC4wMjQxLCAgMC4wMDY2LCAgMC4wNDM3LAorICAgICAwLjA2MTAsICAwLjAzNjQsICAwLjAyNDgsIC0wLjAzNTgsIC0wLjA2ODYsIC0wLjAxMDQsICAwLjA0MjYsICAwLjAwODgsCisgICAgLTAuMDEzNywgLTAuMDE2NSwgIDAuMDY3MSwgIDAuMDgxNSwgLTAuMDg2MywgLTAuMDY0NCwgLTAuMDA4OCwgIDAuMDAyMywKKyAgICAgMC4wNDgyLCAgMC4xMTc0LCAgMC4xMjcwLCAgMC4wNTk0LCAgMC4wMTY1LCAgMC4wOTQ5LCAgMC4xMDk4LCAgMC4wMTM3LAorICAgICAwLjQ5NTEsICAwLjQ5OTksICAwLjQ5NTgsICAwLjQ5MDcsICAwLjQ5ODQsICAwLjQ5NjUsICAwLjQ5NTgsICAwLjQ5OTYsCisgICAgIDAuNDk4NywgIDAuNDk1OCwgIDAuNDk4NiwgIDAuNDk3NywgIDAuMjg0MSwgIDAuMjE4NiwgIDAuMTQ3NCwgIDAuMTY4NywKKyAgICAgMC4yMjE3LCAgMC4yNjMyLCAgMC4yNzA2LCAgMC4yNjI0LCAgMC4yMTYyLCAgMC4yNDUzLCAgMC4yNDYwLCAgMC4yNTMxLAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGxzcDExW10gPSB7CisgICAgIDAuMTEwMywgIDAuMzg2MiwgIDAuNjg2MywgIDAuODQ0NywgIDAuOTIzMSwgIDEuMDI2MSwgIDEuMTI0OCwgIDEuNDA1NywKKyAgICAgMS42NjIxLCAgMS44MDEwLCAgMS44NjkyLCAgMi4wNzA0LCAgMi4zNDkwLCAgMi42MDYwLCAgMi43NTM5LCAgMi44OTc3LAorICAgICAwLjEyNzMsICAwLjI0MDcsICAwLjM4MTIsICAwLjYwMDQsICAwLjc3NjcsICAwLjkzODMsICAxLjEzNDQsICAxLjMzNTEsCisgICAgIDEuNTIzMywgIDEuNzI2MiwgIDEuOTQ2NiwgIDIuMTczOSwgIDIuMzQ5NSwgIDIuNTE2MiwgIDIuNzE2NCwgIDIuOTIwMiwKKyAgICAgMC4yMDEwLCAgMC4zMzMwLCAgMC40NDg4LCAgMC42NDY1LCAgMC44MDQ2LCAgMC45ODg5LCAgMS4xNDc5LCAgMS4yOTY0LAorICAgICAxLjQ3NzAsICAxLjY2MDYsICAxLjg3ODksICAyLjExNTUsICAyLjMyODcsICAyLjUxOTksICAyLjcxMDEsICAyLjkxMTksCisgICAgIDAuMTE2OCwgIDAuMjE5NywgIDAuMzI3OSwgIDAuNDY5MSwgIDAuNjI2OCwgIDAuODI1MSwgIDEuMDUzMywgIDEuMjcxNCwKKyAgICAgMS40NzEyLCAgMS42NzYyLCAgMS44ODMxLCAgMi4xMTE0LCAgMi4zMjMwLCAgMi41Mjk3LCAgMi43MzY1LCAgMi45MjcwLAorICAgICAwLjE0MDUsICAwLjMxMDksICAwLjQ5ODYsICAwLjY4OTEsICAwLjg2MzQsICAxLjA1ODMsICAxLjI1OTQsICAxLjQzNDksCisgICAgIDEuNjIzMiwgIDEuODExNiwgIDEuOTkwNSwgIDIuMTkzNSwgIDIuMzc5OSwgIDIuNTY1NiwgIDIuNzY2MSwgIDIuOTQ4NiwKKyAgICAgMC4xNzAzLCAgMC4zMDU3LCAgMC40NDAzLCAgMC41MjI1LCAgMC41OTY5LCAgMC44MTEwLCAgMS4wNzI5LCAgMS4zMjE1LAorICAgICAxLjU0MDcsICAxLjczODEsICAxLjk0NzcsICAyLjE2ODAsICAyLjM1ODYsICAyLjU2MTIsICAyLjc2MzAsICAyLjk0MTAsCisgICAgIDAuMTEyOCwgIDAuMjYyOCwgIDAuNDUyMywgIDAuNjQ5NSwgIDAuODE3NiwgIDAuOTgxNiwgIDEuMTc0NiwgIDEuMzcxMCwKKyAgICAgMS41NTY4LCAgMS43NTE4LCAgMS45NDk3LCAgMi4xNDUyLCAgMi4zMzQ2LCAgMi41Mzg5LCAgMi43MzYyLCAgMi45MjY0LAorICAgICAwLjE4MDksICAwLjMyODcsICAwLjUyMDUsICAwLjcyNjQsICAwLjkyOTgsICAxLjEyMTcsICAxLjI5NzAsICAxLjQ4OTQsCisgICAgIDEuNjg3NCwgIDEuODQ5MywgIDIuMDU3NiwgIDIuMjM4MiwgIDIuNDA5NywgIDIuNjA0MSwgIDIuNzc5NiwgIDIuOTM4OSwKKyAgICAgMC4yNTAyLCAgMC40NzA5LCAgMC42ODkyLCAgMC44MzQ2LCAgMC45MjA5LCAgMS4wNDU1LCAgMS4yMzk5LCAgMS40NjE2LAorICAgICAxLjY0NjMsICAxLjgzODAsICAyLjA0NzUsICAyLjIzOTcsICAyLjQ2NjUsICAyLjY1NTAsICAyLjc3MDEsICAyLjg4OTUsCisgICAgIDAuMTA0MCwgIDAuMjM0MCwgIDAuMzk2NCwgIDAuNTc0MCwgIDAuNzc2NCwgIDAuOTk0MSwgIDEuMjAwMCwgIDEuNDAxNCwKKyAgICAgMS42MDI0LCAgMS43OTc0LCAgMS45OTM5LCAgMi4xOTU5LCAgMi4zNzgzLCAgMi41NjYzLCAgMi43NjEzLCAgMi45NDg0LAorICAgICAwLjE5MTIsICAwLjMzOTMsICAwLjQ3NDMsICAwLjYzMTMsICAwLjgwMTQsICAwLjk4NzksICAxLjE4NTUsICAxLjM5MjIsCisgICAgIDEuNTY3OCwgIDEuNzI4OSwgIDEuOTI3MSwgIDIuMTE2NSwgIDIuMzA4OSwgIDIuNTQxNCwgIDIuNzQ0OCwgIDIuOTI2OSwKKyAgICAgMC4wOTY1LCAgMC4yMDI1LCAgMC4zMzk4LCAgMC40OTkwLCAgMC42OTM0LCAgMC45Mzg2LCAgMS4xNzMwLCAgMS4zNzY2LAorICAgICAxLjU3ODMsICAxLjc3ODMsICAxLjk3OTAsICAyLjE4MzEsICAyLjM2NzAsICAyLjU1NzgsICAyLjc2NDEsICAyLjk1MTYsCisgICAgIDAuMjEyNiwgIDAuMzY1MiwgIDAuNTU0NSwgIDAuNzE3MCwgIDAuODY3NCwgIDEuMDY0MCwgIDEuMjU1OCwgIDEuNDA2MSwKKyAgICAgMS41OTA0LCAgMS44MDk1LCAgMS45NzYwLCAgMi4xNTA1LCAgMi4zNTQ5LCAgMi41NTc1LCAgMi43MDIzLCAgMi44ODc3LAorICAgICAwLjE4MjcsICAwLjM0MjYsICAwLjQ4OTQsICAwLjY0ODgsICAwLjc5NjAsICAwLjk1MzUsICAxLjEyMTcsICAxLjI3OTgsCisgICAgIDEuNDU2NiwgIDEuNjQ1MywgIDEuODA0NCwgIDIuMDA0MiwgIDIuMjM3OSwgIDIuNDYxMSwgIDIuNjY5NywgIDIuODk2NiwKKyAgICAgMC4yMDM0LCAgMC4zODIyLCAgMC41MjMxLCAgMC42OTYwLCAgMC45MjAwLCAgMS4wMzk0LCAgMS4xNjE2LCAgMS4zNzcyLAorICAgICAxLjU0OTMsICAxLjczMzAsICAxLjk2NDYsICAyLjEyMzMsICAyLjMzMzQsICAyLjUzNjEsICAyLjcwODcsICAyLjk0NzAsCisgICAgIDAuMTA1MCwgIDAuMjA2MCwgIDAuMzcwNSwgIDAuNTk5OCwgIDAuODMzNywgIDEuMDU3NywgIDEuMjU1OSwgIDEuNDMyNywKKyAgICAgMS42MzM0LCAgMS44MTY1LCAgMS45ODUzLCAgMi4yMDU4LCAgMi40MDYzLCAgMi41ODE4LCAgMi43NjI1LCAgMi45NDU4LAorICAgICAwLjE0MTksICAwLjQwNTMsICAwLjY2NjAsICAwLjg5MTEsICAxLjA0MDUsICAxLjE1NDcsICAxLjI1MDYsICAxLjM5MjYsCisgICAgIDEuNTY2OSwgIDEuNzUyNywgIDEuOTY5NCwgIDIuMjA1NCwgIDIuMzg4OSwgIDIuNTc0MywgIDIuNzU4NiwgIDIuOTE3NCwKKyAgICAgMC4xNTE0LCAgMC4yODI1LCAgMC40MzA5LCAgMC41NzcyLCAgMC43NDcwLCAgMC45NzAzLCAgMS4xNDYyLCAgMS4zMzE2LAorICAgICAxLjUzMjEsICAxLjcyNTksICAxLjkyODIsICAyLjEyNjYsICAyLjMxMDYsICAyLjUwNjQsICAyLjcwNjcsICAyLjkwOTQsCisgICAgIDAuMTY5MywgIDAuMzE1NiwgIDAuNDg3OCwgIDAuNjYzNSwgIDAuODIwNiwgIDAuOTU2OSwgIDEuMTE1NCwgIDEuMzA2NCwKKyAgICAgMS41MTA5LCAgMS43MTg0LCAgMS45MTc5LCAgMi4xMDM2LCAgMi4yNzYzLCAgMi40ODIwLCAgMi42OTQ5LCAgMi45MTA1LAorICAgICAwLjE0MzIsICAwLjI3MTgsICAwLjQyNDEsICAwLjU1NjQsICAwLjY5MzksICAwLjkwMTEsICAxLjE1ODIsICAxLjM5NDgsCisgICAgIDEuNjE4MSwgIDEuODAyNCwgIDEuOTgxNCwgIDIuMTc0MCwgIDIuMzQ1OSwgIDIuNTQ1NiwgIDIuNzQ5MSwgIDIuOTMwNywKKyAgICAgMC4yMjk0LCAgMC4zODU3LCAgMC41NTkwLCAgMC43NDM0LCAgMC45MTg5LCAgMS4wOTQxLCAgMS4yNzQwLCAgMS40NDU2LAorICAgICAxLjYxNzgsICAxLjc5OTQsICAxLjk2ODksICAyLjE2NDQsICAyLjM1MjUsICAyLjUzODUsICAyLjc0NjgsICAyLjk0MDUsCisgICAgIDAuMTY2NywgIDAuMzEwOSwgIDAuNDYxMiwgIDAuNjAzMiwgIDAuNzM3NSwgIDAuODg2NiwgIDEuMDg0MCwgIDEuMzA1MywKKyAgICAgMS40OTgyLCAgMS43MDQ0LCAgMS45MTQ2LCAgMi4xMTE3LCAgMi4yOTQyLCAgMi40OTgzLCAgMi43MDg0LCAgMi45MTMyLAorICAgICAwLjE4MTAsICAwLjMyMDUsICAwLjQ2OTYsICAwLjYyMzEsICAwLjc2NDEsICAwLjk5NTksICAxLjI0MjcsICAxLjQzNjEsCisgICAgIDEuNTg4OSwgIDEuNzU0NCwgIDEuOTA4MywgIDIuMDczMywgIDIuMjQ1NywgIDIuNDQ2MSwgIDIuNjc5MywgIDIuOTA5OCwKKyAgICAgMC4xMTY0LCAgMC4zNzUzLCAgMC42MDY4LCAgMC43NTAzLCAgMS4wMTAwLCAgMS4yMTMxLCAgMS4zNzkzLCAgMS41MzAyLAorICAgICAxLjYzMDAsICAxLjc5NTAsICAxLjkwNTcsICAyLjEwMzEsICAyLjM4MzAsICAyLjU3NDUsICAyLjY5NDksICAyLjg3NzksCisgICAgIDAuMTU3MSwgIDAuNDM3OCwgIDAuNjczNSwgIDAuODMxMiwgIDAuODk0NCwgIDAuOTgxOCwgIDEuMTYyMiwgIDEuNDA5NCwKKyAgICAgMS42NDIzLCAgMS44MDY2LCAgMS45MjU4LCAgMi4xODM4LCAgMi40MzYzLCAgMi42Mjc5LCAgMi43MzU4LCAgMi44NzkwLAorICAgICAwLjEzOTgsICAwLjI2ODYsICAwLjQyNDgsICAwLjYxNTYsICAwLjc4NzAsICAxLjAwMzUsICAxLjIwMTIsICAxLjM2ODksCisgICAgIDEuNTM2MywgIDEuNzM5OCwgIDEuOTYwNCwgIDIuMTYxOSwgIDIuMzM0NSwgIDIuNTA5NywgIDIuNzI3MSwgIDIuOTM2OCwKKyAgICAgMC4xOTEzLCAgMC4zMzM4LCAgMC40OTg3LCAgMC42NDQ2LCAgMC43ODUyLCAgMS4wMTYzLCAgMS4xODg2LCAgMS4zNjEwLAorICAgICAxLjUzNzksICAxLjcyMzAsICAxLjg4ODAsICAyLjA4NjIsICAyLjI5NjAsICAyLjQ5MjgsICAyLjcxMjIsICAyLjkxNTEsCisgICAgIDAuMDkwOCwgIDAuMTc1MiwgIDAuMjg5OSwgIDAuNTM2NSwgIDAuNzc2MSwgIDEuMDEwMCwgIDEuMjEyNCwgIDEuNDA2MCwKKyAgICAgMS42MDE5LCAgMS44MDEwLCAgMS45Nzc0LCAgMi4xOTA1LCAgMi4zNzMzLCAgMi41NjIzLCAgMi43NjYwLCAgMi45NTY1LAorICAgICAwLjE3NzMsICAwLjMxNzksICAwLjQ5MjUsICAwLjY4NjQsICAwLjg0NTIsICAwLjk4OTcsICAxLjE4NjAsICAxLjM3MjIsCisgICAgIDEuNTUxNSwgIDEuNzY1OCwgIDEuOTgwMiwgIDIuMTgxOSwgIDIuMzYyMCwgIDIuNTQ0MiwgIDIuNzI1MCwgIDIuOTIyMCwKKyAgICAgMC4xMjg2LCAgMC4yMzQxLCAgMC4zNjg5LCAgMC41MzY0LCAgMC43MTc2LCAgMC45MzUwLCAgMS4xMDgzLCAgMS4yOTQzLAorICAgICAxLjQ5NzQsICAxLjcwNTksICAxLjkwNDcsICAyLjExNDUsICAyLjMyNDIsICAyLjUzNjEsICAyLjc0NTMsICAyLjkzMjksCisgICAgIDAuMjI3MywgIDAuMzgzNCwgIDAuNTU2NSwgIDAuNzE5MiwgIDAuODQzMSwgIDAuOTk2MiwgIDEuMTc2MywgIDEuMzU3MSwKKyAgICAgMS41Nzc0LCAgMS43NDE5LCAgMS45MjAyLCAgMi4xMTMxLCAgMi4yOTE5LCAgMi40ODk4LCAgMi42ODk1LCAgMi45MTgwLAorICAgICAwLjE3NzUsICAwLjMwNTgsICAwLjQyNzQsICAwLjYwMjMsICAwLjgxNTEsICAxLjA3MzQsICAxLjMyMTEsICAxLjUxNzgsCisgICAgIDEuNjcwNiwgIDEuODE1NCwgIDEuOTY4NiwgIDIuMTUzNywgIDIuMzQ2MSwgIDIuNTI3NiwgIDIuNzE4MSwgIDIuOTEyMSwKKyAgICAgMC4xNjUzLCAgMC40MzA0LCAgMC42MzYxLCAgMC43ODI0LCAgMC45MTgzLCAgMS4wNDUyLCAgMS4yMDcxLCAgMS40MDc3LAorICAgICAxLjYyMDYsICAxLjgyOTksICAyLjAwODksICAyLjE5NDgsICAyLjM5MDAsICAyLjU5ODIsICAyLjc4NDQsICAyLjk0ODcsCisgICAgIDAuMTQ5MiwgIDAuMjYwOSwgIDAuMzgyMCwgIDAuNTQ4NSwgIDAuNzI0MywgIDAuOTMxOSwgIDEuMTUzOCwgIDEuMzU3OSwKKyAgICAgMS41MjY2LCAgMS43MDAyLCAgMS44ODczLCAgMi4xMDE2LCAgMi4zMTc1LCAgMi41MjIxLCAgMi43MjQxLCAgMi45MjQzLAorICAgICAwLjIwNzQsICAwLjM3ODEsICAwLjUyMDksICAwLjY4NjksICAwLjg1NzcsICAwLjk4NzUsICAxLjE4NDksICAxLjM1NjgsCisgICAgIDEuNDkwNywgIDEuNzMzNSwgIDEuODkwMiwgIDIuMTIyNCwgIDIuMzA5OSwgIDIuNDkxOCwgIDIuNzAyMywgIDIuODc2NSwKKyAgICAgMC4xMzU5LCAgMC4yMjU0LCAgMC4zMjg2LCAgMC40NDMyLCAgMC42NTg2LCAgMC44OTY0LCAgMS4xMTI1LCAgMS4zNTIzLAorICAgICAxLjU2MjYsICAxLjc1NzksICAxLjk4NDYsICAyLjE5MDUsICAyLjM1NDgsICAyLjU1NDIsICAyLjc2NjMsICAyLjkzNDYsCisgICAgIDAuMTQzMCwgIDAuMjk2NiwgIDAuNDY4NSwgIDAuNjQ5MywgIDAuODMxNSwgIDEuMDMwNCwgIDEuMjIyMCwgIDEuNDA4MiwKKyAgICAgMS41OTk1LCAgMS43ODg4LCAgMS45Nzc0LCAgMi4xNzM3LCAgMi4zNjA3LCAgMi41NTc3LCAgMi43NTU4LCAgMi45NDA1LAorICAgICAwLjE0NzcsICAwLjI2OTQsICAwLjQwNTYsICAwLjU2MjYsICAwLjcwNTEsICAwLjg2NDcsICAxLjA0OTEsICAxLjI0ODgsCisgICAgIDEuNDgxNCwgIDEuNzA3MiwgIDEuOTE1MCwgIDIuMTE0NywgIDIuMzAzOCwgIDIuNTE0NCwgIDIuNzE4NCwgIDIuOTIwMiwKKyAgICAgMC4xNjkwLCAgMC4zMDMzLCAgMC40NTgwLCAgMC42Njg2LCAgMC44NTM2LCAgMS4wMjkzLCAgMS4yMTI0LCAgMS4zOTk4LAorICAgICAxLjU3MTgsICAxLjc2MDcsICAxLjk1ODAsICAyLjEyNDUsICAyLjI5NzEsICAyLjQ3NjIsICAyLjY4OTYsICAyLjkxNzcsCisgICAgIDAuMTA5MiwgIDAuMjc3OSwgIDAuNDg1MywgIDAuNjg4MCwgIDAuOTAxMSwgIDEuMDk1MywgIDEuMjc1MiwgIDEuNDYxOCwKKyAgICAgMS42NjIzLCAgMS44NDg0LCAgMi4wMjY0LCAgMi4yMTUyLCAgMi40MDE3LCAgMi41ODM1LCAgMi43NjcxLCAgMi45NDM2LAorICAgICAwLjE0OTcsICAwLjM2MzcsICAwLjYwMTQsICAwLjgwMzIsICAwLjk5NjMsICAxLjE4MzUsICAxLjM3NDEsICAxLjU2OTgsCisgICAgIDEuNzM4MiwgIDEuOTA5NCwgIDIuMDcxMCwgIDIuMjM5MiwgIDIuNDA4MiwgIDIuNTkyNiwgIDIuNzc2MiwgIDIuOTUzNiwKKyAgICAgMC4xNDM0LCAgMC4yNDkyLCAgMC4zOTY2LCAgMC41OTM0LCAgMC44MDMzLCAgMS4wNjU3LCAgMS4yNzk2LCAgMS40Mjc2LAorICAgICAxLjU3NDUsICAxLjc4MzMsICAxLjkyODgsICAyLjEyNDcsICAyLjM1NDMsICAyLjU0MTIsICAyLjcwNDksICAyLjg4NzIsCisgICAgIDAuMTYxMiwgIDAuMjkyNiwgIDAuNDU3NCwgIDAuNjM4NywgIDAuODI2NSwgIDEuMDE4MCwgIDEuMTgwOCwgIDEuMzUyNiwKKyAgICAgMS41NTY0LCAgMS43NTM2LCAgMS45MTg3LCAgMi4xMTkyLCAgMi4zMTQ5LCAgMi41MDA2LCAgMi43MTAxLCAgMi45MjE3LAorICAgICAwLjA4MjgsICAwLjE4NjMsICAwLjMyMzUsICAwLjUwNTAsICAwLjcyNTAsICAwLjk4NjcsICAxLjIwOTMsICAxLjM5NDEsCisgICAgIDEuNTk4MCwgIDEuNzkzMiwgIDEuOTgwOSwgIDIuMTg5NCwgIDIuMzkxOCwgIDIuNTc3MywgIDIuNzU0MCwgIDIuOTMyOSwKKyAgICAgMC4yMDAxLCAgMC4zNjU1LCAgMC41MjkwLCAgMC42NzYxLCAgMC44MDI3LCAgMC45OTcyLCAgMS4yMDkwLCAgMS40MjU1LAorICAgICAxLjYwODUsICAxLjc4MjUsICAxLjk4MDQsICAyLjE2ODEsICAyLjM0NTcsICAyLjUzMjUsICAyLjczMTksICAyLjkxOTYsCisgICAgIDAuMTUwNSwgIDAuMjc2NywgIDAuNDI1NCwgIDAuNjA1NCwgIDAuNzgyMSwgIDAuOTU2NywgIDEuMTI5NCwgIDEuMzA4MCwKKyAgICAgMS40OTg0LCAgMS42OTU0LCAgMS44NjY2LCAgMi4wNzM2LCAgMi4yODc1LCAgMi40OTY5LCAgMi43MDcyLCAgMi45MTYzLAorICAgICAwLjE1ODksICAwLjQxNTEsICAwLjU3NDksICAwLjY2NTEsICAwLjgwNjEsICAxLjA0NzAsICAxLjI2MTYsICAxLjM2OTAsCisgICAgIDEuNDk4NSwgIDEuNzgwOCwgIDEuOTgyNSwgIDIuMTA2OCwgIDIuMjc1MSwgIDIuNTQ0OCwgIDIuNzEzMywgIDIuODY4OSwKKyAgICAgMC4wOTE2LCAgMC4xODQ2LCAgMC4zNzg4LCAgMC42MzI5LCAgMC44Nzc0LCAgMS4wNjg3LCAgMS4yNjUzLCAgMS40NTYxLAorICAgICAxLjY1NzMsICAxLjg0NDksICAyLjA0MDIsICAyLjIyNTQsICAyLjM5NjgsICAyLjU4NjEsICAyLjc3OTIsICAyLjk1MDgsCisgICAgIDAuMjI4MiwgIDAuNDE1OSwgIDAuNTgzNCwgIDAuNjg5OSwgIDAuODEwOCwgIDEuMDMyMSwgIDEuMjc5NSwgIDEuNTI2MiwKKyAgICAgMS42OTM2LCAgMS44NDY5LCAgMi4wOTIyLCAgMi4yNjA3LCAgMi4zNzk1LCAgMi41MzAxLCAgMi43Mzg2LCAgMi45NTMwLAorICAgICAwLjE2NTEsICAwLjMwMDQsICAwLjQ1NTUsICAwLjYxNzksICAwLjc4OTEsICAwLjk1ODQsICAxLjEzNzIsICAxLjM3MDcsCisgICAgIDEuNTk1MSwgIDEuNzg4MCwgIDEuOTQzNCwgIDIuMTQ2NSwgIDIuMzMxMSwgIDIuNTA4MSwgIDIuNjk3NywgIDIuODk3MCwKKyAgICAgMC4xMjc5LCAgMC4zODI4LCAgMC42MzMwLCAgMC44MzIzLCAgMC45NjUyLCAgMS4xMTc1LCAgMS4yMzE5LCAgMS4zNTExLAorICAgICAxLjUxMTUsICAxLjYzOTIsICAxLjc4MzUsICAxLjk1NTgsICAyLjIwMDgsICAyLjQ2MzUsICAyLjY5MTAsICAyLjkwNTgsCisgICAgIDAuMTE5MywgIDAuMjE4NSwgIDAuMzUyMSwgIDAuNTMxMSwgIDAuNzM3OCwgIDAuOTIzOSwgIDEuMTEwNSwgIDEuMzIxNywKKyAgICAgMS41MzYyLCAgMS43NTA0LCAgMS45NTM2LCAgMi4xNjI3LCAgMi4zNTYwLCAgMi41NTA2LCAgMi43NTQ4LCAgMi45NDUzLAorICAgICAwLjE4MDYsICAwLjM0MzIsICAwLjQ5ODEsICAwLjY5NDgsICAwLjg5MjgsICAxLjA1MjcsICAxLjI0NjcsICAxLjQxNDAsCisgICAgIDEuNjMyNiwgIDEuNzk1MCwgIDEuOTkzNSwgIDIuMTk2OSwgIDIuMzUxMiwgIDIuNTY4MiwgIDIuNzQ0NSwgIDIuOTI3NywKKyAgICAgMC4xODQ2LCAgMC4zMTEyLCAgMC40NTY4LCAgMC41ODkxLCAgMC43MzE3LCAgMC44NDkzLCAgMS4wMjA0LCAgMS4yMDIyLAorICAgICAxLjM2ODgsICAxLjYwMjAsICAxLjg0MjgsICAyLjA3MTAsICAyLjI3MjUsICAyLjQ4NzksICAyLjcwNTcsICAyLjkxNjAsCisgICAgIDAuMDg4MCwgIDAuMjUxNCwgIDAuNTMzMiwgIDAuNzI3MiwgIDAuODkwNiwgIDEuMTM1NCwgIDEuMzE5OSwgIDEuNDk0MSwKKyAgICAgMS42MDEwLCAgMS43MTUxLCAgMS44NzEyLCAgMi4wNjQzLCAgMi4yNzU1LCAgMi41Mzc1LCAgMi43MDU0LCAgMi44ODkxLAorICAgICAwLjEzODIsICAwLjI4MzMsICAwLjQ2NTgsICAwLjY4OTcsICAwLjkwNzEsICAxLjA3MTYsICAxLjI0NjksICAxLjQxNDMsCisgICAgIDEuNTkxMCwgIDEuNzk0NywgIDEuOTgwNSwgIDIuMTU4MSwgIDIuMzMzOCwgIDIuNTIxNSwgIDIuNzI5MiwgIDIuOTIxMSwKKyAgICAgMC4xMDYxLCAgMC4zNDk0LCAgMC42MzI3LCAgMC44NTcwLCAgMC45NzQ4LCAgMS4wNTYwLCAgMS4xNTI5LCAgMS4zMjUwLAorICAgICAxLjYwMzIsICAxLjgzNDAsICAxLjk3MTEsICAyLjExNTcsICAyLjMwMTEsICAyLjU0NjQsICAyLjgwNzgsICAyLjk4MDMsCisgICAgIDAuMTYwMywgIDAuMjgzOSwgIDAuNDMwNywgIDAuNTk4MCwgIDAuNzk4MCwgIDEuMDM5OSwgIDEuMTk3MSwgIDEuMzUyNCwKKyAgICAgMS41NzE1LCAgMS43ODM4LCAgMS45NDY4LCAgMi4xNDk4LCAgMi4zNjI3LCAgMi41NTE0LCAgMi43MzI3LCAgMi45MTQ4LAorICAgICAwLjE2OTEsICAwLjMxMTcsICAwLjQ3OTYsICAwLjY4OTUsICAwLjg3MzIsICAxLjAxNjQsICAxLjE5MTYsICAxLjM3MDcsCisgICAgIDEuNTM4NCwgIDEuNzIwMiwgIDEuODg1NywgIDIuMDY3MiwgIDIuMjQ4NywgIDIuNDU5MywgIDIuNjc4OSwgIDIuODk0MCwKKyAgICAgMC4wOTY1LCAgMC4xNzAyLCAgMC4zMTkxLCAgMC41NzIxLCAgMC44MTAwLCAgMS4wMjQxLCAgMS4yMjcyLCAgMS40MTk2LAorICAgICAxLjYwOTMsICAxLjgwNTcsICAxLjk4ODQsICAyLjIwMzcsICAyLjM5MjUsICAyLjU4MDUsICAyLjc1NzgsICAyLjkzNjYsCisgICAgIDAuMTk1MCwgIDAuMzUxOSwgIDAuNTI3MiwgIDAuNjk3MywgIDAuODczMiwgIDEuMDY1NiwgIDEuMjExMiwgIDEuMzk1OSwKKyAgICAgMS42MTE2LCAgMS43ODIxLCAgMS45NDQ1LCAgMi4xNTkyLCAgMi4zMzQ4LCAgMi41MTQyLCAgMi43NDQwLCAgMi45Mjk3LAorICAgICAwLjEzODgsICAwLjI1NTcsICAwLjQxMjAsICAwLjU3MjcsICAwLjczNTQsICAwLjkxOTYsICAxLjA5ODUsICAxLjI4MDUsCisgICAgIDEuNDY0MywgIDEuNjUzNSwgIDEuODM0MCwgIDIuMDU0NiwgIDIuMjc1OCwgIDIuNDc3OCwgIDIuNjkyMSwgIDIuOTEyMiwKKyAgICAgMC4xODIzLCAgMC4zMzM2LCAgMC40OTU3LCAgMC42NzcxLCAgMC44NTYzLCAgMS4wMTM3LCAgMS4yMjk5LCAgMS4zODQ5LAorICAgICAxLjU3MTgsICAxLjc2NjcsICAxLjkxOTMsICAyLjEzMjYsICAyLjMxMzUsICAyLjUyNjgsICAyLjcxMzMsICAyLjg5OTgsCisgICAgIDAuMDc5MCwgIDAuMTkwMSwgIDAuNDA4MywgIDAuNjQ1NiwgIDAuODQ2MywgIDEuMDI4NSwgIDEuMjI5NywgIDEuNDE4MSwKKyAgICAgMS42MTU5LCAgMS44MDU2LCAgMS45OTcxLCAgMi4xOTEyLCAgMi4zODE2LCAgMi41NzQ2LCAgMi43NjkyLCAgMi45NDk3LAorICAgICAwLjAwNDksICAwLjAxMTYsICAwLjAwNDUsICAwLjAwMzksIC0wLjAwMTAsIC0wLjAxMjIsIC0wLjAyMDUsIC0wLjAwMzQsCisgICAgLTAuMDE0MCwgLTAuMDA0MSwgIDAuMDE5MSwgLTAuMDMyMiwgIDAuMDAwMiwgLTAuMDEyNCwgLTAuMDI2OSwgIDAuMDA1OSwKKyAgICAgMC4wNTg2LCAgMC4wMzM5LCAtMC4wMzg5LCAtMC4wMzE5LCAtMC4wMDc5LCAtMC4wMjA1LCAtMC4wMzYzLCAtMC4wMjExLAorICAgICAwLjAyNDEsICAwLjA1OTUsICAwLjA0NjksICAwLjAyODMsICAwLjAxNzYsIC0wLjAxODMsIC0wLjAxNzMsIC0wLjAwMDQsCisgICAgIDAuMDAyNCwgIDAuMDE0NSwgIDAuMDUzNCwgIDAuMDE5NywgLTAuMDA2NSwgLTAuMDA2NywgIDAuMDEzMywgIDAuMDM1OCwKKyAgICAtMC4wMTA0LCAtMC4wMzg2LCAtMC4wMTA5LCAtMC4wMDc4LCAgMC4wMjc1LCAgMC4wNTY1LCAgMC4wMjUxLCAtMC4wMDI3LAorICAgIC0wLjAwNTMsICAwLjAxNzEsICAwLjAwODgsICAwLjA0OTUsICAwLjAxNDEsICAwLjAwMzksIC0wLjA0NDUsIC0wLjA0MjYsCisgICAgLTAuMDE4NCwgLTAuMDI4MCwgLTAuMDIyMywgIDAuMDAzOSwgLTAuMDE3MSwgLTAuMDYwNiwgLTAuMDc4NiwgLTAuMDQzMCwKKyAgICAgMC4wNTQ0LCAgMC4wNTk1LCAgMC4wMzIwLCAtMC4wMDEyLCAgMC4wMTA4LCAgMC4wMTg1LCAgMC4wMDY2LCAgMC4wNDA4LAorICAgICAwLjA1NTIsIC0wLjAwNzMsIC0wLjAyNDcsIC0wLjA0ODAsIC0wLjAyODgsICAwLjAxODYsICAwLjAyMTIsIC0wLjAwMTMsCisgICAgIDAuMDQwMywgIDAuMDU5OCwgIDAuMDY5MCwgIDAuMDUxNiwgLTAuMDI5OCwgLTAuMDE3NywgIDAuMDI3OCwgIDAuMDE2OCwKKyAgICAtMC4wMTA2LCAgMC4wMjUxLCAgMC4wMzg2LCAgMC4wMzMxLCAtMC4wMDUyLCAgMC4wMTMzLCAgMC4wMjkxLCAtMC4wMTU4LAorICAgIC0wLjAzMjksIC0wLjAzNjcsICAwLjAyODcsICAwLjA0NjIsIC0wLjAxNzYsICAwLjAwNDksICAwLjAyNDIsIC0wLjAwMzQsCisgICAgIDAuMDEzNSwgIDAuMDA4NiwgLTAuMDE0OSwgIDAuMDI0MSwgIDAuMDUwNCwgIDAuMDI0NiwgLTAuMDI3MywgLTAuMDM2OSwKKyAgICAtMC4wMTA4LCAtMC4wNDQ5LCAtMC4wNjI1LCAtMC4wNDE0LCAtMC4wMjkyLCAtMC4wNTcxLCAtMC4wNDQwLCAtMC4wMDg4LAorICAgICAwLjAwOTgsICAwLjAwMDksIC0wLjAwMDQsICAwLjAwMDcsIC0wLjAzMTQsIC0wLjAyMDgsIC0wLjAxMzgsIC0wLjAyNzcsCisgICAgLTAuMDA0NCwgIDAuMDUyMiwgIDAuMDMxNSwgLTAuMDI3MCwgLTAuMDI3NywgLTAuMDI1NiwgLTAuMDEwMywgLTAuMDIwMSwKKyAgICAtMC4wMjg3LCAtMC4wMjc5LCAtMC4wMTgyLCAgMC4wNDcyLCAgMC4wNjEzLCAgMC4wNDUwLCAgMC4wNDEzLCAgMC4wMzMzLAorICAgICAwLjA0NDQsICAwLjAyMjMsICAwLjAwNjEsICAwLjAzMTYsICAwLjAzMjEsICAwLjA1MDEsICAwLjA0NjAsICAwLjAyNTAsCisgICAgIDAuMDIyNywgIDAuMDIzNSwgIDAuMDA5OSwgIDAuMDE4NSwgLTAuMDM0NywgLTAuMDY4NCwgLTAuMDE4OSwgIDAuMDI0MiwKKyAgICAtMC4wMTkwLCAtMC4wMjczLCAtMC4wMDEyLCAtMC4wMjUzLCAgMC4wMjkzLCAtMC4wMjMxLCAtMC4wMjE5LCAtMC4wMDEwLAorICAgICAwLjAxNTMsICAwLjAxMjgsIC0wLjAxNjYsIC0wLjA0MzUsIC0wLjA0MTcsIC0wLjAxMjEsIC0wLjAzNTEsIC0wLjAzOTAsCisgICAgIDAuMDA3NywgLTAuMDI3OCwgLTAuMDM1NSwgIDAuMDA5MiwgLTAuMDA2MywgIDAuMDAwNSwgIDAuMDIxNiwgIDAuMDQ2MSwKKyAgICAgMC4wNTM4LCAgMC4wNDUxLCAgMC4wMjk4LCAtMC4wMTMwLCAgMC4wMDU4LCAgMC4wMjA2LCAgMC4wNDcxLCAgMC4wNDk5LAorICAgICAwLjAyODAsICAwLjAwODYsIC0wLjAwMDcsIC0wLjAzMTcsICAwLjAyNTksICAwLjAxNzYsICAwLjAwNDMsICAwLjAyMTIsCisgICAgIDAuMDEzOCwgIDAuMDEwNiwgIDAuMDIyMCwgLTAuMDAyNSwgIDAuMDA1MCwgIDAuMDEyMiwgLTAuMDA1MSwgLTAuMDA4NiwKKyAgICAtMC4wNDcyLCAtMC4wMDA1LCAgMC4wMTkzLCAgMC4wMDMyLCAgMC4wMjQ2LCAgMC4wMjIyLCAgMC4wMDkwLCAtMC4wMzIwLAorICAgIC0wLjA3MTMsIC0wLjA1MjYsIC0wLjAxNTEsIC0wLjA0NDAsIC0wLjA2NDgsIC0wLjA0NjYsIC0wLjAwOTIsICAwLjAxMTUsCisgICAgLTAuMDEyOSwgIDAuMDA1MywgLTAuMDM0NCwgLTAuMDM4NSwgIDAuMDM5MiwgIDAuMDU5OSwgIDAuMDQxNCwgIDAuMDE2NSwKKyAgICAtMC4wMDk4LCAtMC4wMzIwLCAtMC4wMjYxLCAtMC4wMDU1LCAtMC4wMTM5LCAtMC4wMTEwLCAgMC4wMDg0LCAgMC4wMTcyLAorICAgIC0wLjA0OTIsIC0wLjA1MzcsIC0wLjAzMjAsIC0wLjAwMzYsICAwLjAyNjUsICAwLjAzODUsICAwLjAwNjQsIC0wLjAyODAsCisgICAgLTAuMDIzMCwgIDAuMDEzNCwgIDAuMDI0MSwgIDAuMDEwNiwgIDAuMDM4NywgIDAuMDEwNSwgIDAuMDA2OCwgIDAuMDI2MCwKKyAgICAgMC40OTQwLCAgMC40OTExLCAgMC40ODQ5LCAgMC40ODIwLCAgMC40ODM3LCAgMC40ODM5LCAgMC40ODI0LCAgMC40Nzk5LAorICAgICAwLjQ4MTIsICAwLjQ3ODIsICAwLjQ3ODgsICAwLjQ3MTEsICAwLjQ3MDYsICAwLjQ2NzEsICAwLjQ2MDEsICAwLjQ1NzgsCisgICAgIDAuMjk1NCwgIDAuMjEyMSwgIDAuMTg1OSwgIDAuMTk1OCwgIDAuMTQ3NCwgIDAuMTA4NiwgIDAuMTM1MSwgIDAuMTM2MiwKKyAgICAgMC4xNDg2LCAgMC4xMzQyLCAgMC4xMjE1LCAgMC4xNDIzLCAgMC4xNjM0LCAgMC4xNTg4LCAgMC4xNTM5LCAgMC4xODU3LAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGxzcDExc1tdID0geworICAgICAwLjExMDMsICAwLjM4NjIsICAwLjY4NjMsICAwLjg0NDcsICAwLjkyMzEsICAxLjAyNjEsICAxLjEyNDgsICAxLjQwNTcsCisgICAgIDEuNjYyMSwgIDEuODAxMCwgIDEuODY5MiwgIDIuMDcwNCwgIDIuMzQ5MCwgIDIuNjA2MCwgIDIuNzUzOSwgIDIuODk3NywKKyAgICAgMC4xMjczLCAgMC4yNDA3LCAgMC4zODEyLCAgMC42MDA0LCAgMC43NzY3LCAgMC45MzgzLCAgMS4xMzQ0LCAgMS4zMzUxLAorICAgICAxLjUyMzMsICAxLjcyNjIsICAxLjk0NjYsICAyLjE3MzksICAyLjM0OTUsICAyLjUxNjIsICAyLjcxNjQsICAyLjkyMDIsCisgICAgIDAuMjAxMCwgIDAuMzMzMCwgIDAuNDQ4OCwgIDAuNjQ2NSwgIDAuODA0NiwgIDAuOTg4OSwgIDEuMTQ3OSwgIDEuMjk2NCwKKyAgICAgMS40NzcwLCAgMS42NjA2LCAgMS44Nzg5LCAgMi4xMTU1LCAgMi4zMjg3LCAgMi41MTk5LCAgMi43MTAxLCAgMi45MTE5LAorICAgICAwLjExNjgsICAwLjIxOTcsICAwLjMyNzksICAwLjQ2OTEsICAwLjYyNjgsICAwLjgyNTEsICAxLjA1MzMsICAxLjI3MTQsCisgICAgIDEuNDcxMiwgIDEuNjc2MiwgIDEuODgzMSwgIDIuMTExNCwgIDIuMzIzMCwgIDIuNTI5NywgIDIuNzM2NSwgIDIuOTI3MCwKKyAgICAgMC4xNDA1LCAgMC4zMTA5LCAgMC40OTg2LCAgMC42ODkxLCAgMC44NjM0LCAgMS4wNTgzLCAgMS4yNTk0LCAgMS40MzQ5LAorICAgICAxLjYyMzIsICAxLjgxMTYsICAxLjk5MDUsICAyLjE5MzUsICAyLjM3OTksICAyLjU2NTYsICAyLjc2NjEsICAyLjk0ODYsCisgICAgIDAuMTcwMywgIDAuMzA1NywgIDAuNDQwMywgIDAuNTIyNSwgIDAuNTk2OSwgIDAuODExMCwgIDEuMDcyOSwgIDEuMzIxNSwKKyAgICAgMS41NDA3LCAgMS43MzgxLCAgMS45NDc3LCAgMi4xNjgwLCAgMi4zNTg2LCAgMi41NjEyLCAgMi43NjMwLCAgMi45NDEwLAorICAgICAwLjExMjgsICAwLjI2MjgsICAwLjQ1MjMsICAwLjY0OTUsICAwLjgxNzYsICAwLjk4MTYsICAxLjE3NDYsICAxLjM3MTAsCisgICAgIDEuNTU2OCwgIDEuNzUxOCwgIDEuOTQ5NywgIDIuMTQ1MiwgIDIuMzM0NiwgIDIuNTM4OSwgIDIuNzM2MiwgIDIuOTI2NCwKKyAgICAgMC4xODA5LCAgMC4zMjg3LCAgMC41MjA1LCAgMC43MjY0LCAgMC45Mjk4LCAgMS4xMjE3LCAgMS4yOTcwLCAgMS40ODk0LAorICAgICAxLjY4NzQsICAxLjg0OTMsICAyLjA1NzYsICAyLjIzODIsICAyLjQwOTcsICAyLjYwNDEsICAyLjc3OTYsICAyLjkzODksCisgICAgIDAuMjUwMiwgIDAuNDcwOSwgIDAuNjg5MiwgIDAuODM0NiwgIDAuOTIwOSwgIDEuMDQ1NSwgIDEuMjM5OSwgIDEuNDYxNiwKKyAgICAgMS42NDYzLCAgMS44MzgwLCAgMi4wNDc1LCAgMi4yMzk3LCAgMi40NjY1LCAgMi42NTUwLCAgMi43NzAxLCAgMi44ODk1LAorICAgICAwLjEwNDAsICAwLjIzNDAsICAwLjM5NjQsICAwLjU3NDAsICAwLjc3NjQsICAwLjk5NDEsICAxLjIwMDAsICAxLjQwMTQsCisgICAgIDEuNjAyNCwgIDEuNzk3NCwgIDEuOTkzOSwgIDIuMTk1OSwgIDIuMzc4MywgIDIuNTY2MywgIDIuNzYxMywgIDIuOTQ4NCwKKyAgICAgMC4xOTEyLCAgMC4zMzkzLCAgMC40NzQzLCAgMC42MzEzLCAgMC44MDE0LCAgMC45ODc5LCAgMS4xODU1LCAgMS4zOTIyLAorICAgICAxLjU2NzgsICAxLjcyODksICAxLjkyNzEsICAyLjExNjUsICAyLjMwODksICAyLjU0MTQsICAyLjc0NDgsICAyLjkyNjksCisgICAgIDAuMDk2NSwgIDAuMjAyNSwgIDAuMzM5OCwgIDAuNDk5MCwgIDAuNjkzNCwgIDAuOTM4NiwgIDEuMTczMCwgIDEuMzc2NiwKKyAgICAgMS41NzgzLCAgMS43NzgzLCAgMS45NzkwLCAgMi4xODMxLCAgMi4zNjcwLCAgMi41NTc4LCAgMi43NjQxLCAgMi45NTE2LAorICAgICAwLjIxMjYsICAwLjM2NTIsICAwLjU1NDUsICAwLjcxNzAsICAwLjg2NzQsICAxLjA2NDAsICAxLjI1NTgsICAxLjQwNjEsCisgICAgIDEuNTkwNCwgIDEuODA5NSwgIDEuOTc2MCwgIDIuMTUwNSwgIDIuMzU0OSwgIDIuNTU3NSwgIDIuNzAyMywgIDIuODg3NywKKyAgICAgMC4xODI3LCAgMC4zNDI2LCAgMC40ODk0LCAgMC42NDg4LCAgMC43OTYwLCAgMC45NTM1LCAgMS4xMjE3LCAgMS4yNzk4LAorICAgICAxLjQ1NjYsICAxLjY0NTMsICAxLjgwNDQsICAyLjAwNDIsICAyLjIzNzksICAyLjQ2MTEsICAyLjY2OTcsICAyLjg5NjYsCisgICAgIDAuMjAzNCwgIDAuMzgyMiwgIDAuNTIzMSwgIDAuNjk2MCwgIDAuOTIwMCwgIDEuMDM5NCwgIDEuMTYxNiwgIDEuMzc3MiwKKyAgICAgMS41NDkzLCAgMS43MzMwLCAgMS45NjQ2LCAgMi4xMjMzLCAgMi4zMzM0LCAgMi41MzYxLCAgMi43MDg3LCAgMi45NDcwLAorICAgICAwLjEwNTAsICAwLjIwNjAsICAwLjM3MDUsICAwLjU5OTgsICAwLjgzMzcsICAxLjA1NzcsICAxLjI1NTksICAxLjQzMjcsCisgICAgIDEuNjMzNCwgIDEuODE2NSwgIDEuOTg1MywgIDIuMjA1OCwgIDIuNDA2MywgIDIuNTgxOCwgIDIuNzYyNSwgIDIuOTQ1OCwKKyAgICAgMC4xNDE5LCAgMC40MDUzLCAgMC42NjYwLCAgMC44OTExLCAgMS4wNDA1LCAgMS4xNTQ3LCAgMS4yNTA2LCAgMS4zOTI2LAorICAgICAxLjU2NjksICAxLjc1MjcsICAxLjk2OTQsICAyLjIwNTQsICAyLjM4ODksICAyLjU3NDMsICAyLjc1ODYsICAyLjkxNzQsCisgICAgIDAuMTUxNCwgIDAuMjgyNSwgIDAuNDMwOSwgIDAuNTc3MiwgIDAuNzQ3MCwgIDAuOTcwMywgIDEuMTQ2MiwgIDEuMzMxNiwKKyAgICAgMS41MzIxLCAgMS43MjU5LCAgMS45MjgyLCAgMi4xMjY2LCAgMi4zMTA2LCAgMi41MDY0LCAgMi43MDY3LCAgMi45MDk0LAorICAgICAwLjE2OTMsICAwLjMxNTYsICAwLjQ4NzgsICAwLjY2MzUsICAwLjgyMDYsICAwLjk1NjksICAxLjExNTQsICAxLjMwNjQsCisgICAgIDEuNTEwOSwgIDEuNzE4NCwgIDEuOTE3OSwgIDIuMTAzNiwgIDIuMjc2MywgIDIuNDgyMCwgIDIuNjk0OSwgIDIuOTEwNSwKKyAgICAgMC4xNDMyLCAgMC4yNzE4LCAgMC40MjQxLCAgMC41NTY0LCAgMC42OTM5LCAgMC45MDExLCAgMS4xNTgyLCAgMS4zOTQ4LAorICAgICAxLjYxODEsICAxLjgwMjQsICAxLjk4MTQsICAyLjE3NDAsICAyLjM0NTksICAyLjU0NTYsICAyLjc0OTEsICAyLjkzMDcsCisgICAgIDAuMjI5NCwgIDAuMzg1NywgIDAuNTU5MCwgIDAuNzQzNCwgIDAuOTE4OSwgIDEuMDk0MSwgIDEuMjc0MCwgIDEuNDQ1NiwKKyAgICAgMS42MTc4LCAgMS43OTk0LCAgMS45Njg5LCAgMi4xNjQ0LCAgMi4zNTI1LCAgMi41Mzg1LCAgMi43NDY4LCAgMi45NDA1LAorICAgICAwLjE2NjcsICAwLjMxMDksICAwLjQ2MTIsICAwLjYwMzIsICAwLjczNzUsICAwLjg4NjYsICAxLjA4NDAsICAxLjMwNTMsCisgICAgIDEuNDk4MiwgIDEuNzA0NCwgIDEuOTE0NiwgIDIuMTExNywgIDIuMjk0MiwgIDIuNDk4MywgIDIuNzA4NCwgIDIuOTEzMiwKKyAgICAgMC4xODEwLCAgMC4zMjA1LCAgMC40Njk2LCAgMC42MjMxLCAgMC43NjQxLCAgMC45OTU5LCAgMS4yNDI3LCAgMS40MzYxLAorICAgICAxLjU4ODksICAxLjc1NDQsICAxLjkwODMsICAyLjA3MzMsICAyLjI0NTcsICAyLjQ0NjEsICAyLjY3OTMsICAyLjkwOTgsCisgICAgIDAuMTE2NCwgIDAuMzc1MywgIDAuNjA2OCwgIDAuNzUwMywgIDEuMDEwMCwgIDEuMjEzMSwgIDEuMzc5MywgIDEuNTMwMiwKKyAgICAgMS42MzAwLCAgMS43OTUwLCAgMS45MDU3LCAgMi4xMDMxLCAgMi4zODMwLCAgMi41NzQ1LCAgMi42OTQ5LCAgMi44Nzc5LAorICAgICAwLjE1NzEsICAwLjQzNzgsICAwLjY3MzUsICAwLjgzMTIsICAwLjg5NDQsICAwLjk4MTgsICAxLjE2MjIsICAxLjQwOTQsCisgICAgIDEuNjQyMywgIDEuODA2NiwgIDEuOTI1OCwgIDIuMTgzOCwgIDIuNDM2MywgIDIuNjI3OSwgIDIuNzM1OCwgIDIuODc5MCwKKyAgICAgMC4xMzk4LCAgMC4yNjg2LCAgMC40MjQ4LCAgMC42MTU2LCAgMC43ODcwLCAgMS4wMDM1LCAgMS4yMDEyLCAgMS4zNjg5LAorICAgICAxLjUzNjMsICAxLjczOTgsICAxLjk2MDQsICAyLjE2MTksICAyLjMzNDUsICAyLjUwOTcsICAyLjcyNzEsICAyLjkzNjgsCisgICAgIDAuMTkxMywgIDAuMzMzOCwgIDAuNDk4NywgIDAuNjQ0NiwgIDAuNzg1MiwgIDEuMDE2MywgIDEuMTg4NiwgIDEuMzYxMCwKKyAgICAgMS41Mzc5LCAgMS43MjMwLCAgMS44ODgwLCAgMi4wODYyLCAgMi4yOTYwLCAgMi40OTI4LCAgMi43MTIyLCAgMi45MTUxLAorICAgICAwLjA5MDgsICAwLjE3NTIsICAwLjI4OTksICAwLjUzNjUsICAwLjc3NjEsICAxLjAxMDAsICAxLjIxMjQsICAxLjQwNjAsCisgICAgIDEuNjAxOSwgIDEuODAxMCwgIDEuOTc3NCwgIDIuMTkwNSwgIDIuMzczMywgIDIuNTYyMywgIDIuNzY2MCwgIDIuOTU2NSwKKyAgICAgMC4xNzczLCAgMC4zMTc5LCAgMC40OTI1LCAgMC42ODY0LCAgMC44NDUyLCAgMC45ODk3LCAgMS4xODYwLCAgMS4zNzIyLAorICAgICAxLjU1MTUsICAxLjc2NTgsICAxLjk4MDIsICAyLjE4MTksICAyLjM2MjAsICAyLjU0NDIsICAyLjcyNTAsICAyLjkyMjAsCisgICAgIDAuMTI4NiwgIDAuMjM0MSwgIDAuMzY4OSwgIDAuNTM2NCwgIDAuNzE3NiwgIDAuOTM1MCwgIDEuMTA4MywgIDEuMjk0MywKKyAgICAgMS40OTc0LCAgMS43MDU5LCAgMS45MDQ3LCAgMi4xMTQ1LCAgMi4zMjQyLCAgMi41MzYxLCAgMi43NDUzLCAgMi45MzI5LAorICAgICAwLjIyNzMsICAwLjM4MzQsICAwLjU1NjUsICAwLjcxOTIsICAwLjg0MzEsICAwLjk5NjIsICAxLjE3NjMsICAxLjM1NzEsCisgICAgIDEuNTc3NCwgIDEuNzQxOSwgIDEuOTIwMiwgIDIuMTEzMSwgIDIuMjkxOSwgIDIuNDg5OCwgIDIuNjg5NSwgIDIuOTE4MCwKKyAgICAgMC4xNzc1LCAgMC4zMDU4LCAgMC40Mjc0LCAgMC42MDIzLCAgMC44MTUxLCAgMS4wNzM0LCAgMS4zMjExLCAgMS41MTc4LAorICAgICAxLjY3MDYsICAxLjgxNTQsICAxLjk2ODYsICAyLjE1MzcsICAyLjM0NjEsICAyLjUyNzYsICAyLjcxODEsICAyLjkxMjEsCisgICAgIDAuMTY1MywgIDAuNDMwNCwgIDAuNjM2MSwgIDAuNzgyNCwgIDAuOTE4MywgIDEuMDQ1MiwgIDEuMjA3MSwgIDEuNDA3NywKKyAgICAgMS42MjA2LCAgMS44Mjk5LCAgMi4wMDg5LCAgMi4xOTQ4LCAgMi4zOTAwLCAgMi41OTgyLCAgMi43ODQ0LCAgMi45NDg3LAorICAgICAwLjE0OTIsICAwLjI2MDksICAwLjM4MjAsICAwLjU0ODUsICAwLjcyNDMsICAwLjkzMTksICAxLjE1MzgsICAxLjM1NzksCisgICAgIDEuNTI2NiwgIDEuNzAwMiwgIDEuODg3MywgIDIuMTAxNiwgIDIuMzE3NSwgIDIuNTIyMSwgIDIuNzI0MSwgIDIuOTI0MywKKyAgICAgMC4yMDc0LCAgMC4zNzgxLCAgMC41MjA5LCAgMC42ODY5LCAgMC44NTc3LCAgMC45ODc1LCAgMS4xODQ5LCAgMS4zNTY4LAorICAgICAxLjQ5MDcsICAxLjczMzUsICAxLjg5MDIsICAyLjEyMjQsICAyLjMwOTksICAyLjQ5MTgsICAyLjcwMjMsICAyLjg3NjUsCisgICAgIDAuMTM1OSwgIDAuMjI1NCwgIDAuMzI4NiwgIDAuNDQzMiwgIDAuNjU4NiwgIDAuODk2NCwgIDEuMTEyNSwgIDEuMzUyMywKKyAgICAgMS41NjI2LCAgMS43NTc5LCAgMS45ODQ2LCAgMi4xOTA1LCAgMi4zNTQ4LCAgMi41NTQyLCAgMi43NjYzLCAgMi45MzQ2LAorICAgICAwLjE0MzAsICAwLjI5NjYsICAwLjQ2ODUsICAwLjY0OTMsICAwLjgzMTUsICAxLjAzMDQsICAxLjIyMjAsICAxLjQwODIsCisgICAgIDEuNTk5NSwgIDEuNzg4OCwgIDEuOTc3NCwgIDIuMTczNywgIDIuMzYwNywgIDIuNTU3NywgIDIuNzU1OCwgIDIuOTQwNSwKKyAgICAgMC4xNDc3LCAgMC4yNjk0LCAgMC40MDU2LCAgMC41NjI2LCAgMC43MDUxLCAgMC44NjQ3LCAgMS4wNDkxLCAgMS4yNDg4LAorICAgICAxLjQ4MTQsICAxLjcwNzIsICAxLjkxNTAsICAyLjExNDcsICAyLjMwMzgsICAyLjUxNDQsICAyLjcxODQsICAyLjkyMDIsCisgICAgIDAuMTY5MCwgIDAuMzAzMywgIDAuNDU4MCwgIDAuNjY4NiwgIDAuODUzNiwgIDEuMDI5MywgIDEuMjEyNCwgIDEuMzk5OCwKKyAgICAgMS41NzE4LCAgMS43NjA3LCAgMS45NTgwLCAgMi4xMjQ1LCAgMi4yOTcxLCAgMi40NzYyLCAgMi42ODk2LCAgMi45MTc3LAorICAgICAwLjEwOTIsICAwLjI3NzksICAwLjQ4NTMsICAwLjY4ODAsICAwLjkwMTEsICAxLjA5NTMsICAxLjI3NTIsICAxLjQ2MTgsCisgICAgIDEuNjYyMywgIDEuODQ4NCwgIDIuMDI2NCwgIDIuMjE1MiwgIDIuNDAxNywgIDIuNTgzNSwgIDIuNzY3MSwgIDIuOTQzNiwKKyAgICAgMC4xNDk3LCAgMC4zNjM3LCAgMC42MDE0LCAgMC44MDMyLCAgMC45OTYzLCAgMS4xODM1LCAgMS4zNzQxLCAgMS41Njk4LAorICAgICAxLjczODIsICAxLjkwOTQsICAyLjA3MTAsICAyLjIzOTIsICAyLjQwODIsICAyLjU5MjYsICAyLjc3NjIsICAyLjk1MzYsCisgICAgIDAuMTQzNCwgIDAuMjQ5MiwgIDAuMzk2NiwgIDAuNTkzNCwgIDAuODAzMywgIDEuMDY1NywgIDEuMjc5NiwgIDEuNDI3NiwKKyAgICAgMS41NzQ1LCAgMS43ODMzLCAgMS45Mjg4LCAgMi4xMjQ3LCAgMi4zNTQzLCAgMi41NDEyLCAgMi43MDQ5LCAgMi44ODcyLAorICAgICAwLjE2MTIsICAwLjI5MjYsICAwLjQ1NzQsICAwLjYzODcsICAwLjgyNjUsICAxLjAxODAsICAxLjE4MDgsICAxLjM1MjYsCisgICAgIDEuNTU2NCwgIDEuNzUzNiwgIDEuOTE4NywgIDIuMTE5MiwgIDIuMzE0OSwgIDIuNTAwNiwgIDIuNzEwMSwgIDIuOTIxNywKKyAgICAgMC4wODI4LCAgMC4xODYzLCAgMC4zMjM1LCAgMC41MDUwLCAgMC43MjUwLCAgMC45ODY3LCAgMS4yMDkzLCAgMS4zOTQxLAorICAgICAxLjU5ODAsICAxLjc5MzIsICAxLjk4MDksICAyLjE4OTQsICAyLjM5MTgsICAyLjU3NzMsICAyLjc1NDAsICAyLjkzMjksCisgICAgIDAuMjAwMSwgIDAuMzY1NSwgIDAuNTI5MCwgIDAuNjc2MSwgIDAuODAyNywgIDAuOTk3MiwgIDEuMjA5MCwgIDEuNDI1NSwKKyAgICAgMS42MDg1LCAgMS43ODI1LCAgMS45ODA0LCAgMi4xNjgxLCAgMi4zNDU3LCAgMi41MzI1LCAgMi43MzE5LCAgMi45MTk2LAorICAgICAwLjE1MDUsICAwLjI3NjcsICAwLjQyNTQsICAwLjYwNTQsICAwLjc4MjEsICAwLjk1NjcsICAxLjEyOTQsICAxLjMwODAsCisgICAgIDEuNDk4NCwgIDEuNjk1NCwgIDEuODY2NiwgIDIuMDczNiwgIDIuMjg3NSwgIDIuNDk2OSwgIDIuNzA3MiwgIDIuOTE2MywKKyAgICAgMC4xNTg5LCAgMC40MTUxLCAgMC41NzQ5LCAgMC42NjUxLCAgMC44MDYxLCAgMS4wNDcwLCAgMS4yNjE2LCAgMS4zNjkwLAorICAgICAxLjQ5ODUsICAxLjc4MDgsICAxLjk4MjUsICAyLjEwNjgsICAyLjI3NTEsICAyLjU0NDgsICAyLjcxMzMsICAyLjg2ODksCisgICAgIDAuMDkxNiwgIDAuMTg0NiwgIDAuMzc4OCwgIDAuNjMyOSwgIDAuODc3NCwgIDEuMDY4NywgIDEuMjY1MywgIDEuNDU2MSwKKyAgICAgMS42NTczLCAgMS44NDQ5LCAgMi4wNDAyLCAgMi4yMjU0LCAgMi4zOTY4LCAgMi41ODYxLCAgMi43NzkyLCAgMi45NTA4LAorICAgICAwLjIyODIsICAwLjQxNTksICAwLjU4MzQsICAwLjY4OTksICAwLjgxMDgsICAxLjAzMjEsICAxLjI3OTUsICAxLjUyNjIsCisgICAgIDEuNjkzNiwgIDEuODQ2OSwgIDIuMDkyMiwgIDIuMjYwNywgIDIuMzc5NSwgIDIuNTMwMSwgIDIuNzM4NiwgIDIuOTUzMCwKKyAgICAgMC4xNjUxLCAgMC4zMDA0LCAgMC40NTU1LCAgMC42MTc5LCAgMC43ODkxLCAgMC45NTg0LCAgMS4xMzcyLCAgMS4zNzA3LAorICAgICAxLjU5NTEsICAxLjc4ODAsICAxLjk0MzQsICAyLjE0NjUsICAyLjMzMTEsICAyLjUwODEsICAyLjY5NzcsICAyLjg5NzAsCisgICAgIDAuMTI3OSwgIDAuMzgyOCwgIDAuNjMzMCwgIDAuODMyMywgIDAuOTY1MiwgIDEuMTE3NSwgIDEuMjMxOSwgIDEuMzUxMSwKKyAgICAgMS41MTE1LCAgMS42MzkyLCAgMS43ODM1LCAgMS45NTU4LCAgMi4yMDA4LCAgMi40NjM1LCAgMi42OTEwLCAgMi45MDU4LAorICAgICAwLjExOTMsICAwLjIxODUsICAwLjM1MjEsICAwLjUzMTEsICAwLjczNzgsICAwLjkyMzksICAxLjExMDUsICAxLjMyMTcsCisgICAgIDEuNTM2MiwgIDEuNzUwNCwgIDEuOTUzNiwgIDIuMTYyNywgIDIuMzU2MCwgIDIuNTUwNiwgIDIuNzU0OCwgIDIuOTQ1MywKKyAgICAgMC4xODA2LCAgMC4zNDMyLCAgMC40OTgxLCAgMC42OTQ4LCAgMC44OTI4LCAgMS4wNTI3LCAgMS4yNDY3LCAgMS40MTQwLAorICAgICAxLjYzMjYsICAxLjc5NTAsICAxLjk5MzUsICAyLjE5NjksICAyLjM1MTIsICAyLjU2ODIsICAyLjc0NDUsICAyLjkyNzcsCisgICAgIDAuMTg0NiwgIDAuMzExMiwgIDAuNDU2OCwgIDAuNTg5MSwgIDAuNzMxNywgIDAuODQ5MywgIDEuMDIwNCwgIDEuMjAyMiwKKyAgICAgMS4zNjg4LCAgMS42MDIwLCAgMS44NDI4LCAgMi4wNzEwLCAgMi4yNzI1LCAgMi40ODc5LCAgMi43MDU3LCAgMi45MTYwLAorICAgICAwLjA4ODAsICAwLjI1MTQsICAwLjUzMzIsICAwLjcyNzIsICAwLjg5MDYsICAxLjEzNTQsICAxLjMxOTksICAxLjQ5NDEsCisgICAgIDEuNjAxMCwgIDEuNzE1MSwgIDEuODcxMiwgIDIuMDY0MywgIDIuMjc1NSwgIDIuNTM3NSwgIDIuNzA1NCwgIDIuODg5MSwKKyAgICAgMC4xMzgyLCAgMC4yODMzLCAgMC40NjU4LCAgMC42ODk3LCAgMC45MDcxLCAgMS4wNzE2LCAgMS4yNDY5LCAgMS40MTQzLAorICAgICAxLjU5MTAsICAxLjc5NDcsICAxLjk4MDUsICAyLjE1ODEsICAyLjMzMzgsICAyLjUyMTUsICAyLjcyOTIsICAyLjkyMTEsCisgICAgIDAuMTA2MSwgIDAuMzQ5NCwgIDAuNjMyNywgIDAuODU3MCwgIDAuOTc0OCwgIDEuMDU2MCwgIDEuMTUyOSwgIDEuMzI1MCwKKyAgICAgMS42MDMyLCAgMS44MzQwLCAgMS45NzExLCAgMi4xMTU3LCAgMi4zMDExLCAgMi41NDY0LCAgMi44MDc4LCAgMi45ODAzLAorICAgICAwLjE2MDMsICAwLjI4MzksICAwLjQzMDcsICAwLjU5ODAsICAwLjc5ODAsICAxLjAzOTksICAxLjE5NzEsICAxLjM1MjQsCisgICAgIDEuNTcxNSwgIDEuNzgzOCwgIDEuOTQ2OCwgIDIuMTQ5OCwgIDIuMzYyNywgIDIuNTUxNCwgIDIuNzMyNywgIDIuOTE0OCwKKyAgICAgMC4xNjkxLCAgMC4zMTE3LCAgMC40Nzk2LCAgMC42ODk1LCAgMC44NzMyLCAgMS4wMTY0LCAgMS4xOTE2LCAgMS4zNzA3LAorICAgICAxLjUzODQsICAxLjcyMDIsICAxLjg4NTcsICAyLjA2NzIsICAyLjI0ODcsICAyLjQ1OTMsICAyLjY3ODksICAyLjg5NDAsCisgICAgIDAuMDk2NSwgIDAuMTcwMiwgIDAuMzE5MSwgIDAuNTcyMSwgIDAuODEwMCwgIDEuMDI0MSwgIDEuMjI3MiwgIDEuNDE5NiwKKyAgICAgMS42MDkzLCAgMS44MDU3LCAgMS45ODg0LCAgMi4yMDM3LCAgMi4zOTI1LCAgMi41ODA1LCAgMi43NTc4LCAgMi45MzY2LAorICAgICAwLjE5NTAsICAwLjM1MTksICAwLjUyNzIsICAwLjY5NzMsICAwLjg3MzIsICAxLjA2NTYsICAxLjIxMTIsICAxLjM5NTksCisgICAgIDEuNjExNiwgIDEuNzgyMSwgIDEuOTQ0NSwgIDIuMTU5MiwgIDIuMzM0OCwgIDIuNTE0MiwgIDIuNzQ0MCwgIDIuOTI5NywKKyAgICAgMC4xMzg4LCAgMC4yNTU3LCAgMC40MTIwLCAgMC41NzI3LCAgMC43MzU0LCAgMC45MTk2LCAgMS4wOTg1LCAgMS4yODA1LAorICAgICAxLjQ2NDMsICAxLjY1MzUsICAxLjgzNDAsICAyLjA1NDYsICAyLjI3NTgsICAyLjQ3NzgsICAyLjY5MjEsICAyLjkxMjIsCisgICAgIDAuMTgyMywgIDAuMzMzNiwgIDAuNDk1NywgIDAuNjc3MSwgIDAuODU2MywgIDEuMDEzNywgIDEuMjI5OSwgIDEuMzg0OSwKKyAgICAgMS41NzE4LCAgMS43NjY3LCAgMS45MTkzLCAgMi4xMzI2LCAgMi4zMTM1LCAgMi41MjY4LCAgMi43MTMzLCAgMi44OTk4LAorICAgICAwLjA3OTAsICAwLjE5MDEsICAwLjQwODMsICAwLjY0NTYsICAwLjg0NjMsICAxLjAyODUsICAxLjIyOTcsICAxLjQxODEsCisgICAgIDEuNjE1OSwgIDEuODA1NiwgIDEuOTk3MSwgIDIuMTkxMiwgIDIuMzgxNiwgIDIuNTc0NiwgIDIuNzY5MiwgIDIuOTQ5NywKKyAgICAgMC4wMDQ5LCAgMC4wMTE2LCAgMC4wMDQ1LCAgMC4wMDM5LCAtMC4wMDEwLCAtMC4wMTIyLCAtMC4wMjA1LCAtMC4wMDM0LAorICAgIC0wLjAxNDAsIC0wLjAwNDEsICAwLjAxOTEsIC0wLjAzMjIsICAwLjAwMDIsIC0wLjAxMjQsIC0wLjAyNjksICAwLjAwNTksCisgICAgIDAuMDU4NiwgIDAuMDMzOSwgLTAuMDM4OSwgLTAuMDMxOSwgLTAuMDA3OSwgLTAuMDIwNSwgLTAuMDM2MywgLTAuMDIxMSwKKyAgICAgMC4wMjQxLCAgMC4wNTk1LCAgMC4wNDY5LCAgMC4wMjgzLCAgMC4wMTc2LCAtMC4wMTgzLCAtMC4wMTczLCAtMC4wMDA0LAorICAgICAwLjAwMjQsICAwLjAxNDUsICAwLjA1MzQsICAwLjAxOTcsIC0wLjAwNjUsIC0wLjAwNjcsICAwLjAxMzMsICAwLjAzNTgsCisgICAgLTAuMDEwNCwgLTAuMDM4NiwgLTAuMDEwOSwgLTAuMDA3OCwgIDAuMDI3NSwgIDAuMDU2NSwgIDAuMDI1MSwgLTAuMDAyNywKKyAgICAtMC4wMDUzLCAgMC4wMTcxLCAgMC4wMDg4LCAgMC4wNDk1LCAgMC4wMTQxLCAgMC4wMDM5LCAtMC4wNDQ1LCAtMC4wNDI2LAorICAgIC0wLjAxODQsIC0wLjAyODAsIC0wLjAyMjMsICAwLjAwMzksIC0wLjAxNzEsIC0wLjA2MDYsIC0wLjA3ODYsIC0wLjA0MzAsCisgICAgIDAuMDU0NCwgIDAuMDU5NSwgIDAuMDMyMCwgLTAuMDAxMiwgIDAuMDEwOCwgIDAuMDE4NSwgIDAuMDA2NiwgIDAuMDQwOCwKKyAgICAgMC4wNTUyLCAtMC4wMDczLCAtMC4wMjQ3LCAtMC4wNDgwLCAtMC4wMjg4LCAgMC4wMTg2LCAgMC4wMjEyLCAtMC4wMDEzLAorICAgICAwLjA0MDMsICAwLjA1OTgsICAwLjA2OTAsICAwLjA1MTYsIC0wLjAyOTgsIC0wLjAxNzcsICAwLjAyNzgsICAwLjAxNjgsCisgICAgLTAuMDEwNiwgIDAuMDI1MSwgIDAuMDM4NiwgIDAuMDMzMSwgLTAuMDA1MiwgIDAuMDEzMywgIDAuMDI5MSwgLTAuMDE1OCwKKyAgICAtMC4wMzI5LCAtMC4wMzY3LCAgMC4wMjg3LCAgMC4wNDYyLCAtMC4wMTc2LCAgMC4wMDQ5LCAgMC4wMjQyLCAtMC4wMDM0LAorICAgICAwLjAxMzUsICAwLjAwODYsIC0wLjAxNDksICAwLjAyNDEsICAwLjA1MDQsICAwLjAyNDYsIC0wLjAyNzMsIC0wLjAzNjksCisgICAgLTAuMDEwOCwgLTAuMDQ0OSwgLTAuMDYyNSwgLTAuMDQxNCwgLTAuMDI5MiwgLTAuMDU3MSwgLTAuMDQ0MCwgLTAuMDA4OCwKKyAgICAgMC4wMDk4LCAgMC4wMDA5LCAtMC4wMDA0LCAgMC4wMDA3LCAtMC4wMzE0LCAtMC4wMjA4LCAtMC4wMTM4LCAtMC4wMjc3LAorICAgIC0wLjAwNDQsICAwLjA1MjIsICAwLjAzMTUsIC0wLjAyNzAsIC0wLjAyNzcsIC0wLjAyNTYsIC0wLjAxMDMsIC0wLjAyMDEsCisgICAgLTAuMDI4NywgLTAuMDI3OSwgLTAuMDE4MiwgIDAuMDQ3MiwgIDAuMDYxMywgIDAuMDQ1MCwgIDAuMDQxMywgIDAuMDMzMywKKyAgICAgMC4wNDQ0LCAgMC4wMjIzLCAgMC4wMDYxLCAgMC4wMzE2LCAgMC4wMzIxLCAgMC4wNTAxLCAgMC4wNDYwLCAgMC4wMjUwLAorICAgICAwLjAyMjcsICAwLjAyMzUsICAwLjAwOTksICAwLjAxODUsIC0wLjAzNDcsIC0wLjA2ODQsIC0wLjAxODksICAwLjAyNDIsCisgICAgLTAuMDE5MCwgLTAuMDI3MywgLTAuMDAxMiwgLTAuMDI1MywgIDAuMDI5MywgLTAuMDIzMSwgLTAuMDIxOSwgLTAuMDAxMCwKKyAgICAgMC4wMTUzLCAgMC4wMTI4LCAtMC4wMTY2LCAtMC4wNDM1LCAtMC4wNDE3LCAtMC4wMTIxLCAtMC4wMzUxLCAtMC4wMzkwLAorICAgICAwLjAwNzcsIC0wLjAyNzgsIC0wLjAzNTUsICAwLjAwOTIsIC0wLjAwNjMsICAwLjAwMDUsICAwLjAyMTYsICAwLjA0NjEsCisgICAgIDAuMDUzOCwgIDAuMDQ1MSwgIDAuMDI5OCwgLTAuMDEzMCwgIDAuMDA1OCwgIDAuMDIwNiwgIDAuMDQ3MSwgIDAuMDQ5OSwKKyAgICAgMC4wMjgwLCAgMC4wMDg2LCAtMC4wMDA3LCAtMC4wMzE3LCAgMC4wMjU5LCAgMC4wMTc2LCAgMC4wMDQzLCAgMC4wMjEyLAorICAgICAwLjAxMzgsICAwLjAxMDYsICAwLjAyMjAsIC0wLjAwMjUsICAwLjAwNTAsICAwLjAxMjIsIC0wLjAwNTEsIC0wLjAwODYsCisgICAgLTAuMDQ3MiwgLTAuMDAwNSwgIDAuMDE5MywgIDAuMDAzMiwgIDAuMDI0NiwgIDAuMDIyMiwgIDAuMDA5MCwgLTAuMDMyMCwKKyAgICAtMC4wNzEzLCAtMC4wNTI2LCAtMC4wMTUxLCAtMC4wNDQwLCAtMC4wNjQ4LCAtMC4wNDY2LCAtMC4wMDkyLCAgMC4wMTE1LAorICAgIC0wLjAxMjksICAwLjAwNTMsIC0wLjAzNDQsIC0wLjAzODUsICAwLjAzOTIsICAwLjA1OTksICAwLjA0MTQsICAwLjAxNjUsCisgICAgLTAuMDA5OCwgLTAuMDMyMCwgLTAuMDI2MSwgLTAuMDA1NSwgLTAuMDEzOSwgLTAuMDExMCwgIDAuMDA4NCwgIDAuMDE3MiwKKyAgICAtMC4wNDkyLCAtMC4wNTM3LCAtMC4wMzIwLCAtMC4wMDM2LCAgMC4wMjY1LCAgMC4wMzg1LCAgMC4wMDY0LCAtMC4wMjgwLAorICAgIC0wLjAyMzAsICAwLjAxMzQsICAwLjAyNDEsICAwLjAxMDYsICAwLjAzODcsICAwLjAxMDUsICAwLjAwNjgsICAwLjAyNjAsCisgICAgIDAuNDk0MCwgIDAuNDkxMSwgIDAuNDg0OSwgIDAuNDgyMCwgIDAuNDgzNywgIDAuNDgzOSwgIDAuNDgyNCwgIDAuNDc5OSwKKyAgICAgMC40ODEyLCAgMC40NzgyLCAgMC40Nzg4LCAgMC40NzExLCAgMC40NzA2LCAgMC40NjcxLCAgMC40NjAxLCAgMC40NTc4LAorICAgICAwLjI5NTQsICAwLjIxMjEsICAwLjE4NTksICAwLjE5NTgsICAwLjE0NzQsICAwLjEwODYsICAwLjEzNTEsICAwLjEzNjIsCisgICAgIDAuMTQ4NiwgIDAuMTM0MiwgIDAuMTIxNSwgIDAuMTQyMywgIDAuMTYzNCwgIDAuMTU4OCwgIDAuMTUzOSwgIDAuMTg1NywKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBsc3AxNltdID0geworICAgICAwLjE4MTMsICAwLjM5MTEsICAwLjYzMDEsICAwLjgwMTIsICAxLjAwNTcsICAxLjIwNDEsICAxLjQyNzEsICAxLjY5NDMsCisgICAgIDEuOTQwMiwgIDIuMTczMywgIDIuMzUyMSwgIDIuNDk4OSwgIDIuNTgzOSwgIDIuNjg0NiwgIDIuNzYzNCwgIDIuODk1MCwKKyAgICAgMC4xMzExLCAgMC4zMTgzLCAgMC40NjU5LCAgMC41NjAxLCAgMC42NjU4LCAgMC43ODI4LCAgMS4wMDY1LCAgMS4yNzE3LAorICAgICAxLjUxODUsICAxLjczMzksICAxLjk1MzAsICAyLjIxODksICAyLjM3MzksICAyLjQ5OTEsICAyLjY5ODQsICAyLjkyNTYsCisgICAgIDAuMTYyNywgIDAuNDUxOSwgIDAuNjMyMywgIDAuNzAxMiwgIDAuNzg0OCwgIDAuOTgwMSwgIDEuMTgxMCwgIDEuMzIyMiwKKyAgICAgMS41NDEzLCAgMS44MTI5LCAgMS45MzM4LCAgMi4wODA5LCAgMi4zMTgwLCAgMi41MTg5LCAgMi43MDY2LCAgMi45NTE0LAorICAgICAwLjE0NzUsICAwLjI0NDcsICAwLjQyNDAsICAwLjU2NjksICAwLjc4NzIsICAwLjk4MzgsICAxLjE4MjMsICAxLjM4MTQsCisgICAgIDEuNTM1OCwgIDEuNjgyMCwgIDEuODc5NCwgIDIuMTQxOSwgIDIuNDEzMiwgIDIuNjExMiwgIDIuNzkxMSwgIDIuOTUxMSwKKyAgICAgMC4xMjI0LCAgMC4yODc2LCAgMC41MDEzLCAgMC42OTg1LCAgMC44OTAyLCAgMS4wOTAxLCAgMS4yODM1LCAgMS40NzY4LAorICAgICAxLjY1OTYsICAxLjg1MzgsICAyLjA0NjcsICAyLjIzMDQsICAyLjQxMjQsICAyLjU5NDIsICAyLjc3MjksICAyLjk1MzEsCisgICAgIDAuMTc0MSwgIDAuMzAzNCwgIDAuNDY3NywgIDAuNTg3OSwgIDAuNzI1OCwgIDAuOTY0OCwgIDEuMTQxNywgIDEuMzIyMCwKKyAgICAgMS41MDgxLCAgMS43MTUxLCAgMS45MjEyLCAgMi4xMjg2LCAgMi4zMjA4LCAgMi40OTM4LCAgMi42NzY1LCAgMi44ODkxLAorICAgICAwLjE2NTcsICAwLjMxNzQsICAwLjQ5MDcsICAwLjY1NTksICAwLjgyOTUsICAxLjAyNTQsICAxLjIwNzEsICAxLjM4ODAsCisgICAgIDEuNTczNywgIDEuNzg0NSwgIDEuOTAyNywgIDIuMTEzOSwgIDIuMzMyMywgIDIuNTE1NywgIDIuNzMyMywgIDIuOTAxNSwKKyAgICAgMC4xNTkyLCAgMC4yNzU4LCAgMC40NDE3LCAgMC42MzE1LCAgMC44MjU3LCAgMC45ODczLCAgMS4xMjc3LCAgMS4yODMwLAorICAgICAxLjQzMzcsICAxLjYzMTUsICAxLjg4OTksICAyLjEzNTYsICAyLjM1NzIsICAyLjU2MzIsICAyLjc0NjgsICAyLjk0MjAsCisgICAgIDAuMTUyNCwgIDAuNDMyNSwgIDAuNTkzMSwgIDAuNzAzNiwgIDAuNzY5NiwgIDAuODkyMywgIDEuMTczOSwgIDEuNDc3MywKKyAgICAgMS42NjA5LCAgMS43OTExLCAgMS45NjY2LCAgMi4xOTcyLCAgMi4zNzU0LCAgMi41MDQ1LCAgMi42NjEzLCAgMi44ODgyLAorICAgICAwLjIxMzAsICAwLjMwMTMsICAwLjM3MjEsICAwLjQyNTcsICAwLjUwNzksICAwLjcwMTUsICAwLjk4MTUsICAxLjI1NTQsCisgICAgIDEuNDY0OCwgIDEuNjk2NiwgIDEuOTEzOCwgIDIuMTA3NSwgIDIuMzMxOCwgIDIuNTI5MiwgIDIuNzQ1MywgIDIuOTM0NywKKyAgICAgMC4xMTQyLCAgMC4zNzQ4LCAgMC42MjA1LCAgMC43NjQyLCAgMC44MTIxLCAgMC45MDIyLCAgMC45ODQzLCAgMS4xNTU4LAorICAgICAxLjQ0NjcsICAxLjc0MjIsICAxLjk1NzQsICAyLjEzMDIsICAyLjM4MTIsICAyLjU4OTgsICAyLjc3MjAsICAyLjk1ODMsCisgICAgIDAuMTI1NSwgIDAuMjMzOSwgIDAuMzU3MCwgIDAuNTMyMywgIDAuNzQ1OCwgIDEuMDAwMywgIDEuMTcyOSwgIDEuMzU2NywKKyAgICAgMS41MjE3LCAgMS42OTc3LCAgMS44OTI0LCAgMi4wOTQyLCAgMi4zMTQ1LCAgMi41NDA4LCAgMi43NTUzLCAgMi45MzM3LAorICAgICAwLjEzMTYsICAwLjIyODksICAwLjQzMjcsICAwLjY2NjMsICAwLjg1MDksICAwLjk5OTQsICAxLjE2OTcsICAxLjM4MDQsCisgICAgIDEuNTYwOSwgIDEuNjkwMywgIDEuODU3MiwgIDIuMTAxOSwgIDIuMzY4NywgIDIuNTc4OSwgIDIuNzcxNSwgIDIuOTQ3MiwKKyAgICAgMC4xNTAyLCAgMC4yNTQ2LCAgMC4zODgzLCAgMC41MzMzLCAgMC42OTc2LCAgMC45MTYzLCAgMS4xMDcxLCAgMS4zMzY0LAorICAgICAxLjU0MjAsICAxLjc1MjUsICAxLjg5NDgsICAyLjA4MzksICAyLjI4MTksICAyLjQ2NTEsICAyLjY4NzUsICAyLjg5ODcsCisgICAgIDAuMTU5MywgIDAuMzAxNCwgIDAuNDU3MywgIDAuNjM1NCwgIDAuODE1NywgIDAuOTgwNSwgIDEuMTc4MywgIDEuMzc0NywKKyAgICAgMS41Njc4LCAgMS43MzI2LCAgMS45Mjg2LCAgMi4xMzQwLCAgMi4zMjUzLCAgMi41MjgwLCAgMi43MTgwLCAgMi45Mjk4LAorICAgICAwLjE4MTEsICAwLjMxNjcsICAwLjQ2NTUsICAwLjY1MDcsICAwLjgxOTgsICAxLjAwNzUsICAxLjE4OTIsICAxLjM3NDMsCisgICAgIDEuNTIyNywgIDEuNzA5MCwgIDEuODg0OSwgIDIuMDc0MywgIDIuMjc1MCwgIDIuNDgzMCwgIDIuNjg5NiwgIDIuODk1MywKKyAgICAgMC4xODQ2LCAgMC4zNTc3LCAgMC41MzE1LCAgMC43MjkwLCAgMC45MTc2LCAgMS4xMDE2LCAgMS4yNjU0LCAgMS40NTI1LAorICAgICAxLjYzMTUsICAxLjgyNjgsICAyLjAyMzgsICAyLjE5MzQsICAyLjM4NjgsICAyLjU3NTMsICAyLjc2ODIsICAyLjk0NjksCisgICAgIDAuMDg3NiwgIDAuMTQzOSwgIDAuMjA0OCwgIDAuMzY1NCwgIDAuNjI4MSwgIDAuODg1MywgIDEuMDkwNywgIDEuMjk5MiwKKyAgICAgMS41MjI3LCAgMS43MzczLCAgMS45Mzk1LCAgMi4xNDE5LCAgMi4zNDg4LCAgMi41NDg2LCAgMi43NDY2LCAgMi45MzQ4LAorICAgICAwLjEzOTEsICAwLjQxNzAsICAwLjY1NjEsICAwLjc5NTMsICAwLjg3MzQsICAwLjk5ODYsICAxLjE4NzAsICAxLjQ1MjAsCisgICAgIDEuNjA0MiwgIDEuNzkxMCwgIDIuMDEzNSwgIDIuMTg3MCwgIDIuMzM1OCwgIDIuNTA2NiwgIDIuNzQwOSwgIDIuOTk1NSwKKyAgICAgMC4wODA0LCAgMC4xMzU1LCAgMC4yNTk5LCAgMC40OTk4LCAgMC43NDA4LCAgMC45NDc0LCAgMS4xMjc2LCAgMS4zNDI4LAorICAgICAxLjU1NTYsICAxLjc3MTIsICAxLjk2OTksICAyLjE1MzUsICAyLjM2MDUsICAyLjU1NDgsICAyLjc0ODksICAyLjkzMjUsCisgICAgIDAuMTMwNCwgIDAuMzA4NywgIDAuNDk3OSwgIDAuNjU4NCwgIDAuODQxNCwgIDEuMDMyOSwgIDEuMjI0NCwgIDEuNDE4OSwKKyAgICAgMS42MTE4LCAgMS44MjAwLCAgMS45OTg1LCAgMi4xODkzLCAgMi4zOTE1LCAgMi41Nzk0LCAgMi43NjQ3LCAgMi45MzQ0LAorICAgICAwLjE4OTUsICAwLjI4NDksICAwLjM3MDUsICAwLjQxMjYsICAwLjYyNjUsICAwLjkyMDcsICAxLjE3NzQsICAxLjM3NjIsCisgICAgIDEuNTc1NywgIDEuNzcyOCwgIDEuOTU2OCwgIDIuMTY2MiwgIDIuMzYxNSwgIDIuNTU3NSwgIDIuNzU2MSwgIDIuOTQxNiwKKyAgICAgMC4xODAwLCAgMC4zMDc4LCAgMC40ODA1LCAgMC42Nzk2LCAgMC44NTAzLCAgMS4wMDQ2LCAgMS4xNzAzLCAgMS4zMjY5LAorICAgICAxLjQ4NjIsICAxLjY1MDIsICAxLjg0NTQsICAyLjA4NzMsICAyLjMxNzUsICAyLjUzNTYsICAyLjc1MTYsICAyLjk0NjksCisgICAgIDAuMTk1MCwgIDAuMzIzMywgIDAuNDU2OCwgIDAuNTk0MCwgIDAuNzU4OSwgIDAuOTk3OCwgIDEuMTcwMSwgIDEuMzM4MywKKyAgICAgMS41MDE3LCAgMS42NTY1LCAgMS44MjQzLCAgMi4wNjA1LCAgMi4yOTM4LCAgMi41MTQ3LCAgMi43NDE5LCAgMi45Mzk2LAorICAgICAwLjI1MzEsICAwLjQzOTEsICAwLjU3OTAsICAwLjcxNzAsICAwLjg5OTgsICAxLjE0MzAsICAxLjM1NzcsICAxLjUzMjYsCisgICAgIDEuNjMyOCwgIDEuNzYyNywgIDEuOTcyNiwgIDIuMTc2MiwgIDIuMzU2MywgIDIuNTQ3OCwgIDIuNzM4NSwgIDIuOTA2NywKKyAgICAgMC4xODA1LCAgMC4yNzg4LCAgMC4zNTkxLCAgMC4zODgxLCAgMC41NDQxLCAgMC44MDU1LCAgMS4wNzY2LCAgMS4zMTY1LAorICAgICAxLjUzMTYsICAxLjc1MDgsICAxLjk0NzcsICAyLjEzNzQsICAyLjM0MzgsICAyLjU0ODQsICAyLjc1MDEsICAyLjk0MTAsCisgICAgIDAuMjA0NCwgIDAuMzY3MSwgIDAuNTM5NiwgIDAuNzA0MiwgIDAuODU4MiwgIDAuOTgzMSwgIDEuMTI2MSwgIDEuMzE5NCwKKyAgICAgMS40NzY5LCAgMS42OTc5LCAgMS44NzE3LCAgMi4wNDYzLCAgMi4yNjIwLCAgMi40NzM5LCAgMi43MDU0LCAgMi45MjA4LAorICAgICAwLjEwNDgsICAwLjIxNzUsICAwLjQyMDYsICAwLjU5MjMsICAwLjc0ODMsICAwLjk0MDAsICAxLjEzNTYsICAxLjM3OTksCisgICAgIDEuNTk1OCwgIDEuNzMyMCwgIDEuODk4NCwgIDIuMTI5NiwgIDIuMzU5NCwgIDIuNTQ5MiwgIDIuNzM4NywgIDIuOTMwNSwKKyAgICAgMC4wODQyLCAgMC4xNzI5LCAgMC4zOTUxLCAgMC42NDQ3LCAgMC44Njg4LCAgMS4wNjA1LCAgMS4yNDcyLCAgMS40MzMwLAorICAgICAxLjYyMzIsICAxLjgxNDQsICAyLjAyMTYsICAyLjE5MTUsICAyLjM4NzgsICAyLjU3NjMsICAyLjc2ODUsICAyLjk0NjQsCisgICAgIDAuMTQ2MSwgIDAuMjU5MywgIDAuNDEwNSwgIDAuNTY3NywgIDAuNzMyOCwgIDAuODkxOSwgIDEuMDQ4NCwgIDEuMjMwMiwKKyAgICAgMS40Mzg2LCAgMS42NjM1LCAgMS44ODczLCAgMi4xMDI0LCAgMi4zMTE2LCAgMi41MjY4LCAgMi43MjczLCAgMi45MjY5LAorICAgICAwLjE1MDMsICAwLjMxMDgsICAwLjQ3NTYsICAwLjY3MzEsICAwLjg2MDAsICAxLjAyMzMsICAxLjIxMTUsICAxLjM5NzEsCisgICAgIDEuNTkxNSwgIDEuNzg5MiwgIDEuOTUxNywgIDIuMTYwMywgIDIuMzQ4NywgIDIuNTQ2MCwgIDIuNzMwOCwgIDIuODk5OCwKKyAgICAgMC4yMTYzLCAgMC4zNjY5LCAgMC41MTI1LCAgMC42NzA5LCAgMC44MTQzLCAgMC45OTMwLCAgMS4yMDk1LCAgMS40MjA1LAorICAgICAxLjYxNzYsICAxLjcxMTIsICAxLjgzOTgsICAyLjA4OTYsICAyLjM1MTMsICAyLjUyOTAsICAyLjY2NjcsICAyLjg5NjAsCisgICAgIDAuMjEzMywgIDAuNDM4MiwgIDAuNjI4NywgIDAuODcwMiwgIDEuMTA4OCwgIDEuMzc0OSwgIDEuNjA2MiwgIDEuNzQ0NiwKKyAgICAgMS44MzMzLCAgMS45MTIyLCAgMS45NjE0LCAgMi4wNjY5LCAgMi4xNzg5LCAgMi4zNDQ5LCAgMi42MDM4LCAgMi44ODQ5LAorICAgICAwLjE1OTgsICAwLjI3MTksICAwLjM4NzcsICAwLjQ4MTUsICAwLjU5MjYsICAwLjc3OTUsICAxLjA0NDksICAxLjMwNDUsCisgICAgIDEuNTIxMCwgIDEuNzM5MSwgIDEuOTQ2MiwgIDIuMTM5NywgIDIuMzU1MywgIDIuNTQ1OCwgIDIuNzU0MCwgIDIuOTM5MiwKKyAgICAgMC4yOTE4LCAgMC41NjA3LCAgMC42ODAxLCAgMC43NDA0LCAgMC44Mjg1LCAgMC45NDMxLCAgMS4xNTc5LCAgMS40MDgwLAorICAgICAxLjYzMzIsICAxLjg0NzIsICAxLjk3MzgsICAyLjA3NzEsICAyLjI4OTAsICAyLjUxNzgsICAyLjc0NDUsICAyLjk4MzAsCisgICAgIDAuMTY2NCwgIDAuMjg0MiwgIDAuMzk2NSwgIDAuNTQ2MywgIDAuODE2MiwgIDEuMDM0NiwgIDEuMTg0OSwgIDEuMzQ0NiwKKyAgICAgMS41MTIyLCAgMS43NTYzLCAgMS45OTYwLCAgMi4yMDAyLCAgMi4zNzk2LCAgMi41Njg5LCAgMi43NzEyLCAgMi45NTUwLAorICAgICAwLjA5MTEsICAwLjIzOTcsICAwLjUwNTIsICAwLjc4NjgsICAxLjAyOTksICAxLjEzMTEsICAxLjIyNDQsICAxLjMzMzMsCisgICAgIDEuNDM5NSwgIDEuNjc5MCwgIDEuOTM2OSwgIDIuMTcxNywgIDIuMzY4OSwgIDIuNTUzOCwgIDIuNzM0MCwgIDIuOTMyNiwKKyAgICAgMC4xNjQ3LCAgMC4yOTMxLCAgMC4zODM2LCAgMC40OTc4LCAgMC42MjU1LCAgMC45MjQzLCAgMS4xMzM5LCAgMS4zMDAxLAorICAgICAxLjUyNjksICAxLjgwMTAsICAxLjk3MTUsICAyLjE0MTksICAyLjM3ODQsICAyLjU1MDMsICAyLjY3MTksICAyLjg3NDUsCisgICAgIDAuMjQ0MCwgIDAuMzgwMiwgIDAuNDc1NiwgIDAuNjYxMywgIDAuODYyNywgIDEuMDI5MiwgIDEuMjI5MSwgIDEuNDA2MCwKKyAgICAgMS41MTk4LCAgMS43MzU0LCAgMS45MDQ0LCAgMi4xMDEwLCAgMi4zMTQ3LCAgMi40OTk2LCAgMi43MTcxLCAgMi45MDQxLAorICAgICAwLjE1OTAsICAwLjI4NzYsICAwLjQ1NzIsICAwLjU5OTYsICAwLjc3MTMsICAwLjk0OTAsICAxLjEyMDUsICAxLjI4MTUsCisgICAgIDEuNDUxNiwgIDEuNjM4NSwgIDEuODE3OSwgIDIuMDQ1NywgIDIuMjc1OSwgIDIuNDc4NSwgIDIuNjg2MSwgIDIuOTA4MCwKKyAgICAgMC4yMjk3LCAgMC40MzA5LCAgMC41NzEyLCAgMC42NzE3LCAgMC44MTM4LCAgMS4wNDYzLCAgMS4yNDkyLCAgMS40NTYwLAorICAgICAxLjY3OTYsICAxLjg0NTgsICAxLjk2NDIsICAyLjE0NTIsICAyLjM2MzYsICAyLjUzOTUsICAyLjc0NTYsICAyLjk0OTUsCisgICAgIDAuMjk3NSwgIDAuNDY3OCwgIDAuNDk5NiwgIDAuNTgwOSwgIDAuNjI3OSwgIDAuNjg4NCwgIDAuODYwNiwgIDEuMTM4NiwKKyAgICAgMS40NDEyLCAgMS42ODc2LCAgMS44NzYwLCAgMi4wOTMyLCAgMi4zMTc4LCAgMi41MTY2LCAgMi43MzQ1LCAgMi45MjgwLAorICAgICAwLjEyNzgsICAwLjM3MzcsICAwLjYwMDQsICAwLjcwNjksICAwLjgxNDcsICAxLjAxODAsICAxLjI1ODEsICAxLjM4MTIsCisgICAgIDEuNDg1NSwgIDEuNzI2OCwgIDEuOTk3MCwgIDIuMTI1OCwgIDIuMjkzNiwgIDIuNTcwMiwgIDIuNzU2MywgIDIuODk4MywKKyAgICAgMC4xMzE0LCAgMC4yNTA4LCAgMC4zOTk5LCAgMC41NjgwLCAgMC43NDI0LCAgMC45MzY3LCAgMS4xMjg2LCAgMS4zMTc1LAorICAgICAxLjUzMzYsICAxLjc0MDQsICAxLjkzMTcsICAyLjE0MDQsICAyLjM1MTQsICAyLjU1NjIsICAyLjc1MTAsICAyLjk0MDIsCisgICAgIDAuMTA0MywgIDAuMjM2NywgIDAuNDI5MywgIDAuNjM3NiwgIDAuODE2MCwgIDAuOTgzNiwgIDEuMTc3OSwgIDEuMzg1MCwKKyAgICAgMS41ODM1LCAgMS43ODc1LCAgMS45NzY1LCAgMi4xNTkzLCAgMi4zNjU0LCAgMi41NTc3LCAgMi43NDY1LCAgMi45Mzk4LAorICAgICAwLjE1MjksICAwLjI1MTUsICAwLjM0NTQsICAwLjQzNzQsICAwLjcwMTEsICAwLjkwMTUsICAxLjA3NDQsICAxLjM1MzIsCisgICAgIDEuNTY5OSwgIDEuNzU0NSwgIDIuMDAyMSwgIDIuMTI1OSwgIDIuMjI3OCwgIDIuNDU0NiwgIDIuNzI2NCwgIDIuOTQyNSwKKyAgICAgMC4xNDI5LCAgMC4yODA4LCAgMC40Mzk1LCAgMC42MzM0LCAgMC44MDY5LCAgMC45NzA1LCAgMS4xNTIwLCAgMS4zMjUwLAorICAgICAxLjUxMDksICAxLjcyODUsICAxLjkzNTYsICAyLjE0NjksICAyLjM0NzksICAyLjU1NTQsICAyLjc1MTIsICAyLjkzNDgsCisgICAgIDAuMTYyNSwgIDAuMzAyMiwgIDAuNDc1NiwgIDAuNjMxNSwgIDAuODAzMiwgIDAuOTkyNCwgIDEuMTU5NiwgIDEuMzIwNCwKKyAgICAgMS40OTk0LCAgMS42OTI5LCAgMS44OTU1LCAgMi4xMDkwLCAgMi4zMDI1LCAgMi41MDE4LCAgMi42OTA4LCAgMi44OTgwLAorICAgICAwLjE2OTIsICAwLjM0MjcsICAwLjUyMjgsICAwLjc3NTYsICAwLjk2ODgsICAxLjA5NTAsICAxLjMwNTYsICAxLjQzNjAsCisgICAgIDEuNTY3NSwgIDEuODA0OSwgIDEuOTM3NiwgIDIuMTE1MSwgIDIuMzQwNywgIDIuNTAxMiwgIDIuNzE5MiwgIDIuOTI1OCwKKyAgICAgMC4wNDc0LCAgMC4xMjUxLCAgMC4xOTM5LCAgMC4zODQxLCAgMC42NTAxLCAgMC45MjMxLCAgMS4xMTUzLCAgMS4zMjQwLAorICAgICAxLjU0NzgsICAxLjc1OTksICAxLjk2NTEsICAyLjE1MTAsICAyLjM2NDUsICAyLjU1NTIsICAyLjc1NDIsICAyLjkzOTMsCisgICAgIDAuMjE5NiwgIDAuNDY1NiwgIDAuNzQ5MiwgIDAuOTkyMiwgIDEuMTY3OCwgIDEuMjQ4OSwgIDEuMzExMiwgIDEuMzY1NywKKyAgICAgMS40MjIzLCAgMS41MzAyLCAgMS43MjEyLCAgMS45OTk2LCAgMi4yNTIzLCAgMi40ODQ0LCAgMi43MDM2LCAgMi45MTQ1LAorICAgICAwLjExMjgsICAwLjIzNjgsICAwLjM3MDQsICAwLjU0NzYsICAwLjc3MjMsICAwLjk5NjgsICAxLjE5MzAsICAxLjM5OTIsCisgICAgIDEuNjAxMywgIDEuNzk1NywgIDEuOTg4OCwgIDIuMTg1NywgIDIuMzgyNSwgIDIuNTcwNSwgIDIuNzYxNiwgIDIuOTQzNCwKKyAgICAgMC4xMzQxLCAgMC4yNzY4LCAgMC40NTEwLCAgMC42MzU5LCAgMC44MzMyLCAgMS4wMzM1LCAgMS4yMDA0LCAgMS4zOTUyLAorICAgICAxLjU3NjIsICAxLjc2ODEsICAxLjk4MTUsICAyLjE3MzUsICAyLjM2NTcsICAyLjU1NTIsICAyLjc1MTQsICAyLjk0OTgsCisgICAgIDAuMTI0NywgIDAuMjU1OSwgIDAuMzUxNiwgIDAuNDcyNiwgIDAuNjg2MSwgIDAuOTQ4MywgIDEuMTg1MiwgIDEuMzg1OCwKKyAgICAgMS41ODUxLCAgMS43ODE1LCAgMS45Nzc4LCAgMi4xNzM3LCAgMi4zNzI5LCAgMi41NjY0LCAgMi43NjIwLCAgMi45NDI5LAorICAgICAwLjE5ODgsICAwLjMzMjAsICAwLjQ3NzcsICAwLjY3MzcsICAwLjg0MjUsICAxLjAyNjUsICAxLjE2OTQsICAxLjM2NTUsCisgICAgIDEuNTQ2MywgIDEuNzEzNSwgIDEuOTM4NSwgIDIuMTY1MCwgIDIuMzUyOSwgIDIuNTM2NywgIDIuNzU0NSwgIDIuOTU4NSwKKyAgICAgMC4xMzc2LCAgMC4yNjIwLCAgMC40MjczLCAgMC42MTY5LCAgMC43NzU1LCAgMC45NDQxLCAgMS4xMTY5LCAgMS4zMTU3LAorICAgICAxLjUxNzksICAxLjcwMjAsICAxLjg5MzEsICAyLjEwNTksICAyLjMxMTIsICAyLjUxMzYsICAyLjcxNjksICAyLjkxOTgsCisgICAgIDAuMjExMiwgIDAuNDM4NSwgIDAuNjA5MSwgIDAuNzYxOCwgIDAuOTU1MywgIDEuMTU0MywgIDEuMzQ0NSwgIDEuNTM5NiwKKyAgICAgMS43MTUzLCAgMS45MTkyLCAgMi4xMjYzLCAgMi4zNTkzLCAgMi41OTU4LCAgMi44MTcxLCAgMi45Mzk0LCAgMy4wNDA5LAorICAgICAwLjEzNDcsICAwLjIwOTksICAwLjI2NDYsICAwLjM0NTMsICAwLjUyNjYsICAwLjc4NjksICAxLjA1MTMsICAxLjI3OTUsCisgICAgIDEuNDg4MCwgIDEuNzE4MSwgIDEuOTI5NCwgIDIuMTMzMiwgIDIuMzM2MiwgIDIuNTQ0MiwgIDIuNzQzMywgIDIuOTM2MiwKKyAgICAgMC4zMTQxLCAgMC41OTM1LCAgMC43NTE3LCAgMC44MzEzLCAgMC44NTY4LCAgMC45NTcwLCAgMS4wMjUwLCAgMS4xMjc1LAorICAgICAxLjM0MjIsICAxLjYzMDMsICAxLjg1NzcsICAyLjA3MDUsICAyLjI5NTcsICAyLjUwOTUsICAyLjcyNDQsICAyLjkyNjIsCisgICAgIDAuMDk2MiwgIDAuMjExNiwgIDAuMzk2MSwgIDAuNTY0MSwgIDAuNzEyMiwgIDAuODg4MywgIDEuMTAyMywgIDEuMzQ4MSwKKyAgICAgMS41NjIzLCAgMS43NTU0LCAgMS45NjE4LCAgMi4xNjc1LCAgMi4zNzA2LCAgMi41NTU2LCAgMi43NDMwLCAgMi45MzM3LAorICAgICAwLjA4OTgsICAwLjE1MTAsICAwLjMwNjAsICAwLjU4MjAsICAwLjgyMjEsICAxLjAzODgsICAxLjIyNjEsICAxLjQyODksCisgICAgIDEuNjA1NCwgIDEuODEwMywgIDEuOTk0MSwgIDIuMTg0NCwgIDIuMzc0MiwgIDIuNTcxMSwgIDIuNzYzMiwgIDIuOTQ3NCwKKyAgICAgMC4xMzI2LCAgMC4yMzE2LCAgMC4zNzYxLCAgMC41MTc3LCAgMC42NzgyLCAgMC44NzYxLCAgMS4wOTUyLCAgMS4zMTc1LAorICAgICAxLjUwNzgsICAxLjcwMzQsICAxLjkwNTEsICAyLjEyNDUsICAyLjM0MjQsICAyLjU0ODQsICAyLjc0NDQsICAyLjkzODksCisgICAgIDAuMTc0MCwgIDAuMzI5MywgIDAuNTE3NCwgIDAuNjgyNCwgIDAuODM5NCwgIDEuMDM3MiwgIDEuMjA0NiwgIDEuMzcyMywKKyAgICAgMS41NjU2LCAgMS43NDQ0LCAgMS45NDQyLCAgMi4xMzg2LCAgMi4zMTM5LCAgMi40OTYwLCAgMi43MDcxLCAgMi45Mjk3LAorICAgICAwLjIzMDQsICAwLjM3NzUsICAwLjQ4NjUsICAwLjYxODIsICAwLjc4NDIsICAwLjkyMDgsICAxLjExNTEsICAxLjI4NDMsCisgICAgIDEuNDY0MSwgIDEuNjk4OCwgIDEuOTIwOSwgIDIuMTI2MCwgIDIuMzA5OSwgIDIuNTIyOSwgIDIuNzQxNCwgIDIuOTI3NiwKKyAgICAgMC4wMDk0LCAgMC4wMjYxLCAtMC4wMDM3LCAgMC4wMDQxLCAtMC4wMDkyLCAtMC4wMDQ0LCAtMC4wMjMyLCAtMC4wMDczLAorICAgIC0wLjAwNDcsIC0wLjAwMjEsICAwLjAyNTAsIC0wLjA1ODAsIC0wLjAxNDAsIC0wLjAzNDIsIC0wLjA1ODYsICAwLjAwMjAsCisgICAgIDAuMDQ0OSwgIDAuMDE1NSwgLTAuMDUyMywgLTAuMDI3OSwgIDAuMDI5OSwgLTAuMDE4MywgLTAuMDczNiwgLTAuMDYzOSwKKyAgICAtMC4wMDE3LCAgMC4wMzM2LCAgMC4wMjA5LCAgMC4wMDQ2LCAgMC4wMDc3LCAtMC4wMTQ4LCAtMC4wMTE0LCAtMC4wMTIwLAorICAgICAwLjAxMTUsIC0wLjAwNTAsICAwLjA0NDUsICAwLjAwNDgsICAwLjAxODgsIC0wLjAxMzcsIC0wLjAwODAsICAwLjAyMzksCisgICAgLTAuMDE4NCwgLTAuMDUyNCwgLTAuMDE5NSwgLTAuMDEyNiwgIDAuMDI4NCwgIDAuMDYzMiwgIDAuMDE0MSwgLTAuMDA5MywKKyAgICAtMC4wMDk2LCAgMC4wMTk2LCAgMC4wMjMwLCAgMC4wMzc5LCAgMC4wMzA4LCAgMC4wMjM3LCAtMC4wMjI0LCAtMC4wNjAwLAorICAgIC0wLjA3NTUsIC0wLjEwNzQsIC0wLjA5ODgsIC0wLjA2MDYsIC0wLjEwMzgsIC0wLjE1NTIsIC0wLjE0ODAsIC0wLjA2NzIsCisgICAgIDAuMDUwNCwgIDAuMDY3NiwgIDAuMDMzNiwgLTAuMDA0MiwgIDAuMDcyOSwgIDAuMTAxMywgIDAuMDg2OCwgIDAuMDg0NiwKKyAgICAgMC4wOTU0LCAgMC4wNTE1LCAtMC4wMDY2LCAtMC4wODUxLCAtMC4wNDg1LCAgMC4wMjk0LCAgMC4wMzk1LCAgMC4wMDg3LAorICAgICAwLjAwNzgsICAwLjA0NDYsICAwLjA4ODEsICAwLjA2NzIsIC0wLjAzODQsIC0wLjAwMjUsICAwLjA0MTUsICAwLjAzNTMsCisgICAgIDAuMDA4MCwgIDAuMDA1MiwgIDAuMDE5MCwgIDAuMDE4MiwgIDAuMDA2OSwgIDAuMDE2OCwgIDAuMDM3NCwgIDAuMDAzNywKKyAgICAtMC4wMjkyLCAtMC4wNDI5LCAgMC4wMzAyLCAgMC4wNjgxLCAtMC4wMjMzLCAtMC4wMjM4LCAtMC4wMDAzLCAtMC4wMDQzLAorICAgICAwLjAwNTQsIC0wLjAwMjksIC0wLjAxNDksICAwLjA2NDIsICAwLjA2MjIsICAwLjAzNDEsIC0wLjAyMzIsIC0wLjA0NjEsCisgICAgLTAuMDA4MiwgLTAuMDQ2OSwgLTAuMDYxOCwgLTAuMDMyNiwgLTAuMDQ1MiwgLTAuMDY0OSwgLTAuMDU5NywgLTAuMDM5OCwKKyAgICAtMC4wMzE4LCAtMC4wMTE2LCAgMC4wMDExLCAgMC4wMDA5LCAtMC4wMzg0LCAtMC4wMzg0LCAtMC4wMTU2LCAtMC4wMjYwLAorICAgIC0wLjAwMDcsICAwLjA0NzMsICAwLjAxMTEsIC0wLjAzNTgsIC0wLjA0ODQsIC0wLjAyMDQsIC0wLjAwMjksIC0wLjAwOTAsCisgICAgLTAuMDI4NSwgLTAuMDQ5NSwgLTAuMDM3NiwgIDAuMDkxNywgIDAuMTE5MiwgIDAuMTAyNiwgIDAuMDc0NSwgIDAuMDM5NywKKyAgICAgMC4wNDYzLCAgMC4wMjUzLCAgMC4wMDI1LCAgMC4wNDY1LCAgMC4wMTAwLCAgMC4wNDg4LCAgMC4wNDE2LCAgMC4wMjIzLAorICAgICAwLjAyNjMsICAwLjAwNzIsIC0wLjAwNTMsICAwLjA1OTUsICAwLjAwNjAsIC0wLjA1MTgsIC0wLjAzMTYsIC0wLjAwNDMsCisgICAgLTAuMDEzMywgLTAuMDIzMywgLTAuMDA3NSwgLTAuMDI1MSwgIDAuMDI3NywgLTAuMDA2NywgLTAuMDEzNiwgLTAuMDAwNCwKKyAgICAgMC4wMjM1LCAgMC4wMTEyLCAtMC4wMTgyLCAtMC4wMzI0LCAtMC4wMjEwLCAtMC4wMDM1LCAtMC4wMzk1LCAtMC4wMzg0LAorICAgICAwLjAwMDUsIC0wLjAxNTAsIC0wLjAzNTYsICAwLjAxMjcsIC0wLjAwMzMsIC0wLjAwMzQsICAwLjAyMDUsICAwLjA3NDcsCisgICAgIDAuMTEzOCwgIDAuMTAxNSwgIDAuMDk5NSwgLTAuMDE2MSwgLTAuMDA0NSwgIDAuMDEyOSwgIDAuMDQ3MiwgIDAuMDU3NSwKKyAgICAgMC4wMjIyLCAgMC4wMDkxLCAgMC4wMDM3LCAtMC4wNDcxLCAgMC4wMzcxLCAgMC4wMTMyLCAgMC4wMjA4LCAgMC4wMjQ3LAorICAgICAwLjAxMTcsICAwLjAxNjQsICAwLjAyMjUsICAwLjAxMjQsIC0wLjAwMjMsICAwLjAwODgsIC0wLjAwNDYsICAwLjAwNDcsCisgICAgLTAuMDM5MywgIDAuMDAxOCwgIDAuMDE0OCwgIDAuMDAyMCwgIDAuMDA0NCwgIDAuMDE2NSwgIDAuMDIyOSwgLTAuMDIwOCwKKyAgICAtMC4wNDc3LCAtMC4wMzEwLCAtMC4wMTY0LCAtMC4wMzkwLCAtMC4wNzY0LCAtMC4wNTI1LCAtMC4wMDk0LCAgMC4wMDc1LAorICAgIC0wLjAxMDIsIC0wLjAwNDUsIC0wLjA1MDQsIC0wLjA3MDksICAwLjA4MjIsICAwLjA3MTAsICAwLjA0MjYsICAwLjAwMTQsCisgICAgLTAuMDM3MSwgLTAuMDQwMCwgLTAuMDE1NywgLTAuMDE1NSwgLTAuMDE3MywgLTAuMDEzOCwgLTAuMDAxNSwgIDAuMDEzNCwKKyAgICAtMC4wNDE4LCAtMC4wNjgyLCAtMC4wMjU2LCAgMC4wMDUwLCAgMC4wMzYwLCAgMC4wMzU0LCAgMC4wMDc0LCAtMC4wMzk2LAorICAgIC0wLjAyMzUsICAwLjAyODQsICAwLjA0OTQsICAwLjAxNTMsICAwLjA0NDgsICAwLjAwMjUsIC0wLjAwNjEsICAwLjAyNTIsCisgICAgIDAuMTAwMCwgIDAuMjI2MCwgIDAuMjE1OCwgIDAuMjExNiwgIDAuMjE5OCwgIDAuMjA1NSwgIDAuMjExMCwgIDAuMTg3MywKKyAgICAgMC4xOTA3LCAgMC4yMDcxLCAgMC4yMTY0LCAgMC4yMDA5LCAgMC4yMDU5LCAgMC4yMTI0LCAgMC4yMTQxLCAgMC4yMDkzLAorICAgICAwLjA4NzUsICAwLjA5ODEsICAwLjExNzcsICAwLjEwNzEsICAwLjEwMzMsICAwLjEyNDgsICAwLjEwNDgsICAwLjEyMzgsCisgICAgIDAuMTE2NiwgIDAuMTAwOCwgIDAuMTA2MiwgIDAuMDk5MiwgIDAuMDk5NCwgIDAuMTA2NywgIDAuMDk5OSwgIDAuMTE4NywKKyAgICAgMC4wNzUwLCAgMC4wNzk0LCAgMC4wODI4LCAgMC4wODU0LCAgMC4wODU5LCAgMC4wODAxLCAgMC4wODkxLCAgMC4wOTMzLAorICAgICAwLjA5NjksICAwLjA5MjAsICAwLjA5MTUsICAwLjA4NjIsICAwLjA4NjgsICAwLjA4OTEsICAwLjA4NDIsICAwLjA4MjQsCisgICAgIDAuMDYyNSwgIDAuMDkzMCwgIDAuMDgxNSwgIDAuMDg1MywgIDAuMDg5OCwgIDAuMDgyOCwgIDAuMDgyMiwgIDAuMDkxMCwKKyAgICAgMC4wODczLCAgMC4wOTA2LCAgMC4wODU2LCAgMC4wODQwLCAgMC4wNzc0LCAgMC4wNzg1LCAgMC4wNjg0LCAgMC4wNzExLAorICAgICAwLjMzMTksICAwLjQyMTksICAwLjQ1ODgsICAwLjQwOTAsICAwLjQwOTIsICAwLjQwMTQsICAwLjM1NDgsICAwLjMzNTMsCisgICAgIDAuMzcwOCwgIDAuMzM1MiwgIDAuMzcyMCwgIDAuMzUzOCwgIDAuNDA4NCwgIDAuNDI4OSwgIDAuNDA2MCwgIDAuNDIxMCwKKyAgICAgMC4wNTg4LCAgMC4wMjA5LCAtMC4wMDgyLCAtMC4wMTE1LCAtMC4wMzQzLCAtMC4wNjIxLCAtMC4wNTQxLCAtMC4wMzQ2LAorICAgIC0wLjAzNDYsIC0wLjAzNjYsIC0wLjAyMjAsIC0wLjAyNjUsIC0wLjAxMDIsICAwLjAzNzQsICAwLjAzMDYsICAwLjA0MDQsCisgICAgIDAuMDMwNiwgIDAuMDA5MCwgLTAuMDA1NCwgIDAuMDMzMywgIDAuMDA0NywgIDAuMDIzOCwgIDAuMDE0MSwgIDAuMDE2NSwKKyAgICAgMC4wMzA2LCAgMC4wNDIwLCAgMC4wMTU5LCAgMC4wMTI0LCAgMC4wNDE0LCAgMC4wMTU4LCAtMC4wMjM3LCAgMC4wMTQxLAorICAgICAwLjA3NjUsICAwLjAwNTcsIC0wLjAyNjAsIC0wLjA0MjYsIC0wLjAzOTUsIC0wLjAxMjYsIC0wLjA1NzksIC0wLjA0MTcsCisgICAgLTAuMDQyOSwgLTAuMDYxNSwgLTAuMDg5MywgLTAuMDYxOCwgLTAuMDM4NCwgLTAuMDEzNCwgLTAuMDIzMiwgLTAuMDIzOCwKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBsc3AxNnNbXSA9IHsKKyAgICAgMC4xODEzLCAgMC4zOTExLCAgMC42MzAxLCAgMC44MDEyLCAgMS4wMDU3LCAgMS4yMDQxLCAgMS40MjcxLCAgMS42OTQzLAorICAgICAxLjk0MDIsICAyLjE3MzMsICAyLjM1MjEsICAyLjQ5ODksICAyLjU4MzksICAyLjY4NDYsICAyLjc2MzQsICAyLjg5NTAsCisgICAgIDAuMTMxMSwgIDAuMzE4MywgIDAuNDY1OSwgIDAuNTYwMSwgIDAuNjY1OCwgIDAuNzgyOCwgIDEuMDA2NSwgIDEuMjcxNywKKyAgICAgMS41MTg1LCAgMS43MzM5LCAgMS45NTMwLCAgMi4yMTg5LCAgMi4zNzM5LCAgMi40OTkxLCAgMi42OTg0LCAgMi45MjU2LAorICAgICAwLjE2MjcsICAwLjQ1MTksICAwLjYzMjMsICAwLjcwMTIsICAwLjc4NDgsICAwLjk4MDEsICAxLjE4MTAsICAxLjMyMjIsCisgICAgIDEuNTQxMywgIDEuODEyOSwgIDEuOTMzOCwgIDIuMDgwOSwgIDIuMzE4MCwgIDIuNTE4OSwgIDIuNzA2NiwgIDIuOTUxNCwKKyAgICAgMC4xNDc1LCAgMC4yNDQ3LCAgMC40MjQwLCAgMC41NjY5LCAgMC43ODcyLCAgMC45ODM4LCAgMS4xODIzLCAgMS4zODE0LAorICAgICAxLjUzNTgsICAxLjY4MjAsICAxLjg3OTQsICAyLjE0MTksICAyLjQxMzIsICAyLjYxMTIsICAyLjc5MTEsICAyLjk1MTEsCisgICAgIDAuMTIyNCwgIDAuMjg3NiwgIDAuNTAxMywgIDAuNjk4NSwgIDAuODkwMiwgIDEuMDkwMSwgIDEuMjgzNSwgIDEuNDc2OCwKKyAgICAgMS42NTk2LCAgMS44NTM4LCAgMi4wNDY3LCAgMi4yMzA0LCAgMi40MTI0LCAgMi41OTQyLCAgMi43NzI5LCAgMi45NTMxLAorICAgICAwLjE3NDEsICAwLjMwMzQsICAwLjQ2NzcsICAwLjU4NzksICAwLjcyNTgsICAwLjk2NDgsICAxLjE0MTcsICAxLjMyMjAsCisgICAgIDEuNTA4MSwgIDEuNzE1MSwgIDEuOTIxMiwgIDIuMTI4NiwgIDIuMzIwOCwgIDIuNDkzOCwgIDIuNjc2NSwgIDIuODg5MSwKKyAgICAgMC4xNjU3LCAgMC4zMTc0LCAgMC40OTA3LCAgMC42NTU5LCAgMC44Mjk1LCAgMS4wMjU0LCAgMS4yMDcxLCAgMS4zODgwLAorICAgICAxLjU3MzcsICAxLjc4NDUsICAxLjkwMjcsICAyLjExMzksICAyLjMzMjMsICAyLjUxNTcsICAyLjczMjMsICAyLjkwMTUsCisgICAgIDAuMTU5MiwgIDAuMjc1OCwgIDAuNDQxNywgIDAuNjMxNSwgIDAuODI1NywgIDAuOTg3MywgIDEuMTI3NywgIDEuMjgzMCwKKyAgICAgMS40MzM3LCAgMS42MzE1LCAgMS44ODk5LCAgMi4xMzU2LCAgMi4zNTcyLCAgMi41NjMyLCAgMi43NDY4LCAgMi45NDIwLAorICAgICAwLjE1MjQsICAwLjQzMjUsICAwLjU5MzEsICAwLjcwMzYsICAwLjc2OTYsICAwLjg5MjMsICAxLjE3MzksICAxLjQ3NzMsCisgICAgIDEuNjYwOSwgIDEuNzkxMSwgIDEuOTY2NiwgIDIuMTk3MiwgIDIuMzc1NCwgIDIuNTA0NSwgIDIuNjYxMywgIDIuODg4MiwKKyAgICAgMC4yMTMwLCAgMC4zMDEzLCAgMC4zNzIxLCAgMC40MjU3LCAgMC41MDc5LCAgMC43MDE1LCAgMC45ODE1LCAgMS4yNTU0LAorICAgICAxLjQ2NDgsICAxLjY5NjYsICAxLjkxMzgsICAyLjEwNzUsICAyLjMzMTgsICAyLjUyOTIsICAyLjc0NTMsICAyLjkzNDcsCisgICAgIDAuMTE0MiwgIDAuMzc0OCwgIDAuNjIwNSwgIDAuNzY0MiwgIDAuODEyMSwgIDAuOTAyMiwgIDAuOTg0MywgIDEuMTU1OCwKKyAgICAgMS40NDY3LCAgMS43NDIyLCAgMS45NTc0LCAgMi4xMzAyLCAgMi4zODEyLCAgMi41ODk4LCAgMi43NzIwLCAgMi45NTgzLAorICAgICAwLjEyNTUsICAwLjIzMzksICAwLjM1NzAsICAwLjUzMjMsICAwLjc0NTgsICAxLjAwMDMsICAxLjE3MjksICAxLjM1NjcsCisgICAgIDEuNTIxNywgIDEuNjk3NywgIDEuODkyNCwgIDIuMDk0MiwgIDIuMzE0NSwgIDIuNTQwOCwgIDIuNzU1MywgIDIuOTMzNywKKyAgICAgMC4xMzE2LCAgMC4yMjg5LCAgMC40MzI3LCAgMC42NjYzLCAgMC44NTA5LCAgMC45OTk0LCAgMS4xNjk3LCAgMS4zODA0LAorICAgICAxLjU2MDksICAxLjY5MDMsICAxLjg1NzIsICAyLjEwMTksICAyLjM2ODcsICAyLjU3ODksICAyLjc3MTUsICAyLjk0NzIsCisgICAgIDAuMTUwMiwgIDAuMjU0NiwgIDAuMzg4MywgIDAuNTMzMywgIDAuNjk3NiwgIDAuOTE2MywgIDEuMTA3MSwgIDEuMzM2NCwKKyAgICAgMS41NDIwLCAgMS43NTI1LCAgMS44OTQ4LCAgMi4wODM5LCAgMi4yODE5LCAgMi40NjUxLCAgMi42ODc1LCAgMi44OTg3LAorICAgICAwLjE1OTMsICAwLjMwMTQsICAwLjQ1NzMsICAwLjYzNTQsICAwLjgxNTcsICAwLjk4MDUsICAxLjE3ODMsICAxLjM3NDcsCisgICAgIDEuNTY3OCwgIDEuNzMyNiwgIDEuOTI4NiwgIDIuMTM0MCwgIDIuMzI1MywgIDIuNTI4MCwgIDIuNzE4MCwgIDIuOTI5OCwKKyAgICAgMC4xODExLCAgMC4zMTY3LCAgMC40NjU1LCAgMC42NTA3LCAgMC44MTk4LCAgMS4wMDc1LCAgMS4xODkyLCAgMS4zNzQzLAorICAgICAxLjUyMjcsICAxLjcwOTAsICAxLjg4NDksICAyLjA3NDMsICAyLjI3NTAsICAyLjQ4MzAsICAyLjY4OTYsICAyLjg5NTMsCisgICAgIDAuMTg0NiwgIDAuMzU3NywgIDAuNTMxNSwgIDAuNzI5MCwgIDAuOTE3NiwgIDEuMTAxNiwgIDEuMjY1NCwgIDEuNDUyNSwKKyAgICAgMS42MzE1LCAgMS44MjY4LCAgMi4wMjM4LCAgMi4xOTM0LCAgMi4zODY4LCAgMi41NzUzLCAgMi43NjgyLCAgMi45NDY5LAorICAgICAwLjA4NzYsICAwLjE0MzksICAwLjIwNDgsICAwLjM2NTQsICAwLjYyODEsICAwLjg4NTMsICAxLjA5MDcsICAxLjI5OTIsCisgICAgIDEuNTIyNywgIDEuNzM3MywgIDEuOTM5NSwgIDIuMTQxOSwgIDIuMzQ4OCwgIDIuNTQ4NiwgIDIuNzQ2NiwgIDIuOTM0OCwKKyAgICAgMC4xMzkxLCAgMC40MTcwLCAgMC42NTYxLCAgMC43OTUzLCAgMC44NzM0LCAgMC45OTg2LCAgMS4xODcwLCAgMS40NTIwLAorICAgICAxLjYwNDIsICAxLjc5MTAsICAyLjAxMzUsICAyLjE4NzAsICAyLjMzNTgsICAyLjUwNjYsICAyLjc0MDksICAyLjk5NTUsCisgICAgIDAuMDgwNCwgIDAuMTM1NSwgIDAuMjU5OSwgIDAuNDk5OCwgIDAuNzQwOCwgIDAuOTQ3NCwgIDEuMTI3NiwgIDEuMzQyOCwKKyAgICAgMS41NTU2LCAgMS43NzEyLCAgMS45Njk5LCAgMi4xNTM1LCAgMi4zNjA1LCAgMi41NTQ4LCAgMi43NDg5LCAgMi45MzI1LAorICAgICAwLjEzMDQsICAwLjMwODcsICAwLjQ5NzksICAwLjY1ODQsICAwLjg0MTQsICAxLjAzMjksICAxLjIyNDQsICAxLjQxODksCisgICAgIDEuNjExOCwgIDEuODIwMCwgIDEuOTk4NSwgIDIuMTg5MywgIDIuMzkxNSwgIDIuNTc5NCwgIDIuNzY0NywgIDIuOTM0NCwKKyAgICAgMC4xODk1LCAgMC4yODQ5LCAgMC4zNzA1LCAgMC40MTI2LCAgMC42MjY1LCAgMC45MjA3LCAgMS4xNzc0LCAgMS4zNzYyLAorICAgICAxLjU3NTcsICAxLjc3MjgsICAxLjk1NjgsICAyLjE2NjIsICAyLjM2MTUsICAyLjU1NzUsICAyLjc1NjEsICAyLjk0MTYsCisgICAgIDAuMTgwMCwgIDAuMzA3OCwgIDAuNDgwNSwgIDAuNjc5NiwgIDAuODUwMywgIDEuMDA0NiwgIDEuMTcwMywgIDEuMzI2OSwKKyAgICAgMS40ODYyLCAgMS42NTAyLCAgMS44NDU0LCAgMi4wODczLCAgMi4zMTc1LCAgMi41MzU2LCAgMi43NTE2LCAgMi45NDY5LAorICAgICAwLjE5NTAsICAwLjMyMzMsICAwLjQ1NjgsICAwLjU5NDAsICAwLjc1ODksICAwLjk5NzgsICAxLjE3MDEsICAxLjMzODMsCisgICAgIDEuNTAxNywgIDEuNjU2NSwgIDEuODI0MywgIDIuMDYwNSwgIDIuMjkzOCwgIDIuNTE0NywgIDIuNzQxOSwgIDIuOTM5NiwKKyAgICAgMC4yNTMxLCAgMC40MzkxLCAgMC41NzkwLCAgMC43MTcwLCAgMC44OTk4LCAgMS4xNDMwLCAgMS4zNTc3LCAgMS41MzI2LAorICAgICAxLjYzMjgsICAxLjc2MjcsICAxLjk3MjYsICAyLjE3NjIsICAyLjM1NjMsICAyLjU0NzgsICAyLjczODUsICAyLjkwNjcsCisgICAgIDAuMTgwNSwgIDAuMjc4OCwgIDAuMzU5MSwgIDAuMzg4MSwgIDAuNTQ0MSwgIDAuODA1NSwgIDEuMDc2NiwgIDEuMzE2NSwKKyAgICAgMS41MzE2LCAgMS43NTA4LCAgMS45NDc3LCAgMi4xMzc0LCAgMi4zNDM4LCAgMi41NDg0LCAgMi43NTAxLCAgMi45NDEwLAorICAgICAwLjIwNDQsICAwLjM2NzEsICAwLjUzOTYsICAwLjcwNDIsICAwLjg1ODIsICAwLjk4MzEsICAxLjEyNjEsICAxLjMxOTQsCisgICAgIDEuNDc2OSwgIDEuNjk3OSwgIDEuODcxNywgIDIuMDQ2MywgIDIuMjYyMCwgIDIuNDczOSwgIDIuNzA1NCwgIDIuOTIwOCwKKyAgICAgMC4xMDQ4LCAgMC4yMTc1LCAgMC40MjA2LCAgMC41OTIzLCAgMC43NDgzLCAgMC45NDAwLCAgMS4xMzU2LCAgMS4zNzk5LAorICAgICAxLjU5NTgsICAxLjczMjAsICAxLjg5ODQsICAyLjEyOTYsICAyLjM1OTQsICAyLjU0OTIsICAyLjczODcsICAyLjkzMDUsCisgICAgIDAuMDg0MiwgIDAuMTcyOSwgIDAuMzk1MSwgIDAuNjQ0NywgIDAuODY4OCwgIDEuMDYwNSwgIDEuMjQ3MiwgIDEuNDMzMCwKKyAgICAgMS42MjMyLCAgMS44MTQ0LCAgMi4wMjE2LCAgMi4xOTE1LCAgMi4zODc4LCAgMi41NzYzLCAgMi43Njg1LCAgMi45NDY0LAorICAgICAwLjE0NjEsICAwLjI1OTMsICAwLjQxMDUsICAwLjU2NzcsICAwLjczMjgsICAwLjg5MTksICAxLjA0ODQsICAxLjIzMDIsCisgICAgIDEuNDM4NiwgIDEuNjYzNSwgIDEuODg3MywgIDIuMTAyNCwgIDIuMzExNiwgIDIuNTI2OCwgIDIuNzI3MywgIDIuOTI2OSwKKyAgICAgMC4xNTAzLCAgMC4zMTA4LCAgMC40NzU2LCAgMC42NzMxLCAgMC44NjAwLCAgMS4wMjMzLCAgMS4yMTE1LCAgMS4zOTcxLAorICAgICAxLjU5MTUsICAxLjc4OTIsICAxLjk1MTcsICAyLjE2MDMsICAyLjM0ODcsICAyLjU0NjAsICAyLjczMDgsICAyLjg5OTgsCisgICAgIDAuMjE2MywgIDAuMzY2OSwgIDAuNTEyNSwgIDAuNjcwOSwgIDAuODE0MywgIDAuOTkzMCwgIDEuMjA5NSwgIDEuNDIwNSwKKyAgICAgMS42MTc2LCAgMS43MTEyLCAgMS44Mzk4LCAgMi4wODk2LCAgMi4zNTEzLCAgMi41MjkwLCAgMi42NjY3LCAgMi44OTYwLAorICAgICAwLjIxMzMsICAwLjQzODIsICAwLjYyODcsICAwLjg3MDIsICAxLjEwODgsICAxLjM3NDksICAxLjYwNjIsICAxLjc0NDYsCisgICAgIDEuODMzMywgIDEuOTEyMiwgIDEuOTYxNCwgIDIuMDY2OSwgIDIuMTc4OSwgIDIuMzQ0OSwgIDIuNjAzOCwgIDIuODg0OSwKKyAgICAgMC4xNTk4LCAgMC4yNzE5LCAgMC4zODc3LCAgMC40ODE1LCAgMC41OTI2LCAgMC43Nzk1LCAgMS4wNDQ5LCAgMS4zMDQ1LAorICAgICAxLjUyMTAsICAxLjczOTEsICAxLjk0NjIsICAyLjEzOTcsICAyLjM1NTMsICAyLjU0NTgsICAyLjc1NDAsICAyLjkzOTIsCisgICAgIDAuMjkxOCwgIDAuNTYwNywgIDAuNjgwMSwgIDAuNzQwNCwgIDAuODI4NSwgIDAuOTQzMSwgIDEuMTU3OSwgIDEuNDA4MCwKKyAgICAgMS42MzMyLCAgMS44NDcyLCAgMS45NzM4LCAgMi4wNzcxLCAgMi4yODkwLCAgMi41MTc4LCAgMi43NDQ1LCAgMi45ODMwLAorICAgICAwLjE2NjQsICAwLjI4NDIsICAwLjM5NjUsICAwLjU0NjMsICAwLjgxNjIsICAxLjAzNDYsICAxLjE4NDksICAxLjM0NDYsCisgICAgIDEuNTEyMiwgIDEuNzU2MywgIDEuOTk2MCwgIDIuMjAwMiwgIDIuMzc5NiwgIDIuNTY4OSwgIDIuNzcxMiwgIDIuOTU1MCwKKyAgICAgMC4wOTExLCAgMC4yMzk3LCAgMC41MDUyLCAgMC43ODY4LCAgMS4wMjk5LCAgMS4xMzExLCAgMS4yMjQ0LCAgMS4zMzMzLAorICAgICAxLjQzOTUsICAxLjY3OTAsICAxLjkzNjksICAyLjE3MTcsICAyLjM2ODksICAyLjU1MzgsICAyLjczNDAsICAyLjkzMjYsCisgICAgIDAuMTY0NywgIDAuMjkzMSwgIDAuMzgzNiwgIDAuNDk3OCwgIDAuNjI1NSwgIDAuOTI0MywgIDEuMTMzOSwgIDEuMzAwMSwKKyAgICAgMS41MjY5LCAgMS44MDEwLCAgMS45NzE1LCAgMi4xNDE5LCAgMi4zNzg0LCAgMi41NTAzLCAgMi42NzE5LCAgMi44NzQ1LAorICAgICAwLjI0NDAsICAwLjM4MDIsICAwLjQ3NTYsICAwLjY2MTMsICAwLjg2MjcsICAxLjAyOTIsICAxLjIyOTEsICAxLjQwNjAsCisgICAgIDEuNTE5OCwgIDEuNzM1NCwgIDEuOTA0NCwgIDIuMTAxMCwgIDIuMzE0NywgIDIuNDk5NiwgIDIuNzE3MSwgIDIuOTA0MSwKKyAgICAgMC4xNTkwLCAgMC4yODc2LCAgMC40NTcyLCAgMC41OTk2LCAgMC43NzEzLCAgMC45NDkwLCAgMS4xMjA1LCAgMS4yODE1LAorICAgICAxLjQ1MTYsICAxLjYzODUsICAxLjgxNzksICAyLjA0NTcsICAyLjI3NTksICAyLjQ3ODUsICAyLjY4NjEsICAyLjkwODAsCisgICAgIDAuMjI5NywgIDAuNDMwOSwgIDAuNTcxMiwgIDAuNjcxNywgIDAuODEzOCwgIDEuMDQ2MywgIDEuMjQ5MiwgIDEuNDU2MCwKKyAgICAgMS42Nzk2LCAgMS44NDU4LCAgMS45NjQyLCAgMi4xNDUyLCAgMi4zNjM2LCAgMi41Mzk1LCAgMi43NDU2LCAgMi45NDk1LAorICAgICAwLjI5NzUsICAwLjQ2NzgsICAwLjQ5OTYsICAwLjU4MDksICAwLjYyNzksICAwLjY4ODQsICAwLjg2MDYsICAxLjEzODYsCisgICAgIDEuNDQxMiwgIDEuNjg3NiwgIDEuODc2MCwgIDIuMDkzMiwgIDIuMzE3OCwgIDIuNTE2NiwgIDIuNzM0NSwgIDIuOTI4MCwKKyAgICAgMC4xMjc4LCAgMC4zNzM3LCAgMC42MDA0LCAgMC43MDY5LCAgMC44MTQ3LCAgMS4wMTgwLCAgMS4yNTgxLCAgMS4zODEyLAorICAgICAxLjQ4NTUsICAxLjcyNjgsICAxLjk5NzAsICAyLjEyNTgsICAyLjI5MzYsICAyLjU3MDIsICAyLjc1NjMsICAyLjg5ODMsCisgICAgIDAuMTMxNCwgIDAuMjUwOCwgIDAuMzk5OSwgIDAuNTY4MCwgIDAuNzQyNCwgIDAuOTM2NywgIDEuMTI4NiwgIDEuMzE3NSwKKyAgICAgMS41MzM2LCAgMS43NDA0LCAgMS45MzE3LCAgMi4xNDA0LCAgMi4zNTE0LCAgMi41NTYyLCAgMi43NTEwLCAgMi45NDAyLAorICAgICAwLjEwNDMsICAwLjIzNjcsICAwLjQyOTMsICAwLjYzNzYsICAwLjgxNjAsICAwLjk4MzYsICAxLjE3NzksICAxLjM4NTAsCisgICAgIDEuNTgzNSwgIDEuNzg3NSwgIDEuOTc2NSwgIDIuMTU5MywgIDIuMzY1NCwgIDIuNTU3NywgIDIuNzQ2NSwgIDIuOTM5OCwKKyAgICAgMC4xNTI5LCAgMC4yNTE1LCAgMC4zNDU0LCAgMC40Mzc0LCAgMC43MDExLCAgMC45MDE1LCAgMS4wNzQ0LCAgMS4zNTMyLAorICAgICAxLjU2OTksICAxLjc1NDUsICAyLjAwMjEsICAyLjEyNTksICAyLjIyNzgsICAyLjQ1NDYsICAyLjcyNjQsICAyLjk0MjUsCisgICAgIDAuMTQyOSwgIDAuMjgwOCwgIDAuNDM5NSwgIDAuNjMzNCwgIDAuODA2OSwgIDAuOTcwNSwgIDEuMTUyMCwgIDEuMzI1MCwKKyAgICAgMS41MTA5LCAgMS43Mjg1LCAgMS45MzU2LCAgMi4xNDY5LCAgMi4zNDc5LCAgMi41NTU0LCAgMi43NTEyLCAgMi45MzQ4LAorICAgICAwLjE2MjUsICAwLjMwMjIsICAwLjQ3NTYsICAwLjYzMTUsICAwLjgwMzIsICAwLjk5MjQsICAxLjE1OTYsICAxLjMyMDQsCisgICAgIDEuNDk5NCwgIDEuNjkyOSwgIDEuODk1NSwgIDIuMTA5MCwgIDIuMzAyNSwgIDIuNTAxOCwgIDIuNjkwOCwgIDIuODk4MCwKKyAgICAgMC4xNjkyLCAgMC4zNDI3LCAgMC41MjI4LCAgMC43NzU2LCAgMC45Njg4LCAgMS4wOTUwLCAgMS4zMDU2LCAgMS40MzYwLAorICAgICAxLjU2NzUsICAxLjgwNDksICAxLjkzNzYsICAyLjExNTEsICAyLjM0MDcsICAyLjUwMTIsICAyLjcxOTIsICAyLjkyNTgsCisgICAgIDAuMDQ3NCwgIDAuMTI1MSwgIDAuMTkzOSwgIDAuMzg0MSwgIDAuNjUwMSwgIDAuOTIzMSwgIDEuMTE1MywgIDEuMzI0MCwKKyAgICAgMS41NDc4LCAgMS43NTk5LCAgMS45NjUxLCAgMi4xNTEwLCAgMi4zNjQ1LCAgMi41NTUyLCAgMi43NTQyLCAgMi45MzkzLAorICAgICAwLjIxOTYsICAwLjQ2NTYsICAwLjc0OTIsICAwLjk5MjIsICAxLjE2NzgsICAxLjI0ODksICAxLjMxMTIsICAxLjM2NTcsCisgICAgIDEuNDIyMywgIDEuNTMwMiwgIDEuNzIxMiwgIDEuOTk5NiwgIDIuMjUyMywgIDIuNDg0NCwgIDIuNzAzNiwgIDIuOTE0NSwKKyAgICAgMC4xMTI4LCAgMC4yMzY4LCAgMC4zNzA0LCAgMC41NDc2LCAgMC43NzIzLCAgMC45OTY4LCAgMS4xOTMwLCAgMS4zOTkyLAorICAgICAxLjYwMTMsICAxLjc5NTcsICAxLjk4ODgsICAyLjE4NTcsICAyLjM4MjUsICAyLjU3MDUsICAyLjc2MTYsICAyLjk0MzQsCisgICAgIDAuMTM0MSwgIDAuMjc2OCwgIDAuNDUxMCwgIDAuNjM1OSwgIDAuODMzMiwgIDEuMDMzNSwgIDEuMjAwNCwgIDEuMzk1MiwKKyAgICAgMS41NzYyLCAgMS43NjgxLCAgMS45ODE1LCAgMi4xNzM1LCAgMi4zNjU3LCAgMi41NTUyLCAgMi43NTE0LCAgMi45NDk4LAorICAgICAwLjEyNDcsICAwLjI1NTksICAwLjM1MTYsICAwLjQ3MjYsICAwLjY4NjEsICAwLjk0ODMsICAxLjE4NTIsICAxLjM4NTgsCisgICAgIDEuNTg1MSwgIDEuNzgxNSwgIDEuOTc3OCwgIDIuMTczNywgIDIuMzcyOSwgIDIuNTY2NCwgIDIuNzYyMCwgIDIuOTQyOSwKKyAgICAgMC4xOTg4LCAgMC4zMzIwLCAgMC40Nzc3LCAgMC42NzM3LCAgMC44NDI1LCAgMS4wMjY1LCAgMS4xNjk0LCAgMS4zNjU1LAorICAgICAxLjU0NjMsICAxLjcxMzUsICAxLjkzODUsICAyLjE2NTAsICAyLjM1MjksICAyLjUzNjcsICAyLjc1NDUsICAyLjk1ODUsCisgICAgIDAuMTM3NiwgIDAuMjYyMCwgIDAuNDI3MywgIDAuNjE2OSwgIDAuNzc1NSwgIDAuOTQ0MSwgIDEuMTE2OSwgIDEuMzE1NywKKyAgICAgMS41MTc5LCAgMS43MDIwLCAgMS44OTMxLCAgMi4xMDU5LCAgMi4zMTEyLCAgMi41MTM2LCAgMi43MTY5LCAgMi45MTk4LAorICAgICAwLjIxMTIsICAwLjQzODUsICAwLjYwOTEsICAwLjc2MTgsICAwLjk1NTMsICAxLjE1NDMsICAxLjM0NDUsICAxLjUzOTYsCisgICAgIDEuNzE1MywgIDEuOTE5MiwgIDIuMTI2MywgIDIuMzU5MywgIDIuNTk1OCwgIDIuODE3MSwgIDIuOTM5NCwgIDMuMDQwOSwKKyAgICAgMC4xMzQ3LCAgMC4yMDk5LCAgMC4yNjQ2LCAgMC4zNDUzLCAgMC41MjY2LCAgMC43ODY5LCAgMS4wNTEzLCAgMS4yNzk1LAorICAgICAxLjQ4ODAsICAxLjcxODEsICAxLjkyOTQsICAyLjEzMzIsICAyLjMzNjIsICAyLjU0NDIsICAyLjc0MzMsICAyLjkzNjIsCisgICAgIDAuMzE0MSwgIDAuNTkzNSwgIDAuNzUxNywgIDAuODMxMywgIDAuODU2OCwgIDAuOTU3MCwgIDEuMDI1MCwgIDEuMTI3NSwKKyAgICAgMS4zNDIyLCAgMS42MzAzLCAgMS44NTc3LCAgMi4wNzA1LCAgMi4yOTU3LCAgMi41MDk1LCAgMi43MjQ0LCAgMi45MjYyLAorICAgICAwLjA5NjIsICAwLjIxMTYsICAwLjM5NjEsICAwLjU2NDEsICAwLjcxMjIsICAwLjg4ODMsICAxLjEwMjMsICAxLjM0ODEsCisgICAgIDEuNTYyMywgIDEuNzU1NCwgIDEuOTYxOCwgIDIuMTY3NSwgIDIuMzcwNiwgIDIuNTU1NiwgIDIuNzQzMCwgIDIuOTMzNywKKyAgICAgMC4wODk4LCAgMC4xNTEwLCAgMC4zMDYwLCAgMC41ODIwLCAgMC44MjIxLCAgMS4wMzg4LCAgMS4yMjYxLCAgMS40Mjg5LAorICAgICAxLjYwNTQsICAxLjgxMDMsICAxLjk5NDEsICAyLjE4NDQsICAyLjM3NDIsICAyLjU3MTEsICAyLjc2MzIsICAyLjk0NzQsCisgICAgIDAuMTMyNiwgIDAuMjMxNiwgIDAuMzc2MSwgIDAuNTE3NywgIDAuNjc4MiwgIDAuODc2MSwgIDEuMDk1MiwgIDEuMzE3NSwKKyAgICAgMS41MDc4LCAgMS43MDM0LCAgMS45MDUxLCAgMi4xMjQ1LCAgMi4zNDI0LCAgMi41NDg0LCAgMi43NDQ0LCAgMi45Mzg5LAorICAgICAwLjE3NDAsICAwLjMyOTMsICAwLjUxNzQsICAwLjY4MjQsICAwLjgzOTQsICAxLjAzNzIsICAxLjIwNDYsICAxLjM3MjMsCisgICAgIDEuNTY1NiwgIDEuNzQ0NCwgIDEuOTQ0MiwgIDIuMTM4NiwgIDIuMzEzOSwgIDIuNDk2MCwgIDIuNzA3MSwgIDIuOTI5NywKKyAgICAgMC4yMzA0LCAgMC4zNzc1LCAgMC40ODY1LCAgMC42MTgyLCAgMC43ODQyLCAgMC45MjA4LCAgMS4xMTUxLCAgMS4yODQzLAorICAgICAxLjQ2NDEsICAxLjY5ODgsICAxLjkyMDksICAyLjEyNjAsICAyLjMwOTksICAyLjUyMjksICAyLjc0MTQsICAyLjkyNzYsCisgICAgIDAuMDA5NCwgIDAuMDI2MSwgLTAuMDAzNywgIDAuMDA0MSwgLTAuMDA5MiwgLTAuMDA0NCwgLTAuMDIzMiwgLTAuMDA3MywKKyAgICAtMC4wMDQ3LCAtMC4wMDIxLCAgMC4wMjUwLCAtMC4wNTgwLCAtMC4wMTQwLCAtMC4wMzQyLCAtMC4wNTg2LCAgMC4wMDIwLAorICAgICAwLjA0NDksICAwLjAxNTUsIC0wLjA1MjMsIC0wLjAyNzksICAwLjAyOTksIC0wLjAxODMsIC0wLjA3MzYsIC0wLjA2MzksCisgICAgLTAuMDAxNywgIDAuMDMzNiwgIDAuMDIwOSwgIDAuMDA0NiwgIDAuMDA3NywgLTAuMDE0OCwgLTAuMDExNCwgLTAuMDEyMCwKKyAgICAgMC4wMTE1LCAtMC4wMDUwLCAgMC4wNDQ1LCAgMC4wMDQ4LCAgMC4wMTg4LCAtMC4wMTM3LCAtMC4wMDgwLCAgMC4wMjM5LAorICAgIC0wLjAxODQsIC0wLjA1MjQsIC0wLjAxOTUsIC0wLjAxMjYsICAwLjAyODQsICAwLjA2MzIsICAwLjAxNDEsIC0wLjAwOTMsCisgICAgLTAuMDA5NiwgIDAuMDE5NiwgIDAuMDIzMCwgIDAuMDM3OSwgIDAuMDMwOCwgIDAuMDIzNywgLTAuMDIyNCwgLTAuMDYwMCwKKyAgICAtMC4wNzU1LCAtMC4xMDc0LCAtMC4wOTg4LCAtMC4wNjA2LCAtMC4xMDM4LCAtMC4xNTUyLCAtMC4xNDgwLCAtMC4wNjcyLAorICAgICAwLjA1MDQsICAwLjA2NzYsICAwLjAzMzYsIC0wLjAwNDIsICAwLjA3MjksICAwLjEwMTMsICAwLjA4NjgsICAwLjA4NDYsCisgICAgIDAuMDk1NCwgIDAuMDUxNSwgLTAuMDA2NiwgLTAuMDg1MSwgLTAuMDQ4NSwgIDAuMDI5NCwgIDAuMDM5NSwgIDAuMDA4NywKKyAgICAgMC4wMDc4LCAgMC4wNDQ2LCAgMC4wODgxLCAgMC4wNjcyLCAtMC4wMzg0LCAtMC4wMDI1LCAgMC4wNDE1LCAgMC4wMzUzLAorICAgICAwLjAwODAsICAwLjAwNTIsICAwLjAxOTAsICAwLjAxODIsICAwLjAwNjksICAwLjAxNjgsICAwLjAzNzQsICAwLjAwMzcsCisgICAgLTAuMDI5MiwgLTAuMDQyOSwgIDAuMDMwMiwgIDAuMDY4MSwgLTAuMDIzMywgLTAuMDIzOCwgLTAuMDAwMywgLTAuMDA0MywKKyAgICAgMC4wMDU0LCAtMC4wMDI5LCAtMC4wMTQ5LCAgMC4wNjQyLCAgMC4wNjIyLCAgMC4wMzQxLCAtMC4wMjMyLCAtMC4wNDYxLAorICAgIC0wLjAwODIsIC0wLjA0NjksIC0wLjA2MTgsIC0wLjAzMjYsIC0wLjA0NTIsIC0wLjA2NDksIC0wLjA1OTcsIC0wLjAzOTgsCisgICAgLTAuMDMxOCwgLTAuMDExNiwgIDAuMDAxMSwgIDAuMDAwOSwgLTAuMDM4NCwgLTAuMDM4NCwgLTAuMDE1NiwgLTAuMDI2MCwKKyAgICAtMC4wMDA3LCAgMC4wNDczLCAgMC4wMTExLCAtMC4wMzU4LCAtMC4wNDg0LCAtMC4wMjA0LCAtMC4wMDI5LCAtMC4wMDkwLAorICAgIC0wLjAyODUsIC0wLjA0OTUsIC0wLjAzNzYsICAwLjA5MTcsICAwLjExOTIsICAwLjEwMjYsICAwLjA3NDUsICAwLjAzOTcsCisgICAgIDAuMDQ2MywgIDAuMDI1MywgIDAuMDAyNSwgIDAuMDQ2NSwgIDAuMDEwMCwgIDAuMDQ4OCwgIDAuMDQxNiwgIDAuMDIyMywKKyAgICAgMC4wMjYzLCAgMC4wMDcyLCAtMC4wMDUzLCAgMC4wNTk1LCAgMC4wMDYwLCAtMC4wNTE4LCAtMC4wMzE2LCAtMC4wMDQzLAorICAgIC0wLjAxMzMsIC0wLjAyMzMsIC0wLjAwNzUsIC0wLjAyNTEsICAwLjAyNzcsIC0wLjAwNjcsIC0wLjAxMzYsIC0wLjAwMDQsCisgICAgIDAuMDIzNSwgIDAuMDExMiwgLTAuMDE4MiwgLTAuMDMyNCwgLTAuMDIxMCwgLTAuMDAzNSwgLTAuMDM5NSwgLTAuMDM4NCwKKyAgICAgMC4wMDA1LCAtMC4wMTUwLCAtMC4wMzU2LCAgMC4wMTI3LCAtMC4wMDMzLCAtMC4wMDM0LCAgMC4wMjA1LCAgMC4wNzQ3LAorICAgICAwLjExMzgsICAwLjEwMTUsICAwLjA5OTUsIC0wLjAxNjEsIC0wLjAwNDUsICAwLjAxMjksICAwLjA0NzIsICAwLjA1NzUsCisgICAgIDAuMDIyMiwgIDAuMDA5MSwgIDAuMDAzNywgLTAuMDQ3MSwgIDAuMDM3MSwgIDAuMDEzMiwgIDAuMDIwOCwgIDAuMDI0NywKKyAgICAgMC4wMTE3LCAgMC4wMTY0LCAgMC4wMjI1LCAgMC4wMTI0LCAtMC4wMDIzLCAgMC4wMDg4LCAtMC4wMDQ2LCAgMC4wMDQ3LAorICAgIC0wLjAzOTMsICAwLjAwMTgsICAwLjAxNDgsICAwLjAwMjAsICAwLjAwNDQsICAwLjAxNjUsICAwLjAyMjksIC0wLjAyMDgsCisgICAgLTAuMDQ3NywgLTAuMDMxMCwgLTAuMDE2NCwgLTAuMDM5MCwgLTAuMDc2NCwgLTAuMDUyNSwgLTAuMDA5NCwgIDAuMDA3NSwKKyAgICAtMC4wMTAyLCAtMC4wMDQ1LCAtMC4wNTA0LCAtMC4wNzA5LCAgMC4wODIyLCAgMC4wNzEwLCAgMC4wNDI2LCAgMC4wMDE0LAorICAgIC0wLjAzNzEsIC0wLjA0MDAsIC0wLjAxNTcsIC0wLjAxNTUsIC0wLjAxNzMsIC0wLjAxMzgsIC0wLjAwMTUsICAwLjAxMzQsCisgICAgLTAuMDQxOCwgLTAuMDY4MiwgLTAuMDI1NiwgIDAuMDA1MCwgIDAuMDM2MCwgIDAuMDM1NCwgIDAuMDA3NCwgLTAuMDM5NiwKKyAgICAtMC4wMjM1LCAgMC4wMjg0LCAgMC4wNDk0LCAgMC4wMTUzLCAgMC4wNDQ4LCAgMC4wMDI1LCAtMC4wMDYxLCAgMC4wMjUyLAorICAgICAwLjEwMDAsICAwLjIyNjAsICAwLjIxNTgsICAwLjIxMTYsICAwLjIxOTgsICAwLjIwNTUsICAwLjIxMTAsICAwLjE4NzMsCisgICAgIDAuMTkwNywgIDAuMjA3MSwgIDAuMjE2NCwgIDAuMjAwOSwgIDAuMjA1OSwgIDAuMjEyNCwgIDAuMjE0MSwgIDAuMjA5MywKKyAgICAgMC4wODc1LCAgMC4wOTgxLCAgMC4xMTc3LCAgMC4xMDcxLCAgMC4xMDMzLCAgMC4xMjQ4LCAgMC4xMDQ4LCAgMC4xMjM4LAorICAgICAwLjExNjYsICAwLjEwMDgsICAwLjEwNjIsICAwLjA5OTIsICAwLjA5OTQsICAwLjEwNjcsICAwLjA5OTksICAwLjExODcsCisgICAgIDAuMDc1MCwgIDAuMDc5NCwgIDAuMDgyOCwgIDAuMDg1NCwgIDAuMDg1OSwgIDAuMDgwMSwgIDAuMDg5MSwgIDAuMDkzMywKKyAgICAgMC4wOTY5LCAgMC4wOTIwLCAgMC4wOTE1LCAgMC4wODYyLCAgMC4wODY4LCAgMC4wODkxLCAgMC4wODQyLCAgMC4wODI0LAorICAgICAwLjA2MjUsICAwLjA5MzAsICAwLjA4MTUsICAwLjA4NTMsICAwLjA4OTgsICAwLjA4MjgsICAwLjA4MjIsICAwLjA5MTAsCisgICAgIDAuMDg3MywgIDAuMDkwNiwgIDAuMDg1NiwgIDAuMDg0MCwgIDAuMDc3NCwgIDAuMDc4NSwgIDAuMDY4NCwgIDAuMDcxMSwKKyAgICAgMC4zMzE5LCAgMC40MjE5LCAgMC40NTg4LCAgMC40MDkwLCAgMC40MDkyLCAgMC40MDE0LCAgMC4zNTQ4LCAgMC4zMzUzLAorICAgICAwLjM3MDgsICAwLjMzNTIsICAwLjM3MjAsICAwLjM1MzgsICAwLjQwODQsICAwLjQyODksICAwLjQwNjAsICAwLjQyMTAsCisgICAgIDAuMDU4OCwgIDAuMDIwOSwgLTAuMDA4MiwgLTAuMDExNSwgLTAuMDM0MywgLTAuMDYyMSwgLTAuMDU0MSwgLTAuMDM0NiwKKyAgICAtMC4wMzQ2LCAtMC4wMzY2LCAtMC4wMjIwLCAtMC4wMjY1LCAtMC4wMTAyLCAgMC4wMzc0LCAgMC4wMzA2LCAgMC4wNDA0LAorICAgICAwLjAzMDYsICAwLjAwOTAsIC0wLjAwNTQsICAwLjAzMzMsICAwLjAwNDcsICAwLjAyMzgsICAwLjAxNDEsICAwLjAxNjUsCisgICAgIDAuMDMwNiwgIDAuMDQyMCwgIDAuMDE1OSwgIDAuMDEyNCwgIDAuMDQxNCwgIDAuMDE1OCwgLTAuMDIzNywgIDAuMDE0MSwKKyAgICAgMC4wNzY1LCAgMC4wMDU3LCAtMC4wMjYwLCAtMC4wNDI2LCAtMC4wMzk1LCAtMC4wMTI2LCAtMC4wNTc5LCAtMC4wNDE3LAorICAgIC0wLjA0MjksIC0wLjA2MTUsIC0wLjA4OTMsIC0wLjA2MTgsIC0wLjAzODQsIC0wLjAxMzQsIC0wLjAyMzIsIC0wLjAyMzgsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgbHNwMjJbXSA9IHsKKyAgICAgMC4wNjY0LCAgMC4xODc1LCAgMC40MzAwLCAgMC42NzMwLCAgMC44NzkzLCAgMS4wNjQwLCAgMS4yNTYzLCAgMS40NDMzLAorICAgICAxLjYzOTQsICAxLjgxNzYsICAyLjAwMjksICAyLjE5MjEsICAyLjM3OTYsICAyLjU2NzEsICAyLjc1OTUsICAyLjk1MzYsCisgICAgIDAuMjEyOCwgIDAuNDA1MiwgIDAuNTMxMSwgIDAuNjQwNCwgIDAuNzg3NSwgIDAuODc3NSwgIDEuMDk3NCwgIDEuMzI2MSwKKyAgICAgMS41NTYzLCAgMS42NzkwLCAgMS44MzM5LCAgMi4xMTk1LCAgMi4zMjI2LCAgMi40NjA5LCAgMi42NDQwLCAgMi44OTQ3LAorICAgICAwLjIwMjQsICAwLjMzNjIsICAwLjQ4MzQsICAwLjY3ODQsICAwLjkwODgsICAxLjA4NTAsICAxLjIxODgsICAxLjQwNTQsCisgICAgIDEuNjEwMiwgIDEuNzc2NywgIDEuOTY3OSwgIDIuMTQzNiwgIDIuMzQ0NSwgIDIuNTQ2NywgIDIuNzQyOSwgIDIuOTMyMCwKKyAgICAgMC4xMTgxLCAgMC4yMjc5LCAgMC40NDEzLCAgMC42MTE0LCAgMC43NzEwLCAgMC45NDI3LCAgMS4xMTQyLCAgMS4yNzA3LAorICAgICAxLjQ4OTIsICAxLjc0MTYsICAxLjk1MjYsICAyLjE0NjYsICAyLjM2MjksICAyLjU0NDUsICAyLjcyOTMsICAyLjkyMDUsCisgICAgIDAuMTE1NSwgIDAuMjcyMCwgIDAuNDg4NiwgIDAuNjgxMiwgIDAuODU5NCwgIDEuMDQyMiwgIDEuMjMxNSwgIDEuNDExNiwKKyAgICAgMS42MTM3LCAgMS44MDIwLCAgMS45NzU4LCAgMi4xNzQzLCAgMi4zNjAyLCAgMi41NTY4LCAgMi43NDcyLCAgMi45Mzc0LAorICAgICAwLjExMTAsICAwLjMzMTIsICAwLjQ3MzUsICAwLjU2MTIsICAwLjcxMjksICAwLjgxNDYsICAxLjAyMzMsICAxLjMxNTUsCisgICAgIDEuNTc2NSwgIDEuNzc0NiwgIDEuOTU3NCwgIDIuMTQxNiwgIDIuMzIyMCwgIDIuNTM4NCwgIDIuNzMzNCwgIDIuOTMxOCwKKyAgICAgMC4xNjU2LCAgMC4zMzUwLCAgMC40MjE1LCAgMC41NjA5LCAgMC42NzU5LCAgMC44NTAzLCAgMS4xNDA1LCAgMS40MDk0LAorICAgICAxLjYwNTcsICAxLjY4NjAsICAxLjc2MzksICAyLjAwMzEsICAyLjI2ODAsICAyLjUwNzYsICAyLjcyNjMsICAyLjkzNjgsCisgICAgIDAuMTQ2NiwgIDAuMzYzOCwgIDAuNDU4NywgIDAuNTY3NCwgIDAuNzM4MSwgIDAuODY2OSwgIDAuOTYxOSwgIDEuMTY1OCwKKyAgICAgMS40NjY3LCAgMS43NDQwLCAgMS45MzM1LCAgMi4xMDE4LCAgMi4zMDIyLCAgMi41MjgxLCAgMi43MzU5LCAgMi45MjYxLAorICAgICAwLjEwNjEsICAwLjI1NjYsICAwLjQ3MzksICAwLjY3NTEsICAwLjg3MTEsICAxLjA3MDQsICAxLjI3MjAsICAxLjQ2NTUsCisgICAgIDEuNjYwNSwgIDEuODQ5NCwgIDIuMDI5MCwgIDIuMjE5NywgIDIuNDAwOCwgIDIuNTkxMiwgIDIuNzc3MiwgIDIuOTUxMywKKyAgICAgMC4xMTE2LCAgMC4yMzY0LCAgMC4zOTcxLCAgMC42MzE2LCAgMC44NTgzLCAgMS4wMzM1LCAgMS4xNjg2LCAgMS4zMzAyLAorICAgICAxLjU2MTIsICAxLjc4NzcsICAxLjk4MjksICAyLjIwNTIsICAyLjM1OTYsICAyLjU0NjAsICAyLjczNDEsICAyLjkyOTAsCisgICAgIDAuMjY2MSwgIDAuNDE4NiwgIDAuNTEyNiwgIDAuNjQ3NywgIDAuODgxOCwgIDEuMTA0NSwgIDEuMjg1MiwgIDEuNDEyOCwKKyAgICAgMS41ODUxLCAgMS43NTkzLCAgMS45Mzk5LCAgMi4xNzU3LCAgMi4zNjg0LCAgMi41MTM2LCAgMi42OTI3LCAgMi45MDY0LAorICAgICAwLjE0OTUsICAwLjI3NDksICAwLjQzOTEsICAwLjYzMDQsICAwLjgyMzksICAxLjAxODEsICAxLjE5OTUsICAxLjM3NTksCisgICAgIDEuNTY2OSwgIDEuNzcyMiwgIDEuOTY3MSwgIDIuMTYzNSwgIDIuMzU4NiwgIDIuNTUyOCwgIDIuNzQ0NSwgIDIuOTMxMSwKKyAgICAgMC4wOTEyLCAgMC4xNzU5LCAgMC4zMDY2LCAgMC41NjYwLCAgMC44MDA1LCAgMC45NTY4LCAgMS4xODMyLCAgMS40NTA0LAorICAgICAxLjYyNTksICAxLjc5NDgsICAyLjAxMTMsICAyLjIwMDIsICAyLjM2NTQsICAyLjU1ODMsICAyLjc5MjksICAyLjk3MzUsCisgICAgIDAuMTM1MywgIDAuMjc0NywgIDAuNDA3OCwgIDAuNTk3NywgIDAuNzY1OCwgIDAuOTEyNCwgIDEuMTA4MSwgIDEuMzYzMCwKKyAgICAgMS41ODc1LCAgMS43ODQ3LCAgMS45MzIzLCAgMi4xMTgxLCAgMi4zMzIxLCAgMi41MDQ2LCAgMi43MTgzLCAgMi45MjI1LAorICAgICAwLjE5MzgsICAwLjQwNjMsICAwLjQ5ODIsICAwLjYwMDIsICAwLjc3MDIsICAwLjkwNzEsICAxLjE2MzEsICAxLjM4ODUsCisgICAgIDEuNjA0MywgIDEuODExOCwgIDEuOTMwNiwgIDIuMDg5MywgIDIuMjcyNCwgIDIuNDYwOSwgIDIuNjI4MywgIDIuODgwMiwKKyAgICAgMC4xODU3LCAgMC4zMzUxLCAgMC40MzgxLCAgMC42MTAxLCAgMC43NTYxLCAgMC44NTU1LCAgMS4wMzg0LCAgMS4zMTcxLAorICAgICAxLjU2NjcsICAxLjY5MDQsICAxLjc1NTIsICAxLjk2ODksICAyLjI1OTcsICAyLjUyNjAsICAyLjcyNzIsICAyLjkzMzcsCisgICAgIDAuMTAzNywgIDAuMjE1OSwgIDAuNDE4OCwgIDAuNjE3NCwgIDAuODAzNSwgIDEuMDI4NSwgIDEuMjI1NiwgIDEuNDIzMCwKKyAgICAgMS42NDAwLCAgMS44MzIyLCAgMi4wMTQ0LCAgMi4xOTg4LCAgMi4zODEwLCAgMi41NjgyLCAgMi43NjEzLCAgMi45NDM4LAorICAgICAwLjE2MjUsICAwLjI3NzYsICAwLjQyMjUsICAwLjYwMDEsICAwLjc4NzksICAwLjkwODcsICAxLjA4MDEsICAxLjI3NTksCisgICAgIDEuNDg5OSwgIDEuNzQ0OCwgIDEuOTkxMSwgIDIuMTc3MCwgIDIuMzcyMywgIDIuNTc3NywgIDIuNzk3MSwgIDIuOTQ0NCwKKyAgICAgMC4yMTExLCAgMC4zNjQwLCAgMC41ODM5LCAgMC43MjkwLCAgMC44MDUxLCAgMS4wMDIzLCAgMS4yMzE1LCAgMS40MTQzLAorICAgICAxLjU4NzgsICAxLjc3NTUsICAxLjk4MDQsICAyLjE0OTgsICAyLjMzMTIsICAyLjUzNTAsICAyLjc2MTMsICAyLjk0NzIsCisgICAgIDAuMTQyMywgIDAuMjY0NiwgIDAuNDEzNiwgIDAuNjM1MCwgIDAuODA3MCwgIDAuOTUxNCwgIDEuMTE2OCwgIDEuMzIxMywKKyAgICAgMS41Nzc2LCAgMS43NzIxLCAgMS45NDA0LCAgMi4xNTQ1LCAgMi4zMzg1LCAgMi41MTM3LCAgMi43Mzk2LCAgMi45NTUzLAorICAgICAwLjExMzIsICAwLjIzODYsICAwLjQxMDMsICAwLjU5MzEsICAwLjc4MDgsICAwLjk4ODEsICAxLjE4NDAsICAxLjM4NjAsCisgICAgIDEuNjAyMSwgIDEuNzk5MCwgIDEuOTkyMiwgIDIuMTg4NSwgIDIuMzg1MiwgIDIuNTcxNywgIDIuNzY0MCwgIDIuOTUxMCwKKyAgICAgMC4xMjY3LCAgMC4yNjAyLCAgMC4zOTEzLCAgMC41OTQ0LCAgMC43NTk4LCAgMC45MTk4LCAgMS4wNzgxLCAgMS4yNzE1LAorICAgICAxLjUyOTksICAxLjc1NzMsICAxLjkzMDgsICAyLjEzNDYsICAyLjMyNjcsICAyLjU0MTksICAyLjc0NjYsICAyLjkzMjAsCisgICAgIDAuMjAyMywgIDAuMzQxNywgIDAuNDM5MiwgIDAuNjE0MSwgIDAuNzQzOSwgIDAuODU5MywgIDEuMTA5NiwgIDEuMzU0MywKKyAgICAgMS41MTg1LCAgMS42NTUzLCAgMS43ODYyLCAgMi4wMzQxLCAgMi4yNzE4LCAgMi40ODM0LCAgMi43MTAzLCAgMi45NDY2LAorICAgICAwLjExMTMsICAwLjI0NzAsICAwLjM2NzcsICAwLjU2ODYsICAwLjc3MDAsICAwLjkzNTYsICAxLjA4MDYsICAxLjI0NTIsCisgICAgIDEuNDgzMCwgIDEuNzM0NCwgIDEuOTI2OCwgIDIuMTQwNCwgIDIuMzM3MSwgIDIuNTE2OSwgIDIuNzMyOSwgIDIuOTAxMiwKKyAgICAgMC4xNjY0LCAgMC4zNTU0LCAgMC41NTczLCAgMC43NDcxLCAgMC45MjQ1LCAgMS4wOTk4LCAgMS4yNzg3LCAgMS40NjU1LAorICAgICAxLjY2NTQsICAxLjgzNDYsICAyLjAxNzksICAyLjIxNTksICAyLjQwOTYsICAyLjU5NDYsICAyLjc3OTAsICAyLjk1MzAsCisgICAgIDAuMTMxMywgIDAuMjYyNSwgIDAuNDczMSwgIDAuNjQ0NCwgIDAuODExMCwgIDAuOTg3OCwgIDEuMTQ5MywgIDEuMzIxMiwKKyAgICAgMS41NzE5LCAgMS44MTM4LCAgMS45ODYxLCAgMi4xOTQzLCAgMi4zNzE0LCAgMi41NTc4LCAgMi43MzQ2LCAgMi45Mjk2LAorICAgICAwLjExODYsICAwLjMwMzUsICAwLjUwNDksICAwLjY4NjAsICAwLjg2NzAsICAwLjk5NzUsICAxLjEzNjQsICAxLjM0NzEsCisgICAgIDEuNTY5NSwgIDEuNzQxMiwgIDEuOTM0NiwgIDIuMTUwNiwgIDIuMzQxMywgIDIuNTUzMSwgIDIuNzc5NCwgIDIuOTYyNywKKyAgICAgMC4xMTA4LCAgMC4yNjk3LCAgMC40Nzg3LCAgMC42MzQ0LCAgMC43OTA5LCAgMC45NTg2LCAgMS4xNDQwLCAgMS4zNTExLAorICAgICAxLjU2ODYsICAxLjc2MDEsICAxLjkyNDYsICAyLjEyNDEsICAyLjMyOTMsICAyLjUzOTAsICAyLjczMTUsICAyLjkzMzMsCisgICAgIDAuMDk4NSwgIDAuMjMwMiwgIDAuMzU0NCwgIDAuNTc1OSwgIDAuNzYyMCwgIDAuOTY1MSwgIDEuMTQ5NywgIDEuMzA4MCwKKyAgICAgMS41NTAwLCAgMS43ODQ1LCAgMS45NTE4LCAgMi4xNzM0LCAgMi4zNTY1LCAgMi41NjY1LCAgMi43NjA1LCAgMi45MTAyLAorICAgICAwLjEyMDgsICAwLjI3MjcsICAwLjQzODEsICAwLjU3MzYsICAwLjczODIsICAwLjgzOTAsICAxLjAxMDIsICAxLjI2NDgsCisgICAgIDEuNTEwMCwgIDEuNzQ0MCwgIDEuOTYxOSwgIDIuMTQzMCwgIDIuMzMwNywgIDIuNTE1OSwgIDIuNzI2NCwgIDIuOTIxMSwKKyAgICAgMC4xNTgyLCAgMC4yNzc3LCAgMC40NDc1LCAgMC42NTUxLCAgMC44NTkxLCAgMS4wMDg0LCAgMS4xNDE0LCAgMS4zMjkxLAorICAgICAxLjU5MDIsICAxLjc4MjYsICAxLjk1NDMsICAyLjE2NTksICAyLjMyMzMsICAyLjUwNDQsICAyLjY5MzUsICAyLjkxOTksCisgICAgIDAuMTM2MCwgIDAuMjg3MywgIDAuNDU4NSwgIDAuNjI5NSwgIDAuNzU5MiwgIDAuOTA4OSwgIDEuMDQ5MiwgIDEuMjczMywKKyAgICAgMS41MzkxLCAgMS43NzY4LCAgMS45MzcyLCAgMi4xMzI5LCAgMi4zMTY4LCAgMi41MDE1LCAgMi42ODU3LCAgMi44ODM3LAorICAgICAwLjA4ODYsICAwLjE4MjksICAwLjM2OTYsICAwLjYxMjYsICAwLjgzMzQsICAxLjAxMzUsICAxLjIzMDMsICAxLjQ2NzQsCisgICAgIDEuNjc0MywgIDEuODU2NCwgIDIuMDUzMCwgIDIuMjM3MCwgIDIuMzk2MCwgIDIuNTc4NywgIDIuNzc1NiwgIDIuOTM3NywKKyAgICAgMC4yMDA1LCAgMC4zNTM3LCAgMC40NzAwLCAgMC42MjQ5LCAgMC43Mzg1LCAgMC45MDk3LCAgMS4xNzU5LCAgMS4zODExLAorICAgICAxLjUzMTQsICAxLjY3MDUsICAxLjg1NDYsICAyLjEyMjksICAyLjMyOTIsICAyLjUyNTEsICAyLjc5NTEsICAyLjk2NDYsCisgICAgIDAuMTk5OSwgIDAuMzExMiwgIDAuNDcyMiwgIDAuNzE0NiwgIDAuODkwOCwgIDEuMDAyOCwgIDEuMTgzMSwgIDEuMzkwMywKKyAgICAgMS42MTI1LCAgMS43NTE0LCAgMS45MDgzLCAgMi4xMjQ4LCAgMi4zMjcxLCAgMi41MzM5LCAgMi42OTQ1LCAgMi44OTE4LAorICAgICAwLjEyNDMsICAwLjI2MDYsICAwLjQzODIsICAwLjU4NTAsICAwLjc3MDUsICAwLjk3MjcsICAxLjEyMTQsICAxLjMwNTksCisgICAgIDEuNTIxOCwgIDEuNzQwNiwgIDEuOTEzNywgIDIuMTM1MywgIDIuMzM1NCwgIDIuNTI5OSwgIDIuNzI4NywgIDIuOTA2OCwKKyAgICAgMC4xMDM5LCAgMC4yNDI2LCAgMC40MjY1LCAgMC42Mjg0LCAgMC44MTUyLCAgMC45OTQxLCAgMS4yMDA0LCAgMS40MDM4LAorICAgICAxLjU5MTIsICAxLjc3NjMsICAxLjk2NTAsICAyLjE1OTgsICAyLjM0NzQsICAyLjU0ODgsICAyLjc0MTksICAyLjkzMjIsCisgICAgIDAuMTM2NCwgIDAuMjQyMCwgIDAuMzg4NiwgIDAuNTg2NCwgIDAuNzY2MywgIDAuODg0NCwgIDEuMDg2MCwgIDEuMzI0MiwKKyAgICAgMS41NTE4LCAgMS43ODkzLCAgMi4wMDA0LCAgMi4xNTYyLCAgMi4zNjE5LCAgMi41NTE2LCAgMi43Njg3LCAgMi45MTgxLAorICAgICAwLjE0ODMsICAwLjI4NTEsICAwLjQ0NzksICAwLjYzMTIsICAwLjc5MjQsICAwLjk4MjEsICAxLjE3MDUsICAxLjMzODYsCisgICAgIDEuNTM3NSwgIDEuNzIyNiwgIDEuOTA1MywgIDIuMDk5MSwgIDIuMjg5OCwgIDIuNDk1MywgIDIuNzAwMCwgIDIuOTE0NiwKKyAgICAgMC4yMzMyLCAgMC40NTYxLCAgMC41NDA3LCAgMC42MjEyLCAgMC43NTI0LCAgMC44MjE1LCAgMC45NTIyLCAgMS4xNjg1LAorICAgICAxLjUyMTYsICAxLjcxMzIsICAxLjgyOTEsICAyLjA2NDcsICAyLjI4MTEsICAyLjQ4NTcsICAyLjcwNzEsICAyLjkyODEsCisgICAgIDAuMTM0OCwgIDAuMzEyNiwgIDAuNTE3OSwgIDAuNzE5MiwgIDAuOTIyNywgIDEuMTM2MywgIDEuMzIyMywgIDEuNDc1NiwKKyAgICAgMS42NTA5LCAgMS44MTkxLCAgMS45OTkxLCAgMi4xOTc2LCAgMi4zODc3LCAgMi41NzY4LCAgMi43NTkwLCAgMi45Mzg2LAorICAgICAwLjEwOTMsICAwLjIyMTEsICAwLjQ3NjMsICAwLjY3MDMsICAwLjgyODIsICAwLjk1MzYsICAxLjEyMDIsICAxLjM3OTYsCisgICAgIDEuNjA0MywgIDEuODAzMSwgIDEuOTgzMiwgIDIuMTYwNCwgIDIuMzU3OCwgIDIuNTg1NiwgIDIuNzY1MCwgIDIuOTI5MSwKKyAgICAgMC4xODY1LCAgMC4zMDI3LCAgMC40NTgwLCAgMC42NzE5LCAgMC44NDAwLCAgMS4wMDgyLCAgMS4xOTAxLCAgMS4zNzgyLAorICAgICAxLjU0NDgsICAxLjY4ODUsICAxLjk0NzcsICAyLjEzODEsICAyLjI3OTcsICAyLjUxMTMsICAyLjc0NjUsICAyLjk0MTQsCisgICAgIDAuMTU3NSwgIDAuMzEyNCwgIDAuNDY0OSwgIDAuNjI2MiwgIDAuODA5NSwgIDAuOTg1OCwgIDEuMTY3NiwgIDEuMzYwMiwKKyAgICAgMS41NjQ2LCAgMS43NTgyLCAgMS45NTUwLCAgMi4xNjcxLCAgMi4zNjI4LCAgMi41NzM0LCAgMi43NjcwLCAgMi45NTE5LAorICAgICAwLjExNzQsICAwLjI3NzcsICAwLjQ2NjMsICAwLjYzMzMsICAwLjgxNjksICAxLjAwOTYsICAxLjE4ODUsICAxLjM4NDcsCisgICAgIDEuNTgwMywgIDEuNzU3MSwgIDEuOTM4MCwgIDIuMTM5OCwgIDIuMzQxNCwgIDIuNTQwNywgIDIuNzM2MCwgIDIuOTM3NSwKKyAgICAgMC4xMDczLCAgMC4yMjY0LCAgMC40MDgzLCAgMC41OTczLCAgMC43NDc0LCAgMC45NTE0LCAgMS4xMzQ5LCAgMS4zMzM3LAorICAgICAxLjU0MzMsICAxLjczNDgsICAxLjkzODAsICAyLjE0MzYsICAyLjM0NDEsICAyLjU0MzgsICAyLjc0NTcsICAyLjkzODMsCisgICAgIDAuMTQ3MiwgIDAuMjg4MCwgIDAuNDc5MywgIDAuNjI2OCwgIDAuODAxNSwgIDEuMDA2MywgIDEuMTcxNSwgIDEuMzY0NCwKKyAgICAgMS41NTI1LCAgMS43NDEwLCAgMS45MjU4LCAgMi4xMjI3LCAgMi4zMjE0LCAgMi41MTQ5LCAgMi43MTQ4LCAgMi45MTk2LAorICAgICAwLjE0MTQsICAwLjI1NjUsICAwLjQzNDksICAwLjYxMTEsICAwLjc2OTUsICAwLjk0OTYsICAxLjEyMTIsICAxLjMyNjUsCisgICAgIDEuNTIxOCwgIDEuNzIwOSwgIDEuOTAxNSwgIDIuMDg4NywgIDIuMzE1OCwgIDIuNTA3NywgIDIuNzIzMywgIDIuOTQyMSwKKyAgICAgMC4xMjUyLCAgMC4yNjY3LCAgMC40NDU0LCAgMC42NDMxLCAgMC44MzcxLCAgMS4wMTI0LCAgMS4yMTEwLCAgMS40MTYwLAorICAgICAxLjYyNDAsICAxLjgyNDIsICAyLjAwNDcsICAyLjE5NzQsICAyLjM5MDIsICAyLjU3NzgsICAyLjc2MzcsICAyLjk0ODEsCisgICAgIDAuMTMyMSwgIDAuMjU2NSwgIDAuMzg0NiwgIDAuNTg0NywgIDAuNzU3OCwgIDAuOTI1OSwgIDEuMDYzNywgIDEuMjIzOSwKKyAgICAgMS40NjkwLCAgMS43MzQ2LCAgMS45NzUwLCAgMi4xODgyLCAgMi4zNzEyLCAgMi41NTA5LCAgMi43MjgwLCAgMi44ODg1LAorICAgICAwLjE0MzcsICAwLjI5MzAsICAwLjQ0MjgsICAwLjYxNTYsICAwLjgwNDUsICAwLjk2MzgsICAxLjE0NTAsICAxLjMxMzgsCisgICAgIDEuNTE0NCwgIDEuNzM1NSwgIDEuOTQ2OSwgIDIuMTUzNCwgIDIuMzQxNCwgIDIuNTQ1MiwgIDIuNzM1MywgIDIuOTMzNCwKKyAgICAgMC4xNjkyLCAgMC4yNzcwLCAgMC4zODMxLCAgMC42MTAwLCAgMC43ODI1LCAgMC45MzAyLCAgMS4wNjkwLCAgMS4yNDgxLAorICAgICAxLjQ2MTUsICAxLjY3OTksICAxLjkxNjUsICAyLjE3MzksICAyLjM0MzUsICAyLjUzNDksICAyLjc1MjAsICAyLjkxNjMsCisgICAgIDAuMTIzNSwgIDAuMjQ4OSwgIDAuNDM1NCwgIDAuNjM0MywgIDAuODIzNiwgIDEuMDA2NiwgIDEuMTkwOCwgIDEuMzQ3NCwKKyAgICAgMS41NjU2LCAgMS44Mjc1LCAgMi4wNjIwLCAgMi4yNTQ4LCAgMi40MTM1LCAgMi41OTEzLCAgMi43NjM5LCAgMi45MzM0LAorICAgICAwLjEwOTAsICAwLjE5NjEsICAwLjM4NTQsICAwLjU3MDEsICAwLjcwMjQsICAwLjg4NDMsICAxLjEzOTMsICAxLjM3ODUsCisgICAgIDEuNTk0MCwgIDEuNzc5NywgIDEuOTQ0MiwgIDIuMTc0MCwgIDIuMzg1MywgIDIuNTc3MywgIDIuNzcyNywgIDIuOTQwNiwKKyAgICAgMC4xNTYwLCAgMC4zNDc3LCAgMC41MDExLCAgMC42Mjg3LCAgMC43NjEyLCAgMC45ODk2LCAgMS4xNTEwLCAgMS4zNDIwLAorICAgICAxLjU0MzUsICAxLjY4MTYsICAxLjg3MzEsICAyLjA2NTEsICAyLjI2MTMsICAyLjQ5OTksICAyLjcwMjcsICAyLjg5NzEsCisgICAgIDAuMTQ1OSwgIDAuMjQxNiwgIDAuMzgzMywgIDAuNTQ1MCwgIDAuNzkxNiwgIDAuOTIyMywgIDEuMDY2MiwgIDEuMTk1MywKKyAgICAgMS40MDI5LCAgMS42NjE2LCAgMS45MzIwLCAgMi4xNDU5LCAgMi4zMzg2LCAgMi41MDgxLCAgMi42Nzk5LCAgMi45MTk1LAorICAgICAwLjE1NDYsICAwLjM4NTQsICAwLjYxODQsICAwLjg0NjAsICAxLjA1OTksICAxLjI0MjgsICAxLjM5MDYsICAxLjU1NTAsCisgICAgIDEuNzM4OCwgIDEuODk0NSwgIDIuMDc1NywgIDIuMjM4NiwgIDIuNDAxNCwgIDIuNTcwNSwgIDIuNzU3NCwgIDIuOTQwMCwKKyAgICAgMC4xMDgwLCAgMC4yMzA3LCAgMC40MTEyLCAgMC42MDY3LCAgMC43NzI1LCAgMC45NDY3LCAgMS4xMjg1LCAgMS4zMjA1LAorICAgICAxLjUzNDgsICAxLjc2MDksICAxLjk5MzcsICAyLjE4NzgsICAyLjM1ODMsICAyLjU1MTUsICAyLjcxOTksICAyLjkwNDksCisgICAgIDAuMTQ4MiwgIDAuMzE3OCwgIDAuNDk4MywgIDAuNjM0MiwgIDAuNzc4MywgIDAuOTg4MCwgIDEuMjAxOSwgIDEuMzQwNCwKKyAgICAgMS41MjIzLCAgMS43Mjk2LCAgMS45MjExLCAgMi4wOTQzLCAgMi4yOTI4LCAgMi41MDA4LCAgMi43MTM2LCAgMi45MjI0LAorICAgICAwLjExNDUsICAwLjI5MTAsICAwLjQ4OTEsICAwLjY0OTIsICAwLjgxMjYsICAwLjk1MzAsICAxLjExODAsICAxLjMxNTUsCisgICAgIDEuNTA1NCwgIDEuNjg5MywgIDEuODg5OSwgIDIuMTE4OCwgIDIuMzM4OSwgIDIuNTUxMiwgIDIuNzMxMywgIDIuOTIyNCwKKyAgICAgMC4wOTM5LCAgMC4xNjg5LCAgMC4zMjUwLCAgMC41NzkyLCAgMC43Njk4LCAgMC45MjQ1LCAgMS4xNTc0LCAgMS4zODY1LAorICAgICAxLjU5NTksICAxLjc5NzcsICAxLjk4MjEsICAyLjE1MjgsICAyLjMzMjYsICAyLjU1NDAsICAyLjc1NTMsICAyLjkxNzksCisgICAgIDAuMTI0MywgIDAuMjQ3NCwgIDAuMzkyMywgIDAuNjE5OSwgIDAuNzkwOCwgIDAuOTM3OSwgIDEuMTQ5NywgIDEuMzczNCwKKyAgICAgMS41NTgyLCAgMS43NDIwLCAgMS45NTM5LCAgMi4xMzg1LCAgMi4zMjQwLCAgMi41Mjc3LCAgMi43MzExLCAgMi45MTc4LAorICAgICAwLjE5NjEsICAwLjM3NDgsICAwLjUxNzYsICAwLjYzODcsICAwLjgxNjksICAxLjA0NzcsICAxLjIxMjQsICAxLjM4NjksCisgICAgIDEuNTYwNCwgIDEuNzIyNSwgIDEuODc3MCwgIDIuMDgzNywgIDIuMjk2MCwgIDIuNTEwMywgIDIuNjk0NSwgIDIuODg2MiwKKyAgICAgMC4xMjk1LCAgMC4yNDAzLCAgMC40MTQ5LCAgMC42MTg5LCAgMC43OTEzLCAgMC45MTMwLCAgMS4wODMyLCAgMS4yNzg3LAorICAgICAxLjQ4NjAsICAxLjcxMTIsICAxLjk1MDIsICAyLjEzNDgsICAyLjI3NzYsICAyLjQ5ODIsICAyLjc0MzEsICAyLjk1MjIsCisgICAgIDAuMDE2MCwgIDAuMDM2MiwgIDAuMDA5NywgIDAuMDA1NywgLTAuMDAxNCwgLTAuMDA3MywgLTAuMDA0NiwgLTAuMDA2NCwKKyAgICAtMC4wMTIxLCAgMC4wMDE5LCAgMC4wMTQ5LCAtMC4wNDQwLCAtMC4wNDc5LCAtMC4wMzgyLCAtMC4wNDgwLCAtMC4wMTgyLAorICAgICAwLjAxNzAsICAwLjAxMTQsIC0wLjAyOTgsIC0wLjAxNzUsIC0wLjAwMzMsIC0wLjAzNTQsIC0wLjA1MTAsIC0wLjAwMjUsCisgICAgIDAuMDMwNywgIDAuMDM1MSwgIDAuMDMzOCwgIDAuMDQyMCwgIDAuMDEzOCwgLTAuMDE3NSwgLTAuMDEwMiwgIDAuMDA1MywKKyAgICAgMC4wMDg0LCAtMC4wMDAzLCAgMC4wNDEyLCAtMC4wMDI3LCAgMC4wMTQ1LCAtMC4wMDM5LCAgMC4wMDgzLCAgMC4wNDAwLAorICAgICAwLjAwMDEsIC0wLjAyNjIsICAwLjAwNTUsIC0wLjAwODIsICAwLjAzNDgsICAwLjA0MzMsICAwLjAxMzcsIC0wLjAwMjQsCisgICAgLTAuMDA1NSwgIDAuMDI2MiwgIDAuMDUyMSwgIDAuMDM0OSwgIDAuMDE4NSwgIDAuMDA3NiwgLTAuMDMxOSwgLTAuMDU2MSwKKyAgICAtMC4wNDYwLCAtMC4wMjUzLCAtMC4wMDk3LCAgMC4wMTYzLCAgMC4wMTg0LCAtMC4wMDM3LCAtMC4wNDgwLCAtMC4wMzcxLAorICAgICAwLjA2MjgsICAwLjA2NjUsICAwLjAyOTYsIC0wLjAwNTcsICAwLjAyNTMsICAwLjAyMjcsICAwLjAzNTAsICAwLjA2OTIsCisgICAgIDAuMDU0NSwgIDAuMDIxOCwgIDAuMDA5NCwgLTAuMDQ0OSwgLTAuMDM3MiwgIDAuMDAwNSwgIDAuMDI1OCwgIDAuMDExOCwKKyAgICAgMC4wMjg1LCAgMC4wNzYwLCAgMC4wODIyLCAgMC4wNTI3LCAtMC4wMjk5LCAtMC4wMDQ5LCAgMC4wMTcwLCAgMC4wMTk1LAorICAgICAwLjAxMzYsICAwLjAyODYsICAwLjAyODksICAwLjAxMzksICAwLjAwNTQsICAwLjAxNTIsICAwLjAyNDQsICAwLjAwMjgsCisgICAgLTAuMDA1NiwgLTAuMDI2MCwgIDAuMDMwNywgIDAuMDU3MiwgLTAuMDA4NywgIDAuMDA4OCwgIDAuMDA2MiwgIDAuMDAwMCwKKyAgICAgMC4wMTI1LCAgMC4wMDAwLCAtMC4wMjkyLCAgMC4wODIwLCAgMC4wODcyLCAgMC4wNjQ2LCAgMC4wMzQ2LCAgMC4wMDc2LAorICAgIC0wLjAwMjIsIC0wLjAyNTMsIC0wLjA1NjcsIC0wLjAxODgsIC0wLjAzMzYsIC0wLjA2NzMsIC0wLjA1NDksIC0wLjAxNjYsCisgICAgLTAuMDI1OSwgLTAuMDE0MCwgIDAuMDA0MCwgLTAuMDAyOSwgLTAuMDQzMCwgLTAuMDUzMSwgLTAuMDI1MywgLTAuMDAxOSwKKyAgICAtMC4wMDcxLCAgMC4wMzkzLCAgMC4wMDcyLCAtMC4wMzI3LCAtMC4wMjM2LCAtMC4wMjM1LCAtMC4wMTc3LCAtMC4wMTg2LAorICAgIC0wLjAyODAsIC0wLjAyMDEsIC0wLjAwNzcsICAwLjAzODMsICAwLjA0MTgsICAwLjAzMjEsICAwLjAyOTQsICAwLjAxNjksCisgICAgIDAuMDQ2OCwgIDAuMDMwMSwgIDAuMDEzMywgIDAuMDM2MywgIDAuMDUxNiwgIDAuMDkzNywgIDAuMTI0MCwgIDAuMTQwNCwKKyAgICAgMC4xMzI1LCAgMC4xMTc4LCAgMC4wOTk5LCAgMC4wMjUxLCAtMC4wMDM3LCAtMC4wNDk1LCAtMC4wNzAzLCAtMC4wMjE5LAorICAgIC0wLjAyNjEsIC0wLjAzMDQsIC0wLjAyMDQsIC0wLjAzNzIsICAwLjAzNTUsICAwLjAxMzEsIC0wLjAwOTMsIC0wLjAwOTksCisgICAgLTAuMDA2OSwgLTAuMDAzNCwgLTAuMDA2NSwgLTAuMDIwOCwgLTAuMDIzMSwgLTAuMDExNywgLTAuMDIxMSwgLTAuMDI0MywKKyAgICAgMC4wMDQ2LCAtMC4wMTA3LCAtMC4wMDcwLCAgMC4wMTIzLCAgMC4wMjMwLCAgMC4wMTUyLCAgMC4wMTY0LCAgMC4wNDEyLAorICAgICAwLjA2MTksICAwLjA4NTgsICAwLjA4NjIsIC0wLjAwNTYsICAwLjAxMjUsICAwLjAxODIsICAwLjAzNDcsICAwLjAzODgsCisgICAgIDAuMDQ1NiwgIDAuMDQwNywgLTAuMDI0OSwgLTAuMDQ2MCwgIDAuMDIwNiwgIDAuMDI5OSwgIDAuMDI1MywgIDAuMDIwNywKKyAgICAgMC4wMTc3LCAgMC4wMjM4LCAgMC4wMjUzLCAgMC4wMDMwLCAgMC4wMDQyLCAgMC4wMDIwLCAtMC4wMDgxLCAtMC4wMTM2LAorICAgIC0wLjAyOTAsIC0wLjAwNDIsICAwLjAxMjIsICAwLjAwNTEsICAwLjAxMDcsICAwLjAyMjgsICAwLjAyMTEsIC0wLjAwNjgsCisgICAgLTAuMDQzNiwgLTAuMDI5OSwgLTAuMDA3OCwgLTAuMDc3OSwgLTAuMTE1NywgLTAuMDY3OSwgIDAuMDE3MiwgIDAuMDE1MCwKKyAgICAtMC4wMDUxLCAgMC4wMDgxLCAtMC4wNTEyLCAtMC4wNjE2LCAgMC4wNTc2LCAgMC4wNzk5LCAgMC4wODAzLCAgMC4wMzM2LAorICAgICAwLjAwMDEsIC0wLjAyOTgsIC0wLjA3NDcsIC0wLjAxMTUsIC0wLjAxMDEsIC0wLjAxNzAsIC0wLjAwNTAsICAwLjAxNzQsCisgICAgLTAuMDI5MCwgLTAuMDYwMSwgLTAuMDE1MCwgIDAuMDEyMSwgIDAuMDE2NSwgIDAuMDIzMCwgIDAuMDAyOCwgLTAuMDMxNywKKyAgICAtMC4wMTY1LCAgMC4wMzU2LCAgMC4wNDUxLCAgMC4wMTIwLCAgMC4wMzIxLCAgMC4wMDg0LCAtMC4wMDU4LCAgMC4wMTIyLAorICAgICAwLjE5MzUsICAwLjE4MDIsICAwLjIxOTUsICAwLjI0MTAsICAwLjIyMDEsICAwLjE5MTUsICAwLjE4NDAsICAwLjE5MzUsCisgICAgIDAuMjIxMywgIDAuMjA3OSwgIDAuMTg1OCwgIDAuMTk3NCwgIDAuMjIzOSwgIDAuMjE3MywgIDAuMTg0MCwgIDAuMjEyMCwKKyAgICAgMC40OTEyLCAgMC40Nzc3LCAgMC40NjA3LCAgMC40Mzk1LCAgMC40NDI2LCAgMC40Mzg4LCAgMC40NDE2LCAgMC40MzQ1LAorICAgICAwLjQyMzksICAwLjQzMzEsICAwLjQ1MjIsICAwLjQ0MjMsICAwLjQ0NzUsICAwLjQzODcsICAwLjQ1MjUsICAwLjQ0NDYsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgbHNwMjJzW10gPSB7CisgICAgIDAuMDY2NCwgIDAuMTg3NSwgIDAuNDMwMCwgIDAuNjczMCwgIDAuODc5MywgIDEuMDY0MCwgIDEuMjU2MywgIDEuNDQzMywKKyAgICAgMS42Mzk0LCAgMS44MTc2LCAgMi4wMDI5LCAgMi4xOTIxLCAgMi4zNzk2LCAgMi41NjcxLCAgMi43NTk1LCAgMi45NTM2LAorICAgICAwLjIxMjgsICAwLjQwNTIsICAwLjUzMTEsICAwLjY0MDQsICAwLjc4NzUsICAwLjg3NzUsICAxLjA5NzQsICAxLjMyNjEsCisgICAgIDEuNTU2MywgIDEuNjc5MCwgIDEuODMzOSwgIDIuMTE5NSwgIDIuMzIyNiwgIDIuNDYwOSwgIDIuNjQ0MCwgIDIuODk0NywKKyAgICAgMC4yMDI0LCAgMC4zMzYyLCAgMC40ODM0LCAgMC42Nzg0LCAgMC45MDg4LCAgMS4wODUwLCAgMS4yMTg4LCAgMS40MDU0LAorICAgICAxLjYxMDIsICAxLjc3NjcsICAxLjk2NzksICAyLjE0MzYsICAyLjM0NDUsICAyLjU0NjcsICAyLjc0MjksICAyLjkzMjAsCisgICAgIDAuMTE4MSwgIDAuMjI3OSwgIDAuNDQxMywgIDAuNjExNCwgIDAuNzcxMCwgIDAuOTQyNywgIDEuMTE0MiwgIDEuMjcwNywKKyAgICAgMS40ODkyLCAgMS43NDE2LCAgMS45NTI2LCAgMi4xNDY2LCAgMi4zNjI5LCAgMi41NDQ1LCAgMi43MjkzLCAgMi45MjA1LAorICAgICAwLjExNTUsICAwLjI3MjAsICAwLjQ4ODYsICAwLjY4MTIsICAwLjg1OTQsICAxLjA0MjIsICAxLjIzMTUsICAxLjQxMTYsCisgICAgIDEuNjEzNywgIDEuODAyMCwgIDEuOTc1OCwgIDIuMTc0MywgIDIuMzYwMiwgIDIuNTU2OCwgIDIuNzQ3MiwgIDIuOTM3NCwKKyAgICAgMC4xMTEwLCAgMC4zMzEyLCAgMC40NzM1LCAgMC41NjEyLCAgMC43MTI5LCAgMC44MTQ2LCAgMS4wMjMzLCAgMS4zMTU1LAorICAgICAxLjU3NjUsICAxLjc3NDYsICAxLjk1NzQsICAyLjE0MTYsICAyLjMyMjAsICAyLjUzODQsICAyLjczMzQsICAyLjkzMTgsCisgICAgIDAuMTY1NiwgIDAuMzM1MCwgIDAuNDIxNSwgIDAuNTYwOSwgIDAuNjc1OSwgIDAuODUwMywgIDEuMTQwNSwgIDEuNDA5NCwKKyAgICAgMS42MDU3LCAgMS42ODYwLCAgMS43NjM5LCAgMi4wMDMxLCAgMi4yNjgwLCAgMi41MDc2LCAgMi43MjYzLCAgMi45MzY4LAorICAgICAwLjE0NjYsICAwLjM2MzgsICAwLjQ1ODcsICAwLjU2NzQsICAwLjczODEsICAwLjg2NjksICAwLjk2MTksICAxLjE2NTgsCisgICAgIDEuNDY2NywgIDEuNzQ0MCwgIDEuOTMzNSwgIDIuMTAxOCwgIDIuMzAyMiwgIDIuNTI4MSwgIDIuNzM1OSwgIDIuOTI2MSwKKyAgICAgMC4xMDYxLCAgMC4yNTY2LCAgMC40NzM5LCAgMC42NzUxLCAgMC44NzExLCAgMS4wNzA0LCAgMS4yNzIwLCAgMS40NjU1LAorICAgICAxLjY2MDUsICAxLjg0OTQsICAyLjAyOTAsICAyLjIxOTcsICAyLjQwMDgsICAyLjU5MTIsICAyLjc3NzIsICAyLjk1MTMsCisgICAgIDAuMTExNiwgIDAuMjM2NCwgIDAuMzk3MSwgIDAuNjMxNiwgIDAuODU4MywgIDEuMDMzNSwgIDEuMTY4NiwgIDEuMzMwMiwKKyAgICAgMS41NjEyLCAgMS43ODc3LCAgMS45ODI5LCAgMi4yMDUyLCAgMi4zNTk2LCAgMi41NDYwLCAgMi43MzQxLCAgMi45MjkwLAorICAgICAwLjI2NjEsICAwLjQxODYsICAwLjUxMjYsICAwLjY0NzcsICAwLjg4MTgsICAxLjEwNDUsICAxLjI4NTIsICAxLjQxMjgsCisgICAgIDEuNTg1MSwgIDEuNzU5MywgIDEuOTM5OSwgIDIuMTc1NywgIDIuMzY4NCwgIDIuNTEzNiwgIDIuNjkyNywgIDIuOTA2NCwKKyAgICAgMC4xNDk1LCAgMC4yNzQ5LCAgMC40MzkxLCAgMC42MzA0LCAgMC44MjM5LCAgMS4wMTgxLCAgMS4xOTk1LCAgMS4zNzU5LAorICAgICAxLjU2NjksICAxLjc3MjIsICAxLjk2NzEsICAyLjE2MzUsICAyLjM1ODYsICAyLjU1MjgsICAyLjc0NDUsICAyLjkzMTEsCisgICAgIDAuMDkxMiwgIDAuMTc1OSwgIDAuMzA2NiwgIDAuNTY2MCwgIDAuODAwNSwgIDAuOTU2OCwgIDEuMTgzMiwgIDEuNDUwNCwKKyAgICAgMS42MjU5LCAgMS43OTQ4LCAgMi4wMTEzLCAgMi4yMDAyLCAgMi4zNjU0LCAgMi41NTgzLCAgMi43OTI5LCAgMi45NzM1LAorICAgICAwLjEzNTMsICAwLjI3NDcsICAwLjQwNzgsICAwLjU5NzcsICAwLjc2NTgsICAwLjkxMjQsICAxLjEwODEsICAxLjM2MzAsCisgICAgIDEuNTg3NSwgIDEuNzg0NywgIDEuOTMyMywgIDIuMTE4MSwgIDIuMzMyMSwgIDIuNTA0NiwgIDIuNzE4MywgIDIuOTIyNSwKKyAgICAgMC4xOTM4LCAgMC40MDYzLCAgMC40OTgyLCAgMC42MDAyLCAgMC43NzAyLCAgMC45MDcxLCAgMS4xNjMxLCAgMS4zODg1LAorICAgICAxLjYwNDMsICAxLjgxMTgsICAxLjkzMDYsICAyLjA4OTMsICAyLjI3MjQsICAyLjQ2MDksICAyLjYyODMsICAyLjg4MDIsCisgICAgIDAuMTg1NywgIDAuMzM1MSwgIDAuNDM4MSwgIDAuNjEwMSwgIDAuNzU2MSwgIDAuODU1NSwgIDEuMDM4NCwgIDEuMzE3MSwKKyAgICAgMS41NjY3LCAgMS42OTA0LCAgMS43NTUyLCAgMS45Njg5LCAgMi4yNTk3LCAgMi41MjYwLCAgMi43MjcyLCAgMi45MzM3LAorICAgICAwLjEwMzcsICAwLjIxNTksICAwLjQxODgsICAwLjYxNzQsICAwLjgwMzUsICAxLjAyODUsICAxLjIyNTYsICAxLjQyMzAsCisgICAgIDEuNjQwMCwgIDEuODMyMiwgIDIuMDE0NCwgIDIuMTk4OCwgIDIuMzgxMCwgIDIuNTY4MiwgIDIuNzYxMywgIDIuOTQzOCwKKyAgICAgMC4xNjI1LCAgMC4yNzc2LCAgMC40MjI1LCAgMC42MDAxLCAgMC43ODc5LCAgMC45MDg3LCAgMS4wODAxLCAgMS4yNzU5LAorICAgICAxLjQ4OTksICAxLjc0NDgsICAxLjk5MTEsICAyLjE3NzAsICAyLjM3MjMsICAyLjU3NzcsICAyLjc5NzEsICAyLjk0NDQsCisgICAgIDAuMjExMSwgIDAuMzY0MCwgIDAuNTgzOSwgIDAuNzI5MCwgIDAuODA1MSwgIDEuMDAyMywgIDEuMjMxNSwgIDEuNDE0MywKKyAgICAgMS41ODc4LCAgMS43NzU1LCAgMS45ODA0LCAgMi4xNDk4LCAgMi4zMzEyLCAgMi41MzUwLCAgMi43NjEzLCAgMi45NDcyLAorICAgICAwLjE0MjMsICAwLjI2NDYsICAwLjQxMzYsICAwLjYzNTAsICAwLjgwNzAsICAwLjk1MTQsICAxLjExNjgsICAxLjMyMTMsCisgICAgIDEuNTc3NiwgIDEuNzcyMSwgIDEuOTQwNCwgIDIuMTU0NSwgIDIuMzM4NSwgIDIuNTEzNywgIDIuNzM5NiwgIDIuOTU1MywKKyAgICAgMC4xMTMyLCAgMC4yMzg2LCAgMC40MTAzLCAgMC41OTMxLCAgMC43ODA4LCAgMC45ODgxLCAgMS4xODQwLCAgMS4zODYwLAorICAgICAxLjYwMjEsICAxLjc5OTAsICAxLjk5MjIsICAyLjE4ODUsICAyLjM4NTIsICAyLjU3MTcsICAyLjc2NDAsICAyLjk1MTAsCisgICAgIDAuMTI2NywgIDAuMjYwMiwgIDAuMzkxMywgIDAuNTk0NCwgIDAuNzU5OCwgIDAuOTE5OCwgIDEuMDc4MSwgIDEuMjcxNSwKKyAgICAgMS41Mjk5LCAgMS43NTczLCAgMS45MzA4LCAgMi4xMzQ2LCAgMi4zMjY3LCAgMi41NDE5LCAgMi43NDY2LCAgMi45MzIwLAorICAgICAwLjIwMjMsICAwLjM0MTcsICAwLjQzOTIsICAwLjYxNDEsICAwLjc0MzksICAwLjg1OTMsICAxLjEwOTYsICAxLjM1NDMsCisgICAgIDEuNTE4NSwgIDEuNjU1MywgIDEuNzg2MiwgIDIuMDM0MSwgIDIuMjcxOCwgIDIuNDgzNCwgIDIuNzEwMywgIDIuOTQ2NiwKKyAgICAgMC4xMTEzLCAgMC4yNDcwLCAgMC4zNjc3LCAgMC41Njg2LCAgMC43NzAwLCAgMC45MzU2LCAgMS4wODA2LCAgMS4yNDUyLAorICAgICAxLjQ4MzAsICAxLjczNDQsICAxLjkyNjgsICAyLjE0MDQsICAyLjMzNzEsICAyLjUxNjksICAyLjczMjksICAyLjkwMTIsCisgICAgIDAuMTY2NCwgIDAuMzU1NCwgIDAuNTU3MywgIDAuNzQ3MSwgIDAuOTI0NSwgIDEuMDk5OCwgIDEuMjc4NywgIDEuNDY1NSwKKyAgICAgMS42NjU0LCAgMS44MzQ2LCAgMi4wMTc5LCAgMi4yMTU5LCAgMi40MDk2LCAgMi41OTQ2LCAgMi43NzkwLCAgMi45NTMwLAorICAgICAwLjEzMTMsICAwLjI2MjUsICAwLjQ3MzEsICAwLjY0NDQsICAwLjgxMTAsICAwLjk4NzgsICAxLjE0OTMsICAxLjMyMTIsCisgICAgIDEuNTcxOSwgIDEuODEzOCwgIDEuOTg2MSwgIDIuMTk0MywgIDIuMzcxNCwgIDIuNTU3OCwgIDIuNzM0NiwgIDIuOTI5NiwKKyAgICAgMC4xMTg2LCAgMC4zMDM1LCAgMC41MDQ5LCAgMC42ODYwLCAgMC44NjcwLCAgMC45OTc1LCAgMS4xMzY0LCAgMS4zNDcxLAorICAgICAxLjU2OTUsICAxLjc0MTIsICAxLjkzNDYsICAyLjE1MDYsICAyLjM0MTMsICAyLjU1MzEsICAyLjc3OTQsICAyLjk2MjcsCisgICAgIDAuMTEwOCwgIDAuMjY5NywgIDAuNDc4NywgIDAuNjM0NCwgIDAuNzkwOSwgIDAuOTU4NiwgIDEuMTQ0MCwgIDEuMzUxMSwKKyAgICAgMS41Njg2LCAgMS43NjAxLCAgMS45MjQ2LCAgMi4xMjQxLCAgMi4zMjkzLCAgMi41MzkwLCAgMi43MzE1LCAgMi45MzMzLAorICAgICAwLjA5ODUsICAwLjIzMDIsICAwLjM1NDQsICAwLjU3NTksICAwLjc2MjAsICAwLjk2NTEsICAxLjE0OTcsICAxLjMwODAsCisgICAgIDEuNTUwMCwgIDEuNzg0NSwgIDEuOTUxOCwgIDIuMTczNCwgIDIuMzU2NSwgIDIuNTY2NSwgIDIuNzYwNSwgIDIuOTEwMiwKKyAgICAgMC4xMjA4LCAgMC4yNzI3LCAgMC40MzgxLCAgMC41NzM2LCAgMC43MzgyLCAgMC44MzkwLCAgMS4wMTAyLCAgMS4yNjQ4LAorICAgICAxLjUxMDAsICAxLjc0NDAsICAxLjk2MTksICAyLjE0MzAsICAyLjMzMDcsICAyLjUxNTksICAyLjcyNjQsICAyLjkyMTEsCisgICAgIDAuMTU4MiwgIDAuMjc3NywgIDAuNDQ3NSwgIDAuNjU1MSwgIDAuODU5MSwgIDEuMDA4NCwgIDEuMTQxNCwgIDEuMzI5MSwKKyAgICAgMS41OTAyLCAgMS43ODI2LCAgMS45NTQzLCAgMi4xNjU5LCAgMi4zMjMzLCAgMi41MDQ0LCAgMi42OTM1LCAgMi45MTk5LAorICAgICAwLjEzNjAsICAwLjI4NzMsICAwLjQ1ODUsICAwLjYyOTUsICAwLjc1OTIsICAwLjkwODksICAxLjA0OTIsICAxLjI3MzMsCisgICAgIDEuNTM5MSwgIDEuNzc2OCwgIDEuOTM3MiwgIDIuMTMyOSwgIDIuMzE2OCwgIDIuNTAxNSwgIDIuNjg1NywgIDIuODgzNywKKyAgICAgMC4wODg2LCAgMC4xODI5LCAgMC4zNjk2LCAgMC42MTI2LCAgMC44MzM0LCAgMS4wMTM1LCAgMS4yMzAzLCAgMS40Njc0LAorICAgICAxLjY3NDMsICAxLjg1NjQsICAyLjA1MzAsICAyLjIzNzAsICAyLjM5NjAsICAyLjU3ODcsICAyLjc3NTYsICAyLjkzNzcsCisgICAgIDAuMjAwNSwgIDAuMzUzNywgIDAuNDcwMCwgIDAuNjI0OSwgIDAuNzM4NSwgIDAuOTA5NywgIDEuMTc1OSwgIDEuMzgxMSwKKyAgICAgMS41MzE0LCAgMS42NzA1LCAgMS44NTQ2LCAgMi4xMjI5LCAgMi4zMjkyLCAgMi41MjUxLCAgMi43OTUxLCAgMi45NjQ2LAorICAgICAwLjE5OTksICAwLjMxMTIsICAwLjQ3MjIsICAwLjcxNDYsICAwLjg5MDgsICAxLjAwMjgsICAxLjE4MzEsICAxLjM5MDMsCisgICAgIDEuNjEyNSwgIDEuNzUxNCwgIDEuOTA4MywgIDIuMTI0OCwgIDIuMzI3MSwgIDIuNTMzOSwgIDIuNjk0NSwgIDIuODkxOCwKKyAgICAgMC4xMjQzLCAgMC4yNjA2LCAgMC40MzgyLCAgMC41ODUwLCAgMC43NzA1LCAgMC45NzI3LCAgMS4xMjE0LCAgMS4zMDU5LAorICAgICAxLjUyMTgsICAxLjc0MDYsICAxLjkxMzcsICAyLjEzNTMsICAyLjMzNTQsICAyLjUyOTksICAyLjcyODcsICAyLjkwNjgsCisgICAgIDAuMTAzOSwgIDAuMjQyNiwgIDAuNDI2NSwgIDAuNjI4NCwgIDAuODE1MiwgIDAuOTk0MSwgIDEuMjAwNCwgIDEuNDAzOCwKKyAgICAgMS41OTEyLCAgMS43NzYzLCAgMS45NjUwLCAgMi4xNTk4LCAgMi4zNDc0LCAgMi41NDg4LCAgMi43NDE5LCAgMi45MzIyLAorICAgICAwLjEzNjQsICAwLjI0MjAsICAwLjM4ODYsICAwLjU4NjQsICAwLjc2NjMsICAwLjg4NDQsICAxLjA4NjAsICAxLjMyNDIsCisgICAgIDEuNTUxOCwgIDEuNzg5MywgIDIuMDAwNCwgIDIuMTU2MiwgIDIuMzYxOSwgIDIuNTUxNiwgIDIuNzY4NywgIDIuOTE4MSwKKyAgICAgMC4xNDgzLCAgMC4yODUxLCAgMC40NDc5LCAgMC42MzEyLCAgMC43OTI0LCAgMC45ODIxLCAgMS4xNzA1LCAgMS4zMzg2LAorICAgICAxLjUzNzUsICAxLjcyMjYsICAxLjkwNTMsICAyLjA5OTEsICAyLjI4OTgsICAyLjQ5NTMsICAyLjcwMDAsICAyLjkxNDYsCisgICAgIDAuMjMzMiwgIDAuNDU2MSwgIDAuNTQwNywgIDAuNjIxMiwgIDAuNzUyNCwgIDAuODIxNSwgIDAuOTUyMiwgIDEuMTY4NSwKKyAgICAgMS41MjE2LCAgMS43MTMyLCAgMS44MjkxLCAgMi4wNjQ3LCAgMi4yODExLCAgMi40ODU3LCAgMi43MDcxLCAgMi45MjgxLAorICAgICAwLjEzNDgsICAwLjMxMjYsICAwLjUxNzksICAwLjcxOTIsICAwLjkyMjcsICAxLjEzNjMsICAxLjMyMjMsICAxLjQ3NTYsCisgICAgIDEuNjUwOSwgIDEuODE5MSwgIDEuOTk5MSwgIDIuMTk3NiwgIDIuMzg3NywgIDIuNTc2OCwgIDIuNzU5MCwgIDIuOTM4NiwKKyAgICAgMC4xMDkzLCAgMC4yMjExLCAgMC40NzYzLCAgMC42NzAzLCAgMC44MjgyLCAgMC45NTM2LCAgMS4xMjAyLCAgMS4zNzk2LAorICAgICAxLjYwNDMsICAxLjgwMzEsICAxLjk4MzIsICAyLjE2MDQsICAyLjM1NzgsICAyLjU4NTYsICAyLjc2NTAsICAyLjkyOTEsCisgICAgIDAuMTg2NSwgIDAuMzAyNywgIDAuNDU4MCwgIDAuNjcxOSwgIDAuODQwMCwgIDEuMDA4MiwgIDEuMTkwMSwgIDEuMzc4MiwKKyAgICAgMS41NDQ4LCAgMS42ODg1LCAgMS45NDc3LCAgMi4xMzgxLCAgMi4yNzk3LCAgMi41MTEzLCAgMi43NDY1LCAgMi45NDE0LAorICAgICAwLjE1NzUsICAwLjMxMjQsICAwLjQ2NDksICAwLjYyNjIsICAwLjgwOTUsICAwLjk4NTgsICAxLjE2NzYsICAxLjM2MDIsCisgICAgIDEuNTY0NiwgIDEuNzU4MiwgIDEuOTU1MCwgIDIuMTY3MSwgIDIuMzYyOCwgIDIuNTczNCwgIDIuNzY3MCwgIDIuOTUxOSwKKyAgICAgMC4xMTc0LCAgMC4yNzc3LCAgMC40NjYzLCAgMC42MzMzLCAgMC44MTY5LCAgMS4wMDk2LCAgMS4xODg1LCAgMS4zODQ3LAorICAgICAxLjU4MDMsICAxLjc1NzEsICAxLjkzODAsICAyLjEzOTgsICAyLjM0MTQsICAyLjU0MDcsICAyLjczNjAsICAyLjkzNzUsCisgICAgIDAuMTA3MywgIDAuMjI2NCwgIDAuNDA4MywgIDAuNTk3MywgIDAuNzQ3NCwgIDAuOTUxNCwgIDEuMTM0OSwgIDEuMzMzNywKKyAgICAgMS41NDMzLCAgMS43MzQ4LCAgMS45MzgwLCAgMi4xNDM2LCAgMi4zNDQxLCAgMi41NDM4LCAgMi43NDU3LCAgMi45MzgzLAorICAgICAwLjE0NzIsICAwLjI4ODAsICAwLjQ3OTMsICAwLjYyNjgsICAwLjgwMTUsICAxLjAwNjMsICAxLjE3MTUsICAxLjM2NDQsCisgICAgIDEuNTUyNSwgIDEuNzQxMCwgIDEuOTI1OCwgIDIuMTIyNywgIDIuMzIxNCwgIDIuNTE0OSwgIDIuNzE0OCwgIDIuOTE5NiwKKyAgICAgMC4xNDE0LCAgMC4yNTY1LCAgMC40MzQ5LCAgMC42MTExLCAgMC43Njk1LCAgMC45NDk2LCAgMS4xMjEyLCAgMS4zMjY1LAorICAgICAxLjUyMTgsICAxLjcyMDksICAxLjkwMTUsICAyLjA4ODcsICAyLjMxNTgsICAyLjUwNzcsICAyLjcyMzMsICAyLjk0MjEsCisgICAgIDAuMTI1MiwgIDAuMjY2NywgIDAuNDQ1NCwgIDAuNjQzMSwgIDAuODM3MSwgIDEuMDEyNCwgIDEuMjExMCwgIDEuNDE2MCwKKyAgICAgMS42MjQwLCAgMS44MjQyLCAgMi4wMDQ3LCAgMi4xOTc0LCAgMi4zOTAyLCAgMi41Nzc4LCAgMi43NjM3LCAgMi45NDgxLAorICAgICAwLjEzMjEsICAwLjI1NjUsICAwLjM4NDYsICAwLjU4NDcsICAwLjc1NzgsICAwLjkyNTksICAxLjA2MzcsICAxLjIyMzksCisgICAgIDEuNDY5MCwgIDEuNzM0NiwgIDEuOTc1MCwgIDIuMTg4MiwgIDIuMzcxMiwgIDIuNTUwOSwgIDIuNzI4MCwgIDIuODg4NSwKKyAgICAgMC4xNDM3LCAgMC4yOTMwLCAgMC40NDI4LCAgMC42MTU2LCAgMC44MDQ1LCAgMC45NjM4LCAgMS4xNDUwLCAgMS4zMTM4LAorICAgICAxLjUxNDQsICAxLjczNTUsICAxLjk0NjksICAyLjE1MzQsICAyLjM0MTQsICAyLjU0NTIsICAyLjczNTMsICAyLjkzMzQsCisgICAgIDAuMTY5MiwgIDAuMjc3MCwgIDAuMzgzMSwgIDAuNjEwMCwgIDAuNzgyNSwgIDAuOTMwMiwgIDEuMDY5MCwgIDEuMjQ4MSwKKyAgICAgMS40NjE1LCAgMS42Nzk5LCAgMS45MTY1LCAgMi4xNzM5LCAgMi4zNDM1LCAgMi41MzQ5LCAgMi43NTIwLCAgMi45MTYzLAorICAgICAwLjEyMzUsICAwLjI0ODksICAwLjQzNTQsICAwLjYzNDMsICAwLjgyMzYsICAxLjAwNjYsICAxLjE5MDgsICAxLjM0NzQsCisgICAgIDEuNTY1NiwgIDEuODI3NSwgIDIuMDYyMCwgIDIuMjU0OCwgIDIuNDEzNSwgIDIuNTkxMywgIDIuNzYzOSwgIDIuOTMzNCwKKyAgICAgMC4xMDkwLCAgMC4xOTYxLCAgMC4zODU0LCAgMC41NzAxLCAgMC43MDI0LCAgMC44ODQzLCAgMS4xMzkzLCAgMS4zNzg1LAorICAgICAxLjU5NDAsICAxLjc3OTcsICAxLjk0NDIsICAyLjE3NDAsICAyLjM4NTMsICAyLjU3NzMsICAyLjc3MjcsICAyLjk0MDYsCisgICAgIDAuMTU2MCwgIDAuMzQ3NywgIDAuNTAxMSwgIDAuNjI4NywgIDAuNzYxMiwgIDAuOTg5NiwgIDEuMTUxMCwgIDEuMzQyMCwKKyAgICAgMS41NDM1LCAgMS42ODE2LCAgMS44NzMxLCAgMi4wNjUxLCAgMi4yNjEzLCAgMi40OTk5LCAgMi43MDI3LCAgMi44OTcxLAorICAgICAwLjE0NTksICAwLjI0MTYsICAwLjM4MzMsICAwLjU0NTAsICAwLjc5MTYsICAwLjkyMjMsICAxLjA2NjIsICAxLjE5NTMsCisgICAgIDEuNDAyOSwgIDEuNjYxNiwgIDEuOTMyMCwgIDIuMTQ1OSwgIDIuMzM4NiwgIDIuNTA4MSwgIDIuNjc5OSwgIDIuOTE5NSwKKyAgICAgMC4xNTQ2LCAgMC4zODU0LCAgMC42MTg0LCAgMC44NDYwLCAgMS4wNTk5LCAgMS4yNDI4LCAgMS4zOTA2LCAgMS41NTUwLAorICAgICAxLjczODgsICAxLjg5NDUsICAyLjA3NTcsICAyLjIzODYsICAyLjQwMTQsICAyLjU3MDUsICAyLjc1NzQsICAyLjk0MDAsCisgICAgIDAuMTA4MCwgIDAuMjMwNywgIDAuNDExMiwgIDAuNjA2NywgIDAuNzcyNSwgIDAuOTQ2NywgIDEuMTI4NSwgIDEuMzIwNSwKKyAgICAgMS41MzQ4LCAgMS43NjA5LCAgMS45OTM3LCAgMi4xODc4LCAgMi4zNTgzLCAgMi41NTE1LCAgMi43MTk5LCAgMi45MDQ5LAorICAgICAwLjE0ODIsICAwLjMxNzgsICAwLjQ5ODMsICAwLjYzNDIsICAwLjc3ODMsICAwLjk4ODAsICAxLjIwMTksICAxLjM0MDQsCisgICAgIDEuNTIyMywgIDEuNzI5NiwgIDEuOTIxMSwgIDIuMDk0MywgIDIuMjkyOCwgIDIuNTAwOCwgIDIuNzEzNiwgIDIuOTIyNCwKKyAgICAgMC4xMTQ1LCAgMC4yOTEwLCAgMC40ODkxLCAgMC42NDkyLCAgMC44MTI2LCAgMC45NTMwLCAgMS4xMTgwLCAgMS4zMTU1LAorICAgICAxLjUwNTQsICAxLjY4OTMsICAxLjg4OTksICAyLjExODgsICAyLjMzODksICAyLjU1MTIsICAyLjczMTMsICAyLjkyMjQsCisgICAgIDAuMDkzOSwgIDAuMTY4OSwgIDAuMzI1MCwgIDAuNTc5MiwgIDAuNzY5OCwgIDAuOTI0NSwgIDEuMTU3NCwgIDEuMzg2NSwKKyAgICAgMS41OTU5LCAgMS43OTc3LCAgMS45ODIxLCAgMi4xNTI4LCAgMi4zMzI2LCAgMi41NTQwLCAgMi43NTUzLCAgMi45MTc5LAorICAgICAwLjEyNDMsICAwLjI0NzQsICAwLjM5MjMsICAwLjYxOTksICAwLjc5MDgsICAwLjkzNzksICAxLjE0OTcsICAxLjM3MzQsCisgICAgIDEuNTU4MiwgIDEuNzQyMCwgIDEuOTUzOSwgIDIuMTM4NSwgIDIuMzI0MCwgIDIuNTI3NywgIDIuNzMxMSwgIDIuOTE3OCwKKyAgICAgMC4xOTYxLCAgMC4zNzQ4LCAgMC41MTc2LCAgMC42Mzg3LCAgMC44MTY5LCAgMS4wNDc3LCAgMS4yMTI0LCAgMS4zODY5LAorICAgICAxLjU2MDQsICAxLjcyMjUsICAxLjg3NzAsICAyLjA4MzcsICAyLjI5NjAsICAyLjUxMDMsICAyLjY5NDUsICAyLjg4NjIsCisgICAgIDAuMTI5NSwgIDAuMjQwMywgIDAuNDE0OSwgIDAuNjE4OSwgIDAuNzkxMywgIDAuOTEzMCwgIDEuMDgzMiwgIDEuMjc4NywKKyAgICAgMS40ODYwLCAgMS43MTEyLCAgMS45NTAyLCAgMi4xMzQ4LCAgMi4yNzc2LCAgMi40OTgyLCAgMi43NDMxLCAgMi45NTIyLAorICAgICAwLjAxNjAsICAwLjAzNjIsICAwLjAwOTcsICAwLjAwNTcsIC0wLjAwMTQsIC0wLjAwNzMsIC0wLjAwNDYsIC0wLjAwNjQsCisgICAgLTAuMDEyMSwgIDAuMDAxOSwgIDAuMDE0OSwgLTAuMDQ0MCwgLTAuMDQ3OSwgLTAuMDM4MiwgLTAuMDQ4MCwgLTAuMDE4MiwKKyAgICAgMC4wMTcwLCAgMC4wMTE0LCAtMC4wMjk4LCAtMC4wMTc1LCAtMC4wMDMzLCAtMC4wMzU0LCAtMC4wNTEwLCAtMC4wMDI1LAorICAgICAwLjAzMDcsICAwLjAzNTEsICAwLjAzMzgsICAwLjA0MjAsICAwLjAxMzgsIC0wLjAxNzUsIC0wLjAxMDIsICAwLjAwNTMsCisgICAgIDAuMDA4NCwgLTAuMDAwMywgIDAuMDQxMiwgLTAuMDAyNywgIDAuMDE0NSwgLTAuMDAzOSwgIDAuMDA4MywgIDAuMDQwMCwKKyAgICAgMC4wMDAxLCAtMC4wMjYyLCAgMC4wMDU1LCAtMC4wMDgyLCAgMC4wMzQ4LCAgMC4wNDMzLCAgMC4wMTM3LCAtMC4wMDI0LAorICAgIC0wLjAwNTUsICAwLjAyNjIsICAwLjA1MjEsICAwLjAzNDksICAwLjAxODUsICAwLjAwNzYsIC0wLjAzMTksIC0wLjA1NjEsCisgICAgLTAuMDQ2MCwgLTAuMDI1MywgLTAuMDA5NywgIDAuMDE2MywgIDAuMDE4NCwgLTAuMDAzNywgLTAuMDQ4MCwgLTAuMDM3MSwKKyAgICAgMC4wNjI4LCAgMC4wNjY1LCAgMC4wMjk2LCAtMC4wMDU3LCAgMC4wMjUzLCAgMC4wMjI3LCAgMC4wMzUwLCAgMC4wNjkyLAorICAgICAwLjA1NDUsICAwLjAyMTgsICAwLjAwOTQsIC0wLjA0NDksIC0wLjAzNzIsICAwLjAwMDUsICAwLjAyNTgsICAwLjAxMTgsCisgICAgIDAuMDI4NSwgIDAuMDc2MCwgIDAuMDgyMiwgIDAuMDUyNywgLTAuMDI5OSwgLTAuMDA0OSwgIDAuMDE3MCwgIDAuMDE5NSwKKyAgICAgMC4wMTM2LCAgMC4wMjg2LCAgMC4wMjg5LCAgMC4wMTM5LCAgMC4wMDU0LCAgMC4wMTUyLCAgMC4wMjQ0LCAgMC4wMDI4LAorICAgIC0wLjAwNTYsIC0wLjAyNjAsICAwLjAzMDcsICAwLjA1NzIsIC0wLjAwODcsICAwLjAwODgsICAwLjAwNjIsICAwLjAwMDAsCisgICAgIDAuMDEyNSwgIDAuMDAwMCwgLTAuMDI5MiwgIDAuMDgyMCwgIDAuMDg3MiwgIDAuMDY0NiwgIDAuMDM0NiwgIDAuMDA3NiwKKyAgICAtMC4wMDIyLCAtMC4wMjUzLCAtMC4wNTY3LCAtMC4wMTg4LCAtMC4wMzM2LCAtMC4wNjczLCAtMC4wNTQ5LCAtMC4wMTY2LAorICAgIC0wLjAyNTksIC0wLjAxNDAsICAwLjAwNDAsIC0wLjAwMjksIC0wLjA0MzAsIC0wLjA1MzEsIC0wLjAyNTMsIC0wLjAwMTksCisgICAgLTAuMDA3MSwgIDAuMDM5MywgIDAuMDA3MiwgLTAuMDMyNywgLTAuMDIzNiwgLTAuMDIzNSwgLTAuMDE3NywgLTAuMDE4NiwKKyAgICAtMC4wMjgwLCAtMC4wMjAxLCAtMC4wMDc3LCAgMC4wMzgzLCAgMC4wNDE4LCAgMC4wMzIxLCAgMC4wMjk0LCAgMC4wMTY5LAorICAgICAwLjA0NjgsICAwLjAzMDEsICAwLjAxMzMsICAwLjAzNjMsICAwLjA1MTYsICAwLjA5MzcsICAwLjEyNDAsICAwLjE0MDQsCisgICAgIDAuMTMyNSwgIDAuMTE3OCwgIDAuMDk5OSwgIDAuMDI1MSwgLTAuMDAzNywgLTAuMDQ5NSwgLTAuMDcwMywgLTAuMDIxOSwKKyAgICAtMC4wMjYxLCAtMC4wMzA0LCAtMC4wMjA0LCAtMC4wMzcyLCAgMC4wMzU1LCAgMC4wMTMxLCAtMC4wMDkzLCAtMC4wMDk5LAorICAgIC0wLjAwNjksIC0wLjAwMzQsIC0wLjAwNjUsIC0wLjAyMDgsIC0wLjAyMzEsIC0wLjAxMTcsIC0wLjAyMTEsIC0wLjAyNDMsCisgICAgIDAuMDA0NiwgLTAuMDEwNywgLTAuMDA3MCwgIDAuMDEyMywgIDAuMDIzMCwgIDAuMDE1MiwgIDAuMDE2NCwgIDAuMDQxMiwKKyAgICAgMC4wNjE5LCAgMC4wODU4LCAgMC4wODYyLCAtMC4wMDU2LCAgMC4wMTI1LCAgMC4wMTgyLCAgMC4wMzQ3LCAgMC4wMzg4LAorICAgICAwLjA0NTYsICAwLjA0MDcsIC0wLjAyNDksIC0wLjA0NjAsICAwLjAyMDYsICAwLjAyOTksICAwLjAyNTMsICAwLjAyMDcsCisgICAgIDAuMDE3NywgIDAuMDIzOCwgIDAuMDI1MywgIDAuMDAzMCwgIDAuMDA0MiwgIDAuMDAyMCwgLTAuMDA4MSwgLTAuMDEzNiwKKyAgICAtMC4wMjkwLCAtMC4wMDQyLCAgMC4wMTIyLCAgMC4wMDUxLCAgMC4wMTA3LCAgMC4wMjI4LCAgMC4wMjExLCAtMC4wMDY4LAorICAgIC0wLjA0MzYsIC0wLjAyOTksIC0wLjAwNzgsIC0wLjA3NzksIC0wLjExNTcsIC0wLjA2NzksICAwLjAxNzIsICAwLjAxNTAsCisgICAgLTAuMDA1MSwgIDAuMDA4MSwgLTAuMDUxMiwgLTAuMDYxNiwgIDAuMDU3NiwgIDAuMDc5OSwgIDAuMDgwMywgIDAuMDMzNiwKKyAgICAgMC4wMDAxLCAtMC4wMjk4LCAtMC4wNzQ3LCAtMC4wMTE1LCAtMC4wMTAxLCAtMC4wMTcwLCAtMC4wMDUwLCAgMC4wMTc0LAorICAgIC0wLjAyOTAsIC0wLjA2MDEsIC0wLjAxNTAsICAwLjAxMjEsICAwLjAxNjUsICAwLjAyMzAsICAwLjAwMjgsIC0wLjAzMTcsCisgICAgLTAuMDE2NSwgIDAuMDM1NiwgIDAuMDQ1MSwgIDAuMDEyMCwgIDAuMDMyMSwgIDAuMDA4NCwgLTAuMDA1OCwgIDAuMDEyMiwKKyAgICAgMC4xOTM1LCAgMC4xODAyLCAgMC4yMTk1LCAgMC4yNDEwLCAgMC4yMjAxLCAgMC4xOTE1LCAgMC4xODQwLCAgMC4xOTM1LAorICAgICAwLjIyMTMsICAwLjIwNzksICAwLjE4NTgsICAwLjE5NzQsICAwLjIyMzksICAwLjIxNzMsICAwLjE4NDAsICAwLjIxMjAsCisgICAgIDAuNDkxMiwgIDAuNDc3NywgIDAuNDYwNywgIDAuNDM5NSwgIDAuNDQyNiwgIDAuNDM4OCwgIDAuNDQxNiwgIDAuNDM0NSwKKyAgICAgMC40MjM5LCAgMC40MzMxLCAgMC40NTIyLCAgMC40NDIzLCAgMC40NDc1LCAgMC40Mzg3LCAgMC40NTI1LCAgMC40NDQ2LAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGxzcDQ0c1tdID0geworICAgICAwLjA5MjcsICAwLjIyOTEsICAwLjQwNTksICAwLjU3NzksICAwLjcyODgsICAwLjg4MjEsICAxLjAzNzcsICAxLjE5MTUsCisgICAgIDEuMzQzMywgIDEuNDkzMSwgIDEuNjQ3NSwgIDEuNzk4OSwgIDEuOTM4MSwgIDIuMDg1OCwgIDIuMjMyMSwgIDIuMzc2NSwKKyAgICAgMi41MTg3LCAgMi42NTMwLCAgMi43ODk1LCAgMi45MzU0LCAgMC4wOTQ0LCAgMC4xOTc0LCAgMC4zMDQ2LCAgMC40NzE0LAorICAgICAwLjYxMTYsICAwLjc4MjksICAwLjkwMjcsICAxLjAzNzUsICAxLjE4NjksICAxLjM0ODgsICAxLjUwMzYsICAxLjY3ODEsCisgICAgIDEuODI3NiwgIDEuOTk4MywgIDIuMTQ0OSwgIDIuMzA4OSwgIDIuNDUzNCwgIDIuNjExMywgIDIuNzU1MywgIDIuOTA2MiwKKyAgICAgMC4xMTY4LCAgMC4yODQzLCAgMC40OTA3LCAgMC42NzA2LCAgMC44MTAwLCAgMC45NDE3LCAgMS4wNzUzLCAgMS4yMDE0LAorICAgICAxLjMxNTEsICAxLjQ0OTYsICAxLjU4MzIsICAxLjczNzksICAxLjg2NDIsICAyLjAyMzAsICAyLjE2ODEsICAyLjMyNTAsCisgICAgIDIuNDY3NiwgIDIuNjI0MiwgIDIuNzYwMiwgIDIuOTA2NiwgIDAuMTM1MywgIDAuMjMzNSwgIDAuMzM3MCwgIDAuNDM4MCwKKyAgICAgMC41ODE5LCAgMC43MzUzLCAgMC44NjcxLCAgMS4wMTYwLCAgMS4xNDM1LCAgMS4yOTc3LCAgMS40ODYwLCAgMS42NzM5LAorICAgICAxLjg0MTIsICAyLjAwMjgsICAyLjE1MzcsICAyLjMxMjQsICAyLjQ3NDEsICAyLjYyNzIsICAyLjc4NjIsICAyLjk1MzYsCisgICAgIDAuMTAwMywgIDAuMjIyNiwgIDAuMzU4NCwgIDAuNDk3MSwgIDAuNjI5MSwgIDAuNzcxMCwgIDAuOTE1NywgIDEuMDY2OSwKKyAgICAgMS4yMTQzLCAgMS4zNjI0LCAgMS41MTA0LCAgMS42NjgxLCAgMS44MTY0LCAgMS45ODIzLCAgMi4xMzk0LCAgMi4zMDgyLAorICAgICAyLjQ2NzcsICAyLjYzMDYsICAyLjc5MDksICAyLjkzODIsICAwLjEwNTYsICAwLjIwMjcsICAwLjI5NTYsICAwLjQwMDUsCisgICAgIDAuNTIxNSwgIDAuNjcwOCwgIDAuODU0NSwgIDEuMDU1NywgIDEuMjM0NCwgIDEuNDAyMywgIDEuNTY3NiwgIDEuNzI3OCwKKyAgICAgMS44ODA4LCAgMi4wMzgxLCAgMi4xODQ2LCAgMi4zMzc2LCAgMi40ODg3LCAgMi42Mzc3LCAgMi43ODc4LCAgMi45NTA0LAorICAgICAwLjEwMTUsICAwLjI0NjIsICAwLjQxMjIsICAwLjU3ODMsICAwLjcyMzMsICAwLjg4MzMsICAxLjAzNzcsICAxLjE5MDMsCisgICAgIDEuMzM0MSwgIDEuNDcyNywgIDEuNjEzOCwgIDEuNzU4MiwgIDEuODkxMiwgIDIuMDM3MCwgIDIuMTcwMSwgIDIuMzEyNSwKKyAgICAgMi40NTAwLCAgMi42MDA2LCAgMi43NTA3LCAgMi45MTY2LCAgMC4xNzg3LCAgMC4yNDE4LCAgMC4zMjY1LCAgMC41Mzc5LAorICAgICAwLjY1ODQsICAwLjc2ODEsICAwLjk1NDUsICAxLjEwNTAsICAxLjIxMjUsICAxLjM1MjgsICAxLjQ3NjMsICAxLjY3MDUsCisgICAgIDEuODEzNiwgIDEuOTU5NCwgIDIuMDkzNiwgIDIuMjcyNCwgIDIuNDM5NCwgIDIuNTkxOSwgIDIuNzAzNywgIDIuODc0NywKKyAgICAgMC4wODU5LCAgMC4xNjAwLCAgMC4yOTgwLCAgMC40OTMzLCAgMC42Njk2LCAgMC44Mjg1LCAgMC45OTU4LCAgMS4xNTQ1LAorICAgICAxLjMxMDcsICAxLjQ1OTEsICAxLjYxMjcsICAxLjc2NTIsICAxLjkxNDMsICAyLjA2ODAsICAyLjIxNzEsICAyLjM2NDMsCisgICAgIDIuNTE0MSwgIDIuNjYxMSwgIDIuODE0MywgIDIuOTY5MSwgIDAuMDkxMCwgIDAuMjExMCwgIDAuMzM2NCwgIDAuNDcxOCwKKyAgICAgMC41ODU2LCAgMC43Mjk4LCAgMC44OTEwLCAgMS4wNTE0LCAgMS4xOTg4LCAgMS4zNTcyLCAgMS41MTc4LCAgMS42ODYxLAorICAgICAxLjgzOTksICAyLjAwOTksICAyLjE2MzksICAyLjMyMjUsICAyLjQ3NzQsICAyLjYzMjEsICAyLjc4NjMsICAyLjk0MTIsCisgICAgIDAuMTkwNCwgIDAuMjg3NCwgIDAuMzY4MSwgIDAuNDk4MSwgIDAuNjI0OCwgIDAuNzg4MCwgIDAuOTEyMSwgIDEuMDc1MCwKKyAgICAgMS4yMTg1LCAgMS4zODA5LCAgMS41Mjk2LCAgMS43MDA3LCAgMS44NTkyLCAgMi4wNDcwLCAgMi4xOTEzLCAgMi4zMjUwLAorICAgICAyLjQ1MTksICAyLjU5ODQsICAyLjc0MDgsICAyLjkwMjMsICAwLjA5MTcsICAwLjIwNjcsICAwLjMyNDYsICAwLjQ5NjEsCisgICAgIDAuNjMxMCwgIDAuODAyNCwgIDAuOTQzOCwgIDEuMTAwOCwgIDEuMjM2MiwgIDEuMzg5MiwgIDEuNTQwNywgIDEuNzAzMywKKyAgICAgMS44NDI3LCAgMi4wMDYxLCAgMi4xNDk4LCAgMi4zMTE3LCAgMi40NTUwLCAgMi42MDUzLCAgMi43NDYyLCAgMi45MDI5LAorICAgICAwLjA5ODksICAwLjIxOTMsICAwLjM3NTYsICAwLjU0MTAsICAwLjY5MjksICAwLjgzNjgsICAwLjk4MDEsICAxLjEyNTAsCisgICAgIDEuMjY3NywgIDEuNDE4NCwgIDEuNTY3NywgIDEuNzI5MiwgIDEuODc3MCwgIDIuMDMxMSwgIDIuMTgwMywgIDIuMzMwNiwKKyAgICAgMi40ODM2LCAgMi42MzM5LCAgMi43OTQzLCAgMi45NTQ5LCAgMC4wODYxLCAgMC4xOTQzLCAgMC4zMDU3LCAgMC40ODY3LAorICAgICAwLjYxOTQsICAwLjc1OTIsICAwLjkxODQsICAxLjEwNTIsICAxLjI0ODYsICAxLjQwNjQsICAxLjU2MDksICAxLjcyNzMsCisgICAgIDEuODcwMywgIDIuMDI5MSwgIDIuMTY4NiwgIDIuMzIyNSwgIDIuNDYyOCwgIDIuNjExNSwgIDIuNzQ3MSwgIDIuOTAwNSwKKyAgICAgMC4wOTMyLCAgMC4yMTEwLCAgMC4zNzM3LCAgMC41NDc5LCAgMC43MTIwLCAgMC44NTcwLCAgMC45OTc1LCAgMS4xMzY0LAorICAgICAxLjI3NzIsICAxLjQyMjAsICAxLjU2MTIsICAxLjcwODksICAxLjg0MTAsICAxLjk4MjcsICAyLjEyNjMsICAyLjI4NTksCisgICAgIDIuNDQ1OSwgIDIuNjE3MiwgIDIuNzc4OCwgIDIuOTM5NSwgIDAuMTE5MywgIDAuMjM0MSwgIDAuMzUyMywgIDAuNTAyOSwKKyAgICAgMC42NDM3LCAgMC43ODAzLCAgMC45MzY3LCAgMS4xMDA3LCAgMS4yMzkyLCAgMS4zODY5LCAgMS41NDI1LCAgMS43MTY4LAorICAgICAxLjg3MDksICAyLjAyNDgsICAyLjE1ODQsICAyLjI5NDksICAyLjQzMDgsICAyLjU4MjMsICAyLjcyMzUsICAyLjkwMzQsCisgICAgIDAuMDgzNCwgIDAuMTk4OCwgIDAuMzU1NywgIDAuNTI2MSwgIDAuNjc2NywgIDAuODQyNywgIDEuMDAyOSwgIDEuMTY4MywKKyAgICAgMS4zMTM4LCAgMS40NTI3LCAgMS42MDQ2LCAgMS43NTgzLCAgMS45MDExLCAgMi4wNTE3LCAgMi4xOTI4LCAgMi4zMzk3LAorICAgICAyLjQ4MzksICAyLjYyOTEsICAyLjc3NzEsICAyLjkzMjksICAwLjA5MzgsICAwLjE5NjcsICAwLjMyMTMsICAwLjQ2NzUsCisgICAgIDAuNjA2OCwgIDAuNzY2NCwgIDAuOTQxOCwgIDEuMTEyMCwgIDEuMjUzNSwgIDEuMzkzMiwgIDEuNTI0MywgIDEuNjgwMSwKKyAgICAgMS44MzQ2LCAgMS45OTMxLCAgMi4xMzc2LCAgMi4zMDM1LCAgMi40NjM2LCAgMi42MjQ0LCAgMi43ODI5LCAgMi45MzcxLAorICAgICAwLjEwMTcsICAwLjI1NTIsICAwLjQzMjcsICAwLjYwMTcsICAwLjc0NjcsICAwLjg3OTcsICAxLjAwOTcsICAxLjE0NDIsCisgICAgIDEuMjYyOCwgIDEuNDA0OSwgIDEuNTU0MSwgIDEuNzA5MCwgIDEuODQ2MSwgIDEuOTk4MiwgIDIuMTQ4NiwgIDIuMzAyOSwKKyAgICAgMi40NTEzLCAgMi42MDc1LCAgMi43NTk0LCAgMi45MjA5LCAgMC4xMDMxLCAgMC4yMjk1LCAgMC4zNzQ3LCAgMC41MTIyLAorICAgICAwLjY1OTYsICAwLjc5MzUsICAwLjkzNDUsICAxLjEwNTAsICAxLjIzODQsICAxLjM1NDMsICAxLjQ3MzksICAxLjYxMzYsCisgICAgIDEuNzQ0NywgIDEuODkxNCwgIDIuMDQzNCwgIDIuMTkxNiwgIDIuMzU1NywgIDIuNTM5NiwgIDIuNzQxOSwgIDIuOTQwMSwKKyAgICAgMC4xMDA3LCAgMC4yMzc0LCAgMC4zNzE1LCAgMC41MTczLCAgMC42NDY1LCAgMC44MDY5LCAgMC45NTUzLCAgMS4xMTQ1LAorICAgICAxLjI1OTQsICAxLjQxNDMsICAxLjU2MTcsICAxLjcxNjYsICAxLjg0NTcsICAyLjAwMTIsICAyLjE0NjIsICAyLjI4NjQsCisgICAgIDIuNDI1OCwgIDIuNTkxMCwgIDIuNzM3MiwgIDIuOTAxOCwgIDAuMDgwOCwgIDAuMTcyNiwgIDAuMjg0OSwgIDAuNDU5MiwKKyAgICAgMC42MTE4LCAgMC43ODUzLCAgMC45NTg4LCAgMS4xMjU2LCAgMS4yNzUxLCAgMS40MzkyLCAgMS41ODk4LCAgMS43NTE0LAorICAgICAxLjg5NzcsICAyLjA1NTQsICAyLjE5MzcsICAyLjM0MzAsICAyLjQ4MzEsICAyLjYyNDksICAyLjc2MDEsICAyLjkxNTUsCisgICAgIDAuMTY2OSwgIDAuMjU3NCwgIDAuMzY5NCwgIDAuNTU2OSwgIDAuNjc3MywgIDAuODA2MSwgIDEuMDE2MCwgIDEuMTY2NywKKyAgICAgMS4yNzkxLCAgMS40MDQxLCAgMS41NDUyLCAgMS43MjA3LCAgMS44NTI0LCAgMi4wMDM4LCAgMi4xNDE0LCAgMi4zMzM4LAorICAgICAyLjQ3NDcsICAyLjYxNTcsICAyLjczMDMsICAyLjg4NDgsICAwLjE1OTgsICAwLjI1MjEsICAwLjM0MTYsICAwLjUxNDksCisgICAgIDAuNjcwMywgIDAuNzk0MSwgIDAuOTQwOCwgIDEuMTE2NCwgIDEuMjAxNywgIDEuMzI5MywgIDEuNDkwOCwgIDEuNjc4MywKKyAgICAgMS44NDM4LCAgMS45OTI3LCAgMi4xMTQ5LCAgMi4yNjk4LCAgMi40NDIwLCAgMi42MTkzLCAgMi43NTgzLCAgMi45MTAzLAorICAgICAwLjA5MDIsICAwLjE5NzgsICAwLjMyNjUsICAwLjQ1NzgsICAwLjU4NzgsICAwLjc0MzksICAwLjkxMTAsICAxLjA5MDYsCisgICAgIDEuMjU1NiwgIDEuNDEyNSwgIDEuNTY4OCwgIDEuNzI5NSwgIDEuODgyOSwgIDIuMDQ3MiwgIDIuMjA1OCwgIDIuMzUzNywKKyAgICAgMi41MDc1LCAgMi42NTQ4LCAgMi44MDU4LCAgMi45NTM4LCAgMC4wODE4LCAgMC4xNjk1LCAgMC4yNzk0LCAgMC40NDcwLAorICAgICAwLjYwNjksICAwLjc2NDEsICAwLjkzMTMsICAxLjA5NDYsICAxLjI0MTEsICAxLjQwNzIsICAxLjU2NDAsICAxLjcxODYsCisgICAgIDEuODY1MSwgIDIuMDI1NCwgIDIuMTcyNiwgIDIuMzI4NiwgIDIuNDc4NCwgIDIuNjI4NywgIDIuNzc1MCwgIDIuOTMzOSwKKyAgICAgMC4xOTgwLCAgMC4zMTM0LCAgMC40MDk5LCAgMC40OTc1LCAgMC42NDkxLCAgMC44Mzc2LCAgMC45NDQxLCAgMS4wMjk4LAorICAgICAxLjE3OTUsICAxLjM4NjYsICAxLjU3ODQsICAxLjcyMDksICAxLjgxMzcsICAxLjkyNzEsICAyLjA4NjMsICAyLjI5MzAsCisgICAgIDIuNDY5NiwgIDIuNjE4NCwgIDIuNzU4NywgIDIuOTI1MSwgIDAuMTMzOCwgIDAuMjM0MSwgIDAuMzU2NiwgIDAuNDc5NywKKyAgICAgMC42MTI5LCAgMC43NTgwLCAgMC45MDkzLCAgMS4wNDkxLCAgMS4xOTExLCAgMS4zMzEzLCAgMS40ODQxLCAgMS42NTAzLAorICAgICAxLjgwMzUsICAxLjk2ODUsICAyLjExMjgsICAyLjI2OTQsICAyLjQwOTMsICAyLjU3MjgsICAyLjcyMDYsICAyLjg5OTQsCisgICAgIDAuMDkzNywgIDAuMjAzNCwgIDAuMzQ0NywgIDAuNTAzMiwgIDAuNjM3MCwgIDAuNzk5MywgIDAuOTY3NCwgIDEuMTMyMywKKyAgICAgMS4yODMwLCAgMS40MTk5LCAgMS41NDkyLCAgMS43MDEwLCAgMS44NTEzLCAgMi4wMDg3LCAgMi4xNTUwLCAgMi4zMTE1LAorICAgICAyLjQ2NDMsICAyLjYyMzcsICAyLjc4MTIsICAyLjkzOTIsICAwLjEwODUsICAwLjIxNTIsICAwLjMxMjYsICAwLjQ1NjksCisgICAgIDAuNTcxOCwgIDAuNzIxMywgIDAuODgzNywgIDEuMDYwNCwgIDEuMjA1MywgIDEuMzc1NSwgIDEuNTM5NywgIDEuNzAwMSwKKyAgICAgMS44NDA5LCAgMi4wMDM5LCAgMi4xNDk4LCAgMi4zMDgwLCAgMi40NTM1LCAgMi42MDYzLCAgMi43NTA1LCAgMi45MTEwLAorICAgICAwLjA1NjIsICAwLjIwNjYsICAwLjQwMzQsICAwLjU0OTAsICAwLjY2ODIsICAwLjc5MjQsICAwLjk0OTUsICAxLjA4MDAsCisgICAgIDEuMTg2OSwgIDEuMzE1NiwgIDEuNDgzNCwgIDEuNjYxOSwgIDEuODQwNCwgIDIuMDE5OSwgIDIuMTUwOSwgIDIuMjc1NSwKKyAgICAgMi40MDcyLCAgMi41NTgwLCAgMi42OTkzLCAgMi44OTEzLCAgMC4wOTM5LCAgMC4yMzAzLCAgMC4zNzQyLCAgMC41MjYwLAorICAgICAwLjY2NjIsICAwLjgyOTQsICAwLjk3NjksICAxLjEzMTUsICAxLjI3OTIsICAxLjQxNTMsICAxLjU0MzYsICAxLjY3MDEsCisgICAgIDEuODIxNSwgIDEuOTkyMCwgIDIuMTMxMCwgIDIuMzAwNSwgIDIuNDUzNCwgIDIuNTc4NiwgIDIuNzIwNCwgIDIuOTA2OCwKKyAgICAgMC4xMDA1LCAgMC4yNDQyLCAgMC4zODk4LCAgMC41Mzk4LCAgMC42OTU4LCAgMC44NDc0LCAgMS4wMDA4LCAgMS4xNTU2LAorICAgICAxLjMwMjAsICAxLjQ0NTYsICAxLjU5NTQsICAxLjc0NzAsICAxLjg5MjIsICAyLjA1MDAsICAyLjIwMTksICAyLjM0OTIsCisgICAgIDIuNDk2MywgIDIuNjQxMiwgIDIuNzg5MCwgIDIuOTQyMywgIDAuMTAyMiwgIDAuMjAzMSwgIDAuMzIxMywgIDAuNDQwMiwKKyAgICAgMC41NjM3LCAgMC43MTE3LCAgMC44NjczLCAgMS4wMjQyLCAgMS4xNzI3LCAgMS4zMjA2LCAgMS40ODQ2LCAgMS42NDY1LAorICAgICAxLjgwMTUsICAxLjk2NTUsICAyLjEyMzMsICAyLjI4NzMsICAyLjQ0NjQsICAyLjYwNzQsICAyLjc2ODUsICAyLjk0MDksCisgICAgIDAuMTk4NSwgIDAuMzQ5NywgIDAuNDYyMiwgIDAuNTk4MiwgIDAuNzQ4OSwgIDAuODc1MiwgIDAuOTkyNSwgIDEuMTY3OSwKKyAgICAgMS4zMjg4LCAgMS40NjA2LCAgMS41ODIwLCAgMS43NDkyLCAgMS44OTIyLCAgMi4wNTExLCAgMi4xNzgwLCAgMi4zMzczLAorICAgICAyLjQ3NjAsICAyLjYyMzMsICAyLjc0NjYsICAyLjg5NzgsICAwLjEyODQsICAwLjI0MzMsICAwLjM2MzAsICAwLjQ4NTIsCisgICAgIDAuNjExNywgIDAuNzQ2MCwgIDAuODkwNCwgIDEuMDM2MCwgIDEuMTczOCwgIDEuMzE0MiwgIDEuNDY5NiwgIDEuNjE4NSwKKyAgICAgMS43NzE5LCAgMS45MzE4LCAgMi4wOTYxLCAgMi4yNjk3LCAgMi40NDA4LCAgMi42MDQ2LCAgMi43NjgxLCAgMi45NDUxLAorICAgICAwLjEwNDIsICAwLjIyODYsICAwLjM1OTgsICAwLjUwNjQsICAwLjY0MzgsICAwLjc4OTksICAwLjkzNTAsICAxLjA4OTEsCisgICAgIDEuMjMyMywgIDEuMzgwNywgIDEuNTIyNSwgIDEuNjc0NywgIDEuODE1MywgIDEuOTY2OSwgIDIuMTE0NSwgIDIuMjgzMiwKKyAgICAgMi40NDMwLCAgMi42MDg1LCAgMi43NzQ4LCAgMi45MzQ2LCAgMC4wNzgwLCAgMC4xNzI0LCAgMC4yNDQwLCAgMC4zNDg5LAorICAgICAwLjUyODAsICAwLjc0MjYsICAwLjkyNzIsICAxLjA5MTQsICAxLjI1NjIsICAxLjQxODgsICAxLjU4MDQsICAxLjczNzYsCisgICAgIDEuODkwOSwgIDIuMDQ3MywgIDIuMTk0NiwgIDIuMzQ1NywgIDIuNDk1MCwgIDIuNjQyNCwgIDIuNzkyNiwgIDIuOTU0OSwKKyAgICAgMC4xMTAzLCAgMC4yNjA4LCAgMC40MDg3LCAgMC41NTM4LCAgMC42OTIzLCAgMC44NDE4LCAgMC45OTQwLCAgMS4xNTA3LAorICAgICAxLjI5MTksICAxLjQ0MDYsICAxLjU4MDIsICAxLjcyNjIsICAxLjg2MzgsICAyLjAwODUsICAyLjE1NzIsICAyLjI5NzUsCisgICAgIDIuNDMyOSwgIDIuNTg2NiwgIDIuNzM4MCwgIDIuOTEwNywgIDAuMTI5NywgIDAuMjUzMiwgIDAuNDAwMywgIDAuNTMyOSwKKyAgICAgMC42NzMzLCAgMC43OTUwLCAgMC45NTU3LCAgMS4wODU5LCAgMS4yMjM1LCAgMS4zNTM4LCAgMS41MDM3LCAgMS42Mzg5LAorICAgICAxLjc5NjQsICAxLjkyODUsICAyLjA4OTgsICAyLjI1NDEsICAyLjQyMzEsICAyLjU3MTEsICAyLjY4NzUsICAyLjg5NDcsCisgICAgIDAuMDg3MSwgIDAuMTk2OCwgIDAuMzQyNSwgIDAuNDk0OSwgIDAuNjQyNCwgIDAuNzk1OSwgIDAuOTUzNCwgIDEuMTEzMiwKKyAgICAgMS4yNjU2LCAgMS40MjI5LCAgMS41Nzg1LCAgMS43MjcxLCAgMS44NzI5LCAgMi4wMzU1LCAgMi4xOTk4LCAgMi4zNTYyLAorICAgICAyLjUxNTEsICAyLjY2NjMsICAyLjgxNDUsICAyLjk1MzQsICAwLjEwMzgsICAwLjIyMDQsICAwLjMyNDgsICAwLjQ1NjYsCisgICAgIDAuNTk0NywgIDAuNzQ0MywgIDAuODgxMSwgIDEuMDM3OSwgIDEuMjAzMSwgIDEuMzc3MiwgIDEuNTQzMCwgIDEuNzA5MiwKKyAgICAgMS44NjI1LCAgMi4wMzIyLCAgMi4xOTA0LCAgMi4zNDE3LCAgMi40OTYwLCAgMi42NDU4LCAgMi43OTc5LCAgMi45NDg1LAorICAgICAwLjEzMjksICAwLjI3NjMsICAwLjM5NDMsICAwLjUxNDcsICAwLjY1MTIsICAwLjgwNzEsICAwLjk0MTAsICAxLjA4NzksCisgICAgIDEuMjI5OCwgIDEuMzg1MCwgIDEuNTI4MiwgIDEuNjY3NCwgIDEuODEzNywgIDEuOTk5MywgIDIuMTM0NCwgIDIuMjc0OSwKKyAgICAgMi40MjU3LCAgMi41ODYzLCAgMi43NDEwLCAgMi45MTg0LCAgMC4xMDUyLCAgMC4yMTQyLCAgMC4zNTg0LCAgMC41MDMzLAorICAgICAwLjYzODcsICAwLjc4MDQsICAwLjkzMjAsICAxLjA3ODAsICAxLjIxNzIsICAxLjM3NjQsICAxLjU0MjEsICAxLjY4ODcsCisgICAgIDEuODI0NiwgIDEuOTgzMywgIDIuMTI0NSwgIDIuMjc5NywgIDIuNDIzNywgIDIuNTc3OSwgIDIuNzI1NywgIDIuOTA5NywKKyAgICAgMC4xMDkyLCAgMC4yNjc2LCAgMC40MDcxLCAgMC41MzU1LCAgMC42NjYxLCAgMC44MTQyLCAgMC45NjIxLCAgMS4xMTczLAorICAgICAxLjI2MjgsICAxLjQxODUsICAxLjU2OTYsICAxLjcyMjAsICAxLjg1OTUsICAyLjAxNzgsICAyLjE3MjAsICAyLjMyMjEsCisgICAgIDIuNDcxOCwgIDIuNjI1OSwgIDIuNzc3NSwgIDIuOTMzNCwgIDAuMDkyOSwgIDAuMjAxNywgIDAuMzA3MywgIDAuNDU3MCwKKyAgICAgMC41Nzc1LCAgMC43NjM1LCAgMC45Mjk5LCAgMS4wODMyLCAgMS4yMzM0LCAgMS4zOTM1LCAgMS41NDIwLCAgMS43MTEyLAorICAgICAxLjg2MDEsICAyLjAzMDksICAyLjE3MzUsICAyLjMyMzAsICAyLjQ1NDMsICAyLjYwMzQsICAyLjc0MTgsICAyLjg5ODgsCisgICAgIDAuMDc3NSwgIDAuMjAwNSwgIDAuMzQ5MCwgIDAuNTIwMCwgIDAuNjc0NywgIDAuODM4MywgIDAuOTg4NSwgIDEuMTczOCwKKyAgICAgMS4zMTQxLCAgMS40MjM2LCAgMS41ODkyLCAgMS43NDAyLCAgMS44NDc0LCAgMi4wMjEwLCAgMi4xNTkzLCAgMi4yNzMwLAorICAgICAyLjQyMzUsICAyLjU2MDQsICAyLjcxMjgsICAyLjkwMDUsICAwLjExMDQsICAwLjIyOTIsICAwLjMzNTMsICAwLjQ3MzIsCisgICAgIDAuNjE1MiwgIDAuNzY3NSwgIDAuOTE2NCwgIDEuMDkwNywgIDEuMjU5NCwgIDEuNDA2NCwgIDEuNTIxOCwgIDEuNjQyNiwKKyAgICAgMS44MDE4LCAgMS45OTM3LCAgMi4xMzYyLCAgMi4yOTYxLCAgMi40NTIzLCAgMi42MDgzLCAgMi43NjEzLCAgMi45MjAyLAorICAgICAwLjA4MjYsICAwLjIwMDAsICAwLjMzODQsICAwLjUxNDQsICAwLjY2OTQsICAwLjgzNzcsICAwLjk4NzAsICAxLjE0NjEsCisgICAgIDEuMjk1MCwgIDEuNDQ5NSwgIDEuNTg3MiwgIDEuNzM4NywgIDEuODc5MywgIDIuMDMyOSwgIDIuMTcyMywgIDIuMzExNCwKKyAgICAgMi40NDE1LCAgMi41OTA4LCAgMi43MzU0LCAgMi45MDI4LCAgMC4xMDYzLCAgMC4yMjY4LCAgMC4zNDQyLCAgMC40NzM1LAorICAgICAwLjYxMTYsICAwLjc1MDcsICAwLjkwMjgsICAxLjA3NjgsICAxLjI0MjYsICAxLjQwNTIsICAxLjU1NjYsICAxLjcwMTUsCisgICAgIDEuODI0MywgIDEuOTc0MiwgIDIuMTI3NiwgIDIuMjgyNCwgIDIuNDI2MiwgIDIuNTk1MywgIDIuNzYyNywgIDIuOTI5MCwKKyAgICAgMC4xMTUwLCAgMC4yODE0LCAgMC40NTQzLCAgMC42MDk1LCAgMC43MzczLCAgMC44NTkyLCAgMC45OTA4LCAgMS4xMTA4LAorICAgICAxLjIzMzksICAxLjM1OTAsICAxLjQ4NjQsICAxLjYxNjgsICAxLjczOTIsICAxLjg3NTIsICAyLjAyMTIsICAyLjE2ODgsCisgICAgIDIuMzEyOCwgIDIuNDg2OSwgIDIuNzAxOSwgIDIuOTIzOSwgIDAuMDk0OCwgIDAuMjA3NCwgIDAuMzQzMywgIDAuNDk0MywKKyAgICAgMC42MzQ2LCAgMC43NjQ1LCAgMC44ODA5LCAgMS4wNjEwLCAgMS4yMzA3LCAgMS4zNDg3LCAgMS40NjU1LCAgMS42MTg2LAorICAgICAxLjc1MzQsICAxLjg4NTksICAyLjA0ODYsICAyLjIyMDAsICAyLjM4MzUsICAyLjU1ODEsICAyLjc1NjUsICAyLjk1MDIsCisgICAgIDAuMTA2MiwgIDAuMjIzOSwgIDAuMzY4MywgIDAuNTE5NywgIDAuNjcwNCwgIDAuODE4NCwgIDAuOTY0MiwgIDEuMTEyNywKKyAgICAgMS4yNTU2LCAgMS4zOTc2LCAgMS41NDA1LCAgMS42OTQwLCAgMS44Mzc1LCAgMS45ODg4LCAgMi4xMzc3LCAgMi4yOTgwLAorICAgICAyLjQ1NTUsICAyLjYxODQsICAyLjc4NDksICAyLjk0NTIsICAwLjA4ODgsICAwLjIwMDUsICAwLjI4NDcsICAwLjQzMjIsCisgICAgIDAuNTc2MywgIDAuNzU3NywgIDAuOTI2MiwgIDEuMTA5NSwgIDEuMjcxOSwgIDEuNDMzMSwgIDEuNTg0MywgIDEuNzQ1MiwKKyAgICAgMS44ODQ1LCAgMi4wMzg1LCAgMi4xODA1LCAgMi4zMzQ1LCAgMi40NzUwLCAgMi42MjE3LCAgMi43NTU1LCAgMi45MDEzLAorICAgICAwLjE3MTMsICAwLjI2MTcsICAwLjM4NjgsICAwLjU4NTksICAwLjcwNzMsICAwLjg1MzUsICAxLjA1OTMsICAxLjE3NzgsCisgICAgIDEuMzEwOSwgIDEuNDUwOCwgIDEuNTkxMCwgIDEuNzQ2MywgIDEuODkxMSwgIDIuMDY1MSwgIDIuMjAzNSwgIDIuMzM1NSwKKyAgICAgMi40OTQ3LCAgMi42NDQwLCAgMi43NDI0LCAgMi44OTQzLCAgMC4xMzQ2LCAgMC4yNTQ5LCAgMC40MDg5LCAgMC41NDg4LAorICAgICAwLjY5NDksICAwLjgzOTQsICAwLjk4MTAsICAxLjExNDUsICAxLjI1MjgsICAxLjQwNDQsICAxLjU0MjMsICAxLjY4NzIsCisgICAgIDEuODI3NCwgIDEuOTcyNiwgIDIuMTQwMywgIDIuMjgwOSwgIDIuNDEyOCwgIDIuNTU2NCwgIDIuNjg4NywgIDIuODg5NSwKKyAgICAgMC4wNzc2LCAgMC4xNjIxLCAgMC4yNTUzLCAgMC40MTkxLCAgMC41OTg4LCAgMC43OTIxLCAgMC45NjUxLCAgMS4xMzUwLAorICAgICAxLjI5MzAsICAxLjQ0NzUsICAxLjYwMTEsICAxLjc1ODUsICAxLjkwNjgsICAyLjA2MzgsICAyLjIxMDIsICAyLjM1OTQsCisgICAgIDIuNTA5NiwgIDIuNjU4MSwgIDIuODA5OSwgIDIuOTY1NCwgIDAuMDg2NCwgIDAuMTc3OCwgIDAuMjg1NCwgIDAuNDIzNSwKKyAgICAgMC41NTY4LCAgMC43MjIwLCAgMC44OTYzLCAgMS4wNjA5LCAgMS4yMjE3LCAgMS4zODMwLCAgMS41NDIyLCAgMS43MDE4LAorICAgICAxLjg1NTEsICAyLjAyMDYsICAyLjE3ODMsICAyLjMzMjgsICAyLjQ4NjksICAyLjYzNjYsICAyLjc5MjMsICAyLjk1MzksCisgICAgIDAuMTE0NCwgIDAuMjU3NiwgIDAuNDE4NiwgIDAuNTU5NCwgIDAuNjg3NSwgIDAuODIyMSwgIDAuOTU5OCwgIDEuMDk0NCwKKyAgICAgMS4yMjczLCAgMS4zNzEzLCAgMS41MTUyLCAgMS42NjI4LCAgMS44MDcwLCAgMS45NTI1LCAgMi4wOTY1LCAgMi4yNTM1LAorICAgICAyLjQxMzIsICAyLjU3MjUsICAyLjcyNTAsICAyLjkxNTAsICAwLjEwNzksICAwLjIyMjEsICAwLjMzMzQsICAwLjQ4NDUsCisgICAgIDAuNjA4MywgIDAuNzUxNiwgIDAuOTAxOCwgIDEuMDU5NCwgIDEuMjA2MCwgIDEuMzY3MywgIDEuNTIxMiwgIDEuNjg4MCwKKyAgICAgMS44MjA4LCAgMS45ODMxLCAgMi4xMjY5LCAgMi4yOTA5LCAgMi40MzY2LCAgMi42MDI3LCAgMi43MzM5LCAgMi44OTI0LAorICAgICAwLjA5OTQsICAwLjIyMzMsICAwLjM2MzQsICAwLjUxNDUsICAwLjY1NjgsICAwLjgxMzEsICAwLjk3NDYsICAxLjEyOTYsCisgICAgIDEuMjY2NiwgIDEuNDExNiwgIDEuNTc0OCwgIDEuNzI2NCwgIDEuODY0OSwgIDIuMDIxNywgIDIuMTcxNiwgIDIuMzI5MywKKyAgICAgMi40OTAwLCAgMi42NDU1LCAgMi43ODE4LCAgMi45MzYyLCAgMC4xMTIwLCAgMC4yMDc5LCAgMC4zMTI4LCAgMC40MTI0LAorICAgICAwLjUyOTEsICAwLjY4MTYsICAwLjg0NzgsICAxLjAxNTAsICAxLjE3NzIsICAxLjM0NTYsICAxLjUyMDgsICAxLjY4ODIsCisgICAgIDEuODQ1OCwgIDIuMDA3OCwgIDIuMTYyNywgIDIuMzE5OCwgIDIuNDczMywgIDIuNjI1MSwgIDIuNzc5NiwgIDIuOTQ4OSwKKyAgICAgMC4wODUzLCAgMC4yMDMwLCAgMC4zNjY5LCAgMC41MzI2LCAgMC42Njc4LCAgMC44MDg2LCAgMC45NTI2LCAgMS4xMTQyLAorICAgICAxLjI1NTEsICAxLjQxNTgsICAxLjU2OTQsICAxLjcwNzMsICAxLjg0MzEsICAxLjk2ODYsICAyLjExNTMsICAyLjIzNzYsCisgICAgIDIuMzY4NiwgIDIuNTU5MSwgIDIuNzMyMCwgIDIuOTEwNCwgIDAuMDkwNSwgIDAuMjE2NiwgIDAuMzUzOSwgIDAuNTIwMSwKKyAgICAgMC42NzAwLCAgMC44MzQ2LCAgMC45ODgzLCAgMS4xNDU3LCAgMS4yNzE0LCAgMS4zODQ1LCAgMS41MTcyLCAgMS42Njg4LAorICAgICAxLjgwMDgsICAxLjk1MzUsICAyLjEwMTksICAyLjI3MDgsICAyLjQxMzUsICAyLjU5NzQsICAyLjc0ODYsICAyLjkwMzMsCisgICAgIDAuMDA4NCwgIDAuMDM3NCwgIDAuMDE2NCwgLTAuMDE1MywgIDAuMDI4OCwgIDAuMDEwNywgLTAuMDI1NSwgLTAuMDI0MiwKKyAgICAgMC4wMDAwLCAtMC4wMDU1LCAtMC4wMDgxLCAtMC4wMDc1LCAtMC4wMDIyLCAtMC4wMDUyLCAtMC4wMDY5LCAtMC4wMDE3LAorICAgICAwLjAwMDMsICAwLjAwOTEsICAwLjAwMjgsIC0wLjAwMjcsICAwLjAwODUsICAwLjAwNDMsIC0wLjAyMzUsIC0wLjA0MTEsCisgICAgIDAuMDIwMiwgIDAuMDM1OSwgIDAuMDM3NiwgIDAuMDMyMSwgIDAuMDMwNiwgLTAuMDM1OCwgLTAuMDI3NiwgLTAuMDA5MCwKKyAgICAgMC4wMDMyLCAgMC4wMDQ4LCAgMC4wMzA5LCAgMC4wMzMyLCAgMC4wMjg0LCAgMC4wMjM3LCAgMC4wMDUxLCAtMC4wMTAxLAorICAgIC0wLjAyMzMsIC0wLjA0MjgsIC0wLjA1ODUsIC0wLjAzODcsICAwLjAwMzksICAwLjAwODEsICAwLjAwMjksIC0wLjAwMTcsCisgICAgLTAuMDAwNiwgLTAuMDA2OCwgIDAuMDA0NCwgIDAuMDE4MiwgIDAuMDM3NiwgIDAuMDM4NywgLTAuMDMzNCwgLTAuMDI2OSwKKyAgICAtMC4wMTgyLCAtMC4wMDY5LCAtMC4wMDI2LCAgMC4wMDM1LCAtMC4wMDQ5LCAtMC4wMjEyLCAtMC4wNDA4LCAtMC4wMjQ1LAorICAgICAwLjAxODYsICAwLjAxODksICAwLjAxNTMsICAwLjAxMjAsICAwLjAxNTcsICAwLjAwNTUsIC0wLjAwNDYsICAwLjAxNzksCisgICAgIDAuMDI4NCwgLTAuMDAzMiwgLTAuMDI2MSwgLTAuMDIwNSwgLTAuMDAzOSwgIDAuMDE3NCwgIDAuMDI5OSwgIDAuMDIwNywKKyAgICAgMC4wMDEyLCAtMC4wMDU2LCAgMC4wMDEwLCAgMC4wMTQxLCAtMC4wMTE5LCAgMC4wMTkwLCAgMC4wMzE1LCAgMC4wMDMzLAorICAgIC0wLjAxMjgsICAwLjAzMDAsICAwLjAzMjgsICAwLjAzMDgsICAwLjAzNTMsICAwLjAyNjYsICAwLjAwNjYsIC0wLjAzMjgsCisgICAgLTAuMDI3MywgIDAuMDA1NCwgIDAuMDE0NSwgIDAuMDE3NSwgIDAuMDAxNSwgLTAuMDE3MSwgIDAuMDA2MiwgLTAuMDE2NCwKKyAgICAgMC4wMDQ1LCAtMC4wMDcxLCAgMC4wMDI1LCAgMC4wMjc4LCAgMC4wMjgzLCAgMC4wMTE3LCAtMC4wMDI2LCAtMC4wMjg1LAorICAgIC0wLjA0MDgsIC0wLjAzNjYsIC0wLjAwNTksIC0wLjAyMDgsIC0wLjAzNTQsIC0wLjAzMzQsIC0wLjAyNjMsIC0wLjAwNjQsCisgICAgIDAuMDA3MiwgLTAuMDAwNiwgLTAuMDIzNSwgLTAuMDAzNywgLTAuMDMwNywgLTAuMDI5NCwgLTAuMDE2MywgLTAuMDE5NywKKyAgICAtMC4wMjM1LCAgMC4wMTkyLCAgMC4wMDEzLCAtMC4wMjE5LCAtMC4wMTIzLCAtMC4wMDA0LCAtMC4wMDgxLCAtMC4wMDk2LAorICAgIC0wLjAxMjMsIC0wLjAxMDEsICAwLjAwMjEsICAwLjAxNTEsICAwLjAxMDYsICAwLjAxNTEsICAwLjAyOTIsICAwLjAwMzMsCisgICAgIDAuMDI4MywgIDAuMDEyNCwgIDAuMDA1OCwgLTAuMDAxNywgLTAuMDAzOCwgIDAuMDE1MiwgIDAuMDE0MSwgIDAuMDEzMiwKKyAgICAgMC4wMTc4LCAgMC4wMTU3LCAgMC4wMDczLCAgMC4wMTc2LCAgMC4wMTQxLCAgMC4wMDk3LCAtMC4wMDkyLCAtMC4wMTYzLAorICAgIC0wLjAyMzAsIC0wLjAxMzQsIC0wLjAwOTksIC0wLjAxNDcsICAwLjAwNDAsIC0wLjAxODMsIC0wLjAxNzUsIC0wLjAwODAsCisgICAgLTAuMDA4MywgLTAuMDI5MCwgLTAuMDQxNywgLTAuMDM5OCwgLTAuMDI2OSwgLTAuMDE5OSwgLTAuMDE0MywgLTAuMDA1MywKKyAgICAtMC4wMDk5LCAtMC4wMDU0LCAtMC4wMTk5LCAtMC4wMjE5LCAtMC4wMTcwLCAgMC4wMTA3LCAgMC4wMTk0LCAgMC4wMDM1LAorICAgICAwLjA0MzcsICAwLjA0MDYsICAwLjAyMTUsICAwLjAxMjAsICAwLjAwNTMsIC0wLjAwMjgsICAwLjAyMzgsICAwLjAzMzcsCisgICAgIDAuMDIxNywgIDAuMDAxMSwgIDAuMDIyNywgIDAuMDI0NCwgIDAuMDMyNywgIDAuMDM3OCwgIDAuMDQzNywgIDAuMDM1NiwKKyAgICAtMC4wMDMzLCAgMC4wMTEzLCAgMC4wNDA3LCAgMC4wMzM0LCAtMC4wMTI1LCAtMC4wMDAzLCAtMC4wMTQxLCAtMC4wMjczLAorICAgIC0wLjAxMzcsIC0wLjAwNzksIC0wLjAxNDUsIC0wLjAwNzEsICAwLjAxMTQsICAwLjAxODEsICAwLjAxNTAsICAwLjAwODUsCisgICAgLTAuMDA3NywgLTAuMDAzOCwgLTAuMDIxOSwgLTAuMDI2MywgLTAuMDE4NywgLTAuMDIzMywgIDAuMDEzMywgIDAuMDI2NSwKKyAgICAtMC4wMTU2LCAtMC4wMDkxLCAtMC4wMTEwLCAtMC4wMDE2LCAgMC4wMTQzLCAgMC4wMTc3LCAgMC4wMjQwLCAgMC4wMDgyLAorICAgIC0wLjAxNDMsIC0wLjAyNTcsIC0wLjAwMTQsICAwLjAwMDIsICAwLjAwODIsICAwLjAxODAsICAwLjAzMjUsICAwLjAzNDAsCisgICAgLTAuMDE1MywgLTAuMDM4OSwgLTAuMDI0MCwgIDAuMDA4MiwgIDAuMDE0MCwgIDAuMDA0NiwgLTAuMDEzOCwgLTAuMDM3OCwKKyAgICAtMC4wMzY2LCAgMC4wMjk3LCAgMC4wMjUyLCAgMC4wMDc4LCAgMC4wMDYzLCAgMC4wMDA2LCAgMC4wMDQ0LCAgMC4wMDc0LAorICAgICAwLjAwOTQsICAwLjAxMTMsICAwLjAxMDUsICAwLjAxMzcsICAwLjA0MzgsICAwLjAyNjIsIC0wLjAwNzgsIC0wLjAxODUsCisgICAgLTAuMDIxNSwgLTAuMDQwNywgLTAuMDQzNSwgLTAuMDIwOCwgLTAuMDAwNCwgLTAuMDE0NCwgLTAuMDIwNSwgLTAuMDI0OCwKKyAgICAtMC4wMTU5LCAtMC4wMDY5LCAtMC4wMTUzLCAgMC4wMTMyLCAgMC4wMzU1LCAgMC4wMjk4LCAgMC4wMTIwLCAgMC4wMDcyLAorICAgICAwLjAyMzYsICAwLjA1MjYsICAwLjA0NzksICAwLjAyMzMsIC0wLjAxMzMsIC0wLjAyODMsIC0wLjA0NjgsIC0wLjA1NDksCisgICAgLTAuMDM3MCwgIDAuMDAzMiwgIDAuMDA1NiwgIDAuMDAyMywgIDAuMDA1MCwgIDAuMDAyNCwgIDAuMDI3OSwgIDAuMDExNiwKKyAgICAtMC4wMDQ1LCAtMC4wMDEyLCAgMC4wMTA3LCAgMC4wMTkwLCAgMC4wMjUzLCAgMC4wMTkxLCAgMC4wMDQzLCAgMC4wMTkzLAorICAgIC0wLjAzNDgsIC0wLjAyNDYsICAwLjAxMjMsICAwLjAyMTAsICAwLjAxMzUsIC0wLjAwOTYsIC0wLjAxMDksIC0wLjAwNzYsCisgICAgLTAuMDE1NiwgLTAuMDI5MCwgIDAuMDE2MCwgIDAuMDE5NCwgIDAuMDIxOSwgIDAuMDI1OSwgIDAuMDI1MCwgIDAuMDE5NSwKKyAgICAgMC40OTQ4LCAgMC40OTYxLCAgMC40OTQwLCAgMC40ODc4LCAgMC40ODQ5LCAgMC40NzI3LCAgMC40NTcxLCAgMC40NTUxLAorICAgICAwLjQ1MzQsICAwLjQ0NjgsICAwLjQ0MTIsICAwLjQzNTQsICAwLjQyOTgsICAwLjQyNzIsICAwLjQ0OTgsICAwLjQ1MDYsCisgICAgIDAuNDU2MCwgIDAuNDU5MiwgIDAuNDc1OCwgIDAuNDk0MSwgIDAuMjQ3NiwgIDAuMTc3MSwgIDAuMTk3NCwgIDAuMTg4MSwKKyAgICAgMC4xNjY3LCAgMC4xODI2LCAgMC4yMDY3LCAgMC4yMDMxLCAgMC4xNzM0LCAgMC4xNTM0LCAgMC4xNDE1LCAgMC4xNzYxLAorICAgICAwLjE4OTcsICAwLjE3NzIsICAwLjE2NTEsICAwLjEyNDcsICAwLjEwNDEsICAwLjEyMzEsICAwLjE4MDksICAwLjIyMzQsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBzaGFwZThbXSA9IHsKKyAgICAgIDI3NjUsICAgMTI2MiwgICA2NjI0LCAgICA4NjcsICAgIDY4OCwgICAxODg0LCAgIDMyNDUsICAgMTI0OCwKKyAgICAgLTIxNjAsICAgIDU5MywgICAgMTgyLCAgLTEwMDQsICAtMTA2NywgICAgNjg3LCAgIDEwMjEsICAgLTkyMCwKKyAgICAgIDEzOTYsICAgLTI0MiwgIC0yODE3LCAgLTE4MzgsICAtMzM1MSwgICAxMDAwLCAgIDU5OTUsICAgMjQ1OSwKKyAgICAgIC0yODMsICAgMTkwOSwgICAxNDUyLCAgLTQ1NjksICAgIDU1NiwgIC0yMDA0LCAgICAtNDIsICAtMzM5MywKKyAgICAgICAtNTAsICAgLTM4NSwgICAgNTk3LCAgICA5ODMsICAgIDQyMCwgICA2MzExLCAgLTE1NzIsICAtMTY2NSwKKyAgICAgIDYxMjgsICAtMTY4OCwgIC01MTkxLCAgIC0zMzcsICAtNDE5OSwgICAgMzcxLCAgIDEwMzIsICAgIC04NCwKKyAgICAgIDIxNjksICAgIDkzMSwgICAtMzkyLCAgIC0yNTAsICAgIDEzNywgICAgODMxLCAgIDgxOTQsICAgLTQ4OSwKKyAgICAgICAtOTIsICAgIDIwOSwgICAgMTE1LCAgIDE0NTMsICAgIDI0NiwgICAtNjQ3LCAgICA5MzYsICAgMTA5NywKKyAgICAgIC00MDAsICAgIDU5NywgICAgMzkyLCAgICAgOTMsICAtNzcwOSwgICAtNzExLCAgIC03MjQsICAgMjA1MSwKKyAgICAgICA0OTcsICAgMTkxOSwgICAtODc2LCAgIC03NjksICAgLTE3MiwgICAyOTcyLCAgICA5NTIsICAgIDU1NSwKKyAgICAgICAxNTEsICAgLTYxNywgICAgNzczLCAgIDQ4NDAsICAtMzY3MSwgICAgODQxLCAgICAyNDQsICAgLTY2MSwKKyAgICAgLTM0MjQsICAgIDk1OCwgICAgIDgxLCAgICA1MzIsICAgLTMxNSwgICAgNzk2LCAgIDU0OTEsICAgLTUxNiwKKyAgICAgICAgLTEsICAtMTM3MSwgICAtNTMxLCAgLTU1MzgsICAgIDMxMywgIC0xNzQ5LCAgIDI0MTMsICAgLTgzNSwKKyAgICAgLTMxNDMsICAgLTI0NCwgIC0zNDcwLCAgIC04NTAsICAtNDI0MSwgICAtODU5LCAgICAtNzQsICAgMjE0MSwKKyAgICAgLTEwMDUsICAgNDY0MywgICAtMzM5LCAgIDQwODksICAgLTg2MSwgIC02NjEyLCAgICA0ODMsICAtMjg4OCwKKyAgICAgIC01ODAsICAgIC00NSwgICAzNjYyLCAgICA5MTgsICAgLTMxNywgICAzNTk2LCAgIC03NDEsICAgIDg5NywKKyAgICAgLTI1NzgsICAgLTY1NCwgIC0xNjI4LCAgLTE4NjUsICAgIDYyOSwgICAzMjE5LCAgICAyMTQsICAtMTg5OCwKKyAgICAgIDExNzMsICAtNDUwOSwgICAxNjgyLCAgLTIxNjEsICAgIDY5NywgICAtMTQ3LCAgIDk4MzksICAgIDc1MSwKKyAgICAgLTEwOTQsICAgLTM0MSwgICAtNjY5LCAgLTEzMjIsICAgIDY0OSwgICAtODMyLCAgIC0zODIsICAtNTQ2NywKKyAgICAgICAtNDQsICAgMzUxMCwgICAxMzEyLCAgIDMxMDQsICAgLTIwMiwgICAxODcwLCAgIC0xNTUsICAgIDYwMSwKKyAgICAgICA3MTksICAgIC0yMiwgICAtMzUwLCAgICAzOTQsICAgICA4MSwgICAgMzk3LCAgLTkxODUsICAgLTE3NCwKKyAgICAgICAzNTEsICAtNDcxNywgIC00NDUwLCAgIDM2NzIsICAgMTE2MywgICAyMzUxLCAgIDE3MjAsICAgMTA0OCwKKyAgICAgLTEyMjEsICAgLTI4MCwgICAgLTE4LCAgICAtMTUsICAgIDY3OCwgIC0zOTMxLCAgIDQ3MDcsICAgIC05OSwKKyAgICAgIDE4MjMsICAgLTUzNSwgIC0xODM2LCAgICAxMzgsICAgMTE2NiwgIC0zMDMxLCAgIDU1MTUsICAgMTM2MiwKKyAgICAgIDEyMzUsICAgIDQ1NSwgICAgNTk1LCAgLTM2NzEsICAgMTEwMiwgICAtMTYzLCAgICAgNjIsICAgMTEwNCwKKyAgICAgICA4MTMsICAgIDg3MCwgICAtMjk1LCAgLTEwODgsICAgLTI5OSwgIC0zOTc2LCAgICA4MDUsICAtNzQ2OCwKKyAgICAgIC00MTIsICAtMjEwOSwgICAgMjM2LCAgICAgNDYsICAtNTc2NCwgICAgNjE1LCAgLTE0NzUsICAgIDg1MywKKyAgICAgICA3OTAsICAtNjE5NywgICAgMzEyLCAgICA2MzcsICAtMzkyMywgICAtNDIyLCAgLTEwODYsICAtNTY0NywKKyAgICAgICA4NzgsICAtMTQxMCwgICAyMDg1LCAgICAtNTEsICAtMjk0MSwgICAtNzY5LCAgICAtNjMsICAgIDgzOCwKKyAgICAgICA4MjMsICAgIDc0MSwgICAyNzg1LCAgICA0NTAsICAtNzAwMywgICAtMTIxLCAgIC05MTUsICAgICA2MCwKKyAgICAgICAtNDEsICAgICAgMCwgICAgLTM5LCAgIDg3NzQsICAgIDY0NywgICAtNTIxLCAgICAzNzksICAgLTM0MiwKKyAgICAgIC0zNDQsICAgIDgxOCwgICAxMzE2LCAgIDEwNTYsICAgIDE4MiwgICAyNzY1LCAgIC00NjcsICAgNzg4NiwKKyAgICAgICAgNDUsICAgIDc5MSwgICAtNDE1LCAgIDM4NjQsICAtMjQyOCwgICAyMjU1LCAgIC02NjEsICAgIC02NCwKKyAgICAgIDE2OTMsICAgIDE0NCwgICAxNzg0LCAgLTExOTQsICAgIC00NiwgIC0xODU2LCAgIDEyMDgsICAgNDEzMSwKKyAgICAgICA5MTQsICAgODAyOCwgICAgLTE3LCAgIDE5MzksICAtMTQxNSwgICAgNTMzLCAgICAyOTEsICAgLTQ2NiwKKyAgICAgICAxODYsICAgLTcwNSwgICAgNjY4LCAgIC02MTQsICAgLTI1MywgIC0yMTkwLCAgICAyODcsICAgMzkyOSwKKyAgICAgIDE0NzIsICAtMTU2MSwgICAgICA1LCAgICA4ODksICAtMjAyMCwgICAgMTU4LCAgICAtMTQsICAtMTQxOSwKKyAgICAgIDEzMzgsICAgLTM1MywgICAgNjIyLCAgICAtNTQsICAgICA4NywgIC0xMTA0LCAgLTI5MTEsICAgIDUxMywKKyAgICAgIC02MzIsICAgMTUzMywgICAtMjY3LCAgICAgMjIsICAgNjU2NywgICAgMjk1LCAgICAzMjUsICAgNjg4MywKKyAgICAgICA5NjMsICAgLTM3MywgICAtMzQ5LCAgICAxODMsICAgIDg5NiwgICAxODQ1LCAgLTExNTcsICAgIDM1MSwKKyAgICAgIC0zNjcsICAgMTE3MSwgICA0MzYyLCAgICA1MDgsICAgNTYzMiwgICAgNzA0LCAgLTE0MjAsICAtMTg4NiwKKyAgICAgICA2ODYsICAgNTIzMCwgICAgIC05LCAgIDI0MjIsICAgIDIzMCwgICAgMjY0LCAgIDM3MzgsICAgLTI3MCwKKyAgICAgIC0zNDQsICAgLTUyOCwgICAtOTM2LCAgIDIyODYsICAgLTU0MCwgICA0Mjc0LCAgICAzMzcsICAgLTY2NSwKKyAgICAgICA3MzcsICAgMTYzOSwgIC0xMzA3LCAgIDU4MjcsICAgIDU5MiwgIC0xMzcyLCAgIC00MTIsICAgMTQxOSwKKyAgICAgIDQ1NzksICAgIDMzNSwgICAgMjIzLCAgLTEwNjcsICAgLTExMiwgICAtNDQ2LCAgICAxNDksICAgMTM3NSwKKyAgICAgIC0xNTUsICAgLTM5MiwgIC0xOTgwLCAgICA1NjEsICAgIC02NywgICAgMzQxLCAgIDY5NTcsICAgIDQ3NSwKKyAgICAgMTE0NDksICAgICAzOSwgICAgIDgxLCAgICA3NjYsICAtMTg4MCwgICAgNTU4LCAgIC0xMzQsICAtNzk0MCwKKyAgICAgIC00ODksICAgIDI0OSwgICAtODg2LCAgIC0zNTgsICAgNjg1MCwgICAyNzk0LCAgLTIyMTcsICAgMTExMSwKKyAgICAgLTEyMjIsICAtMTEzMCwgICAtODE4LCAgIDEwNzYsICAtMTgyMywgICAgODY1LCAgLTIyMjAsICAgMTE3OSwKKyAgICAgIDQ0OTIsICAgIDIyNCwgIC0yMDczLCAgIC0zMzgsICAtNTM1MSwgICAtMzkwLCAgICAxMzMsICAgIDQ5NiwKKyAgICAgICAtNDIsICAgIC0xNiwgICAgIDQ2LCAgICA0MzcsICAgIDMyMiwgICAtMjc1LCAgICAtNzIsICAgICA0OCwKKyAgICAgIC0zMjUsICAgIDMxMywgICAxMTA4LCAgLTEwNDQsICAgLTg1MSwgIC01MDMwLCAgIDEwMzUsICAgNDMxNiwKKyAgICAgLTEyODEsICAgLTkxMywgIC0xNDE5LCAgIC05NDEsICAgMTkxNCwgICAgOTYwLCAgIDEyNDIsICAgIDIwMiwKKyAgICAgIDUxMDksICAgIDQ3NSwgICAxMjU0LCAgIDE3MjUsICAtMTUwNCwgICAgIC00LCAgIC0yNjksICAgLTQyMSwKKyAgICAgIC0xNTAsICAtNDQwOSwgICAtNjEwLCAgLTE1NDgsICAtMTY4NCwgICAtODE3LCAgIC0yMTAsICAgICA3MiwKKyAgICAgIC02NzksICAgLTEwNiwgIC0zODA5LCAgLTExMzcsICAgICAgNCwgICA3MjIwLCAgICAtOTUsICAgIDgxMCwKKyAgICAgIDI0MzIsICAgLTMzMSwgICAgNDkyLCAgICAtODEsICAgIDEzOCwgICAgLTYyLCAgIC02MTMsICAgLTYzNiwKKyAgICAgICAxMDYsICAxMDkwOCwgICAgOTEyLCAgICAxNDQsICAgIDE5MiwgICAxMjUxLCAgLTM5NzAsICAgLTk1NCwKKyAgICAgIDExNDUsICAgMTE3NSwgIC0xNzIxLCAgIDUzMjYsICAtMTcyMSwgICAtNTY5LCAgLTM2NjEsICAtMTE2NiwKKyAgICAgIDY2MDUsICAgLTc0NCwgIC0xNDk0LCAgICA4NTMsICAgIDEzNCwgICAzMjU5LCAgIC01MDQsICAtMTc0MCwKKyAgICAgICAxODAsICAgLTIwNywgICAtNjU5LCAgICAxOTYsICAgIDE3OSwgICAtMTA2LCAgICAxMTgsICAgIDc4OSwKKyAgICAgIC04MzQsICAxMDMzOSwgICAtNDIwLCAgLTMwMDIsICAgLTQ1NiwgICAgMTEzLCAgIDY0MzUsICAgIDk0OSwKKyAgICAgICA3MjEsICAtMjcwOSwgIC0xNTk5LCAgIC02ODQsICAtODA2OCwgICAgMTc0LCAgLTE0MTYsICAgIC01OCwKKyAgICAgICA5NzQsICAgIDMwOCwgICAtNzI2LCAgIDEyMzcsICAtMTU5NCwgICAgNTE5LCAgIC0xMzEsICAgLTE5OCwKKyAgICAgLTEzOTUsICAgMTE4MCwgICAtMTczLCAgICAzMzgsICAtNTU4NCwgICAtMjc5LCAgIC0yMzYsICAgNjgxNywKKyAgICAgICAgODksICAgLTIyMCwgICAzOTY3LCAgIC0xMDcsICAgICA2NSwgICAyNDc5LCAgICAtMjIsICAgIDY0MiwKKyAgICAgIDcxNzksICAgMTE3OSwgICAtMjI5LCAgIC0yMDIsICAgNDk0OCwgIC01NDY1LCAgIDE2MzIsICAtMTI4NSwKKyAgICAgIDIxODgsICAtMjAzNywgICAxNzYzLCAgICA2MzYsICAgNDI0NywgICAgOTk1LCAgIDExNzYsICAgICAgMiwKKyAgICAgLTIzOTgsICAgMTIzNiwgICAtNjYxLCAgICAzODIsICAtMTA3NSwgICAgMTMwLCAgICAxMDMsICAgLTE4NywKKyAgICAgICA2MDQsICAgLTMwNiwgIC0yNjM1LCAgLTIxODUsICAgIDE1NywgICAgNzc1LCAgIDYzNzMsICAgLTkyNCwKKyAgICAgIDE3NTgsICAtMzA0MywgICAxNzA3LCAgIDI4NTIsICAtMjE0OCwgICA2Nzc5LCAgICAzNzYsICAtMTAxOCwKKyAgICAgLTIzNzQsICAgLTk4OSwgICAgMjQ5LCAgLTUzOTMsICAgIC0zMiwgICAgNTM4LCAgIC00MTYsICAtNTEwOCwKKyAgICAgIC02NTgsICAgMTgzOSwgICAgNDE5LCAgIDExNTMsICAtMzk1NiwgICAtNjE3LCAgLTE5MjUsICAgNTQzNCwKKyAgICAgICA2MjYsICAgMTQ4OCwgIC0zODI0LCAgICAxNDAsICAgIDM3MCwgIC0yMjMwLCAgLTcwMzEsICAgMTk4OSwKKyAgICAgIC01ODEsICAgIDYzOSwgIC00MjQ5LCAgIC0yMTYsICAgMTIyNSwgICAtNzc2LCAgIC05NzMsICAgLTU0MiwKKyAgICAgLTI5MjIsICAtMTc4MywgIC0yNDMwLCAgLTMyNTEsICAgIDk1OCwgICAzMzEzLCAgICA2MzYsICAtNjI3NywKKyAgICAgICAxMTksICAgLTg2NiwgICAtNDA2LCAgIC0xNTYsICAtNDgzOSwgICAgOTY2LCAgIC00NjksICAgNTU1OSwKKyAgICAgICAxOTMsICAgIDM3NiwgIC00ODEwLCAgIC04NzAsICAgIDE2MywgICA0MTMwLCAgIDI1OTYsICAgMjIwMywKKyAgICAgIC0xMTQsICAgMjQyMywgICAtNjIyLCAgIC00MjQsICAgMjkzNSwgICAgNzQ5LCAgIDI1MDAsICAgNDIzMCwKKyAgICAgIC0xNjIsICAtMTQ4OSwgICAyMTY5LCAgLTUxNTYsICAgIDc1MSwgICAyNzQ4LCAgIDIyNDAsICAtMTU0OSwKKyAgICAgIDQ4MjEsICAgIDE3NSwgICAyMjc0LCAgICA4NTQsICAgMjk5MywgICAgODM4LCAgICAzMjIsICAtMjY2MywKKyAgICAgIC03OTQsICAgLTI4MywgICAgLTk4LCAgIDEzOTMsICAgLTcwOSwgICAgMzYyLCAgICAyODUsICAtMTA4NSwKKyAgICAgIDEwNzUsICAgIDM3NCwgICAxMDYyLCAgIDY1MTIsICAtMzM3NSwgIC0zMTM4LCAgIDM5MzksICAgMzYyOCwKKyAgICAgIDM5MjYsICAtMjQ0MiwgICAxOTg5LCAgIC01ODMsICAtMTI4MiwgIC0xODgyLCAgLTM5MjAsICAtNDU5MywKKyAgICAgICA1NDAsICAgMjY2NywgICAtMTU1LCAgICAxNTYsICAtMjQyOCwgICAxMjI5LCAgIC00MzYsICAgMTc1NCwKKyAgICAgIDI4MTUsICAtMTYzNCwgIC0yMjk5LCAgIDExNTUsICAgIDk5MCwgICAzNjg5LCAgLTEyNDIsICAgMzE0NSwKKyAgICAgIDM5NTEsICAgICA0NSwgICAgMTg2LCAgLTExMTAsICAgIDI1NywgICAtMzM1LCAgIDg5MjksICAgIDUzMywKKyAgICAgIC0xNzMsICAgIDgxMywgICAgIDIxLCAgIDE1ODQsICAgIDU0MSwgICAgLTQ0LCAgIDEzNDksICAgIDEwOCwKKyAgICAgLTUxNjMsICAgLTY4NCwgICA1NTIyLCAgIC04NjgsICAtNTc5NSwgICAgNzY5LCAgICA1ODMsICAgMjgyNywKKyAgICAgIC04MTgsICAtNTU1MSwgICAxNDg1LCAgICAgMzcsICAgLTYzMSwgICAtMjYyLCAgLTQzNTIsICAgLTUzMiwKKyAgICAgICAgNjEsICAgIDQzNCwgICAxNzc1LCAgIDg5NzQsICAgLTExMiwgICAtODUyLCAgLTEyMjcsICAtMTY0NSwKKyAgICAgICAyNjAsICAgIDI5OCwgICAtNDMwLCAgICA4NjMsICAtMzg2MCwgICAgLTk3LCAgIDY0NjcsICAgLTMyOCwKKyAgICAgLTI0MTgsICAgIC02MSwgIC0xMjUzLCAgIDE1NzUsICAgICAzMCwgIC01NjgzLCAgIDIxMTMsICAgIDk3MywKKyAgICAgIC0zNzEsICAgIC01MSwgICA1MzU1LCAgICA0NzEsICAgLTU4NCwgICAtNDkyLCAgLTIxODcsICAgMjc5OSwKKyAgICAgIC01MDYsICAgNDQzNSwgICAxOTUwLCAgLTM0MTUsICAgLTM2MywgICAtNDA0LCAgICA5NDEsICAgMjYyOCwKKyAgICAgIC0xNDYsICAgIDQzNCwgICAyODUzLCAgICA4ODksICAgIDYzNCwgICA1NzQ5LCAgICAtNTQsICAgIDEyNiwKKyAgICAgICAxODksICAtMTM4NCwgICAtMzc5LCAgLTMyMDUsICAgLTU0MCwgICAxNzIwLCAgICA5NDIsICAtNjMwMCwKKyAgICAgIC0yODYsICAgIC01OCwgIC0xMDgzLCAgIDM3ODIsICAgIDI1MSwgICAtMzM0LCAgIDQxNzIsICAgIDYzMSwKKyAgICAgICAgMTcsICAgICA4MywgICAgNzA3LCAgIDEzMjIsICAgMzI3MywgICAtNTczLCAgIDEwMjQsICAtNjExMiwKKyAgICAgIC01NDAsICAgNDkxNiwgICAgMTU1LCAgLTEyMDksICAgIDMwOCwgICAtNzM4LCAgLTIxNTAsICAgIDc4NiwKKyAgICAgIC0xNjgsICAgICA2OCwgICAtMjAxLCAgICAtNjQsICAgLTc1MiwgIC0xNTk1LCAgLTkxODgsICAgIDMyMCwKKyAgICAgIC00MjYsICAgIDExMSwgIC0yMTgzLCAgICA4ODYsICAgLTczNywgICAgMTkzLCAgIC04MzcsICAgMzIxOSwKKyAgICAgIDU5MzYsICAgNDAyMiwgICAgNzY0LCAgICAtODIsICAgMzM0NCwgICAtODU1LCAgIDM3MDUsICAtMjY1MiwKKyAgICAgIDE1MzMsICAgLTIwNiwgIC0zNjczLCAgIDEyMzUsICAgMTE2MywgIC0xMjE3LCAgIDMxODMsICAgMTMxMywKKyAgICAgIC03NDUsICAgNjU1NCwgICA3MDE5LCAgIDEzMDIsICAgMjEyOSwgICAgMjY4LCAgICAtNzAsICAgIDExMCwKKyAgICAgICA0MTIsICAgLTE1NSwgIC0xNzAzLCAgLTQ5NDUsICAgIDEwNSwgIC0xNzA1LCAgICA0MTIsICAtNjU4OCwKKyAgICAgIDI5MDUsICAgMTI3OSwgICAgIDczLCAgLTI0NDYsICAtNTYzNSwgICAxMTY4LCAgIDI5NzQsICAgIDQwNCwKKyAgICAgIC02NTAsICAgIDI2NSwgIC0xNzczLCAgLTE4NTcsICAgLTEwOCwgICAtNjUxLCAgICA2NTcsICAgLTgyNCwKKyAgICAgIDMzNTIsICAgIDE3NywgICAgMTU1LCAgIDEyNzUsICAgMjAxMiwgICAgIDMxLCAgICAgLTcsICAtMTA2NSwKKyAgICAgIDIwNjIsICAgIDQxMSwgIC0yMzI1LCAgIC0yMDgsICAtNjMwNiwgICAgNjgzLCAgIDEwMzcsICAtMTA2MCwKKyAgICAgICAxOTEsICAgLTE4NywgICAtNTg1LCAgIDYxMDMsICAgLTQ1OSwgICAgNTcxLCAgIDE2NDAsICAgLTY5MywKKyAgICAgICA5MjIsICAtMjI5MSwgICAgNTM3LCAgIDE5MzQsICAgIDI2MywgICAzODQ3LCAgIC0yMDIsICAgNzA2MCwKKyAgICAgICAxMzYsICAgNDM2OCwgICAyOTYzLCAgLTEwMzIsICAgICAxOCwgICAxODM2LCAgIC0xNDQsICAtMzg1MywKKyAgICAgICA0NzQsICAgMjAwNSwgICAxMjk4LCAgIDIzOTYsICAgIDgyNSwgIC0yMjc0LCAgICAgMTIsICAgMzc1OSwKKyAgICAgIC0zOTQsICAgIDkwNywgICAgNDkwLCAgIDI5OTcsICAgMjE4MCwgIC0xNTcwLCAgLTEwMDAsICAgNTk4MiwKKyAgICAgIC0xMjksICAgLTgyMCwgIC0zMDAxLCAgIDI2ODQsICAtMTEzMiwgIC0yOTA4LCAgIDExMDEsICAgNTA0NCwKKyAgICAgICAzOTMsICAtMTYzNywgICAgMzkzLCAgIDEzNDMsICAtMTIzMSwgICAgNDA0LCAgIDE4MTcsICAgMTQ2MywKKyAgICAgIC00NDMsICAgMTA1MywgICAtNTg0LCAgLTc3NTYsICAgICA0NSwgICAgNDk5LCAgLTQxMDksICAgIDIxNCwKKyAgICAgICA1MzUsICAtMzM0OCwgICAgIDU0LCAgLTE1OTQsICAgNjkxMywgICAgICAwLCAgICAtOTQsICAgODc3MiwKKyAgICAgICA1MDAsICAgICAxMywgICAgNzM0LCAgICAgIDUsICAgIDc5OCwgIC0xNTIxLCAgICA4NTMsICAgIC04MiwKKyAgICAgIC0yNjMsICAgLTYxOSwgICAxNTU4LCAgICA0NTYsICAgNTkxMSwgIC0xMzc2LCAgIDEwNTQsICAgLTk3MSwKKyAgICAgLTEyNzUsICAgLTE0NywgICAtMTExLCAgIDQ5NjQsICAgIDMyMSwgICAgIDY3LCAgIDcwMjQsICAgLTUyNSwKKyAgICAgICA2MjAsICAgIDg4MywgIC0xMDU4LCAgLTExMzIsICAtMzMxMywgICAgNjMwLCAgICAyMjYsICAtNjIwMSwKKyAgICAgLTEwMTEsICAgMTExMSwgICAtODIwLCAgIC0yOTUsICAgIDU4MCwgICAgNjM2LCAgIDI0NTIsICAgLTYzOCwKKyAgICAgIDY4NDAsICAgLTI4NSwgICAgNjU1LCAgIDE1MDIsICAtMTA0OSwgICAtNTY3LCAgICAzMjksICAgIC0zMywKKyAgICAgIC0yNDksICAgIDU3MCwgICAgMTg2LCAgICAxNjcsICAgIDc4MCwgICAxMTA0LCAgICAgNDIsICAgIDE5NywKKyAgICAgMTAwMzQsICAtMTI5NSwgICAtMjA4LCAgICAgMzIsICAtMTQ3MywgICAgNzE2LCAgICAxNTksICAtNjY3MiwKKyAgICAgICAtNDUsICAgIDUxOSwgIC00MzAwLCAgIC0yNDYsICAgMzY5MiwgICA1MDYyLCAgIDQzMDUsICAgLTc0OCwKKyAgICAgIC01NDgsICAgIDE4MSwgICAtMzgyLCAgIC04ODEsICAtMTk2OCwgICAgNTgwLCAgICA5NjQsICAgLTQyMCwKKyAgICAgIC0zMjcsICAtMzM5NywgIC0xNTg0LCAgIDI3NzAsICAtMzUwMSwgICAxNjU5LCAgLTEyNTIsICAgMjM1MiwKKyAgICAgICAgIDYsICAgICAzMCwgICAgICAwLCAgIC0yNzMsICAgICAyNywgICAtMjA0LCAgIC00ODUsICAgLTQzMiwKKyAgICAgICAgLTYsICAgIDE3NiwgICAtNDI4LCAgIDE1NjIsICAgIDEwNCwgIC02NTExLCAgLTEwODQsICAgMjIwNSwKKyAgICAgICAtMTEsICAtNTI1NCwgICAtMTMyLCAgIC01MDgsICAgIC02OSwgICAgMzczLCAgLTE1MDMsICAgIDIwOCwKKyAgICAgICAtNTgsICAgNTMxMSwgICAgIDkyLCAgIC05NjYsICAtNjU2MywgICAtNDgwLCAgICAtMjQsICAgMTQyNCwKKyAgICAgLTE0OTgsICAgLTE2NSwgICA0NTk0LCAgIC05MDMsICAtMTc4NywgICAtMzUzLCAgLTcyODQsICAgIDE0MiwKKyAgICAgIDEwMDgsICAgIDg3NSwgIC02MTA5LCAgICAtMTYsICAgIDE2MiwgICA0ODk1LCAgICAgMzAsICAgLTE4OCwKKyAgICAgIDIwOTksICAgMTU4MSwgICAgMzAwLCAgIC0yNTksICAgLTkyMSwgICAtMzg2LCAgIC00ODgsICAgIDE0MCwKKyAgICAgIC00ODIsICAgNzEzNSwgICAgLTc3LCAgICA0OTQsICAgLTE5NiwgICAzMjA3LCAgIC0yNTAsICAgLTEwMiwKKyAgICAgICAzMTgsICAgIDk3OCwgICAgMTYxLCAgIDcyOTIsICAgICA1NSwgIC0xMzQ3LCAgLTI2MDUsICAgIDg5OCwKKyAgICAgIDE4MzMsICAgIDYwMiwgIC0xOTg4LCAgICA2MzAsICAgLTE0NSwgICAtMTAyLCAgIC00MTQsICAgLTEzMywKKyAgICAgICA0MTcsICAgLTYwMywgICAgMTU2LCAgLTExNTEsICAgLTM5NSwgICAgNjI1LCAgLTE2NzYsICAgICA4NiwKKyAgICAgICA2ODAsICAxMzMyMSwgICAgMzIyLCAgLTU4MTYsICAgLTI5MiwgICAtMjIzLCAgIDQyMDUsICAgLTM2MSwKKyAgICAgICA5MDMsICAgLTIyNCwgICAxNzQ1LCAgICAgOTUsICAtNjU5OCwgICAgIDc5LCAgIDIzMjMsICAgIC0yNCwKKyAgICAgICAyNjMsICAgIDc3OCwgICAgMTQ2LCAgIC05MzksICAgMTgxNCwgICAxOTQ1LCAgICA3MjAsICAgIDM2NywKKyAgICAgLTI5ODcsICAgIDg5OSwgIC00NDA5LCAgICAxMzYsICAtMzE4NSwgICAtMzQyLCAgLTMzMDQsICAgMTAxNiwKKyAgICAgICAyODQsICAgLTM0NSwgICAyMzEzLCAgIC00MDMsICAgIDM4OSwgIC0xNDAzLCAgIDE4MzUsICAgIDE1MSwKKyAgICAgIC0xMzIsICAtMTcwMiwgICAtMzM5LCAgLTU2NzksICAgMjAyNiwgIC0yOTkwLCAgICAgNDcsICAgLTU2NCwKKyAgICAgICAzOTksICAtMjE2NywgICAxMzkyLCAgIDEzODQsICAgNTA5NCwgIC0yOTU0LCAgIDQ0NjcsICAgIC0yMiwKKyAgICAgICAtMjMsICAgIDQwOCwgICAxNjIwLCAgIDEzODEsICAgMjM4MCwgICAgODA1LCAgICAzODAsICAgIC0zNiwKKyAgICAgIC04MDMsICAgIDc2NSwgICAtNzc4LCAgICA5MDUsICAgLTIwMCwgICAtNjY5LCAgIDM5NDIsICAgIDI4OSwKKyAgICAgICAxNzYsICAtNDc2NywgICAyMDE1LCAgLTM1NTQsICAgMTIwNiwgICA2MDcxLCAgICAxODAsICAgMjA1NywKKyAgICAgICAtNDgsICAgIDM2NSwgICAgLTQ4LCAgLTI0MjMsICAgIDU4NSwgICAtMTA5LCAgLTEyOTgsICAgMjUxOSwKKyAgICAgIC01MjUsICAgLTU4OSwgICAgMzc0LCAgICA5NzYsICAgMzY2NywgICAyMDkxLCAgLTI4OTAsICAgMTM3MSwKKyAgICAgIC03MjYsICAgLTIxNiwgIC0xMDI3LCAgIC0xMTYsICAgMjEyMiwgICAtNjE5LCAgLTM4MjYsICAgNDY0OSwKKyAgICAgIDExNjcsICAgICAgMCwgICAxMjM3LCAgIDE1MzgsICAgMjUwNSwgICAtNTQ4LCAgLTMwOTMsICAgMTM0NCwKKyAgICAgIC01NTgsICAtMTkyNywgICAgMTk5LCAgIDI0NjIsICAgMTMyNywgICA0NTk3LCAgICA4MzMsICAtMzY2MCwKKyAgICAgIC0zNDEsICAtMTAxMCwgICAgNDI4LCAgICAxNDgsICAtMTY4MiwgICAgMTMwLCAgIDE1NjksICAgODc4NSwKKyAgICAgIC03NTIsICAtMTAzMiwgIC0yNDA3LCAgICAzNTMsICAgLTM3OSwgICAzMzExLCAgICA4OTIsICAgIDg5MywKKyAgICAgLTI1OTYsICAgLTIxNywgICAtODM1LCAgLTIyOTEsICAgMTEzNywgIC00MzM5LCAgICAtNTgsICAgMjc1OSwKKyAgICAgICA5OTEsICAgMzUyNywgICAtMjgxLCAgLTYwNTAsICAtMTI1MSwgICAxODAyLCAgICAgIDgsICAtMzkxNiwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHNoYXBlOHNbXSA9IHsKKyAgICAgIDI2MzksICAgIDU1MCwgICA2NDg3LCAgIDI4MTIsICAgMTAxNCwgICAxOTI2LCAgIDI5NTksICAgIDc1NywKKyAgICAgLTE0NTIsICAgLTExMSwgICAgLTQ1LCAgIC00MDksICAgIDQwMSwgICAgNTQ1LCAgIDE1NDUsICAtMTY3NywKKyAgICAgICAgNzUsICAgLTYwNywgIC0zNjU4LCAgIC0zNjgsICAtNDQ4NiwgICAgMjcyLCAgIDYwMTcsICAgLTQ2OCwKKyAgICAgIDExMDgsICAgMTA1NiwgICAgNjA2LCAgLTMyODgsICAgMTAwMywgICAtODMwLCAgIC0zMzYsICAtMjk0MCwKKyAgICAgICAyNDcsICAgIDIyNywgICAxNzAwLCAgICAzMzgsICAgLTE2MSwgICA1Njk0LCAgICAzMTcsICAgLTU4NCwKKyAgICAgIDYyNzgsICAtMjkwMiwgIC0zODYyLCAgICAyOTMsICAtMzQwMCwgICAgNTQwLCAgICAxNzcsICAgLTg0MCwKKyAgICAgIC00NzEsICAgIDk2MywgICAtMjQzLCAgIC0yODksICAgICA3NywgICAgIDM5LCAgIDc2MjYsICAgIDMzMywKKyAgICAgICA1NzcsICAgIDMyNywgICAtMzU5LCAgICA5OTksICAgLTM5MiwgICAgMTA3LCAgIDE0MTAsICAgIDUwOSwKKyAgICAgIC05ODMsICAgICAzNiwgICAtMTkzLCAgICAtNjgsICAtNzYxMiwgICAtNzc1LCAgIC0xNzgsICAgMTQxNSwKKyAgICAgIDEwNjksICAgMTUzNCwgIC0xMjc2LCAgIDEyMDQsICAgIDYxNSwgICAyMDY1LCAgICA0OTksICAgIDEyNCwKKyAgICAgICAyNjUsICAgLTQ1NCwgICAxOTc0LCAgIDY0MjgsICAtNDAyOCwgICAxMTAyLCAgLTE0MTgsICAgIC04NSwKKyAgICAgIC04MTYsICAgIC02NCwgICAgLTQ2LCAgICA5MjYsICAgLTk2MCwgICAgIDc4LCAgIDQ4MjMsICAgIC00MSwKKyAgICAgICAtNzQsICAgLTY4MiwgICAtNzYxLCAgLTY1OTgsICAgMzA4NCwgIC0xNTk3LCAgIDI5NDUsICAgLTg2MSwKKyAgICAgLTMyMDMsICAgLTY2OSwgIC0zNzE3LCAgIC0zMTAsICAtMjg2NSwgIC0xNDQ3LCAgICAgNzIsICAgMTk4NywKKyAgICAgICAzNjQsICAgNDkxOSwgICAtMjQ3LCAgIDM2NzgsICAgLTE5NiwgIC02ODA3LCAgIC0xMjcsICAgLTk2NSwKKyAgICAgICAyMzMsICAgLTEzMywgICA0MDAwLCAgICAtNzYsICAgLTE4MiwgICAzODI1LCAgICAgNjcsICAgIDcwMCwKKyAgICAgLTE5MzQsICAgIDU0NSwgIC0yNDY3LCAgLTE0NDEsICAgIDYyOSwgICAzNDA5LCAgICA1MTIsICAtMzMzMywKKyAgICAgICA1MzksICAtNDg5NiwgICAzNDEzLCAgLTIwODMsICAgIDU1NCwgICAgNTc0LCAgIDk0MzAsICAgIDI5NiwKKyAgICAgICAtODgsICAgLTUzMywgICAtMzIxLCAgLTEwODIsICAgMjM2MywgICAgIDQyLCAgICAtNTAsICAtNTQwMiwKKyAgICAgIC0xMjMsICAgNDQ1OCwgICAxMTMwLCAgIDI3MzcsICAgIDM3OCwgICAxNTA5LCAgLTMyNjcsICAgIDk3MCwKKyAgICAgICAxNzksICAtMjExNCwgICAgNjAyLCAgICA0NzksICAgLTQzOCwgICAgMjc3LCAgLTkzODksICAgMTE0NCwKKyAgICAgIDI0NTMsICAtMzcwNSwgIC0zODQyLCAgIDM5NjUsICAgIDQ4MiwgICAxMjMwLCAgIDIyMTEsICAgLTI4MSwKKyAgICAgLTE4MzMsICAtMTc0MSwgICAxNjUzLCAgIC04NjgsICAgIDQ4NSwgIC0zNzQwLCAgIDUzNzEsICAgIDk4OSwKKyAgICAgIDExODIsICAgICAxMCwgIC0xODEyLCAgICAyMzMsICAgMTAyOCwgIC0zMzAwLCAgIDQ2OTgsICAgMTU3MiwKKyAgICAgIDE1ODAsICAgIDkyOCwgICAtMzE0LCAgLTM0NTIsICAgIDgzMCwgIC0xNTExLCAgLTEwNzksICAgIDU1NCwKKyAgICAgICA2NDEsICAgMTM4MywgICAgMTA1LCAgLTExMDEsICAgMTU0OSwgIC0zOTQ0LCAgICA5MDIsICAtNjU1NywKKyAgICAgICA0OTMsICAtMzExNywgICAgNzgyLCAgIC02OTksICAtNDgwNiwgICAgOTEwLCAgIC0yNTksICAgIC0yOCwKKyAgICAgIDE3MTMsICAtNzAxMiwgICAgNTcwLCAgLTEyNzAsICAtNDY5OCwgICAgIC04LCAgICAyMjAsICAtNDI5NSwKKyAgICAgIDExMzUsICAtMzkwNSwgICAgOTQ1LCAgIC00NjcsICAtMjE2NCwgICAtNjUxLCAgICAxODEsICAgIDIxMiwKKyAgICAgICAxNTksICAgIDU4NywgICAxNTg3LCAgIDExMDEsICAtNzE1MywgICAtMzA5LCAgLTE0NzAsICAtMTEzNSwKKyAgICAgIC0yNjUsICAgLTMyNiwgICAgMTcyLCAgIDg4NDAsICAgIDcyNiwgICAtNzgwLCAgICAxNzAsICAtMTAzOCwKKyAgICAgICA0NjYsICAgIDIxNiwgICAgNzY0LCAgICAyMzEsICAgLTU0NywgICAyNDU2LCAgIC00MjAsICAgODEzMiwKKyAgICAgICA0ODYsICAgIDg2NiwgICAtMzU5LCAgIDMzNTEsICAtMTgyOSwgICAyMDE4LCAgIC0zNTIsICAtMTM1MywKKyAgICAgICA3MTEsICAgIDY0NSwgICAxMTQ5LCAgICAgNzQsICAgLTQ2NiwgICAtNjY5LCAgIDEwMDksICAgMzA4NiwKKyAgICAgICAyNDAsICAgNzQ2OCwgICAtMTgyLCAgIDE5NDcsICAgLTIyMSwgICAgNDk2LCAgIC00NDgsICAgIDE4OSwKKyAgICAgIC0xMTMsICAgLTc1MiwgICAgMTMzLCAgIC0yMTQsICAtMTMxMCwgICAtMTQ0LCAgLTEwMzQsICAgNTIzNSwKKyAgICAgLTE5MzksICAtMjY2NCwgICAgMTkyLCAgIDE1MjYsICAtMjMyMCwgICAgNzYyLCAgIC03NzgsICAgIDM1NywKKyAgICAgIDEyNTEsICAgIDQyNCwgICAtMjI1LCAgLTEwMDgsICAgLTIyOSwgICAtMzUyLCAgLTM1NTksICAgLTI3MSwKKyAgICAgLTEwNjksICAgMTI3NCwgICAtMTc1LCAgICAzNjgsICAgNjQ1MywgICAtNTA1LCAgICAgMzEsICAgNzY3OCwKKyAgICAgICAxNjUsICAgLTQxOCwgICAtMTEyLCAgIC02NDksICAgMTQyMSwgICAgNjY3LCAgIC0zMzQsICAgMTA0MSwKKyAgICAgIC0zNTMsICAgIDU4NSwgICA0MTA5LCAgIDEwOTUsICAgNTI4MywgICAgNjg1LCAgIC02ODcsICAtMTQ1OSwKKyAgICAgIDEwNTQsICAgNTA0OCwgICAtMTk0LCAgIDIyMjAsICAgICA4MSwgICAgMjQ0LCAgIDM3ODksICAgICAxMiwKKyAgICAgIC05MjMsICAtMTQ1OSwgICAgMzE5LCAgIDIzNzgsICAgIC01MywgICA0MDk3LCAgIC02NjIsICAtMTE1NiwKKyAgICAgICAyMjMsICAgMjU4OSwgICAtNTQ3LCAgIDQ5NTEsICAgLTM0NiwgIC0xODEyLCAgIC0xMTEsICAgIDM0NCwKKyAgICAgIDUyNDcsICAgIDM4NywgICAtNDU5LCAgIC04MTAsICAgMTAyMiwgICAgMjM0LCAgICA3MjYsICAgMTg0MCwKKyAgICAgIC01NDUsICAgLTg4OCwgICAgNzI4LCAgICAxMDYsICAgMTAyNywgICAtNDk3LCAgICAzNDksICAgLTI0OCwKKyAgICAgMTExNzMsICAgLTMxMSwgICAgMTI2LCAgICA0NzksICAtMjAzNiwgICAgMjY1LCAgLTEyODYsICAtNzE5NiwKKyAgICAgIC01MTEsICAgIDEyOCwgIC0xODMzLCAgICA0OTYsICAgNzYyMCwgICAyNTM5LCAgLTE4MDksICAgIDk2MiwKKyAgICAgIC02MTQsICAgLTg3NiwgICAgODU3LCAgIDIxNzgsICAgIDY0MiwgIC0xMTgwLCAgLTIyOTQsICAgIDkxMSwKKyAgICAgIDM5MzIsICAgIDcxMSwgIC0xMDczLCAgLTEzODEsICAtNTMxNywgICAgMjM3LCAgIC00MTQsICAgIDU3OSwKKyAgICAgICAtNzgsICAgIC0yNywgICAgLTc4LCAgICAtMTQsICAgIDEwMCwgICAtMTkxLCAgICAxNDIsICAgICAtMSwKKyAgICAgICA0MzAsICAgLTE4MiwgICAgMjA3LCAgICAtNjEsICAgIC03MiwgIC00ODY2LCAgICA1ODMsICAgNTA5OSwKKyAgICAgIC03MDQsICAtMTQ5NiwgICAxMDY1LCAgIC0yMDYsICAgMjM3MSwgICAxNDk2LCAgIDE3NzcsICAgLTMwOCwKKyAgICAgIDQ4MDIsICAtMTQxNSwgICAxMTc4LCAgIDI2NTAsICAgIDMxMiwgICAtMzM4LCAgIC0yNTAsICAgIC02NCwKKyAgICAgICAtMjcsICAtMzE2MywgICAtNTYxLCAgLTEyODMsICAgIDk1MiwgICAtOTAyLCAgICAzNTQsICAgMTU5NywKKyAgICAgICAtNzQsICAgLTY4NSwgIC0zMjY2LCAgIC04NzMsICAgLTc0NCwgICA3MDc5LCAgICA3MzIsICAgIDY5NywKKyAgICAgICA1NTAsICAtMTM2MiwgICAgMjUxLCAgICAgMzQsICAgLTc0MiwgICAgICAwLCAgICAxMDUsICAgLTYwOCwKKyAgICAgICAgLTEsICAxMDQ1OSwgICAgODU0LCAgIC0xMDMsICAgLTQxOSwgICAyMjg2LCAgLTMwNDEsICAtMzI3OCwKKyAgICAgICAtNTEsICAgLTQ5MSwgICAtMTg3LCAgIDQyMDQsICAgIDg1NywgIC0xMDg1LCAgLTI1MDEsICAtMTY0NywKKyAgICAgIDY3NDAsICAgIDYwNSwgIC0yMDc5LCAgIDE3NDgsICAgIDUxOSwgICAzNDYyLCAgICAxMDYsICAgLTY5OSwKKyAgICAgICAyMjAsICAgLTYxNSwgICAtNDA2LCAgICA0MjAsICAgIDc4NiwgICAgNTcyLCAgICA2NzksICAgIDIxOCwKKyAgICAgIC04ODgsICAxMDI4MywgICAgMTI5LCAgLTIyODYsICAgLTcwNSwgICAgLTc4LCAgIDUwNzIsICAgIDYzNCwKKyAgICAgICA3MDIsICAtNjMxNSwgICAtNTUxLCAgIC0zMDcsICAtNzk0NiwgICAgMTc3LCAgLTE4OTcsICAgLTU3OSwKKyAgICAgIDE2MjAsICAgIDEyNSwgICAgMTE2LCAgICAtODksICAgLTMwOCwgIC0xMDE4LCAgICAxNDIsICAgLTUwNiwKKyAgICAgIC02MjQsICAgIDkxNywgICAtNzc5LCAgICA2MzIsICAtNTEwMywgICAgMzE0LCAgIC0xNTUsICAgNTY4NywKKyAgICAgICAgNzcsICAgLTE0NCwgICAyOTU3LCAgIC0xNzYsICAgICAzMCwgICAxMzQ3LCAgIC00MjYsICAgIC01MSwKKyAgICAgIDc4MjksICAgMTIwMSwgICAtNTkyLCAgICAgIDEsICAgNDYxNywgIC01NDc2LCAgIDIyMTYsICAgIDQxNCwKKyAgICAgIDEyODEsICAgIC04MSwgICAtNDIzLCAgIC0zMjIsICAgMzYyMywgICAgNDQ3LCAgICA4NjMsICAgLTM3NSwKKyAgICAgIC00ODksICAgIDUyNiwgICAtNDg1LCAgICAxNTksICAgMTA5MCwgICAgNDYzLCAgICA0MDEsICAgLTEzMSwKKyAgICAgICAyMjMsICAgMTYzMCwgIC0yNDYyLCAgLTIyNjEsICAgIDYyMywgICAxMDE5LCAgIDYzODUsICAgLTU5NSwKKyAgICAgIC02NTQsICAtMjc4NywgICAyMzgxLCAgICAzMjgsICAtMjA2OSwgICA1NDEwLCAgIC00MDIsICAgLTU1NCwKKyAgICAgLTE1OTQsICAgLTg2MCwgICAgIDgzLCAgLTUwMTEsICAgLTkzOCwgICAxMDYxLCAgICAxNjMsICAtMzUyMywKKyAgICAgLTEwNjQsICAgMTIxNSwgICAgNzYxLCAgIDE2MDQsICAtNDIyNCwgICAgOTA0LCAgLTI3MDYsICAgNDkwNywKKyAgICAgLTE4MzgsICAgMzI4NywgIC0zMTE4LCAgIC00NjQsICAgLTIxNywgIC0xMTg3LCAgLTY3OTIsICAgMTc0OCwKKyAgICAgIC01NjksICAgIDYxMywgIC0zMTc3LCAgIC0yNTMsICAgIDE2NCwgICAtODQ1LCAgICA1MzksICAgLTQ0MCwKKyAgICAgLTE4NzEsICAtMjAxMCwgIC0yMzIyLCAgLTMwMjYsICAgIDQ3OCwgICAyMjk3LCAgIC01NjAsICAtNTgxMywKKyAgICAgICA3NjgsICAtMTcwOSwgICAtNjIwLCAgICAgNjYsICAtNDY2NywgICAgODA1LCAgIC0yMTUsICAgNTM2NiwKKyAgICAgIC00NDIsICAgLTIzMywgIC02NzMyLCAgICAzNDUsICAgIDEwNiwgICA0NDgzLCAgIDE3MjAsICAgMjcyNSwKKyAgICAgIC0xMDksICAgMjc0NiwgICAtMTg4LCAgICAyMDQsICAgMTkwNSwgICAxMjI1LCAgICAyNTMsICAgMzI3MCwKKyAgICAgIDE5MTIsICAtMTg1MiwgICAtMjU2LCAgLTQxMzEsICAgIDc2OCwgICAzOTg0LCAgICA0NzMsICAtMTQzNCwKKyAgICAgIDQzODAsICAgIDIwOCwgICAyNTQ3LCAgIDEwNTEsICAgMzM0NywgICAtMTcxLCAgICA2MjksICAtMjM4OSwKKyAgICAgIC03MjIsICAgLTc1OSwgICAgMTY2LCAgIDIxOTIsICAgIDMyNSwgICAtMTkzLCAgIC0yODksICAgLTk0NSwKKyAgICAgIC00MzYsICAgIDkzMSwgICAxMzUyLCAgIDY5MTgsICAtMjcwNywgICAtOTg3LCAgIDI5NDAsICAgMzU3NCwKKyAgICAgIDQxMzUsICAtMzIwNSwgICAgMzUxLCAgICA5MjcsICAgIDEyOCwgIC0xODczLCAgLTQ4OTQsICAtNDgxNiwKKyAgICAgIC00NjEsICAgIDY5NiwgIC0xNjE4LCAgICAxMjksICAgIC0yOCwgICAyMTk1LCAgIDI0NTAsICAgIDU4NSwKKyAgICAgIDI1NTcsICAtMTMwOCwgIC0yMjA0LCAgIC01OTAsICAgMjM0NSwgICAzNjk5LCAgIC0zMTIsICAgNDQzNiwKKyAgICAgIDM0MjIsICAgLTYxMSwgICAtMTA2LCAgLTI2NDcsICAtMTc1MiwgICAgLTczLCAgIDg5MTQsICAgLTY3MywKKyAgICAgIDE2MjUsICAgIDg1MCwgICAgNzIwLCAgLTExODIsICAgLTI0NSwgICAtMTEzLCAgICA4ODIsICAgLTIyMywKKyAgICAgLTQ4NzMsICAtMTAwOSwgICA1NjQzLCAgICAtOTcsICAtNDc3OSwgICAtMTU1LCAgICA0NDQsICAgMjg5NCwKKyAgICAgIC04NzYsICAtNTUzNCwgICAxMjY4LCAgIC0xMzIsICAgLTg4MSwgICAtMzg5LCAgLTQyNTAsICAgLTE1MywKKyAgICAgICAtNDQsICAgIDk4NiwgICAxODIwLCAgIDg2NzEsICAgIDY2MiwgICAtMzQ0LCAgIC0xOTgsICAtMTkwOSwKKyAgICAgIDEwODMsICAgIDExNCwgICAtMzE4LCAgIDEwNzAsICAtMzI5MywgICAtMzc1LCAgIDY2MjEsICAgIDIzMiwKKyAgICAgLTI5NzMsICAgLTEwMCwgICAtNDgzLCAgIC01MjksICAgLTEyMCwgIC01MzEyLCAgIDE3MDIsICAgIDY1MSwKKyAgICAgIC02MzEsICAgIDQ4NSwgICA1Njc1LCAgICAgNTAsICAgMTEzMiwgICAtNDY1LCAgLTEwNTMsICAgMjY3NSwKKyAgICAgLTE1OTIsICAgNTU2NSwgICAxMDM2LCAgLTI4MDgsICAgIDMyNSwgICAgOTk5LCAgICA1MjQsICAgMjgxMywKKyAgICAgIC0yNjUsICAgIDMzNywgICA0MjI2LCAgICA1MTQsICAgIDU3NiwgICA2MDQ3LCAgICAxNzUsICAgIDIwNCwKKyAgICAgIC01MTQsICAgLTYxNywgICAgLTk0LCAgLTI4NjIsICAgLTI5NCwgICAxNzc0LCAgICA5NzgsICAtNzA0MCwKKyAgICAgIC0xNjksICAgIDgzNSwgICAtODI5LCAgIDIyNTgsICAgIC0zNywgICAtMzE5LCAgIDI3NTAsICAgIDEzOCwKKyAgICAgIC0yODksICAtMTA5MiwgICAgIDc4LCAgIDEwMzIsICAgNDMxNiwgIC0xMjAxLCAgICA4MDgsICAtNjI0MywKKyAgICAgIC05NDAsICAgNDEzNiwgICAgIDg5LCAgLTEwNzYsICAgLTY0NywgICAtMjU1LCAgIC0yMDcsICAgIDIyNywKKyAgICAgICAtNzAsICAgIC02MiwgICAtMjAyLCAgICAgNjYsICAgICAyNCwgICAtOTg4LCAgLTk1NDIsICAgLTIyNSwKKyAgICAgIC03MzksICAgIDE2MSwgIC0yNjk4LCAgICAxMTcsICAgLTYwOCwgICAgMTczLCAgIC02MjksICAgMTc3MCwKKyAgICAgIDUwMzcsICAgNTE0NSwgICAyNTMwLCAgLTEwMjgsICAgMzA3NywgICAtNDk2LCAgIDQ2NzEsICAtMTg1OSwKKyAgICAgIDIxNDgsICAgIDQ0NywgIC00MjMxLCAgICAxNzAsICAgIDcxMywgICAgMzIzLCAgICA3NDYsICAgMTQ0NywKKyAgICAgLTE4ODAsICAgNTA2OSwgICA3NzY1LCAgIC00OTIsICAgLTc3NSwgICAtNjU5LCAgIC03NzAsICAgIC01OSwKKyAgICAgIC0yNTgsICAgIC05MiwgIC0xNjgzLCAgLTQ2MzksICAtMTcyNywgIC0yMTI4LCAgICA1NDUsICAtNTA2MCwKKyAgICAgIDI1MzYsICAgMTU0OSwgICAgNDkyLCAgLTEyODAsICAtNjAzNCwgICAgOTY1LCAgIDMyNDQsICAgIDQ3NSwKKyAgICAgLTEyMDgsICAgIDY4MCwgICAtMjgzLCAgICAyOTUsICAgLTM1NywgICAtMjU3LCAgIDE3NTMsICAgLTM2MiwKKyAgICAgIDMxNTksICAgIDEwNiwgICAtMTgxLCAgIDE4MDUsICAgIDk0NywgIC0xMDAyLCAgIC0xMzYsICAgIDc1NiwKKyAgICAgIDExODksICAgIDIzNywgIC0yNDI3LCAgIC0yNjMsICAtNTc0NiwgICAgIDEzLCAgIDIxNzEsICAtMTE5NywKKyAgICAgIC0zMTksICAgLTM3MiwgIC0xMzAwLCAgIDU0NTgsICAgIDk1NSwgICAxMjI0LCAgICA2MTgsICAtMTA4NywKKyAgICAgIDI2NjEsICAtMjAyNiwgICAgLTIwLCAgIDIxMzcsICAgIDM0MiwgICA0MDc2LCAgICA0ODIsICAgNTQ0MSwKKyAgICAgICAgLTYsICAgMjEyNiwgICAtMTQzLCAgLTE1OTYsICAgIDI3NCwgICAxMDA5LCAgICAgOTQsICAtMzQ0NiwKKyAgICAgICAzOTgsICAgMTA3OSwgICAgMjg5LCAgIDIwNDIsICAgIDg4MywgIC0yMDA1LCAgIC0zMjAsICAgMzg0OCwKKyAgICAgICAzOTUsICAgIDQ3MiwgICAgNjE1LCAgIDMyNDUsICAgIDc1MywgIC0xODgxLCAgIC0yMTYsICAgNTY3MCwKKyAgICAgICAtNjQsICAgLTU2NSwgIC0yNTYwLCAgIDE1NzQsICAgIDc3MiwgIC0zODI0LCAgICA5MzIsICAgNDgzMCwKKyAgICAgIDExODIsICAtMTA1NCwgICAgMzkwLCAgICAtNDAsICAgMTgzMywgICAtMzUwLCAgICAxNTEsICAgIDE0OSwKKyAgICAgIC05NjYsICAgIC02MiwgICAtNzEzLCAgLTg3OTQsICAgLTU5MywgICAgIDg3LCAgLTM1MjMsICAgLTI0MywKKyAgICAgICA1NjAsICAtMzI5NiwgICAgMjQ0LCAgIC03NzUsICAgNzE3NCwgICAgNzQ5LCAgIC0yNzEsICAgODU2NiwKKyAgICAgICAgOTksICAgMTI1OCwgICAxMjM5LCAgIC00ODksICAgLTEwNywgIC0xNjk5LCAgIC02MTEsICAgMTA0NiwKKyAgICAgICAgNjUsICAgLTUwOSwgICAgNTI0LCAgIC0zNTQsICAgNjQwMCwgICAtMjQ4LCAgICAxNDgsICAgLTY4MiwKKyAgICAgICAtOTMsICAtMTU4NCwgICAgLTYxLCAgIDQ1MDksICAgIDQ3OSwgICAgMTEwLCAgIDcxMTYsICAgLTI5NSwKKyAgICAgICA0ODAsICAgMTU0NSwgICAgICAzLCAgICAxMjcsICAtMjI5MiwgICAgODk0LCAgIDEyNjEsICAtNjI4OCwKKyAgICAgICAtNDUsICAgLTQxMCwgICAtNDAyLCAgIC0zNTYsICAgMjY0OSwgICAgNjQ5LCAgIDE2NTIsICAgLTY0MywKKyAgICAgIDY1ODcsICAgIDExNywgICAgODc2LCAgICAtMzMsICAgIDk1NiwgICAtMzAyLCAgIDE2MTksICAtMTAyMywKKyAgICAgICAtOTksICAgIDM4NiwgICAgLTg2LCAgIC00OTgsICAgIDY4NCwgICAxMTg5LCAgICAxNDYsICAgIDM4MSwKKyAgICAgIDk4MzIsICAgIC05NywgICAgMjY0LCAgICAgOTEsICAtMTE5NywgICAgNDYxLCAgICAzNzQsICAtNjc4OCwKKyAgICAgICA0MjcsICAgIDI5NCwgIC00Nzc2LCAgICAgIDAsICAgMjg2OCwgICA1MTk5LCAgIDQ1NzMsICAgLTgyNywKKyAgICAgLTE4NjcsICAgIDYyMywgIC0xMjE0LCAgIC01NzMsICAtMTA5OSwgIC0xNDc2LCAgICAzMDYsICAgLTcwMSwKKyAgICAgIC0yMjQsICAtNDI2MSwgIC0xMTM1LCAgIDI1MDAsICAtNDc1OCwgICAxNDY5LCAgIC0xMDEsICAgMTgxMiwKKyAgICAgIC0xMjksICAgICAxNSwgICAgNzYwLCAgIC0xNDksICAgLTg5MiwgIC0xNDE3LCAgICA3NjEsICAgMTIxMywKKyAgICAgIC00MTcsICAgMTU2OSwgICAgLTk4LCAgIDE2NzUsICAgLTEzOSwgIC03MzgyLCAgIC02MzMsICAgMjU4NCwKKyAgICAgIC01MTksICAtNTQ4MywgICAgIDI5LCAgICAzMjAsICAgLTM4MywgICAtNTk2LCAgIC0yOTUsICAgLTM1NywKKyAgICAgIC00MTYsICAgNDA1NCwgICAtNDU3LCAgIC0zNTUsICAtNTIxMywgICAtODQwLCAgIC0zMTksICAgMTMyMSwKKyAgICAgIC00MjQsICAgLTEyOSwgICA1MjI1LCAgICAxODEsICAtMjY5NiwgICAtMTc0LCAgLTczNjMsICAgLTMyNywKKyAgICAgICA1MTksICAgIDg2MCwgIC01MTMyLCAgICAyNzUsICAgLTE0MSwgICA0OTQzLCAgICAyMDQsICAgLTIwMCwKKyAgICAgIDI5ODksICAgIDkzOSwgICAgMzkwLCAgIC00NjEsICAgLTMzMywgICAtMzk0LCAgIC0xNzQsICAgIDMxMiwKKyAgICAgIC0xMjksICAgNzI1NywgICAtNDAyLCAgICA4NjAsICAgICAtMSwgICAyNjc3LCAgICA5MDEsICAgIDYwOSwKKyAgICAgICAyNDgsICAgIDkzNSwgICAtNDkzLCAgIDgxNDcsICAgMjA4MSwgIC0xMTcxLCAgLTIxNDUsICAgMTU2MCwKKyAgICAgIDE2MzQsICAgICA1NSwgIC0xNzQ2LCAgICA1NjEsICAgLTc0NywgICAgOTMxLCAgIC03MTIsICAgLTU0NCwKKyAgICAgICA3OTgsICAgIC05OCwgICAgNTgwLCAgIC04MjksICAgLTU0NiwgICAgMjM4LCAgLTIwNTIsICAgLTE5NywKKyAgICAgICA4MDIsICAxMzA2NywgICAgMzczLCAgLTY0MzgsICAgMTE1OSwgICAtODQ1LCAgIDQzMTMsICAgICAxOSwKKyAgICAgICA2NzAsICAgLTYyNywgICAtOTQ0LCAgIDEyNzcsICAtNjk5NywgICAtNjA5LCAgIDE5MTMsICAgIDYwNywKKyAgICAgIC00NTQsICAgIC04OSwgICAgODU5LCAgICAtNDMsICAgIC03MSwgICAgNDk0LCAgICAxNjksICAgLTcxMywKKyAgICAgLTIwMTQsICAgMTU3MCwgIC00NzEyLCAgICAyMzMsICAtNDExMywgICAgMjEwLCAgLTM2ODksICAgMTAxOSwKKyAgICAgICAyMDAsICAgICA0OSwgICAxODAwLCAgIC02MTEsICAgLTQ3MiwgICAxMjM0LCAgICA1NzksICAgIDM2MywKKyAgICAgIC0xMzQsICAgIDIzMywgICAgMTAxLCAgLTU1MzksICAgMTkyNCwgIC0xNzM0LCAgIC05ODIsICAgLTkyOCwKKyAgICAgIC03MDcsICAtMTIzOCwgICAxNTg2LCAgIDM2NzYsICAgNDc0MSwgIC0yNzcwLCAgIDMxMDUsICAgIDk0MiwKKyAgICAgLTE5MzMsICAgMTM2MywgICAgMjg4LCAgLTI1MjgsICAgIDE2MCwgICAgNDg1LCAgICAtMzgsICAgICAyMywKKyAgICAgICAxMTMsICAgIC0xOSwgICAtNTE4LCAgIC0xMTAsICAgLTE3MywgICAtMTcwLCAgICA1ODksICAgLTQ3MywKKyAgICAgICAyOTYsICAtMzc0MiwgICAxMTA5LCAgLTI5NzcsICAgMTM0OSwgICA1ODk5LCAgICAgOTgsICAgMzEzMCwKKyAgICAgICA4NTUsICAgIDQ5OSwgICAgICAzLCAgLTMxMTEsICAgLTU5MiwgICAgNTcyLCAgIC04OTAsICAgIDY4NywKKyAgICAgICA2OTcsICAgIDE5NCwgICAtMzQ0LCAgIDExMzksICAgMzI1NSwgICAxMjcwLCAgLTI0NTEsICAgMTk1OCwKKyAgICAgIC0zOTUsICAgIDI2NywgICAtOTUxLCAgLTIyMjQsICAgMjEwOCwgICAgLTExLCAgLTMzNTcsICAgMjYwMiwKKyAgICAgIDI0MDMsICAgMTU5NiwgICAtNTMyLCAgIDI3MDEsICAgMjI1MSwgIC0xMjE3LCAgLTIxNDgsICAgIDY5MSwKKyAgICAgIC03NTcsICAtMjA1MSwgICAgMzczLCAgIDE5NjQsICAgMTQ5MywgICA0NzU2LCAgIDEyNDYsICAtNDM0NSwKKyAgICAgIC00OTYsICAtMTMzMywgICAgLTIwLCAgICAtODQsICAtMTU1OCwgICAgMzA1LCAgIDExODMsICAgODE0OCwKKyAgICAgIC02MjgsICAgLTcwMiwgIC0xNzMwLCAgICAyMzIsICAgLTI2MSwgICAyNzMyLCAgICAyNDUsICAgIDM1MywKKyAgICAgLTM3NDUsICAgMTAxMywgICAgMTg2LCAgLTIwNDIsICAgIDgxMCwgIC0zODk0LCAgICAzNTEsICAgMjUwMSwKKyAgICAgICA4NTIsICAgNDE2MiwgICAtNDI1LCAgLTQ5NDEsICAtMTUzNiwgICAyMjM3LCAgIDEzNDgsICAtNDI3NCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHNoYXBlMTFbXSA9IHsKKyAgICAgICAzNDcsICAtNTM5MSwgICAgMTA2LCAgICAxNTYsICAgLTE4MiwgICAgLTM2LCAgICAxNzcsICAgIDQwMSwKKyAgICAgICA3MDAsICAgIDUyNCwgIC0xMzQzLCAgIC00MDIsICAtNjk4MiwgICAgIDYzLCAgICAxOTQsICAgIC0xNCwKKyAgICAgICAgODIsICAgIC0zNiwgICAtNjc3LCAgIC0zOTMsICAgIDE4NywgICA3MzY0LCAgIC01MDcsICAtMTE3MywKKyAgICAgIC03NTksICAtMzc1OSwgICAtNzI4LCAgIDI5NzAsICAgMTMzNCwgICAgIDMyLCAgLTEzMjIsICAtMjk2NSwKKyAgICAgICAxNTYsICAgLTgzOSwgICAgMzgyLCAgLTYzODIsICAgLTE0OSwgICAgODc0LCAgIDEzNTIsICAgIC0zNSwKKyAgICAgIC00OTksICAgICA5OSwgICAtNDI1LCAgLTMxMTgsICAgIC0zMiwgIC0xNTk2LCAgIDU2MDgsICAgLTgyMiwKKyAgICAgICAtNDEsICAgMjk3NCwgICAtNTkyLCAgICA2MTUsICAgMTc3NywgICAyMzY0LCAgIDUxODksICAtNDE3MSwKKyAgICAgIC01ODEsICAgIDkzNiwgICAtNTI3LCAgICAzMTgsICAtMTYwNiwgICAtNTUxLCAgIDUzNTAsICAgLTQ0OCwKKyAgICAgICAtNDAsICAgNzQ3NiwgICAgMTg5LCAgICAzMTksICAtMTM5MCwgICAgIDEwLCAgIC05MjEsICAxMDAxNiwKKyAgICAgICA1NzMsICAtMTA2NSwgICAgODI5LCAgLTExOTAsICAgIC0yMiwgIC00MjYzLCAgICAgODcsICAtMTc0MiwKKyAgICAgIC0zMjUsICAgIDMxMywgICAtMTg4LCAgICA1NDAsICAtNTU0MiwgICAtMTg4LCAgICA1MTEsICAgLTE2OCwKKyAgICAgIC01MTgsICAgICAxNywgICAgMTUyLCAgIDE5NjYsICAtMjU2OCwgICAtODYwLCAgIDI3MzUsICAtMTIxMCwKKyAgICAgICA0MDQsICAgLTE0NCwgIC02ODczLCAgIC0xMjksICAgIDQzNCwgIC0yOTc4LCAgIDI4MjksICAgIC00OCwKKyAgICAgLTkxOTYsICAtMTgyOSwgLTExMjYxLCAgIDE0OTIsICAtNDkzOCwgICAxODAyLCAgICAgOTMsICAgIDM4NCwKKyAgICAgIDEzNDAsICAgIDIzNiwgIDEwMDY2LCAgICA3MzEsICAgIDg2MSwgICAtMTk1LCAgLTc1NzEsICAgIC03NywKKyAgICAgIC00ODEsICAgLTcwMCwgICA0Njk0LCAgIC03MzQsICAtNjMxNywgICAgMjgxLCAgIDE3NzMsICAgIDE3NSwKKyAgICAgLTU1MzUsICAgIDUzMiwgICAgIDMxLCAgIDcwMTIsICAgLTYzNywgIC0zNTg2LCAgIDEwOTYsICAgMzU5NiwKKyAgICAgIC0xOTcsICAtNzgzNywgICAtNjExLCAgIDE4MjUsICAgIC0yNiwgICAtMjU5LCAgIDIzMDcsICAgICAxMiwKKyAgICAgICA3MjksICAtMTk1OCwgICAgMTU2LCAgICAyNjIsICAgNTQ5NCwgICAgIDI2LCAgLTU3OTIsICAtMzE0NiwKKyAgICAgICA0NTAsICAtMTA3NSwgICAgMjk3LCAgICA1MDksICAgIDE1NCwgICAgNjY4LCAgICAxOTEsICAgLTI2OCwKKyAgICAgLTE1ODUsICAgIDM2OSwgICAxMzE0LCAgIC02OTMsICAgIDY3NywgICAxNDgyLCAgICAxOTgsICAgIDM3OCwKKyAgICAgMTEwODgsICAgIC04MywgICAyMzIxLCAgIC0xOTMsICAtMTA4MiwgIC0zMDUzLCAgICAgMjAsICAgLTI3MSwKKyAgICAgMTI5NzUsICAgIDI3MiwgICAxMTE0LCAgICA0NzYsICAgLTc5OCwgICAtMzA5LCAgIC0xNTksICAgNTQwNiwKKyAgICAgIC0xMDksICAgLTY3NSwgICAgNjIxLCAgLTI1NjQsICAxMTE5MCwgIC0xMzQyLCAgICAtODgsICAgIDQyOCwKKyAgICAgIC00NjUsICAtNDYzMywgICAtNTAzLCAgICAxMDYsICAtOTQ0OCwgICAtNDU0LCAgICAtMjgsICAgLTQwMiwKKyAgICAgIDEyNzEsICAtNzk3MiwgICAgNzU0LCAgIC0yMDcsICAtMjQ5MSwgICAgNTE4LCAgLTM3MDEsICAgLTU0MiwKKyAgICAgLTEyNjgsICAgLTYxNywgICAtMTc3LCAgICA0NjcsICAgLTEzMCwgICAgOTkwLCAgIDQwODcsICAgIDg1NywKKyAgICAgIC01MjQsICAtNTgyMiwgICAgMTQ1LCAgICAyMTcsICAtNzcwMywgICAtMjc1LCAgIDY2NDcsICAgIC04MSwKKyAgICAgICA1NTAsICAgIDg4NywgICAtNDMzLCAgIC04MDIsICAgIDUzMiwgICAgNjQzLCAgICAxODgsICAgMTk2NSwKKyAgICAgIC05MjAsICAgLTI4NCwgICAzNzExLCAgIDExOTYsICAtODg5NiwgICAtMzU3LCAgIC02MjYsICAgIDkwOCwKKyAgICAgIC0yODQsICAgLTcwNiwgIC0xNTgyLCAgICAxODIsICAgNzcwNSwgICAtMTM4LCAgLTIzNzIsICAgLTE1OCwKKyAgICAgIC04ODgsICAgNDI0NywgICA0MzgxLCAgLTY3MjIsICAtMTYxOSwgIC0xODEwLCAgICA2MzIsICAtMTE3NiwKKyAgICAgICAtNjIsICAgNDI2MSwgICAgLTg5LCAgICAyNjUsICAgMTQwNSwgIC0xNDQ5LCAgIC0zODksICAtNzA2OCwKKyAgICAgICAyNTgsICAgLTI0NCwgICAtMjcyLCAgLTgxNDksICAgICAzNywgICAtNDU3LCAgLTg4MzksICAgMzI0MywKKyAgICAgLTQyOTEsICAgLTM5NiwgIC0zOTM1LCAgICA5MDcsICAgIC01OCwgICAyMzg4LCAgIC05MDgsICAtMTIwOSwKKyAgICAgIC02MzUsICAgLTQ4NywgIC0xNzE3LCAgIDY5ODksICAtNDgzNCwgICAyMTM2LCAgIC04MjIsICAgLTY5OSwKKyAgICAgIDIxODcsICAgIC05NiwgIC05Nzc1LCAgLTM0NjQsICAgIDc5NSwgICAgNjM0LCAgIC04MjMsICAgLTY2OSwKKyAgICAgICAxNDYsICAgLTg0MywgICAgIDE1LCAgIC0yMjcsICAgIDY3MSwgICAtNzA3LCAtMTAwMDQsICAgIDE5OCwKKyAgICAgICAgODEsICAtMTYxMSwgICAgLTM0LCAgLTIxMjcsICAtMjM4NSwgICAtNjg5LCAgICA2MjIsICAgMTgzNCwKKyAgICAgICAtNjMsICAtNDkyNSwgICAtMjE1LCAgLTExODEsICAgLTUxNCwgICA3NzAxLCAgICA2MDcsICAgMjAzMCwKKyAgICAgIC0yNjQsICAgMjQ3OSwgICAgOTEzLCAgICAxNzgsICAgMzYyNSwgICAtMTk0LCAgICA2MTMsICAgIDg3NywKKyAgICAgIC0zODQsICAtNzczMiwgICAxMDA4LCAgIDIxMTcsICAgIDUyOCwgICAtMzAxLCAgICA1NDAsICAgIC04MCwKKyAgICAgICA1NTksICAgICAyOCwgICA3NTQyLCAgIC00OTYsICAgMTE0NiwgIC02NTczLCAgLTE0NTcsICAgNzc4OSwKKyAgICAgIC0yMjcsICAtMTY3MSwgICAgLTc2LCAgIC0zNzEsICAgLTg2NSwgICAtMTQxLCAgICAgNDIsICAgICA5NiwKKyAgICAgICAyNzcsICAgLTQxMCwgIC01NjA2LCAgICAzMjgsICAtODk1NCwgICAtMjIyLCAgLTE3OTIsICAgIDk4MSwKKyAgICAgIC0xMjAsICAgLTY1MCwgICAyMjY5LCAgLTE0MTIsICAgMTAzOCwgICAtMTg2LCAgLTg1MzAsICAgLTI2NCwKKyAgICAgIDIyODQsICAgLTcyNywgICAxNTExLCAgLTQ2MTEsICAtMTY1MywgICAxOTg1LCAgICAtNTAsICAtODk4NSwKKyAgICAgIC0yNDUsICAtMzMxNSwgICAgNDA3LCAgIC05MTUsICAgIC0yMywgICAgLTcwLCAgICAgMzAsICAgLTY2OSwKKyAgICAgIC0zMDMsICAgIDkwMiwgICAgIDg0LCAgICA0MzMsICAgIDIxNywgIC04MzAzLCAgIDc4NDcsICAtMTg2NSwKKyAgICAgIC02ODAsICAgIDI1NCwgICAgLTM4LCAgICAzNjQsICAgICAxNiwgICAgIDUwLCAgICAgOTAsICAgLTUzNCwKKyAgICAgLTQ2NDksICAgLTgwMCwgICAgOTY5LCAgLTEwODEsICAgIDQ1NCwgICAgMTQ3LCAgICAtNjIsICAgODc5NywKKyAgICAgICAgODQsICAgLTkxMiwgICAtNTE4LCAgIC0zNTEsICAgICA3NiwgICAtNTYwLCAgLTE0MzgsICAgIDYyOSwKKyAgICAgMTYzODQsICAgIDY1NiwgICAgMTUxLCAgICA4ODAsICAgIDM5NiwgICAgLTkwLCAgICA3NTIsICAgLTEzOCwKKyAgICAgIC04NjEsICAgOTYwNSwgICAgMjU4LCAgIC00NDAsICAtNjQ0MSwgICAgNDM0LCAgIDU3NjUsICAgIDI4MiwKKyAgICAgIDE0OTQsICAgLTI2MCwgICAtMTgwLCAgIC03NjksICAgNzg2NywgICAgLTg2LCAgICA1MzYsICAgLTI2MiwKKyAgICAgIC0yMzAsICAtODk1NiwgICA1ODU3LCAgIC01OTEsICAgMTUzMywgICAgNDE4LCAgIC01MDUsICAgLTE1NiwKKyAgICAgIDExNjUsICAgIDQxNSwgICAtMTY4LCAgLTE1MDQsICAgLTMzNiwgICAtNjY3LCAgICA1MjcsICAgNTcyNSwKKyAgICAgICAgNDIsICAgIDQyOSwgICAxNjkxLCAgICAgIDEsICAgICA4NSwgICAtMTk2LCAgIDM2ODEsICAgICAzNiwKKyAgICAgICA0NjksICAgLTM2NCwgICAgNTU5LCAgICA5MTAsICAtMTg0OCwgICAgMjU5LCAgICAyNDksICAtMTY4OCwKKyAgICAgICAyNjEsICAgIC0zNiwgICAtNTkyLCAgIC0xNTYsICAgIC02OSwgIC01OTM4LCAgIC0xODAsICAgLTI5NCwKKyAgICAgICAgMjIsICAgLTkwMywgICAxMzg5LCAgIDQ4NTMsICAgIDEyMSwgICA1MTg1LCAgICA5NzAsICAgMTIxMCwKKyAgICAgICA1NjEsICAgIDkyNiwgICAgNDcyLCAgIC0xODMsICAgNjYyMywgICAgMzU3LCAgICAtNzgsICAtNTg3NywKKyAgICAgICAgOTEsICAgLTE4OCwgIC02NzQ2LCAgIC0xNDYsICAgIDM0MiwgIC01NjQ4LCAgIDM2OTcsICAgMTMzNiwKKyAgICAgICA3MjgsICAgIC02OSwgICAgMzk4LCAgIDI2NjcsICAtMjEwMywgICAxOTAxLCAgIC04MDcsICAgIDI1OCwKKyAgICAgICAgNzIsICAgLTEzNywgICAgMzQxLCAgICAgNzEsICAgLTE2OSwgICAtMTA0LCAgICAtODMsICAgIDIwNiwKKyAgICAgIC00MjAsICAgMTE4NywgICAgNzQ0LCAgICAxMjAsICAtNTE1MSwgICAtNTc0LCAgICAgNzIsICAtODU1MywKKyAgICAgIC0zMTIsICAgIDE0MCwgICAgLTY5LCAgIDYwNjcsICAgNTIyOSwgICAgMjAyLCAgLTE3MjIsICAgLTE2NCwKKyAgICAgICAgNzMsICAgMTY5NSwgIC0xMDY0LCAgICAyMzQsICAgICAyNCwgICA0ODgxLCAgIC04NDksICAgLTQ2MCwKKyAgICAgIDg2NDEsICAgLTMyOCwgIC0xMjE3LCAgIDE2NjYsICAgLTI4MywgICAgLTc2LCAgIDI3NzIsICAgIDQwMSwKKyAgICAgICA4NDMsICAtNDc1NiwgICAgMjk3LCAgIDg1OTMsICAgIDM2NywgICAtNzMyLCAgIC0yMjUsICAgLTE5OCwKKyAgICAgLTM5MzYsICAgIDI0OCwgICAtNDM2LCAgICA0NzMsICAgIC0xOSwgICAtNDQxLCAgICAxNjQsICAgIDIyMCwKKyAgICAgIC0yNjYsICAgICAgMywgICAgMTA2LCAgIC0yNDQsICAtNTgxNCwgICAgNTk3LCAgIC02NjYsICAgLTI0NSwKKyAgICAgLTkyOTgsICAgLTg2NywgICAtNDgwLCAgICAyODAsICAgIC00MCwgICAtMTM5LCAgLTYzNzgsICAtNDk3MiwKKyAgICAgIC04ODYsICAgMzA2MiwgICAgNzQ3LCAgLTE5OTEsICAtMTY2OCwgICAtNDIzLCAgICA1MzQsICAgIDg2NiwKKyAgICAgICAtNzMsICAtNjUwMSwgICAtMTk1LCAgICAzMjQsICAgIC01MSwgICAtMTIzLCAgICAyOTgsICAgIDUwMCwKKyAgICAgICAxOTMsICAgIDI3OCwgIC04NTAzLCAgIC0yOTcsICAgMTAzNCwgICAgLTE2LCAgIC0yMDksICAgNzQ1MSwKKyAgICAgICA1MjEsICAgLTMwNSwgICAtMjk3LCAgLTE1MzcsICAtMzAyNSwgICAgNjg5LCAgICAyNDgsICAgIDMxOSwKKyAgICAgIDUzOTMsICAgMTQ5NywgICAyMjI4LCAgIC03NzMsICAgLTE0MSwgICAyMTg0LCAgIDEwMjQsICAtNDUzNSwKKyAgICAgLTkxNjAsICAgLTYwMCwgICAtOTMyLCAgLTIxNDUsICAgLTUzOSwgICAgNDYwLCAgLTE5NDMsICAgNDI2NSwKKyAgICAgLTI1MTIsICAgNDQxNiwgICAtMzA0LCAgIDE3NDQsICAgIDQ4OSwgICAtMzYyLCAgICA4OTgsICAgMjIzNiwKKyAgICAgLTIyMjQsICAgICA0OSwgICAtMTkyLCAgICAzMzIsICAgIDM2NiwgICAtMTQzLCAgICAzMjksICAtNzc0NywKKyAgICAgICAgLTQsICAgMTA3NSwgICAgMTE2LCAgICA1NTEsICAgICAxOSwgICAgIC03LCAgIDcwOTAsICAgLTE2OSwKKyAgICAgICA4MzcsICAgIC03MSwgICAtMzcxLCAgICA0NTEsICAgIC0zMSwgICAgNDc0LCAgICA4NjcsICAgLTQyMSwKKyAgICAgLTQ1NDQsICAgICA3OCwgICAzMjA4LCAgIC01NDksICAgMTk4NCwgICAxMzg2LCAgLTIyMDgsICAtMTQwMiwKKyAgICAgIDE2MTYsICAgIDE4OSwgICAgLTM3LCAgLTY5NTMsICAtNTczMywgICAxNTg5LCAgLTEzMTQsICAgMTA0MCwKKyAgICAgLTE0ODAsICAtNTYwOCwgICAyNjI3LCAgIDM1MTcsICAgIDI1MCwgICA3OTMwLCAgICAgOTQsICAgNDY4NywKKyAgICAgIDE1MjIsICAgNTU0MywgICAtMTMwLCAgIC00NjIsICAgNzYxMywgICAtNjU0LCAgICA2NDcsICAtNjE4NywKKyAgICAgICAxMzksICAgIDM0MiwgICA1MDY5LCAgIC03MjksICAgIDEyOCwgICAgIDE3LCAgICAtNDksICAgIDE3NiwKKyAgICAgICAxMjIsICAgIDgyNiwgICAgNTAzLCAgICAgNzYsICAgLTE5NiwgIDE1NTgzLCAgMTI4ODQsICAgIDc0NiwKKyAgICAgLTM5NDIsICAgIDgxNCwgIC0xNzQ0LCAgIDE3NzQsICAgLTMzOCwgICAzMDg5LCAgLTE2OTQsICAgIDU1OSwKKyAgICAgLTUzNTUsICAgMjgzNCwgIC0xNDQ4LCAgICAxMDgsICAgLTMyOSwgICAtNzExLCAgICAzNTAsICAgIDE3MSwKKyAgICAgICAyOTcsICAgLTEyMywgICAgNjcyLCAgICA2MjUsICAtNTg4NCwgICA2ODIyLCAgICA4NDIsICAgIDI3NiwKKyAgICAgICAyNDIsICAtMjI1NCwgICAtNjIzLCAgIC04NDYsICAgMjQ0MSwgICAgODg3LCAgLTIwNjYsICAtMTAxOSwKKyAgICAgIDEzMjksICAgIDEwNywgICAgLTgzLCAgICA4MjYsICAgIC02NywgICAtMzUyLCAgICA1NDksICAgIDEzNywKKyAgICAgLTEwMjMsICAgLTE4NCwgICAgLTExLCAgMTM3OTAsICAgICA0OCwgICAgODgzLCAgIDM1MzgsICAgLTUzMywKKyAgICAgLTU1NTMsICAgIDg2MSwgICAgNzM4LCAgIC00MzYsICAtNTI1OSwgICAgLTY2LCAgIC00MDUsICAgMzc3NywKKyAgICAgIC01NzQsICAgIDczOCwgICAgMjUzLCAgICAzNjMsICAgIC03NiwgICAgMjg4LCAgICAzMjQsICAgLTMzNywKKyAgICAgICAxNTcsICAgLTExOSwgICAgLTk3LCAgICAxNzEsICAgIDUxNCwgIC0xOTMyLCAgLTUxNzEsICAgIDU3OSwKKyAgICAgICAyNDksICAgMTA3MiwgICAtMjA0LCAgIC0xOTQsICAgLTMxMSwgICAgNjU1LCAgLTY3MjgsICAgIDE4NiwKKyAgICAgIC0xNzgsICAgICA5OSwgICA1NzQ5LCAgIC0zMjksICAgIDQxOSwgICAgOTI0LCAgLTExMzEsICAgIDU5OCwKKyAgICAgICAtMTUsICAgLTEwMywgIC0yMjc3LCAgICAxODYsICAgLTcxNiwgICAtNTQyLCAgICAxNTMsICAgLTIyNiwKKyAgICAgIDU2ODksICAgIDIxOSwgICAgIDUyLCAgIDM3MDYsICAgLTkxNywgICAgMTQwLCAtMTA1NzYsICAgLTE1MSwKKyAgICAgIDEwNjAsICAgIDY0NSwgICAgNDA0LCAgIDEzMTAsICAgIDMzMSwgICAgMjE2LCAgLTE0MTMsICAtNjAzMCwKKyAgICAgLTUwNjksICAtMzk5MiwgICAxMzY2LCAgICA5MzIsICAgMTU1OSwgICAgLTg3LCAgIDc3OTksICAgMzg1NCwKKyAgICAgIDM3NjIsICAtMTA0MywgICAgNDc0LCAgIDExODQsICAgIDEwMiwgIC0yNzc1LCAgLTExOTksICAtMTA3OSwKKyAgICAgICAzNTgsICAgIC02MywgICA5Nzg0LCAgICAxNDEsICAgMzk0NywgICAgMTk0LCAgIC0xMzIsICAgLTMzMiwKKyAgICAgIC01MTIsICAgLTIxMiwgIC01ODM5LCAgIC0yMjcsICAgNzc1OSwgICAgODA3LCAgIC01OTcsICAtMTc4MiwKKyAgICAgIC0xNDgsICAgLTM1MiwgIC0xMjI1LCAgIC02OTIsICAgIDE0NywgIC0xOTcwLCAgIDM1MDgsICAgLTk0NywKKyAgICAgIDM0NjMsICAgLTE5NywgICA0NzM3LCAgIC02OTgsICAgIDU3OCwgICAtMTcyLCAgIC03NzUsICAgODE2NywKKyAgICAgIDMxMDIsICAgIDg4MywgICAtOTE0LCAgICAgMTYsICAgIDgyNywgICAgMTE0LCAgLTE5MTYsICAgLTkwOSwKKyAgICAgIC02MDYsICAgICA4NywgICAxMDM2LCAgIC00MzUsICAgIDEwMiwgICAgIDk2LCAgIC0zNzAsICAgLTIwNCwKKyAgICAtMTE5NTIsICAgICAyMSwgICAgNDc3LCAgIDEyODUsICAgNjI4MSwgICAgODU1LCAgLTc3MTcsICAgMTE1NSwKKyAgICAgIC01MDEsICAgLTU5NywgICA1OTQzLCAgICAxNDUsICAgLTYzMCwgIC0zNDA2LCAgICAgMTMsICAtNDIxMSwKKyAgICAgICA2NzksICAgNjU3MCwgICAtMjMxLCAgLTYwNDIsICAgLTUwMywgICAtMTk0LCAgIDE0MzcsICAgNTY0MCwKKyAgICAgLTEyMjIsICAgODE4MSwgICAgMzg2LCAgIC05ODYsICAgLTUwMywgICAxMjIxLCAgICA4MzksICAgIDc2MywKKyAgICAgIC0yNzcsICAtMTc4NywgIC0xNDkxLCAgICAgIDUsICAgLTIwNiwgICAgIDQyLCAgIDI4MDAsICAgLTMzMiwKKyAgICAgLTI4NDEsICAgLTE0MywgICAtNDU2LCAgICA2NDYsICAgLTY2OCwgICAtMTE3LCAgICA4ODMsICAgICA4NiwKKyAgICAgIDcxMTEsICAgLTI3MCwgICAgNjI0LCAgLTExMzMsICAgLTMwOCwgICAtNDc5LCAgLTkxNDksICAtMTQyNCwKKyAgICAgICAyNDIsIC0xMjA0OCwgICAgICA4LCAgIDIzMDcsICAtNjUzMCwgICAtNTI5LCAgICA0NjIsICAtMTM0NiwKKyAgICAgIC0xNTMsICAgNDMxNSwgICAtMTgyLCAgIC02NzUsICAgIC03OCwgICAtNDgwLCAgICAtNDksICAgIDM5OCwKKyAgICAgIC00MDgsICAtMTQ0MCwgICA4MTk2LCAgICA0MzYsICAgLTU2MSwgICAtMTg0LCAgICAxNzUsICAgMTc5OSwKKyAgICAgIC0xNTQsICAgLTQzOSwgICAtNzIxLCAgIDIxNzAsICAgIDMyMiwgICA2NTU1LCAgIC01MzksICAtMTY3MiwKKyAgICAgIC02MjksICAtMjk4NSwgICAgMjM5LCAgICAtMzcsICAgNzU0NCwgIC0xMDQ4LCAgLTEyNDEsICAgNzI0MSwKKyAgICAgIC02MzYsICAgMjA0NCwgICAtNzUwLCAgIDEyMDYsICAgMTM2MywgICAtNTMwLCAgLTU5NjAsICAgIDM0MiwKKyAgICAgLTc0NDAsICAgIDYxNiwgICAgMzcyLCAgIDQ1NzIsICAgLTExOCwgICAgMzQzLCAgIDEwODYsICAgIDU3MCwKKyAgICAgIC0xNjQsICAgIDU1MywgICAtNDMzLCAgICA1NjIsICAgICAzMywgICA4MjI1LCAgIC0yMzUsICAgLTIzNCwKKyAgICAgIDEyMzAsICAgIDIzNCwgICAgOTA2LCAgICA1NjMsICAgIC03MywgIDEwNDY0LCAgIC0zNTMsICAgLTY0NCwKKyAgICAgLTE0NTMsICAgMTExOSwgICAgMjM3LCAgICA2NzAsICAgLTExMiwgICA3MDgzLCAgIC00NTEsICAgMzQxMCwKKyAgICAgIC0xMDUsICAgMzI0NCwgIC0xMzMxLCAgICAxMDIsICAgIDczOCwgIC0zNjAyLCAgICAgNzYsICAgIDQxMywKKyAgICAgIC0zMTgsICAgICAxMCwgIC01NDcxLCAgIDEwMjQsICAgLTMzNSwgICAgMjQ2LCAgLTc4MjAsICAgLTE2NCwKKyAgICAgIDI1MTUsICAtMTQxMSwgICAgNjczLCAgIDYwMjIsICAgICA1MCwgIC02NzE1LCAgICAyNjgsICAgMjE1MiwKKyAgICAgIC05NTEsICAgIC02MCwgICAgMjM0LCAgLTIwODUsICAgIDM0MiwgICAzMDAyLCAgIC0xNjksICAgMjQ3MywKKyAgICAgIC02NjcsICAtNjg0NiwgICAgODcwLCAgIDU0NjcsICAgIDE1MCwgICAgLTY2LCAgLTQyOTQsICAgLTI5OSwKKyAgICAgIC02MTIsICAtMzg1OSwgICAgMTc3LCAgICAzNTMsICAtNDcyNiwgICAgNTQ3LCAgICAzNDAsICAtNTY0NiwKKyAgICAgLTIwMjIsICAgIDExNywgIC00OTQ5LCAgIC0zMDMsICAgIDI4MCwgICAtMjY2LCAgIC0zNjEsICAgIDY3MywKKyAgICAgIC0xMzksICAgICAtNSwgIC03MTIzLCAgIC0yNjQsICAgIDI0MywgIC01MjQ1LCAgICAzNTEsICAgIDY1NiwKKyAgICAgIDUwMDUsICAgIDY4MiwgICAtMTA3LCAgICAyOTgsICAgIC03OSwgICAxNDA3LCAgIC00NDksICAgLTc5NywKKyAgICAgIC02NjksICAgLTU1MiwgICAtMjQyLCAgLTgwMTMsICAgICA1NiwgICA0MDkyLCAgIDE1ODMsICAtMzk4MSwKKyAgICAgICAtNDksICAtNzk3MiwgICAgMzkwLCAgICAzNjYsICAgIC0zMSwgICAxMTI2LCAgICAyNzIsICAgNTEyMCwKKyAgICAgICAtMTAsICAgMTE0NywgIC0zNjgyLCAgIC0xNTUsICAgIDI1MiwgICAgMTYzLCAgICA0NTUsICAgIDM1OCwKKyAgICAgIC03NDYsICAtMjcxOSwgICAtNDMxLCAgICA0NDQsICAgLTQzMywgICAgNDMyLCAgIC0zNTcsICAgNTM3MCwKKyAgICAgICAzMjgsICAgICAtMywgICAxNzQ4LCAgICA1MTQsICAgNzE5OCwgICAtNTI3LCAgICAxNzIsICAgIDQwMSwKKyAgICAgICAtNTksICAtMzU4NiwgICAxNDQzLCAgICA1MzQsICAgMTAyOSwgICAgNTM5LCAgIDM3MjMsICAgNTM5MiwKKyAgICAgLTY2MTksICAtMjU1OSwgICAyMzQ0LCAgICAyODIsICAgLTk4MCwgICAgIDk3LCAgIC0zMTcsICAgLTc4NiwKKyAgICAgICA0NzUsICAtODY0NiwgICAgMzA3LCAgICA0NDcsICAtMzEwNywgICAgMjExLCAgICAtNTYsICAgMzM0NCwKKyAgICAgLTE1NDksICAtOTIyMywgICAgNDU0LCAgICAzNTIsICAgIC0yNywgICAgMjA1LCAgICA1MDMsICAgIDI2MCwKKyAgICAgIC0zNzIsICAgLTYzMSwgIC0xMTY1LCAgLTY1NDMsICAgIDQ0NCwgICAxNTM1LCAgICA0MDQsICAtMTc1MiwKKyAgICAgICAtNDMsICAtOTM4MSwgICAgNzU0LCAgICAtOTQsICAtNzEzNCwgICAyMDY0LCAgICAxNzAsICAgODIyMiwKKyAgICAgIC0yODAsICAtMTI1MCwgICAtMzQ3LCAgIDE2ODgsICAtMTIwMywgICAgMjM5LCAgLTEwNDgsICAtNDU3MCwKKyAgICAgLTQ3MjAsICAgLTQzNCwgIC0xMDA4LCAgLTQxNTEsICAtMjIxMSwgIC0xNDE0LCAgIC01MDYsICAtNTQxMSwKKyAgICAgIDUzNzksICAgIDk4NCwgICA0NTg3LCAgICAtNjMsICAgIDE0MywgICAgOTY4LCAgIC0yMDMsICAgNTMxNSwKKyAgICAgICA1OTEsICAgLTc1NiwgICAxMjI4LCAgIC0zNzIsICAgIDcwMywgICA2ODI5LCAgICAtNzYsICAgNjkzNSwKKyAgICAgICA0NjcsICAgMzExOSwgICAgIC0yLCAgLTM4MjUsICAgIDE3NSwgIC00MDAwLCAgLTMwMTIsICAtNzc0NSwKKyAgICAgIC04MzIsICAtMjU4MiwgICAgMTczLCAgIDE5OTIsICAgMzc2OCwgICAgMjc1LCAgICAgMzksICAgIDYwMywKKyAgICAgIC01MzYsICAgNTg1MSwgICAgNDc0LCAgICAyNTQsICAgIC03MiwgICAxMjg2LCAgIC04MzYsICAgNTU3NiwKKyAgICAgIDEzNTcsICAgMzUyNCwgICAgNDA2LCAgLTkyMTQsICAgLTU1NCwgICAzOTc0LCAgIC0zNTIsICAgMTc2MywKKyAgICAgIC00ODIsICAgIDY1OCwgICAxNjI4LCAgIDM4ODUsICAgMTkzOCwgICA2MTcyLCAgIDE2OTMsICAtNTE4MywKKyAgICAgICAxNTAsICAtNjcyOSwgICAxMjM4LCAgIDEwNjIsIC0xMDAzNSwgICAtNDI4LCAgICAgNDgsICAgIDQyMSwKKyAgICAgIC0xODUsICAgIDY1OSwgICAtNDI2LCAgIC02MzMsICAgIDEzMSwgICAtNzQxLCAgICA0NjIsICAgLTQ2MywKKyAgICAgIC0zOTEsICAgLTE5MywgICAtMjcwLCAgIC02ODIsICAgLTM0MywgLTEyMTMwLCAgICAtODYsICAgLTE0OCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHNoYXBlMTFzW10gPSB7CisgICAgICAgIDIyLCAgLTUyOTYsICAgLTQxNSwgICAtMjA2LCAgICAzMDYsICAgIDI2NSwgICAgMTg5LCAgICAzNzYsCisgICAgICAgNzIxLCAgLTE1MDMsICAgLTQyOSwgICAtNTM4LCAgLTYwMDgsICAgIC05NywgICAtMzg1LCAgIC01NzAsCisgICAgICAtMzEzLCAgLTE0NjksICAgLTIxOSwgIC0xNjYxLCAgICAgMTAsICAgNjI1NiwgIC0xMjMwLCAgIC02MzUsCisgICAgICAgLTI4LCAgLTQyMDgsICAgLTM0NCwgICAgMzk0LCAgICAxMzgsICAgMTE3NCwgICAtMTcwLCAgIC04MjIsCisgICAgICAgMTE0LCAgLTEwODcsICAgLTEwMSwgIC03MzYyLCAgICAgODQsICAgIDg2MiwgICAxNTE0LCAgICAzNDEsCisgICAgICAtMTE1LCAgICAzMjAsICAgLTEyMCwgIC0xNjI1LCAgICAgNTUsICAgLTcxOSwgICAxNDQzLCAgIC03MzMsCisgICAgICAtNTc3LCAgIDcxOTcsICAgIDE0OCwgICAgIDI2LCAgICAxMjAsICAgMTk2OSwgICA0OTQwLCAgLTM3NzcsCisgICAgICAtNjA3LCAgIDE2NzUsICAgICA2NCwgICAtNjM0LCAgICAtODQsICAgIDMzNCwgICA2ODgyLCAgIC02NDQsCisgICAgICAtMjMyLCAgIDUwMDgsICAgLTMxNiwgICAtMTY0LCAgIC0xMzgsICAgIC0xNiwgICAgIDE1LCAgIDk0NDEsCisgICAgICAgLTc0LCAgICAtNjUsICAgIDI2MiwgICAgODM0LCAgIDExNDMsICAgLTEwMSwgICAgNDM0LCAgIC0zMjksCisgICAgICAgMTIzLCAgIC0yMDQsICAgIC00NSwgICAgMTQ3LCAgLTQ1ODYsICAgLTc0MiwgICAgNDY0LCAgIDE0MTIsCisgICAgICAgNTQ4LCAgLTE2MDIsICAgIC01NiwgICAxMzU2LCAgIC03NzEsICAgIDI2MywgICAgNzA5LCAgIC00ODEsCisgICAgICAtMTkzLCAgICAzNDUsICAtODM5NSwgICAgLTQxLCAgICAgMzYsICAtMTkwMCwgICAtMTc4LCAgICA4MTYsCisgICAgIC03NTkwLCAgICAgMzEsICAtMzAxMSwgICAtMzcxLCAgLTI2OTgsICAgMjIzNCwgICAgLTk5LCAgICAgIDAsCisgICAgICAgNzE0LCAgIC04NDUsICAgOTM1NywgICAgNzAxLCAgLTEyNjksICAgLTE4NywgIC00MjI3LCAgIC00NTAsCisgICAgICAgLTczLCAgLTE2MzcsICAgNDY3OSwgICAtMTM4LCAgLTQ0NzAsICAgIDM1NiwgICAxNDE2LCAgIDE0NjIsCisgICAgIC0zMTYyLCAgICA0NTMsICAgIC02MSwgICA1MjQzLCAgIC0yNDEsICAtMjM4NSwgICAgNDM4LCAgIDQ5MTksCisgICAgICAtMjUyLCAgLTM3ODEsICAgIDE1MCwgICAgMzM1LCAgICAgNTgsICAgLTE4NSwgICAxODcwLCAgICAxNzksCisgICAgICAgMTkyLCAgLTI1NzIsICAgLTQ1NCwgICAgIDc3LCAgIDQ4MTksICAgMTg5MSwgIC00ODQzLCAgLTIxMDYsCisgICAgICAtNDcyLCAgLTM4NDIsICAgIDE2NywgICAxMDkyLCAgIC02NzEsICAgIDE5NCwgICAtODcwLCAgICAxMzksCisgICAgICAtMTE1LCAgIC00NTUsICAgIDQ1MiwgICAtNTE5LCAgICAyOTksICAgMTAyNCwgICAgMzMwLCAgICAtOTksCisgICAgIDExMTg5LCAgICAgODIsICAgICA1NywgICAtODQ5LCAgICAxNjcsICAtNDE5MCwgICAgNjM5LCAgICA3NjgsCisgICAgICA3NDc3LCAgICA2MjYsICAgICA5NCwgIC0xMjU5LCAgIC0zMDMsICAgIDE4MSwgICAtMjgwLCAgIDI4NzMsCisgICAgICAtNTg5LCAgIC00NjEsICAgMTU5MSwgICAgLTI5LCAgIDY5NDAsICAtMTI2NCwgICAgMTIwLCAgIC0yODIsCisgICAgICAtMTU5LCAgLTM3NTUsICAgICAtNCwgICAgLTYxLCAtMTAxNzIsICAgIDE1MiwgICAgLTEyLCAgIC0yMDAsCisgICAgICAgMTExLCAgLTg0NzEsICAgLTI0MywgICAgNDAwLCAgIC04NDIsICAgMTY2MSwgIC0zMDk5LCAgICA1MDAsCisgICAgICAtNDUxLCAgIC00MjMsICAgLTE5MywgICAgMjMwLCAgICA0MjMsICAgIDI2MywgICA1MDExLCAgIDEwMTAsCisgICAgICAxMDQ0LCAgLTQ3ODEsICAgIDcwNywgICAgIDg0LCAgLTYwOTEsICAgLTIxMywgICA1MTkzLCAgICA0MzQsCisgICAgICAgNTM0LCAgIDExMDAsICAgLTUyMCwgIC0xNTkwLCAgICAgNzUsICAgLTMyMiwgICAgICAyLCAgIDIwMDgsCisgICAgICAtNTM0LCAgICAxNTMsICAgMjY0MSwgICAxNTEwLCAgLTY4MzAsICAgLTI0NiwgICAgICA0LCAgICAyNzEsCisgICAgICAgIDc1LCAgLTEzMDgsICAtMTkzNCwgICAtMjU3LCAgIDY3NDgsICAgIDU4OSwgICAtMzAxLCAgICA2MjcsCisgICAgICAxMTk3LCAgIDM3MDgsICAgNDQ1MCwgIC01NTgyLCAgLTEzMTIsICAtMjg1OSwgICAgODgxLCAgICA0MjksCisgICAgICAgNTUyLCAgICA3MzgsICAgLTg4MiwgICAgOTg0LCAgICA0ODgsICAgLTg2OCwgICAtNDY0LCAgLTY5NjksCisgICAgICAgNzIxLCAgLTIwNzgsICAgIDQxNywgIC02MTIxLCAgIC0xODQsICAgLTEyOCwgIC03ODQwLCAgIDI2NTksCisgICAgIC0yNTg0LCAgIC0yNTQsICAgIDE3NiwgICAtNzkwLCAgIC03MjcsICAgIDQ4MiwgICAgMzU3LCAgICAxMDQsCisgICAgICAtNDQxLCAgIC0xNTgsICAgLTk4MCwgICA0NTYzLCAgLTQwOTgsICAgMTA4NiwgIC0xMjE3LCAgIC01NjIsCisgICAgICAyMDMzLCAgICA1MTIsICAtODMzMSwgIC0zNTA2LCAgICAtNzMsICAgIDgwOCwgICAtMzcyLCAgLTE2MDIsCisgICAgICAgNzQ4LCAgICA5MTEsICAgLTU5OSwgIC0xNDk5LCAgICAgNTgsICAgIDMwOSwgLTEwMDAwLCAgIC0xMTUsCisgICAgICAgIDcwLCAgIDE2MDMsICAgIDI4MCwgICAtMTQ2LCAgIC04MTcsICAgIDUxNywgICAgIDE4LCAgIDEzNTUsCisgICAgICAtMTIxLCAgLTQxMzQsICAgIDE1MiwgIC0xMzAwLCAgICAyNDcsICAgNzI1OCwgICAgNDE1LCAgICAxMzAsCisgICAgICAgLTI3LCAgIDIxMDgsICAgIDMzNywgICAtODE2LCAgIDI0ODAsICAgIDM5NiwgICAgNTMzLCAgICAgNjYsCisgICAgICAtMTcxLCAgLTYyMTMsICAgICA0NywgICAzMDgxLCAgIC02NDgsICAgLTkzMCwgICAxODEwLCAgIC0yMzMsCisgICAgICAtNDMzLCAgIC01ODgsICAgNTUyNiwgICAgIDU4LCAgICAtMTgsICAtMzQ5OCwgICAtMzgxLCAgIDgwMDksCisgICAgICAgICA3LCAgIDEyMjksICAgIDE1MiwgICAtNDEwLCAgIC01NjcsICAgIDQyMywgICAtMzU0LCAgICA0NjMsCisgICAgICAgLTgyLCAgIC0xNDYsICAtMjg2OCwgICAgMjcxLCAgLTU3NzMsICAgMjY5NCwgIC0xMDA2LCAgICAxNTAsCisgICAgICAtMTEzLCAgIC01MjEsICAgMjU1MywgICAtMjc4LCAgICA1OTMsICAgIC02OSwgIC02NTE3LCAgIC03ODUsCisgICAgICAgMzY5LCAgLTI0ODMsICAgLTIxNiwgIC0zMTQ0LCAgIC04ODksICAgMTcyNCwgICAtMTY4LCAgLTYzMDMsCisgICAgICAgMTcxLCAgLTE4OTUsICAgLTc5OCwgICAtMTM3LCAgIC0xNzIsICAgLTc0NiwgICAgLTU0LCAgICAxNjIsCisgICAgICAtNjA3LCAgICA0MDksICAgIDIwMSwgICAtMjg0LCAgIC0xNDMsIC0xMDY4MSwgICA3NzQ3LCAgLTExNDgsCisgICAgICAgMzAzLCAgICAgNTgsICAgICAgNCwgICAgLTk2LCAgIC00ODUsICAgLTE0NiwgICAtMjg2LCAgIC01NzcsCisgICAgICAtNjQ0LCAgIC01MTIsICAgIDIzNiwgICAgNTc2LCAgICA0MjEsICAgICA5MywgICAgMjkzLCAgMTAyODQsCisgICAgICAgIC0yLCAgIC0xMTcsICAgLTU5MCwgICAtNTQ2LCAgICAzNTAsICAgIDQ0NSwgICAtMzAxLCAgIC0zMDAsCisgICAgIDEwODIzLCAgIC0yMjQsICAgIC05NiwgICAtNTUxLCAgIC0xNDgsICAgMTA0MiwgICAtMTI1LCAgICAyMjQsCisgICAgICAtNzA2LCAgIDg1ODMsICAgLTE5NSwgICAgIDUyLCAgLTI3MzIsICAgIDIwMCwgICA0NDE5LCAgICAzOTAsCisgICAgICAgODcwLCAgICAxMDAsICAgLTE4NCwgICAgMjMzLCAgIDYxNzksICAgLTMxNywgICAtNDcyLCAgIDE5NjQsCisgICAgICAtMzAyLCAgLTg3MjIsICAgMjUwOSwgICAtNjQ0LCAgICA0ODgsICAtMzEwMSwgICAgODkxLCAgIC0yNTMsCisgICAgICAgLTM4LCAgICAxMzMsICAgIC0xNSwgIC0xMzY1LCAgIC03NzksICAgLTYxMiwgICAgNjczLCAgIDU1ODcsCisgICAgICAgODM0LCAgICAzNzcsICAgIDgzNSwgIC0yMDE4LCAgICAgNzUsICAgLTE4NSwgICAzNjQxLCAgICAxMjEsCisgICAgICAgNjkzLCAgICAgNjMsICAgIDUwMywgICAgNjQ2LCAgICAgLTcsICAgIDM0OCwgICAgMTQxLCAgLTEzMTEsCisgICAgICAgNTMyLCAgIC01MTMsICAgICA5NSwgICAtMzE1LCAgICAtNjUsICAtNjQ3OCwgICAgLTE2LCAgIC04NDgsCisgICAgICAtMjEwLCAgIC0xMjAsICAgIDY3NiwgICA1MTI1LCAgICA1MzMsICAgNDE0NywgICAtNjIyLCAgICAgLTQsCisgICAgICAtMTUwLCAgLTE1MDcsICAgLTEyNCwgICAtMTg1LCAgIDUzNjUsICAgIDI2NywgICAxMDczLCAgLTQ0NzksCisgICAgICAgMTczLCAgIC0yMDQsICAtNDE2NCwgICAtOTUyLCAgICAtMjMsICAtNDA4OCwgICAxMzkxLCAgICAyMDUsCisgICAgICAgNzEyLCAgIC00NzMsICAgLTM3MywgICAgNTQ3LCAgIC02ODUsICAgNDU0MiwgICAgLTQ5LCAgICAtNzEsCisgICAgICAgIDMzLCAgIC0yNzEsICAgIDEzMiwgICAgMjQ2LCAgIC0xODgsICAgICAgNiwgICAtMzA5LCAgICAxMTgsCisgICAgICAgIDk2LCAgIDE3NzQsICAgIDE1OCwgICAgLTgzLCAgLTM1NzMsICAgMTE3NSwgICAtMTIyLCAgLTY2MTksCisgICAgIC0xNjc3LCAgLTExNjEsICAgLTI2NiwgICA0Nzc2LCAgIDM0NTMsICAgICA2MiwgICAtMzQ2LCAgIC00NTAsCisgICAgIC0xMzgwLCAgICAxMDMsICAgLTQ1NywgIC0xMjYwLCAgICAtNzEsICAgNDI3MSwgICAtMzM4LCAgLTEzOTQsCisgICAgICA2NDYyLCAgICAzOTUsICAgIDY0NywgICAyNDMwLCAgIC03MzUsICAgIDQ0NCwgICAxODM3LCAgICA0MDMsCisgICAgICAgMTQ0LCAgLTU1NzMsICAgIDIxMSwgICA0NjA4LCAgICAtMTUsICAgIDgwNCwgICAgIDcwLCAgIDE5NjksCisgICAgIC0zNDUxLCAgIC0xMzgsICAgLTM1MiwgICAxMTc2LCAgIC0xNzEsICAgLTUxOCwgICAtMTE0LCAgICAtODgsCisgICAgICAgMzM1LCAgIC0zMDgsICAgIC02NCwgICAtNDI4LCAgLTQxMTUsICAgIDMxOCwgICAtMjA1LCAgIC0xMjYsCisgICAgIC03ODU0LCAgIC02MDksICAgIDEwNSwgICAgMTQ0LCAgICAyNzAsICAgIDI2NiwgIC00NTQzLCAgLTUyNDYsCisgICAgICAtMzExLCAgICA1ODcsICAgIDMwNSwgICAtMTE1LCAgICAzNzIsICAgIDcyNywgICAtMjk0LCAgICA0MTQsCisgICAgICAgODc3LCAgLTc4OTksICAgIDQxMSwgICAtNTM4LCAgICAzOTQsICAgIDUzNSwgICAgMjMzLCAgIC04MjYsCisgICAgICAgMzI5LCAgICA0OTEsICAtNDg0OCwgICAtNjUwLCAgICAzMzEsICAgMTAyNiwgICAtMTQwLCAgIDY0NzQsCisgICAgICAgMTk0LCAgIC00NTcsICAgICA5OCwgICAtODcxLCAgLTIyOTMsICAgIDg3MywgICAgMzUzLCAgICA4MTIsCisgICAgICA0NTEwLCAgIDExMDIsICAgIDM3OSwgICAgNjUxLCAgIC0yMTQsICAgLTExMCwgICAgIDIwLCAgLTI3NDksCisgICAgIC04MDQwLCAgICAtOTYsICAgIDIyMSwgICAgMjIxLCAgICAtMzksICAgIDQ0NCwgICAtMjgwLCAgIDI4MTQsCisgICAgICAtNTM2LCAgIDM1MDksICAgIDExMSwgICAgODMwLCAgICA1OTQsICAgIDU1MywgICAgIDQ3LCAgIDI4MTIsCisgICAgIC0xODk4LCAgICAyMDMsICAgLTM1MywgICAgLTYwLCAgICAzNzEsICAgIDE4MSwgICAgODI0LCAgLTU0NDgsCisgICAgICAgMjk3LCAgICA0NzYsICAgICA0MiwgICAtMTMzLCAgICAgOTcsICAgIDQyNSwgICA4NTg2LCAgIC0zMTcsCisgICAgICAgMTIxLCAgICA0NTMsICAgMTAxNCwgICAtMzUwLCAgICAxNzUsICAgIDc0NywgICAgLTc4LCAgIC0yODcsCisgICAgIC01ODMyLCAgICA2MjUsICAgNDE3MCwgICAtMzA4LCAgIDE4NTMsICAgMjg0NiwgICAgIC0zLCAgIC04NzYsCisgICAgICAgNTM1LCAgICA0MzEsICAgLTQxMSwgIC0yMTM5LCAgLTYwMjEsICAgIDM3NCwgICAgMjk4LCAgIDE1NzIsCisgICAgICAgIDE5LCAgLTQwNjksICAgMTU2NywgICAgMTQ0LCAgICAgIDMsICAgNTU0MSwgICAtNDM4LCAgICA5MjAsCisgICAgICAgIDg3LCAgIDE3MjgsICAgIDIzMCwgICAgODA3LCAgIDU4NDgsICAgLTQxMywgICAgICA3LCAgLTYyNDEsCisgICAgICAgMjE0LCAgICAyMDUsICAgMTMxMiwgICAtNjc1LCAgICAgNzAsICAgIDI2NCwgICAgMTE0LCAgICAtMjQsCisgICAgICAtNDgyLCAgICAtNzIsICAgLTI5NiwgICAgMzI3LCAgICAyNDksICAxMTA0NywgIDExMDcwLCAgICAgMTgsCisgICAgICAtOTM3LCAgICAzNTAsICAgICAyMiwgICAgMzYyLCAgICA1NTUsICAgIDgxNSwgICAgMTMwLCAgIC0xMjUsCisgICAgIC00NTQ1LCAgIDI2NjIsICAgIDIwMywgICAtMzE4LCAgIC0zMDUsICAgIDMyMywgICAgNjMzLCAgICA0MTYsCisgICAgICAtMjU0LCAgICAzMDEsICAgICA5OSwgICAgNDA3LCAgLTQ5NTEsICAgNDc2NiwgICAtNzkwLCAgIDEzMzQsCisgICAgICAgOTEyLCAgLTEwNDYsICAgLTM1MCwgICAtMTM1LCAgIDM3NDQsICAgICAyMiwgIC0xNjQ3LCAgIC00MjIsCisgICAgICAtMTUxLCAgIC0xMTMsICAgLTEzMCwgICAtMzQ1LCAgICAgLTIsICAgLTI2MywgICAgIDE4LCAgICAtMjQsCisgICAgICAtNzcxLCAgICAtMzQsICAgLTU0MywgIDEwMjU5LCAgICAxODMsICAgICAgMCwgICAxNzQzLCAgIDEyNjcsCisgICAgIC0yNTU0LCAgICAzMjAsICAgIDYxMSwgIC0xMDY0LCAgLTE0NDYsICAgIDg3NSwgICAtODA4LCAgIDQ4NjUsCisgICAgICAtODE2LCAgIDM0NTIsICAgICA2OCwgICAgMzI2LCAgIC0xNzgsICAgIDE3NywgICAgLTEwLCAgIC0xMzgsCisgICAgICAgLTMzLCAgICAtOTMsICAgICA2NSwgICAgMjY0LCAgICAxODUsICAgLTE1NywgIC01NzQ5LCAgICAxMTAsCisgICAgICAgNDA3LCAgIDEyNDAsICAgLTY5OCwgICAgLTYxLCAgICAxNzYsICAgMTU1NywgIC02MDEyLCAgIC02MDYsCisgICAgICAtNTU1LCAgICA0NTgsICAgMzIyNiwgICAtOTM5LCAgICA5MzMsICAgIDE1MywgICAgLTMyLCAgICA5MjgsCisgICAgICAgIDY5LCAgIC00OTAsICAtMTU0MywgICAgLTg3LCAgICAtMjAsICAgLTE5NiwgICAtMzI3LCAgICA0MjMsCisgICAgICA3OTExLCAgIC0xODksICAgIDE3OCwgICAgMzM1LCAgIC0xOTQsICAgIDQ1OSwgLTEwNTcyLCAgIC0xOTYsCisgICAgICAgMTc0LCAgIC0yODYsICAgIDUwMiwgIC0xMDQxLCAgICAgMTIsICAgICAzOSwgICAtMTAxLCAgLTM5ODMsCisgICAgIC0xNjUwLCAgLTI5MDIsICAgIDM4NiwgICAtMTUxLCAgIDEwNTEsICAgLTYxOSwgICA2ODU0LCAgIDM0MDgsCisgICAgICAxMTQwLCAgLTE4NTQsICAgLTc1NSwgICAgLTQwLCAgLTExMDgsICAtMTUwMiwgICAgMjIxLCAgIC0zOTcsCisgICAgICAgMzc1LCAgIDEwODEsICAxMDM3NSwgICAgMzg5LCAgICAyNzAsICAgLTIzOSwgICAgMzExLCAgIC0yMTIsCisgICAgICAgMzg0LCAgIDEyMzcsICAtMjk1MSwgICAgMTk5LCAgIDUyODEsICAgIC01NiwgICAgIDM0LCAgIC03MDQsCisgICAgICAgOTQyLCAgIDExNjksICAgICAzMywgICAtMzEwLCAgICAgOTcsICAtMTIxNiwgICAzMDIzLCAgIC04MzYsCisgICAgICAzMjU2LCAgICA0MDQsICAgMzk1MSwgICAtMjU3LCAgIDIxMzksICAgIDExMSwgICAgMTc5LCAgIDgyNTUsCisgICAgICAgNjExLCAgIC0yNDAsICAgLTI1MiwgICAtMzY3LCAgIC0yNTEsICAgLTI5NiwgIC0yMjgyLCAgICA5NTcsCisgICAgICAgIDYxLCAgIC0yNjUsICAgIDcyMCwgICAgMjMyLCAgICAgMzQsICAgIDE0NiwgICAgMjA0LCAgIC0yOTAsCisgICAgIC05OTIzLCAgICA1MjksICAgICA2NSwgICAgNjk2LCAgIDI5NTgsICAgIDM1MiwgIC0zODUyLCAgIDEyNDgsCisgICAgICAtNzQzLCAgIC0zOTUsICAgNTk2OSwgICAgIDkyLCAgIC0xMzIsICAtMTIwNiwgICAgMzE0LCAgLTQwMTMsCisgICAgICAgNzE3LCAgIDUxNTcsICAgLTc3MCwgIC0xODc4LCAgLTEyMDEsICAgLTk1OCwgICAgNTI1LCAgIDQwMjgsCisgICAgICAgMTE2LCAgIDY3NzIsICAgIC00NSwgIC0xMDg2LCAgIC0zMzUsICAgNTgxNSwgICAgIDUxLCAgICAgNTcsCisgICAgICAgLTg1LCAgLTIzMDEsICAgLTEzMywgICAtMzAwLCAgICAgIDcsICAgIDIyNywgICAzNDI5LCAgLTEwNzUsCisgICAgIC00MzUzLCAgIC04MzIsICAgICAzMCwgICAxMjU5LCAgIC00ODQsICAgIDQ1MSwgICAgNjA0LCAgIC03MTcsCisgICAgICA2NzY1LCAgICAyOTQsICAgIDExOCwgICAtNDEwLCAgICAyOTksICAgIDU5MiwgIC0zODQ1LCAgICAgNjYsCisgICAgICAtNTAyLCAgLTkwODgsICAgIC03NCwgICAgMjU5LCAgICA0NTAsICAgIDQ3NSwgICAgMjAyLCAgLTE3OTIsCisgICAgICAgIDIzLCAgIDQ3MTksICAgIDcwOSwgICAtMzk4LCAgLTE2NzYsICAgLTM1MSwgICAtODk4LCAgIC02MjIsCisgICAgICAgMTQ1LCAgLTEzOTIsICAgNzMwNSwgICAxMDE0LCAgICAtODAsICAgIDUxOSwgIC0yMDY1LCAgIDE1MzEsCisgICAgICAgODYwLCAgLTE0NDgsICAgIDEzNCwgICAxNjgzLCAgICA2ODksICAgNzE3OSwgICAtMzQ1LCAgIC0zMjcsCisgICAgICAxMDA0LCAgLTI0NjcsICAgLTM0MCwgIC0xMzAyLCAgIDU4MjUsICAgIDM3MywgICAgIDUwLCAgIDY3OTYsCisgICAgICAgMzE0LCAgICAgMTMsICAgLTI3MCwgICAtNDI2LCAgICA3MDIsICAgIDI3OSwgIC00MzkyLCAgIC01MDgsCisgICAgIC02NTIxLCAgICAgNjAsICAgLTI3OCwgICAyNDc5LCAgICA4NDcsICAgLTM2MCwgICAgLTY4LCAgLTE5NDgsCisgICAgICAgIDkxLCAgICA5NjksICAgIDQyMSwgICAgNDU5LCAgIC0zNDEsICAgNjAyMCwgICAtNTUwLCAgICAtNzcsCisgICAgICAtNjg3LCAgIC03NTQsICAgICAgNSwgICAgMTA5LCAgICA0MTAsICAxMDg2MCwgICAtMTgzLCAgIC0zMTcsCisgICAgICAtNzM0LCAgICAtODcsICAgIDUwMSwgICAtNjAxLCAgICAxNTgsICAgNTgzNiwgIC0xMDU3LCAgIDEyMzYsCisgICAgICAtODUwLCAgIDI5NjUsICAgLTMzMCwgICAgNTQ3LCAgIDEyNDksICAtMjgwNCwgICAgMTI3LCAgICAyMTgsCisgICAgICAtNDU1LCAgIC04MDUsICAtNDAwMiwgICAgMTA4LCAgIC01NjksICAgIDY2MCwgIC01MzU2LCAgLTEwOTEsCisgICAgICAgNTgxLCAgIC00NDUsICAgLTMxMSwgICA2NDA5LCAgICA1MTAsICAtNjc4OSwgICAgNTE5LCAgIDE2MDcsCisgICAgICAgMjk2LCAgICAzNDIsICAgIDM2OCwgIC0xNDQwLCAgIC04NDYsICAgMTk5NywgICAtMjI3LCAgIDIzMzIsCisgICAgIC0yMDYyLCAgLTQ2NTcsICAgMTAzMCwgICA1MzIyLCAgICAxMzUsICAgIDEzMSwgIC0zNDE0LCAgICAzMjAsCisgICAgICAxMDMwLCAgLTMzNDEsICAgLTI1NiwgICAtMzczLCAgLTQ1NjUsICAgMTIyMiwgICAgMTcxLCAgLTQ5NzIsCisgICAgIC0xNDQ0LCAgICAzMDMsICAtNTQyNywgICAgNDM1LCAgICAyMDgsICAgIDI1MSwgICAgNDY3LCAgICA1MzksCisgICAgICAgMTM2LCAgICAxOTksICAtODg3NiwgICAtMTk1LCAgIC03NzEsICAtMzA5NiwgICAgNzQwLCAgICAzNjgsCisgICAgICAxMDQ3LCAgIC00OTAsICAgICA4MywgICAgNDg1LCAgICAxNjgsICAgIDUzMSwgICAtNjM1LCAgIC04MDEsCisgICAgICAtOTUzLCAgICAgIDQsICAgIC05NSwgIC03NjAzLCAgICAtNTksICAgMjAyMywgICAgNzM5LCAgIC03MDIsCisgICAgICAgMjYzLCAgLTkyMzAsICAgLTMxMywgICAtOTk3LCAgIC01MTAsICAgLTc3MiwgICAgMTU2LCAgIDM5ODYsCisgICAgICAtMTEzLCAgICAzOTgsICAtMjYwMiwgIC0xMDc5LCAgICAxOTUsICAgLTIxMSwgICAgMTI4LCAgIDE5MTcsCisgICAgICAgMjIxLCAgIC05NjUsICAgICAxMSwgICAgIDcxLCAgIC0xMDEsICAgIDE4MCwgICAgLTM2LCAgIDc4MzksCisgICAgICAtMTQ0LCAgIC03MjIsICAgIDI4OCwgICAgNDI5LCAgIDU3MDQsICAgLTk4NCwgICAtNTEwLCAgICA3NzUsCisgICAgICAgNDQwLCAgLTE4NDksICAtMTM0OCwgICAxOTg5LCAgICAzMDAsICAgICA0MywgICAxOTI4LCAgIDQzNDEsCisgICAgIC0zODQwLCAgLTI0MjcsICAgMjAyNSwgICAtNjYwLCAgIC0yOTMsICAgICAyMywgICAtMjQ5LCAgIC0xNzcsCisgICAgICAtMzI3LCAgLTc4NTgsICAgICAzMywgICAgMjQ1LCAgLTEzMzQsICAgIDIzNywgICAtNjg3LCAgIDI4MDAsCisgICAgICAgIDMwLCAgLTg4MDcsICAgLTQwNCwgICAgIDQzLCAgICAxODMsICAgIDI4OSwgICAgNTI4LCAgICA1MTAsCisgICAgICAtMTk3LCAgICA1OTAsICAgIC05NCwgIC01NDIzLCAgICAzODEsICAgMTMxNywgICAgMTQxLCAgLTE2MzksCisgICAgICAtNDMyLCAgLTc2MjgsICAgLTIyNCwgICAgIDU2LCAgLTc3ODgsICAgIDExMywgICAgMTM0LCAgIDY5ODEsCisgICAgICAtNjM2LCAgICA3NTYsICAgLTc0MywgICAgIDk3LCAgICAxNTksICAgMTI2MywgICAtMTQzLCAgLTI5NDEsCisgICAgIC0yNjgwLCAgIC00NzksICAgMTM5NSwgIC0xNjY3LCAgIC00NzIsICAgLTk5MiwgICAtNDUxLCAgLTU3MDgsCisgICAgICA0MjYyLCAgICAzMzQsICAgMzA1MywgICAgIDc2LCAgIC01ODQsICAgLTU5OSwgICAtMjc2LCAgIDM1MTgsCisgICAgICAgMjY0LCAgLTIxMTgsICAgIDM1OCwgICAtMTA2LCAgICA5MTEsICAgNTA1MywgICAgNDgwLCAgIDQ1MzgsCisgICAgICAgOTQ5LCAgIDUyMDMsICAgLTEwMywgICAgLTE0LCAgICAxNzcsICAtMzM5NywgICAgIDU1LCAgLTY4MTMsCisgICAgICAgNjgwLCAgLTE3ODgsICAgIDE0NSwgICAyMjY3LCAgIDExMDQsICAgLTc4OSwgICAgIDU0LCAgICAyNjEsCisgICAgICAgMjI4LCAgIDU0OTQsICAgICAxNSwgICAtMjI0LCAgICAxOTIsICAgIDc0MCwgICAgICAwLCAgIDc2MzIsCisgICAgICAgMzk4LCAgIDI4NzksICAgIDQzMCwgIC04MjEyLCAgIC02NTcsICAgIDgxNSwgICAtMjI4LCAgIC00ODgsCisgICAgICAgLTkwLCAgLTEyOTYsICAgIDU5NSwgICAyOTc5LCAgICAtMTUsICAgNDA1NSwgICAtMjUyLCAgLTM4ODMsCisgICAgICAtOTM1LCAgLTc2NTQsICAgIDMzMCwgICAgIDk3LCAtMTAyMDAsICAgIDQ2MiwgICAgMjIzLCAgLTEwMTcsCisgICAgICAtMzA5LCAgIC0zNDIsICAgLTEyNCwgIC0xMjU4LCAgICAyMTEsICAgIDM1MSwgICAgMzE2LCAgICA0MTQsCisgICAgICAgLTkxLCAgICAtMTgsICAgLTIwMiwgICAgLTc0LCAgICA0MTAsIC0xMTEyNywgICAgMzI2LCAgICAyNjEsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBzaGFwZTE2W10gPSB7CisgICAgICAtODU1LCAgIDE1NDksICAtNDg0MSwgICAgNjI5LCAgICA5MzIsICAtNTg5NiwgICAgODQwLCAgLTIwNDEsCisgICAgICAtMzA1LCAgLTI1NzQsICAgIDM0MywgICAgLTMxLCAgIC03ODAsICAgLTc3MywgICAtMzUzLCAgICA0MDMsCisgICAgIC0xOTA3LCAgLTIzNzEsICAgLTU1NSwgICAtMzI0LCAgIC00NzksICAgNjk2MSwgICAtMjg2LCAgLTQyOTAsCisgICAgICAgNjI2LCAgIC05NTMsICAgIC0xNCwgIC0xNjgxLCAgIC00NDMsICAgMTUwNCwgICAtMzY2LCAgICA1MTMsCisgICAgIC0xMjA2LCAgICA4NzAsICAgOTIzOSwgICAgMTEyLCAgIC0yMTMsICAgIDQyNSwgICAgMzgxLCAgIDE4MDIsCisgICAgICAgNzUwLCAgICA1OTQsICAgICA2MSwgICAtMTUyLCAgLTIwNjAsICAtODk5NywgICAtNzUyLCAgICAxOTcsCisgICAgICAtNDkzLCAgIC0xNzYsICAgLTM4OSwgICAtNTkxLCAgIDI5ODgsICAgIDY1NCwgICAyNDA0LCAgIC0yMDQsCisgICAgICAgMzA0LCAgIC0yNzksICAgIDIwMiwgICAgIDY2LCAgIC0xODUsICAgIDQxNSwgICAgMTU5LCAgLTE1MTQsCisgICAgIC02Nzc1LCAgICAtMzcsICAtMjYxNywgIC0xMjQ2LCAgLTQwMTIsICAgMTIwOCwgICAtNTU0LCAgIDMyNDAsCisgICAgICAtNjU1LCAgIC0zOTQsICAtMTQ2NCwgIC00NDQ4LCAgICAzODgsICAgMTA1OCwgICAtMzY0LCAgLTE3NjAsCisgICAgICAxMDgxLCAgIC01NTgsICAgLTExNiwgICAtMTA4LCAgICAgOTksICAgLTkyNSwgICAgNzYzLCAgLTEzMDEsCisgICAgICAtMjUxLCAgICAyNTgsICAgIC0zMywgICAgMzExLCAgICA1NTUsICAgIDIyNywgICAtMjc5LCAgIC02MDEsCisgICAgICAtMTM1LCAgIC02NzUsIC0xMDYxNSwgICAtOTM3LCAgICAxNTgsICAgIDUwMywgIC0yMDQ0LCAgIDEwNzUsCisgICAgICAtMTE0LCAgIDQyNzgsICAtOTA0MCwgICAgIDY3LCAgLTEwNzYsICAgLTcwNSwgICAtMTIyLCAgIC01MzMsCisgICAgICAzMjk5LCAgLTE4MjYsICAtMTMxNiwgICAgNzA4LCAgLTM4NDAsICAgLTc0MCwgICAtMzcwLCAgLTEwNzQsCisgICAgICAgIDg3LCAgIC00NjIsICAgMjE3NywgIC0xMTc3LCAgICAgNTcsICAtNjMxMSwgICAtMTcwLCAgIC03NzcsCisgICAgICAtMjU2LCAgICA0MzUsICAgIDI5MSwgIDEwMzcxLCAgICAtODIsICAgLTQyNSwgIC0xNzU3LCAgIC0xOTYsCisgICAgICAzODI0LCAgLTYyODksICAgICA2MiwgICA0NTA2LCAgIC01MTksICAgLTc4MywgICAxMTU1LCAgICA4NzgsCisgICAgICAgMjk1LCAgLTIwNDQsICAgIDMwNSwgICAgMTg2LCAgICAyNjMsICAtMTcxNiwgICAtNDgyLCAgLTU2NzgsCisgICAgICAgNDE1LCAgIDI3MDksICAgIDIxMywgICA3NTMxLCAgIDEzNzYsICAgIDgxMywgICAxODAzLCAgICAxOTAsCisgICAgICAgMzk4LCAgIDY0ODMsICAgMTQyNSwgICAgMjM1LCAgIDI3MTMsICAgIDUyMCwgIC0yODkyLCAgLTExOTEsCisgICAgICA2MDc0LCAgICA2NTQsICAtNjUzNSwgICAgMzIwLCAgIC03MzYsICAgLTQ3OCwgICAyNTYzLCAgIC0zMDksCisgICAgIC0zNDc3LCAgIC0xNTUsICAgIDI3NSwgICAxMDI0LCAgICAzOTAsICAgLTM4NiwgICAtMzMxLCAgMTQwNDMsCisgICAgICAgMjUxLCAgIC00MTAsICAgMTQ5NiwgICAgIDI0LCAgIDEyNzIsICAgLTgxNiwgICAgNTQ5LCAgIC0yMzgsCisgICAgIC0yNDg5LCAgICAxNTgsICAgIDE5NCwgICAgICAxLCAgIC0zMDYsICAtMzA4OCwgICAtMjY0LCAgICAyMDAsCisgICAgICAgLTMwLCAgIC01MjAsICAgLTQ3MiwgICAgLTMwLCAgIC00NjQsICAgLTc2NCwgICAgNDQwLCAgIC02NTksCisgICAgICAgIDg4LCAgICA3NzgsICAgIC0zMSwgIC0xNzk0LCAgLTM4MTcsICAgLTM0NCwgICAgODg3LCAgIC01NTEsCisgICAgICAgMTE1LCAgIC03NjMsICAtNTMzOCwgICAyOTA2LCAgICAgNTAsICAgIDczNiwgICA1NTM2LCAgLTExMDEsCisgICAgICAgMzMwLCAgIC00MDUsICAgIDQxNiwgICAxMDIyLCAgICAtOTMsICAgICA3MSwgIDEwMDM0LCAgIC0yMDAsCisgICAgIC0xMjU4LCAgLTM0MDUsICAgIDQ4MCwgICAgMTQxLCAgICAzOTksICAgIDUwMCwgICAgMzExLCAgIC01MDMsCisgICAgICAgMzAxLCAgIDQzOTgsICAgIDQ1NCwgICAtOTIyLCAgICA5NzUsICAgLTEwMSwgICAtNzc1LCAgICAtODEsCisgICAgIC0xNzIzLCAgIDEwNzcsICAgIDg1NywgIC0xNjgyLCAgICA4MTMsICAgIDg0NywgICAgMzQyLCAgIC0yNzYsCisgICAgICAzNTgyLCAgIDI5OTEsICAgNTU3MSwgICAgNzEzLCAgIDEyODAsICAgIDU5NiwgIC0xMzI1LCAgLTEwODcsCisgICAgICAtNjgxLCAgIDE0MTEsICAgIDM5MSwgIC0xNzI4LCAgICA0OTIsICAgIDU0NCwgICAxNTEyLCAgIC03MjQsCisgICAgIC03NDQ1LCAgIC00MjYsICAgICAgNiwgICAtNTM0LCAgLTM2NDMsICAtMTU5OCwgICAyNjUwLCAgIC04MzQsCisgICAgICAyMDk2LCAgIC0zMzMsICAgICA2NywgICAxNzQ2LCAgLTE1ODQsICAtMTAwMywgICAxMjcyLCAgIDE3MTAsCisgICAgICAxNjY2LCAgICAxNzYsIC0xMTcxNiwgICAgMzI5LCAgLTE4MjksICAgIDM4NSwgICAgODAyLCAgIC0zODIsCisgICAgICAyMjQ0LCAgICAgLTgsICAgLTIyMiwgIC0yMzUxLCAgICAzNjksICAtMTA2NywgIC05MzU0LCAgICAyOTMsCisgICAgICAgLTUxLCAgLTE4NDksICAgLTUwMCwgIC0yMzUwLCAgLTE4MjQsICAgLTgyNiwgICAtNDUwLCAgLTIxNTUsCisgICAgICAgNDU2LCAgICAyNDUsICAgMTc5NiwgICAgMzIwLCAgICAtNzMsICAgLTMwNiwgICAtMTIyLCAgICAyOTAsCisgICAgICAgMTE4LCAgIC0yOTgsICAgLTY3NSwgICAtMTgwLCAgIC04MjgsICAgICA4NiwgICAgLTQ0LCAgICAxNjUsCisgICAgICAgNDM1LCAgLTgyNDksICAgIDc2OSwgICAgNjMwLCAgLTE2NzAsICAgLTc2MiwgICAgNDUzLCAgIDU4OTMsCisgICAgICAgMjU5LCAgICAtOTIsICAtMTAwMywgICAtMzU4LCAgICAtMzIsICAtMTM1MCwgICAtNTM1LCAgIC0yODksCisgICAgICAgNDA5LCAgIC01NTgsICAgLTM0NCwgICAtNzUyLCAgIDYwMzcsICAgLTY4MCwgICAyNDcxLCAgICA1ODEsCisgICAgICAtMzUxLCAgIDEyNTEsICAtNTgyNywgICAgMTk0LCAgIC0xMDQsICAgIDgxNSwgICAxMjU3LCAgIC02MTksCisgICAgICAgMjQzLCAgICA0MTAsICAgNDQ1NSwgICAtOTY5LCAgICAgNTAsICAgMTI4NiwgIC0xMDEzLCAgIC0yOTMsCisgICAgIC03NzQwLCAgICAgNzMsICAgIDYxNSwgICAgNTIzLCAgIC0xNDksICAgLTgyNCwgICAyMjM1LCAgIDE1NzEsCisgICAgICAgOTcwLCAgICA5NDQsICAgNDc3OCwgICAtMTMyLCAgLTUwODIsICAgICA4MywgICAgMTI5LCAgIC04MjAsCisgICAgICAtODAzLCAgICA2OTQsICAgMTYxNSwgICAxMTYzLCAgICA1MTcsICAgLTQwMiwgICAgLTgwLCAgICA3NjIsCisgICAgICAtMTA3LCAgIC00MTksICAgIDE0MiwgICAtMjk0LCAgMTEyOTgsICAgIDMwMSwgICAgNDg0LCAgIC01MTMsCisgICAgICAgMTA1LCAgICA1NDcsICAgMTEzMCwgIC00MjUzLCAgIC03NDIsICAgIDM3NiwgIC0xNTQ1LCAgIDEwNzYsCisgICAgICA0MzcyLCAgIDIzMzgsICAtMjg0NywgICAgNDk1LCAgIC0xOTAsICAtMjQ0NCwgICAgOTMxLCAgIDY0ODcsCisgICAgICAgMTE3LCAgLTEyNzMsICAgMTQ4OCwgICAgLTc1LCAgIC0zMjIsICAgLTQ4NywgIC0yNjE0LCAgIC0yNTEsCisgICAgICAxMjMzLCAgIDQxMTEsICAgLTMyMSwgICAtMjE5LCAgLTc5NjEsICAgIC0xMSwgICAgMTA3LCAgIC04MDgsCisgICAgICAgNDUwLCAgICAxMTEsICAgNDM5NSwgICAgIDg5LCAgICA3NzIsICAtMTg3OCwgIC0xODk0LCAgIDEwNzUsCisgICAgICAtNTQ0LCAgLTk0NjcsICAgLTQ1OSwgICAgNjM3LCAgICA4NDIsICAgLTk1NiwgICAtNzM4LCAgIDQ0NTIsCisgICAgICAgNzc3LCAgICAtNzUsICAgLTIwOSwgICAtMzAyLCAgIC03OTYsICAgIDc4NSwgIC03NDEzLCAgICAzMjEsCisgICAgICAgNjQ5LCAgICAtNTUsICAgIDExNCwgICAgIDQzLCAgLTEwMjYsICAgLTIyMywgICAtNjExLCAgICAyMDksCisgICAgIC01NTQzLCAgIDgyMDYsICAgIDkwNywgIC0zMzU4LCAgIDE0NTIsICAgLTU0MywgIC0zMTczLCAgICA1MjUsCisgICAgICAgLTk1LCAgICAgMzUsICAgLTQ3NSwgICAtNTI1LCAgIC03MDUsICAgLTU2OSwgICAgMzUwLCAgICAyMDYsCisgICAgICAtMTA4LCAgLTE1MjMsICAgLTY4MCwgICAtMjgzLCAgLTI1ODMsICAtNDk5MiwgICAgLTU5LCAgIC05NjgsCisgICAgIC0xNzE5LCAgLTI3NTAsICAgNTg4NCwgICAgNDU1LCAgICAgMjksICAgIDQzNiwgICAgNzg0LCAgIC0xMDEsCisgICAgICAtMjE2LCAgICAxMTAsICAgIDYxMiwgICAtNTExLCAgICAtMTIsICAgICA5OCwgICAgLTY3LCAgICAxNzcsCisgICAgIC0xMjEwLCAgICAyMjIsICAgLTM0NSwgICAgMjQzLCAtMTI2NzAsICAgLTQ3MiwgICAgMjgyLCAgLTIxNDksCisgICAgICAgNjg3LCAgLTI2MzEsICAgNDQzNCwgICAgIDc3LCAgIC01MjEsICAgLTQwNCwgICAtOTM0LCAgICAyMTIsCisgICAgICAtNjk1LCAgIC0zNjksICAgMTEzOCwgICAxMzQ4LCAgIC05MDUsICAgIDUwMSwgICAgMjk5LCAtMTA0NjcsCisgICAgICAxMDE4LCAgICA4MTgsICAgMTk0MSwgICAgIDMxLCAgICAyNTcsICAgMTIxOSwgICAgOTQ0LCAgIC0xNTcsCisgICAgICAxOTY4LCAgLTE2NDksICAgLTEyNiwgICAtNDQwLCAgIC01OTksICAgICAtMSwgICA2MTkwLCAgIDI1NzQsCisgICAgICAtMzMyLCAgICA3NTMsICAgIDE5NSwgICAtMTMxLCAgIDU5NzIsICAgLTI5NywgICAgNjcyLCAgICAtODYsCisgICAgICAtMTQzLCAgIC0zMDMsICAgICAgNSwgICAtMTIxLCAgIC0xNTQsICAgLTYxMywgICA1NTQxLCAgLTE1MTYsCisgICAgICAtMzA0LCAgICA5NjIsICAgICA2OSwgIC0xODU3LCAgIDQxNDIsICAgLTEzNCwgICAgNzA2LCAgICA4OTYsCisgICAgIC0xMjI2LCAgIC0xMzUsICAgLTMxMCwgIC05MjYxLCAgIDExMzUsICAtMzQzNywgICAgNjIwLCAgICA4MDIsCisgICAgICAgLTMzLCAgIC01ODIsICAgMTkwOSwgICAxNDA3LCAgICAyNDIsICAgMjU5OSwgIC0xNTMzLCAgIC0yNzksCisgICAgICAgODM2LCAgIDgwNzAsICAtMTIwNywgICA1NzQ1LCAgICAyMDAsICAgIC03NywgICAgMTYyLCAgICA3ODEsCisgICAgICAtNDY2LCAgLTE1NTUsICAgMzI5NywgICAtOTU3LCAgICAyMjUsICAgMTI5MCwgICAgICA3LCAgICA2NzcsCisgICAgICAgIDQxLCAgIC01NDksICAtMjc3OCwgICAxNDAwLCAgICAzNzksICAtMzM2NywgICAgMzY5LCAgICA2MTUsCisgICAgIC02NDAyLCAgICA1MjcsICAgICA1OCwgICA1Njc5LCAgIC0xMTQsICAgLTE4MCwgICAyODQyLCAgICAgODgsCisgICAgIC0yNjExLCAgICAtNTAsICAgIDM3MSwgICAgMTYxLCAgIC00NDQsICAgMjA2MiwgICAgLTM4LCAgICAyNzIsCisgICAgIC04NTYyLCAgICA3NjksICAgICAxOCwgIC0yNTkzLCAgIC0yMjYsICAgLTUwMywgICAtOTU5LCAgLTEyOTUsCisgICAgICAgMTg5LCAgIC0zNzEsICAgLTY3NSwgIC0xNTI4LCAgICAtOTgsICAgIDUxNCwgIC0xMjM2LCAgICAxMTYsCisgICAgICAgMjAyLCAgMTM2NjIsICAgMTU5NiwgICAtMzI4LCAgICAgNjEsICAgMzU2NywgICAtNDg2LCAgLTMzMTYsCisgICAgIC04NDczLCAgIC0zMTcsICAgMjg2OCwgICAtNDE5LCAgICAtMTcsICAgIDUzNSwgICAtOTY1LCAgIC01MDMsCisgICAgIC0zODQ4LCAgIDIyMjIsICAgIDYyMCwgIC0xNzQwLCAgICAgIDIsICAgNjUwNSwgICAgNDczLCAgIC0yOTcsCisgICAgICAgLTcwLCAgIDMwNDMsICAgIC01MSwgIC0xNTIwLCAgICA5OTMsICAgMTA0NiwgICAxOTY1LCAgIDMyNDAsCisgICAgICAxOTcxLCAgICAtNjAsICAgLTY1MCwgICAgLTUzLCAgIC0yNDgsICAtNDQyOCwgICAtMzY1LCAgLTM3MjMsCisgICAgICAxMTIyLCAgLTE2ODEsICAgMTYyOSwgICAxMzU4LCAgICAtMTcsICAgMTEzNiwgICAtMjU2LCAgIDIzNDQsCisgICAgICAtMjgyLCAgICAxNTYsICAgIDEyNywgICAtMTU1LCAgICAzMTgsICAtMTI4MSwgIC0xMDY2LCAgICAgNTcsCisgICAgICAtODg5LCAgIC0yNTMsICAtMTM5NiwgICAtNTc5LCAgIC05MjAsICAtMTAwNiwgIC05MjAyLCAgIC03MDMsCisgICAgICAgMTk1LCAgIDUxODYsICAgIDI0MSwgICAxNzQyLCAgICA5OTYsICAgIDExOCwgICAxNDMxLCAgIDQ0MTUsCisgICAgIC0yNDUyLCAgIDY4MzcsICAtMTI3MiwgICAtNTY5LCAgIDM0ODUsICAgIDMyOCwgICAgNDQxLCAgICA4MzIsCisgICAgICAgNTUzLCAgICAgOTQsICAgIDY0OCwgICAgIDkyLCAgIC0zNzgsICAxMTE2NywgICAgNzc1LCAgICA0NTcsCisgICAgICAxNzEyLCAgICAtMjQsICAgIDk0MSwgICA1NDMzLCAgLTE2NDUsICAgMjE2NiwgICAgMjQ5LCAgICAtNTUsCisgICAgIC0xODE2LCAgICAzODMsICAgIDczNSwgICAtODc2LCAgICA0NDMsICAgLTU2OCwgICAgMjkzLCAgLTEyNjYsCisgICAgICA2OTYzLCAgIC0xNzgsICAgLTE3NCwgIC0xMTg2LCAgIDExMTksICAgLTIwOCwgICAgODIxLCAgIDE0OTksCisgICAgIC0xNDk2LCAgLTIxNzEsICAgMTQzNCwgICAgODc0LCAgICAxMzMsICAtNzQ2NiwgICAtNTQ1LCAgIDIxOTMsCisgICAgICAtNzc1LCAgLTE0MDUsICAtMTIwNSwgICAtNTc1LCAgLTE5OTYsICAgLTY0NSwgICAtNTUyLCAgIC0yNjMsCisgICAgICA4ODYxLCAgIC01MTcsICAgICA3NiwgICAtOTkyLCAgICAyNzgsICAgMjQxNywgIC0xMzY5LCAgICAgMzUsCisgICAgIC0xNDYxLCAgLTEzOTksICAgIDUxNywgICAgMTg1LCAgLTI4OTUsICAgIDM0NywgIC0zODcxLCAgIDM2NDQsCisgICAgICAgMjg0LCAgIDMyODQsICAgIC0xMiwgICAtMTY5LCAgLTE5ODEsICAgMTE5NiwgICAgLTY3LCAgIDI4NjgsCisgICAgICAgOTEwLCAgICAxMzQsICAgLTUzMCwgICAgMTUwLCAgLTEzMjgsICAgMTkwMiwgICAtNzQ2LCAgICAzNTEsCisgICAgICAtMjIyLCAgICA1MjIsICAtNTcwMiwgICAgNzk3LCAgLTE5MDAsICAgIDI0MSwgICAyMjcwLCAgICA3NjQsCisgICAgICAtMzM1LCAgIDEzNDgsICAgLTM0OSwgICAgNzg0LCAgLTE1ODYsICAgLTUzNywgICAgMTQ4LCAgIDMyMTEsCisgICAgIC0xNjkyLCAgICAgNTYsICAgMTY3OCwgICAtMzIxLCAgIC0yOTAsICAgNzkwMiwgICAgIDY5LCAgICAgNTIsCisgICAgICAgMzEwLCAgICAzMzcsICAgIDI1MCwgICAgNTk2LCAgIDk5OTgsICAgIDMzNiwgICAxMDM3LCAgICAxNjMsCisgICAgICAgIDY0LCAgIC00NDEsICAgMjg5NCwgIC0xMDMzLCAgICA3MzAsICAgLTcxOCwgIC0xMjUyLCAgICA0NTksCisgICAgICAtMTMxLCAgIDc4NDAsICAgLTkyMiwgICAtNTU1LCAgIDU2NzEsICAgIDI5OSwgICAgNjg5LCAgIDExMTUsCisgICAgICAtNjQ2LCAgIC01MDUsICAgLTI2MywgICAgNjA4LCAgIC00OTQsICAgICAgMCwgICAgNDQyLCAgLTE4MDIsCisgICAgICAtNTk4LCAgIC03MDEsICAtNDE4NCwgICAgIDcwLCAgLTEzMTksICAgIC05MCwgICA5MTU1LCAgIC0zMzksCisgICAgICAgICAwLCAgICAxMjEsICAgIDQ2MiwgICAgNzM1LCAgIC02MzksICAgIDQ4MSwgICAgMTI1LCAgIDY5MjQsCisgICAgICAzMzc5LCAgICA2ODMsICAgMzA1MywgIC0xMjE5LCAgIC00OTksICAgMTA2NywgICAtMTQ4LCAgLTI3MDUsCisgICAgICAgLTExLCAgICA3OTUsICAgMTY3NSwgICAgODk4LCAgICAyMjYsICAgMTIzMiwgICAgIDQ5LCAgIC01NzIsCisgICAgIC05MzA5LCAgIDIyMjMsICAgIDk0OSwgICAgNzY3LCAgIC04MjEsICAgIC05MSwgICAxMDc1LCAgIC0zNTIsCisgICAgIC03ODI5LCAgICA1NTQsICAgLTU5MywgICAxMjg0LCAgIC0yNDUsICAgMTIzOSwgICAxMTY2LCAgLTExNTcsCisgICAgIC01Mjc0LCAgICA4MDgsICAgIDg3MSwgIC0xNDQ2LCAgIDc1NzUsICAgLTM5NywgICAtNzU1LCAgICA3NTIsCisgICAgICA0MTkzLCAgICAxNzksICAgLTIwNSwgICAgLTM3LCAgIC03NTAsICAtMjY3NSwgICAtNDA3LCAgIC03MDAsCisgICAgICAgMjIwLCAgICAtNzcsICAgMTYwNCwgICAgIDYzLCAgICA0NjEsICAtOTk5NCwgICAtNjQ1LCAgLTE2MjksCisgICAgICAgMTAzLCAgICA1NzYsICAgIDEzMiwgIDEwMDA1LCAgICAtNDksICAtMTAwNSwgICAgIDk3LCAgLTE2MDgsCisgICAgICAgNTE1LCAgICAtMTAsICAgLTE0NiwgIC0xODc4LCAgICA4ODAsICAgIDQyOSwgIC0xMjcxLCAgICA5OTYsCisgICAgICAtMzY1LCAgICAgNzYsICAgLTQwOSwgICAyNDYxLCAgICAgMjksICAgMTE1OSwgICAgMjE3LCAgLTYyNDAsCisgICAgICAtMjAwLCAgIC03NDYsICAgIDExOCwgIC0xODg0LCAgICA0NTcsICAgLTgxNiwgICAtNjA4LCAgIDMyMTUsCisgICAgICAgMjQ0LCAgICA3NDksICAgMjI2OCwgICAtMjM2LCAgLTEyNzYsICAgLTI3OCwgICAxMzkyLCAgLTE3NjcsCisgICAgICAxMjU1LCAgLTE0NzQsICAtODEzNiwgICAxMzg4LCAgIC03NzAsICAgIDIyNSwgICAtNDQzLCAgICAgMTAsCisgICAgICAtMzkyLCAgICA2NTksICAtMTExOCwgIC0xNjUxLCAgIC01MTQsICAgLTkzNSwgICAtMTExLCAgIDExMTIsCisgICAgICAgOTczLCAgIC0yNDcsICAgLTIzNSwgLTEzMDEwLCAgIC03MzcsICAgICA0MCwgICAtMTQxLCAgIDUxNjcsCisgICAgICAtOTEwLCAgICAyNzksICAgLTQ2NywgIC0zNzYyLCAgICA4NDcsICAtMzkzNSwgICAxMDE4LCAgIDE5MjIsCisgICAgICAgODMwLCAgICAxOTAsICAgIDI1MywgIC0xMTMwLCAgIC00MTUsICAgIDM3MSwgICAgNzE4LCAgIDM4MzMsCisgICAgICAxMDM2LCAgLTUzNTgsICAgLTkyOCwgICAgODY2LCAgIC01MTQsICAgMjcyNCwgICAyMzU0LCAgICA0NDksCisgICAgICAgMjEwLCAgIDE0NjIsICAgIDY4MCwgIC0xODgwLCAgICAtNjIsICAxMDk4OCwgICAgODA5LCAgIC02MDIsCisgICAgICAgMTQ1LCAgIC01MzYsICAgIDExNCwgICAtMTQ3LCAgIC01NjgsICAgMzE5MywgICAtMzIyLCAgICA4OTIsCisgICAgICAtNjM3LCAgLTEzODEsICAgIC02NSwgICAgNzYxLCAgIDE2MTUsICAgNTAyNSwgICAtMzI3LCAgIDQ5NDEsCisgICAgICAtNjMxLCAgLTUyMjUsICAgMTIwNCwgICAzMDQyLCAgICA5OTgsICAtMTA0NywgICAtOTU5LCAgIC0xMDYsCisgICAgICAxNjEwLCAgIC0xNTEsICAgIDEyMCwgIC0xMTUyLCAgICAxOTEsICAgICAzMCwgIDExOTYzLCAgICAxMDEsCisgICAgICAgIDE4LCAgIC00MTAsICAtMTI4OCwgICAgMzcwLCAgIC03NzEsICAgMTMzNywgICAtNTQ0LCAgIC02MTMsCisgICAgICAgMjg5LCAgIC0xMTcsICAgMTYyNSwgIC00NTA2LCAgIDI1ODIsICAtMTY5MCwgICAtMTA1LCAgLTUzMjQsCisgICAgICAgLTkzLCAgICAyODUsICAtMTE2NywgIC0zNTY0LCAgIC03MjksICAtNDc5MCwgICAgNTk1LCAgICAyNzUsCisgICAgICAtMjE2LCAgIC0yMTcsICAtNjAwMCwgICAgNjgyLCAgIC0xNzEsICAgLTg3NSwgICAgMjI0LCAgIC0xNjQsCisgICAgICAyOTE5LCAgICA3OTYsICAgIC04MSwgICAxNDM0LCAgICAxODYsICAgLTM3NSwgIC00MTEzLCAgIC0xNzksCisgICAgICAgMjc3LCAgIDEzNjMsICAgLTQ1MywgICAyNTA1LCAgICAzODgsICAtMTg0MCwgICAtMTY1LCAgLTQ4MDAsCisgICAgICAgLTQyLCAgLTY2MzIsICAgICA1NCwgICAtNzM1LCAgIC01NTMsICAtMTY3OSwgICAgOTE3LCAgICAgLTIsCisgICAgICAtNjMyLCAgICA0MTcsICAgLTQ3OCwgICAtNDk0LCAgIC0yNjUsICAgICA3MywgICAtMzcyLCAgIC0zNjAsCisgICAgICAgMTc5LCAgIC00NDgsICAgIDI2NSwgICAgMjk5LCAgIC0xNTIsICAgLTIxMSwgIDEyNzMwLCAgICAtNzcsCisgICAgICAxOTU0LCAgIC01MzQsICAgIDc3MywgICAgNTI0LCAgICA0MzgsICAgMTkwMSwgIC00NDEzLCAgIC0zNTgsCisgICAgICAxNTUyLCAgIC0yNDgsICAtMTU4OCwgICAtMTIyLCAgIC0xMjcsICAgNTQwNSwgICAgMjI2LCAgIC04NDksCisgICAgIC03NDk1LCAgIC0zNTcsICAgIC04OSwgICAgMTg1LCAgICA3NDYsICAgIDg1MSwgICAgNjY5LCAgICAzMDUsCisgICAgICAtMjQ3LCAgIDM0NTcsICAgLTE5MywgICAtMTYxLCAgICA2MzgsICAgIDYwMCwgICAgNjEwLCAgICA4NTUsCisgICAgIC0xMjkyLCAgICAzOTgsICAgMTUyOCwgICAyMjUwLCAgIDE2NTEsICAtODQxNCwgICAgNzYzLCAgIDE1MjksCisgICAgICAtMzQ2LCAgIDM3NjksICAgLTExMSwgIC02NDk0LCAgICAzNDcsICAgLTc0MiwgICAxOTQxLCAgIDE5NjcsCisgICAgICAgNTgyLCAgLTU0OTksICAgLTc2NSwgICAtODE4LCAgIDE4NTAsICAtMTYwNCwgICAtMjQzLCAgIC05NDMsCisgICAgICAgLTExLCAgICA4ODQsICAtMjk5NiwgIC0yMzc1LCAgIDEwMTAsICAgLTM3NCwgICA2NjA1LCAgIC0yODcsCisgICAgIC01MDczLCAgICAyMTEsICAgLTc1OCwgICAgNzAzLCAgLTI2MDcsICAgIDc0NywgICAtMTMwLCAgIC00MjksCisgICAgIC0yNDgxLCAgIDQ4OTQsICAgLTQ1NywgICAzMjI1LCAgICA5NTgsICAgODUzMywgICAgNTQyLCAgIDYxNzcsCisgICAgIC0xMDY5LCAgLTEyMTAsICAgLTk2MywgIC01OTQzLCAgICAtODYsICAgMTQyNCwgICAtNTY3LCAgICA4MjcsCisgICAgICAtNTEwLCAgLTY1NzcsICAgLTI1OCwgICAgIC00LCAgLTQ0MzAsICAgIDExNSwgICA1NDAxLCAgIDEzOTAsCisgICAgICAgMzU0LCAgIDE3NTUsICAgLTk5OCwgICAgODUyLCAgICA5OTMsICAgLTQ4MSwgICAgMjE4LCAgIC05ODcsCisgICAgICAgNzc5LCAgIC00MTcsICAgIDU5MSwgICA2MDExLCAgICA1MjgsICAgIDI4OSwgICAtMzM2LCAgIC01NTgsCisgICAgICAgIDYwLCAgIDkxMjQsICAgLTE3NCwgICAgMjM1LCAgIC0yMzksICAgLTE0NCwgICAtMjYwLCAgLTM0NzIsCisgICAgICAgNzQ2LCAgIDQ3ODEsICAgIDY1MiwgIC00ODMxLCAgIC03MzksICAgIC0yMSwgICAgODY0LCAgLTIzMTAsCisgICAgICAgNjUyLCAgIDcxNDcsICAgIDExNiwgICAtMzE4LCAgICAtNTAsICAtMzQ4NSwgICAtMzI1LCAgIC0zNDUsCisgICAgIC01Nzg0LCAgIDExNDQsICAgMjM5OSwgIC0xNDQzLCAgICA5OTEsICAtMjMxOCwgICAtNzg1LCAgIC0yODEsCisgICAgICAtMjA3LCAgLTE0NDgsICAgIDMwOSwgICAxMDAxLCAgICA5NTIsICAgMTQ3MiwgIC01OTAxLCAgIC03ODAsCisgICAgIC0yNDU5LCAgIDE1MTgsICAgOTg3OCwgIC0xMjI5LCAgICA2NzAsICAgLTUyMywgICAxMjE3LCAgIC0xNjQsCisgICAgICAgLTU1LCAgICAtOTUsICAgIDI0MywgICA3OTA5LCAgICAgODYsICAtNDM4MCwgICAtODU5LCAgIC01OTksCisgICAgICAtMTgzLCAgLTIzMzksICAgIDc3NCwgIC0xMjEwLCAgIC01MDIsICAgLTg5OSwgICAgIDUzLCAgIDEwMzksCisgICAgICAgIDM0LCAgLTc3NTMsICAgLTI5NiwgIC0xOTUxLCAgLTQ1NTksICAgMTE4MiwgICAtMTUwLCAgIDI4NzgsCisgICAgIC00OTEwLCAgIDI3NjEsICAtMTQ4MSwgICAyMDQ4LCAgIDI2MDAsICAgMTgwOCwgIC0yOTUzLCAgLTIyNTcsCisgICAgICAgIDYyLCAgICAxNjIsICAgMTExNSwgICAgMjE0LCAgLTQ1MTAsICAgIDkyNiwgIC02NjY5LCAgIDE0NDMsCisgICAgICAtMTI0LCAgICAxOTMsICAgLTMxNCwgICAgMzAyLCAgICA2OTksICAgIC0xOCwgICAgNzQ1LCAgICAzNDEsCisgICAgICAgODk1LCAgIC02MTUsICAgLTI5NSwgICAtMTgxLCAgICAxNDMsICAgLTQyNywgICA2NTI4LCAgIDEwNzQsCisgICAgIC0xMTI2LCAgICAzNzQsICAgLTI5OCwgIC0xMjc0LCAgICAgMjIsICAgIDg4NywgICAtNTExLCAgLTEwNTcsCisgICAgICAzMjI4LCAgICA3MjIsICAgIDYwNywgICAgNjI0LCAgICAtOTUsICAxMTA4NSwgICAxMDA2LCAgIC03ODgsCisgICAgICAtMjg1LCAgICAtOTIsICAgMTM0MiwgICAtMzI1LCAgIC04MjgsICAgICA0MiwgIC0zNTg4LCAgIC02MzEsCisgICAgICAtNTc2LCAgIDQ1NTksICAgLTY2OCwgIC0xMjk0LCAgIDE3MzksICAgMTY5NywgICAtNjQ3LCAgIDIzMzYsCisgICAgICAgMzc2LCAgIC0xMjAsICAgMTM1MCwgICAgNjQ2LCAgIC0zMjUsICAgICA5NSwgICA1OTc0LCAgICA3NzUsCisgICAgICAgMTk5LCAgLTg1NTcsICAgIDkzMSwgICAtMzM2LCAgIC02NTEsICAgLTU2MSwgICAtNDMzLCAgLTIyNjYsCisgICAgICAtMTI5LCAgIC02NTcsICAtMTE4NCwgICAgIDY3LCAgICA1NzcsICAgIDYxNywgICAxODgwLCAgICA1NTIsCisgICAgICAgIDkwLCAgIC02MTcsICAgLTI3MywgIC0xNTcxLCAgLTc0ODEsICAgIDI2MSwgICAgLTI2LCAgICAtMjAsCisgICAgICAtNDU5LCAgLTEwMjgsICAgICA1NywgIC04NTE2LCAgICAtNDMsICAgMjc3NCwgICAgICAxLCAgLTQyMzgsCisgICAgICAgNjgwLCAgLTMzMTAsICAgIC01NiwgICAtMTUyLCAgICA1NDgsICAtMTk4MywgICAgOTIwLCAgICA4OTksCisgICAgICAyMTgwLCAgIC0zMDcsICAtMjIzMCwgIC0xNjg1LCAgIC05OTgsICAgMjA5MSwgICAtMTEyLCAgICAgMjEsCisgICAgIC0xNTUxLCAgIDExODIsICAgNjY0OSwgICAtMzI2LCAgICA3OTIsICAgMTgxOCwgIC03NTk2LCAgICA1NjMsCisgICAgICAxMDc2LCAgIDc0MjIsICAgLTkwOCwgICAxNTI0LCAgIC0yMjMsICAgNTc5OCwgICAxMzE4LCAgLTMzNzYsCisgICAgICAgNTE3LCAgIDQxNjIsICAgIDc1NiwgIC00MTQyLCAgIDE3NzYsICAgIDM5MCwgICAgMzM0LCAgICAtNDQsCisgICAgICAgMjE4LCAgIDUyOTAsICAgIDc5MiwgICAgIDM5LCAgIDE2OTIsICAgIDU0MiwgICAgLTYyLCAgIC01OTUsCisgICAgICAgNTkwLCAgICAgMjcsICAgODkyMiwgICAgOTg5LCAgICAxODIsICAgIDcyNSwgICAgMTEyLCAgICA0NTgsCisgICAgIC05MTcwLCAgLTEwMDAsICAgMTE3NiwgIC0xMjkwLCAgLTE0MDMsICAgLTcyNiwgICA1OTkwLCAgIC0yOTcsCisgICAgICAxMjM0LCAgLTE3MjQsICAgLTYwMSwgICAgNTI4LCAgIDEwNzIsICAgIDE4NCwgICAtMTQ2LCAgICAgNjEsCisgICAgICAgNjg1LCAgIDEyMDgsICAgIC04OCwgICAtMjExLCAgICAzNTYsICAgOTU2OSwgICAtMzYzLCAgIC0xMzUsCisgICAgICAtMTU5LCAgLTEwNjEsICAgLTEwNSwgICAtNDEwLCAgICAtNTgsICAgIDMzNSwgIC05OTg2LCAgIC0zMDAsCisgICAgICAtMjExLCAgICA2MDcsICAgIDQ0MywgICAtNDEwLCAgLTE3MzAsICAgLTMyOCwgICAgMjc1LCAgICA1NzksCisgICAgICAgODA1LCAgICA4OTksICAgLTQ2NCwgICAgLTE4LCAgICAyOTYsICAgLTQ0NiwgICAyMzk2LCAgICAtMTMsCisgICAgICAgNDE0LCAgLTk2NjIsICAgLTM4NSwgICAtODA4LCAgLTE4NjcsICAgIDE1NCwgICAtNTcyLCAgIDMzNTEsCisgICAgIC0xODM5LCAgICAtODAsICAgMTE1NywgICAtMzI2LCAgICA0ODEsICAgODgxNSwgIC0xMDM5LCAgIDEwNjUsCisgICAgICAyMTEwLCAgIDEyMjMsICAgLTk2MCwgICAgLTMzLCAgIC00NjQsICAtNTY2MCwgICAgNDkwLCAgIC0zMTQsCisgICAgICAgMzQ2LCAgICA3MzAsICAgLTM4NywgIC0xMTAyLCAgIDY2NTYsICAgLTcxOSwgIC0xMTczLCAgICAtNTcsCisgICAgIC0xMTg2LCAgIDIzOTQsICAtMTMwMCwgICAtNjY1LCAgIC01ODYsICAgIC0zOSwgICAgLTcxLCAgICAxNTUsCisgICAgICAxMTg0LCAgICAgIDQsICAtMzI2OSwgICAtMzMzLCAgIC03NDcsICAgIDU4MCwgICAgMjc5LCAgIC01ODMsCisgICAgICA3MTY0LCAgIC0xODUsICAgIDExMCwgICAyNDY1LCAgICA0MjgsICAgIDUwNywgICA0NDYyLCAgLTQ0NjEsCisgICAgICAgMTk5LCAgICAzMzcsICAtMzU5NywgICAtMjQ5LCAgICAtNzAsICAgLTY4MCwgIC01NTQ5LCAgIDE1MzMsCisgICAgICAgOTE3LCAgIC0zMDMsICAtOTIzMCwgICAtNDMxLCAgIC0xMjQsICAtMTAxOSwgICAgMzY5LCAgICAxMzksCisgICAgICAxMzY3LCAgICAxNTEsICAtMTA0NywgICA2ODIwLCAgIC0xNTEsICAgIDIyMiwgIC0yOTM0LCAgIC04MTcsCisgICAgICAgOTcxLCAgLTczMjUsICAgIDU1NiwgICAxMDM1LCAgLTEyNDAsICAgMzExNSwgIC0xMzI2LCAgIDQwMTIsCisgICAgICAyODEyLCAgIDEwNTcsICAgMjU4MCwgICAtMjYxLCAgIDM5ODksICAgMTk5OSwgICAxNjI0LCAgIDI0MDIsCisgICAgICAtMzEwLCAgICA3NzksICAgLTM1NCwgICAtMzc3LCAgIC0xNDksICAgMTAzNSwgIC0yMzYzLCAgICAzNTgsCisgICAgICAzNjY2LCAgIC0yNDYsICAtMTg5NiwgICAgMzc1LCAgIDM5MTksICAtMTM5MiwgICAgNjgzLCAgICA2MjQsCisgICAgIC01ODcyLCAgICA2NDQsICAgIDM5MSwgICAgMjg4LCAgIC0xOTgsICAgLTIzNywgICAgIDY4LCAgIC0yODQsCisgICAgICAgIDg4LCAgLTEwMTYsICAgIDI1MCwgICAgIDMyLCAgIDExODgsICAgLTI0MywgICAtNjA4LCAgIC0zMjAsCisgICAgICAtMjE5LCAtMTEwODcsICAgIDU0MywgICAgMTU2LCAgIDEwMzQsICAgLTE2OSwgICAtMTgzLCAgIC01NDksCisgICAgICAgLTY2LCAgICA3MTYsICAgIDk5NiwgICAtOTI4LCAgIC0zMDksICAgNTU3NywgICAgMjI5LCAgICAxMjUsCisgICAgIC0xMzI4LCAgIDkwMjcsICAgLTY5OCwgICAtNDg1LCAgLTE2OTQsICAgIDgzOSwgICAgMzQzLCAgICA0NDksCisgICAgICAxNjU1LCAgIDEwMDUsICAgMTA1MywgICAtNDA4LCAgIDkxMDYsICAgIDE4NiwgICAgNjcwLCAgICA3NzQsCisgICAgICAgMzE0LCAgICA1NzMsICAgMzg4OCwgICAtODgyLCAgICAgMjYsICAgMjUxOCwgICAtNTMzLCAgIC0xOTUsCisgICAgICAgNTU1LCAgICAzMzcsICAgLTI0NiwgLTEwNzc5LCAgIC0yMzEsICAgICAzMSwgICAtMzE0LCAgIC05NDEsCisgICAgICAxMTI5LCAgICAzMzMsICAtNzUwMywgICAgMTY4LCAgIC01NTEsICAgIDIzNywgICAtMTU5LCAgIDQzOTksCisgICAgICAgNDIxLCAgICA2OTMsICAgIDE5OCwgICAtMTk2LCAgIC01NjEsICAgMTAzNSwgICAtNTQ4LCAgIDEwNTgsCisgICAgICAgNTI3LCAgIDM2MTcsICAgLTM2MSwgICAxMzE3LCAgLTE5NzUsICAtMjYzOCwgIC0xOTY2LCAgIC0xMjAsCisgICAgICAtMzI0LCAgIDU2NzgsICAtMjI1MiwgICAtNjYzLCAgICAxODEsICAgLTI3MywgIC0zMDczLCAgIC0yODIsCisgICAgICAtNjIyLCAgICAzNjMsICAgICA3MSwgICAgMTg0LCAgIC03NzYsICAgIDI4NCwgIC0xNTE2LCAgIC00MzAsCisgICAgICAgICAzLCAgICA5MzcsICAgODU4NywgICAgMjU4LCAgLTEwNjAsICAtMTU1NSwgICAtODMwLCAgIC0zMzgsCisgICAgICAgMzE4LCAgLTkxMzAsICAgLTExMCwgICAgNDU5LCAgIC01NzIsICAgICA3MCwgICAgIDkzLCAgICAxMjAsCisgICAgICAtNTM0LCAgIDEyOTYsICAgLTE2OCwgICAgIDI5LCAgIC05MTQsICAgLTMzMiwgICAtOTk3LCAgIC04MTgsCisgICAgICAgMjcwLCAgIC0yNDMsICAgIDUyMywgICAgIDU2LCAtMTE4NDcsICAgLTQ0OCwgICAgIDExLCAgIC0xNTQsCisgICAgICAgMTY0LCAgIDIxMTUsICAgIC0xMywgICAtNjM1LCAgICA3MDgsICAgLTY2MywgICAgIDQzLCAgIC0yNDgsCisgICAgIC0zMjQ0LCAgICAyNTQsICAgICAxOSwgIC0xMTI1LCAgICA1MDgsICAgIDE1NCwgICA4Njk3LCAgICAxOTEsCisgICAgICAgNTk1LCAgIDQzOTMsICAtMjgwNiwgICAtMTY4LCAgLTE5MTYsICAgIDM5MywgICAzOTc2LCAgICA4OTcsCisgICAgIC0xNzE2LCAgICAtMzUsICAgLTE4MCwgICAgNjA1LCAgLTEwNTcsICAtMTE5NCwgICAgMTAwLCAgIC0zODQsCisgICAgICAgLTM3LCAgIC0xMDcsICAgMjczOSwgICAtMjA3LCAgIDY4OTksICAgIDE3NiwgICAgIDgxLCAgIC05MDEsCisgICAgICAxMjgwLCAgLTE2NzAsICAgLTEwMSwgICAgMjgxLCAgIDExNDcsICAgICA0OCwgICAgIDIxLCAgIC0xNTEsCisgICAgIC0xMjM2LCAgICAyMTAsICAgICA5OCwgICAtMTE0LCAgIC01NzMsICAgNzk0MCwgICAtMTUzLCAgIC0zMDIsCisgICAgIC0xMzMxLCAgICAzMzcsICAgLTMyMiwgICA2NTk4LCAgICA0NzcsICAgIDE0NywgICAtOTk5LCAgLTMxNjYsCisgICAgICAtMjMyLCAgLTUxMDQsICAgLTc5OSwgIC0xODY2LCAgICAtNTgsICAtNDIxMywgICAxMzc2LCAgICAxODEsCisgICAgICAgNjc1LCAgICA1NjIsICAgIDEyNiwgICAgMjM1LCAgIDIyNjAsICAtNTE1MiwgICAtMjQzLCAgIC02OTksCisgICAgIC0xNDc2LCAgIDQxMzUsICAgIDU2OSwgICAgNTY3LCAgICA3MzcsICAtNDE2MywgICAgNjEzLCAgLTEwNTcsCisgICAgICAxNzc4LCAgICA1NDYsICAgLTQ1MCwgICAgLTI0LCAgICAzMjUsICAgIDM2NiwgICAyNDA2LCAgLTEzMTksCisgICAgICAgIDYwLCAgLTUxMjYsICAgICA0OSwgICAgNjU3LCAgLTU5MzcsICAgLTE5NCwgICAgODgyLCAgIDMyNjcsCisgICAgICAgMTc4LCAgIC0yOTgsICAgMTg3MywgIDEyNDIyLCAgICA0NTksICAgIDI3MiwgICAgMTk1LCAgLTE4MjcsCisgICAgICAgMjEyLCAgIC04MDIsICAgIDczMCwgICAgNDcxLCAgIDE1NTYsICAgIDQyMiwgICAgNjQwLCAgICAyMzYsCisgICAgICAgIDcxLCAgICA1OTcsICAgNTc4MywgICA1Mzc4LCAgIC02NDksICAgMTUyNCwgICAgODI5LCAgICA0MzcsCisgICAgICAtMzUxLCAgIC0xMjIsICAtMTQwMCwgICAyMTE5LCAgIC0xMjgsICAgICA3NSwgIC0xNjc3LCAgIC02MzMsCisgICAgICAtMzIyLCAgLTYzODIsICAgLTU3MywgICAtOTc0LCAgIDE2NzIsICAgLTM3OCwgICAtMjQyLCAgIDM3MDgsCisgICAgICAgIDc5LCAgLTEzMjUsICAgIDM5NywgICAtMTUwLCAgIDE5NzcsICAgIDQ0MiwgICAgNzQ3LCAgIC0xMjcsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBzaGFwZTE2c1tdID0geworICAgICAgLTM5MiwgICAgIDk2LCAgLTc3MjAsICAgICA5OSwgICAgNTI0LCAgLTgyNzIsICAgIC0yMCwgICAgMTY0LAorICAgICAgLTQzNCwgICAgLTg1LCAgIC00MjgsICAgMTM2MiwgICAgMTA4LCAgICAyMjMsICAgMTA1MywgICAgLTExLAorICAgICAgLTE5MywgIC01MTQwLCAgIC0xOTEsICAgLTE1OSwgICAgMTkzLCAgIDgwMDUsICAgIC0zOSwgICAtNDgzLAorICAgICAgMTc2NCwgIC0xMDYxLCAgIC0yNjgsICAgLTMxOCwgICAtODgwLCAgICA0NzQsICAgICA0OSwgICAgIC04LAorICAgICAgLTIyMywgICAgMTMwLCAgMTEyNjMsICAgIDE2NSwgICAgIDEyLCAgICAtNDMsICAgLTEwMywgIC0xMTQ1LAorICAgICAgLTU4OCwgICAgLTgxLCAgICAyOTksICAgICA3MywgICAgNDQ0LCAgLTcyNDMsICAtMTQxMSwgICAtNjQwLAorICAgICAgLTk0NiwgICAgIDE2LCAgIC04ODEsICAgIDQ5NiwgICAyNDAzLCAgIC00NzYsICAgMTA5MCwgICAtMjk0LAorICAgICAgICAyOSwgICAtMTQ4LCAgICAxMDksICAgIDE0NSwgICAgLTUyLCAgICAyNDcsICAgLTU0NSwgICAxMTE1LAorICAgICAtNzQ1MSwgICAtNDkxLCAgLTE0NTksICAgIDM5NywgIC04NjAzLCAgLTEwMjIsICAgMTQ5NCwgICAgMjk4LAorICAgICAtNTE1NiwgICAtMzU4LCAgLTEwOTcsICAtMjkxMSwgICAgNDIzLCAgICA2NTIsICAgLTM3OCwgIC0yMzU3LAorICAgICAgIC03NCwgICAgNDE1LCAgIC0zNjcsICAgIDQwMiwgICAyMTczLCAgIC0xNTQsICAgIDEyMiwgICAgMjgzLAorICAgICAgMTM1MiwgICAgMzAyLCAgIC0zNzMsICAgLTQzMSwgICAtMjgzLCAgIC0xMDksICAgIC02NCwgICAtMzQzLAorICAgICAgLTEwOCwgICAgIDU1LCAtMTQ2NDQsICAgIDI0MSwgICAgIDM3LCAgIC03MjMsICAgIC03MSwgICAtMjA4LAorICAgICAgLTEyNiwgICA0MDYxLCAgLTk4ODcsICAgIDQ5NCwgICAyMjczLCAgIC01MDUsICAtNDA0MCwgICAgIDY2LAorICAgICAgLTgwNiwgIC0xMTIxLCAgLTE4OTQsICAgIDc4MywgIC0xNDQ1LCAgICA0MjYsICAgLTgyMCwgIC0xNzM5LAorICAgICAgIC0xMSwgICAgNjUwLCAgIC0yODIsICAgLTUxOCwgICAgMTI0LCAgLTcyNjYsICAgIC0yMSwgICAgMTYwLAorICAgICAgLTMzOSwgICAgICA1LCAgIC0yMDgsICAxMTcxMiwgICAgMTk4LCAgICAtNTMsICAgIDkyMSwgICAgIDg5LAorICAgICAgNTk4NywgIC00ODA2LCAgICAxNzYsICAgMTg4NCwgICAgIDY0LCAgIC01MTcsICAgMjE2OSwgICAgMTA4LAorICAgICAgIDI5NywgICAtMTExLCAgIC0zODksICAgLTg0MCwgICAgNjYzLCAgICAgNzUsICAgLTQ4NSwgIC00ODYyLAorICAgICAgLTE3NywgICAyNjYzLCAgIC0yMjksICAgODEyMCwgICAtMjE5LCAgICA0NjIsICAgMzEwNCwgICAgOTU1LAorICAgICAgIDM4NCwgICAxMzEwLCAgICAtNzMsICAgLTUwNCwgICAgMjU4LCAgICAxNzAsICAtMTc5NiwgICAtNDgyLAorICAgICAgNTY5MSwgICAtNDM3LCAgLTg0NzQsICAgIDU4MywgIC0xNjg1LCAgIC04MjcsICAgIDI5MiwgICAgLTY1LAorICAgICAgMTk5NCwgICAtMzg0LCAgICAxMDUsICAgIDEyMywgICAgMjU2LCAgICAtODIsICAgLTM2NywgIDE1MjA0LAorICAgICAgLTEyOCwgICAtMjYwLCAgICAtMTAsICAgIDE2OSwgICAgMjQ5LCAgLTEyODYsICAgMTA1NSwgICAgMTM2LAorICAgICAgIDY3OCwgICAgIDYxLCAgIDE0MjAsICAgLTE1OSwgICAgLTE1LCAgIC0yMjEsICAgLTI1MCwgICAgMTA3LAorICAgICAgIC0yMSwgICAgMjk3LCAgICAgNTQsICAgIDI0MiwgICAtMTExLCAgICA0NjgsICAgIDIzNywgICAgLTM2LAorICAgICAgLTE1OSwgICAgIDM3LCAgIC0xMDIsICAgLTQ4OCwgIC00NTc3LCAgICAgNzIsICAgMTAwOSwgICAgIC0xLAorICAgICAgMTIxOCwgICAyMDIzLCAgIC02NDAsICAgLTQzNywgICAgNzY2LCAgIC0yOTksICAgNjE0NCwgICAgMTg0LAorICAgICAtMTAyMywgICAgMTcxLCAgIC0zODgsICAgIDg4NCwgIC0xMjk0LCAgIC0zMjAsICAgODcxOCwgICAgODk2LAorICAgICAgLTI5NSwgICAtOTc2LCAgIC04MDMsICAgMzA5MiwgICAxNzIwLCAgIC0yNTUsICAtMTM1NCwgICAtNjY1LAorICAgICAgIC02MywgICA0MzgyLCAgICAgNDEsICAgLTEyMSwgICAtMTU3LCAgICAzNTQsICAgIDEyNywgICAgNTg3LAorICAgICAgLTU5OSwgICAtMjMxLCAgICA0ODQsICAgLTE1MCwgICAtMjg0LCAgIC00OTgsICAgLTUxMSwgICAgIDc5LAorICAgICAgNTUwMywgICAgIDEzLCAgIDY1MzcsICAgIDc2MSwgIC0xNjE5LCAgIDExNjQsICAtMjQwMywgICAzMDU3LAorICAgICAtNDk2NiwgICAgNzI0LCAgIDEwNzYsICAtMTU1NSwgICAgODg5LCAgIC0zNjUsICAgICA2MCwgICAtNDQwLAorICAgICAtNzE0NCwgICAtMTMyLCAgICAyODMsICAgLTMwNSwgICAtMTI2LCAgLTE0ODIsICAgIDEyNSwgICAgLTUyLAorICAgICAgIC0zMywgICAxMjg0LCAgIC05NjEsICAgMTM1NSwgICAgOTUzLCAgLTEwMTIsICAgLTIyNywgICAgIDg2LAorICAgICAgIDczMSwgICAgLTE0LCAtMTU5NzcsICAgIC01NiwgICAtODc1LCAgLTE2NzYsICAgIDEyNywgICAgNTAwLAorICAgICAgMzM5MCwgICAgLTE0LCAgIC0zMTksICAgLTY0NCwgICAgMTQzLCAgICAyNDksIC0xMDc1MiwgICAgIDIzLAorICAgICAgICA1NCwgIC0xMDc1LCAgIC0xMTEsICAgIDY4MCwgIC0xNzE0LCAgICAzMjgsICAtMjA5MiwgICAtODUyLAorICAgICAgIDYyMiwgICAgOTQ5LCAgICAgNjEsICAgICAgNiwgICAgLTE3LCAgICAxNDQsICAgIDE5MCwgICAgMjE2LAorICAgICAgIDEzMCwgICAgLTY1LCAgICAgMjcsICAgLTMyMiwgICAtMTM5LCAgICAgNDMsICAgICA4OSwgICAgIDc2LAorICAgICAgIC04NCwgLTEwMTIwLCAgICAtNDcsICAgIDM2NywgICAtMjYxLCAgICAgMzgsICAgICA1MCwgICA0MjMzLAorICAgICAgLTIxMCwgICAgIDE0LCAgICAgLTEsICAgICAyNSwgICAgNzYyLCAgIC0yOTksICAgLTEzMiwgICAgMTc3LAorICAgICAgIDk3NCwgICAtNDkyLCAgIC0xNDUsICAgIC00MywgICA1MTA1LCAgIC0zOTQsICAgLTE5NiwgICAgLTkxLAorICAgICAgIC0yNSwgICAgNDczLCAgLTgzNTgsICAgLTQ3NiwgICAgNTg5LCAgLTEzNzIsICAgLTI1NCwgIC0yMzg3LAorICAgICAgLTI5MywgICAtMzA0LCAgIDM4MjgsICAgLTI1NCwgICAtMTkzLCAgICA0OTMsICAgICA1NCwgICAtMTA4LAorICAgICAtODc4OSwgICAtMjYyLCAgIC0yMzMsICAgLTgyMSwgICAtMjIyLCAgICA3MTQsICAgMTI3MCwgICAgLTYxLAorICAgICAgIDg5MiwgICAgIDEzLCAgIDM5NTIsICAgIC0zNiwgIC0xNTY3LCAgIC02MjAsICAgLTEyNiwgIC0xMDU2LAorICAgICAgIDU4NywgICAgMzkwLCAgICAtMjQsICAgMjAyNywgICAgMjY3LCAgICAyMTgsICAgICAxNSwgICAgLTU2LAorICAgICAgLTEzMCwgICAgIDQwLCAgICA1NTEsICAgIC0yOSwgIDE0NTk0LCAgICAtMjMsICAgIDEwNiwgICAgLTE0LAorICAgICAgLTE3MiwgICAgMjc5LCAgICA0MjcsICAgLTI0MSwgICAgMzAzLCAgICAtMjAsICAgLTc0OCwgICAgIDU1LAorICAgICAgNTE4NywgICAgNTk4LCAgIC0yMTcsICAgMjAyNiwgICAgNjQzLCAgICAxMTgsICAgIDkxMSwgICA4MDIzLAorICAgICAgIDI5NiwgICAgNzkxLCAgICAgMzksICAtMjYyMSwgICAgNjU1LCAgICAyMjgsICAgLTY3MSwgICAtMjcyLAorICAgICAgLTE3NiwgICA2NjQ0LCAgIC0xNjYsICAgLTI2NCwgLTEwNDI5LCAgICAgOTEsICAgIC04MywgICAtNjg0LAorICAgICAgLTE2OSwgICAtMzQ0LCAgIDIxMjMsICAgLTEwMiwgICAtMzMzLCAgIC0zMTcsICAgLTgyNiwgICAgNTg2LAorICAgICAgIDExNiwgIC05MzExLCAgICA0NDUsICAgIDE0MSwgIC0xMzE1LCAgIC03NTgsICAgIDE0NCwgICA1NjIwLAorICAgICAgIDM2MywgICAgIDY2LCAgICAxNDIsICAgLTE2MSwgICAtNjg0LCAgICA0NTQsICAtNjU4NCwgICAtMjA1LAorICAgICAgIDU3NywgICAgMjA1LCAgICAzMDUsICAtMTUzNiwgIC00MTA5LCAgIC0zMTgsICAgIDEyMSwgICAtMzIzLAorICAgICAtMTAzNiwgICA4MDIwLCAgIDExNDYsICAtNDAwNCwgICAgMTc1LCAgLTE1NjgsICAtMTUzNywgICAtNTI1LAorICAgICAgMjI4NCwgICAgIDYyLCAgICAgMTEsICAgIDY0MCwgICAxMjQzLCAgICAyNjAsICAgLTEwNCwgICAtMzQ0LAorICAgICAgIDEwMiwgICAtNjI0LCAgICAxMjIsICAgLTMwMCwgICAgMjY2LCAgLTYxMDQsICAtMTE0OSwgICAgNDEyLAorICAgICAtMTM4MCwgICAgIDIyLCAgIDc1NjEsICAgIDM2MCwgICAgNTY0LCAgICAzOTgsICAgLTMzOCwgICAgMTc0LAorICAgICAgIC03NiwgICAgMTMxLCAgICAgNDQsICAgLTQyNiwgICAgLTEyLCAgIC0xNzUsICAgLTExMywgICAgIDc4LAorICAgICAgIDI5MywgICAtMTIwLCAgICAtOTIsICAgIDMzMSwgLTE2MTYzLCAgICAtNzQsICAgLTEwMSwgIC0xMTk4LAorICAgICAgLTI5OCwgICAtMTcxLCAgIDQwNTIsICAgLTEzOSwgICAtMTg3LCAgICAxMzEsICAgIDMyMywgICAgMzcwLAorICAgICAgLTE0NCwgICAtMTYwLCAgICAxMzEsICAgLTI4NCwgICAtMTkwLCAgICAgODMsICAgIDg3OCwgLTE0ODE3LAorICAgICAgICAxNCwgICAgMTk2LCAgICAxOTgsICAgIDI5NCwgICAtMTIwLCAgICAgNDAsICAgIDgwMCwgICAxODQxLAorICAgICAgIDM5MywgICAtMTY4LCAgICAzMzcsICAgLTU0MCwgICAtMzU2LCAgICAxMzAsICAgOTIxMCwgICAgODgwLAorICAgICAgIDMwNCwgIC0yMzA0LCAgIC0yNzUsICAgMTM5NCwgICA5OTAzLCAgICA2NzMsICAgIC02MiwgIC00NzA2LAorICAgICAgLTEzMCwgICAgMjc0LCAgICA1MjgsICAgICA4OSwgICAtNDU4LCAgICAtOTAsICAgNjMxOCwgICAtMTMzLAorICAgICAgIDMxMCwgIC01OTUzLCAgICA2ODIsICAgICAzNywgICAyOTM3LCAgIC0zNzEsICAgIDE5NywgICAgIDc3LAorICAgICAgLTE4NCwgICAxMjQwLCAgICAgMjIsICAtNzY5NSwgICAtMTcxLCAgLTQ4NzQsICAgLTY3NiwgIC0xMTIxLAorICAgICAgLTg0MiwgICAtNjQyLCAgIDExNjAsICAtMTA4OCwgICAtODY0LCAgICAzNTIsICAgLTc5MCwgICAgNzk0LAorICAgICAgIDgwMSwgIDEwNTY0LCAgLTE3NzcsICAgMTA5NSwgICAtNDQxLCAgIDE3MTgsICAgIDExNiwgICAgOTgyLAorICAgICAgLTI2OCwgICAgMTk5LCAgLTI0MDgsICAtMjA0MiwgICAgMjc5LCAgIC0xNDYsICAgIDY0NSwgIC0xMzUwLAorICAgICAgICAgNSwgICAtMTUwLCAgIC05MzIsICAgIDExMywgICAgIDI1LCAgIC02NzIsICAgIDE1MywgICAgMTU4LAorICAgICAtNjE0MCwgICAtMjYyLCAgICAxNDIsICAgNDgxNSwgICAgIC0xLCAgIC00MjQsICAgIDgxMCwgICAgIDYzLAorICAgICAgICA4OCwgICAtNTEwLCAgIC0yMzYsICAgMzk2NCwgICAgLTY2LCAgIDEyMjksICAgIC0xNiwgICAtNzU4LAorICAgIC0xMTAyMywgIC0xMTQ5LCAgICAgNDgsICAtMTc1NiwgICAgMTY3LCAgIDIzMDgsICAgIC05NiwgICAtNjU0LAorICAgICAgLTYzOSwgICAgMzY5LCAgIC0yMjEsICAgICA0NywgICAgMjAyLCAgICAzMjksICAgLTM1MiwgICAgLTI2LAorICAgICAgIC0xOSwgIDEzMTk4LCAgIC0zODMsICAgIDEyNCwgIC0xMjExLCAgIDM4NzksICAgLTM0NCwgIC0xOTU0LAorICAgICAtODcwMiwgICAgIDMyLCAgICA5MjQsICAgIDQ3MiwgICA3OTUzLCAgICA2OTIsICAgLTIxNiwgICAtNDE1LAorICAgICAtMzE3NCwgIC0xOTU5LCAgICA5MzUsICAgNDA0OCwgICAgMTU1LCAgIDc1MjEsICAgIDg1NCwgICAtMTU3LAorICAgICAgIDY0MywgICAzNzYwLCAgIC0xMDcsICAtMjUzNiwgICAgNjIyLCAgIC03NDIsICAgMTg4MSwgICAyMjYyLAorICAgICAgIDc1OCwgICAtOTY4LCAgIC0yNzEsICAgLTEzMSwgICAgMzg1LCAgLTUxMDcsICAgLTIxMiwgIC0yNTQ4LAorICAgICAgICAyOSwgICAtMTMyLCAgIC01MDYsICAgLTE5MCwgIC0xMDY1LCAgICAzMTQsICAgIDIwMiwgICAgMzMyLAorICAgICAtMjI3NCwgICAgNzAxLCAgICAgIDQsICAgIC0yMiwgICAtNDM5LCAgICAxOTgsICAgLTI2NSwgICAgLTkyLAorICAgICAgLTE0MywgICAgNDYwLCAgICAtMzIsICAgIDE4OSwgICAgMzM0LCAgICAgODcsICAtNzYzOSwgICAgIDQ1LAorICAgICAgLTM4NywgICA0MjQwLCAgIDEyMzEsICAgICA5MiwgICAxMDMyLCAgIC0zMzMsICAgLTI4MCwgICAyMDYxLAorICAgICAgIDI5NiwgICAgMzY1LCAgIDIwMDMsICAgLTQyNiwgICAgLTM1LCAgICAgOTYsICAgIC02MiwgICAgODgyLAorICAgICAgLTc4NCwgICAgNDgzLCAgIC0xMjgsICAgLTE0MywgICAgNDc0LCAgMTM3NDAsICAgLTE2NiwgICAgMTg0LAorICAgICAgLTcxNCwgICAgMTQyLCAgICAyNzgsICAgNTYyMiwgICAgLTY3LCAgICAyODIsICAgIDY0NywgICAtMTMwLAorICAgICAgIC0zMSwgICAgMzAwLCAgICA3MjcsICAgIDcyOCwgICAgNDA5LCAgICAxNzgsICAgLTYwMSwgICAgIDg0LAorICAgICAgODMwNSwgICAtNDQ2LCAgICAxNzksICAgIDExNSwgICAgMjA5LCAgIC0yNzMsICAgIC00NywgICAxOTMyLAorICAgICAgLTI1NSwgIC0zMTcxLCAgIC0xMDIsICAgIDQ2MSwgICAtMTE5LCAgLTgxMDIsICAgLTgwOSwgICAgMTA4LAorICAgICAtMTY4MCwgIC0zMTcxLCAgIC03NzUsICAgIDMyNCwgICAtMjQ2LCAgICAxMzIsICAgIC0yNywgICAgIDg0LAorICAgICAgODQ5NSwgICAgLTQ1LCAgICAxNTMsICAgICAyMSwgIC0xMzg0LCAgICAyOTAsICAgLTg2OSwgICAgIDM4LAorICAgICAgLTQ0MCwgICAgMTMzLCAgIC0yNTcsICAgIC0yMiwgIC0zMDQ2LCAgICAgMTIsICAtMjc5NywgICA0NTE3LAorICAgICAgIDE0MiwgICAxNjA1LCAgICA0MjMsICAgIDU3OSwgICAtNTU4LCAgIC0zMDEsICAgLTI1NywgICAgNzAxLAorICAgICAgLTI0NiwgICAtNDY4LCAgLTE5NDYsICAgIDEyMCwgICAgMzIxLCAgICA3MTAsICAgLTIxNywgICAtMjAzLAorICAgICAgIC01MCwgICAgLTQ0LCAgLTU4NjYsICAgICA4MCwgICAgMjU5LCAgICA0ODgsICAgIDc1NCwgICAgMTI0LAorICAgICAgLTUxNywgICAgNzAzLCAgIC0xOTcsICAgIDE0NiwgICAgNTc2LCAgIC03MTcsICAgIDI0NywgICA0MTIxLAorICAgICAgICAxMCwgICAtNDIyLCAgLTI2ODYsICAgIDMyOSwgICAxMTgzLCAgMTQ1NzMsICAgICA3MiwgICAgMzAxLAorICAgICAgMjA0MywgICAtMTI1LCAgLTE0MjAsICAtMTI2MywgIDEwMzQwLCAgIC02NzgsICAtMTIyNiwgICAgMzMwLAorICAgICAgIC02MiwgICAgMTczLCAgIDU4ODUsICAgIC01NiwgICAtMTc4LCAgLTEwOTAsICAgLTYxNiwgICAgOTUzLAorICAgICAgLTIxNiwgICA4Mjc3LCAgIC0xMjQsICAgIDQxMSwgICA3NzU4LCAgICAtNzgsICAgLTMyNiwgICAgNzg2LAorICAgICAgICA0NiwgIC0xMzY1LCAgIC01NTUsICAgIDQ3OSwgICAtNzc0LCAgIC01NzYsICAgICAgOCwgICAgMzA0LAorICAgICAgIDM5MCwgICAtMTg2LCAgIC04MjAsICAgICA3MiwgICAgLTY3LCAgIC01ODUsICAxMTA3MCwgICAtMjEzLAorICAgICAgIC0xMiwgICAgMzQ0LCAgIC0zOTksICAgLTc0OCwgICAtMTUwLCAgIDI3MTksICAgIDE5NSwgICA1NjUyLAorICAgICAgNDYyNiwgICAgNTQ5LCAgIDI3ODIsICAgICAtNCwgICAxOTI4LCAgICA0ODIsICAgMTAwOCwgIC02Mzk4LAorICAgICAgIDg0MywgICAgNDU3LCAgIDE4NDMsICAgIDI2OSwgICAxMjQ3LCAgICAzNTAsICAgLTY2MSwgICAgLTM1LAorICAgICAtNjQ3NywgICAzNzI3LCAgIDIzMTMsICAgLTQyNCwgICAtOTA3LCAgICA0MTUsICAgMTA3NSwgICAzOTYwLAorICAgICAtMTQ5OSwgICAgIDYxLCAgICA1OTQsICAgLTc0NCwgICAgMTEwLCAgIDI0ODYsICAgIDk2NywgICAgIDI3LAorICAgICAtNTI2MywgICAtNjE4LCAgIC01NzgsICAgIDMxMywgICA3MDU1LCAgLTEwODEsICAgIDczOSwgICAtNDkyLAorICAgICAtMjA1MSwgICAgMzE3LCAgICAxMTIsICAgLTE1NSwgICAtMzA0LCAgIC01MDcsICAgIDE1MCwgICAgMjUzLAorICAgICAgIC00MiwgICAgMjIxLCAgICAgOTIsICAgLTI3NSwgICAtMzU1LCAgLTg0OTQsICAgLTY2MywgICAgMTA5LAorICAgICAgIDI4MiwgICAtODM2LCAgIC0yNzEsICAgOTMxNiwgICAgMTY1LCAgICAgNjMsICAgLTE3MSwgICAgIDEwLAorICAgICAgIC0zOCwgICAtMTgwLCAgIC0yMTksICAgLTI1MCwgICAtOTI0LCAgIC01NzMsICAgLTI0MSwgICAgNTY2LAorICAgICAgLTE3NSwgICAgIDIwLCAgICA0NTQsICAgIDI1MSwgICAtMzI4LCAgICAyMzYsICAgLTIxNSwgIC01NjczLAorICAgICAgICAgMCwgICAtMjY1LCAgICAyMjUsICAgIDM1NCwgICAgMTEzLCAgIC00ODgsICAgIDE3NCwgICAtMTMyLAorICAgICAgIDEzNCwgICAtMTg4LCAgIDEyNTUsICAgIC05NCwgICAgLTU1LCAgIC0xOTMsICAgIDQwNCwgICAgNTA0LAorICAgICAgIDc4NCwgICAtMzc3LCAgLTU3MzEsICAgIDMzMywgICAtNDQ3LCAgICAyMjIsICAgIDEzOCwgICAgIDcyLAorICAgICAgLTI1NiwgICAgLTU4LCAgIC0yMzAsICAgLTE2OSwgICAgNzI4LCAgIC00ODEsICAgICA5NSwgICAtMzk0LAorICAgICAgIC03NCwgICAtNDg5LCAgIC0yNTMsIC0xMzc3MCwgICAgIDYxLCAgICAxODQsICAgIC0zNiwgICA1MDI1LAorICAgICAgLTIzMiwgICAgMzIxLCAgICAyNTMsICAtMzQxNCwgICAgMTIwLCAgLTI1MTIsICAgIDc5OSwgICAtNTg2LAorICAgICAgMTE4NiwgIC0xMTM1LCAgIC05NTUsICAgIC01NCwgICAgICA3LCAgICAgODMsICAgICAgMCwgICA1MjU5LAorICAgICAgIDQ2NiwgIC02MzU4LCAgICAyNTQsICAgIDM4OCwgICAtMjExLCAgICAyMDcsICAgMjQ0OSwgICAgMzc5LAorICAgICAgIDQzMCwgICAtMjE5LCAgIC00NDIsICAgIDIyOCwgICAgMTUxLCAgMTE4MTksICAgICA2NywgICAtMTAxLAorICAgICAgIDIzOSwgICAtMjgyLCAgICAxMjEsICAgLTI3MCwgICAxMjA5LCAgIC0zODYsICAgIDU1MywgICAtMTA4LAorICAgICAgIDc4OSwgICAtNTE4LCAgICAyMzcsICAgIC00OCwgICAgNDk3LCAgIDg5ODYsICAgICA4MCwgICA4MjMyLAorICAgICAgIC04OSwgICAtMzU5LCAgIC04MDMsICAgIDQ3MywgICAgOTk1LCAgIDExMzIsICAgIDYyNCwgICAxMzUzLAorICAgICAgLTMwNSwgICAgNzExLCAgICAtNzEsICAgIC0yNiwgICAgIDE4LCAgICAyNTQsICAxMzA3OSwgICAgLTcyLAorICAgICAgIDE3OCwgICAgLTE4LCAgIC0xMTYsICAgIDI5MywgICAgMTU1LCAgIC0yNTQsICAgLTgxOSwgICAtMTY2LAorICAgICAgLTgwOCwgICAtMTkwLCAgICAxNTAsICAtNDMyOCwgICAgLTMzLCAgICAtMTQsICAgIDI3MiwgIC02NDE3LAorICAgICAgICA3OCwgICAgIDc4LCAgICAgNjcsICAgIDMxMCwgICAtMTc3LCAgIC00MzUsICAgIDIyNSwgICAgNjEwLAorICAgICAgIC0xNSwgICAgICAxLCAgLTY3MDYsICAgICAzMCwgICAgICAxLCAgIC0xODksICAgIDI3MCwgICAgLTIxLAorICAgICAgIDI3NiwgICAtMTgyLCAgICAgNzcsICAgLTIzMSwgICAgIDMwLCAgIC0xMTYsICAtNzcxMywgICAgMTU4LAorICAgICAgIDM0NCwgICAgNTYwLCAgIDE0NjYsICAgMzU3NSwgICAgLTg0LCAgLTQ1ODMsICAtMTI2MCwgICAgMzcyLAorICAgICAgMTM5NSwgIC01MjIzLCAgICAyODQsICAtMTkxMSwgICAgMzE1LCAgLTIzMTIsICAgIC00NywgICAtMjA3LAorICAgICAgIDQxNCwgICAgMTI5LCAgICAgMzYsICAgICA4NSwgICAgMzE3LCAgIC0xMjUsICAgIC02MywgICAtMjEyLAorICAgICAgIC03NiwgICAgMTMwLCAgIC0zODUsICAgIDE1NywgICAgMTE3LCAgICAgMTIsICAxNjE0MCwgICAtMTcxLAorICAgICAgIDM3NSwgICAtNzIxLCAgICAxNjEsICAgLTM0MiwgICAgOTUwLCAgIC02NjcsICAgMTAxMSwgICAgIDE1LAorICAgICAgIDUzNiwgIC0xMjAzLCAgIDEwMzksICAgLTI0MiwgICAtMTU5LCAgIDc2NjQsICAgLTQyOSwgICAtMjY0LAorICAgICAtODIyMSwgICAtMTA5LCAgICA4NjcsICAgIC03NCwgICAgLTc5LCAgIC00MTQsICAgIDU0NCwgICAgMjA2LAorICAgICAgIDEyMCwgICAxODU5LCAgICAtNDQsICAgICA3MywgICAgNTU0LCAgICAxMjEsICAgLTE2MCwgICAtMTI3LAorICAgICAgIC0zMywgICAgIDQ0LCAgICAtMjQsICAgIDI4NSwgICAgNTg5LCAtMTI1MTQsICAgICA1MSwgICAgNDY0LAorICAgICAgICAxNywgICAgMjY0LCAgICAgNTgsICAtNjg2MSwgICAgMzY3LCAgIC02NzIsICAgIDIyNywgICAyNzkzLAorICAgICAgIDc4MiwgIC02Mjg2LCAgIC00MjAsICAgLTgwOCwgIC0xMjQ3LCAgICA4OTUsICAgIDk1MCwgICAxNTMzLAorICAgICAtMTA3OSwgICAtMjA3LCAgLTE5MjcsICAtNDk0NywgICAtODAzLCAgIC0zMjgsICAgNzY3NywgICAtMzg2LAorICAgICAtNDYwOCwgICAtMzI5LCAgIC00ODUsICAgMjM2NSwgIC0xNDkyLCAgLTE3MzgsICAgLTM3OCwgICAtNzA3LAorICAgICAtMTg1MCwgICA5MDQ0LCAgICAzMTQsICAgMzUzMCwgICAgIDYxLCAgIDI5MjEsICAgICA3OSwgICA5NTA4LAorICAgICAtMTEwMiwgIC0zNDg3LCAgICA4MTQsICAtMjgyOCwgICAgNTUwLCAgIC05MjksICAgLTcxMiwgICAtMjc0LAorICAgICAgLTU2NiwgIC0yNTIxLCAgICA1MzYsICAgLTI5NiwgICAgLTk3LCAgICA5NTEsICAxMTM1MiwgICAtNjE0LAorICAgICAgIDEwNiwgICAtMzQyLCAgLTEwMTcsICAtMTE4MywgICAtMTU3LCAgIC00NTcsICAgIDI2NiwgICAgMTA5LAorICAgICAgIDU0NSwgICAtMzEzLCAgIDEwMTUsICAgNjk2MSwgICAgIDUyLCAgIC0yMjQsICAgMjI0NywgICAtMjQ4LAorICAgICAgLTE4MCwgIDEyMzY3LCAgICAzMTEsICAgIDUxNCwgICAxMjE4LCAgIC01NjEsICAtMjU0NiwgIC0zMjc1LAorICAgICAgIDIxOCwgICA4MjgxLCAgICAxODcsICAtNjU1MCwgICAgLTk2LCAgLTEwMDEsICAgMTc3NywgICAgIDg5LAorICAgICAgIDkxNiwgICAxMDQyLCAgICAzOTksICAgLTI2NywgICAgLTk3LCAgLTM1NTIsICAgIDM5NywgICAxOTg0LAorICAgICAtNjEzNCwgICAgNzg0LCAgIDIxMzYsICAtMTM0NiwgICAgNjE5LCAgLTE0NTAsICAtMTAyMiwgIC0xMjI2LAorICAgICAgIDE4NSwgICAgMzA2LCAgIC0yNzQsICAgLTEyMiwgICAgMzQzLCAgICAxMjksICAtNDQ4MSwgICAtNzQ5LAorICAgICAgLTc1OSwgICAtNDk2LCAgIDg3ODUsICAgLTE3OCwgICAgNDU3LCAgIC02MDEsICAgIDg3NSwgICAxMDQwLAorICAgICAgLTI2OCwgIC0xNTkyLCAgIC01MzEsICAgOTY2NywgICAgMzYwLCAgLTQ5NzgsICAgIDUyNSwgICAtNDM2LAorICAgICAgIDEyMywgIC0xNTY2LCAgICAyMjcsICAgIDgyMCwgICAgIDc0LCAgICAgLTUsICAgMTQ3NywgICAgMTU0LAorICAgICAtMTU4OSwgIC05NDExLCAgICAyNDgsICAgLTQ4NSwgIC0zMjkzLCAgIC02OTAsICAgIDE3NSwgICAgIDUzLAorICAgICAgIC0yMSwgICAgMzAzLCAgLTIzNzYsICAgIDEwNiwgICAgNTE1LCAgIDI2ODgsICAgLTQwMSwgIC0xMjc4LAorICAgICAgIDQyNSwgICAgNTQwLCAgIC0zNTMsICAgIDY2MiwgIC03NDYxLCAgIC0zOTcsICAtNzAyOSwgICAtOTc2LAorICAgICAgIDQ0NSwgIC0xNjQ4LCAgICAxNjQsICAgLTI1NCwgICAtNTYzLCAgICA1NTYsICAgIDg3NiwgICAtMjA1LAorICAgICAgIDg4NCwgICAgMjE0LCAgICAtOTIsICAgLTUwOSwgICAgIDk2LCAgICAtNTMsICAgNTczNCwgICAtMjk1LAorICAgICAgLTEzNiwgICAgMjExLCAgICAxNjgsICAgIDI2MSwgICAgLTc0LCAgICA0MTEsICAgICAyNSwgICAgLTU5LAorICAgICAgMzU5NiwgICAgNDAwLCAgICAzMjAsICAgIC02OSwgICAgLTIxLCAgMTQwNjIsICAgLTUxMCwgICAgMTQyLAorICAgICAgLTIzMiwgICAxNTk3LCAgICAgMzQsICAgIDI0MCwgICAtNDc2LCAgICAxMzEsICAtMzgzNiwgICAtMTg2LAorICAgICAgMjU3OSwgICAyODEyLCAgLTE1MDEsICAgIDI3NCwgICAyNjg1LCAgIDI4MDksICAtMTEwMCwgICAyNjk2LAorICAgICAgLTQwMiwgICAgIDY3LCAgICA2NTAsICAtMTgwNCwgICAgLTExLCAgIC0yMTYsICAgNjc1MSwgICAgMTEyLAorICAgICAgIDQ1NSwgIC03MjEwLCAgIC0yNTEsICAtMTA3NSwgICAtODMzLCAgIC05NjYsICAgMTQ0MywgICAtMTM4LAorICAgICAgIDI3MywgICAtNDk0LCAgIDE1NTcsICAgIC0xNSwgICAtMzM5LCAgICAtODIsICAgIDQwMiwgICAgMjA2LAorICAgICAgICAzMSwgICAgLTc3LCAgICAtOTQsICAgICA3OCwgIC01NDY4LCAgIC0xNzksICAgIC00NCwgICAgNDIxLAorICAgICAgIDE2MywgICAtMzg2LCAgIC0xMzMsICAtNjMzNCwgICAgNDI3LCAgICA3NDcsICAgLTEyMSwgICAtMjkyLAorICAgICAgIDM2OCwgIC0xMDg3LCAgIC0zMzgsICAtMTUzNCwgICAzNzQwLCAgIC04ODEsICAtMjAxMiwgIC0xMjg0LAorICAgICAgIDkwMiwgICAgIDk3LCAgLTM0MDcsICAgLTU2NywgICAtMTE4LCAgIDEzNDAsICAgIC03NywgICAtNDQ1LAorICAgICAgIDY0MiwgICAgMTg0LCAgICA5MDEsICAgLTM0MSwgICAgLTgxLCAgICA1OTUsICAtNjUzMSwgICAtMjQ4LAorICAgICAgLTE2NywgICA4NzQwLCAgICAzNzMsICAgIDQwOCwgICAgIDIzLCAgMTA3MDksICAgLTI5OSwgICAtODc2LAorICAgICAgLTU4NCwgIC0xMDY3LCAgICAgMjAsICAtNDU1NiwgICAgMjk1LCAgLTE5NTYsICAgIDk5MCwgICAtMTMyLAorICAgICAgLTE1MiwgICA0MDY4LCAgICAtOTIsICAgIDE0MiwgIC0xNTEyLCAgICAgMjMsICAgLTgxNSwgICAgNDU0LAorICAgICAgIDMzMCwgICAtMzMxLCAgIDkwNDIsICAgIDEyMCwgICAtMTAwLCAgICAgMzQsICAgICA5NiwgICAgMTUyLAorICAgIC0xMTA4MywgICAgMzQ1LCAgIC01NjcsICAgLTQ5OCwgICAgMTk4LCAgICAtMzcsICAgOTI3NiwgICAtNDc5LAorICAgICAgIDYxMSwgIC0yNzg4LCAgICAyNTMsICAgLTE3NiwgICAgNjE3LCAgIC0yMjQsICAgIDI0OCwgICAgMzkwLAorICAgICAgICAzOSwgICAgIDI1LCAgIC0xMTAsICAgIDEyNywgICAgLTEzLCAgIDY2NzUsICAgIC04NCwgICAgMTE1LAorICAgICAgIDI5NCwgICAgIDg0LCAgIC0zNjYsICAgLTQwNSwgICAgLTMyLCAgIC0xMDksIC0xMDQ2OSwgICAgIDk5LAorICAgICAgICAxNywgICAgLTg4LCAgIC0yMjYsICAgIDMxNiwgICAtMTMzLCAgIC0yMDMsICAgIC02MCwgICAgMzExLAorICAgICAgIC04NywgICAtMzMxLCAgICAzNTcsICAgIC0xMSwgICAgMTU4LCAgICAgNzQsICAgIDU2MiwgICAgICA4LAorICAgICAgIDM1NCwgLTEwODQzLCAgIC0xMTQsICAgLTIwNiwgICAgNjk5LCAgIC02MTcsICAgLTE0MSwgICAgODA3LAorICAgICAgICA4NywgICAtMTQ5LCAgICAxNzQsICAgIDE5OSwgICAgLTU1LCAgMTA4ODAsICAgLTMzMiwgICAgMTgyLAorICAgICAgIDU0NCwgICAgNjUxLCAgICAtMjcsICAgIDI2MSwgICAtMTkwLCAgIC02NTUsICAgICAyNCwgICAtNDQzLAorICAgICAgLTYzMCwgICAgMjA0LCAgICAyMDcsICAtNDE3NCwgICAzNTU3LCAgICAgODksICAgLTM4NiwgICAxNzU0LAorICAgICAgLTQ4NSwgICAtMTI3LCAgICAtOTcsICAgICA0MCwgIC0xMzM2LCAgIC00ODgsICAgLTE3NywgICAtNzUwLAorICAgICAgICA4OCwgIC0xMDQwLCAgLTIyMTUsICAgLTUwNywgICAgMTY5LCAgIDI5MDgsICAgICA2OSwgICAgLTUyLAorICAgICAgODQ1OCwgICAgNjAxLCAgICAxNzQsICAgMTYzNSwgICAgNDgwLCAgICAxODEsICAgMzAwNCwgIC0zMDIxLAorICAgICAgMTg2OCwgICAtMzY0LCAgLTIxMDAsICAgLTI1NiwgIC0zMDY1LCAgICAtMzMsICAtNzQ2NywgICAtODkwLAorICAgICAtMTk0OSwgICAgLTIwLCAgLTk0NzIsICAgLTIzMCwgICAtODQ3LCAgIC02MzQsICAgLTM3NywgICAgLTQwLAorICAgICAgMTE4NCwgICAgMjQyLCAgICAyNjUsICAgNzA1NiwgICAgIDQyLCAgICAgMTYsICAtNTA3MCwgICAgLTcxLAorICAgICAgIDMwMCwgIC0xMTg2LCAgICAxODcsICAgIDMzNywgIC0xMzMxLCAgICAgNzcsICAgLTQ3MywgICAzMjEzLAorICAgICAgNTczOCwgICAgNjI2LCAgIDI1MjQsICAgIDUzMSwgICAxMDAxLCAgIC04MDMsICAgMTIzMSwgIC0xMDgzLAorICAgICAgLTU2NCwgICAgNTM5LCAgICAxOTEsICAgLTQ5OCwgICAgMTg0LCAgICA2MDMsICAtMTc3NywgICAtNDc5LAorICAgICAgMjI5OCwgICAtNjA0LCAgLTIwNzcsICAgIDYzNCwgICA0NjgyLCAgLTEzODcsICAgLTg3NSwgICAgNDk4LAorICAgIC0xMDAxMSwgICAtMTczLCAgICA3NTIsICAgIDEwOSwgICAgLTcwLCAgICAxNzEsICAgIC02NCwgICAtMjYxLAorICAgICAgIC03OSwgICAgIDM3LCAgIC0yMzMsICAgIDEyOCwgICAgLTY2LCAgICAtNzAsICAgIDM1NiwgICAtMzEwLAorICAgICAgIDIxNCwgLTE0NzkyLCAgICAgIDYsICAgIDIwMCwgICAtMjI3LCAgICAgNTksICAgLTI0MSwgICAgNTYwLAorICAgICAgLTIzMCwgICAgNDc5LCAgICA0MDMsICAgIC0yMiwgICAgMTQ4LCAgIDc0MjgsICAgIDExMCwgICAtMTc3LAorICAgICAgIDExMCwgICA3NTE4LCAgLTIzNzIsICAtMTI3NywgICAgMjIzLCAgIC03MDgsICAgIDczMSwgICAgNjk1LAorICAgICAgLTcwMiwgIC0yOTA2LCAgICAyNTYsICAtMTE2MCwgICA0OTQxLCAgICAxMjEsICAtMTE0OCwgICAgLTY4LAorICAgICAgLTQyNCwgIC0xNTkwLCAgIDQ2OTcsICAgIDcwNSwgICAgNTI1LCAgICA2ODQsICAgLTQ1MSwgICAtMjQ2LAorICAgICAgLTExNSwgICAgNTU2LCAgICA1NDMsICAtNjY1OCwgICAgMzg0LCAgIC01ODksICAtMTUwNSwgICAgIDEyLAorICAgICAgIDExNCwgICAgIDgyLCAgLTUwODQsICAgIDE2NCwgICAgMTU0LCAgIC0yOTUsICAgIDEwNiwgICAtMjcxLAorICAgICAgIC00MCwgICAtMzk0LCAgIC00MzcsICAgIDM5NywgICAtMjc5LCAgLTM4MjUsICAgLTI4NiwgICAgNjMyLAorICAgICAtMTA0MSwgICAxMTM3LCAgICAtOTMsICAgICA0OCwgICAgMTkyLCAgLTU5MTQsICAgIC05MiwgICAtMjM1LAorICAgICAgIDY4MiwgICA1ODE3LCAgIC03MDIsICAgIDE4MCwgICAtMjQzLCAgIC0yMTksICAgLTkxMCwgICAtMTc0LAorICAgICAgLTE0NiwgICAgMTQyLCAgICAgMTIsICAgIC02OSwgICAtMjA3LCAgIC0yNjksICAgIC01MywgICAgNTY3LAorICAgICAgLTMzNiwgICAgMTE0LCAgIDk2MDEsICAgLTI3MiwgICAtMjcwLCAgICA0NTksICAgIDYxMCwgICAtMjU4LAorICAgICAgICA5NywgLTEwOTUwLCAgICAzOTcsICAgICA1NywgICAgIC03LCAgICAyMjksICAgMTY2OSwgICAtMTczLAorICAgICAgLTE3MywgICAgLTkyLCAgIC0zNDcsICAgLTEzMywgICAtMzU3LCAgICAgOTIsICAgIDEzMiwgICAtNjA5LAorICAgICAgICA2MCwgICAtMTI0LCAgICAxMTYsICAgIC01NCwgLTE1MjA1LCAgICAxNDIsICAgIDEwOSwgICAxMTI3LAorICAgICAgIDI2OCwgICAtMjIwLCAgICAzMzYsICAgLTc0MywgICAtMjM4LCAgICAtMjksICAgLTkwMiwgICAgIDkxLAorICAgICAtMzU5NywgICAtMjg4LCAgIDExMTQsICAtMzc5NywgIC0xNjE1LCAgICAgMzIsICAxMTQ4MSwgICAgIDU1LAorICAgICAgIDE5NCwgICAzNTY3LCAgLTE4NTcsICAtMjU2MSwgICAtMjM3LCAgICAtMTUsICAgIC00OCwgICAtMjMyLAorICAgICAgIC01OCwgICAgLTIxLCAgICAgMzcsICAgLTUzNSwgICAtNDUwLCAgICA4NTcsICAgMjAwMSwgICAgIDEyLAorICAgICAgICA0OCwgICAgODQwLCAgICAyMTEsICAgIDEyNiwgICA0ODMzLCAgICAyNzUsICAgIDE3NiwgICAtMTExLAorICAgICAgICAgOSwgICAtMTEyLCAgIC00MDMsICAgIDE4MiwgICAgMjk2LCAgICAxODEsICAgLTQyNSwgICAgLTE0LAorICAgICAgIDI3NiwgICAgMTE4LCAgIC0yNDAsICAgIDM4NCwgICAgMTM5LCAgIDkxODMsICAgLTIzMCwgICAgMTQzLAorICAgICAgMjQxMiwgICAgLTcwLCAgICAyNTAsICAxMDE5MSwgICAgODA5LCAgICAtMTUsICAgLTI1NywgIC0xMjQyLAorICAgICAgLTE2MywgIC00MjUzLCAgIC0zNTIsICAgLTQzNiwgICAgMjY0LCAgLTQ5OTgsICAgIC0xNywgICAtMjE1LAorICAgICAgMTQxMiwgICAxNTkyLCAgICA4NTYsICAgLTE1OSwgICA0NzU2LCAgLTUwMzIsICAgIDMwNywgICAtMjUxLAorICAgICAgIDE5NCwgICA2NDE0LCAgICAtNTYsICAgICAtNywgICAtNTAzLCAgIC0yNjEsICAgLTY0NiwgIC0xMDUwLAorICAgICAgLTI3MSwgICAtNTc4LCAgIC0yOTEsICAgIDYxNCwgICAgMTMwLCAgIC0zMzYsICAgLTkyMywgICAtMTIwLAorICAgICAgIDE0OSwgIC02MDEyLCAgICAyNzMsICAgLTI5NSwgIC00NTg2LCAgICAxMzcsICAgIDIwNiwgICAxMjQ2LAorICAgICAgIDQ5OCwgICAgNjE0LCAgICA5OTEsICAxMzc3NiwgICAgMTIyLCAgICAgNTIsICAgLTY2MCwgICAgLTc2LAorICAgICAgLTIxMSwgICAtNDc3LCAgIC0yMjQsICAgIDE5NiwgICAgNDExLCAgICAzOTgsICAgLTU5MCwgICAgODIwLAorICAgICAgLTQ0MSwgICAgLTM1LCAgIDQzOTQsICAgNTAxMCwgICAtOTAyLCAgICA1MDksICAgICA0NSwgICAgNzQ3LAorICAgICAgMTAzNSwgICAtNDU1LCAgIC01NzksICAgIDEwNSwgICAxMTAzLCAgIC00OTYsICAtMTI0OSwgICAtMjQ4LAorICAgICAgICA0NiwgIC01NzcxLCAgIC0xOTgsICAgLTM4NiwgICAgNzM2LCAgICAgMTUsICAgLTMzNSwgICAgLTg1LAorICAgICAgLTYyNCwgICAtMTI0LCAgICA1ODAsICAgLTMyNywgICAtMTAyLCAgICAtMTgsICAgIDg2NiwgICAgMzgxLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3Qgc2hhcGUyMltdID0geworICAgICAgMjU2MCwgICAtMTI3LCAgIC0xMzcsICAgLTM4NSwgIC0xODc1LCAgICAgOTAsICAgLTI0MCwgICAgMTQwLAorICAgICAgMTI5MCwgICAgMjAwLCAgLTY3NjIsICAgIDM3NCwgICAxODcxLCAgIDg3MzAsICAgLTExMSwgICAtNTU1LAorICAgICAtMTUyNCwgIC0yMTc1LCAgLTQ2ODksICAgIDUyMSwgICAtMTc5LCAgICAxNjYsICAtMTU3MywgICAxMDU2LAorICAgICAgLTM0NiwgICAgMjQ3LCAgICAtOTIsICAgNTcxMywgICAgNTYxLCAgICAyMzMsICAgLTM2MCwgICAgNDgwLAorICAgICAgLTc0MSwgIC03NTUyLCAgLTE1MDgsICAgIDI1OSwgIC04NzQ2LCAgIDE2MDQsICAgMTM4NSwgICAgNzIzLAorICAgICAgNTY3OCwgICAyMjQzLCAgICA0MDMsICAxMjM3MCwgICAzNTI2LCAgICA1NzQsICAgNDk4MiwgICAgNTYzLAorICAgICAgMTcxMywgIC0xMzM3LCAgIDEzMzYsICAgIC02MCwgICAtODkwLCAgLTIxODQsICAgLTU2MywgICA5MzQ3LAorICAgICAgIDc3NSwgICA2MzE4LCAgIC04ODMsICAgMTQ3NiwgICAtMzM1LCAgICA3MzYsICAgLTU2NCwgICAgNjM1LAorICAgICAtNTU1NywgICAgNjE3LCAgICAgNTQsICAgIDI1NywgICAtMzI1LCAgICAtNjYsICAtNTY4OSwgICAxMDYxLAorICAgICAgLTg5NywgICAgIDkwLCAgIDgzOTQsICAgMjAwNCwgICA5NDU2LCAgIC0yMjIsICAtMjAyNiwgICAtOTY5LAorICAgICAgICA5MywgICAgIC01LCAgIC05MjIsICAtNjQ5MSwgICAxNDk2LCAgLTE1MzcsICAgIDY1MSwgICAtMjc3LAorICAgICAtMTAzOCwgICA2MDcyLCAgLTg1MzQsICAtMjUyNiwgICAxNjQ1LCAgIDE0NTksICAgIDU0NywgICAyMzQ3LAorICAgICAgIC04NSwgICAtNzYxLCAgLTcyMTAsICAgLTE1MywgICAgNDE0LCAgIDYwOTYsICAgIDM4MywgICAgMzIwLAorICAgICAgIDM3MCwgICAtOTAyLCAgICA4MjMsICAgMzA3MSwgICAgNDk5LCAgIC03MzEsICAgICAzOCwgICAgNDczLAorICAgICAgMTY5MywgIC05NDU2LCAgICA5NDYsICAgMTIxOCwgIC0xMDU0LCAgICAgNzAsICAgIDM2NywgICAtNDY5LAorICAgICAtNzg2MSwgICAtOTEzLCAgICA0MDEsICAgIDE5OCwgICAgLTgzLCAgICA4NzcsICAgLTMwOCwgICA4NjMzLAorICAgICAgIDI1MywgIC0yMDI1LCAgIDE5MjUsICAgMTQxMiwgICAxMzUxLCAgIC0zNjAsICAgLTk0OCwgIC03NTI2LAorICAgICAgMTA4OSwgIC03NDQ5LCAgIDE2NTIsICAgIDE0MSwgICAgLTQzLCAgLTIwODIsICAgICA0NCwgICAgMTMwLAorICAgICAtNzUyNSwgLTE1MDQ5LCAgLTEzNDUsICAgIDE4MCwgIC0zMDA5LCAgLTQ1ODEsICAgLTI2NywgICAyMzA5LAorICAgICAtMTM5NywgICAtMTEyLCAgICAtNjMsICAgIDMwNywgICAtNzQ2LCAgICAtMTMsICAgICAzNSwgIC04ODAwLAorICAgICAtMTk0NywgIC0xMTQzLCAgLTEwOTYsICAtMjU4MiwgIC0xMjEwLCAgIDc2ODMsICAgLTc0MywgIC0xNTg5LAorICAgICAgNTY5OSwgICAgLTgwLCAgLTEzNzUsICAgIC05MywgICAtNDgzLCAgICAxMjksICAgNjA3NiwgIC02MDk5LAorICAgICAgIDM3NCwgICAtMTc2LCAgLTExNTAsICAgLTQxNiwgICAgMTM3LCAgLTQzMDksICAtMTkyNiwgICAzMDk5LAorICAgICAgICA4MiwgICAtODM2LCAgICAzOTIsICAgLTY1NSwgICAgMTA4LCAgICA0MjgsICAgMzM2MSwgICAgMzEzLAorICAgICAgIDM2MywgICA3NTM0LCAgIDExNTMsICAgIDMzNCwgICAyMjYyLCAgIC0zNjcsICAgIC02OSwgICAtODEzLAorICAgICAtOTcwMiwgICAzMDc0LCAgLTU0NjEsICAgICAgMCwgIC0xODg5LCAgIDEzMDMsICAtODMwNiwgICAtMTEzLAorICAgICAgLTY3NywgICAgNjkyLCAgLTI3NTIsICAgMTI5MiwgICAtMTcxLCAgICA0MzAsICAgNDYwOSwgIC0yMjM4LAorICAgICAgIDE5NiwgICAxNjYxLCAgICAtMjUsICAgLTE2NCwgIC0yNTkwLCAgLTQ5MTksICAgLTYxNSwgICAgIC03LAorICAgICAgLTc1MywgICA1MTA0LCAgIDUxOTcsICAgIC02NiwgICAtMzEwLCAgICA4MjcsICAgLTEyNiwgICAgNjE1LAorICAgICAgICA3MCwgICAtNDU2LCAgICAyMzgsICAgIDY4MiwgICAtNjM5LCAgIC01NjEsICAgIDM2OSwgICAgMTgzLAorICAgICAgIDExMywgICAgNDMwLCAgIC04NDAsICAgLTc5MiwgIC03MjgyLCAgLTc1MzcsICAgIDYxOSwgICAtNDQ1LAorICAgICAgIDU4OCwgICAgIDE5LCAgLTEwNjEsICAgIDY1MiwgICAgIDQ2LCAgICA4NjEsICAgOTY0MSwgIC0xMjUxLAorICAgICAgIC00MSwgICAtNjk5LCAgIC02MDUsICAtMTM4OSwgICAgMjQwLCAtMTA3OTgsICAgIDczMywgICAgMTk0LAorICAgICAtMTIzMCwgIC0xMDkyLCAgIC01MjAsICAgLTIxOSwgICAgICA3LCAgICA1MTgsICAgLTE4MSwgLTEyMDYyLAorICAgICAgIDY1MSwgICAgLTQwLCAgIDExMjgsICAgLTM5MCwgICAtMjIwLCAgIC00MzgsICAgIDQ3MSwgICAgNTEwLAorICAgICAgIDYzMiwgICAtMzIxLCAgIDEzOTMsICAgODgyNywgIC0zMjQxLCAgLTY2ODMsICAgIDM1MCwgICAxOTUzLAorICAgICAgLTI0NiwgICAtNTgyLCAgLTU0ODYsICAtNzU3NiwgICAtMTU3LCAgICA4ODgsICAgMjk2NSwgICAgLTIzLAorICAgICAgIDc2MiwgICA2ODY3LCAgIDM2OTcsICAgIC00MywgIC03OTA1LCAgIC05MzgsICAgMjExOSwgICAgMzc3LAorICAgICAgIC0yNSwgICAgNjkxLCAgICAxMzYsICAgLTcyNSwgICA3NjQzLCAgIC03MzAsICAgMjAyNCwgIC02OTMyLAorICAgICAgIDgwNCwgICAgIDUzLCAgICAzOTIsICAgIDQ0MCwgICAgMzM2LCAgIDYyMzUsICAtNzAzNywgIC01NTg0LAorICAgICAtMTU3OSwgICAxMTE1LCAgIDE3NTcsICAgMTAwMSwgICAgIDMyLCAgIC0yOTQsICAgLTU5MiwgICAgMzAwLAorICAgICAgLTc2NCwgIC04ODc5LCAgLTE2MTIsICAgLTg0NSwgICAxNzIyLCAgIDY5NjgsICAgIDM4NCwgICAgMjY3LAorICAgICAgIDg2MiwgIDEwODMwLCAgIC0zNjQsICAtMTEzOCwgICAgLTQ5LCAgIDEwNDEsICAgLTkwOCwgLTE0OTYwLAorICAgICAgIDgwOSwgICAgNjI4LCAgLTExNTAsICAtMTM0OCwgICAtNDM3LCAgICA4MDUsICAgIDg3NywgICAgLTY0LAorICAgICAgMTA0MSwgICA1MjUzLCAgIC0yNzAsICAgMjAyMiwgICAxMjUzLCAgIC05OTIsICAxMTAxNSwgICAyNjg2LAorICAgICAgICAxNywgICAgIDgwLCAgLTE0NjMsICAgNDIyOSwgICAgIDgwLCAgIC04MzQsICAtOTI4NiwgICAxMTc5LAorICAgICAgICA2NiwgICAgLTM5LCAgICAtNjQsICAtNDA1NywgICAtNDIzLCAgICAxMTYsICAtMTQ0MSwgIC0xNzMzLAorICAgICAgIDc1MiwgICAxNjc0LCAgIDE0NDMsICAgIDc1NywgIC0zMTQ5LCAgIDkwNTcsICAtMzUyMiwgICA0MDA3LAorICAgICAgLTg5MywgICAxMTc5LCAgIC0zODgsICAgNjM2OCwgICAtNDc4LCAgIDQzOTcsICAxMzg2OCwgIC0yOTk2LAorICAgICAgIDc5MCwgICAgNzA0LCAgLTIyOTksICAtNjAwMywgICAgNDQ5LCAgLTU0MTAsICAgMTk5OSwgICAgMTgxLAorICAgICAtMTgwNywgICAtMzYyLCAgICAtNTcsICAgIDQ1NCwgIC0yMzcxLCAgIDM2NTgsICAgLTQ4NSwgICAtMjEyLAorICAgICAxMTU1MSwgICAxNTM1LCAgICA0NzgsICAtMTU3MCwgICAtMjc4LCAgICA1ODQsICAgIDYwOCwgIC01MjExLAorICAgICAgNjk2NSwgICAxMDQyLCAgIC0xNjgsICAgLTMzNywgIC0xMDcxLCAgICAgNzIsICAgIDQ1MSwgICAtMjA0LAorICAgICAtMTAwMCwgIC0xMDQ0LCAgICA2ODksICAgIDE4NiwgICAtMTY2LCAgIC0zNzUsICAgOTQyNiwgICAgMzYzLAorICAgICAgICA5MywgICAtNzE3LCAgICAzMDQsICAgIDEwNywgICA3ODUzLCAgLTEyNTEsICAgMTA5MywgICAgNjkyLAorICAgICAgLTc0MiwgICAgIDMzLCAgICA1NzYsICAgIDQ0NywgICAgNjc4LCAgICA0NTIsICAgIDQwOCwgIC00ODEzLAorICAgICAgIDcxMSwgICAtNTk1LCAgIC01MTYsICAtMTEwOCwgICAxOTQxLCAgIDMwNTYsICAgLTIxOSwgIC0zNDEzLAorICAgICAxMDk0NiwgICAxNTEzLCAgLTIzNzUsICAgICA0OCwgICAtNDA4LCAgICAgNDksICAgLTM5OSwgIC01NjA4LAorICAgICAgIC01OCwgICAgMTYxLCAgIDQ4MDgsICAgIDQzNiwgICAgIDY4LCAgLTU2NzUsICAgIDIzMCwgICAgODMyLAorICAgICAtMTIyOCwgICA2MzgyLCAgIC01ODgsICAtMTMxMiwgICAgNzcyLCAgIDQzMzcsICAgLTQwNSwgIC01NDY3LAorICAgICAgLTIyMiwgICAxMzgyLCAgIDIxNTgsICAgIDYyMCwgICAtODQwLCAgICA4MTAsICAtMzgzMCwgICAgIDQ4LAorICAgICAgLTEwMSwgICAgNTI5LCAgLTI2NzAsICAgLTI0OSwgICAxMDM1LCAgLTc2MjAsICAtMTA4MSwgIC02NjQ2LAorICAgICAgMTQ2OSwgICAxMDQzLCAgICA3NDMsICAgMTU1MywgICAtNTU2LCAgIC0yNzQsICAgICA2OCwgICAgMjM4LAorICAgICAgMTA3OCwgICAtMTEwLCAgLTUxNjMsICAgIDU2MiwgICAgNzM1LCAgLTgzMTcsICAgMTIwMiwgIC0xMzI1LAorICAgICAgLTk2MiwgICAgIDYxLCAgIDQyODAsICAgIDU3MCwgICA3NDUwLCAgICAyNjUsICAtMTUxNiwgICAgNjk2LAorICAgICAtMTU2NywgICAtNjgxLCAgICAgIDAsICAtNDA2NCwgICAxNTQ4LCAgLTI1MjEsICAgIDY1NywgICAgNTY3LAorICAgICAtODM0MywgICAxNjkxLCAgLTE0MzAsICAgNDgyNywgICAgODA3LCAgICA5MDUsICAtMjYwMSwgIC03NDE1LAorICAgICAgIDkyMSwgIC0xNzQxLCAgICAzNjMsICAgIDMwOSwgICAgMjExLCAgIC01MjEsICAgMzAxMywgICAtNzk3LAorICAgICAgIDY0OCwgIC0zNzA5LCAgICA5NjEsICAgIDY2MiwgICAgNDAzLCAgIC0zODYsICAgLTcxOSwgIC01NzUyLAorICAgICAgMTM1NSwgICA2NzE3LCAgICAxOTEsICAgIDU5MSwgICAtMzcxLCAgLTEyMjUsICAtNTEyNSwgICAgODAwLAorICAgICAgLTI1MiwgIC01NzY5LCAgIDExMDEsICAgIDY1NywgICAtMTQxLCAgIDIzNzcsICAtMTM2NSwgICAtMjE4LAorICAgICAgLTExNCwgICAgMTQ4LCAgICAyNzYsICAgIDM1OCwgICAtMzU0LCAgICAgMTgsICAgIC0zMSwgIC05NDEzLAorICAgICAtNTUxNCwgIC0xNDU4LCAgIC0yMjAsICAgIDI5OCwgICAgNjY2LCAgICA2NTksICAgIDM1OSwgICAgOTgwLAorICAgICAtMTM4OSwgICAgMTAxLCAgIDE1MDAsICAgNDY2MSwgICAgNDcyLCAgICAyNjQsICAtNzU5MCwgIC0xNDY5LAorICAgICAgICA0MSwgICAgIDM4LCAgIC0yNTksICAgLTM0NiwgICAtNDg2LCAgLTk5NDksICAgIDgxMiwgICAgNDIyLAorICAgICAtMTM1NCwgIC0yNDYxLCAgLTIwNTcsICAgLTI1MywgICAxODA2LCAgIC0xMDcsICAgIC00MSwgIDE2Mzg0LAorICAgICAgLTE0MCwgICAtNjg0LCAgIDU0MjEsICAgMTkwNywgICAgLTEwLCAgIC04ODksICAtMTg3NywgIC02ODE1LAorICAgICAgLTgxOCwgIC01ODU0LCAgLTMxOTYsICAgLTg5NSwgIC0xNzA2LCAgIC0xODYsICAgNzk0NCwgICAgMTAwLAorICAgIC0xMTI2MCwgIC00NTczLCAgIC00MTUsICAgNDY4NSwgICAgMzk1LCAgLTYwMzUsICAgNTc4OSwgIC00NTY2LAorICAgICAgIDYyNCwgIC0yMTQ2LCAgICA1NzAsICAgIDEzMCwgICAtODkyLCAgIDEzODUsICAgLTI2MiwgICA2NjM4LAorICAgICAtMjMyNCwgICAgMzQ4LCAgIC0yODgsICAgIDYwNywgIC0xNTc0LCAgIDcxMTksICAtMTAzNywgICAgLTQwLAorICAgICAtNDk1NSwgICAtOTQ2LCAgLTUyMTUsICAtMTAxMywgIC0xMjMyLCAgIC04NzUsICAgIC03OCwgICAtMzk5LAorICAgICAgIDIzMSwgICAtMTczLCAgLTU4NjAsICAgIDE4OSwgICAtNzU1LCAgLTgyNjUsICAgIDc0NSwgICAgOTY2LAorICAgICAgIDIwMiwgIC0xODU4LCAgICAtMjYsICAgLTY1OCwgICAgIDU1LCAgIDExMzEsICAgIC01NiwgICAzMDMwLAorICAgICAgIDE1OCwgICAzNzQyLCAgLTEyNjEsICAgIDMxNywgICA2Mzk3LCAgICA1MjEsICAgLTUwOCwgICAtNTIyLAorICAgICAtMjA0MCwgICAtNzQ3LCAgLTY5MDYsICAgLTg2OCwgICAtMTEwLCAgIC03MTksICAgMjYwMiwgICAyNTcwLAorICAgICAtMTEwNiwgICAtNzg3LCAgIC0zNTIsICAgOTIxMiwgICAtNTQ1LCAgIDczMzksIC0xMDE4MywgICAtNzI2LAorICAgICAgMTEwNCwgIC0xMTE4LCAgLTE2NTUsICAgIDM4MywgICAxMzcwLCAgIDE0MTIsICAgIDUyOCwgIC00Njg5LAorICAgICAgLTM5OCwgIC0zODAyLCAgIC02ODIsIC0xMTAwNCwgIC0yMzEwLCAgIDgwMTEsICAgMjMwMSwgIC01OTQxLAorICAgICAgLTUxMiwgICAzODEzLCAgICAyMTAsICAgMTM3OSwgLTE1MjA5LCAgIDExNDMsICAtMjM0NCwgICAyNDU5LAorICAgICAgMjM2OCwgIC02NDg0LCAgLTIwNzgsICAgLTI0NiwgICAgMzgzLCAgIC0yMDQsICAgMTQ0OSwgICAtNDUzLAorICAgICAtMTUzOSwgICAgNDE2LCAgICA1MDgsICAtNzE2OCwgIC0xOTMwLCAgIDQyNzksICAgIDQ1MywgICAtMjE1LAorICAgICAgLTI5NiwgICAtMzQ2LCAgIDU2OTEsICAgLTIwMCwgICAtODU1LCAgICA1NTIsICAgNTkyMSwgICAtMTA5LAorICAgICAgIDU4OCwgIC0zMDQ5LCAgIDEzMTIsICAgNjc2NywgICAgLTc4LCAgLTcyMDQsICAgMTE4NywgICAtNzU0LAorICAgICAtMTA0MywgICAtNDU1LCAgICA0MTIsICAgLTQ5MCwgICAzMTI0LCAgIC0yNzMsICAgMTQ2OCwgICAtNTQ2LAorICAgICAgIDU1MiwgICAtMzA2LCAgICA4MzUsICAgLTI2MywgIC03MjM0LCAgICAzMjQsICAgIDMxOCwgIC0xMjI0LAorICAgICAgIDI0MCwgICAgMTk4LCAgICAxOTMsICAgLTU1MCwgICAtNjg0LCAtMTI0MTYsICAgICA4NSwgIC0xNDY5LAorICAgICAgLTQ2MywgICAtMzAxLCAgICAxODAsICAgIDI5MCwgICAtOTI4LCAgLTYzOTksICAgLTkzMSwgICAgMTc2LAorICAgICAgIDMxMCwgICAtNjkyLCAgIDc5NjQsICAgLTIwNCwgICAgNTEyLCAgICA5NzUsICAtNjQxNSwgICAtMzk0LAorICAgICAgIC0zMCwgICAtMTIwLCAgIDE2MzgsICAtMTQ3NCwgICAtMzgxLCAgIDU5MTIsICAgIDE1NiwgICAtODMwLAorICAgICAgLTU3NSwgICAtMjI1LCAgLTQwNzksICAgLTc4NywgICAtOTU3LCAgIC04MDEsICAgIDE4MSwgICAgNTc1LAorICAgICAgMTExNiwgICAtNzk1LCAgIC03NDMsICAgLTk4MSwgICAgNDM0LCAgIC0zNjUsICAtOTc4MCwgIC0xODE0LAorICAgICAgMTQ0NywgICAxMDgxLCAgICAxNTMsICAgIDg4NCwgICA4Njk3LCAgICAyNTksICAgIDg4MSwgICAtNjYxLAorICAgICAtMTIzMiwgICAtNTQ3LCAgICA0NjQsICAgIDg5OCwgIC0zOTg4LCAgIC00NzYsICAgIDc5MCwgICA3NTg5LAorICAgICAgLTUyNSwgICAtODA5LCAgLTI5MDAsICAtMTI3MSwgICAgMTcwLCAgICAyMjMsICAtNTA1MCwgIC0yNTU0LAorICAgICAgMTQ1OCwgICAtNjY2LCAgICA1MzcsICAtNjczMywgICAgMjEyLCAgICA0NDgsICAtMTU1NiwgICAxNDU5LAorICAgICAgIDgwMiwgIC0yNzE2LCAgLTg3ODUsICAxMTAyMCwgICAtMjU4LCAgIDEyMjksICAgMTEzOCwgICAgODQzLAorICAgICAgIDUwOCwgICAgMTAzLCAgIC02NTcsICAgMTI3MywgICA4MTQwLCAgICAzNjgsICAgLTYwNSwgICA2ODU2LAorICAgICAgIDExMCwgICAtNDIzLCAgIDU0NTgsICAgLTQxNywgICAgOTkzLCAgICAyNTcsICAgNTU1MiwgICAgLTQ3LAorICAgICAgMTQwMSwgICAtMTE5LCAgLTEzMjAsICAgNjE5MywgIC0xMTk2LCAgICAgNTYsICAgIC05MywgIC0xNjA0LAorICAgICAtMTQ5MSwgICAtODk3LCAgICAyMzgsICAgIDgyMywgICA0MjEzLCAgICAxMDQsICAgIDE0NSwgIC0xMDQ5LAorICAgICAtOTI4NiwgICAgLTI2LCAgIC04MTMsICAgLTEzOSwgICAgNDk5LCAtMTAzNTEsICAgLTQ2NiwgICAtNTE1LAorICAgICAtMTE2NiwgICAtNDEyLCAgIC03NDYsICAgIDUwMywgICAxODcyLCAgICAgMTcsIC0xMTk0MSwgIC0zMzUwLAorICAgICAgLTEwOCwgIC03Mjk2LCAgIC00MTEsICAgNDgxMSwgIC0xODcwLCAgICAxNjIsICAgNTU5NSwgICAtNjU4LAorICAgICAgIDMzOSwgICAtOTA0LCAgIDY5MTEsICAgLTcxNSwgICAtMjQwLCAgICAtNzEsICAgIDM3NywgICA0NzQ3LAorICAgICAgIC01NywgIC04OTIwLCAgICA1MjEsICAgIDc1MywgICAtMzc1LCAgLTExODUsICAgMTMyMiwgICAtMzI4LAorICAgICAgICAgNSwgICAgNTI1LCAgIC02MTAsICAgIDEyNywgICAxNTE5LCAgICA3OTEsICAgIDc4NCwgLTE2Mzg0LAorICAgICAgIDExNiwgIC0xMDA3LCAgIC0zNTIsICAgIDQ4NiwgIC03ODcxLCAgICAyMDIsICAtMzY4NCwgICAtMzg3LAorICAgICAgIDY3NiwgIC04OTQyLCAgIC03MTMsICAgLTQ0NywgICAtNTU3LCAgIDExNTksICAgIDk3NCwgICAtMzgwLAorICAgICAtMTE4MywgICAxMDQ5LCAgICAgLTksICAgIDgzOCwgICAtOTMyLCAgIC0xMzksICAgIDM3MSwgICAxNjg4LAorICAgICAtNzYxNywgICAxMTkyLCAgIDIzNTAsICAgLTIyMCwgIC00NTU4LCAgIDI2ODEsICAgMTU2OCwgICAgMTAyLAorICAgICAgMTI3NCwgICAtNDQ2LCAgIC0zNTEsICAgMTU1MSwgICAxMTAxLCAgLTg5OTUsICAtNTI3NiwgIC00NDE2LAorICAgICAgMzQxMSwgICAgMjIxLCAgIC00MjksICAgIDQxMiwgICAxNjI1LCAgLTQ1NzUsICAgIDI1NCwgICAtNjMxLAorICAgICAgIDMxMCwgICAtMzc4LCAgIDk3NDMsICAgIDg1OSwgICAgOTM0LCAgICAxNDIsICAtMTQwMCwgIC02OTIxLAorICAgICAgNjQ2NiwgIC00MDY4LCAgIDI2NjQsICAgIDQxOCwgICAgIDcwLCAgICAyODQsICAgLTkwMywgICAgLTIzLAorICAgICAgLTUwMiwgICA0MzU0LCAgLTU5OTMsICAgIDEyNSwgICAgLTM0LCAgLTEyNDYsICAtMTk0NiwgICAtMjA0LAorICAgICAgMTAwMiwgIC03NDU0LCAgICAtODgsICAtODYyOCwgICAyNDQ5LCAgMTM3MTUsICAgIDMxOCwgIC04NzU5LAorICAgICAgIDI5NCwgIC0yMjEyLCAgICAxMzgsICAgLTc2MSwgICAgMjg1LCAgLTE2ODYsICAgIDI5MSwgICAgNjA2LAorICAgICAgIDE4MCwgICAgNzYxLCAgIC0zNTksICAtMTQ2NywgICAgMjk5LCAgIC00MTcsICAgLTM2MSwgICAtODk1LAorICAgICAtNTY5MiwgICAgMTI3LCAgIC05NTEsICAgIDE2NSwgICAgICAxLCAgICAzOTYsICAgLTgxOSwgIC01NTA4LAorICAgICAgIDI4MCwgICAgNzYwLCAgIC00MTEsICAtMTAyNSwgICAtNjQ5LCAgLTE2ODgsICAtNjI5MCwgICAgMjcyLAorICAgICAgIC0xNywgIC03NTk1LCAgICAgIDksICAgIDMwNywgICAgMTI4LCAgLTM5OTUsICAgLTExOSwgICAgNDgxLAorICAgICAtMzEwMCwgICAtMjU1LCAgICA2NTEsICAgIDEzOSwgIC0zNDkyLCAgICAgLTYsICAtNDQ3MSwgICAgNDUyLAorICAgICAgIC03MSwgICAgMTM5LCAgIDEyNTUsICAtNjEyOCwgICAxMTkxLCAgICAzMjYsICAgICAyOCwgICAtMjM4LAorICAgICAgMTM3NCwgICAtMzM0LCAgIC00NTcsICAgLTgzNiwgLTEwMzkwLCAgICAxODUsICAgLTYxNiwgICAzMzY2LAorICAgICAgIC0zOSwgICAgMTgzLCAgICAtMjEsICAgNjI0MCwgICAxMTQxLCAgICAzNDEsICAgLTM0OCwgICAgNzM4LAorICAgICAgIDEyMSwgICAgLTY1LCAgIC0zODYsICAgIC0yNywgICAtNTQ4LCAgICAzMzcsICAgICAtNCwgICAtMTI2LAorICAgICAgIDU3MSwgICAyMjYzLCAgIDQ5MzYsICAtMTA5MywgICAtMzk3LCAgICA5NjEsICAtNTg4NiwgICAtNzM0LAorICAgICAgMTUwOSwgICAtNjYwLCAgICAtNjEsICAgIDE3MCwgICAtNzgzLCAgLTQxOTcsICAtMTQ1OSwgICAgOTA2LAorICAgICAgIC0zMSwgICAgNDAwLCAgIC00ODEsICAgIDU2MSwgICAgICA2LCAgICA0ODksICAtNTM5NywgIC0xNjY2LAorICAgICAgICA0MSwgICAtNTM2LCAgIC0xMTYsICAgNjcxMywgICAxMjg4LCAgIC0xNTcsICAgLTExNiwgICA0MjU2LAorICAgICAgMTg5NSwgICA2NjcxLCAgIDE4MzcsICAgLTU0NCwgICAxMjc2LCAgIDIwMzEsICAgIDM0NSwgICA2NDcxLAorICAgICAgIC04NCwgICAxODY4LCAgLTIwMDYsICAtMTMwNCwgIC03NzkyLCAgICA3MDIsICAtMTE4OSwgICAgMTA1LAorICAgICAtNDg2OSwgICAtMjgyLCAgIC03OTAsICAgNzA4MywgICAtNjI4LCAgLTEyNzMsICAgIDI1MiwgICAtMTc5LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3Qgc2hhcGUyMnNbXSA9IHsKKyAgICAgICA0OTMsICAgICAtMiwgICAtMzEwLCAgIC0xMDksICAtMTIxOCwgICAtMTkzLCAgIC0yNjcsICAgIC0xMSwKKyAgICAgIC00NjYsICAgIC0zNCwgIC0yNDkyLCAgICAyODcsICAgIDI0MSwgICAzNjIxLCAgIC01MzcsICAgIDQ1OCwKKyAgICAgICA4NjksICAgLTkxNSwgICAtMjkwLCAgICA3ODIsICAgICA2NSwgICAgLTkwLCAgIC02MzUsICAgMTgzNiwKKyAgICAgICAgODAsICAgIDUxOSwgICAgODY4LCAgIDEzNTksICAgIDU1MCwgICAgLTkyLCAgIC03MDQsICAgIDExMCwKKyAgICAgIC0yMTAsICAtNDMzNywgICAtMzc2LCAgIC0yMDAsICAtMjY5MywgICAgICA2LCAgICAzODEsICAgIDY4OCwKKyAgICAgICA1NTYsICAgIDg4MywgICAgLTg4LCAgIDE2OTgsICAgMTA4MSwgICAgMTMzLCAgIDExMzAsICAgIC03OCwKKyAgICAgICA4NTMsICAgLTQyNCwgICAgLTM5LCAgIC05MDksICAtMTU3OSwgIC0yNzc0LCAgIC0zNzIsICAgMzYwNCwKKyAgICAgIC01MTksICAgMzc3NywgICAgLTY2LCAgIDEzMzAsICAtMTA1NSwgICAxMTM1LCAgIC05OTUsICAgIDIyMCwKKyAgICAgLTMxMjQsICAgIDEyMiwgICAgIDgzLCAgIDEwNDUsICAgLTcwMSwgICAtMTIwLCAgLTY4MDAsICAgLTI2OSwKKyAgICAgICAxOTUsICAgMTE5NywgICA1NTAwLCAgIC00OTAsICAgNTQ1MywgICAtMjAxLCAgICA0MTEsICAgIDgyMywKKyAgICAgIC0xNDYsICAgICA0NiwgICAgMjUyLCAgLTI3MjQsICAgIDYwNiwgICAtOTI0LCAgLTE1MzgsICAgIDM5NCwKKyAgICAgIC00MjAsICAgNjQwNSwgIC01NjMyLCAgIC05NDEsICAgLTQwMiwgICAtMTM3LCAgICA5ODQsICAgIC0yNCwKKyAgICAgICA1OTQsICAgIC00MCwgICAtMTQwLCAgICAtMjAsICAgIDIwNCwgICAxMjExLCAgICAyOTAsICAgLTY4MCwKKyAgICAgICAxMDMsICAgLTQzNCwgICAtMjk0LCAgIDE2NDYsICAgLTE1OSwgIC0yMjk2LCAgIC0yMzcsICAgIDUwNywKKyAgICAgICAtNjcsICAtODk5OSwgICAgLTk3LCAgICA0MDMsICAtMTQ3MywgICAtMTExLCAgICAgMjIsICAgLTI1NywKKyAgICAgLTIyMDMsICAgLTYwMCwgICAgNTc3LCAgIC0xMTcsICAgICA0OCwgICAyMjE2LCAgIC0xNzAsICAgMTE5MiwKKyAgICAgICA3MDAsICAgLTQ3NywgICAxNjc4LCAgICA5NzksICAgMjM5NSwgICAgLTY5LCAgLTE3NDYsICAtMjEzOSwKKyAgICAgIC0yOTQsICAtNDIxMCwgICAgMTgxLCAgIC0zNzIsICAgIDMyMCwgICAtMTgwLCAgIC01MDMsICAgLTU1MCwKKyAgICAgLTM5OTQsICAtNjMxNSwgICAgNTAyLCAgIC04MDQsICAgLTQzMiwgICAtMTEyLCAgIC00NTcsICAtMTAxNiwKKyAgICAgICA2MzcsICAgIDI5NywgICAgOTMyLCAgICA1MzMsICAgIDc5OCwgICAgMjI5LCAgLTEwMDEsICAtMjc4MCwKKyAgICAgLTQwMDksICAgMTE3NiwgICAgMTg5LCAgLTE1NzUsICAgICAyMSwgICAzNTEyLCAgIC0zNDgsICAtMTQ1MCwKKyAgICAgIDI0ODgsICAgIDQ2MywgICAgNjExLCAgICAtNDYsICAgICA4NSwgICAgIDk0LCAgIDMzMTksICAtMzA0MSwKKyAgICAgIC0zNjIsICAgLTI2MSwgIC0xNTM0LCAgLTE5MDAsICAgICAgNywgICAtNTE5LCAgICAtNTIsICAgMTE2NiwKKyAgICAgIC0xNzQsICAgLTE1MiwgICAtMTg5LCAgIC00MTUsICAgIDY0MSwgICAgIDI3LCAgIDE3NjQsICAgIDI4MCwKKyAgICAgIC0zMDEsICAgMjk3NiwgICAgMTQ2LCAgIC02MzIsICAgNDAyMiwgIC0xOTk0LCAgICAtODQsICAgIC02MSwKKyAgICAgLTE2MzMsICAgIDI4NSwgICAtNDM5LCAgICA3ODEsICAgLTU5MiwgICAgMzk5LCAgLTQ3OTQsICAgIDIwMywKKyAgICAgIC0yOTUsICAgICAzMiwgIC0xNDIzLCAgICAyMTYsICAtMjc3MywgICAgIC05LCAgIDM1ODksICAtMzk1MiwKKyAgICAgIC0xOTUsICAgIDE2MSwgICAtMjIzLCAgLTIyNDAsICAtMTg4NiwgIC0yNjQzLCAgICA5NzgsICAgIDExMywKKyAgICAgLTEwMTksICAgMTY0NSwgICAxNDkzLCAgIC04NTEsICAgMTQxNywgICAgLTc0LCAgICA3MTcsICAgIDQxMSwKKyAgICAgICA4ODcsICAtMTM4NCwgICAgIDczLCAgICAxMTcsICAgIC02NSwgICAgIC03LCAgICAxMzMsICAgICAxOCwKKyAgICAgICAgNjksICAgICAxMSwgICAgLTk4LCAgICAgNDUsICAtMTc1MSwgIC0yNzEwLCAgICAgMTEsICAgLTE0MCwKKyAgICAgICAgMjksICAgIDE4NSwgICAgMzI3LCAgICA3MDUsICAgICA1NiwgICAgMTUyLCAgIDgyMDIsICAgLTExNywKKyAgICAgICAxNTcsICAgLTQ3OCwgICAgIDM2LCAgIC01NjQsICAgIDk5NiwgIC05MzU5LCAgIC03MDcsICAgIDY3NCwKKyAgICAgIDExNjksICAgIDI3MCwgICAgMTU2LCAgIC02NzksICAgICAxNSwgICAgNzIwLCAgICAtMzgsICAtNDk1MiwKKyAgICAgIC0xOTYsICAgIDE4MywgICAtMzU2LCAgLTEwMDQsICAgIDE4NSwgICAtMTQ4LCAgICAtNjEsICAgIDE1MSwKKyAgICAgIC0yMjksICAgLTE2MSwgICAgIDIzLCAgIDQzNTAsICAgLTY1MCwgIC00Mzg0LCAgICAtMjEsICAgIDkwOSwKKyAgICAgICAxMDUsICAgLTI3MSwgIC0yNTM4LCAgLTQwMTgsICAtMTI2OCwgICAgMzUxLCAgICAzOTYsICAgLTE5MCwKKyAgICAgIC0xMzUsICAgIDk3MCwgICAzMTU5LCAgIC05MzUsICAtNjk2OCwgICAtMTMxLCAgLTEwMzEsICAgICA1MywKKyAgICAgIC00MzAsICAgIDI0MiwgICAtMjE5LCAgICAzODQsICAgMjgzMiwgICAtMTUxLCAgICAxNTIsICAtNjg5MSwKKyAgICAgIDE0NDQsICAgIC02MywgICAgLTQ2LCAgICAgNzIsICAgIDY1MywgICAzOTU1LCAgLTQxODcsICAgLTMyMSwKKyAgICAgIC0yOTgsICAgIDY3OCwgICAtNDcxLCAgICA2NjQsICAgIC00MiwgICAgLTMwLCAgICA4MjUsICAgIDE5NSwKKyAgICAgLTExNDcsICAtMjcyOCwgICAtMTc4LCAgLTIzMDUsICAgIDY4MCwgICAxOTgwLCAgIC0xNDcsICAgIDMyMCwKKyAgICAgIC0zNDgsICAgNDMwNywgICAgODA2LCAgIC0yNjMsICAgIC02MCwgICAtMTAyLCAgICAgIDgsIC0xMDA4NSwKKyAgICAgICA2MjYsICAgLTEzMCwgICAgMjY3LCAgIC02MjEsICAgICA0NSwgICAtMTU3LCAgICA0MzgsICAgIDE5MCwKKyAgICAgICAgNzgsICAgMTYwOCwgICAtMjQ2LCAgIC0zODYsICAgIDI1NiwgICAtMjU1LCAgIDU2NTEsICAgLTQ0OSwKKyAgICAgICAtMTMsICAgIDE5OCwgIC0zMTkzLCAgICAzMjksICAgLTUwMCwgIC0xMzY4LCAgLTY2NDcsICAgIDYwOSwKKyAgICAgIC01MDcsICAgIC05NiwgICAgMjIyLCAgLTExOTYsICAgIDE3MSwgICAgLTEyLCAgIC0yOTksICAtMTQyMywKKyAgICAgICA0NDIsICAgICA0NywgICAgIC01LCAgIC0yODIsICAgIC0xOCwgICA0OTY5LCAgLTE3NjQsICAgIDIzMSwKKyAgICAgIC00NzEsICAgNTA0NCwgICAgNDEyLCAgIDE0OTYsICAgLTE0NiwgICAgIDM1LCAgIDUwODMsICAgLTIyOCwKKyAgICAgICAzNTUsICAgLTQ4MiwgIC0xMDYzLCAgIDEyNjUsICAgICA4MCwgIC0xMjc4LCAgIDEyMjUsICAgIDgyNiwKKyAgICAgLTE5MTQsICAgIDc3OSwgICAgNDM5LCAgIC01MTEsICAtNDE3NywgICAgNDI1LCAgICAtMzgsICAgIC01NSwKKyAgICAgIDk3ODYsICAgMTAwNSwgICAtNTM4LCAgIC02NjQsICAgLTY0MSwgICAgNjM4LCAgICAxMjUsICAtMjgxMSwKKyAgICAgIDIzMDgsICAgICAyOCwgIC0xMTU3LCAgIC0yMjksICAgLTYyNCwgICAgIDQ1LCAgICAzNTQsICAgLTM2OCwKKyAgICAgLTE2NjEsICAgICA5MCwgICAgNzc4LCAgIC0zMjgsICAgIDI3MiwgICAtMjIzLCAgIDk1NTgsICAgIDgyMiwKKyAgICAgIC0xNjcsICAgIC0xMiwgIC0xMDIwLCAgIDI5NjIsICAgMjM3MiwgICAtOTMyLCAgIDE5NjEsICAgMTM5OCwKKyAgICAgIDI2NjAsICAgICAgMywgICAgMjM1LCAgICA0MjEsICAgIDExNCwgICAtMjgzLCAgICAzNzEsICAtMTY1MiwKKyAgICAgICAzMjksICAgLTQzNSwgICAtMTEzLCAgLTEyOTYsICAgLTUwMSwgICAtNjg2LCAgICAyOTcsICAgLTM4NCwKKyAgICAgMTAzMjgsICAgIDQ3MiwgICAgNjE0LCAgICAxMzksICAgLTc2NSwgICAtMzA5LCAgICAxODAsICAtMjAwOSwKKyAgICAgIC0xNzEsICAgLTE3NSwgICAzNTcxLCAgICAxNDYsICAgICA0NiwgIC0xMzU2LCAgIC0xMzQsICAgIC0xNSwKKyAgICAgIC0xNjYsICAgMjA0NiwgICAgMTA4LCAgICAxMTksICAgLTI4MSwgICAgOTcxLCAgIC00NzEsICAtMTEzNCwKKyAgICAgICAgMzQsICAgLTEwNCwgICAgMjE5LCAgICA3NDYsICAgLTIyMywgICAgMjQ1LCAgIC0xODEsICAgICAxMiwKKyAgICAgIC0xNjUsICAgIDIxNiwgICAtNzkyLCAgICAgODYsICAgIDU2MiwgIC0xODA3LCAgIC0xMTYsICAtMTMyNCwKKyAgICAgICA1OTAsICAgLTMyMCwgICAgLTgwLCAgIDE4NjMsICAgLTQyMCwgIC0xMDY2LCAgIC02OTgsICAtMjg3OSwKKyAgICAgICAgLTYsICAgIDE4MiwgIC0yMzI1LCAgICA1NzUsICAgICA5NywgIC0yNjE2LCAgIDI5MzgsICAgLTY3MywKKyAgICAgIC02OTMsICAgLTExNiwgICAxOTA1LCAgIC00MzAsICAgNDczOSwgICAgLTEyLCAgLTMzMDcsICAgIDY5MywKKyAgICAgIC0yMjcsICAgIDIyMywgICAtMTExLCAgLTE0OTgsICAgICAgNSwgICAxNzUxLCAgICAtMzYsICAgIDIzNCwKKyAgICAgLTQ1ODQsICAgIDgzOCwgICAtMzcwLCAgIC0yOTYsICAgLTgxOCwgICAgMzM3LCAgICAtNDYsICAtODkyMSwKKyAgICAgICA4NzUsICAgLTQyMywgICAgNDk2LCAgLTExOTYsICAgIC0yNCwgIC0xMDE0LCAgICA5NjksICAgIDI5NCwKKyAgICAgICAyMzcsICAtMTczMywgICAgIDI3LCAgIDI1NDMsICAgMTQ5NCwgICAgMTkwLCAgICA0NTcsICAtMTM5MSwKKyAgICAgIDEyMDksICAgNTY1MSwgICAgNTQ4LCAgICA1MDQsICAgIDY4NiwgIC0yODg5LCAgIC0xNTEsICAgIDcyNSwKKyAgICAgICA0ODYsICAtMzcxNiwgICAtMjg1LCAgICA4MzAsICAgICAzMSwgICA1MTMyLCAgICA3NzAsICAgIC0yNCwKKyAgICAgIC00ODIsICAgLTM2OSwgICAtMTI2LCAgLTE1NTIsICAgLTM0NywgICAtMjcyLCAgIC0zODcsICAtOTQ4NSwKKyAgICAgLTE1NDcsICAtMTE4OSwgICAgMzY5LCAgICA4MTIsICAgIDMxMSwgICAgNTM2LCAgICAzOTEsICAgIDM2MSwKKyAgICAgLTE3MDgsICAgLTI4OCwgICAgLTk0LCAgIDIwNTMsICAgIDU1NywgICAtNjExLCAgLTQ1NTEsICAtMjM2OCwKKyAgICAgICAxNzMsICAgIDQ3MiwgICAgMTYwLCAgLTE4NDksICAgICA5NiwgIC03NTY5LCAgICAxODMsICAgIDQ4NCwKKyAgICAgIC0zOTMsICAgLTM0NiwgICAtMzA5LCAgICAtMTMsICAgICAtNywgICAgICAyLCAgIC0yMzksICAxMDM5NSwKKyAgICAgIC01ODcsICAgLTExNSwgICAxMjgyLCAgIC02MzQsICAgICA4MSwgICAgIDkwLCAgIC03MjUsICAtMjY4NSwKKyAgICAgLTEyMTQsICAtNDQ1NSwgIC0xODk3LCAgLTI5MDMsICAgLTgyNywgICAgMTI0LCAgIDIyMTUsICAgIDY5NiwKKyAgICAgLTEyMjUsICAtMTM1MywgICAtMzcxLCAgICAzNDMsICAgIDQyMSwgICAtNjQwLCAgIDE0ODAsICAtMTE3NCwKKyAgICAgICAgNzYsICAgLTgzNSwgICAtNzE2LCAgIC02MjUsICAgLTU0NywgICAxMjUwLCAgLTI2OTYsICAgMjEzMiwKKyAgICAgIC01NDgsICAgIDQzOSwgICAtNjA3LCAgICA0MDgsICAgLTIyMSwgICA1MDI2LCAgICAzNTIsICAgLTM0NCwKKyAgICAgLTEzMzksICAgLTYwMiwgIC0xNjUwLCAgIC00MDQsICAgLTQ1OCwgICAtNTAyLCAgICAgNjEsICAgLTE2NCwKKyAgICAgICAgNTMsICAgIC0yNiwgIC0yNjUyLCAgIC0yMDksICAgICA2NCwgIC00MDY4LCAgICA3MTMsICAgIDE5MywKKyAgICAgIC0xMTcsICAtMTI5MCwgICAgIDk1LCAgICAtODYsICAgLTUxNSwgICAxMzM2LCAgIC00OTIsICAgMTY1NCwKKyAgICAgLTI5NjMsICAgMzY2MywgIC00MjMxLCAgICAgLTEsICAgMzAxNywgICAgMzcxLCAgICAyNzYsICAgICAtNywKKyAgICAgIC0yODksICAgIC0zMywgIC01OTQyLCAgICAyMzcsICAgICAzMCwgICAgNTg2LCAgIC0yNjQsICAgLTQ5MywKKyAgICAgICA0MzUsICAgLTM4OCwgICAtMTY1LCAgMTA0MzQsICAgIDE5MiwgICAzODk3LCAgLTU0MTQsICAgIDM2MSwKKyAgICAgICA4NDUsICAgLTI1OSwgICAgNDgxLCAgICAzMzEsICAgIDY1MCwgICAtMjMyLCAgICAgMjMsICAtMTc4OSwKKyAgICAgICAgMjcsICAtNDA2NSwgICAxMDIwLCAgLTQyNjEsICAgLTY1MSwgICAzMTc0LCAgICA5NTEsICAtMzM2MywKKyAgICAgICA1NzcsICAgLTExMiwgICAgNjQyLCAgLTExNzcsICAtMTcwNywgICAgNDkyLCAgIC0yNTAsICAtMTIzNiwKKyAgICAgICAgMjQsICAtMTM5NCwgIC0xODA3LCAgIC04NTMsICAgMTY4MSwgICAgLTY5LCAgICA4NTEsICAgLTk1OSwKKyAgICAgLTU3NTksICAgLTIwMiwgICAgIDMwLCAgLTM0NjYsICAgLTU5MywgICA1NDE0LCAgICAgNjUsICAgIDE0MSwKKyAgICAgIC0zMTksICAgIDY3NCwgICAxMTgzLCAgIC0xNTUsICAgLTMxMiwgICAgMzcyLCAgIDI4MjksICAgIC03NSwKKyAgICAgICAtNjAsICAtMjYxOCwgICAtMjQwLCAgIDI5NDQsICAgLTYzMSwgIC00MjIxLCAgICAtMTYsICAgIDQ2NywKKyAgICAgICAyMTEsICAgIC01OCwgICAgIDU1LCAgIC01MjcsICAgIC01MSwgICAtMTYwLCAgICA2NDIsICAgLTMwNSwKKyAgICAgICAzODgsICAgIDQxMywgICAgMjEwLCAgICAtODEsICAtMzM4MywgICAtMTIwLCAgICAxNDQsICAgLTIyMCwKKyAgICAgIC02NzIsICAgMTM1MiwgICAtNjMwLCAgLTIzMjQsICAgLTQyMywgIC04MDUzLCAgIC0xMzEsICAgLTkxMiwKKyAgICAgIC0yNjAsICAgLTM4MCwgICAgNDcwLCAgICAxNTQsICAtMTM0NiwgIC0yNDE3LCAgIC00MjYsICAgLTQwMywKKyAgICAgIC0xMzcsICAgLTE2MCwgICAyODIzLCAgICA2MDksICAgLTIxNiwgICAtMTczLCAgIC01ODUsICAgLTUxNCwKKyAgICAgICAgOTUsICAgLTIwMiwgICAgMjIyLCAgICAgMTYsICAgIDEzNiwgICAxNzUxLCAgICAyMzcsICAtMTA4OSwKKyAgICAgICA5NTcsICAgLTE0NCwgICAtNTE4LCAgICA0MTYsICAgLTM0NywgICAgLTYwLCAgICAyMDcsICAgIDI3NywKKyAgICAgICA1MTIsICAtMTEzMywgICAgMTY2LCAgIDE0MjMsICAgLTg4MywgICAtMTk0LCAgLTcwMTYsICAtMTkzOCwKKyAgICAgICA0MTcsICAgMjMwMiwgICAtOTkyLCAgIC0xNzksICAgIDczOCwgICAgLTc0LCAgICA0MTEsICAgLTQ2MiwKKyAgICAgIC00MTMsICAgICA2NywgICAgMjM0LCAgIC0zMjIsICAgLTE2NCwgICAgLTQ3LCAgICAtODksICAgMTQwOSwKKyAgICAgICAzOTAsICAtMTE4MCwgIC0yODg4LCAgICA2NTUsICAgMTk1OCwgICAgICAwLCAgLTE4MjYsICAgLTQ3MSwKKyAgICAgLTEyNDcsICAgIDMwNywgICAgMTA0LCAgLTg1MDIsICAgLTE5OCwgICAtMjIyLCAgICAxOTEsICAgIDI4MSwKKyAgICAgIC04NjgsICAgICA0NywgIC00NTUzLCAgIDI0MzQsICAgIDE3NCwgICAgMjYzLCAgIDI4NDQsICAgIC03MiwKKyAgICAgIC01OTcsICAtMTE4MywgICAtMzc0LCAgICAtOTMsICAgMzM0OCwgICAgIDEzLCAgICAxNzMsICAgNjI4NSwKKyAgICAgICAtMzIsICAgLTIxMywgICAxODgyLCAgICA0MTEsICAgLTYwOCwgICAtNTYyLCAgIDI5OTgsICAgIDI5MywKKyAgICAgICAgNTQsICAgLTE0NywgICAtMTIwLCAgICA4MjIsICAgIC05MywgICAgNjc5LCAgICAyMDYsICAtMzIyOSwKKyAgICAgIC03NjcsICAtMTYwMywgICAtMjU5LCAgIC0zMTAsICAgNDMwNiwgICAgNTQ4LCAgICAgLTksICAgIC05OSwKKyAgICAgLTU3MjIsICAgLTMyOCwgICAtMTc2LCAgICA0NTMsICAgIDMzOCwgIC05Njg3LCAgICAtNjMsICAgIDg0NCwKKyAgICAgICAzMjIsICAgIDYxNSwgIC0xMDc1LCAgIC0zNzAsICAgIDE1OSwgICAgLTMzLCAgLTYyMTMsICAtMTM3NSwKKyAgICAgICA3NDEsICAgLTgwMSwgIC0xMzE5LCAgIDE1MTMsICAgMTMzMSwgICAgLTY5LCAgIDI3MDIsICAgLTQ1OCwKKyAgICAgIC0yMDMsICAgIDEwMywgICA0Njk2LCAgIC0yODQsICAgIDQ2NSwgICAgLTYyLCAgICAtNDAsICAgMzE4NCwKKyAgICAgICAyMzgsICAtNjEzMSwgICAgNTQ2LCAgIDE3MTMsICAgLTM2NSwgICAgLTI0LCAgICAxMTYsICAgIC0zMywKKyAgICAgICAzMDQsICAgIDgwNywgICAtMjMxLCAgICAyOTEsICAgIDkwMywgICAgNzQ5LCAgIC0yNTQsIC0xMjIxNSwKKyAgICAgICAxMTUsICAgIC0zNSwgICAgLTk1LCAgIC0xNjYsICAtMzc3NiwgICAtMTcwLCAgLTQ1MTcsICAgLTE1MSwKKyAgICAgICAgNjcsICAtNzcyNSwgICAgNjY2LCAgIC01NzMsICAgLTc0NCwgICAtNzE5LCAgICAgMzcsICAgICAzMSwKKyAgICAgICAzNzMsICAgIDE0OCwgICAtMTI1LCAgICAgMTUsICAgLTE1MCwgICAtOTA1LCAgICAtNDIsICAgIDI3MiwKKyAgICAgLTUyMjMsICAgIDY1MCwgICA1MjMzLCAgICAxMDksICAtMTIzNSwgICAgOTkxLCAgICAyMTEsICAgMTUyMiwKKyAgICAgIC01NTUsICAgLTMyOCwgICAgLTUyLCAgIDUzMzUsICAgIC0yMiwgIC01NDc2LCAgLTMxMDIsICAgLTYzNywKKyAgICAgICA5ODYsICAgIDQ2OCwgICAgLTM3LCAgIC0xNjQsICAgLTI2NCwgIC0xMjkwLCAgICA3NTQsICAgLTk0MCwKKyAgICAgIC02ODUsICAgLTg2MiwgICA3MjcwLCAgIC0yNzksICAgLTQ0MSwgICAgNDcyLCAgIC0xNTMsICAtMjUxNSwKKyAgICAgIDM4OTksICAgIC05NSwgICAgMzYwLCAgICA3NjIsICAgICAxNCwgICAgNDM0LCAgICA2MTksICAgIDE4NSwKKyAgICAgIC0yMzAsICAgMTIzMywgIC0xMzMwLCAgIDEzNjAsICAgLTc1NiwgICAgMzYxLCAgLTEzOTEsICAgLTI0NywKKyAgICAgICAxMjAsICAtMzU3MywgICAgMjkzLCAgICAzNzUsICAgIDgwNiwgICA1NTI2LCAgICA1MzYsICAgIDEzNywKKyAgICAgICA0ODYsICAgLTQ4NCwgICAgIDEzLCAgICAtMzcsICAgICAxMiwgICAgIC00LCAgICAgODEsICAgICA0MywKKyAgICAgICAgMTAsICAgICA0MywgICAgLTM4LCAgIC0zNzEsICAgIC02NCwgIC0xMTY3LCAgIC0xMTcsICAgLTM3MSwKKyAgICAgLTE5NTgsICAgLTE2NiwgICAgNTQzLCAgICAtOTcsICAgIC04MywgICAgMzkxLCAgICAtNTksICAtMTYzMSwKKyAgICAgICAzMDIsICAgMTA3NywgICAtMTI4LCAgIC02NDEsICAgIC02NCwgICAgIDIxLCAgLTI1NjIsICAgLTIzNSwKKyAgICAgICAzNDIsICAtNzEyMSwgICAtNjQ2LCAgICAtNDksICAgLTk2MSwgICAtMTQxLCAgIC0yMTAsICAgLTU1NSwKKyAgICAgLTE1OTYsICAgLTk4OCwgICAgNzIzLCAgIC0yMDksICAtMzU4NSwgICAgIDEwLCAgICAtMzUsICAgMTA1MSwKKyAgICAgICAgIDAsICAgIDEzOCwgICAgOTQxLCAgLTUwMDIsICAgIDgwNSwgICAzMDA5LCAgICAgMzUsICAgIC03MCwKKyAgICAgICA1MTMsICAgIC0yMSwgICAtNDMyLCAgIC0yMjQsIC0xMDYyOCwgICAtMTY3LCAgLTEwNDUsICAgMjYwMywKKyAgICAgICAzMzYsICAgIDM2MCwgICAgNTE1LCAgICA2ODMsICAgIDk4MSwgICAzMDI4LCAgICA0OTIsICAgLTU0MywKKyAgICAgLTE4NDQsICAgICAyMywgICAgLTMwLCAgICAgNTIsICAgIC00MCwgICAgNDQ3LCAgICAgMTEsICAgIDM2MywKKyAgICAgICAtOTUsICAgMTYwOSwgICAyNjEzLCAgICAtMTMsICAgLTQwMCwgICAgNzE5LCAgLTQ1MTMsICAgLTY3NiwKKyAgICAgIC0yOTAsICAgIDQ1NiwgICAtMzMyLCAgICAtMTEsICAgLTI2MSwgICAtNDU1LCAgICAgODksICAgLTMwMSwKKyAgICAgICAyODUsICAgIDI4NywgICAgMjAyLCAgICAyODEsICAgICA4NywgICAtMjAyLCAgLTE0ODIsICAgLTUzNSwKKyAgICAgICA4NzQsICAgLTQ3OCwgICAtMjAxLCAgIDQ3MTUsICAgIDgyNCwgICAtMjA0LCAgICAxNDUsICAgMjg4MiwKKyAgICAgICA0MDQsICAgMzM3NiwgICAgMzYzLCAgICAtMTgsICAgLTEyNywgICAgNzY0LCAgICAxMDYsICAgMTYyNiwKKyAgICAgICAxNzgsICAgIDE4NSwgICAgIDIyLCAgIC02MzcsICAtNjIxNiwgICAxMzk5LCAgIC05NjEsICAgIC04OCwKKyAgICAgIC01NTMsICAgIC05MSwgICAgIDk4LCAgIDE4MzEsICAgICAgOSwgICAtNTgzLCAgIDEyNTMsICAtMTc0MSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHNoYXBlNDRzW10gPSB7CisgICAgICAgLTIwLCAgIC0xNDAsICAgIDY4MywgICAtNTg2LCAgLTE3NDIsICAgIDE3NywgICAtNTM4LCAgIDE5MDAsCisgICAgICAyMTkzLCAgICAtMTcsICAtMjA5NiwgICAgMjYxLCAgICA2NDUsICAgIDMzOSwgICAgIDc3LCAgIDExMzYsCisgICAgICAtNTIxLCAgICA1MzcsICAgLTkyNCwgICAtMTU2LCAgIC0yNjEsICAgIDE5NSwgICAxMDQ5LCAgICAtMzksCisgICAgICAgMjM2LCAgIC0xMzcsICAgICAgMCwgICAzMTk5LCAgICAyMjUsICAgICA0NiwgICAgIDg2LCAgIC0yMTUsCisgICAgICAgNTU3LCAgLTUzOTQsICAgICAxNywgICAgOTExLCAgLTE2OTAsICAgIC00OCwgICAgLTQ4LCAgIC0xNzUsCisgICAgICAgLTExLCAgIC02MzEsICAgLTE1MywgICA0NDc0LCAgIC0zNDcsICAgIC0zOSwgICAxNzU5LCAgICAxNTQsCisgICAgICAgMTcwLCAgIC0xODAsICAgLTI3MywgICAgNjAzLCAgIC01OTAsICAtNTE5NSwgICAgLTc0LCAgIDE3ODksCisgICAgICAgMjQwLCAgIC0yMTIsICAgIDQzMSwgICAyNDQ3LCAgICAzNjgsICAgIC03NiwgICAtMzEzLCAgICAgMTEsCisgICAgIC0yOTI2LCAgICAgMTksICAgIC03MSwgICAgMjA4LCAgICAtNTEsICAgLTcyOCwgIC02NDEyLCAgICAtNjEsCisgICAgICAgMTQxLCAgIC0xMTIsICAgNTI4MCwgICAgLTc2LCAgIDQ0MzUsICAgLTQwMiwgICAgLTI1LCAgICAgNDYsCisgICAgICAgMjEwLCAgIC0xMDQsICAgIDE3MiwgIC0zODMwLCAgIC0zNjYsICAgIC0yMywgICAgMjM5LCAgIC0xMTIsCisgICAgICAgMTM3LCAgIDY2OTIsICAtNjI4OCwgICAtNzIwLCAgIC0xMzIsICAgLTEzNiwgICAgNTUyLCAgLTE2ODgsCisgICAgICAtMzQ1LCAgIC0yODksICAgLTQ4NSwgICAgMTQ5LCAgICAxNzQsICAgIDE4MCwgICAgMzYxLCAgIC0yMzYsCisgICAgICAgIDkyLCAgICA0MDcsICAgICAgNiwgICAyMzczLCAgICAzODAsICAgLTE2NywgICAgODQ1LCAgICA0NDQsCisgICAgICAtODM0LCAgLTkzNTgsICAgIDQxMywgIC0xMzAyLCAgICA0NjAsICAgICA3NywgICAgIDM0LCAgICAgNTYsCisgICAgIC0xNTE2LCAgIC0xNDMsICAgIDIwNywgICAgLTQzLCAgICAtMzEsICAgLTEwNiwgICAgLTUyLCAgICA0MDMsCisgICAgICAtMzA5LCAgICAyOTgsICAgIC04OCwgICAxNTUyLCAgIC0yNDAsICAgLTc3NiwgICAgNjI0LCAgLTQxODEsCisgICAgICAtMzQyLCAgLTQ4MDQsICAgICA1NywgICAgLTIzLCAgICAxNjAsICAgIC00NCwgICAgNDY5LCAgICAtMTcsCisgICAgIC0zOTk3LCAgLTUwNzksICAgLTI2MywgICAgIDcyLCAgICAxODEsICAgMTA4NSwgICAgNTM4LCAgIC02MTEsCisgICAgICAtMzY4LCAgICAgNTksICAgLTIwNCwgICAtMTk1LCAgICAtNDAsICAgLTIwMSwgICAtODAzLCAgLTUwOTMsCisgICAgIC0zMjE2LCAgICA0ODAsICAgICA0NiwgICAtNzI5LCAgICAyNDQsICAgMzMyMCwgICAgMTg1LCAgICA1MDMsCisgICAgICAyOTc5LCAgIC00MTYsICAgIDExMCwgICAgIDI1LCAgICAxNDAsICAgLTUwMiwgICAyMjM2LCAgLTQ0MjAsCisgICAgICAgLTM2LCAgIC0yMzgsICAgLTI3OCwgICAgIDYwLCAgICAtODIsICAgLTU5NywgICAgMjE4LCAgICAgNjksCisgICAgICAgLTk1LCAgLTIxMDIsICAtMjEzOCwgIC0yMzA4LCAgLTM3OTYsICAgICAyMCwgICAtMjExLCAgIC0yMjksCisgICAgICAgMjk3LCAgIDM2NjUsICAgICA4MSwgICAgMTQ4LCAgIDEzMTUsICAtNDUzNywgICAgLTM4LCAgICAxODYsCisgICAgIC0zMTA2LCAgIC01MjYsICAgICA5MCwgICAgLTM1LCAgIC0xOTMsICAgLTMwMiwgIC01ODYwLCAgICAyNzYsCisgICAgICAtMzA4LCAgICAyMDYsICAgIDY0NSwgICAgICAxLCAgIC0yNDIsICAgIDU4MCwgICAzMDI1LCAgLTI1ODMsCisgICAgICAgLTkwLCAgICA1MTEsICAgLTMxNSwgICAtMTM3LCAgLTIwMzMsICAtNDMxMywgICAgNjkzLCAgICA0ODUsCisgICAgICAtMjExLCAgIDE0ODYsICAgMTE4MCwgICAgMTgxLCAgIC0xMzYsICAgIDIwNCwgICAgIDIzLCAgICAzODMsCisgICAgICAxNDc5LCAgIC0yMTMsICAgICA0MiwgICAgIDMyLCAgICAtNjQsICAgLTEzNiwgICAgLTkxLCAgIC0xNDYsCisgICAgICAgNDM0LCAgICAyMzEsICAgICAzNiwgICAgLTU4LCAgLTMyNTQsICAtMjY0NywgICAgLTE4LCAgICAzNDUsCisgICAgICAgMTcxLCAgICAtNjAsICAgICA4NCwgICAgMjA5LCAgICAyNDYsICAgLTU4NywgICA5NDQ3LCAgICAtNjcsCisgICAgICAtMTg3LCAgIC0xMDgsICAgLTIyNiwgICAtNDU4LCAgIC01MTksIC0xMTA4OSwgICAtNDIyLCAgIC01MDIsCisgICAgICAgMTMyLCAgICAgNzksICAgIDI5OCwgICAtNDc1LCAgIC00MTIsICAgIDE5NiwgICAtMTY0LCAgLTczNDcsCisgICAgICAgMTg1LCAgIC0xMzEsICAgIDM2OSwgICAgIDE4LCAgIC01MDAsICAgIDY0NCwgICAtMzM0LCAgICAgOTMsCisgICAgICAgLTc3LCAgICAgNzEsICAgIDM0MSwgICAzNTY2LCAgIC0yODEsICAtNDE5MSwgICAtMTQ1LCAgICAgODcsCisgICAgICAgIDM3LCAgICAzMDYsICAtMzQ4MiwgIC01NzM5LCAgICAxNjEsICAgLTI0NSwgICAgMjkzLCAgICAyMDgsCisgICAgICAgMzgwLCAgIDI4ODgsICAgICAzMSwgICAgLTIzLCAgLTIwNjEsICAgLTU5NywgICAgLTU2LCAgICAzNTAsCisgICAgICAtMTA1LCAgIDExNjcsICAgICA2NCwgICAgMzQyLCAgIDM2MzgsICAgIC03OSwgICAtMTA2LCAgICAxNDgsCisgICAgICA1NDIyLCAgIC03MTksICAgLTIzMiwgICAgICA4LCAgIC0zOTUsICAgMzI0OSwgIC01MDkzLCAgIC0yMjIsCisgICAgICAtNzA3LCAgICAyNDEsICAgIDMxOCwgICAgNzM1LCAgICAzNzYsICAgICA3OCwgICAtMTY2LCAgLTE2MTQsCisgICAgICAgIC05LCAgLTMzNzMsICAgIDMzMCwgIC0xNTQwLCAgIDIwMjgsICAgMzQwMCwgICAgIC05LCAgICAzMTcsCisgICAgICAgICA5LCAgIDQ5MDMsICAgIDI2MiwgICAgIDYyLCAgICAyMjIsICAgIC05NSwgICAtMjA4LCAtMTMzNzYsCisgICAgICAtMTAxLCAgICAxMjEsICAgIDI5OCwgICAgICA1LCAgICAxNzIsICAgIDQwNiwgICAtMTY0LCAgICAgNzksCisgICAgICAgMTcyLCAgIDE5OTMsICAgIDIzNSwgICAgMjI5LCAgIDExOTMsICAgLTI3NCwgICA1OTQ0LCAgIC05MTgsCisgICAgICAgLTE1LCAgIDEzMDQsICAgIDMwNywgICAxMTUwLCAgIC0zODUsICAgLTc5NCwgIC0zNDY3LCAgICA2NjAsCisgICAgICAyMTQzLCAgICAxNDcsICAgLTI3OSwgICAtNzUxLCAgIC0zMDUsICAgMTA1MiwgICAgMjA1LCAgIC0xMDgsCisgICAgICAgNTcyLCAgIC0yMTIsICAgICAyOSwgICAgLTUwLCAgICAgIDYsICAgMzc0OSwgICAgMjM4LCAgLTIwMTYsCisgICAgIC0xMTE4LCAgLTEzMjksICAgLTk3MSwgICAyNjMzLCAgICA1MTksICAgIDE5NCwgICAzNTQ1LCAgICAtMTEsCisgICAgICAgIDc3LCAgICAtOTIsICAgMTIxNSwgICAtNDM5LCAgICAxNTIsICAgLTg2MywgICAxNjA0LCAgICAxODAsCisgICAgICAtNTE0LCAgICAyNTIsICAgIDMwOCwgICAtMTMxLCAgIC05MzgsICAgIDEzMywgICAgMzc4LCAgICAgMTEsCisgICAgIDEyMTUzLCAgICAgNTEsICAgIDQ4NiwgICAgIDcxLCAgIC00NzYsICAgLTU5OSwgICAgIDU3LCAgIC0xMjcsCisgICAgICAyNjg1LCAgIC0xNzMsICAgLTE4MiwgICAgNDY4LCAgLTM0NjksICAgLTU5NCwgICAtMzgwLCAgICAyNjUsCisgICAgICAtODc5LCAgIC0zNTIsICAgLTI3OCwgICAtMzA5LCAgICA1NzUsICAgIDEyNCwgIDEwODE0LCAgIC03NjUsCisgICAgICAgLTY0LCAgICA3MTAsICAgLTEwNSwgICAgMjk2LCAgIDI1NjIsICAgICA5OCwgICAtMzU4LCAgICA1NTYsCisgICAgICAyOTIxLCAgIC0xMzMsICAgICAtNSwgICAtNDA2LCAgICAgNDIsICAgIDQ5NiwgIC0xMDUzLCAgLTE5NTcsCisgICAgICAgNzAxLCAgICAyNjYsICAgIDI2MCwgICAtNDQxLCAgICAgNDMsICAgLTE5MiwgICAgIC0xLCAgLTIxNzQsCisgICAgICA5ODk0LCAgICAtOTAsICAgLTE4MSwgICAgIDI5LCAgICAgNTAsICAgLTg1OCwgICAgIDU5LCAgIC0xOTAsCisgICAgICAgIDQ5LCAgIC0yODIsICAgMTYzMiwgICAxNTI1LCAgICAxMDAsICAtMzY1OSwgICAgIDEzLCAgICAxNzMsCisgICAgICAtMjQwLCAgIDUzMDQsICAgLTM4MywgICAgMjYzLCAgIC0zMTEsICAgMTc0NywgICAgMTY5LCAgLTIyMDMsCisgICAgICAgLTI5LCAgIC0xMDYsICAgIDM0MiwgICAtMzAxLCAgICAgNjYsICAgICA0OSwgICAgIDIzLCAgICA4NTcsCisgICAgICAtNjA3LCAgICA2OTgsICAtMTE5OCwgICAtMTkxLCAgIC00NTAsICAtMTg3NSwgICAtMzI5LCAgLTIxNTYsCisgICAgICAgMTU2LCAgICAgOTUsICAgIDE0NSwgICAgMTI5LCAgIC0zMjEsICAgICA4OCwgICAxMDQ5LCAgIDM5ODAsCisgICAgICAgLTE0LCAgICAzMjEsICAtMTQ4NCwgICAgODk1LCAgICAtMzAsICAtMjE3NCwgICAgMjg5LCAgICA5MzMsCisgICAgICAtOTMzLCAgICAgMTUsICAgMjYzMSwgICAgIDY4LCAgIDMwNTQsICAgIDIyMSwgICAgLTg3LCAgICAxNzUsCisgICAgICAgMjAwLCAgICA5MzcsICAgIC04NywgIC0yMDMyLCAgICAzNDgsICAgIDE0NiwgICAtMzcyLCAgICAgNjAsCisgICAgIC0yNTY2LCAgIDM0OTcsICAgIC05OCwgICAgMzEzLCAgICA1MzYsICAgLTI5OSwgICAgLTU4LCAgLTg5NDksCisgICAgICAgMzIzLCAgIC01MjQsICAgLTMzMSwgICAgNzEzLCAgICAtNDcsICAgIDM2MCwgICAgMTU1LCAgICAxNjgsCisgICAgICAgNjg3LCAgLTEzOTEsICAgMTk3MywgICAgNjcwLCAgICA3ODgsICAgLTIwMiwgICAtMTI5LCAgLTUxMTMsCisgICAgICAgIDU0LCAgIDExNzgsICAgMTIxOCwgICAgMTcyLCAgICA2MzAsICAgLTE1NCwgIC0xMDQ3LCAgICA4NDAsCisgICAgICAgIDcxLCAgIC0zMzcsICAgICA5MSwgICAgMjE0LCAgIC00NzQsICAgIDYyNCwgICAtNzczLCAgICAgMTYsCisgICAgICAtMTI2LCAgICAzNDAsICAgLTYzMSwgICAtNDgyLCAgIC0xNTUsICAgIDQxOSwgICAgIDUwLCAtMTA5NzYsCisgICAgICAtNzQyLCAgIC03ODEsICAgIDE2OSwgICAgMTQ5LCAgICAgMzMsICAgLTE2OSwgICAgIDQ0LCAgICAzNTQsCisgICAgICAgIDI2LCAgICAxMjksICAgLTE3OSwgICAxNDAxLCAgICA3NzYsICAgLTE1NSwgIC0zOTk2LCAgIC04MTMsCisgICAgICAgNTk0LCAgICAyMzgsICAgIC02MSwgICAgMTY4LCAgIC0zODMsICAtOTI2MSwgICAgMjk0LCAgICA0NzAsCisgICAgICAtMzIyLCAgIC0xOTAsICAgLTk1NiwgICAtMjkwLCAgICAgMjcsICAgLTQzOCwgICAtMjU0LCAgMTI1NzEsCisgICAgICAgMzQ0LCAgIC0zOTMsICAgLTU2OCwgICAgIDU2LCAgICAgODEsICAgIDE3MSwgICAtMTE1LCAgLTQzNzAsCisgICAgICAgIDQ5LCAgIC0zMjIsICAgLTIzNywgICAtNjkyLCAgICAtNTUsICAgIC00OSwgICA0MzE3LCAgICAgLTYsCisgICAgIC00ODM3LCAgIC0xNTYsICAgIDE3OSwgICAgMjQ3LCAgIC0zMzgsICAgIC00OCwgICAgOTUyLCAgLTEwNjEsCisgICAgICAgLTMzLCAgIC05MzQsICAgIDI1MCwgICAtMjU2LCAgLTE2MjIsICAgMTAzOSwgICAtNzM4LCAgIDI3MTksCisgICAgICAgLTIwLCAgIC0xOTAsICAgIDI0OSwgICAtMTE5LCAgIC0yMzUsICAgNjA4MCwgICAgMTIzLCAgIC01MDIsCisgICAgIC0xNDQzLCAgICAgODYsICAtMTY4NCwgICAtMTc3LCAgIC0xMjgsICAgIC01OCwgICAtMjM3LCAgIC02NDEsCisgICAgICAtMTc3LCAgICAgNjQsICAtMjQxNiwgICAgIDE1LCAgIC0xMTYsICAtNjQ2NSwgICAtNDEyLCAgICAxNjEsCisgICAgICAgNDE5LCAgICA3NjgsICAgICAzNiwgICAgMTEzLCAgIC05NDQsICAgLTI0MSwgIC0xNDI0LCAgICAtOTUsCisgICAgICAgNjM1LCAgIDE3OTgsICAtMjI1NywgICAgLTE4LCAgIDMwNDYsICAgIDE3MywgICAgLTMzLCAgIC0yMDcsCisgICAgICAgLTUyLCAgIC04MzEsICAtNTczMCwgICAgLTU0LCAgIC0xOTksICAgIDE5NCwgICAtMjU1LCAgICA0NjcsCisgICAgICAtMjExLCAgIC04NTMsICAgLTUxMiwgIDExNjE5LCAgICAxNDgsICAgMzY4MSwgIC00NjAzLCAgIC0yODIsCisgICAgICAgMTI5LCAgIC0yMDUsICAgLTYwNiwgICAgMTY3LCAgICAzMDYsICAgIDQ2NCwgICAgNDg1LCAgIC05NTksCisgICAgICAtMjAzLCAgICAyNTQsICAgIDE1MSwgIC02ODgwLCAgIC0yNjIsICAgNTE4MCwgICAgNjU4LCAgLTEzNzgsCisgICAgICAxMTc0LCAgICAtNTMsICAgIC01OSwgICAgLTMzLCAgLTMwNzcsICAgLTEyNywgICAtMjIzLCAgICAtMTcsCisgICAgICAgLTMxLCAgLTIxOTAsICAgICAyMywgICAgMzE3LCAgIC0xNjksICAgIDIwMywgICAtMjIzLCAgIC0yMjIsCisgICAgIC01Mjk1LCAgICAxMTYsICAgICA4MCwgIC0yNzU3LCAgIC02NjYsICAgMzM3NywgICAtNDc2LCAgICAgODUsCisgICAgICAtNjMwLCAgIC0xNDcsICAgMTc0MCwgICAtMTc1LCAgIC0xMTUsICAgIDIwNywgICAgMjQwLCAgIC0yNDgsCisgICAgICAgLTk1LCAgLTEwMTYsICAgMzk2NiwgICAzOTk4LCAgIC0zNDMsICAtNDc1MSwgICAgMTg3LCAgIC0xMTMsCisgICAgICAtMjUwLCAgICAxMTEsICAgLTUxMCwgICAtMjAzLCAgICAxMzAsICAgICA4OSwgICAgMzExLCAgICA2MDgsCisgICAgICAtMjIxLCAgIC0zODEsICAgLTI1MywgICAtMzU5LCAgLTIyNTQsICAgICA0NSwgICAgMjI0LCAgIC0xNDEsCisgICAgICAgIDQ1LCAgICAtMTksICAgIDQ4MCwgIC01MDc0LCAgICA3OTcsICAtNDU4MCwgICAtMTYzLCAgICAxMTAsCisgICAgICAtMjM0LCAgICAzMzcsICAgICAgNiwgICAgNzA3LCAgICA0OTIsICAtNTQ5MywgIC0yNzUwLCAgICAtOTQsCisgICAgICAtMzYzLCAgICAxMTMsICAgMjM0NSwgICAgMzQ0LCAgICAzNzksICAgIDQ2NCwgIC0zMjIyLCAgICAtNTYsCisgICAgICAtMjY5LCAgIC0yNjIsICAgIC0xMCwgICAtNjA5LCAgICAzMjQsICAgMzA0MywgICAgMjA5LCAgIDMwOTIsCisgICAgICAtNjAwLCAgICAgNDIsICAgLTYxNSwgICAgLTE3LCAgICAtNTMsICAgICAzMCwgICAxMTIzLCAgICAyMjQsCisgICAgICAgNTkzLCAgICA2MzIsICAgIC05MCwgICAgNDI4LCAgIDExMTcsICAtMTQyOSwgIC02NzQxLCAgICAtOTUsCisgICAgICAtMjkzLCAgIC0xMDMsICAtMjc4NCwgICAgMjUxLCAgIDE2ODgsICAgIDYyMSwgICAtMzQ5LCAgIDEwNTksCisgICAgIC0xMDkzLCAgIC0xNDgsICAgIDQ0NywgICAgMTQ5LCAgICAgODgsICAgICA5MiwgICAgNjg3LCAgIDEyNDksCisgICAgICAgIDgwLCAgICAyODksICAtMTg0MSwgICAgMjIxLCAgICAtMTAsICAgIC05MiwgIC0xNzM2LCAgICAxMTgsCisgICAgICAgMTM2LCAgICAxMzgsICAgLTE2MiwgIC00MTYyLCAgIC0xMTEsICAgICA2MiwgICAgIDk1LCAgICAxNjYsCisgICAgICAtMTcyLCAgIC02OTUsICAtMzY4NSwgICA1Njk0LCAgIC01MjcsICAgMjAzMiwgICAtNTQ5LCAgICAgNDMsCisgICAgICAtMTAxLCAgICAyMjEsICAgIDE4MSwgICAtNDc5LCAgIDc2OTcsICAgMjAwNywgICAtMTI3LCAgICA4MDUsCisgICAgICAgLTgzLCAgIC01MzUsICAgMTM1NCwgICAtMzgzLCAgICAyNTMsICAgLTYyMiwgICAyOTEwLCAgIDEyNDksCisgICAgICAgNzgyLCAgICAgMTMsICAgICA0MiwgICAgOTk0LCAgIC01NDUsICAgICA3NSwgICAtNDg1LCAgICAzMzAsCisgICAgICAgLTE2LCAgICAzNDMsICAgIDI3MiwgICAtNzgxLCAgICAzNjAsICAgIC05NywgICAgLTI1LCAgIC04NzUsCisgICAgLTEyNjg5LCAgIC02MjMsICAgLTMwNywgICAgMTk1LCAgIC0yNTYsIC0xMTY0NCwgICAgMjI5LCAgICAxODAsCisgICAgICAgLTQyLCAgIC0zNjEsICAgLTEyNCwgICAgLTgxLCAgICAtMjMsICAgLTQ2MCwgIC0xOTkzLCAgICAyMTIsCisgICAgICAtNjM0LCAgIC04NDcsICAgMTYxNiwgICAtNTQ2LCAgIC01ODMsICAgICA5OSwgICAzODAwLCAgICAgMTAsCisgICAgICAgMTc3LCAgICAzNjYsICAgNjEwNiwgICAtMTczLCAgICAyNjUsICAgLTIxMywgICAgIDEwLCAgIDExMDgsCisgICAgICAtMjg4LCAgLTE2OTAsICAgLTIzNywgICAtMzEyLCAgICAgMzgsICAtMjI3MiwgICAgNDMxLCAgICAtMjYsCisgICAgICAtMTc4LCAgIC03NjQsICAgIDUwNywgICAgMzU1LCAgICA2NzcsICAgLTIxNCwgICAtODE2LCAtMTI0MTEsCisgICAgICAgIDQ3LCAgICAgMTIsICAgIDI5NCwgICAtMjk1LCAgLTM5MTYsICAgLTY3NywgIC00ODg1LCAgIC0yNTAsCisgICAgICAtNDUzLCAgLTc3MTYsICAgIDQ3OCwgICAgMjMxLCAgICAgMTcsICAgLTI0OCwgICAgMTQ3LCAgIDEwNjQsCisgICAgICAgNjM3LCAgICAtODAsICAgIC00MSwgICAgMjY1LCAgIC0zODMsICAgIDE0MiwgICAgMTE2LCAgIDI5OTEsCisgICAgIC0zMDYwLCAgICA4MDksICAgMjA1NiwgICAtMTE5LCAgIC04NjYsICAgIC0yMiwgICAtNjYwLCAgICAyMzMsCisgICAgICAgMzA2LCAgLTE4NzMsICAtMTE0MSwgICA2OTk1LCAgICAxODYsICAtODY3OCwgICAtMTA5LCAgICAtMzksCisgICAgICAtMTA1LCAgICA3MzAsICAgICAxOCwgICAtODQ2LCAgICAyNzMsICAtMjkyMiwgICAgMjEwLCAgICAgMjYsCisgICAgICAtMTc0LCAgIC0xNDIsICAgIDk5MCwgICAgMTMxLCAgIC00MzYsICAgMTQyMiwgICAtMjE3LCAgLTMxNTIsCisgICAgICAzMjI0LCAgICAgMzUsICAgIDMxNSwgICAgLTQ3LCAgICAgNDgsICAgLTIyMSwgICAgNTY4LCAgICAgNDQsCisgICAgICAgMTgyLCAgIDE2OTYsICAtMTc1NSwgICAtMTkzLCAgICA1MjcsICAgIDE1OCwgICAtNTU1LCAgLTM0ODUsCisgICAgICAgMTcxLCAgLTQ1NTIsICAgIC00NywgIC00NjgwLCAgICAgOTUsICAgLTExMiwgICAgMTg0LCAgICAgODAsCisgICAgICAgLTM2LCAgIC05MTUsICAgICA4NywgICAgIDI0LCAgIC0yNTksICAtMTc0MywgICAgIDY4LCAgIC0xMTcsCisgICAgICAgNDA1LCAgICAgMTEsICAgICA0MCwgICAtMzIwLCAgICAtMTcsICAgLTE1OCwgICAtMTM0LCAgIC0xODYsCisgICAgIC0xMjA2LCAgIC00NjYsICAgMTI2MiwgICAgMTMzLCAgIC0yNTQsICAgLTEwMCwgICAgMjEwLCAgLTE3MzUsCisgICAgICAtNjM2LCAgICAzMTksICAgLTk3OCwgICAgIDY5LCAgICAxOTcsICAgLTUyMSwgIC01NTAzLCAgICAtNzgsCisgICAgICAtNTQ0LCAgLTEwMTEsICAgIDEwMSwgICAtNDg5LCAgIC0zNzEsICAgIC03OSwgICAtMTk2LCAgICAtMTgsCisgICAgICAtODM5LCAgIDEwOTEsICAgIDY4MiwgIC0xNDQxLCAgLTIzNzUsICAtMTEyNywgICAgIDU0LCAgICA4MjksCisgICAgICAtMzA2LCAgIC0yNTUsICAgIDY0MSwgIC0zNjY1LCAgICA0NzMsICAgMzUwNCwgIC0xMDM1LCAgIC0xNjAsCisgICAgICAtNDY3LCAgIC0yNzUsICAgLTQzNywgICAgIDc5LCAtMTM1MTMsICAgIDMyNiwgICAgMTMyLCAgICAgODIsCisgICAgICAgMTg4LCAgICAzNjIsICAgIC03NCwgICAxNDA2LCAgICAtNDYsICAgMjg2NCwgICAgMzUxLCAgIC01NTgsCisgICAgIC0xMjc3LCAgICAxMDgsICAgIC05MiwgICAgLTUzLCAgICAgNzIsICAgIC00MSwgICAgLTMxLCAgICAtOTcsCisgICAgICAgMzUzLCAgICAgNzMsICAgMTg2NCwgICAtMjA3LCAgICAxMDYsICAgIC04MSwgIC0zOTMwLCAgICAxNzMsCisgICAgICAgIDQxLCAgIC01MzksICAgLTQ5NywgICAgMTM1LCAgIC01MjYsICAgLTgyMywgICAgIDY5LCAgICAtMTAsCisgICAgICAgMTc2LCAgICA2NDgsICAtMTcxMCwgICAgNTY0LCAgICAgODAsICAgIDIzNywgIC0xOTU2LCAgICAyMzQsCisgICAgICAgIDExLCAgICAxNDIsICAgLTg0OSwgICA0MTE2LCAgIC00NzMsICAgIDExMCwgICAgMTI5LCAgIDIxMzcsCisgICAgICAtMTcwLCAgIDMxOTMsICAgICAxMCwgICAgMjQ1LCAgIC05NTMsICAgLTgyNywgICAgLTMwLCAgIDEyMzUsCisgICAgICAgMzY2LCAgICAtNjcsICAgICA1NCwgICAtNTY3LCAgLTczNzcsICAgMjQ2MSwgICAgNTgyLCAgICAgNzQsCisgICAgIC0xOTg4LCAgICAtMzMsICAgLTI5NiwgICAzMDkwLCAgICAtNTQsICAgIDE0NSwgICAgNTY0LCAgIC0yOTUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbDhfNTEyW10gPSB7CisgICAgNCwgIDUsICA0LCAgNSwgIDQsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDgsICA3LCAgOSwKKyAgICA5LCAxMSwgMTEsIDE0LCAxNSwgMTcsIDIwLCAyNCwgMjgsIDM0LCA0MSwgNTEsIDY0LCA4MywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9tOF8yNTZbXSA9IHsKKyAgICAzLCA0LCAzLCA0LCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA4LCA5LCAxMSwgMTMsIDE3LCAyMywgMjksIDQxLCA1OAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX3M4XzY0W10gPSB7CisgICAgMiwgMSwgMiwgMiwgMywgNCwgNSwgNywgMTMsIDI1Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbDhzXzUxMltdID0geworICAgICAgNywgICA4LCAgIDcsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LAorICAgICAgOCwgICA5LCAgIDksICAxMCwgIDEwLCAgMTEsICAxMSwgIDEyLAorICAgICAxMiwgIDE0LCAgMTUsICAxNiwgIDE4LCAgMTksICAyMSwgIDI0LAorICAgICAyNywgIDMwLCAgMzUsICA0MCwgIDQ2LCAgNTMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfczhzXzY0W10gPSB7CisgICAgICAzLCAgIDMsICAgMywgICAzLCAgIDQsICAgNSwgICA2LCAgIDgsCisgICAgIDEyLCAgMTcsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbThzXzI1NltdID0geworICAgICAgNiwgICA1LCAgIDYsICAgNiwgICA2LCAgIDYsICAgNywgICA3LAorICAgICAgOCwgICA4LCAgIDksICAxMCwgIDExLCAgMTMsICAxNSwgIDE4LAorICAgICAyMCwgIDI1LCAgMzEsICAzOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9sMTFfNTEyW10gPSB7CisgICAgICA0LCAgIDQsICAgNSwgICA0LCAgIDUsICAgNCwgICA1LCAgIDYsCisgICAgICA2LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDEyLCAgMTQsCisgICAgIDE3LCAgMjEsICAyNywgIDMzLCAgNDQsICA1OCwgIDgyLCAxMjEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfczExXzY0W10gPSB7CisgICAgICAyLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNiwgIDEzLCAgMzMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbTExXzI1NltdID0geworICAgICAgMywgICAzLCAgIDQsICAgMywgICA0LCAgIDQsICAgNSwgICA2LAorICAgICAgNywgICA5LCAgMTEsICAxNSwgIDIxLCAgMzAsICA0OCwgIDgzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX2wxMXNfNTEyW10gPSB7CisgICAgICA2LCAgIDYsICAgNiwgICA2LCAgIDYsICAgNiwgICA3LCAgIDYsCisgICAgICA3LCAgIDcsICAgOCwgICA4LCAgIDgsICAgOSwgIDEwLCAgMTAsCisgICAgIDExLCAgMTMsICAxMywgIDE1LCAgMTcsICAxOCwgIDIxLCAgMjUsCisgICAgIDI3LCAgMzMsICAzOCwgIDQ1LCAgNTQsICA2NiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9zMTFzXzY0W10gPSB7CisgICAgICAyLCAgIDMsICAgMiwgICAzLCAgIDMsICAgNCwgICA2LCAgIDgsCisgICAgIDEyLCAgMjEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbTExc18yNTZbXSA9IHsKKyAgICAgIDQsICAgNSwgICA0LCAgIDUsICAgNSwgICA1LCAgIDYsICAgNSwKKyAgICAgIDcsICAgNywgICA4LCAgIDksICAxMCwgIDEyLCAgMTUsICAxNywKKyAgICAgMjIsICAyOCwgIDM1LCAgNDcsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbDE2XzEwMjRbXSA9IHsKKyAgICAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICAgNywgICA4LCAgIDksIDEwLCAxMSwKKyAgICAxMiwgMTQsIDE3LCAxOSwgMjIsIDI3LCAzMywgNDAsIDUxLCA2NCwgODQsIDExNCwgMTY0LCAyNTcKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9tMTZfNTEyW10gPSB7CisgICAgIDMsICAzLCAgMywgIDMsICA0LCAgMywgIDQsICAgNCwgIDQsICA1LCAgNSwgIDYsICA3LCAgOCwgMTAsIDEyLAorICAgIDE0LCAxOCwgMjQsIDMwLCA0MiwgNTksIDg5LCAxNTIKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9zMTZfMTI4W10gPSB7CisgICAgMiwgMiwgMiwgMywgMywgNSwgNywgMTIsIDI1LCA2NworfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX3MxNl82NFtdID0geworICAgIDEsIDEsIDIsIDIsIDMsIDYsIDExLCAzOAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX2wxNnNfMTAyNFtdID0geworICAgICAgOSwgICA5LCAgIDgsICAgOSwgIDEwLCAgIDksICAxMCwgIDEwLAorICAgICAxMCwgIDEyLCAgMTEsICAxMywgIDEzLCAgMTQsICAxNiwgIDE3LAorICAgICAxOSwgIDIwLCAgMjQsICAyNiwgIDMwLCAgMzUsICA0MCwgIDQ4LAorICAgICA1NiwgIDY4LCAgODMsIDEwMiwgMTI4LCAxNjUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfczE2c18xMjhbXSA9IHsKKyAgICAgIDMsICAgNCwgICA0LCAgIDQsICAgNSwgICA3LCAgMTAsICAxNiwKKyAgICAgMjYsICA0OSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9tMTZzXzUxMltdID0geworICAgICAgNywgICA2LCAgIDcsICAgNywgICA3LCAgIDgsICAgOSwgICA5LAorICAgICAxMCwgIDExLCAgMTQsICAxNSwgIDE4LCAgMjIsICAyNywgIDM0LAorICAgICA0NCwgIDU5LCAgODEsIDExNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9sMjJfMTAyNFtdID0geworICAgICAgMywgICA0LCAgIDMsICAgNCwgICAzLCAgIDQsICAgNCwgICA0LAorICAgICAgNCwgICA0LCAgIDUsICAgNSwgICA1LCAgIDYsICAgNywgICA3LAorICAgICAgOCwgICA5LCAgMTEsICAxMiwgIDE0LCAgMTYsICAyMCwgIDI0LAorICAgICAyOSwgIDM2LCAgNDUsICA2MCwgIDgwLCAxMTMsIDE3MywgMzAyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX3MyMl8xMjhbXSA9IHsKKyAgICAgIDEsICAgMiwgICAxLCAgIDIsICAgMywgICA0LCAgIDYsICAxMCwKKyAgICAgMjMsICA3NiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9tMjJfNTEyW10gPSB7CisgICAgICAzLCAgIDIsICAgMywgICAzLCAgIDMsICAgNCwgICAzLCAgIDUsCisgICAgICA0LCAgIDYsICAgNywgICA4LCAgMTAsICAxNCwgIDE4LCAgMjUsCisgICAgIDM2LCAgNTUsICA5NSwgMjA4LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX2wyMnNfMTAyNFtdID0geworICAgICAgNiwgICA3LCAgIDYsICAgNiwgICA3LCAgIDcsICAgNywgICA3LAorICAgICAgNywgICA4LCAgIDksICAgOCwgIDEwLCAgMTAsICAxMSwgIDEyLAorICAgICAxMywgIDE1LCAgMTYsICAxOCwgIDIxLCAgMjQsICAyNywgIDMzLAorICAgICAzOCwgIDQ2LCAgNTUsICA2OCwgIDg0LCAxMDcsIDE0MCwgMTkxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX3MyMnNfMTI4W10gPSB7CisgICAgICAzLCAgIDIsICAgMywgICA0LCAgIDQsICAgNiwgICA5LCAgMTQsCisgICAgIDI2LCAgNTcsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbTIyc181MTJbXSA9IHsKKyAgICAgIDUsICAgNSwgICA1LCAgIDYsICAgNSwgICA3LCAgIDYsICAgNywKKyAgICAgIDksICAgOSwgIDExLCAgMTMsICAxNSwgIDIwLCAgMjQsICAzMywKKyAgICAgNDMsICA2MSwgIDg4LCAxNDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbDQ0XzIwNDhbXSA9IHsKKyAgICAgNSwgIDYsICA1LCAgIDYsICAgNSwgICA2LCAgIDYsICAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsICA5LAorICAgICA5LCAxMCwgMTEsICAxMSwgIDEzLCAgMTQsICAxNiwgIDE3LCAxOSwgMjIsIDI1LCAyOSwgMzMsIDM5LCA0NiwgNTQsCisgICAgNjQsIDc5LCA5OCwgMTIzLCAxNjEsIDIyMCwgMzIwLCA1MTIsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbTQ0XzUxMltdID0geworICAgICAzLCAgMiwgIDMsICAgMywgIDMsICA0LCAgMywgIDUsICA0LCAgNiwgIDcsICA4LCAxMCwgMTQsIDE4LCAyNSwKKyAgICAzNiwgNTUsIDk1LCAyMDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfczQ0XzEyOFtdID0geworICAgIDEsIDIsIDEsIDIsIDMsIDQsIDYsIDEwLCAyMywgNzYKK307CisKK2NvbnN0IFR3aW5WUU1vZGVUYWIgZmZfbWV0YXNvdW5kX21vZGUwODA2ID0geworICAgIHsKKyAgICAgICAgeyAgOCwgYmFya190YWJfczhfNjQsICAxMCwgZmNiOHMsIDEsIDUsIGNiMDgwNnNzMCwgY2IwODA2c3MxLCAyNyB9LAorICAgICAgICB7ICAyLCBiYXJrX3RhYl9tOF8yNTYsIDIwLCBmY2I4bSwgMiwgNSwgY2IwODA2c20wLCBjYjA4MDZzbTEsIDIyIH0sCisgICAgICAgIHsgIDEsIGJhcmtfdGFiX2w4XzUxMiwgMzAsIGZjYjhsLCAzLCA2LCBjYjA4MDZzbDAsIGNiMDgwNnNsMSwgMjQgfQorICAgIH0sCisgICAgNTEyLCAxMiwgbHNwOCwgMSwgNSwgMywgMywgc2hhcGU4LCA4LCAyOCwgMjAsIDYsIDIwMAorfTsKKworY29uc3QgVHdpblZRTW9kZVRhYiBmZl9tZXRhc291bmRfbW9kZTA4MDZzID0geworICAgIHsKKyAgICAgICAgeyAgOCwgYmFya190YWJfczhzXzY0LCAgMTAsIGZjYjhzcywgMSwgNSwgY2IwODA2c3MwLCBjYjA4MDZzczEsIDI3IH0sCisgICAgICAgIHsgIDIsIGJhcmtfdGFiX204c18yNTYsIDIwLCBmY2I4c20sIDIsIDUsIGNiMDgwNnNtMCwgY2IwODA2c20xLCAyMiB9LAorICAgICAgICB7ICAxLCBiYXJrX3RhYl9sOHNfNTEyLCAzMCwgZmNiOHNsLCAzLCA2LCBjYjA4MDZzbDAsIGNiMDgwNnNsMSwgMjQgfQorICAgIH0sCisgICAgNTEyLCAxMiwgbHNwOHMsIDEsIDUsIDMsIDMsIHNoYXBlOHMsIDgsIDI4LCAyMCwgNiwgMjAwCit9OworCitjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlMDgwOCA9IHsKKyAgICB7CisgICAgICAgIHsgOCwgYmFya190YWJfczhfNjQsICAxMCwgZmNiOHMsIDEsIDUsIGNiMDgwOHMwLCBjYjA4MDhzMSwgMTggfSwKKyAgICAgICAgeyAyLCBiYXJrX3RhYl9tOF8yNTYsIDIwLCBmY2I4bSwgMiwgNSwgY2IwODA4bTAsIGNiMDgwOG0xLCAxNiB9LAorICAgICAgICB7IDEsIGJhcmtfdGFiX2w4XzUxMiwgMzAsIGZjYjhsLCAzLCA2LCBjYjA4MDhsMCwgY2IwODA4bDEsIDE3IH0KKyAgICB9LAorICAgIDUxMiwgMTIsIGxzcDgsIDEsIDUsIDMsIDMsIHNoYXBlOCwgOCwgMjgsIDIwLCA2LCAyMDAKK307CisKK2NvbnN0IFR3aW5WUU1vZGVUYWIgZmZfbWV0YXNvdW5kX21vZGUwODA4cyA9IHsKKyAgICB7CisgICAgICAgIHsgIDgsIGJhcmtfdGFiX3M4c182NCwgIDEwLCBmY2I4c3MsIDEsIDUsIGNiMDgwOHNzMCwgY2IwODA4c3MxLCAxOCB9LAorICAgICAgICB7ICAyLCBiYXJrX3RhYl9tOHNfMjU2LCAyMCwgZmNiOHNtLCAyLCA1LCBjYjA4MDhzbTAsIGNiMDgwOHNtMSwgMTYgfSwKKyAgICAgICAgeyAgMSwgYmFya190YWJfbDhzXzUxMiwgMzAsIGZjYjhzbCwgMywgNiwgY2IwODA4c2wwLCBjYjA4MDhzbDEsIDE3IH0KKyAgICB9LAorICAgIDUxMiwgMTIsIGxzcDhzLCAxLCA1LCAzLCAzLCBzaGFwZThzLCA4LCAyOCwgMjAsIDYsIDIwMAorfTsKKworY29uc3QgVHdpblZRTW9kZVRhYiBmZl9tZXRhc291bmRfbW9kZTExMTAgPSB7CisgICAgeworICAgICAgICB7ICA4LCBiYXJrX3RhYl9zMTFfNjQsICAgOCwgZmNiMTFzLCAxLCA1LCBjYjExMTBzMCwgY2IxMTEwczEsIDIxIH0sCisgICAgICAgIHsgIDIsIGJhcmtfdGFiX20xMV8yNTYsIDE2LCBmY2IxMW0sIDIsIDUsIGNiMTExMG0wLCBjYjExMTBtMSwgMTggfSwKKyAgICAgICAgeyAgMSwgYmFya190YWJfbDExXzUxMiwgMjQsIGZjYjExbCwgMywgNiwgY2IxMTEwbDAsIGNiMTExMGwxLCAxOSB9CisgICAgfSwKKyAgICA1MTIsIDE2LCBsc3AxMSwgMSwgNiwgNCwgMywgc2hhcGUxMSwgOSwgMjgsIDIwLCA3LCAyMDAKK307CisKK2NvbnN0IFR3aW5WUU1vZGVUYWIgZmZfbWV0YXNvdW5kX21vZGUxMTEwcyA9IHsKKyAgICB7CisgICAgICAgIHsgIDgsIGJhcmtfdGFiX3MxMXNfNjQsICAxMCwgZmNiMTFzcywgMSwgNSwgY2IxMTEwc3MwLCBjYjExMTBzczEsIDIxIH0sCisgICAgICAgIHsgIDIsIGJhcmtfdGFiX20xMXNfMjU2LCAyMCwgZmNiMTFzbSwgMiwgNSwgY2IxMTEwc20wLCBjYjExMTBzbTEsIDE4IH0sCisgICAgICAgIHsgIDEsIGJhcmtfdGFiX2wxMXNfNTEyLCAzMCwgZmNiMTFzbCwgMywgNiwgY2IxMTEwc2wwLCBjYjExMTBzbDEsIDIwIH0KKyAgICB9LAorICAgIDUxMiwgMTYsIGxzcDExcywgMSwgNiwgNCwgMywgc2hhcGUxMXMsIDksIDM2LCAzMCwgNywgMjAwCit9OworCitjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlMTYxNiA9IHsKKyAgICB7CisgICAgICAgIHsgOCwgYmFya190YWJfczE2XzEyOCwgIDEwLCBmY2IxNnMsIDEsIDUsIGNiMTYxNnMwLCBjYjE2MTZzMSwgMTYgfSwKKyAgICAgICAgeyAyLCBiYXJrX3RhYl9tMTZfNTEyLCAgMjQsIGZjYjE2bSwgMiwgNSwgY2IxNjE2bTAsIGNiMTYxNm0xLCAxNSB9LAorICAgICAgICB7IDEsIGJhcmtfdGFiX2wxNl8xMDI0LCAzMCwgZmNiMTZsLCAzLCA2LCBjYjE2MTZsMCwgY2IxNjE2bDEsIDE2IH0KKyAgICB9LAorICAgIDEwMjQsIDE2LCBsc3AxNiwgMSwgNiwgNCwgMywgc2hhcGUxNiwgOSwgMjgsIDMwLCA3LCAyMDAKK307CisKK2NvbnN0IFR3aW5WUU1vZGVUYWIgZmZfbWV0YXNvdW5kX21vZGUxNjE2cyA9IHsKKyAgICB7CisgICAgICAgIHsgOCwgYmFya190YWJfczE2c18xMjgsICAxMCwgZmNiMTZzcywgMSwgNSwgY2IxNjE2c3MwLCBjYjE2MTZzczEsIDE2IH0sCisgICAgICAgIHsgMiwgYmFya190YWJfbTE2c181MTIsICAyMCwgZmNiMTZzbSwgMiwgNSwgY2IxNjE2c20wLCBjYjE2MTZzbTEsIDE1IH0sCisgICAgICAgIHsgMSwgYmFya190YWJfbDE2c18xMDI0LCAzMCwgZmNiMTZzbCwgMywgNiwgY2IxNjE2c2wwLCBjYjE2MTZzbDEsIDE2IH0KKyAgICB9LAorICAgIDEwMjQsIDE2LCBsc3AxNiwgMSwgNiwgNCwgMywgc2hhcGUxNnMsIDksIDU2LCA2MCwgNywgMjAwCit9OworCitjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlMjIyNCA9IHsKKyAgICB7CisgICAgICAgIHsgOCwgYmFya190YWJfczIyXzEyOCwgIDEwLCBmY2IyMnMsIDEsIDYsIGNiMjIyNHMwLCBjYjIyMjRzMSwgMTUgfSwKKyAgICAgICAgeyAyLCBiYXJrX3RhYl9tMjJfNTEyLCAgMjAsIGZjYjIybSwgMiwgNiwgY2IyMjI0bTAsIGNiMjIyNG0xLCAxNCB9LAorICAgICAgICB7IDEsIGJhcmtfdGFiX2wyMl8xMDI0LCAzMiwgZmNiMjJsLCA0LCA2LCBjYjIyMjRsMCwgY2IyMjI0bDEsIDE1IH0KKyAgICB9LAorICAgIDEwMjQsIDE2LCBsc3AyMiwgMSwgNiwgNCwgMywgc2hhcGUyMiwgOSwgNTYsIDM2LCA3LCAyMDAKK307CisKK2NvbnN0IFR3aW5WUU1vZGVUYWIgZmZfbWV0YXNvdW5kX21vZGUyMjI0cyA9IHsKKyAgICB7CisgICAgICAgIHsgOCwgYmFya190YWJfczIyc18xMjgsICAxMCwgZmNiMjJzcywgMSwgNiwgY2IyMjI0c3MwLCBjYjIyMjRzczEsIDE1IH0sCisgICAgICAgIHsgMiwgYmFya190YWJfbTIyc181MTIsICAyMCwgZmNiMjJzbSwgMiwgNiwgY2IyMjI0c20wLCBjYjIyMjRzbTEsIDE0IH0sCisgICAgICAgIHsgMSwgYmFya190YWJfbDIyc18xMDI0LCAzMiwgZmNiMjJzbCwgNCwgNiwgY2IyMjI0c2wwLCBjYjIyMjRzbDEsIDE1IH0KKyAgICB9LAorICAgIDEwMjQsIDE2LCBsc3AyMnMsIDEsIDYsIDQsIDMsIHNoYXBlMjJzLCA5LCA1NiwgMzYsIDcsIDIwMAorfTsKKworY29uc3QgVHdpblZRTW9kZVRhYiBmZl9tZXRhc291bmRfbW9kZTQ0MzIgPSB7CisgICAgeworICAgICAgICB7IDE2LCBiYXJrX3RhYl9zNDRfMTI4LCAgMTAsIGZjYjQ0c3MsIDEsIDYsIGNiNDQzMnMwLCBjYjQ0MzJzMSwgMjMgfSwKKyAgICAgICAgeyAgNCwgYmFya190YWJfbTQ0XzUxMiwgIDIwLCBmY2I0NHNtLCAyLCA2LCBjYjQ0MzJtMCwgY2I0NDMybTEsIDIxIH0sCisgICAgICAgIHsgIDEsIGJhcmtfdGFiX2w0NF8yMDQ4LCA0MCwgZmNiNDRzbCwgNCwgNiwgY2I0NDMybDAsIGNiNDQzMmwxLCAyMiB9CisgICAgfSwKKyAgICAyMDQ4LCAyMCwgbHNwNDRzLCAxLCA2LCA0LCA0LCBzaGFwZTQ0cywgOSwgODQsIDU0LCA3LCAyMDAsCit9OworCitjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlNDQzMnMgPSB7CisgICAgeworICAgICAgICB7IDE2LCBiYXJrX3RhYl9zNDRfMTI4LCAgMTAsIGZjYjQ0c3MsIDEsIDYsIGNiNDQzMnMwLCBjYjQ0MzJzMSwgMjMgfSwKKyAgICAgICAgeyAgNCwgYmFya190YWJfbTQ0XzUxMiwgIDIwLCBmY2I0NHNtLCAyLCA2LCBjYjQ0MzJtMCwgY2I0NDMybTEsIDIxIH0sCisgICAgICAgIHsgIDEsIGJhcmtfdGFiX2w0NF8yMDQ4LCA0MCwgZmNiNDRzbCwgNCwgNiwgY2I0NDMybDAsIGNiNDQzMmwxLCAyMiB9CisgICAgfSwKKyAgICAyMDQ4LCAyMCwgbHNwNDRzLCAxLCA2LCA0LCA0LCBzaGFwZTQ0cywgOSwgODQsIDU0LCA3LCAyMDAsCit9OworCitjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlNDQ0MCA9IHsKKyAgICB7CisgICAgICAgIHsgMTYsIGJhcmtfdGFiX3M0NF8xMjgsICAxMCwgZmNiNDRzcywgMSwgNiwgY2I0NDQwc3MwLCBjYjQ0NDBzczEsIDE4IH0sCisgICAgICAgIHsgIDQsIGJhcmtfdGFiX200NF81MTIsICAyMCwgZmNiNDRzbSwgMiwgNiwgY2I0NDQwc20wLCBjYjQ0NDBzbTEsIDE3IH0sCisgICAgICAgIHsgIDEsIGJhcmtfdGFiX2w0NF8yMDQ4LCA0MCwgZmNiNDRzbCwgNCwgNiwgY2I0NDQwc2wwLCBjYjQ0NDBzbDEsIDE3IH0KKyAgICB9LAorICAgIDIwNDgsIDIwLCBsc3A0NHMsIDEsIDYsIDQsIDQsIHNoYXBlNDRzLCA5LCA4NCwgNTQsIDcsIDIwMAorfTsKKworY29uc3QgVHdpblZRTW9kZVRhYiBmZl9tZXRhc291bmRfbW9kZTQ0NDBzID0geworICAgIHsKKyAgICAgICAgeyAxNiwgYmFya190YWJfczQ0XzEyOCwgIDEwLCBmY2I0NHNzLCAxLCA2LCBjYjQ0NDBzczAsIGNiNDQ0MHNzMSwgMTggfSwKKyAgICAgICAgeyAgNCwgYmFya190YWJfbTQ0XzUxMiwgIDIwLCBmY2I0NHNtLCAyLCA2LCBjYjQ0NDBzbTAsIGNiNDQ0MHNtMSwgMTcgfSwKKyAgICAgICAgeyAgMSwgYmFya190YWJfbDQ0XzIwNDgsIDQwLCBmY2I0NHNsLCA0LCA2LCBjYjQ0NDBzbDAsIGNiNDQ0MHNsMSwgMTcgfQorICAgIH0sCisgICAgMjA0OCwgMjAsIGxzcDQ0cywgMSwgNiwgNCwgNCwgc2hhcGU0NHMsIDksIDg0LCA1NCwgNywgMjAwCit9OworCitjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlNDQ0OCA9IHsKKyAgICB7CisgICAgICAgIHsgMTYsIGJhcmtfdGFiX3M0NF8xMjgsICAxMCwgZmNiNDRzcywgMSwgNiwgY2I0NDQ4c3MwLCBjYjQ0NDhzczEsIDE1IH0sCisgICAgICAgIHsgIDQsIGJhcmtfdGFiX200NF81MTIsICAyMCwgZmNiNDRzbSwgMiwgNiwgY2I0NDQ4c20wLCBjYjQ0NDhzbTEsIDE0IH0sCisgICAgICAgIHsgIDEsIGJhcmtfdGFiX2w0NF8yMDQ4LCA0MCwgZmNiNDRzbCwgNCwgNiwgY2I0NDQ4c2wwLCBjYjQ0NDhzbDEsIDE0IH0KKyAgICB9LAorICAgIDIwNDgsIDIwLCBsc3A0NHMsIDEsIDYsIDQsIDQsIHNoYXBlNDRzLCA5LCA4NCwgNTQsIDcsIDIwMAorfTsKKworY29uc3QgVHdpblZRTW9kZVRhYiBmZl9tZXRhc291bmRfbW9kZTQ0NDhzID0geworICAgIHsKKyAgICAgICAgeyAxNiwgYmFya190YWJfczQ0XzEyOCwgIDEwLCBmY2I0NHNzLCAxLCA2LCBjYjQ0NDhzczAsIGNiNDQ0OHNzMSwgMTUgfSwKKyAgICAgICAgeyAgNCwgYmFya190YWJfbTQ0XzUxMiwgIDIwLCBmY2I0NHNtLCAyLCA2LCBjYjQ0NDhzbTAsIGNiNDQ0OHNtMSwgMTQgfSwKKyAgICAgICAgeyAgMSwgYmFya190YWJfbDQ0XzIwNDgsIDQwLCBmY2I0NHNsLCA0LCA2LCBjYjQ0NDhzbDAsIGNiNDQ0OHNsMSwgMTQgfQorICAgIH0sCisgICAgMjA0OCwgMjAsIGxzcDQ0cywgMSwgNiwgNCwgNCwgc2hhcGU0NHMsIDksIDg0LCA1NCwgNywgMjAwCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWV0YXNvdW5kX2RhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21ldGFzb3VuZF9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzMzQxMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21ldGFzb3VuZF9kYXRhLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIE1ldGFTb3VuZCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTUVUQVNPVU5EX0RBVEFfSAorI2RlZmluZSBBVkNPREVDX01FVEFTT1VORF9EQVRBX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAidHdpbnZxLmgiCisKK2V4dGVybiBjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlMDgwNjsKK2V4dGVybiBjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlMDgwNnM7CitleHRlcm4gY29uc3QgVHdpblZRTW9kZVRhYiBmZl9tZXRhc291bmRfbW9kZTA4MDg7CitleHRlcm4gY29uc3QgVHdpblZRTW9kZVRhYiBmZl9tZXRhc291bmRfbW9kZTA4MDhzOworZXh0ZXJuIGNvbnN0IFR3aW5WUU1vZGVUYWIgZmZfbWV0YXNvdW5kX21vZGUxMTEwOworZXh0ZXJuIGNvbnN0IFR3aW5WUU1vZGVUYWIgZmZfbWV0YXNvdW5kX21vZGUxMTEwczsKK2V4dGVybiBjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlMTYxNjsKK2V4dGVybiBjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlMTYxNnM7CitleHRlcm4gY29uc3QgVHdpblZRTW9kZVRhYiBmZl9tZXRhc291bmRfbW9kZTIyMjQ7CitleHRlcm4gY29uc3QgVHdpblZRTW9kZVRhYiBmZl9tZXRhc291bmRfbW9kZTIyMjRzOworZXh0ZXJuIGNvbnN0IFR3aW5WUU1vZGVUYWIgZmZfbWV0YXNvdW5kX21vZGUyMjMyOworZXh0ZXJuIGNvbnN0IFR3aW5WUU1vZGVUYWIgZmZfbWV0YXNvdW5kX21vZGUyMjMyczsKK2V4dGVybiBjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlNDQzMjsKK2V4dGVybiBjb25zdCBUd2luVlFNb2RlVGFiIGZmX21ldGFzb3VuZF9tb2RlNDQzMnM7CitleHRlcm4gY29uc3QgVHdpblZRTW9kZVRhYiBmZl9tZXRhc291bmRfbW9kZTQ0NDA7CitleHRlcm4gY29uc3QgVHdpblZRTW9kZVRhYiBmZl9tZXRhc291bmRfbW9kZTQ0NDBzOworZXh0ZXJuIGNvbnN0IFR3aW5WUU1vZGVUYWIgZmZfbWV0YXNvdW5kX21vZGU0NDQ4OworZXh0ZXJuIGNvbnN0IFR3aW5WUU1vZGVUYWIgZmZfbWV0YXNvdW5kX21vZGU0NDQ4czsKKworI2VuZGlmIC8qIEFWQ09ERUNfTUVUQVNPVU5EX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWljcm9kdmRkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pY3JvZHZkZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwMzRhMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pY3JvZHZkZGVjLmMKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQ2zDqW1lbnQgQsWTc2NoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1pY3JvRFZEIHN1YnRpdGxlIGRlY29kZXIKKyAqCisgKiBCYXNlZCBvbiB0aGUgc3BlY2lmaWNhdGlvbnMgZm91bmQgaGVyZToKKyAqIGh0dHBzOi8vdHJhYy52aWRlb2xhbi5vcmcvdmxjL3RpY2tldC8xODI1I2NvbW1lbnQ6NgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYXNzLmgiCisKK3N0YXRpYyBpbnQgaW5kZXhvZihjb25zdCBjaGFyICpzLCBpbnQgYykKK3sKKyAgICBjaGFyICpmID0gc3RyY2hyKHMsIGMpOworICAgIHJldHVybiBmID8gKGYgLSBzKSA6IC0xOworfQorCitzdHJ1Y3QgbWljcm9kdmRfdGFnIHsKKyAgICBjaGFyIGtleTsKKyAgICBpbnQgcGVyc2lzdGVudDsKKyAgICB1aW50MzJfdCBkYXRhMTsKKyAgICB1aW50MzJfdCBkYXRhMjsKKyAgICBjaGFyICpkYXRhX3N0cmluZzsKKyAgICBpbnQgZGF0YV9zdHJpbmdfbGVuOworfTsKKworI2RlZmluZSBNSUNST0RWRF9QRVJTSVNURU5UX09GRiAgICAgMAorI2RlZmluZSBNSUNST0RWRF9QRVJTSVNURU5UX09OICAgICAgMQorI2RlZmluZSBNSUNST0RWRF9QRVJTSVNURU5UX09QRU5FRCAgMgorCisvLyBDb2xvciwgRm9udCwgU2l6ZSwgY0hhcnNldCwgc3RZbGUsIFBvc2l0aW9uLCBjT29yZGluYXRlCisjZGVmaW5lIE1JQ1JPRFZEX1RBR1MgImNmc2h5WXBvIgorCitzdGF0aWMgdm9pZCBtaWNyb2R2ZF9zZXRfdGFnKHN0cnVjdCBtaWNyb2R2ZF90YWcgKnRhZ3MsIHN0cnVjdCBtaWNyb2R2ZF90YWcgdGFnKQoreworICAgIGludCB0YWdfaW5kZXggPSBpbmRleG9mKE1JQ1JPRFZEX1RBR1MsIHRhZy5rZXkpOworCisgICAgaWYgKHRhZ19pbmRleCA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBtZW1jcHkoJnRhZ3NbdGFnX2luZGV4XSwgJnRhZywgc2l6ZW9mKHRhZykpOworfQorCisvLyBpdGFsaWMsIGJvbGQsIHVuZGVybGluZSwgc3RyaWtlLXRocm91Z2gKKyNkZWZpbmUgTUlDUk9EVkRfU1RZTEVTICJpYnVzIgorCisvKiBzb21lIHNhbXBsZXMgaGF2ZSBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggYSAvIGluZGljYXRpbmcgbm9uIHBlcnNpc3RlbnQgaXRhbGljCisgKiBtYXJrZXIgKi8KK3N0YXRpYyBjaGFyICpjaGVja19mb3JfaXRhbGljX3NsYXNoX21hcmtlcihzdHJ1Y3QgbWljcm9kdmRfdGFnICp0YWdzLCBjaGFyICpzKQoreworICAgIGlmICgqcyA9PSAnLycpIHsKKyAgICAgICAgc3RydWN0IG1pY3JvZHZkX3RhZyB0YWcgPSB0YWdzW2luZGV4b2YoTUlDUk9EVkRfVEFHUywgJ3knKV07CisgICAgICAgIHRhZy5rZXkgPSAneSc7CisgICAgICAgIHRhZy5kYXRhMSB8PSAxIDw8IDAgLyogJ2knIHBvc2l0aW9uIGluIE1JQ1JPRFZEX1NUWUxFUyAqLzsKKyAgICAgICAgbWljcm9kdmRfc2V0X3RhZyh0YWdzLCB0YWcpOworICAgICAgICBzKys7CisgICAgfQorICAgIHJldHVybiBzOworfQorCitzdGF0aWMgY2hhciAqbWljcm9kdmRfbG9hZF90YWdzKHN0cnVjdCBtaWNyb2R2ZF90YWcgKnRhZ3MsIGNoYXIgKnMpCit7CisgICAgcyA9IGNoZWNrX2Zvcl9pdGFsaWNfc2xhc2hfbWFya2VyKHRhZ3MsIHMpOworCisgICAgd2hpbGUgKCpzID09ICd7JykgeworICAgICAgICBjaGFyICpzdGFydCA9IHM7CisgICAgICAgIGNoYXIgdGFnX2NoYXIgPSAqKHMgKyAxKTsKKyAgICAgICAgc3RydWN0IG1pY3JvZHZkX3RhZyB0YWcgPSB7MH07CisKKyAgICAgICAgaWYgKCF0YWdfY2hhciB8fCAqKHMgKyAyKSAhPSAnOicpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcyArPSAzOworCisgICAgICAgIHN3aXRjaCAodGFnX2NoYXIpIHsKKworICAgICAgICAvKiBTdHlsZSAqLworICAgICAgICBjYXNlICdZJzoKKyAgICAgICAgICAgIHRhZy5wZXJzaXN0ZW50ID0gTUlDUk9EVkRfUEVSU0lTVEVOVF9PTjsKKyAgICAgICAgY2FzZSAneSc6CisgICAgICAgICAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJ30nKSB7CisgICAgICAgICAgICAgICAgaW50IHN0eWxlX2luZGV4ID0gaW5kZXhvZihNSUNST0RWRF9TVFlMRVMsICpzKTsKKworICAgICAgICAgICAgICAgIGlmIChzdHlsZV9pbmRleCA+PSAwKQorICAgICAgICAgICAgICAgICAgICB0YWcuZGF0YTEgfD0gKDEgPDwgc3R5bGVfaW5kZXgpOworICAgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqcyAhPSAnfScpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBXZSBtdXN0IGRpc3Rpbmd1aXNoIHBlcnNpc3RlbnQgYW5kIG5vbi1wZXJzaXN0ZW50IHN0eWxlcworICAgICAgICAgICAgICogdG8gaGFuZGxlIHRoaXMga2luZCBvZiBzdHlsZSB0YWdzOiB7eTppYn17WTp1c30gKi8KKyAgICAgICAgICAgIHRhZy5rZXkgPSB0YWdfY2hhcjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIENvbG9yICovCisgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgdGFnLnBlcnNpc3RlbnQgPSBNSUNST0RWRF9QRVJTSVNURU5UX09OOworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgIHdoaWxlICgqcyA9PSAnJCcgfHwgKnMgPT0gJyMnKQorICAgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgIHRhZy5kYXRhMSA9IHN0cnRvbChzLCAmcywgMTYpICYgMHgwMGZmZmZmZjsKKyAgICAgICAgICAgIGlmICgqcyAhPSAnfScpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB0YWcua2V5ID0gJ2MnOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogRm9udCBuYW1lICovCisgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgdGFnLnBlcnNpc3RlbnQgPSBNSUNST0RWRF9QRVJTSVNURU5UX09OOworICAgICAgICBjYXNlICdmJzogeworICAgICAgICAgICAgaW50IGxlbiA9IGluZGV4b2YocywgJ30nKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdGFnLmRhdGFfc3RyaW5nID0gczsKKyAgICAgICAgICAgIHRhZy5kYXRhX3N0cmluZ19sZW4gPSBsZW47CisgICAgICAgICAgICBzICs9IGxlbjsKKyAgICAgICAgICAgIHRhZy5rZXkgPSAnZic7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZvbnQgc2l6ZSAqLworICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgIHRhZy5wZXJzaXN0ZW50ID0gTUlDUk9EVkRfUEVSU0lTVEVOVF9PTjsKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICB0YWcuZGF0YTEgPSBzdHJ0b2wocywgJnMsIDEwKTsKKyAgICAgICAgICAgIGlmICgqcyAhPSAnfScpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB0YWcua2V5ID0gJ3MnOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogQ2hhcnNldCAqLworICAgICAgICBjYXNlICdIJzogeworICAgICAgICAgICAgLy9UT0RPOiBub3QgeWV0IGhhbmRsZWQsIGp1c3QgcGFyc2VkLgorICAgICAgICAgICAgaW50IGxlbiA9IGluZGV4b2YocywgJ30nKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdGFnLmRhdGFfc3RyaW5nID0gczsKKyAgICAgICAgICAgIHRhZy5kYXRhX3N0cmluZ19sZW4gPSBsZW47CisgICAgICAgICAgICBzICs9IGxlbjsKKyAgICAgICAgICAgIHRhZy5rZXkgPSAnaCc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFBvc2l0aW9uICovCisgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgdGFnLnBlcnNpc3RlbnQgPSBNSUNST0RWRF9QRVJTSVNURU5UX09OOworICAgICAgICAgICAgdGFnLmRhdGExID0gKCpzKysgPT0gJzEnKTsKKyAgICAgICAgICAgIGlmICgqcyAhPSAnfScpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB0YWcua2V5ID0gJ3AnOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogQ29vcmRpbmF0ZXMgKi8KKyAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICB0YWcucGVyc2lzdGVudCA9IE1JQ1JPRFZEX1BFUlNJU1RFTlRfT047CisgICAgICAgICAgICB0YWcuZGF0YTEgPSBzdHJ0b2wocywgJnMsIDEwKTsKKyAgICAgICAgICAgIGlmICgqcyAhPSAnLCcpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzKys7CisgICAgICAgICAgICB0YWcuZGF0YTIgPSBzdHJ0b2wocywgJnMsIDEwKTsKKyAgICAgICAgICAgIGlmICgqcyAhPSAnfScpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB0YWcua2V5ID0gJ28nOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogICAgLyogVW5rbm93biB0YWcsIHdlIGNvbnNpZGVyIGl0J3MgdGV4dCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFnLmtleSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OworCisgICAgICAgIG1pY3JvZHZkX3NldF90YWcodGFncywgdGFnKTsKKyAgICAgICAgcysrOworICAgIH0KKyAgICByZXR1cm4gY2hlY2tfZm9yX2l0YWxpY19zbGFzaF9tYXJrZXIodGFncywgcyk7Cit9CisKK3N0YXRpYyB2b2lkIG1pY3JvZHZkX29wZW5fdGFncyhBVkJQcmludCAqbmV3X2xpbmUsIHN0cnVjdCBtaWNyb2R2ZF90YWcgKnRhZ3MpCit7CisgICAgaW50IGksIHNpZHg7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihNSUNST0RWRF9UQUdTKSAtIDE7IGkrKykgeworICAgICAgICBpZiAodGFnc1tpXS5wZXJzaXN0ZW50ID09IE1JQ1JPRFZEX1BFUlNJU1RFTlRfT1BFTkVEKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHN3aXRjaCAodGFnc1tpXS5rZXkpIHsKKyAgICAgICAgY2FzZSAnWSc6CisgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgZm9yIChzaWR4ID0gMDsgc2lkeCA8IHNpemVvZihNSUNST0RWRF9TVFlMRVMpIC0gMTsgc2lkeCsrKQorICAgICAgICAgICAgICAgIGlmICh0YWdzW2ldLmRhdGExICYgKDEgPDwgc2lkeCkpCisgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYobmV3X2xpbmUsICJ7XFwlYzF9IiwgTUlDUk9EVkRfU1RZTEVTW3NpZHhdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgYXZfYnByaW50ZihuZXdfbGluZSwgIntcXGMmSCUwNlgmfSIsIHRhZ3NbaV0uZGF0YTEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICBhdl9icHJpbnRmKG5ld19saW5lLCAie1xcZm4lLipzfSIsCisgICAgICAgICAgICAgICAgICAgICAgIHRhZ3NbaV0uZGF0YV9zdHJpbmdfbGVuLCB0YWdzW2ldLmRhdGFfc3RyaW5nKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgYXZfYnByaW50ZihuZXdfbGluZSwgIntcXGZzJWR9IiwgdGFnc1tpXS5kYXRhMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgIGlmICh0YWdzW2ldLmRhdGExID09IDApCisgICAgICAgICAgICAgICAgYXZfYnByaW50ZihuZXdfbGluZSwgIntcXGFuOH0iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ28nOgorICAgICAgICAgICAgYXZfYnByaW50ZihuZXdfbGluZSwgIntcXHBvcyglZCwlZCl9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGFnc1tpXS5kYXRhMSwgdGFnc1tpXS5kYXRhMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFnc1tpXS5wZXJzaXN0ZW50ID09IE1JQ1JPRFZEX1BFUlNJU1RFTlRfT04pCisgICAgICAgICAgICB0YWdzW2ldLnBlcnNpc3RlbnQgPSBNSUNST0RWRF9QRVJTSVNURU5UX09QRU5FRDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1pY3JvZHZkX2Nsb3NlX25vX3BlcnNpc3RlbnRfdGFncyhBVkJQcmludCAqbmV3X2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1pY3JvZHZkX3RhZyAqdGFncykKK3sKKyAgICBpbnQgaSwgc2lkeDsKKworICAgIGZvciAoaSA9IHNpemVvZihNSUNST0RWRF9UQUdTKSAtIDI7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGlmICh0YWdzW2ldLnBlcnNpc3RlbnQgIT0gTUlDUk9EVkRfUEVSU0lTVEVOVF9PRkYpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgc3dpdGNoICh0YWdzW2ldLmtleSkgeworCisgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgZm9yIChzaWR4ID0gc2l6ZW9mKE1JQ1JPRFZEX1NUWUxFUykgLSAyOyBzaWR4ID49IDA7IHNpZHgtLSkKKyAgICAgICAgICAgICAgICBpZiAodGFnc1tpXS5kYXRhMSAmICgxIDw8IHNpZHgpKQorICAgICAgICAgICAgICAgICAgICBhdl9icHJpbnRmKG5ld19saW5lLCAie1xcJWMwfSIsIE1JQ1JPRFZEX1NUWUxFU1tzaWR4XSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgIGF2X2JwcmludGYobmV3X2xpbmUsICJ7XFxjfSIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICBhdl9icHJpbnRmKG5ld19saW5lLCAie1xcZm59Iik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgIGF2X2JwcmludGYobmV3X2xpbmUsICJ7XFxmc30iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRhZ3NbaV0ua2V5ID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbWljcm9kdmRfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X3N1Yl9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVlN1YnRpdGxlICpzdWIgPSBkYXRhOworICAgIEFWQlByaW50IG5ld19saW5lOworICAgIGNoYXIgKmxpbmUgPSBhdnBrdC0+ZGF0YTsKKyAgICBjaGFyICplbmQgPSBhdnBrdC0+ZGF0YSArIGF2cGt0LT5zaXplOworICAgIHN0cnVjdCBtaWNyb2R2ZF90YWcgdGFnc1tzaXplb2YoTUlDUk9EVkRfVEFHUykgLSAxXSA9IHt7MH19OworCisgICAgaWYgKGF2cGt0LT5zaXplIDw9IDApCisgICAgICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKKworICAgIGF2X2JwcmludF9pbml0KCZuZXdfbGluZSwgMCwgMjA0OCk7CisKKyAgICAvLyBzdWJ0aXRsZSBjb250ZW50CisgICAgd2hpbGUgKGxpbmUgPCBlbmQgJiYgKmxpbmUpIHsKKworICAgICAgICAvLyBwYXJzZSBNaWNyb0RWRCB0YWdzLCBhbmQgb3BlbiB0aGVtIGluIEFTUworICAgICAgICBsaW5lID0gbWljcm9kdmRfbG9hZF90YWdzKHRhZ3MsIGxpbmUpOworICAgICAgICBtaWNyb2R2ZF9vcGVuX3RhZ3MoJm5ld19saW5lLCB0YWdzKTsKKworICAgICAgICAvLyBzaW1wbGUgY29weSB1bnRpbCBFT0wgb3IgZm9yY2VkIGNhcnJpYWdlIHJldHVybgorICAgICAgICB3aGlsZSAobGluZSA8IGVuZCAmJiAqbGluZSAmJiAqbGluZSAhPSAnfCcpIHsKKyAgICAgICAgICAgIGF2X2JwcmludF9jaGFycygmbmV3X2xpbmUsICpsaW5lLCAxKTsKKyAgICAgICAgICAgIGxpbmUrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxpbmUgc3BsaXQKKyAgICAgICAgaWYgKGxpbmUgPCBlbmQgJiYgKmxpbmUgPT0gJ3wnKSB7CisgICAgICAgICAgICBtaWNyb2R2ZF9jbG9zZV9ub19wZXJzaXN0ZW50X3RhZ3MoJm5ld19saW5lLCB0YWdzKTsKKyAgICAgICAgICAgIGF2X2JwcmludGYoJm5ld19saW5lLCAiXFxOIik7CisgICAgICAgICAgICBsaW5lKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5ld19saW5lLmxlbikgeworICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgaW50NjRfdCBzdGFydCAgICA9IGF2cGt0LT5wdHM7CisgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gYXZwa3QtPmR1cmF0aW9uOworICAgICAgICAgICAgaW50IHRzX3N0YXJ0ICAgICA9IGF2X3Jlc2NhbGVfcShzdGFydCwgICAgYXZjdHgtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsMTAwfSk7CisgICAgICAgICAgICBpbnQgdHNfZHVyYXRpb24gID0gZHVyYXRpb24gIT0gLTEgPworICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShkdXJhdGlvbiwgYXZjdHgtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsMTAwfSkgOiAtMTsKKworICAgICAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3RfYnByaW50KHN1YiwgJm5ld19saW5lLCB0c19zdGFydCwgdHNfZHVyYXRpb24pOworICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJm5ld19saW5lLCBOVUxMKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgICpnb3Rfc3ViX3B0ciA9IHN1Yi0+bnVtX3JlY3RzID4gMDsKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBpbnQgbWljcm9kdmRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGksIHNpZHg7CisgICAgQVZCUHJpbnQgZm9udF9idWY7CisgICAgaW50IGZvbnRfc2l6ZSAgICA9IEFTU19ERUZBVUxUX0ZPTlRfU0laRTsKKyAgICBpbnQgY29sb3IgICAgICAgID0gQVNTX0RFRkFVTFRfQ09MT1I7CisgICAgaW50IGJvbGQgICAgICAgICA9IEFTU19ERUZBVUxUX0JPTEQ7CisgICAgaW50IGl0YWxpYyAgICAgICA9IEFTU19ERUZBVUxUX0lUQUxJQzsKKyAgICBpbnQgdW5kZXJsaW5lICAgID0gQVNTX0RFRkFVTFRfVU5ERVJMSU5FOworICAgIGludCBhbGlnbm1lbnQgICAgPSBBU1NfREVGQVVMVF9BTElHTk1FTlQ7CisgICAgc3RydWN0IG1pY3JvZHZkX3RhZyB0YWdzW3NpemVvZihNSUNST0RWRF9UQUdTKSAtIDFdID0ge3swfX07CisKKyAgICBhdl9icHJpbnRfaW5pdCgmZm9udF9idWYsIDAsIEFWX0JQUklOVF9TSVpFX0FVVE9NQVRJQyk7CisgICAgYXZfYnByaW50ZigmZm9udF9idWYsICIlcyIsIEFTU19ERUZBVUxUX0ZPTlQpOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgbWljcm9kdmRfbG9hZF90YWdzKHRhZ3MsIGF2Y3R4LT5leHRyYWRhdGEpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKE1JQ1JPRFZEX1RBR1MpIC0gMTsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGF2X3RvbG93ZXIodGFnc1tpXS5rZXkpKSB7CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgICBmb3IgKHNpZHggPSAwOyBzaWR4IDwgc2l6ZW9mKE1JQ1JPRFZEX1NUWUxFUykgLSAxOyBzaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ3NbaV0uZGF0YTEgJiAoMSA8PCBzaWR4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChNSUNST0RWRF9TVFlMRVNbc2lkeF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOiBpdGFsaWMgICAgPSAxOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOiBib2xkICAgICAgPSAxOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOiB1bmRlcmxpbmUgPSAxOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnYyc6IGNvbG9yICAgICA9IHRhZ3NbaV0uZGF0YTE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAncyc6IGZvbnRfc2l6ZSA9IHRhZ3NbaV0uZGF0YTE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAncCc6IGFsaWdubWVudCA9ICAgICAgICAgICAgIDg7IGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRfY2xlYXIoJmZvbnRfYnVmKTsKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRmKCZmb250X2J1ZiwgIiUuKnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnc1tpXS5kYXRhX3N0cmluZ19sZW4sIHRhZ3NbaV0uZGF0YV9zdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmZl9hc3Nfc3VidGl0bGVfaGVhZGVyKGF2Y3R4LCBmb250X2J1Zi5zdHIsIGZvbnRfc2l6ZSwgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTX0RFRkFVTFRfQkFDS19DT0xPUiwgYm9sZCwgaXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZSwgYWxpZ25tZW50KTsKK30KKworQVZDb2RlYyBmZl9taWNyb2R2ZF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAibWljcm9kdmQiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWljcm9EVkQgc3VidGl0bGUiKSwKKyAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NSUNST0RWRCwKKyAgICAuaW5pdCAgICAgICAgID0gbWljcm9kdmRfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgID0gbWljcm9kdmRfZGVjb2RlX2ZyYW1lLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21pbWljLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9taW1pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NzI0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9taW1pYy5jCkBAIC0wLDAgKzEsNDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1ICBPbGUgQW5kcsOpIFZhZGxhIFJhdm7DpXMgPG9sZWF2ckBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggIFJhbWlybyBQb2xsYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisjaW5jbHVkZSAiaHBlbGRzcC5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKworI2RlZmluZSBNSU1JQ19IRUFERVJfU0laRSAgIDIwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisKKyAgICBpbnQgICAgICAgICAgICAgbnVtX3ZibG9ja3NbM107CisgICAgaW50ICAgICAgICAgICAgIG51bV9oYmxvY2tzWzNdOworCisgICAgdm9pZCAgICAgICAgICAgKnN3YXBfYnVmOworICAgIGludCAgICAgICAgICAgICBzd2FwX2J1Zl9zaXplOworCisgICAgaW50ICAgICAgICAgICAgIGN1cl9pbmRleDsKKyAgICBpbnQgICAgICAgICAgICAgcHJldl9pbmRleDsKKworICAgIFRocmVhZEZyYW1lICAgICBmcmFtZXMgICAgIFsxNl07CisgICAgQVZQaWN0dXJlICAgICAgIGZsaXBwZWRfcHRyc1sxNl07CisKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGRjdF9ibG9jaylbNjRdOworCisgICAgR2V0Qml0Q29udGV4dCAgIGdiOworICAgIFNjYW5UYWJsZSAgICAgICBzY2FudGFibGU7CisgICAgQmxvY2tEU1BDb250ZXh0IGJkc3A7CisgICAgQnN3YXBEU1BDb250ZXh0IGJiZHNwOworICAgIEhwZWxEU1BDb250ZXh0ICBoZHNwOworICAgIElEQ1REU1BDb250ZXh0ICBpZHNwOworICAgIFZMQyAgICAgICAgICAgICB2bGM7CisKKyAgICAvKiBLZXB0IGluIHRoZSBjb250ZXh0IHNvIG11bHRpdGhyZWFkaW5nIGNhbiBoYXZlIGEgY29uc3RhbnQgdG8gcmVhZCBmcm9tICovCisgICAgaW50ICAgICAgICAgICAgIG5leHRfY3VyX2luZGV4OworICAgIGludCAgICAgICAgICAgICBuZXh0X3ByZXZfaW5kZXg7Cit9IE1pbWljQ29udGV4dDsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGh1ZmZjb2Rlc1tdID0geworICAgIDB4MDAwMDAwMGEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDBiLAorICAgIDB4MDAwMDAwMWIsIDB4MDAwMDAwMzgsIDB4MDAwMDAwNzgsIDB4MDAwMDAwNzksIDB4MDAwMDAwN2EsIDB4MDAwMDAwZjksCisgICAgMHgwMDAwMDBmYSwgMHgwMDAwMDNmYiwgMHgwMDAwMDdmOCwgMHgwMDAwMDdmOSwgMHgwMDAwMDdmYSwgMHgwMDAwMDdmYiwKKyAgICAweDAwMDAwZmY4LCAweDAwMDAwZmY5LCAweDAwMDAwMDAxLCAweDAwMDAwMDM5LCAweDAwMDAwMDdiLCAweDAwMDAwMGZiLAorICAgIDB4MDAwMDAxZjgsIDB4MDAwMDAxZjksIDB4MDAwMDBmZmEsIDB4MDAwMDBmZmIsIDB4MDAwMDFmZjgsIDB4MDAwMDFmZjksCisgICAgMHgwMDAwMWZmYSwgMHgwMDAwMWZmYiwgMHgwMDAwM2ZmOCwgMHgwMDAwM2ZmOSwgMHgwMDAwM2ZmYSwgMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDA0LCAweDAwMDAwMDNhLCAweDAwMDAwMWZhLCAweDAwMDAzZmZiLCAweDAwMDA3ZmY4LCAweDAwMDA3ZmY5LAorICAgIDB4MDAwMDdmZmEsIDB4MDAwMDdmZmIsIDB4MDAwMGZmZjgsIDB4MDAwMGZmZjksIDB4MDAwMGZmZmEsIDB4MDAwMGZmZmIsCisgICAgMHgwMDAxZmZmOCwgMHgwMDAxZmZmOSwgMHgwMDAxZmZmYSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwYywgMHgwMDAwMDBmOCwKKyAgICAweDAwMDAwMWZiLCAweDAwMDFmZmZiLCAweDAwMDNmZmY4LCAweDAwMDNmZmY5LCAweDAwMDNmZmZhLCAweDAwMDNmZmZiLAorICAgIDB4MDAwN2ZmZjgsIDB4MDAwN2ZmZjksIDB4MDAwN2ZmZmEsIDB4MDAwN2ZmZmIsIDB4MDAwZmZmZjgsIDB4MDAwZmZmZjksCisgICAgMHgwMDBmZmZmYSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxYSwgMHgwMDAwMDNmOCwgMHgwMDBmZmZmYiwgMHgwMDFmZmZmOCwKKyAgICAweDAwMWZmZmY5LCAweDAwMWZmZmZhLCAweDAwMWZmZmZiLCAweDAwM2ZmZmY4LCAweDAwM2ZmZmY5LCAweDAwM2ZmZmZhLAorICAgIDB4MDAzZmZmZmIsIDB4MDA3ZmZmZjgsIDB4MDA3ZmZmZjksIDB4MDA3ZmZmZmEsIDB4MDA3ZmZmZmIsIDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAzYiwgMHgwMDAwMDNmOSwgMHgwMGZmZmZmOCwgMHgwMGZmZmZmOSwgMHgwMGZmZmZmYSwgMHgwMGZmZmZmYiwKKyAgICAweDAxZmZmZmY4LCAweDAxZmZmZmY5LCAweDAxZmZmZmZhLCAweDAxZmZmZmZiLCAweDAzZmZmZmY4LCAweDAzZmZmZmY5LAorICAgIDB4MDNmZmZmZmEsIDB4MDNmZmZmZmIsIDB4MDdmZmZmZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAzZmEsIDB4MDdmZmZmZjksCisgICAgMHgwN2ZmZmZmYSwgMHgwN2ZmZmZmYiwgMHgwZmZmZmZmOCwgMHgwZmZmZmZmOSwgMHgwZmZmZmZmYSwgMHgwZmZmZmZmYiwKKyAgICAweDFmZmZmZmY4LCAweDFmZmZmZmY5LCAweDFmZmZmZmZhLCAweDFmZmZmZmZiLCAweDNmZmZmZmY4LCAweDNmZmZmZmY5LAorICAgIDB4M2ZmZmZmZmEsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBodWZmYml0c1tdID0geworICAgICA0LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAyLCAgNCwgIDUsICA2LCAgNywgIDcsICA3LCAgOCwKKyAgICAgOCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsICAyLCAgNiwgIDcsICA4LAorICAgICA5LCAgOSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgIDAsCisgICAgIDMsICA2LCAgOSwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNywgMTcsIDE3LCAgMCwgIDQsICA4LCAgOSwgMTcsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAgMCwgIDUsIDEwLCAyMCwgMjEsCisgICAgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsIDIzLCAyMywgMjMsIDIzLCAgMCwKKyAgICAgNiwgMTAsIDI0LCAyNCwgMjQsIDI0LCAyNSwgMjUsIDI1LCAyNSwgMjYsIDI2LAorICAgIDI2LCAyNiwgMjcsICAwLCAxMCwgMjcsIDI3LCAyNywgMjgsIDI4LCAyOCwgMjgsCisgICAgMjksIDI5LCAyOSwgMjksIDMwLCAzMCwgMzAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb2xfemFnWzY0XSA9IHsKKyAgICAgMCwgIDgsICAxLCAgMiwgIDksIDE2LCAyNCwgMTcsCisgICAgMTAsICAzLCAgNCwgMTEsIDE4LCAyNSwgMzIsIDQwLAorICAgIDMzLCAyNiwgMTksIDEyLCAgNSwgIDYsIDEzLCAyMCwKKyAgICAyNywgMzQsIDQxLCA0OCwgNTYsIDQ5LCA0MiwgMzUsCisgICAgMjgsIDIxLCAxNCwgIDcsIDE1LCAyMiwgMjksIDM2LAorICAgIDQzLCA1MCwgNTcsIDU4LCA1MSwgNDQsIDM3LCAzMCwKKyAgICAyMywgMzEsIDM4LCA0NSwgNTIsIDU5LCAzOSwgNDYsCisgICAgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzLAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IG1pbWljX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1pbWljQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGF2X2ZyZWVwKCZjdHgtPnN3YXBfYnVmKTsKKyAgICBjdHgtPnN3YXBfYnVmX3NpemUgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGN0eC0+ZnJhbWVzKTsgaSsrKSB7CisgICAgICAgIGlmIChjdHgtPmZyYW1lc1tpXS5mKQorICAgICAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGF2Y3R4LCAmY3R4LT5mcmFtZXNbaV0pOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZjdHgtPmZyYW1lc1tpXS5mKTsKKyAgICB9CisKKyAgICBpZiAoIWF2Y3R4LT5pbnRlcm5hbC0+aXNfY29weSkKKyAgICAgICAgZmZfZnJlZV92bGMoJmN0eC0+dmxjKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbWltaWNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1pbWljQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBpOworCisgICAgYXZjdHgtPmludGVybmFsLT5hbGxvY2F0ZV9wcm9ncmVzcyA9IDE7CisKKyAgICBjdHgtPnByZXZfaW5kZXggPSAwOworICAgIGN0eC0+Y3VyX2luZGV4ICA9IDE1OworCisgICAgaWYgKChyZXQgPSBpbml0X3ZsYygmY3R4LT52bGMsIDExLCBGRl9BUlJBWV9FTEVNUyhodWZmYml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICBodWZmYml0cywgMSwgMSwgaHVmZmNvZGVzLCA0LCA0LCAwKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgaW5pdGlhbGl6aW5nIHZsYyB0YWJsZVxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGZmX2Jsb2NrZHNwX2luaXQoJmN0eC0+YmRzcCwgYXZjdHgpOworICAgIGZmX2Jzd2FwZHNwX2luaXQoJmN0eC0+YmJkc3ApOworICAgIGZmX2hwZWxkc3BfaW5pdCgmY3R4LT5oZHNwLCBhdmN0eC0+ZmxhZ3MpOworICAgIGZmX2lkY3Rkc3BfaW5pdCgmY3R4LT5pZHNwLCBhdmN0eCk7CisgICAgZmZfaW5pdF9zY2FudGFibGUoY3R4LT5pZHNwLmlkY3RfcGVybXV0YXRpb24sICZjdHgtPnNjYW50YWJsZSwgY29sX3phZyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoY3R4LT5mcmFtZXMpOyBpKyspIHsKKyAgICAgICAgY3R4LT5mcmFtZXNbaV0uZiA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgIGlmICghY3R4LT5mcmFtZXNbaV0uZikgeworICAgICAgICAgICAgbWltaWNfZGVjb2RlX2VuZChhdmN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWltaWNfZGVjb2RlX3VwZGF0ZV90aHJlYWRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWQ29kZWNDb250ZXh0ICphdmN0eF9mcm9tKQoreworICAgIE1pbWljQ29udGV4dCAqZHN0ID0gYXZjdHgtPnByaXZfZGF0YSwgKnNyYyA9IGF2Y3R4X2Zyb20tPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKGF2Y3R4ID09IGF2Y3R4X2Zyb20pCisgICAgICAgIHJldHVybiAwOworCisgICAgZHN0LT5jdXJfaW5kZXggID0gc3JjLT5uZXh0X2N1cl9pbmRleDsKKyAgICBkc3QtPnByZXZfaW5kZXggPSBzcmMtPm5leHRfcHJldl9pbmRleDsKKworICAgIG1lbWNweShkc3QtPmZsaXBwZWRfcHRycywgc3JjLT5mbGlwcGVkX3B0cnMsIHNpemVvZihzcmMtPmZsaXBwZWRfcHRycykpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGRzdC0+ZnJhbWVzKTsgaSsrKSB7CisgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJmRzdC0+ZnJhbWVzW2ldKTsKKyAgICAgICAgaWYgKGkgIT0gc3JjLT5uZXh0X2N1cl9pbmRleCAmJiBzcmMtPmZyYW1lc1tpXS5mLT5kYXRhWzBdKSB7CisgICAgICAgICAgICByZXQgPSBmZl90aHJlYWRfcmVmX2ZyYW1lKCZkc3QtPmZyYW1lc1tpXSwgJnNyYy0+ZnJhbWVzW2ldKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGludDhfdCB2bGNkZWNfbG9va3VwWzldWzY0XSA9IHsKKyAgICB7ICAgIDAsIH0sCisgICAgeyAgIC0xLCAgIDEsIH0sCisgICAgeyAgIC0zLCAgIDMsICAgLTIsICAgMiwgfSwKKyAgICB7ICAgLTcsICAgNywgICAtNiwgICA2LCAgIC01LCAgIDUsICAgLTQsICAgNCwgfSwKKyAgICB7ICAtMTUsICAxNSwgIC0xNCwgIDE0LCAgLTEzLCAgMTMsICAtMTIsICAxMiwKKyAgICAgICAtMTEsICAxMSwgIC0xMCwgIDEwLCAgIC05LCAgIDksICAgLTgsICAgOCwgfSwKKyAgICB7ICAtMzEsICAzMSwgIC0zMCwgIDMwLCAgLTI5LCAgMjksICAtMjgsICAyOCwKKyAgICAgICAtMjcsICAyNywgIC0yNiwgIDI2LCAgLTI1LCAgMjUsICAtMjQsICAyNCwKKyAgICAgICAtMjMsICAyMywgIC0yMiwgIDIyLCAgLTIxLCAgMjEsICAtMjAsICAyMCwKKyAgICAgICAtMTksICAxOSwgIC0xOCwgIDE4LCAgLTE3LCAgMTcsICAtMTYsICAxNiwgfSwKKyAgICB7ICAtNjMsICA2MywgIC02MiwgIDYyLCAgLTYxLCAgNjEsICAtNjAsICA2MCwKKyAgICAgICAtNTksICA1OSwgIC01OCwgIDU4LCAgLTU3LCAgNTcsICAtNTYsICA1NiwKKyAgICAgICAtNTUsICA1NSwgIC01NCwgIDU0LCAgLTUzLCAgNTMsICAtNTIsICA1MiwKKyAgICAgICAtNTEsICA1MSwgIC01MCwgIDUwLCAgLTQ5LCAgNDksICAtNDgsICA0OCwKKyAgICAgICAtNDcsICA0NywgIC00NiwgIDQ2LCAgLTQ1LCAgNDUsICAtNDQsICA0NCwKKyAgICAgICAtNDMsICA0MywgIC00MiwgIDQyLCAgLTQxLCAgNDEsICAtNDAsICA0MCwKKyAgICAgICAtMzksICAzOSwgIC0zOCwgIDM4LCAgLTM3LCAgMzcsICAtMzYsICAzNiwKKyAgICAgICAtMzUsICAzNSwgIC0zNCwgIDM0LCAgLTMzLCAgMzMsICAtMzIsICAzMiwgfSwKKyAgICB7IC0xMjcsIDEyNywgLTEyNiwgMTI2LCAtMTI1LCAxMjUsIC0xMjQsIDEyNCwKKyAgICAgIC0xMjMsIDEyMywgLTEyMiwgMTIyLCAtMTIxLCAxMjEsIC0xMjAsIDEyMCwKKyAgICAgIC0xMTksIDExOSwgLTExOCwgMTE4LCAtMTE3LCAxMTcsIC0xMTYsIDExNiwKKyAgICAgIC0xMTUsIDExNSwgLTExNCwgMTE0LCAtMTEzLCAxMTMsIC0xMTIsIDExMiwKKyAgICAgIC0xMTEsIDExMSwgLTExMCwgMTEwLCAtMTA5LCAxMDksIC0xMDgsIDEwOCwKKyAgICAgIC0xMDcsIDEwNywgLTEwNiwgMTA2LCAtMTA1LCAxMDUsIC0xMDQsIDEwNCwKKyAgICAgIC0xMDMsIDEwMywgLTEwMiwgMTAyLCAtMTAxLCAxMDEsIC0xMDAsIDEwMCwKKyAgICAgICAtOTksICA5OSwgIC05OCwgIDk4LCAgLTk3LCAgOTcsICAtOTYsICA5NiwgfSwKKyAgICB7ICAtOTUsICA5NSwgIC05NCwgIDk0LCAgLTkzLCAgOTMsICAtOTIsICA5MiwKKyAgICAgICAtOTEsICA5MSwgIC05MCwgIDkwLCAgLTg5LCAgODksICAtODgsICA4OCwKKyAgICAgICAtODcsICA4NywgIC04NiwgIDg2LCAgLTg1LCAgODUsICAtODQsICA4NCwKKyAgICAgICAtODMsICA4MywgIC04MiwgIDgyLCAgLTgxLCAgODEsICAtODAsICA4MCwKKyAgICAgICAtNzksICA3OSwgIC03OCwgIDc4LCAgLTc3LCAgNzcsICAtNzYsICA3NiwKKyAgICAgICAtNzUsICA3NSwgIC03NCwgIDc0LCAgLTczLCAgNzMsICAtNzIsICA3MiwKKyAgICAgICAtNzEsICA3MSwgIC03MCwgIDcwLCAgLTY5LCAgNjksICAtNjgsICA2OCwKKyAgICAgICAtNjcsICA2NywgIC02NiwgIDY2LCAgLTY1LCAgNjUsICAtNjQsICA2NCwgfSwKK307CisKK3N0YXRpYyBpbnQgdmxjX2RlY29kZV9ibG9jayhNaW1pY0NvbnRleHQgKmN0eCwgaW50IG51bV9jb2VmZnMsIGludCBxc2NhbGUpCit7CisgICAgaW50MTZfdCAqYmxvY2sgPSBjdHgtPmRjdF9ibG9jazsKKyAgICB1bnNpZ25lZCBpbnQgcG9zOworCisgICAgY3R4LT5iZHNwLmNsZWFyX2Jsb2NrKGJsb2NrKTsKKworICAgIGJsb2NrWzBdID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDgpIDw8IDM7CisKKyAgICBmb3IgKHBvcyA9IDE7IHBvcyA8IG51bV9jb2VmZnM7IHBvcysrKSB7CisgICAgICAgIHVpbnQzMl90IHZsYywgbnVtX2JpdHM7CisgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgaW50IGNvZWZmOworCisgICAgICAgIHZsYyA9IGdldF92bGMyKCZjdHgtPmdiLCBjdHgtPnZsYy50YWJsZSwgY3R4LT52bGMuYml0cywgMyk7CisgICAgICAgIGlmICghdmxjKSAvKiBlbmQtb2YtYmxvY2sgY29kZSAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICh2bGMgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAvKiBwb3NfYWRkIGFuZCBudW1fYml0cyBhcmUgY29kZWQgaW4gdGhlIHZsYyBjb2RlICovCisgICAgICAgIHBvcyAgICAgKz0gdmxjICYgMTU7IC8vIHBvc19hZGQKKyAgICAgICAgbnVtX2JpdHMgPSB2bGMgPj4gNDsgLy8gbnVtX2JpdHMKKworICAgICAgICBpZiAocG9zID49IDY0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgdmFsdWUgPSBnZXRfYml0cygmY3R4LT5nYiwgbnVtX2JpdHMpOworCisgICAgICAgIC8qIEZGbXBlZydzIElEQ1QgYmVoYXZlcyBzb21ld2hhdCBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29kZSwgc28KKyAgICAgICAgICogYSBmYWN0b3Igb2YgNCB3YXMgYWRkZWQgdG8gdGhlIGlucHV0ICovCisKKyAgICAgICAgY29lZmYgPSB2bGNkZWNfbG9va3VwW251bV9iaXRzXVt2YWx1ZV07CisgICAgICAgIGlmIChwb3MgPCAzKQorICAgICAgICAgICAgY29lZmYgPDw9IDQ7CisgICAgICAgIGVsc2UgLyogVE9ETyBVc2UgPj4gMTAgaW5zdGVhZCBvZiAvIDEwMDEgKi8KKyAgICAgICAgICAgIGNvZWZmID0gKGNvZWZmICogcXNjYWxlKSAvIDEwMDE7CisKKyAgICAgICAgYmxvY2tbY3R4LT5zY2FudGFibGUucGVybXV0YXRlZFtwb3NdXSA9IGNvZWZmOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZShNaW1pY0NvbnRleHQgKmN0eCwgaW50IHF1YWxpdHksIGludCBudW1fY29lZmZzLAorICAgICAgICAgICAgICAgICAgaW50IGlzX2lmcmFtZSkKK3sKKyAgICBpbnQgcmV0LCB5LCB4LCBwbGFuZSwgY3VyX3JvdyA9IDA7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisgICAgICAgIGNvbnN0IGludCBpc19jaHJvbWEgPSAhIXBsYW5lOworICAgICAgICBjb25zdCBpbnQgcXNjYWxlICAgID0gYXZfY2xpcCgxMDAwMCAtIHF1YWxpdHksIGlzX2Nocm9tYSA/IDEwMDAgOiAyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMCkgPDwgMjsKKyAgICAgICAgY29uc3QgaW50IHN0cmlkZSAgICA9IGN0eC0+ZmxpcHBlZF9wdHJzW2N0eC0+Y3VyX2luZGV4IF0ubGluZXNpemVbcGxhbmVdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgID0gY3R4LT5mbGlwcGVkX3B0cnNbY3R4LT5wcmV2X2luZGV4XS5kYXRhW3BsYW5lXTsKKyAgICAgICAgdWludDhfdCAgICAgICAqZHN0ICA9IGN0eC0+ZmxpcHBlZF9wdHJzW2N0eC0+Y3VyX2luZGV4IF0uZGF0YVtwbGFuZV07CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN0eC0+bnVtX3ZibG9ja3NbcGxhbmVdOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBjdHgtPm51bV9oYmxvY2tzW3BsYW5lXTsgeCsrKSB7CisgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGEgY2hhbmdlIGNvbmRpdGlvbiBpbiB0aGUgY3VycmVudCBibG9jay4KKyAgICAgICAgICAgICAgICAgKiAtIGlmcmFtZXMgYWx3YXlzIGNoYW5nZS4KKyAgICAgICAgICAgICAgICAgKiAtIEx1bWEgcGxhbmUgY2hhbmdlcyBvbiBnZXRfYml0czEgPT0gMAorICAgICAgICAgICAgICAgICAqIC0gQ2hyb21hIHBsYW5lcyBjaGFuZ2Ugb24gZ2V0X2JpdHMxID09IDEgKi8KKyAgICAgICAgICAgICAgICBpZiAoaXNfaWZyYW1lIHx8IGdldF9iaXRzMSgmY3R4LT5nYikgPT0gaXNfY2hyb21hKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEx1bWEgcGxhbmVzIG1heSB1c2UgYSBiYWNrcmVmZXJlbmNlIGZyb20gdGhlIDE1IGxhc3QKKyAgICAgICAgICAgICAgICAgICAgICogZnJhbWVzIHByZWNlZGluZyB0aGUgcHJldmlvdXMuIChnZXRfYml0czEgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICogQ2hyb21hIHBsYW5lcyBkb24ndCB1c2UgYmFja3JlZmVyZW5jZXMuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChpc19jaHJvbWEgfHwgaXNfaWZyYW1lIHx8ICFnZXRfYml0czEoJmN0eC0+Z2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IHZsY19kZWNvZGVfYmxvY2soY3R4LCBudW1fY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFzY2FsZSkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBkZWNvZGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibG9jay5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmlkc3AuaWRjdF9wdXQoZHN0LCBzdHJpZGUsIGN0eC0+ZGN0X2Jsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYWNrcmVmID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ICAgICAgICAgICAgPSAoY3R4LT5jdXJfaW5kZXggKyBiYWNrcmVmKSAmIDE1OworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcCAgICAgICAgICAgPSBjdHgtPmZsaXBwZWRfcHRyc1tpbmRleF0uZGF0YVswXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IGN0eC0+Y3VyX2luZGV4ICYmIHApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJmN0eC0+ZnJhbWVzW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3JvdywgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBzcmMgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5mbGlwcGVkX3B0cnNbY3R4LT5wcmV2X2luZGV4XS5kYXRhW3BsYW5lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmhkc3AucHV0X3BpeGVsc190YWJbMV1bMF0oZHN0LCBwLCBzdHJpZGUsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBzdWNoIGJhY2tyZWZlcmVuY2UhIEJ1Z2d5IHNhbXBsZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKCZjdHgtPmZyYW1lc1tjdHgtPnByZXZfaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3JvdywgMCk7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+aGRzcC5wdXRfcGl4ZWxzX3RhYlsxXVswXShkc3QsIHNyYywgc3RyaWRlLCA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3JjICs9IDg7CisgICAgICAgICAgICAgICAgZHN0ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgKz0gKHN0cmlkZSAtIGN0eC0+bnVtX2hibG9ja3NbcGxhbmVdKSA8PCAzOworICAgICAgICAgICAgZHN0ICs9IChzdHJpZGUgLSBjdHgtPm51bV9oYmxvY2tzW3BsYW5lXSkgPDwgMzsKKworICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmY3R4LT5mcmFtZXNbY3R4LT5jdXJfaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfcm93KyssIDApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmxpcCB0aGUgYnVmZmVyIHVwc2lkZS1kb3duIGFuZCBwdXQgaXQgaW4gdGhlIFlWVSBvcmRlciB0byBtYXRjaCB0aGUKKyAqIHdheSBNaW1pYyBlbmNvZGVzIGZyYW1lcy4KKyAqLworc3RhdGljIHZvaWQgcHJlcGFyZV9hdnBpYyhNaW1pY0NvbnRleHQgKmN0eCwgQVZQaWN0dXJlICpkc3QsIEFWRnJhbWUgKnNyYykKK3sKKyAgICBpbnQgaTsKKyAgICBkc3QtPmRhdGFbMF0gPSBzcmMtPmRhdGFbMF0gKyAoIGN0eC0+YXZjdHgtPmhlaWdodCAgICAgICAtIDEpICogc3JjLT5saW5lc2l6ZVswXTsKKyAgICBkc3QtPmRhdGFbMV0gPSBzcmMtPmRhdGFbMl0gKyAoKGN0eC0+YXZjdHgtPmhlaWdodCA+PiAxKSAtIDEpICogc3JjLT5saW5lc2l6ZVsyXTsKKyAgICBkc3QtPmRhdGFbMl0gPSBzcmMtPmRhdGFbMV0gKyAoKGN0eC0+YXZjdHgtPmhlaWdodCA+PiAxKSAtIDEpICogc3JjLT5saW5lc2l6ZVsxXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICBkc3QtPmxpbmVzaXplW2ldID0gLXNyYy0+bGluZXNpemVbaV07Cit9CisKK3N0YXRpYyBpbnQgbWltaWNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgaW50IHN3YXBfYnVmX3NpemUgID0gYnVmX3NpemUgLSBNSU1JQ19IRUFERVJfU0laRTsKKyAgICBNaW1pY0NvbnRleHQgKmN0eCAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIGludCBpc19wZnJhbWU7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IHF1YWxpdHksIG51bV9jb2VmZnM7CisgICAgaW50IHJlczsKKworICAgIGlmIChidWZfc2l6ZSA8PSBNSU1JQ19IRUFERVJfU0laRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImluc3VmZmljaWVudCBkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGJ1ZiwgTUlNSUNfSEVBREVSX1NJWkUpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAyKTsgLyogc29tZSBjb25zdGFudCAoYWx3YXlzIDI1NikgKi8KKyAgICBxdWFsaXR5ICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYik7CisgICAgd2lkdGggICAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpOworICAgIGhlaWdodCAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmdiKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgNCk7IC8qIHNvbWUgY29uc3RhbnQgKi8KKyAgICBpc19wZnJhbWUgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzJ1KCZnYik7CisgICAgbnVtX2NvZWZmcyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAzKTsgLyogc29tZSBjb25zdGFudCAqLworCisgICAgaWYgKCFjdHgtPmF2Y3R4KSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmICghKHdpZHRoID09IDE2MCAmJiBoZWlnaHQgPT0gMTIwKSAmJgorICAgICAgICAgICAgISh3aWR0aCA9PSAzMjAgJiYgaGVpZ2h0ID09IDI0MCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCB3aWR0aC9oZWlnaHQhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgY3R4LT5hdmN0eCAgICAgPSBhdmN0eDsKKyAgICAgICAgYXZjdHgtPndpZHRoICAgPSB3aWR0aDsKKyAgICAgICAgYXZjdHgtPmhlaWdodCAgPSBoZWlnaHQ7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBjdHgtPm51bV92YmxvY2tzW2ldID0gRkZfQ0VJTF9SU0hJRlQoaGVpZ2h0LCAgIDMgKyAhIWkpOworICAgICAgICAgICAgY3R4LT5udW1faGJsb2Nrc1tpXSA9ICAgICAgICAgICAgICAgIHdpZHRoID4+ICgzICsgISFpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAod2lkdGggIT0gY3R4LT5hdmN0eC0+d2lkdGggfHwgaGVpZ2h0ICE9IGN0eC0+YXZjdHgtPmhlaWdodCkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJSZXNvbHV0aW9uIGNoYW5naW5nIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoaXNfcGZyYW1lICYmICFjdHgtPmZyYW1lc1tjdHgtPnByZXZfaW5kZXhdLmYtPmRhdGFbMF0pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkZWNvZGluZyBtdXN0IHN0YXJ0IHdpdGgga2V5ZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoYXZjdHgsICZjdHgtPmZyYW1lc1tjdHgtPmN1cl9pbmRleF0pOworICAgIGN0eC0+ZnJhbWVzW2N0eC0+Y3VyX2luZGV4XS5mLT5waWN0X3R5cGUgPSBpc19wZnJhbWUgPyBBVl9QSUNUVVJFX1RZUEVfUCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGlmICgocmVzID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZjdHgtPmZyYW1lc1tjdHgtPmN1cl9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgY3R4LT5uZXh0X3ByZXZfaW5kZXggPSBjdHgtPmN1cl9pbmRleDsKKyAgICBjdHgtPm5leHRfY3VyX2luZGV4ICA9IChjdHgtPmN1cl9pbmRleCAtIDEpICYgMTU7CisKKyAgICBwcmVwYXJlX2F2cGljKGN0eCwgJmN0eC0+ZmxpcHBlZF9wdHJzW2N0eC0+Y3VyX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgIGN0eC0+ZnJhbWVzW2N0eC0+Y3VyX2luZGV4XS5mKTsKKworICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoYXZjdHgpOworCisgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZjdHgtPnN3YXBfYnVmLCAmY3R4LT5zd2FwX2J1Zl9zaXplLCBzd2FwX2J1Zl9zaXplKTsKKyAgICBpZiAoIWN0eC0+c3dhcF9idWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBjdHgtPmJiZHNwLmJzd2FwX2J1ZihjdHgtPnN3YXBfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50MzJfdCAqKSAoYnVmICsgTUlNSUNfSEVBREVSX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfYnVmX3NpemUgPj4gMik7CisgICAgaW5pdF9nZXRfYml0cygmY3R4LT5nYiwgY3R4LT5zd2FwX2J1Ziwgc3dhcF9idWZfc2l6ZSA8PCAzKTsKKworICAgIHJlcyA9IGRlY29kZShjdHgsIHF1YWxpdHksIG51bV9jb2VmZnMsICFpc19wZnJhbWUpOworICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJmN0eC0+ZnJhbWVzW2N0eC0+Y3VyX2luZGV4XSwgSU5UX01BWCwgMCk7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgaWYgKCEoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkpIHsKKyAgICAgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJmN0eC0+ZnJhbWVzW2N0eC0+Y3VyX2luZGV4XSk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChyZXMgPSBhdl9mcmFtZV9yZWYoZGF0YSwgY3R4LT5mcmFtZXNbY3R4LT5jdXJfaW5kZXhdLmYpKSA8IDApCisgICAgICAgIHJldHVybiByZXM7CisgICAgKmdvdF9mcmFtZSAgICAgID0gMTsKKworICAgIGN0eC0+cHJldl9pbmRleCA9IGN0eC0+bmV4dF9wcmV2X2luZGV4OworICAgIGN0eC0+Y3VyX2luZGV4ICA9IGN0eC0+bmV4dF9jdXJfaW5kZXg7CisKKyAgICAvKiBPbmx5IHJlbGVhc2UgZnJhbWVzIHRoYXQgYXJlbid0IHVzZWQgZm9yIGJhY2tyZWZlcmVuY2VzIGFueW1vcmUgKi8KKyAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoYXZjdHgsICZjdHgtPmZyYW1lc1tjdHgtPmN1cl9pbmRleF0pOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbWltaWNfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTWltaWNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGN0eC0+ZnJhbWVzKTsgaSsrKSB7CisgICAgICAgIGN0eC0+ZnJhbWVzW2ldLmYgPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICBpZiAoIWN0eC0+ZnJhbWVzW2ldLmYpIHsKKyAgICAgICAgICAgIG1pbWljX2RlY29kZV9lbmQoYXZjdHgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX21pbWljX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgICA9ICJtaW1pYyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNaW1pYyIpLAorICAgIC50eXBlICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01JTUlDLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2YoTWltaWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gbWltaWNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgICAgICAgICA9IG1pbWljX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgICAgICAgICA9IG1pbWljX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChtaW1pY19kZWNvZGVfdXBkYXRlX3RocmVhZF9jb250ZXh0KSwKKyAgICAuaW5pdF90aHJlYWRfY29weSAgICAgID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQobWltaWNfaW5pdF90aHJlYWRfY29weSksCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9NYWtlZmlsZSBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzN2I0MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorTUlQU0ZQVS1PQkpTLSQoQ09ORklHX0FNUk5CX0RFQ09ERVIpICAgICAgKz0gbWlwcy9hY2VscF9maWx0ZXJzX21pcHMubyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlwcy9jZWxwX2ZpbHRlcnNfbWlwcy5vICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlwcy9jZWxwX21hdGhfbWlwcy5vICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlwcy9hY2VscF92ZWN0b3JzX21pcHMubworTUlQU0ZQVS1PQkpTLSQoQ09ORklHX0FNUldCX0RFQ09ERVIpICAgICAgKz0gbWlwcy9hY2VscF9maWx0ZXJzX21pcHMubyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlwcy9jZWxwX2ZpbHRlcnNfbWlwcy5vICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlwcy9hbXJ3YmRlY19taXBzLm8gICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlwcy9jZWxwX21hdGhfbWlwcy5vICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlwcy9hY2VscF92ZWN0b3JzX21pcHMubworTUlQU0ZQVS1PQkpTLSQoQ09ORklHX01QRUdBVURJT0RTUCkgICAgICAgKz0gbWlwcy9tcGVnYXVkaW9kc3BfbWlwc19mbG9hdC5vCitNSVBTRFNQUjEtT0JKUy0kKENPTkZJR19NUEVHQVVESU9EU1ApICAgICArPSBtaXBzL21wZWdhdWRpb2RzcF9taXBzX2ZpeGVkLm8KK01JUFNGUFUtT0JKUy0kKENPTkZJR19GRlQpICAgICAgICAgICAgICAgICs9IG1pcHMvZmZ0X21pcHMubworTUlQU0ZQVS1PQkpTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gbWlwcy9mbXRjb252ZXJ0X21pcHMubworT0JKUy0kKENPTkZJR19BQzNEU1ApICAgICAgICAgICAgICAgICAgICAgKz0gbWlwcy9hYzNkc3BfbWlwcy5vCitPQkpTLSQoQ09ORklHX0FBQ19ERUNPREVSKSAgICAgICAgICAgICAgICArPSBtaXBzL2FhY2RlY19taXBzLm8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXBzL2FhY3Nicl9taXBzLm8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXBzL3NicmRzcF9taXBzLm8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXBzL2FhY3BzZHNwX21pcHMubworTUlQU0RTUFIxLU9CSlMtJChDT05GSUdfQUFDX0VOQ09ERVIpICAgICAgKz0gbWlwcy9hYWNjb2Rlcl9taXBzLm8KK01JUFNGUFUtT0JKUy0kKENPTkZJR19BQUNfRU5DT0RFUikgICAgICAgICs9IG1pcHMvaWlyZmlsdGVyX21pcHMubwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hYWNjb2Rlcl9taXBzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FhY2NvZGVyX21pcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTk1OTEzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hYWNjb2Rlcl9taXBzLmMKQEAgLTAsMCArMSwyNDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyCisgKiAgICAgIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBDYWxpZm9ybmlhLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQXV0aG9yOiAgU3RhbmlzbGF2IE9jb3ZhaiAoc29jb3ZhakBtaXBzLmNvbSkKKyAqICAgICAgICAgIFN6YWJvbGNzIFBhbCAgICAgKHNhYm9sY0BtaXBzLmNvbSkKKyAqCisgKiBBQUMgY29lZmZpY2llbnRzIGVuY29kZXIgb3B0aW1pemVkIGZvciBNSVBTIGZsb2F0aW5nLXBvaW50IGFyY2hpdGVjdHVyZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSZWZlcmVuY2U6IGxpYmF2Y29kZWMvYWFjY29kZXIuYworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgorCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3B1dF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2FhY2VuYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYWFjdGFiLmgiCisKKyNpZiBIQVZFX0lOTElORV9BU00KK3R5cGVkZWYgc3RydWN0IEJhbmRDb2RpbmdQYXRoIHsKKyAgICBpbnQgcHJldl9pZHg7CisgICAgZmxvYXQgY29zdDsKKyAgICBpbnQgcnVuOworfSBCYW5kQ29kaW5nUGF0aDsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnVuX3ZhbHVlX2JpdHNfbG9uZ1s2NF0gPSB7CisgICAgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsCisgICAgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTUKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ1bl92YWx1ZV9iaXRzX3Nob3J0WzE2XSA9IHsKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA5Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCAqIGNvbnN0IHJ1bl92YWx1ZV9iaXRzWzJdID0geworICAgIHJ1bl92YWx1ZV9iaXRzX2xvbmcsIHJ1bl92YWx1ZV9iaXRzX3Nob3J0Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB1cXVhZF9zaWduX2JpdHNbODFdID0geworICAgIDAsIDEsIDEsIDEsIDIsIDIsIDEsIDIsIDIsCisgICAgMSwgMiwgMiwgMiwgMywgMywgMiwgMywgMywKKyAgICAxLCAyLCAyLCAyLCAzLCAzLCAyLCAzLCAzLAorICAgIDEsIDIsIDIsIDIsIDMsIDMsIDIsIDMsIDMsCisgICAgMiwgMywgMywgMywgNCwgNCwgMywgNCwgNCwKKyAgICAyLCAzLCAzLCAzLCA0LCA0LCAzLCA0LCA0LAorICAgIDEsIDIsIDIsIDIsIDMsIDMsIDIsIDMsIDMsCisgICAgMiwgMywgMywgMywgNCwgNCwgMywgNCwgNCwKKyAgICAyLCAzLCAzLCAzLCA0LCA0LCAzLCA0LCA0Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB1cGFpcjdfc2lnbl9iaXRzWzY0XSA9IHsKKyAgICAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB1cGFpcjEyX3NpZ25fYml0c1sxNjldID0geworICAgIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGVzY19zaWduX2JpdHNbMjg5XSA9IHsKKyAgICAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIKK307CisKK3N0YXRpYyB2b2lkIGFic19wb3czNF92KGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgY29uc3QgaW50IHNpemUpIHsKKyNpZm5kZWYgVVNFX1JFQUxMWV9GVUxMX1NFQVJDSAorICAgIGludCBpOworICAgIGZsb2F0IGEsIGIsIGMsIGQ7CisgICAgZmxvYXQgYXgsIGJ4LCBjeCwgZHg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7CisgICAgICAgIGEgPSBmYWJzZihpbltpICBdKTsKKyAgICAgICAgYiA9IGZhYnNmKGluW2krMV0pOworICAgICAgICBjID0gZmFic2YoaW5baSsyXSk7CisgICAgICAgIGQgPSBmYWJzZihpbltpKzNdKTsKKworICAgICAgICBheCA9IHNxcnRmKGEpOworICAgICAgICBieCA9IHNxcnRmKGIpOworICAgICAgICBjeCA9IHNxcnRmKGMpOworICAgICAgICBkeCA9IHNxcnRmKGQpOworCisgICAgICAgIGEgPSBhICogYXg7CisgICAgICAgIGIgPSBiICogYng7CisgICAgICAgIGMgPSBjICogY3g7CisgICAgICAgIGQgPSBkICogZHg7CisKKyAgICAgICAgb3V0W2kgIF0gPSBzcXJ0ZihhKTsKKyAgICAgICAgb3V0W2krMV0gPSBzcXJ0ZihiKTsKKyAgICAgICAgb3V0W2krMl0gPSBzcXJ0ZihjKTsKKyAgICAgICAgb3V0W2krM10gPSBzcXJ0ZihkKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX1JFQUxMWV9GVUxMX1NFQVJDSCAqLworfQorCitzdGF0aWMgZmxvYXQgZmluZF9tYXhfdmFsKGludCBncm91cF9sZW4sIGludCBzd2Jfc2l6ZSwgY29uc3QgZmxvYXQgKnNjYWxlZCkgeworICAgIGZsb2F0IG1heHZhbCA9IDAuMGY7CisgICAgaW50IHcyLCBpOworICAgIGZvciAodzIgPSAwOyB3MiA8IGdyb3VwX2xlbjsgdzIrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3diX3NpemU7IGkrKykgeworICAgICAgICAgICAgbWF4dmFsID0gRkZNQVgobWF4dmFsLCBzY2FsZWRbdzIqMTI4K2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWF4dmFsOworfQorCitzdGF0aWMgaW50IGZpbmRfbWluX2Jvb2soZmxvYXQgbWF4dmFsLCBpbnQgc2YpIHsKKyAgICBmbG9hdCBRID0gZmZfYWFjX3BvdzJzZl90YWJbUE9XX1NGMl9aRVJPIC0gc2YgKyBTQ0FMRV9PTkVfUE9TIC0gU0NBTEVfRElWXzUxMl07CisgICAgZmxvYXQgUTM0ID0gc3FydGYoUSAqIHNxcnRmKFEpKTsKKyAgICBpbnQgcW1heHZhbCwgY2I7CisgICAgcW1heHZhbCA9IG1heHZhbCAqIFEzNCArIDAuNDA1NGY7CisgICAgaWYgICAgICAocW1heHZhbCA9PSAgMCkgY2IgPSAwOworICAgIGVsc2UgaWYgKHFtYXh2YWwgPT0gIDEpIGNiID0gMTsKKyAgICBlbHNlIGlmIChxbWF4dmFsID09ICAyKSBjYiA9IDM7CisgICAgZWxzZSBpZiAocW1heHZhbCA8PSAgNCkgY2IgPSA1OworICAgIGVsc2UgaWYgKHFtYXh2YWwgPD0gIDcpIGNiID0gNzsKKyAgICBlbHNlIGlmIChxbWF4dmFsIDw9IDEyKSBjYiA9IDk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgY2IgPSAxMTsKKyAgICByZXR1cm4gY2I7Cit9CisKKy8qKgorICogRnVuY3Rpb25zIGRldmVsb3BlZCBmcm9tIHRlbXBsYXRlIGZ1bmN0aW9uIGFuZCBvcHRpbWl6ZWQgZm9yIHF1YW50aXppbmcgYW5kIGVuY29kaW5nIGJhbmQKKyAqLworc3RhdGljIHZvaWQgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfU1FVQURfbWlwcyhzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqcGIsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpiaXRzKQoreworICAgIGNvbnN0IGZsb2F0IFEzNCA9IGZmX2FhY19wb3czNHNmX3RhYltQT1dfU0YyX1pFUk8gLSBzY2FsZV9pZHggKyBTQ0FMRV9PTkVfUE9TIC0gU0NBTEVfRElWXzUxMl07CisgICAgaW50IGk7CisgICAgaW50IHFjMSwgcWMyLCBxYzMsIHFjNDsKKworICAgIHVpbnQ4X3QgICpwX2JpdHMgID0gKHVpbnQ4X3QgICopZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV07CisgICAgdWludDE2X3QgKnBfY29kZXMgPSAodWludDE2X3QgKilmZl9hYWNfc3BlY3RyYWxfY29kZXNbY2ItMV07CisKKyAgICBhYnNfcG93MzRfdihzLT5zY29lZnMsIGluLCBzaXplKTsKKyAgICBzY2FsZWQgPSBzLT5zY29lZnM7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICBpbnQgY3VyaWR4OworICAgICAgICBpbnQgKmluX2ludCA9IChpbnQgKikmaW5baV07CisKKyAgICAgICAgcWMxID0gc2NhbGVkW2kgIF0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzIgPSBzY2FsZWRbaSsxXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMyA9IHNjYWxlZFtpKzJdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWM0ID0gc2NhbGVkW2krM10gKiBRMzQgKyAwLjQwNTRmOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAic2x0ICAgICVbcWMxXSwgJHplcm8sICAlW3FjMV0gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICVbcWMyXSwgJHplcm8sICAlW3FjMl0gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICVbcWMzXSwgJHplcm8sICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICVbcWM0XSwgJHplcm8sICAlW3FjNF0gIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICR0MCwgICAgMCglW2luX2ludF0pICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICR0MSwgICAgNCglW2luX2ludF0pICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICR0MiwgICAgOCglW2luX2ludF0pICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICR0MywgICAgMTIoJVtpbl9pbnRdKSAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICR0MCwgICAgJHQwLCAgICAzMSAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICR0MSwgICAgJHQxLCAgICAzMSAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICR0MiwgICAgJHQyLCAgICAzMSAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICR0MywgICAgJHQzLCAgICAzMSAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICR0NCwgICAgJHplcm8sICAlW3FjMV0gIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICR0NSwgICAgJHplcm8sICAlW3FjMl0gIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICR0NiwgICAgJHplcm8sICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICR0NywgICAgJHplcm8sICAlW3FjNF0gIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMxXSwgJHQ0LCAgICAkdDAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMyXSwgJHQ1LCAgICAkdDEgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMzXSwgJHQ2LCAgICAkdDIgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWM0XSwgJHQ3LCAgICAkdDMgICAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbcWMxXSIrciIocWMxKSwgW3FjMl0iK3IiKHFjMiksCisgICAgICAgICAgICAgIFtxYzNdIityIihxYzMpLCBbcWM0XSIrciIocWM0KQorICAgICAgICAgICAgOiBbaW5faW50XSJyIihpbl9pbnQpCisgICAgICAgICAgICA6ICJ0MCIsICJ0MSIsICJ0MiIsICJ0MyIsCisgICAgICAgICAgICAgICJ0NCIsICJ0NSIsICJ0NiIsICJ0NyIsCisgICAgICAgICAgICAgICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgY3VyaWR4ID0gcWMxOworICAgICAgICBjdXJpZHggKj0gMzsKKyAgICAgICAgY3VyaWR4ICs9IHFjMjsKKyAgICAgICAgY3VyaWR4ICo9IDM7CisgICAgICAgIGN1cmlkeCArPSBxYzM7CisgICAgICAgIGN1cmlkeCAqPSAzOworICAgICAgICBjdXJpZHggKz0gcWM0OworICAgICAgICBjdXJpZHggKz0gNDA7CisKKyAgICAgICAgcHV0X2JpdHMocGIsIHBfYml0c1tjdXJpZHhdLCBwX2NvZGVzW2N1cmlkeF0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfVVFVQURfbWlwcyhzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqcGIsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpiaXRzKQoreworICAgIGNvbnN0IGZsb2F0IFEzNCA9IGZmX2FhY19wb3czNHNmX3RhYltQT1dfU0YyX1pFUk8gLSBzY2FsZV9pZHggKyBTQ0FMRV9PTkVfUE9TIC0gU0NBTEVfRElWXzUxMl07CisgICAgaW50IGk7CisgICAgaW50IHFjMSwgcWMyLCBxYzMsIHFjNDsKKworICAgIHVpbnQ4X3QgICpwX2JpdHMgID0gKHVpbnQ4X3QgICopZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV07CisgICAgdWludDE2X3QgKnBfY29kZXMgPSAodWludDE2X3QgKilmZl9hYWNfc3BlY3RyYWxfY29kZXNbY2ItMV07CisKKyAgICBhYnNfcG93MzRfdihzLT5zY29lZnMsIGluLCBzaXplKTsKKyAgICBzY2FsZWQgPSBzLT5zY29lZnM7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICBpbnQgY3VyaWR4LCBzaWduLCBjb3VudDsKKyAgICAgICAgaW50ICppbl9pbnQgPSAoaW50ICopJmluW2ldOworICAgICAgICB1aW50OF90IHZfYml0czsKKyAgICAgICAgdW5zaWduZWQgaW50IHZfY29kZXM7CisKKyAgICAgICAgcWMxID0gc2NhbGVkW2kgIF0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzIgPSBzY2FsZWRbaSsxXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMyA9IHNjYWxlZFtpKzJdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWM0ID0gc2NhbGVkW2krM10gKiBRMzQgKyAwLjQwNTRmOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgIm9yaSAgICAkdDQsICAgICAgICAkemVybywgICAgICAyICAgICAgIFxuXHQiCisgICAgICAgICAgICAib3JpICAgICVbc2lnbl0sICAgICR6ZXJvLCAgICAgIDAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQwLCAgICAgICAgJHQ0LCAgICAgICAgJVtxYzFdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDEsICAgICAgICAkdDQsICAgICAgICAlW3FjMl0gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MiwgICAgICAgICR0NCwgICAgICAgICVbcWMzXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQzLCAgICAgICAgJHQ0LCAgICAgICAgJVtxYzRdICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjMV0sICAgICAkdDQsICAgICAgICAkdDAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMyXSwgICAgICR0NCwgICAgICAgICR0MSAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzNdLCAgICAgJHQ0LCAgICAgICAgJHQyICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjNF0sICAgICAkdDQsICAgICAgICAkdDMgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICR0MCwgICAgICAgIDAoJVtpbl9pbnRdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgJHQxLCAgICAgICAgNCglW2luX2ludF0pICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAkdDIsICAgICAgICA4KCVbaW5faW50XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICR0MywgICAgICAgIDEyKCVbaW5faW50XSkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQwLCAgICAgICAgJHQwLCAgICAgICAgJHplcm8gICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3NpZ25dLCAgICAkdDAsICAgICAgICAlW3FjMV0gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MSwgICAgICAgICR0MSwgICAgICAgICR6ZXJvICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQyLCAgICAgICAgJHQyLCAgICAgICAgJHplcm8gICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDMsICAgICAgICAkdDMsICAgICAgICAkemVybyAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAgICR0MCwgICAgICAgICVbc2lnbl0sICAgIDEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJvciAgICAgJHQwLCAgICAgICAgJHQwLCAgICAgICAgJHQxICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3NpZ25dLCAgICAkdDAsICAgICAgICAlW3FjMl0gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0NCwgICAgICAgICR6ZXJvLCAgICAgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQxLCAgICAgICAgJHplcm8sICAgICAgJVtxYzJdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAlW2NvdW50XSwgICAkemVybywgICAgICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAic2xsICAgICR0MCwgICAgICAgICVbc2lnbl0sICAgIDEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJvciAgICAgJHQwLCAgICAgICAgJHQwLCAgICAgICAgJHQyICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3NpZ25dLCAgICAkdDAsICAgICAgICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MiwgICAgICAgICR6ZXJvLCAgICAgICVbcWM0XSAgXG5cdCIKKyAgICAgICAgICAgICJhZGR1ICAgJVtjb3VudF0sICAgJVtjb3VudF0sICAgJHQ0ICAgICBcblx0IgorICAgICAgICAgICAgImFkZHUgICAlW2NvdW50XSwgICAlW2NvdW50XSwgICAkdDEgICAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAgICR0MCwgICAgICAgICVbc2lnbl0sICAgIDEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJvciAgICAgJHQwLCAgICAgICAgJHQwLCAgICAgICAgJHQzICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3NpZ25dLCAgICAkdDAsICAgICAgICAlW3FjNF0gIFxuXHQiCisgICAgICAgICAgICAiYWRkdSAgICVbY291bnRdLCAgICVbY291bnRdLCAgICR0MiAgICAgXG5cdCIKKworICAgICAgICAgICAgIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3FjMV0iK3IiKHFjMSksIFtxYzJdIityIihxYzIpLAorICAgICAgICAgICAgICBbcWMzXSIrciIocWMzKSwgW3FjNF0iK3IiKHFjNCksCisgICAgICAgICAgICAgIFtzaWduXSI9JnIiKHNpZ24pLCBbY291bnRdIj0mciIoY291bnQpCisgICAgICAgICAgICA6IFtpbl9pbnRdInIiKGluX2ludCkKKyAgICAgICAgICAgIDogInQwIiwgInQxIiwgInQyIiwgInQzIiwgInQ0IiwKKyAgICAgICAgICAgICAgIm1lbW9yeSIKKyAgICAgICAgKTsKKworICAgICAgICBjdXJpZHggPSBxYzE7CisgICAgICAgIGN1cmlkeCAqPSAzOworICAgICAgICBjdXJpZHggKz0gcWMyOworICAgICAgICBjdXJpZHggKj0gMzsKKyAgICAgICAgY3VyaWR4ICs9IHFjMzsKKyAgICAgICAgY3VyaWR4ICo9IDM7CisgICAgICAgIGN1cmlkeCArPSBxYzQ7CisKKyAgICAgICAgdl9jb2RlcyA9IChwX2NvZGVzW2N1cmlkeF0gPDwgY291bnQpIHwgKHNpZ24gJiAoKDEgPDwgY291bnQpIC0gMSkpOworICAgICAgICB2X2JpdHMgID0gcF9iaXRzW2N1cmlkeF0gKyBjb3VudDsKKyAgICAgICAgcHV0X2JpdHMocGIsIHZfYml0cywgdl9jb2Rlcyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdF9TUEFJUl9taXBzKHN0cnVjdCBBQUNFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLCBjb25zdCBmbG9hdCBsYW1iZGEsIGNvbnN0IGZsb2F0IHVwbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgY29uc3QgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjYWxlX2lkeCArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcWMxLCBxYzIsIHFjMywgcWM0OworCisgICAgdWludDhfdCAgKnBfYml0cyAgPSAodWludDhfdCAgKilmZl9hYWNfc3BlY3RyYWxfYml0c1tjYi0xXTsKKyAgICB1aW50MTZfdCAqcF9jb2RlcyA9ICh1aW50MTZfdCAqKWZmX2FhY19zcGVjdHJhbF9jb2Rlc1tjYi0xXTsKKworICAgIGFic19wb3czNF92KHMtPnNjb2VmcywgaW4sIHNpemUpOworICAgIHNjYWxlZCA9IHMtPnNjb2VmczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7CisgICAgICAgIGludCBjdXJpZHgsIGN1cmlkeDI7CisgICAgICAgIGludCAqaW5faW50ID0gKGludCAqKSZpbltpXTsKKyAgICAgICAgdWludDhfdCB2X2JpdHM7CisgICAgICAgIHVuc2lnbmVkIGludCB2X2NvZGVzOworCisgICAgICAgIHFjMSA9IHNjYWxlZFtpICBdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWMyID0gc2NhbGVkW2krMV0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzMgPSBzY2FsZWRbaSsyXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjNCA9IHNjYWxlZFtpKzNdICogUTM0ICsgMC40MDU0ZjsKKworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICIuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgIm9yaSAgICAkdDQsICAgICR6ZXJvLCAgNCAgICAgICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDAsICAgICR0NCwgICAgJVtxYzFdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDEsICAgICR0NCwgICAgJVtxYzJdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDIsICAgICR0NCwgICAgJVtxYzNdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDMsICAgICR0NCwgICAgJVtxYzRdICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjMV0sICR0NCwgICAgJHQwICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjMl0sICR0NCwgICAgJHQxICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjM10sICR0NCwgICAgJHQyICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjNF0sICR0NCwgICAgJHQzICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAkdDAsICAgIDAoJVtpbl9pbnRdKSAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAkdDEsICAgIDQoJVtpbl9pbnRdKSAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAkdDIsICAgIDgoJVtpbl9pbnRdKSAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAkdDMsICAgIDEyKCVbaW5faW50XSkgICBcblx0IgorICAgICAgICAgICAgInNybCAgICAkdDAsICAgICR0MCwgICAgMzEgICAgICBcblx0IgorICAgICAgICAgICAgInNybCAgICAkdDEsICAgICR0MSwgICAgMzEgICAgICBcblx0IgorICAgICAgICAgICAgInNybCAgICAkdDIsICAgICR0MiwgICAgMzEgICAgICBcblx0IgorICAgICAgICAgICAgInNybCAgICAkdDMsICAgICR0MywgICAgMzEgICAgICBcblx0IgorICAgICAgICAgICAgInN1YnUgICAkdDQsICAgICR6ZXJvLCAgJVtxYzFdICBcblx0IgorICAgICAgICAgICAgInN1YnUgICAkdDUsICAgICR6ZXJvLCAgJVtxYzJdICBcblx0IgorICAgICAgICAgICAgInN1YnUgICAkdDYsICAgICR6ZXJvLCAgJVtxYzNdICBcblx0IgorICAgICAgICAgICAgInN1YnUgICAkdDcsICAgICR6ZXJvLCAgJVtxYzRdICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjMV0sICR0NCwgICAgJHQwICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjMl0sICR0NSwgICAgJHQxICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjM10sICR0NiwgICAgJHQyICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjNF0sICR0NywgICAgJHQzICAgICBcblx0IgorCisgICAgICAgICAgICAiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3FjMV0iK3IiKHFjMSksIFtxYzJdIityIihxYzIpLAorICAgICAgICAgICAgICBbcWMzXSIrciIocWMzKSwgW3FjNF0iK3IiKHFjNCkKKyAgICAgICAgICAgIDogW2luX2ludF0iciIoaW5faW50KQorICAgICAgICAgICAgOiAidDAiLCAidDEiLCAidDIiLCAidDMiLAorICAgICAgICAgICAgICAidDQiLCAidDUiLCAidDYiLCAidDciLAorICAgICAgICAgICAgICAibWVtb3J5IgorICAgICAgICApOworCisgICAgICAgIGN1cmlkeCA9IDkgKiBxYzE7CisgICAgICAgIGN1cmlkeCArPSBxYzIgKyA0MDsKKworICAgICAgICBjdXJpZHgyID0gOSAqIHFjMzsKKyAgICAgICAgY3VyaWR4MiArPSBxYzQgKyA0MDsKKworICAgICAgICB2X2NvZGVzID0gKHBfY29kZXNbY3VyaWR4XSA8PCBwX2JpdHNbY3VyaWR4Ml0pIHwgKHBfY29kZXNbY3VyaWR4Ml0pOworICAgICAgICB2X2JpdHMgID0gcF9iaXRzW2N1cmlkeF0gKyBwX2JpdHNbY3VyaWR4Ml07CisgICAgICAgIHB1dF9iaXRzKHBiLCB2X2JpdHMsIHZfY29kZXMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfVVBBSVI3X21pcHMoc3RydWN0IEFBQ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2IsIGNvbnN0IGZsb2F0IGxhbWJkYSwgY29uc3QgZmxvYXQgdXBsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgY29uc3QgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjYWxlX2lkeCArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcWMxLCBxYzIsIHFjMywgcWM0OworCisgICAgdWludDhfdCAgKnBfYml0cyAgPSAodWludDhfdCopIGZmX2FhY19zcGVjdHJhbF9iaXRzW2NiLTFdOworICAgIHVpbnQxNl90ICpwX2NvZGVzID0gKHVpbnQxNl90KilmZl9hYWNfc3BlY3RyYWxfY29kZXNbY2ItMV07CisKKyAgICBhYnNfcG93MzRfdihzLT5zY29lZnMsIGluLCBzaXplKTsKKyAgICBzY2FsZWQgPSBzLT5zY29lZnM7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICBpbnQgY3VyaWR4LCBzaWduMSwgY291bnQxLCBzaWduMiwgY291bnQyOworICAgICAgICBpbnQgKmluX2ludCA9IChpbnQgKikmaW5baV07CisgICAgICAgIHVpbnQ4X3Qgdl9iaXRzOworICAgICAgICB1bnNpZ25lZCBpbnQgdl9jb2RlczsKKworICAgICAgICBxYzEgPSBzY2FsZWRbaSAgXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMiA9IHNjYWxlZFtpKzFdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWMzID0gc2NhbGVkW2krMl0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzQgPSBzY2FsZWRbaSszXSAqIFEzNCArIDAuNDA1NGY7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAib3JpICAgICR0NCwgICAgICAgICR6ZXJvLCAgICAgIDcgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJvcmkgICAgJVtzaWduMV0sICAgJHplcm8sICAgICAgMCAgICAgICBcblx0IgorICAgICAgICAgICAgIm9yaSAgICAlW3NpZ24yXSwgICAkemVybywgICAgICAwICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MCwgICAgICAgICR0NCwgICAgICAgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQxLCAgICAgICAgJHQ0LCAgICAgICAgJVtxYzJdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDIsICAgICAgICAkdDQsICAgICAgICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MywgICAgICAgICR0NCwgICAgICAgICVbcWM0XSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzFdLCAgICAgJHQ0LCAgICAgICAgJHQwICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjMl0sICAgICAkdDQsICAgICAgICAkdDEgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMzXSwgICAgICR0NCwgICAgICAgICR0MiAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzRdLCAgICAgJHQ0LCAgICAgICAgJHQzICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAkdDAsICAgICAgICAwKCVbaW5faW50XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICR0MSwgICAgICAgIDQoJVtpbl9pbnRdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgJHQyLCAgICAgICAgOCglW2luX2ludF0pICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAkdDMsICAgICAgICAxMiglW2luX2ludF0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MCwgICAgICAgICR0MCwgICAgICAgICR6ZXJvICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtzaWduMV0sICAgJHQwLCAgICAgICAgJVtxYzFdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDIsICAgICAgICAkdDIsICAgICAgICAkemVybyAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbc2lnbjJdLCAgICR0MiwgICAgICAgICVbcWMzXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQxLCAgICAgICAgJHQxLCAgICAgICAgJHplcm8gICBcblx0IgorICAgICAgICAgICAgInNsbCAgICAkdDAsICAgICAgICAlW3NpZ24xXSwgICAxICAgICAgIFxuXHQiCisgICAgICAgICAgICAib3IgICAgICR0MCwgICAgICAgICR0MCwgICAgICAgICR0MSAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtzaWduMV0sICAgJHQwLCAgICAgICAgJVtxYzJdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDMsICAgICAgICAkdDMsICAgICAgICAkemVybyAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAgICR0MCwgICAgICAgICVbc2lnbjJdLCAgIDEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJvciAgICAgJHQwLCAgICAgICAgJHQwLCAgICAgICAgJHQzICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3NpZ24yXSwgICAkdDAsICAgICAgICAlW3FjNF0gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICVbY291bnQxXSwgICR6ZXJvLCAgICAgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQxLCAgICAgICAgJHplcm8sICAgICAgJVtxYzJdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAlW2NvdW50Ml0sICAkemVybywgICAgICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MiwgICAgICAgICR6ZXJvLCAgICAgICVbcWM0XSAgXG5cdCIKKyAgICAgICAgICAgICJhZGR1ICAgJVtjb3VudDFdLCAgJVtjb3VudDFdLCAgJHQxICAgICBcblx0IgorICAgICAgICAgICAgImFkZHUgICAlW2NvdW50Ml0sICAlW2NvdW50Ml0sICAkdDIgICAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFtxYzFdIityIihxYzEpLCBbcWMyXSIrciIocWMyKSwKKyAgICAgICAgICAgICAgW3FjM10iK3IiKHFjMyksIFtxYzRdIityIihxYzQpLAorICAgICAgICAgICAgICBbc2lnbjFdIj0mciIoc2lnbjEpLCBbY291bnQxXSI9JnIiKGNvdW50MSksCisgICAgICAgICAgICAgIFtzaWduMl0iPSZyIihzaWduMiksIFtjb3VudDJdIj0mciIoY291bnQyKQorICAgICAgICAgICAgOiBbaW5faW50XSJyIihpbl9pbnQpCisgICAgICAgICAgICA6ICJ0MCIsICJ0MSIsICJ0MiIsICJ0MyIsICJ0NCIsCisgICAgICAgICAgICAgICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgY3VyaWR4ICA9IDggKiBxYzE7CisgICAgICAgIGN1cmlkeCArPSBxYzI7CisKKyAgICAgICAgdl9jb2RlcyA9IChwX2NvZGVzW2N1cmlkeF0gPDwgY291bnQxKSB8IHNpZ24xOworICAgICAgICB2X2JpdHMgID0gcF9iaXRzW2N1cmlkeF0gKyBjb3VudDE7CisgICAgICAgIHB1dF9iaXRzKHBiLCB2X2JpdHMsIHZfY29kZXMpOworCisgICAgICAgIGN1cmlkeCAgPSA4ICogcWMzOworICAgICAgICBjdXJpZHggKz0gcWM0OworCisgICAgICAgIHZfY29kZXMgPSAocF9jb2Rlc1tjdXJpZHhdIDw8IGNvdW50MikgfCBzaWduMjsKKyAgICAgICAgdl9iaXRzICA9IHBfYml0c1tjdXJpZHhdICsgY291bnQyOworICAgICAgICBwdXRfYml0cyhwYiwgdl9iaXRzLCB2X2NvZGVzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHF1YW50aXplX2FuZF9lbmNvZGVfYmFuZF9jb3N0X1VQQUlSMTJfbWlwcyhzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZWQsIGludCBzaXplLCBpbnQgc2NhbGVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgY29uc3QgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjYWxlX2lkeCArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcWMxLCBxYzIsIHFjMywgcWM0OworCisgICAgdWludDhfdCAgKnBfYml0cyAgPSAodWludDhfdCopIGZmX2FhY19zcGVjdHJhbF9iaXRzW2NiLTFdOworICAgIHVpbnQxNl90ICpwX2NvZGVzID0gKHVpbnQxNl90KilmZl9hYWNfc3BlY3RyYWxfY29kZXNbY2ItMV07CisKKyAgICBhYnNfcG93MzRfdihzLT5zY29lZnMsIGluLCBzaXplKTsKKyAgICBzY2FsZWQgPSBzLT5zY29lZnM7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICBpbnQgY3VyaWR4LCBzaWduMSwgY291bnQxLCBzaWduMiwgY291bnQyOworICAgICAgICBpbnQgKmluX2ludCA9IChpbnQgKikmaW5baV07CisgICAgICAgIHVpbnQ4X3Qgdl9iaXRzOworICAgICAgICB1bnNpZ25lZCBpbnQgdl9jb2RlczsKKworICAgICAgICBxYzEgPSBzY2FsZWRbaSAgXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMiA9IHNjYWxlZFtpKzFdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWMzID0gc2NhbGVkW2krMl0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzQgPSBzY2FsZWRbaSszXSAqIFEzNCArIDAuNDA1NGY7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAib3JpICAgICR0NCwgICAgICAgICR6ZXJvLCAgICAgIDEyICAgICAgXG5cdCIKKyAgICAgICAgICAgICJvcmkgICAgJVtzaWduMV0sICAgJHplcm8sICAgICAgMCAgICAgICBcblx0IgorICAgICAgICAgICAgIm9yaSAgICAlW3NpZ24yXSwgICAkemVybywgICAgICAwICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MCwgICAgICAgICR0NCwgICAgICAgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQxLCAgICAgICAgJHQ0LCAgICAgICAgJVtxYzJdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDIsICAgICAgICAkdDQsICAgICAgICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MywgICAgICAgICR0NCwgICAgICAgICVbcWM0XSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzFdLCAgICAgJHQ0LCAgICAgICAgJHQwICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjMl0sICAgICAkdDQsICAgICAgICAkdDEgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMzXSwgICAgICR0NCwgICAgICAgICR0MiAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzRdLCAgICAgJHQ0LCAgICAgICAgJHQzICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAkdDAsICAgICAgICAwKCVbaW5faW50XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICR0MSwgICAgICAgIDQoJVtpbl9pbnRdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgJHQyLCAgICAgICAgOCglW2luX2ludF0pICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAkdDMsICAgICAgICAxMiglW2luX2ludF0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MCwgICAgICAgICR0MCwgICAgICAgICR6ZXJvICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtzaWduMV0sICAgJHQwLCAgICAgICAgJVtxYzFdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDIsICAgICAgICAkdDIsICAgICAgICAkemVybyAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbc2lnbjJdLCAgICR0MiwgICAgICAgICVbcWMzXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQxLCAgICAgICAgJHQxLCAgICAgICAgJHplcm8gICBcblx0IgorICAgICAgICAgICAgInNsbCAgICAkdDAsICAgICAgICAlW3NpZ24xXSwgICAxICAgICAgIFxuXHQiCisgICAgICAgICAgICAib3IgICAgICR0MCwgICAgICAgICR0MCwgICAgICAgICR0MSAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtzaWduMV0sICAgJHQwLCAgICAgICAgJVtxYzJdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDMsICAgICAgICAkdDMsICAgICAgICAkemVybyAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAgICR0MCwgICAgICAgICVbc2lnbjJdLCAgIDEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJvciAgICAgJHQwLCAgICAgICAgJHQwLCAgICAgICAgJHQzICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3NpZ24yXSwgICAkdDAsICAgICAgICAlW3FjNF0gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICVbY291bnQxXSwgICR6ZXJvLCAgICAgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQxLCAgICAgICAgJHplcm8sICAgICAgJVtxYzJdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAlW2NvdW50Ml0sICAkemVybywgICAgICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MiwgICAgICAgICR6ZXJvLCAgICAgICVbcWM0XSAgXG5cdCIKKyAgICAgICAgICAgICJhZGR1ICAgJVtjb3VudDFdLCAgJVtjb3VudDFdLCAgJHQxICAgICBcblx0IgorICAgICAgICAgICAgImFkZHUgICAlW2NvdW50Ml0sICAlW2NvdW50Ml0sICAkdDIgICAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFtxYzFdIityIihxYzEpLCBbcWMyXSIrciIocWMyKSwKKyAgICAgICAgICAgICAgW3FjM10iK3IiKHFjMyksIFtxYzRdIityIihxYzQpLAorICAgICAgICAgICAgICBbc2lnbjFdIj0mciIoc2lnbjEpLCBbY291bnQxXSI9JnIiKGNvdW50MSksCisgICAgICAgICAgICAgIFtzaWduMl0iPSZyIihzaWduMiksIFtjb3VudDJdIj0mciIoY291bnQyKQorICAgICAgICAgICAgOiBbaW5faW50XSJyIihpbl9pbnQpCisgICAgICAgICAgICA6ICJ0MCIsICJ0MSIsICJ0MiIsICJ0MyIsICJ0NCIsCisgICAgICAgICAgICAgICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgY3VyaWR4ICA9IDEzICogcWMxOworICAgICAgICBjdXJpZHggKz0gcWMyOworCisgICAgICAgIHZfY29kZXMgPSAocF9jb2Rlc1tjdXJpZHhdIDw8IGNvdW50MSkgfCBzaWduMTsKKyAgICAgICAgdl9iaXRzICA9IHBfYml0c1tjdXJpZHhdICsgY291bnQxOworICAgICAgICBwdXRfYml0cyhwYiwgdl9iaXRzLCB2X2NvZGVzKTsKKworICAgICAgICBjdXJpZHggID0gMTMgKiBxYzM7CisgICAgICAgIGN1cmlkeCArPSBxYzQ7CisKKyAgICAgICAgdl9jb2RlcyA9IChwX2NvZGVzW2N1cmlkeF0gPDwgY291bnQyKSB8IHNpZ24yOworICAgICAgICB2X2JpdHMgID0gcF9iaXRzW2N1cmlkeF0gKyBjb3VudDI7CisgICAgICAgIHB1dF9iaXRzKHBiLCB2X2JpdHMsIHZfY29kZXMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfRVNDX21pcHMoc3RydWN0IEFBQ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2IsIGNvbnN0IGZsb2F0IGxhbWJkYSwgY29uc3QgZmxvYXQgdXBsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgY29uc3QgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjYWxlX2lkeCArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcWMxLCBxYzIsIHFjMywgcWM0OworCisgICAgdWludDhfdCAgKnBfYml0cyAgICA9ICh1aW50OF90KiApZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV07CisgICAgdWludDE2X3QgKnBfY29kZXMgICA9ICh1aW50MTZfdCopZmZfYWFjX3NwZWN0cmFsX2NvZGVzW2NiLTFdOworICAgIGZsb2F0ICAgICpwX3ZlY3RvcnMgPSAoZmxvYXQqICAgKWZmX2FhY19jb2RlYm9va192ZWN0b3JzW2NiLTFdOworCisgICAgYWJzX3BvdzM0X3Yocy0+c2NvZWZzLCBpbiwgc2l6ZSk7CisgICAgc2NhbGVkID0gcy0+c2NvZWZzOworCisgICAgaWYgKGNiIDwgMTEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICAgICAgaW50IGN1cmlkeCwgY3VyaWR4Miwgc2lnbjEsIGNvdW50MSwgc2lnbjIsIGNvdW50MjsKKyAgICAgICAgICAgIGludCAqaW5faW50ID0gKGludCAqKSZpbltpXTsKKyAgICAgICAgICAgIHVpbnQ4X3Qgdl9iaXRzOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZfY29kZXM7CisKKyAgICAgICAgICAgIHFjMSA9IHNjYWxlZFtpICBdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgICAgIHFjMiA9IHNjYWxlZFtpKzFdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgICAgIHFjMyA9IHNjYWxlZFtpKzJdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgICAgIHFjNCA9IHNjYWxlZFtpKzNdICogUTM0ICsgMC40MDU0ZjsKKworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJvcmkgICAgICAgICR0NCwgICAgICAgICR6ZXJvLCAgICAgIDE2ICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAib3JpICAgICAgICAlW3NpZ24xXSwgICAkemVybywgICAgICAwICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm9yaSAgICAgICAgJVtzaWduMl0sICAgJHplcm8sICAgICAgMCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzbHQgICAgICAgICR0MCwgICAgICAgICR0NCwgICAgICAgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2x0ICAgICAgICAkdDEsICAgICAgICAkdDQsICAgICAgICAlW3FjMl0gIFxuXHQiCisgICAgICAgICAgICAgICAgInNsdCAgICAgICAgJHQyLCAgICAgICAgJHQ0LCAgICAgICAgJVtxYzNdICBcblx0IgorICAgICAgICAgICAgICAgICJzbHQgICAgICAgICR0MywgICAgICAgICR0NCwgICAgICAgICVbcWM0XSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92biAgICAgICAlW3FjMV0sICAgICAkdDQsICAgICAgICAkdDAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdm4gICAgICAgJVtxYzJdLCAgICAgJHQ0LCAgICAgICAgJHQxICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZuICAgICAgICVbcWMzXSwgICAgICR0NCwgICAgICAgICR0MiAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92biAgICAgICAlW3FjNF0sICAgICAkdDQsICAgICAgICAkdDMgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgICAgJHQwLCAgICAgICAgMCglW2luX2ludF0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgICAgICR0MSwgICAgICAgIDQoJVtpbl9pbnRdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICAgICAkdDIsICAgICAgICA4KCVbaW5faW50XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgICAgJHQzLCAgICAgICAgMTIoJVtpbl9pbnRdKSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzbHQgICAgICAgICR0MCwgICAgICAgICR0MCwgICAgICAgICR6ZXJvICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92biAgICAgICAlW3NpZ24xXSwgICAkdDAsICAgICAgICAlW3FjMV0gIFxuXHQiCisgICAgICAgICAgICAgICAgInNsdCAgICAgICAgJHQyLCAgICAgICAgJHQyLCAgICAgICAgJHplcm8gICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZuICAgICAgICVbc2lnbjJdLCAgICR0MiwgICAgICAgICVbcWMzXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2x0ICAgICAgICAkdDEsICAgICAgICAkdDEsICAgICAgICAkemVybyAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNsbCAgICAgICAgJHQwLCAgICAgICAgJVtzaWduMV0sICAgMSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJvciAgICAgICAgICR0MCwgICAgICAgICR0MCwgICAgICAgICR0MSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92biAgICAgICAlW3NpZ24xXSwgICAkdDAsICAgICAgICAlW3FjMl0gIFxuXHQiCisgICAgICAgICAgICAgICAgInNsdCAgICAgICAgJHQzLCAgICAgICAgJHQzLCAgICAgICAgJHplcm8gICBcblx0IgorICAgICAgICAgICAgICAgICJzbGwgICAgICAgICR0MCwgICAgICAgICVbc2lnbjJdLCAgIDEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAib3IgICAgICAgICAkdDAsICAgICAgICAkdDAsICAgICAgICAkdDMgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdm4gICAgICAgJVtzaWduMl0sICAgJHQwLCAgICAgICAgJVtxYzRdICBcblx0IgorICAgICAgICAgICAgICAgICJzbHQgICAgICAgICVbY291bnQxXSwgICR6ZXJvLCAgICAgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2x0ICAgICAgICAkdDEsICAgICAgICAkemVybywgICAgICAlW3FjMl0gIFxuXHQiCisgICAgICAgICAgICAgICAgInNsdCAgICAgICAgJVtjb3VudDJdLCAgJHplcm8sICAgICAgJVtxYzNdICBcblx0IgorICAgICAgICAgICAgICAgICJzbHQgICAgICAgICR0MiwgICAgICAgICR6ZXJvLCAgICAgICVbcWM0XSAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICAgICAlW2NvdW50MV0sICAlW2NvdW50MV0sICAkdDEgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAgICAgJVtjb3VudDJdLCAgJVtjb3VudDJdLCAgJHQyICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgOiBbcWMxXSIrciIocWMxKSwgW3FjMl0iK3IiKHFjMiksCisgICAgICAgICAgICAgICAgICBbcWMzXSIrciIocWMzKSwgW3FjNF0iK3IiKHFjNCksCisgICAgICAgICAgICAgICAgICBbc2lnbjFdIj0mciIoc2lnbjEpLCBbY291bnQxXSI9JnIiKGNvdW50MSksCisgICAgICAgICAgICAgICAgICBbc2lnbjJdIj0mciIoc2lnbjIpLCBbY291bnQyXSI9JnIiKGNvdW50MikKKyAgICAgICAgICAgICAgICA6IFtpbl9pbnRdInIiKGluX2ludCkKKyAgICAgICAgICAgICAgICA6ICJ0MCIsICJ0MSIsICJ0MiIsICJ0MyIsICJ0NCIsCisgICAgICAgICAgICAgICAgICAibWVtb3J5IgorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgY3VyaWR4ID0gMTcgKiBxYzE7CisgICAgICAgICAgICBjdXJpZHggKz0gcWMyOworICAgICAgICAgICAgY3VyaWR4MiA9IDE3ICogcWMzOworICAgICAgICAgICAgY3VyaWR4MiArPSBxYzQ7CisKKyAgICAgICAgICAgIHZfY29kZXMgPSAocF9jb2Rlc1tjdXJpZHhdIDw8IGNvdW50MSkgfCBzaWduMTsKKyAgICAgICAgICAgIHZfYml0cyAgPSBwX2JpdHNbY3VyaWR4XSArIGNvdW50MTsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCB2X2JpdHMsIHZfY29kZXMpOworCisgICAgICAgICAgICB2X2NvZGVzID0gKHBfY29kZXNbY3VyaWR4Ml0gPDwgY291bnQyKSB8IHNpZ24yOworICAgICAgICAgICAgdl9iaXRzICA9IHBfYml0c1tjdXJpZHgyXSArIGNvdW50MjsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCB2X2JpdHMsIHZfY29kZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICAgICAgaW50IGN1cmlkeCwgY3VyaWR4Miwgc2lnbjEsIGNvdW50MSwgc2lnbjIsIGNvdW50MjsKKyAgICAgICAgICAgIGludCAqaW5faW50ID0gKGludCAqKSZpbltpXTsKKyAgICAgICAgICAgIHVpbnQ4X3Qgdl9iaXRzOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZfY29kZXM7CisgICAgICAgICAgICBpbnQgYzEsIGMyLCBjMywgYzQ7CisKKyAgICAgICAgICAgIHFjMSA9IHNjYWxlZFtpICBdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgICAgIHFjMiA9IHNjYWxlZFtpKzFdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgICAgIHFjMyA9IHNjYWxlZFtpKzJdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgICAgIHFjNCA9IHNjYWxlZFtpKzNdICogUTM0ICsgMC40MDU0ZjsKKworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJvcmkgICAgICAgICR0NCwgICAgICAgICR6ZXJvLCAgICAgIDE2ICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAib3JpICAgICAgICAlW3NpZ24xXSwgICAkemVybywgICAgICAwICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm9yaSAgICAgICAgJVtzaWduMl0sICAgJHplcm8sICAgICAgMCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzaGxsX3MudyAgICVbYzFdLCAgICAgICVbcWMxXSwgICAgIDE4ICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2hsbF9zLncgICAlW2MyXSwgICAgICAlW3FjMl0sICAgICAxOCAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNobGxfcy53ICAgJVtjM10sICAgICAgJVtxYzNdLCAgICAgMTggICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzaGxsX3MudyAgICVbYzRdLCAgICAgICVbcWM0XSwgICAgIDE4ICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW2MxXSwgICAgICAlW2MxXSwgICAgICAxOCAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtjMl0sICAgICAgJVtjMl0sICAgICAgMTggICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbYzNdLCAgICAgICVbYzNdLCAgICAgIDE4ICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW2M0XSwgICAgICAlW2M0XSwgICAgICAxOCAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNsdCAgICAgICAgJHQwLCAgICAgICAgJHQ0LCAgICAgICAgJVtxYzFdICBcblx0IgorICAgICAgICAgICAgICAgICJzbHQgICAgICAgICR0MSwgICAgICAgICR0NCwgICAgICAgICVbcWMyXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2x0ICAgICAgICAkdDIsICAgICAgICAkdDQsICAgICAgICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAgICAgInNsdCAgICAgICAgJHQzLCAgICAgICAgJHQ0LCAgICAgICAgJVtxYzRdICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZuICAgICAgICVbcWMxXSwgICAgICR0NCwgICAgICAgICR0MCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92biAgICAgICAlW3FjMl0sICAgICAkdDQsICAgICAgICAkdDEgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdm4gICAgICAgJVtxYzNdLCAgICAgJHQ0LCAgICAgICAgJHQyICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZuICAgICAgICVbcWM0XSwgICAgICR0NCwgICAgICAgICR0MyAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICAgICAkdDAsICAgICAgICAwKCVbaW5faW50XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgICAgJHQxLCAgICAgICAgNCglW2luX2ludF0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgICAgICR0MiwgICAgICAgIDgoJVtpbl9pbnRdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICAgICAkdDMsICAgICAgICAxMiglW2luX2ludF0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNsdCAgICAgICAgJHQwLCAgICAgICAgJHQwLCAgICAgICAgJHplcm8gICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZuICAgICAgICVbc2lnbjFdLCAgICR0MCwgICAgICAgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2x0ICAgICAgICAkdDIsICAgICAgICAkdDIsICAgICAgICAkemVybyAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdm4gICAgICAgJVtzaWduMl0sICAgJHQyLCAgICAgICAgJVtxYzNdICBcblx0IgorICAgICAgICAgICAgICAgICJzbHQgICAgICAgICR0MSwgICAgICAgICR0MSwgICAgICAgICR6ZXJvICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2xsICAgICAgICAkdDAsICAgICAgICAlW3NpZ24xXSwgICAxICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm9yICAgICAgICAgJHQwLCAgICAgICAgJHQwLCAgICAgICAgJHQxICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZuICAgICAgICVbc2lnbjFdLCAgICR0MCwgICAgICAgICVbcWMyXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2x0ICAgICAgICAkdDMsICAgICAgICAkdDMsICAgICAgICAkemVybyAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNsbCAgICAgICAgJHQwLCAgICAgICAgJVtzaWduMl0sICAgMSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJvciAgICAgICAgICR0MCwgICAgICAgICR0MCwgICAgICAgICR0MyAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92biAgICAgICAlW3NpZ24yXSwgICAkdDAsICAgICAgICAlW3FjNF0gIFxuXHQiCisgICAgICAgICAgICAgICAgInNsdCAgICAgICAgJVtjb3VudDFdLCAgJHplcm8sICAgICAgJVtxYzFdICBcblx0IgorICAgICAgICAgICAgICAgICJzbHQgICAgICAgICR0MSwgICAgICAgICR6ZXJvLCAgICAgICVbcWMyXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2x0ICAgICAgICAlW2NvdW50Ml0sICAkemVybywgICAgICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAgICAgInNsdCAgICAgICAgJHQyLCAgICAgICAgJHplcm8sICAgICAgJVtxYzRdICBcblx0IgorICAgICAgICAgICAgICAgICJhZGR1ICAgICAgICVbY291bnQxXSwgICVbY291bnQxXSwgICR0MSAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICAgICAlW2NvdW50Ml0sICAlW2NvdW50Ml0sICAkdDIgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFtxYzFdIityIihxYzEpLCBbcWMyXSIrciIocWMyKSwKKyAgICAgICAgICAgICAgICAgIFtxYzNdIityIihxYzMpLCBbcWM0XSIrciIocWM0KSwKKyAgICAgICAgICAgICAgICAgIFtzaWduMV0iPSZyIihzaWduMSksIFtjb3VudDFdIj0mciIoY291bnQxKSwKKyAgICAgICAgICAgICAgICAgIFtzaWduMl0iPSZyIihzaWduMiksIFtjb3VudDJdIj0mciIoY291bnQyKSwKKyAgICAgICAgICAgICAgICAgIFtjMV0iPSZyIihjMSksIFtjMl0iPSZyIihjMiksCisgICAgICAgICAgICAgICAgICBbYzNdIj0mciIoYzMpLCBbYzRdIj0mciIoYzQpCisgICAgICAgICAgICAgICAgOiBbaW5faW50XSJyIihpbl9pbnQpCisgICAgICAgICAgICAgICAgOiAidDAiLCAidDEiLCAidDIiLCAidDMiLCAidDQiLAorICAgICAgICAgICAgICAgICAgIm1lbW9yeSIKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIGN1cmlkeCA9IDE3ICogcWMxOworICAgICAgICAgICAgY3VyaWR4ICs9IHFjMjsKKworICAgICAgICAgICAgY3VyaWR4MiA9IDE3ICogcWMzOworICAgICAgICAgICAgY3VyaWR4MiArPSBxYzQ7CisKKyAgICAgICAgICAgIHZfY29kZXMgPSAocF9jb2Rlc1tjdXJpZHhdIDw8IGNvdW50MSkgfCBzaWduMTsKKyAgICAgICAgICAgIHZfYml0cyAgPSBwX2JpdHNbY3VyaWR4XSArIGNvdW50MTsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCB2X2JpdHMsIHZfY29kZXMpOworCisgICAgICAgICAgICBpZiAocF92ZWN0b3JzW2N1cmlkeCoyICBdID09IDY0LjBmKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IGF2X2xvZzIoYzEpOworICAgICAgICAgICAgICAgIHZfY29kZXMgPSAoKCgxIDw8IChsZW4gLSAzKSkgLSAyKSA8PCBsZW4pIHwgKGMxICYgKCgxIDw8IGxlbikgLSAxKSk7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIsIGxlbiAqIDIgLSAzLCB2X2NvZGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwX3ZlY3RvcnNbY3VyaWR4KjIrMV0gPT0gNjQuMGYpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gYXZfbG9nMihjMik7CisgICAgICAgICAgICAgICAgdl9jb2RlcyA9ICgoKDEgPDwgKGxlbiAtIDMpKSAtIDIpIDw8IGxlbikgfCAoYzIgJiAoKDEgPDwgbGVuKSAtIDEpKTsKKyAgICAgICAgICAgICAgICBwdXRfYml0cyhwYiwgbGVuKjItMywgdl9jb2Rlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZfY29kZXMgPSAocF9jb2Rlc1tjdXJpZHgyXSA8PCBjb3VudDIpIHwgc2lnbjI7CisgICAgICAgICAgICB2X2JpdHMgID0gcF9iaXRzW2N1cmlkeDJdICsgY291bnQyOworICAgICAgICAgICAgcHV0X2JpdHMocGIsIHZfYml0cywgdl9jb2Rlcyk7CisKKyAgICAgICAgICAgIGlmIChwX3ZlY3RvcnNbY3VyaWR4MioyICBdID09IDY0LjBmKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IGF2X2xvZzIoYzMpOworICAgICAgICAgICAgICAgIHZfY29kZXMgPSAoKCgxIDw8IChsZW4gLSAzKSkgLSAyKSA8PCBsZW4pIHwgKGMzICYgKCgxIDw8IGxlbikgLSAxKSk7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIsIGxlbiogMiAtIDMsIHZfY29kZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBfdmVjdG9yc1tjdXJpZHgyKjIrMV0gPT0gNjQuMGYpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gYXZfbG9nMihjNCk7CisgICAgICAgICAgICAgICAgdl9jb2RlcyA9ICgoKDEgPDwgKGxlbiAtIDMpKSAtIDIpIDw8IGxlbikgfCAoYzQgJiAoKDEgPDwgbGVuKSAtIDEpKTsKKyAgICAgICAgICAgICAgICBwdXRfYml0cyhwYiwgbGVuICogMiAtIDMsIHZfY29kZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCAoKmNvbnN0IHF1YW50aXplX2FuZF9lbmNvZGVfYmFuZF9jb3N0X2FycltdKShzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKnBiLCBjb25zdCBmbG9hdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYml0cykgPSB7CisgICAgTlVMTCwKKyAgICBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdF9TUVVBRF9taXBzLAorICAgIHF1YW50aXplX2FuZF9lbmNvZGVfYmFuZF9jb3N0X1NRVUFEX21pcHMsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfVVFVQURfbWlwcywKKyAgICBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdF9VUVVBRF9taXBzLAorICAgIHF1YW50aXplX2FuZF9lbmNvZGVfYmFuZF9jb3N0X1NQQUlSX21pcHMsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfU1BBSVJfbWlwcywKKyAgICBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdF9VUEFJUjdfbWlwcywKKyAgICBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdF9VUEFJUjdfbWlwcywKKyAgICBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdF9VUEFJUjEyX21pcHMsCisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3RfVVBBSVIxMl9taXBzLAorICAgIHF1YW50aXplX2FuZF9lbmNvZGVfYmFuZF9jb3N0X0VTQ19taXBzLAorfTsKKworI2RlZmluZSBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBwYiwgaW4sIHNjYWxlZCwgc2l6ZSwgc2NhbGVfaWR4LCBjYiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEsIHVwbGltLCBiaXRzKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHF1YW50aXplX2FuZF9lbmNvZGVfYmFuZF9jb3N0X2FycltjYl0oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBwYiwgaW4sIHNjYWxlZCwgc2l6ZSwgc2NhbGVfaWR4LCBjYiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEsIHVwbGltLCBiaXRzKQorCitzdGF0aWMgdm9pZCBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfbWlwcyhzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywgUHV0Qml0Q29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW4sIGludCBzaXplLCBpbnQgc2NhbGVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLCBjb25zdCBmbG9hdCBsYW1iZGEpCit7CisgICAgcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX2Nvc3QocywgcGIsIGluLCBOVUxMLCBzaXplLCBzY2FsZV9pZHgsIGNiLCBsYW1iZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GSU5JVFksIE5VTEwpOworfQorCisvKioKKyAqIEZ1bmN0aW9ucyBkZXZlbG9wZWQgZnJvbSB0ZW1wbGF0ZSBmdW5jdGlvbiBhbmQgb3B0aW1pemVkIGZvciBnZXR0aW5nIHRoZSBudW1iZXIgb2YgYml0cworICovCitzdGF0aWMgZmxvYXQgZ2V0X2JhbmRfbnVtYml0c19aRVJPX21pcHMoc3RydWN0IEFBQ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqcGIsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2IsIGNvbnN0IGZsb2F0IGxhbWJkYSwgY29uc3QgZmxvYXQgdXBsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpiaXRzKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgZmxvYXQgZ2V0X2JhbmRfbnVtYml0c19TUVVBRF9taXBzKHN0cnVjdCBBQUNFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLCBjb25zdCBmbG9hdCBsYW1iZGEsIGNvbnN0IGZsb2F0IHVwbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgY29uc3QgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjYWxlX2lkeCArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcWMxLCBxYzIsIHFjMywgcWM0OworICAgIGludCBjdXJiaXRzID0gMDsKKworICAgIHVpbnQ4X3QgKnBfYml0cyA9ICh1aW50OF90ICopZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7CisgICAgICAgIGludCBjdXJpZHg7CisgICAgICAgIGludCAqaW5faW50ID0gKGludCAqKSZpbltpXTsKKworICAgICAgICBxYzEgPSBzY2FsZWRbaSAgXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMiA9IHNjYWxlZFtpKzFdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWMzID0gc2NhbGVkW2krMl0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzQgPSBzY2FsZWRbaSszXSAqIFEzNCArIDAuNDA1NGY7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJzbHQgICAgJVtxYzFdLCAkemVybywgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJVtxYzJdLCAkemVybywgICVbcWMyXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJVtxYzNdLCAkemVybywgICVbcWMzXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJVtxYzRdLCAkemVybywgICVbcWM0XSAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgJHQwLCAgICAwKCVbaW5faW50XSkgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgJHQxLCAgICA0KCVbaW5faW50XSkgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgJHQyLCAgICA4KCVbaW5faW50XSkgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgJHQzLCAgICAxMiglW2luX2ludF0pICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgJHQwLCAgICAkdDAsICAgIDMxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgJHQxLCAgICAkdDEsICAgIDMxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgJHQyLCAgICAkdDIsICAgIDMxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgJHQzLCAgICAkdDMsICAgIDMxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgJHQ0LCAgICAkemVybywgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgJHQ1LCAgICAkemVybywgICVbcWMyXSAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgJHQ2LCAgICAkemVybywgICVbcWMzXSAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgJHQ3LCAgICAkemVybywgICVbcWM0XSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzFdLCAkdDQsICAgICR0MCAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzJdLCAkdDUsICAgICR0MSAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzNdLCAkdDYsICAgICR0MiAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzRdLCAkdDcsICAgICR0MyAgICAgXG5cdCIKKworICAgICAgICAgICAgIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFtxYzFdIityIihxYzEpLCBbcWMyXSIrciIocWMyKSwKKyAgICAgICAgICAgICAgW3FjM10iK3IiKHFjMyksIFtxYzRdIityIihxYzQpCisgICAgICAgICAgICA6IFtpbl9pbnRdInIiKGluX2ludCkKKyAgICAgICAgICAgIDogInQwIiwgInQxIiwgInQyIiwgInQzIiwKKyAgICAgICAgICAgICAgInQ0IiwgInQ1IiwgInQ2IiwgInQ3IiwKKyAgICAgICAgICAgICAgIm1lbW9yeSIKKyAgICAgICAgKTsKKworICAgICAgICBjdXJpZHggPSBxYzE7CisgICAgICAgIGN1cmlkeCAqPSAzOworICAgICAgICBjdXJpZHggKz0gcWMyOworICAgICAgICBjdXJpZHggKj0gMzsKKyAgICAgICAgY3VyaWR4ICs9IHFjMzsKKyAgICAgICAgY3VyaWR4ICo9IDM7CisgICAgICAgIGN1cmlkeCArPSBxYzQ7CisgICAgICAgIGN1cmlkeCArPSA0MDsKKworICAgICAgICBjdXJiaXRzICs9IHBfYml0c1tjdXJpZHhdOworICAgIH0KKyAgICByZXR1cm4gY3VyYml0czsKK30KKworc3RhdGljIGZsb2F0IGdldF9iYW5kX251bWJpdHNfVVFVQURfbWlwcyhzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqcGIsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpiaXRzKQoreworICAgIGNvbnN0IGZsb2F0IFEzNCA9IGZmX2FhY19wb3czNHNmX3RhYltQT1dfU0YyX1pFUk8gLSBzY2FsZV9pZHggKyBTQ0FMRV9PTkVfUE9TIC0gU0NBTEVfRElWXzUxMl07CisgICAgaW50IGk7CisgICAgaW50IGN1cmJpdHMgPSAwOworICAgIGludCBxYzEsIHFjMiwgcWMzLCBxYzQ7CisKKyAgICB1aW50OF90ICpwX2JpdHMgPSAodWludDhfdCAqKWZmX2FhY19zcGVjdHJhbF9iaXRzW2NiLTFdOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICBpbnQgY3VyaWR4OworCisgICAgICAgIHFjMSA9IHNjYWxlZFtpICBdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWMyID0gc2NhbGVkW2krMV0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzMgPSBzY2FsZWRbaSsyXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjNCA9IHNjYWxlZFtpKzNdICogUTM0ICsgMC40MDU0ZjsKKworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICIuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgIm9yaSAgICAkdDQsICAgICR6ZXJvLCAgMiAgICAgICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDAsICAgICR0NCwgICAgJVtxYzFdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDEsICAgICR0NCwgICAgJVtxYzJdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDIsICAgICR0NCwgICAgJVtxYzNdICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAkdDMsICAgICR0NCwgICAgJVtxYzRdICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjMV0sICR0NCwgICAgJHQwICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjMl0sICR0NCwgICAgJHQxICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjM10sICR0NCwgICAgJHQyICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAlW3FjNF0sICR0NCwgICAgJHQzICAgICBcblx0IgorCisgICAgICAgICAgICAiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3FjMV0iK3IiKHFjMSksIFtxYzJdIityIihxYzIpLAorICAgICAgICAgICAgICBbcWMzXSIrciIocWMzKSwgW3FjNF0iK3IiKHFjNCkKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIDogInQwIiwgInQxIiwgInQyIiwgInQzIiwgInQ0IgorICAgICAgICApOworCisgICAgICAgIGN1cmlkeCA9IHFjMTsKKyAgICAgICAgY3VyaWR4ICo9IDM7CisgICAgICAgIGN1cmlkeCArPSBxYzI7CisgICAgICAgIGN1cmlkeCAqPSAzOworICAgICAgICBjdXJpZHggKz0gcWMzOworICAgICAgICBjdXJpZHggKj0gMzsKKyAgICAgICAgY3VyaWR4ICs9IHFjNDsKKworICAgICAgICBjdXJiaXRzICs9IHBfYml0c1tjdXJpZHhdOworICAgICAgICBjdXJiaXRzICs9IHVxdWFkX3NpZ25fYml0c1tjdXJpZHhdOworICAgIH0KKyAgICByZXR1cm4gY3VyYml0czsKK30KKworc3RhdGljIGZsb2F0IGdldF9iYW5kX251bWJpdHNfU1BBSVJfbWlwcyhzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqcGIsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpiaXRzKQoreworICAgIGNvbnN0IGZsb2F0IFEzNCA9IGZmX2FhY19wb3czNHNmX3RhYltQT1dfU0YyX1pFUk8gLSBzY2FsZV9pZHggKyBTQ0FMRV9PTkVfUE9TIC0gU0NBTEVfRElWXzUxMl07CisgICAgaW50IGk7CisgICAgaW50IHFjMSwgcWMyLCBxYzMsIHFjNDsKKyAgICBpbnQgY3VyYml0cyA9IDA7CisKKyAgICB1aW50OF90ICpwX2JpdHMgPSAodWludDhfdCopZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7CisgICAgICAgIGludCBjdXJpZHgsIGN1cmlkeDI7CisgICAgICAgIGludCAqaW5faW50ID0gKGludCAqKSZpbltpXTsKKworICAgICAgICBxYzEgPSBzY2FsZWRbaSAgXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMiA9IHNjYWxlZFtpKzFdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWMzID0gc2NhbGVkW2krMl0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzQgPSBzY2FsZWRbaSszXSAqIFEzNCArIDAuNDA1NGY7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJvcmkgICAgJHQ0LCAgICAkemVybywgIDQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQwLCAgICAkdDQsICAgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQxLCAgICAkdDQsICAgICVbcWMyXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQyLCAgICAkdDQsICAgICVbcWMzXSAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgJHQzLCAgICAkdDQsICAgICVbcWM0XSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzFdLCAkdDQsICAgICR0MCAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzJdLCAkdDQsICAgICR0MSAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzNdLCAkdDQsICAgICR0MiAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzRdLCAkdDQsICAgICR0MyAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgJHQwLCAgICAwKCVbaW5faW50XSkgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgJHQxLCAgICA0KCVbaW5faW50XSkgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgJHQyLCAgICA4KCVbaW5faW50XSkgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgJHQzLCAgICAxMiglW2luX2ludF0pICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgJHQwLCAgICAkdDAsICAgIDMxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgJHQxLCAgICAkdDEsICAgIDMxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgJHQyLCAgICAkdDIsICAgIDMxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgJHQzLCAgICAkdDMsICAgIDMxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgJHQ0LCAgICAkemVybywgICVbcWMxXSAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgJHQ1LCAgICAkemVybywgICVbcWMyXSAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgJHQ2LCAgICAkemVybywgICVbcWMzXSAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgJHQ3LCAgICAkemVybywgICVbcWM0XSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzFdLCAkdDQsICAgICR0MCAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzJdLCAkdDUsICAgICR0MSAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzNdLCAkdDYsICAgICR0MiAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgJVtxYzRdLCAkdDcsICAgICR0MyAgICAgXG5cdCIKKworICAgICAgICAgICAgIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFtxYzFdIityIihxYzEpLCBbcWMyXSIrciIocWMyKSwKKyAgICAgICAgICAgICAgW3FjM10iK3IiKHFjMyksIFtxYzRdIityIihxYzQpCisgICAgICAgICAgICA6IFtpbl9pbnRdInIiKGluX2ludCkKKyAgICAgICAgICAgIDogInQwIiwgInQxIiwgInQyIiwgInQzIiwKKyAgICAgICAgICAgICAgInQ0IiwgInQ1IiwgInQ2IiwgInQ3IiwKKyAgICAgICAgICAgICAgIm1lbW9yeSIKKyAgICAgICAgKTsKKworICAgICAgICBjdXJpZHggID0gOSAqIHFjMTsKKyAgICAgICAgY3VyaWR4ICs9IHFjMiArIDQwOworCisgICAgICAgIGN1cmlkeDIgID0gOSAqIHFjMzsKKyAgICAgICAgY3VyaWR4MiArPSBxYzQgKyA0MDsKKworICAgICAgICBjdXJiaXRzICs9IHBfYml0c1tjdXJpZHhdICsgcF9iaXRzW2N1cmlkeDJdOworICAgIH0KKyAgICByZXR1cm4gY3VyYml0czsKK30KKworc3RhdGljIGZsb2F0IGdldF9iYW5kX251bWJpdHNfVVBBSVI3X21pcHMoc3RydWN0IEFBQ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2IsIGNvbnN0IGZsb2F0IGxhbWJkYSwgY29uc3QgZmxvYXQgdXBsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgY29uc3QgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjYWxlX2lkeCArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcWMxLCBxYzIsIHFjMywgcWM0OworICAgIGludCBjdXJiaXRzID0gMDsKKworICAgIHVpbnQ4X3QgKnBfYml0cyA9ICh1aW50OF90ICopZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7CisgICAgICAgIGludCBjdXJpZHgsIGN1cmlkeDI7CisKKyAgICAgICAgcWMxID0gc2NhbGVkW2kgIF0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzIgPSBzY2FsZWRbaSsxXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMyA9IHNjYWxlZFtpKzJdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWM0ID0gc2NhbGVkW2krM10gKiBRMzQgKyAwLjQwNTRmOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAib3JpICAgICR0NCwgICAgJHplcm8sICA3ICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MCwgICAgJHQ0LCAgICAlW3FjMV0gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MSwgICAgJHQ0LCAgICAlW3FjMl0gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MiwgICAgJHQ0LCAgICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MywgICAgJHQ0LCAgICAlW3FjNF0gIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMxXSwgJHQ0LCAgICAkdDAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMyXSwgJHQ0LCAgICAkdDEgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMzXSwgJHQ0LCAgICAkdDIgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWM0XSwgJHQ0LCAgICAkdDMgICAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbcWMxXSIrciIocWMxKSwgW3FjMl0iK3IiKHFjMiksCisgICAgICAgICAgICAgIFtxYzNdIityIihxYzMpLCBbcWM0XSIrciIocWM0KQorICAgICAgICAgICAgOgorICAgICAgICAgICAgOiAidDAiLCAidDEiLCAidDIiLCAidDMiLCAidDQiCisgICAgICAgICk7CisKKyAgICAgICAgY3VyaWR4ICA9IDggKiBxYzE7CisgICAgICAgIGN1cmlkeCArPSBxYzI7CisKKyAgICAgICAgY3VyaWR4MiAgPSA4ICogcWMzOworICAgICAgICBjdXJpZHgyICs9IHFjNDsKKworICAgICAgICBjdXJiaXRzICs9IHBfYml0c1tjdXJpZHhdICsKKyAgICAgICAgICAgICAgICAgICB1cGFpcjdfc2lnbl9iaXRzW2N1cmlkeF0gKworICAgICAgICAgICAgICAgICAgIHBfYml0c1tjdXJpZHgyXSArCisgICAgICAgICAgICAgICAgICAgdXBhaXI3X3NpZ25fYml0c1tjdXJpZHgyXTsKKyAgICB9CisgICAgcmV0dXJuIGN1cmJpdHM7Cit9CisKK3N0YXRpYyBmbG9hdCBnZXRfYmFuZF9udW1iaXRzX1VQQUlSMTJfbWlwcyhzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZWQsIGludCBzaXplLCBpbnQgc2NhbGVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgY29uc3QgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjYWxlX2lkeCArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBpbnQgaTsKKyAgICBpbnQgcWMxLCBxYzIsIHFjMywgcWM0OworICAgIGludCBjdXJiaXRzID0gMDsKKworICAgIHVpbnQ4X3QgKnBfYml0cyA9ICh1aW50OF90ICopZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7CisgICAgICAgIGludCBjdXJpZHgsIGN1cmlkeDI7CisKKyAgICAgICAgcWMxID0gc2NhbGVkW2kgIF0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzIgPSBzY2FsZWRbaSsxXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMyA9IHNjYWxlZFtpKzJdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWM0ID0gc2NhbGVkW2krM10gKiBRMzQgKyAwLjQwNTRmOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAib3JpICAgICR0NCwgICAgJHplcm8sICAxMiAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MCwgICAgJHQ0LCAgICAlW3FjMV0gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MSwgICAgJHQ0LCAgICAlW3FjMl0gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MiwgICAgJHQ0LCAgICAlW3FjM10gIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICR0MywgICAgJHQ0LCAgICAlW3FjNF0gIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMxXSwgJHQ0LCAgICAkdDAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMyXSwgJHQ0LCAgICAkdDEgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWMzXSwgJHQ0LCAgICAkdDIgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICVbcWM0XSwgJHQ0LCAgICAkdDMgICAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbcWMxXSIrciIocWMxKSwgW3FjMl0iK3IiKHFjMiksCisgICAgICAgICAgICAgIFtxYzNdIityIihxYzMpLCBbcWM0XSIrciIocWM0KQorICAgICAgICAgICAgOgorICAgICAgICAgICAgOiAidDAiLCAidDEiLCAidDIiLCAidDMiLCAidDQiCisgICAgICAgICk7CisKKyAgICAgICAgY3VyaWR4ICA9IDEzICogcWMxOworICAgICAgICBjdXJpZHggKz0gcWMyOworCisgICAgICAgIGN1cmlkeDIgID0gMTMgKiBxYzM7CisgICAgICAgIGN1cmlkeDIgKz0gcWM0OworCisgICAgICAgIGN1cmJpdHMgKz0gcF9iaXRzW2N1cmlkeF0gKworICAgICAgICAgICAgICAgICAgIHBfYml0c1tjdXJpZHgyXSArCisgICAgICAgICAgICAgICAgICAgdXBhaXIxMl9zaWduX2JpdHNbY3VyaWR4XSArCisgICAgICAgICAgICAgICAgICAgdXBhaXIxMl9zaWduX2JpdHNbY3VyaWR4Ml07CisgICAgfQorICAgIHJldHVybiBjdXJiaXRzOworfQorCitzdGF0aWMgZmxvYXQgZ2V0X2JhbmRfbnVtYml0c19FU0NfbWlwcyhzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKnBiLCBjb25zdCBmbG9hdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYml0cykKK3sKKyAgICBjb25zdCBmbG9hdCBRMzQgPSBmZl9hYWNfcG93MzRzZl90YWJbUE9XX1NGMl9aRVJPIC0gc2NhbGVfaWR4ICsgU0NBTEVfT05FX1BPUyAtIFNDQUxFX0RJVl81MTJdOworICAgIGludCBpOworICAgIGludCBxYzEsIHFjMiwgcWMzLCBxYzQ7CisgICAgaW50IGN1cmJpdHMgPSAwOworCisgICAgdWludDhfdCAqcF9iaXRzID0gKHVpbnQ4X3QqKWZmX2FhY19zcGVjdHJhbF9iaXRzW2NiLTFdOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICBpbnQgY3VyaWR4LCBjdXJpZHgyOworICAgICAgICBpbnQgY29uZDAsIGNvbmQxLCBjb25kMiwgY29uZDM7CisgICAgICAgIGludCBjMSwgYzIsIGMzLCBjNDsKKworICAgICAgICBxYzEgPSBzY2FsZWRbaSAgXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMiA9IHNjYWxlZFtpKzFdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWMzID0gc2NhbGVkW2krMl0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzQgPSBzY2FsZWRbaSszXSAqIFEzNCArIDAuNDA1NGY7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJvcmkgICAgICAgICR0NCwgICAgICAgICR6ZXJvLCAgMTUgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJvcmkgICAgICAgICR0NSwgICAgICAgICR6ZXJvLCAgMTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzaGxsX3MudyAgICVbYzFdLCAgICAgICVbcWMxXSwgMTggICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzaGxsX3MudyAgICVbYzJdLCAgICAgICVbcWMyXSwgMTggICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzaGxsX3MudyAgICVbYzNdLCAgICAgICVbcWMzXSwgMTggICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzaGxsX3MudyAgICVbYzRdLCAgICAgICVbcWM0XSwgMTggICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgICAgICVbYzFdLCAgICAgICVbYzFdLCAgMTggICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgICAgICVbYzJdLCAgICAgICVbYzJdLCAgMTggICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgICAgICVbYzNdLCAgICAgICVbYzNdLCAgMTggICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzcmwgICAgICAgICVbYzRdLCAgICAgICVbYzRdLCAgMTggICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICVbY29uZDBdLCAgICR0NCwgICAgJVtxYzFdICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICVbY29uZDFdLCAgICR0NCwgICAgJVtxYzJdICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICVbY29uZDJdLCAgICR0NCwgICAgJVtxYzNdICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICVbY29uZDNdLCAgICR0NCwgICAgJVtxYzRdICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgICAgICVbcWMxXSwgICAgICR0NSwgICAgJVtjb25kMF0gICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgICAgICVbcWMyXSwgICAgICR0NSwgICAgJVtjb25kMV0gICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgICAgICVbcWMzXSwgICAgICR0NSwgICAgJVtjb25kMl0gICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgICAgICVbcWM0XSwgICAgICR0NSwgICAgJVtjb25kM10gICAgXG5cdCIKKyAgICAgICAgICAgICJvcmkgICAgICAgICR0NSwgICAgICAgICR6ZXJvLCAgMzEgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJjbHogICAgICAgICVbYzFdLCAgICAgICVbYzFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJjbHogICAgICAgICVbYzJdLCAgICAgICVbYzJdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJjbHogICAgICAgICVbYzNdLCAgICAgICVbYzNdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJjbHogICAgICAgICVbYzRdLCAgICAgICVbYzRdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgICAgICVbYzFdLCAgICAgICR0NSwgICAgJVtjMV0gICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgICAgICVbYzJdLCAgICAgICR0NSwgICAgJVtjMl0gICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgICAgICVbYzNdLCAgICAgICR0NSwgICAgJVtjM10gICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgICAgICVbYzRdLCAgICAgICR0NSwgICAgJVtjNF0gICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICAgICAgICVbYzFdLCAgICAgICVbYzFdLCAgMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICAgICAgICVbYzJdLCAgICAgICVbYzJdLCAgMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICAgICAgICVbYzNdLCAgICAgICVbYzNdLCAgMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICAgICAgICVbYzRdLCAgICAgICVbYzRdLCAgMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICAgICVbYzFdLCAgICAgICVbYzFdLCAgLTMgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICAgICVbYzJdLCAgICAgICVbYzJdLCAgLTMgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICAgICVbYzNdLCAgICAgICVbYzNdLCAgLTMgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICAgICVbYzRdLCAgICAgICVbYzRdLCAgLTMgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgICAgICVbY29uZDBdLCAgICR6ZXJvLCAgJVtjb25kMF0gICAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgICAgICVbY29uZDFdLCAgICR6ZXJvLCAgJVtjb25kMV0gICAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgICAgICVbY29uZDJdLCAgICR6ZXJvLCAgJVtjb25kMl0gICAgXG5cdCIKKyAgICAgICAgICAgICJzdWJ1ICAgICAgICVbY29uZDNdLCAgICR6ZXJvLCAgJVtjb25kM10gICAgXG5cdCIKKyAgICAgICAgICAgICJhbmQgICAgICAgICVbYzFdLCAgICAgICVbYzFdLCAgJVtjb25kMF0gICAgXG5cdCIKKyAgICAgICAgICAgICJhbmQgICAgICAgICVbYzJdLCAgICAgICVbYzJdLCAgJVtjb25kMV0gICAgXG5cdCIKKyAgICAgICAgICAgICJhbmQgICAgICAgICVbYzNdLCAgICAgICVbYzNdLCAgJVtjb25kMl0gICAgXG5cdCIKKyAgICAgICAgICAgICJhbmQgICAgICAgICVbYzRdLCAgICAgICVbYzRdLCAgJVtjb25kM10gICAgXG5cdCIKKworICAgICAgICAgICAgIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFtxYzFdIityIihxYzEpLCBbcWMyXSIrciIocWMyKSwKKyAgICAgICAgICAgICAgW3FjM10iK3IiKHFjMyksIFtxYzRdIityIihxYzQpLAorICAgICAgICAgICAgICBbY29uZDBdIj0mciIoY29uZDApLCBbY29uZDFdIj0mciIoY29uZDEpLAorICAgICAgICAgICAgICBbY29uZDJdIj0mciIoY29uZDIpLCBbY29uZDNdIj0mciIoY29uZDMpLAorICAgICAgICAgICAgICBbYzFdIj0mciIoYzEpLCBbYzJdIj0mciIoYzIpLAorICAgICAgICAgICAgICBbYzNdIj0mciIoYzMpLCBbYzRdIj0mciIoYzQpCisgICAgICAgICAgICA6CisgICAgICAgICAgICA6ICJ0NCIsICJ0NSIKKyAgICAgICAgKTsKKworICAgICAgICBjdXJpZHggPSAxNyAqIHFjMTsKKyAgICAgICAgY3VyaWR4ICs9IHFjMjsKKworICAgICAgICBjdXJpZHgyID0gMTcgKiBxYzM7CisgICAgICAgIGN1cmlkeDIgKz0gcWM0OworCisgICAgICAgIGN1cmJpdHMgKz0gcF9iaXRzW2N1cmlkeF07CisgICAgICAgIGN1cmJpdHMgKz0gZXNjX3NpZ25fYml0c1tjdXJpZHhdOworICAgICAgICBjdXJiaXRzICs9IHBfYml0c1tjdXJpZHgyXTsKKyAgICAgICAgY3VyYml0cyArPSBlc2Nfc2lnbl9iaXRzW2N1cmlkeDJdOworCisgICAgICAgIGN1cmJpdHMgKz0gYzE7CisgICAgICAgIGN1cmJpdHMgKz0gYzI7CisgICAgICAgIGN1cmJpdHMgKz0gYzM7CisgICAgICAgIGN1cmJpdHMgKz0gYzQ7CisgICAgfQorICAgIHJldHVybiBjdXJiaXRzOworfQorCitzdGF0aWMgZmxvYXQgKCpjb25zdCBnZXRfYmFuZF9udW1iaXRzX2FycltdKShzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKnBiLCBjb25zdCBmbG9hdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYml0cykgPSB7CisgICAgZ2V0X2JhbmRfbnVtYml0c19aRVJPX21pcHMsCisgICAgZ2V0X2JhbmRfbnVtYml0c19TUVVBRF9taXBzLAorICAgIGdldF9iYW5kX251bWJpdHNfU1FVQURfbWlwcywKKyAgICBnZXRfYmFuZF9udW1iaXRzX1VRVUFEX21pcHMsCisgICAgZ2V0X2JhbmRfbnVtYml0c19VUVVBRF9taXBzLAorICAgIGdldF9iYW5kX251bWJpdHNfU1BBSVJfbWlwcywKKyAgICBnZXRfYmFuZF9udW1iaXRzX1NQQUlSX21pcHMsCisgICAgZ2V0X2JhbmRfbnVtYml0c19VUEFJUjdfbWlwcywKKyAgICBnZXRfYmFuZF9udW1iaXRzX1VQQUlSN19taXBzLAorICAgIGdldF9iYW5kX251bWJpdHNfVVBBSVIxMl9taXBzLAorICAgIGdldF9iYW5kX251bWJpdHNfVVBBSVIxMl9taXBzLAorICAgIGdldF9iYW5kX251bWJpdHNfRVNDX21pcHMsCit9OworCisjZGVmaW5lIGdldF9iYW5kX251bWJpdHMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgcGIsIGluLCBzY2FsZWQsIHNpemUsIHNjYWxlX2lkeCwgY2IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhLCB1cGxpbSwgYml0cykgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZXRfYmFuZF9udW1iaXRzX2FycltjYl0oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBwYiwgaW4sIHNjYWxlZCwgc2l6ZSwgc2NhbGVfaWR4LCBjYiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEsIHVwbGltLCBiaXRzKQorCitzdGF0aWMgZmxvYXQgcXVhbnRpemVfYmFuZF9jb3N0X2JpdHMoc3RydWN0IEFBQ0VuY0NvbnRleHQgKnMsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2IsIGNvbnN0IGZsb2F0IGxhbWJkYSwgY29uc3QgZmxvYXQgdXBsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpiaXRzKQoreworICAgIHJldHVybiBnZXRfYmFuZF9udW1iaXRzKHMsIE5VTEwsIGluLCBzY2FsZWQsIHNpemUsIHNjYWxlX2lkeCwgY2IsIGxhbWJkYSwgdXBsaW0sIGJpdHMpOworfQorCisvKioKKyAqIEZ1bmN0aW9ucyBkZXZlbG9wZWQgZnJvbSB0ZW1wbGF0ZSBmdW5jdGlvbiBhbmQgb3B0aW1pemVkIGZvciBnZXR0aW5nIHRoZSBiYW5kIGNvc3QKKyAqLworI2lmIEhBVkVfTUlQU0ZQVQorc3RhdGljIGZsb2F0IGdldF9iYW5kX2Nvc3RfWkVST19taXBzKHN0cnVjdCBBQUNFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKnBiLCBjb25zdCBmbG9hdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLCBjb25zdCBmbG9hdCBsYW1iZGEsIGNvbnN0IGZsb2F0IHVwbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYml0cykKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCBjb3N0ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IDQpIHsKKyAgICAgICAgY29zdCArPSBpbltpICBdICogaW5baSAgXTsKKyAgICAgICAgY29zdCArPSBpbltpKzFdICogaW5baSsxXTsKKyAgICAgICAgY29zdCArPSBpbltpKzJdICogaW5baSsyXTsKKyAgICAgICAgY29zdCArPSBpbltpKzNdICogaW5baSszXTsKKyAgICB9CisgICAgaWYgKGJpdHMpCisgICAgICAgICpiaXRzID0gMDsKKyAgICByZXR1cm4gY29zdCAqIGxhbWJkYTsKK30KKworc3RhdGljIGZsb2F0IGdldF9iYW5kX2Nvc3RfU1FVQURfbWlwcyhzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqcGIsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpiaXRzKQoreworICAgIGNvbnN0IGZsb2F0IFEzNCA9IGZmX2FhY19wb3czNHNmX3RhYltQT1dfU0YyX1pFUk8gLSBzY2FsZV9pZHggKyBTQ0FMRV9PTkVfUE9TIC0gU0NBTEVfRElWXzUxMl07CisgICAgY29uc3QgZmxvYXQgSVEgID0gZmZfYWFjX3BvdzJzZl90YWIgW1BPV19TRjJfWkVSTyArIHNjYWxlX2lkeCAtIFNDQUxFX09ORV9QT1MgKyBTQ0FMRV9ESVZfNTEyXTsKKyAgICBpbnQgaTsKKyAgICBmbG9hdCBjb3N0ID0gMDsKKyAgICBpbnQgcWMxLCBxYzIsIHFjMywgcWM0OworICAgIGludCBjdXJiaXRzID0gMDsKKworICAgIHVpbnQ4X3QgKnBfYml0cyAgPSAodWludDhfdCAqKWZmX2FhY19zcGVjdHJhbF9iaXRzW2NiLTFdOworICAgIGZsb2F0ICAgKnBfY29kZXMgPSAoZmxvYXQgICAqKWZmX2FhY19jb2RlYm9va192ZWN0b3JzW2NiLTFdOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICBjb25zdCBmbG9hdCAqdmVjOworICAgICAgICBpbnQgY3VyaWR4OworICAgICAgICBpbnQgICAqaW5faW50ID0gKGludCAgICopJmluW2ldOworICAgICAgICBmbG9hdCAqaW5fcG9zID0gKGZsb2F0ICopJmluW2ldOworICAgICAgICBmbG9hdCBkaTAsIGRpMSwgZGkyLCBkaTM7CisKKyAgICAgICAgcWMxID0gc2NhbGVkW2kgIF0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzIgPSBzY2FsZWRbaSsxXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMyA9IHNjYWxlZFtpKzJdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWM0ID0gc2NhbGVkW2krM10gKiBRMzQgKyAwLjQwNTRmOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAic2x0ICAgICAgICAlW3FjMV0sICR6ZXJvLCAgJVtxYzFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAlW3FjMl0sICR6ZXJvLCAgJVtxYzJdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAlW3FjM10sICR6ZXJvLCAgJVtxYzNdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAlW3FjNF0sICR6ZXJvLCAgJVtxYzRdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgICAkdDAsICAgIDAoJVtpbl9pbnRdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgICAkdDEsICAgIDQoJVtpbl9pbnRdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgICAkdDIsICAgIDgoJVtpbl9pbnRdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgICAkdDMsICAgIDEyKCVbaW5faW50XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAkdDAsICAgICR0MCwgICAgMzEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAkdDEsICAgICR0MSwgICAgMzEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAkdDIsICAgICR0MiwgICAgMzEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAkdDMsICAgICR0MywgICAgMzEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICAgICAkdDQsICAgICR6ZXJvLCAgJVtxYzFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICAgICAkdDUsICAgICR6ZXJvLCAgJVtxYzJdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICAgICAkdDYsICAgICR6ZXJvLCAgJVtxYzNdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICAgICAkdDcsICAgICR6ZXJvLCAgJVtxYzRdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMV0sICR0NCwgICAgJHQwICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMl0sICR0NSwgICAgJHQxICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjM10sICR0NiwgICAgJHQyICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjNF0sICR0NywgICAgJHQzICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbcWMxXSIrciIocWMxKSwgW3FjMl0iK3IiKHFjMiksCisgICAgICAgICAgICAgIFtxYzNdIityIihxYzMpLCBbcWM0XSIrciIocWM0KQorICAgICAgICAgICAgOiBbaW5faW50XSJyIihpbl9pbnQpCisgICAgICAgICAgICA6ICJ0MCIsICJ0MSIsICJ0MiIsICJ0MyIsCisgICAgICAgICAgICAgICJ0NCIsICJ0NSIsICJ0NiIsICJ0NyIsCisgICAgICAgICAgICAgICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgY3VyaWR4ID0gcWMxOworICAgICAgICBjdXJpZHggKj0gMzsKKyAgICAgICAgY3VyaWR4ICs9IHFjMjsKKyAgICAgICAgY3VyaWR4ICo9IDM7CisgICAgICAgIGN1cmlkeCArPSBxYzM7CisgICAgICAgIGN1cmlkeCAqPSAzOworICAgICAgICBjdXJpZHggKz0gcWM0OworICAgICAgICBjdXJpZHggKz0gNDA7CisKKyAgICAgICAgY3VyYml0cyArPSBwX2JpdHNbY3VyaWR4XTsKKyAgICAgICAgdmVjICAgICA9ICZwX2NvZGVzW2N1cmlkeCo0XTsKKworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICIuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgImx3YzEgICAgICAgJGYwLCAgICAwKCVbaW5fcG9zXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYxLCAgICAwKCVbdmVjXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYyLCAgICA0KCVbaW5fcG9zXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYzLCAgICA0KCVbdmVjXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGY0LCAgICA4KCVbaW5fcG9zXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGY1LCAgICA4KCVbdmVjXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGY2LCAgICAxMiglW2luX3Bvc10pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGY3LCAgICAxMiglW3ZlY10pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtkaTBdLCAkZjAsICAgICRmMSwgICAgJVtJUV0gICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtkaTFdLCAkZjIsICAgICRmMywgICAgJVtJUV0gICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtkaTJdLCAkZjQsICAgICRmNSwgICAgJVtJUV0gICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtkaTNdLCAkZjYsICAgICRmNywgICAgJVtJUV0gICBcblx0IgorCisgICAgICAgICAgICAiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW2RpMF0iPSZmIihkaTApLCBbZGkxXSI9JmYiKGRpMSksCisgICAgICAgICAgICAgIFtkaTJdIj0mZiIoZGkyKSwgW2RpM10iPSZmIihkaTMpCisgICAgICAgICAgICA6IFtpbl9wb3NdInIiKGluX3BvcyksIFt2ZWNdInIiKHZlYyksCisgICAgICAgICAgICAgIFtJUV0iZiIoSVEpCisgICAgICAgICAgICA6ICIkZjAiLCAiJGYxIiwgIiRmMiIsICIkZjMiLAorICAgICAgICAgICAgICAiJGY0IiwgIiRmNSIsICIkZjYiLCAiJGY3IiwKKyAgICAgICAgICAgICAgIm1lbW9yeSIKKyAgICAgICAgKTsKKworICAgICAgICBjb3N0ICs9IGRpMCAqIGRpMCArIGRpMSAqIGRpMQorICAgICAgICAgICAgICAgICsgZGkyICogZGkyICsgZGkzICogZGkzOworICAgIH0KKworICAgIGlmIChiaXRzKQorICAgICAgICAqYml0cyA9IGN1cmJpdHM7CisgICAgcmV0dXJuIGNvc3QgKiBsYW1iZGEgKyBjdXJiaXRzOworfQorCitzdGF0aWMgZmxvYXQgZ2V0X2JhbmRfY29zdF9VUVVBRF9taXBzKHN0cnVjdCBBQUNFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLCBjb25zdCBmbG9hdCBsYW1iZGEsIGNvbnN0IGZsb2F0IHVwbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgY29uc3QgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjYWxlX2lkeCArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBjb25zdCBmbG9hdCBJUSAgPSBmZl9hYWNfcG93MnNmX3RhYiBbUE9XX1NGMl9aRVJPICsgc2NhbGVfaWR4IC0gU0NBTEVfT05FX1BPUyArIFNDQUxFX0RJVl81MTJdOworICAgIGludCBpOworICAgIGZsb2F0IGNvc3QgPSAwOworICAgIGludCBjdXJiaXRzID0gMDsKKyAgICBpbnQgcWMxLCBxYzIsIHFjMywgcWM0OworCisgICAgdWludDhfdCAqcF9iaXRzICA9ICh1aW50OF90KilmZl9hYWNfc3BlY3RyYWxfYml0c1tjYi0xXTsKKyAgICBmbG9hdCAgICpwX2NvZGVzID0gKGZsb2F0ICAqKWZmX2FhY19jb2RlYm9va192ZWN0b3JzW2NiLTFdOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICBjb25zdCBmbG9hdCAqdmVjOworICAgICAgICBpbnQgY3VyaWR4OworICAgICAgICBmbG9hdCAqaW5fcG9zID0gKGZsb2F0ICopJmluW2ldOworICAgICAgICBmbG9hdCBkaTAsIGRpMSwgZGkyLCBkaTM7CisKKyAgICAgICAgcWMxID0gc2NhbGVkW2kgIF0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzIgPSBzY2FsZWRbaSsxXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMyA9IHNjYWxlZFtpKzJdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWM0ID0gc2NhbGVkW2krM10gKiBRMzQgKyAwLjQwNTRmOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAib3JpICAgICAgICAkdDQsICAgICR6ZXJvLCAgMiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDAsICAgICR0NCwgICAgJVtxYzFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDEsICAgICR0NCwgICAgJVtxYzJdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDIsICAgICR0NCwgICAgJVtxYzNdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDMsICAgICR0NCwgICAgJVtxYzRdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMV0sICR0NCwgICAgJHQwICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMl0sICR0NCwgICAgJHQxICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjM10sICR0NCwgICAgJHQyICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjNF0sICR0NCwgICAgJHQzICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbcWMxXSIrciIocWMxKSwgW3FjMl0iK3IiKHFjMiksCisgICAgICAgICAgICAgIFtxYzNdIityIihxYzMpLCBbcWM0XSIrciIocWM0KQorICAgICAgICAgICAgOgorICAgICAgICAgICAgOiAidDAiLCAidDEiLCAidDIiLCAidDMiLCAidDQiCisgICAgICAgICk7CisKKyAgICAgICAgY3VyaWR4ID0gcWMxOworICAgICAgICBjdXJpZHggKj0gMzsKKyAgICAgICAgY3VyaWR4ICs9IHFjMjsKKyAgICAgICAgY3VyaWR4ICo9IDM7CisgICAgICAgIGN1cmlkeCArPSBxYzM7CisgICAgICAgIGN1cmlkeCAqPSAzOworICAgICAgICBjdXJpZHggKz0gcWM0OworCisgICAgICAgIGN1cmJpdHMgKz0gcF9iaXRzW2N1cmlkeF07CisgICAgICAgIGN1cmJpdHMgKz0gdXF1YWRfc2lnbl9iaXRzW2N1cmlkeF07CisgICAgICAgIHZlYyAgICAgPSAmcF9jb2Rlc1tjdXJpZHgqNF07CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbZGkwXSwgMCglW2luX3Bvc10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbZGkxXSwgNCglW2luX3Bvc10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbZGkyXSwgOCglW2luX3Bvc10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbZGkzXSwgMTIoJVtpbl9wb3NdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhYnMucyAgICAgICVbZGkwXSwgJVtkaTBdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhYnMucyAgICAgICVbZGkxXSwgJVtkaTFdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhYnMucyAgICAgICVbZGkyXSwgJVtkaTJdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhYnMucyAgICAgICVbZGkzXSwgJVtkaTNdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMCwgICAgMCglW3ZlY10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMSwgICAgNCglW3ZlY10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMiwgICAgOCglW3ZlY10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMywgICAgMTIoJVt2ZWNdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbZGkwXSwgJVtkaTBdLCAkZjAsICAgICVbSVFdICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbZGkxXSwgJVtkaTFdLCAkZjEsICAgICVbSVFdICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbZGkyXSwgJVtkaTJdLCAkZjIsICAgICVbSVFdICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbZGkzXSwgJVtkaTNdLCAkZjMsICAgICVbSVFdICAgXG5cdCIKKworICAgICAgICAgICAgIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFtkaTBdIj0mZiIoZGkwKSwgW2RpMV0iPSZmIihkaTEpLAorICAgICAgICAgICAgICBbZGkyXSI9JmYiKGRpMiksIFtkaTNdIj0mZiIoZGkzKQorICAgICAgICAgICAgOiBbaW5fcG9zXSJyIihpbl9wb3MpLCBbdmVjXSJyIih2ZWMpLAorICAgICAgICAgICAgICBbSVFdImYiKElRKQorICAgICAgICAgICAgOiAiJGYwIiwgIiRmMSIsICIkZjIiLCAiJGYzIiwKKyAgICAgICAgICAgICAgIm1lbW9yeSIKKyAgICAgICAgKTsKKworICAgICAgICBjb3N0ICs9IGRpMCAqIGRpMCArIGRpMSAqIGRpMQorICAgICAgICAgICAgICAgICsgZGkyICogZGkyICsgZGkzICogZGkzOworICAgIH0KKworICAgIGlmIChiaXRzKQorICAgICAgICAqYml0cyA9IGN1cmJpdHM7CisgICAgcmV0dXJuIGNvc3QgKiBsYW1iZGEgKyBjdXJiaXRzOworfQorCitzdGF0aWMgZmxvYXQgZ2V0X2JhbmRfY29zdF9TUEFJUl9taXBzKHN0cnVjdCBBQUNFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLCBjb25zdCBmbG9hdCBsYW1iZGEsIGNvbnN0IGZsb2F0IHVwbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgY29uc3QgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjYWxlX2lkeCArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBjb25zdCBmbG9hdCBJUSAgPSBmZl9hYWNfcG93MnNmX3RhYiBbUE9XX1NGMl9aRVJPICsgc2NhbGVfaWR4IC0gU0NBTEVfT05FX1BPUyArIFNDQUxFX0RJVl81MTJdOworICAgIGludCBpOworICAgIGZsb2F0IGNvc3QgPSAwOworICAgIGludCBxYzEsIHFjMiwgcWMzLCBxYzQ7CisgICAgaW50IGN1cmJpdHMgPSAwOworCisgICAgdWludDhfdCAqcF9iaXRzICA9ICh1aW50OF90ICopZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV07CisgICAgZmxvYXQgICAqcF9jb2RlcyA9IChmbG9hdCAgICopZmZfYWFjX2NvZGVib29rX3ZlY3RvcnNbY2ItMV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7CisgICAgICAgIGNvbnN0IGZsb2F0ICp2ZWMsICp2ZWMyOworICAgICAgICBpbnQgY3VyaWR4LCBjdXJpZHgyOworICAgICAgICBpbnQgICAqaW5faW50ID0gKGludCAgICopJmluW2ldOworICAgICAgICBmbG9hdCAqaW5fcG9zID0gKGZsb2F0ICopJmluW2ldOworICAgICAgICBmbG9hdCBkaTAsIGRpMSwgZGkyLCBkaTM7CisKKyAgICAgICAgcWMxID0gc2NhbGVkW2kgIF0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzIgPSBzY2FsZWRbaSsxXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMyA9IHNjYWxlZFtpKzJdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWM0ID0gc2NhbGVkW2krM10gKiBRMzQgKyAwLjQwNTRmOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAib3JpICAgICAgICAkdDQsICAgICR6ZXJvLCAgNCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDAsICAgICR0NCwgICAgJVtxYzFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDEsICAgICR0NCwgICAgJVtxYzJdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDIsICAgICR0NCwgICAgJVtxYzNdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDMsICAgICR0NCwgICAgJVtxYzRdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMV0sICR0NCwgICAgJHQwICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMl0sICR0NCwgICAgJHQxICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjM10sICR0NCwgICAgJHQyICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjNF0sICR0NCwgICAgJHQzICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgICAkdDAsICAgIDAoJVtpbl9pbnRdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgICAkdDEsICAgIDQoJVtpbl9pbnRdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgICAkdDIsICAgIDgoJVtpbl9pbnRdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgICAkdDMsICAgIDEyKCVbaW5faW50XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAkdDAsICAgICR0MCwgICAgMzEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAkdDEsICAgICR0MSwgICAgMzEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAkdDIsICAgICR0MiwgICAgMzEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAkdDMsICAgICR0MywgICAgMzEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICAgICAkdDQsICAgICR6ZXJvLCAgJVtxYzFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICAgICAkdDUsICAgICR6ZXJvLCAgJVtxYzJdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICAgICAkdDYsICAgICR6ZXJvLCAgJVtxYzNdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICAgICAkdDcsICAgICR6ZXJvLCAgJVtxYzRdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMV0sICR0NCwgICAgJHQwICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMl0sICR0NSwgICAgJHQxICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjM10sICR0NiwgICAgJHQyICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjNF0sICR0NywgICAgJHQzICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbcWMxXSIrciIocWMxKSwgW3FjMl0iK3IiKHFjMiksCisgICAgICAgICAgICAgIFtxYzNdIityIihxYzMpLCBbcWM0XSIrciIocWM0KQorICAgICAgICAgICAgOiBbaW5faW50XSJyIihpbl9pbnQpCisgICAgICAgICAgICA6ICJ0MCIsICJ0MSIsICJ0MiIsICJ0MyIsCisgICAgICAgICAgICAgICJ0NCIsICJ0NSIsICJ0NiIsICJ0NyIsCisgICAgICAgICAgICAgICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgY3VyaWR4ID0gOSAqIHFjMTsKKyAgICAgICAgY3VyaWR4ICs9IHFjMiArIDQwOworCisgICAgICAgIGN1cmlkeDIgPSA5ICogcWMzOworICAgICAgICBjdXJpZHgyICs9IHFjNCArIDQwOworCisgICAgICAgIGN1cmJpdHMgKz0gcF9iaXRzW2N1cmlkeF07CisgICAgICAgIGN1cmJpdHMgKz0gcF9iaXRzW2N1cmlkeDJdOworCisgICAgICAgIHZlYyAgICAgPSAmcF9jb2Rlc1tjdXJpZHgqMl07CisgICAgICAgIHZlYzIgICAgPSAmcF9jb2Rlc1tjdXJpZHgyKjJdOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjAsICAgIDAoJVtpbl9wb3NdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjEsICAgIDAoJVt2ZWNdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjIsICAgIDQoJVtpbl9wb3NdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjMsICAgIDQoJVt2ZWNdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjQsICAgIDgoJVtpbl9wb3NdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjUsICAgIDAoJVt2ZWMyXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjYsICAgIDEyKCVbaW5fcG9zXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjcsICAgIDQoJVt2ZWMyXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibm1zdWIucyAgICAlW2RpMF0sICRmMCwgICAgJGYxLCAgICAlW0lRXSAgIFxuXHQiCisgICAgICAgICAgICAibm1zdWIucyAgICAlW2RpMV0sICRmMiwgICAgJGYzLCAgICAlW0lRXSAgIFxuXHQiCisgICAgICAgICAgICAibm1zdWIucyAgICAlW2RpMl0sICRmNCwgICAgJGY1LCAgICAlW0lRXSAgIFxuXHQiCisgICAgICAgICAgICAibm1zdWIucyAgICAlW2RpM10sICRmNiwgICAgJGY3LCAgICAlW0lRXSAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbZGkwXSI9JmYiKGRpMCksIFtkaTFdIj0mZiIoZGkxKSwKKyAgICAgICAgICAgICAgW2RpMl0iPSZmIihkaTIpLCBbZGkzXSI9JmYiKGRpMykKKyAgICAgICAgICAgIDogW2luX3Bvc10iciIoaW5fcG9zKSwgW3ZlY10iciIodmVjKSwKKyAgICAgICAgICAgICAgW3ZlYzJdInIiKHZlYzIpLCBbSVFdImYiKElRKQorICAgICAgICAgICAgOiAiJGYwIiwgIiRmMSIsICIkZjIiLCAiJGYzIiwKKyAgICAgICAgICAgICAgIiRmNCIsICIkZjUiLCAiJGY2IiwgIiRmNyIsCisgICAgICAgICAgICAgICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgY29zdCArPSBkaTAgKiBkaTAgKyBkaTEgKiBkaTEKKyAgICAgICAgICAgICAgICArIGRpMiAqIGRpMiArIGRpMyAqIGRpMzsKKyAgICB9CisKKyAgICBpZiAoYml0cykKKyAgICAgICAgKmJpdHMgPSBjdXJiaXRzOworICAgIHJldHVybiBjb3N0ICogbGFtYmRhICsgY3VyYml0czsKK30KKworc3RhdGljIGZsb2F0IGdldF9iYW5kX2Nvc3RfVVBBSVI3X21pcHMoc3RydWN0IEFBQ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2IsIGNvbnN0IGZsb2F0IGxhbWJkYSwgY29uc3QgZmxvYXQgdXBsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgY29uc3QgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjYWxlX2lkeCArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBjb25zdCBmbG9hdCBJUSAgPSBmZl9hYWNfcG93MnNmX3RhYiBbUE9XX1NGMl9aRVJPICsgc2NhbGVfaWR4IC0gU0NBTEVfT05FX1BPUyArIFNDQUxFX0RJVl81MTJdOworICAgIGludCBpOworICAgIGZsb2F0IGNvc3QgPSAwOworICAgIGludCBxYzEsIHFjMiwgcWMzLCBxYzQ7CisgICAgaW50IGN1cmJpdHMgPSAwOworCisgICAgdWludDhfdCAqcF9iaXRzICA9ICh1aW50OF90ICopZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV07CisgICAgZmxvYXQgICAqcF9jb2RlcyA9IChmbG9hdCAgICopZmZfYWFjX2NvZGVib29rX3ZlY3RvcnNbY2ItMV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7CisgICAgICAgIGNvbnN0IGZsb2F0ICp2ZWMsICp2ZWMyOworICAgICAgICBpbnQgY3VyaWR4LCBjdXJpZHgyLCBzaWduMSwgY291bnQxLCBzaWduMiwgY291bnQyOworICAgICAgICBpbnQgICAqaW5faW50ID0gKGludCAgICopJmluW2ldOworICAgICAgICBmbG9hdCAqaW5fcG9zID0gKGZsb2F0ICopJmluW2ldOworICAgICAgICBmbG9hdCBkaTAsIGRpMSwgZGkyLCBkaTM7CisKKyAgICAgICAgcWMxID0gc2NhbGVkW2kgIF0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzIgPSBzY2FsZWRbaSsxXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMyA9IHNjYWxlZFtpKzJdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWM0ID0gc2NhbGVkW2krM10gKiBRMzQgKyAwLjQwNTRmOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgIm9yaSAgICAgICAgJHQ0LCAgICAgICAgJHplcm8sICAgICAgNyAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAib3JpICAgICAgICAlW3NpZ24xXSwgICAkemVybywgICAgICAwICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJvcmkgICAgICAgICVbc2lnbjJdLCAgICR6ZXJvLCAgICAgIDAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAgICAgJHQwLCAgICAgICAgJHQ0LCAgICAgICAgJVtxYzFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDEsICAgICAgICAkdDQsICAgICAgICAlW3FjMl0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICR0MiwgICAgICAgICR0NCwgICAgICAgICVbcWMzXSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAgICAgJHQzLCAgICAgICAgJHQ0LCAgICAgICAgJVtxYzRdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMV0sICAgICAkdDQsICAgICAgICAkdDAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgICAgICVbcWMyXSwgICAgICR0NCwgICAgICAgICR0MSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAgICAgJVtxYzNdLCAgICAgJHQ0LCAgICAgICAgJHQyICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjNF0sICAgICAkdDQsICAgICAgICAkdDMgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICAgICR0MCwgICAgICAgIDAoJVtpbl9pbnRdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgICAgJHQxLCAgICAgICAgNCglW2luX2ludF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgICAkdDIsICAgICAgICA4KCVbaW5faW50XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICAgICR0MywgICAgICAgIDEyKCVbaW5faW50XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAgICAgJHQwLCAgICAgICAgJHQwLCAgICAgICAgJHplcm8gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3NpZ24xXSwgICAkdDAsICAgICAgICAlW3FjMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICR0MiwgICAgICAgICR0MiwgICAgICAgICR6ZXJvICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAgICAgJVtzaWduMl0sICAgJHQyLCAgICAgICAgJVtxYzNdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDEsICAgICAgICAkdDEsICAgICAgICAkemVybyAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICAgICAgICR0MCwgICAgICAgICVbc2lnbjFdLCAgIDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm9yICAgICAgICAgJHQwLCAgICAgICAgJHQwLCAgICAgICAgJHQxICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3NpZ24xXSwgICAkdDAsICAgICAgICAlW3FjMl0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICR0MywgICAgICAgICR0MywgICAgICAgICR6ZXJvICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsbCAgICAgICAgJHQwLCAgICAgICAgJVtzaWduMl0sICAgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAib3IgICAgICAgICAkdDAsICAgICAgICAkdDAsICAgICAgICAkdDMgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgICAgICVbc2lnbjJdLCAgICR0MCwgICAgICAgICVbcWM0XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAgICAgJVtjb3VudDFdLCAgJHplcm8sICAgICAgJVtxYzFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDEsICAgICAgICAkemVybywgICAgICAlW3FjMl0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICVbY291bnQyXSwgICR6ZXJvLCAgICAgICVbcWMzXSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAgICAgJHQyLCAgICAgICAgJHplcm8sICAgICAgJVtxYzRdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkdSAgICAgICAlW2NvdW50MV0sICAlW2NvdW50MV0sICAkdDEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGR1ICAgICAgICVbY291bnQyXSwgICVbY291bnQyXSwgICR0MiAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbcWMxXSIrciIocWMxKSwgW3FjMl0iK3IiKHFjMiksCisgICAgICAgICAgICAgIFtxYzNdIityIihxYzMpLCBbcWM0XSIrciIocWM0KSwKKyAgICAgICAgICAgICAgW3NpZ24xXSI9JnIiKHNpZ24xKSwgW2NvdW50MV0iPSZyIihjb3VudDEpLAorICAgICAgICAgICAgICBbc2lnbjJdIj0mciIoc2lnbjIpLCBbY291bnQyXSI9JnIiKGNvdW50MikKKyAgICAgICAgICAgIDogW2luX2ludF0iciIoaW5faW50KQorICAgICAgICAgICAgOiAidDAiLCAidDEiLCAidDIiLCAidDMiLCAidDQiLAorICAgICAgICAgICAgICAibWVtb3J5IgorICAgICAgICApOworCisgICAgICAgIGN1cmlkeCA9IDggKiBxYzE7CisgICAgICAgIGN1cmlkeCArPSBxYzI7CisKKyAgICAgICAgY3VyaWR4MiA9IDggKiBxYzM7CisgICAgICAgIGN1cmlkeDIgKz0gcWM0OworCisgICAgICAgIGN1cmJpdHMgKz0gcF9iaXRzW2N1cmlkeF07CisgICAgICAgIGN1cmJpdHMgKz0gdXBhaXI3X3NpZ25fYml0c1tjdXJpZHhdOworICAgICAgICB2ZWMgICAgID0gJnBfY29kZXNbY3VyaWR4KjJdOworCisgICAgICAgIGN1cmJpdHMgKz0gcF9iaXRzW2N1cmlkeDJdOworICAgICAgICBjdXJiaXRzICs9IHVwYWlyN19zaWduX2JpdHNbY3VyaWR4Ml07CisgICAgICAgIHZlYzIgICAgPSAmcF9jb2Rlc1tjdXJpZHgyKjJdOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgImx3YzEgICAgICAgJVtkaTBdLCAgICAgMCglW2luX3Bvc10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAlW2RpMV0sICAgICA0KCVbaW5fcG9zXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbZGkyXSwgICAgIDgoJVtpbl9wb3NdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVtkaTNdLCAgICAgMTIoJVtpbl9wb3NdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWJzLnMgICAgICAlW2RpMF0sICAgICAlW2RpMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhYnMucyAgICAgICVbZGkxXSwgICAgICVbZGkxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFicy5zICAgICAgJVtkaTJdLCAgICAgJVtkaTJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWJzLnMgICAgICAlW2RpM10sICAgICAlW2RpM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMCwgICAgICAgIDAoJVt2ZWNdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYxLCAgICAgICAgNCglW3ZlY10pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjIsICAgICAgICAwKCVbdmVjMl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMywgICAgICAgIDQoJVt2ZWMyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtkaTBdLCAgICAgJVtkaTBdLCAgICAgJGYwLCAgICAlW0lRXSAgIFxuXHQiCisgICAgICAgICAgICAibm1zdWIucyAgICAlW2RpMV0sICAgICAlW2RpMV0sICAgICAkZjEsICAgICVbSVFdICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbZGkyXSwgICAgICVbZGkyXSwgICAgICRmMiwgICAgJVtJUV0gICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtkaTNdLCAgICAgJVtkaTNdLCAgICAgJGYzLCAgICAlW0lRXSAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFtkaTBdIj0mZiIoZGkwKSwgW2RpMV0iPSZmIihkaTEpLAorICAgICAgICAgICAgICBbZGkyXSI9JmYiKGRpMiksIFtkaTNdIj0mZiIoZGkzKQorICAgICAgICAgICAgOiBbaW5fcG9zXSJyIihpbl9wb3MpLCBbdmVjXSJyIih2ZWMpLAorICAgICAgICAgICAgICBbdmVjMl0iciIodmVjMiksIFtJUV0iZiIoSVEpCisgICAgICAgICAgICA6ICIkZjAiLCAiJGYxIiwgIiRmMiIsICIkZjMiLAorICAgICAgICAgICAgICAibWVtb3J5IgorICAgICAgICApOworCisgICAgICAgIGNvc3QgKz0gZGkwICogZGkwICsgZGkxICogZGkxCisgICAgICAgICAgICAgICAgKyBkaTIgKiBkaTIgKyBkaTMgKiBkaTM7CisgICAgfQorCisgICAgaWYgKGJpdHMpCisgICAgICAgICpiaXRzID0gY3VyYml0czsKKyAgICByZXR1cm4gY29zdCAqIGxhbWJkYSArIGN1cmJpdHM7Cit9CisKK3N0YXRpYyBmbG9hdCBnZXRfYmFuZF9jb3N0X1VQQUlSMTJfbWlwcyhzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZWQsIGludCBzaXplLCBpbnQgc2NhbGVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYiwgY29uc3QgZmxvYXQgbGFtYmRhLCBjb25zdCBmbG9hdCB1cGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgY29uc3QgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNjYWxlX2lkeCArIFNDQUxFX09ORV9QT1MgLSBTQ0FMRV9ESVZfNTEyXTsKKyAgICBjb25zdCBmbG9hdCBJUSAgPSBmZl9hYWNfcG93MnNmX3RhYiBbUE9XX1NGMl9aRVJPICsgc2NhbGVfaWR4IC0gU0NBTEVfT05FX1BPUyArIFNDQUxFX0RJVl81MTJdOworICAgIGludCBpOworICAgIGZsb2F0IGNvc3QgPSAwOworICAgIGludCBxYzEsIHFjMiwgcWMzLCBxYzQ7CisgICAgaW50IGN1cmJpdHMgPSAwOworCisgICAgdWludDhfdCAqcF9iaXRzICA9ICh1aW50OF90ICopZmZfYWFjX3NwZWN0cmFsX2JpdHNbY2ItMV07CisgICAgZmxvYXQgICAqcF9jb2RlcyA9IChmbG9hdCAgICopZmZfYWFjX2NvZGVib29rX3ZlY3RvcnNbY2ItMV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7CisgICAgICAgIGNvbnN0IGZsb2F0ICp2ZWMsICp2ZWMyOworICAgICAgICBpbnQgY3VyaWR4LCBjdXJpZHgyOworICAgICAgICBpbnQgc2lnbjEsIGNvdW50MSwgc2lnbjIsIGNvdW50MjsKKyAgICAgICAgaW50ICAgKmluX2ludCA9IChpbnQgICAqKSZpbltpXTsKKyAgICAgICAgZmxvYXQgKmluX3BvcyA9IChmbG9hdCAqKSZpbltpXTsKKyAgICAgICAgZmxvYXQgZGkwLCBkaTEsIGRpMiwgZGkzOworCisgICAgICAgIHFjMSA9IHNjYWxlZFtpICBdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWMyID0gc2NhbGVkW2krMV0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzMgPSBzY2FsZWRbaSsyXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjNCA9IHNjYWxlZFtpKzNdICogUTM0ICsgMC40MDU0ZjsKKworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICIuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJvcmkgICAgICAgICR0NCwgICAgICAgICR6ZXJvLCAgICAgIDEyICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm9yaSAgICAgICAgJVtzaWduMV0sICAgJHplcm8sICAgICAgMCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAib3JpICAgICAgICAlW3NpZ24yXSwgICAkemVybywgICAgICAwICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICR0MCwgICAgICAgICR0NCwgICAgICAgICVbcWMxXSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAgICAgJHQxLCAgICAgICAgJHQ0LCAgICAgICAgJVtxYzJdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDIsICAgICAgICAkdDQsICAgICAgICAlW3FjM10gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICR0MywgICAgICAgICR0NCwgICAgICAgICVbcWM0XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAgICAgJVtxYzFdLCAgICAgJHQ0LCAgICAgICAgJHQwICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMl0sICAgICAkdDQsICAgICAgICAkdDEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgICAgICVbcWMzXSwgICAgICR0NCwgICAgICAgICR0MiAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAgICAgJVtxYzRdLCAgICAgJHQ0LCAgICAgICAgJHQzICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgICAkdDAsICAgICAgICAwKCVbaW5faW50XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICAgICR0MSwgICAgICAgIDQoJVtpbl9pbnRdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgICAgJHQyLCAgICAgICAgOCglW2luX2ludF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgICAkdDMsICAgICAgICAxMiglW2luX2ludF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICR0MCwgICAgICAgICR0MCwgICAgICAgICR6ZXJvICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAgICAgJVtzaWduMV0sICAgJHQwLCAgICAgICAgJVtxYzFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDIsICAgICAgICAkdDIsICAgICAgICAkemVybyAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAgICAgICVbc2lnbjJdLCAgICR0MiwgICAgICAgICVbcWMzXSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAgICAgJHQxLCAgICAgICAgJHQxLCAgICAgICAgJHplcm8gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAgICAgICAkdDAsICAgICAgICAlW3NpZ24xXSwgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJvciAgICAgICAgICR0MCwgICAgICAgICR0MCwgICAgICAgICR0MSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICAgICAgJVtzaWduMV0sICAgJHQwLCAgICAgICAgJVtxYzJdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAkdDMsICAgICAgICAkdDMsICAgICAgICAkemVybyAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICAgICAgICR0MCwgICAgICAgICVbc2lnbjJdLCAgIDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm9yICAgICAgICAgJHQwLCAgICAgICAgJHQwLCAgICAgICAgJHQzICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3NpZ24yXSwgICAkdDAsICAgICAgICAlW3FjNF0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICVbY291bnQxXSwgICR6ZXJvLCAgICAgICVbcWMxXSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsdCAgICAgICAgJHQxLCAgICAgICAgJHplcm8sICAgICAgJVtxYzJdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAlW2NvdW50Ml0sICAkemVybywgICAgICAlW3FjM10gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbHQgICAgICAgICR0MiwgICAgICAgICR6ZXJvLCAgICAgICVbcWM0XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZHUgICAgICAgJVtjb3VudDFdLCAgJVtjb3VudDFdLCAgJHQxICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkdSAgICAgICAlW2NvdW50Ml0sICAlW2NvdW50Ml0sICAkdDIgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3FjMV0iK3IiKHFjMSksIFtxYzJdIityIihxYzIpLAorICAgICAgICAgICAgICBbcWMzXSIrciIocWMzKSwgW3FjNF0iK3IiKHFjNCksCisgICAgICAgICAgICAgIFtzaWduMV0iPSZyIihzaWduMSksIFtjb3VudDFdIj0mciIoY291bnQxKSwKKyAgICAgICAgICAgICAgW3NpZ24yXSI9JnIiKHNpZ24yKSwgW2NvdW50Ml0iPSZyIihjb3VudDIpCisgICAgICAgICAgICA6IFtpbl9pbnRdInIiKGluX2ludCkKKyAgICAgICAgICAgIDogInQwIiwgInQxIiwgInQyIiwgInQzIiwgInQ0IiwKKyAgICAgICAgICAgICAgIm1lbW9yeSIKKyAgICAgICAgKTsKKworICAgICAgICBjdXJpZHggPSAxMyAqIHFjMTsKKyAgICAgICAgY3VyaWR4ICs9IHFjMjsKKworICAgICAgICBjdXJpZHgyID0gMTMgKiBxYzM7CisgICAgICAgIGN1cmlkeDIgKz0gcWM0OworCisgICAgICAgIGN1cmJpdHMgKz0gcF9iaXRzW2N1cmlkeF07CisgICAgICAgIGN1cmJpdHMgKz0gcF9iaXRzW2N1cmlkeDJdOworICAgICAgICBjdXJiaXRzICs9IHVwYWlyMTJfc2lnbl9iaXRzW2N1cmlkeF07CisgICAgICAgIGN1cmJpdHMgKz0gdXBhaXIxMl9zaWduX2JpdHNbY3VyaWR4Ml07CisgICAgICAgIHZlYyAgICAgPSAmcF9jb2Rlc1tjdXJpZHgqMl07CisgICAgICAgIHZlYzIgICAgPSAmcF9jb2Rlc1tjdXJpZHgyKjJdOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgImx3YzEgICAgICAgJVtkaTBdLCAgICAgMCglW2luX3Bvc10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAlW2RpMV0sICAgICA0KCVbaW5fcG9zXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbZGkyXSwgICAgIDgoJVtpbl9wb3NdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVtkaTNdLCAgICAgMTIoJVtpbl9wb3NdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWJzLnMgICAgICAlW2RpMF0sICAgICAlW2RpMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhYnMucyAgICAgICVbZGkxXSwgICAgICVbZGkxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFicy5zICAgICAgJVtkaTJdLCAgICAgJVtkaTJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWJzLnMgICAgICAlW2RpM10sICAgICAlW2RpM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMCwgICAgICAgIDAoJVt2ZWNdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYxLCAgICAgICAgNCglW3ZlY10pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjIsICAgICAgICAwKCVbdmVjMl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMywgICAgICAgIDQoJVt2ZWMyXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtkaTBdLCAgICAgJVtkaTBdLCAgICAgJGYwLCAgICAlW0lRXSAgIFxuXHQiCisgICAgICAgICAgICAibm1zdWIucyAgICAlW2RpMV0sICAgICAlW2RpMV0sICAgICAkZjEsICAgICVbSVFdICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbZGkyXSwgICAgICVbZGkyXSwgICAgICRmMiwgICAgJVtJUV0gICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtkaTNdLCAgICAgJVtkaTNdLCAgICAgJGYzLCAgICAlW0lRXSAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFtkaTBdIj0mZiIoZGkwKSwgW2RpMV0iPSZmIihkaTEpLAorICAgICAgICAgICAgICBbZGkyXSI9JmYiKGRpMiksIFtkaTNdIj0mZiIoZGkzKQorICAgICAgICAgICAgOiBbaW5fcG9zXSJyIihpbl9wb3MpLCBbdmVjXSJyIih2ZWMpLAorICAgICAgICAgICAgICBbdmVjMl0iciIodmVjMiksIFtJUV0iZiIoSVEpCisgICAgICAgICAgICA6ICIkZjAiLCAiJGYxIiwgIiRmMiIsICIkZjMiLAorICAgICAgICAgICAgICAibWVtb3J5IgorICAgICAgICApOworCisgICAgICAgIGNvc3QgKz0gZGkwICogZGkwICsgZGkxICogZGkxCisgICAgICAgICAgICAgICAgKyBkaTIgKiBkaTIgKyBkaTMgKiBkaTM7CisgICAgfQorCisgICAgaWYgKGJpdHMpCisgICAgICAgICpiaXRzID0gY3VyYml0czsKKyAgICByZXR1cm4gY29zdCAqIGxhbWJkYSArIGN1cmJpdHM7Cit9CisKK3N0YXRpYyBmbG9hdCBnZXRfYmFuZF9jb3N0X0VTQ19taXBzKHN0cnVjdCBBQUNFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqcGIsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZWQsIGludCBzaXplLCBpbnQgc2NhbGVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLCBjb25zdCBmbG9hdCBsYW1iZGEsIGNvbnN0IGZsb2F0IHVwbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpiaXRzKQoreworICAgIGNvbnN0IGZsb2F0IFEzNCA9IGZmX2FhY19wb3czNHNmX3RhYltQT1dfU0YyX1pFUk8gLSBzY2FsZV9pZHggKyBTQ0FMRV9PTkVfUE9TIC0gU0NBTEVfRElWXzUxMl07CisgICAgY29uc3QgZmxvYXQgSVEgID0gZmZfYWFjX3BvdzJzZl90YWIgW1BPV19TRjJfWkVSTyArIHNjYWxlX2lkeCAtIFNDQUxFX09ORV9QT1MgKyBTQ0FMRV9ESVZfNTEyXTsKKyAgICBjb25zdCBmbG9hdCBDTElQUEVEX0VTQ0FQRSA9IDE2NTE0MC4wZiAqIElROworICAgIGludCBpOworICAgIGZsb2F0IGNvc3QgPSAwOworICAgIGludCBxYzEsIHFjMiwgcWMzLCBxYzQ7CisgICAgaW50IGN1cmJpdHMgPSAwOworCisgICAgdWludDhfdCAqcF9iaXRzICA9ICh1aW50OF90KilmZl9hYWNfc3BlY3RyYWxfYml0c1tjYi0xXTsKKyAgICBmbG9hdCAgICpwX2NvZGVzID0gKGZsb2F0KiAgKWZmX2FhY19jb2RlYm9va192ZWN0b3JzW2NiLTFdOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICBjb25zdCBmbG9hdCAqdmVjLCAqdmVjMjsKKyAgICAgICAgaW50IGN1cmlkeCwgY3VyaWR4MjsKKyAgICAgICAgZmxvYXQgdDEsIHQyLCB0MywgdDQ7CisgICAgICAgIGZsb2F0IGRpMSwgZGkyLCBkaTMsIGRpNDsKKyAgICAgICAgaW50IGNvbmQwLCBjb25kMSwgY29uZDIsIGNvbmQzOworICAgICAgICBpbnQgYzEsIGMyLCBjMywgYzQ7CisKKyAgICAgICAgcWMxID0gc2NhbGVkW2kgIF0gKiBRMzQgKyAwLjQwNTRmOworICAgICAgICBxYzIgPSBzY2FsZWRbaSsxXSAqIFEzNCArIDAuNDA1NGY7CisgICAgICAgIHFjMyA9IHNjYWxlZFtpKzJdICogUTM0ICsgMC40MDU0ZjsKKyAgICAgICAgcWM0ID0gc2NhbGVkW2krM10gKiBRMzQgKyAwLjQwNTRmOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAib3JpICAgICAgICAkdDQsICAgICAgICAkemVybywgIDE1ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAib3JpICAgICAgICAkdDUsICAgICAgICAkemVybywgIDE2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2hsbF9zLncgICAlW2MxXSwgICAgICAlW3FjMV0sIDE4ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2hsbF9zLncgICAlW2MyXSwgICAgICAlW3FjMl0sIDE4ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2hsbF9zLncgICAlW2MzXSwgICAgICAlW3FjM10sIDE4ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2hsbF9zLncgICAlW2M0XSwgICAgICAlW3FjNF0sIDE4ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAlW2MxXSwgICAgICAlW2MxXSwgIDE4ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAlW2MyXSwgICAgICAlW2MyXSwgIDE4ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAlW2MzXSwgICAgICAlW2MzXSwgIDE4ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAlW2M0XSwgICAgICAlW2M0XSwgIDE4ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAlW2NvbmQwXSwgICAkdDQsICAgICVbcWMxXSAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAlW2NvbmQxXSwgICAkdDQsICAgICVbcWMyXSAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAlW2NvbmQyXSwgICAkdDQsICAgICVbcWMzXSAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAlW2NvbmQzXSwgICAkdDQsICAgICVbcWM0XSAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMV0sICAgICAkdDUsICAgICVbY29uZDBdICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjMl0sICAgICAkdDUsICAgICVbY29uZDFdICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjM10sICAgICAkdDUsICAgICVbY29uZDJdICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgICAgICAlW3FjNF0sICAgICAkdDUsICAgICVbY29uZDNdICAgIFxuXHQiCisKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbcWMxXSIrciIocWMxKSwgW3FjMl0iK3IiKHFjMiksCisgICAgICAgICAgICAgIFtxYzNdIityIihxYzMpLCBbcWM0XSIrciIocWM0KSwKKyAgICAgICAgICAgICAgW2NvbmQwXSI9JnIiKGNvbmQwKSwgW2NvbmQxXSI9JnIiKGNvbmQxKSwKKyAgICAgICAgICAgICAgW2NvbmQyXSI9JnIiKGNvbmQyKSwgW2NvbmQzXSI9JnIiKGNvbmQzKSwKKyAgICAgICAgICAgICAgW2MxXSI9JnIiKGMxKSwgW2MyXSI9JnIiKGMyKSwKKyAgICAgICAgICAgICAgW2MzXSI9JnIiKGMzKSwgW2M0XSI9JnIiKGM0KQorICAgICAgICAgICAgOgorICAgICAgICAgICAgOiAidDQiLCAidDUiCisgICAgICAgICk7CisKKyAgICAgICAgY3VyaWR4ID0gMTcgKiBxYzE7CisgICAgICAgIGN1cmlkeCArPSBxYzI7CisKKyAgICAgICAgY3VyaWR4MiA9IDE3ICogcWMzOworICAgICAgICBjdXJpZHgyICs9IHFjNDsKKworICAgICAgICBjdXJiaXRzICs9IHBfYml0c1tjdXJpZHhdOworICAgICAgICBjdXJiaXRzICs9IGVzY19zaWduX2JpdHNbY3VyaWR4XTsKKyAgICAgICAgdmVjICAgICA9ICZwX2NvZGVzW2N1cmlkeCoyXTsKKworICAgICAgICBjdXJiaXRzICs9IHBfYml0c1tjdXJpZHgyXTsKKyAgICAgICAgY3VyYml0cyArPSBlc2Nfc2lnbl9iaXRzW2N1cmlkeDJdOworICAgICAgICB2ZWMyICAgICA9ICZwX2NvZGVzW2N1cmlkeDIqMl07CisKKyAgICAgICAgY3VyYml0cyArPSAoYXZfbG9nMihjMSkgKiAyIC0gMykgJiAoLWNvbmQwKTsKKyAgICAgICAgY3VyYml0cyArPSAoYXZfbG9nMihjMikgKiAyIC0gMykgJiAoLWNvbmQxKTsKKyAgICAgICAgY3VyYml0cyArPSAoYXZfbG9nMihjMykgKiAyIC0gMykgJiAoLWNvbmQyKTsKKyAgICAgICAgY3VyYml0cyArPSAoYXZfbG9nMihjNCkgKiAyIC0gMykgJiAoLWNvbmQzKTsKKworICAgICAgICB0MSA9IGZhYnNmKGluW2kgIF0pOworICAgICAgICB0MiA9IGZhYnNmKGluW2krMV0pOworICAgICAgICB0MyA9IGZhYnNmKGluW2krMl0pOworICAgICAgICB0NCA9IGZhYnNmKGluW2krM10pOworCisgICAgICAgIGlmIChjb25kMCkgeworICAgICAgICAgICAgaWYgKHQxID49IENMSVBQRURfRVNDQVBFKSB7CisgICAgICAgICAgICAgICAgZGkxID0gdDEgLSBDTElQUEVEX0VTQ0FQRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGkxID0gdDEgLSBjMSAqIGNicnRmKGMxKSAqIElROworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGRpMSA9IHQxIC0gdmVjWzBdICogSVE7CisKKyAgICAgICAgaWYgKGNvbmQxKSB7CisgICAgICAgICAgICBpZiAodDIgPj0gQ0xJUFBFRF9FU0NBUEUpIHsKKyAgICAgICAgICAgICAgICBkaTIgPSB0MiAtIENMSVBQRURfRVNDQVBFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaTIgPSB0MiAtIGMyICogY2JydGYoYzIpICogSVE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZGkyID0gdDIgLSB2ZWNbMV0gKiBJUTsKKworICAgICAgICBpZiAoY29uZDIpIHsKKyAgICAgICAgICAgIGlmICh0MyA+PSBDTElQUEVEX0VTQ0FQRSkgeworICAgICAgICAgICAgICAgIGRpMyA9IHQzIC0gQ0xJUFBFRF9FU0NBUEU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpMyA9IHQzIC0gYzMgKiBjYnJ0ZihjMykgKiBJUTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBkaTMgPSB0MyAtIHZlYzJbMF0gKiBJUTsKKworICAgICAgICBpZiAoY29uZDMpIHsKKyAgICAgICAgICAgIGlmICh0NCA+PSBDTElQUEVEX0VTQ0FQRSkgeworICAgICAgICAgICAgICAgIGRpNCA9IHQ0IC0gQ0xJUFBFRF9FU0NBUEU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpNCA9IHQ0IC0gYzQgKiBjYnJ0ZihjNCkgKiBJUTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBkaTQgPSB0NCAtIHZlYzJbMV0qSVE7CisKKyAgICAgICAgY29zdCArPSBkaTEgKiBkaTEgKyBkaTIgKiBkaTIKKyAgICAgICAgICAgICAgICArIGRpMyAqIGRpMyArIGRpNCAqIGRpNDsKKyAgICB9CisKKyAgICBpZiAoYml0cykKKyAgICAgICAgKmJpdHMgPSBjdXJiaXRzOworICAgIHJldHVybiBjb3N0ICogbGFtYmRhICsgY3VyYml0czsKK30KKworc3RhdGljIGZsb2F0ICgqY29uc3QgZ2V0X2JhbmRfY29zdF9hcnJbXSkoc3RydWN0IEFBQ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCwgaW50IHNpemUsIGludCBzY2FsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2IsIGNvbnN0IGZsb2F0IGxhbWJkYSwgY29uc3QgZmxvYXQgdXBsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpID0geworICAgIGdldF9iYW5kX2Nvc3RfWkVST19taXBzLAorICAgIGdldF9iYW5kX2Nvc3RfU1FVQURfbWlwcywKKyAgICBnZXRfYmFuZF9jb3N0X1NRVUFEX21pcHMsCisgICAgZ2V0X2JhbmRfY29zdF9VUVVBRF9taXBzLAorICAgIGdldF9iYW5kX2Nvc3RfVVFVQURfbWlwcywKKyAgICBnZXRfYmFuZF9jb3N0X1NQQUlSX21pcHMsCisgICAgZ2V0X2JhbmRfY29zdF9TUEFJUl9taXBzLAorICAgIGdldF9iYW5kX2Nvc3RfVVBBSVI3X21pcHMsCisgICAgZ2V0X2JhbmRfY29zdF9VUEFJUjdfbWlwcywKKyAgICBnZXRfYmFuZF9jb3N0X1VQQUlSMTJfbWlwcywKKyAgICBnZXRfYmFuZF9jb3N0X1VQQUlSMTJfbWlwcywKKyAgICBnZXRfYmFuZF9jb3N0X0VTQ19taXBzLAorfTsKKworI2RlZmluZSBnZXRfYmFuZF9jb3N0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIHBiLCBpbiwgc2NhbGVkLCBzaXplLCBzY2FsZV9pZHgsIGNiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSwgdXBsaW0sIGJpdHMpICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X2JhbmRfY29zdF9hcnJbY2JdKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgcGIsIGluLCBzY2FsZWQsIHNpemUsIHNjYWxlX2lkeCwgY2IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhLCB1cGxpbSwgYml0cykKKworc3RhdGljIGZsb2F0IHF1YW50aXplX2JhbmRfY29zdChzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkLCBpbnQgc2l6ZSwgaW50IHNjYWxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLCBjb25zdCBmbG9hdCBsYW1iZGEsIGNvbnN0IGZsb2F0IHVwbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpCit7CisgICAgcmV0dXJuIGdldF9iYW5kX2Nvc3QocywgTlVMTCwgaW4sIHNjYWxlZCwgc2l6ZSwgc2NhbGVfaWR4LCBjYiwgbGFtYmRhLCB1cGxpbSwgYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNlYXJjaF9mb3JfcXVhbnRpemVyc190d29sb29wX21pcHMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBsYW1iZGEpCit7CisgICAgaW50IHN0YXJ0ID0gMCwgaSwgdywgdzIsIGc7CisgICAgaW50IGRlc3RiaXRzID0gYXZjdHgtPmJpdF9yYXRlICogMTAyNC4wIC8gYXZjdHgtPnNhbXBsZV9yYXRlIC8gYXZjdHgtPmNoYW5uZWxzOworICAgIGZsb2F0IGRpc3RzWzEyOF0gPSB7IDAgfSwgdXBsaW1zWzEyOF07CisgICAgZmxvYXQgbWF4dmFsc1sxMjhdOworICAgIGludCBmZmxhZywgbWluc2NhbGVyOworICAgIGludCBpdHMgID0gMDsKKyAgICBpbnQgYWxseiA9IDA7CisgICAgZmxvYXQgbWludGhyID0gSU5GSU5JVFk7CisKKyAgICBkZXN0Yml0cyA9IEZGTUlOKGRlc3RiaXRzLCA1ODAwKTsKKyAgICBmb3IgKHcgPSAwOyB3IDwgc2NlLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlLT5pY3MuZ3JvdXBfbGVuW3ddKSB7CisgICAgICAgIGZvciAoZyA9IDA7ICBnIDwgc2NlLT5pY3MubnVtX3N3YjsgZysrKSB7CisgICAgICAgICAgICBpbnQgbnogPSAwOworICAgICAgICAgICAgZmxvYXQgdXBsaW0gPSAwLjBmOworICAgICAgICAgICAgZm9yICh3MiA9IDA7IHcyIDwgc2NlLT5pY3MuZ3JvdXBfbGVuW3ddOyB3MisrKSB7CisgICAgICAgICAgICAgICAgRkZQc3lCYW5kICpiYW5kID0gJnMtPnBzeS5jaFtzLT5jdXJfY2hhbm5lbF0ucHN5X2JhbmRzWyh3K3cyKSoxNitnXTsKKyAgICAgICAgICAgICAgICB1cGxpbSArPSBiYW5kLT50aHJlc2hvbGQ7CisgICAgICAgICAgICAgICAgaWYgKGJhbmQtPmVuZXJneSA8PSBiYW5kLT50aHJlc2hvbGQgfHwgYmFuZC0+dGhyZXNob2xkID09IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NlLT56ZXJvZXNbKHcrdzIpKjE2K2ddID0gMTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG56ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwbGltc1t3KjE2K2ddID0gdXBsaW0gKjUxMjsKKyAgICAgICAgICAgIHNjZS0+emVyb2VzW3cqMTYrZ10gPSAhbno7CisgICAgICAgICAgICBpZiAobnopCisgICAgICAgICAgICAgICAgbWludGhyID0gRkZNSU4obWludGhyLCB1cGxpbSk7CisgICAgICAgICAgICBhbGx6IHw9IG56OworICAgICAgICB9CisgICAgfQorICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pIHsKKyAgICAgICAgZm9yIChnID0gMDsgIGcgPCBzY2UtPmljcy5udW1fc3diOyBnKyspIHsKKyAgICAgICAgICAgIGlmIChzY2UtPnplcm9lc1t3KjE2K2ddKSB7CisgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXSA9IFNDQUxFX09ORV9QT1M7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2UtPnNmX2lkeFt3KjE2K2ddID0gU0NBTEVfT05FX1BPUyArIEZGTUlOKGxvZzJmKHVwbGltc1t3KjE2K2ddL21pbnRocikqNCw1OSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWFsbHopCisgICAgICAgIHJldHVybjsKKyAgICBhYnNfcG93MzRfdihzLT5zY29lZnMsIHNjZS0+Y29lZmZzLCAxMDI0KTsKKworICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pIHsKKyAgICAgICAgc3RhcnQgPSB3KjEyODsKKyAgICAgICAgZm9yIChnID0gMDsgIGcgPCBzY2UtPmljcy5udW1fc3diOyBnKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZWQgPSBzLT5zY29lZnMgKyBzdGFydDsKKyAgICAgICAgICAgIG1heHZhbHNbdyoxNitnXSA9IGZpbmRfbWF4X3ZhbChzY2UtPmljcy5ncm91cF9sZW5bd10sIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSwgc2NhbGVkKTsKKyAgICAgICAgICAgIHN0YXJ0ICs9IHNjZS0+aWNzLnN3Yl9zaXplc1tnXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRvIHsKKyAgICAgICAgaW50IHRiaXRzLCBxc3RlcDsKKyAgICAgICAgbWluc2NhbGVyID0gc2NlLT5zZl9pZHhbMF07CisgICAgICAgIHFzdGVwID0gaXRzID8gMSA6IDMyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgcHJldiA9IC0xOworICAgICAgICAgICAgdGJpdHMgPSAwOworICAgICAgICAgICAgZmZsYWcgPSAwOworCisgICAgICAgICAgICBpZiAocXN0ZXAgPiAxKSB7CisgICAgICAgICAgICAgICAgZm9yICh3ID0gMDsgdyA8IHNjZS0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZS0+aWNzLmdyb3VwX2xlblt3XSkgeworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHcqMTI4OworICAgICAgICAgICAgICAgICAgICBmb3IgKGcgPSAwOyAgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmNvZWZzID0gc2NlLT5jb2VmZnMgKyBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZWQgPSBzLT5zY29lZnMgKyBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjZS0+emVyb2VzW3cqMTYrZ10gfHwgc2NlLT5zZl9pZHhbdyoxNitnXSA+PSAyMTgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArPSBzY2UtPmljcy5zd2Jfc2l6ZXNbZ107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5zY2FsZXIgPSBGRk1JTihtaW5zY2FsZXIsIHNjZS0+c2ZfaWR4W3cqMTYrZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgY2IgPSBmaW5kX21pbl9ib29rKG1heHZhbHNbdyoxNitnXSwgc2NlLT5zZl9pZHhbdyoxNitnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHcyID0gMDsgdzIgPCBzY2UtPmljcy5ncm91cF9sZW5bd107IHcyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IHF1YW50aXplX2JhbmRfY29zdF9iaXRzKHMsIGNvZWZzICsgdzIqMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkICsgdzIqMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5pY3Muc3diX3NpemVzW2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IGZmX2FhY19zY2FsZWZhY3Rvcl9iaXRzW3NjZS0+c2ZfaWR4W3cqMTYrZ10gLSBwcmV2ICsgU0NBTEVfRElGRl9aRVJPXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRiaXRzICs9IGJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArPSBzY2UtPmljcy5zd2Jfc2l6ZXNbZ107CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gc2NlLT5zZl9pZHhbdyoxNitnXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSB3KjEyODsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChnID0gMDsgIGcgPCBzY2UtPmljcy5udW1fc3diOyBnKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpjb2VmcyA9IHNjZS0+Y29lZmZzICsgc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkID0gcy0+c2NvZWZzICsgc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2I7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkaXN0ID0gMC4wZjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjZS0+emVyb2VzW3cqMTYrZ10gfHwgc2NlLT5zZl9pZHhbdyoxNitnXSA+PSAyMTgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArPSBzY2UtPmljcy5zd2Jfc2l6ZXNbZ107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5zY2FsZXIgPSBGRk1JTihtaW5zY2FsZXIsIHNjZS0+c2ZfaWR4W3cqMTYrZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgY2IgPSBmaW5kX21pbl9ib29rKG1heHZhbHNbdyoxNitnXSwgc2NlLT5zZl9pZHhbdyoxNitnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHcyID0gMDsgdzIgPCBzY2UtPmljcy5ncm91cF9sZW5bd107IHcyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ICs9IHF1YW50aXplX2JhbmRfY29zdChzLCBjb2VmcyArIHcyKjEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWQgKyB3MioxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5pY3Muc3diX3NpemVzW2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4W3cqMTYrZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSBiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHNbdyoxNitnXSA9IGRpc3QgLSBiaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IGZmX2FhY19zY2FsZWZhY3Rvcl9iaXRzW3NjZS0+c2ZfaWR4W3cqMTYrZ10gLSBwcmV2ICsgU0NBTEVfRElGRl9aRVJPXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRiaXRzICs9IGJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArPSBzY2UtPmljcy5zd2Jfc2l6ZXNbZ107CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gc2NlLT5zZl9pZHhbdyoxNitnXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0Yml0cyA+IGRlc3RiaXRzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgICAgICAgICAgICAgICAgICBpZiAoc2NlLT5zZl9pZHhbaV0gPCAyMTggLSBxc3RlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4W2ldICs9IHFzdGVwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChzY2UtPnNmX2lkeFtpXSA+IDYwIC0gcXN0ZXApCisgICAgICAgICAgICAgICAgICAgICAgICBzY2UtPnNmX2lkeFtpXSAtPSBxc3RlcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHFzdGVwID4+PSAxOworICAgICAgICAgICAgaWYgKCFxc3RlcCAmJiB0Yml0cyA+IGRlc3RiaXRzKjEuMDIgJiYgc2NlLT5zZl9pZHhbMF0gPCAyMTcpCisgICAgICAgICAgICAgICAgcXN0ZXAgPSAxOworICAgICAgICB9IHdoaWxlIChxc3RlcCk7CisKKyAgICAgICAgZmZsYWcgPSAwOworICAgICAgICBtaW5zY2FsZXIgPSBhdl9jbGlwKG1pbnNjYWxlciwgNjAsIDI1NSAtIFNDQUxFX01BWF9ESUZGKTsKKyAgICAgICAgZm9yICh3ID0gMDsgdyA8IHNjZS0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZS0+aWNzLmdyb3VwX2xlblt3XSkgeworICAgICAgICAgICAgZm9yIChnID0gMDsgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykgeworICAgICAgICAgICAgICAgIGludCBwcmV2c2MgPSBzY2UtPnNmX2lkeFt3KjE2K2ddOworICAgICAgICAgICAgICAgIGlmIChkaXN0c1t3KjE2K2ddID4gdXBsaW1zW3cqMTYrZ10gJiYgc2NlLT5zZl9pZHhbdyoxNitnXSA+IDYwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kX21pbl9ib29rKG1heHZhbHNbdyoxNitnXSwgc2NlLT5zZl9pZHhbdyoxNitnXS0xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4W3cqMTYrZ10tLTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXS09MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXSA9IGF2X2NsaXAoc2NlLT5zZl9pZHhbdyoxNitnXSwgbWluc2NhbGVyLCBtaW5zY2FsZXIgKyBTQ0FMRV9NQVhfRElGRik7CisgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXSA9IEZGTUlOKHNjZS0+c2ZfaWR4W3cqMTYrZ10sIDIxOSk7CisgICAgICAgICAgICAgICAgaWYgKHNjZS0+c2ZfaWR4W3cqMTYrZ10gIT0gcHJldnNjKQorICAgICAgICAgICAgICAgICAgICBmZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgc2NlLT5iYW5kX3R5cGVbdyoxNitnXSA9IGZpbmRfbWluX2Jvb2sobWF4dmFsc1t3KjE2K2ddLCBzY2UtPnNmX2lkeFt3KjE2K2ddKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpdHMrKzsKKyAgICB9IHdoaWxlIChmZmxhZyAmJiBpdHMgPCAxMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlYXJjaF9mb3JfbXNfbWlwcyhBQUNFbmNDb250ZXh0ICpzLCBDaGFubmVsRWxlbWVudCAqY3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGxhbWJkYSkKK3sKKyAgICBpbnQgc3RhcnQgPSAwLCBpLCB3LCB3MiwgZzsKKyAgICBmbG9hdCBNWzEyOF0sIFNbMTI4XTsKKyAgICBmbG9hdCAqTDM0ID0gcy0+c2NvZWZzLCAqUjM0ID0gcy0+c2NvZWZzICsgMTI4LCAqTTM0ID0gcy0+c2NvZWZzICsgMTI4KjIsICpTMzQgPSBzLT5zY29lZnMgKyAxMjgqMzsKKyAgICBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlMCA9ICZjcGUtPmNoWzBdOworICAgIFNpbmdsZUNoYW5uZWxFbGVtZW50ICpzY2UxID0gJmNwZS0+Y2hbMV07CisgICAgaWYgKCFjcGUtPmNvbW1vbl93aW5kb3cpCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKHcgPSAwOyB3IDwgc2NlMC0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZTAtPmljcy5ncm91cF9sZW5bd10pIHsKKyAgICAgICAgZm9yIChnID0gMDsgIGcgPCBzY2UwLT5pY3MubnVtX3N3YjsgZysrKSB7CisgICAgICAgICAgICBpZiAoIWNwZS0+Y2hbMF0uemVyb2VzW3cqMTYrZ10gJiYgIWNwZS0+Y2hbMV0uemVyb2VzW3cqMTYrZ10pIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBkaXN0MSA9IDAuMGYsIGRpc3QyID0gMC4wZjsKKyAgICAgICAgICAgICAgICBmb3IgKHcyID0gMDsgdzIgPCBzY2UwLT5pY3MuZ3JvdXBfbGVuW3ddOyB3MisrKSB7CisgICAgICAgICAgICAgICAgICAgIEZGUHN5QmFuZCAqYmFuZDAgPSAmcy0+cHN5LmNoW3MtPmN1cl9jaGFubmVsKzBdLnBzeV9iYW5kc1sodyt3MikqMTYrZ107CisgICAgICAgICAgICAgICAgICAgIEZGUHN5QmFuZCAqYmFuZDEgPSAmcy0+cHN5LmNoW3MtPmN1cl9jaGFubmVsKzFdLnBzeV9iYW5kc1sodyt3MikqMTYrZ107CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1pbnRociA9IEZGTUlOKGJhbmQwLT50aHJlc2hvbGQsIGJhbmQxLT50aHJlc2hvbGQpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXh0aHIgPSBGRk1BWChiYW5kMC0+dGhyZXNob2xkLCBiYW5kMS0+dGhyZXNob2xkKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ107IGkrPTQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1baSAgXSA9IChzY2UwLT5jb2VmZnNbc3RhcnQrdzIqMTI4K2kgIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzY2UxLT5jb2VmZnNbc3RhcnQrdzIqMTI4K2kgIF0pICogMC41OworICAgICAgICAgICAgICAgICAgICAgICAgTVtpKzFdID0gKHNjZTAtPmNvZWZmc1tzdGFydCt3MioxMjgraSsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNjZTEtPmNvZWZmc1tzdGFydCt3MioxMjgraSsxXSkgKiAwLjU7CisgICAgICAgICAgICAgICAgICAgICAgICBNW2krMl0gPSAoc2NlMC0+Y29lZmZzW3N0YXJ0K3cyKjEyOCtpKzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2NlMS0+Y29lZmZzW3N0YXJ0K3cyKjEyOCtpKzJdKSAqIDAuNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1baSszXSA9IChzY2UwLT5jb2VmZnNbc3RhcnQrdzIqMTI4K2krM10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzY2UxLT5jb2VmZnNbc3RhcnQrdzIqMTI4K2krM10pICogMC41OworCisgICAgICAgICAgICAgICAgICAgICAgICBTW2kgIF0gPSAgTVtpICBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2NlMS0+Y29lZmZzW3N0YXJ0K3cyKjEyOCtpICBdOworICAgICAgICAgICAgICAgICAgICAgICAgU1tpKzFdID0gIE1baSsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNjZTEtPmNvZWZmc1tzdGFydCt3MioxMjgraSsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNbaSsyXSA9ICBNW2krMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzY2UxLT5jb2VmZnNbc3RhcnQrdzIqMTI4K2krMl07CisgICAgICAgICAgICAgICAgICAgICAgICBTW2krM10gPSAgTVtpKzNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2NlMS0+Y29lZmZzW3N0YXJ0K3cyKjEyOCtpKzNdOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWJzX3BvdzM0X3YoTDM0LCBzY2UwLT5jb2VmZnMrc3RhcnQrdzIqMTI4LCBzY2UwLT5pY3Muc3diX3NpemVzW2ddKTsKKyAgICAgICAgICAgICAgICAgICAgYWJzX3BvdzM0X3YoUjM0LCBzY2UxLT5jb2VmZnMrc3RhcnQrdzIqMTI4LCBzY2UwLT5pY3Muc3diX3NpemVzW2ddKTsKKyAgICAgICAgICAgICAgICAgICAgYWJzX3BvdzM0X3YoTTM0LCBNLCAgICAgICAgICAgICAgICAgICAgICAgICBzY2UwLT5pY3Muc3diX3NpemVzW2ddKTsKKyAgICAgICAgICAgICAgICAgICAgYWJzX3BvdzM0X3YoUzM0LCBTLCAgICAgICAgICAgICAgICAgICAgICAgICBzY2UwLT5pY3Muc3diX3NpemVzW2ddKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzdDEgKz0gcXVhbnRpemVfYmFuZF9jb3N0KHMsIHNjZTAtPmNvZWZmcyArIHN0YXJ0ICsgdzIqMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlMC0+aWNzLnN3Yl9zaXplc1tnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZTAtPnNmX2lkeFsodyt3MikqMTYrZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2UwLT5iYW5kX3R5cGVbKHcrdzIpKjE2K2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIC8gYmFuZDAtPnRocmVzaG9sZCwgSU5GSU5JVFksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBkaXN0MSArPSBxdWFudGl6ZV9iYW5kX2Nvc3Qocywgc2NlMS0+Y29lZmZzICsgc3RhcnQgKyB3MioxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSMzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2UxLT5pY3Muc3diX3NpemVzW2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlMS0+c2ZfaWR4Wyh3K3cyKSoxNitnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZTEtPmJhbmRfdHlwZVsodyt3MikqMTYrZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgLyBiYW5kMS0+dGhyZXNob2xkLCBJTkZJTklUWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGRpc3QyICs9IHF1YW50aXplX2JhbmRfY29zdChzLCBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlMC0+aWNzLnN3Yl9zaXplc1tnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZTAtPnNmX2lkeFsodyt3MikqMTYrZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2UwLT5iYW5kX3R5cGVbKHcrdzIpKjE2K2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIC8gbWF4dGhyLCBJTkZJTklUWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGRpc3QyICs9IHF1YW50aXplX2JhbmRfY29zdChzLCBTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUzM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlMS0+aWNzLnN3Yl9zaXplc1tnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZTEtPnNmX2lkeFsodyt3MikqMTYrZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2UxLT5iYW5kX3R5cGVbKHcrdzIpKjE2K2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIC8gbWludGhyLCBJTkZJTklUWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNwZS0+bXNfbWFza1t3KjE2K2ddID0gZGlzdDIgPCBkaXN0MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXJ0ICs9IHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ107CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLypIQVZFX01JUFNGUFUgKi8KKworc3RhdGljIHZvaWQgY29kZWJvb2tfdHJlbGxpc19yYXRlX21pcHMoQUFDRW5jQ29udGV4dCAqcywgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW4sIGludCBncm91cF9sZW4sIGNvbnN0IGZsb2F0IGxhbWJkYSkKK3sKKyAgICBCYW5kQ29kaW5nUGF0aCBwYXRoWzEyMF1bMTJdOworICAgIGludCB3LCBzd2IsIGNiLCBzdGFydCwgc2l6ZTsKKyAgICBpbnQgaSwgajsKKyAgICBjb25zdCBpbnQgbWF4X3NmYiAgPSBzY2UtPmljcy5tYXhfc2ZiOworICAgIGNvbnN0IGludCBydW5fYml0cyA9IHNjZS0+aWNzLm51bV93aW5kb3dzID09IDEgPyA1IDogMzsKKyAgICBjb25zdCBpbnQgcnVuX2VzYyAgPSAoMSA8PCBydW5fYml0cykgLSAxOworICAgIGludCBpZHgsIHBwb3MsIGNvdW50OworICAgIGludCBzdGFja3J1blsxMjBdLCBzdGFja2NiWzEyMF0sIHN0YWNrX2xlbjsKKyAgICBmbG9hdCBuZXh0X21pbmJpdHMgPSBJTkZJTklUWTsKKyAgICBpbnQgbmV4dF9taW5jYiA9IDA7CisKKyAgICBhYnNfcG93MzRfdihzLT5zY29lZnMsIHNjZS0+Y29lZmZzLCAxMDI0KTsKKyAgICBzdGFydCA9IHdpbioxMjg7CisgICAgZm9yIChjYiA9IDA7IGNiIDwgMTI7IGNiKyspIHsKKyAgICAgICAgcGF0aFswXVtjYl0uY29zdCAgICAgPSBydW5fYml0cys0OworICAgICAgICBwYXRoWzBdW2NiXS5wcmV2X2lkeCA9IC0xOworICAgICAgICBwYXRoWzBdW2NiXS5ydW4gICAgICA9IDA7CisgICAgfQorICAgIGZvciAoc3diID0gMDsgc3diIDwgbWF4X3NmYjsgc3diKyspIHsKKyAgICAgICAgc2l6ZSA9IHNjZS0+aWNzLnN3Yl9zaXplc1tzd2JdOworICAgICAgICBpZiAoc2NlLT56ZXJvZXNbd2luKjE2ICsgc3diXSkgeworICAgICAgICAgICAgZmxvYXQgY29zdF9zdGF5X2hlcmUgPSBwYXRoW3N3Yl1bMF0uY29zdDsKKyAgICAgICAgICAgIGZsb2F0IGNvc3RfZ2V0X2hlcmUgID0gbmV4dF9taW5iaXRzICsgcnVuX2JpdHMgKyA0OworICAgICAgICAgICAgaWYgKCAgIHJ1bl92YWx1ZV9iaXRzW3NjZS0+aWNzLm51bV93aW5kb3dzID09IDhdW3BhdGhbc3diXVswXS5ydW5dCisgICAgICAgICAgICAgICAgIT0gcnVuX3ZhbHVlX2JpdHNbc2NlLT5pY3MubnVtX3dpbmRvd3MgPT0gOF1bcGF0aFtzd2JdWzBdLnJ1bisxXSkKKyAgICAgICAgICAgICAgICBjb3N0X3N0YXlfaGVyZSArPSBydW5fYml0czsKKyAgICAgICAgICAgIGlmIChjb3N0X2dldF9oZXJlIDwgY29zdF9zdGF5X2hlcmUpIHsKKyAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVswXS5wcmV2X2lkeCA9IG5leHRfbWluY2I7CisgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bMF0uY29zdCAgICAgPSBjb3N0X2dldF9oZXJlOworICAgICAgICAgICAgICAgIHBhdGhbc3diKzFdWzBdLnJ1biAgICAgID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bMF0ucHJldl9pZHggPSAwOworICAgICAgICAgICAgICAgIHBhdGhbc3diKzFdWzBdLmNvc3QgICAgID0gY29zdF9zdGF5X2hlcmU7CisgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bMF0ucnVuICAgICAgPSBwYXRoW3N3Yl1bMF0ucnVuICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHRfbWluYml0cyA9IHBhdGhbc3diKzFdWzBdLmNvc3Q7CisgICAgICAgICAgICBuZXh0X21pbmNiID0gMDsKKyAgICAgICAgICAgIGZvciAoY2IgPSAxOyBjYiA8IDEyOyBjYisrKSB7CisgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLmNvc3QgPSA2MTQ1MDsKKyAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0ucHJldl9pZHggPSAtMTsKKyAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0ucnVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsb2F0IG1pbmJpdHMgPSBuZXh0X21pbmJpdHM7CisgICAgICAgICAgICBpbnQgbWluY2IgPSBuZXh0X21pbmNiOworICAgICAgICAgICAgaW50IHN0YXJ0Y2IgPSBzY2UtPmJhbmRfdHlwZVt3aW4qMTYrc3diXTsKKyAgICAgICAgICAgIG5leHRfbWluYml0cyA9IElORklOSVRZOworICAgICAgICAgICAgbmV4dF9taW5jYiA9IDA7CisgICAgICAgICAgICBmb3IgKGNiID0gMDsgY2IgPCBzdGFydGNiOyBjYisrKSB7CisgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLmNvc3QgPSA2MTQ1MDsKKyAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0ucHJldl9pZHggPSAtMTsKKyAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0ucnVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY2IgPSBzdGFydGNiOyBjYiA8IDEyOyBjYisrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgY29zdF9zdGF5X2hlcmUsIGNvc3RfZ2V0X2hlcmU7CisgICAgICAgICAgICAgICAgZmxvYXQgYml0cyA9IDAuMGY7CisgICAgICAgICAgICAgICAgZm9yICh3ID0gMDsgdyA8IGdyb3VwX2xlbjsgdysrKSB7CisgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gcXVhbnRpemVfYmFuZF9jb3N0X2JpdHMocywgc2NlLT5jb2VmZnMgKyBzdGFydCArIHcqMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNjb2VmcyArIHN0YXJ0ICsgdyoxMjgsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbKHdpbit3KSoxNitzd2JdLCBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBJTkZJTklUWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvc3Rfc3RheV9oZXJlID0gcGF0aFtzd2JdW2NiXS5jb3N0ICsgYml0czsKKyAgICAgICAgICAgICAgICBjb3N0X2dldF9oZXJlICA9IG1pbmJpdHMgICAgICAgICAgICArIGJpdHMgKyBydW5fYml0cyArIDQ7CisgICAgICAgICAgICAgICAgaWYgKCAgIHJ1bl92YWx1ZV9iaXRzW3NjZS0+aWNzLm51bV93aW5kb3dzID09IDhdW3BhdGhbc3diXVtjYl0ucnVuXQorICAgICAgICAgICAgICAgICAgICAhPSBydW5fdmFsdWVfYml0c1tzY2UtPmljcy5udW1fd2luZG93cyA9PSA4XVtwYXRoW3N3Yl1bY2JdLnJ1bisxXSkKKyAgICAgICAgICAgICAgICAgICAgY29zdF9zdGF5X2hlcmUgKz0gcnVuX2JpdHM7CisgICAgICAgICAgICAgICAgaWYgKGNvc3RfZ2V0X2hlcmUgPCBjb3N0X3N0YXlfaGVyZSkgeworICAgICAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0ucHJldl9pZHggPSBtaW5jYjsKKyAgICAgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLmNvc3QgICAgID0gY29zdF9nZXRfaGVyZTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLnJ1biAgICAgID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRoW3N3YisxXVtjYl0ucHJldl9pZHggPSBjYjsKKyAgICAgICAgICAgICAgICAgICAgcGF0aFtzd2IrMV1bY2JdLmNvc3QgICAgID0gY29zdF9zdGF5X2hlcmU7CisgICAgICAgICAgICAgICAgICAgIHBhdGhbc3diKzFdW2NiXS5ydW4gICAgICA9IHBhdGhbc3diXVtjYl0ucnVuICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhdGhbc3diKzFdW2NiXS5jb3N0IDwgbmV4dF9taW5iaXRzKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRfbWluYml0cyA9IHBhdGhbc3diKzFdW2NiXS5jb3N0OworICAgICAgICAgICAgICAgICAgICBuZXh0X21pbmNiID0gY2I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXJ0ICs9IHNjZS0+aWNzLnN3Yl9zaXplc1tzd2JdOworICAgIH0KKworICAgIHN0YWNrX2xlbiA9IDA7CisgICAgaWR4ICAgICAgID0gMDsKKyAgICBmb3IgKGNiID0gMTsgY2IgPCAxMjsgY2IrKykKKyAgICAgICAgaWYgKHBhdGhbbWF4X3NmYl1bY2JdLmNvc3QgPCBwYXRoW21heF9zZmJdW2lkeF0uY29zdCkKKyAgICAgICAgICAgIGlkeCA9IGNiOworICAgIHBwb3MgPSBtYXhfc2ZiOworICAgIHdoaWxlIChwcG9zID4gMCkgeworICAgICAgICBhdl9hc3NlcnQxKGlkeCA+PSAwKTsKKyAgICAgICAgY2IgPSBpZHg7CisgICAgICAgIHN0YWNrcnVuW3N0YWNrX2xlbl0gPSBwYXRoW3Bwb3NdW2NiXS5ydW47CisgICAgICAgIHN0YWNrY2IgW3N0YWNrX2xlbl0gPSBjYjsKKyAgICAgICAgaWR4ID0gcGF0aFtwcG9zLXBhdGhbcHBvc11bY2JdLnJ1bisxXVtjYl0ucHJldl9pZHg7CisgICAgICAgIHBwb3MgLT0gcGF0aFtwcG9zXVtjYl0ucnVuOworICAgICAgICBzdGFja19sZW4rKzsKKyAgICB9CisKKyAgICBzdGFydCA9IDA7CisgICAgZm9yIChpID0gc3RhY2tfbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCBzdGFja2NiW2ldKTsKKyAgICAgICAgY291bnQgPSBzdGFja3J1bltpXTsKKyAgICAgICAgbWVtc2V0KHNjZS0+emVyb2VzICsgd2luKjE2ICsgc3RhcnQsICFzdGFja2NiW2ldLCBjb3VudCk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisgICAgICAgICAgICBzY2UtPmJhbmRfdHlwZVt3aW4qMTYgKyBzdGFydF0gPSAgc3RhY2tjYltpXTsKKyAgICAgICAgICAgIHN0YXJ0Kys7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGNvdW50ID49IHJ1bl9lc2MpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcnVuX2JpdHMsIHJ1bl9lc2MpOworICAgICAgICAgICAgY291bnQgLT0gcnVuX2VzYzsKKyAgICAgICAgfQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIHJ1bl9iaXRzLCBjb3VudCk7CisgICAgfQorfQorI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCit2b2lkIGZmX2FhY19jb2Rlcl9pbml0X21pcHMoQUFDRW5jQ29udGV4dCAqYykgeworI2lmIEhBVkVfSU5MSU5FX0FTTQorICAgIEFBQ0NvZWZmaWNpZW50c0VuY29kZXIgKmUgPSBjLT5jb2RlcjsKKyAgICBpbnQgb3B0aW9uID0gYy0+b3B0aW9ucy5hYWNfY29kZXI7CisKKyAgICBpZiAob3B0aW9uID09IDIpIHsKKyAgICAgICAgZS0+cXVhbnRpemVfYW5kX2VuY29kZV9iYW5kID0gcXVhbnRpemVfYW5kX2VuY29kZV9iYW5kX21pcHM7CisgICAgICAgIGUtPmVuY29kZV93aW5kb3dfYmFuZHNfaW5mbyA9IGNvZGVib29rX3RyZWxsaXNfcmF0ZV9taXBzOworI2lmIEhBVkVfTUlQU0ZQVQorICAgICAgICBlLT5zZWFyY2hfZm9yX3F1YW50aXplcnMgICAgPSBzZWFyY2hfZm9yX3F1YW50aXplcnNfdHdvbG9vcF9taXBzOworICAgICAgICBlLT5zZWFyY2hfZm9yX21zICAgICAgICAgICAgPSBzZWFyY2hfZm9yX21zX21pcHM7CisjZW5kaWYgLyogSEFWRV9NSVBTRlBVICovCisgICAgfQorI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hYWNkZWNfbWlwcy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hYWNkZWNfbWlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYjEwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FhY2RlY19taXBzLmMKQEAgLTAsMCArMSw4MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIKKyAqICAgICAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIENhbGlmb3JuaWEuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3JzOiAgRGFya28gTGF1cyAgICAgIChkYXJrb0BtaXBzLmNvbSkKKyAqICAgICAgICAgICBEam9yZGplIFBlc3V0ICAgKGRqb3JkamVAbWlwcy5jb20pCisgKiAgICAgICAgICAgTWlyamFuYSBWdWxpbiAgIChtdnVsaW5AbWlwcy5jb20pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJlZmVyZW5jZTogbGliYXZjb2RlYy9hYWNkZWMuYworICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2FhYy5oIgorI2luY2x1ZGUgImFhY2RlY19taXBzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYWN0YWIuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3NpbmV3aW4uaCIKKworI2lmIEhBVkVfSU5MSU5FX0FTTQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGxjZ19yYW5kb20odW5zaWduZWQgcHJldmlvdXNfdmFsKQoreworICAgIHVuaW9uIHsgdW5zaWduZWQgdTsgaW50IHM7IH0gdiA9IHsgcHJldmlvdXNfdmFsICogMTY2NDUyNXUgKyAxMDEzOTA0MjIzIH07CisgICAgcmV0dXJuIHYuczsKK30KKworc3RhdGljIHZvaWQgaW1kY3RfYW5kX3dpbmRvd2luZ19taXBzKEFBQ0NvbnRleHQgKmFjLCBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlKQoreworICAgIEluZGl2aWR1YWxDaGFubmVsU3RyZWFtICppY3MgPSAmc2NlLT5pY3M7CisgICAgZmxvYXQgKmluICAgID0gc2NlLT5jb2VmZnM7CisgICAgZmxvYXQgKm91dCAgID0gc2NlLT5yZXQ7CisgICAgZmxvYXQgKnNhdmVkID0gc2NlLT5zYXZlZDsKKyAgICBjb25zdCBmbG9hdCAqc3dpbmRvdyAgICAgID0gaWNzLT51c2Vfa2Jfd2luZG93WzBdID8gZmZfYWFjX2tiZF9zaG9ydF8xMjggOiBmZl9zaW5lXzEyODsKKyAgICBjb25zdCBmbG9hdCAqbHdpbmRvd19wcmV2ID0gaWNzLT51c2Vfa2Jfd2luZG93WzFdID8gZmZfYWFjX2tiZF9sb25nXzEwMjQgOiBmZl9zaW5lXzEwMjQ7CisgICAgY29uc3QgZmxvYXQgKnN3aW5kb3dfcHJldiA9IGljcy0+dXNlX2tiX3dpbmRvd1sxXSA/IGZmX2FhY19rYmRfc2hvcnRfMTI4IDogZmZfc2luZV8xMjg7CisgICAgZmxvYXQgKmJ1ZiAgPSBhYy0+YnVmX21kY3Q7CisgICAgaW50IGk7CisKKyAgICBpZiAoaWNzLT53aW5kb3dfc2VxdWVuY2VbMF0gPT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gMTI4KQorICAgICAgICAgICAgYWMtPm1kY3Rfc21hbGwuaW1kY3RfaGFsZigmYWMtPm1kY3Rfc21hbGwsIGJ1ZiArIGksIGluICsgaSk7CisgICAgfSBlbHNlCisgICAgICAgIGFjLT5tZGN0LmltZGN0X2hhbGYoJmFjLT5tZGN0LCBidWYsIGluKTsKKworICAgIC8qIHdpbmRvdyBvdmVybGFwcGluZworICAgICAqIE5PVEU6IFRvIHNpbXBsaWZ5IHRoZSBvdmVybGFwcGluZyBjb2RlLCBhbGwgJ21lYW5pbmdsZXNzJyBzaG9ydCB0byBsb25nCisgICAgICogYW5kIGxvbmcgdG8gc2hvcnQgdHJhbnNpdGlvbnMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc2hvcnQgdG8gc2hvcnQKKyAgICAgKiB0cmFuc2l0aW9ucy4gVGhpcyBsZWF2ZXMganVzdCB0d28gY2FzZXMgKGxvbmcgdG8gbG9uZyBhbmQgc2hvcnQgdG8gc2hvcnQpCisgICAgICogd2l0aCBhIGxpdHRsZSBzcGVjaWFsIHNhdWNlIGZvciBFSUdIVF9TSE9SVF9TRVFVRU5DRS4KKyAgICAgKi8KKyAgICBpZiAoKGljcy0+d2luZG93X3NlcXVlbmNlWzFdID09IE9OTFlfTE9OR19TRVFVRU5DRSB8fCBpY3MtPndpbmRvd19zZXF1ZW5jZVsxXSA9PSBMT05HX1NUT1BfU0VRVUVOQ0UpICYmCisgICAgICAgICAgICAoaWNzLT53aW5kb3dfc2VxdWVuY2VbMF0gPT0gT05MWV9MT05HX1NFUVVFTkNFIHx8IGljcy0+d2luZG93X3NlcXVlbmNlWzBdID09IExPTkdfU1RBUlRfU0VRVUVOQ0UpKSB7CisgICAgICAgIGFjLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3coICAgIG91dCwgICAgICAgICAgICAgICBzYXZlZCwgICAgICAgICAgICBidWYsICAgICAgICAgbHdpbmRvd19wcmV2LCA1MTIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0ICpidWYxID0gc2F2ZWQ7CisgICAgICAgICAgICBmbG9hdCAqYnVmMiA9IG91dDsKKyAgICAgICAgICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgICAgICAgICAgICBpbnQgbG9vcF9lbmQ7CisKKyAgICAgICAgICAgIC8qIGxvb3AgdW5yb2xsZWQgOCB0aW1lcyAqLworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICAlW2xvb3BfZW5kXSwgJVtzcmNdLCAgICAgIDE3OTIgIFxuXHQiCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICAlW3RlbXAxXSwgICAgNCglW3NyY10pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMl0sICAgIDgoJVtzcmNdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDNdLCAgICAxMiglW3NyY10pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICAlW3RlbXA0XSwgICAgMTYoJVtzcmNdKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNV0sICAgIDIwKCVbc3JjXSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDZdLCAgICAyNCglW3NyY10pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICAlW3RlbXA3XSwgICAgMjgoJVtzcmNdKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAzMiAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICAlW3RlbXAxXSwgICAgNCglW2RzdF0pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMl0sICAgIDgoJVtkc3RdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDNdLCAgICAxMiglW2RzdF0pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICAlW3RlbXA0XSwgICAgMTYoJVtkc3RdKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNV0sICAgIDIwKCVbZHN0XSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDZdLCAgICAyNCglW2RzdF0pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICAlW3RlbXA3XSwgICAgMjgoJVtkc3RdKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImJuZSAgICAgJVtzcmNdLCAgICAgICVbbG9vcF9lbmRdLCAxYiAgICBcblx0IgorICAgICAgICAgICAgICAgICIgYWRkaXUgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgMzIgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICAgICAgICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksCisgICAgICAgICAgICAgICAgICBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpLCBbc3JjXSIrciIoYnVmMSksCisgICAgICAgICAgICAgICAgICBbZHN0XSIrciIoYnVmMikKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpY3MtPndpbmRvd19zZXF1ZW5jZVswXSA9PSBFSUdIVF9TSE9SVF9TRVFVRU5DRSkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IHdpOworICAgICAgICAgICAgICAgIGZsb2F0IHdqOworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICAgICAgICAgICAgICAgIGZsb2F0ICpkc3QwID0gb3V0ICsgNDQ4ICsgMCoxMjg7CisgICAgICAgICAgICAgICAgZmxvYXQgKmRzdDEgPSBkc3QwICsgNjQgKyA2MzsKKyAgICAgICAgICAgICAgICBmbG9hdCAqZHN0MiA9IHNhdmVkICsgNjM7CisgICAgICAgICAgICAgICAgZmxvYXQgKndpbjAgPSAoZmxvYXQqKXN3aW5kb3c7CisgICAgICAgICAgICAgICAgZmxvYXQgKndpbjEgPSB3aW4wICsgNjQgKyA2MzsKKyAgICAgICAgICAgICAgICBmbG9hdCAqd2luMF9wcmV2ID0gKGZsb2F0Kilzd2luZG93X3ByZXY7CisgICAgICAgICAgICAgICAgZmxvYXQgKndpbjFfcHJldiA9IHdpbjBfcHJldiArIDY0ICsgNjM7CisgICAgICAgICAgICAgICAgZmxvYXQgKnNyYzBfcHJldiA9IHNhdmVkICsgNDQ4OworICAgICAgICAgICAgICAgIGZsb2F0ICpzcmMxX3ByZXYgPSBidWYgKyAwKjEyOCArIDYzOworICAgICAgICAgICAgICAgIGZsb2F0ICpzcmMwID0gYnVmICsgMCoxMjggKyA2NDsKKyAgICAgICAgICAgICAgICBmbG9hdCAqc3JjMSA9IGJ1ZiArIDEqMTI4ICsgNjM7CisKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDAgPSBzcmMwX3ByZXZbMF07CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gc3JjMV9wcmV2WzBdOworICAgICAgICAgICAgICAgICAgICB3aSA9ICp3aW4wX3ByZXY7CisgICAgICAgICAgICAgICAgICAgIHdqID0gKndpbjFfcHJldjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSBzcmMwWzBdOworICAgICAgICAgICAgICAgICAgICB0ZW1wMyA9IHNyYzFbMF07CisgICAgICAgICAgICAgICAgICAgIGRzdDBbMF0gPSB0ZW1wMCAqIHdqIC0gdGVtcDEgKiB3aTsKKyAgICAgICAgICAgICAgICAgICAgZHN0MVswXSA9IHRlbXAwICogd2kgKyB0ZW1wMSAqIHdqOworCisgICAgICAgICAgICAgICAgICAgIHdpID0gKndpbjA7CisgICAgICAgICAgICAgICAgICAgIHdqID0gKndpbjE7CisKKyAgICAgICAgICAgICAgICAgICAgdGVtcDAgPSBzcmMwWzEyOF07CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gc3JjMVsxMjhdOworICAgICAgICAgICAgICAgICAgICBkc3QwWzEyOF0gPSB0ZW1wMiAqIHdqIC0gdGVtcDMgKiB3aTsKKyAgICAgICAgICAgICAgICAgICAgZHN0MVsxMjhdID0gdGVtcDIgKiB3aSArIHRlbXAzICogd2o7CisKKyAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSBzcmMwWzI1Nl07CisgICAgICAgICAgICAgICAgICAgIHRlbXAzID0gc3JjMVsyNTZdOworICAgICAgICAgICAgICAgICAgICBkc3QwWzI1Nl0gPSB0ZW1wMCAqIHdqIC0gdGVtcDEgKiB3aTsKKyAgICAgICAgICAgICAgICAgICAgZHN0MVsyNTZdID0gdGVtcDAgKiB3aSArIHRlbXAxICogd2o7CisgICAgICAgICAgICAgICAgICAgIGRzdDBbMzg0XSA9IHRlbXAyICogd2ogLSB0ZW1wMyAqIHdpOworICAgICAgICAgICAgICAgICAgICBkc3QxWzM4NF0gPSB0ZW1wMiAqIHdpICsgdGVtcDMgKiB3ajsKKworICAgICAgICAgICAgICAgICAgICB0ZW1wMCA9IHNyYzBbMzg0XTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBzcmMxWzM4NF07CisgICAgICAgICAgICAgICAgICAgIGRzdDBbNTEyXSA9IHRlbXAwICogd2ogLSB0ZW1wMSAqIHdpOworICAgICAgICAgICAgICAgICAgICBkc3QyWzBdID0gdGVtcDAgKiB3aSArIHRlbXAxICogd2o7CisKKyAgICAgICAgICAgICAgICAgICAgc3JjMCsrOworICAgICAgICAgICAgICAgICAgICBzcmMxLS07CisgICAgICAgICAgICAgICAgICAgIHNyYzBfcHJldisrOworICAgICAgICAgICAgICAgICAgICBzcmMxX3ByZXYtLTsKKyAgICAgICAgICAgICAgICAgICAgd2luMCsrOworICAgICAgICAgICAgICAgICAgICB3aW4xLS07CisgICAgICAgICAgICAgICAgICAgIHdpbjBfcHJldisrOworICAgICAgICAgICAgICAgICAgICB3aW4xX3ByZXYtLTsKKyAgICAgICAgICAgICAgICAgICAgZHN0MCsrOworICAgICAgICAgICAgICAgICAgICBkc3QxLS07CisgICAgICAgICAgICAgICAgICAgIGRzdDItLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KG91dCArIDQ0OCwgICAgICAgICBzYXZlZCArIDQ0OCwgICAgICBidWYsICAgICAgICAgc3dpbmRvd19wcmV2LCA2NCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgKmJ1ZjEgPSBidWYgKyA2NDsKKyAgICAgICAgICAgICAgICBmbG9hdCAqYnVmMiA9IG91dCArIDU3NjsKKyAgICAgICAgICAgICAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworICAgICAgICAgICAgICAgIGludCBsb29wX2VuZDsKKworICAgICAgICAgICAgICAgIC8qIGxvb3AgdW5yb2xsZWQgOCB0aW1lcyAqLworICAgICAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICAgICAiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtsb29wX2VuZF0sICVbc3JjXSwgICAgICAxNzkyICBcblx0IgorICAgICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMV0sICAgIDQoJVtzcmNdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibHcgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDNdLCAgICAxMiglW3NyY10pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNF0sICAgIDE2KCVbc3JjXSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibHcgICAgICAlW3RlbXA1XSwgICAgMjAoJVtzcmNdKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDZdLCAgICAyNCglW3NyY10pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wN10sICAgIDI4KCVbc3JjXSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYWRkaXUgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgIDMyICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMV0sICAgIDQoJVtkc3RdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3cgICAgICAlW3RlbXAyXSwgICAgOCglW2RzdF0pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDNdLCAgICAxMiglW2RzdF0pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNF0sICAgIDE2KCVbZHN0XSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3cgICAgICAlW3RlbXA1XSwgICAgMjAoJVtkc3RdKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDZdLCAgICAyNCglW2RzdF0pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wN10sICAgIDI4KCVbZHN0XSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYm5lICAgICAlW3NyY10sICAgICAgJVtsb29wX2VuZF0sIDFiICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICIgYWRkaXUgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgMzIgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgICAgICAgICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICAgICAgICAgICAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwKKyAgICAgICAgICAgICAgICAgICAgICBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpLCBbc3JjXSIrciIoYnVmMSksCisgICAgICAgICAgICAgICAgICAgICAgW2RzdF0iK3IiKGJ1ZjIpCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBidWZmZXIgdXBkYXRlCisgICAgaWYgKGljcy0+d2luZG93X3NlcXVlbmNlWzBdID09IEVJR0hUX1NIT1JUX1NFUVVFTkNFKSB7CisgICAgICAgIGFjLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3coc2F2ZWQgKyA2NCwgIGJ1ZiArIDQqMTI4ICsgNjQsIGJ1ZiArIDUqMTI4LCBzd2luZG93LCA2NCk7CisgICAgICAgIGFjLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3coc2F2ZWQgKyAxOTIsIGJ1ZiArIDUqMTI4ICsgNjQsIGJ1ZiArIDYqMTI4LCBzd2luZG93LCA2NCk7CisgICAgICAgIGFjLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3coc2F2ZWQgKyAzMjAsIGJ1ZiArIDYqMTI4ICsgNjQsIGJ1ZiArIDcqMTI4LCBzd2luZG93LCA2NCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0ICpidWYxID0gYnVmICsgNyoxMjggKyA2NDsKKyAgICAgICAgICAgIGZsb2F0ICpidWYyID0gc2F2ZWQgKyA0NDg7CisgICAgICAgICAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworICAgICAgICAgICAgaW50IGxvb3BfZW5kOworCisgICAgICAgICAgICAvKiBsb29wIHVucm9sbGVkIDggdGltZXMgKi8KKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICIuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICAlW2xvb3BfZW5kXSwgJVtzcmNdLCAgICAgICAyNTYgICBcblx0IgorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICAlW3RlbXAxXSwgICAgNCglW3NyY10pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDJdLCAgICA4KCVbc3JjXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wM10sICAgIDEyKCVbc3JjXSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICAlW3RlbXA0XSwgICAgMTYoJVtzcmNdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDVdLCAgICAyMCglW3NyY10pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNl0sICAgIDI0KCVbc3JjXSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICAlW3RlbXA3XSwgICAgMjgoJVtzcmNdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgIDMyICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICAlW3RlbXAxXSwgICAgNCglW2RzdF0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDJdLCAgICA4KCVbZHN0XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wM10sICAgIDEyKCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICAlW3RlbXA0XSwgICAgMTYoJVtkc3RdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDVdLCAgICAyMCglW2RzdF0pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNl0sICAgIDI0KCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICAlW3RlbXA3XSwgICAgMjgoJVtkc3RdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJibmUgICAgICVbc3JjXSwgICAgICAlW2xvb3BfZW5kXSwgIDFiICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIiBhZGRpdSAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgMzIgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgICAgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICAgICAgICAgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLAorICAgICAgICAgICAgICAgICAgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKSwgW3NyY10iK3IiKGJ1ZjEpLAorICAgICAgICAgICAgICAgICAgW2RzdF0iK3IiKGJ1ZjIpCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGljcy0+d2luZG93X3NlcXVlbmNlWzBdID09IExPTkdfU1RBUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgZmxvYXQgKmJ1ZjEgPSBidWYgKyA1MTI7CisgICAgICAgIGZsb2F0ICpidWYyID0gc2F2ZWQ7CisgICAgICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgICAgICAgIGludCBsb29wX2VuZDsKKworICAgICAgICAvKiBsb29wIHVucm9sbGVkIDggdGltZXMgKi8KKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICVbbG9vcF9lbmRdLCAlW3NyY10sICAgICAgIDE3OTIgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDFdLCAgICA0KCVbc3JjXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wM10sICAgIDEyKCVbc3JjXSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDRdLCAgICAxNiglW3NyY10pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXA1XSwgICAgMjAoJVtzcmNdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNl0sICAgIDI0KCVbc3JjXSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDddLCAgICAyOCglW3NyY10pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAzMiAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDFdLCAgICA0KCVbZHN0XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAyXSwgICAgOCglW2RzdF0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wM10sICAgIDEyKCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDRdLCAgICAxNiglW2RzdF0pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXA1XSwgICAgMjAoJVtkc3RdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNl0sICAgIDI0KCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDddLCAgICAyOCglW2RzdF0pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYm5lICAgICAlW3NyY10sICAgICAgJVtsb29wX2VuZF0sICAxYiAgICBcblx0IgorICAgICAgICAgICAgIiBhZGRpdSAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgMzIgICAgXG5cdCIKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwKKyAgICAgICAgICAgICAgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKSwgW3NyY10iK3IiKGJ1ZjEpLAorICAgICAgICAgICAgICBbZHN0XSIrciIoYnVmMikKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgKmJ1ZjEgPSBidWYgKyA3KjEyOCArIDY0OworICAgICAgICAgICAgZmxvYXQgKmJ1ZjIgPSBzYXZlZCArIDQ0ODsKKyAgICAgICAgICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgICAgICAgICAgICBpbnQgbG9vcF9lbmQ7CisKKyAgICAgICAgICAgIC8qIGxvb3AgdW5yb2xsZWQgOCB0aW1lcyAqLworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtsb29wX2VuZF0sICVbc3JjXSwgICAgICAgIDI1NiAgIFxuXHQiCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMV0sICAgIDQoJVtzcmNdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMl0sICAgIDgoJVtzcmNdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wM10sICAgIDEyKCVbc3JjXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNF0sICAgIDE2KCVbc3JjXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNV0sICAgIDIwKCVbc3JjXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNl0sICAgIDI0KCVbc3JjXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wN10sICAgIDI4KCVbc3JjXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgIDMyICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMV0sICAgIDQoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMl0sICAgIDgoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wM10sICAgIDEyKCVbZHN0XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNF0sICAgIDE2KCVbZHN0XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNV0sICAgIDIwKCVbZHN0XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNl0sICAgIDI0KCVbZHN0XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wN10sICAgIDI4KCVbZHN0XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImJuZSAgICAgJVtzcmNdLCAgICAgICVbbG9vcF9lbmRdLCAgIDFiICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIiBhZGRpdSAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgIDMyICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICAgICAgICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksCisgICAgICAgICAgICAgICAgICBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpLCBbc3JjXSIrciIoYnVmMSksCisgICAgICAgICAgICAgICAgICBbZHN0XSIrciIoYnVmMikKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIExPTkdfU1RPUCBvciBPTkxZX0xPTkcKKyAgICAgICAgZmxvYXQgKmJ1ZjEgPSBidWYgKyA1MTI7CisgICAgICAgIGZsb2F0ICpidWYyID0gc2F2ZWQ7CisgICAgICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgICAgICAgIGludCBsb29wX2VuZDsKKworICAgICAgICAvKiBsb29wIHVucm9sbGVkIDggdGltZXMgKi8KKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgJVtsb29wX2VuZF0sICVbc3JjXSwgICAgICAgIDIwNDggIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMV0sICAgIDQoJVtzcmNdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDNdLCAgICAxMiglW3NyY10pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNF0sICAgIDE2KCVbc3JjXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXA1XSwgICAgMjAoJVtzcmNdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDZdLCAgICAyNCglW3NyY10pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wN10sICAgIDI4KCVbc3JjXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgMzIgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMV0sICAgIDQoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAyXSwgICAgOCglW2RzdF0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDNdLCAgICAxMiglW2RzdF0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNF0sICAgIDE2KCVbZHN0XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXA1XSwgICAgMjAoJVtkc3RdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDZdLCAgICAyNCglW2RzdF0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wN10sICAgIDI4KCVbZHN0XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYm5lICAgICAlW3NyY10sICAgICAgJVtsb29wX2VuZF0sICAgMWIgICAgXG5cdCIKKyAgICAgICAgICAgICIgYWRkaXUgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAzMiAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwKKyAgICAgICAgICAgICAgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKSwgW3NyY10iK3IiKGJ1ZjEpLAorICAgICAgICAgICAgICBbZHN0XSIrciIoYnVmMikKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X2x0cF9taXBzKEFBQ0NvbnRleHQgKmFjLCBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlKQoreworICAgIGNvbnN0IExvbmdUZXJtUHJlZGljdGlvbiAqbHRwID0gJnNjZS0+aWNzLmx0cDsKKyAgICBjb25zdCB1aW50MTZfdCAqb2Zmc2V0cyA9IHNjZS0+aWNzLnN3Yl9vZmZzZXQ7CisgICAgaW50IGksIHNmYjsKKyAgICBpbnQgaiwgazsKKworICAgIGlmIChzY2UtPmljcy53aW5kb3dfc2VxdWVuY2VbMF0gIT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgZmxvYXQgKnByZWRUaW1lID0gc2NlLT5yZXQ7CisgICAgICAgIGZsb2F0ICpwcmVkRnJlcSA9IGFjLT5idWZfbWRjdDsKKyAgICAgICAgZmxvYXQgKnBfcHJlZFRpbWU7CisgICAgICAgIGludDE2X3QgbnVtX3NhbXBsZXMgPSAyMDQ4OworCisgICAgICAgIGlmIChsdHAtPmxhZyA8IDEwMjQpCisgICAgICAgICAgICBudW1fc2FtcGxlcyA9IGx0cC0+bGFnICsgMTAyNDsKKyAgICAgICAgICAgIGogPSAoMjA0OCAtIG51bV9zYW1wbGVzKSA+PiAyOworICAgICAgICAgICAgayA9ICgyMDQ4IC0gbnVtX3NhbXBsZXMpICYgMzsKKyAgICAgICAgICAgIHBfcHJlZFRpbWUgPSAmcHJlZFRpbWVbbnVtX3NhbXBsZXNdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgaSsrKQorICAgICAgICAgICAgcHJlZFRpbWVbaV0gPSBzY2UtPmx0cF9zdGF0ZVtpICsgMjA0OCAtIGx0cC0+bGFnXSAqIGx0cC0+Y29lZjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworCisgICAgICAgICAgICAvKiBsb29wIHVucm9sbGVkIDQgdGltZXMgKi8KKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICJzdyAgICAgICQwLCAgICAgICAgICAgICAgMCglW3BfcHJlZFRpbWVdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICAkMCwgICAgICAgICAgICAgIDQoJVtwX3ByZWRUaW1lXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJDAsICAgICAgICAgICAgICA4KCVbcF9wcmVkVGltZV0pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgICQwLCAgICAgICAgICAgICAgMTIoJVtwX3ByZWRUaW1lXSkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICAlW3BfcHJlZFRpbWVdLCAgICVbcF9wcmVkVGltZV0sICAgICAxNiAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFtwX3ByZWRUaW1lXSIrciIocF9wcmVkVGltZSkKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKSB7CisKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICJzdyAgICAgICQwLCAgICAgICAgICAgICAgMCglW3BfcHJlZFRpbWVdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICAlW3BfcHJlZFRpbWVdLCAgICVbcF9wcmVkVGltZV0sICAgICA0ICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFtwX3ByZWRUaW1lXSIrciIocF9wcmVkVGltZSkKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGFjLT53aW5kb3dpbmdfYW5kX21kY3RfbHRwKGFjLCBwcmVkRnJlcSwgcHJlZFRpbWUsICZzY2UtPmljcyk7CisKKyAgICAgICAgaWYgKHNjZS0+dG5zLnByZXNlbnQpCisgICAgICAgICAgICBhYy0+YXBwbHlfdG5zKHByZWRGcmVxLCAmc2NlLT50bnMsICZzY2UtPmljcywgMCk7CisKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBGRk1JTihzY2UtPmljcy5tYXhfc2ZiLCBNQVhfTFRQX0xPTkdfU0ZCKTsgc2ZiKyspCisgICAgICAgICAgICBpZiAobHRwLT51c2VkW3NmYl0pCisgICAgICAgICAgICAgICAgZm9yIChpID0gb2Zmc2V0c1tzZmJdOyBpIDwgb2Zmc2V0c1tzZmIgKyAxXTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzY2UtPmNvZWZmc1tpXSArPSBwcmVkRnJlcVtpXTsKKyAgICB9Cit9CisKKyNpZiBIQVZFX01JUFNGUFUKK3N0YXRpYyB2b2lkIHVwZGF0ZV9sdHBfbWlwcyhBQUNDb250ZXh0ICphYywgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSkKK3sKKyAgICBJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbSAqaWNzID0gJnNjZS0+aWNzOworICAgIGZsb2F0ICpzYXZlZCAgICAgPSBzY2UtPnNhdmVkOworICAgIGZsb2F0ICpzYXZlZF9sdHAgPSBzY2UtPmNvZWZmczsKKyAgICBjb25zdCBmbG9hdCAqbHdpbmRvdyA9IGljcy0+dXNlX2tiX3dpbmRvd1swXSA/IGZmX2FhY19rYmRfbG9uZ18xMDI0IDogZmZfc2luZV8xMDI0OworICAgIGNvbnN0IGZsb2F0ICpzd2luZG93ID0gaWNzLT51c2Vfa2Jfd2luZG93WzBdID8gZmZfYWFjX2tiZF9zaG9ydF8xMjggOiBmZl9zaW5lXzEyODsKKyAgICBpbnQgaTsKKyAgICBpbnQgbG9vcF9lbmQsIGxvb3BfZW5kMSwgbG9vcF9lbmQyOworICAgIGZsb2F0IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMTsKKworICAgIGlmIChpY3MtPndpbmRvd19zZXF1ZW5jZVswXSA9PSBFSUdIVF9TSE9SVF9TRVFVRU5DRSkgeworICAgICAgICBmbG9hdCAqYnVmID0gc2F2ZWQ7CisgICAgICAgIGZsb2F0ICpidWYwID0gc2F2ZWRfbHRwOworICAgICAgICBmbG9hdCAqcF9zYXZlZF9sdHAgPSBzYXZlZF9sdHAgKyA1NzY7CisgICAgICAgIGZsb2F0ICpwdHIxID0gJnNhdmVkX2x0cFs1MTJdOworICAgICAgICBmbG9hdCAqcHRyMiA9ICZhYy0+YnVmX21kY3RbMTAyM107CisgICAgICAgIGZsb2F0ICpwdHIzID0gKGZsb2F0Kikmc3dpbmRvd1s2M107CisgICAgICAgIGxvb3BfZW5kMSA9IChpbnQpKHBfc2F2ZWRfbHRwICsgNDQ4KTsKKworICAgICAgICAvKiBsb29wIHVucm9sbGVkIDggdGltZXMgKi8KKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAlW2xvb3BfZW5kXSwgICAlW3NyY10sICAgICAgICAgMjA0OCAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAwXSwgICAgICAwKCVbc3JjXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAxXSwgICAgICA0KCVbc3JjXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAyXSwgICAgICA4KCVbc3JjXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAzXSwgICAgICAxMiglW3NyY10pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXA0XSwgICAgICAxNiglW3NyY10pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXA1XSwgICAgICAyMCglW3NyY10pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXA2XSwgICAgICAyNCglW3NyY10pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXA3XSwgICAgICAyOCglW3NyY10pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAlW3NyY10sICAgICAgICAlW3NyY10sICAgICAgICAgMzIgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAwXSwgICAgICAwKCVbZHN0XSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAxXSwgICAgICA0KCVbZHN0XSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAyXSwgICAgICA4KCVbZHN0XSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAzXSwgICAgICAxMiglW2RzdF0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXA0XSwgICAgICAxNiglW2RzdF0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXA1XSwgICAgICAyMCglW2RzdF0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXA2XSwgICAgICAyNCglW2RzdF0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXA3XSwgICAgICAyOCglW2RzdF0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYm5lICAgICAlW3NyY10sICAgICAgICAlW2xvb3BfZW5kXSwgICAgMWIgICAgIFxuXHQiCisgICAgICAgICAgICAiIGFkZGl1ICAlW2RzdF0sICAgICAgICAlW2RzdF0sICAgICAgICAgMzIgICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwKKyAgICAgICAgICAgICAgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKSwgW3NyY10iK3IiKGJ1ZiksCisgICAgICAgICAgICAgIFtkc3RdIityIihidWYwKQorICAgICAgICAgICAgOgorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworCisgICAgICAgIC8qIGxvb3AgdW5yb2xsZWQgOCB0aW1lcyAqLworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJDAsICAgICAgICAgICAgICAwKCVbcF9zYXZlZF9sdHBdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJDAsICAgICAgICAgICAgICA0KCVbcF9zYXZlZF9sdHBdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJDAsICAgICAgICAgICAgICA4KCVbcF9zYXZlZF9sdHBdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJDAsICAgICAgICAgICAgICAxMiglW3Bfc2F2ZWRfbHRwXSkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJDAsICAgICAgICAgICAgICAxNiglW3Bfc2F2ZWRfbHRwXSkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJDAsICAgICAgICAgICAgICAyMCglW3Bfc2F2ZWRfbHRwXSkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJDAsICAgICAgICAgICAgICAyNCglW3Bfc2F2ZWRfbHRwXSkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgJDAsICAgICAgICAgICAgICAyOCglW3Bfc2F2ZWRfbHRwXSkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgJVtwX3NhdmVkX2x0cF0sICAlW3Bfc2F2ZWRfbHRwXSwgICAgIDMyICAgXG5cdCIKKyAgICAgICAgICAgICJibmUgICAgJVtwX3NhdmVkX2x0cF0sICAlW2xvb3BfZW5kMV0sICAgICAgIDFiICAgXG5cdCIKKworICAgICAgICAgICAgOiBbcF9zYXZlZF9sdHBdIityIihwX3NhdmVkX2x0cCkKKyAgICAgICAgICAgIDogW2xvb3BfZW5kMV0iciIobG9vcF9lbmQxKQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworCisgICAgICAgIGFjLT5mZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKHNhdmVkX2x0cCArIDQ0OCwgYWMtPmJ1Zl9tZGN0ICsgOTYwLCAgICAgJnN3aW5kb3dbNjRdLCAgICAgIDY0KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspeworICAgICAgICAgICAgLyogbG9vcCB1bnJvbGxlZCA0IHRpbWVzICovCisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAwXSwgICAgMCglW3B0cjJdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDFdLCAgICAtNCglW3B0cjJdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMl0sICAgIC04KCVbcHRyMl0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAzXSwgICAgLTEyKCVbcHRyMl0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgICAwKCVbcHRyM10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICAgIC00KCVbcHRyM10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA2XSwgICAgLTgoJVtwdHIzXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDddLCAgICAtMTIoJVtwdHIzXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wOF0sICAgICVbdGVtcDBdLCAgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVsLnMgICAlW3RlbXA5XSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXA1XSAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdWwucyAgICVbdGVtcDEwXSwgICAlW3RlbXAyXSwgICAgICVbdGVtcDZdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wMTFdLCAgICVbdGVtcDNdLCAgICAgJVt0ZW1wN10gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICAlW3RlbXA4XSwgICAgMCglW3B0cjFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDldLCAgICA0KCVbcHRyMV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3YzEgICAgJVt0ZW1wMTBdLCAgIDgoJVtwdHIxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICAlW3RlbXAxMV0sICAgMTIoJVtwdHIxXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICVbcHRyMV0sICAgICAlW3B0cjFdLCAgICAgIDE2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtwdHIyXSwgICAgICVbcHRyMl0sICAgICAgLTE2ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICAlW3B0cjNdLCAgICAgJVtwdHIzXSwgICAgICAtMTYgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgOiBbdGVtcDBdIj0mZiIodGVtcDApLCBbdGVtcDFdIj0mZiIodGVtcDEpLAorICAgICAgICAgICAgICAgICAgW3RlbXAyXSI9JmYiKHRlbXAyKSwgW3RlbXAzXSI9JmYiKHRlbXAzKSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wNF0iPSZmIih0ZW1wNCksIFt0ZW1wNV0iPSZmIih0ZW1wNSksCisgICAgICAgICAgICAgICAgICBbdGVtcDZdIj0mZiIodGVtcDYpLCBbdGVtcDddIj0mZiIodGVtcDcpLAorICAgICAgICAgICAgICAgICAgW3RlbXA4XSI9JmYiKHRlbXA4KSwgW3RlbXA5XSI9JmYiKHRlbXA5KSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wMTBdIj0mZiIodGVtcDEwKSwgW3RlbXAxMV0iPSZmIih0ZW1wMTEpLAorICAgICAgICAgICAgICAgICAgW3B0cjFdIityIihwdHIxKSwgW3B0cjJdIityIihwdHIyKSwgW3B0cjNdIityIihwdHIzKQorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpY3MtPndpbmRvd19zZXF1ZW5jZVswXSA9PSBMT05HX1NUQVJUX1NFUVVFTkNFKSB7CisgICAgICAgIGZsb2F0ICpidWZmMCA9IHNhdmVkOworICAgICAgICBmbG9hdCAqYnVmZjEgPSBzYXZlZF9sdHA7CisgICAgICAgIGZsb2F0ICpwdHIxID0gJnNhdmVkX2x0cFs1MTJdOworICAgICAgICBmbG9hdCAqcHRyMiA9ICZhYy0+YnVmX21kY3RbMTAyM107CisgICAgICAgIGZsb2F0ICpwdHIzID0gKGZsb2F0Kikmc3dpbmRvd1s2M107CisgICAgICAgIGxvb3BfZW5kID0gKGludCkoc2F2ZWQgKyA0NDgpOworCisgICAgICAgIC8qIGxvb3AgdW5yb2xsZWQgOCB0aW1lcyAqLworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICIuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDFdLCAgICA0KCVbc3JjXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDJdLCAgICA4KCVbc3JjXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDNdLCAgICAxMiglW3NyY10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDRdLCAgICAxNiglW3NyY10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDVdLCAgICAyMCglW3NyY10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDZdLCAgICAyNCglW3NyY10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDddLCAgICAyOCglW3NyY10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgMzIgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDFdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDJdLCAgICA4KCVbZHN0XSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDNdLCAgICAxMiglW2RzdF0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDRdLCAgICAxNiglW2RzdF0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDVdLCAgICAyMCglW2RzdF0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDZdLCAgICAyNCglW2RzdF0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDddLCAgICAyOCglW2RzdF0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICQwLCAgICAgICAgICAyMzA0KCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICQwLCAgICAgICAgICAyMzA4KCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICQwLCAgICAgICAgICAyMzEyKCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICQwLCAgICAgICAgICAyMzE2KCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICQwLCAgICAgICAgICAyMzIwKCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICQwLCAgICAgICAgICAyMzI0KCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICQwLCAgICAgICAgICAyMzI4KCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICQwLCAgICAgICAgICAyMzMyKCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJibmUgICAgICVbc3JjXSwgICAgICAlW2xvb3BfZW5kXSwgICAgMWIgICAgXG5cdCIKKyAgICAgICAgICAgICIgYWRkaXUgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgMzIgICAgXG5cdCIKKyAgICAgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgICAgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLAorICAgICAgICAgICAgICBbc3JjXSIrciIoYnVmZjApLCBbZHN0XSIrciIoYnVmZjEpCisgICAgICAgICAgICA6IFtsb29wX2VuZF0iciIobG9vcF9lbmQpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgICAgIGFjLT5mZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKHNhdmVkX2x0cCArIDQ0OCwgYWMtPmJ1Zl9tZGN0ICsgOTYwLCAgICAgJnN3aW5kb3dbNjRdLCAgICAgIDY0KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspeworICAgICAgICAgICAgLyogbG9vcCB1bnJvbGxlZCA4IHRpbWVzICovCisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAwXSwgICAgMCglW3B0cjJdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDFdLCAgICAtNCglW3B0cjJdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMl0sICAgIC04KCVbcHRyMl0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAzXSwgICAgLTEyKCVbcHRyMl0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgICAwKCVbcHRyM10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICAgIC00KCVbcHRyM10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA2XSwgICAgLTgoJVtwdHIzXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDddLCAgICAtMTIoJVtwdHIzXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wOF0sICAgICVbdGVtcDBdLCAgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVsLnMgICAlW3RlbXA5XSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXA1XSAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdWwucyAgICVbdGVtcDEwXSwgICAlW3RlbXAyXSwgICAgICVbdGVtcDZdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wMTFdLCAgICVbdGVtcDNdLCAgICAgJVt0ZW1wN10gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICAlW3RlbXA4XSwgICAgMCglW3B0cjFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDldLCAgICA0KCVbcHRyMV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3YzEgICAgJVt0ZW1wMTBdLCAgIDgoJVtwdHIxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICAlW3RlbXAxMV0sICAgMTIoJVtwdHIxXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICVbcHRyMV0sICAgICAlW3B0cjFdLCAgICAgIDE2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtwdHIyXSwgICAgICVbcHRyMl0sICAgICAgLTE2ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICAlW3B0cjNdLCAgICAgJVtwdHIzXSwgICAgICAtMTYgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgOiBbdGVtcDBdIj0mZiIodGVtcDApLCBbdGVtcDFdIj0mZiIodGVtcDEpLAorICAgICAgICAgICAgICAgICAgW3RlbXAyXSI9JmYiKHRlbXAyKSwgW3RlbXAzXSI9JmYiKHRlbXAzKSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wNF0iPSZmIih0ZW1wNCksIFt0ZW1wNV0iPSZmIih0ZW1wNSksCisgICAgICAgICAgICAgICAgICBbdGVtcDZdIj0mZiIodGVtcDYpLCBbdGVtcDddIj0mZiIodGVtcDcpLAorICAgICAgICAgICAgICAgICAgW3RlbXA4XSI9JmYiKHRlbXA4KSwgW3RlbXA5XSI9JmYiKHRlbXA5KSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wMTBdIj0mZiIodGVtcDEwKSwgW3RlbXAxMV0iPSZmIih0ZW1wMTEpLAorICAgICAgICAgICAgICAgICAgW3B0cjFdIityIihwdHIxKSwgW3B0cjJdIityIihwdHIyKSwgW3B0cjNdIityIihwdHIzKQorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gTE9OR19TVE9QIG9yIE9OTFlfTE9ORworICAgICAgICBmbG9hdCAqcHRyMSwgKnB0cjIsICpwdHIzOworICAgICAgICBhYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZShzYXZlZF9sdHAsICAgICAgIGFjLT5idWZfbWRjdCArIDUxMiwgICAgICZsd2luZG93WzUxMl0sICAgICA1MTIpOworCisgICAgICAgIHB0cjEgPSAmc2F2ZWRfbHRwWzUxMl07CisgICAgICAgIHB0cjIgPSAmYWMtPmJ1Zl9tZGN0WzEwMjNdOworICAgICAgICBwdHIzID0gKGZsb2F0KikmbHdpbmRvd1s1MTFdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1MTI7IGkrPTQpeworICAgICAgICAgICAgLyogbG9vcCB1bnJvbGxlZCA0IHRpbWVzICovCisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAwXSwgICAgMCglW3B0cjJdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDFdLCAgICAtNCglW3B0cjJdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMl0sICAgIC04KCVbcHRyMl0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAzXSwgICAgLTEyKCVbcHRyMl0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgICAwKCVbcHRyM10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICAgIC00KCVbcHRyM10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA2XSwgICAgLTgoJVtwdHIzXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDddLCAgICAtMTIoJVtwdHIzXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wOF0sICAgICVbdGVtcDBdLCAgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVsLnMgICAlW3RlbXA5XSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXA1XSAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdWwucyAgICVbdGVtcDEwXSwgICAlW3RlbXAyXSwgICAgICVbdGVtcDZdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wMTFdLCAgICVbdGVtcDNdLCAgICAgJVt0ZW1wN10gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICAlW3RlbXA4XSwgICAgMCglW3B0cjFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDldLCAgICA0KCVbcHRyMV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3YzEgICAgJVt0ZW1wMTBdLCAgIDgoJVtwdHIxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICAlW3RlbXAxMV0sICAgMTIoJVtwdHIxXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICVbcHRyMV0sICAgICAlW3B0cjFdLCAgICAgIDE2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtwdHIyXSwgICAgICVbcHRyMl0sICAgICAgLTE2ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICAlW3B0cjNdLCAgICAgJVtwdHIzXSwgICAgICAtMTYgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgOiBbdGVtcDBdIj0mZiIodGVtcDApLCBbdGVtcDFdIj0mZiIodGVtcDEpLAorICAgICAgICAgICAgICAgICAgW3RlbXAyXSI9JmYiKHRlbXAyKSwgW3RlbXAzXSI9JmYiKHRlbXAzKSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wNF0iPSZmIih0ZW1wNCksIFt0ZW1wNV0iPSZmIih0ZW1wNSksCisgICAgICAgICAgICAgICAgICBbdGVtcDZdIj0mZiIodGVtcDYpLCBbdGVtcDddIj0mZiIodGVtcDcpLAorICAgICAgICAgICAgICAgICAgW3RlbXA4XSI9JmYiKHRlbXA4KSwgW3RlbXA5XSI9JmYiKHRlbXA5KSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wMTBdIj0mZiIodGVtcDEwKSwgW3RlbXAxMV0iPSZmIih0ZW1wMTEpLAorICAgICAgICAgICAgICAgICAgW3B0cjFdIityIihwdHIxKSwgW3B0cjJdIityIihwdHIyKSwKKyAgICAgICAgICAgICAgICAgIFtwdHIzXSIrciIocHRyMykKKyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgZmxvYXQgKmJ1ZjEgPSBzY2UtPmx0cF9zdGF0ZSsxMDI0OworICAgICAgICBmbG9hdCAqYnVmMiA9IHNjZS0+bHRwX3N0YXRlOworICAgICAgICBmbG9hdCAqYnVmMyA9IHNjZS0+cmV0OworICAgICAgICBmbG9hdCAqYnVmNCA9IHNjZS0+bHRwX3N0YXRlKzEwMjQ7CisgICAgICAgIGZsb2F0ICpidWY1ID0gc2F2ZWRfbHRwOworICAgICAgICBmbG9hdCAqYnVmNiA9IHNjZS0+bHRwX3N0YXRlKzIwNDg7CisKKyAgICAgICAgLyogbG9vcHMgdW5yb2xsZWQgOCB0aW1lcyAqLworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICIuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAlW2xvb3BfZW5kXSwgICAlW3NyY10sICAgICAgICAgNDA5NiAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICVbbG9vcF9lbmQxXSwgICVbc3JjMV0sICAgICAgICA0MDk2ICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgJVtsb29wX2VuZDJdLCAgJVtzcmMyXSwgICAgICAgIDQwOTYgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDBdLCAgICAgIDAoJVtzcmNdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMV0sICAgICAgNCglW3NyY10pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAyXSwgICAgICA4KCVbc3JjXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDNdLCAgICAgIDEyKCVbc3JjXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNF0sICAgICAgMTYoJVtzcmNdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXA1XSwgICAgICAyMCglW3NyY10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDZdLCAgICAgIDI0KCVbc3JjXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wN10sICAgICAgMjgoJVtzcmNdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAlW3NyY10sICAgICAgICAlW3NyY10sICAgICAgICAgMzIgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDBdLCAgICAgIDAoJVtkc3RdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMV0sICAgICAgNCglW2RzdF0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAyXSwgICAgICA4KCVbZHN0XSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDNdLCAgICAgIDEyKCVbZHN0XSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNF0sICAgICAgMTYoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXA1XSwgICAgICAyMCglW2RzdF0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDZdLCAgICAgIDI0KCVbZHN0XSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wN10sICAgICAgMjgoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYm5lICAgICAlW3NyY10sICAgICAgICAlW2xvb3BfZW5kXSwgICAgMWIgICAgXG5cdCIKKyAgICAgICAgICAgICIgYWRkaXUgICVbZHN0XSwgICAgICAgICVbZHN0XSwgICAgICAgICAzMiAgICBcblx0IgorICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAwXSwgICAgICAwKCVbc3JjMV0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDFdLCAgICAgIDQoJVtzcmMxXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMl0sICAgICAgOCglW3NyYzFdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAzXSwgICAgICAxMiglW3NyYzFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDRdLCAgICAgIDE2KCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNV0sICAgICAgMjAoJVtzcmMxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXA2XSwgICAgICAyNCglW3NyYzFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDddLCAgICAgIDI4KCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgJVtzcmMxXSwgICAgICAgJVtzcmMxXSwgICAgICAgIDMyICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAwXSwgICAgICAwKCVbZHN0MV0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDFdLCAgICAgIDQoJVtkc3QxXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMl0sICAgICAgOCglW2RzdDFdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAzXSwgICAgICAxMiglW2RzdDFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDRdLCAgICAgIDE2KCVbZHN0MV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNV0sICAgICAgMjAoJVtkc3QxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXA2XSwgICAgICAyNCglW2RzdDFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDddLCAgICAgIDI4KCVbZHN0MV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImJuZSAgICAgJVtzcmMxXSwgICAgICAgJVtsb29wX2VuZDFdLCAgIDJiICAgIFxuXHQiCisgICAgICAgICAgICAiIGFkZGl1ICAlW2RzdDFdLCAgICAgICAlW2RzdDFdLCAgICAgICAgMzIgICAgXG5cdCIKKyAgICAgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMF0sICAgICAgMCglW3NyYzJdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAxXSwgICAgICA0KCVbc3JjMl0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDJdLCAgICAgIDgoJVtzcmMyXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wM10sICAgICAgMTIoJVtzcmMyXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXA0XSwgICAgICAxNiglW3NyYzJdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDVdLCAgICAgIDIwKCVbc3JjMl0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNl0sICAgICAgMjQoJVtzcmMyXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXA3XSwgICAgICAyOCglW3NyYzJdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICVbc3JjMl0sICAgICAgICVbc3JjMl0sICAgICAgICAzMiAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMF0sICAgICAgMCglW2RzdDJdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAxXSwgICAgICA0KCVbZHN0Ml0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDJdLCAgICAgIDgoJVtkc3QyXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wM10sICAgICAgMTIoJVtkc3QyXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXA0XSwgICAgICAxNiglW2RzdDJdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDVdLCAgICAgIDIwKCVbZHN0Ml0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNl0sICAgICAgMjQoJVtkc3QyXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXA3XSwgICAgICAyOCglW2RzdDJdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJibmUgICAgICVbc3JjMl0sICAgICAgICVbbG9vcF9lbmQyXSwgICAzYiAgICBcblx0IgorICAgICAgICAgICAgIiBhZGRpdSAgJVtkc3QyXSwgICAgICAgJVtkc3QyXSwgICAgICAgIDMyICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgICAgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLAorICAgICAgICAgICAgICBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpLCBbbG9vcF9lbmQxXSI9JnIiKGxvb3BfZW5kMSksCisgICAgICAgICAgICAgIFtsb29wX2VuZDJdIj0mciIobG9vcF9lbmQyKSwgW3NyY10iK3IiKGJ1ZjEpLAorICAgICAgICAgICAgICBbZHN0XSIrciIoYnVmMiksIFtzcmMxXSIrciIoYnVmMyksIFtkc3QxXSIrciIoYnVmNCksCisgICAgICAgICAgICAgIFtzcmMyXSIrciIoYnVmNSksIFtkc3QyXSIrciIoYnVmNikKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICB9Cit9CisjZW5kaWYgLyogSEFWRV9NSVBTRlBVICovCisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCisKK3ZvaWQgZmZfYWFjZGVjX2luaXRfbWlwcyhBQUNDb250ZXh0ICpjKQoreworI2lmIEhBVkVfSU5MSU5FX0FTTQorICAgIGMtPmltZGN0X2FuZF93aW5kb3dpbmcgICAgICAgICA9IGltZGN0X2FuZF93aW5kb3dpbmdfbWlwczsKKyAgICBjLT5hcHBseV9sdHAgICAgICAgICAgICAgICAgICAgPSBhcHBseV9sdHBfbWlwczsKKyNpZiBIQVZFX01JUFNGUFUKKyAgICBjLT51cGRhdGVfbHRwICAgICAgICAgICAgICAgICAgPSB1cGRhdGVfbHRwX21pcHM7CisjZW5kaWYgLyogSEFWRV9NSVBTRlBVICovCisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FhY2RlY19taXBzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FhY2RlY19taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhMzA3OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvYWFjZGVjX21pcHMuaApAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcnM6ICBEYXJrbyBMYXVzICAgICAgKGRhcmtvQG1pcHMuY29tKQorICogICAgICAgICAgIERqb3JkamUgUGVzdXQgICAoZGpvcmRqZUBtaXBzLmNvbSkKKyAqICAgICAgICAgICBNaXJqYW5hIFZ1bGluICAgKG12dWxpbkBtaXBzLmNvbSkKKyAqCisgKiBBQUMgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBkZWNvZGluZyBmdW5jdGlvbnMgb3B0aW1pemVkIGZvciBNSVBTCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJlZmVyZW5jZTogbGliYXZjb2RlYy9hYWNkZWMuYworICovCisKKyNpZm5kZWYgQVZDT0RFQ19NSVBTX0FBQ0RFQ19GTE9BVF9ICisjZGVmaW5lIEFWQ09ERUNfTUlQU19BQUNERUNfRkxPQVRfSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYWMuaCIKKworI2lmIEhBVkVfSU5MSU5FX0FTTSAmJiBIQVZFX01JUFNGUFUKK3N0YXRpYyBpbmxpbmUgZmxvYXQgKlZNVUwyX21pcHMoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnYsIHVuc2lnbmVkIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZSkKK3sKKyAgICBmbG9hdCB0ZW1wMCwgdGVtcDEsIHRlbXAyOworICAgIGludCB0ZW1wMywgdGVtcDQ7CisgICAgZmxvYXQgKnJldDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJhbmRpICAgICVbdGVtcDNdLCAgJVtpZHhdLCAgICAgICAxNSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImV4dCAgICAgJVt0ZW1wNF0sICAlW2lkeF0sICAgICAgIDQsICAgICAgNCAgICBcblx0IgorICAgICAgICAic2xsICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgMiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzbGwgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAgICAyICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wMl0sICAwKCVbc2NhbGVdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHd4YzEgICAlW3RlbXAwXSwgICVbdGVtcDNdKCVbdl0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd3hjMSAgICVbdGVtcDFdLCAgJVt0ZW1wNF0oJVt2XSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgICVbdGVtcDJdICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAgJVt0ZW1wMl0gICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICVbcmV0XSwgICAgJVtkc3RdLCAgICAgICA4ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wMF0sICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXAxXSwgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbdGVtcDBdIj0mZiIodGVtcDApLCBbdGVtcDFdIj0mZiIodGVtcDEpLAorICAgICAgICAgIFt0ZW1wMl0iPSZmIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3JldF0iPSZyIihyZXQpCisgICAgICAgIDogW2lkeF0iciIoaWR4KSwgW3NjYWxlXSJyIihzY2FsZSksIFt2XSJyIih2KSwKKyAgICAgICAgICBbZHN0XSJyIihkc3QpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgZmxvYXQgKlZNVUw0X21pcHMoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnYsIHVuc2lnbmVkIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZSkKK3sKKyAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgICAgZmxvYXQgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworICAgIGZsb2F0ICpyZXQ7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAiYW5kaSAgICAlW3RlbXAwXSwgICVbaWR4XSwgICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImV4dCAgICAgJVt0ZW1wMV0sICAlW2lkeF0sICAgICAgIDIsICAgICAgMiAgIFxuXHQiCisgICAgICAgICJleHQgICAgICVbdGVtcDJdLCAgJVtpZHhdLCAgICAgICA0LCAgICAgIDIgICBcblx0IgorICAgICAgICAiZXh0ICAgICAlW3RlbXAzXSwgICVbaWR4XSwgICAgICAgNiwgICAgICAyICAgXG5cdCIKKyAgICAgICAgInNsbCAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzbGwgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgICAyICAgICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAgMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNsbCAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgMCglW3NjYWxlXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHd4YzEgICAlW3RlbXA1XSwgICVbdGVtcDBdKCVbdl0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3eGMxICAgJVt0ZW1wNl0sICAlW3RlbXAxXSglW3ZdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd3hjMSAgICVbdGVtcDddLCAgJVt0ZW1wMl0oJVt2XSkgICAgICAgICAgICBcblx0IgorICAgICAgICAibHd4YzEgICAlW3RlbXA4XSwgICVbdGVtcDNdKCVbdl0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDZdLCAgJVt0ZW1wNl0sICAgICAlW3RlbXA0XSAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXA3XSwgICVbdGVtcDddLCAgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICVbcmV0XSwgICAgJVtkc3RdLCAgICAgICAxNiAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXA1XSwgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wNl0sICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICVbdGVtcDddLCAgOCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXA4XSwgIDEyKCVbZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICBbdGVtcDRdIj0mZiIodGVtcDQpLCBbdGVtcDVdIj0mZiIodGVtcDUpLAorICAgICAgICAgIFt0ZW1wNl0iPSZmIih0ZW1wNiksIFt0ZW1wN10iPSZmIih0ZW1wNyksCisgICAgICAgICAgW3RlbXA4XSI9JmYiKHRlbXA4KSwgW3JldF0iPSZyIihyZXQpCisgICAgICAgIDogW2lkeF0iciIoaWR4KSwgW3NjYWxlXSJyIihzY2FsZSksIFt2XSJyIih2KSwKKyAgICAgICAgICBbZHN0XSJyIihkc3QpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgZmxvYXQgKlZNVUwyU19taXBzKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICp2LCB1bnNpZ25lZCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2lnbiwgY29uc3QgZmxvYXQgKnNjYWxlKQoreworICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICAgIGZsb2F0IHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICAgIGZsb2F0ICpyZXQ7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAiYW5kaSAgICAlW3RlbXAwXSwgICVbaWR4XSwgICAgICAgMTUgICAgICAgICBcblx0IgorICAgICAgICAiZXh0ICAgICAlW3RlbXAxXSwgICVbaWR4XSwgICAgICAgNCwgICAgIDQgICBcblx0IgorICAgICAgICAibHcgICAgICAlW3RlbXA0XSwgIDAoJVtzY2FsZV0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3JsICAgICAlW3RlbXAyXSwgICVbc2lnbl0sICAgICAgMSAgICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICAlW3RlbXAzXSwgICVbc2lnbl0sICAgICAgMzEgICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAgMzEgICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAgMiAgICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAgMiAgICAgICAgICBcblx0IgorICAgICAgICAibHd4YzEgICAlW3RlbXA4XSwgICVbdGVtcDBdKCVbdl0pICAgICAgICAgICBcblx0IgorICAgICAgICAibHd4YzEgICAlW3RlbXA5XSwgICVbdGVtcDFdKCVbdl0pICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAlW3RlbXA1XSwgICVbdGVtcDRdLCAgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICAgICAieG9yICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICAgJVt0ZW1wM10gICBcblx0IgorICAgICAgICAibXRjMSAgICAlW3RlbXA1XSwgICVbdGVtcDZdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAlW3RlbXA0XSwgICVbdGVtcDddICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAgJVt0ZW1wNl0gICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXA5XSwgICVbdGVtcDldLCAgICAgJVt0ZW1wN10gICBcblx0IgorICAgICAgICAiYWRkaXUgICAlW3JldF0sICAgICVbZHN0XSwgICAgICAgOCAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXA4XSwgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXA5XSwgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICAgICAgW3RlbXA2XSI9JmYiKHRlbXA2KSwgW3RlbXA3XSI9JmYiKHRlbXA3KSwKKyAgICAgICAgICBbdGVtcDhdIj0mZiIodGVtcDgpLCBbdGVtcDldIj0mZiIodGVtcDkpLAorICAgICAgICAgIFtyZXRdIj0mciIocmV0KQorICAgICAgICA6IFtpZHhdInIiKGlkeCksIFtzY2FsZV0iciIoc2NhbGUpLCBbdl0iciIodiksCisgICAgICAgICAgW2RzdF0iciIoZHN0KSwgW3NpZ25dInIiKHNpZ24pCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgZmxvYXQgKlZNVUw0U19taXBzKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICp2LCB1bnNpZ25lZCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2lnbiwgY29uc3QgZmxvYXQgKnNjYWxlKQoreworICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgICAgZmxvYXQgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMTc7CisgICAgZmxvYXQgKnJldDsKKyAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDFVIDw8IDMxOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImx3ICAgICAgJVt0ZW1wMF0sICAgMCglW3NjYWxlXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAlW3RlbXAxXSwgICAlW2lkeF0sICAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgICAgICJleHQgICAgICVbdGVtcDJdLCAgICVbaWR4XSwgICAgICAgMiwgICAgICAyICAgXG5cdCIKKyAgICAgICAgImV4dCAgICAgJVt0ZW1wM10sICAgJVtpZHhdLCAgICAgICA0LCAgICAgIDIgICBcblx0IgorICAgICAgICAiZXh0ICAgICAlW3RlbXA0XSwgICAlW2lkeF0sICAgICAgIDYsICAgICAgMiAgIFxuXHQiCisgICAgICAgICJzbGwgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNsbCAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAyICAgICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzbGwgICAgICVbdGVtcDRdLCAgICVbdGVtcDRdLCAgICAgMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3eGMxICAgJVt0ZW1wMTBdLCAgJVt0ZW1wMV0oJVt2XSkgICAgICAgICAgICBcblx0IgorICAgICAgICAibHd4YzEgICAlW3RlbXAxMV0sICAlW3RlbXAyXSglW3ZdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd3hjMSAgICVbdGVtcDEyXSwgICVbdGVtcDNdKCVbdl0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3eGMxICAgJVt0ZW1wMTNdLCAgJVt0ZW1wNF0oJVt2XSkgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAlW3RlbXAxXSwgICAlW3NpZ25dLCAgICAgICVbbWFza10gICAgIFxuXHQiCisgICAgICAgICJleHQgICAgICVbdGVtcDJdLCAgICVbaWR4XSwgICAgICAgMTIsICAgICAxICAgXG5cdCIKKyAgICAgICAgImV4dCAgICAgJVt0ZW1wM10sICAgJVtpZHhdLCAgICAgICAxMywgICAgIDEgICBcblx0IgorICAgICAgICAiZXh0ICAgICAlW3RlbXA0XSwgICAlW2lkeF0sICAgICAgIDE0LCAgICAgMSAgIFxuXHQiCisgICAgICAgICJzbGx2ICAgICVbc2lnbl0sICAgICVbc2lnbl0sICAgICAgJVt0ZW1wMl0gICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMF0sICAgICAlW3RlbXAxXSAgICBcblx0IgorICAgICAgICAiYW5kICAgICAlW3RlbXAyXSwgICAlW3NpZ25dLCAgICAgICVbbWFza10gICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICVbdGVtcDFdLCAgICVbdGVtcDE0XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0sICAgICAlW3RlbXAyXSAgICBcblx0IgorICAgICAgICAic2xsdiAgICAlW3NpZ25dLCAgICAlW3NpZ25dLCAgICAgICVbdGVtcDNdICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICVbdGVtcDJdLCAgICVbdGVtcDE1XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgJVt0ZW1wM10sICAgJVtzaWduXSwgICAgICAlW21hc2tdICAgICBcblx0IgorICAgICAgICAic2xsdiAgICAlW3NpZ25dLCAgICAlW3NpZ25dLCAgICAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICVbdGVtcDNdLCAgICVbdGVtcDBdLCAgICAgJVt0ZW1wM10gICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgJVt0ZW1wNF0sICAgJVtzaWduXSwgICAgICAlW21hc2tdICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAlW3RlbXAzXSwgICAlW3RlbXAxNl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICVbdGVtcDRdLCAgICVbdGVtcDBdLCAgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMTddICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXAxMF0sICAlW3RlbXAxMF0sICAgICVbdGVtcDE0XSAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDExXSwgICVbdGVtcDExXSwgICAgJVt0ZW1wMTVdICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wMTJdLCAgJVt0ZW1wMTJdLCAgICAlW3RlbXAxNl0gICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXAxM10sICAlW3RlbXAxM10sICAgICVbdGVtcDE3XSAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICVbcmV0XSwgICAgICVbZHN0XSwgICAgICAgMTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wMTBdLCAgMCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXAxMV0sICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICVbdGVtcDEyXSwgIDgoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wMTNdLCAgMTIoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wMTBdIj0mZiIodGVtcDEwKSwKKyAgICAgICAgICBbdGVtcDExXSI9JmYiKHRlbXAxMSksIFt0ZW1wMTJdIj0mZiIodGVtcDEyKSwKKyAgICAgICAgICBbdGVtcDEzXSI9JmYiKHRlbXAxMyksIFt0ZW1wMTRdIj0mZiIodGVtcDE0KSwKKyAgICAgICAgICBbdGVtcDE1XSI9JmYiKHRlbXAxNSksIFt0ZW1wMTZdIj0mZiIodGVtcDE2KSwKKyAgICAgICAgICBbdGVtcDE3XSI9JmYiKHRlbXAxNyksIFtyZXRdIj0mciIocmV0KSwKKyAgICAgICAgICBbc2lnbl0iK3IiKHNpZ24pCisgICAgICAgIDogW2lkeF0iciIoaWR4KSwgW3NjYWxlXSJyIihzY2FsZSksIFt2XSJyIih2KSwKKyAgICAgICAgICBbZHN0XSJyIihkc3QpLCBbbWFza10iciIobWFzaykKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBWTVVMMiBWTVVMMl9taXBzCisjZGVmaW5lIFZNVUw0IFZNVUw0X21pcHMKKyNkZWZpbmUgVk1VTDJTIFZNVUwyU19taXBzCisjZGVmaW5lIFZNVUw0UyBWTVVMNFNfbWlwcworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAmJiBIQVZFX01JUFNGUFUgKi8KKworI2VuZGlmIC8qIEFWQ09ERUNfTUlQU19BQUNERUNfRkxPQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hYWNwc2RzcF9taXBzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FhY3BzZHNwX21pcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzMwYTdmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hYWNwc2RzcF9taXBzLmMKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIKKyAqICAgICAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIENhbGlmb3JuaWEuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3JzOiAgRGFya28gTGF1cyAgICAgIChkYXJrb0BtaXBzLmNvbSkKKyAqICAgICAgICAgICBEam9yZGplIFBlc3V0ICAgKGRqb3JkamVAbWlwcy5jb20pCisgKiAgICAgICAgICAgTWlyamFuYSBWdWxpbiAgIChtdnVsaW5AbWlwcy5jb20pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJlZmVyZW5jZTogbGliYXZjb2RlYy9hYWNwc2RzcC5jCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYWFjcHNkc3AuaCIKKworI2lmIEhBVkVfSU5MSU5FX0FTTQorc3RhdGljIHZvaWQgcHNfaHlicmlkX2FuYWx5c2lzX2lsZWF2ZV9taXBzKGZsb2F0ICgqb3V0KVszMl1bMl0sIGZsb2F0IExbMl1bMzhdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGxlbikKK3sKKyAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgICAgaW50IHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworICAgIGZsb2F0ICpvdXQxPSZvdXRbaV1bMF1bMF07CisgICAgZmxvYXQgKkwxPSZMWzBdWzBdW2ldOworICAgIGZsb2F0ICpqPW91dDErIGxlbioyOworCisgICAgZm9yICg7IGkgPCA2NDsgaSsrKSB7CisKKyAgICAgICAgLyogbG9vcCB1bnJvbGxlZCA4IHRpbWVzICovCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMF0sICAgMCglW0wxXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMV0sICAgOTcyOCglW0wxXSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMl0sICAgMjU2KCVbTDFdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wM10sICAgOTk4NCglW0wxXSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNF0sICAgNTEyKCVbTDFdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNV0sICAgMTAyNDAoJVtMMV0pICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNl0sICAgNzY4KCVbTDFdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wN10sICAgMTA0OTYoJVtMMV0pICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMF0sICAgMCglW291dDFdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMV0sICAgNCglW291dDFdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMl0sICAgOCglW291dDFdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wM10sICAgMTIoJVtvdXQxXSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNF0sICAgMTYoJVtvdXQxXSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNV0sICAgMjAoJVtvdXQxXSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNl0sICAgMjQoJVtvdXQxXSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wN10sICAgMjgoJVtvdXQxXSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgJVtvdXQxXSwgICAgJVtvdXQxXSwgICAgICAzMiAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgJVtMMV0sICAgICAgJVtMMV0sICAgICAgICAxMDI0ICBcblx0IgorICAgICAgICAgICAgImJuZSAgICAgJVtvdXQxXSwgICAgJVtqXSwgICAgICAgICAxYiAgICBcblx0IgorCisgICAgICAgICAgICA6IFtvdXQxXSIrciIob3V0MSksIFtMMV0iK3IiKEwxKSwgW2pdIityIihqKSwKKyAgICAgICAgICAgICAgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KQorICAgICAgICAgICAgOiBbbGVuXSJyIihsZW4pCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgICAgIG91dDEtPShsZW48PDEpLTY0OworICAgICAgICBMMS09KGxlbjw8NiktMTsKKyAgICAgICAgais9bGVuKjI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwc19oeWJyaWRfc3ludGhlc2lzX2RlaW50X21pcHMoZmxvYXQgb3V0WzJdWzM4XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKCppbilbMzJdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgbGVuKQoreworICAgIGludCBuOworICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgICAgZmxvYXQgKm91dDEgPSAoZmxvYXQqKW91dCArIGk7CisgICAgZmxvYXQgKm91dDIgPSAoZmxvYXQqKW91dCArIDI0MzIgKyBpOworICAgIGZsb2F0ICppbjEgPSAoZmxvYXQqKWluICsgNjQgKiBpOworICAgIGZsb2F0ICppbjIgPSAoZmxvYXQqKWluICsgNjQgKiBpICsgMTsKKworICAgIGZvciAoOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgNzsgbisrKSB7CisKKyAgICAgICAgICAgIC8qIGxvb3AgdW5yb2xsZWQgOCB0aW1lcyAqLworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDBdLCAgIDAoJVtpbjFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDFdLCAgIDAoJVtpbjJdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDJdLCAgIDgoJVtpbjFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDNdLCAgIDgoJVtpbjJdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDRdLCAgIDE2KCVbaW4xXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDVdLCAgIDE2KCVbaW4yXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDZdLCAgIDI0KCVbaW4xXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDddLCAgIDI0KCVbaW4yXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJhZGRpdSAgICVbb3V0MV0sICAgICVbb3V0MV0sICAgICAgICAgMTAyNCAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJhZGRpdSAgICVbb3V0Ml0sICAgICVbb3V0Ml0sICAgICAgICAgMTAyNCAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJhZGRpdSAgICVbaW4xXSwgICAgICVbaW4xXSwgICAgICAgICAgMzIgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJhZGRpdSAgICVbaW4yXSwgICAgICVbaW4yXSwgICAgICAgICAgMzIgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDBdLCAgIC0xMDI0KCVbb3V0MV0pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDFdLCAgIC0xMDI0KCVbb3V0Ml0pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDJdLCAgIC03NjgoJVtvdXQxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDNdLCAgIC03NjgoJVtvdXQyXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDRdLCAgIC01MTIoJVtvdXQxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDVdLCAgIC01MTIoJVtvdXQyXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDZdLCAgIC0yNTYoJVtvdXQxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDddLCAgIC0yNTYoJVtvdXQyXSkgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgICAgICAgICAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgICAgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgICAgICAgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLAorICAgICAgICAgICAgICAgICAgIFtvdXQxXSIrciIob3V0MSksIFtvdXQyXSIrciIob3V0MiksCisgICAgICAgICAgICAgICAgICAgW2luMV0iK3IiKGluMSksIFtpbjJdIityIihpbjIpCisgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICAvKiBsb29wIHVucm9sbGVkIDggdGltZXMgKi8KKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAwXSwgICAwKCVbaW4xXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMV0sICAgMCglW2luMl0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDJdLCAgIDgoJVtpbjFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAzXSwgICA4KCVbaW4yXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNF0sICAgMTYoJVtpbjFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDVdLCAgIDE2KCVbaW4yXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXA2XSwgICAyNCglW2luMV0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wN10sICAgMjQoJVtpbjJdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICVbb3V0MV0sICAgICVbb3V0MV0sICAgICAgICAtNzE2NCAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAlW291dDJdLCAgICAlW291dDJdLCAgICAgICAgLTcxNjQgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgJVtpbjFdLCAgICAgJVtpbjFdLCAgICAgICAgIDMyICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICVbaW4yXSwgICAgICVbaW4yXSwgICAgICAgICAzMiAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAwXSwgICA3MTY0KCVbb3V0MV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMV0sICAgNzE2NCglW291dDJdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDJdLCAgIDc0MjAoJVtvdXQxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAzXSwgICA3NDIwKCVbb3V0Ml0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNF0sICAgNzY3NiglW291dDFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDVdLCAgIDc2NzYoJVtvdXQyXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXA2XSwgICA3OTMyKCVbb3V0MV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wN10sICAgNzkzMiglW291dDJdKSAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgICAgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLAorICAgICAgICAgICAgICBbb3V0MV0iK3IiKG91dDEpLCBbb3V0Ml0iK3IiKG91dDIpLAorICAgICAgICAgICAgICBbaW4xXSIrciIoaW4xKSwgW2luMl0iK3IiKGluMikKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICB9Cit9CisKKyNpZiBIQVZFX01JUFNGUFUKK3N0YXRpYyB2b2lkIHBzX2FkZF9zcXVhcmVzX21pcHMoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKCpzcmMpWzJdLCBpbnQgbikKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICAgIGZsb2F0IHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMTsKKyAgICBmbG9hdCAqc3JjMCA9IChmbG9hdCopJnNyY1swXVswXTsKKyAgICBmbG9hdCAqZHN0MCA9ICZkc3RbMF07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIC8qIGxvb3AgdW5yb2xsZWQgNCB0aW1lcyAqLworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXAwXSwgICAgMCglW3NyYzBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXAxXSwgICAgNCglW3NyYzBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXAyXSwgICAgOCglW3NyYzBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXAzXSwgICAgMTIoJVtzcmMwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXA0XSwgICAgMTYoJVtzcmMwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXA1XSwgICAgMjAoJVtzcmMwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXA2XSwgICAgMjQoJVtzcmMwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXA3XSwgICAgMjgoJVtzcmMwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXA4XSwgICAgMCglW2RzdDBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXA5XSwgICAgNCglW2RzdDBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXAxMF0sICAgOCglW2RzdDBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXAxMV0sICAgMTIoJVtkc3QwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNV0sICAgICVbdGVtcDVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICAlW3RlbXA3XSwgICAgJVt0ZW1wN10sICAgICVbdGVtcDddICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0sICAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10sICAgICVbdGVtcDJdLCAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0sICAgICVbdGVtcDRdLCAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICAlW3RlbXA2XSwgICAgJVt0ZW1wN10sICAgICVbdGVtcDZdLCAgICVbdGVtcDZdICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAgICAlW3RlbXAwXSwgICAgJVt0ZW1wOF0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAgICAlW3RlbXAyXSwgICAgJVt0ZW1wOV0sICAgICVbdGVtcDJdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDRdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAgICAlW3RlbXA2XSwgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDZdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzd2MxICAgICAlW3RlbXAwXSwgICAgMCglW2RzdDBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzd2MxICAgICAlW3RlbXAyXSwgICAgNCglW2RzdDBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzd2MxICAgICAlW3RlbXA0XSwgICAgOCglW2RzdDBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzd2MxICAgICAlW3RlbXA2XSwgICAgMTIoJVtkc3QwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICAlW2RzdDBdLCAgICAgJVtkc3QwXSwgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICAlW3NyYzBdLCAgICAgJVtzcmMwXSwgICAgIDMyICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbdGVtcDBdIj0mZiIodGVtcDApLCBbdGVtcDFdIj0mZiIodGVtcDEpLCBbdGVtcDJdIj0mZiIodGVtcDIpLAorICAgICAgICAgICAgICBbdGVtcDNdIj0mZiIodGVtcDMpLCBbdGVtcDRdIj0mZiIodGVtcDQpLCBbdGVtcDVdIj0mZiIodGVtcDUpLAorICAgICAgICAgICAgICBbdGVtcDZdIj0mZiIodGVtcDYpLCBbdGVtcDddIj0mZiIodGVtcDcpLCBbdGVtcDhdIj0mZiIodGVtcDgpLAorICAgICAgICAgICAgICBbdGVtcDldIj0mZiIodGVtcDkpLCBbZHN0MF0iK3IiKGRzdDApLCBbc3JjMF0iK3IiKHNyYzApLAorICAgICAgICAgICAgICBbdGVtcDEwXSI9JmYiKHRlbXAxMCksIFt0ZW1wMTFdIj0mZiIodGVtcDExKQorICAgICAgICAgICAgOgorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgfQorfQorCitzdGF0aWMgdm9pZCBwc19tdWxfcGFpcl9zaW5nbGVfbWlwcyhmbG9hdCAoKmRzdClbMl0sIGZsb2F0ICgqc3JjMClbMl0sIGZsb2F0ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4pCit7CisgICAgZmxvYXQgdGVtcDAsIHRlbXAxLCB0ZW1wMjsKKyAgICBmbG9hdCAqcF9kLCAqcF9zMCwgKnBfczEsICplbmQ7CisgICAgcF9kID0gJmRzdFswXVswXTsKKyAgICBwX3MwID0gJnNyYzBbMF1bMF07CisgICAgcF9zMSA9ICZzcmMxWzBdOworICAgIGVuZCA9IHBfczEgKyBuOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDJdLCAgIDAoJVtwX3MxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDBdLCAgIDAoJVtwX3MwXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDFdLCAgIDQoJVtwX3MwXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbcF9kXSwgICAgICVbcF9kXSwgICAgICAgOCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAgJVt0ZW1wMl0gICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMl0gICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbcF9zMF0sICAgICVbcF9zMF0sICAgICAgOCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDBdLCAgIC04KCVbcF9kXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDFdLCAgIC00KCVbcF9kXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICAgICVbcF9zMV0sICAgICVbZW5kXSwgICAgICAgMWIgICAgICAgICAgXG5cdCIKKyAgICAgICAgIiBhZGRpdSAgICVbcF9zMV0sICAgICVbcF9zMV0sICAgICAgNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFt0ZW1wMF0iPSZmIih0ZW1wMCksIFt0ZW1wMV0iPSZmIih0ZW1wMSksCisgICAgICAgICAgW3RlbXAyXSI9JmYiKHRlbXAyKSwgW3BfZF0iK3IiKHBfZCksCisgICAgICAgICAgW3BfczBdIityIihwX3MwKSwgW3BfczFdIityIihwX3MxKQorICAgICAgICA6IFtlbmRdInIiKGVuZCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkIHBzX2RlY29ycmVsYXRlX21pcHMoZmxvYXQgKCpvdXQpWzJdLCBmbG9hdCAoKmRlbGF5KVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKCphcF9kZWxheSlbUFNfUU1GX1RJTUVfU0xPVFMgKyBQU19NQVhfQVBfREVMQVldWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBwaGlfZnJhY3RbMl0sIGZsb2F0ICgqUV9mcmFjdClbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICp0cmFuc2llbnRfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ19kZWNheV9zbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKK3sKKyAgICBmbG9hdCAqcF9kZWxheSA9ICZkZWxheVswXVswXTsKKyAgICBmbG9hdCAqcF9vdXQgPSAmb3V0WzBdWzBdOworICAgIGZsb2F0ICpwX2FwX2RlbGF5ID0gJmFwX2RlbGF5WzBdWzBdWzBdOworICAgIGZsb2F0ICpwX3RfZ2FpbiA9IChmbG9hdCopdHJhbnNpZW50X2dhaW47CisgICAgZmxvYXQgKnBfUV9mcmFjdCA9ICZRX2ZyYWN0WzBdWzBdOworICAgIGZsb2F0IGFnMCwgYWcxLCBhZzI7CisgICAgZmxvYXQgcGhpX2ZyYWN0MCA9IHBoaV9mcmFjdFswXTsKKyAgICBmbG9hdCBwaGlfZnJhY3QxID0gcGhpX2ZyYWN0WzFdOworICAgIGZsb2F0IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworCisgICAgbGVuID0gKGludCkoKGludCopcF9kZWxheSArIChsZW4gPDwgMSkpOworCisgICAgLyogbWVyZ2VkIDIgbG9vcHMgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAiLnNldCAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIuc2V0ICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpLnMgICAgJVthZzBdLCAgICAgICAgMC42NTE0MzkwNTc1MzEwNiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkucyAgICAlW2FnMV0sICAgICAgICAwLjU2NDcxODEyMjAwNzc2ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaS5zICAgICVbYWcyXSwgICAgICAgIDAuNDg5NTQxNjU5NTU2OTUgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVthZzBdLCAgICAgICAgJVthZzBdLCAgICAgICAgJVtnX2RlY2F5X3Nsb3BlXSAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW2FnMV0sICAgICAgICAlW2FnMV0sICAgICAgICAlW2dfZGVjYXlfc2xvcGVdICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbYWcyXSwgICAgICAgICVbYWcyXSwgICAgICAgICVbZ19kZWNheV9zbG9wZV0gICAgICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXAwXSwgICAgICAwKCVbcF9kZWxheV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICVbdGVtcDFdLCAgICAgIDQoJVtwX2RlbGF5XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wNF0sICAgICAgMTYoJVtwX2FwX2RlbGF5XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXA1XSwgICAgICAyMCglW3BfYXBfZGVsYXldKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDNdLCAgICAgICVbdGVtcDBdLCAgICAgICVbcGhpX2ZyYWN0MV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wNl0sICAgICAgMCglW3BfUV9mcmFjdF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXAyXSwgICAgICAlW3RlbXAxXSwgICAgICAlW3BoaV9mcmFjdDFdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICVbdGVtcDddLCAgICAgIDQoJVtwX1FfZnJhY3RdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgJVt0ZW1wM10sICAgICAgJVt0ZW1wM10sICAgICAgJVt0ZW1wMV0sICVbcGhpX2ZyYWN0MF0gICBcblx0IgorICAgICAgICAibXN1Yi5zICAlW3RlbXAyXSwgICAgICAlW3RlbXAyXSwgICAgICAlW3RlbXAwXSwgJVtwaGlfZnJhY3QwXSAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDhdLCAgICAgICVbdGVtcDVdLCAgICAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wOV0sICAgICAgJVt0ZW1wNF0sICAgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXA3XSwgICAgICAxMiglW3BfUV9mcmFjdF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDBdLCAgICAgICVbYWcwXSwgICAgICAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wMV0sICAgICAgJVthZzBdLCAgICAgICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1Yi5zICAlW3RlbXA4XSwgICAgICAlW3RlbXA4XSwgICAgICAlW3RlbXA0XSwgJVt0ZW1wNl0gICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgICAgIDMwNCglW3BfYXBfZGVsYXldKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgJVt0ZW1wOV0sICAgICAgJVt0ZW1wOV0sICAgICAgJVt0ZW1wNV0sICVbdGVtcDZdICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXA1XSwgICAgICAzMDgoJVtwX2FwX2RlbGF5XSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICVbdGVtcDBdLCAgICAgICVbdGVtcDhdLCAgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgJVt0ZW1wMV0sICAgICAgJVt0ZW1wOV0sICAgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXAyXSwgICAgICAlW3RlbXAyXSwgICAgICAlW2FnMF0sICAgJVt0ZW1wMF0gICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICVbdGVtcDZdLCAgICAgIDgoJVtwX1FfZnJhY3RdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgJVt0ZW1wM10sICAgICAgJVt0ZW1wM10sICAgICAgJVthZzBdLCAgICVbdGVtcDFdICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXA4XSwgICAgICAlW3RlbXA1XSwgICAgICAlW3RlbXA3XSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDldLCAgICAgICVbdGVtcDRdLCAgICAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wN10sICAgICAgMjAoJVtwX1FfZnJhY3RdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1Yi5zICAlW3RlbXA4XSwgICAgICAlW3RlbXA4XSwgICAgICAlW3RlbXA0XSwgJVt0ZW1wNl0gICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICVbdGVtcDJdLCAgICAgIDQwKCVbcF9hcF9kZWxheV0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wMl0sICAgICAgJVthZzFdLCAgICAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXAzXSwgICAgICA0NCglW3BfYXBfZGVsYXldKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDNdLCAgICAgICVbYWcxXSwgICAgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wNF0sICAgICAgNTkyKCVbcF9hcF9kZWxheV0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXA5XSwgICAgICAlW3RlbXA5XSwgICAgICAlW3RlbXA1XSwgJVt0ZW1wNl0gICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICVbdGVtcDVdLCAgICAgIDU5NiglW3BfYXBfZGVsYXldKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgJVt0ZW1wMl0sICAgICAgJVt0ZW1wOF0sICAgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAlW3RlbXAzXSwgICAgICAlW3RlbXA5XSwgICAgICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICVbdGVtcDZdLCAgICAgIDE2KCVbcF9RX2ZyYWN0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgJVt0ZW1wMF0sICAgICAgJVt0ZW1wMF0sICAgICAgJVthZzFdLCAgICVbdGVtcDJdICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXAxXSwgICAgICAlW3RlbXAxXSwgICAgICAlW2FnMV0sICAgJVt0ZW1wM10gICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDhdLCAgICAgICVbdGVtcDVdLCAgICAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wOV0sICAgICAgJVt0ZW1wNF0sICAgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1Yi5zICAlW3RlbXA4XSwgICAgICAlW3RlbXA4XSwgICAgICAlW3RlbXA0XSwgJVt0ZW1wNl0gICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICVbdGVtcDldLCAgICAgICVbdGVtcDldLCAgICAgICVbdGVtcDVdLCAlW3RlbXA2XSAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wMF0sICAgICAgMzM2KCVbcF9hcF9kZWxheV0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXAwXSwgICAgICAlW2FnMl0sICAgICAgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICVbdGVtcDFdLCAgICAgIDM0MCglW3BfYXBfZGVsYXldKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wMV0sICAgICAgJVthZzJdLCAgICAgICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXA0XSwgICAgICAwKCVbcF90X2dhaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICVbdGVtcDBdLCAgICAgICVbdGVtcDhdLCAgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgJVtwX2FwX2RlbGF5XSwgJVtwX2FwX2RlbGF5XSwgOCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAlW3RlbXAxXSwgICAgICAlW3RlbXA5XSwgICAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICVbcF90X2dhaW5dLCAgICVbcF90X2dhaW5dLCAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgJVt0ZW1wMl0sICAgICAgJVt0ZW1wMl0sICAgICAgJVthZzJdLCAgICVbdGVtcDBdICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAlW3BfZGVsYXldLCAgICAlW3BfZGVsYXldLCAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICVbdGVtcDNdLCAgICAgICVbdGVtcDNdLCAgICAgICVbYWcyXSwgICAlW3RlbXAxXSAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgJVtwX291dF0sICAgICAgJVtwX291dF0sICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXA1XSwgICAgICAlW3RlbXA0XSwgICAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDZdLCAgICAgICVbdGVtcDRdLCAgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wMl0sICAgICAgNjI0KCVbcF9hcF9kZWxheV0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXAzXSwgICAgICA2MjgoJVtwX2FwX2RlbGF5XSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICVbdGVtcDVdLCAgICAgIC04KCVbcF9vdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wNl0sICAgICAgLTQoJVtwX291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICAlW3BfZGVsYXldLCAgICAlW2xlbl0sICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIgc3djMSAgICVbdGVtcDZdLCAgICAgIC00KCVbcF9vdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIi5zZXQgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW3RlbXAwXSI9JmYiKHRlbXAwKSwgW3RlbXAxXSI9JmYiKHRlbXAxKSwgW3RlbXAyXSI9JmYiKHRlbXAyKSwKKyAgICAgICAgICBbdGVtcDNdIj0mZiIodGVtcDMpLCBbdGVtcDRdIj0mZiIodGVtcDQpLCBbdGVtcDVdIj0mZiIodGVtcDUpLAorICAgICAgICAgIFt0ZW1wNl0iPSZmIih0ZW1wNiksIFt0ZW1wN10iPSZmIih0ZW1wNyksIFt0ZW1wOF0iPSZmIih0ZW1wOCksCisgICAgICAgICAgW3RlbXA5XSI9JmYiKHRlbXA5KSwgW3BfZGVsYXldIityIihwX2RlbGF5KSwgW3BfYXBfZGVsYXldIityIihwX2FwX2RlbGF5KSwKKyAgICAgICAgICBbcF9RX2ZyYWN0XSIrciIocF9RX2ZyYWN0KSwgW3BfdF9nYWluXSIrciIocF90X2dhaW4pLCBbcF9vdXRdIityIihwX291dCksCisgICAgICAgICAgW2FnMF0iPSZmIihhZzApLCBbYWcxXSI9JmYiKGFnMSksIFthZzJdIj0mZiIoYWcyKQorICAgICAgICA6IFtwaGlfZnJhY3QwXSJmIihwaGlfZnJhY3QwKSwgW3BoaV9mcmFjdDFdImYiKHBoaV9mcmFjdDEpLAorICAgICAgICAgIFtsZW5dInIiKGxlbiksIFtnX2RlY2F5X3Nsb3BlXSJmIihnX2RlY2F5X3Nsb3BlKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKworc3RhdGljIHZvaWQgcHNfc3RlcmVvX2ludGVycG9sYXRlX21pcHMoZmxvYXQgKCpsKVsyXSwgZmxvYXQgKCpyKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhbMl1bNF0sIGZsb2F0IGhfc3RlcFsyXVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgZmxvYXQgaDAgPSBoWzBdWzBdOworICAgIGZsb2F0IGgxID0gaFswXVsxXTsKKyAgICBmbG9hdCBoMiA9IGhbMF1bMl07CisgICAgZmxvYXQgaDMgPSBoWzBdWzNdOworICAgIGZsb2F0IGhzMCA9IGhfc3RlcFswXVswXTsKKyAgICBmbG9hdCBoczEgPSBoX3N0ZXBbMF1bMV07CisgICAgZmxvYXQgaHMyID0gaF9zdGVwWzBdWzJdOworICAgIGZsb2F0IGhzMyA9IGhfc3RlcFswXVszXTsKKyAgICBmbG9hdCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgICBmbG9hdCBsX3JlLCBsX2ltLCByX3JlLCByX2ltOworCisgICAgbGVuID0gKGludCkoKGludCopbCArIChsZW4gPDwgMSkpOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIi5zZXQgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiLnNldCAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgJVtoMF0sICAgICAlW2gwXSwgICAgICVbaHMwXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW2xfcmVdLCAgIDAoJVtsXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICVbaDFdLCAgICAgJVtoMV0sICAgICAlW2hzMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVtyX3JlXSwgICAwKCVbcl0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAlW2gyXSwgICAgICVbaDJdLCAgICAgJVtoczJdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICVbbF9pbV0sICAgNCglW2xdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgJVtoM10sICAgICAlW2gzXSwgICAgICVbaHMzXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3JfaW1dLCAgIDQoJVtyXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDBdLCAgJVtoMF0sICAgICAlW2xfcmVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgJVtsXSwgICAgICAlW2xdLCAgICAgIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXAyXSwgICVbaDFdLCAgICAgJVtsX3JlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICVbcl0sICAgICAgJVtyXSwgICAgICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICVbaDJdLCAgICVbcl9yZV0gICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgJVtoM10sICAgJVtyX3JlXSAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDFdLCAgJVtoMF0sICAgICAlW2xfaW1dICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wM10sICAlW2gxXSwgICAgICVbbF9pbV0gICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgJVtoMl0sICAgJVtyX2ltXSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAlW2gzXSwgICAlW3JfaW1dICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wMF0sICAtOCglW2xdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXAyXSwgIC04KCVbcl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICVbdGVtcDFdLCAgLTQoJVtsXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICAgJVtsXSwgICAgICAlW2xlbl0sICAgIDFiICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiIHN3YzEgICAlW3RlbXAzXSwgIC00KCVbcl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIuc2V0ICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFt0ZW1wMF0iPSZmIih0ZW1wMCksIFt0ZW1wMV0iPSZmIih0ZW1wMSksCisgICAgICAgICAgW3RlbXAyXSI9JmYiKHRlbXAyKSwgW3RlbXAzXSI9JmYiKHRlbXAzKSwKKyAgICAgICAgICBbaDBdIitmIihoMCksIFtoMV0iK2YiKGgxKSwgW2gyXSIrZiIoaDIpLAorICAgICAgICAgIFtoM10iK2YiKGgzKSwgW2xdIityIihsKSwgW3JdIityIihyKSwKKyAgICAgICAgICBbbF9yZV0iPSZmIihsX3JlKSwgW2xfaW1dIj0mZiIobF9pbSksCisgICAgICAgICAgW3JfcmVdIj0mZiIocl9yZSksIFtyX2ltXSI9JmYiKHJfaW0pCisgICAgICAgIDogW2hzMF0iZiIoaHMwKSwgW2hzMV0iZiIoaHMxKSwgW2hzMl0iZiIoaHMyKSwKKyAgICAgICAgICBbaHMzXSJmIihoczMpLCBbbGVuXSJyIihsZW4pCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorI2VuZGlmIC8qIEhBVkVfTUlQU0ZQVSAqLworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCit2b2lkIGZmX3BzZHNwX2luaXRfbWlwcyhQU0RTUENvbnRleHQgKnMpCit7CisjaWYgSEFWRV9JTkxJTkVfQVNNCisgICAgcy0+aHlicmlkX2FuYWx5c2lzX2lsZWF2ZSA9IHBzX2h5YnJpZF9hbmFseXNpc19pbGVhdmVfbWlwczsKKyAgICBzLT5oeWJyaWRfc3ludGhlc2lzX2RlaW50ID0gcHNfaHlicmlkX3N5bnRoZXNpc19kZWludF9taXBzOworI2lmIEhBVkVfTUlQU0ZQVQorICAgIHMtPmFkZF9zcXVhcmVzICAgICAgICAgICAgPSBwc19hZGRfc3F1YXJlc19taXBzOworICAgIHMtPm11bF9wYWlyX3NpbmdsZSAgICAgICAgPSBwc19tdWxfcGFpcl9zaW5nbGVfbWlwczsKKyAgICBzLT5kZWNvcnJlbGF0ZSAgICAgICAgICAgID0gcHNfZGVjb3JyZWxhdGVfbWlwczsKKyAgICBzLT5zdGVyZW9faW50ZXJwb2xhdGVbMF0gID0gcHNfc3RlcmVvX2ludGVycG9sYXRlX21pcHM7CisjZW5kaWYgLyogSEFWRV9NSVBTRlBVICovCisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FhY3BzeV9taXBzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FhY3BzeV9taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzNTNjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvYWFjcHN5X21pcHMuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogIEJvamFuIFppdmtvdmljICAgKGJvamFuQG1pcHMuY29tKQorICoKKyAqIEFBQyBlbmNvZGVyIHBzeWNob2Fjb3VzdGljIG1vZGVsIHJvdXRpbmVzIG9wdGltaXplZAorICogZm9yIE1JUFMgZmxvYXRpbmctcG9pbnQgYXJjaGl0ZWN0dXJlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJlZmVyZW5jZTogbGliYXZjb2RlYy9hYWNwc3kuYworICovCisKKyNpZm5kZWYgQVZDT0RFQ19NSVBTX0FBQ1BTWV9NSVBTX0gKKyNkZWZpbmUgQVZDT0RFQ19NSVBTX0FBQ1BTWV9NSVBTX0gKKworI2lmIEhBVkVfSU5MSU5FX0FTTSAmJiBIQVZFX01JUFNGUFUgJiYgKCBQU1lfTEFNRV9GSVJfTEVOID09IDIxICkKK3N0YXRpYyB2b2lkIGNhbGNfdGhyXzNncHBfbWlwcyhjb25zdCBGRlBzeVdpbmRvd0luZm8gKndpLCBjb25zdCBpbnQgbnVtX2JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFhY1BzeUNoYW5uZWwgKnBjaCwgY29uc3QgdWludDhfdCAqYmFuZF9zaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqY29lZnMpCit7CisgICAgaW50IGksIHcsIGc7CisgICAgaW50IHN0YXJ0ID0gMDsKKyAgICBmb3IgKHcgPSAwOyB3IDwgd2ktPm51bV93aW5kb3dzKjE2OyB3ICs9IDE2KSB7CisgICAgICAgIGZvciAoZyA9IDA7IGcgPCBudW1fYmFuZHM7IGcrKykgeworICAgICAgICAgICAgQWFjUHN5QmFuZCAqYmFuZCA9ICZwY2gtPmJhbmRbdytnXTsKKworICAgICAgICAgICAgZmxvYXQgZm9ybV9mYWN0b3IgPSAwLjBmOworICAgICAgICAgICAgZmxvYXQgVGVtcDsKKyAgICAgICAgICAgIGJhbmQtPmVuZXJneSA9IDAuMGY7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmFuZF9zaXplc1tnXTsgaSs9NCkgeworICAgICAgICAgICAgICAgIGZsb2F0IGEsIGIsIGMsIGQ7CisgICAgICAgICAgICAgICAgZmxvYXQgYXgsIGJ4LCBjeCwgZHg7CisgICAgICAgICAgICAgICAgZmxvYXQgKmNmID0gKGZsb2F0ICopJmNvZWZzW3N0YXJ0K2ldOworCisgICAgICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAgICAgICAgICJsd2MxICAgJVthXSwgICAwKCVbY2ZdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibHdjMSAgICVbYl0sICAgNCglW2NmXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3YzEgICAlW2NdLCAgIDgoJVtjZl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsd2MxICAgJVtkXSwgICAxMiglW2NmXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYWJzLnMgICVbYV0sICAgJVthXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFicy5zICAlW2JdLCAgICVbYl0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJhYnMucyAgJVtjXSwgICAlW2NdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYWJzLnMgICVbZF0sICAgJVtkXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNxcnQucyAlW2F4XSwgICVbYV0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzcXJ0LnMgJVtieF0sICAlW2JdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3FydC5zICVbY3hdLCAgJVtjXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInNxcnQucyAlW2R4XSwgICVbZF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJtYWRkLnMgJVtlXSwgICAlW2VdLCAgICVbYV0sICAgJVthXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibWFkZC5zICVbZV0sICAgJVtlXSwgICAlW2JdLCAgICVbYl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm1hZGQucyAlW2VdLCAgICVbZV0sICAgJVtjXSwgICAlW2NdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJtYWRkLnMgJVtlXSwgICAlW2VdLCAgICVbZF0sICAgJVtkXSAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYWRkLnMgICVbZl0sICAgJVtmXSwgICAlW2F4XSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFkZC5zICAlW2ZdLCAgICVbZl0sICAgJVtieF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJhZGQucyAgJVtmXSwgICAlW2ZdLCAgICVbY3hdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYWRkLnMgICVbZl0sICAgJVtmXSwgICAlW2R4XSAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICA6IFthXSI9JmYiKGEpLCBbYl0iPSZmIihiKSwKKyAgICAgICAgICAgICAgICAgICAgICBbY10iPSZmIihjKSwgW2RdIj0mZiIoZCksCisgICAgICAgICAgICAgICAgICAgICAgW2VdIitmIihiYW5kLT5lbmVyZ3kpLCBbZl0iK2YiKGZvcm1fZmFjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICBbYXhdIj0mZiIoYXgpLCBbYnhdIj0mZiIoYngpLAorICAgICAgICAgICAgICAgICAgICAgIFtjeF0iPSZmIihjeCksIFtkeF0iPSZmIihkeCkKKyAgICAgICAgICAgICAgICAgICAgOiBbY2ZdInIiKGNmKQorICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVGVtcCA9IHNxcnRmKChmbG9hdCliYW5kX3NpemVzW2ddIC8gYmFuZC0+ZW5lcmd5KTsKKyAgICAgICAgICAgIGJhbmQtPnRociAgICAgID0gYmFuZC0+ZW5lcmd5ICogMC4wMDEyNTg5MjVmOworICAgICAgICAgICAgYmFuZC0+bnpfbGluZXMgPSBmb3JtX2ZhY3RvciAqIHNxcnRmKFRlbXApOworICAgICAgICAgICAgc3RhcnQgKz0gYmFuZF9zaXplc1tnXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcHN5X2hwX2ZpbHRlcl9taXBzKGNvbnN0IGZsb2F0ICpmaXJidWYsIGZsb2F0ICpocGZzbXBsLCBjb25zdCBmbG9hdCAqIHBzeV9maXJfY29lZmZzKQoreworICAgIGZsb2F0IHN1bTEsIHN1bTIsIHN1bTMsIHN1bTQ7CisgICAgZmxvYXQgKmZiID0gKGZsb2F0KilmaXJidWY7CisgICAgZmxvYXQgKmZiX2VuZCA9IGZiICsgQUFDX0JMT0NLX1NJWkVfTE9ORzsKKyAgICBmbG9hdCAqaHAgPSBocGZzbXBsOworCisgICAgZmxvYXQgY29lZmYwID0gcHN5X2Zpcl9jb2VmZnNbMV07CisgICAgZmxvYXQgY29lZmYxID0gcHN5X2Zpcl9jb2VmZnNbM107CisgICAgZmxvYXQgY29lZmYyID0gcHN5X2Zpcl9jb2VmZnNbNV07CisgICAgZmxvYXQgY29lZmYzID0gcHN5X2Zpcl9jb2VmZnNbN107CisgICAgZmxvYXQgY29lZmY0ID0gcHN5X2Zpcl9jb2VmZnNbOV07CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJsaS5zICAgJGYxMiwgICAgICAgMzI3NjggICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjAsICAgICAgICA0MCglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGYxLCAgICAgICAgNCglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICRmMiwgICAgICAgIDgwKCVbZmJdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjMsICAgICAgICA0NCglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGY0LCAgICAgICAgOCglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtMV0sICAgICRmMCwgICAgICAgICRmMSwgICAgJVtjb2VmZjBdICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjUsICAgICAgICA4NCglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGY2LCAgICAgICAgNDgoJVtmYl0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtMl0sICAgICRmMywgICAgICAgICRmNCwgICAgJVtjb2VmZjBdICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjcsICAgICAgICAxMiglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0xXSwgICAgJVtzdW0xXSwgICAgJGYyLCAgICAlW2NvZWZmMF0gICBcblx0IgorICAgICAgICAibHdjMSAgICRmOCwgICAgICAgIDg4KCVbZmJdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjksICAgICAgICA1MiglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0yXSwgICAgJVtzdW0yXSwgICAgJGY1LCAgICAlW2NvZWZmMF0gICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtM10sICAgICRmNiwgICAgICAgICRmNywgICAgJVtjb2VmZjBdICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjEwLCAgICAgICAxNiglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGYxMSwgICAgICAgOTIoJVtmYl0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtMV0sICAgICVbc3VtMV0sICAgICRmNywgICAgJVtjb2VmZjFdICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjEsICAgICAgICA3MiglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0zXSwgICAgJVtzdW0zXSwgICAgJGY4LCAgICAlW2NvZWZmMF0gICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtNF0sICAgICRmOSwgICAgICAgICRmMTAsICAgJVtjb2VmZjBdICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3N1bTJdLCAgICAlW3N1bTJdLCAgICAkZjEwLCAgICVbY29lZmYxXSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0xXSwgICAgJVtzdW0xXSwgICAgJGYxLCAgICAlW2NvZWZmMV0gICBcblx0IgorICAgICAgICAibHdjMSAgICRmNCwgICAgICAgIDc2KCVbZmJdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjgsICAgICAgICAyMCglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW00XSwgICAgJVtzdW00XSwgICAgJGYxMSwgICAlW2NvZWZmMF0gICBcblx0IgorICAgICAgICAibHdjMSAgICRmMTEsICAgICAgIDI0KCVbZmJdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3N1bTJdLCAgICAlW3N1bTJdLCAgICAkZjQsICAgICVbY29lZmYxXSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0xXSwgICAgJVtzdW0xXSwgICAgJGY4LCAgICAlW2NvZWZmMl0gICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtM10sICAgICVbc3VtM10sICAgICRmOCwgICAgJVtjb2VmZjFdICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3N1bTRdLCAgICAlW3N1bTRdLCAgICAkZjExLCAgICVbY29lZmYxXSAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGY3LCAgICAgICAgNjQoJVtmYl0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtMl0sICAgICVbc3VtMl0sICAgICRmMTEsICAgJVtjb2VmZjJdICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjEwLCAgICAgICA2OCglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0zXSwgICAgJVtzdW0zXSwgICAgJGYyLCAgICAlW2NvZWZmMV0gICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtNF0sICAgICVbc3VtNF0sICAgICRmNSwgICAgJVtjb2VmZjFdICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3N1bTFdLCAgICAlW3N1bTFdLCAgICAkZjcsICAgICVbY29lZmYyXSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0yXSwgICAgJVtzdW0yXSwgICAgJGYxMCwgICAlW2NvZWZmMl0gICBcblx0IgorICAgICAgICAibHdjMSAgICRmMiwgICAgICAgIDI4KCVbZmJdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjUsICAgICAgICAzMiglW2ZiXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGY4LCAgICAgICAgNTYoJVtmYl0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICRmMTEsICAgICAgIDYwKCVbZmJdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3N1bTNdLCAgICAlW3N1bTNdLCAgICAkZjIsICAgICVbY29lZmYyXSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW00XSwgICAgJVtzdW00XSwgICAgJGY1LCAgICAlW2NvZWZmMl0gICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtMV0sICAgICVbc3VtMV0sICAgICRmMiwgICAgJVtjb2VmZjNdICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3N1bTJdLCAgICAlW3N1bTJdLCAgICAkZjUsICAgICVbY29lZmYzXSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0zXSwgICAgJVtzdW0zXSwgICAgJGYxLCAgICAlW2NvZWZmMl0gICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtNF0sICAgICVbc3VtNF0sICAgICRmNCwgICAgJVtjb2VmZjJdICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3N1bTFdLCAgICAlW3N1bTFdLCAgICAkZjgsICAgICVbY29lZmYzXSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0yXSwgICAgJVtzdW0yXSwgICAgJGYxMSwgICAlW2NvZWZmM10gICBcblx0IgorICAgICAgICAibHdjMSAgICRmMSwgICAgICAgIDM2KCVbZmJdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW2ZiXSwgICAgICAlW2ZiXSwgICAgICAxNiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW00XSwgICAgJVtzdW00XSwgICAgJGYwLCAgICAlW2NvZWZmM10gICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtM10sICAgICVbc3VtM10sICAgICRmMSwgICAgJVtjb2VmZjNdICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3N1bTFdLCAgICAlW3N1bTFdLCAgICAkZjEsICAgICVbY29lZmY0XSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0yXSwgICAgJVtzdW0yXSwgICAgJGYwLCAgICAlW2NvZWZmNF0gICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtNF0sICAgICVbc3VtNF0sICAgICRmMTAsICAgJVtjb2VmZjNdICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3N1bTNdLCAgICAlW3N1bTNdLCAgICAkZjcsICAgICVbY29lZmYzXSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0xXSwgICAgJVtzdW0xXSwgICAgJGY2LCAgICAlW2NvZWZmNF0gICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtMl0sICAgICVbc3VtMl0sICAgICRmOSwgICAgJVtjb2VmZjRdICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3N1bTRdLCAgICAlW3N1bTRdLCAgICAkZjYsICAgICVbY29lZmY0XSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW0zXSwgICAgJVtzdW0zXSwgICAgJGYzLCAgICAlW2NvZWZmNF0gICBcblx0IgorICAgICAgICAibXVsLnMgICVbc3VtMV0sICAgICVbc3VtMV0sICAgICRmMTIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAlW3N1bTJdLCAgICAlW3N1bTJdLCAgICAkZjEyICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW00XSwgICAgJVtzdW00XSwgICAgJGYxMSwgICAlW2NvZWZmNF0gICBcblx0IgorICAgICAgICAibWFkZC5zICVbc3VtM10sICAgICVbc3VtM10sICAgICRmOCwgICAgJVtjb2VmZjRdICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAlW3N1bTFdLCAgICAwKCVbaHBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgJVtzdW0yXSwgICAgNCglW2hwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICVbc3VtNF0sICAgICVbc3VtNF0sICAgICRmMTIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAlW3N1bTNdLCAgICAlW3N1bTNdLCAgICAkZjEyICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgJVtzdW00XSwgICAgMTIoJVtocF0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICVbc3VtM10sICAgIDgoJVtocF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICAlW2ZiXSwgICAgICAlW2ZiX2VuZF0sICAxYiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIgYWRkaXUgJVtocF0sICAgICAgJVtocF0sICAgICAgMTYgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW3N1bTFdIj0mZiIoc3VtMSksIFtzdW0yXSI9JmYiKHN1bTIpLAorICAgICAgICAgIFtzdW0zXSI9JmYiKHN1bTMpLCBbc3VtNF0iPSZmIihzdW00KSwKKyAgICAgICAgICBbZmJdIityIihmYiksIFtocF0iK3IiKGhwKQorICAgICAgICA6IFtjb2VmZjBdImYiKGNvZWZmMCksIFtjb2VmZjFdImYiKGNvZWZmMSksCisgICAgICAgICAgW2NvZWZmMl0iZiIoY29lZmYyKSwgW2NvZWZmM10iZiIoY29lZmYzKSwKKyAgICAgICAgICBbY29lZmY0XSJmIihjb2VmZjQpLCBbZmJfZW5kXSJyIihmYl9lbmQpCisgICAgICAgIDogIiRmMCIsICIkZjEiLCAiJGYyIiwgIiRmMyIsICIkZjQiLCAiJGY1IiwgIiRmNiIsCisgICAgICAgICAgIiRmNyIsICIkZjgiLCAiJGY5IiwgIiRmMTAiLCAiJGYxMSIsICIkZjEyIiwKKyAgICAgICAgICAibWVtb3J5IgorICAgICk7Cit9CisKKyNkZWZpbmUgY2FsY190aHJfM2dwcCBjYWxjX3Rocl8zZ3BwX21pcHMKKyNkZWZpbmUgcHN5X2hwX2ZpbHRlciBwc3lfaHBfZmlsdGVyX21pcHMKKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAmJiBIQVZFX01JUFNGUFUgKi8KKyNlbmRpZiAvKiBBVkNPREVDX01JUFNfQUFDUFNZX01JUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hYWNzYnJfbWlwcy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hYWNzYnJfbWlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTVmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FhY3Nicl9taXBzLmMKQEAgLTAsMCArMSw2MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIKKyAqICAgICAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIENhbGlmb3JuaWEuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3JzOiAgRGpvcmRqZSBQZXN1dCAgIChkam9yZGplQG1pcHMuY29tKQorICogICAgICAgICAgIE1pcmphbmEgVnVsaW4gICAobXZ1bGluQG1pcHMuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSZWZlcmVuY2U6IGxpYmF2Y29kZWMvYWFjc2JyLmMKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2FhY3Nici5oIgorCisjZGVmaW5lIEVOVkVMT1BFX0FESlVTVE1FTlRfT0ZGU0VUIDIKKworI2lmIEhBVkVfSU5MSU5FX0FTTQorc3RhdGljIGludCBzYnJfbGZfZ2VuX21pcHMoQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgWF9sb3dbMzJdWzQwXVsyXSwgY29uc3QgZmxvYXQgV1syXVszMl1bMzJdWzJdLAorICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfaWR4KQoreworICAgIGludCBpLCBrOworICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgICAgZmxvYXQgKnBfeF9sb3cgPSAmWF9sb3dbMF1bOF1bMF07CisgICAgZmxvYXQgKnBfdyA9IChmbG9hdCopJldbYnVmX2lkeF1bMF1bMF1bMF07CisgICAgZmxvYXQgKnBfeDFfbG93ID0gJlhfbG93WzBdWzBdWzBdOworICAgIGZsb2F0ICpwX3cxID0gKGZsb2F0KikmV1sxLWJ1Zl9pZHhdWzI0XVswXVswXTsKKworICAgIGZsb2F0ICpsb29wX2VuZD1wX3gxX2xvdyArIDI1NjA7CisKKyAgICAvKiBsb29wIHVucm9sbGVkIDggdGltZXMgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAkMCwgICAgICAgICAgICAwKCVbcF94MV9sb3ddKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAkMCwgICAgICAgICAgICA0KCVbcF94MV9sb3ddKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAkMCwgICAgICAgICAgICA4KCVbcF94MV9sb3ddKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAkMCwgICAgICAgICAgICAxMiglW3BfeDFfbG93XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAkMCwgICAgICAgICAgICAxNiglW3BfeDFfbG93XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAkMCwgICAgICAgICAgICAyMCglW3BfeDFfbG93XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAkMCwgICAgICAgICAgICAyNCglW3BfeDFfbG93XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAkMCwgICAgICAgICAgICAyOCglW3BfeDFfbG93XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW3BfeDFfbG93XSwgICAlW3BfeDFfbG93XSwgICAgICAzMiAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICAlW3BfeDFfbG93XSwgICAlW2xvb3BfZW5kXSwgICAgICAxYiAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW3BfeDFfbG93XSwgICAlW3BfeDFfbG93XSwgICAgICAtMTAyNDAgXG5cdCIKKworICAgICAgICA6IFtwX3gxX2xvd10iK3IiKHBfeDFfbG93KQorICAgICAgICA6IFtsb29wX2VuZF0iciIobG9vcF9lbmQpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworCisgICAgZm9yIChrID0gMDsgayA8IHNici0+a3hbMV07IGsrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrPTQpIHsKKyAgICAgICAgICAgIC8qIGxvb3AgdW5yb2xsZWQgNCB0aW1lcyAqLworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAgICAgImx3ICAgICAlW3RlbXAwXSwgICAwKCVbcF93XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgJVt0ZW1wMV0sICAgNCglW3Bfd10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICVbdGVtcDJdLCAgIDI1NiglW3Bfd10pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAlW3RlbXAzXSwgICAyNjAoJVtwX3ddKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgJVt0ZW1wNF0sICAgNTEyKCVbcF93XSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICVbdGVtcDVdLCAgIDUxNiglW3Bfd10pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAlW3RlbXA2XSwgICA3NjgoJVtwX3ddKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgJVt0ZW1wN10sICAgNzcyKCVbcF93XSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbdGVtcDBdLCAgIDAoJVtwX3hfbG93XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW3RlbXAxXSwgICA0KCVbcF94X2xvd10pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVt0ZW1wMl0sICAgOCglW3BfeF9sb3ddKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbdGVtcDNdLCAgIDEyKCVbcF94X2xvd10pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW3RlbXA0XSwgICAxNiglW3BfeF9sb3ddKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVt0ZW1wNV0sICAgMjAoJVtwX3hfbG93XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbdGVtcDZdLCAgIDI0KCVbcF94X2xvd10pICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW3RlbXA3XSwgICAyOCglW3BfeF9sb3ddKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgJVtwX3hfbG93XSwgJVtwX3hfbG93XSwgICAgIDMyICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICVbcF93XSwgICAgICVbcF93XSwgICAgICAgICAxMDI0ICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICAgICAgICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksCisgICAgICAgICAgICAgICAgICBbcF93XSIrciIocF93KSwgW3BfeF9sb3ddIityIihwX3hfbG93KQorICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIHBfeF9sb3cgKz0gMTY7CisgICAgICAgIHBfdyAtPSAyMDQ2OworICAgIH0KKworICAgIGZvciAoayA9IDA7IGsgPCBzYnItPmt4WzBdOyBrKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCisgICAgICAgICAgICAvKiBsb29wIHVucm9sbGVkIDQgdGltZXMgKi8KKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICJsdyAgICAgJVt0ZW1wMF0sICAgIDAoJVtwX3cxXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICVbdGVtcDFdLCAgICA0KCVbcF93MV0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAlW3RlbXAyXSwgICAgMjU2KCVbcF93MV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgJVt0ZW1wM10sICAgIDI2MCglW3BfdzFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICVbdGVtcDRdLCAgICA1MTIoJVtwX3cxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAlW3RlbXA1XSwgICAgNTE2KCVbcF93MV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgJVt0ZW1wNl0sICAgIDc2OCglW3BfdzFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICVbdGVtcDddLCAgICA3NzIoJVtwX3cxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW3RlbXAwXSwgICAgMCglW3BfeDFfbG93XSkgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVt0ZW1wMV0sICAgIDQoJVtwX3gxX2xvd10pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbdGVtcDJdLCAgICA4KCVbcF94MV9sb3ddKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW3RlbXAzXSwgICAgMTIoJVtwX3gxX2xvd10pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVt0ZW1wNF0sICAgIDE2KCVbcF94MV9sb3ddKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICVbdGVtcDVdLCAgICAyMCglW3BfeDFfbG93XSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAlW3RlbXA2XSwgICAgMjQoJVtwX3gxX2xvd10pICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgJVt0ZW1wN10sICAgIDI4KCVbcF94MV9sb3ddKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICVbcF94MV9sb3ddLCAlW3BfeDFfbG93XSwgICAzMiAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZGl1ICAlW3BfdzFdLCAgICAgJVtwX3cxXSwgICAgICAgMTAyNCAgICBcblx0IgorCisgICAgICAgICAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgICAgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICAgICAgICAgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLAorICAgICAgICAgICAgICAgICAgW3BfdzFdIityIihwX3cxKSwgW3BfeDFfbG93XSIrciIocF94MV9sb3cpCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgcF94MV9sb3cgKz0gNjQ7CisgICAgICAgIHBfdzEgLT0gNTEwOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYnJfeF9nZW5fbWlwcyhTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyLCBmbG9hdCBYWzJdWzM4XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBZMFszOF1bNjRdWzJdLCBjb25zdCBmbG9hdCBZMVszOF1bNjRdWzJdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgWF9sb3dbMzJdWzQwXVsyXSwgaW50IGNoKQoreworICAgIGludCBrLCBpOworICAgIGNvbnN0IGludCBpX2YgPSAzMjsKKyAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgICAgY29uc3QgZmxvYXQgKlhfbG93MSwgKlkwMSwgKlkxMTsKKyAgICBmbG9hdCAqeDE9JlhbMF1bMF1bMF07CisgICAgZmxvYXQgKmo9eDErNDg2NDsKKyAgICBjb25zdCBpbnQgaV9UZW1wID0gRkZNQVgoMipzYnItPmRhdGFbY2hdLnRfZW52X251bV9lbnZfb2xkIC0gaV9mLCAwKTsKKworICAgIC8qIGxvb3AgdW5yb2xsZWQgOCB0aW1lcyAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJDAsICAgICAgMCglW3gxXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAkMCwgICAgICA0KCVbeDFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICQwLCAgICAgIDgoJVt4MV0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJDAsICAgICAgMTIoJVt4MV0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAkMCwgICAgICAxNiglW3gxXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICQwLCAgICAgIDIwKCVbeDFdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJDAsICAgICAgMjQoJVt4MV0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAkMCwgICAgICAyOCglW3gxXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbeDFdLCAgICVbeDFdLCAgICAgIDMyICAgICAgIFxuXHQiCisgICAgICAgICJibmUgICAgJVt4MV0sICAgJVtqXSwgICAgICAgMWIgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW3gxXSwgICAlW3gxXSwgICAgICAtMTk0NTYgICBcblx0IgorCisgICAgICAgIDogW3gxXSIrciIoeDEpCisgICAgICAgIDogW2pdInIiKGopCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworCisgICAgaWYgKGlfVGVtcCAhPSAwKSB7CisKKyAgICAgICAgWF9sb3cxPSZYX2xvd1swXVsyXVswXTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc2JyLT5reFswXTsgaysrKSB7CisKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICJtb3ZlICAgICVbaV0sICAgICAgICAkemVybyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICAlW3RlbXAwXSwgICAgMCglW1hfbG93MV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDFdLCAgICA0KCVbWF9sb3cxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMF0sICAgIDAoJVt4MV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICAlW3RlbXAxXSwgICAgOTcyOCglW3gxXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICVbeDFdLCAgICAgICAlW3gxXSwgICAgICAgICAyNTYgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtYX2xvdzFdLCAgICVbWF9sb3cxXSwgICAgIDggICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICAlW2ldLCAgICAgICAgJVtpXSwgICAgICAgICAgMSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJibmUgICAgICVbaV0sICAgICAgICAlW2lfVGVtcF0sICAgICAyYiAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFt4MV0iK3IiKHgxKSwgW1hfbG93MV0iK3IiKFhfbG93MSksIFtpXSI9JnIiKGkpLAorICAgICAgICAgICAgICAgICAgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKQorICAgICAgICAgICAgICAgIDogW2lfVGVtcF0iciIoaV9UZW1wKQorICAgICAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICB4MS09KGlfVGVtcDw8NiktMTsKKyAgICAgICAgICAgIFhfbG93MS09KGlfVGVtcDw8MSktODA7CisgICAgICAgIH0KKworICAgICAgICB4MT0mWFswXVswXVtrXTsKKyAgICAgICAgWTAxPShmbG9hdCopJlkwWzMyXVtrXVswXTsKKworICAgICAgICBmb3IgKDsgayA8IHNici0+a3hbMF0gKyBzYnItPm1bMF07IGsrKykgeworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAgICAgIm1vdmUgICAgJVtpXSwgICAgICAgJHplcm8gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHcgICAgICAlW3RlbXAwXSwgICAwKCVbWTAxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMV0sICAgNCglW1kwMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDBdLCAgIDAoJVt4MV0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3cgICAgICAlW3RlbXAxXSwgICA5NzI4KCVbeDFdKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZGl1ICAgJVt4MV0sICAgICAgJVt4MV0sICAgICAgMjU2ICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICVbWTAxXSwgICAgICVbWTAxXSwgICAgIDUxMiAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICAlW2ldLCAgICAgICAlW2ldLCAgICAgICAxICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImJuZSAgICAgJVtpXSwgICAgICAgJVtpX1RlbXBdLCAgM2IgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgOiBbeDFdIityIih4MSksIFtZMDFdIityIihZMDEpLCBbaV0iPSZyIihpKSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSkKKyAgICAgICAgICAgICAgICA6IFtpX1RlbXBdInIiKGlfVGVtcCkKKyAgICAgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICAgICApOworICAgICAgICAgICAgeDEgLT0oaV9UZW1wPDw2KS0xOworICAgICAgICAgICAgWTAxIC09KGlfVGVtcDw8NyktMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHgxPSZYWzBdW2lfVGVtcF1bMF07CisgICAgWF9sb3cxPSZYX2xvd1swXVtpX1RlbXArMl1bMF07CisgICAgdGVtcDM9Mzg7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgc2JyLT5reFsxXTsgaysrKSB7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAibW92ZSAgICAlW2ldLCAgICAgICAlW2lfVGVtcF0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAwXSwgICAwKCVbWF9sb3cxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAlW3RlbXAxXSwgICA0KCVbWF9sb3cxXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAwXSwgICAwKCVbeDFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAlW3RlbXAxXSwgICA5NzI4KCVbeDFdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAlW3gxXSwgICAgICAlW3gxXSwgICAgICAgICAyNTYgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAlW1hfbG93MV0sICAlW1hfbG93MV0sICAgICA4ICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAlW2ldLCAgICAgICAlW2ldLCAgICAgICAgICAxICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYm5lICAgICAlW2ldLCAgICAgICAlW3RlbXAzXSwgICAgICA0YiAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3gxXSIrciIoeDEpLCBbWF9sb3cxXSIrciIoWF9sb3cxKSwgW2ldIj0mciIoaSksCisgICAgICAgICAgICAgIFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICAgICAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMikKKyAgICAgICAgICAgIDogW2lfVGVtcF0iciIoaV9UZW1wKSwgW3RlbXAzXSJyIih0ZW1wMykKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICAgICAgeDEgLT0gKCgzOC1pX1RlbXApPDw2KS0xOworICAgICAgICBYX2xvdzEgLT0gKCgzOC1pX1RlbXApPDwxKS0gODA7CisgICAgfQorCisgICAgeDE9JlhbMF1baV9UZW1wXVtrXTsKKyAgICBZMTE9JlkxW2lfVGVtcF1ba11bMF07CisgICAgdGVtcDI9MzI7CisKKyAgICBmb3IgKDsgayA8IHNici0+a3hbMV0gKyBzYnItPm1bMV07IGsrKykgeworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAibW92ZSAgICAlW2ldLCAgICAgICAlW2lfVGVtcF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiNTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAibHcgICAgICAlW3RlbXAwXSwgICAwKCVbWTExXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAibHcgICAgICAlW3RlbXAxXSwgICA0KCVbWTExXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAic3cgICAgICAlW3RlbXAwXSwgICAwKCVbeDFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAic3cgICAgICAlW3RlbXAxXSwgICA5NzI4KCVbeDFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAiYWRkaXUgICAlW3gxXSwgICAgICAlW3gxXSwgICAgICAgICAgMjU2ICAgICBcblx0IgorICAgICAgICAgICAiYWRkaXUgICAlW1kxMV0sICAgICAlW1kxMV0sICAgICAgICAgNTEyICAgICBcblx0IgorICAgICAgICAgICAiYWRkaXUgICAlW2ldLCAgICAgICAlW2ldLCAgICAgICAgICAgMSAgICAgICBcblx0IgorICAgICAgICAgICAiYm5lICAgICAlW2ldLCAgICAgICAlW3RlbXAyXSwgICAgICAgNWIgICAgICBcblx0IgorCisgICAgICAgICAgIDogW3gxXSIrciIoeDEpLCBbWTExXSIrciIoWTExKSwgW2ldIj0mciIoaSksCisgICAgICAgICAgICAgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKQorICAgICAgICAgICA6IFtpX1RlbXBdInIiKGlfVGVtcCksIFt0ZW1wM10iciIodGVtcDMpLAorICAgICAgICAgICAgIFt0ZW1wMl0iciIodGVtcDIpCisgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKworICAgICAgICB4MSAtPSAoKDMyLWlfVGVtcCk8PDYpLTE7CisgICAgICAgIFkxMSAtPSAoKDMyLWlfVGVtcCk8PDcpLTI7CisgICB9CisgICAgICByZXR1cm4gMDsKK30KKworI2lmIEhBVkVfTUlQU0ZQVQorc3RhdGljIHZvaWQgc2JyX2hmX2Fzc2VtYmxlX21pcHMoZmxvYXQgWTFbMzhdWzY0XVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBYX2hpZ2hbNjRdWzQwXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyLCBTQlJEYXRhICpjaF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBlX2FbMl0pCit7CisgICAgaW50IGUsIGksIGosIG07CisgICAgY29uc3QgaW50IGhfU0wgPSA0ICogIXNici0+YnNfc21vb3RoaW5nX21vZGU7CisgICAgY29uc3QgaW50IGt4ID0gc2JyLT5reFsxXTsKKyAgICBjb25zdCBpbnQgbV9tYXggPSBzYnItPm1bMV07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGhfc21vb3RoWzVdID0geworICAgICAgICAwLjMzMzMzMzMzMzMzMzMzLAorICAgICAgICAwLjMwMTUwMjgzMjM5NTgyLAorICAgICAgICAwLjIxODE2OTQ5OTA2MjQ5LAorICAgICAgICAwLjExNTE2MzgzNDI3MDg0LAorICAgICAgICAwLjAzMTgzMDUwMDkzNzUxLAorICAgIH07CisKKyAgICBmbG9hdCAoKmdfdGVtcClbNDhdID0gY2hfZGF0YS0+Z190ZW1wLCAoKnFfdGVtcClbNDhdID0gY2hfZGF0YS0+cV90ZW1wOworICAgIGludCBpbmRleG5vaXNlID0gY2hfZGF0YS0+Zl9pbmRleG5vaXNlOworICAgIGludCBpbmRleHNpbmUgID0gY2hfZGF0YS0+Zl9pbmRleHNpbmU7CisgICAgZmxvYXQgKmdfdGVtcDEsICpxX3RlbXAxLCAqcG9rLCAqcG9rMTsKKyAgICBmbG9hdCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgICBpbnQgc2l6ZSA9IG1fbWF4OworCisgICAgaWYgKHNici0+cmVzZXQpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhfU0w7IGkrKykgeworICAgICAgICAgICAgbWVtY3B5KGdfdGVtcFtpICsgMipjaF9kYXRhLT50X2VudlswXV0sIHNici0+Z2FpblswXSwgbV9tYXggKiBzaXplb2Yoc2JyLT5nYWluWzBdWzBdKSk7CisgICAgICAgICAgICBtZW1jcHkocV90ZW1wW2kgKyAyKmNoX2RhdGEtPnRfZW52WzBdXSwgc2JyLT5xX21bMF0sICBtX21heCAqIHNpemVvZihzYnItPnFfbVswXVswXSkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChoX1NMKSB7CisgICAgICAgIG1lbWNweShnX3RlbXBbMipjaF9kYXRhLT50X2VudlswXV0sIGdfdGVtcFsyKmNoX2RhdGEtPnRfZW52X251bV9lbnZfb2xkXSwgNCpzaXplb2YoZ190ZW1wWzBdKSk7CisgICAgICAgIG1lbWNweShxX3RlbXBbMipjaF9kYXRhLT50X2VudlswXV0sIHFfdGVtcFsyKmNoX2RhdGEtPnRfZW52X251bV9lbnZfb2xkXSwgNCpzaXplb2YocV90ZW1wWzBdKSk7CisgICAgfQorCisgICAgZm9yIChlID0gMDsgZSA8IGNoX2RhdGEtPmJzX251bV9lbnY7IGUrKykgeworICAgICAgICBmb3IgKGkgPSAyICogY2hfZGF0YS0+dF9lbnZbZV07IGkgPCAyICogY2hfZGF0YS0+dF9lbnZbZSArIDFdOyBpKyspIHsKKyAgICAgICAgICAgIGdfdGVtcDEgPSBnX3RlbXBbaF9TTCArIGldOworICAgICAgICAgICAgcG9rID0gc2JyLT5nYWluW2VdOworICAgICAgICAgICAgcV90ZW1wMSA9IHFfdGVtcFtoX1NMICsgaV07CisgICAgICAgICAgICBwb2sxID0gc2JyLT5xX21bZV07CisKKyAgICAgICAgICAgIC8qIGxvb3AgdW5yb2xsZWQgNCB0aW1lcyAqLworICAgICAgICAgICAgZm9yIChqPTA7IGo8KHNpemU+PjIpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMV0sICAgMCglW3Bva10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMl0sICAgNCglW3Bva10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wM10sICAgOCglW3Bva10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNF0sICAgMTIoJVtwb2tdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMV0sICAgMCglW2dfdGVtcDFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMl0sICAgNCglW2dfdGVtcDFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wM10sICAgOCglW2dfdGVtcDFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNF0sICAgMTIoJVtnX3RlbXAxXSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMV0sICAgMCglW3BvazFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMl0sICAgNCglW3BvazFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wM10sICAgOCglW3BvazFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wNF0sICAgMTIoJVtwb2sxXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMV0sICAgMCglW3FfdGVtcDFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMl0sICAgNCglW3FfdGVtcDFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wM10sICAgOCglW3FfdGVtcDFdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wNF0sICAgMTIoJVtxX3RlbXAxXSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtwb2tdLCAgICAgJVtwb2tdLCAgICAgICAgICAgMTYgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtnX3RlbXAxXSwgJVtnX3RlbXAxXSwgICAgICAgMTYgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtwb2sxXSwgICAgJVtwb2sxXSwgICAgICAgICAgMTYgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtxX3RlbXAxXSwgJVtxX3RlbXAxXSwgICAgICAgMTYgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICAgICA6IFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICAgICAgICAgICAgICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwKKyAgICAgICAgICAgICAgICAgICAgICBbcG9rXSIrciIocG9rKSwgW2dfdGVtcDFdIityIihnX3RlbXAxKSwKKyAgICAgICAgICAgICAgICAgICAgICBbcG9rMV0iK3IiKHBvazEpLCBbcV90ZW1wMV0iK3IiKHFfdGVtcDEpCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaj0wOyBqPChzaXplJjMpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICAgICAgICAgImx3ICAgICAgJVt0ZW1wMV0sICAgMCglW3Bva10pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibHcgICAgICAlW3RlbXAyXSwgICAwKCVbcG9rMV0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDFdLCAgIDAoJVtnX3RlbXAxXSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3ICAgICAgJVt0ZW1wMl0sICAgMCglW3FfdGVtcDFdKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYWRkaXUgICAlW3Bva10sICAgICAlW3Bva10sICAgICAgICAgIDQgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJhZGRpdSAgICVbZ190ZW1wMV0sICVbZ190ZW1wMV0sICAgICAgNCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtwb2sxXSwgICAgJVtwb2sxXSwgICAgICAgICA0ICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYWRkaXUgICAlW3FfdGVtcDFdLCAlW3FfdGVtcDFdLCAgICAgIDQgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgOiBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksCisgICAgICAgICAgICAgICAgICAgICAgW3Bva10iK3IiKHBvayksIFtnX3RlbXAxXSIrciIoZ190ZW1wMSksCisgICAgICAgICAgICAgICAgICAgICAgW3BvazFdIityIihwb2sxKSwgW3FfdGVtcDFdIityIihxX3RlbXAxKQorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChlID0gMDsgZSA8IGNoX2RhdGEtPmJzX251bV9lbnY7IGUrKykgeworICAgICAgICBmb3IgKGkgPSAyICogY2hfZGF0YS0+dF9lbnZbZV07IGkgPCAyICogY2hfZGF0YS0+dF9lbnZbZSArIDFdOyBpKyspIHsKKyAgICAgICAgICAgIExPQ0FMX0FMSUdORURfMTYoZmxvYXQsIGdfZmlsdF90YWIsIFs0OF0pOworICAgICAgICAgICAgTE9DQUxfQUxJR05FRF8xNihmbG9hdCwgcV9maWx0X3RhYiwgWzQ4XSk7CisgICAgICAgICAgICBmbG9hdCAqZ19maWx0LCAqcV9maWx0OworCisgICAgICAgICAgICBpZiAoaF9TTCAmJiBlICE9IGVfYVswXSAmJiBlICE9IGVfYVsxXSkgeworICAgICAgICAgICAgICAgIGdfZmlsdCA9IGdfZmlsdF90YWI7CisgICAgICAgICAgICAgICAgcV9maWx0ID0gcV9maWx0X3RhYjsKKworICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCBtX21heDsgbSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpZHgxID0gaSArIGhfU0w7CisgICAgICAgICAgICAgICAgICAgIGdfZmlsdFttXSA9IDAuMGY7CisgICAgICAgICAgICAgICAgICAgIHFfZmlsdFttXSA9IDAuMGY7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBoX1NMOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdfZmlsdFttXSArPSBnX3RlbXBbaWR4MSAtIGpdW21dICogaF9zbW9vdGhbal07CisgICAgICAgICAgICAgICAgICAgICAgICBxX2ZpbHRbbV0gKz0gcV90ZW1wW2lkeDEgLSBqXVttXSAqIGhfc21vb3RoW2pdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnX2ZpbHQgPSBnX3RlbXBbaSArIGhfU0xdOworICAgICAgICAgICAgICAgIHFfZmlsdCA9IHFfdGVtcFtpXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2JyLT5kc3AuaGZfZ19maWx0KFkxW2ldICsga3gsIFhfaGlnaCArIGt4LCBnX2ZpbHQsIG1fbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKyBFTlZFTE9QRV9BREpVU1RNRU5UX09GRlNFVCk7CisKKyAgICAgICAgICAgIGlmIChlICE9IGVfYVswXSAmJiBlICE9IGVfYVsxXSkgeworICAgICAgICAgICAgICAgIHNici0+ZHNwLmhmX2FwcGx5X25vaXNlW2luZGV4c2luZV0oWTFbaV0gKyBreCwgc2JyLT5zX21bZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX2ZpbHQsIGluZGV4bm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBreCwgbV9tYXgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gaW5kZXhzaW5lJjE7CisgICAgICAgICAgICAgICAgaW50IEEgPSAoMS0oKGluZGV4c2luZSsoa3ggJiAxKSkmMikpOworICAgICAgICAgICAgICAgIGludCBCID0gKEFeKC1pZHgpKSArIGlkeDsKKyAgICAgICAgICAgICAgICBmbG9hdCAqb3V0ID0gJlkxW2ldW2t4XVtpZHhdOworICAgICAgICAgICAgICAgIGZsb2F0ICppbiAgPSBzYnItPnNfbVtlXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICAgICAgICAgICAgICAgIGZsb2F0IEFfZiA9IChmbG9hdClBOworICAgICAgICAgICAgICAgIGZsb2F0IEJfZiA9IChmbG9hdClCOworCisgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSsxIDwgbV9tYXg7IG0rPTIpIHsKKworICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9IG91dFswXTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDMgPSBvdXRbMl07CisKKyAgICAgICAgICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDBdLCAgMCglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMV0sICA0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXA0XSwgICVbdGVtcDJdLCAgJVt0ZW1wMF0sICVbQV9mXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDVdLCAgJVt0ZW1wM10sICAlW3RlbXAxXSwgJVtCX2ZdICBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgInN3YzEgICAgJVt0ZW1wNF0sICAwKCVbb3V0XSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAic3djMSAgICAlW3RlbXA1XSwgIDgoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhZGRpdSAgICVbaW5dLCAgICAgJVtpbl0sICAgICA4ICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtvdXRdLCAgICAlW291dF0sICAgIDE2ICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAgICAgICAgIDogW3RlbXAwXSI9JmYiICh0ZW1wMCksIFt0ZW1wMV0iPSZmIih0ZW1wMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wNF0iPSZmIiAodGVtcDQpLCBbdGVtcDVdIj0mZiIodGVtcDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5dIityIihpbiksIFtvdXRdIityIihvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICA6IFtBX2ZdImYiKEFfZiksIFtCX2ZdImYiKEJfZiksIFt0ZW1wMl0iZiIodGVtcDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcDNdImYiKHRlbXAzKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihtX21heCYxKQorICAgICAgICAgICAgICAgICAgICBvdXRbMiptICBdICs9IGluW20gIF0gKiBBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXhub2lzZSA9IChpbmRleG5vaXNlICsgbV9tYXgpICYgMHgxZmY7CisgICAgICAgICAgICBpbmRleHNpbmUgPSAoaW5kZXhzaW5lICsgMSkgJiAzOworICAgICAgICB9CisgICAgfQorICAgIGNoX2RhdGEtPmZfaW5kZXhub2lzZSA9IGluZGV4bm9pc2U7CisgICAgY2hfZGF0YS0+Zl9pbmRleHNpbmUgID0gaW5kZXhzaW5lOworfQorCitzdGF0aWMgdm9pZCBzYnJfaGZfaW52ZXJzZV9maWx0ZXJfbWlwcyhTQlJEU1BDb250ZXh0ICpkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKCphbHBoYTApWzJdLCBmbG9hdCAoKmFscGhhMSlbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgWF9sb3dbMzJdWzQwXVsyXSwgaW50IGswKQoreworICAgIGludCBrOworICAgIGZsb2F0IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgYzsKKyAgICBmbG9hdCAqcGhpMSwgKmFscGhhXzEsICphbHBoYV8wLCByZXMxLCByZXMyLCB0ZW1wX3JlYWwsIHRlbXBfaW07CisKKyAgICBjID0gMS4wMDAwMDFmOworCisgICAgZm9yIChrID0gMDsgayA8IGswOyBrKyspIHsKKyAgICAgICAgTE9DQUxfQUxJR05FRF8xNihmbG9hdCwgcGhpLCBbM10sIFsyXVsyXSk7CisgICAgICAgIGZsb2F0IGRrOworICAgICAgICBwaGkxID0gJnBoaVswXVswXVswXTsKKyAgICAgICAgYWxwaGFfMSA9ICZhbHBoYTFba11bMF07CisgICAgICAgIGFscGhhXzAgPSAmYWxwaGEwW2tdWzBdOworICAgICAgICBkc3AtPmF1dG9jb3JyZWxhdGUoWF9sb3dba10sIHBoaSk7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAwXSwgIDQwKCVbcGhpMV0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMV0sICAxNiglW3BoaTFdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDJdLCAgMjQoJVtwaGkxXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAzXSwgIDI4KCVbcGhpMV0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVtka10sICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgMCglW3BoaTFdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICAlW3JlczJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICA0KCVbcGhpMV0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICVbcmVzMl0sICAgJVtyZXMyXSwgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10gIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA2XSwgIDgoJVtwaGkxXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImRpdi5zICAgJVtyZXMyXSwgICAlW3JlczJdLCAgICAgJVtjXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDBdLCAgMTIoJVtwaGkxXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViLnMgICAlW2RrXSwgICAgICVbZGtdLCAgICAgICAlW3JlczJdICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFt0ZW1wMF0iPSZmIih0ZW1wMCksIFt0ZW1wMV0iPSZmIih0ZW1wMSksIFt0ZW1wMl0iPSZmIih0ZW1wMiksCisgICAgICAgICAgICAgIFt0ZW1wM10iPSZmIih0ZW1wMyksIFt0ZW1wNF0iPSZmIih0ZW1wNCksIFt0ZW1wNV0iPSZmIih0ZW1wNSksCisgICAgICAgICAgICAgIFt0ZW1wNl0iPSZmIih0ZW1wNiksIFtyZXMyXSI9JmYiKHJlczIpLCBbZGtdIj0mZiIoZGspCisgICAgICAgICAgICA6IFtwaGkxXSJyIihwaGkxKSwgW2NdImYiKGMpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgaWYgKCFkaykgeworICAgICAgICAgICAgYWxwaGFfMVswXSA9IDA7CisgICAgICAgICAgICBhbHBoYV8xWzFdID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICJtdWwucyAgICVbdGVtcF9yZWFsXSwgJVt0ZW1wNF0sICAgICAlW3RlbXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm5tc3ViLnMgJVt0ZW1wX3JlYWxdLCAlW3RlbXBfcmVhbF0sICVbdGVtcDVdLCAlW3RlbXAzXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibm1zdWIucyAlW3RlbXBfcmVhbF0sICVbdGVtcF9yZWFsXSwgJVt0ZW1wNl0sICVbdGVtcDFdICBcblx0IgorICAgICAgICAgICAgICAgICJtdWwucyAgICVbdGVtcF9pbV0sICAgJVt0ZW1wNF0sICAgICAlW3RlbXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wX2ltXSwgICAlW3RlbXBfaW1dLCAgICVbdGVtcDVdLCAlW3RlbXAyXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibm1zdWIucyAlW3RlbXBfaW1dLCAgICVbdGVtcF9pbV0sICAgJVt0ZW1wMF0sICVbdGVtcDFdICBcblx0IgorICAgICAgICAgICAgICAgICJkaXYucyAgICVbdGVtcF9yZWFsXSwgJVt0ZW1wX3JlYWxdLCAlW2RrXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImRpdi5zICAgJVt0ZW1wX2ltXSwgICAlW3RlbXBfaW1dLCAgICVbZGtdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICAlW3RlbXBfcmVhbF0sIDAoJVthbHBoYV8xXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzd2MxICAgICVbdGVtcF9pbV0sICAgNCglW2FscGhhXzFdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFt0ZW1wX3JlYWxdIj0mZiIgKHRlbXBfcmVhbCksIFt0ZW1wX2ltXSI9JmYiKHRlbXBfaW0pCisgICAgICAgICAgICAgICAgOiBbcGhpMV0iciIocGhpMSksIFt0ZW1wMF0iZiIodGVtcDApLCBbdGVtcDFdImYiKHRlbXAxKSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wMl0iZiIodGVtcDIpLCBbdGVtcDNdImYiKHRlbXAzKSwgW3RlbXA0XSJmIih0ZW1wNCksCisgICAgICAgICAgICAgICAgICBbdGVtcDVdImYiKHRlbXA1KSwgW3RlbXA2XSJmIih0ZW1wNiksCisgICAgICAgICAgICAgICAgICBbYWxwaGFfMV0iciIoYWxwaGFfMSksIFtka10iZiIoZGspCisgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcGhpMVs0XSkgeworICAgICAgICAgICAgYWxwaGFfMFswXSA9IDA7CisgICAgICAgICAgICBhbHBoYV8wWzFdID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDZdLCAgICAgMCglW2FscGhhXzFdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wN10sICAgICA0KCVbYWxwaGFfMV0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVsLnMgICAlW3RlbXBfcmVhbF0sICVbdGVtcDZdLCAgICAgJVt0ZW1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQucyAgICVbdGVtcF9yZWFsXSwgJVt0ZW1wX3JlYWxdLCAlW3RlbXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wX3JlYWxdLCAlW3RlbXBfcmVhbF0sICVbdGVtcDddLCAlW3RlbXAzXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVsLnMgICAlW3RlbXBfaW1dLCAgICVbdGVtcDddLCAgICAgJVt0ZW1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQucyAgICVbdGVtcF9pbV0sICAgJVt0ZW1wX2ltXSwgICAlW3RlbXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm5tc3ViLnMgJVt0ZW1wX2ltXSwgICAlW3RlbXBfaW1dLCAgICVbdGVtcDZdLCAlW3RlbXAzXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAiZGl2LnMgICAlW3RlbXBfcmVhbF0sICVbdGVtcF9yZWFsXSwgJVt0ZW1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJkaXYucyAgICVbdGVtcF9pbV0sICAgJVt0ZW1wX2ltXSwgICAlW3RlbXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm5lZy5zICAgJVt0ZW1wX3JlYWxdLCAlW3RlbXBfcmVhbF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibmVnLnMgICAlW3RlbXBfaW1dLCAgICVbdGVtcF9pbV0gICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzd2MxICAgICVbdGVtcF9yZWFsXSwgMCglW2FscGhhXzBdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3YzEgICAgJVt0ZW1wX2ltXSwgICA0KCVbYWxwaGFfMF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW3RlbXBfcmVhbF0iPSZmIih0ZW1wX3JlYWwpLCBbdGVtcF9pbV0iPSZmIih0ZW1wX2ltKSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wNl0iPSZmIih0ZW1wNiksIFt0ZW1wN10iPSZmIih0ZW1wNyksCisgICAgICAgICAgICAgICAgICBbcmVzMV0iPSZmIihyZXMxKSwgW3JlczJdIj0mZiIocmVzMikKKyAgICAgICAgICAgICAgICA6IFthbHBoYV8xXSJyIihhbHBoYV8xKSwgW2FscGhhXzBdInIiKGFscGhhXzApLAorICAgICAgICAgICAgICAgICAgW3RlbXAwXSJmIih0ZW1wMCksIFt0ZW1wMV0iZiIodGVtcDEpLCBbdGVtcDJdImYiKHRlbXAyKSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wM10iZiIodGVtcDMpLCBbdGVtcDRdImYiKHRlbXA0KSwgW3RlbXA1XSJmIih0ZW1wNSkKKyAgICAgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxXSwgICAgICAwKCVbYWxwaGFfMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDJdLCAgICAgIDQoJVthbHBoYV8xXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wX3JlYWxdLCAgMCglW2FscGhhXzBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXBfaW1dLCAgICA0KCVbYWxwaGFfMF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICVbcmVzMV0sICAgICAgICVbdGVtcDFdLCAgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgJVtyZXMxXSwgICAgICAgJVtyZXMxXSwgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICAlW3JlczJdLCAgICAgICAlW3RlbXBfcmVhbF0sICAlW3RlbXBfcmVhbF0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICVbcmVzMl0sICAgICAgICVbcmVzMl0sICAgICAgICVbdGVtcF9pbV0sICAlW3RlbXBfaW1dICBcblx0IgorCisgICAgICAgICAgICA6IFt0ZW1wX3JlYWxdIj0mZiIodGVtcF9yZWFsKSwgW3RlbXBfaW1dIj0mZiIodGVtcF9pbSksCisgICAgICAgICAgICAgIFt0ZW1wMV0iPSZmIih0ZW1wMSksIFt0ZW1wMl0iPSZmIih0ZW1wMiksCisgICAgICAgICAgICAgIFtyZXMxXSI9JmYiKHJlczEpLCBbcmVzMl0iPSZmIihyZXMyKQorICAgICAgICAgICAgOiBbYWxwaGFfMV0iciIoYWxwaGFfMSksIFthbHBoYV8wXSJyIihhbHBoYV8wKQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworCisgICAgICAgIGlmIChyZXMxID49IDE2LjBmIHx8IHJlczIgPj0gMTYuMGYpIHsKKyAgICAgICAgICAgIGFscGhhXzFbMF0gPSAwOworICAgICAgICAgICAgYWxwaGFfMVsxXSA9IDA7CisgICAgICAgICAgICBhbHBoYV8wWzBdID0gMDsKKyAgICAgICAgICAgIGFscGhhXzBbMV0gPSAwOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8qIEhBVkVfTUlQU0ZQVSAqLworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCit2b2lkIGZmX2FhY3Nicl9mdW5jX3B0cl9pbml0X21pcHMoQUFDU0JSQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFX0lOTElORV9BU00KKyAgICBjLT5zYnJfbGZfZ2VuICAgICAgICAgICAgPSBzYnJfbGZfZ2VuX21pcHM7CisgICAgYy0+c2JyX3hfZ2VuICAgICAgICAgICAgID0gc2JyX3hfZ2VuX21pcHM7CisjaWYgSEFWRV9NSVBTRlBVCisgICAgYy0+c2JyX2hmX2ludmVyc2VfZmlsdGVyID0gc2JyX2hmX2ludmVyc2VfZmlsdGVyX21pcHM7CisgICAgYy0+c2JyX2hmX2Fzc2VtYmxlICAgICAgID0gc2JyX2hmX2Fzc2VtYmxlX21pcHM7CisjZW5kaWYgLyogSEFWRV9NSVBTRlBVICovCisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FhY3Nicl9taXBzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FhY3Nicl9taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2YWQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvYWFjc2JyX21pcHMuaApAQCAtMCwwICsxLDQ5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcnM6ICBEam9yZGplIFBlc3V0ICAgKGRqb3JkamVAbWlwcy5jb20pCisgKiAgICAgICAgICAgTWlyamFuYSBWdWxpbiAgIChtdnVsaW5AbWlwcy5jb20pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJlZmVyZW5jZTogbGliYXZjb2RlYy9hYWNzYnIuYworICovCisKKyNpZm5kZWYgQVZDT0RFQ19NSVBTX0FBQ1NCUl9GTE9BVF9ICisjZGVmaW5lIEFWQ09ERUNfTUlQU19BQUNTQlJfRkxPQVRfSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3Nici5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCitzdGF0aWMgdm9pZCBzYnJfcW1mX2FuYWx5c2lzX21pcHMoQVZGbG9hdERTUENvbnRleHQgKmZkc3AsIEZGVENvbnRleHQgKm1kY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUkRTUENvbnRleHQgKnNicmRzcCwgY29uc3QgZmxvYXQgKmluLCBmbG9hdCAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgelszMjBdLCBmbG9hdCBXWzJdWzMyXVszMl1bMl0sIGludCBidWZfaWR4KQoreworICAgIGludCBpOworICAgIGZsb2F0ICp3MDsKKyAgICBmbG9hdCAqdzE7CisgICAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKworICAgIHcwID0geDsKKyAgICB3MSA9IHggKyAxMDI0OworICAgIGZvcihpID0gMDsgaSA8IDM2OyBpKyspCisgICAgeworICAgICAgICAvKiBsb29wIHVucm9sbGVkIDggdGltZXMgKi8KKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDBdLCAgIDAoJVt3MV0pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDFdLCAgIDQoJVt3MV0pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDJdLCAgIDgoJVt3MV0pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDNdLCAgIDEyKCVbdzFdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDRdLCAgIDE2KCVbdzFdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDVdLCAgIDIwKCVbdzFdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDZdLCAgIDI0KCVbdzFdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICVbdGVtcDddLCAgIDI4KCVbdzFdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDBdLCAgIDAoJVt3MF0pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDFdLCAgIDQoJVt3MF0pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDJdLCAgIDgoJVt3MF0pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDNdLCAgIDEyKCVbdzBdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDRdLCAgIDE2KCVbdzBdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDVdLCAgIDIwKCVbdzBdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDZdLCAgIDI0KCVbdzBdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICVbdGVtcDddLCAgIDI4KCVbdzBdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICVbdzBdLCAgICAgICVbdzBdLCAgICAgMzIgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICVbdzFdLCAgICAgICVbdzFdLCAgICAgMzIgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbdzBdIityIih3MCksIFt3MV0iK3IiKHcxKSwKKyAgICAgICAgICAgICAgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KQorICAgICAgICAgICAgOgorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgIH0KKworICAgIHcwID0geCArIDI4ODsKKyAgICB3MSA9IChmbG9hdCopaW47CisgICAgZm9yKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgeworICAgICAgICAvKiBsb29wIHVucm9sbGVkIDggdGltZXMgKi8KKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW3cxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgJVt0ZW1wMV0sICAgIDQoJVt3MV0pICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgICVbdGVtcDJdLCAgICA4KCVbdzFdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICAlW3RlbXAzXSwgICAgMTIoJVt3MV0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgJVt0ZW1wNF0sICAgIDE2KCVbdzFdKSAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAgICVbdGVtcDVdLCAgICAyMCglW3cxXSkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAgICAlW3RlbXA2XSwgICAgMjQoJVt3MV0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgICAgJVt0ZW1wN10sICAgIDI4KCVbdzFdKSAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbdzBdKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICAlW3RlbXAxXSwgICAgNCglW3cwXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAgJVt0ZW1wMl0sICAgIDgoJVt3MF0pICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgICVbdGVtcDNdLCAgICAxMiglW3cwXSkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICAlW3RlbXA0XSwgICAgMTYoJVt3MF0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAgJVt0ZW1wNV0sICAgIDIwKCVbdzBdKSAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgICVbdGVtcDZdLCAgICAyNCglW3cwXSkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICAlW3RlbXA3XSwgICAgMjgoJVt3MF0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgJVt3MF0sICAgICAgICVbdzBdLCAgICAgMzIgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgICVbdzFdLCAgICAgICAlW3cxXSwgICAgIDMyICAgXG5cdCIKKworICAgICAgICAgICAgOiBbdzBdIityIih3MCksIFt3MV0iK3IiKHcxKSwKKyAgICAgICAgICAgICAgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KQorICAgICAgICAgICAgOgorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7IC8vIG51bVRpbWVTbG90cypSQVRFID0gMTYqMiBhcyA5NjAgc2FtcGxlIGZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2Uoeiwgc2JyX3FtZl93aW5kb3dfZHMsIHgsIDMyMCk7CisgICAgICAgIHNicmRzcC0+c3VtNjR4NSh6KTsKKyAgICAgICAgc2JyZHNwLT5xbWZfcHJlX3NodWZmbGUoeik7CisgICAgICAgIG1kY3QtPmltZGN0X2hhbGYobWRjdCwgeiwgeis2NCk7CisgICAgICAgIHNicmRzcC0+cW1mX3Bvc3Rfc2h1ZmZsZShXW2J1Zl9pZHhdW2ldLCB6KTsKKyAgICAgICAgeCArPSAzMjsKKyAgICB9Cit9CisKKyNpZiBIQVZFX01JUFNGUFUKK3N0YXRpYyB2b2lkIHNicl9xbWZfc3ludGhlc2lzX21pcHMoRkZUQ29udGV4dCAqbWRjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUkRTUENvbnRleHQgKnNicmRzcCwgQVZGbG9hdERTUENvbnRleHQgKmZkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0LCBmbG9hdCBYWzJdWzM4XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtZGN0X2J1ZlsyXVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqdjAsIGludCAqdl9vZmYsIGNvbnN0IHVuc2lnbmVkIGludCBkaXYpCit7CisgICAgaW50IGksIG47CisgICAgY29uc3QgZmxvYXQgKnNicl9xbWZfd2luZG93ID0gZGl2ID8gc2JyX3FtZl93aW5kb3dfZHMgOiBzYnJfcW1mX3dpbmRvd191czsKKyAgICBjb25zdCBpbnQgc3RlcCA9IDEyOCA+PiBkaXY7CisgICAgZmxvYXQgKnY7CisgICAgZmxvYXQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMzsKKyAgICBmbG9hdCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDE5OworICAgIGZsb2F0ICp2djAsICpzMCwgKmRzdDsKKyAgICBkc3QgPSBvdXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgICBpZiAoKnZfb2ZmIDwgc3RlcCkgeworICAgICAgICAgICAgaW50IHNhdmVkX3NhbXBsZXMgPSAoMTI4MCAtIDEyOCkgPj4gZGl2OworICAgICAgICAgICAgbWVtY3B5KCZ2MFtTQlJfU1lOVEhFU0lTX0JVRl9TSVpFIC0gc2F2ZWRfc2FtcGxlc10sIHYwLCBzYXZlZF9zYW1wbGVzICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgICAgICAqdl9vZmYgPSBTQlJfU1lOVEhFU0lTX0JVRl9TSVpFIC0gc2F2ZWRfc2FtcGxlcyAtIHN0ZXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqdl9vZmYgLT0gc3RlcDsKKyAgICAgICAgfQorICAgICAgICB2ID0gdjAgKyAqdl9vZmY7CisgICAgICAgIGlmIChkaXYpIHsKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCAzMjsgbisrKSB7CisgICAgICAgICAgICAgICAgWFswXVtpXVsgICBuXSA9IC1YWzBdW2ldW25dOworICAgICAgICAgICAgICAgIFhbMF1baV1bMzIrbl0gPSAgWFsxXVtpXVszMS1uXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1kY3QtPmltZGN0X2hhbGYobWRjdCwgbWRjdF9idWZbMF0sIFhbMF1baV0pOworICAgICAgICAgICAgc2JyZHNwLT5xbWZfZGVpbnRfbmVnKHYsIG1kY3RfYnVmWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNicmRzcC0+bmVnX29kZF82NChYWzFdW2ldKTsKKyAgICAgICAgICAgIG1kY3QtPmltZGN0X2hhbGYobWRjdCwgbWRjdF9idWZbMF0sIFhbMF1baV0pOworICAgICAgICAgICAgbWRjdC0+aW1kY3RfaGFsZihtZGN0LCBtZGN0X2J1ZlsxXSwgWFsxXVtpXSk7CisgICAgICAgICAgICBzYnJkc3AtPnFtZl9kZWludF9iZmx5KHYsIG1kY3RfYnVmWzFdLCBtZGN0X2J1ZlswXSk7CisgICAgICAgIH0KKworICAgICAgICBpZihkaXYgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgKnYwX2VuZDsKKyAgICAgICAgICAgIHZ2MCA9IHY7CisgICAgICAgICAgICB2MF9lbmQgPSB2ICsgNjA7CisgICAgICAgICAgICBzMCA9IChmbG9hdCopc2JyX3FtZl93aW5kb3c7CisKKyAgICAgICAgICAgIC8qIDEwIGNhbGxzIG9mIGZ1bmN0aW9uIHZlY3Rvcl9mbXVsX2FkZCBtZXJnZWQgaW50byBvbmUgbG9vcAorICAgICAgICAgICAgICAgYW5kIGxvb3AgdW5yb2xsZWQgNCB0aW1lcyAqLworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAiLnNldCAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIi5zZXQgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgIDAoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA1XSwgICAwKCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNl0sICAgNCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDddLCAgIDQoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA4XSwgICA4KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wOV0sICAgOCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEwXSwgIDEyKCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxMV0sICAxMiglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTJdLCAgNzY4KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEzXSwgIDI1NiglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxNF0sICA3NzIoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTVdLCAgMjYwKCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE2XSwgIDc3NiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxN10sICAyNjQoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMThdLCAgNzgwKCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE5XSwgIDI2OCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wMF0sICAgJVt0ZW1wNF0sICAgJVt0ZW1wNV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgIDEwMjQoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVsLnMgICAlW3RlbXAxXSwgICAlW3RlbXA2XSwgICAlW3RlbXA3XSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICAgNTEyKCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdWwucyAgICVbdGVtcDJdLCAgICVbdGVtcDhdLCAgICVbdGVtcDldICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA2XSwgICAxMDI4KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wM10sICAgJVt0ZW1wMTBdLCAgJVt0ZW1wMTFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDddLCAgIDUxNiglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAlW3RlbXAxMl0sICAlW3RlbXAxM10gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wOF0sICAgMTAzMiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICVbdGVtcDE0XSwgICVbdGVtcDE1XSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA5XSwgICA1MjAoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wMTZdLCAgJVt0ZW1wMTddICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEwXSwgIDEwMzYoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW3RlbXAxOF0sICAlW3RlbXAxOV0gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTFdLCAgNTI0KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEyXSwgIDE3OTIoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxM10sICA3NjgoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTRdLCAgMTc5NiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE1XSwgIDc3MiglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxNl0sICAxODAwKCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTddLCAgNzc2KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE4XSwgIDE4MDQoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxOV0sICA3ODAoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wNF0sICAgJVt0ZW1wNV0gICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgIDIwNDgoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW3RlbXA2XSwgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICAgMTAyNCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbdGVtcDhdLCAgICVbdGVtcDldICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA2XSwgICAyMDUyKCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVt0ZW1wMTBdLCAgJVt0ZW1wMTFdICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDddLCAgIDEwMjgoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAlW3RlbXAxMl0sICAlW3RlbXAxM10gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wOF0sICAgMjA1NiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICVbdGVtcDE0XSwgICVbdGVtcDE1XSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA5XSwgICAxMDMyKCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wMTZdLCAgJVt0ZW1wMTddICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEwXSwgIDIwNjAoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW3RlbXAxOF0sICAlW3RlbXAxOV0gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTFdLCAgMTAzNiglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEyXSwgIDI4MTYoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxM10sICAxMjgwKCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTRdLCAgMjgyMCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE1XSwgIDEyODQoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxNl0sICAyODI0KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTddLCAgMTI4OCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE4XSwgIDI4MjgoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxOV0sICAxMjkyKCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wNF0sICAgJVt0ZW1wNV0gICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgIDMwNzIoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW3RlbXA2XSwgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICAgMTUzNiglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbdGVtcDhdLCAgICVbdGVtcDldICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA2XSwgICAzMDc2KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVt0ZW1wMTBdLCAgJVt0ZW1wMTFdICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDddLCAgIDE1NDAoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAlW3RlbXAxMl0sICAlW3RlbXAxM10gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wOF0sICAgMzA4MCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICVbdGVtcDE0XSwgICVbdGVtcDE1XSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA5XSwgICAxNTQ0KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wMTZdLCAgJVt0ZW1wMTddICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEwXSwgIDMwODQoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW3RlbXAxOF0sICAlW3RlbXAxOV0gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTFdLCAgMTU0OCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEyXSwgIDM4NDAoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxM10sICAxNzkyKCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTRdLCAgMzg0NCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE1XSwgIDE3OTYoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxNl0sICAzODQ4KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTddLCAgMTgwMCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE4XSwgIDM4NTIoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxOV0sICAxODA0KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wNF0sICAgJVt0ZW1wNV0gICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgIDQwOTYoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW3RlbXA2XSwgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICAgMjA0OCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbdGVtcDhdLCAgICVbdGVtcDldICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA2XSwgICA0MTAwKCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVt0ZW1wMTBdLCAgJVt0ZW1wMTFdICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDddLCAgIDIwNTIoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAlW3RlbXAxMl0sICAlW3RlbXAxM10gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wOF0sICAgNDEwNCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICVbZHN0XSwgICAgICVbZHN0XSwgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW3RlbXAxNF0sICAlW3RlbXAxNV0gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wOV0sICAgMjA1NiglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICVbczBdLCAgICAgICVbczBdLCAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW3RlbXAxNl0sICAlW3RlbXAxN10gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTBdLCAgNDEwOCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICVbdjBdLCAgICAgICVbdjBdLCAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW3RlbXAxOF0sICAlW3RlbXAxOV0gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTFdLCAgMjA0NCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEyXSwgIDQ4NDgoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxM10sICAyMjg4KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTRdLCAgNDg1MiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE1XSwgIDIyOTIoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxNl0sICA0ODU2KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTddLCAgMjI5NiglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE4XSwgIDQ4NjAoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxOV0sICAyMzAwKCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wNF0sICAgJVt0ZW1wNV0gICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgIDAoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW3RlbXA2XSwgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICAgMCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbdGVtcDhdLCAgICVbdGVtcDldICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA2XSwgICA0KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVt0ZW1wMTBdLCAgJVt0ZW1wMTFdICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDddLCAgIDQoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAlW3RlbXAxMl0sICAlW3RlbXAxM10gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wOF0sICAgOCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICVbdGVtcDE0XSwgICVbdGVtcDE1XSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA5XSwgICA4KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wMTZdLCAgJVt0ZW1wMTddICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEwXSwgIDEyKCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW3RlbXAxOF0sICAlW3RlbXAxOV0gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTFdLCAgMTIoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEyXSwgIDc2OCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxM10sICAyNTYoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTRdLCAgNzcyKCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE1XSwgIDI2MCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxNl0sICA3NzYoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTddLCAgMjY0KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE4XSwgIDc4MCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxOV0sICAyNjgoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3YzEgICAgJVt0ZW1wMF0sICAgLTE2KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDFdLCAgIC0xMiglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICAlW3RlbXAyXSwgICAtOCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImJuZSAgICAgJVt2MF0sICAgICAgJVt2MF9lbmRdLCAgMWIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICIgc3djMSAgICVbdGVtcDNdLCAgIC00KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVsLnMgICAlW3RlbXAwXSwgICAlW3RlbXA0XSwgICAlW3RlbXA1XSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNF0sICAgMTAyNCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdWwucyAgICVbdGVtcDFdLCAgICVbdGVtcDZdLCAgICVbdGVtcDddICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA1XSwgICA1MTIoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wMl0sICAgJVt0ZW1wOF0sICAgJVt0ZW1wOV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDZdLCAgIDEwMjgoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVsLnMgICAlW3RlbXAzXSwgICAlW3RlbXAxMF0sICAlW3RlbXAxMV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wN10sICAgNTE2KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICVbdGVtcDEyXSwgICVbdGVtcDEzXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA4XSwgICAxMDMyKCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVt0ZW1wMTRdLCAgJVt0ZW1wMTVdICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDldLCAgIDUyMCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW3RlbXAxNl0sICAlW3RlbXAxN10gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTBdLCAgMTAzNiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbdGVtcDE4XSwgICVbdGVtcDE5XSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxMV0sICA1MjQoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTJdLCAgMTc5MiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEzXSwgIDc2OCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxNF0sICAxNzk2KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTVdLCAgNzcyKCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE2XSwgIDE4MDAoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxN10sICA3NzYoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMThdLCAgMTgwNCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE5XSwgIDc4MCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAlW3RlbXA0XSwgICAlW3RlbXA1XSAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNF0sICAgMjA0OCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICVbdGVtcDZdLCAgICVbdGVtcDddICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA1XSwgICAxMDI0KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wOF0sICAgJVt0ZW1wOV0gICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDZdLCAgIDIwNTIoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW3RlbXAxMF0sICAlW3RlbXAxMV0gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wN10sICAgMTAyOCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICVbdGVtcDEyXSwgICVbdGVtcDEzXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA4XSwgICAyMDU2KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVt0ZW1wMTRdLCAgJVt0ZW1wMTVdICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDldLCAgIDEwMzIoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW3RlbXAxNl0sICAlW3RlbXAxN10gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTBdLCAgMjA2MCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbdGVtcDE4XSwgICVbdGVtcDE5XSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxMV0sICAxMDM2KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTJdLCAgMjgxNiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEzXSwgIDEyODAoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxNF0sICAyODIwKCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTVdLCAgMTI4NCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE2XSwgIDI4MjQoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxN10sICAxMjg4KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMThdLCAgMjgyOCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE5XSwgIDEyOTIoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAlW3RlbXA0XSwgICAlW3RlbXA1XSAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNF0sICAgMzA3MiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICVbdGVtcDZdLCAgICVbdGVtcDddICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA1XSwgICAxNTM2KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wOF0sICAgJVt0ZW1wOV0gICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDZdLCAgIDMwNzYoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW3RlbXAxMF0sICAlW3RlbXAxMV0gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wN10sICAgMTU0MCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICVbdGVtcDEyXSwgICVbdGVtcDEzXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA4XSwgICAzMDgwKCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVt0ZW1wMTRdLCAgJVt0ZW1wMTVdICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDldLCAgIDE1NDQoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW3RlbXAxNl0sICAlW3RlbXAxN10gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTBdLCAgMzA4NCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbdGVtcDE4XSwgICVbdGVtcDE5XSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxMV0sICAxNTQ4KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTJdLCAgMzg0MCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEzXSwgIDE3OTIoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxNF0sICAzODQ0KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTVdLCAgMTc5NiglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE2XSwgIDM4NDgoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxN10sICAxODAwKCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMThdLCAgMzg1MiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE5XSwgIDE4MDQoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAlW3RlbXA0XSwgICAlW3RlbXA1XSAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNF0sICAgNDA5NiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICVbdGVtcDZdLCAgICVbdGVtcDddICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA1XSwgICAyMDQ4KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wOF0sICAgJVt0ZW1wOV0gICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDZdLCAgIDQxMDAoJVt2MF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW3RlbXAxMF0sICAlW3RlbXAxMV0gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wN10sICAgMjA1MiglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICVbdGVtcDEyXSwgICVbdGVtcDEzXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA4XSwgICA0MTA0KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVt0ZW1wMTRdLCAgJVt0ZW1wMTVdICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDldLCAgIDIwNTYoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW3RlbXAxNl0sICAlW3RlbXAxN10gIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTBdLCAgNDEwOCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbdGVtcDE4XSwgICVbdGVtcDE5XSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxMV0sICAyMDYwKCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTJdLCAgNDg2NCglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEzXSwgIDIzMDQoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxNF0sICA0ODY4KCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMTVdLCAgMjMwOCglW3MwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICVbdGVtcDRdLCAgICVbdGVtcDVdICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxNl0sICA0ODcyKCVbdjBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVt0ZW1wNl0sICAgJVt0ZW1wN10gICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDE3XSwgIDIzMTIoJVtzMF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW3RlbXA4XSwgICAlW3RlbXA5XSAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMThdLCAgNDg3NiglW3YwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbdGVtcDEwXSwgICVbdGVtcDExXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxOV0sICAyMzE2KCVbczBdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wMTJdLCAgJVt0ZW1wMTNdICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICVbZHN0XSwgICAgICVbZHN0XSwgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW3RlbXAxNF0sICAlW3RlbXAxNV0gIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wMTZdLCAgJVt0ZW1wMTddICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbdGVtcDE4XSwgICVbdGVtcDE5XSAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICAlW3RlbXAwXSwgICAtMTYoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3YzEgICAgJVt0ZW1wMV0sICAgLTEyKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDJdLCAgIC04KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICAlW3RlbXAzXSwgICAtNCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIi5zZXQgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgOiBbZHN0XSIrciIoZHN0KSwgW3YwXSIrciIodnYwKSwgW3MwXSIrciIoczApLAorICAgICAgICAgICAgICAgICAgW3RlbXAwXSI9JmYiKHRlbXAwKSwgW3RlbXAxXSI9JmYiKHRlbXAxKSwgW3RlbXAyXSI9JmYiKHRlbXAyKSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wM10iPSZmIih0ZW1wMyksIFt0ZW1wNF0iPSZmIih0ZW1wNCksIFt0ZW1wNV0iPSZmIih0ZW1wNSksCisgICAgICAgICAgICAgICAgICBbdGVtcDZdIj0mZiIodGVtcDYpLCBbdGVtcDddIj0mZiIodGVtcDcpLCBbdGVtcDhdIj0mZiIodGVtcDgpLAorICAgICAgICAgICAgICAgICAgW3RlbXA5XSI9JmYiKHRlbXA5KSwgW3RlbXAxMF0iPSZmIih0ZW1wMTApLCBbdGVtcDExXSI9JmYiKHRlbXAxMSksCisgICAgICAgICAgICAgICAgICBbdGVtcDEyXSI9JmYiKHRlbXAxMiksIFt0ZW1wMTNdIj0mZiIodGVtcDEzKSwgW3RlbXAxNF0iPSZmIih0ZW1wMTQpLAorICAgICAgICAgICAgICAgICAgW3RlbXAxNV0iPSZmIih0ZW1wMTUpLCBbdGVtcDE2XSI9JmYiKHRlbXAxNiksIFt0ZW1wMTddIj0mZiIodGVtcDE3KSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wMThdIj0mZiIodGVtcDE4KSwgW3RlbXAxOV0iPSZmIih0ZW1wMTkpCisgICAgICAgICAgICAgICAgOiBbdjBfZW5kXSJyIih2MF9lbmQpCisgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsICAgKG91dCwgdiAgICAgICAgICAgICAgICAsIHNicl9xbWZfd2luZG93ICAgICAgICAgICAgICAgICAgICAgICAsIDY0ID4+IGRpdik7CisgICAgICAgICAgICBmZHNwLT52ZWN0b3JfZm11bF9hZGQob3V0LCB2ICsgKCAxOTIgPj4gZGl2KSwgc2JyX3FtZl93aW5kb3cgKyAoIDY0ID4+IGRpdiksIG91dCAgICwgNjQgPj4gZGl2KTsKKyAgICAgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX2FkZChvdXQsIHYgKyAoIDI1NiA+PiBkaXYpLCBzYnJfcW1mX3dpbmRvdyArICgxMjggPj4gZGl2KSwgb3V0ICAgLCA2NCA+PiBkaXYpOworICAgICAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICggNDQ4ID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKDE5MiA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgICAgICBmZHNwLT52ZWN0b3JfZm11bF9hZGQob3V0LCB2ICsgKCA1MTIgPj4gZGl2KSwgc2JyX3FtZl93aW5kb3cgKyAoMjU2ID4+IGRpdiksIG91dCAgICwgNjQgPj4gZGl2KTsKKyAgICAgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX2FkZChvdXQsIHYgKyAoIDcwNCA+PiBkaXYpLCBzYnJfcW1mX3dpbmRvdyArICgzMjAgPj4gZGl2KSwgb3V0ICAgLCA2NCA+PiBkaXYpOworICAgICAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICggNzY4ID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKDM4NCA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgICAgICBmZHNwLT52ZWN0b3JfZm11bF9hZGQob3V0LCB2ICsgKCA5NjAgPj4gZGl2KSwgc2JyX3FtZl93aW5kb3cgKyAoNDQ4ID4+IGRpdiksIG91dCAgICwgNjQgPj4gZGl2KTsKKyAgICAgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX2FkZChvdXQsIHYgKyAoMTAyNCA+PiBkaXYpLCBzYnJfcW1mX3dpbmRvdyArICg1MTIgPj4gZGl2KSwgb3V0ICAgLCA2NCA+PiBkaXYpOworICAgICAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgdiArICgxMjE2ID4+IGRpdiksIHNicl9xbWZfd2luZG93ICsgKDU3NiA+PiBkaXYpLCBvdXQgICAsIDY0ID4+IGRpdik7CisgICAgICAgICAgICBvdXQgKz0gNjQgPj4gZGl2OworICAgICAgICB9CisgICAgfQorfQorCisjZGVmaW5lIHNicl9xbWZfYW5hbHlzaXMgc2JyX3FtZl9hbmFseXNpc19taXBzCisjZGVmaW5lIHNicl9xbWZfc3ludGhlc2lzIHNicl9xbWZfc3ludGhlc2lzX21pcHMKKworI2VuZGlmIC8qIEhBVkVfTUlQU0ZQVSAqLworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCisjZW5kaWYgLyogQVZDT0RFQ19NSVBTX0FBQ1NCUl9GTE9BVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FjM2RzcF9taXBzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FjM2RzcF9taXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzYzZmMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvYWMzZHNwX21pcHMuYwpAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcnM6ICBCcmFuaW1pciBWYXNpYyAoYnZhc2ljQG1pcHMuY29tKQorICogICAgICAgICAgIE5lZGVsamtvIEJhYmljIChuYmFiaWNAbWlwcy5jb20pCisgKgorICogVmFyaW91cyBBQy0zIERTUCBVdGlscyBvcHRpbWl6ZWQgZm9yIE1JUFMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUmVmZXJlbmNlOiBsaWJhdmNvZGVjL2FjM2RzcC5jCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYWMzZHNwLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYzMuaCIKKworCisjaWYgSEFWRV9JTkxJTkVfQVNNCisjaWYgSEFWRV9NSVBTRFNQUjEKK3N0YXRpYyB2b2lkIGFjM19iaXRfYWxsb2NfY2FsY19iYXBfbWlwcyhpbnQxNl90ICptYXNrLCBpbnQxNl90ICpwc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbnJfb2Zmc2V0LCBpbnQgZmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYmFwX3RhYiwgdWludDhfdCAqYmFwKQoreworICAgIGludCBiYW5kLCBiYW5kX2VuZCwgY29uZDsKKyAgICBpbnQgbSwgYWRkcmVzczEsIGFkZHJlc3MyOworICAgIGludDE2X3QgKnBzZDEsICpwc2RfZW5kOworICAgIHVpbnQ4X3QgKmJhcDE7CisKKyAgICBpZiAoc25yX29mZnNldCA9PSAtOTYwKSB7CisgICAgICAgIG1lbXNldChiYXAsIDAsIEFDM19NQVhfQ09FRlMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHNkMSA9ICZwc2Rbc3RhcnRdOworICAgIGJhcDEgPSAmYmFwW3N0YXJ0XTsKKyAgICBiYW5kID0gZmZfYWMzX2Jpbl90b19iYW5kX3RhYltzdGFydF07CisKKyAgICBkbyB7CisgICAgICAgIG0gPSAoRkZNQVgobWFza1tiYW5kXSAtIHNucl9vZmZzZXQgLSBmbG9vciwgMCkgJiAweDFGRTApICsgZmxvb3I7CisgICAgICAgIGJhbmRfZW5kID0gZmZfYWMzX2JhbmRfc3RhcnRfdGFiWysrYmFuZF07CisgICAgICAgIGJhbmRfZW5kID0gRkZNSU4oYmFuZF9lbmQsIGVuZCk7CisgICAgICAgIHBzZF9lbmQgPSBwc2QgKyBiYW5kX2VuZCAtIDE7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAic2x0ICAgICAgICAlW2NvbmRdLCAgICAgICAgJVtwc2QxXSwgICAgICAgICVbcHNkX2VuZF0gIFxuXHQiCisgICAgICAgICAgICAiYmVxeiAgICAgICAlW2NvbmRdLCAgICAgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibGggICAgICAgICAlW2FkZHJlc3MxXSwgICAgMCglW3BzZDFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibGggICAgICAgICAlW2FkZHJlc3MyXSwgICAgMiglW3BzZDFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW3BzZDFdLCAgICAgICAgJVtwc2QxXSwgICAgICAgIDQgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgICVbbV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JhICAgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgIDUgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgIC0zMiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2hsbF9zLncgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgIDI2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICAgICAlW2FkZHJlc3MyXSwgICAgJVthZGRyZXNzMl0sICAgICVbbV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JhICAgICAgICAlW2FkZHJlc3MyXSwgICAgJVthZGRyZXNzMl0sICAgIDUgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JhICAgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgIDI2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgIDMyICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibGJ1eCAgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0oJVtiYXBfdGFiXSkgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW2FkZHJlc3MyXSwgICAgJVthZGRyZXNzMl0sICAgIC0zMiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2hsbF9zLncgICAlW2FkZHJlc3MyXSwgICAgJVthZGRyZXNzMl0sICAgIDI2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2IgICAgICAgICAlW2FkZHJlc3MxXSwgICAgMCglW2JhcDFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAlW2NvbmRdLCAgICAgICAgJVtwc2QxXSwgICAgICAgICVbcHNkX2VuZF0gIFxuXHQiCisgICAgICAgICAgICAic3JhICAgICAgICAlW2FkZHJlc3MyXSwgICAgJVthZGRyZXNzMl0sICAgIDI2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW2FkZHJlc3MyXSwgICAgJVthZGRyZXNzMl0sICAgIDMyICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibGJ1eCAgICAgICAlW2FkZHJlc3MyXSwgICAgJVthZGRyZXNzMl0oJVtiYXBfdGFiXSkgICAgIFxuXHQiCisgICAgICAgICAgICAic2IgICAgICAgICAlW2FkZHJlc3MyXSwgICAgMSglW2JhcDFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW2JhcDFdLCAgICAgICAgJVtiYXAxXSwgICAgICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYm5leiAgICAgICAlW2NvbmRdLCAgICAgICAgMmIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW3BzZF9lbmRdLCAgICAgJVtwc2RfZW5kXSwgICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2x0ICAgICAgICAlW2NvbmRdLCAgICAgICAgJVtwc2QxXSwgICAgICAgICVbcHNkX2VuZF0gIFxuXHQiCisgICAgICAgICAgICAiYmVxeiAgICAgICAlW2NvbmRdLCAgICAgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibGggICAgICAgICAlW2FkZHJlc3MxXSwgICAgMCglW3BzZDFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW3BzZDFdLCAgICAgICAgJVtwc2QxXSwgICAgICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3VidSAgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgICVbbV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JhICAgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgIDUgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgIC0zMiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2hsbF9zLncgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgIDI2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JhICAgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgIDI2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0sICAgIDMyICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibGJ1eCAgICAgICAlW2FkZHJlc3MxXSwgICAgJVthZGRyZXNzMV0oJVtiYXBfdGFiXSkgICAgIFxuXHQiCisgICAgICAgICAgICAic2IgICAgICAgICAlW2FkZHJlc3MxXSwgICAgMCglW2JhcDFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW2JhcDFdLCAgICAgICAgJVtiYXAxXSwgICAgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW2FkZHJlc3MxXSI9JnIiKGFkZHJlc3MxKSwgW2FkZHJlc3MyXSI9JnIiKGFkZHJlc3MyKSwKKyAgICAgICAgICAgICAgW2NvbmRdIj0mciIoY29uZCksIFtiYXAxXSIrciIoYmFwMSksCisgICAgICAgICAgICAgIFtwc2QxXSIrciIocHNkMSksIFtwc2RfZW5kXSIrciIocHNkX2VuZCkKKyAgICAgICAgICAgIDogW21dInIiKG0pLCBbYmFwX3RhYl0iciIoYmFwX3RhYikKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICB9IHdoaWxlIChlbmQgPiBiYW5kX2VuZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFjM191cGRhdGVfYmFwX2NvdW50c19taXBzKHVpbnQxNl90IG1hbnRfY250WzE2XSwgdWludDhfdCAqYmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKK3sKKyAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJhbmRpICAgJVt0ZW1wM10sICAgJVtsZW5dLCAgICAgICAgIDMgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAgICVbdGVtcDJdLCAgICVbYmFwXSwgICAgICAgICAlW2xlbl0gICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAlW3RlbXA0XSwgICAlW2JhcF0sICAgICAgICAgJVt0ZW1wM10gICAgICAgIFxuXHQiCisgICAgICAgICJiZXEgICAgJVt0ZW1wMl0sICAgJVt0ZW1wNF0sICAgICAgIDRmICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxidSAgICAlW3RlbXAwXSwgICAtMSglW3RlbXAyXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgJVt0ZW1wNV0sICAgLTIoJVt0ZW1wMl0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICVbdGVtcDZdLCAgIC0zKCVbdGVtcDJdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNsbCAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgICAgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICAgJVt0ZW1wMF0sICAgJVttYW50X2NudF0sICAgICVbdGVtcDBdICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICVbdGVtcDVdLCAgICVbdGVtcDVdLCAgICAgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAlW3RlbXA1XSwgICAlW21hbnRfY250XSwgICAgJVt0ZW1wNV0gICAgICAgIFxuXHQiCisgICAgICAgICJsaHUgICAgJVt0ZW1wMV0sICAgMCglW3RlbXAwXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAlW3RlbXA2XSwgICAlW21hbnRfY250XSwgICAgJVt0ZW1wNl0gICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgIDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICVbdGVtcDFdLCAgIDAoJVt0ZW1wMF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxodSAgICAlW3RlbXAxXSwgICAwKCVbdGVtcDVdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgJVt0ZW1wN10sICAgLTQoJVt0ZW1wMl0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgICAtNCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgJVt0ZW1wMV0sICAgMCglW3RlbXA1XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGh1ICAgICVbdGVtcDFdLCAgIDAoJVt0ZW1wNl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNsbCAgICAlW3RlbXA3XSwgICAlW3RlbXA3XSwgICAgICAgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICAgJVt0ZW1wN10sICAgJVttYW50X2NudF0sICAgICVbdGVtcDddICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbdGVtcDFdLCAgICVbdGVtcDFdLDEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAlW3RlbXAxXSwgICAwKCVbdGVtcDZdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaHUgICAgJVt0ZW1wMV0sICAgMCglW3RlbXA3XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAlW3RlbXAxXSwgICAwKCVbdGVtcDddKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmUgICAgJVt0ZW1wMl0sICAgJVt0ZW1wNF0sICAgICAgIDFiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJlcXogICAlW3RlbXAzXSwgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAgICAtMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxidSAgICAlW3RlbXAwXSwgICAtMSglW3RlbXAyXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgIC0xICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2xsICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAlW3RlbXAwXSwgICAlW21hbnRfY250XSwgICAgJVt0ZW1wMF0gICAgICAgIFxuXHQiCisgICAgICAgICJsaHUgICAgJVt0ZW1wMV0sICAgMCglW3RlbXAwXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAlW3RlbXAxXSwgICAwKCVbdGVtcDBdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJiZ3R6ICAgJVt0ZW1wM10sICAgM2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFt0ZW1wMF0gIj0mciIgKHRlbXAwKSwgW3RlbXAxXSAiPSZyIiAodGVtcDEpLAorICAgICAgICAgIFt0ZW1wMl0gIj0mciIgKHRlbXAyKSwgW3RlbXAzXSAiPSZyIiAodGVtcDMpLAorICAgICAgICAgIFt0ZW1wNF0gIj0mciIgKHRlbXA0KSwgW3RlbXA1XSAiPSZyIiAodGVtcDUpLAorICAgICAgICAgIFt0ZW1wNl0gIj0mciIgKHRlbXA2KSwgW3RlbXA3XSAiPSZyIiAodGVtcDcpCisgICAgICAgIDogW2xlbl0gInIiIChsZW4pLCBbYmFwXSAiciIgKGJhcCksCisgICAgICAgICAgW21hbnRfY250XSAiciIgKG1hbnRfY250KQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKyNlbmRpZgorCisjaWYgSEFWRV9NSVBTRlBVICYmIEhBVkVfTUlQUzMyUjIKK3N0YXRpYyB2b2lkIGZsb2F0X3RvX2ZpeGVkMjRfbWlwcyhpbnQzMl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIHVuc2lnbmVkIGludCBsZW4pCit7CisgICAgY29uc3QgZmxvYXQgc2NhbGUgPSAxIDw8IDI0OworICAgIGZsb2F0IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKworICAgIGRvIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAibHdjMSAgICAgICAlW3NyYzBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVtzcmMxXSwgICAgNCglW3NyY10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbc3JjMl0sICAgIDgoJVtzcmNdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAlW3NyYzNdLCAgICAxMiglW3NyY10pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVtzcmM0XSwgICAgMTYoJVtzcmNdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbc3JjNV0sICAgIDIwKCVbc3JjXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAlW3NyYzZdLCAgICAyNCglW3NyY10pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVtzcmM3XSwgICAgMjgoJVtzcmNdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICAgICVbc3JjMF0sICAgICVbc3JjMF0sICAgICVbc2NhbGVdICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICAgICAlW3NyYzFdLCAgICAlW3NyYzFdLCAgICAlW3NjYWxlXSAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgICAgJVtzcmMyXSwgICAgJVtzcmMyXSwgICAgJVtzY2FsZV0gICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICAgICVbc3JjM10sICAgICVbc3JjM10sICAgICVbc2NhbGVdICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICAgICAlW3NyYzRdLCAgICAlW3NyYzRdLCAgICAlW3NjYWxlXSAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgICAgJVtzcmM1XSwgICAgJVtzcmM1XSwgICAgJVtzY2FsZV0gICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICAgICVbc3JjNl0sICAgICVbc3JjNl0sICAgICVbc2NhbGVdICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICAgICAlW3NyYzddLCAgICAlW3NyYzddLCAgICAlW3NjYWxlXSAgICBcblx0IgorICAgICAgICAgICAgImN2dC53LnMgICAgJVtzcmMwXSwgICAgJVtzcmMwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJjdnQudy5zICAgICVbc3JjMV0sICAgICVbc3JjMV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiY3Z0LncucyAgICAlW3NyYzJdLCAgICAlW3NyYzJdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImN2dC53LnMgICAgJVtzcmMzXSwgICAgJVtzcmMzXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJjdnQudy5zICAgICVbc3JjNF0sICAgICVbc3JjNF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiY3Z0LncucyAgICAlW3NyYzVdLCAgICAlW3NyYzVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImN2dC53LnMgICAgJVtzcmM2XSwgICAgJVtzcmM2XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJjdnQudy5zICAgICVbc3JjN10sICAgICVbc3JjN10gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZjMSAgICAgICAlW3RlbXAwXSwgICAlW3NyYzBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1mYzEgICAgICAgJVt0ZW1wMV0sICAgJVtzcmMxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtZmMxICAgICAgICVbdGVtcDJdLCAgICVbc3JjMl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZjMSAgICAgICAlW3RlbXAzXSwgICAlW3NyYzNdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1mYzEgICAgICAgJVt0ZW1wNF0sICAgJVtzcmM0XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtZmMxICAgICAgICVbdGVtcDVdLCAgICVbc3JjNV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZjMSAgICAgICAlW3RlbXA2XSwgICAlW3NyYzZdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1mYzEgICAgICAgJVt0ZW1wN10sICAgJVtzcmM3XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICAgICVbdGVtcDBdLCAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAgICAlW3RlbXAxXSwgICA0KCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgICAgJVt0ZW1wMl0sICAgOCglW2RzdF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICAgICVbdGVtcDNdLCAgIDEyKCVbZHN0XSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAgICAlW3RlbXA0XSwgICAxNiglW2RzdF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICAgICAgJVt0ZW1wNV0sICAgMjAoJVtkc3RdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAgICAgICVbdGVtcDZdLCAgIDI0KCVbZHN0XSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgICAgICAlW3RlbXA3XSwgICAyOCglW2RzdF0pICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFtkc3RdICIrciIgKGRzdCksIFtzcmNdICIrciIgKHNyYyksCisgICAgICAgICAgICAgIFtzcmMwXSAiPSZmIiAoc3JjMCksIFtzcmMxXSAiPSZmIiAoc3JjMSksCisgICAgICAgICAgICAgIFtzcmMyXSAiPSZmIiAoc3JjMiksIFtzcmMzXSAiPSZmIiAoc3JjMyksCisgICAgICAgICAgICAgIFtzcmM0XSAiPSZmIiAoc3JjNCksIFtzcmM1XSAiPSZmIiAoc3JjNSksCisgICAgICAgICAgICAgIFtzcmM2XSAiPSZmIiAoc3JjNiksIFtzcmM3XSAiPSZmIiAoc3JjNyksCisgICAgICAgICAgICAgIFt0ZW1wMF0gIj1yIiAodGVtcDApLCBbdGVtcDFdICI9ciIgKHRlbXAxKSwKKyAgICAgICAgICAgICAgW3RlbXAyXSAiPXIiICh0ZW1wMiksIFt0ZW1wM10gIj1yIiAodGVtcDMpLAorICAgICAgICAgICAgICBbdGVtcDRdICI9ciIgKHRlbXA0KSwgW3RlbXA1XSAiPXIiICh0ZW1wNSksCisgICAgICAgICAgICAgIFt0ZW1wNl0gIj1yIiAodGVtcDYpLCBbdGVtcDddICI9ciIgKHRlbXA3KQorICAgICAgICAgICAgOiBbc2NhbGVdICJmIiAoc2NhbGUpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgICAgIHNyYyA9IHNyYyArIDg7CisgICAgICAgIGRzdCA9IGRzdCArIDg7CisgICAgICAgIGxlbiAtPSA4OworICAgIH0gd2hpbGUgKGxlbiA+IDApOworfQorCitzdGF0aWMgdm9pZCBhYzNfZG93bm1peF9taXBzKGZsb2F0ICoqc2FtcGxlcywgZmxvYXQgKCptYXRyaXgpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gsIGludCBsZW4pCit7CisgICAgaW50IGksIGosIGkxLCBpMiwgaTM7CisgICAgZmxvYXQgdjAsIHYxLCB2MiwgdjM7CisgICAgZmxvYXQgdjQsIHY1LCB2Niwgdjc7CisgICAgZmxvYXQgc2FtcGxlczAsIHNhbXBsZXMxLCBzYW1wbGVzMiwgc2FtcGxlczMsIG1hdHJpeF9qLCBtYXRyaXhfajI7CisgICAgZmxvYXQgKnNhbXBsZXNfcCwqbWF0cml4X3AsICoqc2FtcGxlc194LCAqKnNhbXBsZXNfZW5kLCAqKnNhbXBsZXNfc3c7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAiLnNldCAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiLnNldCAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJsaSAgICAgJVtpMV0sICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzbGwgICAgJVtsZW5dLCAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZlICAgJVtpXSwgICAgICAgICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzbGwgICAgJVtqXSwgICAgICAgICAgICVbaW5fY2hdLCAgICAgICAgICAgICAgIDIgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImJuZSAgICAlW291dF9jaF0sICAgICAgJVtpMV0sICAgICAgICAgICAgICAgICAgM2YgICAgICAgICAgXG5cdCIgICAvLyBpZiAob3V0X2NoID09IDIpCisgICAgICAgICIgbGkgICAgJVtpMl0sICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAvLyBzdGFydCBvZiB0aGUgZm9yIGxvb3AgKGZvciAoaSA9IDA7IGkgPCBsZW47IGkrPTQpKQorICAgICAgICAibW92ZSAgICVbbWF0cml4X3BdLCAgICAlW21hdHJpeF0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZSAgICVbc2FtcGxlc194XSwgICAlW3NhbXBsZXNdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICR6ZXJvLCAgICAgICAgICAlW3YwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICR6ZXJvLCAgICAgICAgICAlW3YxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICR6ZXJvLCAgICAgICAgICAlW3YyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICR6ZXJvLCAgICAgICAgICAlW3YzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICR6ZXJvLCAgICAgICAgICAlW3Y0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICR6ZXJvLCAgICAgICAgICAlW3Y1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICR6ZXJvLCAgICAgICAgICAlW3Y2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICR6ZXJvLCAgICAgICAgICAlW3Y3XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbaTFdLCAgICAgICAgICAlW2ldLCAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbaTJdLCAgICAgICAgICAlW2ldLCAgICAgICAgICAgICAgICAgIDggICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbc2FtcGxlc19wXSwgICAwKCVbc2FtcGxlc194XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbaTNdLCAgICAgICAgICAlW2ldLCAgICAgICAgICAgICAgICAgIDEyICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAgICVbc2FtcGxlc19lbmRdLCAlW3NhbXBsZXNfeF0sICAgICAgICAgICVbal0gICAgICAgICBcblx0IgorICAgICAgICAibW92ZSAgICVbc2FtcGxlc19zd10sICAlW3NhbXBsZXNfcF0gICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgLy8gc3RhcnQgb2YgdGhlIGlubmVyIGZvciBsb29wIChmb3IgKGogPSAwOyBqIDwgaW5fY2g7IGorKykpCisgICAgICAgICJsd2MxICAgJVttYXRyaXhfal0sICAgIDAoJVttYXRyaXhfcF0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJVttYXRyaXhfajJdLCAgIDQoJVttYXRyaXhfcF0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd3hjMSAgJVtzYW1wbGVzMF0sICAgICVbaV0oJVtzYW1wbGVzX3BdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd3hjMSAgJVtzYW1wbGVzMV0sICAgICVbaTFdKCVbc2FtcGxlc19wXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd3hjMSAgJVtzYW1wbGVzMl0sICAgICVbaTJdKCVbc2FtcGxlc19wXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd3hjMSAgJVtzYW1wbGVzM10sICAgICVbaTNdKCVbc2FtcGxlc19wXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVttYXRyaXhfcF0sICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtzYW1wbGVzX3hdLCAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVt2MF0sICAgICAgICAgICVbdjBdLCAgJVtzYW1wbGVzMF0sICAgICVbbWF0cml4X2pdIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVt2MV0sICAgICAgICAgICVbdjFdLCAgJVtzYW1wbGVzMV0sICAgICVbbWF0cml4X2pdIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVt2Ml0sICAgICAgICAgICVbdjJdLCAgJVtzYW1wbGVzMl0sICAgICVbbWF0cml4X2pdIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVt2M10sICAgICAgICAgICVbdjNdLCAgJVtzYW1wbGVzM10sICAgICVbbWF0cml4X2pdIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVt2NF0sICAgICAgICAgICVbdjRdLCAgJVtzYW1wbGVzMF0sICAgICVbbWF0cml4X2oyXVxuXHQiCisgICAgICAgICJtYWRkLnMgJVt2NV0sICAgICAgICAgICVbdjVdLCAgJVtzYW1wbGVzMV0sICAgICVbbWF0cml4X2oyXVxuXHQiCisgICAgICAgICJtYWRkLnMgJVt2Nl0sICAgICAgICAgICVbdjZdLCAgJVtzYW1wbGVzMl0sICAgICVbbWF0cml4X2oyXVxuXHQiCisgICAgICAgICJtYWRkLnMgJVt2N10sICAgICAgICAgICVbdjddLCAgJVtzYW1wbGVzM10sICAgICVbbWF0cml4X2oyXVxuXHQiCisgICAgICAgICJibmUgICAgJVtzYW1wbGVzX3hdLCAgICVbc2FtcGxlc19lbmRdLCAgICAgICAgIDFiICAgICAgICAgIFxuXHQiCisgICAgICAgICIgbHcgICAgJVtzYW1wbGVzX3BdLCAgIDAoJVtzYW1wbGVzX3hdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImx3ICAgICAlW3NhbXBsZXNfcF0sICAgNCglW3NhbXBsZXNdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3eGMxICAlW3YwXSwgICAgICAgICAgJVtpXSglW3NhbXBsZXNfc3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3eGMxICAlW3YxXSwgICAgICAgICAgJVtpMV0oJVtzYW1wbGVzX3N3XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3eGMxICAlW3YyXSwgICAgICAgICAgJVtpMl0oJVtzYW1wbGVzX3N3XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3eGMxICAlW3YzXSwgICAgICAgICAgJVtpM10oJVtzYW1wbGVzX3N3XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3eGMxICAlW3Y0XSwgICAgICAgICAgJVtpXSglW3NhbXBsZXNfcF0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW2ldLCAgICAgICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3eGMxICAlW3Y1XSwgICAgICAgICAgJVtpMV0oJVtzYW1wbGVzX3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3eGMxICAlW3Y2XSwgICAgICAgICAgJVtpMl0oJVtzYW1wbGVzX3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICAlW2ldLCAgICAgICAgICAgJVtsZW5dLCAgICAgICAgICAgICAgICAgMmIgICAgICAgICAgXG5cdCIKKyAgICAgICAgIiBzd3hjMSAlW3Y3XSwgICAgICAgICAgJVtpM10oJVtzYW1wbGVzX3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICVbb3V0X2NoXSwgICAgICAlW2kyXSwgICAgICAgICAgICAgICAgICA2ZiAgICAgICAgICBcblx0IiAgIC8vIGlmIChvdXRfY2ggPT0gMSkKKyAgICAgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiNTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIC8vIHN0YXJ0IG9mIHRoZSBvdXRlciBmb3IgbG9vcCAoZm9yIChpID0gMDsgaSA8IGxlbjsgaSs9NCkpCisgICAgICAgICJtb3ZlICAgJVttYXRyaXhfcF0sICAgICVbbWF0cml4XSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZlICAgJVtzYW1wbGVzX3hdLCAgICVbc2FtcGxlc10gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgJHplcm8sICAgICAgICAgICVbdjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgJHplcm8sICAgICAgICAgICVbdjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgJHplcm8sICAgICAgICAgICVbdjJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgJHplcm8sICAgICAgICAgICVbdjNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtpMV0sICAgICAgICAgICVbaV0sICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtpMl0sICAgICAgICAgICVbaV0sICAgICAgICAgICAgICAgICAgOCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVtzYW1wbGVzX3BdLCAgIDAoJVtzYW1wbGVzX3hdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtpM10sICAgICAgICAgICVbaV0sICAgICAgICAgICAgICAgICAgMTIgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICAgJVtzYW1wbGVzX2VuZF0sICVbc2FtcGxlc194XSwgICAgICAgICAgJVtqXSAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZlICAgJVtzYW1wbGVzX3N3XSwgICVbc2FtcGxlc19wXSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAvLyBzdGFydCBvZiB0aGUgaW5uZXIgZm9yIGxvb3AgKGZvciAoaiA9IDA7IGogPCBpbl9jaDsgaisrKSkKKyAgICAgICAgImx3YzEgICAlW21hdHJpeF9qXSwgICAgMCglW21hdHJpeF9wXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3eGMxICAlW3NhbXBsZXMwXSwgICAgJVtpXSglW3NhbXBsZXNfcF0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3eGMxICAlW3NhbXBsZXMxXSwgICAgJVtpMV0oJVtzYW1wbGVzX3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3eGMxICAlW3NhbXBsZXMyXSwgICAgJVtpMl0oJVtzYW1wbGVzX3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3eGMxICAlW3NhbXBsZXMzXSwgICAgJVtpM10oJVtzYW1wbGVzX3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW21hdHJpeF9wXSwgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW3NhbXBsZXNfeF0sICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3YwXSwgICAgICAgICAgJVt2MF0sICAlW3NhbXBsZXMwXSwgICAgJVttYXRyaXhfal0gXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3YxXSwgICAgICAgICAgJVt2MV0sICAlW3NhbXBsZXMxXSwgICAgJVttYXRyaXhfal0gXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3YyXSwgICAgICAgICAgJVt2Ml0sICAlW3NhbXBsZXMyXSwgICAgJVttYXRyaXhfal0gXG5cdCIKKyAgICAgICAgIm1hZGQucyAlW3YzXSwgICAgICAgICAgJVt2M10sICAlW3NhbXBsZXMzXSwgICAgJVttYXRyaXhfal0gXG5cdCIKKyAgICAgICAgImJuZSAgICAlW3NhbXBsZXNfeF0sICAgJVtzYW1wbGVzX2VuZF0sICAgICAgICAgNGIgICAgICAgICAgXG5cdCIKKyAgICAgICAgIiBsdyAgICAlW3NhbXBsZXNfcF0sICAgMCglW3NhbXBsZXNfeF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAic3d4YzEgICVbdjBdLCAgICAgICAgICAlW2ldKCVbc2FtcGxlc19zd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbaV0sICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3d4YzEgICVbdjFdLCAgICAgICAgICAlW2kxXSglW3NhbXBsZXNfc3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3d4YzEgICVbdjJdLCAgICAgICAgICAlW2kyXSglW3NhbXBsZXNfc3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICVbaV0sICAgICAgICAgICAlW2xlbl0sICAgICAgICAgICAgICAgICA1YiAgICAgICAgICBcblx0IgorICAgICAgICAiIHN3eGMxICVbdjNdLCAgICAgICAgICAlW2kzXSglW3NhbXBsZXNfc3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIuc2V0ICAgcG9wIgorICAgICAgICA6W3NhbXBsZXNfcF0iPSZyIihzYW1wbGVzX3ApLCBbbWF0cml4X2pdIj0mZiIobWF0cml4X2opLCBbbWF0cml4X2oyXSI9JmYiKG1hdHJpeF9qMiksCisgICAgICAgICBbc2FtcGxlczBdIj0mZiIoc2FtcGxlczApLCBbc2FtcGxlczFdIj0mZiIoc2FtcGxlczEpLAorICAgICAgICAgW3NhbXBsZXMyXSI9JmYiKHNhbXBsZXMyKSwgW3NhbXBsZXMzXSI9JmYiKHNhbXBsZXMzKSwKKyAgICAgICAgIFt2MF0iPSZmIih2MCksIFt2MV0iPSZmIih2MSksIFt2Ml0iPSZmIih2MiksIFt2M10iPSZmIih2MyksCisgICAgICAgICBbdjRdIj0mZiIodjQpLCBbdjVdIj0mZiIodjUpLCBbdjZdIj0mZiIodjYpLCBbdjddIj0mZiIodjcpLAorICAgICAgICAgW3NhbXBsZXNfeF0iPSZyIihzYW1wbGVzX3gpLCBbbWF0cml4X3BdIj0mciIobWF0cml4X3ApLAorICAgICAgICAgW3NhbXBsZXNfZW5kXSI9JnIiKHNhbXBsZXNfZW5kKSwgW3NhbXBsZXNfc3ddIj0mciIoc2FtcGxlc19zdyksCisgICAgICAgICBbaTFdIj0mciIoaTEpLCBbaTJdIj0mciIoaTIpLCBbaTNdIj0mciIoaTMpLCBbaV0iPSZyIihpKSwKKyAgICAgICAgIFtqXSI9JnIiKGopLCBbbGVuXSIrciIobGVuKQorICAgICAgICA6W3NhbXBsZXNdInIiKHNhbXBsZXMpLCBbbWF0cml4XSJyIihtYXRyaXgpLAorICAgICAgICAgW2luX2NoXSJyIihpbl9jaCksIFtvdXRfY2hdInIiKG91dF9jaCkKKyAgICAgICAgOiJtZW1vcnkiCisgICAgKTsKK30KKyNlbmRpZgorI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCit2b2lkIGZmX2FjM2RzcF9pbml0X21pcHMoQUMzRFNQQ29udGV4dCAqYywgaW50IGJpdF9leGFjdCkgeworI2lmIEhBVkVfSU5MSU5FX0FTTQorI2lmIEhBVkVfTUlQU0RTUFIxCisgICAgYy0+Yml0X2FsbG9jX2NhbGNfYmFwID0gYWMzX2JpdF9hbGxvY19jYWxjX2JhcF9taXBzOworICAgIGMtPnVwZGF0ZV9iYXBfY291bnRzICA9IGFjM191cGRhdGVfYmFwX2NvdW50c19taXBzOworI2VuZGlmCisjaWYgSEFWRV9NSVBTRlBVICYmIEhBVkVfTUlQUzMyUjIKKyAgICBjLT5mbG9hdF90b19maXhlZDI0ID0gZmxvYXRfdG9fZml4ZWQyNF9taXBzOworICAgIGMtPmRvd25taXggICAgICAgICAgPSBhYzNfZG93bm1peF9taXBzOworI2VuZGlmCisjZW5kaWYKKworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hY2VscF9maWx0ZXJzX21pcHMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvYWNlbHBfZmlsdGVyc19taXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkOTgwYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvYWNlbHBfZmlsdGVyc19taXBzLmMKQEAgLTAsMCArMSwyMTYgQEAKKyAvKgorICogQ29weXJpZ2h0IChjKSAyMDEyCisgKiAgICAgIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBDYWxpZm9ybmlhLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQXV0aG9yOiAgTmVkZWxqa28gQmFiaWMgKG5iYWJpY0BtaXBzLmNvbSkKKyAqCisgKiB2YXJpb3VzIGZpbHRlcnMgZm9yIEFDRUxQLWJhc2VkIGNvZGVjcyBvcHRpbWl6ZWQgZm9yIE1JUFMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUmVmZXJlbmNlOiBsaWJhdmNvZGVjL2FjZWxwX2ZpbHRlcnMuYworICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2FjZWxwX2ZpbHRlcnMuaCIKKworI2lmIEhBVkVfSU5MSU5FX0FTTQorc3RhdGljIHZvaWQgZmZfYWNlbHBfaW50ZXJwb2xhdGVmX21pcHMoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmZpbHRlcl9jb2VmZnMsIGludCBwcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhY19wb3MsIGludCBmaWx0ZXJfbGVuZ3RoLCBpbnQgbGVuZ3RoKQoreworICAgIGludCBuLCBpOworICAgIGludCBwcmVjID0gcHJlY2lzaW9uICogNDsKKyAgICBpbnQgZmNfb2Zmc2V0ID0gcHJlY2lzaW9uIC0gZnJhY19wb3M7CisgICAgZmxvYXQgaW5fdmFsX3AsIGluX3ZhbF9tLCBmY192YWxfcCwgZmNfdmFsX207CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbGVuZ3RoOyBuKyspIHsKKyAgICAgICAgLyoqCisgICAgICAgICogZm91ciBwb2ludGVycyBhcmUgZGVmaW5lZCBpbiBvcmRlciB0byBtaW5pbWl6ZSBudW1iZXIgb2YKKyAgICAgICAgKiBjb21wdXRhdGlvbnMgZG9uZSBpbiBpbm5lciBsb29wCisgICAgICAgICovCisgICAgICAgIGNvbnN0IGZsb2F0ICpwX2luX3AgPSAmaW5bbl07CisgICAgICAgIGNvbnN0IGZsb2F0ICpwX2luX20gPSAmaW5bbi0xXTsKKyAgICAgICAgY29uc3QgZmxvYXQgKnBfZmlsdGVyX2NvZWZmc19wID0gJmZpbHRlcl9jb2VmZnNbZnJhY19wb3NdOworICAgICAgICBjb25zdCBmbG9hdCAqcF9maWx0ZXJfY29lZmZzX20gPSBmaWx0ZXJfY29lZmZzICsgZmNfb2Zmc2V0OworICAgICAgICBmbG9hdCB2ID0gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyX2xlbmd0aDtpKyspIHsKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICJsd2MxICAgJVtpbl92YWxfcF0sICAgICAgICAgICAwKCVbcF9pbl9wXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAlW2ZjX3ZhbF9wXSwgICAgICAgICAgIDAoJVtwX2ZpbHRlcl9jb2VmZnNfcF0pICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICVbaW5fdmFsX21dLCAgICAgICAgICAgMCglW3BfaW5fbV0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgJVtmY192YWxfbV0sICAgICAgICAgICAwKCVbcF9maWx0ZXJfY29lZmZzX21dKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZGl1ICAlW3BfaW5fcF0sICAgICAgICAgICAgICVbcF9pbl9wXSwgICAgICAgICAgICAgIDQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICVbdl0sJVt2XSwgICAgICAgICAgICAgJVtpbl92YWxfcF0sJVtmY192YWxfcF0gICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgJVtwX2luX21dLCAgICAgICAgICAgICAlW3BfaW5fbV0sICAgICAgICAgICAgICAtNCAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAlW3BfZmlsdGVyX2NvZWZmc19wXSwgICVbcF9maWx0ZXJfY29lZmZzX3BdLCAgICVbcHJlY10gXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICVbcF9maWx0ZXJfY29lZmZzX21dLCAgJVtwX2ZpbHRlcl9jb2VmZnNfbV0sICAgJVtwcmVjXSBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgJVt2XSwlW3ZdLCVbaW5fdmFsX21dLCAlW2ZjX3ZhbF9tXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6IFt2XSAiPSZmIiAodiksW3BfaW5fcF0gIityIiAocF9pbl9wKSwgW3BfaW5fbV0gIityIiAocF9pbl9tKSwKKyAgICAgICAgICAgICAgICAgIFtwX2ZpbHRlcl9jb2VmZnNfcF0gIityIiAocF9maWx0ZXJfY29lZmZzX3ApLAorICAgICAgICAgICAgICAgICAgW2luX3ZhbF9wXSAiPSZmIiAoaW5fdmFsX3ApLCBbaW5fdmFsX21dICI9JmYiIChpbl92YWxfbSksCisgICAgICAgICAgICAgICAgICBbZmNfdmFsX3BdICI9JmYiIChmY192YWxfcCksIFtmY192YWxfbV0gIj0mZiIgKGZjX3ZhbF9tKSwKKyAgICAgICAgICAgICAgICAgIFtwX2ZpbHRlcl9jb2VmZnNfbV0gIityIiAocF9maWx0ZXJfY29lZmZzX20pCisgICAgICAgICAgICAgICAgOiBbcHJlY10gInIiIChwcmVjKQorICAgICAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgb3V0W25dID0gdjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZmX2FjZWxwX2FwcGx5X29yZGVyXzJfdHJhbnNmZXJfZnVuY3Rpb25fbWlwcyhmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgemVyb19jb2VmZnNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcG9sZV9jb2VmZnNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ2FpbiwgZmxvYXQgbWVtWzJdLCBpbnQgbikKK3sKKyAgICAvKioKKyAgICAqIGxvb3AgaXMgdW5yb2xsZWQgZWlnaHQgdGltZXMKKyAgICAqLworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsd2MxICAgJGYwLCAgICAwKCVbbWVtXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJsZXogICAlW25dLCAgIGZmX2FjZWxwX2FwcGx5X29yZGVyXzJfdHJhbnNmZXJfZnVuY3Rpb25fZW5kJT0gICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICRmMSwgICAgNCglW21lbV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGYyLCAgICAwKCVbcG9sZV9jb2VmZnNdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjMsICAgIDQoJVtwb2xlX2NvZWZmc10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICRmNCwgICAgMCglW3plcm9fY29lZmZzXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGY1LCAgICA0KCVbemVyb19jb2VmZnNdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiZmZfYWNlbHBfYXBwbHlfb3JkZXJfMl90cmFuc2Zlcl9mdW5jdGlvbl9tYWRkJT06ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImx3YzEgICAkZjYsICAgIDAoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICRmOSwgICAgJGYzLCAgICAgICRmMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgJGY3LCAgICAkZjIsICAgICAgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1zdWIucyAkZjcsICAgICRmNywgICAgICAlW2dhaW5dLCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICRmNywgICAgJGY3LCAgICAgICRmOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJGY4LCAgICAkZjcsICAgICAgJGY0LCAgICAgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAkZjgsICAgICRmOCwgICAgICAkZjUsICAgICAkZjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICRmMTEsICAgNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgJGYxMiwgICAkZjMsICAgICAgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAkZjEzLCAgICRmMiwgICAgICAkZjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1Yi5zICRmMTMsICAgJGYxMywgICAgICVbZ2Fpbl0sICRmMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgJGYxMywgICAkZjEzLCAgICAgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAkZjE0LCAgICRmMTMsICAgICAkZjQsICAgICAkZjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICRmMTQsICAgJGYxNCwgICAgICRmNSwgICAgICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgJGY4LCAgICAwKCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjYsICAgIDgoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICRmOSwgICAgJGYzLCAgICAgICRmNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgJGYxNSwgICAkZjIsICAgICAgJGYxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1zdWIucyAkZjE1LCAgICRmMTUsICAgICAlW2dhaW5dLCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICRmMTUsICAgJGYxNSwgICAgICRmOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJGY4LCAgICAkZjE1LCAgICAgJGY0LCAgICAgJGYxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAkZjgsICAgICRmOCwgICAgICAkZjUsICAgICAkZjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICRmMTQsICAgNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGYxMSwgICAxMiglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAkZjEyLCAgICRmMywgICAgICAkZjEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICRmMTYsICAgJGYyLCAgICAgICRmMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtc3ViLnMgJGYxNiwgICAkZjE2LCAgICAgJVtnYWluXSwgJGYxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAkZjE2LCAgICRmMTYsICAgICAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICRmMTQsICAgJGYxNiwgICAgICRmNCwgICAgICRmMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJGYxNCwgICAkZjE0LCAgICAgJGY1LCAgICAgJGYxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAkZjgsICAgIDgoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICRmNiwgICAgMTYoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgJGY5LCAgICAkZjMsICAgICAgJGYxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAkZjcsICAgICRmMiwgICAgICAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1Yi5zICRmNywgICAgJGY3LCAgICAgICVbZ2Fpbl0sICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgJGY3LCAgICAkZjcsICAgICAgJGY5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAkZjgsICAgICRmNywgICAgICAkZjQsICAgICAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICRmOCwgICAgJGY4LCAgICAgICRmNSwgICAgICRmMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgJGYxNCwgICAxMiglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAkZjExLCAgIDIwKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICRmMTIsICAgJGYzLCAgICAgICRmMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgJGYxMywgICAkZjIsICAgICAgJGY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1zdWIucyAkZjEzLCAgICRmMTMsICAgICAlW2dhaW5dLCAkZjExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICRmMTMsICAgJGYxMywgICAgICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJGYxNCwgICAkZjEzLCAgICAgJGY0LCAgICAgJGY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAkZjE0LCAgICRmMTQsICAgICAkZjUsICAgICAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICRmOCwgICAgMTYoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGY2LCAgICAyNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAkZjksICAgICRmMywgICAgICAkZjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICRmMTUsICAgJGYyLCAgICAgICRmMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtc3ViLnMgJGYxNSwgICAkZjE1LCAgICAgJVtnYWluXSwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAkZjEsICAgICRmMTUsICAgICAkZjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICRmOCwgICAgJGYxLCAgICAgICRmNCwgICAgICRmMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJGY4LCAgICAkZjgsICAgICAgJGY1LCAgICAgJGY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAkZjE0LCAgIDIwKCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICRmMTEsICAgMjgoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgJGYxMiwgICAkZjMsICAgICAgJGYxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAkZjE2LCAgICRmMiwgICAgICAkZjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1Yi5zICRmMTYsICAgJGYxNiwgICAgICVbZ2Fpbl0sICRmMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgJGYwLCAgICAkZjE2LCAgICAgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAkZjE0LCAgICRmMCwgICAgICAkZjQsICAgICAkZjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICRmMTQsICAgJGYxNCwgICAgICRmNSwgICAgICRmMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgJGY4LCAgICAyNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW291dF0sIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbaW5dLCAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtuXSwgICAtOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAkZjE0LCAgIC00KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICVbbl0sICAgZmZfYWNlbHBfYXBwbHlfb3JkZXJfMl90cmFuc2Zlcl9mdW5jdGlvbl9tYWRkJT0gICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgJGYxLCAgICA0KCVbbWVtXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAkZjAsICAgIDAoJVttZW1dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJmZl9hY2VscF9hcHBseV9vcmRlcl8yX3RyYW5zZmVyX2Z1bmN0aW9uX2VuZCU9OiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgOiBbb3V0XSAiK3IiIChvdXQpLAorICAgICAgICAgICBbaW5dICIrciIgKGluKSwgW2dhaW5dICIrZiIgKGdhaW4pLAorICAgICAgICAgICBbbl0gIityIiAobiksIFttZW1dICIrciIgKG1lbSkKKyAgICAgICAgIDogW3plcm9fY29lZmZzXSAiciIgKHplcm9fY29lZmZzKSwKKyAgICAgICAgICAgW3BvbGVfY29lZmZzXSAiciIgKHBvbGVfY29lZmZzKQorICAgICAgICAgOiAiJGYwIiwgIiRmMSIsICIkZjIiLCAiJGYzIiwgIiRmNCIsICIkZjUiLAorICAgICAgICAgICAiJGY2IiwgIiRmNyIsICAiJGY4IiwgIiRmOSIsICIkZjEwIiwgIiRmMTEiLAorICAgICAgICAgICAiJGYxMiIsICIkZjEzIiwgIiRmMTQiLCAiJGYxNSIsICIkZjE2IiwgIm1lbW9yeSIKKyAgICApOworfQorI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCit2b2lkIGZmX2FjZWxwX2ZpbHRlcl9pbml0X21pcHMoQUNFTFBGQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFX0lOTElORV9BU00KKyAgICBjLT5hY2VscF9pbnRlcnBvbGF0ZWYgICAgICAgICAgICAgICAgICAgICAgPSBmZl9hY2VscF9pbnRlcnBvbGF0ZWZfbWlwczsKKyAgICBjLT5hY2VscF9hcHBseV9vcmRlcl8yX3RyYW5zZmVyX2Z1bmN0aW9uICAgPSBmZl9hY2VscF9hcHBseV9vcmRlcl8yX3RyYW5zZmVyX2Z1bmN0aW9uX21pcHM7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvYWNlbHBfdmVjdG9yc19taXBzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FjZWxwX3ZlY3RvcnNfbWlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzBkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FjZWxwX3ZlY3RvcnNfbWlwcy5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyCisgKiAgICAgIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBDYWxpZm9ybmlhLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQXV0aG9yOiAgTmVkZWxqa28gQmFiaWMgKG5iYWJpY0BtaXBzLmNvbSkKKyAqCisgKiBhZGFwdGl2ZSBhbmQgZml4ZWQgY29kZWJvb2sgdmVjdG9yIG9wZXJhdGlvbnMgZm9yIEFDRUxQLWJhc2VkIGNvZGVjcworICogb3B0aW1pemVkIGZvciBNSVBTCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJlZmVyZW5jZTogbGliYXZjb2RlYy9hY2VscF92ZWN0b3JzLmMKKyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYWNlbHBfdmVjdG9ycy5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCitzdGF0aWMgdm9pZCBmZl93ZWlnaHRlZF92ZWN0b3Jfc3VtZl9taXBzKAorICAgICAgICAgICAgICAgICAgZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluX2EsIGNvbnN0IGZsb2F0ICppbl9iLAorICAgICAgICAgICAgICAgICAgZmxvYXQgd2VpZ2h0X2NvZWZmX2EsIGZsb2F0IHdlaWdodF9jb2VmZl9iLCBpbnQgbGVuZ3RoKQoreworICAgIGNvbnN0IGZsb2F0ICphX2VuZCA9IGluX2EgKyBsZW5ndGg7CisKKyAgICAvKiBsb29wIHVucm9sbGVkIHR3byB0aW1lcyAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAiYmxleiAgICVbbGVuZ3RoXSwgZmZfd2VpZ2h0ZWRfdmVjdG9yX3N1bWZfZW5kJT0gICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJmZl93ZWlnaHRlZF92ZWN0b3Jfc3VtZl9tYWRkJT06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGYwLCAgICAgICAwKCVbaW5fYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGYzLCAgICAgICA0KCVbaW5fYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGYxLCAgICAgICAwKCVbaW5fYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGY0LCAgICAgICA0KCVbaW5fYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgJGYyLCAgICAgICAlW3dlaWdodF9jb2VmZl9hXSwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgJGY1LCAgICAgICAlW3dlaWdodF9jb2VmZl9hXSwgJGYzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJGYyLCAgICAgICAkZjIsICAgICAgICAgICAgICAgJVt3ZWlnaHRfY29lZmZfYl0sICRmMSAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJGY1LCAgICAgICAkZjUsICAgICAgICAgICAgICAgJVt3ZWlnaHRfY29lZmZfYl0sICRmNCAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtpbl9hXSwgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtpbl9iXSwgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgJGYyLCAgICAgICAwKCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgJGY1LCAgICAgICA0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtvdXRdLCAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmUgICAlW2luX2FdLCAgICAlW2FfZW5kXSwgICAgICAgICAgZmZfd2VpZ2h0ZWRfdmVjdG9yX3N1bWZfbWFkZCU9IFxuXHQiCisKKyAgICAgICAgImZmX3dlaWdodGVkX3ZlY3Rvcl9zdW1mX2VuZCU9OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFtvdXRdICIrciIgKG91dCksIFtpbl9hXSAiK3IiIChpbl9hKSwgICBbaW5fYl0gIityIiAoaW5fYikKKyAgICAgICAgOiBbd2VpZ2h0X2NvZWZmX2FdICJmIiAod2VpZ2h0X2NvZWZmX2EpLAorICAgICAgICAgIFt3ZWlnaHRfY29lZmZfYl0gImYiICh3ZWlnaHRfY29lZmZfYiksCisgICAgICAgICAgW2xlbmd0aF0gInIiIChsZW5ndGgpLCBbYV9lbmRdInIiKGFfZW5kKQorICAgICAgICA6ICIkZjAiLCAiJGYxIiwgIiRmMiIsICIkZjMiLCAiJGY0IiwgIiRmNSIsICJtZW1vcnkiCisgICAgKTsKK30KKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKwordm9pZCBmZl9hY2VscF92ZWN0b3JzX2luaXRfbWlwcyhBQ0VMUFZDb250ZXh0ICpjKQoreworI2lmIEhBVkVfSU5MSU5FX0FTTQorICAgIGMtPndlaWdodGVkX3ZlY3Rvcl9zdW1mID0gZmZfd2VpZ2h0ZWRfdmVjdG9yX3N1bWZfbWlwczsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hbXJ3YmRlY19taXBzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2FtcndiZGVjX21pcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDZlZDJkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hbXJ3YmRlY19taXBzLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIKKyAqICAgICAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIENhbGlmb3JuaWEuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3I6ICBOZWRlbGprbyBCYWJpYyAobmJhYmljQG1pcHMuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSZWZlcmVuY2U6IGxpYmF2Y29kZWMvYW1yd2JkZWMuYworICovCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYW1yd2JkYXRhLmgiCisjaW5jbHVkZSAiYW1yd2JkZWNfbWlwcy5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCit2b2lkIGhiX2Zpcl9maWx0ZXJfbWlwcyhmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCBmaXJfY29lZltIQl9GSVJfU0laRSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtZW1bSEJfRklSX1NJWkVdLCBjb25zdCBmbG9hdCAqaW4pCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgZGF0YVtBTVJXQl9TRlJfU0laRV8xNmsgKyBIQl9GSVJfU0laRV07IC8vIHBhc3QgYW5kIGN1cnJlbnQgc2FtcGxlcworCisgICAgbWVtY3B5KGRhdGEsIG1lbSwgSEJfRklSX1NJWkUgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtZW1jcHkoZGF0YSArIEhCX0ZJUl9TSVpFLCBpbiwgQU1SV0JfU0ZSX1NJWkVfMTZrICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQU1SV0JfU0ZSX1NJWkVfMTZrOyBpKyspIHsKKyAgICAgICAgZmxvYXQgb3V0cHV0OworICAgICAgICBmbG9hdCAqIHBfZGF0YSA9IChkYXRhK2kpOworCisgICAgICAgIC8qKgorICAgICAgICAqIGlubmVyIGxvb3AgaXMgZW50aXJlbHkgdW5yb2xsZWQgYW5kIGluc3RydWN0aW9ucyBhcmUgc2NoZWR1bGVkCisgICAgICAgICogdG8gbWluaW1pemUgcGlwZWxpbmUgc3RhbGwKKyAgICAgICAgKi8KKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJtdGMxICAgICAgICR6ZXJvLCAgICAgJVtvdXRwdXRdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjAsICAgICAgIDAoJVtwX2RhdGFdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYxLCAgICAgICAwKCVbZmlyX2NvZWZdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMiwgICAgICAgNCglW3BfZGF0YV0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGYwLCAkZjEgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYzLCAgICAgICA0KCVbZmlyX2NvZWZdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmNCwgICAgICAgOCglW3BfZGF0YV0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGYyLCAkZjMgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGY1LCAgICAgICA4KCVbZmlyX2NvZWZdKSAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgImx3YzEgICAgICAgJGYwLCAgICAgICAxMiglW3BfZGF0YV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMSwgICAgICAgMTIoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGY0LCAkZjUgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYyLCAgICAgICAxNiglW3BfZGF0YV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICAgICVbb3V0cHV0XSwgJVtvdXRwdXRdLCAgICAgICAkZjAsICRmMSAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjMsICAgICAgIDE2KCVbZmlyX2NvZWZdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGY0LCAgICAgICAyMCglW3BfZGF0YV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmNSwgICAgICAgMjAoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGYyLCAkZjMgICAgICBcblx0IgorCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjAsICAgICAgIDI0KCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYxLCAgICAgICAyNCglW2Zpcl9jb2VmXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMiwgICAgICAgMjgoJVtwX2RhdGFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGY0LCAkZjUgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYzLCAgICAgICAyOCglW2Zpcl9jb2VmXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICAgICVbb3V0cHV0XSwgJVtvdXRwdXRdLCAgICAgICAkZjAsICRmMSAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjQsICAgICAgIDMyKCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmMiwgJGYzICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmNSwgICAgICAgMzIoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGY0LCAkZjUgICAgICBcblx0IgorCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjAsICAgICAgIDM2KCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYxLCAgICAgICAzNiglW2Zpcl9jb2VmXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMiwgICAgICAgNDAoJVtwX2RhdGFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjMsICAgICAgIDQwKCVbZmlyX2NvZWZdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmMCwgJGYxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmNCwgICAgICAgNDQoJVtwX2RhdGFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjUsICAgICAgIDQ0KCVbZmlyX2NvZWZdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmMiwgJGYzICAgICAgXG5cdCIKKworICAgICAgICAgICAgImx3YzEgICAgICAgJGYwLCAgICAgICA0OCglW3BfZGF0YV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMSwgICAgICAgNDgoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjIsICAgICAgIDUyKCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmNCwgJGY1ICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMywgICAgICAgNTIoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjQsICAgICAgIDU2KCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmMCwgJGYxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmNSwgICAgICAgNTYoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGYyLCAkZjMgICAgICBcblx0IgorCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjAsICAgICAgIDYwKCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYxLCAgICAgICA2MCglW2Zpcl9jb2VmXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMiwgICAgICAgNjQoJVtwX2RhdGFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGY0LCAkZjUgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYzLCAgICAgICA2NCglW2Zpcl9jb2VmXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICAgICVbb3V0cHV0XSwgJVtvdXRwdXRdLCAgICAgICAkZjAsICRmMSAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjQsICAgICAgIDY4KCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmMiwgJGYzICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmNSwgICAgICAgNjgoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGY0LCAkZjUgICAgICBcblx0IgorCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjAsICAgICAgIDcyKCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYxLCAgICAgICA3MiglW2Zpcl9jb2VmXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMiwgICAgICAgNzYoJVtwX2RhdGFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjMsICAgICAgIDc2KCVbZmlyX2NvZWZdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmMCwgJGYxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmNCwgICAgICAgODAoJVtwX2RhdGFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjUsICAgICAgIDgwKCVbZmlyX2NvZWZdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmMiwgJGYzICAgICAgXG5cdCIKKworICAgICAgICAgICAgImx3YzEgICAgICAgJGYwLCAgICAgICA4NCglW3BfZGF0YV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMSwgICAgICAgODQoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjIsICAgICAgIDg4KCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmNCwgJGY1ICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMywgICAgICAgODgoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjQsICAgICAgIDkyKCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmMCwgJGYxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmNSwgICAgICAgOTIoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGYyLCAkZjMgICAgICBcblx0IgorCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjAsICAgICAgIDk2KCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYxLCAgICAgICA5NiglW2Zpcl9jb2VmXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMiwgICAgICAgMTAwKCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGY0LCAkZjUgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYzLCAgICAgICAxMDAoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmNCwgICAgICAgMTA0KCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAgICAlW291dHB1dF0sICVbb3V0cHV0XSwgICAgICAgJGYwLCAkZjEgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGY1LCAgICAgICAxMDQoJVtmaXJfY29lZl0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICAgICVbb3V0cHV0XSwgJVtvdXRwdXRdLCAgICAgICAkZjIsICRmMyAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMCwgICAgICAgMTA4KCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjEsICAgICAgIDEwOCglW2Zpcl9jb2VmXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmNCwgJGY1ICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMiwgICAgICAgMTEyKCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjMsICAgICAgIDExMiglW2Zpcl9jb2VmXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmMCwgJGYxICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmNCwgICAgICAgMTE2KCVbcF9kYXRhXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjUsICAgICAgIDExNiglW2Zpcl9jb2VmXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYwLCAgICAgICAxMjAoJVtwX2RhdGFdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICAgICVbb3V0cHV0XSwgJVtvdXRwdXRdLCAgICAgICAkZjIsICRmMyAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjEsICAgICAgIDEyMCglW2Zpcl9jb2VmXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVtvdXRwdXRdLCAlW291dHB1dF0sICAgICAgICRmNCwgJGY1ICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICAgICVbb3V0cHV0XSwgJVtvdXRwdXRdLCAgICAgICAkZjAsICRmMSAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW291dHB1dF0iPSZmIihvdXRwdXQpCisgICAgICAgICAgICA6IFtmaXJfY29lZl0iciIoZmlyX2NvZWYpLCBbcF9kYXRhXSJyIihwX2RhdGEpCisgICAgICAgICAgICA6ICIkZjAiLCAiJGYxIiwgIiRmMiIsICIkZjMiLCAiJGY0IiwgIiRmNSIsICJtZW1vcnkiCisgICAgICAgICk7CisgICAgICAgIG91dFtpXSA9IG91dHB1dDsKKyAgICB9CisgICAgbWVtY3B5KG1lbSwgZGF0YSArIEFNUldCX1NGUl9TSVpFXzE2aywgSEJfRklSX1NJWkUgKiBzaXplb2YoZmxvYXQpKTsKK30KKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvYW1yd2JkZWNfbWlwcy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9hbXJ3YmRlY19taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2OTkxOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvYW1yd2JkZWNfbWlwcy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIKKyAqICAgICAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIENhbGlmb3JuaWEuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3I6ICBOZWRlbGprbyBCYWJpYyAobmJhYmljQG1pcHMuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSZWZlcmVuY2U6IGxpYmF2Y29kZWMvYW1yd2JkZWMuYworICovCisjaWZuZGVmIEFWQ09ERUNfQU1SV0JERUNfTUlQU19ICisjZGVmaW5lIEFWQ09ERUNfQU1SV0JERUNfTUlQU19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX01JUFNGUFUgJiYgSEFWRV9JTkxJTkVfQVNNCit2b2lkIGhiX2Zpcl9maWx0ZXJfbWlwcyhmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCBmaXJfY29lZltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtZW1bXSwgY29uc3QgZmxvYXQgKmluKTsKKyNkZWZpbmUgaGJfZmlyX2ZpbHRlciBoYl9maXJfZmlsdGVyX21pcHMKKyNlbmRpZgorCisjZW5kaWYgLyogQVZDT0RFQ19BTVJXQkRFQ19NSVBTX0ggICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2NlbHBfZmlsdGVyc19taXBzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2NlbHBfZmlsdGVyc19taXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1YjA3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvY2VscF9maWx0ZXJzX21pcHMuYwpAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogIE5lZGVsamtvIEJhYmljIChuYmFiaWNAbWlwcy5jb20pCisgKgorICogdmFyaW91cyBmaWx0ZXJzIGZvciBDRUxQLWJhc2VkIGNvZGVjcyBvcHRpbWl6ZWQgZm9yIE1JUFMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUmVmZXJlbmNlOiBsaWJhdmNvZGVjL2NlbHBfZmlsdGVycy5jCisgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2NlbHBfZmlsdGVycy5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCitzdGF0aWMgdm9pZCBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXJmX21pcHMoZmxvYXQgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZmlsdGVyX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogaW4sIGludCBidWZmZXJfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWx0ZXJfbGVuZ3RoKQoreworICAgIGludCBpLG47CisKKyAgICBmbG9hdCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIGZsb2F0IG9sZF9vdXQwLCBvbGRfb3V0MSwgb2xkX291dDIsIG9sZF9vdXQzOworICAgIGZsb2F0IGEsYixjOworICAgIGNvbnN0IGZsb2F0ICpwX2ZpbHRlcl9jb2VmZnM7CisgICAgZmxvYXQgKnBfb3V0OworCisgICAgYSA9IGZpbHRlcl9jb2VmZnNbMF07CisgICAgYiA9IGZpbHRlcl9jb2VmZnNbMV07CisgICAgYyA9IGZpbHRlcl9jb2VmZnNbMl07CisgICAgYiAtPSBmaWx0ZXJfY29lZmZzWzBdICogZmlsdGVyX2NvZWZmc1swXTsKKyAgICBjIC09IGZpbHRlcl9jb2VmZnNbMV0gKiBmaWx0ZXJfY29lZmZzWzBdOworICAgIGMgLT0gZmlsdGVyX2NvZWZmc1swXSAqIGI7CisKKyAgICBvbGRfb3V0MCA9IG91dFstNF07CisgICAgb2xkX291dDEgPSBvdXRbLTNdOworICAgIG9sZF9vdXQyID0gb3V0Wy0yXTsKKyAgICBvbGRfb3V0MyA9IG91dFstMV07CisgICAgZm9yIChuID0gMDsgbiA8PSBidWZmZXJfbGVuZ3RoIC0gNDsgbis9NCkgeworICAgICAgICBwX2ZpbHRlcl9jb2VmZnMgPSBmaWx0ZXJfY29lZmZzOworICAgICAgICBwX291dCA9IG91dDsKKworICAgICAgICBvdXQwID0gaW5bMF07CisgICAgICAgIG91dDEgPSBpblsxXTsKKyAgICAgICAgb3V0MiA9IGluWzJdOworICAgICAgICBvdXQzID0gaW5bM107CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMiwgICAgIDgoJVtmaWx0ZXJfY29lZmZzXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJGYxLCAgICAgNCglW2ZpbHRlcl9jb2VmZnNdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICAkZjAsICAgICAwKCVbZmlsdGVyX2NvZWZmc10pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbb3V0MF0sICVbb3V0MF0sICAgICAgICAgICAgICRmMiwgJVtvbGRfb3V0MV0gICAgICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtvdXQxXSwgJVtvdXQxXSwgICAgICAgICAgICAgJGYyLCAlW29sZF9vdXQyXSAgICAgIFxuXHQiCisgICAgICAgICAgICAibm1zdWIucyAgICAlW291dDJdLCAlW291dDJdLCAgICAgICAgICAgICAkZjIsICVbb2xkX291dDNdICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICRmMywgICAgIDEyKCVbZmlsdGVyX2NvZWZmc10pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtvdXQwXSwgJVtvdXQwXSwgICAgICAgICAgICAgJGYxLCAlW29sZF9vdXQyXSAgICAgIFxuXHQiCisgICAgICAgICAgICAibm1zdWIucyAgICAlW291dDFdLCAlW291dDFdLCAgICAgICAgICAgICAkZjEsICVbb2xkX291dDNdICAgICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbb3V0Ml0sICVbb3V0Ml0sICAgICAgICAgICAgICRmMywgJVtvbGRfb3V0Ml0gICAgICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtvdXQwXSwgJVtvdXQwXSwgICAgICAgICAgICAgJGYwLCAlW29sZF9vdXQzXSAgICAgIFxuXHQiCisgICAgICAgICAgICAibm1zdWIucyAgICAlW291dDNdLCAlW291dDNdLCAgICAgICAgICAgICAkZjMsICVbb2xkX291dDNdICAgICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbb3V0MV0sICVbb3V0MV0sICAgICAgICAgICAgICRmMywgJVtvbGRfb3V0MV0gICAgICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtvdXQwXSwgJVtvdXQwXSwgICAgICAgICAgICAgJGYzLCAlW29sZF9vdXQwXSAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW291dDBdIitmIihvdXQwKSwgW291dDFdIitmIihvdXQxKSwKKyAgICAgICAgICAgICAgW291dDJdIitmIihvdXQyKSwgW291dDNdIitmIihvdXQzKQorICAgICAgICAgICAgOiBbb2xkX291dDBdImYiKG9sZF9vdXQwKSwgW29sZF9vdXQxXSJmIihvbGRfb3V0MSksCisgICAgICAgICAgICAgIFtvbGRfb3V0Ml0iZiIob2xkX291dDIpLCBbb2xkX291dDNdImYiKG9sZF9vdXQzKSwKKyAgICAgICAgICAgICAgW2ZpbHRlcl9jb2VmZnNdInIiKGZpbHRlcl9jb2VmZnMpCisgICAgICAgICAgICA6ICIkZjAiLCAiJGYxIiwgIiRmMiIsICIkZjMiLCAiJGY0IiwgIm1lbW9yeSIKKyAgICAgICAgKTsKKworICAgICAgICBmb3IgKGkgPSA1OyBpIDw9IGZpbHRlcl9sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW29sZF9vdXQzXSwgLTIwKCVbcF9vdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICRmNSwgICAgICAgICAxNiglW3BfZmlsdGVyX2NvZWZmc10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZGl1ICAgJVtwX291dF0sICAgIC04ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICAlW3BfZmlsdGVyX2NvZWZmc10sIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJubXN1Yi5zICVbb3V0MV0sICAgICAlW291dDFdLCAgICAgICRmNSwgJVtvbGRfb3V0MF0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm5tc3ViLnMgJVtvdXQzXSwgICAgICVbb3V0M10sICAgICAgJGY1LCAlW29sZF9vdXQyXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAkZjQsICAgICAgICAgMTIoJVtwX2ZpbHRlcl9jb2VmZnNdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICVbb2xkX291dDJdLCAtMTYoJVtwX291dF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm5tc3ViLnMgJVtvdXQwXSwgICAgICVbb3V0MF0sICAgICAgJGY1LCAlW29sZF9vdXQzXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibm1zdWIucyAlW291dDJdLCAgICAgJVtvdXQyXSwgICAgICAkZjUsICVbb2xkX291dDFdICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJubXN1Yi5zICVbb3V0MV0sICAgICAlW291dDFdLCAgICAgICRmNCwgJVtvbGRfb3V0M10gICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm5tc3ViLnMgJVtvdXQzXSwgICAgICVbb3V0M10sICAgICAgJGY0LCAlW29sZF9vdXQxXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92LnMgICAlW29sZF9vdXQxXSwgJVtvbGRfb3V0M10gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJubXN1Yi5zICVbb3V0MF0sICAgICAlW291dDBdLCAgICAgICRmNCwgJVtvbGRfb3V0Ml0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm5tc3ViLnMgJVtvdXQyXSwgICAgICVbb3V0Ml0sICAgICAgJGY0LCAlW29sZF9vdXQwXSAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW291dDBdIitmIihvdXQwKSwgW291dDFdIitmIihvdXQxKSwKKyAgICAgICAgICAgICAgICAgIFtvdXQyXSIrZiIob3V0MiksIFtvdXQzXSIrZiIob3V0MyksIFtvbGRfb3V0MF0iK2YiKG9sZF9vdXQwKSwKKyAgICAgICAgICAgICAgICAgIFtvbGRfb3V0MV0iK2YiKG9sZF9vdXQxKSwgW29sZF9vdXQyXSIrZiIob2xkX291dDIpLAorICAgICAgICAgICAgICAgICAgW29sZF9vdXQzXSIrZiIob2xkX291dDMpLFtwX2ZpbHRlcl9jb2VmZnNdIityIihwX2ZpbHRlcl9jb2VmZnMpLAorICAgICAgICAgICAgICAgICAgW3Bfb3V0XSIrciIocF9vdXQpCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIDogIiRmNCIsICIkZjUiLCAibWVtb3J5IgorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIEZGU1dBUChmbG9hdCwgb2xkX291dDAsIG9sZF9vdXQyKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibm1zdWIucyAgICAlW291dDNdLCAlW291dDNdLCAlW2FdLCAlW291dDJdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbb3V0Ml0sICVbb3V0Ml0sICVbYV0sICVbb3V0MV0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtvdXQzXSwgJVtvdXQzXSwgJVtiXSwgJVtvdXQxXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibm1zdWIucyAgICAlW291dDFdLCAlW291dDFdLCAlW2FdLCAlW291dDBdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbb3V0Ml0sICVbb3V0Ml0sICVbYl0sICVbb3V0MF0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVtvdXQzXSwgJVtvdXQzXSwgJVtjXSwgJVtvdXQwXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW291dDBdIitmIihvdXQwKSwgW291dDFdIitmIihvdXQxKSwKKyAgICAgICAgICAgICAgW291dDJdIitmIihvdXQyKSwgW291dDNdIitmIihvdXQzKQorICAgICAgICAgICAgOiBbYV0iZiIoYSksIFtiXSJmIihiKSwgW2NdImYiKGMpCisgICAgICAgICk7CisKKyAgICAgICAgb3V0WzBdID0gb3V0MDsKKyAgICAgICAgb3V0WzFdID0gb3V0MTsKKyAgICAgICAgb3V0WzJdID0gb3V0MjsKKyAgICAgICAgb3V0WzNdID0gb3V0MzsKKworICAgICAgICBvbGRfb3V0MCA9IG91dDA7CisgICAgICAgIG9sZF9vdXQxID0gb3V0MTsKKyAgICAgICAgb2xkX291dDIgPSBvdXQyOworICAgICAgICBvbGRfb3V0MyA9IG91dDM7CisKKyAgICAgICAgb3V0ICs9IDQ7CisgICAgICAgIGluICArPSA0OworICAgIH0KKworICAgIG91dCAtPSBuOworICAgIGluIC09IG47CisgICAgZm9yICg7IG4gPCBidWZmZXJfbGVuZ3RoOyBuKyspIHsKKyAgICAgICAgZmxvYXQgb3V0X3ZhbCwgb3V0X3ZhbF9pLCBmY192YWw7CisgICAgICAgIHBfZmlsdGVyX2NvZWZmcyA9IGZpbHRlcl9jb2VmZnM7CisgICAgICAgIHBfb3V0ID0gJm91dFtuXTsKKyAgICAgICAgb3V0X3ZhbCA9IGluW25dOworICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IGZpbHRlcl9sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibHdjMSAgICAlW2ZjX3ZhbF0sICAgICAgICAgIDAoJVtwX2ZpbHRlcl9jb2VmZnNdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgJVtvdXRfdmFsX2ldLCAgICAgICAtNCglW3Bfb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICVbcF9maWx0ZXJfY29lZmZzXSwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkaXUgICAlW3Bfb3V0XSwgICAgICAgICAgIC00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm5tc3ViLnMgJVtvdXRfdmFsXSwgICAgICAgICAlW291dF92YWxdLCAgICAgICAgICAlW2ZjX3ZhbF0sICVbb3V0X3ZhbF9pXSBcblx0IgorCisgICAgICAgICAgICAgICAgOiBbZmNfdmFsXSI9JmYiKGZjX3ZhbCksIFtvdXRfdmFsXSIrZiIob3V0X3ZhbCksCisgICAgICAgICAgICAgICAgICBbb3V0X3ZhbF9pXSI9JmYiKG91dF92YWxfaSksIFtwX291dF0iK3IiKHBfb3V0KSwKKyAgICAgICAgICAgICAgICAgIFtwX2ZpbHRlcl9jb2VmZnNdIityIihwX2ZpbHRlcl9jb2VmZnMpCisgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgb3V0W25dID0gb3V0X3ZhbDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZmX2NlbHBfbHBfemVyb19zeW50aGVzaXNfZmlsdGVyZl9taXBzKGZsb2F0ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZmlsdGVyX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppbiwgaW50IGJ1ZmZlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsdGVyX2xlbmd0aCkKK3sKKyAgICBpbnQgaSxuOworICAgIGZsb2F0IHN1bV9vdXQ4LCBzdW1fb3V0Nywgc3VtX291dDYsIHN1bV9vdXQ1LCBzdW1fb3V0NCwgZmNfdmFsOworICAgIGZsb2F0IHN1bV9vdXQzLCBzdW1fb3V0Miwgc3VtX291dDE7CisgICAgY29uc3QgZmxvYXQgKnBfZmlsdGVyX2NvZWZmcywgKnBfaW47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgYnVmZmVyX2xlbmd0aDsgbis9OCkgeworICAgICAgICBwX2luID0gJmluW25dOworICAgICAgICBwX2ZpbHRlcl9jb2VmZnMgPSBmaWx0ZXJfY29lZmZzOworICAgICAgICBzdW1fb3V0OCA9IGluW24rN107CisgICAgICAgIHN1bV9vdXQ3ID0gaW5bbis2XTsKKyAgICAgICAgc3VtX291dDYgPSBpbltuKzVdOworICAgICAgICBzdW1fb3V0NSA9IGluW24rNF07CisgICAgICAgIHN1bV9vdXQ0ID0gaW5bbiszXTsKKyAgICAgICAgc3VtX291dDMgPSBpbltuKzJdOworICAgICAgICBzdW1fb3V0MiA9IGluW24rMV07CisgICAgICAgIHN1bV9vdXQxID0gaW5bbl07CisgICAgICAgIGkgPSBmaWx0ZXJfbGVuZ3RoOworCisgICAgICAgIC8qIGkgaXMgYWx3YXlzIGdyZWF0ZXIgdGhhbiAwCisgICAgICAgICogb3V0ZXIgbG9vcCBpcyB1bnJvbGxlZCBlaWdodCB0aW1lcyBzbyB0aGVyZSBpcyBsZXNzIG1lbW9yeSBhY2Nlc3MKKyAgICAgICAgKiBpbm5lciBsb29wIGlzIHVucm9sbGVkIHR3byB0aW1lcworICAgICAgICAqLworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgImZpbHRfbHBfaW5uZXIlPTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbZmNfdmFsXSwgICAwKCVbcF9maWx0ZXJfY29lZmZzXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgJGY3LCAgICAgICAgIDYqNCglW3BfaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAkZjYsICAgICAgICAgNSo0KCVbcF9pbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNSwgICAgICAgICA0KjQoJVtwX2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgJGY0LCAgICAgICAgIDMqNCglW3BfaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAkZjMsICAgICAgICAgMio0KCVbcF9pbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMiwgICAgICAgICA0KCVbcF9pbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgJGYxLCAgICAgICAgIDAoJVtwX2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAkZjAsICAgICAgICAgLTQoJVtwX2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICVbaV0sICAgICAgICAtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgJVtzdW1fb3V0OF0sICVbc3VtX291dDhdLCAgICAgICAgICAlW2ZjX3ZhbF0sICRmNyAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAlW3N1bV9vdXQ3XSwgJVtzdW1fb3V0N10sICAgICAgICAgICVbZmNfdmFsXSwgJGY2ICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICVbc3VtX291dDZdLCAlW3N1bV9vdXQ2XSwgICAgICAgICAgJVtmY192YWxdLCAkZjUgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgJVtzdW1fb3V0NV0sICVbc3VtX291dDVdLCAgICAgICAgICAlW2ZjX3ZhbF0sICRmNCAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAlW3N1bV9vdXQ0XSwgJVtzdW1fb3V0NF0sICAgICAgICAgICVbZmNfdmFsXSwgJGYzICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICVbc3VtX291dDNdLCAlW3N1bV9vdXQzXSwgICAgICAgICAgJVtmY192YWxdLCAkZjIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgJVtzdW1fb3V0Ml0sICVbc3VtX291dDJdLCAgICAgICAgICAlW2ZjX3ZhbF0sICRmMSAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAlW3N1bV9vdXQxXSwgJVtzdW1fb3V0MV0sICAgICAgICAgICVbZmNfdmFsXSwgJGYwICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbZmNfdmFsXSwgICA0KCVbcF9maWx0ZXJfY29lZmZzXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgJGY3LCAgICAgICAgIC04KCVbcF9pbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAlW3BfZmlsdGVyX2NvZWZmc10sIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICVbcF9pbl0sICAgICAtOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgJVtzdW1fb3V0OF0sICVbc3VtX291dDhdLCAgICAgICAgICAlW2ZjX3ZhbF0sICRmNiAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAlW3N1bV9vdXQ3XSwgJVtzdW1fb3V0N10sICAgICAgICAgICVbZmNfdmFsXSwgJGY1ICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICVbc3VtX291dDZdLCAlW3N1bV9vdXQ2XSwgICAgICAgICAgJVtmY192YWxdLCAkZjQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgJVtzdW1fb3V0NV0sICVbc3VtX291dDVdLCAgICAgICAgICAlW2ZjX3ZhbF0sICRmMyAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAlW3N1bV9vdXQ0XSwgJVtzdW1fb3V0NF0sICAgICAgICAgICVbZmNfdmFsXSwgJGYyICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICVbc3VtX291dDNdLCAlW3N1bV9vdXQzXSwgICAgICAgICAgJVtmY192YWxdLCAkZjEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgJVtzdW1fb3V0Ml0sICVbc3VtX291dDJdLCAgICAgICAgICAlW2ZjX3ZhbF0sICRmMCAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAlW3N1bV9vdXQxXSwgJVtzdW1fb3V0MV0sICAgICAgICAgICVbZmNfdmFsXSwgJGY3ICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYmd0eiAgICVbaV0sICAgICAgICBmaWx0X2xwX2lubmVyJT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbc3VtX291dDhdIitmIihzdW1fb3V0OCksIFtzdW1fb3V0N10iK2YiKHN1bV9vdXQ3KSwKKyAgICAgICAgICAgICAgW3N1bV9vdXQ2XSIrZiIoc3VtX291dDYpLCBbc3VtX291dDVdIitmIihzdW1fb3V0NSksCisgICAgICAgICAgICAgIFtzdW1fb3V0NF0iK2YiKHN1bV9vdXQ0KSwgW3N1bV9vdXQzXSIrZiIoc3VtX291dDMpLAorICAgICAgICAgICAgICBbc3VtX291dDJdIitmIihzdW1fb3V0MiksIFtzdW1fb3V0MV0iK2YiKHN1bV9vdXQxKSwKKyAgICAgICAgICAgICAgW2ZjX3ZhbF0iPSZmIihmY192YWwpLCBbcF9maWx0ZXJfY29lZmZzXSIrciIocF9maWx0ZXJfY29lZmZzKSwKKyAgICAgICAgICAgICAgW3BfaW5dIityIihwX2luKSwgW2ldIityIihpKQorICAgICAgICAgICAgOgorICAgICAgICAgICAgOiAiJGYwIiwgIiRmMSIsICIkZjIiLCAiJGYzIiwgIiRmNCIsICIkZjUiLCAiJGY2IiwgIiRmNyIsICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgb3V0W24rN10gPSBzdW1fb3V0ODsKKyAgICAgICAgb3V0W24rNl0gPSBzdW1fb3V0NzsKKyAgICAgICAgb3V0W24rNV0gPSBzdW1fb3V0NjsKKyAgICAgICAgb3V0W24rNF0gPSBzdW1fb3V0NTsKKyAgICAgICAgb3V0W24rM10gPSBzdW1fb3V0NDsKKyAgICAgICAgb3V0W24rMl0gPSBzdW1fb3V0MzsKKyAgICAgICAgb3V0W24rMV0gPSBzdW1fb3V0MjsKKyAgICAgICAgb3V0W25dID0gc3VtX291dDE7CisgICAgfQorfQorI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCit2b2lkIGZmX2NlbHBfZmlsdGVyX2luaXRfbWlwcyhDRUxQRkNvbnRleHQgKmMpCit7CisjaWYgSEFWRV9JTkxJTkVfQVNNCisgICAgYy0+Y2VscF9scF9zeW50aGVzaXNfZmlsdGVyZiAgICAgICAgPSBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXJmX21pcHM7CisgICAgYy0+Y2VscF9scF96ZXJvX3N5bnRoZXNpc19maWx0ZXJmICAgPSBmZl9jZWxwX2xwX3plcm9fc3ludGhlc2lzX2ZpbHRlcmZfbWlwczsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9jZWxwX21hdGhfbWlwcy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9jZWxwX21hdGhfbWlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3Y2NjMjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2NlbHBfbWF0aF9taXBzLmMKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogIE5lZGVsamtvIEJhYmljIChuYmFiaWNAbWlwcy5jb20pCisgKgorICogTWF0aCBvcGVyYXRpb25zIG9wdGltaXplZCBmb3IgTUlQUworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSZWZlcmVuY2U6IGxpYmF2Y29kZWMvY2VscF9tYXRoLmMKKyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvY2VscF9tYXRoLmgiCisKKyNpZiBIQVZFX0lOTElORV9BU00KK3N0YXRpYyBmbG9hdCBmZl9kb3RfcHJvZHVjdGZfbWlwcyhjb25zdCBmbG9hdCogYSwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkKK3sKKyAgICBmbG9hdCBzdW07CisgICAgY29uc3QgZmxvYXQqIGFfZW5kID0gYSArIGxlbmd0aDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibXRjMSAgICR6ZXJvLCAgICAgICVbc3VtXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibGV6ICAgJVtsZW5ndGhdLCAgZmZfZG90X3Byb2R1Y3RmX2VuZCU9ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImZmX2RvdF9wcm9kdWN0Zl9tYWRkJT06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICRmMiwgICAgICAgIDAoJVthXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgJGYxLCAgICAgICAgMCglW2JdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW2FdLCAgICAgICAlW2FdLCAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbYl0sICAgICAgICVbYl0sICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgJVtzdW1dLCAgICAgJVtzdW1dLCAgICAkZjEsICRmMiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICVbYV0sICAgICAgICAlW2FfZW5kXSwgIGZmX2RvdF9wcm9kdWN0Zl9tYWRkJT0gICBcblx0IgorICAgICAgICAiZmZfZG90X3Byb2R1Y3RmX2VuZCU9OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbc3VtXSAiPSZmIiAoc3VtKSwgW2FdICIrciIgKGEpLCBbYl0gIityIiAoYikKKyAgICAgICAgOiBbYV9lbmRdInIiKGFfZW5kKSwgW2xlbmd0aF0gInIiIChsZW5ndGgpCisgICAgICAgIDogIiRmMSIsICIkZjIiLCAibWVtb3J5IgorICAgICk7CisgICAgcmV0dXJuIHN1bTsKK30KKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKwordm9pZCBmZl9jZWxwX21hdGhfaW5pdF9taXBzKENFTFBNQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFX0lOTElORV9BU00KKyAgICBjLT5kb3RfcHJvZHVjdGYgPSBmZl9kb3RfcHJvZHVjdGZfbWlwczsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9jb21wdXRlX2FudGlhbGlhc19maXhlZC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9jb21wdXRlX2FudGlhbGlhc19maXhlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NjdmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2NvbXB1dGVfYW50aWFsaWFzX2ZpeGVkLmgKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIKKyAqICAgICAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIENhbGlmb3JuaWEuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3I6ICBCb2phbiBaaXZrb3ZpYyAoYm9qYW5AbWlwcy5jb20pCisgKgorICogQ29tcHV0ZSBhbnRpYWxpYXMgZnVuY3Rpb24gb3B0aW1pc2VkIGZvciBNSVBTIGZpeGVkLXBvaW50IGFyY2hpdGVjdHVyZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSZWZlcmVuY2U6IGxpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjLmMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTUlQU19DT01QVVRFX0FOVElBTElBU19GSVhFRF9ICisjZGVmaW5lIEFWQ09ERUNfTUlQU19DT01QVVRFX0FOVElBTElBU19GSVhFRF9ICisKKyNpZiBIQVZFX0lOTElORV9BU00KK3N0YXRpYyB2b2lkIGNvbXB1dGVfYW50aWFsaWFzX21pcHNfZml4ZWQoTVBBRGVjb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFudWxlRGVmICpnKQoreworICAgIGludDMyX3QgKnB0ciwgKmNzYTsKKyAgICBpbnQgbiwgaTsKKyAgICBpbnQgTUFYX2xvID0gMHhmZmZmZmZmZjsKKworICAgIC8qIHdlIGFudGlhbGlhcyBvbmx5ICJsb25nIiBiYW5kcyAqLworICAgIGlmIChnLT5ibG9ja190eXBlID09IDIpIHsKKyAgICAgICAgaWYgKCFnLT5zd2l0Y2hfcG9pbnQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8qIFhYWDogY2hlY2sgdGhpcyBmb3IgODAwMEh6IGNhc2UgKi8KKyAgICAgICAgbiA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbiA9IFNCTElNSVQgLSAxOworICAgIH0KKworCisgICAgcHRyID0gZy0+c2JfaHlicmlkICsgMTg7CisKKyAgICBmb3IoaSA9IG47aSA+IDA7aS0tKSB7CisgICAgICAgIGludCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAwMCwgdG1wMTE7CisgICAgICAgIGludCB0ZW1wX3JlZzEsIHRlbXBfcmVnMiwgdGVtcF9yZWczLCB0ZW1wX3JlZzQsIHRlbXBfcmVnNSwgdGVtcF9yZWc2OworICAgICAgICBjc2EgPSAmY3NhX3RhYmxlWzBdWzBdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBpbnN0cnVjdGlvbnMgYXJlIHNjaGVkdWxlZCB0byBtaW5pbWl6ZSBwaXBlbGluZSBzdGFsbC4KKyAgICAgICAgICovCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgImx3ICAgJVt0bXAwXSwgICAgICAtMSo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdG1wMV0sICAgICAgMCo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAlW3RlbXBfcmVnMV0sIDAqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0ZW1wX3JlZzJdLCAyKjQoJVtjc2FdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgICVbdG1wMl0sICAgICAgJVt0bXAwXSwgICAgICAlW3RtcDFdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAlW3RlbXBfcmVnM10sIDMqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bHQgJGFjMCwgICAgICAgICAlW3RtcDJdLCAgICAgICVbdGVtcF9yZWcxXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWx0ICRhYzEsICAgICAgICAgJVt0bXAyXSwgICAgICAlW3RlbXBfcmVnMV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAlW3RtcDAwXSwgICAgIC0yKjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0bXAxMV0sICAgICAxKjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdGVtcF9yZWc0XSwgNCo0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRsbyAlW01BWF9sb10sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10bG8gJHplcm8sICAgICAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtc3ViICRhYzAsICAgICAgICAgJVt0bXAxXSwgICAgICAlW3RlbXBfcmVnMl0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZCAkYWMxLCAgICAgICAgICVbdG1wMF0sICAgICAgJVt0ZW1wX3JlZzNdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZCAgJVt0bXAyXSwgICAgICAlW3RtcDAwXSwgICAgICVbdG1wMTFdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdGVtcF9yZWc1XSwgNio0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsdCAkYWMyLCAgICAgICAgICVbdG1wMl0sICAgICAgJVt0ZW1wX3JlZzRdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bHQgJGFjMywgICAgICAgICAlW3RtcDJdLCAgICAgICVbdGVtcF9yZWc0XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtZmhpICVbdGVtcF9yZWcxXSwgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZoaSAlW3RlbXBfcmVnMl0sICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0ZW1wX3JlZzZdLCA3KjQoJVtjc2FdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGxvICVbTUFYX2xvXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXN1YiAkYWMyLCAgICAgICAgICVbdG1wMTFdLCAgICAgJVt0ZW1wX3JlZzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10bG8gJHplcm8sICAgICAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkICRhYzMsICAgICAgICAgJVt0bXAwMF0sICAgICAlW3RlbXBfcmVnNl0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAlW3RlbXBfcmVnMV0sICVbdGVtcF9yZWcxXSwgMiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgJVt0ZW1wX3JlZzFdLCAtMSo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtZmhpICVbdGVtcF9yZWc0XSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAlW3RlbXBfcmVnMl0sICVbdGVtcF9yZWcyXSwgMiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1maGkgJVt0ZW1wX3JlZzVdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICVbdGVtcF9yZWcyXSwgMCo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAlW3RtcDBdLCAgICAgIC0zKjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0bXAxXSwgICAgICAyKjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdGVtcF9yZWcxXSwgOCo0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAlW3RlbXBfcmVnNF0sICVbdGVtcF9yZWc0XSwgMiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZCAgJVt0bXAyXSwgICAgICAlW3RtcDBdLCAgICAgICVbdG1wMV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICVbdGVtcF9yZWc1XSwgJVt0ZW1wX3JlZzVdLCAyICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsdCAkYWMwLCAgICAgICAgICVbdG1wMl0sICAgICAgJVt0ZW1wX3JlZzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bHQgJGFjMSwgICAgICAgICAlW3RtcDJdLCAgICAgICVbdGVtcF9yZWcxXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICVbdGVtcF9yZWc0XSwgLTIqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAlW3RlbXBfcmVnNV0sIDEqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0ZW1wX3JlZzJdLCAxMCo0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGxvICVbTUFYX2xvXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAlW3RlbXBfcmVnM10sIDExKjQoJVtjc2FdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1zdWIgJGFjMCwgICAgICAgICAlW3RtcDFdLCAgICAgICVbdGVtcF9yZWcyXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGxvICR6ZXJvLCAgICAgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZCAkYWMxLCAgICAgICAgICVbdG1wMF0sICAgICAgJVt0ZW1wX3JlZzNdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0bXAwMF0sICAgICAtNCo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdG1wMTFdLCAgICAgMyo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZoaSAlW3RlbXBfcmVnMV0sICRhYzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0ZW1wX3JlZzRdLCAxMio0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtZmhpICVbdGVtcF9yZWcyXSwgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAlW3RtcDJdLCAgICAgICVbdG1wMDBdLCAgICAgJVt0bXAxMV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bHQgJGFjMiwgICAgICAgICAlW3RtcDJdLCAgICAgICVbdGVtcF9yZWc0XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWx0ICRhYzMsICAgICAgICAgJVt0bXAyXSwgICAgICAlW3RlbXBfcmVnNF0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAlW3RlbXBfcmVnNV0sIDE0KjQoJVtjc2FdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0ZW1wX3JlZzZdLCAxNSo0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICVbdGVtcF9yZWcxXSwgJVt0ZW1wX3JlZzFdLCAyICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRsbyAlW01BWF9sb10sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1zdWIgJGFjMiwgICAgICAgICAlW3RtcDExXSwgICAgICVbdGVtcF9yZWc1XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGxvICR6ZXJvLCAgICAgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZCAkYWMzLCAgICAgICAgICVbdG1wMDBdLCAgICAgJVt0ZW1wX3JlZzZdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsbCAgJVt0ZW1wX3JlZzJdLCAlW3RlbXBfcmVnMl0sIDIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICVbdGVtcF9yZWcxXSwgLTMqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZoaSAlW3RlbXBfcmVnNF0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgJVt0ZW1wX3JlZzJdLCAyKjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtZmhpICVbdGVtcF9yZWc1XSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAlW3RtcDBdLCAgICAgIC01KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0bXAxXSwgICAgICA0KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdGVtcF9yZWcxXSwgMTYqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAlW3RlbXBfcmVnMl0sIDE4KjQoJVtjc2FdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZCAgJVt0bXAyXSwgICAgICAlW3RtcDBdLCAgICAgICVbdG1wMV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdGVtcF9yZWczXSwgMTkqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsdCAkYWMwLCAgICAgICAgICVbdG1wMl0sICAgICAgJVt0ZW1wX3JlZzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bHQgJGFjMSwgICAgICAgICAlW3RtcDJdLCAgICAgICVbdGVtcF9yZWcxXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICVbdGVtcF9yZWc0XSwgJVt0ZW1wX3JlZzRdLCAyICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAlW3RlbXBfcmVnNV0sICVbdGVtcF9yZWc1XSwgMiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgJVt0ZW1wX3JlZzRdLCAtNCo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGxvICVbTUFYX2xvXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXN1YiAkYWMwLCAgICAgICAgICVbdG1wMV0sICAgICAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10bG8gJHplcm8sICAgICAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkICRhYzEsICAgICAgICAgJVt0bXAwXSwgICAgICAlW3RlbXBfcmVnM10gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAlW3RlbXBfcmVnNV0sIDMqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0bXAwMF0sICAgICAtNio0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtZmhpICVbdGVtcF9yZWcxXSwgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAlW3RtcDExXSwgICAgIDUqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1maGkgJVt0ZW1wX3JlZzJdLCAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdGVtcF9yZWc0XSwgMjAqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAlW3RtcDJdLCAgICAgICVbdG1wMDBdLCAgICAgJVt0bXAxMV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0ZW1wX3JlZzVdLCAyMio0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWx0ICRhYzIsICAgICAgICAgJVt0bXAyXSwgICAgICAlW3RlbXBfcmVnNF0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsdCAkYWMzLCAgICAgICAgICVbdG1wMl0sICAgICAgJVt0ZW1wX3JlZzRdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0ZW1wX3JlZzZdLCAyMyo0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICVbdGVtcF9yZWcxXSwgJVt0ZW1wX3JlZzFdLCAyICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAlW3RlbXBfcmVnMl0sICVbdGVtcF9yZWcyXSwgMiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10bG8gJVtNQVhfbG9dLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtc3ViICRhYzIsICAgICAgICAgJVt0bXAxMV0sICAgICAlW3RlbXBfcmVnNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRsbyAkemVybywgICAgICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQgJGFjMywgICAgICAgICAlW3RtcDAwXSwgICAgICVbdGVtcF9yZWc2XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICVbdGVtcF9yZWcxXSwgLTUqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAlW3RlbXBfcmVnMl0sIDQqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1maGkgJVt0ZW1wX3JlZzRdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdG1wMF0sICAgICAgLTcqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZoaSAlW3RlbXBfcmVnNV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0bXAxXSwgICAgICA2KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdGVtcF9yZWcxXSwgMjQqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAlW3RlbXBfcmVnMl0sIDI2KjQoJVtjc2FdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZCAgJVt0bXAyXSwgICAgICAlW3RtcDBdLCAgICAgICVbdG1wMV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdGVtcF9yZWczXSwgMjcqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsdCAkYWMwLCAgICAgICAgICVbdG1wMl0sICAgICAgJVt0ZW1wX3JlZzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bHQgJGFjMSwgICAgICAgICAlW3RtcDJdLCAgICAgICVbdGVtcF9yZWcxXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICVbdGVtcF9yZWc0XSwgJVt0ZW1wX3JlZzRdLCAyICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAlW3RlbXBfcmVnNV0sICVbdGVtcF9yZWc1XSwgMiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgJVt0ZW1wX3JlZzRdLCAtNio0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGxvICVbTUFYX2xvXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXN1YiAkYWMwLCAgICAgICAgICVbdG1wMV0sICAgICAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10bG8gJHplcm8sICAgICAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkICRhYzEsICAgICAgICAgJVt0bXAwXSwgICAgICAlW3RlbXBfcmVnM10gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAlW3RlbXBfcmVnNV0sIDUqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0bXAwMF0sICAgICAtOCo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtZmhpICVbdGVtcF9yZWcxXSwgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAlW3RtcDExXSwgICAgIDcqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1maGkgJVt0ZW1wX3JlZzJdLCAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICVbdGVtcF9yZWc0XSwgMjgqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAlW3RtcDJdLCAgICAgICVbdG1wMDBdLCAgICAgJVt0bXAxMV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0ZW1wX3JlZzVdLCAzMCo0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWx0ICRhYzIsICAgICAgICAgJVt0bXAyXSwgICAgICAlW3RlbXBfcmVnNF0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsdCAkYWMzLCAgICAgICAgICVbdG1wMl0sICAgICAgJVt0ZW1wX3JlZzRdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgJVt0ZW1wX3JlZzZdLCAzMSo0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICVbdGVtcF9yZWcxXSwgJVt0ZW1wX3JlZzFdLCAyICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAlW3RlbXBfcmVnMl0sICVbdGVtcF9yZWcyXSwgMiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10bG8gJVtNQVhfbG9dLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtc3ViICRhYzIsICAgICAgICAgJVt0bXAxMV0sICAgICAlW3RlbXBfcmVnNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRsbyAkemVybywgICAgICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQgJGFjMywgICAgICAgICAlW3RtcDAwXSwgICAgICVbdGVtcF9yZWc2XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICVbdGVtcF9yZWcxXSwgLTcqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAlW3RlbXBfcmVnMl0sIDYqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1maGkgJVt0ZW1wX3JlZzRdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtZmhpICVbdGVtcF9yZWc1XSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAlW3RlbXBfcmVnNF0sICVbdGVtcF9yZWc0XSwgMiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsbCAgJVt0ZW1wX3JlZzVdLCAlW3RlbXBfcmVnNV0sIDIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICVbdGVtcF9yZWc0XSwgLTgqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAlW3RlbXBfcmVnNV0sIDcqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFt0bXAwXSAiPSZyIiAodG1wMCksIFt0bXAxXSAiPSZyIiAodG1wMSksIFt0bXAyXSAiPSZyIiAodG1wMiksCisgICAgICAgICAgICAgIFt0bXAwMF0gIj0mciIgKHRtcDAwKSwgW3RtcDExXSAiPSZyIiAodG1wMTEpLAorICAgICAgICAgICAgICBbdGVtcF9yZWcxXSAiPSZyIiAodGVtcF9yZWcxKSwgW3RlbXBfcmVnMl0gIj0mciIgKHRlbXBfcmVnMiksCisgICAgICAgICAgICAgIFt0ZW1wX3JlZzNdICI9JnIiICh0ZW1wX3JlZzMpLCBbdGVtcF9yZWc0XSAiPSZyIiAodGVtcF9yZWc0KSwKKyAgICAgICAgICAgICAgW3RlbXBfcmVnNV0gIj0mciIgKHRlbXBfcmVnNSksIFt0ZW1wX3JlZzZdICI9JnIiICh0ZW1wX3JlZzYpCisgICAgICAgICAgICA6IFtjc2FdICJyIiAoY3NhKSwgW3B0cl0gInIiIChwdHIpLAorICAgICAgICAgICAgICBbTUFYX2xvXSAiciIgKE1BWF9sbykKKyAgICAgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIsICIkYWMxaGkiLCAiJGFjMWxvIiwgIiRhYzJoaSIsICIkYWMybG8iLAorICAgICAgICAgICAgICAiJGFjM2hpIiwgIiRhYzNsbyIKKyAgICAgICAgICk7CisKKyAgICAgICAgcHRyICs9IDE4OworICAgIH0KK30KKyNkZWZpbmUgY29tcHV0ZV9hbnRpYWxpYXMgY29tcHV0ZV9hbnRpYWxpYXNfbWlwc19maXhlZAorI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCisjZW5kaWYgLyogQVZDT0RFQ19NSVBTX0NPTVBVVEVfQU5USUFMSUFTX0ZJWEVEX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvY29tcHV0ZV9hbnRpYWxpYXNfZmxvYXQuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvY29tcHV0ZV9hbnRpYWxpYXNfZmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODRhYmRhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9jb21wdXRlX2FudGlhbGlhc19mbG9hdC5oCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyCisgKiAgICAgIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBDYWxpZm9ybmlhLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQXV0aG9yOiAgQm9qYW4gWml2a292aWMgKGJvamFuQG1pcHMuY29tKQorICoKKyAqIENvbXB1dGUgYW50aWFsaWFzIGZ1bmN0aW9uIG9wdGltaXNlZCBmb3IgTUlQUyBmbG9hdGluZy1wb2ludCBhcmNoaXRlY3R1cmUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUmVmZXJlbmNlOiBsaWJhdmNvZGVjL21wZWdhdWRpb2RlYy5jCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01JUFNfQ09NUFVURV9BTlRJQUxJQVNfRkxPQVRfSAorI2RlZmluZSBBVkNPREVDX01JUFNfQ09NUFVURV9BTlRJQUxJQVNfRkxPQVRfSAorCisjaWYgSEFWRV9JTkxJTkVfQVNNCitzdGF0aWMgdm9pZCBjb21wdXRlX2FudGlhbGlhc19taXBzX2Zsb2F0KE1QQURlY29kZUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhbnVsZURlZiAqZykKK3sKKyAgICBmbG9hdCAqcHRyLCAqcHRyX2VuZDsKKyAgICBmbG9hdCAqY3NhID0gJmNzYV90YWJsZVswXVswXTsKKyAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGVzICovCisgICAgZmxvYXQgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCBpbjg7CisgICAgZmxvYXQgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NDsKKworICAgIHB0ciA9IGctPnNiX2h5YnJpZCArIDE4OworICAgIC8qIHdlIGFudGlhbGlhcyBvbmx5ICJsb25nIiBiYW5kcyAqLworICAgIGlmIChnLT5ibG9ja190eXBlID09IDIpIHsKKyAgICAgICAgaWYgKCFnLT5zd2l0Y2hfcG9pbnQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8qIFhYWDogY2hlY2sgdGhpcyBmb3IgODAwMEh6IGNhc2UgKi8KKyAgICAgICAgcHRyX2VuZCA9IHB0ciArIDE4OworICAgIH0gZWxzZSB7CisgICAgICAgIHB0cl9lbmQgPSBwdHIgKyA1NTg7CisgICAgfQorCisgICAgLyoqCisgICAgKiBpbnN0cnVjdGlvbnMgYXJlIHNjaGVkdWxlZCB0byBtaW5pbWl6ZSBwaXBlbGluZSBzdGFsbC4KKyAgICAqLworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJjb21wdXRlX2FudGlhbGlhc19mbG9hdF9sb29wJT06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMV0sICAtMSo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjJdLCAgMCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4zXSwgIDEqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNF0sICAwKCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjVdLCAgLTIqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW42XSwgIDQqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW291dDFdLCAlW2luMV0sICAlW2luMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVtvdXQyXSwgJVtpbjFdLCAgJVtpbjNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW43XSwgIDUqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luOF0sICAxKjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtvdXQxXSwgJVtvdXQxXSwgJVtpbjNdLCAlW2luNF0gICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgICVbb3V0Ml0sICVbb3V0Ml0sICVbaW4yXSwgJVtpbjRdICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW291dDNdLCAlW2luNV0sICAlW2luNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVtvdXQ0XSwgJVtpbjVdLCAgJVtpbjddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4xXSwgIC0zKjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW291dDFdLCAtMSo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQyXSwgMCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbb3V0M10sICVbb3V0M10sICVbaW43XSwgJVtpbjhdICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICAlW291dDRdLCAlW291dDRdLCAlW2luNl0sICVbaW44XSAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjJdLCAgOCo0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbb3V0M10sIC0yKjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW291dDRdLCAxKjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjNdLCAgOSo0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW40XSwgIDIqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW291dDFdLCAlW2luMV0sICAlW2luMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjVdLCAgLTQqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW42XSwgIDEyKjQoJVtjc2FdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW291dDJdLCAlW2luMV0sICAlW2luM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjddLCAgMTMqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbb3V0MV0sICVbb3V0MV0sICVbaW4zXSwgJVtpbjRdICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luOF0sICAzKjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVtvdXQzXSwgJVtpbjVdLCAgJVtpbjZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgICVbb3V0Ml0sICVbb3V0Ml0sICVbaW4yXSwgJVtpbjRdICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW291dDRdLCAlW2luNV0sICAlW2luN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQxXSwgLTMqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4xXSwgIC01KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW291dDNdLCAlW291dDNdLCAlW2luN10sICVbaW44XSAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQyXSwgMio0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgICVbb3V0NF0sICVbb3V0NF0sICVbaW42XSwgJVtpbjhdICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMl0sICAxNio0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjNdLCAgMTcqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbb3V0M10sIC00KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNF0sICA0KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQ0XSwgMyo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgICVbb3V0MV0sICVbaW4xXSwgICVbaW4yXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW291dDJdLCAlW2luMV0sICAlW2luM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjVdLCAgLTYqNCglW3B0cl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW42XSwgIDIwKjQoJVtjc2FdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luN10sICAyMSo0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtvdXQxXSwgJVtvdXQxXSwgJVtpbjNdLCAlW2luNF0gICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgICVbb3V0Ml0sICVbb3V0Ml0sICVbaW4yXSwgJVtpbjRdICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luOF0sICA1KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVtvdXQzXSwgJVtpbjVdLCAgJVtpbjZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgICVbb3V0NF0sICVbaW41XSwgICVbaW43XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW291dDFdLCAtNSo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQyXSwgNCo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4xXSwgIC03KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW291dDNdLCAlW291dDNdLCAlW2luN10sICVbaW44XSAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAgJVtvdXQ0XSwgJVtvdXQ0XSwgJVtpbjZdLCAlW2luOF0gICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4yXSwgIDI0KjQoJVtjc2FdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luM10sICAyNSo0KCVbY3NhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjRdLCAgNio0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbb3V0M10sIC02KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW291dDRdLCA1KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVtvdXQxXSwgJVtpbjFdLCAgJVtpbjJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW41XSwgIC04KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW291dDJdLCAlW2luMV0sICAlW2luM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjZdLCAgMjgqNCglW2NzYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW43XSwgIDI5KjQoJVtjc2FdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW291dDFdLCAlW291dDFdLCAlW2luM10sICVbaW40XSAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjhdLCAgNyo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgICVbb3V0Ml0sICVbb3V0Ml0sICVbaW4yXSwgJVtpbjRdICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW291dDNdLCAlW2luNV0sICAlW2luNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVtvdXQ0XSwgJVtpbjVdLCAgJVtpbjddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbb3V0MV0sIC03KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW291dDJdLCA2KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZGl1ICAgJVtwdHJdLCAgJVtwdHJdLCAgNzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbb3V0M10sICVbb3V0M10sICVbaW43XSwgJVtpbjhdICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICAlW291dDRdLCAlW291dDRdLCAlW2luNl0sICVbaW44XSAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQzXSwgLTI2KjQoJVtwdHJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbb3V0NF0sIC0xMSo0KCVbcHRyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYm5lICAgICAlW3B0cl0sICAlW3B0cl9lbmRdLCAgY29tcHV0ZV9hbnRpYWxpYXNfZmxvYXRfbG9vcCU9ICAgXHRcbiIKKworICAgICAgICA6IFtwdHJdICIrciIgKHB0ciksCisgICAgICAgICAgW2luMV0gIj0mZiIgKGluMSksIFtpbjJdICI9JmYiIChpbjIpLAorICAgICAgICAgIFtpbjNdICI9JmYiIChpbjMpLCBbaW40XSAiPSZmIiAoaW40KSwKKyAgICAgICAgICBbaW41XSAiPSZmIiAoaW41KSwgW2luNl0gIj0mZiIgKGluNiksCisgICAgICAgICAgW2luN10gIj0mZiIgKGluNyksIFtpbjhdICI9JmYiIChpbjgpLAorICAgICAgICAgIFtvdXQxXSAiPSZmIiAob3V0MSksIFtvdXQyXSAiPSZmIiAob3V0MiksCisgICAgICAgICAgW291dDNdICI9JmYiIChvdXQzKSwgW291dDRdICI9JmYiIChvdXQ0KQorICAgICAgICA6IFtjc2FdICJyIiAoY3NhKSwgW3B0cl9lbmRdICJyIiAocHRyX2VuZCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisjZGVmaW5lIGNvbXB1dGVfYW50aWFsaWFzIGNvbXB1dGVfYW50aWFsaWFzX21pcHNfZmxvYXQKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworI2VuZGlmIC8qIEFWQ09ERUNfTUlQU19DT01QVVRFX0FOVElBTElBU19GTE9BVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2ZmdF9taXBzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2ZmdF9taXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxZjJkYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvZmZ0X21pcHMuYwpAQCAtMCwwICsxLDUzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogIFN0YW5pc2xhdiBPY292YWogKHNvY292YWpAbWlwcy5jb20pCisgKiBBdXRob3I6ICBab3JhbiBMdWtpYyAoem9yYW5sQG1pcHMuY29tKQorICoKKyAqIE9wdGltaXplZCBNRENUL0lNRENUIGFuZCBGRlQgdHJhbnNmb3JtcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZmZ0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9mZnRfdGFibGUuaCIKKworLyoqCisgKiBGRlQgdHJhbnNmb3JtCisgKi8KKworI2lmIEhBVkVfSU5MSU5FX0FTTQorc3RhdGljIHZvaWQgZmZfZmZ0X2NhbGNfbWlwcyhGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KQoreworICAgIGludCBuYml0cywgaSwgbiwgbnVtX3RyYW5zZm9ybXMsIG9mZnNldCwgc3RlcDsKKyAgICBpbnQgbjQsIG4yLCBuMzQ7CisgICAgRkZUU2FtcGxlIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcsIHRtcDg7CisgICAgRkZUQ29tcGxleCAqdG1wejsKKyAgICBmbG9hdCB3X3JlLCB3X2ltOworICAgIGZsb2F0ICp3X3JlX3B0ciwgKndfaW1fcHRyOworICAgIGNvbnN0IGludCBmZnRfc2l6ZSA9ICgxIDw8IHMtPm5iaXRzKTsKKyAgICBpbnQgc19uID0gcy0+bmJpdHM7CisgICAgaW50IHRlbTEsIHRlbTI7CisgICAgZmxvYXQgcG9tLCAgcG9tMSwgIHBvbTIsICBwb20zOworICAgIGZsb2F0IHRlbXAsIHRlbXAxLCB0ZW1wMywgdGVtcDQ7CisgICAgRkZUQ29tcGxleCAqIHRtcHpfbjIsICogdG1wel9uMzQsICogdG1wel9uNDsKKyAgICBGRlRDb21wbGV4ICogdG1wel9uMl9pLCAqIHRtcHpfbjM0X2ksICogdG1wel9uNF9pLCAqIHRtcHpfaTsKKworICAgIC8qKgorICAgICpudW1fdHJhbnNmb3JtcyA9ICgweDJhYWIgPj4gKDE2IC0gcy0+bmJpdHMpKSB8IDE7CisgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImxpICAgJVt0ZW0xXSwgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICVbc19uXSwgICVbdGVtMV0sICVbc19uXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAlW3RlbTJdLCAxMDkyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNyYXYgJVt0ZW0yXSwgJVt0ZW0yXSwgJVtzX25dICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvcmkgICVbbnVtX3RdLCVbdGVtMl0sIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtudW1fdF0iPXIiKG51bV90cmFuc2Zvcm1zKSwgW3Nfbl0iK3IiKHNfbiksCisgICAgICAgICAgW3RlbTFdIj0mciIodGVtMSksIFt0ZW0yXSI9JnIiKHRlbTIpCisgICAgKTsKKworCisgICAgZm9yIChuPTA7IG48bnVtX3RyYW5zZm9ybXM7IG4rKykgeworICAgICAgICBvZmZzZXQgPSBmZl9mZnRfb2Zmc2V0c19sdXRbbl0gPDwgMjsKKyAgICAgICAgdG1weiA9IHogKyBvZmZzZXQ7CisKKyAgICAgICAgdG1wMSA9IHRtcHpbMF0ucmUgKyB0bXB6WzFdLnJlOworICAgICAgICB0bXA1ID0gdG1welsyXS5yZSArIHRtcHpbM10ucmU7CisgICAgICAgIHRtcDIgPSB0bXB6WzBdLmltICsgdG1welsxXS5pbTsKKyAgICAgICAgdG1wNiA9IHRtcHpbMl0uaW0gKyB0bXB6WzNdLmltOworICAgICAgICB0bXAzID0gdG1welswXS5yZSAtIHRtcHpbMV0ucmU7CisgICAgICAgIHRtcDggPSB0bXB6WzJdLmltIC0gdG1welszXS5pbTsKKyAgICAgICAgdG1wNCA9IHRtcHpbMF0uaW0gLSB0bXB6WzFdLmltOworICAgICAgICB0bXA3ID0gdG1welsyXS5yZSAtIHRtcHpbM10ucmU7CisKKyAgICAgICAgdG1welswXS5yZSA9IHRtcDEgKyB0bXA1OworICAgICAgICB0bXB6WzJdLnJlID0gdG1wMSAtIHRtcDU7CisgICAgICAgIHRtcHpbMF0uaW0gPSB0bXAyICsgdG1wNjsKKyAgICAgICAgdG1welsyXS5pbSA9IHRtcDIgLSB0bXA2OworICAgICAgICB0bXB6WzFdLnJlID0gdG1wMyArIHRtcDg7CisgICAgICAgIHRtcHpbM10ucmUgPSB0bXAzIC0gdG1wODsKKyAgICAgICAgdG1welsxXS5pbSA9IHRtcDQgLSB0bXA3OworICAgICAgICB0bXB6WzNdLmltID0gdG1wNCArIHRtcDc7CisKKyAgICB9CisKKyAgICBpZiAoZmZ0X3NpemUgPCA4KQorICAgICAgICByZXR1cm47CisKKyAgICBudW1fdHJhbnNmb3JtcyA9IChudW1fdHJhbnNmb3JtcyA+PiAxKSB8IDE7CisKKyAgICBmb3IgKG49MDsgbjxudW1fdHJhbnNmb3JtczsgbisrKSB7CisgICAgICAgIG9mZnNldCA9IGZmX2ZmdF9vZmZzZXRzX2x1dFtuXSA8PCAzOworICAgICAgICB0bXB6ID0geiArIG9mZnNldDsKKworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICJsd2MxICAlW3RtcDFdLCAzMiglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgJVtwb21dLCAgNDAoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICVbdG1wM10sIDQ4KCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAlW3BvbTFdLCA1NiglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgJVt0bXAyXSwgMzYoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICVbcG9tMl0sIDQ0KCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAlW3BvbTNdLCA2MCglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgJVt0bXA0XSwgNTIoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICVbdG1wMV0sICVbdG1wMV0sICAgICVbcG9tXSAgICAgICAgICAgICAgXG5cdCIgIC8vIHRtcDEgPSB0bXB6WzRdLnJlICsgdG1wels1XS5yZTsKKyAgICAgICAgICAgICJhZGQucyAlW3RtcDNdLCAlW3RtcDNdLCAgICAlW3BvbTFdICAgICAgICAgICAgIFxuXHQiICAvLyB0bXAzID0gdG1wels2XS5yZSArIHRtcHpbN10ucmU7CisgICAgICAgICAgICAiYWRkLnMgJVt0bXAyXSwgJVt0bXAyXSwgICAgJVtwb20yXSAgICAgICAgICAgICBcblx0IiAgLy8gdG1wMiA9IHRtcHpbNF0uaW0gKyB0bXB6WzVdLmltOworICAgICAgICAgICAgImx3YzEgICVbcG9tXSwgIDQwKCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAlW3RtcDRdLCAlW3RtcDRdLCAgICAlW3BvbTNdICAgICAgICAgICAgIFxuXHQiICAvLyB0bXA0ID0gdG1wels2XS5pbSArIHRtcHpbN10uaW07CisgICAgICAgICAgICAiYWRkLnMgJVt0bXA1XSwgJVt0bXAxXSwgICAgJVt0bXAzXSAgICAgICAgICAgICBcblx0IiAgLy8gdG1wNSA9IHRtcDEgKyB0bXAzOworICAgICAgICAgICAgInN1Yi5zICVbdG1wN10sICVbdG1wMV0sICAgICVbdG1wM10gICAgICAgICAgICAgXG5cdCIgIC8vIHRtcDcgPSB0bXAxIC0gdG1wMzsKKyAgICAgICAgICAgICJsd2MxICAlW3RtcDFdLCAzMiglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgJVtwb20xXSwgNDQoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICVbdG1wNl0sICVbdG1wMl0sICAgICVbdG1wNF0gICAgICAgICAgICAgXG5cdCIgIC8vIHRtcDYgPSB0bXAyICsgdG1wNDsKKyAgICAgICAgICAgICJzdWIucyAlW3RtcDhdLCAlW3RtcDJdLCAgICAlW3RtcDRdICAgICAgICAgICAgIFxuXHQiICAvLyB0bXA4ID0gdG1wMiAtIHRtcDQ7CisgICAgICAgICAgICAibHdjMSAgJVt0bXAyXSwgMzYoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICVbcG9tMl0sIDU2KCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAlW3BvbTNdLCA2MCglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgJVt0bXAzXSwgNDgoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICVbdG1wNF0sIDUyKCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIucyAlW3RtcDFdLCAlW3RtcDFdLCAgICAlW3BvbV0gICAgICAgICAgICAgIFxuXHQiICAvLyB0bXAxID0gdG1wels0XS5yZSAtIHRtcHpbNV0ucmU7CisgICAgICAgICAgICAibHdjMSAgJVtwb21dLCAgMCglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICVbdG1wMl0sICVbdG1wMl0sICAgICVbcG9tMV0gICAgICAgICAgICAgXG5cdCIgIC8vIHRtcDIgPSB0bXB6WzRdLmltIC0gdG1wels1XS5pbTsKKyAgICAgICAgICAgICJzdWIucyAlW3RtcDNdLCAlW3RtcDNdLCAgICAlW3BvbTJdICAgICAgICAgICAgIFxuXHQiICAvLyB0bXAzID0gdG1wels2XS5yZSAtIHRtcHpbN10ucmU7CisgICAgICAgICAgICAibHdjMSAgJVtwb20yXSwgNCglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICVbcG9tMV0sICVbcG9tXSwgICAgICVbdG1wNV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIucyAlW3RtcDRdLCAlW3RtcDRdLCAgICAlW3BvbTNdICAgICAgICAgICAgIFxuXHQiICAvLyB0bXA0ID0gdG1wels2XS5pbSAtIHRtcHpbN10uaW07CisgICAgICAgICAgICAiYWRkLnMgJVtwb20zXSwgJVtwb21dLCAgICAgJVt0bXA1XSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICVbcG9tXSwgICVbcG9tMl0sICAgICVbdG1wNl0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAlW3BvbTJdLCAlW3BvbTJdLCAgICAlW3RtcDZdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgJVtwb20xXSwgMzIoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IiAgLy8gdG1wels0XS5yZSA9IHRtcHpbMF0ucmUgLSB0bXA1OworICAgICAgICAgICAgInN3YzEgICVbcG9tM10sIDAoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHRtcHpbMF0ucmUgPSB0bXB6WzBdLnJlICsgdG1wNTsKKyAgICAgICAgICAgICJzd2MxICAlW3BvbV0sICAzNiglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAvLyB0bXB6WzRdLmltID0gdG1welswXS5pbSAtIHRtcDY7CisgICAgICAgICAgICAic3djMSAgJVtwb20yXSwgNCglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgLy8gdG1welswXS5pbSA9IHRtcHpbMF0uaW0gKyB0bXA2OworICAgICAgICAgICAgImx3YzEgICVbcG9tMV0sIDE2KCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAlW3BvbTNdLCAyMCglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibGkucyAgJVtwb21dLCAgMC43MDcxMDY3ODEyICAgICAgICAgICAgICAgICAgICBcblx0IiAgLy8gZmxvYXQgcG9tID0gMC43MDcxMDY3ODEyZjsKKyAgICAgICAgICAgICJhZGQucyAlW3RlbXAxXSwlW3RtcDFdLCAgICAlW3RtcDJdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViLnMgJVt0ZW1wXSwgJVtwb20xXSwgICAgJVt0bXA4XSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICVbcG9tMl0sICVbcG9tM10sICAgICVbdG1wN10gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIucyAlW3RlbXAzXSwlW3RtcDNdLCAgICAlW3RtcDRdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViLnMgJVt0ZW1wNF0sJVt0bXAyXSwgICAgJVt0bXAxXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICVbdGVtcF0sIDQ4KCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHRtcHpbNl0ucmUgPSB0bXB6WzJdLnJlIC0gdG1wODsKKyAgICAgICAgICAgICJzd2MxICAlW3BvbTJdLCA1MiglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAvLyB0bXB6WzZdLmltID0gdG1welsyXS5pbSArIHRtcDc7CisgICAgICAgICAgICAiYWRkLnMgJVtwb20xXSwgJVtwb20xXSwgICAgJVt0bXA4XSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICVbcG9tM10sICVbcG9tM10sICAgICVbdG1wN10gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAlW3RtcDNdLCAlW3RtcDNdLCAgICAlW3RtcDRdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgJVt0bXA1XSwgJVtwb21dLCAgICAgJVt0ZW1wMV0gICAgICAgICAgICBcblx0IiAgLy8gdG1wNSA9IHBvbSAqICh0bXAxICsgdG1wMik7CisgICAgICAgICAgICAibXVsLnMgJVt0bXA3XSwgJVtwb21dLCAgICAgJVt0ZW1wM10gICAgICAgICAgICBcblx0IiAgLy8gdG1wNyA9IHBvbSAqICh0bXAzIC0gdG1wNCk7CisgICAgICAgICAgICAibXVsLnMgJVt0bXA2XSwgJVtwb21dLCAgICAgJVt0ZW1wNF0gICAgICAgICAgICBcblx0IiAgLy8gdG1wNiA9IHBvbSAqICh0bXAyIC0gdG1wMSk7CisgICAgICAgICAgICAibXVsLnMgJVt0bXA4XSwgJVtwb21dLCAgICAgJVt0bXAzXSAgICAgICAgICAgICBcblx0IiAgLy8gdG1wOCA9IHBvbSAqICh0bXAzICsgdG1wNCk7CisgICAgICAgICAgICAic3djMSAgJVtwb20xXSwgMTYoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IiAgLy8gdG1welsyXS5yZSA9IHRtcHpbMl0ucmUgKyB0bXA4OworICAgICAgICAgICAgInN3YzEgICVbcG9tM10sIDIwKCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHRtcHpbMl0uaW0gPSB0bXB6WzJdLmltIC0gdG1wNzsKKyAgICAgICAgICAgICJhZGQucyAlW3RtcDFdLCAlW3RtcDVdLCAgICAlW3RtcDddICAgICAgICAgICAgIFxuXHQiICAvLyB0bXAxID0gdG1wNSArIHRtcDc7CisgICAgICAgICAgICAic3ViLnMgJVt0bXAzXSwgJVt0bXA1XSwgICAgJVt0bXA3XSAgICAgICAgICAgICBcblx0IiAgLy8gdG1wMyA9IHRtcDUgLSB0bXA3OworICAgICAgICAgICAgImFkZC5zICVbdG1wMl0sICVbdG1wNl0sICAgICVbdG1wOF0gICAgICAgICAgICAgXG5cdCIgIC8vIHRtcDIgPSB0bXA2ICsgdG1wODsKKyAgICAgICAgICAgICJzdWIucyAlW3RtcDRdLCAlW3RtcDZdLCAgICAlW3RtcDhdICAgICAgICAgICAgIFxuXHQiICAvLyB0bXA0ID0gdG1wNiAtIHRtcDg7CisgICAgICAgICAgICAibHdjMSAgJVt0ZW1wXSwgOCglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICVbdGVtcDFdLDEyKCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAlW3BvbV0sICAyNCglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgJVtwb20yXSwgMjgoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICVbdGVtcDRdLCVbdGVtcF0sICAgICVbdG1wMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIucyAlW3RlbXAzXSwlW3RlbXAxXSwgICAlW3RtcDJdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgJVt0ZW1wXSwgJVt0ZW1wXSwgICAgJVt0bXAxXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICVbdGVtcDFdLCVbdGVtcDFdLCAgICVbdG1wMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIucyAlW3BvbTFdLCAlW3BvbV0sICAgICAlW3RtcDRdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgJVtwb20zXSwgJVtwb20yXSwgICAgJVt0bXAzXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICVbcG9tXSwgICVbcG9tXSwgICAgICVbdG1wNF0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIucyAlW3BvbTJdLCAlW3BvbTJdLCAgICAlW3RtcDNdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgJVt0ZW1wNF0sNDAoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IiAgLy8gdG1wels1XS5yZSA9IHRtcHpbMV0ucmUgLSB0bXAxOworICAgICAgICAgICAgInN3YzEgICVbdGVtcDNdLDQ0KCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHRtcHpbNV0uaW0gPSB0bXB6WzFdLmltIC0gdG1wMjsKKyAgICAgICAgICAgICJzd2MxICAlW3RlbXBdLCA4KCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAvLyB0bXB6WzFdLnJlID0gdG1welsxXS5yZSArIHRtcDE7CisgICAgICAgICAgICAic3djMSAgJVt0ZW1wMV0sMTIoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IiAgLy8gdG1welsxXS5pbSA9IHRtcHpbMV0uaW0gKyB0bXAyOworICAgICAgICAgICAgInN3YzEgICVbcG9tMV0sIDU2KCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHRtcHpbN10ucmUgPSB0bXB6WzNdLnJlIC0gdG1wNDsKKyAgICAgICAgICAgICJzd2MxICAlW3BvbTNdLCA2MCglW3RtcHpdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAvLyB0bXB6WzddLmltID0gdG1welszXS5pbSArIHRtcDM7CisgICAgICAgICAgICAic3djMSAgJVtwb21dLCAgMjQoJVt0bXB6XSkgICAgICAgICAgICAgICAgICAgICBcblx0IiAgLy8gdG1welszXS5yZSA9IHRtcHpbM10ucmUgKyB0bXA0OworICAgICAgICAgICAgInN3YzEgICVbcG9tMl0sIDI4KCVbdG1wel0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHRtcHpbM10uaW0gPSB0bXB6WzNdLmltIC0gdG1wMzsKKyAgICAgICAgICAgIDogW3RtcDFdIj0mZiIodG1wMSksIFtwb21dIj0mZiIocG9tKSwgICBbcG9tMV0iPSZmIihwb20xKSwgW3BvbTJdIj0mZiIocG9tMiksCisgICAgICAgICAgICAgIFt0bXAzXSI9JmYiKHRtcDMpLCBbdG1wMl0iPSZmIih0bXAyKSwgW3RtcDRdIj0mZiIodG1wNCksIFt0bXA1XSI9JmYiKHRtcDUpLCAgW3RtcDddIj0mZiIodG1wNyksCisgICAgICAgICAgICAgIFt0bXA2XSI9JmYiKHRtcDYpLCBbdG1wOF0iPSZmIih0bXA4KSwgW3BvbTNdIj0mZiIocG9tMyksW3RlbXBdIj0mZiIodGVtcCksIFt0ZW1wMV0iPSZmIih0ZW1wMSksCisgICAgICAgICAgICAgIFt0ZW1wM10iPSZmIih0ZW1wMyksIFt0ZW1wNF0iPSZmIih0ZW1wNCkKKyAgICAgICAgICAgIDogW3RtcHpdInIiKHRtcHopCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgfQorCisgICAgc3RlcCA9IDEgPDwgKE1BWF9MT0cyX05GRlQgLSA0KTsKKyAgICBuNCA9IDQ7CisKKyAgICBmb3IgKG5iaXRzPTQ7IG5iaXRzPD1zLT5uYml0czsgbmJpdHMrKykgeworICAgICAgICAvKgorICAgICAgICAqIG51bV90cmFuc2Zvcm1zID0gKG51bV90cmFuc2Zvcm1zID4+IDEpIHwgMTsKKyAgICAgICAgKi8KKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAic3JhICVbbnVtX3RdLCAlW251bV90XSwgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAib3JpICVbbnVtX3RdLCAlW251bV90XSwgMSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW251bV90XSAiK3IiIChudW1fdHJhbnNmb3JtcykKKyAgICAgICAgKTsKKyAgICAgICAgbjIgID0gMiAqIG40OworICAgICAgICBuMzQgPSAzICogbjQ7CisKKyAgICAgICAgZm9yIChuPTA7IG48bnVtX3RyYW5zZm9ybXM7IG4rKykgeworICAgICAgICAgICAgb2Zmc2V0ID0gZmZfZmZ0X29mZnNldHNfbHV0W25dIDw8IG5iaXRzOworICAgICAgICAgICAgdG1weiA9IHogKyBvZmZzZXQ7CisKKyAgICAgICAgICAgIHRtcHpfbjIgID0gdG1weiArICBuMjsKKyAgICAgICAgICAgIHRtcHpfbjQgID0gdG1weiArICBuNDsKKyAgICAgICAgICAgIHRtcHpfbjM0ID0gdG1weiArICBuMzQ7CisKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICJsd2MxICAlW3BvbTFdLCAwKCVbdG1wel9uMl0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgJVtwb21dLCAgMCglW3RtcHpfbjM0XSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICVbcG9tMl0sIDQoJVt0bXB6X24yXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAlW3BvbTNdLCA0KCVbdG1wel9uMzRdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgJVt0ZW1wMV0sMCglW3RtcHpdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICVbdGVtcDNdLDQoJVt0bXB6XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQucyAlW3RtcDVdLCAlW3BvbTFdLCAgICAgICVbcG9tXSAgICAgXG5cdCIgICAvLyAgdG1wNSA9IHRtcHpbIG4yXS5yZSArIHRtcHpbbjM0XS5yZTsKKyAgICAgICAgICAgICAgICAic3ViLnMgJVt0bXAxXSwgJVtwb20xXSwgICAgICAlW3BvbV0gICAgIFxuXHQiICAgLy8gIHRtcDEgPSB0bXB6WyBuMl0ucmUgLSB0bXB6W24zNF0ucmU7CisgICAgICAgICAgICAgICAgImFkZC5zICVbdG1wNl0sICVbcG9tMl0sICAgICAgJVtwb20zXSAgICBcblx0IiAgIC8vICB0bXA2ID0gdG1welsgbjJdLmltICsgdG1weltuMzRdLmltOworICAgICAgICAgICAgICAgICJzdWIucyAlW3RtcDJdLCAlW3BvbTJdLCAgICAgICVbcG9tM10gICAgXG5cdCIgICAvLyAgdG1wMiA9IHRtcHpbIG4yXS5pbSAtIHRtcHpbbjM0XS5pbTsKKyAgICAgICAgICAgICAgICAic3ViLnMgJVt0ZW1wXSwgJVt0ZW1wMV0sICAgICAlW3RtcDVdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZC5zICVbdGVtcDFdLCVbdGVtcDFdLCAgICAgJVt0bXA1XSAgICBcblx0IgorICAgICAgICAgICAgICAgICJzdWIucyAlW3RlbXA0XSwlW3RlbXAzXSwgICAgICVbdG1wNl0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkLnMgJVt0ZW1wM10sJVt0ZW1wM10sICAgICAlW3RtcDZdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3YzEgICVbdGVtcF0sIDAoJVt0bXB6X24yXSkgICAgICAgICAgICBcblx0IiAgIC8vICB0bXB6WyBuMl0ucmUgPSB0bXB6WyAwXS5yZSAtIHRtcDU7CisgICAgICAgICAgICAgICAgInN3YzEgICVbdGVtcDFdLDAoJVt0bXB6XSkgICAgICAgICAgICAgICBcblx0IiAgIC8vICB0bXB6WyAgMF0ucmUgPSB0bXB6WyAwXS5yZSArIHRtcDU7CisgICAgICAgICAgICAgICAgImx3YzEgICVbcG9tMV0sIDAoJVt0bXB6X240XSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzd2MxICAlW3RlbXA0XSw0KCVbdG1wel9uMl0pICAgICAgICAgICAgXG5cdCIgICAvLyAgdG1welsgbjJdLmltID0gdG1welsgMF0uaW0gLSB0bXA2OworICAgICAgICAgICAgICAgICJsd2MxICAlW3RlbXBdLCA0KCVbdG1wel9uNF0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgJVt0ZW1wM10sNCglW3RtcHpdKSAgICAgICAgICAgICAgIFxuXHQiICAgLy8gIHRtcHpbICAwXS5pbSA9IHRtcHpbIDBdLmltICsgdG1wNjsKKyAgICAgICAgICAgICAgICAic3ViLnMgJVtwb21dLCAgJVtwb20xXSwgICAgICAlW3RtcDJdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZC5zICVbcG9tMV0sICVbcG9tMV0sICAgICAgJVt0bXAyXSAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQucyAlW3RlbXAxXSwlW3RlbXBdLCAgICAgICVbdG1wMV0gICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3ViLnMgJVt0ZW1wXSwgJVt0ZW1wXSwgICAgICAlW3RtcDFdICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInN3YzEgICVbcG9tXSwgIDAoJVt0bXB6X24zNF0pICAgICAgICAgICBcblx0IiAgIC8vICB0bXB6W24zNF0ucmUgPSB0bXB6W240XS5yZSAtIHRtcDI7CisgICAgICAgICAgICAgICAgInN3YzEgICVbcG9tMV0sIDAoJVt0bXB6X240XSkgICAgICAgICAgICBcblx0IiAgIC8vICB0bXB6WyBuNF0ucmUgPSB0bXB6W240XS5yZSArIHRtcDI7CisgICAgICAgICAgICAgICAgInN3YzEgICVbdGVtcDFdLDQoJVt0bXB6X24zNF0pICAgICAgICAgICBcblx0IiAgIC8vICB0bXB6W24zNF0uaW0gPSB0bXB6W240XS5pbSArIHRtcDE7CisgICAgICAgICAgICAgICAgInN3YzEgICVbdGVtcF0sIDQoJVt0bXB6X240XSkgICAgICAgICAgICBcblx0IiAgIC8vICB0bXB6WyBuNF0uaW0gPSB0bXB6W240XS5pbSAtIHRtcDE7CisgICAgICAgICAgICAgICAgOiBbdG1wNV0iPSZmIih0bXA1KSwKKyAgICAgICAgICAgICAgICAgIFt0bXAxXSI9JmYiKHRtcDEpLCBbcG9tXSI9JmYiKHBvbSksICAgICAgICBbcG9tMV0iPSZmIihwb20xKSwgICAgICAgIFtwb20yXSI9JmYiKHBvbTIpLAorICAgICAgICAgICAgICAgICAgW3RtcDJdIj0mZiIodG1wMiksIFt0bXA2XSI9JmYiKHRtcDYpLCAgICAgICAgICBbcG9tM10iPSZmIihwb20zKSwKKyAgICAgICAgICAgICAgICAgIFt0ZW1wXSI9JmYiKHRlbXApLCBbdGVtcDFdIj0mZiIodGVtcDEpLCAgICAgW3RlbXAzXSI9JmYiKHRlbXAzKSwgICAgICAgW3RlbXA0XSI9JmYiKHRlbXA0KQorICAgICAgICAgICAgICAgIDogW3RtcHpdInIiKHRtcHopLCBbdG1wel9uMl0iciIodG1wel9uMiksIFt0bXB6X24zNF0iciIodG1wel9uMzQpLCBbdG1wel9uNF0iciIodG1wel9uNCkKKyAgICAgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICAgICApOworCisgICAgICAgICAgICB3X3JlX3B0ciA9IChmbG9hdCopKGZmX2Nvc182NTUzNiArIHN0ZXApOworICAgICAgICAgICAgd19pbV9wdHIgPSAoZmxvYXQqKShmZl9jb3NfNjU1MzYgKyBNQVhfRkZUX1NJWkUvNCAtIHN0ZXApOworCisgICAgICAgICAgICBmb3IgKGk9MTsgaTxuNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgd19yZSA9IHdfcmVfcHRyWzBdOworICAgICAgICAgICAgICAgIHdfaW0gPSB3X2ltX3B0clswXTsKKyAgICAgICAgICAgICAgICB0bXB6X24yX2kgPSB0bXB6X24yICArIGk7CisgICAgICAgICAgICAgICAgdG1wel9uNF9pID0gdG1wel9uNCAgKyBpOworICAgICAgICAgICAgICAgIHRtcHpfbjM0X2k9IHRtcHpfbjM0ICsgaTsKKyAgICAgICAgICAgICAgICB0bXB6X2kgICAgPSB0bXB6ICAgICArIGk7CisKKyAgICAgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICAgICAgICAgImx3YzEgICAgICVbdGVtcF0sICAwKCVbdG1wel9uMl9pXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibHdjMSAgICAgJVt0ZW1wMV0sIDQoJVt0bXB6X24yX2ldKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJsd2MxICAgICAlW3BvbV0sICAgMCglW3RtcHpfbjM0X2ldKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3YzEgICAgICVbcG9tMV0sICA0KCVbdG1wel9uMzRfaV0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibXVsLnMgICAgJVt0ZW1wM10sICVbd19pbV0sICAgICVbdGVtcF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJtdWwucyAgICAlW3RlbXA0XSwgJVt3X2ltXSwgICAgJVt0ZW1wMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIm11bC5zICAgICVbcG9tMl0sICAlW3dfaW1dLCAgICAlW3BvbTFdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibXVsLnMgICAgJVtwb20zXSwgICVbd19pbV0sICAgICVbcG9tXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJtc3ViLnMgICAlW3RtcDJdLCAgJVt0ZW1wM10sICAgJVt3X3JlXSwgJVt0ZW1wMV0gXG5cdCIgIC8vIHRtcDIgPSB3X3JlICogdG1welsgbjIraV0uaW0gLSB3X2ltICogdG1welsgbjIraV0ucmU7CisgICAgICAgICAgICAgICAgICAgICJtYWRkLnMgICAlW3RtcDFdLCAgJVt0ZW1wNF0sICAgJVt3X3JlXSwgJVt0ZW1wXSAgXG5cdCIgIC8vIHRtcDEgPSB3X3JlICogdG1welsgbjIraV0ucmUgKyB3X2ltICogdG1welsgbjIraV0uaW07CisgICAgICAgICAgICAgICAgICAgICJtc3ViLnMgICAlW3RtcDNdLCAgJVtwb20yXSwgICAgJVt3X3JlXSwgJVtwb21dICAgXG5cdCIgIC8vIHRtcDMgPSB3X3JlICogdG1weltuMzQraV0ucmUgLSB3X2ltICogdG1weltuMzQraV0uaW07CisgICAgICAgICAgICAgICAgICAgICJtYWRkLnMgICAlW3RtcDRdLCAgJVtwb20zXSwgICAgJVt3X3JlXSwgJVtwb20xXSAgXG5cdCIgIC8vIHRtcDQgPSB3X3JlICogdG1weltuMzQraV0uaW0gKyB3X2ltICogdG1weltuMzQraV0ucmU7CisgICAgICAgICAgICAgICAgICAgICJsd2MxICAgICAlW3RlbXBdLCAgMCglW3RtcHpfaV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3YzEgICAgICVbcG9tXSwgICA0KCVbdG1wel9pXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYWRkLnMgICAgJVt0bXA1XSwgICVbdG1wMV0sICAgICVbdG1wM10gICAgICAgICAgIFxuXHQiICAvLyB0bXA1ID0gdG1wMSArIHRtcDM7CisgICAgICAgICAgICAgICAgICAgICJzdWIucyAgICAlW3RtcDFdLCAgJVt0bXAxXSwgICAgJVt0bXAzXSAgICAgICAgICAgXG5cdCIgIC8vIHRtcDEgPSB0bXAxIC0gdG1wMzsKKyAgICAgICAgICAgICAgICAgICAgImFkZC5zICAgICVbdG1wNl0sICAlW3RtcDJdLCAgICAlW3RtcDRdICAgICAgICAgICBcblx0IiAgLy8gdG1wNiA9IHRtcDIgKyB0bXA0OworICAgICAgICAgICAgICAgICAgICAic3ViLnMgICAgJVt0bXAyXSwgICVbdG1wMl0sICAgICVbdG1wNF0gICAgICAgICAgIFxuXHQiICAvLyB0bXAyID0gdG1wMiAtIHRtcDQ7CisgICAgICAgICAgICAgICAgICAgICJzdWIucyAgICAlW3RlbXAxXSwgJVt0ZW1wXSwgICAgJVt0bXA1XSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFkZC5zICAgICVbdGVtcF0sICAlW3RlbXBdLCAgICAlW3RtcDVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAic3ViLnMgICAgJVtwb20xXSwgICVbcG9tXSwgICAgICVbdG1wNl0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJhZGQucyAgICAlW3BvbV0sICAgJVtwb21dLCAgICAgJVt0bXA2XSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImx3YzEgICAgICVbdGVtcDNdLCAwKCVbdG1wel9uNF9pXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAibHdjMSAgICAgJVtwb20yXSwgIDQoJVt0bXB6X240X2ldKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzd2MxICAgICAlW3RlbXAxXSwgMCglW3RtcHpfbjJfaV0pICAgICAgICAgICAgICAgXG5cdCIgIC8vIHRtcHpbIG4yK2ldLnJlID0gdG1welsgICBpXS5yZSAtIHRtcDU7CisgICAgICAgICAgICAgICAgICAgICJzd2MxICAgICAlW3RlbXBdLCAgMCglW3RtcHpfaV0pICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHRtcHpbICAgIGldLnJlID0gdG1welsgICBpXS5yZSArIHRtcDU7CisgICAgICAgICAgICAgICAgICAgICJzd2MxICAgICAlW3BvbTFdLCAgNCglW3RtcHpfbjJfaV0pICAgICAgICAgICAgICAgXG5cdCIgIC8vIHRtcHpbIG4yK2ldLmltID0gdG1welsgICBpXS5pbSAtIHRtcDY7CisgICAgICAgICAgICAgICAgICAgICJzd2MxICAgICAlW3BvbV0gLCAgNCglW3RtcHpfaV0pICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHRtcHpbICAgIGldLmltID0gdG1welsgICBpXS5pbSArIHRtcDY7CisgICAgICAgICAgICAgICAgICAgICJzdWIucyAgICAlW3RlbXA0XSwgJVt0ZW1wM10sICAgJVt0bXAyXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgImFkZC5zICAgICVbcG9tM10sICAlW3BvbTJdLCAgICAlW3RtcDFdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAiYWRkLnMgICAgJVt0ZW1wM10sICVbdGVtcDNdLCAgICVbdG1wMl0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICJzdWIucyAgICAlW3BvbTJdLCAgJVtwb20yXSwgICAgJVt0bXAxXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgInN3YzEgICAgICVbdGVtcDRdLCAwKCVbdG1wel9uMzRfaV0pICAgICAgICAgICAgICBcblx0IiAgLy8gdG1weltuMzQraV0ucmUgPSB0bXB6W240K2ldLnJlIC0gdG1wMjsKKyAgICAgICAgICAgICAgICAgICAgInN3YzEgICAgICVbcG9tM10sICA0KCVbdG1wel9uMzRfaV0pICAgICAgICAgICAgICBcblx0IiAgLy8gdG1weltuMzQraV0uaW0gPSB0bXB6W240K2ldLmltICsgdG1wMTsKKyAgICAgICAgICAgICAgICAgICAgInN3YzEgICAgICVbdGVtcDNdLCAwKCVbdG1wel9uNF9pXSkgICAgICAgICAgICAgICBcblx0IiAgLy8gdG1welsgbjQraV0ucmUgPSB0bXB6W240K2ldLnJlICsgdG1wMjsKKyAgICAgICAgICAgICAgICAgICAgInN3YzEgICAgICVbcG9tMl0sICA0KCVbdG1wel9uNF9pXSkgICAgICAgICAgICAgICBcblx0IiAgLy8gdG1welsgbjQraV0uaW0gPSB0bXB6W240K2ldLmltIC0gdG1wMTsKKyAgICAgICAgICAgICAgICAgICAgOiBbdG1wMV0iPSZmIih0bXAxKSwgW3RtcDJdIj0mZiIgKHRtcDIpLCBbdGVtcF0iPSZmIih0ZW1wKSwgW3RtcDNdIj0mZiIodG1wMyksCisgICAgICAgICAgICAgICAgICAgICAgW3RtcDRdIj0mZiIodG1wNCksIFt0bXA1XSI9JmYiKHRtcDUpLCBbdG1wNl0iPSZmIih0bXA2KSwKKyAgICAgICAgICAgICAgICAgICAgICBbdGVtcDFdIj0mZiIodGVtcDEpLCBbdGVtcDNdIj0mZiIodGVtcDMpLCBbdGVtcDRdIj0mZiIodGVtcDQpLAorICAgICAgICAgICAgICAgICAgICAgIFtwb21dIj0mZiIocG9tKSwgW3BvbTFdIj0mZiIocG9tMSksIFtwb20yXSI9JmYiKHBvbTIpLCBbcG9tM10iPSZmIihwb20zKQorICAgICAgICAgICAgICAgICAgICA6IFt3X3JlXSJmIih3X3JlKSwgW3dfaW1dImYiKHdfaW0pLAorICAgICAgICAgICAgICAgICAgICAgIFt0bXB6X2ldInIiKHRtcHpfaSksW3RtcHpfbjJfaV0iciIodG1wel9uMl9pKSwKKyAgICAgICAgICAgICAgICAgICAgICBbdG1wel9uMzRfaV0iciIodG1wel9uMzRfaSksIFt0bXB6X240X2ldInIiKHRtcHpfbjRfaSkKKyAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgd19yZV9wdHIgKz0gc3RlcDsKKyAgICAgICAgICAgICAgICB3X2ltX3B0ciAtPSBzdGVwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0ZXAgPj49IDE7CisgICAgICAgIG40ICAgPDw9IDE7CisgICAgfQorfQorCisvKioKKyAqIE1EQ1QvSU1EQ1QgdHJhbnNmb3Jtcy4KKyAqLworCitzdGF0aWMgdm9pZCBmZl9pbWRjdF9oYWxmX21pcHMoRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpCit7CisgICAgaW50IGssIG44LCBuNCwgbjIsIG4sIGo7CisgICAgY29uc3QgdWludDE2X3QgKnJldnRhYiA9IHMtPnJldnRhYjsKKyAgICBjb25zdCBGRlRTYW1wbGUgKnRjb3MgPSBzLT50Y29zOworICAgIGNvbnN0IEZGVFNhbXBsZSAqdHNpbiA9IHMtPnRzaW47CisgICAgY29uc3QgRkZUU2FtcGxlICppbjEsICppbjIsICppbjMsICppbjQ7CisgICAgRkZUQ29tcGxleCAqeiA9IChGRlRDb21wbGV4ICopb3V0cHV0OworCisgICAgaW50IGoxOworICAgIGNvbnN0IGZsb2F0ICp0Y29zMSwgKnRzaW4xLCAqdGNvczIsICp0c2luMjsKKyAgICBmbG9hdCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsCisgICAgICAgIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTY7CisgICAgRkZUQ29tcGxleCAqejEsICp6MjsKKworICAgIG4gPSAxIDw8IHMtPm1kY3RfYml0czsKKyAgICBuMiA9IG4gPj4gMTsKKyAgICBuNCA9IG4gPj4gMjsKKyAgICBuOCA9IG4gPj4gMzsKKworICAgIC8qIHByZSByb3RhdGlvbiAqLworICAgIGluMSA9IGlucHV0OworICAgIGluMiA9IGlucHV0ICsgbjIgLSAxOworICAgIGluMyA9IGlucHV0ICsgMjsKKyAgICBpbjQgPSBpbnB1dCArIG4yIC0gMzsKKworICAgIHRjb3MxID0gdGNvczsKKyAgICB0c2luMSA9IHRzaW47CisKKyAgICAvKiBuNCA9IDY0IG9yIDEyOCAqLworICAgIGZvcihrID0gMDsgayA8IG40OyBrICs9IDIpIHsKKyAgICAgICAgaiAgPSByZXZ0YWJbayAgICBdOworICAgICAgICBqMSA9IHJldnRhYltrICsgMV07CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAibHdjMSAgICAgICAgICAgJVt0ZW1wMV0sICAgICAgIDAoJVtpbjJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibHdjMSAgICAgICAgICAgJVt0ZW1wMl0sICAgICAgIDAoJVt0Y29zMV0pICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibHdjMSAgICAgICAgICAgJVt0ZW1wM10sICAgICAgIDAoJVt0c2luMV0pICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibHdjMSAgICAgICAgICAgJVt0ZW1wNF0sICAgICAgIDAoJVtpbjFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibHdjMSAgICAgICAgICAgJVt0ZW1wNV0sICAgICAgIDAoJVtpbjRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibXVsLnMgICAgICAgICAgJVt0ZW1wOV0sICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDJdICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibXVsLnMgICAgICAgICAgJVt0ZW1wMTBdLCAgICAgICVbdGVtcDFdLCAgICVbdGVtcDNdICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibHdjMSAgICAgICAgICAgJVt0ZW1wNl0sICAgICAgIDQoJVt0Y29zMV0pICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibHdjMSAgICAgICAgICAgJVt0ZW1wN10sICAgICAgIDQoJVt0c2luMV0pICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibm1zdWIucyAgICAgICAgJVt0ZW1wOV0sICAgICAgICVbdGVtcDldLCAgICVbdGVtcDRdLCAgICVbdGVtcDNdICAgIFx0XG4iCisgICAgICAgICAgICAibWFkZC5zICAgICAgICAgJVt0ZW1wMTBdLCAgICAgICVbdGVtcDEwXSwgICVbdGVtcDRdLCAgICVbdGVtcDJdICAgIFx0XG4iCisgICAgICAgICAgICAibXVsLnMgICAgICAgICAgJVt0ZW1wMTFdLCAgICAgICVbdGVtcDVdLCAgICVbdGVtcDZdICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibXVsLnMgICAgICAgICAgJVt0ZW1wMTJdLCAgICAgICVbdGVtcDVdLCAgICVbdGVtcDddICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibHdjMSAgICAgICAgICAgJVt0ZW1wOF0sICAgICAgIDAoJVtpbjNdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAiYWRkaXUgICAgICAgICAgJVt0Y29zMV0sICAgICAgICVbdGNvczFdLCAgIDggICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAiYWRkaXUgICAgICAgICAgJVt0c2luMV0sICAgICAgICVbdHNpbjFdLCAgIDggICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAiYWRkaXUgICAgICAgICAgJVtpbjFdLCAgICAgICAgICVbaW4xXSwgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibm1zdWIucyAgICAgICAgJVt0ZW1wMTFdLCAgICAgICVbdGVtcDExXSwgICVbdGVtcDhdLCAgICVbdGVtcDddICAgIFx0XG4iCisgICAgICAgICAgICAibWFkZC5zICAgICAgICAgJVt0ZW1wMTJdLCAgICAgICVbdGVtcDEyXSwgICVbdGVtcDhdLCAgICVbdGVtcDZdICAgIFx0XG4iCisgICAgICAgICAgICAiYWRkaXUgICAgICAgICAgJVtpbjJdLCAgICAgICAgICVbaW4yXSwgICAgIC0xNiAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAiYWRkaXUgICAgICAgICAgJVtpbjNdLCAgICAgICAgICVbaW4zXSwgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAiYWRkaXUgICAgICAgICAgJVtpbjRdLCAgICAgICAgICVbaW40XSwgICAgIC0xNiAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisKKyAgICAgICAgICAgIDogW3RlbXAxXSI9JmYiKHRlbXAxKSwgW3RlbXAyXSI9JmYiKHRlbXAyKSwKKyAgICAgICAgICAgICAgW3RlbXAzXSI9JmYiKHRlbXAzKSwgW3RlbXA0XSI9JmYiKHRlbXA0KSwKKyAgICAgICAgICAgICAgW3RlbXA1XSI9JmYiKHRlbXA1KSwgW3RlbXA2XSI9JmYiKHRlbXA2KSwKKyAgICAgICAgICAgICAgW3RlbXA3XSI9JmYiKHRlbXA3KSwgW3RlbXA4XSI9JmYiKHRlbXA4KSwKKyAgICAgICAgICAgICAgW3RlbXA5XSI9JmYiKHRlbXA5KSwgW3RlbXAxMF0iPSZmIih0ZW1wMTApLAorICAgICAgICAgICAgICBbdGVtcDExXSI9JmYiKHRlbXAxMSksIFt0ZW1wMTJdIj0mZiIodGVtcDEyKSwKKyAgICAgICAgICAgICAgW3RzaW4xXSIrciIodHNpbjEpLCBbdGNvczFdIityIih0Y29zMSksCisgICAgICAgICAgICAgIFtpbjFdIityIihpbjEpLCBbaW4yXSIrciIoaW4yKSwKKyAgICAgICAgICAgICAgW2luM10iK3IiKGluMyksIFtpbjRdIityIihpbjQpCisgICAgICAgICAgICA6CisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgeltqIF0ucmUgPSB0ZW1wOTsKKyAgICAgICAgeltqIF0uaW0gPSB0ZW1wMTA7CisgICAgICAgIHpbajFdLnJlID0gdGVtcDExOworICAgICAgICB6W2oxXS5pbSA9IHRlbXAxMjsKKyAgICB9CisKKyAgICBzLT5mZnRfY2FsYyhzLCB6KTsKKworICAgIC8qIHBvc3Qgcm90YXRpb24gKyByZW9yZGVyaW5nICovCisgICAgLyogbjggPSAzMiBvciA2NCAqLworICAgIGZvcihrID0gMDsgayA8IG44OyBrICs9IDIpIHsKKyAgICAgICAgdGNvczEgPSAmdGNvc1tuOCAtIGsgLSAyXTsKKyAgICAgICAgdHNpbjEgPSAmdHNpbltuOCAtIGsgLSAyXTsKKyAgICAgICAgdGNvczIgPSAmdGNvc1tuOCArIGtdOworICAgICAgICB0c2luMiA9ICZ0c2luW244ICsga107CisgICAgICAgIHoxID0gJnpbbjggLSBrIC0gMl07CisgICAgICAgIHoyID0gJnpbbjggKyBrICAgIF07CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAibHdjMSAgICAgICAlW3RlbXAxXSwgICAxMiglW3oxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMl0sICAgNCglW3RzaW4xXSkgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbdGVtcDNdLCAgIDQoJVt0Y29zMV0pICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibHdjMSAgICAgICAlW3RlbXA0XSwgICA4KCVbejFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wNV0sICAgNCglW3oxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgICAgICJtdWwucyAgICAgICVbdGVtcDldLCAgICVbdGVtcDFdLCAgICVbdGVtcDJdICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibXVsLnMgICAgICAlW3RlbXAxMF0sICAlW3RlbXAxXSwgICAlW3RlbXAzXSAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wNl0sICAgMCglW3RzaW4xXSkgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbdGVtcDddLCAgIDAoJVt0Y29zMV0pICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibm1zdWIucyAgICAlW3RlbXA5XSwgICAlW3RlbXA5XSwgICAlW3RlbXA0XSwgICAlW3RlbXAzXSAgICBcdFxuIgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVt0ZW1wMTBdLCAgJVt0ZW1wMTBdLCAgJVt0ZW1wNF0sICAgJVt0ZW1wMl0gICAgXHRcbiIKKyAgICAgICAgICAgICJtdWwucyAgICAgICVbdGVtcDExXSwgICVbdGVtcDVdLCAgICVbdGVtcDZdICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibXVsLnMgICAgICAlW3RlbXAxMl0sICAlW3RlbXA1XSwgICAlW3RlbXA3XSAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wOF0sICAgMCglW3oxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbdGVtcDFdLCAgIDQoJVt6Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibHdjMSAgICAgICAlW3RlbXAyXSwgICAwKCVbdHNpbjJdKSAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wM10sICAgMCglW3Rjb3MyXSkgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgICAgICJubXN1Yi5zICAgICVbdGVtcDExXSwgICVbdGVtcDExXSwgICVbdGVtcDhdLCAgICVbdGVtcDddICAgIFx0XG4iCisgICAgICAgICAgICAibWFkZC5zICAgICAlW3RlbXAxMl0sICAlW3RlbXAxMl0sICAlW3RlbXA4XSwgICAlW3RlbXA2XSAgICBcdFxuIgorICAgICAgICAgICAgIm11bC5zICAgICAgJVt0ZW1wMTNdLCAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgICAgICJtdWwucyAgICAgICVbdGVtcDE0XSwgICVbdGVtcDFdLCAgICVbdGVtcDNdICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibHdjMSAgICAgICAlW3RlbXA0XSwgICAwKCVbejJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wNV0sICAgMTIoJVt6Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbdGVtcDZdLCAgIDQoJVt0c2luMl0pICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibHdjMSAgICAgICAlW3RlbXA3XSwgICA0KCVbdGNvczJdKSAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAgICAgIm5tc3ViLnMgICAgJVt0ZW1wMTNdLCAgJVt0ZW1wMTNdLCAgJVt0ZW1wNF0sICAgJVt0ZW1wM10gICAgXHRcbiIKKyAgICAgICAgICAgICJtYWRkLnMgICAgICVbdGVtcDE0XSwgICVbdGVtcDE0XSwgICVbdGVtcDRdLCAgICVbdGVtcDJdICAgIFx0XG4iCisgICAgICAgICAgICAibXVsLnMgICAgICAlW3RlbXAxNV0sICAlW3RlbXA1XSwgICAlW3RlbXA2XSAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAgICAgIm11bC5zICAgICAgJVt0ZW1wMTZdLCAgJVt0ZW1wNV0sICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbdGVtcDhdLCAgIDgoJVt6Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICAgICAibm1zdWIucyAgICAlW3RlbXAxNV0sICAlW3RlbXAxNV0sICAlW3RlbXA4XSwgICAlW3RlbXA3XSAgICBcdFxuIgorICAgICAgICAgICAgIm1hZGQucyAgICAgJVt0ZW1wMTZdLCAgJVt0ZW1wMTZdLCAgJVt0ZW1wOF0sICAgJVt0ZW1wNl0gICAgXHRcbiIKKyAgICAgICAgICAgIDogW3RlbXAxXSI9JmYiKHRlbXAxKSwgW3RlbXAyXSI9JmYiKHRlbXAyKSwKKyAgICAgICAgICAgICAgW3RlbXAzXSI9JmYiKHRlbXAzKSwgW3RlbXA0XSI9JmYiKHRlbXA0KSwKKyAgICAgICAgICAgICAgW3RlbXA1XSI9JmYiKHRlbXA1KSwgW3RlbXA2XSI9JmYiKHRlbXA2KSwKKyAgICAgICAgICAgICAgW3RlbXA3XSI9JmYiKHRlbXA3KSwgW3RlbXA4XSI9JmYiKHRlbXA4KSwKKyAgICAgICAgICAgICAgW3RlbXA5XSI9JmYiKHRlbXA5KSwgW3RlbXAxMF0iPSZmIih0ZW1wMTApLAorICAgICAgICAgICAgICBbdGVtcDExXSI9JmYiKHRlbXAxMSksIFt0ZW1wMTJdIj0mZiIodGVtcDEyKSwKKyAgICAgICAgICAgICAgW3RlbXAxM10iPSZmIih0ZW1wMTMpLCBbdGVtcDE0XSI9JmYiKHRlbXAxNCksCisgICAgICAgICAgICAgIFt0ZW1wMTVdIj0mZiIodGVtcDE1KSwgW3RlbXAxNl0iPSZmIih0ZW1wMTYpCisgICAgICAgICAgICA6IFt6MV0iciIoejEpLCBbejJdInIiKHoyKSwKKyAgICAgICAgICAgICAgW3RzaW4xXSJyIih0c2luMSksIFt0Y29zMV0iciIodGNvczEpLAorICAgICAgICAgICAgICBbdHNpbjJdInIiKHRzaW4yKSwgW3Rjb3MyXSJyIih0Y29zMikKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKworICAgICAgICB6MVsxXS5yZSA9IHRlbXA5OworICAgICAgICB6MVsxXS5pbSA9IHRlbXAxNDsKKyAgICAgICAgejJbMF0ucmUgPSB0ZW1wMTM7CisgICAgICAgIHoyWzBdLmltID0gdGVtcDEwOworCisgICAgICAgIHoxWzBdLnJlID0gdGVtcDExOworICAgICAgICB6MVswXS5pbSA9IHRlbXAxNjsKKyAgICAgICAgejJbMV0ucmUgPSB0ZW1wMTU7CisgICAgICAgIHoyWzFdLmltID0gdGVtcDEyOworICAgIH0KK30KKworLyoqCisgKiBDb21wdXRlIGludmVyc2UgTURDVCBvZiBzaXplIE4gPSAyXm5iaXRzCisgKiBAcGFyYW0gb3V0cHV0IE4gc2FtcGxlcworICogQHBhcmFtIGlucHV0IE4vMiBzYW1wbGVzCisgKi8KK3N0YXRpYyB2b2lkIGZmX2ltZGN0X2NhbGNfbWlwcyhGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm91dHB1dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dCkKK3sKKyAgICBpbnQgazsKKyAgICBpbnQgbiA9IDEgPDwgcy0+bWRjdF9iaXRzOworICAgIGludCBuMiA9IG4gPj4gMTsKKyAgICBpbnQgbjQgPSBuID4+IDI7CisKKyAgICBmZl9pbWRjdF9oYWxmX21pcHMocywgb3V0cHV0K240LCBpbnB1dCk7CisKKyAgICBmb3IoayA9IDA7IGsgPCBuNDsgays9NCkgeworICAgICAgICBvdXRwdXRba10gPSAtb3V0cHV0W24yLWstMV07CisgICAgICAgIG91dHB1dFtrKzFdID0gLW91dHB1dFtuMi1rLTJdOworICAgICAgICBvdXRwdXRbaysyXSA9IC1vdXRwdXRbbjItay0zXTsKKyAgICAgICAgb3V0cHV0W2srM10gPSAtb3V0cHV0W24yLWstNF07CisKKyAgICAgICAgb3V0cHV0W24tay0xXSA9IG91dHB1dFtuMitrXTsKKyAgICAgICAgb3V0cHV0W24tay0yXSA9IG91dHB1dFtuMitrKzFdOworICAgICAgICBvdXRwdXRbbi1rLTNdID0gb3V0cHV0W24yK2srMl07CisgICAgICAgIG91dHB1dFtuLWstNF0gPSBvdXRwdXRbbjIrayszXTsKKyAgICB9Cit9CisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCisKK2F2X2NvbGQgdm9pZCBmZl9mZnRfaW5pdF9taXBzKEZGVENvbnRleHQgKnMpCit7CisgICAgaW50IG49MDsKKworICAgIGZmX2ZmdF9sdXRfaW5pdChmZl9mZnRfb2Zmc2V0c19sdXQsIDAsIDEgPDwgMTYsICZuKTsKKyAgICBmZl9pbml0X2ZmX2Nvc190YWJzKDE2KTsKKworI2lmIEhBVkVfSU5MSU5FX0FTTQorICAgIHMtPmZmdF9jYWxjICAgICA9IGZmX2ZmdF9jYWxjX21pcHM7CisjaWYgQ09ORklHX01EQ1QKKyAgICBzLT5pbWRjdF9jYWxjICAgPSBmZl9pbWRjdF9jYWxjX21pcHM7CisgICAgcy0+aW1kY3RfaGFsZiAgID0gZmZfaW1kY3RfaGFsZl9taXBzOworI2VuZGlmCisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvZm10Y29udmVydF9taXBzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2ZtdGNvbnZlcnRfbWlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDI2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2ZtdGNvbnZlcnRfbWlwcy5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogRm9ybWF0IENvbnZlcnNpb24gVXRpbHMgZm9yIE1JUFMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIKKyAqICAgICAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIENhbGlmb3JuaWEuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgbm9yIHRoZSBuYW1lcyBvZiBpcworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogIFpvcmFuIEx1a2ljICh6b3JhbmxAbWlwcy5jb20pCisgKiBBdXRob3I6ICBOZWRlbGprbyBCYWJpYyAobmJhYmljQG1pcHMuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZm10Y29udmVydC5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisjaWYgSEFWRV9NSVBTRFNQUjEKK3N0YXRpYyB2b2lkIGZsb2F0X3RvX2ludDE2X21pcHMoaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBsb25nIGxlbikKK3sKKyAgICBjb25zdCBmbG9hdCAqc3JjX2VuZCA9IHNyYyArIGxlbjsKKyAgICBpbnQgcmV0MCwgcmV0MSwgcmV0MiwgcmV0MywgcmV0NCwgcmV0NSwgcmV0NiwgcmV0NzsKKyAgICBmbG9hdCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworCisgICAgLyoKKyAgICAgKiBsb29wIGlzIDggdGltZXMgdW5yb2xsZWQgaW4gYXNzZW1ibGVyIGluIG9yZGVyIHRvIGFjaGlldmUgYmV0dGVyIHBlcmZvcm1hbmNlCisgICAgICovCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImJlcSAgICAgICAgJVtsZW5dLCAgJHplcm8sICAgZnRpMTZfZW5kJT0gICBcblx0IgorICAgICAgICAiZnRpMTZfbHAlPTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbc3JjMF0sIDAoJVtzcmNdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICAgJVtzcmMxXSwgNCglW3NyY10pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW3NyYzJdLCA4KCVbc3JjXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbc3JjM10sIDEyKCVbc3JjXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImN2dC53LnMgICAgJVtzcmMwXSwgJVtzcmMwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiY3Z0LncucyAgICAlW3NyYzFdLCAlW3NyYzFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjdnQudy5zICAgICVbc3JjMl0sICVbc3JjMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImN2dC53LnMgICAgJVtzcmMzXSwgJVtzcmMzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZjMSAgICAgICAlW3JldDBdLCAlW3NyYzBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmMxICAgICAgICVbcmV0MV0sICVbc3JjMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1mYzEgICAgICAgJVtyZXQyXSwgJVtzcmMyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZjMSAgICAgICAlW3JldDNdLCAlW3NyYzNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbc3JjNF0sIDE2KCVbc3JjXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICAgJVtzcmM1XSwgMjAoJVtzcmNdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW3NyYzZdLCAyNCglW3NyY10pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbc3JjN10sIDI4KCVbc3JjXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImN2dC53LnMgICAgJVtzcmM0XSwgJVtzcmM0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiY3Z0LncucyAgICAlW3NyYzVdLCAlW3NyYzVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjdnQudy5zICAgICVbc3JjNl0sICVbc3JjNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImN2dC53LnMgICAgJVtzcmM3XSwgJVtzcmM3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgICAlW3NyY10sICAzMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaGxsX3MudyAgICVbcmV0MF0sICVbcmV0MF0sIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNobGxfcy53ICAgJVtyZXQxXSwgJVtyZXQxXSwgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hsbF9zLncgICAlW3JldDJdLCAlW3JldDJdLCAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaGxsX3MudyAgICVbcmV0M10sICVbcmV0M10sIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNybCAgICAgICAgJVtyZXQwXSwgJVtyZXQwXSwgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAic3JsICAgICAgICAlW3JldDFdLCAlW3JldDFdLCAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzcmwgICAgICAgICVbcmV0Ml0sICVbcmV0Ml0sIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNybCAgICAgICAgJVtyZXQzXSwgJVtyZXQzXSwgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW3JldDBdLCAwKCVbZHN0XSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbcmV0MV0sIDIoJVtkc3RdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgJVtyZXQyXSwgNCglW2RzdF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW3JldDNdLCA2KCVbZHN0XSkgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmMxICAgICAgICVbcmV0NF0sICVbc3JjNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1mYzEgICAgICAgJVtyZXQ1XSwgJVtzcmM1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZjMSAgICAgICAlW3JldDZdLCAlW3NyYzZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmMxICAgICAgICVbcmV0N10sICVbc3JjN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNobGxfcy53ICAgJVtyZXQ0XSwgJVtyZXQ0XSwgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hsbF9zLncgICAlW3JldDVdLCAlW3JldDVdLCAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaGxsX3MudyAgICVbcmV0Nl0sICVbcmV0Nl0sIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNobGxfcy53ICAgJVtyZXQ3XSwgJVtyZXQ3XSwgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAic3JsICAgICAgICAlW3JldDRdLCAlW3JldDRdLCAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzcmwgICAgICAgICVbcmV0NV0sICVbcmV0NV0sIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNybCAgICAgICAgJVtyZXQ2XSwgJVtyZXQ2XSwgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAic3JsICAgICAgICAlW3JldDddLCAlW3JldDddLCAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbcmV0NF0sIDgoJVtkc3RdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgJVtyZXQ1XSwgMTAoJVtkc3RdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW3JldDZdLCAxMiglW2RzdF0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbcmV0N10sIDE0KCVbZHN0XSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICAgJVtkc3RdLCAgMTYgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICAgICAlW3NyY10sICAlW3NyY19lbmRdLCBmdGkxNl9scCU9IFxuXHQiCisgICAgICAgICJmdGkxNl9lbmQlPTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbcmV0MF0iPSZyIihyZXQwKSwgW3JldDFdIj0mciIocmV0MSksIFtyZXQyXSI9JnIiKHJldDIpLCBbcmV0M10iPSZyIihyZXQzKSwKKyAgICAgICAgICBbcmV0NF0iPSZyIihyZXQ0KSwgW3JldDVdIj0mciIocmV0NSksIFtyZXQ2XSI9JnIiKHJldDYpLCBbcmV0N10iPSZyIihyZXQ3KSwKKyAgICAgICAgICBbc3JjMF0iPSZmIihzcmMwKSwgW3NyYzFdIj0mZiIoc3JjMSksIFtzcmMyXSI9JmYiKHNyYzIpLCBbc3JjM10iPSZmIihzcmMzKSwKKyAgICAgICAgICBbc3JjNF0iPSZmIihzcmM0KSwgW3NyYzVdIj0mZiIoc3JjNSksIFtzcmM2XSI9JmYiKHNyYzYpLCBbc3JjN10iPSZmIihzcmM3KSwKKyAgICAgICAgICBbc3JjXSIrciIoc3JjKSwgW2RzdF0iK3IiKGRzdCkKKyAgICAgICAgOiBbc3JjX2VuZF0iciIoc3JjX2VuZCksIFtsZW5dInIiKGxlbikKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkIGZsb2F0X3RvX2ludDE2X2ludGVybGVhdmVfbWlwcyhpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCBsb25nIGxlbiwKKyAgICAgICAgaW50IGNoYW5uZWxzKQoreworICAgIGludCAgIGMsIGNoMiA9IGNoYW5uZWxzIDw8MTsKKyAgICBpbnQgcmV0MCwgcmV0MSwgcmV0MiwgcmV0MywgcmV0NCwgcmV0NSwgcmV0NiwgcmV0NzsKKyAgICBmbG9hdCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIGludDE2X3QgKmRzdF9wdHIwLCAqZHN0X3B0cjEsICpkc3RfcHRyMiwgKmRzdF9wdHIzOworICAgIGludDE2X3QgKmRzdF9wdHI0LCAqZHN0X3B0cjUsICpkc3RfcHRyNiwgKmRzdF9wdHI3OworICAgIGNvbnN0IGZsb2F0ICpzcmNfcHRyLCAqc3JjX3B0cjIsICpzcmNfZW5kOworCisgICAgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgc3JjX3B0ciA9ICZzcmNbMF1bMF07CisgICAgICAgIHNyY19wdHIyID0gJnNyY1sxXVswXTsKKyAgICAgICAgc3JjX2VuZCA9IHNyY19wdHIgKyBsZW47CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiZnRpMTZpMl9scCU9OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgICVbc3JjMF0sICAgIDAoJVtzcmNfcHRyXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVtzcmMxXSwgICAgMCglW3NyY19wdHIyXSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW3NyY19wdHJdLCA0ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJjdnQudy5zICAgICRmOSwgICAgICAgICVbc3JjMF0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImN2dC53LnMgICAgJGYxMCwgICAgICAgJVtzcmMxXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZjMSAgICAgICAlW3JldDBdLCAgICAkZjkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtZmMxICAgICAgICVbcmV0MV0sICAgICRmMTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNobGxfcy53ICAgJVtyZXQwXSwgICAgJVtyZXQwXSwgMTYgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2hsbF9zLncgICAlW3JldDFdLCAgICAlW3JldDFdLCAxNiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICAgICVbc3JjX3B0cjJdLCA0ICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNybCAgICAgICAgJVtyZXQwXSwgICAgJVtyZXQwXSwgMTYgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JsICAgICAgICAlW3JldDFdLCAgICAlW3JldDFdLCAxNiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzaCAgICAgICAgICVbcmV0MF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNoICAgICAgICAgJVtyZXQxXSwgICAgMiglW2RzdF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICAlW2RzdF0sICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJibmUgICAgICAgICVbc3JjX3B0cl0sICVbc3JjX2VuZF0sIGZ0aTE2aTJfbHAlPSBcblx0IgorICAgICAgICAgICAgOiBbcmV0MF0iPSZyIihyZXQwKSwgW3JldDFdIj0mciIocmV0MSksCisgICAgICAgICAgICAgIFtzcmMwXSI9JmYiKHNyYzApLCBbc3JjMV0iPSZmIihzcmMxKSwKKyAgICAgICAgICAgICAgW3NyY19wdHJdIityIihzcmNfcHRyKSwgW3NyY19wdHIyXSIrciIoc3JjX3B0cjIpLAorICAgICAgICAgICAgICBbZHN0XSIrciIoZHN0KQorICAgICAgICAgICAgOiBbc3JjX2VuZF0iciIoc3JjX2VuZCkKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgc3JjX3B0ciAgPSAmc3JjW2NdWzBdOworICAgICAgICAgICAgZHN0X3B0cjAgPSAmZHN0W2NdOworICAgICAgICAgICAgc3JjX2VuZCA9IHNyY19wdHIgKyBsZW47CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogbG9vcCBpcyA4IHRpbWVzIHVucm9sbGVkIGluIGFzc2VtYmxlciBpbiBvcmRlciB0byBhY2hpZXZlIGJldHRlciBwZXJmb3JtYW5jZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgICAgICJmdGkxNmlfbHAlPTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAgICAlW3NyYzBdLCAwKCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgICAgJVtzcmMxXSwgNCglW3NyY19wdHJdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICAgICVbc3JjMl0sIDgoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAgICAlW3NyYzNdLCAxMiglW3NyY19wdHJdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImN2dC53LnMgICAgJVtzcmMwXSwgJVtzcmMwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJjdnQudy5zICAgICVbc3JjMV0sICVbc3JjMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiY3Z0LncucyAgICAlW3NyYzJdLCAlW3NyYzJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImN2dC53LnMgICAgJVtzcmMzXSwgJVtzcmMzXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtZmMxICAgICAgICVbcmV0MF0sICVbc3JjMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWZjMSAgICAgICAlW3JldDFdLCAlW3NyYzFdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1mYzEgICAgICAgJVtyZXQyXSwgJVtzcmMyXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtZmMxICAgICAgICVbcmV0M10sICVbc3JjM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAgICAlW3NyYzRdLCAxNiglW3NyY19wdHJdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAgICAgJVtzcmM1XSwgMjAoJVtzcmNfcHRyXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgICAgICVbc3JjNl0sIDI0KCVbc3JjX3B0cl0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICAgICAlW3NyYzddLCAyOCglW3NyY19wdHJdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAgICAgJVtkc3RfcHRyMV0sICVbZHN0X3B0cjBdLCAlW2NoMl0gICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGR1ICAgICAgICVbZHN0X3B0cjJdLCAlW2RzdF9wdHIxXSwgJVtjaDJdICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICAgICAlW2RzdF9wdHIzXSwgJVtkc3RfcHRyMl0sICVbY2gyXSAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAgICAgJVtkc3RfcHRyNF0sICVbZHN0X3B0cjNdLCAlW2NoMl0gICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGR1ICAgICAgICVbZHN0X3B0cjVdLCAlW2RzdF9wdHI0XSwgJVtjaDJdICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkdSAgICAgICAlW2RzdF9wdHI2XSwgJVtkc3RfcHRyNV0sICVbY2gyXSAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHUgICAgICAgJVtkc3RfcHRyN10sICVbZHN0X3B0cjZdLCAlW2NoMl0gICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRpdSAgICAgICVbc3JjX3B0cl0sICAzMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiY3Z0LncucyAgICAlW3NyYzRdLCAlW3NyYzRdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImN2dC53LnMgICAgJVtzcmM1XSwgJVtzcmM1XSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJjdnQudy5zICAgICVbc3JjNl0sICVbc3JjNl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiY3Z0LncucyAgICAlW3NyYzddLCAlW3NyYzddICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNobGxfcy53ICAgJVtyZXQwXSwgJVtyZXQwXSwgMTYgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzaGxsX3MudyAgICVbcmV0MV0sICVbcmV0MV0sIDE2ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2hsbF9zLncgICAlW3JldDJdLCAlW3JldDJdLCAxNiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNobGxfcy53ICAgJVtyZXQzXSwgJVtyZXQzXSwgMTYgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcmV0MF0sICVbcmV0MF0sIDE2ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3JldDFdLCAlW3JldDFdLCAxNiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtyZXQyXSwgJVtyZXQyXSwgMTYgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcmV0M10sICVbcmV0M10sIDE2ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2ggICAgICAgICAlW3JldDBdLCAwKCVbZHN0X3B0cjBdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNoICAgICAgICAgJVtyZXQxXSwgMCglW2RzdF9wdHIxXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzaCAgICAgICAgICVbcmV0Ml0sIDAoJVtkc3RfcHRyMl0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2ggICAgICAgICAlW3JldDNdLCAwKCVbZHN0X3B0cjNdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1mYzEgICAgICAgJVtyZXQ0XSwgJVtzcmM0XSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtZmMxICAgICAgICVbcmV0NV0sICVbc3JjNV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWZjMSAgICAgICAlW3JldDZdLCAlW3NyYzZdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1mYzEgICAgICAgJVtyZXQ3XSwgJVtzcmM3XSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzaGxsX3MudyAgICVbcmV0NF0sICVbcmV0NF0sIDE2ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2hsbF9zLncgICAlW3JldDVdLCAlW3JldDVdLCAxNiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNobGxfcy53ICAgJVtyZXQ2XSwgJVtyZXQ2XSwgMTYgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzaGxsX3MudyAgICVbcmV0N10sICVbcmV0N10sIDE2ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3JldDRdLCAlW3JldDRdLCAxNiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNybCAgICAgICAgJVtyZXQ1XSwgJVtyZXQ1XSwgMTYgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzcmwgICAgICAgICVbcmV0Nl0sICVbcmV0Nl0sIDE2ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3JsICAgICAgICAlW3JldDddLCAlW3JldDddLCAxNiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNoICAgICAgICAgJVtyZXQ0XSwgMCglW2RzdF9wdHI0XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzaCAgICAgICAgICVbcmV0NV0sIDAoJVtkc3RfcHRyNV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2ggICAgICAgICAlW3JldDZdLCAwKCVbZHN0X3B0cjZdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInNoICAgICAgICAgJVtyZXQ3XSwgMCglW2RzdF9wdHI3XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGR1ICAgICAgICVbZHN0X3B0cjBdLCAlW2RzdF9wdHI3XSwgJVtjaDJdICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYm5lICAgICAgICAlW3NyY19wdHJdLCAgJVtzcmNfZW5kXSwgIGZ0aTE2aV9scCU9IFxuXHQiCisgICAgICAgICAgICAgICAgOiBbcmV0MF0iPSZyIihyZXQwKSwgW3JldDFdIj0mciIocmV0MSksIFtyZXQyXSI9JnIiKHJldDIpLCBbcmV0M10iPSZyIihyZXQzKSwKKyAgICAgICAgICAgICAgICAgIFtyZXQ0XSI9JnIiKHJldDQpLCBbcmV0NV0iPSZyIihyZXQ1KSwgW3JldDZdIj0mciIocmV0NiksIFtyZXQ3XSI9JnIiKHJldDcpLAorICAgICAgICAgICAgICAgICAgW3NyYzBdIj0mZiIoc3JjMCksIFtzcmMxXSI9JmYiKHNyYzEpLCBbc3JjMl0iPSZmIihzcmMyKSwgW3NyYzNdIj0mZiIoc3JjMyksCisgICAgICAgICAgICAgICAgICBbc3JjNF0iPSZmIihzcmM0KSwgW3NyYzVdIj0mZiIoc3JjNSksIFtzcmM2XSI9JmYiKHNyYzYpLCBbc3JjN10iPSZmIihzcmM3KSwKKyAgICAgICAgICAgICAgICAgIFtkc3RfcHRyMV0iPSZyIihkc3RfcHRyMSksIFtkc3RfcHRyMl0iPSZyIihkc3RfcHRyMiksIFtkc3RfcHRyM10iPSZyIihkc3RfcHRyMyksCisgICAgICAgICAgICAgICAgICBbZHN0X3B0cjRdIj0mciIoZHN0X3B0cjQpLCBbZHN0X3B0cjVdIj0mciIoZHN0X3B0cjUpLCBbZHN0X3B0cjZdIj0mciIoZHN0X3B0cjYpLAorICAgICAgICAgICAgICAgICAgW2RzdF9wdHI3XSI9JnIiKGRzdF9wdHI3KSwgW2RzdF9wdHIwXSIrciIoZHN0X3B0cjApLCBbc3JjX3B0cl0iK3IiKHNyY19wdHIpCisgICAgICAgICAgICAgICAgOiBbY2gyXSJyIihjaDIpLCBbc3JjX2VuZF0iciIoc3JjX2VuZCkKKyAgICAgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8qIEhBVkVfTUlQU0RTUFIxICovCisKK3N0YXRpYyB2b2lkIGludDMyX3RvX2Zsb2F0X2ZtdWxfc2NhbGFyX21pcHMoZmxvYXQgKmRzdCwgY29uc3QgaW50ICpzcmMsCisgICAgICAgIGZsb2F0IG11bCwgaW50IGxlbikKK3sKKyAgICAvKgorICAgICAqIHZhcmlhYmxlcyB1c2VkIGluIGlubGluZSBhc3NlbWJsZXIKKyAgICAgKi8KKyAgICBmbG9hdCB0ZW1wMSwgdGVtcDMsIHRlbXA1LCB0ZW1wNywgdGVtcDksIHRlbXAxMSwgdGVtcDEzLCB0ZW1wMTU7CisKKyAgICBpbnQgcnBvbTEsIHJwb20yLCBycG9tMTEsIHJwb20yMSwgcnBvbTEyLCBycG9tMjIsIHJwb20xMywgcnBvbTIzOworICAgIGNvbnN0IGludCAqc3JjX2VuZCA9IHNyYyArIGxlbjsKKyAgICAvKgorICAgICAqIGxvb3AgaXMgOCB0aW1lcyB1bnJvbGxlZCBpbiBhc3NlbWJsZXIgaW4gb3JkZXIgdG8gYWNoaWV2ZSBiZXR0ZXIgcGVyZm9ybWFuY2UKKyAgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImkzMnRmX2xwJT06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbcnBvbTExXSwgICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbcnBvbTIxXSwgICAgIDQoJVtzcmNdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbcnBvbTFdLCAgICAgIDgoJVtzcmNdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbcnBvbTJdLCAgICAgIDEyKCVbc3JjXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICVbcnBvbTExXSwgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICVbcnBvbTIxXSwgICAgICVbdGVtcDNdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICVbcnBvbTFdLCAgICAgICVbdGVtcDVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICVbcnBvbTJdLCAgICAgICVbdGVtcDddICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibHcgICAgICAgJVtycG9tMTNdLCAgICAgMTYoJVtzcmNdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVtycG9tMjNdLCAgICAgMjAoJVtzcmNdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVtycG9tMTJdLCAgICAgMjQoJVtzcmNdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVtycG9tMjJdLCAgICAgMjgoJVtzcmNdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgJVtycG9tMTNdLCAgICAgJVt0ZW1wOV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgJVtycG9tMjNdLCAgICAgJVt0ZW1wMTFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgJVtycG9tMTJdLCAgICAgJVt0ZW1wMTNdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgJVtycG9tMjJdLCAgICAgJVt0ZW1wMTVdICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJhZGRpdSAgICAlW3NyY10sICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjdnQucy53ICAlW3RlbXAxXSwgICAgICAlW3RlbXAxXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjdnQucy53ICAlW3RlbXAzXSwgICAgICAlW3RlbXAzXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjdnQucy53ICAlW3RlbXA1XSwgICAgICAlW3RlbXA1XSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjdnQucy53ICAlW3RlbXA3XSwgICAgICAlW3RlbXA3XSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImN2dC5zLncgICVbdGVtcDldLCAgICAgICVbdGVtcDldICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImN2dC5zLncgICVbdGVtcDExXSwgICAgICVbdGVtcDExXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImN2dC5zLncgICVbdGVtcDEzXSwgICAgICVbdGVtcDEzXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImN2dC5zLncgICVbdGVtcDE1XSwgICAgICVbdGVtcDE1XSAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibXVsLnMgICAlW3RlbXAxXSwgICAgICAgJVt0ZW1wMV0sICAgICVbbXVsXSAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wM10sICAgICVbbXVsXSAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXA1XSwgICAgICAgJVt0ZW1wNV0sICAgICVbbXVsXSAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXA3XSwgICAgICAgJVt0ZW1wN10sICAgICVbbXVsXSAgICBcblx0IgorCisgICAgICAgICJtdWwucyAgICVbdGVtcDldLCAgICAgICAlW3RlbXA5XSwgICAgJVttdWxdICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDExXSwgICAgICAlW3RlbXAxMV0sICAgJVttdWxdICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDEzXSwgICAgICAlW3RlbXAxM10sICAgJVttdWxdICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICVbdGVtcDE1XSwgICAgICAlW3RlbXAxNV0sICAgJVttdWxdICAgIFxuXHQiCisKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wMV0sICAgICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgXG5cdCIgLypkc3RbaV0gPSBzcmNbaV0gKiBtdWw7ICAgICovCisgICAgICAgICJzd2MxICAgICVbdGVtcDNdLCAgICAgICA0KCVbZHN0XSkgICAgICAgICAgICAgIFxuXHQiIC8qZHN0W2krMV0gPSBzcmNbaSsxXSAqIG11bDsqLworICAgICAgICAic3djMSAgICAlW3RlbXA1XSwgICAgICAgOCglW2RzdF0pICAgICAgICAgICAgICBcblx0IiAvKmRzdFtpKzJdID0gc3JjW2krMl0gKiBtdWw7Ki8KKyAgICAgICAgInN3YzEgICAgJVt0ZW1wN10sICAgICAgIDEyKCVbZHN0XSkgICAgICAgICAgICAgXG5cdCIgLypkc3RbaSszXSA9IHNyY1tpKzNdICogbXVsOyovCisKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wOV0sICAgICAgIDE2KCVbZHN0XSkgICAgICAgICAgICAgXG5cdCIgLypkc3RbaSs0XSA9IHNyY1tpKzRdICogbXVsOyovCisgICAgICAgICJzd2MxICAgICVbdGVtcDExXSwgICAgICAyMCglW2RzdF0pICAgICAgICAgICAgIFxuXHQiIC8qZHN0W2krNV0gPSBzcmNbaSs1XSAqIG11bDsqLworICAgICAgICAic3djMSAgICAlW3RlbXAxM10sICAgICAgMjQoJVtkc3RdKSAgICAgICAgICAgICBcblx0IiAvKmRzdFtpKzZdID0gc3JjW2krNl0gKiBtdWw7Ki8KKyAgICAgICAgInN3YzEgICAgJVt0ZW1wMTVdLCAgICAgIDI4KCVbZHN0XSkgICAgICAgICAgICAgXG5cdCIgLypkc3RbaSs3XSA9IHNyY1tpKzddICogbXVsOyovCisgICAgICAgICJhZGRpdSAgICVbZHN0XSwgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmUgICAgICVbc3JjXSwgICAgICAgICVbc3JjX2VuZF0sIGkzMnRmX2xwJT0gIFxuXHQiCisgICAgICAgIDogW3RlbXAxXSI9JmYiKHRlbXAxKSwgICBbdGVtcDExXSI9JmYiKHRlbXAxMSksCisgICAgICAgICAgW3RlbXAxM10iPSZmIih0ZW1wMTMpLCBbdGVtcDE1XSI9JmYiKHRlbXAxNSksCisgICAgICAgICAgW3RlbXAzXSI9JmYiKHRlbXAzKSwgICBbdGVtcDVdIj0mZiIodGVtcDUpLAorICAgICAgICAgIFt0ZW1wN10iPSZmIih0ZW1wNyksICAgW3RlbXA5XSI9JmYiKHRlbXA5KSwKKyAgICAgICAgICBbcnBvbTFdIj0mciIocnBvbTEpLCAgIFtycG9tMl0iPSZyIihycG9tMiksCisgICAgICAgICAgW3Jwb20xMV0iPSZyIihycG9tMTEpLCBbcnBvbTIxXSI9JnIiKHJwb20yMSksCisgICAgICAgICAgW3Jwb20xMl0iPSZyIihycG9tMTIpLCBbcnBvbTIyXSI9JnIiKHJwb20yMiksCisgICAgICAgICAgW3Jwb20xM10iPSZyIihycG9tMTMpLCBbcnBvbTIzXSI9JnIiKHJwb20yMyksCisgICAgICAgICAgW2RzdF0iK3IiKGRzdCksICAgICAgIFtzcmNdIityIihzcmMpCisgICAgICAgIDogW211bF0iZiIobXVsKSwgICAgICAgIFtzcmNfZW5kXSJyIihzcmNfZW5kKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworYXZfY29sZCB2b2lkIGZmX2ZtdF9jb252ZXJ0X2luaXRfbWlwcyhGbXRDb252ZXJ0Q29udGV4dCAqYykKK3sKKyNpZiBIQVZFX0lOTElORV9BU00KKyNpZiBIQVZFX01JUFNEU1BSMQorICAgIGMtPmZsb2F0X3RvX2ludDE2X2ludGVybGVhdmUgPSBmbG9hdF90b19pbnQxNl9pbnRlcmxlYXZlX21pcHM7CisgICAgYy0+ZmxvYXRfdG9faW50MTYgPSBmbG9hdF90b19pbnQxNl9taXBzOworI2VuZGlmCisgICAgYy0+aW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXIgPSBpbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhcl9taXBzOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2lpcmZpbHRlcl9taXBzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2lpcmZpbHRlcl9taXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2NDZjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvaWlyZmlsdGVyX21pcHMuYwpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogIEJvamFuIFppdmtvdmljIChib2phbkBtaXBzLmNvbSkKKyAqCisgKiBJSVIgZmlsdGVyIG9wdGltaXplZCBmb3IgTUlQUyBmbG9hdGluZy1wb2ludCBhcmNoaXRlY3R1cmUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworIC8qKgorICogQGZpbGUKKyAqIFJlZmVyZW5jZTogbGliYXZjb2RlYy9paXJmaWx0ZXIuYworICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2lpcmZpbHRlci5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCit0eXBlZGVmIHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyB7CisgICAgaW50ICAgb3JkZXI7CisgICAgZmxvYXQgZ2FpbjsKKyAgICBpbnQgICAqY3g7CisgICAgZmxvYXQgKmN5OworfSBGRklJUkZpbHRlckNvZWZmczsKKwordHlwZWRlZiBzdHJ1Y3QgRkZJSVJGaWx0ZXJTdGF0ZSB7CisgICAgZmxvYXQgeFsxXTsKK30gRkZJSVJGaWx0ZXJTdGF0ZTsKKworc3RhdGljIHZvaWQgZmZfaWlyX2ZpbHRlcl9mbHRfbWlwcyhjb25zdCBzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnMgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBGRklJUkZpbHRlclN0YXRlICpzLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYywgaW50IHNzdGVwLCBmbG9hdCAqZHN0LCBpbnQgZHN0ZXApCit7CisgICAgaWYgKGMtPm9yZGVyID09IDIpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMwID0gc3JjOworICAgICAgICBmbG9hdCAgICAgICAqZHN0MCA9IGRzdDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgaW4gPSAqc3JjMCAqIGMtPmdhaW4gICsgcy0+eFswXSAqIGMtPmN5WzBdICsgcy0+eFsxXSAqIGMtPmN5WzFdOworICAgICAgICAgICAgKmRzdDAgPSBzLT54WzBdICsgaW4gKyBzLT54WzFdICogYy0+Y3hbMV07CisgICAgICAgICAgICBzLT54WzBdID0gcy0+eFsxXTsKKyAgICAgICAgICAgIHMtPnhbMV0gPSBpbjsKKyAgICAgICAgICAgIHNyYzAgKz0gc3N0ZXA7CisgICAgICAgICAgICBkc3QwICs9IGRzdGVwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjLT5vcmRlciA9PSA0KSB7CisgICAgICAgIGludCBpOworICAgICAgICBjb25zdCBmbG9hdCAqc3JjMCA9IHNyYzsKKyAgICAgICAgZmxvYXQgICAgICAgKmRzdDAgPSBkc3Q7CisgICAgICAgIGZsb2F0IGZvdXIgPSA0LjA7CisgICAgICAgIGZsb2F0IHNpeCAgPSA2LjA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IDQpIHsKKyAgICAgICAgICAgIGZsb2F0IGluMSwgaW4yLCBpbjMsIGluNDsKKyAgICAgICAgICAgIGZsb2F0IHJlczEsIHJlczIsIHJlczMsIHJlczQ7CisgICAgICAgICAgICBmbG9hdCAqeCAgPSBzLT54OworICAgICAgICAgICAgZmxvYXQgKmN5ID0gYy0+Y3k7CisgICAgICAgICAgICBmbG9hdCBnYWluID0gYy0+Z2FpbjsKKyAgICAgICAgICAgIGZsb2F0IHNyYzBfMCA9IHNyYzBbMCAgICAgIF07CisgICAgICAgICAgICBmbG9hdCBzcmMwXzEgPSBzcmMwW3NzdGVwICBdOworICAgICAgICAgICAgZmxvYXQgc3JjMF8yID0gc3JjMFsyKnNzdGVwXTsKKyAgICAgICAgICAgIGZsb2F0IHNyYzBfMyA9IHNyYzBbMypzc3RlcF07CisKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICJsd2MxICAgJGYwLCAgICAgICAgMCglW2N5XSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAkZjQsICAgICAgICAwKCVbeF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICRmNSwgICAgICAgIDQoJVt4XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgJGY2LCAgICAgICAgOCglW3hdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImx3YzEgICAkZjcsICAgICAgICAxMiglW3hdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVsLnMgICVbaW4xXSwgICAgICVbc3JjMF8wXSwgICVbZ2Fpbl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdWwucyAgJVtpbjJdLCAgICAgJVtzcmMwXzFdLCAgJVtnYWluXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bC5zICAlW2luM10sICAgICAlW3NyYzBfMl0sICAlW2dhaW5dICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVsLnMgICVbaW40XSwgICAgICVbc3JjMF8zXSwgICVbZ2Fpbl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgJGYxLCAgICAgICAgNCglW2N5XSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAlW2luMV0sICAgICAlW2luMV0sICAgICAkZjAsICAgICRmNCAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICVbaW4yXSwgICAgICVbaW4yXSwgICAgICRmMCwgICAgJGY1ICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgJVtpbjNdLCAgICAgJVtpbjNdLCAgICAgJGYwLCAgICAkZjYgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAlW2luNF0sICAgICAlW2luNF0sICAgICAkZjAsICAgICRmNyAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibHdjMSAgICRmMiwgICAgICAgIDgoJVtjeV0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgJVtpbjFdLCAgICAgJVtpbjFdLCAgICAgJGYxLCAgICAkZjUgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAlW2luMl0sICAgICAlW2luMl0sICAgICAkZjEsICAgICRmNiAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICVbaW4zXSwgICAgICVbaW4zXSwgICAgICRmMSwgICAgJGY3ICAgICBcblx0IgorICAgICAgICAgICAgICAgICJsd2MxICAgJGYzLCAgICAgICAgMTIoJVtjeV0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZC5zICAkZjgsICAgICAgICAkZjUsICAgICAgICAkZjcgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICVbaW4xXSwgICAgICVbaW4xXSwgICAgICRmMiwgICAgJGY2ICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgJVtpbjJdLCAgICAgJVtpbjJdLCAgICAgJGYyLCAgICAkZjcgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bC5zICAkZjksICAgICAgICAkZjYsICAgICAgICAlW3NpeF0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVsLnMgICRmMTAsICAgICAgICRmNywgICAgICAgICVbc2l4XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgJVtpbjFdLCAgICAgJVtpbjFdLCAgICAgJGYzLCAgICAkZjcgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAlW2luMl0sICAgICAlW2luMl0sICAgICAkZjMsICAgICVbaW4xXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICVbaW4zXSwgICAgICVbaW4zXSwgICAgICRmMiwgICAgJVtpbjFdICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgJVtpbjRdLCAgICAgJVtpbjRdLCAgICAgJGYxLCAgICAlW2luMV0gIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZC5zICAlW3JlczFdLCAgICAkZjQsICAgICAgICAlW2luMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICVbaW4xXSwgICAgIDAoJVt4XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQucyAgJGYwLCAgICAgICAgJGY2LCAgICAgICAgJVtpbjFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAlW2luM10sICAgICAlW2luM10sICAgICAkZjMsICAgICVbaW4yXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICVbaW40XSwgICAgICVbaW40XSwgICAgICRmMiwgICAgJVtpbjJdICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQucyAgJVtyZXMyXSwgICAgJGY1LCAgICAgICAgJVtpbjJdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAlW3JlczFdLCAgICAlW3JlczFdLCAgICAkZjgsICAgICVbZm91cl0gXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkLnMgICRmOCwgICAgICAgICRmNywgICAgICAgICVbaW4yXSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzd2MxICAgJVtpbjJdLCAgICAgNCglW3hdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAlW2luNF0sICAgICAlW2luNF0sICAgICAkZjMsICAgICVbaW4zXSAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkLnMgICVbcmVzM10sICAgICRmNiwgICAgICAgICVbaW4zXSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQucyAgJVtyZXMxXSwgICAgJVtyZXMxXSwgICAgJGY5ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAlW3JlczJdLCAgICAlW3JlczJdLCAgICAkZjAsICAgICVbZm91cl0gXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICVbaW4zXSwgICAgIDgoJVt4XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQucyAgJVtyZXM0XSwgICAgJGY3LCAgICAgICAgJVtpbjRdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAlW3JlczNdLCAgICAlW3JlczNdLCAgICAkZjgsICAgICVbZm91cl0gXG5cdCIKKyAgICAgICAgICAgICAgICAic3djMSAgICVbaW40XSwgICAgIDEyKCVbeF0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQucyAgJVtyZXMyXSwgICAgJVtyZXMyXSwgICAgJGYxMCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZC5zICAkZjgsICAgICAgICAlW2luMV0sICAgICAlW2luM10gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibWFkZC5zICVbcmVzM10sICAgICVbcmVzM10sICAgICVbaW4xXSwgJVtzaXhdICBcblx0IgorICAgICAgICAgICAgICAgICJtYWRkLnMgJVtyZXM0XSwgICAgJVtyZXM0XSwgICAgJGY4LCAgICAlW2ZvdXJdIFxuXHQiCisgICAgICAgICAgICAgICAgIm1hZGQucyAlW3JlczRdLCAgICAlW3JlczRdLCAgICAlW2luMl0sICVbc2l4XSAgXG5cdCIKKworICAgICAgICAgICAgICAgIDogW2luMV0iPSZmIihpbjEpLCBbaW4yXSI9JmYiKGluMiksCisgICAgICAgICAgICAgICAgICBbaW4zXSI9JmYiKGluMyksIFtpbjRdIj0mZiIoaW40KSwKKyAgICAgICAgICAgICAgICAgIFtyZXMxXSI9JmYiKHJlczEpLCBbcmVzMl0iPSZmIihyZXMyKSwKKyAgICAgICAgICAgICAgICAgIFtyZXMzXSI9JmYiKHJlczMpLCBbcmVzNF0iPSZmIihyZXM0KQorICAgICAgICAgICAgICAgIDogW3NyYzBfMF0iZiIoc3JjMF8wKSwgW3NyYzBfMV0iZiIoc3JjMF8xKSwKKyAgICAgICAgICAgICAgICAgIFtzcmMwXzJdImYiKHNyYzBfMiksIFtzcmMwXzNdImYiKHNyYzBfMyksCisgICAgICAgICAgICAgICAgICBbZ2Fpbl0iZiIoZ2FpbiksIFt4XSJyIih4KSwgW2N5XSJyIihjeSksCisgICAgICAgICAgICAgICAgICBbZm91cl0iZiIoZm91ciksIFtzaXhdImYiKHNpeCkKKyAgICAgICAgICAgICAgICA6ICIkZjAiLCAiJGYxIiwgIiRmMiIsICIkZjMiLAorICAgICAgICAgICAgICAgICAgIiRmNCIsICIkZjUiLCAiJGY2IiwgIiRmNyIsCisgICAgICAgICAgICAgICAgICAiJGY4IiwgIiRmOSIsICIkZjEwIiwKKyAgICAgICAgICAgICAgICAgICJtZW1vcnkiCisgICAgICAgICAgICApOworCisgICAgICAgICAgICBkc3QwWzAgICAgICBdID0gcmVzMTsKKyAgICAgICAgICAgIGRzdDBbc3N0ZXAgIF0gPSByZXMyOworICAgICAgICAgICAgZHN0MFsyKnNzdGVwXSA9IHJlczM7CisgICAgICAgICAgICBkc3QwWzMqc3N0ZXBdID0gcmVzNDsKKworICAgICAgICAgICAgc3JjMCArPSA0KnNzdGVwOworICAgICAgICAgICAgZHN0MCArPSA0KmRzdGVwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMwID0gc3JjOworICAgICAgICBmbG9hdCAgICAgICAqZHN0MCA9IGRzdDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBmbG9hdCBpbiwgcmVzOworICAgICAgICAgICAgaW4gPSAqc3JjMCAqIGMtPmdhaW47CisgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBjLT5vcmRlcjsgaisrKQorICAgICAgICAgICAgICAgIGluICs9IGMtPmN5W2pdICogcy0+eFtqXTsKKyAgICAgICAgICAgIHJlcyA9IHMtPnhbMF0gKyBpbiArIHMtPnhbYy0+b3JkZXIgPj4gMV0gKiBjLT5jeFtjLT5vcmRlciA+PiAxXTsKKyAgICAgICAgICAgIGZvcihqID0gMTsgaiA8IGMtPm9yZGVyID4+IDE7IGorKykKKyAgICAgICAgICAgICAgICByZXMgKz0gKHMtPnhbal0gKyBzLT54W2MtPm9yZGVyIC0gal0pICogYy0+Y3hbal07CisgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBjLT5vcmRlciAtIDE7IGorKykKKyAgICAgICAgICAgICAgICBzLT54W2pdID0gcy0+eFtqICsgMV07CisgICAgICAgICAgICAqZHN0MCA9IHJlczsKKyAgICAgICAgICAgIHMtPnhbYy0+b3JkZXIgLSAxXSA9IGluOworICAgICAgICAgICAgc3JjMCArPSBzc3RlcDsKKyAgICAgICAgICAgIGRzdDAgKz0gZHN0ZXA7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCisKK3ZvaWQgZmZfaWlyX2ZpbHRlcl9pbml0X21pcHMoRkZJSVJGaWx0ZXJDb250ZXh0ICpmKSB7CisjaWYgSEFWRV9JTkxJTkVfQVNNCisgICAgZi0+ZmlsdGVyX2ZsdCA9IGZmX2lpcl9maWx0ZXJfZmx0X21pcHM7CisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2xzcF9taXBzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL2xzcF9taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1ZWYwMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvbHNwX21pcHMuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogIE5lZGVsamtvIEJhYmljIChuYmFiaWNAbWlwcy5jb20pCisgKgorICogTFNQIHJvdXRpbmVzIGZvciBBQ0VMUC1iYXNlZCBjb2RlY3Mgb3B0aW1pemVkIGZvciBNSVBTCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJlZmVyZW5jZTogbGliYXZjb2RlYy9sc3AuYworICovCisjaWZuZGVmIEFWQ09ERUNfTFNQX01JUFNfSAorI2RlZmluZSBBVkNPREVDX0xTUF9NSVBTX0gKKworI2lmIEhBVkVfTUlQU0ZQVSAmJiBIQVZFX0lOTElORV9BU00KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfbHNwMnBvbHlmX21pcHMoY29uc3QgZG91YmxlICpsc3AsIGRvdWJsZSAqZiwgaW50IGxwX2hhbGZfb3JkZXIpCit7CisgICAgaW50IGksIGogPSAwOworICAgIGRvdWJsZSAqIHBfZmkgPSBmOworICAgIGRvdWJsZSAqIHBfZiA9IDA7CisKKyAgICBmWzBdID0gMS4wOworICAgIGZbMV0gPSAtMiAqIGxzcFswXTsKKyAgICBsc3AgLT0gMjsKKworICAgIGZvcihpPTI7IGk8PWxwX2hhbGZfb3JkZXI7IGkrKykKKyAgICB7CisgICAgICAgIGRvdWJsZSB0bXAsIGZfal8yLCBmX2pfMSwgZl9qOworICAgICAgICBkb3VibGUgdmFsID0gbHNwWzIqaV07CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJtb3ZlICAgJVtwX2ZdLCAgICAgJVtwX2ZpXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5kICAlW3ZhbF0sICAgICAlW3ZhbF0sICAgICAlW3ZhbF0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICVbcF9maV0sICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsZGMxICAgJVtmX2pfMV0sICAgMCglW3BfZl0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImxkYzEgICAlW2Zfal0sICAgICA4KCVbcF9mXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibmVnLmQgICVbdmFsXSwgICAgICVbdmFsXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQuZCAgJVt0bXBdLCAgICAgJVtmX2pfMV0sICAgJVtmX2pfMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQuZCAlW3RtcF0sICAgICAlW3RtcF0sICAgICAlW2Zfal0sICVbdmFsXSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICVbal0sICAgICAgICVbaV0sIC0yICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsZGMxICAgJVtmX2pfMl0sICAgLTgoJVtwX2ZdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNkYzEgICAlW3RtcF0sICAgICAxNiglW3BfZl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYmVxeiAgICVbal0sICAgICAgIGZmX2xzcDJwb2x5Zl9scF9qX2VuZCU9ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJmZl9sc3AycG9seWZfbHBfaiU9OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5kICAlW3RtcF0sICAgICAlW2Zfal0sICAgICAlW2Zfal8yXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5kICVbdG1wXSwgICAgICVbdG1wXSwgICAgICVbZl9qXzFdLCAlW3ZhbF0gICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YuZCAgJVtmX2pdLCAgICAgJVtmX2pfMV0gICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAlW2pdLCAgICAgICAtMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92LmQgICVbZl9qXzFdLCAgICVbZl9qXzJdICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsZGMxICAgJVtmX2pfMl0sICAgLTE2KCVbcF9mXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNkYzEgICAlW3RtcF0sICAgICA4KCVbcF9mXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICVbcF9mXSwgICAgIC04ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJiZ3R6ICAgJVtqXSwgICAgICAgZmZfbHNwMnBvbHlmX2xwX2olPSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImZmX2xzcDJwb2x5Zl9scF9qX2VuZCU9OiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW2Zfal8yXSI9JmYiKGZfal8yKSwgW2Zfal8xXSI9JmYiKGZfal8xKSwgW3ZhbF0iK2YiKHZhbCksCisgICAgICAgICAgICAgIFt0bXBdIj0mZiIodG1wKSwgW2Zfal0iPSZmIihmX2opLCBbcF9mXSIrciIocF9mKSwKKyAgICAgICAgICAgICAgW2pdIityIihqKSwgW3BfZmldIityIihwX2ZpKQorICAgICAgICAgICAgOiBbaV0iciIoaSkKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICAgICAgZlsxXSArPSB2YWw7CisgICAgfQorfQorI2RlZmluZSBmZl9sc3AycG9seWYgZmZfbHNwMnBvbHlmX21pcHMKKyNlbmRpZiAvKiBIQVZFX01JUFNGUFUgJiYgSEFWRV9JTkxJTkVfQVNNICovCisjZW5kaWYgLyogQVZDT0RFQ19MU1BfTUlQU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9taXBzL21hdGhvcHMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvbWF0aG9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODI5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL21hdGhvcHMuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTUlQU19NQVRIT1BTX0gKKyNkZWZpbmUgQVZDT0RFQ19NSVBTX01BVEhPUFNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKKyNpZiBIQVZFX0xPT05HU09OCisKK3N0YXRpYyBpbmxpbmUgYXZfY29uc3QgaW50NjRfdCBNQUM2NChpbnQ2NF90IGQsIGludCBhLCBpbnQgYikKK3sKKyAgICBpbnQ2NF90IG07CisgICAgX19hc21fXyAoImRtdWx0LmcgJTEsICUyLCAlMyBcblx0IgorICAgICAgICAgICAgICJkYWRkdSAgICUwLCAlMCwgJTEgXG5cdCIKKyAgICAgICAgICAgICA6ICIrciIoZCksICI9JnIiKG0pIDogInIiKGEpLCAiciIoYikpOworICAgIHJldHVybiBkOworfQorI2RlZmluZSBNQUM2NChkLCBhLCBiKSAoKGQpID0gTUFDNjQoZCwgYSwgYikpCisKK3N0YXRpYyBpbmxpbmUgYXZfY29uc3QgaW50NjRfdCBNTFM2NChpbnQ2NF90IGQsIGludCBhLCBpbnQgYikKK3sKKyAgICBpbnQ2NF90IG07CisgICAgX19hc21fXyAoImRtdWx0LmcgJTEsICUyLCAlMyBcblx0IgorICAgICAgICAgICAgICJkc3VidSAgICUwLCAlMCwgJTEgXG5cdCIKKyAgICAgICAgICAgICA6ICIrciIoZCksICI9JnIiKG0pIDogInIiKGEpLCAiciIoYikpOworICAgIHJldHVybiBkOworfQorI2RlZmluZSBNTFM2NChkLCBhLCBiKSAoKGQpID0gTUxTNjQoZCwgYSwgYikpCisKKyNlbGlmIEFSQ0hfTUlQUzY0CisKK3N0YXRpYyBpbmxpbmUgYXZfY29uc3QgaW50NjRfdCBNQUM2NChpbnQ2NF90IGQsIGludCBhLCBpbnQgYikKK3sKKyAgICBpbnQ2NF90IG07CisgICAgX19hc21fXyAoImRtdWx0ICUyLCAlMyAgICAgXG5cdCIKKyAgICAgICAgICAgICAibWZsbyAgJTEgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJkYWRkdSAlMCwgJTAsICUxIFxuXHQiCisgICAgICAgICAgICAgOiAiK3IiKGQpLCAiPSZyIihtKSA6ICJyIihhKSwgInIiKGIpCisgICAgICAgICAgICAgOiAiaGkiLCAibG8iKTsKKyAgICByZXR1cm4gZDsKK30KKyNkZWZpbmUgTUFDNjQoZCwgYSwgYikgKChkKSA9IE1BQzY0KGQsIGEsIGIpKQorCitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IGludDY0X3QgTUxTNjQoaW50NjRfdCBkLCBpbnQgYSwgaW50IGIpCit7CisgICAgaW50NjRfdCBtOworICAgIF9fYXNtX18gKCJkbXVsdCAlMiwgJTMgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1mbG8gICUxICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAiZHN1YnUgJTAsICUwLCAlMSBcblx0IgorICAgICAgICAgICAgIDogIityIihkKSwgIj0mciIobSkgOiAiciIoYSksICJyIihiKQorICAgICAgICAgICAgIDogImhpIiwgImxvIik7CisgICAgcmV0dXJuIGQ7Cit9CisjZGVmaW5lIE1MUzY0KGQsIGEsIGIpICgoZCkgPSBNTFM2NChkLCBhLCBiKSkKKworI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworI2VuZGlmIC8qIEFWQ09ERUNfTUlQU19NQVRIT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvbXBlZ2F1ZGlvZHNwX21pcHNfZml4ZWQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvbXBlZ2F1ZGlvZHNwX21pcHNfZml4ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDdhODMzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9tcGVnYXVkaW9kc3BfbWlwc19maXhlZC5jCkBAIC0wLDAgKzEsOTA3IEBACisgICAgLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogIEJvamFuIFppdmtvdmljIChib2phbkBtaXBzLmNvbSkKKyAqCisgKiBNUEVHIEF1ZGlvIGRlY29kZXIgb3B0aW1pemVkIGZvciBNSVBTIGZpeGVkLXBvaW50IGFyY2hpdGVjdHVyZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSZWZlcmVuY2U6IGxpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwX3RlbXBsYXRlLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWdhdWRpb2RzcC5oIgorCitzdGF0aWMgdm9pZCBmZl9tcGFkc3BfYXBwbHlfd2luZG93X21pcHNfZml4ZWQoaW50MzJfdCAqc3ludGhfYnVmLCBpbnQzMl90ICp3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXRoZXJfc3RhdGUsIGludDE2X3QgKnNhbXBsZXMsIGludCBpbmNyKQoreworICAgIHJlZ2lzdGVyIGNvbnN0IGludDMyX3QgKncsICp3MiwgKnA7CisgICAgaW50IGo7CisgICAgaW50MTZfdCAqc2FtcGxlczI7CisgICAgaW50IHdfYXNtLCBwX2FzbSwgd19hc20xLCBwX2FzbTEsIHdfYXNtMiwgcF9hc20yOworICAgIGludCB3Ml9hc20sIHcyX2FzbTEsICpwX3RlbXAxLCAqcF90ZW1wMjsKKyAgICBpbnQgc3VtMSA9IDA7CisgICAgaW50IGNvbnN0IG1pbl9hc20gPSAtMzI3NjgsIG1heF9hc20gPSAzMjc2NzsKKyAgICBpbnQgdGVtcDEsIHRlbXAyID0gMCwgdGVtcDMgPSAwOworICAgIGludDY0X3Qgc3VtOworCisgICAgLyogY29weSB0byBhdm9pZCB3cmFwICovCisgICAgbWVtY3B5KHN5bnRoX2J1ZiArIDUxMiwgc3ludGhfYnVmLCAzMiAqIHNpemVvZigqc3ludGhfYnVmKSk7CisgICAgc2FtcGxlczIgPSBzYW1wbGVzICsgMzEgKiBpbmNyOworICAgIHcgPSB3aW5kb3c7CisgICAgdzIgPSB3aW5kb3cgKyAzMTsKKyAgICBzdW0gPSAqZGl0aGVyX3N0YXRlOworICAgIHAgPSBzeW50aF9idWYgKyAxNjsKKyAgICBwX3RlbXAxID0gc3ludGhfYnVmICsgMTY7CisgICAgcF90ZW1wMiA9IHN5bnRoX2J1ZiArIDQ4OworICAgIHRlbXAxID0gc3VtOworCisgICAgLyoqCisgICAgKiB1c2Ugb2Ygcm91bmRfc2FtcGxlIGZ1bmN0aW9uIGZyb20gdGhlIG9yaWdpbmFsIGNvZGUgaXMgZWxpbWluYXRlZCwKKyAgICAqIGNoYW5nZWQgd2l0aCBhcHByb3ByaWF0ZSBhc3NlbWJseSBpbnN0cnVjdGlvbnMuCisgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICJtdGhpICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtdGxvICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbV0sICAwKCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbV0sICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbTFdLCA2NCo0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbTFdLCA2NCo0KCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbTJdLCAxMjgqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbTJdLCAxMjgqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtYWRkICAgJVt3X2FzbV0sICAlW3BfYXNtXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtYWRkICAgJVt3X2FzbTFdLCAlW3BfYXNtMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtYWRkICAgJVt3X2FzbTJdLCAlW3BfYXNtMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbV0sICAxOTIqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbV0sICAxOTIqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbTFdLCAyNTYqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbTFdLCAyNTYqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbTJdLCAzMjAqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbTJdLCAzMjAqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtYWRkICAgJVt3X2FzbV0sICAlW3BfYXNtXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtYWRkICAgJVt3X2FzbTFdLCAlW3BfYXNtMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtYWRkICAgJVt3X2FzbTJdLCAlW3BfYXNtMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbV0sICAzODQqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbV0sICAzODQqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbTFdLCA0NDgqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbTFdLCA0NDgqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbTJdLCAzMio0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbTJdLCAzMio0KCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtYWRkICAgJVt3X2FzbV0sICAlW3BfYXNtXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtYWRkICAgJVt3X2FzbTFdLCAlW3BfYXNtMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtc3ViICAgJVt3X2FzbTJdLCAlW3BfYXNtMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbV0sICA5Nio0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbV0sICA5Nio0KCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbTFdLCAxNjAqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbTFdLCAxNjAqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbTJdLCAyMjQqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbTJdLCAyMjQqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtc3ViICAgJVt3X2FzbV0sICAlW3BfYXNtXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtc3ViICAgJVt3X2FzbTFdLCAlW3BfYXNtMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtc3ViICAgJVt3X2FzbTJdLCAlW3BfYXNtMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbV0sICAyODgqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbV0sICAyODgqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbTFdLCAzNTIqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbTFdLCAzNTIqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtc3ViICAgJVt3X2FzbV0sICAlW3BfYXNtXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbV0sICA0ODAqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbV0sICA0ODAqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVt3X2FzbTJdLCA0MTYqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJsdyAgICAgJVtwX2FzbTJdLCA0MTYqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtc3ViICAgJVt3X2FzbV0sICAlW3BfYXNtXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtc3ViICAgJVt3X2FzbTFdLCAlW3BfYXNtMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtc3ViICAgJVt3X2FzbTJdLCAlW3BfYXNtMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgLypyb3VuZF9zYW1wbGUgZnVuY3Rpb24gZnJvbSB0aGUgb3JpZ2luYWwgY29kZSBpcyBlbGltaW5hdGVkLAorICAgICAgICAgICogY2hhbmdlZCB3aXRoIGFwcHJvcHJpYXRlIGFzc2VtYmx5IGluc3RydWN0aW9ucworICAgICAgICAgICogY29kZSBleGFtcGxlOgorCisgICAgICAgICAiZXh0ci53ICAlW3N1bTFdLCRhYzAsMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgIm1mbG8gJVt0ZW1wM10sICAkYWMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJhbmQgICVbdGVtcDFdLCAgJVt0ZW1wM10sICAweDAwZmZmZmZmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAic2x0ICAlW3RlbXAyXSwgICVbc3VtMV0sICAgJVttaW5fYXNtXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgIm1vdm4gJVtzdW0xXSwgICAlW21pbl9hc21dLCVbdGVtcDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJzbHQgICVbdGVtcDJdLCAgJVttYXhfYXNtXSwlW3N1bTFdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAibW92biAlW3N1bTFdLCAgICVbbWF4X2FzbV0sJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgInNoICAgJVtzdW0xXSwgICAwKCVbc2FtcGxlc10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICovCisKKyAgICAgICAgICJleHRyLncgJVtzdW0xXSwgICAkYWMwLCAgICAgICAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtZmxvICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJhZGRpICAgJVt3XSwgICAgICAlW3ddLCAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJhbmQgICAgJVt0ZW1wMV0sICAlW3RlbXAzXSwgICAweDAwZmZmZmZmICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJzbHQgICAgJVt0ZW1wMl0sICAlW3N1bTFdLCAgICAlW21pbl9hc21dICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtb3ZuICAgJVtzdW0xXSwgICAlW21pbl9hc21dLCAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJzbHQgICAgJVt0ZW1wMl0sICAlW21heF9hc21dLCAlW3N1bTFdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJtb3ZuICAgJVtzdW0xXSwgICAlW21heF9hc21dLCAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICJzaCAgICAgJVtzdW0xXSwgICAwKCVbc2FtcGxlc10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFt3X2FzbV0gIj0mciIgKHdfYXNtKSwgW3BfYXNtXSAiPSZyIiAocF9hc20pLCBbd19hc20xXSAiPSZyIiAod19hc20xKSwKKyAgICAgICAgICBbcF9hc20xXSAiPSZyIiAocF9hc20xKSwgW3RlbXAxXSAiK3IiICh0ZW1wMSksIFt0ZW1wMl0gIityIiAodGVtcDIpLAorICAgICAgICAgIFt3X2FzbTJdICI9JnIiICh3X2FzbTIpLCBbcF9hc20yXSAiPSZyIiAocF9hc20yKSwKKyAgICAgICAgICBbc3VtMV0gIityIiAoc3VtMSksIFt3XSAiK3IiICh3KSwgW3RlbXAzXSAiK3IiICh0ZW1wMykKKyAgICAgICAgOiBbcF0gInIiIChwKSwgW3NhbXBsZXNdICJyIiAoc2FtcGxlcyksIFttaW5fYXNtXSAiciIgKG1pbl9hc20pLAorICAgICAgICAgIFttYXhfYXNtXSAiciIgKG1heF9hc20pCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsImxvIgorICAgICApOworCisgICAgIHNhbXBsZXMgKz0gaW5jcjsKKworICAgIC8qIHdlIGNhbGN1bGF0ZSB0d28gc2FtcGxlcyBhdCB0aGUgc2FtZSB0aW1lIHRvIGF2b2lkIG9uZSBtZW1vcnkKKyAgICAgICBhY2Nlc3MgcGVyIHR3byBzYW1wbGUgKi8KKworICAgIGZvcihqID0gMTsgaiA8IDE2OyBqKyspIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAgIm10aGkgICAkMCwgICAgICAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtdGxvICAgJDAsICAgICAgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibXRoaSAgICQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm10bG8gICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJhZGRpICAgJVtwX3RlbXAxXSwgJVtwX3RlbXAxXSwgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbd19hc21dLCAgIDAoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3BfYXNtXSwgICAwKCVbcF90ZW1wMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3Ml9hc21dLCAgMCglW3cyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbd19hc20xXSwgIDY0KjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3BfYXNtMV0sICA2NCo0KCVbcF90ZW1wMV0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3Ml9hc20xXSwgNjQqNCglW3cyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibWFkZCAgICVbd19hc21dLCAgICVbcF9hc21dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1zdWIgICAkYWMxLCAgICAgICAlW3cyX2FzbV0sICAgICAgICAlW3BfYXNtXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtYWRkICAgJVt3X2FzbTFdLCAgJVtwX2FzbTFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibXN1YiAgICRhYzEsICAgICAgICVbdzJfYXNtMV0sICAgICAgICVbcF9hc20xXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3dfYXNtXSwgICAxMjgqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVtwX2FzbV0sICAgMTI4KjQoJVtwX3RlbXAxXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbdzJfYXNtXSwgIDEyOCo0KCVbdzJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3dfYXNtMV0sICAxOTIqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVtwX2FzbTFdLCAgMTkyKjQoJVtwX3RlbXAxXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbdzJfYXNtMV0sIDE5Mio0KCVbdzJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1hZGQgICAlW3dfYXNtXSwgICAlW3BfYXNtXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtc3ViICAgJGFjMSwgICAgICAgJVt3Ml9hc21dLCAgICAgICAgJVtwX2FzbV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibWFkZCAgICVbd19hc20xXSwgICVbcF9hc20xXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1zdWIgICAkYWMxLCAgICAgICAlW3cyX2FzbTFdLCAgICAgICAlW3BfYXNtMV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3X2FzbV0sICAgMjU2KjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbcF9hc21dLCAgIDI1Nio0KCVbcF90ZW1wMV0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3cyX2FzbV0sICAyNTYqNCglW3cyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3X2FzbTFdLCAgMzIwKjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbcF9hc20xXSwgIDMyMCo0KCVbcF90ZW1wMV0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3cyX2FzbTFdLCAzMjAqNCglW3cyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtYWRkICAgJVt3X2FzbV0sICAgJVtwX2FzbV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibXN1YiAgICRhYzEsICAgICAgICVbdzJfYXNtXSwgICAgICAgICVbcF9hc21dICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1hZGQgICAlW3dfYXNtMV0sICAlW3BfYXNtMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtc3ViICAgJGFjMSwgICAgICAgJVt3Ml9hc20xXSwgICAgICAgJVtwX2FzbTFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbd19hc21dLCAgIDM4NCo0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3BfYXNtXSwgICAzODQqNCglW3BfdGVtcDFdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3Ml9hc21dLCAgMzg0KjQoJVt3Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbd19hc20xXSwgIDQ0OCo0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3BfYXNtMV0sICA0NDgqNCglW3BfdGVtcDFdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3Ml9hc20xXSwgNDQ4KjQoJVt3Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibWFkZCAgICVbd19hc21dLCAgICVbcF9hc21dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1zdWIgICAkYWMxLCAgICAgICAlW3cyX2FzbV0sICAgICAgICAlW3BfYXNtXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtYWRkICAgJVt3X2FzbTFdLCAgJVtwX2FzbTFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibXN1YiAgICRhYzEsICAgICAgICVbdzJfYXNtMV0sICAgICAgICVbcF9hc20xXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImFkZGkgICAlW3BfdGVtcDJdLCAlW3BfdGVtcDJdLCAgICAgICAtNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3X2FzbV0sICAgMzIqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbcF9hc21dLCAgIDAoJVtwX3RlbXAyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3cyX2FzbV0sICAzMio0KCVbdzJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3X2FzbTFdLCAgOTYqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbcF9hc20xXSwgIDY0KjQoJVtwX3RlbXAyXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3cyX2FzbTFdLCA5Nio0KCVbdzJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtc3ViICAgJVt3X2FzbV0sICAgJVtwX2FzbV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibXN1YiAgICRhYzEsICAgICAgICVbdzJfYXNtXSwgICAgICAgICVbcF9hc21dICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1zdWIgICAlW3dfYXNtMV0sICAlW3BfYXNtMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtc3ViICAgJGFjMSwgICAgICAgJVt3Ml9hc20xXSwgICAgICAgJVtwX2FzbTFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbd19hc21dLCAgIDE2MCo0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3BfYXNtXSwgICAxMjgqNCglW3BfdGVtcDJdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3Ml9hc21dLCAgMTYwKjQoJVt3Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbd19hc20xXSwgIDIyNCo0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3BfYXNtMV0sICAxOTIqNCglW3BfdGVtcDJdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3Ml9hc20xXSwgMjI0KjQoJVt3Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibXN1YiAgICVbd19hc21dLCAgICVbcF9hc21dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1zdWIgICAkYWMxLCAgICAgICAlW3cyX2FzbV0sICAgICAgICAlW3BfYXNtXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtc3ViICAgJVt3X2FzbTFdLCAgJVtwX2FzbTFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibXN1YiAgICRhYzEsICAgICAgICVbdzJfYXNtMV0sICAgICAgICVbcF9hc20xXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3dfYXNtXSwgICAyODgqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVtwX2FzbV0sICAgMjU2KjQoJVtwX3RlbXAyXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbdzJfYXNtXSwgIDI4OCo0KCVbdzJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3dfYXNtMV0sICAzNTIqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVtwX2FzbTFdLCAgMzIwKjQoJVtwX3RlbXAyXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbdzJfYXNtMV0sIDM1Mio0KCVbdzJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1zdWIgICAlW3dfYXNtXSwgICAlW3BfYXNtXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtc3ViICAgJGFjMSwgICAgICAgJVt3Ml9hc21dLCAgICAgICAgJVtwX2FzbV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibXN1YiAgICVbd19hc20xXSwgICVbcF9hc20xXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1zdWIgICAkYWMxLCAgICAgICAlW3cyX2FzbTFdLCAgICAgICAlW3BfYXNtMV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3X2FzbV0sICAgNDE2KjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbcF9hc21dLCAgIDM4NCo0KCVbcF90ZW1wMl0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3cyX2FzbV0sICA0MTYqNCglW3cyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJsdyAgICAgJVt3X2FzbTFdLCAgNDgwKjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibHcgICAgICVbcF9hc20xXSwgIDQ0OCo0KCVbcF90ZW1wMl0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImx3ICAgICAlW3cyX2FzbTFdLCA0ODAqNCglW3cyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtc3ViICAgJVt3X2FzbV0sICAgJVtwX2FzbV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibXN1YiAgICVbd19hc20xXSwgICVbcF9hc20xXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1zdWIgICAkYWMxLCAgICAgICAlW3cyX2FzbV0sICAgICAgICAlW3BfYXNtXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtc3ViICAgJGFjMSwgICAgICAgJVt3Ml9hc20xXSwgICAgICAgJVtwX2FzbTFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAiYWRkaSAgICVbd10sICAgICAgICVbd10sICAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImFkZGkgICAlW3cyXSwgICAgICAlW3cyXSwgICAgICAgICAgICAtNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtZmxvICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAiZXh0ci53ICVbc3VtMV0sICAgICRhYzAsICAgICAgICAgICAgIDI0ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImxpICAgICAlW3RlbXAzXSwgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJhbmQgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0sICAgICAgICAgMHgwMGZmZmZmZiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibWFkZCAgICRhYzEsICAgICAgICVbdGVtcDFdLCAgICAgICAgICVbdGVtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInNsdCAgICAlW3RlbXAyXSwgICAlW3N1bTFdLCAgICAgICAgICAlW21pbl9hc21dICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtb3ZuICAgJVtzdW0xXSwgICAgJVttaW5fYXNtXSwgICAgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAic2x0ICAgICVbdGVtcDJdLCAgICVbbWF4X2FzbV0sICAgICAgICVbc3VtMV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1vdm4gICAlW3N1bTFdLCAgICAlW21heF9hc21dLCAgICAgICAlW3RlbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJzaCAgICAgJVtzdW0xXSwgICAgMCglW3NhbXBsZXNdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibWZsbyAgICVbdGVtcDNdLCAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImV4dHIudyAlW3N1bTFdLCAgICAkYWMxLCAgICAgICAgICAgICAyNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJhbmQgICAgJVt0ZW1wMV0sICAgJVt0ZW1wM10sICAgICAgICAgMHgwMGZmZmZmZiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAic2x0ICAgICVbdGVtcDJdLCAgICVbc3VtMV0sICAgICAgICAgICVbbWluX2FzbV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1vdm4gICAlW3N1bTFdLCAgICAlW21pbl9hc21dLCAgICAgICAlW3RlbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJzbHQgICAgJVt0ZW1wMl0sICAgJVttYXhfYXNtXSwgICAgICAgJVtzdW0xXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibW92biAgICVbc3VtMV0sICAgICVbbWF4X2FzbV0sICAgICAgICVbdGVtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInNoICAgICAlW3N1bTFdLCAgICAwKCVbc2FtcGxlczJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFt3X2FzbV0gIj0mciIgKHdfYXNtKSwgW3BfYXNtXSAiPSZyIiAocF9hc20pLCBbd19hc20xXSAiPSZyIiAod19hc20xKSwKKyAgICAgICAgICAgICAgW3BfYXNtMV0gIj0mciIgKHBfYXNtMSksIFt3Ml9hc20xXSAiPSZyIiAodzJfYXNtMSksCisgICAgICAgICAgICAgIFt3Ml9hc21dICI9JnIiICh3Ml9hc20pLCBbdGVtcDFdICIrciIgKHRlbXAxKSwgW3RlbXAyXSAiK3IiICh0ZW1wMiksCisgICAgICAgICAgICAgIFtwX3RlbXAxXSAiK3IiIChwX3RlbXAxKSwgW3BfdGVtcDJdICIrciIgKHBfdGVtcDIpLCBbc3VtMV0gIityIiAoc3VtMSksCisgICAgICAgICAgICAgIFt3XSAiK3IiICh3KSwgW3cyXSAiK3IiICh3MiksIFtzYW1wbGVzXSAiK3IiIChzYW1wbGVzKSwKKyAgICAgICAgICAgICAgW3NhbXBsZXMyXSAiK3IiIChzYW1wbGVzMiksIFt0ZW1wM10gIityIiAodGVtcDMpCisgICAgICAgICAgICA6IFttaW5fYXNtXSAiciIgKG1pbl9hc20pLCBbbWF4X2FzbV0gInIiIChtYXhfYXNtKQorICAgICAgICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIiwgIiRhYzFoaSIsICIkYWMxbG8iCisgICAgICAgICk7CisKKyAgICAgICAgc2FtcGxlcyArPSBpbmNyOworICAgICAgICBzYW1wbGVzMiAtPSBpbmNyOworICAgIH0KKworICAgIHAgPSBzeW50aF9idWYgKyAzMjsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibXRoaSAgICQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRsbyAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbd19hc21dLCAgMzIqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbcF9hc21dLCAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbd19hc20xXSwgOTYqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbcF9hc20xXSwgNjQqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbd19hc20yXSwgMTYwKjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbcF9hc20yXSwgMTI4KjQoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1YiAgICVbd19hc21dLCAgJVtwX2FzbV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1YiAgICVbd19hc20xXSwgJVtwX2FzbTFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1YiAgICVbd19hc20yXSwgJVtwX2FzbTJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbd19hc21dLCAgMjI0KjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbcF9hc21dLCAgMTkyKjQoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbd19hc20xXSwgMjg4KjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbcF9hc20xXSwgMjU2KjQoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbd19hc20yXSwgMzUyKjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbcF9hc20yXSwgMzIwKjQoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1YiAgICVbd19hc21dLCAgJVtwX2FzbV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1YiAgICVbd19hc20xXSwgJVtwX2FzbTFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1YiAgICVbd19hc20yXSwgJVtwX2FzbTJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbd19hc21dLCAgNDE2KjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbcF9hc21dLCAgMzg0KjQoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbd19hc20xXSwgNDgwKjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbcF9hc20xXSwgNDQ4KjQoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1YiAgICVbd19hc21dLCAgJVtwX2FzbV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXN1YiAgICVbd19hc20xXSwgJVtwX2FzbTFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZXh0ci53ICVbc3VtMV0sICAgJGFjMCwgICAgICAgMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZsbyAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICVbdGVtcDFdLCAgJVt0ZW1wMl0sICAgMHgwMGZmZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2x0ICAgICVbdGVtcDJdLCAgJVtzdW0xXSwgICAgJVttaW5fYXNtXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92biAgICVbc3VtMV0sICAgJVttaW5fYXNtXSwgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2x0ICAgICVbdGVtcDJdLCAgJVttYXhfYXNtXSwgJVtzdW0xXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92biAgICVbc3VtMV0sICAgJVttYXhfYXNtXSwgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICVbc3VtMV0sICAgMCglW3NhbXBsZXNdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW3dfYXNtXSAiPSZyIiAod19hc20pLCBbcF9hc21dICI9JnIiIChwX2FzbSksIFt3X2FzbTFdICI9JnIiICh3X2FzbTEpLAorICAgICAgICAgIFtwX2FzbTFdICI9JnIiIChwX2FzbTEpLCBbdGVtcDFdICIrciIgKHRlbXAxKSwgW3RlbXAyXSAiK3IiICh0ZW1wMiksCisgICAgICAgICAgW3dfYXNtMl0gIj0mciIgKHdfYXNtMiksIFtwX2FzbTJdICI9JnIiIChwX2FzbTIpLCBbc3VtMV0gIityIiAoc3VtMSkKKyAgICAgICAgOiBbd10gInIiICh3KSwgW3BdICJyIiAocCksIFtzYW1wbGVzXSAiciIgKHNhbXBsZXMpLCBbbWluX2FzbV0gInIiIChtaW5fYXNtKSwKKyAgICAgICAgICBbbWF4X2FzbV0gInIiIChtYXhfYXNtKQorICAgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iLCAiJGFjMWhpIiwgIiRhYzFsbyIKKyAgICAgKTsKKworICAgICpkaXRoZXJfc3RhdGU9IHRlbXAxOworfQorCitzdGF0aWMgdm9pZCBpbWRjdDM2X21pcHNfZml4ZWQoaW50ICpvdXQsIGludCAqYnVmLCBpbnQgKmluLCBpbnQgKndpbikKK3sKKyAgICBpbnQgajsKKyAgICBpbnQgdDAsIHQxLCB0MiwgdDMsIHMwLCBzMSwgczIsIHMzOworICAgIGludCB0bXBbMThdLCAqdG1wMSwgKmluMTsKKyAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGVzICovCisgICAgaW50IHRlbXBfcmVnMSwgdGVtcF9yZWcyLCB0ZW1wX3JlZzMsIHRlbXBfcmVnNCwgdGVtcF9yZWc1LCB0ZW1wX3JlZzY7CisgICAgaW50IHQ0LCB0NSwgdDYsIHQ4LCB0NzsKKworICAgLyogdmFsdWVzIGRlZmluZWQgaW4gbWFjcm9zIGFuZCB0YWJsZXMgYXJlCisgICAgKiBlbGltaW5hdGVkIC0gdGhleSBhcmUgZGlyZWN0bHkgbG9hZGVkIGluIGFwcHJvcHJpYXRlIHZhcmlhYmxlcworICAgICovCisgICAgaW50IGNvbnN0IENfMSAgPSAgNDIyOTcxNzA5MjsgLyogY29zKHBpKjEvMTgpKjIgICovCisgICAgaW50IGNvbnN0IENfMiAgPSAgNDAzNTk0OTA3NDsgLyogY29zKHBpKjIvMTgpKjIgICovCisgICAgaW50IGNvbnN0IENfMyAgPSAgNTc1NDE2NTEwOyAgLyogLWNvcyhwaSozLzE4KSoyICovCisgICAgaW50IGNvbnN0IENfM0EgPSAgMzcxOTU1MDc4NjsgLyogY29zKHBpKjMvMTgpKjIgICovCisgICAgaW50IGNvbnN0IENfNCAgPSAgMTAwNDgzMTQ2NjsgLyogLWNvcyhwaSo0LzE4KSoyICovCisgICAgaW50IGNvbnN0IENfNSAgPSAgMTUzNDIxNTUzNDsgLyogLWNvcyhwaSo1LzE4KSoyICovCisgICAgaW50IGNvbnN0IENfNyAgPSAtMTQ2ODk2NTMzMDsgLyogLWNvcyhwaSo3LzE4KSoyICovCisgICAgaW50IGNvbnN0IENfOCAgPSAtNzQ1ODEzMjQ0OyAgLyogLWNvcyhwaSo4LzE4KSoyICovCisKKyAgIC8qCisgICAgKiBpbnN0cnVjdGlvbnMgb2YgdGhlIGZpcnN0IHR3byBsb29wcyBhcmUgcmVvcmdhbml6ZWQgYW5kIGxvb3BzIGFyZSB1bnJvbGxlZCwKKyAgICAqIGluIG9yZGVyIHRvIGVsaW1pbmF0ZSB1bm5lY2Vzc2FyeSByZWFkaW5ncyBhbmQgd3JpdGluZ3MgaW4gYXJyYXkKKyAgICAqLworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsdyAgICVbdDFdLCAxNyo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgJVt0Ml0sIDE2KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAlW3QzXSwgMTUqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICVbdDRdLCAxNCo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgJVt0MV0sICVbdDFdLCAgICAgICVbdDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAlW3QyXSwgJVt0Ml0sICAgICAgJVt0M10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICVbdDNdLCAlW3QzXSwgICAgICAlW3Q0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgJVt0NV0sIDEzKjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAlW3QxXSwgJVt0MV0sICAgICAgJVt0M10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICVbdDJdLCAxNio0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgJVt0Nl0sIDEyKjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAlW3QxXSwgMTcqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICVbdDRdLCAlW3Q0XSwgICAgICAlW3Q1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgJVt0NV0sICVbdDVdLCAgICAgICVbdDZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAlW3Q3XSwgMTEqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICVbdDNdLCAlW3QzXSwgICAgICAlW3Q1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgJVt0NF0sIDE0KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAlW3Q4XSwgMTAqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICVbdDNdLCAxNSo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgJVt0Nl0sICVbdDZdLCAgICAgICVbdDddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAlW3Q3XSwgJVt0N10sICAgICAgJVt0OF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICVbdDZdLCAxMio0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgJVt0NV0sICVbdDVdLCAgICAgICVbdDddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAlW3QxXSwgOSo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICVbdDJdLCA4KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgJVt0NV0sIDEzKjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAlW3Q4XSwgJVt0OF0sICAgICAgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICVbdDFdLCAlW3QxXSwgICAgICAlW3QyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgJVt0OF0sIDEwKjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAlW3Q3XSwgJVt0N10sICAgICAgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICVbdDNdLCA3KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgJVt0NF0sIDYqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAlW3Q3XSwgMTEqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICVbdDJdLCAlW3QyXSwgICAgICAlW3QzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgJVt0M10sICVbdDNdLCAgICAgICVbdDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAlW3QyXSwgOCo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICVbdDFdLCAlW3QxXSwgICAgICAlW3QzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgJVt0NV0sIDUqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAlW3Q2XSwgNCo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICVbdDFdLCA5KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgJVt0NF0sICVbdDRdLCAgICAgICVbdDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAlW3Q1XSwgJVt0NV0sICAgICAgJVt0Nl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICVbdDRdLCA2KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgJVt0M10sICVbdDNdLCAgICAgICVbdDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAlW3Q3XSwgMyo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICVbdDhdLCAyKjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgJVt0M10sIDcqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAlW3Q2XSwgJVt0Nl0sICAgICAgJVt0N10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICVbdDddLCAlW3Q3XSwgICAgICAlW3Q4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgJVt0Nl0sIDQqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAlW3Q1XSwgJVt0NV0sICAgICAgJVt0N10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICVbdDFdLCAxKjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgJVt0Ml0sIDAqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAlW3Q1XSwgNSo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICVbdDhdLCAlW3Q4XSwgICAgICAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgJVt0MV0sICVbdDFdLCAgICAgICVbdDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAlW3Q4XSwgMio0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICVbdDddLCAlW3Q3XSwgICAgICAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgJVt0N10sIDMqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAlW3QxXSwgMSo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbaW5dICIrciIgKGluKSwgW3QxXSAiPSZyIiAodDEpLCBbdDJdICI9JnIiICh0MiksIFt0M10gIj0mciIgKHQzKSwKKyAgICAgICAgICBbdDRdICI9JnIiICh0NCksIFt0NV0gIj0mciIgKHQ1KSwgW3Q2XSAiPSZyIiAodDYpLAorICAgICAgICAgIFt0N10gIj0mciIgKHQ3KSwgW3Q4XSAiPSZyIiAodDgpCisgICAgICAgIDoKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisKKyAgICBmb3IoaiA9IDA7IGogPCAyOyBqKyspIHsKKworICAgICAgICB0bXAxID0gdG1wICsgajsKKyAgICAgICAgaW4xID0gaW4gKyBqOworCisgICAgICAgICAvKioKKyAgICAgICAgICogIE9yaWdpbmFsIGNvbnN0YW50cyBhcmUgbXVsdGlwbGllZCBieSB0d28gaW4gYWR2YW5jZWQKKyAgICAgICAgICogIGZvciBhc3NlbWJseSBvcHRpbWl6YXRpb24gKGUuZy4gQ18yID0gMiAqIEMyKS4KKyAgICAgICAgICogIFRoYXQgY2FuIGxlYWQgdG8gb3ZlcmZsb3cgaW4gb3BlcmF0aW9ucyB3aGVyZSB0aGV5IGFyZSB1c2VkLgorICAgICAgICAgKgorICAgICAgICAgKiAgRXhhbXBsZSBvZiB0aGUgc29sdXRpb246CisgICAgICAgICAqCisgICAgICAgICAqICBpbiBvcmlnaW5hbCBjb2RlOgorICAgICAgICAgKiAgdDAgPSAoKGludDY0X3QpKGluMVsyKjJdICsgaW4xWzIqNF0pICogKGludDY0X3QpKDIqQzIpKT4+MzIKKyAgICAgICAgICoKKyAgICAgICAgICogIGluIGFzc2VtYmx5OgorICAgICAgICAgKiAgQ18yID0gMiAqIEMyOworICAgICAgICAgKiAgIC4KKyAgICAgICAgICogICAuCisgICAgICAgICAqICAibHcgICAlW3Q3XSwgICAgICAgNCo0KCVbaW4xXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICogICJsdyAgICVbdDhdLCAgICAgICA4KjQoJVtpbjFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgKiAgImFkZHUgJVt0ZW1wX3JlZzJdLCVbdDddLCAgICAgICAlW3Q4XSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAqICAibXVsdHUgJVtDXzJdLCAgICAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICogICJtZmhpICVbdGVtcF9yZWcxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgKiAgInNyYSAgJVt0ZW1wX3JlZzJdLCVbdGVtcF9yZWcyXSwzMSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAqICAibW92ZSAlW3QwXSwgICAgICAgJDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICogICJtb3ZuICVbdDBdLCAgICAgICAlW0NfMl0sICAgICAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgKiAgInN1YiAgJVt0MF0sICAgICAgICVbdGVtcF9yZWcxXSwlW3QwXSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAqLworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgImx3ICAgICVbdDddLCAgICAgICAgNCo0KCVbaW4xXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAlW3Q4XSwgICAgICAgIDgqNCglW2luMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgJVt0Nl0sICAgICAgICAxNio0KCVbaW4xXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICVbdDRdLCAgICAgICAgMCo0KCVbaW4xXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGR1ICAlW3RlbXBfcmVnMl0sICVbdDddLCAgICAgICAgJVt0OF0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkdSAgJVt0Ml0sICAgICAgICAlW3Q2XSwgICAgICAgICVbdDhdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bHR1ICVbQ18yXSwgICAgICAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAlW3Q1XSwgICAgICAgIDEyKjQoJVtpbjFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViICAgJVt0Ml0sICAgICAgICAlW3QyXSwgICAgICAgICVbdDddICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1YiAgICVbdDFdLCAgICAgICAgJVt0NF0sICAgICAgICAlW3Q1XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzcmEgICAlW3QzXSwgICAgICAgICVbdDVdLCAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JhICAgJVt0ZW1wX3JlZzFdLCAlW3QyXSwgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZHUgICVbdDNdLCAgICAgICAgJVt0M10sICAgICAgICAlW3Q0XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIgICAlW3RlbXBfcmVnMV0sICVbdDFdLCAgICAgICAgJVt0ZW1wX3JlZzFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JhICAgJVt0ZW1wX3JlZzJdLCAlW3RlbXBfcmVnMl0sIDMxICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICVbdGVtcF9yZWcxXSwgNio0KCVbdG1wMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZlICAlW3QwXSwgICAgICAgICQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92biAgJVt0MF0sICAgICAgICAlW0NfMl0sICAgICAgICVbdGVtcF9yZWcyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1maGkgICVbdGVtcF9yZWcxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGR1ICAlW3QxXSwgICAgICAgICVbdDFdLCAgICAgICAgJVt0Ml0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgJVt0MV0sICAgICAgICAxNio0KCVbdG1wMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1YiAgICVbdGVtcF9yZWc0XSwgJVt0OF0sICAgICAgICAlW3Q2XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgICAlW3RlbXBfcmVnMl0sICVbdDddLCAgICAgICAgJVt0Nl0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsdCAgJGFjMSwgICAgICAgICAlW0NfOF0sICAgICAgICVbdGVtcF9yZWc0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bHR1ICRhYzIsICAgICAgICAgJVtDXzRdLCAgICAgICAlW3RlbXBfcmVnMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIgICAlW3QwXSwgICAgICAgICVbdGVtcF9yZWcxXSwgJVt0MF0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JhICAgJVt0ZW1wX3JlZzFdLCAlW3RlbXBfcmVnMl0sIDMxICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmUgICVbdDJdLCAgICAgICAgJDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAlW3QyXSwgICAgICAgICVbQ180XSwgICAgICAgJVt0ZW1wX3JlZzFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZoaSAgJVt0MV0sICAgICAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1maGkgICVbdGVtcF9yZWcxXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAlW3Q2XSwgICAgICAgIDEwKjQoJVtpbjFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHcgICAgJVt0OF0sICAgICAgICAxNCo0KCVbaW4xXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICVbdDddLCAgICAgICAgMio0KCVbaW4xXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsdyAgICAlW3Q0XSwgICAgICAgIDYqNCglW2luMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViICAgJVt0ZW1wX3JlZzNdLCAlW3QzXSwgICAgICAgICVbdDBdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZCAgICVbdGVtcF9yZWc0XSwgJVt0M10sICAgICAgICAlW3QwXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIgICAlW3RlbXBfcmVnMV0sICVbdGVtcF9yZWcxXSwgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgJVt0ZW1wX3JlZzRdLCAlW3RlbXBfcmVnNF0sICVbdDFdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1YiAgICVbdDJdLCAgICAgICAgJVt0ZW1wX3JlZzFdLCAlW3QyXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAlW3RlbXBfcmVnNF0sIDIqNCglW3RtcDFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViICAgJVt0ZW1wX3JlZzNdLCAlW3RlbXBfcmVnM10sICVbdDJdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZCAgICVbdGVtcF9yZWcxXSwgJVt0M10sICAgICAgICAlW3QyXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAlW3RlbXBfcmVnM10sIDEwKjQoJVt0bXAxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViICAgJVt0ZW1wX3JlZzFdLCAlW3RlbXBfcmVnMV0sICVbdDFdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZHUgICVbdGVtcF9yZWcyXSwgJVt0Nl0sICAgICAgICAlW3Q4XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdyAgICAlW3RlbXBfcmVnMV0sIDE0KjQoJVt0bXAxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViICAgJVt0ZW1wX3JlZzJdLCAlW3RlbXBfcmVnMl0sICVbdDddICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZHUgICVbdGVtcF9yZWczXSwgJVt0N10sICAgICAgICAlW3Q2XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWx0dSAkYWMzLCAgICAgICAgICVbQ18zXSwgICAgICAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsdHUgJVtDXzFdLCAgICAgICAlW3RlbXBfcmVnM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNyYSAgICVbdGVtcF9yZWcxXSwgJVt0ZW1wX3JlZzJdLCAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZlICAlW3QxXSwgICAgICAgICQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JhICAgJVt0ZW1wX3JlZzNdLCAlW3RlbXBfcmVnM10sIDMxICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICVbdDFdLCAgICAgICAgJVtDXzNdLCAgICAgICAlW3RlbXBfcmVnMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtZmhpICAlW3RlbXBfcmVnMV0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZoaSAgJVt0ZW1wX3JlZzRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmUgICVbdDJdLCAgICAgICAgJDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAlW3QyXSwgICAgICAgICVbQ18xXSwgICAgICAgJVt0ZW1wX3JlZzNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViICAgJVt0ZW1wX3JlZzNdLCAlW3Q2XSwgICAgICAgICVbdDhdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1YiAgICVbdDJdLCAgICAgICAgJVt0ZW1wX3JlZzRdLCAlW3QyXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWx0dSAkYWMxLCAgICAgICAgICVbQ183XSwgICAgICAgJVt0ZW1wX3JlZzNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViICAgJVt0ZW1wX3JlZzFdLCAlW3RlbXBfcmVnMV0sICVbdGVtcF9yZWcyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNyYSAgICVbdGVtcF9yZWc0XSwgJVt0ZW1wX3JlZzNdLCAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIgICAlW3QxXSwgICAgICAgICVbdGVtcF9yZWcxXSwgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZSAgJVt0M10sICAgICAgICAkMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICVbdDFdLCAgICAgICAgNCo0KCVbdG1wMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAlW3QzXSwgICAgICAgICVbQ183XSwgICAgICAgJVt0ZW1wX3JlZzRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsdHUgJGFjMiwgICAgICAgICAlW0NfM0FdLCAgICAgICVbdDRdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZCAgICVbdGVtcF9yZWcyXSwgJVt0N10sICAgICAgICAlW3Q4XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZlICAlW3QxXSwgICAgICAgICQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZoaSAgJVt0ZW1wX3JlZzRdLCAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bHR1ICRhYzMsJVtDXzVdLCAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZlICAlW3QwXSwgICAgICAgICQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3JhICAgJVt0ZW1wX3JlZzFdLCAlW3RlbXBfcmVnMl0sIDMxICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm4gICVbdDFdLCVbQ181XSwgJVt0ZW1wX3JlZzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIgICAlW3RlbXBfcmVnNF0sICVbdGVtcF9yZWc0XSwgJVt0ZW1wX3JlZzNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZoaSAgJVt0ZW1wX3JlZzFdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNyYSAgICVbdGVtcF9yZWczXSwgJVt0NF0sICAgICAgICAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZuICAlW3QwXSwgICAgICAgICVbQ18zQV0sICAgICAgJVt0ZW1wX3JlZzNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZoaSAgJVt0ZW1wX3JlZzNdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1YiAgICVbdDNdLCAgICAgICAgJVt0ZW1wX3JlZzRdLCAlW3QzXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgICAlW3RlbXBfcmVnNF0sICVbdDNdLCAgICAgICAgJVt0Ml0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViICAgJVt0ZW1wX3JlZzFdLCAlW3RlbXBfcmVnMV0sICVbdGVtcF9yZWcyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1YiAgICVbdDFdLCAgICAgICAgJVt0ZW1wX3JlZzFdLCAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIgICAlW3QwXSwgICAgICAgICVbdGVtcF9yZWczXSwgJVt0MF0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgJVt0ZW1wX3JlZzFdLCAlW3QyXSwgICAgICAgICVbdDFdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZCAgICVbdGVtcF9yZWc0XSwgJVt0ZW1wX3JlZzRdLCAlW3QwXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIgICAlW3RlbXBfcmVnMl0sICVbdDNdLCAgICAgICAgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgJVt0ZW1wX3JlZzRdLCAwKjQoJVt0bXAxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1YiAgICVbdGVtcF9yZWcxXSwgJVt0ZW1wX3JlZzFdLCAlW3QwXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzdWIgICAlW3RlbXBfcmVnMl0sICVbdGVtcF9yZWcyXSwgJVt0MF0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3cgICAgJVt0ZW1wX3JlZzFdLCAxMio0KCVbdG1wMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3ICAgICVbdGVtcF9yZWcyXSwgOCo0KCVbdG1wMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbdDddICI9JnIiICh0NyksIFt0ZW1wX3JlZzFdICI9JnIiICh0ZW1wX3JlZzEpLAorICAgICAgICAgICAgICBbdGVtcF9yZWcyXSAiPSZyIiAodGVtcF9yZWcyKSwgW3RlbXBfcmVnNF0gIj0mciIgKHRlbXBfcmVnNCksCisgICAgICAgICAgICAgIFt0ZW1wX3JlZzNdICI9JnIiICh0ZW1wX3JlZzMpLCBbdDhdICI9JnIiICh0OCksIFt0MF0gIj0mciIgKHQwKSwKKyAgICAgICAgICAgICAgW3Q0XSAiPSZyIiAodDQpLCBbdDVdICI9JnIiICh0NSksIFt0Nl0gIj0mciIodDYpLCBbdDJdICI9JnIiICh0MiksCisgICAgICAgICAgICAgIFt0M10gIj0mciIgKHQzKSwgW3QxXSAiPSZyIiAodDEpCisgICAgICAgICAgICA6IFtDXzJdICJyIiAoQ18yKSwgW2luMV0gInIiIChpbjEpLCBbdG1wMV0gInIiICh0bXAxKSwgW0NfOF0gInIiIChDXzgpLAorICAgICAgICAgICAgICBbQ180XSAiciIgKENfNCksIFtDXzNdICJyIiAoQ18zKSwgW0NfMV0gInIiIChDXzEpLCBbQ183XSAiciIgKENfNyksCisgICAgICAgICAgICAgIFtDXzNBXSAiciIgKENfM0EpLCBbQ181XSAiciIgKENfNSkKKyAgICAgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIsICIkYWMxaGkiLCAiJGFjMWxvIiwgIiRhYzJoaSIsICIkYWMybG8iLAorICAgICAgICAgICAgICAiJGFjM2hpIiwgIiRhYzNsbyIKKyAgICAgICAgICk7CisgICAgfQorCisgICAgLyoqCisgICAgKiBsb29wIGlzIHVucm9sbGVkIGZvdXIgdGltZXMKKyAgICAqCisgICAgKiB2YWx1ZXMgZGVmaW5lZCBpbiB0YWJsZXMoaWNvczM2W10gYW5kIGljb3MzNmhbXSkgYXJlIG5vdCBsb2FkZWQgZnJvbQorICAgICogdGhlc2UgdGFibGVzIC0gdGhleSBhcmUgZGlyZWN0bHkgbG9hZGVkIGluIGFwcHJvcHJpYXRlIHJlZ2lzdGVycworICAgICoKKyAgICAqLworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsdyAgICAgJVt0Ml0sICAgICAgICAxKjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdDNdLCAgICAgICAgMyo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3QwXSwgICAgICAgIDAqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0MV0sICAgICAgICAyKjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAgICVbdGVtcF9yZWcxXSwgJVt0M10sICAgICAgICAlW3QyXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAlW3RlbXBfcmVnMl0sIDB4ODA3RDJCMUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZlICAgJVtzMV0sICAgICAgICAkMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdHUgICVbdGVtcF9yZWcyXSwgJVt0ZW1wX3JlZzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNyYSAgICAlW3RlbXBfcmVnMV0sICVbdGVtcF9yZWcxXSwgMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZuICAgJVtzMV0sICAgICAgICAlW3RlbXBfcmVnMl0sICVbdGVtcF9yZWcxXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICAgICVbdGVtcF9yZWczXSwgJVt0M10sICAgICAgICAlW3QyXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAlW3RlbXBfcmVnNF0sIDB4MmRlNTE1MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAgICVbczBdLCAgICAgICAgJVt0MV0sICAgICAgICAlW3QwXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnNV0sIDkqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMSwgICAgICAgICAlW3RlbXBfcmVnNF0sICVbdGVtcF9yZWczXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWc2XSwgNCo5KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YiAgICAlW3MyXSwgICAgICAgICVbdDFdLCAgICAgICAgJVt0MF0gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzNdLCAyOSo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3VidSAgICVbczFdLCAgICAgICAgJVt0ZW1wX3JlZzJdLCAlW3MxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnNF0sIDI4KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0MF0sICAgICAgICAlW3MwXSwgICAgICAgICVbczFdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZXh0ci53ICVbczNdLCAgICAgICAgJGFjMSwyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAkYWMyLCAgICAgICAgICVbdDBdLCAgICAgICAgJVt0ZW1wX3JlZzNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgJVt0MV0sICAgICAgICAlW3MwXSwgICAgICAgICVbczFdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWcxXSwgNCo4KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAlW3QxXSwgICAgICAgICVbdGVtcF9yZWc1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzJdLCA4KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWczXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAkYWMzLCAgICAgICAgICVbdDBdLCAgICAgICAgJVt0ZW1wX3JlZzRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0MF0sICAgICAgICAlW3MyXSwgICAgICAgICVbczNdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWc1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAkYWMxLCAgICAgICAgICVbdDFdLCAgICAgICAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgJVt0MV0sICAgICAgICAlW3MyXSwgICAgICAgICVbczNdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWczXSwgNCo5KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnNF0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzNdLCAzNyo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWcyXSwgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlW3RlbXBfcmVnNV0sICVbdGVtcF9yZWc1XSwgJVt0ZW1wX3JlZzZdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzZdLCAxNyo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWc1XSwgMzIqOSo0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW3RlbXBfcmVnNF0sIDQqOCo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJVt0MV0sICAgICAgICAlW3RlbXBfcmVnNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICVbdGVtcF9yZWcxXSwgJVt0ZW1wX3JlZzFdLCAlW3RlbXBfcmVnMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnMl0sIDAqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzVdLCA0KjE3KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWcxXSwgOCozMio0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMSwgICAgICAgICAlW3QxXSwgICAgICAgICVbdGVtcF9yZWcyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWc0XSwgMjAqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnMV0sIDAoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMiwgICAgICAgICAlW3QwXSwgICAgICAgICVbdGVtcF9yZWczXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICVbdDBdLCAgICAgICAgJVt0ZW1wX3JlZzRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnMl0sICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0MF0sICAgICAgICA0KjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICVbdGVtcF9yZWc1XSwgJVt0ZW1wX3JlZzVdLCAlW3RlbXBfcmVnNl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnM10sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgJVt0ZW1wX3JlZzRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWc1XSwgMTcqMzIqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3QxXSwgICAgICAgIDYqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0ZW1wX3JlZzFdLCAlW3RlbXBfcmVnMV0sICVbdGVtcF9yZWcyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdDJdLCAgICAgICAgNSo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW3RlbXBfcmVnMV0sIDAqMzIqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICAgJVtzMF0sICAgICAgICAlW3QxXSwgICAgICAgICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWczXSwgNCoxNyo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3QzXSwgICAgICAgIDcqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgJVtzMl0sICAgICAgICAlW3QxXSwgICAgICAgICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWc0XSwgMCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAlW3RlbXBfcmVnNV0sICVbdDNdLCAgICAgICAgJVt0Ml0gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgJVt0ZW1wX3JlZzZdLCAweDg0ODNFRTBDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZSAgICVbczFdLCAgICAgICAgJDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHR1ICAlW3RlbXBfcmVnNl0sICVbdGVtcF9yZWc1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgJVt0ZW1wX3JlZzFdLCAlW3QzXSwgICAgICAgICVbdDJdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICVbdGVtcF9yZWcyXSwgMHhmNzQ2ZWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNyYSAgICAlW3RlbXBfcmVnNV0sICVbdGVtcF9yZWc1XSwgMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMSwgICAgICAgICAlW3RlbXBfcmVnMl0sICVbdGVtcF9yZWcxXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92biAgICVbczFdLCAgICAgICAgJVt0ZW1wX3JlZzZdLCAlW3RlbXBfcmVnNV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzNdLCAxMCo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWc0XSwgNCoxMCo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImV4dHIudyAlW3MzXSwgICAgICAgICRhYzEsICAgICAgICAgMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzFdLCA0KjcqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWcyXSwgNyo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnNl0sIDMwKjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1ICAgJVtzMV0sICAgICAgICAlW3RlbXBfcmVnNV0sICVbczFdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICAgICVbdDFdLCAgICAgICAgJVtzMF0sICAgICAgICAlW3MxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlW3QwXSwgICAgICAgICVbczBdLCAgICAgICAgJVtzMV0gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMiwgICAgICAgICAlW3QxXSwgICAgICAgICVbdGVtcF9yZWczXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICRhYzMsICAgICAgICAgJVt0MV0sICAgICAgICAlW3RlbXBfcmVnMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAlW3QwXSwgICAgICAgICVbdGVtcF9yZWc2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzVdLCAyNyo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICRhYzEsICAgICAgICAgJVt0MF0sICAgICAgICAlW3RlbXBfcmVnNV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnM10sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgJVt0ZW1wX3JlZzJdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWc2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlW3QwXSwgICAgICAgICVbczJdLCAgICAgICAgJVtzM10gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgJVt0MV0sICAgICAgICAlW3MyXSwgICAgICAgICVbczNdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICVbdGVtcF9yZWczXSwgJVt0ZW1wX3JlZzNdLCAlW3RlbXBfcmVnNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnNF0sIDE2KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgJVt0ZW1wX3JlZzVdLCAkYWMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWczXSwgMzIqMTAqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlW3RlbXBfcmVnMV0sICVbdGVtcF9yZWcxXSwgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzNdLCA0KjE2KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWc2XSwgNCoxMCo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW3RlbXBfcmVnMV0sIDcqMzIqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMiwgICAgICAgICAlW3QxXSwgICAgICAgICVbdGVtcF9yZWc0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWc1XSwgNCo3KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnNl0sIDEqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzVdLCA0KjEqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWcxXSwgMzYqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAkYWMzLCAgICAgICAgICVbdDFdLCAgICAgICAgJVt0ZW1wX3JlZzZdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzJdLCAyMSo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWc0XSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAlW3QwXSwgICAgICAgICVbdGVtcF9yZWcxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMSwgICAgICAgICAlW3QwXSwlW3RlbXBfcmVnMl0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdDBdLCAgICAgICAgOCo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnNl0sICRhYzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0MV0sICAgICAgICAxMCo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdDNdLCAgICAgICAgMTEqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0ZW1wX3JlZzNdLCAlW3RlbXBfcmVnM10sICVbdGVtcF9yZWc0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdDJdLCAgICAgICAgOSo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnMl0sICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0ZW1wX3JlZzVdLCAlW3RlbXBfcmVnNV0sICVbdGVtcF9yZWc2XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWczXSwgMTYqMzIqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW3RlbXBfcmVnNV0sIDEqMzIqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVt0ZW1wX3JlZzFdLCA0KjE2KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAgICVbdGVtcF9yZWczXSwgJVt0M10sICAgICAgICAlW3QyXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAlW3RlbXBfcmVnNF0sIDB4OEQzQjdDRDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVt0ZW1wX3JlZzJdLCA0KjEqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdHUgICVbdGVtcF9yZWc0XSwlW3RlbXBfcmVnM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNyYSAgICAlW3RlbXBfcmVnM10sICVbdGVtcF9yZWczXSwgMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZlICAgJVtzMV0sICAgICAgICAkMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92biAgICVbczFdLCAgICAgICAgJVt0ZW1wX3JlZzRdLCAlW3RlbXBfcmVnM10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAlW3MwXSwgICAgICAgICVbdDFdLCAgICAgICAgJVt0MF0gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgJVt0ZW1wX3JlZzNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICAgICVbczJdLCAgICAgICAgJVt0MV0sICAgICAgICAlW3QwXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YiAgICAlW3RlbXBfcmVnNV0sICVbdDNdLCAgICAgICAgJVt0Ml0gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgJVt0ZW1wX3JlZzZdLCAweDk3NmZkOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWcyXSwgMTEqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnMV0sIDQqMTEqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMSwgICAgICAgICAlW3RlbXBfcmVnNl0sICVbdGVtcF9yZWc1XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3VidSAgICVbczFdLCAgICAgICAgJVt0ZW1wX3JlZzNdLCAlW3MxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnNV0sIDMxKjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgJVt0MV0sICAgICAgICAlW3MwXSwgICAgICAgICVbczFdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICVbdDBdLCAgICAgICAgJVtzMF0sICAgICAgICAlW3MxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAkYWMyLCAgICAgICAgICVbdDFdLCAgICAgICAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJVt0MF0sICAgICAgICAlW3RlbXBfcmVnNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWc0XSwgNio0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImV4dHIudyAlW3MzXSwgICAgICAgICRhYzEsICAgICAgICAgMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzNdLCA0KjYqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWcyXSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnNl0sIDI2KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgJVt0ZW1wX3JlZzVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICRhYzMsICAgICAgICAgJVt0MV0sICAgICAgICAlW3RlbXBfcmVnNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAkYWMxLCAgICAgICAgICVbdDBdLCAgICAgICAgJVt0ZW1wX3JlZzZdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0MF0sICAgICAgICAlW3MyXSwgICAgICAgICVbczNdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICAgICVbdDFdLCAgICAgICAgJVtzMl0sICAgICAgICAlW3MzXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlW3RlbXBfcmVnMl0sICVbdGVtcF9yZWcyXSwgJVt0ZW1wX3JlZzFdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgJVt0ZW1wX3JlZzRdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWc2XSwgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW3RlbXBfcmVnNV0sIDQqMTEqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVt0ZW1wX3JlZzJdLCAzMioxMSo0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWcxXSwgNCoxNSo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlW3RlbXBfcmVnM10sICVbdGVtcF9yZWczXSwgJVt0ZW1wX3JlZzRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzJdLCAxNSo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWczXSwgNiozMio0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW3RlbXBfcmVnNl0sIDQqNio0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJVt0MV0sICAgICAgICAlW3RlbXBfcmVnMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWczXSwgMio0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnNF0sIDQqMio0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzVdLCAzNSo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICRhYzEsICAgICAgICAgJVt0MV0sICAgICAgICAlW3RlbXBfcmVnM10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzZdLCAyMio0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICRhYzIsICAgICAgICAgJVt0MF0sICAgICAgICAlW3RlbXBfcmVnNV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3QxXSwgICAgICAgIDE0KjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMywgICAgICAgICAlW3QwXSwgICAgICAgICVbdGVtcF9yZWc2XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdDBdLCAgICAgICAgMTIqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnM10sICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0ZW1wX3JlZzFdLCAlW3RlbXBfcmVnMV0sICVbdGVtcF9yZWcyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWc1XSwgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW3RlbXBfcmVnMV0sIDE1KjMyKjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgJVt0ZW1wX3JlZzZdLCAkYWMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdDJdLCAgICAgICAgMTMqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3QzXSwgICAgICAgIDE1KjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0ZW1wX3JlZzRdLCAlW3RlbXBfcmVnNF0sICVbdGVtcF9yZWczXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWc1XSwgNCoxNSo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAlW3RlbXBfcmVnMV0sICVbdDNdLCAgICAgICAgJVt0Ml0gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgJVt0ZW1wX3JlZzJdLCAweDlDNDI1NzdDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZSAgICVbczFdLCAgICAgICAgJDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHR1ICAlW3RlbXBfcmVnMl0sICVbdGVtcF9yZWcxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVt0ZW1wX3JlZzRdLCAyKjMyKjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3JhICAgICVbdGVtcF9yZWcxXSwgJVt0ZW1wX3JlZzFdLCAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdm4gICAlW3MxXSwgICAgICAgICVbdGVtcF9yZWcyXSwgJVt0ZW1wX3JlZzFdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgJVt0ZW1wX3JlZzNdLCAlW3QzXSwgICAgICAgICVbdDJdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICVbdGVtcF9yZWc0XSwgMHg2Zjk0YTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICAgJVtzMF0sICAgICAgICAlW3QxXSwgICAgICAgICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWc2XSwgNCoyKjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAkYWMxLCAgICAgICAgICVbdGVtcF9yZWc0XSwgJVt0ZW1wX3JlZzNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgJVtzMl0sICAgICAgICAlW3QxXSwgICAgICAgICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWc1XSwgMTIqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnNl0sIDQqMTIqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1ICAgJVtzMV0sICAgICAgICAlW3RlbXBfcmVnMV0sICVbczFdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICAgICVbdDFdLCAgICAgICAgJVtzMF0sICAgICAgICAlW3MxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnM10sIDMyKjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMiwgICAgICAgICAlW3QxXSwgICAgICAgICVbdGVtcF9yZWc1XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICVbdDBdLCAgICAgICAgJVtzMF0sICAgICAgICAlW3MxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImV4dHIudyAlW3MzXSwgICAgICAgICRhYzEsICAgICAgICAgMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzJdLCA1KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICVbdDBdLCAgICAgICAgJVt0ZW1wX3JlZzNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnNV0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzRdLCAyNSo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWcxXSwgNCo1KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAkYWMzLCAgICAgICAgICVbdDFdLCAgICAgICAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMSwgICAgICAgICAlW3QwXSwgICAgICAgICVbdGVtcF9yZWc0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWczXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlW3QwXSwgICAgICAgICVbczJdLCAgICAgICAgJVtzM10gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0ZW1wX3JlZzVdLCAlW3RlbXBfcmVnNV0sICVbdGVtcF9yZWc2XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWcyXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnNF0sICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgJVt0MV0sICAgICAgICAlW3MyXSwgICAgICAgICVbczNdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWc1XSwgMzIqMTIqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW3RlbXBfcmVnM10sIDQqMTIqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzZdLCAxNCo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWc1XSwgNCoxNCo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlW3RlbXBfcmVnMV0sICVbdGVtcF9yZWcxXSwgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVt0ZW1wX3JlZzRdLCA0KjUqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWcxXSwgNSozMio0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAlW3QxXSwgICAgICAgICVbdGVtcF9yZWc2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzRdLCAzNCo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWcyXSwgMyo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnMV0sIDQqMyo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMiwgICAgICAgICAlW3QwXSwgICAgICAgICVbdGVtcF9yZWc0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWc2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAkYWMxLCAgICAgICAgICVbdDFdLCAgICAgICAgJVt0ZW1wX3JlZzJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzNdLCAyMyo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbczBdLCAgICAgICAgMTYqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnNF0sICRhYzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0MV0sICAgICAgICAxNyo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICRhYzMsICAgICAgICAgJVt0MF0sICAgICAgICAlW3RlbXBfcmVnM10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmUgICAlW3MxXSwgICAgICAgICQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0ZW1wX3JlZzVdLCAlW3RlbXBfcmVnNV0sICVbdGVtcF9yZWc2XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWcyXSwgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW3RlbXBfcmVnNV0sIDE0KjMyKjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVt0ZW1wX3JlZzRdLCA0KjE0KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWczXSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAlW3RlbXBfcmVnNV0sIDB4QjUwNEYzMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0ZW1wX3JlZzFdLCAlW3RlbXBfcmVnMV0sICVbdGVtcF9yZWcyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdHUgICVbdGVtcF9yZWc1XSwgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnMl0sIDQqMTMqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVt0ZW1wX3JlZzFdLCAzKjMyKjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3JhICAgICVbdDFdLCAgICAgICAgJVt0MV0sICAgICAgICAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZuICAgJVtzMV0sICAgICAgICAlW3RlbXBfcmVnNV0sICVbdDFdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWczXSwgNCozKjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnMV0sIDEzKjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVt0ZW1wX3JlZzRdLCA0KjQqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWczXSwgNCo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW3RlbXBfcmVnNV0sIDMzKjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1ICAgJVtzMV0sICAgICAgICAlW3RlbXBfcmVnNl0sICVbczFdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbdGVtcF9yZWc2XSwgMjQqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YiAgICAlW3QxXSwgICAgICAgICVbczBdLCAgICAgICAgJVtzMV0gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0MF0sICAgICAgICAlW3MwXSwgICAgICAgICVbczFdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICRhYzEsICAgICAgICAgJVt0MV0sICAgICAgICAlW3RlbXBfcmVnMV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAkYWMyLCAgICAgICAgICVbdDFdLCAgICAgICAgJVt0ZW1wX3JlZzNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgJGFjMywgICAgICAgICAlW3QwXSwgICAgICAgICVbdGVtcF9yZWc1XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICVbdDBdLCAgICAgICAgJVt0ZW1wX3JlZzZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnMV0sICRhYzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgJVt0ZW1wX3JlZzNdLCAkYWMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICVbdGVtcF9yZWc1XSwgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAlW3RlbXBfcmVnNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJVt0ZW1wX3JlZzJdLCAlW3RlbXBfcmVnMl0sICVbdGVtcF9yZWcxXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICVbdGVtcF9yZWc0XSwgJVt0ZW1wX3JlZzRdLCAlW3RlbXBfcmVnM10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW3RlbXBfcmVnMl0sIDEzKjMyKjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVt0ZW1wX3JlZzRdLCA0KjMyKjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbdGVtcF9yZWc1XSwgNCoxMyo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW3RlbXBfcmVnNl0sIDQqNCo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbdDBdICI9JnIiICh0MCksIFt0MV0gIj0mciIgKHQxKSwgW3QyXSAiPSZyIiAodDIpLCBbdDNdICI9JnIiICh0MyksCisgICAgICAgICAgW3MwXSAiPSZyIiAoczApLCBbczJdICI9JnIiIChzMiksIFt0ZW1wX3JlZzFdICI9JnIiICh0ZW1wX3JlZzEpLAorICAgICAgICAgIFt0ZW1wX3JlZzJdICI9JnIiICh0ZW1wX3JlZzIpLCBbczFdICI9JnIiIChzMSksIFtzM10gIj0mciIgKHMzKSwKKyAgICAgICAgICBbdGVtcF9yZWczXSAiPSZyIiAodGVtcF9yZWczKSwgW3RlbXBfcmVnNF0gIj0mciIgKHRlbXBfcmVnNCksCisgICAgICAgICAgW3RlbXBfcmVnNV0gIj0mciIgKHRlbXBfcmVnNSksIFt0ZW1wX3JlZzZdICI9JnIiICh0ZW1wX3JlZzYpLAorICAgICAgICAgIFtvdXRdICIrciIgKG91dCkKKyAgICAgICAgOiBbdG1wXSAiciIgKHRtcCksIFt3aW5dICJyIiAod2luKSwgW2J1Zl0gInIiIChidWYpCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIsICIkYWMxaGkiLCAiJGFjMWxvIiwgIiRhYzJoaSIsICIkYWMybG8iLAorICAgICAgICAgICIkYWMzaGkiLCAiJGFjM2xvIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkIGZmX2ltZGN0MzZfYmxvY2tzX21pcHNfZml4ZWQoaW50ICpvdXQsIGludCAqYnVmLCBpbnQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50IHN3aXRjaF9wb2ludCwgaW50IGJsb2NrX3R5cGUpCit7CisgICAgaW50IGo7CisgICAgZm9yIChqPTAgOyBqIDwgY291bnQ7IGorKykgeworICAgICAgICAvKiBhcHBseSB3aW5kb3cgJiBvdmVybGFwIHdpdGggcHJldmlvdXMgYnVmZmVyICovCisKKyAgICAgICAgLyogc2VsZWN0IHdpbmRvdyAqLworICAgICAgICBpbnQgd2luX2lkeCA9IChzd2l0Y2hfcG9pbnQgJiYgaiA8IDIpID8gMCA6IGJsb2NrX3R5cGU7CisgICAgICAgIGludCAqd2luID0gZmZfbWRjdF93aW5fZml4ZWRbd2luX2lkeCArICg0ICYgLShqICYgMSkpXTsKKworICAgICAgICBpbWRjdDM2X21pcHNfZml4ZWQob3V0LCBidWYsIGluLCB3aW4pOworCisgICAgICAgIGluICArPSAxODsKKyAgICAgICAgYnVmICs9ICgoaiYzKSAhPSAzID8gMSA6ICg3Mi0zKSk7CisgICAgICAgIG91dCsrOworICAgIH0KK30KKwordm9pZCBmZl9tcGFkc3BfaW5pdF9taXBzZHNwcjEoTVBBRFNQQ29udGV4dCAqcykKK3sKKyAgICBzLT5hcHBseV93aW5kb3dfZml4ZWQgICA9IGZmX21wYWRzcF9hcHBseV93aW5kb3dfbWlwc19maXhlZDsKKyAgICBzLT5pbWRjdDM2X2Jsb2Nrc19maXhlZCA9IGZmX2ltZGN0MzZfYmxvY2tzX21pcHNfZml4ZWQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9taXBzL21wZWdhdWRpb2RzcF9taXBzX2Zsb2F0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9taXBzL21wZWdhdWRpb2RzcF9taXBzX2Zsb2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViOGU3OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvbXBlZ2F1ZGlvZHNwX21pcHNfZmxvYXQuYwpAQCAtMCwwICsxLDEyNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIKKyAqICAgICAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIENhbGlmb3JuaWEuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3I6ICBCb2phbiBaaXZrb3ZpYyAoYm9qYW5AbWlwcy5jb20pCisgKgorICogTVBFRyBBdWRpbyBkZWNvZGVyIG9wdGltaXplZCBmb3IgTUlQUyBmbG9hdGluZy1wb2ludCBhcmNoaXRlY3R1cmUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUmVmZXJlbmNlOiBsaWJhdmNvZGVjL21wZWdhdWRpb2RzcF90ZW1wbGF0ZS5jCisgKiAgICAgICAgICAgIGxpYmF2Y29kZWMvZGN0MzIuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwLmgiCisKK3N0YXRpYyB2b2lkIGZmX21wYWRzcF9hcHBseV93aW5kb3dfbWlwc19mbG9hdChmbG9hdCAqc3ludGhfYnVmLCBmbG9hdCAqd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyX3N0YXRlLCBmbG9hdCAqc2FtcGxlcywgaW50IGluY3IpCit7CisgICAgcmVnaXN0ZXIgY29uc3QgZmxvYXQgKncsICp3MiwgKnA7CisgICAgaW50IGo7CisgICAgZmxvYXQgKnNhbXBsZXMyOworICAgIGZsb2F0IHN1bSwgc3VtMjsKKyAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGVzICovCisgICAgaW50IGluY3IxID0gaW5jciA8PCAyOworICAgIGludCB0X3NhbXBsZTsKKyAgICBmbG9hdCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsIGluODsKKyAgICBmbG9hdCAqcDI7CisKKyAgICAvKiBjb3B5IHRvIGF2b2lkIHdyYXAgKi8KKyAgICBtZW1jcHkoc3ludGhfYnVmICsgNTEyLCBzeW50aF9idWYsIDMyICogc2l6ZW9mKCpzeW50aF9idWYpKTsKKworICAgIC8qKgorICAgICogaW5zdHJ1Y3Rpb25zIGFyZSBzY2hlZHVsZWQgdG8gbWluaW1pemUgcGlwZWxpbmUgc3RhbGwuCisgICAgKiB1c2Ugb2Ygcm91bmRfc2FtcGxlIGZ1bmN0aW9uIGZyb20gdGhlIG9yaWdpbmFsIGNvZGUgaXMKKyAgICAqIGNoYW5nZWQgd2l0aCBhcHByb3ByaWF0ZSBhc3NlbWJseSBpbnN0cnVjdGlvbnMuCisgICAgKi8KKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibHdjMSAgICAlW3N1bV0sICAgICAgMCglW2RpdGhlcl9zdGF0ZV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzbGwgICAgICVbdF9zYW1wbGVdLCAlW2luY3IxXSwgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1YiAgICAgJVt0X3NhbXBsZV0sICVbdF9zYW1wbGVdLCAgJVtpbmNyMV0gICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAlW2pdLCAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4xXSwgICAgICAwKCVbd2luZG93XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjJdLCAgICAgIDE2KjQoJVtzeW50aF9idWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3cgICAgICAkemVybywgICAgICAgMCglW2RpdGhlcl9zdGF0ZV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4zXSwgICAgICA2NCo0KCVbd2luZG93XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjRdLCAgICAgIDgwKjQoJVtzeW50aF9idWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkdSAgICAlW3NhbXBsZXMyXSwgJVtzYW1wbGVzXSwgICAlW3Rfc2FtcGxlXSAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgICVbc3VtXSwgICAgICAlW3N1bV0sICAgICAgICVbaW4xXSwgJVtpbjJdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjVdLCAgICAgIDEyOCo0KCVbd2luZG93XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNl0sICAgICAgMTQ0KjQoJVtzeW50aF9idWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW43XSwgICAgICAxOTIqNCglW3dpbmRvd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjNdLCAlW2luNF0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luOF0sICAgICAgMjA4KjQoJVtzeW50aF9idWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4xXSwgICAgICAyNTYqNCglW3dpbmRvd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjJdLCAgICAgIDI3Mio0KCVbc3ludGhfYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICAlW3N1bV0sICAgICAgJVtzdW1dLCAgICAgICAlW2luNV0sICVbaW42XSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4zXSwgICAgICAzMjAqNCglW3dpbmRvd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjRdLCAgICAgIDMzNio0KCVbc3ludGhfYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNV0sICAgICAgMzg0KjQoJVt3aW5kb3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgICVbc3VtXSwgICAgICAlW3N1bV0sICAgICAgICVbaW43XSwgJVtpbjhdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjZdLCAgICAgIDQwMCo0KCVbc3ludGhfYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luN10sICAgICAgNDQ4KjQoJVt3aW5kb3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW44XSwgICAgICA0NjQqNCglW3N5bnRoX2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjFdLCAlW2luMl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMV0sICAgICAgMzIqNCglW3dpbmRvd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4yXSwgICAgICA0OCo0KCVbc3ludGhfYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjNdLCAlW2luNF0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luM10sICAgICAgOTYqNCglW3dpbmRvd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW40XSwgICAgICAxMTIqNCglW3N5bnRoX2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjVdLCAlW2luNl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNV0sICAgICAgMTYwKjQoJVt3aW5kb3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW42XSwgICAgICAxNzYqNCglW3N5bnRoX2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjddLCAlW2luOF0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luN10sICAgICAgMjI0KjQoJVt3aW5kb3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW44XSwgICAgICAyNDAqNCglW3N5bnRoX2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjFdLCAlW2luMl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMV0sICAgICAgMjg4KjQoJVt3aW5kb3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4yXSwgICAgICAzMDQqNCglW3N5bnRoX2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjNdLCAlW2luNF0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luM10sICAgICAgMzUyKjQoJVt3aW5kb3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW40XSwgICAgICAzNjgqNCglW3N5bnRoX2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjVdLCAlW2luNl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNV0sICAgICAgNDE2KjQoJVt3aW5kb3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW42XSwgICAgICA0MzIqNCglW3N5bnRoX2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjddLCAlW2luOF0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luN10sICAgICAgNDgwKjQoJVt3aW5kb3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW44XSwgICAgICA0OTYqNCglW3N5bnRoX2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjFdLCAlW2luMl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkdSAgICAlW3ddLCAgICAgICAgJVt3aW5kb3ddLCAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbc3VtXSwgICAgICAlW3N1bV0sICAgICAgICVbaW4zXSwgJVtpbjRdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZHUgICAgJVt3Ml0sICAgICAgICVbd2luZG93XSwgICAgMTI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkaXUgICAlW3BdLCAgICAgICAgJVtzeW50aF9idWZdLCA2OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGRpdSAgICVbcDJdLCAgICAgICAlW3N5bnRoX2J1Zl0sIDE4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjVdLCAlW2luNl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW3N1bV0sICAgICAgJVtzdW1dLCAgICAgICAlW2luN10sICVbaW44XSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbc3VtXSwgICAgICAwKCVbc2FtcGxlc10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZHUgICAgJVtzYW1wbGVzXSwgICVbc2FtcGxlc10sICAgJVtpbmNyMV0gICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorCisgICAgICAgIC8qIGNhbGN1bGF0ZSB0d28gc2FtcGxlcyBhdCB0aGUgc2FtZSB0aW1lIHRvIGF2b2lkIG9uZSBtZW1vcnkKKyAgICAgICAgICAgYWNjZXNzIHBlciB0d28gc2FtcGxlICovCisKKyAgICAgICAgImZmX21wYWRzcF9hcHBseV93aW5kb3dfbG9vcCU9OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMV0sICAgICAgMCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4yXSwgICAgICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjNdLCAgICAgIDAoJVt3Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNF0sICAgICAgNjQqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW41XSwgICAgICA2NCo0KCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjZdLCAgICAgIDY0KjQoJVt3Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW3N1bV0sICAgICAgJVtpbjFdLCAgICAgICAlW2luMl0gICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgICVbc3VtMl0sICAgICAlW2luMl0sICAgICAgICVbaW4zXSAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjFdLCAgICAgIDEyOCo0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMl0sICAgICAgMTI4KjQoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgICVbc3VtXSwgICAgICAlW3N1bV0sICAgICAgICVbaW40XSwgJVtpbjVdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tYWRkLnMgJVtzdW0yXSwgICAgICVbc3VtMl0sICAgICAgJVtpbjVdLCAlW2luNl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luM10sICAgICAgMTI4KjQoJVt3Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW40XSwgICAgICAxOTIqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjFdLCAlW2luMl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNV0sICAgICAgMTkyKjQoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW42XSwgICAgICAxOTIqNCglW3cyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW0yXSwgICAgICVbc3VtMl0sICAgICAgJVtpbjJdLCAlW2luM10gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMV0sICAgICAgMjU2KjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4yXSwgICAgICAyNTYqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjRdLCAlW2luNV0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW3N1bTJdLCAgICAgJVtzdW0yXSwgICAgICAlW2luNV0sICVbaW42XSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4zXSwgICAgICAyNTYqNCglW3cyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjRdLCAgICAgIDMyMCo0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICAlW3N1bV0sICAgICAgJVtzdW1dLCAgICAgICAlW2luMV0sICVbaW4yXSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW41XSwgICAgICAzMjAqNCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjZdLCAgICAgIDMyMCo0KCVbdzJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW3N1bTJdLCAgICAgJVtzdW0yXSwgICAgICAlW2luMl0sICVbaW4zXSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4xXSwgICAgICAzODQqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjJdLCAgICAgIDM4NCo0KCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICAlW3N1bV0sICAgICAgJVtzdW1dLCAgICAgICAlW2luNF0sICVbaW41XSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbc3VtMl0sICAgICAlW3N1bTJdLCAgICAgICVbaW41XSwgJVtpbjZdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjNdLCAgICAgIDM4NCo0KCVbdzJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNF0sICAgICAgNDQ4KjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgICVbc3VtXSwgICAgICAlW3N1bV0sICAgICAgICVbaW4xXSwgJVtpbjJdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjVdLCAgICAgIDQ0OCo0KCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNl0sICAgICAgNDQ4KjQoJVt3Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbc3VtMl0sICAgICAlW3N1bTJdLCAgICAgICVbaW4yXSwgJVtpbjNdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjRdLCAlW2luNV0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMV0sICAgICAgMzIqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4yXSwgICAgICAwKCVbcDJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW0yXSwgICAgICVbc3VtMl0sICAgICAgJVtpbjVdLCAlW2luNl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luM10sICAgICAgMzIqNCglW3cyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW40XSwgICAgICA5Nio0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjVdLCAgICAgIDY0KjQoJVtwMl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW3N1bV0sICAgICAgJVtzdW1dLCAgICAgICAlW2luMV0sICVbaW4yXSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW42XSwgICAgICA5Nio0KCVbdzJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW0yXSwgICAgICVbc3VtMl0sICAgICAgJVtpbjJdLCAlW2luM10gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMV0sICAgICAgMTYwKjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbc3VtXSwgICAgICAlW3N1bV0sICAgICAgICVbaW40XSwgJVtpbjVdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjJdLCAgICAgIDEyOCo0KCVbcDJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW3N1bTJdLCAgICAgJVtzdW0yXSwgICAgICAlW2luNV0sICVbaW42XSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4zXSwgICAgICAxNjAqNCglW3cyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjRdLCAgICAgIDIyNCo0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNV0sICAgICAgMTkyKjQoJVtwMl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbc3VtXSwgICAgICAlW3N1bV0sICAgICAgICVbaW4xXSwgJVtpbjJdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjZdLCAgICAgIDIyNCo0KCVbdzJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW3N1bTJdLCAgICAgJVtzdW0yXSwgICAgICAlW2luMl0sICVbaW4zXSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4xXSwgICAgICAyODgqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjRdLCAlW2luNV0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMl0sICAgICAgMjU2KjQoJVtwMl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbc3VtMl0sICAgICAlW3N1bTJdLCAgICAgICVbaW41XSwgJVtpbjZdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjNdLCAgICAgIDI4OCo0KCVbdzJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNF0sICAgICAgMzUyKjQoJVt3XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW41XSwgICAgICAzMjAqNCglW3AyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjFdLCAlW2luMl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNl0sICAgICAgMzUyKjQoJVt3Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbc3VtMl0sICAgICAlW3N1bTJdLCAgICAgICVbaW4yXSwgJVtpbjNdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjFdLCAgICAgIDQxNio0KCVbd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW3N1bV0sICAgICAgJVtzdW1dLCAgICAgICAlW2luNF0sICVbaW41XSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4yXSwgICAgICAzODQqNCglW3AyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW0yXSwgICAgICVbc3VtMl0sICAgICAgJVtpbjVdLCAlW2luNl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luM10sICAgICAgNDE2KjQoJVt3Ml0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW40XSwgICAgICA0ODAqNCglW3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjVdLCAgICAgIDQ0OCo0KCVbcDJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW3N1bV0sICAgICAgJVtzdW1dLCAgICAgICAlW2luMV0sICVbaW4yXSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW42XSwgICAgICA0ODAqNCglW3cyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW0yXSwgICAgICVbc3VtMl0sICAgICAgJVtpbjJdLCAlW2luM10gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkaXUgICAlW3ddLCAgICAgICAgJVt3XSwgICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbc3VtXSwgICAgICAlW3N1bV0sICAgICAgICVbaW40XSwgJVtpbjVdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZGl1ICAgJVt3Ml0sICAgICAgICVbdzJdLCAgICAgICAgLTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW3N1bTJdLCAgICAgJVtzdW0yXSwgICAgICAlW2luNV0sICVbaW42XSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGR1ICAgICVbal0sICAgICAgICAlW2pdLCAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZGl1ICAgJVtwXSwgICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW3N1bV0sICAgICAgMCglW3NhbXBsZXNdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGRpdSAgICVbcDJdLCAgICAgICAtNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtzdW0yXSwgICAgIDAoJVtzYW1wbGVzMl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkdSAgICAlW3NhbXBsZXNdLCAgJVtzYW1wbGVzXSwgICAlW2luY3IxXSAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWJ1ICAgICVbc2FtcGxlczJdLCAlW3NhbXBsZXMyXSwgICVbaW5jcjFdICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImJuZSAgICAgJVtqXSwgICAgICAgIDY0LCAgICAgICAgICAgZmZfbXBhZHNwX2FwcGx5X3dpbmRvd19sb29wJT0gICBcdFxuIgorCisgICAgICAgICJsd2MxICAgICVbaW4xXSwgICAgICA0OCo0KCVbd2luZG93XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjJdLCAgICAgIDMyKjQoJVtzeW50aF9idWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luM10sICAgICAgMTEyKjQoJVt3aW5kb3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW40XSwgICAgICA5Nio0KCVbc3ludGhfYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjVdLCAgICAgIDE3Nio0KCVbd2luZG93XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNl0sICAgICAgMTYwKjQoJVtzeW50aF9idWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgICVbc3VtXSwgICAgICAlW2luMV0sICAgICAgICVbaW4yXSAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjddLCAgICAgIDI0MCo0KCVbd2luZG93XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luOF0sICAgICAgMjI0KjQoJVtzeW50aF9idWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4xXSwgICAgICAzMDQqNCglW3dpbmRvd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tYWRkLnMgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjNdLCAlW2luNF0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMl0sICAgICAgMjg4KjQoJVtzeW50aF9idWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4zXSwgICAgICAzNjgqNCglW3dpbmRvd10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjRdLCAgICAgIDM1Mio0KCVbc3ludGhfYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW3N1bV0sICAgICAgJVtzdW1dLCAgICAgICAlW2luNV0sICVbaW42XSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbc3VtXSwgICAgICAlW3N1bV0sICAgICAgICVbaW43XSwgJVtpbjhdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjVdLCAgICAgIDQzMio0KCVbd2luZG93XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNl0sICAgICAgNDE2KjQoJVtzeW50aF9idWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbc3VtXSwgICAgICAlW3N1bV0sICAgICAgICVbaW4xXSwgJVtpbjJdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjddLCAgICAgIDQ5Nio0KCVbd2luZG93XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luOF0sICAgICAgNDgwKjQoJVtzeW50aF9idWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbc3VtXSwgICAgICAlW3N1bV0sICAgICAgICVbaW4zXSwgJVtpbjRdICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtzdW1dLCAgICAgICVbc3VtXSwgICAgICAgJVtpbjVdLCAlW2luNl0gICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibm1zdWIucyAlW3N1bV0sICAgICAgJVtzdW1dLCAgICAgICAlW2luN10sICVbaW44XSAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbc3VtXSwgICAgICAwKCVbc2FtcGxlc10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKworICAgICAgICA6IFtzdW1dICI9JmYiIChzdW0pLCBbc3VtMl0gIj0mZiIgKHN1bTIpLAorICAgICAgICAgIFt3Ml0gIj0mciIgKHcyKSwgICBbd10gIj0mciIgKHcpLAorICAgICAgICAgIFtwXSAiPSZyIiAocCksIFtwMl0gIj0mciIgKHAyKSwgW2pdICI9JnIiIChqKSwKKyAgICAgICAgICBbc2FtcGxlc10gIityIiAoc2FtcGxlcyksIFtzYW1wbGVzMl0gIj0mciIgKHNhbXBsZXMyKSwKKyAgICAgICAgICBbaW4xXSAiPSZmIiAoaW4xKSwgW2luMl0gIj0mZiIgKGluMiksCisgICAgICAgICAgW2luM10gIj0mZiIgKGluMyksIFtpbjRdICI9JmYiIChpbjQpLAorICAgICAgICAgIFtpbjVdICI9JmYiIChpbjUpLCBbaW42XSAiPSZmIiAoaW42KSwKKyAgICAgICAgICBbaW43XSAiPSZmIiAoaW43KSwgW2luOF0gIj0mZiIgKGluOCksCisgICAgICAgICAgW3Rfc2FtcGxlXSAiPSZyIiAodF9zYW1wbGUpCisgICAgICAgIDogW3N5bnRoX2J1Zl0gInIiIChzeW50aF9idWYpLCBbd2luZG93XSAiciIgKHdpbmRvdyksCisgICAgICAgICAgW2RpdGhlcl9zdGF0ZV0gInIiIChkaXRoZXJfc3RhdGUpLCBbaW5jcjFdICJyIiAoaW5jcjEpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorCitzdGF0aWMgdm9pZCBmZl9kY3QzMl9taXBzX2Zsb2F0KGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICp0YWIpCit7CisgICAgZmxvYXQgdmFsMCAsIHZhbDEgLCB2YWwyICwgdmFsMyAsIHZhbDQgLCB2YWw1ICwgdmFsNiAsIHZhbDcsCisgICAgICAgICAgdmFsOCAsIHZhbDkgLCB2YWwxMCwgdmFsMTEsIHZhbDEyLCB2YWwxMywgdmFsMTQsIHZhbDE1LAorICAgICAgICAgIHZhbDE2LCB2YWwxNywgdmFsMTgsIHZhbDE5LCB2YWwyMCwgdmFsMjEsIHZhbDIyLCB2YWwyMywKKyAgICAgICAgICB2YWwyNCwgdmFsMjUsIHZhbDI2LCB2YWwyNywgdmFsMjgsIHZhbDI5LCB2YWwzMCwgdmFsMzE7CisgICAgZmxvYXQgZlRtcDEsIGZUbXAyLCBmVG1wMywgZlRtcDQsIGZUbXA1LCBmVG1wNiwgZlRtcDcsIGZUbXA4LAorICAgICAgICAgIGZUbXA5LCBmVG1wMTAsIGZUbXAxMTsKKworICAgIC8qKgorICAgICogaW5zdHJ1Y3Rpb25zIGFyZSBzY2hlZHVsZWQgdG8gbWluaW1pemUgcGlwZWxpbmUgc3RhbGwuCisgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImx3YzEgICAgICAgJVtmVG1wMV0sICAgICAgIDAqNCglW3RhYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW2ZUbXAyXSwgICAgICAgMzEqNCglW3RhYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbZlRtcDNdLCAgICAgICAxNSo0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICAgJVtmVG1wNF0sICAgICAgIDE2KjQoJVt0YWJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkucyAgICAgICAlW2ZUbXA3XSwgICAgICAgMC41MDI0MTkyODYxODgxNTU3MDU1MSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbZlRtcDVdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW2ZUbXA2XSwgICAgICAgJVtmVG1wM10sICAgICAgICVbZlRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDldLCAgICAgICAlW2ZUbXAzXSwgICAgICAgJVtmVG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wMTBdLCAgICAgIDAuNTAwNjAyOTk4MjM1MTk2MzAxMzQgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkucyAgICAgICAlW2ZUbXAxMV0sICAgICAgMTAuMTkwMDA4MTIzNTQ4MDU2ODExNTAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwwXSwgICAgICAgICVbZlRtcDVdLCAgICAgICAlW2ZUbXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW3ZhbDE1XSwgICAgICAgJVtmVG1wNV0sICAgICAgICVbZlRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbZlRtcDFdLCAgICAgICA3KjQoJVt0YWJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICAgJVtmVG1wMl0sICAgICAgIDI0KjQoJVt0YWJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICAgICAlW3ZhbDE2XSwgICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDldLCAgICVbZlRtcDExXSAgIFxuXHQiCisgICAgICAgICJubXN1Yi5zICAgICVbdmFsMzFdLCAgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wOV0sICAgJVtmVG1wMTFdICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwxNV0sICAgICAgICVbdmFsMTVdLCAgICAgICAlW2ZUbXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW2ZUbXAzXSwgICAgICAgOCo0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbZlRtcDRdLCAgICAgICAyMyo0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVtmVG1wNV0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDMxXSwgICAgICAgJVt2YWwzMV0sICAgICAgICVbZlRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVtmVG1wNl0sICAgICAgICVbZlRtcDNdLCAgICAgICAlW2ZUbXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA5XSwgICAgICAgJVtmVG1wM10sICAgICAgICVbZlRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaS5zICAgICAgICVbZlRtcDddLCAgICAgICA1LjEwMTE0ODYxODY4OTE2Mzg1ODAyICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wMTBdLCAgICAgIDAuNjc0ODA4MzQxNDU1MDA1NzQ2MDIgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkucyAgICAgICAlW2ZUbXAxMV0sICAgICAgMC43NDQ1MzYyNzEwMDIyOTg0NDk3NyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsN10sICAgICAgICAlW2ZUbXA1XSwgICAgICAgJVtmVG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVt2YWw4XSwgICAgICAgICVbZlRtcDVdLCAgICAgICAlW2ZUbXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaS5zICAgICAgICVbZlRtcDFdLCAgICAgICAwLjUwOTc5NTU3OTEwNDE1OTE2ODk0ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wMl0sICAgICAgICVbdmFsMF0sICAgICAgICAlW3ZhbDddICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDhdLCAgICAgICAgJVt2YWw4XSwgICAgICAgICVbZlRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgICVbdmFsMjNdLCAgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wOV0sICAgJVtmVG1wMTFdICAgXG5cdCIKKyAgICAgICAgIm5tc3ViLnMgICAgJVt2YWwyNF0sICAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXA5XSwgICAlW2ZUbXAxMV0gICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDBdLCAgICAgICAgJVt2YWwwXSwgICAgICAgICVbdmFsN10gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsN10sICAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wMl0sICAgICAgICVbdmFsMTVdLCAgICAgICAlW3ZhbDhdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDhdLCAgICAgICAgJVt2YWwxNV0sICAgICAgICVbdmFsOF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMjRdLCAgICAgICAlW3ZhbDI0XSwgICAgICAgJVtmVG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wM10sICAgICAgICVbdmFsMTZdLCAgICAgICAlW3ZhbDIzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDE2XSwgICAgICAgJVt2YWwxNl0sICAgICAgICVbdmFsMjNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMTVdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wNF0sICAgICAgICVbdmFsMzFdLCAgICAgICAlW3ZhbDI0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDIzXSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMjRdLCAgICAgICAlW3ZhbDMxXSwgICAgICAgJVt2YWwyNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwzMV0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXA0XSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW2ZUbXAxXSAgIj0mZiIgKGZUbXAxKSwgIFtmVG1wMl0gIj0mZiIgKGZUbXAyKSwgW2ZUbXAzXSAiPSZmIiAoZlRtcDMpLAorICAgICAgICAgIFtmVG1wNF0gICI9JmYiIChmVG1wNCksICBbZlRtcDVdICI9JmYiIChmVG1wNSksIFtmVG1wNl0gIj0mZiIgKGZUbXA2KSwKKyAgICAgICAgICBbZlRtcDddICAiPSZmIiAoZlRtcDcpLCAgW2ZUbXA4XSAiPSZmIiAoZlRtcDgpLCBbZlRtcDldICI9JmYiIChmVG1wOSksCisgICAgICAgICAgW2ZUbXAxMF0gIj0mZiIgKGZUbXAxMCksIFtmVG1wMTFdICI9JmYiIChmVG1wMTEpLAorICAgICAgICAgIFt2YWwwXSAgIj1mIiAodmFsMCksICBbdmFsN10gICI9ZiIgKHZhbDcpLAorICAgICAgICAgIFt2YWw4XSAgIj1mIiAodmFsOCksICBbdmFsMTVdICI9ZiIgKHZhbDE1KSwKKyAgICAgICAgICBbdmFsMTZdICI9ZiIgKHZhbDE2KSwgW3ZhbDIzXSAiPWYiICh2YWwyMyksCisgICAgICAgICAgW3ZhbDI0XSAiPWYiICh2YWwyNCksIFt2YWwzMV0gIj1mIiAodmFsMzEpCisgICAgICAgIDogW3RhYl0gInIiICh0YWIpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsd2MxICAgICAgICVbZlRtcDFdLCAgICAgICAzKjQoJVt0YWJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICAgJVtmVG1wMl0sICAgICAgIDI4KjQoJVt0YWJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW2ZUbXAzXSwgICAgICAgMTIqNCglW3RhYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbZlRtcDRdLCAgICAgICAxOSo0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wN10sICAgICAgIDAuNjQ2ODIxNzgzMzU5OTkwMTI5NTQgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW2ZUbXA1XSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVtmVG1wNl0sICAgICAgICVbZlRtcDNdLCAgICAgICAlW2ZUbXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA5XSwgICAgICAgJVtmVG1wM10sICAgICAgICVbZlRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaS5zICAgICAgICVbZlRtcDEwXSwgICAgICAwLjUzMTA0MjU5MTA4OTc4NDE3NDQ3ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wMTFdLCAgICAgIDEuNDg0MTY0NjE2MzE0MTY2Mjc3MjQgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsM10sICAgICAgICAlW2ZUbXA1XSwgICAgICAgJVtmVG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVt2YWwxMl0sICAgICAgICVbZlRtcDVdLCAgICAgICAlW2ZUbXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW2ZUbXAxXSwgICAgICAgNCo0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbZlRtcDJdLCAgICAgICAyNyo0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgICAgJVt2YWwxOV0sICAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXA5XSwgICAlW2ZUbXAxMV0gICBcblx0IgorICAgICAgICAibm1zdWIucyAgICAlW3ZhbDI4XSwgICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDldLCAgICVbZlRtcDExXSAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMTJdLCAgICAgICAlW3ZhbDEyXSwgICAgICAgJVtmVG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICAgJVtmVG1wM10sICAgICAgIDExKjQoJVt0YWJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW2ZUbXA0XSwgICAgICAgMjAqNCglW3RhYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbZlRtcDVdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwyOF0sICAgICAgICVbdmFsMjhdLCAgICAgICAlW2ZUbXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaS5zICAgICAgICVbZlRtcDddLCAgICAgICAwLjc4ODE1NDYyMzQ1MTI1MDIyNDczICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVtmVG1wNl0sICAgICAgICVbZlRtcDNdLCAgICAgICAlW2ZUbXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA5XSwgICAgICAgJVtmVG1wM10sICAgICAgICVbZlRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaS5zICAgICAgICVbZlRtcDEwXSwgICAgICAwLjU1MzEwMzg5NjAzNDQ0NDUyNzgyICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wMTFdLCAgICAgIDEuMTY5NDM5OTMzNDMyODg0OTU1MTUgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsNF0sICAgICAgICAlW2ZUbXA1XSwgICAgICAgJVtmVG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVt2YWwxMV0sICAgICAgICVbZlRtcDVdLCAgICAgICAlW2ZUbXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkucyAgICAgICAlW2ZUbXAxXSwgICAgICAgMi41NjI5MTU0NDc3NDE1MDYxNzg4MSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgICVbdmFsMjBdLCAgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wOV0sICAgJVtmVG1wMTFdICAgXG5cdCIKKyAgICAgICAgIm5tc3ViLnMgICAgJVt2YWwyN10sICAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXA5XSwgICAlW2ZUbXAxMV0gICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDExXSwgICAgICAgJVt2YWwxMV0sICAgICAgICVbZlRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDJdLCAgICAgICAlW3ZhbDNdLCAgICAgICAgJVt2YWw0XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwzXSwgICAgICAgICVbdmFsM10sICAgICAgICAlW3ZhbDRdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA0XSwgICAgICAgJVt2YWwxOV0sICAgICAgICVbdmFsMjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMjddLCAgICAgICAlW3ZhbDI3XSwgICAgICAgJVtmVG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wM10sICAgICAgICVbdmFsMTJdLCAgICAgICAlW3ZhbDExXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDRdLCAgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMTFdLCAgICAgICAlW3ZhbDEyXSwgICAgICAgJVt2YWwxMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwxOV0sICAgICAgICVbdmFsMTldLCAgICAgICAlW3ZhbDIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDIwXSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMTJdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wMl0sICAgICAgICVbdmFsMjhdLCAgICAgICAlW3ZhbDI3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDI3XSwgICAgICAgJVt2YWwyOF0sICAgICAgICVbdmFsMjddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMjhdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFtmVG1wMV0gICI9JmYiIChmVG1wMSksICBbZlRtcDJdICAiPSZmIiAoZlRtcDIpLCBbZlRtcDNdICI9JmYiIChmVG1wMyksCisgICAgICAgICAgW2ZUbXA0XSAgIj0mZiIgKGZUbXA0KSwgIFtmVG1wNV0gICI9JmYiIChmVG1wNSksIFtmVG1wNl0gIj0mZiIgKGZUbXA2KSwKKyAgICAgICAgICBbZlRtcDddICAiPSZmIiAoZlRtcDcpLCAgW2ZUbXA4XSAgIj0mZiIgKGZUbXA4KSwgW2ZUbXA5XSAiPSZmIiAoZlRtcDkpLAorICAgICAgICAgIFtmVG1wMTBdICI9JmYiIChmVG1wMTApLCBbZlRtcDExXSAiPSZmIiAoZlRtcDExKSwKKyAgICAgICAgICBbdmFsM10gICI9ZiIgKHZhbDMpLCAgW3ZhbDRdICAiPWYiICh2YWw0KSwKKyAgICAgICAgICBbdmFsMTFdICI9ZiIgKHZhbDExKSwgW3ZhbDEyXSAiPWYiICh2YWwxMiksCisgICAgICAgICAgW3ZhbDE5XSAiPWYiICh2YWwxOSksIFt2YWwyMF0gIj1mIiAodmFsMjApLAorICAgICAgICAgIFt2YWwyN10gIj1mIiAodmFsMjcpLCBbdmFsMjhdICI9ZiIgKHZhbDI4KQorICAgICAgICA6IFt0YWJdICJyIiAodGFiKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibGkucyAgICAgICAlW2ZUbXAxXSwgICAgICAgMC41NDExOTYxMDAxNDYxOTY5ODQzOSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDJdLCAgICAgICAlW3ZhbDBdLCAgICAgICAgJVt2YWwzXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwwXSwgICAgICAgICVbdmFsMF0sICAgICAgICAlW3ZhbDNdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXAzXSwgICAgICAgJVt2YWw3XSwgICAgICAgICVbdmFsNF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsNF0sICAgICAgICAlW3ZhbDddLCAgICAgICAgJVt2YWw0XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wNF0sICAgICAgICVbdmFsOF0sICAgICAgICAlW3ZhbDExXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDNdLCAgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsOF0sICAgICAgICAlW3ZhbDhdLCAgICAgICAgJVt2YWwxMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWw3XSwgICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXAyXSwgICAgICAgJVt2YWwxNV0sICAgICAgICVbdmFsMTJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMTFdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwxMl0sICAgICAgICVbdmFsMTVdLCAgICAgICAlW3ZhbDEyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDE1XSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbdmFsMF0gICIrZiIgKHZhbDApLCAgIFt2YWwzXSAiK2YiICh2YWwzKSwKKyAgICAgICAgICBbdmFsNF0gICIrZiIgKHZhbDQpLCAgIFt2YWw3XSAiK2YiICh2YWw3KSwKKyAgICAgICAgICBbdmFsOF0gICIrZiIgKHZhbDgpLCAgIFt2YWwxMV0gIitmIiAodmFsMTEpLAorICAgICAgICAgIFt2YWwxMl0gIitmIiAodmFsMTIpLCAgW3ZhbDE1XSAiK2YiICh2YWwxNSksCisgICAgICAgICAgW2ZUbXAxXSAiPWYiICAoZlRtcDEpLCBbZlRtcDJdICI9JmYiIChmVG1wMiksCisgICAgICAgICAgW2ZUbXAzXSAiPSZmIiAoZlRtcDMpLCBbZlRtcDRdICI9JmYiIChmVG1wNCkKKyAgICAgICAgOgorICAgICk7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wMl0sICAgICAgICVbdmFsMTZdLCAgICAgICAlW3ZhbDE5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDE2XSwgICAgICAgJVt2YWwxNl0sICAgICAgICVbdmFsMTldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDNdLCAgICAgICAlW3ZhbDIzXSwgICAgICAgJVt2YWwyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwyMF0sICAgICAgICVbdmFsMjNdLCAgICAgICAlW3ZhbDIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA0XSwgICAgICAgJVt2YWwyNF0sICAgICAgICVbdmFsMjddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMTldLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwyNF0sICAgICAgICVbdmFsMjRdLCAgICAgICAlW3ZhbDI3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDIzXSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDJdLCAgICAgICAlW3ZhbDMxXSwgICAgICAgJVt2YWwyOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwyN10sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDI4XSwgICAgICAgJVt2YWwzMV0sICAgICAgICVbdmFsMjhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMzFdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFtmVG1wMl0gIj0mZiIgKGZUbXAyKSwgW2ZUbXAzXSAiPSZmIiAoZlRtcDMpLCBbZlRtcDRdICI9JmYiIChmVG1wNCksCisgICAgICAgICAgW3ZhbDE2XSAiK2YiICh2YWwxNiksIFt2YWwxOV0gIitmIiAodmFsMTkpLCBbdmFsMjBdICIrZiIgKHZhbDIwKSwKKyAgICAgICAgICBbdmFsMjNdICIrZiIgKHZhbDIzKSwgW3ZhbDI0XSAiK2YiICh2YWwyNCksIFt2YWwyN10gIitmIiAodmFsMjcpLAorICAgICAgICAgIFt2YWwyOF0gIitmIiAodmFsMjgpLCBbdmFsMzFdICIrZiIgKHZhbDMxKQorICAgICAgICA6IFtmVG1wMV0gImYiIChmVG1wMSkKKyAgICApOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsd2MxICAgICAgICVbZlRtcDFdLCAgICAgICAxKjQoJVt0YWJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICAgJVtmVG1wMl0sICAgICAgIDMwKjQoJVt0YWJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW2ZUbXAzXSwgICAgICAgMTQqNCglW3RhYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbZlRtcDRdLCAgICAgICAxNyo0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wN10sICAgICAgIDAuNTIyNDk4NjE0OTM5Njg4ODgwNjIgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW2ZUbXA1XSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVtmVG1wNl0sICAgICAgICVbZlRtcDNdLCAgICAgICAlW2ZUbXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA5XSwgICAgICAgJVtmVG1wM10sICAgICAgICVbZlRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaS5zICAgICAgICVbZlRtcDEwXSwgICAgICAwLjUwNTQ3MDk1OTg5NzU0MzY1OTk4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wMTFdLCAgICAgIDMuNDA3NjA4NDE4NDY4NzE4Nzg1NzAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMV0sICAgICAgICAlW2ZUbXA1XSwgICAgICAgJVtmVG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVt2YWwxNF0sICAgICAgICVbZlRtcDVdLCAgICAgICAlW2ZUbXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW2ZUbXAxXSwgICAgICAgNio0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbZlRtcDJdLCAgICAgICAyNSo0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgICAgJVt2YWwxN10sICAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXA5XSwgICAlW2ZUbXAxMV0gICBcblx0IgorICAgICAgICAibm1zdWIucyAgICAlW3ZhbDMwXSwgICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDldLCAgICVbZlRtcDExXSAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMTRdLCAgICAgICAlW3ZhbDE0XSwgICAgICAgJVtmVG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICAgJVtmVG1wM10sICAgICAgIDkqNCglW3RhYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW2ZUbXA0XSwgICAgICAgMjIqNCglW3RhYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbZlRtcDVdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwzMF0sICAgICAgICVbdmFsMzBdLCAgICAgICAlW2ZUbXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbZlRtcDZdLCAgICAgICAlW2ZUbXAzXSwgICAgICAgJVtmVG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wOV0sICAgICAgICVbZlRtcDNdLCAgICAgICAlW2ZUbXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkucyAgICAgICAlW2ZUbXA3XSwgICAgICAgMS43MjI0NDcwOTgyMzgzMzM5Mjc4MiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaS5zICAgICAgICVbZlRtcDEwXSwgICAgICAwLjYyMjUwNDEyMzAzNTY2NDgxNjE1ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wMTFdLCAgICAgIDAuODM5MzQ5NjQ1NDE1NTI3MDM4NzMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDZdLCAgICAgICAgJVtmVG1wNV0sICAgICAgICVbZlRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbdmFsOV0sICAgICAgICAlW2ZUbXA1XSwgICAgICAgJVtmVG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkucyAgICAgICAlW2ZUbXAxXSwgICAgICAgMC42MDEzNDQ4ODY5MzUwNDUyODA1NCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDJdLCAgICAgICAlW3ZhbDFdLCAgICAgICAgJVt2YWw2XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwxXSwgICAgICAgICVbdmFsMV0sICAgICAgICAlW3ZhbDZdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDldLCAgICAgICAgJVt2YWw5XSwgICAgICAgICVbZlRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgICVbdmFsMjJdLCAgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wOV0sICAgJVtmVG1wMTFdICAgXG5cdCIKKyAgICAgICAgIm5tc3ViLnMgICAgJVt2YWwyNV0sICAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXA5XSwgICAlW2ZUbXAxMV0gICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDZdLCAgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDJdLCAgICAgICAlW3ZhbDE0XSwgICAgICAgJVt2YWw5XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWw5XSwgICAgICAgICVbdmFsMTRdLCAgICAgICAlW3ZhbDldICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDI1XSwgICAgICAgJVt2YWwyNV0sICAgICAgICVbZlRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDNdLCAgICAgICAlW3ZhbDE3XSwgICAgICAgJVt2YWwyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwxN10sICAgICAgICVbdmFsMTddLCAgICAgICAlW3ZhbDIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDE0XSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDJdLCAgICAgICAlW3ZhbDMwXSwgICAgICAgJVt2YWwyNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwyMl0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDI1XSwgICAgICAgJVt2YWwzMF0sICAgICAgICVbdmFsMjVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMzBdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFtmVG1wMV0gICI9JmYiIChmVG1wMSksICBbZlRtcDJdICAiPSZmIiAoZlRtcDIpLCBbZlRtcDNdICI9JmYiIChmVG1wMyksCisgICAgICAgICAgW2ZUbXA0XSAgIj0mZiIgKGZUbXA0KSwgIFtmVG1wNV0gICI9JmYiIChmVG1wNSksIFtmVG1wNl0gIj0mZiIgKGZUbXA2KSwKKyAgICAgICAgICBbZlRtcDddICAiPSZmIiAoZlRtcDcpLCAgW2ZUbXA4XSAgIj0mZiIgKGZUbXA4KSwgW2ZUbXA5XSAiPSZmIiAoZlRtcDkpLAorICAgICAgICAgIFtmVG1wMTBdICI9JmYiIChmVG1wMTApLCBbZlRtcDExXSAiPSZmIiAoZlRtcDExKSwKKyAgICAgICAgICBbdmFsMV0gICI9ZiIgKHZhbDEpLCAgW3ZhbDZdICAiPWYiICh2YWw2KSwKKyAgICAgICAgICBbdmFsOV0gICI9ZiIgKHZhbDkpLCAgW3ZhbDE0XSAiPWYiICh2YWwxNCksCisgICAgICAgICAgW3ZhbDE3XSAiPWYiICh2YWwxNyksIFt2YWwyMl0gIj1mIiAodmFsMjIpLAorICAgICAgICAgIFt2YWwyNV0gIj1mIiAodmFsMjUpLCBbdmFsMzBdICI9ZiIgKHZhbDMwKQorICAgICAgICA6IFt0YWJdICJyIiAodGFiKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibHdjMSAgICAgICAlW2ZUbXAxXSwgICAgICAgMio0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbZlRtcDJdLCAgICAgICAyOSo0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICAgJVtmVG1wM10sICAgICAgIDEzKjQoJVt0YWJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW2ZUbXA0XSwgICAgICAgMTgqNCglW3RhYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaS5zICAgICAgICVbZlRtcDddLCAgICAgICAwLjU2Njk0NDAzNDgxNjM1NzcwMzY4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVtmVG1wNV0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbZlRtcDZdLCAgICAgICAlW2ZUbXAzXSwgICAgICAgJVtmVG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wOV0sICAgICAgICVbZlRtcDNdLCAgICAgICAlW2ZUbXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkucyAgICAgICAlW2ZUbXAxMF0sICAgICAgMC41MTU0NDczMDk5MjI2MjQ1NDY5NyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaS5zICAgICAgICVbZlRtcDExXSwgICAgICAyLjA1Nzc4MTAwOTk1MzQxMTU1MDg1ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDJdLCAgICAgICAgJVtmVG1wNV0sICAgICAgICVbZlRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbdmFsMTNdLCAgICAgICAlW2ZUbXA1XSwgICAgICAgJVtmVG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICAgJVtmVG1wMV0sICAgICAgIDUqNCglW3RhYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAgICAlW2ZUbXAyXSwgICAgICAgMjYqNCglW3RhYl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgICVbdmFsMThdLCAgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wOV0sICAgJVtmVG1wMTFdICAgXG5cdCIKKyAgICAgICAgIm5tc3ViLnMgICAgJVt2YWwyOV0sICAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXA5XSwgICAlW2ZUbXAxMV0gICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDEzXSwgICAgICAgJVt2YWwxM10sICAgICAgICVbZlRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgICVbZlRtcDNdLCAgICAgICAxMCo0KCVbdGFiXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICAgJVtmVG1wNF0sICAgICAgIDIxKjQoJVt0YWJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDI5XSwgICAgICAgJVt2YWwyOV0sICAgICAgICVbZlRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbZlRtcDVdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW2ZUbXA2XSwgICAgICAgJVtmVG1wM10sICAgICAgICVbZlRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDldLCAgICAgICAlW2ZUbXAzXSwgICAgICAgJVtmVG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wN10sICAgICAgIDEuMDYwNjc3Njg1OTkwMzQ3NDcxMzQgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkucyAgICAgICAlW2ZUbXAxMF0sICAgICAgMC41ODI5MzQ5NjgyMDYxMzM4NzM2NyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaS5zICAgICAgICVbZlRtcDExXSwgICAgICAwLjk3MjU2ODIzNzg2MTk2MDY5MzY5ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWw1XSwgICAgICAgICVbZlRtcDVdLCAgICAgICAlW2ZUbXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW3ZhbDEwXSwgICAgICAgJVtmVG1wNV0sICAgICAgICVbZlRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXA4XSwgICAgICAgJVtmVG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wMV0sICAgICAgIDAuODk5OTc2MjIzMTM2NDE1NzA0NjMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXAyXSwgICAgICAgJVt2YWwyXSwgICAgICAgICVbdmFsNV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMTBdLCAgICAgICAlW3ZhbDEwXSwgICAgICAgJVtmVG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgICAgJVt2YWwyMV0sICAgICAgICVbZlRtcDhdLCAgICAgICAlW2ZUbXA5XSwgICAlW2ZUbXAxMV0gICBcblx0IgorICAgICAgICAibm1zdWIucyAgICAlW3ZhbDI2XSwgICAgICAgJVtmVG1wOF0sICAgICAgICVbZlRtcDldLCAgICVbZlRtcDExXSAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMl0sICAgICAgICAlW3ZhbDJdLCAgICAgICAgJVt2YWw1XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWw1XSwgICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXAzXSwgICAgICAgJVt2YWwxM10sICAgICAgICVbdmFsMTBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMTBdLCAgICAgICAlW3ZhbDEzXSwgICAgICAgJVt2YWwxMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwyNl0sICAgICAgICVbdmFsMjZdLCAgICAgICAlW2ZUbXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA0XSwgICAgICAgJVt2YWwxOF0sICAgICAgICVbdmFsMjFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMThdLCAgICAgICAlW3ZhbDE4XSwgICAgICAgJVt2YWwyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwxM10sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXAyXSwgICAgICAgJVt2YWwyOV0sICAgICAgICVbdmFsMjZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMjZdLCAgICAgICAlW3ZhbDI5XSwgICAgICAgJVt2YWwyNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwyMV0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDI5XSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbZlRtcDFdICAiPSZmIiAoZlRtcDEpLCAgW2ZUbXAyXSAgIj0mZiIgKGZUbXAyKSwgW2ZUbXAzXSAiPSZmIiAoZlRtcDMpLAorICAgICAgICAgIFtmVG1wNF0gICI9JmYiIChmVG1wNCksICBbZlRtcDVdICAiPSZmIiAoZlRtcDUpLCBbZlRtcDZdICI9JmYiIChmVG1wNiksCisgICAgICAgICAgW2ZUbXA3XSAgIj0mZiIgKGZUbXA3KSwgIFtmVG1wOF0gICI9JmYiIChmVG1wOCksIFtmVG1wOV0gIj0mZiIgKGZUbXA5KSwKKyAgICAgICAgICBbZlRtcDEwXSAiPSZmIiAoZlRtcDEwKSwgW2ZUbXAxMV0gIj0mZiIgKGZUbXAxMSksCisgICAgICAgICAgW3ZhbDJdICAiPWYiICh2YWwyKSwgIFt2YWw1XSAgIj1mIiAodmFsNSksCisgICAgICAgICAgW3ZhbDEwXSAiPWYiICh2YWwxMCksIFt2YWwxM10gIj1mIiAodmFsMTMpLAorICAgICAgICAgIFt2YWwxOF0gIj1mIiAodmFsMTgpLCBbdmFsMjFdICI9ZiIgKHZhbDIxKSwKKyAgICAgICAgICBbdmFsMjZdICI9ZiIgKHZhbDI2KSwgW3ZhbDI5XSAiPWYiICh2YWwyOSkKKyAgICAgICAgOiBbdGFiXSAiciIgKHRhYikKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wMV0sICAgICAgIDEuMzA2NTYyOTY0ODc2Mzc2NTI3ODUgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXAyXSwgICAgICAgJVt2YWwxXSwgICAgICAgICVbdmFsMl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMV0sICAgICAgICAlW3ZhbDFdLCAgICAgICAgJVt2YWwyXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wM10sICAgICAgICVbdmFsNl0sICAgICAgICAlW3ZhbDVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDVdLCAgICAgICAgJVt2YWw2XSwgICAgICAgICVbdmFsNV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDRdLCAgICAgICAlW3ZhbDldLCAgICAgICAgJVt2YWwxMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwyXSwgICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDldLCAgICAgICAgJVt2YWw5XSwgICAgICAgICVbdmFsMTBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsNl0sICAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wMl0sICAgICAgICVbdmFsMTRdLCAgICAgICAlW3ZhbDEzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDEwXSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMTNdLCAgICAgICAlW3ZhbDE0XSwgICAgICAgJVt2YWwxM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwxNF0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW2ZUbXAxXSAiPWYiICAoZlRtcDEpLCBbZlRtcDJdICI9JmYiIChmVG1wMiksCisgICAgICAgICAgW2ZUbXAzXSAiPSZmIiAoZlRtcDMpLCBbZlRtcDRdICI9JmYiIChmVG1wNCksCisgICAgICAgICAgW3ZhbDFdICAiK2YiICh2YWwxKSwgIFt2YWwyXSAgIitmIiAodmFsMiksCisgICAgICAgICAgW3ZhbDVdICAiK2YiICh2YWw1KSwgIFt2YWw2XSAgIitmIiAodmFsNiksCisgICAgICAgICAgW3ZhbDldICAiK2YiICh2YWw5KSwgIFt2YWwxMF0gIitmIiAodmFsMTApLAorICAgICAgICAgIFt2YWwxM10gIitmIiAodmFsMTMpLCBbdmFsMTRdICIrZiIgKHZhbDE0KQorICAgICAgICA6CisgICAgKTsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXAyXSwgICAgICAgJVt2YWwxN10sICAgICAgICVbdmFsMThdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMTddLCAgICAgICAlW3ZhbDE3XSwgICAgICAgJVt2YWwxOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wM10sICAgICAgICVbdmFsMjJdLCAgICAgICAlW3ZhbDIxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDIxXSwgICAgICAgJVt2YWwyMl0sICAgICAgICVbdmFsMjFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDRdLCAgICAgICAlW3ZhbDI1XSwgICAgICAgJVt2YWwyNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwxOF0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDI1XSwgICAgICAgJVt2YWwyNV0sICAgICAgICVbdmFsMjZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMjJdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wMl0sICAgICAgICVbdmFsMzBdLCAgICAgICAlW3ZhbDI5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDI2XSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMjldLCAgICAgICAlW3ZhbDMwXSwgICAgICAgJVt2YWwyOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwzMF0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW2ZUbXAyXSAiPSZmIiAoZlRtcDIpLCBbZlRtcDNdICI9JmYiIChmVG1wMyksIFtmVG1wNF0gIj0mZiIgKGZUbXA0KSwKKyAgICAgICAgICBbdmFsMTddICIrZiIgKHZhbDE3KSwgW3ZhbDE4XSAiK2YiICh2YWwxOCksIFt2YWwyMV0gIitmIiAodmFsMjEpLAorICAgICAgICAgIFt2YWwyMl0gIitmIiAodmFsMjIpLCBbdmFsMjVdICIrZiIgKHZhbDI1KSwgW3ZhbDI2XSAiK2YiICh2YWwyNiksCisgICAgICAgICAgW3ZhbDI5XSAiK2YiICh2YWwyOSksIFt2YWwzMF0gIitmIiAodmFsMzApCisgICAgICAgIDogW2ZUbXAxXSAiZiIgKGZUbXAxKQorICAgICk7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImxpLnMgICAgICAgJVtmVG1wMV0sICAgICAgIDAuNzA3MTA2NzgxMTg2NTQ3NTI0MzkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXAyXSwgICAgICAgJVt2YWwwXSwgICAgICAgICVbdmFsMV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMF0sICAgICAgICAlW3ZhbDBdLCAgICAgICAgJVt2YWwxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wM10sICAgICAgICVbdmFsM10sICAgICAgICAlW3ZhbDJdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDJdLCAgICAgICAgJVt2YWwzXSwgICAgICAgICVbdmFsMl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDRdLCAgICAgICAlW3ZhbDRdLCAgICAgICAgJVt2YWw1XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwxXSwgICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAgICAlW3ZhbDBdLCAgICAgICAgMCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsM10sICAgICAgICAlW2ZUbXAzXSwgICAgICAgJVtmVG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWw0XSwgICAgICAgICVbdmFsNF0sICAgICAgICAlW3ZhbDVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDVdLCAgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICAgICVbdmFsMV0sICAgICAgICAxNio0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wMl0sICAgICAgICVbdmFsN10sICAgICAgICAlW3ZhbDZdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDJdLCAgICAgICAgJVt2YWwyXSwgICAgICAgICVbdmFsM10gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICAgICVbdmFsM10sICAgICAgICAyNCo0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWw2XSwgICAgICAgICVbdmFsN10sICAgICAgICAlW3ZhbDZdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDddLCAgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICAgICVbdmFsMl0sICAgICAgICA4KjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWw2XSwgICAgICAgICVbdmFsNl0sICAgICAgICAlW3ZhbDddICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAgICAlW3ZhbDddLCAgICAgICAgMjgqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsNF0sICAgICAgICAlW3ZhbDRdLCAgICAgICAgJVt2YWw2XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWw2XSwgICAgICAgICVbdmFsNl0sICAgICAgICAlW3ZhbDVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDVdLCAgICAgICAgJVt2YWw1XSwgICAgICAgICVbdmFsN10gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICAgICVbdmFsNF0sICAgICAgICA0KjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICAgJVt2YWw1XSwgICAgICAgIDIwKjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAgICAlW3ZhbDZdLCAgICAgICAgMTIqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbZlRtcDFdICI9ZiIgIChmVG1wMSksIFtmVG1wMl0gIj0mZiIgKGZUbXAyKSwKKyAgICAgICAgICBbZlRtcDNdICI9JmYiIChmVG1wMyksIFtmVG1wNF0gIj0mZiIgKGZUbXA0KSwKKyAgICAgICAgICBbdmFsMF0gIitmIiAodmFsMCksIFt2YWwxXSAiK2YiICh2YWwxKSwKKyAgICAgICAgICBbdmFsMl0gIitmIiAodmFsMiksIFt2YWwzXSAiK2YiICh2YWwzKSwKKyAgICAgICAgICBbdmFsNF0gIitmIiAodmFsNCksIFt2YWw1XSAiK2YiICh2YWw1KSwKKyAgICAgICAgICBbdmFsNl0gIitmIiAodmFsNiksIFt2YWw3XSAiK2YiICh2YWw3KQorICAgICAgICA6IFtvdXRdICJyIiAob3V0KQorICAgICk7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wMl0sICAgICAgICVbdmFsOF0sICAgICAgICAlW3ZhbDldICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDhdLCAgICAgICAgJVt2YWw4XSwgICAgICAgICVbdmFsOV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDNdLCAgICAgICAlW3ZhbDExXSwgICAgICAgJVt2YWwxMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwxMF0sICAgICAgICVbdmFsMTFdLCAgICAgICAlW3ZhbDEwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA0XSwgICAgICAgJVt2YWwxMl0sICAgICAgICVbdmFsMTNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsOV0sICAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwxMl0sICAgICAgICVbdmFsMTJdLCAgICAgICAlW3ZhbDEzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDExXSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDJdLCAgICAgICAlW3ZhbDE1XSwgICAgICAgJVt2YWwxNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwxM10sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDE0XSwgICAgICAgJVt2YWwxNV0sICAgICAgICVbdmFsMTRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMTBdLCAgICAgICAlW3ZhbDEwXSwgICAgICAgJVt2YWwxMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwxNV0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDE0XSwgICAgICAgJVt2YWwxNF0sICAgICAgICVbdmFsMTVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMTJdLCAgICAgICAlW3ZhbDEyXSwgICAgICAgJVt2YWwxNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwxNF0sICAgICAgICVbdmFsMTRdLCAgICAgICAlW3ZhbDEzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDEzXSwgICAgICAgJVt2YWwxM10sICAgICAgICVbdmFsMTVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsOF0sICAgICAgICAlW3ZhbDhdLCAgICAgICAgJVt2YWwxMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwxMl0sICAgICAgICVbdmFsMTJdLCAgICAgICAlW3ZhbDEwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDEwXSwgICAgICAgJVt2YWwxMF0sICAgICAgICVbdmFsMTRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMTRdLCAgICAgICAlW3ZhbDE0XSwgICAgICAgJVt2YWw5XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWw5XSwgICAgICAgICVbdmFsOV0sICAgICAgICAlW3ZhbDEzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDEzXSwgICAgICAgJVt2YWwxM10sICAgICAgICVbdmFsMTFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMTFdLCAgICAgICAlW3ZhbDExXSwgICAgICAgJVt2YWwxNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICAgJVt2YWw4XSwgICAgICAgICAyKjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAgICAlW3ZhbDldLCAgICAgICAgMTgqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICAgICVbdmFsMTBdLCAgICAgICAxMCo0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICAgJVt2YWwxMV0sICAgICAgIDI2KjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAgICAlW3ZhbDEyXSwgICAgICAgIDYqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICAgICVbdmFsMTNdLCAgICAgICAyMio0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICAgJVt2YWwxNF0sICAgICAgIDE0KjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAgICAlW3ZhbDE1XSwgICAgICAgMzAqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbZlRtcDJdICI9JmYiIChmVG1wMiksIFtmVG1wM10gIj0mZiIgKGZUbXAzKSwgW2ZUbXA0XSAiPSZmIiAoZlRtcDQpLAorICAgICAgICAgIFt2YWw4XSAgIitmIiAodmFsOCksICBbdmFsOV0gICIrZiIgKHZhbDkpLCAgW3ZhbDEwXSAiK2YiICh2YWwxMCksCisgICAgICAgICAgW3ZhbDExXSAiK2YiICh2YWwxMSksIFt2YWwxMl0gIitmIiAodmFsMTIpLCBbdmFsMTNdICIrZiIgKHZhbDEzKSwKKyAgICAgICAgICBbdmFsMTRdICIrZiIgKHZhbDE0KSwgW3ZhbDE1XSAiK2YiICh2YWwxNSkKKyAgICAgICAgOiBbZlRtcDFdICJmIiAoZlRtcDEpLCBbb3V0XSAiciIgKG91dCkKKyAgICApOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDJdLCAgICAgICAlW3ZhbDE2XSwgICAgICAgJVt2YWwxN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwxNl0sICAgICAgICVbdmFsMTZdLCAgICAgICAlW3ZhbDE3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXAzXSwgICAgICAgJVt2YWwxOV0sICAgICAgICVbdmFsMThdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMThdLCAgICAgICAlW3ZhbDE5XSwgICAgICAgJVt2YWwxOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wNF0sICAgICAgICVbdmFsMjBdLCAgICAgICAlW3ZhbDIxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDE3XSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMjBdLCAgICAgICAlW3ZhbDIwXSwgICAgICAgJVt2YWwyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwxOV0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXAyXSwgICAgICAgJVt2YWwyM10sICAgICAgICVbdmFsMjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMjFdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwyMl0sICAgICAgICVbdmFsMjNdLCAgICAgICAlW3ZhbDIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDE4XSwgICAgICAgJVt2YWwxOF0sICAgICAgICVbdmFsMTldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMjNdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwyMl0sICAgICAgICVbdmFsMjJdLCAgICAgICAlW3ZhbDIzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDIwXSwgICAgICAgJVt2YWwyMF0sICAgICAgICVbdmFsMjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMjJdLCAgICAgICAlW3ZhbDIyXSwgICAgICAgJVt2YWwyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwyMV0sICAgICAgICVbdmFsMjFdLCAgICAgICAlW3ZhbDIzXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW2ZUbXAyXSAiPSZmIiAoZlRtcDIpLCBbZlRtcDNdICI9JmYiIChmVG1wMyksIFtmVG1wNF0gIj0mZiIgKGZUbXA0KSwKKyAgICAgICAgICBbdmFsMTZdICIrZiIgKHZhbDE2KSwgW3ZhbDE3XSAiK2YiICh2YWwxNyksIFt2YWwxOF0gIitmIiAodmFsMTgpLAorICAgICAgICAgIFt2YWwxOV0gIitmIiAodmFsMTkpLCBbdmFsMjBdICIrZiIgKHZhbDIwKSwgW3ZhbDIxXSAiK2YiICh2YWwyMSksCisgICAgICAgICAgW3ZhbDIyXSAiK2YiICh2YWwyMiksIFt2YWwyM10gIitmIiAodmFsMjMpCisgICAgICAgIDogW2ZUbXAxXSAiZiIgKGZUbXAxKQorICAgICk7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgInN1Yi5zICAgICAgJVtmVG1wMl0sICAgICAgICVbdmFsMjRdLCAgICAgICAlW3ZhbDI1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDI0XSwgICAgICAgJVt2YWwyNF0sICAgICAgICVbdmFsMjVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDNdLCAgICAgICAlW3ZhbDI3XSwgICAgICAgJVt2YWwyNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwyNl0sICAgICAgICVbdmFsMjddLCAgICAgICAlW3ZhbDI2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViLnMgICAgICAlW2ZUbXA0XSwgICAgICAgJVt2YWwyOF0sICAgICAgICVbdmFsMjldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucyAgICAgICVbdmFsMjVdLCAgICAgICAlW2ZUbXAxXSwgICAgICAgJVtmVG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwyOF0sICAgICAgICVbdmFsMjhdLCAgICAgICAlW3ZhbDI5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAgICAlW3ZhbDI3XSwgICAgICAgJVtmVG1wMV0sICAgICAgICVbZlRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIucyAgICAgICVbZlRtcDJdLCAgICAgICAlW3ZhbDMxXSwgICAgICAgJVt2YWwzMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwyOV0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDMwXSwgICAgICAgJVt2YWwzMV0sICAgICAgICVbdmFsMzBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMjZdLCAgICAgICAlW3ZhbDI2XSwgICAgICAgJVt2YWwyN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgICAgJVt2YWwzMV0sICAgICAgICVbZlRtcDFdLCAgICAgICAlW2ZUbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDMwXSwgICAgICAgJVt2YWwzMF0sICAgICAgICVbdmFsMzFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMjhdLCAgICAgICAlW3ZhbDI4XSwgICAgICAgJVt2YWwzMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwzMF0sICAgICAgICVbdmFsMzBdLCAgICAgICAlW3ZhbDI5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDI5XSwgICAgICAgJVt2YWwyOV0sICAgICAgICVbdmFsMzFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMjRdLCAgICAgICAlW3ZhbDI0XSwgICAgICAgJVt2YWwyOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwyOF0sICAgICAgICVbdmFsMjhdLCAgICAgICAlW3ZhbDI2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDI2XSwgICAgICAgJVt2YWwyNl0sICAgICAgICVbdmFsMzBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMzBdLCAgICAgICAlW3ZhbDMwXSwgICAgICAgJVt2YWwyNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICAgJVt2YWwyNV0sICAgICAgICVbdmFsMjVdLCAgICAgICAlW3ZhbDI5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAgICAlW3ZhbDI5XSwgICAgICAgJVt2YWwyOV0sICAgICAgICVbdmFsMjddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQucyAgICAgICVbdmFsMjddLCAgICAgICAlW3ZhbDI3XSwgICAgICAgJVt2YWwzMV0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFtmVG1wMl0gIj0mZiIgKGZUbXAyKSwgW2ZUbXAzXSAiPSZmIiAoZlRtcDMpLCBbZlRtcDRdICI9JmYiIChmVG1wNCksCisgICAgICAgICAgW3ZhbDI0XSAiK2YiICh2YWwyNCksIFt2YWwyNV0gIitmIiAodmFsMjUpLCBbdmFsMjZdICIrZiIgKHZhbDI2KSwKKyAgICAgICAgICBbdmFsMjddICIrZiIgKHZhbDI3KSwgW3ZhbDI4XSAiK2YiICh2YWwyOCksIFt2YWwyOV0gIitmIiAodmFsMjkpLAorICAgICAgICAgIFt2YWwzMF0gIitmIiAodmFsMzApLCBbdmFsMzFdICIrZiIgKHZhbDMxKQorICAgICAgICA6IFtmVG1wMV0gImYiIChmVG1wMSkKKyAgICApOworCisgICAgb3V0WyAxXSA9IHZhbDE2ICsgdmFsMjQ7CisgICAgb3V0WzE3XSA9IHZhbDE3ICsgdmFsMjU7CisgICAgb3V0WyA5XSA9IHZhbDE4ICsgdmFsMjY7CisgICAgb3V0WzI1XSA9IHZhbDE5ICsgdmFsMjc7CisgICAgb3V0WyA1XSA9IHZhbDIwICsgdmFsMjg7CisgICAgb3V0WzIxXSA9IHZhbDIxICsgdmFsMjk7CisgICAgb3V0WzEzXSA9IHZhbDIyICsgdmFsMzA7CisgICAgb3V0WzI5XSA9IHZhbDIzICsgdmFsMzE7CisgICAgb3V0WyAzXSA9IHZhbDI0ICsgdmFsMjA7CisgICAgb3V0WzE5XSA9IHZhbDI1ICsgdmFsMjE7CisgICAgb3V0WzExXSA9IHZhbDI2ICsgdmFsMjI7CisgICAgb3V0WzI3XSA9IHZhbDI3ICsgdmFsMjM7CisgICAgb3V0WyA3XSA9IHZhbDI4ICsgdmFsMTg7CisgICAgb3V0WzIzXSA9IHZhbDI5ICsgdmFsMTk7CisgICAgb3V0WzE1XSA9IHZhbDMwICsgdmFsMTc7CisgICAgb3V0WzMxXSA9IHZhbDMxOworfQorCitzdGF0aWMgdm9pZCBpbWRjdDM2X21pcHNfZmxvYXQoZmxvYXQgKm91dCwgZmxvYXQgKmJ1ZiwgZmxvYXQgKmluLCBmbG9hdCAqd2luKQoreworICAgIGZsb2F0IHQwLCB0MSwgdDIsIHQzLCBzMCwgczEsIHMyLCBzMzsKKyAgICBmbG9hdCB0bXBbMThdOworICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8KKyAgICBmbG9hdCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42OworICAgIGZsb2F0IG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDU7CisgICAgZmxvYXQgYzEsIGMyLCBjMywgYzQsIGM1LCBjNiwgYzcsIGM4LCBjOTsKKworICAgIC8qKgorICAgICogYWxsIGxvb3BzIGFyZSB1bnJvbGxlZCB0b3RhbGx5LCBhbmQgaW5zdHJ1Y3Rpb25zIGFyZSBzY2hlZHVsZWQgdG8KKyAgICAqIG1pbmltaXplIHBpcGVsaW5lIHN0YWxsLiBpbnN0cnVjdGlvbnMgb2YgdGhlIGZpcnN0IHR3byBsb29wcyBhcmUKKyAgICAqIHJlb3JnYW5pemVkLCBpbiBvcmRlciB0byBlbGltaW5hdGUgdW5uZWNlc3NhcnkgcmVhZGluZ3MgYW5kCisgICAgKiB3cml0aW5ncyBpbnRvIGFycmF5LiB2YWx1ZXMgZGVmaW5lZCBpbiBtYWNyb3MgYW5kIHRhYmxlcyBhcmUKKyAgICAqIGVsaW1pbmF0ZWQgLSB0aGV5IGFyZSBkaXJlY3RseSBsb2FkZWQgaW4gYXBwcm9wcmlhdGUgdmFyaWFibGVzCisgICAgKi8KKworICAgIC8qIGxvb3AgMSBhbmQgMiAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibHdjMSAgICVbaW4xXSwgIDE3KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMl0sICAxNio0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjNdLCAgMTUqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW40XSwgIDE0KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNV0sICAxMyo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjZdLCAgMTIqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbb3V0MV0sICVbaW4xXSwgICVbaW4yXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAlW291dDJdLCAlW2luMl0sICAlW2luM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVtvdXQzXSwgJVtpbjNdLCAgJVtpbjRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbb3V0NF0sICVbaW40XSwgICVbaW41XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAlW291dDVdLCAlW2luNV0sICAlW2luNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjFdLCAgMTEqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0Ml0sIDE2KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAlW291dDFdLCAlW291dDFdLCAlW291dDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQ0XSwgMTQqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbb3V0M10sICVbb3V0M10sICVbb3V0NV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMl0sICAxMCo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjNdLCAgOSo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0MV0sIDE3KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNF0sICA4KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQzXSwgMTUqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbb3V0MV0sICVbaW42XSwgICVbaW4xXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAlW291dDJdLCAlW2luMV0sICAlW2luMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVtvdXQzXSwgJVtpbjJdLCAgJVtpbjNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbb3V0NF0sICVbaW4zXSwgICVbaW40XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNV0sICA3KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQxXSwgMTIqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbb3V0NV0sICVbb3V0NV0sICVbb3V0Ml0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDNdLCAxMCo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVtvdXQyXSwgJVtvdXQyXSwgJVtvdXQ0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW42XSwgIDYqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMV0sICA1KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQ1XSwgMTMqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4yXSwgIDQqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDJdLCAxMSo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVtvdXQ1XSwgJVtpbjRdLCAgJVtpbjVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbb3V0MV0sICVbaW41XSwgICVbaW42XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAlW291dDJdLCAlW2luNl0sICAlW2luMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVtvdXQzXSwgJVtpbjFdLCAgJVtpbjJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4zXSwgIDMqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDVdLCA4KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVtvdXQ0XSwgJVtvdXQ0XSwgJVtvdXQxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0Ml0sIDYqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAlW291dDFdLCAlW291dDFdLCAlW291dDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjRdLCAgMio0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW41XSwgIDEqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDRdLCA5KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjZdLCAgMCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0MV0sIDcqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAlW291dDRdLCAlW2luMl0sICAlW2luM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVtvdXQ1XSwgJVtpbjNdLCAgJVtpbjRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbb3V0MV0sICVbaW40XSwgICVbaW41XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAlW291dDJdLCAlW2luNV0sICAlW2luNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQ0XSwgNCo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbb3V0M10sICVbb3V0M10sICVbb3V0NV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDFdLCAyKjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVtvdXQ1XSwgJVtvdXQ1XSwgJVtvdXQyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0Ml0sIDEqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDNdLCA1KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQ1XSwgMyo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorCisgICAgICAgIDogW2luMV0gIj0mZiIgKGluMSksIFtpbjJdICI9JmYiIChpbjIpLAorICAgICAgICAgIFtpbjNdICI9JmYiIChpbjMpLCBbaW40XSAiPSZmIiAoaW40KSwKKyAgICAgICAgICBbaW41XSAiPSZmIiAoaW41KSwgW2luNl0gIj0mZiIgKGluNiksCisgICAgICAgICAgW291dDFdICI9JmYiIChvdXQxKSwgW291dDJdICI9JmYiIChvdXQyKSwKKyAgICAgICAgICBbb3V0M10gIj0mZiIgKG91dDMpLCBbb3V0NF0gIj0mZiIgKG91dDQpLAorICAgICAgICAgIFtvdXQ1XSAiPSZmIiAob3V0NSkKKyAgICAgICAgOiBbaW5dICJyIiAoaW4pCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworCisgICAgLyogbG9vcCAzICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsaS5zICAgICVbYzFdLCAgIDAuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMV0sICA4KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjJdLCAgMTYqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4zXSwgIDQqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNF0sICAwKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjVdLCAgMTIqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsaS5zICAgICVbYzJdLCAgIDAuOTM5NjkyNjIwNzg1OTA4Mzg0MDUgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICAlW3QyXSwgICAlW2luMV0sICAlW2luMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAgJVt0MF0sICAgJVtpbjFdLCAgJVtpbjNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsaS5zICAgICVbYzNdLCAgIC0wLjc2NjA0NDQ0MzExODk3ODAzNTIwICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICAlW3QzXSwgICAlW2luNF0sICAlW2luNV0sICVbYzFdICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAgJVt0MV0sICAgJVtpbjRdLCAgJVtpbjVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgICVbdDJdLCAgICVbdDJdLCAgICVbaW4zXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW3QwXSwgICAlW3QwXSwgICAlW2MyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImxpLnMgICAgJVtjNF0sICAgLTAuMTczNjQ4MTc3NjY2OTMwMzQ4ODUgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsaS5zICAgICVbYzVdLCAgIC0wLjg2NjAyNTQwMzc4NDQzODY0Njc2ICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibGkucyAgICAlW2M2XSwgICAwLjk4NDgwNzc1MzAxMjIwODA1OTM2ICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm5tc3ViLnMgJVtvdXQxXSwgJVt0MV0sICAgJVt0Ml0sICAlW2MxXSAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgICVbb3V0Ml0sICVbdDFdLCAgICVbdDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICAlW3QyXSwgICAlW2luMl0sICAlW2luM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAgJVt0MV0sICAgJVtpbjFdLCAgJVtpbjJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgICVbb3V0M10sICVbdDNdLCAgICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW291dDFdLCA2KjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQyXSwgMTYqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgICVbdDJdLCAgICVbdDJdLCAgICVbYzNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW3QxXSwgICAlW3QxXSwgICAlW2M0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAgJVtvdXQxXSwgJVt0M10sICAgJVt0MF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4xXSwgIDEwKjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMl0sICAxNCo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAgJVtvdXQzXSwgJVtvdXQzXSwgJVt0Ml0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgICVbb3V0Ml0sICVbdDNdLCAgICVbdDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICAlW291dDFdLCAlW291dDFdLCAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjNdLCAgMio0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW40XSwgIDYqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW291dDNdLCAxMCo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAgJVtvdXQyXSwgJVtvdXQyXSwgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbb3V0MV0sIDIqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICAlW291dDFdLCAlW2luMV0sICAlW2luMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAgJVt0Ml0sICAgJVtpbjFdLCAgJVtpbjNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgICVbdDNdLCAgICVbaW4xXSwgICVbaW4yXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW291dDJdLCAxNCo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImxpLnMgICAgJVtjN10sICAgLTAuMzQyMDIwMTQzMzI1NjY4NzMzMDQgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgICVbb3V0MV0sICVbb3V0MV0sICVbaW4zXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW3QyXSwgICAlW3QyXSwgICAlW2M2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVt0M10sICAgJVt0M10sICAgJVtjN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsaS5zICAgICVbYzhdLCAgIDAuODY2MDI1NDAzNzg0NDM4NjQ2NzYgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW3QwXSwgICAlW2luNF0sICAlW2M4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVtvdXQxXSwgJVtvdXQxXSwgJVtjNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgICVbdDFdLCAgICVbaW4yXSwgICVbaW4zXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibGkucyAgICAlW2M5XSwgICAtMC42NDI3ODc2MDk2ODY1MzkzMjYzMiAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAgJVtvdXQyXSwgJVt0Ml0sICAgJVt0M10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4xXSwgIDkqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW291dDFdLCA0KjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVt0MV0sICAgJVt0MV0sICAgJVtjOV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4yXSwgIDE3KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICAlW291dDJdLCAlW291dDJdLCAlW3QwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjNdLCAgNSo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW40XSwgIDEqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICAlW291dDNdLCAlW3QyXSwgICAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAgJVtvdXQxXSwgJVt0M10sICAgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbb3V0Ml0sIDAoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNV0sICAxMyo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAgJVt0Ml0sICAgJVtpbjFdLCAgJVtpbjJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgICVbb3V0M10sICVbb3V0M10sICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3ViLnMgICAlW291dDFdLCAlW291dDFdLCAlW3QwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAgJVt0MF0sICAgJVtpbjFdLCAgJVtpbjNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgICVbdDNdLCAgICVbaW40XSwgICVbaW41XSwgJVtjMV0gICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3ViLnMgICAlW3QyXSwgICAlW3QyXSwgICAlW2luM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQzXSwgMTIqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbb3V0MV0sIDgqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3ViLnMgICAlW3QxXSwgICAlW2luNF0sICAlW2luNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVt0MF0sICAgJVt0MF0sICAgJVtjMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJubXN1Yi5zICVbb3V0MV0sICVbdDFdLCAgICVbdDJdLCAgJVtjMV0gICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICAlW291dDJdLCAlW3QxXSwgICAlW3QyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAgJVt0Ml0sICAgJVtpbjJdLCAgJVtpbjNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgICVbdDFdLCAgICVbaW4xXSwgICVbaW4yXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3ViLnMgICAlW291dDNdLCAlW3QzXSwgICAlW3QwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQxXSwgNyo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbb3V0Ml0sIDE3KjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW3QyXSwgICAlW3QyXSwgICAlW2MzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVt0MV0sICAgJVt0MV0sICAgJVtjNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgICVbb3V0MV0sICVbdDNdLCAgICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luMV0sICAxMSo0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAgJVtpbjJdLCAgMTUqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgICVbb3V0M10sICVbb3V0M10sICVbdDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICAlW291dDJdLCAlW3QzXSwgICAlW3QyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAgJVtvdXQxXSwgJVtvdXQxXSwgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgICVbaW4zXSwgIDMqNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICAlW2luNF0sICA3KjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQzXSwgMTEqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgICVbb3V0Ml0sICVbb3V0Ml0sICVbdDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW291dDFdLCAzKjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAgJVtvdXQzXSwgJVtpbjFdLCAgJVtpbjJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgICVbdDJdLCAgICVbaW4xXSwgICVbaW4zXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3ViLnMgICAlW3QzXSwgICAlW2luMV0sICAlW2luMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQyXSwgMTUqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgICVbdDBdLCAgICVbaW40XSwgICVbYzhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3ViLnMgICAlW291dDNdLCAlW291dDNdLCAlW2luM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVt0Ml0sICAgJVt0Ml0sICAgJVtjNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgICVbdDNdLCAgICVbdDNdLCAgICVbYzddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICAlW3QxXSwgICAlW2luMl0sICAlW2luM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAgJVtvdXQzXSwgJVtvdXQzXSwgJVtjNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgICVbb3V0MV0sICVbdDJdLCAgICVbdDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICAlW3QxXSwgICAlW3QxXSwgICAlW2M5XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAgJVtvdXQzXSwgNSo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgICVbb3V0MV0sICVbb3V0MV0sICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICAlW291dDJdLCAlW3QyXSwgICAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAgJVtvdXQzXSwgJVt0M10sICAgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbb3V0MV0sIDEqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3ViLnMgICAlW291dDJdLCAlW291dDJdLCAlW3QwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAgJVtvdXQzXSwgJVtvdXQzXSwgJVt0MF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgICVbb3V0Ml0sIDEzKjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICAlW291dDNdLCA5KjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKworICAgICAgICA6IFt0MF0gIj0mZiIgKHQwKSwgW3QxXSAiPSZmIiAodDEpLAorICAgICAgICAgIFt0Ml0gIj0mZiIgKHQyKSwgW3QzXSAiPSZmIiAodDMpLAorICAgICAgICAgIFtpbjFdICI9JmYiIChpbjEpLCBbaW4yXSAiPSZmIiAoaW4yKSwKKyAgICAgICAgICBbaW4zXSAiPSZmIiAoaW4zKSwgW2luNF0gIj0mZiIgKGluNCksCisgICAgICAgICAgW2luNV0gIj0mZiIgKGluNSksCisgICAgICAgICAgW291dDFdICI9JmYiIChvdXQxKSwgW291dDJdICI9JmYiIChvdXQyKSwKKyAgICAgICAgICBbb3V0M10gIj0mZiIgKG91dDMpLAorICAgICAgICAgIFtjMV0gIj0mZiIgKGMxKSwgW2MyXSAiPSZmIiAoYzIpLAorICAgICAgICAgIFtjM10gIj0mZiIgKGMzKSwgW2M0XSAiPSZmIiAoYzQpLAorICAgICAgICAgIFtjNV0gIj0mZiIgKGM1KSwgW2M2XSAiPSZmIiAoYzYpLAorICAgICAgICAgIFtjN10gIj0mZiIgKGM3KSwgW2M4XSAiPSZmIiAoYzgpLAorICAgICAgICAgIFtjOV0gIj0mZiIgKGM5KQorICAgICAgICA6IFtpbl0gInIiIChpbiksIFt0bXBdICJyIiAodG1wKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKworICAgIC8qIGxvb3AgNCAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibHdjMSAgICVbaW4xXSwgIDIqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMl0sICAwKCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjNdLCAgMyo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW40XSwgIDEqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImxpLnMgICAlW2MxXSwgICAwLjUwMTkwOTkxODc3MTY3MzY5NDc5ICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsaS5zICAgJVtjMl0sICAgNS43MzY4NTY2MjI4MzQ5Mjc1NjQ2MSAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbczBdLCAgICVbaW4xXSwgJVtpbjJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAlW3MyXSwgICAlW2luMV0sICVbaW4yXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVtzMV0sICAgJVtpbjNdLCAlW2luNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3ViLnMgICVbczNdLCAgICVbaW4zXSwgJVtpbjRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMV0sICA5KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjJdLCAgNCo5KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4zXSwgIDgqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW3MxXSwgICAlW3MxXSwgICVbYzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgJVtzM10sICAgJVtzM10sICAlW2MyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW40XSwgIDQqOCo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNV0sICAyOSo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjZdLCAgMjgqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbdDBdLCAgICVbczBdLCAgJVtzMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAlW3QxXSwgICAlW3MwXSwgICVbczFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsaS5zICAgJVtjMV0sICAgMC41MTc2MzgwOTAyMDUwNDE1MjQ2OSAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibGkucyAgICVbYzJdLCAgIDEuOTMxODUxNjUyNTc4MTM2NTczNDkgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW291dDNdLCAlW2luNV0sICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgJVtvdXQxXSwgJVtpbjJdLCAlW2luMV0sICVbdDFdICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICVbb3V0Ml0sICVbaW40XSwgJVtpbjNdLCAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW291dDRdLCAlW2luNl0sICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVt0MF0sICAgJVtzMl0sICAlW3MzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0M10sIDQqOSo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDFdLCAyODgqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQyXSwgMjU2KjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0NF0sIDQqOCo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAlW3QxXSwgICAlW3MyXSwgICVbczNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjFdLCAgMTcqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4yXSwgIDQqMTcqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luM10sICAwKCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjRdLCAgMCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW41XSwgIDM3KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNl0sICAyMCo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgJVtvdXQxXSwgJVtpbjJdLCAlW2luMV0sICVbdDFdICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4xXSwgIDYqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAlW291dDJdLCAlW2luNF0sICVbaW4zXSwgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgJVtvdXQzXSwgJVt0MF0sICAlW2luNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICVbb3V0NF0sICVbdDBdLCAgJVtpbjZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDFdLCA1NDQqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjJdLCAgNCo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0Ml0sIDAoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDNdLCA0KjE3KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQ0XSwgMCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4zXSwgIDcqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAlW3MwXSwgICAlW2luMV0sICVbaW4yXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgJVtzMl0sICAgJVtpbjFdLCAlW2luMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW40XSwgIDUqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAlW3MxXSwgICAlW2luM10sICVbaW40XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgJVtzM10sICAgJVtpbjNdLCAlW2luNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4xXSwgIDEwKjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMl0sICA0KjEwKjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjNdLCAgNyo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICVbczFdLCAgICVbczFdLCAgJVtjMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW3MzXSwgICAlW3MzXSwgICVbYzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVt0MF0sICAgJVtzMF0sICAlW3MxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3ViLnMgICVbdDFdLCAgICVbczBdLCAgJVtzMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNF0sICA0KjcqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjVdLCAgMzAqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW42XSwgIDI3KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImxpLnMgICAlW2MxXSwgICAwLjU1MTY4ODk1OTQ4MTI0NTg3ODI0ICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgJVtvdXQxXSwgJVtpbjJdLCAlW2luMV0sICVbdDFdICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICVbb3V0Ml0sICVbaW40XSwgJVtpbjNdLCAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW291dDNdLCAlW3QwXSwgICVbaW41XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgJVtvdXQ0XSwgJVt0MF0sICAlW2luNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbdDBdLCAgICVbczJdLCAgJVtzM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDFdLCAzMjAqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQyXSwgMjI0KjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0M10sIDQqMTAqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDRdLCA0KjcqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgJVt0MV0sICAgJVtzMl0sICAlW3MzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4xXSwgIDE2KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMl0sICA0KjE2KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjNdLCAgMSo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW40XSwgIDQqMSo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNV0sICAzNio0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjZdLCAgMjEqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICVbb3V0MV0sICVbaW4yXSwgJVtpbjFdLCAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMV0sICAxMCo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgJVtvdXQyXSwgJVtpbjRdLCAlW2luM10sICVbdDFdICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICVbb3V0M10sICVbaW41XSwgJVt0MF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW291dDRdLCAlW2luNl0sICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQxXSwgNTEyKjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4yXSwgIDgqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDJdLCAzMio0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQzXSwgNCoxNio0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0NF0sIDQqMSo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImxpLnMgICAlW2MyXSwgICAxLjE4MzEwMDc5MTU3NjI0OTI1ODk2ICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVtzMF0sICAgJVtpbjFdLCAlW2luMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3ViLnMgICVbczJdLCAgICVbaW4xXSwgJVtpbjJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luM10sICAxMSo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjRdLCAgOSo0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbczFdLCAgICVbaW4zXSwgJVtpbjRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAlW3MzXSwgICAlW2luM10sICVbaW40XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjFdLCAgMTEqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4yXSwgIDQqMTEqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luM10sICA2KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgJVtzMV0sICAgJVtzMV0sICAlW2MxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICVbczNdLCAgICVbczNdLCAgJVtjMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNF0sICA0KjYqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjVdLCAgMzEqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW42XSwgIDI2KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImFkZC5zICAlW3QwXSwgICAlW3MwXSwgICVbczFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgJVt0MV0sICAgJVtzMF0sICAlW3MxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICVbb3V0M10sICVbdDBdLCAgJVtpbjVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW291dDRdLCAlW3QwXSwgICVbaW42XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVt0MF0sICAgJVtzMl0sICAlW3MzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICVbb3V0MV0sICVbaW4yXSwgJVtpbjFdLCAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAlW291dDJdLCAlW2luNF0sICVbaW4zXSwgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQzXSwgNCoxMSo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0NF0sIDQqNio0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAlW3QxXSwgICAlW3MyXSwgICVbczNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQxXSwgMzUyKjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0Ml0sIDE5Mio0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMV0sICAxNSo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjJdLCAgNCoxNSo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4zXSwgIDIqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNF0sICA0KjIqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjVdLCAgMzUqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW42XSwgIDIyKjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAlW291dDFdLCAlW2luMl0sICVbaW4xXSwgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjFdLCAgMTQqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICVbb3V0Ml0sICVbaW40XSwgJVtpbjNdLCAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW291dDNdLCAlW3QwXSwgICVbaW41XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgJVtvdXQ0XSwgJVt0MF0sICAlW2luNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0MV0sIDQ4MCo0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMl0sICAxMio0KCVbdG1wXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQyXSwgNjQqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0M10sIDQqMTUqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDRdLCA0KjIqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjNdLCAgMTUqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbczBdLCAgICVbaW4xXSwgJVtpbjJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAlW3MyXSwgICAlW2luMV0sICVbaW4yXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjRdLCAgMTMqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibGkucyAgICVbYzFdLCAgIDAuNjEwMzg3Mjk0MzgwNzI4MDM0MTYgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImxpLnMgICAlW2MyXSwgICAwLjg3MTcyMzM5NzgxMDU0OTAwOTkxICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJhZGQucyAgJVtzMV0sICAgJVtpbjNdLCAlW2luNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3ViLnMgICVbczNdLCAgICVbaW4zXSwgJVtpbjRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMV0sICAxMio0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjJdLCAgNCoxMio0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4zXSwgIDUqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW3MxXSwgICAlW3MxXSwgICVbYzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgJVtzM10sICAgJVtzM10sICAlW2MyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW40XSwgIDQqNSo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNV0sICAzMio0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjZdLCAgMjUqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbdDBdLCAgICVbczBdLCAgJVtzMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAlW3QxXSwgICAlW3MwXSwgICVbczFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtzMF0sICAgMTYqNCglW3RtcF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbczFdLCAgIDE3KjQoJVt0bXBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImxpLnMgICAlW2MxXSwgICAwLjcwNzEwNjc4MTE4NjU0NzUyNDM5ICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgJVtvdXQzXSwgJVt0MF0sICAlW2luNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICVbb3V0MV0sICVbaW4yXSwgJVtpbjFdLCAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm1hZGQucyAlW291dDJdLCAlW2luNF0sICVbaW4zXSwgJVt0MV0gICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgJVtvdXQ0XSwgJVt0MF0sICAlW2luNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbdDBdLCAgICVbczJdLCAgJVtzM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDNdLCA0KjEyKjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQxXSwgMzg0KjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0Ml0sIDE2MCo0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDRdLCA0KjUqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzdWIucyAgJVt0MV0sICAgJVtzMl0sICAlW3MzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4xXSwgIDE0KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luMl0sICA0KjE0KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjNdLCAgMyo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW40XSwgIDQqMyo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNV0sICAzNCo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjZdLCAgMjMqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICVbb3V0MV0sICVbaW4yXSwgJVtpbjFdLCAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW3MxXSwgICAlW3MxXSwgICVbYzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgJVtvdXQyXSwgJVtpbjRdLCAlW2luM10sICVbdDFdICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibXVsLnMgICVbb3V0M10sICVbaW41XSwgJVt0MF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW291dDRdLCAlW2luNl0sICVbdDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQxXSwgNDQ4KjQoJVtvdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAiYWRkLnMgICVbdDBdLCAgICVbczBdLCAgJVtzMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDJdLCA5Nio0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQzXSwgNCoxNCo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0NF0sIDQqMyo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN1Yi5zICAlW3QxXSwgICAlW3MwXSwgICVbczFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjFdLCAgMTMqNCglW3dpbl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW4yXSwgIDQqMTMqNCglW2J1Zl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luM10sICA0KjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJsd2MxICAgJVtpbjRdLCAgNCo0KjQoJVtidWZdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibHdjMSAgICVbaW41XSwgIDMzKjQoJVt3aW5dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgImx3YzEgICAlW2luNl0sICAyNCo0KCVbd2luXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtYWRkLnMgJVtvdXQxXSwgJVtpbjJdLCAlW2luMV0sICVbdDFdICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAibWFkZC5zICVbb3V0Ml0sICVbaW40XSwgJVtpbjNdLCAlW3QxXSAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgIm11bC5zICAlW291dDNdLCAlW3QwXSwgICVbaW41XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJtdWwucyAgJVtvdXQ0XSwgJVt0MF0sICAlW2luNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0MV0sIDQxNio0KCVbb3V0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKyAgICAgICAgInN3YzEgICAlW291dDJdLCAxMjgqNCglW291dF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XG4iCisgICAgICAgICJzd2MxICAgJVtvdXQzXSwgNCoxMyo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdFxuIgorICAgICAgICAic3djMSAgICVbb3V0NF0sIDQqNCo0KCVbYnVmXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcbiIKKworICAgICAgICA6IFtjMV0gIj0mZiIgKGMxKSwgW2MyXSAiPSZmIiAoYzIpLAorICAgICAgICAgIFtpbjFdICI9JmYiIChpbjEpLCBbaW4yXSAiPSZmIiAoaW4yKSwKKyAgICAgICAgICBbaW4zXSAiPSZmIiAoaW4zKSwgW2luNF0gIj0mZiIgKGluNCksCisgICAgICAgICAgW2luNV0gIj0mZiIgKGluNSksIFtpbjZdICI9JmYiIChpbjYpLAorICAgICAgICAgIFtvdXQxXSAiPSZmIiAob3V0MSksIFtvdXQyXSAiPSZmIiAob3V0MiksCisgICAgICAgICAgW291dDNdICI9JmYiIChvdXQzKSwgW291dDRdICI9JmYiIChvdXQ0KSwKKyAgICAgICAgICBbdDBdICI9JmYiICh0MCksIFt0MV0gIj0mZiIgKHQxKSwKKyAgICAgICAgICBbdDJdICI9JmYiICh0MiksIFt0M10gIj0mZiIgKHQzKSwKKyAgICAgICAgICBbczBdICI9JmYiIChzMCksIFtzMV0gIj0mZiIgKHMxKSwKKyAgICAgICAgICBbczJdICI9JmYiIChzMiksIFtzM10gIj0mZiIgKHMzKQorICAgICAgICA6IFt0bXBdICJyIiAodG1wKSwgW3dpbl0gInIiICh3aW4pLAorICAgICAgICAgIFtidWZdICJyIiAoYnVmKSwgW291dF0gInIiIChvdXQpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorCitzdGF0aWMgdm9pZCBmZl9pbWRjdDM2X2Jsb2Nrc19taXBzX2Zsb2F0KGZsb2F0ICpvdXQsIGZsb2F0ICpidWYsIGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCBzd2l0Y2hfcG9pbnQsIGludCBibG9ja190eXBlKQoreworICAgIGludCBqOworICAgIGZvciAoaj0wIDsgaiA8IGNvdW50OyBqKyspIHsKKyAgICAgICAgLyogYXBwbHkgd2luZG93ICYgb3ZlcmxhcCB3aXRoIHByZXZpb3VzIGJ1ZmZlciAqLworCisgICAgICAgIC8qIHNlbGVjdCB3aW5kb3cgKi8KKyAgICAgICAgaW50IHdpbl9pZHggPSAoc3dpdGNoX3BvaW50ICYmIGogPCAyKSA/IDAgOiBibG9ja190eXBlOworICAgICAgICBmbG9hdCAqd2luID0gZmZfbWRjdF93aW5fZmxvYXRbd2luX2lkeCArICg0ICYgLShqICYgMSkpXTsKKworICAgICAgICBpbWRjdDM2X21pcHNfZmxvYXQob3V0LCBidWYsIGluLCB3aW4pOworCisgICAgICAgIGluICArPSAxODsKKyAgICAgICAgYnVmICs9ICgoaiYzKSAhPSAzID8gMSA6ICg3Mi0zKSk7CisgICAgICAgIG91dCsrOworICAgIH0KK30KKwordm9pZCBmZl9tcGFkc3BfaW5pdF9taXBzZnB1KE1QQURTUENvbnRleHQgKnMpCit7CisgICAgcy0+YXBwbHlfd2luZG93X2Zsb2F0ICAgPSBmZl9tcGFkc3BfYXBwbHlfd2luZG93X21pcHNfZmxvYXQ7CisgICAgcy0+aW1kY3QzNl9ibG9ja3NfZmxvYXQgPSBmZl9pbWRjdDM2X2Jsb2Nrc19taXBzX2Zsb2F0OworICAgIHMtPmRjdDMyX2Zsb2F0ICAgICAgICAgID0gZmZfZGN0MzJfbWlwc19mbG9hdDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvc2JyZHNwX21pcHMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21pcHMvc2JyZHNwX21pcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQ2MGJhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWlwcy9zYnJkc3BfbWlwcy5jCkBAIC0wLDAgKzEsOTQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyCisgKiAgICAgIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBDYWxpZm9ybmlhLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBNSVBTIFRFQ0hOT0xPR0lFUywgSU5DLiBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQXV0aG9yczogIERhcmtvIExhdXMgICAgICAoZGFya29AbWlwcy5jb20pCisgKiAgICAgICAgICAgRGpvcmRqZSBQZXN1dCAgIChkam9yZGplQG1pcHMuY29tKQorICogICAgICAgICAgIE1pcmphbmEgVnVsaW4gICAobXZ1bGluQG1pcHMuY29tKQorICoKKyAqIEFBQyBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIGRlY29kaW5nIGZ1bmN0aW9ucyBvcHRpbWl6ZWQgZm9yIE1JUFMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUmVmZXJlbmNlOiBsaWJhdmNvZGVjL3NicmRzcC5jCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvc2JyZHNwLmgiCisKKyNpZiBIQVZFX0lOTElORV9BU00KK3N0YXRpYyB2b2lkIHNicl9uZWdfb2RkXzY0X21pcHMoZmxvYXQgKngpCit7CisgICAgaW50IFRlbXAxLCBUZW1wMiwgVGVtcDMsIFRlbXA0LCBUZW1wNTsKKyAgICBmbG9hdCAqeDEgICAgPSAmeFsxXTsKKyAgICBmbG9hdCAqeF9lbmQgPSB4MSArIDY0OworCisgICAgLyogbG9vcCB1bnJvbGxlZCA0IHRpbWVzICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsdWkgICAgJVtUZW1wNV0sICAgMHg4MDAwICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbVGVtcDFdLCAgIDAoJVt4MV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVtUZW1wMl0sICAgOCglW3gxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW1RlbXAzXSwgICAxNiglW3gxXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbVGVtcDRdLCAgIDI0KCVbeDFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgJVtUZW1wMV0sICAgJVtUZW1wMV0sICAgJVtUZW1wNV0gICAgXG5cdCIKKyAgICAgICAgInhvciAgICAlW1RlbXAyXSwgICAlW1RlbXAyXSwgICAlW1RlbXA1XSAgICBcblx0IgorICAgICAgICAieG9yICAgICVbVGVtcDNdLCAgICVbVGVtcDNdLCAgICVbVGVtcDVdICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgJVtUZW1wNF0sICAgJVtUZW1wNF0sICAgJVtUZW1wNV0gICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW1RlbXAxXSwgICAwKCVbeDFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbVGVtcDJdLCAgIDgoJVt4MV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVtUZW1wM10sICAgMTYoJVt4MV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW1RlbXA0XSwgICAyNCglW3gxXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbeDFdLCAgICAgICVbeDFdLCAgICAgIDMyICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmUgICAgJVt4MV0sICAgICAgJVt4X2VuZF0sICAgMWIgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFtUZW1wMV0iPSZyIihUZW1wMSksIFtUZW1wMl0iPSZyIihUZW1wMiksCisgICAgICAgICAgW1RlbXAzXSI9JnIiKFRlbXAzKSwgW1RlbXA0XSI9JnIiKFRlbXA0KSwKKyAgICAgICAgICBbVGVtcDVdIj0mciIoVGVtcDUpLCBbeDFdIityIih4MSkKKyAgICAgICAgOiBbeF9lbmRdInIiKHhfZW5kKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKworc3RhdGljIHZvaWQgc2JyX3FtZl9wcmVfc2h1ZmZsZV9taXBzKGZsb2F0ICp6KQoreworICAgIGludCBUZW1wMSwgVGVtcDIsIFRlbXAzLCBUZW1wNCwgVGVtcDUsIFRlbXA2OworICAgIGZsb2F0ICp6MSA9ICZ6WzY2XTsKKyAgICBmbG9hdCAqejIgPSAmels1OV07CisgICAgZmxvYXQgKnozID0gJnpbMl07CisgICAgZmxvYXQgKno0ID0gejEgKyA2MDsKKworICAgIC8qIGxvb3AgdW5yb2xsZWQgNSB0aW1lcyAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibHVpICAgICVbVGVtcDZdLCAgIDB4ODAwMCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW1RlbXAxXSwgICAwKCVbejJdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbVGVtcDJdLCAgIDQoJVt6Ml0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVtUZW1wM10sICAgOCglW3oyXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW1RlbXA0XSwgICAxMiglW3oyXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbVGVtcDVdLCAgIDE2KCVbejJdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgJVtUZW1wMV0sICAgJVtUZW1wMV0sICAgJVtUZW1wNl0gICAgXG5cdCIKKyAgICAgICAgInhvciAgICAlW1RlbXAyXSwgICAlW1RlbXAyXSwgICAlW1RlbXA2XSAgICBcblx0IgorICAgICAgICAieG9yICAgICVbVGVtcDNdLCAgICVbVGVtcDNdLCAgICVbVGVtcDZdICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgJVtUZW1wNF0sICAgJVtUZW1wNF0sICAgJVtUZW1wNl0gICAgXG5cdCIKKyAgICAgICAgInhvciAgICAlW1RlbXA1XSwgICAlW1RlbXA1XSwgICAlW1RlbXA2XSAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbejJdLCAgICAgICVbejJdLCAgICAgIC0yMCAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVtUZW1wMV0sICAgMzIoJVt6MV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW1RlbXAyXSwgICAyNCglW3oxXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbVGVtcDNdLCAgIDE2KCVbejFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVtUZW1wNF0sICAgOCglW3oxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW1RlbXA1XSwgICAwKCVbejFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbVGVtcDFdLCAgIDAoJVt6M10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVtUZW1wMl0sICAgNCglW3ozXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW1RlbXAzXSwgICA4KCVbejNdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbVGVtcDRdLCAgIDEyKCVbejNdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVtUZW1wNV0sICAgMTYoJVt6M10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW1RlbXAxXSwgICA0KCVbejFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbVGVtcDJdLCAgIDEyKCVbejFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVtUZW1wM10sICAgMjAoJVt6MV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW1RlbXA0XSwgICAyOCglW3oxXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbVGVtcDVdLCAgIDM2KCVbejFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVt6M10sICAgICAgJVt6M10sICAgICAgMjAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW3oxXSwgICAgICAlW3oxXSwgICAgICA0MCAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICVbejFdLCAgICAgICVbejRdLCAgICAgIDFiICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVtUZW1wMV0sICAgMTMyKCVbel0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW1RlbXAyXSwgICAxMjgoJVt6XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbVGVtcDNdLCAgIDAoJVt6XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVtUZW1wNF0sICAgNCglW3pdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAlW1RlbXAxXSwgICAlW1RlbXAxXSwgICAlW1RlbXA2XSAgICBcblx0IgorICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDUwNCglW3pdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgNTA4KCVbel0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW1RlbXAzXSwgICAyNTYoJVt6XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbVGVtcDRdLCAgIDI2MCglW3pdKSAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbVGVtcDFdIj0mciIoVGVtcDEpLCBbVGVtcDJdIj0mciIoVGVtcDIpLAorICAgICAgICAgIFtUZW1wM10iPSZyIihUZW1wMyksIFtUZW1wNF0iPSZyIihUZW1wNCksCisgICAgICAgICAgW1RlbXA1XSI9JnIiKFRlbXA1KSwgW1RlbXA2XSI9JnIiKFRlbXA2KSwKKyAgICAgICAgICBbejFdIityIih6MSksIFt6Ml0iK3IiKHoyKSwgW3ozXSIrciIoejMpCisgICAgICAgIDogW3o0XSJyIih6NCksIFt6XSJyIih6KQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKworc3RhdGljIHZvaWQgc2JyX3FtZl9wb3N0X3NodWZmbGVfbWlwcyhmbG9hdCBXWzMyXVsyXSwgY29uc3QgZmxvYXQgKnopCit7CisgICAgaW50IFRlbXAxLCBUZW1wMiwgVGVtcDMsIFRlbXA0LCBUZW1wNTsKKyAgICBmbG9hdCAqV19wdHIgPSAoZmxvYXQgKilXOworICAgIGZsb2F0ICp6MSAgICA9IChmbG9hdCAqKXo7CisgICAgZmxvYXQgKnoyICAgID0gKGZsb2F0ICopJnpbNjBdOworICAgIGZsb2F0ICp6X2VuZCA9IHoxICsgMzI7CisKKyAgICAgLyogbG9vcCB1bnJvbGxlZCA0IHRpbWVzICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsdWkgICAgJVtUZW1wNV0sICAgMHg4MDAwICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbVGVtcDFdLCAgIDAoJVt6Ml0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVtUZW1wMl0sICAgNCglW3oyXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW1RlbXAzXSwgICA4KCVbejJdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbVGVtcDRdLCAgIDEyKCVbejJdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgJVtUZW1wMV0sICAgJVtUZW1wMV0sICAgJVtUZW1wNV0gICAgXG5cdCIKKyAgICAgICAgInhvciAgICAlW1RlbXAyXSwgICAlW1RlbXAyXSwgICAlW1RlbXA1XSAgICBcblx0IgorICAgICAgICAieG9yICAgICVbVGVtcDNdLCAgICVbVGVtcDNdLCAgICVbVGVtcDVdICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgJVtUZW1wNF0sICAgJVtUZW1wNF0sICAgJVtUZW1wNV0gICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW3oyXSwgICAgICAlW3oyXSwgICAgICAtMTYgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbVGVtcDFdLCAgIDI0KCVbV19wdHJdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVtUZW1wMl0sICAgMTYoJVtXX3B0cl0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW1RlbXAzXSwgICA4KCVbV19wdHJdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbVGVtcDRdLCAgIDAoJVtXX3B0cl0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVtUZW1wMV0sICAgMCglW3oxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAlW1RlbXAyXSwgICA0KCVbejFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICVbVGVtcDNdLCAgIDgoJVt6MV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgJVtUZW1wNF0sICAgMTIoJVt6MV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW1RlbXAxXSwgICA0KCVbV19wdHJdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICVbVGVtcDJdLCAgIDEyKCVbV19wdHJdKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgJVtUZW1wM10sICAgMjAoJVtXX3B0cl0pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAlW1RlbXA0XSwgICAyOCglW1dfcHRyXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbejFdLCAgICAgICVbejFdLCAgICAgIDE2ICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtXX3B0cl0sICAgJVtXX3B0cl0sICAgMzIgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICAlW3oxXSwgICAgICAlW3pfZW5kXSwgICAxYiAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW1RlbXAxXSI9JnIiKFRlbXAxKSwgW1RlbXAyXSI9JnIiKFRlbXAyKSwKKyAgICAgICAgICBbVGVtcDNdIj0mciIoVGVtcDMpLCBbVGVtcDRdIj0mciIoVGVtcDQpLAorICAgICAgICAgIFtUZW1wNV0iPSZyIihUZW1wNSksIFt6MV0iK3IiKHoxKSwKKyAgICAgICAgICBbejJdIityIih6MiksIFtXX3B0cl0iK3IiKFdfcHRyKQorICAgICAgICA6IFt6X2VuZF0iciIoel9lbmQpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorCisjaWYgSEFWRV9NSVBTRlBVCitzdGF0aWMgdm9pZCBzYnJfc3VtNjR4NV9taXBzKGZsb2F0ICp6KQoreworICAgIGludCBrOworICAgIGZsb2F0ICp6MTsKKyAgICBmbG9hdCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNywgZjg7CisgICAgZm9yIChrID0gMDsgayA8IDY0OyBrICs9IDgpIHsKKworICAgICAgICB6MSA9ICZ6W2tdOworCisgICAgICAgICAvKiBsb29wIHVucm9sbGVkIDggdGltZXMgKi8KKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAibHdjMSAgICRmMCwgICAgMCglW3oxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMSwgICAgMjU2KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMiwgICAgNCglW3oxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMywgICAgMjYwKCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNCwgICAgOCglW3oxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjFdLCAgJGYwLCAgICAkZjEgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNSwgICAgMjY0KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjJdLCAgJGYyLCAgICAkZjMgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNiwgICAgMTIoJVt6MV0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNywgICAgMjY4KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjNdLCAgJGY0LCAgICAkZjUgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmOCwgICAgMTYoJVt6MV0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmOSwgICAgMjcyKCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjRdLCAgJGY2LCAgICAkZjcgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMTAsICAgMjAoJVt6MV0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMTEsICAgMjc2KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjVdLCAgJGY4LCAgICAkZjkgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMTIsICAgMjQoJVt6MV0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMTMsICAgMjgwKCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjZdLCAgJGYxMCwgICAkZjExICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMTQsICAgMjgoJVt6MV0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMTUsICAgMjg0KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjddLCAgJGYxMiwgICAkZjEzICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMCwgICAgNTEyKCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMSwgICAgNTE2KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjhdLCAgJGYxNCwgICAkZjE1ICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMiwgICAgNTIwKCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjFdLCAgJVtmMV0sICAkZjAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjJdLCAgJVtmMl0sICAkZjEgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMywgICAgNTI0KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjNdLCAgJVtmM10sICAkZjIgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNCwgICAgNTI4KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNSwgICAgNTMyKCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjRdLCAgJVtmNF0sICAkZjMgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNiwgICAgNTM2KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjVdLCAgJVtmNV0sICAkZjQgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjZdLCAgJVtmNl0sICAkZjUgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNywgICAgNTQwKCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjddLCAgJVtmN10sICAkZjYgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMCwgICAgNzY4KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMSwgICAgNzcyKCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjhdLCAgJVtmOF0sICAkZjcgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMiwgICAgNzc2KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjFdLCAgJVtmMV0sICAkZjAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjJdLCAgJVtmMl0sICAkZjEgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMywgICAgNzgwKCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjNdLCAgJVtmM10sICAkZjIgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNCwgICAgNzg0KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNSwgICAgNzg4KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjRdLCAgJVtmNF0sICAkZjMgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNiwgICAgNzkyKCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjVdLCAgJVtmNV0sICAkZjQgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjZdLCAgJVtmNl0sICAkZjUgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNywgICAgNzk2KCVbejFdKSAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjddLCAgJVtmN10sICAkZjYgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMCwgICAgMTAyNCglW3oxXSkgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMSwgICAgMTAyOCglW3oxXSkgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjhdLCAgJVtmOF0sICAkZjcgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMiwgICAgMTAzMiglW3oxXSkgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjFdLCAgJVtmMV0sICAkZjAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjJdLCAgJVtmMl0sICAkZjEgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmMywgICAgMTAzNiglW3oxXSkgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjNdLCAgJVtmM10sICAkZjIgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNCwgICAgMTA0MCglW3oxXSkgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNSwgICAgMTA0NCglW3oxXSkgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjRdLCAgJVtmNF0sICAkZjMgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNiwgICAgMTA0OCglW3oxXSkgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjVdLCAgJVtmNV0sICAkZjQgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjZdLCAgJVtmNl0sICAkZjUgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICRmNywgICAgMTA1MiglW3oxXSkgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjddLCAgJVtmN10sICAkZjYgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbZjFdLCAgMCglW3oxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbZjJdLCAgNCglW3oxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICVbZjhdLCAgJVtmOF0sICAkZjcgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbZjNdLCAgOCglW3oxXSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbZjRdLCAgMTIoJVt6MV0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbZjVdLCAgMTYoJVt6MV0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbZjZdLCAgMjAoJVt6MV0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbZjddLCAgMjQoJVt6MV0pICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbZjhdLCAgMjgoJVt6MV0pICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW2YxXSI9JmYiKGYxKSwgW2YyXSI9JmYiKGYyKSwgW2YzXSI9JmYiKGYzKSwKKyAgICAgICAgICAgICAgW2Y0XSI9JmYiKGY0KSwgW2Y1XSI9JmYiKGY1KSwgW2Y2XSI9JmYiKGY2KSwKKyAgICAgICAgICAgICAgW2Y3XSI9JmYiKGY3KSwgW2Y4XSI9JmYiKGY4KQorICAgICAgICAgICAgOiBbejFdInIiKHoxKQorICAgICAgICAgICAgOiAiJGYwIiwgIiRmMSIsICIkZjIiLCAiJGYzIiwgIiRmNCIsICIkZjUiLAorICAgICAgICAgICAgICAiJGY2IiwgIiRmNyIsICIkZjgiLCAiJGY5IiwgIiRmMTAiLCAiJGYxMSIsCisgICAgICAgICAgICAgICIkZjEyIiwgIiRmMTMiLCAiJGYxNCIsICIkZjE1IiwKKyAgICAgICAgICAgICAgIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICB9Cit9CisKK3N0YXRpYyBmbG9hdCBzYnJfc3VtX3NxdWFyZV9taXBzKGZsb2F0ICgqeClbMl0sIGludCBuKQoreworICAgIGZsb2F0IHN1bTAgPSAwLjBmLCBzdW0xID0gMC4wZjsKKyAgICBmbG9hdCAqcF94OworICAgIGZsb2F0IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICAgIGZsb2F0ICpsb29wX2VuZDsKKyAgICBwX3ggPSAmeFswXVswXTsKKyAgICBsb29wX2VuZCA9IHBfeCArIChuID4+IDEpKjQgLSA0OworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIuc2V0ICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgJVt0ZW1wMF0sICAgMCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgJVt0ZW1wMV0sICAgNCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgJVt0ZW1wMl0sICAgOCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgJVt0ZW1wM10sICAgMTIoJVtwX3hdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAgJVtwX3hdLCAgICAgJVtwX3hdLCAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgJVtzdW0wXSwgICAgJVtzdW0wXSwgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgJVt0ZW1wMF0sICAgMCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgJVtzdW0xXSwgICAgJVtzdW0xXSwgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgJVt0ZW1wMV0sICAgNCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgJVtzdW0wXSwgICAgJVtzdW0wXSwgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICAgJVt0ZW1wMl0sICAgOCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgJVtzdW0xXSwgICAgJVtzdW0xXSwgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgICAgICJibmUgICAgICAgJVtwX3hdLCAgICAgJVtsb29wX2VuZF0sICAxYiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIgbHdjMSAgICAgJVt0ZW1wM10sICAgMTIoJVtwX3hdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgJVtzdW0wXSwgICAgJVtzdW0wXSwgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgJVtzdW0xXSwgICAgJVtzdW0xXSwgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgJVtzdW0wXSwgICAgJVtzdW0wXSwgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgICAgICJtYWRkLnMgICAgJVtzdW0xXSwgICAgJVtzdW0xXSwgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiBbdGVtcDBdIj0mZiIodGVtcDApLCBbdGVtcDFdIj0mZiIodGVtcDEpLCBbdGVtcDJdIj0mZiIodGVtcDIpLAorICAgICAgICAgIFt0ZW1wM10iPSZmIih0ZW1wMyksIFtzdW0wXSIrZiIoc3VtMCksIFtzdW0xXSIrZiIoc3VtMSksCisgICAgICAgICAgW3BfeF0iK3IiKHBfeCkKKyAgICAgICAgOiBbbG9vcF9lbmRdInIiKGxvb3BfZW5kKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKyAgICByZXR1cm4gc3VtMCArIHN1bTE7Cit9CisKK3N0YXRpYyB2b2lkIHNicl9xbWZfZGVpbnRfYmZseV9taXBzKGZsb2F0ICp2LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEpCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgICBmbG9hdCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTE7CisgICAgZmxvYXQgKnYwID0gdjsKKyAgICBmbG9hdCAqdjEgPSAmdlsxMjddOworICAgIGZsb2F0ICpwc3JjMCA9IChmbG9hdCopc3JjMDsKKyAgICBmbG9hdCAqcHNyYzEgPSAoZmxvYXQqKSZzcmMxWzYzXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKworICAgICAgICAgLyogbG9vcCB1bnJvbGxlZCAxNiB0aW1lcyAqLworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMF0sICAgMCglW3NyYzBdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMV0sICAgMCglW3NyYzFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wM10sICAgNCglW3NyYzBdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wNF0sICAgLTQoJVtzcmMxXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wNl0sICAgOCglW3NyYzBdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wN10sICAgLTgoJVtzcmMxXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wOV0sICAgMTIoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMTBdLCAgLTEyKCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wMV0gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgJVt0ZW1wNF0gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wNl0sICAgJVt0ZW1wN10gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wMTFdLCAgJVt0ZW1wOV0sICAgJVt0ZW1wMTBdICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wMV0gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVt0ZW1wNF0gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgJVt0ZW1wN10gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wOV0sICAgJVt0ZW1wOV0sICAgJVt0ZW1wMTBdICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMl0sICAgMCglW3YxXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMF0sICAgMCglW3YwXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wNV0sICAgLTQoJVt2MV0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wM10sICAgNCglW3YwXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wOF0sICAgLTgoJVt2MV0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wNl0sICAgOCglW3YwXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMTFdLCAgLTEyKCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wOV0sICAgMTIoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMF0sICAgMTYoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMV0sICAgLTE2KCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wM10sICAgMjAoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wNF0sICAgLTIwKCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wNl0sICAgMjQoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wN10sICAgLTI0KCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wOV0sICAgMjgoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMTBdLCAgLTI4KCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wMV0gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgJVt0ZW1wNF0gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wNl0sICAgJVt0ZW1wN10gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wMTFdLCAgJVt0ZW1wOV0sICAgJVt0ZW1wMTBdICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wMV0gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVt0ZW1wNF0gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgJVt0ZW1wN10gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wOV0sICAgJVt0ZW1wOV0sICAgJVt0ZW1wMTBdICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMl0sICAgLTE2KCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMF0sICAgMTYoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wNV0sICAgLTIwKCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wM10sICAgMjAoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wOF0sICAgLTI0KCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wNl0sICAgMjQoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMTFdLCAgLTI4KCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wOV0sICAgMjgoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMF0sICAgMzIoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMV0sICAgLTMyKCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wM10sICAgMzYoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wNF0sICAgLTM2KCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wNl0sICAgNDAoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wN10sICAgLTQwKCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wOV0sICAgNDQoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMTBdLCAgLTQ0KCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wMV0gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgJVt0ZW1wNF0gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wNl0sICAgJVt0ZW1wN10gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wMTFdLCAgJVt0ZW1wOV0sICAgJVt0ZW1wMTBdICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wMV0gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVt0ZW1wNF0gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgJVt0ZW1wN10gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wOV0sICAgJVt0ZW1wOV0sICAgJVt0ZW1wMTBdICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMl0sICAgLTMyKCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMF0sICAgMzIoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wNV0sICAgLTM2KCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wM10sICAgMzYoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wOF0sICAgLTQwKCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wNl0sICAgNDAoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMTFdLCAgLTQ0KCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wOV0sICAgNDQoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMF0sICAgNDgoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMV0sICAgLTQ4KCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wM10sICAgNTIoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wNF0sICAgLTUyKCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wNl0sICAgNTYoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wN10sICAgLTU2KCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wOV0sICAgNjAoJVtzcmMwXSkgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAgJVt0ZW1wMTBdLCAgLTYwKCVbc3JjMV0pICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wMV0gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgJVt0ZW1wNF0gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wNl0sICAgJVt0ZW1wN10gICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgICAgJVt0ZW1wMTFdLCAgJVt0ZW1wOV0sICAgJVt0ZW1wMTBdICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wMV0gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVt0ZW1wNF0gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgJVt0ZW1wN10gICBcblx0IgorICAgICAgICAgICAgInN1Yi5zICAgICAgJVt0ZW1wOV0sICAgJVt0ZW1wOV0sICAgJVt0ZW1wMTBdICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMl0sICAgLTQ4KCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMF0sICAgNDgoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wNV0sICAgLTUyKCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wM10sICAgNTIoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wOF0sICAgLTU2KCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wNl0sICAgNTYoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wMTFdLCAgLTYwKCVbdjFdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAgJVt0ZW1wOV0sICAgNjAoJVt2MF0pICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgICAgJVtzcmMwXSwgICAgJVtzcmMwXSwgICAgNjQgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgICAgJVtzcmMxXSwgICAgJVtzcmMxXSwgICAgLTY0ICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgICAgJVt2MF0sICAgICAgJVt2MF0sICAgICAgNjQgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgICAgJVt2MV0sICAgICAgJVt2MV0sICAgICAgLTY0ICAgICAgICBcblx0IgorCisgICAgICAgICAgICA6IFt2MF0iK3IiKHYwKSwgW3YxXSIrciIodjEpLCBbc3JjMF0iK3IiKHBzcmMwKSwgW3NyYzFdIityIihwc3JjMSksCisgICAgICAgICAgICAgIFt0ZW1wMF0iPSZmIih0ZW1wMCksIFt0ZW1wMV0iPSZmIih0ZW1wMSksIFt0ZW1wMl0iPSZmIih0ZW1wMiksCisgICAgICAgICAgICAgIFt0ZW1wM10iPSZmIih0ZW1wMyksIFt0ZW1wNF0iPSZmIih0ZW1wNCksIFt0ZW1wNV0iPSZmIih0ZW1wNSksCisgICAgICAgICAgICAgIFt0ZW1wNl0iPSZmIih0ZW1wNiksIFt0ZW1wN10iPSZmIih0ZW1wNyksIFt0ZW1wOF0iPSZmIih0ZW1wOCksCisgICAgICAgICAgICAgIFt0ZW1wOV0iPSZmIih0ZW1wOSksIFt0ZW1wMTBdIj0mZiIodGVtcDEwKSwgW3RlbXAxMV0iPSZmIih0ZW1wMTEpCisgICAgICAgICAgICA6CisgICAgICAgICAgICA6Im1lbW9yeSIKKyAgICAgICAgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNicl9hdXRvY29ycmVsYXRlX21pcHMoY29uc3QgZmxvYXQgeFs0MF1bMl0sIGZsb2F0IHBoaVszXVsyXVsyXSkKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCByZWFsX3N1bV8wID0gMC4wZjsKKyAgICBmbG9hdCByZWFsX3N1bV8xID0gMC4wZjsKKyAgICBmbG9hdCByZWFsX3N1bV8yID0gMC4wZjsKKyAgICBmbG9hdCBpbWFnX3N1bV8xID0gMC4wZjsKKyAgICBmbG9hdCBpbWFnX3N1bV8yID0gMC4wZjsKKyAgICBmbG9hdCAqcF94LCAqcF9waGk7CisgICAgZmxvYXQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDY7CisgICAgZmxvYXQgdGVtcDcsIHRlbXBfciwgdGVtcF9yMSwgdGVtcF9yMiwgdGVtcF9yMywgdGVtcF9yNDsKKyAgICBwX3ggPSAoZmxvYXQqKSZ4WzBdWzBdOworICAgIHBfcGhpID0gJnBoaVswXVswXVswXTsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibHdjMSAgICAlW3RlbXAwXSwgICAgICA4KCVbcF94XSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXAxXSwgICAgICAxMiglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXAyXSwgICAgICAxNiglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXAzXSwgICAgICAyMCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXA0XSwgICAgICAyNCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXA1XSwgICAgICAyOCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXBfcl0sICAgICAlW3RlbXAxXSwgICAgICAlW3RlbXAxXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXBfcjFdLCAgICAlW3RlbXAxXSwgICAgICAlW3RlbXAzXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXBfcjJdLCAgICAlW3RlbXAxXSwgICAgICAlW3RlbXAyXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXBfcjNdLCAgICAlW3RlbXAxXSwgICAgICAlW3RlbXA1XSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXBfcjRdLCAgICAlW3RlbXAxXSwgICAgICAlW3RlbXA0XSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXBfcl0sICAgICAlW3RlbXBfcl0sICAgICAlW3RlbXAwXSwgICVbdGVtcDBdICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXBfcjFdLCAgICAlW3RlbXBfcjFdLCAgICAlW3RlbXAwXSwgICVbdGVtcDJdICBcblx0IgorICAgICAgICAibXN1Yi5zICAlW3RlbXBfcjJdLCAgICAlW3RlbXBfcjJdLCAgICAlW3RlbXAwXSwgICVbdGVtcDNdICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXBfcjNdLCAgICAlW3RlbXBfcjNdLCAgICAlW3RlbXAwXSwgICVbdGVtcDRdICBcblx0IgorICAgICAgICAibXN1Yi5zICAlW3RlbXBfcjRdLCAgICAlW3RlbXBfcjRdLCAgICAlW3RlbXAwXSwgICVbdGVtcDVdICBcblx0IgorICAgICAgICAiYWRkLnMgICAlW3JlYWxfc3VtXzBdLCAlW3JlYWxfc3VtXzBdLCAlW3RlbXBfcl0gICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAlW3JlYWxfc3VtXzFdLCAlW3JlYWxfc3VtXzFdLCAlW3RlbXBfcjFdICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAlW2ltYWdfc3VtXzFdLCAlW2ltYWdfc3VtXzFdLCAlW3RlbXBfcjJdICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAlW3JlYWxfc3VtXzJdLCAlW3JlYWxfc3VtXzJdLCAlW3RlbXBfcjNdICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkLnMgICAlW2ltYWdfc3VtXzJdLCAlW2ltYWdfc3VtXzJdLCAlW3RlbXBfcjRdICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAlW3BfeF0sICAgICAgICAlW3BfeF0sICAgICAgICA4ICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW3RlbXAwXSI9JmYiKHRlbXAwKSwgW3RlbXAxXSI9JmYiKHRlbXAxKSwgW3RlbXAyXSI9JmYiKHRlbXAyKSwKKyAgICAgICAgICBbdGVtcDNdIj0mZiIodGVtcDMpLCBbdGVtcDRdIj0mZiIodGVtcDQpLCBbdGVtcDVdIj0mZiIodGVtcDUpLAorICAgICAgICAgIFtyZWFsX3N1bV8wXSIrZiIocmVhbF9zdW1fMCksIFtyZWFsX3N1bV8xXSIrZiIocmVhbF9zdW1fMSksCisgICAgICAgICAgW2ltYWdfc3VtXzFdIitmIihpbWFnX3N1bV8xKSwgW3JlYWxfc3VtXzJdIitmIihyZWFsX3N1bV8yKSwKKyAgICAgICAgICBbdGVtcF9yXSI9JmYiKHRlbXBfciksIFt0ZW1wX3IxXSI9JmYiKHRlbXBfcjEpLCBbdGVtcF9yMl0iPSZmIih0ZW1wX3IyKSwKKyAgICAgICAgICBbdGVtcF9yM10iPSZmIih0ZW1wX3IzKSwgW3RlbXBfcjRdIj0mZiIodGVtcF9yNCksCisgICAgICAgICAgW3BfeF0iK3IiKHBfeCksIFtpbWFnX3N1bV8yXSIrZiIoaW1hZ19zdW1fMikKKyAgICAgICAgOgorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMF0sICAgICAgOCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDFdLCAgICAgIDEyKCVbcF94XSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAyXSwgICAgICAxNiglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wM10sICAgICAgMjAoJVtwX3hdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDRdLCAgICAgIDI0KCVbcF94XSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA1XSwgICAgICAyOCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wX3JdLCAgICAgJVt0ZW1wMV0sICAgICAgJVt0ZW1wMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICVbdGVtcF9yMV0sICAgICVbdGVtcDFdLCAgICAgICVbdGVtcDNdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICAlW3RlbXBfcjJdLCAgICAlW3RlbXAxXSwgICAgICAlW3RlbXAyXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wX3IzXSwgICAgJVt0ZW1wMV0sICAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICVbdGVtcF9yNF0sICAgICVbdGVtcDFdLCAgICAgICVbdGVtcDRdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAlW3RlbXBfcl0sICAgICAlW3RlbXBfcl0sICAgICAlW3RlbXAwXSwgICVbdGVtcDBdICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wX3IxXSwgICAgJVt0ZW1wX3IxXSwgICAgJVt0ZW1wMF0sICAlW3RlbXAyXSAgXG5cdCIKKyAgICAgICAgICAgICJtc3ViLnMgICVbdGVtcF9yMl0sICAgICVbdGVtcF9yMl0sICAgICVbdGVtcDBdLCAgJVt0ZW1wM10gIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAlW3RlbXBfcjNdLCAgICAlW3RlbXBfcjNdLCAgICAlW3RlbXAwXSwgICVbdGVtcDRdICBcblx0IgorICAgICAgICAgICAgIm1zdWIucyAgJVt0ZW1wX3I0XSwgICAgJVt0ZW1wX3I0XSwgICAgJVt0ZW1wMF0sICAlW3RlbXA1XSAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAgICVbcmVhbF9zdW1fMF0sICVbcmVhbF9zdW1fMF0sICVbdGVtcF9yXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICAlW3JlYWxfc3VtXzFdLCAlW3JlYWxfc3VtXzFdLCAlW3RlbXBfcjFdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgJVtpbWFnX3N1bV8xXSwgJVtpbWFnX3N1bV8xXSwgJVt0ZW1wX3IyXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAgICVbcmVhbF9zdW1fMl0sICVbcmVhbF9zdW1fMl0sICVbdGVtcF9yM10gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICAlW2ltYWdfc3VtXzJdLCAlW2ltYWdfc3VtXzJdLCAlW3RlbXBfcjRdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMF0sICAgICAgMzIoJVtwX3hdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDFdLCAgICAgIDM2KCVbcF94XSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICAlW3RlbXBfcl0sICAgICAlW3RlbXAzXSwgICAgICAlW3RlbXAzXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wX3IxXSwgICAgJVt0ZW1wM10sICAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICVbdGVtcF9yMl0sICAgICVbdGVtcDNdLCAgICAgICVbdGVtcDRdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICAlW3RlbXBfcjNdLCAgICAlW3RlbXAzXSwgICAgICAlW3RlbXAxXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wX3I0XSwgICAgJVt0ZW1wM10sICAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcF9yXSwgICAgICVbdGVtcF9yXSwgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0gIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAlW3RlbXBfcjFdLCAgICAlW3RlbXBfcjFdLCAgICAlW3RlbXAyXSwgICVbdGVtcDRdICBcblx0IgorICAgICAgICAgICAgIm1zdWIucyAgJVt0ZW1wX3IyXSwgICAgJVt0ZW1wX3IyXSwgICAgJVt0ZW1wMl0sICAlW3RlbXA1XSAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcF9yM10sICAgICVbdGVtcF9yM10sICAgICVbdGVtcDJdLCAgJVt0ZW1wMF0gIFxuXHQiCisgICAgICAgICAgICAibXN1Yi5zICAlW3RlbXBfcjRdLCAgICAlW3RlbXBfcjRdLCAgICAlW3RlbXAyXSwgICVbdGVtcDFdICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgJVtyZWFsX3N1bV8wXSwgJVtyZWFsX3N1bV8wXSwgJVt0ZW1wX3JdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAgICVbcmVhbF9zdW1fMV0sICVbcmVhbF9zdW1fMV0sICVbdGVtcF9yMV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICAlW2ltYWdfc3VtXzFdLCAlW2ltYWdfc3VtXzFdLCAlW3RlbXBfcjJdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgJVtyZWFsX3N1bV8yXSwgJVtyZWFsX3N1bV8yXSwgJVt0ZW1wX3IzXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAgICVbaW1hZ19zdW1fMl0sICVbaW1hZ19zdW1fMl0sICVbdGVtcF9yNF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAyXSwgICAgICA0MCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wM10sICAgICAgNDQoJVtwX3hdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICVbdGVtcF9yXSwgICAgICVbdGVtcDVdLCAgICAgICVbdGVtcDVdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICAlW3RlbXBfcjFdLCAgICAlW3RlbXA1XSwgICAgICAlW3RlbXAxXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wX3IyXSwgICAgJVt0ZW1wNV0sICAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICVbdGVtcF9yM10sICAgICVbdGVtcDVdLCAgICAgICVbdGVtcDNdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICAlW3RlbXBfcjRdLCAgICAlW3RlbXA1XSwgICAgICAlW3RlbXAyXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wX3JdLCAgICAgJVt0ZW1wX3JdLCAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcF9yMV0sICAgICVbdGVtcF9yMV0sICAgICVbdGVtcDRdLCAgJVt0ZW1wMF0gIFxuXHQiCisgICAgICAgICAgICAibXN1Yi5zICAlW3RlbXBfcjJdLCAgICAlW3RlbXBfcjJdLCAgICAlW3RlbXA0XSwgICVbdGVtcDFdICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wX3IzXSwgICAgJVt0ZW1wX3IzXSwgICAgJVt0ZW1wNF0sICAlW3RlbXAyXSAgXG5cdCIKKyAgICAgICAgICAgICJtc3ViLnMgICVbdGVtcF9yNF0sICAgICVbdGVtcF9yNF0sICAgICVbdGVtcDRdLCAgJVt0ZW1wM10gIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICAlW3JlYWxfc3VtXzBdLCAlW3JlYWxfc3VtXzBdLCAlW3RlbXBfcl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgJVtyZWFsX3N1bV8xXSwgJVtyZWFsX3N1bV8xXSwgJVt0ZW1wX3IxXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAgICVbaW1hZ19zdW1fMV0sICVbaW1hZ19zdW1fMV0sICVbdGVtcF9yMl0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkLnMgICAlW3JlYWxfc3VtXzJdLCAlW3JlYWxfc3VtXzJdLCAlW3RlbXBfcjNdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgJVtpbWFnX3N1bV8yXSwgJVtpbWFnX3N1bV8yXSwgJVt0ZW1wX3I0XSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICVbcF94XSwgICAgICAgICVbcF94XSwgICAgICAgIDI0ICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3RlbXAwXSI9JmYiKHRlbXAwKSwgW3RlbXAxXSI9JmYiKHRlbXAxKSwgW3RlbXAyXSI9JmYiKHRlbXAyKSwKKyAgICAgICAgICAgICAgW3RlbXAzXSI9JmYiKHRlbXAzKSwgW3RlbXA0XSI9JmYiKHRlbXA0KSwgW3RlbXA1XSI9JmYiKHRlbXA1KSwKKyAgICAgICAgICAgICAgW3JlYWxfc3VtXzBdIitmIihyZWFsX3N1bV8wKSwgW3JlYWxfc3VtXzFdIitmIihyZWFsX3N1bV8xKSwKKyAgICAgICAgICAgICAgW2ltYWdfc3VtXzFdIitmIihpbWFnX3N1bV8xKSwgW3JlYWxfc3VtXzJdIitmIihyZWFsX3N1bV8yKSwKKyAgICAgICAgICAgICAgW3RlbXBfcl0iPSZmIih0ZW1wX3IpLCBbdGVtcF9yMV0iPSZmIih0ZW1wX3IxKSwKKyAgICAgICAgICAgICAgW3RlbXBfcjJdIj0mZiIodGVtcF9yMiksIFt0ZW1wX3IzXSI9JmYiKHRlbXBfcjMpLAorICAgICAgICAgICAgICBbdGVtcF9yNF0iPSZmIih0ZW1wX3I0KSwgW3BfeF0iK3IiKHBfeCksCisgICAgICAgICAgICAgIFtpbWFnX3N1bV8yXSIrZiIoaW1hZ19zdW1fMikKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICB9CisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsd2MxICAgICVbdGVtcDBdLCAgICAtMjk2KCVbcF94XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXAxXSwgICAgLTI5MiglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wMl0sICAgIDgoJVtwX3hdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICVbdGVtcDNdLCAgICAxMiglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXA0XSwgICAgLTI4OCglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICAgIC0yODQoJVtwX3hdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsd2MxICAgICVbdGVtcDZdLCAgICAtMjgwKCVbcF94XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXA3XSwgICAgLTI3NiglW3BfeF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgJVt0ZW1wX3JdLCAgICVbcmVhbF9zdW1fMF0sICVbdGVtcDBdLCAgJVt0ZW1wMF0gIFxuXHQiCisgICAgICAgICJtYWRkLnMgICVbdGVtcF9yMV0sICAlW3JlYWxfc3VtXzBdLCAlW3RlbXAyXSwgICVbdGVtcDJdICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXBfcjJdLCAgJVtyZWFsX3N1bV8xXSwgJVt0ZW1wMF0sICAlW3RlbXA0XSAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgJVt0ZW1wX3IzXSwgICVbaW1hZ19zdW1fMV0sICVbdGVtcDBdLCAgJVt0ZW1wNV0gIFxuXHQiCisgICAgICAgICJtYWRkLnMgICVbdGVtcF9yXSwgICAlW3RlbXBfcl0sICAgICAlW3RlbXAxXSwgICVbdGVtcDFdICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXBfcjFdLCAgJVt0ZW1wX3IxXSwgICAgJVt0ZW1wM10sICAlW3RlbXAzXSAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgJVt0ZW1wX3IyXSwgICVbdGVtcF9yMl0sICAgICVbdGVtcDFdLCAgJVt0ZW1wNV0gIFxuXHQiCisgICAgICAgICJubXN1Yi5zICAlW3RlbXBfcjNdLCAlW3RlbXBfcjNdLCAgICAlW3RlbXAxXSwgICVbdGVtcDRdICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXA0XSwgICAgMTYoJVtwX3hdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICAgIDIwKCVbcF94XSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICVbdGVtcF9yXSwgICA0MCglW3BfcGhpXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXBfcjFdLCAgMTYoJVtwX3BoaV0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wX3IyXSwgIDI0KCVbcF9waGldKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICVbdGVtcF9yM10sICAyOCglW3BfcGhpXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXBfcl0sICAgJVtyZWFsX3N1bV8xXSwgJVt0ZW1wMl0sICAlW3RlbXA0XSAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgJVt0ZW1wX3IxXSwgICVbaW1hZ19zdW1fMV0sICVbdGVtcDJdLCAgJVt0ZW1wNV0gIFxuXHQiCisgICAgICAgICJtYWRkLnMgICVbdGVtcF9yMl0sICAlW3JlYWxfc3VtXzJdLCAlW3RlbXAwXSwgICVbdGVtcDZdICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXBfcjNdLCAgJVtpbWFnX3N1bV8yXSwgJVt0ZW1wMF0sICAlW3RlbXA3XSAgXG5cdCIKKyAgICAgICAgIm1hZGQucyAgJVt0ZW1wX3JdLCAgICVbdGVtcF9yXSwgICAgICVbdGVtcDNdLCAgJVt0ZW1wNV0gIFxuXHQiCisgICAgICAgICJubXN1Yi5zICVbdGVtcF9yMV0sICAlW3RlbXBfcjFdLCAgICAlW3RlbXAzXSwgICVbdGVtcDRdICBcblx0IgorICAgICAgICAibWFkZC5zICAlW3RlbXBfcjJdLCAgJVt0ZW1wX3IyXSwgICAgJVt0ZW1wMV0sICAlW3RlbXA3XSAgXG5cdCIKKyAgICAgICAgIm5tc3ViLnMgJVt0ZW1wX3IzXSwgICVbdGVtcF9yM10sICAgICVbdGVtcDFdLCAgJVt0ZW1wNl0gIFxuXHQiCisgICAgICAgICJzd2MxICAgICVbdGVtcF9yXSwgICAwKCVbcF9waGldKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXBfcjFdLCAgNCglW3BfcGhpXSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wX3IyXSwgIDgoJVtwX3BoaV0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2MxICAgICVbdGVtcF9yM10sICAxMiglW3BfcGhpXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW3RlbXAwXSI9JmYiKHRlbXAwKSwgW3RlbXAxXSI9JmYiKHRlbXAxKSwgW3RlbXAyXSI9JmYiKHRlbXAyKSwKKyAgICAgICAgICBbdGVtcDNdIj0mZiIodGVtcDMpLCBbdGVtcDRdIj0mZiIodGVtcDQpLCBbdGVtcDVdIj0mZiIodGVtcDUpLAorICAgICAgICAgIFt0ZW1wNl0iPSZmIih0ZW1wNiksIFt0ZW1wN10iPSZmIih0ZW1wNyksIFt0ZW1wX3JdIj0mZiIodGVtcF9yKSwKKyAgICAgICAgICBbcmVhbF9zdW1fMF0iK2YiKHJlYWxfc3VtXzApLCBbcmVhbF9zdW1fMV0iK2YiKHJlYWxfc3VtXzEpLAorICAgICAgICAgIFtyZWFsX3N1bV8yXSIrZiIocmVhbF9zdW1fMiksIFtpbWFnX3N1bV8xXSIrZiIoaW1hZ19zdW1fMSksCisgICAgICAgICAgW3RlbXBfcjJdIj0mZiIodGVtcF9yMiksIFt0ZW1wX3IzXSI9JmYiKHRlbXBfcjMpLAorICAgICAgICAgIFt0ZW1wX3IxXSI9JmYiKHRlbXBfcjEpLCBbcF9waGldIityIihwX3BoaSksCisgICAgICAgICAgW2ltYWdfc3VtXzJdIitmIihpbWFnX3N1bV8yKQorICAgICAgICA6IFtwX3hdInIiKHBfeCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkIHNicl9oZl9nZW5fbWlwcyhmbG9hdCAoKlhfaGlnaClbMl0sIGNvbnN0IGZsb2F0ICgqWF9sb3cpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGFscGhhMFsyXSwgY29uc3QgZmxvYXQgYWxwaGExWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJ3LCBpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICAgZmxvYXQgYWxwaGFbNF07CisgICAgaW50IGk7CisgICAgZmxvYXQgKnBfeF9sb3cgPSAoZmxvYXQqKSZYX2xvd1swXVswXSArIDIqc3RhcnQ7CisgICAgZmxvYXQgKnBfeF9oaWdoID0gJlhfaGlnaFswXVswXSArIDIqc3RhcnQ7CisgICAgZmxvYXQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDY7CisgICAgZmxvYXQgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMjsKKworICAgIGFscGhhWzBdID0gYWxwaGExWzBdICogYncgKiBidzsKKyAgICBhbHBoYVsxXSA9IGFscGhhMVsxXSAqIGJ3ICogYnc7CisgICAgYWxwaGFbMl0gPSBhbHBoYTBbMF0gKiBidzsKKyAgICBhbHBoYVszXSA9IGFscGhhMFsxXSAqIGJ3OworCisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDBdLCAgICAtMTYoJVtwX3hfbG93XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wMV0sICAgIC0xMiglW3BfeF9sb3ddKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAyXSwgICAgLTgoJVtwX3hfbG93XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDNdLCAgICAtNCglW3BfeF9sb3ddKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNV0sICAgIDAoJVtwX3hfbG93XSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA2XSwgICAgNCglW3BfeF9sb3ddKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDddLCAgICAwKCVbYWxwaGFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wOF0sICAgIDQoJVthbHBoYV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA5XSwgICAgOCglW2FscGhhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDEwXSwgICAxMiglW2FscGhhXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgJVtwX3hfaGlnaF0sICVbcF94X2hpZ2hdLCAgICAgOCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAlW3BfeF9sb3ddLCAgJVtwX3hfbG93XSwgICAgICA4ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICVbdGVtcDExXSwgICAlW3RlbXAxXSwgICAgICAgICVbdGVtcDhdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1zdWIucyAgJVt0ZW1wMTFdLCAgICVbdGVtcDExXSwgICAgICAgJVt0ZW1wMF0sICAlW3RlbXA3XSAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAxMV0sICAgJVt0ZW1wMTFdLCAgICAgICAlW3RlbXAyXSwgICVbdGVtcDldICAgXG5cdCIKKyAgICAgICAgICAgICJubXN1Yi5zICVbdGVtcDExXSwgICAlW3RlbXAxMV0sICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wMTBdICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgJVt0ZW1wMTFdLCAgICVbdGVtcDExXSwgICAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICAlW3RlbXAxMV0sICAgLTgoJVtwX3hfaGlnaF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICVbdGVtcDEyXSwgICAlW3RlbXAxXSwgICAgICAgICVbdGVtcDddICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgJVt0ZW1wMTJdLCAgICVbdGVtcDEyXSwgICAgICAgJVt0ZW1wMF0sICAlW3RlbXA4XSAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAxMl0sICAgJVt0ZW1wMTJdLCAgICAgICAlW3RlbXAzXSwgICVbdGVtcDldICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICVbdGVtcDEyXSwgICAlW3RlbXAxMl0sICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMTBdICBcblx0IgorICAgICAgICAgICAgImFkZC5zICAgJVt0ZW1wMTJdLCAgICVbdGVtcDEyXSwgICAgICAgJVt0ZW1wNl0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICAlW3RlbXAxMl0sICAgLTQoJVtwX3hfaGlnaF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbdGVtcDBdIj0mZiIodGVtcDApLCBbdGVtcDFdIj0mZiIodGVtcDEpLCBbdGVtcDJdIj0mZiIodGVtcDIpLAorICAgICAgICAgICAgICBbdGVtcDNdIj0mZiIodGVtcDMpLCBbdGVtcDRdIj0mZiIodGVtcDQpLCBbdGVtcDVdIj0mZiIodGVtcDUpLAorICAgICAgICAgICAgICBbdGVtcDZdIj0mZiIodGVtcDYpLCBbdGVtcDddIj0mZiIodGVtcDcpLCBbdGVtcDhdIj0mZiIodGVtcDgpLAorICAgICAgICAgICAgICBbdGVtcDldIj0mZiIodGVtcDkpLCBbdGVtcDEwXSI9JmYiKHRlbXAxMCksIFt0ZW1wMTFdIj0mZiIodGVtcDExKSwKKyAgICAgICAgICAgICAgW3RlbXAxMl0iPSZmIih0ZW1wMTIpLCBbcF94X2hpZ2hdIityIihwX3hfaGlnaCksCisgICAgICAgICAgICAgIFtwX3hfbG93XSIrciIocF94X2xvdykKKyAgICAgICAgICAgIDogW2FscGhhXSJyIihhbHBoYSkKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNicl9oZl9nX2ZpbHRfbWlwcyhmbG9hdCAoKlkpWzJdLCBjb25zdCBmbG9hdCAoKlhfaGlnaClbNDBdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpnX2ZpbHQsIGludCBtX21heCwgaW50cHRyX3QgaXhoKQoreworICAgIGZsb2F0ICpwX3ksICpwX3gsICpwX2c7CisgICAgZmxvYXQgdGVtcDAsIHRlbXAxLCB0ZW1wMjsKKyAgICBpbnQgbG9vcF9lbmQ7CisKKyAgICBwX2cgPSAoZmxvYXQqKSZnX2ZpbHRbMF07CisgICAgcF95ID0gJllbMF1bMF07CisgICAgcF94ID0gKGZsb2F0KikmWF9oaWdoWzBdW2l4aF1bMF07CisgICAgbG9vcF9lbmQgPSAoaW50KSgoaW50KilwX2cgKyBtX21heCk7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAiLnNldCAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiLnNldCAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXAwXSwgICAwKCVbcF9nXSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXAxXSwgICAwKCVbcF94XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdjMSAgICAlW3RlbXAyXSwgICA0KCVbcF94XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICVbdGVtcDBdICBcblx0IgorICAgICAgICAibXVsLnMgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICVbdGVtcDBdICBcblx0IgorICAgICAgICAiYWRkaXUgICAlW3BfZ10sICAgICAlW3BfZ10sICAgICAgIDQgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAlW3BfeF0sICAgICAlW3BfeF0sICAgICAgIDMyMCAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXAxXSwgICAwKCVbcF95XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3djMSAgICAlW3RlbXAyXSwgICA0KCVbcF95XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICAlW3BfZ10sICAgICAlW2xvb3BfZW5kXSwgIDFiICAgICAgICBcblx0IgorICAgICAgICAiIGFkZGl1ICAlW3BfeV0sICAgICAlW3BfeV0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICAgICAiLnNldCAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDogW3RlbXAwXSI9JmYiKHRlbXAwKSwgW3RlbXAxXSI9JmYiKHRlbXAxKSwKKyAgICAgICAgICBbdGVtcDJdIj0mZiIodGVtcDIpLCBbcF94XSIrciIocF94KSwKKyAgICAgICAgICBbcF95XSIrciIocF95KSwgW3BfZ10iK3IiKHBfZykKKyAgICAgICAgOiBbbG9vcF9lbmRdInIiKGxvb3BfZW5kKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKworc3RhdGljIHZvaWQgc2JyX2hmX2FwcGx5X25vaXNlXzBfbWlwcyhmbG9hdCAoKlkpWzJdLCBjb25zdCBmbG9hdCAqc19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdCwgaW50IG5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGt4LCBpbnQgbV9tYXgpCit7CisgICAgaW50IG07CisKKyAgICBmb3IgKG0gPSAwOyBtIDwgbV9tYXg7IG0rKyl7CisKKyAgICAgICAgZmxvYXQgKlkxPSZZW21dWzBdOworICAgICAgICBmbG9hdCAqZmZfdGFibGU7CisgICAgICAgIGZsb2F0IHkwLHkxLCB0ZW1wMSwgdGVtcDIsIHRlbXA0LCB0ZW1wNTsKKyAgICAgICAgaW50IHRlbXAwLCB0ZW1wMzsKKyAgICAgICAgY29uc3QgZmxvYXQgKnNfbTE9JnNfbVttXTsKKyAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdDE9ICZxX2ZpbHRbbV07CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJsd2MxICAgICVbeTBdLCAgICAgICAwKCVbWTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAxXSwgICAgMCglW3NfbTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgJVtub2lzZV0sICAgICVbbm9pc2VdLCAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhbmRpICAgICVbbm9pc2VdLCAgICAlW25vaXNlXSwgICAgICAgICAgICAgIDB4MWZmICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic2xsICAgICAlW3RlbXAwXSwgICAgJVtub2lzZV0sIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZHUgICAgJVtmZl90YWJsZV0sICVbZmZfc2JyX25vaXNlX3RhYmxlXSwgJVt0ZW1wMF0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQucyAgICVbeTBdLCAgICAgICAlW3kwXSwgICAgICAgICAgICAgICAgICVbdGVtcDFdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWZjMSAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImJuZSAgICAgJVt0ZW1wM10sICAgICQwLCAgICAgICAgICAgICAgICAgICAgMWYgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbeTFdLCAgICAgICA0KCVbWTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXAyXSwgICAgMCglW3FfZmlsdDFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNF0sICAgIDAoJVtmZl90YWJsZV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDVdLCAgICA0KCVbZmZfdGFibGVdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAlW3kwXSwgICAgICAgJVt5MF0sICAgICAgICAgICAgICAgICAlW3RlbXAyXSwgICVbdGVtcDRdICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgJVt5MV0sICAgICAgICVbeTFdLCAgICAgICAgICAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXA1XSAgXG5cdCIKKyAgICAgICAgICAgICJzd2MxICAgICVbeTFdLCAgICAgICA0KCVbWTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgJVt5MF0sICAgICAgIDAoJVtZMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbZmZfdGFibGVdIj0mciIoZmZfdGFibGUpLCBbeTBdIj0mZiIoeTApLCBbeTFdIj0mZiIoeTEpLAorICAgICAgICAgICAgICBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mZiIodGVtcDEpLCBbdGVtcDJdIj0mZiIodGVtcDIpLAorICAgICAgICAgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mZiIodGVtcDQpLCBbdGVtcDVdIj0mZiIodGVtcDUpCisgICAgICAgICAgICA6IFtmZl9zYnJfbm9pc2VfdGFibGVdInIiKGZmX3Nicl9ub2lzZV90YWJsZSksIFtub2lzZV0iciIobm9pc2UpLAorICAgICAgICAgICAgICBbWTFdInIiKFkxKSwgW3NfbTFdInIiKHNfbTEpLCBbcV9maWx0MV0iciIocV9maWx0MSkKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNicl9oZl9hcHBseV9ub2lzZV8xX21pcHMoZmxvYXQgKCpZKVsyXSwgY29uc3QgZmxvYXQgKnNfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpxX2ZpbHQsIGludCBub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBreCwgaW50IG1fbWF4KQoreworICAgIGZsb2F0IHkwLHkxLHRlbXAxLCB0ZW1wMiwgdGVtcDQsIHRlbXA1OworICAgIGludCB0ZW1wMCwgdGVtcDMsIG07CisgICAgZmxvYXQgcGhpX3NpZ24gPSAxIC0gMiAqIChreCAmIDEpOworCisgICAgZm9yIChtID0gMDsgbSA8IG1fbWF4OyBtKyspIHsKKworICAgICAgICBmbG9hdCAqZmZfdGFibGU7CisgICAgICAgIGZsb2F0ICpZMT0mWVttXVswXTsKKyAgICAgICAgY29uc3QgZmxvYXQgKnNfbTE9JnNfbVttXTsKKyAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdDE9ICZxX2ZpbHRbbV07CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJsd2MxICAgJVt5MV0sICAgICAgIDQoJVtZMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbdGVtcDFdLCAgICAwKCVbc19tMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3ICAgICAlW3RlbXAzXSwgICAgMCglW3NfbTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgJVtub2lzZV0sICAgICVbbm9pc2VdLCAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYW5kaSAgICVbbm9pc2VdLCAgICAlW25vaXNlXSwgICAgICAgICAgICAgICAweDFmZiAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsbCAgICAlW3RlbXAwXSwgICAgJVtub2lzZV0sICAgICAgICAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGR1ICAgJVtmZl90YWJsZV0sICVbZmZfc2JyX25vaXNlX3RhYmxlXSwgJVt0ZW1wMF0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICVbeTFdLCAgICAgICAlW3kxXSwgICAgICAgICAgICAgICAgICVbdGVtcDFdLCAlW3BoaV9zaWduXSBcblx0IgorICAgICAgICAgICAgImJuZSAgICAlW3RlbXAzXSwgICAgJDAsICAgICAgICAgICAgICAgICAgICAxZiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgJVt5MF0sICAgICAgIDAoJVtZMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbdGVtcDJdLCAgICAwKCVbcV9maWx0MV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAlW3RlbXA0XSwgICAgMCglW2ZmX3RhYmxlXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgJVt0ZW1wNV0sICAgIDQoJVtmZl90YWJsZV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICVbeTBdLCAgICAgICAlW3kwXSwgICAgICAgICAgICAgICAgICVbdGVtcDJdLCAlW3RlbXA0XSAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAlW3kxXSwgICAgICAgJVt5MV0sICAgICAgICAgICAgICAgICAlW3RlbXAyXSwgJVt0ZW1wNV0gICAgXG5cdCIKKyAgICAgICAgICAgICJzd2MxICAgJVt5MF0sICAgICAgIDAoJVtZMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAlW3kxXSwgICAgICAgNCglW1kxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiBbZmZfdGFibGVdICI9JnIiIChmZl90YWJsZSksIFt5MF0gIj0mZiIgKHkwKSwgW3kxXSAiPSZmIiAoeTEpLAorICAgICAgICAgICAgICBbdGVtcDBdICI9JnIiICh0ZW1wMCksIFt0ZW1wMV0gIj0mZiIgKHRlbXAxKSwgW3RlbXAyXSAiPSZmIiAodGVtcDIpLAorICAgICAgICAgICAgICBbdGVtcDNdICI9JnIiICh0ZW1wMyksIFt0ZW1wNF0gIj0mZiIgKHRlbXA0KSwgW3RlbXA1XSAiPSZmIiAodGVtcDUpCisgICAgICAgICAgICA6IFtmZl9zYnJfbm9pc2VfdGFibGVdICJyIiAoZmZfc2JyX25vaXNlX3RhYmxlKSwgW25vaXNlXSAiciIgKG5vaXNlKSwKKyAgICAgICAgICAgICAgW1kxXSAiciIgKFkxKSwgW3NfbTFdICJyIiAoc19tMSksIFtxX2ZpbHQxXSAiciIgKHFfZmlsdDEpLAorICAgICAgICAgICAgICBbcGhpX3NpZ25dICJmIiAocGhpX3NpZ24pCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgICAgIHBoaV9zaWduID0gLXBoaV9zaWduOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2JyX2hmX2FwcGx5X25vaXNlXzJfbWlwcyhmbG9hdCAoKlkpWzJdLCBjb25zdCBmbG9hdCAqc19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdCwgaW50IG5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGt4LCBpbnQgbV9tYXgpCit7CisgICAgaW50IG07CisgICAgZmxvYXQgKmZmX3RhYmxlOworICAgIGZsb2F0IHkwLHkxLCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworCisgICAgZm9yIChtID0gMDsgbSA8IG1fbWF4OyBtKyspIHsKKworICAgICAgICBmbG9hdCAqWTE9JllbbV1bMF07CisgICAgICAgIGNvbnN0IGZsb2F0ICpzX20xPSZzX21bbV07CisgICAgICAgIGNvbnN0IGZsb2F0ICpxX2ZpbHQxPSAmcV9maWx0W21dOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibHdjMSAgICVbeTBdLCAgICAgICAwKCVbWTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAlW3RlbXAxXSwgICAgMCglW3NfbTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgJVtub2lzZV0sICAgICVbbm9pc2VdLCAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYW5kaSAgICVbbm9pc2VdLCAgICAlW25vaXNlXSwgICAgICAgICAgICAgIDB4MWZmICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInNsbCAgICAlW3RlbXAwXSwgICAgJVtub2lzZV0sICAgICAgICAgICAgICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGR1ICAgJVtmZl90YWJsZV0sICVbZmZfc2JyX25vaXNlX3RhYmxlXSwgJVt0ZW1wMF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3ViLnMgICVbeTBdLCAgICAgICAlW3kwXSwgICAgICAgICAgICAgICAgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1mYzEgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJibmUgICAgJVt0ZW1wM10sICAgICQwLCAgICAgICAgICAgICAgICAgICAgMWYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbeTFdLCAgICAgICA0KCVbWTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAlW3RlbXAyXSwgICAgMCglW3FfZmlsdDFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgJVt0ZW1wNF0sICAgIDAoJVtmZl90YWJsZV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbdGVtcDVdLCAgICA0KCVbZmZfdGFibGVdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAlW3kwXSwgICAgICAgJVt5MF0sICAgICAgICAgICAgICAgICAlW3RlbXAyXSwgJVt0ZW1wNF0gXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgJVt5MV0sICAgICAgICVbeTFdLCAgICAgICAgICAgICAgICAgJVt0ZW1wMl0sICVbdGVtcDVdIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbeTFdLCAgICAgICA0KCVbWTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzd2MxICAgJVt5MF0sICAgICAgIDAoJVtZMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW2ZmX3RhYmxlXSI9JnIiKGZmX3RhYmxlKSwgW3kwXSI9JmYiKHkwKSwKKyAgICAgICAgICAgICAgW3kxXSI9JmYiKHkxKSwgW3RlbXAxXSI9JmYiKHRlbXAxKSwgW3RlbXAyXSI9JmYiKHRlbXAyKSwKKyAgICAgICAgICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JmYiKHRlbXA0KSwgW3RlbXA1XSI9JmYiKHRlbXA1KQorICAgICAgICAgICAgOiBbZmZfc2JyX25vaXNlX3RhYmxlXSJyIihmZl9zYnJfbm9pc2VfdGFibGUpLCBbbm9pc2VdInIiKG5vaXNlKSwKKyAgICAgICAgICAgICAgW1kxXSJyIihZMSksIFtzX20xXSJyIihzX20xKSwgW3FfZmlsdDFdInIiKHFfZmlsdDEpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzYnJfaGZfYXBwbHlfbm9pc2VfM19taXBzKGZsb2F0ICgqWSlbMl0sIGNvbnN0IGZsb2F0ICpzX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqcV9maWx0LCBpbnQgbm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga3gsIGludCBtX21heCkKK3sKKyAgICBmbG9hdCBwaGlfc2lnbiA9IDEgLSAyICogKGt4ICYgMSk7CisgICAgaW50IG07CisKKyAgICBmb3IgKG0gPSAwOyBtIDwgbV9tYXg7IG0rKykgeworCisgICAgICAgIGZsb2F0ICpZMT0mWVttXVswXTsKKyAgICAgICAgZmxvYXQgKmZmX3RhYmxlOworICAgICAgICBmbG9hdCB5MCx5MSwgdGVtcDEsIHRlbXAyLCB0ZW1wNCwgdGVtcDU7CisgICAgICAgIGludCB0ZW1wMCwgdGVtcDM7CisgICAgICAgIGNvbnN0IGZsb2F0ICpzX20xPSZzX21bbV07CisgICAgICAgIGNvbnN0IGZsb2F0ICpxX2ZpbHQxPSAmcV9maWx0W21dOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibHdjMSAgICAlW3kxXSwgICAgICAgNCglW1kxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDFdLCAgICAwKCVbc19tMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgJVtub2lzZV0sICAgICVbbm9pc2VdLCAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYW5kaSAgICAlW25vaXNlXSwgICAgJVtub2lzZV0sICAgICAgICAgICAgICAweDFmZiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzbGwgICAgICVbdGVtcDBdLCAgICAlW25vaXNlXSwgICAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZHUgICAgJVtmZl90YWJsZV0sICVbZmZfc2JyX25vaXNlX3RhYmxlXSwgJVt0ZW1wMF0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibm1zdWIucyAlW3kxXSwgICAgICAgJVt5MV0sICAgICAgICAgICAgICAgICAlW3RlbXAxXSwgJVtwaGlfc2lnbl0gXG5cdCIKKyAgICAgICAgICAgICJtZmMxICAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImJuZSAgICAgJVt0ZW1wM10sICAgICQwLCAgICAgICAgICAgICAgICAgICAgMWYgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3kwXSwgICAgICAgMCglW1kxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICVbdGVtcDJdLCAgICAwKCVbcV9maWx0MV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgJVt0ZW1wNF0sICAgIDAoJVtmZl90YWJsZV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAlW3RlbXA1XSwgICAgNCglW2ZmX3RhYmxlXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgICVbeTBdLCAgICAgICAlW3kwXSwgICAgICAgICAgICAgICAgICVbdGVtcDJdLCAlW3RlbXA0XSAgICBcblx0IgorICAgICAgICAgICAgIm1hZGQucyAgJVt5MV0sICAgICAgICVbeTFdLCAgICAgICAgICAgICAgICAgJVt0ZW1wMl0sICVbdGVtcDVdICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICAlW3kwXSwgICAgICAgMCglW1kxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgJVt5MV0sICAgICAgIDQoJVtZMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW2ZmX3RhYmxlXSI9JnIiKGZmX3RhYmxlKSwgW3kwXSI9JmYiKHkwKSwgW3kxXSI9JmYiKHkxKSwKKyAgICAgICAgICAgICAgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JmYiKHRlbXAxKSwgW3RlbXAyXSI9JmYiKHRlbXAyKSwKKyAgICAgICAgICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JmYiKHRlbXA0KSwgW3RlbXA1XSI9JmYiKHRlbXA1KQorICAgICAgICAgICAgOiBbZmZfc2JyX25vaXNlX3RhYmxlXSJyIihmZl9zYnJfbm9pc2VfdGFibGUpLCBbbm9pc2VdInIiKG5vaXNlKSwKKyAgICAgICAgICAgICAgW1kxXSJyIihZMSksIFtzX20xXSJyIihzX20xKSwgW3FfZmlsdDFdInIiKHFfZmlsdDEpLAorICAgICAgICAgICAgICBbcGhpX3NpZ25dImYiKHBoaV9zaWduKQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgICAgIHBoaV9zaWduID0gLXBoaV9zaWduOworICAgIH0KK30KKyNlbmRpZiAvKiBIQVZFX01JUFNGUFUgKi8KKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKwordm9pZCBmZl9zYnJkc3BfaW5pdF9taXBzKFNCUkRTUENvbnRleHQgKnMpCit7CisjaWYgSEFWRV9JTkxJTkVfQVNNCisgICAgcy0+bmVnX29kZF82NCA9IHNicl9uZWdfb2RkXzY0X21pcHM7CisgICAgcy0+cW1mX3ByZV9zaHVmZmxlID0gc2JyX3FtZl9wcmVfc2h1ZmZsZV9taXBzOworICAgIHMtPnFtZl9wb3N0X3NodWZmbGUgPSBzYnJfcW1mX3Bvc3Rfc2h1ZmZsZV9taXBzOworI2lmIEhBVkVfTUlQU0ZQVQorICAgIHMtPnN1bTY0eDUgPSBzYnJfc3VtNjR4NV9taXBzOworICAgIHMtPnN1bV9zcXVhcmUgPSBzYnJfc3VtX3NxdWFyZV9taXBzOworICAgIHMtPnFtZl9kZWludF9iZmx5ID0gc2JyX3FtZl9kZWludF9iZmx5X21pcHM7CisgICAgcy0+YXV0b2NvcnJlbGF0ZSA9IHNicl9hdXRvY29ycmVsYXRlX21pcHM7CisgICAgcy0+aGZfZ2VuID0gc2JyX2hmX2dlbl9taXBzOworICAgIHMtPmhmX2dfZmlsdCA9IHNicl9oZl9nX2ZpbHRfbWlwczsKKworICAgIHMtPmhmX2FwcGx5X25vaXNlWzBdID0gc2JyX2hmX2FwcGx5X25vaXNlXzBfbWlwczsKKyAgICBzLT5oZl9hcHBseV9ub2lzZVsxXSA9IHNicl9oZl9hcHBseV9ub2lzZV8xX21pcHM7CisgICAgcy0+aGZfYXBwbHlfbm9pc2VbMl0gPSBzYnJfaGZfYXBwbHlfbm9pc2VfMl9taXBzOworICAgIHMtPmhmX2FwcGx5X25vaXNlWzNdID0gc2JyX2hmX2FwcGx5X25vaXNlXzNfbWlwczsKKyNlbmRpZiAvKiBIQVZFX01JUFNGUFUgKi8KKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21qcGVnLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZDdiMTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tanBlZy5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogTUpQRUcgZW5jb2RlciBhbmQgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAzIEFsZXggQmVyZWdzemFzemkKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBTdXBwb3J0IGZvciBleHRlcm5hbCBodWZmbWFuIHRhYmxlLCB2YXJpb3VzIGZpeGVzIChBVklEIHdvcmthcm91bmQpLAorICogYXNwZWN0aW5nLCBuZXcgZGVjb2RlX2ZyYW1lIG1lY2hhbmlzbSBhbmQgYXBwbGUgbWpwZWctYiBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBBbGV4IEJlcmVnc3phc3ppCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1KUEVHIGVuY29kZXIgYW5kIGRlY29kZXIuCisgKi8KKworI2luY2x1ZGUgIm1qcGVnLmgiCisKKworI2lmIDAKKy8qIFRoZXNlIGFyZSB0aGUgc2FtcGxlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gSlBFRyBzcGVjIHNlY3Rpb24gSy4xLgorICogVGhlIHNwZWMgc2F5cyB0aGF0IHRoZSB2YWx1ZXMgZ2l2ZW4gcHJvZHVjZSAiZ29vZCIgcXVhbGl0eSwgYW5kCisgKiB3aGVuIGRpdmlkZWQgYnkgMiwgInZlcnkgZ29vZCIgcXVhbGl0eS4KKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3RkX2x1bWluYW5jZV9xdWFudF90YmxbNjRdID0geworICAgIDE2LCAgMTEsICAxMCwgIDE2LCAgMjQsICA0MCwgIDUxLCAgNjEsCisgICAgMTIsICAxMiwgIDE0LCAgMTksICAyNiwgIDU4LCAgNjAsICA1NSwKKyAgICAxNCwgIDEzLCAgMTYsICAyNCwgIDQwLCAgNTcsICA2OSwgIDU2LAorICAgIDE0LCAgMTcsICAyMiwgIDI5LCAgNTEsICA4NywgIDgwLCAgNjIsCisgICAgMTgsICAyMiwgIDM3LCAgNTYsICA2OCwgMTA5LCAxMDMsICA3NywKKyAgICAyNCwgIDM1LCAgNTUsICA2NCwgIDgxLCAxMDQsIDExMywgIDkyLAorICAgIDQ5LCAgNjQsICA3OCwgIDg3LCAxMDMsIDEyMSwgMTIwLCAxMDEsCisgICAgNzIsICA5MiwgIDk1LCAgOTgsIDExMiwgMTAwLCAxMDMsICA5OQorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHN0ZF9jaHJvbWluYW5jZV9xdWFudF90YmxbNjRdID0geworICAgIDE3LCAgMTgsICAyNCwgIDQ3LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgMTgsICAyMSwgIDI2LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICAyNCwgIDI2LCAgNTYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDQ3LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OQorfTsKKyNlbmRpZgorCisvKiBTZXQgdXAgdGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIChjZi4gSlBFRyBzdGFuZGFyZCBzZWN0aW9uIEsuMykgKi8KKy8qIElNUE9SVEFOVDogdGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIDgtYml0IGRhdGEgcHJlY2lzaW9uISAqLworY29uc3QgdWludDhfdCBhdnByaXZfbWpwZWdfYml0c19kY19sdW1pbmFuY2VbMTddID0KK3sgLyogMC1iYXNlICovIDAsIDAsIDEsIDUsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKK2NvbnN0IHVpbnQ4X3QgYXZwcml2X21qcGVnX3ZhbF9kY1sxMl0gPQoreyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEgfTsKKworY29uc3QgdWludDhfdCBhdnByaXZfbWpwZWdfYml0c19kY19jaHJvbWluYW5jZVsxN10gPQoreyAvKiAwLWJhc2UgKi8gMCwgMCwgMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCB9OworCitjb25zdCB1aW50OF90IGF2cHJpdl9tanBlZ19iaXRzX2FjX2x1bWluYW5jZVsxN10gPQoreyAvKiAwLWJhc2UgKi8gMCwgMCwgMiwgMSwgMywgMywgMiwgNCwgMywgNSwgNSwgNCwgNCwgMCwgMCwgMSwgMHg3ZCB9OworY29uc3QgdWludDhfdCBhdnByaXZfbWpwZWdfdmFsX2FjX2x1bWluYW5jZVtdID0KK3sgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwKKyAgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywKKyAgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhhMSwgMHgwOCwKKyAgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwgMHgxNSwgMHg1MiwgMHhkMSwgMHhmMCwKKyAgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwKKyAgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwKKyAgMHgyOSwgMHgyYSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKKyAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwKKyAgMHg0YSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwKKyAgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwKKyAgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwKKyAgMHg3YSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwKKyAgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwKKyAgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywKKyAgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwKKyAgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwKKyAgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwKKyAgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMSwgMHhlMiwKKyAgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwKKyAgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgMHhmOSwgMHhmYQorfTsKKworY29uc3QgdWludDhfdCBhdnByaXZfbWpwZWdfYml0c19hY19jaHJvbWluYW5jZVsxN10gPQoreyAvKiAwLWJhc2UgKi8gMCwgMCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMHg3NyB9OworCitjb25zdCB1aW50OF90IGF2cHJpdl9tanBlZ192YWxfYWNfY2hyb21pbmFuY2VbXSA9Cit7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsCisgIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsCisgIDB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsIDB4NDIsIDB4OTEsCisgIDB4YTEsIDB4YjEsIDB4YzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4ZjAsCisgIDB4MTUsIDB4NjIsIDB4NzIsIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsCisgIDB4ZTEsIDB4MjUsIDB4ZjEsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjYsCisgIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsCisgIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsCisgIDB4NDksIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsCisgIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsCisgIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCisgIDB4NzksIDB4N2EsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCisgIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsCisgIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsCisgIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsCisgIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsCisgIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsCisgIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsCisgIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksCisgIDB4ZWEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgIDB4ZjksIDB4ZmEKK307CisKKy8qIGlzbid0IHRoaXMgZnVuY3Rpb24gbmljZXIgdGhhbiB0aGUgb25lIGluIHRoZSBsaWJqcGVnID8gKi8KK3ZvaWQgZmZfbWpwZWdfYnVpbGRfaHVmZm1hbl9jb2Rlcyh1aW50OF90ICpodWZmX3NpemUsIHVpbnQxNl90ICpodWZmX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYml0c190YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp2YWxfdGFibGUpCit7CisgICAgaW50IGksIGosIGssbmIsIGNvZGUsIHN5bTsKKworICAgIGNvZGUgPSAwOworICAgIGsgPSAwOworICAgIGZvcihpPTE7aTw9MTY7aSsrKSB7CisgICAgICAgIG5iID0gYml0c190YWJsZVtpXTsKKyAgICAgICAgZm9yKGo9MDtqPG5iO2orKykgeworICAgICAgICAgICAgc3ltID0gdmFsX3RhYmxlW2srK107CisgICAgICAgICAgICBodWZmX3NpemVbc3ltXSA9IGk7CisgICAgICAgICAgICBodWZmX2NvZGVbc3ltXSA9IGNvZGU7CisgICAgICAgICAgICBjb2RlKys7CisgICAgICAgIH0KKyAgICAgICAgY29kZSA8PD0gMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tanBlZy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2RiMWRkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWcuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIE1KUEVHIGVuY29kZXIgYW5kIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMyBBbGV4IEJlcmVnc3phc3ppCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogU3VwcG9ydCBmb3IgZXh0ZXJuYWwgaHVmZm1hbiB0YWJsZSwgdmFyaW91cyBmaXhlcyAoQVZJRCB3b3JrYXJvdW5kKSwKKyAqIGFzcGVjdGluZywgbmV3IGRlY29kZV9mcmFtZSBtZWNoYW5pc20gYW5kIGFwcGxlIG1qcGVnLWIgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNSlBFRyBlbmNvZGVyIGFuZCBkZWNvZGVyLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NSlBFR19ICisjZGVmaW5lIEFWQ09ERUNfTUpQRUdfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKworLyogSlBFRyBtYXJrZXIgY29kZXMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgLyogc3RhcnQgb2YgZnJhbWUgKi8KKyAgICBTT0YwICA9IDB4YzAsICAgICAgIC8qIGJhc2VsaW5lICovCisgICAgU09GMSAgPSAweGMxLCAgICAgICAvKiBleHRlbmRlZCBzZXF1ZW50aWFsLCBodWZmbWFuICovCisgICAgU09GMiAgPSAweGMyLCAgICAgICAvKiBwcm9ncmVzc2l2ZSwgaHVmZm1hbiAqLworICAgIFNPRjMgID0gMHhjMywgICAgICAgLyogbG9zc2xlc3MsIGh1ZmZtYW4gKi8KKworICAgIFNPRjUgID0gMHhjNSwgICAgICAgLyogZGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIGh1ZmZtYW4gKi8KKyAgICBTT0Y2ICA9IDB4YzYsICAgICAgIC8qIGRpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgaHVmZm1hbiAqLworICAgIFNPRjcgID0gMHhjNywgICAgICAgLyogZGlmZmVyZW50aWFsIGxvc3NsZXNzLCBodWZmbWFuICovCisgICAgSlBHICAgPSAweGM4LCAgICAgICAvKiByZXNlcnZlZCBmb3IgSlBFRyBleHRlbnNpb24gKi8KKyAgICBTT0Y5ICA9IDB4YzksICAgICAgIC8qIGV4dGVuZGVkIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KKyAgICBTT0YxMCA9IDB4Y2EsICAgICAgIC8qIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCisgICAgU09GMTEgPSAweGNiLCAgICAgICAvKiBsb3NzbGVzcywgYXJpdGhtZXRpYyAqLworCisgICAgU09GMTMgPSAweGNkLCAgICAgICAvKiBkaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLworICAgIFNPRjE0ID0gMHhjZSwgICAgICAgLyogZGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCisgICAgU09GMTUgPSAweGNmLCAgICAgICAvKiBkaWZmZXJlbnRpYWwgbG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KKworICAgIERIVCAgID0gMHhjNCwgICAgICAgLyogZGVmaW5lIGh1ZmZtYW4gdGFibGVzICovCisKKyAgICBEQUMgICA9IDB4Y2MsICAgICAgIC8qIGRlZmluZSBhcml0aG1ldGljLWNvZGluZyBjb25kaXRpb25pbmcgKi8KKworICAgIC8qIHJlc3RhcnQgd2l0aCBtb2R1bG8gOCBjb3VudCAibSIgKi8KKyAgICBSU1QwICA9IDB4ZDAsCisgICAgUlNUMSAgPSAweGQxLAorICAgIFJTVDIgID0gMHhkMiwKKyAgICBSU1QzICA9IDB4ZDMsCisgICAgUlNUNCAgPSAweGQ0LAorICAgIFJTVDUgID0gMHhkNSwKKyAgICBSU1Q2ICA9IDB4ZDYsCisgICAgUlNUNyAgPSAweGQ3LAorCisgICAgU09JICAgPSAweGQ4LCAgICAgICAvKiBzdGFydCBvZiBpbWFnZSAqLworICAgIEVPSSAgID0gMHhkOSwgICAgICAgLyogZW5kIG9mIGltYWdlICovCisgICAgU09TICAgPSAweGRhLCAgICAgICAvKiBzdGFydCBvZiBzY2FuICovCisgICAgRFFUICAgPSAweGRiLCAgICAgICAvKiBkZWZpbmUgcXVhbnRpemF0aW9uIHRhYmxlcyAqLworICAgIEROTCAgID0gMHhkYywgICAgICAgLyogZGVmaW5lIG51bWJlciBvZiBsaW5lcyAqLworICAgIERSSSAgID0gMHhkZCwgICAgICAgLyogZGVmaW5lIHJlc3RhcnQgaW50ZXJ2YWwgKi8KKyAgICBESFAgICA9IDB4ZGUsICAgICAgIC8qIGRlZmluZSBoaWVyYXJjaGljYWwgcHJvZ3Jlc3Npb24gKi8KKyAgICBFWFAgICA9IDB4ZGYsICAgICAgIC8qIGV4cGFuZCByZWZlcmVuY2UgY29tcG9uZW50cyAqLworCisgICAgQVBQMCAgPSAweGUwLAorICAgIEFQUDEgID0gMHhlMSwKKyAgICBBUFAyICA9IDB4ZTIsCisgICAgQVBQMyAgPSAweGUzLAorICAgIEFQUDQgID0gMHhlNCwKKyAgICBBUFA1ICA9IDB4ZTUsCisgICAgQVBQNiAgPSAweGU2LAorICAgIEFQUDcgID0gMHhlNywKKyAgICBBUFA4ICA9IDB4ZTgsCisgICAgQVBQOSAgPSAweGU5LAorICAgIEFQUDEwID0gMHhlYSwKKyAgICBBUFAxMSA9IDB4ZWIsCisgICAgQVBQMTIgPSAweGVjLAorICAgIEFQUDEzID0gMHhlZCwKKyAgICBBUFAxNCA9IDB4ZWUsCisgICAgQVBQMTUgPSAweGVmLAorCisgICAgSlBHMCAgPSAweGYwLAorICAgIEpQRzEgID0gMHhmMSwKKyAgICBKUEcyICA9IDB4ZjIsCisgICAgSlBHMyAgPSAweGYzLAorICAgIEpQRzQgID0gMHhmNCwKKyAgICBKUEc1ICA9IDB4ZjUsCisgICAgSlBHNiAgPSAweGY2LAorICAgIFNPRjQ4ID0gMHhmNywgICAgICAgLy8vPCBKUEVHLUxTCisgICAgTFNFICAgPSAweGY4LCAgICAgICAvLy88IEpQRUctTFMgZXh0ZW5zaW9uIHBhcmFtZXRlcnMKKyAgICBKUEc5ICA9IDB4ZjksCisgICAgSlBHMTAgPSAweGZhLAorICAgIEpQRzExID0gMHhmYiwKKyAgICBKUEcxMiA9IDB4ZmMsCisgICAgSlBHMTMgPSAweGZkLAorCisgICAgQ09NICAgPSAweGZlLCAgICAgICAvKiBjb21tZW50ICovCisKKyAgICBURU0gICA9IDB4MDEsICAgICAgIC8qIHRlbXBvcmFyeSBwcml2YXRlIHVzZSBmb3IgYXJpdGhtZXRpYyBjb2RpbmcgKi8KKworICAgIC8qIDB4MDIgLT4gMHhiZiByZXNlcnZlZCAqLworfSBKUEVHX01BUktFUjsKKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9tYXJrZXIoUHV0Qml0Q29udGV4dCAqcCwgaW50IGNvZGUpCit7CisgICAgcHV0X2JpdHMocCwgOCwgMHhmZik7CisgICAgcHV0X2JpdHMocCwgOCwgY29kZSk7Cit9CisKKyNkZWZpbmUgUFJFRElDVChyZXQsIHRvcGxlZnQsIHRvcCwgbGVmdCwgcHJlZGljdG9yKVwKKyAgICBzd2l0Y2gocHJlZGljdG9yKXtcCisgICAgICAgIGNhc2UgMDogcmV0PSAwOyBicmVhaztcCisgICAgICAgIGNhc2UgMTogcmV0PSBsZWZ0OyBicmVhaztcCisgICAgICAgIGNhc2UgMjogcmV0PSB0b3A7IGJyZWFrO1wKKyAgICAgICAgY2FzZSAzOiByZXQ9IHRvcGxlZnQ7IGJyZWFrO1wKKyAgICAgICAgY2FzZSA0OiByZXQ9IGxlZnQgICArICAgdG9wIC0gdG9wbGVmdDsgYnJlYWs7XAorICAgICAgICBjYXNlIDU6IHJldD0gbGVmdCAgICsgKCh0b3AgLSB0b3BsZWZ0KT4+MSk7IGJyZWFrO1wKKyAgICAgICAgY2FzZSA2OiByZXQ9IHRvcCArICgobGVmdCAgIC0gdG9wbGVmdCk+PjEpOyBicmVhaztcCisgICAgICAgIGRlZmF1bHQ6XAorICAgICAgICBjYXNlIDc6IHJldD0gKGxlZnQgKyB0b3ApPj4xOyBicmVhaztcCisgICAgfQorCitleHRlcm4gYXZfZXhwb3J0IGNvbnN0IHVpbnQ4X3QgYXZwcml2X21qcGVnX2JpdHNfZGNfbHVtaW5hbmNlW107CitleHRlcm4gYXZfZXhwb3J0IGNvbnN0IHVpbnQ4X3QgYXZwcml2X21qcGVnX3ZhbF9kY1tdOworCitleHRlcm4gYXZfZXhwb3J0IGNvbnN0IHVpbnQ4X3QgYXZwcml2X21qcGVnX2JpdHNfZGNfY2hyb21pbmFuY2VbXTsKKworZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCB1aW50OF90IGF2cHJpdl9tanBlZ19iaXRzX2FjX2x1bWluYW5jZVtdOworZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCB1aW50OF90IGF2cHJpdl9tanBlZ192YWxfYWNfbHVtaW5hbmNlW107CisKK2V4dGVybiBhdl9leHBvcnQgY29uc3QgdWludDhfdCBhdnByaXZfbWpwZWdfYml0c19hY19jaHJvbWluYW5jZVtdOworZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCB1aW50OF90IGF2cHJpdl9tanBlZ192YWxfYWNfY2hyb21pbmFuY2VbXTsKKwordm9pZCBmZl9tanBlZ19idWlsZF9odWZmbWFuX2NvZGVzKHVpbnQ4X3QgKmh1ZmZfc2l6ZSwgdWludDE2X3QgKmh1ZmZfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpiaXRzX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZhbF90YWJsZSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX01KUEVHX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21qcGVnMmpwZWdfYnNmLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tanBlZzJqcGVnX2JzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGVhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tanBlZzJqcGVnX2JzZi5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogTUpQRUcvQVZJMSB0byBKUEVHL0pGSUYgYml0c3RyZWFtIGZvcm1hdCBmaWx0ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBZHJpYW4gRGFlcnIgYW5kIE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBBZGFwdGVkIGZyb20gbWpwZWcyanBlZy5jLCB3aXRoIG9yaWdpbmFsIGNvcHlyaWdodDoKKyAqIFBhcmlzIDIwMTAgQWRyaWFuIERhZXJyLCBwdWJsaWMgZG9tYWluCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2Vycm9yLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1qcGVnLmgiCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGpwZWdfaGVhZGVyW10gPSB7CisgICAgMHhmZiwgMHhkOCwgICAgICAgICAgICAgICAgICAgICAvLyBTT0kKKyAgICAweGZmLCAweGUwLCAgICAgICAgICAgICAgICAgICAgIC8vIEFQUDAKKyAgICAweDAwLCAweDEwLCAgICAgICAgICAgICAgICAgICAgIC8vIEFQUDAgaGVhZGVyIHNpemUgKGluY2x1ZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBmaWVsZCwgYnV0IGV4Y2x1ZGluZyBwcmVjZWRpbmcpCisgICAgMHg0YSwgMHg0NiwgMHg0OSwgMHg0NiwgMHgwMCwgICAvLyBJRCBzdHJpbmcgJ0pGSUZcMCcKKyAgICAweDAxLCAweDAxLCAgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24KKyAgICAweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdHMgcGVyIHR5cGUKKyAgICAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgICAgIC8vIFggZGVuc2l0eQorICAgIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgLy8gWSBkZW5zaXR5CisgICAgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYIHRodW1ibmFpbCBzaXplCisgICAgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZIHRodW1ibmFpbCBzaXplCit9OworCitzdGF0aWMgY29uc3QgaW50IGRodF9zZWdtZW50X3NpemUgPSA0MjA7CitzdGF0aWMgY29uc3QgdWludDhfdCBkaHRfc2VnbWVudF9oZWFkW10gPSB7IDB4RkYsIDB4QzQsIDB4MDEsIDB4QTIsIDB4MDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGRodF9zZWdtZW50X2ZyYWdbXSA9IHsKKyAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LAorICAgIDB4MGEsIDB4MGIsIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKK307CisKK3N0YXRpYyB1aW50OF90ICphcHBlbmQodWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzaXplKQoreworICAgIG1lbWNweShidWYsIHNyYywgc2l6ZSk7CisgICAgcmV0dXJuIGJ1ZiArIHNpemU7Cit9CisKK3N0YXRpYyB1aW50OF90ICphcHBlbmRfZGh0X3NlZ21lbnQodWludDhfdCAqYnVmKQoreworICAgIGJ1ZiA9IGFwcGVuZChidWYsIGRodF9zZWdtZW50X2hlYWQsIHNpemVvZihkaHRfc2VnbWVudF9oZWFkKSk7CisgICAgYnVmID0gYXBwZW5kKGJ1ZiwgYXZwcml2X21qcGVnX2JpdHNfZGNfbHVtaW5hbmNlICsgMSwgMTYpOworICAgIGJ1ZiA9IGFwcGVuZChidWYsIGRodF9zZWdtZW50X2ZyYWcsIHNpemVvZihkaHRfc2VnbWVudF9mcmFnKSk7CisgICAgYnVmID0gYXBwZW5kKGJ1ZiwgYXZwcml2X21qcGVnX3ZhbF9kYywgMTIpOworICAgICooYnVmKyspID0gMHgxMDsKKyAgICBidWYgPSBhcHBlbmQoYnVmLCBhdnByaXZfbWpwZWdfYml0c19hY19sdW1pbmFuY2UgKyAxLCAxNik7CisgICAgYnVmID0gYXBwZW5kKGJ1ZiwgYXZwcml2X21qcGVnX3ZhbF9hY19sdW1pbmFuY2UsIDE2Mik7CisgICAgKihidWYrKykgPSAweDExOworICAgIGJ1ZiA9IGFwcGVuZChidWYsIGF2cHJpdl9tanBlZ19iaXRzX2FjX2Nocm9taW5hbmNlICsgMSwgMTYpOworICAgIGJ1ZiA9IGFwcGVuZChidWYsIGF2cHJpdl9tanBlZ192YWxfYWNfY2hyb21pbmFuY2UsIDE2Mik7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBtanBlZzJqcGVnX2ZpbHRlcihBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgY2hhciAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleWZyYW1lKQoreworICAgIGludCBpbnB1dF9za2lwLCBvdXRwdXRfc2l6ZTsKKyAgICB1aW50OF90ICpvdXRwdXQsICpvdXQ7CisKKyAgICBpZiAoYnVmX3NpemUgPCAxMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImlucHV0IGlzIHRydW5jYXRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAobWVtY21wKCJBVkkxIiwgYnVmICsgNiwgNCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dCBpcyBub3QgTUpQRUcvQVZJMVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpbnB1dF9za2lwID0gKGJ1Zls0XSA8PCA4KSArIGJ1Zls1XSArIDQ7CisgICAgaWYgKGJ1Zl9zaXplIDwgaW5wdXRfc2tpcCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImlucHV0IGlzIHRydW5jYXRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBvdXRwdXRfc2l6ZSA9IGJ1Zl9zaXplIC0gaW5wdXRfc2tpcCArCisgICAgICAgICAgICAgICAgICBzaXplb2YoanBlZ19oZWFkZXIpICsgZGh0X3NlZ21lbnRfc2l6ZTsKKyAgICBvdXRwdXQgPSBvdXQgPSBhdl9tYWxsb2Mob3V0cHV0X3NpemUpOworICAgIGlmICghb3V0cHV0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG91dCA9IGFwcGVuZChvdXQsIGpwZWdfaGVhZGVyLCBzaXplb2YoanBlZ19oZWFkZXIpKTsKKyAgICBvdXQgPSBhcHBlbmRfZGh0X3NlZ21lbnQob3V0KTsKKyAgICBvdXQgPSBhcHBlbmQob3V0LCBidWYgKyBpbnB1dF9za2lwLCBidWZfc2l6ZSAtIGlucHV0X3NraXApOworICAgICpwb3V0YnVmID0gb3V0cHV0OworICAgICpwb3V0YnVmX3NpemUgPSBvdXRwdXRfc2l6ZTsKKyAgICByZXR1cm4gMTsKK30KKworQVZCaXRTdHJlYW1GaWx0ZXIgZmZfbWpwZWcyanBlZ19ic2YgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1qcGVnMmpwZWciLAorICAgIC5maWx0ZXIgICAgICAgICA9IG1qcGVnMmpwZWdfZmlsdGVyLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21qcGVnX3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWdfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0OGIwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21qcGVnX3BhcnNlci5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogTUpQRUcgcGFyc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQWxleCBCZXJlZ3N6YXN6aQorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNSlBFRyBwYXJzZXIuCisgKi8KKworI2luY2x1ZGUgInBhcnNlci5oIgorCit0eXBlZGVmIHN0cnVjdCBNSlBFR1BhcnNlckNvbnRleHR7CisgICAgUGFyc2VDb250ZXh0IHBjOworICAgIGludCBzaXplOworfU1KUEVHUGFyc2VyQ29udGV4dDsKKworLyoqCisgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWUgaW4gdGhlIGJpdHN0cmVhbS4KKyAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBuZXh0IGZyYW1lLCBvciAtMQorICovCitzdGF0aWMgaW50IGZpbmRfZnJhbWVfZW5kKE1KUEVHUGFyc2VyQ29udGV4dCAqbSwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpeworICAgIFBhcnNlQ29udGV4dCAqcGM9ICZtLT5wYzsKKyAgICBpbnQgdm9wX2ZvdW5kLCBpOworICAgIHVpbnQzMl90IHN0YXRlOworCisgICAgdm9wX2ZvdW5kPSBwYy0+ZnJhbWVfc3RhcnRfZm91bmQ7CisgICAgc3RhdGU9IHBjLT5zdGF0ZTsKKworICAgIGk9MDsKKyAgICBpZighdm9wX2ZvdW5kKXsKKyAgICAgICAgZm9yKGk9MDsgaTxidWZfc2l6ZTspeworICAgICAgICAgICAgc3RhdGU9IChzdGF0ZTw8OCkgfCBidWZbaV07CisgICAgICAgICAgICBpZihzdGF0ZT49MHhGRkMwMDAwMCAmJiBzdGF0ZTw9MHhGRkZFRkZGRil7CisgICAgICAgICAgICAgICAgaWYoc3RhdGU+PTB4RkZEODAwMDAgJiYgc3RhdGU8PTB4RkZEOEZGRkYpeworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIHZvcF9mb3VuZD0xOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9ZWxzZSBpZihzdGF0ZTwweEZGRDAwMDAwIHx8IHN0YXRlPjB4RkZEOUZGRkYpeworICAgICAgICAgICAgICAgICAgICBtLT5zaXplPSAoc3RhdGUmMHhGRkZGKS0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG0tPnNpemU+MCl7CisgICAgICAgICAgICAgICAgaW50IHNpemU9IEZGTUlOKGJ1Zl9zaXplLWksIG0tPnNpemUpOworICAgICAgICAgICAgICAgIGkrPXNpemU7CisgICAgICAgICAgICAgICAgbS0+c2l6ZS09c2l6ZTsKKyAgICAgICAgICAgICAgICBzdGF0ZT0wOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZih2b3BfZm91bmQpeworICAgICAgICAvKiBFT0YgY29uc2lkZXJlZCBhcyBlbmQgb2YgZnJhbWUgKi8KKyAgICAgICAgaWYgKGJ1Zl9zaXplID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm9yKDsgaTxidWZfc2l6ZTspeworICAgICAgICAgICAgc3RhdGU9IChzdGF0ZTw8OCkgfCBidWZbaV07CisgICAgICAgICAgICBpZihzdGF0ZT49MHhGRkMwMDAwMCAmJiBzdGF0ZTw9MHhGRkZFRkZGRil7CisgICAgICAgICAgICAgICAgaWYoc3RhdGU+PTB4RkZEODAwMDAgJiYgc3RhdGU8PTB4RkZEOEZGRkYpeworICAgICAgICAgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQ9MDsKKyAgICAgICAgICAgICAgICAgICAgcGMtPnN0YXRlPTA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLTM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHN0YXRlPDB4RkZEMDAwMDAgfHwgc3RhdGU+MHhGRkQ5RkZGRil7CisgICAgICAgICAgICAgICAgICAgIG0tPnNpemU9IChzdGF0ZSYweEZGRkYpLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobS0+c2l6ZT4wKXsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZT0gRkZNSU4oYnVmX3NpemUtaSwgbS0+c2l6ZSk7CisgICAgICAgICAgICAgICAgaSs9c2l6ZTsKKyAgICAgICAgICAgICAgICBtLT5zaXplLT1zaXplOworICAgICAgICAgICAgICAgIHN0YXRlPTA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQ9IHZvcF9mb3VuZDsKKyAgICBwYy0+c3RhdGU9IHN0YXRlOworICAgIHJldHVybiBFTkRfTk9UX0ZPVU5EOworfQorCitzdGF0aWMgaW50IGpwZWdfcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBNSlBFR1BhcnNlckNvbnRleHQgKm0gPSBzLT5wcml2X2RhdGE7CisgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZtLT5wYzsKKyAgICBpbnQgbmV4dDsKKworICAgIGlmKHMtPmZsYWdzICYgUEFSU0VSX0ZMQUdfQ09NUExFVEVfRlJBTUVTKXsKKyAgICAgICAgbmV4dD0gYnVmX3NpemU7CisgICAgfWVsc2V7CisgICAgICAgIG5leHQ9IGZpbmRfZnJhbWVfZW5kKG0sIGJ1ZiwgYnVmX3NpemUpOworCisgICAgICAgIGlmIChmZl9jb21iaW5lX2ZyYW1lKHBjLCBuZXh0LCAmYnVmLCAmYnVmX3NpemUpIDwgMCkgeworICAgICAgICAgICAgKnBvdXRidWYgPSBOVUxMOworICAgICAgICAgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcG91dGJ1ZiA9IGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKKworQVZDb2RlY1BhcnNlciBmZl9tanBlZ19wYXJzZXIgPSB7CisgICAgLmNvZGVjX2lkcyAgICAgID0geyBBVl9DT0RFQ19JRF9NSlBFRyB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNSlBFR1BhcnNlckNvbnRleHQpLAorICAgIC5wYXJzZXJfcGFyc2UgICA9IGpwZWdfcGFyc2UsCisgICAgLnBhcnNlcl9jbG9zZSAgID0gZmZfcGFyc2VfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWdhX2R1bXBfaGVhZGVyX2JzZi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWdhX2R1bXBfaGVhZGVyX2JzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDdjODIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tanBlZ2FfZHVtcF9oZWFkZXJfYnNmLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIE1KUEVHIEEgZHVtcCBoZWFkZXIgYml0c3RyZWFtIGZpbHRlcgorICogQ29weXJpZ2h0IChjKSAyMDA2IEJhcHRpc3RlIENvdWR1cmllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNSlBFRyBBIGR1bXAgaGVhZGVyIGJpdHN0cmVhbSBmaWx0ZXIKKyAqIG1vZGlmaWVzIGJpdHN0cmVhbSB0byBiZSBkZWNvZGVkIGJ5IHF1aWNrdGltZQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgIm1qcGVnLmgiCisKKworc3RhdGljIGludCBtanBlZ2FfZHVtcF9oZWFkZXIoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50IGtleWZyYW1lKQoreworICAgIHVpbnQ4X3QgKnBvdXRidWZwOworICAgIHVuc2lnbmVkIGRxdCA9IDAsIGRodCA9IDAsIHNvZjAgPSAwOworICAgIGludCBpOworCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NSlBFRykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1qcGVnYSBiaXRzdHJlYW0gZmlsdGVyIG9ubHkgYXBwbGllcyB0byBtanBlZyBjb2RlY1xuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgICpwb3V0YnVmID0gYXZfbWFsbG9jKGJ1Zl9zaXplICsgNDQgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBwb3V0YnVmcCA9ICpwb3V0YnVmOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnBvdXRidWZwLCAweGZmKTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwb3V0YnVmcCwgU09JKTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwb3V0YnVmcCwgMHhmZik7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcG91dGJ1ZnAsIEFQUDEpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnBvdXRidWZwLCA0Mik7IC8qIHNpemUgKi8KKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwb3V0YnVmcCwgMCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZwb3V0YnVmcCwgIm1qcGciLCA0KTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwb3V0YnVmcCwgYnVmX3NpemUgKyA0NCk7IC8qIGZpZWxkIHNpemUgKi8KKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwb3V0YnVmcCwgYnVmX3NpemUgKyA0NCk7IC8qIHBhZCBmaWVsZCBzaXplICovCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcG91dGJ1ZnAsIDApOyAgICAgICAgICAgICAvKiBuZXh0IHB0ciAqLworCisgICAgZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplIC0gMTsgaSsrKSB7CisgICAgICAgIGlmIChidWZbaV0gPT0gMHhmZikgeworICAgICAgICAgICAgc3dpdGNoIChidWZbaSArIDFdKSB7CisgICAgICAgICAgICBjYXNlIERRVDogIGRxdCAgPSBpICsgNDY7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBESFQ6ICBkaHQgID0gaSArIDQ2OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU09GMDogc29mMCA9IGkgKyA0NjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNPUzoKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwb3V0YnVmcCwgZHF0KTsgLyogcXVhbnQgb2ZmICovCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcG91dGJ1ZnAsIGRodCk7IC8qIGh1ZmYgb2ZmICovCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcG91dGJ1ZnAsIHNvZjApOyAvKiBpbWFnZSBvZmYgKi8KKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwb3V0YnVmcCwgaSArIDQ2KTsgLyogc2NhbiBvZmYgKi8KKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwb3V0YnVmcCwgaSArIDQ2ICsgQVZfUkIxNihidWYgKyBpICsgMikpOyAvKiBkYXRhIG9mZiAqLworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmcG91dGJ1ZnAsIGJ1ZiArIDIsIGJ1Zl9zaXplIC0gMik7IC8qIHNraXAgYWxyZWFkeSB3cml0dGVuIFNPSSAqLworICAgICAgICAgICAgICAgICpwb3V0YnVmX3NpemUgPSBwb3V0YnVmcCAtICpwb3V0YnVmOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgY2FzZSBBUFAxOgorICAgICAgICAgICAgICAgIGlmIChpICsgOCA8IGJ1Zl9zaXplICYmIEFWX1JMMzIoYnVmICsgaSArIDgpID09IEFWX1JMMzIoIm1qcGciKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJpdHN0cmVhbSBhbHJlYWR5IGZvcm1hdHRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgqcG91dGJ1ZiwgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWVwKHBvdXRidWYpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IGZpbmQgU09TIG1hcmtlciBpbiBiaXRzdHJlYW1cbiIpOworICAgIHJldHVybiAwOworfQorCitBVkJpdFN0cmVhbUZpbHRlciBmZl9tanBlZ2FfZHVtcF9oZWFkZXJfYnNmID0geworICAgIC5uYW1lICAgPSAibWpwZWdhZHVtcCIsCisgICAgLmZpbHRlciA9IG1qcGVnYV9kdW1wX2hlYWRlciwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tanBlZ2JkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21qcGVnYmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZWU3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tanBlZ2JkZWMuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIEFwcGxlIE1KUEVHLUIgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAyIEFsZXggQmVyZWdzemFzemkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQXBwbGUgTUpQRUctQiBkZWNvZGVyLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1qcGVnLmgiCisjaW5jbHVkZSAibWpwZWdkZWMuaCIKKworc3RhdGljIHVpbnQzMl90IHJlYWRfb2ZmcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEdldEJpdENvbnRleHQgKmdiLCB1aW50MzJfdCBzaXplLCBjb25zdCBjaGFyICplcnJfbXNnKXsKKyAgICB1aW50MzJfdCBvZmZzPSBnZXRfYml0c19sb25nKGdiLCAzMik7CisgICAgaWYob2ZmcyA+PSBzaXplKXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgZXJyX21zZywgb2Zmcywgc2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gb2ZmczsKK30KKworc3RhdGljIGludCBtanBlZ2JfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIE1KcGVnRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmX2VuZCwgKmJ1Zl9wdHI7CisgICAgR2V0Qml0Q29udGV4dCBoZ2I7IC8qIGZvciB0aGUgaGVhZGVyICovCisgICAgdWludDMyX3QgZHF0X29mZnMsIGRodF9vZmZzLCBzb2Zfb2Zmcywgc29zX29mZnMsIHNlY29uZF9maWVsZF9vZmZzOworICAgIHVpbnQzMl90IGZpZWxkX3NpemUsIHNvZF9vZmZzOworICAgIGludCByZXQ7CisKKyAgICBidWZfcHRyID0gYnVmOworICAgIGJ1Zl9lbmQgPSBidWYgKyBidWZfc2l6ZTsKKyAgICBzLT5nb3RfcGljdHVyZSA9IDA7CisKK3JlYWRfaGVhZGVyOgorICAgIC8qIHJlc2V0IG9uIGV2ZXJ5IFNPSSAqLworICAgIHMtPnJlc3RhcnRfaW50ZXJ2YWwgPSAwOworICAgIHMtPnJlc3RhcnRfY291bnQgPSAwOworICAgIHMtPm1qcGJfc2tpcHRvc29kID0gMDsKKworICAgIGlmIChidWZfZW5kIC0gYnVmX3B0ciA+PSAxIDw8IDI4KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmhnYiwgYnVmX3B0ciwgLypidWZfc2l6ZSovKGJ1Zl9lbmQgLSBidWZfcHRyKSo4KTsKKworICAgIHNraXBfYml0cygmaGdiLCAzMik7IC8qIHJlc2VydmVkIHplcm9zICovCisKKyAgICBpZiAoZ2V0X2JpdHNfbG9uZygmaGdiLCAzMikgIT0gTUtCRVRBRygnbScsJ2onLCdwJywnZycpKQorICAgIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIm5vdCBtanBlZy1iIChiYWQgZm91cmNjKVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZpZWxkX3NpemUgPSBnZXRfYml0c19sb25nKCZoZ2IsIDMyKTsgLyogZmllbGQgc2l6ZSAqLworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZmllbGQgc2l6ZTogMHglIlBSSXgzMiJcbiIsIGZpZWxkX3NpemUpOworICAgIHNraXBfYml0cygmaGdiLCAzMik7IC8qIHBhZGRlZCBmaWVsZCBzaXplICovCisgICAgc2Vjb25kX2ZpZWxkX29mZnMgPSByZWFkX29mZnMoYXZjdHgsICZoZ2IsIGJ1Zl9lbmQgLSBidWZfcHRyLCAic2Vjb25kX2ZpZWxkX29mZnMgaXMgJWQgYW5kIHNpemUgaXMgJWRcbiIpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAic2Vjb25kIGZpZWxkIG9mZnM6IDB4JSJQUkl4MzIiXG4iLAorICAgICAgICAgICBzZWNvbmRfZmllbGRfb2Zmcyk7CisKKyAgICBkcXRfb2ZmcyA9IHJlYWRfb2ZmcyhhdmN0eCwgJmhnYiwgYnVmX2VuZCAtIGJ1Zl9wdHIsICJkcXQgaXMgJWQgYW5kIHNpemUgaXMgJWRcbiIpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZHF0IG9mZnM6IDB4JSJQUkl4MzIiXG4iLCBkcXRfb2Zmcyk7CisgICAgaWYgKGRxdF9vZmZzKQorICAgIHsKKyAgICAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1Zl9wdHIrZHF0X29mZnMsIChidWZfZW5kIC0gKGJ1Zl9wdHIrZHF0X29mZnMpKSo4KTsKKyAgICAgICAgcy0+c3RhcnRfY29kZSA9IERRVDsKKyAgICAgICAgaWYgKGZmX21qcGVnX2RlY29kZV9kcXQocykgPCAwICYmCisgICAgICAgICAgICAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQorICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGRodF9vZmZzID0gcmVhZF9vZmZzKGF2Y3R4LCAmaGdiLCBidWZfZW5kIC0gYnVmX3B0ciwgImRodCBpcyAlZCBhbmQgc2l6ZSBpcyAlZFxuIik7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJkaHQgb2ZmczogMHglIlBSSXgzMiJcbiIsIGRodF9vZmZzKTsKKyAgICBpZiAoZGh0X29mZnMpCisgICAgeworICAgICAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgYnVmX3B0citkaHRfb2ZmcywgKGJ1Zl9lbmQgLSAoYnVmX3B0citkaHRfb2ZmcykpKjgpOworICAgICAgICBzLT5zdGFydF9jb2RlID0gREhUOworICAgICAgICBmZl9tanBlZ19kZWNvZGVfZGh0KHMpOworICAgIH0KKworICAgIHNvZl9vZmZzID0gcmVhZF9vZmZzKGF2Y3R4LCAmaGdiLCBidWZfZW5kIC0gYnVmX3B0ciwgInNvZiBpcyAlZCBhbmQgc2l6ZSBpcyAlZFxuIik7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJzb2Ygb2ZmczogMHglIlBSSXgzMiJcbiIsIHNvZl9vZmZzKTsKKyAgICBpZiAoc29mX29mZnMpCisgICAgeworICAgICAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgYnVmX3B0citzb2Zfb2ZmcywgKGJ1Zl9lbmQgLSAoYnVmX3B0citzb2Zfb2ZmcykpKjgpOworICAgICAgICBzLT5zdGFydF9jb2RlID0gU09GMDsKKyAgICAgICAgaWYgKGZmX21qcGVnX2RlY29kZV9zb2YocykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHNvc19vZmZzID0gcmVhZF9vZmZzKGF2Y3R4LCAmaGdiLCBidWZfZW5kIC0gYnVmX3B0ciwgInNvcyBpcyAlZCBhbmQgc2l6ZSBpcyAlZFxuIik7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJzb3Mgb2ZmczogMHglIlBSSXgzMiJcbiIsIHNvc19vZmZzKTsKKyAgICBzb2Rfb2ZmcyA9IHJlYWRfb2ZmcyhhdmN0eCwgJmhnYiwgYnVmX2VuZCAtIGJ1Zl9wdHIsICJzb2YgaXMgJWQgYW5kIHNpemUgaXMgJWRcbiIpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAic29kIG9mZnM6IDB4JSJQUkl4MzIiXG4iLCBzb2Rfb2Zmcyk7CisgICAgaWYgKHNvc19vZmZzKQorICAgIHsKKyAgICAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1Zl9wdHIgKyBzb3Nfb2ZmcywKKyAgICAgICAgICAgICAgICAgICAgICA4ICogRkZNSU4oZmllbGRfc2l6ZSwgYnVmX2VuZCAtIGJ1Zl9wdHIgLSBzb3Nfb2ZmcykpOworICAgICAgICBzLT5tanBiX3NraXB0b3NvZCA9IChzb2Rfb2ZmcyAtIHNvc19vZmZzIC0gc2hvd19iaXRzKCZzLT5nYiwgMTYpKTsKKyAgICAgICAgcy0+c3RhcnRfY29kZSA9IFNPUzsKKyAgICAgICAgaWYgKGZmX21qcGVnX2RlY29kZV9zb3MocywgTlVMTCwgMCwgTlVMTCkgPCAwICYmCisgICAgICAgICAgICAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQorICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzLT5pbnRlcmxhY2VkKSB7CisgICAgICAgIHMtPmJvdHRvbV9maWVsZCBePSAxOworICAgICAgICAvKiBpZiBub3QgYm90dG9tIGZpZWxkLCBkbyBub3Qgb3V0cHV0IGltYWdlIHlldCAqLworICAgICAgICBpZiAocy0+Ym90dG9tX2ZpZWxkICE9IHMtPmludGVybGFjZV9wb2xhcml0eSAmJiBzZWNvbmRfZmllbGRfb2ZmcykKKyAgICAgICAgeworICAgICAgICAgICAgYnVmX3B0ciA9IGJ1ZiArIHNlY29uZF9maWVsZF9vZmZzOworICAgICAgICAgICAgZ290byByZWFkX2hlYWRlcjsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvL1hYWCBGSVhNRSBmYWN0b3JpemUsIHRoaXMgbG9va3MgdmVyeSBzaW1pbGFyIHRvIHRoZSBFT0kgY29kZQorCisgICAgaWYoIXMtPmdvdF9waWN0dXJlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJubyBwaWN0dXJlXG4iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPnBpY3R1cmVfcHRyKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgaWYgKCFzLT5sb3NzbGVzcyAmJiBhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19RUCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlFQOiAlZFxuIiwKKyAgICAgICAgICAgICAgIEZGTUFYMyhzLT5xc2NhbGVbMF0sIHMtPnFzY2FsZVsxXSwgcy0+cXNjYWxlWzJdKSk7CisgICAgfQorCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitBVkNvZGVjIGZmX21qcGVnYl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtanBlZ2IiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBsZSBNSlBFRy1CIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01KUEVHQiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTUpwZWdEZWNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9tanBlZ19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl9tanBlZ19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IG1qcGVnYl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAubWF4X2xvd3JlcyAgICAgPSAzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21qcGVnZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tanBlZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOWE1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tanBlZ2RlYy5jCkBAIC0wLDAgKzEsMjM3MiBAQAorLyoKKyAqIE1KUEVHIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMyBBbGV4IEJlcmVnc3phc3ppCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogU3VwcG9ydCBmb3IgZXh0ZXJuYWwgaHVmZm1hbiB0YWJsZSwgdmFyaW91cyBmaXhlcyAoQVZJRCB3b3JrYXJvdW5kKSwKKyAqIGFzcGVjdGluZywgbmV3IGRlY29kZV9mcmFtZSBtZWNoYW5pc20gYW5kIGFwcGxlIG1qcGVnLWIgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNSlBFRyBkZWNvZGVyLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJsb2NrZHNwLmgiCisjaW5jbHVkZSAiY29weV9ibG9jay5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1qcGVnLmgiCisjaW5jbHVkZSAibWpwZWdkZWMuaCIKKyNpbmNsdWRlICJqcGVnbHNkZWMuaCIKKyNpbmNsdWRlICJ0aWZmLmgiCisjaW5jbHVkZSAiZXhpZi5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKworCitzdGF0aWMgaW50IGJ1aWxkX3ZsYyhWTEMgKnZsYywgY29uc3QgdWludDhfdCAqYml0c190YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZhbF90YWJsZSwgaW50IG5iX2NvZGVzLAorICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9zdGF0aWMsIGludCBpc19hYykKK3sKKyAgICB1aW50OF90IGh1ZmZfc2l6ZVsyNTZdID0geyAwIH07CisgICAgdWludDE2X3QgaHVmZl9jb2RlWzI1Nl07CisgICAgdWludDE2X3QgaHVmZl9zeW1bMjU2XTsKKyAgICBpbnQgaTsKKworICAgIGF2X2Fzc2VydDAobmJfY29kZXMgPD0gMjU2KTsKKworICAgIGZmX21qcGVnX2J1aWxkX2h1ZmZtYW5fY29kZXMoaHVmZl9zaXplLCBodWZmX2NvZGUsIGJpdHNfdGFibGUsIHZhbF90YWJsZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgIGh1ZmZfc3ltW2ldID0gaSArIDE2ICogaXNfYWM7CisKKyAgICBpZiAoaXNfYWMpCisgICAgICAgIGh1ZmZfc3ltWzBdID0gMTYgKiAyNTY7CisKKyAgICByZXR1cm4gZmZfaW5pdF92bGNfc3BhcnNlKHZsYywgOSwgbmJfY29kZXMsIGh1ZmZfc2l6ZSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZfY29kZSwgMiwgMiwgaHVmZl9zeW0sIDIsIDIsIHVzZV9zdGF0aWMpOworfQorCitzdGF0aWMgdm9pZCBidWlsZF9iYXNpY19tanBlZ192bGMoTUpwZWdEZWNvZGVDb250ZXh0ICpzKQoreworICAgIGJ1aWxkX3ZsYygmcy0+dmxjc1swXVswXSwgYXZwcml2X21qcGVnX2JpdHNfZGNfbHVtaW5hbmNlLAorICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2RjLCAxMiwgMCwgMCk7CisgICAgYnVpbGRfdmxjKCZzLT52bGNzWzBdWzFdLCBhdnByaXZfbWpwZWdfYml0c19kY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9kYywgMTIsIDAsIDApOworICAgIGJ1aWxkX3ZsYygmcy0+dmxjc1sxXVswXSwgYXZwcml2X21qcGVnX2JpdHNfYWNfbHVtaW5hbmNlLAorICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2FjX2x1bWluYW5jZSwgMjUxLCAwLCAxKTsKKyAgICBidWlsZF92bGMoJnMtPnZsY3NbMV1bMV0sIGF2cHJpdl9tanBlZ19iaXRzX2FjX2Nocm9taW5hbmNlLAorICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2FjX2Nocm9taW5hbmNlLCAyNTEsIDAsIDEpOworICAgIGJ1aWxkX3ZsYygmcy0+dmxjc1syXVswXSwgYXZwcml2X21qcGVnX2JpdHNfYWNfbHVtaW5hbmNlLAorICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2FjX2x1bWluYW5jZSwgMjUxLCAwLCAwKTsKKyAgICBidWlsZF92bGMoJnMtPnZsY3NbMl1bMV0sIGF2cHJpdl9tanBlZ19iaXRzX2FjX2Nocm9taW5hbmNlLAorICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2FjX2Nocm9taW5hbmNlLCAyNTEsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9hdmlkKE1KcGVnRGVjb2RlQ29udGV4dCAqcywgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIHMtPmJ1Z2d5X2F2aWQgPSAxOworICAgIGlmIChsZW4gPiAxNCAmJiBidWZbMTJdID09IDEpIC8qIDEgLSBOVFNDICovCisgICAgICAgIHMtPmludGVybGFjZV9wb2xhcml0eSA9IDE7CisgICAgaWYgKGxlbiA+IDE0ICYmIGJ1ZlsxMl0gPT0gMikgLyogMiAtIFBBTCAqLworICAgICAgICBzLT5pbnRlcmxhY2VfcG9sYXJpdHkgPSAwOworICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJBVklEOiBsZW46JWQgJWRcbiIsIGxlbiwgbGVuID4gMTQgPyBidWZbMTJdIDogLTEpOworfQorCithdl9jb2xkIGludCBmZl9tanBlZ19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTUpwZWdEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmICghcy0+cGljdHVyZV9wdHIpIHsKKyAgICAgICAgcy0+cGljdHVyZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgIGlmICghcy0+cGljdHVyZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHMtPnBpY3R1cmVfcHRyID0gcy0+cGljdHVyZTsKKyAgICB9CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIGZmX2Jsb2NrZHNwX2luaXQoJnMtPmJkc3AsIGF2Y3R4KTsKKyAgICBmZl9ocGVsZHNwX2luaXQoJnMtPmhkc3AsIGF2Y3R4LT5mbGFncyk7CisgICAgZmZfaWRjdGRzcF9pbml0KCZzLT5pZHNwLCBhdmN0eCk7CisgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+c2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIGZmX3ppZ3phZ19kaXJlY3QpOworICAgIHMtPmJ1ZmZlcl9zaXplICAgPSAwOworICAgIHMtPmJ1ZmZlciAgICAgICAgPSBOVUxMOworICAgIHMtPnN0YXJ0X2NvZGUgICAgPSAtMTsKKyAgICBzLT5maXJzdF9waWN0dXJlID0gMTsKKyAgICBzLT5nb3RfcGljdHVyZSAgID0gMDsKKyAgICBzLT5vcmdfaGVpZ2h0ICAgID0gYXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICBhdmN0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbiA9IEFWQ0hST01BX0xPQ19DRU5URVI7CisgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ0NzBCRzsKKworICAgIGJ1aWxkX2Jhc2ljX21qcGVnX3ZsYyhzKTsKKworICAgIGlmIChzLT5leHRlcm5faHVmZikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAidXNpbmcgZXh0ZXJuYWwgaHVmZm1hbiB0YWJsZVxuIik7CisgICAgICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKiA4KTsKKyAgICAgICAgaWYgKGZmX21qcGVnX2RlY29kZV9kaHQocykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJlcnJvciB1c2luZyBleHRlcm5hbCBodWZmbWFuIHRhYmxlLCBzd2l0Y2hpbmcgYmFjayB0byBpbnRlcm5hbFxuIik7CisgICAgICAgICAgICBidWlsZF9iYXNpY19tanBlZ192bGMocyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGF2Y3R4LT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9CQikgeyAvKiBxdWlja3RpbWUgaWNlZmxvZSAwMTkgKi8KKyAgICAgICAgcy0+aW50ZXJsYWNlX3BvbGFyaXR5ID0gMTsgICAgICAgICAgIC8qIGJvdHRvbSBmaWVsZCBmaXJzdCAqLworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImJvdHRvbSBmaWVsZCBmaXJzdFxuIik7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVU5LTk9XTikgeworICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJNSlBHIikpCisgICAgICAgICAgICBzLT5pbnRlcmxhY2VfcG9sYXJpdHkgPSAxOworICAgIH0KKworICAgIGlmICggICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPiA4CisgICAgICAgICYmIEFWX1JMMzIoYXZjdHgtPmV4dHJhZGF0YSkgPT0gMHgyQworICAgICAgICAmJiBBVl9STDMyKGF2Y3R4LT5leHRyYWRhdGErNCkgPT0gMHgxOCkgeworICAgICAgICBwYXJzZV9hdmlkKHMsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfQU1WKQorICAgICAgICBzLT5mbGlwcGVkID0gMTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qIHF1YW50aXplIHRhYmxlcyAqLworaW50IGZmX21qcGVnX2RlY29kZV9kcXQoTUpwZWdEZWNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBsZW4sIGluZGV4LCBpLCBqOworCisgICAgbGVuID0gZ2V0X2JpdHMoJnMtPmdiLCAxNikgLSAyOworCisgICAgd2hpbGUgKGxlbiA+PSA2NSkgeworICAgICAgICBpbnQgcHIgPSBnZXRfYml0cygmcy0+Z2IsIDQpOworICAgICAgICBpZiAocHIgPiAxKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRxdDogaW52YWxpZCBwcmVjaXNpb25cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSBnZXRfYml0cygmcy0+Z2IsIDQpOworICAgICAgICBpZiAoaW5kZXggPj0gNCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJpbmRleD0lZFxuIiwgaW5kZXgpOworICAgICAgICAvKiByZWFkIHF1YW50IHRhYmxlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICBqID0gcy0+c2NhbnRhYmxlLnBlcm11dGF0ZWRbaV07CisgICAgICAgICAgICBzLT5xdWFudF9tYXRyaXhlc1tpbmRleF1bal0gPSBnZXRfYml0cygmcy0+Z2IsIHByID8gMTYgOiA4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFhYWCBGSVhNRSBmaW5ldHVuZSwgYW5kIHBlcmhhcHMgYWRkIGRjIHRvbworICAgICAgICBzLT5xc2NhbGVbaW5kZXhdID0gRkZNQVgocy0+cXVhbnRfbWF0cml4ZXNbaW5kZXhdW3MtPnNjYW50YWJsZS5wZXJtdXRhdGVkWzFdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnF1YW50X21hdHJpeGVzW2luZGV4XVtzLT5zY2FudGFibGUucGVybXV0YXRlZFs4XV0pID4+IDE7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicXNjYWxlWyVkXTogJWRcbiIsCisgICAgICAgICAgICAgICBpbmRleCwgcy0+cXNjYWxlW2luZGV4XSk7CisgICAgICAgIGxlbiAtPSA2NTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSBodWZmbWFuIHRhYmxlcyBhbmQgYnVpbGQgVkxDIGRlY29kZXJzICovCitpbnQgZmZfbWpwZWdfZGVjb2RlX2RodChNSnBlZ0RlY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGxlbiwgaW5kZXgsIGksIGNsYXNzLCBuLCB2LCBjb2RlX21heDsKKyAgICB1aW50OF90IGJpdHNfdGFibGVbMTddOworICAgIHVpbnQ4X3QgdmFsX3RhYmxlWzI1Nl07CisgICAgaW50IHJldCA9IDA7CisKKyAgICBsZW4gPSBnZXRfYml0cygmcy0+Z2IsIDE2KSAtIDI7CisKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBpZiAobGVuIDwgMTcpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgY2xhc3MgPSBnZXRfYml0cygmcy0+Z2IsIDQpOworICAgICAgICBpZiAoY2xhc3MgPj0gMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpbmRleCA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisgICAgICAgIGlmIChpbmRleCA+PSA0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIG4gPSAwOworICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspIHsKKyAgICAgICAgICAgIGJpdHNfdGFibGVbaV0gPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgbiArPSBiaXRzX3RhYmxlW2ldOworICAgICAgICB9CisgICAgICAgIGxlbiAtPSAxNzsKKyAgICAgICAgaWYgKGxlbiA8IG4gfHwgbiA+IDI1NikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGNvZGVfbWF4ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdiA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgICAgICBpZiAodiA+IGNvZGVfbWF4KQorICAgICAgICAgICAgICAgIGNvZGVfbWF4ID0gdjsKKyAgICAgICAgICAgIHZhbF90YWJsZVtpXSA9IHY7CisgICAgICAgIH0KKyAgICAgICAgbGVuIC09IG47CisKKyAgICAgICAgLyogYnVpbGQgVkxDIGFuZCBmbHVzaCBwcmV2aW91cyB2bGMgaWYgcHJlc2VudCAqLworICAgICAgICBmZl9mcmVlX3ZsYygmcy0+dmxjc1tjbGFzc11baW5kZXhdKTsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJjbGFzcz0lZCBpbmRleD0lZCBuYl9jb2Rlcz0lZFxuIiwKKyAgICAgICAgICAgICAgIGNsYXNzLCBpbmRleCwgY29kZV9tYXggKyAxKTsKKyAgICAgICAgaWYgKChyZXQgPSBidWlsZF92bGMoJnMtPnZsY3NbY2xhc3NdW2luZGV4XSwgYml0c190YWJsZSwgdmFsX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX21heCArIDEsIDAsIGNsYXNzID4gMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKGNsYXNzID4gMCkgeworICAgICAgICAgICAgZmZfZnJlZV92bGMoJnMtPnZsY3NbMl1baW5kZXhdKTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYnVpbGRfdmxjKCZzLT52bGNzWzJdW2luZGV4XSwgYml0c190YWJsZSwgdmFsX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9tYXggKyAxLCAwLCAwKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9tanBlZ19kZWNvZGVfc29mKE1KcGVnRGVjb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgbGVuLCBuYl9jb21wb25lbnRzLCBpLCB3aWR0aCwgaGVpZ2h0LCBiaXRzLCByZXQ7CisgICAgdW5zaWduZWQgcGl4X2ZtdF9pZDsKKyAgICBpbnQgaF9jb3VudFtNQVhfQ09NUE9ORU5UU107CisgICAgaW50IHZfY291bnRbTUFYX0NPTVBPTkVOVFNdOworCisgICAgcy0+Y3VyX3NjYW4gPSAwOworICAgIHMtPnVwc2NhbGVfaCA9IHMtPnVwc2NhbGVfdiA9IDA7CisKKyAgICAvKiBYWFg6IHZlcmlmeSBsZW4gZmllbGQgdmFsaWRpdHkgKi8KKyAgICBsZW4gICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAxNik7CisgICAgcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPQorICAgIGJpdHMgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworCisgICAgaWYgKGJpdHMgPiAxNiB8fCBiaXRzIDwgMSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImJpdHMgJWQgaXMgaW52YWxpZFxuIiwgYml0cyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzLT5wZWdhc3VzX3JjdCkKKyAgICAgICAgYml0cyA9IDk7CisgICAgaWYgKGJpdHMgPT0gOSAmJiAhcy0+cGVnYXN1c19yY3QpCisgICAgICAgIHMtPnJjdCAgPSAxOyAgICAvLyBGSVhNRSB1Z2x5CisKKyAgICBpZihzLT5sb3NzbGVzcyAmJiBzLT5hdmN0eC0+bG93cmVzKXsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJsb3dyZXMgaXMgbm90IHBvc3NpYmxlIHdpdGggbG9zc2xlc3MganBlZ1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBoZWlnaHQgPSBnZXRfYml0cygmcy0+Z2IsIDE2KTsKKyAgICB3aWR0aCAgPSBnZXRfYml0cygmcy0+Z2IsIDE2KTsKKworICAgIGlmIChzLT5hdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1WICYmIChoZWlnaHQmMTUpKQorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJub24gbW9kIDE2IGhlaWdodCBBTVZcbiIpOworCisgICAgLy8gSEFDSyBmb3Igb2RkX2hlaWdodC5tb3YKKyAgICBpZiAocy0+aW50ZXJsYWNlZCAmJiBzLT53aWR0aCA9PSB3aWR0aCAmJiBzLT5oZWlnaHQgPT0gaGVpZ2h0ICsgMSkKKyAgICAgICAgaGVpZ2h0PSBzLT5oZWlnaHQ7CisKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInNvZjA6IHBpY3R1cmU6ICVkeCVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZSh3aWR0aCwgaGVpZ2h0LCAwLCBzLT5hdmN0eCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgbmJfY29tcG9uZW50cyA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgaWYgKG5iX2NvbXBvbmVudHMgPD0gMCB8fAorICAgICAgICBuYl9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAocy0+aW50ZXJsYWNlZCAmJiAocy0+Ym90dG9tX2ZpZWxkID09ICFzLT5pbnRlcmxhY2VfcG9sYXJpdHkpKSB7CisgICAgICAgIGlmIChuYl9jb21wb25lbnRzICE9IHMtPm5iX2NvbXBvbmVudHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJuYl9jb21wb25lbnRzIGNoYW5naW5nIGluIGludGVybGFjZWQgcGljdHVyZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+bHMgJiYgIShiaXRzIDw9IDggfHwgbmJfY29tcG9uZW50cyA9PSAxKSkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQRUctTFMgdGhhdCBpcyBub3QgPD0gOCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaXRzL2NvbXBvbmVudCBvciAxNi1iaXQgZ3JheSIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIHMtPm5iX2NvbXBvbmVudHMgPSBuYl9jb21wb25lbnRzOworICAgIHMtPmhfbWF4ICAgICAgICAgPSAxOworICAgIHMtPnZfbWF4ICAgICAgICAgPSAxOworICAgIG1lbXNldChoX2NvdW50LCAwLCBzaXplb2YoaF9jb3VudCkpOworICAgIG1lbXNldCh2X2NvdW50LCAwLCBzaXplb2Yodl9jb3VudCkpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgLyogY29tcG9uZW50IGlkICovCisgICAgICAgIHMtPmNvbXBvbmVudF9pZFtpXSA9IGdldF9iaXRzKCZzLT5nYiwgOCkgLSAxOworICAgICAgICBoX2NvdW50W2ldICAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDQpOworICAgICAgICB2X2NvdW50W2ldICAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDQpOworICAgICAgICAvKiBjb21wdXRlIGhtYXggYW5kIHZtYXggKG9ubHkgdXNlZCBpbiBpbnRlcmxlYXZlZCBjYXNlKSAqLworICAgICAgICBpZiAoaF9jb3VudFtpXSA+IHMtPmhfbWF4KQorICAgICAgICAgICAgcy0+aF9tYXggPSBoX2NvdW50W2ldOworICAgICAgICBpZiAodl9jb3VudFtpXSA+IHMtPnZfbWF4KQorICAgICAgICAgICAgcy0+dl9tYXggPSB2X2NvdW50W2ldOworICAgICAgICBzLT5xdWFudF9pbmRleFtpXSA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgIGlmIChzLT5xdWFudF9pbmRleFtpXSA+PSA0KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInF1YW50X2luZGV4IGlzIGludmFsaWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoX2NvdW50W2ldIHx8ICF2X2NvdW50W2ldKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBzYW1wbGluZyBmYWN0b3IgaW4gY29tcG9uZW50ICVkICVkOiVkXG4iLAorICAgICAgICAgICAgICAgICAgIGksIGhfY291bnRbaV0sIHZfY291bnRbaV0pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImNvbXBvbmVudCAlZCAlZDolZCBpZDogJWQgcXVhbnQ6JWRcbiIsCisgICAgICAgICAgICAgICBpLCBoX2NvdW50W2ldLCB2X2NvdW50W2ldLAorICAgICAgICAgICAgICAgcy0+Y29tcG9uZW50X2lkW2ldLCBzLT5xdWFudF9pbmRleFtpXSk7CisgICAgfQorCisgICAgaWYgKHMtPmxzICYmIChzLT5oX21heCA+IDEgfHwgcy0+dl9tYXggPiAxKSkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIlN1YnNhbXBsaW5nIGluIEpQRUctTFMiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworCisgICAgLyogaWYgZGlmZmVyZW50IHNpemUsIHJlYWxsb2MvYWxsb2MgcGljdHVyZSAqLworICAgIGlmICggICB3aWR0aCAhPSBzLT53aWR0aCB8fCBoZWlnaHQgIT0gcy0+aGVpZ2h0CisgICAgICAgIHx8IGJpdHMgIT0gcy0+Yml0cworICAgICAgICB8fCBtZW1jbXAocy0+aF9jb3VudCwgaF9jb3VudCwgc2l6ZW9mKGhfY291bnQpKQorICAgICAgICB8fCBtZW1jbXAocy0+dl9jb3VudCwgdl9jb3VudCwgc2l6ZW9mKHZfY291bnQpKSkgeworCisgICAgICAgIHMtPndpZHRoICAgICAgPSB3aWR0aDsKKyAgICAgICAgcy0+aGVpZ2h0ICAgICA9IGhlaWdodDsKKyAgICAgICAgcy0+Yml0cyAgICAgICA9IGJpdHM7CisgICAgICAgIG1lbWNweShzLT5oX2NvdW50LCBoX2NvdW50LCBzaXplb2YoaF9jb3VudCkpOworICAgICAgICBtZW1jcHkocy0+dl9jb3VudCwgdl9jb3VudCwgc2l6ZW9mKHZfY291bnQpKTsKKyAgICAgICAgcy0+aW50ZXJsYWNlZCA9IDA7CisgICAgICAgIHMtPmdvdF9waWN0dXJlID0gMDsKKworICAgICAgICAvKiB0ZXN0IGludGVybGFjZWQgbW9kZSAqLworICAgICAgICBpZiAocy0+Zmlyc3RfcGljdHVyZSAgICYmCisgICAgICAgICAgICBzLT5vcmdfaGVpZ2h0ICE9IDAgJiYKKyAgICAgICAgICAgIHMtPmhlaWdodCA8ICgocy0+b3JnX2hlaWdodCAqIDMpIC8gNCkpIHsKKyAgICAgICAgICAgIHMtPmludGVybGFjZWQgICAgICAgICAgICAgICAgICAgID0gMTsKKyAgICAgICAgICAgIHMtPmJvdHRvbV9maWVsZCAgICAgICAgICAgICAgICAgID0gcy0+aW50ZXJsYWNlX3BvbGFyaXR5OworICAgICAgICAgICAgcy0+cGljdHVyZV9wdHItPmludGVybGFjZWRfZnJhbWUgPSAxOworICAgICAgICAgICAgcy0+cGljdHVyZV9wdHItPnRvcF9maWVsZF9maXJzdCAgPSAhcy0+aW50ZXJsYWNlX3BvbGFyaXR5OworICAgICAgICAgICAgaGVpZ2h0ICo9IDI7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhzLT5hdmN0eCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBzLT5maXJzdF9waWN0dXJlID0gMDsKKyAgICB9CisKKyAgICBpZiAocy0+Z290X3BpY3R1cmUgJiYgcy0+aW50ZXJsYWNlZCAmJiAocy0+Ym90dG9tX2ZpZWxkID09ICFzLT5pbnRlcmxhY2VfcG9sYXJpdHkpKSB7CisgICAgICAgIGlmIChzLT5wcm9ncmVzc2l2ZSkgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAicHJvZ3Jlc3NpdmVseSBjb2RlZCBpbnRlcmxhY2VkIHBpY3R1cmUiKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfSBlbHNleworICAgICAgICBpZiAocy0+dl9tYXggPT0gMSAmJiBzLT5oX21heCA9PSAxICYmIHMtPmxvc3NsZXNzPT0xICYmIChuYl9jb21wb25lbnRzPT0zIHx8IG5iX2NvbXBvbmVudHM9PTQpKQorICAgICAgICAgICAgcy0+cmdiID0gMTsKKyAgICAgICAgZWxzZSBpZiAoIXMtPmxvc3NsZXNzKQorICAgICAgICAgICAgcy0+cmdiID0gMDsKKyAgICAvKiBYWFg6IG5vdCBjb21wbGV0ZSB0ZXN0ICEgKi8KKyAgICBwaXhfZm10X2lkID0gKCh1bnNpZ25lZClzLT5oX2NvdW50WzBdIDw8IDI4KSB8IChzLT52X2NvdW50WzBdIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgIChzLT5oX2NvdW50WzFdIDw8IDIwKSB8IChzLT52X2NvdW50WzFdIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgIChzLT5oX2NvdW50WzJdIDw8IDEyKSB8IChzLT52X2NvdW50WzJdIDw8ICA4KSB8CisgICAgICAgICAgICAgICAgIChzLT5oX2NvdW50WzNdIDw8ICA0KSB8ICBzLT52X2NvdW50WzNdOworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicGl4IGZtdCBpZCAleFxuIiwgcGl4X2ZtdF9pZCk7CisgICAgLyogTk9URSB3ZSBkbyBub3QgYWxsb2NhdGUgcGljdHVyZXMgbGFyZ2UgZW5vdWdoIGZvciB0aGUgcG9zc2libGUKKyAgICAgKiBwYWRkaW5nIG9mIGgvdl9jb3VudCBiZWluZyA0ICovCisgICAgaWYgKCEocGl4X2ZtdF9pZCAmIDB4RDBEMEQwRDApKQorICAgICAgICBwaXhfZm10X2lkIC09IChwaXhfZm10X2lkICYgMHhGMEYwRjBGMCkgPj4gMTsKKyAgICBpZiAoIShwaXhfZm10X2lkICYgMHgwRDBEMEQwRCkpCisgICAgICAgIHBpeF9mbXRfaWQgLT0gKHBpeF9mbXRfaWQgJiAweDBGMEYwRjBGKSA+PiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBpbnQgaiA9IDYgKyAoaSYxKSAtIChpJjYpOworICAgICAgICBpbnQgaXMgPSAocGl4X2ZtdF9pZCA+PiAoNCppKSkgJiAweEY7CisgICAgICAgIGludCBqcyA9IChwaXhfZm10X2lkID4+ICg0KmopKSAmIDB4RjsKKworICAgICAgICBpZiAoaXMgPT0gMSAmJiBqcyAhPSAyICYmIChpIDwgMiB8fCBpID4gNSkpCisgICAgICAgICAgICBqcyA9IChwaXhfZm10X2lkID4+ICggOCArIDQqKGkmMSkpKSAmIDB4RjsKKyAgICAgICAgaWYgKGlzID09IDEgJiYganMgIT0gMiAmJiAoaSA8IDIgfHwgaSA+IDUpKQorICAgICAgICAgICAganMgPSAocGl4X2ZtdF9pZCA+PiAoMTYgKyA0KihpJjEpKSkgJiAweEY7CisKKyAgICAgICAgaWYgKGlzID09IDEgJiYganMgPT0gMikgeworICAgICAgICAgICAgaWYgKGkgJiAxKSBzLT51cHNjYWxlX2ggfD0gMSA8PCAoai8yKTsKKyAgICAgICAgICAgIGVsc2UgICAgICAgcy0+dXBzY2FsZV92IHw9IDEgPDwgKGovMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKHBpeF9mbXRfaWQpIHsKKyAgICBjYXNlIDB4MTExMTExMDA6CisgICAgICAgIGlmIChzLT5yZ2IpCisgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IHMtPmJpdHMgPD0gOSA/IEFWX1BJWF9GTVRfQkdSMjQgOiBBVl9QSVhfRk1UX0JHUjQ4OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzLT5jb21wb25lbnRfaWRbMF0gPT0gJ1EnICYmIHMtPmNvbXBvbmVudF9pZFsxXSA9PSAnRicgJiYgcy0+Y29tcG9uZW50X2lkWzJdID09ICdBJykgeworICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gcy0+Yml0cyA8PSA4ID8gQVZfUElYX0ZNVF9HQlJQIDogQVZfUElYX0ZNVF9HQlJQMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzLT5iaXRzIDw9IDgpIHMtPmF2Y3R4LT5waXhfZm10ID0gcy0+Y3NfaXR1NjAxID8gQVZfUElYX0ZNVF9ZVVY0NDRQIDogQVZfUElYX0ZNVF9ZVVZKNDQ0UDsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDE2OworICAgICAgICAgICAgcy0+YXZjdHgtPmNvbG9yX3JhbmdlID0gcy0+Y3NfaXR1NjAxID8gQVZDT0xfUkFOR0VfTVBFRyA6IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfYXNzZXJ0MChzLT5uYl9jb21wb25lbnRzID09IDMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTExMTExMTE6CisgICAgICAgIGlmIChzLT5yZ2IpCisgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IHMtPmJpdHMgPD0gOSA/IEFWX1BJWF9GTVRfQUJHUiA6IEFWX1BJWF9GTVRfUkdCQTY0OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzLT5hZG9iZV90cmFuc2Zvcm0gPT0gMCAmJiBzLT5iaXRzIDw9IDgpIHsKKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSQVA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gcy0+Yml0cyA8PSA4ID8gQVZfUElYX0ZNVF9ZVVZBNDQ0UCA6IEFWX1BJWF9GTVRfWVVWQTQ0NFAxNjsKKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+Y29sb3JfcmFuZ2UgPSBzLT5jc19pdHU2MDEgPyBBVkNPTF9SQU5HRV9NUEVHIDogQVZDT0xfUkFOR0VfSlBFRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9hc3NlcnQwKHMtPm5iX2NvbXBvbmVudHMgPT0gNCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgyMjExMTEyMjoKKyAgICBjYXNlIDB4MjIxMTExMTE6CisgICAgICAgIGlmIChzLT5hZG9iZV90cmFuc2Zvcm0gPT0gMCAmJiBzLT5iaXRzIDw9IDgpIHsKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJBUDsKKyAgICAgICAgICAgIHMtPnVwc2NhbGVfdiB8PSA2OworICAgICAgICAgICAgcy0+dXBzY2FsZV9oIHw9IDY7CisgICAgICAgIH0gZWxzZSBpZiAocy0+YWRvYmVfdHJhbnNmb3JtID09IDIgJiYgcy0+Yml0cyA8PSA4KSB7CisgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQ0NFA7CisgICAgICAgICAgICBzLT51cHNjYWxlX3YgfD0gNjsKKyAgICAgICAgICAgIHMtPnVwc2NhbGVfaCB8PSA2OworICAgICAgICAgICAgcy0+YXZjdHgtPmNvbG9yX3JhbmdlID0gcy0+Y3NfaXR1NjAxID8gQVZDT0xfUkFOR0VfTVBFRyA6IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocy0+Yml0cyA8PSA4KSBzLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQyMFA7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQyMFAxNjsKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5jb2xvcl9yYW5nZSA9IHMtPmNzX2l0dTYwMSA/IEFWQ09MX1JBTkdFX01QRUcgOiBBVkNPTF9SQU5HRV9KUEVHOworICAgICAgICB9CisgICAgICAgIGF2X2Fzc2VydDAocy0+bmJfY29tcG9uZW50cyA9PSA0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEyMTIxMTAwOgorICAgIGNhc2UgMHgyMjEyMjEwMDoKKyAgICBjYXNlIDB4MjEyMTExMDA6CisgICAgY2FzZSAweDIyMjExMjAwOgorICAgICAgICBpZiAocy0+Yml0cyA8PSA4KSBzLT5hdmN0eC0+cGl4X2ZtdCA9IHMtPmNzX2l0dTYwMSA/IEFWX1BJWF9GTVRfWVVWNDQ0UCA6IEFWX1BJWF9GTVRfWVVWSjQ0NFA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdG8gdW5rX3BpeGZtdDsKKyAgICAgICAgcy0+YXZjdHgtPmNvbG9yX3JhbmdlID0gcy0+Y3NfaXR1NjAxID8gQVZDT0xfUkFOR0VfTVBFRyA6IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgyMjIyMTEwMDoKKyAgICBjYXNlIDB4MjIxMTIyMDA6CisgICAgY2FzZSAweDExMjIyMjAwOgorICAgICAgICBpZiAocy0+Yml0cyA8PSA4KSBzLT5hdmN0eC0+cGl4X2ZtdCA9IHMtPmNzX2l0dTYwMSA/IEFWX1BJWF9GTVRfWVVWNDQ0UCA6IEFWX1BJWF9GTVRfWVVWSjQ0NFA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdG8gdW5rX3BpeGZtdDsKKyAgICAgICAgcy0+YXZjdHgtPmNvbG9yX3JhbmdlID0gcy0+Y3NfaXR1NjAxID8gQVZDT0xfUkFOR0VfTVBFRyA6IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMTAwMDAwMDoKKyAgICBjYXNlIDB4MTMwMDAwMDA6CisgICAgY2FzZSAweDE0MDAwMDAwOgorICAgIGNhc2UgMHgzMTAwMDAwMDoKKyAgICBjYXNlIDB4MzMwMDAwMDA6CisgICAgY2FzZSAweDM0MDAwMDAwOgorICAgIGNhc2UgMHg0MTAwMDAwMDoKKyAgICBjYXNlIDB4NDMwMDAwMDA6CisgICAgY2FzZSAweDQ0MDAwMDAwOgorICAgICAgICBpZihzLT5iaXRzIDw9IDgpCisgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMjExMTEwMDoKKyAgICBjYXNlIDB4MTQxMjEyMDA6CisgICAgY2FzZSAweDE0MTExMTAwOgorICAgIGNhc2UgMHgyMjIxMTEwMDoKKyAgICBjYXNlIDB4MjIxMTIxMDA6CisgICAgICAgIGlmIChzLT5jb21wb25lbnRfaWRbMF0gPT0gJ1EnICYmIHMtPmNvbXBvbmVudF9pZFsxXSA9PSAnRicgJiYgcy0+Y29tcG9uZW50X2lkWzJdID09ICdBJykgeworICAgICAgICAgICAgaWYgKHMtPmJpdHMgPD0gOCkgcy0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ290byB1bmtfcGl4Zm10OworICAgICAgICAgICAgcy0+dXBzY2FsZV92IHw9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocGl4X2ZtdF9pZCA9PSAweDE0MTExMTAwKQorICAgICAgICAgICAgICAgIHMtPnVwc2NhbGVfdiB8PSA2OworICAgICAgICAgICAgaWYgKHMtPmJpdHMgPD0gOCkgcy0+YXZjdHgtPnBpeF9mbXQgPSBzLT5jc19pdHU2MDEgPyBBVl9QSVhfRk1UX1lVVjQ0MFAgOiBBVl9QSVhfRk1UX1lVVko0NDBQOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvdG8gdW5rX3BpeGZtdDsKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5jb2xvcl9yYW5nZSA9IHMtPmNzX2l0dTYwMSA/IEFWQ09MX1JBTkdFX01QRUcgOiBBVkNPTF9SQU5HRV9KUEVHOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgyMTExMTEwMDoKKyAgICAgICAgaWYgKHMtPmNvbXBvbmVudF9pZFswXSA9PSAnUScgJiYgcy0+Y29tcG9uZW50X2lkWzFdID09ICdGJyAmJiBzLT5jb21wb25lbnRfaWRbMl0gPT0gJ0EnKSB7CisgICAgICAgICAgICBpZiAocy0+Yml0cyA8PSA4KSBzLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb3RvIHVua19waXhmbXQ7CisgICAgICAgICAgICBzLT51cHNjYWxlX2ggfD0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzLT5iaXRzIDw9IDgpIHMtPmF2Y3R4LT5waXhfZm10ID0gcy0+Y3NfaXR1NjAxID8gQVZfUElYX0ZNVF9ZVVY0MjJQIDogQVZfUElYX0ZNVF9ZVVZKNDIyUDsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTY7CisgICAgICAgICAgICBzLT5hdmN0eC0+Y29sb3JfcmFuZ2UgPSBzLT5jc19pdHU2MDEgPyBBVkNPTF9SQU5HRV9NUEVHIDogQVZDT0xfUkFOR0VfSlBFRzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MjIxMjExMDA6CisgICAgY2FzZSAweDIyMTExMjAwOgorICAgICAgICBpZiAocy0+Yml0cyA8PSA4KSBzLT5hdmN0eC0+cGl4X2ZtdCA9IHMtPmNzX2l0dTYwMSA/IEFWX1BJWF9GTVRfWVVWNDIyUCA6IEFWX1BJWF9GTVRfWVVWSjQyMlA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdG8gdW5rX3BpeGZtdDsKKyAgICAgICAgcy0+YXZjdHgtPmNvbG9yX3JhbmdlID0gcy0+Y3NfaXR1NjAxID8gQVZDT0xfUkFOR0VfTVBFRyA6IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgyMjExMTEwMDoKKyAgICBjYXNlIDB4NDIxMTExMDA6CisgICAgY2FzZSAweDI0MTExMTAwOgorICAgICAgICBpZiAocy0+Yml0cyA8PSA4KSBzLT5hdmN0eC0+cGl4X2ZtdCA9IHMtPmNzX2l0dTYwMSA/IEFWX1BJWF9GTVRfWVVWNDIwUCA6IEFWX1BJWF9GTVRfWVVWSjQyMFA7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQMTY7CisgICAgICAgIHMtPmF2Y3R4LT5jb2xvcl9yYW5nZSA9IHMtPmNzX2l0dTYwMSA/IEFWQ09MX1JBTkdFX01QRUcgOiBBVkNPTF9SQU5HRV9KUEVHOworICAgICAgICBpZiAocGl4X2ZtdF9pZCA9PSAweDQyMTExMTAwKSB7CisgICAgICAgICAgICBpZiAocy0+Yml0cyA+IDgpCisgICAgICAgICAgICAgICAgZ290byB1bmtfcGl4Zm10OworICAgICAgICAgICAgcy0+dXBzY2FsZV9oID0gNjsKKyAgICAgICAgfSBlbHNlIGlmIChwaXhfZm10X2lkID09IDB4MjQxMTExMDApIHsKKyAgICAgICAgICAgIGlmIChzLT5iaXRzID4gOCkKKyAgICAgICAgICAgICAgICBnb3RvIHVua19waXhmbXQ7CisgICAgICAgICAgICBzLT51cHNjYWxlX3YgPSA2OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg0MTExMTEwMDoKKyAgICAgICAgaWYgKHMtPmJpdHMgPD0gOCkgcy0+YXZjdHgtPnBpeF9mbXQgPSBzLT5jc19pdHU2MDEgPyBBVl9QSVhfRk1UX1lVVjQxMVAgOiBBVl9QSVhfRk1UX1lVVko0MTFQOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIHVua19waXhmbXQ7CisgICAgICAgIHMtPmF2Y3R4LT5jb2xvcl9yYW5nZSA9IHMtPmNzX2l0dTYwMSA/IEFWQ09MX1JBTkdFX01QRUcgOiBBVkNPTF9SQU5HRV9KUEVHOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgordW5rX3BpeGZtdDoKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmhhbmRsZWQgcGl4ZWwgZm9ybWF0IDB4JXggYml0czolZFxuIiwgcGl4X2ZtdF9pZCwgcy0+Yml0cyk7CisgICAgICAgIHMtPnVwc2NhbGVfaCA9IHMtPnVwc2NhbGVfdiA9IDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgaWYgKChzLT51cHNjYWxlX2ggfHwgcy0+dXBzY2FsZV92KSAmJiBzLT5hdmN0eC0+bG93cmVzKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibG93cmVzIG5vdCBzdXBwb3J0ZWQgZm9yIHdlaXJkIHN1YnNhbXBsaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAocy0+bHMpIHsKKyAgICAgICAgcy0+dXBzY2FsZV9oID0gcy0+dXBzY2FsZV92ID0gMDsKKyAgICAgICAgaWYgKHMtPm5iX2NvbXBvbmVudHMgPiAxKQorICAgICAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjI0OworICAgICAgICBlbHNlIGlmIChzLT5wYWxldHRlX2luZGV4ICYmIHMtPmJpdHMgPD0gOCkKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworICAgICAgICBlbHNlIGlmIChzLT5iaXRzIDw9IDgpCisgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTY7CisgICAgfQorCisgICAgcy0+cGl4X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHMtPmF2Y3R4LT5waXhfZm10KTsKKyAgICBpZiAoIXMtPnBpeF9kZXNjKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGdldCBhIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9yLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICB9CisKKyAgICBhdl9mcmFtZV91bnJlZihzLT5waWN0dXJlX3B0cik7CisgICAgaWYgKGZmX2dldF9idWZmZXIocy0+YXZjdHgsIHMtPnBpY3R1cmVfcHRyLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzLT5waWN0dXJlX3B0ci0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcy0+cGljdHVyZV9wdHItPmtleV9mcmFtZSA9IDE7CisgICAgcy0+Z290X3BpY3R1cmUgICAgICAgICAgICA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBzLT5saW5lc2l6ZVtpXSA9IHMtPnBpY3R1cmVfcHRyLT5saW5lc2l6ZVtpXSA8PCBzLT5pbnRlcmxhY2VkOworCisgICAgYXZfZGxvZyhzLT5hdmN0eCwgIiVkICVkICVkICVkICVkICVkXG4iLAorICAgICAgICAgICAgcy0+d2lkdGgsIHMtPmhlaWdodCwgcy0+bGluZXNpemVbMF0sIHMtPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgcy0+aW50ZXJsYWNlZCwgcy0+YXZjdHgtPmhlaWdodCk7CisKKyAgICBpZiAobGVuICE9ICg4ICsgKDMgKiBuYl9jb21wb25lbnRzKSkpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiZGVjb2RlX3NvZjA6IGVycm9yLCBsZW4oJWQpIG1pc21hdGNoXG4iLCBsZW4pOworICAgIH0KKworICAgIGlmIChzLT5yZ2IgJiYgIXMtPmxvc3NsZXNzICYmICFzLT5scykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvZGluZyBhbmQgcGl4ZWwgZm9ybWF0IGNvbWJpbmF0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIC8qIHRvdGFsbHkgYmxhbmsgcGljdHVyZSBhcyBwcm9ncmVzc2l2ZSBKUEVHIHdpbGwgb25seSBhZGQgZGV0YWlscyB0byBpdCAqLworICAgIGlmIChzLT5wcm9ncmVzc2l2ZSkgeworICAgICAgICBpbnQgYncgPSAod2lkdGggICsgcy0+aF9tYXggKiA4IC0gMSkgLyAocy0+aF9tYXggKiA4KTsKKyAgICAgICAgaW50IGJoID0gKGhlaWdodCArIHMtPnZfbWF4ICogOCAtIDEpIC8gKHMtPnZfbWF4ICogOCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jb21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgICAgIGludCBzaXplID0gYncgKiBiaCAqIHMtPmhfY291bnRbaV0gKiBzLT52X2NvdW50W2ldOworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPmJsb2Nrc1tpXSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+bGFzdF9ubnpbaV0pOworICAgICAgICAgICAgcy0+YmxvY2tzW2ldICAgICAgID0gYXZfbWFsbG9jel9hcnJheShzaXplLCBzaXplb2YoKipzLT5ibG9ja3MpKTsKKyAgICAgICAgICAgIHMtPmxhc3Rfbm56W2ldICAgICA9IGF2X21hbGxvY3pfYXJyYXkoc2l6ZSwgc2l6ZW9mKCoqcy0+bGFzdF9ubnopKTsKKyAgICAgICAgICAgIGlmICghcy0+YmxvY2tzW2ldIHx8ICFzLT5sYXN0X25ueltpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgcy0+YmxvY2tfc3RyaWRlW2ldID0gYncgKiBzLT5oX2NvdW50W2ldOworICAgICAgICB9CisgICAgICAgIG1lbXNldChzLT5jb2Vmc19maW5pc2hlZCwgMCwgc2l6ZW9mKHMtPmNvZWZzX2ZpbmlzaGVkKSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBtanBlZ19kZWNvZGVfZGMoTUpwZWdEZWNvZGVDb250ZXh0ICpzLCBpbnQgZGNfaW5kZXgpCit7CisgICAgaW50IGNvZGU7CisgICAgY29kZSA9IGdldF92bGMyKCZzLT5nYiwgcy0+dmxjc1swXVtkY19pbmRleF0udGFibGUsIDksIDIpOworICAgIGlmIChjb2RlIDwgMCB8fCBjb2RlID4gMTYpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJtanBlZ19kZWNvZGVfZGM6IGJhZCB2bGM6ICVkOiVkICglcClcbiIsCisgICAgICAgICAgICAgICAwLCBkY19pbmRleCwgJnMtPnZsY3NbMF1bZGNfaW5kZXhdKTsKKyAgICAgICAgcmV0dXJuIDB4ZmZmZmY7CisgICAgfQorCisgICAgaWYgKGNvZGUpCisgICAgICAgIHJldHVybiBnZXRfeGJpdHMoJnMtPmdiLCBjb2RlKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisvKiBkZWNvZGUgYmxvY2sgYW5kIGRlcXVhbnRpemUgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2Jsb2NrKE1KcGVnRGVjb2RlQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2ssIGludCBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGNfaW5kZXgsIGludCBhY19pbmRleCwgaW50MTZfdCAqcXVhbnRfbWF0cml4KQoreworICAgIGludCBjb2RlLCBpLCBqLCBsZXZlbCwgdmFsOworCisgICAgLyogREMgY29lZiAqLworICAgIHZhbCA9IG1qcGVnX2RlY29kZV9kYyhzLCBkY19pbmRleCk7CisgICAgaWYgKHZhbCA9PSAweGZmZmZmKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgZGNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgdmFsID0gdmFsICogcXVhbnRfbWF0cml4WzBdICsgcy0+bGFzdF9kY1tjb21wb25lbnRdOworICAgIHMtPmxhc3RfZGNbY29tcG9uZW50XSA9IHZhbDsKKyAgICBibG9ja1swXSA9IHZhbDsKKyAgICAvKiBBQyBjb2VmcyAqLworICAgIGkgPSAwOworICAgIHtPUEVOX1JFQURFUihyZSwgJnMtPmdiKTsKKyAgICBkbyB7CisgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgR0VUX1ZMQyhjb2RlLCByZSwgJnMtPmdiLCBzLT52bGNzWzFdW2FjX2luZGV4XS50YWJsZSwgOSwgMik7CisKKyAgICAgICAgaSArPSAoKHVuc2lnbmVkKWNvZGUpID4+IDQ7CisgICAgICAgICAgICBjb2RlICY9IDB4ZjsKKyAgICAgICAgaWYgKGNvZGUpIHsKKyAgICAgICAgICAgIGlmIChjb2RlID4gTUlOX0NBQ0hFX0JJVFMgLSAxNikKKyAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY2FjaGUgPSBHRVRfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICAgICAgaW50IHNpZ24gID0gKH5jYWNoZSkgPj4gMzE7CisgICAgICAgICAgICAgICAgbGV2ZWwgICAgID0gKE5FR19VU1IzMihzaWduIF4gY2FjaGUsY29kZSkgXiBzaWduKSAtIHNpZ247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIGNvZGUpOworCisgICAgICAgICAgICBpZiAoaSA+IDYzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBjb3VudDogJWRcbiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaiAgICAgICAgPSBzLT5zY2FudGFibGUucGVybXV0YXRlZFtpXTsKKyAgICAgICAgICAgIGJsb2NrW2pdID0gbGV2ZWwgKiBxdWFudF9tYXRyaXhbal07CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChpIDwgNjMpOworICAgIENMT1NFX1JFQURFUihyZSwgJnMtPmdiKTt9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZGNfcHJvZ3Jlc3NpdmUoTUpwZWdEZWNvZGVDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQsIGludCBkY19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnF1YW50X21hdHJpeCwgaW50IEFsKQoreworICAgIGludCB2YWw7CisgICAgcy0+YmRzcC5jbGVhcl9ibG9jayhibG9jayk7CisgICAgdmFsID0gbWpwZWdfZGVjb2RlX2RjKHMsIGRjX2luZGV4KTsKKyAgICBpZiAodmFsID09IDB4ZmZmZmYpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBkY1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICB2YWwgPSAodmFsICogcXVhbnRfbWF0cml4WzBdIDw8IEFsKSArIHMtPmxhc3RfZGNbY29tcG9uZW50XTsKKyAgICBzLT5sYXN0X2RjW2NvbXBvbmVudF0gPSB2YWw7CisgICAgYmxvY2tbMF0gPSB2YWw7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSBibG9jayBhbmQgZGVxdWFudGl6ZSAtIHByb2dyZXNzaXZlIEpQRUcgdmVyc2lvbiAqLworc3RhdGljIGludCBkZWNvZGVfYmxvY2tfcHJvZ3Jlc3NpdmUoTUpwZWdEZWNvZGVDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmxhc3Rfbm56LCBpbnQgYWNfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpxdWFudF9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3MsIGludCBzZSwgaW50IEFsLCBpbnQgKkVPQlJVTikKK3sKKyAgICBpbnQgY29kZSwgaSwgaiwgbGV2ZWwsIHZhbCwgcnVuOworCisgICAgaWYgKCpFT0JSVU4pIHsKKyAgICAgICAgKCpFT0JSVU4pLS07CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHsKKyAgICAgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgICAgIGZvciAoaSA9IHNzOyA7IGkrKykgeworICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOworICAgICAgICAgICAgR0VUX1ZMQyhjb2RlLCByZSwgJnMtPmdiLCBzLT52bGNzWzJdW2FjX2luZGV4XS50YWJsZSwgOSwgMik7CisKKyAgICAgICAgICAgIHJ1biA9ICgodW5zaWduZWQpIGNvZGUpID4+IDQ7CisgICAgICAgICAgICBjb2RlICY9IDB4RjsKKyAgICAgICAgICAgIGlmIChjb2RlKSB7CisgICAgICAgICAgICAgICAgaSArPSBydW47CisgICAgICAgICAgICAgICAgaWYgKGNvZGUgPiBNSU5fQ0FDSEVfQklUUyAtIDE2KQorICAgICAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZSA9IEdFVF9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNpZ24gID0gKH5jYWNoZSkgPj4gMzE7CisgICAgICAgICAgICAgICAgICAgIGxldmVsICAgICA9IChORUdfVVNSMzIoc2lnbiBeIGNhY2hlLGNvZGUpIF4gc2lnbikgLSBzaWduOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIGNvZGUpOworCisgICAgICAgICAgICAgICAgaWYgKGkgPj0gc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSBzLT5zY2FudGFibGUucGVybXV0YXRlZFtzZV07CisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsICogcXVhbnRfbWF0cml4W2pdIDw8IEFsOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBjb3VudDogJWRcbiIsIGkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaiA9IHMtPnNjYW50YWJsZS5wZXJtdXRhdGVkW2ldOworICAgICAgICAgICAgICAgIGJsb2NrW2pdID0gbGV2ZWwgKiBxdWFudF9tYXRyaXhbal0gPDwgQWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChydW4gPT0gMHhGKSB7Ly8gWlJMIC0gc2tpcCAxNSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgICAgaSArPSAxNTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiWlJMIG92ZXJmbG93OiAlZFxuIiwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9ICgxIDw8IHJ1bik7CisgICAgICAgICAgICAgICAgICAgIGlmIChydW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSBORUdfVVNSMzIoR0VUX0NBQ0hFKHJlLCAmcy0+Z2IpLCBydW4pOworICAgICAgICAgICAgICAgICAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsICZzLT5nYiwgcnVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqRU9CUlVOID0gdmFsIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENMT1NFX1JFQURFUihyZSwgJnMtPmdiKTsKKyAgICB9CisKKyAgICBpZiAoaSA+ICpsYXN0X25ueikKKyAgICAgICAgKmxhc3Rfbm56ID0gaTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFJFRklORV9CSVQoaikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpZ24gPSBibG9ja1tqXSA+PiAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmxvY2tbal0gKz0gU0hPV19VQklUUyhyZSwgJnMtPmdiLCAxKSAqICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKHF1YW50X21hdHJpeFtqXSBeIHNpZ24pIC0gc2lnbikgPDwgQWw7ICAgICAgICAgICAgXAorICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgWkVST19SVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZm9yICg7IDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGkgPiBsYXN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaSArPSBydW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaSA+IHNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGNvdW50OiAlZFxuIiwgaSk7IFwKKyAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGogPSBzLT5zY2FudGFibGUucGVybXV0YXRlZFtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJsb2NrW2pdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUkVGSU5FX0JJVChqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKHJ1bi0tID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLyogZGVjb2RlIGJsb2NrIGFuZCBkZXF1YW50aXplIC0gcHJvZ3Jlc3NpdmUgSlBFRyByZWZpbmVtZW50IHBhc3MgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2Jsb2NrX3JlZmluZW1lbnQoTUpwZWdEZWNvZGVDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbGFzdF9ubnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY19pbmRleCwgaW50MTZfdCAqcXVhbnRfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3MsIGludCBzZSwgaW50IEFsLCBpbnQgKkVPQlJVTikKK3sKKyAgICBpbnQgY29kZSwgaSA9IHNzLCBqLCBzaWduLCB2YWwsIHJ1bjsKKyAgICBpbnQgbGFzdCAgICA9IEZGTUlOKHNlLCAqbGFzdF9ubnopOworCisgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgaWYgKCpFT0JSVU4pIHsKKyAgICAgICAgKCpFT0JSVU4pLS07CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICg7IDsgaSsrKSB7CisgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICBHRVRfVkxDKGNvZGUsIHJlLCAmcy0+Z2IsIHMtPnZsY3NbMl1bYWNfaW5kZXhdLnRhYmxlLCA5LCAyKTsKKworICAgICAgICAgICAgaWYgKGNvZGUgJiAweEYpIHsKKyAgICAgICAgICAgICAgICBydW4gPSAoKHVuc2lnbmVkKSBjb2RlKSA+PiA0OworICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgICAgICB2YWwgPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgICAgIFpFUk9fUlVOOworICAgICAgICAgICAgICAgIGogPSBzLT5zY2FudGFibGUucGVybXV0YXRlZFtpXTsKKyAgICAgICAgICAgICAgICB2YWwtLTsKKyAgICAgICAgICAgICAgICBibG9ja1tqXSA9ICgocXVhbnRfbWF0cml4W2pdXnZhbCkgLSB2YWwpIDw8IEFsOworICAgICAgICAgICAgICAgIGlmIChpID09IHNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID4gKmxhc3Rfbm56KQorICAgICAgICAgICAgICAgICAgICAgICAgKmxhc3Rfbm56ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ1biA9ICgodW5zaWduZWQpIGNvZGUpID4+IDQ7CisgICAgICAgICAgICAgICAgaWYgKHJ1biA9PSAweEYpIHsKKyAgICAgICAgICAgICAgICAgICAgWkVST19SVU47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gcnVuOworICAgICAgICAgICAgICAgICAgICBydW4gPSAoMSA8PCBydW4pOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgICAgICBydW4gKz0gU0hPV19VQklUUyhyZSwgJnMtPmdiLCB2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsICZzLT5nYiwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqRU9CUlVOID0gcnVuIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPiAqbGFzdF9ubnopCisgICAgICAgICAgICAqbGFzdF9ubnogPSBpOworICAgIH0KKworICAgIGZvciAoOyBpIDw9IGxhc3Q7IGkrKykgeworICAgICAgICBqID0gcy0+c2NhbnRhYmxlLnBlcm11dGF0ZWRbaV07CisgICAgICAgIGlmIChibG9ja1tqXSkKKyAgICAgICAgICAgIFJFRklORV9CSVQoaikKKyAgICB9CisgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOworCisgICAgcmV0dXJuIDA7Cit9CisjdW5kZWYgUkVGSU5FX0JJVAorI3VuZGVmIFpFUk9fUlVOCisKK3N0YXRpYyBpbnQgaGFuZGxlX3JzdG4oTUpwZWdEZWNvZGVDb250ZXh0ICpzLCBpbnQgbmJfY29tcG9uZW50cykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmVzZXQgPSAwOworCisgICAgaWYgKHMtPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICAgICAgcy0+cmVzdGFydF9jb3VudC0tOworICAgICAgICBpZihzLT5yZXN0YXJ0X2NvdW50ID09IDAgJiYgcy0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RIUCl7CisgICAgICAgICAgICBhbGlnbl9nZXRfYml0cygmcy0+Z2IpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2NvbXBvbmVudHM7IGkrKykgLyogcmVzZXQgZGMgKi8KKyAgICAgICAgICAgICAgICBzLT5sYXN0X2RjW2ldID0gKDQgPDwgcy0+Yml0cyk7CisgICAgICAgIH0KKworICAgICAgICBpID0gOCArICgoLWdldF9iaXRzX2NvdW50KCZzLT5nYikpICYgNyk7CisgICAgICAgIC8qIHNraXAgUlNUbiAqLworICAgICAgICBpZiAocy0+cmVzdGFydF9jb3VudCA9PSAwKSB7CisgICAgICAgICAgICBpZiggICBzaG93X2JpdHMoJnMtPmdiLCBpKSA9PSAoMSA8PCBpKSAtIDEKKyAgICAgICAgICAgICAgIHx8IHNob3dfYml0cygmcy0+Z2IsIGkpID09IDB4RkYpIHsKKyAgICAgICAgICAgICAgICBpbnQgcG9zID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBhbGlnbl9nZXRfYml0cygmcy0+Z2IpOworICAgICAgICAgICAgICAgIHdoaWxlIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPj0gOCAmJiBzaG93X2JpdHMoJnMtPmdiLCA4KSA9PSAweEZGKQorICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpID49IDggJiYgKGdldF9iaXRzKCZzLT5nYiwgOCkgJiAweEY4KSA9PSAweEQwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb21wb25lbnRzOyBpKyspIC8qIHJlc2V0IGRjICovCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X2RjW2ldID0gKDQgPDwgcy0+Yml0cyk7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0ID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCBwb3MgLSBnZXRfYml0c19jb3VudCgmcy0+Z2IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzZXQ7Cit9CisKK3N0YXRpYyBpbnQgbGpwZWdfZGVjb2RlX3JnYl9zY2FuKE1KcGVnRGVjb2RlQ29udGV4dCAqcywgaW50IG5iX2NvbXBvbmVudHMsIGludCBwcmVkaWN0b3IsIGludCBwb2ludF90cmFuc2Zvcm0pCit7CisgICAgaW50IGksIG1iX3gsIG1iX3k7CisgICAgdWludDE2X3QgKCpidWZmZXIpWzRdOworICAgIGludCBsZWZ0WzRdLCB0b3BbNF0sIHRvcGxlZnRbNF07CisgICAgY29uc3QgaW50IGxpbmVzaXplID0gcy0+bGluZXNpemVbMF07CisgICAgY29uc3QgaW50IG1hc2sgICAgID0gKCgxIDw8IHMtPmJpdHMpIC0gMSkgPDwgcG9pbnRfdHJhbnNmb3JtOworICAgIGludCByZXN5bmNfbWJfeSA9IDA7CisgICAgaW50IHJlc3luY19tYl94ID0gMDsKKworICAgIGlmIChzLT5uYl9jb21wb25lbnRzICE9IDMgJiYgcy0+bmJfY29tcG9uZW50cyAhPSA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAocy0+dl9tYXggIT0gMSB8fCBzLT5oX21heCAhPSAxIHx8ICFzLT5sb3NzbGVzcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKworICAgIHMtPnJlc3RhcnRfY291bnQgPSBzLT5yZXN0YXJ0X2ludGVydmFsOworCisgICAgYXZfZmFzdF9tYWxsb2MoJnMtPmxqcGVnX2J1ZmZlciwgJnMtPmxqcGVnX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClzLT5tYl93aWR0aCAqIDQgKiBzaXplb2Yocy0+bGpwZWdfYnVmZmVyWzBdWzBdKSk7CisgICAgYnVmZmVyID0gcy0+bGpwZWdfYnVmZmVyOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgYnVmZmVyWzBdW2ldID0gMSA8PCAocy0+Yml0cyAtIDEpOworCisgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IHMtPm1iX2hlaWdodDsgbWJfeSsrKSB7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IHMtPnBpY3R1cmVfcHRyLT5kYXRhWzBdICsgKGxpbmVzaXplICogbWJfeSk7CisKKyAgICAgICAgaWYgKHMtPmludGVybGFjZWQgJiYgcy0+Ym90dG9tX2ZpZWxkKQorICAgICAgICAgICAgcHRyICs9IGxpbmVzaXplID4+IDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIHRvcFtpXSA9IGxlZnRbaV0gPSB0b3BsZWZ0W2ldID0gYnVmZmVyWzBdW2ldOworCisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICBpbnQgbW9kaWZpZWRfcHJlZGljdG9yID0gcHJlZGljdG9yOworCisgICAgICAgICAgICBpZiAocy0+cmVzdGFydF9pbnRlcnZhbCAmJiAhcy0+cmVzdGFydF9jb3VudCl7CisgICAgICAgICAgICAgICAgcy0+cmVzdGFydF9jb3VudCA9IHMtPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgcmVzeW5jX21iX3ggPSBtYl94OworICAgICAgICAgICAgICAgIHJlc3luY19tYl95ID0gbWJfeTsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgdG9wW2ldID0gbGVmdFtpXT0gdG9wbGVmdFtpXT0gMSA8PCAocy0+Yml0cyAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1iX3kgPT0gcmVzeW5jX21iX3kgfHwgbWJfeSA9PSByZXN5bmNfbWJfeSsxICYmIG1iX3ggPCByZXN5bmNfbWJfeCB8fCAhbWJfeCkKKyAgICAgICAgICAgICAgICBtb2RpZmllZF9wcmVkaWN0b3IgPSAxOworCisgICAgICAgICAgICBmb3IgKGk9MDtpPG5iX2NvbXBvbmVudHM7aSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHByZWQsIGRjOworCisgICAgICAgICAgICAgICAgdG9wbGVmdFtpXSA9IHRvcFtpXTsKKyAgICAgICAgICAgICAgICB0b3BbaV0gICAgID0gYnVmZmVyW21iX3hdW2ldOworCisgICAgICAgICAgICAgICAgUFJFRElDVChwcmVkLCB0b3BsZWZ0W2ldLCB0b3BbaV0sIGxlZnRbaV0sIG1vZGlmaWVkX3ByZWRpY3Rvcik7CisKKyAgICAgICAgICAgICAgICBkYyA9IG1qcGVnX2RlY29kZV9kYyhzLCBzLT5kY19pbmRleFtpXSk7CisgICAgICAgICAgICAgICAgaWYoZGMgPT0gMHhGRkZGRikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgbGVmdFtpXSA9IGJ1ZmZlclttYl94XVtpXSA9CisgICAgICAgICAgICAgICAgICAgIG1hc2sgJiAocHJlZCArIChkYyA8PCBwb2ludF90cmFuc2Zvcm0pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPnJlc3RhcnRfaW50ZXJ2YWwgJiYgIS0tcy0+cmVzdGFydF9jb3VudCkgeworICAgICAgICAgICAgICAgIGFsaWduX2dldF9iaXRzKCZzLT5nYik7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMTYpOyAvKiBza2lwIFJTVG4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocy0+bmJfY29tcG9uZW50cyA9PSA0KSB7CisgICAgICAgICAgICBmb3IoaT0wOyBpPG5iX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBjPSBzLT5jb21wX2luZGV4W2ldOworICAgICAgICAgICAgICAgIGlmIChzLT5iaXRzIDw9IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRyWzQqbWJfeCszLWNdID0gYnVmZmVyW21iX3hdW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHMtPmJpdHMgPT0gOSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCopcHRyKVs0Km1iX3grY10gPSBidWZmZXJbbWJfeF1baV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+cmN0KSB7CisgICAgICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgICAgIHB0clszKm1iX3ggKyAxXSA9IGJ1ZmZlclttYl94XVswXSAtICgoYnVmZmVyW21iX3hdWzFdICsgYnVmZmVyW21iX3hdWzJdIC0gMHgyMDApID4+IDIpOworICAgICAgICAgICAgICAgIHB0clszKm1iX3ggKyAwXSA9IGJ1ZmZlclttYl94XVsxXSArIHB0clszKm1iX3ggKyAxXTsKKyAgICAgICAgICAgICAgICBwdHJbMyptYl94ICsgMl0gPSBidWZmZXJbbWJfeF1bMl0gKyBwdHJbMyptYl94ICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+cGVnYXN1c19yY3QpIHsKKyAgICAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICAgICAgcHRyWzMqbWJfeCArIDFdID0gYnVmZmVyW21iX3hdWzBdIC0gKChidWZmZXJbbWJfeF1bMV0gKyBidWZmZXJbbWJfeF1bMl0pID4+IDIpOworICAgICAgICAgICAgICAgIHB0clszKm1iX3ggKyAwXSA9IGJ1ZmZlclttYl94XVsxXSArIHB0clszKm1iX3ggKyAxXTsKKyAgICAgICAgICAgICAgICBwdHJbMyptYl94ICsgMl0gPSBidWZmZXJbbWJfeF1bMl0gKyBwdHJbMyptYl94ICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IoaT0wOyBpPG5iX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBjPSBzLT5jb21wX2luZGV4W2ldOworICAgICAgICAgICAgICAgIGlmIChzLT5iaXRzIDw9IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRyWzMqbWJfeCsyLWNdID0gYnVmZmVyW21iX3hdW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHMtPmJpdHMgPT0gOSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCopcHRyKVszKm1iX3grMi1jXSA9IGJ1ZmZlclttYl94XVtpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsanBlZ19kZWNvZGVfeXV2X3NjYW4oTUpwZWdEZWNvZGVDb250ZXh0ICpzLCBpbnQgcHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvaW50X3RyYW5zZm9ybSwgaW50IG5iX2NvbXBvbmVudHMpCit7CisgICAgaW50IGksIG1iX3gsIG1iX3ksIG1hc2s7CisgICAgaW50IGJpdHM9IChzLT5iaXRzKzcpJn43OworICAgIGludCByZXN5bmNfbWJfeSA9IDA7CisgICAgaW50IHJlc3luY19tYl94ID0gMDsKKworICAgIHBvaW50X3RyYW5zZm9ybSArPSBiaXRzIC0gcy0+Yml0czsKKyAgICBtYXNrID0gKCgxIDw8IHMtPmJpdHMpIC0gMSkgPDwgcG9pbnRfdHJhbnNmb3JtOworCisgICAgYXZfYXNzZXJ0MChuYl9jb21wb25lbnRzPj0xICYmIG5iX2NvbXBvbmVudHM8PTQpOworCisgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IHMtPm1iX2hlaWdodDsgbWJfeSsrKSB7CisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICBpZiAocy0+cmVzdGFydF9pbnRlcnZhbCAmJiAhcy0+cmVzdGFydF9jb3VudCl7CisgICAgICAgICAgICAgICAgcy0+cmVzdGFydF9jb3VudCA9IHMtPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgcmVzeW5jX21iX3ggPSBtYl94OworICAgICAgICAgICAgICAgIHJlc3luY19tYl95ID0gbWJfeTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIW1iX3ggfHwgbWJfeSA9PSByZXN5bmNfbWJfeSB8fCBtYl95ID09IHJlc3luY19tYl95KzEgJiYgbWJfeCA8IHJlc3luY19tYl94IHx8IHMtPmludGVybGFjZWQpeworICAgICAgICAgICAgICAgIGludCB0b3Byb3cgID0gbWJfeSA9PSByZXN5bmNfbWJfeSB8fCBtYl95ID09IHJlc3luY19tYl95KzEgJiYgbWJfeCA8IHJlc3luY19tYl94OworICAgICAgICAgICAgICAgIGludCBsZWZ0Y29sID0gIW1iX3ggfHwgbWJfeSA9PSByZXN5bmNfbWJfeSAmJiBtYl94ID09IHJlc3luY19tYl94OworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyOworICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcHRyMTY7CisgICAgICAgICAgICAgICAgICAgIGludCBuLCBoLCB2LCB4LCB5LCBjLCBqLCBsaW5lc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgbiA9IHMtPm5iX2Jsb2Nrc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHMtPmNvbXBfaW5kZXhbaV07CisgICAgICAgICAgICAgICAgICAgIGggPSBzLT5oX3Njb3VudFtpXTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IHMtPnZfc2NvdW50W2ldOworICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgeSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplPSBzLT5saW5lc2l6ZVtjXTsKKworICAgICAgICAgICAgICAgICAgICBpZihiaXRzPjgpIGxpbmVzaXplIC89IDI7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDsgajxuOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkLCBkYzsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGMgPSBtanBlZ19kZWNvZGVfZGMocywgcy0+ZGNfaW5kZXhbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGMgPT0gMHhGRkZGRikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihiaXRzPD04KXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHMtPnBpY3R1cmVfcHRyLT5kYXRhW2NdICsgKGxpbmVzaXplICogKHYgKiBtYl95ICsgeSkpICsgKGggKiBtYl94ICsgeCk7IC8vRklYTUUgb3B0aW1pemUgdGhpcyBjcmFwCisgICAgICAgICAgICAgICAgICAgICAgICBpZih5PT0wICYmIHRvcHJvdyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeD09MCAmJiBsZWZ0Y29sKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZD0gMSA8PCAoYml0cyAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkPSBwdHJbLTFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHg9PTAgJiYgbGVmdGNvbCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQ9IHB0clstbGluZXNpemVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUNUKHByZWQsIHB0clstbGluZXNpemUtMV0sIHB0clstbGluZXNpemVdLCBwdHJbLTFdLCBwcmVkaWN0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmludGVybGFjZWQgJiYgcy0+Ym90dG9tX2ZpZWxkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSBsaW5lc2l6ZSA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCAmPSBtYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgKnB0cj0gcHJlZCArIChkYyA8PCBwb2ludF90cmFuc2Zvcm0pOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyMTYgPSAodWludDE2X3QqKShzLT5waWN0dXJlX3B0ci0+ZGF0YVtjXSArIDIqKGxpbmVzaXplICogKHYgKiBtYl95ICsgeSkpICsgMiooaCAqIG1iX3ggKyB4KSk7IC8vRklYTUUgb3B0aW1pemUgdGhpcyBjcmFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeT09MCAmJiB0b3Byb3cpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih4PT0wICYmIGxlZnRjb2wpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZD0gMSA8PCAoYml0cyAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQ9IHB0cjE2Wy0xXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih4PT0wICYmIGxlZnRjb2wpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZD0gcHRyMTZbLWxpbmVzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUNUKHByZWQsIHB0cjE2Wy1saW5lc2l6ZS0xXSwgcHRyMTZbLWxpbmVzaXplXSwgcHRyMTZbLTFdLCBwcmVkaWN0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmludGVybGFjZWQgJiYgcy0+Ym90dG9tX2ZpZWxkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIxNiArPSBsaW5lc2l6ZSA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQgJj0gbWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyMTY9IHByZWQgKyAoZGMgPDwgcG9pbnRfdHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3ggPT0gaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwdHI7CisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpwdHIxNjsKKyAgICAgICAgICAgICAgICAgICAgaW50IG4sIGgsIHYsIHgsIHksIGMsIGosIGxpbmVzaXplLCBkYzsKKyAgICAgICAgICAgICAgICAgICAgbiAgICAgICAgPSBzLT5uYl9ibG9ja3NbaV07CisgICAgICAgICAgICAgICAgICAgIGMgICAgICAgID0gcy0+Y29tcF9pbmRleFtpXTsKKyAgICAgICAgICAgICAgICAgICAgaCAgICAgICAgPSBzLT5oX3Njb3VudFtpXTsKKyAgICAgICAgICAgICAgICAgICAgdiAgICAgICAgPSBzLT52X3Njb3VudFtpXTsKKyAgICAgICAgICAgICAgICAgICAgeCAgICAgICAgPSAwOworICAgICAgICAgICAgICAgICAgICB5ICAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplID0gcy0+bGluZXNpemVbY107CisKKyAgICAgICAgICAgICAgICAgICAgaWYoYml0cz44KSBsaW5lc2l6ZSAvPSAyOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkOworCisgICAgICAgICAgICAgICAgICAgICAgICBkYyA9IG1qcGVnX2RlY29kZV9kYyhzLCBzLT5kY19pbmRleFtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihkYyA9PSAweEZGRkZGKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJpdHM8PTgpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHMtPnBpY3R1cmVfcHRyLT5kYXRhW2NdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5lc2l6ZSAqICh2ICogbWJfeSArIHkpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaCAqIG1iX3ggKyB4KTsgLy9GSVhNRSBvcHRpbWl6ZSB0aGlzIGNyYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUNUKHByZWQsIHB0clstbGluZXNpemUtMV0sIHB0clstbGluZXNpemVdLCBwdHJbLTFdLCBwcmVkaWN0b3IpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCAmPSBtYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSBwcmVkICsgKGRjIDw8IHBvaW50X3RyYW5zZm9ybSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIxNiA9ICh1aW50MTZfdCopKHMtPnBpY3R1cmVfcHRyLT5kYXRhW2NdICsgMioobGluZXNpemUgKiAodiAqIG1iX3kgKyB5KSkgKyAyKihoICogbWJfeCArIHgpKTsgLy9GSVhNRSBvcHRpbWl6ZSB0aGlzIGNyYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUNUKHByZWQsIHB0cjE2Wy1saW5lc2l6ZS0xXSwgcHRyMTZbLWxpbmVzaXplXSwgcHRyMTZbLTFdLCBwcmVkaWN0b3IpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCAmPSBtYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIxNj0gcHJlZCArIChkYyA8PCBwb2ludF90cmFuc2Zvcm0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKyt4ID09IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+cmVzdGFydF9pbnRlcnZhbCAmJiAhLS1zLT5yZXN0YXJ0X2NvdW50KSB7CisgICAgICAgICAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxNik7IC8qIHNraXAgUlNUbiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIG1qcGVnX2NvcHlfYmxvY2soTUpwZWdEZWNvZGVDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50IGxvd3JlcykKK3sKKyAgICBzd2l0Y2ggKGxvd3JlcykgeworICAgIGNhc2UgMDogcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYlsxXVswXShkc3QsIHNyYywgbGluZXNpemUsIDgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IGNvcHlfYmxvY2s0KGRzdCwgc3JjLCBsaW5lc2l6ZSwgbGluZXNpemUsIDQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6IGNvcHlfYmxvY2syKGRzdCwgc3JjLCBsaW5lc2l6ZSwgbGluZXNpemUsIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICpkc3QgPSAqc3JjOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNoaWZ0X291dHB1dChNSnBlZ0RlY29kZUNvbnRleHQgKnMsIHVpbnQ4X3QgKnB0ciwgaW50IGxpbmVzaXplKQoreworICAgIGludCBibG9ja194LCBibG9ja195OworICAgIGludCBzaXplID0gOCA+PiBzLT5hdmN0eC0+bG93cmVzOworICAgIGlmIChzLT5iaXRzID4gOCkgeworICAgICAgICBmb3IgKGJsb2NrX3k9MDsgYmxvY2tfeTxzaXplOyBibG9ja195KyspCisgICAgICAgICAgICBmb3IgKGJsb2NrX3g9MDsgYmxvY2tfeDxzaXplOyBibG9ja194KyspCisgICAgICAgICAgICAgICAgKih1aW50MTZfdCopKHB0ciArIDIqYmxvY2tfeCArIGJsb2NrX3kqbGluZXNpemUpIDw8PSAxNiAtIHMtPmJpdHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChibG9ja195PTA7IGJsb2NrX3k8c2l6ZTsgYmxvY2tfeSsrKQorICAgICAgICAgICAgZm9yIChibG9ja194PTA7IGJsb2NrX3g8c2l6ZTsgYmxvY2tfeCsrKQorICAgICAgICAgICAgICAgICoocHRyICsgYmxvY2tfeCArIGJsb2NrX3kqbGluZXNpemUpIDw8PSA4IC0gcy0+Yml0czsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbWpwZWdfZGVjb2RlX3NjYW4oTUpwZWdEZWNvZGVDb250ZXh0ICpzLCBpbnQgbmJfY29tcG9uZW50cywgaW50IEFoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQWwsIGNvbnN0IHVpbnQ4X3QgKm1iX2JpdG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9iaXRtYXNrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnJlZmVyZW5jZSkKK3sKKyAgICBpbnQgaSwgbWJfeCwgbWJfeTsKKyAgICB1aW50OF90ICpkYXRhW01BWF9DT01QT05FTlRTXTsKKyAgICBjb25zdCB1aW50OF90ICpyZWZlcmVuY2VfZGF0YVtNQVhfQ09NUE9ORU5UU107CisgICAgaW50IGxpbmVzaXplW01BWF9DT01QT05FTlRTXTsKKyAgICBHZXRCaXRDb250ZXh0IG1iX2JpdG1hc2tfZ2IgPSB7MH07IC8vIGluaXRpYWxpemUgdG8gc2lsZW5jZSBnY2Mgd2FybmluZworICAgIGludCBieXRlc19wZXJfcGl4ZWwgPSAxICsgKHMtPmJpdHMgPiA4KTsKKworICAgIGlmIChtYl9iaXRtYXNrKSB7CisgICAgICAgIGlmIChtYl9iaXRtYXNrX3NpemUgIT0gKHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0ICsgNyk+PjMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibWJfYml0bWFza19zaXplIG1pc21hdGNoZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaW5pdF9nZXRfYml0cygmbWJfYml0bWFza19nYiwgbWJfYml0bWFzaywgcy0+bWJfd2lkdGggKiBzLT5tYl9oZWlnaHQpOworICAgIH0KKworICAgIHMtPnJlc3RhcnRfY291bnQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICBpbnQgYyAgID0gcy0+Y29tcF9pbmRleFtpXTsKKyAgICAgICAgZGF0YVtjXSA9IHMtPnBpY3R1cmVfcHRyLT5kYXRhW2NdOworICAgICAgICByZWZlcmVuY2VfZGF0YVtjXSA9IHJlZmVyZW5jZSA/IHJlZmVyZW5jZS0+ZGF0YVtjXSA6IE5VTEw7CisgICAgICAgIGxpbmVzaXplW2NdID0gcy0+bGluZXNpemVbY107CisgICAgICAgIHMtPmNvZWZzX2ZpbmlzaGVkW2NdIHw9IDE7CisgICAgfQorCisgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IHMtPm1iX2hlaWdodDsgbWJfeSsrKSB7CisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgY29weV9tYiA9IG1iX2JpdG1hc2sgJiYgIWdldF9iaXRzMSgmbWJfYml0bWFza19nYik7CisKKyAgICAgICAgICAgIGlmIChzLT5yZXN0YXJ0X2ludGVydmFsICYmICFzLT5yZXN0YXJ0X2NvdW50KQorICAgICAgICAgICAgICAgIHMtPnJlc3RhcnRfY291bnQgPSBzLT5yZXN0YXJ0X2ludGVydmFsOworCisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAib3ZlcnJlYWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIC1nZXRfYml0c19sZWZ0KCZzLT5nYikpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0cjsKKyAgICAgICAgICAgICAgICBpbnQgbiwgaCwgdiwgeCwgeSwgYywgajsKKyAgICAgICAgICAgICAgICBpbnQgYmxvY2tfb2Zmc2V0OworICAgICAgICAgICAgICAgIG4gPSBzLT5uYl9ibG9ja3NbaV07CisgICAgICAgICAgICAgICAgYyA9IHMtPmNvbXBfaW5kZXhbaV07CisgICAgICAgICAgICAgICAgaCA9IHMtPmhfc2NvdW50W2ldOworICAgICAgICAgICAgICAgIHYgPSBzLT52X3Njb3VudFtpXTsKKyAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICB5ID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrX29mZnNldCA9ICgoKGxpbmVzaXplW2NdICogKHYgKiBtYl95ICsgeSkgKiA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGggKiBtYl94ICsgeCkgKiA4ICogYnl0ZXNfcGVyX3BpeGVsKSA+PiBzLT5hdmN0eC0+bG93cmVzKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocy0+aW50ZXJsYWNlZCAmJiBzLT5ib3R0b21fZmllbGQpCisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19vZmZzZXQgKz0gbGluZXNpemVbY10gPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gZGF0YVtjXSArIGJsb2NrX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzLT5wcm9ncmVzc2l2ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvcHlfbWIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWpwZWdfY29weV9ibG9jayhzLCBwdHIsIHJlZmVyZW5jZV9kYXRhW2NdICsgYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemVbY10sIHMtPmF2Y3R4LT5sb3dyZXMpOworCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5iZHNwLmNsZWFyX2Jsb2NrKHMtPmJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlX2Jsb2NrKHMsIHMtPmJsb2NrLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGNfaW5kZXhbaV0sIHMtPmFjX2luZGV4W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cXVhbnRfbWF0cml4ZXNbcy0+cXVhbnRfc2luZGV4W2ldXSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHk9JWQgeD0lZFxuIiwgbWJfeSwgbWJfeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pZHNwLmlkY3RfcHV0KHB0ciwgbGluZXNpemVbY10sIHMtPmJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+Yml0cyAmIDcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0X291dHB1dChzLCBwdHIsIGxpbmVzaXplW2NdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19pZHggID0gcy0+YmxvY2tfc3RyaWRlW2NdICogKHYgKiBtYl95ICsgeSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaCAqIG1iX3ggKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrID0gcy0+YmxvY2tzW2NdW2Jsb2NrX2lkeF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbMF0gKz0gZ2V0X2JpdHMxKCZzLT5nYikgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnF1YW50X21hdHJpeGVzW3MtPnF1YW50X3NpbmRleFtpXV1bMF0gPDwgQWw7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWNvZGVfZGNfcHJvZ3Jlc3NpdmUocywgYmxvY2ssIGksIHMtPmRjX2luZGV4W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnF1YW50X21hdHJpeGVzW3MtPnF1YW50X3NpbmRleFtpXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWwpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgeT0lZCB4PSVkXG4iLCBtYl95LCBtYl94KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAibWI6ICVkICVkIHByb2Nlc3NlZFxuIiwgbWJfeSwgbWJfeCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICIlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfeCwgbWJfeSwgeCwgeSwgYywgcy0+Ym90dG9tX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ICogbWJfeSArIHkpICogOCwgKGggKiBtYl94ICsgeCkgKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsreCA9PSBoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFuZGxlX3JzdG4ocywgbmJfY29tcG9uZW50cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWpwZWdfZGVjb2RlX3NjYW5fcHJvZ3Jlc3NpdmVfYWMoTUpwZWdEZWNvZGVDb250ZXh0ICpzLCBpbnQgc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZSwgaW50IEFoLCBpbnQgQWwpCit7CisgICAgaW50IG1iX3gsIG1iX3k7CisgICAgaW50IEVPQlJVTiA9IDA7CisgICAgaW50IGMgPSBzLT5jb21wX2luZGV4WzBdOworICAgIHVpbnQ4X3QgKmRhdGEgPSBzLT5waWN0dXJlX3B0ci0+ZGF0YVtjXTsKKyAgICBpbnQgbGluZXNpemUgID0gcy0+bGluZXNpemVbY107CisgICAgaW50IGxhc3Rfc2NhbiA9IDA7CisgICAgaW50MTZfdCAqcXVhbnRfbWF0cml4ID0gcy0+cXVhbnRfbWF0cml4ZXNbcy0+cXVhbnRfc2luZGV4WzBdXTsKKyAgICBpbnQgYnl0ZXNfcGVyX3BpeGVsID0gMSArIChzLT5iaXRzID4gOCk7CisKKyAgICBhdl9hc3NlcnQwKHNzPj0wICYmIEFoPj0wICYmIEFsPj0wKTsKKyAgICBpZiAoc2UgPCBzcyB8fCBzZSA+IDYzKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU1MvU0UgJWQvJWQgaXMgaW52YWxpZFxuIiwgc3MsIHNlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCFBbCkgeworICAgICAgICAvLyBzLT5jb2Vmc19maW5pc2hlZCBpcyBhIGJpdG1hc2sgZm9yIGNvZWZmaWNpZW50cyBjb2RlZAorICAgICAgICAvLyBzcyBhbmQgc2UgYXJlIHBhcmFtZXRlcnMgdGVsbGluZyBzdGFydCBhbmQgZW5kIGNvZWZmaWNpZW50cworICAgICAgICBzLT5jb2Vmc19maW5pc2hlZFtjXSB8PSAoMlVMTCA8PCBzZSkgLSAoMVVMTCA8PCBzcyk7CisgICAgICAgIGxhc3Rfc2NhbiA9ICF+cy0+Y29lZnNfZmluaXNoZWRbY107CisgICAgfQorCisgICAgaWYgKHMtPmludGVybGFjZWQgJiYgcy0+Ym90dG9tX2ZpZWxkKQorICAgICAgICBkYXRhICs9IGxpbmVzaXplID4+IDE7CisKKyAgICBzLT5yZXN0YXJ0X2NvdW50ID0gMDsKKworICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBzLT5tYl9oZWlnaHQ7IG1iX3krKykgeworICAgICAgICB1aW50OF90ICpwdHIgICAgID0gZGF0YSArIChtYl95ICogbGluZXNpemUgKiA4ID4+IHMtPmF2Y3R4LT5sb3dyZXMpOworICAgICAgICBpbnQgYmxvY2tfaWR4ICAgID0gbWJfeSAqIHMtPmJsb2NrX3N0cmlkZVtjXTsKKyAgICAgICAgaW50MTZfdCAoKmJsb2NrKVs2NF0gPSAmcy0+YmxvY2tzW2NdW2Jsb2NrX2lkeF07CisgICAgICAgIHVpbnQ4X3QgKmxhc3Rfbm56ICAgID0gJnMtPmxhc3Rfbm56W2NdW2Jsb2NrX2lkeF07CisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrLCBibG9jaysrLCBsYXN0X25ueisrKSB7CisgICAgICAgICAgICAgICAgaW50IHJldDsKKyAgICAgICAgICAgICAgICBpZiAocy0+cmVzdGFydF9pbnRlcnZhbCAmJiAhcy0+cmVzdGFydF9jb3VudCkKKyAgICAgICAgICAgICAgICAgICAgcy0+cmVzdGFydF9jb3VudCA9IHMtPnJlc3RhcnRfaW50ZXJ2YWw7CisKKyAgICAgICAgICAgICAgICBpZiAoQWgpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IGRlY29kZV9ibG9ja19yZWZpbmVtZW50KHMsICpibG9jaywgbGFzdF9ubnosIHMtPmFjX2luZGV4WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudF9tYXRyaXgsIHNzLCBzZSwgQWwsICZFT0JSVU4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gZGVjb2RlX2Jsb2NrX3Byb2dyZXNzaXZlKHMsICpibG9jaywgbGFzdF9ubnosIHMtPmFjX2luZGV4WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRfbWF0cml4LCBzcywgc2UsIEFsLCAmRU9CUlVOKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciB5PSVkIHg9JWRcbiIsIG1iX3ksIG1iX3gpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXN0X3NjYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+aWRzcC5pZGN0X3B1dChwdHIsIGxpbmVzaXplLCAqYmxvY2spOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Yml0cyAmIDcpCisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdF9vdXRwdXQocywgcHRyLCBsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHB0ciArPSBieXRlc19wZXJfcGl4ZWwqOCA+PiBzLT5hdmN0eC0+bG93cmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhbmRsZV9yc3RuKHMsIDApKQorICAgICAgICAgICAgICAgIEVPQlJVTiA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9tanBlZ19kZWNvZGVfc29zKE1KcGVnRGVjb2RlQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqbWJfYml0bWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9iaXRtYXNrX3NpemUsIGNvbnN0IEFWRnJhbWUgKnJlZmVyZW5jZSkKK3sKKyAgICBpbnQgbGVuLCBuYl9jb21wb25lbnRzLCBpLCBoLCB2LCBwcmVkaWN0b3IsIHBvaW50X3RyYW5zZm9ybTsKKyAgICBpbnQgaW5kZXgsIGlkLCByZXQ7CisgICAgY29uc3QgaW50IGJsb2NrX3NpemUgPSBzLT5sb3NzbGVzcyA/IDEgOiA4OworICAgIGludCBpbHYsIHByZXZfc2hpZnQ7CisKKyAgICBpZiAoIXMtPmdvdF9waWN0dXJlKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgIkNhbiBub3QgcHJvY2VzcyBTT1MgYmVmb3JlIFNPRiwgc2tpcHBpbmdcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MChzLT5waWN0dXJlX3B0ci0+ZGF0YVswXSk7CisgICAgLyogWFhYOiB2ZXJpZnkgbGVuIGZpZWxkIHZhbGlkaXR5ICovCisgICAgbGVuID0gZ2V0X2JpdHMoJnMtPmdiLCAxNik7CisgICAgbmJfY29tcG9uZW50cyA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgaWYgKG5iX2NvbXBvbmVudHMgPT0gMCB8fCBuYl9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiZGVjb2RlX3NvczogbmJfY29tcG9uZW50cyAoJWQpIHVuc3VwcG9ydGVkXG4iLCBuYl9jb21wb25lbnRzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAobGVuICE9IDYgKyAyICogbmJfY29tcG9uZW50cykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRlY29kZV9zb3M6IGludmFsaWQgbGVuICglZClcbiIsIGxlbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfY29tcG9uZW50czsgaSsrKSB7CisgICAgICAgIGlkID0gZ2V0X2JpdHMoJnMtPmdiLCA4KSAtIDE7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiY29tcG9uZW50OiAlZFxuIiwgaWQpOworICAgICAgICAvKiBmaW5kIGNvbXBvbmVudCBpbmRleCAqLworICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzLT5uYl9jb21wb25lbnRzOyBpbmRleCsrKQorICAgICAgICAgICAgaWYgKGlkID09IHMtPmNvbXBvbmVudF9pZFtpbmRleF0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChpbmRleCA9PSBzLT5uYl9jb21wb25lbnRzKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiZGVjb2RlX3NvczogaW5kZXgoJWQpIG91dCBvZiBjb21wb25lbnRzXG4iLCBpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICAvKiBNZXRhc29mdCBNSlBFRyBjb2RlYyBoYXMgQ2IgYW5kIENyIHN3YXBwZWQgKi8KKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ00nLCAnVCcsICdTJywgJ0onKQorICAgICAgICAgICAgJiYgbmJfY29tcG9uZW50cyA9PSAzICYmIHMtPm5iX2NvbXBvbmVudHMgPT0gMyAmJiBpKQorICAgICAgICAgICAgaW5kZXggPSAzIC0gaTsKKworICAgICAgICBzLT5xdWFudF9zaW5kZXhbaV0gPSBzLT5xdWFudF9pbmRleFtpbmRleF07CisgICAgICAgIHMtPm5iX2Jsb2Nrc1tpXSA9IHMtPmhfY291bnRbaW5kZXhdICogcy0+dl9jb3VudFtpbmRleF07CisgICAgICAgIHMtPmhfc2NvdW50W2ldICA9IHMtPmhfY291bnRbaW5kZXhdOworICAgICAgICBzLT52X3Njb3VudFtpXSAgPSBzLT52X2NvdW50W2luZGV4XTsKKworICAgICAgICBpZihuYl9jb21wb25lbnRzID09IDMgJiYgcy0+bmJfY29tcG9uZW50cyA9PSAzICYmIHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR0JSMjRQKQorICAgICAgICAgICAgaW5kZXggPSAoaSsyKSUzOworICAgICAgICBpZihuYl9jb21wb25lbnRzID09IDEgJiYgcy0+bmJfY29tcG9uZW50cyA9PSAzICYmIHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR0JSMjRQKQorICAgICAgICAgICAgaW5kZXggPSAoaW5kZXgrMiklMzsKKworICAgICAgICBzLT5jb21wX2luZGV4W2ldID0gaW5kZXg7CisKKyAgICAgICAgcy0+ZGNfaW5kZXhbaV0gPSBnZXRfYml0cygmcy0+Z2IsIDQpOworICAgICAgICBzLT5hY19pbmRleFtpXSA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisKKyAgICAgICAgaWYgKHMtPmRjX2luZGV4W2ldIDwgIDAgfHwgcy0+YWNfaW5kZXhbaV0gPCAwIHx8CisgICAgICAgICAgICBzLT5kY19pbmRleFtpXSA+PSA0IHx8IHMtPmFjX2luZGV4W2ldID49IDQpCisgICAgICAgICAgICBnb3RvIG91dF9vZl9yYW5nZTsKKyAgICAgICAgaWYgKCFzLT52bGNzWzBdW3MtPmRjX2luZGV4W2ldXS50YWJsZSB8fCAhKHMtPnByb2dyZXNzaXZlID8gcy0+dmxjc1syXVtzLT5hY19pbmRleFswXV0udGFibGUgOiBzLT52bGNzWzFdW3MtPmFjX2luZGV4W2ldXS50YWJsZSkpCisgICAgICAgICAgICBnb3RvIG91dF9vZl9yYW5nZTsKKyAgICB9CisKKyAgICBwcmVkaWN0b3IgPSBnZXRfYml0cygmcy0+Z2IsIDgpOyAgICAgICAvKiBKUEVHIFNzIC8gbG9zc2xlc3MgSlBFRyBwcmVkaWN0b3IgL0pQRUctTFMgTkVBUiAqLworICAgIGlsdiA9IGdldF9iaXRzKCZzLT5nYiwgOCk7ICAgICAgICAgICAgIC8qIEpQRUcgU2UgLyBKUEVHLUxTIElMViAqLworICAgIGlmKHMtPmF2Y3R4LT5jb2RlY190YWcgIT0gQVZfUkwzMigiQ0pQRyIpKXsKKyAgICAgICAgcHJldl9zaGlmdCAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsgLyogQWggKi8KKyAgICAgICAgcG9pbnRfdHJhbnNmb3JtID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsgLyogQWwgKi8KKyAgICB9ZWxzZQorICAgICAgICBwcmV2X3NoaWZ0ID0gcG9pbnRfdHJhbnNmb3JtID0gMDsKKworICAgIGlmIChuYl9jb21wb25lbnRzID4gMSkgeworICAgICAgICAvKiBpbnRlcmxlYXZlZCBzdHJlYW0gKi8KKyAgICAgICAgcy0+bWJfd2lkdGggID0gKHMtPndpZHRoICArIHMtPmhfbWF4ICogYmxvY2tfc2l6ZSAtIDEpIC8gKHMtPmhfbWF4ICogYmxvY2tfc2l6ZSk7CisgICAgICAgIHMtPm1iX2hlaWdodCA9IChzLT5oZWlnaHQgKyBzLT52X21heCAqIGJsb2NrX3NpemUgLSAxKSAvIChzLT52X21heCAqIGJsb2NrX3NpemUpOworICAgIH0gZWxzZSBpZiAoIXMtPmxzKSB7IC8qIHNraXAgdGhpcyBmb3IgSlBFRy1MUyAqLworICAgICAgICBoID0gcy0+aF9tYXggLyBzLT5oX3Njb3VudFswXTsKKyAgICAgICAgdiA9IHMtPnZfbWF4IC8gcy0+dl9zY291bnRbMF07CisgICAgICAgIHMtPm1iX3dpZHRoICAgICA9IChzLT53aWR0aCAgKyBoICogYmxvY2tfc2l6ZSAtIDEpIC8gKGggKiBibG9ja19zaXplKTsKKyAgICAgICAgcy0+bWJfaGVpZ2h0ICAgID0gKHMtPmhlaWdodCArIHYgKiBibG9ja19zaXplIC0gMSkgLyAodiAqIGJsb2NrX3NpemUpOworICAgICAgICBzLT5uYl9ibG9ja3NbMF0gPSAxOworICAgICAgICBzLT5oX3Njb3VudFswXSAgPSAxOworICAgICAgICBzLT52X3Njb3VudFswXSAgPSAxOworICAgIH0KKworICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiJXMgJXMgcDolZCA+PjolZCBpbHY6JWQgYml0czolZCBza2lwOiVkICVzIGNvbXA6JWRcbiIsCisgICAgICAgICAgICAgICBzLT5sb3NzbGVzcyA/ICJsb3NzbGVzcyIgOiAic2VxdWVudGlhbCBEQ1QiLCBzLT5yZ2IgPyAiUkdCIiA6ICIiLAorICAgICAgICAgICAgICAgcHJlZGljdG9yLCBwb2ludF90cmFuc2Zvcm0sIGlsdiwgcy0+Yml0cywgcy0+bWpwYl9za2lwdG9zb2QsCisgICAgICAgICAgICAgICBzLT5wZWdhc3VzX3JjdCA/ICJQUkNUIiA6IChzLT5yY3QgPyAiUkNUIiA6ICIiKSwgbmJfY29tcG9uZW50cyk7CisKKworICAgIC8qIG1qcGVnLWIgY2FuIGhhdmUgcGFkZGluZyBieXRlcyBiZXR3ZWVuIHNvcyBhbmQgaW1hZ2UgZGF0YSwgc2tpcCB0aGVtICovCisgICAgZm9yIChpID0gcy0+bWpwYl9za2lwdG9zb2Q7IGkgPiAwOyBpLS0pCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDgpOworCituZXh0X2ZpZWxkOgorICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb21wb25lbnRzOyBpKyspCisgICAgICAgIHMtPmxhc3RfZGNbaV0gPSAoNCA8PCBzLT5iaXRzKTsKKworICAgIGlmIChzLT5sb3NzbGVzcykgeworICAgICAgICBhdl9hc3NlcnQwKHMtPnBpY3R1cmVfcHRyID09IHMtPnBpY3R1cmUpOworICAgICAgICBpZiAoQ09ORklHX0pQRUdMU19ERUNPREVSICYmIHMtPmxzKSB7CisvLyAgICAgICAgICAgIGZvciAoKSB7CisvLyAgICAgICAgICAgIHJlc2V0X2xzX2NvZGluZ19wYXJhbWV0ZXJzKHMsIDApOworCisgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2pwZWdsc19kZWNvZGVfcGljdHVyZShzLCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF90cmFuc2Zvcm0sIGlsdikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHMtPnJnYikgeworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gbGpwZWdfZGVjb2RlX3JnYl9zY2FuKHMsIG5iX2NvbXBvbmVudHMsIHByZWRpY3RvciwgcG9pbnRfdHJhbnNmb3JtKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGxqcGVnX2RlY29kZV95dXZfc2NhbihzLCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX2NvbXBvbmVudHMpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocy0+cHJvZ3Jlc3NpdmUgJiYgcHJlZGljdG9yKSB7CisgICAgICAgICAgICBhdl9hc3NlcnQwKHMtPnBpY3R1cmVfcHRyID09IHMtPnBpY3R1cmUpOworICAgICAgICAgICAgaWYgKChyZXQgPSBtanBlZ19kZWNvZGVfc2Nhbl9wcm9ncmVzc2l2ZV9hYyhzLCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlsdiwgcHJldl9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfdHJhbnNmb3JtKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IG1qcGVnX2RlY29kZV9zY2FuKHMsIG5iX2NvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfc2hpZnQsIHBvaW50X3RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfYml0bWFzaywgbWJfYml0bWFza19zaXplLCByZWZlcmVuY2UpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5pbnRlcmxhY2VkICYmCisgICAgICAgIGdldF9iaXRzX2xlZnQoJnMtPmdiKSA+IDMyICYmCisgICAgICAgIHNob3dfYml0cygmcy0+Z2IsIDgpID09IDB4RkYpIHsKKyAgICAgICAgR2V0Qml0Q29udGV4dCBiYWsgPSBzLT5nYjsKKyAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJmJhayk7CisgICAgICAgIGlmIChzaG93X2JpdHMoJmJhaywgMTYpID09IDB4RkZEMSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJBVlJuIGludGVybGFjZWQgcGljdHVyZSBtYXJrZXIgZm91bmRcbiIpOworICAgICAgICAgICAgcy0+Z2IgPSBiYWs7CisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxNik7CisgICAgICAgICAgICBzLT5ib3R0b21fZmllbGQgXj0gMTsKKworICAgICAgICAgICAgZ290byBuZXh0X2ZpZWxkOworICAgICAgICB9CisgICAgfQorCisgICAgZW1tc19jKCk7CisgICAgcmV0dXJuIDA7Cisgb3V0X29mX3JhbmdlOgorICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlX3NvczogYWMvZGMgaW5kZXggb3V0IG9mIHJhbmdlXG4iKTsKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworc3RhdGljIGludCBtanBlZ19kZWNvZGVfZHJpKE1KcGVnRGVjb2RlQ29udGV4dCAqcykKK3sKKyAgICBpZiAoZ2V0X2JpdHMoJnMtPmdiLCAxNikgIT0gNCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgcy0+cmVzdGFydF9pbnRlcnZhbCA9IGdldF9iaXRzKCZzLT5nYiwgMTYpOworICAgIHMtPnJlc3RhcnRfY291bnQgICAgPSAwOworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicmVzdGFydCBpbnRlcnZhbDogJWRcbiIsCisgICAgICAgICAgIHMtPnJlc3RhcnRfaW50ZXJ2YWwpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWpwZWdfZGVjb2RlX2FwcChNSnBlZ0RlY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGxlbiwgaWQsIGk7CisKKyAgICBsZW4gPSBnZXRfYml0cygmcy0+Z2IsIDE2KTsKKyAgICBpZiAobGVuIDwgNikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKDggKiBsZW4gPiBnZXRfYml0c19sZWZ0KCZzLT5nYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWQgICA9IGdldF9iaXRzX2xvbmcoJnMtPmdiLCAzMik7CisgICAgbGVuIC09IDY7CisKKyAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfU1RBUlRDT0RFKSB7CisgICAgICAgIGNoYXIgaWRfc3RyWzMyXTsKKyAgICAgICAgYXZfZ2V0X2NvZGVjX3RhZ19zdHJpbmcoaWRfc3RyLCBzaXplb2YoaWRfc3RyKSwgYXZfYnN3YXAzMihpZCkpOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkFQUHggKCVzIC8gJThYKSBsZW49JWRcbiIsIGlkX3N0ciwgaWQsIGxlbik7CisgICAgfQorCisgICAgLyogQnVnZ3kgQVZJRCwgaXQgcHV0cyBFT0kgb25seSBhdCBldmVyeSAxMHRoIGZyYW1lLiAqLworICAgIC8qIEFsc28sIHRoaXMgZm91cmNjIGlzIHVzZWQgYnkgbm9uLWF2aWQgZmlsZXMgdG9vLCBpdCBob2xkcyBzb21lCisgICAgICAgaW5mb3JtYXRpb24sIGJ1dCBpdCdzIGFsd2F5cyBwcmVzZW50IGluIEFWSUQtY3JlYXRlZCBmaWxlcy4gKi8KKyAgICBpZiAoaWQgPT0gQVZfUkIzMigiQVZJMSIpKSB7CisgICAgICAgIC8qIHN0cnVjdHVyZToKKyAgICAgICAgICAgIDRieXRlcyAgICAgIEFWSTEKKyAgICAgICAgICAgIDFieXRlcyAgICAgIHBvbGFyaXR5CisgICAgICAgICAgICAxYnl0ZXMgICAgICBhbHdheXMgemVybworICAgICAgICAgICAgNGJ5dGVzICAgICAgZmllbGRfc2l6ZQorICAgICAgICAgICAgNGJ5dGVzICAgICAgZmllbGRfc2l6ZV9sZXNzX3BhZGRpbmcKKyAgICAgICAgKi8KKyAgICAgICAgICAgIHMtPmJ1Z2d5X2F2aWQgPSAxOworICAgICAgICBpID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsgbGVuLS07CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicG9sYXJpdHkgJWRcbiIsIGkpOworI2lmIDAKKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMyKTsKKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMzIpOworICAgICAgICBsZW4gLT0gMTA7CisjZW5kaWYKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisvLyAgICBsZW4gLT0gMjsKKworICAgIGlmIChpZCA9PSBBVl9SQjMyKCJKRklGIikpIHsKKyAgICAgICAgaW50IHRfdywgdF9oLCB2MSwgdjI7CisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDgpOyAvKiB0aGUgdHJhaWxpbmcgemVyby1ieXRlICovCisgICAgICAgIHYxID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgdjIgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA4KTsKKworICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPSBnZXRfYml0cygmcy0+Z2IsIDE2KTsKKyAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gZ2V0X2JpdHMoJnMtPmdiLCAxNik7CisgICAgICAgIGZmX3NldF9zYXIocy0+YXZjdHgsIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvKTsKKworICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAibWpwZWc6IEpGSUYgaGVhZGVyIGZvdW5kICh2ZXJzaW9uOiAleC4leCkgU0FSPSVkLyVkXG4iLAorICAgICAgICAgICAgICAgICAgIHYxLCB2MiwKKyAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCisgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKworICAgICAgICB0X3cgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICB0X2ggPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICBpZiAodF93ICYmIHRfaCkgeworICAgICAgICAgICAgLyogc2tpcCB0aHVtYm5haWwgKi8KKyAgICAgICAgICAgIGlmIChsZW4gLTEwIC0gKHRfdyAqIHRfaCAqIDMpID4gMCkKKyAgICAgICAgICAgICAgICBsZW4gLT0gdF93ICogdF9oICogMzsKKyAgICAgICAgfQorICAgICAgICBsZW4gLT0gMTA7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChpZCA9PSBBVl9SQjMyKCJBZG9iIikgJiYgKGdldF9iaXRzKCZzLT5nYiwgOCkgPT0gJ2UnKSkgeworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxNik7IC8qIHZlcnNpb24gKi8KKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMTYpOyAvKiBmbGFnczAgKi8KKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMTYpOyAvKiBmbGFnczEgKi8KKyAgICAgICAgcy0+YWRvYmVfdHJhbnNmb3JtID0gZ2V0X2JpdHMoJnMtPmdiLCAgOCk7CisgICAgICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibWpwZWc6IEFkb2JlIGhlYWRlciBmb3VuZCwgdHJhbnNmb3JtPSVkXG4iLCBzLT5hZG9iZV90cmFuc2Zvcm0pOworICAgICAgICBsZW4gLT0gNzsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKGlkID09IEFWX1JCMzIoIkxKSUYiKSkgeworICAgICAgICBpbnQgcmdiID0gcy0+cmdiOworICAgICAgICBpbnQgcGVnYXN1c19yY3QgPSBzLT5wZWdhc3VzX3JjdDsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgIlBlZ2FzdXMgbG9zc2xlc3MganBlZyBoZWFkZXIgZm91bmRcbiIpOworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxNik7IC8qIHZlcnNpb24gPyAqLworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxNik7IC8qIHVua25vd24gYWx3YXlzIDA/ICovCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDE2KTsgLyogdW5rbm93biBhbHdheXMgMD8gKi8KKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMTYpOyAvKiB1bmtub3duIGFsd2F5cyAwPyAqLworICAgICAgICBzd2l0Y2ggKGk9Z2V0X2JpdHMoJnMtPmdiLCA4KSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZ2IgICAgICAgICA9IDE7CisgICAgICAgICAgICBwZWdhc3VzX3JjdCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcmdiICAgICAgICAgPSAxOworICAgICAgICAgICAgcGVnYXN1c19yY3QgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInVua25vd24gY29sb3JzcGFjZSAlZFxuIiwgaSk7CisgICAgICAgIH0KKworICAgICAgICBsZW4gLT0gOTsKKyAgICAgICAgaWYgKHMtPmdvdF9waWN0dXJlKQorICAgICAgICAgICAgaWYgKHJnYiAhPSBzLT5yZ2IgfHwgcGVnYXN1c19yY3QgIT0gcy0+cGVnYXN1c19yY3QpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiTWlzbWF0Y2hpbmcgTEpJRiB0YWdcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgIHMtPnJnYiA9IHJnYjsKKyAgICAgICAgcy0+cGVnYXN1c19yY3QgPSBwZWdhc3VzX3JjdDsKKworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgaWYgKGlkID09IEFWX1JMMzIoImNvbHIiKSAmJiBsZW4gPiAwKSB7CisgICAgICAgIHMtPmNvbHIgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIkNPTFIgJWRcbiIsIHMtPmNvbHIpOworICAgICAgICBsZW4gLS07CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBpZiAoaWQgPT0gQVZfUkwzMigieGZybSIpICYmIGxlbiA+IDApIHsKKyAgICAgICAgcy0+eGZybSA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiWEZSTSAlZFxuIiwgcy0+eGZybSk7CisgICAgICAgIGxlbiAtLTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogSlBTIGV4dGVuc2lvbiBieSBWUmV4ICovCisgICAgaWYgKHMtPnN0YXJ0X2NvZGUgPT0gQVBQMyAmJiBpZCA9PSBBVl9SQjMyKCJfSlBTIikgJiYgbGVuID49IDEwKSB7CisgICAgICAgIGludCBmbGFncywgbGF5b3V0LCB0eXBlOworICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIl9KUFNKUFNfXG4iKTsKKworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzMik7IGxlbiAtPSA0OyAgLyogSlBTXyAqLworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxNik7IGxlbiAtPSAyOyAgLyogYmxvY2sgbGVuZ3RoICovCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDgpOyAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworICAgICAgICBmbGFncyAgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICBsYXlvdXQgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICB0eXBlICAgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICBsZW4gLT0gNDsKKworICAgICAgICBzLT5zdGVyZW8zZCA9IGF2X3N0ZXJlbzNkX2FsbG9jKCk7CisgICAgICAgIGlmICghcy0+c3RlcmVvM2QpIHsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IDApIHsKKyAgICAgICAgICAgIHMtPnN0ZXJlbzNkLT50eXBlID0gQVZfU1RFUkVPM0RfMkQ7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGxheW91dCkgeworICAgICAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgICAgIHMtPnN0ZXJlbzNkLT50eXBlID0gQVZfU1RFUkVPM0RfTElORVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICAgICAgcy0+c3RlcmVvM2QtPnR5cGUgPSBBVl9TVEVSRU8zRF9TSURFQllTSURFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgICAgIHMtPnN0ZXJlbzNkLT50eXBlID0gQVZfU1RFUkVPM0RfVE9QQk9UVE9NOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiAweDA0KSkgeworICAgICAgICAgICAgICAgIHMtPnN0ZXJlbzNkLT5mbGFncyA9IEFWX1NURVJFTzNEX0ZMQUdfSU5WRVJUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIEVYSUYgbWV0YWRhdGEgKi8KKyAgICBpZiAocy0+c3RhcnRfY29kZSA9PSBBUFAxICYmIGlkID09IEFWX1JCMzIoIkV4aWYiKSAmJiBsZW4gPj0gMikgeworICAgICAgICBHZXRCeXRlQ29udGV4dCBnYnl0ZXM7CisgICAgICAgIGludCByZXQsIGxlLCBpZmRfb2Zmc2V0LCBieXRlc19yZWFkOworICAgICAgICBjb25zdCB1aW50OF90ICphbGlnbmVkOworCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDE2KTsgLy8gc2tpcCBwYWRkaW5nCisgICAgICAgIGxlbiAtPSAyOworCisgICAgICAgIC8vIGluaXQgYnl0ZSB3aXNlIHJlYWRpbmcKKyAgICAgICAgYWxpZ25lZCA9IGFsaWduX2dldF9iaXRzKCZzLT5nYik7CisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdieXRlcywgYWxpZ25lZCwgbGVuKTsKKworICAgICAgICAvLyByZWFkIFRJRkYgaGVhZGVyCisgICAgICAgIHJldCA9IGZmX3RkZWNvZGVfaGVhZGVyKCZnYnl0ZXMsICZsZSwgJmlmZF9vZmZzZXQpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1qcGVnOiBpbnZhbGlkIFRJRkYgaGVhZGVyIGluIEVYSUYgZGF0YVxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZnYnl0ZXMsIGlmZF9vZmZzZXQsIFNFRUtfU0VUKTsKKworICAgICAgICAgICAgLy8gcmVhZCAwdGggSUZEIGFuZCBzdG9yZSB0aGUgbWV0YWRhdGEKKyAgICAgICAgICAgIC8vIChyZXR1cm4gdmFsdWVzID4gMCBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2Ygc3ViaW1hZ2UgbWV0YWRhdGEpCisgICAgICAgICAgICByZXQgPSBhdnByaXZfZXhpZl9kZWNvZGVfaWZkKHMtPmF2Y3R4LCAmZ2J5dGVzLCBsZSwgMCwgJnMtPmV4aWZfbWV0YWRhdGEpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1qcGVnOiBlcnJvciBkZWNvZGluZyBFWElGIGRhdGFcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnl0ZXNfcmVhZCA9IGJ5dGVzdHJlYW0yX3RlbGwoJmdieXRlcyk7CisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIGJ5dGVzX3JlYWQgPDwgMyk7CisgICAgICAgIGxlbiAtPSBieXRlc19yZWFkOworCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIEFwcGxlIE1KUEVHLUEgKi8KKyAgICBpZiAoKHMtPnN0YXJ0X2NvZGUgPT0gQVBQMSkgJiYgKGxlbiA+ICgweDI4IC0gOCkpKSB7CisgICAgICAgIGlkICAgPSBnZXRfYml0c19sb25nKCZzLT5nYiwgMzIpOworICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgLyogQXBwbGUgTUpQRUctQSAqLworICAgICAgICBpZiAoaWQgPT0gQVZfUkIzMigibWpwZyIpKSB7CisjaWYgMAorICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMzIpOyAvKiBmaWVsZCBzaXplICovCisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzMik7IC8qIHBhZCBmaWVsZCBzaXplICovCisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzMik7IC8qIG5leHQgb2ZmICovCisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzMik7IC8qIHF1YW50IG9mZiAqLworICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMzIpOyAvKiBodWZmIG9mZiAqLworICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMzIpOyAvKiBpbWFnZSBvZmYgKi8KKyAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMyKTsgLyogc2NhbiBvZmYgKi8KKyAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMyKTsgLyogZGF0YSBvZmYgKi8KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibWpwZWc6IEFwcGxlIE1KUEVHLUEgaGVhZGVyIGZvdW5kXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworb3V0OgorICAgIC8qIHNsb3cgYnV0IG5lZWRlZCBmb3IgZXh0cmVtZSBhZG9iZSBqcGVncyAqLworICAgIGlmIChsZW4gPCAwKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJtanBlZzogZXJyb3IsIGRlY29kZV9hcHAgcGFyc2VyIHJlYWQgb3ZlciB0aGUgZW5kXG4iKTsKKyAgICB3aGlsZSAoLS1sZW4gPiAwKQorICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA4KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1qcGVnX2RlY29kZV9jb20oTUpwZWdEZWNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBsZW4gPSBnZXRfYml0cygmcy0+Z2IsIDE2KTsKKyAgICBpZiAobGVuID49IDIgJiYgOCAqIGxlbiAtIDE2IDw9IGdldF9iaXRzX2xlZnQoJnMtPmdiKSkgeworICAgICAgICBjaGFyICpjYnVmID0gYXZfbWFsbG9jKGxlbiAtIDEpOworICAgICAgICBpZiAoY2J1ZikgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMjsgaSsrKQorICAgICAgICAgICAgICAgIGNidWZbaV0gPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgaWYgKGkgPiAwICYmIGNidWZbaSAtIDFdID09ICdcbicpCisgICAgICAgICAgICAgICAgY2J1ZltpIC0gMV0gPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNidWZbaV0gPSAwOworCisgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJjb21tZW50OiAnJXMnXG4iLCBjYnVmKTsKKworICAgICAgICAgICAgLyogYnVnZ3kgYXZpZCwgaXQgcHV0cyBFT0kgb25seSBhdCBldmVyeSAxMHRoIGZyYW1lICovCisgICAgICAgICAgICBpZiAoIXN0cm5jbXAoY2J1ZiwgIkFWSUQiLCA0KSkgeworICAgICAgICAgICAgICAgIHBhcnNlX2F2aWQocywgY2J1ZiwgbGVuKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjYnVmLCAiQ1M9SVRVNjAxIikpCisgICAgICAgICAgICAgICAgcy0+Y3NfaXR1NjAxID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCghc3RybmNtcChjYnVmLCAiSW50ZWwoUikgSlBFRyBMaWJyYXJ5LCB2ZXJzaW9uIDEiLCAzMikgJiYgcy0+YXZjdHgtPmNvZGVjX3RhZykgfHwKKyAgICAgICAgICAgICAgICAgICAgICghc3RybmNtcChjYnVmLCAiTWV0YXNvZnQgTUpQRUcgQ29kZWMiLCAyMCkpKQorICAgICAgICAgICAgICAgIHMtPmZsaXBwZWQgPSAxOworCisgICAgICAgICAgICBhdl9mcmVlKGNidWYpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybiB0aGUgOCBiaXQgc3RhcnQgY29kZSB2YWx1ZSBhbmQgdXBkYXRlIHRoZSBzZWFyY2gKKyAgIHN0YXRlLiBSZXR1cm4gLTEgaWYgbm8gc3RhcnQgY29kZSBmb3VuZCAqLworc3RhdGljIGludCBmaW5kX21hcmtlcihjb25zdCB1aW50OF90ICoqcGJ1Zl9wdHIsIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmX3B0cjsKKyAgICB1bnNpZ25lZCBpbnQgdiwgdjI7CisgICAgaW50IHZhbDsKKyAgICBpbnQgc2tpcHBlZCA9IDA7CisKKyAgICBidWZfcHRyID0gKnBidWZfcHRyOworICAgIHdoaWxlIChidWZfZW5kIC0gYnVmX3B0ciA+IDEpIHsKKyAgICAgICAgdiAgPSAqYnVmX3B0cisrOworICAgICAgICB2MiA9ICpidWZfcHRyOworICAgICAgICBpZiAoKHYgPT0gMHhmZikgJiYgKHYyID49IDB4YzApICYmICh2MiA8PSAweGZlKSAmJiBidWZfcHRyIDwgYnVmX2VuZCkgeworICAgICAgICAgICAgdmFsID0gKmJ1Zl9wdHIrKzsKKyAgICAgICAgICAgIGdvdG8gZm91bmQ7CisgICAgICAgIH0KKyAgICAgICAgc2tpcHBlZCsrOworICAgIH0KKyAgICBidWZfcHRyID0gYnVmX2VuZDsKKyAgICB2YWwgPSAtMTsKK2ZvdW5kOgorICAgIGF2X2Rsb2coTlVMTCwgImZpbmRfbWFya2VyIHNraXBwZWQgJWQgYnl0ZXNcbiIsIHNraXBwZWQpOworICAgICpwYnVmX3B0ciA9IGJ1Zl9wdHI7CisgICAgcmV0dXJuIHZhbDsKK30KKworaW50IGZmX21qcGVnX2ZpbmRfbWFya2VyKE1KcGVnRGVjb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqYnVmX3B0ciwgY29uc3QgdWludDhfdCAqYnVmX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqdW5lc2NhcGVkX2J1Zl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp1bmVzY2FwZWRfYnVmX3NpemUpCit7CisgICAgaW50IHN0YXJ0X2NvZGU7CisgICAgc3RhcnRfY29kZSA9IGZpbmRfbWFya2VyKGJ1Zl9wdHIsIGJ1Zl9lbmQpOworCisgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZzLT5idWZmZXIsICZzLT5idWZmZXJfc2l6ZSwgYnVmX2VuZCAtICpidWZfcHRyKTsKKyAgICBpZiAoIXMtPmJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8qIHVuZXNjYXBlIGJ1ZmZlciBvZiBTT1MsIHVzZSBzcGVjaWFsIHRyZWF0bWVudCBmb3IgSlBFRy1MUyAqLworICAgIGlmIChzdGFydF9jb2RlID09IFNPUyAmJiAhcy0+bHMpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0gKmJ1Zl9wdHI7CisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IHMtPmJ1ZmZlcjsKKworICAgICAgICB3aGlsZSAoc3JjIDwgYnVmX2VuZCkgeworICAgICAgICAgICAgdWludDhfdCB4ID0gKihzcmMrKyk7CisKKyAgICAgICAgICAgICooZHN0KyspID0geDsKKyAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEhQKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gMHhmZikgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3JjIDwgYnVmX2VuZCAmJiB4ID09IDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gKihzcmMrKyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPj0gMHhkMCAmJiB4IDw9IDB4ZDcpCisgICAgICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9IHg7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHgpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKnVuZXNjYXBlZF9idWZfcHRyICA9IHMtPmJ1ZmZlcjsKKyAgICAgICAgKnVuZXNjYXBlZF9idWZfc2l6ZSA9IGRzdCAtIHMtPmJ1ZmZlcjsKKyAgICAgICAgbWVtc2V0KHMtPmJ1ZmZlciArICp1bmVzY2FwZWRfYnVmX3NpemUsIDAsCisgICAgICAgICAgICAgICBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImVzY2FwaW5nIHJlbW92ZWQgJSJQVFJESUZGX1NQRUNJRklFUiIgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAoYnVmX2VuZCAtICpidWZfcHRyKSAtIChkc3QgLSBzLT5idWZmZXIpKTsKKyAgICB9IGVsc2UgaWYgKHN0YXJ0X2NvZGUgPT0gU09TICYmIHMtPmxzKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9ICpidWZfcHRyOworICAgICAgICB1aW50OF90ICpkc3QgID0gcy0+YnVmZmVyOworICAgICAgICBpbnQgYml0X2NvdW50ID0gMDsKKyAgICAgICAgaW50IHQgPSAwLCBiID0gMDsKKyAgICAgICAgUHV0Qml0Q29udGV4dCBwYjsKKworICAgICAgICAvKiBmaW5kIG1hcmtlciAqLworICAgICAgICB3aGlsZSAoc3JjICsgdCA8IGJ1Zl9lbmQpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgeCA9IHNyY1t0KytdOworICAgICAgICAgICAgaWYgKHggPT0gMHhmZikgeworICAgICAgICAgICAgICAgIHdoaWxlICgoc3JjICsgdCA8IGJ1Zl9lbmQpICYmIHggPT0gMHhmZikKKyAgICAgICAgICAgICAgICAgICAgeCA9IHNyY1t0KytdOworICAgICAgICAgICAgICAgIGlmICh4ICYgMHg4MCkgeworICAgICAgICAgICAgICAgICAgICB0IC09IEZGTUlOKDIsIHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYml0X2NvdW50ID0gdCAqIDg7CisgICAgICAgIGluaXRfcHV0X2JpdHMoJnBiLCBkc3QsIHQpOworCisgICAgICAgIC8qIHVuZXNjYXBlIGJpdHN0cmVhbSAqLworICAgICAgICB3aGlsZSAoYiA8IHQpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgeCA9IHNyY1tiKytdOworICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCA4LCB4KTsKKyAgICAgICAgICAgIGlmICh4ID09IDB4RkYpIHsKKyAgICAgICAgICAgICAgICB4ID0gc3JjW2IrK107CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCA3LCB4KTsKKyAgICAgICAgICAgICAgICBiaXRfY291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmbHVzaF9wdXRfYml0cygmcGIpOworCisgICAgICAgICp1bmVzY2FwZWRfYnVmX3B0ciAgPSBkc3Q7CisgICAgICAgICp1bmVzY2FwZWRfYnVmX3NpemUgPSAoYml0X2NvdW50ICsgNykgPj4gMzsKKyAgICAgICAgbWVtc2V0KHMtPmJ1ZmZlciArICp1bmVzY2FwZWRfYnVmX3NpemUsIDAsCisgICAgICAgICAgICAgICBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqdW5lc2NhcGVkX2J1Zl9wdHIgID0gKmJ1Zl9wdHI7CisgICAgICAgICp1bmVzY2FwZWRfYnVmX3NpemUgPSBidWZfZW5kIC0gKmJ1Zl9wdHI7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXJ0X2NvZGU7Cit9CisKK2ludCBmZl9tanBlZ19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgICAgICpmcmFtZSA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgTUpwZWdEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kLCAqYnVmX3B0cjsKKyAgICBjb25zdCB1aW50OF90ICp1bmVzY2FwZWRfYnVmX3B0cjsKKyAgICBpbnQgaHNoaWZ0LCB2c2hpZnQ7CisgICAgaW50IHVuZXNjYXBlZF9idWZfc2l6ZTsKKyAgICBpbnQgc3RhcnRfY29kZTsKKyAgICBpbnQgaSwgaW5kZXg7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGlzMTZiaXQ7CisKKyAgICBhdl9kaWN0X2ZyZWUoJnMtPmV4aWZfbWV0YWRhdGEpOworICAgIGF2X2ZyZWVwKCZzLT5zdGVyZW8zZCk7CisgICAgcy0+YWRvYmVfdHJhbnNmb3JtID0gLTE7CisKKyAgICBidWZfcHRyID0gYnVmOworICAgIGJ1Zl9lbmQgPSBidWYgKyBidWZfc2l6ZTsKKyAgICB3aGlsZSAoYnVmX3B0ciA8IGJ1Zl9lbmQpIHsKKyAgICAgICAgLyogZmluZCBzdGFydCBuZXh0IG1hcmtlciAqLworICAgICAgICBzdGFydF9jb2RlID0gZmZfbWpwZWdfZmluZF9tYXJrZXIocywgJmJ1Zl9wdHIsIGJ1Zl9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5lc2NhcGVkX2J1Zl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5lc2NhcGVkX2J1Zl9zaXplKTsKKyAgICAgICAgLyogRU9GICovCisgICAgICAgIGlmIChzdGFydF9jb2RlIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAodW5lc2NhcGVkX2J1Zl9zaXplID4gSU5UX01BWCAvIDgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJNSlBFRyBwYWNrZXQgMHgleCB0b28gYmlnICglZC8lZCksIGNvcnJ1cHQgZGF0YT9cbiIsCisgICAgICAgICAgICAgICAgICAgc3RhcnRfY29kZSwgdW5lc2NhcGVkX2J1Zl9zaXplLCBidWZfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIm1hcmtlcj0leCBhdmFpbF9zaXplX2luX2J1Zj0lIlBUUkRJRkZfU1BFQ0lGSUVSIlxuIiwKKyAgICAgICAgICAgICAgIHN0YXJ0X2NvZGUsIGJ1Zl9lbmQgLSBidWZfcHRyKTsKKworICAgICAgICByZXQgPSBpbml0X2dldF9iaXRzOCgmcy0+Z2IsIHVuZXNjYXBlZF9idWZfcHRyLCB1bmVzY2FwZWRfYnVmX3NpemUpOworCisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHMtPnN0YXJ0X2NvZGUgPSBzdGFydF9jb2RlOworICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfU1RBUlRDT0RFKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJzdGFydGNvZGU6ICVYXG4iLCBzdGFydF9jb2RlKTsKKworICAgICAgICAvKiBwcm9jZXNzIG1hcmtlcnMgKi8KKyAgICAgICAgaWYgKHN0YXJ0X2NvZGUgPj0gMHhkMCAmJiBzdGFydF9jb2RlIDw9IDB4ZDcpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAicmVzdGFydCBtYXJrZXI6ICVkXG4iLCBzdGFydF9jb2RlICYgMHgwZik7CisgICAgICAgICAgICAvKiBBUFAgZmllbGRzICovCisgICAgICAgIGVsc2UgaWYgKHN0YXJ0X2NvZGUgPj0gQVBQMCAmJiBzdGFydF9jb2RlIDw9IEFQUDE1KQorICAgICAgICAgICAgbWpwZWdfZGVjb2RlX2FwcChzKTsKKyAgICAgICAgICAgIC8qIENvbW1lbnQgKi8KKyAgICAgICAgZWxzZSBpZiAoc3RhcnRfY29kZSA9PSBDT00pCisgICAgICAgICAgICBtanBlZ19kZWNvZGVfY29tKHMpOworCisgICAgICAgIHJldCA9IC0xOworCisgICAgICAgIGlmICghQ09ORklHX0pQRUdMU19ERUNPREVSICYmCisgICAgICAgICAgICAoc3RhcnRfY29kZSA9PSBTT0Y0OCB8fCBzdGFydF9jb2RlID09IExTRSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSlBFRy1MUyBzdXBwb3J0IG5vdCBlbmFibGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChzdGFydF9jb2RlKSB7CisgICAgICAgIGNhc2UgU09JOgorICAgICAgICAgICAgcy0+cmVzdGFydF9pbnRlcnZhbCA9IDA7CisgICAgICAgICAgICBzLT5yZXN0YXJ0X2NvdW50ICAgID0gMDsKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gb24gU09JICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEUVQ6CisgICAgICAgICAgICBmZl9tanBlZ19kZWNvZGVfZHF0KHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREhUOgorICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9tanBlZ19kZWNvZGVfZGh0KHMpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImh1ZmZtYW4gdGFibGUgZGVjb2RlIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTT0YwOgorICAgICAgICBjYXNlIFNPRjE6CisgICAgICAgICAgICBzLT5sb3NzbGVzcyAgICA9IDA7CisgICAgICAgICAgICBzLT5scyAgICAgICAgICA9IDA7CisgICAgICAgICAgICBzLT5wcm9ncmVzc2l2ZSA9IDA7CisgICAgICAgICAgICBpZiAoKHJldCA9IGZmX21qcGVnX2RlY29kZV9zb2YocykpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTT0YyOgorICAgICAgICAgICAgcy0+bG9zc2xlc3MgICAgPSAwOworICAgICAgICAgICAgcy0+bHMgICAgICAgICAgPSAwOworICAgICAgICAgICAgcy0+cHJvZ3Jlc3NpdmUgPSAxOworICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9tanBlZ19kZWNvZGVfc29mKHMpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU09GMzoKKyAgICAgICAgICAgIHMtPmxvc3NsZXNzICAgID0gMTsKKyAgICAgICAgICAgIHMtPmxzICAgICAgICAgID0gMDsKKyAgICAgICAgICAgIHMtPnByb2dyZXNzaXZlID0gMDsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfbWpwZWdfZGVjb2RlX3NvZihzKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNPRjQ4OgorICAgICAgICAgICAgcy0+bG9zc2xlc3MgICAgPSAxOworICAgICAgICAgICAgcy0+bHMgICAgICAgICAgPSAxOworICAgICAgICAgICAgcy0+cHJvZ3Jlc3NpdmUgPSAwOworICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9tanBlZ19kZWNvZGVfc29mKHMpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTFNFOgorICAgICAgICAgICAgaWYgKCFDT05GSUdfSlBFR0xTX0RFQ09ERVIgfHwKKyAgICAgICAgICAgICAgICAocmV0ID0gZmZfanBlZ2xzX2RlY29kZV9sc2UocykpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT0k6Citlb2lfcGFyc2VyOgorICAgICAgICAgICAgcy0+Y3VyX3NjYW4gPSAwOworICAgICAgICAgICAgaWYgKCFzLT5nb3RfcGljdHVyZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJGb3VuZCBFT0kgYmVmb3JlIGFueSBTT0YsIGlnbm9yaW5nXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5pbnRlcmxhY2VkKSB7CisgICAgICAgICAgICAgICAgcy0+Ym90dG9tX2ZpZWxkIF49IDE7CisgICAgICAgICAgICAgICAgLyogaWYgbm90IGJvdHRvbSBmaWVsZCwgZG8gbm90IG91dHB1dCBpbWFnZSB5ZXQgKi8KKyAgICAgICAgICAgICAgICBpZiAocy0+Ym90dG9tX2ZpZWxkID09ICFzLT5pbnRlcmxhY2VfcG9sYXJpdHkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZnJhbWUsIHMtPnBpY3R1cmVfcHRyKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICAgICAgICAgIHMtPmdvdF9waWN0dXJlID0gMDsKKworICAgICAgICAgICAgaWYgKCFzLT5sb3NzbGVzcykgeworICAgICAgICAgICAgICAgIGludCBxcCA9IEZGTUFYMyhzLT5xc2NhbGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnFzY2FsZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cXNjYWxlWzJdKTsKKyAgICAgICAgICAgICAgICBpbnQgcXB3ID0gKHMtPndpZHRoICsgMTUpIC8gMTY7CisgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKnFwX3RhYmxlX2J1ZiA9IGF2X2J1ZmZlcl9hbGxvYyhxcHcpOworICAgICAgICAgICAgICAgIGlmIChxcF90YWJsZV9idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHFwX3RhYmxlX2J1Zi0+ZGF0YSwgcXAsIHFwdyk7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3NldF9xcF90YWJsZShkYXRhLCBxcF90YWJsZV9idWYsIDAsIEZGX1FTQ0FMRV9UWVBFX01QRUcxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19RUCkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJRUDogJWRcbiIsIHFwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgICAgICBjYXNlIFNPUzoKKyAgICAgICAgICAgIHMtPmN1cl9zY2FuKys7CisgICAgICAgICAgICBpZiAoKHJldCA9IGZmX21qcGVnX2RlY29kZV9zb3MocywgTlVMTCwgMCwgTlVMTCkpIDwgMCAmJgorICAgICAgICAgICAgICAgIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFJJOgorICAgICAgICAgICAgbWpwZWdfZGVjb2RlX2RyaShzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNPRjU6CisgICAgICAgIGNhc2UgU09GNjoKKyAgICAgICAgY2FzZSBTT0Y3OgorICAgICAgICBjYXNlIFNPRjk6CisgICAgICAgIGNhc2UgU09GMTA6CisgICAgICAgIGNhc2UgU09GMTE6CisgICAgICAgIGNhc2UgU09GMTM6CisgICAgICAgIGNhc2UgU09GMTQ6CisgICAgICAgIGNhc2UgU09GMTU6CisgICAgICAgIGNhc2UgSlBHOgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIm1qcGVnOiB1bnN1cHBvcnRlZCBjb2RpbmcgdHlwZSAoJXgpXG4iLCBzdGFydF9jb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogZW9mIHByb2Nlc3Mgc3RhcnQgY29kZSAqLworICAgICAgICBidWZfcHRyICs9IChnZXRfYml0c19jb3VudCgmcy0+Z2IpICsgNykgLyA4OworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJtYXJrZXIgcGFyc2VyIHVzZWQgJWQgYnl0ZXMgKCVkIGJpdHMpXG4iLAorICAgICAgICAgICAgICAgKGdldF9iaXRzX2NvdW50KCZzLT5nYikgKyA3KSAvIDgsIGdldF9iaXRzX2NvdW50KCZzLT5nYikpOworICAgIH0KKyAgICBpZiAocy0+Z290X3BpY3R1cmUgJiYgcy0+Y3VyX3NjYW4pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkVPSSBtaXNzaW5nLCBlbXVsYXRpbmdcbiIpOworICAgICAgICBnb3RvIGVvaV9wYXJzZXI7CisgICAgfQorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiTm8gSlBFRyBkYXRhIGZvdW5kIGluIGltYWdlXG4iKTsKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKK2ZhaWw6CisgICAgcy0+Z290X3BpY3R1cmUgPSAwOworICAgIHJldHVybiByZXQ7Cit0aGVfZW5kOgorCisgICAgaXMxNmJpdCA9IGF2X3BpeF9mbXRfZGVzY19nZXQocy0+YXZjdHgtPnBpeF9mbXQpLT5jb21wWzBdLnN0ZXBfbWludXMxOworCisgICAgaWYgKHMtPnVwc2NhbGVfaCkgeworICAgICAgICBpbnQgcDsKKyAgICAgICAgYXZfYXNzZXJ0MChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVko0NDRQIHx8CisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQICB8fAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWSjQ0MFAgfHwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQ0MFAgIHx8CisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDQ0UCB8fAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWSjQyMFAgfHwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAgIHx8CisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQMTZ8fAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWQTQyMFAgIHx8CisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDIwUDE2fHwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUlAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HQlJBUAorICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUocy0+YXZjdHgtPnBpeF9mbXQsICZoc2hpZnQsICZ2c2hpZnQpOworICAgICAgICBmb3IgKHAgPSAwOyBwPDQ7IHArKykgeworICAgICAgICAgICAgdWludDhfdCAqbGluZSA9IHMtPnBpY3R1cmVfcHRyLT5kYXRhW3BdOworICAgICAgICAgICAgaW50IHcgPSBzLT53aWR0aDsKKyAgICAgICAgICAgIGludCBoID0gcy0+aGVpZ2h0OworICAgICAgICAgICAgaWYgKCEocy0+dXBzY2FsZV9oICYgKDE8PHApKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChwPT0xIHx8IHA9PTIpIHsKKyAgICAgICAgICAgICAgICB3ID0gRkZfQ0VJTF9SU0hJRlQodywgaHNoaWZ0KTsKKyAgICAgICAgICAgICAgICBoID0gRkZfQ0VJTF9SU0hJRlQoaCwgdnNoaWZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT51cHNjYWxlX3YgJiAoMTw8cCkpCisgICAgICAgICAgICAgICAgaCA9IChoKzEpPj4xOworICAgICAgICAgICAgYXZfYXNzZXJ0MCh3ID4gMCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzMTZiaXQpICgodWludDE2X3QqKWxpbmUpW3cgLSAxXSA9ICgodWludDE2X3QqKWxpbmUpWyh3IC0gMSkgLyAyXTsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIGxpbmVbdyAtIDFdID0gbGluZVsodyAtIDEpIC8gMl07CisgICAgICAgICAgICAgICAgZm9yIChpbmRleCA9IHcgLSAyOyBpbmRleCA+IDA7IGluZGV4LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzMTZiaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KilsaW5lKVtpbmRleF0gPSAoKCh1aW50MTZfdCopbGluZSlbaW5kZXggLyAyXSArICgodWludDE2X3QqKWxpbmUpWyhpbmRleCArIDEpIC8gMl0pID4+IDE7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVbaW5kZXhdID0gKGxpbmVbaW5kZXggLyAyXSArIGxpbmVbKGluZGV4ICsgMSkgLyAyXSkgPj4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZSArPSBzLT5saW5lc2l6ZVtwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+dXBzY2FsZV92KSB7CisgICAgICAgIGludCBwOworICAgICAgICBhdl9hc3NlcnQwKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWSjQ0NFAgfHwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQ0NFAgIHx8CisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZKNDIyUCB8fAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUCAgfHwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVko0MjBQIHx8CisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQICB8fAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDQwUCAgfHwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVko0NDBQIHx8CisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDQ0UCB8fAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWQTQyMFAgIHx8CisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDIwUDE2fHwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUlAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HQlJBUAorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKHMtPmF2Y3R4LT5waXhfZm10LCAmaHNoaWZ0LCAmdnNoaWZ0KTsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IDQ7IHArKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0OworICAgICAgICAgICAgaW50IHcgPSBzLT53aWR0aDsKKyAgICAgICAgICAgIGludCBoID0gcy0+aGVpZ2h0OworICAgICAgICAgICAgaWYgKCEocy0+dXBzY2FsZV92ICYgKDE8PHApKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChwPT0xIHx8IHA9PTIpIHsKKyAgICAgICAgICAgICAgICB3ID0gRkZfQ0VJTF9SU0hJRlQodywgaHNoaWZ0KTsKKyAgICAgICAgICAgICAgICBoID0gRkZfQ0VJTF9SU0hJRlQoaCwgdnNoaWZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCA9ICYoKHVpbnQ4X3QgKilzLT5waWN0dXJlX3B0ci0+ZGF0YVtwXSlbKGggLSAxKSAqIHMtPmxpbmVzaXplW3BdXTsKKyAgICAgICAgICAgIGZvciAoaSA9IGggLSAxOyBpOyBpLS0pIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMxID0gJigodWludDhfdCAqKXMtPnBpY3R1cmVfcHRyLT5kYXRhW3BdKVtpIC8gMiAqIHMtPmxpbmVzaXplW3BdXTsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMyID0gJigodWludDhfdCAqKXMtPnBpY3R1cmVfcHRyLT5kYXRhW3BdKVsoaSArIDEpIC8gMiAqIHMtPmxpbmVzaXplW3BdXTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjMSA9PSBzcmMyIHx8IGkgPT0gaCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjMSwgdyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdzsgaW5kZXgrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtpbmRleF0gPSAoc3JjMVtpbmRleF0gKyBzcmMyW2luZGV4XSkgPj4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHN0IC09IHMtPmxpbmVzaXplW3BdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5mbGlwcGVkKSB7CisgICAgICAgIGludCBqOworICAgICAgICBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShzLT5hdmN0eC0+cGl4X2ZtdCwgJmhzaGlmdCwgJnZzaGlmdCk7CisgICAgICAgIGZvciAoaW5kZXg9MDsgaW5kZXg8NDsgaW5kZXgrKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gcy0+cGljdHVyZV9wdHItPmRhdGFbaW5kZXhdOworICAgICAgICAgICAgaW50IHcgPSBzLT5waWN0dXJlX3B0ci0+d2lkdGg7CisgICAgICAgICAgICBpbnQgaCA9IHMtPnBpY3R1cmVfcHRyLT5oZWlnaHQ7CisgICAgICAgICAgICBpZihpbmRleCAmJiBpbmRleDwzKXsKKyAgICAgICAgICAgICAgICB3ID0gRkZfQ0VJTF9SU0hJRlQodywgaHNoaWZ0KTsKKyAgICAgICAgICAgICAgICBoID0gRkZfQ0VJTF9SU0hJRlQoaCwgdnNoaWZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGRzdCl7CisgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0MiA9IGRzdCArIHMtPnBpY3R1cmVfcHRyLT5saW5lc2l6ZVtpbmRleF0qKGgtMSk7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8aC8yOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8dzsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgRkZTV0FQKGludCwgZHN0W2pdLCBkc3QyW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0ICArPSBzLT5waWN0dXJlX3B0ci0+bGluZXNpemVbaW5kZXhdOworICAgICAgICAgICAgICAgICAgICBkc3QyIC09IHMtPnBpY3R1cmVfcHRyLT5saW5lc2l6ZVtpbmRleF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5hZG9iZV90cmFuc2Zvcm0gPT0gMCAmJiBzLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUkFQKSB7CisgICAgICAgIGludCB3ID0gcy0+cGljdHVyZV9wdHItPndpZHRoOworICAgICAgICBpbnQgaCA9IHMtPnBpY3R1cmVfcHRyLT5oZWlnaHQ7CisgICAgICAgIGZvciAoaT0wOyBpPGg7IGkrKykgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICB1aW50OF90ICpkc3RbNF07CisgICAgICAgICAgICBmb3IgKGluZGV4PTA7IGluZGV4PDQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBkc3RbaW5kZXhdID0gICBzLT5waWN0dXJlX3B0ci0+ZGF0YVtpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzLT5waWN0dXJlX3B0ci0+bGluZXNpemVbaW5kZXhdKmk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGo9MDsgajx3OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgayA9IGRzdFszXVtqXTsKKyAgICAgICAgICAgICAgICBpbnQgciA9IGRzdFswXVtqXSAqIGs7CisgICAgICAgICAgICAgICAgaW50IGcgPSBkc3RbMV1bal0gKiBrOworICAgICAgICAgICAgICAgIGludCBiID0gZHN0WzJdW2pdICogazsKKyAgICAgICAgICAgICAgICBkc3RbMF1bal0gPSBnKjI1NyA+PiAxNjsKKyAgICAgICAgICAgICAgICBkc3RbMV1bal0gPSBiKjI1NyA+PiAxNjsKKyAgICAgICAgICAgICAgICBkc3RbMl1bal0gPSByKjI1NyA+PiAxNjsKKyAgICAgICAgICAgICAgICBkc3RbM11bal0gPSAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPmFkb2JlX3RyYW5zZm9ybSA9PSAyICYmIHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWQTQ0NFApIHsKKyAgICAgICAgaW50IHcgPSBzLT5waWN0dXJlX3B0ci0+d2lkdGg7CisgICAgICAgIGludCBoID0gcy0+cGljdHVyZV9wdHItPmhlaWdodDsKKyAgICAgICAgZm9yIChpPTA7IGk8aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFs0XTsKKyAgICAgICAgICAgIGZvciAoaW5kZXg9MDsgaW5kZXg8NDsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGRzdFtpbmRleF0gPSAgIHMtPnBpY3R1cmVfcHRyLT5kYXRhW2luZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHMtPnBpY3R1cmVfcHRyLT5saW5lc2l6ZVtpbmRleF0qaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaj0wOyBqPHc7IGorKykgeworICAgICAgICAgICAgICAgIGludCBrID0gZHN0WzNdW2pdOworICAgICAgICAgICAgICAgIGludCByID0gKDI1NSAtIGRzdFswXVtqXSkgKiBrOworICAgICAgICAgICAgICAgIGludCBnID0gKDEyOCAtIGRzdFsxXVtqXSkgKiBrOworICAgICAgICAgICAgICAgIGludCBiID0gKDEyOCAtIGRzdFsyXVtqXSkgKiBrOworICAgICAgICAgICAgICAgIGRzdFswXVtqXSA9IHIqMjU3ID4+IDE2OworICAgICAgICAgICAgICAgIGRzdFsxXVtqXSA9IChnKjI1NyA+PiAxNikgKyAxMjg7CisgICAgICAgICAgICAgICAgZHN0WzJdW2pdID0gKGIqMjU3ID4+IDE2KSArIDEyODsKKyAgICAgICAgICAgICAgICBkc3RbM11bal0gPSAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+c3RlcmVvM2QpIHsKKyAgICAgICAgQVZTdGVyZW8zRCAqc3RlcmVvID0gYXZfc3RlcmVvM2RfY3JlYXRlX3NpZGVfZGF0YShkYXRhKTsKKyAgICAgICAgaWYgKHN0ZXJlbykgeworICAgICAgICAgICAgc3RlcmVvLT50eXBlICA9IHMtPnN0ZXJlbzNkLT50eXBlOworICAgICAgICAgICAgc3RlcmVvLT5mbGFncyA9IHMtPnN0ZXJlbzNkLT5mbGFnczsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmcy0+c3RlcmVvM2QpOworICAgIH0KKworICAgIGF2X2RpY3RfY29weShhdnByaXZfZnJhbWVfZ2V0X21ldGFkYXRhcChkYXRhKSwgcy0+ZXhpZl9tZXRhZGF0YSwgMCk7CisgICAgYXZfZGljdF9mcmVlKCZzLT5leGlmX21ldGFkYXRhKTsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZGVjb2RlIGZyYW1lIHVudXNlZCAlIlBUUkRJRkZfU1BFQ0lGSUVSIiBieXRlc1xuIiwKKyAgICAgICAgICAgYnVmX2VuZCAtIGJ1Zl9wdHIpOworLy8gIHJldHVybiBidWZfZW5kIC0gYnVmX3B0cjsKKyAgICByZXR1cm4gYnVmX3B0ciAtIGJ1ZjsKK30KKworYXZfY29sZCBpbnQgZmZfbWpwZWdfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTUpwZWdEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgajsKKworICAgIGlmIChzLT5pbnRlcmxhY2VkICYmIHMtPmJvdHRvbV9maWVsZCA9PSAhcy0+aW50ZXJsYWNlX3BvbGFyaXR5ICYmIHMtPmdvdF9waWN0dXJlICYmICFhdmN0eC0+ZnJhbWVfbnVtYmVyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJTaW5nbGUgZmllbGRcbiIpOworICAgIH0KKworICAgIGlmIChzLT5waWN0dXJlKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnBpY3R1cmUpOworICAgICAgICBzLT5waWN0dXJlX3B0ciA9IE5VTEw7CisgICAgfSBlbHNlIGlmIChzLT5waWN0dXJlX3B0cikKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+cGljdHVyZV9wdHIpOworCisgICAgYXZfZnJlZXAoJnMtPmJ1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPnN0ZXJlbzNkKTsKKyAgICBhdl9mcmVlcCgmcy0+bGpwZWdfYnVmZmVyKTsKKyAgICBzLT5sanBlZ19idWZmZXJfc2l6ZSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICBmZl9mcmVlX3ZsYygmcy0+dmxjc1tpXVtqXSk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQ09NUE9ORU5UUzsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5ibG9ja3NbaV0pOworICAgICAgICBhdl9mcmVlcCgmcy0+bGFzdF9ubnpbaV0pOworICAgIH0KKyAgICBhdl9kaWN0X2ZyZWUoJnMtPmV4aWZfbWV0YWRhdGEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1KcGVnRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcy0+Z290X3BpY3R1cmUgPSAwOworfQorCisjaWYgQ09ORklHX01KUEVHX0RFQ09ERVIKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE1KcGVnRGVjb2RlQ29udGV4dCwgeCkKKyNkZWZpbmUgVkQgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJleHRlcm5faHVmZiIsICJVc2UgZXh0ZXJuYWwgaHVmZm1hbiB0YWJsZS4iLAorICAgICAgT0ZGU0VUKGV4dGVybl9odWZmKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZEIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBtanBlZ2RlY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJNSlBFRyBkZWNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbWpwZWdfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibWpwZWciLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNSlBFRyAoTW90aW9uIEpQRUcpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01KUEVHLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNSnBlZ0RlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX21qcGVnX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX21qcGVnX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZmZfbWpwZWdfZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IGRlY29kZV9mbHVzaCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5tYXhfbG93cmVzICAgICA9IDMsCisgICAgLnByaXZfY2xhc3MgICAgID0gJm1qcGVnZGVjX2NsYXNzLAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19USFBfREVDT0RFUgorQVZDb2RlYyBmZl90aHBfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidGhwIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTmludGVuZG8gR2FtZWN1YmUgVEhQIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1RIUCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTUpwZWdEZWNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9tanBlZ19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl9tanBlZ19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGZmX21qcGVnX2RlY29kZV9mcmFtZSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBkZWNvZGVfZmx1c2gsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAubWF4X2xvd3JlcyAgICAgPSAzLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWdkZWMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21qcGVnZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhY2FiZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21qcGVnZGVjLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBNSlBFRyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQWxleCBCZXJlZ3N6YXN6aQorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNSlBFRyBkZWNvZGVyLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NSlBFR0RFQ19ICisjZGVmaW5lIEFWQ09ERUNfTUpQRUdERUNfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3N0ZXJlbzNkLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImhwZWxkc3AuaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisKKyNkZWZpbmUgTUFYX0NPTVBPTkVOVFMgNAorCit0eXBlZGVmIHN0cnVjdCBNSnBlZ0RlY29kZUNvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworCisgICAgaW50IHN0YXJ0X2NvZGU7IC8qIGN1cnJlbnQgc3RhcnQgY29kZSAqLworICAgIGludCBidWZmZXJfc2l6ZTsKKyAgICB1aW50OF90ICpidWZmZXI7CisKKyAgICBpbnQxNl90IHF1YW50X21hdHJpeGVzWzRdWzY0XTsKKyAgICBWTEMgdmxjc1szXVs0XTsKKyAgICBpbnQgcXNjYWxlWzRdOyAgICAgIC8vLzwgcXVhbnRpemVyIHNjYWxlIGNhbGN1bGF0ZWQgZnJvbSBxdWFudF9tYXRyaXhlcworCisgICAgaW50IG9yZ19oZWlnaHQ7ICAvKiBzaXplIGdpdmVuIGF0IGNvZGVjIGluaXQgKi8KKyAgICBpbnQgZmlyc3RfcGljdHVyZTsgICAgLyogdHJ1ZSBpZiBkZWNvZGluZyBmaXJzdCBwaWN0dXJlICovCisgICAgaW50IGludGVybGFjZWQ7ICAgICAvKiB0cnVlIGlmIGludGVybGFjZWQgKi8KKyAgICBpbnQgYm90dG9tX2ZpZWxkOyAgIC8qIHRydWUgaWYgYm90dG9tIGZpZWxkICovCisgICAgaW50IGxvc3NsZXNzOworICAgIGludCBsczsKKyAgICBpbnQgcHJvZ3Jlc3NpdmU7CisgICAgaW50IHJnYjsKKyAgICBpbnQgdXBzY2FsZV9oOworICAgIGludCB1cHNjYWxlX3Y7CisgICAgaW50IHJjdDsgICAgICAgICAgICAvKiBzdGFuZGFyZCByY3QgKi8KKyAgICBpbnQgcGVnYXN1c19yY3Q7ICAgIC8qIHBlZ2FzdXMgcmV2ZXJzaWJsZSBjb2xvcnNwYWNlIHRyYW5zZm9ybSAqLworICAgIGludCBiaXRzOyAgICAgICAgICAgLyogYml0cyBwZXIgY29tcG9uZW50ICovCisgICAgaW50IGNvbHI7CisgICAgaW50IHhmcm07CisgICAgaW50IGFkb2JlX3RyYW5zZm9ybTsKKworICAgIGludCBtYXh2YWw7CisgICAgaW50IG5lYXI7ICAgICAgICAgLy8vPCBuZWFyIGxvc3NsZXNzIGJvdW5kIChzaSAwIGZvciBsb3NzbGVzcykKKyAgICBpbnQgdDEsdDIsdDM7CisgICAgaW50IHJlc2V0OyAgICAgICAgLy8vPCBjb250ZXh0IGhhbGZpbmcgaW50ZXJ2YWwgP3JlbmFtZQorCisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IG1iX3dpZHRoLCBtYl9oZWlnaHQ7CisgICAgaW50IG5iX2NvbXBvbmVudHM7CisgICAgaW50IGJsb2NrX3N0cmlkZVtNQVhfQ09NUE9ORU5UU107CisgICAgaW50IGNvbXBvbmVudF9pZFtNQVhfQ09NUE9ORU5UU107CisgICAgaW50IGhfY291bnRbTUFYX0NPTVBPTkVOVFNdOyAvKiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBjb3VudCBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICBpbnQgdl9jb3VudFtNQVhfQ09NUE9ORU5UU107CisgICAgaW50IGNvbXBfaW5kZXhbTUFYX0NPTVBPTkVOVFNdOworICAgIGludCBkY19pbmRleFtNQVhfQ09NUE9ORU5UU107CisgICAgaW50IGFjX2luZGV4W01BWF9DT01QT05FTlRTXTsKKyAgICBpbnQgbmJfYmxvY2tzW01BWF9DT01QT05FTlRTXTsKKyAgICBpbnQgaF9zY291bnRbTUFYX0NPTVBPTkVOVFNdOworICAgIGludCB2X3Njb3VudFtNQVhfQ09NUE9ORU5UU107CisgICAgaW50IHF1YW50X3NpbmRleFtNQVhfQ09NUE9ORU5UU107CisgICAgaW50IGhfbWF4LCB2X21heDsgLyogbWF4aW11bSBoIGFuZCB2IGNvdW50cyAqLworICAgIGludCBxdWFudF9pbmRleFs0XTsgICAvKiBxdWFudCB0YWJsZSBpbmRleCBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICBpbnQgbGFzdF9kY1tNQVhfQ09NUE9ORU5UU107IC8qIGxhc3QgREVRVUFOVElaRUQgZGMgKFhYWDogYW0gSSByaWdodCB0byBkbyB0aGF0ID8pICovCisgICAgQVZGcmFtZSAqcGljdHVyZTsgLyogcGljdHVyZSBzdHJ1Y3R1cmUgKi8KKyAgICBBVkZyYW1lICpwaWN0dXJlX3B0cjsgLyogcG9pbnRlciB0byBwaWN0dXJlIHN0cnVjdHVyZSAqLworICAgIGludCBnb3RfcGljdHVyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgd2UgZm91bmQgYSBTT0YgYW5kIHBpY3R1cmUgaXMgdmFsaWQsIHRvby4KKyAgICBpbnQgbGluZXNpemVbTUFYX0NPTVBPTkVOVFNdOyAgICAgICAgICAgICAgICAgICAvLy88IGxpbmVzaXplIDw8IGludGVybGFjZWQKKyAgICBpbnQ4X3QgKnFzY2FsZV90YWJsZTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrKVs2NF07CisgICAgaW50MTZfdCAoKmJsb2Nrc1tNQVhfQ09NUE9ORU5UU10pWzY0XTsgLy8vPCBpbnRlcm1lZGlhdGUgc3VtcyAocHJvZ3Jlc3NpdmUgbW9kZSkKKyAgICB1aW50OF90ICpsYXN0X25ueltNQVhfQ09NUE9ORU5UU107CisgICAgdWludDY0X3QgY29lZnNfZmluaXNoZWRbTUFYX0NPTVBPTkVOVFNdOyAvLy88IGJpdG1hc2sgb2Ygd2hpY2ggY29lZnMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgZGVjb2RlZCAocHJvZ3Jlc3NpdmUgbW9kZSkKKyAgICBpbnQgcGFsZXR0ZV9pbmRleDsKKyAgICBTY2FuVGFibGUgc2NhbnRhYmxlOworICAgIEJsb2NrRFNQQ29udGV4dCBiZHNwOworICAgIEhwZWxEU1BDb250ZXh0IGhkc3A7CisgICAgSURDVERTUENvbnRleHQgaWRzcDsKKworICAgIGludCByZXN0YXJ0X2ludGVydmFsOworICAgIGludCByZXN0YXJ0X2NvdW50OworCisgICAgaW50IGJ1Z2d5X2F2aWQ7CisgICAgaW50IGNzX2l0dTYwMTsKKyAgICBpbnQgaW50ZXJsYWNlX3BvbGFyaXR5OworCisgICAgaW50IG1qcGJfc2tpcHRvc29kOworCisgICAgaW50IGN1cl9zY2FuOyAvKiBjdXJyZW50IHNjYW4sIHVzZWQgYnkgSlBFRy1MUyAqLworICAgIGludCBmbGlwcGVkOyAvKiB0cnVlIGlmIHBpY3R1cmUgaXMgZmxpcHBlZCAqLworCisgICAgdWludDE2X3QgKCpsanBlZ19idWZmZXIpWzRdOworICAgIHVuc2lnbmVkIGludCBsanBlZ19idWZmZXJfc2l6ZTsKKworICAgIGludCBleHRlcm5faHVmZjsKKyAgICBBVkRpY3Rpb25hcnkgKmV4aWZfbWV0YWRhdGE7CisKKyAgICBBVlN0ZXJlbzNEICpzdGVyZW8zZDsgLy8vITwgc3RlcmVvc2NvcGljIGluZm9ybWF0aW9uIChjYWNoZWQsIHNpbmNlIGl0IGlzIHJlYWQgYmVmb3JlIGZyYW1lIGFsbG9jYXRpb24pCisKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjOworfSBNSnBlZ0RlY29kZUNvbnRleHQ7CisKK2ludCBmZl9tanBlZ19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworaW50IGZmX21qcGVnX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK2ludCBmZl9tanBlZ19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KTsKK2ludCBmZl9tanBlZ19kZWNvZGVfZHF0KE1KcGVnRGVjb2RlQ29udGV4dCAqcyk7CitpbnQgZmZfbWpwZWdfZGVjb2RlX2RodChNSnBlZ0RlY29kZUNvbnRleHQgKnMpOworaW50IGZmX21qcGVnX2RlY29kZV9zb2YoTUpwZWdEZWNvZGVDb250ZXh0ICpzKTsKK2ludCBmZl9tanBlZ19kZWNvZGVfc29zKE1KcGVnRGVjb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm1iX2JpdG1hc2ssaW50IG1iX2JpdG1hc2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnJlZmVyZW5jZSk7CitpbnQgZmZfbWpwZWdfZmluZF9tYXJrZXIoTUpwZWdEZWNvZGVDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipidWZfcHRyLCBjb25zdCB1aW50OF90ICpidWZfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKip1bmVzY2FwZWRfYnVmX3B0ciwgaW50ICp1bmVzY2FwZWRfYnVmX3NpemUpOworCisjZW5kaWYgLyogQVZDT0RFQ19NSlBFR0RFQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tanBlZ2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWdlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDcwMWUyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWdlbmMuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIE1KUEVHIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMyBBbGV4IEJlcmVnc3phc3ppCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogU3VwcG9ydCBmb3IgZXh0ZXJuYWwgaHVmZm1hbiB0YWJsZSwgdmFyaW91cyBmaXhlcyAoQVZJRCB3b3JrYXJvdW5kKSwKKyAqIGFzcGVjdGluZywgbmV3IGRlY29kZV9mcmFtZSBtZWNoYW5pc20gYW5kIGFwcGxlIG1qcGVnLWIgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNSlBFRyBlbmNvZGVyLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1qcGVnZW5jX2NvbW1vbi5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgIm1qcGVnLmgiCisjaW5jbHVkZSAibWpwZWdlbmMuaCIKKworYXZfY29sZCBpbnQgZmZfbWpwZWdfZW5jb2RlX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgTUpwZWdDb250ZXh0ICptOworCisgICAgaWYgKHMtPndpZHRoID4gNjU1MDAgfHwgcy0+aGVpZ2h0ID4gNjU1MDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkpQRUcgZG9lcyBub3Qgc3VwcG9ydCByZXNvbHV0aW9ucyBhYm92ZSA2NTUwMHg2NTUwMFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgbSA9IGF2X21hbGxvYyhzaXplb2YoTUpwZWdDb250ZXh0KSk7CisgICAgaWYgKCFtKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+bWluX3Fjb2VmZj0tMTAyMzsKKyAgICBzLT5tYXhfcWNvZWZmPSAxMDIzOworCisgICAgLyogYnVpbGQgYWxsIHRoZSBodWZmbWFuIHRhYmxlcyAqLworICAgIGZmX21qcGVnX2J1aWxkX2h1ZmZtYW5fY29kZXMobS0+aHVmZl9zaXplX2RjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPmh1ZmZfY29kZV9kY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfYml0c19kY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2RjKTsKKyAgICBmZl9tanBlZ19idWlsZF9odWZmbWFuX2NvZGVzKG0tPmh1ZmZfc2l6ZV9kY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPmh1ZmZfY29kZV9kY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ19iaXRzX2RjX2Nocm9taW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9kYyk7CisgICAgZmZfbWpwZWdfYnVpbGRfaHVmZm1hbl9jb2RlcyhtLT5odWZmX3NpemVfYWNfbHVtaW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+aHVmZl9jb2RlX2FjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ19iaXRzX2FjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfYWNfbHVtaW5hbmNlKTsKKyAgICBmZl9tanBlZ19idWlsZF9odWZmbWFuX2NvZGVzKG0tPmh1ZmZfc2l6ZV9hY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPmh1ZmZfY29kZV9hY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ19iaXRzX2FjX2Nocm9taW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9hY19jaHJvbWluYW5jZSk7CisKKyAgICBzLT5tanBlZ19jdHggPSBtOworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX21qcGVnX2VuY29kZV9jbG9zZShNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBhdl9mcmVlcCgmcy0+bWpwZWdfY3R4KTsKK30KKworc3RhdGljIHZvaWQgZW5jb2RlX2Jsb2NrKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywgaW50IG4pCit7CisgICAgaW50IG1hbnQsIG5iaXRzLCBjb2RlLCBpLCBqOworICAgIGludCBjb21wb25lbnQsIGRjLCBydW4sIGxhc3RfaW5kZXgsIHZhbDsKKyAgICBNSnBlZ0NvbnRleHQgKm0gPSBzLT5tanBlZ19jdHg7CisgICAgdWludDhfdCAqaHVmZl9zaXplX2FjOworICAgIHVpbnQxNl90ICpodWZmX2NvZGVfYWM7CisKKyAgICAvKiBEQyBjb2VmICovCisgICAgY29tcG9uZW50ID0gKG4gPD0gMyA/IDAgOiAobiYxKSArIDEpOworICAgIGRjID0gYmxvY2tbMF07IC8qIG92ZXJmbG93IGlzIGltcG9zc2libGUgKi8KKyAgICB2YWwgPSBkYyAtIHMtPmxhc3RfZGNbY29tcG9uZW50XTsKKyAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgZmZfbWpwZWdfZW5jb2RlX2RjKCZzLT5wYiwgdmFsLCBtLT5odWZmX3NpemVfZGNfbHVtaW5hbmNlLCBtLT5odWZmX2NvZGVfZGNfbHVtaW5hbmNlKTsKKyAgICAgICAgaHVmZl9zaXplX2FjID0gbS0+aHVmZl9zaXplX2FjX2x1bWluYW5jZTsKKyAgICAgICAgaHVmZl9jb2RlX2FjID0gbS0+aHVmZl9jb2RlX2FjX2x1bWluYW5jZTsKKyAgICB9IGVsc2UgeworICAgICAgICBmZl9tanBlZ19lbmNvZGVfZGMoJnMtPnBiLCB2YWwsIG0tPmh1ZmZfc2l6ZV9kY19jaHJvbWluYW5jZSwgbS0+aHVmZl9jb2RlX2RjX2Nocm9taW5hbmNlKTsKKyAgICAgICAgaHVmZl9zaXplX2FjID0gbS0+aHVmZl9zaXplX2FjX2Nocm9taW5hbmNlOworICAgICAgICBodWZmX2NvZGVfYWMgPSBtLT5odWZmX2NvZGVfYWNfY2hyb21pbmFuY2U7CisgICAgfQorICAgIHMtPmxhc3RfZGNbY29tcG9uZW50XSA9IGRjOworCisgICAgLyogQUMgY29lZnMgKi8KKworICAgIHJ1biA9IDA7CisgICAgbGFzdF9pbmRleCA9IHMtPmJsb2NrX2xhc3RfaW5kZXhbbl07CisgICAgZm9yKGk9MTtpPD1sYXN0X2luZGV4O2krKykgeworICAgICAgICBqID0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWRbaV07CisgICAgICAgIHZhbCA9IGJsb2NrW2pdOworICAgICAgICBpZiAodmFsID09IDApIHsKKyAgICAgICAgICAgIHJ1bisrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2hpbGUgKHJ1biA+PSAxNikgeworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgaHVmZl9zaXplX2FjWzB4ZjBdLCBodWZmX2NvZGVfYWNbMHhmMF0pOworICAgICAgICAgICAgICAgIHJ1biAtPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hbnQgPSB2YWw7CisgICAgICAgICAgICBpZiAodmFsIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbCA9IC12YWw7CisgICAgICAgICAgICAgICAgbWFudC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuYml0cz0gYXZfbG9nMl8xNmJpdCh2YWwpICsgMTsKKyAgICAgICAgICAgIGNvZGUgPSAocnVuIDw8IDQpIHwgbmJpdHM7CisKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgaHVmZl9zaXplX2FjW2NvZGVdLCBodWZmX2NvZGVfYWNbY29kZV0pOworCisgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCBuYml0cywgbWFudCk7CisgICAgICAgICAgICBydW4gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogb3V0cHV0IEVPQiBvbmx5IGlmIG5vdCBhbHJlYWR5IDY0IHZhbHVlcyAqLworICAgIGlmIChsYXN0X2luZGV4IDwgNjMgfHwgcnVuICE9IDApCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgaHVmZl9zaXplX2FjWzBdLCBodWZmX2NvZGVfYWNbMF0pOworfQorCit2b2lkIGZmX21qcGVnX2VuY29kZV9tYihNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1sxMl1bNjRdKQoreworICAgIGludCBpOworICAgIGlmIChzLT5jaHJvbWFfZm9ybWF0ID09IENIUk9NQV80NDQpIHsKKyAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzBdLCAwKTsKKyAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzJdLCAyKTsKKyAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzRdLCA0KTsKKyAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzhdLCA4KTsKKyAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzVdLCA1KTsKKyAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzldLCA5KTsKKworICAgICAgICBpZiAoMTYqcy0+bWJfeCs4IDwgcy0+d2lkdGgpIHsKKyAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1sxXSwgMSk7CisgICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbM10sIDMpOworICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzZdLCA2KTsKKyAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1sxMF0sIDEwKTsKKyAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1s3XSwgNyk7CisgICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbMTFdLCAxMSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaT0wO2k8NTtpKyspIHsKKyAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1tpXSwgaSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmNocm9tYV9mb3JtYXQgPT0gQ0hST01BXzQyMCkgeworICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzVdLCA1KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1s2XSwgNik7CisgICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbNV0sIDUpOworICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzddLCA3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmlfdGV4X2JpdHMgKz0gZ2V0X2JpdHNfZGlmZihzKTsKK30KKworLy8gbWF4aW11bSBvdmVyIHMtPm1qcGVnX3ZzYW1wbGVbaV0KKyNkZWZpbmUgVl9NQVggMgorc3RhdGljIGludCBhbXZfZW5jb2RlX3BpY3R1cmUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljX2FyZywgaW50ICpnb3RfcGFja2V0KQorCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKnBpYzsKKyAgICBpbnQgaSwgcmV0OworICAgIGludCBjaHJvbWFfaF9zaGlmdCwgY2hyb21hX3Zfc2hpZnQ7CisKKyAgICBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmN0eC0+cGl4X2ZtdCwgJmNocm9tYV9oX3NoaWZ0LCAmY2hyb21hX3Zfc2hpZnQpOworCisgICAgLy9DT0RFQ19GTEFHX0VNVV9FREdFIGhhdmUgdG8gYmUgY2xlYXJlZAorICAgIGlmKHMtPmF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfRU1VX0VER0UpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoKGF2Y3R4LT5oZWlnaHQgJiAxNSkgJiYgYXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfVU5PRkZJQ0lBTCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJIZWlnaHRzIHdoaWNoIGFyZSBub3QgYSBtdWx0aXBsZSBvZiAxNiBtaWdodCBmYWlsIHdpdGggc29tZSBkZWNvZGVycywgIgorICAgICAgICAgICAgICAgInVzZSB2c3RyaWN0PS0xIC8gLXN0cmljdCAtMSB0byB1c2UgJWQgYW55d2F5LlxuIiwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJZiB5b3UgaGF2ZSBhIGRldmljZSB0aGF0IHBsYXlzIEFNViB2aWRlb3MsIHBsZWFzZSB0ZXN0IGlmIHZpZGVvcyAiCisgICAgICAgICAgICAgICAid2l0aCBzdWNoIGhlaWdodHMgd29yayB3aXRoIGl0IGFuZCByZXBvcnQgeW91ciBmaW5kaW5ncyB0byBmZm1wZWctZGV2ZWxAZmZtcGVnLm9yZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYUEVSSU1FTlRBTDsKKyAgICB9CisKKyAgICBwaWMgPSBhdl9mcmFtZV9jbG9uZShwaWNfYXJnKTsKKyAgICBpZiAoIXBpYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAvL3BpY3R1cmUgc2hvdWxkIGJlIGZsaXBwZWQgdXBzaWRlLWRvd24KKyAgICBmb3IoaT0wOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGludCB2c2FtcGxlID0gaSA/IDIgPj4gY2hyb21hX3Zfc2hpZnQgOiAyOworICAgICAgICBwaWMtPmRhdGFbaV0gKz0gcGljLT5saW5lc2l6ZVtpXSAqICh2c2FtcGxlICogcy0+aGVpZ2h0IC8gVl9NQVggLSAxKTsKKyAgICAgICAgcGljLT5saW5lc2l6ZVtpXSAqPSAtMTsKKyAgICB9CisgICAgcmV0ID0gZmZfbXB2X2VuY29kZV9waWN0dXJlKGF2Y3R4LCBwa3QsIHBpYywgZ290X3BhY2tldCk7CisgICAgYXZfZnJhbWVfZnJlZSgmcGljKTsKKyAgICByZXR1cm4gcmV0OworfQorCisjaWYgQ09ORklHX01KUEVHX0VOQ09ERVIKK0ZGX01QVl9HRU5FUklDX0NMQVNTKG1qcGVnKQorCitBVkNvZGVjIGZmX21qcGVnX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1qcGVnIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTUpQRUcgKE1vdGlvbiBKUEVHKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NSlBFRywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ0VuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX21wdl9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBmZl9tcHZfZW5jb2RlX3BpY3R1cmUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9lbmQsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMgfCBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IENPREVDX0NBUF9JTlRSQV9PTkxZLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMFAsIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfTk9ORQorICAgIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJm1qcGVnX2NsYXNzLAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19BTVZfRU5DT0RFUgorRkZfTVBWX0dFTkVSSUNfQ0xBU1MoYW12KQorCitBVkNvZGVjIGZmX2Ftdl9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhbXYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBTVYgVmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQU1WLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGFtdl9lbmNvZGVfcGljdHVyZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl9tcHZfZW5jb2RlX2VuZCwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peworICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjBQLCBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZhbXZfY2xhc3MsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tanBlZ2VuYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWdlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlkNDNjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWdlbmMuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogTUpQRUcgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAzIEFsZXggQmVyZWdzemFzemkKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBTdXBwb3J0IGZvciBleHRlcm5hbCBodWZmbWFuIHRhYmxlLCB2YXJpb3VzIGZpeGVzIChBVklEIHdvcmthcm91bmQpLAorICogYXNwZWN0aW5nLCBuZXcgZGVjb2RlX2ZyYW1lIG1lY2hhbmlzbSBhbmQgYXBwbGUgbWpwZWctYiBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBBbGV4IEJlcmVnc3phc3ppCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1KUEVHIGVuY29kZXIuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01KUEVHRU5DX0gKKyNkZWZpbmUgQVZDT0RFQ19NSlBFR0VOQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCBNSnBlZ0NvbnRleHQgeworICAgIHVpbnQ4X3QgaHVmZl9zaXplX2RjX2x1bWluYW5jZVsxMl07IC8vRklYTUUgdXNlIGFycmF5IFszXSBpbnN0ZWFkIG9mIGx1bWkgLyBjaHJvbSwgZm9yIGVhc2llciBhZGRyZXNzaW5nCisgICAgdWludDE2X3QgaHVmZl9jb2RlX2RjX2x1bWluYW5jZVsxMl07CisgICAgdWludDhfdCBodWZmX3NpemVfZGNfY2hyb21pbmFuY2VbMTJdOworICAgIHVpbnQxNl90IGh1ZmZfY29kZV9kY19jaHJvbWluYW5jZVsxMl07CisKKyAgICB1aW50OF90IGh1ZmZfc2l6ZV9hY19sdW1pbmFuY2VbMjU2XTsKKyAgICB1aW50MTZfdCBodWZmX2NvZGVfYWNfbHVtaW5hbmNlWzI1Nl07CisgICAgdWludDhfdCBodWZmX3NpemVfYWNfY2hyb21pbmFuY2VbMjU2XTsKKyAgICB1aW50MTZfdCBodWZmX2NvZGVfYWNfY2hyb21pbmFuY2VbMjU2XTsKK30gTUpwZWdDb250ZXh0OworCitpbnQgIGZmX21qcGVnX2VuY29kZV9pbml0KE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbWpwZWdfZW5jb2RlX2Nsb3NlKE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbWpwZWdfZW5jb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzEyXVs2NF0pOworCisjZW5kaWYgLyogQVZDT0RFQ19NSlBFR0VOQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tanBlZ2VuY19jb21tb24uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21qcGVnZW5jX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNWI5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tanBlZ2VuY19jb21tb24uYwpAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIGxvc3NsZXNzIEpQRUcgc2hhcmVkIGJpdHMKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMyBBbGV4IEJlcmVnc3phc3ppCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJtanBlZ2VuY19jb21tb24uaCIKKyNpbmNsdWRlICJtanBlZy5oIgorCisvKiB0YWJsZV9jbGFzczogMCA9IERDIGNvZWYsIDEgPSBBQyBjb2VmcyAqLworc3RhdGljIGludCBwdXRfaHVmZm1hbl90YWJsZShQdXRCaXRDb250ZXh0ICpwLCBpbnQgdGFibGVfY2xhc3MsIGludCB0YWJsZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYml0c190YWJsZSwgY29uc3QgdWludDhfdCAqdmFsdWVfdGFibGUpCit7CisgICAgaW50IG4sIGk7CisKKyAgICBwdXRfYml0cyhwLCA0LCB0YWJsZV9jbGFzcyk7CisgICAgcHV0X2JpdHMocCwgNCwgdGFibGVfaWQpOworCisgICAgbiA9IDA7CisgICAgZm9yKGk9MTtpPD0xNjtpKyspIHsKKyAgICAgICAgbiArPSBiaXRzX3RhYmxlW2ldOworICAgICAgICBwdXRfYml0cyhwLCA4LCBiaXRzX3RhYmxlW2ldKTsKKyAgICB9CisKKyAgICBmb3IoaT0wO2k8bjtpKyspCisgICAgICAgIHB1dF9iaXRzKHAsIDgsIHZhbHVlX3RhYmxlW2ldKTsKKworICAgIHJldHVybiBuICsgMTc7Cit9CisKK3N0YXRpYyB2b2lkIGpwZWdfdGFibGVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUHV0Qml0Q29udGV4dCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYW5UYWJsZSAqaW50cmFfc2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbHVtYV9pbnRyYV9tYXRyaXhbNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2hyb21hX2ludHJhX21hdHJpeFs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHNhbXBsZVszXSkKK3sKKyAgICBpbnQgaSwgaiwgc2l6ZTsKKyAgICB1aW50OF90ICpwdHI7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0xKUEVHKSB7CisgICAgICAgIGludCBtYXRyaXhfY291bnQgPSAxICsgISFtZW1jbXAobHVtYV9pbnRyYV9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21hX2ludHJhX21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobHVtYV9pbnRyYV9tYXRyaXhbMF0pICogNjQpOworICAgIC8qIHF1YW50IG1hdHJpeGVzICovCisgICAgcHV0X21hcmtlcihwLCBEUVQpOworICAgIHB1dF9iaXRzKHAsIDE2LCAyICsgbWF0cml4X2NvdW50ICogKDEgKyA2NCkpOworICAgIHB1dF9iaXRzKHAsIDQsIDApOyAvKiA4IGJpdCBwcmVjaXNpb24gKi8KKyAgICBwdXRfYml0cyhwLCA0LCAwKTsgLyogdGFibGUgMCAqLworICAgIGZvcihpPTA7aTw2NDtpKyspIHsKKyAgICAgICAgaiA9IGludHJhX3NjYW50YWJsZS0+cGVybXV0YXRlZFtpXTsKKyAgICAgICAgcHV0X2JpdHMocCwgOCwgbHVtYV9pbnRyYV9tYXRyaXhbal0pOworICAgIH0KKworICAgICAgICBpZiAobWF0cml4X2NvdW50ID4gMSkgeworICAgICAgICAgICAgcHV0X2JpdHMocCwgNCwgMCk7IC8qIDggYml0IHByZWNpc2lvbiAqLworICAgICAgICAgICAgcHV0X2JpdHMocCwgNCwgMSk7IC8qIHRhYmxlIDEgKi8KKyAgICAgICAgICAgIGZvcihpPTA7aTw2NDtpKyspIHsKKyAgICAgICAgICAgICAgICBqID0gaW50cmFfc2NhbnRhYmxlLT5wZXJtdXRhdGVkW2ldOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHAsIDgsIGNocm9tYV9pbnRyYV9tYXRyaXhbal0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9TTElDRSl7CisgICAgICAgIHB1dF9tYXJrZXIocCwgRFJJKTsKKyAgICAgICAgcHV0X2JpdHMocCwgMTYsIDQpOworICAgICAgICBwdXRfYml0cyhwLCAxNiwgKGF2Y3R4LT53aWR0aC0xKS8oOCpoc2FtcGxlWzBdKSArIDEpOworICAgIH0KKworICAgIC8qIGh1ZmZtYW4gdGFibGUgKi8KKyAgICBwdXRfbWFya2VyKHAsIERIVCk7CisgICAgZmx1c2hfcHV0X2JpdHMocCk7CisgICAgcHRyID0gcHV0X2JpdHNfcHRyKHApOworICAgIHB1dF9iaXRzKHAsIDE2LCAwKTsgLyogcGF0Y2hlZCBsYXRlciAqLworICAgIHNpemUgPSAyOworICAgIHNpemUgKz0gcHV0X2h1ZmZtYW5fdGFibGUocCwgMCwgMCwgYXZwcml2X21qcGVnX2JpdHNfZGNfbHVtaW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9kYyk7CisgICAgc2l6ZSArPSBwdXRfaHVmZm1hbl90YWJsZShwLCAwLCAxLCBhdnByaXZfbWpwZWdfYml0c19kY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfZGMpOworCisgICAgc2l6ZSArPSBwdXRfaHVmZm1hbl90YWJsZShwLCAxLCAwLCBhdnByaXZfbWpwZWdfYml0c19hY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2FjX2x1bWluYW5jZSk7CisgICAgc2l6ZSArPSBwdXRfaHVmZm1hbl90YWJsZShwLCAxLCAxLCBhdnByaXZfbWpwZWdfYml0c19hY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfYWNfY2hyb21pbmFuY2UpOworICAgIEFWX1dCMTYocHRyLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQganBlZ19wdXRfY29tbWVudHMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBQdXRCaXRDb250ZXh0ICpwKQoreworICAgIGludCBzaXplOworICAgIHVpbnQ4X3QgKnB0cjsKKworICAgIGlmIChhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPiAwICYmIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA+IDApIHsKKyAgICAgICAgLyogSkZJRiBoZWFkZXIgKi8KKyAgICAgICAgcHV0X21hcmtlcihwLCBBUFAwKTsKKyAgICAgICAgcHV0X2JpdHMocCwgMTYsIDE2KTsKKyAgICAgICAgYXZwcml2X3B1dF9zdHJpbmcocCwgIkpGSUYiLCAxKTsgLyogdGhpcyBwdXRzIHRoZSB0cmFpbGluZyB6ZXJvLWJ5dGUgdG9vICovCisgICAgICAgIHB1dF9iaXRzKHAsIDE2LCAweDAxMDIpOyAgICAgICAgIC8qIHYgMS4wMiAqLworICAgICAgICBwdXRfYml0cyhwLCAgOCwgMCk7ICAgICAgICAgICAgICAvKiB1bml0cyB0eXBlOiAwIC0gYXNwZWN0IHJhdGlvICovCisgICAgICAgIHB1dF9iaXRzKHAsIDE2LCBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pOworICAgICAgICBwdXRfYml0cyhwLCAxNiwgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKyAgICAgICAgcHV0X2JpdHMocCwgOCwgMCk7IC8qIHRodW1ibmFpbCB3aWR0aCAqLworICAgICAgICBwdXRfYml0cyhwLCA4LCAwKTsgLyogdGh1bWJuYWlsIGhlaWdodCAqLworICAgIH0KKworICAgIC8qIGNvbW1lbnQgKi8KKyAgICBpZiAoIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKSkgeworICAgICAgICBwdXRfbWFya2VyKHAsIENPTSk7CisgICAgICAgIGZsdXNoX3B1dF9iaXRzKHApOworICAgICAgICBwdHIgPSBwdXRfYml0c19wdHIocCk7CisgICAgICAgIHB1dF9iaXRzKHAsIDE2LCAwKTsgLyogcGF0Y2hlZCBsYXRlciAqLworICAgICAgICBhdnByaXZfcHV0X3N0cmluZyhwLCBMSUJBVkNPREVDX0lERU5ULCAxKTsKKyAgICAgICAgc2l6ZSA9IHN0cmxlbihMSUJBVkNPREVDX0lERU5UKSszOworICAgICAgICBBVl9XQjE2KHB0ciwgc2l6ZSk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCB8fAorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlAgfHwKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQKSB7CisgICAgICAgIHB1dF9tYXJrZXIocCwgQ09NKTsKKyAgICAgICAgZmx1c2hfcHV0X2JpdHMocCk7CisgICAgICAgIHB0ciA9IHB1dF9iaXRzX3B0cihwKTsKKyAgICAgICAgcHV0X2JpdHMocCwgMTYsIDApOyAvKiBwYXRjaGVkIGxhdGVyICovCisgICAgICAgIGF2cHJpdl9wdXRfc3RyaW5nKHAsICJDUz1JVFU2MDEiLCAxKTsKKyAgICAgICAgc2l6ZSA9IHN0cmxlbigiQ1M9SVRVNjAxIikrMzsKKyAgICAgICAgQVZfV0IxNihwdHIsIHNpemUpOworICAgIH0KK30KKwordm9pZCBmZl9tanBlZ19pbml0X2h2c2FtcGxlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGhzYW1wbGVbM10sIGludCB2c2FtcGxlWzNdKQoreworICAgIGludCBjaHJvbWFfaF9zaGlmdCwgY2hyb21hX3Zfc2hpZnQ7CisKKyAgICBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmN0eC0+cGl4X2ZtdCwgJmNocm9tYV9oX3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaHJvbWFfdl9zaGlmdCk7CisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfTEpQRUcgJiYKKyAgICAgICAgKCAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfQkdSMAorICAgICAgICAgfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1JBCisgICAgICAgICB8fCBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjI0KSkgeworICAgICAgICB2c2FtcGxlWzBdID0gaHNhbXBsZVswXSA9CisgICAgICAgIHZzYW1wbGVbMV0gPSBoc2FtcGxlWzFdID0KKyAgICAgICAgdnNhbXBsZVsyXSA9IGhzYW1wbGVbMl0gPSAxOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQIHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWSjQ0NFApIHsKKyAgICAgICAgdnNhbXBsZVswXSA9IHZzYW1wbGVbMV0gPSB2c2FtcGxlWzJdID0gMjsKKyAgICAgICAgaHNhbXBsZVswXSA9IGhzYW1wbGVbMV0gPSBoc2FtcGxlWzJdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICB2c2FtcGxlWzBdID0gMjsKKyAgICAgICAgdnNhbXBsZVsxXSA9IDIgPj4gY2hyb21hX3Zfc2hpZnQ7CisgICAgICAgIHZzYW1wbGVbMl0gPSAyID4+IGNocm9tYV92X3NoaWZ0OworICAgICAgICBoc2FtcGxlWzBdID0gMjsKKyAgICAgICAgaHNhbXBsZVsxXSA9IDIgPj4gY2hyb21hX2hfc2hpZnQ7CisgICAgICAgIGhzYW1wbGVbMl0gPSAyID4+IGNocm9tYV9oX3NoaWZ0OworICAgIH0KK30KKwordm9pZCBmZl9tanBlZ19lbmNvZGVfcGljdHVyZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBQdXRCaXRDb250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYW5UYWJsZSAqaW50cmFfc2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbHVtYV9pbnRyYV9tYXRyaXhbNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2hyb21hX2ludHJhX21hdHJpeFs2NF0pCit7CisgICAgY29uc3QgaW50IGxvc3NsZXNzID0gYXZjdHgtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01KUEVHICYmIGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9BTVY7CisgICAgaW50IGhzYW1wbGVbM10sIHZzYW1wbGVbM107CisgICAgaW50IGk7CisgICAgaW50IGNocm9tYV9tYXRyaXggPSAhIW1lbWNtcChsdW1hX2ludHJhX21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocm9tYV9pbnRyYV9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobHVtYV9pbnRyYV9tYXRyaXhbMF0pKjY0KTsKKworICAgIGZmX21qcGVnX2luaXRfaHZzYW1wbGUoYXZjdHgsIGhzYW1wbGUsIHZzYW1wbGUpOworCisgICAgcHV0X21hcmtlcihwYiwgU09JKTsKKworICAgIC8vIGhhY2sgZm9yIEFNViBtanBlZyBmb3JtYXQKKyAgICBpZihhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1WKSBnb3RvIGVuZDsKKworICAgIGpwZWdfcHV0X2NvbW1lbnRzKGF2Y3R4LCBwYik7CisKKyAgICBqcGVnX3RhYmxlX2hlYWRlcihhdmN0eCwgcGIsIGludHJhX3NjYW50YWJsZSwgbHVtYV9pbnRyYV9tYXRyaXgsIGNocm9tYV9pbnRyYV9tYXRyaXgsIGhzYW1wbGUpOworCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01KUEVHOiAgcHV0X21hcmtlcihwYiwgU09GMCApOyBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0xKUEVHOiAgcHV0X21hcmtlcihwYiwgU09GMyApOyBicmVhazsKKyAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIHB1dF9iaXRzKHBiLCAxNiwgMTcpOworICAgIGlmIChsb3NzbGVzcyAmJiAoICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjAKKyAgICAgICAgICAgICAgICAgICAgfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1JBCisgICAgICAgICAgICAgICAgICAgIHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfQkdSMjQpKQorICAgICAgICBwdXRfYml0cyhwYiwgOCwgOSk7IC8qIDkgYml0cy9jb21wb25lbnQgUkNUICovCisgICAgZWxzZQorICAgICAgICBwdXRfYml0cyhwYiwgOCwgOCk7IC8qIDggYml0cy9jb21wb25lbnQgKi8KKyAgICBwdXRfYml0cyhwYiwgMTYsIGF2Y3R4LT5oZWlnaHQpOworICAgIHB1dF9iaXRzKHBiLCAxNiwgYXZjdHgtPndpZHRoKTsKKyAgICBwdXRfYml0cyhwYiwgOCwgMyk7IC8qIDMgY29tcG9uZW50cyAqLworCisgICAgLyogWSBjb21wb25lbnQgKi8KKyAgICBwdXRfYml0cyhwYiwgOCwgMSk7IC8qIGNvbXBvbmVudCBudW1iZXIgKi8KKyAgICBwdXRfYml0cyhwYiwgNCwgaHNhbXBsZVswXSk7IC8qIEggZmFjdG9yICovCisgICAgcHV0X2JpdHMocGIsIDQsIHZzYW1wbGVbMF0pOyAvKiBWIGZhY3RvciAqLworICAgIHB1dF9iaXRzKHBiLCA4LCAwKTsgLyogc2VsZWN0IG1hdHJpeCAqLworCisgICAgLyogQ2IgY29tcG9uZW50ICovCisgICAgcHV0X2JpdHMocGIsIDgsIDIpOyAvKiBjb21wb25lbnQgbnVtYmVyICovCisgICAgcHV0X2JpdHMocGIsIDQsIGhzYW1wbGVbMV0pOyAvKiBIIGZhY3RvciAqLworICAgIHB1dF9iaXRzKHBiLCA0LCB2c2FtcGxlWzFdKTsgLyogViBmYWN0b3IgKi8KKyAgICBwdXRfYml0cyhwYiwgOCwgbG9zc2xlc3MgPyAwIDogY2hyb21hX21hdHJpeCk7IC8qIHNlbGVjdCBtYXRyaXggKi8KKworICAgIC8qIENyIGNvbXBvbmVudCAqLworICAgIHB1dF9iaXRzKHBiLCA4LCAzKTsgLyogY29tcG9uZW50IG51bWJlciAqLworICAgIHB1dF9iaXRzKHBiLCA0LCBoc2FtcGxlWzJdKTsgLyogSCBmYWN0b3IgKi8KKyAgICBwdXRfYml0cyhwYiwgNCwgdnNhbXBsZVsyXSk7IC8qIFYgZmFjdG9yICovCisgICAgcHV0X2JpdHMocGIsIDgsIGxvc3NsZXNzID8gMCA6IGNocm9tYV9tYXRyaXgpOyAvKiBzZWxlY3QgbWF0cml4ICovCisKKyAgICAvKiBzY2FuIGhlYWRlciAqLworICAgIHB1dF9tYXJrZXIocGIsIFNPUyk7CisgICAgcHV0X2JpdHMocGIsIDE2LCAxMik7IC8qIGxlbmd0aCAqLworICAgIHB1dF9iaXRzKHBiLCA4LCAzKTsgLyogMyBjb21wb25lbnRzICovCisKKyAgICAvKiBZIGNvbXBvbmVudCAqLworICAgIHB1dF9iaXRzKHBiLCA4LCAxKTsgLyogaW5kZXggKi8KKyAgICBwdXRfYml0cyhwYiwgNCwgMCk7IC8qIERDIGh1ZmZtYW4gdGFibGUgaW5kZXggKi8KKyAgICBwdXRfYml0cyhwYiwgNCwgMCk7IC8qIEFDIGh1ZmZtYW4gdGFibGUgaW5kZXggKi8KKworICAgIC8qIENiIGNvbXBvbmVudCAqLworICAgIHB1dF9iaXRzKHBiLCA4LCAyKTsgLyogaW5kZXggKi8KKyAgICBwdXRfYml0cyhwYiwgNCwgMSk7IC8qIERDIGh1ZmZtYW4gdGFibGUgaW5kZXggKi8KKyAgICBwdXRfYml0cyhwYiwgNCwgbG9zc2xlc3MgPyAwIDogMSk7IC8qIEFDIGh1ZmZtYW4gdGFibGUgaW5kZXggKi8KKworICAgIC8qIENyIGNvbXBvbmVudCAqLworICAgIHB1dF9iaXRzKHBiLCA4LCAzKTsgLyogaW5kZXggKi8KKyAgICBwdXRfYml0cyhwYiwgNCwgMSk7IC8qIERDIGh1ZmZtYW4gdGFibGUgaW5kZXggKi8KKyAgICBwdXRfYml0cyhwYiwgNCwgbG9zc2xlc3MgPyAwIDogMSk7IC8qIEFDIGh1ZmZtYW4gdGFibGUgaW5kZXggKi8KKworICAgIHB1dF9iaXRzKHBiLCA4LCBsb3NzbGVzcyA/IGF2Y3R4LT5wcmVkaWN0aW9uX21ldGhvZCArIDEgOiAwKTsgLyogU3MgKG5vdCB1c2VkKSAqLworCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01KUEVHOiAgcHV0X2JpdHMocGIsIDgsIDYzKTsgYnJlYWs7IC8qIFNlIChub3QgdXNlZCkgKi8KKyAgICBjYXNlIEFWX0NPREVDX0lEX0xKUEVHOiAgcHV0X2JpdHMocGIsIDgsICAwKTsgYnJlYWs7IC8qIG5vdCB1c2VkICovCisgICAgZGVmYXVsdDogYXZfYXNzZXJ0MCgwKTsKKyAgICB9CisKKyAgICBwdXRfYml0cyhwYiwgOCwgMCk7IC8qIEFoL0FsIChub3QgdXNlZCkgKi8KKworZW5kOgorICAgIGlmICghbG9zc2xlc3MpIHsKKyAgICAgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgICAgICBhdl9hc3NlcnQwKGF2Y3R4LT5jb2RlYy0+cHJpdl9kYXRhX3NpemUgPT0gc2l6ZW9mKE1wZWdFbmNDb250ZXh0KSk7CisKKyAgICAgICAgcy0+ZXNjX3BvcyA9IHB1dF9iaXRzX2NvdW50KHBiKSA+PiAzOworICAgICAgICBmb3IoaT0xOyBpPHMtPnNsaWNlX2NvbnRleHRfY291bnQ7IGkrKykKKyAgICAgICAgICAgIHMtPnRocmVhZF9jb250ZXh0W2ldLT5lc2NfcG9zID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgZmZfbWpwZWdfZXNjYXBlX0ZGKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgc3RhcnQpCit7CisgICAgaW50IHNpemU7CisgICAgaW50IGksIGZmX2NvdW50OworICAgIHVpbnQ4X3QgKmJ1ZiA9IHBiLT5idWYgKyBzdGFydDsKKyAgICBpbnQgYWxpZ249ICgtKHNpemVfdCkoYnVmKSkmMzsKKyAgICBpbnQgcGFkID0gKC1wdXRfYml0c19jb3VudChwYikpJjc7CisKKyAgICBpZiAocGFkKQorICAgICAgICBwdXRfYml0cyhwYiwgcGFkLCAoMTw8cGFkKS0xKTsKKworICAgIGZsdXNoX3B1dF9iaXRzKHBiKTsKKyAgICBzaXplID0gcHV0X2JpdHNfY291bnQocGIpIC0gc3RhcnQgKiA4OworCisgICAgYXZfYXNzZXJ0MSgoc2l6ZSY3KSA9PSAwKTsKKyAgICBzaXplID4+PSAzOworCisgICAgZmZfY291bnQ9MDsKKyAgICBmb3IoaT0wOyBpPHNpemUgJiYgaTxhbGlnbjsgaSsrKXsKKyAgICAgICAgaWYoYnVmW2ldPT0weEZGKSBmZl9jb3VudCsrOworICAgIH0KKyAgICBmb3IoOyBpPHNpemUtMTU7IGkrPTE2KXsKKyAgICAgICAgaW50IGFjYywgdjsKKworICAgICAgICB2PSAqKHVpbnQzMl90KikoJmJ1ZltpXSk7CisgICAgICAgIGFjYz0gKCgodiAmICh2Pj40KSkmMHgwRjBGMEYwRikrMHgwMTAxMDEwMSkmMHgxMDEwMTAxMDsKKyAgICAgICAgdj0gKih1aW50MzJfdCopKCZidWZbaSs0XSk7CisgICAgICAgIGFjYys9KCgodiAmICh2Pj40KSkmMHgwRjBGMEYwRikrMHgwMTAxMDEwMSkmMHgxMDEwMTAxMDsKKyAgICAgICAgdj0gKih1aW50MzJfdCopKCZidWZbaSs4XSk7CisgICAgICAgIGFjYys9KCgodiAmICh2Pj40KSkmMHgwRjBGMEYwRikrMHgwMTAxMDEwMSkmMHgxMDEwMTAxMDsKKyAgICAgICAgdj0gKih1aW50MzJfdCopKCZidWZbaSsxMl0pOworICAgICAgICBhY2MrPSgoKHYgJiAodj4+NCkpJjB4MEYwRjBGMEYpKzB4MDEwMTAxMDEpJjB4MTAxMDEwMTA7CisKKyAgICAgICAgYWNjPj49NDsKKyAgICAgICAgYWNjKz0gKGFjYz4+MTYpOworICAgICAgICBhY2MrPSAoYWNjPj44KTsKKyAgICAgICAgZmZfY291bnQrPSBhY2MmMHhGRjsKKyAgICB9CisgICAgZm9yKDsgaTxzaXplOyBpKyspeworICAgICAgICBpZihidWZbaV09PTB4RkYpIGZmX2NvdW50Kys7CisgICAgfQorCisgICAgaWYoZmZfY291bnQ9PTApIHJldHVybjsKKworICAgIGZsdXNoX3B1dF9iaXRzKHBiKTsKKyAgICBza2lwX3B1dF9ieXRlcyhwYiwgZmZfY291bnQpOworCisgICAgZm9yKGk9c2l6ZS0xOyBmZl9jb3VudDsgaS0tKXsKKyAgICAgICAgaW50IHY9IGJ1ZltpXTsKKworICAgICAgICBpZih2PT0weEZGKXsKKyAgICAgICAgICAgIGJ1ZltpK2ZmX2NvdW50XT0gMDsKKyAgICAgICAgICAgIGZmX2NvdW50LS07CisgICAgICAgIH0KKworICAgICAgICBidWZbaStmZl9jb3VudF09IHY7CisgICAgfQorfQorCit2b2lkIGZmX21qcGVnX2VuY29kZV9zdHVmZmluZyhNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBQdXRCaXRDb250ZXh0ICpwYmMgPSAmcy0+cGI7CisgICAgaW50IG1iX3kgPSBzLT5tYl95IC0gIXMtPm1iX3g7CisKKyAgICBmZl9tanBlZ19lc2NhcGVfRkYocGJjLCBzLT5lc2NfcG9zKTsKKworICAgIGlmKChzLT5hdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKSAmJiBtYl95IDwgcy0+bWJfaGVpZ2h0KQorICAgICAgICBwdXRfbWFya2VyKHBiYywgUlNUMCArIChtYl95JjcpKTsKKyAgICBzLT5lc2NfcG9zID0gcHV0X2JpdHNfY291bnQocGJjKSA+PiAzOworCisgICAgZm9yKGk9MDsgaTwzOyBpKyspCisgICAgICAgIHMtPmxhc3RfZGNbaV0gPSAxMjggPDwgcy0+aW50cmFfZGNfcHJlY2lzaW9uOworfQorCit2b2lkIGZmX21qcGVnX2VuY29kZV9waWN0dXJlX3RyYWlsZXIoUHV0Qml0Q29udGV4dCAqcGIsIGludCBoZWFkZXJfYml0cykKK3sKKyAgICBhdl9hc3NlcnQxKChoZWFkZXJfYml0cyAmIDcpID09IDApOworCisgICAgcHV0X21hcmtlcihwYiwgRU9JKTsKK30KKwordm9pZCBmZl9tanBlZ19lbmNvZGVfZGMoUHV0Qml0Q29udGV4dCAqcGIsIGludCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpodWZmX3NpemUsIHVpbnQxNl90ICpodWZmX2NvZGUpCit7CisgICAgaW50IG1hbnQsIG5iaXRzOworCisgICAgaWYgKHZhbCA9PSAwKSB7CisgICAgICAgIHB1dF9iaXRzKHBiLCBodWZmX3NpemVbMF0sIGh1ZmZfY29kZVswXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWFudCA9IHZhbDsKKyAgICAgICAgaWYgKHZhbCA8IDApIHsKKyAgICAgICAgICAgIHZhbCA9IC12YWw7CisgICAgICAgICAgICBtYW50LS07CisgICAgICAgIH0KKworICAgICAgICBuYml0cz0gYXZfbG9nMl8xNmJpdCh2YWwpICsgMTsKKworICAgICAgICBwdXRfYml0cyhwYiwgaHVmZl9zaXplW25iaXRzXSwgaHVmZl9jb2RlW25iaXRzXSk7CisKKyAgICAgICAgcHV0X3NiaXRzKHBiLCBuYml0cywgbWFudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWdlbmNfY29tbW9uLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tanBlZ2VuY19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGI5YjNmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWpwZWdlbmNfY29tbW9uLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIGxvc3NsZXNzIEpQRUcgc2hhcmVkIGJpdHMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01KUEVHRU5DX0NPTU1PTl9ICisjZGVmaW5lIEFWQ09ERUNfTUpQRUdFTkNfQ09NTU9OX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCit2b2lkIGZmX21qcGVnX2VuY29kZV9waWN0dXJlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFB1dEJpdENvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhblRhYmxlICppbnRyYV9zY2FudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsdW1hX2ludHJhX21hdHJpeFs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjaHJvbWFfaW50cmFfbWF0cml4WzY0XSk7Cit2b2lkIGZmX21qcGVnX2VuY29kZV9waWN0dXJlX3RyYWlsZXIoUHV0Qml0Q29udGV4dCAqcGIsIGludCBoZWFkZXJfYml0cyk7Cit2b2lkIGZmX21qcGVnX2VzY2FwZV9GRihQdXRCaXRDb250ZXh0ICpwYiwgaW50IHN0YXJ0KTsKK3ZvaWQgZmZfbWpwZWdfZW5jb2RlX3N0dWZmaW5nKE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbWpwZWdfaW5pdF9odnNhbXBsZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBoc2FtcGxlWzNdLCBpbnQgdnNhbXBsZVszXSk7CisKK3ZvaWQgZmZfbWpwZWdfZW5jb2RlX2RjKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaHVmZl9zaXplLCB1aW50MTZfdCAqaHVmZl9jb2RlKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTUpQRUdFTkNfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21scC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWxwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmN2M3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21scC5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogTUxQIGNvZGVjIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBJYW4gQ2F1bGZpZWxkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibWxwLmgiCisKK2NvbnN0IHVpbnQ4X3QgZmZfbWxwX2h1ZmZtYW5fdGFibGVzWzNdWzE4XVsyXSA9IHsKKyAgICB7ICAgIC8qIEh1ZmZtYW4gdGFibGUgMCwgLTcgLSArMTAgKi8KKyAgICAgICAgezB4MDEsIDl9LCB7MHgwMSwgOH0sIHsweDAxLCA3fSwgezB4MDEsIDZ9LCB7MHgwMSwgNX0sIHsweDAxLCA0fSwgezB4MDEsIDN9LAorICAgICAgICB7MHgwNCwgM30sIHsweDA1LCAzfSwgezB4MDYsIDN9LCB7MHgwNywgM30sCisgICAgICAgIHsweDAzLCAzfSwgezB4MDUsIDR9LCB7MHgwOSwgNX0sIHsweDExLCA2fSwgezB4MjEsIDd9LCB7MHg0MSwgOH0sIHsweDgxLCA5fSwKKyAgICB9LCB7IC8qIEh1ZmZtYW4gdGFibGUgMSwgLTcgLSArOCAqLworICAgICAgICB7MHgwMSwgOX0sIHsweDAxLCA4fSwgezB4MDEsIDd9LCB7MHgwMSwgNn0sIHsweDAxLCA1fSwgezB4MDEsIDR9LCB7MHgwMSwgM30sCisgICAgICAgIHsweDAyLCAyfSwgezB4MDMsIDJ9LAorICAgICAgICB7MHgwMywgM30sIHsweDA1LCA0fSwgezB4MDksIDV9LCB7MHgxMSwgNn0sIHsweDIxLCA3fSwgezB4NDEsIDh9LCB7MHg4MSwgOX0sCisgICAgfSwgeyAvKiBIdWZmbWFuIHRhYmxlIDIsIC03IC0gKzcgKi8KKyAgICAgICAgezB4MDEsIDl9LCB7MHgwMSwgOH0sIHsweDAxLCA3fSwgezB4MDEsIDZ9LCB7MHgwMSwgNX0sIHsweDAxLCA0fSwgezB4MDEsIDN9LAorICAgICAgICB7MHgwMSwgMX0sCisgICAgICAgIHsweDAzLCAzfSwgezB4MDUsIDR9LCB7MHgwOSwgNX0sIHsweDExLCA2fSwgezB4MjEsIDd9LCB7MHg0MSwgOH0sIHsweDgxLCA5fSwKKyAgICB9Cit9OworCitzdGF0aWMgaW50IGNyY19pbml0ID0gMDsKKyNpZiBDT05GSUdfU01BTEwKKyNkZWZpbmUgQ1JDX1RBQkxFX1NJWkUgMjU3CisjZWxzZQorI2RlZmluZSBDUkNfVEFCTEVfU0laRSAxMDI0CisjZW5kaWYKK3N0YXRpYyBBVkNSQyBjcmNfNjNbQ1JDX1RBQkxFX1NJWkVdOworc3RhdGljIEFWQ1JDIGNyY18xRFtDUkNfVEFCTEVfU0laRV07CitzdGF0aWMgQVZDUkMgY3JjXzJEW0NSQ19UQUJMRV9TSVpFXTsKKworYXZfY29sZCB2b2lkIGZmX21scF9pbml0X2NyYyh2b2lkKQoreworICAgIGlmICghY3JjX2luaXQpIHsKKyAgICAgICAgYXZfY3JjX2luaXQoY3JjXzYzLCAwLCAgOCwgICAweDYzLCBzaXplb2YoY3JjXzYzKSk7CisgICAgICAgIGF2X2NyY19pbml0KGNyY18xRCwgMCwgIDgsICAgMHgxRCwgc2l6ZW9mKGNyY18xRCkpOworICAgICAgICBhdl9jcmNfaW5pdChjcmNfMkQsIDAsIDE2LCAweDAwMkQsIHNpemVvZihjcmNfMkQpKTsKKyAgICAgICAgY3JjX2luaXQgPSAxOworICAgIH0KK30KKwordWludDE2X3QgZmZfbWxwX2NoZWNrc3VtMTYoY29uc3QgdWludDhfdCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmX3NpemUpCit7CisgICAgdWludDE2X3QgY3JjOworCisgICAgY3JjID0gYXZfY3JjKGNyY18yRCwgMCwgYnVmLCBidWZfc2l6ZSAtIDIpOworICAgIGNyYyBePSBBVl9STDE2KGJ1ZiArIGJ1Zl9zaXplIC0gMik7CisgICAgcmV0dXJuIGNyYzsKK30KKwordWludDhfdCBmZl9tbHBfY2hlY2tzdW04KGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1Zl9zaXplKQoreworICAgIHVpbnQ4X3QgY2hlY2tzdW0gPSBhdl9jcmMoY3JjXzYzLCAweDNjLCBidWYsIGJ1Zl9zaXplIC0gMSk7IC8vIGNyY182M1sweGEyXSA9PSAweDNjCisgICAgY2hlY2tzdW0gXj0gYnVmW2J1Zl9zaXplLTFdOworICAgIHJldHVybiBjaGVja3N1bTsKK30KKwordWludDhfdCBmZl9tbHBfcmVzdGFydF9jaGVja3N1bShjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGludCBiaXRfc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbnVtX2J5dGVzID0gKGJpdF9zaXplICsgMikgLyA4OworCisgICAgaW50IGNyYyA9IGNyY18xRFtidWZbMF0gJiAweDNmXTsKKyAgICBjcmMgPSBhdl9jcmMoY3JjXzFELCBjcmMsIGJ1ZiArIDEsIG51bV9ieXRlcyAtIDIpOworICAgIGNyYyBePSBidWZbbnVtX2J5dGVzIC0gMV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKChiaXRfc2l6ZSArIDIpICYgNyk7IGkrKykgeworICAgICAgICBjcmMgPDw9IDE7CisgICAgICAgIGlmIChjcmMgJiAweDEwMCkKKyAgICAgICAgICAgIGNyYyBePSAweDExRDsKKyAgICAgICAgY3JjIF49IChidWZbbnVtX2J5dGVzXSA+PiAoNyAtIGkpKSAmIDE7CisgICAgfQorCisgICAgcmV0dXJuIGNyYzsKK30KKwordWludDhfdCBmZl9tbHBfY2FsY3VsYXRlX3Bhcml0eShjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGludCBidWZfc2l6ZSkKK3sKKyAgICB1aW50MzJfdCBzY3JhdGNoID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisKKyAgICBmb3IgKDsgKChpbnRwdHJfdCkgYnVmICYgMykgJiYgYnVmIDwgYnVmX2VuZDsgYnVmKyspCisgICAgICAgIHNjcmF0Y2ggXj0gKmJ1ZjsKKyAgICBmb3IgKDsgYnVmIDwgYnVmX2VuZCAtIDM7IGJ1ZiArPSA0KQorICAgICAgICBzY3JhdGNoIF49ICooKGNvbnN0IHVpbnQzMl90KilidWYpOworCisgICAgc2NyYXRjaCA9IHhvcl8zMl90b184KHNjcmF0Y2gpOworCisgICAgZm9yICg7IGJ1ZiA8IGJ1Zl9lbmQ7IGJ1ZisrKQorICAgICAgICBzY3JhdGNoIF49ICpidWY7CisKKyAgICByZXR1cm4gc2NyYXRjaDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21scC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkOGRiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21scC5oCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogTUxQIGNvZGVjIGNvbW1vbiBoZWFkZXIgZmlsZQorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSWFuIENhdWxmaWVsZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTUxQX0gKKyNkZWZpbmUgQVZDT0RFQ19NTFBfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKKy8qKiBMYXN0IHBvc3NpYmxlIG1hdHJpeCBjaGFubmVsIGZvciBlYWNoIGNvZGVjICovCisjZGVmaW5lIE1BWF9NQVRSSVhfQ0hBTk5FTF9NTFAgICAgICA1CisjZGVmaW5lIE1BWF9NQVRSSVhfQ0hBTk5FTF9UUlVFSEQgICA3CisvKiogTWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gYSB2YWxpZCBzdHJlYW0uCisgKiAgTUxQICAgOiA1LjEgKyAyIG5vaXNlIGNoYW5uZWxzIC0+IDggY2hhbm5lbHMKKyAqICBUcnVlSEQ6IDcuMSAgICAgICAgICAgICAgICAgICAgLT4gOCBjaGFubmVscworICovCisjZGVmaW5lIE1BWF9DSEFOTkVMUyAgICAgICAgICAgICAgICA4CisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBtYXRyaWNlcyB1c2VkIGluIGRlY29kaW5nOyBtb3N0IHN0cmVhbXMgaGF2ZSBvbmUgbWF0cml4CisgKiAgcGVyIG91dHB1dCBjaGFubmVsLCBidXQgc29tZSByZW1hdHJpeCBhIGNoYW5uZWwgKHVzdWFsbHkgMCkgbW9yZSB0aGFuIG9uY2UuCisgKi8KKyNkZWZpbmUgTUFYX01BVFJJQ0VTX01MUCAgICAgICAgICAgIDYKKyNkZWZpbmUgTUFYX01BVFJJQ0VTX1RSVUVIRCAgICAgICAgIDgKKyNkZWZpbmUgTUFYX01BVFJJQ0VTICAgICAgICAgICAgICAgIDgKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIHN1YnN0cmVhbXMgdGhhdCBjYW4gYmUgZGVjb2RlZC4KKyAqICBNTFAncyBsaW1pdCBpcyAyLiBUcnVlSEQgc3VwcG9ydHMgYXQgbGVhc3QgdXAgdG8gMy4KKyAqLworI2RlZmluZSBNQVhfU1VCU1RSRUFNUyAgICAgIDQKKworLyoqIHdoaWNoIG11bHRpcGxlIG9mIDQ4MDAwIHRoZSBtYXhpbXVtIHNhbXBsZSByYXRlIGlzICovCisjZGVmaW5lIE1BWF9SQVRFRkFDVE9SICAgICAgNAorLyoqIG1heGltdW0gc2FtcGxlIGZyZXF1ZW5jeSBzZWVuIGluIGZpbGVzICovCisjZGVmaW5lIE1BWF9TQU1QTEVSQVRFICAgICAgKE1BWF9SQVRFRkFDVE9SICogNDgwMDApCisKKy8qKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBzYW1wbGVzIHdpdGhpbiBvbmUgYWNjZXNzIHVuaXQgKi8KKyNkZWZpbmUgTUFYX0JMT0NLU0laRSAgICAgICAoNDAgKiBNQVhfUkFURUZBQ1RPUikKKy8qKiBuZXh0IHBvd2VyIG9mIHR3byBncmVhdGVyIHRoYW4gTUFYX0JMT0NLU0laRSAqLworI2RlZmluZSBNQVhfQkxPQ0tTSVpFX1BPVzIgICg2NCAqIE1BWF9SQVRFRkFDVE9SKQorCisvKiogbnVtYmVyIG9mIGFsbG93ZWQgZmlsdGVycyAqLworI2RlZmluZSBOVU1fRklMVEVSUyAgICAgICAgIDIKKworLyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0YXBzIGluIElJUiBhbmQgRklSIGZpbHRlcnMuICovCisjZGVmaW5lIE1BWF9GSVJfT1JERVIgICAgICAgOAorI2RlZmluZSBNQVhfSUlSX09SREVSICAgICAgIDQKKworLyoqIENvZGUgdGhhdCBzaWduYWxzIGVuZCBvZiBhIHN0cmVhbS4gKi8KKyNkZWZpbmUgRU5EX09GX1NUUkVBTSAgICAgICAweGQyMzRkMjM0CisKKyNkZWZpbmUgRklSIDAKKyNkZWZpbmUgSUlSIDEKKworLyoqIGZpbHRlciBkYXRhICovCit0eXBlZGVmIHN0cnVjdCBGaWx0ZXJQYXJhbXMgeworICAgIHVpbnQ4X3QgICAgIG9yZGVyOyAvLy88IG51bWJlciBvZiB0YXBzIGluIGZpbHRlcgorICAgIHVpbnQ4X3QgICAgIHNoaWZ0OyAvLy88IFJpZ2h0IHNoaWZ0IHRvIGFwcGx5IHRvIG91dHB1dCBvZiBmaWx0ZXIuCisKKyAgICBpbnQzMl90ICAgICBzdGF0ZVtNQVhfRklSX09SREVSXTsKK30gRmlsdGVyUGFyYW1zOworCisvKiogc2FtcGxlIGRhdGEgY29kaW5nIGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdCBDaGFubmVsUGFyYW1zIHsKKyAgICBGaWx0ZXJQYXJhbXMgZmlsdGVyX3BhcmFtc1tOVU1fRklMVEVSU107CisgICAgaW50MzJfdCAgICAgY29lZmZbTlVNX0ZJTFRFUlNdW01BWF9GSVJfT1JERVJdOworCisgICAgaW50MTZfdCAgICAgaHVmZl9vZmZzZXQ7ICAgICAgLy8vPCBPZmZzZXQgdG8gYXBwbHkgdG8gcmVzaWR1YWwgdmFsdWVzLgorICAgIGludDMyX3QgICAgIHNpZ25faHVmZl9vZmZzZXQ7IC8vLzwgc2lnbi9yb3VuZGluZy1jb3JyZWN0ZWQgdmVyc2lvbiBvZiBodWZmX29mZnNldAorICAgIHVpbnQ4X3QgICAgIGNvZGVib29rOyAgICAgICAgIC8vLzwgV2hpY2ggVkxDIGNvZGVib29rIHRvIHVzZSB0byByZWFkIHJlc2lkdWFscy4KKyAgICB1aW50OF90ICAgICBodWZmX2xzYnM7ICAgICAgICAvLy88IFNpemUgb2YgcmVzaWR1YWwgc3VmZml4IG5vdCBlbmNvZGVkIHVzaW5nIFZMQy4KK30gQ2hhbm5lbFBhcmFtczsKKworLyoqIFRhYmxlcyBkZWZpbmluZyB0aGUgSHVmZm1hbiBjb2Rlcy4KKyAqICBUaGVyZSBhcmUgdGhyZWUgZW50cm9weSBjb2RpbmcgbWV0aG9kcyB1c2VkIGluIE1MUCAoZm91ciBpZiB5b3UgY291bnQKKyAqICAibm9uZSIgYXMgYSBtZXRob2QpLiBUaGVzZSB1c2UgdGhlIHNhbWUgc2VxdWVuY2VzIGZvciBjb2RlcyBzdGFydGluZyB3aXRoCisgKiAgMDAgb3IgMDEsIGJ1dCBoYXZlIGRpZmZlcmVudCBjb2RlcyBzdGFydGluZyB3aXRoIDEuCisgKi8KK2V4dGVybiBjb25zdCB1aW50OF90IGZmX21scF9odWZmbWFuX3RhYmxlc1szXVsxOF1bMl07CisKKy8qKiBNTFAgdXNlcyBjaGVja3N1bXMgdGhhdCBzZWVtIHRvIGJlIGJhc2VkIG9uIHRoZSBzdGFuZGFyZCBDUkMgYWxnb3JpdGhtLCBidXQKKyAqICBhcmUgbm90IChpbiBpbXBsZW1lbnRhdGlvbiB0ZXJtcywgdGhlIHRhYmxlIGxvb2t1cCBhbmQgWE9SIGFyZSByZXZlcnNlZCkuCisgKiAgV2UgY2FuIGltcGxlbWVudCB0aGlzIGJlaGF2aW9yIHVzaW5nIGEgc3RhbmRhcmQgYXZfY3JjIG9uIGFsbCBidXQgdGhlCisgKiAgbGFzdCBlbGVtZW50LCB0aGVuIFhPUiB0aGF0IHdpdGggdGhlIGxhc3QgZWxlbWVudC4KKyAqLwordWludDhfdCAgZmZfbWxwX2NoZWNrc3VtOCAoY29uc3QgdWludDhfdCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmX3NpemUpOwordWludDE2X3QgZmZfbWxwX2NoZWNrc3VtMTYoY29uc3QgdWludDhfdCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmX3NpemUpOworCisvKiogQ2FsY3VsYXRlIGFuIDgtYml0IGNoZWNrc3VtIG92ZXIgYSByZXN0YXJ0IGhlYWRlciAtLSBhIG5vbi1tdWx0aXBsZS1vZi04CisgKiAgbnVtYmVyIG9mIGJpdHMsIHN0YXJ0aW5nIHR3byBiaXRzIGludG8gdGhlIGZpcnN0IGJ5dGUgb2YgYnVmLgorICovCit1aW50OF90IGZmX21scF9yZXN0YXJ0X2NoZWNrc3VtKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgaW50IGJpdF9zaXplKTsKKworLyoqIFhPUiB0b2dldGhlciBhbGwgdGhlIGJ5dGVzIG9mIGEgYnVmZmVyLgorICogIERvZXMgdGhpcyBiZWxvbmcgaW4gZHNwY29udGV4dD8KKyAqLwordWludDhfdCBmZl9tbHBfY2FsY3VsYXRlX3Bhcml0eShjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGludCBidWZfc2l6ZSk7CisKK3ZvaWQgZmZfbWxwX2luaXRfY3JjKHZvaWQpOworCisvKiogWE9SIGZvdXIgYnl0ZXMgaW50byBvbmUuICovCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgeG9yXzMyX3RvXzgodWludDMyX3QgdmFsdWUpCit7CisgICAgdmFsdWUgXj0gdmFsdWUgPj4gMTY7CisgICAgdmFsdWUgXj0gdmFsdWUgPj4gIDg7CisgICAgcmV0dXJuIHZhbHVlOworfQorCit0eXBlZGVmIGVudW0gVEhEQ2hhbm5lbE1vZGlmaWVyIHsKKyAgICBUSERfQ0hfTU9ESUZJRVJfTk9USU5ESUNBVEVEICA9IDB4MCwKKyAgICBUSERfQ0hfTU9ESUZJRVJfU1RFUkVPICAgICAgICA9IDB4MCwgLy8gU3RlcmVvIChub3QgRG9sYnkgU3Vycm91bmQpCisgICAgVEhEX0NIX01PRElGSUVSX0xUUlQgICAgICAgICAgPSAweDEsIC8vIERvbGJ5IFN1cnJvdW5kCisgICAgVEhEX0NIX01PRElGSUVSX0xCSU5SQklOICAgICAgPSAweDIsIC8vIERvbGJ5IEhlYWRwaG9uZQorICAgIFRIRF9DSF9NT0RJRklFUl9NT05PICAgICAgICAgID0gMHgzLCAvLyBNb25vIG9yIER1YWwgTW9ubworICAgIFRIRF9DSF9NT0RJRklFUl9OT1RTVVJST1VOREVYID0gMHgxLCAvLyBOb3QgRG9sYnkgRGlnaXRhbCBFWAorICAgIFRIRF9DSF9NT0RJRklFUl9TVVJST1VOREVYICAgID0gMHgyLCAvLyBEb2xieSBEaWdpdGFsIEVYCit9IFRIRENoYW5uZWxNb2RpZmllcjsKKworI2VuZGlmIC8qIEFWQ09ERUNfTUxQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21scF9wYXJzZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21scF9wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWFhODQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWxwX3BhcnNlci5jCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogTUxQIHBhcnNlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IElhbiBDYXVsZmllbGQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTUxQIHBhcnNlcgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgIm1scF9wYXJzZXIuaCIKKyNpbmNsdWRlICJtbHAuaCIKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbWxwX3F1YW50c1sxNl0gPSB7CisgICAgMTYsIDIwLCAyNCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbWxwX2NoYW5uZWxzWzMyXSA9IHsKKyAgICAxLCAyLCAzLCA0LCAzLCA0LCA1LCAzLCA0LCA1LCA0LCA1LCA2LCA0LCA1LCA0LAorICAgIDUsIDYsIDUsIDUsIDYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCit9OworCitjb25zdCB1aW50NjRfdCBmZl9tbHBfbGF5b3V0WzMyXSA9IHsKKyAgICBBVl9DSF9MQVlPVVRfTU9OTywKKyAgICBBVl9DSF9MQVlPVVRfU1RFUkVPLAorICAgIEFWX0NIX0xBWU9VVF8yXzEsCisgICAgQVZfQ0hfTEFZT1VUX1FVQUQsCisgICAgQVZfQ0hfTEFZT1VUX1NURVJFT3xBVl9DSF9MT1dfRlJFUVVFTkNZLAorICAgIEFWX0NIX0xBWU9VVF8yXzF8QVZfQ0hfTE9XX0ZSRVFVRU5DWSwKKyAgICBBVl9DSF9MQVlPVVRfUVVBRHxBVl9DSF9MT1dfRlJFUVVFTkNZLAorICAgIEFWX0NIX0xBWU9VVF9TVVJST1VORCwKKyAgICBBVl9DSF9MQVlPVVRfNFBPSU5UMCwKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLLAorICAgIEFWX0NIX0xBWU9VVF9TVVJST1VORHxBVl9DSF9MT1dfRlJFUVVFTkNZLAorICAgIEFWX0NIX0xBWU9VVF80UE9JTlQwfEFWX0NIX0xPV19GUkVRVUVOQ1ksCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSywKKyAgICBBVl9DSF9MQVlPVVRfNFBPSU5UMCwKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLLAorICAgIEFWX0NIX0xBWU9VVF9TVVJST1VORHxBVl9DSF9MT1dfRlJFUVVFTkNZLAorICAgIEFWX0NIX0xBWU9VVF80UE9JTlQwfEFWX0NIX0xPV19GUkVRVUVOQ1ksCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSywKKyAgICBBVl9DSF9MQVlPVVRfUVVBRHxBVl9DSF9MT1dfRlJFUVVFTkNZLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0ssCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSywKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0aGRfY2hhbmNvdW50WzEzXSA9IHsKKy8vICBMUiAgICBDICAgTEZFICBMUnMgTFJ2aCAgTFJjIExScnMgIENzICAgVHMgIExSc2QgIExSdyAgQ3ZoICBMRkUyCisgICAgIDIsICAgMSwgICAxLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMSwgICAxLCAgIDIsICAgMiwgICAxLCAgIDEKK307CisKK3N0YXRpYyBjb25zdCB1aW50NjRfdCB0aGRfbGF5b3V0WzEzXSA9IHsKKyAgICBBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hULCAgICAgICAgICAgICAgICAgICAgIC8vIExSCisgICAgQVZfQ0hfRlJPTlRfQ0VOVEVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDCisgICAgQVZfQ0hfTE9XX0ZSRVFVRU5DWSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMRkUKKyAgICBBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgIC8vIExScworICAgIEFWX0NIX1RPUF9GUk9OVF9MRUZUfEFWX0NIX1RPUF9GUk9OVF9SSUdIVCwgICAgICAgICAgICAgLy8gTFJ2aAorICAgIEFWX0NIX0ZST05UX0xFRlRfT0ZfQ0VOVEVSfEFWX0NIX0ZST05UX1JJR0hUX09GX0NFTlRFUiwgLy8gTFJjCisgICAgQVZfQ0hfQkFDS19MRUZUfEFWX0NIX0JBQ0tfUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAvLyBMUnJzCisgICAgQVZfQ0hfQkFDS19DRU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcworICAgIEFWX0NIX1RPUF9DRU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHMKKyAgICBBVl9DSF9TVVJST1VORF9ESVJFQ1RfTEVGVHxBVl9DSF9TVVJST1VORF9ESVJFQ1RfUklHSFQsIC8vIExSc2QKKyAgICBBVl9DSF9XSURFX0xFRlR8QVZfQ0hfV0lERV9SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgIC8vIExSdworICAgIEFWX0NIX1RPUF9GUk9OVF9DRU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3ZoCisgICAgQVZfQ0hfTE9XX0ZSRVFVRU5DWV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMRkUyCit9OworCitzdGF0aWMgaW50IG1scF9zYW1wbGVyYXRlKGludCBpbikKK3sKKyAgICBpZiAoaW4gPT0gMHhGKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAoaW4gJiA4ID8gNDQxMDAgOiA0ODAwMCkgPDwgKGluICYgNykgOworfQorCitzdGF0aWMgaW50IHRydWVoZF9jaGFubmVscyhpbnQgY2hhbm1hcCkKK3sKKyAgICBpbnQgY2hhbm5lbHMgPSAwLCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEzOyBpKyspCisgICAgICAgIGNoYW5uZWxzICs9IHRoZF9jaGFuY291bnRbaV0gKiAoKGNoYW5tYXAgPj4gaSkgJiAxKTsKKworICAgIHJldHVybiBjaGFubmVsczsKK30KKwordWludDY0X3QgZmZfdHJ1ZWhkX2xheW91dChpbnQgY2hhbm1hcCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50NjRfdCBsYXlvdXQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDEzOyBpKyspCisgICAgICAgIGxheW91dCB8PSB0aGRfbGF5b3V0W2ldICogKChjaGFubWFwID4+IGkpICYgMSk7CisKKyAgICByZXR1cm4gbGF5b3V0OworfQorCitzdGF0aWMgaW50IGZmX21scF9nZXRfbWFqb3Jfc3luY19zaXplKGNvbnN0IHVpbnQ4X3QgKiBidWYsIGludCBidWZzaXplKQoreworICAgIGludCBoYXNfZXh0ZW5zaW9uLCBleHRlbnNpb25zID0gMDsKKyAgICBpbnQgc2l6ZSA9IDI4OworICAgIGlmIChidWZzaXplIDwgMjgpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChBVl9SQjMyKGJ1ZikgPT0gMHhmODcyNmZiYSkgeworICAgICAgICBoYXNfZXh0ZW5zaW9uID0gYnVmWzI1XSAmIDE7CisgICAgICAgIGlmIChoYXNfZXh0ZW5zaW9uKSB7CisgICAgICAgICAgICBleHRlbnNpb25zID0gYnVmWzI2XSA+PiA0OworICAgICAgICAgICAgc2l6ZSArPSAyICsgZXh0ZW5zaW9ucyAqIDI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qKiBSZWFkIGEgbWFqb3Igc3luYyBpbmZvIGhlYWRlciAtIGNvbnRhaW5zIGhpZ2ggbGV2ZWwgaW5mb3JtYXRpb24gYWJvdXQKKyAqICB0aGUgc3RyZWFtIC0gc2FtcGxlIHJhdGUsIGNoYW5uZWwgYXJyYW5nZW1lbnQgZXRjLiBNb3N0IG9mIHRoaXMKKyAqICBpbmZvcm1hdGlvbiBpcyBub3QgYWN0dWFsbHkgbmVjZXNzYXJ5IGZvciBkZWNvZGluZywgb25seSBmb3IgcGxheWJhY2suCisgKiAgZ2IgbXVzdCBiZSBhIGZyZXNobHkgaW5pdGlhbGl6ZWQgR2V0Qml0Q29udGV4dCB3aXRoIG5vIGJpdHMgcmVhZC4KKyAqLworCitpbnQgZmZfbWxwX3JlYWRfbWFqb3Jfc3luYyh2b2lkICpsb2csIE1MUEhlYWRlckluZm8gKm1oLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgcmF0ZWJpdHMsIGNoYW5uZWxfYXJyYW5nZW1lbnQsIGhlYWRlcl9zaXplOworICAgIHVpbnQxNl90IGNoZWNrc3VtOworCisgICAgYXZfYXNzZXJ0MShnZXRfYml0c19jb3VudChnYikgPT0gMCk7CisKKyAgICBoZWFkZXJfc2l6ZSA9IGZmX21scF9nZXRfbWFqb3Jfc3luY19zaXplKGdiLT5idWZmZXIsIGdiLT5zaXplX2luX2JpdHMgPj4gMyk7CisgICAgaWYgKGhlYWRlcl9zaXplIDwgMCB8fCBnYi0+c2l6ZV9pbl9iaXRzIDwgaGVhZGVyX3NpemUgPDwgMykgeworICAgICAgICBhdl9sb2cobG9nLCBBVl9MT0dfRVJST1IsICJwYWNrZXQgdG9vIHNob3J0LCB1bmFibGUgdG8gcmVhZCBtYWpvciBzeW5jXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGNoZWNrc3VtID0gZmZfbWxwX2NoZWNrc3VtMTYoZ2ItPmJ1ZmZlciwgaGVhZGVyX3NpemUgLSAyKTsKKyAgICBpZiAoY2hlY2tzdW0gIT0gQVZfUkwxNihnYi0+YnVmZmVyK2hlYWRlcl9zaXplLTIpKSB7CisgICAgICAgIGF2X2xvZyhsb2csIEFWX0xPR19FUlJPUiwgIm1ham9yIHN5bmMgaW5mbyBoZWFkZXIgY2hlY2tzdW0gZXJyb3JcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHNfbG9uZyhnYiwgMjQpICE9IDB4Zjg3MjZmKSAvKiBTeW5jIHdvcmRzICovCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgbWgtPnN0cmVhbV90eXBlID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgIG1oLT5oZWFkZXJfc2l6ZSA9IGhlYWRlcl9zaXplOworCisgICAgaWYgKG1oLT5zdHJlYW1fdHlwZSA9PSAweGJiKSB7CisgICAgICAgIG1oLT5ncm91cDFfYml0cyA9IG1scF9xdWFudHNbZ2V0X2JpdHMoZ2IsIDQpXTsKKyAgICAgICAgbWgtPmdyb3VwMl9iaXRzID0gbWxwX3F1YW50c1tnZXRfYml0cyhnYiwgNCldOworCisgICAgICAgIHJhdGViaXRzID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBtaC0+Z3JvdXAxX3NhbXBsZXJhdGUgPSBtbHBfc2FtcGxlcmF0ZShyYXRlYml0cyk7CisgICAgICAgIG1oLT5ncm91cDJfc2FtcGxlcmF0ZSA9IG1scF9zYW1wbGVyYXRlKGdldF9iaXRzKGdiLCA0KSk7CisKKyAgICAgICAgc2tpcF9iaXRzKGdiLCAxMSk7CisKKyAgICAgICAgbWgtPmNoYW5uZWxfYXJyYW5nZW1lbnQ9CisgICAgICAgIGNoYW5uZWxfYXJyYW5nZW1lbnQgICAgPSBnZXRfYml0cyhnYiwgNSk7CisgICAgICAgIG1oLT5jaGFubmVsc19tbHAgICAgICAgPSBtbHBfY2hhbm5lbHNbY2hhbm5lbF9hcnJhbmdlbWVudF07CisgICAgICAgIG1oLT5jaGFubmVsX2xheW91dF9tbHAgPSBmZl9tbHBfbGF5b3V0W2NoYW5uZWxfYXJyYW5nZW1lbnRdOworICAgIH0gZWxzZSBpZiAobWgtPnN0cmVhbV90eXBlID09IDB4YmEpIHsKKyAgICAgICAgbWgtPmdyb3VwMV9iaXRzID0gMjQ7IC8vIFRPRE86IElzIHRoaXMgaW5mb3JtYXRpb24gYWN0dWFsbHkgY29udmV5ZWQgYW55d2hlcmU/CisgICAgICAgIG1oLT5ncm91cDJfYml0cyA9IDA7CisKKyAgICAgICAgcmF0ZWJpdHMgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgIG1oLT5ncm91cDFfc2FtcGxlcmF0ZSA9IG1scF9zYW1wbGVyYXRlKHJhdGViaXRzKTsKKyAgICAgICAgbWgtPmdyb3VwMl9zYW1wbGVyYXRlID0gMDsKKworICAgICAgICBza2lwX2JpdHMoZ2IsIDQpOworCisgICAgICAgIG1oLT5jaGFubmVsX21vZGlmaWVyX3RoZF9zdHJlYW0wID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICBtaC0+Y2hhbm5lbF9tb2RpZmllcl90aGRfc3RyZWFtMSA9IGdldF9iaXRzKGdiLCAyKTsKKworICAgICAgICBtaC0+Y2hhbm5lbF9hcnJhbmdlbWVudD0KKyAgICAgICAgY2hhbm5lbF9hcnJhbmdlbWVudCAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgICAgICBtaC0+Y2hhbm5lbHNfdGhkX3N0cmVhbTEgICAgICAgPSB0cnVlaGRfY2hhbm5lbHMoY2hhbm5lbF9hcnJhbmdlbWVudCk7CisgICAgICAgIG1oLT5jaGFubmVsX2xheW91dF90aGRfc3RyZWFtMSA9IGZmX3RydWVoZF9sYXlvdXQoY2hhbm5lbF9hcnJhbmdlbWVudCk7CisKKyAgICAgICAgbWgtPmNoYW5uZWxfbW9kaWZpZXJfdGhkX3N0cmVhbTIgPSBnZXRfYml0cyhnYiwgMik7CisKKyAgICAgICAgY2hhbm5lbF9hcnJhbmdlbWVudCAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDEzKTsKKyAgICAgICAgbWgtPmNoYW5uZWxzX3RoZF9zdHJlYW0yICAgICAgID0gdHJ1ZWhkX2NoYW5uZWxzKGNoYW5uZWxfYXJyYW5nZW1lbnQpOworICAgICAgICBtaC0+Y2hhbm5lbF9sYXlvdXRfdGhkX3N0cmVhbTIgPSBmZl90cnVlaGRfbGF5b3V0KGNoYW5uZWxfYXJyYW5nZW1lbnQpOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIG1oLT5hY2Nlc3NfdW5pdF9zaXplID0gNDAgPDwgKHJhdGViaXRzICYgNyk7CisgICAgbWgtPmFjY2Vzc191bml0X3NpemVfcG93MiA9IDY0IDw8IChyYXRlYml0cyAmIDcpOworCisgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDQ4KTsKKworICAgIG1oLT5pc192YnIgPSBnZXRfYml0czEoZ2IpOworCisgICAgbWgtPnBlYWtfYml0cmF0ZSA9IChnZXRfYml0cyhnYiwgMTUpICogbWgtPmdyb3VwMV9zYW1wbGVyYXRlICsgOCkgPj4gNDsKKworICAgIG1oLT5udW1fc3Vic3RyZWFtcyA9IGdldF9iaXRzKGdiLCA0KTsKKworICAgIHNraXBfYml0c19sb25nKGdiLCA0ICsgKGhlYWRlcl9zaXplIC0gMTcpICogOCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgTUxQUGFyc2VDb250ZXh0Cit7CisgICAgUGFyc2VDb250ZXh0IHBjOworCisgICAgaW50IGJ5dGVzX2xlZnQ7CisKKyAgICBpbnQgaW5fc3luYzsKKworICAgIGludCBudW1fc3Vic3RyZWFtczsKK30gTUxQUGFyc2VDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgbWxwX2luaXQoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMpCit7CisgICAgZmZfbWxwX2luaXRfY3JjKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWxwX3BhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgTUxQUGFyc2VDb250ZXh0ICptcCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgc3luY19wcmVzZW50OworICAgIHVpbnQ4X3QgcGFyaXR5X2JpdHM7CisgICAgaW50IG5leHQ7CisgICAgaW50IHJldDsKKyAgICBpbnQgaSwgcCA9IDA7CisKKyAgICAqcG91dGJ1Zl9zaXplID0gMDsKKyAgICBpZiAoYnVmX3NpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIW1wLT5pbl9zeW5jKSB7CisgICAgICAgIC8vIE5vdCBpbiBzeW5jIC0gZmluZCBhIG1ham9yIHN5bmMgaGVhZGVyCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIG1wLT5wYy5zdGF0ZSA9IChtcC0+cGMuc3RhdGUgPDwgOCkgfCBidWZbaV07CisgICAgICAgICAgICBpZiAoKG1wLT5wYy5zdGF0ZSAmIDB4ZmZmZmZmZmUpID09IDB4Zjg3MjZmYmEgJiYKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaWYgd2UgZG8gbm90IGhhdmUgdGhlIGRhdGEgZm9yIHRoZSBzdGFydCBvZiBoZWFkZXIKKyAgICAgICAgICAgICAgICBtcC0+cGMuaW5kZXggKyBpID49IDcpIHsKKyAgICAgICAgICAgICAgICBtcC0+aW5fc3luYyA9IDE7CisgICAgICAgICAgICAgICAgbXAtPmJ5dGVzX2xlZnQgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtcC0+aW5fc3luYykgeworICAgICAgICAgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUoJm1wLT5wYywgRU5EX05PVF9GT1VORCwgJmJ1ZiwgJmJ1Zl9zaXplKSAhPSAtMSkKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZmZfY29tYmluZV9mcmFtZSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9jb21iaW5lX2ZyYW1lKCZtcC0+cGMsIGkgLSA3LCAmYnVmLCAmYnVmX3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJmZl9jb21iaW5lX2ZyYW1lIGZhaWxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGkgLSA3OworICAgIH0KKworICAgIGlmIChtcC0+Ynl0ZXNfbGVmdCA9PSAwKSB7CisgICAgICAgIC8vIEZpbmQgbGVuZ3RoIG9mIHRoaXMgcGFja2V0CisKKyAgICAgICAgLyogQ29weSBvdmVycmVhZCBieXRlcyBmcm9tIGxhc3QgZnJhbWUgaW50byBidWZmZXIuICovCisgICAgICAgIGZvcig7IG1wLT5wYy5vdmVycmVhZD4wOyBtcC0+cGMub3ZlcnJlYWQtLSkgeworICAgICAgICAgICAgbXAtPnBjLmJ1ZmZlclttcC0+cGMuaW5kZXgrK109IG1wLT5wYy5idWZmZXJbbXAtPnBjLm92ZXJyZWFkX2luZGV4KytdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1wLT5wYy5pbmRleCArIGJ1Zl9zaXplIDwgMikgeworICAgICAgICAgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUoJm1wLT5wYywgRU5EX05PVF9GT1VORCwgJmJ1ZiwgJmJ1Zl9zaXplKSAhPSAtMSkKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZmZfY29tYmluZV9mcmFtZSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICB9CisKKyAgICAgICAgbXAtPmJ5dGVzX2xlZnQgPSAoKG1wLT5wYy5pbmRleCA+IDAgPyBtcC0+cGMuYnVmZmVyWzBdIDogYnVmWzBdKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICB8ICAobXAtPnBjLmluZGV4ID4gMSA/IG1wLT5wYy5idWZmZXJbMV0gOiBidWZbMS1tcC0+cGMuaW5kZXhdKTsKKyAgICAgICAgbXAtPmJ5dGVzX2xlZnQgPSAobXAtPmJ5dGVzX2xlZnQgJiAweGZmZikgKiAyOworICAgICAgICBpZiAobXAtPmJ5dGVzX2xlZnQgPD0gMCkgeyAvLyBwcmV2ZW50IGluZmluaXRlIGxvb3AKKyAgICAgICAgICAgIGdvdG8gbG9zdF9zeW5jOworICAgICAgICB9CisgICAgICAgIG1wLT5ieXRlc19sZWZ0IC09IG1wLT5wYy5pbmRleDsKKyAgICB9CisKKyAgICBuZXh0ID0gKG1wLT5ieXRlc19sZWZ0ID4gYnVmX3NpemUpID8gRU5EX05PVF9GT1VORCA6IG1wLT5ieXRlc19sZWZ0OworCisgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUoJm1wLT5wYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgbXAtPmJ5dGVzX2xlZnQgLT0gYnVmX3NpemU7CisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisKKyAgICBtcC0+Ynl0ZXNfbGVmdCA9IDA7CisKKyAgICBzeW5jX3ByZXNlbnQgPSAoQVZfUkIzMihidWYgKyA0KSAmIDB4ZmZmZmZmZmUpID09IDB4Zjg3MjZmYmE7CisKKyAgICBpZiAoIXN5bmNfcHJlc2VudCkgeworICAgICAgICAvKiBUaGUgZmlyc3QgbmliYmxlIG9mIGEgZnJhbWUgaXMgYSBwYXJpdHkgY2hlY2sgb2YgdGhlIDQtYnl0ZQorICAgICAgICAgKiBhY2Nlc3MgdW5pdCBoZWFkZXIgYW5kIGFsbCB0aGUgMi0gb3IgNC1ieXRlIHN1YnN0cmVhbSBoZWFkZXJzLiAqLworICAgICAgICAvLyBPbmx5IGNoZWNrIHdoZW4gdGhpcyBpc24ndCBhIHN5bmMgZnJhbWUgLSBzeW5jcyBoYXZlIGEgY2hlY2tzdW0uCisKKyAgICAgICAgcGFyaXR5X2JpdHMgPSAwOworICAgICAgICBmb3IgKGkgPSAtMTsgaSA8IG1wLT5udW1fc3Vic3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBwYXJpdHlfYml0cyBePSBidWZbcCsrXTsKKyAgICAgICAgICAgIHBhcml0eV9iaXRzIF49IGJ1ZltwKytdOworCisgICAgICAgICAgICBpZiAoaSA8IDAgfHwgYnVmW3AtMl0gJiAweDgwKSB7CisgICAgICAgICAgICAgICAgcGFyaXR5X2JpdHMgXj0gYnVmW3ArK107CisgICAgICAgICAgICAgICAgcGFyaXR5X2JpdHMgXj0gYnVmW3ArK107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKCgocGFyaXR5X2JpdHMgPj4gNCkgXiBwYXJpdHlfYml0cykgJiAweEYpICE9IDB4RikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIm1scHBhcnNlOiBQYXJpdHkgY2hlY2sgZmFpbGVkLlxuIik7CisgICAgICAgICAgICBnb3RvIGxvc3Rfc3luYzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgICAgIE1MUEhlYWRlckluZm8gbWg7CisKKyAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiArIDQsIChidWZfc2l6ZSAtIDQpIDw8IDMpOworICAgICAgICBpZiAoZmZfbWxwX3JlYWRfbWFqb3Jfc3luYyhhdmN0eCwgJm1oLCAmZ2IpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gbG9zdF9zeW5jOworCisgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gbWguZ3JvdXAxX2JpdHM7CisgICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+IDE2KQorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MzMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gbWguZ3JvdXAxX3NhbXBsZXJhdGU7CisgICAgICAgIHMtPmR1cmF0aW9uID0gbWguYWNjZXNzX3VuaXRfc2l6ZTsKKworICAgICAgICBpZighYXZjdHgtPmNoYW5uZWxzIHx8ICFhdmN0eC0+Y2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgaWYgKG1oLnN0cmVhbV90eXBlID09IDB4YmIpIHsKKyAgICAgICAgICAgIC8qIE1MUCBzdHJlYW0gKi8KKyNpZiBGRl9BUElfUkVRVUVTVF9DSEFOTkVMUworRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICAgICAgaWYgKGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxzID4gMCAmJiBhdmN0eC0+cmVxdWVzdF9jaGFubmVscyA8PSAyICYmCisgICAgICAgICAgICAgICAgbWgubnVtX3N1YnN0cmVhbXMgPiAxKSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ICYmCisgICAgICAgICAgICAgICAgKGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ICYgQVZfQ0hfTEFZT1VUX1NURVJFTykgPT0KKyAgICAgICAgICAgICAgICBhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCAmJgorICAgICAgICAgICAgICAgIG1oLm51bV9zdWJzdHJlYW1zID4gMSkgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICA9IDI7CisgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gbWguY2hhbm5lbHNfbWxwOworICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IG1oLmNoYW5uZWxfbGF5b3V0X21scDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLyogbWguc3RyZWFtX3R5cGUgPT0gMHhiYSAqLworICAgICAgICAgICAgLyogVHJ1ZUhEIHN0cmVhbSAqLworI2lmIEZGX0FQSV9SRVFVRVNUX0NIQU5ORUxTCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICBpZiAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbHMgPiAwICYmIGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxzIDw9IDIgJiYKKyAgICAgICAgICAgICAgICBtaC5udW1fc3Vic3RyZWFtcyA+IDEpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxzID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cmVxdWVzdF9jaGFubmVscyA8PSBtaC5jaGFubmVsc190aGRfc3RyZWFtMSkgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICA9IG1oLmNoYW5uZWxzX3RoZF9zdHJlYW0xOworICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IG1oLmNoYW5uZWxfbGF5b3V0X3RoZF9zdHJlYW0xOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCAmJgorICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9MQVlPVVRfU1RFUkVPKSA9PQorICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCAmJgorICAgICAgICAgICAgICAgICAgICBtaC5udW1fc3Vic3RyZWFtcyA+IDEpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtaC5jaGFubmVsc190aGRfc3RyZWFtMiB8fAorICAgICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCAmIG1oLmNoYW5uZWxfbGF5b3V0X3RoZF9zdHJlYW0xKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQpKSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gbWguY2hhbm5lbHNfdGhkX3N0cmVhbTE7CisgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gbWguY2hhbm5lbF9sYXlvdXRfdGhkX3N0cmVhbTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICA9IG1oLmNoYW5uZWxzX3RoZF9zdHJlYW0yOworICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IG1oLmNoYW5uZWxfbGF5b3V0X3RoZF9zdHJlYW0yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1oLmlzX3ZicikgLyogU3RyZWFtIGlzIENCUiAqLworICAgICAgICAgICAgYXZjdHgtPmJpdF9yYXRlID0gbWgucGVha19iaXRyYXRlOworCisgICAgICAgIG1wLT5udW1fc3Vic3RyZWFtcyA9IG1oLm51bV9zdWJzdHJlYW1zOworICAgIH0KKworICAgICpwb3V0YnVmID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKworICAgIHJldHVybiBuZXh0OworCitsb3N0X3N5bmM6CisgICAgbXAtPmluX3N5bmMgPSAwOworICAgIHJldHVybiAxOworfQorCitBVkNvZGVjUGFyc2VyIGZmX21scF9wYXJzZXIgPSB7CisgICAgLmNvZGVjX2lkcyAgICAgID0geyBBVl9DT0RFQ19JRF9NTFAsIEFWX0NPREVDX0lEX1RSVUVIRCB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNTFBQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfaW5pdCAgICA9IG1scF9pbml0LAorICAgIC5wYXJzZXJfcGFyc2UgICA9IG1scF9wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tbHBfcGFyc2VyLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tbHBfcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwMTA5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21scF9wYXJzZXIuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogTUxQIHBhcnNlciBwcm90b3R5cGVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSWFuIENhdWxmaWVsZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNTFAgcGFyc2VyIHByb3RvdHlwZXMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTUxQX1BBUlNFUl9ICisjZGVmaW5lIEFWQ09ERUNfTUxQX1BBUlNFUl9ICisKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorCit0eXBlZGVmIHN0cnVjdCBNTFBIZWFkZXJJbmZvCit7CisgICAgaW50IHN0cmVhbV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMHhCQiBmb3IgTUxQLCAweEJBIGZvciBUcnVlSEQKKyAgICBpbnQgaGVhZGVyX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBTaXplIG9mIHRoZSBtYWpvciBzeW5jIGhlYWRlciwgaW4gYnl0ZXMKKworICAgIGludCBncm91cDFfYml0czsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSBiaXQgZGVwdGggb2YgdGhlIGZpcnN0IHN1YnN0cmVhbQorICAgIGludCBncm91cDJfYml0czsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEJpdCBkZXB0aCBvZiB0aGUgc2Vjb25kIHN1YnN0cmVhbSAoTUxQIG9ubHkpCisKKyAgICBpbnQgZ3JvdXAxX3NhbXBsZXJhdGU7ICAgICAgICAgICAgICAgICAgLy8vPCBTYW1wbGUgcmF0ZSBvZiBmaXJzdCBzdWJzdHJlYW0KKyAgICBpbnQgZ3JvdXAyX3NhbXBsZXJhdGU7ICAgICAgICAgICAgICAgICAgLy8vPCBTYW1wbGUgcmF0ZSBvZiBzZWNvbmQgc3Vic3RyZWFtIChNTFAgb25seSkKKworICAgIGludCBjaGFubmVsX2FycmFuZ2VtZW50OworCisgICAgaW50IGNoYW5uZWxfbW9kaWZpZXJfdGhkX3N0cmVhbTA7ICAgICAgIC8vLzwgQ2hhbm5lbCBtb2RpZmllciBmb3Igc3Vic3RyZWFtIDAgb2YgVHJ1ZUhEIHNyZWFtcyAoIjItY2hhbm5lbCBwcmVzZW50YXRpb24iKQorICAgIGludCBjaGFubmVsX21vZGlmaWVyX3RoZF9zdHJlYW0xOyAgICAgICAvLy88IENoYW5uZWwgbW9kaWZpZXIgZm9yIHN1YnN0cmVhbSAxIG9mIFRydWVIRCBzcmVhbXMgKCI2LWNoYW5uZWwgcHJlc2VudGF0aW9uIikKKyAgICBpbnQgY2hhbm5lbF9tb2RpZmllcl90aGRfc3RyZWFtMjsgICAgICAgLy8vPCBDaGFubmVsIG1vZGlmaWVyIGZvciBzdWJzdHJlYW0gMiBvZiBUcnVlSEQgc3JlYW1zICgiOC1jaGFubmVsIHByZXNlbnRhdGlvbiIpCisKKyAgICBpbnQgY2hhbm5lbHNfbWxwOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBDaGFubmVsIGNvdW50IGZvciBNTFAgc3RyZWFtcworICAgIGludCBjaGFubmVsc190aGRfc3RyZWFtMTsgICAgICAgICAgICAgICAvLy88IENoYW5uZWwgY291bnQgZm9yIHN1YnN0cmVhbSAxIG9mIFRydWVIRCBzdHJlYW1zICgiNi1jaGFubmVsIHByZXNlbnRhdGlvbiIpCisgICAgaW50IGNoYW5uZWxzX3RoZF9zdHJlYW0yOyAgICAgICAgICAgICAgIC8vLzwgQ2hhbm5lbCBjb3VudCBmb3Igc3Vic3RyZWFtIDIgb2YgVHJ1ZUhEIHN0cmVhbXMgKCI4LWNoYW5uZWwgcHJlc2VudGF0aW9uIikKKyAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dF9tbHA7ICAgICAgICAgICAgLy8vPCBDaGFubmVsIGxheW91dCBmb3IgTUxQIHN0cmVhbXMKKyAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dF90aGRfc3RyZWFtMTsgICAgLy8vPCBDaGFubmVsIGxheW91dCBmb3Igc3Vic3RyZWFtIDEgb2YgVHJ1ZUhEIHN0cmVhbXMgKCI2LWNoYW5uZWwgcHJlc2VudGF0aW9uIikKKyAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dF90aGRfc3RyZWFtMjsgICAgLy8vPCBDaGFubmVsIGxheW91dCBmb3Igc3Vic3RyZWFtIDIgb2YgVHJ1ZUhEIHN0cmVhbXMgKCI4LWNoYW5uZWwgcHJlc2VudGF0aW9uIikKKworICAgIGludCBhY2Nlc3NfdW5pdF9zaXplOyAgICAgICAgICAgICAgICAgICAvLy88IE51bWJlciBvZiBzYW1wbGVzIHBlciBjb2RlZCBmcmFtZQorICAgIGludCBhY2Nlc3NfdW5pdF9zaXplX3BvdzI7ICAgICAgICAgICAgICAvLy88IE5leHQgcG93ZXIgb2YgdHdvIGFib3ZlIG51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZQorCisgICAgaW50IGlzX3ZicjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgU3RyZWFtIGlzIFZCUiBpbnN0ZWFkIG9mIENCUgorICAgIGludCBwZWFrX2JpdHJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IFBlYWsgYml0cmF0ZSBmb3IgVkJSLCBhY3R1YWwgYml0cmF0ZSAoPT1wZWFrKSBmb3IgQ0JSCisKKyAgICBpbnQgbnVtX3N1YnN0cmVhbXM7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBOdW1iZXIgb2Ygc3Vic3RyZWFtcyB3aXRoaW4gc3RyZWFtCit9IE1MUEhlYWRlckluZm87CisKKworaW50IGZmX21scF9yZWFkX21ham9yX3N5bmModm9pZCAqbG9nLCBNTFBIZWFkZXJJbmZvICptaCwgR2V0Qml0Q29udGV4dCAqZ2IpOwordWludDY0X3QgZmZfdHJ1ZWhkX2xheW91dChpbnQgY2hhbm1hcCk7CisKK2V4dGVybiBjb25zdCB1aW50NjRfdCBmZl9tbHBfbGF5b3V0WzMyXTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTUxQX1BBUlNFUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tbHBkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21scGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MGQxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tbHBkZWMuYwpAQCAtMCwwICsxLDEzMzEgQEAKKy8qCisgKiBNTFAgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSWFuIENhdWxmaWVsZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNTFAgZGVjb2RlcgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJtbHBfcGFyc2VyLmgiCisjaW5jbHVkZSAibWxwZHNwLmgiCisjaW5jbHVkZSAibWxwLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKy8qKiBudW1iZXIgb2YgYml0cyB1c2VkIGZvciBWTEMgbG9va3VwIC0gbG9uZ2VzdCBIdWZmbWFuIGNvZGUgaXMgOSAqLworI2lmIEFSQ0hfQVJNCisjZGVmaW5lIFZMQ19CSVRTICAgICAgICAgICAgNQorI2RlZmluZSBWTENfU1RBVElDX1NJWkUgICAgIDY0CisjZWxzZQorI2RlZmluZSBWTENfQklUUyAgICAgICAgICAgIDkKKyNkZWZpbmUgVkxDX1NUQVRJQ19TSVpFICAgICA1MTIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBTdWJTdHJlYW0geworICAgIC8vLyBTZXQgaWYgYSB2YWxpZCByZXN0YXJ0IGhlYWRlciBoYXMgYmVlbiByZWFkLiBPdGhlcndpc2UgdGhlIHN1YnN0cmVhbSBjYW5ub3QgYmUgZGVjb2RlZC4KKyAgICB1aW50OF90ICAgICByZXN0YXJ0X3NlZW47CisKKyAgICAvL0B7CisgICAgLyoqIHJlc3RhcnQgaGVhZGVyIGRhdGEgKi8KKyAgICAvLy8gVGhlIHR5cGUgb2Ygbm9pc2UgdG8gYmUgdXNlZCBpbiB0aGUgcmVtYXRyaXggc3RhZ2UuCisgICAgdWludDE2X3QgICAgbm9pc2VfdHlwZTsKKworICAgIC8vLyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYW5uZWwgY29kZWQgaW4gdGhpcyBzdWJzdHJlYW0uCisgICAgdWludDhfdCAgICAgbWluX2NoYW5uZWw7CisgICAgLy8vIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFubmVsIGNvZGVkIGluIHRoaXMgc3Vic3RyZWFtLgorICAgIHVpbnQ4X3QgICAgIG1heF9jaGFubmVsOworICAgIC8vLyBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlucHV0IGludG8gdGhlIHJlbWF0cml4IHN0YWdlLgorICAgIHVpbnQ4X3QgICAgIG1heF9tYXRyaXhfY2hhbm5lbDsKKyAgICAvLy8gRm9yIGVhY2ggY2hhbm5lbCBvdXRwdXQgYnkgdGhlIG1hdHJpeCwgdGhlIG91dHB1dCBjaGFubmVsIHRvIG1hcCBpdCB0bworICAgIHVpbnQ4X3QgICAgIGNoX2Fzc2lnbltNQVhfQ0hBTk5FTFNdOworICAgIC8vLyBUaGUgY2hhbm5lbCBsYXlvdXQgZm9yIHRoaXMgc3Vic3RyZWFtCisgICAgdWludDY0X3QgICAgY2hfbGF5b3V0OworICAgIC8vLyBUaGUgbWF0cml4IGVuY29kaW5nIG1vZGUgZm9yIHRoaXMgc3Vic3RyZWFtCisgICAgZW51bSBBVk1hdHJpeEVuY29kaW5nIG1hdHJpeF9lbmNvZGluZzsKKworICAgIC8vLyBDaGFubmVsIGNvZGluZyBwYXJhbWV0ZXJzIGZvciBjaGFubmVscyBpbiB0aGUgc3Vic3RyZWFtCisgICAgQ2hhbm5lbFBhcmFtcyBjaGFubmVsX3BhcmFtc1tNQVhfQ0hBTk5FTFNdOworCisgICAgLy8vIFRoZSBsZWZ0IHNoaWZ0IGFwcGxpZWQgdG8gcmFuZG9tIG5vaXNlIGluIDB4MzFlYSBzdWJzdHJlYW1zLgorICAgIHVpbnQ4X3QgICAgIG5vaXNlX3NoaWZ0OworICAgIC8vLyBUaGUgY3VycmVudCBzZWVkIHZhbHVlIGZvciB0aGUgcHNldWRvcmFuZG9tIG5vaXNlIGdlbmVyYXRvcihzKS4KKyAgICB1aW50MzJfdCAgICBub2lzZWdlbl9zZWVkOworCisgICAgLy8vIFNldCBpZiB0aGUgc3Vic3RyZWFtIGNvbnRhaW5zIGV4dHJhIGluZm8gdG8gY2hlY2sgdGhlIHNpemUgb2YgVkxDIGJsb2Nrcy4KKyAgICB1aW50OF90ICAgICBkYXRhX2NoZWNrX3ByZXNlbnQ7CisKKyAgICAvLy8gQml0bWFzayBvZiB3aGljaCBwYXJhbWV0ZXIgc2V0cyBhcmUgY29udmV5ZWQgaW4gYSBkZWNvZGluZyBwYXJhbWV0ZXIgYmxvY2suCisgICAgdWludDhfdCAgICAgcGFyYW1fcHJlc2VuY2VfZmxhZ3M7CisjZGVmaW5lIFBBUkFNX0JMT0NLU0laRSAgICAgKDEgPDwgNykKKyNkZWZpbmUgUEFSQU1fTUFUUklYICAgICAgICAoMSA8PCA2KQorI2RlZmluZSBQQVJBTV9PVVRTSElGVCAgICAgICgxIDw8IDUpCisjZGVmaW5lIFBBUkFNX1FVQU5UU1RFUCAgICAgKDEgPDwgNCkKKyNkZWZpbmUgUEFSQU1fRklSICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBQQVJBTV9JSVIgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFBBUkFNX0hVRkZPRkZTRVQgICAgKDEgPDwgMSkKKyNkZWZpbmUgUEFSQU1fUFJFU0VOQ0UgICAgICAoMSA8PCAwKQorICAgIC8vQH0KKworICAgIC8vQHsKKyAgICAvKiogbWF0cml4IGRhdGEgKi8KKworICAgIC8vLyBOdW1iZXIgb2YgbWF0cmljZXMgdG8gYmUgYXBwbGllZC4KKyAgICB1aW50OF90ICAgICBudW1fcHJpbWl0aXZlX21hdHJpY2VzOworCisgICAgLy8vIG1hdHJpeCBvdXRwdXQgY2hhbm5lbAorICAgIHVpbnQ4X3QgICAgIG1hdHJpeF9vdXRfY2hbTUFYX01BVFJJQ0VTXTsKKworICAgIC8vLyBXaGV0aGVyIHRoZSBMU0JzIG9mIHRoZSBtYXRyaXggb3V0cHV0IGFyZSBlbmNvZGVkIGluIHRoZSBiaXRzdHJlYW0uCisgICAgdWludDhfdCAgICAgbHNiX2J5cGFzc1tNQVhfTUFUUklDRVNdOworICAgIC8vLyBNYXRyaXggY29lZmZpY2llbnRzLCBzdG9yZWQgYXMgMi4xNCBmaXhlZCBwb2ludC4KKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGludDMyX3QsIG1hdHJpeF9jb2VmZilbTUFYX01BVFJJQ0VTXVtNQVhfQ0hBTk5FTFNdOworICAgIC8vLyBMZWZ0IHNoaWZ0IHRvIGFwcGx5IHRvIG5vaXNlIHZhbHVlcyBpbiAweDMxZWIgc3Vic3RyZWFtcy4KKyAgICB1aW50OF90ICAgICBtYXRyaXhfbm9pc2Vfc2hpZnRbTUFYX01BVFJJQ0VTXTsKKyAgICAvL0B9CisKKyAgICAvLy8gTGVmdCBzaGlmdCB0byBhcHBseSB0byBIdWZmbWFuLWRlY29kZWQgcmVzaWR1YWxzLgorICAgIHVpbnQ4X3QgICAgIHF1YW50X3N0ZXBfc2l6ZVtNQVhfQ0hBTk5FTFNdOworCisgICAgLy8vIG51bWJlciBvZiBQQ00gc2FtcGxlcyBpbiBjdXJyZW50IGF1ZGlvIGJsb2NrCisgICAgdWludDE2X3QgICAgYmxvY2tzaXplOworICAgIC8vLyBOdW1iZXIgb2YgUENNIHNhbXBsZXMgZGVjb2RlZCBzbyBmYXIgaW4gdGhpcyBmcmFtZS4KKyAgICB1aW50MTZfdCAgICBibG9ja3BvczsKKworICAgIC8vLyBMZWZ0IHNoaWZ0IHRvIGFwcGx5IHRvIGRlY29kZWQgUENNIHZhbHVlcyB0byBnZXQgZmluYWwgMjQtYml0IG91dHB1dC4KKyAgICBpbnQ4X3QgICAgICBvdXRwdXRfc2hpZnRbTUFYX0NIQU5ORUxTXTsKKworICAgIC8vLyBSdW5uaW5nIFhPUiBvZiBhbGwgb3V0cHV0IHNhbXBsZXMuCisgICAgaW50MzJfdCAgICAgbG9zc2xlc3NfY2hlY2tfZGF0YTsKKworfSBTdWJTdHJlYW07CisKK3R5cGVkZWYgc3RydWN0IE1MUERlY29kZUNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKworICAgIC8vLyBDdXJyZW50IGFjY2VzcyB1bml0IGJlaW5nIHJlYWQgaGFzIGEgbWFqb3Igc3luYy4KKyAgICBpbnQgICAgICAgICBpc19tYWpvcl9zeW5jX3VuaXQ7CisKKyAgICAvLy8gU2l6ZSBvZiB0aGUgbWFqb3Igc3luYyB1bml0LCBpbiBieXRlcworICAgIGludCAgICAgICAgIG1ham9yX3N5bmNfaGVhZGVyX3NpemU7CisKKyAgICAvLy8gU2V0IGlmIGEgdmFsaWQgbWFqb3Igc3luYyBibG9jayBoYXMgYmVlbiByZWFkLiBPdGhlcndpc2Ugbm8gZGVjb2RpbmcgaXMgcG9zc2libGUuCisgICAgdWludDhfdCAgICAgcGFyYW1zX3ZhbGlkOworCisgICAgLy8vIE51bWJlciBvZiBzdWJzdHJlYW1zIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzdHJlYW0uCisgICAgdWludDhfdCAgICAgbnVtX3N1YnN0cmVhbXM7CisKKyAgICAvLy8gSW5kZXggb2YgdGhlIGxhc3Qgc3Vic3RyZWFtIHRvIGRlY29kZSAtIGZ1cnRoZXIgc3Vic3RyZWFtcyBhcmUgc2tpcHBlZC4KKyAgICB1aW50OF90ICAgICBtYXhfZGVjb2RlZF9zdWJzdHJlYW07CisKKyAgICAvLy8gU3RyZWFtIG5lZWRzIGNoYW5uZWwgcmVvcmRlcmluZyB0byBjb21wbHkgd2l0aCBGRm1wZWcncyBjaGFubmVsIG9yZGVyCisgICAgdWludDhfdCAgICAgbmVlZHNfcmVvcmRlcmluZzsKKworICAgIC8vLyBudW1iZXIgb2YgUENNIHNhbXBsZXMgY29udGFpbmVkIGluIGVhY2ggZnJhbWUKKyAgICBpbnQgICAgICAgICBhY2Nlc3NfdW5pdF9zaXplOworICAgIC8vLyBuZXh0IHBvd2VyIG9mIHR3byBhYm92ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaW4gZWFjaCBmcmFtZQorICAgIGludCAgICAgICAgIGFjY2Vzc191bml0X3NpemVfcG93MjsKKworICAgIFN1YlN0cmVhbSAgIHN1YnN0cmVhbVtNQVhfU1VCU1RSRUFNU107CisKKyAgICBpbnQgICAgICAgICBtYXRyaXhfY2hhbmdlZDsKKyAgICBpbnQgICAgICAgICBmaWx0ZXJfY2hhbmdlZFtNQVhfQ0hBTk5FTFNdW05VTV9GSUxURVJTXTsKKworICAgIGludDhfdCAgICAgIG5vaXNlX2J1ZmZlcltNQVhfQkxPQ0tTSVpFX1BPVzJdOworICAgIGludDhfdCAgICAgIGJ5cGFzc2VkX2xzYnNbTUFYX0JMT0NLU0laRV1bTUFYX0NIQU5ORUxTXTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGludDMyX3QsIHNhbXBsZV9idWZmZXIpW01BWF9CTE9DS1NJWkVdW01BWF9DSEFOTkVMU107CisKKyAgICBNTFBEU1BDb250ZXh0IGRzcDsKK30gTUxQRGVjb2RlQ29udGV4dDsKKworc3RhdGljIGNvbnN0IHVpbnQ2NF90IHRoZF9jaGFubmVsX29yZGVyW10gPSB7CisgICAgQVZfQ0hfRlJPTlRfTEVGVCwgQVZfQ0hfRlJPTlRfUklHSFQsICAgICAgICAgICAgICAgICAgICAgLy8gTFIKKyAgICBBVl9DSF9GUk9OVF9DRU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDCisgICAgQVZfQ0hfTE9XX0ZSRVFVRU5DWSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTEZFCisgICAgQVZfQ0hfU0lERV9MRUZULCBBVl9DSF9TSURFX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgLy8gTFJzCisgICAgQVZfQ0hfVE9QX0ZST05UX0xFRlQsIEFWX0NIX1RPUF9GUk9OVF9SSUdIVCwgICAgICAgICAgICAgLy8gTFJ2aAorICAgIEFWX0NIX0ZST05UX0xFRlRfT0ZfQ0VOVEVSLCBBVl9DSF9GUk9OVF9SSUdIVF9PRl9DRU5URVIsIC8vIExSYworICAgIEFWX0NIX0JBQ0tfTEVGVCwgQVZfQ0hfQkFDS19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgIC8vIExScnMKKyAgICBBVl9DSF9CQUNLX0NFTlRFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcworICAgIEFWX0NIX1RPUF9DRU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRzCisgICAgQVZfQ0hfU1VSUk9VTkRfRElSRUNUX0xFRlQsIEFWX0NIX1NVUlJPVU5EX0RJUkVDVF9SSUdIVCwgLy8gTFJzZAorICAgIEFWX0NIX1dJREVfTEVGVCwgQVZfQ0hfV0lERV9SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgIC8vIExSdworICAgIEFWX0NIX1RPUF9GUk9OVF9DRU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEN2aAorICAgIEFWX0NIX0xPV19GUkVRVUVOQ1lfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExGRTIKK307CisKK3N0YXRpYyB1aW50NjRfdCB0aGRfY2hhbm5lbF9sYXlvdXRfZXh0cmFjdF9jaGFubmVsKHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KQoreworICAgIGludCBpOworCisgICAgaWYgKGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhjaGFubmVsX2xheW91dCkgPD0gaW5kZXgpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHRoZF9jaGFubmVsX29yZGVyKTsgaSsrKQorICAgICAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiB0aGRfY2hhbm5lbF9vcmRlcltpXSAmJiAhaW5kZXgtLSkKKyAgICAgICAgICAgIHJldHVybiB0aGRfY2hhbm5lbF9vcmRlcltpXTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFZMQyBodWZmX3ZsY1szXTsKKworLyoqIEluaXRpYWxpemUgc3RhdGljIGRhdGEsIGNvbnN0YW50IGJldHdlZW4gYWxsIGludm9jYXRpb25zIG9mIHRoZSBjb2RlYy4gKi8KKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X3N0YXRpYyh2b2lkKQoreworICAgIGlmICghaHVmZl92bGNbMF0uYml0cykgeworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmh1ZmZfdmxjWzBdLCBWTENfQklUUywgMTgsCisgICAgICAgICAgICAgICAgICAgICZmZl9tbHBfaHVmZm1hbl90YWJsZXNbMF1bMF1bMV0sIDIsIDEsCisgICAgICAgICAgICAgICAgICAgICZmZl9tbHBfaHVmZm1hbl90YWJsZXNbMF1bMF1bMF0sIDIsIDEsIFZMQ19TVEFUSUNfU0laRSk7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmaHVmZl92bGNbMV0sIFZMQ19CSVRTLCAxNiwKKyAgICAgICAgICAgICAgICAgICAgJmZmX21scF9odWZmbWFuX3RhYmxlc1sxXVswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgJmZmX21scF9odWZmbWFuX3RhYmxlc1sxXVswXVswXSwgMiwgMSwgVkxDX1NUQVRJQ19TSVpFKTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZodWZmX3ZsY1syXSwgVkxDX0JJVFMsIDE1LAorICAgICAgICAgICAgICAgICAgICAmZmZfbWxwX2h1ZmZtYW5fdGFibGVzWzJdWzBdWzFdLCAyLCAxLAorICAgICAgICAgICAgICAgICAgICAmZmZfbWxwX2h1ZmZtYW5fdGFibGVzWzJdWzBdWzBdLCAyLCAxLCBWTENfU1RBVElDX1NJWkUpOworICAgIH0KKworICAgIGZmX21scF9pbml0X2NyYygpOworfQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgY2FsY3VsYXRlX3NpZ25faHVmZihNTFBEZWNvZGVDb250ZXh0ICptLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN1YnN0ciwgdW5zaWduZWQgaW50IGNoKQoreworICAgIFN1YlN0cmVhbSAqcyA9ICZtLT5zdWJzdHJlYW1bc3Vic3RyXTsKKyAgICBDaGFubmVsUGFyYW1zICpjcCA9ICZzLT5jaGFubmVsX3BhcmFtc1tjaF07CisgICAgaW50IGxzYl9iaXRzID0gY3AtPmh1ZmZfbHNicyAtIHMtPnF1YW50X3N0ZXBfc2l6ZVtjaF07CisgICAgaW50IHNpZ25fc2hpZnQgPSBsc2JfYml0cyArIChjcC0+Y29kZWJvb2sgPyAyIC0gY3AtPmNvZGVib29rIDogLTEpOworICAgIGludDMyX3Qgc2lnbl9odWZmX29mZnNldCA9IGNwLT5odWZmX29mZnNldDsKKworICAgIGlmIChjcC0+Y29kZWJvb2sgPiAwKQorICAgICAgICBzaWduX2h1ZmZfb2Zmc2V0IC09IDcgPDwgbHNiX2JpdHM7CisKKyAgICBpZiAoc2lnbl9zaGlmdCA+PSAwKQorICAgICAgICBzaWduX2h1ZmZfb2Zmc2V0IC09IDEgPDwgc2lnbl9zaGlmdDsKKworICAgIHJldHVybiBzaWduX2h1ZmZfb2Zmc2V0OworfQorCisvKiogUmVhZCBhIHNhbXBsZSwgY29uc2lzdGluZyBvZiBlaXRoZXIsIGJvdGggb3IgbmVpdGhlciBvZiBlbnRyb3B5LWNvZGVkIE1TQnMKKyAqICBhbmQgcGxhaW4gTFNCcy4gKi8KKworc3RhdGljIGlubGluZSBpbnQgcmVhZF9odWZmX2NoYW5uZWxzKE1MUERlY29kZUNvbnRleHQgKm0sIEdldEJpdENvbnRleHQgKmdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3Vic3RyLCB1bnNpZ25lZCBpbnQgcG9zKQoreworICAgIFN1YlN0cmVhbSAqcyA9ICZtLT5zdWJzdHJlYW1bc3Vic3RyXTsKKyAgICB1bnNpZ25lZCBpbnQgbWF0LCBjaGFubmVsOworCisgICAgZm9yIChtYXQgPSAwOyBtYXQgPCBzLT5udW1fcHJpbWl0aXZlX21hdHJpY2VzOyBtYXQrKykKKyAgICAgICAgaWYgKHMtPmxzYl9ieXBhc3NbbWF0XSkKKyAgICAgICAgICAgIG0tPmJ5cGFzc2VkX2xzYnNbcG9zICsgcy0+YmxvY2twb3NdW21hdF0gPSBnZXRfYml0czEoZ2JwKTsKKworICAgIGZvciAoY2hhbm5lbCA9IHMtPm1pbl9jaGFubmVsOyBjaGFubmVsIDw9IHMtPm1heF9jaGFubmVsOyBjaGFubmVsKyspIHsKKyAgICAgICAgQ2hhbm5lbFBhcmFtcyAqY3AgPSAmcy0+Y2hhbm5lbF9wYXJhbXNbY2hhbm5lbF07CisgICAgICAgIGludCBjb2RlYm9vayA9IGNwLT5jb2RlYm9vazsKKyAgICAgICAgaW50IHF1YW50X3N0ZXBfc2l6ZSA9IHMtPnF1YW50X3N0ZXBfc2l6ZVtjaGFubmVsXTsKKyAgICAgICAgaW50IGxzYl9iaXRzID0gY3AtPmh1ZmZfbHNicyAtIHF1YW50X3N0ZXBfc2l6ZTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICAgICAgaWYgKGNvZGVib29rID4gMCkKKyAgICAgICAgICAgIHJlc3VsdCA9IGdldF92bGMyKGdicCwgaHVmZl92bGNbY29kZWJvb2stMV0udGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkxDX0JJVFMsICg5ICsgVkxDX0JJVFMgLSAxKSAvIFZMQ19CSVRTKTsKKworICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGlmIChsc2JfYml0cyA+IDApCisgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IGxzYl9iaXRzKSArIGdldF9iaXRzKGdicCwgbHNiX2JpdHMpOworCisgICAgICAgIHJlc3VsdCAgKz0gY3AtPnNpZ25faHVmZl9vZmZzZXQ7CisgICAgICAgIHJlc3VsdCA8PD0gcXVhbnRfc3RlcF9zaXplOworCisgICAgICAgIG0tPnNhbXBsZV9idWZmZXJbcG9zICsgcy0+YmxvY2twb3NdW2NoYW5uZWxdID0gcmVzdWx0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbWxwX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNTFBEZWNvZGVDb250ZXh0ICptID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgc3Vic3RyOworCisgICAgaW5pdF9zdGF0aWMoKTsKKyAgICBtLT5hdmN0eCA9IGF2Y3R4OworICAgIGZvciAoc3Vic3RyID0gMDsgc3Vic3RyIDwgTUFYX1NVQlNUUkVBTVM7IHN1YnN0cisrKQorICAgICAgICBtLT5zdWJzdHJlYW1bc3Vic3RyXS5sb3NzbGVzc19jaGVja19kYXRhID0gMHhmZmZmZmZmZjsKKyAgICBmZl9tbHBkc3BfaW5pdCgmbS0+ZHNwKTsKKworICAgIHJldHVybiAwOworfQorCisvKiogUmVhZCBhIG1ham9yIHN5bmMgaW5mbyBoZWFkZXIgLSBjb250YWlucyBoaWdoIGxldmVsIGluZm9ybWF0aW9uIGFib3V0CisgKiAgdGhlIHN0cmVhbSAtIHNhbXBsZSByYXRlLCBjaGFubmVsIGFycmFuZ2VtZW50IGV0Yy4gTW9zdCBvZiB0aGlzCisgKiAgaW5mb3JtYXRpb24gaXMgbm90IGFjdHVhbGx5IG5lY2Vzc2FyeSBmb3IgZGVjb2RpbmcsIG9ubHkgZm9yIHBsYXliYWNrLgorICovCisKK3N0YXRpYyBpbnQgcmVhZF9tYWpvcl9zeW5jKE1MUERlY29kZUNvbnRleHQgKm0sIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIE1MUEhlYWRlckluZm8gbWg7CisgICAgaW50IHN1YnN0ciwgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9tbHBfcmVhZF9tYWpvcl9zeW5jKG0tPmF2Y3R4LCAmbWgsIGdiKSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChtaC5ncm91cDFfYml0cyA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZC91bmtub3duIGJpdHMgcGVyIHNhbXBsZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAobWguZ3JvdXAyX2JpdHMgPiBtaC5ncm91cDFfYml0cykgeworICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDaGFubmVsIGdyb3VwIDIgY2Fubm90IGhhdmUgbW9yZSBiaXRzIHBlciBzYW1wbGUgdGhhbiBncm91cCAxLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChtaC5ncm91cDJfc2FtcGxlcmF0ZSAmJiBtaC5ncm91cDJfc2FtcGxlcmF0ZSAhPSBtaC5ncm91cDFfc2FtcGxlcmF0ZSkgeworICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDaGFubmVsIGdyb3VwcyB3aXRoIGRpZmZlcmluZyBzYW1wbGUgcmF0ZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChtaC5ncm91cDFfc2FtcGxlcmF0ZSA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZC91bmtub3duIHNhbXBsaW5nIHJhdGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKG1oLmdyb3VwMV9zYW1wbGVyYXRlID4gTUFYX1NBTVBMRVJBVEUpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiU2FtcGxpbmcgcmF0ZSAlZCBpcyBncmVhdGVyIHRoYW4gdGhlIHN1cHBvcnRlZCBtYXhpbXVtICglZCkuXG4iLAorICAgICAgICAgICAgICAgbWguZ3JvdXAxX3NhbXBsZXJhdGUsIE1BWF9TQU1QTEVSQVRFKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChtaC5hY2Nlc3NfdW5pdF9zaXplID4gTUFYX0JMT0NLU0laRSkgeworICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJCbG9jayBzaXplICVkIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3VwcG9ydGVkIG1heGltdW0gKCVkKS5cbiIsCisgICAgICAgICAgICAgICBtaC5hY2Nlc3NfdW5pdF9zaXplLCBNQVhfQkxPQ0tTSVpFKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChtaC5hY2Nlc3NfdW5pdF9zaXplX3BvdzIgPiBNQVhfQkxPQ0tTSVpFX1BPVzIpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQmxvY2sgc2l6ZSBwb3cyICVkIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3VwcG9ydGVkIG1heGltdW0gKCVkKS5cbiIsCisgICAgICAgICAgICAgICBtaC5hY2Nlc3NfdW5pdF9zaXplX3BvdzIsIE1BWF9CTE9DS1NJWkVfUE9XMik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChtaC5udW1fc3Vic3RyZWFtcyA9PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAobS0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01MUCAmJiBtaC5udW1fc3Vic3RyZWFtcyA+IDIpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJNTFAgb25seSBzdXBwb3J0cyB1cCB0byAyIHN1YnN0cmVhbXMuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChtaC5udW1fc3Vic3RyZWFtcyA+IE1BWF9TVUJTVFJFQU1TKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShtLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZCBzdWJzdHJlYW1zIChtb3JlIHRoYW4gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhpbXVtIHN1cHBvcnRlZCBieSB0aGUgZGVjb2RlcikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWgubnVtX3N1YnN0cmVhbXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgbS0+bWFqb3Jfc3luY19oZWFkZXJfc2l6ZSA9IG1oLmhlYWRlcl9zaXplOworCisgICAgbS0+YWNjZXNzX3VuaXRfc2l6ZSAgICAgID0gbWguYWNjZXNzX3VuaXRfc2l6ZTsKKyAgICBtLT5hY2Nlc3NfdW5pdF9zaXplX3BvdzIgPSBtaC5hY2Nlc3NfdW5pdF9zaXplX3BvdzI7CisKKyAgICBtLT5udW1fc3Vic3RyZWFtcyAgICAgICAgPSBtaC5udW1fc3Vic3RyZWFtczsKKworICAgIC8qIGxpbWl0IHRvIGRlY29kaW5nIDMgc3Vic3RyZWFtcywgYXMgdGhlIDR0aCBpcyB1c2VkIGJ5IERvbGJ5IEF0bW9zIGZvciBub24tYXVkaW8gZGF0YSAqLworICAgIG0tPm1heF9kZWNvZGVkX3N1YnN0cmVhbSA9IEZGTUlOKG0tPm51bV9zdWJzdHJlYW1zIC0gMSwgMik7CisKKyAgICBtLT5hdmN0eC0+c2FtcGxlX3JhdGUgICAgPSBtaC5ncm91cDFfc2FtcGxlcmF0ZTsKKyAgICBtLT5hdmN0eC0+ZnJhbWVfc2l6ZSAgICAgPSBtaC5hY2Nlc3NfdW5pdF9zaXplOworCisgICAgbS0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBtaC5ncm91cDFfYml0czsKKyAgICBpZiAobWguZ3JvdXAxX2JpdHMgPiAxNikKKyAgICAgICAgbS0+YXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MzMjsKKyAgICBlbHNlCisgICAgICAgIG0tPmF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTY7CisgICAgbS0+ZHNwLm1scF9wYWNrX291dHB1dCA9IG0tPmRzcC5tbHBfc2VsZWN0X3BhY2tfb3V0cHV0KG0tPnN1YnN0cmVhbVttLT5tYXhfZGVjb2RlZF9zdWJzdHJlYW1dLmNoX2Fzc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+c3Vic3RyZWFtW20tPm1heF9kZWNvZGVkX3N1YnN0cmVhbV0ub3V0cHV0X3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5zdWJzdHJlYW1bbS0+bWF4X2RlY29kZWRfc3Vic3RyZWFtXS5tYXhfbWF0cml4X2NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPmF2Y3R4LT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyKTsKKworICAgIG0tPnBhcmFtc192YWxpZCA9IDE7CisgICAgZm9yIChzdWJzdHIgPSAwOyBzdWJzdHIgPCBNQVhfU1VCU1RSRUFNUzsgc3Vic3RyKyspCisgICAgICAgIG0tPnN1YnN0cmVhbVtzdWJzdHJdLnJlc3RhcnRfc2VlbiA9IDA7CisKKyAgICAvKiBTZXQgdGhlIGxheW91dCBmb3IgZWFjaCBzdWJzdHJlYW0uIFdoZW4gdGhlcmUncyBtb3JlIHRoYW4gb25lLCB0aGUgZmlyc3QKKyAgICAgKiBzdWJzdHJlYW0gaXMgU3RlcmVvLiBTdWJzZXF1ZW50IHN1YnN0cmVhbXMnIGxheW91dHMgYXJlIGluZGljYXRlZCBpbiB0aGUKKyAgICAgKiBtYWpvciBzeW5jLiAqLworICAgIGlmIChtLT5hdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUxQKSB7CisgICAgICAgIGlmIChtaC5zdHJlYW1fdHlwZSAhPSAweGJiKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUobS0+YXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBzdHJlYW1fdHlwZSAlWCBpbiBNTFAiLAorICAgICAgICAgICAgICAgICAgICAgICAgbWguc3RyZWFtX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgICAgIGlmICgoc3Vic3RyID0gKG1oLm51bV9zdWJzdHJlYW1zID4gMSkpKQorICAgICAgICAgICAgbS0+c3Vic3RyZWFtWzBdLmNoX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgIG0tPnN1YnN0cmVhbVtzdWJzdHJdLmNoX2xheW91dCA9IG1oLmNoYW5uZWxfbGF5b3V0X21scDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobWguc3RyZWFtX3R5cGUgIT0gMHhiYSkgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKG0tPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgc3RyZWFtX3R5cGUgJVggaW4gIU1MUCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtaC5zdHJlYW1fdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdWJzdHIgPSAobWgubnVtX3N1YnN0cmVhbXMgPiAxKSkpCisgICAgICAgICAgICBtLT5zdWJzdHJlYW1bMF0uY2hfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgaWYgKG1oLm51bV9zdWJzdHJlYW1zID4gMikKKyAgICAgICAgICAgIGlmIChtaC5jaGFubmVsX2xheW91dF90aGRfc3RyZWFtMikKKyAgICAgICAgICAgICAgICBtLT5zdWJzdHJlYW1bMl0uY2hfbGF5b3V0ID0gbWguY2hhbm5lbF9sYXlvdXRfdGhkX3N0cmVhbTI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbS0+c3Vic3RyZWFtWzJdLmNoX2xheW91dCA9IG1oLmNoYW5uZWxfbGF5b3V0X3RoZF9zdHJlYW0xOworICAgICAgICBtLT5zdWJzdHJlYW1bc3Vic3RyXS5jaF9sYXlvdXQgPSBtaC5jaGFubmVsX2xheW91dF90aGRfc3RyZWFtMTsKKworICAgICAgICBpZiAobS0+YXZjdHgtPmNoYW5uZWxzPD0yICYmIG0tPnN1YnN0cmVhbVtzdWJzdHJdLmNoX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfTU9OTyAmJiBtLT5tYXhfZGVjb2RlZF9zdWJzdHJlYW0gPT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJNb25vIHN0cmVhbSB3aXRoIDIgc3Vic3RyZWFtcywgaWdub3JpbmcgMm5kXG4iKTsKKyAgICAgICAgICAgIG0tPm1heF9kZWNvZGVkX3N1YnN0cmVhbSA9IDA7CisgICAgICAgICAgICBpZiAobS0+YXZjdHgtPmNoYW5uZWxzPT0yKQorICAgICAgICAgICAgICAgIG0tPmF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtLT5uZWVkc19yZW9yZGVyaW5nID0gbWguY2hhbm5lbF9hcnJhbmdlbWVudCA+PSAxOCAmJiBtaC5jaGFubmVsX2FycmFuZ2VtZW50IDw9IDIwOworCisgICAgLyogUGFyc2UgdGhlIFRydWVIRCBkZWNvZGVyIGNoYW5uZWwgbW9kaWZpZXJzIGFuZCBzZXQgZWFjaCBzdWJzdHJlYW0ncworICAgICAqIEFWTWF0cml4RW5jb2RpbmcgYWNjb3JkaW5nbHkuCisgICAgICoKKyAgICAgKiBUaGUgbWVhbmluZyBvZiB0aGUgbW9kaWZpZXJzIGRlcGVuZHMgb24gdGhlIGNoYW5uZWwgbGF5b3V0OgorICAgICAqCisgICAgICogLSBUSERfQ0hfTU9ESUZJRVJfTFRSVCwgVEhEX0NIX01PRElGSUVSX0xCSU5SQklOIG9ubHkgYXBwbHkgdG8gMi1jaGFubmVsCisgICAgICoKKyAgICAgKiAtIFRIRF9DSF9NT0RJRklFUl9NT05PIGFwcGxpZXMgdG8gMS1jaGFubmVsIG9yIDItY2hhbm5lbCAoZHVhbCBtb25vKQorICAgICAqCisgICAgICogLSBUSERfQ0hfTU9ESUZJRVJfU1VSUk9VTkRFWCwgVEhEX0NIX01PRElGSUVSX05PVFNVUlJPVU5ERVggb25seSBhcHBseSB0bworICAgICAqICAgbGF5b3V0cyB3aXRoIGFuIExzL1JzIGNoYW5uZWwgcGFpcgorICAgICAqLworICAgIGZvciAoc3Vic3RyID0gMDsgc3Vic3RyIDwgTUFYX1NVQlNUUkVBTVM7IHN1YnN0cisrKQorICAgICAgICBtLT5zdWJzdHJlYW1bc3Vic3RyXS5tYXRyaXhfZW5jb2RpbmcgPSBBVl9NQVRSSVhfRU5DT0RJTkdfTk9ORTsKKyAgICBpZiAobS0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RSVUVIRCkgeworICAgICAgICBpZiAobWgubnVtX3N1YnN0cmVhbXMgPiAyICYmCisgICAgICAgICAgICBtaC5jaGFubmVsX2xheW91dF90aGRfc3RyZWFtMiAmIEFWX0NIX1NJREVfTEVGVCAmJgorICAgICAgICAgICAgbWguY2hhbm5lbF9sYXlvdXRfdGhkX3N0cmVhbTIgJiBBVl9DSF9TSURFX1JJR0hUICYmCisgICAgICAgICAgICBtaC5jaGFubmVsX21vZGlmaWVyX3RoZF9zdHJlYW0yID09IFRIRF9DSF9NT0RJRklFUl9TVVJST1VOREVYKQorICAgICAgICAgICAgbS0+c3Vic3RyZWFtWzJdLm1hdHJpeF9lbmNvZGluZyA9IEFWX01BVFJJWF9FTkNPRElOR19ET0xCWUVYOworCisgICAgICAgIGlmIChtaC5udW1fc3Vic3RyZWFtcyA+IDEgJiYKKyAgICAgICAgICAgIG1oLmNoYW5uZWxfbGF5b3V0X3RoZF9zdHJlYW0xICYgQVZfQ0hfU0lERV9MRUZUICYmCisgICAgICAgICAgICBtaC5jaGFubmVsX2xheW91dF90aGRfc3RyZWFtMSAmIEFWX0NIX1NJREVfUklHSFQgJiYKKyAgICAgICAgICAgIG1oLmNoYW5uZWxfbW9kaWZpZXJfdGhkX3N0cmVhbTEgPT0gVEhEX0NIX01PRElGSUVSX1NVUlJPVU5ERVgpCisgICAgICAgICAgICBtLT5zdWJzdHJlYW1bMV0ubWF0cml4X2VuY29kaW5nID0gQVZfTUFUUklYX0VOQ09ESU5HX0RPTEJZRVg7CisKKyAgICAgICAgaWYgKG1oLm51bV9zdWJzdHJlYW1zID4gMCkKKyAgICAgICAgICAgIHN3aXRjaCAobWguY2hhbm5lbF9tb2RpZmllcl90aGRfc3RyZWFtMCkgeworICAgICAgICAgICAgY2FzZSBUSERfQ0hfTU9ESUZJRVJfTFRSVDoKKyAgICAgICAgICAgICAgICBtLT5zdWJzdHJlYW1bMF0ubWF0cml4X2VuY29kaW5nID0gQVZfTUFUUklYX0VOQ09ESU5HX0RPTEJZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUSERfQ0hfTU9ESUZJRVJfTEJJTlJCSU46CisgICAgICAgICAgICAgICAgbS0+c3Vic3RyZWFtWzBdLm1hdHJpeF9lbmNvZGluZyA9IEFWX01BVFJJWF9FTkNPRElOR19ET0xCWUhFQURQSE9ORTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBSZWFkIGEgcmVzdGFydCBoZWFkZXIgZnJvbSBhIGJsb2NrIGluIGEgc3Vic3RyZWFtLiBUaGlzIGNvbnRhaW5zIHBhcmFtZXRlcnMKKyAqICByZXF1aXJlZCB0byBkZWNvZGUgdGhlIGF1ZGlvIHRoYXQgZG8gbm90IGNoYW5nZSB2ZXJ5IG9mdGVuLiBHZW5lcmFsbHkKKyAqICAoYWx3YXlzKSBwcmVzZW50IG9ubHkgaW4gYmxvY2tzIGZvbGxvd2luZyBhIG1ham9yIHN5bmMuICovCisKK3N0YXRpYyBpbnQgcmVhZF9yZXN0YXJ0X2hlYWRlcihNTFBEZWNvZGVDb250ZXh0ICptLCBHZXRCaXRDb250ZXh0ICpnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCB1bnNpZ25lZCBpbnQgc3Vic3RyKQoreworICAgIFN1YlN0cmVhbSAqcyA9ICZtLT5zdWJzdHJlYW1bc3Vic3RyXTsKKyAgICB1bnNpZ25lZCBpbnQgY2g7CisgICAgaW50IHN5bmNfd29yZCwgdG1wOworICAgIHVpbnQ4X3QgY2hlY2tzdW07CisgICAgdWludDhfdCBsb3NzbGVzc19jaGVjazsKKyAgICBpbnQgc3RhcnRfY291bnQgPSBnZXRfYml0c19jb3VudChnYnApOworICAgIGludCBtaW5fY2hhbm5lbCwgbWF4X2NoYW5uZWwsIG1heF9tYXRyaXhfY2hhbm5lbDsKKyAgICBjb25zdCBpbnQgc3RkX21heF9tYXRyaXhfY2hhbm5lbCA9IG0tPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NTFAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1BWF9NQVRSSVhfQ0hBTk5FTF9NTFAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1BWF9NQVRSSVhfQ0hBTk5FTF9UUlVFSEQ7CisKKyAgICBzeW5jX3dvcmQgPSBnZXRfYml0cyhnYnAsIDEzKTsKKworICAgIGlmIChzeW5jX3dvcmQgIT0gMHgzMWVhID4+IDEpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAicmVzdGFydCBoZWFkZXIgc3luYyBpbmNvcnJlY3QgKGdvdCAweCUwNHgpXG4iLCBzeW5jX3dvcmQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5ub2lzZV90eXBlID0gZ2V0X2JpdHMxKGdicCk7CisKKyAgICBpZiAobS0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01MUCAmJiBzLT5ub2lzZV90eXBlKSB7CisgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTUxQIG11c3QgaGF2ZSAweDMxZWEgc3luYyB3b3JkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHNraXBfYml0cyhnYnAsIDE2KTsgLyogT3V0cHV0IHRpbWVzdGFtcCAqLworCisgICAgbWluX2NoYW5uZWwgICAgICAgID0gZ2V0X2JpdHMoZ2JwLCA0KTsKKyAgICBtYXhfY2hhbm5lbCAgICAgICAgPSBnZXRfYml0cyhnYnAsIDQpOworICAgIG1heF9tYXRyaXhfY2hhbm5lbCA9IGdldF9iaXRzKGdicCwgNCk7CisKKyAgICBpZiAobWF4X21hdHJpeF9jaGFubmVsID4gc3RkX21heF9tYXRyaXhfY2hhbm5lbCkgeworICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJNYXggbWF0cml4IGNoYW5uZWwgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAlZC5cbiIsCisgICAgICAgICAgICAgICBzdGRfbWF4X21hdHJpeF9jaGFubmVsKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKG1heF9jaGFubmVsICE9IG1heF9tYXRyaXhfY2hhbm5lbCkgeworICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJNYXggY2hhbm5lbCBtdXN0IGJlIGVxdWFsIG1heCBtYXRyaXggY2hhbm5lbC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBUaGlzIHNob3VsZCBoYXBwZW4gZm9yIFRydWVIRCBzdHJlYW1zIHdpdGggPjYgY2hhbm5lbHMgYW5kIE1MUCdzIG5vaXNlCisgICAgICogdHlwZS4gSXQgaXMgbm90IHlldCBrbm93biBpZiB0aGlzIGlzIGFsbG93ZWQuICovCisgICAgaWYgKG1heF9jaGFubmVsID4gTUFYX01BVFJJWF9DSEFOTkVMX01MUCAmJiAhcy0+bm9pc2VfdHlwZSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUobS0+YXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgY2hhbm5lbHMgKG1vcmUgdGhhbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heGltdW0gc3VwcG9ydGVkIGJ5IHRoZSBkZWNvZGVyKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY2hhbm5lbCArIDIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKG1pbl9jaGFubmVsID4gbWF4X2NoYW5uZWwpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiU3Vic3RyZWFtIG1pbiBjaGFubmVsIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gbWF4IGNoYW5uZWwuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+bWluX2NoYW5uZWwgICAgICAgID0gbWluX2NoYW5uZWw7CisgICAgcy0+bWF4X2NoYW5uZWwgICAgICAgID0gbWF4X2NoYW5uZWw7CisgICAgcy0+bWF4X21hdHJpeF9jaGFubmVsID0gbWF4X21hdHJpeF9jaGFubmVsOworCisjaWYgRkZfQVBJX1JFUVVFU1RfQ0hBTk5FTFMKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBpZiAobS0+YXZjdHgtPnJlcXVlc3RfY2hhbm5lbHMgPiAwICYmCisgICAgICAgIG0tPmF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxzIDw9IHMtPm1heF9jaGFubmVsICsgMSAmJgorICAgICAgICBtLT5tYXhfZGVjb2RlZF9zdWJzdHJlYW0gPiBzdWJzdHIpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiRXh0cmFjdGluZyAlZC1jaGFubmVsIGRvd25taXggZnJvbSBzdWJzdHJlYW0gJWQuICIKKyAgICAgICAgICAgICAgICJGdXJ0aGVyIHN1YnN0cmVhbXMgd2lsbCBiZSBza2lwcGVkLlxuIiwKKyAgICAgICAgICAgICAgIHMtPm1heF9jaGFubmVsICsgMSwgc3Vic3RyKTsKKyAgICAgICAgbS0+bWF4X2RlY29kZWRfc3Vic3RyZWFtID0gc3Vic3RyOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgfSBlbHNlCisjZW5kaWYKKyAgICBpZiAobS0+YXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiYgKHMtPmNoX2xheW91dCAmIG0tPmF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0KSA9PQorICAgICAgICBtLT5hdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCAmJiBtLT5tYXhfZGVjb2RlZF9zdWJzdHJlYW0gPiBzdWJzdHIpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiRXh0cmFjdGluZyAlZC1jaGFubmVsIGRvd25taXggKDB4JSJQUkl4NjQiKSBmcm9tIHN1YnN0cmVhbSAlZC4gIgorICAgICAgICAgICAgICAgIkZ1cnRoZXIgc3Vic3RyZWFtcyB3aWxsIGJlIHNraXBwZWQuXG4iLAorICAgICAgICAgICAgICAgcy0+bWF4X2NoYW5uZWwgKyAxLCBzLT5jaF9sYXlvdXQsIHN1YnN0cik7CisgICAgICAgIG0tPm1heF9kZWNvZGVkX3N1YnN0cmVhbSA9IHN1YnN0cjsKKyAgICB9CisKKyAgICBzLT5ub2lzZV9zaGlmdCAgID0gZ2V0X2JpdHMoZ2JwLCAgNCk7CisgICAgcy0+bm9pc2VnZW5fc2VlZCA9IGdldF9iaXRzKGdicCwgMjMpOworCisgICAgc2tpcF9iaXRzKGdicCwgMTkpOworCisgICAgcy0+ZGF0YV9jaGVja19wcmVzZW50ID0gZ2V0X2JpdHMxKGdicCk7CisgICAgbG9zc2xlc3NfY2hlY2sgPSBnZXRfYml0cyhnYnAsIDgpOworICAgIGlmIChzdWJzdHIgPT0gbS0+bWF4X2RlY29kZWRfc3Vic3RyZWFtCisgICAgICAgICYmIHMtPmxvc3NsZXNzX2NoZWNrX2RhdGEgIT0gMHhmZmZmZmZmZikgeworICAgICAgICB0bXAgPSB4b3JfMzJfdG9fOChzLT5sb3NzbGVzc19jaGVja19kYXRhKTsKKyAgICAgICAgaWYgKHRtcCAhPSBsb3NzbGVzc19jaGVjaykKKyAgICAgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkxvc3NsZXNzIGNoZWNrIGZhaWxlZCAtIGV4cGVjdGVkICUwMngsIGNhbGN1bGF0ZWQgJTAyeC5cbiIsCisgICAgICAgICAgICAgICAgICAgbG9zc2xlc3NfY2hlY2ssIHRtcCk7CisgICAgfQorCisgICAgc2tpcF9iaXRzKGdicCwgMTYpOworCisgICAgbWVtc2V0KHMtPmNoX2Fzc2lnbiwgMCwgc2l6ZW9mKHMtPmNoX2Fzc2lnbikpOworCisgICAgZm9yIChjaCA9IDA7IGNoIDw9IHMtPm1heF9tYXRyaXhfY2hhbm5lbDsgY2grKykgeworICAgICAgICBpbnQgY2hfYXNzaWduID0gZ2V0X2JpdHMoZ2JwLCA2KTsKKyAgICAgICAgaWYgKG0tPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9UUlVFSEQpIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGNoYW5uZWwgPSB0aGRfY2hhbm5lbF9sYXlvdXRfZXh0cmFjdF9jaGFubmVsKHMtPmNoX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoX2Fzc2lnbik7CisgICAgICAgICAgICBjaF9hc3NpZ24gPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfY2hhbm5lbF9pbmRleChzLT5jaF9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hfYXNzaWduIDwgMCB8fCBjaF9hc3NpZ24gPiBzLT5tYXhfbWF0cml4X2NoYW5uZWwpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShtLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzaWdubWVudCBvZiBtYXRyaXggY2hhbm5lbCAlZCB0byBpbnZhbGlkIG91dHB1dCBjaGFubmVsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCwgY2hfYXNzaWduKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBzLT5jaF9hc3NpZ25bY2hfYXNzaWduXSA9IGNoOworICAgIH0KKworICAgIGNoZWNrc3VtID0gZmZfbWxwX3Jlc3RhcnRfY2hlY2tzdW0oYnVmLCBnZXRfYml0c19jb3VudChnYnApIC0gc3RhcnRfY291bnQpOworCisgICAgaWYgKGNoZWNrc3VtICE9IGdldF9iaXRzKGdicCwgOCkpCisgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicmVzdGFydCBoZWFkZXIgY2hlY2tzdW0gZXJyb3JcbiIpOworCisgICAgLyogU2V0IGRlZmF1bHQgZGVjb2RpbmcgcGFyYW1ldGVycy4gKi8KKyAgICBzLT5wYXJhbV9wcmVzZW5jZV9mbGFncyAgID0gMHhmZjsKKyAgICBzLT5udW1fcHJpbWl0aXZlX21hdHJpY2VzID0gMDsKKyAgICBzLT5ibG9ja3NpemUgICAgICAgICAgICAgID0gODsKKyAgICBzLT5sb3NzbGVzc19jaGVja19kYXRhICAgID0gMDsKKworICAgIG1lbXNldChzLT5vdXRwdXRfc2hpZnQgICAsIDAsIHNpemVvZihzLT5vdXRwdXRfc2hpZnQgICApKTsKKyAgICBtZW1zZXQocy0+cXVhbnRfc3RlcF9zaXplLCAwLCBzaXplb2Yocy0+cXVhbnRfc3RlcF9zaXplKSk7CisKKyAgICBmb3IgKGNoID0gcy0+bWluX2NoYW5uZWw7IGNoIDw9IHMtPm1heF9jaGFubmVsOyBjaCsrKSB7CisgICAgICAgIENoYW5uZWxQYXJhbXMgKmNwID0gJnMtPmNoYW5uZWxfcGFyYW1zW2NoXTsKKyAgICAgICAgY3AtPmZpbHRlcl9wYXJhbXNbRklSXS5vcmRlciA9IDA7CisgICAgICAgIGNwLT5maWx0ZXJfcGFyYW1zW0lJUl0ub3JkZXIgPSAwOworICAgICAgICBjcC0+ZmlsdGVyX3BhcmFtc1tGSVJdLnNoaWZ0ID0gMDsKKyAgICAgICAgY3AtPmZpbHRlcl9wYXJhbXNbSUlSXS5zaGlmdCA9IDA7CisKKyAgICAgICAgLyogRGVmYXVsdCBhdWRpbyBjb2RpbmcgaXMgMjQtYml0IHJhdyBQQ00uICovCisgICAgICAgIGNwLT5odWZmX29mZnNldCAgICAgID0gMDsKKyAgICAgICAgY3AtPnNpZ25faHVmZl9vZmZzZXQgPSAoLTEpIDw8IDIzOworICAgICAgICBjcC0+Y29kZWJvb2sgICAgICAgICA9IDA7CisgICAgICAgIGNwLT5odWZmX2xzYnMgICAgICAgID0gMjQ7CisgICAgfQorCisgICAgaWYgKHN1YnN0ciA9PSBtLT5tYXhfZGVjb2RlZF9zdWJzdHJlYW0pIHsKKyAgICAgICAgbS0+YXZjdHgtPmNoYW5uZWxzICAgICAgID0gcy0+bWF4X21hdHJpeF9jaGFubmVsICsgMTsKKyAgICAgICAgbS0+YXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gcy0+Y2hfbGF5b3V0OworICAgICAgICBtLT5kc3AubWxwX3BhY2tfb3V0cHV0ID0gbS0+ZHNwLm1scF9zZWxlY3RfcGFja19vdXRwdXQocy0+Y2hfYXNzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+b3V0cHV0X3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF4X21hdHJpeF9jaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+YXZjdHgtPnNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIpOworCisgICAgICAgIGlmIChtLT5hdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUxQICYmIG0tPm5lZWRzX3Jlb3JkZXJpbmcpIHsKKyAgICAgICAgICAgIGlmIChtLT5hdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPT0gKEFWX0NIX0xBWU9VVF9RVUFEfEFWX0NIX0xPV19GUkVRVUVOQ1kpIHx8CisgICAgICAgICAgICAgICAgbS0+YXZjdHgtPmNoYW5uZWxfbGF5b3V0ID09IEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0spIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IHMtPmNoX2Fzc2lnbls0XTsKKyAgICAgICAgICAgICAgICBzLT5jaF9hc3NpZ25bNF0gPSBzLT5jaF9hc3NpZ25bM107CisgICAgICAgICAgICAgICAgcy0+Y2hfYXNzaWduWzNdID0gcy0+Y2hfYXNzaWduWzJdOworICAgICAgICAgICAgICAgIHMtPmNoX2Fzc2lnblsyXSA9IGk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG0tPmF2Y3R4LT5jaGFubmVsX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLKSB7CisgICAgICAgICAgICAgICAgRkZTV0FQKGludCwgcy0+Y2hfYXNzaWduWzJdLCBzLT5jaF9hc3NpZ25bNF0pOworICAgICAgICAgICAgICAgIEZGU1dBUChpbnQsIHMtPmNoX2Fzc2lnblszXSwgcy0+Y2hfYXNzaWduWzVdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBSZWFkIHBhcmFtZXRlcnMgZm9yIG9uZSBvZiB0aGUgcHJlZGljdGlvbiBmaWx0ZXJzLiAqLworCitzdGF0aWMgaW50IHJlYWRfZmlsdGVyX3BhcmFtcyhNTFBEZWNvZGVDb250ZXh0ICptLCBHZXRCaXRDb250ZXh0ICpnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3Vic3RyLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmaWx0ZXIpCit7CisgICAgU3ViU3RyZWFtICpzID0gJm0tPnN1YnN0cmVhbVtzdWJzdHJdOworICAgIEZpbHRlclBhcmFtcyAqZnAgPSAmcy0+Y2hhbm5lbF9wYXJhbXNbY2hhbm5lbF0uZmlsdGVyX3BhcmFtc1tmaWx0ZXJdOworICAgIGNvbnN0IGludCBtYXhfb3JkZXIgPSBmaWx0ZXIgPyBNQVhfSUlSX09SREVSIDogTUFYX0ZJUl9PUkRFUjsKKyAgICBjb25zdCBjaGFyIGZjaGFyID0gZmlsdGVyID8gJ0knIDogJ0YnOworICAgIGludCBpLCBvcmRlcjsKKworICAgIC8vIEZpbHRlciBpcyAwIGZvciBGSVIsIDEgZm9yIElJUi4KKyAgICBhdl9hc3NlcnQwKGZpbHRlciA8IDIpOworCisgICAgaWYgKG0tPmZpbHRlcl9jaGFuZ2VkW2NoYW5uZWxdW2ZpbHRlcl0rKyA+IDEpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJGaWx0ZXJzIG1heSBjaGFuZ2Ugb25seSBvbmNlIHBlciBhY2Nlc3MgdW5pdC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBvcmRlciA9IGdldF9iaXRzKGdicCwgNCk7CisgICAgaWYgKG9yZGVyID4gbWF4X29yZGVyKSB7CisgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIiVjSVIgZmlsdGVyIG9yZGVyICVkIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtICVkLlxuIiwKKyAgICAgICAgICAgICAgIGZjaGFyLCBvcmRlciwgbWF4X29yZGVyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGZwLT5vcmRlciA9IG9yZGVyOworCisgICAgaWYgKG9yZGVyID4gMCkgeworICAgICAgICBpbnQzMl90ICpmY29lZmYgPSBzLT5jaGFubmVsX3BhcmFtc1tjaGFubmVsXS5jb2VmZltmaWx0ZXJdOworICAgICAgICBpbnQgY29lZmZfYml0cywgY29lZmZfc2hpZnQ7CisKKyAgICAgICAgZnAtPnNoaWZ0ID0gZ2V0X2JpdHMoZ2JwLCA0KTsKKworICAgICAgICBjb2VmZl9iaXRzICA9IGdldF9iaXRzKGdicCwgNSk7CisgICAgICAgIGNvZWZmX3NoaWZ0ID0gZ2V0X2JpdHMoZ2JwLCAzKTsKKyAgICAgICAgaWYgKGNvZWZmX2JpdHMgPCAxIHx8IGNvZWZmX2JpdHMgPiAxNikgeworICAgICAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVjSVIgZmlsdGVyIGNvZWZmX2JpdHMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDE2LlxuIiwKKyAgICAgICAgICAgICAgICAgICBmY2hhcik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29lZmZfYml0cyArIGNvZWZmX3NoaWZ0ID4gMTYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJTdW0gb2YgY29lZmZfYml0cyBhbmQgY29lZmZfc2hpZnQgZm9yICVjSVIgZmlsdGVyIG11c3QgYmUgMTYgb3IgbGVzcy5cbiIsCisgICAgICAgICAgICAgICAgICAgZmNoYXIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXI7IGkrKykKKyAgICAgICAgICAgIGZjb2VmZltpXSA9IGdldF9zYml0cyhnYnAsIGNvZWZmX2JpdHMpIDw8IGNvZWZmX3NoaWZ0OworCisgICAgICAgIGlmIChnZXRfYml0czEoZ2JwKSkgeworICAgICAgICAgICAgaW50IHN0YXRlX2JpdHMsIHN0YXRlX3NoaWZ0OworCisgICAgICAgICAgICBpZiAoZmlsdGVyID09IEZJUikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRklSIGZpbHRlciBoYXMgc3RhdGUgZGF0YSBzcGVjaWZpZWQuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGVfYml0cyAgPSBnZXRfYml0cyhnYnAsIDQpOworICAgICAgICAgICAgc3RhdGVfc2hpZnQgPSBnZXRfYml0cyhnYnAsIDQpOworCisgICAgICAgICAgICAvKiBUT0RPOiBDaGVjayB2YWxpZGl0eSBvZiBzdGF0ZSBkYXRhLiAqLworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXI7IGkrKykKKyAgICAgICAgICAgICAgICBmcC0+c3RhdGVbaV0gPSBzdGF0ZV9iaXRzID8gZ2V0X3NiaXRzKGdicCwgc3RhdGVfYml0cykgPDwgc3RhdGVfc2hpZnQgOiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBSZWFkIHBhcmFtZXRlcnMgZm9yIHByaW1pdGl2ZSBtYXRyaWNlcy4gKi8KKworc3RhdGljIGludCByZWFkX21hdHJpeF9wYXJhbXMoTUxQRGVjb2RlQ29udGV4dCAqbSwgdW5zaWduZWQgaW50IHN1YnN0ciwgR2V0Qml0Q29udGV4dCAqZ2JwKQoreworICAgIFN1YlN0cmVhbSAqcyA9ICZtLT5zdWJzdHJlYW1bc3Vic3RyXTsKKyAgICB1bnNpZ25lZCBpbnQgbWF0LCBjaDsKKyAgICBjb25zdCBpbnQgbWF4X3ByaW1pdGl2ZV9tYXRyaWNlcyA9IG0tPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NTFAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1BWF9NQVRSSUNFU19NTFAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1BWF9NQVRSSUNFU19UUlVFSEQ7CisKKyAgICBpZiAobS0+bWF0cml4X2NoYW5nZWQrKyA+IDEpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJNYXRyaWNlcyBtYXkgY2hhbmdlIG9ubHkgb25jZSBwZXIgYWNjZXNzIHVuaXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+bnVtX3ByaW1pdGl2ZV9tYXRyaWNlcyA9IGdldF9iaXRzKGdicCwgNCk7CisKKyAgICBpZiAocy0+bnVtX3ByaW1pdGl2ZV9tYXRyaWNlcyA+IG1heF9wcmltaXRpdmVfbWF0cmljZXMpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTnVtYmVyIG9mIHByaW1pdGl2ZSBtYXRyaWNlcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICVkLlxuIiwKKyAgICAgICAgICAgICAgIG1heF9wcmltaXRpdmVfbWF0cmljZXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmb3IgKG1hdCA9IDA7IG1hdCA8IHMtPm51bV9wcmltaXRpdmVfbWF0cmljZXM7IG1hdCsrKSB7CisgICAgICAgIGludCBmcmFjX2JpdHMsIG1heF9jaGFuOworICAgICAgICBzLT5tYXRyaXhfb3V0X2NoW21hdF0gPSBnZXRfYml0cyhnYnAsIDQpOworICAgICAgICBmcmFjX2JpdHMgICAgICAgICAgICAgPSBnZXRfYml0cyhnYnAsIDQpOworICAgICAgICBzLT5sc2JfYnlwYXNzICAgW21hdF0gPSBnZXRfYml0czEoZ2JwKTsKKworICAgICAgICBpZiAocy0+bWF0cml4X291dF9jaFttYXRdID4gcy0+bWF4X21hdHJpeF9jaGFubmVsKSB7CisgICAgICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2hhbm5lbCAlZCBzcGVjaWZpZWQgYXMgb3V0cHV0IGZyb20gbWF0cml4LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgcy0+bWF0cml4X291dF9jaFttYXRdKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChmcmFjX2JpdHMgPiAxNCkgeworICAgICAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJUb28gbWFueSBmcmFjdGlvbmFsIGJpdHMgc3BlY2lmaWVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIG1heF9jaGFuID0gcy0+bWF4X21hdHJpeF9jaGFubmVsOworICAgICAgICBpZiAoIXMtPm5vaXNlX3R5cGUpCisgICAgICAgICAgICBtYXhfY2hhbis9MjsKKworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPD0gbWF4X2NoYW47IGNoKyspIHsKKyAgICAgICAgICAgIGludCBjb2VmZl92YWwgPSAwOworICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYnApKQorICAgICAgICAgICAgICAgIGNvZWZmX3ZhbCA9IGdldF9zYml0cyhnYnAsIGZyYWNfYml0cyArIDIpOworCisgICAgICAgICAgICBzLT5tYXRyaXhfY29lZmZbbWF0XVtjaF0gPSBjb2VmZl92YWwgPDwgKDE0IC0gZnJhY19iaXRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5ub2lzZV90eXBlKQorICAgICAgICAgICAgcy0+bWF0cml4X25vaXNlX3NoaWZ0W21hdF0gPSBnZXRfYml0cyhnYnAsIDQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5tYXRyaXhfbm9pc2Vfc2hpZnRbbWF0XSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBSZWFkIGNoYW5uZWwgcGFyYW1ldGVycy4gKi8KKworc3RhdGljIGludCByZWFkX2NoYW5uZWxfcGFyYW1zKE1MUERlY29kZUNvbnRleHQgKm0sIHVuc2lnbmVkIGludCBzdWJzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2JwLCB1bnNpZ25lZCBpbnQgY2gpCit7CisgICAgU3ViU3RyZWFtICpzID0gJm0tPnN1YnN0cmVhbVtzdWJzdHJdOworICAgIENoYW5uZWxQYXJhbXMgKmNwID0gJnMtPmNoYW5uZWxfcGFyYW1zW2NoXTsKKyAgICBGaWx0ZXJQYXJhbXMgKmZpciA9ICZjcC0+ZmlsdGVyX3BhcmFtc1tGSVJdOworICAgIEZpbHRlclBhcmFtcyAqaWlyID0gJmNwLT5maWx0ZXJfcGFyYW1zW0lJUl07CisgICAgaW50IHJldDsKKworICAgIGlmIChzLT5wYXJhbV9wcmVzZW5jZV9mbGFncyAmIFBBUkFNX0ZJUikKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYnApKQorICAgICAgICAgICAgaWYgKChyZXQgPSByZWFkX2ZpbHRlcl9wYXJhbXMobSwgZ2JwLCBzdWJzdHIsIGNoLCBGSVIpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChzLT5wYXJhbV9wcmVzZW5jZV9mbGFncyAmIFBBUkFNX0lJUikKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYnApKQorICAgICAgICAgICAgaWYgKChyZXQgPSByZWFkX2ZpbHRlcl9wYXJhbXMobSwgZ2JwLCBzdWJzdHIsIGNoLCBJSVIpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChmaXItPm9yZGVyICsgaWlyLT5vcmRlciA+IDgpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb3RhbCBmaWx0ZXIgb3JkZXJzIHRvbyBoaWdoLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChmaXItPm9yZGVyICYmIGlpci0+b3JkZXIgJiYKKyAgICAgICAgZmlyLT5zaGlmdCAhPSBpaXItPnNoaWZ0KSB7CisgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJGSVIgYW5kIElJUiBmaWx0ZXJzIG11c3QgdXNlIHRoZSBzYW1lIHByZWNpc2lvbi5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgLyogVGhlIEZJUiBhbmQgSUlSIGZpbHRlcnMgbXVzdCBoYXZlIHRoZSBzYW1lIHByZWNpc2lvbi4KKyAgICAgKiBUbyBzaW1wbGlmeSB0aGUgZmlsdGVyaW5nIGNvZGUsIG9ubHkgdGhlIHByZWNpc2lvbiBvZiB0aGUKKyAgICAgKiBGSVIgZmlsdGVyIGlzIGNvbnNpZGVyZWQuIElmIG9ubHkgdGhlIElJUiBmaWx0ZXIgaXMgZW1wbG95ZWQsCisgICAgICogdGhlIEZJUiBmaWx0ZXIgcHJlY2lzaW9uIGlzIHNldCB0byB0aGF0IG9mIHRoZSBJSVIgZmlsdGVyLCBzbworICAgICAqIHRoYXQgdGhlIGZpbHRlcmluZyBjb2RlIGNhbiB1c2UgaXQuICovCisgICAgaWYgKCFmaXItPm9yZGVyICYmIGlpci0+b3JkZXIpCisgICAgICAgIGZpci0+c2hpZnQgPSBpaXItPnNoaWZ0OworCisgICAgaWYgKHMtPnBhcmFtX3ByZXNlbmNlX2ZsYWdzICYgUEFSQU1fSFVGRk9GRlNFVCkKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYnApKQorICAgICAgICAgICAgY3AtPmh1ZmZfb2Zmc2V0ID0gZ2V0X3NiaXRzKGdicCwgMTUpOworCisgICAgY3AtPmNvZGVib29rICA9IGdldF9iaXRzKGdicCwgMik7CisgICAgY3AtPmh1ZmZfbHNicyA9IGdldF9iaXRzKGdicCwgNSk7CisKKyAgICBpZiAoY3AtPmh1ZmZfbHNicyA+IDI0KSB7CisgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBodWZmX2xzYnMuXG4iKTsKKyAgICAgICAgY3AtPmh1ZmZfbHNicyA9IDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGNwLT5zaWduX2h1ZmZfb2Zmc2V0ID0gY2FsY3VsYXRlX3NpZ25faHVmZihtLCBzdWJzdHIsIGNoKTsKKworICAgIHJldHVybiAwOworfQorCisvKiogUmVhZCBkZWNvZGluZyBwYXJhbWV0ZXJzIHRoYXQgY2hhbmdlIG1vcmUgb2Z0ZW4gdGhhbiB0aG9zZSBpbiB0aGUgcmVzdGFydAorICogIGhlYWRlci4gKi8KKworc3RhdGljIGludCByZWFkX2RlY29kaW5nX3BhcmFtcyhNTFBEZWNvZGVDb250ZXh0ICptLCBHZXRCaXRDb250ZXh0ICpnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdWJzdHIpCit7CisgICAgU3ViU3RyZWFtICpzID0gJm0tPnN1YnN0cmVhbVtzdWJzdHJdOworICAgIHVuc2lnbmVkIGludCBjaDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHMtPnBhcmFtX3ByZXNlbmNlX2ZsYWdzICYgUEFSQU1fUFJFU0VOQ0UpCisgICAgICAgIGlmIChnZXRfYml0czEoZ2JwKSkKKyAgICAgICAgICAgIHMtPnBhcmFtX3ByZXNlbmNlX2ZsYWdzID0gZ2V0X2JpdHMoZ2JwLCA4KTsKKworICAgIGlmIChzLT5wYXJhbV9wcmVzZW5jZV9mbGFncyAmIFBBUkFNX0JMT0NLU0laRSkKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYnApKSB7CisgICAgICAgICAgICBzLT5ibG9ja3NpemUgPSBnZXRfYml0cyhnYnAsIDkpOworICAgICAgICAgICAgaWYgKHMtPmJsb2Nrc2l6ZSA8IDggfHwgcy0+YmxvY2tzaXplID4gbS0+YWNjZXNzX3VuaXRfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBibG9ja3NpemUuXG4iKTsKKyAgICAgICAgICAgICAgICBzLT5ibG9ja3NpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBpZiAocy0+cGFyYW1fcHJlc2VuY2VfZmxhZ3MgJiBQQVJBTV9NQVRSSVgpCisgICAgICAgIGlmIChnZXRfYml0czEoZ2JwKSkKKyAgICAgICAgICAgIGlmICgocmV0ID0gcmVhZF9tYXRyaXhfcGFyYW1zKG0sIHN1YnN0ciwgZ2JwKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+cGFyYW1fcHJlc2VuY2VfZmxhZ3MgJiBQQVJBTV9PVVRTSElGVCkKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYnApKSB7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPD0gcy0+bWF4X21hdHJpeF9jaGFubmVsOyBjaCsrKQorICAgICAgICAgICAgICAgIHMtPm91dHB1dF9zaGlmdFtjaF0gPSBnZXRfc2JpdHMoZ2JwLCA0KTsKKyAgICAgICAgICAgIGlmIChzdWJzdHIgPT0gbS0+bWF4X2RlY29kZWRfc3Vic3RyZWFtKQorICAgICAgICAgICAgICAgIG0tPmRzcC5tbHBfcGFja19vdXRwdXQgPSBtLT5kc3AubWxwX3NlbGVjdF9wYWNrX291dHB1dChzLT5jaF9hc3NpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dHB1dF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF4X21hdHJpeF9jaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5hdmN0eC0+c2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMik7CisgICAgICAgIH0KKworICAgIGlmIChzLT5wYXJhbV9wcmVzZW5jZV9mbGFncyAmIFBBUkFNX1FVQU5UU1RFUCkKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYnApKQorICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDw9IHMtPm1heF9jaGFubmVsOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgQ2hhbm5lbFBhcmFtcyAqY3AgPSAmcy0+Y2hhbm5lbF9wYXJhbXNbY2hdOworCisgICAgICAgICAgICAgICAgcy0+cXVhbnRfc3RlcF9zaXplW2NoXSA9IGdldF9iaXRzKGdicCwgNCk7CisKKyAgICAgICAgICAgICAgICBjcC0+c2lnbl9odWZmX29mZnNldCA9IGNhbGN1bGF0ZV9zaWduX2h1ZmYobSwgc3Vic3RyLCBjaCk7CisgICAgICAgICAgICB9CisKKyAgICBmb3IgKGNoID0gcy0+bWluX2NoYW5uZWw7IGNoIDw9IHMtPm1heF9jaGFubmVsOyBjaCsrKQorICAgICAgICBpZiAoZ2V0X2JpdHMxKGdicCkpCisgICAgICAgICAgICBpZiAoKHJldCA9IHJlYWRfY2hhbm5lbF9wYXJhbXMobSwgc3Vic3RyLCBnYnAsIGNoKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBNU0JfTUFTSyhiaXRzKSAgKC0xdSA8PCAoYml0cykpCisKKy8qKiBHZW5lcmF0ZSBQQ00gc2FtcGxlcyB1c2luZyB0aGUgcHJlZGljdGlvbiBmaWx0ZXJzIGFuZCByZXNpZHVhbCB2YWx1ZXMKKyAqICByZWFkIGZyb20gdGhlIGRhdGEgc3RyZWFtLCBhbmQgdXBkYXRlIHRoZSBmaWx0ZXIgc3RhdGUuICovCisKK3N0YXRpYyB2b2lkIGZpbHRlcl9jaGFubmVsKE1MUERlY29kZUNvbnRleHQgKm0sIHVuc2lnbmVkIGludCBzdWJzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKyAgICBTdWJTdHJlYW0gKnMgPSAmbS0+c3Vic3RyZWFtW3N1YnN0cl07CisgICAgY29uc3QgaW50MzJfdCAqZmlyY29lZmYgPSBzLT5jaGFubmVsX3BhcmFtc1tjaGFubmVsXS5jb2VmZltGSVJdOworICAgIGludDMyX3Qgc3RhdGVfYnVmZmVyW05VTV9GSUxURVJTXVtNQVhfQkxPQ0tTSVpFICsgTUFYX0ZJUl9PUkRFUl07CisgICAgaW50MzJfdCAqZmlyYnVmID0gc3RhdGVfYnVmZmVyW0ZJUl0gKyBNQVhfQkxPQ0tTSVpFOworICAgIGludDMyX3QgKmlpcmJ1ZiA9IHN0YXRlX2J1ZmZlcltJSVJdICsgTUFYX0JMT0NLU0laRTsKKyAgICBGaWx0ZXJQYXJhbXMgKmZpciA9ICZzLT5jaGFubmVsX3BhcmFtc1tjaGFubmVsXS5maWx0ZXJfcGFyYW1zW0ZJUl07CisgICAgRmlsdGVyUGFyYW1zICppaXIgPSAmcy0+Y2hhbm5lbF9wYXJhbXNbY2hhbm5lbF0uZmlsdGVyX3BhcmFtc1tJSVJdOworICAgIHVuc2lnbmVkIGludCBmaWx0ZXJfc2hpZnQgPSBmaXItPnNoaWZ0OworICAgIGludDMyX3QgbWFzayA9IE1TQl9NQVNLKHMtPnF1YW50X3N0ZXBfc2l6ZVtjaGFubmVsXSk7CisKKyAgICBtZW1jcHkoZmlyYnVmLCBmaXItPnN0YXRlLCBNQVhfRklSX09SREVSICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICBtZW1jcHkoaWlyYnVmLCBpaXItPnN0YXRlLCBNQVhfSUlSX09SREVSICogc2l6ZW9mKGludDMyX3QpKTsKKworICAgIG0tPmRzcC5tbHBfZmlsdGVyX2NoYW5uZWwoZmlyYnVmLCBmaXJjb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpci0+b3JkZXIsIGlpci0+b3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfc2hpZnQsIG1hc2ssIHMtPmJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLT5zYW1wbGVfYnVmZmVyW3MtPmJsb2NrcG9zXVtjaGFubmVsXSk7CisKKyAgICBtZW1jcHkoZmlyLT5zdGF0ZSwgZmlyYnVmIC0gcy0+YmxvY2tzaXplLCBNQVhfRklSX09SREVSICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICBtZW1jcHkoaWlyLT5zdGF0ZSwgaWlyYnVmIC0gcy0+YmxvY2tzaXplLCBNQVhfSUlSX09SREVSICogc2l6ZW9mKGludDMyX3QpKTsKK30KKworLyoqIFJlYWQgYSBibG9jayBvZiBQQ00gcmVzaWR1YWwgZGF0YSAob3IgYWN0dWFsIGlmIG5vIGZpbHRlcmluZyBhY3RpdmUpLiAqLworCitzdGF0aWMgaW50IHJlYWRfYmxvY2tfZGF0YShNTFBEZWNvZGVDb250ZXh0ICptLCBHZXRCaXRDb250ZXh0ICpnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3Vic3RyKQoreworICAgIFN1YlN0cmVhbSAqcyA9ICZtLT5zdWJzdHJlYW1bc3Vic3RyXTsKKyAgICB1bnNpZ25lZCBpbnQgaSwgY2gsIGV4cGVjdGVkX3N0cmVhbV9wb3MgPSAwOworICAgIGludCByZXQ7CisKKyAgICBpZiAocy0+ZGF0YV9jaGVja19wcmVzZW50KSB7CisgICAgICAgIGV4cGVjdGVkX3N0cmVhbV9wb3MgID0gZ2V0X2JpdHNfY291bnQoZ2JwKTsKKyAgICAgICAgZXhwZWN0ZWRfc3RyZWFtX3BvcyArPSBnZXRfYml0cyhnYnAsIDE2KTsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKG0tPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1YnN0cmVhbXMgd2l0aCBWTEMgYmxvY2sgc2l6ZSBjaGVjayBpbmZvIik7CisgICAgfQorCisgICAgaWYgKHMtPmJsb2NrcG9zICsgcy0+YmxvY2tzaXplID4gbS0+YWNjZXNzX3VuaXRfc2l6ZSkgeworICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInRvbyBtYW55IGF1ZGlvIHNhbXBsZXMgaW4gZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBtZW1zZXQoJm0tPmJ5cGFzc2VkX2xzYnNbcy0+YmxvY2twb3NdWzBdLCAwLAorICAgICAgICAgICBzLT5ibG9ja3NpemUgKiBzaXplb2YobS0+YnlwYXNzZWRfbHNic1swXSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmJsb2Nrc2l6ZTsgaSsrKQorICAgICAgICBpZiAoKHJldCA9IHJlYWRfaHVmZl9jaGFubmVscyhtLCBnYnAsIHN1YnN0ciwgaSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3IgKGNoID0gcy0+bWluX2NoYW5uZWw7IGNoIDw9IHMtPm1heF9jaGFubmVsOyBjaCsrKQorICAgICAgICBmaWx0ZXJfY2hhbm5lbChtLCBzdWJzdHIsIGNoKTsKKworICAgIHMtPmJsb2NrcG9zICs9IHMtPmJsb2Nrc2l6ZTsKKworICAgIGlmIChzLT5kYXRhX2NoZWNrX3ByZXNlbnQpIHsKKyAgICAgICAgaWYgKGdldF9iaXRzX2NvdW50KGdicCkgIT0gZXhwZWN0ZWRfc3RyZWFtX3BvcykKKyAgICAgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYmxvY2sgZGF0YSBsZW5ndGggbWlzbWF0Y2hcbiIpOworICAgICAgICBza2lwX2JpdHMoZ2JwLCA4KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqIERhdGEgdGFibGUgdXNlZCBmb3IgVHJ1ZUhEIG5vaXNlIGdlbmVyYXRpb24gZnVuY3Rpb24uICovCisKK3N0YXRpYyBjb25zdCBpbnQ4X3Qgbm9pc2VfdGFibGVbMjU2XSA9IHsKKyAgICAgMzAsICA1MSwgIDIyLCAgNTQsICAgMywgICA3LCAgLTQsICAzOCwgIDE0LCAgNTUsICA0NiwgIDgxLCAgMjIsICA1OCwgIC0zLCAgIDIsCisgICAgIDUyLCAgMzEsICAtNywgIDUxLCAgMTUsICA0NCwgIDc0LCAgMzAsICA4NSwgLTE3LCAgMTAsICAzMywgIDE4LCAgODAsICAyOCwgIDYyLAorICAgICAxMCwgIDMyLCAgMjMsICA2OSwgIDcyLCAgMjYsICAzNSwgIDE3LCAgNzMsICA2MCwgICA4LCAgNTYsICAgMiwgICA2LCAgLTIsICAtNSwKKyAgICAgNTEsICAgNCwgIDExLCAgNTAsICA2NiwgIDc2LCAgMjEsICA0NCwgIDMzLCAgNDcsICAgMSwgIDI2LCAgNjQsICA0OCwgIDU3LCAgNDAsCisgICAgIDM4LCAgMTYsIC0xMCwgLTI4LCAgOTIsICAyMiwgLTE4LCAgMjksIC0xMCwgICA1LCAtMTMsICA0OSwgIDE5LCAgMjQsICA3MCwgIDM0LAorICAgICA2MSwgIDQ4LCAgMzAsICAxNCwgIC02LCAgMjUsICA1OCwgIDMzLCAgNDIsICA2MCwgIDY3LCAgMTcsICA1NCwgIDE3LCAgMjIsICAzMCwKKyAgICAgNjcsICA0NCwgIC05LCAgNTAsIC0xMSwgIDQzLCAgNDAsICAzMiwgIDU5LCAgODIsICAxMywgIDQ5LCAtMTQsICA1NSwgIDYwLCAgMzYsCisgICAgIDQ4LCAgNDksICAzMSwgIDQ3LCAgMTUsICAxMiwgICA0LCAgNjUsICAgMSwgIDIzLCAgMjksICAzOSwgIDQ1LCAgLTIsICA4NCwgIDY5LAorICAgICAgMCwgIDcyLCAgMzcsICA1NywgIDI3LCAgNDEsIC0xNSwgLTE2LCAgMzUsICAzMSwgIDE0LCAgNjEsICAyNCwgICAwLCAgMjcsICAyNCwKKyAgICAgMTYsICA0MSwgIDU1LCAgMzQsICA1MywgICA5LCAgNTYsICAxMiwgIDI1LCAgMjksICA1MywgICA1LCAgMjAsIC0yMCwgIC04LCAgMjAsCisgICAgIDEzLCAgMjgsICAtMywgIDc4LCAgMzgsICAxNiwgIDExLCAgNjIsICA0NiwgIDI5LCAgMjEsICAyNCwgIDQ2LCAgNjUsICA0MywgLTIzLAorICAgICA4OSwgIDE4LCAgNzQsICAyMSwgIDM4LCAtMTIsICAxOSwgIDEyLCAtMTksICAgOCwgIDE1LCAgMzMsICAgNCwgIDU3LCAgIDksICAtOCwKKyAgICAgMzYsICAzNSwgIDI2LCAgMjgsICAgNywgIDgzLCAgNjMsICA3OSwgIDc1LCAgMTEsICAgMywgIDg3LCAgMzcsICA0NywgIDM0LCAgNDAsCisgICAgIDM5LCAgMTksICAyMCwgIDQyLCAgMjcsICAzNCwgIDM5LCAgNzcsICAxMywgIDQyLCAgNTksICA2NCwgIDQ1LCAgLTEsICAzMiwgIDM3LAorICAgICA0NSwgIC01LCAgNTMsICAtNiwgICA3LCAgMzYsICA1MCwgIDIzLCAgIDYsICAzMiwgICA5LCAtMjEsICAxOCwgIDcxLCAgMjcsICA1MiwKKyAgICAtMjUsICAzMSwgIDM1LCAgNDIsICAtMSwgIDY4LCAgNjMsICA1MiwgIDI2LCAgNDMsICA2NiwgIDM3LCAgNDEsICAyNSwgIDQwLCAgNzAsCit9OworCisvKiogTm9pc2UgZ2VuZXJhdGlvbiBmdW5jdGlvbnMuCisgKiAgSSdtIG5vdCBzdXJlIHdoYXQgdGhlc2UgYXJlIGZvciAtIHRoZXkgc2VlbSB0byBiZSBzb21lIGtpbmQgb2YgcHNldWRvcmFuZG9tCisgKiAgc2VxdWVuY2UgZ2VuZXJhdG9ycywgdXNlZCB0byBnZW5lcmF0ZSBub2lzZSBkYXRhIHdoaWNoIGlzIHVzZWQgd2hlbiB0aGUKKyAqICBjaGFubmVscyBhcmUgcmVtYXRyaXhlZC4gSSdtIG5vdCBzdXJlIGlmIHRoZXkgcHJvdmlkZSBhIHByYWN0aWNhbCBiZW5lZml0CisgKiAgdG8gY29tcHJlc3Npb24sIG9yIGp1c3Qgb2JmdXNjYXRlIHRoZSBkZWNvZGVyLiBBcmUgdGhleSBmb3Igc29tZSBraW5kIG9mCisgKiAgZGl0aGVyaW5nPyAqLworCisvKiogR2VuZXJhdGUgdHdvIGNoYW5uZWxzIG9mIG5vaXNlLCB1c2VkIGluIHRoZSBtYXRyaXggd2hlbgorICogIHJlc3RhcnQgc3luYyB3b3JkID09IDB4MzFlYS4gKi8KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfMl9ub2lzZV9jaGFubmVscyhNTFBEZWNvZGVDb250ZXh0ICptLCB1bnNpZ25lZCBpbnQgc3Vic3RyKQoreworICAgIFN1YlN0cmVhbSAqcyA9ICZtLT5zdWJzdHJlYW1bc3Vic3RyXTsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB1aW50MzJfdCBzZWVkID0gcy0+bm9pc2VnZW5fc2VlZDsKKyAgICB1bnNpZ25lZCBpbnQgbWF4Y2hhbiA9IHMtPm1heF9tYXRyaXhfY2hhbm5lbDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ibG9ja3BvczsgaSsrKSB7CisgICAgICAgIHVpbnQxNl90IHNlZWRfc2hyNyA9IHNlZWQgPj4gNzsKKyAgICAgICAgbS0+c2FtcGxlX2J1ZmZlcltpXVttYXhjaGFuKzFdID0gKChpbnQ4X3QpKHNlZWQgPj4gMTUpKSA8PCBzLT5ub2lzZV9zaGlmdDsKKyAgICAgICAgbS0+c2FtcGxlX2J1ZmZlcltpXVttYXhjaGFuKzJdID0gKChpbnQ4X3QpIHNlZWRfc2hyNykgICA8PCBzLT5ub2lzZV9zaGlmdDsKKworICAgICAgICBzZWVkID0gKHNlZWQgPDwgMTYpIF4gc2VlZF9zaHI3IF4gKHNlZWRfc2hyNyA8PCA1KTsKKyAgICB9CisKKyAgICBzLT5ub2lzZWdlbl9zZWVkID0gc2VlZDsKK30KKworLyoqIEdlbmVyYXRlIGEgYmxvY2sgb2Ygbm9pc2UsIHVzZWQgd2hlbiByZXN0YXJ0IHN5bmMgd29yZCA9PSAweDMxZWIuICovCisKK3N0YXRpYyB2b2lkIGZpbGxfbm9pc2VfYnVmZmVyKE1MUERlY29kZUNvbnRleHQgKm0sIHVuc2lnbmVkIGludCBzdWJzdHIpCit7CisgICAgU3ViU3RyZWFtICpzID0gJm0tPnN1YnN0cmVhbVtzdWJzdHJdOworICAgIHVuc2lnbmVkIGludCBpOworICAgIHVpbnQzMl90IHNlZWQgPSBzLT5ub2lzZWdlbl9zZWVkOworCisgICAgZm9yIChpID0gMDsgaSA8IG0tPmFjY2Vzc191bml0X3NpemVfcG93MjsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3Qgc2VlZF9zaHIxNSA9IHNlZWQgPj4gMTU7CisgICAgICAgIG0tPm5vaXNlX2J1ZmZlcltpXSA9IG5vaXNlX3RhYmxlW3NlZWRfc2hyMTVdOworICAgICAgICBzZWVkID0gKHNlZWQgPDwgOCkgXiBzZWVkX3NocjE1IF4gKHNlZWRfc2hyMTUgPDwgNSk7CisgICAgfQorCisgICAgcy0+bm9pc2VnZW5fc2VlZCA9IHNlZWQ7Cit9CisKKy8qKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLiAqLworCitzdGF0aWMgaW50IG91dHB1dF9kYXRhKE1MUERlY29kZUNvbnRleHQgKm0sIHVuc2lnbmVkIGludCBzdWJzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9mcmFtZV9wdHIpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gbS0+YXZjdHg7CisgICAgU3ViU3RyZWFtICpzID0gJm0tPnN1YnN0cmVhbVtzdWJzdHJdOworICAgIHVuc2lnbmVkIGludCBtYXQ7CisgICAgdW5zaWduZWQgaW50IG1heGNoYW47CisgICAgaW50IHJldDsKKyAgICBpbnQgaXMzMiA9IChtLT5hdmN0eC0+c2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMik7CisKKyAgICBpZiAobS0+YXZjdHgtPmNoYW5uZWxzICE9IHMtPm1heF9tYXRyaXhfY2hhbm5lbCArIDEpIHsKKyAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjaGFubmVsIGNvdW50IG1pc21hdGNoXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCFzLT5ibG9ja3BvcykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIHNhbXBsZXMgdG8gb3V0cHV0LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIG1heGNoYW4gPSBzLT5tYXhfbWF0cml4X2NoYW5uZWw7CisgICAgaWYgKCFzLT5ub2lzZV90eXBlKSB7CisgICAgICAgIGdlbmVyYXRlXzJfbm9pc2VfY2hhbm5lbHMobSwgc3Vic3RyKTsKKyAgICAgICAgbWF4Y2hhbiArPSAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGxfbm9pc2VfYnVmZmVyKG0sIHN1YnN0cik7CisgICAgfQorCisgICAgLyogQXBwbHkgdGhlIGNoYW5uZWwgbWF0cmljZXMgaW4gdHVybiB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgYXVkaW8KKyAgICAgKiBzYW1wbGVzLiAqLworICAgIGZvciAobWF0ID0gMDsgbWF0IDwgcy0+bnVtX3ByaW1pdGl2ZV9tYXRyaWNlczsgbWF0KyspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfY2ggPSBzLT5tYXRyaXhfb3V0X2NoW21hdF07CisgICAgICAgIG0tPmRzcC5tbHBfcmVtYXRyaXhfY2hhbm5lbCgmbS0+c2FtcGxlX2J1ZmZlclswXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1hdHJpeF9jb2VmZlttYXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm0tPmJ5cGFzc2VkX2xzYnNbMF1bbWF0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm5vaXNlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm51bV9wcmltaXRpdmVfbWF0cmljZXMgLSBtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2twb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF0cml4X25vaXNlX3NoaWZ0W21hdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5hY2Nlc3NfdW5pdF9zaXplX3BvdzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0JfTUFTSyhzLT5xdWFudF9zdGVwX3NpemVbZGVzdF9jaF0pKTsKKyAgICB9CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gcy0+YmxvY2twb3M7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzLT5sb3NzbGVzc19jaGVja19kYXRhID0gbS0+ZHNwLm1scF9wYWNrX291dHB1dChzLT5sb3NzbGVzc19jaGVja19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPnNhbXBsZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2hfYXNzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dHB1dF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYXhfbWF0cml4X2NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMzMik7CisKKyAgICAvKiBVcGRhdGUgbWF0cml4IGVuY29kaW5nIHNpZGUgZGF0YSAqLworICAgIGlmICgocmV0ID0gZmZfc2lkZV9kYXRhX3VwZGF0ZV9tYXRyaXhfZW5jb2RpbmcoZnJhbWUsIHMtPm1hdHJpeF9lbmNvZGluZykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiAwOworfQorCisvKiogUmVhZCBhbiBhY2Nlc3MgdW5pdCBmcm9tIHRoZSBzdHJlYW0uCisgKiAgQHJldHVybiBuZWdhdGl2ZSBvbiBlcnJvciwgMCBpZiBub3QgZW5vdWdoIGRhdGEgaXMgcHJlc2VudCBpbiB0aGUgaW5wdXQgc3RyZWFtLAorICogIG90aGVyd2lzZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkLiAqLworCitzdGF0aWMgaW50IHJlYWRfYWNjZXNzX3VuaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIE1MUERlY29kZUNvbnRleHQgKm0gPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgdW5zaWduZWQgaW50IGxlbmd0aCwgc3Vic3RyOworICAgIHVuc2lnbmVkIGludCBzdWJzdHJlYW1fc3RhcnQ7CisgICAgdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gNDsKKyAgICB1bnNpZ25lZCBpbnQgc3Vic3RyX2hlYWRlcl9zaXplID0gMDsKKyAgICB1aW50OF90IHN1YnN0cmVhbV9wYXJpdHlfcHJlc2VudFtNQVhfU1VCU1RSRUFNU107CisgICAgdWludDE2X3Qgc3Vic3RyZWFtX2RhdGFfbGVuW01BWF9TVUJTVFJFQU1TXTsKKyAgICB1aW50OF90IHBhcml0eV9iaXRzOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYnVmX3NpemUgPCA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGxlbmd0aCA9IChBVl9SQjE2KGJ1ZikgJiAweGZmZikgKiAyOworCisgICAgaWYgKGxlbmd0aCA8IDQgfHwgbGVuZ3RoID4gYnVmX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIChidWYgKyA0KSwgKGxlbmd0aCAtIDQpICogOCk7CisKKyAgICBtLT5pc19tYWpvcl9zeW5jX3VuaXQgPSAwOworICAgIGlmIChzaG93X2JpdHNfbG9uZygmZ2IsIDMxKSA9PSAoMHhmODcyNmZiYSA+PiAxKSkgeworICAgICAgICBpZiAocmVhZF9tYWpvcl9zeW5jKG0sICZnYikgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgbS0+aXNfbWFqb3Jfc3luY191bml0ID0gMTsKKyAgICAgICAgaGVhZGVyX3NpemUgKz0gbS0+bWFqb3Jfc3luY19oZWFkZXJfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIW0tPnBhcmFtc192YWxpZCkgeworICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlN0cmVhbSBwYXJhbWV0ZXJzIG5vdCBzZWVuOyBza2lwcGluZyBmcmFtZS5cbiIpOworICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfQorCisgICAgc3Vic3RyZWFtX3N0YXJ0ID0gMDsKKworICAgIGZvciAoc3Vic3RyID0gMDsgc3Vic3RyIDwgbS0+bnVtX3N1YnN0cmVhbXM7IHN1YnN0cisrKSB7CisgICAgICAgIGludCBleHRyYXdvcmRfcHJlc2VudCwgY2hlY2tkYXRhX3ByZXNlbnQsIGVuZCwgbm9ucmVzdGFydF9zdWJzdHI7CisKKyAgICAgICAgZXh0cmF3b3JkX3ByZXNlbnQgPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgbm9ucmVzdGFydF9zdWJzdHIgPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgY2hlY2tkYXRhX3ByZXNlbnQgPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgc2tpcF9iaXRzMSgmZ2IpOworCisgICAgICAgIGVuZCA9IGdldF9iaXRzKCZnYiwgMTIpICogMjsKKworICAgICAgICBzdWJzdHJfaGVhZGVyX3NpemUgKz0gMjsKKworICAgICAgICBpZiAoZXh0cmF3b3JkX3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGlmIChtLT5hdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUxQKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGVyZSBtdXN0IGJlIG5vIGV4dHJhd29yZCBmb3IgTUxQLlxuIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNraXBfYml0cygmZ2IsIDE2KTsKKyAgICAgICAgICAgIHN1YnN0cl9oZWFkZXJfc2l6ZSArPSAyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEobm9ucmVzdGFydF9zdWJzdHIgXiBtLT5pc19tYWpvcl9zeW5jX3VuaXQpKSB7CisgICAgICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbm9ucmVzdGFydF9zdWJzdHIuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5kICsgaGVhZGVyX3NpemUgKyBzdWJzdHJfaGVhZGVyX3NpemUgPiBsZW5ndGgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbmRpY2F0ZWQgbGVuZ3RoIG9mIHN1YnN0cmVhbSAlZCBkYXRhIGdvZXMgb2ZmIGVuZCBvZiAiCisgICAgICAgICAgICAgICAgICAgInBhY2tldC5cbiIsIHN1YnN0cik7CisgICAgICAgICAgICBlbmQgPSBsZW5ndGggLSBoZWFkZXJfc2l6ZSAtIHN1YnN0cl9oZWFkZXJfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmQgPCBzdWJzdHJlYW1fc3RhcnQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbmRpY2F0ZWQgZW5kIG9mZnNldCBvZiBzdWJzdHJlYW0gJWQgZGF0YSAiCisgICAgICAgICAgICAgICAgICAgImlzIHNtYWxsZXIgdGhhbiBjYWxjdWxhdGVkIHN0YXJ0IG9mZnNldC5cbiIsCisgICAgICAgICAgICAgICAgICAgc3Vic3RyKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3Vic3RyID4gbS0+bWF4X2RlY29kZWRfc3Vic3RyZWFtKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgc3Vic3RyZWFtX3Bhcml0eV9wcmVzZW50W3N1YnN0cl0gPSBjaGVja2RhdGFfcHJlc2VudDsKKyAgICAgICAgc3Vic3RyZWFtX2RhdGFfbGVuW3N1YnN0cl0gPSBlbmQgLSBzdWJzdHJlYW1fc3RhcnQ7CisgICAgICAgIHN1YnN0cmVhbV9zdGFydCA9IGVuZDsKKyAgICB9CisKKyAgICBwYXJpdHlfYml0cyAgPSBmZl9tbHBfY2FsY3VsYXRlX3Bhcml0eShidWYsIDQpOworICAgIHBhcml0eV9iaXRzIF49IGZmX21scF9jYWxjdWxhdGVfcGFyaXR5KGJ1ZiArIGhlYWRlcl9zaXplLCBzdWJzdHJfaGVhZGVyX3NpemUpOworCisgICAgaWYgKCgoKHBhcml0eV9iaXRzID4+IDQpIF4gcGFyaXR5X2JpdHMpICYgMHhGKSAhPSAweEYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYXJpdHkgY2hlY2sgZmFpbGVkLlxuIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgYnVmICs9IGhlYWRlcl9zaXplICsgc3Vic3RyX2hlYWRlcl9zaXplOworCisgICAgZm9yIChzdWJzdHIgPSAwOyBzdWJzdHIgPD0gbS0+bWF4X2RlY29kZWRfc3Vic3RyZWFtOyBzdWJzdHIrKykgeworICAgICAgICBTdWJTdHJlYW0gKnMgPSAmbS0+c3Vic3RyZWFtW3N1YnN0cl07CisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIHN1YnN0cmVhbV9kYXRhX2xlbltzdWJzdHJdICogOCk7CisKKyAgICAgICAgbS0+bWF0cml4X2NoYW5nZWQgPSAwOworICAgICAgICBtZW1zZXQobS0+ZmlsdGVyX2NoYW5nZWQsIDAsIHNpemVvZihtLT5maWx0ZXJfY2hhbmdlZCkpOworCisgICAgICAgIHMtPmJsb2NrcG9zID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmZ2IpKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmZ2IpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEEgcmVzdGFydCBoZWFkZXIgc2hvdWxkIGJlIHByZXNlbnQuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkX3Jlc3RhcnRfaGVhZGVyKG0sICZnYiwgYnVmLCBzdWJzdHIpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9zdWJzdHI7CisgICAgICAgICAgICAgICAgICAgIHMtPnJlc3RhcnRfc2VlbiA9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFzLT5yZXN0YXJ0X3NlZW4pCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9zdWJzdHI7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRfZGVjb2RpbmdfcGFyYW1zKG0sICZnYiwgc3Vic3RyKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9zdWJzdHI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghcy0+cmVzdGFydF9zZWVuKQorICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9zdWJzdHI7CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gcmVhZF9ibG9ja19kYXRhKG0sICZnYiwgc3Vic3RyKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19jb3VudCgmZ2IpID49IHN1YnN0cmVhbV9kYXRhX2xlbltzdWJzdHJdICogOCkKKyAgICAgICAgICAgICAgICBnb3RvIHN1YnN0cmVhbV9sZW5ndGhfbWlzbWF0Y2g7CisKKyAgICAgICAgfSB3aGlsZSAoIWdldF9iaXRzMSgmZ2IpKTsKKworICAgICAgICBza2lwX2JpdHMoJmdiLCAoLWdldF9iaXRzX2NvdW50KCZnYikpICYgMTUpOworCisgICAgICAgIGlmIChzdWJzdHJlYW1fZGF0YV9sZW5bc3Vic3RyXSAqIDggLSBnZXRfYml0c19jb3VudCgmZ2IpID49IDMyKSB7CisgICAgICAgICAgICBpbnQgc2hvcnRlbl9ieTsKKworICAgICAgICAgICAgaWYgKGdldF9iaXRzKCZnYiwgMTYpICE9IDB4RDIzNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgc2hvcnRlbl9ieSA9IGdldF9iaXRzKCZnYiwgMTYpOworICAgICAgICAgICAgaWYgICAgICAobS0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RSVUVIRCAmJiBzaG9ydGVuX2J5ICAmIDB4MjAwMCkKKyAgICAgICAgICAgICAgICBzLT5ibG9ja3BvcyAtPSBGRk1JTihzaG9ydGVuX2J5ICYgMHgxRkZGLCBzLT5ibG9ja3Bvcyk7CisgICAgICAgICAgICBlbHNlIGlmIChtLT5hdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUxQICAgICYmIHNob3J0ZW5fYnkgIT0gMHhEMjM0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBpZiAoc3Vic3RyID09IG0tPm1heF9kZWNvZGVkX3N1YnN0cmVhbSkKKyAgICAgICAgICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19JTkZPLCAiRW5kIG9mIHN0cmVhbSBpbmRpY2F0ZWQuXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWJzdHJlYW1fcGFyaXR5X3ByZXNlbnRbc3Vic3RyXSkgeworICAgICAgICAgICAgdWludDhfdCBwYXJpdHksIGNoZWNrc3VtOworCisgICAgICAgICAgICBpZiAoc3Vic3RyZWFtX2RhdGFfbGVuW3N1YnN0cl0gKiA4IC0gZ2V0X2JpdHNfY291bnQoJmdiKSAhPSAxNikKKyAgICAgICAgICAgICAgICBnb3RvIHN1YnN0cmVhbV9sZW5ndGhfbWlzbWF0Y2g7CisKKyAgICAgICAgICAgIHBhcml0eSAgID0gZmZfbWxwX2NhbGN1bGF0ZV9wYXJpdHkoYnVmLCBzdWJzdHJlYW1fZGF0YV9sZW5bc3Vic3RyXSAtIDIpOworICAgICAgICAgICAgY2hlY2tzdW0gPSBmZl9tbHBfY2hlY2tzdW04ICAgICAgIChidWYsIHN1YnN0cmVhbV9kYXRhX2xlbltzdWJzdHJdIC0gMik7CisKKyAgICAgICAgICAgIGlmICgoZ2V0X2JpdHMoJmdiLCA4KSBeIHBhcml0eSkgIT0gMHhhOSAgICApCisgICAgICAgICAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJTdWJzdHJlYW0gJWQgcGFyaXR5IGNoZWNrIGZhaWxlZC5cbiIsIHN1YnN0cik7CisgICAgICAgICAgICBpZiAoIGdldF9iaXRzKCZnYiwgOCkgICAgICAgICAgICE9IGNoZWNrc3VtKQorICAgICAgICAgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU3Vic3RyZWFtICVkIGNoZWNrc3VtIGZhaWxlZC5cbiIgICAgLCBzdWJzdHIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1YnN0cmVhbV9kYXRhX2xlbltzdWJzdHJdICogOCAhPSBnZXRfYml0c19jb3VudCgmZ2IpKQorICAgICAgICAgICAgZ290byBzdWJzdHJlYW1fbGVuZ3RoX21pc21hdGNoOworCituZXh0X3N1YnN0cjoKKyAgICAgICAgaWYgKCFzLT5yZXN0YXJ0X3NlZW4pCisgICAgICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTm8gcmVzdGFydCBoZWFkZXIgcHJlc2VudCBpbiBzdWJzdHJlYW0gJWQuXG4iLCBzdWJzdHIpOworCisgICAgICAgIGJ1ZiArPSBzdWJzdHJlYW1fZGF0YV9sZW5bc3Vic3RyXTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IG91dHB1dF9kYXRhKG0sIG0tPm1heF9kZWNvZGVkX3N1YnN0cmVhbSwgZGF0YSwgZ290X2ZyYW1lX3B0cikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiBsZW5ndGg7CisKK3N1YnN0cmVhbV9sZW5ndGhfbWlzbWF0Y2g6CisgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzdWJzdHJlYW0gJWQgbGVuZ3RoIG1pc21hdGNoXG4iLCBzdWJzdHIpOworICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCitlcnJvcjoKKyAgICBtLT5wYXJhbXNfdmFsaWQgPSAwOworICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworfQorCisjaWYgQ09ORklHX01MUF9ERUNPREVSCitBVkNvZGVjIGZmX21scF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtbHAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNTFAgKE1lcmlkaWFuIExvc3NsZXNzIFBhY2tpbmcpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01MUCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTUxQRGVjb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbWxwX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IHJlYWRfYWNjZXNzX3VuaXQsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CisjZW5kaWYKKyNpZiBDT05GSUdfVFJVRUhEX0RFQ09ERVIKK0FWQ29kZWMgZmZfdHJ1ZWhkX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInRydWVoZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRydWVIRCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9UUlVFSEQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1MUERlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IG1scF9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSByZWFkX2FjY2Vzc191bml0LAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmIC8qIENPTkZJR19UUlVFSERfREVDT0RFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbWxwZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tbHBkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWU4YzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWxwZHNwLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBJYW4gQ2F1bGZpZWxkCisgKiAgICAgICAgICAgICAgIDIwMDkgUmFtaXJvIFBvbGxhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgIm1scGRzcC5oIgorI2luY2x1ZGUgIm1scC5oIgorCitzdGF0aWMgdm9pZCBtbHBfZmlsdGVyX2NoYW5uZWwoaW50MzJfdCAqc3RhdGUsIGNvbnN0IGludDMyX3QgKmNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJvcmRlciwgaW50IGlpcm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmaWx0ZXJfc2hpZnQsIGludDMyX3QgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzaXplLCBpbnQzMl90ICpzYW1wbGVfYnVmZmVyKQoreworICAgIGludDMyX3QgKmZpcmJ1ZiA9IHN0YXRlOworICAgIGludDMyX3QgKmlpcmJ1ZiA9IHN0YXRlICsgTUFYX0JMT0NLU0laRSArIE1BWF9GSVJfT1JERVI7CisgICAgY29uc3QgaW50MzJfdCAqZmlyY29lZmYgPSBjb2VmZjsKKyAgICBjb25zdCBpbnQzMl90ICppaXJjb2VmZiA9IGNvZWZmICsgTUFYX0ZJUl9PUkRFUjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3NpemU7IGkrKykgeworICAgICAgICBpbnQzMl90IHJlc2lkdWFsID0gKnNhbXBsZV9idWZmZXI7CisgICAgICAgIHVuc2lnbmVkIGludCBvcmRlcjsKKyAgICAgICAgaW50NjRfdCBhY2N1bSA9IDA7CisgICAgICAgIGludDMyX3QgcmVzdWx0OworCisgICAgICAgIGZvciAob3JkZXIgPSAwOyBvcmRlciA8IGZpcm9yZGVyOyBvcmRlcisrKQorICAgICAgICAgICAgYWNjdW0gKz0gKGludDY0X3QpIGZpcmJ1ZltvcmRlcl0gKiBmaXJjb2VmZltvcmRlcl07CisgICAgICAgIGZvciAob3JkZXIgPSAwOyBvcmRlciA8IGlpcm9yZGVyOyBvcmRlcisrKQorICAgICAgICAgICAgYWNjdW0gKz0gKGludDY0X3QpIGlpcmJ1ZltvcmRlcl0gKiBpaXJjb2VmZltvcmRlcl07CisKKyAgICAgICAgYWNjdW0gID0gYWNjdW0gPj4gZmlsdGVyX3NoaWZ0OworICAgICAgICByZXN1bHQgPSAoYWNjdW0gKyByZXNpZHVhbCkgJiBtYXNrOworCisgICAgICAgICotLWZpcmJ1ZiA9IHJlc3VsdDsKKyAgICAgICAgKi0taWlyYnVmID0gcmVzdWx0IC0gYWNjdW07CisKKyAgICAgICAgKnNhbXBsZV9idWZmZXIgPSByZXN1bHQ7CisgICAgICAgIHNhbXBsZV9idWZmZXIgKz0gTUFYX0NIQU5ORUxTOworICAgIH0KK30KKwordm9pZCBmZl9tbHBfcmVtYXRyaXhfY2hhbm5lbChpbnQzMl90ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ5cGFzc2VkX2xzYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqbm9pc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBibG9ja3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heGNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhfbm9pc2Vfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2Nlc3NfdW5pdF9zaXplX3BvdzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWFzaykKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3JjX2NoLCBpOworICAgIGludCBpbmRleDIgPSAyICogaW5kZXggKyAxOworICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3BvczsgaSsrKSB7CisgICAgICAgIGludDY0X3QgYWNjdW0gPSAwOworCisgICAgICAgIGZvciAoc3JjX2NoID0gMDsgc3JjX2NoIDw9IG1heGNoYW47IHNyY19jaCsrKQorICAgICAgICAgICAgYWNjdW0gKz0gKGludDY0X3QpIHNhbXBsZXNbc3JjX2NoXSAqIGNvZWZmc1tzcmNfY2hdOworCisgICAgICAgIGlmIChtYXRyaXhfbm9pc2Vfc2hpZnQpIHsKKyAgICAgICAgICAgIGluZGV4ICY9IGFjY2Vzc191bml0X3NpemVfcG93MiAtIDE7CisgICAgICAgICAgICBhY2N1bSArPSBub2lzZV9idWZmZXJbaW5kZXhdIDw8IChtYXRyaXhfbm9pc2Vfc2hpZnQgKyA3KTsKKyAgICAgICAgICAgIGluZGV4ICs9IGluZGV4MjsKKyAgICAgICAgfQorCisgICAgICAgIHNhbXBsZXNbZGVzdF9jaF0gPSAoKGFjY3VtID4+IDE0KSAmIG1hc2spICsgKmJ5cGFzc2VkX2xzYnM7CisgICAgICAgIGJ5cGFzc2VkX2xzYnMgKz0gTUFYX0NIQU5ORUxTOworICAgICAgICBzYW1wbGVzICs9IE1BWF9DSEFOTkVMUzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQzMl90ICgqbWxwX3NlbGVjdF9wYWNrX291dHB1dCh1aW50OF90ICpjaF9hc3NpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICpvdXRwdXRfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXhfbWF0cml4X2NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzMzIpKShpbnQzMl90LCB1aW50MTZfdCwgaW50MzJfdCAoKilbXSwgdm9pZCAqLCB1aW50OF90KiwgaW50OF90ICosIHVpbnQ4X3QsIGludCkKK3sKKyAgICByZXR1cm4gZmZfbWxwX3BhY2tfb3V0cHV0OworfQorCitpbnQzMl90IGZmX21scF9wYWNrX291dHB1dChpbnQzMl90IGxvc3NsZXNzX2NoZWNrX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBibG9ja3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKCpzYW1wbGVfYnVmZmVyKVtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNoX2Fzc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqb3V0cHV0X3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXhfbWF0cml4X2NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXMzMikKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgb3V0X2NoID0gMDsKKyAgICBpbnQzMl90ICpkYXRhXzMyID0gZGF0YTsKKyAgICBpbnQxNl90ICpkYXRhXzE2ID0gZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3BvczsgaSsrKSB7CisgICAgICAgIGZvciAob3V0X2NoID0gMDsgb3V0X2NoIDw9IG1heF9tYXRyaXhfY2hhbm5lbDsgb3V0X2NoKyspIHsKKyAgICAgICAgICAgIGludCBtYXRfY2ggPSBjaF9hc3NpZ25bb3V0X2NoXTsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlID0gc2FtcGxlX2J1ZmZlcltpXVttYXRfY2hdCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG91dHB1dF9zaGlmdFttYXRfY2hdOworICAgICAgICAgICAgbG9zc2xlc3NfY2hlY2tfZGF0YSBePSAoc2FtcGxlICYgMHhmZmZmZmYpIDw8IG1hdF9jaDsKKyAgICAgICAgICAgIGlmIChpczMyKQorICAgICAgICAgICAgICAgICpkYXRhXzMyKysgPSBzYW1wbGUgPDwgODsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqZGF0YV8xNisrID0gc2FtcGxlID4+IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxvc3NsZXNzX2NoZWNrX2RhdGE7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9tbHBkc3BfaW5pdChNTFBEU1BDb250ZXh0ICpjKQoreworICAgIGMtPm1scF9maWx0ZXJfY2hhbm5lbCA9IG1scF9maWx0ZXJfY2hhbm5lbDsKKyAgICBjLT5tbHBfcmVtYXRyaXhfY2hhbm5lbCA9IGZmX21scF9yZW1hdHJpeF9jaGFubmVsOworICAgIGMtPm1scF9zZWxlY3RfcGFja19vdXRwdXQgPSBtbHBfc2VsZWN0X3BhY2tfb3V0cHV0OworICAgIGMtPm1scF9wYWNrX291dHB1dCA9IGZmX21scF9wYWNrX291dHB1dDsKKyAgICBpZiAoQVJDSF9BUk0pCisgICAgICAgIGZmX21scGRzcF9pbml0X2FybShjKTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX21scGRzcF9pbml0X3g4NihjKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21scGRzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbWxwZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlZGViNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21scGRzcC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBNTFAgY29kZWMgY29tbW9uIGhlYWRlciBmaWxlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBJYW4gQ2F1bGZpZWxkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NTFBEU1BfSAorI2RlZmluZSBBVkNPREVDX01MUERTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJtbHAuaCIKKwordm9pZCBmZl9tbHBfcmVtYXRyaXhfY2hhbm5lbChpbnQzMl90ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ5cGFzc2VkX2xzYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqbm9pc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBibG9ja3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heGNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhfbm9pc2Vfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2Nlc3NfdW5pdF9zaXplX3BvdzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWFzayk7CisKK2ludDMyX3QgZmZfbWxwX3BhY2tfb3V0cHV0KGludDMyX3QgbG9zc2xlc3NfY2hlY2tfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAoKnNhbXBsZV9idWZmZXIpW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqY2hfYXNzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICpvdXRwdXRfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9tYXRyaXhfY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpczMyKTsKKwordHlwZWRlZiBzdHJ1Y3QgTUxQRFNQQ29udGV4dCB7CisgICAgdm9pZCAoKm1scF9maWx0ZXJfY2hhbm5lbCkoaW50MzJfdCAqc3RhdGUsIGNvbnN0IGludDMyX3QgKmNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJvcmRlciwgaW50IGlpcm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmaWx0ZXJfc2hpZnQsIGludDMyX3QgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzaXplLCBpbnQzMl90ICpzYW1wbGVfYnVmZmVyKTsKKyAgICB2b2lkICgqbWxwX3JlbWF0cml4X2NoYW5uZWwpKGludDMyX3QgKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpieXBhc3NlZF9sc2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpub2lzZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heGNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF0cml4X25vaXNlX3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjY2Vzc191bml0X3NpemVfcG93MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWFzayk7CisgICAgaW50MzJfdCAoKigqbWxwX3NlbGVjdF9wYWNrX291dHB1dCkodWludDhfdCAqY2hfYXNzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqb3V0cHV0X3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4X21hdHJpeF9jaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpczMyKSkoaW50MzJfdCwgdWludDE2X3QsIGludDMyX3QgKCopW10sIHZvaWQgKiwgdWludDhfdCosIGludDhfdCAqLCB1aW50OF90LCBpbnQpOworICAgIGludDMyX3QgKCptbHBfcGFja19vdXRwdXQpKGludDMyX3QgbG9zc2xlc3NfY2hlY2tfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBibG9ja3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICgqc2FtcGxlX2J1ZmZlcilbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNoX2Fzc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKm91dHB1dF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9tYXRyaXhfY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXMzMik7Cit9IE1MUERTUENvbnRleHQ7CisKK3ZvaWQgZmZfbWxwZHNwX2luaXQoTUxQRFNQQ29udGV4dCAqYyk7Cit2b2lkIGZmX21scGRzcF9pbml0X2FybShNTFBEU1BDb250ZXh0ICpjKTsKK3ZvaWQgZmZfbWxwZHNwX2luaXRfeDg2KE1MUERTUENvbnRleHQgKmMpOworCisjZW5kaWYgLyogQVZDT0RFQ19NTFBEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbW12aWRlby5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbW12aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhN2MxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tbXZpZGVvLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBBbWVyaWNhbiBMYXNlciBHYW1lcyBNTSBWaWRlbyBEZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsMjAwOCBQZXRlciBSb3NzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFtZXJpY2FuIExhc2VyIEdhbWVzIE1NIFZpZGVvIERlY29kZXIKKyAqIGJ5IFBldGVyIFJvc3MgKHByb3NzQHh2aWQub3JnKQorICoKKyAqIFRoZSBNTSBmb3JtYXQgd2FzIHVzZWQgYnkgSUJNLVBDIHBvcnRzIG9mIEFMRydzICJhcmNhZGUgc2hvb3RlciIgZ2FtZXMsCisgKiBpbmNsdWRpbmcgTWFkIERvZyBNY0NyZWUgYW5kIENyaW1lIFBhdHJvbC4KKyAqCisgKiBUZWNobmljYWwgZGV0YWlscyBoZXJlOgorICogIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPUFtZXJpY2FuX0xhc2VyX0dhbWVzX01NCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTU1fUFJFQU1CTEVfU0laRSAgICA2CisKKyNkZWZpbmUgTU1fVFlQRV9JTlRFUiAgICAgICAweDUKKyNkZWZpbmUgTU1fVFlQRV9JTlRSQSAgICAgICAweDgKKyNkZWZpbmUgTU1fVFlQRV9JTlRSQV9ISCAgICAweGMKKyNkZWZpbmUgTU1fVFlQRV9JTlRFUl9ISCAgICAweGQKKyNkZWZpbmUgTU1fVFlQRV9JTlRSQV9ISFYgICAweGUKKyNkZWZpbmUgTU1fVFlQRV9JTlRFUl9ISFYgICAweGYKKyNkZWZpbmUgTU1fVFlQRV9QQUxFVFRFICAgICAweDMxCisKK3R5cGVkZWYgc3RydWN0IE1tQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIHVuc2lnbmVkIGludCBwYWxldHRlW0FWUEFMRVRURV9DT1VOVF07CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7Cit9IE1tQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IG1tX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNbUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworCisgICAgcy0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+ZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbW1fZGVjb2RlX3BhbChNbUNvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgNCk7CisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgIHMtPnBhbGV0dGVbaV0gPSAweEZGVSA8PCAyNCB8IGJ5dGVzdHJlYW0yX2dldF9iZTI0KCZzLT5nYik7CisgICAgICAgIHMtPnBhbGV0dGVbaSsxMjhdID0gcy0+cGFsZXR0ZVtpXTw8MjsKKyAgICB9Cit9CisKKy8qKgorICogQHBhcmFtIGhhbGZfaG9yaXogSGFsZiBob3Jpem9udGFsIHJlc29sdXRpb24gKDAgb3IgMSkKKyAqIEBwYXJhbSBoYWxmX3ZlcnQgSGFsZiB2ZXJ0aWNhbCByZXNvbHV0aW9uICgwIG9yIDEpCisgKi8KK3N0YXRpYyBpbnQgbW1fZGVjb2RlX2ludHJhKE1tQ29udGV4dCAqIHMsIGludCBoYWxmX2hvcml6LCBpbnQgaGFsZl92ZXJ0KQoreworICAgIGludCB4ID0gMCwgeSA9IDA7CisKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA+IDApIHsKKyAgICAgICAgaW50IHJ1bl9sZW5ndGgsIGNvbG9yOworCisgICAgICAgIGlmICh5ID49IHMtPmF2Y3R4LT5oZWlnaHQpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjb2xvciA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgICAgIGlmIChjb2xvciAmIDB4ODApIHsKKyAgICAgICAgICAgIHJ1bl9sZW5ndGggPSAxOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHJ1bl9sZW5ndGggPSAoY29sb3IgJiAweDdmKSArIDI7CisgICAgICAgICAgICBjb2xvciA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGFsZl9ob3JpeikKKyAgICAgICAgICAgIHJ1bl9sZW5ndGggKj0yOworCisgICAgICAgIGlmIChydW5fbGVuZ3RoID4gcy0+YXZjdHgtPndpZHRoIC0geCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGlmIChjb2xvcikgeworICAgICAgICAgICAgbWVtc2V0KHMtPmZyYW1lLT5kYXRhWzBdICsgeSpzLT5mcmFtZS0+bGluZXNpemVbMF0gKyB4LCBjb2xvciwgcnVuX2xlbmd0aCk7CisgICAgICAgICAgICBpZiAoaGFsZl92ZXJ0ICYmIHkgKyBoYWxmX3ZlcnQgPCBzLT5hdmN0eC0+aGVpZ2h0KQorICAgICAgICAgICAgICAgIG1lbXNldChzLT5mcmFtZS0+ZGF0YVswXSArICh5KzEpKnMtPmZyYW1lLT5saW5lc2l6ZVswXSArIHgsIGNvbG9yLCBydW5fbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICB4Kz0gcnVuX2xlbmd0aDsKKworICAgICAgICBpZiAoeCA+PSBzLT5hdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgICAgIHg9MDsKKyAgICAgICAgICAgIHkgKz0gMSArIGhhbGZfdmVydDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEBwYXJhbSBoYWxmX2hvcml6IEhhbGYgaG9yaXpvbnRhbCByZXNvbHV0aW9uICgwIG9yIDEpCisgKiBAcGFyYW0gaGFsZl92ZXJ0IEhhbGYgdmVydGljYWwgcmVzb2x1dGlvbiAoMCBvciAxKQorICovCitzdGF0aWMgaW50IG1tX2RlY29kZV9pbnRlcihNbUNvbnRleHQgKiBzLCBpbnQgaGFsZl9ob3JpeiwgaW50IGhhbGZfdmVydCkKK3sKKyAgICBpbnQgZGF0YV9vZmYgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+Z2IpOworICAgIGludCB5ID0gMDsKKyAgICBHZXRCeXRlQ29udGV4dCBkYXRhX3B0cjsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpIDwgZGF0YV9vZmYpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZGF0YV9wdHIsIHMtPmdiLmJ1ZmZlciArIGRhdGFfb2ZmLCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpIC0gZGF0YV9vZmYpOworICAgIHdoaWxlIChzLT5nYi5idWZmZXIgPCBkYXRhX3B0ci5idWZmZXJfc3RhcnQpIHsKKyAgICAgICAgaW50IGksIGo7CisgICAgICAgIGludCBsZW5ndGggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICBpbnQgeCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYikgKyAoKGxlbmd0aCAmIDB4ODApIDw8IDEpOworICAgICAgICBsZW5ndGggJj0gMHg3RjsKKworICAgICAgICBpZiAobGVuZ3RoPT0wKSB7CisgICAgICAgICAgICB5ICs9IHg7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh5ICsgaGFsZl92ZXJ0ID49IHMtPmF2Y3R4LT5oZWlnaHQpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgcmVwbGFjZV9hcnJheSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgICAgICAgICBmb3Ioaj0wOyBqPDg7IGorKykgeworICAgICAgICAgICAgICAgIGludCByZXBsYWNlID0gKHJlcGxhY2VfYXJyYXkgPj4gKDctaikpICYgMTsKKyAgICAgICAgICAgICAgICBpZiAoeCArIGhhbGZfaG9yaXogPj0gcy0+YXZjdHgtPndpZHRoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZGF0YV9wdHIpOworICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZS0+ZGF0YVswXVt5KnMtPmZyYW1lLT5saW5lc2l6ZVswXSArIHhdID0gY29sb3I7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYWxmX2hvcml6KQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWUtPmRhdGFbMF1beSpzLT5mcmFtZS0+bGluZXNpemVbMF0gKyB4ICsgMV0gPSBjb2xvcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbGZfdmVydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWUtPmRhdGFbMF1bKHkrMSkqcy0+ZnJhbWUtPmxpbmVzaXplWzBdICsgeF0gPSBjb2xvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYWxmX2hvcml6KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lLT5kYXRhWzBdWyh5KzEpKnMtPmZyYW1lLT5saW5lc2l6ZVswXSArIHggKyAxXSA9IGNvbG9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHggKz0gMSArIGhhbGZfaG9yaXo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB5ICs9IDEgKyBoYWxmX3ZlcnQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW1fZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgTW1Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgdHlwZSwgcmVzOworCisgICAgaWYgKGJ1Zl9zaXplIDwgTU1fUFJFQU1CTEVfU0laRSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgdHlwZSA9IEFWX1JMMTYoJmJ1ZlswXSk7CisgICAgYnVmICs9IE1NX1BSRUFNQkxFX1NJWkU7CisgICAgYnVmX3NpemUgLT0gTU1fUFJFQU1CTEVfU0laRTsKKyAgICBieXRlc3RyZWFtMl9pbml0KCZzLT5nYiwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICBpZiAoKHJlcyA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgTU1fVFlQRV9QQUxFVFRFICAgOiBtbV9kZWNvZGVfcGFsKHMpOyByZXR1cm4gYXZwa3QtPnNpemU7CisgICAgY2FzZSBNTV9UWVBFX0lOVFJBICAgICA6IHJlcyA9IG1tX2RlY29kZV9pbnRyYShzLCAwLCAwKTsgYnJlYWs7CisgICAgY2FzZSBNTV9UWVBFX0lOVFJBX0hIICA6IHJlcyA9IG1tX2RlY29kZV9pbnRyYShzLCAxLCAwKTsgYnJlYWs7CisgICAgY2FzZSBNTV9UWVBFX0lOVFJBX0hIViA6IHJlcyA9IG1tX2RlY29kZV9pbnRyYShzLCAxLCAxKTsgYnJlYWs7CisgICAgY2FzZSBNTV9UWVBFX0lOVEVSICAgICA6IHJlcyA9IG1tX2RlY29kZV9pbnRlcihzLCAwLCAwKTsgYnJlYWs7CisgICAgY2FzZSBNTV9UWVBFX0lOVEVSX0hIICA6IHJlcyA9IG1tX2RlY29kZV9pbnRlcihzLCAxLCAwKTsgYnJlYWs7CisgICAgY2FzZSBNTV9UWVBFX0lOVEVSX0hIViA6IHJlcyA9IG1tX2RlY29kZV9pbnRlcihzLCAxLCAxKTsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgbWVtY3B5KHMtPmZyYW1lLT5kYXRhWzFdLCBzLT5wYWxldHRlLCBBVlBBTEVUVEVfU0laRSk7CisKKyAgICBpZiAoKHJlcyA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgICpnb3RfZnJhbWUgICAgICA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtbV9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNbUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbW12aWRlb19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtbXZpZGVvIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQW1lcmljYW4gTGFzZXIgR2FtZXMgTU0gVmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTU1WSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTW1Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBtbV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBtbV9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IG1tX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21vdGlvbi10ZXN0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tb3Rpb24tdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZmU0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tb3Rpb24tdGVzdC5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIG1vdGlvbiB0ZXN0LgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibWVfY21wLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorCisjdW5kZWYgcHJpbnRmCisKKyNkZWZpbmUgV0lEVEggNjQKKyNkZWZpbmUgSEVJR0hUIDY0CisKK3N0YXRpYyB1aW50OF90IGltZzFbV0lEVEggKiBIRUlHSFRdOworc3RhdGljIHVpbnQ4X3QgaW1nMltXSURUSCAqIEhFSUdIVF07CisKK3N0YXRpYyB2b2lkIGZpbGxfcmFuZG9tKHVpbnQ4X3QgKnRhYiwgaW50IHNpemUpCit7CisgICAgaW50IGk7CisgICAgQVZMRkcgcHJuZzsKKworICAgIGF2X2xmZ19pbml0KCZwcm5nLCAxKTsKKyAgICBmb3IoaT0wO2k8c2l6ZTtpKyspIHsKKyAgICAgICAgdGFiW2ldID0gYXZfbGZnX2dldCgmcHJuZykgJSAyNTY7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoZWxwKHZvaWQpCit7CisgICAgcHJpbnRmKCJtb3Rpb24tdGVzdCBbLWhdXG4iCisgICAgICAgICAgICJ0ZXN0IG1vdGlvbiBpbXBsZW1lbnRhdGlvbnNcbiIpOworfQorCisjZGVmaW5lIE5CX0lUUyA1MDAKKworaW50IGR1bW15OworCitzdGF0aWMgdm9pZCB0ZXN0X21vdGlvbihjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICBtZV9jbXBfZnVuYyB0ZXN0X2Z1bmMsIG1lX2NtcF9mdW5jIHJlZl9mdW5jKQoreworICAgIGludCB4LCB5LCBkMSwgZDIsIGl0OworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICBpbnQ2NF90IHRpOworICAgIHByaW50ZigidGVzdGluZyAnJXMnXG4iLCBuYW1lKTsKKworICAgIC8qIHRlc3QgY29ycmVjdG5lc3MgKi8KKyAgICBmb3IoaXQ9MDtpdDwyMDtpdCsrKSB7CisKKyAgICAgICAgZmlsbF9yYW5kb20oaW1nMSwgV0lEVEggKiBIRUlHSFQpOworICAgICAgICBmaWxsX3JhbmRvbShpbWcyLCBXSURUSCAqIEhFSUdIVCk7CisKKyAgICAgICAgZm9yKHk9MDt5PEhFSUdIVC0xNzt5KyspIHsKKyAgICAgICAgICAgIGZvcih4PTA7eDxXSURUSC0xNzt4KyspIHsKKyAgICAgICAgICAgICAgICBwdHIgPSBpbWcyICsgeSAqIFdJRFRIICsgeDsKKyAgICAgICAgICAgICAgICBkMSA9IHRlc3RfZnVuYyhOVUxMLCBpbWcxLCBwdHIsIFdJRFRILCA4KTsKKyAgICAgICAgICAgICAgICBkMiA9IHJlZl9mdW5jKE5VTEwsIGltZzEsIHB0ciwgV0lEVEgsIDgpOworICAgICAgICAgICAgICAgIGlmIChkMSAhPSBkMikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yOiBtbXg9JWQgYz0lZFxuIiwgZDEsIGQyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZW1tc19jKCk7CisKKyAgICAvKiBzcGVlZCB0ZXN0ICovCisgICAgdGkgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7CisgICAgZDEgPSAwOworICAgIGZvcihpdD0wO2l0PE5CX0lUUztpdCsrKSB7CisgICAgICAgIGZvcih5PTA7eTxIRUlHSFQtMTc7eSsrKSB7CisgICAgICAgICAgICBmb3IoeD0wO3g8V0lEVEgtMTc7eCsrKSB7CisgICAgICAgICAgICAgICAgcHRyID0gaW1nMiArIHkgKiBXSURUSCArIHg7CisgICAgICAgICAgICAgICAgZDEgKz0gdGVzdF9mdW5jKE5VTEwsIGltZzEsIHB0ciwgV0lEVEgsIDgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVtbXNfYygpOworICAgIGR1bW15ID0gZDE7IC8qIGF2b2lkIG9wdGltaXphdGlvbiAqLworICAgIHRpID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gdGk7CisKKyAgICBwcmludGYoIiAgJTAuMGYga29wL3NcbiIsCisgICAgICAgICAgIChkb3VibGUpTkJfSVRTICogKFdJRFRIIC0gMTYpICogKEhFSUdIVCAtIDE2KSAvCisgICAgICAgICAgIChkb3VibGUpKHRpIC8gMTAwMC4wKSk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIEFWQ29kZWNDb250ZXh0ICpjdHg7CisgICAgaW50IGM7CisgICAgTUVDbXBDb250ZXh0IGNjdHgsIG1teGN0eDsKKyAgICBpbnQgZmxhZ3NbMl0gPSB7IEFWX0NQVV9GTEFHX01NWCwgQVZfQ1BVX0ZMQUdfTU1YRVhUIH07CisgICAgaW50IGZsYWdzX3NpemUgPSBIQVZFX01NWEVYVCA/IDIgOiAxOworCisgICAgaWYgKGFyZ2MgPiAxKSB7CisgICAgICAgIGhlbHAoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHJpbnRmKCJmZm1wZWcgbW90aW9uIHRlc3RcbiIpOworCisgICAgY3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhOVUxMKTsKKyAgICBjdHgtPmZsYWdzIHw9IENPREVDX0ZMQUdfQklURVhBQ1Q7CisgICAgYXZfZm9yY2VfY3B1X2ZsYWdzKDApOworICAgIG1lbXNldCgmY2N0eCwgMCwgc2l6ZW9mKGNjdHgpKTsKKyAgICBmZl9tZV9jbXBfaW5pdCgmY2N0eCwgY3R4KTsKKyAgICBmb3IgKGMgPSAwOyBjIDwgZmxhZ3Nfc2l6ZTsgYysrKSB7CisgICAgICAgIGludCB4OworICAgICAgICBhdl9mb3JjZV9jcHVfZmxhZ3MoZmxhZ3NbY10pOworICAgICAgICBtZW1zZXQoJm1teGN0eCwgMCwgc2l6ZW9mKG1teGN0eCkpOworICAgICAgICBmZl9tZV9jbXBfaW5pdCgmbW14Y3R4LCBjdHgpOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgZm9yICVkeCVkIHBpeGVsc1xuIiwgYyA/ICJtbXgyIiA6ICJtbXgiLAorICAgICAgICAgICAgICAgICAgIHggPyA4IDogMTYsIHggPyA4IDogMTYpOworICAgICAgICAgICAgdGVzdF9tb3Rpb24oIm1teCIsICAgICBtbXhjdHgucGl4X2Fic1t4XVswXSwgY2N0eC5waXhfYWJzW3hdWzBdKTsKKyAgICAgICAgICAgIHRlc3RfbW90aW9uKCJtbXhfeDIiLCAgbW14Y3R4LnBpeF9hYnNbeF1bMV0sIGNjdHgucGl4X2Fic1t4XVsxXSk7CisgICAgICAgICAgICB0ZXN0X21vdGlvbigibW14X3kyIiwgIG1teGN0eC5waXhfYWJzW3hdWzJdLCBjY3R4LnBpeF9hYnNbeF1bMl0pOworICAgICAgICAgICAgdGVzdF9tb3Rpb24oIm1teF94eTIiLCBtbXhjdHgucGl4X2Fic1t4XVszXSwgY2N0eC5waXhfYWJzW3hdWzNdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9mcmVlKGN0eCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21vdGlvbl9lc3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21vdGlvbl9lc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFmYWZkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbW90aW9uX2VzdC5jCkBAIC0wLDAgKzEsMTc2MyBAQAorLyoKKyAqIE1vdGlvbiBlc3RpbWF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBuZXcgbW90aW9uIGVzdGltYXRpb24gKFgxL0VQWlMpIGJ5IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1vdGlvbiBlc3RpbWF0aW9uLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKworI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIFBfTEVGVCBQWzFdCisjZGVmaW5lIFBfVE9QIFBbMl0KKyNkZWZpbmUgUF9UT1BSSUdIVCBQWzNdCisjZGVmaW5lIFBfTUVESUFOIFBbNF0KKyNkZWZpbmUgUF9NVjEgUFs5XQorCisjZGVmaW5lIE1FX01BUF9TSElGVCAzCisjZGVmaW5lIE1FX01BUF9NVl9CSVRTIDExCisKK3N0YXRpYyBpbnQgc2FkX2hwZWxfbW90aW9uX3NlYXJjaChNcGVnRW5jQ29udGV4dCAqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpteF9wdHIsIGludCAqbXlfcHRyLCBpbnQgZG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaCk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgdXBkYXRlX21hcF9nZW5lcmF0aW9uKE1vdGlvbkVzdENvbnRleHQgKmMpCit7CisgICAgYy0+bWFwX2dlbmVyYXRpb24rPSAxPDwoTUVfTUFQX01WX0JJVFMqMik7CisgICAgaWYoYy0+bWFwX2dlbmVyYXRpb249PTApeworICAgICAgICBjLT5tYXBfZ2VuZXJhdGlvbj0gMTw8KE1FX01BUF9NVl9CSVRTKjIpOworICAgICAgICBtZW1zZXQoYy0+bWFwLCAwLCBzaXplb2YodWludDMyX3QpKk1FX01BUF9TSVpFKTsKKyAgICB9CisgICAgcmV0dXJuIGMtPm1hcF9nZW5lcmF0aW9uOworfQorCisvKiBzaGFwZSBhZGFwdGl2ZSBzZWFyY2ggc3R1ZmYgKi8KK3R5cGVkZWYgc3RydWN0IE1pbmltYXsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCB4LCB5OworICAgIGludCBjaGVja2VkOworfU1pbmltYTsKKworc3RhdGljIGludCBtaW5pbWFfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpeworICAgIGNvbnN0IE1pbmltYSAqZGEgPSAoY29uc3QgTWluaW1hICopIGE7CisgICAgY29uc3QgTWluaW1hICpkYiA9IChjb25zdCBNaW5pbWEgKikgYjsKKworICAgIHJldHVybiBkYS0+aGVpZ2h0IC0gZGItPmhlaWdodDsKK30KKworI2RlZmluZSBGTEFHX1FQRUwgICAxIC8vbXVzdCBiZSAxCisjZGVmaW5lIEZMQUdfQ0hST01BIDIKKyNkZWZpbmUgRkxBR19ESVJFQ1QgNAorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9yZWYoTW90aW9uRXN0Q29udGV4dCAqYywgdWludDhfdCAqc3JjWzNdLCB1aW50OF90ICpyZWZbM10sIHVpbnQ4X3QgKnJlZjJbM10sIGludCB4LCBpbnQgeSwgaW50IHJlZl9pbmRleCl7CisgICAgY29uc3QgaW50IG9mZnNldFszXT0geworICAgICAgICAgIHkqYy0+ICBzdHJpZGUgKyB4LAorICAgICAgICAoKHkqYy0+dXZzdHJpZGUgKyB4KT4+MSksCisgICAgICAgICgoeSpjLT51dnN0cmlkZSArIHgpPj4xKSwKKyAgICB9OworICAgIGludCBpOworICAgIGZvcihpPTA7IGk8MzsgaSsrKXsKKyAgICAgICAgYy0+c3JjWzBdW2ldPSBzcmMgW2ldICsgb2Zmc2V0W2ldOworICAgICAgICBjLT5yZWZbMF1baV09IHJlZiBbaV0gKyBvZmZzZXRbaV07CisgICAgfQorICAgIGlmKHJlZl9pbmRleCl7CisgICAgICAgIGZvcihpPTA7IGk8MzsgaSsrKXsKKyAgICAgICAgICAgIGMtPnJlZltyZWZfaW5kZXhdW2ldPSByZWYyW2ldICsgb2Zmc2V0W2ldOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGdldF9mbGFncyhNb3Rpb25Fc3RDb250ZXh0ICpjLCBpbnQgZGlyZWN0LCBpbnQgY2hyb21hKXsKKyAgICByZXR1cm4gICAoKGMtPmF2Y3R4LT5mbGFncyZDT0RFQ19GTEFHX1FQRUwpID8gRkxBR19RUEVMIDogMCkKKyAgICAgICAgICAgKyAoZGlyZWN0ID8gRkxBR19ESVJFQ1QgOiAwKQorICAgICAgICAgICArIChjaHJvbWEgPyBGTEFHX0NIUk9NQSA6IDApOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgY21wX2RpcmVjdF9pbmxpbmUoTXBlZ0VuY0NvbnRleHQgKnMsIGNvbnN0IGludCB4LCBjb25zdCBpbnQgeSwgY29uc3QgaW50IHN1YngsIGNvbnN0IGludCBzdWJ5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzaXplLCBjb25zdCBpbnQgaCwgaW50IHJlZl9pbmRleCwgaW50IHNyY19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBtZV9jbXBfZnVuYyBjbXBfZnVuYywgbWVfY21wX2Z1bmMgY2hyb21hX2NtcF9mdW5jLCBpbnQgcXBlbCl7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBjb25zdCBpbnQgc3RyaWRlPSBjLT5zdHJpZGU7CisgICAgY29uc3QgaW50IGh4PSBzdWJ4ICsgKHg8PCgxK3FwZWwpKTsKKyAgICBjb25zdCBpbnQgaHk9IHN1YnkgKyAoeTw8KDErcXBlbCkpOworICAgIHVpbnQ4X3QgKiBjb25zdCAqIGNvbnN0IHJlZj0gYy0+cmVmW3JlZl9pbmRleF07CisgICAgdWludDhfdCAqIGNvbnN0ICogY29uc3Qgc3JjPSBjLT5zcmNbc3JjX2luZGV4XTsKKyAgICBpbnQgZDsKKyAgICAvL0ZJWE1FIGNoZWNrIGNocm9tYSA0bXYsIChubyBjcmFzaGVzIC4uLikKKyAgICAgICAgYXZfYXNzZXJ0Mih4ID49IGMtPnhtaW4gJiYgaHggPD0gYy0+eG1heDw8KHFwZWwrMSkgJiYgeSA+PSBjLT55bWluICYmIGh5IDw9IGMtPnltYXg8PChxcGVsKzEpKTsKKyAgICAgICAgaWYoeCA+PSBjLT54bWluICYmIGh4IDw9IGMtPnhtYXg8PChxcGVsKzEpICYmIHkgPj0gYy0+eW1pbiAmJiBoeSA8PSBjLT55bWF4PDwocXBlbCsxKSl7CisgICAgICAgICAgICBjb25zdCBpbnQgdGltZV9wcD0gcy0+cHBfdGltZTsKKyAgICAgICAgICAgIGNvbnN0IGludCB0aW1lX3BiPSBzLT5wYl90aW1lOworICAgICAgICAgICAgY29uc3QgaW50IG1hc2s9IDIqcXBlbCsxOworICAgICAgICAgICAgaWYocy0+bXZfdHlwZT09TVZfVFlQRV84WDgpeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZ4ID0gYy0+ZGlyZWN0X2Jhc2lzX212W2ldWzBdICsgaHg7CisgICAgICAgICAgICAgICAgICAgIGludCBmeSA9IGMtPmRpcmVjdF9iYXNpc19tdltpXVsxXSArIGh5OworICAgICAgICAgICAgICAgICAgICBpbnQgYnggPSBoeCA/IGZ4IC0gYy0+Y29fbG9jYXRlZF9tdltpXVswXSA6IGMtPmNvX2xvY2F0ZWRfbXZbaV1bMF0qKHRpbWVfcGIgLSB0aW1lX3BwKS90aW1lX3BwICsgKChpICYxKTw8KHFwZWwrNCkpOworICAgICAgICAgICAgICAgICAgICBpbnQgYnkgPSBoeSA/IGZ5IC0gYy0+Y29fbG9jYXRlZF9tdltpXVsxXSA6IGMtPmNvX2xvY2F0ZWRfbXZbaV1bMV0qKHRpbWVfcGIgLSB0aW1lX3BwKS90aW1lX3BwICsgKChpPj4xKTw8KHFwZWwrNCkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZnh5PSAoZngmbWFzaykgKyAoKGZ5Jm1hc2spPDwocXBlbCsxKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBieHk9IChieCZtYXNrKSArICgoYnkmbWFzayk8PChxcGVsKzEpKTsKKworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3Q9IGMtPnRlbXAgKyA4KihpJjEpICsgOCpzdHJpZGUqKGk+PjEpOworICAgICAgICAgICAgICAgICAgICBpZihxcGVsKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPnFwZWxfcHV0WzFdW2Z4eV0oZHN0LCByZWZbMF0gKyAoZng+PjIpICsgKGZ5Pj4yKSpzdHJpZGUsIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLT5xcGVsX2F2Z1sxXVtieHldKGRzdCwgcmVmWzhdICsgKGJ4Pj4yKSArIChieT4+Mikqc3RyaWRlLCBzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmhwZWxfcHV0WzFdW2Z4eV0oZHN0LCByZWZbMF0gKyAoZng+PjEpICsgKGZ5Pj4xKSpzdHJpZGUsIHN0cmlkZSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLT5ocGVsX2F2Z1sxXVtieHldKGRzdCwgcmVmWzhdICsgKGJ4Pj4xKSArIChieT4+MSkqc3RyaWRlLCBzdHJpZGUsIDgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgaW50IGZ4ID0gYy0+ZGlyZWN0X2Jhc2lzX212WzBdWzBdICsgaHg7CisgICAgICAgICAgICAgICAgaW50IGZ5ID0gYy0+ZGlyZWN0X2Jhc2lzX212WzBdWzFdICsgaHk7CisgICAgICAgICAgICAgICAgaW50IGJ4ID0gaHggPyBmeCAtIGMtPmNvX2xvY2F0ZWRfbXZbMF1bMF0gOiAoYy0+Y29fbG9jYXRlZF9tdlswXVswXSoodGltZV9wYiAtIHRpbWVfcHApL3RpbWVfcHApOworICAgICAgICAgICAgICAgIGludCBieSA9IGh5ID8gZnkgLSBjLT5jb19sb2NhdGVkX212WzBdWzFdIDogKGMtPmNvX2xvY2F0ZWRfbXZbMF1bMV0qKHRpbWVfcGIgLSB0aW1lX3BwKS90aW1lX3BwKTsKKyAgICAgICAgICAgICAgICBpbnQgZnh5PSAoZngmbWFzaykgKyAoKGZ5Jm1hc2spPDwocXBlbCsxKSk7CisgICAgICAgICAgICAgICAgaW50IGJ4eT0gKGJ4Jm1hc2spICsgKChieSZtYXNrKTw8KHFwZWwrMSkpOworCisgICAgICAgICAgICAgICAgaWYocXBlbCl7CisgICAgICAgICAgICAgICAgICAgIGMtPnFwZWxfcHV0WzFdW2Z4eV0oYy0+dGVtcCAgICAgICAgICAgICAgICwgcmVmWzBdICsgKGZ4Pj4yKSArIChmeT4+Mikqc3RyaWRlICAgICAgICAgICAgICAgLCBzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICBjLT5xcGVsX3B1dFsxXVtmeHldKGMtPnRlbXAgKyA4ICAgICAgICAgICAsIHJlZlswXSArIChmeD4+MikgKyAoZnk+PjIpKnN0cmlkZSArIDggICAgICAgICAgICwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgYy0+cXBlbF9wdXRbMV1bZnh5XShjLT50ZW1wICAgICArIDgqc3RyaWRlLCByZWZbMF0gKyAoZng+PjIpICsgKGZ5Pj4yKSpzdHJpZGUgICAgICsgOCpzdHJpZGUsIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIGMtPnFwZWxfcHV0WzFdW2Z4eV0oYy0+dGVtcCArIDggKyA4KnN0cmlkZSwgcmVmWzBdICsgKGZ4Pj4yKSArIChmeT4+Mikqc3RyaWRlICsgOCArIDgqc3RyaWRlLCBzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICBjLT5xcGVsX2F2Z1sxXVtieHldKGMtPnRlbXAgICAgICAgICAgICAgICAsIHJlZls4XSArIChieD4+MikgKyAoYnk+PjIpKnN0cmlkZSAgICAgICAgICAgICAgICwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgYy0+cXBlbF9hdmdbMV1bYnh5XShjLT50ZW1wICsgOCAgICAgICAgICAgLCByZWZbOF0gKyAoYng+PjIpICsgKGJ5Pj4yKSpzdHJpZGUgKyA4ICAgICAgICAgICAsIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIGMtPnFwZWxfYXZnWzFdW2J4eV0oYy0+dGVtcCAgICAgKyA4KnN0cmlkZSwgcmVmWzhdICsgKGJ4Pj4yKSArIChieT4+Mikqc3RyaWRlICAgICArIDgqc3RyaWRlLCBzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICBjLT5xcGVsX2F2Z1sxXVtieHldKGMtPnRlbXAgKyA4ICsgOCpzdHJpZGUsIHJlZls4XSArIChieD4+MikgKyAoYnk+PjIpKnN0cmlkZSArIDggKyA4KnN0cmlkZSwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MigoZng+PjEpICsgMTYqcy0+bWJfeCA+PSAtMTYpOworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKChmeT4+MSkgKyAxNipzLT5tYl95ID49IC0xNik7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIoKGZ4Pj4xKSArIDE2KnMtPm1iX3ggPD0gcy0+d2lkdGgpOworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKChmeT4+MSkgKyAxNipzLT5tYl95IDw9IHMtPmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIoKGJ4Pj4xKSArIDE2KnMtPm1iX3ggPj0gLTE2KTsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MigoYnk+PjEpICsgMTYqcy0+bWJfeSA+PSAtMTYpOworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKChieD4+MSkgKyAxNipzLT5tYl94IDw9IHMtPndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MigoYnk+PjEpICsgMTYqcy0+bWJfeSA8PSBzLT5oZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIGMtPmhwZWxfcHV0WzBdW2Z4eV0oYy0+dGVtcCwgcmVmWzBdICsgKGZ4Pj4xKSArIChmeT4+MSkqc3RyaWRlLCBzdHJpZGUsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgYy0+aHBlbF9hdmdbMF1bYnh5XShjLT50ZW1wLCByZWZbOF0gKyAoYng+PjEpICsgKGJ5Pj4xKSpzdHJpZGUsIHN0cmlkZSwgMTYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGQgPSBjbXBfZnVuYyhzLCBjLT50ZW1wLCBzcmNbMF0sIHN0cmlkZSwgMTYpOworICAgICAgICB9ZWxzZQorICAgICAgICAgICAgZD0gMjU2KjI1NioyNTYqMzI7CisgICAgcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBjbXBfaW5saW5lKE1wZWdFbmNDb250ZXh0ICpzLCBjb25zdCBpbnQgeCwgY29uc3QgaW50IHksIGNvbnN0IGludCBzdWJ4LCBjb25zdCBpbnQgc3VieSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2l6ZSwgY29uc3QgaW50IGgsIGludCByZWZfaW5kZXgsIGludCBzcmNfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgbWVfY21wX2Z1bmMgY21wX2Z1bmMsIG1lX2NtcF9mdW5jIGNocm9tYV9jbXBfZnVuYywgaW50IHFwZWwsIGludCBjaHJvbWEpeworICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CisgICAgY29uc3QgaW50IHN0cmlkZT0gYy0+c3RyaWRlOworICAgIGNvbnN0IGludCB1dnN0cmlkZT0gYy0+dXZzdHJpZGU7CisgICAgY29uc3QgaW50IGR4eT0gc3VieCArIChzdWJ5PDwoMStxcGVsKSk7IC8vRklYTUUgbG9nMl9zdWJwZWw/CisgICAgY29uc3QgaW50IGh4PSBzdWJ4ICsgKHg8PCgxK3FwZWwpKTsKKyAgICBjb25zdCBpbnQgaHk9IHN1YnkgKyAoeTw8KDErcXBlbCkpOworICAgIHVpbnQ4X3QgKiBjb25zdCAqIGNvbnN0IHJlZj0gYy0+cmVmW3JlZl9pbmRleF07CisgICAgdWludDhfdCAqIGNvbnN0ICogY29uc3Qgc3JjPSBjLT5zcmNbc3JjX2luZGV4XTsKKyAgICBpbnQgZDsKKyAgICAvL0ZJWE1FIGNoZWNrIGNocm9tYSA0bXYsIChubyBjcmFzaGVzIC4uLikKKyAgICAgICAgaW50IHV2ZHh5OyAgICAgICAgICAgICAgLyogbm8sIGl0IG1pZ2h0IG5vdCBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgaWYoZHh5KXsKKyAgICAgICAgICAgIGlmKHFwZWwpeworICAgICAgICAgICAgICAgIGlmIChoIDw8IHNpemUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgYy0+cXBlbF9wdXRbc2l6ZV1bZHh5XShjLT50ZW1wLCByZWZbMF0gKyB4ICsgeSpzdHJpZGUsIHN0cmlkZSk7IC8vRklYTUUgcHJvdG90eXBlIChhZGQgaCkKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT0gMCAmJiBoID09IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgYy0+cXBlbF9wdXRbMV1bZHh5XShjLT50ZW1wICAgICwgcmVmWzBdICsgeCArIHkqc3RyaWRlICAgICwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgYy0+cXBlbF9wdXRbMV1bZHh5XShjLT50ZW1wICsgOCwgcmVmWzBdICsgeCArIHkqc3RyaWRlICsgOCwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MigwKTsKKyAgICAgICAgICAgICAgICBpZihjaHJvbWEpeworICAgICAgICAgICAgICAgICAgICBpbnQgY3g9IGh4LzI7CisgICAgICAgICAgICAgICAgICAgIGludCBjeT0gaHkvMjsKKyAgICAgICAgICAgICAgICAgICAgY3g9IChjeD4+MSl8KGN4JjEpOworICAgICAgICAgICAgICAgICAgICBjeT0gKGN5Pj4xKXwoY3kmMSk7CisgICAgICAgICAgICAgICAgICAgIHV2ZHh5PSAoY3gmMSkgKyAyKihjeSYxKTsKKyAgICAgICAgICAgICAgICAgICAgLy9GSVhNRSB4L3kgd3JvbmcsIGJ1dCBtcGVnNCBxcGVsIGlzIHNpY2sgYW55d2F5LCB3ZSBzaG91bGQgZHJvcCBhcyBtdWNoIG9mIGl0IGFzIHBvc3NpYmxlIGluIGZhdm9yIGZvciBoMjY0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgYy0+aHBlbF9wdXRbc2l6ZV1bZHh5XShjLT50ZW1wLCByZWZbMF0gKyB4ICsgeSpzdHJpZGUsIHN0cmlkZSwgaCk7CisgICAgICAgICAgICAgICAgaWYoY2hyb21hKQorICAgICAgICAgICAgICAgICAgICB1dmR4eT0gZHh5IHwgKHgmMSkgfCAoMiooeSYxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkID0gY21wX2Z1bmMocywgYy0+dGVtcCwgc3JjWzBdLCBzdHJpZGUsIGgpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGQgPSBjbXBfZnVuYyhzLCBzcmNbMF0sIHJlZlswXSArIHggKyB5KnN0cmlkZSwgc3RyaWRlLCBoKTsKKyAgICAgICAgICAgIGlmKGNocm9tYSkKKyAgICAgICAgICAgICAgICB1dmR4eT0gKHgmMSkgKyAyKih5JjEpOworICAgICAgICB9CisgICAgICAgIGlmKGNocm9tYSl7CisgICAgICAgICAgICB1aW50OF90ICogY29uc3QgdXZ0ZW1wPSBjLT50ZW1wICsgMTYqc3RyaWRlOworICAgICAgICAgICAgYy0+aHBlbF9wdXRbc2l6ZSsxXVt1dmR4eV0odXZ0ZW1wICAsIHJlZlsxXSArICh4Pj4xKSArICh5Pj4xKSp1dnN0cmlkZSwgdXZzdHJpZGUsIGg+PjEpOworICAgICAgICAgICAgYy0+aHBlbF9wdXRbc2l6ZSsxXVt1dmR4eV0odXZ0ZW1wKzgsIHJlZlsyXSArICh4Pj4xKSArICh5Pj4xKSp1dnN0cmlkZSwgdXZzdHJpZGUsIGg+PjEpOworICAgICAgICAgICAgZCArPSBjaHJvbWFfY21wX2Z1bmMocywgdXZ0ZW1wICAsIHNyY1sxXSwgdXZzdHJpZGUsIGg+PjEpOworICAgICAgICAgICAgZCArPSBjaHJvbWFfY21wX2Z1bmMocywgdXZ0ZW1wKzgsIHNyY1syXSwgdXZzdHJpZGUsIGg+PjEpOworICAgICAgICB9CisgICAgcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyBpbnQgY21wX3NpbXBsZShNcGVnRW5jQ29udGV4dCAqcywgY29uc3QgaW50IHgsIGNvbnN0IGludCB5LAorICAgICAgICAgICAgICAgICAgICAgIGludCByZWZfaW5kZXgsIGludCBzcmNfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgbWVfY21wX2Z1bmMgY21wX2Z1bmMsIG1lX2NtcF9mdW5jIGNocm9tYV9jbXBfZnVuYyl7CisgICAgcmV0dXJuIGNtcF9pbmxpbmUocyx4LHksMCwwLDAsMTYscmVmX2luZGV4LHNyY19pbmRleCwgY21wX2Z1bmMsIGNocm9tYV9jbXBfZnVuYywgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgY21wX2ZwZWxfaW50ZXJuYWwoTXBlZ0VuY0NvbnRleHQgKnMsIGNvbnN0IGludCB4LCBjb25zdCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2l6ZSwgY29uc3QgaW50IGgsIGludCByZWZfaW5kZXgsIGludCBzcmNfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgbWVfY21wX2Z1bmMgY21wX2Z1bmMsIG1lX2NtcF9mdW5jIGNocm9tYV9jbXBfZnVuYywgY29uc3QgaW50IGZsYWdzKXsKKyAgICBpZihmbGFncyZGTEFHX0RJUkVDVCl7CisgICAgICAgIHJldHVybiBjbXBfZGlyZWN0X2lubGluZShzLHgseSwwLDAsc2l6ZSxoLHJlZl9pbmRleCxzcmNfaW5kZXgsIGNtcF9mdW5jLCBjaHJvbWFfY21wX2Z1bmMsIGZsYWdzJkZMQUdfUVBFTCk7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiBjbXBfaW5saW5lKHMseCx5LDAsMCxzaXplLGgscmVmX2luZGV4LHNyY19pbmRleCwgY21wX2Z1bmMsIGNocm9tYV9jbXBfZnVuYywgMCwgZmxhZ3MmRkxBR19DSFJPTUEpOworICAgIH0KK30KKworc3RhdGljIGludCBjbXBfaW50ZXJuYWwoTXBlZ0VuY0NvbnRleHQgKnMsIGNvbnN0IGludCB4LCBjb25zdCBpbnQgeSwgY29uc3QgaW50IHN1YngsIGNvbnN0IGludCBzdWJ5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzaXplLCBjb25zdCBpbnQgaCwgaW50IHJlZl9pbmRleCwgaW50IHNyY19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBtZV9jbXBfZnVuYyBjbXBfZnVuYywgbWVfY21wX2Z1bmMgY2hyb21hX2NtcF9mdW5jLCBjb25zdCBpbnQgZmxhZ3MpeworICAgIGlmKGZsYWdzJkZMQUdfRElSRUNUKXsKKyAgICAgICAgcmV0dXJuIGNtcF9kaXJlY3RfaW5saW5lKHMseCx5LHN1Yngsc3VieSxzaXplLGgscmVmX2luZGV4LHNyY19pbmRleCwgY21wX2Z1bmMsIGNocm9tYV9jbXBfZnVuYywgZmxhZ3MmRkxBR19RUEVMKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcmV0dXJuIGNtcF9pbmxpbmUocyx4LHksc3VieCxzdWJ5LHNpemUsaCxyZWZfaW5kZXgsc3JjX2luZGV4LCBjbXBfZnVuYywgY2hyb21hX2NtcF9mdW5jLCBmbGFncyZGTEFHX1FQRUwsIGZsYWdzJkZMQUdfQ0hST01BKTsKKyAgICB9Cit9CisKKy8qKiBAYnJpZWYgY29tcGFyZXMgYSBibG9jayAoZWl0aGVyIGEgZnVsbCBtYWNyb2Jsb2NrIG9yIGEgcGFydGl0aW9uIHRoZXJlb2YpCisgICAgYWdhaW5zdCBhIHByb3Bvc2VkIG1vdGlvbi1jb21wZW5zYXRlZCBwcmVkaWN0aW9uIG9mIHRoYXQgYmxvY2sKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGNtcChNcGVnRW5jQ29udGV4dCAqcywgY29uc3QgaW50IHgsIGNvbnN0IGludCB5LCBjb25zdCBpbnQgc3VieCwgY29uc3QgaW50IHN1YnksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNpemUsIGNvbnN0IGludCBoLCBpbnQgcmVmX2luZGV4LCBpbnQgc3JjX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgIG1lX2NtcF9mdW5jIGNtcF9mdW5jLCBtZV9jbXBfZnVuYyBjaHJvbWFfY21wX2Z1bmMsIGNvbnN0IGludCBmbGFncyl7CisgICAgaWYoYXZfYnVpbHRpbl9jb25zdGFudF9wKGZsYWdzKSAmJiBhdl9idWlsdGluX2NvbnN0YW50X3AoaCkgJiYgYXZfYnVpbHRpbl9jb25zdGFudF9wKHNpemUpCisgICAgICAgJiYgYXZfYnVpbHRpbl9jb25zdGFudF9wKHN1YngpICYmIGF2X2J1aWx0aW5fY29uc3RhbnRfcChzdWJ5KQorICAgICAgICYmIGZsYWdzPT0wICYmIGg9PTE2ICYmIHNpemU9PTAgJiYgc3VieD09MCAmJiBzdWJ5PT0wKXsKKyAgICAgICAgcmV0dXJuIGNtcF9zaW1wbGUocyx4LHkscmVmX2luZGV4LHNyY19pbmRleCwgY21wX2Z1bmMsIGNocm9tYV9jbXBfZnVuYyk7CisgICAgfWVsc2UgaWYoYXZfYnVpbHRpbl9jb25zdGFudF9wKHN1YngpICYmIGF2X2J1aWx0aW5fY29uc3RhbnRfcChzdWJ5KQorICAgICAgICYmIHN1Yng9PTAgJiYgc3VieT09MCl7CisgICAgICAgIHJldHVybiBjbXBfZnBlbF9pbnRlcm5hbChzLHgseSxzaXplLGgscmVmX2luZGV4LHNyY19pbmRleCwgY21wX2Z1bmMsIGNocm9tYV9jbXBfZnVuYyxmbGFncyk7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiBjbXBfaW50ZXJuYWwocyx4LHksc3VieCxzdWJ5LHNpemUsaCxyZWZfaW5kZXgsc3JjX2luZGV4LCBjbXBfZnVuYywgY2hyb21hX2NtcF9mdW5jLCBmbGFncyk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNtcF9ocGVsKE1wZWdFbmNDb250ZXh0ICpzLCBjb25zdCBpbnQgeCwgY29uc3QgaW50IHksIGNvbnN0IGludCBzdWJ4LCBjb25zdCBpbnQgc3VieSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2l6ZSwgY29uc3QgaW50IGgsIGludCByZWZfaW5kZXgsIGludCBzcmNfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgbWVfY21wX2Z1bmMgY21wX2Z1bmMsIG1lX2NtcF9mdW5jIGNocm9tYV9jbXBfZnVuYywgY29uc3QgaW50IGZsYWdzKXsKKyAgICBpZihmbGFncyZGTEFHX0RJUkVDVCl7CisgICAgICAgIHJldHVybiBjbXBfZGlyZWN0X2lubGluZShzLHgseSxzdWJ4LHN1Ynksc2l6ZSxoLHJlZl9pbmRleCxzcmNfaW5kZXgsIGNtcF9mdW5jLCBjaHJvbWFfY21wX2Z1bmMsIDApOworICAgIH1lbHNleworICAgICAgICByZXR1cm4gY21wX2lubGluZShzLHgseSxzdWJ4LHN1Ynksc2l6ZSxoLHJlZl9pbmRleCxzcmNfaW5kZXgsIGNtcF9mdW5jLCBjaHJvbWFfY21wX2Z1bmMsIDAsIGZsYWdzJkZMQUdfQ0hST01BKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY21wX3FwZWwoTXBlZ0VuY0NvbnRleHQgKnMsIGNvbnN0IGludCB4LCBjb25zdCBpbnQgeSwgY29uc3QgaW50IHN1YngsIGNvbnN0IGludCBzdWJ5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzaXplLCBjb25zdCBpbnQgaCwgaW50IHJlZl9pbmRleCwgaW50IHNyY19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBtZV9jbXBfZnVuYyBjbXBfZnVuYywgbWVfY21wX2Z1bmMgY2hyb21hX2NtcF9mdW5jLCBjb25zdCBpbnQgZmxhZ3MpeworICAgIGlmKGZsYWdzJkZMQUdfRElSRUNUKXsKKyAgICAgICAgcmV0dXJuIGNtcF9kaXJlY3RfaW5saW5lKHMseCx5LHN1Yngsc3VieSxzaXplLGgscmVmX2luZGV4LHNyY19pbmRleCwgY21wX2Z1bmMsIGNocm9tYV9jbXBfZnVuYywgMSk7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiBjbXBfaW5saW5lKHMseCx5LHN1Yngsc3VieSxzaXplLGgscmVmX2luZGV4LHNyY19pbmRleCwgY21wX2Z1bmMsIGNocm9tYV9jbXBfZnVuYywgMSwgZmxhZ3MmRkxBR19DSFJPTUEpOworICAgIH0KK30KKworI2luY2x1ZGUgIm1vdGlvbl9lc3RfdGVtcGxhdGUuYyIKKworc3RhdGljIGludCB6ZXJvX2NtcChNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqYSwgdWludDhfdCAqYiwKKyAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHplcm9faHBlbCh1aW50OF90ICphLCBjb25zdCB1aW50OF90ICpiLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCl7Cit9CisKK2ludCBmZl9pbml0X21lKE1wZWdFbmNDb250ZXh0ICpzKXsKKyAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOworICAgIGludCBjYWNoZV9zaXplPSBGRk1JTihNRV9NQVBfU0laRT4+TUVfTUFQX1NISUZULCAxPDxNRV9NQVBfU0hJRlQpOworICAgIGludCBkaWFfc2l6ZT0gRkZNQVgoRkZBQlMocy0+YXZjdHgtPmRpYV9zaXplKSYyNTUsIEZGQUJTKHMtPmF2Y3R4LT5wcmVfZGlhX3NpemUpJjI1NSk7CisKKyAgICBpZihGRk1JTihzLT5hdmN0eC0+ZGlhX3NpemUsIHMtPmF2Y3R4LT5wcmVfZGlhX3NpemUpIDwgLUZGTUlOKE1FX01BUF9TSVpFLCBNQVhfU0FCX1NJWkUpKXsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJNRV9NQVAgc2l6ZSBpcyB0b28gc21hbGwgZm9yIFNBQiBkaWFtb25kXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvL3NwZWNpYWwgY2FzZSBvZiBzbm93IGlzIG5lZWRlZCBiZWNhdXNlIHNub3cgdXNlcyBpdHMgb3duIGl0ZXJhdGl2ZSBNRSBjb2RlCisgICAgaWYocy0+bWVfbWV0aG9kIT1NRV9aRVJPICYmIHMtPm1lX21ldGhvZCE9TUVfRVBaUyAmJiBzLT5tZV9tZXRob2QhPU1FX1gxICYmIHMtPmF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9TTk9XKXsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJtZV9tZXRob2QgaXMgb25seSBhbGxvd2VkIHRvIGJlIHNldCB0byB6ZXJvIGFuZCBlcHpzOyBmb3IgaGV4LHVtaCxmdWxsIGFuZCBvdGhlcnMgc2VlIGRpYV9zaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGMtPmF2Y3R4PSBzLT5hdmN0eDsKKworICAgIGlmKGNhY2hlX3NpemUgPCAyKmRpYV9zaXplICYmICFjLT5zdHJpZGUpeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiTUVfTUFQIHNpemUgbWF5IGJlIGEgbGl0dGxlIHNtYWxsIGZvciB0aGUgc2VsZWN0ZWQgZGlhbW9uZCBzaXplXG4iKTsKKyAgICB9CisKKyAgICBmZl9zZXRfY21wKCZzLT5tZWNjLCBzLT5tZWNjLm1lX3ByZV9jbXAsIGMtPmF2Y3R4LT5tZV9wcmVfY21wKTsKKyAgICBmZl9zZXRfY21wKCZzLT5tZWNjLCBzLT5tZWNjLm1lX2NtcCwgICAgIGMtPmF2Y3R4LT5tZV9jbXApOworICAgIGZmX3NldF9jbXAoJnMtPm1lY2MsIHMtPm1lY2MubWVfc3ViX2NtcCwgYy0+YXZjdHgtPm1lX3N1Yl9jbXApOworICAgIGZmX3NldF9jbXAoJnMtPm1lY2MsIHMtPm1lY2MubWJfY21wLCAgICAgYy0+YXZjdHgtPm1iX2NtcCk7CisKKyAgICBjLT5mbGFncyAgICA9IGdldF9mbGFncyhjLCAwLCBjLT5hdmN0eC0+bWVfY21wICAgICZGRl9DTVBfQ0hST01BKTsKKyAgICBjLT5zdWJfZmxhZ3M9IGdldF9mbGFncyhjLCAwLCBjLT5hdmN0eC0+bWVfc3ViX2NtcCZGRl9DTVBfQ0hST01BKTsKKyAgICBjLT5tYl9mbGFncyA9IGdldF9mbGFncyhjLCAwLCBjLT5hdmN0eC0+bWJfY21wICAgICZGRl9DTVBfQ0hST01BKTsKKworLypGSVhNRSBzLT5ub19yb3VuZGluZyBiX3R5cGUqLworICAgIGlmKHMtPmZsYWdzJkNPREVDX0ZMQUdfUVBFTCl7CisgICAgICAgIGMtPnN1Yl9tb3Rpb25fc2VhcmNoPSBxcGVsX21vdGlvbl9zZWFyY2g7CisgICAgICAgIGMtPnFwZWxfYXZnID0gcy0+cWRzcC5hdmdfcXBlbF9waXhlbHNfdGFiOworICAgICAgICBpZiAocy0+bm9fcm91bmRpbmcpCisgICAgICAgICAgICBjLT5xcGVsX3B1dCA9IHMtPnFkc3AucHV0X25vX3JuZF9xcGVsX3BpeGVsc190YWI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGMtPnFwZWxfcHV0ID0gcy0+cWRzcC5wdXRfcXBlbF9waXhlbHNfdGFiOworICAgIH1lbHNleworICAgICAgICBpZihjLT5hdmN0eC0+bWVfc3ViX2NtcCZGRl9DTVBfQ0hST01BKQorICAgICAgICAgICAgYy0+c3ViX21vdGlvbl9zZWFyY2g9IGhwZWxfbW90aW9uX3NlYXJjaDsKKyAgICAgICAgZWxzZSBpZiggICBjLT5hdmN0eC0+bWVfc3ViX2NtcCA9PSBGRl9DTVBfU0FECisgICAgICAgICAgICAgICAgJiYgYy0+YXZjdHgtPiAgICBtZV9jbXAgPT0gRkZfQ01QX1NBRAorICAgICAgICAgICAgICAgICYmIGMtPmF2Y3R4LT4gICAgbWJfY21wID09IEZGX0NNUF9TQUQpCisgICAgICAgICAgICBjLT5zdWJfbW90aW9uX3NlYXJjaD0gc2FkX2hwZWxfbW90aW9uX3NlYXJjaDsgLy8gMjA1MCB2cy4gMjQ1MCBjeWNsZXMKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYy0+c3ViX21vdGlvbl9zZWFyY2g9IGhwZWxfbW90aW9uX3NlYXJjaDsKKyAgICB9CisgICAgYy0+aHBlbF9hdmcgPSBzLT5oZHNwLmF2Z19waXhlbHNfdGFiOworICAgIGlmIChzLT5ub19yb3VuZGluZykKKyAgICAgICAgYy0+aHBlbF9wdXQgPSBzLT5oZHNwLnB1dF9ub19ybmRfcGl4ZWxzX3RhYjsKKyAgICBlbHNlCisgICAgICAgIGMtPmhwZWxfcHV0ID0gcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYjsKKworICAgIGlmKHMtPmxpbmVzaXplKXsKKyAgICAgICAgYy0+c3RyaWRlICA9IHMtPmxpbmVzaXplOworICAgICAgICBjLT51dnN0cmlkZT0gcy0+dXZsaW5lc2l6ZTsKKyAgICB9ZWxzZXsKKyAgICAgICAgYy0+c3RyaWRlICA9IDE2KnMtPm1iX3dpZHRoICsgMzI7CisgICAgICAgIGMtPnV2c3RyaWRlPSAgOCpzLT5tYl93aWR0aCArIDE2OworICAgIH0KKworICAgIC8qIDh4OCBmdWxscGVsIHNlYXJjaCB3b3VsZCBuZWVkIGEgNHg0IGNocm9tYSBjb21wYXJlLCB3aGljaCB3ZSBkbworICAgICAqIG5vdCBoYXZlIHlldCwgYW5kIGV2ZW4gaWYgd2UgaGFkLCB0aGUgbW90aW9uIGVzdGltYXRpb24gY29kZQorICAgICAqIGRvZXMgbm90IGV4cGVjdCBpdC4gKi8KKyAgICBpZiAocy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfU05PVykgeworICAgICAgICBpZiAoKGMtPmF2Y3R4LT5tZV9jbXAgJiBGRl9DTVBfQ0hST01BKSAvKiAmJiAhcy0+bWVjYy5tZV9jbXBbMl0gKi8pCisgICAgICAgICAgICBzLT5tZWNjLm1lX2NtcFsyXSA9IHplcm9fY21wOworICAgICAgICBpZiAoKGMtPmF2Y3R4LT5tZV9zdWJfY21wICYgRkZfQ01QX0NIUk9NQSkgJiYgIXMtPm1lY2MubWVfc3ViX2NtcFsyXSkKKyAgICAgICAgICAgIHMtPm1lY2MubWVfc3ViX2NtcFsyXSA9IHplcm9fY21wOworICAgICAgICBjLT5ocGVsX3B1dFsyXVswXT0gYy0+aHBlbF9wdXRbMl1bMV09CisgICAgICAgIGMtPmhwZWxfcHV0WzJdWzJdPSBjLT5ocGVsX3B1dFsyXVszXT0gemVyb19ocGVsOworICAgIH0KKworICAgIGlmKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjEpeworICAgICAgICBjLT5zdWJfbW90aW9uX3NlYXJjaD0gbm9fc3ViX21vdGlvbl9zZWFyY2g7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfU0FEX0hBTEZfTVYoc3VmZml4LCB4LCB5KSBcCit7XAorICAgIGQgID0gcy0+bWVjYy5waXhfYWJzW3NpemVdWyh4ID8gMSA6IDApICsgKHkgPyAyIDogMCldKE5VTEwsIHBpeCwgcHRyICsgKCh4KSA+PiAxKSwgc3RyaWRlLCBoKTsgXAorICAgIGQgKz0gKG12X3BlbmFsdHlbcGVuX3ggKyB4XSArIG12X3BlbmFsdHlbcGVuX3kgKyB5XSkqcGVuYWx0eV9mYWN0b3I7XAorICAgIENPUFkzX0lGX0xUKGRtaW5oLCBkLCBkeCwgeCwgZHksIHkpXAorfQorCitzdGF0aWMgaW50IHNhZF9ocGVsX21vdGlvbl9zZWFyY2goTXBlZ0VuY0NvbnRleHQgKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbXhfcHRyLCBpbnQgKm15X3B0ciwgaW50IGRtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGgpCit7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBjb25zdCBpbnQgcGVuYWx0eV9mYWN0b3I9IGMtPnN1Yl9wZW5hbHR5X2ZhY3RvcjsKKyAgICBpbnQgbXgsIG15LCBkbWluaDsKKyAgICB1aW50OF90ICpwaXgsICpwdHI7CisgICAgaW50IHN0cmlkZT0gYy0+c3RyaWRlOworICAgIExPQURfQ09NTU9OCisKKyAgICBhdl9hc3NlcnQyKGMtPnN1Yl9mbGFncyA9PSAwKTsKKworICAgIGlmKGMtPnNraXApeworICAgICAgICAqbXhfcHRyID0gMDsKKyAgICAgICAgKm15X3B0ciA9IDA7CisgICAgICAgIHJldHVybiBkbWluOworICAgIH0KKworICAgIHBpeCA9IGMtPnNyY1tzcmNfaW5kZXhdWzBdOworCisgICAgbXggPSAqbXhfcHRyOworICAgIG15ID0gKm15X3B0cjsKKyAgICBwdHIgPSBjLT5yZWZbcmVmX2luZGV4XVswXSArIChteSAqIHN0cmlkZSkgKyBteDsKKworICAgIGRtaW5oID0gZG1pbjsKKworICAgIGlmIChteCA+IHhtaW4gJiYgbXggPCB4bWF4ICYmCisgICAgICAgIG15ID4geW1pbiAmJiBteSA8IHltYXgpIHsKKyAgICAgICAgaW50IGR4PTAsIGR5PTA7CisgICAgICAgIGludCBkLCBwZW5feCwgcGVuX3k7CisgICAgICAgIGNvbnN0IGludCBpbmRleD0gKG15PDxNRV9NQVBfU0hJRlQpICsgbXg7CisgICAgICAgIGNvbnN0IGludCB0PSBzY29yZV9tYXBbKGluZGV4LSgxPDxNRV9NQVBfU0hJRlQpKSYoTUVfTUFQX1NJWkUtMSldOworICAgICAgICBjb25zdCBpbnQgbD0gc2NvcmVfbWFwWyhpbmRleC0gMSAgICAgICAgICAgICAgICkmKE1FX01BUF9TSVpFLTEpXTsKKyAgICAgICAgY29uc3QgaW50IHI9IHNjb3JlX21hcFsoaW5kZXgrIDEgICAgICAgICAgICAgICApJihNRV9NQVBfU0laRS0xKV07CisgICAgICAgIGNvbnN0IGludCBiPSBzY29yZV9tYXBbKGluZGV4KygxPDxNRV9NQVBfU0hJRlQpKSYoTUVfTUFQX1NJWkUtMSldOworICAgICAgICBteDw8PTE7CisgICAgICAgIG15PDw9MTsKKworCisgICAgICAgIHBlbl94PSBwcmVkX3ggKyBteDsKKyAgICAgICAgcGVuX3k9IHByZWRfeSArIG15OworCisgICAgICAgIHB0ci09IHN0cmlkZTsKKyAgICAgICAgaWYodDw9Yil7CisgICAgICAgICAgICBDSEVDS19TQURfSEFMRl9NVih5MiAsIDAsIC0xKQorICAgICAgICAgICAgaWYobDw9cil7CisgICAgICAgICAgICAgICAgQ0hFQ0tfU0FEX0hBTEZfTVYoeHkyLCAtMSwgLTEpCisgICAgICAgICAgICAgICAgaWYodCtyPD1iK2wpeworICAgICAgICAgICAgICAgICAgICBDSEVDS19TQURfSEFMRl9NVih4eTIsICsxLCAtMSkKKyAgICAgICAgICAgICAgICAgICAgcHRyKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBwdHIrPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX1NBRF9IQUxGX01WKHh5MiwgLTEsICsxKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19TQURfSEFMRl9NVih4MiAsIC0xLCAgMCkKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIENIRUNLX1NBRF9IQUxGX01WKHh5MiwgKzEsIC0xKQorICAgICAgICAgICAgICAgIGlmKHQrbDw9YityKXsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfU0FEX0hBTEZfTVYoeHkyLCAtMSwgLTEpCisgICAgICAgICAgICAgICAgICAgIHB0cis9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgcHRyKz0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICBDSEVDS19TQURfSEFMRl9NVih4eTIsICsxLCArMSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ0hFQ0tfU0FEX0hBTEZfTVYoeDIgLCArMSwgIDApCisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgaWYobDw9cil7CisgICAgICAgICAgICAgICAgaWYodCtsPD1iK3IpeworICAgICAgICAgICAgICAgICAgICBDSEVDS19TQURfSEFMRl9NVih4eTIsIC0xLCAtMSkKKyAgICAgICAgICAgICAgICAgICAgcHRyKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBwdHIrPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX1NBRF9IQUxGX01WKHh5MiwgKzEsICsxKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19TQURfSEFMRl9NVih4MiAsIC0xLCAgMCkKKyAgICAgICAgICAgICAgICBDSEVDS19TQURfSEFMRl9NVih4eTIsIC0xLCArMSkKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKHQrcjw9YitsKXsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfU0FEX0hBTEZfTVYoeHkyLCArMSwgLTEpCisgICAgICAgICAgICAgICAgICAgIHB0cis9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgcHRyKz0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICBDSEVDS19TQURfSEFMRl9NVih4eTIsIC0xLCArMSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ0hFQ0tfU0FEX0hBTEZfTVYoeDIgLCArMSwgIDApCisgICAgICAgICAgICAgICAgQ0hFQ0tfU0FEX0hBTEZfTVYoeHkyLCArMSwgKzEpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19TQURfSEFMRl9NVih5MiAsICAwLCArMSkKKyAgICAgICAgfQorICAgICAgICBteCs9ZHg7CisgICAgICAgIG15Kz1keTsKKworICAgIH1lbHNleworICAgICAgICBteDw8PTE7CisgICAgICAgIG15PDw9MTsKKyAgICB9CisKKyAgICAqbXhfcHRyID0gbXg7CisgICAgKm15X3B0ciA9IG15OworICAgIHJldHVybiBkbWluaDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wX212X3RhYmxlcyhNcGVnRW5jQ29udGV4dCAqIHMsIGludCBteCwgaW50IG15LCBpbnQgbXY0KQoreworICAgIGNvbnN0IGludCB4eT0gcy0+bWJfeCArIHMtPm1iX3kqcy0+bWJfc3RyaWRlOworCisgICAgcy0+cF9tdl90YWJsZVt4eV1bMF0gPSBteDsKKyAgICBzLT5wX212X3RhYmxlW3h5XVsxXSA9IG15OworCisgICAgLyogaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gdGhlIDQgTVYgaWYgNE1WIGlzIGRvbmUgKi8KKyAgICBpZihtdjQpeworICAgICAgICBpbnQgbW90X3h5PSBzLT5ibG9ja19pbmRleFswXTsKKworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVttb3RfeHkgICAgXVswXSA9IG14OworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVttb3RfeHkgICAgXVsxXSA9IG15OworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVttb3RfeHkgKyAxXVswXSA9IG14OworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVttb3RfeHkgKyAxXVsxXSA9IG15OworCisgICAgICAgIG1vdF94eSArPSBzLT5iOF9zdHJpZGU7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW21vdF94eSAgICBdWzBdID0gbXg7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW21vdF94eSAgICBdWzFdID0gbXk7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW21vdF94eSArIDFdWzBdID0gbXg7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW21vdF94eSArIDFdWzFdID0gbXk7CisgICAgfQorfQorCisvKioKKyAqIGdldCBmdWxscGVsIE1FIHNlYXJjaCBsaW1pdHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfbGltaXRzKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgeCwgaW50IHkpCit7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBpbnQgcmFuZ2U9IGMtPmF2Y3R4LT5tZV9yYW5nZSA+PiAoMSArICEhKGMtPmZsYWdzJkZMQUdfUVBFTCkpOworICAgIGludCBtYXhfcmFuZ2UgPSBNQVhfTVYgPj4gKDEgKyAhIShjLT5mbGFncyZGTEFHX1FQRUwpKTsKKy8qCisgICAgaWYoYy0+YXZjdHgtPm1lX3JhbmdlKSBjLT5yYW5nZT0gYy0+YXZjdHgtPm1lX3JhbmdlID4+IDE7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICBjLT5yYW5nZT0gMTY7CisqLworICAgIGlmIChzLT51bnJlc3RyaWN0ZWRfbXYpIHsKKyAgICAgICAgYy0+eG1pbiA9IC0geCAtIDE2OworICAgICAgICBjLT55bWluID0gLSB5IC0gMTY7CisgICAgICAgIGMtPnhtYXggPSAtIHggKyBzLT53aWR0aDsKKyAgICAgICAgYy0+eW1heCA9IC0geSArIHMtPmhlaWdodDsKKyAgICB9IGVsc2UgaWYgKHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjEpeworICAgICAgICAvLyBTZWFyY2ggcmFuZ2Ugb2YgSDI2MSBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlciBjb2RlYyBzdGFuZGFyZHMKKyAgICAgICAgYy0+eG1pbiA9ICh4ID4gMTUpID8gLSAxNSA6IDA7CisgICAgICAgIGMtPnltaW4gPSAoeSA+IDE1KSA/IC0gMTUgOiAwOworICAgICAgICBjLT54bWF4ID0gKHggPCBzLT5tYl93aWR0aCAqIDE2IC0gMTYpID8gMTUgOiAwOworICAgICAgICBjLT55bWF4ID0gKHkgPCBzLT5tYl9oZWlnaHQgKiAxNiAtIDE2KSA/IDE1IDogMDsKKyAgICB9IGVsc2UgeworICAgICAgICBjLT54bWluID0gLSB4OworICAgICAgICBjLT55bWluID0gLSB5OworICAgICAgICBjLT54bWF4ID0gLSB4ICsgcy0+bWJfd2lkdGggKjE2IC0gMTY7CisgICAgICAgIGMtPnltYXggPSAtIHkgKyBzLT5tYl9oZWlnaHQqMTYgLSAxNjsKKyAgICB9CisgICAgaWYoIXJhbmdlIHx8IHJhbmdlID4gbWF4X3JhbmdlKQorICAgICAgICByYW5nZSA9IG1heF9yYW5nZTsKKyAgICBpZihyYW5nZSl7CisgICAgICAgIGMtPnhtaW4gPSBGRk1BWChjLT54bWluLC1yYW5nZSk7CisgICAgICAgIGMtPnhtYXggPSBGRk1JTihjLT54bWF4LCByYW5nZSk7CisgICAgICAgIGMtPnltaW4gPSBGRk1BWChjLT55bWluLC1yYW5nZSk7CisgICAgICAgIGMtPnltYXggPSBGRk1JTihjLT55bWF4LCByYW5nZSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9tdjRfcmVmKE1vdGlvbkVzdENvbnRleHQgKmMpeworICAgIGNvbnN0IGludCBzdHJpZGU9IGMtPnN0cmlkZTsKKworICAgIGMtPnJlZlsxXVswXSA9IGMtPnJlZlswXVswXSArIDg7CisgICAgYy0+cmVmWzJdWzBdID0gYy0+cmVmWzBdWzBdICsgOCpzdHJpZGU7CisgICAgYy0+cmVmWzNdWzBdID0gYy0+cmVmWzJdWzBdICsgODsKKyAgICBjLT5zcmNbMV1bMF0gPSBjLT5zcmNbMF1bMF0gKyA4OworICAgIGMtPnNyY1syXVswXSA9IGMtPnNyY1swXVswXSArIDgqc3RyaWRlOworICAgIGMtPnNyY1szXVswXSA9IGMtPnNyY1syXVswXSArIDg7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGgyNjNfbXY0X3NlYXJjaChNcGVnRW5jQ29udGV4dCAqcywgaW50IG14LCBpbnQgbXksIGludCBzaGlmdCkKK3sKKyAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOworICAgIGNvbnN0IGludCBzaXplPSAxOworICAgIGNvbnN0IGludCBoPTg7CisgICAgaW50IGJsb2NrOworICAgIGludCBQWzEwXVsyXTsKKyAgICBpbnQgZG1pbl9zdW09MCwgbXg0X3N1bT0wLCBteTRfc3VtPTAsIGk7CisgICAgaW50IHNhbWU9MTsKKyAgICBjb25zdCBpbnQgc3RyaWRlPSBjLT5zdHJpZGU7CisgICAgdWludDhfdCAqbXZfcGVuYWx0eT0gYy0+Y3VycmVudF9tdl9wZW5hbHR5OworICAgIGludCBzYWZ0ZXlfY2xpcGluZz0gcy0+dW5yZXN0cmljdGVkX212ICYmIChzLT53aWR0aCYxNSkgJiYgKHMtPmhlaWdodCYxNSk7CisKKyAgICBpbml0X212NF9yZWYoYyk7CisKKyAgICBmb3IoYmxvY2s9MDsgYmxvY2s8NDsgYmxvY2srKyl7CisgICAgICAgIGludCBteDQsIG15NDsKKyAgICAgICAgaW50IHByZWRfeDQsIHByZWRfeTQ7CisgICAgICAgIGludCBkbWluNDsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBvZmZbNF09IHsyLCAxLCAxLCAtMX07CisgICAgICAgIGNvbnN0IGludCBtb3Rfc3RyaWRlID0gcy0+Yjhfc3RyaWRlOworICAgICAgICBjb25zdCBpbnQgbW90X3h5ID0gcy0+YmxvY2tfaW5kZXhbYmxvY2tdOworCisgICAgICAgIGlmKHNhZnRleV9jbGlwaW5nKXsKKyAgICAgICAgICAgIGMtPnhtYXggPSAtIDE2KnMtPm1iX3ggKyBzLT53aWR0aCAgLSA4KihibG9jayAmMSk7CisgICAgICAgICAgICBjLT55bWF4ID0gLSAxNipzLT5tYl95ICsgcy0+aGVpZ2h0IC0gOCooYmxvY2s+PjEpOworICAgICAgICB9CisKKyAgICAgICAgUF9MRUZUWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bbW90X3h5IC0gMV1bMF07CisgICAgICAgIFBfTEVGVFsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW21vdF94eSAtIDFdWzFdOworCisgICAgICAgIGlmKFBfTEVGVFswXSAgICAgICA+IChjLT54bWF4PDxzaGlmdCkpIFBfTEVGVFswXSAgICAgICA9IChjLT54bWF4PDxzaGlmdCk7CisKKyAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciBmaXJzdCBsaW5lICovCisgICAgICAgIGlmIChzLT5maXJzdF9zbGljZV9saW5lICYmIGJsb2NrPDIpIHsKKyAgICAgICAgICAgIGMtPnByZWRfeD0gcHJlZF94ND0gUF9MRUZUWzBdOworICAgICAgICAgICAgYy0+cHJlZF95PSBwcmVkX3k0PSBQX0xFRlRbMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQX1RPUFswXSAgICAgID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bbW90X3h5IC0gbW90X3N0cmlkZSAgICAgICAgICAgICBdWzBdOworICAgICAgICAgICAgUF9UT1BbMV0gICAgICA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW21vdF94eSAtIG1vdF9zdHJpZGUgICAgICAgICAgICAgXVsxXTsKKyAgICAgICAgICAgIFBfVE9QUklHSFRbMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVttb3RfeHkgLSBtb3Rfc3RyaWRlICsgb2ZmW2Jsb2NrXV1bMF07CisgICAgICAgICAgICBQX1RPUFJJR0hUWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bbW90X3h5IC0gbW90X3N0cmlkZSArIG9mZltibG9ja11dWzFdOworICAgICAgICAgICAgaWYoUF9UT1BbMV0gICAgICA+IChjLT55bWF4PDxzaGlmdCkpIFBfVE9QWzFdICAgICA9IChjLT55bWF4PDxzaGlmdCk7CisgICAgICAgICAgICBpZihQX1RPUFJJR0hUWzBdIDwgKGMtPnhtaW48PHNoaWZ0KSkgUF9UT1BSSUdIVFswXT0gKGMtPnhtaW48PHNoaWZ0KTsKKyAgICAgICAgICAgIGlmKFBfVE9QUklHSFRbMF0gPiAoYy0+eG1heDw8c2hpZnQpKSBQX1RPUFJJR0hUWzBdPSAoYy0+eG1heDw8c2hpZnQpOworICAgICAgICAgICAgaWYoUF9UT1BSSUdIVFsxXSA+IChjLT55bWF4PDxzaGlmdCkpIFBfVE9QUklHSFRbMV09IChjLT55bWF4PDxzaGlmdCk7CisKKyAgICAgICAgICAgIFBfTUVESUFOWzBdPSBtaWRfcHJlZChQX0xFRlRbMF0sIFBfVE9QWzBdLCBQX1RPUFJJR0hUWzBdKTsKKyAgICAgICAgICAgIFBfTUVESUFOWzFdPSBtaWRfcHJlZChQX0xFRlRbMV0sIFBfVE9QWzFdLCBQX1RPUFJJR0hUWzFdKTsKKworICAgICAgICAgICAgYy0+cHJlZF94PSBwcmVkX3g0ID0gUF9NRURJQU5bMF07CisgICAgICAgICAgICBjLT5wcmVkX3k9IHByZWRfeTQgPSBQX01FRElBTlsxXTsKKyAgICAgICAgfQorICAgICAgICBQX01WMVswXT0gbXg7CisgICAgICAgIFBfTVYxWzFdPSBteTsKKyAgICAgICAgaWYoc2FmdGV5X2NsaXBpbmcpCisgICAgICAgICAgICBmb3IoaT0xOyBpPDEwOyBpKyspeworICAgICAgICAgICAgICAgIGlmIChzLT5maXJzdF9zbGljZV9saW5lICYmIGJsb2NrPDIgJiYgaT4xICYmIGk8OSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGk+NCAmJiBpPDkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmKFBbaV1bMF0gPiAoYy0+eG1heDw8c2hpZnQpKSBQW2ldWzBdPSAoYy0+eG1heDw8c2hpZnQpOworICAgICAgICAgICAgICAgIGlmKFBbaV1bMV0gPiAoYy0+eW1heDw8c2hpZnQpKSBQW2ldWzFdPSAoYy0+eW1heDw8c2hpZnQpOworICAgICAgICAgICAgfQorCisgICAgICAgIGRtaW40ID0gZXB6c19tb3Rpb25fc2VhcmNoNChzLCAmbXg0LCAmbXk0LCBQLCBibG9jaywgYmxvY2ssIHMtPnBfbXZfdGFibGUsICgxPDwxNik+PnNoaWZ0KTsKKworICAgICAgICBkbWluND0gYy0+c3ViX21vdGlvbl9zZWFyY2gocywgJm14NCwgJm15NCwgZG1pbjQsIGJsb2NrLCBibG9jaywgc2l6ZSwgaCk7CisKKyAgICAgICAgaWYgKHMtPm1lY2MubWVfc3ViX2NtcFswXSAhPSBzLT5tZWNjLm1iX2NtcFswXSkgeworICAgICAgICAgICAgaW50IGR4eTsKKyAgICAgICAgICAgIGNvbnN0IGludCBvZmZzZXQ9ICgoYmxvY2smMSkgKyAoYmxvY2s+PjEpKnN0cmlkZSkqODsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfeSA9IGMtPnNjcmF0Y2hwYWQgKyBvZmZzZXQ7CisgICAgICAgICAgICBpZihzLT5xdWFydGVyX3NhbXBsZSl7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcmVmPSBjLT5yZWZbYmxvY2tdWzBdICsgKG14ND4+MikgKyAobXk0Pj4yKSpzdHJpZGU7CisgICAgICAgICAgICAgICAgZHh5ID0gKChteTQgJiAzKSA8PCAyKSB8IChteDQgJiAzKTsKKworICAgICAgICAgICAgICAgIGlmKHMtPm5vX3JvdW5kaW5nKQorICAgICAgICAgICAgICAgICAgICBzLT5xZHNwLnB1dF9ub19ybmRfcXBlbF9waXhlbHNfdGFiWzFdW2R4eV0oZGVzdF95LCByZWYsIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzLT5xZHNwLnB1dF9xcGVsX3BpeGVsc190YWJbMV1bZHh5XShkZXN0X3ksIHJlZiwgc3RyaWRlKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJlZj0gYy0+cmVmW2Jsb2NrXVswXSArIChteDQ+PjEpICsgKG15ND4+MSkqc3RyaWRlOworICAgICAgICAgICAgICAgIGR4eSA9ICgobXk0ICYgMSkgPDwgMSkgfCAobXg0ICYgMSk7CisKKyAgICAgICAgICAgICAgICBpZihzLT5ub19yb3VuZGluZykKKyAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bZHh5XShkZXN0X3kgICAgLCByZWYgICAgLCBzdHJpZGUsIGgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYiAgICAgICBbMV1bZHh5XShkZXN0X3kgICAgLCByZWYgICAgLCBzdHJpZGUsIGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG1pbl9zdW0rPSAobXZfcGVuYWx0eVtteDQtcHJlZF94NF0gKyBtdl9wZW5hbHR5W215NC1wcmVkX3k0XSkqYy0+bWJfcGVuYWx0eV9mYWN0b3I7CisgICAgICAgIH1lbHNlCisgICAgICAgICAgICBkbWluX3N1bSs9IGRtaW40OworCisgICAgICAgIGlmKHMtPnF1YXJ0ZXJfc2FtcGxlKXsKKyAgICAgICAgICAgIG14NF9zdW0rPSBteDQvMjsKKyAgICAgICAgICAgIG15NF9zdW0rPSBteTQvMjsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBteDRfc3VtKz0gbXg0OworICAgICAgICAgICAgbXk0X3N1bSs9IG15NDsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3MtPmJsb2NrX2luZGV4W2Jsb2NrXV1bMF0gPSBteDQ7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3MtPmJsb2NrX2luZGV4W2Jsb2NrXV1bMV0gPSBteTQ7CisKKyAgICAgICAgaWYobXg0ICE9IG14IHx8IG15NCAhPSBteSkgc2FtZT0wOworICAgIH0KKworICAgIGlmKHNhbWUpCisgICAgICAgIHJldHVybiBJTlRfTUFYOworCisgICAgaWYgKHMtPm1lY2MubWVfc3ViX2NtcFswXSAhPSBzLT5tZWNjLm1iX2NtcFswXSkgeworICAgICAgICBkbWluX3N1bSArPSBzLT5tZWNjLm1iX2NtcFswXShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5uZXdfcGljdHVyZS5mLT5kYXRhWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfeCAqIDE2ICsgcy0+bWJfeSAqIDE2ICogc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zY3JhdGNocGFkLCBzdHJpZGUsIDE2KTsKKyAgICB9CisKKyAgICBpZihjLT5hdmN0eC0+bWJfY21wJkZGX0NNUF9DSFJPTUEpeworICAgICAgICBpbnQgZHh5OworICAgICAgICBpbnQgbXgsIG15OworICAgICAgICBpbnQgb2Zmc2V0OworCisgICAgICAgIG14PSBmZl9oMjYzX3JvdW5kX2Nocm9tYShteDRfc3VtKTsKKyAgICAgICAgbXk9IGZmX2gyNjNfcm91bmRfY2hyb21hKG15NF9zdW0pOworICAgICAgICBkeHkgPSAoKG15ICYgMSkgPDwgMSkgfCAobXggJiAxKTsKKworICAgICAgICBvZmZzZXQ9IChzLT5tYl94KjggKyAobXg+PjEpKSArIChzLT5tYl95KjggKyAobXk+PjEpKSpzLT51dmxpbmVzaXplOworCisgICAgICAgIGlmKHMtPm5vX3JvdW5kaW5nKXsKKyAgICAgICAgICAgIHMtPmhkc3AucHV0X25vX3JuZF9waXhlbHNfdGFiWzFdW2R4eV0oYy0+c2NyYXRjaHBhZCAgICAsIHMtPmxhc3RfcGljdHVyZS5mLT5kYXRhWzFdICsgb2Zmc2V0LCBzLT51dmxpbmVzaXplLCA4KTsKKyAgICAgICAgICAgIHMtPmhkc3AucHV0X25vX3JuZF9waXhlbHNfdGFiWzFdW2R4eV0oYy0+c2NyYXRjaHBhZCArIDgsIHMtPmxhc3RfcGljdHVyZS5mLT5kYXRhWzJdICsgb2Zmc2V0LCBzLT51dmxpbmVzaXplLCA4KTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiICAgICAgIFsxXVtkeHldKGMtPnNjcmF0Y2hwYWQgICAgLCBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVsxXSArIG9mZnNldCwgcy0+dXZsaW5lc2l6ZSwgOCk7CisgICAgICAgICAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiICAgICAgIFsxXVtkeHldKGMtPnNjcmF0Y2hwYWQgKyA4LCBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVsyXSArIG9mZnNldCwgcy0+dXZsaW5lc2l6ZSwgOCk7CisgICAgICAgIH0KKworICAgICAgICBkbWluX3N1bSArPSBzLT5tZWNjLm1iX2NtcFsxXShzLCBzLT5uZXdfcGljdHVyZS5mLT5kYXRhWzFdICsgcy0+bWJfeCAqIDggKyBzLT5tYl95ICogOCAqIHMtPnV2bGluZXNpemUsIGMtPnNjcmF0Y2hwYWQsICAgICBzLT51dmxpbmVzaXplLCA4KTsKKyAgICAgICAgZG1pbl9zdW0gKz0gcy0+bWVjYy5tYl9jbXBbMV0ocywgcy0+bmV3X3BpY3R1cmUuZi0+ZGF0YVsyXSArIHMtPm1iX3ggKiA4ICsgcy0+bWJfeSAqIDggKiBzLT51dmxpbmVzaXplLCBjLT5zY3JhdGNocGFkICsgOCwgcy0+dXZsaW5lc2l6ZSwgOCk7CisgICAgfQorCisgICAgYy0+cHJlZF94PSBteDsKKyAgICBjLT5wcmVkX3k9IG15OworCisgICAgc3dpdGNoKGMtPmF2Y3R4LT5tYl9jbXAmMHhGRil7CisgICAgLypjYXNlIEZGX0NNUF9TU0U6CisgICAgICAgIHJldHVybiBkbWluX3N1bSsgMzIqcy0+cXNjYWxlKnMtPnFzY2FsZTsqLworICAgIGNhc2UgRkZfQ01QX1JEOgorICAgICAgICByZXR1cm4gZG1pbl9zdW07CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGRtaW5fc3VtKyAxMSpjLT5tYl9wZW5hbHR5X2ZhY3RvcjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2ludGVybGFjZWRfcmVmKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgcmVmX2luZGV4KXsKKyAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOworCisgICAgYy0+cmVmWzErcmVmX2luZGV4XVswXSA9IGMtPnJlZlswK3JlZl9pbmRleF1bMF0gKyBzLT5saW5lc2l6ZTsKKyAgICBjLT5zcmNbMV1bMF0gPSBjLT5zcmNbMF1bMF0gKyBzLT5saW5lc2l6ZTsKKyAgICBpZihjLT5mbGFncyAmIEZMQUdfQ0hST01BKXsKKyAgICAgICAgYy0+cmVmWzErcmVmX2luZGV4XVsxXSA9IGMtPnJlZlswK3JlZl9pbmRleF1bMV0gKyBzLT51dmxpbmVzaXplOworICAgICAgICBjLT5yZWZbMStyZWZfaW5kZXhdWzJdID0gYy0+cmVmWzArcmVmX2luZGV4XVsyXSArIHMtPnV2bGluZXNpemU7CisgICAgICAgIGMtPnNyY1sxXVsxXSA9IGMtPnNyY1swXVsxXSArIHMtPnV2bGluZXNpemU7CisgICAgICAgIGMtPnNyY1sxXVsyXSA9IGMtPnNyY1swXVsyXSArIHMtPnV2bGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGludGVybGFjZWRfc2VhcmNoKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgcmVmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICgqbXZfdGFibGVzWzJdWzJdKVsyXSwgdWludDhfdCAqZmllbGRfc2VsZWN0X3RhYmxlc1syXSwgaW50IG14LCBpbnQgbXksIGludCB1c2VyX2ZpZWxkX3NlbGVjdCkKK3sKKyAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOworICAgIGNvbnN0IGludCBzaXplPTA7CisgICAgY29uc3QgaW50IGg9ODsKKyAgICBpbnQgYmxvY2s7CisgICAgaW50IFBbMTBdWzJdOworICAgIHVpbnQ4X3QgKiBjb25zdCBtdl9wZW5hbHR5PSBjLT5jdXJyZW50X212X3BlbmFsdHk7CisgICAgaW50IHNhbWU9MTsKKyAgICBjb25zdCBpbnQgc3RyaWRlPSAyKnMtPmxpbmVzaXplOworICAgIGludCBkbWluX3N1bT0gMDsKKyAgICBjb25zdCBpbnQgbW90X3N0cmlkZT0gcy0+bWJfc3RyaWRlOworICAgIGNvbnN0IGludCB4eT0gcy0+bWJfeCArIHMtPm1iX3kqbW90X3N0cmlkZTsKKworICAgIGMtPnltaW4+Pj0xOworICAgIGMtPnltYXg+Pj0xOworICAgIGMtPnN0cmlkZTw8PTE7CisgICAgYy0+dXZzdHJpZGU8PD0xOworICAgIGluaXRfaW50ZXJsYWNlZF9yZWYocywgcmVmX2luZGV4KTsKKworICAgIGZvcihibG9jaz0wOyBibG9jazwyOyBibG9jaysrKXsKKyAgICAgICAgaW50IGZpZWxkX3NlbGVjdDsKKyAgICAgICAgaW50IGJlc3RfZG1pbj0gSU5UX01BWDsKKyAgICAgICAgaW50IGJlc3RfZmllbGQ9IC0xOworCisgICAgICAgIGZvcihmaWVsZF9zZWxlY3Q9MDsgZmllbGRfc2VsZWN0PDI7IGZpZWxkX3NlbGVjdCsrKXsKKyAgICAgICAgICAgIGludCBkbWluLCBteF9pLCBteV9pOworICAgICAgICAgICAgaW50MTZfdCAoKm12X3RhYmxlKVsyXT0gbXZfdGFibGVzW2Jsb2NrXVtmaWVsZF9zZWxlY3RdOworCisgICAgICAgICAgICBpZih1c2VyX2ZpZWxkX3NlbGVjdCl7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MShmaWVsZF9zZWxlY3Q9PTAgfHwgZmllbGRfc2VsZWN0PT0xKTsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQxKGZpZWxkX3NlbGVjdF90YWJsZXNbYmxvY2tdW3h5XT09MCB8fCBmaWVsZF9zZWxlY3RfdGFibGVzW2Jsb2NrXVt4eV09PTEpOworICAgICAgICAgICAgICAgIGlmKGZpZWxkX3NlbGVjdF90YWJsZXNbYmxvY2tdW3h5XSAhPSBmaWVsZF9zZWxlY3QpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQX0xFRlRbMF0gPSBtdl90YWJsZVt4eSAtIDFdWzBdOworICAgICAgICAgICAgUF9MRUZUWzFdID0gbXZfdGFibGVbeHkgLSAxXVsxXTsKKyAgICAgICAgICAgIGlmKFBfTEVGVFswXSAgICAgICA+IChjLT54bWF4PDwxKSkgUF9MRUZUWzBdICAgICAgID0gKGMtPnhtYXg8PDEpOworCisgICAgICAgICAgICBjLT5wcmVkX3g9IFBfTEVGVFswXTsKKyAgICAgICAgICAgIGMtPnByZWRfeT0gUF9MRUZUWzFdOworCisgICAgICAgICAgICBpZighcy0+Zmlyc3Rfc2xpY2VfbGluZSl7CisgICAgICAgICAgICAgICAgUF9UT1BbMF0gICAgICA9IG12X3RhYmxlW3h5IC0gbW90X3N0cmlkZV1bMF07CisgICAgICAgICAgICAgICAgUF9UT1BbMV0gICAgICA9IG12X3RhYmxlW3h5IC0gbW90X3N0cmlkZV1bMV07CisgICAgICAgICAgICAgICAgUF9UT1BSSUdIVFswXSA9IG12X3RhYmxlW3h5IC0gbW90X3N0cmlkZSArIDFdWzBdOworICAgICAgICAgICAgICAgIFBfVE9QUklHSFRbMV0gPSBtdl90YWJsZVt4eSAtIG1vdF9zdHJpZGUgKyAxXVsxXTsKKyAgICAgICAgICAgICAgICBpZihQX1RPUFsxXSAgICAgID4gKGMtPnltYXg8PDEpKSBQX1RPUFsxXSAgICAgPSAoYy0+eW1heDw8MSk7CisgICAgICAgICAgICAgICAgaWYoUF9UT1BSSUdIVFswXSA8IChjLT54bWluPDwxKSkgUF9UT1BSSUdIVFswXT0gKGMtPnhtaW48PDEpOworICAgICAgICAgICAgICAgIGlmKFBfVE9QUklHSFRbMF0gPiAoYy0+eG1heDw8MSkpIFBfVE9QUklHSFRbMF09IChjLT54bWF4PDwxKTsKKyAgICAgICAgICAgICAgICBpZihQX1RPUFJJR0hUWzFdID4gKGMtPnltYXg8PDEpKSBQX1RPUFJJR0hUWzFdPSAoYy0+eW1heDw8MSk7CisKKyAgICAgICAgICAgICAgICBQX01FRElBTlswXT0gbWlkX3ByZWQoUF9MRUZUWzBdLCBQX1RPUFswXSwgUF9UT1BSSUdIVFswXSk7CisgICAgICAgICAgICAgICAgUF9NRURJQU5bMV09IG1pZF9wcmVkKFBfTEVGVFsxXSwgUF9UT1BbMV0sIFBfVE9QUklHSFRbMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUF9NVjFbMF09IG14OyAvL0ZJWE1FIG5vdCBjb3JyZWN0IGlmIGJsb2NrICE9IGZpZWxkX3NlbGVjdAorICAgICAgICAgICAgUF9NVjFbMV09IG15IC8gMjsKKworICAgICAgICAgICAgZG1pbiA9IGVwenNfbW90aW9uX3NlYXJjaDIocywgJm14X2ksICZteV9pLCBQLCBibG9jaywgZmllbGRfc2VsZWN0K3JlZl9pbmRleCwgbXZfdGFibGUsICgxPDwxNik+PjEpOworCisgICAgICAgICAgICBkbWluPSBjLT5zdWJfbW90aW9uX3NlYXJjaChzLCAmbXhfaSwgJm15X2ksIGRtaW4sIGJsb2NrLCBmaWVsZF9zZWxlY3QrcmVmX2luZGV4LCBzaXplLCBoKTsKKworICAgICAgICAgICAgbXZfdGFibGVbeHldWzBdPSBteF9pOworICAgICAgICAgICAgbXZfdGFibGVbeHldWzFdPSBteV9pOworCisgICAgICAgICAgICBpZiAocy0+bWVjYy5tZV9zdWJfY21wWzBdICE9IHMtPm1lY2MubWJfY21wWzBdKSB7CisgICAgICAgICAgICAgICAgaW50IGR4eTsKKworICAgICAgICAgICAgICAgIC8vRklYTUUgY2hyb21hIE1FCisgICAgICAgICAgICAgICAgdWludDhfdCAqcmVmPSBjLT5yZWZbZmllbGRfc2VsZWN0K3JlZl9pbmRleF1bMF0gKyAobXhfaT4+MSkgKyAobXlfaT4+MSkqc3RyaWRlOworICAgICAgICAgICAgICAgIGR4eSA9ICgobXlfaSAmIDEpIDw8IDEpIHwgKG14X2kgJiAxKTsKKworICAgICAgICAgICAgICAgIGlmKHMtPm5vX3JvdW5kaW5nKXsKKyAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5wdXRfbm9fcm5kX3BpeGVsc190YWJbc2l6ZV1bZHh5XShjLT5zY3JhdGNocGFkLCByZWYgICAgLCBzdHJpZGUsIGgpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiICAgICAgIFtzaXplXVtkeHldKGMtPnNjcmF0Y2hwYWQsIHJlZiAgICAsIHN0cmlkZSwgaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRtaW4gPSBzLT5tZWNjLm1iX2NtcFtzaXplXShzLCBjLT5zcmNbYmxvY2tdWzBdLCBjLT5zY3JhdGNocGFkLCBzdHJpZGUsIGgpOworICAgICAgICAgICAgICAgIGRtaW4rPSAobXZfcGVuYWx0eVtteF9pLWMtPnByZWRfeF0gKyBtdl9wZW5hbHR5W215X2ktYy0+cHJlZF95XSArIDEpKmMtPm1iX3BlbmFsdHlfZmFjdG9yOworICAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgICAgICBkbWluKz0gYy0+bWJfcGVuYWx0eV9mYWN0b3I7IC8vZmllbGRfc2VsZWN0IGJpdHMKKworICAgICAgICAgICAgZG1pbiArPSBmaWVsZF9zZWxlY3QgIT0gYmxvY2s7IC8vc2xpZ2h0bHkgcHJlZmVyIHNhbWUgZmllbGQKKworICAgICAgICAgICAgaWYoZG1pbiA8IGJlc3RfZG1pbil7CisgICAgICAgICAgICAgICAgYmVzdF9kbWluPSBkbWluOworICAgICAgICAgICAgICAgIGJlc3RfZmllbGQ9IGZpZWxkX3NlbGVjdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBpbnQxNl90ICgqbXZfdGFibGUpWzJdPSBtdl90YWJsZXNbYmxvY2tdW2Jlc3RfZmllbGRdOworCisgICAgICAgICAgICBpZihtdl90YWJsZVt4eV1bMF0gIT0gbXgpIHNhbWU9MDsgLy9GSVhNRSBjaGVjayBpZiB0aGVzZSBjaGVja3Mgd29yayBhbmQgYXJlIGFueSBnb29kIGF0IGFsbAorICAgICAgICAgICAgaWYobXZfdGFibGVbeHldWzFdJjEpIHNhbWU9MDsKKyAgICAgICAgICAgIGlmKG12X3RhYmxlW3h5XVsxXSoyICE9IG15KSBzYW1lPTA7CisgICAgICAgICAgICBpZihiZXN0X2ZpZWxkICE9IGJsb2NrKSBzYW1lPTA7CisgICAgICAgIH0KKworICAgICAgICBmaWVsZF9zZWxlY3RfdGFibGVzW2Jsb2NrXVt4eV09IGJlc3RfZmllbGQ7CisgICAgICAgIGRtaW5fc3VtICs9IGJlc3RfZG1pbjsKKyAgICB9CisKKyAgICBjLT55bWluPDw9MTsKKyAgICBjLT55bWF4PDw9MTsKKyAgICBjLT5zdHJpZGU+Pj0xOworICAgIGMtPnV2c3RyaWRlPj49MTsKKworICAgIGlmKHNhbWUpCisgICAgICAgIHJldHVybiBJTlRfTUFYOworCisgICAgc3dpdGNoKGMtPmF2Y3R4LT5tYl9jbXAmMHhGRil7CisgICAgLypjYXNlIEZGX0NNUF9TU0U6CisgICAgICAgIHJldHVybiBkbWluX3N1bSsgMzIqcy0+cXNjYWxlKnMtPnFzY2FsZTsqLworICAgIGNhc2UgRkZfQ01QX1JEOgorICAgICAgICByZXR1cm4gZG1pbl9zdW07CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGRtaW5fc3VtKyAxMSpjLT5tYl9wZW5hbHR5X2ZhY3RvcjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9wZW5hbHR5X2ZhY3RvcihpbnQgbGFtYmRhLCBpbnQgbGFtYmRhMiwgaW50IHR5cGUpeworICAgIHN3aXRjaCh0eXBlJjB4RkYpeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBGRl9DTVBfU0FEOgorICAgICAgICByZXR1cm4gbGFtYmRhPj5GRl9MQU1CREFfU0hJRlQ7CisgICAgY2FzZSBGRl9DTVBfRENUOgorICAgICAgICByZXR1cm4gKDMqbGFtYmRhKT4+KEZGX0xBTUJEQV9TSElGVCsxKTsKKyAgICBjYXNlIEZGX0NNUF9XNTM6CisgICAgICAgIHJldHVybiAoNCpsYW1iZGEpPj4oRkZfTEFNQkRBX1NISUZUKTsKKyAgICBjYXNlIEZGX0NNUF9XOTc6CisgICAgICAgIHJldHVybiAoMipsYW1iZGEpPj4oRkZfTEFNQkRBX1NISUZUKTsKKyAgICBjYXNlIEZGX0NNUF9TQVREOgorICAgIGNhc2UgRkZfQ01QX0RDVDI2NDoKKyAgICAgICAgcmV0dXJuICgyKmxhbWJkYSk+PkZGX0xBTUJEQV9TSElGVDsKKyAgICBjYXNlIEZGX0NNUF9SRDoKKyAgICBjYXNlIEZGX0NNUF9QU05SOgorICAgIGNhc2UgRkZfQ01QX1NTRToKKyAgICBjYXNlIEZGX0NNUF9OU1NFOgorICAgICAgICByZXR1cm4gbGFtYmRhMj4+RkZfTEFNQkRBX1NISUZUOworICAgIGNhc2UgRkZfQ01QX0JJVDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCit2b2lkIGZmX2VzdGltYXRlX3BfZnJhbWVfbW90aW9uKE1wZWdFbmNDb250ZXh0ICogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3gsIGludCBtYl95KQoreworICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CisgICAgdWludDhfdCAqcGl4LCAqcHBpeDsKKyAgICBpbnQgc3VtLCBteCwgbXksIGRtaW47CisgICAgaW50IHZhcmM7ICAgICAgICAgICAgLy8vPCB0aGUgdmFyaWFuY2Ugb2YgdGhlIGJsb2NrIChzdW0gb2Ygc3F1YXJlZCAocFt5XVt4XS1hdmVyYWdlKSkKKyAgICBpbnQgdmFyZDsgICAgICAgICAgICAvLy88IHN1bSBvZiBzcXVhcmVkIGRpZmZlcmVuY2VzIHdpdGggdGhlIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yCisgICAgaW50IFBbMTBdWzJdOworICAgIGNvbnN0IGludCBzaGlmdD0gMStzLT5xdWFydGVyX3NhbXBsZTsKKyAgICBpbnQgbWJfdHlwZT0wOworICAgIFBpY3R1cmUgKiBjb25zdCBwaWM9ICZzLT5jdXJyZW50X3BpY3R1cmU7CisKKyAgICBpbml0X3JlZihjLCBzLT5uZXdfcGljdHVyZS5mLT5kYXRhLCBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YSwgTlVMTCwgMTYqbWJfeCwgMTYqbWJfeSwgMCk7CisKKyAgICBhdl9hc3NlcnQwKHMtPnF1YXJ0ZXJfc2FtcGxlPT0wIHx8IHMtPnF1YXJ0ZXJfc2FtcGxlPT0xKTsKKyAgICBhdl9hc3NlcnQwKHMtPmxpbmVzaXplID09IGMtPnN0cmlkZSk7CisgICAgYXZfYXNzZXJ0MChzLT51dmxpbmVzaXplID09IGMtPnV2c3RyaWRlKTsKKworICAgIGMtPnBlbmFsdHlfZmFjdG9yICAgID0gZ2V0X3BlbmFsdHlfZmFjdG9yKHMtPmxhbWJkYSwgcy0+bGFtYmRhMiwgYy0+YXZjdHgtPm1lX2NtcCk7CisgICAgYy0+c3ViX3BlbmFsdHlfZmFjdG9yPSBnZXRfcGVuYWx0eV9mYWN0b3Iocy0+bGFtYmRhLCBzLT5sYW1iZGEyLCBjLT5hdmN0eC0+bWVfc3ViX2NtcCk7CisgICAgYy0+bWJfcGVuYWx0eV9mYWN0b3IgPSBnZXRfcGVuYWx0eV9mYWN0b3Iocy0+bGFtYmRhLCBzLT5sYW1iZGEyLCBjLT5hdmN0eC0+bWJfY21wKTsKKyAgICBjLT5jdXJyZW50X212X3BlbmFsdHk9IGMtPm12X3BlbmFsdHlbcy0+Zl9jb2RlXSArIE1BWF9NVjsKKworICAgIGdldF9saW1pdHMocywgMTYqbWJfeCwgMTYqbWJfeSk7CisgICAgYy0+c2tpcD0wOworCisgICAgLyogaW50cmEgLyBwcmVkaWN0aXZlIGRlY2lzaW9uICovCisgICAgcGl4ID0gYy0+c3JjWzBdWzBdOworICAgIHN1bSAgPSBzLT5tcHZlbmNkc3AucGl4X3N1bShwaXgsIHMtPmxpbmVzaXplKTsKKyAgICB2YXJjID0gcy0+bXB2ZW5jZHNwLnBpeF9ub3JtMShwaXgsIHMtPmxpbmVzaXplKSAtCisgICAgICAgICAgICgoKHVuc2lnbmVkKSBzdW0gKiBzdW0pID4+IDgpICsgNTAwOworCisgICAgcGljLT5tYl9tZWFuW3MtPm1iX3N0cmlkZSAqIG1iX3kgKyBtYl94XSA9IChzdW0rMTI4KT4+ODsKKyAgICBwaWMtPm1iX3ZhciBbcy0+bWJfc3RyaWRlICogbWJfeSArIG1iX3hdID0gKHZhcmMrMTI4KT4+ODsKKyAgICBjLT5tYl92YXJfc3VtX3RlbXAgKz0gKHZhcmMrMTI4KT4+ODsKKworICAgIHN3aXRjaChzLT5tZV9tZXRob2QpIHsKKyAgICBjYXNlIE1FX1pFUk86CisgICAgZGVmYXVsdDoKKyAgICAgICAgbXggICA9IDA7CisgICAgICAgIG15ICAgPSAwOworICAgICAgICBkbWluID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRV9YMToKKyAgICBjYXNlIE1FX0VQWlM6CisgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IG1vdF9zdHJpZGUgPSBzLT5iOF9zdHJpZGU7CisgICAgICAgICAgICBjb25zdCBpbnQgbW90X3h5ID0gcy0+YmxvY2tfaW5kZXhbMF07CisKKyAgICAgICAgICAgIFBfTEVGVFswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW21vdF94eSAtIDFdWzBdOworICAgICAgICAgICAgUF9MRUZUWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bbW90X3h5IC0gMV1bMV07CisKKyAgICAgICAgICAgIGlmKFBfTEVGVFswXSAgICAgICA+IChjLT54bWF4PDxzaGlmdCkpIFBfTEVGVFswXSAgICAgICA9IChjLT54bWF4PDxzaGlmdCk7CisKKyAgICAgICAgICAgIGlmKCFzLT5maXJzdF9zbGljZV9saW5lKSB7CisgICAgICAgICAgICAgICAgUF9UT1BbMF0gICAgICA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW21vdF94eSAtIG1vdF9zdHJpZGUgICAgXVswXTsKKyAgICAgICAgICAgICAgICBQX1RPUFsxXSAgICAgID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bbW90X3h5IC0gbW90X3N0cmlkZSAgICBdWzFdOworICAgICAgICAgICAgICAgIFBfVE9QUklHSFRbMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVttb3RfeHkgLSBtb3Rfc3RyaWRlICsgMl1bMF07CisgICAgICAgICAgICAgICAgUF9UT1BSSUdIVFsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW21vdF94eSAtIG1vdF9zdHJpZGUgKyAyXVsxXTsKKyAgICAgICAgICAgICAgICBpZihQX1RPUFsxXSAgICAgID4gKGMtPnltYXg8PHNoaWZ0KSkgUF9UT1BbMV0gICAgID0gKGMtPnltYXg8PHNoaWZ0KTsKKyAgICAgICAgICAgICAgICBpZihQX1RPUFJJR0hUWzBdIDwgKGMtPnhtaW48PHNoaWZ0KSkgUF9UT1BSSUdIVFswXT0gKGMtPnhtaW48PHNoaWZ0KTsKKyAgICAgICAgICAgICAgICBpZihQX1RPUFJJR0hUWzFdID4gKGMtPnltYXg8PHNoaWZ0KSkgUF9UT1BSSUdIVFsxXT0gKGMtPnltYXg8PHNoaWZ0KTsKKworICAgICAgICAgICAgICAgIFBfTUVESUFOWzBdPSBtaWRfcHJlZChQX0xFRlRbMF0sIFBfVE9QWzBdLCBQX1RPUFJJR0hUWzBdKTsKKyAgICAgICAgICAgICAgICBQX01FRElBTlsxXT0gbWlkX3ByZWQoUF9MRUZUWzFdLCBQX1RPUFsxXSwgUF9UT1BSSUdIVFsxXSk7CisKKyAgICAgICAgICAgICAgICBpZihzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzKXsKKyAgICAgICAgICAgICAgICAgICAgYy0+cHJlZF94ID0gUF9NRURJQU5bMF07CisgICAgICAgICAgICAgICAgICAgIGMtPnByZWRfeSA9IFBfTUVESUFOWzFdOworICAgICAgICAgICAgICAgIH1lbHNlIHsgLyogbXBlZzEgYXQgbGVhc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgYy0+cHJlZF94PSBQX0xFRlRbMF07CisgICAgICAgICAgICAgICAgICAgIGMtPnByZWRfeT0gUF9MRUZUWzFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGMtPnByZWRfeD0gUF9MRUZUWzBdOworICAgICAgICAgICAgICAgIGMtPnByZWRfeT0gUF9MRUZUWzFdOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZG1pbiA9IGZmX2VwenNfbW90aW9uX3NlYXJjaChzLCAmbXgsICZteSwgUCwgMCwgMCwgcy0+cF9tdl90YWJsZSwgKDE8PDE2KT4+c2hpZnQsIDAsIDE2KTsKKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IChteCxteSkgYXJlIGZ1bGwtcGVsbCBhbmQgdGhlIHJlbGF0aXZlIGRpc3BsYWNlbWVudCAqLworICAgIHBwaXggPSBjLT5yZWZbMF1bMF0gKyAobXkgKiBzLT5saW5lc2l6ZSkgKyBteDsKKworICAgIHZhcmQgPSBzLT5tZWNjLnNzZVswXShOVUxMLCBwaXgsIHBwaXgsIHMtPmxpbmVzaXplLCAxNik7CisKKyAgICBwaWMtPm1jX21iX3ZhcltzLT5tYl9zdHJpZGUgKiBtYl95ICsgbWJfeF0gPSAodmFyZCsxMjgpPj44OworICAgIGMtPm1jX21iX3Zhcl9zdW1fdGVtcCArPSAodmFyZCsxMjgpPj44OworCisgICAgaWYgKGMtPmF2Y3R4LT5tYl9kZWNpc2lvbiA+IEZGX01CX0RFQ0lTSU9OX1NJTVBMRSkgeworICAgICAgICBpbnQgcF9zY29yZT0gRkZNSU4odmFyZCwgdmFyYy01MDArKHMtPmxhbWJkYTI+PkZGX0xBTUJEQV9TSElGVCkqMTAwKTsKKyAgICAgICAgaW50IGlfc2NvcmU9IHZhcmMtNTAwKyhzLT5sYW1iZGEyPj5GRl9MQU1CREFfU0hJRlQpKjIwOworICAgICAgICBjLT5zY2VuZV9jaGFuZ2Vfc2NvcmUrPSBmZl9zcXJ0KHBfc2NvcmUpIC0gZmZfc3FydChpX3Njb3JlKTsKKworICAgICAgICBpZiAodmFyZCoyICsgMjAwKjI1NiA+IHZhcmMpCisgICAgICAgICAgICBtYl90eXBlfD0gQ0FORElEQVRFX01CX1RZUEVfSU5UUkE7CisgICAgICAgIGlmICh2YXJjKjIgKyAyMDAqMjU2ID4gdmFyZCB8fCBzLT5xc2NhbGUgPiAyNCl7CisvLyAgICAgICAgaWYgKHZhcmMqMiArIDIwMCoyNTYgKyA1MCoocy0+bGFtYmRhMj4+RkZfTEFNQkRBX1NISUZUKSA+IHZhcmQpeworICAgICAgICAgICAgbWJfdHlwZXw9IENBTkRJREFURV9NQl9UWVBFX0lOVEVSOworICAgICAgICAgICAgYy0+c3ViX21vdGlvbl9zZWFyY2gocywgJm14LCAmbXksIGRtaW4sIDAsIDAsIDAsIDE2KTsKKyAgICAgICAgICAgIGlmIChzLT5tcHZfZmxhZ3MgJiBGRl9NUFZfRkxBR19NVjApCisgICAgICAgICAgICAgICAgaWYobXggfHwgbXkpCisgICAgICAgICAgICAgICAgICAgIG1iX3R5cGUgfD0gQ0FORElEQVRFX01CX1RZUEVfU0tJUFBFRDsgLy9GSVhNRSBjaGVjayBkaWZmZXJlbmNlCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgbXggPDw9c2hpZnQ7CisgICAgICAgICAgICBteSA8PD1zaGlmdDsKKyAgICAgICAgfQorICAgICAgICBpZigocy0+ZmxhZ3MmQ09ERUNfRkxBR180TVYpCisgICAgICAgICAgICYmICFjLT5za2lwICYmIHZhcmM+NTA8PDggJiYgdmFyZD4xMDw8OCl7CisgICAgICAgICAgICBpZihoMjYzX212NF9zZWFyY2gocywgbXgsIG15LCBzaGlmdCkgPCBJTlRfTUFYKQorICAgICAgICAgICAgICAgIG1iX3R5cGV8PUNBTkRJREFURV9NQl9UWVBFX0lOVEVSNFY7CisKKyAgICAgICAgICAgIHNldF9wX212X3RhYmxlcyhzLCBteCwgbXksIDApOworICAgICAgICB9ZWxzZQorICAgICAgICAgICAgc2V0X3BfbXZfdGFibGVzKHMsIG14LCBteSwgMSk7CisgICAgICAgIGlmKChzLT5mbGFncyZDT0RFQ19GTEFHX0lOVEVSTEFDRURfTUUpCisgICAgICAgICAgICYmICFjLT5za2lwKXsgLy9GSVhNRSB2YXJjL2QgY2hlY2tzCisgICAgICAgICAgICBpZihpbnRlcmxhY2VkX3NlYXJjaChzLCAwLCBzLT5wX2ZpZWxkX212X3RhYmxlLCBzLT5wX2ZpZWxkX3NlbGVjdF90YWJsZSwgbXgsIG15LCAwKSA8IElOVF9NQVgpCisgICAgICAgICAgICAgICAgbWJfdHlwZSB8PSBDQU5ESURBVEVfTUJfVFlQRV9JTlRFUl9JOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIGludCBpbnRyYV9zY29yZSwgaTsKKyAgICAgICAgbWJfdHlwZT0gQ0FORElEQVRFX01CX1RZUEVfSU5URVI7CisKKyAgICAgICAgZG1pbj0gYy0+c3ViX21vdGlvbl9zZWFyY2gocywgJm14LCAmbXksIGRtaW4sIDAsIDAsIDAsIDE2KTsKKyAgICAgICAgaWYoYy0+YXZjdHgtPm1lX3N1Yl9jbXAgIT0gYy0+YXZjdHgtPm1iX2NtcCAmJiAhYy0+c2tpcCkKKyAgICAgICAgICAgIGRtaW49IGdldF9tYl9zY29yZShzLCBteCwgbXksIDAsIDAsIDAsIDE2LCAxKTsKKworICAgICAgICBpZigocy0+ZmxhZ3MmQ09ERUNfRkxBR180TVYpCisgICAgICAgICAgICYmICFjLT5za2lwICYmIHZhcmM+NTA8PDggJiYgdmFyZD4xMDw8OCl7CisgICAgICAgICAgICBpbnQgZG1pbjQ9IGgyNjNfbXY0X3NlYXJjaChzLCBteCwgbXksIHNoaWZ0KTsKKyAgICAgICAgICAgIGlmKGRtaW40IDwgZG1pbil7CisgICAgICAgICAgICAgICAgbWJfdHlwZT0gQ0FORElEQVRFX01CX1RZUEVfSU5URVI0VjsKKyAgICAgICAgICAgICAgICBkbWluPWRtaW40OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKChzLT5mbGFncyZDT0RFQ19GTEFHX0lOVEVSTEFDRURfTUUpCisgICAgICAgICAgICYmICFjLT5za2lwKXsgLy9GSVhNRSB2YXJjL2QgY2hlY2tzCisgICAgICAgICAgICBpbnQgZG1pbl9pPSBpbnRlcmxhY2VkX3NlYXJjaChzLCAwLCBzLT5wX2ZpZWxkX212X3RhYmxlLCBzLT5wX2ZpZWxkX3NlbGVjdF90YWJsZSwgbXgsIG15LCAwKTsKKyAgICAgICAgICAgIGlmKGRtaW5faSA8IGRtaW4peworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSBDQU5ESURBVEVfTUJfVFlQRV9JTlRFUl9JOworICAgICAgICAgICAgICAgIGRtaW49IGRtaW5faTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNldF9wX212X3RhYmxlcyhzLCBteCwgbXksIG1iX3R5cGUhPUNBTkRJREFURV9NQl9UWVBFX0lOVEVSNFYpOworCisgICAgICAgIC8qIGdldCBpbnRyYSBsdW1hIHNjb3JlICovCisgICAgICAgIGlmKChjLT5hdmN0eC0+bWJfY21wJjB4RkYpPT1GRl9DTVBfU1NFKXsKKyAgICAgICAgICAgIGludHJhX3Njb3JlPSB2YXJjIC0gNTAwOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1lYW4gPSAoc3VtKzEyOCk+Pjg7CisgICAgICAgICAgICBtZWFuKj0gMHgwMTAxMDEwMTsKKworICAgICAgICAgICAgZm9yKGk9MDsgaTwxNjsgaSsrKXsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KikoJmMtPnNjcmF0Y2hwYWRbaSpzLT5saW5lc2l6ZSsgMF0pID0gbWVhbjsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KikoJmMtPnNjcmF0Y2hwYWRbaSpzLT5saW5lc2l6ZSsgNF0pID0gbWVhbjsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KikoJmMtPnNjcmF0Y2hwYWRbaSpzLT5saW5lc2l6ZSsgOF0pID0gbWVhbjsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KikoJmMtPnNjcmF0Y2hwYWRbaSpzLT5saW5lc2l6ZSsxMl0pID0gbWVhbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50cmFfc2NvcmU9IHMtPm1lY2MubWJfY21wWzBdKHMsIGMtPnNjcmF0Y2hwYWQsIHBpeCwgcy0+bGluZXNpemUsIDE2KTsKKyAgICAgICAgfQorICAgICAgICBpbnRyYV9zY29yZSArPSBjLT5tYl9wZW5hbHR5X2ZhY3RvcioxNjsKKworICAgICAgICBpZihpbnRyYV9zY29yZSA8IGRtaW4peworICAgICAgICAgICAgbWJfdHlwZT0gQ0FORElEQVRFX01CX1RZUEVfSU5UUkE7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVttYl95KnMtPm1iX3N0cmlkZSArIG1iX3hdID0gQ0FORElEQVRFX01CX1RZUEVfSU5UUkE7IC8vRklYTUUgY2xlYW51cAorICAgICAgICB9ZWxzZQorICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbbWJfeSpzLT5tYl9zdHJpZGUgKyBtYl94XSA9IDA7CisKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBfc2NvcmU9IEZGTUlOKHZhcmQsIHZhcmMtNTAwKyhzLT5sYW1iZGEyPj5GRl9MQU1CREFfU0hJRlQpKjEwMCk7CisgICAgICAgICAgICBpbnQgaV9zY29yZT0gdmFyYy01MDArKHMtPmxhbWJkYTI+PkZGX0xBTUJEQV9TSElGVCkqMjA7CisgICAgICAgICAgICBjLT5zY2VuZV9jaGFuZ2Vfc2NvcmUrPSBmZl9zcXJ0KHBfc2NvcmUpIC0gZmZfc3FydChpX3Njb3JlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPm1iX3R5cGVbbWJfeSpzLT5tYl9zdHJpZGUgKyBtYl94XT0gbWJfdHlwZTsKK30KKworaW50IGZmX3ByZV9lc3RpbWF0ZV9wX2ZyYW1lX21vdGlvbihNcGVnRW5jQ29udGV4dCAqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfeCwgaW50IG1iX3kpCit7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBpbnQgbXgsIG15LCBkbWluOworICAgIGludCBQWzEwXVsyXTsKKyAgICBjb25zdCBpbnQgc2hpZnQ9IDErcy0+cXVhcnRlcl9zYW1wbGU7CisgICAgY29uc3QgaW50IHh5PSBtYl94ICsgbWJfeSpzLT5tYl9zdHJpZGU7CisgICAgaW5pdF9yZWYoYywgcy0+bmV3X3BpY3R1cmUuZi0+ZGF0YSwgcy0+bGFzdF9waWN0dXJlLmYtPmRhdGEsIE5VTEwsIDE2Km1iX3gsIDE2Km1iX3ksIDApOworCisgICAgYXZfYXNzZXJ0MChzLT5xdWFydGVyX3NhbXBsZT09MCB8fCBzLT5xdWFydGVyX3NhbXBsZT09MSk7CisKKyAgICBjLT5wcmVfcGVuYWx0eV9mYWN0b3IgICAgPSBnZXRfcGVuYWx0eV9mYWN0b3Iocy0+bGFtYmRhLCBzLT5sYW1iZGEyLCBjLT5hdmN0eC0+bWVfcHJlX2NtcCk7CisgICAgYy0+Y3VycmVudF9tdl9wZW5hbHR5PSBjLT5tdl9wZW5hbHR5W3MtPmZfY29kZV0gKyBNQVhfTVY7CisKKyAgICBnZXRfbGltaXRzKHMsIDE2Km1iX3gsIDE2Km1iX3kpOworICAgIGMtPnNraXA9MDsKKworICAgIFBfTEVGVFswXSAgICAgICA9IHMtPnBfbXZfdGFibGVbeHkgKyAxXVswXTsKKyAgICBQX0xFRlRbMV0gICAgICAgPSBzLT5wX212X3RhYmxlW3h5ICsgMV1bMV07CisKKyAgICBpZihQX0xFRlRbMF0gICAgICAgPCAoYy0+eG1pbjw8c2hpZnQpKSBQX0xFRlRbMF0gICAgICAgPSAoYy0+eG1pbjw8c2hpZnQpOworCisgICAgLyogc3BlY2lhbCBjYXNlIGZvciBmaXJzdCBsaW5lICovCisgICAgaWYgKHMtPmZpcnN0X3NsaWNlX2xpbmUpIHsKKyAgICAgICAgYy0+cHJlZF94PSBQX0xFRlRbMF07CisgICAgICAgIGMtPnByZWRfeT0gUF9MRUZUWzFdOworICAgICAgICBQX1RPUFswXT0gUF9UT1BSSUdIVFswXT0gUF9NRURJQU5bMF09CisgICAgICAgIFBfVE9QWzFdPSBQX1RPUFJJR0hUWzFdPSBQX01FRElBTlsxXT0gMDsgLy9GSVhNRQorICAgIH0gZWxzZSB7CisgICAgICAgIFBfVE9QWzBdICAgICAgPSBzLT5wX212X3RhYmxlW3h5ICsgcy0+bWJfc3RyaWRlICAgIF1bMF07CisgICAgICAgIFBfVE9QWzFdICAgICAgPSBzLT5wX212X3RhYmxlW3h5ICsgcy0+bWJfc3RyaWRlICAgIF1bMV07CisgICAgICAgIFBfVE9QUklHSFRbMF0gPSBzLT5wX212X3RhYmxlW3h5ICsgcy0+bWJfc3RyaWRlIC0gMV1bMF07CisgICAgICAgIFBfVE9QUklHSFRbMV0gPSBzLT5wX212X3RhYmxlW3h5ICsgcy0+bWJfc3RyaWRlIC0gMV1bMV07CisgICAgICAgIGlmKFBfVE9QWzFdICAgICAgPCAoYy0+eW1pbjw8c2hpZnQpKSBQX1RPUFsxXSAgICAgPSAoYy0+eW1pbjw8c2hpZnQpOworICAgICAgICBpZihQX1RPUFJJR0hUWzBdID4gKGMtPnhtYXg8PHNoaWZ0KSkgUF9UT1BSSUdIVFswXT0gKGMtPnhtYXg8PHNoaWZ0KTsKKyAgICAgICAgaWYoUF9UT1BSSUdIVFsxXSA8IChjLT55bWluPDxzaGlmdCkpIFBfVE9QUklHSFRbMV09IChjLT55bWluPDxzaGlmdCk7CisKKyAgICAgICAgUF9NRURJQU5bMF09IG1pZF9wcmVkKFBfTEVGVFswXSwgUF9UT1BbMF0sIFBfVE9QUklHSFRbMF0pOworICAgICAgICBQX01FRElBTlsxXT0gbWlkX3ByZWQoUF9MRUZUWzFdLCBQX1RPUFsxXSwgUF9UT1BSSUdIVFsxXSk7CisKKyAgICAgICAgYy0+cHJlZF94ID0gUF9NRURJQU5bMF07CisgICAgICAgIGMtPnByZWRfeSA9IFBfTUVESUFOWzFdOworICAgIH0KKworICAgIGRtaW4gPSBmZl9lcHpzX21vdGlvbl9zZWFyY2gocywgJm14LCAmbXksIFAsIDAsIDAsIHMtPnBfbXZfdGFibGUsICgxPDwxNik+PnNoaWZ0LCAwLCAxNik7CisKKyAgICBzLT5wX212X3RhYmxlW3h5XVswXSA9IG14PDxzaGlmdDsKKyAgICBzLT5wX212X3RhYmxlW3h5XVsxXSA9IG15PDxzaGlmdDsKKworICAgIHJldHVybiBkbWluOworfQorCitzdGF0aWMgaW50IGVzdGltYXRlX21vdGlvbl9iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgbWJfeCwgaW50IG1iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKCptdl90YWJsZSlbMl0sIGludCByZWZfaW5kZXgsIGludCBmX2NvZGUpCit7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBpbnQgbXgsIG15LCBkbWluOworICAgIGludCBQWzEwXVsyXTsKKyAgICBjb25zdCBpbnQgc2hpZnQ9IDErcy0+cXVhcnRlcl9zYW1wbGU7CisgICAgY29uc3QgaW50IG1vdF9zdHJpZGUgPSBzLT5tYl9zdHJpZGU7CisgICAgY29uc3QgaW50IG1vdF94eSA9IG1iX3kqbW90X3N0cmlkZSArIG1iX3g7CisgICAgdWludDhfdCAqIGNvbnN0IG12X3BlbmFsdHk9IGMtPm12X3BlbmFsdHlbZl9jb2RlXSArIE1BWF9NVjsKKyAgICBpbnQgbXZfc2NhbGU7CisKKyAgICBjLT5wZW5hbHR5X2ZhY3RvciAgICA9IGdldF9wZW5hbHR5X2ZhY3RvcihzLT5sYW1iZGEsIHMtPmxhbWJkYTIsIGMtPmF2Y3R4LT5tZV9jbXApOworICAgIGMtPnN1Yl9wZW5hbHR5X2ZhY3Rvcj0gZ2V0X3BlbmFsdHlfZmFjdG9yKHMtPmxhbWJkYSwgcy0+bGFtYmRhMiwgYy0+YXZjdHgtPm1lX3N1Yl9jbXApOworICAgIGMtPm1iX3BlbmFsdHlfZmFjdG9yID0gZ2V0X3BlbmFsdHlfZmFjdG9yKHMtPmxhbWJkYSwgcy0+bGFtYmRhMiwgYy0+YXZjdHgtPm1iX2NtcCk7CisgICAgYy0+Y3VycmVudF9tdl9wZW5hbHR5PSBtdl9wZW5hbHR5OworCisgICAgZ2V0X2xpbWl0cyhzLCAxNiptYl94LCAxNiptYl95KTsKKworICAgIHN3aXRjaChzLT5tZV9tZXRob2QpIHsKKyAgICBjYXNlIE1FX1pFUk86CisgICAgZGVmYXVsdDoKKyAgICAgICAgbXggICA9IDA7CisgICAgICAgIG15ICAgPSAwOworICAgICAgICBkbWluID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRV9YMToKKyAgICBjYXNlIE1FX0VQWlM6CisgICAgICAgIFBfTEVGVFswXSA9IG12X3RhYmxlW21vdF94eSAtIDFdWzBdOworICAgICAgICBQX0xFRlRbMV0gPSBtdl90YWJsZVttb3RfeHkgLSAxXVsxXTsKKworICAgICAgICBpZiAoUF9MRUZUWzBdID4gKGMtPnhtYXggPDwgc2hpZnQpKSBQX0xFRlRbMF0gPSAoYy0+eG1heCA8PCBzaGlmdCk7CisKKyAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciBmaXJzdCBsaW5lICovCisgICAgICAgIGlmICghcy0+Zmlyc3Rfc2xpY2VfbGluZSkgeworICAgICAgICAgICAgUF9UT1BbMF0gICAgICA9IG12X3RhYmxlW21vdF94eSAtIG1vdF9zdHJpZGUgICAgXVswXTsKKyAgICAgICAgICAgIFBfVE9QWzFdICAgICAgPSBtdl90YWJsZVttb3RfeHkgLSBtb3Rfc3RyaWRlICAgIF1bMV07CisgICAgICAgICAgICBQX1RPUFJJR0hUWzBdID0gbXZfdGFibGVbbW90X3h5IC0gbW90X3N0cmlkZSArIDFdWzBdOworICAgICAgICAgICAgUF9UT1BSSUdIVFsxXSA9IG12X3RhYmxlW21vdF94eSAtIG1vdF9zdHJpZGUgKyAxXVsxXTsKKyAgICAgICAgICAgIGlmIChQX1RPUFsxXSA+IChjLT55bWF4IDw8IHNoaWZ0KSkgUF9UT1BbMV0gPSAoYy0+eW1heCA8PCBzaGlmdCk7CisgICAgICAgICAgICBpZiAoUF9UT1BSSUdIVFswXSA8IChjLT54bWluIDw8IHNoaWZ0KSkgUF9UT1BSSUdIVFswXSA9IChjLT54bWluIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgIGlmIChQX1RPUFJJR0hUWzFdID4gKGMtPnltYXggPDwgc2hpZnQpKSBQX1RPUFJJR0hUWzFdID0gKGMtPnltYXggPDwgc2hpZnQpOworCisgICAgICAgICAgICBQX01FRElBTlswXSA9IG1pZF9wcmVkKFBfTEVGVFswXSwgUF9UT1BbMF0sIFBfVE9QUklHSFRbMF0pOworICAgICAgICAgICAgUF9NRURJQU5bMV0gPSBtaWRfcHJlZChQX0xFRlRbMV0sIFBfVE9QWzFdLCBQX1RPUFJJR0hUWzFdKTsKKyAgICAgICAgfQorICAgICAgICBjLT5wcmVkX3ggPSBQX0xFRlRbMF07CisgICAgICAgIGMtPnByZWRfeSA9IFBfTEVGVFsxXTsKKworICAgICAgICBpZihtdl90YWJsZSA9PSBzLT5iX2ZvcndfbXZfdGFibGUpeworICAgICAgICAgICAgbXZfc2NhbGU9IChzLT5wYl90aW1lPDwxNikgLyAocy0+cHBfdGltZTw8c2hpZnQpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIG12X3NjYWxlPSAoKHMtPnBiX3RpbWUgLSBzLT5wcF90aW1lKTw8MTYpIC8gKHMtPnBwX3RpbWU8PHNoaWZ0KTsKKyAgICAgICAgfQorCisgICAgICAgIGRtaW4gPSBmZl9lcHpzX21vdGlvbl9zZWFyY2gocywgJm14LCAmbXksIFAsIDAsIHJlZl9pbmRleCwgcy0+cF9tdl90YWJsZSwgbXZfc2NhbGUsIDAsIDE2KTsKKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkbWluPSBjLT5zdWJfbW90aW9uX3NlYXJjaChzLCAmbXgsICZteSwgZG1pbiwgMCwgcmVmX2luZGV4LCAwLCAxNik7CisKKyAgICBpZihjLT5hdmN0eC0+bWVfc3ViX2NtcCAhPSBjLT5hdmN0eC0+bWJfY21wICYmICFjLT5za2lwKQorICAgICAgICBkbWluPSBnZXRfbWJfc2NvcmUocywgbXgsIG15LCAwLCByZWZfaW5kZXgsIDAsIDE2LCAxKTsKKworLy8gICAgcy0+bWJfdHlwZVttYl95KnMtPm1iX3dpZHRoICsgbWJfeF09IG1iX3R5cGU7CisgICAgbXZfdGFibGVbbW90X3h5XVswXT0gbXg7CisgICAgbXZfdGFibGVbbW90X3h5XVsxXT0gbXk7CisKKyAgICByZXR1cm4gZG1pbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfYmlkaXJfbXYoTXBlZ0VuY0NvbnRleHQgKiBzLAorICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25fZngsIGludCBtb3Rpb25fZnksCisgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl9ieCwgaW50IG1vdGlvbl9ieSwKKyAgICAgICAgICAgICAgICAgICBpbnQgcHJlZF9meCwgaW50IHByZWRfZnksCisgICAgICAgICAgICAgICAgICAgaW50IHByZWRfYngsIGludCBwcmVkX2J5LAorICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaCkKK3sKKyAgICAvL0ZJWE1FIG9wdGltaXplPworICAgIC8vRklYTUUgYmV0dGVyIGZfY29kZSBwcmVkaWN0aW9uIChtYXggbXYgJiBkaXN0YW5jZSkKKyAgICAvL0ZJWE1FIHBvaW50ZXJzCisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICB1aW50OF90ICogY29uc3QgbXZfcGVuYWx0eV9mPSBjLT5tdl9wZW5hbHR5W3MtPmZfY29kZV0gKyBNQVhfTVY7IC8vIGZfY29kZSBvZiB0aGUgcHJldiBmcmFtZQorICAgIHVpbnQ4X3QgKiBjb25zdCBtdl9wZW5hbHR5X2I9IGMtPm12X3BlbmFsdHlbcy0+Yl9jb2RlXSArIE1BWF9NVjsgLy8gZl9jb2RlIG9mIHRoZSBwcmV2IGZyYW1lCisgICAgaW50IHN0cmlkZT0gYy0+c3RyaWRlOworICAgIHVpbnQ4X3QgKmRlc3RfeSA9IGMtPnNjcmF0Y2hwYWQ7CisgICAgdWludDhfdCAqcHRyOworICAgIGludCBkeHk7CisgICAgaW50IHNyY194LCBzcmNfeTsKKyAgICBpbnQgZmJtaW47CisgICAgdWludDhfdCAqKnNyY19kYXRhPSBjLT5zcmNbMF07CisgICAgdWludDhfdCAqKnJlZl9kYXRhPSBjLT5yZWZbMF07CisgICAgdWludDhfdCAqKnJlZjJfZGF0YT0gYy0+cmVmWzJdOworCisgICAgaWYocy0+cXVhcnRlcl9zYW1wbGUpeworICAgICAgICBkeHkgPSAoKG1vdGlvbl9meSAmIDMpIDw8IDIpIHwgKG1vdGlvbl9meCAmIDMpOworICAgICAgICBzcmNfeCA9IG1vdGlvbl9meCA+PiAyOworICAgICAgICBzcmNfeSA9IG1vdGlvbl9meSA+PiAyOworCisgICAgICAgIHB0ciA9IHJlZl9kYXRhWzBdICsgKHNyY195ICogc3RyaWRlKSArIHNyY194OworICAgICAgICBzLT5xZHNwLnB1dF9xcGVsX3BpeGVsc190YWJbMF1bZHh5XShkZXN0X3ksIHB0ciwgc3RyaWRlKTsKKworICAgICAgICBkeHkgPSAoKG1vdGlvbl9ieSAmIDMpIDw8IDIpIHwgKG1vdGlvbl9ieCAmIDMpOworICAgICAgICBzcmNfeCA9IG1vdGlvbl9ieCA+PiAyOworICAgICAgICBzcmNfeSA9IG1vdGlvbl9ieSA+PiAyOworCisgICAgICAgIHB0ciA9IHJlZjJfZGF0YVswXSArIChzcmNfeSAqIHN0cmlkZSkgKyBzcmNfeDsKKyAgICAgICAgcy0+cWRzcC5hdmdfcXBlbF9waXhlbHNfdGFiW3NpemVdW2R4eV0oZGVzdF95LCBwdHIsIHN0cmlkZSk7CisgICAgfWVsc2V7CisgICAgICAgIGR4eSA9ICgobW90aW9uX2Z5ICYgMSkgPDwgMSkgfCAobW90aW9uX2Z4ICYgMSk7CisgICAgICAgIHNyY194ID0gbW90aW9uX2Z4ID4+IDE7CisgICAgICAgIHNyY195ID0gbW90aW9uX2Z5ID4+IDE7CisKKyAgICAgICAgcHRyID0gcmVmX2RhdGFbMF0gKyAoc3JjX3kgKiBzdHJpZGUpICsgc3JjX3g7CisgICAgICAgIHMtPmhkc3AucHV0X3BpeGVsc190YWJbc2l6ZV1bZHh5XShkZXN0X3kgICAgLCBwdHIgICAgLCBzdHJpZGUsIGgpOworCisgICAgICAgIGR4eSA9ICgobW90aW9uX2J5ICYgMSkgPDwgMSkgfCAobW90aW9uX2J4ICYgMSk7CisgICAgICAgIHNyY194ID0gbW90aW9uX2J4ID4+IDE7CisgICAgICAgIHNyY195ID0gbW90aW9uX2J5ID4+IDE7CisKKyAgICAgICAgcHRyID0gcmVmMl9kYXRhWzBdICsgKHNyY195ICogc3RyaWRlKSArIHNyY194OworICAgICAgICBzLT5oZHNwLmF2Z19waXhlbHNfdGFiW3NpemVdW2R4eV0oZGVzdF95ICAgICwgcHRyICAgICwgc3RyaWRlLCBoKTsKKyAgICB9CisKKyAgICBmYm1pbiA9IChtdl9wZW5hbHR5X2ZbbW90aW9uX2Z4LXByZWRfZnhdICsgbXZfcGVuYWx0eV9mW21vdGlvbl9meS1wcmVkX2Z5XSkqYy0+bWJfcGVuYWx0eV9mYWN0b3IKKyAgICAgICAgICAgKyhtdl9wZW5hbHR5X2JbbW90aW9uX2J4LXByZWRfYnhdICsgbXZfcGVuYWx0eV9iW21vdGlvbl9ieS1wcmVkX2J5XSkqYy0+bWJfcGVuYWx0eV9mYWN0b3IKKyAgICAgICAgICAgKyBzLT5tZWNjLm1iX2NtcFtzaXplXShzLCBzcmNfZGF0YVswXSwgZGVzdF95LCBzdHJpZGUsIGgpOyAvLyBGSVhNRSBuZXdfcGljCisKKyAgICBpZihjLT5hdmN0eC0+bWJfY21wJkZGX0NNUF9DSFJPTUEpeworICAgIH0KKyAgICAvL0ZJWE1FIENIUk9NQSAhISEKKworICAgIHJldHVybiBmYm1pbjsKK30KKworLyogcmVmaW5lIHRoZSBiaWRpciB2ZWN0b3JzIGluIGhxIG1vZGUgYW5kIHJldHVybiB0aGUgc2NvcmUgaW4gYm90aCBscSAmIGhxIG1vZGUqLworc3RhdGljIGlubGluZSBpbnQgYmlkaXJfcmVmaW5lKE1wZWdFbmNDb250ZXh0ICogcywgaW50IG1iX3gsIGludCBtYl95KQoreworICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CisgICAgY29uc3QgaW50IG1vdF9zdHJpZGUgPSBzLT5tYl9zdHJpZGU7CisgICAgY29uc3QgaW50IHh5ID0gbWJfeSAqbW90X3N0cmlkZSArIG1iX3g7CisgICAgaW50IGZibWluOworICAgIGludCBwcmVkX2Z4PSBzLT5iX2JpZGlyX2ZvcndfbXZfdGFibGVbeHktMV1bMF07CisgICAgaW50IHByZWRfZnk9IHMtPmJfYmlkaXJfZm9yd19tdl90YWJsZVt4eS0xXVsxXTsKKyAgICBpbnQgcHJlZF9ieD0gcy0+Yl9iaWRpcl9iYWNrX212X3RhYmxlW3h5LTFdWzBdOworICAgIGludCBwcmVkX2J5PSBzLT5iX2JpZGlyX2JhY2tfbXZfdGFibGVbeHktMV1bMV07CisgICAgaW50IG1vdGlvbl9meD0gcy0+Yl9iaWRpcl9mb3J3X212X3RhYmxlW3h5XVswXT0gcy0+Yl9mb3J3X212X3RhYmxlW3h5XVswXTsKKyAgICBpbnQgbW90aW9uX2Z5PSBzLT5iX2JpZGlyX2ZvcndfbXZfdGFibGVbeHldWzFdPSBzLT5iX2ZvcndfbXZfdGFibGVbeHldWzFdOworICAgIGludCBtb3Rpb25fYng9IHMtPmJfYmlkaXJfYmFja19tdl90YWJsZVt4eV1bMF09IHMtPmJfYmFja19tdl90YWJsZVt4eV1bMF07CisgICAgaW50IG1vdGlvbl9ieT0gcy0+Yl9iaWRpcl9iYWNrX212X3RhYmxlW3h5XVsxXT0gcy0+Yl9iYWNrX212X3RhYmxlW3h5XVsxXTsKKyAgICBjb25zdCBpbnQgZmxhZ3M9IGMtPnN1Yl9mbGFnczsKKyAgICBjb25zdCBpbnQgcXBlbD0gZmxhZ3MmRkxBR19RUEVMOworICAgIGNvbnN0IGludCBzaGlmdD0gMStxcGVsOworICAgIGNvbnN0IGludCB4bWluPSBjLT54bWluPDxzaGlmdDsKKyAgICBjb25zdCBpbnQgeW1pbj0gYy0+eW1pbjw8c2hpZnQ7CisgICAgY29uc3QgaW50IHhtYXg9IGMtPnhtYXg8PHNoaWZ0OworICAgIGNvbnN0IGludCB5bWF4PSBjLT55bWF4PDxzaGlmdDsKKyNkZWZpbmUgSEFTSChmeCxmeSxieCxieSkgKChmeCkrMTcqKGZ5KSs2MyooYngpKzExNyooYnkpKQorI2RlZmluZSBIQVNIOChmeCxmeSxieCxieSkgKCh1aW50OF90KUhBU0goZngsZnksYngsYnkpKQorICAgIGludCBoYXNoaWR4PSBIQVNIKG1vdGlvbl9meCxtb3Rpb25fZnksIG1vdGlvbl9ieCwgbW90aW9uX2J5KTsKKyAgICB1aW50OF90IG1hcFsyNTZdID0geyAwIH07CisKKyAgICBtYXBbaGFzaGlkeCYyNTVdID0gMTsKKworICAgIGZibWluPSBjaGVja19iaWRpcl9tdihzLCBtb3Rpb25fZngsIG1vdGlvbl9meSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX2J4LCBtb3Rpb25fYnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfZngsIHByZWRfZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfYngsIHByZWRfYnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDE2KTsKKworICAgIGlmKHMtPmF2Y3R4LT5iaWRpcl9yZWZpbmUpeworICAgICAgICBpbnQgZW5kOworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBsaW1pdHRhYls1XT17MCw4LDMyLDY0LDgwfTsKKyAgICAgICAgY29uc3QgaW50IGxpbWl0PSBsaW1pdHRhYltzLT5hdmN0eC0+YmlkaXJfcmVmaW5lXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludDhfdCB2ZWN0W11bNF09eworeyAwLCAwLCAwLCAxfSwgeyAwLCAwLCAwLC0xfSwgeyAwLCAwLCAxLCAwfSwgeyAwLCAwLC0xLCAwfSwgeyAwLCAxLCAwLCAwfSwgeyAwLC0xLCAwLCAwfSwgeyAxLCAwLCAwLCAwfSwgey0xLCAwLCAwLCAwfSwKKworeyAwLCAwLCAxLCAxfSwgeyAwLCAwLC0xLC0xfSwgeyAwLCAxLCAxLCAwfSwgeyAwLC0xLC0xLCAwfSwgeyAxLCAxLCAwLCAwfSwgey0xLC0xLCAwLCAwfSwgeyAxLCAwLCAwLCAxfSwgey0xLCAwLCAwLC0xfSwKK3sgMCwgMSwgMCwgMX0sIHsgMCwtMSwgMCwtMX0sIHsgMSwgMCwgMSwgMH0sIHstMSwgMCwtMSwgMH0sCit7IDAsIDAsLTEsIDF9LCB7IDAsIDAsIDEsLTF9LCB7IDAsLTEsIDEsIDB9LCB7IDAsIDEsLTEsIDB9LCB7LTEsIDEsIDAsIDB9LCB7IDEsLTEsIDAsIDB9LCB7IDEsIDAsIDAsLTF9LCB7LTEsIDAsIDAsIDF9LAoreyAwLC0xLCAwLCAxfSwgeyAwLCAxLCAwLC0xfSwgey0xLCAwLCAxLCAwfSwgeyAxLCAwLC0xLCAwfSwKKworeyAwLCAxLCAxLCAxfSwgeyAwLC0xLC0xLC0xfSwgeyAxLCAxLCAxLCAwfSwgey0xLC0xLC0xLCAwfSwgeyAxLCAxLCAwLCAxfSwgey0xLC0xLCAwLC0xfSwgeyAxLCAwLCAxLCAxfSwgey0xLCAwLC0xLC0xfSwKK3sgMCwtMSwgMSwgMX0sIHsgMCwgMSwtMSwtMX0sIHstMSwgMSwgMSwgMH0sIHsgMSwtMSwtMSwgMH0sIHsgMSwgMSwgMCwtMX0sIHstMSwtMSwgMCwgMX0sIHsgMSwgMCwtMSwgMX0sIHstMSwgMCwgMSwtMX0sCit7IDAsIDEsLTEsIDF9LCB7IDAsLTEsIDEsLTF9LCB7IDEsLTEsIDEsIDB9LCB7LTEsIDEsLTEsIDB9LCB7LTEsIDEsIDAsIDF9LCB7IDEsLTEsIDAsLTF9LCB7IDEsIDAsIDEsLTF9LCB7LTEsIDAsLTEsIDF9LAoreyAwLCAxLCAxLC0xfSwgeyAwLC0xLC0xLCAxfSwgeyAxLCAxLC0xLCAwfSwgey0xLC0xLCAxLCAwfSwgeyAxLC0xLCAwLCAxfSwgey0xLCAxLCAwLC0xfSwgey0xLCAwLCAxLCAxfSwgeyAxLCAwLC0xLC0xfSwKKworeyAxLCAxLCAxLCAxfSwgey0xLC0xLC0xLC0xfSwKK3sgMSwgMSwgMSwtMX0sIHstMSwtMSwtMSwgMX0sIHsgMSwgMSwtMSwgMX0sIHstMSwtMSwgMSwtMX0sIHsgMSwtMSwgMSwgMX0sIHstMSwgMSwtMSwtMX0sIHstMSwgMSwgMSwgMX0sIHsgMSwtMSwtMSwtMX0sCit7IDEsIDEsLTEsLTF9LCB7LTEsLTEsIDEsIDF9LCB7IDEsLTEsLTEsIDF9LCB7LTEsIDEsIDEsLTF9LCB7IDEsLTEsIDEsLTF9LCB7LTEsIDEsLTEsIDF9LAorICAgICAgICB9OworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBoYXNoW109eworSEFTSDgoIDAsIDAsIDAsIDEpLCBIQVNIOCggMCwgMCwgMCwtMSksIEhBU0g4KCAwLCAwLCAxLCAwKSwgSEFTSDgoIDAsIDAsLTEsIDApLCBIQVNIOCggMCwgMSwgMCwgMCksIEhBU0g4KCAwLC0xLCAwLCAwKSwgSEFTSDgoIDEsIDAsIDAsIDApLCBIQVNIOCgtMSwgMCwgMCwgMCksCisKK0hBU0g4KCAwLCAwLCAxLCAxKSwgSEFTSDgoIDAsIDAsLTEsLTEpLCBIQVNIOCggMCwgMSwgMSwgMCksIEhBU0g4KCAwLC0xLC0xLCAwKSwgSEFTSDgoIDEsIDEsIDAsIDApLCBIQVNIOCgtMSwtMSwgMCwgMCksIEhBU0g4KCAxLCAwLCAwLCAxKSwgSEFTSDgoLTEsIDAsIDAsLTEpLAorSEFTSDgoIDAsIDEsIDAsIDEpLCBIQVNIOCggMCwtMSwgMCwtMSksIEhBU0g4KCAxLCAwLCAxLCAwKSwgSEFTSDgoLTEsIDAsLTEsIDApLAorSEFTSDgoIDAsIDAsLTEsIDEpLCBIQVNIOCggMCwgMCwgMSwtMSksIEhBU0g4KCAwLC0xLCAxLCAwKSwgSEFTSDgoIDAsIDEsLTEsIDApLCBIQVNIOCgtMSwgMSwgMCwgMCksIEhBU0g4KCAxLC0xLCAwLCAwKSwgSEFTSDgoIDEsIDAsIDAsLTEpLCBIQVNIOCgtMSwgMCwgMCwgMSksCitIQVNIOCggMCwtMSwgMCwgMSksIEhBU0g4KCAwLCAxLCAwLC0xKSwgSEFTSDgoLTEsIDAsIDEsIDApLCBIQVNIOCggMSwgMCwtMSwgMCksCisKK0hBU0g4KCAwLCAxLCAxLCAxKSwgSEFTSDgoIDAsLTEsLTEsLTEpLCBIQVNIOCggMSwgMSwgMSwgMCksIEhBU0g4KC0xLC0xLC0xLCAwKSwgSEFTSDgoIDEsIDEsIDAsIDEpLCBIQVNIOCgtMSwtMSwgMCwtMSksIEhBU0g4KCAxLCAwLCAxLCAxKSwgSEFTSDgoLTEsIDAsLTEsLTEpLAorSEFTSDgoIDAsLTEsIDEsIDEpLCBIQVNIOCggMCwgMSwtMSwtMSksIEhBU0g4KC0xLCAxLCAxLCAwKSwgSEFTSDgoIDEsLTEsLTEsIDApLCBIQVNIOCggMSwgMSwgMCwtMSksIEhBU0g4KC0xLC0xLCAwLCAxKSwgSEFTSDgoIDEsIDAsLTEsIDEpLCBIQVNIOCgtMSwgMCwgMSwtMSksCitIQVNIOCggMCwgMSwtMSwgMSksIEhBU0g4KCAwLC0xLCAxLC0xKSwgSEFTSDgoIDEsLTEsIDEsIDApLCBIQVNIOCgtMSwgMSwtMSwgMCksIEhBU0g4KC0xLCAxLCAwLCAxKSwgSEFTSDgoIDEsLTEsIDAsLTEpLCBIQVNIOCggMSwgMCwgMSwtMSksIEhBU0g4KC0xLCAwLC0xLCAxKSwKK0hBU0g4KCAwLCAxLCAxLC0xKSwgSEFTSDgoIDAsLTEsLTEsIDEpLCBIQVNIOCggMSwgMSwtMSwgMCksIEhBU0g4KC0xLC0xLCAxLCAwKSwgSEFTSDgoIDEsLTEsIDAsIDEpLCBIQVNIOCgtMSwgMSwgMCwtMSksIEhBU0g4KC0xLCAwLCAxLCAxKSwgSEFTSDgoIDEsIDAsLTEsLTEpLAorCitIQVNIOCggMSwgMSwgMSwgMSksIEhBU0g4KC0xLC0xLC0xLC0xKSwKK0hBU0g4KCAxLCAxLCAxLC0xKSwgSEFTSDgoLTEsLTEsLTEsIDEpLCBIQVNIOCggMSwgMSwtMSwgMSksIEhBU0g4KC0xLC0xLCAxLC0xKSwgSEFTSDgoIDEsLTEsIDEsIDEpLCBIQVNIOCgtMSwgMSwtMSwtMSksIEhBU0g4KC0xLCAxLCAxLCAxKSwgSEFTSDgoIDEsLTEsLTEsLTEpLAorSEFTSDgoIDEsIDEsLTEsLTEpLCBIQVNIOCgtMSwtMSwgMSwgMSksIEhBU0g4KCAxLC0xLC0xLCAxKSwgSEFTSDgoLTEsIDEsIDEsLTEpLCBIQVNIOCggMSwtMSwgMSwtMSksIEhBU0g4KC0xLCAxLC0xLCAxKSwKK307CisKKyNkZWZpbmUgQ0hFQ0tfQklESVIoZngsZnksYngsYnkpXAorICAgIGlmKCAhbWFwWyhoYXNoaWR4K0hBU0goZngsZnksYngsYnkpKSYyNTVdXAorICAgICAgICYmKGZ4PD0wIHx8IG1vdGlvbl9meCtmeDw9eG1heCkgJiYgKGZ5PD0wIHx8IG1vdGlvbl9meStmeTw9eW1heCkgJiYgKGJ4PD0wIHx8IG1vdGlvbl9ieCtieDw9eG1heCkgJiYgKGJ5PD0wIHx8IG1vdGlvbl9ieStieTw9eW1heClcCisgICAgICAgJiYoZng+PTAgfHwgbW90aW9uX2Z4K2Z4Pj14bWluKSAmJiAoZnk+PTAgfHwgbW90aW9uX2Z5K2Z5Pj15bWluKSAmJiAoYng+PTAgfHwgbW90aW9uX2J4K2J4Pj14bWluKSAmJiAoYnk+PTAgfHwgbW90aW9uX2J5K2J5Pj15bWluKSl7XAorICAgICAgICBpbnQgc2NvcmU7XAorICAgICAgICBtYXBbKGhhc2hpZHgrSEFTSChmeCxmeSxieCxieSkpJjI1NV0gPSAxO1wKKyAgICAgICAgc2NvcmU9IGNoZWNrX2JpZGlyX212KHMsIG1vdGlvbl9meCtmeCwgbW90aW9uX2Z5K2Z5LCBtb3Rpb25fYngrYngsIG1vdGlvbl9ieStieSwgcHJlZF9meCwgcHJlZF9meSwgcHJlZF9ieCwgcHJlZF9ieSwgMCwgMTYpO1wKKyAgICAgICAgaWYoc2NvcmUgPCBmYm1pbil7XAorICAgICAgICAgICAgaGFzaGlkeCArPSBIQVNIKGZ4LGZ5LGJ4LGJ5KTtcCisgICAgICAgICAgICBmYm1pbj0gc2NvcmU7XAorICAgICAgICAgICAgbW90aW9uX2Z4Kz1meDtcCisgICAgICAgICAgICBtb3Rpb25fZnkrPWZ5O1wKKyAgICAgICAgICAgIG1vdGlvbl9ieCs9Yng7XAorICAgICAgICAgICAgbW90aW9uX2J5Kz1ieTtcCisgICAgICAgICAgICBlbmQ9MDtcCisgICAgICAgIH1cCisgICAgfQorI2RlZmluZSBDSEVDS19CSURJUjIoYSxiLGMsZClcCitDSEVDS19CSURJUihhLGIsYyxkKVwKK0NIRUNLX0JJRElSKC0oYSksLShiKSwtKGMpLC0oZCkpCisKKyAgICAgICAgZG97CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGludCBib3JkZXJkaXN0PTA7CisgICAgICAgICAgICBlbmQ9MTsKKworICAgICAgICAgICAgQ0hFQ0tfQklESVIyKDAsMCwwLDEpCisgICAgICAgICAgICBDSEVDS19CSURJUjIoMCwwLDEsMCkKKyAgICAgICAgICAgIENIRUNLX0JJRElSMigwLDEsMCwwKQorICAgICAgICAgICAgQ0hFQ0tfQklESVIyKDEsMCwwLDApCisKKyAgICAgICAgICAgIGZvcihpPTg7IGk8bGltaXQ7IGkrKyl7CisgICAgICAgICAgICAgICAgaW50IGZ4PSBtb3Rpb25fZngrdmVjdFtpXVswXTsKKyAgICAgICAgICAgICAgICBpbnQgZnk9IG1vdGlvbl9meSt2ZWN0W2ldWzFdOworICAgICAgICAgICAgICAgIGludCBieD0gbW90aW9uX2J4K3ZlY3RbaV1bMl07CisgICAgICAgICAgICAgICAgaW50IGJ5PSBtb3Rpb25fYnkrdmVjdFtpXVszXTsKKyAgICAgICAgICAgICAgICBpZihib3JkZXJkaXN0PD0wKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IGE9ICh4bWF4IC0gRkZNQVgoZngsYngpKXwoRkZNSU4oZngsYngpIC0geG1pbik7CisgICAgICAgICAgICAgICAgICAgIGludCBiPSAoeW1heCAtIEZGTUFYKGZ5LGJ5KSl8KEZGTUlOKGZ5LGJ5KSAtIHltaW4pOworICAgICAgICAgICAgICAgICAgICBpZigoYXxiKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBtYXBbKGhhc2hpZHgraGFzaFtpXSkmMjU1XSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCFtYXBbKGhhc2hpZHgraGFzaFtpXSkmMjU1XSl7CisgICAgICAgICAgICAgICAgICAgIGludCBzY29yZTsKKyAgICAgICAgICAgICAgICAgICAgbWFwWyhoYXNoaWR4K2hhc2hbaV0pJjI1NV0gPSAxOworICAgICAgICAgICAgICAgICAgICBzY29yZT0gY2hlY2tfYmlkaXJfbXYocywgZngsIGZ5LCBieCwgYnksIHByZWRfZngsIHByZWRfZnksIHByZWRfYngsIHByZWRfYnksIDAsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoc2NvcmUgPCBmYm1pbil7CisgICAgICAgICAgICAgICAgICAgICAgICBoYXNoaWR4ICs9IGhhc2hbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBmYm1pbj0gc2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25fZng9Zng7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25fZnk9Znk7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25fYng9Yng7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25fYnk9Ynk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQ9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcmRpc3QtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJvcmRlcmRpc3Q8PTApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhPSBGRk1JTih4bWF4IC0gRkZNQVgoZngsYngpLCBGRk1JTihmeCxieCkgLSB4bWluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYj0gRkZNSU4oeW1heCAtIEZGTUFYKGZ5LGJ5KSwgRkZNSU4oZnksYnkpIC0geW1pbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyZGlzdD0gRkZNSU4oYSxiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfXdoaWxlKCFlbmQpOworICAgIH0KKworICAgIHMtPmJfYmlkaXJfZm9yd19tdl90YWJsZVt4eV1bMF09IG1vdGlvbl9meDsKKyAgICBzLT5iX2JpZGlyX2ZvcndfbXZfdGFibGVbeHldWzFdPSBtb3Rpb25fZnk7CisgICAgcy0+Yl9iaWRpcl9iYWNrX212X3RhYmxlW3h5XVswXT0gbW90aW9uX2J4OworICAgIHMtPmJfYmlkaXJfYmFja19tdl90YWJsZVt4eV1bMV09IG1vdGlvbl9ieTsKKworICAgIHJldHVybiBmYm1pbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGlyZWN0X3NlYXJjaChNcGVnRW5jQ29udGV4dCAqIHMsIGludCBtYl94LCBpbnQgbWJfeSkKK3sKKyAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOworICAgIGludCBQWzEwXVsyXTsKKyAgICBjb25zdCBpbnQgbW90X3N0cmlkZSA9IHMtPm1iX3N0cmlkZTsKKyAgICBjb25zdCBpbnQgbW90X3h5ID0gbWJfeSptb3Rfc3RyaWRlICsgbWJfeDsKKyAgICBjb25zdCBpbnQgc2hpZnQ9IDErcy0+cXVhcnRlcl9zYW1wbGU7CisgICAgaW50IGRtaW4sIGk7CisgICAgY29uc3QgaW50IHRpbWVfcHA9IHMtPnBwX3RpbWU7CisgICAgY29uc3QgaW50IHRpbWVfcGI9IHMtPnBiX3RpbWU7CisgICAgaW50IG14LCBteSwgeG1pbiwgeG1heCwgeW1pbiwgeW1heDsKKyAgICBpbnQxNl90ICgqbXZfdGFibGUpWzJdPSBzLT5iX2RpcmVjdF9tdl90YWJsZTsKKworICAgIGMtPmN1cnJlbnRfbXZfcGVuYWx0eT0gYy0+bXZfcGVuYWx0eVsxXSArIE1BWF9NVjsKKyAgICB5bWluPSB4bWluPSgtMzIpPj5zaGlmdDsKKyAgICB5bWF4PSB4bWF4PSAgIDMxPj5zaGlmdDsKKworICAgIGlmIChJU184WDgocy0+bmV4dF9waWN0dXJlLm1iX3R5cGVbbW90X3h5XSkpIHsKKyAgICAgICAgcy0+bXZfdHlwZT0gTVZfVFlQRV84WDg7CisgICAgfWVsc2V7CisgICAgICAgIHMtPm12X3R5cGU9IE1WX1RZUEVfMTZYMTY7CisgICAgfQorCisgICAgZm9yKGk9MDsgaTw0OyBpKyspeworICAgICAgICBpbnQgaW5kZXg9IHMtPmJsb2NrX2luZGV4W2ldOworICAgICAgICBpbnQgbWluLCBtYXg7CisKKyAgICAgICAgYy0+Y29fbG9jYXRlZF9tdltpXVswXSA9IHMtPm5leHRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW2luZGV4XVswXTsKKyAgICAgICAgYy0+Y29fbG9jYXRlZF9tdltpXVsxXSA9IHMtPm5leHRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW2luZGV4XVsxXTsKKyAgICAgICAgYy0+ZGlyZWN0X2Jhc2lzX212W2ldWzBdPSBjLT5jb19sb2NhdGVkX212W2ldWzBdKnRpbWVfcGIvdGltZV9wcCArICgoaSYgMSk8PChzaGlmdCszKSk7CisgICAgICAgIGMtPmRpcmVjdF9iYXNpc19tdltpXVsxXT0gYy0+Y29fbG9jYXRlZF9tdltpXVsxXSp0aW1lX3BiL3RpbWVfcHAgKyAoKGk+PjEpPDwoc2hpZnQrMykpOworLy8gICAgICAgIGMtPmRpcmVjdF9iYXNpc19tdlsxXVtpXVswXT0gYy0+Y29fbG9jYXRlZF9tdltpXVswXSoodGltZV9wYiAtIHRpbWVfcHApL3RpbWVfcHAgKyAoKGkgJjEpPDwoc2hpZnQrMyk7CisvLyAgICAgICAgYy0+ZGlyZWN0X2Jhc2lzX212WzFdW2ldWzFdPSBjLT5jb19sb2NhdGVkX212W2ldWzFdKih0aW1lX3BiIC0gdGltZV9wcCkvdGltZV9wcCArICgoaT4+MSk8PChzaGlmdCszKTsKKworICAgICAgICBtYXg9IEZGTUFYKGMtPmRpcmVjdF9iYXNpc19tdltpXVswXSwgYy0+ZGlyZWN0X2Jhc2lzX212W2ldWzBdIC0gYy0+Y29fbG9jYXRlZF9tdltpXVswXSk+PnNoaWZ0OworICAgICAgICBtaW49IEZGTUlOKGMtPmRpcmVjdF9iYXNpc19tdltpXVswXSwgYy0+ZGlyZWN0X2Jhc2lzX212W2ldWzBdIC0gYy0+Y29fbG9jYXRlZF9tdltpXVswXSk+PnNoaWZ0OworICAgICAgICBtYXgrPSAxNiptYl94ICsgMTsgLy8gKy0xIGlzIGZvciB0aGUgc2ltcGxlciByb3VuZGluZworICAgICAgICBtaW4rPSAxNiptYl94IC0gMTsKKyAgICAgICAgeG1heD0gRkZNSU4oeG1heCwgcy0+d2lkdGggLSBtYXgpOworICAgICAgICB4bWluPSBGRk1BWCh4bWluLCAtIDE2ICAgICAtIG1pbik7CisKKyAgICAgICAgbWF4PSBGRk1BWChjLT5kaXJlY3RfYmFzaXNfbXZbaV1bMV0sIGMtPmRpcmVjdF9iYXNpc19tdltpXVsxXSAtIGMtPmNvX2xvY2F0ZWRfbXZbaV1bMV0pPj5zaGlmdDsKKyAgICAgICAgbWluPSBGRk1JTihjLT5kaXJlY3RfYmFzaXNfbXZbaV1bMV0sIGMtPmRpcmVjdF9iYXNpc19tdltpXVsxXSAtIGMtPmNvX2xvY2F0ZWRfbXZbaV1bMV0pPj5zaGlmdDsKKyAgICAgICAgbWF4Kz0gMTYqbWJfeSArIDE7IC8vICstMSBpcyBmb3IgdGhlIHNpbXBsZXIgcm91bmRpbmcKKyAgICAgICAgbWluKz0gMTYqbWJfeSAtIDE7CisgICAgICAgIHltYXg9IEZGTUlOKHltYXgsIHMtPmhlaWdodCAtIG1heCk7CisgICAgICAgIHltaW49IEZGTUFYKHltaW4sIC0gMTYgICAgICAtIG1pbik7CisKKyAgICAgICAgaWYocy0+bXZfdHlwZSA9PSBNVl9UWVBFXzE2WDE2KSBicmVhazsKKyAgICB9CisKKyAgICBhdl9hc3NlcnQyKHhtYXggPD0gMTUgJiYgeW1heCA8PSAxNSAmJiB4bWluID49IC0xNiAmJiB5bWluID49IC0xNik7CisKKyAgICBpZih4bWF4IDwgMCB8fCB4bWluID4wIHx8IHltYXggPCAwIHx8IHltaW4gPiAwKXsKKyAgICAgICAgcy0+Yl9kaXJlY3RfbXZfdGFibGVbbW90X3h5XVswXT0gMDsKKyAgICAgICAgcy0+Yl9kaXJlY3RfbXZfdGFibGVbbW90X3h5XVsxXT0gMDsKKworICAgICAgICByZXR1cm4gMjU2KjI1NioyNTYqNjQ7CisgICAgfQorCisgICAgYy0+eG1pbj0geG1pbjsKKyAgICBjLT55bWluPSB5bWluOworICAgIGMtPnhtYXg9IHhtYXg7CisgICAgYy0+eW1heD0geW1heDsKKyAgICBjLT5mbGFncyAgICAgfD0gRkxBR19ESVJFQ1Q7CisgICAgYy0+c3ViX2ZsYWdzIHw9IEZMQUdfRElSRUNUOworICAgIGMtPnByZWRfeD0wOworICAgIGMtPnByZWRfeT0wOworCisgICAgUF9MRUZUWzBdICAgICAgICA9IGF2X2NsaXAobXZfdGFibGVbbW90X3h5IC0gMV1bMF0sIHhtaW48PHNoaWZ0LCB4bWF4PDxzaGlmdCk7CisgICAgUF9MRUZUWzFdICAgICAgICA9IGF2X2NsaXAobXZfdGFibGVbbW90X3h5IC0gMV1bMV0sIHltaW48PHNoaWZ0LCB5bWF4PDxzaGlmdCk7CisKKyAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGxpbmUgKi8KKyAgICBpZiAoIXMtPmZpcnN0X3NsaWNlX2xpbmUpIHsgLy9GSVhNRSBtYXliZSBhbGxvdyB0aGlzIG92ZXIgdGhyZWFkIGJvdW5kYXJ5IGFzIGl0IGlzIGNsaXBwZWQKKyAgICAgICAgUF9UT1BbMF0gICAgICA9IGF2X2NsaXAobXZfdGFibGVbbW90X3h5IC0gbW90X3N0cmlkZSAgICAgICAgICAgICBdWzBdLCB4bWluPDxzaGlmdCwgeG1heDw8c2hpZnQpOworICAgICAgICBQX1RPUFsxXSAgICAgID0gYXZfY2xpcChtdl90YWJsZVttb3RfeHkgLSBtb3Rfc3RyaWRlICAgICAgICAgICAgIF1bMV0sIHltaW48PHNoaWZ0LCB5bWF4PDxzaGlmdCk7CisgICAgICAgIFBfVE9QUklHSFRbMF0gPSBhdl9jbGlwKG12X3RhYmxlW21vdF94eSAtIG1vdF9zdHJpZGUgKyAxICAgICAgICAgXVswXSwgeG1pbjw8c2hpZnQsIHhtYXg8PHNoaWZ0KTsKKyAgICAgICAgUF9UT1BSSUdIVFsxXSA9IGF2X2NsaXAobXZfdGFibGVbbW90X3h5IC0gbW90X3N0cmlkZSArIDEgICAgICAgICBdWzFdLCB5bWluPDxzaGlmdCwgeW1heDw8c2hpZnQpOworCisgICAgICAgIFBfTUVESUFOWzBdPSBtaWRfcHJlZChQX0xFRlRbMF0sIFBfVE9QWzBdLCBQX1RPUFJJR0hUWzBdKTsKKyAgICAgICAgUF9NRURJQU5bMV09IG1pZF9wcmVkKFBfTEVGVFsxXSwgUF9UT1BbMV0sIFBfVE9QUklHSFRbMV0pOworICAgIH0KKworICAgIGRtaW4gPSBmZl9lcHpzX21vdGlvbl9zZWFyY2gocywgJm14LCAmbXksIFAsIDAsIDAsIG12X3RhYmxlLCAxPDwoMTYtc2hpZnQpLCAwLCAxNik7CisgICAgaWYoYy0+c3ViX2ZsYWdzJkZMQUdfUVBFTCkKKyAgICAgICAgZG1pbiA9IHFwZWxfbW90aW9uX3NlYXJjaChzLCAmbXgsICZteSwgZG1pbiwgMCwgMCwgMCwgMTYpOworICAgIGVsc2UKKyAgICAgICAgZG1pbiA9IGhwZWxfbW90aW9uX3NlYXJjaChzLCAmbXgsICZteSwgZG1pbiwgMCwgMCwgMCwgMTYpOworCisgICAgaWYoYy0+YXZjdHgtPm1lX3N1Yl9jbXAgIT0gYy0+YXZjdHgtPm1iX2NtcCAmJiAhYy0+c2tpcCkKKyAgICAgICAgZG1pbj0gZ2V0X21iX3Njb3JlKHMsIG14LCBteSwgMCwgMCwgMCwgMTYsIDEpOworCisgICAgZ2V0X2xpbWl0cyhzLCAxNiptYl94LCAxNiptYl95KTsgLy9yZXN0b3JlIGMtPj9taW4vbWF4LCBtYXliZSBub3QgbmVlZGVkCisKKyAgICBtdl90YWJsZVttb3RfeHldWzBdPSBteDsKKyAgICBtdl90YWJsZVttb3RfeHldWzFdPSBteTsKKyAgICBjLT5mbGFncyAgICAgJj0gfkZMQUdfRElSRUNUOworICAgIGMtPnN1Yl9mbGFncyAmPSB+RkxBR19ESVJFQ1Q7CisKKyAgICByZXR1cm4gZG1pbjsKK30KKwordm9pZCBmZl9lc3RpbWF0ZV9iX2ZyYW1lX21vdGlvbihNcGVnRW5jQ29udGV4dCAqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl94LCBpbnQgbWJfeSkKK3sKKyAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOworICAgIGNvbnN0IGludCBwZW5hbHR5X2ZhY3Rvcj0gYy0+bWJfcGVuYWx0eV9mYWN0b3I7CisgICAgaW50IGZtaW4sIGJtaW4sIGRtaW4sIGZibWluLCBiaW1pbiwgZmltaW47CisgICAgaW50IHR5cGU9MDsKKyAgICBjb25zdCBpbnQgeHkgPSBtYl95KnMtPm1iX3N0cmlkZSArIG1iX3g7CisgICAgaW5pdF9yZWYoYywgcy0+bmV3X3BpY3R1cmUuZi0+ZGF0YSwgcy0+bGFzdF9waWN0dXJlLmYtPmRhdGEsCisgICAgICAgICAgICAgcy0+bmV4dF9waWN0dXJlLmYtPmRhdGEsIDE2ICogbWJfeCwgMTYgKiBtYl95LCAyKTsKKworICAgIGdldF9saW1pdHMocywgMTYqbWJfeCwgMTYqbWJfeSk7CisKKyAgICBjLT5za2lwPTA7CisKKyAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQgJiYgcy0+bmV4dF9waWN0dXJlLm1ic2tpcF90YWJsZVt4eV0pIHsKKyAgICAgICAgaW50IHNjb3JlPSBkaXJlY3Rfc2VhcmNoKHMsIG1iX3gsIG1iX3kpOyAvL0ZJWE1FIGp1c3QgY2hlY2sgMCwwCisKKyAgICAgICAgc2NvcmU9ICgodW5zaWduZWQpKHNjb3JlKnNjb3JlICsgMTI4KjI1NikpPj4xNjsKKyAgICAgICAgYy0+bWNfbWJfdmFyX3N1bV90ZW1wICs9IHNjb3JlOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWNfbWJfdmFyW21iX3kqcy0+bWJfc3RyaWRlICsgbWJfeF0gPSBzY29yZTsgLy9GSVhNRSB1c2UgU1NFCisgICAgICAgIHMtPm1iX3R5cGVbbWJfeSpzLT5tYl9zdHJpZGUgKyBtYl94XT0gQ0FORElEQVRFX01CX1RZUEVfRElSRUNUMDsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KQorICAgICAgICBkbWluPSBkaXJlY3Rfc2VhcmNoKHMsIG1iX3gsIG1iX3kpOworICAgIGVsc2UKKyAgICAgICAgZG1pbj0gSU5UX01BWDsKKy8vRklYTUUgcGVuYWx0eSBzdHVmZiBmb3Igbm9uIG1wZWc0CisgICAgYy0+c2tpcD0wOworICAgIGZtaW4gPSBlc3RpbWF0ZV9tb3Rpb25fYihzLCBtYl94LCBtYl95LCBzLT5iX2ZvcndfbXZfdGFibGUsIDAsIHMtPmZfY29kZSkgKworICAgICAgICAgICAzICogcGVuYWx0eV9mYWN0b3I7CisKKyAgICBjLT5za2lwPTA7CisgICAgYm1pbiA9IGVzdGltYXRlX21vdGlvbl9iKHMsIG1iX3gsIG1iX3ksIHMtPmJfYmFja19tdl90YWJsZSwgMiwgcy0+Yl9jb2RlKSArCisgICAgICAgICAgIDIgKiBwZW5hbHR5X2ZhY3RvcjsKKyAgICBhdl9kbG9nKHMsICIgJWQgJWQgIiwgcy0+Yl9mb3J3X212X3RhYmxlW3h5XVswXSwgcy0+Yl9mb3J3X212X3RhYmxlW3h5XVsxXSk7CisKKyAgICBjLT5za2lwPTA7CisgICAgZmJtaW49IGJpZGlyX3JlZmluZShzLCBtYl94LCBtYl95KSArIHBlbmFsdHlfZmFjdG9yOworICAgIGF2X2Rsb2cocywgIiVkICVkICVkICVkXG4iLCBkbWluLCBmbWluLCBibWluLCBmYm1pbik7CisKKyAgICBpZihzLT5mbGFncyAmIENPREVDX0ZMQUdfSU5URVJMQUNFRF9NRSl7CisvL0ZJWE1FIG1iIHR5cGUgcGVuYWx0eQorICAgICAgICBjLT5za2lwPTA7CisgICAgICAgIGMtPmN1cnJlbnRfbXZfcGVuYWx0eT0gYy0+bXZfcGVuYWx0eVtzLT5mX2NvZGVdICsgTUFYX01WOworICAgICAgICBmaW1pbj0gaW50ZXJsYWNlZF9zZWFyY2gocywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJfZmllbGRfbXZfdGFibGVbMF0sIHMtPmJfZmllbGRfc2VsZWN0X3RhYmxlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Yl9mb3J3X212X3RhYmxlW3h5XVswXSwgcy0+Yl9mb3J3X212X3RhYmxlW3h5XVsxXSwgMCk7CisgICAgICAgIGMtPmN1cnJlbnRfbXZfcGVuYWx0eT0gYy0+bXZfcGVuYWx0eVtzLT5iX2NvZGVdICsgTUFYX01WOworICAgICAgICBiaW1pbj0gaW50ZXJsYWNlZF9zZWFyY2gocywgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJfZmllbGRfbXZfdGFibGVbMV0sIHMtPmJfZmllbGRfc2VsZWN0X3RhYmxlWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Yl9iYWNrX212X3RhYmxlW3h5XVswXSwgcy0+Yl9iYWNrX212X3RhYmxlW3h5XVsxXSwgMCk7CisgICAgfWVsc2UKKyAgICAgICAgZmltaW49IGJpbWluPSBJTlRfTUFYOworCisgICAgeworICAgICAgICBpbnQgc2NvcmU9IGZtaW47CisgICAgICAgIHR5cGUgPSBDQU5ESURBVEVfTUJfVFlQRV9GT1JXQVJEOworCisgICAgICAgIGlmIChkbWluIDw9IHNjb3JlKXsKKyAgICAgICAgICAgIHNjb3JlID0gZG1pbjsKKyAgICAgICAgICAgIHR5cGUgPSBDQU5ESURBVEVfTUJfVFlQRV9ESVJFQ1Q7CisgICAgICAgIH0KKyAgICAgICAgaWYoYm1pbjxzY29yZSl7CisgICAgICAgICAgICBzY29yZT1ibWluOworICAgICAgICAgICAgdHlwZT0gQ0FORElEQVRFX01CX1RZUEVfQkFDS1dBUkQ7CisgICAgICAgIH0KKyAgICAgICAgaWYoZmJtaW48c2NvcmUpeworICAgICAgICAgICAgc2NvcmU9ZmJtaW47CisgICAgICAgICAgICB0eXBlPSBDQU5ESURBVEVfTUJfVFlQRV9CSURJUjsKKyAgICAgICAgfQorICAgICAgICBpZihmaW1pbjxzY29yZSl7CisgICAgICAgICAgICBzY29yZT1maW1pbjsKKyAgICAgICAgICAgIHR5cGU9IENBTkRJREFURV9NQl9UWVBFX0ZPUldBUkRfSTsKKyAgICAgICAgfQorICAgICAgICBpZihiaW1pbjxzY29yZSl7CisgICAgICAgICAgICBzY29yZT1iaW1pbjsKKyAgICAgICAgICAgIHR5cGU9IENBTkRJREFURV9NQl9UWVBFX0JBQ0tXQVJEX0k7CisgICAgICAgIH0KKworICAgICAgICBzY29yZT0gKCh1bnNpZ25lZCkoc2NvcmUqc2NvcmUgKyAxMjgqMjU2KSk+PjE2OworICAgICAgICBjLT5tY19tYl92YXJfc3VtX3RlbXAgKz0gc2NvcmU7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tY19tYl92YXJbbWJfeSpzLT5tYl9zdHJpZGUgKyBtYl94XSA9IHNjb3JlOyAvL0ZJWE1FIHVzZSBTU0UKKyAgICB9CisKKyAgICBpZihjLT5hdmN0eC0+bWJfZGVjaXNpb24gPiBGRl9NQl9ERUNJU0lPTl9TSU1QTEUpeworICAgICAgICB0eXBlPSBDQU5ESURBVEVfTUJfVFlQRV9GT1JXQVJEIHwgQ0FORElEQVRFX01CX1RZUEVfQkFDS1dBUkQgfCBDQU5ESURBVEVfTUJfVFlQRV9CSURJUiB8IENBTkRJREFURV9NQl9UWVBFX0RJUkVDVDsKKyAgICAgICAgaWYoZmltaW4gPCBJTlRfTUFYKQorICAgICAgICAgICAgdHlwZSB8PSBDQU5ESURBVEVfTUJfVFlQRV9GT1JXQVJEX0k7CisgICAgICAgIGlmKGJpbWluIDwgSU5UX01BWCkKKyAgICAgICAgICAgIHR5cGUgfD0gQ0FORElEQVRFX01CX1RZUEVfQkFDS1dBUkRfSTsKKyAgICAgICAgaWYoZmltaW4gPCBJTlRfTUFYICYmIGJpbWluIDwgSU5UX01BWCl7CisgICAgICAgICAgICB0eXBlIHw9IENBTkRJREFURV9NQl9UWVBFX0JJRElSX0k7CisgICAgICAgIH0KKyAgICAgICAgIC8vRklYTUUgc29tZXRoaW5nIHNtYXJ0ZXIKKyAgICAgICAgaWYoZG1pbj4yNTYqMjU2KjE2KSB0eXBlJj0gfkNBTkRJREFURV9NQl9UWVBFX0RJUkVDVDsgLy9kbyBub3QgdHJ5IGRpcmVjdCBtb2RlIGlmIGl0IGlzIGludmFsaWQgZm9yIHRoaXMgTUIKKyAgICAgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0ICYmIHR5cGUmQ0FORElEQVRFX01CX1RZUEVfRElSRUNUICYmCisgICAgICAgICAgICBzLT5tcHZfZmxhZ3MgJiBGRl9NUFZfRkxBR19NVjAgJiYgKih1aW50MzJfdCopcy0+Yl9kaXJlY3RfbXZfdGFibGVbeHldKQorICAgICAgICAgICAgdHlwZSB8PSBDQU5ESURBVEVfTUJfVFlQRV9ESVJFQ1QwOworICAgIH0KKworICAgIHMtPm1iX3R5cGVbbWJfeSpzLT5tYl9zdHJpZGUgKyBtYl94XT0gdHlwZTsKK30KKworLyogZmluZCBiZXN0IGZfY29kZSBmb3IgTUUgd2hpY2ggZG8gdW5saW1pdGVkIHNlYXJjaGVzICovCitpbnQgZmZfZ2V0X2Jlc3RfZmNvZGUoTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQxNl90ICgqbXZfdGFibGUpWzJdLCBpbnQgdHlwZSkKK3sKKyAgICBpZihzLT5tZV9tZXRob2Q+PU1FX0VQWlMpeworICAgICAgICBpbnQgc2NvcmVbOF07CisgICAgICAgIGludCBpLCB5LCByYW5nZT0gcy0+YXZjdHgtPm1lX3JhbmdlID8gcy0+YXZjdHgtPm1lX3JhbmdlIDogKElOVF9NQVgvMik7CisgICAgICAgIHVpbnQ4X3QgKiBmY29kZV90YWI9IHMtPmZjb2RlX3RhYjsKKyAgICAgICAgaW50IGJlc3RfZmNvZGU9LTE7CisgICAgICAgIGludCBiZXN0X3Njb3JlPS0xMDAwMDAwMDsKKworICAgICAgICBpZihzLT5tc21wZWc0X3ZlcnNpb24pCisgICAgICAgICAgICByYW5nZT0gRkZNSU4ocmFuZ2UsIDE2KTsKKyAgICAgICAgZWxzZSBpZihzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICYmIHMtPmF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPj0gRkZfQ09NUExJQU5DRV9OT1JNQUwpCisgICAgICAgICAgICByYW5nZT0gRkZNSU4ocmFuZ2UsIDI1Nik7CisKKyAgICAgICAgZm9yKGk9MDsgaTw4OyBpKyspIHNjb3JlW2ldPSBzLT5tYl9udW0qKDgtaSk7CisKKyAgICAgICAgZm9yKHk9MDsgeTxzLT5tYl9oZWlnaHQ7IHkrKyl7CisgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgIGludCB4eT0geSpzLT5tYl9zdHJpZGU7CisgICAgICAgICAgICBmb3IoeD0wOyB4PHMtPm1iX3dpZHRoOyB4KyspeworICAgICAgICAgICAgICAgIGlmKHMtPm1iX3R5cGVbeHldICYgdHlwZSl7CisgICAgICAgICAgICAgICAgICAgIGludCBteD0gbXZfdGFibGVbeHldWzBdOworICAgICAgICAgICAgICAgICAgICBpbnQgbXk9IG12X3RhYmxlW3h5XVsxXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZjb2RlPSBGRk1BWChmY29kZV90YWJbbXggKyBNQVhfTVZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjb2RlX3RhYltteSArIE1BWF9NVl0pOworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYobXggPj0gcmFuZ2UgfHwgbXggPCAtcmFuZ2UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ID49IHJhbmdlIHx8IG15IDwgLXJhbmdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIGZvcihqPTA7IGo8ZmNvZGUgJiYgajw4OyBqKyspeworICAgICAgICAgICAgICAgICAgICAgICAgaWYocy0+cGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfQiB8fCBzLT5jdXJyZW50X3BpY3R1cmUubWNfbWJfdmFyW3h5XSA8IHMtPmN1cnJlbnRfcGljdHVyZS5tYl92YXJbeHldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlW2pdLT0gMTcwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHh5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoaT0xOyBpPDg7IGkrKyl7CisgICAgICAgICAgICBpZihzY29yZVtpXSA+IGJlc3Rfc2NvcmUpeworICAgICAgICAgICAgICAgIGJlc3Rfc2NvcmU9IHNjb3JlW2ldOworICAgICAgICAgICAgICAgIGJlc3RfZmNvZGU9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmVzdF9mY29kZTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCit2b2lkIGZmX2ZpeF9sb25nX3BfbXZzKE1wZWdFbmNDb250ZXh0ICogcykKK3sKKyAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOworICAgIGNvbnN0IGludCBmX2NvZGU9IHMtPmZfY29kZTsKKyAgICBpbnQgeSwgcmFuZ2U7CisgICAgYXZfYXNzZXJ0MChzLT5waWN0X3R5cGU9PUFWX1BJQ1RVUkVfVFlQRV9QKTsKKworICAgIHJhbmdlID0gKCgocy0+b3V0X2Zvcm1hdCA9PSBGTVRfTVBFRzEgfHwgcy0+bXNtcGVnNF92ZXJzaW9uKSA/IDggOiAxNikgPDwgZl9jb2RlKTsKKworICAgIGF2X2Fzc2VydDAocmFuZ2UgPD0gMTYgfHwgIXMtPm1zbXBlZzRfdmVyc2lvbik7CisgICAgYXZfYXNzZXJ0MChyYW5nZSA8PTI1NiB8fCAhKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYgcy0+YXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+PSBGRl9DT01QTElBTkNFX05PUk1BTCkpOworCisgICAgaWYoYy0+YXZjdHgtPm1lX3JhbmdlICYmIHJhbmdlID4gYy0+YXZjdHgtPm1lX3JhbmdlKSByYW5nZT0gYy0+YXZjdHgtPm1lX3JhbmdlOworCisgICAgaWYocy0+ZmxhZ3MmQ09ERUNfRkxBR180TVYpeworICAgICAgICBjb25zdCBpbnQgd3JhcD0gcy0+Yjhfc3RyaWRlOworCisgICAgICAgIC8qIGNsaXAgLyBjb252ZXJ0IHRvIGludHJhIDh4OCB0eXBlIE1WcyAqLworICAgICAgICBmb3IoeT0wOyB5PHMtPm1iX2hlaWdodDsgeSsrKXsKKyAgICAgICAgICAgIGludCB4eT0geSoyKndyYXA7CisgICAgICAgICAgICBpbnQgaT0geSpzLT5tYl9zdHJpZGU7CisgICAgICAgICAgICBpbnQgeDsKKworICAgICAgICAgICAgZm9yKHg9MDsgeDxzLT5tYl93aWR0aDsgeCsrKXsKKyAgICAgICAgICAgICAgICBpZihzLT5tYl90eXBlW2ldJkNBTkRJREFURV9NQl9UWVBFX0lOVEVSNFYpeworICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIGZvcihibG9jaz0wOyBibG9jazw0OyBibG9jaysrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmY9IChibG9jayYgMSkgKyAoYmxvY2s+PjEpKndyYXA7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXggPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVsgeHkgKyBvZmYgXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBteSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdWyB4eSArIG9mZiBdWzFdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggICBteCA+PXJhbmdlIHx8IG14IDwtcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG15ID49cmFuZ2UgfHwgbXkgPC1yYW5nZSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfdHlwZVtpXSAmPSB+Q0FORElEQVRFX01CX1RZUEVfSU5URVI0VjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYl90eXBlW2ldIHw9IENBTkRJREFURV9NQl9UWVBFX0lOVFJBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW2ldID0gQ0FORElEQVRFX01CX1RZUEVfSU5UUkE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeHkrPTI7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqCisgKiBAcGFyYW0gdHJ1bmNhdGUgMSBmb3IgdHJ1bmNhdGlvbiwgMCBmb3IgdXNpbmcgaW50cmEKKyAqLwordm9pZCBmZl9maXhfbG9uZ19tdnMoTXBlZ0VuY0NvbnRleHQgKiBzLCB1aW50OF90ICpmaWVsZF9zZWxlY3RfdGFibGUsIGludCBmaWVsZF9zZWxlY3QsCisgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICgqbXZfdGFibGUpWzJdLCBpbnQgZl9jb2RlLCBpbnQgdHlwZSwgaW50IHRydW5jYXRlKQoreworICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CisgICAgaW50IHksIGhfcmFuZ2UsIHZfcmFuZ2U7CisKKyAgICAvLyBSQUw6IDggaW4gTVBFRy0xLCAxNiBpbiBNUEVHLTQKKyAgICBpbnQgcmFuZ2UgPSAoKChzLT5vdXRfZm9ybWF0ID09IEZNVF9NUEVHMSB8fCBzLT5tc21wZWc0X3ZlcnNpb24pID8gOCA6IDE2KSA8PCBmX2NvZGUpOworCisgICAgaWYoYy0+YXZjdHgtPm1lX3JhbmdlICYmIHJhbmdlID4gYy0+YXZjdHgtPm1lX3JhbmdlKSByYW5nZT0gYy0+YXZjdHgtPm1lX3JhbmdlOworCisgICAgaF9yYW5nZT0gcmFuZ2U7CisgICAgdl9yYW5nZT0gZmllbGRfc2VsZWN0X3RhYmxlID8gcmFuZ2U+PjEgOiByYW5nZTsKKworICAgIC8qIGNsaXAgLyBjb252ZXJ0IHRvIGludHJhIDE2eDE2IHR5cGUgTVZzICovCisgICAgZm9yKHk9MDsgeTxzLT5tYl9oZWlnaHQ7IHkrKyl7CisgICAgICAgIGludCB4OworICAgICAgICBpbnQgeHk9IHkqcy0+bWJfc3RyaWRlOworICAgICAgICBmb3IoeD0wOyB4PHMtPm1iX3dpZHRoOyB4KyspeworICAgICAgICAgICAgaWYgKHMtPm1iX3R5cGVbeHldICYgdHlwZSl7ICAgIC8vIFJBTDogInR5cGUiIHRlc3QgYWRkZWQuLi4KKyAgICAgICAgICAgICAgICBpZiAoIWZpZWxkX3NlbGVjdF90YWJsZSB8fCBmaWVsZF9zZWxlY3RfdGFibGVbeHldID09IGZpZWxkX3NlbGVjdCkgeworICAgICAgICAgICAgICAgICAgICBpZiggICBtdl90YWJsZVt4eV1bMF0gPj1oX3JhbmdlIHx8IG12X3RhYmxlW3h5XVswXSA8LWhfcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgbXZfdGFibGVbeHldWzFdID49dl9yYW5nZSB8fCBtdl90YWJsZVt4eV1bMV0gPC12X3JhbmdlKXsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYodHJ1bmNhdGUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICAgICAobXZfdGFibGVbeHldWzBdID4gaF9yYW5nZS0xKSBtdl90YWJsZVt4eV1bMF09ICBoX3JhbmdlLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihtdl90YWJsZVt4eV1bMF0gPCAtaF9yYW5nZSApIG12X3RhYmxlW3h5XVswXT0gLWhfcmFuZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgICAgIChtdl90YWJsZVt4eV1bMV0gPiB2X3JhbmdlLTEpIG12X3RhYmxlW3h5XVsxXT0gIHZfcmFuZ2UtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKG12X3RhYmxlW3h5XVsxXSA8IC12X3JhbmdlICkgbXZfdGFibGVbeHldWzFdPSAtdl9yYW5nZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3R5cGVbeHldICY9IH50eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3R5cGVbeHldIHw9IENBTkRJREFURV9NQl9UWVBFX0lOVFJBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X3RhYmxlW3h5XVswXT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl90YWJsZVt4eV1bMV09IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4eSsrOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbW90aW9uX2VzdF90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbW90aW9uX2VzdF90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMmNiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tb3Rpb25fZXN0X3RlbXBsYXRlLmMKQEAgLTAsMCArMSwxMTA1IEBACisvKgorICogTW90aW9uIGVzdGltYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTW90aW9uIGVzdGltYXRpb24gdGVtcGxhdGUuCisgKi8KKworI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorCisvL0xldCB1cyBob3BlIGdjYyB3aWxsIHJlbW92ZSB0aGUgdW51c2VkIHZhcnMgLi4uKGdjYyAzLjIuMiBzZWVtcyB0byBkbyBpdCAuLi4pCisjZGVmaW5lIExPQURfQ09NTU9OXAorICAgIHVpbnQzMl90IGF2X3VudXNlZCAqIGNvbnN0IHNjb3JlX21hcD0gYy0+c2NvcmVfbWFwO1wKKyAgICBjb25zdCBpbnQgYXZfdW51c2VkIHhtaW49IGMtPnhtaW47XAorICAgIGNvbnN0IGludCBhdl91bnVzZWQgeW1pbj0gYy0+eW1pbjtcCisgICAgY29uc3QgaW50IGF2X3VudXNlZCB4bWF4PSBjLT54bWF4O1wKKyAgICBjb25zdCBpbnQgYXZfdW51c2VkIHltYXg9IGMtPnltYXg7XAorICAgIHVpbnQ4X3QgKm12X3BlbmFsdHk9IGMtPmN1cnJlbnRfbXZfcGVuYWx0eTtcCisgICAgY29uc3QgaW50IHByZWRfeD0gYy0+cHJlZF94O1wKKyAgICBjb25zdCBpbnQgcHJlZF95PSBjLT5wcmVkX3k7XAorCisjZGVmaW5lIENIRUNLX0hBTEZfTVYoZHgsIGR5LCB4LCB5KVwKK3tcCisgICAgY29uc3QgaW50IGh4PSAyKih4KSsoZHgpO1wKKyAgICBjb25zdCBpbnQgaHk9IDIqKHkpKyhkeSk7XAorICAgIGQ9IGNtcF9ocGVsKHMsIHgsIHksIGR4LCBkeSwgc2l6ZSwgaCwgcmVmX2luZGV4LCBzcmNfaW5kZXgsIGNtcF9zdWIsIGNocm9tYV9jbXBfc3ViLCBmbGFncyk7XAorICAgIGQgKz0gKG12X3BlbmFsdHlbaHggLSBwcmVkX3hdICsgbXZfcGVuYWx0eVtoeSAtIHByZWRfeV0pKnBlbmFsdHlfZmFjdG9yO1wKKyAgICBDT1BZM19JRl9MVChkbWluLCBkLCBieCwgaHgsIGJ5LCBoeSlcCit9CisKK3N0YXRpYyBpbnQgaHBlbF9tb3Rpb25fc2VhcmNoKE1wZWdFbmNDb250ZXh0ICogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm14X3B0ciwgaW50ICpteV9wdHIsIGludCBkbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaW5kZXgsIGludCByZWZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCBoKQoreworICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CisgICAgY29uc3QgaW50IG14ID0gKm14X3B0cjsKKyAgICBjb25zdCBpbnQgbXkgPSAqbXlfcHRyOworICAgIGNvbnN0IGludCBwZW5hbHR5X2ZhY3Rvcj0gYy0+c3ViX3BlbmFsdHlfZmFjdG9yOworICAgIG1lX2NtcF9mdW5jIGNtcF9zdWIsIGNocm9tYV9jbXBfc3ViOworICAgIGludCBieD0yKm14LCBieT0yKm15OworCisgICAgTE9BRF9DT01NT04KKyAgICBpbnQgZmxhZ3M9IGMtPnN1Yl9mbGFnczsKKworIC8vRklYTUUgZmFjdG9yaXplCisKKyAgICBjbXBfc3ViICAgICAgICA9IHMtPm1lY2MubWVfc3ViX2NtcFtzaXplXTsKKyAgICBjaHJvbWFfY21wX3N1YiA9IHMtPm1lY2MubWVfc3ViX2NtcFtzaXplICsgMV07CisKKyAgICBpZihjLT5za2lwKXsgLy9GSVhNRSBtb3ZlIG91dCBvZiBocGVsPworICAgICAgICAqbXhfcHRyID0gMDsKKyAgICAgICAgKm15X3B0ciA9IDA7CisgICAgICAgIHJldHVybiBkbWluOworICAgIH0KKworICAgIGlmKGMtPmF2Y3R4LT5tZV9jbXAgIT0gYy0+YXZjdHgtPm1lX3N1Yl9jbXApeworICAgICAgICBkbWluPSBjbXAocywgbXgsIG15LCAwLCAwLCBzaXplLCBoLCByZWZfaW5kZXgsIHNyY19pbmRleCwgY21wX3N1YiwgY2hyb21hX2NtcF9zdWIsIGZsYWdzKTsKKyAgICAgICAgaWYobXggfHwgbXkgfHwgc2l6ZT4wKQorICAgICAgICAgICAgZG1pbiArPSAobXZfcGVuYWx0eVsyKm14IC0gcHJlZF94XSArIG12X3BlbmFsdHlbMipteSAtIHByZWRfeV0pKnBlbmFsdHlfZmFjdG9yOworICAgIH0KKworICAgIGlmIChteCA+IHhtaW4gJiYgbXggPCB4bWF4ICYmCisgICAgICAgIG15ID4geW1pbiAmJiBteSA8IHltYXgpIHsKKyAgICAgICAgaW50IGQ9IGRtaW47CisgICAgICAgIGNvbnN0IGludCBpbmRleD0gKG15PDxNRV9NQVBfU0hJRlQpICsgbXg7CisgICAgICAgIGNvbnN0IGludCB0PSBzY29yZV9tYXBbKGluZGV4LSgxPDxNRV9NQVBfU0hJRlQpKSYoTUVfTUFQX1NJWkUtMSldCisgICAgICAgICAgICAgICAgICAgICArIChtdl9wZW5hbHR5W2J4ICAgLSBwcmVkX3hdICsgbXZfcGVuYWx0eVtieS0yIC0gcHJlZF95XSkqYy0+cGVuYWx0eV9mYWN0b3I7CisgICAgICAgIGNvbnN0IGludCBsPSBzY29yZV9tYXBbKGluZGV4LSAxICAgICAgICAgICAgICAgKSYoTUVfTUFQX1NJWkUtMSldCisgICAgICAgICAgICAgICAgICAgICArIChtdl9wZW5hbHR5W2J4LTIgLSBwcmVkX3hdICsgbXZfcGVuYWx0eVtieSAgIC0gcHJlZF95XSkqYy0+cGVuYWx0eV9mYWN0b3I7CisgICAgICAgIGNvbnN0IGludCByPSBzY29yZV9tYXBbKGluZGV4KyAxICAgICAgICAgICAgICAgKSYoTUVfTUFQX1NJWkUtMSldCisgICAgICAgICAgICAgICAgICAgICArIChtdl9wZW5hbHR5W2J4KzIgLSBwcmVkX3hdICsgbXZfcGVuYWx0eVtieSAgIC0gcHJlZF95XSkqYy0+cGVuYWx0eV9mYWN0b3I7CisgICAgICAgIGNvbnN0IGludCBiPSBzY29yZV9tYXBbKGluZGV4KygxPDxNRV9NQVBfU0hJRlQpKSYoTUVfTUFQX1NJWkUtMSldCisgICAgICAgICAgICAgICAgICAgICArIChtdl9wZW5hbHR5W2J4ICAgLSBwcmVkX3hdICsgbXZfcGVuYWx0eVtieSsyIC0gcHJlZF95XSkqYy0+cGVuYWx0eV9mYWN0b3I7CisKKyNpZiBkZWZpbmVkKEFTU0VSVF9MRVZFTCkgJiYgQVNTRVJUX0xFVkVMID4gMQorICAgICAgICB1bnNpZ25lZCBrZXk7CisgICAgICAgIHVuc2lnbmVkIG1hcF9nZW5lcmF0aW9uPSBjLT5tYXBfZ2VuZXJhdGlvbjsKKyAgICAgICAga2V5PSAoKG15LTEpPDxNRV9NQVBfTVZfQklUUykgKyAobXgpICsgbWFwX2dlbmVyYXRpb247CisgICAgICAgIGF2X2Fzc2VydDIoYy0+bWFwWyhpbmRleC0oMTw8TUVfTUFQX1NISUZUKSkmKE1FX01BUF9TSVpFLTEpXSA9PSBrZXkpOworICAgICAgICBrZXk9ICgobXkrMSk8PE1FX01BUF9NVl9CSVRTKSArIChteCkgKyBtYXBfZ2VuZXJhdGlvbjsKKyAgICAgICAgYXZfYXNzZXJ0MihjLT5tYXBbKGluZGV4KygxPDxNRV9NQVBfU0hJRlQpKSYoTUVfTUFQX1NJWkUtMSldID09IGtleSk7CisgICAgICAgIGtleT0gKChteSk8PE1FX01BUF9NVl9CSVRTKSArIChteCsxKSArIG1hcF9nZW5lcmF0aW9uOworICAgICAgICBhdl9hc3NlcnQyKGMtPm1hcFsoaW5kZXgrMSkmKE1FX01BUF9TSVpFLTEpXSA9PSBrZXkpOworICAgICAgICBrZXk9ICgobXkpPDxNRV9NQVBfTVZfQklUUykgKyAobXgtMSkgKyBtYXBfZ2VuZXJhdGlvbjsKKyAgICAgICAgYXZfYXNzZXJ0MihjLT5tYXBbKGluZGV4LTEpJihNRV9NQVBfU0laRS0xKV0gPT0ga2V5KTsKKyNlbmRpZgorICAgICAgICBpZih0PD1iKXsKKyAgICAgICAgICAgIENIRUNLX0hBTEZfTVYoMCwgMSwgbXggICxteS0xKQorICAgICAgICAgICAgaWYobDw9cil7CisgICAgICAgICAgICAgICAgQ0hFQ0tfSEFMRl9NVigxLCAxLCBteC0xLCBteS0xKQorICAgICAgICAgICAgICAgIGlmKHQrcjw9YitsKXsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfSEFMRl9NVigxLCAxLCBteCAgLCBteS0xKQorICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBDSEVDS19IQUxGX01WKDEsIDEsIG14LTEsIG15ICApCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0hBTEZfTVYoMSwgMCwgbXgtMSwgbXkgICkKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIENIRUNLX0hBTEZfTVYoMSwgMSwgbXggICwgbXktMSkKKyAgICAgICAgICAgICAgICBpZih0K2w8PWIrcil7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0hBTEZfTVYoMSwgMSwgbXgtMSwgbXktMSkKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfSEFMRl9NVigxLCAxLCBteCAgLCBteSAgKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19IQUxGX01WKDEsIDAsIG14ICAsIG15ICApCisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgaWYobDw9cil7CisgICAgICAgICAgICAgICAgaWYodCtsPD1iK3IpeworICAgICAgICAgICAgICAgICAgICBDSEVDS19IQUxGX01WKDEsIDEsIG14LTEsIG15LTEpCisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0hBTEZfTVYoMSwgMSwgbXggICwgbXkgICkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ0hFQ0tfSEFMRl9NVigxLCAwLCBteC0xLCBteSkKKyAgICAgICAgICAgICAgICBDSEVDS19IQUxGX01WKDEsIDEsIG14LTEsIG15KQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgaWYodCtyPD1iK2wpeworICAgICAgICAgICAgICAgICAgICBDSEVDS19IQUxGX01WKDEsIDEsIG14ICAsIG15LTEpCisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0hBTEZfTVYoMSwgMSwgbXgtMSwgbXkpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0hBTEZfTVYoMSwgMCwgbXggICwgbXkpCisgICAgICAgICAgICAgICAgQ0hFQ0tfSEFMRl9NVigxLCAxLCBteCAgLCBteSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0hBTEZfTVYoMCwgMSwgbXggICwgbXkpCisgICAgICAgIH0KKyAgICAgICAgYXZfYXNzZXJ0MihieCA+PSB4bWluKjIgJiYgYnggPD0geG1heCoyICYmIGJ5ID49IHltaW4qMiAmJiBieSA8PSB5bWF4KjIpOworICAgIH0KKworICAgICpteF9wdHIgPSBieDsKKyAgICAqbXlfcHRyID0gYnk7CisKKyAgICByZXR1cm4gZG1pbjsKK30KKworc3RhdGljIGludCBub19zdWJfbW90aW9uX3NlYXJjaChNcGVnRW5jQ29udGV4dCAqIHMsCisgICAgICAgICAgaW50ICpteF9wdHIsIGludCAqbXlfcHRyLCBpbnQgZG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaCkKK3sKKyAgICAoKm14X3B0cik8PD0xOworICAgICgqbXlfcHRyKTw8PTE7CisgICAgcmV0dXJuIGRtaW47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9tYl9zY29yZShNcGVnRW5jQ29udGV4dCAqcywgaW50IG14LCBpbnQgbXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBhZGRfcmF0ZSkKK3sKKyAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOworICAgIGNvbnN0IGludCBwZW5hbHR5X2ZhY3Rvcj0gYy0+bWJfcGVuYWx0eV9mYWN0b3I7CisgICAgY29uc3QgaW50IGZsYWdzPSBjLT5tYl9mbGFnczsKKyAgICBjb25zdCBpbnQgcXBlbD0gZmxhZ3MgJiBGTEFHX1FQRUw7CisgICAgY29uc3QgaW50IG1hc2s9IDErMipxcGVsOworICAgIG1lX2NtcF9mdW5jIGNtcF9zdWIsIGNocm9tYV9jbXBfc3ViOworICAgIGludCBkOworCisgICAgTE9BRF9DT01NT04KKworIC8vRklYTUUgZmFjdG9yaXplCisKKyAgICBjbXBfc3ViICAgICAgICA9IHMtPm1lY2MubWJfY21wW3NpemVdOworICAgIGNocm9tYV9jbXBfc3ViID0gcy0+bWVjYy5tYl9jbXBbc2l6ZSArIDFdOworCisgICAgZD0gY21wKHMsIG14Pj4ocXBlbCsxKSwgbXk+PihxcGVsKzEpLCBteCZtYXNrLCBteSZtYXNrLCBzaXplLCBoLCByZWZfaW5kZXgsIHNyY19pbmRleCwgY21wX3N1YiwgY2hyb21hX2NtcF9zdWIsIGZsYWdzKTsKKyAgICAvL0ZJWE1FIGNoZWNrIGNicCBiZWZvcmUgYWRkaW5nIHBlbmFsdHkgZm9yICgwLDApIHZlY3RvcgorICAgIGlmKGFkZF9yYXRlICYmIChteCB8fCBteSB8fCBzaXplPjApKQorICAgICAgICBkICs9IChtdl9wZW5hbHR5W214IC0gcHJlZF94XSArIG12X3BlbmFsdHlbbXkgLSBwcmVkX3ldKSpwZW5hbHR5X2ZhY3RvcjsKKworICAgIHJldHVybiBkOworfQorCitpbnQgZmZfZ2V0X21iX3Njb3JlKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgbXgsIGludCBteSwgaW50IHNyY19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlZl9pbmRleCwgaW50IHNpemUsIGludCBoLCBpbnQgYWRkX3JhdGUpCit7CisgICAgcmV0dXJuIGdldF9tYl9zY29yZShzLCBteCwgbXksIHNyY19pbmRleCwgcmVmX2luZGV4LCBzaXplLCBoLCBhZGRfcmF0ZSk7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfUVVBUlRFUl9NVihkeCwgZHksIHgsIHkpXAore1wKKyAgICBjb25zdCBpbnQgaHg9IDQqKHgpKyhkeCk7XAorICAgIGNvbnN0IGludCBoeT0gNCooeSkrKGR5KTtcCisgICAgZD0gY21wX3FwZWwocywgeCwgeSwgZHgsIGR5LCBzaXplLCBoLCByZWZfaW5kZXgsIHNyY19pbmRleCwgY21wZiwgY2hyb21hX2NtcGYsIGZsYWdzKTtcCisgICAgZCArPSAobXZfcGVuYWx0eVtoeCAtIHByZWRfeF0gKyBtdl9wZW5hbHR5W2h5IC0gcHJlZF95XSkqcGVuYWx0eV9mYWN0b3I7XAorICAgIENPUFkzX0lGX0xUKGRtaW4sIGQsIGJ4LCBoeCwgYnksIGh5KVwKK30KKworc3RhdGljIGludCBxcGVsX21vdGlvbl9zZWFyY2goTXBlZ0VuY0NvbnRleHQgKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbXhfcHRyLCBpbnQgKm15X3B0ciwgaW50IGRtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGgpCit7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBjb25zdCBpbnQgbXggPSAqbXhfcHRyOworICAgIGNvbnN0IGludCBteSA9ICpteV9wdHI7CisgICAgY29uc3QgaW50IHBlbmFsdHlfZmFjdG9yPSBjLT5zdWJfcGVuYWx0eV9mYWN0b3I7CisgICAgY29uc3QgdW5zaWduZWQgbWFwX2dlbmVyYXRpb24gPSBjLT5tYXBfZ2VuZXJhdGlvbjsKKyAgICBjb25zdCBpbnQgc3VicGVsX3F1YWxpdHk9IGMtPmF2Y3R4LT5tZV9zdWJwZWxfcXVhbGl0eTsKKyAgICB1aW50MzJfdCAqbWFwPSBjLT5tYXA7CisgICAgbWVfY21wX2Z1bmMgY21wZiwgY2hyb21hX2NtcGY7CisgICAgbWVfY21wX2Z1bmMgY21wX3N1YiwgY2hyb21hX2NtcF9zdWI7CisKKyAgICBMT0FEX0NPTU1PTgorICAgIGludCBmbGFncz0gYy0+c3ViX2ZsYWdzOworCisgICAgY21wZiAgICAgICAgPSBzLT5tZWNjLm1lX2NtcFtzaXplXTsKKyAgICBjaHJvbWFfY21wZiA9IHMtPm1lY2MubWVfY21wW3NpemUgKyAxXTsgLy8gRklYTUU6IGZhY3Rvcml6ZQorIC8vRklYTUUgZmFjdG9yaXplCisKKyAgICBjbXBfc3ViICAgICAgICA9IHMtPm1lY2MubWVfc3ViX2NtcFtzaXplXTsKKyAgICBjaHJvbWFfY21wX3N1YiA9IHMtPm1lY2MubWVfc3ViX2NtcFtzaXplICsgMV07CisKKyAgICBpZihjLT5za2lwKXsgLy9GSVhNRSBzb21laG93IG1vdmUgdXAgKGJlbmNobWFyaykKKyAgICAgICAgKm14X3B0ciA9IDA7CisgICAgICAgICpteV9wdHIgPSAwOworICAgICAgICByZXR1cm4gZG1pbjsKKyAgICB9CisKKyAgICBpZihjLT5hdmN0eC0+bWVfY21wICE9IGMtPmF2Y3R4LT5tZV9zdWJfY21wKXsKKyAgICAgICAgZG1pbj0gY21wKHMsIG14LCBteSwgMCwgMCwgc2l6ZSwgaCwgcmVmX2luZGV4LCBzcmNfaW5kZXgsIGNtcF9zdWIsIGNocm9tYV9jbXBfc3ViLCBmbGFncyk7CisgICAgICAgIGlmKG14IHx8IG15IHx8IHNpemU+MCkKKyAgICAgICAgICAgIGRtaW4gKz0gKG12X3BlbmFsdHlbNCpteCAtIHByZWRfeF0gKyBtdl9wZW5hbHR5WzQqbXkgLSBwcmVkX3ldKSpwZW5hbHR5X2ZhY3RvcjsKKyAgICB9CisKKyAgICBpZiAobXggPiB4bWluICYmIG14IDwgeG1heCAmJgorICAgICAgICBteSA+IHltaW4gJiYgbXkgPCB5bWF4KSB7CisgICAgICAgIGludCBieD00Km14LCBieT00Km15OworICAgICAgICBpbnQgZD0gZG1pbjsKKyAgICAgICAgaW50IGksIG54LCBueTsKKyAgICAgICAgY29uc3QgaW50IGluZGV4PSAobXk8PE1FX01BUF9TSElGVCkgKyBteDsKKyAgICAgICAgY29uc3QgaW50IHQ9IHNjb3JlX21hcFsoaW5kZXgtKDE8PE1FX01BUF9TSElGVCkgICkmKE1FX01BUF9TSVpFLTEpXTsKKyAgICAgICAgY29uc3QgaW50IGw9IHNjb3JlX21hcFsoaW5kZXgtIDEgICAgICAgICAgICAgICAgICkmKE1FX01BUF9TSVpFLTEpXTsKKyAgICAgICAgY29uc3QgaW50IHI9IHNjb3JlX21hcFsoaW5kZXgrIDEgICAgICAgICAgICAgICAgICkmKE1FX01BUF9TSVpFLTEpXTsKKyAgICAgICAgY29uc3QgaW50IGI9IHNjb3JlX21hcFsoaW5kZXgrKDE8PE1FX01BUF9TSElGVCkgICkmKE1FX01BUF9TSVpFLTEpXTsKKyAgICAgICAgY29uc3QgaW50IGM9IHNjb3JlX21hcFsoaW5kZXggICAgICAgICAgICAgICAgICAgICkmKE1FX01BUF9TSVpFLTEpXTsKKyAgICAgICAgaW50IGJlc3RbOF07CisgICAgICAgIGludCBiZXN0X3Bvc1s4XVsyXTsKKworICAgICAgICBtZW1zZXQoYmVzdCwgNjQsIHNpemVvZihpbnQpKjgpOworICAgICAgICBpZihzLT5tZS5kaWFfc2l6ZT49Mil7CisgICAgICAgICAgICBjb25zdCBpbnQgdGw9IHNjb3JlX21hcFsoaW5kZXgtKDE8PE1FX01BUF9TSElGVCktMSkmKE1FX01BUF9TSVpFLTEpXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBibD0gc2NvcmVfbWFwWyhpbmRleCsoMTw8TUVfTUFQX1NISUZUKS0xKSYoTUVfTUFQX1NJWkUtMSldOworICAgICAgICAgICAgY29uc3QgaW50IHRyPSBzY29yZV9tYXBbKGluZGV4LSgxPDxNRV9NQVBfU0hJRlQpKzEpJihNRV9NQVBfU0laRS0xKV07CisgICAgICAgICAgICBjb25zdCBpbnQgYnI9IHNjb3JlX21hcFsoaW5kZXgrKDE8PE1FX01BUF9TSElGVCkrMSkmKE1FX01BUF9TSVpFLTEpXTsKKworICAgICAgICAgICAgZm9yKG55PSAtMzsgbnkgPD0gMzsgbnkrKyl7CisgICAgICAgICAgICAgICAgZm9yKG54PSAtMzsgbnggPD0gMzsgbngrKyl7CisgICAgICAgICAgICAgICAgICAgIC8vRklYTUUgdGhpcyBjb3VsZCBvdmVyZmxvdyAodW5saWtlbHkgdGhvdWdoKQorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHQyPSBueCpueCoodHIgKyB0bCAtIDIqdCkgKyA0Km54Kih0ci10bCkgKyAzMip0OworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGMyPSBueCpueCooIHIgKyAgbCAtIDIqYykgKyA0Km54Kiggci0gbCkgKyAzMipjOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGIyPSBueCpueCooYnIgKyBibCAtIDIqYikgKyA0Km54Kihici1ibCkgKyAzMipiOworICAgICAgICAgICAgICAgICAgICBpbnQgc2NvcmU9IChueSpueSooYjIgKyB0MiAtIDIqYzIpICsgNCpueSooYjIgLSB0MikgKyAzMipjMiArIDUxMik+PjEwOworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICBpZigobngmMyk9PTAgJiYgKG55JjMpPT0wKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBzY29yZSArPSAobXZfcGVuYWx0eVs0Km14ICsgbnggLSBwcmVkX3hdICsgbXZfcGVuYWx0eVs0Km15ICsgbnkgLSBwcmVkX3ldKSpwZW5hbHR5X2ZhY3RvcjsKKworLy8gICAgICAgICAgICAgICAgICAgIGlmKG54JjEpIHNjb3JlLT0xMDI0KmMtPnBlbmFsdHlfZmFjdG9yOworLy8gICAgICAgICAgICAgICAgICAgIGlmKG55JjEpIHNjb3JlLT0xMDI0KmMtPnBlbmFsdHlfZmFjdG9yOworCisgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8ODsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNjb3JlIDwgYmVzdFtpXSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgmYmVzdFtpKzFdLCAmYmVzdFtpXSwgc2l6ZW9mKGludCkqKDctaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoJmJlc3RfcG9zW2krMV1bMF0sICZiZXN0X3Bvc1tpXVswXSwgc2l6ZW9mKGludCkqMiooNy1pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFtpXT0gc2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9wb3NbaV1bMF09IG54ICsgNCpteDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3Bvc1tpXVsxXT0gbnkgKyA0Km15OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGludCB0bDsKKyAgICAgICAgICAgIC8vRklYTUUgdGhpcyBjb3VsZCBvdmVyZmxvdyAodW5saWtlbHkgdGhvdWdoKQorICAgICAgICAgICAgY29uc3QgaW50IGN4ID0gNCoociAtIGwpOworICAgICAgICAgICAgY29uc3QgaW50IGN4Mj0gciArIGwgLSAyKmM7CisgICAgICAgICAgICBjb25zdCBpbnQgY3kgPSA0KihiIC0gdCk7CisgICAgICAgICAgICBjb25zdCBpbnQgY3kyPSBiICsgdCAtIDIqYzsKKyAgICAgICAgICAgIGludCBjeHk7CisKKyAgICAgICAgICAgIGlmKG1hcFsoaW5kZXgtKDE8PE1FX01BUF9TSElGVCktMSkmKE1FX01BUF9TSVpFLTEpXSA9PSAobXk8PE1FX01BUF9NVl9CSVRTKSArIG14ICsgbWFwX2dlbmVyYXRpb24gJiYgMCl7IC8vRklYTUUKKyAgICAgICAgICAgICAgICB0bD0gc2NvcmVfbWFwWyhpbmRleC0oMTw8TUVfTUFQX1NISUZUKS0xKSYoTUVfTUFQX1NJWkUtMSldOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgdGw9IGNtcChzLCBteC0xLCBteS0xLCAwLCAwLCBzaXplLCBoLCByZWZfaW5kZXgsIHNyY19pbmRleCwgY21wZiwgY2hyb21hX2NtcGYsIGZsYWdzKTsvL0ZJWE1FIHdyb25nIGlmIGNocm9tYSBtZSBpcyBkaWZmZXJlbnQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3h5PSAyKnRsICsgKGN4ICsgY3kpLzQgLSAoY3gyICsgY3kyKSAtIDIqYzsKKworICAgICAgICAgICAgYXZfYXNzZXJ0MigxNipjeDIgKyA0KmN4ICsgMzIqYyA9PSAzMipyKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDIoMTYqY3gyIC0gNCpjeCArIDMyKmMgPT0gMzIqbCk7CisgICAgICAgICAgICBhdl9hc3NlcnQyKDE2KmN5MiArIDQqY3kgKyAzMipjID09IDMyKmIpOworICAgICAgICAgICAgYXZfYXNzZXJ0MigxNipjeTIgLSA0KmN5ICsgMzIqYyA9PSAzMip0KTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDIoMTYqY3h5ICsgMTYqY3kyICsgMTYqY3gyIC0gNCpjeSAtIDQqY3ggKyAzMipjID09IDMyKnRsKTsKKworICAgICAgICAgICAgZm9yKG55PSAtMzsgbnkgPD0gMzsgbnkrKyl7CisgICAgICAgICAgICAgICAgZm9yKG54PSAtMzsgbnggPD0gMzsgbngrKyl7CisgICAgICAgICAgICAgICAgICAgIC8vRklYTUUgdGhpcyBjb3VsZCBvdmVyZmxvdyAodW5saWtlbHkgdGhvdWdoKQorICAgICAgICAgICAgICAgICAgICBpbnQgc2NvcmU9IG55Km54KmN4eSArIG54Km54KmN4MiArIG55Km55KmN5MiArIG54KmN4ICsgbnkqY3kgKyAzMipjOyAvL0ZJWE1FIGZhY3RvcgorICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICBpZigobngmMyk9PTAgJiYgKG55JjMpPT0wKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBzY29yZSArPSAzMioobXZfcGVuYWx0eVs0Km14ICsgbnggLSBwcmVkX3hdICsgbXZfcGVuYWx0eVs0Km15ICsgbnkgLSBwcmVkX3ldKSpwZW5hbHR5X2ZhY3RvcjsKKy8vICAgICAgICAgICAgICAgICAgICBpZihueCYxKSBzY29yZS09MzIqYy0+cGVuYWx0eV9mYWN0b3I7CisgIC8vICAgICAgICAgICAgICAgICAgaWYobnkmMSkgc2NvcmUtPTMyKmMtPnBlbmFsdHlfZmFjdG9yOworCisgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8ODsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNjb3JlIDwgYmVzdFtpXSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgmYmVzdFtpKzFdLCAmYmVzdFtpXSwgc2l6ZW9mKGludCkqKDctaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoJmJlc3RfcG9zW2krMV1bMF0sICZiZXN0X3Bvc1tpXVswXSwgc2l6ZW9mKGludCkqMiooNy1pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFtpXT0gc2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9wb3NbaV1bMF09IG54ICsgNCpteDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3Bvc1tpXVsxXT0gbnkgKyA0Km15OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvcihpPTA7IGk8c3VicGVsX3F1YWxpdHk7IGkrKyl7CisgICAgICAgICAgICBueD0gYmVzdF9wb3NbaV1bMF07CisgICAgICAgICAgICBueT0gYmVzdF9wb3NbaV1bMV07CisgICAgICAgICAgICBDSEVDS19RVUFSVEVSX01WKG54JjMsIG55JjMsIG54Pj4yLCBueT4+MikKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Fzc2VydDIoYnggPj0geG1pbio0ICYmIGJ4IDw9IHhtYXgqNCAmJiBieSA+PSB5bWluKjQgJiYgYnkgPD0geW1heCo0KTsKKworICAgICAgICAqbXhfcHRyID0gYng7CisgICAgICAgICpteV9wdHIgPSBieTsKKyAgICB9ZWxzZXsKKyAgICAgICAgKm14X3B0ciA9NCpteDsKKyAgICAgICAgKm15X3B0ciA9NCpteTsKKyAgICB9CisKKyAgICByZXR1cm4gZG1pbjsKK30KKworCisjZGVmaW5lIENIRUNLX01WKHgseSlcCit7XAorICAgIGNvbnN0IHVuc2lnbmVkIGtleSA9ICgoeSk8PE1FX01BUF9NVl9CSVRTKSArICh4KSArIG1hcF9nZW5lcmF0aW9uO1wKKyAgICBjb25zdCBpbnQgaW5kZXg9ICgoKHkpPDxNRV9NQVBfU0hJRlQpICsgKHgpKSYoTUVfTUFQX1NJWkUtMSk7XAorICAgIGF2X2Fzc2VydDIoKHgpID49IHhtaW4pO1wKKyAgICBhdl9hc3NlcnQyKCh4KSA8PSB4bWF4KTtcCisgICAgYXZfYXNzZXJ0MigoeSkgPj0geW1pbik7XAorICAgIGF2X2Fzc2VydDIoKHkpIDw9IHltYXgpO1wKKyAgICBpZihtYXBbaW5kZXhdIT1rZXkpe1wKKyAgICAgICAgZD0gY21wKHMsIHgsIHksIDAsIDAsIHNpemUsIGgsIHJlZl9pbmRleCwgc3JjX2luZGV4LCBjbXBmLCBjaHJvbWFfY21wZiwgZmxhZ3MpO1wKKyAgICAgICAgbWFwW2luZGV4XT0ga2V5O1wKKyAgICAgICAgc2NvcmVfbWFwW2luZGV4XT0gZDtcCisgICAgICAgIGQgKz0gKG12X3BlbmFsdHlbKCh4KTw8c2hpZnQpLXByZWRfeF0gKyBtdl9wZW5hbHR5WygoeSk8PHNoaWZ0KS1wcmVkX3ldKSpwZW5hbHR5X2ZhY3RvcjtcCisgICAgICAgIENPUFkzX0lGX0xUKGRtaW4sIGQsIGJlc3RbMF0sIHgsIGJlc3RbMV0sIHkpXAorICAgIH1cCit9CisKKyNkZWZpbmUgQ0hFQ0tfQ0xJUFBFRF9NVihheCxheSlcCit7XAorICAgIGNvbnN0IGludCBMeD0gYXg7XAorICAgIGNvbnN0IGludCBMeT0gYXk7XAorICAgIGNvbnN0IGludCBMeDI9IEZGTUFYKHhtaW4sIEZGTUlOKEx4LCB4bWF4KSk7XAorICAgIGNvbnN0IGludCBMeTI9IEZGTUFYKHltaW4sIEZGTUlOKEx5LCB5bWF4KSk7XAorICAgIENIRUNLX01WKEx4MiwgTHkyKVwKK30KKworI2RlZmluZSBDSEVDS19NVl9ESVIoeCx5LG5ld19kaXIpXAore1wKKyAgICBjb25zdCB1bnNpZ25lZCBrZXkgPSAoKHkpPDxNRV9NQVBfTVZfQklUUykgKyAoeCkgKyBtYXBfZ2VuZXJhdGlvbjtcCisgICAgY29uc3QgaW50IGluZGV4PSAoKCh5KTw8TUVfTUFQX1NISUZUKSArICh4KSkmKE1FX01BUF9TSVpFLTEpO1wKKyAgICBpZihtYXBbaW5kZXhdIT1rZXkpe1wKKyAgICAgICAgZD0gY21wKHMsIHgsIHksIDAsIDAsIHNpemUsIGgsIHJlZl9pbmRleCwgc3JjX2luZGV4LCBjbXBmLCBjaHJvbWFfY21wZiwgZmxhZ3MpO1wKKyAgICAgICAgbWFwW2luZGV4XT0ga2V5O1wKKyAgICAgICAgc2NvcmVfbWFwW2luZGV4XT0gZDtcCisgICAgICAgIGQgKz0gKG12X3BlbmFsdHlbKCh4KTw8c2hpZnQpLXByZWRfeF0gKyBtdl9wZW5hbHR5WygoeSk8PHNoaWZ0KS1wcmVkX3ldKSpwZW5hbHR5X2ZhY3RvcjtcCisgICAgICAgIGlmKGQ8ZG1pbil7XAorICAgICAgICAgICAgYmVzdFswXT14O1wKKyAgICAgICAgICAgIGJlc3RbMV09eTtcCisgICAgICAgICAgICBkbWluPWQ7XAorICAgICAgICAgICAgbmV4dF9kaXI9IG5ld19kaXI7XAorICAgICAgICB9XAorICAgIH1cCit9CisKKyNkZWZpbmUgY2hlY2soeCx5LFMsdilcCitpZiggKHgpPCh4bWluPDwoUykpICkgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkICVkICVkICVkICVkIHhtaW4iICN2LCB4bWluLCAoeCksICh5KSwgcy0+bWJfeCwgcy0+bWJfeSk7XAoraWYoICh4KT4oeG1heDw8KFMpKSApIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZCAlZCAlZCAlZCAlZCB4bWF4IiAjdiwgeG1heCwgKHgpLCAoeSksIHMtPm1iX3gsIHMtPm1iX3kpO1wKK2lmKCAoeSk8KHltaW48PChTKSkgKSBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJWQgJWQgJWQgJWQgeW1pbiIgI3YsIHltaW4sICh4KSwgKHkpLCBzLT5tYl94LCBzLT5tYl95KTtcCitpZiggKHkpPih5bWF4PDwoUykpICkgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkICVkICVkICVkICVkIHltYXgiICN2LCB5bWF4LCAoeCksICh5KSwgcy0+bWJfeCwgcy0+bWJfeSk7XAorCisjZGVmaW5lIExPQURfQ09NTU9OMlwKKyAgICB1aW50MzJfdCAqbWFwPSBjLT5tYXA7XAorICAgIGNvbnN0IGludCBxcGVsPSBmbGFncyZGTEFHX1FQRUw7XAorICAgIGNvbnN0IGludCBzaGlmdD0gMStxcGVsO1wKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHNtYWxsX2RpYW1vbmRfc2VhcmNoKE1wZWdFbmNDb250ZXh0ICogcywgaW50ICpiZXN0LCBpbnQgZG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaW5kZXgsIGludCByZWZfaW5kZXgsIGludCBjb25zdCBwZW5hbHR5X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaCwgaW50IGZsYWdzKQoreworICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CisgICAgbWVfY21wX2Z1bmMgY21wZiwgY2hyb21hX2NtcGY7CisgICAgaW50IG5leHRfZGlyPS0xOworICAgIExPQURfQ09NTU9OCisgICAgTE9BRF9DT01NT04yCisgICAgdW5zaWduZWQgbWFwX2dlbmVyYXRpb24gPSBjLT5tYXBfZ2VuZXJhdGlvbjsKKworICAgIGNtcGYgICAgICAgID0gcy0+bWVjYy5tZV9jbXBbc2l6ZV07CisgICAgY2hyb21hX2NtcGYgPSBzLT5tZWNjLm1lX2NtcFtzaXplICsgMV07CisKKyAgICB7IC8qIGVuc3VyZSB0aGF0IHRoZSBiZXN0IHBvaW50IGlzIGluIHRoZSBNQVAgYXMgaC9xcGVsIHJlZmluZW1lbnQgbmVlZHMgaXQgKi8KKyAgICAgICAgY29uc3QgdW5zaWduZWQga2V5ID0gKGJlc3RbMV08PE1FX01BUF9NVl9CSVRTKSArIGJlc3RbMF0gKyBtYXBfZ2VuZXJhdGlvbjsKKyAgICAgICAgY29uc3QgaW50IGluZGV4PSAoKGJlc3RbMV08PE1FX01BUF9TSElGVCkgKyBiZXN0WzBdKSYoTUVfTUFQX1NJWkUtMSk7CisgICAgICAgIGlmKG1hcFtpbmRleF0hPWtleSl7IC8vdGhpcyB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgdmVyeSByYXJleQorICAgICAgICAgICAgc2NvcmVfbWFwW2luZGV4XT0gY21wKHMsIGJlc3RbMF0sIGJlc3RbMV0sIDAsIDAsIHNpemUsIGgsIHJlZl9pbmRleCwgc3JjX2luZGV4LCBjbXBmLCBjaHJvbWFfY21wZiwgZmxhZ3MpOworICAgICAgICAgICAgbWFwW2luZGV4XT0ga2V5OworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKDs7KXsKKyAgICAgICAgaW50IGQ7CisgICAgICAgIGNvbnN0IGludCBkaXI9IG5leHRfZGlyOworICAgICAgICBjb25zdCBpbnQgeD0gYmVzdFswXTsKKyAgICAgICAgY29uc3QgaW50IHk9IGJlc3RbMV07CisgICAgICAgIG5leHRfZGlyPS0xOworCisgICAgICAgIGlmKGRpciE9MiAmJiB4PnhtaW4pIENIRUNLX01WX0RJUih4LTEsIHkgICwgMCkKKyAgICAgICAgaWYoZGlyIT0zICYmIHk+eW1pbikgQ0hFQ0tfTVZfRElSKHggICwgeS0xLCAxKQorICAgICAgICBpZihkaXIhPTAgJiYgeDx4bWF4KSBDSEVDS19NVl9ESVIoeCsxLCB5ICAsIDIpCisgICAgICAgIGlmKGRpciE9MSAmJiB5PHltYXgpIENIRUNLX01WX0RJUih4ICAsIHkrMSwgMykKKworICAgICAgICBpZihuZXh0X2Rpcj09LTEpeworICAgICAgICAgICAgcmV0dXJuIGRtaW47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZnVubnlfZGlhbW9uZF9zZWFyY2goTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgKmJlc3QsIGludCBkbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgaW50IGNvbnN0IHBlbmFsdHlfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCBoLCBpbnQgZmxhZ3MpCit7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBtZV9jbXBfZnVuYyBjbXBmLCBjaHJvbWFfY21wZjsKKyAgICBpbnQgZGlhX3NpemU7CisgICAgTE9BRF9DT01NT04KKyAgICBMT0FEX0NPTU1PTjIKKyAgICB1bnNpZ25lZCBtYXBfZ2VuZXJhdGlvbiA9IGMtPm1hcF9nZW5lcmF0aW9uOworCisgICAgY21wZiAgICAgICAgPSBzLT5tZWNjLm1lX2NtcFtzaXplXTsKKyAgICBjaHJvbWFfY21wZiA9IHMtPm1lY2MubWVfY21wW3NpemUgKyAxXTsKKworICAgIGZvcihkaWFfc2l6ZT0xOyBkaWFfc2l6ZTw9NDsgZGlhX3NpemUrKyl7CisgICAgICAgIGludCBkaXI7CisgICAgICAgIGNvbnN0IGludCB4PSBiZXN0WzBdOworICAgICAgICBjb25zdCBpbnQgeT0gYmVzdFsxXTsKKworICAgICAgICBpZihkaWFfc2l6ZSYoZGlhX3NpemUtMSkpIGNvbnRpbnVlOworCisgICAgICAgIGlmKCAgIHggKyBkaWFfc2l6ZSA+IHhtYXgKKyAgICAgICAgICAgfHwgeCAtIGRpYV9zaXplIDwgeG1pbgorICAgICAgICAgICB8fCB5ICsgZGlhX3NpemUgPiB5bWF4CisgICAgICAgICAgIHx8IHkgLSBkaWFfc2l6ZSA8IHltaW4pCisgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvcihkaXI9IDA7IGRpcjxkaWFfc2l6ZTsgZGlyKz0yKXsKKyAgICAgICAgICAgIGludCBkOworCisgICAgICAgICAgICBDSEVDS19NVih4ICsgZGlyICAgICAgICAgICAsIHkgKyBkaWFfc2l6ZSAtIGRpcik7CisgICAgICAgICAgICBDSEVDS19NVih4ICsgZGlhX3NpemUgLSBkaXIsIHkgLSBkaXIgICAgICAgICAgICk7CisgICAgICAgICAgICBDSEVDS19NVih4IC0gZGlyICAgICAgICAgICAsIHkgLSBkaWFfc2l6ZSArIGRpcik7CisgICAgICAgICAgICBDSEVDS19NVih4IC0gZGlhX3NpemUgKyBkaXIsIHkgKyBkaXIgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBpZih4IT1iZXN0WzBdIHx8IHkhPWJlc3RbMV0pCisgICAgICAgICAgICBkaWFfc2l6ZT0wOworICAgIH0KKyAgICByZXR1cm4gZG1pbjsKK30KKworc3RhdGljIGludCBoZXhfc2VhcmNoKE1wZWdFbmNDb250ZXh0ICogcywgaW50ICpiZXN0LCBpbnQgZG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaW5kZXgsIGludCByZWZfaW5kZXgsIGludCBjb25zdCBwZW5hbHR5X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaCwgaW50IGZsYWdzLCBpbnQgZGlhX3NpemUpCit7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBtZV9jbXBfZnVuYyBjbXBmLCBjaHJvbWFfY21wZjsKKyAgICBMT0FEX0NPTU1PTgorICAgIExPQURfQ09NTU9OMgorICAgIHVuc2lnbmVkIG1hcF9nZW5lcmF0aW9uID0gYy0+bWFwX2dlbmVyYXRpb247CisgICAgaW50IHgseSxkOworICAgIGNvbnN0IGludCBkZWM9IGRpYV9zaXplICYgKGRpYV9zaXplLTEpOworCisgICAgY21wZiAgICAgICAgPSBzLT5tZWNjLm1lX2NtcFtzaXplXTsKKyAgICBjaHJvbWFfY21wZiA9IHMtPm1lY2MubWVfY21wW3NpemUgKyAxXTsKKworICAgIGZvcig7ZGlhX3NpemU7IGRpYV9zaXplPSBkZWMgPyBkaWFfc2l6ZS0xIDogZGlhX3NpemU+PjEpeworICAgICAgICBkb3sKKyAgICAgICAgICAgIHg9IGJlc3RbMF07CisgICAgICAgICAgICB5PSBiZXN0WzFdOworCisgICAgICAgICAgICBDSEVDS19DTElQUEVEX01WKHggIC1kaWFfc2l6ZSAgICAsIHkpOworICAgICAgICAgICAgQ0hFQ0tfQ0xJUFBFRF9NVih4KyAgZGlhX3NpemUgICAgLCB5KTsKKyAgICAgICAgICAgIENIRUNLX0NMSVBQRURfTVYoeCsoIGRpYV9zaXplPj4xKSwgeStkaWFfc2l6ZSk7CisgICAgICAgICAgICBDSEVDS19DTElQUEVEX01WKHgrKCBkaWFfc2l6ZT4+MSksIHktZGlhX3NpemUpOworICAgICAgICAgICAgaWYoZGlhX3NpemU+MSl7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQ0xJUFBFRF9NVih4KygtZGlhX3NpemU+PjEpLCB5K2RpYV9zaXplKTsKKyAgICAgICAgICAgICAgICBDSEVDS19DTElQUEVEX01WKHgrKC1kaWFfc2l6ZT4+MSksIHktZGlhX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9d2hpbGUoYmVzdFswXSAhPSB4IHx8IGJlc3RbMV0gIT0geSk7CisgICAgfQorCisgICAgcmV0dXJuIGRtaW47Cit9CisKK3N0YXRpYyBpbnQgbDJzX2RpYV9zZWFyY2goTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgKmJlc3QsIGludCBkbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgaW50IGNvbnN0IHBlbmFsdHlfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCBoLCBpbnQgZmxhZ3MpCit7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBtZV9jbXBfZnVuYyBjbXBmLCBjaHJvbWFfY21wZjsKKyAgICBMT0FEX0NPTU1PTgorICAgIExPQURfQ09NTU9OMgorICAgIHVuc2lnbmVkIG1hcF9nZW5lcmF0aW9uID0gYy0+bWFwX2dlbmVyYXRpb247CisgICAgaW50IHgseSxpLGQ7CisgICAgaW50IGRpYV9zaXplPSBjLT5kaWFfc2l6ZSYweEZGOworICAgIGNvbnN0IGludCBkZWM9IGRpYV9zaXplICYgKGRpYV9zaXplLTEpOworICAgIHN0YXRpYyBjb25zdCBpbnQgaGV4WzhdWzJdPXt7LTIsIDB9LCB7LTEsLTF9LCB7IDAsLTJ9LCB7IDEsLTF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDIsIDB9LCB7IDEsIDF9LCB7IDAsIDJ9LCB7LTEsIDF9fTsKKworICAgIGNtcGYgICAgICAgID0gcy0+bWVjYy5tZV9jbXBbc2l6ZV07CisgICAgY2hyb21hX2NtcGYgPSBzLT5tZWNjLm1lX2NtcFtzaXplICsgMV07CisKKyAgICBmb3IoOyBkaWFfc2l6ZTsgZGlhX3NpemU9IGRlYyA/IGRpYV9zaXplLTEgOiBkaWFfc2l6ZT4+MSl7CisgICAgICAgIGRveworICAgICAgICAgICAgeD0gYmVzdFswXTsKKyAgICAgICAgICAgIHk9IGJlc3RbMV07CisgICAgICAgICAgICBmb3IoaT0wOyBpPDg7IGkrKyl7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQ0xJUFBFRF9NVih4K2hleFtpXVswXSpkaWFfc2l6ZSwgeStoZXhbaV1bMV0qZGlhX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9d2hpbGUoYmVzdFswXSAhPSB4IHx8IGJlc3RbMV0gIT0geSk7CisgICAgfQorCisgICAgeD0gYmVzdFswXTsKKyAgICB5PSBiZXN0WzFdOworICAgIENIRUNLX0NMSVBQRURfTVYoeCsxLCB5KTsKKyAgICBDSEVDS19DTElQUEVEX01WKHgsIHkrMSk7CisgICAgQ0hFQ0tfQ0xJUFBFRF9NVih4LTEsIHkpOworICAgIENIRUNLX0NMSVBQRURfTVYoeCwgeS0xKTsKKworICAgIHJldHVybiBkbWluOworfQorCitzdGF0aWMgaW50IHVtaF9zZWFyY2goTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgKmJlc3QsIGludCBkbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgaW50IGNvbnN0IHBlbmFsdHlfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCBoLCBpbnQgZmxhZ3MpCit7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBtZV9jbXBfZnVuYyBjbXBmLCBjaHJvbWFfY21wZjsKKyAgICBMT0FEX0NPTU1PTgorICAgIExPQURfQ09NTU9OMgorICAgIHVuc2lnbmVkIG1hcF9nZW5lcmF0aW9uID0gYy0+bWFwX2dlbmVyYXRpb247CisgICAgaW50IHgseSx4Mix5MiwgaSwgaiwgZDsKKyAgICBjb25zdCBpbnQgZGlhX3NpemU9IGMtPmRpYV9zaXplJjB4RkU7CisgICAgc3RhdGljIGNvbnN0IGludCBoZXhbMTZdWzJdPXt7LTQsLTJ9LCB7LTQsLTF9LCB7LTQsIDB9LCB7LTQsIDF9LCB7LTQsIDJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyA0LC0yfSwgeyA0LC0xfSwgeyA0LCAwfSwgeyA0LCAxfSwgeyA0LCAyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMiwgM30sIHsgMCwgNH0sIHsgMiwgM30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTIsLTN9LCB7IDAsLTR9LCB7IDIsLTN9LH07CisKKyAgICBjbXBmICAgICAgICA9IHMtPm1lY2MubWVfY21wW3NpemVdOworICAgIGNocm9tYV9jbXBmID0gcy0+bWVjYy5tZV9jbXBbc2l6ZSArIDFdOworCisgICAgeD0gYmVzdFswXTsKKyAgICB5PSBiZXN0WzFdOworICAgIGZvcih4Mj1GRk1BWCh4LWRpYV9zaXplKzEsIHhtaW4pOyB4Mjw9RkZNSU4oeCtkaWFfc2l6ZS0xLHhtYXgpOyB4Mis9Mil7CisgICAgICAgIENIRUNLX01WKHgyLCB5KTsKKyAgICB9CisgICAgZm9yKHkyPUZGTUFYKHktZGlhX3NpemUvMisxLCB5bWluKTsgeTI8PUZGTUlOKHkrZGlhX3NpemUvMi0xLHltYXgpOyB5Mis9Mil7CisgICAgICAgIENIRUNLX01WKHgsIHkyKTsKKyAgICB9CisKKyAgICB4PSBiZXN0WzBdOworICAgIHk9IGJlc3RbMV07CisgICAgZm9yKHkyPUZGTUFYKHktMiwgeW1pbik7IHkyPD1GRk1JTih5KzIseW1heCk7IHkyKyspeworICAgICAgICBmb3IoeDI9RkZNQVgoeC0yLCB4bWluKTsgeDI8PUZGTUlOKHgrMix4bWF4KTsgeDIrKyl7CisgICAgICAgICAgICBDSEVDS19NVih4MiwgeTIpOworICAgICAgICB9CisgICAgfQorCisvL0ZJWE1FIHByZXZlbnQgdGhlIENMSVAgc3R1ZmYKKworICAgIGZvcihqPTE7IGo8PWRpYV9zaXplLzQ7IGorKyl7CisgICAgICAgIGZvcihpPTA7IGk8MTY7IGkrKyl7CisgICAgICAgICAgICBDSEVDS19DTElQUEVEX01WKHgraGV4W2ldWzBdKmosIHkraGV4W2ldWzFdKmopOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGhleF9zZWFyY2gocywgYmVzdCwgZG1pbiwgc3JjX2luZGV4LCByZWZfaW5kZXgsIHBlbmFsdHlfZmFjdG9yLCBzaXplLCBoLCBmbGFncywgMik7Cit9CisKK3N0YXRpYyBpbnQgZnVsbF9zZWFyY2goTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgKmJlc3QsIGludCBkbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgaW50IGNvbnN0IHBlbmFsdHlfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCBoLCBpbnQgZmxhZ3MpCit7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBtZV9jbXBfZnVuYyBjbXBmLCBjaHJvbWFfY21wZjsKKyAgICBMT0FEX0NPTU1PTgorICAgIExPQURfQ09NTU9OMgorICAgIHVuc2lnbmVkIG1hcF9nZW5lcmF0aW9uID0gYy0+bWFwX2dlbmVyYXRpb247CisgICAgaW50IHgseSwgZDsKKyAgICBjb25zdCBpbnQgZGlhX3NpemU9IGMtPmRpYV9zaXplJjB4RkY7CisKKyAgICBjbXBmICAgICAgICA9IHMtPm1lY2MubWVfY21wW3NpemVdOworICAgIGNocm9tYV9jbXBmID0gcy0+bWVjYy5tZV9jbXBbc2l6ZSArIDFdOworCisgICAgZm9yKHk9RkZNQVgoLWRpYV9zaXplLCB5bWluKTsgeTw9RkZNSU4oZGlhX3NpemUseW1heCk7IHkrKyl7CisgICAgICAgIGZvcih4PUZGTUFYKC1kaWFfc2l6ZSwgeG1pbik7IHg8PUZGTUlOKGRpYV9zaXplLHhtYXgpOyB4KyspeworICAgICAgICAgICAgQ0hFQ0tfTVYoeCwgeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB4PSBiZXN0WzBdOworICAgIHk9IGJlc3RbMV07CisgICAgZD0gZG1pbjsKKyAgICBDSEVDS19DTElQUEVEX01WKHggICwgeSk7CisgICAgQ0hFQ0tfQ0xJUFBFRF9NVih4KzEsIHkpOworICAgIENIRUNLX0NMSVBQRURfTVYoeCwgeSsxKTsKKyAgICBDSEVDS19DTElQUEVEX01WKHgtMSwgeSk7CisgICAgQ0hFQ0tfQ0xJUFBFRF9NVih4LCB5LTEpOworICAgIGJlc3RbMF09IHg7CisgICAgYmVzdFsxXT0geTsKKworICAgIHJldHVybiBkOworfQorCisjZGVmaW5lIFNBQl9DSEVDS19NVihheCxheSlcCit7XAorICAgIGNvbnN0IHVuc2lnbmVkIGtleSA9ICgoYXkpPDxNRV9NQVBfTVZfQklUUykgKyAoYXgpICsgbWFwX2dlbmVyYXRpb247XAorICAgIGNvbnN0IGludCBpbmRleD0gKCgoYXkpPDxNRV9NQVBfU0hJRlQpICsgKGF4KSkmKE1FX01BUF9TSVpFLTEpO1wKKyAgICBpZihtYXBbaW5kZXhdIT1rZXkpe1wKKyAgICAgICAgZD0gY21wKHMsIGF4LCBheSwgMCwgMCwgc2l6ZSwgaCwgcmVmX2luZGV4LCBzcmNfaW5kZXgsIGNtcGYsIGNocm9tYV9jbXBmLCBmbGFncyk7XAorICAgICAgICBtYXBbaW5kZXhdPSBrZXk7XAorICAgICAgICBzY29yZV9tYXBbaW5kZXhdPSBkO1wKKyAgICAgICAgZCArPSAobXZfcGVuYWx0eVsoKGF4KTw8c2hpZnQpLXByZWRfeF0gKyBtdl9wZW5hbHR5WygoYXkpPDxzaGlmdCktcHJlZF95XSkqcGVuYWx0eV9mYWN0b3I7XAorICAgICAgICBpZihkIDwgbWluaW1hW21pbmltYV9jb3VudC0xXS5oZWlnaHQpe1wKKyAgICAgICAgICAgIGludCBqPTA7XAorICAgICAgICAgICAgXAorICAgICAgICAgICAgd2hpbGUoZCA+PSBtaW5pbWFbal0uaGVpZ2h0KSBqKys7XAorXAorICAgICAgICAgICAgbWVtbW92ZSgmbWluaW1hIFtqKzFdLCAmbWluaW1hIFtqXSwgKG1pbmltYV9jb3VudCAtIGogLSAxKSpzaXplb2YoTWluaW1hKSk7XAorXAorICAgICAgICAgICAgbWluaW1hW2pdLmNoZWNrZWQ9IDA7XAorICAgICAgICAgICAgbWluaW1hW2pdLmhlaWdodD0gZDtcCisgICAgICAgICAgICBtaW5pbWFbal0ueD0gYXg7XAorICAgICAgICAgICAgbWluaW1hW2pdLnk9IGF5O1wKKyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGk9LTE7XAorICAgICAgICAgICAgY29udGludWU7XAorICAgICAgICB9XAorICAgIH1cCit9CisKKyNkZWZpbmUgTUFYX1NBQl9TSVpFIE1FX01BUF9TSVpFCitzdGF0aWMgaW50IHNhYl9kaWFtb25kX3NlYXJjaChNcGVnRW5jQ29udGV4dCAqIHMsIGludCAqYmVzdCwgaW50IGRtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LCBpbnQgY29uc3QgcGVuYWx0eV9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGgsIGludCBmbGFncykKK3sKKyAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOworICAgIG1lX2NtcF9mdW5jIGNtcGYsIGNocm9tYV9jbXBmOworICAgIE1pbmltYSBtaW5pbWFbTUFYX1NBQl9TSVpFXTsKKyAgICBjb25zdCBpbnQgbWluaW1hX2NvdW50PSBGRkFCUyhjLT5kaWFfc2l6ZSk7CisgICAgaW50IGksIGo7CisgICAgTE9BRF9DT01NT04KKyAgICBMT0FEX0NPTU1PTjIKKyAgICB1bnNpZ25lZCBtYXBfZ2VuZXJhdGlvbiA9IGMtPm1hcF9nZW5lcmF0aW9uOworCisgICAgYXZfYXNzZXJ0MShtaW5pbWFfY291bnQgPD0gTUFYX1NBQl9TSVpFKTsKKworICAgIGNtcGYgICAgICAgID0gcy0+bWVjYy5tZV9jbXBbc2l6ZV07CisgICAgY2hyb21hX2NtcGYgPSBzLT5tZWNjLm1lX2NtcFtzaXplICsgMV07CisKKyAgICAvKk5vdGUgajxNQVhfU0FCX1NJWkUgaXMgbmVlZGVkIGlmIE1BWF9TQUJfU0laRSA8IE1FX01BUF9TSVpFIGFzIGogY2FuCisgICAgICBiZWNvbWUgbGFyZ2VyIGR1ZSB0byBNVnMgb3ZlcmZsb3dpbmcgdGhlaXIgTUVfTUFQX01WX0JJVFMgYml0cyBzcGFjZSBpbiBtYXAKKyAgICAgKi8KKyAgICBmb3Ioaj1pPTA7IGk8TUVfTUFQX1NJWkUgJiYgajxNQVhfU0FCX1NJWkU7IGkrKyl7CisgICAgICAgIHVpbnQzMl90IGtleT0gbWFwW2ldOworCisgICAgICAgIGtleSArPSAoMTw8KE1FX01BUF9NVl9CSVRTLTEpKSArICgxPDwoMipNRV9NQVBfTVZfQklUUy0xKSk7CisKKyAgICAgICAgaWYoKGtleSYoKC0xKTw8KDIqTUVfTUFQX01WX0JJVFMpKSkgIT0gbWFwX2dlbmVyYXRpb24pIGNvbnRpbnVlOworCisgICAgICAgIG1pbmltYVtqXS5oZWlnaHQ9IHNjb3JlX21hcFtpXTsKKyAgICAgICAgbWluaW1hW2pdLng9IGtleSAmICgoMTw8TUVfTUFQX01WX0JJVFMpLTEpOyBrZXk+Pj1NRV9NQVBfTVZfQklUUzsKKyAgICAgICAgbWluaW1hW2pdLnk9IGtleSAmICgoMTw8TUVfTUFQX01WX0JJVFMpLTEpOworICAgICAgICBtaW5pbWFbal0ueC09ICgxPDwoTUVfTUFQX01WX0JJVFMtMSkpOworICAgICAgICBtaW5pbWFbal0ueS09ICgxPDwoTUVfTUFQX01WX0JJVFMtMSkpOworCisgICAgICAgIC8vIGFsbCBlbnRyaWVzIGluIG1hcCBzaG91bGQgYmUgaW4gcmFuZ2UgZXhjZXB0IGlmIHRoZSBtdiBvdmVyZmxvd3MgdGhlaXIgTUVfTUFQX01WX0JJVFMgYml0cyBzcGFjZQorICAgICAgICBpZiggICBtaW5pbWFbal0ueCA+IHhtYXggfHwgbWluaW1hW2pdLnggPCB4bWluCisgICAgICAgICAgIHx8IG1pbmltYVtqXS55ID4geW1heCB8fCBtaW5pbWFbal0ueSA8IHltaW4pCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBtaW5pbWFbal0uY2hlY2tlZD0wOworICAgICAgICBpZihtaW5pbWFbal0ueCB8fCBtaW5pbWFbal0ueSkKKyAgICAgICAgICAgIG1pbmltYVtqXS5oZWlnaHQrPSAobXZfcGVuYWx0eVsoKG1pbmltYVtqXS54KTw8c2hpZnQpLXByZWRfeF0gKyBtdl9wZW5hbHR5WygobWluaW1hW2pdLnkpPDxzaGlmdCktcHJlZF95XSkqcGVuYWx0eV9mYWN0b3I7CisKKyAgICAgICAgaisrOworICAgIH0KKworICAgIHFzb3J0KG1pbmltYSwgaiwgc2l6ZW9mKE1pbmltYSksIG1pbmltYV9jbXApOworCisgICAgZm9yKDsgajxtaW5pbWFfY291bnQ7IGorKyl7CisgICAgICAgIG1pbmltYVtqXS5oZWlnaHQ9MjU2KjI1NioyNTYqNjQ7CisgICAgICAgIG1pbmltYVtqXS5jaGVja2VkPTA7CisgICAgICAgIG1pbmltYVtqXS54PSBtaW5pbWFbal0ueT0wOworICAgIH0KKworICAgIGZvcihpPTA7IGk8bWluaW1hX2NvdW50OyBpKyspeworICAgICAgICBjb25zdCBpbnQgeD0gbWluaW1hW2ldLng7CisgICAgICAgIGNvbnN0IGludCB5PSBtaW5pbWFbaV0ueTsKKyAgICAgICAgaW50IGQ7CisKKyAgICAgICAgaWYobWluaW1hW2ldLmNoZWNrZWQpIGNvbnRpbnVlOworCisgICAgICAgIGlmKCAgIHggPj0geG1heCB8fCB4IDw9IHhtaW4KKyAgICAgICAgICAgfHwgeSA+PSB5bWF4IHx8IHkgPD0geW1pbikKKyAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgU0FCX0NIRUNLX01WKHgtMSwgeSkKKyAgICAgICAgU0FCX0NIRUNLX01WKHgrMSwgeSkKKyAgICAgICAgU0FCX0NIRUNLX01WKHggICwgeS0xKQorICAgICAgICBTQUJfQ0hFQ0tfTVYoeCAgLCB5KzEpCisKKyAgICAgICAgbWluaW1hW2ldLmNoZWNrZWQ9IDE7CisgICAgfQorCisgICAgYmVzdFswXT0gbWluaW1hWzBdLng7CisgICAgYmVzdFsxXT0gbWluaW1hWzBdLnk7CisgICAgZG1pbj0gbWluaW1hWzBdLmhlaWdodDsKKworICAgIGlmKCAgIGJlc3RbMF0gPCB4bWF4ICYmIGJlc3RbMF0gPiB4bWluCisgICAgICAgJiYgYmVzdFsxXSA8IHltYXggJiYgYmVzdFsxXSA+IHltaW4peworICAgICAgICBpbnQgZDsKKyAgICAgICAgLy9lbnN1cmUgdGhhdCB0aGUgcmVmZXJuZWNlIHNhbXBsZXMgZm9yIGhwZWwgcmVmaW5lbWVudCBhcmUgaW4gdGhlIG1hcAorICAgICAgICBDSEVDS19NVihiZXN0WzBdLTEsIGJlc3RbMV0pCisgICAgICAgIENIRUNLX01WKGJlc3RbMF0rMSwgYmVzdFsxXSkKKyAgICAgICAgQ0hFQ0tfTVYoYmVzdFswXSwgYmVzdFsxXS0xKQorICAgICAgICBDSEVDS19NVihiZXN0WzBdLCBiZXN0WzFdKzEpCisgICAgfQorICAgIHJldHVybiBkbWluOworfQorCitzdGF0aWMgaW50IHZhcl9kaWFtb25kX3NlYXJjaChNcGVnRW5jQ29udGV4dCAqIHMsIGludCAqYmVzdCwgaW50IGRtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LCBpbnQgY29uc3QgcGVuYWx0eV9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGgsIGludCBmbGFncykKK3sKKyAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOworICAgIG1lX2NtcF9mdW5jIGNtcGYsIGNocm9tYV9jbXBmOworICAgIGludCBkaWFfc2l6ZTsKKyAgICBMT0FEX0NPTU1PTgorICAgIExPQURfQ09NTU9OMgorICAgIHVuc2lnbmVkIG1hcF9nZW5lcmF0aW9uID0gYy0+bWFwX2dlbmVyYXRpb247CisKKyAgICBjbXBmICAgICAgICA9IHMtPm1lY2MubWVfY21wW3NpemVdOworICAgIGNocm9tYV9jbXBmID0gcy0+bWVjYy5tZV9jbXBbc2l6ZSArIDFdOworCisgICAgZm9yKGRpYV9zaXplPTE7IGRpYV9zaXplPD1jLT5kaWFfc2l6ZTsgZGlhX3NpemUrKyl7CisgICAgICAgIGludCBkaXIsIHN0YXJ0LCBlbmQ7CisgICAgICAgIGNvbnN0IGludCB4PSBiZXN0WzBdOworICAgICAgICBjb25zdCBpbnQgeT0gYmVzdFsxXTsKKworICAgICAgICBzdGFydD0gRkZNQVgoMCwgeSArIGRpYV9zaXplIC0geW1heCk7CisgICAgICAgIGVuZCAgPSBGRk1JTihkaWFfc2l6ZSwgeG1heCAtIHggKyAxKTsKKyAgICAgICAgZm9yKGRpcj0gc3RhcnQ7IGRpcjxlbmQ7IGRpcisrKXsKKyAgICAgICAgICAgIGludCBkOworCisvL2NoZWNrKHggKyBkaXIseSArIGRpYV9zaXplIC0gZGlyLDAsIGEwKQorICAgICAgICAgICAgQ0hFQ0tfTVYoeCArIGRpciAgICAgICAgICAgLCB5ICsgZGlhX3NpemUgLSBkaXIpOworICAgICAgICB9CisKKyAgICAgICAgc3RhcnQ9IEZGTUFYKDAsIHggKyBkaWFfc2l6ZSAtIHhtYXgpOworICAgICAgICBlbmQgID0gRkZNSU4oZGlhX3NpemUsIHkgLSB5bWluICsgMSk7CisgICAgICAgIGZvcihkaXI9IHN0YXJ0OyBkaXI8ZW5kOyBkaXIrKyl7CisgICAgICAgICAgICBpbnQgZDsKKworLy9jaGVjayh4ICsgZGlhX3NpemUgLSBkaXIsIHkgLSBkaXIsMCwgYTEpCisgICAgICAgICAgICBDSEVDS19NVih4ICsgZGlhX3NpemUgLSBkaXIsIHkgLSBkaXIgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBzdGFydD0gRkZNQVgoMCwgLXkgKyBkaWFfc2l6ZSArIHltaW4gKTsKKyAgICAgICAgZW5kICA9IEZGTUlOKGRpYV9zaXplLCB4IC0geG1pbiArIDEpOworICAgICAgICBmb3IoZGlyPSBzdGFydDsgZGlyPGVuZDsgZGlyKyspeworICAgICAgICAgICAgaW50IGQ7CisKKy8vY2hlY2soeCAtIGRpcix5IC0gZGlhX3NpemUgKyBkaXIsMCwgYTIpCisgICAgICAgICAgICBDSEVDS19NVih4IC0gZGlyICAgICAgICAgICAsIHkgLSBkaWFfc2l6ZSArIGRpcik7CisgICAgICAgIH0KKworICAgICAgICBzdGFydD0gRkZNQVgoMCwgLXggKyBkaWFfc2l6ZSArIHhtaW4gKTsKKyAgICAgICAgZW5kICA9IEZGTUlOKGRpYV9zaXplLCB5bWF4IC0geSArIDEpOworICAgICAgICBmb3IoZGlyPSBzdGFydDsgZGlyPGVuZDsgZGlyKyspeworICAgICAgICAgICAgaW50IGQ7CisKKy8vY2hlY2soeCAtIGRpYV9zaXplICsgZGlyLCB5ICsgZGlyLDAsIGEzKQorICAgICAgICAgICAgQ0hFQ0tfTVYoeCAtIGRpYV9zaXplICsgZGlyLCB5ICsgZGlyICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgaWYoeCE9YmVzdFswXSB8fCB5IT1iZXN0WzFdKQorICAgICAgICAgICAgZGlhX3NpemU9MDsKKyAgICB9CisgICAgcmV0dXJuIGRtaW47Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBkaWFtb25kX3NlYXJjaChNcGVnRW5jQ29udGV4dCAqIHMsIGludCAqYmVzdCwgaW50IGRtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LCBpbnQgY29uc3QgcGVuYWx0eV9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGgsIGludCBmbGFncyl7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBpZihjLT5kaWFfc2l6ZT09LTEpCisgICAgICAgIHJldHVybiBmdW5ueV9kaWFtb25kX3NlYXJjaChzLCBiZXN0LCBkbWluLCBzcmNfaW5kZXgsIHJlZl9pbmRleCwgcGVuYWx0eV9mYWN0b3IsIHNpemUsIGgsIGZsYWdzKTsKKyAgICBlbHNlIGlmKGMtPmRpYV9zaXplPC0xKQorICAgICAgICByZXR1cm4gICBzYWJfZGlhbW9uZF9zZWFyY2gocywgYmVzdCwgZG1pbiwgc3JjX2luZGV4LCByZWZfaW5kZXgsIHBlbmFsdHlfZmFjdG9yLCBzaXplLCBoLCBmbGFncyk7CisgICAgZWxzZSBpZihjLT5kaWFfc2l6ZTwyKQorICAgICAgICByZXR1cm4gc21hbGxfZGlhbW9uZF9zZWFyY2gocywgYmVzdCwgZG1pbiwgc3JjX2luZGV4LCByZWZfaW5kZXgsIHBlbmFsdHlfZmFjdG9yLCBzaXplLCBoLCBmbGFncyk7CisgICAgZWxzZSBpZihjLT5kaWFfc2l6ZT4xMDI0KQorICAgICAgICByZXR1cm4gICAgICAgICAgZnVsbF9zZWFyY2gocywgYmVzdCwgZG1pbiwgc3JjX2luZGV4LCByZWZfaW5kZXgsIHBlbmFsdHlfZmFjdG9yLCBzaXplLCBoLCBmbGFncyk7CisgICAgZWxzZSBpZihjLT5kaWFfc2l6ZT43NjgpCisgICAgICAgIHJldHVybiAgICAgICAgICAgdW1oX3NlYXJjaChzLCBiZXN0LCBkbWluLCBzcmNfaW5kZXgsIHJlZl9pbmRleCwgcGVuYWx0eV9mYWN0b3IsIHNpemUsIGgsIGZsYWdzKTsKKyAgICBlbHNlIGlmKGMtPmRpYV9zaXplPjUxMikKKyAgICAgICAgcmV0dXJuICAgICAgICAgICBoZXhfc2VhcmNoKHMsIGJlc3QsIGRtaW4sIHNyY19pbmRleCwgcmVmX2luZGV4LCBwZW5hbHR5X2ZhY3Rvciwgc2l6ZSwgaCwgZmxhZ3MsIGMtPmRpYV9zaXplJjB4RkYpOworICAgIGVsc2UgaWYoYy0+ZGlhX3NpemU+MjU2KQorICAgICAgICByZXR1cm4gICAgICAgbDJzX2RpYV9zZWFyY2gocywgYmVzdCwgZG1pbiwgc3JjX2luZGV4LCByZWZfaW5kZXgsIHBlbmFsdHlfZmFjdG9yLCBzaXplLCBoLCBmbGFncyk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gICB2YXJfZGlhbW9uZF9zZWFyY2gocywgYmVzdCwgZG1pbiwgc3JjX2luZGV4LCByZWZfaW5kZXgsIHBlbmFsdHlfZmFjdG9yLCBzaXplLCBoLCBmbGFncyk7Cit9CisKKy8qKgorICAgQHBhcmFtIFAgYSBsaXN0IG9mIGNhbmRpZGF0ZSBtdnMgdG8gY2hlY2sgYmVmb3JlIHN0YXJ0aW5nIHRoZQorICAgaXRlcmF0aXZlIHNlYXJjaC4gSWYgb25lIG9mIHRoZSBjYW5kaWRhdGVzIGlzIGNsb3NlIHRvIHRoZSBvcHRpbWFsIG12LCB0aGVuCisgICBpdCB0YWtlcyBmZXdlciBpdGVyYXRpb25zLiBBbmQgaXQgaW5jcmVhc2VzIHRoZSBjaGFuY2UgdGhhdCB3ZSBmaW5kIHRoZQorICAgb3B0aW1hbCBtdi4KKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGVwenNfbW90aW9uX3NlYXJjaF9pbnRlcm5hbChNcGVnRW5jQ29udGV4dCAqIHMsIGludCAqbXhfcHRyLCBpbnQgKm15X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFBbMTBdWzJdLCBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LCBpbnQxNl90ICgqbGFzdF9tdilbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWZfbXZfc2NhbGUsIGludCBmbGFncywgaW50IHNpemUsIGludCBoKQoreworICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CisgICAgaW50IGJlc3RbMl09ezAsIDB9OyAgICAgIC8qKjwgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZS4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9zaXRpb24gb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgY3VycmVudGx5IGJlaW5nIGVuY29kZWQgYW5kIHRoZSBwb3NpdGlvbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBibG9jayBjaG9zZW4gdG8gcHJlZGljdCBpdCBmcm9tLiAqLworICAgIGludCBkOyAgICAgICAgICAgICAgICAgICAvLy88IHRoZSBzY29yZSAoY21wICsgcGVuYWx0eSkgb2YgYW55IGdpdmVuIG12CisgICAgaW50IGRtaW47ICAgICAgICAgICAgICAgIC8qKjwgdGhlIGJlc3QgdmFsdWUgb2YgZCwgaS5lLiB0aGUgc2NvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBtdiBzdG9yZWQgaW4gYmVzdFtdLiAqLworICAgIHVuc2lnbmVkIG1hcF9nZW5lcmF0aW9uOworICAgIGludCBwZW5hbHR5X2ZhY3RvcjsKKyAgICBjb25zdCBpbnQgcmVmX212X3N0cmlkZT0gcy0+bWJfc3RyaWRlOyAvL3Bhc3MgYXMgYXJnICBGSVhNRQorICAgIGNvbnN0IGludCByZWZfbXZfeHk9IHMtPm1iX3ggKyBzLT5tYl95KnJlZl9tdl9zdHJpZGU7IC8vYWRkIHRvIGxhc3RfbXYgYmVmb3JlcGFzc2luZyBGSVhNRQorICAgIG1lX2NtcF9mdW5jIGNtcGYsIGNocm9tYV9jbXBmOworCisgICAgTE9BRF9DT01NT04KKyAgICBMT0FEX0NPTU1PTjIKKworICAgIGlmKGMtPnByZV9wYXNzKXsKKyAgICAgICAgcGVuYWx0eV9mYWN0b3I9IGMtPnByZV9wZW5hbHR5X2ZhY3RvcjsKKyAgICAgICAgY21wZiAgICAgICAgICAgPSBzLT5tZWNjLm1lX3ByZV9jbXBbc2l6ZV07CisgICAgICAgIGNocm9tYV9jbXBmICAgID0gcy0+bWVjYy5tZV9wcmVfY21wW3NpemUgKyAxXTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcGVuYWx0eV9mYWN0b3I9IGMtPnBlbmFsdHlfZmFjdG9yOworICAgICAgICBjbXBmICAgICAgICAgICA9IHMtPm1lY2MubWVfY21wW3NpemVdOworICAgICAgICBjaHJvbWFfY21wZiAgICA9IHMtPm1lY2MubWVfY21wW3NpemUgKyAxXTsKKyAgICB9CisKKyAgICBtYXBfZ2VuZXJhdGlvbj0gdXBkYXRlX21hcF9nZW5lcmF0aW9uKGMpOworCisgICAgYXZfYXNzZXJ0MihjbXBmKTsKKyAgICBkbWluPSBjbXAocywgMCwgMCwgMCwgMCwgc2l6ZSwgaCwgcmVmX2luZGV4LCBzcmNfaW5kZXgsIGNtcGYsIGNocm9tYV9jbXBmLCBmbGFncyk7CisgICAgbWFwWzBdPSBtYXBfZ2VuZXJhdGlvbjsKKyAgICBzY29yZV9tYXBbMF09IGRtaW47CisKKyAgICAvL0ZJWE1FIHByZWNhbGMgZmlyc3QgdGVybSBiZWxvdz8KKyAgICBpZiAoKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiAhKGMtPmZsYWdzICYgRkxBR19ESVJFQ1QpKSB8fAorICAgICAgICBzLT5tcHZfZmxhZ3MgJiBGRl9NUFZfRkxBR19NVjApCisgICAgICAgIGRtaW4gKz0gKG12X3BlbmFsdHlbcHJlZF94XSArIG12X3BlbmFsdHlbcHJlZF95XSkqcGVuYWx0eV9mYWN0b3I7CisKKyAgICAvKiBmaXJzdCBsaW5lICovCisgICAgaWYgKHMtPmZpcnN0X3NsaWNlX2xpbmUpIHsKKyAgICAgICAgQ0hFQ0tfTVYoUF9MRUZUWzBdPj5zaGlmdCwgUF9MRUZUWzFdPj5zaGlmdCkKKyAgICAgICAgQ0hFQ0tfQ0xJUFBFRF9NVigobGFzdF9tdltyZWZfbXZfeHldWzBdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0X212W3JlZl9tdl94eV1bMV0qcmVmX212X3NjYWxlICsgKDE8PDE1KSk+PjE2KQorICAgIH1lbHNleworICAgICAgICBpZihkbWluPCgoaCpoKnMtPmF2Y3R4LT5tdjBfdGhyZXNob2xkKT4+OCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCBQX0xFRlRbMF0gICAgfFBfTEVGVFsxXQorICAgICAgICAgICAgICAgICAgICAgICAgfFBfVE9QWzBdICAgICB8UF9UT1BbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHxQX1RPUFJJR0hUWzBdfFBfVE9QUklHSFRbMV0pPT0wKXsKKyAgICAgICAgICAgICpteF9wdHI9IDA7CisgICAgICAgICAgICAqbXlfcHRyPSAwOworICAgICAgICAgICAgYy0+c2tpcD0xOworICAgICAgICAgICAgcmV0dXJuIGRtaW47CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfTVYoICAgIFBfTUVESUFOWzBdID4+c2hpZnQgLCAgICBQX01FRElBTlsxXSA+PnNoaWZ0KQorICAgICAgICBDSEVDS19DTElQUEVEX01WKChQX01FRElBTlswXT4+c2hpZnQpICAsIChQX01FRElBTlsxXT4+c2hpZnQpLTEpCisgICAgICAgIENIRUNLX0NMSVBQRURfTVYoKFBfTUVESUFOWzBdPj5zaGlmdCkgICwgKFBfTUVESUFOWzFdPj5zaGlmdCkrMSkKKyAgICAgICAgQ0hFQ0tfQ0xJUFBFRF9NVigoUF9NRURJQU5bMF0+PnNoaWZ0KS0xLCAoUF9NRURJQU5bMV0+PnNoaWZ0KSAgKQorICAgICAgICBDSEVDS19DTElQUEVEX01WKChQX01FRElBTlswXT4+c2hpZnQpKzEsIChQX01FRElBTlsxXT4+c2hpZnQpICApCisgICAgICAgIENIRUNLX0NMSVBQRURfTVYoKGxhc3RfbXZbcmVmX212X3h5XVswXSpyZWZfbXZfc2NhbGUgKyAoMTw8MTUpKT4+MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAobGFzdF9tdltyZWZfbXZfeHldWzFdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNikKKyAgICAgICAgQ0hFQ0tfTVYoUF9MRUZUWzBdICAgID4+c2hpZnQsIFBfTEVGVFsxXSAgICA+PnNoaWZ0KQorICAgICAgICBDSEVDS19NVihQX1RPUFswXSAgICAgPj5zaGlmdCwgUF9UT1BbMV0gICAgID4+c2hpZnQpCisgICAgICAgIENIRUNLX01WKFBfVE9QUklHSFRbMF0+PnNoaWZ0LCBQX1RPUFJJR0hUWzFdPj5zaGlmdCkKKyAgICB9CisgICAgaWYoZG1pbj5oKmgqNCl7CisgICAgICAgIGlmKGMtPnByZV9wYXNzKXsKKyAgICAgICAgICAgIENIRUNLX0NMSVBQRURfTVYoKGxhc3RfbXZbcmVmX212X3h5LTFdWzBdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdF9tdltyZWZfbXZfeHktMV1bMV0qcmVmX212X3NjYWxlICsgKDE8PDE1KSk+PjE2KQorICAgICAgICAgICAgaWYoIXMtPmZpcnN0X3NsaWNlX2xpbmUpCisgICAgICAgICAgICAgICAgQ0hFQ0tfQ0xJUFBFRF9NVigobGFzdF9tdltyZWZfbXZfeHktcmVmX212X3N0cmlkZV1bMF0qcmVmX212X3NjYWxlICsgKDE8PDE1KSk+PjE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdF9tdltyZWZfbXZfeHktcmVmX212X3N0cmlkZV1bMV0qcmVmX212X3NjYWxlICsgKDE8PDE1KSk+PjE2KQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIENIRUNLX0NMSVBQRURfTVYoKGxhc3RfbXZbcmVmX212X3h5KzFdWzBdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdF9tdltyZWZfbXZfeHkrMV1bMV0qcmVmX212X3NjYWxlICsgKDE8PDE1KSk+PjE2KQorICAgICAgICAgICAgaWYocy0+bWJfeSsxPHMtPmVuZF9tYl95KSAgLy9GSVhNRSByZXBsYWNlIGF0IGxlYXN0IHdpdGggbGFzdF9zbGljZV9saW5lCisgICAgICAgICAgICAgICAgQ0hFQ0tfQ0xJUFBFRF9NVigobGFzdF9tdltyZWZfbXZfeHkrcmVmX212X3N0cmlkZV1bMF0qcmVmX212X3NjYWxlICsgKDE8PDE1KSk+PjE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdF9tdltyZWZfbXZfeHkrcmVmX212X3N0cmlkZV1bMV0qcmVmX212X3NjYWxlICsgKDE8PDE1KSk+PjE2KQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoYy0+YXZjdHgtPmxhc3RfcHJlZGljdG9yX2NvdW50KXsKKyAgICAgICAgY29uc3QgaW50IGNvdW50PSBjLT5hdmN0eC0+bGFzdF9wcmVkaWN0b3JfY291bnQ7CisgICAgICAgIGNvbnN0IGludCB4c3RhcnQ9IEZGTUFYKDAsIHMtPm1iX3ggLSBjb3VudCk7CisgICAgICAgIGNvbnN0IGludCB5c3RhcnQ9IEZGTUFYKDAsIHMtPm1iX3kgLSBjb3VudCk7CisgICAgICAgIGNvbnN0IGludCB4ZW5kPSBGRk1JTihzLT5tYl93aWR0aCAsIHMtPm1iX3ggKyBjb3VudCArIDEpOworICAgICAgICBjb25zdCBpbnQgeWVuZD0gRkZNSU4ocy0+bWJfaGVpZ2h0LCBzLT5tYl95ICsgY291bnQgKyAxKTsKKyAgICAgICAgaW50IG1iX3k7CisKKyAgICAgICAgZm9yKG1iX3k9eXN0YXJ0OyBtYl95PHllbmQ7IG1iX3krKyl7CisgICAgICAgICAgICBpbnQgbWJfeDsKKyAgICAgICAgICAgIGZvcihtYl94PXhzdGFydDsgbWJfeDx4ZW5kOyBtYl94KyspeworICAgICAgICAgICAgICAgIGNvbnN0IGludCB4eT0gbWJfeCArIDEgKyAobWJfeSArIDEpKnJlZl9tdl9zdHJpZGU7CisgICAgICAgICAgICAgICAgaW50IG14PSAobGFzdF9tdlt4eV1bMF0qcmVmX212X3NjYWxlICsgKDE8PDE1KSk+PjE2OworICAgICAgICAgICAgICAgIGludCBteT0gKGxhc3RfbXZbeHldWzFdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNjsKKworICAgICAgICAgICAgICAgIGlmKG14PnhtYXggfHwgbXg8eG1pbiB8fCBteT55bWF4IHx8IG15PHltaW4pIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIENIRUNLX01WKG14LG15KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisvL2NoZWNrKGJlc3RbMF0sYmVzdFsxXSwwLCBiMCkKKyAgICBkbWluPSBkaWFtb25kX3NlYXJjaChzLCBiZXN0LCBkbWluLCBzcmNfaW5kZXgsIHJlZl9pbmRleCwgcGVuYWx0eV9mYWN0b3IsIHNpemUsIGgsIGZsYWdzKTsKKworLy9jaGVjayhiZXN0WzBdLGJlc3RbMV0sMCwgYjEpCisgICAgKm14X3B0cj0gYmVzdFswXTsKKyAgICAqbXlfcHRyPSBiZXN0WzFdOworCisgICAgcmV0dXJuIGRtaW47Cit9CisKKy8vdGhpcyBmdW5jdGlvbiBpcyBkZWRpY2F0ZWQgdG8gdGhlIGJyYWluZGFtYWdlZCBnY2MKK2ludCBmZl9lcHpzX21vdGlvbl9zZWFyY2goTXBlZ0VuY0NvbnRleHQgKnMsIGludCAqbXhfcHRyLCBpbnQgKm15X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFBbMTBdWzJdLCBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICgqbGFzdF9tdilbMl0sIGludCByZWZfbXZfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaCkKK3sKKyAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOworLy9GSVhNRSBjb252ZXJ0IG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgc2FtZSB3YXkgaWYgZmFzdGVyCisgICAgaWYoYy0+ZmxhZ3M9PTAgJiYgaD09MTYgJiYgc2l6ZT09MCl7CisgICAgICAgIHJldHVybiBlcHpzX21vdGlvbl9zZWFyY2hfaW50ZXJuYWwocywgbXhfcHRyLCBteV9wdHIsIFAsIHNyY19pbmRleCwgcmVmX2luZGV4LCBsYXN0X212LCByZWZfbXZfc2NhbGUsIDAsIDAsIDE2KTsKKy8vICAgIGNhc2UgRkxBR19RUEVMOgorLy8gICAgICAgIHJldHVybiBlcHpzX21vdGlvbl9zZWFyY2hfaW50ZXJuYWwocywgbXhfcHRyLCBteV9wdHIsIFAsIHNyY19pbmRleCwgcmVmX2luZGV4LCBsYXN0X212LCByZWZfbXZfc2NhbGUsIEZMQUdfUVBFTCk7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiBlcHpzX21vdGlvbl9zZWFyY2hfaW50ZXJuYWwocywgbXhfcHRyLCBteV9wdHIsIFAsIHNyY19pbmRleCwgcmVmX2luZGV4LCBsYXN0X212LCByZWZfbXZfc2NhbGUsIGMtPmZsYWdzLCBzaXplLCBoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZXB6c19tb3Rpb25fc2VhcmNoNChNcGVnRW5jQ29udGV4dCAqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbXhfcHRyLCBpbnQgKm15X3B0ciwgaW50IFBbMTBdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LCBpbnQxNl90ICgqbGFzdF9tdilbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWZfbXZfc2NhbGUpCit7CisgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKKyAgICBpbnQgYmVzdFsyXT17MCwgMH07CisgICAgaW50IGQsIGRtaW47CisgICAgdW5zaWduZWQgbWFwX2dlbmVyYXRpb247CisgICAgY29uc3QgaW50IHBlbmFsdHlfZmFjdG9yPSBjLT5wZW5hbHR5X2ZhY3RvcjsKKyAgICBjb25zdCBpbnQgc2l6ZT0xOworICAgIGNvbnN0IGludCBoPTg7CisgICAgY29uc3QgaW50IHJlZl9tdl9zdHJpZGU9IHMtPm1iX3N0cmlkZTsKKyAgICBjb25zdCBpbnQgcmVmX212X3h5PSBzLT5tYl94ICsgcy0+bWJfeSAqcmVmX212X3N0cmlkZTsKKyAgICBtZV9jbXBfZnVuYyBjbXBmLCBjaHJvbWFfY21wZjsKKyAgICBMT0FEX0NPTU1PTgorICAgIGludCBmbGFncz0gYy0+ZmxhZ3M7CisgICAgTE9BRF9DT01NT04yCisKKyAgICBjbXBmICAgICAgICA9IHMtPm1lY2MubWVfY21wW3NpemVdOworICAgIGNocm9tYV9jbXBmID0gcy0+bWVjYy5tZV9jbXBbc2l6ZSArIDFdOworCisgICAgbWFwX2dlbmVyYXRpb249IHVwZGF0ZV9tYXBfZ2VuZXJhdGlvbihjKTsKKworICAgIGRtaW4gPSAxMDAwMDAwOworCisgICAgLyogZmlyc3QgbGluZSAqLworICAgIGlmIChzLT5maXJzdF9zbGljZV9saW5lKSB7CisgICAgICAgIENIRUNLX01WKFBfTEVGVFswXT4+c2hpZnQsIFBfTEVGVFsxXT4+c2hpZnQpCisgICAgICAgIENIRUNLX0NMSVBQRURfTVYoKGxhc3RfbXZbcmVmX212X3h5XVswXSpyZWZfbXZfc2NhbGUgKyAoMTw8MTUpKT4+MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAobGFzdF9tdltyZWZfbXZfeHldWzFdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNikKKyAgICAgICAgQ0hFQ0tfTVYoUF9NVjFbMF0+PnNoaWZ0LCBQX01WMVsxXT4+c2hpZnQpCisgICAgfWVsc2V7CisgICAgICAgIENIRUNLX01WKFBfTVYxWzBdPj5zaGlmdCwgUF9NVjFbMV0+PnNoaWZ0KQorICAgICAgICAvL0ZJWE1FIHRyeSBzb21lIGVhcmx5IHN0b3AKKyAgICAgICAgQ0hFQ0tfTVYoUF9NRURJQU5bMF0+PnNoaWZ0LCBQX01FRElBTlsxXT4+c2hpZnQpCisgICAgICAgIENIRUNLX01WKFBfTEVGVFswXT4+c2hpZnQsIFBfTEVGVFsxXT4+c2hpZnQpCisgICAgICAgIENIRUNLX01WKFBfVE9QWzBdPj5zaGlmdCwgUF9UT1BbMV0+PnNoaWZ0KQorICAgICAgICBDSEVDS19NVihQX1RPUFJJR0hUWzBdPj5zaGlmdCwgUF9UT1BSSUdIVFsxXT4+c2hpZnQpCisgICAgICAgIENIRUNLX0NMSVBQRURfTVYoKGxhc3RfbXZbcmVmX212X3h5XVswXSpyZWZfbXZfc2NhbGUgKyAoMTw8MTUpKT4+MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAobGFzdF9tdltyZWZfbXZfeHldWzFdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNikKKyAgICB9CisgICAgaWYoZG1pbj42NCo0KXsKKyAgICAgICAgQ0hFQ0tfQ0xJUFBFRF9NVigobGFzdF9tdltyZWZfbXZfeHkrMV1bMF0qcmVmX212X3NjYWxlICsgKDE8PDE1KSk+PjE2LAorICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RfbXZbcmVmX212X3h5KzFdWzFdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNikKKyAgICAgICAgaWYocy0+bWJfeSsxPHMtPmVuZF9tYl95KSAgLy9GSVhNRSByZXBsYWNlIGF0IGxlYXN0IHdpdGggbGFzdF9zbGljZV9saW5lCisgICAgICAgICAgICBDSEVDS19DTElQUEVEX01WKChsYXN0X212W3JlZl9tdl94eStyZWZfbXZfc3RyaWRlXVswXSpyZWZfbXZfc2NhbGUgKyAoMTw8MTUpKT4+MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RfbXZbcmVmX212X3h5K3JlZl9tdl9zdHJpZGVdWzFdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNikKKyAgICB9CisKKyAgICBkbWluPSBkaWFtb25kX3NlYXJjaChzLCBiZXN0LCBkbWluLCBzcmNfaW5kZXgsIHJlZl9pbmRleCwgcGVuYWx0eV9mYWN0b3IsIHNpemUsIGgsIGZsYWdzKTsKKworICAgICpteF9wdHI9IGJlc3RbMF07CisgICAgKm15X3B0cj0gYmVzdFsxXTsKKworICAgIHJldHVybiBkbWluOworfQorCisvL3RyeSB0byBtZXJnZSB3aXRoIGFib3ZlIEZJWE1FIChuZWVkcyBQU05SIHRlc3QpCitzdGF0aWMgaW50IGVwenNfbW90aW9uX3NlYXJjaDIoTXBlZ0VuY0NvbnRleHQgKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm14X3B0ciwgaW50ICpteV9wdHIsIGludCBQWzEwXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgaW50MTZfdCAoKmxhc3RfbXYpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVmX212X3NjYWxlKQoreworICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CisgICAgaW50IGJlc3RbMl09ezAsIDB9OworICAgIGludCBkLCBkbWluOworICAgIHVuc2lnbmVkIG1hcF9nZW5lcmF0aW9uOworICAgIGNvbnN0IGludCBwZW5hbHR5X2ZhY3Rvcj0gYy0+cGVuYWx0eV9mYWN0b3I7CisgICAgY29uc3QgaW50IHNpemU9MDsgLy9GSVhNRSBwYXNzIGFzIGFyZworICAgIGNvbnN0IGludCBoPTg7CisgICAgY29uc3QgaW50IHJlZl9tdl9zdHJpZGU9IHMtPm1iX3N0cmlkZTsKKyAgICBjb25zdCBpbnQgcmVmX212X3h5PSBzLT5tYl94ICsgcy0+bWJfeSAqcmVmX212X3N0cmlkZTsKKyAgICBtZV9jbXBfZnVuYyBjbXBmLCBjaHJvbWFfY21wZjsKKyAgICBMT0FEX0NPTU1PTgorICAgIGludCBmbGFncz0gYy0+ZmxhZ3M7CisgICAgTE9BRF9DT01NT04yCisKKyAgICBjbXBmICAgICAgICA9IHMtPm1lY2MubWVfY21wW3NpemVdOworICAgIGNocm9tYV9jbXBmID0gcy0+bWVjYy5tZV9jbXBbc2l6ZSArIDFdOworCisgICAgbWFwX2dlbmVyYXRpb249IHVwZGF0ZV9tYXBfZ2VuZXJhdGlvbihjKTsKKworICAgIGRtaW4gPSAxMDAwMDAwOworCisgICAgLyogZmlyc3QgbGluZSAqLworICAgIGlmIChzLT5maXJzdF9zbGljZV9saW5lKSB7CisgICAgICAgIENIRUNLX01WKFBfTEVGVFswXT4+c2hpZnQsIFBfTEVGVFsxXT4+c2hpZnQpCisgICAgICAgIENIRUNLX0NMSVBQRURfTVYoKGxhc3RfbXZbcmVmX212X3h5XVswXSpyZWZfbXZfc2NhbGUgKyAoMTw8MTUpKT4+MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAobGFzdF9tdltyZWZfbXZfeHldWzFdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNikKKyAgICAgICAgQ0hFQ0tfTVYoUF9NVjFbMF0+PnNoaWZ0LCBQX01WMVsxXT4+c2hpZnQpCisgICAgfWVsc2V7CisgICAgICAgIENIRUNLX01WKFBfTVYxWzBdPj5zaGlmdCwgUF9NVjFbMV0+PnNoaWZ0KQorICAgICAgICAvL0ZJWE1FIHRyeSBzb21lIGVhcmx5IHN0b3AKKyAgICAgICAgQ0hFQ0tfTVYoUF9NRURJQU5bMF0+PnNoaWZ0LCBQX01FRElBTlsxXT4+c2hpZnQpCisgICAgICAgIENIRUNLX01WKFBfTEVGVFswXT4+c2hpZnQsIFBfTEVGVFsxXT4+c2hpZnQpCisgICAgICAgIENIRUNLX01WKFBfVE9QWzBdPj5zaGlmdCwgUF9UT1BbMV0+PnNoaWZ0KQorICAgICAgICBDSEVDS19NVihQX1RPUFJJR0hUWzBdPj5zaGlmdCwgUF9UT1BSSUdIVFsxXT4+c2hpZnQpCisgICAgICAgIENIRUNLX0NMSVBQRURfTVYoKGxhc3RfbXZbcmVmX212X3h5XVswXSpyZWZfbXZfc2NhbGUgKyAoMTw8MTUpKT4+MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAobGFzdF9tdltyZWZfbXZfeHldWzFdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNikKKyAgICB9CisgICAgaWYoZG1pbj42NCo0KXsKKyAgICAgICAgQ0hFQ0tfQ0xJUFBFRF9NVigobGFzdF9tdltyZWZfbXZfeHkrMV1bMF0qcmVmX212X3NjYWxlICsgKDE8PDE1KSk+PjE2LAorICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RfbXZbcmVmX212X3h5KzFdWzFdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNikKKyAgICAgICAgaWYocy0+bWJfeSsxPHMtPmVuZF9tYl95KSAgLy9GSVhNRSByZXBsYWNlIGF0IGxlYXN0IHdpdGggbGFzdF9zbGljZV9saW5lCisgICAgICAgICAgICBDSEVDS19DTElQUEVEX01WKChsYXN0X212W3JlZl9tdl94eStyZWZfbXZfc3RyaWRlXVswXSpyZWZfbXZfc2NhbGUgKyAoMTw8MTUpKT4+MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RfbXZbcmVmX212X3h5K3JlZl9tdl9zdHJpZGVdWzFdKnJlZl9tdl9zY2FsZSArICgxPDwxNSkpPj4xNikKKyAgICB9CisKKyAgICBkbWluPSBkaWFtb25kX3NlYXJjaChzLCBiZXN0LCBkbWluLCBzcmNfaW5kZXgsIHJlZl9pbmRleCwgcGVuYWx0eV9mYWN0b3IsIHNpemUsIGgsIGZsYWdzKTsKKworICAgICpteF9wdHI9IGJlc3RbMF07CisgICAgKm15X3B0cj0gYmVzdFsxXTsKKworICAgIHJldHVybiBkbWluOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbW90aW9ucGl4ZWxzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tb3Rpb25waXhlbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWRhMTBhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbW90aW9ucGl4ZWxzLmMKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiBNb3Rpb24gUGl4ZWxzIFZpZGVvIERlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCBHcmVnb3J5IE1vbnRvaXIgKGN5eEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJic3dhcGRzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTUFYX0hVRkZfQ09ERVMgMTYKKworI2luY2x1ZGUgIm1vdGlvbnBpeGVsc190YWJsZWdlbi5oIgorCit0eXBlZGVmIHN0cnVjdCBIdWZmQ29kZSB7CisgICAgaW50IGNvZGU7CisgICAgdWludDhfdCBzaXplOworICAgIHVpbnQ4X3QgZGVsdGE7Cit9IEh1ZmZDb2RlOworCit0eXBlZGVmIHN0cnVjdCBNb3Rpb25QaXhlbHNDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgQnN3YXBEU1BDb250ZXh0IGJkc3A7CisgICAgdWludDhfdCAqY2hhbmdlc19tYXA7CisgICAgaW50IG9mZnNldF9iaXRzX2xlbjsKKyAgICBpbnQgY29kZXNfY291bnQsIGN1cnJlbnRfY29kZXNfY291bnQ7CisgICAgaW50IG1heF9jb2Rlc19iaXRzOworICAgIEh1ZmZDb2RlIGNvZGVzW01BWF9IVUZGX0NPREVTXTsKKyAgICBWTEMgdmxjOworICAgIFl1dlBpeGVsICp2cHQsICpocHQ7CisgICAgdWludDhfdCBncmFkaWVudF9zY2FsZVszXTsKKyAgICB1aW50OF90ICpic3dhcGJ1ZjsKKyAgICBpbnQgYnN3YXBidWZfc2l6ZTsKK30gTW90aW9uUGl4ZWxzQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IG1wX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1vdGlvblBpeGVsc0NvbnRleHQgKm1wID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZtcC0+Y2hhbmdlc19tYXApOworICAgIGF2X2ZyZWVwKCZtcC0+dnB0KTsKKyAgICBhdl9mcmVlcCgmbXAtPmhwdCk7CisgICAgYXZfZnJlZXAoJm1wLT5ic3dhcGJ1Zik7CisgICAgYXZfZnJhbWVfZnJlZSgmbXAtPmZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbXBfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1vdGlvblBpeGVsc0NvbnRleHQgKm1wID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgdzQgPSAoYXZjdHgtPndpZHRoICArIDMpICYgfjM7CisgICAgaW50IGg0ID0gKGF2Y3R4LT5oZWlnaHQgKyAzKSAmIH4zOworCisgICAgaWYoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMil7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXh0cmFkYXRhIHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIG1vdGlvbnBpeGVsc190YWJsZWluaXQoKTsKKyAgICBtcC0+YXZjdHggPSBhdmN0eDsKKyAgICBmZl9ic3dhcGRzcF9pbml0KCZtcC0+YmRzcCk7CisgICAgbXAtPmNoYW5nZXNfbWFwID0gYXZfbWFsbG9jel9hcnJheShhdmN0eC0+d2lkdGgsIGg0KTsKKyAgICBtcC0+b2Zmc2V0X2JpdHNfbGVuID0gYXZfbG9nMihhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0KSArIDE7CisgICAgbXAtPnZwdCA9IGF2X21hbGxvY3pfYXJyYXkoYXZjdHgtPmhlaWdodCwgc2l6ZW9mKFl1dlBpeGVsKSk7CisgICAgbXAtPmhwdCA9IGF2X21hbGxvY3pfYXJyYXkoaDQgLyA0LCB3NCAvIDQgKiBzaXplb2YoWXV2UGl4ZWwpKTsKKyAgICBpZiAoIW1wLT5jaGFuZ2VzX21hcCB8fCAhbXAtPnZwdCB8fCAhbXAtPmhwdCkgeworICAgICAgICBhdl9mcmVlcCgmbXAtPmNoYW5nZXNfbWFwKTsKKyAgICAgICAgYXZfZnJlZXAoJm1wLT52cHQpOworICAgICAgICBhdl9mcmVlcCgmbXAtPmhwdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTU7CisKKyAgICBtcC0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghbXAtPmZyYW1lKSB7CisgICAgICAgIG1wX2RlY29kZV9lbmQoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtcF9yZWFkX2NoYW5nZXNfbWFwKE1vdGlvblBpeGVsc0NvbnRleHQgKm1wLCBHZXRCaXRDb250ZXh0ICpnYiwgaW50IGNvdW50LCBpbnQgYml0c19sZW4sIGludCByZWFkX2NvbG9yKQoreworICAgIHVpbnQxNl90ICpwaXhlbHM7CisgICAgaW50IG9mZnNldCwgdywgaCwgY29sb3IgPSAwLCB4LCB5LCBpOworCisgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgb2Zmc2V0ID0gZ2V0X2JpdHNfbG9uZyhnYiwgbXAtPm9mZnNldF9iaXRzX2xlbik7CisgICAgICAgIHcgICAgICA9IGdldF9iaXRzKGdiLCBiaXRzX2xlbikgKyAxOworICAgICAgICBoICAgICAgPSBnZXRfYml0cyhnYiwgYml0c19sZW4pICsgMTsKKyAgICAgICAgaWYgKHJlYWRfY29sb3IpCisgICAgICAgICAgICBjb2xvciA9IGdldF9iaXRzKGdiLCAxNSk7CisgICAgICAgIHggPSBvZmZzZXQgJSBtcC0+YXZjdHgtPndpZHRoOworICAgICAgICB5ID0gb2Zmc2V0IC8gbXAtPmF2Y3R4LT53aWR0aDsKKyAgICAgICAgaWYgKHkgPj0gbXAtPmF2Y3R4LT5oZWlnaHQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdyA9IEZGTUlOKHcsIG1wLT5hdmN0eC0+d2lkdGggIC0geCk7CisgICAgICAgIGggPSBGRk1JTihoLCBtcC0+YXZjdHgtPmhlaWdodCAtIHkpOworICAgICAgICBwaXhlbHMgPSAodWludDE2X3QgKikmbXAtPmZyYW1lLT5kYXRhWzBdW3kgKiBtcC0+ZnJhbWUtPmxpbmVzaXplWzBdICsgeCAqIDJdOworICAgICAgICB3aGlsZSAoaC0tKSB7CisgICAgICAgICAgICBtcC0+Y2hhbmdlc19tYXBbb2Zmc2V0XSA9IHc7CisgICAgICAgICAgICBpZiAocmVhZF9jb2xvcikKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgKytpKQorICAgICAgICAgICAgICAgICAgICBwaXhlbHNbaV0gPSBjb2xvcjsKKyAgICAgICAgICAgIG9mZnNldCArPSBtcC0+YXZjdHgtPndpZHRoOworICAgICAgICAgICAgcGl4ZWxzICs9IG1wLT5mcmFtZS0+bGluZXNpemVbMF0gLyAyOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IG1wX2dldF9jb2RlKE1vdGlvblBpeGVsc0NvbnRleHQgKm1wLCBHZXRCaXRDb250ZXh0ICpnYiwgaW50IHNpemUsIGludCBjb2RlKQoreworICAgIHdoaWxlIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICsrc2l6ZTsKKyAgICAgICAgaWYgKHNpemUgPiBtcC0+bWF4X2NvZGVzX2JpdHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhtcC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgY29kZSBzaXplICVkLyVkXG4iLCBzaXplLCBtcC0+bWF4X2NvZGVzX2JpdHMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgY29kZSA8PD0gMTsKKyAgICAgICAgaWYgKG1wX2dldF9jb2RlKG1wLCBnYiwgc2l6ZSwgY29kZSArIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAobXAtPmN1cnJlbnRfY29kZXNfY291bnQgPj0gTUFYX0hVRkZfQ09ERVMpIHsKKyAgICAgICAgYXZfbG9nKG1wLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIG1hbnkgY29kZXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBtcC0+Y29kZXNbbXAtPmN1cnJlbnRfY29kZXNfY291bnQgIF0uY29kZSA9IGNvZGU7CisgICAgbXAtPmNvZGVzW21wLT5jdXJyZW50X2NvZGVzX2NvdW50KytdLnNpemUgPSBzaXplOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wX3JlYWRfY29kZXNfdGFibGUoTW90aW9uUGl4ZWxzQ29udGV4dCAqbXAsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGlmIChtcC0+Y29kZXNfY291bnQgPT0gMSkgeworICAgICAgICBtcC0+Y29kZXNbMF0uZGVsdGEgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgbXAtPm1heF9jb2Rlc19iaXRzID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXAtPmNvZGVzX2NvdW50OyArK2kpCisgICAgICAgICAgICBtcC0+Y29kZXNbaV0uZGVsdGEgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgIG1wLT5jdXJyZW50X2NvZGVzX2NvdW50ID0gMDsKKyAgICAgICAgaWYgKChyZXQgPSBtcF9nZXRfY29kZShtcCwgZ2IsIDAsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAobXAtPmN1cnJlbnRfY29kZXNfY291bnQgPCBtcC0+Y29kZXNfY291bnQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhtcC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInRvbyBmZXcgY29kZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgIH0KKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wX2dyYWRpZW50KE1vdGlvblBpeGVsc0NvbnRleHQgKm1wLCBpbnQgY29tcG9uZW50LCBpbnQgdikKK3sKKyAgICBpbnQgZGVsdGE7CisKKyAgICBkZWx0YSA9ICh2IC0gNykgKiBtcC0+Z3JhZGllbnRfc2NhbGVbY29tcG9uZW50XTsKKyAgICBtcC0+Z3JhZGllbnRfc2NhbGVbY29tcG9uZW50XSA9ICh2ID09IDAgfHwgdiA9PSAxNCkgPyAyIDogMTsKKyAgICByZXR1cm4gZGVsdGE7Cit9CisKK3N0YXRpYyBZdXZQaXhlbCBtcF9nZXRfeXV2X2Zyb21fcmdiKE1vdGlvblBpeGVsc0NvbnRleHQgKm1wLCBpbnQgeCwgaW50IHkpCit7CisgICAgaW50IGNvbG9yOworCisgICAgY29sb3IgPSAqKHVpbnQxNl90ICopJm1wLT5mcmFtZS0+ZGF0YVswXVt5ICogbXAtPmZyYW1lLT5saW5lc2l6ZVswXSArIHggKiAyXTsKKyAgICByZXR1cm4gbXBfcmdiX3l1dl90YWJsZVtjb2xvcl07Cit9CisKK3N0YXRpYyB2b2lkIG1wX3NldF9yZ2JfZnJvbV95dXYoTW90aW9uUGl4ZWxzQ29udGV4dCAqbXAsIGludCB4LCBpbnQgeSwgY29uc3QgWXV2UGl4ZWwgKnApCit7CisgICAgaW50IGNvbG9yOworCisgICAgY29sb3IgPSBtcF95dXZfdG9fcmdiKHAtPnksIHAtPnYsIHAtPnUsIDEpOworICAgICoodWludDE2X3QgKikmbXAtPmZyYW1lLT5kYXRhWzBdW3kgKiBtcC0+ZnJhbWUtPmxpbmVzaXplWzBdICsgeCAqIDJdID0gY29sb3I7Cit9CisKK3N0YXRpYyBpbnQgbXBfZ2V0X3ZsYyhNb3Rpb25QaXhlbHNDb250ZXh0ICptcCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IGk7CisKKyAgICBpID0gKG1wLT5jb2Rlc19jb3VudCA9PSAxKSA/IDAgOiBnZXRfdmxjMihnYiwgbXAtPnZsYy50YWJsZSwgbXAtPm1heF9jb2Rlc19iaXRzLCAxKTsKKyAgICByZXR1cm4gbXAtPmNvZGVzW2ldLmRlbHRhOworfQorCitzdGF0aWMgdm9pZCBtcF9kZWNvZGVfbGluZShNb3Rpb25QaXhlbHNDb250ZXh0ICptcCwgR2V0Qml0Q29udGV4dCAqZ2IsIGludCB5KQoreworICAgIFl1dlBpeGVsIHA7CisgICAgY29uc3QgaW50IHkwID0geSAqIG1wLT5hdmN0eC0+d2lkdGg7CisgICAgaW50IHcsIGksIHggPSAwOworCisgICAgcCA9IG1wLT52cHRbeV07CisgICAgaWYgKG1wLT5jaGFuZ2VzX21hcFt5MCArIHhdID09IDApIHsKKyAgICAgICAgbWVtc2V0KG1wLT5ncmFkaWVudF9zY2FsZSwgMSwgc2l6ZW9mKG1wLT5ncmFkaWVudF9zY2FsZSkpOworICAgICAgICArK3g7CisgICAgfQorICAgIHdoaWxlICh4IDwgbXAtPmF2Y3R4LT53aWR0aCkgeworICAgICAgICB3ID0gbXAtPmNoYW5nZXNfbWFwW3kwICsgeF07CisgICAgICAgIGlmICh3ICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoeSAmIDMpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobXAtPmNoYW5nZXNfbWFwW3kwICsgeCArIG1wLT5hdmN0eC0+d2lkdGhdIDwgdyB8fAorICAgICAgICAgICAgICAgICAgICBtcC0+Y2hhbmdlc19tYXBbeTAgKyB4ICsgbXAtPmF2Y3R4LT53aWR0aCAqIDJdIDwgdyB8fAorICAgICAgICAgICAgICAgICAgICBtcC0+Y2hhbmdlc19tYXBbeTAgKyB4ICsgbXAtPmF2Y3R4LT53aWR0aCAqIDNdIDwgdykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAoeCArIDMpICYgfjM7IGkgPCB4ICsgdzsgaSArPSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcC0+aHB0WygoeSAvIDQpICogbXAtPmF2Y3R4LT53aWR0aCArIGkpIC8gNF0gPSBtcF9nZXRfeXV2X2Zyb21fcmdiKG1wLCBpLCB5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHggKz0gdzsKKyAgICAgICAgICAgIG1lbXNldChtcC0+Z3JhZGllbnRfc2NhbGUsIDEsIHNpemVvZihtcC0+Z3JhZGllbnRfc2NhbGUpKTsKKyAgICAgICAgICAgIHAgPSBtcF9nZXRfeXV2X2Zyb21fcmdiKG1wLCB4IC0gMSwgeSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwLnkgKz0gbXBfZ3JhZGllbnQobXAsIDAsIG1wX2dldF92bGMobXAsIGdiKSk7CisgICAgICAgICAgICBwLnkgPSBhdl9jbGlwKHAueSwgMCwgMzEpOworICAgICAgICAgICAgaWYgKCh4ICYgMykgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgoeSAmIDMpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcC52ICs9IG1wX2dyYWRpZW50KG1wLCAxLCBtcF9nZXRfdmxjKG1wLCBnYikpOworICAgICAgICAgICAgICAgICAgICBwLnYgPSBhdl9jbGlwKHAudiwgLTMyLCAzMSk7CisgICAgICAgICAgICAgICAgICAgIHAudSArPSBtcF9ncmFkaWVudChtcCwgMiwgbXBfZ2V0X3ZsYyhtcCwgZ2IpKTsKKyAgICAgICAgICAgICAgICAgICAgcC51ID0gYXZfY2xpcChwLnUsIC0zMiwgMzEpOworICAgICAgICAgICAgICAgICAgICBtcC0+aHB0WygoeSAvIDQpICogbXAtPmF2Y3R4LT53aWR0aCArIHgpIC8gNF0gPSBwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHAudiA9IG1wLT5ocHRbKCh5IC8gNCkgKiBtcC0+YXZjdHgtPndpZHRoICsgeCkgLyA0XS52OworICAgICAgICAgICAgICAgICAgICBwLnUgPSBtcC0+aHB0WygoeSAvIDQpICogbXAtPmF2Y3R4LT53aWR0aCArIHgpIC8gNF0udTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtcF9zZXRfcmdiX2Zyb21feXV2KG1wLCB4LCB5LCAmcCk7CisgICAgICAgICAgICArK3g7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1wX2RlY29kZV9mcmFtZV9oZWxwZXIoTW90aW9uUGl4ZWxzQ29udGV4dCAqbXAsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIFl1dlBpeGVsIHA7CisgICAgaW50IHksIHkwOworCisgICAgYXZfYXNzZXJ0MShtcC0+Y2hhbmdlc19tYXBbMF0pOworCisgICAgZm9yICh5ID0gMDsgeSA8IG1wLT5hdmN0eC0+aGVpZ2h0OyArK3kpIHsKKyAgICAgICAgaWYgKG1wLT5jaGFuZ2VzX21hcFt5ICogbXAtPmF2Y3R4LT53aWR0aF0gIT0gMCkgeworICAgICAgICAgICAgbWVtc2V0KG1wLT5ncmFkaWVudF9zY2FsZSwgMSwgc2l6ZW9mKG1wLT5ncmFkaWVudF9zY2FsZSkpOworICAgICAgICAgICAgcCA9IG1wX2dldF95dXZfZnJvbV9yZ2IobXAsIDAsIHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcC55ICs9IG1wX2dyYWRpZW50KG1wLCAwLCBtcF9nZXRfdmxjKG1wLCBnYikpOworICAgICAgICAgICAgcC55ID0gYXZfY2xpcChwLnksIDAsIDMxKTsKKyAgICAgICAgICAgIGlmICgoeSAmIDMpID09IDApIHsKKyAgICAgICAgICAgICAgICBwLnYgKz0gbXBfZ3JhZGllbnQobXAsIDEsIG1wX2dldF92bGMobXAsIGdiKSk7CisgICAgICAgICAgICAgICAgcC52ID0gYXZfY2xpcChwLnYsIC0zMiwgMzEpOworICAgICAgICAgICAgICAgIHAudSArPSBtcF9ncmFkaWVudChtcCwgMiwgbXBfZ2V0X3ZsYyhtcCwgZ2IpKTsKKyAgICAgICAgICAgICAgICBwLnUgPSBhdl9jbGlwKHAudSwgLTMyLCAzMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtcC0+dnB0W3ldID0gcDsKKyAgICAgICAgICAgIG1wX3NldF9yZ2JfZnJvbV95dXYobXAsIDAsIHksICZwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHkwID0gMDsgeTAgPCAyOyArK3kwKQorICAgICAgICBmb3IgKHkgPSB5MDsgeSA8IG1wLT5hdmN0eC0+aGVpZ2h0OyB5ICs9IDIpCisgICAgICAgICAgICBtcF9kZWNvZGVfbGluZShtcCwgZ2IsIHkpOworfQorCitzdGF0aWMgaW50IG1wX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBNb3Rpb25QaXhlbHNDb250ZXh0ICptcCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgaSwgY291bnQxLCBjb3VudDIsIHN6LCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgbXAtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogbGUzMiBiaXRzdHJlYW0gbXNiIGZpcnN0ICovCisgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZtcC0+YnN3YXBidWYsICZtcC0+YnN3YXBidWZfc2l6ZSwgYnVmX3NpemUpOworICAgIGlmICghbXAtPmJzd2FwYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG1wLT5iZHNwLmJzd2FwX2J1ZigodWludDMyX3QgKikgbXAtPmJzd2FwYnVmLCAoY29uc3QgdWludDMyX3QgKikgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSAvIDQpOworICAgIGlmIChidWZfc2l6ZSAmIDMpCisgICAgICAgIG1lbWNweShtcC0+YnN3YXBidWYgKyAoYnVmX3NpemUgJiB+MyksIGJ1ZiArIChidWZfc2l6ZSAmIH4zKSwgYnVmX3NpemUgJiAzKTsKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgbXAtPmJzd2FwYnVmLCBidWZfc2l6ZSAqIDgpOworCisgICAgbWVtc2V0KG1wLT5jaGFuZ2VzX21hcCwgMCwgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCk7CisgICAgZm9yIChpID0gIShhdmN0eC0+ZXh0cmFkYXRhWzFdICYgMik7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgY291bnQxID0gZ2V0X2JpdHMoJmdiLCAxMik7CisgICAgICAgIGNvdW50MiA9IGdldF9iaXRzKCZnYiwgMTIpOworICAgICAgICBtcF9yZWFkX2NoYW5nZXNfbWFwKG1wLCAmZ2IsIGNvdW50MSwgOCwgaSk7CisgICAgICAgIG1wX3JlYWRfY2hhbmdlc19tYXAobXAsICZnYiwgY291bnQyLCA0LCBpKTsKKyAgICB9CisKKyAgICBtcC0+Y29kZXNfY291bnQgPSBnZXRfYml0cygmZ2IsIDQpOworICAgIGlmIChtcC0+Y29kZXNfY291bnQgPT0gMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBpZiAobXAtPmNoYW5nZXNfbWFwWzBdID09IDApIHsKKyAgICAgICAgKih1aW50MTZfdCAqKW1wLT5mcmFtZS0+ZGF0YVswXSA9IGdldF9iaXRzKCZnYiwgMTUpOworICAgICAgICBtcC0+Y2hhbmdlc19tYXBbMF0gPSAxOworICAgIH0KKyAgICBpZiAobXBfcmVhZF9jb2Rlc190YWJsZShtcCwgJmdiKSA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgc3ogPSBnZXRfYml0cygmZ2IsIDE4KTsKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YVswXSAhPSA1KQorICAgICAgICBzeiArPSBnZXRfYml0cygmZ2IsIDE4KTsKKyAgICBpZiAoc3ogPT0gMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBpZiAobXAtPm1heF9jb2Rlc19iaXRzIDw9IDApCisgICAgICAgIGdvdG8gZW5kOworICAgIGlmIChpbml0X3ZsYygmbXAtPnZsYywgbXAtPm1heF9jb2Rlc19iaXRzLCBtcC0+Y29kZXNfY291bnQsICZtcC0+Y29kZXNbMF0uc2l6ZSwgc2l6ZW9mKEh1ZmZDb2RlKSwgMSwgJm1wLT5jb2Rlc1swXS5jb2RlLCBzaXplb2YoSHVmZkNvZGUpLCA0LCAwKSkKKyAgICAgICAgZ290byBlbmQ7CisgICAgbXBfZGVjb2RlX2ZyYW1lX2hlbHBlcihtcCwgJmdiKTsKKyAgICBmZl9mcmVlX3ZsYygmbXAtPnZsYyk7CisKK2VuZDoKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBtcC0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgKmdvdF9mcmFtZSAgICAgICA9IDE7CisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitBVkNvZGVjIGZmX21vdGlvbnBpeGVsc19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtb3Rpb25waXhlbHMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNb3Rpb24gUGl4ZWxzIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01PVElPTlBJWEVMUywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTW90aW9uUGl4ZWxzQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbXBfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gbXBfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBtcF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tb3Rpb25waXhlbHNfdGFibGVnZW4uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21vdGlvbnBpeGVsc190YWJsZWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjdiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tb3Rpb25waXhlbHNfdGFibGVnZW4uYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogR2VuZXJhdGUgYSBoZWFkZXIgZmlsZSBmb3IgaGFyZGNvZGVkIG1vdGlvbnBpeGVscyBSR0IgdG8gWVVWIHRhYmxlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMgMAorI2RlZmluZSBNQVhfTkVHX0NST1AgMAorI2RlZmluZSBmZl9jcm9wX3RhYiAoKHVpbnQ4X3QgKilOVUxMKQorI2luY2x1ZGUgIm1vdGlvbnBpeGVsc190YWJsZWdlbi5oIgorI2luY2x1ZGUgInRhYmxlcHJpbnQuaCIKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBtb3Rpb25waXhlbHNfdGFibGVpbml0KCk7CisKKyAgICB3cml0ZV9maWxlaGVhZGVyKCk7CisKKyAgICBwcmludGYoInN0YXRpYyBjb25zdCBZdXZQaXhlbCBtcF9yZ2JfeXV2X3RhYmxlWzEgPDwgMTVdID0ge1xuIik7CisgICAgd3JpdGVfaW50OF90XzJkX2FycmF5KG1wX3JnYl95dXZfdGFibGUsIDEgPDwgMTUsIDMpOworICAgIHByaW50ZigifTtcbiIpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tb3Rpb25waXhlbHNfdGFibGVnZW4uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21vdGlvbnBpeGVsc190YWJsZWdlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZmU3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tb3Rpb25waXhlbHNfdGFibGVnZW4uaApAQCAtMCwwICsxLDkyIEBACisvKgorICogSGVhZGVyIGZpbGUgZm9yIGhhcmRjb2RlZCBtb3Rpb25waXhlbHMgUkdCIHRvIFlVViB0YWJsZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBSZWltYXIgRMO2ZmZpbmdlciA8UmVpbWFyLkRvZWZmaW5nZXJAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTU9USU9OUElYRUxTX1RBQkxFR0VOX0gKKyNkZWZpbmUgQVZDT0RFQ19NT1RJT05QSVhFTFNfVEFCTEVHRU5fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgWXV2UGl4ZWwgeworICAgIGludDhfdCB5LCB2LCB1OworfSBZdXZQaXhlbDsKKworc3RhdGljIGludCBtcF95dXZfdG9fcmdiKGludCB5LCBpbnQgdiwgaW50IHUsIGludCBjbGlwX3JnYikgeworICAgIGNvbnN0IHVpbnQ4X3QgKmNtID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IHIsIGcsIGI7CisKKyAgICByID0gKDEwMDAgKiB5ICsgNzAxICogdikgLyAxMDAwOworICAgIGcgPSAoMTAwMCAqIHkgLSAzNTcgKiB2IC0gMTcyICogdSkgLyAxMDAwOworICAgIGIgPSAoMTAwMCAqIHkgKyA4ODYgKiB1KSAvIDEwMDA7CisgICAgaWYgKGNsaXBfcmdiKQorICAgICAgICByZXR1cm4gKChjbVtyICogOF0gJiAweEY4KSA8PCA3KSB8ICgoY21bZyAqIDhdICYgMHhGOCkgPDwgMikgfCAoY21bYiAqIDhdID4+IDMpOworICAgIGlmICgodW5zaWduZWQpciA8IDMyICYmICh1bnNpZ25lZClnIDwgMzIgJiYgKHVuc2lnbmVkKWIgPCAzMikKKyAgICAgICAgcmV0dXJuIChyIDw8IDEwKSB8IChnIDw8IDUpIHwgYjsKKyAgICByZXR1cm4gMSA8PCAxNTsKK30KKworI2lmIENPTkZJR19IQVJEQ09ERURfVEFCTEVTCisjZGVmaW5lIG1vdGlvbnBpeGVsc190YWJsZWluaXQoKQorI2luY2x1ZGUgImxpYmF2Y29kZWMvbW90aW9ucGl4ZWxzX3RhYmxlcy5oIgorI2Vsc2UKK3N0YXRpYyBZdXZQaXhlbCBtcF9yZ2JfeXV2X3RhYmxlWzEgPDwgMTVdOworCitzdGF0aWMgYXZfY29sZCB2b2lkIG1wX3NldF96ZXJvX3l1dihZdXZQaXhlbCAqcCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzMTsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IDMxOyBqID4gaTsgLS1qKQorICAgICAgICAgICAgaWYgKCEocFtqXS51IHwgcFtqXS52IHwgcFtqXS55KSkKKyAgICAgICAgICAgICAgICBwW2pdID0gcFtqIC0gMV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAzMSAtIGk7ICsraikKKyAgICAgICAgICAgIGlmICghKHBbal0udSB8IHBbal0udiB8IHBbal0ueSkpCisgICAgICAgICAgICAgICAgcFtqXSA9IHBbaiArIDFdOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBtcF9idWlsZF9yZ2JfeXV2X3RhYmxlKFl1dlBpeGVsICpwKQoreworICAgIGludCB5LCB2LCB1LCBpOworCisgICAgZm9yICh5ID0gMDsgeSA8PSAzMTsgKyt5KQorICAgICAgICBmb3IgKHYgPSAtMzE7IHYgPD0gMzE7ICsrdikKKyAgICAgICAgICAgIGZvciAodSA9IC0zMTsgdSA8PSAzMTsgKyt1KSB7CisgICAgICAgICAgICAgICAgaSA9IG1wX3l1dl90b19yZ2IoeSwgdiwgdSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKGkgPCAoMSA8PCAxNSkgJiYgIShwW2ldLnUgfCBwW2ldLnYgfCBwW2ldLnkpKSB7CisgICAgICAgICAgICAgICAgICAgIHBbaV0ueSA9IHk7CisgICAgICAgICAgICAgICAgICAgIHBbaV0udiA9IHY7CisgICAgICAgICAgICAgICAgICAgIHBbaV0udSA9IHU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyArK2kpCisgICAgICAgIG1wX3NldF96ZXJvX3l1dihwICsgaSAqIDMyKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBtb3Rpb25waXhlbHNfdGFibGVpbml0KHZvaWQpCit7CisgICAgaWYgKCFtcF9yZ2JfeXV2X3RhYmxlWzBdLnUpCisgICAgICAgIG1wX2J1aWxkX3JnYl95dXZfdGFibGUobXBfcmdiX3l1dl90YWJsZSk7Cit9CisjZW5kaWYgLyogQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMgKi8KKworI2VuZGlmIC8qIEFWQ09ERUNfTU9USU9OUElYRUxTX1RBQkxFR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21vdnN1Yl9ic2YuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21vdnN1Yl9ic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjNjN2E1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbW92c3ViX2JzZi5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUmVpbWFyIETDtmZmaW5nZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCisKK3N0YXRpYyBpbnQgdGV4dDJtb3ZzdWIoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50IGtleWZyYW1lKXsKKyAgICBpZiAoYnVmX3NpemUgPiAweGZmZmYpIHJldHVybiAwOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZSArIDI7CisgICAgKnBvdXRidWYgPSBhdl9tYWxsb2MoKnBvdXRidWZfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIEFWX1dCMTYoKnBvdXRidWYsIGJ1Zl9zaXplKTsKKyAgICBtZW1jcHkoKnBvdXRidWYgKyAyLCBidWYsIGJ1Zl9zaXplKTsKKyAgICByZXR1cm4gMTsKK30KKworQVZCaXRTdHJlYW1GaWx0ZXIgZmZfdGV4dDJtb3ZzdWJfYnNmPXsKKyAgICAubmFtZSAgID0gInRleHQybW92c3ViIiwKKyAgICAuZmlsdGVyID0gdGV4dDJtb3ZzdWIsCit9OworCitzdGF0aWMgaW50IG1vdjJ0ZXh0c3ViKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBrZXlmcmFtZSl7CisgICAgaWYgKGJ1Zl9zaXplIDwgMikgcmV0dXJuIDA7CisgICAgKnBvdXRidWZfc2l6ZSA9IEZGTUlOKGJ1Zl9zaXplIC0gMiwgQVZfUkIxNihidWYpKTsKKyAgICAqcG91dGJ1ZiA9IGF2X21hbGxvYygqcG91dGJ1Zl9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgbWVtY3B5KCpwb3V0YnVmLCBidWYgKyAyLCAqcG91dGJ1Zl9zaXplKTsKKyAgICByZXR1cm4gMTsKK30KKworQVZCaXRTdHJlYW1GaWx0ZXIgZmZfbW92MnRleHRzdWJfYnNmPXsKKyAgICAubmFtZSAgID0gIm1vdjJ0ZXh0c3ViIiwKKyAgICAuZmlsdGVyID0gbW92MnRleHRzdWIsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbW92dGV4dGRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbW92dGV4dGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjN2ZmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tb3Z0ZXh0ZGVjLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiAzR1BQIFRTIDI2LjI0NSBUaW1lZCBUZXh0IGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiAgUGhpbGlwIExhbmdkYWxlIDxwaGlsaXBsQG92ZXJ0Lm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJhc3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworc3RhdGljIGludCB0ZXh0X3RvX2FzcyhBVkJQcmludCAqYnVmLCBjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBjaGFyICp0ZXh0X2VuZCkKK3sKKyAgICB3aGlsZSAodGV4dCA8IHRleHRfZW5kKSB7CisgICAgICAgIHN3aXRjaCAoKnRleHQpIHsKKyAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiXFxOIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhidWYsICp0ZXh0LCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRleHQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfdGV4dF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkgeworICAgIC8qCisgICAgICogVE9ETzogSGFuZGxlIHRoZSBkZWZhdWx0IHRleHQgc3R5bGUuCisgICAgICogTkI6IE1vc3QgcGxheWVycyBpZ25vcmUgc3R5bGVzIGNvbXBsZXRlbHksIHdpdGggdGhlIHJlc3VsdCB0aGF0CisgICAgICogaXQncyB2ZXJ5IGNvbW1vbiB0byBmaW5kIGZpbGVzIHdoZXJlIHRoZSBkZWZhdWx0IHN0eWxlIGlzIGJyb2tlbgorICAgICAqIGFuZCByZXNwZWN0aW5nIGl0IHJlc3VsdHMgaW4gYSB3b3JzZSBleHBlcmllbmNlIHRoYW4gaWdub3JpbmcgaXQuCisgICAgICovCisgICAgcmV0dXJuIGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXJfZGVmYXVsdChhdmN0eCk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3RleHRfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9zdWJfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKKyAgICBpbnQgcmV0LCB0c19zdGFydCwgdHNfZW5kOworICAgIEFWQlByaW50IGJ1ZjsKKyAgICBjb25zdCBjaGFyICpwdHIgPSBhdnBrdC0+ZGF0YTsKKyAgICBjb25zdCBjaGFyICplbmQ7CisKKyAgICBpZiAoIXB0ciB8fCBhdnBrdC0+c2l6ZSA8IDIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLyoKKyAgICAgKiBBIHBhY2tldCBvZiBzaXplIHR3byB3aXRoIHZhbHVlIHplcm8gaXMgYW4gZW1wdHkgc3VidGl0bGUKKyAgICAgKiB1c2VkIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgbm9uLWVtcHR5IHN1YnRpdGxlLgorICAgICAqIFdlIGNhbiBqdXN0IGRyb3AgdGhlbSBoZXJlIGFzIHdlIGhhdmUgZHVyYXRpb24gaW5mb3JtYXRpb24KKyAgICAgKiBhbHJlYWR5LiBJZiB0aGUgdmFsdWUgaXMgbm9uLXplcm8sIHRoZW4gaXQncyB0ZWNobmljYWxseSBhCisgICAgICogYmFkIHBhY2tldC4KKyAgICAgKi8KKyAgICBpZiAoYXZwa3QtPnNpemUgPT0gMikKKyAgICAgICAgcmV0dXJuIEFWX1JCMTYocHRyKSA9PSAwID8gMCA6IEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKgorICAgICAqIFRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIHBhY2tldCBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCBzdHJpbmcKKyAgICAgKiBJbiBjb21wbGV4IGNhc2VzLCB0aGVyZSBhcmUgc3R5bGUgZGVzY3JpcHRvcnMgYXBwZW5kZWQgdG8gdGhlIHN0cmluZworICAgICAqIHNvIHdlIGNhbid0IGp1c3QgYXNzdW1lIHRoZSBwYWNrZXQgc2l6ZSBpcyB0aGUgc3RyaW5nIHNpemUuCisgICAgICovCisgICAgZW5kID0gcHRyICsgRkZNSU4oMiArIEFWX1JCMTYocHRyKSwgYXZwa3QtPnNpemUpOworICAgIHB0ciArPSAyOworCisgICAgdHNfc3RhcnQgPSBhdl9yZXNjYWxlX3EoYXZwa3QtPnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLDEwMH0pOworICAgIHRzX2VuZCAgID0gYXZfcmVzY2FsZV9xKGF2cGt0LT5wdHMgKyBhdnBrdC0+ZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwxMDB9KTsKKworICAgIC8vIE5vdGUgdGhhdCB0aGUgc3BlYyByZWNvbW1lbmRzIGxpbmVzIGJlIG5vIGxvbmdlciB0aGFuIDIwNDggY2hhcmFjdGVycy4KKyAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgIHRleHRfdG9fYXNzKCZidWYsIHB0ciwgZW5kKTsKKyAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3RfYnByaW50KHN1YiwgJmJ1ZiwgdHNfc3RhcnQsIHRzX2VuZC10c19zdGFydCk7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgICpnb3Rfc3ViX3B0ciA9IHN1Yi0+bnVtX3JlY3RzID4gMDsKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfbW92dGV4dF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAibW92X3RleHQiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiM0dQUCBUaW1lZCBUZXh0IHN1YnRpdGxlIiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfTU9WX1RFWFQsCisgICAgLmluaXQgICAgICAgICA9IG1vdl90ZXh0X2luaXQsCisgICAgLmRlY29kZSAgICAgICA9IG1vdl90ZXh0X2RlY29kZV9mcmFtZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tb3Z0ZXh0ZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tb3Z0ZXh0ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4ZjQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21vdnRleHRlbmMuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIDNHUFAgVFMgMjYuMjQ1IFRpbWVkIFRleHQgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEyICBQaGlsaXAgTGFuZ2RhbGUgPHBoaWxpcGxAb3ZlcnQub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhc3Nfc3BsaXQuaCIKKyNpbmNsdWRlICJhc3MuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFTU1NwbGl0Q29udGV4dCAqYXNzX2N0eDsKKyAgICBjaGFyIGJ1ZmZlclsyMDQ4XTsKKyAgICBjaGFyICpwdHI7CisgICAgY2hhciAqZW5kOworfSBNb3ZUZXh0Q29udGV4dDsKKworCitzdGF0aWMgYXZfY29sZCBpbnQgbW92X3RleHRfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIC8qCisgICAgICogRm9yIG5vdywgd2UnbGwgdXNlIGEgZml4ZWQgZGVmYXVsdCBzdHlsZS4gV2hlbiB3ZSBhZGQgc3R5bGluZworICAgICAqIHN1cHBvcnQsIHRoaXMgd2lsbCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgQVNTIHN0eWxlLgorICAgICAqLworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHRleHRfc2FtcGxlX2VudHJ5W10gPSB7CisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIHVpbnQzMl90IGRpc3BsYXlGbGFncworICAgICAgICAweDAxLCAgICAgICAgICAgICAgICAgICAvLyBpbnQ4X3QgaG9yaXpvbnRhbC1qdXN0aWZpY2F0aW9uCisgICAgICAgIDB4RkYsICAgICAgICAgICAgICAgICAgIC8vIGludDhfdCB2ZXJ0aWNhbC1qdXN0aWZpY2F0aW9uCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIHVpbnQ4X3QgYmFja2dyb3VuZC1jb2xvci1yZ2JhWzRdCisgICAgICAgIC8vIEJveFJlY29yZCB7CisgICAgICAgIDB4MDAsIDB4MDAsICAgICAgICAgICAgIC8vIGludDE2X3QgdG9wCisgICAgICAgIDB4MDAsIDB4MDAsICAgICAgICAgICAgIC8vIGludDE2X3QgbGVmdAorICAgICAgICAweDAwLCAweDAwLCAgICAgICAgICAgICAvLyBpbnQxNl90IGJvdHRvbQorICAgICAgICAweDAwLCAweDAwLCAgICAgICAgICAgICAvLyBpbnQxNl90IHJpZ2h0CisgICAgICAgIC8vIH07CisgICAgICAgIC8vIFN0eWxlUmVjb3JkIHsKKyAgICAgICAgMHgwMCwgMHgwMCwgICAgICAgICAgICAgLy8gdWludDE2X3Qgc3RhcnRDaGFyCisgICAgICAgIDB4MDAsIDB4MDAsICAgICAgICAgICAgIC8vIHVpbnQxNl90IGVuZENoYXIKKyAgICAgICAgMHgwMCwgMHgwMSwgICAgICAgICAgICAgLy8gdWludDE2X3QgZm9udC1JRAorICAgICAgICAweDAwLCAgICAgICAgICAgICAgICAgICAvLyB1aW50OF90IGZhY2Utc3R5bGUtZmxhZ3MKKyAgICAgICAgMHgxMiwgICAgICAgICAgICAgICAgICAgLy8gdWludDhfdCBmb250LXNpemUKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgLy8gdWludDhfdCB0ZXh0LWNvbG9yLXJnYmFbNF0KKyAgICAgICAgLy8gfTsKKyAgICAgICAgLy8gRm9udFRhYmxlQm94IHsKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgLy8gdWludDMyX3Qgc2l6ZQorICAgICAgICAnZicsICd0JywgJ2EnLCAnYicsICAgICAvLyB1aW50OF90IG5hbWVbNF0KKyAgICAgICAgMHgwMCwgMHgwMSwgICAgICAgICAgICAgLy8gdWludDE2X3QgZW50cnktY291bnQKKyAgICAgICAgLy8gRm9udFJlY29yZCB7CisgICAgICAgIDB4MDAsIDB4MDEsICAgICAgICAgICAgIC8vIHVpbnQxNl90IGZvbnQtSUQKKyAgICAgICAgMHgwNSwgICAgICAgICAgICAgICAgICAgLy8gdWludDhfdCBmb250LW5hbWUtbGVuZ3RoCisgICAgICAgICdTJywgJ2UnLCAncicsICdpJywgJ2YnLC8vIHVpbnQ4X3QgZm9udFtmb250LW5hbWUtbGVuZ3RoXQorICAgICAgICAvLyB9OworICAgICAgICAvLyB9OworICAgIH07CisKKyAgICBNb3ZUZXh0Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSBzaXplb2YgdGV4dF9zYW1wbGVfZW50cnk7CisgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3ooYXZjdHgtPmV4dHJhZGF0YV9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgbWVtY3B5KGF2Y3R4LT5leHRyYWRhdGEsIHRleHRfc2FtcGxlX2VudHJ5LCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgcy0+YXNzX2N0eCA9IGZmX2Fzc19zcGxpdChhdmN0eC0+c3VidGl0bGVfaGVhZGVyKTsKKyAgICByZXR1cm4gcy0+YXNzX2N0eCA/IDAgOiBBVkVSUk9SX0lOVkFMSUREQVRBOworfQorCitzdGF0aWMgdm9pZCBtb3ZfdGV4dF90ZXh0X2NiKHZvaWQgKnByaXYsIGNvbnN0IGNoYXIgKnRleHQsIGludCBsZW4pCit7CisgICAgTW92VGV4dENvbnRleHQgKnMgPSBwcml2OworICAgIGF2X2Fzc2VydDAocy0+ZW5kID49IHMtPnB0cik7CisgICAgYXZfc3RybGNweShzLT5wdHIsIHRleHQsIEZGTUlOKHMtPmVuZCAtIHMtPnB0ciwgbGVuICsgMSkpOworICAgIHMtPnB0ciArPSBGRk1JTihzLT5lbmQgLSBzLT5wdHIsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIG1vdl90ZXh0X25ld19saW5lX2NiKHZvaWQgKnByaXYsIGludCBmb3JjZWQpCit7CisgICAgTW92VGV4dENvbnRleHQgKnMgPSBwcml2OworICAgIGF2X2Fzc2VydDAocy0+ZW5kID49IHMtPnB0cik7CisgICAgYXZfc3RybGNweShzLT5wdHIsICJcbiIsIEZGTUlOKHMtPmVuZCAtIHMtPnB0ciwgMikpOworICAgIGlmIChzLT5lbmQgPiBzLT5wdHIpCisgICAgICAgIHMtPnB0cisrOworfQorCitzdGF0aWMgY29uc3QgQVNTQ29kZXNDYWxsYmFja3MgbW92X3RleHRfY2FsbGJhY2tzID0geworICAgIC50ZXh0ICAgICA9IG1vdl90ZXh0X3RleHRfY2IsCisgICAgLm5ld19saW5lID0gbW92X3RleHRfbmV3X2xpbmVfY2IsCit9OworCitzdGF0aWMgaW50IG1vdl90ZXh0X2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZzaXplLCBjb25zdCBBVlN1YnRpdGxlICpzdWIpCit7CisgICAgTW92VGV4dENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFTU0RpYWxvZyAqZGlhbG9nOworICAgIGludCBpLCBsZW4sIG51bTsKKworICAgIHMtPnB0ciA9IHMtPmJ1ZmZlcjsKKyAgICBzLT5lbmQgPSBzLT5wdHIgKyBzaXplb2Yocy0+YnVmZmVyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzdWItPm51bV9yZWN0czsgaSsrKSB7CisKKyAgICAgICAgaWYgKHN1Yi0+cmVjdHNbaV0tPnR5cGUgIT0gU1VCVElUTEVfQVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9ubHkgU1VCVElUTEVfQVNTIHR5cGUgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICAgICB9CisKKyAgICAgICAgZGlhbG9nID0gZmZfYXNzX3NwbGl0X2RpYWxvZyhzLT5hc3NfY3R4LCBzdWItPnJlY3RzW2ldLT5hc3MsIDAsICZudW0pOworICAgICAgICBmb3IgKDsgZGlhbG9nICYmIG51bS0tOyBkaWFsb2crKykgeworICAgICAgICAgICAgZmZfYXNzX3NwbGl0X292ZXJyaWRlX2NvZGVzKCZtb3ZfdGV4dF9jYWxsYmFja3MsIHMsIGRpYWxvZy0+dGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+cHRyID09IHMtPmJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBBVl9XQjE2KGJ1Ziwgc3RybGVuKHMtPmJ1ZmZlcikpOworICAgIGJ1ZiArPSAyOworCisgICAgbGVuID0gYXZfc3RybGNweShidWYsIHMtPmJ1ZmZlciwgYnVmc2l6ZSAtIDIpOworCisgICAgaWYgKGxlbiA+IGJ1ZnNpemUtMykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJ1ZmZlciB0b28gc21hbGwgZm9yIEFTUyBldmVudC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiBsZW4gKyAyOworfQorCitzdGF0aWMgaW50IG1vdl90ZXh0X2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTW92VGV4dENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGZmX2Fzc19zcGxpdF9mcmVlKHMtPmFzc19jdHgpOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX21vdnRleHRfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibW92X3RleHQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCIzR1BQIFRpbWVkIFRleHQgc3VidGl0bGUiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTU9WX1RFWFQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1vdlRleHRDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBtb3ZfdGV4dF9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlX3N1YiAgICAgPSBtb3ZfdGV4dF9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gbW92X3RleHRfZW5jb2RlX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wM19oZWFkZXJfZGVjb21wcmVzc19ic2YuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wM19oZWFkZXJfZGVjb21wcmVzc19ic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ1NTMyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXAzX2hlYWRlcl9kZWNvbXByZXNzX2JzZi5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RlY2hlYWRlci5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RhdGEuaCIKKworCitzdGF0aWMgaW50IG1wM19oZWFkZXJfZGVjb21wcmVzcyhBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgY2hhciAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQga2V5ZnJhbWUpeworICAgIHVpbnQzMl90IGhlYWRlcjsKKyAgICBpbnQgc2FtcGxlX3JhdGU9IGF2Y3R4LT5zYW1wbGVfcmF0ZTsKKyAgICBpbnQgc2FtcGxlX3JhdGVfaW5kZXg9MDsKKyAgICBpbnQgbHNmLCBtcGVnMjUsIGJpdHJhdGVfaW5kZXgsIGZyYW1lX3NpemU7CisKKyAgICBoZWFkZXIgPSBBVl9SQjMyKGJ1Zik7CisgICAgaWYoZmZfbXBhX2NoZWNrX2hlYWRlcihoZWFkZXIpID49IDApeworICAgICAgICAqcG91dGJ1Zj0gKHVpbnQ4X3QgKikgYnVmOworICAgICAgICAqcG91dGJ1Zl9zaXplPSBidWZfc2l6ZTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgIT0gMTUgfHwgc3RyY21wKGF2Y3R4LT5leHRyYWRhdGEsICJGRkNNUDMgMC4wIikpeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkV4dHJhZGF0YSBpbnZhbGlkICVkXG4iLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaGVhZGVyPSBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGErMTEpICYgTVAzX01BU0s7CisKKyAgICBsc2YgICAgID0gc2FtcGxlX3JhdGUgPCAoMjQwMDArMzIwMDApLzI7CisgICAgbXBlZzI1ICA9IHNhbXBsZV9yYXRlIDwgKDEyMDAwKzE2MDAwKS8yOworICAgIHNhbXBsZV9yYXRlX2luZGV4PSAoaGVhZGVyPj4xMCkmMzsKKyAgICBzYW1wbGVfcmF0ZT0gYXZwcml2X21wYV9mcmVxX3RhYltzYW1wbGVfcmF0ZV9pbmRleF0gPj4gKGxzZiArIG1wZWcyNSk7IC8vaW4gY2FzZSBzYW1wbGUgcmF0ZSBpcyBhIGxpdHRsZSBvZmYKKworICAgIGZvcihiaXRyYXRlX2luZGV4PTI7IGJpdHJhdGVfaW5kZXg8MzA7IGJpdHJhdGVfaW5kZXgrKyl7CisgICAgICAgIGZyYW1lX3NpemUgPSBhdnByaXZfbXBhX2JpdHJhdGVfdGFiW2xzZl1bMl1bYml0cmF0ZV9pbmRleD4+MV07CisgICAgICAgIGZyYW1lX3NpemUgPSAoZnJhbWVfc2l6ZSAqIDE0NDAwMCkgLyAoc2FtcGxlX3JhdGUgPDwgbHNmKSArIChiaXRyYXRlX2luZGV4JjEpOworICAgICAgICBpZihmcmFtZV9zaXplID09IGJ1Zl9zaXplICsgNCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZihmcmFtZV9zaXplID09IGJ1Zl9zaXplICsgNikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZihiaXRyYXRlX2luZGV4ID09IDMwKXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZmluZCBiaXRyYXRlX2luZGV4LlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBoZWFkZXIgfD0gKGJpdHJhdGVfaW5kZXgmMSk8PDk7CisgICAgaGVhZGVyIHw9IChiaXRyYXRlX2luZGV4Pj4xKTw8MTI7CisgICAgaGVhZGVyIHw9IChmcmFtZV9zaXplID09IGJ1Zl9zaXplICsgNCk8PDE2OyAvL0ZJWE1FIGFjdHVhbGx5IHNldCBhIGNvcnJlY3QgY3JjIGluc3RlYWQgb2YgMAorCisgICAgKnBvdXRidWZfc2l6ZT0gZnJhbWVfc2l6ZTsKKyAgICAqcG91dGJ1Zj0gYXZfbWFsbG9jKGZyYW1lX3NpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBtZW1jcHkoKnBvdXRidWYgKyBmcmFtZV9zaXplIC0gYnVmX3NpemUsIGJ1ZiwgYnVmX3NpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgIGlmKGF2Y3R4LT5jaGFubmVscz09Mil7CisgICAgICAgIHVpbnQ4X3QgKnA9ICpwb3V0YnVmICsgZnJhbWVfc2l6ZSAtIGJ1Zl9zaXplOworICAgICAgICBpZihsc2YpeworICAgICAgICAgICAgRkZTV0FQKGludCwgcFsxXSwgcFsyXSk7CisgICAgICAgICAgICBoZWFkZXIgfD0gKHBbMV0gJiAweEMwKT4+MjsKKyAgICAgICAgICAgIHBbMV0gJj0gMHgzRjsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBoZWFkZXIgfD0gcFsxXSAmIDB4MzA7CisgICAgICAgICAgICBwWzFdICY9IDB4Q0Y7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBVl9XQjMyKCpwb3V0YnVmLCBoZWFkZXIpOworCisgICAgcmV0dXJuIDE7Cit9CisKK0FWQml0U3RyZWFtRmlsdGVyIGZmX21wM19oZWFkZXJfZGVjb21wcmVzc19ic2Y9eworICAgIC5uYW1lICAgPSAibXAzZGVjb21wIiwKKyAgICAuZmlsdGVyID0gbXAzX2hlYWRlcl9kZWNvbXByZXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmMzBiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wYy5jCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTXVzZXBhY2sgZGVjb2RlciBjb3JlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNdXNlcGFjayBkZWNvZGVyIGNvcmUKKyAqIE1QRUcgQXVkaW8gTGF5ZXIgMS8yIC1saWtlIGNvZGVjIHdpdGggZnJhbWVzIG9mIDExNTIgc2FtcGxlcworICogZGl2aWRlZCBpbnRvIDMyIHN1YmJhbmRzLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RzcC5oIgorI2luY2x1ZGUgIm1wZWdhdWRpby5oIgorCisjaW5jbHVkZSAibXBjLmgiCisjaW5jbHVkZSAibXBjZGF0YS5oIgorCithdl9jb2xkIHZvaWQgZmZfbXBjX2luaXQodm9pZCkKK3sKKyAgICBmZl9tcGFfc3ludGhfaW5pdF9maXhlZChmZl9tcGFfc3ludGhfd2luZG93X2ZpeGVkKTsKK30KKworLyoqCisgKiBQcm9jZXNzIGRlY29kZWQgTXVzZXBhY2sgZGF0YSBhbmQgcHJvZHVjZSBQQ00KKyAqLworc3RhdGljIHZvaWQgbXBjX3N5bnRoKE1QQ0NvbnRleHQgKmMsIGludDE2X3QgKipvdXQsIGludCBjaGFubmVscykKK3sKKyAgICBpbnQgZGl0aGVyX3N0YXRlID0gMDsKKyAgICBpbnQgaSwgY2g7CisKKyAgICBmb3IoY2ggPSAwOyAgY2ggPCBjaGFubmVsczsgY2grKyl7CisgICAgICAgIGZvcihpID0gMDsgaSA8IFNBTVBMRVNfUEVSX0JBTkQ7IGkrKykgeworICAgICAgICAgICAgZmZfbXBhX3N5bnRoX2ZpbHRlcl9maXhlZCgmYy0+bXBhZHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zeW50aF9idWZbY2hdLCAmKGMtPnN5bnRoX2J1Zl9vZmZzZXRbY2hdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBhX3N5bnRoX3dpbmRvd19maXhlZCwgJmRpdGhlcl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2NoXSArIDMyICogaSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2Jfc2FtcGxlc1tjaF1baV0pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZmX21wY19kZXF1YW50aXplX2FuZF9zeW50aChNUENDb250ZXh0ICogYywgaW50IG1heGJhbmQsIGludDE2X3QgKipvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpCit7CisgICAgaW50IGksIGosIGNoOworICAgIEJhbmQgKmJhbmRzID0gYy0+YmFuZHM7CisgICAgaW50IG9mZjsKKyAgICBmbG9hdCBtdWw7CisKKyAgICAvKiBkZXF1YW50aXplICovCisgICAgbWVtc2V0KGMtPnNiX3NhbXBsZXMsIDAsIHNpemVvZihjLT5zYl9zYW1wbGVzKSk7CisgICAgb2ZmID0gMDsKKyAgICBmb3IoaSA9IDA7IGkgPD0gbWF4YmFuZDsgaSsrLCBvZmYgKz0gU0FNUExFU19QRVJfQkFORCl7CisgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgMjsgY2grKyl7CisgICAgICAgICAgICBpZihiYW5kc1tpXS5yZXNbY2hdKXsKKyAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICBtdWwgPSAobXBjX0NDKzEpW2JhbmRzW2ldLnJlc1tjaF1dICogbXBjX1NDRltiYW5kc1tpXS5zY2ZfaWR4W2NoXVswXSAmIDB4RkZdOworICAgICAgICAgICAgICAgIGZvcig7IGogPCAxMjsgaisrKQorICAgICAgICAgICAgICAgICAgICBjLT5zYl9zYW1wbGVzW2NoXVtqXVtpXSA9IG11bCAqIGMtPlFbY2hdW2ogKyBvZmZdOworICAgICAgICAgICAgICAgIG11bCA9IChtcGNfQ0MrMSlbYmFuZHNbaV0ucmVzW2NoXV0gKiBtcGNfU0NGW2JhbmRzW2ldLnNjZl9pZHhbY2hdWzFdICYgMHhGRl07CisgICAgICAgICAgICAgICAgZm9yKDsgaiA8IDI0OyBqKyspCisgICAgICAgICAgICAgICAgICAgIGMtPnNiX3NhbXBsZXNbY2hdW2pdW2ldID0gbXVsICogYy0+UVtjaF1baiArIG9mZl07CisgICAgICAgICAgICAgICAgbXVsID0gKG1wY19DQysxKVtiYW5kc1tpXS5yZXNbY2hdXSAqIG1wY19TQ0ZbYmFuZHNbaV0uc2NmX2lkeFtjaF1bMl0gJiAweEZGXTsKKyAgICAgICAgICAgICAgICBmb3IoOyBqIDwgMzY7IGorKykKKyAgICAgICAgICAgICAgICAgICAgYy0+c2Jfc2FtcGxlc1tjaF1bal1baV0gPSBtdWwgKiBjLT5RW2NoXVtqICsgb2ZmXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihiYW5kc1tpXS5tc2YpeworICAgICAgICAgICAgaW50IHQxLCB0MjsKKyAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IFNBTVBMRVNfUEVSX0JBTkQ7IGorKyl7CisgICAgICAgICAgICAgICAgdDEgPSBjLT5zYl9zYW1wbGVzWzBdW2pdW2ldOworICAgICAgICAgICAgICAgIHQyID0gYy0+c2Jfc2FtcGxlc1sxXVtqXVtpXTsKKyAgICAgICAgICAgICAgICBjLT5zYl9zYW1wbGVzWzBdW2pdW2ldID0gdDEgKyB0MjsKKyAgICAgICAgICAgICAgICBjLT5zYl9zYW1wbGVzWzFdW2pdW2ldID0gdDEgLSB0MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1wY19zeW50aChjLCBvdXQsIGNoYW5uZWxzKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiODU3NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wYy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBNdXNlcGFjayBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNdXNlcGFjayBkZWNvZGVyCisgKiBNUEVHIEF1ZGlvIExheWVyIDEvMiAtbGlrZSBjb2RlYyB3aXRoIGZyYW1lcyBvZiAxMTUyIHNhbXBsZXMKKyAqIGRpdmlkZWQgaW50byAzMiBzdWJiYW5kcy4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTVBDX0gKKyNkZWZpbmUgQVZDT0RFQ19NUENfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJic3dhcGRzcC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAibXBlZ2F1ZGlvLmgiCisjaW5jbHVkZSAibXBlZ2F1ZGlvZHNwLmgiCisKKyNkZWZpbmUgQkFORFMgICAgICAgICAgICAzMgorI2RlZmluZSBTQU1QTEVTX1BFUl9CQU5EIDM2CisjZGVmaW5lIE1QQ19GUkFNRV9TSVpFICAgKEJBTkRTICogU0FNUExFU19QRVJfQkFORCkKKworLyoqIFN1YmJhbmQgc3RydWN0dXJlIC0gaG9sZCBhbGwgdmFyaWFibGVzIGZvciBlYWNoIHN1YmJhbmQgKi8KK3R5cGVkZWYgc3RydWN0IEJhbmQgeworICAgIGludCBtc2Y7IC8vLzwgbWlkLXN0ZXJlbyBmbGFnCisgICAgaW50IHJlc1syXTsKKyAgICBpbnQgc2NmaVsyXTsKKyAgICBpbnQgc2NmX2lkeFsyXVszXTsKKyAgICBpbnQgUVsyXTsKK31CYW5kOworCit0eXBlZGVmIHN0cnVjdCBNUENDb250ZXh0IHsKKyAgICBCc3dhcERTUENvbnRleHQgYmRzcDsKKyAgICBNUEFEU1BDb250ZXh0IG1wYWRzcDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBJUywgTVNTLCBnYXBsZXNzOworICAgIGludCBsYXN0ZnJhbWVsZW47CisgICAgaW50IG1heGJhbmRzLCBsYXN0X21heF9iYW5kOworICAgIGludCBsYXN0X2JpdHNfdXNlZDsKKyAgICBpbnQgb2xkRFNDRlsyXVtCQU5EU107CisgICAgQmFuZCBiYW5kc1tCQU5EU107CisgICAgaW50IFFbMl1bTVBDX0ZSQU1FX1NJWkVdOworICAgIGludCBjdXJfZnJhbWUsIGZyYW1lczsKKyAgICB1aW50OF90ICpiaXRzOworICAgIGludCBidWZfc2l6ZTsKKyAgICBBVkxGRyBybmQ7CisgICAgaW50IGZyYW1lc190b19za2lwOworICAgIC8qIGZvciBzeW50aGVzaXMgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIE1QQV9JTlQsIHN5bnRoX2J1ZilbTVBBX01BWF9DSEFOTkVMU11bNTEyKjJdOworICAgIGludCBzeW50aF9idWZfb2Zmc2V0W01QQV9NQVhfQ0hBTk5FTFNdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MzJfdCwgc2Jfc2FtcGxlcylbTVBBX01BWF9DSEFOTkVMU11bMzZdW1NCTElNSVRdOworfSBNUENDb250ZXh0OworCit2b2lkIGZmX21wY19pbml0KHZvaWQpOwordm9pZCBmZl9tcGNfZGVxdWFudGl6ZV9hbmRfc3ludGgoTVBDQ29udGV4dCAqYywgaW50IG1heGJhbmQsIGludDE2X3QgKipvdXQsIGludCBjaGFubmVscyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX01QQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGM3LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGM3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxZTM0YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wYzcuYwpAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIE11c2VwYWNrIFNWNyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNUEVHIEF1ZGlvIExheWVyIDEvMiAtbGlrZSBjb2RlYyB3aXRoIGZyYW1lcyBvZiAxMTUyIHNhbXBsZXMKKyAqIGRpdmlkZWQgaW50byAzMiBzdWJiYW5kcy4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXBlZ2F1ZGlvZHNwLmgiCisKKyNpbmNsdWRlICJtcGMuaCIKKyNpbmNsdWRlICJtcGM3ZGF0YS5oIgorCitzdGF0aWMgVkxDIHNjZmlfdmxjLCBkc2NmX3ZsYywgaGRyX3ZsYywgcXVhbnRfdmxjW01QQzdfUVVBTlRfVkxDX1RBQkxFU11bMl07CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBxdWFudF9vZmZzZXRzW01QQzdfUVVBTlRfVkxDX1RBQkxFUyoyICsgMV0gPQoreworICAgICAgIDAsIDUxMiwgMTAyNCwgMTUzNiwgMjA1MiwgMjU2NCwgMzA3NiwgMzU4OCwgNDEwMCwgNDYxMiwgNTEyNCwKKyAgICAgICA1NjM2LCA2MTY0LCA2Njc2LCA3MjI0Cit9OworCisKK3N0YXRpYyBhdl9jb2xkIGludCBtcGM3X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICogYXZjdHgpCit7CisgICAgaW50IGksIGo7CisgICAgTVBDQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGJ1ZiwgWzE2XSk7CisgICAgc3RhdGljIGludCB2bGNfaW5pdGlhbGl6ZWQgPSAwOworCisgICAgc3RhdGljIFZMQ19UWVBFIHNjZmlfdGFibGVbMSA8PCBNUEM3X1NDRklfQklUU11bMl07CisgICAgc3RhdGljIFZMQ19UWVBFIGRzY2ZfdGFibGVbMSA8PCBNUEM3X0RTQ0ZfQklUU11bMl07CisgICAgc3RhdGljIFZMQ19UWVBFIGhkcl90YWJsZVsxIDw8IE1QQzdfSERSX0JJVFNdWzJdOworICAgIHN0YXRpYyBWTENfVFlQRSBxdWFudF90YWJsZXNbNzIyNF1bMl07CisKKyAgICAvKiBNdXNlcGFjayBTVjcgaXMgYWx3YXlzIHN0ZXJlbyAqLworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgIT0gMikgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICIlZCBjaGFubmVscyIsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCAxNil7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNtYWxsIGV4dHJhZGF0YSBzaXplICglaSkhXG4iLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbXNldChjLT5vbGREU0NGLCAwLCBzaXplb2YoYy0+b2xkRFNDRikpOworICAgIGF2X2xmZ19pbml0KCZjLT5ybmQsIDB4REVBREJFRUYpOworICAgIGZmX2Jzd2FwZHNwX2luaXQoJmMtPmJkc3ApOworICAgIGZmX21wYWRzcF9pbml0KCZjLT5tcGFkc3ApOworICAgIGMtPmJkc3AuYnN3YXBfYnVmKCh1aW50MzJfdCAqKSBidWYsIChjb25zdCB1aW50MzJfdCAqKSBhdmN0eC0+ZXh0cmFkYXRhLCA0KTsKKyAgICBmZl9tcGNfaW5pdCgpOworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIDEyOCk7CisKKyAgICBjLT5JUyA9IGdldF9iaXRzMSgmZ2IpOworICAgIGMtPk1TUyA9IGdldF9iaXRzMSgmZ2IpOworICAgIGMtPm1heGJhbmRzID0gZ2V0X2JpdHMoJmdiLCA2KTsKKyAgICBpZihjLT5tYXhiYW5kcyA+PSBCQU5EUyl7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgYmFuZHM6ICVpXG4iLCBjLT5tYXhiYW5kcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCA4OCk7CisgICAgYy0+Z2FwbGVzcyA9IGdldF9iaXRzMSgmZ2IpOworICAgIGMtPmxhc3RmcmFtZWxlbiA9IGdldF9iaXRzKCZnYiwgMTEpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSVM6ICVkLCBNU1M6ICVkLCBURzogJWQsIExGTDogJWQsIGJhbmRzOiAlZFxuIiwKKyAgICAgICAgICAgIGMtPklTLCBjLT5NU1MsIGMtPmdhcGxlc3MsIGMtPmxhc3RmcmFtZWxlbiwgYy0+bWF4YmFuZHMpOworICAgIGMtPmZyYW1lc190b19za2lwID0gMDsKKworICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTZQOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisKKyAgICBpZih2bGNfaW5pdGlhbGl6ZWQpIHJldHVybiAwOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSW5pdGluZyBWTENcbiIpOworICAgIHNjZmlfdmxjLnRhYmxlID0gc2NmaV90YWJsZTsKKyAgICBzY2ZpX3ZsYy50YWJsZV9hbGxvY2F0ZWQgPSAxIDw8IE1QQzdfU0NGSV9CSVRTOworICAgIGlmKGluaXRfdmxjKCZzY2ZpX3ZsYywgTVBDN19TQ0ZJX0JJVFMsIE1QQzdfU0NGSV9TSVpFLAorICAgICAgICAgICAgICAgICZtcGM3X3NjZmlbMV0sIDIsIDEsCisgICAgICAgICAgICAgICAgJm1wYzdfc2NmaVswXSwgMiwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpKXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgaW5pdCBTQ0ZJIFZMQ1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZHNjZl92bGMudGFibGUgPSBkc2NmX3RhYmxlOworICAgIGRzY2ZfdmxjLnRhYmxlX2FsbG9jYXRlZCA9IDEgPDwgTVBDN19EU0NGX0JJVFM7CisgICAgaWYoaW5pdF92bGMoJmRzY2ZfdmxjLCBNUEM3X0RTQ0ZfQklUUywgTVBDN19EU0NGX1NJWkUsCisgICAgICAgICAgICAgICAgJm1wYzdfZHNjZlsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAmbXBjN19kc2NmWzBdLCAyLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQykpeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBpbml0IERTQ0YgVkxDXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBoZHJfdmxjLnRhYmxlID0gaGRyX3RhYmxlOworICAgIGhkcl92bGMudGFibGVfYWxsb2NhdGVkID0gMSA8PCBNUEM3X0hEUl9CSVRTOworICAgIGlmKGluaXRfdmxjKCZoZHJfdmxjLCBNUEM3X0hEUl9CSVRTLCBNUEM3X0hEUl9TSVpFLAorICAgICAgICAgICAgICAgICZtcGM3X2hkclsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAmbXBjN19oZHJbMF0sIDIsIDEsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKSl7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGluaXQgSERSIFZMQ1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yKGkgPSAwOyBpIDwgTVBDN19RVUFOVF9WTENfVEFCTEVTOyBpKyspeworICAgICAgICBmb3IoaiA9IDA7IGogPCAyOyBqKyspeworICAgICAgICAgICAgcXVhbnRfdmxjW2ldW2pdLnRhYmxlID0gJnF1YW50X3RhYmxlc1txdWFudF9vZmZzZXRzW2kqMiArIGpdXTsKKyAgICAgICAgICAgIHF1YW50X3ZsY1tpXVtqXS50YWJsZV9hbGxvY2F0ZWQgPSBxdWFudF9vZmZzZXRzW2kqMiArIGogKyAxXSAtIHF1YW50X29mZnNldHNbaSoyICsgal07CisgICAgICAgICAgICBpZihpbml0X3ZsYygmcXVhbnRfdmxjW2ldW2pdLCA5LCBtcGM3X3F1YW50X3ZsY19zaXplc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtcGM3X3F1YW50X3ZsY1tpXVtqXVsxXSwgNCwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtcGM3X3F1YW50X3ZsY1tpXVtqXVswXSwgNCwgMiwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpKXsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBpbml0IFFVQU5UIFZMQyAlaSwlaVxuIixpLGopOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB2bGNfaW5pdGlhbGl6ZWQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmlsbCBzYW1wbGVzIGZvciBnaXZlbiBzdWJiYW5kCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpZHhfdG9fcXVhbnQoTVBDQ29udGV4dCAqYywgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBpZHgsIGludCAqZHN0KQoreworICAgIGludCBpLCBpMSwgdDsKKyAgICBzd2l0Y2goaWR4KXsKKyAgICBjYXNlIC0xOgorICAgICAgICBmb3IoaSA9IDA7IGkgPCBTQU1QTEVTX1BFUl9CQU5EOyBpKyspeworICAgICAgICAgICAgKmRzdCsrID0gKGF2X2xmZ19nZXQoJmMtPnJuZCkgJiAweDNGQykgLSA1MTA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpMSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGZvcihpID0gMDsgaSA8IFNBTVBMRVNfUEVSX0JBTkQvMzsgaSsrKXsKKyAgICAgICAgICAgIHQgPSBnZXRfdmxjMihnYiwgcXVhbnRfdmxjWzBdW2kxXS50YWJsZSwgOSwgMik7CisgICAgICAgICAgICAqZHN0KysgPSBtcGM3X2lkeDMwW3RdOworICAgICAgICAgICAgKmRzdCsrID0gbXBjN19pZHgzMVt0XTsKKyAgICAgICAgICAgICpkc3QrKyA9IG1wYzdfaWR4MzJbdF07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpMSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGZvcihpID0gMDsgaSA8IFNBTVBMRVNfUEVSX0JBTkQvMjsgaSsrKXsKKyAgICAgICAgICAgIHQgPSBnZXRfdmxjMihnYiwgcXVhbnRfdmxjWzFdW2kxXS50YWJsZSwgOSwgMik7CisgICAgICAgICAgICAqZHN0KysgPSBtcGM3X2lkeDUwW3RdOworICAgICAgICAgICAgKmRzdCsrID0gbXBjN19pZHg1MVt0XTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICAzOiBjYXNlICA0OiBjYXNlICA1OiBjYXNlICA2OiBjYXNlICA3OgorICAgICAgICBpMSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGZvcihpID0gMDsgaSA8IFNBTVBMRVNfUEVSX0JBTkQ7IGkrKykKKyAgICAgICAgICAgICpkc3QrKyA9IGdldF92bGMyKGdiLCBxdWFudF92bGNbaWR4LTFdW2kxXS50YWJsZSwgOSwgMikgLSBtcGM3X3F1YW50X3ZsY19vZmZbaWR4LTFdOworICAgICAgICBicmVhazsKKyAgICBjYXNlICA4OiBjYXNlICA5OiBjYXNlIDEwOiBjYXNlIDExOiBjYXNlIDEyOgorICAgIGNhc2UgMTM6IGNhc2UgMTQ6IGNhc2UgMTU6IGNhc2UgMTY6IGNhc2UgMTc6CisgICAgICAgIHQgPSAoMSA8PCAoaWR4IC0gMikpIC0gMTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgU0FNUExFU19QRVJfQkFORDsgaSsrKQorICAgICAgICAgICAgKmRzdCsrID0gZ2V0X2JpdHMoZ2IsIGlkeCAtIDEpIC0gdDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogLy8gY2FzZSAwIGFuZCAtMi4uLTE3CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NjYWxlX2lkeChHZXRCaXRDb250ZXh0ICpnYiwgaW50IHJlZikKK3sKKyAgICBpbnQgdCA9IGdldF92bGMyKGdiLCBkc2NmX3ZsYy50YWJsZSwgTVBDN19EU0NGX0JJVFMsIDEpIC0gNzsKKyAgICBpZiAodCA9PSA4KQorICAgICAgICByZXR1cm4gZ2V0X2JpdHMoZ2IsIDYpOworICAgIHJldHVybiByZWYgKyB0OworfQorCitzdGF0aWMgaW50IG1wYzdfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICogYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lICAgICA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplOworICAgIE1QQ0NvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGksIGNoOworICAgIGludCBtYiA9IC0xOworICAgIEJhbmQgKmJhbmRzID0gYy0+YmFuZHM7CisgICAgaW50IG9mZiwgcmV0LCBsYXN0X2ZyYW1lLCBza2lwOworICAgIGludCBiaXRzX3VzZWQsIGJpdHNfYXZhaWw7CisKKyAgICBtZW1zZXQoYmFuZHMsIDAsIHNpemVvZigqYmFuZHMpICogKGMtPm1heGJhbmRzICsgMSkpOworCisgICAgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZSAmIH4zOworICAgIGlmIChidWZfc2l6ZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGFja2V0IHNpemUgaXMgdG9vIHNtYWxsICglaSBieXRlcylcbiIsCisgICAgICAgICAgICAgICBhdnBrdC0+c2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoYnVmX3NpemUgIT0gYXZwa3QtPnNpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgInBhY2tldCBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuICIKKyAgICAgICAgICAgICAgICJleHRyYSBieXRlcyBhdCB0aGUgZW5kIHdpbGwgYmUgc2tpcHBlZC5cbiIpOworICAgIH0KKworICAgIHNraXAgICAgICAgPSBidWZbMF07CisgICAgbGFzdF9mcmFtZSA9IGJ1ZlsxXTsKKyAgICBidWYgICAgICAgKz0gNDsKKyAgICBidWZfc2l6ZSAgLT0gNDsKKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBNUENfRlJBTUVfU0laRTsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZjLT5iaXRzLCAmYy0+YnVmX3NpemUsIGJ1Zl9zaXplKTsKKyAgICBpZiAoIWMtPmJpdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYy0+YmRzcC5ic3dhcF9idWYoKHVpbnQzMl90ICopIGMtPmJpdHMsIChjb25zdCB1aW50MzJfdCAqKSBidWYsCisgICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUgPj4gMik7CisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGMtPmJpdHMsIGJ1Zl9zaXplICogOCk7CisgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCBza2lwKTsKKworICAgIC8qIHJlYWQgc3ViYmFuZCBpbmRleGVzICovCisgICAgZm9yKGkgPSAwOyBpIDw9IGMtPm1heGJhbmRzOyBpKyspeworICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IDI7IGNoKyspeworICAgICAgICAgICAgaW50IHQgPSA0OworICAgICAgICAgICAgaWYoaSkgdCA9IGdldF92bGMyKCZnYiwgaGRyX3ZsYy50YWJsZSwgTVBDN19IRFJfQklUUywgMSkgLSA1OworICAgICAgICAgICAgaWYodCA9PSA0KSBiYW5kc1tpXS5yZXNbY2hdID0gZ2V0X2JpdHMoJmdiLCA0KTsKKyAgICAgICAgICAgIGVsc2UgYmFuZHNbaV0ucmVzW2NoXSA9IGJhbmRzW2ktMV0ucmVzW2NoXSArIHQ7CisgICAgICAgICAgICBpZiAoYmFuZHNbaV0ucmVzW2NoXSA8IC0xIHx8IGJhbmRzW2ldLnJlc1tjaF0gPiAxNykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAic3ViYmFuZCBpbmRleCBpbnZhbGlkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGJhbmRzW2ldLnJlc1swXSB8fCBiYW5kc1tpXS5yZXNbMV0peworICAgICAgICAgICAgbWIgPSBpOworICAgICAgICAgICAgaWYoYy0+TVNTKSBiYW5kc1tpXS5tc2YgPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBnZXQgc2NhbGUgaW5kZXhlcyBjb2RpbmcgbWV0aG9kICovCisgICAgZm9yKGkgPSAwOyBpIDw9IG1iOyBpKyspCisgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgMjsgY2grKykKKyAgICAgICAgICAgIGlmKGJhbmRzW2ldLnJlc1tjaF0pIGJhbmRzW2ldLnNjZmlbY2hdID0gZ2V0X3ZsYzIoJmdiLCBzY2ZpX3ZsYy50YWJsZSwgTVBDN19TQ0ZJX0JJVFMsIDEpOworICAgIC8qIGdldCBzY2FsZSBpbmRleGVzICovCisgICAgZm9yKGkgPSAwOyBpIDw9IG1iOyBpKyspeworICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IDI7IGNoKyspeworICAgICAgICAgICAgaWYoYmFuZHNbaV0ucmVzW2NoXSl7CisgICAgICAgICAgICAgICAgYmFuZHNbaV0uc2NmX2lkeFtjaF1bMl0gPSBjLT5vbGREU0NGW2NoXVtpXTsKKyAgICAgICAgICAgICAgICBiYW5kc1tpXS5zY2ZfaWR4W2NoXVswXSA9IGdldF9zY2FsZV9pZHgoJmdiLCBiYW5kc1tpXS5zY2ZfaWR4W2NoXVsyXSk7CisgICAgICAgICAgICAgICAgc3dpdGNoKGJhbmRzW2ldLnNjZmlbY2hdKXsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIGJhbmRzW2ldLnNjZl9pZHhbY2hdWzFdID0gZ2V0X3NjYWxlX2lkeCgmZ2IsIGJhbmRzW2ldLnNjZl9pZHhbY2hdWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgYmFuZHNbaV0uc2NmX2lkeFtjaF1bMl0gPSBnZXRfc2NhbGVfaWR4KCZnYiwgYmFuZHNbaV0uc2NmX2lkeFtjaF1bMV0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIGJhbmRzW2ldLnNjZl9pZHhbY2hdWzFdID0gZ2V0X3NjYWxlX2lkeCgmZ2IsIGJhbmRzW2ldLnNjZl9pZHhbY2hdWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgYmFuZHNbaV0uc2NmX2lkeFtjaF1bMl0gPSBiYW5kc1tpXS5zY2ZfaWR4W2NoXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBiYW5kc1tpXS5zY2ZfaWR4W2NoXVsxXSA9IGJhbmRzW2ldLnNjZl9pZHhbY2hdWzBdOworICAgICAgICAgICAgICAgICAgICBiYW5kc1tpXS5zY2ZfaWR4W2NoXVsyXSA9IGdldF9zY2FsZV9pZHgoJmdiLCBiYW5kc1tpXS5zY2ZfaWR4W2NoXVsxXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgYmFuZHNbaV0uc2NmX2lkeFtjaF1bMl0gPSBiYW5kc1tpXS5zY2ZfaWR4W2NoXVsxXSA9IGJhbmRzW2ldLnNjZl9pZHhbY2hdWzBdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYy0+b2xkRFNDRltjaF1baV0gPSBiYW5kc1tpXS5zY2ZfaWR4W2NoXVsyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBnZXQgcXVhbnRpemVycyAqLworICAgIG1lbXNldChjLT5RLCAwLCBzaXplb2YoYy0+USkpOworICAgIG9mZiA9IDA7CisgICAgZm9yKGkgPSAwOyBpIDwgQkFORFM7IGkrKywgb2ZmICs9IFNBTVBMRVNfUEVSX0JBTkQpCisgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgMjsgY2grKykKKyAgICAgICAgICAgIGlkeF90b19xdWFudChjLCAmZ2IsIGJhbmRzW2ldLnJlc1tjaF0sIGMtPlFbY2hdICsgb2ZmKTsKKworICAgIGZmX21wY19kZXF1YW50aXplX2FuZF9zeW50aChjLCBtYiwgKGludDE2X3QgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGEsIDIpOworICAgIGlmKGxhc3RfZnJhbWUpCisgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gYy0+bGFzdGZyYW1lbGVuOworCisgICAgYml0c191c2VkID0gZ2V0X2JpdHNfY291bnQoJmdiKTsKKyAgICBiaXRzX2F2YWlsID0gYnVmX3NpemUgKiA4OworICAgIGlmICghbGFzdF9mcmFtZSAmJiAoKGJpdHNfYXZhaWwgPCBiaXRzX3VzZWQpIHx8IChiaXRzX3VzZWQgKyAzMiA8PSBiaXRzX2F2YWlsKSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBkZWNvZGluZyBmcmFtZTogdXNlZCAlaSBvZiAlaSBiaXRzXG4iLCBiaXRzX3VzZWQsIGJpdHNfYXZhaWwpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmKGMtPmZyYW1lc190b19za2lwKXsKKyAgICAgICAgYy0+ZnJhbWVzX3RvX3NraXAtLTsKKyAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICByZXR1cm4gYXZwa3QtPnNpemU7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgdm9pZCBtcGM3X2RlY29kZV9mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTVBDQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBtZW1zZXQoYy0+b2xkRFNDRiwgMCwgc2l6ZW9mKGMtPm9sZERTQ0YpKTsKKyAgICBjLT5mcmFtZXNfdG9fc2tpcCA9IDMyOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbXBjN19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1QQ0NvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGF2X2ZyZWVwKCZjLT5iaXRzKTsKKyAgICBjLT5idWZfc2l6ZSA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbXBjN19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcGM3IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTXVzZXBhY2sgU1Y3IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01VU0VQQUNLNywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTVBDQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbXBjN19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBtcGM3X2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBtcGM3X2RlY29kZV9mcmFtZSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBtcGM3X2RlY29kZV9mbHVzaCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBjN2RhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21wYzdkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwOWU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wYzdkYXRhLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBNdXNlcGFjayBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTVBDN0RBVEFfSAorI2RlZmluZSBBVkNPREVDX01QQzdEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdGF0aWMgY29uc3QgaW50OF90IG1wYzdfaWR4MzBbXSA9IHsgLTEsIDAsIDEsLTEsIDAsIDEsLTEsIDAsIDEsLTEsIDAsIDEsLTEsIDAsIDEsLTEsIDAsIDEsLTEsIDAsIDEsLTEsIDAsIDEsLTEsIDAsIDF9Oworc3RhdGljIGNvbnN0IGludDhfdCBtcGM3X2lkeDMxW10gPSB7IC0xLC0xLC0xLCAwLCAwLCAwLCAxLCAxLCAxLC0xLC0xLC0xLCAwLCAwLCAwLCAxLCAxLCAxLC0xLC0xLC0xLCAwLCAwLCAwLCAxLCAxLCAxfTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbXBjN19pZHgzMltdID0geyAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07CitzdGF0aWMgY29uc3QgaW50OF90IG1wYzdfaWR4NTBbXSA9IHsgLTIsLTEsIDAsIDEsIDIsLTIsLTEsIDAsIDEsIDIsLTIsLTEsIDAsIDEsIDIsLTIsLTEsIDAsIDEsIDIsLTIsLTEsIDAsIDEsIDJ9Oworc3RhdGljIGNvbnN0IGludDhfdCBtcGM3X2lkeDUxW10gPSB7IC0yLC0yLC0yLC0yLC0yLC0xLC0xLC0xLC0xLC0xLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyfTsKKworI2RlZmluZSBNUEM3X1NDRklfU0laRSAgNAorI2RlZmluZSBNUEM3X1NDRklfQklUUyAgMworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBjN19zY2ZpW01QQzdfU0NGSV9TSVpFICogMl0gPSB7CisgICAgMHgyLCAzLCAweDEsIDEsIDB4MywgMywgMHgwLCAyCit9OworCisjZGVmaW5lIE1QQzdfRFNDRl9TSVpFIDE2CisjZGVmaW5lIE1QQzdfRFNDRl9CSVRTICA2CitzdGF0aWMgY29uc3QgdWludDhfdCBtcGM3X2RzY2ZbTVBDN19EU0NGX1NJWkUgKiAyXSA9IHsKKyAgICAweDIwLCA2LCAweDA0LCA1LCAweDExLCA1LCAweDFFLCA1LCAweDBELCA0LCAweDAwLCAzLCAweDAzLCAzLCAweDA5LCA0LAorICAgIDB4MDUsIDMsIDB4MDIsIDMsIDB4MEUsIDQsIDB4MDMsIDQsIDB4MUYsIDUsIDB4MDUsIDUsIDB4MjEsIDYsIDB4MEMsIDQKK307CisKKyNkZWZpbmUgTVBDN19IRFJfU0laRSAgMTAKKyNkZWZpbmUgTVBDN19IRFJfQklUUyAgIDkKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYzdfaGRyW01QQzdfSERSX1NJWkUgKiAyXSA9IHsKKyAgICAweDVDLCA4LCAweDJGLCA3LCAweDBBLCA1LCAweDA0LCA0LCAweDAwLCAyLAorICAgIDB4MDEsIDEsIDB4MDMsIDMsIDB4MTYsIDYsIDB4QkIsIDksIDB4QkEsIDkKK307CisKKyNkZWZpbmUgTVBDN19RVUFOVF9WTENfVEFCTEVTIDcKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYzdfcXVhbnRfdmxjX3NpemVzW01QQzdfUVVBTlRfVkxDX1RBQkxFUyAqIDJdID0geworICAgIDI3LCAyNSwgNywgOSwgMTUsIDMxLCA2MworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBjN19xdWFudF92bGNfb2ZmW01QQzdfUVVBTlRfVkxDX1RBQkxFU10gPSB7CisgICAgMCwgMCwgMywgNCwgNywgMTUsIDMxCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgbXBjN19xdWFudF92bGNbTVBDN19RVUFOVF9WTENfVEFCTEVTXVsyXVs2NCAqIDJdID0geworeworICAgIHsKKyAgICAgICAgMHgwMDM2LCAgNiwgMHgwMDA5LCAgNSwgMHgwMDIwLCAgNiwgMHgwMDA1LCAgNSwgMHgwMDBBLCAgNCwgMHgwMDA3LCAgNSwKKyAgICAgICAgMHgwMDM0LCAgNiwgMHgwMDAwLCAgNSwgMHgwMDIzLCAgNiwgMHgwMDBBLCAgNSwgMHgwMDA2LCAgNCwgMHgwMDA0LCAgNSwKKyAgICAgICAgMHgwMDBCLCAgNCwgMHgwMDA3LCAgMywgMHgwMDBDLCAgNCwgMHgwMDAzLCAgNSwgMHgwMDA3LCAgNCwgMHgwMDBCLCAgNSwKKyAgICAgICAgMHgwMDIyLCAgNiwgMHgwMDAxLCAgNSwgMHgwMDM1LCAgNiwgMHgwMDA2LCAgNSwgMHgwMDA5LCAgNCwgMHgwMDAyLCAgNSwKKyAgICAgICAgMHgwMDIxLCAgNiwgMHgwMDA4LCAgNSwgMHgwMDM3LCAgNgorICAgIH0sCisgICAgeworICAgICAgICAweDAwNjcsICA4LCAweDAwM0UsICA3LCAweDAwRTEsICA5LCAweDAwMzcsICA3LCAweDAwMDMsICA0LCAweDAwMzQsICA3LAorICAgICAgICAweDAwNjUsICA4LCAweDAwM0MsICA3LCAweDAwRTMsICA5LCAweDAwMTgsICA2LCAweDAwMDAsICA0LCAweDAwM0QsICA3LAorICAgICAgICAweDAwMDQsICA0LCAweDAwMDEsICAxLCAweDAwMDUsICA0LCAweDAwM0YsICA3LCAweDAwMDEsICA0LCAweDAwM0IsICA3LAorICAgICAgICAweDAwRTIsICA5LCAweDAwMzksICA3LCAweDAwNjQsICA4LCAweDAwMzUsICA3LCAweDAwMDIsICA0LCAweDAwMzYsICA3LAorICAgICAgICAweDAwRTAsICA5LCAweDAwM0EsICA3LCAweDAwNjYsICA4CisgICAgfQorfSwKK3sKKyAgICB7CisgICAgICAgIDB4MDA1OSwgIDcsIDB4MDAyRiwgIDYsIDB4MDAwRiwgIDUsIDB4MDAwMCwgIDUsIDB4MDA1QiwgIDcsIDB4MDAwNCwgIDUsCisgICAgICAgIDB4MDAwNiwgIDQsIDB4MDAwRCwgIDQsIDB4MDAwNCwgIDQsIDB4MDAwNSwgIDUsIDB4MDAxNCwgIDUsIDB4MDAwQywgIDQsCisgICAgICAgIDB4MDAwNCwgIDMsIDB4MDAwRiwgIDQsIDB4MDAwRSwgIDUsIDB4MDAwMywgIDUsIDB4MDAwMywgIDQsIDB4MDAwRSwgIDQsCisgICAgICAgIDB4MDAwNSwgIDQsIDB4MDAwMSwgIDUsIDB4MDA1QSwgIDcsIDB4MDAwMiwgIDUsIDB4MDAxNSwgIDUsIDB4MDAyRSwgIDYsCisgICAgICAgIDB4MDA1OCwgIDcKKyAgICB9LAorICAgIHsKKyAgICAgICAgMHgwMzk5LCAxMCwgMHgwMDcxLCAgNywgMHgwMDMzLCAgNiwgMHgwMEU3LCAgOCwgMHgwMzlBLCAxMCwgMHgwMDY4LCAgNywKKyAgICAgICAgMHgwMDFFLCAgNSwgMHgwMDAwLCAgMywgMHgwMDFELCAgNSwgMHgwMDY5LCAgNywgMHgwMDMyLCAgNiwgMHgwMDAxLCAgMywKKyAgICAgICAgMHgwMDAyLCAgMiwgMHgwMDAzLCAgMywgMHgwMDMxLCAgNiwgMHgwMDZCLCAgNywgMHgwMDFCLCAgNSwgMHgwMDAyLCAgMywKKyAgICAgICAgMHgwMDFGLCAgNSwgMHgwMDcwLCAgNywgMHgwMzk4LCAxMCwgMHgwMDZBLCAgNywgMHgwMDMwLCAgNiwgMHgwMDcyLCAgNywKKyAgICAgICAgMHgwMzlCLCAxMAorICAgIH0KK30sCit7CisgICAgeworICAgICAgICAweDAwMEMsICA0LCAweDAwMDQsICAzLCAweDAwMDAsICAyLCAweDAwMDEsICAyLCAweDAwMDcsICAzLCAweDAwMDUsICAzLCAweDAwMEQsICA0CisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDAwNCwgIDUsIDB4MDAwMywgIDQsIDB4MDAwMiwgIDIsIDB4MDAwMywgIDIsIDB4MDAwMSwgIDIsIDB4MDAwMCwgIDMsIDB4MDAwNSwgIDUKKyAgICB9Cit9LAoreworICAgIHsKKyAgICAgICAgMHgwMDA1LCAgNCwgMHgwMDAwLCAgMywgMHgwMDA0LCAgMywgMHgwMDA2LCAgMywgMHgwMDA3LCAgMywgMHgwMDA1LCAgMywgMHgwMDAzLCAgMywgMHgwMDAxLCAgMywgMHgwMDA0LCAgNAorICAgIH0sCisgICAgeworICAgICAgICAweDAwMDksICA1LCAweDAwMEMsICA0LCAweDAwMDMsICAzLCAweDAwMDAsICAyLCAweDAwMDIsICAyLCAweDAwMDcsICAzLCAweDAwMEQsICA0LCAweDAwMDUsICA0LCAweDAwMDgsICA1CisgICAgfQorfSwKK3sKKyAgICB7CisgICAgICAgIDB4MDAzOSwgIDYsIDB4MDAxNywgIDUsIDB4MDAwOCwgIDQsIDB4MDAwQSwgIDQsIDB4MDAwRCwgIDQsIDB4MDAwMCwgIDMsCisgICAgICAgIDB4MDAwMiwgIDMsIDB4MDAwMywgIDMsIDB4MDAwMSwgIDMsIDB4MDAwRiwgIDQsIDB4MDAwQywgIDQsIDB4MDAwOSwgIDQsCisgICAgICAgIDB4MDAxRCwgIDUsIDB4MDAxNiwgIDUsIDB4MDAzOCwgIDYsCisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MDBFNSwgIDgsIDB4MDAzOCwgIDYsIDB4MDAwNywgIDUsIDB4MDAwMiwgIDQsIDB4MDAwMCwgIDMsIDB4MDAwMywgIDMsCisgICAgICAgIDB4MDAwNSwgIDMsIDB4MDAwNiwgIDMsIDB4MDAwNCwgIDMsIDB4MDAwMiwgIDMsIDB4MDAwRiwgIDQsIDB4MDAxRCwgIDUsCisgICAgICAgIDB4MDAwNiwgIDUsIDB4MDA3MywgIDcsIDB4MDBFNCwgIDgsCisgICAgfSwKK30sCit7CisgICAgeworICAgICAgICAweDAwNDEsICA3LCAweDAwMDYsICA2LCAweDAwMkMsICA2LCAweDAwMkQsICA2LCAweDAwM0IsICA2LCAweDAwMEQsICA1LAorICAgICAgICAweDAwMTEsICA1LCAweDAwMTMsICA1LCAweDAwMTcsICA1LCAweDAwMTUsICA1LCAweDAwMUEsICA1LCAweDAwMUUsICA1LAorICAgICAgICAweDAwMDAsICA0LCAweDAwMDIsICA0LCAweDAwMDUsICA0LCAweDAwMDcsICA0LCAweDAwMDMsICA0LCAweDAwMDQsICA0LAorICAgICAgICAweDAwMUYsICA1LCAweDAwMUMsICA1LCAweDAwMTksICA1LCAweDAwMUIsICA1LCAweDAwMTgsICA1LCAweDAwMTQsICA1LAorICAgICAgICAweDAwMTIsICA1LCAweDAwMEMsICA1LCAweDAwMDIsICA1LCAweDAwM0EsICA2LCAweDAwMjEsICA2LCAweDAwMDcsICA2LAorICAgICAgICAweDAwNDAsICA3CisgICAgfSwKKyAgICB7CisgICAgICAgIDB4MTk0OCwgMTMsIDB4MTk0QSwgMTMsIDB4MDMyOCwgMTAsIDB4MDE5NSwgIDksIDB4MDBDQiwgIDgsIDB4MDA2NiwgIDcsCisgICAgICAgIDB4MDAzMSwgIDYsIDB4MDAwOSwgIDUsIDB4MDAwRiwgIDUsIDB4MDAxRiwgIDUsIDB4MDAwMiwgIDQsIDB4MDAwNiwgIDQsCisgICAgICAgIDB4MDAwOCwgIDQsIDB4MDAwQiwgIDQsIDB4MDAwRCwgIDQsIDB4MDAwMCwgIDMsIDB4MDAwRSwgIDQsIDB4MDAwQSwgIDQsCisgICAgICAgIDB4MDAwOSwgIDQsIDB4MDAwNSwgIDQsIDB4MDAwMywgIDQsIDB4MDAxRSwgIDUsIDB4MDAwRSwgIDUsIDB4MDAwOCwgIDUsCisgICAgICAgIDB4MDAzMCwgIDYsIDB4MDA2NywgIDcsIDB4MDBDOSwgIDgsIDB4MDBDOCwgIDgsIDB4MDY1MywgMTEsIDB4MTk0OSwgMTMsCisgICAgICAgIDB4MTk0QiwgMTMKKyAgICB9Cit9LAoreworICAgIHsKKyAgICAgICAgMHgwMDY3LCAgOCwgMHgwMDk5LCAgOCwgMHgwMEI1LCAgOCwgMHgwMEU5LCAgOCwgMHgwMDQwLCAgNywgMHgwMDQxLCAgNywKKyAgICAgICAgMHgwMDRELCAgNywgMHgwMDUxLCAgNywgMHgwMDVCLCAgNywgMHgwMDcxLCAgNywgMHgwMDcwLCAgNywgMHgwMDE4LCAgNiwKKyAgICAgICAgMHgwMDFELCAgNiwgMHgwMDIzLCAgNiwgMHgwMDI1LCAgNiwgMHgwMDI5LCAgNiwgMHgwMDJDLCAgNiwgMHgwMDJFLCAgNiwKKyAgICAgICAgMHgwMDMzLCAgNiwgMHgwMDMxLCAgNiwgMHgwMDM2LCAgNiwgMHgwMDM3LCAgNiwgMHgwMDM5LCAgNiwgMHgwMDNDLCAgNiwKKyAgICAgICAgMHgwMDAwLCAgNSwgMHgwMDAyLCAgNSwgMHgwMDBBLCAgNSwgMHgwMDA1LCAgNSwgMHgwMDA5LCAgNSwgMHgwMDA2LCAgNSwKKyAgICAgICAgMHgwMDBELCAgNSwgMHgwMDA3LCAgNSwgMHgwMDBCLCAgNSwgMHgwMDBGLCAgNSwgMHgwMDA4LCAgNSwgMHgwMDA0LCAgNSwKKyAgICAgICAgMHgwMDAzLCAgNSwgMHgwMDAxLCAgNSwgMHgwMDNGLCAgNiwgMHgwMDNFLCAgNiwgMHgwMDNELCAgNiwgMHgwMDM1LCAgNiwKKyAgICAgICAgMHgwMDNCLCAgNiwgMHgwMDM0LCAgNiwgMHgwMDMwLCAgNiwgMHgwMDJGLCAgNiwgMHgwMDJCLCAgNiwgMHgwMDJBLCAgNiwKKyAgICAgICAgMHgwMDI3LCAgNiwgMHgwMDI0LCAgNiwgMHgwMDIxLCAgNiwgMHgwMDFDLCAgNiwgMHgwMDc1LCAgNywgMHgwMDY1LCAgNywKKyAgICAgICAgMHgwMDY0LCAgNywgMHgwMDUwLCAgNywgMHgwMDQ1LCAgNywgMHgwMDQ0LCAgNywgMHgwMDMyLCAgNywgMHgwMEU4LCAgOCwKKyAgICAgICAgMHgwMEI0LCAgOCwgMHgwMDk4LCAgOCwgMHgwMDY2LCAgOAorICAgIH0sCisgICAgeworICAgICAgICAweDM3QTQsIDE0LCAweDM3QUQsIDE0LCAweDM3QTYsIDE0LCAweDM3QUUsIDE0LCAweDBERUEsIDEyLCAweDAyRjAsIDEwLAorICAgICAgICAweDAyRjEsIDEwLCAweDAwQTAsICA5LCAweDAwQTIsICA5LCAweDAxQkMsICA5LCAweDAwN0EsICA4LCAweDAwREYsICA4LAorICAgICAgICAweDAwM0MsICA3LCAweDAwNDksICA3LCAweDAwNkUsICA3LCAweDAwMEUsICA2LCAweDAwMTgsICA2LCAweDAwMTksICA2LAorICAgICAgICAweDAwMjIsICA2LCAweDAwMjUsICA2LCAweDAwMzYsICA2LCAweDAwMDMsICA1LCAweDAwMDksICA1LCAweDAwMEIsICA1LAorICAgICAgICAweDAwMTAsICA1LCAweDAwMTMsICA1LCAweDAwMTUsICA1LCAweDAwMTgsICA1LCAweDAwMUEsICA1LCAweDAwMUQsICA1LAorICAgICAgICAweDAwMUYsICA1LCAweDAwMDIsICA0LCAweDAwMDAsICA0LCAweDAwMUUsICA1LCAweDAwMUMsICA1LCAweDAwMTksICA1LAorICAgICAgICAweDAwMTYsICA1LCAweDAwMTQsICA1LCAweDAwMEUsICA1LCAweDAwMEQsICA1LCAweDAwMDgsICA1LCAweDAwMDYsICA1LAorICAgICAgICAweDAwMDIsICA1LCAweDAwMkUsICA2LCAweDAwMjMsICA2LCAweDAwMUYsICA2LCAweDAwMTUsICA2LCAweDAwMEYsICA2LAorICAgICAgICAweDAwNUYsICA3LCAweDAwNDgsICA3LCAweDAwMjksICA3LCAweDAwQkQsICA4LCAweDAwN0IsICA4LCAweDAxNzksICA5LAorICAgICAgICAweDAwQTEsICA5LCAweDAzN0IsIDEwLCAweDAxNDcsIDEwLCAweDAxNDYsIDEwLCAweDBERTgsIDEyLCAweDM3QUYsIDE0LAorICAgICAgICAweDM3QTcsIDE0LCAweDM3QUMsIDE0LCAweDM3QTUsIDE0CisgICAgfQorfQorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTVBDN0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBjOC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBjOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YzY1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGM4LmMKQEAgLTAsMCArMSw0NDYgQEAKKy8qCisgKiBNdXNlcGFjayBTVjggZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVBFRyBBdWRpbyBMYXllciAxLzIgLWxpa2UgY29kZWMgd2l0aCBmcmFtZXMgb2YgMTE1MiBzYW1wbGVzCisgKiBkaXZpZGVkIGludG8gMzIgc3ViYmFuZHMuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RzcC5oIgorCisjaW5jbHVkZSAibXBjLmgiCisjaW5jbHVkZSAibXBjOGRhdGEuaCIKKyNpbmNsdWRlICJtcGM4aHVmZi5oIgorCitzdGF0aWMgVkxDIGJhbmRfdmxjLCBzY2ZpX3ZsY1syXSwgZHNjZl92bGNbMl0sIHJlc192bGNbMl07CitzdGF0aWMgVkxDIHExX3ZsYywgcTJfdmxjWzJdLCBxM192bGNbMl0sIHF1YW50X3ZsY1s0XVsyXSwgcTl1cF92bGM7CisKK3N0YXRpYyBjb25zdCBpbnQgcTNfb2Zmc2V0c1syXSA9IHsgTVBDOF9RM19PRkZTRVQsIE1QQzhfUTRfT0ZGU0VUIH07CitzdGF0aWMgY29uc3QgaW50IHF1YW50X29mZnNldHNbNl0gPSB7IE1QQzhfUTVfT0ZGU0VULCBNUEM4X1E2X09GRlNFVCwgTVBDOF9RN19PRkZTRVQsIE1QQzhfUThfT0ZGU0VUIH07CisKK3N0YXRpYyBpbmxpbmUgaW50IG1wYzhfZGVjX2Jhc2UoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBrLCBpbnQgbikKK3sKKyAgICBpbnQgbGVuID0gbXBjOF9jbmtfbGVuW2stMV1bbi0xXSAtIDE7CisgICAgaW50IGNvZGUgPSBsZW4gPyBnZXRfYml0c19sb25nKGdiLCBsZW4pIDogMDsKKworICAgIGlmIChjb2RlID49IG1wYzhfY25rX2xvc3Rbay0xXVtuLTFdKQorICAgICAgICBjb2RlID0gKChjb2RlIDw8IDEpIHwgZ2V0X2JpdHMxKGdiKSkgLSBtcGM4X2Nua19sb3N0W2stMV1bbi0xXTsKKworICAgIHJldHVybiBjb2RlOworfQorCitzdGF0aWMgaW5saW5lIGludCBtcGM4X2RlY19lbnVtKEdldEJpdENvbnRleHQgKmdiLCBpbnQgaywgaW50IG4pCit7CisgICAgaW50IGJpdHMgPSAwOworICAgIGNvbnN0IHVpbnQzMl90ICogQyA9IG1wYzhfY25rW2stMV07CisgICAgaW50IGNvZGUgPSBtcGM4X2RlY19iYXNlKGdiLCBrLCBuKTsKKworICAgIGRvIHsKKyAgICAgICAgbi0tOworICAgICAgICBpZiAoY29kZSA+PSBDW25dKSB7CisgICAgICAgICAgICBiaXRzIHw9IDEgPDwgbjsKKyAgICAgICAgICAgIGNvZGUgLT0gQ1tuXTsKKyAgICAgICAgICAgIEMgLT0gMzI7CisgICAgICAgICAgICBrLS07CisgICAgICAgIH0KKyAgICB9IHdoaWxlKGsgPiAwKTsKKworICAgIHJldHVybiBiaXRzOworfQorCitzdGF0aWMgaW5saW5lIGludCBtcGM4X2dldF9tb2RfZ29sb21iKEdldEJpdENvbnRleHQgKmdiLCBpbnQgbSkKK3sKKyAgICBpZihtcGM4X2Nua19sZW5bMF1bbV0gPCAxKSByZXR1cm4gMDsKKyAgICByZXR1cm4gbXBjOF9kZWNfYmFzZShnYiwgMSwgbSsxKTsKK30KKworc3RhdGljIGludCBtcGM4X2dldF9tYXNrKEdldEJpdENvbnRleHQgKmdiLCBpbnQgc2l6ZSwgaW50IHQpCit7CisgICAgaW50IG1hc2sgPSAwOworCisgICAgaWYodCAmJiB0ICE9IHNpemUpCisgICAgICAgICBtYXNrID0gbXBjOF9kZWNfZW51bShnYiwgRkZNSU4odCwgc2l6ZSAtIHQpLCBzaXplKTsKKyAgICBpZigodCA8PCAxKSA+IHNpemUpIG1hc2sgPSB+bWFzazsKKworICAgIHJldHVybiBtYXNrOworfQorCitzdGF0aWMgY29uc3QgdWludDE2X3QgdmxjX29mZnNldHNbMTNdID0geworICAgIDAsIDY0MCwgMTE4NCwgMTc0OCwgMjI5OCwgMjQyNiwgMjU1NCwgMzA2NiwgMzU3OCwgNDEwNiwgNDYxOCwgNTE5NiwgNTcwOAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IG1wYzhfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCkKK3sKKyAgICBpbnQgaTsKKyAgICBNUENDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIHN0YXRpYyBpbnQgdmxjX2luaXRpYWxpemVkID0gMDsKKyAgICBpbnQgY2hhbm5lbHM7CisKKyAgICBzdGF0aWMgVkxDX1RZUEUgYmFuZF90YWJsZVs1NDJdWzJdOworICAgIHN0YXRpYyBWTENfVFlQRSBxMV90YWJsZVs1MjBdWzJdOworICAgIHN0YXRpYyBWTENfVFlQRSBxOXVwX3RhYmxlWzUyNF1bMl07CisgICAgc3RhdGljIFZMQ19UWVBFIHNjZmkwX3RhYmxlWzEgPDwgTVBDOF9TQ0ZJMF9CSVRTXVsyXTsKKyAgICBzdGF0aWMgVkxDX1RZUEUgc2NmaTFfdGFibGVbMSA8PCBNUEM4X1NDRkkxX0JJVFNdWzJdOworICAgIHN0YXRpYyBWTENfVFlQRSBkc2NmMF90YWJsZVs1NjBdWzJdOworICAgIHN0YXRpYyBWTENfVFlQRSBkc2NmMV90YWJsZVs1OThdWzJdOworICAgIHN0YXRpYyBWTENfVFlQRSBxM18wX3RhYmxlWzUxMl1bMl07CisgICAgc3RhdGljIFZMQ19UWVBFIHEzXzFfdGFibGVbNTE2XVsyXTsKKyAgICBzdGF0aWMgVkxDX1RZUEUgY29kZXNfdGFibGVbNTcwOF1bMl07CisKKyAgICBpZihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCAyKXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gc21hbGwgZXh0cmFkYXRhIHNpemUgKCVpKSFcbiIsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWVtc2V0KGMtPm9sZERTQ0YsIDAsIHNpemVvZihjLT5vbGREU0NGKSk7CisgICAgYXZfbGZnX2luaXQoJmMtPnJuZCwgMHhERUFEQkVFRik7CisgICAgZmZfbXBhZHNwX2luaXQoJmMtPm1wYWRzcCk7CisKKyAgICBmZl9tcGNfaW5pdCgpOworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGF2Y3R4LT5leHRyYWRhdGEsIDE2KTsKKworICAgIHNraXBfYml0cygmZ2IsIDMpOy8vc2FtcGxlIHJhdGUKKyAgICBjLT5tYXhiYW5kcyA9IGdldF9iaXRzKCZnYiwgNSkgKyAxOworICAgIGlmIChjLT5tYXhiYW5kcyA+PSBCQU5EUykgeworICAgICAgICBhdl9sb2coYXZjdHgsQVZfTE9HX0VSUk9SLCAibWF4YmFuZHMgJWQgdG9vIGhpZ2hcbiIsIGMtPm1heGJhbmRzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGNoYW5uZWxzID0gZ2V0X2JpdHMoJmdiLCA0KSArIDE7CisgICAgaWYgKGNoYW5uZWxzID4gMikgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJNdWx0aWNoYW5uZWwgTVBDIFNWOCIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIGMtPk1TUyA9IGdldF9iaXRzMSgmZ2IpOworICAgIGMtPmZyYW1lcyA9IDEgPDwgKGdldF9iaXRzKCZnYiwgMykgKiAyKTsKKworICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTZQOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IChjaGFubmVscz09MikgPyBBVl9DSF9MQVlPVVRfU1RFUkVPIDogQVZfQ0hfTEFZT1VUX01PTk87CisgICAgYXZjdHgtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisKKyAgICBpZih2bGNfaW5pdGlhbGl6ZWQpIHJldHVybiAwOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSW5pdGluZyBWTENcbiIpOworCisgICAgYmFuZF92bGMudGFibGUgPSBiYW5kX3RhYmxlOworICAgIGJhbmRfdmxjLnRhYmxlX2FsbG9jYXRlZCA9IDU0MjsKKyAgICBpbml0X3ZsYygmYmFuZF92bGMsIE1QQzhfQkFORFNfQklUUywgTVBDOF9CQU5EU19TSVpFLAorICAgICAgICAgICAgIG1wYzhfYmFuZHNfYml0cywgIDEsIDEsCisgICAgICAgICAgICAgbXBjOF9iYW5kc19jb2RlcywgMSwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworCisgICAgcTFfdmxjLnRhYmxlID0gcTFfdGFibGU7CisgICAgcTFfdmxjLnRhYmxlX2FsbG9jYXRlZCA9IDUyMDsKKyAgICBpbml0X3ZsYygmcTFfdmxjLCBNUEM4X1ExX0JJVFMsIE1QQzhfUTFfU0laRSwKKyAgICAgICAgICAgICBtcGM4X3ExX2JpdHMsICAxLCAxLAorICAgICAgICAgICAgIG1wYzhfcTFfY29kZXMsIDEsIDEsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICBxOXVwX3ZsYy50YWJsZSA9IHE5dXBfdGFibGU7CisgICAgcTl1cF92bGMudGFibGVfYWxsb2NhdGVkID0gNTI0OworICAgIGluaXRfdmxjKCZxOXVwX3ZsYywgTVBDOF9ROVVQX0JJVFMsIE1QQzhfUTlVUF9TSVpFLAorICAgICAgICAgICAgIG1wYzhfcTl1cF9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICBtcGM4X3E5dXBfY29kZXMsIDEsIDEsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKworICAgIHNjZmlfdmxjWzBdLnRhYmxlID0gc2NmaTBfdGFibGU7CisgICAgc2NmaV92bGNbMF0udGFibGVfYWxsb2NhdGVkID0gMSA8PCBNUEM4X1NDRkkwX0JJVFM7CisgICAgaW5pdF92bGMoJnNjZmlfdmxjWzBdLCBNUEM4X1NDRkkwX0JJVFMsIE1QQzhfU0NGSTBfU0laRSwKKyAgICAgICAgICAgICBtcGM4X3NjZmkwX2JpdHMsICAxLCAxLAorICAgICAgICAgICAgIG1wYzhfc2NmaTBfY29kZXMsIDEsIDEsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICBzY2ZpX3ZsY1sxXS50YWJsZSA9IHNjZmkxX3RhYmxlOworICAgIHNjZmlfdmxjWzFdLnRhYmxlX2FsbG9jYXRlZCA9IDEgPDwgTVBDOF9TQ0ZJMV9CSVRTOworICAgIGluaXRfdmxjKCZzY2ZpX3ZsY1sxXSwgTVBDOF9TQ0ZJMV9CSVRTLCBNUEM4X1NDRkkxX1NJWkUsCisgICAgICAgICAgICAgbXBjOF9zY2ZpMV9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICBtcGM4X3NjZmkxX2NvZGVzLCAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisKKyAgICBkc2NmX3ZsY1swXS50YWJsZSA9IGRzY2YwX3RhYmxlOworICAgIGRzY2ZfdmxjWzBdLnRhYmxlX2FsbG9jYXRlZCA9IDU2MDsKKyAgICBpbml0X3ZsYygmZHNjZl92bGNbMF0sIE1QQzhfRFNDRjBfQklUUywgTVBDOF9EU0NGMF9TSVpFLAorICAgICAgICAgICAgIG1wYzhfZHNjZjBfYml0cywgIDEsIDEsCisgICAgICAgICAgICAgbXBjOF9kc2NmMF9jb2RlcywgMSwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgIGRzY2ZfdmxjWzFdLnRhYmxlID0gZHNjZjFfdGFibGU7CisgICAgZHNjZl92bGNbMV0udGFibGVfYWxsb2NhdGVkID0gNTk4OworICAgIGluaXRfdmxjKCZkc2NmX3ZsY1sxXSwgTVBDOF9EU0NGMV9CSVRTLCBNUEM4X0RTQ0YxX1NJWkUsCisgICAgICAgICAgICAgbXBjOF9kc2NmMV9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICBtcGM4X2RzY2YxX2NvZGVzLCAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisKKyAgICBxM192bGNbMF0udGFibGUgPSBxM18wX3RhYmxlOworICAgIHEzX3ZsY1swXS50YWJsZV9hbGxvY2F0ZWQgPSA1MTI7CisgICAgZmZfaW5pdF92bGNfc3BhcnNlKCZxM192bGNbMF0sIE1QQzhfUTNfQklUUywgTVBDOF9RM19TSVpFLAorICAgICAgICAgICAgIG1wYzhfcTNfYml0cywgIDEsIDEsCisgICAgICAgICAgICAgbXBjOF9xM19jb2RlcywgMSwgMSwKKyAgICAgICAgICAgICBtcGM4X3EzX3N5bXMsICAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgcTNfdmxjWzFdLnRhYmxlID0gcTNfMV90YWJsZTsKKyAgICBxM192bGNbMV0udGFibGVfYWxsb2NhdGVkID0gNTE2OworICAgIGZmX2luaXRfdmxjX3NwYXJzZSgmcTNfdmxjWzFdLCBNUEM4X1E0X0JJVFMsIE1QQzhfUTRfU0laRSwKKyAgICAgICAgICAgICBtcGM4X3E0X2JpdHMsICAxLCAxLAorICAgICAgICAgICAgIG1wYzhfcTRfY29kZXMsIDEsIDEsCisgICAgICAgICAgICAgbXBjOF9xNF9zeW1zLCAgMSwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworCisgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKXsKKyAgICAgICAgcmVzX3ZsY1tpXS50YWJsZSA9ICZjb2Rlc190YWJsZVt2bGNfb2Zmc2V0c1swK2ldXTsKKyAgICAgICAgcmVzX3ZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSB2bGNfb2Zmc2V0c1sxK2ldIC0gdmxjX29mZnNldHNbMCtpXTsKKyAgICAgICAgaW5pdF92bGMoJnJlc192bGNbaV0sIE1QQzhfUkVTX0JJVFMsIE1QQzhfUkVTX1NJWkUsCisgICAgICAgICAgICAgICAgICZtcGM4X3Jlc19iaXRzW2ldLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgJm1wYzhfcmVzX2NvZGVzW2ldLCAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisKKyAgICAgICAgcTJfdmxjW2ldLnRhYmxlID0gJmNvZGVzX3RhYmxlW3ZsY19vZmZzZXRzWzIraV1dOworICAgICAgICBxMl92bGNbaV0udGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNldHNbMytpXSAtIHZsY19vZmZzZXRzWzIraV07CisgICAgICAgIGluaXRfdmxjKCZxMl92bGNbaV0sIE1QQzhfUTJfQklUUywgTVBDOF9RMl9TSVpFLAorICAgICAgICAgICAgICAgICAmbXBjOF9xMl9iaXRzW2ldLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgJm1wYzhfcTJfY29kZXNbaV0sIDEsIDEsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKworICAgICAgICBxdWFudF92bGNbMF1baV0udGFibGUgPSAmY29kZXNfdGFibGVbdmxjX29mZnNldHNbNCtpXV07CisgICAgICAgIHF1YW50X3ZsY1swXVtpXS50YWJsZV9hbGxvY2F0ZWQgPSB2bGNfb2Zmc2V0c1s1K2ldIC0gdmxjX29mZnNldHNbNCtpXTsKKyAgICAgICAgaW5pdF92bGMoJnF1YW50X3ZsY1swXVtpXSwgTVBDOF9RNV9CSVRTLCBNUEM4X1E1X1NJWkUsCisgICAgICAgICAgICAgICAgICZtcGM4X3E1X2JpdHNbaV0sICAxLCAxLAorICAgICAgICAgICAgICAgICAmbXBjOF9xNV9jb2Rlc1tpXSwgMSwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgICAgICBxdWFudF92bGNbMV1baV0udGFibGUgPSAmY29kZXNfdGFibGVbdmxjX29mZnNldHNbNitpXV07CisgICAgICAgIHF1YW50X3ZsY1sxXVtpXS50YWJsZV9hbGxvY2F0ZWQgPSB2bGNfb2Zmc2V0c1s3K2ldIC0gdmxjX29mZnNldHNbNitpXTsKKyAgICAgICAgaW5pdF92bGMoJnF1YW50X3ZsY1sxXVtpXSwgTVBDOF9RNl9CSVRTLCBNUEM4X1E2X1NJWkUsCisgICAgICAgICAgICAgICAgICZtcGM4X3E2X2JpdHNbaV0sICAxLCAxLAorICAgICAgICAgICAgICAgICAmbXBjOF9xNl9jb2Rlc1tpXSwgMSwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgICAgICBxdWFudF92bGNbMl1baV0udGFibGUgPSAmY29kZXNfdGFibGVbdmxjX29mZnNldHNbOCtpXV07CisgICAgICAgIHF1YW50X3ZsY1syXVtpXS50YWJsZV9hbGxvY2F0ZWQgPSB2bGNfb2Zmc2V0c1s5K2ldIC0gdmxjX29mZnNldHNbOCtpXTsKKyAgICAgICAgaW5pdF92bGMoJnF1YW50X3ZsY1syXVtpXSwgTVBDOF9RN19CSVRTLCBNUEM4X1E3X1NJWkUsCisgICAgICAgICAgICAgICAgICZtcGM4X3E3X2JpdHNbaV0sICAxLCAxLAorICAgICAgICAgICAgICAgICAmbXBjOF9xN19jb2Rlc1tpXSwgMSwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgICAgICBxdWFudF92bGNbM11baV0udGFibGUgPSAmY29kZXNfdGFibGVbdmxjX29mZnNldHNbMTAraV1dOworICAgICAgICBxdWFudF92bGNbM11baV0udGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNldHNbMTEraV0gLSB2bGNfb2Zmc2V0c1sxMCtpXTsKKyAgICAgICAgaW5pdF92bGMoJnF1YW50X3ZsY1szXVtpXSwgTVBDOF9ROF9CSVRTLCBNUEM4X1E4X1NJWkUsCisgICAgICAgICAgICAgICAgICZtcGM4X3E4X2JpdHNbaV0sICAxLCAxLAorICAgICAgICAgICAgICAgICAmbXBjOF9xOF9jb2Rlc1tpXSwgMSwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgIH0KKyAgICB2bGNfaW5pdGlhbGl6ZWQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBjOF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBNUENDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCaXRDb250ZXh0IGdiMiwgKmdiID0gJmdiMjsKKyAgICBpbnQgaSwgaiwgaywgY2gsIGNudCwgcmVzLCB0OworICAgIEJhbmQgKmJhbmRzID0gYy0+YmFuZHM7CisgICAgaW50IG9mZjsKKyAgICBpbnQgbWF4YmFuZCwga2V5ZnJhbWU7CisgICAgaW50IGxhc3RbMl07CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gTVBDX0ZSQU1FX1NJWkU7CisgICAgaWYgKChyZXMgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIGtleWZyYW1lID0gYy0+Y3VyX2ZyYW1lID09IDA7CisKKyAgICBpZihrZXlmcmFtZSl7CisgICAgICAgIG1lbXNldChjLT5RLCAwLCBzaXplb2YoYy0+USkpOworICAgICAgICBjLT5sYXN0X2JpdHNfdXNlZCA9IDA7CisgICAgfQorICAgIGluaXRfZ2V0X2JpdHMoZ2IsIGJ1ZiwgYnVmX3NpemUgKiA4KTsKKyAgICBza2lwX2JpdHMoZ2IsIGMtPmxhc3RfYml0c191c2VkICYgNyk7CisKKyAgICBpZihrZXlmcmFtZSkKKyAgICAgICAgbWF4YmFuZCA9IG1wYzhfZ2V0X21vZF9nb2xvbWIoZ2IsIGMtPm1heGJhbmRzICsgMSk7CisgICAgZWxzZXsKKyAgICAgICAgbWF4YmFuZCA9IGMtPmxhc3RfbWF4X2JhbmQgKyBnZXRfdmxjMihnYiwgYmFuZF92bGMudGFibGUsIE1QQzhfQkFORFNfQklUUywgMik7CisgICAgICAgIGlmKG1heGJhbmQgPiAzMikgbWF4YmFuZCAtPSAzMzsKKyAgICB9CisKKyAgICBpZihtYXhiYW5kID4gYy0+bWF4YmFuZHMgKyAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibWF4YmFuZCAlZCB0b28gbGFyZ2VcbiIsbWF4YmFuZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBjLT5sYXN0X21heF9iYW5kID0gbWF4YmFuZDsKKworICAgIC8qIHJlYWQgc3ViYmFuZCBpbmRleGVzICovCisgICAgaWYobWF4YmFuZCl7CisgICAgICAgIGxhc3RbMF0gPSBsYXN0WzFdID0gMDsKKyAgICAgICAgZm9yKGkgPSBtYXhiYW5kIC0gMTsgaSA+PSAwOyBpLS0peworICAgICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCAyOyBjaCsrKXsKKyAgICAgICAgICAgICAgICBsYXN0W2NoXSA9IGdldF92bGMyKGdiLCByZXNfdmxjW2xhc3RbY2hdID4gMl0udGFibGUsIE1QQzhfUkVTX0JJVFMsIDIpICsgbGFzdFtjaF07CisgICAgICAgICAgICAgICAgaWYobGFzdFtjaF0gPiAxNSkgbGFzdFtjaF0gLT0gMTc7CisgICAgICAgICAgICAgICAgYmFuZHNbaV0ucmVzW2NoXSA9IGxhc3RbY2hdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGMtPk1TUyl7CisgICAgICAgICAgICBpbnQgbWFzazsKKworICAgICAgICAgICAgY250ID0gMDsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IG1heGJhbmQ7IGkrKykKKyAgICAgICAgICAgICAgICBpZihiYW5kc1tpXS5yZXNbMF0gfHwgYmFuZHNbaV0ucmVzWzFdKQorICAgICAgICAgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICAgIHQgPSBtcGM4X2dldF9tb2RfZ29sb21iKGdiLCBjbnQpOworICAgICAgICAgICAgbWFzayA9IG1wYzhfZ2V0X21hc2soZ2IsIGNudCwgdCk7CisgICAgICAgICAgICBmb3IoaSA9IG1heGJhbmQgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICBpZihiYW5kc1tpXS5yZXNbMF0gfHwgYmFuZHNbaV0ucmVzWzFdKXsKKyAgICAgICAgICAgICAgICAgICAgYmFuZHNbaV0ubXNmID0gbWFzayAmIDE7CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPj49IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvcihpID0gbWF4YmFuZDsgaSA8IGMtPm1heGJhbmRzOyBpKyspCisgICAgICAgIGJhbmRzW2ldLnJlc1swXSA9IGJhbmRzW2ldLnJlc1sxXSA9IDA7CisKKyAgICBpZihrZXlmcmFtZSl7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDMyOyBpKyspCisgICAgICAgICAgICBjLT5vbGREU0NGWzBdW2ldID0gYy0+b2xkRFNDRlsxXVtpXSA9IDE7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgbWF4YmFuZDsgaSsrKXsKKyAgICAgICAgaWYoYmFuZHNbaV0ucmVzWzBdIHx8IGJhbmRzW2ldLnJlc1sxXSl7CisgICAgICAgICAgICBjbnQgPSAhIWJhbmRzW2ldLnJlc1swXSArICEhYmFuZHNbaV0ucmVzWzFdIC0gMTsKKyAgICAgICAgICAgIGlmKGNudCA+PSAwKXsKKyAgICAgICAgICAgICAgICB0ID0gZ2V0X3ZsYzIoZ2IsIHNjZmlfdmxjW2NudF0udGFibGUsIHNjZmlfdmxjW2NudF0uYml0cywgMSk7CisgICAgICAgICAgICAgICAgaWYoYmFuZHNbaV0ucmVzWzBdKSBiYW5kc1tpXS5zY2ZpWzBdID0gdCA+PiAoMiAqIGNudCk7CisgICAgICAgICAgICAgICAgaWYoYmFuZHNbaV0ucmVzWzFdKSBiYW5kc1tpXS5zY2ZpWzFdID0gdCAmIDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBtYXhiYW5kOyBpKyspeworICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IDI7IGNoKyspeworICAgICAgICAgICAgaWYoIWJhbmRzW2ldLnJlc1tjaF0pIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZihjLT5vbGREU0NGW2NoXVtpXSl7CisgICAgICAgICAgICAgICAgYmFuZHNbaV0uc2NmX2lkeFtjaF1bMF0gPSBnZXRfYml0cyhnYiwgNykgLSA2OworICAgICAgICAgICAgICAgIGMtPm9sZERTQ0ZbY2hdW2ldID0gMDsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHQgPSBnZXRfdmxjMihnYiwgZHNjZl92bGNbMV0udGFibGUsIE1QQzhfRFNDRjFfQklUUywgMik7CisgICAgICAgICAgICAgICAgaWYodCA9PSA2NCkKKyAgICAgICAgICAgICAgICAgICAgdCArPSBnZXRfYml0cyhnYiwgNik7CisgICAgICAgICAgICAgICAgYmFuZHNbaV0uc2NmX2lkeFtjaF1bMF0gPSAoKGJhbmRzW2ldLnNjZl9pZHhbY2hdWzJdICsgdCAtIDI1KSAmIDB4N0YpIC0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IDI7IGorKyl7CisgICAgICAgICAgICAgICAgaWYoKGJhbmRzW2ldLnNjZmlbY2hdIDw8IGopICYgMikKKyAgICAgICAgICAgICAgICAgICAgYmFuZHNbaV0uc2NmX2lkeFtjaF1baiArIDFdID0gYmFuZHNbaV0uc2NmX2lkeFtjaF1bal07CisgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgdCA9IGdldF92bGMyKGdiLCBkc2NmX3ZsY1swXS50YWJsZSwgTVBDOF9EU0NGMF9CSVRTLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYodCA9PSAzMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSA2NCArIGdldF9iaXRzKGdiLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgYmFuZHNbaV0uc2NmX2lkeFtjaF1baiArIDFdID0gKChiYW5kc1tpXS5zY2ZfaWR4W2NoXVtqXSArIHQgLSAyNSkgJiAweDdGKSAtIDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGkgPSAwLCBvZmYgPSAwOyBpIDwgbWF4YmFuZDsgaSsrLCBvZmYgKz0gU0FNUExFU19QRVJfQkFORCl7CisgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgMjsgY2grKyl7CisgICAgICAgICAgICByZXMgPSBiYW5kc1tpXS5yZXNbY2hdOworICAgICAgICAgICAgc3dpdGNoKHJlcyl7CisgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IFNBTVBMRVNfUEVSX0JBTkQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgYy0+UVtjaF1bb2ZmICsgal0gPSAoYXZfbGZnX2dldCgmYy0+cm5kKSAmIDB4M0ZDKSAtIDUxMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBTQU1QTEVTX1BFUl9CQU5EOyBqICs9IFNBTVBMRVNfUEVSX0JBTkQgLyAyKXsKKyAgICAgICAgICAgICAgICAgICAgY250ID0gZ2V0X3ZsYzIoZ2IsIHExX3ZsYy50YWJsZSwgTVBDOF9RMV9CSVRTLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgdCA9IG1wYzhfZ2V0X21hc2soZ2IsIDE4LCBjbnQpOworICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBTQU1QTEVTX1BFUl9CQU5EIC8gMjsgaysrLCB0IDw8PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgYy0+UVtjaF1bb2ZmICsgaiArIGtdID0gKHQgJiAweDIwMDAwKSA/IChnZXRfYml0czEoZ2IpIDw8IDEpIC0gMSA6IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGNudCA9IDY7Ly8yKm1wYzhfdGhyZXNbcmVzXQorICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IFNBTVBMRVNfUEVSX0JBTkQ7IGogKz0gMyl7CisgICAgICAgICAgICAgICAgICAgIHQgPSBnZXRfdmxjMihnYiwgcTJfdmxjW2NudCA+IDNdLnRhYmxlLCBNUEM4X1EyX0JJVFMsIDIpOworICAgICAgICAgICAgICAgICAgICBjLT5RW2NoXVtvZmYgKyBqICsgMF0gPSBtcGM4X2lkeDUwW3RdOworICAgICAgICAgICAgICAgICAgICBjLT5RW2NoXVtvZmYgKyBqICsgMV0gPSBtcGM4X2lkeDUxW3RdOworICAgICAgICAgICAgICAgICAgICBjLT5RW2NoXVtvZmYgKyBqICsgMl0gPSBtcGM4X2lkeDUyW3RdOworICAgICAgICAgICAgICAgICAgICBjbnQgPSAoY250ID4+IDEpICsgbXBjOF9odWZmcTJbdF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IFNBTVBMRVNfUEVSX0JBTkQ7IGogKz0gMil7CisgICAgICAgICAgICAgICAgICAgIHQgPSBnZXRfdmxjMihnYiwgcTNfdmxjW3JlcyAtIDNdLnRhYmxlLCBNUEM4X1EzX0JJVFMsIDIpICsgcTNfb2Zmc2V0c1tyZXMgLSAzXTsKKyAgICAgICAgICAgICAgICAgICAgYy0+UVtjaF1bb2ZmICsgaiArIDFdID0gdCA+PiA0OworICAgICAgICAgICAgICAgICAgICBjLT5RW2NoXVtvZmYgKyBqICsgMF0gPSAodCAmIDgpID8gKHQgJiAweEYpIC0gMTYgOiAodCAmIDB4Rik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIGNudCA9IDIgKiBtcGM4X3RocmVzW3Jlc107CisgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgU0FNUExFU19QRVJfQkFORDsgaisrKXsKKyAgICAgICAgICAgICAgICAgICAgdCA9IGdldF92bGMyKGdiLCBxdWFudF92bGNbcmVzIC0gNV1bY250ID4gbXBjOF90aHJlc1tyZXNdXS50YWJsZSwgcXVhbnRfdmxjW3JlcyAtIDVdW2NudCA+IG1wYzhfdGhyZXNbcmVzXV0uYml0cywgMikgKyBxdWFudF9vZmZzZXRzW3JlcyAtIDVdOworICAgICAgICAgICAgICAgICAgICBjLT5RW2NoXVtvZmYgKyBqXSA9IHQ7CisgICAgICAgICAgICAgICAgICAgIGNudCA9IChjbnQgPj4gMSkgKyBGRkFCUyhjLT5RW2NoXVtvZmYgKyBqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBTQU1QTEVTX1BFUl9CQU5EOyBqKyspeworICAgICAgICAgICAgICAgICAgICBjLT5RW2NoXVtvZmYgKyBqXSA9IGdldF92bGMyKGdiLCBxOXVwX3ZsYy50YWJsZSwgTVBDOF9ROVVQX0JJVFMsIDIpOworICAgICAgICAgICAgICAgICAgICBpZihyZXMgIT0gOSl7CisgICAgICAgICAgICAgICAgICAgICAgICBjLT5RW2NoXVtvZmYgKyBqXSA8PD0gcmVzIC0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPlFbY2hdW29mZiArIGpdIHw9IGdldF9iaXRzKGdiLCByZXMgLSA5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjLT5RW2NoXVtvZmYgKyBqXSAtPSAoMSA8PCAocmVzIC0gMikpIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmZl9tcGNfZGVxdWFudGl6ZV9hbmRfc3ludGgoYywgbWF4YmFuZCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMpOworCisgICAgYy0+Y3VyX2ZyYW1lKys7CisKKyAgICBjLT5sYXN0X2JpdHNfdXNlZCA9IGdldF9iaXRzX2NvdW50KGdiKTsKKyAgICBpZihnZXRfYml0c19sZWZ0KGdiKSA8IDgpIC8vIHdlIGhhdmUgb25seSBwYWRkaW5nIGxlZnQKKyAgICAgICAgYy0+bGFzdF9iaXRzX3VzZWQgPSBidWZfc2l6ZSA8PCAzOworICAgIGlmKGMtPmN1cl9mcmFtZSA+PSBjLT5mcmFtZXMpCisgICAgICAgIGMtPmN1cl9mcmFtZSA9IDA7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYy0+Y3VyX2ZyYW1lID8gYy0+bGFzdF9iaXRzX3VzZWQgPj4gMyA6IGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIG1wYzhfZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNUENDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjLT5jdXJfZnJhbWUgPSAwOworfQorCitBVkNvZGVjIGZmX21wYzhfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXBjOCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk11c2VwYWNrIFNWOCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NVVNFUEFDSzgsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1QQ0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IG1wYzhfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gbXBjOF9kZWNvZGVfZnJhbWUsCisgICAgLmZsdXNoICAgICAgICAgID0gbXBjOF9kZWNvZGVfZmx1c2gsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfUzE2UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wYzhkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGM4ZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzJiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGM4ZGF0YS5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogTXVzZXBhY2sgU1Y4IGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NUEM4REFUQV9ICisjZGVmaW5lIEFWQ09ERUNfTVBDOERBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbXBjOF9pZHg1MFsxMjVdID0geworICAgIC0yLCAtMSwgMCwgMSwgMiwgLTIsIC0xLCAwLCAxLCAyLCAtMiwgLTEsIDAsIDEsIDIsIC0yLCAtMSwgMCwgMSwgMiwgLTIsIC0xLCAwLCAxLCAyLAorICAgIC0yLCAtMSwgMCwgMSwgMiwgLTIsIC0xLCAwLCAxLCAyLCAtMiwgLTEsIDAsIDEsIDIsIC0yLCAtMSwgMCwgMSwgMiwgLTIsIC0xLCAwLCAxLCAyLAorICAgIC0yLCAtMSwgMCwgMSwgMiwgLTIsIC0xLCAwLCAxLCAyLCAtMiwgLTEsIDAsIDEsIDIsIC0yLCAtMSwgMCwgMSwgMiwgLTIsIC0xLCAwLCAxLCAyLAorICAgIC0yLCAtMSwgMCwgMSwgMiwgLTIsIC0xLCAwLCAxLCAyLCAtMiwgLTEsIDAsIDEsIDIsIC0yLCAtMSwgMCwgMSwgMiwgLTIsIC0xLCAwLCAxLCAyLAorICAgIC0yLCAtMSwgMCwgMSwgMiwgLTIsIC0xLCAwLCAxLCAyLCAtMiwgLTEsIDAsIDEsIDIsIC0yLCAtMSwgMCwgMSwgMiwgLTIsIC0xLCAwLCAxLCAyCit9Oworc3RhdGljIGNvbnN0IGludDhfdCBtcGM4X2lkeDUxWzEyNV0gPSB7CisgICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsCisgICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsCisgICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsCisgICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsCisgICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIKK307CitzdGF0aWMgY29uc3QgaW50OF90IG1wYzhfaWR4NTJbMTI1XSA9IHsKKyAgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMgorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtcGM4X3RocmVzW10gPSB7MCwgMCwgMywgMCwgMCwgMSwgMywgNCwgOH07CitzdGF0aWMgY29uc3QgaW50OF90IG1wYzhfaHVmZnEyWzUqNSo1XSA9IHsKKyAgICA2LCA1LCA0LCA1LCA2LCA1LCA0LCAzLCA0LCA1LCA0LCAzLCAyLCAzLCA0LCA1LCA0LCAzLCA0LCA1LCA2LCA1LCA0LCA1LAorICAgIDYsIDUsIDQsIDMsIDQsIDUsIDQsIDMsIDIsIDMsIDQsIDMsIDIsIDEsIDIsIDMsIDQsIDMsIDIsIDMsIDQsIDUsIDQsIDMsCisgICAgNCwgNSwgNCwgMywgMiwgMywgNCwgMywgMiwgMSwgMiwgMywgMiwgMSwgMCwgMSwgMiwgMywgMiwgMSwgMiwgMywgNCwgMywKKyAgICAyLCAzLCA0LCA1LCA0LCAzLCA0LCA1LCA0LCAzLCAyLCAzLCA0LCAzLCAyLCAxLCAyLCAzLCA0LCAzLCAyLCAzLCA0LCA1LAorICAgIDQsIDMsIDQsIDUsIDYsIDUsIDQsIDUsIDYsIDUsIDQsIDMsIDQsIDUsIDQsIDMsIDIsIDMsIDQsIDUsIDQsIDMsIDQsIDUsCisgICAgNiwgNSwgNCwgNSwgNgorfTsKKworCitzdGF0aWMgY29uc3QgdWludDMyX3QgbXBjOF9jbmtbMTZdWzMyXSA9Cit7CisgICAgezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxfSwKKyAgICB7MCwgMCwgMSwgMywgNiwgMTAsIDE1LCAyMSwgMjgsIDM2LCA0NSwgNTUsIDY2LCA3OCwgOTEsIDEwNSwgMTIwLCAxMzYsIDE1MywgMTcxLCAxOTAsIDIxMCwgMjMxLCAyNTMsIDI3NiwgMzAwLCAzMjUsIDM1MSwgMzc4LCA0MDYsIDQzNSwgNDY1fSwKKyAgICB7MCwgMCwgMCwgMSwgNCwgMTAsIDIwLCAzNSwgNTYsIDg0LCAxMjAsIDE2NSwgMjIwLCAyODYsIDM2NCwgNDU1LCA1NjAsIDY4MCwgODE2LCA5NjksIDExNDAsIDEzMzAsIDE1NDAsIDE3NzEsIDIwMjQsIDIzMDAsIDI2MDAsIDI5MjUsIDMyNzYsIDM2NTQsIDQwNjAsIDQ0OTV9LAorICAgIHswLCAwLCAwLCAwLCAxLCA1LCAxNSwgMzUsIDcwLCAxMjYsIDIxMCwgMzMwLCA0OTUsIDcxNSwgMTAwMSwgMTM2NSwgMTgyMCwgMjM4MCwgMzA2MCwgMzg3NiwgNDg0NSwgNTk4NSwgNzMxNSwgODg1NSwgMTA2MjYsIDEyNjUwLCAxNDk1MCwgMTc1NTAsIDIwNDc1LCAyMzc1MSwgMjc0MDUsIDMxNDY1fSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMSwgNiwgMjEsIDU2LCAxMjYsIDI1MiwgNDYyLCA3OTIsIDEyODcsIDIwMDIsIDMwMDMsIDQzNjgsIDYxODgsIDg1NjgsIDExNjI4LCAxNTUwNCwgMjAzNDksIDI2MzM0LCAzMzY0OSwgNDI1MDQsIDUzMTMwLCA2NTc4MCwgODA3MzAsIDk4MjgwLCAxMTg3NTUsIDE0MjUwNiwgMTY5OTExfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMSwgNywgMjgsIDg0LCAyMTAsIDQ2MiwgOTI0LCAxNzE2LCAzMDAzLCA1MDA1LCA4MDA4LCAxMjM3NiwgMTg1NjQsIDI3MTMyLCAzODc2MCwgNTQyNjQsIDc0NjEzLCAxMDA5NDcsIDEzNDU5NiwgMTc3MTAwLCAyMzAyMzAsIDI5NjAxMCwgMzc2NzQwLCA0NzUwMjAsIDU5Mzc3NSwgNzM2MjgxfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgOCwgMzYsIDEyMCwgMzMwLCA3OTIsIDE3MTYsIDM0MzIsIDY0MzUsIDExNDQwLCAxOTQ0OCwgMzE4MjQsIDUwMzg4LCA3NzUyMCwgMTE2MjgwLCAxNzA1NDQsIDI0NTE1NywgMzQ2MTA0LCA0ODA3MDAsIDY1NzgwMCwgODg4MDMwLCAxMTg0MDQwLCAxNTYwNzgwLCAyMDM1ODAwLCAyNjI5NTc1fSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgOSwgNDUsIDE2NSwgNDk1LCAxMjg3LCAzMDAzLCA2NDM1LCAxMjg3MCwgMjQzMTAsIDQzNzU4LCA3NTU4MiwgMTI1OTcwLCAyMDM0OTAsIDMxOTc3MCwgNDkwMzE0LCA3MzU0NzEsIDEwODE1NzUsIDE1NjIyNzUsIDIyMjAwNzUsIDMxMDgxMDUsIDQyOTIxNDUsIDU4NTI5MjUsIDc4ODg3MjV9LAorICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxMCwgNTUsIDIyMCwgNzE1LCAyMDAyLCA1MDA1LCAxMTQ0MCwgMjQzMTAsIDQ4NjIwLCA5MjM3OCwgMTY3OTYwLCAyOTM5MzAsIDQ5NzQyMCwgODE3MTkwLCAxMzA3NTA0LCAyMDQyOTc1LCAzMTI0NTUwLCA0Njg2ODI1LCA2OTA2OTAwLCAxMDAxNTAwNSwgMTQzMDcxNTAsIDIwMTYwMDc1fSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMTEsIDY2LCAyODYsIDEwMDEsIDMwMDMsIDgwMDgsIDE5NDQ4LCA0Mzc1OCwgOTIzNzgsIDE4NDc1NiwgMzUyNzE2LCA2NDY2NDYsIDExNDQwNjYsIDE5NjEyNTYsIDMyNjg3NjAsIDUzMTE3MzUsIDg0MzYyODUsIDEzMTIzMTEwLCAyMDAzMDAxMCwgMzAwNDUwMTUsIDQ0MzUyMTY1fSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMTIsIDc4LCAzNjQsIDEzNjUsIDQzNjgsIDEyMzc2LCAzMTgyNCwgNzU1ODIsIDE2Nzk2MCwgMzUyNzE2LCA3MDU0MzIsIDEzNTIwNzgsIDI0OTYxNDQsIDQ0NTc0MDAsIDc3MjYxNjAsIDEzMDM3ODk1LCAyMTQ3NDE4MCwgMzQ1OTcyOTAsIDU0NjI3MzAwLCA4NDY3MjMxNX0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEzLCA5MSwgNDU1LCAxODIwLCA2MTg4LCAxODU2NCwgNTAzODgsIDEyNTk3MCwgMjkzOTMwLCA2NDY2NDYsIDEzNTIwNzgsIDI3MDQxNTYsIDUyMDAzMDAsIDk2NTc3MDAsIDE3MzgzODYwLCAzMDQyMTc1NSwgNTE4OTU5MzUsIDg2NDkzMjI1LCAxNDExMjA1MjV9LAorICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxNCwgMTA1LCA1NjAsIDIzODAsIDg1NjgsIDI3MTMyLCA3NzUyMCwgMjAzNDkwLCA0OTc0MjAsIDExNDQwNjYsIDI0OTYxNDQsIDUyMDAzMDAsIDEwNDAwNjAwLCAyMDA1ODMwMCwgMzc0NDIxNjAsIDY3ODYzOTE1LCAxMTk3NTk4NTAsIDIwNjI1MzA3NX0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDE1LCAxMjAsIDY4MCwgMzA2MCwgMTE2MjgsIDM4NzYwLCAxMTYyODAsIDMxOTc3MCwgODE3MTkwLCAxOTYxMjU2LCA0NDU3NDAwLCA5NjU3NzAwLCAyMDA1ODMwMCwgNDAxMTY2MDAsIDc3NTU4NzYwLCAxNDU0MjI2NzUsIDI2NTE4MjUyNX0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDE2LCAxMzYsIDgxNiwgMzg3NiwgMTU1MDQsIDU0MjY0LCAxNzA1NDQsIDQ5MDMxNCwgMTMwNzUwNCwgMzI2ODc2MCwgNzcyNjE2MCwgMTczODM4NjAsIDM3NDQyMTYwLCA3NzU1ODc2MCwgMTU1MTE3NTIwLCAzMDA1NDAxOTV9LAorICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxNywgMTUzLCA5NjksIDQ4NDUsIDIwMzQ5LCA3NDYxMywgMjQ1MTU3LCA3MzU0NzEsIDIwNDI5NzUsIDUzMTE3MzUsIDEzMDM3ODk1LCAzMDQyMTc1NSwgNjc4NjM5MTUsIDE0NTQyMjY3NSwgMzAwNTQwMTk1fQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBjOF9jbmtfbGVuWzE2XVszM10gPQoreworICAgIHswLCAxLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA2fSwKKyAgICB7MCwgMCwgMiwgMywgNCwgNCwgNSwgNSwgNiwgNiwgNiwgNywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgMH0sCisgICAgezAsIDAsIDAsIDIsIDQsIDUsIDYsIDYsIDcsIDcsIDgsIDgsIDksIDksIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMH0sCisgICAgezAsIDAsIDAsIDAsIDMsIDQsIDYsIDcsIDcsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDMsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDB9LAorICAgIHswLCAwLCAwLCAwLCAwLCAwLCAzLCA1LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgNiwgNywgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTUsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQsIDYsIDgsIDksIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxNywgMTgsIDE5LCAxOSwgMjAsIDIxLCAyMSwgMjIsIDIyLCAyMywgMjMsIDIzLCAyNCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQsIDYsIDgsIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDE5LCAyMCwgMjEsIDIxLCAyMiwgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQsIDcsIDksIDEwLCAxMiwgMTMsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMSwgMjIsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNCwgNywgOSwgMTEsIDEzLCAxNCwgMTUsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyMywgMjQsIDI1LCAyNiwgMjYsIDI3LCAyNywgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQsIDcsIDksIDExLCAxMywgMTUsIDE2LCAxNywgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI1LCAyNiwgMjcsIDI4LCAyOCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQsIDcsIDEwLCAxMiwgMTQsIDE1LCAxNywgMTgsIDE5LCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjcsIDI4LCAyOSwgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQsIDcsIDEwLCAxMiwgMTQsIDE2LCAxNywgMTksIDIwLCAyMSwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjgsIDI5LCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNCwgOCwgMTAsIDEyLCAxNCwgMTYsIDE4LCAxOSwgMjEsIDIyLCAyMywgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDUsIDgsIDEwLCAxMywgMTUsIDE3LCAxOCwgMjAsIDIxLCAyMywgMjQsIDI1LCAyNywgMjgsIDI5LCAzMCwgMH0KKworfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IG1wYzhfY25rX2xvc3RbMTZdWzMzXSA9Cit7CisgICAgezAsIDAsIDEsIDAsIDMsIDIsIDEsIDAsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAsIDMxfSwKKyAgICB7MCwgMCwgMSwgMiwgNiwgMSwgMTEsIDQsIDI4LCAxOSwgOSwgNjIsIDUwLCAzNywgMjMsIDgsIDEyMCwgMTAzLCA4NSwgNjYsIDQ2LCAyNSwgMywgMjM2LCAyMTIsIDE4NywgMTYxLCAxMzQsIDEwNiwgNzcsIDQ3LCAxNiwgMH0sCisgICAgezAsIDAsIDAsIDAsIDYsIDEyLCAyOSwgOCwgNDQsIDgsIDkxLCAzNiwgMjI2LCAxNDgsIDU3LCA0NjQsIDM0NCwgMjA4LCA1NSwgOTA4LCA3MTgsIDUwOCwgMjc3LCAyNCwgMTc5NiwgMTQ5NiwgMTE3MSwgODIwLCA0NDIsIDM2LCAzNjk3LCAzMjMyLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMywgMSwgMjksIDU4LCAyLCA0NiwgMTgyLCAxNywgMzA5LCAyMywgNjgzLCAyMjgsIDE3MTYsIDEwMzYsIDIyMCwgMzM0NywgMjIwNywgODc3LCA3NTI5LCA1NzU4LCAzNzM0LCAxNDM0LCAxNTIxOCwgMTIyOTMsIDkwMTcsIDUzNjMsIDEzMDMsIDI5NTc2LCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMiwgMTEsIDgsIDIsIDQsIDUwLCAyMzIsIDc2MSwgNDYsIDEwOTMsIDM4MjQsIDIwMDQsIDc4MTYsIDQ3NTYsIDg4MCwgMTI0MTksIDY0MzQsIDMxODg3LCAyMzAzMiwgMTI0MDYsIDY1MjkyLCA1MDM0MiwgMzI3OTIsIDEyMzE3LCAxMTk2MzgsIDkyMjMzLCA2MDc2OCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDEsIDQsIDQ0LCA0NiwgNTAsIDEwMCwgMzMyLCAxMDkzLCAzMTg3LCAxODQsIDQwMDgsIDE0MjA0LCA1NjM2LCAyNjc3NiwgMTEyNzIsIDU2NDU5LCAzMDEyNSwgMTI3NTQ4LCA4NTA0NCwgMzE5MTQsIDIyODI3OCwgMTQ3NTQ4LCA0OTI2OCwgNDU0ODAxLCAzMTIyOTUsIDE0MjM4NCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDI4LCA4LCAxODIsIDIzMiwgMzMyLCA2NjQsIDE3NTcsIDQ5NDQsIDEzMzIwLCA5NDQsIDE1MTQ4LCA1MzU1MiwgMTQ3OTIsIDkxNjAwLCAxNjk4NywgMTc4MTg0LCA0MzU4OCwgMzkwNzc2LCAxNjA1NDYsIDkxMzExMiwgNTM2MzcyLCA2MTM1MiwgMTU2NDcyOSwgODI4NDQ4LCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNywgMTksIDkxLCAxNywgNzYxLCAxMDkzLCAxNzU3LCAzNTE0LCA4NDU4LCAyMTc3OCwgNTU0OTAsIDUxMDIsIDU4NjU0LCAyMDQ1MTgsIDMzOTc0LCAzMTMxMDUsIDEwMTU1NzcsIDUzNDg3NywgMTk3NDIyOSwgMTA4NjE5OSwgNDA5NjQ2MywgMjUzNTY4MywgNDk5ODgzLCA2MjU4OTE2LCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNiwgOSwgMzYsIDMwOSwgNDYsIDMxODcsIDQ5NDQsIDg0NTgsIDE2OTE2LCAzODY5NCwgOTQxODQsIDIzMDM1OCwgMjY4NjgsIDIzMTM4NiwgNzg5NjQ4LCA1NDE3NywgMTA2OTc1NCwgMzcwMTc4MywgMTQ4MTcwOCwgNjc2MjIxMSwgMjQ3MDA2NiwgMTMzOTQzNTcsIDU1MDU2MzIsIDB9LAorICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA1LCA2MiwgMjI2LCAyMywgMTA5MywgMTg0LCAxMzMyMCwgMjE3NzgsIDM4Njk0LCA3NzM4OCwgMTcxNTcyLCA0MDE5MzAsIDk1MzA4NiwgMTM1ODk2LCA5MjU1NDQsIDMwNzY4NzMsIDgzNDA5MzEsIDM2NTQxMDYsIDEzNTI0NDIyLCAzNTA5NDE3LCAyMjc1NjY5OSwgMjU5NjYyNCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQsIDUwLCAxNDgsIDY4MywgMzgyNCwgNDAwOCwgOTQ0LCA1NTQ5MCwgOTQxODQsIDE3MTU3MiwgMzQzMTQ0LCA3NDUwNzQsIDE2OTgxNjAsIDM5MzEyMDgsIDY2MjQ0OCwgMzczOTMyMSwgMTIwODAyNTIsIDMyNTExNTc0LCAxMjQ4MTU2NCwgNDk1NDU0MTMsIDUxOTMyNDgsIDB9LAorICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzLCAzNywgNTcsIDIyOCwgMjAwNCwgMTQyMDQsIDE1MTQ4LCA1MTAyLCAyMzAzNTgsIDQwMTkzMCwgNzQ1MDc0LCAxNDkwMTQ4LCAzMTg4MzA4LCA3MTE5NTE2LCAxNjE3MDU3MiwgMzEzMjY3NywgMTUyMTI5MjksIDQ3NzI0NTAzLCAxMjczMTQ5MzEsIDQyNjQyNjE2LCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMjMsIDQ2NCwgMTcxNiwgNzgxNiwgNTYzNiwgNTM1NTIsIDU4NjU0LCAyNjg2OCwgOTUzMDg2LCAxNjk4MTYwLCAzMTg4MzA4LCA2Mzc2NjE2LCAxMzQ5NjEzMiwgMjk2NjY3MDQsIDY2MzUzODEzLCAxNDQ1Nzg3OCwgNjIxODIzODEsIDE4OTQ5NzMxMiwgMH0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDgsIDM0NCwgMTAzNiwgNDc1NiwgMjY3NzYsIDE0NzkyLCAyMDQ1MTgsIDIzMTM4NiwgMTM1ODk2LCAzOTMxMjA4LCA3MTE5NTE2LCAxMzQ5NjEzMiwgMjY5OTIyNjQsIDU2NjU4OTY4LCAxMjMwMTI3ODEsIDMyNTI5MzEsIDY1NDM1MzEyLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTIwLCAyMDgsIDIyMCwgODgwLCAxMTI3MiwgOTE2MDAsIDMzOTc0LCA3ODk2NDgsIDkyNTU0NCwgNjYyNDQ4LCAxNjE3MDU3MiwgMjk2NjY3MDQsIDU2NjU4OTY4LCAxMTMzMTc5MzYsIDIzNjMzMDcxNywgNTA4MDE5MTA0LCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTUsIDEwMywgNTUsIDMzNDcsIDEyNDE5LCA1NjQ1OSwgMTY5ODcsIDMxMzEwNSwgNTQxNzcsIDMwNzY4NzMsIDM3MzkzMjEsIDMxMzI2NzcsIDY2MzUzODEzLCAxMjMwMTI3ODEsIDIzNjMzMDcxNywgMH0KK307CisKKyNlbmRpZiAvKiBBVkNPREVDX01QQzhEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wYzhodWZmLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGM4aHVmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTEwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGM4aHVmZi5oCkBAIC0wLDAgKzEsNTc4IEBACisvKgorICogTXVzZXBhY2sgU1Y4IGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NUEM4SFVGRl9ICisjZGVmaW5lIEFWQ09ERUNfTVBDOEhVRkZfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgTVBDOF9CQU5EU19TSVpFIDMzCisjZGVmaW5lIE1QQzhfQkFORFNfQklUUyA5CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYzhfYmFuZHNfY29kZXNbTVBDOF9CQU5EU19TSVpFXSA9IHsKKyAweDAxLCAweDAxLCAweDAyLCAweDAyLCAweDAzLCAweDAzLCAweDA0LCAweDA0LAorIDB4MDUsIDB4MDYsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MDUsCisgMHgwNiwgMHgwNywgMHgwOCwgMHgwMSwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwNywKKyAweDA4LCAweDA5LCAweDA2LCAweDA3LCAweDA1LCAweDA1LCAweDAzLCAweDAzLAorIDB4MDEsCit9Oworc3RhdGljIGNvbnN0IGludDhfdCBtcGM4X2JhbmRzX2JpdHNbTVBDOF9CQU5EU19TSVpFXSA9IHsKKyAgMSwgIDMsICA1LCAgNiwgIDcsICA4LCAgOCwgIDksCisgMTAsIDExLCAxMiwgMTIsIDEyLCAxMywgMTIsIDEyLAorIDEyLCAxMiwgMTIsIDEzLCAxMiwgMTIsIDEyLCAxMSwKKyAxMSwgMTEsIDEwLCAxMCwgIDksICA4LCAgNiwgIDUsCisgIDIsCit9OworCisjZGVmaW5lIE1QQzhfU0NGSTBfU0laRSA0CisjZGVmaW5lIE1QQzhfU0NGSTBfQklUUyAzCisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYzhfc2NmaTBfY29kZXNbTVBDOF9TQ0ZJMF9TSVpFXSA9IHsKKyAweDAwLCAweDAxLCAweDAxLCAweDAxLAorfTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbXBjOF9zY2ZpMF9iaXRzW01QQzhfU0NGSTBfU0laRV0gPSB7CisgIDMsICAzLCAgMSwgIDIsCit9OworCisjZGVmaW5lIE1QQzhfU0NGSTFfU0laRSAxNgorI2RlZmluZSBNUEM4X1NDRkkxX0JJVFMgNworCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGM4X3NjZmkxX2NvZGVzW01QQzhfU0NGSTFfU0laRV0gPSB7CisgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMywgMHgwMSwgMHgwMywgMHgwNCwgMHgwNSwKKyAweDA0LCAweDA2LCAweDAyLCAweDAyLCAweDA1LCAweDA3LCAweDAzLCAweDAzLAorCit9Oworc3RhdGljIGNvbnN0IGludDhfdCBtcGM4X3NjZmkxX2JpdHNbTVBDOF9TQ0ZJMV9TSVpFXSA9IHsKKyAgNiwgIDcsICA2LCAgNiwgIDcsICA1LCAgNSwgIDUsCisgIDYsICA1LCAgMiwgIDMsICA2LCAgNSwgIDMsICAyLAorCit9OworCisjZGVmaW5lIE1QQzhfRFNDRjBfU0laRSA2NAorI2RlZmluZSBNUEM4X0RTQ0YwX0JJVFMgOQorCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGM4X2RzY2YwX2NvZGVzW01QQzhfRFNDRjBfU0laRV0gPSB7CisgMHgwMywgMHgwNCwgMHgwNSwgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNSwgMHgwNiwKKyAweDA3LCAweDA4LCAweDA5LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDA3LAorIDB4MDgsIDB4MDksIDB4MEEsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MDYsCisgMHgwNywgMHgwNSwgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNiwgMHgwNywgMHgwQSwKKyAweDA4LCAweDA1LCAweDA2LCAweDA3LCAweDA5LCAweDA3LCAweDA4LCAweDA5LAorIDB4MEIsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEIsCisgMHgwQywgMHgwRCwgMHgwNywgMHgwOCwgMHgwOSwgMHgwNiwgMHgwNywgMHgwMywKKyAweDA0LCAweDA1LCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAorfTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbXBjOF9kc2NmMF9iaXRzW01QQzhfRFNDRjBfU0laRV0gPSB7CisgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTAsIDEwLAorIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOCwKKyAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDYsCisgIDYsICA1LCAgNCwgIDQsICA1LCAgNCwgIDQsIDEwLAorICA0LCAgMywgIDMsICAzLCAgNCwgIDUsICA2LCAgNiwKKyAgNywgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgMTAsCisgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEzLAorIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKworfTsKKworI2RlZmluZSBNUEM4X0RTQ0YxX1NJWkUgNjUKKyNkZWZpbmUgTVBDOF9EU0NGMV9CSVRTIDkKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBjOF9kc2NmMV9jb2Rlc1tNUEM4X0RTQ0YxX1NJWkVdID0geworIDB4MDAsIDB4MDMsIDB4MDQsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDUsIDB4MDYsCisgMHgwNywgMHgwOCwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwNywgMHgwOCwKKyAweDA5LCAweDBBLCAweDA3LCAweDA4LCAweDA5LCAweDA2LCAweDA3LCAweDA1LAorIDB4MDYsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDQsIDB4MDMsIDB4MDQsIDB4MDUsCisgMHgwNiwgMHgwNywgMHgwNSwgMHgwNCwgMHgwNSwgMHgwNSwgMHgwNywgMHgwOCwKKyAweDA5LCAweDBBLCAweDBCLCAweDBCLCAweDBDLCAweDBELCAweDBCLCAweDBDLAorIDB4MEQsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MDcsIDB4MDgsIDB4MDksCisgMHgwNSwgMHgwNiwgMHgwNywgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKKyAweDBELAorfTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbXBjOF9kc2NmMV9iaXRzW01QQzhfRFNDRjFfU0laRV0gPSB7CisgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTIsIDEyLAorIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwKKyAxMCwgMTAsICA5LCAgOSwgIDksICA4LCAgOCwgIDcsCisgIDcsICA2LCAgNSwgIDQsICA0LCAgMywgIDMsICAzLAorICAzLCAgMywgIDQsICA1LCAgNSwgIDYsICA3LCAgOCwKKyAgOCwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsCisgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAorIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAxMiwKK307CisKKyNkZWZpbmUgTVBDOF9SRVNfU0laRSAxNworI2RlZmluZSBNUEM4X1JFU19CSVRTIDkKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBjOF9yZXNfY29kZXNbMl1bTVBDOF9SRVNfU0laRV0gPSB7CisgIHsKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDEsCisgICAgMHgwMSwKKyAgfSwKKyAgeworICAgIDB4MDEsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKyAgICAweDAzLAorICB9Cit9Oworc3RhdGljIGNvbnN0IGludDhfdCBtcGM4X3Jlc19iaXRzWzJdW01QQzhfUkVTX1NJWkVdID0geworICB7CisgICAgIDEsICAyLCAgNCwgIDUsICA2LCAgNywgIDksIDEwLAorICAgIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE2LCAgOCwKKyAgICAgMywKKyAgfSwKKyAgeworICAgICAyLCAgMiwgIDMsICA1LCAgNywgIDgsIDEwLCAxMiwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTEsICA5LCAgNiwgIDQsCisgICAgIDIsCisgIH0KK307CisKKyNkZWZpbmUgTVBDOF9RMV9TSVpFIDE5CisjZGVmaW5lIE1QQzhfUTFfQklUUyA5CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYzhfcTFfY29kZXNbTVBDOF9RMV9TSVpFXSA9IHsKKyAweDAxLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgMHgwMSwgMHgwMCwgMHgwMSwKK307CitzdGF0aWMgY29uc3QgaW50OF90IG1wYzhfcTFfYml0c1tNUEM4X1ExX1NJWkVdID0geworICA2LCAgNCwgIDQsICAzLCAgMywgIDMsICAzLCAgMywKKyAgNCwgIDQsICA0LCAgNSwgIDcsICA4LCAgOSwgMTAsCisgMTEsIDEyLCAxMiwKK307CisKKyNkZWZpbmUgTVBDOF9ROVVQX1NJWkUgMjU2CisjZGVmaW5lIE1QQzhfUTlVUF9CSVRTIDkKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBjOF9xOXVwX2NvZGVzW01QQzhfUTlVUF9TSVpFXSA9IHsKKyAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA1LCAweDA2LCAweDA3LAorIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgMHgxMCwgMHgxMSwgMHgxMiwgMHgyNiwgMHgyNywgMHgxMywgMHgxNCwgMHgxNSwKKyAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELAorIDB4MUUsIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsCisgMHgyOCwgMHgyNiwgMHgyOSwgMHgyQSwgMHgyQiwgMHgyQywgMHgyRCwgMHgyRSwKKyAweDJGLCAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LAorIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4M0IsIDB4M0MsIDB4M0QsIDB4M0UsCisgMHgzRiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwKKyAweDQ3LCAweDQ4LCAweDQ5LCAweDRBLCAweDRCLCAweDRDLCAweDRELCAweDRFLAorIDB4NEYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsCisgMHg1NywgMHg1OCwgMHg1OSwgMHg1QSwgMHg1QiwgMHg1QywgMHg1RCwgMHg1RSwKKyAweDVGLCAweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LAorIDB4NjcsIDB4NjgsIDB4NjksIDB4NkEsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksCisgMHg1QSwgMHg1QiwgMHg1QywgMHg1RCwgMHg1RSwgMHg1RiwgMHg2MCwgMHg2MSwKKyAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDNFLAorIDB4M0YsIDB4NjksIDB4NkEsIDB4NkIsIDB4NkMsIDB4NkQsIDB4NkUsIDB4NkYsCisgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywKKyAweDc4LCAweDc5LCAweDdBLCAweDZCLCAweDdCLCAweDZDLCAweDZELCAweDZFLAorIDB4NkYsIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsCisgMHg3NywgMHg3OCwgMHg3OSwgMHg3QSwgMHg3QiwgMHg3QywgMHg3RCwgMHg3RSwKKyAweDdGLCAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LAorIDB4ODcsIDB4ODgsIDB4ODksIDB4OEEsIDB4OEIsIDB4OEMsIDB4OEQsIDB4OEUsCisgMHg4RiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwKKyAweDk3LCAweDk4LCAweDk5LCAweDlBLCAweDlCLCAweDlDLCAweDlELCAweDlFLAorIDB4OUYsIDB4QTAsIDB4QTEsIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUsIDB4QTYsCisgMHhBNywgMHhBOCwgMHhBOSwgMHhBQSwgMHhBQiwgMHgyNywgMHgyOCwgMHgyOSwKKyAweDJBLCAweDJCLCAweDJDLCAweDJELCAweDJFLCAweDJGLCAweDMwLCAweDMxLAorIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksCisgMHgzQSwgMHgzQiwgMHgzQywgMHgzRCwgMHgzRSwgMHgzRiwgMHg0MCwgMHg0MSwKKyAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LAorIDB4NEEsIDB4NEIsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MDAsIDB4MDEsCit9Oworc3RhdGljIGNvbnN0IGludDhfdCBtcGM4X3E5dXBfYml0c1tNUEM4X1E5VVBfU0laRV0gPSB7CisgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LAorICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgOSwgIDksICA5LCAgOCwgIDgsICA5LCAgOSwgIDksCisgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAorICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgOCwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywKKyAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsCisgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA2LAorICA2LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsCisgIDcsICA3LCAgNywgIDgsICA3LCAgOCwgIDgsICA4LAorICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksCisgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAorICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAorICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwKK307CisKKyNkZWZpbmUgTVBDOF9RMl9TSVpFIDEyNQorI2RlZmluZSBNUEM4X1EyX0JJVFMgOQorCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGM4X3EyX2NvZGVzWzJdW01QQzhfUTJfU0laRV0gPSB7Cit7CisgMHgwMiwgMHgwMywgMHgwRiwgMHgwNCwgMHgwMCwgMHgwNSwgMHgwQywgMHgxMiwKKyAweDBELCAweDA2LCAweDA3LCAweDEzLCAweDE1LCAweDE0LCAweDA4LCAweDA5LAorIDB4MEUsIDB4MTUsIDB4MEYsIDB4MEEsIDB4MDMsIDB4MEIsIDB4MTAsIDB4MEMsCisgMHgwMSwgMHgwRCwgMHgxMCwgMHgxNiwgMHgxMSwgMHgwRSwgMHgxMiwgMHgwRiwKKyAweDEwLCAweDE2LCAweDEzLCAweDE3LCAweDExLCAweDA4LCAweDEyLCAweDE4LAorIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTcsIDB4MTUsIDB4MEYsIDB4MTYsIDB4MTksCisgMHgxNywgMHgxMCwgMHgxMSwgMHgxQSwgMHgxOCwgMHgxQiwgMHgxMiwgMHgxQywKKyAweDE1LCAweDA5LCAweDE2LCAweDFELCAweDE5LCAweDBBLCAweDA3LCAweDBCLAorIDB4MUEsIDB4MUUsIDB4MTcsIDB4MEMsIDB4MTgsIDB4MUYsIDB4MTMsIDB4MjAsCisgMHgxQiwgMHgyMSwgMHgxNCwgMHgxMSwgMHgxOCwgMHgyMiwgMHgxOSwgMHgxMiwKKyAweDFBLCAweDE5LCAweDFBLCAweDFCLCAweDFCLCAweDIzLCAweDFDLCAweDBELAorIDB4MUQsIDB4MjQsIDB4MUMsIDB4MUMsIDB4MUUsIDB4MUYsIDB4MUQsIDB4MTMsCisgMHgxRSwgMHgyNSwgMHgxRiwgMHgxNCwgMHgwMiwgMHgxNSwgMHgxNSwgMHgxNiwKKyAweDA0LCAweDE3LCAweDIwLCAweDI2LCAweDIxLCAweDE4LCAweDE2LCAweDI3LAorIDB4MUQsIDB4MjgsIDB4MTksIDB4MUEsIDB4MjIsIDB4MjksIDB4MjMsIDB4MUIsCisgMHgwMywgMHgxQywgMHgxNywgMHgxRCwgMHgwNSwKK30sCit7CisgMHgwMiwgMHgwMywgMHgwRiwgMHgwNCwgMHgwMCwgMHgwNSwgMHgwQywgMHgwRCwKKyAweDBFLCAweDA2LCAweDA3LCAweDBGLCAweDFFLCAweDEwLCAweDEwLCAweDA4LAorIDB4MTEsIDB4MTIsIDB4MTMsIDB4MDksIDB4MDMsIDB4MEEsIDB4MTEsIDB4MEIsCisgMHgwMSwgMHgwQywgMHgxNCwgMHgxNSwgMHgxNiwgMHgwRCwgMHgxNywgMHgxMiwKKyAweDBFLCAweDEzLCAweDE4LCAweDE5LCAweDE0LCAweDBGLCAweDEwLCAweDFBLAorIDB4MUIsIDB4MTUsIDB4MTEsIDB4MTYsIDB4MUMsIDB4MEUsIDB4MUQsIDB4MUUsCisgMHgxRiwgMHgwRiwgMHgxMiwgMHgyMCwgMHgxRiwgMHgyMSwgMHgxMywgMHgyMiwKKyAweDEyLCAweDEzLCAweDE0LCAweDIzLCAweDIwLCAweDE1LCAweDBGLCAweDE2LAorIDB4MjEsIDB4MjQsIDB4MTcsIDB4MTgsIDB4MTksIDB4MjUsIDB4MTQsIDB4MjYsCisgMHgyMiwgMHgyNywgMHgxNSwgMHgxMCwgMHgyOCwgMHgyOSwgMHgyQSwgMHgxMSwKKyAweDJCLCAweDE3LCAweDFBLCAweDE4LCAweDJDLCAweDJELCAweDFCLCAweDFDLAorIDB4MTksIDB4MkUsIDB4MkYsIDB4MUEsIDB4MUQsIDB4MUIsIDB4MzAsIDB4MTIsCisgMHgzMSwgMHgzMiwgMHgzMywgMHgxMywgMHgwMiwgMHgxNCwgMHgxNSwgMHgxNiwKKyAweDA0LCAweDE3LCAweDM0LCAweDM1LCAweDM2LCAweDE4LCAweDE2LCAweDM3LAorIDB4MjMsIDB4MzgsIDB4MTksIDB4MUEsIDB4MzksIDB4M0EsIDB4M0IsIDB4MUIsCisgMHgwMywgMHgxQywgMHgxNywgMHgxRCwgMHgwNSwKK30KK307CitzdGF0aWMgY29uc3QgaW50OF90IG1wYzhfcTJfYml0c1syXVtNUEM4X1EyX1NJWkVdID0geworeworIDEyLCAxMSwgMTAsIDExLCAxMywgMTEsICA5LCAgOCwKKyAgOSwgMTEsIDExLCAgOCwgIDcsICA4LCAxMSwgMTEsCisgIDksICA4LCAgOSwgMTEsIDEyLCAxMSwgMTAsIDExLAorIDEzLCAxMSwgIDksICA4LCAgOSwgMTEsICA5LCAgNiwKKyAgNiwgIDcsICA5LCAgOCwgIDYsICA0LCAgNiwgIDgsCisgIDksICA2LCAgNiwgIDcsICA5LCAxMSwgIDksICA4LAorICA5LCAxMSwgMTAsICA4LCAgNywgIDgsIDEwLCAgOCwKKyAgNiwgIDQsICA2LCAgOCwgIDcsICA0LCAgMywgIDQsCisgIDcsICA4LCAgNiwgIDQsICA2LCAgOCwgMTAsICA4LAorICA3LCAgOCwgMTAsIDExLCAgOSwgIDgsICA5LCAxMSwKKyAgOSwgIDYsICA2LCAgNiwgIDksICA4LCAgNiwgIDQsCisgIDYsICA4LCAgOSwgIDcsICA2LCAgNiwgIDksIDExLAorICA5LCAgOCwgIDksIDExLCAxMywgMTEsIDEwLCAxMSwKKyAxMiwgMTEsICA5LCAgOCwgIDksIDExLCAxMCwgIDgsCisgIDcsICA4LCAxMSwgMTEsICA5LCAgOCwgIDksIDExLAorIDEzLCAxMSwgMTAsIDExLCAxMiwKK30sCit7CisgMTEsIDEwLCAgOSwgMTAsIDEyLCAxMCwgIDgsICA4LAorICA4LCAxMCwgMTAsICA4LCAgNywgIDgsICA5LCAxMCwKKyAgOCwgIDgsICA4LCAxMCwgMTEsIDEwLCAgOSwgMTAsCisgMTIsIDEwLCAgOCwgIDgsICA4LCAxMCwgIDgsICA2LAorICA1LCAgNiwgIDgsICA4LCAgNiwgIDUsICA1LCAgOCwKKyAgOCwgIDYsICA1LCAgNiwgIDgsIDEwLCAgOCwgIDgsCisgIDgsIDEwLCAgOSwgIDgsICA3LCAgOCwgIDksICA4LAorICA1LCAgNSwgIDUsICA4LCAgNywgIDUsICA0LCAgNSwKKyAgNywgIDgsICA1LCAgNSwgIDUsICA4LCAgOSwgIDgsCisgIDcsICA4LCAgOSwgMTAsICA4LCAgOCwgIDgsIDEwLAorICA4LCAgNiwgIDUsICA2LCAgOCwgIDgsICA1LCAgNSwKKyAgNiwgIDgsICA4LCAgNiwgIDUsICA2LCAgOCwgMTAsCisgIDgsICA4LCAgOCwgMTAsIDEyLCAxMCwgMTAsIDEwLAorIDExLCAxMCwgIDgsICA4LCAgOCwgMTAsICA5LCAgOCwKKyAgNywgIDgsIDEwLCAxMCwgIDgsICA4LCAgOCwgMTAsCisgMTIsIDEwLCAgOSwgMTAsIDExLAorfQorfTsKKworI2RlZmluZSBNUEM4X1EzX1NJWkUgNDkKKyNkZWZpbmUgTVBDOF9RM19CSVRTIDkKKyNkZWZpbmUgTVBDOF9RM19PRkZTRVQgLTQ4CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYzhfcTNfY29kZXNbTVBDOF9RM19TSVpFXSA9IHsKKyAweDA3LCAweDBELCAweDBDLCAweDBCLCAweDBBLCAweDA5LCAweDA4LCAweDBGLAorIDB4MEUsIDB4MEQsIDB4MEMsIDB4MEIsIDB4MEEsIDB4MTMsIDB4MTIsIDB4MTEsCisgMHgxMCwgMHgwRiwgMHgwRSwgMHgwRCwgMHgwQywgMHgwQiwgMHgwQSwgMHgwOSwKKyAweDExLCAweDEwLCAweDBGLCAweDBFLCAweDBELCAweDBDLCAweDBCLCAweDBBLAorIDB4MDksIDB4MDgsIDB4MDcsIDB4MDYsIDB4MDUsIDB4MDksIDB4MDgsIDB4MDcsCisgMHgwNiwgMHgwNSwgMHgwNCwgMHgwMywgMHgwMiwgMHgwMywgMHgwMiwgMHgwMSwKKyAweDAwLAorfTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbXBjOF9xM19iaXRzW01QQzhfUTNfU0laRV0gPSB7CisgIDMsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LAorICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwKKyAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsCisgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAorICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwKKyAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksCisgIDksCit9Oworc3RhdGljIGNvbnN0IGludDhfdCBtcGM4X3EzX3N5bXNbTVBDOF9RM19TSVpFXSA9IHsKKyAgIDQ4LCAgICA2NSwgICAgNjQsICAgIDQ5LCAgICA2MywgICAgMzIsICAgIDQ3LCAgICA4MCwKKyAgIDc5LCAgICA1MCwgICAgNjIsICAgIDMzLCAgICAxNiwgICAgODIsICAgIDgxLCAgICA5NSwKKyAgIDk0LCAgICA2NiwgICAgNzgsICAgIDM0LCAgICA0NiwgICAgMTcsICAgIDMxLCAgICAzMCwKKyAgIDk3LCAgICA5NiwgICAxMTEsICAgIDY3LCAgICA3NywgICAgNTEsICAgIDYxLCAgICAzNSwKKyAgIDQ1LCAgICAxOCwgICAgIDEsICAgICAwLCAgICAxNSwgICAgOTgsICAgMTEwLCAgICA4MywKKyAgIDkzLCAgICAxOSwgICAgMjksICAgICAyLCAgICAxNCwgICAgOTksICAgMTA5LCAgICAgMywKKyAgIDEzLAorfTsKKworI2RlZmluZSBNUEM4X1E0X1NJWkUgODEKKyNkZWZpbmUgTVBDOF9RNF9CSVRTIDkKKyNkZWZpbmUgTVBDOF9RNF9PRkZTRVQgLTY0CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYzhfcTRfY29kZXNbTVBDOF9RNF9TSVpFXSA9IHsKKyAweDBGLCAweDFELCAweDFDLCAweDFCLCAweDFBLCAweDE5LCAweDE4LCAweDE3LAorIDB4MTYsIDB4MTUsIDB4MTQsIDB4MTMsIDB4MTIsIDB4MjMsIDB4MjIsIDB4MjEsCisgMHgyMCwgMHgxRiwgMHgxRSwgMHgxRCwgMHgxQywgMHgxQiwgMHgxQSwgMHgxOSwKKyAweDE4LCAweDE3LCAweDE2LCAweDE1LCAweDE0LCAweDEzLCAweDEyLCAweDExLAorIDB4MTAsIDB4MEYsIDB4MEUsIDB4MEQsIDB4MTksIDB4MTgsIDB4MTcsIDB4MTYsCisgMHgxNSwgMHgxNCwgMHgxMywgMHgxMiwgMHgxMSwgMHgxMCwgMHgwRiwgMHgwRSwKKyAweDBELCAweDBDLCAweDE3LCAweDE2LCAweDE1LCAweDE0LCAweDEzLCAweDEyLAorIDB4MTEsIDB4MTAsIDB4MEYsIDB4MEUsIDB4MEQsIDB4MEMsIDB4MEIsIDB4MEEsCisgMHgwOSwgMHgwOCwgMHgwNywgMHgwNiwgMHgwNSwgMHgwOSwgMHgwOCwgMHgwNywKKyAweDA2LCAweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAzLCAweDAyLCAweDAxLAorIDB4MDAsCit9Oworc3RhdGljIGNvbnN0IGludDhfdCBtcGM4X3E0X2JpdHNbTVBDOF9RNF9TSVpFXSA9IHsKKyAgNCwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsCisgIDUsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LAorICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsCisgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LAorICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICA4LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwKKyAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsCisgMTAsCit9Oworc3RhdGljIGNvbnN0IGludDhfdCBtcGM4X3E0X3N5bXNbTVBDOF9RNF9TSVpFXSA9IHsKKyAgIDY0LCAgICA5NiwgICAgODEsICAgIDgwLCAgICA5NSwgICAgNjYsICAgIDY1LCAgICA3OSwKKyAgIDc4LCAgICA0OSwgICAgNDgsICAgIDYzLCAgICAzMiwgICAxMTMsICAgMTEyLCAgICA5OCwKKyAgIDk3LCAgIDExMSwgICAxMTAsICAgIDgzLCAgICA4MiwgICAgOTQsICAgIDkzLCAgICA2NywKKyAgIDc3LCAgICA1MSwgICAgNTAsICAgIDYyLCAgICA2MSwgICAgMzQsICAgIDMzLCAgICA0NywKKyAgIDQ2LCAgICAxNywgICAgMTYsICAgIDMxLCAgIDEyOCwgICAxMTQsICAgMTI3LCAgIDEyNiwKKyAgIDk5LCAgIDEwOSwgICAgNjgsICAgIDc2LCAgICAzNSwgICAgNDUsICAgIDE4LCAgICAzMCwKKyAgICAwLCAgICAxNSwgICAxMzAsICAgMTI5LCAgIDE0MywgICAxNDIsICAgMTE1LCAgIDEyNSwKKyAgMTAwLCAgIDEwOCwgICAgODQsICAgIDkyLCAgICA1MiwgICAgNjAsICAgIDM2LCAgICA0NCwKKyAgIDE5LCAgICAyOSwgICAgIDIsICAgICAxLCAgICAxNCwgICAxMzEsICAgMTQxLCAgIDExNiwKKyAgMTI0LCAgICAyMCwgICAgMjgsICAgICAzLCAgICAxMywgICAxMzIsICAgMTQwLCAgICAgNCwKKyAgIDEyLAorfTsKKworI2RlZmluZSBNUEM4X1E1X1NJWkUgMTUKKyNkZWZpbmUgTVBDOF9RNV9CSVRTIDcKKyNkZWZpbmUgTVBDOF9RNV9PRkZTRVQgLTcKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBjOF9xNV9jb2Rlc1syXVtNUEM4X1E1X1NJWkVdID0geworeworIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDMsIDB4MDMsCisgMHgwNCwgMHgwNSwgMHgwMywgMHgwMywgMHgwMywgMHgwMiwgMHgwMywKK30sCit7CisgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMywgMHgwMywgMHgwNCwgMHgwNSwKKyAweDA2LCAweDA3LCAweDA0LCAweDA1LCAweDAzLCAweDAyLCAweDAzLAorfQorfTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbXBjOF9xNV9iaXRzWzJdW01QQzhfUTVfU0laRV0gPSB7Cit7CisgIDcsICA3LCAgNiwgIDUsICA0LCAgMywgIDMsICAyLAorICAzLCAgMywgIDQsICA1LCAgNiwgIDcsICA3LAorfSwKK3sKKyAgNiwgIDYsICA1LCAgNCwgIDQsICAzLCAgMywgIDMsCisgIDMsICAzLCAgNCwgIDQsICA1LCAgNiwgIDYsCit9Cit9OworCisjZGVmaW5lIE1QQzhfUTZfU0laRSAzMQorI2RlZmluZSBNUEM4X1E2X0JJVFMgOQorI2RlZmluZSBNUEM4X1E2X09GRlNFVCAtMTUKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBjOF9xNl9jb2Rlc1syXVtNUEM4X1E2X1NJWkVdID0geworeworIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDQsIDB4MDMsCisgMHgwNCwgMHgwNSwgMHgwNSwgMHgwNiwgMHgwNCwgMHgwNSwgMHgwNCwgMHgwMywKKyAweDA1LCAweDA2LCAweDA3LCAweDA3LCAweDA2LCAweDA3LCAweDA4LCAweDA5LAorIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCit9LAoreworIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDQsIDB4MDUsIDB4MDQsCisgMHgwNSwgMHgwNiwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwKKyAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDA3LCAweDA4LCAweDA5LAorIDB4MDYsIDB4MDcsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDIsIDB4MDMsCit9Cit9Oworc3RhdGljIGNvbnN0IGludDhfdCBtcGM4X3E2X2JpdHNbMl1bTVBDOF9RNl9TSVpFXSA9IHsKK3sKKyAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgNywgIDYsCisgIDYsICA2LCAgNSwgIDUsICA0LCAgNCwgIDMsICAyLAorICAzLCAgNCwgIDQsICA1LCAgNiwgIDYsICA2LCAgNiwKKyAgNywgIDgsICA4LCAgOSwgIDksICA5LCAgOSwKK30sCit7CisgIDgsICA4LCAgNywgIDcsICA3LCAgNiwgIDYsICA1LAorICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsCisgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsCit9Cit9OworCisjZGVmaW5lIE1QQzhfUTdfU0laRSA2MworI2RlZmluZSBNUEM4X1E3X0JJVFMgOQorI2RlZmluZSBNUEM4X1E3X09GRlNFVCAtMzEKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBjOF9xN19jb2Rlc1syXVtNUEM4X1E3X1NJWkVdID0geworeworIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDgsIDB4MDksIDB4MDMsIDB4MDQsIDB4MDUsCisgMHgwNiwgMHgwNywgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwQSwgMHgwQiwKKyAweDBDLCAweDBELCAweDBFLCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLAorIDB4MEEsIDB4MEIsIDB4MEMsIDB4MDgsIDB4MDksIDB4MDYsIDB4MDQsIDB4MDMsCisgMHgwNSwgMHgwNywgMHgwQSwgMHgwQiwgMHgwRCwgMHgwRSwgMHgwRiwgMHgwRiwKKyAweDEwLCAweDExLCAweDEyLCAweDBGLCAweDEzLCAweDEwLCAweDExLCAweDEyLAorIDB4MTMsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MDgsIDB4MDksIDB4MEEsCisgMHgwQiwgMHgwQywgMHgxMiwgMHgxMywgMHgwRCwgMHgwRSwgMHgwRiwKK30sCit7CisgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAweDA4LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDA5LCAweDBBLAorIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MEMsIDB4MEQsCisgMHgwRSwgMHgwRiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwKKyAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELAorIDB4MUUsIDB4MUYsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsCisgMHgxNywgMHgwRCwgMHgwRSwgMHgwRiwgMHgxMCwgMHgxMSwgMHgwOSwgMHgwQSwKKyAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDAyLCAweDAzLAorfQorfTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbXBjOF9xN19iaXRzWzJdW01QQzhfUTdfU0laRV0gPSB7Cit7CisgMTAsIDEwLCAxMCwgIDksICA5LCAxMCwgMTAsIDEwLAorIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA4LCAgOCwKKyAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDcsCisgIDYsICA2LCAgNiwgIDUsICA1LCAgNCwgIDMsICAyLAorICAzLCAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywKKyAgNywgIDcsICA3LCAgOCwgIDcsICA4LCAgOCwgIDgsCisgIDgsICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLAorIDEwLCAxMCwgIDksICA5LCAxMCwgMTAsIDEwLAorfSwKK3sKKyAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgIDgsICA3LCAgNywgIDcsICA3LCAgNywgIDYsICA2LAorICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwKKyAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsCisgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAorICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsCisgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksCit9Cit9OworCisjZGVmaW5lIE1QQzhfUThfU0laRSAxMjcKKyNkZWZpbmUgTVBDOF9ROF9CSVRTIDkKKyNkZWZpbmUgTVBDOF9ROF9PRkZTRVQgLTYzCisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYzhfcThfY29kZXNbMl1bTVBDOF9ROF9TSVpFXSA9IHsKK3sKKyAweDAzLCAweDA0LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDFBLAorIDB4MEYsIDB4MUIsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDUsIDB4MDYsIDB4MDcsCisgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgxMSwgMHgwQywgMHgxMiwgMHgxMywKKyAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFDLCAweDFBLAorIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUQsIDB4MUUsIDB4MUYsIDB4MjAsCisgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgxOSwgMHgyNSwgMHgxQSwgMHgxQiwKKyAweDFDLCAweDFELCAweDFFLCAweDFGLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MEIsIDB4MDcsIDB4MDQsIDB4MDMsCisgMHgwNSwgMHgwQywgMHgwRCwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxOCwKKyAweDE5LCAweDFBLCAweDFCLCAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LAorIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MkEsCisgMHgyQiwgMHgyQywgMHgyRCwgMHgyRSwgMHgxRiwgMHgyMCwgMHgyRiwgMHgyMSwKKyAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LAorIDB4MEQsIDB4MEUsIDB4MkEsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MDIsCisgMHgxMywgMHgwMywgMHgwNCwgMHgwNSwgMHgyQiwgMHgyQywgMHgzMCwgMHgzMSwKKyAweDJELCAweDJFLCAweDJGLCAweDMwLCAweDMxLCAweDMyLCAweDMzLAorfSwKK3sKKyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNSwgMHgxNiwKKyAweDE3LCAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFLAorIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsCisgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwgMHgyQywgMHgyRCwgMHgyRSwKKyAweDJGLCAweDMwLCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJBLCAweDJCLAorIDB4MkMsIDB4MkQsIDB4MkUsIDB4MkYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsCisgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwgMHgzQiwKKyAweDNDLCAweDNELCAweDNFLCAweDMxLCAweDNGLCAweDMyLCAweDMzLCAweDM0LAorIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4M0IsIDB4M0MsCisgMHgzRCwgMHgzRSwgMHgzRiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwKKyAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRBLCAweDRCLCAweDE2LAorIDB4MTcsIDB4MTgsIDB4MTksIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsCisgMHgxRiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwKKyAweDI3LCAweDI4LCAweDI5LCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorfQorfTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbXBjOF9xOF9iaXRzWzJdW01QQzhfUThfU0laRV0gPSB7Cit7CisgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA5LAorIDEwLCAgOSwgMTAsIDEyLCAxMiwgMTEsIDExLCAxMSwKKyAxMSwgMTEsIDExLCAxMSwgMTAsIDExLCAxMCwgMTAsCisgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksIDEwLAorIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwKKyAgOSwgIDksICA5LCAgOSwgIDgsICA5LCAgOCwgIDgsCisgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LAorICA2LCAgNiwgIDYsICA2LCAgNSwgIDQsICAzLCAgMiwKKyAgMywgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDcsCisgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsICA4LAorICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwKKyAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAgOSwgMTAsCisgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorIDExLCAxMSwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwKKyAxMSwgMTIsIDEyLCAxMiwgMTAsIDEwLCAgOSwgIDksCisgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCit9LAoreworICA5LCAgOSwgIDksICA5LCAgOCwgIDgsICA4LCAgOCwKKyAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LAorICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsCisgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAorICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsCisgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAorICA2LCAgNiwgIDYsICA3LCAgNiwgIDcsICA3LCAgNywKKyAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsCisgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAorICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgOCwKKyAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LAorfQorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTVBDOEhVRkZfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBjZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBjZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZmI0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGNkYXRhLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBNdXNlcGFjayBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTVBDREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfTVBDREFUQV9ICisKK3N0YXRpYyBjb25zdCBmbG9hdCBtcGNfQ0NbMTgrMV0gPSB7CisgICAgMTExLjI4NTk2MjQ3NTMyN2YsIC8vIDMyNzY4LzIvMjU1KnNxcnQoMykKKyAgICA2NTUzNi4wMDAwIC8qIHRoaXMgdmFsdWUgaXMgbmV2ZXIgdXNlZCAqLywKKyAgICAyMTg0NS4zMzMzLCAxMzEwNy4yMDAwLCA5MzYyLjI4NTcsIDcyODEuNzc3OCwgNDM2OS4wNjY3LCAyMTE0LjA2NDUsCisgICAgMTA0MC4yNTM5LCA1MTYuMDMxNSwgMjU3LjAwMzksIDEyOC4yNTA1LCA2NC4wNjI2LCAzMi4wMTU2LCAxNi4wMDM5LCA4LjAwMTAsCisgICAgNC4wMDAyLCAyLjAwMDEsIDEuMDAwMAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IG1wY19TQ0ZbMjU2XSA9IHsKKyAgICAzMDcuMzMwMDQ3NjA3NDIxODc1MDAwLCAyNTUuOTk5OTg0NzQxMjEwOTM3NTAwLCAyMTMuMjQzMDQxOTkyMTg3NTAwMDAwLCAxNzcuNjI3MzM0NTk0NzI2NTYyNTAwLAorICAgIDE0Ny45NjAxMjg3ODQxNzk2ODc1MDAsIDEyMy4yNDc5MjQ4MDQ2ODc1MDAwMDAsIDEwMi42NjMxMzkzNDMyNjE3MTg3NTAsIDg1LjUxNjQxMDgyNzYzNjcxODc1MCwKKyAgICA3MS4yMzM1MjA1MDc4MTI1MDAwMDAsIDU5LjMzNjE0MzQ5MzY1MjM0Mzc1MCwgNDkuNDI1ODYxMzU4NjQyNTc4MTI1LCA0MS4xNzA3ODc4MTEyNzkyOTY4NzUsCisgICAgMzQuMjk0NDcxNzQwNzIyNjU2MjUwLCAyOC41NjY2MzEzMTcxMzg2NzE4NzUsIDIzLjc5NTQ1MjExNzkxOTkyMTg3NSwgMTkuODIxMTUxNzMzMzk4NDM3NTAwLAorICAgIDE2LjUxMDYzNTM3NTk3NjU2MjUwMCwgMTMuNzUzMDQwMzEzNzIwNzAzMTI1LCAxMS40NTYwMTY1NDA1MjczNDM3NTAsIDkuNTQyNjQwNjg2MDM1MTU2MjUwLAorICAgIDcuOTQ4ODM1MzcyOTI0ODA0Njg4LCA2LjYyMTIyNjMxMDcyOTk4MDQ2OSwgNS41MTUzNTM2Nzk2NTY5ODI0MjIsIDQuNTk0MTgyOTY4MTM5NjQ4NDM4LAorICAgIDMuODI2ODY1NjczMDY1MTg1NTQ3LCAzLjE4NzcwNTAzOTk3ODAyNzM0NCwgMi42NTUyOTY1NjQxMDIxNzI4NTIsIDIuMjExODEwNTg4ODM2NjY5OTIyLAorICAgIDEuODQyMzk1NDI0ODQyODM0NDczLCAxLjUzNDY3OTc3MDQ2OTY2NTUyNywgMS4yNzgzNTg1Nzg2ODE5NDU4MDEsIDEuMDY0ODQ3OTQ2MTY2OTkyMTg4LAorICAgIDAuODg2OTk3NzU5MzQyMTkzNjA0LCAwLjczODg1MTk2NDQ3MzcyNDM2NSwgMC42MTU0NDk0Mjg1NTgzNDk2MDksIDAuNTEyNjU3NDYzNTUwNTY3NjI3LAorICAgIDAuNDI3MDMzNzUyMjAyOTg3NjcxLCAwLjM1NTcxMDg2NDA2NzA3NzYzNywgMC4yOTYzMDAyNjIyMTI3NTMyOTYsIDAuMjQ2ODEyMzg4MzAwODk1NjkxLAorICAgIDAuMjA1NTg5OTUwMDg0Njg2Mjc5LCAwLjE3MTI1MjQ1OTI4NzY0MzQzMywgMC4xNDI2NDk5OTMzMDA0Mzc5MjcsIDAuMTE4ODI0NjgzMTI5Nzg3NDQ1LAorICAgIDAuMDk4OTc4NjYxMDAwNzI4NjA3LCAwLjA4MjQ0NzMxMjc3MjI3NDAxNywgMC4wNjg2NzcwMTU2MDI1ODg2NTQsIDAuMDU3MjA2NjI2OTgxNDk2ODExLAorICAgIDAuMDQ3NjUyMDEzNTk5ODcyNTg5LCAwLjAzOTY5MzIwNjU0ODY5MDc5NiwgMC4wMzMwNjM2NzI0ODI5NjczNzcsIDAuMDI3NTQxMzk5MDAyMDc1MTk1LAorICAgIDAuMDIyOTQxNDUzMzgyMzcyODU2LCAwLjAxOTEwOTc4NzQxOTQzODM2MiwgMC4wMTU5MTgwODM0ODg5NDExOTMsIDAuMDEzMjU5NDU1NTYxNjM3ODc4LAorICAgIDAuMDExMDQ0ODcwMTMwNzE3NzU0LCAwLjAwOTIwMDE2MzE4NTU5NjQ2NiwgMC4wMDc2NjM1NTgyMzcyNTQ2MjAsIDAuMDA2MzgzNTk1OTg4MTU0NDExLAorICAgIDAuMDA1MzE3NDExODUxMTM3ODc3LCAwLjAwNDQyOTMwMTI0NzAwMDY5NCwgMC4wMDM2ODk1MjIzODkzMjI1MTksIDAuMDAzMDczMzAwNzAwNjM0NzE4LAorICAgIDAuMDAyNTYwMDAwMTY4MTU5NjA0LCAwLjAwMjEzMjQzMDY3MjY0NTU2OSwgMC4wMDE3NzYyNzM0Nzg3NTM4NjUsIDAuMDAxNDc5NjAxNDg3NTE3MzU3LAorICAgIDAuMDAxMjMyNDc5NDY2MTI1MzY5LCAwLjAwMTAyNjYzMTU2NTc2NDU0NiwgMC4wMDA4NTUxNjQyNTMxNTI5MDcsIDAuMDAwNzEyMzM1Mjg0MzMzNjc2LAorICAgIDAuMDAwNTkzMzYxNTAyOTc4OTUxLCAwLjAwMDQ5NDI1ODY1MjkwNjg2NSwgMC4wMDA0MTE3MDc5MDc5MTUxMTUsIDAuMDAwMzQyOTQ0NzI0MjUyNDQ3LAorICAgIDAuMDAwMjg1NjY2MzE5NTQxNjMzLCAwLjAwMDIzNzk1NDUxODUyNDkzMCwgMC4wMDAxOTgyMTE1MDYzNTgzNDgsIDAuMDAwMTY1MTA2MzUwMzIzMTg1LAorICAgIDAuMDAwMTM3NTMwMzk4MjA1ODU0LCAwLjAwMDExNDU2MDE2MzYzODA4OSwgMC4wMDAwOTU0MjY0MDMyNzcwODgsIDAuMDAwMDc5NDg4MzQ1MzYzNjQzLAorICAgIDAuMDAwMDY2MjEyMjU0NzUxMDA4LCAwLjAwMDA1NTE1MzUyNjc3MzIxMSwgMC4wMDAwNDU5NDE4MjI0NjM2NDcsIDAuMDAwMDM4MjY4NjQ4NDk1NDMyLAorICAgIDAuMDAwMDMxODc3MDQzNTExNDg2LCAwLjAwMDAyNjU1Mjk2MTU3MTcyNCwgMC4wMDAwMjIxMTgxMDM1MTU4MjIsIDAuMDAwMDE4NDIzOTUyNDk2OTYwLAorICAgIDAuMDAwMDE1MzQ2Nzk1NDA3ODIyLCAwLjAwMDAxMjc4MzU4Mzc3MDIxNSwgMC4wMDAwMTA2NDg0Nzc2NTUxOTUsIDAuMDAwMDA4ODY5OTc2MjI3Mjg4LAorICAgIDAuMDAwMDA3Mzg4NTE4NDk3NDY0LCAwLjAwMDAwNjE1NDQ5Mjg5Mzk4NCwgMC4wMDAwMDUxMjY1NzM3OTY1ODgsIDAuMDAwMDA0MjcwMzM2ODMwODE0LAorICAgIDAuMDAwMDAzNTU3MTA3OTAyNDUyLCAwLjAwMDAwMjk2MzAwMjA4OTAxOCwgMC4wMDAwMDI0NjgxMjM1MTE3OTAsIDAuMDAwMDAyMDU1ODk5MTMwOTM3LAorICAgIDAuMDAwMDAxNzEyNTI0MTgxMTMwLCAwLjAwMDAwMTQyNjQ5OTU3OTc5MywgMC4wMDAwMDExODgyNDY1Mjg3MjcsIDAuMDAwMDAwOTg5Nzg2MzcxOTc0LAorICAgIDAuMDAwMDAwODI0NDcyOTIwMTU4LCAwLjAwMDAwMDY4Njc3MDAyMjE4NSwgMC4wMDAwMDA1NzIwNjYxNDIwMTMsIDAuMDAwMDAwNDc2NTIwMDI4NzY5LAorICAgIDAuMDAwMDAwMzk2OTMxOTY2NDA3LCAwLjAwMDAwMDMzMDYzNjY1MjI3OSwgMC4wMDAwMDAyNzU0MTM5MjQ1NTUsIDAuMDAwMDAwMjI5NDE0NDY3ODY3LAorICAgIDAuMDAwMDAwMTkxMDk3ODExMzUzLCAwLjAwMDAwMDE1OTE4MDc4NTg4NiwgMC4wMDAwMDAxMzI1OTQ1MjIwMjksIDAuMDAwMDAwMTEwNDQ4Njc0MjA3LAorICAgIDAuMDAwMDAwMDkyMDAxNjEzNDM5LCAwLjAwMDAwMDA3NjYzNTU2NTQ0OSwgMC4wMDAwMDAwNjM4MzU5NDA5NzgsIDAuMDAwMDAwMDUzMTc0MTA1MTE5LAorICAgIDAuMDAwMDAwMDQ0MjkzMDAzMDQzLCAwLjAwMDAwMDAzNjg5NTIxNTc3MSwgMC4wMDAwMDAwMzA3MzMwMDE5MjEsIDAuMDAwMDAwMDI1NTk5OTk2Nzg5LAorICAgIDAuMDAwMDAwMDIxMzI0MzA1MDE4LCAzNjg5NTIyMTY3NjAwLjI3MDAxOTUzMTI1MDAwMDAwMCwgMzA3MzMwMDYyNzgzNS45MjY3NTc4MTI1MDAwMDAwMDAsIDI1NjAwMDAwMDAwMDAuMDAyOTI5Njg3NTAwMDAwMDAwLAorICAgIDIxMzI0MzA1MDE4MDAuNTE5MDQyOTY4NzUwMDAwMDAwLCAxNzc2MjczMzc2OTU2LjcyMTkyMzgyODEyNTAwMDAwMCwgMTQ3OTYwMTM3ODM0My4yNTAyNDQxNDA2MjUwMDAwMDAsIDEyMzI0NzkzMzk3MjAuNzk0MTg5NDUzMTI1MDAwMDAwLAorICAgIDEwMjY2MzE0NTk3MTAuNzc0MjkxOTkyMTg3NTAwMDAwLCA4NTUxNjQxNTU3NzkuMzkxODQ1NzAzMTI1MDAwMDAwLCA3MTIzMzUyMDY5NjUuMDI0NzgwMjczNDM3NTAwMDAwLCA1OTMzNjE0NTQyMzMuODI5MTAxNTYyNTAwMDAwMDAwLAorICAgIDQ5NDI1ODYxODU5NC4xMTI2MDk4NjMyODEyNTAwMDAsIDQxMTcwNzg3MjY4Mi43NjMxMjI1NTg1OTM3NTAwMDAsIDM0Mjk0NDY5NzQ3Ni42MTIzNjU3MjI2NTYyNTAwMDAsIDI4NTY2NjMwMjA4MS45ODM4ODY3MTg3NTAwMDAwMDAsCisgICAgMjM3OTU0NTA2MjA5LjQ0NjQxMTEzMjgxMjUwMDAwMCwgMTk4MjExNTAyNzY2LjM2ODcxMzM3ODkwNjI1MDAwMCwgMTY1MTA2MzQ5MzM4LjU2MzMyMzk3NDYwOTM3NTAwMCwgMTM3NTMwMzk2NjI5LjA5NTMwNjM5NjQ4NDM3NTAwMCwKKyAgICAxMTQ1NjAxNjEyMDkuNjExNjMzMzAwNzgxMjUwMDAwLCA5NTQyNjM5OTI0MC4wNjI1NzYyOTM5NDUzMTI1MDAsIDc5NDg4MzQ1NDc1LjE5NjUwMjY4NTU0Njg3NTAwMCwgNjYyMTIyNTQ4NTUuMDY0ODcyNzQxNjk5MjE4NzUwLAorICAgIDU1MTUzNTI4MDY0LjgxNjI3NjU1MDI5Mjk2ODc1MCwgNDU5NDE4MjI0NzEuNjExMzQzMzgzNzg5MDYyNTAwLCAzODI2ODY0OTgyMi45NTY0MTMyNjkwNDI5Njg3NTAsIDMxODc3MDQ1MzY5LjIxNjg3MzE2ODk0NTMxMjUwMCwKKyAgICAyNjU1Mjk2MjQ0Mi40MjA2ODg2MjkxNTAzOTA2MjUsIDIyMTE4MTA0MzA2Ljc4OTYxNTYzMTEwMzUxNTYyNSwgMTg0MjM5NTMyMjguODI5NTA5NzM1MTA3NDIxODc1LCAxNTM0Njc5NjgwOC4xNjQ5MDU1NDgwOTU3MDMxMjUsCisgICAgMTI3ODM1ODUwMDcuMjkxMjcxMjA5NzE2Nzk2ODc1LCAxMDY0ODQ3OTEzNy40NjM5Mzk2NjY3NDgwNDY4NzUsIDg4Njk5NzcyMzAuNjY5NzUwMjEzNjIzMDQ2ODc1LCA3Mzg4NTE5NTMwLjA2MTAzNjEwOTkyNDMxNjQwNiwKKyAgICA2MTU0NDkzOTA5Ljc4NTUzNTgxMjM3NzkyOTY4OCwgNTEyNjU3NDQyOC4yNzAzODc2NDk1MzYxMzI4MTIsIDQyNzAzMzczNzUuMjMyMTU1MzIzMDI4NTY0NDUzLCAzNTU3MTA4NDY1LjU5NTIzNjMwMTQyMjExOTE0MSwKKyAgICAyOTYzMDAyNTc0LjMxNTY3MDAxMzQyNzczNDM3NSwgMjQ2ODEyMzg1NC4wNTYzMjI1NzQ2MTU0Nzg1MTYsIDIwNTU4OTk0NDguNjc2MjI5NzE1MzQ3MjkwMDM5LCAxNzEyNTI0NDg5LjQ1MDAyMjQ1OTAzMDE1MTM2NywKKyAgICAxNDI2NDk5Nzg3LjY0OTgzNzczMjMxNTA2MzQ3NywgMTE4ODI0Njc0MS40MDQ4NzI0MTc0NDk5NTExNzIsIDk4OTc4NjU2MC41NjEyNTc5NTg0MTIxNzA0MTAsIDgyNDQ3MzA2Ny4xOTI1OTc4NjYwNTgzNDk2MDksCisgICAgNjg2NzcwMTIzLjU5MTYxMDMxMjQ2MTg1MzAyNywgNTcyMDY2MjM0LjA5MDY0ODUzMTkxMzc1NzMyNCwgNDc2NTIwMTExLjk2MjkxMTQ4NjYyNTY3MTM4NywgMzk2OTMyMDM5LjYzNzE1MjE5NDk3NjgwNjY0MSwKKyAgICAzMzA2MzY3MTQuMjQzODEwNTM0NDc3MjMzODg3LCAyNzU0MTM5OTAuMDI2Nzk4MDA5ODcyNDM2NTIzLCAyMjk0MTQ1MjguNDk4MzMwOTgwNTM5MzIxODk5LCAxOTEwOTc4NjYuNDU1NDc4NDI5Nzk0MzExNTIzLAorICAgIDE1OTE4MDgyNy44MzU0MTU2MDE3MzAzNDY2ODAsIDEzMjU5NDU1MS43ODgzMTkwOTU5NjkyMDAxMzQsIDExMDQ0ODY5Ny44OTI5NjA4NzYyMjY0MjUxNzEsIDkyMDAxNjI5Ljc5MzM5ODUxNDM4OTk5MTc2MCwKKyAgICA3NjYzNTU3OC43NDQ4NDQ1ODU2NTcxMTk3NTEsIDYzODM1OTU1LjMyNzU5NDUwMzc2MDMzNzgzMCwgNTMxNzQxMTYuNTA0NzQxMjg4NzIxNTYxNDMyLCA0NDI5MzAxMC45MTQ0NTQ5MTQ2Mjk0NTkzODEsCisgICAgMzY4OTUyMjEuNjc2MDAyNjczODA0NzU5OTc5LCAzMDczMzAwNi4yNzgzNTkyNDU1MDg5MDkyMjUsIDI1NjAwMDAwLjAwMDAwMDAxMTE3NTg3MDg5NSwgMjEzMjQzMDUuMDE4MDA1MTczNjUzMzY0MTgyLAorICAgIDE3NzYyNzMzLjc2OTU2NzIwMjc3NjY3MDQ1NiwgMTQ3OTYwMTMuNzgzNDMyNDg5MjYxMDMxMTUxLCAxMjMyNDc5My4zOTcyMDc5MzA2ODQwODk2NjEsIDEwMjY2MzE0LjU5NzEwNzczNDUzMTE2NDE2OSwKKyAgICA4NTUxNjQxLjU1Nzc5MzkxMTU0NjQ2ODczNSwgNzEyMzM1Mi4wNjk2NTAyNDMwMzY0NDg5NTYsIDU5MzM2MTQuNTQyMzM4Mjg3NDU3ODIzNzUzLCA0OTQyNTg2LjE4NTk0MTEyMzQwMzYwODc5OSwKKyAgICA0MTE3MDc4LjcyNjgyNzYyOTM3NjIwMjgyMiwgMzQyOTQ0Ni45NzQ3NjYxMjIxNzcyNDMyMzMsIDI4NTY2NjMuMDIwODE5ODM3NjkzMTI1MDEwLCAyMzc5NTQ1LjA2MjA5NDQ2MzAzNTQ2NDI4NywKKyAgICAxOTgyMTE1LjAyNzY2MzY4NjMxMjczNTA4MSwgMTY1MTA2My40OTMzODU2MzI1MjI0MDQxOTQsIDEzNzUzMDMuOTY2MjkwOTUyNDA0OTYwOTkwLCAxMTQ1NjAxLjYxMjA5NjExNTcxMzkzOTA3MSwKKyAgICA5NTQyNjMuOTkyNDAwNjI1MjU0OTU4ODY4LCA3OTQ4ODMuNDU0NzUxOTY0NjU4NDk4NzY0LCA2NjIxMjIuNTQ4NTUwNjQ4NDk4MzQ4ODkyLCA1NTE1MzUuMjgwNjQ4MTYyNTg4NDc3MTM1LAorICAgIDQ1OTQxOC4yMjQ3MTYxMTMyMzk5OTI0MTAsIDM4MjY4Ni40OTgyMjk1NjM5OTI5MzYxNjQsIDMxODc3MC40NTM2OTIxNjg1Nzk0MzY4MzksIDI2NTUyOS42MjQ0MjQyMDY3OTE0NDU2MTMsCisgICAgMjIxMTgxLjA0MzA2Nzg5NjA2OTI2MDMxNCwgMTg0MjM5LjUzMjI4ODI5NTAxMzEzMTU3NCwgMTUzNDY3Ljk2ODA4MTY0ODk4NTM4OTYyMCwgMTI3ODM1Ljg1MDA3MjkxMjY1MzU1ODg4OCwKKyAgICAxMDY0ODQuNzkxMzc0NjM5MzQ2MDMxNDcyLCA4ODY5OS43NzIzMDY2OTc0NTc2Nzk1NDcsIDczODg1LjE5NTMwMDYxMDMxNDAwNjkxNywgNjE1NDQuOTM5MDk3ODU1MzEyODY2MTU5LAorICAgIDUxMjY1Ljc0NDI4MjcwMzgzOTQxNzA4MSwgNDI3MDMuMzczNzUyMzIxNTI0MDc5ODg5LCAzNTU3MS4wODQ2NTU5NTIzNDE1NjM1MzQsIDI5NjMwLjAyNTc0MzE1NjY3ODgwMDAwNSwKKyAgICAyNDY4MS4yMzg1NDA1NjMyMDg1MTY2ODcsIDIwNTU4Ljk5NDQ4Njc2MjI4MzQ4NjMxNCwgMTcxMjUuMjQ0ODk0NTAwMjE0Mjg2MzgxLCAxNDI2NC45OTc4NzY0OTgzNjc5ODY2NDIsCisgICAgMTE4ODIuNDY3NDE0MDQ4NzE2ODE4Nzk3LCA5ODk3Ljg2NTYwNTYxMjU3NDY1NDUxNSwgODI0NC43MzA2NzE5MjU5NzQwOTMwMjgsIDY4NjcuNzAxMjM1OTE2MDk4OTk0NDk0LAorICAgIDU3MjAuNjYyMzQwOTA2NDgyMzEzNTg1LCA0NzY1LjIwMTExOTYyOTExMjMyNjk0OCwgMzk2OS4zMjAzOTYzNzE1MTk1NjQxMjcsIDMzMDYuMzY3MTQyNDM4MTAzMjAxMTMwLAorICAgIDI3NTQuMTM5OTAwMjY3OTc4MTkxNTUwLCAyMjk0LjE0NTI4NDk4MzMwODEwMTgwMSwgMTkxMC45Nzg2NjQ1NTQ3ODI4ODExNjksIDE1OTEuODA4Mjc4MzU0MTU0OTM2MDk2LAorICAgIDEzMjUuOTQ1NTE3ODgzMTkwMTc3NTk5LCAxMTA0LjQ4Njk3ODkyOTYwODA4NTMwOSwgOTIwLjAxNjI5NzkzMzk4NDY3NDI3MywgNzY2LjM1NTc4NzQ0ODQ0NTQyNTk4MCwKKyAgICA2MzguMzU5NTUzMjc1OTQ0Njc2ODk4LCA1MzEuNzQxMTY1MDQ3NDEyNTUwODQ4LCA0NDIuOTMwMTA5MTQ0NTQ4OTA3ODA3LCAzNjguOTUyMjE2NzYwMDI2NTQ0NzYyLAorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTVBDREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnMTIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWcxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNDNhNTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnMTIuYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIE1QRUctMS8yIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1QRUctMS8yIGRlY29kZXIKKyAqLworCisjZGVmaW5lIFVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSIDEKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVjb2RlLmgiCisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCisjaW5jbHVkZSAibXBlZzEyLmgiCisjaW5jbHVkZSAibXBlZzEyZGF0YS5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJ2ZHBhdV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCit1aW50OF90IGZmX21wZWcxMl9zdGF0aWNfcmxfdGFibGVfc3RvcmVbMl1bMl1bMipNQVhfUlVOICsgTUFYX0xFVkVMICsgM107CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlX21iX3B0eXBlWzddWzJdID0geworICAgIHsgMywgNSB9LCAvLyAweDAxIE1CX0lOVFJBCisgICAgeyAxLCAyIH0sIC8vIDB4MDIgTUJfUEFUCisgICAgeyAxLCAzIH0sIC8vIDB4MDggTUJfRk9SCisgICAgeyAxLCAxIH0sIC8vIDB4MEEgTUJfRk9SfE1CX1BBVAorICAgIHsgMSwgNiB9LCAvLyAweDExIE1CX1FVQU5UfE1CX0lOVFJBCisgICAgeyAxLCA1IH0sIC8vIDB4MTIgTUJfUVVBTlR8TUJfUEFUCisgICAgeyAyLCA1IH0sIC8vIDB4MUEgTUJfUVVBTlR8TUJfRk9SfE1CX1BBVAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFibGVfbWJfYnR5cGVbMTFdWzJdID0geworICAgIHsgMywgNSB9LCAvLyAweDAxIE1CX0lOVFJBCisgICAgeyAyLCAzIH0sIC8vIDB4MDQgTUJfQkFDSworICAgIHsgMywgMyB9LCAvLyAweDA2IE1CX0JBQ0t8TUJfUEFUCisgICAgeyAyLCA0IH0sIC8vIDB4MDggTUJfRk9SCisgICAgeyAzLCA0IH0sIC8vIDB4MEEgTUJfRk9SfE1CX1BBVAorICAgIHsgMiwgMiB9LCAvLyAweDBDIE1CX0ZPUnxNQl9CQUNLCisgICAgeyAzLCAyIH0sIC8vIDB4MEUgTUJfRk9SfE1CX0JBQ0t8TUJfUEFUCisgICAgeyAxLCA2IH0sIC8vIDB4MTEgTUJfUVVBTlR8TUJfSU5UUkEKKyAgICB7IDIsIDYgfSwgLy8gMHgxNiBNQl9RVUFOVHxNQl9CQUNLfE1CX1BBVAorICAgIHsgMywgNiB9LCAvLyAweDFBIE1CX1FVQU5UfE1CX0ZPUnxNQl9QQVQKKyAgICB7IDIsIDUgfSwgLy8gMHgxRSBNQl9RVUFOVHxNQl9GT1J8TUJfQkFDS3xNQl9QQVQKK307CisKKyNkZWZpbmUgSU5JVF8yRF9WTENfUkwocmwsIHN0YXRpY19zaXplKVwKK3tcCisgICAgc3RhdGljIFJMX1ZMQ19FTEVNIHJsX3ZsY190YWJsZVtzdGF0aWNfc2l6ZV07XAorICAgIHJsLnJsX3ZsY1swXSA9IHJsX3ZsY190YWJsZTtcCisgICAgaW5pdF8yZF92bGNfcmwoJnJsLCBzdGF0aWNfc2l6ZSk7XAorfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGluaXRfMmRfdmxjX3JsKFJMVGFibGUgKnJsLCB1bnNpZ25lZCBzdGF0aWNfc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBWTENfVFlQRSB0YWJsZVs2ODBdWzJdID0ge3swfX07CisgICAgVkxDIHZsYyA9IHsgLnRhYmxlID0gdGFibGUsIC50YWJsZV9hbGxvY2F0ZWQgPSBzdGF0aWNfc2l6ZSB9OworICAgIGF2X2Fzc2VydDAoc3RhdGljX3NpemUgPD0gRkZfQVJSQVlfRUxFTVModGFibGUpKTsKKyAgICBpbml0X3ZsYygmdmxjLCBURVhfVkxDX0JJVFMsIHJsLT5uICsgMiwgJnJsLT50YWJsZV92bGNbMF1bMV0sIDQsIDIsICZybC0+dGFibGVfdmxjWzBdWzBdLCA0LCAyLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmxjLnRhYmxlX3NpemU7IGkrKykgeworICAgICAgICBpbnQgY29kZSA9IHZsYy50YWJsZVtpXVswXTsKKyAgICAgICAgaW50IGxlbiAgPSB2bGMudGFibGVbaV1bMV07CisgICAgICAgIGludCBsZXZlbCwgcnVuOworCisgICAgICAgIGlmIChsZW4gPT0gMCkgeyAvLyBpbGxlZ2FsIGNvZGUKKyAgICAgICAgICAgIHJ1biAgID0gNjU7CisgICAgICAgICAgICBsZXZlbCA9IE1BWF9MRVZFTDsKKyAgICAgICAgfSBlbHNlIGlmIChsZW48MCkgeyAvL21vcmUgYml0cyBuZWVkZWQKKyAgICAgICAgICAgIHJ1biAgID0gMDsKKyAgICAgICAgICAgIGxldmVsID0gY29kZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjb2RlID09IHJsLT5uKSB7IC8vZXNjCisgICAgICAgICAgICAgICAgcnVuICAgPSA2NTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gcmwtPm4rMSkgeyAvL2VvYgorICAgICAgICAgICAgICAgIHJ1biAgID0gMDsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IDEyNzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVuICAgPSBybC0+dGFibGVfcnVuICBbY29kZV0gKyAxOworICAgICAgICAgICAgICAgIGxldmVsID0gcmwtPnRhYmxlX2xldmVsW2NvZGVdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJsLT5ybF92bGNbMF1baV0ubGVuICAgPSBsZW47CisgICAgICAgIHJsLT5ybF92bGNbMF1baV0ubGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgcmwtPnJsX3ZsY1swXVtpXS5ydW4gICA9IHJ1bjsKKyAgICB9Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9tcGVnMTJfY29tbW9uX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisKKyAgICBzLT55X2RjX3NjYWxlX3RhYmxlID0KKyAgICBzLT5jX2RjX3NjYWxlX3RhYmxlID0gZmZfbXBlZzJfZGNfc2NhbGVfdGFibGVbcy0+aW50cmFfZGNfcHJlY2lzaW9uXTsKKworfQorCit2b2lkIGZmX21wZWcxX2NsZWFuX2J1ZmZlcnMoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgcy0+bGFzdF9kY1swXSA9IDEgPDwgKDcgKyBzLT5pbnRyYV9kY19wcmVjaXNpb24pOworICAgIHMtPmxhc3RfZGNbMV0gPSBzLT5sYXN0X2RjWzBdOworICAgIHMtPmxhc3RfZGNbMl0gPSBzLT5sYXN0X2RjWzBdOworICAgIG1lbXNldChzLT5sYXN0X212LCAwLCBzaXplb2Yocy0+bGFzdF9tdikpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkZWNvZGluZyAqLworCitWTEMgZmZfbXZfdmxjOworCitWTEMgZmZfZGNfbHVtX3ZsYzsKK1ZMQyBmZl9kY19jaHJvbWFfdmxjOworCitWTEMgZmZfbWJpbmNyX3ZsYzsKK1ZMQyBmZl9tYl9wdHlwZV92bGM7CitWTEMgZmZfbWJfYnR5cGVfdmxjOworVkxDIGZmX21iX3BhdF92bGM7CisKK2F2X2NvbGQgdm9pZCBmZl9tcGVnMTJfaW5pdF92bGNzKHZvaWQpCit7CisgICAgc3RhdGljIGludCBkb25lID0gMDsKKworICAgIGlmICghZG9uZSkgeworICAgICAgICBkb25lID0gMTsKKworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmZmX2RjX2x1bV92bGMsIERDX1ZMQ19CSVRTLCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX21wZWcxMl92bGNfZGNfbHVtX2JpdHMsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9tcGVnMTJfdmxjX2RjX2x1bV9jb2RlLCAyLCAyLCA1MTIpOworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmZmX2RjX2Nocm9tYV92bGMsICBEQ19WTENfQklUUywgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9tcGVnMTJfdmxjX2RjX2Nocm9tYV9iaXRzLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX3ZsY19kY19jaHJvbWFfY29kZSwgMiwgMiwgNTE0KTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZmZl9tdl92bGMsIE1WX1ZMQ19CSVRTLCAxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9tcGVnMTJfbWJNb3Rpb25WZWN0b3JUYWJsZVswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9tcGVnMTJfbWJNb3Rpb25WZWN0b3JUYWJsZVswXVswXSwgMiwgMSwgNTE4KTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZmZl9tYmluY3JfdmxjLCBNQklOQ1JfVkxDX0JJVFMsIDM2LAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21wZWcxMl9tYkFkZHJJbmNyVGFibGVbMF1bMV0sIDIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAmZmZfbXBlZzEyX21iQWRkckluY3JUYWJsZVswXVswXSwgMiwgMSwgNTM4KTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZmZl9tYl9wYXRfdmxjLCBNQl9QQVRfVkxDX0JJVFMsIDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21wZWcxMl9tYlBhdFRhYmxlWzBdWzFdLCAyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21wZWcxMl9tYlBhdFRhYmxlWzBdWzBdLCAyLCAxLCA1MTIpOworCisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmZmZfbWJfcHR5cGVfdmxjLCBNQl9QVFlQRV9WTENfQklUUywgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJsZV9tYl9wdHlwZVswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJsZV9tYl9wdHlwZVswXVswXSwgMiwgMSwgNjQpOworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmZmX21iX2J0eXBlX3ZsYywgTUJfQlRZUEVfVkxDX0JJVFMsIDExLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRhYmxlX21iX2J0eXBlWzBdWzFdLCAyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRhYmxlX21iX2J0eXBlWzBdWzBdLCAyLCAxLCA2NCk7CisgICAgICAgIGZmX2luaXRfcmwoJmZmX3JsX21wZWcxLCBmZl9tcGVnMTJfc3RhdGljX3JsX3RhYmxlX3N0b3JlWzBdKTsKKyAgICAgICAgZmZfaW5pdF9ybCgmZmZfcmxfbXBlZzIsIGZmX21wZWcxMl9zdGF0aWNfcmxfdGFibGVfc3RvcmVbMV0pOworCisgICAgICAgIElOSVRfMkRfVkxDX1JMKGZmX3JsX21wZWcxLCA2ODApOworICAgICAgICBJTklUXzJEX1ZMQ19STChmZl9ybF9tcGVnMiwgNjc0KTsKKyAgICB9Cit9CisKKy8qKgorICogRmluZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lIGluIHRoZSBiaXRzdHJlYW0uCisgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbmV4dCBmcmFtZSwgb3IgLTEKKyAqLworaW50IGZmX21wZWcxX2ZpbmRfZnJhbWVfZW5kKFBhcnNlQ29udGV4dCAqcGMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBBVkNvZGVjUGFyc2VyQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50MzJfdCBzdGF0ZSA9IHBjLT5zdGF0ZTsKKworICAgIC8qIEVPRiBjb25zaWRlcmVkIGFzIGVuZCBvZiBmcmFtZSAqLworICAgIGlmIChidWZfc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworLyoKKyAwICBmcmFtZSBzdGFydCAgICAgICAgIC0+IDEvNAorIDEgIGZpcnN0X1NFUUVYVCAgICAgICAgLT4gMC8yCisgMiAgZmlyc3QgZmllbGQgc3RhcnQgICAtPiAzLzAKKyAzICBzZWNvbmRfU0VRRVhUICAgICAgIC0+IDIvMAorIDQgIHNlYXJjaGluZyBlbmQKKyovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykgeworICAgICAgICBhdl9hc3NlcnQxKHBjLT5mcmFtZV9zdGFydF9mb3VuZCA+PSAwICYmIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA8PSA0KTsKKyAgICAgICAgaWYgKHBjLT5mcmFtZV9zdGFydF9mb3VuZCAmIDEpIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBFWFRfU1RBUlRfQ09ERSAmJiAoYnVmW2ldICYgMHhGMCkgIT0gMHg4MCkKKyAgICAgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQtLTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IEVYVF9TVEFSVF9DT0RFICsgMikgeworICAgICAgICAgICAgICAgIGlmICgoYnVmW2ldICYgMykgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IChwYy0+ZnJhbWVfc3RhcnRfZm91bmQgKyAxKSAmIDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaSA9IGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUoYnVmICsgaSwgYnVmICsgYnVmX3NpemUsICZzdGF0ZSkgLSBidWYgLSAxOworICAgICAgICAgICAgaWYgKHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9PSAwICYmIHN0YXRlID49IFNMSUNFX01JTl9TVEFSVF9DT0RFICYmIHN0YXRlIDw9IFNMSUNFX01BWF9TVEFSVF9DT0RFKSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU0VRX0VORF9DT0RFKSB7CisgICAgICAgICAgICAgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gMDsKKyAgICAgICAgICAgICAgICBwYy0+c3RhdGU9LTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkrMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPT0gMiAmJiBzdGF0ZSA9PSBTRVFfU1RBUlRfQ09ERSkKKyAgICAgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPSAwOworICAgICAgICAgICAgaWYgKHBjLT5mcmFtZV9zdGFydF9mb3VuZCAgPCA0ICYmIHN0YXRlID09IEVYVF9TVEFSVF9DT0RFKQorICAgICAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCsrOworICAgICAgICAgICAgaWYgKHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9PSA0ICYmIChzdGF0ZSAmIDB4RkZGRkZGMDApID09IDB4MTAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlIDwgU0xJQ0VfTUlOX1NUQVJUX0NPREUgfHwgc3RhdGUgPiBTTElDRV9NQVhfU1RBUlRfQ09ERSkgeworICAgICAgICAgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPSAwOworICAgICAgICAgICAgICAgICAgICBwYy0+c3RhdGUgICAgICAgICAgICAgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPT0gMCAmJiBzICYmIHN0YXRlID09IFBJQ1RVUkVfU1RBUlRfQ09ERSkgeworICAgICAgICAgICAgICAgIGZmX2ZldGNoX3RpbWVzdGFtcChzLCBpIC0gMywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcGMtPnN0YXRlID0gc3RhdGU7CisgICAgcmV0dXJuIEVORF9OT1RfRk9VTkQ7Cit9CisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWcxMi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZzEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlYmQyMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWcxMi5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBNUEVHMS8yIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTVBFRzEyX0gKKyNkZWZpbmUgQVZDT0RFQ19NUEVHMTJfSAorCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisKKyNkZWZpbmUgRENfVkxDX0JJVFMgOQorI2RlZmluZSBNVl9WTENfQklUUyA5CisjZGVmaW5lIFRFWF9WTENfQklUUyA5CisKKyNkZWZpbmUgTUJJTkNSX1ZMQ19CSVRTIDkKKyNkZWZpbmUgTUJfUEFUX1ZMQ19CSVRTIDkKKyNkZWZpbmUgTUJfUFRZUEVfVkxDX0JJVFMgNgorI2RlZmluZSBNQl9CVFlQRV9WTENfQklUUyA2CisKK2V4dGVybiBWTEMgZmZfZGNfbHVtX3ZsYzsKK2V4dGVybiBWTEMgZmZfZGNfY2hyb21hX3ZsYzsKK2V4dGVybiBWTEMgZmZfbWJpbmNyX3ZsYzsKK2V4dGVybiBWTEMgZmZfbWJfcHR5cGVfdmxjOworZXh0ZXJuIFZMQyBmZl9tYl9idHlwZV92bGM7CitleHRlcm4gVkxDIGZmX21iX3BhdF92bGM7CitleHRlcm4gVkxDIGZmX212X3ZsYzsKKworZXh0ZXJuIHVpbnQ4X3QgZmZfbXBlZzEyX3N0YXRpY19ybF90YWJsZV9zdG9yZVsyXVsyXVsyKk1BWF9SVU4gKyBNQVhfTEVWRUwgKyAzXTsKKwordm9pZCBmZl9tcGVnMTJfY29tbW9uX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpOwordm9pZCBmZl9tcGVnMTJfaW5pdF92bGNzKHZvaWQpOworCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfZGMoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBjb21wb25lbnQpCit7CisgICAgaW50IGNvZGUsIGRpZmY7CisKKyAgICBpZiAoY29tcG9uZW50ID09IDApIHsKKyAgICAgICAgY29kZSA9IGdldF92bGMyKGdiLCBmZl9kY19sdW1fdmxjLnRhYmxlLCBEQ19WTENfQklUUywgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZSA9IGdldF92bGMyKGdiLCBmZl9kY19jaHJvbWFfdmxjLnRhYmxlLCBEQ19WTENfQklUUywgMik7CisgICAgfQorICAgIGlmIChjb2RlIDwgMCl7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGRjIGNvZGUgYXRcbiIpOworICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIH0KKyAgICBpZiAoY29kZSA9PSAwKSB7CisgICAgICAgIGRpZmYgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZmYgPSBnZXRfeGJpdHMoZ2IsIGNvZGUpOworICAgIH0KKyAgICByZXR1cm4gZGlmZjsKK30KKworaW50IGZmX21wZWcxX2RlY29kZV9ibG9ja19pbnRyYShNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2ssIGludCBuKTsKK3ZvaWQgZmZfbXBlZzFfY2xlYW5fYnVmZmVycyhNcGVnRW5jQ29udGV4dCAqcyk7CitpbnQgZmZfbXBlZzFfZmluZF9mcmFtZV9lbmQoUGFyc2VDb250ZXh0ICpwYywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTVBFRzEyX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWcxMmRhdGEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWcxMmRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGM0YTVkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZzEyZGF0YS5jCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogTVBFRzEvMiB0YWJsZXMKKyAqIGNvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogY29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVBFRzEvMiB0YWJsZXMuCisgKi8KKworI2luY2x1ZGUgIm1wZWcxMmRhdGEuaCIKKworY29uc3QgdWludDE2X3QgZmZfbXBlZzFfZGVmYXVsdF9pbnRyYV9tYXRyaXhbMjU2XSA9IHsKKyAgICAgICAgOCwgMTYsIDE5LCAyMiwgMjYsIDI3LCAyOSwgMzQsCisgICAgICAgIDE2LCAxNiwgMjIsIDI0LCAyNywgMjksIDM0LCAzNywKKyAgICAgICAgMTksIDIyLCAyNiwgMjcsIDI5LCAzNCwgMzQsIDM4LAorICAgICAgICAyMiwgMjIsIDI2LCAyNywgMjksIDM0LCAzNywgNDAsCisgICAgICAgIDIyLCAyNiwgMjcsIDI5LCAzMiwgMzUsIDQwLCA0OCwKKyAgICAgICAgMjYsIDI3LCAyOSwgMzIsIDM1LCA0MCwgNDgsIDU4LAorICAgICAgICAyNiwgMjcsIDI5LCAzNCwgMzgsIDQ2LCA1NiwgNjksCisgICAgICAgIDI3LCAyOSwgMzUsIDM4LCA0NiwgNTYsIDY5LCA4MworfTsKKworY29uc3QgdWludDE2X3QgZmZfbXBlZzFfZGVmYXVsdF9ub25faW50cmFfbWF0cml4WzY0XSA9IHsKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorfTsKKworY29uc3QgdWludDE2X3QgZmZfbXBlZzEyX3ZsY19kY19sdW1fY29kZVsxMl0gPSB7CisgICAgMHg0LCAweDAsIDB4MSwgMHg1LCAweDYsIDB4ZSwgMHgxZSwgMHgzZSwgMHg3ZSwgMHhmZSwgMHgxZmUsIDB4MWZmLAorfTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgZmZfbXBlZzEyX3ZsY19kY19sdW1fYml0c1sxMl0gPSB7CisgICAgMywgMiwgMiwgMywgMywgNCwgNSwgNiwgNywgOCwgOSwgOSwKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX21wZWcxMl92bGNfZGNfY2hyb21hX2NvZGVbMTJdID0geworICAgIDB4MCwgMHgxLCAweDIsIDB4NiwgMHhlLCAweDFlLCAweDNlLCAweDdlLCAweGZlLCAweDFmZSwgMHgzZmUsIDB4M2ZmLAorfTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgZmZfbXBlZzEyX3ZsY19kY19jaHJvbWFfYml0c1sxMl0gPSB7CisgICAgMiwgMiwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG1wZWcxX3ZsY1sxMTNdWzJdID0geworIHsgMHgzLCAyIH0sIHsgMHg0LCA0IH0sIHsgMHg1LCA1IH0sIHsgMHg2LCA3IH0sCisgeyAweDI2LCA4IH0sIHsgMHgyMSwgOCB9LCB7IDB4YSwgMTAgfSwgeyAweDFkLCAxMiB9LAorIHsgMHgxOCwgMTIgfSwgeyAweDEzLCAxMiB9LCB7IDB4MTAsIDEyIH0sIHsgMHgxYSwgMTMgfSwKKyB7IDB4MTksIDEzIH0sIHsgMHgxOCwgMTMgfSwgeyAweDE3LCAxMyB9LCB7IDB4MWYsIDE0IH0sCisgeyAweDFlLCAxNCB9LCB7IDB4MWQsIDE0IH0sIHsgMHgxYywgMTQgfSwgeyAweDFiLCAxNCB9LAorIHsgMHgxYSwgMTQgfSwgeyAweDE5LCAxNCB9LCB7IDB4MTgsIDE0IH0sIHsgMHgxNywgMTQgfSwKKyB7IDB4MTYsIDE0IH0sIHsgMHgxNSwgMTQgfSwgeyAweDE0LCAxNCB9LCB7IDB4MTMsIDE0IH0sCisgeyAweDEyLCAxNCB9LCB7IDB4MTEsIDE0IH0sIHsgMHgxMCwgMTQgfSwgeyAweDE4LCAxNSB9LAorIHsgMHgxNywgMTUgfSwgeyAweDE2LCAxNSB9LCB7IDB4MTUsIDE1IH0sIHsgMHgxNCwgMTUgfSwKKyB7IDB4MTMsIDE1IH0sIHsgMHgxMiwgMTUgfSwgeyAweDExLCAxNSB9LCB7IDB4MTAsIDE1IH0sCisgeyAweDMsIDMgfSwgeyAweDYsIDYgfSwgeyAweDI1LCA4IH0sIHsgMHhjLCAxMCB9LAorIHsgMHgxYiwgMTIgfSwgeyAweDE2LCAxMyB9LCB7IDB4MTUsIDEzIH0sIHsgMHgxZiwgMTUgfSwKKyB7IDB4MWUsIDE1IH0sIHsgMHgxZCwgMTUgfSwgeyAweDFjLCAxNSB9LCB7IDB4MWIsIDE1IH0sCisgeyAweDFhLCAxNSB9LCB7IDB4MTksIDE1IH0sIHsgMHgxMywgMTYgfSwgeyAweDEyLCAxNiB9LAorIHsgMHgxMSwgMTYgfSwgeyAweDEwLCAxNiB9LCB7IDB4NSwgNCB9LCB7IDB4NCwgNyB9LAorIHsgMHhiLCAxMCB9LCB7IDB4MTQsIDEyIH0sIHsgMHgxNCwgMTMgfSwgeyAweDcsIDUgfSwKKyB7IDB4MjQsIDggfSwgeyAweDFjLCAxMiB9LCB7IDB4MTMsIDEzIH0sIHsgMHg2LCA1IH0sCisgeyAweGYsIDEwIH0sIHsgMHgxMiwgMTIgfSwgeyAweDcsIDYgfSwgeyAweDksIDEwIH0sCisgeyAweDEyLCAxMyB9LCB7IDB4NSwgNiB9LCB7IDB4MWUsIDEyIH0sIHsgMHgxNCwgMTYgfSwKKyB7IDB4NCwgNiB9LCB7IDB4MTUsIDEyIH0sIHsgMHg3LCA3IH0sIHsgMHgxMSwgMTIgfSwKKyB7IDB4NSwgNyB9LCB7IDB4MTEsIDEzIH0sIHsgMHgyNywgOCB9LCB7IDB4MTAsIDEzIH0sCisgeyAweDIzLCA4IH0sIHsgMHgxYSwgMTYgfSwgeyAweDIyLCA4IH0sIHsgMHgxOSwgMTYgfSwKKyB7IDB4MjAsIDggfSwgeyAweDE4LCAxNiB9LCB7IDB4ZSwgMTAgfSwgeyAweDE3LCAxNiB9LAorIHsgMHhkLCAxMCB9LCB7IDB4MTYsIDE2IH0sIHsgMHg4LCAxMCB9LCB7IDB4MTUsIDE2IH0sCisgeyAweDFmLCAxMiB9LCB7IDB4MWEsIDEyIH0sIHsgMHgxOSwgMTIgfSwgeyAweDE3LCAxMiB9LAorIHsgMHgxNiwgMTIgfSwgeyAweDFmLCAxMyB9LCB7IDB4MWUsIDEzIH0sIHsgMHgxZCwgMTMgfSwKKyB7IDB4MWMsIDEzIH0sIHsgMHgxYiwgMTMgfSwgeyAweDFmLCAxNiB9LCB7IDB4MWUsIDE2IH0sCisgeyAweDFkLCAxNiB9LCB7IDB4MWMsIDE2IH0sIHsgMHgxYiwgMTYgfSwKKyB7IDB4MSwgNiB9LCAvKiBlc2NhcGUgKi8KKyB7IDB4MiwgMiB9LCAvKiBFT0IgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBtcGVnMl92bGNbMTEzXVsyXSA9IHsKKyAgezB4MDIsIDJ9LCB7MHgwNiwgM30sIHsweDA3LCA0fSwgezB4MWMsIDV9LAorICB7MHgxZCwgNX0sIHsweDA1LCA2fSwgezB4MDQsIDZ9LCB7MHg3YiwgN30sCisgIHsweDdjLCA3fSwgezB4MjMsIDh9LCB7MHgyMiwgOH0sIHsweGZhLCA4fSwKKyAgezB4ZmIsIDh9LCB7MHhmZSwgOH0sIHsweGZmLCA4fSwgezB4MWYsMTR9LAorICB7MHgxZSwxNH0sIHsweDFkLDE0fSwgezB4MWMsMTR9LCB7MHgxYiwxNH0sCisgIHsweDFhLDE0fSwgezB4MTksMTR9LCB7MHgxOCwxNH0sIHsweDE3LDE0fSwKKyAgezB4MTYsMTR9LCB7MHgxNSwxNH0sIHsweDE0LDE0fSwgezB4MTMsMTR9LAorICB7MHgxMiwxNH0sIHsweDExLDE0fSwgezB4MTAsMTR9LCB7MHgxOCwxNX0sCisgIHsweDE3LDE1fSwgezB4MTYsMTV9LCB7MHgxNSwxNX0sIHsweDE0LDE1fSwKKyAgezB4MTMsMTV9LCB7MHgxMiwxNX0sIHsweDExLDE1fSwgezB4MTAsMTV9LAorICB7MHgwMiwgM30sIHsweDA2LCA1fSwgezB4NzksIDd9LCB7MHgyNywgOH0sCisgIHsweDIwLCA4fSwgezB4MTYsMTN9LCB7MHgxNSwxM30sIHsweDFmLDE1fSwKKyAgezB4MWUsMTV9LCB7MHgxZCwxNX0sIHsweDFjLDE1fSwgezB4MWIsMTV9LAorICB7MHgxYSwxNX0sIHsweDE5LDE1fSwgezB4MTMsMTZ9LCB7MHgxMiwxNn0sCisgIHsweDExLDE2fSwgezB4MTAsMTZ9LCB7MHgwNSwgNX0sIHsweDA3LCA3fSwKKyAgezB4ZmMsIDh9LCB7MHgwYywxMH0sIHsweDE0LDEzfSwgezB4MDcsIDV9LAorICB7MHgyNiwgOH0sIHsweDFjLDEyfSwgezB4MTMsMTN9LCB7MHgwNiwgNn0sCisgIHsweGZkLCA4fSwgezB4MTIsMTJ9LCB7MHgwNywgNn0sIHsweDA0LCA5fSwKKyAgezB4MTIsMTN9LCB7MHgwNiwgN30sIHsweDFlLDEyfSwgezB4MTQsMTZ9LAorICB7MHgwNCwgN30sIHsweDE1LDEyfSwgezB4MDUsIDd9LCB7MHgxMSwxMn0sCisgIHsweDc4LCA3fSwgezB4MTEsMTN9LCB7MHg3YSwgN30sIHsweDEwLDEzfSwKKyAgezB4MjEsIDh9LCB7MHgxYSwxNn0sIHsweDI1LCA4fSwgezB4MTksMTZ9LAorICB7MHgyNCwgOH0sIHsweDE4LDE2fSwgezB4MDUsIDl9LCB7MHgxNywxNn0sCisgIHsweDA3LCA5fSwgezB4MTYsMTZ9LCB7MHgwZCwxMH0sIHsweDE1LDE2fSwKKyAgezB4MWYsMTJ9LCB7MHgxYSwxMn0sIHsweDE5LDEyfSwgezB4MTcsMTJ9LAorICB7MHgxNiwxMn0sIHsweDFmLDEzfSwgezB4MWUsMTN9LCB7MHgxZCwxM30sCisgIHsweDFjLDEzfSwgezB4MWIsMTN9LCB7MHgxZiwxNn0sIHsweDFlLDE2fSwKKyAgezB4MWQsMTZ9LCB7MHgxYywxNn0sIHsweDFiLDE2fSwKKyAgezB4MDEsNn0sIC8qIGVzY2FwZSAqLworICB7MHgwNiw0fSwgLyogRU9CICovCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IG1wZWcxX2xldmVsWzExMV0gPSB7CisgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LAorICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKyAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLAorIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKKyAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCisgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LAorIDE3LCAxOCwgIDEsICAyLCAgMywgIDQsICA1LCAgMSwKKyAgMiwgIDMsICA0LCAgMSwgIDIsICAzLCAgMSwgIDIsCisgIDMsICAxLCAgMiwgIDMsICAxLCAgMiwgIDEsICAyLAorICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwKKyAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBtcGVnMV9ydW5bMTExXSA9IHsKKyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAzLAorICAzLCAgMywgIDMsICA0LCAgNCwgIDQsICA1LCAgNSwKKyAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsCisgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLAorIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsIDE2LCAxNiwKKyAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCit9OworCitSTFRhYmxlIGZmX3JsX21wZWcxID0geworICAgIDExMSwKKyAgICAxMTEsCisgICAgbXBlZzFfdmxjLAorICAgIG1wZWcxX3J1biwKKyAgICBtcGVnMV9sZXZlbCwKK307CisKK1JMVGFibGUgZmZfcmxfbXBlZzIgPSB7CisgICAgMTExLAorICAgIDExMSwKKyAgICBtcGVnMl92bGMsCisgICAgbXBlZzFfcnVuLAorICAgIG1wZWcxX2xldmVsLAorfTsKKworY29uc3QgdWludDhfdCBmZl9tcGVnMTJfbWJBZGRySW5jclRhYmxlWzM2XVsyXSA9IHsKKyAgICB7MHgxLCAxfSwKKyAgICB7MHgzLCAzfSwKKyAgICB7MHgyLCAzfSwKKyAgICB7MHgzLCA0fSwKKyAgICB7MHgyLCA0fSwKKyAgICB7MHgzLCA1fSwKKyAgICB7MHgyLCA1fSwKKyAgICB7MHg3LCA3fSwKKyAgICB7MHg2LCA3fSwKKyAgICB7MHhiLCA4fSwKKyAgICB7MHhhLCA4fSwKKyAgICB7MHg5LCA4fSwKKyAgICB7MHg4LCA4fSwKKyAgICB7MHg3LCA4fSwKKyAgICB7MHg2LCA4fSwKKyAgICB7MHgxNywgMTB9LAorICAgIHsweDE2LCAxMH0sCisgICAgezB4MTUsIDEwfSwKKyAgICB7MHgxNCwgMTB9LAorICAgIHsweDEzLCAxMH0sCisgICAgezB4MTIsIDEwfSwKKyAgICB7MHgyMywgMTF9LAorICAgIHsweDIyLCAxMX0sCisgICAgezB4MjEsIDExfSwKKyAgICB7MHgyMCwgMTF9LAorICAgIHsweDFmLCAxMX0sCisgICAgezB4MWUsIDExfSwKKyAgICB7MHgxZCwgMTF9LAorICAgIHsweDFjLCAxMX0sCisgICAgezB4MWIsIDExfSwKKyAgICB7MHgxYSwgMTF9LAorICAgIHsweDE5LCAxMX0sCisgICAgezB4MTgsIDExfSwKKyAgICB7MHg4LCAxMX0sIC8qIGVzY2FwZSAqLworICAgIHsweGYsIDExfSwgLyogc3R1ZmZpbmcgKi8KKyAgICB7MHgwLCA4fSwgLyogZW5kIChhbmQgMTUgbW9yZSAwIGJpdHMgc2hvdWxkIGZvbGxvdykgKi8KK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfbXBlZzEyX21iUGF0VGFibGVbNjRdWzJdID0geworICAgIHsweDEsIDl9LAorICAgIHsweGIsIDV9LAorICAgIHsweDksIDV9LAorICAgIHsweGQsIDZ9LAorICAgIHsweGQsIDR9LAorICAgIHsweDE3LCA3fSwKKyAgICB7MHgxMywgN30sCisgICAgezB4MWYsIDh9LAorICAgIHsweGMsIDR9LAorICAgIHsweDE2LCA3fSwKKyAgICB7MHgxMiwgN30sCisgICAgezB4MWUsIDh9LAorICAgIHsweDEzLCA1fSwKKyAgICB7MHgxYiwgOH0sCisgICAgezB4MTcsIDh9LAorICAgIHsweDEzLCA4fSwKKyAgICB7MHhiLCA0fSwKKyAgICB7MHgxNSwgN30sCisgICAgezB4MTEsIDd9LAorICAgIHsweDFkLCA4fSwKKyAgICB7MHgxMSwgNX0sCisgICAgezB4MTksIDh9LAorICAgIHsweDE1LCA4fSwKKyAgICB7MHgxMSwgOH0sCisgICAgezB4ZiwgNn0sCisgICAgezB4ZiwgOH0sCisgICAgezB4ZCwgOH0sCisgICAgezB4MywgOX0sCisgICAgezB4ZiwgNX0sCisgICAgezB4YiwgOH0sCisgICAgezB4NywgOH0sCisgICAgezB4NywgOX0sCisgICAgezB4YSwgNH0sCisgICAgezB4MTQsIDd9LAorICAgIHsweDEwLCA3fSwKKyAgICB7MHgxYywgOH0sCisgICAgezB4ZSwgNn0sCisgICAgezB4ZSwgOH0sCisgICAgezB4YywgOH0sCisgICAgezB4MiwgOX0sCisgICAgezB4MTAsIDV9LAorICAgIHsweDE4LCA4fSwKKyAgICB7MHgxNCwgOH0sCisgICAgezB4MTAsIDh9LAorICAgIHsweGUsIDV9LAorICAgIHsweGEsIDh9LAorICAgIHsweDYsIDh9LAorICAgIHsweDYsIDl9LAorICAgIHsweDEyLCA1fSwKKyAgICB7MHgxYSwgOH0sCisgICAgezB4MTYsIDh9LAorICAgIHsweDEyLCA4fSwKKyAgICB7MHhkLCA1fSwKKyAgICB7MHg5LCA4fSwKKyAgICB7MHg1LCA4fSwKKyAgICB7MHg1LCA5fSwKKyAgICB7MHhjLCA1fSwKKyAgICB7MHg4LCA4fSwKKyAgICB7MHg0LCA4fSwKKyAgICB7MHg0LCA5fSwKKyAgICB7MHg3LCAzfSwKKyAgICB7MHhhLCA1fSwKKyAgICB7MHg4LCA1fSwKKyAgICB7MHhjLCA2fQorfTsKKworY29uc3QgdWludDhfdCBmZl9tcGVnMTJfbWJNb3Rpb25WZWN0b3JUYWJsZVsxN11bMl0gPSB7Cit7IDB4MSwgMSB9LAoreyAweDEsIDIgfSwKK3sgMHgxLCAzIH0sCit7IDB4MSwgNCB9LAoreyAweDMsIDYgfSwKK3sgMHg1LCA3IH0sCit7IDB4NCwgNyB9LAoreyAweDMsIDcgfSwKK3sgMHhiLCA5IH0sCit7IDB4YSwgOSB9LAoreyAweDksIDkgfSwKK3sgMHgxMSwgMTAgfSwKK3sgMHgxMCwgMTAgfSwKK3sgMHhmLCAxMCB9LAoreyAweGUsIDEwIH0sCit7IDB4ZCwgMTAgfSwKK3sgMHhjLCAxMCB9LAorfTsKKworY29uc3QgQVZSYXRpb25hbCBmZl9tcGVnMTJfZnJhbWVfcmF0ZV90YWJbMTZdID0geworICAgIHsgICAgMCwgICAgMH0sCisgICAgezI0MDAwLCAxMDAxfSwKKyAgICB7ICAgMjQsICAgIDF9LAorICAgIHsgICAyNSwgICAgMX0sCisgICAgezMwMDAwLCAxMDAxfSwKKyAgICB7ICAgMzAsICAgIDF9LAorICAgIHsgICA1MCwgICAgMX0sCisgICAgezYwMDAwLCAxMDAxfSwKKyAgICB7ICAgNjAsICAgIDF9LAorICAvLyBYaW5nJ3MgMTVmcHM6ICg5KQorICAgIHsgICAxNSwgICAgMX0sCisgIC8vIGxpYm1wZWczJ3MgIlVub2ZmaWNpYWwgZWNvbm9teSByYXRlcyI6ICgxMC0xMykKKyAgICB7ICAgIDUsICAgIDF9LAorICAgIHsgICAxMCwgICAgMX0sCisgICAgeyAgIDEyLCAgICAxfSwKKyAgICB7ICAgMTUsICAgIDF9LAorICAgIHsgICAgMCwgICAgMH0sCit9OworCitjb25zdCBBVlJhdGlvbmFsIGZmX21wZWcyX2ZyYW1lX3JhdGVfdGFiW10gPSB7CisgICAgeyAgICAgIDEsICAgICAxfSwKKyAgICB7ICAgICAgMiwgICAgIDF9LAorICAgIHsgICAgICAzLCAgICAgMX0sCisgICAgeyAgICAgIDQsICAgICAxfSwKKyAgICB7ICAgICAgNSwgICAgIDF9LAorICAgIHsgICAgICA2LCAgICAgMX0sCisgICAgeyAgICAgIDgsICAgICAxfSwKKyAgICB7ICAgICAgOSwgICAgIDF9LAorICAgIHsgICAgIDEwLCAgICAgMX0sCisgICAgeyAgICAgMTIsICAgICAxfSwKKyAgICB7ICAgICAxNSwgICAgIDF9LAorICAgIHsgICAgIDE2LCAgICAgMX0sCisgICAgeyAgICAgMTgsICAgICAxfSwKKyAgICB7ICAgICAyMCwgICAgIDF9LAorICAgIHsgICAgIDI0LCAgICAgMX0sCisgICAgeyAgICAgMjUsICAgICAxfSwKKyAgICB7ICAgICAzMCwgICAgIDF9LAorICAgIHsgICAgIDMyLCAgICAgMX0sCisgICAgeyAgICAgMzYsICAgICAxfSwKKyAgICB7ICAgICA0MCwgICAgIDF9LAorICAgIHsgICAgIDQ1LCAgICAgMX0sCisgICAgeyAgICAgNDgsICAgICAxfSwKKyAgICB7ICAgICA1MCwgICAgIDF9LAorICAgIHsgICAgIDYwLCAgICAgMX0sCisgICAgeyAgICAgNzIsICAgICAxfSwKKyAgICB7ICAgICA3NSwgICAgIDF9LAorICAgIHsgICAgIDgwLCAgICAgMX0sCisgICAgeyAgICAgOTAsICAgICAxfSwKKyAgICB7ICAgICA5NiwgICAgIDF9LAorICAgIHsgICAgMTAwLCAgICAgMX0sCisgICAgeyAgICAxMjAsICAgICAxfSwKKyAgICB7ICAgIDE1MCwgICAgIDF9LAorICAgIHsgICAgMTgwLCAgICAgMX0sCisgICAgeyAgICAyMDAsICAgICAxfSwKKyAgICB7ICAgIDI0MCwgICAgIDF9LAorICAgIHsgICAgNzUwLCAgMTAwMX0sCisgICAgeyAgICA4MDAsICAxMDAxfSwKKyAgICB7ICAgIDk2MCwgIDEwMDF9LAorICAgIHsgICAxMDAwLCAgMTAwMX0sCisgICAgeyAgIDEyMDAsICAxMDAxfSwKKyAgICB7ICAgMTI1MCwgIDEwMDF9LAorICAgIHsgICAxNTAwLCAgMTAwMX0sCisgICAgeyAgIDE2MDAsICAxMDAxfSwKKyAgICB7ICAgMTg3NSwgIDEwMDF9LAorICAgIHsgICAyMDAwLCAgMTAwMX0sCisgICAgeyAgIDI0MDAsICAxMDAxfSwKKyAgICB7ICAgMjUwMCwgIDEwMDF9LAorICAgIHsgICAzMDAwLCAgMTAwMX0sCisgICAgeyAgIDM3NTAsICAxMDAxfSwKKyAgICB7ICAgNDAwMCwgIDEwMDF9LAorICAgIHsgICA0ODAwLCAgMTAwMX0sCisgICAgeyAgIDUwMDAsICAxMDAxfSwKKyAgICB7ICAgNjAwMCwgIDEwMDF9LAorICAgIHsgICA3NTAwLCAgMTAwMX0sCisgICAgeyAgIDgwMDAsICAxMDAxfSwKKyAgICB7ICAxMDAwMCwgIDEwMDF9LAorICAgIHsgIDEyMDAwLCAgMTAwMX0sCisgICAgeyAgMTUwMDAsICAxMDAxfSwKKyAgICB7ICAyMDAwMCwgIDEwMDF9LAorICAgIHsgIDI0MDAwLCAgMTAwMX0sCisgICAgeyAgMzAwMDAsICAxMDAxfSwKKyAgICB7ICA2MDAwMCwgIDEwMDF9LAorICAgIHsgICAgICAwLCAgICAgMH0sCit9OworCitjb25zdCBmbG9hdCBmZl9tcGVnMV9hc3BlY3RbMTZdPXsKKyAgICAwLjAwMDAsCisgICAgMS4wMDAwLAorICAgIDAuNjczNSwKKyAgICAwLjcwMzEsCisKKyAgICAwLjc2MTUsCisgICAgMC44MDU1LAorICAgIDAuODQzNywKKyAgICAwLjg5MzUsCisKKyAgICAwLjkxNTcsCisgICAgMC45ODE1LAorICAgIDEuMDI1NSwKKyAgICAxLjA2OTUsCisKKyAgICAxLjA5NTAsCisgICAgMS4xNTc1LAorICAgIDEuMjAxNSwKK307CisKK2NvbnN0IEFWUmF0aW9uYWwgZmZfbXBlZzJfYXNwZWN0WzE2XT17CisgICAgezAsMX0sCisgICAgezEsMX0sCisgICAgezQsM30sCisgICAgezE2LDl9LAorICAgIHsyMjEsMTAwfSwKKyAgICB7MCwxfSwKKyAgICB7MCwxfSwKKyAgICB7MCwxfSwKKyAgICB7MCwxfSwKKyAgICB7MCwxfSwKKyAgICB7MCwxfSwKKyAgICB7MCwxfSwKKyAgICB7MCwxfSwKKyAgICB7MCwxfSwKKyAgICB7MCwxfSwKKyAgICB7MCwxfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnMTJkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnMTJkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViOTQ4NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWcxMmRhdGEuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogTVBFRzEvMiB0YWJsZXMKKyAqIGNvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogY29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVBFRzEvMiB0YWJsZXMuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01QRUcxMkRBVEFfSAorI2RlZmluZSBBVkNPREVDX01QRUcxMkRBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL3JhdGlvbmFsLmgiCisjaW5jbHVkZSAicmwuaCIKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX21wZWcxX2RlZmF1bHRfaW50cmFfbWF0cml4W107CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfbXBlZzFfZGVmYXVsdF9ub25faW50cmFfbWF0cml4WzY0XTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX21wZWcxMl92bGNfZGNfbHVtX2NvZGVbMTJdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZmZfbXBlZzEyX3ZsY19kY19sdW1fYml0c1sxMl07CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfbXBlZzEyX3ZsY19kY19jaHJvbWFfY29kZVsxMl07CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBmZl9tcGVnMTJfdmxjX2RjX2Nocm9tYV9iaXRzWzEyXTsKKworZXh0ZXJuIFJMVGFibGUgZmZfcmxfbXBlZzE7CitleHRlcm4gUkxUYWJsZSBmZl9ybF9tcGVnMjsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfbXBlZzEyX21iQWRkckluY3JUYWJsZVszNl1bMl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9tcGVnMTJfbWJQYXRUYWJsZVs2NF1bMl07CisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX21wZWcxMl9tYk1vdGlvblZlY3RvclRhYmxlWzE3XVsyXTsKKworZXh0ZXJuIGNvbnN0IEFWUmF0aW9uYWwgZmZfbXBlZzEyX2ZyYW1lX3JhdGVfdGFiW107CitleHRlcm4gY29uc3QgQVZSYXRpb25hbCBmZl9tcGVnMl9mcmFtZV9yYXRlX3RhYltdOworCitleHRlcm4gY29uc3QgZmxvYXQgZmZfbXBlZzFfYXNwZWN0WzE2XTsKK2V4dGVybiBjb25zdCBBVlJhdGlvbmFsIGZmX21wZWcyX2FzcGVjdFsxNl07CisKKyNlbmRpZiAvKiBBVkNPREVDX01QRUcxMkRBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZzEyZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnMTJkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODg4OGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZzEyZGVjLmMKQEAgLTAsMCArMSwyOTM3IEBACisvKgorICogTVBFRy0xLzIgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVBFRy0xLzIgZGVjb2RlcgorICovCisKKyNkZWZpbmUgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIgMQorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zdGVyZW8zZC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXBlZ19lci5oIgorI2luY2x1ZGUgIm1wZWcxMi5oIgorI2luY2x1ZGUgIm1wZWcxMmRhdGEuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisjaW5jbHVkZSAidmRwYXVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ4dm1jX2ludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IE1wZWcxQ29udGV4dCB7CisgICAgTXBlZ0VuY0NvbnRleHQgbXBlZ19lbmNfY3R4OworICAgIGludCBtcGVnX2VuY19jdHhfYWxsb2NhdGVkOyAvKiB0cnVlIGlmIGRlY29kaW5nIGNvbnRleHQgYWxsb2NhdGVkICovCisgICAgaW50IHJlcGVhdF9maWVsZDsgICAgICAgICAgIC8qIHRydWUgaWYgd2UgbXVzdCByZXBlYXQgdGhlIGZpZWxkICovCisgICAgQVZQYW5TY2FuIHBhbl9zY2FuOyAgICAgICAgIC8qIHNvbWUgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHRoZSBwYW5zY2FuICovCisgICAgQVZTdGVyZW8zRCBzdGVyZW8zZDsKKyAgICBpbnQgaGFzX3N0ZXJlbzNkOworICAgIHVpbnQ4X3QgKmE1M19jYXB0aW9uOworICAgIGludCBhNTNfY2FwdGlvbl9zaXplOworICAgIHVpbnQ4X3QgYWZkOworICAgIGludCBoYXNfYWZkOworICAgIGludCBzbGljZV9jb3VudDsKKyAgICBpbnQgc2F2ZV9hc3BlY3RfaW5mbzsKKyAgICBpbnQgc2F2ZV93aWR0aCwgc2F2ZV9oZWlnaHQsIHNhdmVfcHJvZ3Jlc3NpdmVfc2VxOworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZV9leHQ7ICAvKiBNUEVHLTIgc3BlY2lmaWMgZnJhbWVyYXRlIG1vZGlmaWNhdG9yICovCisgICAgaW50IHN5bmM7ICAgICAgICAgICAgICAgICAgIC8qIERpZCB3ZSByZWFjaCBhIHN5bmMgcG9pbnQgbGlrZSBhIEdPUC9TRVEvS0VZRnJhbWU/ICovCisgICAgaW50IHRtcGdleHM7CisgICAgaW50IGZpcnN0X3NsaWNlOworICAgIGludCBleHRyYWRhdGFfZGVjb2RlZDsKK30gTXBlZzFDb250ZXh0OworCisjZGVmaW5lIE1CX1RZUEVfWkVST19NViAgIDB4MjAwMDAwMDAKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHB0eXBlMm1iX3R5cGVbN10gPSB7CisgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfSU5UUkEsCisgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfTDAgfCBNQl9UWVBFX0NCUCB8IE1CX1RZUEVfWkVST19NViB8IE1CX1RZUEVfMTZ4MTYsCisgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfTDAsCisgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfTDAgfCBNQl9UWVBFX0NCUCwKKyAgICBNQl9UWVBFX1FVQU5UIHwgTUJfVFlQRV9JTlRSQSwKKyAgICBNQl9UWVBFX1FVQU5UIHwgTUJfVFlQRV9MMCB8IE1CX1RZUEVfQ0JQIHwgTUJfVFlQRV9aRVJPX01WIHwgTUJfVFlQRV8xNngxNiwKKyAgICBNQl9UWVBFX1FVQU5UIHwgTUJfVFlQRV9MMCB8IE1CX1RZUEVfQ0JQLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGJ0eXBlMm1iX3R5cGVbMTFdID0geworICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX0lOVFJBLAorICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX0wxLAorICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX0wxICAgfCBNQl9UWVBFX0NCUCwKKyAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9MMCwKKyAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9MMCAgIHwgTUJfVFlQRV9DQlAsCisgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfTDBMMSwKKyAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9MMEwxIHwgTUJfVFlQRV9DQlAsCisgICAgTUJfVFlQRV9RVUFOVCB8IE1CX1RZUEVfSU5UUkEsCisgICAgTUJfVFlQRV9RVUFOVCB8IE1CX1RZUEVfTDEgICB8IE1CX1RZUEVfQ0JQLAorICAgIE1CX1RZUEVfUVVBTlQgfCBNQl9UWVBFX0wwICAgfCBNQl9UWVBFX0NCUCwKKyAgICBNQl9UWVBFX1FVQU5UIHwgTUJfVFlQRV9MMEwxIHwgTUJfVFlQRV9DQlAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBub25fbGluZWFyX3FzY2FsZVszMl0gPSB7CisgICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgICA2LCAgIDcsCisgICAgIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgIDIwLCAgMjIsCisgICAgMjQsIDI4LCAzMiwgMzYsIDQwLCA0NCwgIDQ4LCAgNTIsCisgICAgNTYsIDY0LCA3MiwgODAsIDg4LCA5NiwgMTA0LCAxMTIsCit9OworCisvKiBhcyBILjI2MywgYnV0IG9ubHkgMTcgY29kZXMgKi8KK3N0YXRpYyBpbnQgbXBlZ19kZWNvZGVfbW90aW9uKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgZmNvZGUsIGludCBwcmVkKQoreworICAgIGludCBjb2RlLCBzaWduLCB2YWwsIHNoaWZ0OworCisgICAgY29kZSA9IGdldF92bGMyKCZzLT5nYiwgZmZfbXZfdmxjLnRhYmxlLCBNVl9WTENfQklUUywgMik7CisgICAgaWYgKGNvZGUgPT0gMCkKKyAgICAgICAgcmV0dXJuIHByZWQ7CisgICAgaWYgKGNvZGUgPCAwKQorICAgICAgICByZXR1cm4gMHhmZmZmOworCisgICAgc2lnbiAgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICBzaGlmdCA9IGZjb2RlIC0gMTsKKyAgICB2YWwgICA9IGNvZGU7CisgICAgaWYgKHNoaWZ0KSB7CisgICAgICAgIHZhbCAgPSAodmFsIC0gMSkgPDwgc2hpZnQ7CisgICAgICAgIHZhbCB8PSBnZXRfYml0cygmcy0+Z2IsIHNoaWZ0KTsKKyAgICAgICAgdmFsKys7CisgICAgfQorICAgIGlmIChzaWduKQorICAgICAgICB2YWwgPSAtdmFsOworICAgIHZhbCArPSBwcmVkOworCisgICAgLyogbW9kdWxvIGRlY29kaW5nICovCisgICAgcmV0dXJuIHNpZ25fZXh0ZW5kKHZhbCwgNSArIHNoaWZ0KTsKK30KKworI2RlZmluZSBjaGVja19zY2FudGFibGVfaW5kZXgoY3R4LCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHgpID4gNjMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImFjLXRleCBkYW1hZ2VkIGF0ICVkICVkXG4iLCAgICAgXAorICAgICAgICAgICAgICAgICAgIGN0eC0+bWJfeCwgY3R4LT5tYl95KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IG1wZWcxX2RlY29kZV9ibG9ja19pbnRyYShNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IG4pCit7CisgICAgaW50IGxldmVsLCBkYywgZGlmZiwgaSwgaiwgcnVuOworICAgIGludCBjb21wb25lbnQ7CisgICAgUkxUYWJsZSAqcmwgICAgICAgICAgICAgICAgICA9ICZmZl9ybF9tcGVnMTsKKyAgICB1aW50OF90ICpjb25zdCBzY2FudGFibGUgICAgID0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7CisgICAgY29uc3QgdWludDE2X3QgKnF1YW50X21hdHJpeCA9IHMtPmludHJhX21hdHJpeDsKKyAgICBjb25zdCBpbnQgcXNjYWxlICAgICAgICAgICAgID0gcy0+cXNjYWxlOworCisgICAgLyogREMgY29lZmZpY2llbnQgKi8KKyAgICBjb21wb25lbnQgPSAobiA8PSAzID8gMCA6IG4gLSA0ICsgMSk7CisgICAgZGlmZiA9IGRlY29kZV9kYygmcy0+Z2IsIGNvbXBvbmVudCk7CisgICAgaWYgKGRpZmYgPj0gMHhmZmZmKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZGMgID0gcy0+bGFzdF9kY1tjb21wb25lbnRdOworICAgIGRjICs9IGRpZmY7CisgICAgcy0+bGFzdF9kY1tjb21wb25lbnRdID0gZGM7CisgICAgYmxvY2tbMF0gPSBkYyAqIHF1YW50X21hdHJpeFswXTsKKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiZGM9JWQgZGlmZj0lZFxuIiwgZGMsIGRpZmYpOworICAgIGkgPSAwOworICAgIHsKKyAgICAgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgaWYgKCgoaW50MzJfdClHRVRfQ0FDSEUocmUsICZzLT5nYikpIDw9IChpbnQzMl90KTB4QkZGRkZGRkYpCisgICAgICAgICAgICBnb3RvIGVuZDsKKworICAgICAgICAvKiBub3cgcXVhbnRpZnkgJiBlbmNvZGUgQUMgY29lZmZpY2llbnRzICovCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIEdFVF9STF9WTEMobGV2ZWwsIHJ1biwgcmUsICZzLT5nYiwgcmwtPnJsX3ZsY1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgVEVYX1ZMQ19CSVRTLCAyLCAwKTsKKworICAgICAgICAgICAgaWYgKGxldmVsICE9IDApIHsKKyAgICAgICAgICAgICAgICBpICs9IHJ1bjsKKyAgICAgICAgICAgICAgICBjaGVja19zY2FudGFibGVfaW5kZXgocywgaSk7CisgICAgICAgICAgICAgICAgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gNDsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAtIDEpIHwgMTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCBeIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICBydW4gPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDYpICsgMTsKKyAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCA2KTsKKyAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDgpOworICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gLTEyOCkgeworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgOCkgLSAyNTY7CisgICAgICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDgpOworICAgICAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgICAgIGNoZWNrX3NjYW50YWJsZV9pbmRleChzLCBpKTsKKyAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiA0OworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAtIDEpIHwgMTsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgKiBxc2NhbGUgKiBxdWFudF9tYXRyaXhbal0pID4+IDQ7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIC0gMSkgfCAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmxvY2tbal0gPSBsZXZlbDsKKyAgICAgICAgICAgIGlmICgoKGludDMyX3QpR0VUX0NBQ0hFKHJlLCAmcy0+Z2IpKSA8PSAoaW50MzJfdCkweEJGRkZGRkZGKQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgfQorZW5kOgorICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAyKTsKKyAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOworICAgIH0KKyAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX21wZWcxX2RlY29kZV9ibG9ja19pbnRyYShNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2ssIGludCBuKQoreworICAgIHJldHVybiBtcGVnMV9kZWNvZGVfYmxvY2tfaW50cmEocywgYmxvY2ssIG4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBtcGVnMV9kZWNvZGVfYmxvY2tfaW50ZXIoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuKQoreworICAgIGludCBsZXZlbCwgaSwgaiwgcnVuOworICAgIFJMVGFibGUgKnJsICAgICAgICAgICAgICAgICAgPSAmZmZfcmxfbXBlZzE7CisgICAgdWludDhfdCAqY29uc3Qgc2NhbnRhYmxlICAgICA9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkOworICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXggPSBzLT5pbnRlcl9tYXRyaXg7CisgICAgY29uc3QgaW50IHFzY2FsZSAgICAgICAgICAgICA9IHMtPnFzY2FsZTsKKworICAgIHsKKyAgICAgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgICAgIGkgPSAtMTsKKyAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2VmZmljaWVudCwgbm8gbmVlZCB0byBhZGQgc2Vjb25kIFZMQyB0YWJsZQorICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgIGlmICgoKGludDMyX3QpIEdFVF9DQUNIRShyZSwgJnMtPmdiKSkgPCAwKSB7CisgICAgICAgICAgICBsZXZlbCA9ICgzICogcXNjYWxlICogcXVhbnRfbWF0cml4WzBdKSA+PiA1OworICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7CisgICAgICAgICAgICBpZiAoR0VUX0NBQ0hFKHJlLCAmcy0+Z2IpICYgMHg0MDAwMDAwMCkKKyAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgICAgIGJsb2NrWzBdID0gbGV2ZWw7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgMik7CisgICAgICAgICAgICBpZiAoKChpbnQzMl90KSBHRVRfQ0FDSEUocmUsICZzLT5nYikpIDw9IChpbnQzMl90KSAweEJGRkZGRkZGKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIC8qIG5vdyBxdWFudGlmeSAmIGVuY29kZSBBQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgR0VUX1JMX1ZMQyhsZXZlbCwgcnVuLCByZSwgJnMtPmdiLCBybC0+cmxfdmxjWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBURVhfVkxDX0JJVFMsIDIsIDApOworCisgICAgICAgICAgICBpZiAobGV2ZWwgIT0gMCkgeworICAgICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgICAgIGNoZWNrX3NjYW50YWJsZV9pbmRleChzLCBpKTsKKyAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOworICAgICAgICAgICAgICAgIGxldmVsID0gKChsZXZlbCAqIDIgKyAxKSAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gNTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAtIDEpIHwgMTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCBeIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICBydW4gPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDYpICsgMTsKKyAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCA2KTsKKyAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDgpOworICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gLTEyOCkgeworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgOCkgLSAyNTY7CisgICAgICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDgpOworICAgICAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgICAgIGNoZWNrX3NjYW50YWJsZV9pbmRleChzLCBpKTsKKyAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKChsZXZlbCAqIDIgKyAxKSAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKChsZXZlbCAqIDIgKyAxKSAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsOworICAgICAgICAgICAgaWYgKCgoaW50MzJfdCkgR0VUX0NBQ0hFKHJlLCAmcy0+Z2IpKSA8PSAoaW50MzJfdCkgMHhCRkZGRkZGRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgfQorZW5kOgorICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAyKTsKKyAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOworICAgIH0KKyAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGNhbiByZWFkIG91dCBvZiByYW5nZSBhbmQgY3Jhc2ggZm9yIGNvcnJ1cHQgc3RyZWFtcy4KKyAqIENoYW5naW5nIHRoaXMgd291bGQgZWF0IHVwIGFueSBzcGVlZCBiZW5lZml0cyBpdCBoYXMuCisgKiBEbyBub3QgdXNlICJmYXN0IiBmbGFnIGlmIHlvdSBuZWVkIHRoZSBjb2RlIHRvIGJlIHJvYnVzdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbXBlZzFfZmFzdF9kZWNvZGVfYmxvY2tfaW50ZXIoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IG4pCit7CisgICAgaW50IGxldmVsLCBpLCBqLCBydW47CisgICAgUkxUYWJsZSAqcmwgICAgICAgICAgICAgID0gJmZmX3JsX21wZWcxOworICAgIHVpbnQ4X3QgKmNvbnN0IHNjYW50YWJsZSA9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkOworICAgIGNvbnN0IGludCBxc2NhbGUgICAgICAgICA9IHMtPnFzY2FsZTsKKworICAgIHsKKyAgICAgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgICAgIGkgPSAtMTsKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2VmZmljaWVudCwgbm8gbmVlZCB0byBhZGQgc2Vjb25kIFZMQyB0YWJsZS4KKyAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOworICAgICAgICBpZiAoKChpbnQzMl90KSBHRVRfQ0FDSEUocmUsICZzLT5nYikpIDwgMCkgeworICAgICAgICAgICAgbGV2ZWwgPSAoMyAqIHFzY2FsZSkgPj4gMTsKKyAgICAgICAgICAgIGxldmVsID0gKGxldmVsIC0gMSkgfCAxOworICAgICAgICAgICAgaWYgKEdFVF9DQUNIRShyZSwgJnMtPmdiKSAmIDB4NDAwMDAwMDApCisgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICBibG9ja1swXSA9IGxldmVsOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDIpOworICAgICAgICAgICAgaWYgKCgoaW50MzJfdCkgR0VUX0NBQ0hFKHJlLCAmcy0+Z2IpKSA8PSAoaW50MzJfdCkgMHhCRkZGRkZGRikKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5vdyBxdWFudGlmeSAmIGVuY29kZSBBQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgR0VUX1JMX1ZMQyhsZXZlbCwgcnVuLCByZSwgJnMtPmdiLCBybC0+cmxfdmxjWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBURVhfVkxDX0JJVFMsIDIsIDApOworCisgICAgICAgICAgICBpZiAobGV2ZWwgIT0gMCkgeworICAgICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgICAgIGNoZWNrX3NjYW50YWJsZV9pbmRleChzLCBpKTsKKyAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOworICAgICAgICAgICAgICAgIGxldmVsID0gKChsZXZlbCAqIDIgKyAxKSAqIHFzY2FsZSkgPj4gMTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAtIDEpIHwgMTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCBeIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICBydW4gPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDYpICsgMTsKKyAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCA2KTsKKyAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDgpOworICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gLTEyOCkgeworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgOCkgLSAyNTY7CisgICAgICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDgpOworICAgICAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgICAgIGNoZWNrX3NjYW50YWJsZV9pbmRleChzLCBpKTsKKyAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKChsZXZlbCAqIDIgKyAxKSAqIHFzY2FsZSkgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKChsZXZlbCAqIDIgKyAxKSAqIHFzY2FsZSkgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsOworICAgICAgICAgICAgaWYgKCgoaW50MzJfdCkgR0VUX0NBQ0hFKHJlLCAmcy0+Z2IpKSA8PSAoaW50MzJfdCkgMHhCRkZGRkZGRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgfQorZW5kOgorICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAyKTsKKyAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOworICAgIH0KKyAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXBlZzJfZGVjb2RlX2Jsb2NrX25vbl9pbnRyYShNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuKQoreworICAgIGludCBsZXZlbCwgaSwgaiwgcnVuOworICAgIFJMVGFibGUgKnJsID0gJmZmX3JsX21wZWcxOworICAgIHVpbnQ4X3QgKmNvbnN0IHNjYW50YWJsZSA9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkOworICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXg7CisgICAgY29uc3QgaW50IHFzY2FsZSA9IHMtPnFzY2FsZTsKKyAgICBpbnQgbWlzbWF0Y2g7CisKKyAgICBtaXNtYXRjaCA9IDE7CisKKyAgICB7CisgICAgICAgIE9QRU5fUkVBREVSKHJlLCAmcy0+Z2IpOworICAgICAgICBpID0gLTE7CisgICAgICAgIGlmIChuIDwgNCkKKyAgICAgICAgICAgIHF1YW50X21hdHJpeCA9IHMtPmludGVyX21hdHJpeDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcXVhbnRfbWF0cml4ID0gcy0+Y2hyb21hX2ludGVyX21hdHJpeDsKKworICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvZWZmaWNpZW50LCBubyBuZWVkIHRvIGFkZCBzZWNvbmQgVkxDIHRhYmxlLgorICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgIGlmICgoKGludDMyX3QpIEdFVF9DQUNIRShyZSwgJnMtPmdiKSkgPCAwKSB7CisgICAgICAgICAgICBsZXZlbCA9ICgzICogcXNjYWxlICogcXVhbnRfbWF0cml4WzBdKSA+PiA1OworICAgICAgICAgICAgaWYgKEdFVF9DQUNIRShyZSwgJnMtPmdiKSAmIDB4NDAwMDAwMDApCisgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICBibG9ja1swXSAgPSBsZXZlbDsKKyAgICAgICAgICAgIG1pc21hdGNoIF49IGxldmVsOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDIpOworICAgICAgICAgICAgaWYgKCgoaW50MzJfdCkgR0VUX0NBQ0hFKHJlLCAmcy0+Z2IpKSA8PSAoaW50MzJfdCkgMHhCRkZGRkZGRikKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5vdyBxdWFudGlmeSAmIGVuY29kZSBBQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgR0VUX1JMX1ZMQyhsZXZlbCwgcnVuLCByZSwgJnMtPmdiLCBybC0+cmxfdmxjWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBURVhfVkxDX0JJVFMsIDIsIDApOworCisgICAgICAgICAgICBpZiAobGV2ZWwgIT0gMCkgeworICAgICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgICAgIGNoZWNrX3NjYW50YWJsZV9pbmRleChzLCBpKTsKKyAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOworICAgICAgICAgICAgICAgIGxldmVsID0gKChsZXZlbCAqIDIgKyAxKSAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gNTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCBeIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICBydW4gPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDYpICsgMTsKKyAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCA2KTsKKyAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEyKTsKKyAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgMTIpOworCisgICAgICAgICAgICAgICAgaSArPSBydW47CisgICAgICAgICAgICAgICAgY2hlY2tfc2NhbnRhYmxlX2luZGV4KHMsIGkpOworICAgICAgICAgICAgICAgIGogPSBzY2FudGFibGVbaV07CisgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9ICgoLWxldmVsICogMiArIDEpICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiA1OworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9ICgobGV2ZWwgKiAyICsgMSkgKiBxc2NhbGUgKiBxdWFudF9tYXRyaXhbal0pID4+IDU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtaXNtYXRjaCBePSBsZXZlbDsKKyAgICAgICAgICAgIGJsb2NrW2pdICA9IGxldmVsOworICAgICAgICAgICAgaWYgKCgoaW50MzJfdCkgR0VUX0NBQ0hFKHJlLCAmcy0+Z2IpKSA8PSAoaW50MzJfdCkgMHhCRkZGRkZGRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgfQorZW5kOgorICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAyKTsKKyAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOworICAgIH0KKyAgICBibG9ja1s2M10gXj0gKG1pc21hdGNoICYgMSk7CisKKyAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGNhbiByZWFkIG91dCBvZiByYW5nZSBhbmQgY3Jhc2ggZm9yIGNvcnJ1cHQgc3RyZWFtcy4KKyAqIENoYW5naW5nIHRoaXMgd291bGQgZWF0IHVwIGFueSBzcGVlZCBiZW5lZml0cyBpdCBoYXMuCisgKiBEbyBub3QgdXNlICJmYXN0IiBmbGFnIGlmIHlvdSBuZWVkIHRoZSBjb2RlIHRvIGJlIHJvYnVzdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbXBlZzJfZmFzdF9kZWNvZGVfYmxvY2tfbm9uX2ludHJhKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgbikKK3sKKyAgICBpbnQgbGV2ZWwsIGksIGosIHJ1bjsKKyAgICBSTFRhYmxlICpybCAgICAgICAgICAgICAgPSAmZmZfcmxfbXBlZzE7CisgICAgdWludDhfdCAqY29uc3Qgc2NhbnRhYmxlID0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7CisgICAgY29uc3QgaW50IHFzY2FsZSAgICAgICAgID0gcy0+cXNjYWxlOworICAgIE9QRU5fUkVBREVSKHJlLCAmcy0+Z2IpOworICAgIGkgPSAtMTsKKworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29lZmZpY2llbnQsIG5vIG5lZWQgdG8gYWRkIHNlY29uZCBWTEMgdGFibGUKKyAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgaWYgKCgoaW50MzJfdCkgR0VUX0NBQ0hFKHJlLCAmcy0+Z2IpKSA8IDApIHsKKyAgICAgICAgbGV2ZWwgPSAoMyAqIHFzY2FsZSkgPj4gMTsKKyAgICAgICAgaWYgKEdFVF9DQUNIRShyZSwgJnMtPmdiKSAmIDB4NDAwMDAwMDApCisgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgYmxvY2tbMF0gPSBsZXZlbDsKKyAgICAgICAgaSsrOworICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgMik7CisgICAgICAgIGlmICgoKGludDMyX3QpIEdFVF9DQUNIRShyZSwgJnMtPmdiKSkgPD0gKGludDMyX3QpIDB4QkZGRkZGRkYpCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICAvKiBub3cgcXVhbnRpZnkgJiBlbmNvZGUgQUMgY29lZmZpY2llbnRzICovCisgICAgZm9yICg7OykgeworICAgICAgICBHRVRfUkxfVkxDKGxldmVsLCBydW4sIHJlLCAmcy0+Z2IsIHJsLT5ybF92bGNbMF0sIFRFWF9WTENfQklUUywgMiwgMCk7CisKKyAgICAgICAgaWYgKGxldmVsICE9IDApIHsKKyAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgIGxldmVsID0gKChsZXZlbCAqIDIgKyAxKSAqIHFzY2FsZSkgPj4gMTsKKyAgICAgICAgICAgIGxldmVsID0gKGxldmVsIF4gU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKSkgLQorICAgICAgICAgICAgICAgICAgICBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZXNjYXBlICovCisgICAgICAgICAgICBydW4gPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDYpICsgMTsKKyAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDYpOworICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOworICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEyKTsKKyAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCAxMik7CisKKyAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9ICgoLWxldmVsICogMiArIDEpICogcXNjYWxlKSA+PiAxOworICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9ICgobGV2ZWwgKiAyICsgMSkgKiBxc2NhbGUpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBibG9ja1tqXSA9IGxldmVsOworICAgICAgICBpZiAoKChpbnQzMl90KSBHRVRfQ0FDSEUocmUsICZzLT5nYikpIDw9IChpbnQzMl90KSAweEJGRkZGRkZGIHx8IGkgPiA2MykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICB9CitlbmQ6CisgICAgTEFTVF9TS0lQX0JJVFMocmUsICZzLT5nYiwgMik7CisgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOworICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gPSBpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBtcGVnMl9kZWNvZGVfYmxvY2tfaW50cmEoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuKQoreworICAgIGludCBsZXZlbCwgZGMsIGRpZmYsIGksIGosIHJ1bjsKKyAgICBpbnQgY29tcG9uZW50OworICAgIFJMVGFibGUgKnJsOworICAgIHVpbnQ4X3QgKmNvbnN0IHNjYW50YWJsZSA9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkOworICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXg7CisgICAgY29uc3QgaW50IHFzY2FsZSA9IHMtPnFzY2FsZTsKKyAgICBpbnQgbWlzbWF0Y2g7CisKKyAgICAvKiBEQyBjb2VmZmljaWVudCAqLworICAgIGlmIChuIDwgNCkgeworICAgICAgICBxdWFudF9tYXRyaXggPSBzLT5pbnRyYV9tYXRyaXg7CisgICAgICAgIGNvbXBvbmVudCAgICA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcXVhbnRfbWF0cml4ID0gcy0+Y2hyb21hX2ludHJhX21hdHJpeDsKKyAgICAgICAgY29tcG9uZW50ICAgID0gKG4gJiAxKSArIDE7CisgICAgfQorICAgIGRpZmYgPSBkZWNvZGVfZGMoJnMtPmdiLCBjb21wb25lbnQpOworICAgIGlmIChkaWZmID49IDB4ZmZmZikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGRjICA9IHMtPmxhc3RfZGNbY29tcG9uZW50XTsKKyAgICBkYyArPSBkaWZmOworICAgIHMtPmxhc3RfZGNbY29tcG9uZW50XSA9IGRjOworICAgIGJsb2NrWzBdID0gZGMgPDwgKDMgLSBzLT5pbnRyYV9kY19wcmVjaXNpb24pOworICAgIGF2X2Rsb2cocy0+YXZjdHgsICJkYz0lZFxuIiwgYmxvY2tbMF0pOworICAgIG1pc21hdGNoID0gYmxvY2tbMF0gXiAxOworICAgIGkgPSAwOworICAgIGlmIChzLT5pbnRyYV92bGNfZm9ybWF0KQorICAgICAgICBybCA9ICZmZl9ybF9tcGVnMjsKKyAgICBlbHNlCisgICAgICAgIHJsID0gJmZmX3JsX21wZWcxOworCisgICAgeworICAgICAgICBPUEVOX1JFQURFUihyZSwgJnMtPmdiKTsKKyAgICAgICAgLyogbm93IHF1YW50aWZ5ICYgZW5jb2RlIEFDIGNvZWZmaWNpZW50cyAqLworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisgICAgICAgICAgICBHRVRfUkxfVkxDKGxldmVsLCBydW4sIHJlLCAmcy0+Z2IsIHJsLT5ybF92bGNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIFRFWF9WTENfQklUUywgMiwgMCk7CisKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAxMjcpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgIT0gMCkgeworICAgICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgICAgIGNoZWNrX3NjYW50YWJsZV9pbmRleChzLCBpKTsKKyAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOworICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiA0OworICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIF4gU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKTsKKyAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZXNjYXBlICovCisgICAgICAgICAgICAgICAgcnVuID0gU0hPV19VQklUUyhyZSwgJnMtPmdiLCA2KSArIDE7CisgICAgICAgICAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsICZzLT5nYiwgNik7CisgICAgICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOworICAgICAgICAgICAgICAgIGxldmVsID0gU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxMik7CisgICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEyKTsKKyAgICAgICAgICAgICAgICBpICs9IHJ1bjsKKyAgICAgICAgICAgICAgICBjaGVja19zY2FudGFibGVfaW5kZXgocywgaSk7CisgICAgICAgICAgICAgICAgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKC1sZXZlbCAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgKiBxc2NhbGUgKiBxdWFudF9tYXRyaXhbal0pID4+IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtaXNtYXRjaCBePSBsZXZlbDsKKyAgICAgICAgICAgIGJsb2NrW2pdICA9IGxldmVsOworICAgICAgICB9CisgICAgICAgIENMT1NFX1JFQURFUihyZSwgJnMtPmdiKTsKKyAgICB9CisgICAgYmxvY2tbNjNdIF49IG1pc21hdGNoICYgMTsKKworICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gPSBpOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gY2FuIHJlYWQgb3V0IG9mIHJhbmdlIGFuZCBjcmFzaCBmb3IgY29ycnVwdCBzdHJlYW1zLgorICogQ2hhbmdpbmcgdGhpcyB3b3VsZCBlYXQgdXAgYW55IHNwZWVkIGJlbmVmaXRzIGl0IGhhcy4KKyAqIERvIG5vdCB1c2UgImZhc3QiIGZsYWcgaWYgeW91IG5lZWQgdGhlIGNvZGUgdG8gYmUgcm9idXN0LgorICovCitzdGF0aWMgaW5saW5lIGludCBtcGVnMl9mYXN0X2RlY29kZV9ibG9ja19pbnRyYShNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgbikKK3sKKyAgICBpbnQgbGV2ZWwsIGRjLCBkaWZmLCBpLCBqLCBydW47CisgICAgaW50IGNvbXBvbmVudDsKKyAgICBSTFRhYmxlICpybDsKKyAgICB1aW50OF90ICpjb25zdCBzY2FudGFibGUgPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZDsKKyAgICBjb25zdCB1aW50MTZfdCAqcXVhbnRfbWF0cml4OworICAgIGNvbnN0IGludCBxc2NhbGUgPSBzLT5xc2NhbGU7CisKKyAgICAvKiBEQyBjb2VmZmljaWVudCAqLworICAgIGlmIChuIDwgNCkgeworICAgICAgICBxdWFudF9tYXRyaXggPSBzLT5pbnRyYV9tYXRyaXg7CisgICAgICAgIGNvbXBvbmVudCAgICA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcXVhbnRfbWF0cml4ID0gcy0+Y2hyb21hX2ludHJhX21hdHJpeDsKKyAgICAgICAgY29tcG9uZW50ICAgID0gKG4gJiAxKSArIDE7CisgICAgfQorICAgIGRpZmYgPSBkZWNvZGVfZGMoJnMtPmdiLCBjb21wb25lbnQpOworICAgIGlmIChkaWZmID49IDB4ZmZmZikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGRjID0gcy0+bGFzdF9kY1tjb21wb25lbnRdOworICAgIGRjICs9IGRpZmY7CisgICAgcy0+bGFzdF9kY1tjb21wb25lbnRdID0gZGM7CisgICAgYmxvY2tbMF0gPSBkYyA8PCAoMyAtIHMtPmludHJhX2RjX3ByZWNpc2lvbik7CisgICAgaSA9IDA7CisgICAgaWYgKHMtPmludHJhX3ZsY19mb3JtYXQpCisgICAgICAgIHJsID0gJmZmX3JsX21wZWcyOworICAgIGVsc2UKKyAgICAgICAgcmwgPSAmZmZfcmxfbXBlZzE7CisKKyAgICB7CisgICAgICAgIE9QRU5fUkVBREVSKHJlLCAmcy0+Z2IpOworICAgICAgICAvKiBub3cgcXVhbnRpZnkgJiBlbmNvZGUgQUMgY29lZmZpY2llbnRzICovCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgIEdFVF9STF9WTEMobGV2ZWwsIHJ1biwgcmUsICZzLT5nYiwgcmwtPnJsX3ZsY1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgVEVYX1ZMQ19CSVRTLCAyLCAwKTsKKworICAgICAgICAgICAgaWYgKGxldmVsID49IDY0IHx8IGkgPiA2MykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChsZXZlbCAhPSAwKSB7CisgICAgICAgICAgICAgICAgaSArPSBydW47CisgICAgICAgICAgICAgICAgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gNDsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCBeIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGVzY2FwZSAqLworICAgICAgICAgICAgICAgIHJ1biA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgNikgKyAxOworICAgICAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDYpOworICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMTIpOworICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCAxMik7CisgICAgICAgICAgICAgICAgaSArPSBydW47CisgICAgICAgICAgICAgICAgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKC1sZXZlbCAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgKiBxc2NhbGUgKiBxdWFudF9tYXRyaXhbal0pID4+IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsOworICAgICAgICB9CisgICAgICAgIENMT1NFX1JFQURFUihyZSwgJnMtPmdiKTsKKyAgICB9CisKKyAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGRlY29kaW5nICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9kbXYoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICByZXR1cm4gMSAtIChnZXRfYml0czEoJnMtPmdiKSA8PCAxKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfcXNjYWxlKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludCBxc2NhbGUgPSBnZXRfYml0cygmcy0+Z2IsIDUpOworICAgIGlmIChzLT5xX3NjYWxlX3R5cGUpCisgICAgICAgIHJldHVybiBub25fbGluZWFyX3FzY2FsZVtxc2NhbGVdOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHFzY2FsZSA8PCAxOworfQorCisKKy8qIG1vdGlvbiB0eXBlIChmb3IgTVBFRy0yKSAqLworI2RlZmluZSBNVF9GSUVMRCAxCisjZGVmaW5lIE1UX0ZSQU1FIDIKKyNkZWZpbmUgTVRfMTZYOCAgMgorI2RlZmluZSBNVF9ETVYgICAzCisKK3N0YXRpYyBpbnQgbXBlZ19kZWNvZGVfbWIoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgYmxvY2tbMTJdWzY0XSkKK3sKKyAgICBpbnQgaSwgaiwgaywgY2JwLCB2YWwsIG1iX3R5cGUsIG1vdGlvbl90eXBlOworICAgIGNvbnN0IGludCBtYl9ibG9ja19jb3VudCA9IDQgKyAoMSA8PCBzLT5jaHJvbWFfZm9ybWF0KTsKKyAgICBpbnQgcmV0OworCisgICAgYXZfZGxvZyhzLT5hdmN0eCwgImRlY29kZV9tYjogeD0lZCB5PSVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKworICAgIGF2X2Fzc2VydDIocy0+bWJfc2tpcHBlZCA9PSAwKTsKKworICAgIGlmIChzLT5tYl9za2lwX3J1bi0tICE9IDApIHsKKyAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkgeworICAgICAgICAgICAgcy0+bWJfc2tpcHBlZCA9IDE7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVtzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZV0gPQorICAgICAgICAgICAgICAgIE1CX1RZUEVfU0tJUCB8IE1CX1RZUEVfTDAgfCBNQl9UWVBFXzE2eDE2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IG1iX3R5cGU7CisKKyAgICAgICAgICAgIGlmIChzLT5tYl94KQorICAgICAgICAgICAgICAgIG1iX3R5cGUgPSBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVtzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZSAtIDFdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBzdXJlIGlmIHRoaXMgaXMgYWxsb3dlZCBpbiBNUEVHIGF0IGFsbAorICAgICAgICAgICAgICAgIG1iX3R5cGUgPSBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVtzLT5tYl93aWR0aCArIChzLT5tYl95IC0gMSkgKiBzLT5tYl9zdHJpZGUgLSAxXTsKKyAgICAgICAgICAgIGlmIChJU19JTlRSQShtYl90eXBlKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic2tpcCB3aXRoIHByZXZpbnRyYVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVtzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZV0gPQorICAgICAgICAgICAgICAgIG1iX3R5cGUgfCBNQl9UWVBFX1NLSVA7CisKKyAgICAgICAgICAgIGlmICgocy0+bXZbMF1bMF1bMF0gfCBzLT5tdlswXVswXVsxXSB8IHMtPm12WzFdWzBdWzBdIHwgcy0+bXZbMV1bMF1bMV0pID09IDApCisgICAgICAgICAgICAgICAgcy0+bWJfc2tpcHBlZCA9IDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHMtPnBpY3RfdHlwZSkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfSToKKyAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpID09IDApIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG1iIHR5cGUgaW4gSSBGcmFtZSBhdCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYl90eXBlID0gTUJfVFlQRV9RVUFOVCB8IE1CX1RZUEVfSU5UUkE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYl90eXBlID0gTUJfVFlQRV9JTlRSQTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9QOgorICAgICAgICBtYl90eXBlID0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9tYl9wdHlwZV92bGMudGFibGUsIE1CX1BUWVBFX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgaWYgKG1iX3R5cGUgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBtYiB0eXBlIGluIFAgRnJhbWUgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgbWJfdHlwZSA9IHB0eXBlMm1iX3R5cGVbbWJfdHlwZV07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX0I6CisgICAgICAgIG1iX3R5cGUgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX21iX2J0eXBlX3ZsYy50YWJsZSwgTUJfQlRZUEVfVkxDX0JJVFMsIDEpOworICAgICAgICBpZiAobWJfdHlwZSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG1iIHR5cGUgaW4gQiBGcmFtZSBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBtYl90eXBlID0gYnR5cGUybWJfdHlwZVttYl90eXBlXTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGF2X2Rsb2cocy0+YXZjdHgsICJtYl90eXBlPSV4XG4iLCBtYl90eXBlKTsKKy8vICAgIG1vdGlvbl90eXBlID0gMDsgLyogYXZvaWQgd2FybmluZyAqLworICAgIGlmIChJU19JTlRSQShtYl90eXBlKSkgeworICAgICAgICBzLT5iZHNwLmNsZWFyX2Jsb2NrcyhzLT5ibG9ja1swXSk7CisKKyAgICAgICAgaWYgKCFzLT5jaHJvbWFfeV9zaGlmdCkKKyAgICAgICAgICAgIHMtPmJkc3AuY2xlYXJfYmxvY2tzKHMtPmJsb2NrWzZdKTsKKworICAgICAgICAvKiBjb21wdXRlIERDVCB0eXBlICovCisgICAgICAgIC8vIEZJWE1FOiBhZGQgYW4gaW50ZXJsYWNlZF9kY3QgY29kZWQgdmFyPworICAgICAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSAmJgorICAgICAgICAgICAgIXMtPmZyYW1lX3ByZWRfZnJhbWVfZGN0KQorICAgICAgICAgICAgcy0+aW50ZXJsYWNlZF9kY3QgPSBnZXRfYml0czEoJnMtPmdiKTsKKworICAgICAgICBpZiAoSVNfUVVBTlQobWJfdHlwZSkpCisgICAgICAgICAgICBzLT5xc2NhbGUgPSBnZXRfcXNjYWxlKHMpOworCisgICAgICAgIGlmIChzLT5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycykgeworICAgICAgICAgICAgLyoganVzdCBwYXJzZSB0aGVtICovCisgICAgICAgICAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRSkKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMxKCZzLT5nYik7ICAvKiBmaWVsZCBzZWxlY3QgKi8KKworICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gICAgICA9CisgICAgICAgICAgICBzLT5sYXN0X212WzBdWzBdWzBdID0KKyAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMV1bMF0gPSBtcGVnX2RlY29kZV9tb3Rpb24ocywgcy0+bXBlZ19mX2NvZGVbMF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMF1bMF0pOworICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gICAgICA9CisgICAgICAgICAgICBzLT5sYXN0X212WzBdWzBdWzFdID0KKyAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMV1bMV0gPSBtcGVnX2RlY29kZV9tb3Rpb24ocywgcy0+bXBlZ19mX2NvZGVbMF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMF1bMV0pOworCisgICAgICAgICAgICBza2lwX2JpdHMxKCZzLT5nYik7IC8qIG1hcmtlciAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogcmVzZXQgbXYgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgbWVtc2V0KHMtPmxhc3RfbXYsIDAsIHNpemVvZihzLT5sYXN0X212KSk7CisgICAgICAgIH0KKyAgICAgICAgcy0+bWJfaW50cmEgPSAxOworICAgICAgICAvLyBpZiAxLCB3ZSBtZW1jcHkgYmxvY2tzIGluIHh2bWN2aWRlbworICAgICAgICBpZiAoKENPTkZJR19NUEVHMV9YVk1DX0hXQUNDRUwgfHwgQ09ORklHX01QRUcyX1hWTUNfSFdBQ0NFTCkgJiYgcy0+cGFja19wYmxvY2tzKQorICAgICAgICAgICAgZmZfeHZtY19wYWNrX3BibG9ja3MocywgLTEpOyAvLyBpbnRlciBhcmUgYWx3YXlzIGZ1bGwgYmxvY2tzCisKKyAgICAgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8pIHsKKyAgICAgICAgICAgIGlmIChzLT5mbGFnczIgJiBDT0RFQ19GTEFHMl9GQVNUKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgbXBlZzJfZmFzdF9kZWNvZGVfYmxvY2tfaW50cmEocywgKnMtPnBibG9ja3NbaV0sIGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWJfYmxvY2tfY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBtcGVnMl9kZWNvZGVfYmxvY2tfaW50cmEocywgKnMtPnBibG9ja3NbaV0sIGkpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IG1wZWcxX2RlY29kZV9ibG9ja19pbnRyYShzLCAqcy0+cGJsb2Nrc1tpXSwgaSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtYl90eXBlICYgTUJfVFlQRV9aRVJPX01WKSB7CisgICAgICAgICAgICBhdl9hc3NlcnQyKG1iX3R5cGUgJiBNQl9UWVBFX0NCUCk7CisKKyAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICAgICAgaWYgKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRQorICAgICAgICAgICAgICAgICAgICAmJiAhcy0+ZnJhbWVfcHJlZF9mcmFtZV9kY3QpCisgICAgICAgICAgICAgICAgICAgIHMtPmludGVybGFjZWRfZGN0ID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICAgICAgcy0+bXZfdHlwZSA9IE1WX1RZUEVfMTZYMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgICAgICAgICAgICA9IE1WX1RZUEVfRklFTEQ7CisgICAgICAgICAgICAgICAgbWJfdHlwZSAgICAgICAgICAgICAgfD0gTUJfVFlQRV9JTlRFUkxBQ0VEOworICAgICAgICAgICAgICAgIHMtPmZpZWxkX3NlbGVjdFswXVswXSA9IHMtPnBpY3R1cmVfc3RydWN0dXJlIC0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKElTX1FVQU5UKG1iX3R5cGUpKQorICAgICAgICAgICAgICAgIHMtPnFzY2FsZSA9IGdldF9xc2NhbGUocyk7CisKKyAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMF1bMF0gPSAwOworICAgICAgICAgICAgcy0+bGFzdF9tdlswXVswXVsxXSA9IDA7CisgICAgICAgICAgICBzLT5sYXN0X212WzBdWzFdWzBdID0gMDsKKyAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMV1bMV0gPSAwOworICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gICAgICA9IDA7CisgICAgICAgICAgICBzLT5tdlswXVswXVsxXSAgICAgID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2Fzc2VydDIobWJfdHlwZSAmIE1CX1RZUEVfTDBMMSk7CisgICAgICAgICAgICAvLyBGSVhNRSBkZWNpZGUgaWYgTUJzIGluIGZpZWxkIHBpY3R1cmVzIGFyZSBNQl9UWVBFX0lOVEVSTEFDRUQKKyAgICAgICAgICAgIC8qIGdldCBhZGRpdGlvbmFsIG1vdGlvbiB2ZWN0b3IgdHlwZSAqLworICAgICAgICAgICAgaWYgKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUgJiYgcy0+ZnJhbWVfcHJlZF9mcmFtZV9kY3QpIHsKKyAgICAgICAgICAgICAgICBtb3Rpb25fdHlwZSA9IE1UX0ZSQU1FOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtb3Rpb25fdHlwZSA9IGdldF9iaXRzKCZzLT5nYiwgMik7CisgICAgICAgICAgICAgICAgaWYgKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUgJiYgSEFTX0NCUChtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgcy0+aW50ZXJsYWNlZF9kY3QgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKElTX1FVQU5UKG1iX3R5cGUpKQorICAgICAgICAgICAgICAgIHMtPnFzY2FsZSA9IGdldF9xc2NhbGUocyk7CisKKyAgICAgICAgICAgIC8qIG1vdGlvbiB2ZWN0b3JzICovCisgICAgICAgICAgICBzLT5tdl9kaXIgPSAobWJfdHlwZSA+PiAxMykgJiAzOworICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgIm1vdGlvbl90eXBlPSVkXG4iLCBtb3Rpb25fdHlwZSk7CisgICAgICAgICAgICBzd2l0Y2ggKG1vdGlvbl90eXBlKSB7CisgICAgICAgICAgICBjYXNlIE1UX0ZSQU1FOiAvKiBvciBNVF8xNlg4ICovCisgICAgICAgICAgICAgICAgaWYgKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWJfdHlwZSAgIHw9IE1CX1RZUEVfMTZ4MTY7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVVNFU19MSVNUKG1iX3R5cGUsIGkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTVRfRlJBTUUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltpXVswXVswXSAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212W2ldWzBdWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212W2ldWzFdWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZ19kZWNvZGVfbW90aW9uKHMsIHMtPm1wZWdfZl9jb2RlW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdltpXVswXVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbaV1bMF1bMV0gICAgICA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdltpXVswXVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdltpXVsxXVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWdfZGVjb2RlX21vdGlvbihzLCBzLT5tcGVnX2ZfY29kZVtpXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bMF1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGxfcGVsOiBvbmx5IGZvciBNUEVHLTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+ZnVsbF9wZWxbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbaV1bMF1bMF0gPDw9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2ldWzBdWzFdIDw8PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1iX3R5cGUgICB8PSBNQl9UWVBFXzE2eDggfCBNQl9UWVBFX0lOVEVSTEFDRUQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDg7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChVU0VTX0xJU1QobWJfdHlwZSwgaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNVF8xNlg4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9zZWxlY3RbaV1bal0gPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gbXBlZ19kZWNvZGVfbW90aW9uKHMsIHMtPm1wZWdfZl9jb2RlW2ldW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bal1ba10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdltpXVtqXVtrXSA9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2ldW2pdW2tdICAgICAgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UX0ZJRUxEOgorICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFX0ZJRUxEOworICAgICAgICAgICAgICAgIGlmIChzLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgICAgIG1iX3R5cGUgfD0gTUJfVFlQRV8xNng4IHwgTUJfVFlQRV9JTlRFUkxBQ0VEOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVVNFU19MSVNUKG1iX3R5cGUsIGkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9zZWxlY3RbaV1bal0gPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gbXBlZ19kZWNvZGVfbW90aW9uKHMsIHMtPm1wZWdfZl9jb2RlW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdltpXVtqXVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bal1bMF0gPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2ldW2pdWzBdICAgICAgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICJmbXg9JWRcbiIsIHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IG1wZWdfZGVjb2RlX21vdGlvbihzLCBzLT5tcGVnX2ZfY29kZVtpXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bal1bMV0gPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bal1bMV0gPSB2YWwgPDwgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbaV1bal1bMV0gICAgICA9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgImZteT0lZFxuIiwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKCFzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIG1iX3R5cGUgfD0gTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfSU5URVJMQUNFRDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVTRVNfTElTVChtYl90eXBlLCBpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX3NlbGVjdFtpXVswXSA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAyOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gbXBlZ19kZWNvZGVfbW90aW9uKHMsIHMtPm1wZWdfZl9jb2RlW2ldW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdltpXVswXVtrXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bMF1ba10gPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bMV1ba10gPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2ldWzBdW2tdICAgICAgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVF9ETVY6CisgICAgICAgICAgICAgICAgaWYgKHMtPnByb2dyZXNzaXZlX3NlcXVlbmNlKXsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJNVF9ETVYgaW4gcHJvZ3Jlc3NpdmVfc2VxdWVuY2VcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+bXZfdHlwZSA9IE1WX1RZUEVfRE1WOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFVTRVNfTElTVChtYl90eXBlLCBpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRteCwgZG15LCBteCwgbXksIG07CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbXlfc2hpZnQgPSBzLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FOworCisgICAgICAgICAgICAgICAgICAgICAgICBteCA9IG1wZWdfZGVjb2RlX21vdGlvbihzLCBzLT5tcGVnX2ZfY29kZVtpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bMF1bMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdltpXVswXVswXSA9IG14OworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdltpXVsxXVswXSA9IG14OworICAgICAgICAgICAgICAgICAgICAgICAgZG14ID0gZ2V0X2RtdihzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICA9IG1wZWdfZGVjb2RlX21vdGlvbihzLCBzLT5tcGVnX2ZfY29kZVtpXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212W2ldWzBdWzFdID4+IG15X3NoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRteSA9IGdldF9kbXYocyk7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdltpXVswXVsxXSA9IG15IDw8IG15X3NoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdltpXVsxXVsxXSA9IG15IDw8IG15X3NoaWZ0OworCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltpXVswXVswXSA9IG14OworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbaV1bMF1bMV0gPSBteTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2ldWzFdWzBdID0gbXg7IC8vIG5vdCB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltpXVsxXVsxXSA9IG15OyAvLyBub3QgdXNlZAorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3R5cGUgfD0gTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfSU5URVJMQUNFRDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG0gPSAxICsgMiAqIHMtPnRvcF9maWVsZF9maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gcy0+dG9wX2ZpZWxkX2ZpcnN0ID8gMSA6IDM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0b3AgLT4gdG9wIHByZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltpXVsyXVswXSA9ICgobXggKiBtICsgKG14ID4gMCkpID4+IDEpICsgZG14OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2ldWzJdWzFdID0gKChteSAqIG0gKyAobXkgPiAwKSkgPj4gMSkgKyBkbXkgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSA0IC0gbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltpXVszXVswXSA9ICgobXggKiBtICsgKG14ID4gMCkpID4+IDEpICsgZG14OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2ldWzNdWzFdID0gKChteSAqIG0gKyAobXkgPiAwKSkgPj4gMSkgKyBkbXkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl90eXBlIHw9IE1CX1RZUEVfMTZ4MTY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltpXVsyXVswXSA9ICgobXggKyAobXggPiAwKSkgPj4gMSkgKyBkbXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbaV1bMl1bMV0gPSAoKG15ICsgKG15ID4gMCkpID4+IDEpICsgZG15OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX1RPUF9GSUVMRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbaV1bMl1bMV0tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2ldWzJdWzFdKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiMDAgbW90aW9uX3R5cGUgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcy0+bWJfaW50cmEgPSAwOworICAgICAgICBpZiAoSEFTX0NCUChtYl90eXBlKSkgeworICAgICAgICAgICAgcy0+YmRzcC5jbGVhcl9ibG9ja3Mocy0+YmxvY2tbMF0pOworCisgICAgICAgICAgICBjYnAgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX21iX3BhdF92bGMudGFibGUsIE1CX1BBVF9WTENfQklUUywgMSk7CisgICAgICAgICAgICBpZiAobWJfYmxvY2tfY291bnQgPiA2KSB7CisgICAgICAgICAgICAgICAgY2JwIDw8PSBtYl9ibG9ja19jb3VudCAtIDY7CisgICAgICAgICAgICAgICAgY2JwICB8PSBnZXRfYml0cygmcy0+Z2IsIG1iX2Jsb2NrX2NvdW50IC0gNik7CisgICAgICAgICAgICAgICAgcy0+YmRzcC5jbGVhcl9ibG9ja3Mocy0+YmxvY2tbNl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNicCA8PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGNicCAlZCBhdCAlZCAlZFxuIiwgY2JwLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgMSwgd2UgbWVtY3B5IGJsb2NrcyBpbiB4dm1jdmlkZW8KKyAgICAgICAgICAgIGlmICgoQ09ORklHX01QRUcxX1hWTUNfSFdBQ0NFTCB8fCBDT05GSUdfTVBFRzJfWFZNQ19IV0FDQ0VMKSAmJiBzLT5wYWNrX3BibG9ja3MpCisgICAgICAgICAgICAgICAgZmZfeHZtY19wYWNrX3BibG9ja3MocywgY2JwKTsKKworICAgICAgICAgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8pIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfRkFTVCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2JwICYgMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzJfZmFzdF9kZWNvZGVfYmxvY2tfbm9uX2ludHJhKHMsICpzLT5wYmxvY2tzW2ldLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4W2ldID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBjYnAgKz0gY2JwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2JwIDw8PSAxMiAtIG1iX2Jsb2NrX2NvdW50OworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYl9ibG9ja19jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2JwICYgKDEgPDwgMTEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBtcGVnMl9kZWNvZGVfYmxvY2tfbm9uX2ludHJhKHMsICpzLT5wYmxvY2tzW2ldLCBpKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4W2ldID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYnAgKz0gY2JwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfRkFTVCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2JwICYgMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzFfZmFzdF9kZWNvZGVfYmxvY2tfaW50ZXIocywgKnMtPnBibG9ja3NbaV0sIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNicCArPSBjYnA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2JwICYgMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IG1wZWcxX2RlY29kZV9ibG9ja19pbnRlcihzLCAqcy0+cGJsb2Nrc1tpXSwgaSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2JwICs9IGNicDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQorICAgICAgICAgICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3MtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlXSA9IG1iX3R5cGU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG1wZWdfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1wZWcxQ29udGV4dCAqcyAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMyID0gJnMtPm1wZWdfZW5jX2N0eDsKKworICAgIGZmX21wdl9kZWNvZGVfZGVmYXVsdHMoczIpOworCisgICAgaWYgKCAgIGF2Y3R4LT5jb2RlY190YWcgIT0gQVZfUkwzMigiVkNSMiIpCisgICAgICAgICYmIGF2Y3R4LT5jb2RlY190YWcgIT0gQVZfUkwzMigiQlcxMCIpKQorICAgICAgICBhdmN0eC0+Y29kZWRfd2lkdGggPSBhdmN0eC0+Y29kZWRfaGVpZ2h0ID0gMDsgLy8gZG8gbm90IHRydXN0IGRpbWVuc2lvbnMgZnJvbSBpbnB1dAorICAgIGZmX21wdl9kZWNvZGVfaW5pdChzMiwgYXZjdHgpOworCisgICAgcy0+bXBlZ19lbmNfY3R4LmF2Y3R4ICA9IGF2Y3R4OworCisgICAgLyogd2UgbmVlZCBzb21lIHBlcm11dGF0aW9uIHRvIHN0b3JlIG1hdHJpY2VzLAorICAgICAqIHVudGlsIHRoZSBkZWNvZGVyIHNldHMgdGhlIHJlYWwgcGVybXV0YXRpb24uICovCisgICAgZmZfbXB2X2lkY3RfaW5pdChzMik7CisgICAgZmZfbXBlZzEyX2NvbW1vbl9pbml0KCZzLT5tcGVnX2VuY19jdHgpOworICAgIGZmX21wZWcxMl9pbml0X3ZsY3MoKTsKKworICAgIHMtPm1wZWdfZW5jX2N0eF9hbGxvY2F0ZWQgICAgICA9IDA7CisgICAgcy0+bXBlZ19lbmNfY3R4LnBpY3R1cmVfbnVtYmVyID0gMDsKKyAgICBzLT5yZXBlYXRfZmllbGQgICAgICAgICAgICAgICAgPSAwOworICAgIHMtPm1wZWdfZW5jX2N0eC5jb2RlY19pZCAgICAgICA9IGF2Y3R4LT5jb2RlYy0+aWQ7CisgICAgYXZjdHgtPmNvbG9yX3JhbmdlICAgICAgICAgICAgID0gQVZDT0xfUkFOR0VfTVBFRzsKKyAgICBpZiAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPKQorICAgICAgICBhdmN0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbiA9IEFWQ0hST01BX0xPQ19DRU5URVI7CisgICAgZWxzZQorICAgICAgICBhdmN0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbiA9IEFWQ0hST01BX0xPQ19MRUZUOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wZWdfZGVjb2RlX3VwZGF0ZV90aHJlYWRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkNvZGVjQ29udGV4dCAqYXZjdHhfZnJvbSkKK3sKKyAgICBNcGVnMUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGEsICpjdHhfZnJvbSA9IGF2Y3R4X2Zyb20tPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZjdHgtPm1wZWdfZW5jX2N0eCwgKnMxID0gJmN0eF9mcm9tLT5tcGVnX2VuY19jdHg7CisgICAgaW50IGVycjsKKworICAgIGlmIChhdmN0eCA9PSBhdmN0eF9mcm9tICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIWN0eF9mcm9tLT5tcGVnX2VuY19jdHhfYWxsb2NhdGVkIHx8CisgICAgICAgICFzMS0+Y29udGV4dF9pbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlcnIgPSBmZl9tcGVnX3VwZGF0ZV90aHJlYWRfY29udGV4dChhdmN0eCwgYXZjdHhfZnJvbSk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGlmICghY3R4LT5tcGVnX2VuY19jdHhfYWxsb2NhdGVkKQorICAgICAgICBtZW1jcHkocyArIDEsIHMxICsgMSwgc2l6ZW9mKE1wZWcxQ29udGV4dCkgLSBzaXplb2YoTXBlZ0VuY0NvbnRleHQpKTsKKworICAgIGlmICghKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiB8fCBzLT5sb3dfZGVsYXkpKQorICAgICAgICBzLT5waWN0dXJlX251bWJlcisrOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHF1YW50X21hdHJpeF9yZWJ1aWxkKHVpbnQxNl90ICptYXRyaXgsIGNvbnN0IHVpbnQ4X3QgKm9sZF9wZXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbmV3X3Blcm0pCit7CisgICAgdWludDE2X3QgdGVtcF9tYXRyaXhbNjRdOworICAgIGludCBpOworCisgICAgbWVtY3B5KHRlbXBfbWF0cml4LCBtYXRyaXgsIDY0ICogc2l6ZW9mKHVpbnQxNl90KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgbWF0cml4W25ld19wZXJtW2ldXSA9IHRlbXBfbWF0cml4W29sZF9wZXJtW2ldXTsKK30KKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBtcGVnMV9od2FjY2VsX3BpeGZtdF9saXN0XzQyMFtdID0geworI2lmIENPTkZJR19NUEVHMV9YVk1DX0hXQUNDRUwKKyAgICBBVl9QSVhfRk1UX1hWTUMsCisjZW5kaWYKKyNpZiBDT05GSUdfTVBFRzFfVkRQQVVfSFdBQ0NFTAorICAgIEFWX1BJWF9GTVRfVkRQQVVfTVBFRzEsCisgICAgQVZfUElYX0ZNVF9WRFBBVSwKKyNlbmRpZgorICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbXBlZzJfaHdhY2NlbF9waXhmbXRfbGlzdF80MjBbXSA9IHsKKyNpZiBDT05GSUdfTVBFRzJfWFZNQ19IV0FDQ0VMCisgICAgQVZfUElYX0ZNVF9YVk1DLAorI2VuZGlmCisjaWYgQ09ORklHX01QRUcyX1ZEUEFVX0hXQUNDRUwKKyAgICBBVl9QSVhfRk1UX1ZEUEFVX01QRUcyLAorICAgIEFWX1BJWF9GTVRfVkRQQVUsCisjZW5kaWYKKyNpZiBDT05GSUdfTVBFRzJfRFhWQTJfSFdBQ0NFTAorICAgIEFWX1BJWF9GTVRfRFhWQTJfVkxELAorI2VuZGlmCisjaWYgQ09ORklHX01QRUcyX1ZBQVBJX0hXQUNDRUwKKyAgICBBVl9QSVhfRk1UX1ZBQVBJX1ZMRCwKKyNlbmRpZgorICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbXBlZzEyX3BpeGZtdF9saXN0XzQyMltdID0geworICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbXBlZzEyX3BpeGZtdF9saXN0XzQ0NFtdID0geworICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHVzZXNfdmRwYXUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KSB7CisgICAgcmV0dXJuIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfVkRQQVVfTVBFRzEgfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9WRFBBVV9NUEVHMjsKK30KKworc3RhdGljIGVudW0gQVZQaXhlbEZvcm1hdCBtcGVnX2dldF9waXhlbGZvcm1hdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTXBlZzFDb250ZXh0ICpzMSAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnMxLT5tcGVnX2VuY19jdHg7CisgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpwaXhfZm10czsKKworICAgIGlmIChzLT5jaHJvbWFfZm9ybWF0IDwgMikKKyAgICAgICAgcGl4X2ZtdHMgPSBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzFWSURFTyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWcxX2h3YWNjZWxfcGl4Zm10X2xpc3RfNDIwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzJfaHdhY2NlbF9waXhmbXRfbGlzdF80MjA7CisgICAgZWxzZSBpZiAocy0+Y2hyb21hX2Zvcm1hdCA9PSAyKQorICAgICAgICBwaXhfZm10cyA9IG1wZWcxMl9waXhmbXRfbGlzdF80MjI7CisgICAgZWxzZQorICAgICAgICBwaXhfZm10cyA9IG1wZWcxMl9waXhmbXRfbGlzdF80NDQ7CisKKyAgICByZXR1cm4gZmZfdGhyZWFkX2dldF9mb3JtYXQoYXZjdHgsIHBpeF9mbXRzKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfaHdhY2NlbF9mb3JfcGl4Zm10KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICAvLyB1bnRpbCB0aGVuIHBpeF9mbXQgbWF5IGJlIGNoYW5nZWQgcmlnaHQgYWZ0ZXIgY29kZWMgaW5pdAorICAgIGlmIChhdmN0eC0+aHdhY2NlbCB8fCB1c2VzX3ZkcGF1KGF2Y3R4KSkKKyAgICAgICAgaWYgKGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9BVVRPKQorICAgICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9IEZGX0lEQ1RfU0lNUExFOworCisgICAgaWYgKGF2Y3R4LT5od2FjY2VsICYmIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWFZNQykgeworICAgICAgICBNcGVnMUNvbnRleHQgKnMxID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICAgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmczEtPm1wZWdfZW5jX2N0eDsKKworICAgICAgICBzLT5wYWNrX3BibG9ja3MgPSAxOworI2lmIEZGX0FQSV9YVk1DCisgICAgICAgIGF2Y3R4LT54dm1jX2FjY2VsZXJhdGlvbiA9IDI7CisjZW5kaWYgLyogRkZfQVBJX1hWTUMgKi8KKyAgICB9Cit9CisKKy8qIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHdlIGtub3cgYWxsIHBhcmFtZXRlcnMuCisgKiBJdCBtYXkgYmUgY2FsbGVkIGluIGRpZmZlcmVudCBwbGFjZXMgZm9yIE1QRUctMSBhbmQgTVBFRy0yLiAqLworc3RhdGljIGludCBtcGVnX2RlY29kZV9wb3N0aW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTXBlZzFDb250ZXh0ICpzMSAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnMxLT5tcGVnX2VuY19jdHg7CisgICAgdWludDhfdCBvbGRfcGVybXV0YXRpb25bNjRdOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHMxLT5tcGVnX2VuY19jdHhfYWxsb2NhdGVkID09IDApICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgIGF2Y3R4LT5jb2RlZF93aWR0aCAgICAgICAhPSBzLT53aWR0aCAgICAgICAgICAgICAgICB8fAorICAgICAgICBhdmN0eC0+Y29kZWRfaGVpZ2h0ICAgICAgIT0gcy0+aGVpZ2h0ICAgICAgICAgICAgICAgfHwKKyAgICAgICAgczEtPnNhdmVfd2lkdGggICAgICAgICAgICE9IHMtPndpZHRoICAgICAgICAgICAgICAgIHx8CisgICAgICAgIHMxLT5zYXZlX2hlaWdodCAgICAgICAgICAhPSBzLT5oZWlnaHQgICAgICAgICAgICAgICB8fAorICAgICAgICBzMS0+c2F2ZV9hc3BlY3RfaW5mbyAgICAgIT0gcy0+YXNwZWN0X3JhdGlvX2luZm8gICAgfHwKKyAgICAgICAgKHMxLT5zYXZlX3Byb2dyZXNzaXZlX3NlcSAhPSBzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSAmJiBGRkFMSUdOKHMtPmhlaWdodCwgMTYpICE9IEZGQUxJR04ocy0+aGVpZ2h0LCAzMikpIHx8CisgICAgICAgIDApIHsKKyAgICAgICAgaWYgKHMxLT5tcGVnX2VuY19jdHhfYWxsb2NhdGVkKSB7CisgICAgICAgICAgICBQYXJzZUNvbnRleHQgcGMgPSBzLT5wYXJzZV9jb250ZXh0OworICAgICAgICAgICAgcy0+cGFyc2VfY29udGV4dC5idWZmZXIgPSAwOworICAgICAgICAgICAgZmZfbXB2X2NvbW1vbl9lbmQocyk7CisgICAgICAgICAgICBzLT5wYXJzZV9jb250ZXh0ID0gcGM7CisgICAgICAgICAgICBzMS0+bXBlZ19lbmNfY3R4X2FsbG9jYXRlZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHMtPndpZHRoID09IDApIHx8IChzLT5oZWlnaHQgPT0gMCkpCisgICAgICAgICAgICByZXR1cm4gLTI7CisKKyAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHMtPndpZHRoLCBzLT5oZWlnaHQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICYmIHMtPmJpdF9yYXRlKSB7CisgICAgICAgICAgICBhdmN0eC0+cmNfbWF4X3JhdGUgPSBzLT5iaXRfcmF0ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzFWSURFTyAmJiBzLT5iaXRfcmF0ZSAmJgorICAgICAgICAgICAgICAgICAgIChzLT5iaXRfcmF0ZSAhPSAweDNGRkZGKjQwMCB8fCBzLT52YnZfZGVsYXkgIT0gMHhGRkZGKSkgeworICAgICAgICAgICAgYXZjdHgtPmJpdF9yYXRlID0gcy0+Yml0X3JhdGU7CisgICAgICAgIH0KKyAgICAgICAgczEtPnNhdmVfYXNwZWN0X2luZm8gICAgID0gcy0+YXNwZWN0X3JhdGlvX2luZm87CisgICAgICAgIHMxLT5zYXZlX3dpZHRoICAgICAgICAgICA9IHMtPndpZHRoOworICAgICAgICBzMS0+c2F2ZV9oZWlnaHQgICAgICAgICAgPSBzLT5oZWlnaHQ7CisgICAgICAgIHMxLT5zYXZlX3Byb2dyZXNzaXZlX3NlcSA9IHMtPnByb2dyZXNzaXZlX3NlcXVlbmNlOworCisgICAgICAgIC8qIGxvd19kZWxheSBtYXkgYmUgZm9yY2VkLCBpbiB0aGlzIGNhc2Ugd2Ugd2lsbCBoYXZlIEItZnJhbWVzCisgICAgICAgICAqIHRoYXQgYmVoYXZlIGxpa2UgUC1mcmFtZXMuICovCisgICAgICAgIGF2Y3R4LT5oYXNfYl9mcmFtZXMgPSAhcy0+bG93X2RlbGF5OworCisgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzFWSURFTykgeworICAgICAgICAgICAgLy8gTVBFRy0xIGZwcworICAgICAgICAgICAgYXZjdHgtPmZyYW1lcmF0ZSA9IGZmX21wZWcxMl9mcmFtZV9yYXRlX3RhYltzLT5mcmFtZV9yYXRlX2luZGV4XTsKKyAgICAgICAgICAgIC8vIE1QRUctMSBhc3BlY3QKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfZDJxKDEuMCAvIGZmX21wZWcxX2FzcGVjdFtzLT5hc3BlY3RfcmF0aW9faW5mb10sIDI1NSk7CisgICAgICAgICAgICBhdmN0eC0+dGlja3NfcGVyX2ZyYW1lICAgICA9IDE7CisgICAgICAgIH0gZWxzZSB7IC8vIE1QRUctMgorICAgICAgICAgICAgLy8gTVBFRy0yIGZwcworICAgICAgICAgICAgYXZfcmVkdWNlKCZzLT5hdmN0eC0+ZnJhbWVyYXRlLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAmcy0+YXZjdHgtPmZyYW1lcmF0ZS5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX2ZyYW1lX3JhdGVfdGFiW3MtPmZyYW1lX3JhdGVfaW5kZXhdLm51bSAqIHMxLT5mcmFtZV9yYXRlX2V4dC5udW0sCisgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX2ZyYW1lX3JhdGVfdGFiW3MtPmZyYW1lX3JhdGVfaW5kZXhdLmRlbiAqIHMxLT5mcmFtZV9yYXRlX2V4dC5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgMSA8PCAzMCk7CisgICAgICAgICAgICBhdmN0eC0+dGlja3NfcGVyX2ZyYW1lID0gMjsKKyAgICAgICAgICAgIC8vIE1QRUctMiBhc3BlY3QKKyAgICAgICAgICAgIGlmIChzLT5hc3BlY3RfcmF0aW9faW5mbyA+IDEpIHsKKyAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIGRhciA9CisgICAgICAgICAgICAgICAgICAgIGF2X211bF9xKGF2X2Rpdl9xKGZmX21wZWcyX2FzcGVjdFtzLT5hc3BlY3RfcmF0aW9faW5mb10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKSB7IHMxLT5wYW5fc2Nhbi53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEtPnBhbl9zY2FuLmhlaWdodCB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgcy0+d2lkdGgsIHMtPmhlaWdodCB9KTsKKworICAgICAgICAgICAgICAgIC8qIFdlIGlnbm9yZSB0aGUgc3BlYyBoZXJlIGFuZCBndWVzcyBhIGJpdCBhcyByZWFsaXR5IGRvZXMgbm90CisgICAgICAgICAgICAgICAgICogbWF0Y2ggdGhlIHNwZWMsIHNlZSBmb3IgZXhhbXBsZSByZXNfY2hhbmdlX2ZmbXBlZ19hc3BlY3QudHMKKyAgICAgICAgICAgICAgICAgKiBhbmQgc2VxdWVuY2UtZGlzcGxheS1hc3BlY3QubXBnLgorICAgICAgICAgICAgICAgICAqIGlzc3VlMTYxMywgNjIxLCA1NjIgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHMxLT5wYW5fc2Nhbi53aWR0aCA9PSAwKSB8fCAoczEtPnBhbl9zY2FuLmhlaWdodCA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAoYXZfY21wX3EoZGFyLCAoQVZSYXRpb25hbCkgeyA0LCAzIH0pICYmCisgICAgICAgICAgICAgICAgICAgICBhdl9jbXBfcShkYXIsIChBVlJhdGlvbmFsKSB7IDE2LCA5IH0pKSkgeworICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9kaXZfcShmZl9tcGVnMl9hc3BlY3Rbcy0+YXNwZWN0X3JhdGlvX2luZm9dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgcy0+d2lkdGgsIHMtPmhlaWdodCB9KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9kaXZfcShmZl9tcGVnMl9hc3BlY3Rbcy0+YXNwZWN0X3JhdGlvX2luZm9dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgczEtPnBhbl9zY2FuLndpZHRoLCBzMS0+cGFuX3NjYW4uaGVpZ2h0IH0pOworLy8gaXNzdWUxNjEzIDQvMyAxNi85IC0+IDE2LzkKKy8vIHJlc19jaGFuZ2VfZmZtcGVnX2FzcGVjdC50cyA0LzMgMjI1LzQ0IC0+NC8zCisvLyB3aWRlc2NyZWVuLWlzc3VlNTYyLm1wZyA0LzMgMTYvOSAtPiAxNi85CisvLyAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhdl9tdWxfcShzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbywgKEFWUmF0aW9uYWwpIHtzLT53aWR0aCwgcy0+aGVpZ2h0fSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Rsb2coYXZjdHgsICJBICVkLyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21wZWcyX2FzcGVjdFtzLT5hc3BlY3RfcmF0aW9faW5mb10ubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21wZWcyX2FzcGVjdFtzLT5hc3BlY3RfcmF0aW9faW5mb10uZGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgIkIgJWQvJWRcbiIsIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPQorICAgICAgICAgICAgICAgICAgICBmZl9tcGVnMl9hc3BlY3Rbcy0+YXNwZWN0X3JhdGlvX2luZm9dOworICAgICAgICAgICAgfQorICAgICAgICB9IC8vIE1QRUctMgorCisgICAgICAgIGZmX3NldF9zYXIocy0+YXZjdHgsIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvKTsKKworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IG1wZWdfZ2V0X3BpeGVsZm9ybWF0KGF2Y3R4KTsKKyAgICAgICAgc2V0dXBfaHdhY2NlbF9mb3JfcGl4Zm10KGF2Y3R4KTsKKworICAgICAgICAvKiBRdWFudGl6YXRpb24gbWF0cmljZXMgbWF5IG5lZWQgcmVvcmRlcmluZworICAgICAgICAgKiBpZiBEQ1QgcGVybXV0YXRpb24gaXMgY2hhbmdlZC4gKi8KKyAgICAgICAgbWVtY3B5KG9sZF9wZXJtdXRhdGlvbiwgcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCA2NCAqIHNpemVvZih1aW50OF90KSk7CisKKyAgICAgICAgZmZfbXB2X2lkY3RfaW5pdChzKTsKKyAgICAgICAgaWYgKGZmX21wdl9jb21tb25faW5pdChzKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTI7CisKKyAgICAgICAgcXVhbnRfbWF0cml4X3JlYnVpbGQocy0+aW50cmFfbWF0cml4LCAgICAgICAgb2xkX3Blcm11dGF0aW9uLCBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb24pOworICAgICAgICBxdWFudF9tYXRyaXhfcmVidWlsZChzLT5pbnRlcl9tYXRyaXgsICAgICAgICBvbGRfcGVybXV0YXRpb24sIHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbik7CisgICAgICAgIHF1YW50X21hdHJpeF9yZWJ1aWxkKHMtPmNocm9tYV9pbnRyYV9tYXRyaXgsIG9sZF9wZXJtdXRhdGlvbiwgcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uKTsKKyAgICAgICAgcXVhbnRfbWF0cml4X3JlYnVpbGQocy0+Y2hyb21hX2ludGVyX21hdHJpeCwgb2xkX3Blcm11dGF0aW9uLCBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb24pOworCisgICAgICAgIHMxLT5tcGVnX2VuY19jdHhfYWxsb2NhdGVkID0gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBlZzFfZGVjb2RlX3BpY3R1cmUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSkKK3sKKyAgICBNcGVnMUNvbnRleHQgKnMxICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmczEtPm1wZWdfZW5jX2N0eDsKKyAgICBpbnQgcmVmLCBmX2NvZGUsIHZidl9kZWxheTsKKworICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBidWYsIGJ1Zl9zaXplICogOCk7CisKKyAgICByZWYgPSBnZXRfYml0cygmcy0+Z2IsIDEwKTsgLyogdGVtcG9yYWwgcmVmICovCisgICAgcy0+cGljdF90eXBlID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICBpZiAocy0+cGljdF90eXBlID09IDAgfHwgcy0+cGljdF90eXBlID4gMykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB2YnZfZGVsYXkgPSBnZXRfYml0cygmcy0+Z2IsIDE2KTsKKyAgICBzLT52YnZfZGVsYXkgPSB2YnZfZGVsYXk7CisgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCB8fAorICAgICAgICBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgcy0+ZnVsbF9wZWxbMF0gPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgZl9jb2RlID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICAgICAgaWYgKGZfY29kZSA9PSAwICYmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgKEFWX0VGX0JJVFNUUkVBTXxBVl9FRl9DT01QTElBTlQpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBmX2NvZGUgKz0gIWZfY29kZTsKKyAgICAgICAgcy0+bXBlZ19mX2NvZGVbMF1bMF0gPSBmX2NvZGU7CisgICAgICAgIHMtPm1wZWdfZl9jb2RlWzBdWzFdID0gZl9jb2RlOworICAgIH0KKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIHMtPmZ1bGxfcGVsWzFdID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgIGZfY29kZSA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CisgICAgICAgIGlmIChmX2NvZGUgPT0gMCAmJiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9CSVRTVFJFQU18QVZfRUZfQ09NUExJQU5UKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZl9jb2RlICs9ICFmX2NvZGU7CisgICAgICAgIHMtPm1wZWdfZl9jb2RlWzFdWzBdID0gZl9jb2RlOworICAgICAgICBzLT5tcGVnX2ZfY29kZVsxXVsxXSA9IGZfY29kZTsKKyAgICB9CisgICAgcy0+Y3VycmVudF9waWN0dXJlLmYtPnBpY3RfdHlwZSA9IHMtPnBpY3RfdHlwZTsKKyAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+a2V5X2ZyYW1lID0gcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAidmJ2X2RlbGF5ICVkLCByZWYgJWQgdHlwZTolZFxuIiwgdmJ2X2RlbGF5LCByZWYsIHMtPnBpY3RfdHlwZSk7CisKKyAgICBzLT55X2RjX3NjYWxlID0gODsKKyAgICBzLT5jX2RjX3NjYWxlID0gODsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXBlZ19kZWNvZGVfc2VxdWVuY2VfZXh0ZW5zaW9uKE1wZWcxQ29udGV4dCAqczEpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmczEtPm1wZWdfZW5jX2N0eDsKKyAgICBpbnQgaG9yaXpfc2l6ZV9leHQsIHZlcnRfc2l6ZV9leHQ7CisgICAgaW50IGJpdF9yYXRlX2V4dDsKKworICAgIHNraXBfYml0cygmcy0+Z2IsIDEpOyAvKiBwcm9maWxlIGFuZCBsZXZlbCBlc2MqLworICAgIHMtPmF2Y3R4LT5wcm9maWxlICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICBzLT5hdmN0eC0+bGV2ZWwgICAgICAgICA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisgICAgcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UgPSBnZXRfYml0czEoJnMtPmdiKTsgICAvKiBwcm9ncmVzc2l2ZV9zZXF1ZW5jZSAqLworICAgIHMtPmNocm9tYV9mb3JtYXQgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAyKTsgLyogY2hyb21hX2Zvcm1hdCAxPTQyMCwgMj00MjIsIDM9NDQ0ICovCisgICAgaG9yaXpfc2l6ZV9leHQgICAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgIHZlcnRfc2l6ZV9leHQgICAgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAyKTsKKyAgICBzLT53aWR0aCAgfD0gKGhvcml6X3NpemVfZXh0IDw8IDEyKTsKKyAgICBzLT5oZWlnaHQgfD0gKHZlcnRfc2l6ZV9leHQgIDw8IDEyKTsKKyAgICBiaXRfcmF0ZV9leHQgPSBnZXRfYml0cygmcy0+Z2IsIDEyKTsgIC8qIFhYWDogaGFuZGxlIGl0ICovCisgICAgcy0+Yml0X3JhdGUgKz0gKGJpdF9yYXRlX2V4dCA8PCAxOCkgKiA0MDA7CisgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOyAvKiBtYXJrZXIgKi8KKyAgICBzLT5hdmN0eC0+cmNfYnVmZmVyX3NpemUgKz0gZ2V0X2JpdHMoJnMtPmdiLCA4KSAqIDEwMjQgKiAxNiA8PCAxMDsKKworICAgIHMtPmxvd19kZWxheSA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfTE9XX0RFTEFZKQorICAgICAgICBzLT5sb3dfZGVsYXkgPSAxOworCisgICAgczEtPmZyYW1lX3JhdGVfZXh0Lm51bSA9IGdldF9iaXRzKCZzLT5nYiwgMikgKyAxOworICAgIHMxLT5mcmFtZV9yYXRlX2V4dC5kZW4gPSBnZXRfYml0cygmcy0+Z2IsIDUpICsgMTsKKworICAgIGF2X2Rsb2cocy0+YXZjdHgsICJzZXF1ZW5jZSBleHRlbnNpb25cbiIpOworICAgIHMtPmNvZGVjX2lkID0gcy0+YXZjdHgtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVBFRzJWSURFTzsKKworICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgInByb2ZpbGU6ICVkLCBsZXZlbDogJWQgcHM6ICVkIGNmOiVkIHZidiBidWZmZXI6ICVkLCBiaXRyYXRlOiVkXG4iLAorICAgICAgICAgICAgICAgcy0+YXZjdHgtPnByb2ZpbGUsIHMtPmF2Y3R4LT5sZXZlbCwgcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UsIHMtPmNocm9tYV9mb3JtYXQsCisgICAgICAgICAgICAgICBzLT5hdmN0eC0+cmNfYnVmZmVyX3NpemUsIHMtPmJpdF9yYXRlKTsKK30KKworc3RhdGljIHZvaWQgbXBlZ19kZWNvZGVfc2VxdWVuY2VfZGlzcGxheV9leHRlbnNpb24oTXBlZzFDb250ZXh0ICpzMSkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZzMS0+bXBlZ19lbmNfY3R4OworICAgIGludCBjb2xvcl9kZXNjcmlwdGlvbiwgdywgaDsKKworICAgIHNraXBfYml0cygmcy0+Z2IsIDMpOyAvKiB2aWRlbyBmb3JtYXQgKi8KKyAgICBjb2xvcl9kZXNjcmlwdGlvbiA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgIGlmIChjb2xvcl9kZXNjcmlwdGlvbikgeworICAgICAgICBzLT5hdmN0eC0+Y29sb3JfcHJpbWFyaWVzID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgcy0+YXZjdHgtPmNvbG9yX3RyYyAgICAgICA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgIHMtPmF2Y3R4LT5jb2xvcnNwYWNlICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgIH0KKyAgICB3ID0gZ2V0X2JpdHMoJnMtPmdiLCAxNCk7CisgICAgc2tpcF9iaXRzKCZzLT5nYiwgMSk7IC8vIG1hcmtlcgorICAgIGggPSBnZXRfYml0cygmcy0+Z2IsIDE0KTsKKyAgICAvLyByZW1haW5pbmcgMyBiaXRzIGFyZSB6ZXJvIHBhZGRpbmcKKworICAgIHMxLT5wYW5fc2Nhbi53aWR0aCAgPSAxNiAqIHc7CisgICAgczEtPnBhbl9zY2FuLmhlaWdodCA9IDE2ICogaDsKKworICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAic2RlIHc6JWQsIGg6JWRcbiIsIHcsIGgpOworfQorCitzdGF0aWMgdm9pZCBtcGVnX2RlY29kZV9waWN0dXJlX2Rpc3BsYXlfZXh0ZW5zaW9uKE1wZWcxQ29udGV4dCAqczEpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmczEtPm1wZWdfZW5jX2N0eDsKKyAgICBpbnQgaSwgbm9mY287CisKKyAgICBub2ZjbyA9IDE7CisgICAgaWYgKHMtPnByb2dyZXNzaXZlX3NlcXVlbmNlKSB7CisgICAgICAgIGlmIChzLT5yZXBlYXRfZmlyc3RfZmllbGQpIHsKKyAgICAgICAgICAgIG5vZmNvKys7CisgICAgICAgICAgICBpZiAocy0+dG9wX2ZpZWxkX2ZpcnN0KQorICAgICAgICAgICAgICAgIG5vZmNvKys7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkgeworICAgICAgICAgICAgbm9mY28rKzsKKyAgICAgICAgICAgIGlmIChzLT5yZXBlYXRfZmlyc3RfZmllbGQpCisgICAgICAgICAgICAgICAgbm9mY28rKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbm9mY287IGkrKykgeworICAgICAgICBzMS0+cGFuX3NjYW4ucG9zaXRpb25baV1bMF0gPSBnZXRfc2JpdHMoJnMtPmdiLCAxNik7CisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDEpOyAvLyBtYXJrZXIKKyAgICAgICAgczEtPnBhbl9zY2FuLnBvc2l0aW9uW2ldWzFdID0gZ2V0X3NiaXRzKCZzLT5nYiwgMTYpOworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxKTsgLy8gbWFya2VyCisgICAgfQorCisgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAicGRlICglIlBSSWQxNiIsJSJQUklkMTYiKSAoJSJQUklkMTYiLCUiUFJJZDE2IikgKCUiUFJJZDE2IiwlIlBSSWQxNiIpXG4iLAorICAgICAgICAgICAgICAgczEtPnBhbl9zY2FuLnBvc2l0aW9uWzBdWzBdLCBzMS0+cGFuX3NjYW4ucG9zaXRpb25bMF1bMV0sCisgICAgICAgICAgICAgICBzMS0+cGFuX3NjYW4ucG9zaXRpb25bMV1bMF0sIHMxLT5wYW5fc2Nhbi5wb3NpdGlvblsxXVsxXSwKKyAgICAgICAgICAgICAgIHMxLT5wYW5fc2Nhbi5wb3NpdGlvblsyXVswXSwgczEtPnBhbl9zY2FuLnBvc2l0aW9uWzJdWzFdKTsKK30KKworc3RhdGljIGludCBsb2FkX21hdHJpeChNcGVnRW5jQ29udGV4dCAqcywgdWludDE2X3QgbWF0cml4MFs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1hdHJpeDFbNjRdLCBpbnQgaW50cmEpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBpbnQgaiA9IHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltmZl96aWd6YWdfZGlyZWN0W2ldXTsKKyAgICAgICAgaW50IHYgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICBpZiAodiA9PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1hdHJpeCBkYW1hZ2VkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRyYSAmJiBpID09IDAgJiYgdiAhPSA4KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImludHJhIG1hdHJpeCBzcGVjaWZpZXMgaW52YWxpZCBEQyBxdWFudGl6ZXIgJWQsIGlnbm9yaW5nXG4iLCB2KTsKKyAgICAgICAgICAgIHYgPSA4OyAvLyBuZWVkZWQgYnkgcGluay5tcGcgLyBpc3N1ZTEwNDYKKyAgICAgICAgfQorICAgICAgICBtYXRyaXgwW2pdID0gdjsKKyAgICAgICAgaWYgKG1hdHJpeDEpCisgICAgICAgICAgICBtYXRyaXgxW2pdID0gdjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1wZWdfZGVjb2RlX3F1YW50X21hdHJpeF9leHRlbnNpb24oTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgYXZfZGxvZyhzLT5hdmN0eCwgIm1hdHJpeCBleHRlbnNpb25cbiIpOworCisgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICBsb2FkX21hdHJpeChzLCBzLT5jaHJvbWFfaW50cmFfbWF0cml4LCBzLT5pbnRyYV9tYXRyaXgsIDEpOworICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkKKyAgICAgICAgbG9hZF9tYXRyaXgocywgcy0+Y2hyb21hX2ludGVyX21hdHJpeCwgcy0+aW50ZXJfbWF0cml4LCAwKTsKKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgIGxvYWRfbWF0cml4KHMsIHMtPmNocm9tYV9pbnRyYV9tYXRyaXgsIE5VTEwsIDEpOworICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkKKyAgICAgICAgbG9hZF9tYXRyaXgocywgcy0+Y2hyb21hX2ludGVyX21hdHJpeCwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIG1wZWdfZGVjb2RlX3BpY3R1cmVfY29kaW5nX2V4dGVuc2lvbihNcGVnMUNvbnRleHQgKnMxKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnMxLT5tcGVnX2VuY19jdHg7CisKKyAgICBzLT5mdWxsX3BlbFswXSAgICAgICA9IHMtPmZ1bGxfcGVsWzFdID0gMDsKKyAgICBzLT5tcGVnX2ZfY29kZVswXVswXSA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisgICAgcy0+bXBlZ19mX2NvZGVbMF1bMV0gPSBnZXRfYml0cygmcy0+Z2IsIDQpOworICAgIHMtPm1wZWdfZl9jb2RlWzFdWzBdID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsKKyAgICBzLT5tcGVnX2ZfY29kZVsxXVsxXSA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisgICAgaWYgKCFzLT5waWN0X3R5cGUgJiYgczEtPm1wZWdfZW5jX2N0eF9hbGxvY2F0ZWQpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTWlzc2luZyBwaWN0dXJlIHN0YXJ0IGNvZGUsIGd1ZXNzaW5nIG1pc3NpbmcgdmFsdWVzXG4iKTsKKyAgICAgICAgaWYgKHMtPm1wZWdfZl9jb2RlWzFdWzBdID09IDE1ICYmIHMtPm1wZWdfZl9jb2RlWzFdWzFdID09IDE1KSB7CisgICAgICAgICAgICBpZiAocy0+bXBlZ19mX2NvZGVbMF1bMF0gPT0gMTUgJiYgcy0+bXBlZ19mX2NvZGVbMF1bMV0gPT0gMTUpCisgICAgICAgICAgICAgICAgcy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0I7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5waWN0X3R5cGUgPSBzLT5waWN0X3R5cGU7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5rZXlfZnJhbWUgPSBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgfQorICAgIHMtPm1wZWdfZl9jb2RlWzBdWzBdICs9ICFzLT5tcGVnX2ZfY29kZVswXVswXTsKKyAgICBzLT5tcGVnX2ZfY29kZVswXVsxXSArPSAhcy0+bXBlZ19mX2NvZGVbMF1bMV07CisgICAgcy0+bXBlZ19mX2NvZGVbMV1bMF0gKz0gIXMtPm1wZWdfZl9jb2RlWzFdWzBdOworICAgIHMtPm1wZWdfZl9jb2RlWzFdWzFdICs9ICFzLT5tcGVnX2ZfY29kZVsxXVsxXTsKKworICAgIHMtPmludHJhX2RjX3ByZWNpc2lvbiAgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAyKTsKKyAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSAgICAgICAgICA9IGdldF9iaXRzKCZzLT5nYiwgMik7CisgICAgcy0+dG9wX2ZpZWxkX2ZpcnN0ICAgICAgICAgICAgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICBzLT5mcmFtZV9wcmVkX2ZyYW1lX2RjdCAgICAgICA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgIHMtPmNvbmNlYWxtZW50X21vdGlvbl92ZWN0b3JzID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgcy0+cV9zY2FsZV90eXBlICAgICAgICAgICAgICAgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICBzLT5pbnRyYV92bGNfZm9ybWF0ICAgICAgICAgICA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgIHMtPmFsdGVybmF0ZV9zY2FuICAgICAgICAgICAgID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgcy0+cmVwZWF0X2ZpcnN0X2ZpZWxkICAgICAgICAgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICBzLT5jaHJvbWFfNDIwX3R5cGUgICAgICAgICAgICA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgIHMtPnByb2dyZXNzaXZlX2ZyYW1lICAgICAgICAgID0gZ2V0X2JpdHMxKCZzLT5nYik7CisKKyAgICBpZiAocy0+YWx0ZXJuYXRlX3NjYW4pIHsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50ZXJfc2NhbnRhYmxlLCBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbik7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX3NjYW50YWJsZSwgZmZfYWx0ZXJuYXRlX3ZlcnRpY2FsX3NjYW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludGVyX3NjYW50YWJsZSwgZmZfemlnemFnX2RpcmVjdCk7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX3NjYW50YWJsZSwgZmZfemlnemFnX2RpcmVjdCk7CisgICAgfQorCisgICAgLyogY29tcG9zaXRlIGRpc3BsYXkgbm90IHBhcnNlZCAqLworICAgIGF2X2Rsb2cocy0+YXZjdHgsICJpbnRyYV9kY19wcmVjaXNpb249JWRcbiIsIHMtPmludHJhX2RjX3ByZWNpc2lvbik7CisgICAgYXZfZGxvZyhzLT5hdmN0eCwgInBpY3R1cmVfc3RydWN0dXJlPSVkXG4iLCBzLT5waWN0dXJlX3N0cnVjdHVyZSk7CisgICAgYXZfZGxvZyhzLT5hdmN0eCwgInRvcCBmaWVsZCBmaXJzdD0lZFxuIiwgcy0+dG9wX2ZpZWxkX2ZpcnN0KTsKKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAicmVwZWF0IGZpcnN0IGZpZWxkPSVkXG4iLCBzLT5yZXBlYXRfZmlyc3RfZmllbGQpOworICAgIGF2X2Rsb2cocy0+YXZjdHgsICJjb25jZWFsPSVkXG4iLCBzLT5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycyk7CisgICAgYXZfZGxvZyhzLT5hdmN0eCwgImludHJhX3ZsY19mb3JtYXQ9JWRcbiIsIHMtPmludHJhX3ZsY19mb3JtYXQpOworICAgIGF2X2Rsb2cocy0+YXZjdHgsICJhbHRlcm5hdGVfc2Nhbj0lZFxuIiwgcy0+YWx0ZXJuYXRlX3NjYW4pOworICAgIGF2X2Rsb2cocy0+YXZjdHgsICJmcmFtZV9wcmVkX2ZyYW1lX2RjdD0lZFxuIiwgcy0+ZnJhbWVfcHJlZF9mcmFtZV9kY3QpOworICAgIGF2X2Rsb2cocy0+YXZjdHgsICJwcm9ncmVzc2l2ZV9mcmFtZT0lZFxuIiwgcy0+cHJvZ3Jlc3NpdmVfZnJhbWUpOworfQorCitzdGF0aWMgaW50IG1wZWdfZmllbGRfc3RhcnQoTXBlZ0VuY0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPmF2Y3R4OworICAgIE1wZWcxQ29udGV4dCAqczEgICAgICA9IChNcGVnMUNvbnRleHQgKikgczsKKyAgICBpbnQgcmV0OworCisgICAgLyogc3RhcnQgZnJhbWUgZGVjb2RpbmcgKi8KKyAgICBpZiAocy0+Zmlyc3RfZmllbGQgfHwgcy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkgeworICAgICAgICBBVkZyYW1lU2lkZURhdGEgKnBhbl9zY2FuOworCisgICAgICAgIGlmICgocmV0ID0gZmZfbXB2X2ZyYW1lX3N0YXJ0KHMsIGF2Y3R4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBmZl9tcGVnX2VyX2ZyYW1lX3N0YXJ0KHMpOworCisgICAgICAgIC8qIGZpcnN0IGNoZWNrIGlmIHdlIG11c3QgcmVwZWF0IHRoZSBmcmFtZSAqLworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5yZXBlYXRfcGljdCA9IDA7CisgICAgICAgIGlmIChzLT5yZXBlYXRfZmlyc3RfZmllbGQpIHsKKyAgICAgICAgICAgIGlmIChzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSkgeworICAgICAgICAgICAgICAgIGlmIChzLT50b3BfZmllbGRfZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnJlcGVhdF9waWN0ID0gNDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnJlcGVhdF9waWN0ID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+cHJvZ3Jlc3NpdmVfZnJhbWUpIHsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5yZXBlYXRfcGljdCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwYW5fc2NhbiA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEocy0+Y3VycmVudF9waWN0dXJlX3B0ci0+ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0ZSQU1FX0RBVEFfUEFOU0NBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzMS0+cGFuX3NjYW4pKTsKKyAgICAgICAgaWYgKCFwYW5fc2NhbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbWNweShwYW5fc2Nhbi0+ZGF0YSwgJnMxLT5wYW5fc2Nhbiwgc2l6ZW9mKHMxLT5wYW5fc2NhbikpOworCisgICAgICAgIGlmIChzMS0+YTUzX2NhcHRpb24pIHsKKyAgICAgICAgICAgIEFWRnJhbWVTaWRlRGF0YSAqc2QgPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKAorICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYsIEFWX0ZSQU1FX0RBVEFfQTUzX0NDLAorICAgICAgICAgICAgICAgIHMxLT5hNTNfY2FwdGlvbl9zaXplKTsKKyAgICAgICAgICAgIGlmIChzZCkKKyAgICAgICAgICAgICAgICBtZW1jcHkoc2QtPmRhdGEsIHMxLT5hNTNfY2FwdGlvbiwgczEtPmE1M19jYXB0aW9uX3NpemUpOworICAgICAgICAgICAgYXZfZnJlZXAoJnMxLT5hNTNfY2FwdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoczEtPmhhc19zdGVyZW8zZCkgeworICAgICAgICAgICAgQVZTdGVyZW8zRCAqc3RlcmVvID0gYXZfc3RlcmVvM2RfY3JlYXRlX3NpZGVfZGF0YShzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mKTsKKyAgICAgICAgICAgIGlmICghc3RlcmVvKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgICpzdGVyZW8gPSBzMS0+c3RlcmVvM2Q7CisgICAgICAgICAgICBzMS0+aGFzX3N0ZXJlbzNkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzMS0+aGFzX2FmZCkgeworICAgICAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZCA9CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfbmV3X3NpZGVfZGF0YShzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRlJBTUVfREFUQV9BRkQsIDEpOworICAgICAgICAgICAgaWYgKCFzZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICAqc2QtPmRhdGEgICA9IHMxLT5hZmQ7CisgICAgICAgICAgICBzMS0+aGFzX2FmZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoSEFWRV9USFJFQURTICYmIChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSkKKyAgICAgICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoYXZjdHgpOworICAgIH0gZWxzZSB7IC8vIHNlY29uZCBmaWVsZAorICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoIXMtPmN1cnJlbnRfcGljdHVyZV9wdHIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZmlyc3QgZmllbGQgbWlzc2luZ1xuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+YXZjdHgtPmh3YWNjZWwgJiYKKyAgICAgICAgICAgIChzLT5hdmN0eC0+c2xpY2VfZmxhZ3MgJiBTTElDRV9GTEFHX0FMTE9XX0ZJRUxEKSkgeworICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5od2FjY2VsLT5lbmRfZnJhbWUocy0+YXZjdHgpIDwgMCkKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImhhcmR3YXJlIGFjY2VsZXJhdG9yIGZhaWxlZCB0byBkZWNvZGUgZmlyc3QgZmllbGRcbiIpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbaV0gPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5kYXRhW2ldOworICAgICAgICAgICAgaWYgKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEKQorICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhW2ldICs9CisgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmxpbmVzaXplW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5od2FjY2VsKSB7CisgICAgICAgIGlmICgocmV0ID0gYXZjdHgtPmh3YWNjZWwtPnN0YXJ0X2ZyYW1lKGF2Y3R4LCBidWYsIGJ1Zl9zaXplKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBERUNPREVfU0xJQ0VfRVJST1IgLTEKKyNkZWZpbmUgREVDT0RFX1NMSUNFX09LICAgICAwCisKKy8qKgorICogRGVjb2RlIGEgc2xpY2UuCisgKiBNcGVnRW5jQ29udGV4dC5tYl95IG11c3QgYmUgc2V0IHRvIHRoZSBNQiByb3cgZnJvbSB0aGUgc3RhcnRjb2RlLgorICogQHJldHVybiBERUNPREVfU0xJQ0VfRVJST1IgaWYgdGhlIHNsaWNlIGlzIGRhbWFnZWQsCisgKiAgICAgICAgIERFQ09ERV9TTElDRV9PSyBpZiB0aGlzIHNsaWNlIGlzIE9LCisgKi8KK3N0YXRpYyBpbnQgbXBlZ19kZWNvZGVfc2xpY2UoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBtYl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gcy0+YXZjdHg7CisgICAgY29uc3QgaW50IGxvd3JlcyAgICAgID0gcy0+YXZjdHgtPmxvd3JlczsKKyAgICBjb25zdCBpbnQgZmllbGRfcGljICAgPSBzLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FOworICAgIGludCByZXQ7CisKKyAgICBzLT5yZXN5bmNfbWJfeCA9CisgICAgcy0+cmVzeW5jX21iX3kgPSAtMTsKKworICAgIGF2X2Fzc2VydDAobWJfeSA8IHMtPm1iX2hlaWdodCk7CisKKyAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgKmJ1ZiwgYnVmX3NpemUgKiA4KTsKKyAgICBpZiAocy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzFWSURFTyAmJiBzLT5tYl9oZWlnaHQgPiAyODAwLzE2KQorICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzKTsKKworICAgIGZmX21wZWcxX2NsZWFuX2J1ZmZlcnMocyk7CisgICAgcy0+aW50ZXJsYWNlZF9kY3QgPSAwOworCisgICAgcy0+cXNjYWxlID0gZ2V0X3FzY2FsZShzKTsKKworICAgIGlmIChzLT5xc2NhbGUgPT0gMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInFzY2FsZSA9PSAwXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogZXh0cmEgc2xpY2UgaW5mbyAqLworICAgIGlmIChza2lwXzFzdG9wXzhkYXRhX2JpdHMoJnMtPmdiKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcy0+bWJfeCA9IDA7CisKKyAgICBpZiAobWJfeSA9PSAwICYmIHMtPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJTTElGIikpIHsKKyAgICAgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOworICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPiAwKSB7CisgICAgICAgICAgICBpbnQgY29kZSA9IGdldF92bGMyKCZzLT5nYiwgZmZfbWJpbmNyX3ZsYy50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJJTkNSX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgIGlmIChjb2RlIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZmlyc3QgbWJfaW5jciBkYW1hZ2VkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2RlID49IDMzKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMzMpCisgICAgICAgICAgICAgICAgICAgIHMtPm1iX3ggKz0gMzM7CisgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBzdHVmZmluZywgbm90aGluZyB0byBkbyAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5tYl94ICs9IGNvZGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+bWJfeCA+PSAodW5zaWduZWQpIHMtPm1iX3dpZHRoKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW5pdGlhbCBza2lwIG92ZXJmbG93XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5od2FjY2VsICYmIGF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2UpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqYnVmX2VuZCwgKmJ1Zl9zdGFydCA9ICpidWYgLSA0OyAvKiBpbmNsdWRlIHN0YXJ0X2NvZGUgKi8KKyAgICAgICAgaW50IHN0YXJ0X2NvZGUgPSAtMTsKKyAgICAgICAgYnVmX2VuZCA9IGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUoYnVmX3N0YXJ0ICsgMiwgKmJ1ZiArIGJ1Zl9zaXplLCAmc3RhcnRfY29kZSk7CisgICAgICAgIGlmIChidWZfZW5kIDwgKmJ1ZiArIGJ1Zl9zaXplKQorICAgICAgICAgICAgYnVmX2VuZCAtPSA0OworICAgICAgICBzLT5tYl95ID0gbWJfeTsKKyAgICAgICAgaWYgKGF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2UoYXZjdHgsIGJ1Zl9zdGFydCwgYnVmX2VuZCAtIGJ1Zl9zdGFydCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIERFQ09ERV9TTElDRV9FUlJPUjsKKyAgICAgICAgKmJ1ZiA9IGJ1Zl9lbmQ7CisgICAgICAgIHJldHVybiBERUNPREVfU0xJQ0VfT0s7CisgICAgfQorCisgICAgcy0+cmVzeW5jX21iX3ggPSBzLT5tYl94OworICAgIHMtPnJlc3luY19tYl95ID0gcy0+bWJfeSA9IG1iX3k7CisgICAgcy0+bWJfc2tpcF9ydW4gPSAwOworICAgIGZmX2luaXRfYmxvY2tfaW5kZXgocyk7CisKKyAgICBpZiAocy0+bWJfeSA9PSAwICYmIHMtPm1iX3ggPT0gMCAmJiAocy0+Zmlyc3RfZmllbGQgfHwgcy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkpIHsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgInFwOiVkIGZjOiUyZCUyZCUyZCUyZCAlcyAlcyAlcyAlcyAlcyBkYzolZCBwc3RydWN0OiVkIGZkY3Q6JWQgY212OiVkIHF0eXBlOiVkIGl2bGM6JWQgcmZmOiVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHMtPnFzY2FsZSwKKyAgICAgICAgICAgICAgICAgICBzLT5tcGVnX2ZfY29kZVswXVswXSwgcy0+bXBlZ19mX2NvZGVbMF1bMV0sCisgICAgICAgICAgICAgICAgICAgcy0+bXBlZ19mX2NvZGVbMV1bMF0sIHMtPm1wZWdfZl9jb2RlWzFdWzFdLAorICAgICAgICAgICAgICAgICAgIHMtPnBpY3RfdHlwZSAgPT0gQVZfUElDVFVSRV9UWVBFX0kgPyAiSSIgOgorICAgICAgICAgICAgICAgICAgIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AgPyAiUCIgOgorICAgICAgICAgICAgICAgICAgIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgPyAiQiIgOiAiUyIpKSwKKyAgICAgICAgICAgICAgICAgICBzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSA/ICJwcyIgIDogIiIsCisgICAgICAgICAgICAgICAgICAgcy0+cHJvZ3Jlc3NpdmVfZnJhbWUgICAgPyAicGYiICA6ICIiLAorICAgICAgICAgICAgICAgICAgIHMtPmFsdGVybmF0ZV9zY2FuICAgICAgID8gImFsdCIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICBzLT50b3BfZmllbGRfZmlyc3QgICAgICA/ICJ0b3AiIDogIiIsCisgICAgICAgICAgICAgICAgICAgcy0+aW50cmFfZGNfcHJlY2lzaW9uLCBzLT5waWN0dXJlX3N0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICAgICBzLT5mcmFtZV9wcmVkX2ZyYW1lX2RjdCwgcy0+Y29uY2VhbG1lbnRfbW90aW9uX3ZlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgcy0+cV9zY2FsZV90eXBlLCBzLT5pbnRyYV92bGNfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgIHMtPnJlcGVhdF9maXJzdF9maWVsZCwgcy0+Y2hyb21hXzQyMF90eXBlID8gIjQyMCIgOiAiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8vIElmIDEsIHdlIG1lbWNweSBibG9ja3MgaW4geHZtY3ZpZGVvLgorICAgICAgICBpZiAoKENPTkZJR19NUEVHMV9YVk1DX0hXQUNDRUwgfHwgQ09ORklHX01QRUcyX1hWTUNfSFdBQ0NFTCkgJiYgcy0+cGFja19wYmxvY2tzKQorICAgICAgICAgICAgZmZfeHZtY19pbml0X2Jsb2NrKHMpOyAvLyBzZXQgcy0+YmxvY2sKKworICAgICAgICBpZiAoKHJldCA9IG1wZWdfZGVjb2RlX21iKHMsIHMtPmJsb2NrKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAvLyBOb3RlIG1vdGlvbl92YWwgaXMgbm9ybWFsbHkgTlVMTCB1bmxlc3Mgd2Ugd2FudCB0byBleHRyYWN0IHRoZSBNVnMuCisgICAgICAgIGlmIChzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXSAmJiAhcy0+ZW5jb2RpbmcpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB3cmFwID0gcy0+Yjhfc3RyaWRlOworICAgICAgICAgICAgaW50IHh5ICAgICAgICAgPSBzLT5tYl94ICogMiArIHMtPm1iX3kgKiAyICogd3JhcDsKKyAgICAgICAgICAgIGludCBiOF94eSAgICAgID0gNCAqIChzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZSk7CisgICAgICAgICAgICBpbnQgbW90aW9uX3gsIG1vdGlvbl95LCBkaXIsIGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGRpciA9IDA7IGRpciA8IDI7IGRpcisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tYl9pbnRyYSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGRpciA9PSAxICYmIHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl94ID0gbW90aW9uX3kgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPm12X3R5cGUgPT0gTVZfVFlQRV8xNlgxNiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tdl90eXBlID09IE1WX1RZUEVfRklFTEQgJiYgZmllbGRfcGljKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3ggPSBzLT5tdltkaXJdWzBdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3kgPSBzLT5tdltkaXJdWzBdWzFdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBpZiAoKHMtPm12X3R5cGUgPT0gTVZfVFlQRV9GSUVMRCkgfHwgKHMtPm12X3R5cGUgPT0gTVZfVFlQRV8xNlg4KSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl94ID0gcy0+bXZbZGlyXVtpXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95ID0gcy0+bXZbZGlyXVtpXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHldWzBdICAgICA9IG1vdGlvbl94OworICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5XVsxXSAgICAgPSBtb3Rpb25feTsKKyAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eSArIDFdWzBdID0gbW90aW9uX3g7CisgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgKyAxXVsxXSA9IG1vdGlvbl95OworICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUucmVmX2luZGV4IFtkaXJdW2I4X3h5XSAgICAgPQorICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUucmVmX2luZGV4IFtkaXJdW2I4X3h5ICsgMV0gPSBzLT5maWVsZF9zZWxlY3RbZGlyXVtpXTsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihzLT5maWVsZF9zZWxlY3RbZGlyXVtpXSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmllbGRfc2VsZWN0W2Rpcl1baV0gPT0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHh5ICAgICs9IHdyYXA7CisgICAgICAgICAgICAgICAgYjhfeHkgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHMtPmRlc3RbMF0gKz0gMTYgPj4gbG93cmVzOworICAgICAgICBzLT5kZXN0WzFdICs9KDE2ID4+IGxvd3JlcykgPj4gcy0+Y2hyb21hX3hfc2hpZnQ7CisgICAgICAgIHMtPmRlc3RbMl0gKz0oMTYgPj4gbG93cmVzKSA+PiBzLT5jaHJvbWFfeF9zaGlmdDsKKworICAgICAgICBmZl9tcHZfZGVjb2RlX21iKHMsIHMtPmJsb2NrKTsKKworICAgICAgICBpZiAoKytzLT5tYl94ID49IHMtPm1iX3dpZHRoKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgbWJfc2l6ZSA9IDE2ID4+IHMtPmF2Y3R4LT5sb3dyZXM7CisKKyAgICAgICAgICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIG1iX3NpemUgKiAocy0+bWJfeSA+PiBmaWVsZF9waWMpLCBtYl9zaXplKTsKKyAgICAgICAgICAgIGZmX21wdl9yZXBvcnRfZGVjb2RlX3Byb2dyZXNzKHMpOworCisgICAgICAgICAgICBzLT5tYl94ICA9IDA7CisgICAgICAgICAgICBzLT5tYl95ICs9IDEgPDwgZmllbGRfcGljOworCisgICAgICAgICAgICBpZiAocy0+bWJfeSA+PSBzLT5tYl9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVmdCAgID0gZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpOworICAgICAgICAgICAgICAgIGludCBpc19kMTAgPSBzLT5jaHJvbWFfZm9ybWF0ID09IDIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5wcm9maWxlID09IDAgJiYgYXZjdHgtPmxldmVsID09IDUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW50cmFfZGNfcHJlY2lzaW9uID09IDIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cV9zY2FsZV90eXBlID09IDEgJiYgcy0+YWx0ZXJuYXRlX3NjYW4gPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9ncmVzc2l2ZV9mcmFtZSA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZidl9kZWxheSA9PSAweEJCQiB8fCAweEUxMCAqLzsKKworICAgICAgICAgICAgICAgIGlmIChsZWZ0ID49IDMyICYmICFpc19kMTApIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCBnYiA9IHMtPmdiOworICAgICAgICAgICAgICAgICAgICBhbGlnbl9nZXRfYml0cygmZ2IpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd19iaXRzKCZnYiwgMjQpID09IDB4MDYwRTJCKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkludmFsaWQgTVhGIGRhdGEgZm91bmQgaW4gdmlkZW8gc3RyZWFtXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX2QxMCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVmdCA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgKGxlZnQgJiYgc2hvd19iaXRzKCZzLT5nYiwgRkZNSU4obGVmdCwgMjMpKSAmJiAhaXNfZDEwKSB8fAorICAgICAgICAgICAgICAgICAgICAoKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiAoQVZfRUZfQklUU1RSRUFNIHwgQVZfRUZfQUdHUkVTU0lWRSkpICYmIGxlZnQgPiA4KSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVuZCBtaXNtYXRjaCBsZWZ0PSVkICUwWFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsIHNob3dfYml0cygmcy0+Z2IsIEZGTUlOKGxlZnQsIDIzKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgZmlsZXMgb3V0IHRoZXJlIHdoaWNoIGFyZSBtaXNzaW5nIHRoZSBsYXN0IHNsaWNlCisgICAgICAgICAgICAvLyBpbiBjYXNlcyB3aGVyZSB0aGUgc2xpY2UgaXMgY29tcGxldGVseSBvdXRzaWRlIHRoZSB2aXNpYmxlCisgICAgICAgICAgICAvLyBhcmVhLCB3ZSBkZXRlY3QgdGhpcyBoZXJlIGluc3RlYWQgb2YgcnVubmluZyBpbnRvIHRoZSBlbmQgZXhwZWN0aW5nCisgICAgICAgICAgICAvLyBtb3JlIGRhdGEKKyAgICAgICAgICAgIGlmIChzLT5tYl95ID49ICgocy0+aGVpZ2h0ICsgMTUpID4+IDQpICYmCisgICAgICAgICAgICAgICAgcy0+cHJvZ3Jlc3NpdmVfZnJhbWUgJiYKKyAgICAgICAgICAgICAgICAhcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UgJiYKKyAgICAgICAgICAgICAgICBnZXRfYml0c19sZWZ0KCZzLT5nYikgPD0gOCAmJgorICAgICAgICAgICAgICAgIGdldF9iaXRzX2xlZnQoJnMtPmdiKSA+PSAwICYmCisgICAgICAgICAgICAgICAgcy0+bWJfc2tpcF9ydW4gPT0gLTEgJiYKKyAgICAgICAgICAgICAgICBzaG93X2JpdHMoJnMtPmdiLCA4KSA9PSAwKQorICAgICAgICAgICAgICAgIGdvdG8gZW9zOworCisgICAgICAgICAgICBmZl9pbml0X2Jsb2NrX2luZGV4KHMpOworICAgICAgICB9CisKKyAgICAgICAgLyogc2tpcCBtYiBoYW5kbGluZyAqLworICAgICAgICBpZiAocy0+bWJfc2tpcF9ydW4gPT0gLTEpIHsKKyAgICAgICAgICAgIC8qIHJlYWQgaW5jcmVtZW50IGFnYWluICovCisgICAgICAgICAgICBzLT5tYl9za2lwX3J1biA9IDA7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX21iaW5jcl92bGMudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQklOQ1JfVkxDX0JJVFMsIDIpOworICAgICAgICAgICAgICAgIGlmIChjb2RlIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1iIGluY3IgZGFtYWdlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29kZSA+PSAzMykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAzMykgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfc2tpcF9ydW4gKz0gMzM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAzNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm1iX3NraXBfcnVuICE9IDAgfHwgc2hvd19iaXRzKCZzLT5nYiwgMTUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInNsaWNlIG1pc21hdGNoXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVvczsgLyogZW5kIG9mIHNsaWNlICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBzdHVmZmluZywgbm90aGluZyB0byBkbyAqLworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMtPm1iX3NraXBfcnVuICs9IGNvZGU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5tYl9za2lwX3J1bikgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcHBlZCBNQiBpbiBJIGZyYW1lIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogc2tpcCBtYiAqLworICAgICAgICAgICAgICAgIHMtPm1iX2ludHJhID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9IC0xOworICAgICAgICAgICAgICAgIGlmIChzLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV8xNlgxNjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFX0ZJRUxEOworICAgICAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaWYgUCB0eXBlLCB6ZXJvIG1vdGlvbiB2ZWN0b3IgaXMgaW1wbGllZCAqLworICAgICAgICAgICAgICAgICAgICBzLT5tdl9kaXIgICAgICAgICAgICAgPSBNVl9ESVJfRk9SV0FSRDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gICAgICAgID0gcy0+bXZbMF1bMF1bMV0gICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMF1bMF0gICA9IHMtPmxhc3RfbXZbMF1bMF1bMV0gPSAwOworICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzBdWzFdWzBdICAgPSBzLT5sYXN0X212WzBdWzFdWzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZmllbGRfc2VsZWN0WzBdWzBdID0gKHMtPnBpY3R1cmVfc3RydWN0dXJlIC0gMSkgJiAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGlmIEIgdHlwZSwgcmV1c2UgcHJldmlvdXMgdmVjdG9ycyBhbmQgZGlyZWN0aW9ucyAqLworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9IHMtPmxhc3RfbXZbMF1bMF1bMF07CisgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdID0gcy0+bGFzdF9tdlswXVswXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMV1bMF1bMF0gPSBzLT5sYXN0X212WzFdWzBdWzBdOworICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVsxXSA9IHMtPmxhc3RfbXZbMV1bMF1bMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorZW9zOiAvLyBlbmQgb2Ygc2xpY2UKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAib3ZlcnJlYWQgJWRcbiIsIC1nZXRfYml0c19sZWZ0KCZzLT5nYikpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgKmJ1ZiArPSAoZ2V0X2JpdHNfY291bnQoJnMtPmdiKSAtIDEpIC8gODsKKyAgICBhdl9kbG9nKHMsICJ5ICVkICVkICVkICVkXG4iLCBzLT5yZXN5bmNfbWJfeCwgcy0+cmVzeW5jX21iX3ksIHMtPm1iX3gsIHMtPm1iX3kpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaWNlX2RlY29kZV90aHJlYWQoQVZDb2RlY0NvbnRleHQgKmMsIHZvaWQgKmFyZykKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyAgID0gKih2b2lkICoqKSBhcmc7CisgICAgY29uc3QgdWludDhfdCAqYnVmICA9IHMtPmdiLmJ1ZmZlcjsKKyAgICBpbnQgbWJfeSAgICAgICAgICAgID0gcy0+c3RhcnRfbWJfeTsKKyAgICBjb25zdCBpbnQgZmllbGRfcGljID0gcy0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRTsKKworICAgIHMtPmVyLmVycm9yX2NvdW50ID0gKDMgKiAocy0+ZW5kX21iX3kgLSBzLT5zdGFydF9tYl95KSAqIHMtPm1iX3dpZHRoKSA+PiBmaWVsZF9waWM7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHVpbnQzMl90IHN0YXJ0X2NvZGU7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgcmV0ID0gbXBlZ19kZWNvZGVfc2xpY2UocywgbWJfeSwgJmJ1Ziwgcy0+Z2IuYnVmZmVyX2VuZCAtIGJ1Zik7CisgICAgICAgIGVtbXNfYygpOworICAgICAgICBhdl9kbG9nKGMsICJyZXQ6JWQgcmVzeW5jOiVkLyVkIG1iOiVkLyVkIHRzOiVkLyVkIGVjOiVkXG4iLAorICAgICAgICAgICAgICAgIHJldCwgcy0+cmVzeW5jX21iX3gsIHMtPnJlc3luY19tYl95LCBzLT5tYl94LCBzLT5tYl95LAorICAgICAgICAgICAgICAgIHMtPnN0YXJ0X21iX3ksIHMtPmVuZF9tYl95LCBzLT5lci5lcnJvcl9jb3VudCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAoYy0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKHMtPnJlc3luY19tYl94ID49IDAgJiYgcy0+cmVzeW5jX21iX3kgPj0gMCkKKyAgICAgICAgICAgICAgICBmZl9lcl9hZGRfc2xpY2UoJnMtPmVyLCBzLT5yZXN5bmNfbWJfeCwgcy0+cmVzeW5jX21iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3gsIHMtPm1iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSX0FDX0VSUk9SIHwgRVJfRENfRVJST1IgfCBFUl9NVl9FUlJPUik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZl9lcl9hZGRfc2xpY2UoJnMtPmVyLCBzLT5yZXN5bmNfbWJfeCwgcy0+cmVzeW5jX21iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfeCAtIDEsIHMtPm1iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJfQUNfRU5EIHwgRVJfRENfRU5EIHwgRVJfTVZfRU5EKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5tYl95ID09IHMtPmVuZF9tYl95KQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgc3RhcnRfY29kZSA9IC0xOworICAgICAgICBidWYgICAgICAgID0gYXZwcml2X2ZpbmRfc3RhcnRfY29kZShidWYsIHMtPmdiLmJ1ZmZlcl9lbmQsICZzdGFydF9jb2RlKTsKKyAgICAgICAgbWJfeSAgICAgICA9IHN0YXJ0X2NvZGUgLSBTTElDRV9NSU5fU1RBUlRfQ09ERTsKKyAgICAgICAgaWYgKHMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QRUcxVklERU8gJiYgcy0+bWJfaGVpZ2h0ID4gMjgwMC8xNikKKyAgICAgICAgICAgIG1iX3kgKz0gKCpidWYmMHhFMCk8PDI7CisgICAgICAgIG1iX3kgPDw9IGZpZWxkX3BpYzsKKyAgICAgICAgaWYgKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEKQorICAgICAgICAgICAgbWJfeSsrOworICAgICAgICBpZiAobWJfeSA8IDAgfHwgbWJfeSA+PSBzLT5lbmRfbWJfeSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKKy8qKgorICogSGFuZGxlIHNsaWNlIGVuZHMuCisgKiBAcmV0dXJuIDEgaWYgaXQgc2VlbXMgdG8gYmUgdGhlIGxhc3Qgc2xpY2UKKyAqLworc3RhdGljIGludCBzbGljZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwaWN0KQoreworICAgIE1wZWcxQ29udGV4dCAqczEgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZzMS0+bXBlZ19lbmNfY3R4OworCisgICAgaWYgKCFzMS0+bXBlZ19lbmNfY3R4X2FsbG9jYXRlZCB8fCAhcy0+Y3VycmVudF9waWN0dXJlX3B0cikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocy0+YXZjdHgtPmh3YWNjZWwpIHsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5od2FjY2VsLT5lbmRfZnJhbWUocy0+YXZjdHgpIDwgMCkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJoYXJkd2FyZSBhY2NlbGVyYXRvciBmYWlsZWQgdG8gZGVjb2RlIHBpY3R1cmVcbiIpOworICAgIH0KKworICAgIC8qIGVuZCBvZiBzbGljZSByZWFjaGVkICovCisgICAgaWYgKC8qIHMtPm1iX3kgPDwgZmllbGRfcGljID09IHMtPm1iX2hlaWdodCAmJiAqLyAhcy0+Zmlyc3RfZmllbGQgJiYgIXMxLT5maXJzdF9zbGljZSkgeworICAgICAgICAvKiBlbmQgb2YgaW1hZ2UgKi8KKworICAgICAgICBmZl9lcl9mcmFtZV9lbmQoJnMtPmVyKTsKKworICAgICAgICBmZl9tcHZfZnJhbWVfZW5kKHMpOworCisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgfHwgcy0+bG93X2RlbGF5KSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gYXZfZnJhbWVfcmVmKHBpY3QsIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGZmX3ByaW50X2RlYnVnX2luZm8ocywgcy0+Y3VycmVudF9waWN0dXJlX3B0ciwgcGljdCk7CisgICAgICAgICAgICBmZl9tcHZfZXhwb3J0X3FwX3RhYmxlKHMsIHBpY3QsIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIsIEZGX1FTQ0FMRV9UWVBFX01QRUcyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKQorICAgICAgICAgICAgICAgIHMtPnBpY3R1cmVfbnVtYmVyKys7CisgICAgICAgICAgICAvKiBsYXRlbmN5IG9mIDEgZnJhbWUgZm9yIEktIGFuZCBQLWZyYW1lcyAqLworICAgICAgICAgICAgLyogWFhYOiB1c2UgYW5vdGhlciB2YXJpYWJsZSB0aGFuIHBpY3R1cmVfbnVtYmVyICovCisgICAgICAgICAgICBpZiAocy0+bGFzdF9waWN0dXJlX3B0cikgeworICAgICAgICAgICAgICAgIGludCByZXQgPSBhdl9mcmFtZV9yZWYocGljdCwgcy0+bGFzdF9waWN0dXJlX3B0ci0+Zik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgZmZfcHJpbnRfZGVidWdfaW5mbyhzLCBzLT5sYXN0X3BpY3R1cmVfcHRyLCBwaWN0KTsKKyAgICAgICAgICAgICAgICBmZl9tcHZfZXhwb3J0X3FwX3RhYmxlKHMsIHBpY3QsIHMtPmxhc3RfcGljdHVyZV9wdHIsIEZGX1FTQ0FMRV9UWVBFX01QRUcyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCBtcGVnMV9kZWNvZGVfc2VxdWVuY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgTXBlZzFDb250ZXh0ICpzMSAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnMxLT5tcGVnX2VuY19jdHg7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGksIHYsIGo7CisKKyAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgYnVmLCBidWZfc2l6ZSAqIDgpOworCisgICAgd2lkdGggID0gZ2V0X2JpdHMoJnMtPmdiLCAxMik7CisgICAgaGVpZ2h0ID0gZ2V0X2JpdHMoJnMtPmdiLCAxMik7CisgICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJJbnZhbGlkIGhvcml6b250YWwgb3IgdmVydGljYWwgc2l6ZSB2YWx1ZS5cbiIpOworICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9CSVRTVFJFQU0gfCBBVl9FRl9DT01QTElBTlQpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHMtPmFzcGVjdF9yYXRpb19pbmZvID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsKKyAgICBpZiAocy0+YXNwZWN0X3JhdGlvX2luZm8gPT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImFzcGVjdCByYXRpbyBoYXMgZm9yYmlkZGVuIDAgdmFsdWVcbiIpOworICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9CSVRTVFJFQU0gfCBBVl9FRl9DT01QTElBTlQpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHMtPmZyYW1lX3JhdGVfaW5kZXggPSBnZXRfYml0cygmcy0+Z2IsIDQpOworICAgIGlmIChzLT5mcmFtZV9yYXRlX2luZGV4ID09IDAgfHwgcy0+ZnJhbWVfcmF0ZV9pbmRleCA+IDEzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJmcmFtZV9yYXRlX2luZGV4ICVkIGlzIGludmFsaWRcbiIsIHMtPmZyYW1lX3JhdGVfaW5kZXgpOworICAgICAgICBzLT5mcmFtZV9yYXRlX2luZGV4ID0gMTsKKyAgICB9CisgICAgcy0+Yml0X3JhdGUgPSBnZXRfYml0cygmcy0+Z2IsIDE4KSAqIDQwMDsKKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikgPT0gMCkgeyAvKiBtYXJrZXIgKi8KKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNYXJrZXIgaW4gc2VxdWVuY2UgaGVhZGVyIG1pc3NpbmdcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcy0+d2lkdGggID0gd2lkdGg7CisgICAgcy0+aGVpZ2h0ID0gaGVpZ2h0OworCisgICAgcy0+YXZjdHgtPnJjX2J1ZmZlcl9zaXplID0gZ2V0X2JpdHMoJnMtPmdiLCAxMCkgKiAxMDI0ICogMTY7CisgICAgc2tpcF9iaXRzKCZzLT5nYiwgMSk7CisKKyAgICAvKiBnZXQgbWF0cml4ICovCisgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgIGxvYWRfbWF0cml4KHMsIHMtPmNocm9tYV9pbnRyYV9tYXRyaXgsIHMtPmludHJhX21hdHJpeCwgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIGogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV07CisgICAgICAgICAgICB2ID0gZmZfbXBlZzFfZGVmYXVsdF9pbnRyYV9tYXRyaXhbaV07CisgICAgICAgICAgICBzLT5pbnRyYV9tYXRyaXhbal0gICAgICAgID0gdjsKKyAgICAgICAgICAgIHMtPmNocm9tYV9pbnRyYV9tYXRyaXhbal0gPSB2OworICAgICAgICB9CisgICAgfQorICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICBsb2FkX21hdHJpeChzLCBzLT5jaHJvbWFfaW50ZXJfbWF0cml4LCBzLT5pbnRlcl9tYXRyaXgsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaiA9IHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltpXTsKKyAgICAgICAgICAgIHYgPSBmZl9tcGVnMV9kZWZhdWx0X25vbl9pbnRyYV9tYXRyaXhbaV07CisgICAgICAgICAgICBzLT5pbnRlcl9tYXRyaXhbal0gICAgICAgID0gdjsKKyAgICAgICAgICAgIHMtPmNocm9tYV9pbnRlcl9tYXRyaXhbal0gPSB2OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNob3dfYml0cygmcy0+Z2IsIDIzKSAhPSAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic2VxdWVuY2UgaGVhZGVyIGRhbWFnZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBXZSBzZXQgTVBFRy0yIHBhcmFtZXRlcnMgc28gdGhhdCBpdCBlbXVsYXRlcyBNUEVHLTEuICovCisgICAgcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UgPSAxOworICAgIHMtPnByb2dyZXNzaXZlX2ZyYW1lICAgID0gMTsKKyAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSAgICA9IFBJQ1RfRlJBTUU7CisgICAgcy0+Zmlyc3RfZmllbGQgICAgICAgICAgPSAwOworICAgIHMtPmZyYW1lX3ByZWRfZnJhbWVfZGN0ID0gMTsKKyAgICBzLT5jaHJvbWFfZm9ybWF0ICAgICAgICA9IDE7CisgICAgcy0+Y29kZWNfaWQgICAgICAgICAgICAgPQorICAgIHMtPmF2Y3R4LT5jb2RlY19pZCAgICAgID0gQVZfQ09ERUNfSURfTVBFRzFWSURFTzsKKyAgICBzLT5vdXRfZm9ybWF0ICAgICAgICAgICA9IEZNVF9NUEVHMTsKKyAgICBzLT5zd2FwX3V2ICAgICAgICAgICAgICA9IDA7IC8vIEFGQUlLIFZDUjIgZG9lcyBub3QgaGF2ZSBTRVFfSEVBREVSCisgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19MT1dfREVMQVkpCisgICAgICAgIHMtPmxvd19kZWxheSA9IDE7CisKKyAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInZidiBidWZmZXI6ICVkLCBiaXRyYXRlOiVkLCBhc3BlY3RfcmF0aW9faW5mbzogJWQgXG4iLAorICAgICAgICAgICAgICAgcy0+YXZjdHgtPnJjX2J1ZmZlcl9zaXplLCBzLT5iaXRfcmF0ZSwgcy0+YXNwZWN0X3JhdGlvX2luZm8pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmNyMl9pbml0X3NlcXVlbmNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNcGVnMUNvbnRleHQgKnMxICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmczEtPm1wZWdfZW5jX2N0eDsKKyAgICBpbnQgaSwgdjsKKyAgICBpbnQgcmV0OworCisgICAgLyogc3RhcnQgbmV3IE1QRUctMSBjb250ZXh0IGRlY29kaW5nICovCisgICAgcy0+b3V0X2Zvcm1hdCA9IEZNVF9NUEVHMTsKKyAgICBpZiAoczEtPm1wZWdfZW5jX2N0eF9hbGxvY2F0ZWQpIHsKKyAgICAgICAgZmZfbXB2X2NvbW1vbl9lbmQocyk7CisgICAgICAgIHMxLT5tcGVnX2VuY19jdHhfYWxsb2NhdGVkID0gMDsKKyAgICB9CisgICAgcy0+d2lkdGggICAgICAgICAgICA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICBzLT5oZWlnaHQgICAgICAgICAgID0gYXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICBhdmN0eC0+aGFzX2JfZnJhbWVzID0gMDsgLy8gdHJ1ZT8KKyAgICBzLT5sb3dfZGVsYXkgICAgICAgID0gMTsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gbXBlZ19nZXRfcGl4ZWxmb3JtYXQoYXZjdHgpOworICAgIHNldHVwX2h3YWNjZWxfZm9yX3BpeGZtdChhdmN0eCk7CisKKyAgICBmZl9tcHZfaWRjdF9pbml0KHMpOworICAgIGlmICgocmV0ID0gZmZfbXB2X2NvbW1vbl9pbml0KHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgczEtPm1wZWdfZW5jX2N0eF9hbGxvY2F0ZWQgPSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgaW50IGogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV07CisgICAgICAgIHYgPSBmZl9tcGVnMV9kZWZhdWx0X2ludHJhX21hdHJpeFtpXTsKKyAgICAgICAgcy0+aW50cmFfbWF0cml4W2pdICAgICAgICA9IHY7CisgICAgICAgIHMtPmNocm9tYV9pbnRyYV9tYXRyaXhbal0gPSB2OworCisgICAgICAgIHYgPSBmZl9tcGVnMV9kZWZhdWx0X25vbl9pbnRyYV9tYXRyaXhbaV07CisgICAgICAgIHMtPmludGVyX21hdHJpeFtqXSAgICAgICAgPSB2OworICAgICAgICBzLT5jaHJvbWFfaW50ZXJfbWF0cml4W2pdID0gdjsKKyAgICB9CisKKyAgICBzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSAgPSAxOworICAgIHMtPnByb2dyZXNzaXZlX2ZyYW1lICAgICA9IDE7CisgICAgcy0+cGljdHVyZV9zdHJ1Y3R1cmUgICAgID0gUElDVF9GUkFNRTsKKyAgICBzLT5maXJzdF9maWVsZCAgICAgICAgICAgPSAwOworICAgIHMtPmZyYW1lX3ByZWRfZnJhbWVfZGN0ICA9IDE7CisgICAgcy0+Y2hyb21hX2Zvcm1hdCAgICAgICAgID0gMTsKKyAgICBpZiAocy0+Y29kZWNfdGFnID09IEFWX1JMMzIoIkJXMTAiKSkgeworICAgICAgICBzLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBzLT5hdmN0eC0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPnN3YXBfdXYgPSAxOyAvLyBpbiBjYXNlIG9mIHh2bWMgd2UgbmVlZCB0byBzd2FwIHV2IGZvciBlYWNoIE1CCisgICAgICAgIHMtPmNvZGVjX2lkICAgICAgICAgICAgICA9IHMtPmF2Y3R4LT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QRUcyVklERU87CisgICAgfQorICAgIHMxLT5zYXZlX3dpZHRoICAgICAgICAgICA9IHMtPndpZHRoOworICAgIHMxLT5zYXZlX2hlaWdodCAgICAgICAgICA9IHMtPmhlaWdodDsKKyAgICBzMS0+c2F2ZV9wcm9ncmVzc2l2ZV9zZXEgPSBzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVnX2RlY29kZV9hNTNfY2MoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcCwgaW50IGJ1Zl9zaXplKQoreworICAgIE1wZWcxQ29udGV4dCAqczEgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGJ1Zl9zaXplID49IDYgJiYKKyAgICAgICAgcFswXSA9PSAnRycgJiYgcFsxXSA9PSAnQScgJiYgcFsyXSA9PSAnOScgJiYgcFszXSA9PSAnNCcgJiYKKyAgICAgICAgcFs0XSA9PSAzICYmIChwWzVdICYgMHg0MCkpIHsKKyAgICAgICAgLyogZXh0cmFjdCBBNTMgUGFydCA0IENDIGRhdGEgKi8KKyAgICAgICAgaW50IGNjX2NvdW50ID0gcFs1XSAmIDB4MWY7CisgICAgICAgIGlmIChjY19jb3VudCA+IDAgJiYgYnVmX3NpemUgPj0gNyArIGNjX2NvdW50ICogMykgeworICAgICAgICAgICAgYXZfZnJlZXAoJnMxLT5hNTNfY2FwdGlvbik7CisgICAgICAgICAgICBzMS0+YTUzX2NhcHRpb25fc2l6ZSA9IGNjX2NvdW50ICogMzsKKyAgICAgICAgICAgIHMxLT5hNTNfY2FwdGlvbiAgICAgID0gYXZfbWFsbG9jKHMxLT5hNTNfY2FwdGlvbl9zaXplKTsKKyAgICAgICAgICAgIGlmIChzMS0+YTUzX2NhcHRpb24pCisgICAgICAgICAgICAgICAgbWVtY3B5KHMxLT5hNTNfY2FwdGlvbiwgcCArIDcsIHMxLT5hNTNfY2FwdGlvbl9zaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKGJ1Zl9zaXplID49IDExICYmCisgICAgICAgICAgICAgICBwWzBdID09ICdDJyAmJiBwWzFdID09ICdDJyAmJiBwWzJdID09IDB4MDEgJiYgcFszXSA9PSAweGY4KSB7CisgICAgICAgIC8qIGV4dHJhY3QgRFZEIENDIGRhdGEgKi8KKyAgICAgICAgaW50IGNjX2NvdW50ID0gMDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIC8vIFRoZXJlIGlzIGEgY2FwdGlvbiBjb3VudCBmaWVsZCBpbiB0aGUgZGF0YSwgYnV0IGl0IGlzIG9mdGVuCisgICAgICAgIC8vIGluY29yZWN0LiAgU28gY291bnQgdGhlIG51bWJlciBvZiBjYXB0aW9ucyBwcmVzZW50LgorICAgICAgICBmb3IgKGkgPSA1OyBpICsgNiA8PSBidWZfc2l6ZSAmJiAoKHBbaV0gJiAweGZlKSA9PSAweGZlKTsgaSArPSA2KQorICAgICAgICAgICAgY2NfY291bnQrKzsKKyAgICAgICAgLy8gVHJhbnNmb3JtIHRoZSBEVkQgZm9ybWF0IGludG8gQTUzIFBhcnQgNCBmb3JtYXQKKyAgICAgICAgaWYgKGNjX2NvdW50ID4gMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnMxLT5hNTNfY2FwdGlvbik7CisgICAgICAgICAgICBzMS0+YTUzX2NhcHRpb25fc2l6ZSA9IGNjX2NvdW50ICogNjsKKyAgICAgICAgICAgIHMxLT5hNTNfY2FwdGlvbiAgICAgID0gYXZfbWFsbG9jKHMxLT5hNTNfY2FwdGlvbl9zaXplKTsKKyAgICAgICAgICAgIGlmIChzMS0+YTUzX2NhcHRpb24pIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGZpZWxkMSA9ICEhKHBbNF0gJiAweDgwKTsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpjYXAgPSBzMS0+YTUzX2NhcHRpb247CisgICAgICAgICAgICAgICAgcCArPSA1OworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjY19jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcFswXSA9IChwWzBdID09IDB4ZmYgJiYgZmllbGQxKSA/IDB4ZmMgOiAweGZkOworICAgICAgICAgICAgICAgICAgICBjYXBbMV0gPSBwWzFdOworICAgICAgICAgICAgICAgICAgICBjYXBbMl0gPSBwWzJdOworICAgICAgICAgICAgICAgICAgICBjYXBbM10gPSAocFszXSA9PSAweGZmICYmICFmaWVsZDEpID8gMHhmYyA6IDB4ZmQ7CisgICAgICAgICAgICAgICAgICAgIGNhcFs0XSA9IHBbNF07CisgICAgICAgICAgICAgICAgICAgIGNhcFs1XSA9IHBbNV07CisgICAgICAgICAgICAgICAgICAgIGNhcCArPSA2OworICAgICAgICAgICAgICAgICAgICBwICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXBlZ19kZWNvZGVfdXNlcl9kYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwLCBpbnQgYnVmX3NpemUpCit7CisgICAgTXBlZzFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gcCArIGJ1Zl9zaXplOworICAgIE1wZWcxQ29udGV4dCAqczEgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGJ1Zl9zaXplID4gMjkpeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKGk9MDsgaTwyMDsgaSsrKQorICAgICAgICAgICAgaWYgKCFtZW1jbXAocCtpLCAiXDBUTVBHRVhTXDAiLCA5KSl7CisgICAgICAgICAgICAgICAgcy0+dG1wZ2V4cz0gMTsKKyAgICAgICAgICAgIH0KKworLyogICAgICAgIGZvcihpPTA7ICEoIXBbaS0yXSAmJiAhcFtpLTFdICYmIHBbaV09PTEpICYmIGk8YnVmX3NpemU7IGkrKyl7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIiVjIiwgcFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiXG4iKTsqLworICAgIH0KKworICAgIC8qIHdlIHBhcnNlIHRoZSBEVEcgYWN0aXZlIGZvcm1hdCBpbmZvcm1hdGlvbiAqLworICAgIGlmIChidWZfZW5kIC0gcCA+PSA1ICYmCisgICAgICAgIHBbMF0gPT0gJ0QnICYmIHBbMV0gPT0gJ1QnICYmIHBbMl0gPT0gJ0cnICYmIHBbM10gPT0gJzEnKSB7CisgICAgICAgIGludCBmbGFncyA9IHBbNF07CisgICAgICAgIHAgKz0gNTsKKyAgICAgICAgaWYgKGZsYWdzICYgMHg4MCkgeworICAgICAgICAgICAgLyogc2tpcCBldmVudCBpZCAqLworICAgICAgICAgICAgcCArPSAyOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFncyAmIDB4NDApIHsKKyAgICAgICAgICAgIGlmIChidWZfZW5kIC0gcCA8IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuOworI2lmIEZGX0FQSV9BRkQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgICAgIGF2Y3R4LT5kdGdfYWN0aXZlX2Zvcm1hdCA9IHBbMF0gJiAweDBmOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYgLyogRkZfQVBJX0FGRCAqLworICAgICAgICAgICAgczEtPmhhc19hZmQgPSAxOworICAgICAgICAgICAgczEtPmFmZCAgICAgPSBwWzBdICYgMHgwZjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYnVmX2VuZCAtIHAgPj0gNiAmJgorICAgICAgICAgICAgICAgcFswXSA9PSAnSicgJiYgcFsxXSA9PSAnUCcgJiYgcFsyXSA9PSAnMycgJiYgcFszXSA9PSAnRCcgJiYKKyAgICAgICAgICAgICAgIHBbNF0gPT0gMHgwMykgeyAvLyBTM0RfdmlkZW9fZm9ybWF0X2xlbmd0aAorICAgICAgICAvLyB0aGUgMHg3RiBtYXNrIGlnbm9yZXMgdGhlIHJlc2VydmVkX2JpdCB2YWx1ZQorICAgICAgICBjb25zdCB1aW50OF90IFMzRF92aWRlb19mb3JtYXRfdHlwZSA9IHBbNV0gJiAweDdGOworCisgICAgICAgIGlmIChTM0RfdmlkZW9fZm9ybWF0X3R5cGUgPT0gMHgwMyB8fAorICAgICAgICAgICAgUzNEX3ZpZGVvX2Zvcm1hdF90eXBlID09IDB4MDQgfHwKKyAgICAgICAgICAgIFMzRF92aWRlb19mb3JtYXRfdHlwZSA9PSAweDA4IHx8CisgICAgICAgICAgICBTM0RfdmlkZW9fZm9ybWF0X3R5cGUgPT0gMHgyMykgeworCisgICAgICAgICAgICBzMS0+aGFzX3N0ZXJlbzNkID0gMTsKKworICAgICAgICAgICAgc3dpdGNoIChTM0RfdmlkZW9fZm9ybWF0X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgMHgwMzoKKyAgICAgICAgICAgICAgICBzMS0+c3RlcmVvM2QudHlwZSA9IEFWX1NURVJFTzNEX1NJREVCWVNJREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDQ6CisgICAgICAgICAgICAgICAgczEtPnN0ZXJlbzNkLnR5cGUgPSBBVl9TVEVSRU8zRF9UT1BCT1RUT007CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDg6CisgICAgICAgICAgICAgICAgczEtPnN0ZXJlbzNkLnR5cGUgPSBBVl9TVEVSRU8zRF8yRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgyMzoKKyAgICAgICAgICAgICAgICBzMS0+c3RlcmVvM2QudHlwZSA9IEFWX1NURVJFTzNEX1NJREVCWVNJREVfUVVJTkNVTlg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1wZWdfZGVjb2RlX2E1M19jYyhhdmN0eCwgcCwgYnVmX3NpemUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1wZWdfZGVjb2RlX2dvcChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgTXBlZzFDb250ZXh0ICpzMSAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnMxLT5tcGVnX2VuY19jdHg7CisgICAgaW50IGJyb2tlbl9saW5rOworICAgIGludDY0X3QgdGM7CisKKyAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgYnVmLCBidWZfc2l6ZSAqIDgpOworCisgICAgdGMgPSBhdmN0eC0+dGltZWNvZGVfZnJhbWVfc3RhcnQgPSBnZXRfYml0cygmcy0+Z2IsIDI1KTsKKworICAgIHMtPmNsb3NlZF9nb3AgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAvKiBicm9rZW5fbGluayBpbmRpY2F0ZSB0aGF0IGFmdGVyIGVkaXRpbmcgdGhlCisgICAgICogcmVmZXJlbmNlIGZyYW1lcyBvZiB0aGUgZmlyc3QgQi1GcmFtZXMgYWZ0ZXIgR09QIEktRnJhbWUKKyAgICAgKiBhcmUgbWlzc2luZyAob3BlbiBnb3ApICovCisgICAgYnJva2VuX2xpbmsgPSBnZXRfYml0czEoJnMtPmdiKTsKKworICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pIHsKKyAgICAgICAgY2hhciB0Y2J1ZltBVl9USU1FQ09ERV9TVFJfU0laRV07CisgICAgICAgIGF2X3RpbWVjb2RlX21ha2VfbXBlZ190Y19zdHJpbmcodGNidWYsIHRjKTsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiR09QICglcykgY2xvc2VkX2dvcD0lZCBicm9rZW5fbGluaz0lZFxuIiwKKyAgICAgICAgICAgICAgIHRjYnVmLCBzLT5jbG9zZWRfZ29wLCBicm9rZW5fbGluayk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9jaHVua3MoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X291dHB1dCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgTXBlZzFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqczIgPSAmcy0+bXBlZ19lbmNfY3R4OworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9wdHIgPSBidWY7CisgICAgY29uc3QgdWludDhfdCAqYnVmX2VuZCA9IGJ1ZiArIGJ1Zl9zaXplOworICAgIGludCByZXQsIGlucHV0X3NpemU7CisgICAgaW50IGxhc3RfY29kZSA9IDAsIHNraXBfZnJhbWUgPSAwOworICAgIGludCBwaWN0dXJlX3N0YXJ0X2NvZGVfc2VlbiA9IDA7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIGZpbmQgbmV4dCBzdGFydCBjb2RlICovCisgICAgICAgIHVpbnQzMl90IHN0YXJ0X2NvZGUgPSAtMTsKKyAgICAgICAgYnVmX3B0ciA9IGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUoYnVmX3B0ciwgYnVmX2VuZCwgJnN0YXJ0X2NvZGUpOworICAgICAgICBpZiAoc3RhcnRfY29kZSA+IDB4MWZmKSB7CisgICAgICAgICAgICBpZiAoIXNraXBfZnJhbWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoSEFWRV9USFJFQURTICYmCisgICAgICAgICAgICAgICAgICAgIChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKSAmJgorICAgICAgICAgICAgICAgICAgICAhYXZjdHgtPmh3YWNjZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZjdHgtPnRocmVhZF9jb3VudCA+IDEpOworCisgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5leGVjdXRlKGF2Y3R4LCBzbGljZV9kZWNvZGVfdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmczItPnRocmVhZF9jb250ZXh0WzBdLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zbGljZV9jb3VudCwgc2l6ZW9mKHZvaWQgKikpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c2xpY2VfY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHMyLT5lci5lcnJvcl9jb3VudCArPSBzMi0+dGhyZWFkX2NvbnRleHRbaV0tPmVyLmVycm9yX2NvdW50OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoQ09ORklHX01QRUdfVkRQQVVfREVDT0RFUiB8fCBDT05GSUdfTVBFRzFfVkRQQVVfREVDT0RFUikKKyAgICAgICAgICAgICAgICAgICAgJiYgdXNlc192ZHBhdShhdmN0eCkpCisgICAgICAgICAgICAgICAgICAgIGZmX3ZkcGF1X21wZWdfcGljdHVyZV9jb21wbGV0ZShzMiwgYnVmLCBidWZfc2l6ZSwgcy0+c2xpY2VfY291bnQpOworCisgICAgICAgICAgICAgICAgcmV0ID0gc2xpY2VfZW5kKGF2Y3R4LCBwaWN0dXJlKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1lcmdlIHdpdGggdGhlIHN0dWZmIGluIG1wZWdfZGVjb2RlX3NsaWNlCisgICAgICAgICAgICAgICAgICAgIGlmIChzMi0+bGFzdF9waWN0dXJlX3B0ciB8fCBzMi0+bG93X2RlbGF5KQorICAgICAgICAgICAgICAgICAgICAgICAgKmdvdF9vdXRwdXQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMyLT5waWN0X3R5cGUgPSAwOworCisgICAgICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUgJiYgczItPmVyLmVycm9yX2NvdW50KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICByZXR1cm4gRkZNQVgoMCwgYnVmX3B0ciAtIGJ1ZiAtIHMyLT5wYXJzZV9jb250ZXh0Lmxhc3RfaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgaW5wdXRfc2l6ZSA9IGJ1Zl9lbmQgLSBidWZfcHRyOworCisgICAgICAgIGlmIChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19TVEFSVENPREUpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiUzIlBSSVgzMiIgYXQgJSJQVFJESUZGX1NQRUNJRklFUiIgbGVmdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzdGFydF9jb2RlLCBidWZfcHRyIC0gYnVmLCBpbnB1dF9zaXplKTsKKworICAgICAgICAvKiBwcmVwYXJlIGRhdGEgZm9yIG5leHQgc3RhcnQgY29kZSAqLworICAgICAgICBzd2l0Y2ggKHN0YXJ0X2NvZGUpIHsKKyAgICAgICAgY2FzZSBTRVFfU1RBUlRfQ09ERToKKyAgICAgICAgICAgIGlmIChsYXN0X2NvZGUgPT0gMCkgeworICAgICAgICAgICAgICAgIG1wZWcxX2RlY29kZV9zZXF1ZW5jZShhdmN0eCwgYnVmX3B0ciwgaW5wdXRfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZiAhPSBhdmN0eC0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgICAgICAgICBzLT5zeW5jID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmluZyBTRVFfU1RBUlRfQ09ERSBhZnRlciAlWFxuIiwgbGFzdF9jb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQSUNUVVJFX1NUQVJUX0NPREU6CisgICAgICAgICAgICBpZiAocGljdHVyZV9zdGFydF9jb2RlX3NlZW4gJiYgczItPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpIHsKKyAgICAgICAgICAgICAgIC8qIElmIGl0J3MgYSBmcmFtZSBwaWN0dXJlLCB0aGVyZSBjYW4ndCBiZSBtb3JlIHRoYW4gb25lIHBpY3R1cmUgaGVhZGVyLgorICAgICAgICAgICAgICAgICAgWWV0LCBpdCBkb2VzIGhhcHBlbiBhbmQgd2UgbmVlZCB0byBoYW5kbGUgaXQuICovCisgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiaWdub3JpbmcgZXh0cmEgcGljdHVyZSBmb2xsb3dpbmcgYSBmcmFtZS1waWN0dXJlXG4iKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGljdHVyZV9zdGFydF9jb2RlX3NlZW4gPSAxOworCisgICAgICAgICAgICBpZiAoczItPndpZHRoIDw9IDAgfHwgczItPmhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGZyYW1lIGRpbWVuc2lvbnMgJWR4JWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzMi0+d2lkdGgsIHMyLT5oZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocy0+dG1wZ2V4cyl7CisgICAgICAgICAgICAgICAgczItPmludHJhX2RjX3ByZWNpc2lvbj0gMzsKKyAgICAgICAgICAgICAgICBzMi0+aW50cmFfbWF0cml4WzBdPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBVkVfVEhSRUFEUyAmJiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9TTElDRSkgJiYKKyAgICAgICAgICAgICAgICAhYXZjdHgtPmh3YWNjZWwgJiYgcy0+c2xpY2VfY291bnQpIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgIGF2Y3R4LT5leGVjdXRlKGF2Y3R4LCBzbGljZV9kZWNvZGVfdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMyLT50aHJlYWRfY29udGV4dCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zbGljZV9jb3VudCwgc2l6ZW9mKHZvaWQgKikpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zbGljZV9jb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzMi0+ZXIuZXJyb3JfY291bnQgKz0gczItPnRocmVhZF9jb250ZXh0W2ldLT5lci5lcnJvcl9jb3VudDsKKyAgICAgICAgICAgICAgICBzLT5zbGljZV9jb3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdF9jb2RlID09IDAgfHwgbGFzdF9jb2RlID09IFNMSUNFX01JTl9TVEFSVF9DT0RFKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gbXBlZ19kZWNvZGVfcG9zdGluaXQoYXZjdHgpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1wZWdfZGVjb2RlX3Bvc3Rpbml0KCkgZmFpbHVyZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBhIGNvbXBsZXRlIGltYWdlOiB3ZSB0cnkgdG8gZGVjb21wcmVzcyBpdC4gKi8KKyAgICAgICAgICAgICAgICBpZiAobXBlZzFfZGVjb2RlX3BpY3R1cmUoYXZjdHgsIGJ1Zl9wdHIsIGlucHV0X3NpemUpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgczItPnBpY3RfdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgcy0+Zmlyc3Rfc2xpY2UgPSAxOworICAgICAgICAgICAgICAgIGxhc3RfY29kZSAgICAgID0gUElDVFVSRV9TVEFSVF9DT0RFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yaW5nIHBpYyBhZnRlciAlWFxuIiwgbGFzdF9jb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVhUX1NUQVJUX0NPREU6CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZzMi0+Z2IsIGJ1Zl9wdHIsIGlucHV0X3NpemUgKiA4KTsKKworICAgICAgICAgICAgc3dpdGNoIChnZXRfYml0cygmczItPmdiLCA0KSkgeworICAgICAgICAgICAgY2FzZSAweDE6CisgICAgICAgICAgICAgICAgaWYgKGxhc3RfY29kZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1wZWdfZGVjb2RlX3NlcXVlbmNlX2V4dGVuc2lvbihzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmluZyBzZXEgZXh0IGFmdGVyICVYXG4iLCBsYXN0X2NvZGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MjoKKyAgICAgICAgICAgICAgICBtcGVnX2RlY29kZV9zZXF1ZW5jZV9kaXNwbGF5X2V4dGVuc2lvbihzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgzOgorICAgICAgICAgICAgICAgIG1wZWdfZGVjb2RlX3F1YW50X21hdHJpeF9leHRlbnNpb24oczIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDc6CisgICAgICAgICAgICAgICAgbXBlZ19kZWNvZGVfcGljdHVyZV9kaXNwbGF5X2V4dGVuc2lvbihzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg4OgorICAgICAgICAgICAgICAgIGlmIChsYXN0X2NvZGUgPT0gUElDVFVSRV9TVEFSVF9DT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIG1wZWdfZGVjb2RlX3BpY3R1cmVfY29kaW5nX2V4dGVuc2lvbihzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmluZyBwaWMgY29kIGV4dCBhZnRlciAlWFxuIiwgbGFzdF9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVVNFUl9TVEFSVF9DT0RFOgorICAgICAgICAgICAgbXBlZ19kZWNvZGVfdXNlcl9kYXRhKGF2Y3R4LCBidWZfcHRyLCBpbnB1dF9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdPUF9TVEFSVF9DT0RFOgorICAgICAgICAgICAgaWYgKGxhc3RfY29kZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgczItPmZpcnN0X2ZpZWxkID0gMDsKKyAgICAgICAgICAgICAgICBtcGVnX2RlY29kZV9nb3AoYXZjdHgsIGJ1Zl9wdHIsIGlucHV0X3NpemUpOworICAgICAgICAgICAgICAgIHMtPnN5bmMgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yaW5nIEdPUF9TVEFSVF9DT0RFIGFmdGVyICVYXG4iLCBsYXN0X2NvZGUpOworICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChzdGFydF9jb2RlID49IFNMSUNFX01JTl9TVEFSVF9DT0RFICYmCisgICAgICAgICAgICAgICAgc3RhcnRfY29kZSA8PSBTTElDRV9NQVhfU1RBUlRfQ09ERSAmJiBsYXN0X2NvZGUgPT0gUElDVFVSRV9TVEFSVF9DT0RFKSB7CisgICAgICAgICAgICAgICAgaWYgKHMyLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSAmJiAhczItPnByb2dyZXNzaXZlX2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIHMyLT5wcm9ncmVzc2l2ZV9mcmFtZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzMi0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmxhY2VkIGZyYW1lIGluIHByb2dyZXNzaXZlIHNlcXVlbmNlLCBpZ25vcmluZ1xuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHMyLT5waWN0dXJlX3N0cnVjdHVyZSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIChzMi0+cHJvZ3Jlc3NpdmVfZnJhbWUgJiYgczItPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUUpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzMi0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaWN0dXJlX3N0cnVjdHVyZSAlZCBpbnZhbGlkLCBpZ25vcmluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMyLT5waWN0dXJlX3N0cnVjdHVyZSk7CisgICAgICAgICAgICAgICAgICAgIHMyLT5waWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfRlJBTUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHMyLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSAmJiAhczItPmZyYW1lX3ByZWRfZnJhbWVfZGN0KQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coczItPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgImludmFsaWQgZnJhbWVfcHJlZF9mcmFtZV9kY3RcbiIpOworCisgICAgICAgICAgICAgICAgaWYgKHMyLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgICAgIHMyLT5maXJzdF9maWVsZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMyLT52X2VkZ2VfcG9zICA9IDE2ICogczItPm1iX2hlaWdodDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzMi0+Zmlyc3RfZmllbGQgXj0gMTsKKyAgICAgICAgICAgICAgICAgICAgczItPnZfZWRnZV9wb3MgICA9IDggKiBzMi0+bWJfaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoczItPm1ic2tpcF90YWJsZSwgMCwgczItPm1iX3N0cmlkZSAqIHMyLT5tYl9oZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFydF9jb2RlID49IFNMSUNFX01JTl9TVEFSVF9DT0RFICYmCisgICAgICAgICAgICAgICAgc3RhcnRfY29kZSA8PSBTTElDRV9NQVhfU1RBUlRfQ09ERSAmJiBsYXN0X2NvZGUgIT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBmaWVsZF9waWMgPSBzMi0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRTsKKyAgICAgICAgICAgICAgICBpbnQgbWJfeSA9IHN0YXJ0X2NvZGUgLSBTTElDRV9NSU5fU1RBUlRfQ09ERTsKKyAgICAgICAgICAgICAgICBsYXN0X2NvZGUgPSBTTElDRV9NSU5fU1RBUlRfQ09ERTsKKyAgICAgICAgICAgICAgICBpZiAoczItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QRUcxVklERU8gJiYgczItPm1iX2hlaWdodCA+IDI4MDAvMTYpCisgICAgICAgICAgICAgICAgICAgIG1iX3kgKz0gKCpidWZfcHRyJjB4RTApPDwyOworCisgICAgICAgICAgICAgICAgbWJfeSA8PD0gZmllbGRfcGljOworICAgICAgICAgICAgICAgIGlmIChzMi0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpCisgICAgICAgICAgICAgICAgICAgIG1iX3krKzsKKworICAgICAgICAgICAgICAgIGlmIChidWZfZW5kIC0gYnVmX3B0ciA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMyLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic2xpY2UgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1iX3kgPj0gczItPm1iX2hlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coczItPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic2xpY2UgYmVsb3cgaW1hZ2UgKCVkID49ICVkKVxuIiwgbWJfeSwgczItPm1iX2hlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghczItPmxhc3RfcGljdHVyZV9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU2tpcCBCLWZyYW1lcyBpZiB3ZSBkbyBub3QgaGF2ZSByZWZlcmVuY2UgZnJhbWVzIGFuZAorICAgICAgICAgICAgICAgICAgICAgKiBHT1AgaXMgbm90IGNsb3NlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMyLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghczItPmNsb3NlZF9nb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2ZyYW1lID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoczItPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSB8fCAoczItPmZsYWdzMiAmIENPREVDX0ZMQUcyX1NIT1dfQUxMKSkKKyAgICAgICAgICAgICAgICAgICAgcy0+c3luYyA9IDE7CisgICAgICAgICAgICAgICAgaWYgKCFzMi0+bmV4dF9waWN0dXJlX3B0cikgeworICAgICAgICAgICAgICAgICAgICAvKiBTa2lwIFAtZnJhbWVzIGlmIHdlIGRvIG5vdCBoYXZlIGEgcmVmZXJlbmNlIGZyYW1lIG9yCisgICAgICAgICAgICAgICAgICAgICAqIHdlIGhhdmUgYW4gaW52YWxpZCBoZWFkZXIuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzMi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QICYmICFzLT5zeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2ZyYW1lID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiAmJgorICAgICAgICAgICAgICAgICAgICAgczItPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgfHwKKyAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9OT05LRVkgJiYKKyAgICAgICAgICAgICAgICAgICAgIHMyLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHx8CisgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9BTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9mcmFtZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghcy0+bXBlZ19lbmNfY3R4X2FsbG9jYXRlZCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAoczItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3kgPCBhdmN0eC0+c2tpcF90b3AgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1iX3kgPj0gczItPm1iX2hlaWdodCAtIGF2Y3R4LT5za2lwX2JvdHRvbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghczItPnBpY3RfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgcGljdHVyZSBzdGFydCBjb2RlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzLT5maXJzdF9zbGljZSkgeworICAgICAgICAgICAgICAgICAgICBza2lwX2ZyYW1lICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPmZpcnN0X3NsaWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBtcGVnX2ZpZWxkX3N0YXJ0KHMyLCBidWYsIGJ1Zl9zaXplKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFzMi0+Y3VycmVudF9waWN0dXJlX3B0cikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50X3BpY3R1cmUgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHVzZXNfdmRwYXUoYXZjdHgpKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnNsaWNlX2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChIQVZFX1RIUkVBRFMgJiYKKyAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpICYmCisgICAgICAgICAgICAgICAgICAgICFhdmN0eC0+aHdhY2NlbCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNob2xkID0gKHMyLT5tYl9oZWlnaHQgKiBzLT5zbGljZV9jb3VudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczItPnNsaWNlX2NvbnRleHRfY291bnQgLyAyKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMi0+c2xpY2VfY29udGV4dF9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChhdmN0eC0+dGhyZWFkX2NvdW50ID4gMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlc2hvbGQgPD0gbWJfeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTXBlZ0VuY0NvbnRleHQgKnRocmVhZF9jb250ZXh0ID0gczItPnRocmVhZF9jb250ZXh0W3MtPnNsaWNlX2NvdW50XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2NvbnRleHQtPnN0YXJ0X21iX3kgPSBtYl95OworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2NvbnRleHQtPmVuZF9tYl95ICAgPSBzMi0+bWJfaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnNsaWNlX2NvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgczItPnRocmVhZF9jb250ZXh0W3MtPnNsaWNlX2NvdW50IC0gMV0tPmVuZF9tYl95ID0gbWJfeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBmZl91cGRhdGVfZHVwbGljYXRlX2NvbnRleHQodGhyZWFkX2NvbnRleHQsIHMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJnRocmVhZF9jb250ZXh0LT5nYiwgYnVmX3B0ciwgaW5wdXRfc2l6ZSAqIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2xpY2VfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBidWZfcHRyICs9IDI7IC8vIEZJWE1FIGFkZCBtaW5pbXVtIG51bWJlciBvZiBieXRlcyBwZXIgc2xpY2UKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBtcGVnX2RlY29kZV9zbGljZShzMiwgbWJfeSwgJmJ1Zl9wdHIsIGlucHV0X3NpemUpOworICAgICAgICAgICAgICAgICAgICBlbW1zX2MoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoczItPnJlc3luY19tYl94ID49IDAgJiYgczItPnJlc3luY19tYl95ID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfZXJfYWRkX3NsaWNlKCZzMi0+ZXIsIHMyLT5yZXN5bmNfbWJfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczItPnJlc3luY19tYl95LCBzMi0+bWJfeCwgczItPm1iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSX0FDX0VSUk9SIHwgRVJfRENfRVJST1IgfCBFUl9NVl9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmZl9lcl9hZGRfc2xpY2UoJnMyLT5lciwgczItPnJlc3luY19tYl94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMyLT5yZXN5bmNfbWJfeSwgczItPm1iX3ggLSAxLCBzMi0+bWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUl9BQ19FTkQgfCBFUl9EQ19FTkQgfCBFUl9NVl9FTkQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbXBlZ19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9vdXRwdXQsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgcmV0OworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIE1wZWcxQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqcGljdHVyZSA9IGRhdGE7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMyID0gJnMtPm1wZWdfZW5jX2N0eDsKKworICAgIGlmIChidWZfc2l6ZSA9PSAwIHx8IChidWZfc2l6ZSA9PSA0ICYmIEFWX1JCMzIoYnVmKSA9PSBTRVFfRU5EX0NPREUpKSB7CisgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgbGFzdCBwaWN0dXJlICovCisgICAgICAgIGlmIChzMi0+bG93X2RlbGF5ID09IDAgJiYgczItPm5leHRfcGljdHVyZV9wdHIpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBhdl9mcmFtZV9yZWYocGljdHVyZSwgczItPm5leHRfcGljdHVyZV9wdHItPmYpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgczItPm5leHRfcGljdHVyZV9wdHIgPSBOVUxMOworCisgICAgICAgICAgICAqZ290X291dHB1dCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKworICAgIGlmIChzMi0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1RSVU5DQVRFRCkgeworICAgICAgICBpbnQgbmV4dCA9IGZmX21wZWcxX2ZpbmRfZnJhbWVfZW5kKCZzMi0+cGFyc2VfY29udGV4dCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplLCBOVUxMKTsKKworICAgICAgICBpZiAoZmZfY29tYmluZV9mcmFtZSgmczItPnBhcnNlX2NvbnRleHQsIG5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICoqKSAmYnVmLCAmYnVmX3NpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisKKyAgICBzMi0+Y29kZWNfdGFnID0gYXZwcml2X3RvdXBwZXI0KGF2Y3R4LT5jb2RlY190YWcpOworICAgIGlmIChzLT5tcGVnX2VuY19jdHhfYWxsb2NhdGVkID09IDAgJiYgKCAgIHMyLT5jb2RlY190YWcgPT0gQVZfUkwzMigiVkNSMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgczItPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJCVzEwIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgIHZjcjJfaW5pdF9zZXF1ZW5jZShhdmN0eCk7CisKKyAgICBzLT5zbGljZV9jb3VudCA9IDA7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YSAmJiAhcy0+ZXh0cmFkYXRhX2RlY29kZWQpIHsKKyAgICAgICAgcmV0ID0gZGVjb2RlX2NodW5rcyhhdmN0eCwgcGljdHVyZSwgZ290X291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBpZiAoKmdvdF9vdXRwdXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGljdHVyZSBpbiBleHRyYWRhdGFcbiIpOworICAgICAgICAgICAgKmdvdF9vdXRwdXQgPSAwOworICAgICAgICB9CisgICAgICAgIHMtPmV4dHJhZGF0YV9kZWNvZGVkID0gMTsKKyAgICAgICAgaWYgKHJldCA8IDAgJiYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkgeworICAgICAgICAgICAgczItPmN1cnJlbnRfcGljdHVyZV9wdHIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IGRlY29kZV9jaHVua3MoYXZjdHgsIHBpY3R1cmUsIGdvdF9vdXRwdXQsIGJ1ZiwgYnVmX3NpemUpOworICAgIGlmIChyZXQ8MCB8fCAqZ290X291dHB1dCkKKyAgICAgICAgczItPmN1cnJlbnRfcGljdHVyZV9wdHIgPSBOVUxMOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1wZWcxQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5zeW5jICAgICAgID0gMDsKKworICAgIGZmX21wZWdfZmx1c2goYXZjdHgpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbXBlZ19kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNcGVnMUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKHMtPm1wZWdfZW5jX2N0eF9hbGxvY2F0ZWQpCisgICAgICAgIGZmX21wdl9jb21tb25fZW5kKCZzLT5tcGVnX2VuY19jdHgpOworICAgIGF2X2ZyZWVwKCZzLT5hNTNfY2FwdGlvbik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVlByb2ZpbGUgbXBlZzJfdmlkZW9fcHJvZmlsZXNbXSA9IHsKKyAgICB7IEZGX1BST0ZJTEVfTVBFRzJfNDIyLCAgICAgICAgICAiNDoyOjIiICAgICAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9NUEVHMl9ISUdILCAgICAgICAgICJIaWdoIiAgICAgICAgICAgICAgIH0sCisgICAgeyBGRl9QUk9GSUxFX01QRUcyX1NTLCAgICAgICAgICAgIlNwYXRpYWxseSBTY2FsYWJsZSIgfSwKKyAgICB7IEZGX1BST0ZJTEVfTVBFRzJfU05SX1NDQUxBQkxFLCAiU05SIFNjYWxhYmxlIiAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9NUEVHMl9NQUlOLCAgICAgICAgICJNYWluIiAgICAgICAgICAgICAgIH0sCisgICAgeyBGRl9QUk9GSUxFX01QRUcyX1NJTVBMRSwgICAgICAgIlNpbXBsZSIgICAgICAgICAgICAgfSwKKyAgICB7IEZGX1BST0ZJTEVfUkVTRVJWRUQsICAgICAgICAgICAiUmVzZXJ2ZWQiICAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9SRVNFUlZFRCwgICAgICAgICAgICJSZXNlcnZlZCIgICAgICAgICAgIH0sCisgICAgeyBGRl9QUk9GSUxFX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKK307CisKK0FWQ29kZWMgZmZfbXBlZzF2aWRlb19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAibXBlZzF2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTEgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2YoTXBlZzFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gbXBlZ19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICAgICAgID0gbXBlZ19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICAgICAgICAgPSBtcGVnX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IENPREVDX0NBUF9EUjEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfVFJVTkNBVEVEIHwgQ09ERUNfQ0FQX0RFTEFZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMsCisgICAgLmZsdXNoICAgICAgICAgICAgICAgICA9IGZsdXNoLAorICAgIC5tYXhfbG93cmVzICAgICAgICAgICAgPSAzLAorICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChtcGVnX2RlY29kZV91cGRhdGVfdGhyZWFkX2NvbnRleHQpCit9OworCitBVkNvZGVjIGZmX21wZWcydmlkZW9fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzJ2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctMiB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnMUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IG1wZWdfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gbXBlZ19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IG1wZWdfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBDT0RFQ19DQVBfRFIxIHwKKyAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfVFJVTkNBVEVEIHwgQ09ERUNfQ0FQX0RFTEFZIHwKKyAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUywKKyAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKKyAgICAubWF4X2xvd3JlcyAgICAgPSAzLAorICAgIC5wcm9maWxlcyAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKG1wZWcyX3ZpZGVvX3Byb2ZpbGVzKSwKK307CisKKy8vbGVnYWN5IGRlY29kZXIKK0FWQ29kZWMgZmZfbXBlZ3ZpZGVvX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wZWd2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctMSB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnMUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IG1wZWdfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gbXBlZ19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IG1wZWdfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX1RSVU5DQVRFRCB8IENPREVDX0NBUF9ERUxBWSB8IENPREVDX0NBUF9TTElDRV9USFJFQURTLAorICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAorICAgIC5tYXhfbG93cmVzICAgICA9IDMsCit9OworCisjaWYgRkZfQVBJX1hWTUMKKyNpZiBDT05GSUdfTVBFR19YVk1DX0RFQ09ERVIKK3N0YXRpYyBhdl9jb2xkIGludCBtcGVnX21jX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpZiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9TTElDRSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghKGF2Y3R4LT5zbGljZV9mbGFncyAmIFNMSUNFX0ZMQUdfQ09ERURfT1JERVIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCEoYXZjdHgtPnNsaWNlX2ZsYWdzICYgU0xJQ0VfRkxBR19BTExPV19GSUVMRCkpIHsKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgIm1wZWcxMi5jOiBYdk1DIGRlY29kZXIgd2lsbCB3b3JrIGJldHRlciBpZiBTTElDRV9GTEFHX0FMTE9XX0ZJRUxEIGlzIHNldFxuIik7CisgICAgfQorICAgIG1wZWdfZGVjb2RlX2luaXQoYXZjdHgpOworCisgICAgYXZjdHgtPnBpeF9mbXQgICAgICAgICAgID0gQVZfUElYX0ZNVF9YVk1DX01QRUcyX0lEQ1Q7CisgICAgYXZjdHgtPnh2bWNfYWNjZWxlcmF0aW9uID0gMjsgLy8gMiAtIHRoZSBibG9ja3MgYXJlIHBhY2tlZCEKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX21wZWdfeHZtY19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVndmlkZW9feHZtYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctMS8yIHZpZGVvIFh2TUMgKFgtVmlkZW8gTW90aW9uIENvbXBlbnNhdGlvbikiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFT19YVk1DLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnMUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IG1wZWdfbWNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gbXBlZ19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IG1wZWdfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBDT0RFQ19DQVBfRFIxIHwKKyAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfVFJVTkNBVEVEIHwgQ09ERUNfQ0FQX0hXQUNDRUwgfCBDT0RFQ19DQVBfREVMQVksCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCit9OworCisjZW5kaWYKKyNlbmRpZiAvKiBGRl9BUElfWFZNQyAqLworCisjaWYgQ09ORklHX01QRUdfVkRQQVVfREVDT0RFUgorQVZDb2RlYyBmZl9tcGVnX3ZkcGF1X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wZWd2aWRlb192ZHBhdSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctMS8yIHZpZGVvIChWRFBBVSBhY2NlbGVyYXRpb24pIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1wZWcxQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbXBlZ19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBtcGVnX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gbXBlZ19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9UUlVOQ0FURUQgfAorICAgICAgICAgICAgICAgICAgICAgIENPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVIHwgQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX01QRUcxX1ZEUEFVX0RFQ09ERVIKK0FWQ29kZWMgZmZfbXBlZzFfdmRwYXVfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzF2aWRlb192ZHBhdSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctMSB2aWRlbyAoVkRQQVUgYWNjZWxlcmF0aW9uKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnMUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IG1wZWdfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gbXBlZ19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IG1wZWdfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfVFJVTkNBVEVEIHwKKyAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVSB8IENPREVDX0NBUF9ERUxBWSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWcxMmVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZzEyZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5NWI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWcxMmVuYy5jCkBAIC0wLDAgKzEsMTE3NyBAQAorLyoKKyAqIE1QRUcxLzIgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNUEVHMS8yIGVuY29kZXIKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVjb2RlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3N0ZXJlbzNkLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtcGVnMTIuaCIKKyNpbmNsdWRlICJtcGVnMTJkYXRhLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW52X25vbl9saW5lYXJfcXNjYWxlW10gPSB7CisgICAgMCwgMiwgNCwgNiwgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzdmNkX3NjYW5fb2Zmc2V0X3BsYWNlaG9sZGVyW10gPSB7CisgICAgMHgxMCwgMHgwRSwgMHgwMCwgMHg4MCwgMHg4MSwgMHgwMCwgMHg4MCwKKyAgICAweDgxLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorfTsKKworc3RhdGljIHVpbnQ4X3QgbXZfcGVuYWx0eVtNQVhfRkNPREUgKyAxXVtNQVhfTVYgKiAyICsgMV07CitzdGF0aWMgdWludDhfdCBmY29kZV90YWJbTUFYX01WICogMiArIDFdOworCitzdGF0aWMgdWludDhfdCB1bmlfbXBlZzFfYWNfdmxjX2xlbls2NCAqIDY0ICogMl07CitzdGF0aWMgdWludDhfdCB1bmlfbXBlZzJfYWNfdmxjX2xlbls2NCAqIDY0ICogMl07CisKKy8qIHNpbXBsZSBpbmNsdWRlIGV2ZXJ5dGhpbmcgdGFibGUgZm9yIGRjLCBmaXJzdCBieXRlIGlzIGJpdHMKKyAqIG51bWJlciBuZXh0IDMgYXJlIGNvZGUgKi8KK3N0YXRpYyB1aW50MzJfdCBtcGVnMV9sdW1fZGNfdW5pWzUxMl07CitzdGF0aWMgdWludDMyX3QgbXBlZzFfY2hyX2RjX3VuaVs1MTJdOworCitzdGF0aWMgdWludDhfdCBtcGVnMV9pbmRleF9ydW5bMl1bNjRdOworc3RhdGljIGludDhfdCAgbXBlZzFfbWF4X2xldmVsWzJdWzY0XTsKKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X3VuaV9hY192bGMoUkxUYWJsZSAqcmwsIHVpbnQ4X3QgKnVuaV9hY192bGNfbGVuKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgIGludCBsZXZlbCA9IGkgLSA2NDsKKyAgICAgICAgaW50IHJ1bjsKKyAgICAgICAgaWYgKCFsZXZlbCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKHJ1biA9IDA7IHJ1biA8IDY0OyBydW4rKykgeworICAgICAgICAgICAgaW50IGxlbiwgY29kZTsKKyAgICAgICAgICAgIGludCBhbGV2ZWwgPSBGRkFCUyhsZXZlbCk7CisKKyAgICAgICAgICAgIGlmIChhbGV2ZWwgPiBybC0+bWF4X2xldmVsWzBdW3J1bl0pCisgICAgICAgICAgICAgICAgY29kZSA9IDExMTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmwtPm4gKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb2RlID0gcmwtPmluZGV4X3J1blswXVtydW5dICsgYWxldmVsIC0gMTsKKworICAgICAgICAgICAgaWYgKGNvZGUgPCAxMTEpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJsLT5uICovCisgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIFZMQyBhbmQgc2lnbiAqLworICAgICAgICAgICAgICAgIGxlbiA9IHJsLT50YWJsZV92bGNbY29kZV1bMV0gKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBybC0+dGFibGVfdmxjWzExMSAvKiBybC0+biAqL11bMV0gKyA2OworCisgICAgICAgICAgICAgICAgaWYgKGFsZXZlbCA8IDEyOCkKKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IDg7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsZW4gKz0gMTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVuaV9hY192bGNfbGVuW1VOSV9BQ19FTkNfSU5ERVgocnVuLCBpKV0gPSBsZW47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmluZF9mcmFtZV9yYXRlX2luZGV4KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIEFWUmF0aW9uYWwgYmVzdHEgPSAoQVZSYXRpb25hbCkgezAsIDB9OworICAgIEFWUmF0aW9uYWwgZXh0OworICAgIEFWUmF0aW9uYWwgdGFyZ2V0ID0gYXZfaW52X3Eocy0+YXZjdHgtPnRpbWVfYmFzZSk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTQ7IGkrKykgeworICAgICAgICBpZiAocy0+YXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfVU5PRkZJQ0lBTCAmJgorICAgICAgICAgICAgaSA+PSA5KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZm9yIChleHQubnVtPTE7IGV4dC5udW0gPD0gNDsgZXh0Lm51bSsrKSB7CisgICAgICAgICAgICBmb3IgKGV4dC5kZW49MTsgZXh0LmRlbiA8PSAzMjsgZXh0LmRlbisrKSB7CisgICAgICAgICAgICAgICAgQVZSYXRpb25hbCBxID0gYXZfbXVsX3EoZXh0LCBmZl9tcGVnMTJfZnJhbWVfcmF0ZV90YWJbaV0pOworCisgICAgICAgICAgICAgICAgaWYgKHMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYgKGV4dC5kZW4hPTEgfHwgZXh0Lm51bSE9MSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChhdl9nY2QoZXh0LmRlbiwgZXh0Lm51bSkgIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAoICAgIGJlc3RxLm51bT09MAorICAgICAgICAgICAgICAgICAgICB8fCBhdl9uZWFyZXJfcSh0YXJnZXQsIGJlc3RxLCBxKSA8IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgZXh0Lm51bT09MSAmJiBleHQuZGVuPT0xICYmIGF2X25lYXJlcl9xKHRhcmdldCwgYmVzdHEsIHEpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYmVzdHEgICAgICAgICAgICAgICA9IHE7CisgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lX3JhdGVfaW5kZXggPSBpOworICAgICAgICAgICAgICAgICAgICBzLT5tcGVnMl9mcmFtZV9yYXRlX2V4dC5udW0gPSBleHQubnVtOworICAgICAgICAgICAgICAgICAgICBzLT5tcGVnMl9mcmFtZV9yYXRlX2V4dC5kZW4gPSBleHQuZGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdl9jbXBfcSh0YXJnZXQsIGJlc3RxKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPICYmIGF2Y3R4LT5oZWlnaHQgPiAyODAwKQorICAgICAgICBhdmN0eC0+dGhyZWFkX2NvdW50ID0gMTsKKworICAgIGlmIChmZl9tcHZfZW5jb2RlX2luaXQoYXZjdHgpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGZpbmRfZnJhbWVfcmF0ZV9pbmRleChzKSA8IDApIHsKKyAgICAgICAgaWYgKHMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1QRUcxLzIgZG9lcyBub3Qgc3VwcG9ydCAlZC8lZCBmcHNcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnRpbWVfYmFzZS5kZW4sIGF2Y3R4LT50aW1lX2Jhc2UubnVtKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgIk1QRUcxLzIgZG9lcyBub3Qgc3VwcG9ydCAlZC8lZCBmcHMsIHRoZXJlIG1heSBiZSBBViBzeW5jIGlzc3Vlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+dGltZV9iYXNlLmRlbiwgYXZjdHgtPnRpbWVfYmFzZS5udW0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5wcm9maWxlID09IEZGX1BST0ZJTEVfVU5LTk9XTikgeworICAgICAgICBpZiAoYXZjdHgtPmxldmVsICE9IEZGX0xFVkVMX1VOS05PV04pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2V0IHByb2ZpbGUgYW5kIGxldmVsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvKiBNYWluIG9yIDQ6MjoyICovCisgICAgICAgIGF2Y3R4LT5wcm9maWxlID0gcy0+Y2hyb21hX2Zvcm1hdCA9PSBDSFJPTUFfNDIwID8gNCA6IDA7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5sZXZlbCA9PSBGRl9MRVZFTF9VTktOT1dOKSB7CisgICAgICAgIGlmIChhdmN0eC0+cHJvZmlsZSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgLyogNDoyOjIgKi8KKyAgICAgICAgICAgIGlmIChhdmN0eC0+d2lkdGggPD0gNzIwICYmIGF2Y3R4LT5oZWlnaHQgPD0gNjA4KQorICAgICAgICAgICAgICAgIGF2Y3R4LT5sZXZlbCA9IDU7ICAgICAgICAgICAgICAgICAgIC8qIE1haW4gKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdmN0eC0+bGV2ZWwgPSAyOyAgICAgICAgICAgICAgICAgICAvKiBIaWdoICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPnByb2ZpbGUgIT0gMSAmJiBzLT5jaHJvbWFfZm9ybWF0ICE9IENIUk9NQV80MjApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgSGlnaCgxKSBhbmQgNDoyOjIoMCkgcHJvZmlsZXMgc3VwcG9ydCA0OjI6MiBjb2xvciBzYW1wbGluZ1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF2Y3R4LT53aWR0aCA8PSA3MjAgJiYgYXZjdHgtPmhlaWdodCA8PSA1NzYpCisgICAgICAgICAgICAgICAgYXZjdHgtPmxldmVsID0gODsgICAgICAgICAgICAgICAgICAgLyogTWFpbiAqLworICAgICAgICAgICAgZWxzZSBpZiAoYXZjdHgtPndpZHRoIDw9IDE0NDApCisgICAgICAgICAgICAgICAgYXZjdHgtPmxldmVsID0gNjsgICAgICAgICAgICAgICAgICAgLyogSGlnaCAxNDQwICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZjdHgtPmxldmVsID0gNDsgICAgICAgICAgICAgICAgICAgLyogSGlnaCAqLworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChhdmN0eC0+d2lkdGggJiAweEZGRikgPT0gMCAmJiAoYXZjdHgtPmhlaWdodCAmIDB4RkZGKSA9PSAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiV2lkdGggLyBIZWlnaHQgaXMgaW52YWxpZCBmb3IgTVBFRzJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChzLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwpIHsKKyAgICAgICAgaWYgKChhdmN0eC0+d2lkdGggJiAweEZGRikgPT0gMCB8fCAoYXZjdHgtPmhlaWdodCAmIDB4RkZGKSA9PSAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIldpZHRoIG9yIEhlaWdodCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgbXVsdGlwbGVzIG9mIDQwOTZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkICctc3RyaWN0ICVkJyBpZiB5b3Ugd2FudCB0byB1c2UgdGhlbSBhbnl3YXkuXG4iLCBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmRyb3BfZnJhbWVfdGltZWNvZGUgPSBzLT5kcm9wX2ZyYW1lX3RpbWVjb2RlIHx8ICEhKGF2Y3R4LT5mbGFnczIgJiBDT0RFQ19GTEFHMl9EUk9QX0ZSQU1FX1RJTUVDT0RFKTsKKyAgICBpZiAocy0+ZHJvcF9mcmFtZV90aW1lY29kZSkKKyAgICAgICAgcy0+dGMuZmxhZ3MgfD0gQVZfVElNRUNPREVfRkxBR19EUk9QRlJBTUU7CisgICAgaWYgKHMtPmRyb3BfZnJhbWVfdGltZWNvZGUgJiYgcy0+ZnJhbWVfcmF0ZV9pbmRleCAhPSA0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkRyb3AgZnJhbWUgdGltZSBjb2RlIG9ubHkgYWxsb3dlZCB3aXRoIDEwMDEvMzAwMDAgZnBzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT50Y19vcHRfc3RyKSB7CisgICAgICAgIEFWUmF0aW9uYWwgcmF0ZSA9IGZmX21wZWcxMl9mcmFtZV9yYXRlX3RhYltzLT5mcmFtZV9yYXRlX2luZGV4XTsKKyAgICAgICAgaW50IHJldCA9IGF2X3RpbWVjb2RlX2luaXRfZnJvbV9zdHJpbmcoJnMtPnRjLCByYXRlLCBzLT50Y19vcHRfc3RyLCBzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBzLT5kcm9wX2ZyYW1lX3RpbWVjb2RlID0gISEocy0+dGMuZmxhZ3MgJiBBVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRSk7CisgICAgICAgIHMtPmF2Y3R4LT50aW1lY29kZV9mcmFtZV9zdGFydCA9IHMtPnRjLnN0YXJ0OworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmF2Y3R4LT50aW1lY29kZV9mcmFtZV9zdGFydCA9IDA7IC8vIGRlZmF1bHQgaXMgLTEKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBoZWFkZXIpCit7CisgICAgYXZwcml2X2FsaWduX3B1dF9iaXRzKCZzLT5wYik7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgaGVhZGVyID4+IDE2KTsKKyAgICBwdXRfc2JpdHMoJnMtPnBiLCAxNiwgaGVhZGVyKTsKK30KKworLyogcHV0IHNlcXVlbmNlIGhlYWRlciBpZiBuZWVkZWQgKi8KK3N0YXRpYyB2b2lkIG1wZWcxX2VuY29kZV9zZXF1ZW5jZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgdW5zaWduZWQgaW50IHZidl9idWZmZXJfc2l6ZSwgZnBzLCB2OworICAgIGludCBpLCBjb25zdHJhaW50X3BhcmFtZXRlcl9mbGFnOworICAgIHVpbnQ2NF90IHRpbWVfY29kZTsKKyAgICBpbnQ2NF90IGJlc3RfYXNwZWN0X2Vycm9yID0gSU5UNjRfTUFYOworICAgIEFWUmF0aW9uYWwgYXNwZWN0X3JhdGlvID0gcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisKKyAgICBpZiAoYXNwZWN0X3JhdGlvLm51bSA9PSAwIHx8IGFzcGVjdF9yYXRpby5kZW4gPT0gMCkKKyAgICAgICAgYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpezEsMX07ICAgICAgICAgICAgIC8vIHBpeGVsIGFzcGVjdCAxLjEgKFZHQSkKKworICAgIGlmIChzLT5jdXJyZW50X3BpY3R1cmUuZi0+a2V5X2ZyYW1lKSB7CisgICAgICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlID0gZmZfbXBlZzEyX2ZyYW1lX3JhdGVfdGFiW3MtPmZyYW1lX3JhdGVfaW5kZXhdOworCisgICAgICAgIC8qIG1wZWcxIGhlYWRlciByZXBlYXRlZCBldmVyeSBnb3AgKi8KKyAgICAgICAgcHV0X2hlYWRlcihzLCBTRVFfU1RBUlRfQ09ERSk7CisKKyAgICAgICAgcHV0X3NiaXRzKCZzLT5wYiwgMTIsIHMtPndpZHRoICAmIDB4RkZGKTsKKyAgICAgICAgcHV0X3NiaXRzKCZzLT5wYiwgMTIsIHMtPmhlaWdodCAmIDB4RkZGKTsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMTU7IGkrKykgeworICAgICAgICAgICAgaW50NjRfdCBlcnJvciA9IGFzcGVjdF9yYXRpby5udW0gKiAoMUxMPDwzMikgLyBhc3BlY3RfcmF0aW8uZGVuOworICAgICAgICAgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8gfHwgaSA8PSAxKQorICAgICAgICAgICAgICAgIGVycm9yIC09ICgxTEw8PDMyKSAvIGZmX21wZWcxX2FzcGVjdFtpXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlcnJvciAtPSAoMUxMPDwzMikqZmZfbXBlZzJfYXNwZWN0W2ldLm51bSAqIHMtPmhlaWdodCAvIHMtPndpZHRoIC8gZmZfbXBlZzJfYXNwZWN0W2ldLmRlbjsKKworICAgICAgICAgICAgZXJyb3IgPSBGRkFCUyhlcnJvcik7CisKKyAgICAgICAgICAgIGlmIChlcnJvciAtIDIgPD0gYmVzdF9hc3BlY3RfZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBiZXN0X2FzcGVjdF9lcnJvciAgICA9IGVycm9yOworICAgICAgICAgICAgICAgIHMtPmFzcGVjdF9yYXRpb19pbmZvID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgcy0+YXNwZWN0X3JhdGlvX2luZm8pOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDQsIHMtPmZyYW1lX3JhdGVfaW5kZXgpOworCisgICAgICAgIGlmIChzLT5hdmN0eC0+cmNfbWF4X3JhdGUpIHsKKyAgICAgICAgICAgIHYgPSAocy0+YXZjdHgtPnJjX21heF9yYXRlICsgMzk5KSAvIDQwMDsKKyAgICAgICAgICAgIGlmICh2ID4gMHgzZmZmZiAmJiBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPKQorICAgICAgICAgICAgICAgIHYgPSAweDNmZmZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdiA9IDB4M0ZGRkY7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+YXZjdHgtPnJjX2J1ZmZlcl9zaXplKQorICAgICAgICAgICAgdmJ2X2J1ZmZlcl9zaXplID0gcy0+YXZjdHgtPnJjX2J1ZmZlcl9zaXplOworICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiBWQlYgY2FsY3VsYXRpb246IFNjYWxlZCBzbyB0aGF0IGEgVkNEIGhhcyB0aGUgcHJvcGVyCisgICAgICAgICAgICAgKiBWQlYgc2l6ZSBvZiA0MCBraWxvYnl0ZXMgKi8KKyAgICAgICAgICAgIHZidl9idWZmZXJfc2l6ZSA9ICgoMjAgKiBzLT5iaXRfcmF0ZSkgLyAoMTE1MTkyOSAvIDIpKSAqIDggKiAxMDI0OworICAgICAgICB2YnZfYnVmZmVyX3NpemUgPSAodmJ2X2J1ZmZlcl9zaXplICsgMTYzODMpIC8gMTYzODQ7CisKKyAgICAgICAgcHV0X3NiaXRzKCZzLT5wYiwgMTgsIHYpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOyAgICAgICAgIC8vIG1hcmtlcgorICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCAxMCwgdmJ2X2J1ZmZlcl9zaXplKTsKKworICAgICAgICBjb25zdHJhaW50X3BhcmFtZXRlcl9mbGFnID0KKyAgICAgICAgICAgIHMtPndpZHRoICA8PSA3NjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgcy0+aGVpZ2h0IDw9IDU3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICBzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodCAgICAgICAgICAgICAgICAgPD0gMzk2ICAgJiYKKyAgICAgICAgICAgIHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0ICogZnJhbWVyYXRlLm51bSA8PSAzOTYgKiAyNSAqIGZyYW1lcmF0ZS5kZW4gJiYKKyAgICAgICAgICAgIGZyYW1lcmF0ZS5udW0gPD0gZnJhbWVyYXRlLmRlbiAqIDMwICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgcy0+YXZjdHgtPm1lX3JhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICBzLT5hdmN0eC0+bWVfcmFuZ2UgPCAxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgIHZidl9idWZmZXJfc2l6ZSA8PSAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgdiA8PSAxODU2MDAwIC8gNDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPOworCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgY29uc3RyYWludF9wYXJhbWV0ZXJfZmxhZyk7CisKKyAgICAgICAgZmZfd3JpdGVfcXVhbnRfbWF0cml4KCZzLT5wYiwgcy0+YXZjdHgtPmludHJhX21hdHJpeCk7CisgICAgICAgIGZmX3dyaXRlX3F1YW50X21hdHJpeCgmcy0+cGIsIHMtPmF2Y3R4LT5pbnRlcl9tYXRyaXgpOworCisgICAgICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CisgICAgICAgICAgICBBVkZyYW1lU2lkZURhdGEgKnNpZGVfZGF0YTsKKyAgICAgICAgICAgIGludCB3aWR0aCA9IHMtPndpZHRoOworICAgICAgICAgICAgaW50IGhlaWdodCA9IHMtPmhlaWdodDsKKyAgICAgICAgICAgIGludCB1c2Vfc2VxX2Rpc3BfZXh0OworCisgICAgICAgICAgICBwdXRfaGVhZGVyKHMsIEVYVF9TVEFSVF9DT0RFKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgMSk7ICAgICAgICAgICAgICAgICAvLyBzZXEgZXh0CisKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+YXZjdHgtPnByb2ZpbGUgPT0gMCk7IC8vIGVzY3ggMSBmb3IgNDoyOjIgcHJvZmlsZQorCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDMsIHMtPmF2Y3R4LT5wcm9maWxlKTsgLy8gcHJvZmlsZQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCBzLT5hdmN0eC0+bGV2ZWwpOyAgIC8vIGxldmVsCisKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UpOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBzLT5jaHJvbWFfZm9ybWF0KTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgcy0+d2lkdGggID4+IDEyKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgcy0+aGVpZ2h0ID4+IDEyKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMTIsIHYgPj4gMTgpOyAgICAgICAgICAvLyBiaXRyYXRlIGV4dAorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsgICAgICAgICAgICAgICAgIC8vIG1hcmtlcgorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCB2YnZfYnVmZmVyX3NpemUgPj4gMTApOyAvLyB2YnYgYnVmZmVyIGV4dAorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5sb3dfZGVsYXkpOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBzLT5tcGVnMl9mcmFtZV9yYXRlX2V4dC5udW0tMSk7IC8vIGZyYW1lX3JhdGVfZXh0X24KKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgcy0+bXBlZzJfZnJhbWVfcmF0ZV9leHQuZGVuLTEpOyAvLyBmcmFtZV9yYXRlX2V4dF9kCisKKyAgICAgICAgICAgIHNpZGVfZGF0YSA9IGF2X2ZyYW1lX2dldF9zaWRlX2RhdGEocy0+Y3VycmVudF9waWN0dXJlX3B0ci0+ZiwgQVZfRlJBTUVfREFUQV9QQU5TQ0FOKTsKKyAgICAgICAgICAgIGlmIChzaWRlX2RhdGEpIHsKKyAgICAgICAgICAgICAgICBBVlBhblNjYW4gKnBhbl9zY2FuID0gKEFWUGFuU2NhbiAqKXNpZGVfZGF0YS0+ZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAocGFuX3NjYW4tPndpZHRoICYmIHBhbl9zY2FuLT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBwYW5fc2Nhbi0+d2lkdGggPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gcGFuX3NjYW4tPmhlaWdodCA+PiA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNlX3NlcV9kaXNwX2V4dCA9ICh3aWR0aCAhPSBzLT53aWR0aCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgIT0gcy0+aGVpZ2h0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgIT0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5jb2xvcl90cmMgIT0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5jb2xvcnNwYWNlICE9IEFWQ09MX1NQQ19VTlNQRUNJRklFRCk7CisKKyAgICAgICAgICAgIGlmIChzLT5zZXFfZGlzcF9leHQgPT0gMSB8fCAocy0+c2VxX2Rpc3BfZXh0ID09IC0xICYmIHVzZV9zZXFfZGlzcF9leHQpKSB7CisgICAgICAgICAgICAgICAgcHV0X2hlYWRlcihzLCBFWFRfU1RBUlRfQ09ERSk7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2UgZGlzcGxheSBleHRlbnNpb24KKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDMsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2aWRlb19mb3JtYXQ6IDAgaXMgY29tcG9uZW50cworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG91cl9kZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgcy0+YXZjdHgtPmNvbG9yX3ByaW1hcmllcyk7IC8vIGNvbG91cl9wcmltYXJpZXMKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIHMtPmF2Y3R4LT5jb2xvcl90cmMpOyAgICAgICAvLyB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIHMtPmF2Y3R4LT5jb2xvcnNwYWNlKTsgICAgICAvLyBtYXRyaXhfY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxNCwgd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGxheV9ob3Jpem9udGFsX3NpemUKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrZXJfYml0CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxNCwgaGVpZ2h0KTsgICAgICAgICAgICAgICAgICAgLy8gZGlzcGxheV92ZXJ0aWNhbF9zaXplCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtYWluaW5nIDMgYml0cyBhcmUgemVybyBwYWRkaW5nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdXRfaGVhZGVyKHMsIEdPUF9TVEFSVF9DT0RFKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5kcm9wX2ZyYW1lX3RpbWVjb2RlKTsgICAgLy8gZHJvcCBmcmFtZSBmbGFnCisgICAgICAgIC8qIHRpbWUgY29kZTogd2UgbXVzdCBjb252ZXJ0IGZyb20gdGhlIHJlYWwgZnJhbWUgcmF0ZSB0byBhCisgICAgICAgICAqIGZha2UgTVBFRyBmcmFtZSByYXRlIGluIGNhc2Ugb2YgbG93IGZyYW1lIHJhdGUgKi8KKyAgICAgICAgZnBzICAgICAgID0gKGZyYW1lcmF0ZS5udW0gKyBmcmFtZXJhdGUuZGVuIC8gMikgLyBmcmFtZXJhdGUuZGVuOworICAgICAgICB0aW1lX2NvZGUgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5jb2RlZF9waWN0dXJlX251bWJlciArCisgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT50aW1lY29kZV9mcmFtZV9zdGFydDsKKworICAgICAgICBzLT5nb3BfcGljdHVyZV9udW1iZXIgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5jb2RlZF9waWN0dXJlX251bWJlcjsKKworICAgICAgICBhdl9hc3NlcnQwKHMtPmRyb3BfZnJhbWVfdGltZWNvZGUgPT0gISEocy0+dGMuZmxhZ3MgJiBBVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRSkpOworICAgICAgICBpZiAocy0+ZHJvcF9mcmFtZV90aW1lY29kZSkKKyAgICAgICAgICAgIHRpbWVfY29kZSA9IGF2X3RpbWVjb2RlX2FkanVzdF9udHNjX2ZyYW1lbnVtMih0aW1lX2NvZGUsIGZwcyk7CisKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA1LCAodWludDMyX3QpKCh0aW1lX2NvZGUgLyAoZnBzICogMzYwMCkpICUgMjQpKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA2LCAodWludDMyX3QpKCh0aW1lX2NvZGUgLyAoZnBzICogICA2MCkpICUgNjApKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA2LCAodWludDMyX3QpKCh0aW1lX2NvZGUgLyBmcHMpICUgNjApKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA2LCAodWludDMyX3QpKCh0aW1lX2NvZGUgJSBmcHMpKSk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgISEocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0NMT1NFRF9HT1ApIHx8IHMtPmludHJhX29ubHkgfHwgIXMtPmdvcF9waWN0dXJlX251bWJlcik7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgICAgICAgICAgICAgLy8gYnJva2VuIGxpbmsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfbWJfc2tpcF9ydW4oTXBlZ0VuY0NvbnRleHQgKnMsIGludCBydW4pCit7CisgICAgd2hpbGUgKHJ1biA+PSAzMykgeworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDExLCAweDAwOCk7CisgICAgICAgIHJ1biAtPSAzMzsKKyAgICB9CisgICAgcHV0X2JpdHMoJnMtPnBiLCBmZl9tcGVnMTJfbWJBZGRySW5jclRhYmxlW3J1bl1bMV0sCisgICAgICAgICAgICAgZmZfbXBlZzEyX21iQWRkckluY3JUYWJsZVtydW5dWzBdKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBwdXRfcXNjYWxlKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGlmIChzLT5xX3NjYWxlX3R5cGUpIHsKKyAgICAgICAgYXZfYXNzZXJ0MihzLT5xc2NhbGUgPj0gMSAmJiBzLT5xc2NhbGUgPD0gMTIpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIGludl9ub25fbGluZWFyX3FzY2FsZVtzLT5xc2NhbGVdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIHMtPnFzY2FsZSk7CisgICAgfQorfQorCit2b2lkIGZmX21wZWcxX2VuY29kZV9zbGljZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYgcy0+aGVpZ2h0ID4gMjgwMCkgeworICAgICAgICBwdXRfaGVhZGVyKHMsIFNMSUNFX01JTl9TVEFSVF9DT0RFICsgKHMtPm1iX3kgJiAxMjcpKTsKKyAgICAgICAgLyogc2xpY2VfdmVydGljYWxfcG9zaXRpb25fZXh0ZW5zaW9uICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+bWJfeSA+PiA3KTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXRfaGVhZGVyKHMsIFNMSUNFX01JTl9TVEFSVF9DT0RFICsgcy0+bWJfeSk7CisgICAgfQorICAgIHB1dF9xc2NhbGUocyk7CisgICAgLyogc2xpY2UgZXh0cmEgaW5mb3JtYXRpb24gKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOworfQorCit2b2lkIGZmX21wZWcxX2VuY29kZV9waWN0dXJlX2hlYWRlcihNcGVnRW5jQ29udGV4dCAqcywgaW50IHBpY3R1cmVfbnVtYmVyKQoreworICAgIEFWRnJhbWVTaWRlRGF0YSAqc2lkZV9kYXRhOworICAgIG1wZWcxX2VuY29kZV9zZXF1ZW5jZV9oZWFkZXIocyk7CisKKyAgICAvKiBtcGVnMSBwaWN0dXJlIGhlYWRlciAqLworICAgIHB1dF9oZWFkZXIocywgUElDVFVSRV9TVEFSVF9DT0RFKTsKKyAgICAvKiB0ZW1wb3JhbCByZWZlcmVuY2UgKi8KKworICAgIC8vIFJBTDogcy0+cGljdHVyZV9udW1iZXIgaW5zdGVhZCBvZiBzLT5mYWtlX3BpY3R1cmVfbnVtYmVyCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxMCwKKyAgICAgICAgICAgICAocy0+cGljdHVyZV9udW1iZXIgLSBzLT5nb3BfcGljdHVyZV9udW1iZXIpICYgMHgzZmYpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+cGljdF90eXBlKTsKKworICAgIHMtPnZidl9kZWxheV9wdHIgPSBzLT5wYi5idWYgKyBwdXRfYml0c19jb3VudCgmcy0+cGIpIC8gODsKKyAgICBwdXRfYml0cygmcy0+cGIsIDE2LCAweEZGRkYpOyAgICAgICAgICAgICAgIC8qIHZidl9kZWxheSAqLworCisgICAgLy8gUkFMOiBGb3J3YXJkIGZfY29kZSBhbHNvIG5lZWRlZCBmb3IgQi1mcmFtZXMKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QIHx8CisgICAgICAgIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgICAgICAgICAgLyogaGFsZiBwZWwgY29vcmRpbmF0ZXMgKi8KKyAgICAgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8pCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDMsIHMtPmZfY29kZSk7ICAgICAvKiBmb3J3YXJkX2ZfY29kZSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDMsIDcpOyAgICAgICAgICAgICAvKiBmb3J3YXJkX2ZfY29kZSAqLworICAgIH0KKworICAgIC8vIFJBTDogQmFja3dhcmQgZl9jb2RlIG5lY2Vzc2FyeSBmb3IgQi1mcmFtZXMKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgICAgICAgICAvKiBoYWxmIHBlbCBjb29yZGluYXRlcyAqLworICAgICAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzFWSURFTykKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+Yl9jb2RlKTsgICAgIC8qIGJhY2t3YXJkX2ZfY29kZSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDMsIDcpOyAgICAgICAgICAgICAvKiBiYWNrd2FyZF9mX2NvZGUgKi8KKyAgICB9CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhIGJpdCBwaWN0dXJlICovCisKKyAgICBzLT5mcmFtZV9wcmVkX2ZyYW1lX2RjdCA9IDE7CisgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8pIHsKKyAgICAgICAgcHV0X2hlYWRlcihzLCBFWFRfU1RBUlRfQ09ERSk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgOCk7ICAgICAgICAgICAgICAgICAvKiBwaWMgZXh0ICovCisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AgfHwKKyAgICAgICAgICAgIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCBzLT5mX2NvZGUpOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCBzLT5mX2NvZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCAyNTUpOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgcy0+Yl9jb2RlKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNCwgcy0+Yl9jb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgMjU1KTsKKyAgICAgICAgfQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIHMtPmludHJhX2RjX3ByZWNpc2lvbik7CisKKyAgICAgICAgYXZfYXNzZXJ0MChzLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBzLT5waWN0dXJlX3N0cnVjdHVyZSk7CisgICAgICAgIGlmIChzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSkKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgICAgIC8qIG5vIHJlcGVhdCAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnRvcF9maWVsZF9maXJzdCk7CisgICAgICAgIC8qIFhYWDogb3B0aW1pemUgdGhlIGdlbmVyYXRpb24gb2YgdGhpcyBmbGFnIHdpdGggZW50cm9weSBtZWFzdXJlcyAqLworICAgICAgICBzLT5mcmFtZV9wcmVkX2ZyYW1lX2RjdCA9IHMtPnByb2dyZXNzaXZlX3NlcXVlbmNlOworCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+ZnJhbWVfcHJlZF9mcmFtZV9kY3QpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmNvbmNlYWxtZW50X21vdGlvbl92ZWN0b3JzKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5xX3NjYWxlX3R5cGUpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmludHJhX3ZsY19mb3JtYXQpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmFsdGVybmF0ZV9zY2FuKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5yZXBlYXRfZmlyc3RfZmllbGQpOworICAgICAgICBzLT5wcm9ncmVzc2l2ZV9mcmFtZSA9IHMtPnByb2dyZXNzaXZlX3NlcXVlbmNlOworICAgICAgICAvKiBjaHJvbWFfNDIwX3R5cGUgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5jaHJvbWFfZm9ybWF0ID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hST01BXzQyMCA/IHMtPnByb2dyZXNzaXZlX2ZyYW1lIDogMCk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+cHJvZ3Jlc3NpdmVfZnJhbWUpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgICAgICAgICAgLyogY29tcG9zaXRlX2Rpc3BsYXlfZmxhZyAqLworICAgIH0KKyAgICBpZiAocy0+c2Nhbl9vZmZzZXQpIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgcHV0X2hlYWRlcihzLCBVU0VSX1NUQVJUX0NPREUpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN2Y2Rfc2Nhbl9vZmZzZXRfcGxhY2Vob2xkZXIpOyBpKyspCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIHN2Y2Rfc2Nhbl9vZmZzZXRfcGxhY2Vob2xkZXJbaV0pOworICAgIH0KKyAgICBzaWRlX2RhdGEgPSBhdl9mcmFtZV9nZXRfc2lkZV9kYXRhKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9GUkFNRV9EQVRBX1NURVJFTzNEKTsKKyAgICBpZiAoc2lkZV9kYXRhKSB7CisgICAgICAgIEFWU3RlcmVvM0QgKnN0ZXJlbyA9IChBVlN0ZXJlbzNEICopc2lkZV9kYXRhLT5kYXRhOworICAgICAgICB1aW50OF90IGZwYV90eXBlOworCisgICAgICAgIHN3aXRjaCAoc3RlcmVvLT50eXBlKSB7CisgICAgICAgIGNhc2UgQVZfU1RFUkVPM0RfU0lERUJZU0lERToKKyAgICAgICAgICAgIGZwYV90eXBlID0gMHgwMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1NURVJFTzNEX1RPUEJPVFRPTToKKyAgICAgICAgICAgIGZwYV90eXBlID0gMHgwNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1NURVJFTzNEXzJEOgorICAgICAgICAgICAgZnBhX3R5cGUgPSAweDA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfU1RFUkVPM0RfU0lERUJZU0lERV9RVUlOQ1VOWDoKKyAgICAgICAgICAgIGZwYV90eXBlID0gMHgyMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnBhX3R5cGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnBhX3R5cGUgIT0gMCkgeworICAgICAgICAgICAgcHV0X2hlYWRlcihzLCBVU0VSX1NUQVJUX0NPREUpOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCAnSicpOyAgIC8vIFMzRF92aWRlb19mb3JtYXRfc2lnbmFsaW5nX2lkZW50aWZpZXIKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgJ1AnKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgJzMnKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgJ0QnKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgMHgwMyk7ICAvLyBTM0RfdmlkZW9fZm9ybWF0X2xlbmd0aAorCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOyAgICAgLy8gcmVzZXJ2ZWRfYml0CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDcsIGZwYV90eXBlKTsgLy8gUzNEX3ZpZGVvX2Zvcm1hdF90eXBlCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIDB4MDQpOyAgLy8gcmVzZXJ2ZWRfZGF0YVswXQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCAweEZGKTsgIC8vIHJlc2VydmVkX2RhdGFbMV0KKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPm1iX3kgPSAwOworICAgIGZmX21wZWcxX2VuY29kZV9zbGljZV9oZWFkZXIocyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbWJfbW9kZXMoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBuLCBpbnQgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19tdiwgaW50IGZpZWxkX21vdGlvbikKK3sKKyAgICBwdXRfYml0cygmcy0+cGIsIG4sIGJpdHMpOworICAgIGlmICghcy0+ZnJhbWVfcHJlZF9mcmFtZV9kY3QpIHsKKyAgICAgICAgaWYgKGhhc19tdikKKyAgICAgICAgICAgIC8qIG1vdGlvbl90eXBlOiBmcmFtZS9maWVsZCAqLworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCAyIC0gZmllbGRfbW90aW9uKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5pbnRlcmxhY2VkX2RjdCk7CisgICAgfQorfQorCisvLyBSQUw6IFBhcmFtZXRlciBhZGRlZDogZl9vcl9iX2NvZGUKK3N0YXRpYyB2b2lkIG1wZWcxX2VuY29kZV9tb3Rpb24oTXBlZ0VuY0NvbnRleHQgKnMsIGludCB2YWwsIGludCBmX29yX2JfY29kZSkKK3sKKyAgICBpZiAodmFsID09IDApIHsKKyAgICAgICAgLyogemVybyB2ZWN0b3IgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICBmZl9tcGVnMTJfbWJNb3Rpb25WZWN0b3JUYWJsZVswXVsxXSwKKyAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX21iTW90aW9uVmVjdG9yVGFibGVbMF1bMF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBjb2RlLCBzaWduLCBiaXRzOworICAgICAgICBpbnQgYml0X3NpemUgPSBmX29yX2JfY29kZSAtIDE7CisgICAgICAgIGludCByYW5nZSAgICA9IDEgPDwgYml0X3NpemU7CisgICAgICAgIC8qIG1vZHVsbyBlbmNvZGluZyAqLworICAgICAgICB2YWwgPSBzaWduX2V4dGVuZCh2YWwsIDUgKyBiaXRfc2l6ZSk7CisKKyAgICAgICAgaWYgKHZhbCA+PSAwKSB7CisgICAgICAgICAgICB2YWwtLTsKKyAgICAgICAgICAgIGNvZGUgPSAodmFsID4+IGJpdF9zaXplKSArIDE7CisgICAgICAgICAgICBiaXRzID0gdmFsICYgKHJhbmdlIC0gMSk7CisgICAgICAgICAgICBzaWduID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbCA9IC12YWw7CisgICAgICAgICAgICB2YWwtLTsKKyAgICAgICAgICAgIGNvZGUgPSAodmFsID4+IGJpdF9zaXplKSArIDE7CisgICAgICAgICAgICBiaXRzID0gdmFsICYgKHJhbmdlIC0gMSk7CisgICAgICAgICAgICBzaWduID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Fzc2VydDIoY29kZSA+IDAgJiYgY29kZSA8PSAxNik7CisKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICBmZl9tcGVnMTJfbWJNb3Rpb25WZWN0b3JUYWJsZVtjb2RlXVsxXSwKKyAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX21iTW90aW9uVmVjdG9yVGFibGVbY29kZV1bMF0pOworCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgc2lnbik7CisgICAgICAgIGlmIChiaXRfc2l6ZSA+IDApCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIGJpdF9zaXplLCBiaXRzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfZGMoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBkaWZmLCBpbnQgY29tcG9uZW50KQoreworICAgIHVuc2lnbmVkIGludCBkaWZmX3UgPSBkaWZmICsgMjU1OworICAgIGlmIChkaWZmX3UgPj0gNTExKSB7CisgICAgICAgIGludCBpbmRleDsKKworICAgICAgICBpZiAoZGlmZiA8IDApIHsKKyAgICAgICAgICAgIGluZGV4ID0gYXZfbG9nMl8xNmJpdCgtMiAqIGRpZmYpOworICAgICAgICAgICAgZGlmZi0tOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5kZXggPSBhdl9sb2cyXzE2Yml0KDIgKiBkaWZmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tcG9uZW50ID09IDApCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgICAgICBmZl9tcGVnMTJfdmxjX2RjX2x1bV9iaXRzW2luZGV4XSArIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgKGZmX21wZWcxMl92bGNfZGNfbHVtX2NvZGVbaW5kZXhdIDw8IGluZGV4KSArCisgICAgICAgICAgICAgICAgICAgICAoZGlmZiAmICgoMSA8PCBpbmRleCkgLSAxKSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgICAgICBmZl9tcGVnMTJfdmxjX2RjX2Nocm9tYV9iaXRzW2luZGV4XSArIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgKGZmX21wZWcxMl92bGNfZGNfY2hyb21hX2NvZGVbaW5kZXhdIDw8IGluZGV4KSArCisgICAgICAgICAgICAgICAgICAgICAoZGlmZiAmICgoMSA8PCBpbmRleCkgLSAxKSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjb21wb25lbnQgPT0gMCkKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwKKyAgICAgICAgICAgICAgICAgICAgIG1wZWcxX2x1bV9kY191bmlbZGlmZiArIDI1NV0gJiAweEZGLAorICAgICAgICAgICAgICAgICAgICAgbXBlZzFfbHVtX2RjX3VuaVtkaWZmICsgMjU1XSA+PiA4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgbXBlZzFfY2hyX2RjX3VuaVtkaWZmICsgMjU1XSAmIDB4RkYsCisgICAgICAgICAgICAgICAgICAgICBtcGVnMV9jaHJfZGNfdW5pW2RpZmYgKyAyNTVdID4+IDgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbXBlZzFfZW5jb2RlX2Jsb2NrKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywgaW50IG4pCit7CisgICAgaW50IGFsZXZlbCwgbGV2ZWwsIGxhc3Rfbm9uX3plcm8sIGRjLCBkaWZmLCBpLCBqLCBydW4sIGxhc3RfaW5kZXgsIHNpZ247CisgICAgaW50IGNvZGUsIGNvbXBvbmVudDsKKyAgICBjb25zdCB1aW50MTZfdCAoKnRhYmxlX3ZsYylbMl0gPSBmZl9ybF9tcGVnMS50YWJsZV92bGM7CisKKyAgICBsYXN0X2luZGV4ID0gcy0+YmxvY2tfbGFzdF9pbmRleFtuXTsKKworICAgIC8qIERDIGNvZWYgKi8KKyAgICBpZiAocy0+bWJfaW50cmEpIHsKKyAgICAgICAgY29tcG9uZW50ID0gKG4gPD0gMyA/IDAgOiAobiAmIDEpICsgMSk7CisgICAgICAgIGRjICAgICAgICA9IGJsb2NrWzBdOyAgICAgICAgICAgICAgICAgICAvKiBvdmVyZmxvdyBpcyBpbXBvc3NpYmxlICovCisgICAgICAgIGRpZmYgICAgICA9IGRjIC0gcy0+bGFzdF9kY1tjb21wb25lbnRdOworICAgICAgICBlbmNvZGVfZGMocywgZGlmZiwgY29tcG9uZW50KTsKKyAgICAgICAgcy0+bGFzdF9kY1tjb21wb25lbnRdID0gZGM7CisgICAgICAgIGkgPSAxOworICAgICAgICBpZiAocy0+aW50cmFfdmxjX2Zvcm1hdCkKKyAgICAgICAgICAgIHRhYmxlX3ZsYyA9IGZmX3JsX21wZWcyLnRhYmxlX3ZsYzsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBlbmNvZGUgdGhlIGZpcnN0IGNvZWZmaWNpZW50OiBuZWVkcyB0byBiZSBkb25lIGhlcmUgYmVjYXVzZQorICAgICAgICAgKiBpdCBpcyBoYW5kbGVkIHNsaWdodGx5IGRpZmZlcmVudGx5ICovCisgICAgICAgIGxldmVsID0gYmxvY2tbMF07CisgICAgICAgIGlmIChhYnMobGV2ZWwpID09IDEpIHsKKyAgICAgICAgICAgIGNvZGUgPSAoKHVpbnQzMl90KWxldmVsID4+IDMxKTsgICAgIC8qIHRoZSBzaWduIGJpdCAqLworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCBjb2RlIHwgMHgwMik7CisgICAgICAgICAgICBpID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGkgICAgICAgICAgICAgPSAwOworICAgICAgICAgICAgbGFzdF9ub25femVybyA9IC0xOworICAgICAgICAgICAgZ290byBuZXh0X2NvZWY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBub3cgcXVhbnRpZnkgJiBlbmNvZGUgQUMgY29lZnMgKi8KKyAgICBsYXN0X25vbl96ZXJvID0gaSAtIDE7CisKKyAgICBmb3IgKDsgaSA8PSBsYXN0X2luZGV4OyBpKyspIHsKKyAgICAgICAgaiAgICAgPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZFtpXTsKKyAgICAgICAgbGV2ZWwgPSBibG9ja1tqXTsKKworbmV4dF9jb2VmOgorICAgICAgICAvKiBlbmNvZGUgdXNpbmcgVkxDICovCisgICAgICAgIGlmIChsZXZlbCAhPSAwKSB7CisgICAgICAgICAgICBydW4gPSBpIC0gbGFzdF9ub25femVybyAtIDE7CisKKyAgICAgICAgICAgIGFsZXZlbCA9IGxldmVsOworICAgICAgICAgICAgTUFTS19BQlMoc2lnbiwgYWxldmVsKTsKKyAgICAgICAgICAgIHNpZ24gJj0gMTsKKworICAgICAgICAgICAgaWYgKGFsZXZlbCA8PSBtcGVnMV9tYXhfbGV2ZWxbMF1bcnVuXSkgeworICAgICAgICAgICAgICAgIGNvZGUgPSBtcGVnMV9pbmRleF9ydW5bMF1bcnVuXSArIGFsZXZlbCAtIDE7CisgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIFZMQyAmIHNpZ24gYXQgb25jZSAqLworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgdGFibGVfdmxjW2NvZGVdWzFdICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodGFibGVfdmxjW2NvZGVdWzBdIDw8IDEpICsgc2lnbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGVzY2FwZSBzZWVtcyB0byBiZSBwcmV0dHkgcmFyZSA8NSUgc28gSSBkbyBub3Qgb3B0aW1pemUgaXQgKi8KKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIHRhYmxlX3ZsY1sxMTFdWzFdLCB0YWJsZV92bGNbMTExXVswXSk7CisgICAgICAgICAgICAgICAgLyogZXNjYXBlOiBvbmx5IGNsaXAgaW4gdGhpcyBjYXNlICovCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA2LCBydW4pOworICAgICAgICAgICAgICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGV2ZWwgPCAxMjgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9zYml0cygmcy0+cGIsIDgsIGxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgMHg4MDAxICsgbGV2ZWwgKyAyNTUpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9zYml0cygmcy0+cGIsIDE2LCBsZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCAxMiwgbGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3Rfbm9uX3plcm8gPSBpOworICAgICAgICB9CisgICAgfQorICAgIC8qIGVuZCBvZiBibG9jayAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgdGFibGVfdmxjWzExMl1bMV0sIHRhYmxlX3ZsY1sxMTJdWzBdKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtcGVnMV9lbmNvZGVfbWJfaW50ZXJuYWwoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGJsb2NrWzhdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feCwgaW50IG1vdGlvbl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX2Jsb2NrX2NvdW50KQoreworICAgIGludCBpLCBjYnA7CisgICAgY29uc3QgaW50IG1iX3ggICAgID0gcy0+bWJfeDsKKyAgICBjb25zdCBpbnQgbWJfeSAgICAgPSBzLT5tYl95OworICAgIGNvbnN0IGludCBmaXJzdF9tYiA9IG1iX3ggPT0gcy0+cmVzeW5jX21iX3ggJiYgbWJfeSA9PSBzLT5yZXN5bmNfbWJfeTsKKworICAgIC8qIGNvbXB1dGUgY2JwICovCisgICAgY2JwID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWJfYmxvY2tfY291bnQ7IGkrKykKKyAgICAgICAgaWYgKHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPj0gMCkKKyAgICAgICAgICAgIGNicCB8PSAxIDw8IChtYl9ibG9ja19jb3VudCAtIDEgLSBpKTsKKworICAgIGlmIChjYnAgPT0gMCAmJiAhZmlyc3RfbWIgJiYgcy0+bXZfdHlwZSA9PSBNVl9UWVBFXzE2WDE2ICYmCisgICAgICAgIChtYl94ICE9IHMtPm1iX3dpZHRoIC0gMSB8fAorICAgICAgICAgKG1iX3kgIT0gcy0+ZW5kX21iX3kgLSAxICYmIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8pKSAmJgorICAgICAgICAoKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCAmJiAobW90aW9uX3ggfCBtb3Rpb25feSkgPT0gMCkgfHwKKyAgICAgICAgIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgcy0+bXZfZGlyID09IHMtPmxhc3RfbXZfZGlyICYmCisgICAgICAgICAgKCgocy0+bXZfZGlyICYgTVZfRElSX0ZPUldBUkQpCisgICAgICAgICAgICA/ICgocy0+bXZbMF1bMF1bMF0gLSBzLT5sYXN0X212WzBdWzBdWzBdKSB8CisgICAgICAgICAgICAgICAocy0+bXZbMF1bMF1bMV0gLSBzLT5sYXN0X212WzBdWzBdWzFdKSkgOiAwKSB8CisgICAgICAgICAgICgocy0+bXZfZGlyICYgTVZfRElSX0JBQ0tXQVJEKQorICAgICAgICAgICAgPyAoKHMtPm12WzFdWzBdWzBdIC0gcy0+bGFzdF9tdlsxXVswXVswXSkgfAorICAgICAgICAgICAgICAgKHMtPm12WzFdWzBdWzFdIC0gcy0+bGFzdF9tdlsxXVswXVsxXSkpIDogMCkpID09IDApKSkgeworICAgICAgICBzLT5tYl9za2lwX3J1bisrOworICAgICAgICBzLT5xc2NhbGUgLT0gcy0+ZHF1YW50OworICAgICAgICBzLT5za2lwX2NvdW50Kys7CisgICAgICAgIHMtPm1pc2NfYml0cysrOworICAgICAgICBzLT5sYXN0X2JpdHMrKzsKKyAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkgeworICAgICAgICAgICAgcy0+bGFzdF9tdlswXVswXVswXSA9CisgICAgICAgICAgICBzLT5sYXN0X212WzBdWzBdWzFdID0KKyAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMV1bMF0gPQorICAgICAgICAgICAgcy0+bGFzdF9tdlswXVsxXVsxXSA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZmlyc3RfbWIpIHsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAocy0+bWJfc2tpcF9ydW4gPT0gMCk7CisgICAgICAgICAgICBlbmNvZGVfbWJfc2tpcF9ydW4ocywgcy0+bWJfeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbmNvZGVfbWJfc2tpcF9ydW4ocywgcy0+bWJfc2tpcF9ydW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICAgICAgaWYgKHMtPmRxdWFudCAmJiBjYnApIHsKKyAgICAgICAgICAgICAgICAvKiBtYWNyb2Jsb2NrX3R5cGU6IG1hY3JvYmxvY2tfcXVhbnQgPSAxICovCisgICAgICAgICAgICAgICAgcHV0X21iX21vZGVzKHMsIDIsIDEsIDAsIDApOworICAgICAgICAgICAgICAgIHB1dF9xc2NhbGUocyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG1hY3JvYmxvY2tfdHlwZTogbWFjcm9ibG9ja19xdWFudCA9IDAgKi8KKyAgICAgICAgICAgICAgICBwdXRfbWJfbW9kZXMocywgMSwgMSwgMCwgMCk7CisgICAgICAgICAgICAgICAgcy0+cXNjYWxlIC09IHMtPmRxdWFudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPm1pc2NfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworICAgICAgICAgICAgcy0+aV9jb3VudCsrOworICAgICAgICB9IGVsc2UgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgICAgICBpZiAocy0+ZHF1YW50ICYmIGNicCkgeworICAgICAgICAgICAgICAgIHB1dF9tYl9tb2RlcyhzLCA2LCAweDAxLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfcXNjYWxlKHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXRfbWJfbW9kZXMocywgNSwgMHgwMywgMCwgMCk7CisgICAgICAgICAgICAgICAgcy0+cXNjYWxlIC09IHMtPmRxdWFudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPm1pc2NfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworICAgICAgICAgICAgcy0+aV9jb3VudCsrOworICAgICAgICAgICAgbWVtc2V0KHMtPmxhc3RfbXYsIDAsIHNpemVvZihzLT5sYXN0X212KSk7CisgICAgICAgIH0gZWxzZSBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB7CisgICAgICAgICAgICBpZiAocy0+bXZfdHlwZSA9PSBNVl9UWVBFXzE2WDE2KSB7CisgICAgICAgICAgICAgICAgaWYgKGNicCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgobW90aW9uX3ggfCBtb3Rpb25feSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmRxdWFudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hY3JvYmxvY2tfcGF0dGVybiAmIHF1YW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0X21iX21vZGVzKHMsIDUsIDEsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9xc2NhbGUocyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hY3JvYmxvY2tfcGF0dGVybiBvbmx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0X21iX21vZGVzKHMsIDIsIDEsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWlzY19iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+ZHF1YW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0X21iX21vZGVzKHMsIDUsIDIsIDEsIDApOyAgICAvKiBtb3Rpb24gKyBjYnAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfcXNjYWxlKHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfbWJfbW9kZXMocywgMSwgMSwgMSwgMCk7ICAgIC8qIG1vdGlvbiArIGNicCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWlzY19iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSQUw6IGZfY29kZSBwYXJhbWV0ZXIgYWRkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wZWcxX2VuY29kZV9tb3Rpb24ocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3ggLSBzLT5sYXN0X212WzBdWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mX2NvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkFMOiBmX2NvZGUgcGFyYW1ldGVyIGFkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMV9lbmNvZGVfbW90aW9uKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95IC0gcy0+bGFzdF9tdlswXVswXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Zl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12X2JpdHMgKz0gZ2V0X2JpdHNfZGlmZihzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgMSk7ICAgICAgICAgLyogbW90aW9uIG9ubHkgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzLT5mcmFtZV9wcmVkX2ZyYW1lX2RjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgMik7ICAgICAvKiBtb3Rpb25fdHlwZTogZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgcy0+bWlzY19iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJBTDogZl9jb2RlIHBhcmFtZXRlciBhZGRlZAorICAgICAgICAgICAgICAgICAgICBtcGVnMV9lbmNvZGVfbW90aW9uKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3ggLSBzLT5sYXN0X212WzBdWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJBTDogZl9jb2RlIHBhcmFtZXRlciBhZGRlZAorICAgICAgICAgICAgICAgICAgICBtcGVnMV9lbmNvZGVfbW90aW9uKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3kgLSBzLT5sYXN0X212WzBdWzBdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIHMtPnFzY2FsZSAgLT0gcy0+ZHF1YW50OworICAgICAgICAgICAgICAgICAgICBzLT5tdl9iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMV1bMF0gPSBzLT5sYXN0X212WzBdWzBdWzBdID0gbW90aW9uX3g7CisgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlswXVsxXVsxXSA9IHMtPmxhc3RfbXZbMF1bMF1bMV0gPSBtb3Rpb25feTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0Mighcy0+ZnJhbWVfcHJlZF9mcmFtZV9kY3QgJiYgcy0+bXZfdHlwZSA9PSBNVl9UWVBFX0ZJRUxEKTsKKworICAgICAgICAgICAgICAgIGlmIChjYnApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmRxdWFudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHV0X21iX21vZGVzKHMsIDUsIDIsIDEsIDEpOyAgICAvKiBtb3Rpb24gKyBjYnAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9xc2NhbGUocyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfbWJfbW9kZXMocywgMSwgMSwgMSwgMSk7ICAgIC8qIG1vdGlvbiArIGNicCAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCAxKTsgICAgICAgICAgICAgLyogbW90aW9uIG9ubHkgKi8KKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCAxKTsgICAgICAgICAgICAgLyogbW90aW9uX3R5cGU6IGZpZWxkICovCisgICAgICAgICAgICAgICAgICAgIHMtPnFzY2FsZSAtPSBzLT5kcXVhbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPm1pc2NfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5maWVsZF9zZWxlY3RbMF1baV0pOworICAgICAgICAgICAgICAgICAgICBtcGVnMV9lbmNvZGVfbW90aW9uKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1baV1bMF0gLSBzLT5sYXN0X212WzBdW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIG1wZWcxX2VuY29kZV9tb3Rpb24ocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVtpXVsxXSAtIChzLT5sYXN0X212WzBdW2ldWzFdID4+IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1baV1bMF0gPSBzLT5tdlswXVtpXVswXTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlswXVtpXVsxXSA9IDIgKiBzLT5tdlswXVtpXVsxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+bXZfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNicCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5jaHJvbWFfeV9zaGlmdCkgeworICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21wZWcxMl9tYlBhdFRhYmxlW2NicF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21wZWcxMl9tYlBhdFRhYmxlW2NicF1bMF0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX21iUGF0VGFibGVbY2JwID4+IDJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9tcGVnMTJfbWJQYXRUYWJsZVtjYnAgPj4gMl1bMF0pOworICAgICAgICAgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCAyLCBjYnApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmZfY291bnQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzLT5tdl90eXBlID09IE1WX1RZUEVfMTZYMTYpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2JwKSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIFdpdGggY29kZWQgYmxvYyBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5kcXVhbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tdl9kaXIgPT0gTVZfRElSX0ZPUldBUkQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0X21iX21vZGVzKHMsIDYsIDMsIDEsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9tYl9tb2RlcyhzLCA4IC0gcy0+bXZfZGlyLCAyLCAxLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9xc2NhbGUocyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfbWJfbW9kZXMocywgNSAtIHMtPm12X2RpciwgMywgMSwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGNvZGVkIGJsb2MgcGF0dGVybgorICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUgLSBzLT5tdl9kaXIsIDIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPmZyYW1lX3ByZWRfZnJhbWVfZGN0KQorICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCAyKTsgLyogbW90aW9uX3R5cGU6IGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIHMtPnFzY2FsZSAtPSBzLT5kcXVhbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPm1pc2NfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworICAgICAgICAgICAgICAgIGlmIChzLT5tdl9kaXIgJiBNVl9ESVJfRk9SV0FSRCkgeworICAgICAgICAgICAgICAgICAgICBtcGVnMV9lbmNvZGVfbW90aW9uKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gLSBzLT5sYXN0X212WzBdWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIG1wZWcxX2VuY29kZV9tb3Rpb24ocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSAtIHMtPmxhc3RfbXZbMF1bMF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Zl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlswXVswXVswXSA9CisgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMV1bMF0gPSBzLT5tdlswXVswXVswXTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlswXVswXVsxXSA9CisgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMV1bMV0gPSBzLT5tdlswXVswXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgcy0+Zl9jb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocy0+bXZfZGlyICYgTVZfRElSX0JBQ0tXQVJEKSB7CisgICAgICAgICAgICAgICAgICAgIG1wZWcxX2VuY29kZV9tb3Rpb24ocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVswXSAtIHMtPmxhc3RfbXZbMV1bMF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Yl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgbXBlZzFfZW5jb2RlX21vdGlvbihzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzFdWzBdWzFdIC0gcy0+bGFzdF9tdlsxXVswXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5iX2NvZGUpOworICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzFdWzBdWzBdID0KKyAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlsxXVsxXVswXSA9IHMtPm12WzFdWzBdWzBdOworICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzFdWzBdWzFdID0KKyAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlsxXVsxXVsxXSA9IHMtPm12WzFdWzBdWzFdOworICAgICAgICAgICAgICAgICAgICBzLT5iX2NvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKHMtPm12X3R5cGUgPT0gTVZfVFlQRV9GSUVMRCk7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0Mighcy0+ZnJhbWVfcHJlZF9mcmFtZV9kY3QpOworICAgICAgICAgICAgICAgIGlmIChjYnApIHsgICAgICAgICAgICAgICAgICAgICAgLy8gV2l0aCBjb2RlZCBibG9jIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmRxdWFudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm12X2RpciA9PSBNVl9ESVJfRk9SV0FSRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfbWJfbW9kZXMocywgNiwgMywgMSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0X21iX21vZGVzKHMsIDggLSBzLT5tdl9kaXIsIDIsIDEsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcHV0X3FzY2FsZShzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9tYl9tb2RlcyhzLCA1IC0gcy0+bXZfZGlyLCAzLCAxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gY29kZWQgYmxvYyBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNSAtIHMtPm12X2RpciwgMik7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgMSk7ICAgICAvKiBtb3Rpb25fdHlwZTogZmllbGQgKi8KKyAgICAgICAgICAgICAgICAgICAgcy0+cXNjYWxlIC09IHMtPmRxdWFudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+bWlzY19iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisgICAgICAgICAgICAgICAgaWYgKHMtPm12X2RpciAmIE1WX0RJUl9GT1JXQVJEKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+ZmllbGRfc2VsZWN0WzBdW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wZWcxX2VuY29kZV9tb3Rpb24ocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1baV1bMF0gLSBzLT5sYXN0X212WzBdW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mX2NvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzFfZW5jb2RlX21vdGlvbihzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVtpXVsxXSAtIChzLT5sYXN0X212WzBdW2ldWzFdID4+IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mX2NvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlswXVtpXVswXSA9IHMtPm12WzBdW2ldWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlswXVtpXVsxXSA9IHMtPm12WzBdW2ldWzFdICogMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzLT5mX2NvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzLT5tdl9kaXIgJiBNVl9ESVJfQkFDS1dBUkQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5maWVsZF9zZWxlY3RbMV1baV0pOworICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzFfZW5jb2RlX21vdGlvbihzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVtpXVswXSAtIHMtPmxhc3RfbXZbMV1baV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJfY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMV9lbmNvZGVfbW90aW9uKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzFdW2ldWzFdIC0gKHMtPmxhc3RfbXZbMV1baV1bMV0gPj4gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJfY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzFdW2ldWzBdID0gcy0+bXZbMV1baV1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzFdW2ldWzFdID0gcy0+bXZbMV1baV1bMV0gKiAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMtPmJfY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5tdl9iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisgICAgICAgICAgICBpZiAoY2JwKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmNocm9tYV95X3NoaWZ0KSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX21iUGF0VGFibGVbY2JwXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX21iUGF0VGFibGVbY2JwXVswXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9tcGVnMTJfbWJQYXRUYWJsZVtjYnAgPj4gMl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21wZWcxMl9tYlBhdFRhYmxlW2NicCA+PiAyXVswXSk7CisgICAgICAgICAgICAgICAgICAgIHB1dF9zYml0cygmcy0+cGIsIDIsIGNicCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYl9ibG9ja19jb3VudDsgaSsrKQorICAgICAgICAgICAgaWYgKGNicCAmICgxIDw8IChtYl9ibG9ja19jb3VudCAtIDEgLSBpKSkpCisgICAgICAgICAgICAgICAgbXBlZzFfZW5jb2RlX2Jsb2NrKHMsIGJsb2NrW2ldLCBpKTsKKyAgICAgICAgcy0+bWJfc2tpcF9ydW4gPSAwOworICAgICAgICBpZiAocy0+bWJfaW50cmEpCisgICAgICAgICAgICBzLT5pX3RleF9iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPnBfdGV4X2JpdHMgKz0gZ2V0X2JpdHNfZGlmZihzKTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfbXBlZzFfZW5jb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzhdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feCwgaW50IG1vdGlvbl95KQoreworICAgIGlmIChzLT5jaHJvbWFfZm9ybWF0ID09IENIUk9NQV80MjApCisgICAgICAgIG1wZWcxX2VuY29kZV9tYl9pbnRlcm5hbChzLCBibG9jaywgbW90aW9uX3gsIG1vdGlvbl95LCA2KTsKKyAgICBlbHNlCisgICAgICAgIG1wZWcxX2VuY29kZV9tYl9pbnRlcm5hbChzLCBibG9jaywgbW90aW9uX3gsIG1vdGlvbl95LCA4KTsKK30KKworYXZfY29sZCB2b2lkIGZmX21wZWcxX2VuY29kZV9pbml0KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIHN0YXRpYyBpbnQgZG9uZSA9IDA7CisKKyAgICBmZl9tcGVnMTJfY29tbW9uX2luaXQocyk7CisKKyAgICBpZiAoIWRvbmUpIHsKKyAgICAgICAgaW50IGZfY29kZTsKKyAgICAgICAgaW50IG12OworICAgICAgICBpbnQgaTsKKworICAgICAgICBkb25lID0gMTsKKyAgICAgICAgZmZfaW5pdF9ybCgmZmZfcmxfbXBlZzEsIGZmX21wZWcxMl9zdGF0aWNfcmxfdGFibGVfc3RvcmVbMF0pOworICAgICAgICBmZl9pbml0X3JsKCZmZl9ybF9tcGVnMiwgZmZfbXBlZzEyX3N0YXRpY19ybF90YWJsZV9zdG9yZVsxXSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIG1wZWcxX21heF9sZXZlbFswXVtpXSA9IGZmX3JsX21wZWcxLm1heF9sZXZlbFswXVtpXTsKKyAgICAgICAgICAgIG1wZWcxX2luZGV4X3J1blswXVtpXSA9IGZmX3JsX21wZWcxLmluZGV4X3J1blswXVtpXTsKKyAgICAgICAgfQorCisgICAgICAgIGluaXRfdW5pX2FjX3ZsYygmZmZfcmxfbXBlZzEsIHVuaV9tcGVnMV9hY192bGNfbGVuKTsKKyAgICAgICAgaWYgKHMtPmludHJhX3ZsY19mb3JtYXQpCisgICAgICAgICAgICBpbml0X3VuaV9hY192bGMoJmZmX3JsX21wZWcyLCB1bmlfbXBlZzJfYWNfdmxjX2xlbik7CisKKyAgICAgICAgLyogYnVpbGQgdW5pZmllZCBkYyBlbmNvZGluZyB0YWJsZXMgKi8KKyAgICAgICAgZm9yIChpID0gLTI1NTsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYWRpZmYsIGluZGV4OworICAgICAgICAgICAgaW50IGJpdHMsIGNvZGU7CisgICAgICAgICAgICBpbnQgZGlmZiA9IGk7CisKKyAgICAgICAgICAgIGFkaWZmID0gRkZBQlMoZGlmZik7CisgICAgICAgICAgICBpZiAoZGlmZiA8IDApCisgICAgICAgICAgICAgICAgZGlmZi0tOworICAgICAgICAgICAgaW5kZXggPSBhdl9sb2cyKDIgKiBhZGlmZik7CisKKyAgICAgICAgICAgIGJpdHMgPSBmZl9tcGVnMTJfdmxjX2RjX2x1bV9iaXRzW2luZGV4XSArIGluZGV4OworICAgICAgICAgICAgY29kZSA9IChmZl9tcGVnMTJfdmxjX2RjX2x1bV9jb2RlW2luZGV4XSA8PCBpbmRleCkgKworICAgICAgICAgICAgICAgICAgIChkaWZmICYgKCgxIDw8IGluZGV4KSAtIDEpKTsKKyAgICAgICAgICAgIG1wZWcxX2x1bV9kY191bmlbaSArIDI1NV0gPSBiaXRzICsgKGNvZGUgPDwgOCk7CisKKyAgICAgICAgICAgIGJpdHMgPSBmZl9tcGVnMTJfdmxjX2RjX2Nocm9tYV9iaXRzW2luZGV4XSArIGluZGV4OworICAgICAgICAgICAgY29kZSA9IChmZl9tcGVnMTJfdmxjX2RjX2Nocm9tYV9jb2RlW2luZGV4XSA8PCBpbmRleCkgKworICAgICAgICAgICAgICAgICAgIChkaWZmICYgKCgxIDw8IGluZGV4KSAtIDEpKTsKKyAgICAgICAgICAgIG1wZWcxX2Nocl9kY191bmlbaSArIDI1NV0gPSBiaXRzICsgKGNvZGUgPDwgOCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGZfY29kZSA9IDE7IGZfY29kZSA8PSBNQVhfRkNPREU7IGZfY29kZSsrKQorICAgICAgICAgICAgZm9yIChtdiA9IC1NQVhfTVY7IG12IDw9IE1BWF9NVjsgbXYrKykgeworICAgICAgICAgICAgICAgIGludCBsZW47CisKKyAgICAgICAgICAgICAgICBpZiAobXYgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsZW4gPSBmZl9tcGVnMTJfbWJNb3Rpb25WZWN0b3JUYWJsZVswXVsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgdmFsLCBiaXRfc2l6ZSwgY29kZTsKKworICAgICAgICAgICAgICAgICAgICBiaXRfc2l6ZSA9IGZfY29kZSAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gbXY7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gLXZhbDsKKyAgICAgICAgICAgICAgICAgICAgdmFsLS07CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAodmFsID4+IGJpdF9zaXplKSArIDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlIDwgMTcpCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBmZl9tcGVnMTJfbWJNb3Rpb25WZWN0b3JUYWJsZVtjb2RlXVsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICsgYml0X3NpemU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IGZmX21wZWcxMl9tYk1vdGlvblZlY3RvclRhYmxlWzE2XVsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICsgYml0X3NpemU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbXZfcGVuYWx0eVtmX2NvZGVdW212ICsgTUFYX01WXSA9IGxlbjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIGZvciAoZl9jb2RlID0gTUFYX0ZDT0RFOyBmX2NvZGUgPiAwOyBmX2NvZGUtLSkKKyAgICAgICAgICAgIGZvciAobXYgPSAtKDggPDwgZl9jb2RlKTsgbXYgPCAoOCA8PCBmX2NvZGUpOyBtdisrKQorICAgICAgICAgICAgICAgIGZjb2RlX3RhYlttdiArIE1BWF9NVl0gPSBmX2NvZGU7CisgICAgfQorICAgIHMtPm1lLm12X3BlbmFsdHkgPSBtdl9wZW5hbHR5OworICAgIHMtPmZjb2RlX3RhYiAgICAgPSBmY29kZV90YWI7CisgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8pIHsKKyAgICAgICAgcy0+bWluX3Fjb2VmZiA9IC0yNTU7CisgICAgICAgIHMtPm1heF9xY29lZmYgPSAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bWluX3Fjb2VmZiA9IC0yMDQ3OworICAgICAgICBzLT5tYXhfcWNvZWZmID0gMjA0NzsKKyAgICB9CisgICAgaWYgKHMtPmludHJhX3ZsY19mb3JtYXQpIHsKKyAgICAgICAgcy0+aW50cmFfYWNfdmxjX2xlbmd0aCAgICAgID0KKyAgICAgICAgcy0+aW50cmFfYWNfdmxjX2xhc3RfbGVuZ3RoID0gdW5pX21wZWcyX2FjX3ZsY19sZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+aW50cmFfYWNfdmxjX2xlbmd0aCAgICAgID0KKyAgICAgICAgcy0+aW50cmFfYWNfdmxjX2xhc3RfbGVuZ3RoID0gdW5pX21wZWcxX2FjX3ZsY19sZW47CisgICAgfQorICAgIHMtPmludGVyX2FjX3ZsY19sZW5ndGggICAgICA9CisgICAgcy0+aW50ZXJfYWNfdmxjX2xhc3RfbGVuZ3RoID0gdW5pX21wZWcxX2FjX3ZsY19sZW47Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE1wZWdFbmNDb250ZXh0LCB4KQorI2RlZmluZSBWRSBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB8IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisjZGVmaW5lIENPTU1PTl9PUFRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAiZ29wX3RpbWVjb2RlIiwgICAgICAgICJNUEVHIEdPUCBUaW1lY29kZSBpbiBoaDptbTpzc1s6Oy5dZmYgZm9ybWF0IiwgICBcCisgICAgICBPRkZTRVQodGNfb3B0X3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgVkUgfSxcCisgICAgeyAiaW50cmFfdmxjIiwgICAgICAgICAgICJVc2UgTVBFRy0yIGludHJhIFZMQyB0YWJsZS4iLCAgICAgICAgICAgICAgICAgICBcCisgICAgICBPRkZTRVQoaW50cmFfdmxjX2Zvcm1hdCksICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LCBcCisgICAgeyAiZHJvcF9mcmFtZV90aW1lY29kZSIsICJUaW1lY29kZSBpcyBpbiBkcm9wIGZyYW1lIGZvcm1hdC4iLCAgICAgICAgICAgICBcCisgICAgICBPRkZTRVQoZHJvcF9mcmFtZV90aW1lY29kZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LCBcCisgICAgeyAic2Nhbl9vZmZzZXQiLCAgICAgICAgICJSZXNlcnZlIHNwYWNlIGZvciBTVkNEIHNjYW4gb2Zmc2V0IHVzZXIgZGF0YS4iLCBcCisgICAgICBPRkZTRVQoc2Nhbl9vZmZzZXQpLCAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbXBlZzFfb3B0aW9uc1tdID0geworICAgIENPTU1PTl9PUFRTCisgICAgRkZfTVBWX0NPTU1PTl9PUFRTCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbXBlZzJfb3B0aW9uc1tdID0geworICAgIENPTU1PTl9PUFRTCisgICAgeyAibm9uX2xpbmVhcl9xdWFudCIsICJVc2Ugbm9ubGluZWFyIHF1YW50aXplci4iLCAgICBPRkZTRVQocV9zY2FsZV90eXBlKSwgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKKyAgICB7ICJhbHRlcm5hdGVfc2NhbiIsICAgIkVuYWJsZSBhbHRlcm5hdGUgc2NhbnRhYmxlLiIsIE9GRlNFVChhbHRlcm5hdGVfc2NhbiksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgInNlcV9kaXNwX2V4dCIsICAgICAiV3JpdGUgc2VxdWVuY2VfZGlzcGxheV9leHRlbnNpb24gYmxvY2tzLiIsIE9GRlNFVChzZXFfZGlzcF9leHQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sIC0xLCAxLCBWRSwgInNlcV9kaXNwX2V4dCIgfSwKKyAgICB7ICAgICAiYXV0byIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IC0xfSwgIDAsIDAsIFZFLCAic2VxX2Rpc3BfZXh0IiB9LAorICAgIHsgICAgICJuZXZlciIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gMCB9LCAgMCwgMCwgVkUsICJzZXFfZGlzcF9leHQiIH0sCisgICAgeyAgICAgImFsd2F5cyIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSAxIH0sICAwLCAwLCBWRSwgInNlcV9kaXNwX2V4dCIgfSwKKyAgICBGRl9NUFZfQ09NTU9OX09QVFMKKyAgICB7IE5VTEwgfSwKK307CisKKyNkZWZpbmUgbXBlZzEyX2NsYXNzKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IEFWQ2xhc3MgbXBlZyAjIyB4ICMjIF9jbGFzcyA9IHsgICAgICAgICAgICBcCisgICAgLmNsYXNzX25hbWUgPSAibXBlZyIgIyB4ICJ2aWRlbyBlbmNvZGVyIiwgICAgICAgICAgIFwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLCAgICAgICAgICAgICAgICAgXAorICAgIC5vcHRpb24gICAgID0gbXBlZyAjIyB4ICMjIF9vcHRpb25zLCAgICAgICAgICAgICAgICBcCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsICAgICAgICAgICAgICAgIFwKK307CisKK21wZWcxMl9jbGFzcygxKQorbXBlZzEyX2NsYXNzKDIpCisKK0FWQ29kZWMgZmZfbXBlZzF2aWRlb19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJtcGVnMXZpZGVvIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy0xIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcxVklERU8sCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgID0gc2l6ZW9mKE1wZWdFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSBlbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgICAgICAgPSBmZl9tcHZfZW5jb2RlX3BpY3R1cmUsCisgICAgLmNsb3NlICAgICAgICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9lbmQsCisgICAgLnN1cHBvcnRlZF9mcmFtZXJhdGVzID0gZmZfbXBlZzEyX2ZyYW1lX3JhdGVfdGFiICsgMSwKKyAgICAucGl4X2ZtdHMgICAgICAgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUgfSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgPSBDT0RFQ19DQVBfREVMQVkgfCBDT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUywKKyAgICAucHJpdl9jbGFzcyAgICAgICAgICAgPSAmbXBlZzFfY2xhc3MsCit9OworCitBVkNvZGVjIGZmX21wZWcydmlkZW9fZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAibXBlZzJ2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctMiB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICA9IHNpemVvZihNcGVnRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgID0gZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9waWN0dXJlLAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICA9IGZmX21wdl9lbmNvZGVfZW5kLAorICAgIC5zdXBwb3J0ZWRfZnJhbWVyYXRlcyA9IGZmX21wZWcyX2ZyYW1lX3JhdGVfdGFiLAorICAgIC5waXhfZm10cyAgICAgICAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeyBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLmNhcGFiaWxpdGllcyAgICAgICAgID0gQ09ERUNfQ0FQX0RFTEFZIHwgQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMsCisgICAgLnByaXZfY2xhc3MgICAgICAgICAgID0gJm1wZWcyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWc0YXVkaW8uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWc0YXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ0OGU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZzRhdWRpby5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTVBFRy00IEF1ZGlvIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZS5jb3VkdXJpZXJAZnJlZS5mcj4KKyAqIENvcHlyaWdodCAoYykgMjAwOSBBbGV4IENvbnZlcnNlIDxhbGV4LmNvbnZlcnNlQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJtcGVnNGF1ZGlvLmgiCisKKy8qKgorICogUGFyc2UgTVBFRy00IGF1ZGlvIGNvbmZpZ3VyYXRpb24gZm9yIEFMUyBvYmplY3QgdHlwZS4KKyAqIEBwYXJhbVtpbl0gZ2IgICAgICAgYml0IHJlYWRlciBjb250ZXh0CisgKiBAcGFyYW1baW5dIGMgICAgICAgIE1QRUc0QXVkaW9Db25maWcgc3RydWN0dXJlIHRvIGZpbGwKKyAqIEByZXR1cm4gb24gc3VjY2VzcyAwIGlzIHJldHVybmVkLCBvdGhlcndpc2UgYSB2YWx1ZSA8IDAKKyAqLworc3RhdGljIGludCBwYXJzZV9jb25maWdfQUxTKEdldEJpdENvbnRleHQgKmdiLCBNUEVHNEF1ZGlvQ29uZmlnICpjKQoreworICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDExMikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGdldF9iaXRzX2xvbmcoZ2IsIDMyKSAhPSBNS0JFVEFHKCdBJywnTCcsJ1MnLCdcMCcpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyBvdmVycmlkZSBBdWRpb1NwZWNpZmljQ29uZmlnIGNoYW5uZWwgY29uZmlndXJhdGlvbiBhbmQgc2FtcGxlIHJhdGUKKyAgICAvLyB3aGljaCBhcmUgYnVnZ3kgaW4gb2xkIEFMUyBjb25mb3JtYW5jZSBmaWxlcworICAgIGMtPnNhbXBsZV9yYXRlID0gZ2V0X2JpdHNfbG9uZyhnYiwgMzIpOworCisgICAgLy8gc2tpcCBudW1iZXIgb2Ygc2FtcGxlcworICAgIHNraXBfYml0c19sb25nKGdiLCAzMik7CisKKyAgICAvLyByZWFkIG51bWJlciBvZiBjaGFubmVscworICAgIGMtPmNoYW5fY29uZmlnID0gMDsKKyAgICBjLT5jaGFubmVscyAgICA9IGdldF9iaXRzKGdiLCAxNikgKyAxOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFhYWDogbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUgY29waWVzIGluIHRoZSBkaWZmZXJlbnQgZW5jb2RlcnMgaWYgeW91IGNoYW5nZQorICogdGhpcyB0YWJsZSAqLworY29uc3QgaW50IGF2cHJpdl9tcGVnNGF1ZGlvX3NhbXBsZV9yYXRlc1sxNl0gPSB7CisgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwKKyAgICAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfbXBlZzRhdWRpb19jaGFubmVsc1s4XSA9IHsKKyAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA4Cit9OworCitzdGF0aWMgaW5saW5lIGludCBnZXRfb2JqZWN0X3R5cGUoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IG9iamVjdF90eXBlID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgIGlmIChvYmplY3RfdHlwZSA9PSBBT1RfRVNDQVBFKQorICAgICAgICBvYmplY3RfdHlwZSA9IDMyICsgZ2V0X2JpdHMoZ2IsIDYpOworICAgIHJldHVybiBvYmplY3RfdHlwZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3NhbXBsZV9yYXRlKEdldEJpdENvbnRleHQgKmdiLCBpbnQgKmluZGV4KQoreworICAgICppbmRleCA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICByZXR1cm4gKmluZGV4ID09IDB4MGYgPyBnZXRfYml0cyhnYiwgMjQpIDoKKyAgICAgICAgYXZwcml2X21wZWc0YXVkaW9fc2FtcGxlX3JhdGVzWyppbmRleF07Cit9CisKK2ludCBhdnByaXZfbXBlZzRhdWRpb19nZXRfY29uZmlnKE1QRUc0QXVkaW9Db25maWcgKmMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRfc2l6ZSwgaW50IHN5bmNfZXh0ZW5zaW9uKQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IHNwZWNpZmljX2NvbmZpZ19iaXRpbmRleDsKKworICAgIGlmIChiaXRfc2l6ZSA8PSAwIHx8IGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJpdF9zaXplKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGMtPm9iamVjdF90eXBlID0gZ2V0X29iamVjdF90eXBlKCZnYik7CisgICAgYy0+c2FtcGxlX3JhdGUgPSBnZXRfc2FtcGxlX3JhdGUoJmdiLCAmYy0+c2FtcGxpbmdfaW5kZXgpOworICAgIGMtPmNoYW5fY29uZmlnID0gZ2V0X2JpdHMoJmdiLCA0KTsKKyAgICBpZiAoYy0+Y2hhbl9jb25maWcgPCBGRl9BUlJBWV9FTEVNUyhmZl9tcGVnNGF1ZGlvX2NoYW5uZWxzKSkKKyAgICAgICAgYy0+Y2hhbm5lbHMgPSBmZl9tcGVnNGF1ZGlvX2NoYW5uZWxzW2MtPmNoYW5fY29uZmlnXTsKKyAgICBjLT5zYnIgPSAtMTsKKyAgICBjLT5wcyAgPSAtMTsKKyAgICBpZiAoYy0+b2JqZWN0X3R5cGUgPT0gQU9UX1NCUiB8fCAoYy0+b2JqZWN0X3R5cGUgPT0gQU9UX1BTICYmCisgICAgICAgIC8vIGNoZWNrIGZvciBXNjEzMiBBbm5leCBZWVlZIGRyYWZ0IE1QM29uTVA0CisgICAgICAgICEoc2hvd19iaXRzKCZnYiwgMykgJiAweDAzICYmICEoc2hvd19iaXRzKCZnYiwgOSkgJiAweDNGKSkpKSB7CisgICAgICAgIGlmIChjLT5vYmplY3RfdHlwZSA9PSBBT1RfUFMpCisgICAgICAgICAgICBjLT5wcyA9IDE7CisgICAgICAgIGMtPmV4dF9vYmplY3RfdHlwZSA9IEFPVF9TQlI7CisgICAgICAgIGMtPnNiciA9IDE7CisgICAgICAgIGMtPmV4dF9zYW1wbGVfcmF0ZSA9IGdldF9zYW1wbGVfcmF0ZSgmZ2IsICZjLT5leHRfc2FtcGxpbmdfaW5kZXgpOworICAgICAgICBjLT5vYmplY3RfdHlwZSA9IGdldF9vYmplY3RfdHlwZSgmZ2IpOworICAgICAgICBpZiAoYy0+b2JqZWN0X3R5cGUgPT0gQU9UX0VSX0JTQUMpCisgICAgICAgICAgICBjLT5leHRfY2hhbl9jb25maWcgPSBnZXRfYml0cygmZ2IsIDQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGMtPmV4dF9vYmplY3RfdHlwZSA9IEFPVF9OVUxMOworICAgICAgICBjLT5leHRfc2FtcGxlX3JhdGUgPSAwOworICAgIH0KKyAgICBzcGVjaWZpY19jb25maWdfYml0aW5kZXggPSBnZXRfYml0c19jb3VudCgmZ2IpOworCisgICAgaWYgKGMtPm9iamVjdF90eXBlID09IEFPVF9BTFMpIHsKKyAgICAgICAgc2tpcF9iaXRzKCZnYiwgNSk7CisgICAgICAgIGlmIChzaG93X2JpdHNfbG9uZygmZ2IsIDI0KSAhPSBNS0JFVEFHKCdcMCcsJ0EnLCdMJywnUycpKQorICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCAyNCk7CisKKyAgICAgICAgc3BlY2lmaWNfY29uZmlnX2JpdGluZGV4ID0gZ2V0X2JpdHNfY291bnQoJmdiKTsKKworICAgICAgICBpZiAocGFyc2VfY29uZmlnX0FMUygmZ2IsIGMpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChjLT5leHRfb2JqZWN0X3R5cGUgIT0gQU9UX1NCUiAmJiBzeW5jX2V4dGVuc2lvbikgeworICAgICAgICB3aGlsZSAoZ2V0X2JpdHNfbGVmdCgmZ2IpID4gMTUpIHsKKyAgICAgICAgICAgIGlmIChzaG93X2JpdHMoJmdiLCAxMSkgPT0gMHgyYjcpIHsgLy8gc3luYyBleHRlbnNpb24KKyAgICAgICAgICAgICAgICBnZXRfYml0cygmZ2IsIDExKTsKKyAgICAgICAgICAgICAgICBjLT5leHRfb2JqZWN0X3R5cGUgPSBnZXRfb2JqZWN0X3R5cGUoJmdiKTsKKyAgICAgICAgICAgICAgICBpZiAoYy0+ZXh0X29iamVjdF90eXBlID09IEFPVF9TQlIgJiYgKGMtPnNiciA9IGdldF9iaXRzMSgmZ2IpKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGMtPmV4dF9zYW1wbGVfcmF0ZSA9IGdldF9zYW1wbGVfcmF0ZSgmZ2IsICZjLT5leHRfc2FtcGxpbmdfaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYy0+ZXh0X3NhbXBsZV9yYXRlID09IGMtPnNhbXBsZV9yYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2JyID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPiAxMSAmJiBnZXRfYml0cygmZ2IsIDExKSA9PSAweDU0OCkKKyAgICAgICAgICAgICAgICAgICAgYy0+cHMgPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGdldF9iaXRzMSgmZ2IpOyAvLyBza2lwIDEgYml0CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL1BTIHJlcXVpcmVzIFNCUgorICAgIGlmICghYy0+c2JyKQorICAgICAgICBjLT5wcyA9IDA7CisgICAgLy9MaW1pdCBpbXBsaWNpdCBQUyB0byB0aGUgSEUtQUFDdjIgUHJvZmlsZQorICAgIGlmICgoYy0+cHMgPT0gLTEgJiYgYy0+b2JqZWN0X3R5cGUgIT0gQU9UX0FBQ19MQykgfHwgYy0+Y2hhbm5lbHMgJiB+MHgwMSkKKyAgICAgICAgYy0+cHMgPSAwOworCisgICAgcmV0dXJuIHNwZWNpZmljX2NvbmZpZ19iaXRpbmRleDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IGNvcHlfYml0cyhQdXRCaXRDb250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzKQoreworICAgIHVuc2lnbmVkIGludCBlbCA9IGdldF9iaXRzKGdiLCBiaXRzKTsKKyAgICBwdXRfYml0cyhwYiwgYml0cywgZWwpOworICAgIHJldHVybiBlbDsKK30KKworaW50IGF2cHJpdl9jb3B5X3BjZV9kYXRhKFB1dEJpdENvbnRleHQgKnBiLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgZml2ZV9iaXRfY2gsIGZvdXJfYml0X2NoLCBjb21tZW50X3NpemUsIGJpdHM7CisgICAgaW50IG9mZnNldCA9IHB1dF9iaXRzX2NvdW50KHBiKTsKKworICAgIGNvcHlfYml0cyhwYiwgZ2IsIDEwKTsgICAgICAgICAgICAgICAgICAvL1RhZywgT2JqZWN0IFR5cGUsIEZyZXF1ZW5jeQorICAgIGZpdmVfYml0X2NoICA9IGNvcHlfYml0cyhwYiwgZ2IsIDQpOyAgICAvL0Zyb250CisgICAgZml2ZV9iaXRfY2ggKz0gY29weV9iaXRzKHBiLCBnYiwgNCk7ICAgIC8vU2lkZQorICAgIGZpdmVfYml0X2NoICs9IGNvcHlfYml0cyhwYiwgZ2IsIDQpOyAgICAvL0JhY2sKKyAgICBmb3VyX2JpdF9jaCAgPSBjb3B5X2JpdHMocGIsIGdiLCAyKTsgICAgLy9MRkUKKyAgICBmb3VyX2JpdF9jaCArPSBjb3B5X2JpdHMocGIsIGdiLCAzKTsgICAgLy9EYXRhCisgICAgZml2ZV9iaXRfY2ggKz0gY29weV9iaXRzKHBiLCBnYiwgNCk7ICAgIC8vQ291cGxpbmcKKyAgICBpZiAoY29weV9iaXRzKHBiLCBnYiwgMSkpICAgICAgICAgICAgICAgLy9Nb25vIE1peGRvd24KKyAgICAgICAgY29weV9iaXRzKHBiLCBnYiwgNCk7CisgICAgaWYgKGNvcHlfYml0cyhwYiwgZ2IsIDEpKSAgICAgICAgICAgICAgIC8vU3RlcmVvIE1peGRvd24KKyAgICAgICAgY29weV9iaXRzKHBiLCBnYiwgNCk7CisgICAgaWYgKGNvcHlfYml0cyhwYiwgZ2IsIDEpKSAgICAgICAgICAgICAgIC8vTWF0cml4IE1peGRvd24KKyAgICAgICAgY29weV9iaXRzKHBiLCBnYiwgMyk7CisgICAgZm9yIChiaXRzID0gZml2ZV9iaXRfY2gqNStmb3VyX2JpdF9jaCo0OyBiaXRzID4gMTY7IGJpdHMgLT0gMTYpCisgICAgICAgIGNvcHlfYml0cyhwYiwgZ2IsIDE2KTsKKyAgICBpZiAoYml0cykKKyAgICAgICAgY29weV9iaXRzKHBiLCBnYiwgYml0cyk7CisgICAgYXZwcml2X2FsaWduX3B1dF9iaXRzKHBiKTsKKyAgICBhbGlnbl9nZXRfYml0cyhnYik7CisgICAgY29tbWVudF9zaXplID0gY29weV9iaXRzKHBiLCBnYiwgOCk7CisgICAgZm9yICg7IGNvbW1lbnRfc2l6ZSA+IDA7IGNvbW1lbnRfc2l6ZS0tKQorICAgICAgICBjb3B5X2JpdHMocGIsIGdiLCA4KTsKKworICAgIHJldHVybiBwdXRfYml0c19jb3VudChwYikgLSBvZmZzZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNGF1ZGlvLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNGF1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0MTA0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWc0YXVkaW8uaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIE1QRUctNCBBdWRpbyBjb21tb24gaGVhZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZS5jb3VkdXJpZXJAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01QRUc0QVVESU9fSAorI2RlZmluZSBBVkNPREVDX01QRUc0QVVESU9fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCit0eXBlZGVmIHN0cnVjdCBNUEVHNEF1ZGlvQ29uZmlnIHsKKyAgICBpbnQgb2JqZWN0X3R5cGU7CisgICAgaW50IHNhbXBsaW5nX2luZGV4OworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICBpbnQgY2hhbl9jb25maWc7CisgICAgaW50IHNicjsgLy8vPCAtMSBpbXBsaWNpdCwgMSBwcmVzZW5jZQorICAgIGludCBleHRfb2JqZWN0X3R5cGU7CisgICAgaW50IGV4dF9zYW1wbGluZ19pbmRleDsKKyAgICBpbnQgZXh0X3NhbXBsZV9yYXRlOworICAgIGludCBleHRfY2hhbl9jb25maWc7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBwczsgIC8vLzwgLTEgaW1wbGljaXQsIDEgcHJlc2VuY2UKK30gTVBFRzRBdWRpb0NvbmZpZzsKKworZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCBpbnQgYXZwcml2X21wZWc0YXVkaW9fc2FtcGxlX3JhdGVzWzE2XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX21wZWc0YXVkaW9fY2hhbm5lbHNbOF07CisKKy8qKgorICogUGFyc2UgTVBFRy00IHN5c3RlbXMgZXh0cmFkYXRhIHRvIHJldHJpZXZlIGF1ZGlvIGNvbmZpZ3VyYXRpb24uCisgKiBAcGFyYW1baW5dIGMgICAgICAgIE1QRUc0QXVkaW9Db25maWcgc3RydWN0dXJlIHRvIGZpbGwuCisgKiBAcGFyYW1baW5dIGJ1ZiAgICAgIEV4dHJhZGF0YSBmcm9tIGNvbnRhaW5lci4KKyAqIEBwYXJhbVtpbl0gYml0X3NpemUgRXh0cmFkYXRhIHNpemUgaW4gYml0cy4KKyAqIEBwYXJhbVtpbl0gc3luY19leHRlbnNpb24gbG9vayBmb3IgYSBzeW5jIGV4dGVuc2lvbiBhZnRlciBjb25maWcgaWYgdHJ1ZS4KKyAqIEByZXR1cm4gT24gZXJyb3IgLTEgaXMgcmV0dXJuZWQsIG9uIHN1Y2Nlc3MgQXVkaW9TcGVjaWZpY0NvbmZpZyBiaXQgaW5kZXggaW4gZXh0cmFkYXRhLgorICovCitpbnQgYXZwcml2X21wZWc0YXVkaW9fZ2V0X2NvbmZpZyhNUEVHNEF1ZGlvQ29uZmlnICpjLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0X3NpemUsIGludCBzeW5jX2V4dGVuc2lvbik7CisKK2VudW0gQXVkaW9PYmplY3RUeXBlIHsKKyAgICBBT1RfTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0PyAgICAgICAgICAgICAgICBOYW1lCisgICAgQU9UX0FBQ19NQUlOLCAgICAgICAgICAgICAgLy8vPCBZICAgICAgICAgICAgICAgICAgICAgICBNYWluCisgICAgQU9UX0FBQ19MQywgICAgICAgICAgICAgICAgLy8vPCBZICAgICAgICAgICAgICAgICAgICAgICBMb3cgQ29tcGxleGl0eQorICAgIEFPVF9BQUNfU1NSLCAgICAgICAgICAgICAgIC8vLzwgTiAoY29kZSBpbiBTb0MgcmVwbykgICAgU2NhbGFibGUgU2FtcGxlIFJhdGUKKyAgICBBT1RfQUFDX0xUUCwgICAgICAgICAgICAgICAvLy88IFkgICAgICAgICAgICAgICAgICAgICAgIExvbmcgVGVybSBQcmVkaWN0aW9uCisgICAgQU9UX1NCUiwgICAgICAgICAgICAgICAgICAgLy8vPCBZICAgICAgICAgICAgICAgICAgICAgICBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uCisgICAgQU9UX0FBQ19TQ0FMQUJMRSwgICAgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBTY2FsYWJsZQorICAgIEFPVF9UV0lOVlEsICAgICAgICAgICAgICAgIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgVHdpbiBWZWN0b3IgUXVhbnRpemVyCisgICAgQU9UX0NFTFAsICAgICAgICAgICAgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBDb2RlIEV4Y2l0ZWQgTGluZWFyIFByZWRpY3Rpb24KKyAgICBBT1RfSFZYQywgICAgICAgICAgICAgICAgICAvLy88IE4gICAgICAgICAgICAgICAgICAgICAgIEhhcm1vbmljIFZlY3RvciBlWGNpdGF0aW9uIENvZGluZworICAgIEFPVF9UVFNJICAgICAgICAgICAgID0gMTIsIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgVGV4dC1Uby1TcGVlY2ggSW50ZXJmYWNlCisgICAgQU9UX01BSU5TWU5USCwgICAgICAgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBNYWluIFN5bnRoZXNpcworICAgIEFPVF9XQVZFU1lOVEgsICAgICAgICAgICAgIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgV2F2ZXRhYmxlIFN5bnRoZXNpcworICAgIEFPVF9NSURJLCAgICAgICAgICAgICAgICAgIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhbCBNSURJCisgICAgQU9UX1NBRlgsICAgICAgICAgICAgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBBbGdvcml0aG1pYyBTeW50aGVzaXMgYW5kIEF1ZGlvIEVmZmVjdHMKKyAgICBBT1RfRVJfQUFDX0xDLCAgICAgICAgICAgICAvLy88IE4gICAgICAgICAgICAgICAgICAgICAgIEVycm9yIFJlc2lsaWVudCBMb3cgQ29tcGxleGl0eQorICAgIEFPVF9FUl9BQUNfTFRQICAgICAgID0gMTksIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgUmVzaWxpZW50IExvbmcgVGVybSBQcmVkaWN0aW9uCisgICAgQU9UX0VSX0FBQ19TQ0FMQUJMRSwgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBFcnJvciBSZXNpbGllbnQgU2NhbGFibGUKKyAgICBBT1RfRVJfVFdJTlZRLCAgICAgICAgICAgICAvLy88IE4gICAgICAgICAgICAgICAgICAgICAgIEVycm9yIFJlc2lsaWVudCBUd2luIFZlY3RvciBRdWFudGl6ZXIKKyAgICBBT1RfRVJfQlNBQywgICAgICAgICAgICAgICAvLy88IE4gICAgICAgICAgICAgICAgICAgICAgIEVycm9yIFJlc2lsaWVudCBCaXQtU2xpY2VkIEFyaXRobWV0aWMgQ29kaW5nCisgICAgQU9UX0VSX0FBQ19MRCwgICAgICAgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBFcnJvciBSZXNpbGllbnQgTG93IERlbGF5CisgICAgQU9UX0VSX0NFTFAsICAgICAgICAgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBFcnJvciBSZXNpbGllbnQgQ29kZSBFeGNpdGVkIExpbmVhciBQcmVkaWN0aW9uCisgICAgQU9UX0VSX0hWWEMsICAgICAgICAgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBFcnJvciBSZXNpbGllbnQgSGFybW9uaWMgVmVjdG9yIGVYY2l0YXRpb24gQ29kaW5nCisgICAgQU9UX0VSX0hJTE4sICAgICAgICAgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBFcnJvciBSZXNpbGllbnQgSGFybW9uaWMgYW5kIEluZGl2aWR1YWwgTGluZXMgcGx1cyBOb2lzZQorICAgIEFPVF9FUl9QQVJBTSwgICAgICAgICAgICAgIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgUmVzaWxpZW50IFBhcmFtZXRyaWMKKyAgICBBT1RfU1NDLCAgICAgICAgICAgICAgICAgICAvLy88IE4gICAgICAgICAgICAgICAgICAgICAgIFNpbnVTb2lkYWwgQ29kaW5nCisgICAgQU9UX1BTLCAgICAgICAgICAgICAgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0cmljIFN0ZXJlbworICAgIEFPVF9TVVJST1VORCwgICAgICAgICAgICAgIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgTVBFRyBTdXJyb3VuZAorICAgIEFPVF9FU0NBUEUsICAgICAgICAgICAgICAgIC8vLzwgWSAgICAgICAgICAgICAgICAgICAgICAgRXNjYXBlIFZhbHVlCisgICAgQU9UX0wxLCAgICAgICAgICAgICAgICAgICAgLy8vPCBZICAgICAgICAgICAgICAgICAgICAgICBMYXllciAxCisgICAgQU9UX0wyLCAgICAgICAgICAgICAgICAgICAgLy8vPCBZICAgICAgICAgICAgICAgICAgICAgICBMYXllciAyCisgICAgQU9UX0wzLCAgICAgICAgICAgICAgICAgICAgLy8vPCBZICAgICAgICAgICAgICAgICAgICAgICBMYXllciAzCisgICAgQU9UX0RTVCwgICAgICAgICAgICAgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3QgU3RyZWFtIFRyYW5zZmVyCisgICAgQU9UX0FMUywgICAgICAgICAgICAgICAgICAgLy8vPCBZICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBMb3NzbGVzUworICAgIEFPVF9TTFMsICAgICAgICAgICAgICAgICAgIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFibGUgTG9zc2xlc1MKKyAgICBBT1RfU0xTX05PTl9DT1JFLCAgICAgICAgICAvLy88IE4gICAgICAgICAgICAgICAgICAgICAgIFNjYWxhYmxlIExvc3NsZXNTIChub24gY29yZSkKKyAgICBBT1RfRVJfQUFDX0VMRCwgICAgICAgICAgICAvLy88IE4gICAgICAgICAgICAgICAgICAgICAgIEVycm9yIFJlc2lsaWVudCBFbmhhbmNlZCBMb3cgRGVsYXkKKyAgICBBT1RfU01SX1NJTVBMRSwgICAgICAgICAgICAvLy88IE4gICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbGljIE11c2ljIFJlcHJlc2VudGF0aW9uIFNpbXBsZQorICAgIEFPVF9TTVJfTUFJTiwgICAgICAgICAgICAgIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9saWMgTXVzaWMgUmVwcmVzZW50YXRpb24gTWFpbgorICAgIEFPVF9VU0FDX05PU0JSLCAgICAgICAgICAgIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgVW5pZmllZCBTcGVlY2ggYW5kIEF1ZGlvIENvZGluZyAobm8gU0JSKQorICAgIEFPVF9TQU9DLCAgICAgICAgICAgICAgICAgIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgU3BhdGlhbCBBdWRpbyBPYmplY3QgQ29kaW5nCisgICAgQU9UX0xEX1NVUlJPVU5ELCAgICAgICAgICAgLy8vPCBOICAgICAgICAgICAgICAgICAgICAgICBMb3cgRGVsYXkgTVBFRyBTdXJyb3VuZAorICAgIEFPVF9VU0FDLCAgICAgICAgICAgICAgICAgIC8vLzwgTiAgICAgICAgICAgICAgICAgICAgICAgVW5pZmllZCBTcGVlY2ggYW5kIEF1ZGlvIENvZGluZworfTsKKworI2RlZmluZSBNQVhfUENFX1NJWkUgMzA0IC8vLzxNYXhpbXVtIHNpemUgb2YgYSBQQ0UgaW5jbHVkaW5nIHRoZSAzLWJpdCBJRF9QQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLy88bWFya2VyIGFuZCB0aGUgY29tbWVudAorCitpbnQgYXZwcml2X2NvcHlfcGNlX2RhdGEoUHV0Qml0Q29udGV4dCAqcGIsIEdldEJpdENvbnRleHQgKmdiKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTVBFRzRBVURJT19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNGRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWc0ZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYzU4NDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNGRhdGEuaApAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogSDI2Mysgc3VwcG9ydAorICogY29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbXBlZzQgdGFibGVzLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NUEVHNERBVEFfSAorI2RlZmluZSBBVkNPREVDX01QRUc0REFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKworLyogZGMgZW5jb2RpbmcgZm9yIG1wZWc0ICovCitjb25zdCB1aW50OF90IGZmX21wZWc0X0RDdGFiX2x1bVsxM11bMl0gPQoreworICAgIHszLDN9LCB7MywyfSwgezIsMn0sIHsyLDN9LCB7MSwzfSwgezEsNH0sIHsxLDV9LCB7MSw2fSwgezEsN30sCisgICAgezEsOH0sIHsxLDl9LCB7MSwxMH0sIHsxLDExfSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfbXBlZzRfREN0YWJfY2hyb21bMTNdWzJdID0KK3sKKyAgICB7MywyfSwgezIsMn0sIHsxLDJ9LCB7MSwzfSwgezEsNH0sIHsxLDV9LCB7MSw2fSwgezEsN30sIHsxLDh9LAorICAgIHsxLDl9LCB7MSwxMH0sIHsxLDExfSwgezEsMTJ9LAorfTsKKworY29uc3QgdWludDE2X3QgZmZfbXBlZzRfaW50cmFfdmxjWzEwM11bMl0gPSB7Cit7IDB4MiwgMiB9LAoreyAweDYsIDMgfSx7IDB4ZiwgNCB9LHsgMHhkLCA1IH0seyAweGMsIDUgfSwKK3sgMHgxNSwgNiB9LHsgMHgxMywgNiB9LHsgMHgxMiwgNiB9LHsgMHgxNywgNyB9LAoreyAweDFmLCA4IH0seyAweDFlLCA4IH0seyAweDFkLCA4IH0seyAweDI1LCA5IH0sCit7IDB4MjQsIDkgfSx7IDB4MjMsIDkgfSx7IDB4MjEsIDkgfSx7IDB4MjEsIDEwIH0sCit7IDB4MjAsIDEwIH0seyAweGYsIDEwIH0seyAweGUsIDEwIH0seyAweDcsIDExIH0sCit7IDB4NiwgMTEgfSx7IDB4MjAsIDExIH0seyAweDIxLCAxMSB9LHsgMHg1MCwgMTIgfSwKK3sgMHg1MSwgMTIgfSx7IDB4NTIsIDEyIH0seyAweGUsIDQgfSx7IDB4MTQsIDYgfSwKK3sgMHgxNiwgNyB9LHsgMHgxYywgOCB9LHsgMHgyMCwgOSB9LHsgMHgxZiwgOSB9LAoreyAweGQsIDEwIH0seyAweDIyLCAxMSB9LHsgMHg1MywgMTIgfSx7IDB4NTUsIDEyIH0sCit7IDB4YiwgNSB9LHsgMHgxNSwgNyB9LHsgMHgxZSwgOSB9LHsgMHhjLCAxMCB9LAoreyAweDU2LCAxMiB9LHsgMHgxMSwgNiB9LHsgMHgxYiwgOCB9LHsgMHgxZCwgOSB9LAoreyAweGIsIDEwIH0seyAweDEwLCA2IH0seyAweDIyLCA5IH0seyAweGEsIDEwIH0sCit7IDB4ZCwgNiB9LHsgMHgxYywgOSB9LHsgMHg4LCAxMCB9LHsgMHgxMiwgNyB9LAoreyAweDFiLCA5IH0seyAweDU0LCAxMiB9LHsgMHgxNCwgNyB9LHsgMHgxYSwgOSB9LAoreyAweDU3LCAxMiB9LHsgMHgxOSwgOCB9LHsgMHg5LCAxMCB9LHsgMHgxOCwgOCB9LAoreyAweDIzLCAxMSB9LHsgMHgxNywgOCB9LHsgMHgxOSwgOSB9LHsgMHgxOCwgOSB9LAoreyAweDcsIDEwIH0seyAweDU4LCAxMiB9LHsgMHg3LCA0IH0seyAweGMsIDYgfSwKK3sgMHgxNiwgOCB9LHsgMHgxNywgOSB9LHsgMHg2LCAxMCB9LHsgMHg1LCAxMSB9LAoreyAweDQsIDExIH0seyAweDU5LCAxMiB9LHsgMHhmLCA2IH0seyAweDE2LCA5IH0sCit7IDB4NSwgMTAgfSx7IDB4ZSwgNiB9LHsgMHg0LCAxMCB9LHsgMHgxMSwgNyB9LAoreyAweDI0LCAxMSB9LHsgMHgxMCwgNyB9LHsgMHgyNSwgMTEgfSx7IDB4MTMsIDcgfSwKK3sgMHg1YSwgMTIgfSx7IDB4MTUsIDggfSx7IDB4NWIsIDEyIH0seyAweDE0LCA4IH0sCit7IDB4MTMsIDggfSx7IDB4MWEsIDggfSx7IDB4MTUsIDkgfSx7IDB4MTQsIDkgfSwKK3sgMHgxMywgOSB9LHsgMHgxMiwgOSB9LHsgMHgxMSwgOSB9LHsgMHgyNiwgMTEgfSwKK3sgMHgyNywgMTEgfSx7IDB4NWMsIDEyIH0seyAweDVkLCAxMiB9LHsgMHg1ZSwgMTIgfSwKK3sgMHg1ZiwgMTIgfSx7IDB4MywgNyB9LAorfTsKKworY29uc3QgaW50OF90IGZmX21wZWc0X2ludHJhX2xldmVsWzEwMl0gPSB7CisgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LAorICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKyAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisgMjUsIDI2LCAyNywgIDEsICAyLCAgMywgIDQsICA1LAorICA2LCAgNywgIDgsICA5LCAxMCwgIDEsICAyLCAgMywKKyAgNCwgIDUsICAxLCAgMiwgIDMsICA0LCAgMSwgIDIsCisgIDMsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsICAxLAorICAyLCAgMywgIDEsICAyLCAgMSwgIDIsICAxLCAgMSwKKyAgMSwgIDEsICAxLCAgMSwgIDIsICAzLCAgNCwgIDUsCisgIDYsICA3LCAgOCwgIDEsICAyLCAgMywgIDEsICAyLAorICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwKKyAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKK307CisKK2NvbnN0IGludDhfdCBmZl9tcGVnNF9pbnRyYV9ydW5bMTAyXSA9IHsKKyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLAorICAyLCAgMiwgIDMsICAzLCAgMywgIDMsICA0LCAgNCwKKyAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsCisgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsIDExLAorIDEyLCAxMywgMTQsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMiwgIDIsCisgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LAorICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLAorfTsKKworUkxUYWJsZSBmZl9tcGVnNF9ybF9pbnRyYSA9IHsKKyAgICAxMDIsCisgICAgNjcsCisgICAgZmZfbXBlZzRfaW50cmFfdmxjLAorICAgIGZmX21wZWc0X2ludHJhX3J1biwKKyAgICBmZl9tcGVnNF9pbnRyYV9sZXZlbCwKK307CisKKy8qIE5vdGUgdGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIGludHJhIHJ2bGMgZXhjZXB0IHRoYXQgaXQgaXMgcmVvcmRlcmVkLiAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGludGVyX3J2bGNbMTcwXVsyXT17Cit7MHgwMDA2LCAgM30sezB4MDAwMSwgIDR9LHsweDAwMDQsICA1fSx7MHgwMDFDLCAgN30sCit7MHgwMDNDLCAgOH0sezB4MDAzRCwgIDh9LHsweDAwN0MsICA5fSx7MHgwMEZDLCAxMH0sCit7MHgwMEZELCAxMH0sezB4MDFGQywgMTF9LHsweDAxRkQsIDExfSx7MHgwM0ZDLCAxMn0sCit7MHgwN0ZDLCAxM30sezB4MDdGRCwgMTN9LHsweDBCRkMsIDEzfSx7MHgwQkZELCAxM30sCit7MHgwRkZDLCAxNH0sezB4MEZGRCwgMTR9LHsweDFGRkMsIDE1fSx7MHgwMDA3LCAgM30sCit7MHgwMDBDLCAgNn0sezB4MDA1QywgIDh9LHsweDAwN0QsICA5fSx7MHgwMTdDLCAxMH0sCit7MHgwMkZDLCAxMX0sezB4MDNGRCwgMTJ9LHsweDBERkMsIDEzfSx7MHgxN0ZDLCAxNH0sCit7MHgxN0ZELCAxNH0sezB4MDAwQSwgIDR9LHsweDAwMUQsICA3fSx7MHgwMEJDLCAgOX0sCit7MHgwMkZELCAxMX0sezB4MDVGQywgMTJ9LHsweDFCRkMsIDE0fSx7MHgxQkZELCAxNH0sCit7MHgwMDA1LCAgNX0sezB4MDA1RCwgIDh9LHsweDAxN0QsIDEwfSx7MHgwNUZELCAxMn0sCit7MHgwREZELCAxM30sezB4MURGQywgMTR9LHsweDFGRkQsIDE1fSx7MHgwMDA4LCAgNX0sCit7MHgwMDZDLCAgOH0sezB4MDM3QywgMTF9LHsweDBFRkMsIDEzfSx7MHgyRkZDLCAxNX0sCit7MHgwMDA5LCAgNX0sezB4MDBCRCwgIDl9LHsweDAzN0QsIDExfSx7MHgwRUZELCAxM30sCit7MHgwMDBELCAgNn0sezB4MDFCQywgMTB9LHsweDA2RkMsIDEyfSx7MHgxREZELCAxNH0sCit7MHgwMDE0LCAgNn0sezB4MDFCRCwgMTB9LHsweDA2RkQsIDEyfSx7MHgyRkZELCAxNX0sCit7MHgwMDE1LCAgNn0sezB4MDFEQywgMTB9LHsweDBGN0MsIDEzfSx7MHgwMDJDLCAgN30sCit7MHgwMURELCAxMH0sezB4MUVGQywgMTR9LHsweDAwMkQsICA3fSx7MHgwM0JDLCAxMX0sCit7MHgwMDM0LCAgN30sezB4MDc3QywgMTJ9LHsweDAwNkQsICA4fSx7MHgwRjdELCAxM30sCit7MHgwMDc0LCAgOH0sezB4MUVGRCwgMTR9LHsweDAwNzUsICA4fSx7MHgxRjdDLCAxNH0sCit7MHgwMERDLCAgOX0sezB4MUY3RCwgMTR9LHsweDAwREQsICA5fSx7MHgxRkJDLCAxNH0sCit7MHgwMEVDLCAgOX0sezB4MzdGQywgMTV9LHsweDAxRUMsIDEwfSx7MHgwMUVELCAxMH0sCit7MHgwMUY0LCAxMH0sezB4MDNCRCwgMTF9LHsweDAzREMsIDExfSx7MHgwM0RELCAxMX0sCit7MHgwM0VDLCAxMX0sezB4MDNFRCwgMTF9LHsweDAzRjQsIDExfSx7MHgwNzdELCAxMn0sCit7MHgwN0JDLCAxMn0sezB4MDdCRCwgMTJ9LHsweDBGQkMsIDEzfSx7MHgwRkJELCAxM30sCit7MHgwRkRDLCAxM30sezB4MEZERCwgMTN9LHsweDFGQkQsIDE0fSx7MHgxRkRDLCAxNH0sCit7MHgxRkRELCAxNH0sezB4MzdGRCwgMTV9LHsweDNCRkMsIDE1fSwKK3sweDAwMEIsICA0fSx7MHgwMDc4LCAgOH0sezB4MDNGNSwgMTF9LHsweDBGRUMsIDEzfSwKK3sweDFGRUMsIDE0fSx7MHgwMDEyLCAgNX0sezB4MDBFRCwgIDl9LHsweDA3REMsIDEyfSwKK3sweDFGRUQsIDE0fSx7MHgzQkZELCAxNX0sezB4MDAxMywgIDV9LHsweDAzRjgsIDExfSwKK3sweDNERkMsIDE1fSx7MHgwMDE4LCAgNn0sezB4MDdERCwgMTJ9LHsweDAwMTksICA2fSwKK3sweDA3RUMsIDEyfSx7MHgwMDIyLCAgNn0sezB4MEZFRCwgMTN9LHsweDAwMjMsICA2fSwKK3sweDBGRjQsIDEzfSx7MHgwMDM1LCAgN30sezB4MEZGNSwgMTN9LHsweDAwMzgsICA3fSwKK3sweDBGRjgsIDEzfSx7MHgwMDM5LCAgN30sezB4MEZGOSwgMTN9LHsweDAwNDIsICA3fSwKK3sweDFGRjQsIDE0fSx7MHgwMDQzLCAgN30sezB4MUZGNSwgMTR9LHsweDAwNzksICA4fSwKK3sweDFGRjgsIDE0fSx7MHgwMDgyLCAgOH0sezB4M0RGRCwgMTV9LHsweDAwODMsICA4fSwKK3sweDAwRjQsICA5fSx7MHgwMEY1LCAgOX0sezB4MDBGOCwgIDl9LHsweDAwRjksICA5fSwKK3sweDAxMDIsICA5fSx7MHgwMTAzLCAgOX0sezB4MDFGNSwgMTB9LHsweDAxRjgsIDEwfSwKK3sweDAxRjksIDEwfSx7MHgwMjAyLCAxMH0sezB4MDIwMywgMTB9LHsweDAzRjksIDExfSwKK3sweDA0MDIsIDExfSx7MHgwNDAzLCAxMX0sezB4MDdFRCwgMTJ9LHsweDA3RjQsIDEyfSwKK3sweDA3RjUsIDEyfSx7MHgwN0Y4LCAxMn0sezB4MDdGOSwgMTJ9LHsweDA4MDIsIDEyfSwKK3sweDA4MDMsIDEyfSx7MHgxMDAyLCAxM30sezB4MTAwMywgMTN9LHsweDFGRjksIDE0fSwKK3sweDIwMDIsIDE0fSx7MHgyMDAzLCAxNH0sezB4M0VGQywgMTV9LHsweDNFRkQsIDE1fSwKK3sweDNGN0MsIDE1fSx7MHgzRjdELCAxNX0sezB4MDAwMCwgNH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgaW50ZXJfcnZsY19ydW5bMTY5XT17CisgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgMSwgIDEsICAxLCAgMSwgIDEsICAyLCAgMiwgIDIsCisgMiwgIDIsICAyLCAgMiwgIDMsICAzLCAgMywgIDMsCisgMywgIDMsICAzLCAgNCwgIDQsICA0LCAgNCwgIDQsCisgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsCisgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDksCisgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsCisxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNiwgMTYsCisxNywgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsCisyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCiszMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwKKyAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwKKyAxLCAgMSwgIDIsICAyLCAgMiwgIDMsICAzLCAgNCwKKyA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgOCwKKyA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwKKzEyLCAxMywgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwKKzE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwKKzI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwKKzM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwKKzQzLCA0NCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgaW50ZXJfcnZsY19sZXZlbFsxNjldPXsKKyAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwKKyA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKzE3LCAxOCwgMTksICAxLCAgMiwgIDMsICA0LCAgNSwKKyA2LCAgNywgIDgsICA5LCAxMCwgIDEsICAyLCAgMywKKyA0LCAgNSwgIDYsICA3LCAgMSwgIDIsICAzLCAgNCwKKyA1LCAgNiwgIDcsICAxLCAgMiwgIDMsICA0LCAgNSwKKyAxLCAgMiwgIDMsICA0LCAgMSwgIDIsICAzLCAgNCwKKyAxLCAgMiwgIDMsICA0LCAgMSwgIDIsICAzLCAgMSwKKyAyLCAgMywgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwKKyAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwKKyAxLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorIDEsICAyLCAgMywgIDQsICA1LCAgMSwgIDIsICAzLAorIDQsICA1LCAgMSwgIDIsICAzLCAgMSwgIDIsICAxLAorIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLAorIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLAorIDIsICAxLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAorIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorIDEsICAxLAorfTsKKworUkxUYWJsZSBmZl9ydmxjX3JsX2ludGVyID0geworICAgIDE2OSwKKyAgICAxMDMsCisgICAgaW50ZXJfcnZsYywKKyAgICBpbnRlcl9ydmxjX3J1biwKKyAgICBpbnRlcl9ydmxjX2xldmVsLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGludHJhX3J2bGNbMTcwXVsyXT17Cit7MHgwMDA2LCAgM30sezB4MDAwNywgIDN9LHsweDAwMEEsICA0fSx7MHgwMDA5LCAgNX0sCit7MHgwMDE0LCAgNn0sezB4MDAxNSwgIDZ9LHsweDAwMzQsICA3fSx7MHgwMDc0LCAgOH0sCit7MHgwMDc1LCAgOH0sezB4MDBERCwgIDl9LHsweDAwRUMsICA5fSx7MHgwMUVDLCAxMH0sCit7MHgwMUVELCAxMH0sezB4MDFGNCwgMTB9LHsweDAzRUMsIDExfSx7MHgwM0VELCAxMX0sCit7MHgwM0Y0LCAxMX0sezB4MDc3RCwgMTJ9LHsweDA3QkMsIDEyfSx7MHgwRkJELCAxM30sCit7MHgwRkRDLCAxM30sezB4MDdCRCwgMTJ9LHsweDBGREQsIDEzfSx7MHgxRkJELCAxNH0sCit7MHgxRkRDLCAxNH0sezB4MUZERCwgMTR9LHsweDFGRkMsIDE1fSx7MHgwMDAxLCAgNH0sCit7MHgwMDA4LCAgNX0sezB4MDAyRCwgIDd9LHsweDAwNkMsICA4fSx7MHgwMDZELCAgOH0sCit7MHgwMERDLCAgOX0sezB4MDFERCwgMTB9LHsweDAzREMsIDExfSx7MHgwM0RELCAxMX0sCit7MHgwNzdDLCAxMn0sezB4MEZCQywgMTN9LHsweDFGN0QsIDE0fSx7MHgxRkJDLCAxNH0sCit7MHgwMDA0LCAgNX0sezB4MDAyQywgIDd9LHsweDAwQkMsICA5fSx7MHgwMURDLCAxMH0sCit7MHgwM0JDLCAxMX0sezB4MDNCRCwgMTF9LHsweDBFRkQsIDEzfSx7MHgwRjdDLCAxM30sCit7MHgwRjdELCAxM30sezB4MUVGRCwgMTR9LHsweDFGN0MsIDE0fSx7MHgwMDA1LCAgNX0sCit7MHgwMDVDLCAgOH0sezB4MDBCRCwgIDl9LHsweDAzN0QsIDExfSx7MHgwNkZDLCAxMn0sCit7MHgwRUZDLCAxM30sezB4MURGRCwgMTR9LHsweDFFRkMsIDE0fSx7MHgxRkZELCAxNX0sCit7MHgwMDBDLCAgNn0sezB4MDA1RCwgIDh9LHsweDAxQkQsIDEwfSx7MHgwM0ZELCAxMn0sCit7MHgwNkZELCAxMn0sezB4MUJGRCwgMTR9LHsweDAwMEQsICA2fSx7MHgwMDdELCAgOX0sCit7MHgwMkZDLCAxMX0sezB4MDVGQywgMTJ9LHsweDFCRkMsIDE0fSx7MHgxREZDLCAxNH0sCit7MHgwMDFDLCAgN30sezB4MDE3QywgMTB9LHsweDAyRkQsIDExfSx7MHgwNUZELCAxMn0sCit7MHgyRkZDLCAxNX0sezB4MDAxRCwgIDd9LHsweDAxN0QsIDEwfSx7MHgwMzdDLCAxMX0sCit7MHgwREZELCAxM30sezB4MkZGRCwgMTV9LHsweDAwM0MsICA4fSx7MHgwMUJDLCAxMH0sCit7MHgwQkZELCAxM30sezB4MTdGRCwgMTR9LHsweDAwM0QsICA4fSx7MHgwMUZELCAxMX0sCit7MHgwREZDLCAxM30sezB4MzdGQywgMTV9LHsweDAwN0MsICA5fSx7MHgwM0ZDLCAxMn0sCit7MHgwMEZDLCAxMH0sezB4MEJGQywgMTN9LHsweDAwRkQsIDEwfSx7MHgzN0ZELCAxNX0sCit7MHgwMUZDLCAxMX0sezB4MDdGQywgMTN9LHsweDA3RkQsIDEzfSx7MHgwRkZDLCAxNH0sCit7MHgwRkZELCAxNH0sezB4MTdGQywgMTR9LHsweDNCRkMsIDE1fSwKK3sweDAwMEIsICA0fSx7MHgwMDc4LCAgOH0sezB4MDNGNSwgMTF9LHsweDBGRUMsIDEzfSwKK3sweDFGRUMsIDE0fSx7MHgwMDEyLCAgNX0sezB4MDBFRCwgIDl9LHsweDA3REMsIDEyfSwKK3sweDFGRUQsIDE0fSx7MHgzQkZELCAxNX0sezB4MDAxMywgIDV9LHsweDAzRjgsIDExfSwKK3sweDNERkMsIDE1fSx7MHgwMDE4LCAgNn0sezB4MDdERCwgMTJ9LHsweDAwMTksICA2fSwKK3sweDA3RUMsIDEyfSx7MHgwMDIyLCAgNn0sezB4MEZFRCwgMTN9LHsweDAwMjMsICA2fSwKK3sweDBGRjQsIDEzfSx7MHgwMDM1LCAgN30sezB4MEZGNSwgMTN9LHsweDAwMzgsICA3fSwKK3sweDBGRjgsIDEzfSx7MHgwMDM5LCAgN30sezB4MEZGOSwgMTN9LHsweDAwNDIsICA3fSwKK3sweDFGRjQsIDE0fSx7MHgwMDQzLCAgN30sezB4MUZGNSwgMTR9LHsweDAwNzksICA4fSwKK3sweDFGRjgsIDE0fSx7MHgwMDgyLCAgOH0sezB4M0RGRCwgMTV9LHsweDAwODMsICA4fSwKK3sweDAwRjQsICA5fSx7MHgwMEY1LCAgOX0sezB4MDBGOCwgIDl9LHsweDAwRjksICA5fSwKK3sweDAxMDIsICA5fSx7MHgwMTAzLCAgOX0sezB4MDFGNSwgMTB9LHsweDAxRjgsIDEwfSwKK3sweDAxRjksIDEwfSx7MHgwMjAyLCAxMH0sezB4MDIwMywgMTB9LHsweDAzRjksIDExfSwKK3sweDA0MDIsIDExfSx7MHgwNDAzLCAxMX0sezB4MDdFRCwgMTJ9LHsweDA3RjQsIDEyfSwKK3sweDA3RjUsIDEyfSx7MHgwN0Y4LCAxMn0sezB4MDdGOSwgMTJ9LHsweDA4MDIsIDEyfSwKK3sweDA4MDMsIDEyfSx7MHgxMDAyLCAxM30sezB4MTAwMywgMTN9LHsweDFGRjksIDE0fSwKK3sweDIwMDIsIDE0fSx7MHgyMDAzLCAxNH0sezB4M0VGQywgMTV9LHsweDNFRkQsIDE1fSwKK3sweDNGN0MsIDE1fSx7MHgzRjdELCAxNX0sezB4MDAwMCwgIDR9Cit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGludHJhX3J2bGNfcnVuWzE2OV09eworIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLAorIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorIDIsICAyLCAgMiwgIDMsICAzLCAgMywgIDMsICAzLAorIDMsICAzLCAgMywgIDMsICA0LCAgNCwgIDQsICA0LAorIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAorIDYsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LAorIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LAorIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLAorMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksCisgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsCisgMSwgIDEsICAyLCAgMiwgIDIsICAzLCAgMywgIDQsCisgNCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywgIDgsCisgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTIsCisxMiwgMTMsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsCisxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsCisyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsCiszNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsCis0MywgNDQsCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGludHJhX3J2bGNfbGV2ZWxbMTY5XT17CisgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCisgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCisxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisyNSwgMjYsIDI3LCAgMSwgIDIsICAzLCAgNCwgIDUsCisgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsCisgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCisgOSwgMTAsIDExLCAgMSwgIDIsICAzLCAgNCwgIDUsCisgNiwgIDcsICA4LCAgOSwgIDEsICAyLCAgMywgIDQsCisgNSwgIDYsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsCisgMSwgIDIsICAzLCAgNCwgIDUsICAxLCAgMiwgIDMsCisgNCwgIDUsICAxLCAgMiwgIDMsICA0LCAgMSwgIDIsCisgMywgIDQsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsCisgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAxLCAgMiwgIDMsICA0LCAgNSwgIDEsICAyLCAgMywKKyA0LCAgNSwgIDEsICAyLCAgMywgIDEsICAyLCAgMSwKKyAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwKKyAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwKKyAyLCAgMSwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAxLCAgMSwKK307CisKK1JMVGFibGUgZmZfcnZsY19ybF9pbnRyYSA9IHsKKyAgICAxNjksCisgICAgMTAzLAorICAgIGludHJhX3J2bGMsCisgICAgaW50cmFfcnZsY19ydW4sCisgICAgaW50cmFfcnZsY19sZXZlbCwKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX3Nwcml0ZV90cmFqZWN0b3J5X3RhYlsxNV1bMl0gPSB7CisgezB4MDAsIDJ9LCB7MHgwMiwgM30sICB7MHgwMywgM30sICB7MHgwNCwgM30sIHsweDA1LCAzfSwgezB4MDYsIDN9LAorIHsweDBFLCA0fSwgezB4MUUsIDV9LCAgezB4M0UsIDZ9LCAgezB4N0UsIDd9LCB7MHhGRSwgOH0sCisgezB4MUZFLCA5fSx7MHgzRkUsIDEwfSx7MHg3RkUsIDExfSx7MHhGRkUsIDEyfSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfbWJfdHlwZV9iX3RhYls0XVsyXSA9IHsKKyB7MSwgMX0sIHsxLCAyfSwgezEsIDN9LCB7MSwgNH0sCit9OworCisvKiB0aGVzZSBtYXRyaXhlcyB3aWxsIGJlIHBlcm11dGVkIGZvciB0aGUgaWRjdCAqLworY29uc3QgaW50MTZfdCBmZl9tcGVnNF9kZWZhdWx0X2ludHJhX21hdHJpeFs2NF0gPSB7CisgIDgsIDE3LCAxOCwgMTksIDIxLCAyMywgMjUsIDI3LAorIDE3LCAxOCwgMTksIDIxLCAyMywgMjUsIDI3LCAyOCwKKyAyMCwgMjEsIDIyLCAyMywgMjQsIDI2LCAyOCwgMzAsCisgMjEsIDIyLCAyMywgMjQsIDI2LCAyOCwgMzAsIDMyLAorIDIyLCAyMywgMjQsIDI2LCAyOCwgMzAsIDMyLCAzNSwKKyAyMywgMjQsIDI2LCAyOCwgMzAsIDMyLCAzNSwgMzgsCisgMjUsIDI2LCAyOCwgMzAsIDMyLCAzNSwgMzgsIDQxLAorIDI3LCAyOCwgMzAsIDMyLCAzNSwgMzgsIDQxLCA0NSwKK307CisKK2NvbnN0IGludDE2X3QgZmZfbXBlZzRfZGVmYXVsdF9ub25faW50cmFfbWF0cml4WzY0XSA9IHsKKyAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsCisgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAorIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwKKyAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNiwgMjcsCisgMjAsIDIxLCAyMiwgMjMsIDI1LCAyNiwgMjcsIDI4LAorIDIxLCAyMiwgMjMsIDI0LCAyNiwgMjcsIDI4LCAzMCwKKyAyMiwgMjMsIDI0LCAyNiwgMjcsIDI4LCAzMCwgMzEsCisgMjMsIDI0LCAyNSwgMjcsIDI4LCAzMCwgMzEsIDMzLAorfTsKKworY29uc3QgdWludDhfdCBmZl9tcGVnNF95X2RjX3NjYWxlX3RhYmxlWzMyXT17CisvLyAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMQorICAgIDAsIDgsIDgsIDgsIDgsMTAsMTIsMTQsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzQsMzYsMzgsNDAsNDIsNDQsNDYKK307Citjb25zdCB1aW50OF90IGZmX21wZWc0X2NfZGNfc2NhbGVfdGFibGVbMzJdPXsKKy8vICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxCisgICAgMCwgOCwgOCwgOCwgOCwgOSwgOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywxNCwxNCwxNSwxNSwxNiwxNiwxNywxNywxOCwxOCwxOSwyMCwyMSwyMiwyMywyNCwyNQorfTsKKworY29uc3QgdWludDE2X3QgZmZfbXBlZzRfcmVzeW5jX3ByZWZpeFs4XT17CisgICAgMHg3RjAwLCAweDdFMDAsIDB4N0MwMCwgMHg3ODAwLCAweDcwMDAsIDB4NjAwMCwgMHg0MDAwLCAweDAwMDAKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfbXBlZzRfZGNfdGhyZXNob2xkWzhdPXsKKyAgICA5OSwgMTMsIDE1LCAxNywgMTksIDIxLCAyMywgMAorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTVBFRzREQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWc0dmlkZW8uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWc0dmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGVkNWFmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZzR2aWRlby5jCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogTVBFRzQgZGVjb2RlciAvIGVuY29kZXIgY29tbW9uIGNvZGUuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJtcGVnNHZpZGVvLmgiCisjaW5jbHVkZSAibXBlZzRkYXRhLmgiCisKK3VpbnQ4X3QgZmZfbXBlZzRfc3RhdGljX3JsX3RhYmxlX3N0b3JlWzNdWzJdWzIgKiBNQVhfUlVOICsgTUFYX0xFVkVMICsgM107CisKK2ludCBmZl9tcGVnNF9nZXRfdmlkZW9fcGFja2V0X3ByZWZpeF9sZW5ndGgoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgc3dpdGNoIChzLT5waWN0X3R5cGUpIHsKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9JOgorICAgICAgICByZXR1cm4gMTY7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfUDoKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9TOgorICAgICAgICByZXR1cm4gcy0+Zl9jb2RlICsgMTU7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfQjoKKyAgICAgICAgcmV0dXJuIEZGTUFYMyhzLT5mX2NvZGUsIHMtPmJfY29kZSwgMikgKyAxNTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCit2b2lkIGZmX21wZWc0X2NsZWFuX2J1ZmZlcnMoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IGNfd3JhcCwgY194eSwgbF93cmFwLCBsX3h5OworCisgICAgbF93cmFwID0gcy0+Yjhfc3RyaWRlOworICAgIGxfeHkgICA9ICgyICogcy0+bWJfeSAtIDEpICogbF93cmFwICsgcy0+bWJfeCAqIDIgLSAxOworICAgIGNfd3JhcCA9IHMtPm1iX3N0cmlkZTsKKyAgICBjX3h5ICAgPSAocy0+bWJfeSAtIDEpICogY193cmFwICsgcy0+bWJfeCAtIDE7CisKKyNpZiAwCisgICAgLyogY2xlYW4gREMgKi8KKyAgICBtZW1zZXR3KHMtPmRjX3ZhbFswXSArIGxfeHksIDEwMjQsIGxfd3JhcCAqIDIgKyAxKTsKKyAgICBtZW1zZXR3KHMtPmRjX3ZhbFsxXSArIGNfeHksIDEwMjQsIGNfd3JhcCArIDEpOworICAgIG1lbXNldHcocy0+ZGNfdmFsWzJdICsgY194eSwgMTAyNCwgY193cmFwICsgMSk7CisjZW5kaWYKKworICAgIC8qIGNsZWFuIEFDICovCisgICAgbWVtc2V0KHMtPmFjX3ZhbFswXSArIGxfeHksIDAsIChsX3dyYXAgKiAyICsgMSkgKiAxNiAqIHNpemVvZihpbnQxNl90KSk7CisgICAgbWVtc2V0KHMtPmFjX3ZhbFsxXSArIGNfeHksIDAsIChjX3dyYXAgICAgICsgMSkgKiAxNiAqIHNpemVvZihpbnQxNl90KSk7CisgICAgbWVtc2V0KHMtPmFjX3ZhbFsyXSArIGNfeHksIDAsIChjX3dyYXAgICAgICsgMSkgKiAxNiAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAvKiBjbGVhbiBNViAqLworICAgIC8vIHdlIGNhbid0IGNsZWFyIHRoZSBNVnMgYXMgdGhleSBtaWdodCBiZSBuZWVkZWQgYnkgYSBiIGZyYW1lCisvLyAgICBtZW1zZXQocy0+bW90aW9uX3ZhbCArIGxfeHksIDAsIChsX3dyYXAgKiAyICsgMSkgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKKy8vICAgIG1lbXNldChzLT5tb3Rpb25fdmFsLCAwLCAyICogc2l6ZW9mKGludDE2X3QpICogKDIgKyBzLT5tYl93aWR0aCAqIDIpICoKKy8vICAgICAgICAgICAoMiArIHMtPm1iX2hlaWdodCAqIDIpKTsKKyAgICBzLT5sYXN0X212WzBdWzBdWzBdID0KKyAgICBzLT5sYXN0X212WzBdWzBdWzFdID0KKyAgICBzLT5sYXN0X212WzFdWzBdWzBdID0KKyAgICBzLT5sYXN0X212WzFdWzBdWzFdID0gMDsKK30KKworI2RlZmluZSB0YWJfc2l6ZSAoKHNpZ25lZClGRl9BUlJBWV9FTEVNUyhzLT5kaXJlY3Rfc2NhbGVfbXZbMF0pKQorI2RlZmluZSB0YWJfYmlhcyAodGFiX3NpemUgLyAyKQorCisvLyB1c2VkIGJ5IG1wZWc0IGFuZCBydjEwIGRlY29kZXIKK3ZvaWQgZmZfbXBlZzRfaW5pdF9kaXJlY3RfbXYoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHRhYl9zaXplOyBpKyspIHsKKyAgICAgICAgcy0+ZGlyZWN0X3NjYWxlX212WzBdW2ldID0gKGkgLSB0YWJfYmlhcykgKiBzLT5wYl90aW1lIC8gcy0+cHBfdGltZTsKKyAgICAgICAgcy0+ZGlyZWN0X3NjYWxlX212WzFdW2ldID0gKGkgLSB0YWJfYmlhcykgKiAocy0+cGJfdGltZSAtIHMtPnBwX3RpbWUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHBfdGltZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZl9tcGVnNF9zZXRfb25lX2RpcmVjdF9tdihNcGVnRW5jQ29udGV4dCAqcywgaW50IG14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteSwgaW50IGkpCit7CisgICAgaW50IHh5ICAgICAgICAgICA9IHMtPmJsb2NrX2luZGV4W2ldOworICAgIHVpbnQxNl90IHRpbWVfcHAgPSBzLT5wcF90aW1lOworICAgIHVpbnQxNl90IHRpbWVfcGIgPSBzLT5wYl90aW1lOworICAgIGludCBwX214LCBwX215OworCisgICAgcF9teCA9IHMtPm5leHRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5XVswXTsKKyAgICBpZiAoKHVuc2lnbmVkKShwX214ICsgdGFiX2JpYXMpIDwgdGFiX3NpemUpIHsKKyAgICAgICAgcy0+bXZbMF1baV1bMF0gPSBzLT5kaXJlY3Rfc2NhbGVfbXZbMF1bcF9teCArIHRhYl9iaWFzXSArIG14OworICAgICAgICBzLT5tdlsxXVtpXVswXSA9IG14ID8gcy0+bXZbMF1baV1bMF0gLSBwX214CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzLT5kaXJlY3Rfc2NhbGVfbXZbMV1bcF9teCArIHRhYl9iaWFzXTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5tdlswXVtpXVswXSA9IHBfbXggKiB0aW1lX3BiIC8gdGltZV9wcCArIG14OworICAgICAgICBzLT5tdlsxXVtpXVswXSA9IG14ID8gcy0+bXZbMF1baV1bMF0gLSBwX214CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwX214ICogKHRpbWVfcGIgLSB0aW1lX3BwKSAvIHRpbWVfcHA7CisgICAgfQorICAgIHBfbXkgPSBzLT5uZXh0X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eV1bMV07CisgICAgaWYgKCh1bnNpZ25lZCkocF9teSArIHRhYl9iaWFzKSA8IHRhYl9zaXplKSB7CisgICAgICAgIHMtPm12WzBdW2ldWzFdID0gcy0+ZGlyZWN0X3NjYWxlX212WzBdW3BfbXkgKyB0YWJfYmlhc10gKyBteTsKKyAgICAgICAgcy0+bXZbMV1baV1bMV0gPSBteSA/IHMtPm12WzBdW2ldWzFdIC0gcF9teQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcy0+ZGlyZWN0X3NjYWxlX212WzFdW3BfbXkgKyB0YWJfYmlhc107CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bXZbMF1baV1bMV0gPSBwX215ICogdGltZV9wYiAvIHRpbWVfcHAgKyBteTsKKyAgICAgICAgcy0+bXZbMV1baV1bMV0gPSBteSA/IHMtPm12WzBdW2ldWzFdIC0gcF9teQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcF9teSAqICh0aW1lX3BiIC0gdGltZV9wcCkgLyB0aW1lX3BwOworICAgIH0KK30KKworI3VuZGVmIHRhYl9zaXplCisjdW5kZWYgdGFiX2JpYXMKKworLyoqCisgKiBAcmV0dXJuIHRoZSBtYl90eXBlCisgKi8KK2ludCBmZl9tcGVnNF9zZXRfZGlyZWN0X212KE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgbXgsIGludCBteSkKK3sKKyAgICBjb25zdCBpbnQgbWJfaW5kZXggICAgICAgICAgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKKyAgICBjb25zdCBpbnQgY29sb2NhdGVkX21iX3R5cGUgPSBzLT5uZXh0X3BpY3R1cmUubWJfdHlwZVttYl9pbmRleF07CisgICAgdWludDE2X3QgdGltZV9wcDsKKyAgICB1aW50MTZfdCB0aW1lX3BiOworICAgIGludCBpOworCisgICAgLy8gRklYTUUgYXZvaWQgZGl2aWRlcworICAgIC8vIHRyeSBzcGVjaWFsIGNhc2Ugd2l0aCBzaGlmdHMgZm9yIDEgYW5kIDMgQi1mcmFtZXM/CisKKyAgICBpZiAoSVNfOFg4KGNvbG9jYXRlZF9tYl90eXBlKSkgeworICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV84WDg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBmZl9tcGVnNF9zZXRfb25lX2RpcmVjdF9tdihzLCBteCwgbXksIGkpOworICAgICAgICByZXR1cm4gTUJfVFlQRV9ESVJFQ1QyIHwgTUJfVFlQRV84eDggfCBNQl9UWVBFX0wwTDE7CisgICAgfSBlbHNlIGlmIChJU19JTlRFUkxBQ0VEKGNvbG9jYXRlZF9tYl90eXBlKSkgeworICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV9GSUVMRDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgaW50IGZpZWxkX3NlbGVjdCA9IHMtPm5leHRfcGljdHVyZS5yZWZfaW5kZXhbMF1bNCAqIG1iX2luZGV4ICsgMiAqIGldOworICAgICAgICAgICAgcy0+ZmllbGRfc2VsZWN0WzBdW2ldID0gZmllbGRfc2VsZWN0OworICAgICAgICAgICAgcy0+ZmllbGRfc2VsZWN0WzFdW2ldID0gaTsKKyAgICAgICAgICAgIGlmIChzLT50b3BfZmllbGRfZmlyc3QpIHsKKyAgICAgICAgICAgICAgICB0aW1lX3BwID0gcy0+cHBfZmllbGRfdGltZSAtIGZpZWxkX3NlbGVjdCArIGk7CisgICAgICAgICAgICAgICAgdGltZV9wYiA9IHMtPnBiX2ZpZWxkX3RpbWUgLSBmaWVsZF9zZWxlY3QgKyBpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aW1lX3BwID0gcy0+cHBfZmllbGRfdGltZSArIGZpZWxkX3NlbGVjdCAtIGk7CisgICAgICAgICAgICAgICAgdGltZV9wYiA9IHMtPnBiX2ZpZWxkX3RpbWUgKyBmaWVsZF9zZWxlY3QgLSBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+bXZbMF1baV1bMF0gPSBzLT5wX2ZpZWxkX212X3RhYmxlW2ldWzBdW21iX2luZGV4XVswXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfcGIgLyB0aW1lX3BwICsgbXg7CisgICAgICAgICAgICBzLT5tdlswXVtpXVsxXSA9IHMtPnBfZmllbGRfbXZfdGFibGVbaV1bMF1bbWJfaW5kZXhdWzFdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9wYiAvIHRpbWVfcHAgKyBteTsKKyAgICAgICAgICAgIHMtPm12WzFdW2ldWzBdID0gbXggPyBzLT5tdlswXVtpXVswXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cF9maWVsZF9tdl90YWJsZVtpXVswXVttYl9pbmRleF1bMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzLT5wX2ZpZWxkX212X3RhYmxlW2ldWzBdW21iX2luZGV4XVswXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVfcGIgLSB0aW1lX3BwKSAvIHRpbWVfcHA7CisgICAgICAgICAgICBzLT5tdlsxXVtpXVsxXSA9IG15ID8gcy0+bXZbMF1baV1bMV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBfZmllbGRfbXZfdGFibGVbaV1bMF1bbWJfaW5kZXhdWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcy0+cF9maWVsZF9tdl90YWJsZVtpXVswXVttYl9pbmRleF1bMV0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lX3BiIC0gdGltZV9wcCkgLyB0aW1lX3BwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNQl9UWVBFX0RJUkVDVDIgfCBNQl9UWVBFXzE2eDggfAorICAgICAgICAgICAgICAgTUJfVFlQRV9MMEwxICAgIHwgTUJfVFlQRV9JTlRFUkxBQ0VEOworICAgIH0gZWxzZSB7CisgICAgICAgIGZmX21wZWc0X3NldF9vbmVfZGlyZWN0X212KHMsIG14LCBteSwgMCk7CisgICAgICAgIHMtPm12WzBdWzFdWzBdID0KKyAgICAgICAgcy0+bXZbMF1bMl1bMF0gPQorICAgICAgICBzLT5tdlswXVszXVswXSA9IHMtPm12WzBdWzBdWzBdOworICAgICAgICBzLT5tdlswXVsxXVsxXSA9CisgICAgICAgIHMtPm12WzBdWzJdWzFdID0KKyAgICAgICAgcy0+bXZbMF1bM11bMV0gPSBzLT5tdlswXVswXVsxXTsKKyAgICAgICAgcy0+bXZbMV1bMV1bMF0gPQorICAgICAgICBzLT5tdlsxXVsyXVswXSA9CisgICAgICAgIHMtPm12WzFdWzNdWzBdID0gcy0+bXZbMV1bMF1bMF07CisgICAgICAgIHMtPm12WzFdWzFdWzFdID0KKyAgICAgICAgcy0+bXZbMV1bMl1bMV0gPQorICAgICAgICBzLT5tdlsxXVszXVsxXSA9IHMtPm12WzFdWzBdWzFdOworICAgICAgICBpZiAoKHMtPmF2Y3R4LT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfRElSRUNUX0JMT0NLU0laRSkgfHwKKyAgICAgICAgICAgICFzLT5xdWFydGVyX3NhbXBsZSkKKyAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV84WDg7CisgICAgICAgIC8vIE5vdGUgc2VlIHByZXYgbGluZQorICAgICAgICByZXR1cm4gTUJfVFlQRV9ESVJFQ1QyIHwgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfTDBMMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNHZpZGVvLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNHZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzNjkyYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWc0dmlkZW8uaApAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIE1QRUc0IGVuY29kZXIvZGVjb2RlciBpbnRlcm5hbCBoZWFkZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NUEVHNFZJREVPX0gKKyNkZWZpbmUgQVZDT0RFQ19NUEVHNFZJREVPX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJybC5oIgorCisvLyBzaGFwZXMKKyNkZWZpbmUgUkVDVF9TSEFQRSAgICAgICAwCisjZGVmaW5lIEJJTl9TSEFQRSAgICAgICAgMQorI2RlZmluZSBCSU5fT05MWV9TSEFQRSAgIDIKKyNkZWZpbmUgR1JBWV9TSEFQRSAgICAgICAzCisKKyNkZWZpbmUgU0lNUExFX1ZPX1RZUEUgICAgICAgICAgIDEKKyNkZWZpbmUgQ09SRV9WT19UWVBFICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUFJTl9WT19UWVBFICAgICAgICAgICAgIDQKKyNkZWZpbmUgTkJJVF9WT19UWVBFICAgICAgICAgICAgIDUKKyNkZWZpbmUgQVJUU19WT19UWVBFICAgICAgICAgICAgMTAKKyNkZWZpbmUgQUNFX1ZPX1RZUEUgICAgICAgICAgICAgMTIKKyNkZWZpbmUgQURWX1NJTVBMRV9WT19UWVBFICAgICAgMTcKKworLy8gYXNwZWN0X3JhdGlvX2luZm8KKyNkZWZpbmUgRVhURU5ERURfUEFSIDE1CisKKy8vdm9sX3Nwcml0ZV91c2FnZSAvIHNwcml0ZV9lbmFibGUKKyNkZWZpbmUgU1RBVElDX1NQUklURSAxCisjZGVmaW5lIEdNQ19TUFJJVEUgMgorCisjZGVmaW5lIE1PVElPTl9NQVJLRVIgMHgxRjAwMQorI2RlZmluZSBEQ19NQVJLRVIgICAgIDB4NkIwMDEKKworI2RlZmluZSBWT1NfU1RBUlRDT0RFICAgICAgICAweDFCMAorI2RlZmluZSBVU0VSX0RBVEFfU1RBUlRDT0RFICAweDFCMgorI2RlZmluZSBHT1BfU1RBUlRDT0RFICAgICAgICAweDFCMworI2RlZmluZSBWSVNVQUxfT0JKX1NUQVJUQ09ERSAweDFCNQorI2RlZmluZSBWT1BfU1RBUlRDT0RFICAgICAgICAweDFCNgorCit0eXBlZGVmIHN0cnVjdCBNcGVnNERlY0NvbnRleHQgeworICAgIE1wZWdFbmNDb250ZXh0IG07CisKKyAgICAvLy8gbnVtYmVyIG9mIGJpdHMgdG8gcmVwcmVzZW50IHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGltZQorICAgIGludCB0aW1lX2luY3JlbWVudF9iaXRzOworICAgIGludCBzaGFwZTsKKyAgICBpbnQgdm9sX3Nwcml0ZV91c2FnZTsKKyAgICBpbnQgc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlOworICAgIGludCBudW1fc3ByaXRlX3dhcnBpbmdfcG9pbnRzOworICAgIC8vLyBzcHJpdGUgdHJhamVjdG9yeSBwb2ludHMKKyAgICB1aW50MTZfdCBzcHJpdGVfdHJhals0XVsyXTsKKyAgICAvLy8gc3ByaXRlIHNoaWZ0IFtpc0Nocm9tYV0KKyAgICBpbnQgc3ByaXRlX3NoaWZ0WzJdOworCisgICAgLy8gcmV2ZXJzaWJsZSB2bGMKKyAgICBpbnQgcnZsYzsKKyAgICAvLy8gY291bGQgdGhpcyBzdHJlYW0gY29udGFpbiByZXN5bmMgbWFya2VycworICAgIGludCByZXN5bmNfbWFya2VyOworICAgIC8vLyB0aW1lIGRpc3RhbmNlIG9mIGZpcnN0IEkgLT4gQiwgdXNlZCBmb3IgaW50ZXJsYWNlZCBCLWZyYW1lcworICAgIGludCB0X2ZyYW1lOworCisgICAgaW50IG5ld19wcmVkOworICAgIGludCBlbmhhbmNlbWVudF90eXBlOworICAgIGludCBzY2FsYWJpbGl0eTsKKyAgICBpbnQgdXNlX2ludHJhX2RjX3ZsYzsKKworICAgIC8vLyBRUCBhYm92ZSB3aGljaCB0aGUgYWMgVkxDIHNob3VsZCBiZSB1c2VkIGZvciBpbnRyYSBkYworICAgIGludCBpbnRyYV9kY190aHJlc2hvbGQ7CisKKyAgICAvKiBidWcgd29ya2Fyb3VuZHMgKi8KKyAgICBpbnQgZGl2eF92ZXJzaW9uOworICAgIGludCBkaXZ4X2J1aWxkOworICAgIGludCB4dmlkX2J1aWxkOworICAgIGludCBsYXZjX2J1aWxkOworCisgICAgLy8vIGZsYWcgZm9yIGhhdmluZyBzaG93biB0aGUgd2FybmluZyBhYm91dCBpbnZhbGlkIERpdnggQi1mcmFtZXMKKyAgICBpbnQgc2hvd2VkX3BhY2tlZF93YXJuaW5nOworICAgIC8qKiBkb2VzIHRoZSBzdHJlYW0gY29udGFpbiB0aGUgbG93X2RlbGF5IGZsYWcsCisgICAgICogIHVzZWQgdG8gd29yayBhcm91bmQgYnVnZ3kgZW5jb2RlcnMuICovCisgICAgaW50IHZvbF9jb250cm9sX3BhcmFtZXRlcnM7CisgICAgaW50IGNwbHhfZXN0aW1hdGlvbl90cmFzaF9pOworICAgIGludCBjcGx4X2VzdGltYXRpb25fdHJhc2hfcDsKKyAgICBpbnQgY3BseF9lc3RpbWF0aW9uX3RyYXNoX2I7Cit9IE1wZWc0RGVjQ29udGV4dDsKKworLyogZGMgZW5jb2RpbmcgZm9yIG1wZWc0ICovCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9tcGVnNF9EQ3RhYl9sdW1bMTNdWzJdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfbXBlZzRfREN0YWJfY2hyb21bMTNdWzJdOworCitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfbXBlZzRfaW50cmFfdmxjWzEwM11bMl07CitleHRlcm4gY29uc3QgaW50OF90IGZmX21wZWc0X2ludHJhX2xldmVsWzEwMl07CitleHRlcm4gY29uc3QgaW50OF90IGZmX21wZWc0X2ludHJhX3J1blsxMDJdOworCitleHRlcm4gUkxUYWJsZSBmZl9tcGVnNF9ybF9pbnRyYTsKKworLyogTm90ZSB0aGlzIGlzIGlkZW50aWNhbCB0byB0aGUgaW50cmEgcnZsYyBleGNlcHQgdGhhdCBpdCBpcyByZW9yZGVyZWQuICovCitleHRlcm4gUkxUYWJsZSBmZl9ydmxjX3JsX2ludGVyOworZXh0ZXJuIFJMVGFibGUgZmZfcnZsY19ybF9pbnRyYTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3Nwcml0ZV90cmFqZWN0b3J5X3RhYlsxNV1bMl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9tYl90eXBlX2JfdGFiWzRdWzJdOworCisvKiB0aGVzZSBtYXRyaXhlcyB3aWxsIGJlIHBlcm11dGVkIGZvciB0aGUgaWRjdCAqLworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfbXBlZzRfZGVmYXVsdF9pbnRyYV9tYXRyaXhbNjRdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfbXBlZzRfZGVmYXVsdF9ub25faW50cmFfbWF0cml4WzY0XTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfbXBlZzRfeV9kY19zY2FsZV90YWJsZVszMl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9tcGVnNF9jX2RjX3NjYWxlX3RhYmxlWzMyXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9tcGVnNF9yZXN5bmNfcHJlZml4WzhdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9tcGVnNF9kY190aHJlc2hvbGRbOF07CisKK3ZvaWQgZmZfbXBlZzRfZW5jb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBibG9ja1s2XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uX3gsIGludCBtb3Rpb25feSk7Cit2b2lkIGZmX21wZWc0X3ByZWRfYWMoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgKmJsb2NrLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyKTsKK3ZvaWQgZmZfc2V0X21wZWc0X3RpbWUoTXBlZ0VuY0NvbnRleHQgKnMpOwordm9pZCBmZl9tcGVnNF9lbmNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBwaWN0dXJlX251bWJlcik7CisKK2ludCBmZl9tcGVnNF9kZWNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZzREZWNDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiKTsKK3ZvaWQgZmZfbXBlZzRfZW5jb2RlX3ZpZGVvX3BhY2tldF9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMpOwordm9pZCBmZl9tcGVnNF9jbGVhbl9idWZmZXJzKE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbXBlZzRfc3R1ZmZpbmcoUHV0Qml0Q29udGV4dCAqcGJjKTsKK3ZvaWQgZmZfbXBlZzRfaW5pdF9wYXJ0aXRpb25zKE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbXBlZzRfbWVyZ2VfcGFydGl0aW9ucyhNcGVnRW5jQ29udGV4dCAqcyk7Cit2b2lkIGZmX2NsZWFuX21wZWc0X3FzY2FsZXMoTXBlZ0VuY0NvbnRleHQgKnMpOworaW50IGZmX21wZWc0X2RlY29kZV9wYXJ0aXRpb25zKE1wZWc0RGVjQ29udGV4dCAqY3R4KTsKK2ludCBmZl9tcGVnNF9nZXRfdmlkZW9fcGFja2V0X3ByZWZpeF9sZW5ndGgoTXBlZ0VuY0NvbnRleHQgKnMpOworaW50IGZmX21wZWc0X2RlY29kZV92aWRlb19wYWNrZXRfaGVhZGVyKE1wZWc0RGVjQ29udGV4dCAqY3R4KTsKK3ZvaWQgZmZfbXBlZzRfaW5pdF9kaXJlY3RfbXYoTXBlZ0VuY0NvbnRleHQgKnMpOwordm9pZCBmZl9tcGVnNHZpZGVvZGVjX3N0YXRpY19pbml0KHZvaWQpOworaW50IGZmX21wZWc0X3dvcmthcm91bmRfYnVncyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworaW50IGZmX21wZWc0X2ZyYW1lX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKTsKKworLyoqCisgKgorICogQHJldHVybiB0aGUgbWJfdHlwZQorICovCitpbnQgZmZfbXBlZzRfc2V0X2RpcmVjdF9tdihNcGVnRW5jQ29udGV4dCAqcywgaW50IG14LCBpbnQgbXkpOworCitleHRlcm4gdWludDhfdCBmZl9tcGVnNF9zdGF0aWNfcmxfdGFibGVfc3RvcmVbM11bMl1bMiAqIE1BWF9SVU4gKyBNQVhfTEVWRUwgKyAzXTsKKworI2lmIDAgLy8zSVYxIGlzIHF1aXRlIHJhcmUgYW5kIGl0IHNsb3dzIHRoaW5ncyBkb3duIGEgdGlueSBiaXQKKyNkZWZpbmUgSVNfM0lWMSBzLT5jb2RlY190YWcgPT0gQVZfUkwzMigiM0lWMSIpCisjZWxzZQorI2RlZmluZSBJU18zSVYxIDAKKyNlbmRpZgorCisvKioKKyAqIFByZWRpY3QgdGhlIGRjLgorICogZW5jb2RpbmcgcXVhbnRpemVkIGxldmVsIC0+IHF1YW50aXplZCBkaWZmCisgKiBkZWNvZGluZyBxdWFudGl6ZWQgZGlmZiAtPiBxdWFudGl6ZWQgbGV2ZWwKKyAqIEBwYXJhbSBuIGJsb2NrIGluZGV4ICgwLTMgYXJlIGx1bWEsIDQtNSBhcmUgY2hyb21hKQorICogQHBhcmFtIGRpcl9wdHIgcG9pbnRlciB0byBhbiBpbnRlZ2VyIHdoZXJlIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aWxsIGJlIHN0b3JlZAorICovCitzdGF0aWMgaW5saW5lIGludCBmZl9tcGVnNF9wcmVkX2RjKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgbiwgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpcl9wdHIsIGludCBlbmNvZGluZykKK3sKKyAgICBpbnQgYSwgYiwgYywgd3JhcCwgcHJlZCwgc2NhbGUsIHJldDsKKyAgICBpbnQxNl90ICpkY192YWw7CisKKyAgICAvKiBmaW5kIHByZWRpY3Rpb24gKi8KKyAgICBpZiAobiA8IDQpCisgICAgICAgIHNjYWxlID0gcy0+eV9kY19zY2FsZTsKKyAgICBlbHNlCisgICAgICAgIHNjYWxlID0gcy0+Y19kY19zY2FsZTsKKyAgICBpZiAoSVNfM0lWMSkKKyAgICAgICAgc2NhbGUgPSA4OworCisgICAgd3JhcCAgID0gcy0+YmxvY2tfd3JhcFtuXTsKKyAgICBkY192YWwgPSBzLT5kY192YWxbMF0gKyBzLT5ibG9ja19pbmRleFtuXTsKKworICAgIC8qIEIgQworICAgICAqIEEgWAorICAgICAqLworICAgIGEgPSBkY192YWxbLTFdOworICAgIGIgPSBkY192YWxbLTEgLSB3cmFwXTsKKyAgICBjID0gZGNfdmFsWy13cmFwXTsKKworICAgIC8qIG91dHNpZGUgc2xpY2UgaGFuZGxpbmcgKHdlIGNhbid0IGRvIHRoYXQgYnkgbWVtc2V0IGFzIHdlIG5lZWQgdGhlCisgICAgICogZGMgZm9yIGVycm9yIHJlc2lsaWVuY2UpICovCisgICAgaWYgKHMtPmZpcnN0X3NsaWNlX2xpbmUgJiYgbiAhPSAzKSB7CisgICAgICAgIGlmIChuICE9IDIpCisgICAgICAgICAgICBiID0gYyA9IDEwMjQ7CisgICAgICAgIGlmIChuICE9IDEgJiYgcy0+bWJfeCA9PSBzLT5yZXN5bmNfbWJfeCkKKyAgICAgICAgICAgIGIgPSBhID0gMTAyNDsKKyAgICB9CisgICAgaWYgKHMtPm1iX3ggPT0gcy0+cmVzeW5jX21iX3ggJiYgcy0+bWJfeSA9PSBzLT5yZXN5bmNfbWJfeSArIDEpIHsKKyAgICAgICAgaWYgKG4gPT0gMCB8fCBuID09IDQgfHwgbiA9PSA1KQorICAgICAgICAgICAgYiA9IDEwMjQ7CisgICAgfQorCisgICAgaWYgKGFicyhhIC0gYikgPCBhYnMoYiAtIGMpKSB7CisgICAgICAgIHByZWQgICAgID0gYzsKKyAgICAgICAgKmRpcl9wdHIgPSAxOyAvKiB0b3AgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBwcmVkICAgICA9IGE7CisgICAgICAgICpkaXJfcHRyID0gMDsgLyogbGVmdCAqLworICAgIH0KKyAgICAvKiB3ZSBhc3N1bWUgcHJlZCBpcyBwb3NpdGl2ZSAqLworICAgIHByZWQgPSBGQVNURElWKChwcmVkICsgKHNjYWxlID4+IDEpKSwgc2NhbGUpOworCisgICAgaWYgKGVuY29kaW5nKSB7CisgICAgICAgIHJldCA9IGxldmVsIC0gcHJlZDsKKyAgICB9IGVsc2UgeworICAgICAgICBsZXZlbCArPSBwcmVkOworICAgICAgICByZXQgICAgPSBsZXZlbDsKKyAgICAgICAgaWYgKHMtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9CSVRTVFJFQU0gfCBBVl9FRl9BR0dSRVNTSVZFKSkgeworICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiZGM8MCBhdCAlZHglZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxldmVsICogc2NhbGUgPiAyMDQ4ICsgc2NhbGUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImRjIG92ZXJmbG93IGF0ICVkeCVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbGV2ZWwgKj0gc2NhbGU7CisgICAgaWYgKGxldmVsICYgKH4yMDQ3KSkgeworICAgICAgICBpZiAobGV2ZWwgPCAwKQorICAgICAgICAgICAgbGV2ZWwgPSAwOworICAgICAgICBlbHNlIGlmICghKHMtPndvcmthcm91bmRfYnVncyAmIEZGX0JVR19EQ19DTElQKSkKKyAgICAgICAgICAgIGxldmVsID0gMjA0NzsKKyAgICB9CisgICAgZGNfdmFsWzBdID0gbGV2ZWw7CisKKyAgICByZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogQVZDT0RFQ19NUEVHNFZJREVPX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWc0dmlkZW9fcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNHZpZGVvX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNWU4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNHZpZGVvX3BhcnNlci5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogTVBFRzQgVmlkZW8gZnJhbWUgZXh0cmFjdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUiAxCisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKKyNpbmNsdWRlICJtcGVnNHZpZGVvX3BhcnNlci5oIgorCitzdHJ1Y3QgTXA0dlBhcnNlQ29udGV4dCB7CisgICAgUGFyc2VDb250ZXh0IHBjOworICAgIE1wZWc0RGVjQ29udGV4dCBkZWNfY3R4OworICAgIGludCBmaXJzdF9waWN0dXJlOworfTsKKworaW50IGZmX21wZWc0X2ZpbmRfZnJhbWVfZW5kKFBhcnNlQ29udGV4dCAqcGMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIGludCB2b3BfZm91bmQsIGk7CisgICAgdWludDMyX3Qgc3RhdGU7CisKKyAgICB2b3BfZm91bmQgPSBwYy0+ZnJhbWVfc3RhcnRfZm91bmQ7CisgICAgc3RhdGUgICAgID0gcGMtPnN0YXRlOworCisgICAgaSA9IDA7CisgICAgaWYgKCF2b3BfZm91bmQpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgYnVmW2ldOworICAgICAgICAgICAgaWYgKHN0YXRlID09IDB4MUI2KSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHZvcF9mb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodm9wX2ZvdW5kKSB7CisgICAgICAgIC8qIEVPRiBjb25zaWRlcmVkIGFzIGVuZCBvZiBmcmFtZSAqLworICAgICAgICBpZiAoYnVmX3NpemUgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3IgKDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgYnVmW2ldOworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIDB4RkZGRkZGMDApID09IDB4MTAwKSB7CisgICAgICAgICAgICAgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gMDsKKyAgICAgICAgICAgICAgICBwYy0+c3RhdGUgICAgICAgICAgICAgPSAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaSAtIDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gdm9wX2ZvdW5kOworICAgIHBjLT5zdGF0ZSAgICAgICAgICAgICA9IHN0YXRlOworICAgIHJldHVybiBFTkRfTk9UX0ZPVU5EOworfQorCisvKiBYWFg6IG1ha2UgaXQgdXNlIGxlc3MgbWVtb3J5ICovCitzdGF0aWMgaW50IG1wZWc0X2RlY29kZV9oZWFkZXIoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMxLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgc3RydWN0IE1wNHZQYXJzZUNvbnRleHQgKnBjID0gczEtPnByaXZfZGF0YTsKKyAgICBNcGVnNERlY0NvbnRleHQgKmRlY19jdHggPSAmcGMtPmRlY19jdHg7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmZGVjX2N0eC0+bTsKKyAgICBHZXRCaXRDb250ZXh0IGdiMSwgKmdiID0gJmdiMTsKKyAgICBpbnQgcmV0OworCisgICAgcy0+YXZjdHggICAgICAgICAgICAgICA9IGF2Y3R4OworICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIgPSAmcy0+Y3VycmVudF9waWN0dXJlOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAmJiBwYy0+Zmlyc3RfcGljdHVyZSkgeworICAgICAgICBpbml0X2dldF9iaXRzKGdiLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKiA4KTsKKyAgICAgICAgcmV0ID0gZmZfbXBlZzRfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKGRlY19jdHgsIGdiKTsKKyAgICAgICAgaWYgKHJldCA8IC0xKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byBwYXJzZSBleHRyYWRhdGFcbiIpOworICAgIH0KKworICAgIGluaXRfZ2V0X2JpdHMoZ2IsIGJ1ZiwgOCAqIGJ1Zl9zaXplKTsKKyAgICByZXQgPSBmZl9tcGVnNF9kZWNvZGVfcGljdHVyZV9oZWFkZXIoZGVjX2N0eCwgZ2IpOworICAgIGlmIChzLT53aWR0aCAmJiAoIWF2Y3R4LT53aWR0aCB8fCAhYXZjdHgtPmhlaWdodCB8fAorICAgICAgICAgICAgICAgICAgICAgIWF2Y3R4LT5jb2RlZF93aWR0aCB8fCAhYXZjdHgtPmNvZGVkX2hlaWdodCkpIHsKKyAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHMtPndpZHRoLCBzLT5oZWlnaHQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmKChzMS0+ZmxhZ3MgJiBQQVJTRVJfRkxBR19VU0VfQ09ERUNfVFMpICYmIHMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuPjAgJiYgcmV0Pj0wKXsKKyAgICAgICAgYXZfYXNzZXJ0MShzMS0+cHRzID09IEFWX05PUFRTX1ZBTFVFKTsKKyAgICAgICAgYXZfYXNzZXJ0MShzMS0+ZHRzID09IEFWX05PUFRTX1ZBTFVFKTsKKworICAgICAgICBzMS0+cHRzID0gYXZfcmVzY2FsZV9xKHMtPnRpbWUsIChBVlJhdGlvbmFsKXsxLCBzLT5hdmN0eC0+dGltZV9iYXNlLmRlbn0sIChBVlJhdGlvbmFsKXsxLCAxMjAwMDAwfSk7CisgICAgfQorCisgICAgczEtPnBpY3RfdHlwZSAgICAgPSBzLT5waWN0X3R5cGU7CisgICAgcGMtPmZpcnN0X3BpY3R1cmUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtcGVnNHZpZGVvX3BhcnNlX2luaXQoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMpCit7CisgICAgc3RydWN0IE1wNHZQYXJzZUNvbnRleHQgKnBjID0gcy0+cHJpdl9kYXRhOworCisgICAgZmZfbXBlZzR2aWRlb2RlY19zdGF0aWNfaW5pdCgpOworCisgICAgcGMtPmZpcnN0X3BpY3R1cmUgICAgICAgICAgID0gMTsKKyAgICBwYy0+ZGVjX2N0eC5tLnF1YW50X3ByZWNpc2lvbiAgICAgPSA1OworICAgIHBjLT5kZWNfY3R4Lm0uc2xpY2VfY29udGV4dF9jb3VudCA9IDE7CisgICAgcGMtPmRlY19jdHguc2hvd2VkX3BhY2tlZF93YXJuaW5nID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVnNHZpZGVvX3BhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgUGFyc2VDb250ZXh0ICpwYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgbmV4dDsKKworICAgIGlmIChzLT5mbGFncyAmIFBBUlNFUl9GTEFHX0NPTVBMRVRFX0ZSQU1FUykgeworICAgICAgICBuZXh0ID0gYnVmX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbmV4dCA9IGZmX21wZWc0X2ZpbmRfZnJhbWVfZW5kKHBjLCBidWYsIGJ1Zl9zaXplKTsKKworICAgICAgICBpZiAoZmZfY29tYmluZV9mcmFtZShwYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgICAgICpwb3V0YnVmICAgICAgPSBOVUxMOworICAgICAgICAgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgbXBlZzRfZGVjb2RlX2hlYWRlcihzLCBhdmN0eCwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICAqcG91dGJ1ZiAgICAgID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gbmV4dDsKK30KKworQVZDb2RlY1BhcnNlciBmZl9tcGVnNHZpZGVvX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX01QRUc0IH0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBNcDR2UGFyc2VDb250ZXh0KSwKKyAgICAucGFyc2VyX2luaXQgICAgPSBtcGVnNHZpZGVvX3BhcnNlX2luaXQsCisgICAgLnBhcnNlcl9wYXJzZSAgID0gbXBlZzR2aWRlb19wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKKyAgICAuc3BsaXQgICAgICAgICAgPSBmZl9tcGVnNHZpZGVvX3NwbGl0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWc0dmlkZW9fcGFyc2VyLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNHZpZGVvX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZjhiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNHZpZGVvX3BhcnNlci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBNUEVHNCB2aWRlbyBwYXJzZXIgcHJvdG90eXBlcworICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01QRUc0VklERU9fUEFSU0VSX0gKKyNkZWZpbmUgQVZDT0RFQ19NUEVHNFZJREVPX1BBUlNFUl9ICisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKworLyoqCisgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWUgaW4gdGhlIGJpdHN0cmVhbS4KKyAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBuZXh0IGZyYW1lLCBvciAtMQorICovCitpbnQgZmZfbXBlZzRfZmluZF9mcmFtZV9lbmQoUGFyc2VDb250ZXh0ICpwYywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpOworCisjZW5kaWYgLyogQVZDT0RFQ19NUEVHNFZJREVPX1BBUlNFUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNHZpZGVvZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNHZpZGVvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhZWNmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWc0dmlkZW9kZWMuYwpAQCAtMCwwICsxLDI4MDkgQEAKKy8qCisgKiBNUEVHNCBkZWNvZGVyLgorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIFVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSIDEKKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAibXBlZzR2aWRlby5oIgorI2luY2x1ZGUgImgyNjMuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ4dmlkaWRjdC5oIgorCisvKiBUaGUgZGVmaW5lcyBiZWxvdyBkZWZpbmUgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgYXJlIHJlYWQgYXQgb25jZSBmb3IKKyAqIHJlYWRpbmcgdmxjIHZhbHVlcy4gQ2hhbmdpbmcgdGhlc2UgbWF5IGltcHJvdmUgc3BlZWQgYW5kIGRhdGEgY2FjaGUgbmVlZHMKKyAqIGJlIGF3YXJlIHRob3VnaCB0aGF0IGRlY3JlYXNpbmcgdGhlbSBtYXkgbmVlZCB0aGUgbnVtYmVyIG9mIHN0YWdlcyB0aGF0IGlzCisgKiBwYXNzZWQgdG8gZ2V0X3ZsYyogdG8gYmUgaW5jcmVhc2VkLiAqLworI2RlZmluZSBTUFJJVEVfVFJBSl9WTENfQklUUyA2CisjZGVmaW5lIERDX1ZMQ19CSVRTIDkKKyNkZWZpbmUgTUJfVFlQRV9CX1ZMQ19CSVRTIDQKKworc3RhdGljIFZMQyBkY19sdW0sIGRjX2Nocm9tOworc3RhdGljIFZMQyBzcHJpdGVfdHJhamVjdG9yeTsKK3N0YXRpYyBWTEMgbWJfdHlwZV9iX3ZsYzsKKworc3RhdGljIGNvbnN0IGludCBtYl90eXBlX2JfbWFwWzRdID0geworICAgIE1CX1RZUEVfRElSRUNUMiB8IE1CX1RZUEVfTDBMMSwKKyAgICBNQl9UWVBFX0wwTDEgICAgfCBNQl9UWVBFXzE2eDE2LAorICAgIE1CX1RZUEVfTDEgICAgICB8IE1CX1RZUEVfMTZ4MTYsCisgICAgTUJfVFlQRV9MMCAgICAgIHwgTUJfVFlQRV8xNngxNiwKK307CisKKy8qKgorICogUHJlZGljdCB0aGUgYWMuCisgKiBAcGFyYW0gbiBibG9jayBpbmRleCAoMC0zIGFyZSBsdW1hLCA0LTUgYXJlIGNocm9tYSkKKyAqIEBwYXJhbSBkaXIgdGhlIGFjIHByZWRpY3Rpb24gZGlyZWN0aW9uCisgKi8KK3ZvaWQgZmZfbXBlZzRfcHJlZF9hYyhNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2ssIGludCBuLCBpbnQgZGlyKQoreworICAgIGludCBpOworICAgIGludDE2X3QgKmFjX3ZhbCwgKmFjX3ZhbDE7CisgICAgaW50OF90ICpjb25zdCBxc2NhbGVfdGFibGUgPSBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlOworCisgICAgLyogZmluZCBwcmVkaWN0aW9uICovCisgICAgYWNfdmFsICA9IHMtPmFjX3ZhbFswXVswXSArIHMtPmJsb2NrX2luZGV4W25dICogMTY7CisgICAgYWNfdmFsMSA9IGFjX3ZhbDsKKyAgICBpZiAocy0+YWNfcHJlZCkgeworICAgICAgICBpZiAoZGlyID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB4eSA9IHMtPm1iX3ggLSAxICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKKyAgICAgICAgICAgIC8qIGxlZnQgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgYWNfdmFsIC09IDE2OworCisgICAgICAgICAgICBpZiAocy0+bWJfeCA9PSAwIHx8IHMtPnFzY2FsZSA9PSBxc2NhbGVfdGFibGVbeHldIHx8CisgICAgICAgICAgICAgICAgbiA9PSAxIHx8IG4gPT0gMykgeworICAgICAgICAgICAgICAgIC8qIHNhbWUgcXNjYWxlICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2kgPDwgM11dICs9IGFjX3ZhbFtpXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZGlmZmVyZW50IHFzY2FsZSwgd2UgbXVzdCByZXNjYWxlICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2kgPDwgM11dICs9IFJPVU5ERURfRElWKGFjX3ZhbFtpXSAqIHFzY2FsZV90YWJsZVt4eV0sIHMtPnFzY2FsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBpbnQgeHkgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZSAtIHMtPm1iX3N0cmlkZTsKKyAgICAgICAgICAgIC8qIHRvcCBwcmVkaWN0aW9uICovCisgICAgICAgICAgICBhY192YWwgLT0gMTYgKiBzLT5ibG9ja193cmFwW25dOworCisgICAgICAgICAgICBpZiAocy0+bWJfeSA9PSAwIHx8IHMtPnFzY2FsZSA9PSBxc2NhbGVfdGFibGVbeHldIHx8CisgICAgICAgICAgICAgICAgbiA9PSAyIHx8IG4gPT0gMykgeworICAgICAgICAgICAgICAgIC8qIHNhbWUgcXNjYWxlICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ldXSArPSBhY192YWxbaSArIDhdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBkaWZmZXJlbnQgcXNjYWxlLCB3ZSBtdXN0IHJlc2NhbGUgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgICAgICAgICBibG9ja1tzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV1dICs9IFJPVU5ERURfRElWKGFjX3ZhbFtpICsgOF0gKiBxc2NhbGVfdGFibGVbeHldLCBzLT5xc2NhbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIGxlZnQgY29weSAqLworICAgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspCisgICAgICAgIGFjX3ZhbDFbaV0gPSBibG9ja1tzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baSA8PCAzXV07CisKKyAgICAvKiB0b3AgY29weSAqLworICAgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspCisgICAgICAgIGFjX3ZhbDFbOCArIGldID0gYmxvY2tbcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ldXTsKK30KKworLyoqCisgKiBjaGVjayBpZiB0aGUgbmV4dCBzdHVmZiBpcyBhIHJlc3luYyBtYXJrZXIgb3IgdGhlIGVuZC4KKyAqIEByZXR1cm4gMCBpZiBub3QKKyAqLworc3RhdGljIGlubGluZSBpbnQgbXBlZzRfaXNfcmVzeW5jKE1wZWc0RGVjQ29udGV4dCAqY3R4KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKKyAgICBpbnQgYml0c19jb3VudCA9IGdldF9iaXRzX2NvdW50KCZzLT5nYik7CisgICAgaW50IHYgICAgICAgICAgPSBzaG93X2JpdHMoJnMtPmdiLCAxNik7CisKKyAgICBpZiAocy0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX05PX1BBRERJTkcgJiYgIWN0eC0+cmVzeW5jX21hcmtlcikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB3aGlsZSAodiA8PSAweEZGKSB7CisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgfHwKKyAgICAgICAgICAgICh2ID4+ICg4IC0gcy0+cGljdF90eXBlKSAhPSAxKSB8fCBzLT5wYXJ0aXRpb25lZF9mcmFtZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA4ICsgcy0+cGljdF90eXBlKTsKKyAgICAgICAgYml0c19jb3VudCArPSA4ICsgcy0+cGljdF90eXBlOworICAgICAgICB2ID0gc2hvd19iaXRzKCZzLT5nYiwgMTYpOworICAgIH0KKworICAgIGlmIChiaXRzX2NvdW50ICsgOCA+PSBzLT5nYi5zaXplX2luX2JpdHMpIHsKKyAgICAgICAgdiA+Pj0gODsKKyAgICAgICAgdiAgfD0gMHg3RiA+PiAoNyAtIChiaXRzX2NvdW50ICYgNykpOworCisgICAgICAgIGlmICh2ID09IDB4N0YpCisgICAgICAgICAgICByZXR1cm4gcy0+bWJfbnVtOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh2ID09IGZmX21wZWc0X3Jlc3luY19wcmVmaXhbYml0c19jb3VudCAmIDddKSB7CisgICAgICAgICAgICBpbnQgbGVuLCBtYl9udW07CisgICAgICAgICAgICBpbnQgbWJfbnVtX2JpdHMgPSBhdl9sb2cyKHMtPm1iX251bSAtIDEpICsgMTsKKyAgICAgICAgICAgIEdldEJpdENvbnRleHQgZ2IgPSBzLT5nYjsKKworICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMSk7CisgICAgICAgICAgICBhbGlnbl9nZXRfYml0cygmcy0+Z2IpOworCisgICAgICAgICAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IDMyOyBsZW4rKykKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBtYl9udW0gPSBnZXRfYml0cygmcy0+Z2IsIG1iX251bV9iaXRzKTsKKyAgICAgICAgICAgIGlmICghbWJfbnVtIHx8IG1iX251bSA+IHMtPm1iX251bSB8fCBnZXRfYml0c19jb3VudCgmcy0+Z2IpKzYgPiBzLT5nYi5zaXplX2luX2JpdHMpCisgICAgICAgICAgICAgICAgbWJfbnVtPSAtMTsKKworICAgICAgICAgICAgcy0+Z2IgPSBnYjsKKworICAgICAgICAgICAgaWYgKGxlbiA+PSBmZl9tcGVnNF9nZXRfdmlkZW9fcGFja2V0X3ByZWZpeF9sZW5ndGgocykpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1iX251bTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVnNF9kZWNvZGVfc3ByaXRlX3RyYWplY3RvcnkoTXBlZzREZWNDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKKyAgICBpbnQgYSAgICAgPSAyIDw8IHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5OworICAgIGludCByaG8gICA9IDMgIC0gcy0+c3ByaXRlX3dhcnBpbmdfYWNjdXJhY3k7CisgICAgaW50IHIgICAgID0gMTYgLyBhOworICAgIGludCBhbHBoYSA9IDA7CisgICAgaW50IGJldGEgID0gMDsKKyAgICBpbnQgdyAgICAgPSBzLT53aWR0aDsKKyAgICBpbnQgaCAgICAgPSBzLT5oZWlnaHQ7CisgICAgaW50IG1pbl9hYiwgaSwgdzIsIGgyLCB3MywgaDM7CisgICAgaW50IHNwcml0ZV9yZWZbNF1bMl07CisgICAgaW50IHZpcnR1YWxfcmVmWzJdWzJdOworCisgICAgLy8gb25seSB0cnVlIGZvciByZWN0YW5nbGUgc2hhcGVzCisgICAgY29uc3QgaW50IHZvcF9yZWZbNF1bMl0gPSB7IHsgMCwgMCB9LCAgICAgICAgIHsgcy0+d2lkdGgsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLCBzLT5oZWlnaHQgfSwgeyBzLT53aWR0aCwgcy0+aGVpZ2h0IH0gfTsKKyAgICBpbnQgZFs0XVsyXSAgICAgICAgICAgICA9IHsgeyAwLCAwIH0sIHsgMCwgMCB9LCB7IDAsIDAgfSwgeyAwLCAwIH0gfTsKKworICAgIGlmICh3IDw9IDAgfHwgaCA8PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm51bV9zcHJpdGVfd2FycGluZ19wb2ludHM7IGkrKykgeworICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICBpbnQgeCA9IDAsIHkgPSAwOworCisgICAgICAgIGxlbmd0aCA9IGdldF92bGMyKGdiLCBzcHJpdGVfdHJhamVjdG9yeS50YWJsZSwgU1BSSVRFX1RSQUpfVkxDX0JJVFMsIDMpOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgeCA9IGdldF94Yml0cyhnYiwgbGVuZ3RoKTsKKworICAgICAgICBpZiAoIShjdHgtPmRpdnhfdmVyc2lvbiA9PSA1MDAgJiYgY3R4LT5kaXZ4X2J1aWxkID09IDQxMykpCisgICAgICAgICAgICBza2lwX2JpdHMxKGdiKTsgICAgIC8qIG1hcmtlciBiaXQgKi8KKworICAgICAgICBsZW5ndGggPSBnZXRfdmxjMihnYiwgc3ByaXRlX3RyYWplY3RvcnkudGFibGUsIFNQUklURV9UUkFKX1ZMQ19CSVRTLCAzKTsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIHkgPSBnZXRfeGJpdHMoZ2IsIGxlbmd0aCk7CisKKyAgICAgICAgc2tpcF9iaXRzMShnYik7ICAgICAgICAgLyogbWFya2VyIGJpdCAqLworICAgICAgICBjdHgtPnNwcml0ZV90cmFqW2ldWzBdID0gZFtpXVswXSA9IHg7CisgICAgICAgIGN0eC0+c3ByaXRlX3RyYWpbaV1bMV0gPSBkW2ldWzFdID0geTsKKyAgICB9CisgICAgZm9yICg7IGkgPCA0OyBpKyspCisgICAgICAgIGN0eC0+c3ByaXRlX3RyYWpbaV1bMF0gPSBjdHgtPnNwcml0ZV90cmFqW2ldWzFdID0gMDsKKworICAgIHdoaWxlICgoMSA8PCBhbHBoYSkgPCB3KQorICAgICAgICBhbHBoYSsrOworICAgIHdoaWxlICgoMSA8PCBiZXRhKSA8IGgpCisgICAgICAgIGJldGErKzsgIC8qIHR5cG8gaW4gdGhlIG1wZWc0IHN0ZCBmb3IgdGhlIGRlZmluaXRpb24gb2YgdycgYW5kIGgnICovCisgICAgdzIgPSAxIDw8IGFscGhhOworICAgIGgyID0gMSA8PCBiZXRhOworCisgICAgLy8gTm90ZSwgdGhlIDR0aCBwb2ludCBpc24ndCB1c2VkIGZvciBHTUMKKyAgICBpZiAoY3R4LT5kaXZ4X3ZlcnNpb24gPT0gNTAwICYmIGN0eC0+ZGl2eF9idWlsZCA9PSA0MTMpIHsKKyAgICAgICAgc3ByaXRlX3JlZlswXVswXSA9IGEgKiB2b3BfcmVmWzBdWzBdICsgZFswXVswXTsKKyAgICAgICAgc3ByaXRlX3JlZlswXVsxXSA9IGEgKiB2b3BfcmVmWzBdWzFdICsgZFswXVsxXTsKKyAgICAgICAgc3ByaXRlX3JlZlsxXVswXSA9IGEgKiB2b3BfcmVmWzFdWzBdICsgZFswXVswXSArIGRbMV1bMF07CisgICAgICAgIHNwcml0ZV9yZWZbMV1bMV0gPSBhICogdm9wX3JlZlsxXVsxXSArIGRbMF1bMV0gKyBkWzFdWzFdOworICAgICAgICBzcHJpdGVfcmVmWzJdWzBdID0gYSAqIHZvcF9yZWZbMl1bMF0gKyBkWzBdWzBdICsgZFsyXVswXTsKKyAgICAgICAgc3ByaXRlX3JlZlsyXVsxXSA9IGEgKiB2b3BfcmVmWzJdWzFdICsgZFswXVsxXSArIGRbMl1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3ByaXRlX3JlZlswXVswXSA9IChhID4+IDEpICogKDIgKiB2b3BfcmVmWzBdWzBdICsgZFswXVswXSk7CisgICAgICAgIHNwcml0ZV9yZWZbMF1bMV0gPSAoYSA+PiAxKSAqICgyICogdm9wX3JlZlswXVsxXSArIGRbMF1bMV0pOworICAgICAgICBzcHJpdGVfcmVmWzFdWzBdID0gKGEgPj4gMSkgKiAoMiAqIHZvcF9yZWZbMV1bMF0gKyBkWzBdWzBdICsgZFsxXVswXSk7CisgICAgICAgIHNwcml0ZV9yZWZbMV1bMV0gPSAoYSA+PiAxKSAqICgyICogdm9wX3JlZlsxXVsxXSArIGRbMF1bMV0gKyBkWzFdWzFdKTsKKyAgICAgICAgc3ByaXRlX3JlZlsyXVswXSA9IChhID4+IDEpICogKDIgKiB2b3BfcmVmWzJdWzBdICsgZFswXVswXSArIGRbMl1bMF0pOworICAgICAgICBzcHJpdGVfcmVmWzJdWzFdID0gKGEgPj4gMSkgKiAoMiAqIHZvcF9yZWZbMl1bMV0gKyBkWzBdWzFdICsgZFsyXVsxXSk7CisgICAgfQorICAgIC8qIHNwcml0ZV9yZWZbM11bMF0gPSAoYSA+PiAxKSAqICgyICogdm9wX3JlZlszXVswXSArIGRbMF1bMF0gKyBkWzFdWzBdICsgZFsyXVswXSArIGRbM11bMF0pOworICAgICAqIHNwcml0ZV9yZWZbM11bMV0gPSAoYSA+PiAxKSAqICgyICogdm9wX3JlZlszXVsxXSArIGRbMF1bMV0gKyBkWzFdWzFdICsgZFsyXVsxXSArIGRbM11bMV0pOyAqLworCisgICAgLyogdGhpcyBpcyBtb3N0bHkgaWRlbnRpY2FsIHRvIHRoZSBtcGVnNCBzdGQgKGFuZCBpcyB0b3RhbGx5IHVucmVhZGFibGUKKyAgICAgKiBiZWNhdXNlIG9mIHRoYXQuLi4pLiBQZXJoYXBzIGl0IHNob3VsZCBiZSByZW9yZGVyZWQgdG8gYmUgbW9yZSByZWFkYWJsZS4KKyAgICAgKiBUaGUgaWRlYSBiZWhpbmQgdGhpcyB2aXJ0dWFsX3JlZiBtZXNzIGlzIHRvIGJlIGFibGUgdG8gdXNlIHNoaWZ0cyBsYXRlcgorICAgICAqIHBlciBwaXhlbCBpbnN0ZWFkIG9mIGRpdmlkZXMgc28gdGhlIGRpc3RhbmNlIGJldHdlZW4gcG9pbnRzIGlzIGNvbnZlcnRlZAorICAgICAqIGZyb20gdyZoIGJhc2VkIHRvIHcyJmgyIGJhc2VkIHdoaWNoIGFyZSBvZiB0aGUgMl54IGZvcm0uICovCisgICAgdmlydHVhbF9yZWZbMF1bMF0gPSAxNiAqICh2b3BfcmVmWzBdWzBdICsgdzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBST1VOREVEX0RJVigoKHcgLSB3MikgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAociAqIHNwcml0ZV9yZWZbMF1bMF0gLSAxNiAqIHZvcF9yZWZbMF1bMF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzIgKiAociAqIHNwcml0ZV9yZWZbMV1bMF0gLSAxNiAqIHZvcF9yZWZbMV1bMF0pKSwgdyk7CisgICAgdmlydHVhbF9yZWZbMF1bMV0gPSAxNiAqIHZvcF9yZWZbMF1bMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgUk9VTkRFRF9ESVYoKCh3IC0gdzIpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAociAqIHNwcml0ZV9yZWZbMF1bMV0gLSAxNiAqIHZvcF9yZWZbMF1bMV0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3MiAqIChyICogc3ByaXRlX3JlZlsxXVsxXSAtIDE2ICogdm9wX3JlZlsxXVsxXSkpLCB3KTsKKyAgICB2aXJ0dWFsX3JlZlsxXVswXSA9IDE2ICogdm9wX3JlZlswXVswXSArCisgICAgICAgICAgICAgICAgICAgICAgICBST1VOREVEX0RJVigoKGggLSBoMikgKiAociAqIHNwcml0ZV9yZWZbMF1bMF0gLSAxNiAqIHZvcF9yZWZbMF1bMF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMiAqIChyICogc3ByaXRlX3JlZlsyXVswXSAtIDE2ICogdm9wX3JlZlsyXVswXSkpLCBoKTsKKyAgICB2aXJ0dWFsX3JlZlsxXVsxXSA9IDE2ICogKHZvcF9yZWZbMF1bMV0gKyBoMikgKworICAgICAgICAgICAgICAgICAgICAgICAgUk9VTkRFRF9ESVYoKChoIC0gaDIpICogKHIgKiBzcHJpdGVfcmVmWzBdWzFdIC0gMTYgKiB2b3BfcmVmWzBdWzFdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDIgKiAociAqIHNwcml0ZV9yZWZbMl1bMV0gLSAxNiAqIHZvcF9yZWZbMl1bMV0pKSwgaCk7CisKKyAgICBzd2l0Y2ggKGN0eC0+bnVtX3Nwcml0ZV93YXJwaW5nX3BvaW50cykgeworICAgIGNhc2UgMDoKKyAgICAgICAgcy0+c3ByaXRlX29mZnNldFswXVswXSA9CisgICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMV0gPQorICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzFdWzBdID0KKyAgICAgICAgcy0+c3ByaXRlX29mZnNldFsxXVsxXSA9IDA7CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVswXSAgPSBhOworICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMF1bMV0gID0KKyAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzFdWzBdICA9IDA7CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVsxXSAgPSBhOworICAgICAgICBjdHgtPnNwcml0ZV9zaGlmdFswXSAgID0KKyAgICAgICAgY3R4LT5zcHJpdGVfc2hpZnRbMV0gICA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTogICAgIC8vIEdNQyBvbmx5CisgICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMF0gPSBzcHJpdGVfcmVmWzBdWzBdIC0gYSAqIHZvcF9yZWZbMF1bMF07CisgICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMV0gPSBzcHJpdGVfcmVmWzBdWzFdIC0gYSAqIHZvcF9yZWZbMF1bMV07CisgICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMV1bMF0gPSAoKHNwcml0ZV9yZWZbMF1bMF0gPj4gMSkgfCAoc3ByaXRlX3JlZlswXVswXSAmIDEpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICogKHZvcF9yZWZbMF1bMF0gLyAyKTsKKyAgICAgICAgcy0+c3ByaXRlX29mZnNldFsxXVsxXSA9ICgoc3ByaXRlX3JlZlswXVsxXSA+PiAxKSB8IChzcHJpdGVfcmVmWzBdWzFdICYgMSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgKiAodm9wX3JlZlswXVsxXSAvIDIpOworICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMF1bMF0gID0gYTsKKyAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzBdWzFdICA9CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVswXSAgPSAwOworICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMV1bMV0gID0gYTsKKyAgICAgICAgY3R4LT5zcHJpdGVfc2hpZnRbMF0gICA9CisgICAgICAgIGN0eC0+c3ByaXRlX3NoaWZ0WzFdICAgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMF0gPSAoc3ByaXRlX3JlZlswXVswXSA8PCAoYWxwaGEgKyByaG8pKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMF1bMF0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtdm9wX3JlZlswXVswXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIgKiBzcHJpdGVfcmVmWzBdWzFdIC0gdmlydHVhbF9yZWZbMF1bMV0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtdm9wX3JlZlswXVsxXSkgKyAoMSA8PCAoYWxwaGEgKyByaG8gLSAxKSk7CisgICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMV0gPSAoc3ByaXRlX3JlZlswXVsxXSA8PCAoYWxwaGEgKyByaG8pKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXIgKiBzcHJpdGVfcmVmWzBdWzFdICsgdmlydHVhbF9yZWZbMF1bMV0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtdm9wX3JlZlswXVswXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC1yICogc3ByaXRlX3JlZlswXVswXSArIHZpcnR1YWxfcmVmWzBdWzBdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXZvcF9yZWZbMF1bMV0pICsgKDEgPDwgKGFscGhhICsgcmhvIC0gMSkpOworICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzFdWzBdID0gKCgtciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlswXVswXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMiAqIHZvcF9yZWZbMF1bMF0gKyAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIgKiBzcHJpdGVfcmVmWzBdWzFdIC0gdmlydHVhbF9yZWZbMF1bMV0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIgKiB2b3BfcmVmWzBdWzFdICsgMSkgKyAyICogdzIgKiByICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfcmVmWzBdWzBdIC0gMTYgKiB3MiArICgxIDw8IChhbHBoYSArIHJobyArIDEpKSk7CisgICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMV1bMV0gPSAoKC1yICogc3ByaXRlX3JlZlswXVsxXSArIHZpcnR1YWxfcmVmWzBdWzFdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yICogdm9wX3JlZlswXVswXSArIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMF1bMF0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIgKiB2b3BfcmVmWzBdWzFdICsgMSkgKyAyICogdzIgKiByICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfcmVmWzBdWzFdIC0gMTYgKiB3MiArICgxIDw8IChhbHBoYSArIHJobyArIDEpKSk7CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVswXSA9ICgtciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlswXVswXSk7CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVsxXSA9ICgrciAqIHNwcml0ZV9yZWZbMF1bMV0gLSB2aXJ0dWFsX3JlZlswXVsxXSk7CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVswXSA9ICgtciAqIHNwcml0ZV9yZWZbMF1bMV0gKyB2aXJ0dWFsX3JlZlswXVsxXSk7CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVsxXSA9ICgtciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlswXVswXSk7CisKKyAgICAgICAgY3R4LT5zcHJpdGVfc2hpZnRbMF0gID0gYWxwaGEgKyByaG87CisgICAgICAgIGN0eC0+c3ByaXRlX3NoaWZ0WzFdICA9IGFscGhhICsgcmhvICsgMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBtaW5fYWIgPSBGRk1JTihhbHBoYSwgYmV0YSk7CisgICAgICAgIHczICAgICA9IHcyID4+IG1pbl9hYjsKKyAgICAgICAgaDMgICAgID0gaDIgPj4gbWluX2FiOworICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzBdWzBdID0gKHNwcml0ZV9yZWZbMF1bMF0gPDwgKGFscGhhICsgYmV0YSArIHJobyAtIG1pbl9hYikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlswXVswXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDMgKiAoLXZvcF9yZWZbMF1bMF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlsxXVswXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzMgKiAoLXZvcF9yZWZbMF1bMV0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IChhbHBoYSArIGJldGEgKyByaG8gLSBtaW5fYWIgLSAxKSk7CisgICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMV0gPSAoc3ByaXRlX3JlZlswXVsxXSA8PCAoYWxwaGEgKyBiZXRhICsgcmhvIC0gbWluX2FiKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC1yICogc3ByaXRlX3JlZlswXVsxXSArIHZpcnR1YWxfcmVmWzBdWzFdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMyAqICgtdm9wX3JlZlswXVswXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC1yICogc3ByaXRlX3JlZlswXVsxXSArIHZpcnR1YWxfcmVmWzFdWzFdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3MyAqICgtdm9wX3JlZlswXVsxXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgKGFscGhhICsgYmV0YSArIHJobyAtIG1pbl9hYiAtIDEpKTsKKyAgICAgICAgcy0+c3ByaXRlX29mZnNldFsxXVswXSA9ICgtciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlswXVswXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDMgKiAoLTIgKiB2b3BfcmVmWzBdWzBdICsgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC1yICogc3ByaXRlX3JlZlswXVswXSArIHZpcnR1YWxfcmVmWzFdWzBdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3MyAqICgtMiAqIHZvcF9yZWZbMF1bMV0gKyAxKSArIDIgKiB3MiAqIGgzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgKiBzcHJpdGVfcmVmWzBdWzBdIC0gMTYgKiB3MiAqIGgzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IChhbHBoYSArIGJldGEgKyByaG8gLSBtaW5fYWIgKyAxKSk7CisgICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMV1bMV0gPSAoLXIgKiBzcHJpdGVfcmVmWzBdWzFdICsgdmlydHVhbF9yZWZbMF1bMV0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgzICogKC0yICogdm9wX3JlZlswXVswXSArIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtciAqIHNwcml0ZV9yZWZbMF1bMV0gKyB2aXJ0dWFsX3JlZlsxXVsxXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzMgKiAoLTIgKiB2b3BfcmVmWzBdWzFdICsgMSkgKyAyICogdzIgKiBoMyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICogc3ByaXRlX3JlZlswXVsxXSAtIDE2ICogdzIgKiBoMyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAoYWxwaGEgKyBiZXRhICsgcmhvIC0gbWluX2FiICsgMSkpOworICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMF1bMF0gPSAoLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMF1bMF0pICogaDM7CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVsxXSA9ICgtciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlsxXVswXSkgKiB3MzsKKyAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzFdWzBdID0gKC1yICogc3ByaXRlX3JlZlswXVsxXSArIHZpcnR1YWxfcmVmWzBdWzFdKSAqIGgzOworICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMV1bMV0gPSAoLXIgKiBzcHJpdGVfcmVmWzBdWzFdICsgdmlydHVhbF9yZWZbMV1bMV0pICogdzM7CisKKyAgICAgICAgY3R4LT5zcHJpdGVfc2hpZnRbMF0gID0gYWxwaGEgKyBiZXRhICsgcmhvIC0gbWluX2FiOworICAgICAgICBjdHgtPnNwcml0ZV9zaGlmdFsxXSAgPSBhbHBoYSArIGJldGEgKyByaG8gLSBtaW5fYWIgKyAyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgLyogdHJ5IHRvIHNpbXBsaWZ5IHRoZSBzaXR1YXRpb24gKi8KKyAgICBpZiAocy0+c3ByaXRlX2RlbHRhWzBdWzBdID09IGEgPDwgY3R4LT5zcHJpdGVfc2hpZnRbMF0gJiYKKyAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzBdWzFdID09IDAgJiYKKyAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzFdWzBdID09IDAgJiYKKyAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzFdWzFdID09IGEgPDwgY3R4LT5zcHJpdGVfc2hpZnRbMF0pIHsKKyAgICAgICAgcy0+c3ByaXRlX29mZnNldFswXVswXSA+Pj0gY3R4LT5zcHJpdGVfc2hpZnRbMF07CisgICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMV0gPj49IGN0eC0+c3ByaXRlX3NoaWZ0WzBdOworICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzFdWzBdID4+PSBjdHgtPnNwcml0ZV9zaGlmdFsxXTsKKyAgICAgICAgcy0+c3ByaXRlX29mZnNldFsxXVsxXSA+Pj0gY3R4LT5zcHJpdGVfc2hpZnRbMV07CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVswXSA9IGE7CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVsxXSA9IDA7CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVswXSA9IDA7CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVsxXSA9IGE7CisgICAgICAgIGN0eC0+c3ByaXRlX3NoaWZ0WzBdID0gMDsKKyAgICAgICAgY3R4LT5zcHJpdGVfc2hpZnRbMV0gPSAwOworICAgICAgICBzLT5yZWFsX3Nwcml0ZV93YXJwaW5nX3BvaW50cyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHNoaWZ0X3kgPSAxNiAtIGN0eC0+c3ByaXRlX3NoaWZ0WzBdOworICAgICAgICBpbnQgc2hpZnRfYyA9IDE2IC0gY3R4LT5zcHJpdGVfc2hpZnRbMV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1baV0gPDw9IHNoaWZ0X3k7CisgICAgICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzFdW2ldIDw8PSBzaGlmdF9jOworICAgICAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzBdW2ldICA8PD0gc2hpZnRfeTsKKyAgICAgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVtpXSAgPDw9IHNoaWZ0X3k7CisgICAgICAgICAgICBjdHgtPnNwcml0ZV9zaGlmdFtpXSAgICAgPSAxNjsKKyAgICAgICAgfQorICAgICAgICBzLT5yZWFsX3Nwcml0ZV93YXJwaW5nX3BvaW50cyA9IGN0eC0+bnVtX3Nwcml0ZV93YXJwaW5nX3BvaW50czsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfbmV3X3ByZWQoTXBlZzREZWNDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiKSB7CisgICAgaW50IGxlbiA9IEZGTUlOKGN0eC0+dGltZV9pbmNyZW1lbnRfYml0cyArIDMsIDE1KTsKKworICAgIGdldF9iaXRzKGdiLCBsZW4pOworICAgIGlmIChnZXRfYml0czEoZ2IpKQorICAgICAgICBnZXRfYml0cyhnYiwgbGVuKTsKKyAgICBjaGVja19tYXJrZXIoZ2IsICJhZnRlciBuZXdfcHJlZCIpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVjb2RlIHRoZSBuZXh0IHZpZGVvIHBhY2tldC4KKyAqIEByZXR1cm4gPDAgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAqLworaW50IGZmX21wZWc0X2RlY29kZV92aWRlb19wYWNrZXRfaGVhZGVyKE1wZWc0RGVjQ29udGV4dCAqY3R4KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKKworICAgIGludCBtYl9udW1fYml0cyAgICAgID0gYXZfbG9nMihzLT5tYl9udW0gLSAxKSArIDE7CisgICAgaW50IGhlYWRlcl9leHRlbnNpb24gPSAwLCBtYl9udW0sIGxlbjsKKworICAgIC8qIGlzIHRoZXJlIGVub3VnaCBzcGFjZSBsZWZ0IGZvciBhIHZpZGVvIHBhY2tldCArIGhlYWRlciAqLworICAgIGlmIChnZXRfYml0c19jb3VudCgmcy0+Z2IpID4gcy0+Z2Iuc2l6ZV9pbl9iaXRzIC0gMjApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAobGVuID0gMDsgbGVuIDwgMzI7IGxlbisrKQorICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgICAgICBicmVhazsKKworICAgIGlmIChsZW4gIT0gZmZfbXBlZzRfZ2V0X3ZpZGVvX3BhY2tldF9wcmVmaXhfbGVuZ3RoKHMpKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibWFya2VyIGRvZXMgbm90IG1hdGNoIGZfY29kZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5zaGFwZSAhPSBSRUNUX1NIQVBFKSB7CisgICAgICAgIGhlYWRlcl9leHRlbnNpb24gPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgLy8gRklYTUUgbW9yZSBzdHVmZiBoZXJlCisgICAgfQorCisgICAgbWJfbnVtID0gZ2V0X2JpdHMoJnMtPmdiLCBtYl9udW1fYml0cyk7CisgICAgaWYgKG1iX251bSA+PSBzLT5tYl9udW0pIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiaWxsZWdhbCBtYl9udW0gaW4gdmlkZW8gcGFja2V0ICglZCAlZCkgXG4iLCBtYl9udW0sIHMtPm1iX251bSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzLT5tYl94ID0gbWJfbnVtICUgcy0+bWJfd2lkdGg7CisgICAgcy0+bWJfeSA9IG1iX251bSAvIHMtPm1iX3dpZHRoOworCisgICAgaWYgKGN0eC0+c2hhcGUgIT0gQklOX09OTFlfU0hBUEUpIHsKKyAgICAgICAgaW50IHFzY2FsZSA9IGdldF9iaXRzKCZzLT5nYiwgcy0+cXVhbnRfcHJlY2lzaW9uKTsKKyAgICAgICAgaWYgKHFzY2FsZSkKKyAgICAgICAgICAgIHMtPmNocm9tYV9xc2NhbGUgPSBzLT5xc2NhbGUgPSBxc2NhbGU7CisgICAgfQorCisgICAgaWYgKGN0eC0+c2hhcGUgPT0gUkVDVF9TSEFQRSkKKyAgICAgICAgaGVhZGVyX2V4dGVuc2lvbiA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgaWYgKGhlYWRlcl9leHRlbnNpb24pIHsKKyAgICAgICAgaW50IHRpbWVfaW5jciA9IDA7CisKKyAgICAgICAgd2hpbGUgKGdldF9iaXRzMSgmcy0+Z2IpICE9IDApCisgICAgICAgICAgICB0aW1lX2luY3IrKzsKKworICAgICAgICBjaGVja19tYXJrZXIoJnMtPmdiLCAiYmVmb3JlIHRpbWVfaW5jcmVtZW50IGluIHZpZGVvIHBhY2tlZCBoZWFkZXIiKTsKKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgY3R4LT50aW1lX2luY3JlbWVudF9iaXRzKTsgICAgICAvKiB0aW1lX2luY3JlbWVudCAqLworICAgICAgICBjaGVja19tYXJrZXIoJnMtPmdiLCAiYmVmb3JlIHZvcF9jb2RpbmdfdHlwZSBpbiB2aWRlbyBwYWNrZWQgaGVhZGVyIik7CisKKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMik7IC8qIHZvcCBjb2RpbmcgdHlwZSAqLworICAgICAgICAvLyBGSVhNRSBub3QgcmVjdCBzdHVmZiBoZXJlCisKKyAgICAgICAgaWYgKGN0eC0+c2hhcGUgIT0gQklOX09OTFlfU0hBUEUpIHsKKyAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMpOyAvKiBpbnRyYSBkYyB2bGMgdGhyZXNob2xkICovCisgICAgICAgICAgICAvLyBGSVhNRSBkb24ndCBqdXN0IGlnbm9yZSBldmVyeXRoaW5nCisgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9TICYmCisgICAgICAgICAgICAgICAgY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IEdNQ19TUFJJVEUpIHsKKyAgICAgICAgICAgICAgICBpZiAobXBlZzRfZGVjb2RlX3Nwcml0ZV90cmFqZWN0b3J5KGN0eCwgJnMtPmdiKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidW50ZXN0ZWRcbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGSVhNRSByZWR1Y2VkIHJlcyBzdHVmZiBoZXJlCisKKyAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgICAgICAgICBpbnQgZl9jb2RlID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsgICAgICAgLyogZmNvZGVfZm9yICovCisgICAgICAgICAgICAgICAgaWYgKGZfY29kZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciwgdmlkZW8gcGFja2V0IGhlYWRlciBkYW1hZ2VkIChmX2NvZGU9MClcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICAgICAgICAgIGludCBiX2NvZGUgPSBnZXRfYml0cygmcy0+Z2IsIDMpOworICAgICAgICAgICAgICAgIGlmIChiX2NvZGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IsIHZpZGVvIHBhY2tldCBoZWFkZXIgZGFtYWdlZCAoYl9jb2RlPTApXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY3R4LT5uZXdfcHJlZCkKKyAgICAgICAgZGVjb2RlX25ld19wcmVkKGN0eCwgJnMtPmdiKTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEdldCB0aGUgYXZlcmFnZSBtb3Rpb24gdmVjdG9yIGZvciBhIEdNQyBNQi4KKyAqIEBwYXJhbSBuIGVpdGhlciAwIGZvciB0aGUgeCBjb21wb25lbnQgb3IgMSBmb3IgeQorICogQHJldHVybiB0aGUgYXZlcmFnZSBNViBmb3IgYSBHTUMgTUIKKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X2FtdihNcGVnNERlY0NvbnRleHQgKmN0eCwgaW50IG4pCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmY3R4LT5tOworICAgIGludCB4LCB5LCBtYl92LCBzdW0sIGR4LCBkeSwgc2hpZnQ7CisgICAgaW50IGxlbiAgICAgPSAxIDw8IChzLT5mX2NvZGUgKyA0KTsKKyAgICBjb25zdCBpbnQgYSA9IHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5OworCisgICAgaWYgKHMtPndvcmthcm91bmRfYnVncyAmIEZGX0JVR19BTVYpCisgICAgICAgIGxlbiA+Pj0gcy0+cXVhcnRlcl9zYW1wbGU7CisKKyAgICBpZiAocy0+cmVhbF9zcHJpdGVfd2FycGluZ19wb2ludHMgPT0gMSkgeworICAgICAgICBpZiAoY3R4LT5kaXZ4X3ZlcnNpb24gPT0gNTAwICYmIGN0eC0+ZGl2eF9idWlsZCA9PSA0MTMpCisgICAgICAgICAgICBzdW0gPSBzLT5zcHJpdGVfb2Zmc2V0WzBdW25dIC8gKDEgPDwgKGEgLSBzLT5xdWFydGVyX3NhbXBsZSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdW0gPSBSU0hJRlQocy0+c3ByaXRlX29mZnNldFswXVtuXSA8PCBzLT5xdWFydGVyX3NhbXBsZSwgYSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHggICAgPSBzLT5zcHJpdGVfZGVsdGFbbl1bMF07CisgICAgICAgIGR5ICAgID0gcy0+c3ByaXRlX2RlbHRhW25dWzFdOworICAgICAgICBzaGlmdCA9IGN0eC0+c3ByaXRlX3NoaWZ0WzBdOworICAgICAgICBpZiAobikKKyAgICAgICAgICAgIGR5IC09IDEgPDwgKHNoaWZ0ICsgYSArIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkeCAtPSAxIDw8IChzaGlmdCArIGEgKyAxKTsKKyAgICAgICAgbWJfdiA9IHMtPnNwcml0ZV9vZmZzZXRbMF1bbl0gKyBkeCAqIHMtPm1iX3ggKiAxNiArIGR5ICogcy0+bWJfeSAqIDE2OworCisgICAgICAgIHN1bSA9IDA7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgICAgICBpbnQgdjsKKworICAgICAgICAgICAgdiA9IG1iX3YgKyBkeSAqIHk7CisgICAgICAgICAgICAvLyBGSVhNRSBvcHRpbWl6ZQorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gdiA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICB2ICAgKz0gZHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3VtID0gUlNISUZUKHN1bSwgYSArIDggLSBzLT5xdWFydGVyX3NhbXBsZSk7CisgICAgfQorCisgICAgaWYgKHN1bSA8IC1sZW4pCisgICAgICAgIHN1bSA9IC1sZW47CisgICAgZWxzZSBpZiAoc3VtID49IGxlbikKKyAgICAgICAgc3VtID0gbGVuIC0gMTsKKworICAgIHJldHVybiBzdW07Cit9CisKKy8qKgorICogRGVjb2RlIHRoZSBkYyB2YWx1ZS4KKyAqIEBwYXJhbSBuIGJsb2NrIGluZGV4ICgwLTMgYXJlIGx1bWEsIDQtNSBhcmUgY2hyb21hKQorICogQHBhcmFtIGRpcl9wdHIgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUKKyAqIEByZXR1cm4gdGhlIHF1YW50aXplZCBkYworICovCitzdGF0aWMgaW5saW5lIGludCBtcGVnNF9kZWNvZGVfZGMoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBuLCBpbnQgKmRpcl9wdHIpCit7CisgICAgaW50IGxldmVsLCBjb2RlOworCisgICAgaWYgKG4gPCA0KQorICAgICAgICBjb2RlID0gZ2V0X3ZsYzIoJnMtPmdiLCBkY19sdW0udGFibGUsIERDX1ZMQ19CSVRTLCAxKTsKKyAgICBlbHNlCisgICAgICAgIGNvZGUgPSBnZXRfdmxjMigmcy0+Z2IsIGRjX2Nocm9tLnRhYmxlLCBEQ19WTENfQklUUywgMSk7CisKKyAgICBpZiAoY29kZSA8IDAgfHwgY29kZSA+IDkgLyogJiYgcy0+bmJpdCA8IDkgKi8pIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIGRjIHZsY1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoY29kZSA9PSAwKSB7CisgICAgICAgIGxldmVsID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoSVNfM0lWMSkgeworICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKKyAgICAgICAgICAgICAgICBsZXZlbCA9IDIgKiBnZXRfYml0czEoJnMtPmdiKSAtIDE7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gZ2V0X2JpdHMoJnMtPmdiLCBjb2RlIC0gMSkgKyAoMSA8PCAoY29kZSAtIDEpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLWdldF9iaXRzKCZzLT5nYiwgY29kZSAtIDEpIC0gKDEgPDwgKGNvZGUgLSAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXZlbCA9IGdldF94Yml0cygmcy0+Z2IsIGNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvZGUgPiA4KSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikgPT0gMCkgeyAvKiBtYXJrZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAocy0+ZXJyX3JlY29nbml0aW9uICYgKEFWX0VGX0JJVFNUUkVBTXxBVl9FRl9DT01QTElBTlQpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGMgbWFya2VyIGJpdCBtaXNzaW5nXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmZl9tcGVnNF9wcmVkX2RjKHMsIG4sIGxldmVsLCBkaXJfcHRyLCAwKTsKK30KKworLyoqCisgKiBEZWNvZGUgZmlyc3QgcGFydGl0aW9uLgorICogQHJldHVybiBudW1iZXIgb2YgTUJzIGRlY29kZWQgb3IgPDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworc3RhdGljIGludCBtcGVnNF9kZWNvZGVfcGFydGl0aW9uX2EoTXBlZzREZWNDb250ZXh0ICpjdHgpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmY3R4LT5tOworICAgIGludCBtYl9udW0gPSAwOworICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgcXVhbnRfdGFiWzRdID0geyAtMSwgLTIsIDEsIDIgfTsKKworICAgIC8qIGRlY29kZSBmaXJzdCBwYXJ0aXRpb24gKi8KKyAgICBzLT5maXJzdF9zbGljZV9saW5lID0gMTsKKyAgICBmb3IgKDsgcy0+bWJfeSA8IHMtPm1iX2hlaWdodDsgcy0+bWJfeSsrKSB7CisgICAgICAgIGZmX2luaXRfYmxvY2tfaW5kZXgocyk7CisgICAgICAgIGZvciAoOyBzLT5tYl94IDwgcy0+bWJfd2lkdGg7IHMtPm1iX3grKykgeworICAgICAgICAgICAgY29uc3QgaW50IHh5ID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisgICAgICAgICAgICBpbnQgY2JwYzsKKyAgICAgICAgICAgIGludCBkaXIgPSAwOworCisgICAgICAgICAgICBtYl9udW0rKzsKKyAgICAgICAgICAgIGZmX3VwZGF0ZV9ibG9ja19pbmRleChzKTsKKyAgICAgICAgICAgIGlmIChzLT5tYl94ID09IHMtPnJlc3luY19tYl94ICYmIHMtPm1iX3kgPT0gcy0+cmVzeW5jX21iX3kgKyAxKQorICAgICAgICAgICAgICAgIHMtPmZpcnN0X3NsaWNlX2xpbmUgPSAwOworCisgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaG93X2JpdHNfbG9uZygmcy0+Z2IsIDE5KSA9PSBEQ19NQVJLRVIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWJfbnVtIC0gMTsKKworICAgICAgICAgICAgICAgICAgICBjYnBjID0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9oMjYzX2ludHJhX01DQlBDX3ZsYy50YWJsZSwgSU5UUkFfTUNCUENfVkxDX0JJVFMsIDIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2JwYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtY2JwYyBjb3JydXB0ZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoY2JwYyA9PSA4KTsKKworICAgICAgICAgICAgICAgIHMtPmNicF90YWJsZVt4eV0gICAgICAgICAgICAgICA9IGNicGMgJiAzOworICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IE1CX1RZUEVfSU5UUkE7CisgICAgICAgICAgICAgICAgcy0+bWJfaW50cmEgICAgICAgICAgICAgICAgICAgID0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjYnBjICYgNCkKKyAgICAgICAgICAgICAgICAgICAgZmZfc2V0X3FzY2FsZShzLCBzLT5xc2NhbGUgKyBxdWFudF90YWJbZ2V0X2JpdHMoJnMtPmdiLCAyKV0pOworCisgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVt4eV0gPSBzLT5xc2NhbGU7CisKKyAgICAgICAgICAgICAgICBzLT5tYmludHJhX3RhYmxlW3h5XSA9IDE7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgZGNfcHJlZF9kaXI7CisgICAgICAgICAgICAgICAgICAgIGludCBkYyA9IG1wZWc0X2RlY29kZV9kYyhzLCBpLCAmZGNfcHJlZF9kaXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREMgY29ycnVwdGVkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkaXIgPDw9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChkY19wcmVkX2RpcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpciB8PSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT5wcmVkX2Rpcl90YWJsZVt4eV0gPSBkaXI7CisgICAgICAgICAgICB9IGVsc2UgeyAvKiBQL1NfVFlQRSAqLworICAgICAgICAgICAgICAgIGludCBteCwgbXksIHByZWRfeCwgcHJlZF95LCBiaXRzOworICAgICAgICAgICAgICAgIGludDE2X3QgKmNvbnN0IG1vdF92YWwgPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVtzLT5ibG9ja19pbmRleFswXV07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0cmlkZSAgICAgICA9IHMtPmI4X3N0cmlkZSAqIDI7CisKK3RyeV9hZ2FpbjoKKyAgICAgICAgICAgICAgICBiaXRzID0gc2hvd19iaXRzKCZzLT5nYiwgMTcpOworICAgICAgICAgICAgICAgIGlmIChiaXRzID09IE1PVElPTl9NQVJLRVIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYl9udW0gLSAxOworCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgICAgIGlmIChiaXRzICYgMHgxMDAwMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBza2lwIG1iICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dm9sX3Nwcml0ZV91c2FnZSA9PSBHTUNfU1BSSVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0gPSBNQl9UWVBFX1NLSVAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfMTZ4MTYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9HTUMgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX0wwOworICAgICAgICAgICAgICAgICAgICAgICAgbXggPSBnZXRfYW12KGN0eCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBteSA9IGdldF9hbXYoY3R4LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IE1CX1RZUEVfU0tJUCAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV8xNngxNiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX0wwOworICAgICAgICAgICAgICAgICAgICAgICAgbXggPSBteSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbW90X3ZhbFswXSAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgIG1vdF92YWxbMl0gICAgICAgICAgPQorICAgICAgICAgICAgICAgICAgICBtb3RfdmFsWzAgKyBzdHJpZGVdID0KKyAgICAgICAgICAgICAgICAgICAgbW90X3ZhbFsyICsgc3RyaWRlXSA9IG14OworICAgICAgICAgICAgICAgICAgICBtb3RfdmFsWzFdICAgICAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgbW90X3ZhbFszXSAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgIG1vdF92YWxbMSArIHN0cmlkZV0gPQorICAgICAgICAgICAgICAgICAgICBtb3RfdmFsWzMgKyBzdHJpZGVdID0gbXk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm1iaW50cmFfdGFibGVbeHldKQorICAgICAgICAgICAgICAgICAgICAgICAgZmZfY2xlYW5faW50cmFfdGFibGVfZW50cmllcyhzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2JwYyA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19pbnRlcl9NQ0JQQ192bGMudGFibGUsIElOVEVSX01DQlBDX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgICAgICBpZiAoY2JwYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWNicGMgY29ycnVwdGVkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2JwYyA9PSAyMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byB0cnlfYWdhaW47CisKKyAgICAgICAgICAgICAgICBzLT5jYnBfdGFibGVbeHldID0gY2JwYyAmICg4ICsgMyk7ICAvLyA4IGlzIGRxdWFudAorCisgICAgICAgICAgICAgICAgcy0+bWJfaW50cmEgPSAoKGNicGMgJiA0KSAhPSAwKTsKKworICAgICAgICAgICAgICAgIGlmIChzLT5tYl9pbnRyYSkgeworICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0gPSBNQl9UWVBFX0lOVFJBOworICAgICAgICAgICAgICAgICAgICBzLT5tYmludHJhX3RhYmxlW3h5XSA9IDE7CisgICAgICAgICAgICAgICAgICAgIG1vdF92YWxbMF0gICAgICAgICAgPQorICAgICAgICAgICAgICAgICAgICBtb3RfdmFsWzJdICAgICAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgbW90X3ZhbFswICsgc3RyaWRlXSA9CisgICAgICAgICAgICAgICAgICAgIG1vdF92YWxbMiArIHN0cmlkZV0gPSAwOworICAgICAgICAgICAgICAgICAgICBtb3RfdmFsWzFdICAgICAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgbW90X3ZhbFszXSAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgIG1vdF92YWxbMSArIHN0cmlkZV0gPQorICAgICAgICAgICAgICAgICAgICBtb3RfdmFsWzMgKyBzdHJpZGVdID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bWJpbnRyYV90YWJsZVt4eV0pCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9jbGVhbl9pbnRyYV90YWJsZV9lbnRyaWVzKHMpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dm9sX3Nwcml0ZV91c2FnZSA9PSBHTUNfU1BSSVRFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoY2JwYyAmIDE2KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWNzZWwgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWNzZWwgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoY2JwYyAmIDE2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNngxNiBtb3Rpb24gcHJlZGljdGlvbiAqLworCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIDAsIDAsICZwcmVkX3gsICZwcmVkX3kpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzLT5tY3NlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeCwgcy0+Zl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXggPj0gMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3ksIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG15ID49IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IE1CX1RZUEVfMTZ4MTYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfTDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14ID0gZ2V0X2FtdihjdHgsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ID0gZ2V0X2FtdihjdHgsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IE1CX1RZUEVfMTZ4MTYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfR01DICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfTDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdF92YWxbMF0gICAgICAgICAgPQorICAgICAgICAgICAgICAgICAgICAgICAgbW90X3ZhbFsyXSAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgICAgICBtb3RfdmFsWzAgKyBzdHJpZGVdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdF92YWxbMiArIHN0cmlkZV0gPSBteDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdF92YWxbMV0gICAgICAgICAgPQorICAgICAgICAgICAgICAgICAgICAgICAgbW90X3ZhbFszXSAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgICAgICBtb3RfdmFsWzEgKyBzdHJpZGVdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdF92YWxbMyArIHN0cmlkZV0gPSBteTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbeHldID0gTUJfVFlQRV84eDggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9MMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICptb3RfdmFsID0gZmZfaDI2M19wcmVkX21vdGlvbihzLCBpLCAwLCAmcHJlZF94LCAmcHJlZF95KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteCA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3gsIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG14ID49IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF95LCBzLT5mX2NvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteSA+PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3RfdmFsWzBdID0gbXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90X3ZhbFsxXSA9IG15OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHMtPm1iX3ggPSAwOworICAgIH0KKworICAgIHJldHVybiBtYl9udW07Cit9CisKKy8qKgorICogZGVjb2RlIHNlY29uZCBwYXJ0aXRpb24uCisgKiBAcmV0dXJuIDwwIGlmIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK3N0YXRpYyBpbnQgbXBlZzRfZGVjb2RlX3BhcnRpdGlvbl9iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgbWJfY291bnQpCit7CisgICAgaW50IG1iX251bSA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludDhfdCBxdWFudF90YWJbNF0gPSB7IC0xLCAtMiwgMSwgMiB9OworCisgICAgcy0+bWJfeCA9IHMtPnJlc3luY19tYl94OworICAgIHMtPmZpcnN0X3NsaWNlX2xpbmUgPSAxOworICAgIGZvciAocy0+bWJfeSA9IHMtPnJlc3luY19tYl95OyBtYl9udW0gPCBtYl9jb3VudDsgcy0+bWJfeSsrKSB7CisgICAgICAgIGZmX2luaXRfYmxvY2tfaW5kZXgocyk7CisgICAgICAgIGZvciAoOyBtYl9udW0gPCBtYl9jb3VudCAmJiBzLT5tYl94IDwgcy0+bWJfd2lkdGg7IHMtPm1iX3grKykgeworICAgICAgICAgICAgY29uc3QgaW50IHh5ID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisKKyAgICAgICAgICAgIG1iX251bSsrOworICAgICAgICAgICAgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KHMpOworICAgICAgICAgICAgaWYgKHMtPm1iX3ggPT0gcy0+cmVzeW5jX21iX3ggJiYgcy0+bWJfeSA9PSBzLT5yZXN5bmNfbWJfeSArIDEpCisgICAgICAgICAgICAgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZSA9IDA7CisKKyAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgICAgICAgICBpbnQgYWNfcHJlZCA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgICAgIGludCBjYnB5ICAgID0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9oMjYzX2NicHlfdmxjLnRhYmxlLCBDQlBZX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAoY2JweSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2JweSBjb3JydXB0ZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcy0+Y2JwX3RhYmxlW3h5XSAgICAgICAgICAgICAgIHw9IGNicHkgPDwgMjsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0gfD0gYWNfcHJlZCAqIE1CX1RZUEVfQUNQUkVEOworICAgICAgICAgICAgfSBlbHNlIHsgLyogUCB8fCBTX1RZUEUgKi8KKyAgICAgICAgICAgICAgICBpZiAoSVNfSU5UUkEocy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbeHldKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpciAgICAgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgYWNfcHJlZCA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICBpbnQgY2JweSAgICA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19jYnB5X3ZsYy50YWJsZSwgQ0JQWV9WTENfQklUUywgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNicHkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSBjYnB5IGNvcnJ1cHRlZCBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Y2JwX3RhYmxlW3h5XSAmIDgpCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9zZXRfcXNjYWxlKHMsIHMtPnFzY2FsZSArIHF1YW50X3RhYltnZXRfYml0cygmcy0+Z2IsIDIpXSk7CisgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbeHldID0gcy0+cXNjYWxlOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkY19wcmVkX2RpcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYyA9IG1wZWc0X2RlY29kZV9kYyhzLCBpLCAmZGNfcHJlZF9kaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRjIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREMgY29ycnVwdGVkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkaXIgPDw9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGNfcHJlZF9kaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyIHw9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcy0+Y2JwX3RhYmxlW3h5XSAgICAgICAgICAgICAgICY9IDM7ICAvLyByZW1vdmUgZHF1YW50CisgICAgICAgICAgICAgICAgICAgIHMtPmNicF90YWJsZVt4eV0gICAgICAgICAgICAgICB8PSBjYnB5IDw8IDI7CisgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSB8PSBhY19wcmVkICogTUJfVFlQRV9BQ1BSRUQ7CisgICAgICAgICAgICAgICAgICAgIHMtPnByZWRfZGlyX3RhYmxlW3h5XSAgICAgICAgICAgPSBkaXI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJU19TS0lQKHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVt4eV0gPSBzLT5xc2NhbGU7CisgICAgICAgICAgICAgICAgICAgIHMtPmNicF90YWJsZVt4eV0gICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2JweSA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19jYnB5X3ZsYy50YWJsZSwgQ0JQWV9WTENfQklUUywgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNicHkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUCBjYnB5IGNvcnJ1cHRlZCBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Y2JwX3RhYmxlW3h5XSAmIDgpCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9zZXRfcXNjYWxlKHMsIHMtPnFzY2FsZSArIHF1YW50X3RhYltnZXRfYml0cygmcy0+Z2IsIDIpXSk7CisgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbeHldID0gcy0+cXNjYWxlOworCisgICAgICAgICAgICAgICAgICAgIHMtPmNicF90YWJsZVt4eV0gJj0gMzsgIC8vIHJlbW92ZSBkcXVhbnQKKyAgICAgICAgICAgICAgICAgICAgcy0+Y2JwX3RhYmxlW3h5XSB8PSAoY2JweSBeIDB4ZikgPDwgMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1iX251bSA+PSBtYl9jb3VudCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzLT5tYl94ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVjb2RlIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHBhcnRpdGlvbi4KKyAqIEByZXR1cm4gPDAgaWYgZXJyb3IgKGFuZCBzZXRzIGVycm9yIHR5cGUgaW4gdGhlIGVycm9yX3N0YXR1c190YWJsZSkKKyAqLworaW50IGZmX21wZWc0X2RlY29kZV9wYXJ0aXRpb25zKE1wZWc0RGVjQ29udGV4dCAqY3R4KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKKyAgICBpbnQgbWJfbnVtOworICAgIGNvbnN0IGludCBwYXJ0X2FfZXJyb3IgPSBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgPyAoRVJfRENfRVJST1IgfCBFUl9NVl9FUlJPUikgOiBFUl9NVl9FUlJPUjsKKyAgICBjb25zdCBpbnQgcGFydF9hX2VuZCAgID0gcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JID8gKEVSX0RDX0VORCAgIHwgRVJfTVZfRU5EKSAgIDogRVJfTVZfRU5EOworCisgICAgbWJfbnVtID0gbXBlZzRfZGVjb2RlX3BhcnRpdGlvbl9hKGN0eCk7CisgICAgaWYgKG1iX251bSA8IDApIHsKKyAgICAgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgcy0+cmVzeW5jX21iX3gsIHMtPnJlc3luY19tYl95LAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfeCwgcy0+bWJfeSwgcGFydF9hX2Vycm9yKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT5yZXN5bmNfbWJfeCArIHMtPnJlc3luY19tYl95ICogcy0+bWJfd2lkdGggKyBtYl9udW0gPiBzLT5tYl9udW0pIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzbGljZSBiZWxvdyBtb25pdG9yIC4uLlxuIik7CisgICAgICAgIGZmX2VyX2FkZF9zbGljZSgmcy0+ZXIsIHMtPnJlc3luY19tYl94LCBzLT5yZXN5bmNfbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3gsIHMtPm1iX3ksIHBhcnRfYV9lcnJvcik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzLT5tYl9udW1fbGVmdCA9IG1iX251bTsKKworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgd2hpbGUgKHNob3dfYml0cygmcy0+Z2IsIDkpID09IDEpCisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA5KTsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xvbmcoJnMtPmdiLCAxOSkgIT0gRENfTUFSS0VSKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAibWFya2VyIG1pc3NpbmcgYWZ0ZXIgZmlyc3QgSSBwYXJ0aXRpb24gYXQgJWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoc2hvd19iaXRzKCZzLT5nYiwgMTApID09IDEpCisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxMCk7CisgICAgICAgIGlmIChnZXRfYml0cygmcy0+Z2IsIDE3KSAhPSBNT1RJT05fTUFSS0VSKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAibWFya2VyIG1pc3NpbmcgYWZ0ZXIgZmlyc3QgUCBwYXJ0aXRpb24gYXQgJWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgcy0+cmVzeW5jX21iX3gsIHMtPnJlc3luY19tYl95LAorICAgICAgICAgICAgICAgICAgICBzLT5tYl94IC0gMSwgcy0+bWJfeSwgcGFydF9hX2VuZCk7CisKKyAgICBpZiAobXBlZzRfZGVjb2RlX3BhcnRpdGlvbl9iKHMsIG1iX251bSkgPCAwKSB7CisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApCisgICAgICAgICAgICBmZl9lcl9hZGRfc2xpY2UoJnMtPmVyLCBzLT5yZXN5bmNfbWJfeCwgcy0+cmVzeW5jX21iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfeCwgcy0+bWJfeSwgRVJfRENfRVJST1IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkKKyAgICAgICAgICAgIGZmX2VyX2FkZF9zbGljZSgmcy0+ZXIsIHMtPnJlc3luY19tYl94LCBzLT5yZXN5bmNfbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYl94IC0gMSwgcy0+bWJfeSwgRVJfRENfRU5EKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgYSBibG9jay4KKyAqIEByZXR1cm4gPDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgbXBlZzRfZGVjb2RlX2Jsb2NrKE1wZWc0RGVjQ29udGV4dCAqY3R4LCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IGNvZGVkLCBpbnQgaW50cmEsIGludCBydmxjKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKKyAgICBpbnQgbGV2ZWwsIGksIGxhc3QsIHJ1biwgcW11bCwgcWFkZDsKKyAgICBpbnQgYXZfdW5pbml0KGRjX3ByZWRfZGlyKTsKKyAgICBSTFRhYmxlICpybDsKKyAgICBSTF9WTENfRUxFTSAqcmxfdmxjOworICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW5fdGFibGU7CisKKyAgICAvLyBOb3RlIGludHJhICYgcnZsYyBzaG91bGQgYmUgb3B0aW1pemVkIGF3YXkgaWYgdGhpcyBpcyBpbmxpbmVkCisKKyAgICBpZiAoaW50cmEpIHsKKyAgICAgICAgaWYgKGN0eC0+dXNlX2ludHJhX2RjX3ZsYykgeworICAgICAgICAgICAgLyogREMgY29lZiAqLworICAgICAgICAgICAgaWYgKHMtPnBhcnRpdGlvbmVkX2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBzLT5kY192YWxbMF1bcy0+YmxvY2tfaW5kZXhbbl1dOworICAgICAgICAgICAgICAgIGlmIChuIDwgNCkKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBGQVNURElWKChsZXZlbCArIChzLT55X2RjX3NjYWxlID4+IDEpKSwgcy0+eV9kY19zY2FsZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IEZBU1RESVYoKGxldmVsICsgKHMtPmNfZGNfc2NhbGUgPj4gMSkpLCBzLT5jX2RjX3NjYWxlKTsKKyAgICAgICAgICAgICAgICBkY19wcmVkX2RpciA9IChzLT5wcmVkX2Rpcl90YWJsZVtzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZV0gPDwgbikgJiAzMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBtcGVnNF9kZWNvZGVfZGMocywgbiwgJmRjX3ByZWRfZGlyKTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibG9ja1swXSA9IGxldmVsOworICAgICAgICAgICAgaSAgICAgICAgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaSA9IC0xOworICAgICAgICAgICAgZmZfbXBlZzRfcHJlZF9kYyhzLCBuLCAwLCAmZGNfcHJlZF9kaXIsIDApOworICAgICAgICB9CisgICAgICAgIGlmICghY29kZWQpCisgICAgICAgICAgICBnb3RvIG5vdF9jb2RlZDsKKworICAgICAgICBpZiAocnZsYykgeworICAgICAgICAgICAgcmwgICAgID0gJmZmX3J2bGNfcmxfaW50cmE7CisgICAgICAgICAgICBybF92bGMgPSBmZl9ydmxjX3JsX2ludHJhLnJsX3ZsY1swXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJsICAgICA9ICZmZl9tcGVnNF9ybF9pbnRyYTsKKyAgICAgICAgICAgIHJsX3ZsYyA9IGZmX21wZWc0X3JsX2ludHJhLnJsX3ZsY1swXTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+YWNfcHJlZCkgeworICAgICAgICAgICAgaWYgKGRjX3ByZWRfZGlyID09IDApCisgICAgICAgICAgICAgICAgc2Nhbl90YWJsZSA9IHMtPmludHJhX3Zfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7ICAvKiBsZWZ0ICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2Nhbl90YWJsZSA9IHMtPmludHJhX2hfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7ICAvKiB0b3AgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNjYW5fdGFibGUgPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZDsKKyAgICAgICAgfQorICAgICAgICBxbXVsID0gMTsKKyAgICAgICAgcWFkZCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaSA9IC0xOworICAgICAgICBpZiAoIWNvZGVkKSB7CisgICAgICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChydmxjKQorICAgICAgICAgICAgcmwgPSAmZmZfcnZsY19ybF9pbnRlcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmwgPSAmZmZfaDI2M19ybF9pbnRlcjsKKworICAgICAgICBzY2FuX3RhYmxlID0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7CisKKyAgICAgICAgaWYgKHMtPm1wZWdfcXVhbnQpIHsKKyAgICAgICAgICAgIHFtdWwgPSAxOworICAgICAgICAgICAgcWFkZCA9IDA7CisgICAgICAgICAgICBpZiAocnZsYykKKyAgICAgICAgICAgICAgICBybF92bGMgPSBmZl9ydmxjX3JsX2ludGVyLnJsX3ZsY1swXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBybF92bGMgPSBmZl9oMjYzX3JsX2ludGVyLnJsX3ZsY1swXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHFtdWwgPSBzLT5xc2NhbGUgPDwgMTsKKyAgICAgICAgICAgIHFhZGQgPSAocy0+cXNjYWxlIC0gMSkgfCAxOworICAgICAgICAgICAgaWYgKHJ2bGMpCisgICAgICAgICAgICAgICAgcmxfdmxjID0gZmZfcnZsY19ybF9pbnRlci5ybF92bGNbcy0+cXNjYWxlXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBybF92bGMgPSBmZl9oMjYzX3JsX2ludGVyLnJsX3ZsY1tzLT5xc2NhbGVdOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgIEdFVF9STF9WTEMobGV2ZWwsIHJ1biwgcmUsICZzLT5nYiwgcmxfdmxjLCBURVhfVkxDX0JJVFMsIDIsIDApOworICAgICAgICAgICAgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICBpZiAocnZsYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19VQklUUyhyZSwgJnMtPmdiLCAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMS4gbWFya2VyIGJpdCBtaXNzaW5nIGluIHJ2bGMgZXNjXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTS0lQX0NBQ0hFKHJlLCAmcy0+Z2IsIDEpOworCisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgICAgICAgICBTS0lQX0NBQ0hFKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgICAgICAgICBydW4gPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDYpOworICAgICAgICAgICAgICAgICAgICBTS0lQX0NPVU5URVIocmUsICZzLT5nYiwgMSArIDEgKyA2KTsKKyAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyLiBtYXJrZXIgYml0IG1pc3NpbmcgaW4gcnZsYyBlc2NcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNLSVBfQ0FDSEUocmUsICZzLT5nYiwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDExKTsKKyAgICAgICAgICAgICAgICAgICAgU0tJUF9DQUNIRShyZSwgJnMtPmdiLCAxMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfVUJJVFMocmUsICZzLT5nYiwgNSkgIT0gMHgxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZXZlcnNlIGVzYyBtaXNzaW5nXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTS0lQX0NBQ0hFKHJlLCAmcy0+Z2IsIDUpOworCisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbGV2ZWwgKiBxbXVsICsgcWFkZDsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgXiBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpKSAtIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgICAgIFNLSVBfQ09VTlRFUihyZSwgJnMtPmdiLCAxICsgMTEgKyA1ICsgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaSArPSBydW4gKyAxOworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTkyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBHRVRfQ0FDSEUocmUsICZzLT5nYik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKElTXzNJVjEpCisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSBePSAweEMwMDAwMDAwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZSAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZSAmIDB4NDAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlyZCBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0lQX0NBQ0hFKHJlLCAmcy0+Z2IsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLSVBfQ0FDSEUocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gU0hPV19VQklUUyhyZSwgJnMtPmdiLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0lQX0NPVU5URVIocmUsICZzLT5nYiwgMiArIDEgKyA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsICZzLT5nYik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSVNfM0lWMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMTIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAxMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfVUJJVFMocmUsICZzLT5nYiwgMSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEuIG1hcmtlciBiaXQgbWlzc2luZyBpbiAzLiBlc2NcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocy0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfSUdOT1JFX0VSUikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLSVBfQ0FDSEUocmUsICZzLT5nYiwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tJUF9DQUNIRShyZSwgJnMtPmdiLCAxMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfVUJJVFMocmUsICZzLT5nYiwgMSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIuIG1hcmtlciBiaXQgbWlzc2luZyBpbiAzLiBlc2NcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocy0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfSUdOT1JFX0VSUikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tJUF9DT1VOVEVSKHJlLCAmcy0+Z2IsIDEgKyAxMiArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworI2lmIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+ZXJyb3JfcmVjb2duaXRpb24gPj0gRkZfRVJfQ09NUExJQU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBhYnNfbGV2ZWw9IEZGQUJTKGxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFic19sZXZlbDw9TUFYX0xFVkVMICYmIHJ1bjw9TUFYX1JVTikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHJ1bjE9IHJ1biAtIHJsLT5tYXhfcnVuW2xhc3RdW2Fic19sZXZlbF0gLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFic19sZXZlbCA8PSBybC0+bWF4X2xldmVsW2xhc3RdW3J1bl0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgMy4gZXNjLCB2bGMgZW5jb2RpbmcgcG9zc2libGVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5lcnJvcl9yZWNvZ25pdGlvbiA+IEZGX0VSX0NPTVBMSUFOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYnNfbGV2ZWwgPD0gcmwtPm1heF9sZXZlbFtsYXN0XVtydW5dKjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIDMuIGVzYywgZXNjIDEgZW5jb2RpbmcgcG9zc2libGVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW4xID49IDAgJiYgYWJzX2xldmVsIDw9IHJsLT5tYXhfbGV2ZWxbbGFzdF1bcnVuMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIDMuIGVzYywgZXNjIDIgZW5jb2RpbmcgcG9zc2libGVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbCAqIHFtdWwgKyBxYWRkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbCAqIHFtdWwgLSBxYWRkOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGV2ZWwgKyAyMDQ4KSA+IDQwOTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9CSVRTVFJFQU18QVZfRUZfQUdHUkVTU0lWRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IDI1NjAgfHwgbGV2ZWwgPCAtMjU2MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifGxldmVsfCBvdmVyZmxvdyBpbiAzLiBlc2MsIHFwPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5xc2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsIDwgMCA/IC0yMDQ4IDogMjA0NzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IHJ1biArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTkyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgZXNjYXBlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9STF9WTEMobGV2ZWwsIHJ1biwgcmUsICZzLT5nYiwgcmxfdmxjLCBURVhfVkxDX0JJVFMsIDIsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgKz0gcnVuICsgcmwtPm1heF9ydW5bcnVuID4+IDddW2xldmVsIC8gcW11bF0gKyAxOyAgLy8gRklYTUUgb3B0IGluZGV4aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgXiBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpKSAtIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9STF9WTEMobGV2ZWwsIHJ1biwgcmUsICZzLT5nYiwgcmxfdmxjLCBURVhfVkxDX0JJVFMsIDIsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaSAgICArPSBydW47CisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsICsgcmwtPm1heF9sZXZlbFtydW4gPj4gN11bKHJ1biAtIDEpICYgNjNdICogcW11bDsgIC8vIEZJWE1FIG9wdCBpbmRleGluZworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgXiBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpKSAtIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaSAgICArPSBydW47CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgXiBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpKSAtIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cHJpbnRmKHMtPmF2Y3R4LCAiZGN0WyVkXVslZF0gPSAlLSA0ZCBlbmQ/OiVkXG4iLCBzY2FuX3RhYmxlW2kmNjNdJjcsIHNjYW5fdGFibGVbaSY2M10gPj4gMywgbGV2ZWwsIGk+NjIpOworICAgICAgICAgICAgaWYgKGkgPiA2MikgeworICAgICAgICAgICAgICAgIGkgLT0gMTkyOworICAgICAgICAgICAgICAgIGlmIChpICYgKH42MykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWMtdGV4IGRhbWFnZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmxvY2tbc2Nhbl90YWJsZVtpXV0gPSBsZXZlbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmxvY2tbc2Nhbl90YWJsZVtpXV0gPSBsZXZlbDsKKyAgICAgICAgfQorICAgICAgICBDTE9TRV9SRUFERVIocmUsICZzLT5nYik7CisgICAgfQorCitub3RfY29kZWQ6CisgICAgaWYgKGludHJhKSB7CisgICAgICAgIGlmICghY3R4LT51c2VfaW50cmFfZGNfdmxjKSB7CisgICAgICAgICAgICBibG9ja1swXSA9IGZmX21wZWc0X3ByZWRfZGMocywgbiwgYmxvY2tbMF0sICZkY19wcmVkX2RpciwgMCk7CisKKyAgICAgICAgICAgIGkgLT0gaSA+PiAzMTsgIC8vIGlmIChpID09IC0xKSBpID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGZmX21wZWc0X3ByZWRfYWMocywgYmxvY2ssIG4sIGRjX3ByZWRfZGlyKTsKKyAgICAgICAgaWYgKHMtPmFjX3ByZWQpCisgICAgICAgICAgICBpID0gNjM7ICAvLyBGSVhNRSBub3Qgb3B0aW1hbAorICAgIH0KKyAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBkZWNvZGUgcGFydGl0aW9uIEMgb2Ygb25lIE1CLgorICogQHJldHVybiA8MCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitzdGF0aWMgaW50IG1wZWc0X2RlY29kZV9wYXJ0aXRpb25lZF9tYihNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1s2XVs2NF0pCit7CisgICAgTXBlZzREZWNDb250ZXh0ICpjdHggPSAoTXBlZzREZWNDb250ZXh0ICopczsKKyAgICBpbnQgY2JwLCBtYl90eXBlOworICAgIGNvbnN0IGludCB4eSA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOworCisgICAgbWJfdHlwZSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XTsKKyAgICBjYnAgICAgID0gcy0+Y2JwX3RhYmxlW3h5XTsKKworICAgIGN0eC0+dXNlX2ludHJhX2RjX3ZsYyA9IHMtPnFzY2FsZSA8IGN0eC0+aW50cmFfZGNfdGhyZXNob2xkOworCisgICAgaWYgKHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbeHldICE9IHMtPnFzY2FsZSkKKyAgICAgICAgZmZfc2V0X3FzY2FsZShzLCBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW3h5XSk7CisKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QIHx8CisgICAgICAgIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgcy0+bXZbMF1baV1bMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVtzLT5ibG9ja19pbmRleFtpXV1bMF07CisgICAgICAgICAgICBzLT5tdlswXVtpXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3MtPmJsb2NrX2luZGV4W2ldXVsxXTsKKyAgICAgICAgfQorICAgICAgICBzLT5tYl9pbnRyYSA9IElTX0lOVFJBKG1iX3R5cGUpOworCisgICAgICAgIGlmIChJU19TS0lQKG1iX3R5cGUpKSB7CisgICAgICAgICAgICAvKiBza2lwIG1iICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPSAtMTsKKyAgICAgICAgICAgIHMtPm12X2RpciAgPSBNVl9ESVJfRk9SV0FSRDsKKyAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUworICAgICAgICAgICAgICAgICYmIGN0eC0+dm9sX3Nwcml0ZV91c2FnZSA9PSBHTUNfU1BSSVRFKSB7CisgICAgICAgICAgICAgICAgcy0+bWNzZWwgICAgICA9IDE7CisgICAgICAgICAgICAgICAgcy0+bWJfc2tpcHBlZCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPm1jc2VsICAgICAgPSAwOworICAgICAgICAgICAgICAgIHMtPm1iX3NraXBwZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgICAgICBzLT5hY19wcmVkID0gSVNfQUNQUkVEKHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSk7CisgICAgICAgIH0gZWxzZSBpZiAoIXMtPm1iX2ludHJhKSB7CisgICAgICAgICAgICAvLyBzLT5tY3NlbCA9IDA7ICAvLyBGSVhNRSBkbyB3ZSBuZWVkIHRvIGluaXQgdGhhdD8KKworICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQ7CisgICAgICAgICAgICBpZiAoSVNfOFg4KG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgcy0+bXZfdHlwZSA9IE1WX1RZUEVfOFg4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV8xNlgxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8qIEktRnJhbWUgKi8KKyAgICAgICAgcy0+bWJfaW50cmEgPSAxOworICAgICAgICBzLT5hY19wcmVkICA9IElTX0FDUFJFRChzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0pOworICAgIH0KKworICAgIGlmICghSVNfU0tJUChtYl90eXBlKSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgcy0+YmRzcC5jbGVhcl9ibG9ja3Mocy0+YmxvY2tbMF0pOworICAgICAgICAvKiBkZWNvZGUgZWFjaCBibG9jayAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICBpZiAobXBlZzRfZGVjb2RlX2Jsb2NrKGN0eCwgYmxvY2tbaV0sIGksIGNicCAmIDMyLCBzLT5tYl9pbnRyYSwgY3R4LT5ydmxjKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgInRleHR1cmUgY29ycnVwdGVkIGF0ICVkICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5tYl94LCBzLT5tYl95LCBzLT5tYl9pbnRyYSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2JwICs9IGNicDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBlci1NQiBlbmQgb2Ygc2xpY2UgY2hlY2sgKi8KKyAgICBpZiAoLS1zLT5tYl9udW1fbGVmdCA8PSAwKSB7CisgICAgICAgIGlmIChtcGVnNF9pc19yZXN5bmMoY3R4KSkKKyAgICAgICAgICAgIHJldHVybiBTTElDRV9FTkQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBTTElDRV9OT0VORDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobXBlZzRfaXNfcmVzeW5jKGN0eCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBkZWx0YSA9IHMtPm1iX3ggKyAxID09IHMtPm1iX3dpZHRoID8gMiA6IDE7CisgICAgICAgICAgICBpZiAocy0+Y2JwX3RhYmxlW3h5ICsgZGVsdGFdKQorICAgICAgICAgICAgICAgIHJldHVybiBTTElDRV9FTkQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNMSUNFX09LOworICAgIH0KK30KKworc3RhdGljIGludCBtcGVnNF9kZWNvZGVfbWIoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgYmxvY2tbNl1bNjRdKQoreworICAgIE1wZWc0RGVjQ29udGV4dCAqY3R4ID0gKE1wZWc0RGVjQ29udGV4dCAqKXM7CisgICAgaW50IGNicGMsIGNicHksIGksIGNicCwgcHJlZF94LCBwcmVkX3ksIG14LCBteSwgZHF1YW50OworICAgIGludDE2X3QgKm1vdF92YWw7CisgICAgc3RhdGljIGludDhfdCBxdWFudF90YWJbNF0gPSB7IC0xLCAtMiwgMSwgMiB9OworICAgIGNvbnN0IGludCB4eSA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOworCisgICAgYXZfYXNzZXJ0MihzLT5oMjYzX3ByZWQpOworCisgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCB8fAorICAgICAgICBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1MpIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgLyogc2tpcCBtYiAqLworICAgICAgICAgICAgICAgIHMtPm1iX2ludHJhID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4W2ldID0gLTE7CisgICAgICAgICAgICAgICAgcy0+bXZfZGlyICA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1MgJiYKKyAgICAgICAgICAgICAgICAgICAgY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IEdNQ19TUFJJVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbeHldID0gTUJfVFlQRV9TS0lQICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfR01DICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9UWVBFXzE2eDE2IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9MMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWNzZWwgICAgICAgPSAxOworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9IGdldF9hbXYoY3R4LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSBnZXRfYW12KGN0eCwgMSk7CisgICAgICAgICAgICAgICAgICAgIHMtPm1iX3NraXBwZWQgID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0gPSBNQl9UWVBFX1NLSVAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV8xNngxNiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfTDA7CisgICAgICAgICAgICAgICAgICAgIHMtPm1jc2VsICAgICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSAwOworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPm1iX3NraXBwZWQgID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYnBjID0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9oMjYzX2ludGVyX01DQlBDX3ZsYy50YWJsZSwgSU5URVJfTUNCUENfVkxDX0JJVFMsIDIpOworICAgICAgICAgICAgaWYgKGNicGMgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJtY2JwYyBkYW1hZ2VkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGNicGMgPT0gMjApOworCisgICAgICAgIHMtPmJkc3AuY2xlYXJfYmxvY2tzKHMtPmJsb2NrWzBdKTsKKyAgICAgICAgZHF1YW50ICAgICAgPSBjYnBjICYgODsKKyAgICAgICAgcy0+bWJfaW50cmEgPSAoKGNicGMgJiA0KSAhPSAwKTsKKyAgICAgICAgaWYgKHMtPm1iX2ludHJhKQorICAgICAgICAgICAgZ290byBpbnRyYTsKKworICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9TICYmCisgICAgICAgICAgICBjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gR01DX1NQUklURSAmJiAoY2JwYyAmIDE2KSA9PSAwKQorICAgICAgICAgICAgcy0+bWNzZWwgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+bWNzZWwgPSAwOworICAgICAgICBjYnB5ID0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9oMjYzX2NicHlfdmxjLnRhYmxlLCBDQlBZX1ZMQ19CSVRTLCAxKSBeIDB4MEY7CisKKyAgICAgICAgY2JwID0gKGNicGMgJiAzKSB8IChjYnB5IDw8IDIpOworICAgICAgICBpZiAoZHF1YW50KQorICAgICAgICAgICAgZmZfc2V0X3FzY2FsZShzLCBzLT5xc2NhbGUgKyBxdWFudF90YWJbZ2V0X2JpdHMoJnMtPmdiLCAyKV0pOworICAgICAgICBpZiAoKCFzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSkgJiYKKyAgICAgICAgICAgIChjYnAgfHwgKHMtPndvcmthcm91bmRfYnVncyAmIEZGX0JVR19YVklEX0lMQUNFKSkpCisgICAgICAgICAgICBzLT5pbnRlcmxhY2VkX2RjdCA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICBpZiAoKGNicGMgJiAxNikgPT0gMCkgeworICAgICAgICAgICAgaWYgKHMtPm1jc2VsKSB7CisgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbeHldID0gTUJfVFlQRV9HTUMgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV8xNngxNiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9MMDsKKyAgICAgICAgICAgICAgICAvKiAxNngxNiBnbG9iYWwgbW90aW9uIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgICAgICBzLT5tdl90eXBlICAgICA9IE1WX1RZUEVfMTZYMTY7CisgICAgICAgICAgICAgICAgbXggICAgICAgICAgICAgPSBnZXRfYW12KGN0eCwgMCk7CisgICAgICAgICAgICAgICAgbXkgICAgICAgICAgICAgPSBnZXRfYW12KGN0eCwgMSk7CisgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSBteDsKKyAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IG15OworICAgICAgICAgICAgfSBlbHNlIGlmICgoIXMtPnByb2dyZXNzaXZlX3NlcXVlbmNlKSAmJiBnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IE1CX1RZUEVfMTZ4OCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9MMCAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX0lOVEVSTEFDRUQ7CisgICAgICAgICAgICAgICAgLyogMTZ4OCBmaWVsZCBtb3Rpb24gcHJlZGljdGlvbiAqLworICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFX0ZJRUxEOworCisgICAgICAgICAgICAgICAgcy0+ZmllbGRfc2VsZWN0WzBdWzBdID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICAgICAgcy0+ZmllbGRfc2VsZWN0WzBdWzFdID0gZ2V0X2JpdHMxKCZzLT5nYik7CisKKyAgICAgICAgICAgICAgICBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIDAsIDAsICZwcmVkX3gsICZwcmVkX3kpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBteCA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3gsIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChteCA+PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF95IC8gMiwgcy0+Zl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG15ID49IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVtpXVswXSA9IG14OworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVtpXVsxXSA9IG15OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbeHldID0gTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfTDA7CisgICAgICAgICAgICAgICAgLyogMTZ4MTYgbW90aW9uIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV8xNlgxNjsKKyAgICAgICAgICAgICAgICBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIDAsIDAsICZwcmVkX3gsICZwcmVkX3kpOworICAgICAgICAgICAgICAgIG14ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeCwgcy0+Zl9jb2RlKTsKKworICAgICAgICAgICAgICAgIGlmIChteCA+PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgIG15ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeSwgcy0+Zl9jb2RlKTsKKworICAgICAgICAgICAgICAgIGlmIChteSA+PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9IG14OworICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdID0gbXk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0gPSBNQl9UWVBFXzh4OCB8IE1CX1RZUEVfTDA7CisgICAgICAgICAgICBzLT5tdl90eXBlICAgICAgICAgICAgICAgICAgICAgPSBNVl9UWVBFXzhYODsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtb3RfdmFsID0gZmZfaDI2M19wcmVkX21vdGlvbihzLCBpLCAwLCAmcHJlZF94LCAmcHJlZF95KTsKKyAgICAgICAgICAgICAgICBteCAgICAgID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeCwgcy0+Zl9jb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAobXggPj0gMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgICAgICBteSA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3ksIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgaWYgKG15ID49IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzBdID0gbXg7CisgICAgICAgICAgICAgICAgcy0+bXZbMF1baV1bMV0gPSBteTsKKyAgICAgICAgICAgICAgICBtb3RfdmFsWzBdICAgICA9IG14OworICAgICAgICAgICAgICAgIG1vdF92YWxbMV0gICAgID0gbXk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICBpbnQgbW9kYjE7ICAgLy8gZmlyc3QgYml0IG9mIG1vZGIKKyAgICAgICAgaW50IG1vZGIyOyAgIC8vIHNlY29uZCBiaXQgb2YgbW9kYgorICAgICAgICBpbnQgbWJfdHlwZTsKKworICAgICAgICBzLT5tYl9pbnRyYSA9IDA7ICAvLyBCLWZyYW1lcyBuZXZlciBjb250YWluIGludHJhIGJsb2NrcworICAgICAgICBzLT5tY3NlbCAgICA9IDA7ICAvLyAgICAgIC4uLiAgICAgICAgICAgICAgIHRydWUgZ21jIGJsb2NrcworCisgICAgICAgIGlmIChzLT5tYl94ID09IDApIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzLT5sYXN0X212W2ldWzBdWzBdID0KKyAgICAgICAgICAgICAgICBzLT5sYXN0X212W2ldWzBdWzFdID0KKyAgICAgICAgICAgICAgICBzLT5sYXN0X212W2ldWzFdWzBdID0KKyAgICAgICAgICAgICAgICBzLT5sYXN0X212W2ldWzFdWzFdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKCZzLT5uZXh0X3BpY3R1cmVfcHRyLT50Ziwgcy0+bWJfeSwgMCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiB3ZSBza2lwcGVkIGl0IGluIHRoZSBmdXR1cmUgUCBGcmFtZSB0aGFuIHNraXAgaXQgbm93IHRvbyAqLworICAgICAgICBzLT5tYl9za2lwcGVkID0gcy0+bmV4dF9waWN0dXJlLm1ic2tpcF90YWJsZVtzLT5tYl95ICogcy0+bWJfc3RyaWRlICsgcy0+bWJfeF07ICAvLyBOb3RlLCBza2lwdGFiPTAgaWYgbGFzdCB3YXMgR01DCisKKyAgICAgICAgaWYgKHMtPm1iX3NraXBwZWQpIHsKKyAgICAgICAgICAgIC8qIHNraXAgbWIgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9IC0xOworCisgICAgICAgICAgICBzLT5tdl9kaXIgICAgICA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICAgICAgcy0+bXZfdHlwZSAgICAgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPQorICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPQorICAgICAgICAgICAgcy0+bXZbMV1bMF1bMF0gPQorICAgICAgICAgICAgcy0+bXZbMV1bMF1bMV0gPSAwOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbeHldID0gTUJfVFlQRV9TS0lQICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9UWVBFXzE2eDE2IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfTDA7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIG1vZGIxID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgIGlmIChtb2RiMSkgeworICAgICAgICAgICAgLy8gbGlrZSBNQl9UWVBFX0JfRElSRUNUIGJ1dCBubyB2ZWN0b3JzIGNvZGVkCisgICAgICAgICAgICBtYl90eXBlID0gTUJfVFlQRV9ESVJFQ1QyIHwgTUJfVFlQRV9TS0lQIHwgTUJfVFlQRV9MMEwxOworICAgICAgICAgICAgY2JwICAgICA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtb2RiMiAgID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBtYl90eXBlID0gZ2V0X3ZsYzIoJnMtPmdiLCBtYl90eXBlX2JfdmxjLnRhYmxlLCBNQl9UWVBFX0JfVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgaWYgKG1iX3R5cGUgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIE1CX3R5cGVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1iX3R5cGUgPSBtYl90eXBlX2JfbWFwW21iX3R5cGVdOworICAgICAgICAgICAgaWYgKG1vZGIyKSB7CisgICAgICAgICAgICAgICAgY2JwID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcy0+YmRzcC5jbGVhcl9ibG9ja3Mocy0+YmxvY2tbMF0pOworICAgICAgICAgICAgICAgIGNicCA9IGdldF9iaXRzKCZzLT5nYiwgNik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoIUlTX0RJUkVDVChtYl90eXBlKSkgJiYgY2JwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICAgICAgICAgICAgICBmZl9zZXRfcXNjYWxlKHMsIHMtPnFzY2FsZSArIGdldF9iaXRzMSgmcy0+Z2IpICogNCAtIDIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXMtPnByb2dyZXNzaXZlX3NlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgaWYgKGNicCkKKyAgICAgICAgICAgICAgICAgICAgcy0+aW50ZXJsYWNlZF9kY3QgPSBnZXRfYml0czEoJnMtPmdiKTsKKworICAgICAgICAgICAgICAgIGlmICghSVNfRElSRUNUKG1iX3R5cGUpICYmIGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgICAgIG1iX3R5cGUgfD0gTUJfVFlQRV8xNng4IHwgTUJfVFlQRV9JTlRFUkxBQ0VEOworICAgICAgICAgICAgICAgICAgICBtYl90eXBlICY9IH5NQl9UWVBFXzE2eDE2OworCisgICAgICAgICAgICAgICAgICAgIGlmIChVU0VTX0xJU1QobWJfdHlwZSwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX3NlbGVjdFswXVswXSA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmllbGRfc2VsZWN0WzBdWzFdID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFVTRVNfTElTVChtYl90eXBlLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmllbGRfc2VsZWN0WzFdWzBdID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9zZWxlY3RbMV1bMV0gPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+bXZfZGlyID0gMDsKKyAgICAgICAgICAgIGlmICgobWJfdHlwZSAmIChNQl9UWVBFX0RJUkVDVDIgfCBNQl9UWVBFX0lOVEVSTEFDRUQpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcy0+bXZfdHlwZSA9IE1WX1RZUEVfMTZYMTY7CisKKyAgICAgICAgICAgICAgICBpZiAoVVNFU19MSVNUKG1iX3R5cGUsIDApKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEOworCisgICAgICAgICAgICAgICAgICAgIG14ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHMtPmxhc3RfbXZbMF1bMF1bMF0sIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIG15ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHMtPmxhc3RfbXZbMF1bMF1bMV0sIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMV1bMF0gPQorICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzBdWzBdWzBdID0KKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gICAgICA9IG14OworICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzBdWzFdWzFdID0KKyAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlswXVswXVsxXSA9CisgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdICAgICAgPSBteTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoVVNFU19MSVNUKG1iX3R5cGUsIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X2RpciB8PSBNVl9ESVJfQkFDS1dBUkQ7CisKKyAgICAgICAgICAgICAgICAgICAgbXggPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcy0+bGFzdF9tdlsxXVswXVswXSwgcy0+Yl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcy0+bGFzdF9tdlsxXVswXVsxXSwgcy0+Yl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlsxXVsxXVswXSA9CisgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMV1bMF1bMF0gPQorICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVswXSAgICAgID0gbXg7CisgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMV1bMV1bMV0gPQorICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzFdWzBdWzFdID0KKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMV1bMF1bMV0gICAgICA9IG15OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIUlTX0RJUkVDVChtYl90eXBlKSkgeworICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFX0ZJRUxEOworCisgICAgICAgICAgICAgICAgaWYgKFVTRVNfTElTVChtYl90eXBlLCAwKSkgeworICAgICAgICAgICAgICAgICAgICBzLT5tdl9kaXIgPSBNVl9ESVJfRk9SV0FSRDsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBteCA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBzLT5sYXN0X212WzBdW2ldWzBdLCBzLT5mX2NvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcy0+bGFzdF9tdlswXVtpXVsxXSAvIDIsIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzBdW2ldWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzBdICAgICAgPSBteDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1baV1bMV0gPSAocy0+bXZbMF1baV1bMV0gPSBteSkgKiAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKFVTRVNfTElTVChtYl90eXBlLCAxKSkgeworICAgICAgICAgICAgICAgICAgICBzLT5tdl9kaXIgfD0gTVZfRElSX0JBQ0tXQVJEOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG14ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHMtPmxhc3RfbXZbMV1baV1bMF0sIHMtPmJfY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBteSA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBzLT5sYXN0X212WzFdW2ldWzFdIC8gMiwgcy0+Yl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMV1baV1bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMV1baV1bMF0gICAgICA9IG14OworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlsxXVtpXVsxXSA9IChzLT5tdlsxXVtpXVsxXSA9IG15KSAqIDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoSVNfRElSRUNUKG1iX3R5cGUpKSB7CisgICAgICAgICAgICBpZiAoSVNfU0tJUChtYl90eXBlKSkgeworICAgICAgICAgICAgICAgIG14ID0KKyAgICAgICAgICAgICAgICBteSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG14ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIDAsIDEpOworICAgICAgICAgICAgICAgIG15ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIDAsIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5tdl9kaXIgPSBNVl9ESVJfRk9SV0FSRCB8IE1WX0RJUl9CQUNLV0FSRCB8IE1WX0RJUkVDVDsKKyAgICAgICAgICAgIG1iX3R5cGUgIHw9IGZmX21wZWc0X3NldF9kaXJlY3RfbXYocywgbXgsIG15KTsKKyAgICAgICAgfQorICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV0gPSBtYl90eXBlOworICAgIH0gZWxzZSB7IC8qIEktRnJhbWUgKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgY2JwYyA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19pbnRyYV9NQ0JQQ192bGMudGFibGUsIElOVFJBX01DQlBDX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgIGlmIChjYnBjIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSSBjYnBjIGRhbWFnZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoY2JwYyA9PSA4KTsKKworICAgICAgICBkcXVhbnQgPSBjYnBjICYgNDsKKyAgICAgICAgcy0+bWJfaW50cmEgPSAxOworCitpbnRyYToKKyAgICAgICAgcy0+YWNfcHJlZCA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICBpZiAocy0+YWNfcHJlZCkKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3h5XSA9IE1CX1RZUEVfSU5UUkEgfCBNQl9UWVBFX0FDUFJFRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbeHldID0gTUJfVFlQRV9JTlRSQTsKKworICAgICAgICBjYnB5ID0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9oMjYzX2NicHlfdmxjLnRhYmxlLCBDQlBZX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgaWYgKGNicHkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSSBjYnB5IGRhbWFnZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGNicCA9IChjYnBjICYgMykgfCAoY2JweSA8PCAyKTsKKworICAgICAgICBjdHgtPnVzZV9pbnRyYV9kY192bGMgPSBzLT5xc2NhbGUgPCBjdHgtPmludHJhX2RjX3RocmVzaG9sZDsKKworICAgICAgICBpZiAoZHF1YW50KQorICAgICAgICAgICAgZmZfc2V0X3FzY2FsZShzLCBzLT5xc2NhbGUgKyBxdWFudF90YWJbZ2V0X2JpdHMoJnMtPmdiLCAyKV0pOworCisgICAgICAgIGlmICghcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UpCisgICAgICAgICAgICBzLT5pbnRlcmxhY2VkX2RjdCA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgICAgIHMtPmJkc3AuY2xlYXJfYmxvY2tzKHMtPmJsb2NrWzBdKTsKKyAgICAgICAgLyogZGVjb2RlIGVhY2ggYmxvY2sgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgaWYgKG1wZWc0X2RlY29kZV9ibG9jayhjdHgsIGJsb2NrW2ldLCBpLCBjYnAgJiAzMiwgMSwgMCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGNicCArPSBjYnA7CisgICAgICAgIH0KKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogZGVjb2RlIGVhY2ggYmxvY2sgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIGlmIChtcGVnNF9kZWNvZGVfYmxvY2soY3R4LCBibG9ja1tpXSwgaSwgY2JwICYgMzIsIDAsIDApIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2JwICs9IGNicDsKKyAgICB9CisKK2VuZDoKKyAgICAvKiBwZXItTUIgZW5kIG9mIHNsaWNlIGNoZWNrICovCisgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KSB7CisgICAgICAgIGludCBuZXh0ID0gbXBlZzRfaXNfcmVzeW5jKGN0eCk7CisgICAgICAgIGlmIChuZXh0KSB7CisgICAgICAgICAgICBpZiAgICAgICAgKHMtPm1iX3ggKyBzLT5tYl95KnMtPm1iX3dpZHRoICsgMSA+ICBuZXh0ICYmIChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfQUdHUkVTU0lWRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPm1iX3ggKyBzLT5tYl95KnMtPm1iX3dpZHRoICsgMSA+PSBuZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiBTTElDRV9FTkQ7CisKKyAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGVsdGE9IHMtPm1iX3ggKyAxID09IHMtPm1iX3dpZHRoID8gMiA6IDE7CisgICAgICAgICAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKCZzLT5uZXh0X3BpY3R1cmVfcHRyLT50ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1iX3ggKyBkZWx0YSA+PSBzLT5tYl93aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGRk1JTihzLT5tYl95ICsgMSwgcy0+bWJfaGVpZ2h0IC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzLT5tYl95LCAwKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+bmV4dF9waWN0dXJlLm1ic2tpcF90YWJsZVt4eSArIGRlbHRhXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNMSUNFX09LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gU0xJQ0VfRU5EOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFNMSUNFX09LOworfQorCitzdGF0aWMgaW50IG1wZWc0X2RlY29kZV9nb3BfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHM7CisKKyAgICBpZiAoIXNob3dfYml0cyhnYiwgMjMpKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJHT1AgaGVhZGVyIGludmFsaWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaG91cnMgICA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICBtaW51dGVzID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgIHNraXBfYml0czEoZ2IpOworICAgIHNlY29uZHMgPSBnZXRfYml0cyhnYiwgNik7CisKKyAgICBzLT50aW1lX2Jhc2UgPSBzZWNvbmRzICsgNjAqKG1pbnV0ZXMgKyA2MCpob3Vycyk7CisKKyAgICBza2lwX2JpdHMxKGdiKTsKKyAgICBza2lwX2JpdHMxKGdiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wZWc0X2RlY29kZV9wcm9maWxlX2xldmVsKE1wZWdFbmNDb250ZXh0ICpzLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKworICAgIHMtPmF2Y3R4LT5wcm9maWxlID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgIHMtPmF2Y3R4LT5sZXZlbCAgID0gZ2V0X2JpdHMoZ2IsIDQpOworCisgICAgLy8gZm9yIFNpbXBsZSBwcm9maWxlLCBsZXZlbCAwCisgICAgaWYgKHMtPmF2Y3R4LT5wcm9maWxlID09IDAgJiYgcy0+YXZjdHgtPmxldmVsID09IDgpIHsKKyAgICAgICAgcy0+YXZjdHgtPmxldmVsID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfdm9sX2hlYWRlcihNcGVnNERlY0NvbnRleHQgKmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmY3R4LT5tOworICAgIGludCB3aWR0aCwgaGVpZ2h0LCB2b192ZXJfaWQ7CisKKyAgICAvKiB2b2wgaGVhZGVyICovCisgICAgc2tpcF9iaXRzKGdiLCAxKTsgICAgICAgICAgICAgICAgICAgLyogcmFuZG9tIGFjY2VzcyAqLworICAgIHMtPnZvX3R5cGUgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgaWYgKGdldF9iaXRzMShnYikgIT0gMCkgeyAgICAgICAgICAgLyogaXNfb2xfaWQgKi8KKyAgICAgICAgdm9fdmVyX2lkID0gZ2V0X2JpdHMoZ2IsIDQpOyAgICAvKiB2b192ZXJfaWQgKi8KKyAgICAgICAgc2tpcF9iaXRzKGdiLCAzKTsgICAgICAgICAgICAgICAvKiB2b19wcmlvcml0eSAqLworICAgIH0gZWxzZSB7CisgICAgICAgIHZvX3Zlcl9pZCA9IDE7CisgICAgfQorICAgIHMtPmFzcGVjdF9yYXRpb19pbmZvID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgIGlmIChzLT5hc3BlY3RfcmF0aW9faW5mbyA9PSBGRl9BU1BFQ1RfRVhURU5ERUQpIHsKKyAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID0gZ2V0X2JpdHMoZ2IsIDgpOyAgLy8gcGFyX3dpZHRoCisgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9IGdldF9iaXRzKGdiLCA4KTsgIC8vIHBhcl9oZWlnaHQKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGZmX2gyNjNfcGl4ZWxfYXNwZWN0W3MtPmFzcGVjdF9yYXRpb19pbmZvXTsKKyAgICB9CisKKyAgICBpZiAoKGN0eC0+dm9sX2NvbnRyb2xfcGFyYW1ldGVycyA9IGdldF9iaXRzMShnYikpKSB7IC8qIHZvbCBjb250cm9sIHBhcmFtZXRlciAqLworICAgICAgICBpbnQgY2hyb21hX2Zvcm1hdCA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgaWYgKGNocm9tYV9mb3JtYXQgIT0gQ0hST01BXzQyMCkKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBjaHJvbWEgZm9ybWF0XG4iKTsKKworICAgICAgICBzLT5sb3dfZGVsYXkgPSBnZXRfYml0czEoZ2IpOworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAgICAvKiB2YnYgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgZ2V0X2JpdHMoZ2IsIDE1KTsgICAvKiBmaXJzdF9oYWxmX2JpdHJhdGUgKi8KKyAgICAgICAgICAgIHNraXBfYml0czEoZ2IpOyAgICAgLyogbWFya2VyICovCisgICAgICAgICAgICBnZXRfYml0cyhnYiwgMTUpOyAgIC8qIGxhdHRlcl9oYWxmX2JpdHJhdGUgKi8KKyAgICAgICAgICAgIHNraXBfYml0czEoZ2IpOyAgICAgLyogbWFya2VyICovCisgICAgICAgICAgICBnZXRfYml0cyhnYiwgMTUpOyAgIC8qIGZpcnN0X2hhbGZfdmJ2X2J1ZmZlcl9zaXplICovCisgICAgICAgICAgICBza2lwX2JpdHMxKGdiKTsgICAgIC8qIG1hcmtlciAqLworICAgICAgICAgICAgZ2V0X2JpdHMoZ2IsIDMpOyAgICAvKiBsYXR0ZXJfaGFsZl92YnZfYnVmZmVyX3NpemUgKi8KKyAgICAgICAgICAgIGdldF9iaXRzKGdiLCAxMSk7ICAgLyogZmlyc3RfaGFsZl92YnZfb2NjdXBhbmN5ICovCisgICAgICAgICAgICBza2lwX2JpdHMxKGdiKTsgICAgIC8qIG1hcmtlciAqLworICAgICAgICAgICAgZ2V0X2JpdHMoZ2IsIDE1KTsgICAvKiBsYXR0ZXJfaGFsZl92YnZfb2NjdXBhbmN5ICovCisgICAgICAgICAgICBza2lwX2JpdHMxKGdiKTsgICAgIC8qIG1hcmtlciAqLworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogaXMgc2V0dGluZyBsb3cgZGVsYXkgZmxhZyBvbmx5IG9uY2UgdGhlIHNtYXJ0ZXN0IHRoaW5nIHRvIGRvPworICAgICAgICAgKiBsb3cgZGVsYXkgZGV0ZWN0aW9uIHdvbid0IGJlIG92ZXJyaWRkZW4uICovCisgICAgICAgIGlmIChzLT5waWN0dXJlX251bWJlciA9PSAwKQorICAgICAgICAgICAgcy0+bG93X2RlbGF5ID0gMDsKKyAgICB9CisKKyAgICBjdHgtPnNoYXBlID0gZ2V0X2JpdHMoZ2IsIDIpOyAvKiB2b2wgc2hhcGUgKi8KKyAgICBpZiAoY3R4LT5zaGFwZSAhPSBSRUNUX1NIQVBFKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm9ubHkgcmVjdGFuZ3VsYXIgdm9sIHN1cHBvcnRlZFxuIik7CisgICAgaWYgKGN0eC0+c2hhcGUgPT0gR1JBWV9TSEFQRSAmJiB2b192ZXJfaWQgIT0gMSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkdyYXkgc2hhcGUgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHNraXBfYml0cyhnYiwgNCk7ICAvKiB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGVfZXh0ZW5zaW9uICovCisgICAgfQorCisgICAgY2hlY2tfbWFya2VyKGdiLCAiYmVmb3JlIHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24iKTsKKworICAgIHMtPmF2Y3R4LT5mcmFtZXJhdGUubnVtID0gZ2V0X2JpdHMoZ2IsIDE2KTsKKyAgICBpZiAoIXMtPmF2Y3R4LT5mcmFtZXJhdGUubnVtKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZnJhbWVyYXRlPT0wXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3R4LT50aW1lX2luY3JlbWVudF9iaXRzID0gYXZfbG9nMihzLT5hdmN0eC0+ZnJhbWVyYXRlLm51bSAtIDEpICsgMTsKKyAgICBpZiAoY3R4LT50aW1lX2luY3JlbWVudF9iaXRzIDwgMSkKKyAgICAgICAgY3R4LT50aW1lX2luY3JlbWVudF9iaXRzID0gMTsKKworICAgIGNoZWNrX21hcmtlcihnYiwgImJlZm9yZSBmaXhlZF92b3BfcmF0ZSIpOworCisgICAgaWYgKGdldF9iaXRzMShnYikgIT0gMCkgICAgIC8qIGZpeGVkX3ZvcF9yYXRlICAqLworICAgICAgICBzLT5hdmN0eC0+ZnJhbWVyYXRlLmRlbiA9IGdldF9iaXRzKGdiLCBjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMpOworICAgIGVsc2UKKyAgICAgICAgcy0+YXZjdHgtPmZyYW1lcmF0ZS5kZW4gPSAxOworCisgICAgcy0+YXZjdHgtPnRpbWVfYmFzZSA9IGF2X2ludl9xKGF2X211bF9xKHMtPmF2Y3R4LT5mcmFtZXJhdGUsIChBVlJhdGlvbmFsKXtzLT5hdmN0eC0+dGlja3NfcGVyX2ZyYW1lLCAxfSkpOworCisgICAgY3R4LT50X2ZyYW1lID0gMDsKKworICAgIGlmIChjdHgtPnNoYXBlICE9IEJJTl9PTkxZX1NIQVBFKSB7CisgICAgICAgIGlmIChjdHgtPnNoYXBlID09IFJFQ1RfU0hBUEUpIHsKKyAgICAgICAgICAgIGNoZWNrX21hcmtlcihnYiwgImJlZm9yZSB3aWR0aCIpOworICAgICAgICAgICAgd2lkdGggPSBnZXRfYml0cyhnYiwgMTMpOworICAgICAgICAgICAgY2hlY2tfbWFya2VyKGdiLCAiYmVmb3JlIGhlaWdodCIpOworICAgICAgICAgICAgaGVpZ2h0ID0gZ2V0X2JpdHMoZ2IsIDEzKTsKKyAgICAgICAgICAgIGNoZWNrX21hcmtlcihnYiwgImFmdGVyIGhlaWdodCIpOworICAgICAgICAgICAgaWYgKHdpZHRoICYmIGhlaWdodCAmJiAgLyogdGhleSBzaG91bGQgYmUgbm9uIHplcm8gYnV0IHdobyBrbm93cyAqLworICAgICAgICAgICAgICAgICEocy0+d2lkdGggJiYgcy0+Y29kZWNfdGFnID09IEFWX1JMMzIoIk1QNFMiKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+d2lkdGggJiYgcy0+aGVpZ2h0ICYmCisgICAgICAgICAgICAgICAgICAgIChzLT53aWR0aCAhPSB3aWR0aCB8fCBzLT5oZWlnaHQgIT0gaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICAgICAgcy0+Y29udGV4dF9yZWluaXQgPSAxOworICAgICAgICAgICAgICAgIHMtPndpZHRoICA9IHdpZHRoOworICAgICAgICAgICAgICAgIHMtPmhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHMtPnByb2dyZXNzaXZlX3NlcXVlbmNlICA9CisgICAgICAgIHMtPnByb2dyZXNzaXZlX2ZyYW1lICAgICA9IGdldF9iaXRzMShnYikgXiAxOworICAgICAgICBzLT5pbnRlcmxhY2VkX2RjdCAgICAgICAgPSAwOworICAgICAgICBpZiAoIWdldF9iaXRzMShnYikgJiYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAgICAgICAgICAgLyogT0JNQyBEaXNhYmxlICovCisgICAgICAgICAgICAgICAgICAgIk1QRUc0IE9CTUMgbm90IHN1cHBvcnRlZCAodmVyeSBsaWtlbHkgYnVnZ3kgZW5jb2RlcilcbiIpOworICAgICAgICBpZiAodm9fdmVyX2lkID09IDEpCisgICAgICAgICAgICBjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPSBnZXRfYml0czEoZ2IpOyAgICAvKiB2b2xfc3ByaXRlX3VzYWdlICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN0eC0+dm9sX3Nwcml0ZV91c2FnZSA9IGdldF9iaXRzKGdiLCAyKTsgIC8qIHZvbF9zcHJpdGVfdXNhZ2UgKi8KKworICAgICAgICBpZiAoY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IFNUQVRJQ19TUFJJVEUpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlN0YXRpYyBTcHJpdGVzIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICBpZiAoY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IFNUQVRJQ19TUFJJVEUgfHwKKyAgICAgICAgICAgIGN0eC0+dm9sX3Nwcml0ZV91c2FnZSA9PSBHTUNfU1BSSVRFKSB7CisgICAgICAgICAgICBpZiAoY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IFNUQVRJQ19TUFJJVEUpIHsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDEzKTsgLy8gc3ByaXRlX3dpZHRoCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzMShnYik7IC8qIG1hcmtlciAqLworICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTMpOyAvLyBzcHJpdGVfaGVpZ2h0CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzMShnYik7IC8qIG1hcmtlciAqLworICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTMpOyAvLyBzcHJpdGVfbGVmdAorICAgICAgICAgICAgICAgIHNraXBfYml0czEoZ2IpOyAvKiBtYXJrZXIgKi8KKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDEzKTsgLy8gc3ByaXRlX3RvcAorICAgICAgICAgICAgICAgIHNraXBfYml0czEoZ2IpOyAvKiBtYXJrZXIgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN0eC0+bnVtX3Nwcml0ZV93YXJwaW5nX3BvaW50cyA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICAgICAgICAgIGlmIChjdHgtPm51bV9zcHJpdGVfd2FycGluZ19wb2ludHMgPiAzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlZCBzcHJpdGVfd2FycGluZ19wb2ludHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bnVtX3Nwcml0ZV93YXJwaW5nX3BvaW50cyk7CisgICAgICAgICAgICAgICAgY3R4LT5udW1fc3ByaXRlX3dhcnBpbmdfcG9pbnRzID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5ICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgIGN0eC0+c3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGlmIChjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gU1RBVElDX1NQUklURSkKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMxKGdiKTsgLy8gbG93X2xhdGVuY3lfc3ByaXRlCisgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUUgc2FkY3QgZGlzYWJsZSBiaXQgaWYgdmVyaWQhPTEgJiYgc2hhcGUgbm90IHJlY3QKKworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSA9PSAxKSB7ICAgICAgICAgICAgICAgICAgIC8qIG5vdF84X2JpdCAqLworICAgICAgICAgICAgcy0+cXVhbnRfcHJlY2lzaW9uID0gZ2V0X2JpdHMoZ2IsIDQpOyAgIC8qIHF1YW50X3ByZWNpc2lvbiAqLworICAgICAgICAgICAgaWYgKGdldF9iaXRzKGdiLCA0KSAhPSA4KSAgICAgICAgICAgICAgIC8qIGJpdHNfcGVyX3BpeGVsICovCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJOLWJpdCBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIGlmIChzLT5xdWFudF9wcmVjaXNpb24gIT0gNSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgInF1YW50IHByZWNpc2lvbiAlZFxuIiwgcy0+cXVhbnRfcHJlY2lzaW9uKTsKKyAgICAgICAgICAgIGlmIChzLT5xdWFudF9wcmVjaXNpb248MyB8fCBzLT5xdWFudF9wcmVjaXNpb24+OSkgeworICAgICAgICAgICAgICAgIHMtPnF1YW50X3ByZWNpc2lvbiA9IDU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5xdWFudF9wcmVjaXNpb24gPSA1OworICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUUgYSBidW5jaCBvZiBncmF5c2NhbGUgc2hhcGUgdGhpbmdzCisKKyAgICAgICAgaWYgKChzLT5tcGVnX3F1YW50ID0gZ2V0X2JpdHMxKGdiKSkpIHsgLyogdm9sX3F1YW50X3R5cGUgKi8KKyAgICAgICAgICAgIGludCBpLCB2OworCisgICAgICAgICAgICAvKiBsb2FkIGRlZmF1bHQgbWF0cml4ZXMgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV07CisgICAgICAgICAgICAgICAgdiA9IGZmX21wZWc0X2RlZmF1bHRfaW50cmFfbWF0cml4W2ldOworICAgICAgICAgICAgICAgIHMtPmludHJhX21hdHJpeFtqXSAgICAgICAgPSB2OworICAgICAgICAgICAgICAgIHMtPmNocm9tYV9pbnRyYV9tYXRyaXhbal0gPSB2OworCisgICAgICAgICAgICAgICAgdiA9IGZmX21wZWc0X2RlZmF1bHRfbm9uX2ludHJhX21hdHJpeFtpXTsKKyAgICAgICAgICAgICAgICBzLT5pbnRlcl9tYXRyaXhbal0gICAgICAgID0gdjsKKyAgICAgICAgICAgICAgICBzLT5jaHJvbWFfaW50ZXJfbWF0cml4W2pdID0gdjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbG9hZCBjdXN0b20gaW50cmEgbWF0cml4ICovCisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgICAgIGludCBsYXN0ID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSB2OworICAgICAgICAgICAgICAgICAgICBqID0gcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworICAgICAgICAgICAgICAgICAgICBzLT5pbnRyYV9tYXRyaXhbal0gICAgICAgID0gbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgcy0+Y2hyb21hX2ludHJhX21hdHJpeFtqXSA9IGxhc3Q7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogcmVwbGljYXRlIGxhc3QgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25bZmZfemlnemFnX2RpcmVjdFtpXV07CisgICAgICAgICAgICAgICAgICAgIHMtPmludHJhX21hdHJpeFtqXSAgICAgICAgPSBsYXN0OworICAgICAgICAgICAgICAgICAgICBzLT5jaHJvbWFfaW50cmFfbWF0cml4W2pdID0gbGFzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGxvYWQgY3VzdG9tIG5vbiBpbnRyYSBtYXRyaXggKi8KKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgaW50IGxhc3QgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHY7CisgICAgICAgICAgICAgICAgICAgIGogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25bZmZfemlnemFnX2RpcmVjdFtpXV07CisgICAgICAgICAgICAgICAgICAgIHMtPmludGVyX21hdHJpeFtqXSAgICAgICAgPSB2OworICAgICAgICAgICAgICAgICAgICBzLT5jaHJvbWFfaW50ZXJfbWF0cml4W2pdID0gdjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiByZXBsaWNhdGUgbGFzdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltmZl96aWd6YWdfZGlyZWN0W2ldXTsKKyAgICAgICAgICAgICAgICAgICAgcy0+aW50ZXJfbWF0cml4W2pdICAgICAgICA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgIHMtPmNocm9tYV9pbnRlcl9tYXRyaXhbal0gPSBsYXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRklYTUUgYSBidW5jaCBvZiBncmF5c2NhbGUgc2hhcGUgdGhpbmdzCisgICAgICAgIH0KKworICAgICAgICBpZiAodm9fdmVyX2lkICE9IDEpCisgICAgICAgICAgICBzLT5xdWFydGVyX3NhbXBsZSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPnF1YXJ0ZXJfc2FtcGxlID0gMDsKKworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA0KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlZPTCBIZWFkZXIgdHJ1bmNhdGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBpbnQgcG9zICAgICAgICAgICAgICAgPSBnZXRfYml0c19jb3VudChnYik7CisgICAgICAgICAgICBpbnQgZXN0aW1hdGlvbl9tZXRob2QgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICBpZiAoZXN0aW1hdGlvbl9tZXRob2QgPCAyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiBvcGFxdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfaSArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIHRyYW5zcGFyZW50ICovCisgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiBpbnRyYV9jYWUgKi8KKyAgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfaSArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIGludGVyX2NhZSAqLworICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogbm9fdXBkYXRlICovCisgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiB1cGFtcGxpbmcgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiBpbnRyYV9ibG9ja3MgKi8KKyAgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfcCArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIGludGVyX2Jsb2NrcyAqLworICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9wICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogaW50ZXI0dl9ibG9ja3MgKi8KKyAgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfaSArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIG5vdCBjb2RlZCBibG9ja3MgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFjaGVja19tYXJrZXIoZ2IsICJpbiBjb21wbGV4aXR5IGVzdGltYXRpb24gcGFydCAxIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIHBvcyAtIGdldF9iaXRzX2NvdW50KGdiKSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9fY3BseF9lc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogZGN0X2NvZWZmcyAqLworICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogZGN0X2xpbmVzICovCisgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiB2bGNfc3ltcyAqLworICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDQgKiBnZXRfYml0czEoZ2IpOyAgLyogdmxjX2JpdHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX3AgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiBhcG0gKi8KKyAgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfcCArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIG5wbSAqLworICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9iICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogaW50ZXJwb2xhdGVfbWNfcSAqLworICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9wICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogZm9yd2JhY2tfbWNfcSAqLworICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9wICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogaGFsZnBlbDIgKi8KKyAgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfcCArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIGhhbGZwZWw0ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghY2hlY2tfbWFya2VyKGdiLCAiaW4gY29tcGxleGl0eSBlc3RpbWF0aW9uIHBhcnQgMiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0c19sb25nKGdiLCBwb3MgLSBnZXRfYml0c19jb3VudChnYikpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG5vX2NwbHhfZXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXN0aW1hdGlvbl9tZXRob2QgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogc2FkY3QgKi8KKyAgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfcCArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIHFwZWwgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgQ29tcGxleGl0eSBlc3RpbWF0aW9uIG1ldGhvZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGlvbl9tZXRob2QpOworICAgICAgICB9IGVsc2UgeworCitub19jcGx4X2VzdDoKKyAgICAgICAgICAgIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kgPQorICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfcCA9CisgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9iID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+cmVzeW5jX21hcmtlciA9ICFnZXRfYml0czEoZ2IpOyAvKiByZXN5bmNfbWFya2VyX2Rpc2FibGVkICovCisKKyAgICAgICAgcy0+ZGF0YV9wYXJ0aXRpb25pbmcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICBpZiAocy0+ZGF0YV9wYXJ0aXRpb25pbmcpCisgICAgICAgICAgICBjdHgtPnJ2bGMgPSBnZXRfYml0czEoZ2IpOworCisgICAgICAgIGlmICh2b192ZXJfaWQgIT0gMSkgeworICAgICAgICAgICAgY3R4LT5uZXdfcHJlZCA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAoY3R4LT5uZXdfcHJlZCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibmV3IHByZWQgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAyKTsgLyogcmVxdWVzdGVkIHVwc3RyZWFtIG1lc3NhZ2UgdHlwZSAqLworICAgICAgICAgICAgICAgIHNraXBfYml0czEoZ2IpOyAgIC8qIG5ld3ByZWQgc2VnbWVudCB0eXBlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgLy8gcmVkdWNlZF9yZXNfdm9wCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJyZWR1Y2VkIHJlc29sdXRpb24gVk9QIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3R4LT5uZXdfcHJlZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPnNjYWxhYmlsaXR5ID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICBpZiAoY3R4LT5zY2FsYWJpbGl0eSkgeworICAgICAgICAgICAgR2V0Qml0Q29udGV4dCBiYWsgPSAqZ2I7CisgICAgICAgICAgICBpbnQgaF9zYW1wbGluZ19mYWN0b3JfbjsKKyAgICAgICAgICAgIGludCBoX3NhbXBsaW5nX2ZhY3Rvcl9tOworICAgICAgICAgICAgaW50IHZfc2FtcGxpbmdfZmFjdG9yX247CisgICAgICAgICAgICBpbnQgdl9zYW1wbGluZ19mYWN0b3JfbTsKKworICAgICAgICAgICAgc2tpcF9iaXRzMShnYik7ICAgIC8vIGhpZXJhcmNoeV90eXBlCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDQpOyAgLyogcmVmX2xheWVyX2lkICovCisgICAgICAgICAgICBza2lwX2JpdHMxKGdiKTsgICAgLyogcmVmX2xheWVyX3NhbXBsaW5nX2RpciAqLworICAgICAgICAgICAgaF9zYW1wbGluZ19mYWN0b3JfbiA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICAgICAgICAgIGhfc2FtcGxpbmdfZmFjdG9yX20gPSBnZXRfYml0cyhnYiwgNSk7CisgICAgICAgICAgICB2X3NhbXBsaW5nX2ZhY3Rvcl9uID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgICAgICAgICAgdl9zYW1wbGluZ19mYWN0b3JfbSA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICAgICAgICAgIGN0eC0+ZW5oYW5jZW1lbnRfdHlwZSA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgICAgIGlmIChoX3NhbXBsaW5nX2ZhY3Rvcl9uID09IDAgfHwgaF9zYW1wbGluZ19mYWN0b3JfbSA9PSAwIHx8CisgICAgICAgICAgICAgICAgdl9zYW1wbGluZ19mYWN0b3JfbiA9PSAwIHx8IHZfc2FtcGxpbmdfZmFjdG9yX20gPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIGlsbGVnYWwgc2NhbGFiaWxpdHkgaGVhZGVyIChWRVJZIGJyb2tlbiBlbmNvZGVyKSwKKyAgICAgICAgICAgICAgICAgKiB0cnlpbmcgdG8gd29ya2Fyb3VuZCAqLworICAgICAgICAgICAgICAgIGN0eC0+c2NhbGFiaWxpdHkgPSAwOworICAgICAgICAgICAgICAgICpnYiAgICAgICAgICAgID0gYmFrOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzY2FsYWJpbGl0eSBub3Qgc3VwcG9ydGVkXG4iKTsKKworICAgICAgICAgICAgLy8gYmluIHNoYXBlIHN0dWZmIEZJWE1FCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+YXZjdHgtPmRlYnVnJkZGX0RFQlVHX1BJQ1RfSU5GTykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInRiICVkLyVkLCB0aW5jcmJpdHM6JWQsIHFwX3ByZWM6JWQsIHBzOiVkLCAgJXMlcyVzJXNcbiIsCisgICAgICAgICAgICAgICBzLT5hdmN0eC0+ZnJhbWVyYXRlLmRlbiwgcy0+YXZjdHgtPmZyYW1lcmF0ZS5udW0sCisgICAgICAgICAgICAgICBjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMsCisgICAgICAgICAgICAgICBzLT5xdWFudF9wcmVjaXNpb24sCisgICAgICAgICAgICAgICBzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSwKKyAgICAgICAgICAgICAgIGN0eC0+c2NhbGFiaWxpdHkgPyAic2NhbGFiaWxpdHkgIiA6IiIgLCBzLT5xdWFydGVyX3NhbXBsZSA/ICJxcGVsICIgOiAiIiwKKyAgICAgICAgICAgICAgIHMtPmRhdGFfcGFydGl0aW9uaW5nID8gInBhcnRpdGlvbiAiIDogIiIsIGN0eC0+cnZsYyA/ICJydmxjICIgOiAiIgorICAgICAgICApOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSB0aGUgdXNlciBkYXRhIHN0dWZmIGluIHRoZSBoZWFkZXIuCisgKiBBbHNvIGluaXRpYWxpemVzIGRpdngveHZpZC9sYXZjX3ZlcnNpb24vYnVpbGQuCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3VzZXJfZGF0YShNcGVnNERlY0NvbnRleHQgKmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmY3R4LT5tOworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgaW50IGk7CisgICAgaW50IGU7CisgICAgaW50IHZlciA9IDAsIGJ1aWxkID0gMCwgdmVyMiA9IDAsIHZlcjMgPSAwOworICAgIGNoYXIgbGFzdDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTUgJiYgZ2V0X2JpdHNfY291bnQoZ2IpIDwgZ2ItPnNpemVfaW5fYml0czsgaSsrKSB7CisgICAgICAgIGlmIChzaG93X2JpdHMoZ2IsIDIzKSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJ1ZltpXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICB9CisgICAgYnVmW2ldID0gMDsKKworICAgIC8qIGRpdnggZGV0ZWN0aW9uICovCisgICAgZSA9IHNzY2FuZihidWYsICJEaXZYJWRCdWlsZCVkJWMiLCAmdmVyLCAmYnVpbGQsICZsYXN0KTsKKyAgICBpZiAoZSA8IDIpCisgICAgICAgIGUgPSBzc2NhbmYoYnVmLCAiRGl2WCVkYiVkJWMiLCAmdmVyLCAmYnVpbGQsICZsYXN0KTsKKyAgICBpZiAoZSA+PSAyKSB7CisgICAgICAgIGN0eC0+ZGl2eF92ZXJzaW9uID0gdmVyOworICAgICAgICBjdHgtPmRpdnhfYnVpbGQgICA9IGJ1aWxkOworICAgICAgICBzLT5kaXZ4X3BhY2tlZCAgPSBlID09IDMgJiYgbGFzdCA9PSAncCc7CisgICAgICAgIGlmIChzLT5kaXZ4X3BhY2tlZCAmJiAhY3R4LT5zaG93ZWRfcGFja2VkX3dhcm5pbmcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJWaWRlbyB1c2VzIGEgbm9uLXN0YW5kYXJkIGFuZCAiCisgICAgICAgICAgICAgICAgICAgIndhc3RlZnVsIHdheSB0byBzdG9yZSBCLWZyYW1lcyAoJ3BhY2tlZCBCLWZyYW1lcycpLiAiCisgICAgICAgICAgICAgICAgICAgIkNvbnNpZGVyIHVzaW5nIGEgdG9vbCBsaWtlIFZpcnR1YWxEdWIgb3IgYXZpZGVtdXggdG8gZml4IGl0LlxuIik7CisgICAgICAgICAgICBjdHgtPnNob3dlZF9wYWNrZWRfd2FybmluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBsaWJhdmNvZGVjIGRldGVjdGlvbiAqLworICAgIGUgPSBzc2NhbmYoYnVmLCAiRkZtcGUlKlteYl1iJWQiLCAmYnVpbGQpICsgMzsKKyAgICBpZiAoZSAhPSA0KQorICAgICAgICBlID0gc3NjYW5mKGJ1ZiwgIkZGbXBlZyB2JWQuJWQuJWQgLyBsaWJhdmNvZGVjIGJ1aWxkOiAlZCIsICZ2ZXIsICZ2ZXIyLCAmdmVyMywgJmJ1aWxkKTsKKyAgICBpZiAoZSAhPSA0KSB7CisgICAgICAgIGUgPSBzc2NhbmYoYnVmLCAiTGF2YyVkLiVkLiVkIiwgJnZlciwgJnZlcjIsICZ2ZXIzKSArIDE7CisgICAgICAgIGlmIChlID4gMSkKKyAgICAgICAgICAgIGJ1aWxkID0gKHZlciA8PCAxNikgKyAodmVyMiA8PCA4KSArIHZlcjM7CisgICAgfQorICAgIGlmIChlICE9IDQpIHsKKyAgICAgICAgaWYgKHN0cmNtcChidWYsICJmZm1wZWciKSA9PSAwKQorICAgICAgICAgICAgY3R4LT5sYXZjX2J1aWxkID0gNDYwMDsKKyAgICB9CisgICAgaWYgKGUgPT0gNCkKKyAgICAgICAgY3R4LT5sYXZjX2J1aWxkID0gYnVpbGQ7CisKKyAgICAvKiBYdmlkIGRldGVjdGlvbiAqLworICAgIGUgPSBzc2NhbmYoYnVmLCAiWHZpRCVkIiwgJmJ1aWxkKTsKKyAgICBpZiAoZSA9PSAxKQorICAgICAgICBjdHgtPnh2aWRfYnVpbGQgPSBidWlsZDsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfbXBlZzRfd29ya2Fyb3VuZF9idWdzKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNcGVnNERlY0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmY3R4LT5tOworCisgICAgaWYgKGN0eC0+eHZpZF9idWlsZCA9PSAtMSAmJiBjdHgtPmRpdnhfdmVyc2lvbiA9PSAtMSAmJiBjdHgtPmxhdmNfYnVpbGQgPT0gLTEpIHsKKyAgICAgICAgaWYgKHMtPnN0cmVhbV9jb2RlY190YWcgPT0gQVZfUkwzMigiWFZJRCIpIHx8CisgICAgICAgICAgICBzLT5jb2RlY190YWcgICAgICAgID09IEFWX1JMMzIoIlhWSUQiKSB8fAorICAgICAgICAgICAgcy0+Y29kZWNfdGFnICAgICAgICA9PSBBVl9STDMyKCJYVklYIikgfHwKKyAgICAgICAgICAgIHMtPmNvZGVjX3RhZyAgICAgICAgPT0gQVZfUkwzMigiUk1QNCIpIHx8CisgICAgICAgICAgICBzLT5jb2RlY190YWcgICAgICAgID09IEFWX1JMMzIoIlpNUDQiKSB8fAorICAgICAgICAgICAgcy0+Y29kZWNfdGFnICAgICAgICA9PSBBVl9STDMyKCJTSVBQIikpCisgICAgICAgICAgICBjdHgtPnh2aWRfYnVpbGQgPSAwOworICAgIH0KKworICAgIGlmIChjdHgtPnh2aWRfYnVpbGQgPT0gLTEgJiYgY3R4LT5kaXZ4X3ZlcnNpb24gPT0gLTEgJiYgY3R4LT5sYXZjX2J1aWxkID09IC0xKQorICAgICAgICBpZiAocy0+Y29kZWNfdGFnID09IEFWX1JMMzIoIkRJVlgiKSAmJiBzLT52b190eXBlID09IDAgJiYKKyAgICAgICAgICAgIGN0eC0+dm9sX2NvbnRyb2xfcGFyYW1ldGVycyA9PSAwKQorICAgICAgICAgICAgY3R4LT5kaXZ4X3ZlcnNpb24gPSA0MDA7ICAvLyBkaXZ4IDQKKworICAgIGlmIChjdHgtPnh2aWRfYnVpbGQgPj0gMCAmJiBjdHgtPmRpdnhfdmVyc2lvbiA+PSAwKSB7CisgICAgICAgIGN0eC0+ZGl2eF92ZXJzaW9uID0KKyAgICAgICAgY3R4LT5kaXZ4X2J1aWxkICAgPSAtMTsKKyAgICB9CisKKyAgICBpZiAocy0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX0FVVE9ERVRFQ1QpIHsKKyAgICAgICAgaWYgKHMtPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJYVklYIikpCisgICAgICAgICAgICBzLT53b3JrYXJvdW5kX2J1Z3MgfD0gRkZfQlVHX1hWSURfSUxBQ0U7CisKKyAgICAgICAgaWYgKHMtPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJVTVA0IikpCisgICAgICAgICAgICBzLT53b3JrYXJvdW5kX2J1Z3MgfD0gRkZfQlVHX1VNUDQ7CisKKyAgICAgICAgaWYgKGN0eC0+ZGl2eF92ZXJzaW9uID49IDUwMCAmJiBjdHgtPmRpdnhfYnVpbGQgPCAxODE0KQorICAgICAgICAgICAgcy0+d29ya2Fyb3VuZF9idWdzIHw9IEZGX0JVR19RUEVMX0NIUk9NQTsKKworICAgICAgICBpZiAoY3R4LT5kaXZ4X3ZlcnNpb24gPiA1MDIgJiYgY3R4LT5kaXZ4X2J1aWxkIDwgMTgxNCkKKyAgICAgICAgICAgIHMtPndvcmthcm91bmRfYnVncyB8PSBGRl9CVUdfUVBFTF9DSFJPTUEyOworCisgICAgICAgIGlmIChjdHgtPnh2aWRfYnVpbGQgPD0gM1UpCisgICAgICAgICAgICBzLT5wYWRkaW5nX2J1Z19zY29yZSA9IDI1NiAqIDI1NiAqIDI1NiAqIDY0OworCisgICAgICAgIGlmIChjdHgtPnh2aWRfYnVpbGQgPD0gMVUpCisgICAgICAgICAgICBzLT53b3JrYXJvdW5kX2J1Z3MgfD0gRkZfQlVHX1FQRUxfQ0hST01BOworCisgICAgICAgIGlmIChjdHgtPnh2aWRfYnVpbGQgPD0gMTJVKQorICAgICAgICAgICAgcy0+d29ya2Fyb3VuZF9idWdzIHw9IEZGX0JVR19FREdFOworCisgICAgICAgIGlmIChjdHgtPnh2aWRfYnVpbGQgPD0gMzJVKQorICAgICAgICAgICAgcy0+d29ya2Fyb3VuZF9idWdzIHw9IEZGX0JVR19EQ19DTElQOworCisjZGVmaW5lIFNFVF9RUEVMX0ZVTkMocG9zdGZpeDEsIHBvc3RmaXgyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzLT5xZHNwLnB1dF8gICAgICAgICMjIHBvc3RmaXgxID0gZmZfcHV0XyAgICAgICAgIyMgcG9zdGZpeDI7ICAgXAorICAgIHMtPnFkc3AucHV0X25vX3JuZF8gIyMgcG9zdGZpeDEgPSBmZl9wdXRfbm9fcm5kXyAjIyBwb3N0Zml4MjsgICBcCisgICAgcy0+cWRzcC5hdmdfICAgICAgICAjIyBwb3N0Zml4MSA9IGZmX2F2Z18gICAgICAgICMjIHBvc3RmaXgyOworCisgICAgICAgIGlmIChjdHgtPmxhdmNfYnVpbGQgPCA0NjUzVSkKKyAgICAgICAgICAgIHMtPndvcmthcm91bmRfYnVncyB8PSBGRl9CVUdfU1REX1FQRUw7CisKKyAgICAgICAgaWYgKGN0eC0+bGF2Y19idWlsZCA8IDQ2NTVVKQorICAgICAgICAgICAgcy0+d29ya2Fyb3VuZF9idWdzIHw9IEZGX0JVR19ESVJFQ1RfQkxPQ0tTSVpFOworCisgICAgICAgIGlmIChjdHgtPmxhdmNfYnVpbGQgPCA0NjcwVSkKKyAgICAgICAgICAgIHMtPndvcmthcm91bmRfYnVncyB8PSBGRl9CVUdfRURHRTsKKworICAgICAgICBpZiAoY3R4LT5sYXZjX2J1aWxkIDw9IDQ3MTJVKQorICAgICAgICAgICAgcy0+d29ya2Fyb3VuZF9idWdzIHw9IEZGX0JVR19EQ19DTElQOworCisgICAgICAgIGlmIChjdHgtPmRpdnhfdmVyc2lvbiA+PSAwKQorICAgICAgICAgICAgcy0+d29ya2Fyb3VuZF9idWdzIHw9IEZGX0JVR19ESVJFQ1RfQkxPQ0tTSVpFOworICAgICAgICBpZiAoY3R4LT5kaXZ4X3ZlcnNpb24gPT0gNTAxICYmIGN0eC0+ZGl2eF9idWlsZCA9PSAyMDAyMDQxNikKKyAgICAgICAgICAgIHMtPnBhZGRpbmdfYnVnX3Njb3JlID0gMjU2ICogMjU2ICogMjU2ICogNjQ7CisKKyAgICAgICAgaWYgKGN0eC0+ZGl2eF92ZXJzaW9uIDwgNTAwVSkKKyAgICAgICAgICAgIHMtPndvcmthcm91bmRfYnVncyB8PSBGRl9CVUdfRURHRTsKKworICAgICAgICBpZiAoY3R4LT5kaXZ4X3ZlcnNpb24gPj0gMCkKKyAgICAgICAgICAgIHMtPndvcmthcm91bmRfYnVncyB8PSBGRl9CVUdfSFBFTF9DSFJPTUE7CisgICAgfQorCisgICAgaWYgKHMtPndvcmthcm91bmRfYnVncyAmIEZGX0JVR19TVERfUVBFTCkgeworICAgICAgICBTRVRfUVBFTF9GVU5DKHFwZWxfcGl4ZWxzX3RhYlswXVs1XSwgcXBlbDE2X21jMTFfb2xkX2MpCisgICAgICAgIFNFVF9RUEVMX0ZVTkMocXBlbF9waXhlbHNfdGFiWzBdWzddLCBxcGVsMTZfbWMzMV9vbGRfYykKKyAgICAgICAgU0VUX1FQRUxfRlVOQyhxcGVsX3BpeGVsc190YWJbMF1bOV0sIHFwZWwxNl9tYzEyX29sZF9jKQorICAgICAgICBTRVRfUVBFTF9GVU5DKHFwZWxfcGl4ZWxzX3RhYlswXVsxMV0sIHFwZWwxNl9tYzMyX29sZF9jKQorICAgICAgICBTRVRfUVBFTF9GVU5DKHFwZWxfcGl4ZWxzX3RhYlswXVsxM10sIHFwZWwxNl9tYzEzX29sZF9jKQorICAgICAgICBTRVRfUVBFTF9GVU5DKHFwZWxfcGl4ZWxzX3RhYlswXVsxNV0sIHFwZWwxNl9tYzMzX29sZF9jKQorCisgICAgICAgIFNFVF9RUEVMX0ZVTkMocXBlbF9waXhlbHNfdGFiWzFdWzVdLCBxcGVsOF9tYzExX29sZF9jKQorICAgICAgICBTRVRfUVBFTF9GVU5DKHFwZWxfcGl4ZWxzX3RhYlsxXVs3XSwgcXBlbDhfbWMzMV9vbGRfYykKKyAgICAgICAgU0VUX1FQRUxfRlVOQyhxcGVsX3BpeGVsc190YWJbMV1bOV0sIHFwZWw4X21jMTJfb2xkX2MpCisgICAgICAgIFNFVF9RUEVMX0ZVTkMocXBlbF9waXhlbHNfdGFiWzFdWzExXSwgcXBlbDhfbWMzMl9vbGRfYykKKyAgICAgICAgU0VUX1FQRUxfRlVOQyhxcGVsX3BpeGVsc190YWJbMV1bMTNdLCBxcGVsOF9tYzEzX29sZF9jKQorICAgICAgICBTRVRfUVBFTF9GVU5DKHFwZWxfcGl4ZWxzX3RhYlsxXVsxNV0sIHFwZWw4X21jMzNfb2xkX2MpCisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX0JVR1MpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgImJ1Z3M6ICVYIGxhdmNfYnVpbGQ6JWQgeHZpZF9idWlsZDolZCBkaXZ4X3ZlcnNpb246JWQgZGl2eF9idWlsZDolZCAlc1xuIiwKKyAgICAgICAgICAgICAgIHMtPndvcmthcm91bmRfYnVncywgY3R4LT5sYXZjX2J1aWxkLCBjdHgtPnh2aWRfYnVpbGQsCisgICAgICAgICAgICAgICBjdHgtPmRpdnhfdmVyc2lvbiwgY3R4LT5kaXZ4X2J1aWxkLCBzLT5kaXZ4X3BhY2tlZCA/ICJwIiA6ICIiKTsKKworICAgIGlmIChDT05GSUdfTVBFRzRfREVDT0RFUiAmJiBjdHgtPnh2aWRfYnVpbGQgPj0gMCAmJgorICAgICAgICBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCAmJgorICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfQVVUTykgeworICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID0gRkZfSURDVF9YVklEOworICAgICAgICBmZl9tcHZfaWRjdF9pbml0KHMpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfdm9wX2hlYWRlcihNcGVnNERlY0NvbnRleHQgKmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmY3R4LT5tOworICAgIGludCB0aW1lX2luY3IsIHRpbWVfaW5jcmVtZW50OworICAgIGludDY0X3QgcHRzOworCisgICAgcy0+cGljdF90eXBlID0gZ2V0X2JpdHMoZ2IsIDIpICsgQVZfUElDVFVSRV9UWVBFX0k7ICAgICAgICAvKiBwaWN0IHR5cGU6IEkgPSAwICwgUCA9IDEgKi8KKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmIHMtPmxvd19kZWxheSAmJgorICAgICAgICBjdHgtPnZvbF9jb250cm9sX3BhcmFtZXRlcnMgPT0gMCAmJiAhKHMtPmZsYWdzICYgQ09ERUNfRkxBR19MT1dfREVMQVkpKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibG93X2RlbGF5IGZsYWcgc2V0IGluY29ycmVjdGx5LCBjbGVhcmluZyBpdFxuIik7CisgICAgICAgIHMtPmxvd19kZWxheSA9IDA7CisgICAgfQorCisgICAgcy0+cGFydGl0aW9uZWRfZnJhbWUgPSBzLT5kYXRhX3BhcnRpdGlvbmluZyAmJiBzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0I7CisgICAgaWYgKHMtPnBhcnRpdGlvbmVkX2ZyYW1lKQorICAgICAgICBzLT5kZWNvZGVfbWIgPSBtcGVnNF9kZWNvZGVfcGFydGl0aW9uZWRfbWI7CisgICAgZWxzZQorICAgICAgICBzLT5kZWNvZGVfbWIgPSBtcGVnNF9kZWNvZGVfbWI7CisKKyAgICB0aW1lX2luY3IgPSAwOworICAgIHdoaWxlIChnZXRfYml0czEoZ2IpICE9IDApCisgICAgICAgIHRpbWVfaW5jcisrOworCisgICAgY2hlY2tfbWFya2VyKGdiLCAiYmVmb3JlIHRpbWVfaW5jcmVtZW50Iik7CisKKyAgICBpZiAoY3R4LT50aW1lX2luY3JlbWVudF9iaXRzID09IDAgfHwKKyAgICAgICAgIShzaG93X2JpdHMoZ2IsIGN0eC0+dGltZV9pbmNyZW1lbnRfYml0cyArIDEpICYgMSkpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiaG1tLCBzZWVtcyB0aGUgaGVhZGVycyBhcmUgbm90IGNvbXBsZXRlLCB0cnlpbmcgdG8gZ3Vlc3MgdGltZV9pbmNyZW1lbnRfYml0c1xuIik7CisKKyAgICAgICAgZm9yIChjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMgPSAxOworICAgICAgICAgICAgIGN0eC0+dGltZV9pbmNyZW1lbnRfYml0cyA8IDE2OworICAgICAgICAgICAgIGN0eC0+dGltZV9pbmNyZW1lbnRfYml0cysrKSB7CisgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QIHx8CisgICAgICAgICAgICAgICAgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUyAmJgorICAgICAgICAgICAgICAgICBjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gR01DX1NQUklURSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHNob3dfYml0cyhnYiwgY3R4LT50aW1lX2luY3JlbWVudF9iaXRzICsgNikgJiAweDM3KSA9PSAweDMwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHNob3dfYml0cyhnYiwgY3R4LT50aW1lX2luY3JlbWVudF9iaXRzICsgNSkgJiAweDFGKSA9PSAweDE4KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAibXkgZ3Vlc3MgaXMgJWQgYml0cyA7KVxuIiwgY3R4LT50aW1lX2luY3JlbWVudF9iaXRzKTsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5mcmFtZXJhdGUubnVtICYmIDQqcy0+YXZjdHgtPmZyYW1lcmF0ZS5udW0gPCAxPDxjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMpIHsKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5mcmFtZXJhdGUubnVtID0gMTw8Y3R4LT50aW1lX2luY3JlbWVudF9iaXRzOworICAgICAgICAgICAgcy0+YXZjdHgtPnRpbWVfYmFzZSA9IGF2X2ludl9xKGF2X211bF9xKHMtPmF2Y3R4LT5mcmFtZXJhdGUsIChBVlJhdGlvbmFsKXtzLT5hdmN0eC0+dGlja3NfcGVyX2ZyYW1lLCAxfSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKElTXzNJVjEpCisgICAgICAgIHRpbWVfaW5jcmVtZW50ID0gZ2V0X2JpdHMxKGdiKTsgICAgICAgIC8vIEZJWE1FIGludmVzdGlnYXRlIGZ1cnRoZXIKKyAgICBlbHNlCisgICAgICAgIHRpbWVfaW5jcmVtZW50ID0gZ2V0X2JpdHMoZ2IsIGN0eC0+dGltZV9pbmNyZW1lbnRfYml0cyk7CisKKyAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIHMtPmxhc3RfdGltZV9iYXNlID0gcy0+dGltZV9iYXNlOworICAgICAgICBzLT50aW1lX2Jhc2UgICAgICs9IHRpbWVfaW5jcjsKKyAgICAgICAgcy0+dGltZSA9IHMtPnRpbWVfYmFzZSAqIHMtPmF2Y3R4LT5mcmFtZXJhdGUubnVtICsgdGltZV9pbmNyZW1lbnQ7CisgICAgICAgIGlmIChzLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfVU1QNCkgeworICAgICAgICAgICAgaWYgKHMtPnRpbWUgPCBzLT5sYXN0X25vbl9iX3RpbWUpIHsKKyAgICAgICAgICAgICAgICAvKiBoZWFkZXIgaXMgbm90IG1wZWctNC1jb21wYXRpYmxlLCBicm9rZW4gZW5jb2RlciwKKyAgICAgICAgICAgICAgICAgKiB0cnlpbmcgdG8gd29ya2Fyb3VuZCAqLworICAgICAgICAgICAgICAgIHMtPnRpbWVfYmFzZSsrOworICAgICAgICAgICAgICAgIHMtPnRpbWUgKz0gcy0+YXZjdHgtPmZyYW1lcmF0ZS5udW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcy0+cHBfdGltZSAgICAgICAgID0gcy0+dGltZSAtIHMtPmxhc3Rfbm9uX2JfdGltZTsKKyAgICAgICAgcy0+bGFzdF9ub25fYl90aW1lID0gcy0+dGltZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT50aW1lICAgID0gKHMtPmxhc3RfdGltZV9iYXNlICsgdGltZV9pbmNyKSAqIHMtPmF2Y3R4LT5mcmFtZXJhdGUubnVtICsgdGltZV9pbmNyZW1lbnQ7CisgICAgICAgIHMtPnBiX3RpbWUgPSBzLT5wcF90aW1lIC0gKHMtPmxhc3Rfbm9uX2JfdGltZSAtIHMtPnRpbWUpOworICAgICAgICBpZiAocy0+cHBfdGltZSA8PSBzLT5wYl90aW1lIHx8CisgICAgICAgICAgICBzLT5wcF90aW1lIDw9IHMtPnBwX3RpbWUgLSBzLT5wYl90aW1lIHx8CisgICAgICAgICAgICBzLT5wcF90aW1lIDw9IDApIHsKKyAgICAgICAgICAgIC8qIG1lc3NlZCB1cCBvcmRlciwgbWF5YmUgYWZ0ZXIgc2Vla2luZz8gc2tpcHBpbmcgY3VycmVudCBiLWZyYW1lICovCisgICAgICAgICAgICByZXR1cm4gRlJBTUVfU0tJUFBFRDsKKyAgICAgICAgfQorICAgICAgICBmZl9tcGVnNF9pbml0X2RpcmVjdF9tdihzKTsKKworICAgICAgICBpZiAoY3R4LT50X2ZyYW1lID09IDApCisgICAgICAgICAgICBjdHgtPnRfZnJhbWUgPSBzLT5wYl90aW1lOworICAgICAgICBpZiAoY3R4LT50X2ZyYW1lID09IDApCisgICAgICAgICAgICBjdHgtPnRfZnJhbWUgPSAxOyAgLy8gMS8wIHByb3RlY3Rpb24KKyAgICAgICAgcy0+cHBfZmllbGRfdGltZSA9IChST1VOREVEX0RJVihzLT5sYXN0X25vbl9iX3RpbWUsIGN0eC0+dF9mcmFtZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPVU5ERURfRElWKHMtPmxhc3Rfbm9uX2JfdGltZSAtIHMtPnBwX3RpbWUsIGN0eC0+dF9mcmFtZSkpICogMjsKKyAgICAgICAgcy0+cGJfZmllbGRfdGltZSA9IChST1VOREVEX0RJVihzLT50aW1lLCBjdHgtPnRfZnJhbWUpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBST1VOREVEX0RJVihzLT5sYXN0X25vbl9iX3RpbWUgLSBzLT5wcF90aW1lLCBjdHgtPnRfZnJhbWUpKSAqIDI7CisgICAgICAgIGlmIChzLT5wcF9maWVsZF90aW1lIDw9IHMtPnBiX2ZpZWxkX3RpbWUgfHwgcy0+cGJfZmllbGRfdGltZSA8PSAxKSB7CisgICAgICAgICAgICBzLT5wYl9maWVsZF90aW1lID0gMjsKKyAgICAgICAgICAgIHMtPnBwX2ZpZWxkX3RpbWUgPSA0OworICAgICAgICAgICAgaWYgKCFzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRlJBTUVfU0tJUFBFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5hdmN0eC0+ZnJhbWVyYXRlLmRlbikKKyAgICAgICAgcHRzID0gUk9VTkRFRF9ESVYocy0+dGltZSwgcy0+YXZjdHgtPmZyYW1lcmF0ZS5kZW4pOworICAgIGVsc2UKKyAgICAgICAgcHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyZGRl9ERUJVR19QVFMpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiTVBFRzQgUFRTOiAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICBwdHMpOworCisgICAgY2hlY2tfbWFya2VyKGdiLCAiYmVmb3JlIHZvcF9jb2RlZCIpOworCisgICAgLyogdm9wIGNvZGVkICovCisgICAgaWYgKGdldF9iaXRzMShnYikgIT0gMSkgeworICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ2b3Agbm90IGNvZGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEZSQU1FX1NLSVBQRUQ7CisgICAgfQorICAgIGlmIChjdHgtPm5ld19wcmVkKQorICAgICAgICBkZWNvZGVfbmV3X3ByZWQoY3R4LCBnYik7CisKKyAgICBpZiAoY3R4LT5zaGFwZSAhPSBCSU5fT05MWV9TSEFQRSAmJgorICAgICAgICAgICAgICAgICAgICAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QIHx8CisgICAgICAgICAgICAgICAgICAgICAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9TICYmCisgICAgICAgICAgICAgICAgICAgICAgY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IEdNQ19TUFJJVEUpKSkgeworICAgICAgICAvKiByb3VuZGluZyB0eXBlIGZvciBtb3Rpb24gZXN0aW1hdGlvbiAqLworICAgICAgICBzLT5ub19yb3VuZGluZyA9IGdldF9iaXRzMShnYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bm9fcm91bmRpbmcgPSAwOworICAgIH0KKyAgICAvLyBGSVhNRSByZWR1Y2VkIHJlcyBzdHVmZgorCisgICAgaWYgKGN0eC0+c2hhcGUgIT0gUkVDVF9TSEFQRSkgeworICAgICAgICBpZiAoY3R4LT52b2xfc3ByaXRlX3VzYWdlICE9IDEgfHwgcy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDEzKTsgIC8qIHdpZHRoICovCisgICAgICAgICAgICBza2lwX2JpdHMxKGdiKTsgICAgIC8qIG1hcmtlciAqLworICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxMyk7ICAvKiBoZWlnaHQgKi8KKyAgICAgICAgICAgIHNraXBfYml0czEoZ2IpOyAgICAgLyogbWFya2VyICovCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDEzKTsgIC8qIGhvcl9zcGF0X3JlZiAqLworICAgICAgICAgICAgc2tpcF9iaXRzMShnYik7ICAgICAvKiBtYXJrZXIgKi8KKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTMpOyAgLyogdmVyX3NwYXRfcmVmICovCisgICAgICAgIH0KKyAgICAgICAgc2tpcF9iaXRzMShnYik7ICAgICAgICAgLyogY2hhbmdlX0NSX2Rpc2FibGUgKi8KKworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSAhPSAwKQorICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA4KTsgICAvKiBjb25zdGFudF9hbHBoYV92YWx1ZSAqLworICAgIH0KKworICAgIC8vIEZJWE1FIGNvbXBsZXhpdHkgZXN0aW1hdGlvbiBzdHVmZgorCisgICAgaWYgKGN0eC0+c2hhcGUgIT0gQklOX09OTFlfU0hBUEUpIHsKKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kpOworICAgICAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JKQorICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX3ApOworICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2IpOworCisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSGVhZGVyIHRydW5jYXRlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBjdHgtPmludHJhX2RjX3RocmVzaG9sZCA9IGZmX21wZWc0X2RjX3RocmVzaG9sZFtnZXRfYml0cyhnYiwgMyldOworICAgICAgICBpZiAoIXMtPnByb2dyZXNzaXZlX3NlcXVlbmNlKSB7CisgICAgICAgICAgICBzLT50b3BfZmllbGRfZmlyc3QgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgcy0+YWx0ZXJuYXRlX3NjYW4gID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzLT5hbHRlcm5hdGVfc2NhbiA9IDA7CisgICAgfQorCisgICAgaWYgKHMtPmFsdGVybmF0ZV9zY2FuKSB7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludGVyX3NjYW50YWJsZSwgICBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbik7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX3NjYW50YWJsZSwgICBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbik7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX2hfc2NhbnRhYmxlLCBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbik7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX3Zfc2NhbnRhYmxlLCBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50ZXJfc2NhbnRhYmxlLCAgIGZmX3ppZ3phZ19kaXJlY3QpOworICAgICAgICBmZl9pbml0X3NjYW50YWJsZShzLT5pZHNwLmlkY3RfcGVybXV0YXRpb24sICZzLT5pbnRyYV9zY2FudGFibGUsICAgZmZfemlnemFnX2RpcmVjdCk7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX2hfc2NhbnRhYmxlLCBmZl9hbHRlcm5hdGVfaG9yaXpvbnRhbF9zY2FuKTsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50cmFfdl9zY2FudGFibGUsIGZmX2FsdGVybmF0ZV92ZXJ0aWNhbF9zY2FuKTsKKyAgICB9CisKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9TICYmCisgICAgICAgIChjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gU1RBVElDX1NQUklURSB8fAorICAgICAgICAgY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IEdNQ19TUFJJVEUpKSB7CisgICAgICAgIGlmIChtcGVnNF9kZWNvZGVfc3ByaXRlX3RyYWplY3RvcnkoY3R4LCBnYikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmIChjdHgtPnNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSkKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2Ugbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIGlmIChjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gU1RBVElDX1NQUklURSkKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic3RhdGljIHNwcml0ZSBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5zaGFwZSAhPSBCSU5fT05MWV9TSEFQRSkgeworICAgICAgICBzLT5jaHJvbWFfcXNjYWxlID0gcy0+cXNjYWxlID0gZ2V0X2JpdHMoZ2IsIHMtPnF1YW50X3ByZWNpc2lvbik7CisgICAgICAgIGlmIChzLT5xc2NhbGUgPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkVycm9yLCBoZWFkZXIgZGFtYWdlZCBvciBub3QgTVBFRzQgaGVhZGVyIChxc2NhbGU9MClcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7ICAvLyBtYWtlcyBubyBzZW5zZSB0byBjb250aW51ZSwgYXMgdGhlcmUgaXMgbm90aGluZyBsZWZ0IGZyb20gdGhlIGltYWdlIHRoZW4KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgICAgIHMtPmZfY29kZSA9IGdldF9iaXRzKGdiLCAzKTsgICAgICAgIC8qIGZjb2RlX2ZvciAqLworICAgICAgICAgICAgaWYgKHMtPmZfY29kZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciwgaGVhZGVyIGRhbWFnZWQgb3Igbm90IE1QRUc0IGhlYWRlciAoZl9jb2RlPTApXG4iKTsKKyAgICAgICAgICAgICAgICBzLT5mX2NvZGUgPSAxOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAgLy8gbWFrZXMgbm8gc2Vuc2UgdG8gY29udGludWUsIGFzIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCBmcm9tIHRoZSBpbWFnZSB0aGVuCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcy0+Zl9jb2RlID0gMTsKKworICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgICAgICBzLT5iX2NvZGUgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgICAgICAgICBpZiAocy0+Yl9jb2RlID09IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yLCBoZWFkZXIgZGFtYWdlZCBvciBub3QgTVBFRzQgaGVhZGVyIChiX2NvZGU9MClcbiIpOworICAgICAgICAgICAgICAgIHMtPmJfY29kZT0xOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAvLyBtYWtlcyBubyBzZW5zZSB0byBjb250aW51ZSwgYXMgdGhlIE1WIGRlY29kaW5nIHdpbGwgYnJlYWsgdmVyeSBxdWlja2x5CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcy0+Yl9jb2RlID0gMTsKKworICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAicXA6JWQgZmM6JWQsJWQgJXMgc2l6ZTolZCBwcm86JWQgYWx0OiVkIHRvcDolZCAlc3BlbCBwYXJ0OiVkIHJlc3luYzolZCB3OiVkIGE6JWQgcm5kOiVkIHZvdDolZCVzIGRjOiVkIGNlOiVkLyVkLyVkIHRpbWU6JSJQUklkNjQiIHRpbmNyOiVkXG4iLAorICAgICAgICAgICAgICAgICAgIHMtPnFzY2FsZSwgcy0+Zl9jb2RlLCBzLT5iX2NvZGUsCisgICAgICAgICAgICAgICAgICAgcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JID8gIkkiIDogKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCA/ICJQIiA6IChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgPyAiQiIgOiAiUyIpKSwKKyAgICAgICAgICAgICAgICAgICBnYi0+c2l6ZV9pbl9iaXRzLHMtPnByb2dyZXNzaXZlX3NlcXVlbmNlLCBzLT5hbHRlcm5hdGVfc2NhbiwKKyAgICAgICAgICAgICAgICAgICBzLT50b3BfZmllbGRfZmlyc3QsIHMtPnF1YXJ0ZXJfc2FtcGxlID8gInEiIDogImgiLAorICAgICAgICAgICAgICAgICAgIHMtPmRhdGFfcGFydGl0aW9uaW5nLCBjdHgtPnJlc3luY19tYXJrZXIsCisgICAgICAgICAgICAgICAgICAgY3R4LT5udW1fc3ByaXRlX3dhcnBpbmdfcG9pbnRzLCBzLT5zcHJpdGVfd2FycGluZ19hY2N1cmFjeSwKKyAgICAgICAgICAgICAgICAgICAxIC0gcy0+bm9fcm91bmRpbmcsIHMtPnZvX3R5cGUsCisgICAgICAgICAgICAgICAgICAgY3R4LT52b2xfY29udHJvbF9wYXJhbWV0ZXJzID8gIiBWT0xDIiA6ICIgIiwgY3R4LT5pbnRyYV9kY190aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfaSwgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfcCwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9iLAorICAgICAgICAgICAgICAgICAgIHMtPnRpbWUsCisgICAgICAgICAgICAgICAgICAgdGltZV9pbmNyZW1lbnQKKyAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWN0eC0+c2NhbGFiaWxpdHkpIHsKKyAgICAgICAgICAgIGlmIChjdHgtPnNoYXBlICE9IFJFQ1RfU0hBUEUgJiYgcy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JKQorICAgICAgICAgICAgICAgIHNraXBfYml0czEoZ2IpOyAgLy8gdm9wIHNoYXBlIGNvZGluZyB0eXBlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY3R4LT5lbmhhbmNlbWVudF90eXBlKSB7CisgICAgICAgICAgICAgICAgaW50IGxvYWRfYmFja3dhcmRfc2hhcGUgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIGlmIChsb2FkX2JhY2t3YXJkX3NoYXBlKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkIGJhY2t3YXJkIHNoYXBlIGlzbid0IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDIpOyAgLy8gcmVmX3NlbGVjdF9jb2RlCisgICAgICAgIH0KKyAgICB9CisgICAgLyogZGV0ZWN0IGJ1Z2d5IGVuY29kZXJzIHdoaWNoIGRvbid0IHNldCB0aGUgbG93X2RlbGF5IGZsYWcKKyAgICAgKiAoZGl2eDQveHZpZC9vcGVuZGl2eCkuIE5vdGUgd2UgY2Fubm90IGRldGVjdCBkaXZ4NSB3aXRob3V0IGItZnJhbWVzCisgICAgICogZWFzaWx5IChhbHRob3VnaCBpdCdzIGJ1Z2d5IHRvbykgKi8KKyAgICBpZiAocy0+dm9fdHlwZSA9PSAwICYmIGN0eC0+dm9sX2NvbnRyb2xfcGFyYW1ldGVycyA9PSAwICYmCisgICAgICAgIGN0eC0+ZGl2eF92ZXJzaW9uID09IC0xICYmIHMtPnBpY3R1cmVfbnVtYmVyID09IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJsb29rcyBsaWtlIHRoaXMgZmlsZSB3YXMgZW5jb2RlZCB3aXRoIChkaXZ4NC8ob2xkKXh2aWQvb3BlbmRpdngpIC0+IGZvcmNpbmcgbG93X2RlbGF5IGZsYWdcbiIpOworICAgICAgICBzLT5sb3dfZGVsYXkgPSAxOworICAgIH0KKworICAgIHMtPnBpY3R1cmVfbnVtYmVyKys7ICAvLyBiZXR0ZXIgdGhhbiBwaWMgbnVtYmVyPT0wIGFsd2F5cyA7KQorCisgICAgLy8gRklYTUUgYWRkIHNob3J0IGhlYWRlciBzdXBwb3J0CisgICAgcy0+eV9kY19zY2FsZV90YWJsZSA9IGZmX21wZWc0X3lfZGNfc2NhbGVfdGFibGU7CisgICAgcy0+Y19kY19zY2FsZV90YWJsZSA9IGZmX21wZWc0X2NfZGNfc2NhbGVfdGFibGU7CisKKyAgICBpZiAocy0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX0VER0UpIHsKKyAgICAgICAgcy0+aF9lZGdlX3BvcyA9IHMtPndpZHRoOworICAgICAgICBzLT52X2VkZ2VfcG9zID0gcy0+aGVpZ2h0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgbXBlZzQgaGVhZGVycy4KKyAqIEByZXR1cm4gPDAgaWYgbm8gVk9QIGZvdW5kIChvciBhIGRhbWFnZWQgb25lKQorICogICAgICAgICBGUkFNRV9TS0lQUEVEIGlmIGEgbm90IGNvZGVkIFZPUCBpcyBmb3VuZAorICogICAgICAgICAwIGlmIGEgVk9QIGlzIGZvdW5kCisgKi8KK2ludCBmZl9tcGVnNF9kZWNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZzREZWNDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKKyAgICB1bnNpZ25lZCBzdGFydGNvZGUsIHY7CisgICAgaW50IHJldDsKKworICAgIC8qIHNlYXJjaCBuZXh0IHN0YXJ0IGNvZGUgKi8KKyAgICBhbGlnbl9nZXRfYml0cyhnYik7CisKKyAgICBpZiAocy0+Y29kZWNfdGFnID09IEFWX1JMMzIoIldWMUYiKSAmJiBzaG93X2JpdHMoZ2IsIDI0KSA9PSAweDU3NTYzMCkgeworICAgICAgICBza2lwX2JpdHMoZ2IsIDI0KTsKKyAgICAgICAgaWYgKGdldF9iaXRzKGdiLCA4KSA9PSAweEYwKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgc3RhcnRjb2RlID0gMHhmZjsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChnZXRfYml0c19jb3VudChnYikgPj0gZ2ItPnNpemVfaW5fYml0cykgeworICAgICAgICAgICAgaWYgKGdiLT5zaXplX2luX2JpdHMgPT0gOCAmJgorICAgICAgICAgICAgICAgIChjdHgtPmRpdnhfdmVyc2lvbiA+PSAwIHx8IGN0eC0+eHZpZF9idWlsZCA+PSAwKSB8fCBzLT5jb2RlY190YWcgPT0gQVZfUkwzMigiUU1QNCIpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgImZyYW1lIHNraXAgJWRcbiIsIGdiLT5zaXplX2luX2JpdHMpOworICAgICAgICAgICAgICAgIHJldHVybiBGUkFNRV9TS0lQUEVEOyAgLy8gZGl2eCBidWcKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsgIC8vIGVuZCBvZiBzdHJlYW0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHVzZSB0aGUgYml0cyBhZnRlciB0aGUgdGVzdCAqLworICAgICAgICB2ID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICBzdGFydGNvZGUgPSAoKHN0YXJ0Y29kZSA8PCA4KSB8IHYpICYgMHhmZmZmZmZmZjsKKworICAgICAgICBpZiAoKHN0YXJ0Y29kZSAmIDB4RkZGRkZGMDApICE9IDB4MTAwKQorICAgICAgICAgICAgY29udGludWU7ICAvLyBubyBzdGFydGNvZGUKKworICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfU1RBUlRDT0RFKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInN0YXJ0Y29kZTogJTNYICIsIHN0YXJ0Y29kZSk7CisgICAgICAgICAgICBpZiAoc3RhcnRjb2RlIDw9IDB4MTFGKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVmlkZW8gT2JqZWN0IFN0YXJ0Iik7CisgICAgICAgICAgICBlbHNlIGlmIChzdGFydGNvZGUgPD0gMHgxMkYpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJWaWRlbyBPYmplY3QgTGF5ZXIgU3RhcnQiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0Y29kZSA8PSAweDEzRikKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlJlc2VydmVkIik7CisgICAgICAgICAgICBlbHNlIGlmIChzdGFydGNvZGUgPD0gMHgxNUYpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJGR1MgYnAgc3RhcnQiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0Y29kZSA8PSAweDFBRikKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlJlc2VydmVkIik7CisgICAgICAgICAgICBlbHNlIGlmIChzdGFydGNvZGUgPT0gMHgxQjApCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJWaXN1YWwgT2JqZWN0IFNlcSBTdGFydCIpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUIxKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVmlzdWFsIE9iamVjdCBTZXEgRW5kIik7CisgICAgICAgICAgICBlbHNlIGlmIChzdGFydGNvZGUgPT0gMHgxQjIpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJVc2VyIERhdGEiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFCMykKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkdyb3VwIG9mIFZPUCBzdGFydCIpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUI0KQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVmlkZW8gU2Vzc2lvbiBFcnJvciIpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUI1KQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVmlzdWFsIE9iamVjdCBTdGFydCIpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUI2KQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVmlkZW8gT2JqZWN0IFBsYW5lIHN0YXJ0Iik7CisgICAgICAgICAgICBlbHNlIGlmIChzdGFydGNvZGUgPT0gMHgxQjcpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJzbGljZSBzdGFydCIpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUI4KQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiZXh0ZW5zaW9uIHN0YXJ0Iik7CisgICAgICAgICAgICBlbHNlIGlmIChzdGFydGNvZGUgPT0gMHgxQjkpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJmZ3Mgc3RhcnQiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFCQSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkZCQSBPYmplY3Qgc3RhcnQiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFCQikKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkZCQSBPYmplY3QgUGxhbmUgc3RhcnQiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFCQykKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIk1lc2ggT2JqZWN0IHN0YXJ0Iik7CisgICAgICAgICAgICBlbHNlIGlmIChzdGFydGNvZGUgPT0gMHgxQkQpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJNZXNoIE9iamVjdCBQbGFuZSBzdGFydCIpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUJFKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiU3RpbGwgVGV4dHVyZSBPYmplY3Qgc3RhcnQiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFCRikKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlRleHR1cmUgU3BhdGlhbCBMYXllciBzdGFydCIpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUMwKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVGV4dHVyZSBTTlIgTGF5ZXIgc3RhcnQiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFDMSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlRleHR1cmUgVGlsZSBzdGFydCIpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUMyKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVGV4dHVyZSBTaGFwZSBMYXllciBzdGFydCIpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUMzKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAic3R1ZmZpbmcgc3RhcnQiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0Y29kZSA8PSAweDFDNSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInJlc2VydmVkIik7CisgICAgICAgICAgICBlbHNlIGlmIChzdGFydGNvZGUgPD0gMHgxRkYpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJTeXN0ZW0gc3RhcnQiKTsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiIGF0ICVkXG4iLCBnZXRfYml0c19jb3VudChnYikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXJ0Y29kZSA+PSAweDEyMCAmJiBzdGFydGNvZGUgPD0gMHgxMkYpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX3ZvbF9oZWFkZXIoY3R4LCBnYikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSBVU0VSX0RBVEFfU1RBUlRDT0RFKSB7CisgICAgICAgICAgICBkZWNvZGVfdXNlcl9kYXRhKGN0eCwgZ2IpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSBHT1BfU1RBUlRDT0RFKSB7CisgICAgICAgICAgICBtcGVnNF9kZWNvZGVfZ29wX2hlYWRlcihzLCBnYik7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRjb2RlID09IFZPU19TVEFSVENPREUpIHsKKyAgICAgICAgICAgIG1wZWc0X2RlY29kZV9wcm9maWxlX2xldmVsKHMsIGdiKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydGNvZGUgPT0gVk9QX1NUQVJUQ09ERSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhbGlnbl9nZXRfYml0cyhnYik7CisgICAgICAgIHN0YXJ0Y29kZSA9IDB4ZmY7CisgICAgfQorCitlbmQ6CisgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19MT1dfREVMQVkpCisgICAgICAgIHMtPmxvd19kZWxheSA9IDE7CisgICAgcy0+YXZjdHgtPmhhc19iX2ZyYW1lcyA9ICFzLT5sb3dfZGVsYXk7CisKKyAgICByZXR1cm4gZGVjb2RlX3ZvcF9oZWFkZXIoY3R4LCBnYik7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9tcGVnNHZpZGVvZGVjX3N0YXRpY19pbml0KHZvaWQpIHsKKyAgICBzdGF0aWMgaW50IGRvbmUgPSAwOworCisgICAgaWYgKCFkb25lKSB7CisgICAgICAgIGZmX2luaXRfcmwoJmZmX21wZWc0X3JsX2ludHJhLCBmZl9tcGVnNF9zdGF0aWNfcmxfdGFibGVfc3RvcmVbMF0pOworICAgICAgICBmZl9pbml0X3JsKCZmZl9ydmxjX3JsX2ludGVyLCBmZl9tcGVnNF9zdGF0aWNfcmxfdGFibGVfc3RvcmVbMV0pOworICAgICAgICBmZl9pbml0X3JsKCZmZl9ydmxjX3JsX2ludHJhLCBmZl9tcGVnNF9zdGF0aWNfcmxfdGFibGVfc3RvcmVbMl0pOworICAgICAgICBJTklUX1ZMQ19STChmZl9tcGVnNF9ybF9pbnRyYSwgNTU0KTsKKyAgICAgICAgSU5JVF9WTENfUkwoZmZfcnZsY19ybF9pbnRlciwgMTA3Mik7CisgICAgICAgIElOSVRfVkxDX1JMKGZmX3J2bGNfcmxfaW50cmEsIDEwNzIpOworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmRjX2x1bSwgRENfVkxDX0JJVFMsIDEwIC8qIDEzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21wZWc0X0RDdGFiX2x1bVswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9tcGVnNF9EQ3RhYl9sdW1bMF1bMF0sIDIsIDEsIDUxMik7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmZGNfY2hyb20sIERDX1ZMQ19CSVRTLCAxMCAvKiAxMyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9tcGVnNF9EQ3RhYl9jaHJvbVswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9tcGVnNF9EQ3RhYl9jaHJvbVswXVswXSwgMiwgMSwgNTEyKTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZzcHJpdGVfdHJhamVjdG9yeSwgU1BSSVRFX1RSQUpfVkxDX0JJVFMsIDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX3Nwcml0ZV90cmFqZWN0b3J5X3RhYlswXVsxXSwgNCwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmZl9zcHJpdGVfdHJhamVjdG9yeV90YWJbMF1bMF0sIDQsIDIsIDEyOCk7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmbWJfdHlwZV9iX3ZsYywgTUJfVFlQRV9CX1ZMQ19CSVRTLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21iX3R5cGVfYl90YWJbMF1bMV0sIDIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAmZmZfbWJfdHlwZV9iX3RhYlswXVswXSwgMiwgMSwgMTYpOworICAgICAgICBkb25lID0gMTsKKyAgICB9Cit9CisKK2ludCBmZl9tcGVnNF9mcmFtZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBNcGVnNERlY0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTXBlZ0VuY0NvbnRleHQgICAgKnMgPSAmY3R4LT5tOworCisgICAgLyogZGl2eCA1LjAxKyBiaXRzdHJlYW0gcmVvcmRlciBzdHVmZiAqLworICAgIC8qIFNpbmNlIHRoaXMgY2xvYmJlcnMgdGhlIGlucHV0IGJ1ZmZlciBhbmQgaHdhY2NlbCBjb2RlY3Mgc3RpbGwgbmVlZCB0aGUKKyAgICAgKiBkYXRhIGR1cmluZyBod2FjY2VsLT5lbmRfZnJhbWUgd2Ugc2hvdWxkIG5vdCBkbyB0aGlzIGFueSBlYXJsaWVyICovCisgICAgaWYgKHMtPmRpdnhfcGFja2VkKSB7CisgICAgICAgIGludCBjdXJyZW50X3BvcyAgICAgPSBzLT5nYi5idWZmZXIgPT0gcy0+Yml0c3RyZWFtX2J1ZmZlciA/IDAgOiAoZ2V0X2JpdHNfY291bnQoJnMtPmdiKSA+PiAzKTsKKyAgICAgICAgaW50IHN0YXJ0Y29kZV9mb3VuZCA9IDA7CisKKyAgICAgICAgaWYgKGJ1Zl9zaXplIC0gY3VycmVudF9wb3MgPiA3KSB7CisKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gY3VycmVudF9wb3M7IGkgPCBidWZfc2l6ZSAtIDQ7IGkrKykKKworICAgICAgICAgICAgICAgIGlmIChidWZbaV0gICAgID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgYnVmW2kgKyAxXSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIGJ1ZltpICsgMl0gPT0gMSAmJgorICAgICAgICAgICAgICAgICAgICBidWZbaSArIDNdID09IDB4QjYpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRjb2RlX2ZvdW5kID0gIShidWZbaSArIDRdICYgMHg0MCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGFydGNvZGVfZm91bmQpIHsKKyAgICAgICAgICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcy0+Yml0c3RyZWFtX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5hbGxvY2F0ZWRfYml0c3RyZWFtX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUgLSBjdXJyZW50X3Bvcyk7CisgICAgICAgICAgICBpZiAoIXMtPmJpdHN0cmVhbV9idWZmZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG1lbWNweShzLT5iaXRzdHJlYW1fYnVmZmVyLCBidWYgKyBjdXJyZW50X3BvcywKKyAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSAtIGN1cnJlbnRfcG9zKTsKKyAgICAgICAgICAgIHMtPmJpdHN0cmVhbV9idWZmZXJfc2l6ZSA9IGJ1Zl9zaXplIC0gY3VycmVudF9wb3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVnNF91cGRhdGVfdGhyZWFkX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpzcmMpCit7CisgICAgTXBlZzREZWNDb250ZXh0ICpzID0gZHN0LT5wcml2X2RhdGE7CisgICAgY29uc3QgTXBlZzREZWNDb250ZXh0ICpzMSA9IHNyYy0+cHJpdl9kYXRhOworICAgIGludCBpbml0ID0gcy0+bS5jb250ZXh0X2luaXRpYWxpemVkOworCisgICAgaW50IHJldCA9IGZmX21wZWdfdXBkYXRlX3RocmVhZF9jb250ZXh0KGRzdCwgc3JjKTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgbWVtY3B5KCgodWludDhfdCopcykgKyBzaXplb2YoTXBlZ0VuY0NvbnRleHQpLCAoKHVpbnQ4X3QqKXMxKSArIHNpemVvZihNcGVnRW5jQ29udGV4dCksIHNpemVvZihNcGVnNERlY0NvbnRleHQpIC0gc2l6ZW9mKE1wZWdFbmNDb250ZXh0KSk7CisKKyAgICBpZiAoQ09ORklHX01QRUc0X0RFQ09ERVIgJiYgIWluaXQgJiYgczEtPnh2aWRfYnVpbGQgPj0gMCkKKyAgICAgICAgZmZfeHZpZF9pZGN0X2luaXQoJnMtPm0uaWRzcCwgZHN0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1wZWc0RGVjQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZjdHgtPm07CisgICAgaW50IHJldDsKKworICAgIGN0eC0+ZGl2eF92ZXJzaW9uID0KKyAgICBjdHgtPmRpdnhfYnVpbGQgICA9CisgICAgY3R4LT54dmlkX2J1aWxkICAgPQorICAgIGN0eC0+bGF2Y19idWlsZCAgID0gLTE7CisKKyAgICBpZiAoKHJldCA9IGZmX2gyNjNfZGVjb2RlX2luaXQoYXZjdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZl9tcGVnNHZpZGVvZGVjX3N0YXRpY19pbml0KCk7CisKKyAgICBzLT5oMjYzX3ByZWQgPSAxOworICAgIHMtPmxvd19kZWxheSA9IDA7IC8qIGRlZmF1bHQsIG1pZ2h0IGJlIG92ZXJyaWRkZW4gaW4gdGhlIHZvbCBoZWFkZXIgZHVyaW5nIGhlYWRlciBwYXJzaW5nICovCisgICAgcy0+ZGVjb2RlX21iID0gbXBlZzRfZGVjb2RlX21iOworICAgIGN0eC0+dGltZV9pbmNyZW1lbnRfYml0cyA9IDQ7IC8qIGRlZmF1bHQgdmFsdWUgZm9yIGJyb2tlbiBoZWFkZXJzICovCisKKyAgICBhdmN0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbiA9IEFWQ0hST01BX0xPQ19MRUZUOworICAgIGF2Y3R4LT5pbnRlcm5hbC0+YWxsb2NhdGVfcHJvZ3Jlc3MgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVlByb2ZpbGUgbXBlZzRfdmlkZW9fcHJvZmlsZXNbXSA9IHsKKyAgICB7IEZGX1BST0ZJTEVfTVBFRzRfU0lNUExFLCAgICAgICAgICAgICAgICAgICAgIlNpbXBsZSBQcm9maWxlIiB9LAorICAgIHsgRkZfUFJPRklMRV9NUEVHNF9TSU1QTEVfU0NBTEFCTEUsICAgICAgICAgICAiU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGUiIH0sCisgICAgeyBGRl9QUk9GSUxFX01QRUc0X0NPUkUsICAgICAgICAgICAgICAgICAgICAgICJDb3JlIFByb2ZpbGUiIH0sCisgICAgeyBGRl9QUk9GSUxFX01QRUc0X01BSU4sICAgICAgICAgICAgICAgICAgICAgICJNYWluIFByb2ZpbGUiIH0sCisgICAgeyBGRl9QUk9GSUxFX01QRUc0X05fQklULCAgICAgICAgICAgICAgICAgICAgICJOLWJpdCBQcm9maWxlIiB9LAorICAgIHsgRkZfUFJPRklMRV9NUEVHNF9TQ0FMQUJMRV9URVhUVVJFLCAgICAgICAgICAiU2NhbGFibGUgVGV4dHVyZSBQcm9maWxlIiB9LAorICAgIHsgRkZfUFJPRklMRV9NUEVHNF9TSU1QTEVfRkFDRV9BTklNQVRJT04sICAgICAiU2ltcGxlIEZhY2UgQW5pbWF0aW9uIFByb2ZpbGUiIH0sCisgICAgeyBGRl9QUk9GSUxFX01QRUc0X0JBU0lDX0FOSU1BVEVEX1RFWFRVUkUsICAgICJCYXNpYyBBbmltYXRlZCBUZXh0dXJlIFByb2ZpbGUiIH0sCisgICAgeyBGRl9QUk9GSUxFX01QRUc0X0hZQlJJRCwgICAgICAgICAgICAgICAgICAgICJIeWJyaWQgUHJvZmlsZSIgfSwKKyAgICB7IEZGX1BST0ZJTEVfTVBFRzRfQURWQU5DRURfUkVBTF9USU1FLCAgICAgICAgIkFkdmFuY2VkIFJlYWwgVGltZSBTaW1wbGUgUHJvZmlsZSIgfSwKKyAgICB7IEZGX1BST0ZJTEVfTVBFRzRfQ09SRV9TQ0FMQUJMRSwgICAgICAgICAgICAgIkNvZGUgU2NhbGFibGUgUHJvZmlsZSIgfSwKKyAgICB7IEZGX1BST0ZJTEVfTVBFRzRfQURWQU5DRURfQ09ESU5HLCAgICAgICAgICAgIkFkdmFuY2VkIENvZGluZyBQcm9maWxlIiB9LAorICAgIHsgRkZfUFJPRklMRV9NUEVHNF9BRFZBTkNFRF9DT1JFLCAgICAgICAgICAgICAiQWR2YW5jZWQgQ29yZSBQcm9maWxlIiB9LAorICAgIHsgRkZfUFJPRklMRV9NUEVHNF9BRFZBTkNFRF9TQ0FMQUJMRV9URVhUVVJFLCAiQWR2YW5jZWQgU2NhbGFibGUgVGV4dHVyZSBQcm9maWxlIiB9LAorICAgIHsgRkZfUFJPRklMRV9NUEVHNF9TSU1QTEVfU1RVRElPLCAgICAgICAgICAgICAiU2ltcGxlIFN0dWRpbyBQcm9maWxlIiB9LAorICAgIHsgRkZfUFJPRklMRV9NUEVHNF9BRFZBTkNFRF9TSU1QTEUsICAgICAgICAgICAiQWR2YW5jZWQgU2ltcGxlIFByb2ZpbGUiIH0sCisgICAgeyBGRl9QUk9GSUxFX1VOS05PV04gfSwKK307CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBtcGVnNF9vcHRpb25zW10gPSB7CisgICAgeyJxdWFydGVyX3NhbXBsZSIsICIxLzQgc3VicGVsIE1DIiwgb2Zmc2V0b2YoTXBlZ0VuY0NvbnRleHQsIHF1YXJ0ZXJfc2FtcGxlKSwgRkZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxLCAwfSwKKyAgICB7ImRpdnhfcGFja2VkIiwgImRpdnggc3R5bGUgcGFja2VkIGIgZnJhbWVzIiwgb2Zmc2V0b2YoTXBlZ0VuY0NvbnRleHQsIGRpdnhfcGFja2VkKSwgRkZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxLCAwfSwKKyAgICB7TlVMTH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG1wZWc0X2NsYXNzID0geworICAgICJNUEVHNCBWaWRlbyBEZWNvZGVyIiwKKyAgICBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICBtcGVnNF9vcHRpb25zLAorICAgIExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbXBlZzRfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgID0gIm1wZWc0IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctNCBwYXJ0IDIiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKE1wZWc0RGVjQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICAgICAgICAgPSBDT0RFQ19DQVBfRFJBV19IT1JJWl9CQU5EIHwgQ09ERUNfQ0FQX0RSMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVDX0NBUF9UUlVOQ0FURUQgfCBDT0RFQ19DQVBfREVMQVkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKKyAgICAuZmx1c2ggICAgICAgICAgICAgICAgID0gZmZfbXBlZ19mbHVzaCwKKyAgICAubWF4X2xvd3JlcyAgICAgICAgICAgID0gMywKKyAgICAucGl4X2ZtdHMgICAgICAgICAgICAgID0gZmZfaDI2M19od2FjY2VsX3BpeGZtdF9saXN0XzQyMCwKKyAgICAucHJvZmlsZXMgICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwobXBlZzRfdmlkZW9fcHJvZmlsZXMpLAorICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChtcGVnNF91cGRhdGVfdGhyZWFkX2NvbnRleHQpLAorICAgIC5wcml2X2NsYXNzID0gJm1wZWc0X2NsYXNzLAorfTsKKworCisjaWYgQ09ORklHX01QRUc0X1ZEUEFVX0RFQ09ERVIKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG1wZWc0X3ZkcGF1X2NsYXNzID0geworICAgICJNUEVHNCBWaWRlbyBWRFBBVSBEZWNvZGVyIiwKKyAgICBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICBtcGVnNF9vcHRpb25zLAorICAgIExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbXBlZzRfdmRwYXVfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzRfdmRwYXUiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTQgcGFydCAyIChWRFBBVSkiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1wZWc0RGVjQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfVFJVTkNBVEVEIHwgQ09ERUNfQ0FQX0RFTEFZIHwKKyAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9WRFBBVV9NUEVHNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJm1wZWc0X3ZkcGF1X2NsYXNzLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZzR2aWRlb2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZzR2aWRlb2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTE0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnNHZpZGVvZW5jLmMKQEAgLTAsMCArMSwxNDIyIEBACisvKgorICogTVBFRzQgZW5jb2Rlci4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJoMjYzLmgiCisjaW5jbHVkZSAibXBlZzR2aWRlby5oIgorCisvKiBUaGUgdW5pX0RDdGFiXyogdGFibGVzIGJlbG93IGNvbnRhaW4gdW5pZmllZCBiaXRzK2xlbmd0aCB0YWJsZXMgdG8gZW5jb2RlIERDCisgKiBkaWZmZXJlbmNlcyBpbiBtcGVnNC4gVW5pZmllZCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMKKyAqIHRoaXMgZW5jb2RpbmcgaW4gc2V2ZXJhbCBzdGVwcy4gKi8KK3N0YXRpYyB1aW50OF90ICB1bmlfREN0YWJfbHVtX2xlbls1MTJdOworc3RhdGljIHVpbnQ4X3QgIHVuaV9EQ3RhYl9jaHJvbV9sZW5bNTEyXTsKK3N0YXRpYyB1aW50MTZfdCB1bmlfREN0YWJfbHVtX2JpdHNbNTEyXTsKK3N0YXRpYyB1aW50MTZfdCB1bmlfREN0YWJfY2hyb21fYml0c1s1MTJdOworCisvKiBVbmlmaWVkIGVuY29kaW5nIHRhYmxlcyBmb3IgcnVuIGxlbmd0aCBlbmNvZGluZyBvZiBjb2VmZmljaWVudHMuCisgKiBVbmlmaWVkIGluIHRoZSBzZW5zZSB0aGF0IHRoZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgaW4gc2V2ZXJhbCBzdGVwcy4gKi8KK3N0YXRpYyB1aW50MzJfdCB1bmlfbXBlZzRfaW50cmFfcmxfYml0c1s2NCAqIDY0ICogMiAqIDJdOworc3RhdGljIHVpbnQ4X3QgIHVuaV9tcGVnNF9pbnRyYV9ybF9sZW5bNjQgKiA2NCAqIDIgKiAyXTsKK3N0YXRpYyB1aW50MzJfdCB1bmlfbXBlZzRfaW50ZXJfcmxfYml0c1s2NCAqIDY0ICogMiAqIDJdOworc3RhdGljIHVpbnQ4X3QgIHVuaV9tcGVnNF9pbnRlcl9ybF9sZW5bNjQgKiA2NCAqIDIgKiAyXTsKKworLy8jZGVmaW5lIFVOSV9NUEVHNF9FTkNfSU5ERVgobGFzdCwgcnVuLCBsZXZlbCkgKChsYXN0KSAqIDEyOCArIChydW4pICogMjU2ICsgKGxldmVsKSkKKy8vI2RlZmluZSBVTklfTVBFRzRfRU5DX0lOREVYKGxhc3QsIHJ1biwgbGV2ZWwpICgobGFzdCkgKiAxMjggKiA2NCArIChydW4pICsgKGxldmVsKSAqIDY0KQorI2RlZmluZSBVTklfTVBFRzRfRU5DX0lOREVYKGxhc3QsIHJ1biwgbGV2ZWwpICgobGFzdCkgKiAxMjggKiA2NCArIChydW4pICogMTI4ICsgKGxldmVsKSkKKworLyogbXBlZzQKKyAqIGludGVyCisgKiBtYXggbGV2ZWw6IDI0LzYKKyAqIG1heCBydW46IDUzLzYzCisgKgorICogaW50cmEKKyAqIG1heCBsZXZlbDogNTMvMTYKKyAqIG1heCBydW46IDI5LzQxCisgKi8KKworLyoqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgZW5jb2RpbmcgdGhlIDh4OCBibG9jayBpbiBibG9jayB3b3VsZCBuZWVkLgorICogQHBhcmFtW2luXSAgYmxvY2tfbGFzdF9pbmRleCBsYXN0IGluZGV4IGluIHNjYW50YWJsZSBvcmRlciB0aGF0IHJlZmVycyB0byBhIG5vbiB6ZXJvIGVsZW1lbnQgaW4gYmxvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9ibG9ja19yYXRlKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19sYXN0X2luZGV4LCB1aW50OF90IHNjYW50YWJsZVs2NF0pCit7CisgICAgaW50IGxhc3QgPSAwOworICAgIGludCBqOworICAgIGludCByYXRlID0gMDsKKworICAgIGZvciAoaiA9IDE7IGogPD0gYmxvY2tfbGFzdF9pbmRleDsgaisrKSB7CisgICAgICAgIGNvbnN0IGludCBpbmRleCA9IHNjYW50YWJsZVtqXTsKKyAgICAgICAgaW50IGxldmVsID0gYmxvY2tbaW5kZXhdOworICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgIGxldmVsICs9IDY0OworICAgICAgICAgICAgaWYgKChsZXZlbCAmICh+MTI3KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChqIDwgYmxvY2tfbGFzdF9pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgcmF0ZSArPSBzLT5pbnRyYV9hY192bGNfbGVuZ3RoW1VOSV9BQ19FTkNfSU5ERVgoaiAtIGxhc3QgLSAxLCBsZXZlbCldOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmF0ZSArPSBzLT5pbnRyYV9hY192bGNfbGFzdF9sZW5ndGhbVU5JX0FDX0VOQ19JTkRFWChqIC0gbGFzdCAtIDEsIGxldmVsKV07CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByYXRlICs9IHMtPmFjX2VzY19sZW5ndGg7CisKKyAgICAgICAgICAgIGxhc3QgPSBqOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJhdGU7Cit9CisKKy8qKgorICogUmVzdG9yZSB0aGUgYWMgY29lZmZpY2llbnRzIGluIGJsb2NrIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgZGVjaWRlX2FjX3ByZWQoKS4KKyAqIFRoaXMgZnVuY3Rpb24gYWxzbyByZXN0b3JlcyBzLT5ibG9ja19sYXN0X2luZGV4LgorICogQHBhcmFtW2luLG91dF0gYmxvY2sgTUIgY29lZmZpY2llbnRzLCB0aGVzZSB3aWxsIGJlIHJlc3RvcmVkCisgKiBAcGFyYW1baW5dIGRpciBhYyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBmb3IgZWFjaCA4eDggYmxvY2sKKyAqIEBwYXJhbVtvdXRdIHN0IHNjYW50YWJsZSBmb3IgZWFjaCA4eDggYmxvY2sKKyAqIEBwYXJhbVtpbl0gemlnemFnX2xhc3RfaW5kZXggaW5kZXggcmVmZXJyaW5nIHRvIHRoZSBsYXN0IG5vbiB6ZXJvIGNvZWZmaWNpZW50IGluIHppZ3phZyBvcmRlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9hY19jb2VmZnMoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgYmxvY2tbNl1bNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkaXJbNl0sIHVpbnQ4X3QgKnN0WzZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB6aWd6YWdfbGFzdF9pbmRleFs2XSkKK3sKKyAgICBpbnQgaSwgbjsKKyAgICBtZW1jcHkocy0+YmxvY2tfbGFzdF9pbmRleCwgemlnemFnX2xhc3RfaW5kZXgsIHNpemVvZihpbnQpICogNik7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgNjsgbisrKSB7CisgICAgICAgIGludDE2X3QgKmFjX3ZhbCA9IHMtPmFjX3ZhbFswXVswXSArIHMtPmJsb2NrX2luZGV4W25dICogMTY7CisKKyAgICAgICAgc3Rbbl0gPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZDsKKyAgICAgICAgaWYgKGRpcltuXSkgeworICAgICAgICAgICAgLyogdG9wIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspCisgICAgICAgICAgICAgICAgYmxvY2tbbl1bcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ldXSA9IGFjX3ZhbFtpICsgOF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBsZWZ0IHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspCisgICAgICAgICAgICAgICAgYmxvY2tbbl1bcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2kgPDwgM11dID0gYWNfdmFsW2ldOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIFJldHVybiB0aGUgb3B0aW1hbCB2YWx1ZSAoMCBvciAxKSBmb3IgdGhlIGFjX3ByZWQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIE1CIGluIG1wZWc0LgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gdXBkYXRlIHMtPmJsb2NrX2xhc3RfaW5kZXggYW5kIHMtPmFjX3ZhbC4KKyAqIEBwYXJhbVtpbixvdXRdIGJsb2NrIE1CIGNvZWZmaWNpZW50cywgdGhlc2Ugd2lsbCBiZSB1cGRhdGVkIGlmIDEgaXMgcmV0dXJuZWQKKyAqIEBwYXJhbVtpbl0gZGlyIGFjIHByZWRpY3Rpb24gZGlyZWN0aW9uIGZvciBlYWNoIDh4OCBibG9jaworICogQHBhcmFtW291dF0gc3Qgc2NhbnRhYmxlIGZvciBlYWNoIDh4OCBibG9jaworICogQHBhcmFtW291dF0gemlnemFnX2xhc3RfaW5kZXggaW5kZXggcmVmZXJyaW5nIHRvIHRoZSBsYXN0IG5vbiB6ZXJvIGNvZWZmaWNpZW50IGluIHppZ3phZyBvcmRlcgorICovCitzdGF0aWMgaW5saW5lIGludCBkZWNpZGVfYWNfcHJlZChNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1s2XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGlyWzZdLCB1aW50OF90ICpzdFs2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB6aWd6YWdfbGFzdF9pbmRleFs2XSkKK3sKKyAgICBpbnQgc2NvcmUgPSAwOworICAgIGludCBpLCBuOworICAgIGludDhfdCAqY29uc3QgcXNjYWxlX3RhYmxlID0gcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZTsKKworICAgIG1lbWNweSh6aWd6YWdfbGFzdF9pbmRleCwgcy0+YmxvY2tfbGFzdF9pbmRleCwgc2l6ZW9mKGludCkgKiA2KTsKKworICAgIGZvciAobiA9IDA7IG4gPCA2OyBuKyspIHsKKyAgICAgICAgaW50MTZfdCAqYWNfdmFsLCAqYWNfdmFsMTsKKworICAgICAgICBzY29yZSAtPSBnZXRfYmxvY2tfcmF0ZShzLCBibG9ja1tuXSwgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQpOworCisgICAgICAgIGFjX3ZhbCAgPSBzLT5hY192YWxbMF1bMF0gKyBzLT5ibG9ja19pbmRleFtuXSAqIDE2OworICAgICAgICBhY192YWwxID0gYWNfdmFsOworICAgICAgICBpZiAoZGlyW25dKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgeHkgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZSAtIHMtPm1iX3N0cmlkZTsKKyAgICAgICAgICAgIC8qIHRvcCBwcmVkaWN0aW9uICovCisgICAgICAgICAgICBhY192YWwgLT0gcy0+YmxvY2tfd3JhcFtuXSAqIDE2OworICAgICAgICAgICAgaWYgKHMtPm1iX3kgPT0gMCB8fCBzLT5xc2NhbGUgPT0gcXNjYWxlX3RhYmxlW3h5XSB8fCBuID09IDIgfHwgbiA9PSAzKSB7CisgICAgICAgICAgICAgICAgLyogc2FtZSBxc2NhbGUgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsZXZlbCA9IGJsb2NrW25dW3MtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltpXV07CisgICAgICAgICAgICAgICAgICAgIGJsb2NrW25dW3MtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltpXV0gPSBsZXZlbCAtIGFjX3ZhbFtpICsgOF07CisgICAgICAgICAgICAgICAgICAgIGFjX3ZhbDFbaV0gICAgID0gYmxvY2tbbl1bcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2kgPDwgM11dOworICAgICAgICAgICAgICAgICAgICBhY192YWwxW2kgKyA4XSA9IGxldmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZGlmZmVyZW50IHFzY2FsZSwgd2UgbXVzdCByZXNjYWxlICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGV2ZWwgPSBibG9ja1tuXVtzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV1dOworICAgICAgICAgICAgICAgICAgICBibG9ja1tuXVtzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV1dID0gbGV2ZWwgLSBST1VOREVEX0RJVihhY192YWxbaSArIDhdICogcXNjYWxlX3RhYmxlW3h5XSwgcy0+cXNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgYWNfdmFsMVtpXSAgICAgPSBibG9ja1tuXVtzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baSA8PCAzXV07CisgICAgICAgICAgICAgICAgICAgIGFjX3ZhbDFbaSArIDhdID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3Rbbl0gPSBzLT5pbnRyYV9oX3NjYW50YWJsZS5wZXJtdXRhdGVkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgaW50IHh5ID0gcy0+bWJfeCAtIDEgKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOworICAgICAgICAgICAgLyogbGVmdCBwcmVkaWN0aW9uICovCisgICAgICAgICAgICBhY192YWwgLT0gMTY7CisgICAgICAgICAgICBpZiAocy0+bWJfeCA9PSAwIHx8IHMtPnFzY2FsZSA9PSBxc2NhbGVfdGFibGVbeHldIHx8IG4gPT0gMSB8fCBuID09IDMpIHsKKyAgICAgICAgICAgICAgICAvKiBzYW1lIHFzY2FsZSAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxldmVsID0gYmxvY2tbbl1bcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2kgPDwgM11dOworICAgICAgICAgICAgICAgICAgICBibG9ja1tuXVtzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baSA8PCAzXV0gPSBsZXZlbCAtIGFjX3ZhbFtpXTsKKyAgICAgICAgICAgICAgICAgICAgYWNfdmFsMVtpXSAgICAgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgYWNfdmFsMVtpICsgOF0gPSBibG9ja1tuXVtzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV1dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZGlmZmVyZW50IHFzY2FsZSwgd2UgbXVzdCByZXNjYWxlICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGV2ZWwgPSBibG9ja1tuXVtzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baSA8PCAzXV07CisgICAgICAgICAgICAgICAgICAgIGJsb2NrW25dW3MtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltpIDw8IDNdXSA9IGxldmVsIC0gUk9VTkRFRF9ESVYoYWNfdmFsW2ldICogcXNjYWxlX3RhYmxlW3h5XSwgcy0+cXNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgYWNfdmFsMVtpXSAgICAgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgYWNfdmFsMVtpICsgOF0gPSBibG9ja1tuXVtzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV1dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0W25dID0gcy0+aW50cmFfdl9zY2FudGFibGUucGVybXV0YXRlZDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDYzOyBpID4gMDsgaS0tKSAgLy8gRklYTUUgb3B0aW1pemUKKyAgICAgICAgICAgIGlmIChibG9ja1tuXVtzdFtuXVtpXV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gPSBpOworCisgICAgICAgIHNjb3JlICs9IGdldF9ibG9ja19yYXRlKHMsIGJsb2NrW25dLCBzLT5ibG9ja19sYXN0X2luZGV4W25dLCBzdFtuXSk7CisgICAgfQorCisgICAgaWYgKHNjb3JlIDwgMCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN0b3JlX2FjX2NvZWZmcyhzLCBibG9jaywgZGlyLCBzdCwgemlnemFnX2xhc3RfaW5kZXgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qKgorICogbW9kaWZ5IG1iX3R5cGUgJiBxc2NhbGUgc28gdGhhdCBlbmNvZGluZyBpcyBhY3R1YWxseSBwb3NzaWJsZSBpbiBtcGVnNAorICovCit2b2lkIGZmX2NsZWFuX21wZWc0X3FzY2FsZXMoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisgICAgaW50OF90ICpjb25zdCBxc2NhbGVfdGFibGUgPSBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlOworCisgICAgZmZfY2xlYW5faDI2M19xc2NhbGVzKHMpOworCisgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICBpbnQgb2RkID0gMDsKKyAgICAgICAgLyogb2ssIGNvbWUgb24sIHRoaXMgaXNuJ3QgZnVubnkgYW55bW9yZSwgdGhlcmUncyBtb3JlIGNvZGUgZm9yCisgICAgICAgICAqIGhhbmRsaW5nIHRoaXMgbXBlZzQgbWVzcyB0aGFuIGZvciB0aGUgYWN0dWFsIGFkYXB0aXZlIHF1YW50aXphdGlvbiAqLworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgeworICAgICAgICAgICAgaW50IG1iX3h5ID0gcy0+bWJfaW5kZXgyeHlbaV07CisgICAgICAgICAgICBvZGQgKz0gcXNjYWxlX3RhYmxlW21iX3h5XSAmIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoMiAqIG9kZCA+IHMtPm1iX251bSkKKyAgICAgICAgICAgIG9kZCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9kZCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm1iX251bTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbWJfeHkgPSBzLT5tYl9pbmRleDJ4eVtpXTsKKyAgICAgICAgICAgIGlmICgocXNjYWxlX3RhYmxlW21iX3h5XSAmIDEpICE9IG9kZCkKKyAgICAgICAgICAgICAgICBxc2NhbGVfdGFibGVbbWJfeHldKys7CisgICAgICAgICAgICBpZiAocXNjYWxlX3RhYmxlW21iX3h5XSA+IDMxKQorICAgICAgICAgICAgICAgIHFzY2FsZV90YWJsZVttYl94eV0gPSAzMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzLT5tYl9udW07IGkrKykgeworICAgICAgICAgICAgaW50IG1iX3h5ID0gcy0+bWJfaW5kZXgyeHlbaV07CisgICAgICAgICAgICBpZiAocXNjYWxlX3RhYmxlW21iX3h5XSAhPSBxc2NhbGVfdGFibGVbcy0+bWJfaW5kZXgyeHlbaSAtIDFdXSAmJgorICAgICAgICAgICAgICAgIChzLT5tYl90eXBlW21iX3h5XSAmIENBTkRJREFURV9NQl9UWVBFX0RJUkVDVCkpIHsKKyAgICAgICAgICAgICAgICBzLT5tYl90eXBlW21iX3h5XSB8PSBDQU5ESURBVEVfTUJfVFlQRV9CSURJUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBFbmNvZGUgdGhlIGRjIHZhbHVlLgorICogQHBhcmFtIG4gYmxvY2sgaW5kZXggKDAtMyBhcmUgbHVtYSwgNC01IGFyZSBjaHJvbWEpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGVnNF9lbmNvZGVfZGMoUHV0Qml0Q29udGV4dCAqcywgaW50IGxldmVsLCBpbnQgbikKK3sKKyNpZiAxCisgICAgLyogREMgd2lsbCBvdmVyZmxvdyBpZiBsZXZlbCBpcyBvdXRzaWRlIHRoZSBbLTI1NSwyNTVdIHJhbmdlLiAqLworICAgIGxldmVsICs9IDI1NjsKKyAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgLyogbHVtaW5hbmNlICovCisgICAgICAgIHB1dF9iaXRzKHMsIHVuaV9EQ3RhYl9sdW1fbGVuW2xldmVsXSwgdW5pX0RDdGFiX2x1bV9iaXRzW2xldmVsXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogY2hyb21pbmFuY2UgKi8KKyAgICAgICAgcHV0X2JpdHMocywgdW5pX0RDdGFiX2Nocm9tX2xlbltsZXZlbF0sIHVuaV9EQ3RhYl9jaHJvbV9iaXRzW2xldmVsXSk7CisgICAgfQorI2Vsc2UKKyAgICBpbnQgc2l6ZSwgdjsKKyAgICAvKiBmaW5kIG51bWJlciBvZiBiaXRzICovCisgICAgc2l6ZSA9IDA7CisgICAgdiAgICA9IGFicyhsZXZlbCk7CisgICAgd2hpbGUgKHYpIHsKKyAgICAgICAgdiA+Pj0gMTsKKyAgICAgICAgc2l6ZSsrOworICAgIH0KKworICAgIGlmIChuIDwgNCkgeworICAgICAgICAvKiBsdW1pbmFuY2UgKi8KKyAgICAgICAgcHV0X2JpdHMocywgZmZfbXBlZzRfREN0YWJfbHVtW3NpemVdWzFdLCBmZl9tcGVnNF9EQ3RhYl9sdW1bc2l6ZV1bMF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGNocm9taW5hbmNlICovCisgICAgICAgIHB1dF9iaXRzKHMsIGZmX21wZWc0X0RDdGFiX2Nocm9tW3NpemVdWzFdLCBmZl9tcGVnNF9EQ3RhYl9jaHJvbVtzaXplXVswXSk7CisgICAgfQorCisgICAgLyogZW5jb2RlIHJlbWFpbmluZyBiaXRzICovCisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIGlmIChsZXZlbCA8IDApCisgICAgICAgICAgICBsZXZlbCA9ICgtbGV2ZWwpIF4gKCgxIDw8IHNpemUpIC0gMSk7CisgICAgICAgIHB1dF9iaXRzKHMsIHNpemUsIGxldmVsKTsKKyAgICAgICAgaWYgKHNpemUgPiA4KQorICAgICAgICAgICAgcHV0X2JpdHMocywgMSwgMSk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1wZWc0X2dldF9kY19sZW5ndGgoaW50IGxldmVsLCBpbnQgbikKK3sKKyAgICBpZiAobiA8IDQpCisgICAgICAgIHJldHVybiB1bmlfREN0YWJfbHVtX2xlbltsZXZlbCArIDI1Nl07CisgICAgZWxzZQorICAgICAgICByZXR1cm4gdW5pX0RDdGFiX2Nocm9tX2xlbltsZXZlbCArIDI1Nl07Cit9CisKKy8qKgorICogRW5jb2RlIGFuIDh4OCBibG9jay4KKyAqIEBwYXJhbSBuIGJsb2NrIGluZGV4ICgwLTMgYXJlIGx1bWEsIDQtNSBhcmUgY2hyb21hKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXBlZzRfZW5jb2RlX2Jsb2NrKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IG4sIGludCBpbnRyYV9kYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc2Nhbl90YWJsZSwgUHV0Qml0Q29udGV4dCAqZGNfcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKmFjX3BiKQoreworICAgIGludCBpLCBsYXN0X25vbl96ZXJvOworICAgIHVpbnQzMl90ICpiaXRzX3RhYjsKKyAgICB1aW50OF90ICpsZW5fdGFiOworICAgIGNvbnN0IGludCBsYXN0X2luZGV4ID0gcy0+YmxvY2tfbGFzdF9pbmRleFtuXTsKKworICAgIGlmIChzLT5tYl9pbnRyYSkgeyAgLy8gTm90ZSBnY2MgKDMuMi4xIGF0IGxlYXN0KSB3aWxsIG9wdGltaXplIHRoaXMgYXdheQorICAgICAgICAvKiBtcGVnNCBiYXNlZCBEQyBwcmVkaWN0b3IgKi8KKyAgICAgICAgbXBlZzRfZW5jb2RlX2RjKGRjX3BiLCBpbnRyYV9kYywgbik7CisgICAgICAgIGlmIChsYXN0X2luZGV4IDwgMSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaSA9IDE7CisgICAgICAgIGJpdHNfdGFiID0gdW5pX21wZWc0X2ludHJhX3JsX2JpdHM7CisgICAgICAgIGxlbl90YWIgID0gdW5pX21wZWc0X2ludHJhX3JsX2xlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobGFzdF9pbmRleCA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGkgPSAwOworICAgICAgICBiaXRzX3RhYiA9IHVuaV9tcGVnNF9pbnRlcl9ybF9iaXRzOworICAgICAgICBsZW5fdGFiICA9IHVuaV9tcGVnNF9pbnRlcl9ybF9sZW47CisgICAgfQorCisgICAgLyogQUMgY29lZnMgKi8KKyAgICBsYXN0X25vbl96ZXJvID0gaSAtIDE7CisgICAgZm9yICg7IGkgPCBsYXN0X2luZGV4OyBpKyspIHsKKyAgICAgICAgaW50IGxldmVsID0gYmxvY2tbc2Nhbl90YWJsZVtpXV07CisgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgaW50IHJ1biA9IGkgLSBsYXN0X25vbl96ZXJvIC0gMTsKKyAgICAgICAgICAgIGxldmVsICs9IDY0OworICAgICAgICAgICAgaWYgKChsZXZlbCAmICh+MTI3KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IFVOSV9NUEVHNF9FTkNfSU5ERVgoMCwgcnVuLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoYWNfcGIsIGxlbl90YWJbaW5kZXhdLCBiaXRzX3RhYltpbmRleF0pOworICAgICAgICAgICAgfSBlbHNlIHsgIC8vIEVTQzMKKyAgICAgICAgICAgICAgICBwdXRfYml0cyhhY19wYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICA3ICsgMiArIDEgKyA2ICsgMSArIDEyICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAyMykgKyAoMyA8PCAyMSkgKyAoMCA8PCAyMCkgKyAocnVuIDw8IDE0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTMpICsgKCgobGV2ZWwgLSA2NCkgJiAweGZmZikgPDwgMSkgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3Rfbm9uX3plcm8gPSBpOworICAgICAgICB9CisgICAgfQorICAgIC8qIGlmIChpIDw9IGxhc3RfaW5kZXgpICovIHsKKyAgICAgICAgaW50IGxldmVsID0gYmxvY2tbc2Nhbl90YWJsZVtpXV07CisgICAgICAgIGludCBydW4gICA9IGkgLSBsYXN0X25vbl96ZXJvIC0gMTsKKyAgICAgICAgbGV2ZWwgKz0gNjQ7CisgICAgICAgIGlmICgobGV2ZWwgJiAofjEyNykpID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IFVOSV9NUEVHNF9FTkNfSU5ERVgoMSwgcnVuLCBsZXZlbCk7CisgICAgICAgICAgICBwdXRfYml0cyhhY19wYiwgbGVuX3RhYltpbmRleF0sIGJpdHNfdGFiW2luZGV4XSk7CisgICAgICAgIH0gZWxzZSB7ICAvLyBFU0MzCisgICAgICAgICAgICBwdXRfYml0cyhhY19wYiwKKyAgICAgICAgICAgICAgICAgICAgIDcgKyAyICsgMSArIDYgKyAxICsgMTIgKyAxLAorICAgICAgICAgICAgICAgICAgICAgKDMgPDwgMjMpICsgKDMgPDwgMjEpICsgKDEgPDwgMjApICsgKHJ1biA8PCAxNCkgKworICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTMpICsgKCgobGV2ZWwgLSA2NCkgJiAweGZmZikgPDwgMSkgKyAxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBtcGVnNF9nZXRfYmxvY2tfbGVuZ3RoKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50cmFfZGMsIHVpbnQ4X3QgKnNjYW5fdGFibGUpCit7CisgICAgaW50IGksIGxhc3Rfbm9uX3plcm87CisgICAgdWludDhfdCAqbGVuX3RhYjsKKyAgICBjb25zdCBpbnQgbGFzdF9pbmRleCA9IHMtPmJsb2NrX2xhc3RfaW5kZXhbbl07CisgICAgaW50IGxlbiA9IDA7CisKKyAgICBpZiAocy0+bWJfaW50cmEpIHsgIC8vIE5vdGUgZ2NjICgzLjIuMSBhdCBsZWFzdCkgd2lsbCBvcHRpbWl6ZSB0aGlzIGF3YXkKKyAgICAgICAgLyogbXBlZzQgYmFzZWQgREMgcHJlZGljdG9yICovCisgICAgICAgIGxlbiArPSBtcGVnNF9nZXRfZGNfbGVuZ3RoKGludHJhX2RjLCBuKTsKKyAgICAgICAgaWYgKGxhc3RfaW5kZXggPCAxKQorICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgaSA9IDE7CisgICAgICAgIGxlbl90YWIgPSB1bmlfbXBlZzRfaW50cmFfcmxfbGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsYXN0X2luZGV4IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpID0gMDsKKyAgICAgICAgbGVuX3RhYiA9IHVuaV9tcGVnNF9pbnRlcl9ybF9sZW47CisgICAgfQorCisgICAgLyogQUMgY29lZnMgKi8KKyAgICBsYXN0X25vbl96ZXJvID0gaSAtIDE7CisgICAgZm9yICg7IGkgPCBsYXN0X2luZGV4OyBpKyspIHsKKyAgICAgICAgaW50IGxldmVsID0gYmxvY2tbc2Nhbl90YWJsZVtpXV07CisgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgaW50IHJ1biA9IGkgLSBsYXN0X25vbl96ZXJvIC0gMTsKKyAgICAgICAgICAgIGxldmVsICs9IDY0OworICAgICAgICAgICAgaWYgKChsZXZlbCAmICh+MTI3KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IFVOSV9NUEVHNF9FTkNfSU5ERVgoMCwgcnVuLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgbGVuICs9IGxlbl90YWJbaW5kZXhdOworICAgICAgICAgICAgfSBlbHNlIHsgIC8vIEVTQzMKKyAgICAgICAgICAgICAgICBsZW4gKz0gNyArIDIgKyAxICsgNiArIDEgKyAxMiArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0X25vbl96ZXJvID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBpZiAoaSA8PSBsYXN0X2luZGV4KSAqLyB7CisgICAgICAgIGludCBsZXZlbCA9IGJsb2NrW3NjYW5fdGFibGVbaV1dOworICAgICAgICBpbnQgcnVuICAgPSBpIC0gbGFzdF9ub25femVybyAtIDE7CisgICAgICAgIGxldmVsICs9IDY0OworICAgICAgICBpZiAoKGxldmVsICYgKH4xMjcpKSA9PSAwKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXggPSBVTklfTVBFRzRfRU5DX0lOREVYKDEsIHJ1biwgbGV2ZWwpOworICAgICAgICAgICAgbGVuICs9IGxlbl90YWJbaW5kZXhdOworICAgICAgICB9IGVsc2UgeyAgLy8gRVNDMworICAgICAgICAgICAgbGVuICs9IDcgKyAyICsgMSArIDYgKyAxICsgMTIgKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1wZWc0X2VuY29kZV9ibG9ja3MoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgYmxvY2tbNl1bNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludHJhX2RjWzZdLCB1aW50OF90ICoqc2Nhbl90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKmRjX3BiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqYWNfcGIpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoc2Nhbl90YWJsZSkgeworICAgICAgICBpZiAocy0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfTk9fT1VUUFVUKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgICAgIHNraXBfcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzRfZ2V0X2Jsb2NrX2xlbmd0aChzLCBibG9ja1tpXSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmFfZGNbaV0sIHNjYW5fdGFibGVbaV0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGVuY29kZSBlYWNoIGJsb2NrICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgICAgIG1wZWc0X2VuY29kZV9ibG9jayhzLCBibG9ja1tpXSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmFfZGNbaV0sIHNjYW5fdGFibGVbaV0sIGRjX3BiLCBhY19wYik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocy0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfTk9fT1VUUFVUKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgICAgIHNraXBfcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzRfZ2V0X2Jsb2NrX2xlbmd0aChzLCBibG9ja1tpXSwgaSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGVuY29kZSBlYWNoIGJsb2NrICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgICAgIG1wZWc0X2VuY29kZV9ibG9jayhzLCBibG9ja1tpXSwgaSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQsIGRjX3BiLCBhY19wYik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9iX2NicChNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1s2XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3ksIGludCBtYl90eXBlKQoreworICAgIGludCBjYnAgPSAwLCBpOworCisgICAgaWYgKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX0NCUF9SRCkgeworICAgICAgICBpbnQgc2NvcmUgICAgICAgID0gMDsKKyAgICAgICAgY29uc3QgaW50IGxhbWJkYSA9IHMtPmxhbWJkYTIgPj4gKEZGX0xBTUJEQV9TSElGVCAtIDYpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5jb2RlZF9zY29yZVtpXSA8IDApIHsKKyAgICAgICAgICAgICAgICBzY29yZSArPSBzLT5jb2RlZF9zY29yZVtpXTsKKyAgICAgICAgICAgICAgICBjYnAgICB8PSAxIDw8ICg1IC0gaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2JwKSB7CisgICAgICAgICAgICBpbnQgemVyb19zY29yZSA9IC02OworICAgICAgICAgICAgaWYgKChtb3Rpb25feCB8IG1vdGlvbl95IHwgcy0+ZHF1YW50IHwgbWJfdHlwZSkgPT0gMCkKKyAgICAgICAgICAgICAgICB6ZXJvX3Njb3JlIC09IDQ7ICAvLyAyICogTVYgKyBtYl90eXBlICsgY2JwIGJpdAorCisgICAgICAgICAgICB6ZXJvX3Njb3JlICo9IGxhbWJkYTsKKyAgICAgICAgICAgIGlmICh6ZXJvX3Njb3JlIDw9IHNjb3JlKQorICAgICAgICAgICAgICAgIGNicCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+YmxvY2tfbGFzdF9pbmRleFtpXSA+PSAwICYmICgoY2JwID4+ICg1IC0gaSkpICYgMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICBzLT5iZHNwLmNsZWFyX2Jsb2NrKHMtPmJsb2NrW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5ibG9ja19sYXN0X2luZGV4W2ldID49IDApCisgICAgICAgICAgICAgICAgY2JwIHw9IDEgPDwgKDUgLSBpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2JwOworfQorCisvLyBGSVhNRSB0aGlzIGlzIGR1cGxpY2F0ZWQgdG8gaDI2My5jCitzdGF0aWMgY29uc3QgaW50IGRxdWFudF9jb2RlWzVdID0geyAxLCAwLCA5LCAyLCAzIH07CisKK3ZvaWQgZmZfbXBlZzRfZW5jb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzZdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feCwgaW50IG1vdGlvbl95KQoreworICAgIGludCBjYnBjLCBjYnB5LCBwcmVkX3gsIHByZWRfeTsKKyAgICBQdXRCaXRDb250ZXh0ICpjb25zdCBwYjIgICAgPSBzLT5kYXRhX3BhcnRpdGlvbmluZyA/ICZzLT5wYjIgOiAmcy0+cGI7CisgICAgUHV0Qml0Q29udGV4dCAqY29uc3QgdGV4X3BiID0gcy0+ZGF0YV9wYXJ0aXRpb25pbmcgJiYgcy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CID8gJnMtPnRleF9wYiA6ICZzLT5wYjsKKyAgICBQdXRCaXRDb250ZXh0ICpjb25zdCBkY19wYiAgPSBzLT5kYXRhX3BhcnRpdGlvbmluZyAmJiBzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kgPyAmcy0+cGIyIDogJnMtPnBiOworICAgIGNvbnN0IGludCBpbnRlcmxlYXZlZF9zdGF0cyA9IChzLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzEpICYmICFzLT5kYXRhX3BhcnRpdGlvbmluZyA/IDEgOiAwOworCisgICAgaWYgKCFzLT5tYl9pbnRyYSkgeworICAgICAgICBpbnQgaSwgY2JwOworCisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgIC8qIGNvbnZlcnQgZnJvbSBtdl9kaXIgdG8gdHlwZSAqLworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYl90eXBlX3RhYmxlWzhdID0geyAtMSwgMywgMiwgMSwgLTEsIC0xLCAtMSwgMCB9OworICAgICAgICAgICAgaW50IG1iX3R5cGUgPSBtYl90eXBlX3RhYmxlW3MtPm12X2Rpcl07CisKKyAgICAgICAgICAgIGlmIChzLT5tYl94ID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212W2ldWzBdWzBdID0KKyAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdltpXVswXVsxXSA9CisgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bMV1bMF0gPQorICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212W2ldWzFdWzFdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfYXNzZXJ0MihzLT5kcXVhbnQgPj0gLTIgJiYgcy0+ZHF1YW50IDw9IDIpOworICAgICAgICAgICAgYXZfYXNzZXJ0Migocy0+ZHF1YW50ICYgMSkgPT0gMCk7CisgICAgICAgICAgICBhdl9hc3NlcnQyKG1iX3R5cGUgPj0gMCk7CisKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gaWYgdGhpcyBNQiB3YXMgc2tpcHBlZCBpbiB0aGUgbmV4dCBQIEZyYW1lICovCisgICAgICAgICAgICBpZiAocy0+bmV4dF9waWN0dXJlLm1ic2tpcF90YWJsZVtzLT5tYl95ICogcy0+bWJfc3RyaWRlICsgcy0+bWJfeF0pIHsgIC8vIEZJWE1FIGF2b2lkIERDVCAmIC4uLgorICAgICAgICAgICAgICAgIHMtPnNraXBfY291bnQrKzsKKyAgICAgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9CisgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPQorICAgICAgICAgICAgICAgIHMtPm12WzFdWzBdWzBdID0KKyAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgcy0+bXZfZGlyICA9IE1WX0RJUl9GT1JXQVJEOyAgLy8gZG9lc24ndCBtYXR0ZXIKKyAgICAgICAgICAgICAgICBzLT5xc2NhbGUgLT0gcy0+ZHF1YW50OworLy8gICAgICAgICAgICAgICAgcy0+bWJfc2tpcHBlZCA9IDE7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNicCA9IGdldF9iX2NicChzLCBibG9jaywgbW90aW9uX3gsIG1vdGlvbl95LCBtYl90eXBlKTsKKworICAgICAgICAgICAgaWYgKChjYnAgfCBtb3Rpb25feCB8IG1vdGlvbl95IHwgbWJfdHlwZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIGRpcmVjdCBNQiB3aXRoIE1WPXswLDB9ICovCisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihzLT5kcXVhbnQgPT0gMCk7CisKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOyAvKiBtYiBub3QgY29kZWQgbW9kYjE9MSAqLworCisgICAgICAgICAgICAgICAgaWYgKGludGVybGVhdmVkX3N0YXRzKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPm1pc2NfYml0cysrOworICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X2JpdHMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+c2tpcF9jb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAvKiBtYiBjb2RlZCBtb2RiMT0wICovCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIGNicCA/IDAgOiAxKTsgIC8qIG1vZGIyICovIC8vIEZJWE1FIG1lcmdlCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIG1iX3R5cGUgKyAxLCAxKTsgIC8vIHRoaXMgdGFibGUgaXMgc28gc2ltcGxlIHRoYXQgd2UgZG9uJ3QgbmVlZCBpdCA6KQorICAgICAgICAgICAgaWYgKGNicCkKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDYsIGNicCk7CisKKyAgICAgICAgICAgIGlmIChjYnAgJiYgbWJfdHlwZSkgeworICAgICAgICAgICAgICAgIGlmIChzLT5kcXVhbnQpCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgKHMtPmRxdWFudCA+PiAyKSArIDMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHMtPnFzY2FsZSAtPSBzLT5kcXVhbnQ7CisKKyAgICAgICAgICAgIGlmICghcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2JwKQorICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmludGVybGFjZWRfZGN0KTsKKyAgICAgICAgICAgICAgICBpZiAobWJfdHlwZSkgICAgICAgICAgICAgICAgICAvLyBub3QgZGlyZWN0IG1vZGUKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5tdl90eXBlID09IE1WX1RZUEVfRklFTEQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW50ZXJsZWF2ZWRfc3RhdHMpCisgICAgICAgICAgICAgICAgcy0+bWlzY19iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisKKyAgICAgICAgICAgIGlmICghbWJfdHlwZSkgeworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIocy0+bXZfZGlyICYgTVZfRElSRUNUKTsKKyAgICAgICAgICAgICAgICBmZl9oMjYzX2VuY29kZV9tb3Rpb25fdmVjdG9yKHMsIG1vdGlvbl94LCBtb3Rpb25feSwgMSk7CisgICAgICAgICAgICAgICAgcy0+Yl9jb3VudCsrOworICAgICAgICAgICAgICAgIHMtPmZfY291bnQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihtYl90eXBlID4gMCAmJiBtYl90eXBlIDwgNCk7CisgICAgICAgICAgICAgICAgaWYgKHMtPm12X3R5cGUgIT0gTVZfVFlQRV9GSUVMRCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bXZfZGlyICYgTVZfRElSX0ZPUldBUkQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfZW5jb2RlX21vdGlvbl92ZWN0b3IocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gLSBzLT5sYXN0X212WzBdWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSAtIHMtPmxhc3RfbXZbMF1bMF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzBdWzBdWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMV1bMF0gPSBzLT5tdlswXVswXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMF1bMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlswXVsxXVsxXSA9IHMtPm12WzBdWzBdWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+Zl9jb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tdl9kaXIgJiBNVl9ESVJfQkFDS1dBUkQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfZW5jb2RlX21vdGlvbl92ZWN0b3IocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMV1bMF1bMF0gLSBzLT5sYXN0X212WzFdWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVsxXSAtIHMtPmxhc3RfbXZbMV1bMF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJfY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzFdWzBdWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMV1bMV1bMF0gPSBzLT5tdlsxXVswXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMV1bMF1bMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlsxXVsxXVsxXSA9IHMtPm12WzFdWzBdWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+Yl9jb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm12X2RpciAmIE1WX0RJUl9GT1JXQVJEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmZpZWxkX3NlbGVjdFswXVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmZpZWxkX3NlbGVjdFswXVsxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm12X2RpciAmIE1WX0RJUl9CQUNLV0FSRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5maWVsZF9zZWxlY3RbMV1bMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5maWVsZF9zZWxlY3RbMV1bMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tdl9kaXIgJiBNVl9ESVJfRk9SV0FSRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfZW5jb2RlX21vdGlvbl92ZWN0b3IocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzBdIC0gcy0+bGFzdF9tdlswXVtpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzFdIC0gcy0+bGFzdF9tdlswXVtpXVsxXSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mX2NvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1baV1bMF0gPSBzLT5tdlswXVtpXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzBdW2ldWzFdID0gcy0+bXZbMF1baV1bMV0gKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+Zl9jb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tdl9kaXIgJiBNVl9ESVJfQkFDS1dBUkQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9oMjYzX2VuY29kZV9tb3Rpb25fdmVjdG9yKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVtpXVswXSAtIHMtPmxhc3RfbXZbMV1baV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVtpXVsxXSAtIHMtPmxhc3RfbXZbMV1baV1bMV0gLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Yl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X212WzFdW2ldWzBdID0gcy0+bXZbMV1baV1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlsxXVtpXVsxXSA9IHMtPm12WzFdW2ldWzFdICogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGludGVybGVhdmVkX3N0YXRzKQorICAgICAgICAgICAgICAgIHMtPm12X2JpdHMgKz0gZ2V0X2JpdHNfZGlmZihzKTsKKworICAgICAgICAgICAgbXBlZzRfZW5jb2RlX2Jsb2NrcyhzLCBibG9jaywgTlVMTCwgTlVMTCwgTlVMTCwgJnMtPnBiKTsKKworICAgICAgICAgICAgaWYgKGludGVybGVhdmVkX3N0YXRzKQorICAgICAgICAgICAgICAgIHMtPnBfdGV4X2JpdHMgKz0gZ2V0X2JpdHNfZGlmZihzKTsKKyAgICAgICAgfSBlbHNlIHsgLyogcy0+cGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfQiAqLworICAgICAgICAgICAgY2JwID0gZ2V0X3BfY2JwKHMsIGJsb2NrLCBtb3Rpb25feCwgbW90aW9uX3kpOworCisgICAgICAgICAgICBpZiAoKGNicCB8IG1vdGlvbl94IHwgbW90aW9uX3kgfCBzLT5kcXVhbnQpID09IDAgJiYKKyAgICAgICAgICAgICAgICBzLT5tdl90eXBlID09IE1WX1RZUEVfMTZYMTYpIHsKKyAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiB0aGUgQiBmcmFtZXMgY2FuIHNraXAgaXQgdG9vLCBhcyB3ZSBtdXN0IHNraXAgaXQKKyAgICAgICAgICAgICAgICAgKiBpZiB3ZSBza2lwIGhlcmUgd2h5IGRpZG4ndCB0aGV5IGp1c3QgY29tcHJlc3MKKyAgICAgICAgICAgICAgICAgKiB0aGUgc2tpcC1tYiBiaXRzIGluc3RlYWQgb2YgcmV1c2luZyB0aGVtID8hICovCisgICAgICAgICAgICAgICAgaWYgKHMtPm1heF9iX2ZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgIGludCB4LCB5LCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfcGljOworCisgICAgICAgICAgICAgICAgICAgIHggPSBzLT5tYl94ICogMTY7CisgICAgICAgICAgICAgICAgICAgIHkgPSBzLT5tYl95ICogMTY7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0geCArIHkgKiBzLT5saW5lc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgcF9waWMgID0gcy0+bmV3X3BpY3R1cmUuZi0+ZGF0YVswXSArIG9mZnNldDsKKworICAgICAgICAgICAgICAgICAgICBzLT5tYl9za2lwcGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm1heF9iX2ZyYW1lczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiX3BpYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaWZmOworICAgICAgICAgICAgICAgICAgICAgICAgUGljdHVyZSAqcGljID0gcy0+cmVvcmRlcmVkX2lucHV0X3BpY3R1cmVbaSArIDFdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBpYyB8fCBwaWMtPmYtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgYl9waWMgPSBwaWMtPmYtPmRhdGFbMF0gKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBpYy0+c2hhcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfcGljICs9IElOUExBQ0VfT0ZGU0VUOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCArIDE2ID4gcy0+d2lkdGggfHwgeSArIDE2ID4gcy0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgxLCB5MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeGUgPSBGRk1JTigxNiwgcy0+d2lkdGggLSB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeWUgPSBGRk1JTigxNiwgcy0+aGVpZ2h0IC0geSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5MSA9IDA7IHkxIDwgeWU7IHkxKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh4MSA9IDA7IHgxIDwgeGU7IHgxKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgKz0gRkZBQlMocF9waWNbeDEgKyB5MSAqIHMtPmxpbmVzaXplXSAtIGJfcGljW3gxICsgeTEgKiBzLT5saW5lc2l6ZV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgPSBkaWZmICogMjU2IC8gKHhlICogeWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmID0gcy0+bWVjYy5zYWRbMF0oTlVMTCwgcF9waWMsIGJfcGljLCBzLT5saW5lc2l6ZSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiBzLT5xc2NhbGUgKiA3MCkgeyAgLy8gRklYTUUgY2hlY2sgdGhhdCA3MCBpcyBvcHRpbWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfc2tpcHBlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcy0+bWJfc2tpcHBlZCA9IDE7CisKKyAgICAgICAgICAgICAgICBpZiAocy0+bWJfc2tpcHBlZCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgbWFjcm9ibG9jayAqLworICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmxlYXZlZF9zdGF0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWlzY19iaXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X2JpdHMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzLT5za2lwX2NvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgIC8qIG1iIGNvZGVkICovCisgICAgICAgICAgICBjYnBjICA9IGNicCAmIDM7CisgICAgICAgICAgICBjYnB5ICA9IGNicCA+PiAyOworICAgICAgICAgICAgY2JweSBePSAweGY7CisgICAgICAgICAgICBpZiAocy0+bXZfdHlwZSA9PSBNVl9UWVBFXzE2WDE2KSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmRxdWFudCkKKyAgICAgICAgICAgICAgICAgICAgY2JwYyArPSA4OworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmZl9oMjYzX2ludGVyX01DQlBDX2JpdHNbY2JwY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaDI2M19pbnRlcl9NQ0JQQ19jb2RlW2NicGNdKTsKKworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiMiwgZmZfaDI2M19jYnB5X3RhYltjYnB5XVsxXSwgZmZfaDI2M19jYnB5X3RhYltjYnB5XVswXSk7CisgICAgICAgICAgICAgICAgaWYgKHMtPmRxdWFudCkKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIyLCAyLCBkcXVhbnRfY29kZVtzLT5kcXVhbnQgKyAyXSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXMtPnByb2dyZXNzaXZlX3NlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYnApCisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cyhwYjIsIDEsIHMtPmludGVybGFjZWRfZGN0KTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIyLCAxLCAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJsZWF2ZWRfc3RhdHMpCisgICAgICAgICAgICAgICAgICAgIHMtPm1pc2NfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworCisgICAgICAgICAgICAgICAgLyogbW90aW9uIHZlY3RvcnM6IDE2eDE2IG1vZGUgKi8KKyAgICAgICAgICAgICAgICBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIDAsIDAsICZwcmVkX3gsICZwcmVkX3kpOworCisgICAgICAgICAgICAgICAgZmZfaDI2M19lbmNvZGVfbW90aW9uX3ZlY3RvcihzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3ggLSBwcmVkX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feSAtIHByZWRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZfY29kZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPm12X3R5cGUgPT0gTVZfVFlQRV9GSUVMRCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5kcXVhbnQpCisgICAgICAgICAgICAgICAgICAgIGNicGMgKz0gODsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaDI2M19pbnRlcl9NQ0JQQ19iaXRzW2NicGNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfaW50ZXJfTUNCUENfY29kZVtjYnBjXSk7CisKKyAgICAgICAgICAgICAgICBwdXRfYml0cyhwYjIsIGZmX2gyNjNfY2JweV90YWJbY2JweV1bMV0sIGZmX2gyNjNfY2JweV90YWJbY2JweV1bMF0pOworICAgICAgICAgICAgICAgIGlmIChzLT5kcXVhbnQpCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiMiwgMiwgZHF1YW50X2NvZGVbcy0+ZHF1YW50ICsgMl0pOworCisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0Mighcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UpOworICAgICAgICAgICAgICAgIGlmIChjYnApCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiMiwgMSwgcy0+aW50ZXJsYWNlZF9kY3QpOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiMiwgMSwgMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJsZWF2ZWRfc3RhdHMpCisgICAgICAgICAgICAgICAgICAgIHMtPm1pc2NfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworCisgICAgICAgICAgICAgICAgLyogbW90aW9uIHZlY3RvcnM6IDE2eDggaW50ZXJsYWNlZCBtb2RlICovCisgICAgICAgICAgICAgICAgZmZfaDI2M19wcmVkX21vdGlvbihzLCAwLCAwLCAmcHJlZF94LCAmcHJlZF95KTsKKyAgICAgICAgICAgICAgICBwcmVkX3kgLz0gMjsKKworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+ZmllbGRfc2VsZWN0WzBdWzBdKTsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmZpZWxkX3NlbGVjdFswXVsxXSk7CisKKyAgICAgICAgICAgICAgICBmZl9oMjYzX2VuY29kZV9tb3Rpb25fdmVjdG9yKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVswXSAtIHByZWRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdIC0gcHJlZF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Zl9jb2RlKTsKKyAgICAgICAgICAgICAgICBmZl9oMjYzX2VuY29kZV9tb3Rpb25fdmVjdG9yKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVsxXVswXSAtIHByZWRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdWzFdWzFdIC0gcHJlZF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Zl9jb2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihzLT5tdl90eXBlID09IE1WX1RZUEVfOFg4KTsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaDI2M19pbnRlcl9NQ0JQQ19iaXRzW2NicGMgKyAxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaDI2M19pbnRlcl9NQ0JQQ19jb2RlW2NicGMgKyAxNl0pOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiMiwgZmZfaDI2M19jYnB5X3RhYltjYnB5XVsxXSwgZmZfaDI2M19jYnB5X3RhYltjYnB5XVswXSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXMtPnByb2dyZXNzaXZlX3NlcXVlbmNlICYmIGNicCkKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIyLCAxLCBzLT5pbnRlcmxhY2VkX2RjdCk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJsZWF2ZWRfc3RhdHMpCisgICAgICAgICAgICAgICAgICAgIHMtPm1pc2NfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvKiBtb3Rpb24gdmVjdG9yczogOHg4IG1vZGUqLworICAgICAgICAgICAgICAgICAgICBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIGksIDAsICZwcmVkX3gsICZwcmVkX3kpOworCisgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfZW5jb2RlX21vdGlvbl92ZWN0b3IocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVtzLT5ibG9ja19pbmRleFtpXV1bMF0gLSBwcmVkX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dWzFdIC0gcHJlZF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZfY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW50ZXJsZWF2ZWRfc3RhdHMpCisgICAgICAgICAgICAgICAgcy0+bXZfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworCisgICAgICAgICAgICBtcGVnNF9lbmNvZGVfYmxvY2tzKHMsIGJsb2NrLCBOVUxMLCBOVUxMLCBOVUxMLCB0ZXhfcGIpOworCisgICAgICAgICAgICBpZiAoaW50ZXJsZWF2ZWRfc3RhdHMpCisgICAgICAgICAgICAgICAgcy0+cF90ZXhfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworCisgICAgICAgICAgICBzLT5mX2NvdW50Kys7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgY2JwOworICAgICAgICBpbnQgZGNfZGlmZls2XTsgIC8vIGRjIHZhbHVlcyB3aXRoIHRoZSBkYyBwcmVkaWN0aW9uIHN1YnRyYWN0ZWQKKyAgICAgICAgaW50IGRpcls2XTsgICAgICAvLyBwcmVkaWN0aW9uIGRpcmVjdGlvbgorICAgICAgICBpbnQgemlnemFnX2xhc3RfaW5kZXhbNl07CisgICAgICAgIHVpbnQ4X3QgKnNjYW5fdGFibGVbNl07CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICBkY19kaWZmW2ldID0gZmZfbXBlZzRfcHJlZF9kYyhzLCBpLCBibG9ja1tpXVswXSwgJmRpcltpXSwgMSk7CisKKyAgICAgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19BQ19QUkVEKSB7CisgICAgICAgICAgICBzLT5hY19wcmVkID0gZGVjaWRlX2FjX3ByZWQocywgYmxvY2ssIGRpciwgc2Nhbl90YWJsZSwgemlnemFnX2xhc3RfaW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgICAgICBzY2FuX3RhYmxlW2ldID0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBjb21wdXRlIGNicCAqLworICAgICAgICBjYnAgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgaWYgKHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPj0gMSkKKyAgICAgICAgICAgICAgICBjYnAgfD0gMSA8PCAoNSAtIGkpOworCisgICAgICAgIGNicGMgPSBjYnAgJiAzOworICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgICAgICBpZiAocy0+ZHF1YW50KQorICAgICAgICAgICAgICAgIGNicGMgKz0gNDsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwKKyAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfaW50cmFfTUNCUENfYml0c1tjYnBjXSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfaW50cmFfTUNCUENfY29kZVtjYnBjXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocy0+ZHF1YW50KQorICAgICAgICAgICAgICAgIGNicGMgKz0gODsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAvKiBtYiBjb2RlZCAqLworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgZmZfaDI2M19pbnRlcl9NQ0JQQ19iaXRzW2NicGMgKyA0XSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfaW50ZXJfTUNCUENfY29kZVtjYnBjICsgNF0pOworICAgICAgICB9CisgICAgICAgIHB1dF9iaXRzKHBiMiwgMSwgcy0+YWNfcHJlZCk7CisgICAgICAgIGNicHkgPSBjYnAgPj4gMjsKKyAgICAgICAgcHV0X2JpdHMocGIyLCBmZl9oMjYzX2NicHlfdGFiW2NicHldWzFdLCBmZl9oMjYzX2NicHlfdGFiW2NicHldWzBdKTsKKyAgICAgICAgaWYgKHMtPmRxdWFudCkKKyAgICAgICAgICAgIHB1dF9iaXRzKGRjX3BiLCAyLCBkcXVhbnRfY29kZVtzLT5kcXVhbnQgKyAyXSk7CisKKyAgICAgICAgaWYgKCFzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSkKKyAgICAgICAgICAgIHB1dF9iaXRzKGRjX3BiLCAxLCBzLT5pbnRlcmxhY2VkX2RjdCk7CisKKyAgICAgICAgaWYgKGludGVybGVhdmVkX3N0YXRzKQorICAgICAgICAgICAgcy0+bWlzY19iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisKKyAgICAgICAgbXBlZzRfZW5jb2RlX2Jsb2NrcyhzLCBibG9jaywgZGNfZGlmZiwgc2Nhbl90YWJsZSwgZGNfcGIsIHRleF9wYik7CisKKyAgICAgICAgaWYgKGludGVybGVhdmVkX3N0YXRzKQorICAgICAgICAgICAgcy0+aV90ZXhfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworICAgICAgICBzLT5pX2NvdW50Kys7CisKKyAgICAgICAgLyogcmVzdG9yZSBhYyBjb2VmZnMgJiBsYXN0X2luZGV4IHN0dWZmCisgICAgICAgICAqIGlmIHdlIG1lc3NlZCB0aGVtIHVwIHdpdGggdGhlIHByZWRpY3Rpb24gKi8KKyAgICAgICAgaWYgKHMtPmFjX3ByZWQpCisgICAgICAgICAgICByZXN0b3JlX2FjX2NvZWZmcyhzLCBibG9jaywgZGlyLCBzY2FuX3RhYmxlLCB6aWd6YWdfbGFzdF9pbmRleCk7CisgICAgfQorfQorCisvKioKKyAqIGFkZCBtcGVnNCBzdHVmZmluZyBiaXRzICgwMS4uLjEpCisgKi8KK3ZvaWQgZmZfbXBlZzRfc3R1ZmZpbmcoUHV0Qml0Q29udGV4dCAqcGJjKQoreworICAgIGludCBsZW5ndGg7CisgICAgcHV0X2JpdHMocGJjLCAxLCAwKTsKKyAgICBsZW5ndGggPSAoLXB1dF9iaXRzX2NvdW50KHBiYykpICYgNzsKKyAgICBpZiAobGVuZ3RoKQorICAgICAgICBwdXRfYml0cyhwYmMsIGxlbmd0aCwgKDEgPDwgbGVuZ3RoKSAtIDEpOworfQorCisvKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgd3JpdGluZyB0aGUgaGVhZGVyICovCit2b2lkIGZmX3NldF9tcGVnNF90aW1lKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgZmZfbXBlZzRfaW5pdF9kaXJlY3RfbXYocyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bGFzdF90aW1lX2Jhc2UgPSBzLT50aW1lX2Jhc2U7CisgICAgICAgIHMtPnRpbWVfYmFzZSAgICAgID0gRkZVRElWKHMtPnRpbWUsIHMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1wZWc0X2VuY29kZV9nb3BfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludCBob3VycywgbWludXRlcywgc2Vjb25kczsKKyAgICBpbnQ2NF90IHRpbWU7CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDE2LCAwKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDE2LCBHT1BfU1RBUlRDT0RFKTsKKworICAgIHRpbWUgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5wdHM7CisgICAgaWYgKHMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlWzFdKQorICAgICAgICB0aW1lID0gRkZNSU4odGltZSwgcy0+cmVvcmRlcmVkX2lucHV0X3BpY3R1cmVbMV0tPmYtPnB0cyk7CisgICAgdGltZSA9IHRpbWUgKiBzLT5hdmN0eC0+dGltZV9iYXNlLm51bTsKKyAgICBzLT5sYXN0X3RpbWVfYmFzZSA9IEZGVURJVih0aW1lLCBzLT5hdmN0eC0+dGltZV9iYXNlLmRlbik7CisKKyAgICBzZWNvbmRzID0gRkZVRElWKHRpbWUsIHMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuKTsKKyAgICBtaW51dGVzID0gRkZVRElWKHNlY29uZHMsIDYwKTsgc2Vjb25kcyA9IEZGVU1PRChzZWNvbmRzLCA2MCk7CisgICAgaG91cnMgICA9IEZGVURJVihtaW51dGVzLCA2MCk7IG1pbnV0ZXMgPSBGRlVNT0QobWludXRlcywgNjApOworICAgIGhvdXJzICAgPSBGRlVNT0QoaG91cnMgICwgMjQpOworCisgICAgcHV0X2JpdHMoJnMtPnBiLCA1LCBob3Vycyk7CisgICAgcHV0X2JpdHMoJnMtPnBiLCA2LCBtaW51dGVzKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgNiwgc2Vjb25kcyk7CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsICEhKHMtPmZsYWdzICYgQ09ERUNfRkxBR19DTE9TRURfR09QKSk7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgIC8vIGJyb2tlbiBsaW5rID09IE5PCisKKyAgICBmZl9tcGVnNF9zdHVmZmluZygmcy0+cGIpOworfQorCitzdGF0aWMgdm9pZCBtcGVnNF9lbmNvZGVfdmlzdWFsX29iamVjdF9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb247CisgICAgaW50IHZvX3Zlcl9pZDsKKworICAgIGlmIChzLT5hdmN0eC0+cHJvZmlsZSAhPSBGRl9QUk9GSUxFX1VOS05PV04pIHsKKyAgICAgICAgcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiA9IHMtPmF2Y3R4LT5wcm9maWxlIDw8IDQ7CisgICAgfSBlbHNlIGlmIChzLT5tYXhfYl9mcmFtZXMgfHwgcy0+cXVhcnRlcl9zYW1wbGUpIHsKKyAgICAgICAgcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiA9IDB4RjA7ICAvLyBhZHYgc2ltcGxlCisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiA9IDB4MDA7ICAvLyBzaW1wbGUKKyAgICB9CisKKyAgICBpZiAocy0+YXZjdHgtPmxldmVsICE9IEZGX0xFVkVMX1VOS05PV04pCisgICAgICAgIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24gfD0gcy0+YXZjdHgtPmxldmVsOworICAgIGVsc2UKKyAgICAgICAgcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiB8PSAxOyAgIC8vIGxldmVsIDEKKworICAgIGlmIChwcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uID4+IDQgPT0gMHhGKQorICAgICAgICB2b192ZXJfaWQgPSA1OworICAgIGVsc2UKKyAgICAgICAgdm9fdmVyX2lkID0gMTsKKworICAgIC8vIEZJWE1FIGxldmVscworCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgMCk7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgVk9TX1NUQVJUQ09ERSk7CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDgsIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24pOworCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgMCk7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgVklTVUFMX09CSl9TVEFSVENPREUpOworCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDQsIHZvX3Zlcl9pZCk7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCAxKTsgICAgIC8vIHByaW9yaXR5CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDQsIDEpOyAgICAgLy8gdmlzdWFsIG9iaiB0eXBlPT0gdmlkZW8gb2JqCisKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgLy8gdmlkZW8gc2lnbmFsIHR5cGUgPT0gbm8gY2x1ZSAvLyBGSVhNRQorCisgICAgZmZfbXBlZzRfc3R1ZmZpbmcoJnMtPnBiKTsKK30KKworc3RhdGljIHZvaWQgbXBlZzRfZW5jb2RlX3ZvbF9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdm9fbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZvbF9udW1iZXIpCit7CisgICAgaW50IHZvX3Zlcl9pZDsKKworICAgIGlmICghQ09ORklHX01QRUc0X0VOQ09ERVIpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChzLT5tYXhfYl9mcmFtZXMgfHwgcy0+cXVhcnRlcl9zYW1wbGUpIHsKKyAgICAgICAgdm9fdmVyX2lkICA9IDU7CisgICAgICAgIHMtPnZvX3R5cGUgPSBBRFZfU0lNUExFX1ZPX1RZUEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdm9fdmVyX2lkICA9IDE7CisgICAgICAgIHMtPnZvX3R5cGUgPSBTSU1QTEVfVk9fVFlQRTsKKyAgICB9CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDE2LCAwKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDE2LCAweDEwMCArIHZvX251bWJlcik7ICAgICAgICAvKiB2aWRlbyBvYmogKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDE2LCAwKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDE2LCAweDEyMCArIHZvbF9udW1iZXIpOyAgICAgICAvKiB2aWRlbyBvYmogbGF5ZXIgKi8KKworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgICAgIC8qIHJhbmRvbSBhY2Nlc3Mgdm9sICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCBzLT52b190eXBlKTsgICAgLyogdmlkZW8gb2JqIHR5cGUgaW5kaWNhdGlvbiAqLworICAgIGlmIChzLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfTVMpIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAvKiBpcyBvYmogbGF5ZXIgaWQ9IG5vICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsgICAgICAgICAvKiBpcyBvYmogbGF5ZXIgaWQ9IHllcyAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDQsIHZvX3Zlcl9pZCk7IC8qIGlzIG9iaiBsYXllciB2ZXIgaWQgKi8KKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAzLCAxKTsgICAgICAgICAvKiBpcyBvYmogbGF5ZXIgcHJpb3JpdHkgKi8KKyAgICB9CisKKyAgICBzLT5hc3BlY3RfcmF0aW9faW5mbyA9IGZmX2gyNjNfYXNwZWN0X3RvX2luZm8ocy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworCisgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCBzLT5hc3BlY3RfcmF0aW9faW5mbyk7IC8qIGFzcGVjdCByYXRpbyBpbmZvICovCisgICAgaWYgKHMtPmFzcGVjdF9yYXRpb19pbmZvID09IEZGX0FTUEVDVF9FWFRFTkRFRCkgeworICAgICAgICBhdl9yZWR1Y2UoJnMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgJnMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sIDI1NSk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgIH0KKworICAgIGlmIChzLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfTVMpIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAvKiB2b2wgY29udHJvbCBwYXJhbWV0ZXJzPSBubyBAQEAgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOyAgICAgICAgIC8qIHZvbCBjb250cm9sIHBhcmFtZXRlcnM9IHllcyAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIDEpOyAgICAgICAgIC8qIGNocm9tYSBmb3JtYXQgWVVWIDQyMC9ZVjEyICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+bG93X2RlbGF5KTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAvKiB2YnYgcGFyYW1ldGVycz0gbm8gKi8KKyAgICB9CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDIsIFJFQ1RfU0hBUEUpOyAgICAvKiB2b2wgc2hhcGU9IHJlY3RhbmdsZSAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7ICAgICAgICAgICAgIC8qIG1hcmtlciBiaXQgKi8KKworICAgIHB1dF9iaXRzKCZzLT5wYiwgMTYsIHMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuKTsKKyAgICBpZiAocy0+dGltZV9pbmNyZW1lbnRfYml0cyA8IDEpCisgICAgICAgIHMtPnRpbWVfaW5jcmVtZW50X2JpdHMgPSAxOworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7ICAgICAgICAgICAgIC8qIG1hcmtlciBiaXQgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgICAgICAvKiBmaXhlZCB2b3AgcmF0ZT1ubyAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7ICAgICAgICAgICAgIC8qIG1hcmtlciBiaXQgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEzLCBzLT53aWR0aCk7ICAgICAvKiB2b2wgd2lkdGggKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOyAgICAgICAgICAgICAvKiBtYXJrZXIgYml0ICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxMywgcy0+aGVpZ2h0KTsgICAgLyogdm9sIGhlaWdodCAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7ICAgICAgICAgICAgIC8qIG1hcmtlciBiaXQgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPnByb2dyZXNzaXZlX3NlcXVlbmNlID8gMCA6IDEpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7ICAgICAgICAgICAgIC8qIG9ibWMgZGlzYWJsZSAqLworICAgIGlmICh2b192ZXJfaWQgPT0gMSkKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgLyogc3ByaXRlIGVuYWJsZSAqLworICAgIGVsc2UKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAyLCAwKTsgICAgICAgLyogc3ByaXRlIGVuYWJsZSAqLworCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAgLyogbm90IDggYml0ID09IGZhbHNlICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5tcGVnX3F1YW50KTsgLyogcXVhbnQgdHlwZT0gKDA9aDI2MyBzdHlsZSkqLworCisgICAgaWYgKHMtPm1wZWdfcXVhbnQpIHsKKyAgICAgICAgZmZfd3JpdGVfcXVhbnRfbWF0cml4KCZzLT5wYiwgcy0+YXZjdHgtPmludHJhX21hdHJpeCk7CisgICAgICAgIGZmX3dyaXRlX3F1YW50X21hdHJpeCgmcy0+cGIsIHMtPmF2Y3R4LT5pbnRlcl9tYXRyaXgpOworICAgIH0KKworICAgIGlmICh2b192ZXJfaWQgIT0gMSkKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5xdWFydGVyX3NhbXBsZSk7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsgICAgICAgICAgICAgLyogY29tcGxleGl0eSBlc3RpbWF0aW9uIGRpc2FibGUgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPnJ0cF9tb2RlID8gMCA6IDEpOyAvKiByZXN5bmMgbWFya2VyIGRpc2FibGUgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmRhdGFfcGFydGl0aW9uaW5nID8gMSA6IDApOworICAgIGlmIChzLT5kYXRhX3BhcnRpdGlvbmluZykKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAvKiBubyBydmxjICovCisKKyAgICBpZiAodm9fdmVyX2lkICE9IDEpIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAvKiBuZXdwcmVkICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgLyogcmVkdWNlZCByZXMgdm9wICovCisgICAgfQorICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgICAgIC8qIHNjYWxhYmlsaXR5ICovCisKKyAgICBmZl9tcGVnNF9zdHVmZmluZygmcy0+cGIpOworCisgICAgLyogdXNlciBkYXRhICovCisgICAgaWYgKCEocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKSkgeworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDE2LCAwKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgMHgxQjIpOyAgICAvKiB1c2VyX2RhdGEgKi8KKyAgICAgICAgYXZwcml2X3B1dF9zdHJpbmcoJnMtPnBiLCBMSUJBVkNPREVDX0lERU5ULCAwKTsKKyAgICB9Cit9CisKKy8qIHdyaXRlIG1wZWc0IFZPUCBoZWFkZXIgKi8KK3ZvaWQgZmZfbXBlZzRfZW5jb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgcGljdHVyZV9udW1iZXIpCit7CisgICAgaW50IHRpbWVfaW5jcjsKKyAgICBpbnQgdGltZV9kaXYsIHRpbWVfbW9kOworCisgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICBpZiAoIShzLT5mbGFncyAmIENPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikpIHsKKyAgICAgICAgICAgIGlmIChzLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPCBGRl9DT01QTElBTkNFX1ZFUllfU1RSSUNUKSAgLy8gSEFDSywgdGhlIHJlZmVyZW5jZSBzdyBpcyBidWdneQorICAgICAgICAgICAgICAgIG1wZWc0X2VuY29kZV92aXN1YWxfb2JqZWN0X2hlYWRlcihzKTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPCBGRl9DT01QTElBTkNFX1ZFUllfU1RSSUNUIHx8IHBpY3R1cmVfbnVtYmVyID09IDApICAvLyBIQUNLLCB0aGUgcmVmZXJlbmNlIHN3IGlzIGJ1Z2d5CisgICAgICAgICAgICAgICAgbXBlZzRfZW5jb2RlX3ZvbF9oZWFkZXIocywgMCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEocy0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX01TKSkKKyAgICAgICAgICAgIG1wZWc0X2VuY29kZV9nb3BfaGVhZGVyKHMpOworICAgIH0KKworICAgIHMtPnBhcnRpdGlvbmVkX2ZyYW1lID0gcy0+ZGF0YV9wYXJ0aXRpb25pbmcgJiYgcy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9COworCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgMCk7ICAgICAgICAgICAgICAgIC8qIHZvcCBoZWFkZXIgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDE2LCBWT1BfU1RBUlRDT0RFKTsgICAgLyogdm9wIGhlYWRlciAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgcy0+cGljdF90eXBlIC0gMSk7ICAvKiBwaWN0IHR5cGU6IEkgPSAwICwgUCA9IDEgKi8KKworICAgIHRpbWVfZGl2ICA9IEZGVURJVihzLT50aW1lLCBzLT5hdmN0eC0+dGltZV9iYXNlLmRlbik7CisgICAgdGltZV9tb2QgID0gRkZVTU9EKHMtPnRpbWUsIHMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuKTsKKyAgICB0aW1lX2luY3IgPSB0aW1lX2RpdiAtIHMtPmxhc3RfdGltZV9iYXNlOworICAgIGF2X2Fzc2VydDAodGltZV9pbmNyID49IDApOworICAgIHdoaWxlICh0aW1lX2luY3ItLSkKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsKKworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFya2VyICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT50aW1lX2luY3JlbWVudF9iaXRzLCB0aW1lX21vZCk7IC8qIHRpbWUgaW5jcmVtZW50ICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hcmtlciAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2b3AgY29kZWQgKi8KKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+bm9fcm91bmRpbmcpOyAgICAvKiByb3VuZGluZyB0eXBlICovCisgICAgfQorICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgMCk7ICAgICAvKiBpbnRyYSBkYyBWTEMgdGhyZXNob2xkICovCisgICAgaWYgKCFzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSkgeworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnRvcF9maWVsZF9maXJzdCk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+YWx0ZXJuYXRlX3NjYW4pOworICAgIH0KKyAgICAvLyBGSVhNRSBzcHJpdGUgc3R1ZmYKKworICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgcy0+cXNjYWxlKTsKKworICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+Zl9jb2RlKTsgIC8qIGZjb2RlX2ZvciAqLworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+Yl9jb2RlKTsgIC8qIGZjb2RlX2JhY2sgKi8KK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X3VuaV9kY190YWIodm9pZCkKK3sKKyAgICBpbnQgbGV2ZWwsIHVuaV9jb2RlLCB1bmlfbGVuOworCisgICAgZm9yIChsZXZlbCA9IC0yNTY7IGxldmVsIDwgMjU2OyBsZXZlbCsrKSB7CisgICAgICAgIGludCBzaXplLCB2LCBsOworICAgICAgICAvKiBmaW5kIG51bWJlciBvZiBiaXRzICovCisgICAgICAgIHNpemUgPSAwOworICAgICAgICB2ICAgID0gYWJzKGxldmVsKTsKKyAgICAgICAgd2hpbGUgKHYpIHsKKyAgICAgICAgICAgIHYgPj49IDE7CisgICAgICAgICAgICBzaXplKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGV2ZWwgPCAwKQorICAgICAgICAgICAgbCA9ICgtbGV2ZWwpIF4gKCgxIDw8IHNpemUpIC0gMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGwgPSBsZXZlbDsKKworICAgICAgICAvKiBsdW1pbmFuY2UgKi8KKyAgICAgICAgdW5pX2NvZGUgPSBmZl9tcGVnNF9EQ3RhYl9sdW1bc2l6ZV1bMF07CisgICAgICAgIHVuaV9sZW4gID0gZmZfbXBlZzRfREN0YWJfbHVtW3NpemVdWzFdOworCisgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgdW5pX2NvZGUgPDw9IHNpemU7CisgICAgICAgICAgICB1bmlfY29kZSAgfD0gbDsKKyAgICAgICAgICAgIHVuaV9sZW4gICArPSBzaXplOworICAgICAgICAgICAgaWYgKHNpemUgPiA4KSB7CisgICAgICAgICAgICAgICAgdW5pX2NvZGUgPDw9IDE7CisgICAgICAgICAgICAgICAgdW5pX2NvZGUgIHw9IDE7CisgICAgICAgICAgICAgICAgdW5pX2xlbisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVuaV9EQ3RhYl9sdW1fYml0c1tsZXZlbCArIDI1Nl0gPSB1bmlfY29kZTsKKyAgICAgICAgdW5pX0RDdGFiX2x1bV9sZW5bbGV2ZWwgKyAyNTZdICA9IHVuaV9sZW47CisKKyAgICAgICAgLyogY2hyb21pbmFuY2UgKi8KKyAgICAgICAgdW5pX2NvZGUgPSBmZl9tcGVnNF9EQ3RhYl9jaHJvbVtzaXplXVswXTsKKyAgICAgICAgdW5pX2xlbiAgPSBmZl9tcGVnNF9EQ3RhYl9jaHJvbVtzaXplXVsxXTsKKworICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHVuaV9jb2RlIDw8PSBzaXplOworICAgICAgICAgICAgdW5pX2NvZGUgIHw9IGw7CisgICAgICAgICAgICB1bmlfbGVuICAgKz0gc2l6ZTsKKyAgICAgICAgICAgIGlmIChzaXplID4gOCkgeworICAgICAgICAgICAgICAgIHVuaV9jb2RlIDw8PSAxOworICAgICAgICAgICAgICAgIHVuaV9jb2RlICB8PSAxOworICAgICAgICAgICAgICAgIHVuaV9sZW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1bmlfREN0YWJfY2hyb21fYml0c1tsZXZlbCArIDI1Nl0gPSB1bmlfY29kZTsKKyAgICAgICAgdW5pX0RDdGFiX2Nocm9tX2xlbltsZXZlbCArIDI1Nl0gID0gdW5pX2xlbjsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgaW5pdF91bmlfbXBlZzRfcmxfdGFiKFJMVGFibGUgKnJsLCB1aW50MzJfdCAqYml0c190YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpsZW5fdGFiKQoreworICAgIGludCBzbGV2ZWwsIHJ1biwgbGFzdDsKKworICAgIGF2X2Fzc2VydDAoTUFYX0xFVkVMID49IDY0KTsKKyAgICBhdl9hc3NlcnQwKE1BWF9SVU4gPj0gNjMpOworCisgICAgZm9yIChzbGV2ZWwgPSAtNjQ7IHNsZXZlbCA8IDY0OyBzbGV2ZWwrKykgeworICAgICAgICBpZiAoc2xldmVsID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yIChydW4gPSAwOyBydW4gPCA2NDsgcnVuKyspIHsKKyAgICAgICAgICAgIGZvciAobGFzdCA9IDA7IGxhc3QgPD0gMTsgbGFzdCsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGluZGV4ID0gVU5JX01QRUc0X0VOQ19JTkRFWChsYXN0LCBydW4sIHNsZXZlbCArIDY0KTsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgICAgICAgPSBzbGV2ZWwgPCAwID8gLXNsZXZlbCA6IHNsZXZlbDsKKyAgICAgICAgICAgICAgICBpbnQgc2lnbiAgICAgICAgPSBzbGV2ZWwgPCAwID8gMSA6IDA7CisgICAgICAgICAgICAgICAgaW50IGJpdHMsIGxlbiwgY29kZTsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwxLCBydW4xOworCisgICAgICAgICAgICAgICAgbGVuX3RhYltpbmRleF0gPSAxMDA7CisKKyAgICAgICAgICAgICAgICAvKiBFU0MwICovCisgICAgICAgICAgICAgICAgY29kZSA9IGdldF9ybF9pbmRleChybCwgbGFzdCwgcnVuLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgYml0cyA9IHJsLT50YWJsZV92bGNbY29kZV1bMF07CisgICAgICAgICAgICAgICAgbGVuICA9IHJsLT50YWJsZV92bGNbY29kZV1bMV07CisgICAgICAgICAgICAgICAgYml0cyA9IGJpdHMgKiAyICsgc2lnbjsKKyAgICAgICAgICAgICAgICBsZW4rKzsKKworICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IHJsLT5uICYmIGxlbiA8IGxlbl90YWJbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgIGJpdHNfdGFiW2luZGV4XSA9IGJpdHM7CisgICAgICAgICAgICAgICAgICAgIGxlbl90YWJbaW5kZXhdICA9IGxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRVNDMSAqLworICAgICAgICAgICAgICAgIGJpdHMgPSBybC0+dGFibGVfdmxjW3JsLT5uXVswXTsKKyAgICAgICAgICAgICAgICBsZW4gID0gcmwtPnRhYmxlX3ZsY1tybC0+bl1bMV07CisgICAgICAgICAgICAgICAgYml0cyA9IGJpdHMgKiAyOworICAgICAgICAgICAgICAgIGxlbisrOyAgICAgICAgICAgICAgICAgLy8gZXNjMQorICAgICAgICAgICAgICAgIGxldmVsMSA9IGxldmVsIC0gcmwtPm1heF9sZXZlbFtsYXN0XVtydW5dOworICAgICAgICAgICAgICAgIGlmIChsZXZlbDEgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUgICA9IGdldF9ybF9pbmRleChybCwgbGFzdCwgcnVuLCBsZXZlbDEpOworICAgICAgICAgICAgICAgICAgICBiaXRzIDw8PSBybC0+dGFibGVfdmxjW2NvZGVdWzFdOworICAgICAgICAgICAgICAgICAgICBsZW4gICArPSBybC0+dGFibGVfdmxjW2NvZGVdWzFdOworICAgICAgICAgICAgICAgICAgICBiaXRzICArPSBybC0+dGFibGVfdmxjW2NvZGVdWzBdOworICAgICAgICAgICAgICAgICAgICBiaXRzICAgPSBiaXRzICogMiArIHNpZ247CisgICAgICAgICAgICAgICAgICAgIGxlbisrOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IHJsLT5uICYmIGxlbiA8IGxlbl90YWJbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzX3RhYltpbmRleF0gPSBiaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuX3RhYltpbmRleF0gID0gbGVuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEVTQzIgKi8KKyAgICAgICAgICAgICAgICBiaXRzID0gcmwtPnRhYmxlX3ZsY1tybC0+bl1bMF07CisgICAgICAgICAgICAgICAgbGVuICA9IHJsLT50YWJsZV92bGNbcmwtPm5dWzFdOworICAgICAgICAgICAgICAgIGJpdHMgPSBiaXRzICogNCArIDI7CisgICAgICAgICAgICAgICAgbGVuICs9IDI7ICAgICAgICAgICAgICAgICAvLyBlc2MyCisgICAgICAgICAgICAgICAgcnVuMSA9IHJ1biAtIHJsLT5tYXhfcnVuW2xhc3RdW2xldmVsXSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKHJ1bjEgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlICAgPSBnZXRfcmxfaW5kZXgocmwsIGxhc3QsIHJ1bjEsIGxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgYml0cyA8PD0gcmwtPnRhYmxlX3ZsY1tjb2RlXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgbGVuICAgKz0gcmwtPnRhYmxlX3ZsY1tjb2RlXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgYml0cyAgKz0gcmwtPnRhYmxlX3ZsY1tjb2RlXVswXTsKKyAgICAgICAgICAgICAgICAgICAgYml0cyAgID0gYml0cyAqIDIgKyBzaWduOworICAgICAgICAgICAgICAgICAgICBsZW4rKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBybC0+biAmJiBsZW4gPCBsZW5fdGFiW2luZGV4XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYml0c190YWJbaW5kZXhdID0gYml0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbl90YWJbaW5kZXhdICA9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBFU0MzICovCisgICAgICAgICAgICAgICAgYml0cyA9IHJsLT50YWJsZV92bGNbcmwtPm5dWzBdOworICAgICAgICAgICAgICAgIGxlbiAgPSBybC0+dGFibGVfdmxjW3JsLT5uXVsxXTsKKyAgICAgICAgICAgICAgICBiaXRzID0gYml0cyAqIDQgKyAzOworICAgICAgICAgICAgICAgIGxlbiArPSAyOyAgICAgICAgICAgICAgICAgLy8gZXNjMworICAgICAgICAgICAgICAgIGJpdHMgPSBiaXRzICogMiArIGxhc3Q7CisgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICAgICAgYml0cyA9IGJpdHMgKiA2NCArIHJ1bjsKKyAgICAgICAgICAgICAgICBsZW4gKz0gNjsKKyAgICAgICAgICAgICAgICBiaXRzID0gYml0cyAqIDIgKyAxOworICAgICAgICAgICAgICAgIGxlbisrOyAgICAgICAgICAgICAgICAgICAgLy8gbWFya2VyCisgICAgICAgICAgICAgICAgYml0cyA9IGJpdHMgKiA0MDk2ICsgKHNsZXZlbCAmIDB4ZmZmKTsKKyAgICAgICAgICAgICAgICBsZW4gKz0gMTI7CisgICAgICAgICAgICAgICAgYml0cyA9IGJpdHMgKiAyICsgMTsKKyAgICAgICAgICAgICAgICBsZW4rKzsgICAgICAgICAgICAgICAgICAgIC8vIG1hcmtlcgorCisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IGxlbl90YWJbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgIGJpdHNfdGFiW2luZGV4XSA9IGJpdHM7CisgICAgICAgICAgICAgICAgICAgIGxlbl90YWJbaW5kZXhdICA9IGxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisgICAgc3RhdGljIGludCBkb25lID0gMDsKKworICAgIGlmIChhdmN0eC0+d2lkdGggPj0gKDE8PDEzKSB8fCBhdmN0eC0+aGVpZ2h0ID49ICgxPDwxMykpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkaW1lbnNpb25zIHRvbyBsYXJnZSBmb3IgTVBFRy00XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX21wdl9lbmNvZGVfaW5pdChhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICghZG9uZSkgeworICAgICAgICBkb25lID0gMTsKKworICAgICAgICBpbml0X3VuaV9kY190YWIoKTsKKworICAgICAgICBmZl9pbml0X3JsKCZmZl9tcGVnNF9ybF9pbnRyYSwgZmZfbXBlZzRfc3RhdGljX3JsX3RhYmxlX3N0b3JlWzBdKTsKKworICAgICAgICBpbml0X3VuaV9tcGVnNF9ybF90YWIoJmZmX21wZWc0X3JsX2ludHJhLCB1bmlfbXBlZzRfaW50cmFfcmxfYml0cywgdW5pX21wZWc0X2ludHJhX3JsX2xlbik7CisgICAgICAgIGluaXRfdW5pX21wZWc0X3JsX3RhYigmZmZfaDI2M19ybF9pbnRlciwgdW5pX21wZWc0X2ludGVyX3JsX2JpdHMsIHVuaV9tcGVnNF9pbnRlcl9ybF9sZW4pOworICAgIH0KKworICAgIHMtPm1pbl9xY29lZmYgICAgICAgICAgICAgICA9IC0yMDQ4OworICAgIHMtPm1heF9xY29lZmYgICAgICAgICAgICAgICA9IDIwNDc7CisgICAgcy0+aW50cmFfYWNfdmxjX2xlbmd0aCAgICAgID0gdW5pX21wZWc0X2ludHJhX3JsX2xlbjsKKyAgICBzLT5pbnRyYV9hY192bGNfbGFzdF9sZW5ndGggPSB1bmlfbXBlZzRfaW50cmFfcmxfbGVuICsgMTI4ICogNjQ7CisgICAgcy0+aW50ZXJfYWNfdmxjX2xlbmd0aCAgICAgID0gdW5pX21wZWc0X2ludGVyX3JsX2xlbjsKKyAgICBzLT5pbnRlcl9hY192bGNfbGFzdF9sZW5ndGggPSB1bmlfbXBlZzRfaW50ZXJfcmxfbGVuICsgMTI4ICogNjQ7CisgICAgcy0+bHVtYV9kY192bGNfbGVuZ3RoICAgICAgID0gdW5pX0RDdGFiX2x1bV9sZW47CisgICAgcy0+YWNfZXNjX2xlbmd0aCAgICAgICAgICAgID0gNyArIDIgKyAxICsgNiArIDEgKyAxMiArIDE7CisgICAgcy0+eV9kY19zY2FsZV90YWJsZSAgICAgICAgID0gZmZfbXBlZzRfeV9kY19zY2FsZV90YWJsZTsKKyAgICBzLT5jX2RjX3NjYWxlX3RhYmxlICAgICAgICAgPSBmZl9tcGVnNF9jX2RjX3NjYWxlX3RhYmxlOworCisgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSB7CisgICAgICAgIHMtPmF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2MoMTAyNCk7CisgICAgICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBzLT5hdmN0eC0+ZXh0cmFkYXRhLCAxMDI0KTsKKworICAgICAgICBpZiAoIShzLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfTVMpKQorICAgICAgICAgICAgbXBlZzRfZW5jb2RlX3Zpc3VhbF9vYmplY3RfaGVhZGVyKHMpOworICAgICAgICBtcGVnNF9lbmNvZGVfdm9sX2hlYWRlcihzLCAwLCAwKTsKKworLy8gICAgICAgICAgICBmZl9tcGVnNF9zdHVmZmluZygmcy0+cGIpOyA/CisgICAgICAgIGZsdXNoX3B1dF9iaXRzKCZzLT5wYik7CisgICAgICAgIHMtPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IChwdXRfYml0c19jb3VudCgmcy0+cGIpICsgNykgPj4gMzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfbXBlZzRfaW5pdF9wYXJ0aXRpb25zKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIHVpbnQ4X3QgKnN0YXJ0ID0gcHV0X2JpdHNfcHRyKCZzLT5wYik7CisgICAgdWludDhfdCAqZW5kICAgPSBzLT5wYi5idWZfZW5kOworICAgIGludCBzaXplICAgICAgID0gZW5kIC0gc3RhcnQ7CisgICAgaW50IHBiX3NpemUgICAgPSAoKChpbnRwdHJfdClzdGFydCArIHNpemUgLyAzKSAmICh+MykpIC0gKGludHB0cl90KXN0YXJ0OworICAgIGludCB0ZXhfc2l6ZSAgID0gKHNpemUgLSAyICogcGJfc2l6ZSkgJiAofjMpOworCisgICAgc2V0X3B1dF9iaXRzX2J1ZmZlcl9zaXplKCZzLT5wYiwgcGJfc2l6ZSk7CisgICAgaW5pdF9wdXRfYml0cygmcy0+dGV4X3BiLCBzdGFydCArIHBiX3NpemUsIHRleF9zaXplKTsKKyAgICBpbml0X3B1dF9iaXRzKCZzLT5wYjIsIHN0YXJ0ICsgcGJfc2l6ZSArIHRleF9zaXplLCBwYl9zaXplKTsKK30KKwordm9pZCBmZl9tcGVnNF9tZXJnZV9wYXJ0aXRpb25zKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGNvbnN0IGludCBwYjJfbGVuICAgID0gcHV0X2JpdHNfY291bnQoJnMtPnBiMik7CisgICAgY29uc3QgaW50IHRleF9wYl9sZW4gPSBwdXRfYml0c19jb3VudCgmcy0+dGV4X3BiKTsKKyAgICBjb25zdCBpbnQgYml0cyAgICAgICA9IHB1dF9iaXRzX2NvdW50KCZzLT5wYik7CisKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMTksIERDX01BUktFUik7CisgICAgICAgIHMtPm1pc2NfYml0cyAgKz0gMTkgKyBwYjJfbGVuICsgYml0cyAtIHMtPmxhc3RfYml0czsKKyAgICAgICAgcy0+aV90ZXhfYml0cyArPSB0ZXhfcGJfbGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMTcsIE1PVElPTl9NQVJLRVIpOworICAgICAgICBzLT5taXNjX2JpdHMgICs9IDE3ICsgcGIyX2xlbjsKKyAgICAgICAgcy0+bXZfYml0cyAgICArPSBiaXRzIC0gcy0+bGFzdF9iaXRzOworICAgICAgICBzLT5wX3RleF9iaXRzICs9IHRleF9wYl9sZW47CisgICAgfQorCisgICAgZmx1c2hfcHV0X2JpdHMoJnMtPnBiMik7CisgICAgZmx1c2hfcHV0X2JpdHMoJnMtPnRleF9wYik7CisKKyAgICBzZXRfcHV0X2JpdHNfYnVmZmVyX3NpemUoJnMtPnBiLCBzLT5wYjIuYnVmX2VuZCAtIHMtPnBiLmJ1Zik7CisgICAgYXZwcml2X2NvcHlfYml0cygmcy0+cGIsIHMtPnBiMi5idWYsIHBiMl9sZW4pOworICAgIGF2cHJpdl9jb3B5X2JpdHMoJnMtPnBiLCBzLT50ZXhfcGIuYnVmLCB0ZXhfcGJfbGVuKTsKKyAgICBzLT5sYXN0X2JpdHMgPSBwdXRfYml0c19jb3VudCgmcy0+cGIpOworfQorCit2b2lkIGZmX21wZWc0X2VuY29kZV92aWRlb19wYWNrZXRfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludCBtYl9udW1fYml0cyA9IGF2X2xvZzIocy0+bWJfbnVtIC0gMSkgKyAxOworCisgICAgcHV0X2JpdHMoJnMtPnBiLCBmZl9tcGVnNF9nZXRfdmlkZW9fcGFja2V0X3ByZWZpeF9sZW5ndGgocyksIDApOworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7CisKKyAgICBwdXRfYml0cygmcy0+cGIsIG1iX251bV9iaXRzLCBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3dpZHRoKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIHMtPnF1YW50X3ByZWNpc2lvbiwgcy0+cXNjYWxlKTsKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAvKiBubyBIRUMgKi8KK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTXBlZ0VuY0NvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiZGF0YV9wYXJ0aXRpb25pbmciLCAiVXNlIGRhdGEgcGFydGl0aW9uaW5nLiIsICAgICAgT0ZGU0VUKGRhdGFfcGFydGl0aW9uaW5nKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCisgICAgeyAiYWx0ZXJuYXRlX3NjYW4iLCAgICAiRW5hYmxlIGFsdGVybmF0ZSBzY2FudGFibGUuIiwgT0ZGU0VUKGFsdGVybmF0ZV9zY2FuKSwgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCisgICAgRkZfTVBWX0NPTU1PTl9PUFRTCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBtcGVnNGVuY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJNUEVHNCBlbmNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbXBlZzRfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTQgcGFydCAyIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZmZfbXB2X2VuY29kZV9waWN0dXJlLAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX21wdl9lbmNvZGVfZW5kLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeyBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfTk9ORSB9LAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9ERUxBWSB8IENPREVDX0NBUF9TTElDRV9USFJFQURTLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZtcGVnNGVuY19jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnX2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnX2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5MDU4MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdfZXIuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAibXBlZ19lci5oIgorCitzdGF0aWMgdm9pZCBzZXRfZXJwaWMoRVJQaWN0dXJlICpkc3QsIFBpY3R1cmUgKnNyYykKK3sKKyAgICBpbnQgaTsKKworICAgIG1lbXNldChkc3QsIDAsIHNpemVvZigqZHN0KSk7CisgICAgaWYgKCFzcmMpIHsKKyAgICAgICAgZHN0LT5mICA9IE5VTEw7CisgICAgICAgIGRzdC0+dGYgPSBOVUxMOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZHN0LT5mID0gc3JjLT5mOworICAgIGRzdC0+dGYgPSAmc3JjLT50ZjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgZHN0LT5tb3Rpb25fdmFsW2ldID0gc3JjLT5tb3Rpb25fdmFsW2ldOworICAgICAgICBkc3QtPnJlZl9pbmRleFtpXSA9IHNyYy0+cmVmX2luZGV4W2ldOworICAgIH0KKworICAgIGRzdC0+bWJfdHlwZSA9IHNyYy0+bWJfdHlwZTsKKyAgICBkc3QtPmZpZWxkX3BpY3R1cmUgPSBzcmMtPmZpZWxkX3BpY3R1cmU7Cit9CisKK3ZvaWQgZmZfbXBlZ19lcl9mcmFtZV9zdGFydChNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBFUkNvbnRleHQgKmVyID0gJnMtPmVyOworCisgICAgc2V0X2VycGljKCZlci0+Y3VyX3BpYywgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIpOworICAgIHNldF9lcnBpYygmZXItPm5leHRfcGljLCBzLT5uZXh0X3BpY3R1cmVfcHRyKTsKKyAgICBzZXRfZXJwaWMoJmVyLT5sYXN0X3BpYywgcy0+bGFzdF9waWN0dXJlX3B0cik7CisKKyAgICBlci0+cHBfdGltZSAgICAgICAgICAgPSBzLT5wcF90aW1lOworICAgIGVyLT5wYl90aW1lICAgICAgICAgICA9IHMtPnBiX3RpbWU7CisgICAgZXItPnF1YXJ0ZXJfc2FtcGxlICAgID0gcy0+cXVhcnRlcl9zYW1wbGU7CisgICAgZXItPnBhcnRpdGlvbmVkX2ZyYW1lID0gcy0+cGFydGl0aW9uZWRfZnJhbWU7CisKKyAgICBmZl9lcl9mcmFtZV9zdGFydChlcik7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnX2VyLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnX2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3NGZiYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdfZXIuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NUEVHX0VSX0gKKyNkZWZpbmUgQVZDT0RFQ19NUEVHX0VSX0gKKworI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorCit2b2lkIGZmX21wZWdfZXJfZnJhbWVfc3RhcnQoTXBlZ0VuY0NvbnRleHQgKnMpOworCisjZW5kaWYgLyogQVZDT0RFQ19NUEVHX0VSX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpby5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhNTI5OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpby5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBNUEVHIEF1ZGlvIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1QRUcgQXVkaW8gY29tbW9uIGNvZGUuCisgKi8KKworI2luY2x1ZGUgIm1wZWdhdWRpby5oIgorCisKKy8qIGJpdHJhdGUgaXMgaW4ga2IvcyAqLworaW50IGZmX21wYV9sMl9zZWxlY3RfdGFibGUoaW50IGJpdHJhdGUsIGludCBuYl9jaGFubmVscywgaW50IGZyZXEsIGludCBsc2YpCit7CisgICAgaW50IGNoX2JpdHJhdGUsIHRhYmxlOworCisgICAgY2hfYml0cmF0ZSA9IGJpdHJhdGUgLyBuYl9jaGFubmVsczsKKyAgICBpZiAoIWxzZikgeworICAgICAgICBpZiAoKGZyZXEgPT0gNDgwMDAgJiYgY2hfYml0cmF0ZSA+PSA1NikgfHwKKyAgICAgICAgICAgIChjaF9iaXRyYXRlID49IDU2ICYmIGNoX2JpdHJhdGUgPD0gODApKQorICAgICAgICAgICAgdGFibGUgPSAwOworICAgICAgICBlbHNlIGlmIChmcmVxICE9IDQ4MDAwICYmIGNoX2JpdHJhdGUgPj0gOTYpCisgICAgICAgICAgICB0YWJsZSA9IDE7CisgICAgICAgIGVsc2UgaWYgKGZyZXEgIT0gMzIwMDAgJiYgY2hfYml0cmF0ZSA8PSA0OCkKKyAgICAgICAgICAgIHRhYmxlID0gMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGFibGUgPSAzOworICAgIH0gZWxzZSB7CisgICAgICAgIHRhYmxlID0gNDsKKyAgICB9CisgICAgcmV0dXJuIHRhYmxlOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTkxYTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbXBlZyBhdWRpbyBkZWNsYXJhdGlvbnMgZm9yIGJvdGggZW5jb2RlciBhbmQgZGVjb2Rlci4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTVBFR0FVRElPX0gKKyNkZWZpbmUgQVZDT0RFQ19NUEVHQVVESU9fSAorCisjaWZuZGVmIFVTRV9GTE9BVFMKKyMgICBkZWZpbmUgVVNFX0ZMT0FUUyAwCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBtYXggZnJhbWUgc2l6ZSwgaW4gc2FtcGxlcyAqLworI2RlZmluZSBNUEFfRlJBTUVfU0laRSAxMTUyCisKKy8qIG1heCBjb21wcmVzc2VkIGZyYW1lIHNpemUgKi8KKyNkZWZpbmUgTVBBX01BWF9DT0RFRF9GUkFNRV9TSVpFIDE3OTIKKworI2RlZmluZSBNUEFfTUFYX0NIQU5ORUxTIDIKKworI2RlZmluZSBTQkxJTUlUIDMyIC8qIG51bWJlciBvZiBzdWJiYW5kcyAqLworCisjZGVmaW5lIE1QQV9TVEVSRU8gIDAKKyNkZWZpbmUgTVBBX0pTVEVSRU8gMQorI2RlZmluZSBNUEFfRFVBTCAgICAyCisjZGVmaW5lIE1QQV9NT05PICAgIDMKKworI2lmbmRlZiBGUkFDX0JJVFMKKyNkZWZpbmUgRlJBQ19CSVRTICAgMjMgICAvKiBmcmFjdGlvbmFsIGJpdHMgZm9yIHNiX3NhbXBsZXMgYW5kIGRjdCAqLworI2RlZmluZSBXRlJBQ19CSVRTICAxNiAgIC8qIGZyYWN0aW9uYWwgYml0cyBmb3Igd2luZG93ICovCisjZW5kaWYKKworI2RlZmluZSBJTURDVF9TQ0FMQVIgMS43NTkKKworI2RlZmluZSBGUkFDX09ORSAgICAoMSA8PCBGUkFDX0JJVFMpCisKKyNkZWZpbmUgRklYKGEpICAgKChpbnQpKChhKSAqIEZSQUNfT05FKSkKKworI2lmIFVTRV9GTE9BVFMKKyMgICBkZWZpbmUgSU5URkxPQVQgZmxvYXQKK3R5cGVkZWYgZmxvYXQgTVBBX0lOVDsKK3R5cGVkZWYgZmxvYXQgT1VUX0lOVDsKKyNlbGlmIEZSQUNfQklUUyA8PSAxNQorIyAgIGRlZmluZSBJTlRGTE9BVCBpbnQKK3R5cGVkZWYgaW50MTZfdCBNUEFfSU5UOwordHlwZWRlZiBpbnQxNl90IE9VVF9JTlQ7CisjZWxzZQorIyAgIGRlZmluZSBJTlRGTE9BVCBpbnQKK3R5cGVkZWYgaW50MzJfdCBNUEFfSU5UOwordHlwZWRlZiBpbnQxNl90IE9VVF9JTlQ7CisjZW5kaWYKKworaW50IGZmX21wYV9sMl9zZWxlY3RfdGFibGUoaW50IGJpdHJhdGUsIGludCBuYl9jaGFubmVscywgaW50IGZyZXEsIGludCBsc2YpOworCisjZW5kaWYgLyogQVZDT0RFQ19NUEVHQVVESU9fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvX3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZGJmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9fcGFyc2VyLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBNUEVHIEF1ZGlvIHBhcnNlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RlY2hlYWRlci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworCit0eXBlZGVmIHN0cnVjdCBNcGVnQXVkaW9QYXJzZUNvbnRleHQgeworICAgIFBhcnNlQ29udGV4dCBwYzsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKyAgICB1aW50MzJfdCBoZWFkZXI7CisgICAgaW50IGhlYWRlcl9jb3VudDsKKyAgICBpbnQgbm9fYml0cmF0ZTsKK30gTXBlZ0F1ZGlvUGFyc2VDb250ZXh0OworCisjZGVmaW5lIE1QQV9IRUFERVJfU0laRSA0CisKKy8qIGhlYWRlciArIGxheWVyICsgYml0cmF0ZSArIGZyZXEgKyBsc2YvbXBlZzI1ICovCisjZGVmaW5lIFNBTUVfSEVBREVSX01BU0sgXAorICAgKDB4ZmZlMDAwMDAgfCAoMyA8PCAxNykgfCAoMyA8PCAxMCkgfCAoMyA8PCAxOSkpCisKK3N0YXRpYyBpbnQgbXBlZ2F1ZGlvX3BhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIE1wZWdBdWRpb1BhcnNlQ29udGV4dCAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZzLT5wYzsKKyAgICB1aW50MzJfdCBzdGF0ZT0gcGMtPnN0YXRlOworICAgIGludCBpOworICAgIGludCBuZXh0PSBFTkRfTk9UX0ZPVU5EOworCisgICAgZm9yKGk9MDsgaTxidWZfc2l6ZTsgKXsKKyAgICAgICAgaWYocy0+ZnJhbWVfc2l6ZSl7CisgICAgICAgICAgICBpbnQgaW5jPSBGRk1JTihidWZfc2l6ZSAtIGksIHMtPmZyYW1lX3NpemUpOworICAgICAgICAgICAgaSArPSBpbmM7CisgICAgICAgICAgICBzLT5mcmFtZV9zaXplIC09IGluYzsKKyAgICAgICAgICAgIHN0YXRlID0gMDsKKworICAgICAgICAgICAgaWYoIXMtPmZyYW1lX3NpemUpeworICAgICAgICAgICAgICAgIG5leHQ9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgd2hpbGUoaTxidWZfc2l6ZSl7CisgICAgICAgICAgICAgICAgaW50IHJldCwgc3IsIGNoYW5uZWxzLCBiaXRfcmF0ZSwgZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgICAgICBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZDsKKworICAgICAgICAgICAgICAgIHN0YXRlPSAoc3RhdGU8PDgpICsgYnVmW2krK107CisKKyAgICAgICAgICAgICAgICByZXQgPSBhdnByaXZfbXBhX2RlY29kZV9oZWFkZXIyKHN0YXRlLCAmc3IsICZjaGFubmVscywgJmZyYW1lX3NpemUsICZiaXRfcmF0ZSwgJmNvZGVjX2lkKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgNCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDQpCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5oZWFkZXJfY291bnQgPSAtMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZGVyX3RocmVzaG9sZCA9IGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FICYmIGF2Y3R4LT5jb2RlY19pZCAhPSBjb2RlY19pZDsKKyAgICAgICAgICAgICAgICAgICAgaWYoKHN0YXRlJlNBTUVfSEVBREVSX01BU0spICE9IChzLT5oZWFkZXImU0FNRV9IRUFERVJfTUFTSykgJiYgcy0+aGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGVhZGVyX2NvdW50PSAtMzsKKyAgICAgICAgICAgICAgICAgICAgcy0+aGVhZGVyPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgcy0+aGVhZGVyX2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lX3NpemUgPSByZXQtNDsKKworICAgICAgICAgICAgICAgICAgICBpZiAocy0+aGVhZGVyX2NvdW50ID4gaGVhZGVyX3RocmVzaG9sZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlPSBzcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyAgID0gY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgICAgICBzMS0+ZHVyYXRpb24gICAgICA9IGZyYW1lX3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWNfaWQgICA9IGNvZGVjX2lkOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm5vX2JpdHJhdGUgfHwgIWF2Y3R4LT5iaXRfcmF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5vX2JpdHJhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSArPSAoYml0X3JhdGUgLSBhdmN0eC0+Yml0X3JhdGUpIC8gKHMtPmhlYWRlcl9jb3VudCAtIGhlYWRlcl90aHJlc2hvbGQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBjLT5zdGF0ZT0gc3RhdGU7CisgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUocGMsIG5leHQsICZidWYsICZidWZfc2l6ZSkgPCAwKSB7CisgICAgICAgICpwb3V0YnVmID0gTlVMTDsKKyAgICAgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisKKyAgICAqcG91dGJ1ZiA9IGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKKworQVZDb2RlY1BhcnNlciBmZl9tcGVnYXVkaW9fcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfTVAxLCBBVl9DT0RFQ19JRF9NUDIsIEFWX0NPREVDX0lEX01QMyB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnQXVkaW9QYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfcGFyc2UgICA9IG1wZWdhdWRpb19wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9fdGFibGVnZW4uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb190YWJsZWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzlkZTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9fdGFibGVnZW4uYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogR2VuZXJhdGUgYSBoZWFkZXIgZmlsZSBmb3IgaGFyZGNvZGVkIG1wZWdhdWRpb2RlYyB0YWJsZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2RlZmluZSBDT05GSUdfSEFSRENPREVEX1RBQkxFUyAwCisjaW5jbHVkZSAibXBlZ2F1ZGlvX3RhYmxlZ2VuLmgiCisjaW5jbHVkZSAidGFibGVwcmludC5oIgorCitpbnQgbWFpbih2b2lkKQoreworICAgIG1wZWdhdWRpb190YWJsZWluaXQoKTsKKworICAgIHdyaXRlX2ZpbGVoZWFkZXIoKTsKKworICAgIFdSSVRFX0FSUkFZKCJzdGF0aWMgY29uc3QiLCBpbnQ4X3QsIHRhYmxlXzRfM19leHApOworICAgIFdSSVRFX0FSUkFZKCJzdGF0aWMgY29uc3QiLCB1aW50MzJfdCwgdGFibGVfNF8zX3ZhbHVlKTsKKyAgICBXUklURV9BUlJBWSgic3RhdGljIGNvbnN0IiwgdWludDMyX3QsIGV4cF90YWJsZV9maXhlZCk7CisgICAgV1JJVEVfQVJSQVkoInN0YXRpYyBjb25zdCIsIGZsb2F0LCBleHBfdGFibGVfZmxvYXQpOworICAgIFdSSVRFXzJEX0FSUkFZKCJzdGF0aWMgY29uc3QiLCB1aW50MzJfdCwgZXhwdmFsX3RhYmxlX2ZpeGVkKTsKKyAgICBXUklURV8yRF9BUlJBWSgic3RhdGljIGNvbnN0IiwgZmxvYXQsIGV4cHZhbF90YWJsZV9mbG9hdCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb190YWJsZWdlbi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvX3RhYmxlZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiMmNkMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb190YWJsZWdlbi5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBIZWFkZXIgZmlsZSBmb3IgaGFyZGNvZGVkIG1wZWdhdWRpb2RlYyB0YWJsZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01QRUdBVURJT19UQUJMRUdFTl9ICisjZGVmaW5lIEFWQ09ERUNfTVBFR0FVRElPX1RBQkxFR0VOX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorCisjZGVmaW5lIFRBQkxFXzRfM19TSVpFICg4MTkxICsgMTYpKjQKKyNpZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUworI2RlZmluZSBtcGVnYXVkaW9fdGFibGVpbml0KCkKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWdhdWRpb190YWJsZXMuaCIKKyNlbHNlCitzdGF0aWMgaW50OF90ICAgdGFibGVfNF8zX2V4cFtUQUJMRV80XzNfU0laRV07CitzdGF0aWMgdWludDMyX3QgdGFibGVfNF8zX3ZhbHVlW1RBQkxFXzRfM19TSVpFXTsKK3N0YXRpYyB1aW50MzJfdCBleHBfdGFibGVfZml4ZWRbNTEyXTsKK3N0YXRpYyB1aW50MzJfdCBleHB2YWxfdGFibGVfZml4ZWRbNTEyXVsxNl07CitzdGF0aWMgZmxvYXQgZXhwX3RhYmxlX2Zsb2F0WzUxMl07CitzdGF0aWMgZmxvYXQgZXhwdmFsX3RhYmxlX2Zsb2F0WzUxMl1bMTZdOworCisjZGVmaW5lIEZSQUNfQklUUyAyMworI2RlZmluZSBJTURDVF9TQ0FMQVIgMS43NTkKKworc3RhdGljIGF2X2NvbGQgdm9pZCBtcGVnYXVkaW9fdGFibGVpbml0KHZvaWQpCit7CisgICAgaW50IGksIHZhbHVlLCBleHBvbmVudDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgVEFCTEVfNF8zX1NJWkU7IGkrKykgeworICAgICAgICBkb3VibGUgdmFsdWUgPSBpIC8gNDsKKyAgICAgICAgZG91YmxlIGYsIGZtOworICAgICAgICBpbnQgZSwgbTsKKyAgICAgICAgLyogY2JydGYoKSBpc24ndCBhdmFpbGFibGUgb24gYWxsIHN5c3RlbXMsIHNvIHdlIHVzZSBwb3dmKCkuICovCisgICAgICAgIGYgID0gdmFsdWUgLyBJTURDVF9TQ0FMQVIgKiBwb3codmFsdWUsIDEuMCAvIDMuMCkgKiBwb3coMiwgKGkgJiAzKSAqIDAuMjUpOworICAgICAgICBmbSA9IGZyZXhwKGYsICZlKTsKKyAgICAgICAgbSAgPSAodWludDMyX3QpKGZtICogKDFMTCA8PCAzMSkgKyAwLjUpOworICAgICAgICBlICs9IEZSQUNfQklUUyAtIDMxICsgNSAtIDEwMDsKKworICAgICAgICAvKiBub3JtYWxpemVkIHRvIEZSQUNfQklUUyAqLworICAgICAgICB0YWJsZV80XzNfdmFsdWVbaV0gPSAgbTsKKyAgICAgICAgdGFibGVfNF8zX2V4cFtpXSAgID0gLWU7CisgICAgfQorICAgIGZvciAoZXhwb25lbnQgPSAwOyBleHBvbmVudCA8IDUxMjsgZXhwb25lbnQrKykgeworICAgICAgICBmb3IgKHZhbHVlID0gMDsgdmFsdWUgPCAxNjsgdmFsdWUrKykgeworICAgICAgICAgICAgLyogY2JydGYoKSBpc24ndCBhdmFpbGFibGUgb24gYWxsIHN5c3RlbXMsIHNvIHdlIHVzZSBwb3dmKCkuICovCisgICAgICAgICAgICBkb3VibGUgZiA9IChkb3VibGUpdmFsdWUgKiBwb3codmFsdWUsIDEuMCAvIDMuMCkgKiBwb3coMiwgKGV4cG9uZW50IC0gNDAwKSAqIDAuMjUgKyBGUkFDX0JJVFMgKyA1KSAvIElNRENUX1NDQUxBUjsKKyAgICAgICAgICAgIC8qIGxscmludCgpIGlzbid0IGFsd2F5cyBhdmFpbGFibGUsIHNvIHJvdW5kIGFuZCBjYXN0IG1hbnVhbGx5LiAqLworICAgICAgICAgICAgZXhwdmFsX3RhYmxlX2ZpeGVkW2V4cG9uZW50XVt2YWx1ZV0gPSAobG9uZyBsb25nIGludCkgKGYgPCAweEZGRkZGRkZGID8gZmxvb3IoZiArIDAuNSkgOiAweEZGRkZGRkZGKTsKKyAgICAgICAgICAgIGV4cHZhbF90YWJsZV9mbG9hdFtleHBvbmVudF1bdmFsdWVdID0gZjsKKyAgICAgICAgfQorICAgICAgICBleHBfdGFibGVfZml4ZWRbZXhwb25lbnRdID0gZXhwdmFsX3RhYmxlX2ZpeGVkW2V4cG9uZW50XVsxXTsKKyAgICAgICAgZXhwX3RhYmxlX2Zsb2F0W2V4cG9uZW50XSA9IGV4cHZhbF90YWJsZV9mbG9hdFtleHBvbmVudF1bMV07CisgICAgfQorfQorI2VuZGlmIC8qIENPTkZJR19IQVJEQ09ERURfVEFCTEVTICovCisKKyNlbmRpZiAvKiBBVkNPREVDX01QRUdBVURJT19UQUJMRUdFTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9kYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2OTI4MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RhdGEuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIE1QRUcgQXVkaW8gY29tbW9uIHRhYmxlcworICogY29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBtcGVnIGF1ZGlvIGxheWVyIGNvbW1vbiB0YWJsZXMuCisgKi8KKworI2luY2x1ZGUgIm1wZWdhdWRpb2RhdGEuaCIKKworCitjb25zdCB1aW50MTZfdCBhdnByaXZfbXBhX2JpdHJhdGVfdGFiWzJdWzNdWzE1XSA9IHsKKyAgICB7IHswLCAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCB9LAorICAgICAgezAsIDMyLCA0OCwgNTYsICA2NCwgIDgwLCAgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0IH0sCisgICAgICB7MCwgMzIsIDQwLCA0OCwgIDU2LCAgNjQsICA4MCwgIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAgfSB9LAorICAgIHsgezAsIDMyLCA0OCwgNTYsICA2NCwgIDgwLCAgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2fSwKKyAgICAgIHswLCAgOCwgMTYsIDI0LCAgMzIsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsIDExMiwgMTI4LCAxNDQsIDE2MH0sCisgICAgICB7MCwgIDgsIDE2LCAyNCwgIDMyLCAgNDAsICA0OCwgIDU2LCAgNjQsICA4MCwgIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjB9CisgICAgfQorfTsKKworY29uc3QgdWludDE2X3QgYXZwcml2X21wYV9mcmVxX3RhYlszXSA9IHsgNDQxMDAsIDQ4MDAwLCAzMjAwMCB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGxheWVyIDIgdGFibGVzICovCisKK2NvbnN0IGludCBmZl9tcGFfc2JsaW1pdF90YWJsZVs1XSA9IHsgMjcgLCAzMCAsIDgsIDEyICwgMzAgfTsKKworY29uc3QgaW50IGZmX21wYV9xdWFudF9zdGVwc1sxN10gPSB7CisgICAgMywgICAgIDUsICAgIDcsICAgIDksICAgIDE1LAorICAgIDMxLCAgICA2MywgIDEyNywgIDI1NSwgICA1MTEsCisgICAgMTAyMywgIDIwNDcsIDQwOTUsIDgxOTEsIDE2MzgzLAorICAgIDMyNzY3LCA2NTUzNQorfTsKKworLyogd2UgdXNlIGEgbmVnYXRpdmUgdmFsdWUgaWYgZ3JvdXBlZCAqLworY29uc3QgaW50IGZmX21wYV9xdWFudF9iaXRzWzE3XSA9IHsKKyAgICAtNSwgIC03LCAgMywgLTEwLCA0LAorICAgICA1LCAgNiwgIDcsICA4LCAgOSwKKyAgICAxMCwgMTEsIDEyLCAxMywgMTQsCisgICAgMTUsIDE2Cit9OworCisvKiBlbmNvZGluZyB0YWJsZXMgd2hpY2ggZ2l2ZSB0aGUgcXVhbnRpemF0aW9uIGluZGV4LiBOb3RlIGhvdyBpdCBpcworICAgcG9zc2libGUgdG8gc3RvcmUgdGhlbSBlZmZpY2llbnRseSAhICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhbGxvY190YWJsZV8xW10gPSB7CisgNCwgIDAsICAyLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKyA0LCAgMCwgIDIsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LAorIDQsICAwLCAgMiwgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCisgNCwgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNiwKKyA0LCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE2LAorIDQsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTYsCisgNCwgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNiwKKyA0LCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE2LAorIDQsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTYsCisgNCwgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNiwKKyA0LCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDMsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIDE2LAorIDIsICAwLCAgMSwgMTYsCisgMiwgIDAsICAxLCAxNiwKKyAyLCAgMCwgIDEsIDE2LAorIDIsICAwLCAgMSwgMTYsCisgMiwgIDAsICAxLCAxNiwKKyAyLCAgMCwgIDEsIDE2LAorIDIsICAwLCAgMSwgMTYsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhbGxvY190YWJsZV8zW10gPSB7CisgNCwgIDAsICAxLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyA0LCAgMCwgIDEsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorIDMsICAwLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LAorIDMsICAwLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LAorIDMsICAwLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LAorIDMsICAwLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LAorIDMsICAwLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LAorIDMsICAwLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LAorIDMsICAwLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LAorIDMsICAwLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LAorIDMsICAwLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LAorIDMsICAwLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWxsb2NfdGFibGVfNFtdID0geworIDQsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsCisgNCwgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyA0LCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAorIDQsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsCisgMywgIDAsICAxLCAgMywgIDQsICA1LCAgNiwgIDcsCisgMywgIDAsICAxLCAgMywgIDQsICA1LCAgNiwgIDcsCisgMywgIDAsICAxLCAgMywgIDQsICA1LCAgNiwgIDcsCisgMywgIDAsICAxLCAgMywgIDQsICA1LCAgNiwgIDcsCisgMywgIDAsICAxLCAgMywgIDQsICA1LCAgNiwgIDcsCisgMywgIDAsICAxLCAgMywgIDQsICA1LCAgNiwgIDcsCisgMywgIDAsICAxLCAgMywgIDQsICA1LCAgNiwgIDcsCisgMiwgIDAsICAxLCAgMywKKyAyLCAgMCwgIDEsICAzLAorIDIsICAwLCAgMSwgIDMsCisgMiwgIDAsICAxLCAgMywKKyAyLCAgMCwgIDEsICAzLAorIDIsICAwLCAgMSwgIDMsCisgMiwgIDAsICAxLCAgMywKKyAyLCAgMCwgIDEsICAzLAorIDIsICAwLCAgMSwgIDMsCisgMiwgIDAsICAxLCAgMywKKyAyLCAgMCwgIDEsICAzLAorIDIsICAwLCAgMSwgIDMsCisgMiwgIDAsICAxLCAgMywKKyAyLCAgMCwgIDEsICAzLAorIDIsICAwLCAgMSwgIDMsCisgMiwgIDAsICAxLCAgMywKKyAyLCAgMCwgIDEsICAzLAorIDIsICAwLCAgMSwgIDMsCisgMiwgIDAsICAxLCAgMywKK307CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCBmZl9tcGFfYWxsb2NfdGFibGVzWzVdID0KK3sgYWxsb2NfdGFibGVfMSwgYWxsb2NfdGFibGVfMSwgYWxsb2NfdGFibGVfMywgYWxsb2NfdGFibGVfMywgYWxsb2NfdGFibGVfNCwgfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWEyNjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGF0YS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBNUEVHIEF1ZGlvIGNvbW1vbiB0YWJsZXMKKyAqIGNvcHlyaWdodCAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbXBlZyBhdWRpbyBsYXllciBjb21tb24gdGFibGVzLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NUEVHQVVESU9EQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19NUEVHQVVESU9EQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisKKyNkZWZpbmUgTU9ERV9FWFRfTVNfU1RFUkVPIDIKKyNkZWZpbmUgTU9ERV9FWFRfSV9TVEVSRU8gIDEKKworZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCB1aW50MTZfdCBhdnByaXZfbXBhX2JpdHJhdGVfdGFiWzJdWzNdWzE1XTsKK2V4dGVybiBhdl9leHBvcnQgY29uc3QgdWludDE2X3QgYXZwcml2X21wYV9mcmVxX3RhYlszXTsKK2V4dGVybiBjb25zdCBpbnQgZmZfbXBhX3NibGltaXRfdGFibGVbNV07CitleHRlcm4gY29uc3QgaW50IGZmX21wYV9xdWFudF9zdGVwc1sxN107CitleHRlcm4gY29uc3QgaW50IGZmX21wYV9xdWFudF9iaXRzWzE3XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgZmZfbXBhX2FsbG9jX3RhYmxlc1s1XTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTVBFR0FVRElPREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9kZWNfZml4ZWQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RlY19maXhlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNGM4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9kZWNfZml4ZWQuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIEZpeGVkLXBvaW50IE1QRUcgYXVkaW8gZGVjb2RlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorCisjZGVmaW5lIFVTRV9GTE9BVFMgMAorCisjaW5jbHVkZSAibXBlZ2F1ZGlvLmgiCisKKyNkZWZpbmUgU0hSKGEsYikgICAgICAgKChhKT4+KGIpKQorLyogV0FSTklORzogb25seSBjb3JyZWN0IGZvciBwb3NpdGl2ZSBudW1iZXJzICovCisjZGVmaW5lIEZJWFJfT0xEKGEpICAgICgoaW50KSgoYSkgKiBGUkFDX09ORSArIDAuNSkpCisjZGVmaW5lIEZJWFIoYSkgICAgICAgICgoaW50KSgoYSkgKiBGUkFDX09ORSArIDAuNSkpCisjZGVmaW5lIEZJWEhSKGEpICAgICAgICgoaW50KSgoYSkgKiAoMUxMPDwzMikgKyAwLjUpKQorI2RlZmluZSBNVUxIMyh4LCB5LCBzKSBNVUxIKChzKSooeCksIHkpCisjZGVmaW5lIE1VTEx4KHgsIHksIHMpIE1VTEwoeCx5LHMpCisjZGVmaW5lIFJFTkFNRShhKSAgICAgIGEgIyMgX2ZpeGVkCisjZGVmaW5lIE9VVF9GTVQgICBBVl9TQU1QTEVfRk1UX1MxNgorI2RlZmluZSBPVVRfRk1UX1AgQVZfU0FNUExFX0ZNVF9TMTZQCisKKyNpbmNsdWRlICJtcGVnYXVkaW9kZWNfdGVtcGxhdGUuYyIKKworI2lmIENPTkZJR19NUDFfREVDT0RFUgorQVZDb2RlYyBmZl9tcDFfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXAxIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVAxIChNUEVHIGF1ZGlvIGxheWVyIDEpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTVBBRGVjb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19NUDJfREVDT0RFUgorQVZDb2RlYyBmZl9tcDJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXAyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVAyIChNUEVHIGF1ZGlvIGxheWVyIDIpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QMiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTVBBRGVjb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19NUDNfREVDT0RFUgorQVZDb2RlYyBmZl9tcDNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXAzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVAzIChNUEVHIGF1ZGlvIGxheWVyIDMpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QMywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTVBBRGVjb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19NUDNBRFVfREVDT0RFUgorQVZDb2RlYyBmZl9tcDNhZHVfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXAzYWR1IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURVIChBcHBsaWNhdGlvbiBEYXRhIFVuaXQpIE1QMyAoTVBFRyBhdWRpbyBsYXllciAzKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDNBRFUsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1QQURlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZV9hZHUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfUzE2UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCisjaWYgQ09ORklHX01QM09ONF9ERUNPREVSCitBVkNvZGVjIGZmX21wM29uNF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcDNvbjQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUDNvbk1QNCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDNPTjQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1QM09uNERlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0X21wM29uNCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfY2xvc2VfbXAzb240LAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZV9tcDNvbjQsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaF9tcDNvbjQsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RlY19mbG9hdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjX2Zsb2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzMmM4MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RlY19mbG9hdC5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogRmxvYXQgTVBFRyBBdWRpbyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorCisjZGVmaW5lIFVTRV9GTE9BVFMgMQorCisjaW5jbHVkZSAibXBlZ2F1ZGlvLmgiCisKKyNkZWZpbmUgU0hSKGEsYikgICAgICAgKChhKSooMS4wZi8oMTw8KGIpKSkpCisjZGVmaW5lIEZJWFJfT0xEKGEpICAgICgoaW50KSgoYSkgKiBGUkFDX09ORSArIDAuNSkpCisjZGVmaW5lIEZJWFIoeCkgICAgICAgICgoZmxvYXQpKHgpKQorI2RlZmluZSBGSVhIUih4KSAgICAgICAoKGZsb2F0KSh4KSkKKyNkZWZpbmUgTVVMSDMoeCwgeSwgcykgKChzKSooeSkqKHgpKQorI2RlZmluZSBNVUxMeCh4LCB5LCBzKSAoKHkpKih4KSkKKyNkZWZpbmUgUkVOQU1FKGEpIGEgIyMgX2Zsb2F0CisjZGVmaW5lIE9VVF9GTVQgICBBVl9TQU1QTEVfRk1UX0ZMVAorI2RlZmluZSBPVVRfRk1UX1AgQVZfU0FNUExFX0ZNVF9GTFRQCisKKyNpbmNsdWRlICJtcGVnYXVkaW9kZWNfdGVtcGxhdGUuYyIKKworI2lmIENPTkZJR19NUDFGTE9BVF9ERUNPREVSCitBVkNvZGVjIGZmX21wMWZsb2F0X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wMWZsb2F0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVAxIChNUEVHIGF1ZGlvIGxheWVyIDEpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTVBBRGVjb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CisjZW5kaWYKKyNpZiBDT05GSUdfTVAyRkxPQVRfREVDT0RFUgorQVZDb2RlYyBmZl9tcDJmbG9hdF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcDJmbG9hdCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QMiAoTVBFRyBhdWRpbyBsYXllciAyKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1QQURlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCisjaWYgQ09ORklHX01QM0ZMT0FUX0RFQ09ERVIKK0FWQ29kZWMgZmZfbXAzZmxvYXRfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXAzZmxvYXQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUDMgKE1QRUcgYXVkaW8gbGF5ZXIgMykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVAzLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNUEFEZWNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19NUDNBRFVGTE9BVF9ERUNPREVSCitBVkNvZGVjIGZmX21wM2FkdWZsb2F0X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wM2FkdWZsb2F0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURVIChBcHBsaWNhdGlvbiBEYXRhIFVuaXQpIE1QMyAoTVBFRyBhdWRpbyBsYXllciAzKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDNBRFUsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1QQURlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWVfYWR1LAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19NUDNPTjRGTE9BVF9ERUNPREVSCitBVkNvZGVjIGZmX21wM29uNGZsb2F0X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wM29uNGZsb2F0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVAzb25NUDQiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVAzT040LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNUDNPbjREZWNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdF9tcDNvbjQsCisgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2Nsb3NlX21wM29uNCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWVfbXAzb240LAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2hfbXAzb240LAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9kZWNfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RlY190ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDA3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9kZWNfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDE5OTggQEAKKy8qCisgKiBNUEVHIEF1ZGlvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVBFRyBBdWRpbyBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9saWJtLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAibXBlZ2F1ZGlvZHNwLmgiCisKKy8qCisgKiBUT0RPOgorICogIC0gdGVzdCBsc2YgLyBtcGVnMjUgZXh0ZW5zaXZlbHkuCisgKi8KKworI2luY2x1ZGUgIm1wZWdhdWRpby5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RlY2hlYWRlci5oIgorCisjZGVmaW5lIEJBQ0tTVEVQX1NJWkUgNTEyCisjZGVmaW5lIEVYVFJBQllURVMgMjQKKyNkZWZpbmUgTEFTVF9CVUZfU0laRSAyICogQkFDS1NURVBfU0laRSArIEVYVFJBQllURVMKKworLyogbGF5ZXIgMyAiZ3JhbnVsZSIgKi8KK3R5cGVkZWYgc3RydWN0IEdyYW51bGVEZWYgeworICAgIHVpbnQ4X3Qgc2Nmc2k7CisgICAgaW50IHBhcnQyXzNfbGVuZ3RoOworICAgIGludCBiaWdfdmFsdWVzOworICAgIGludCBnbG9iYWxfZ2FpbjsKKyAgICBpbnQgc2NhbGVmYWNfY29tcHJlc3M7CisgICAgdWludDhfdCBibG9ja190eXBlOworICAgIHVpbnQ4X3Qgc3dpdGNoX3BvaW50OworICAgIGludCB0YWJsZV9zZWxlY3RbM107CisgICAgaW50IHN1YmJsb2NrX2dhaW5bM107CisgICAgdWludDhfdCBzY2FsZWZhY19zY2FsZTsKKyAgICB1aW50OF90IGNvdW50MXRhYmxlX3NlbGVjdDsKKyAgICBpbnQgcmVnaW9uX3NpemVbM107IC8qIG51bWJlciBvZiBodWZmbWFuIGNvZGVzIGluIGVhY2ggcmVnaW9uICovCisgICAgaW50IHByZWZsYWc7CisgICAgaW50IHNob3J0X3N0YXJ0LCBsb25nX2VuZDsgLyogbG9uZy9zaG9ydCBiYW5kIGluZGV4ZXMgKi8KKyAgICB1aW50OF90IHNjYWxlX2ZhY3RvcnNbNDBdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgSU5URkxPQVQsIHNiX2h5YnJpZClbU0JMSU1JVCAqIDE4XTsgLyogNTc2IHNhbXBsZXMgKi8KK30gR3JhbnVsZURlZjsKKwordHlwZWRlZiBzdHJ1Y3QgTVBBRGVjb2RlQ29udGV4dCB7CisgICAgTVBBX0RFQ09ERV9IRUFERVIKKyAgICB1aW50OF90IGxhc3RfYnVmW0xBU1RfQlVGX1NJWkVdOworICAgIGludCBsYXN0X2J1Zl9zaXplOworICAgIC8qIG5leHQgaGVhZGVyICh1c2VkIGluIGZyZWUgZm9ybWF0IHBhcnNpbmcpICovCisgICAgdWludDMyX3QgZnJlZV9mb3JtYXRfbmV4dF9oZWFkZXI7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBHZXRCaXRDb250ZXh0IGluX2diOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgTVBBX0lOVCwgc3ludGhfYnVmKVtNUEFfTUFYX0NIQU5ORUxTXVs1MTIgKiAyXTsKKyAgICBpbnQgc3ludGhfYnVmX29mZnNldFtNUEFfTUFYX0NIQU5ORUxTXTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIElOVEZMT0FULCBzYl9zYW1wbGVzKVtNUEFfTUFYX0NIQU5ORUxTXVszNl1bU0JMSU1JVF07CisgICAgSU5URkxPQVQgbWRjdF9idWZbTVBBX01BWF9DSEFOTkVMU11bU0JMSU1JVCAqIDE4XTsgLyogcHJldmlvdXMgc2FtcGxlcywgZm9yIGxheWVyIDMgTURDVCAqLworICAgIEdyYW51bGVEZWYgZ3JhbnVsZXNbMl1bMl07IC8qIFVzZWQgaW4gTGF5ZXIgMyAqLworICAgIGludCBhZHVfbW9kZTsgLy8vPCAwIGZvciBzdGFuZGFyZCBtcDMsIDEgZm9yIGFkdSBmb3JtYXR0ZWQgbXAzCisgICAgaW50IGRpdGhlcl9zdGF0ZTsKKyAgICBpbnQgZXJyX3JlY29nbml0aW9uOworICAgIEFWQ29kZWNDb250ZXh0KiBhdmN0eDsKKyAgICBNUEFEU1BDb250ZXh0IG1wYWRzcDsKKyAgICBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcDsKKyAgICBBVkZyYW1lICpmcmFtZTsKK30gTVBBRGVjb2RlQ29udGV4dDsKKworI2RlZmluZSBIRUFERVJfU0laRSA0CisKKyNpbmNsdWRlICJtcGVnYXVkaW9kYXRhLmgiCisjaW5jbHVkZSAibXBlZ2F1ZGlvZGVjdGFiLmgiCisKKy8qIHZsYyBzdHJ1Y3R1cmUgZm9yIGRlY29kaW5nIGxheWVyIDMgaHVmZm1hbiB0YWJsZXMgKi8KK3N0YXRpYyBWTEMgaHVmZl92bGNbMTZdOworc3RhdGljIFZMQ19UWVBFIGh1ZmZfdmxjX3RhYmxlc1sKKyAgICAwICsgMTI4ICsgMTI4ICsgMTI4ICsgMTMwICsgMTI4ICsgMTU0ICsgMTY2ICsKKyAgMTQyICsgMjA0ICsgMTkwICsgMTcwICsgNTQyICsgNDYwICsgNjYyICsgNDE0CisgIF1bMl07CitzdGF0aWMgY29uc3QgaW50IGh1ZmZfdmxjX3RhYmxlc19zaXplc1sxNl0gPSB7CisgICAgMCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEzMCwgIDEyOCwgIDE1NCwgIDE2NiwKKyAgMTQyLCAgMjA0LCAgMTkwLCAgMTcwLCAgNTQyLCAgNDYwLCAgNjYyLCAgNDE0Cit9Oworc3RhdGljIFZMQyBodWZmX3F1YWRfdmxjWzJdOworc3RhdGljIFZMQ19UWVBFICBodWZmX3F1YWRfdmxjX3RhYmxlc1sxMjgrMTZdWzJdOworc3RhdGljIGNvbnN0IGludCBodWZmX3F1YWRfdmxjX3RhYmxlc19zaXplc1syXSA9IHsgMTI4LCAxNiB9OworLyogY29tcHV0ZWQgZnJvbSBiYW5kX3NpemVfbG9uZyAqLworc3RhdGljIHVpbnQxNl90IGJhbmRfaW5kZXhfbG9uZ1s5XVsyM107CisjaW5jbHVkZSAibXBlZ2F1ZGlvX3RhYmxlZ2VuLmgiCisvKiBpbnRlbnNpdHkgc3RlcmVvIGNvZWYgdGFibGUgKi8KK3N0YXRpYyBJTlRGTE9BVCBpc190YWJsZVsyXVsxNl07CitzdGF0aWMgSU5URkxPQVQgaXNfdGFibGVfbHNmWzJdWzJdWzE2XTsKK3N0YXRpYyBJTlRGTE9BVCBjc2FfdGFibGVbOF1bNF07CisKK3N0YXRpYyBpbnQxNl90IGRpdmlzaW9uX3RhYjNbMTw8NiBdOworc3RhdGljIGludDE2X3QgZGl2aXNpb25fdGFiNVsxPDw4IF07CitzdGF0aWMgaW50MTZfdCBkaXZpc2lvbl90YWI5WzE8PDExXTsKKworc3RhdGljIGludDE2X3QgKiBjb25zdCBkaXZpc2lvbl90YWJzWzRdID0geworICAgIGRpdmlzaW9uX3RhYjMsIGRpdmlzaW9uX3RhYjUsIE5VTEwsIGRpdmlzaW9uX3RhYjkKK307CisKKy8qIGxvd2VyIDIgYml0czogbW9kdWxvIDMsIGhpZ2hlciBiaXRzOiBzaGlmdCAqLworc3RhdGljIHVpbnQxNl90IHNjYWxlX2ZhY3Rvcl9tb2RzaGlmdFs2NF07CisvKiBbaV1bal06ICAyXigtai8zKSAqIEZSQUNfT05FICogMl4oaSsyKSAvICgyXihpKzIpIC0gMSkgKi8KK3N0YXRpYyBpbnQzMl90IHNjYWxlX2ZhY3Rvcl9tdWx0WzE1XVszXTsKKy8qIG11bHQgdGFibGUgZm9yIGxheWVyIDIgZ3JvdXAgcXVhbnRpemF0aW9uICovCisKKyNkZWZpbmUgU0NBTEVfR0VOKHYpIFwKK3sgRklYUl9PTEQoMS4wICogKHYpKSwgRklYUl9PTEQoMC43OTM3MDA1MjU5ICogKHYpKSwgRklYUl9PTEQoMC42Mjk5NjA1MjQ5ICogKHYpKSB9CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IHNjYWxlX2ZhY3Rvcl9tdWx0MlszXVszXSA9IHsKKyAgICBTQ0FMRV9HRU4oNC4wIC8gMy4wKSwgLyogMyBzdGVwcyAqLworICAgIFNDQUxFX0dFTig0LjAgLyA1LjApLCAvKiA1IHN0ZXBzICovCisgICAgU0NBTEVfR0VOKDQuMCAvIDkuMCksIC8qIDkgc3RlcHMgKi8KK307CisKKy8qKgorICogQ29udmVydCByZWdpb24gb2Zmc2V0cyB0byByZWdpb24gc2l6ZXMgYW5kIHRydW5jYXRlCisgKiBzaXplIHRvIGJpZ192YWx1ZXMuCisgKi8KK3N0YXRpYyB2b2lkIHJlZ2lvbl9vZmZzZXQyc2l6ZShHcmFudWxlRGVmICpnKQoreworICAgIGludCBpLCBrLCBqID0gMDsKKyAgICBnLT5yZWdpb25fc2l6ZVsyXSA9IDU3NiAvIDI7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBrID0gRkZNSU4oZy0+cmVnaW9uX3NpemVbaV0sIGctPmJpZ192YWx1ZXMpOworICAgICAgICBnLT5yZWdpb25fc2l6ZVtpXSA9IGsgLSBqOworICAgICAgICBqID0gazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfc2hvcnRfcmVnaW9uKE1QQURlY29kZUNvbnRleHQgKnMsIEdyYW51bGVEZWYgKmcpCit7CisgICAgaWYgKGctPmJsb2NrX3R5cGUgPT0gMikgeworICAgICAgICBpZiAocy0+c2FtcGxlX3JhdGVfaW5kZXggIT0gOCkKKyAgICAgICAgICAgIGctPnJlZ2lvbl9zaXplWzBdID0gKDM2IC8gMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGctPnJlZ2lvbl9zaXplWzBdID0gKDcyIC8gMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPnNhbXBsZV9yYXRlX2luZGV4IDw9IDIpCisgICAgICAgICAgICBnLT5yZWdpb25fc2l6ZVswXSA9ICgzNiAvIDIpOworICAgICAgICBlbHNlIGlmIChzLT5zYW1wbGVfcmF0ZV9pbmRleCAhPSA4KQorICAgICAgICAgICAgZy0+cmVnaW9uX3NpemVbMF0gPSAoNTQgLyAyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZy0+cmVnaW9uX3NpemVbMF0gPSAoMTA4IC8gMik7CisgICAgfQorICAgIGctPnJlZ2lvbl9zaXplWzFdID0gKDU3NiAvIDIpOworfQorCitzdGF0aWMgdm9pZCBpbml0X2xvbmdfcmVnaW9uKE1QQURlY29kZUNvbnRleHQgKnMsIEdyYW51bGVEZWYgKmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYTEsIGludCByYTIpCit7CisgICAgaW50IGw7CisgICAgZy0+cmVnaW9uX3NpemVbMF0gPSBiYW5kX2luZGV4X2xvbmdbcy0+c2FtcGxlX3JhdGVfaW5kZXhdW3JhMSArIDFdID4+IDE7CisgICAgLyogc2hvdWxkIG5vdCBvdmVyZmxvdyAqLworICAgIGwgPSBGRk1JTihyYTEgKyByYTIgKyAyLCAyMik7CisgICAgZy0+cmVnaW9uX3NpemVbMV0gPSBiYW5kX2luZGV4X2xvbmdbcy0+c2FtcGxlX3JhdGVfaW5kZXhdWyAgICAgIGxdID4+IDE7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXB1dGVfYmFuZF9pbmRleGVzKE1QQURlY29kZUNvbnRleHQgKnMsIEdyYW51bGVEZWYgKmcpCit7CisgICAgaWYgKGctPmJsb2NrX3R5cGUgPT0gMikgeworICAgICAgICBpZiAoZy0+c3dpdGNoX3BvaW50KSB7CisgICAgICAgICAgICBpZihzLT5zYW1wbGVfcmF0ZV9pbmRleCA9PSA4KQorICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgInN3aXRjaCBwb2ludCBpbiA4a2h6Iik7CisgICAgICAgICAgICAvKiBpZiBzd2l0Y2hlZCBtb2RlLCB3ZSBoYW5kbGUgdGhlIDM2IGZpcnN0IHNhbXBsZXMgYXMKKyAgICAgICAgICAgICAgICBsb25nIGJsb2Nrcy4gIEZvciA4MDAwSHosIHdlIGhhbmRsZSB0aGUgNzIgZmlyc3QKKyAgICAgICAgICAgICAgICBleHBvbmVudHMgYXMgbG9uZyBibG9ja3MgKi8KKyAgICAgICAgICAgIGlmIChzLT5zYW1wbGVfcmF0ZV9pbmRleCA8PSAyKQorICAgICAgICAgICAgICAgIGctPmxvbmdfZW5kID0gODsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnLT5sb25nX2VuZCA9IDY7CisKKyAgICAgICAgICAgIGctPnNob3J0X3N0YXJ0ID0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGctPmxvbmdfZW5kICAgID0gMDsKKyAgICAgICAgICAgIGctPnNob3J0X3N0YXJ0ID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGctPnNob3J0X3N0YXJ0ID0gMTM7CisgICAgICAgIGctPmxvbmdfZW5kICAgID0gMjI7CisgICAgfQorfQorCisvKiBsYXllciAxIHVuc2NhbGluZyAqLworLyogbiA9IG51bWJlciBvZiBiaXRzIG9mIHRoZSBtYW50aXNzYSBtaW51cyAxICovCitzdGF0aWMgaW5saW5lIGludCBsMV91bnNjYWxlKGludCBuLCBpbnQgbWFudCwgaW50IHNjYWxlX2ZhY3RvcikKK3sKKyAgICBpbnQgc2hpZnQsIG1vZDsKKyAgICBpbnQ2NF90IHZhbDsKKworICAgIHNoaWZ0ICAgPSBzY2FsZV9mYWN0b3JfbW9kc2hpZnRbc2NhbGVfZmFjdG9yXTsKKyAgICBtb2QgICAgID0gc2hpZnQgJiAzOworICAgIHNoaWZ0ID4+PSAyOworICAgIHZhbCAgICAgPSBNVUw2NCgoaW50KShtYW50ICsgKC0xVSA8PCBuKSArIDEpLCBzY2FsZV9mYWN0b3JfbXVsdFtuLTFdW21vZF0pOworICAgIHNoaWZ0ICArPSBuOworICAgIC8qIE5PVEU6IGF0IHRoaXMgcG9pbnQsIDEgPD0gc2hpZnQgPj0gMjEgKyAxNSAqLworICAgIHJldHVybiAoaW50KSgodmFsICsgKDFMTCA8PCAoc2hpZnQgLSAxKSkpID4+IHNoaWZ0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJfdW5zY2FsZV9ncm91cChpbnQgc3RlcHMsIGludCBtYW50LCBpbnQgc2NhbGVfZmFjdG9yKQoreworICAgIGludCBzaGlmdCwgbW9kLCB2YWw7CisKKyAgICBzaGlmdCAgID0gc2NhbGVfZmFjdG9yX21vZHNoaWZ0W3NjYWxlX2ZhY3Rvcl07CisgICAgbW9kICAgICA9IHNoaWZ0ICYgMzsKKyAgICBzaGlmdCA+Pj0gMjsKKworICAgIHZhbCA9IChtYW50IC0gKHN0ZXBzID4+IDEpKSAqIHNjYWxlX2ZhY3Rvcl9tdWx0MltzdGVwcyA+PiAyXVttb2RdOworICAgIC8qIE5PVEU6IGF0IHRoaXMgcG9pbnQsIDAgPD0gc2hpZnQgPD0gMjEgKi8KKyAgICBpZiAoc2hpZnQgPiAwKQorICAgICAgICB2YWwgPSAodmFsICsgKDEgPDwgKHNoaWZ0IC0gMSkpKSA+PiBzaGlmdDsKKyAgICByZXR1cm4gdmFsOworfQorCisvKiBjb21wdXRlIHZhbHVlXig0LzMpICogMl4oZXhwb25lbnQvNCkuIEl0IG5vcm1hbGl6ZWQgdG8gRlJBQ19CSVRTICovCitzdGF0aWMgaW5saW5lIGludCBsM191bnNjYWxlKGludCB2YWx1ZSwgaW50IGV4cG9uZW50KQoreworICAgIHVuc2lnbmVkIGludCBtOworICAgIGludCBlOworCisgICAgZSAgPSB0YWJsZV80XzNfZXhwICBbNCAqIHZhbHVlICsgKGV4cG9uZW50ICYgMyldOworICAgIG0gID0gdGFibGVfNF8zX3ZhbHVlWzQgKiB2YWx1ZSArIChleHBvbmVudCAmIDMpXTsKKyAgICBlIC09IGV4cG9uZW50ID4+IDI7CisjaWZkZWYgREVCVUcKKyAgICBpZihlIDwgMSkKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAibDNfdW5zY2FsZTogZSBpcyAlZFxuIiwgZSk7CisjZW5kaWYKKyAgICBpZiAoZSA+IDMxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBtID0gKG0gKyAoMSA8PCAoZSAtIDEpKSkgPj4gZTsKKworICAgIHJldHVybiBtOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGRlY29kZV9pbml0X3N0YXRpYyh2b2lkKQoreworICAgIGludCBpLCBqLCBrOworICAgIGludCBvZmZzZXQ7CisKKyAgICAvKiBzY2FsZSBmYWN0b3JzIHRhYmxlIGZvciBsYXllciAxLzIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBpbnQgc2hpZnQsIG1vZDsKKyAgICAgICAgLyogMS4wIChpID0gMykgaXMgbm9ybWFsaXplZCB0byAyIF4gRlJBQ19CSVRTICovCisgICAgICAgIHNoaWZ0ID0gaSAvIDM7CisgICAgICAgIG1vZCAgID0gaSAlIDM7CisgICAgICAgIHNjYWxlX2ZhY3Rvcl9tb2RzaGlmdFtpXSA9IG1vZCB8IChzaGlmdCA8PCAyKTsKKyAgICB9CisKKyAgICAvKiBzY2FsZSBmYWN0b3IgbXVsdGlwbHkgZm9yIGxheWVyIDEgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgeworICAgICAgICBpbnQgbiwgbm9ybTsKKyAgICAgICAgbiA9IGkgKyAyOworICAgICAgICBub3JtID0gKChJTlQ2NF9DKDEpIDw8IG4pICogRlJBQ19PTkUpIC8gKCgxIDw8IG4pIC0gMSk7CisgICAgICAgIHNjYWxlX2ZhY3Rvcl9tdWx0W2ldWzBdID0gTVVMTHgobm9ybSwgRklYUigxLjAgICAgICAgICAgKiAyLjApLCBGUkFDX0JJVFMpOworICAgICAgICBzY2FsZV9mYWN0b3JfbXVsdFtpXVsxXSA9IE1VTEx4KG5vcm0sIEZJWFIoMC43OTM3MDA1MjU5ICogMi4wKSwgRlJBQ19CSVRTKTsKKyAgICAgICAgc2NhbGVfZmFjdG9yX211bHRbaV1bMl0gPSBNVUxMeChub3JtLCBGSVhSKDAuNjI5OTYwNTI0OSAqIDIuMCksIEZSQUNfQklUUyk7CisgICAgICAgIGF2X2Rsb2coTlVMTCwgIiVkOiBub3JtPSV4IHM9JXggJXggJXhcbiIsIGksIG5vcm0sCisgICAgICAgICAgICAgICAgc2NhbGVfZmFjdG9yX211bHRbaV1bMF0sCisgICAgICAgICAgICAgICAgc2NhbGVfZmFjdG9yX211bHRbaV1bMV0sCisgICAgICAgICAgICAgICAgc2NhbGVfZmFjdG9yX211bHRbaV1bMl0pOworICAgIH0KKworICAgIFJFTkFNRShmZl9tcGFfc3ludGhfaW5pdCkoUkVOQU1FKGZmX21wYV9zeW50aF93aW5kb3cpKTsKKworICAgIC8qIGh1ZmZtYW4gZGVjb2RlIHRhYmxlcyAqLworICAgIG9mZnNldCA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgY29uc3QgSHVmZlRhYmxlICpoID0gJm1wYV9odWZmX3RhYmxlc1tpXTsKKyAgICAgICAgaW50IHhzaXplLCB4LCB5OworICAgICAgICB1aW50OF90ICB0bXBfYml0cyBbNTEyXSA9IHsgMCB9OworICAgICAgICB1aW50MTZfdCB0bXBfY29kZXNbNTEyXSA9IHsgMCB9OworCisgICAgICAgIHhzaXplID0gaC0+eHNpemU7CisKKyAgICAgICAgaiA9IDA7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB4c2l6ZTsgeCsrKSB7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgeHNpemU7IHkrKykgeworICAgICAgICAgICAgICAgIHRtcF9iaXRzIFsoeCA8PCA1KSB8IHkgfCAoKHgmJnkpPDw0KV09IGgtPmJpdHMgW2ogIF07CisgICAgICAgICAgICAgICAgdG1wX2NvZGVzWyh4IDw8IDUpIHwgeSB8ICgoeCYmeSk8PDQpXT0gaC0+Y29kZXNbaisrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFhYWDogZmFpbCB0ZXN0ICovCisgICAgICAgIGh1ZmZfdmxjW2ldLnRhYmxlID0gaHVmZl92bGNfdGFibGVzK29mZnNldDsKKyAgICAgICAgaHVmZl92bGNbaV0udGFibGVfYWxsb2NhdGVkID0gaHVmZl92bGNfdGFibGVzX3NpemVzW2ldOworICAgICAgICBpbml0X3ZsYygmaHVmZl92bGNbaV0sIDcsIDUxMiwKKyAgICAgICAgICAgICAgICAgdG1wX2JpdHMsIDEsIDEsIHRtcF9jb2RlcywgMiwgMiwKKyAgICAgICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgICAgICBvZmZzZXQgKz0gaHVmZl92bGNfdGFibGVzX3NpemVzW2ldOworICAgIH0KKyAgICBhdl9hc3NlcnQwKG9mZnNldCA9PSBGRl9BUlJBWV9FTEVNUyhodWZmX3ZsY190YWJsZXMpKTsKKworICAgIG9mZnNldCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBodWZmX3F1YWRfdmxjW2ldLnRhYmxlID0gaHVmZl9xdWFkX3ZsY190YWJsZXMrb2Zmc2V0OworICAgICAgICBodWZmX3F1YWRfdmxjW2ldLnRhYmxlX2FsbG9jYXRlZCA9IGh1ZmZfcXVhZF92bGNfdGFibGVzX3NpemVzW2ldOworICAgICAgICBpbml0X3ZsYygmaHVmZl9xdWFkX3ZsY1tpXSwgaSA9PSAwID8gNyA6IDQsIDE2LAorICAgICAgICAgICAgICAgICBtcGFfcXVhZF9iaXRzW2ldLCAxLCAxLCBtcGFfcXVhZF9jb2Rlc1tpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgICAgICBvZmZzZXQgKz0gaHVmZl9xdWFkX3ZsY190YWJsZXNfc2l6ZXNbaV07CisgICAgfQorICAgIGF2X2Fzc2VydDAob2Zmc2V0ID09IEZGX0FSUkFZX0VMRU1TKGh1ZmZfcXVhZF92bGNfdGFibGVzKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisgICAgICAgIGsgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjI7IGorKykgeworICAgICAgICAgICAgYmFuZF9pbmRleF9sb25nW2ldW2pdID0gazsKKyAgICAgICAgICAgIGsgKz0gYmFuZF9zaXplX2xvbmdbaV1bal07CisgICAgICAgIH0KKyAgICAgICAgYmFuZF9pbmRleF9sb25nW2ldWzIyXSA9IGs7CisgICAgfQorCisgICAgLyogY29tcHV0ZSBuIF4gKDQvMykgYW5kIHN0b3JlIGl0IGluIG1hbnRpc3NhL2V4cCBmb3JtYXQgKi8KKworICAgIG1wZWdhdWRpb190YWJsZWluaXQoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaWYgKGZmX21wYV9xdWFudF9iaXRzW2ldIDwgMCkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8ICgxIDw8ICgtZmZfbXBhX3F1YW50X2JpdHNbaV0rMSkpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgdmFsMSwgdmFsMiwgdmFsMywgc3RlcHM7CisgICAgICAgICAgICAgICAgaW50IHZhbCA9IGo7CisgICAgICAgICAgICAgICAgc3RlcHMgICA9IGZmX21wYV9xdWFudF9zdGVwc1tpXTsKKyAgICAgICAgICAgICAgICB2YWwxICAgID0gdmFsICUgc3RlcHM7CisgICAgICAgICAgICAgICAgdmFsICAgIC89IHN0ZXBzOworICAgICAgICAgICAgICAgIHZhbDIgICAgPSB2YWwgJSBzdGVwczsKKyAgICAgICAgICAgICAgICB2YWwzICAgID0gdmFsIC8gc3RlcHM7CisgICAgICAgICAgICAgICAgZGl2aXNpb25fdGFic1tpXVtqXSA9IHZhbDEgKyAodmFsMiA8PCA0KSArICh2YWwzIDw8IDgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgICAgICAgIGZsb2F0IGY7CisgICAgICAgIElOVEZMT0FUIHY7CisgICAgICAgIGlmIChpICE9IDYpIHsKKyAgICAgICAgICAgIGYgPSB0YW4oKGRvdWJsZSlpICogTV9QSSAvIDEyLjApOworICAgICAgICAgICAgdiA9IEZJWFIoZiAvICgxLjAgKyBmKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ID0gRklYUigxLjApOworICAgICAgICB9CisgICAgICAgIGlzX3RhYmxlWzBdWyAgICBpXSA9IHY7CisgICAgICAgIGlzX3RhYmxlWzFdWzYgLSBpXSA9IHY7CisgICAgfQorICAgIC8qIGludmFsaWQgdmFsdWVzICovCisgICAgZm9yIChpID0gNzsgaSA8IDE2OyBpKyspCisgICAgICAgIGlzX3RhYmxlWzBdW2ldID0gaXNfdGFibGVbMV1baV0gPSAwLjA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBkb3VibGUgZjsKKyAgICAgICAgaW50IGUsIGs7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgZSA9IC0oaiArIDEpICogKChpICsgMSkgPj4gMSk7CisgICAgICAgICAgICBmID0gZXhwMihlIC8gNC4wKTsKKyAgICAgICAgICAgIGsgPSBpICYgMTsKKyAgICAgICAgICAgIGlzX3RhYmxlX2xzZltqXVtrIF4gMV1baV0gPSBGSVhSKGYpOworICAgICAgICAgICAgaXNfdGFibGVfbHNmW2pdW2sgICAgXVtpXSA9IEZJWFIoMS4wKTsKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgImlzX3RhYmxlX2xzZiAlZCAlZDogJWYgJWZcbiIsCisgICAgICAgICAgICAgICAgICAgIGksIGosIChmbG9hdCkgaXNfdGFibGVfbHNmW2pdWzBdW2ldLAorICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIGlzX3RhYmxlX2xzZltqXVsxXVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGZsb2F0IGNpLCBjcywgY2E7CisgICAgICAgIGNpID0gY2lfdGFibGVbaV07CisgICAgICAgIGNzID0gMS4wIC8gc3FydCgxLjAgKyBjaSAqIGNpKTsKKyAgICAgICAgY2EgPSBjcyAqIGNpOworI2lmICFVU0VfRkxPQVRTCisgICAgICAgIGNzYV90YWJsZVtpXVswXSA9IEZJWEhSKGNzLzQpOworICAgICAgICBjc2FfdGFibGVbaV1bMV0gPSBGSVhIUihjYS80KTsKKyAgICAgICAgY3NhX3RhYmxlW2ldWzJdID0gRklYSFIoY2EvNCkgKyBGSVhIUihjcy80KTsKKyAgICAgICAgY3NhX3RhYmxlW2ldWzNdID0gRklYSFIoY2EvNCkgLSBGSVhIUihjcy80KTsKKyNlbHNlCisgICAgICAgIGNzYV90YWJsZVtpXVswXSA9IGNzOworICAgICAgICBjc2FfdGFibGVbaV1bMV0gPSBjYTsKKyAgICAgICAgY3NhX3RhYmxlW2ldWzJdID0gY2EgKyBjczsKKyAgICAgICAgY3NhX3RhYmxlW2ldWzNdID0gY2EgLSBjczsKKyNlbmRpZgorICAgIH0KK30KKworI2lmIFVTRV9GTE9BVFMKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCkKK3sKKyAgICBNUEFEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdl9mcmVlcCgmcy0+ZmRzcCk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCkKK3sKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkX3RhYmxlcyA9IDA7CisgICAgTVBBRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoIWluaXRpYWxpemVkX3RhYmxlcykgeworICAgICAgICBkZWNvZGVfaW5pdF9zdGF0aWMoKTsKKyAgICAgICAgaW5pdGlhbGl6ZWRfdGFibGVzID0gMTsKKyAgICB9CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworCisgICAgcy0+ZmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCk7CisgICAgaWYgKCFzLT5mZHNwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZmZfbXBhZHNwX2luaXQoJnMtPm1wYWRzcCk7CisKKyAgICBpZiAoYXZjdHgtPnJlcXVlc3Rfc2FtcGxlX2ZtdCA9PSBPVVRfRk1UICYmCisgICAgICAgIGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUDNPTjQpCisgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gT1VUX0ZNVDsKKyAgICBlbHNlCisgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gT1VUX0ZNVF9QOworICAgIHMtPmVycl9yZWNvZ25pdGlvbiA9IGF2Y3R4LT5lcnJfcmVjb2duaXRpb247CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QM0FEVSkKKyAgICAgICAgcy0+YWR1X21vZGUgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQzMgRklYSFIoMC44NjYwMjU0MDM3ODQ0Mzg2NDY3Ni8yKQorI2RlZmluZSBDNCBGSVhIUigwLjcwNzEwNjc4MTE4NjU0NzUyNDM5LzIpIC8vMC41IC8gY29zKHBpKig5KS8zNikKKyNkZWZpbmUgQzUgRklYSFIoMC41MTc2MzgwOTAyMDUwNDE1MjQ2OS8yKSAvLzAuNSAvIGNvcyhwaSooNSkvMzYpCisjZGVmaW5lIEM2IEZJWEhSKDEuOTMxODUxNjUyNTc4MTM2NTczNDkvNCkgLy8wLjUgLyBjb3MocGkqKDE1KS8zNikKKworLyogMTIgcG9pbnRzIElNRENULiBXZSBjb21wdXRlIGl0ICJieSBoYW5kIiBieSBmYWN0b3JpemluZyBvYnZpb3VzCisgICBjYXNlcy4gKi8KK3N0YXRpYyB2b2lkIGltZGN0MTIoSU5URkxPQVQgKm91dCwgSU5URkxPQVQgKmluKQoreworICAgIElOVEZMT0FUIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIHQxLCB0MjsKKworICAgIGluMCAgPSBpblswKjNdOworICAgIGluMSAgPSBpblsxKjNdICsgaW5bMCozXTsKKyAgICBpbjIgID0gaW5bMiozXSArIGluWzEqM107CisgICAgaW4zICA9IGluWzMqM10gKyBpblsyKjNdOworICAgIGluNCAgPSBpbls0KjNdICsgaW5bMyozXTsKKyAgICBpbjUgID0gaW5bNSozXSArIGluWzQqM107CisgICAgaW41ICs9IGluMzsKKyAgICBpbjMgKz0gaW4xOworCisgICAgaW4yICA9IE1VTEgzKGluMiwgQzMsIDIpOworICAgIGluMyAgPSBNVUxIMyhpbjMsIEMzLCA0KTsKKworICAgIHQxICAgPSBpbjAgLSBpbjQ7CisgICAgdDIgICA9IE1VTEgzKGluMSAtIGluNSwgQzQsIDIpOworCisgICAgb3V0WyA3XSA9CisgICAgb3V0WzEwXSA9IHQxICsgdDI7CisgICAgb3V0WyAxXSA9CisgICAgb3V0WyA0XSA9IHQxIC0gdDI7CisKKyAgICBpbjAgICAgKz0gU0hSKGluNCwgMSk7CisgICAgaW40ICAgICA9IGluMCArIGluMjsKKyAgICBpbjUgICAgKz0gMippbjE7CisgICAgaW4xICAgICA9IE1VTEgzKGluNSArIGluMywgQzUsIDEpOworICAgIG91dFsgOF0gPQorICAgIG91dFsgOV0gPSBpbjQgKyBpbjE7CisgICAgb3V0WyAyXSA9CisgICAgb3V0WyAzXSA9IGluNCAtIGluMTsKKworICAgIGluMCAgICAtPSBpbjI7CisgICAgaW41ICAgICA9IE1VTEgzKGluNSAtIGluMywgQzYsIDIpOworICAgIG91dFsgMF0gPQorICAgIG91dFsgNV0gPSBpbjAgLSBpbjU7CisgICAgb3V0WyA2XSA9CisgICAgb3V0WzExXSA9IGluMCArIGluNTsKK30KKworLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgZGVjb2RlZCBmcmFtZXMgKi8KK3N0YXRpYyBpbnQgbXBfZGVjb2RlX2xheWVyMShNUEFEZWNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBib3VuZCwgaSwgdiwgbiwgY2gsIGosIG1hbnQ7CisgICAgdWludDhfdCBhbGxvY2F0aW9uW01QQV9NQVhfQ0hBTk5FTFNdW1NCTElNSVRdOworICAgIHVpbnQ4X3Qgc2NhbGVfZmFjdG9yc1tNUEFfTUFYX0NIQU5ORUxTXVtTQkxJTUlUXTsKKworICAgIGlmIChzLT5tb2RlID09IE1QQV9KU1RFUkVPKQorICAgICAgICBib3VuZCA9IChzLT5tb2RlX2V4dCArIDEpICogNDsKKyAgICBlbHNlCisgICAgICAgIGJvdW5kID0gU0JMSU1JVDsKKworICAgIC8qIGFsbG9jYXRpb24gYml0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBib3VuZDsgaSsrKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBhbGxvY2F0aW9uW2NoXVtpXSA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gYm91bmQ7IGkgPCBTQkxJTUlUOyBpKyspCisgICAgICAgIGFsbG9jYXRpb25bMF1baV0gPSBnZXRfYml0cygmcy0+Z2IsIDQpOworCisgICAgLyogc2NhbGUgZmFjdG9ycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBib3VuZDsgaSsrKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBpZiAoYWxsb2NhdGlvbltjaF1baV0pCisgICAgICAgICAgICAgICAgc2NhbGVfZmFjdG9yc1tjaF1baV0gPSBnZXRfYml0cygmcy0+Z2IsIDYpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IGJvdW5kOyBpIDwgU0JMSU1JVDsgaSsrKSB7CisgICAgICAgIGlmIChhbGxvY2F0aW9uWzBdW2ldKSB7CisgICAgICAgICAgICBzY2FsZV9mYWN0b3JzWzBdW2ldID0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsKKyAgICAgICAgICAgIHNjYWxlX2ZhY3RvcnNbMV1baV0gPSBnZXRfYml0cygmcy0+Z2IsIDYpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29tcHV0ZSBzYW1wbGVzICovCisgICAgZm9yIChqID0gMDsgaiA8IDEyOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJvdW5kOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgbiA9IGFsbG9jYXRpb25bY2hdW2ldOworICAgICAgICAgICAgICAgIGlmIChuKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbnQgPSBnZXRfYml0cygmcy0+Z2IsIG4gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGwxX3Vuc2NhbGUobiwgbWFudCwgc2NhbGVfZmFjdG9yc1tjaF1baV0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT5zYl9zYW1wbGVzW2NoXVtqXVtpXSA9IHY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gYm91bmQ7IGkgPCBTQkxJTUlUOyBpKyspIHsKKyAgICAgICAgICAgIG4gPSBhbGxvY2F0aW9uWzBdW2ldOworICAgICAgICAgICAgaWYgKG4pIHsKKyAgICAgICAgICAgICAgICBtYW50ID0gZ2V0X2JpdHMoJnMtPmdiLCBuICsgMSk7CisgICAgICAgICAgICAgICAgdiA9IGwxX3Vuc2NhbGUobiwgbWFudCwgc2NhbGVfZmFjdG9yc1swXVtpXSk7CisgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1swXVtqXVtpXSA9IHY7CisgICAgICAgICAgICAgICAgdiA9IGwxX3Vuc2NhbGUobiwgbWFudCwgc2NhbGVfZmFjdG9yc1sxXVtpXSk7CisgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1sxXVtqXVtpXSA9IHY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPnNiX3NhbXBsZXNbMF1bal1baV0gPSAwOworICAgICAgICAgICAgICAgIHMtPnNiX3NhbXBsZXNbMV1bal1baV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxMjsKK30KKworc3RhdGljIGludCBtcF9kZWNvZGVfbGF5ZXIyKE1QQURlY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IHNibGltaXQ7IC8qIG51bWJlciBvZiB1c2VkIHN1YmJhbmRzICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWxsb2NfdGFibGU7CisgICAgaW50IHRhYmxlLCBiaXRfYWxsb2NfYml0cywgaSwgaiwgY2gsIGJvdW5kLCB2OworICAgIHVuc2lnbmVkIGNoYXIgYml0X2FsbG9jW01QQV9NQVhfQ0hBTk5FTFNdW1NCTElNSVRdOworICAgIHVuc2lnbmVkIGNoYXIgc2NhbGVfY29kZVtNUEFfTUFYX0NIQU5ORUxTXVtTQkxJTUlUXTsKKyAgICB1bnNpZ25lZCBjaGFyIHNjYWxlX2ZhY3RvcnNbTVBBX01BWF9DSEFOTkVMU11bU0JMSU1JVF1bM10sICpzZjsKKyAgICBpbnQgc2NhbGUsIHFpbmRleCwgYml0cywgc3RlcHMsIGssIGwsIG0sIGI7CisKKyAgICAvKiBzZWxlY3QgZGVjb2RpbmcgdGFibGUgKi8KKyAgICB0YWJsZSA9IGZmX21wYV9sMl9zZWxlY3RfdGFibGUocy0+Yml0X3JhdGUgLyAxMDAwLCBzLT5uYl9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2FtcGxlX3JhdGUsIHMtPmxzZik7CisgICAgc2JsaW1pdCAgICAgPSBmZl9tcGFfc2JsaW1pdF90YWJsZVt0YWJsZV07CisgICAgYWxsb2NfdGFibGUgPSBmZl9tcGFfYWxsb2NfdGFibGVzW3RhYmxlXTsKKworICAgIGlmIChzLT5tb2RlID09IE1QQV9KU1RFUkVPKQorICAgICAgICBib3VuZCA9IChzLT5tb2RlX2V4dCArIDEpICogNDsKKyAgICBlbHNlCisgICAgICAgIGJvdW5kID0gc2JsaW1pdDsKKworICAgIGF2X2Rsb2cocy0+YXZjdHgsICJib3VuZD0lZCBzYmxpbWl0PSVkXG4iLCBib3VuZCwgc2JsaW1pdCk7CisKKyAgICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgICBpZiAoYm91bmQgPiBzYmxpbWl0KQorICAgICAgICBib3VuZCA9IHNibGltaXQ7CisKKyAgICAvKiBwYXJzZSBiaXQgYWxsb2NhdGlvbiAqLworICAgIGogPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBib3VuZDsgaSsrKSB7CisgICAgICAgIGJpdF9hbGxvY19iaXRzID0gYWxsb2NfdGFibGVbal07CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgYml0X2FsbG9jW2NoXVtpXSA9IGdldF9iaXRzKCZzLT5nYiwgYml0X2FsbG9jX2JpdHMpOworICAgICAgICBqICs9IDEgPDwgYml0X2FsbG9jX2JpdHM7CisgICAgfQorICAgIGZvciAoaSA9IGJvdW5kOyBpIDwgc2JsaW1pdDsgaSsrKSB7CisgICAgICAgIGJpdF9hbGxvY19iaXRzID0gYWxsb2NfdGFibGVbal07CisgICAgICAgIHYgPSBnZXRfYml0cygmcy0+Z2IsIGJpdF9hbGxvY19iaXRzKTsKKyAgICAgICAgYml0X2FsbG9jWzBdW2ldID0gdjsKKyAgICAgICAgYml0X2FsbG9jWzFdW2ldID0gdjsKKyAgICAgICAgaiArPSAxIDw8IGJpdF9hbGxvY19iaXRzOworICAgIH0KKworICAgIC8qIHNjYWxlIGNvZGVzICovCisgICAgZm9yIChpID0gMDsgaSA8IHNibGltaXQ7IGkrKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uYl9jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgaWYgKGJpdF9hbGxvY1tjaF1baV0pCisgICAgICAgICAgICAgICAgc2NhbGVfY29kZVtjaF1baV0gPSBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc2NhbGUgZmFjdG9ycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzYmxpbWl0OyBpKyspIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+bmJfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGlmIChiaXRfYWxsb2NbY2hdW2ldKSB7CisgICAgICAgICAgICAgICAgc2YgPSBzY2FsZV9mYWN0b3JzW2NoXVtpXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNjYWxlX2NvZGVbY2hdW2ldKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHNmWzBdID0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgc2ZbMV0gPSBnZXRfYml0cygmcy0+Z2IsIDYpOworICAgICAgICAgICAgICAgICAgICBzZlsyXSA9IGdldF9iaXRzKCZzLT5nYiwgNik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgc2ZbMF0gPSBnZXRfYml0cygmcy0+Z2IsIDYpOworICAgICAgICAgICAgICAgICAgICBzZlsxXSA9IHNmWzBdOworICAgICAgICAgICAgICAgICAgICBzZlsyXSA9IHNmWzBdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHNmWzBdID0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgc2ZbMl0gPSBnZXRfYml0cygmcy0+Z2IsIDYpOworICAgICAgICAgICAgICAgICAgICBzZlsxXSA9IHNmWzBdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIHNmWzBdID0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgc2ZbMl0gPSBnZXRfYml0cygmcy0+Z2IsIDYpOworICAgICAgICAgICAgICAgICAgICBzZlsxXSA9IHNmWzJdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzYW1wbGVzICovCisgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykgeworICAgICAgICBmb3IgKGwgPSAwOyBsIDwgMTI7IGwgKz0gMykgeworICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYm91bmQ7IGkrKykgeworICAgICAgICAgICAgICAgIGJpdF9hbGxvY19iaXRzID0gYWxsb2NfdGFibGVbal07CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+bmJfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYiA9IGJpdF9hbGxvY1tjaF1baV07CisgICAgICAgICAgICAgICAgICAgIGlmIChiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHNjYWxlX2ZhY3RvcnNbY2hdW2ldW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgcWluZGV4ID0gYWxsb2NfdGFibGVbaitiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgPSBmZl9tcGFfcXVhbnRfYml0c1txaW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgdmFsdWVzIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0X2JpdHMoJnMtPmdiLCAtYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIgPSBkaXZpc2lvbl90YWJzW3FpbmRleF1bdl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHMgID0gZmZfbXBhX3F1YW50X3N0ZXBzW3FpbmRleF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYl9zYW1wbGVzW2NoXVtrICogMTIgKyBsICsgMF1baV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMl91bnNjYWxlX2dyb3VwKHN0ZXBzLCAgdjIgICAgICAgJiAxNSwgc2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNiX3NhbXBsZXNbY2hdW2sgKiAxMiArIGwgKyAxXVtpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyX3Vuc2NhbGVfZ3JvdXAoc3RlcHMsICh2MiA+PiA0KSAmIDE1LCBzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1tjaF1bayAqIDEyICsgbCArIDJdW2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJfdW5zY2FsZV9ncm91cChzdGVwcywgIHYyID4+IDggICAgICAsIHNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IDM7IG0rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0X2JpdHMoJnMtPmdiLCBiaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGwxX3Vuc2NhbGUoYml0cyAtIDEsIHYsIHNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1tjaF1bayAqIDEyICsgbCArIG1dW2ldID0gdjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYl9zYW1wbGVzW2NoXVtrICogMTIgKyBsICsgMF1baV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1tjaF1bayAqIDEyICsgbCArIDFdW2ldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNiX3NhbXBsZXNbY2hdW2sgKiAxMiArIGwgKyAyXVtpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogbmV4dCBzdWJiYW5kIGluIGFsbG9jIHRhYmxlICovCisgICAgICAgICAgICAgICAgaiArPSAxIDw8IGJpdF9hbGxvY19iaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogWFhYOiBmaW5kIGEgd2F5IHRvIGF2b2lkIHRoaXMgZHVwbGljYXRpb24gb2YgY29kZSAqLworICAgICAgICAgICAgZm9yIChpID0gYm91bmQ7IGkgPCBzYmxpbWl0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBiaXRfYWxsb2NfYml0cyA9IGFsbG9jX3RhYmxlW2pdOworICAgICAgICAgICAgICAgIGIgPSBiaXRfYWxsb2NbMF1baV07CisgICAgICAgICAgICAgICAgaWYgKGIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1hbnQsIHNjYWxlMCwgc2NhbGUxOworICAgICAgICAgICAgICAgICAgICBzY2FsZTAgPSBzY2FsZV9mYWN0b3JzWzBdW2ldW2tdOworICAgICAgICAgICAgICAgICAgICBzY2FsZTEgPSBzY2FsZV9mYWN0b3JzWzFdW2ldW2tdOworICAgICAgICAgICAgICAgICAgICBxaW5kZXggPSBhbGxvY190YWJsZVtqK2JdOworICAgICAgICAgICAgICAgICAgICBiaXRzID0gZmZfbXBhX3F1YW50X2JpdHNbcWluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiAzIHZhbHVlcyBhdCB0aGUgc2FtZSB0aW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0X2JpdHMoJnMtPmdiLCAtYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGVwcyA9IGZmX21wYV9xdWFudF9zdGVwc1txaW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgbWFudCA9IHYgJSBzdGVwczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2IC8gc3RlcHM7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYl9zYW1wbGVzWzBdW2sgKiAxMiArIGwgKyAwXVtpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJfdW5zY2FsZV9ncm91cChzdGVwcywgbWFudCwgc2NhbGUwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNiX3NhbXBsZXNbMV1bayAqIDEyICsgbCArIDBdW2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMl91bnNjYWxlX2dyb3VwKHN0ZXBzLCBtYW50LCBzY2FsZTEpOworICAgICAgICAgICAgICAgICAgICAgICAgbWFudCA9IHYgJSBzdGVwczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2IC8gc3RlcHM7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYl9zYW1wbGVzWzBdW2sgKiAxMiArIGwgKyAxXVtpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJfdW5zY2FsZV9ncm91cChzdGVwcywgbWFudCwgc2NhbGUwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNiX3NhbXBsZXNbMV1bayAqIDEyICsgbCArIDFdW2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMl91bnNjYWxlX2dyb3VwKHN0ZXBzLCBtYW50LCBzY2FsZTEpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1swXVtrICogMTIgKyBsICsgMl1baV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyX3Vuc2NhbGVfZ3JvdXAoc3RlcHMsIHYsIHNjYWxlMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYl9zYW1wbGVzWzFdW2sgKiAxMiArIGwgKyAyXVtpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJfdW5zY2FsZV9ncm91cChzdGVwcywgdiwgc2NhbGUxKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCAzOyBtKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW50ID0gZ2V0X2JpdHMoJnMtPmdiLCBiaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYl9zYW1wbGVzWzBdW2sgKiAxMiArIGwgKyBtXVtpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwxX3Vuc2NhbGUoYml0cyAtIDEsIG1hbnQsIHNjYWxlMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1sxXVtrICogMTIgKyBsICsgbV1baV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMV91bnNjYWxlKGJpdHMgLSAxLCBtYW50LCBzY2FsZTEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1swXVtrICogMTIgKyBsICsgMF1baV0gPSAwOworICAgICAgICAgICAgICAgICAgICBzLT5zYl9zYW1wbGVzWzBdW2sgKiAxMiArIGwgKyAxXVtpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPnNiX3NhbXBsZXNbMF1bayAqIDEyICsgbCArIDJdW2ldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1sxXVtrICogMTIgKyBsICsgMF1baV0gPSAwOworICAgICAgICAgICAgICAgICAgICBzLT5zYl9zYW1wbGVzWzFdW2sgKiAxMiArIGwgKyAxXVtpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPnNiX3NhbXBsZXNbMV1bayAqIDEyICsgbCArIDJdW2ldID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogbmV4dCBzdWJiYW5kIGluIGFsbG9jIHRhYmxlICovCisgICAgICAgICAgICAgICAgaiArPSAxIDw8IGJpdF9hbGxvY19iaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZmlsbCByZW1haW5pbmcgc2FtcGxlcyB0byB6ZXJvICovCisgICAgICAgICAgICBmb3IgKGkgPSBzYmxpbWl0OyBpIDwgU0JMSU1JVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+bmJfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1tjaF1bayAqIDEyICsgbCArIDBdW2ldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1tjaF1bayAqIDEyICsgbCArIDFdW2ldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+c2Jfc2FtcGxlc1tjaF1bayAqIDEyICsgbCArIDJdW2ldID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDMgKiAxMjsKK30KKworI2RlZmluZSBTUExJVChkc3Qsc2YsbikgICAgICAgICAgICAgXAorICAgIGlmIChuID09IDMpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgbSA9IChzZiAqIDE3MSkgPj4gOTsgICAgXAorICAgICAgICBkc3QgICA9IHNmIC0gMyAqIG07ICAgICAgICAgXAorICAgICAgICBzZiAgICA9IG07ICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAobiA9PSA0KSB7ICAgICAgICAgICAgXAorICAgICAgICBkc3QgID0gc2YgJiAzOyAgICAgICAgICAgICAgXAorICAgICAgICBzZiA+Pj0gMjsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAobiA9PSA1KSB7ICAgICAgICAgICAgXAorICAgICAgICBpbnQgbSA9IChzZiAqIDIwNSkgPj4gMTA7ICAgXAorICAgICAgICBkc3QgICA9IHNmIC0gNSAqIG07ICAgICAgICAgXAorICAgICAgICBzZiAgICA9IG07ICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAobiA9PSA2KSB7ICAgICAgICAgICAgXAorICAgICAgICBpbnQgbSA9IChzZiAqIDE3MSkgPj4gMTA7ICAgXAorICAgICAgICBkc3QgICA9IHNmIC0gNiAqIG07ICAgICAgICAgXAorICAgICAgICBzZiAgICA9IG07ICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3QgPSAwOyAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBsc2Zfc2ZfZXhwYW5kKGludCAqc2xlbiwgaW50IHNmLCBpbnQgbjEsIGludCBuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbjMpCit7CisgICAgU1BMSVQoc2xlblszXSwgc2YsIG4zKQorICAgIFNQTElUKHNsZW5bMl0sIHNmLCBuMikKKyAgICBTUExJVChzbGVuWzFdLCBzZiwgbjEpCisgICAgc2xlblswXSA9IHNmOworfQorCitzdGF0aWMgdm9pZCBleHBvbmVudHNfZnJvbV9zY2FsZV9mYWN0b3JzKE1QQURlY29kZUNvbnRleHQgKnMsIEdyYW51bGVEZWYgKmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmV4cG9uZW50cykKK3sKKyAgICBjb25zdCB1aW50OF90ICpic3RhYiwgKnByZXRhYjsKKyAgICBpbnQgbGVuLCBpLCBqLCBrLCBsLCB2MCwgc2hpZnQsIGdhaW4sIGdhaW5zWzNdOworICAgIGludDE2X3QgKmV4cF9wdHI7CisKKyAgICBleHBfcHRyID0gZXhwb25lbnRzOworICAgIGdhaW4gICAgPSBnLT5nbG9iYWxfZ2FpbiAtIDIxMDsKKyAgICBzaGlmdCAgID0gZy0+c2NhbGVmYWNfc2NhbGUgKyAxOworCisgICAgYnN0YWIgID0gYmFuZF9zaXplX2xvbmdbcy0+c2FtcGxlX3JhdGVfaW5kZXhdOworICAgIHByZXRhYiA9IG1wYV9wcmV0YWJbZy0+cHJlZmxhZ107CisgICAgZm9yIChpID0gMDsgaSA8IGctPmxvbmdfZW5kOyBpKyspIHsKKyAgICAgICAgdjAgPSBnYWluIC0gKChnLT5zY2FsZV9mYWN0b3JzW2ldICsgcHJldGFiW2ldKSA8PCBzaGlmdCkgKyA0MDA7CisgICAgICAgIGxlbiA9IGJzdGFiW2ldOworICAgICAgICBmb3IgKGogPSBsZW47IGogPiAwOyBqLS0pCisgICAgICAgICAgICAqZXhwX3B0cisrID0gdjA7CisgICAgfQorCisgICAgaWYgKGctPnNob3J0X3N0YXJ0IDwgMTMpIHsKKyAgICAgICAgYnN0YWIgICAgPSBiYW5kX3NpemVfc2hvcnRbcy0+c2FtcGxlX3JhdGVfaW5kZXhdOworICAgICAgICBnYWluc1swXSA9IGdhaW4gLSAoZy0+c3ViYmxvY2tfZ2FpblswXSA8PCAzKTsKKyAgICAgICAgZ2FpbnNbMV0gPSBnYWluIC0gKGctPnN1YmJsb2NrX2dhaW5bMV0gPDwgMyk7CisgICAgICAgIGdhaW5zWzJdID0gZ2FpbiAtIChnLT5zdWJibG9ja19nYWluWzJdIDw8IDMpOworICAgICAgICBrICAgICAgICA9IGctPmxvbmdfZW5kOworICAgICAgICBmb3IgKGkgPSBnLT5zaG9ydF9zdGFydDsgaSA8IDEzOyBpKyspIHsKKyAgICAgICAgICAgIGxlbiA9IGJzdGFiW2ldOworICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IDM7IGwrKykgeworICAgICAgICAgICAgICAgIHYwID0gZ2FpbnNbbF0gLSAoZy0+c2NhbGVfZmFjdG9yc1trKytdIDw8IHNoaWZ0KSArIDQwMDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSBsZW47IGogPiAwOyBqLS0pCisgICAgICAgICAgICAgICAgICAgICpleHBfcHRyKysgPSB2MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyogaGFuZGxlIG4gPSAwIHRvbyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X2JpdHN6KEdldEJpdENvbnRleHQgKnMsIGludCBuKQoreworICAgIHJldHVybiBuID8gZ2V0X2JpdHMocywgbikgOiAwOworfQorCisKK3N0YXRpYyB2b2lkIHN3aXRjaF9idWZmZXIoTVBBRGVjb2RlQ29udGV4dCAqcywgaW50ICpwb3MsIGludCAqZW5kX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmRfcG9zMikKK3sKKyAgICBpZiAocy0+aW5fZ2IuYnVmZmVyICYmICpwb3MgPj0gcy0+Z2Iuc2l6ZV9pbl9iaXRzKSB7CisgICAgICAgIHMtPmdiICAgICAgICAgICA9IHMtPmluX2diOworICAgICAgICBzLT5pbl9nYi5idWZmZXIgPSBOVUxMOworICAgICAgICBhdl9hc3NlcnQyKChnZXRfYml0c19jb3VudCgmcy0+Z2IpICYgNykgPT0gMCk7CisgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgKnBvcyAtICplbmRfcG9zKTsKKyAgICAgICAgKmVuZF9wb3MyID0KKyAgICAgICAgKmVuZF9wb3MgID0gKmVuZF9wb3MyICsgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSAtICpwb3M7CisgICAgICAgICpwb3MgICAgICA9IGdldF9iaXRzX2NvdW50KCZzLT5nYik7CisgICAgfQorfQorCisvKiBGb2xsb3dpbmcgaXMgYSBvcHRpbWl6ZWQgY29kZSBmb3IKKyAgICAgICAgICAgIElOVEZMT0FUIHYgPSAqc3JjCisgICAgICAgICAgICBpZihnZXRfYml0czEoJnMtPmdiKSkKKyAgICAgICAgICAgICAgICB2ID0gLXY7CisgICAgICAgICAgICAqZHN0ID0gdjsKKyovCisjaWYgVVNFX0ZMT0FUUworI2RlZmluZSBSRUFEX0ZMSVBfU0lHTihkc3Qsc3JjKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ID0gQVZfUk4zMkEoc3JjKSBeIChnZXRfYml0czEoJnMtPmdiKSA8PCAzMSk7ICBcCisgICAgQVZfV04zMkEoZHN0LCB2KTsKKyNlbHNlCisjZGVmaW5lIFJFQURfRkxJUF9TSUdOKGRzdCxzcmMpICAgICBcCisgICAgdiAgICAgID0gLWdldF9iaXRzMSgmcy0+Z2IpOyAgICBcCisgICAgKihkc3QpID0gKCooc3JjKSBeIHYpIC0gdjsKKyNlbmRpZgorCitzdGF0aWMgaW50IGh1ZmZtYW5fZGVjb2RlKE1QQURlY29kZUNvbnRleHQgKnMsIEdyYW51bGVEZWYgKmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmV4cG9uZW50cywgaW50IGVuZF9wb3MyKQoreworICAgIGludCBzX2luZGV4OworICAgIGludCBpOworICAgIGludCBsYXN0X3BvcywgYml0c19sZWZ0OworICAgIFZMQyAqdmxjOworICAgIGludCBlbmRfcG9zID0gRkZNSU4oZW5kX3BvczIsIHMtPmdiLnNpemVfaW5fYml0cyk7CisKKyAgICAvKiBsb3cgZnJlcXVlbmNpZXMgKGNhbGxlZCBiaWcgdmFsdWVzKSAqLworICAgIHNfaW5kZXggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaW50IGosIGssIGwsIGxpbmJpdHM7CisgICAgICAgIGogPSBnLT5yZWdpb25fc2l6ZVtpXTsKKyAgICAgICAgaWYgKGogPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvKiBzZWxlY3QgdmxjIHRhYmxlICovCisgICAgICAgIGsgICAgICAgPSBnLT50YWJsZV9zZWxlY3RbaV07CisgICAgICAgIGwgICAgICAgPSBtcGFfaHVmZl9kYXRhW2tdWzBdOworICAgICAgICBsaW5iaXRzID0gbXBhX2h1ZmZfZGF0YVtrXVsxXTsKKyAgICAgICAgdmxjICAgICA9ICZodWZmX3ZsY1tsXTsKKworICAgICAgICBpZiAoIWwpIHsKKyAgICAgICAgICAgIG1lbXNldCgmZy0+c2JfaHlicmlkW3NfaW5kZXhdLCAwLCBzaXplb2YoKmctPnNiX2h5YnJpZCkgKiAyICogaik7CisgICAgICAgICAgICBzX2luZGV4ICs9IDIgKiBqOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiByZWFkIGh1ZmZjb2RlIGFuZCBjb21wdXRlIGVhY2ggY291cGxlICovCisgICAgICAgIGZvciAoOyBqID4gMDsgai0tKSB7CisgICAgICAgICAgICBpbnQgZXhwb25lbnQsIHgsIHk7CisgICAgICAgICAgICBpbnQgdjsKKyAgICAgICAgICAgIGludCBwb3MgPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpOworCisgICAgICAgICAgICBpZiAocG9zID49IGVuZF9wb3MpeworICAgICAgICAgICAgICAgIHN3aXRjaF9idWZmZXIocywgJnBvcywgJmVuZF9wb3MsICZlbmRfcG9zMik7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBlbmRfcG9zKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHkgPSBnZXRfdmxjMigmcy0+Z2IsIHZsYy0+dGFibGUsIDcsIDMpOworCisgICAgICAgICAgICBpZiAoIXkpIHsKKyAgICAgICAgICAgICAgICBnLT5zYl9oeWJyaWRbc19pbmRleCAgXSA9CisgICAgICAgICAgICAgICAgZy0+c2JfaHlicmlkW3NfaW5kZXgrMV0gPSAwOworICAgICAgICAgICAgICAgIHNfaW5kZXggKz0gMjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXhwb25lbnQ9IGV4cG9uZW50c1tzX2luZGV4XTsKKworICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgInJlZ2lvbj0lZCBuPSVkIHg9JWQgeT0lZCBleHA9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGksIGctPnJlZ2lvbl9zaXplW2ldIC0gaiwgeCwgeSwgZXhwb25lbnQpOworICAgICAgICAgICAgaWYgKHkgJiAxNikgeworICAgICAgICAgICAgICAgIHggPSB5ID4+IDU7CisgICAgICAgICAgICAgICAgeSA9IHkgJiAweDBmOworICAgICAgICAgICAgICAgIGlmICh4IDwgMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgUkVBRF9GTElQX1NJR04oZy0+c2JfaHlicmlkICsgc19pbmRleCwgUkVOQU1FKGV4cHZhbF90YWJsZSlbZXhwb25lbnRdICsgeCkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4ICs9IGdldF9iaXRzeigmcy0+Z2IsIGxpbmJpdHMpOworICAgICAgICAgICAgICAgICAgICB2ICA9IGwzX3Vuc2NhbGUoeCwgZXhwb25lbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gLXY7CisgICAgICAgICAgICAgICAgICAgIGctPnNiX2h5YnJpZFtzX2luZGV4XSA9IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh5IDwgMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgUkVBRF9GTElQX1NJR04oZy0+c2JfaHlicmlkICsgc19pbmRleCArIDEsIFJFTkFNRShleHB2YWxfdGFibGUpW2V4cG9uZW50XSArIHkpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeSArPSBnZXRfYml0c3ooJnMtPmdiLCBsaW5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgdiAgPSBsM191bnNjYWxlKHksIGV4cG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IC12OworICAgICAgICAgICAgICAgICAgICBnLT5zYl9oeWJyaWRbc19pbmRleCsxXSA9IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB4ID0geSA+PiA1OworICAgICAgICAgICAgICAgIHkgPSB5ICYgMHgwZjsKKyAgICAgICAgICAgICAgICB4ICs9IHk7CisgICAgICAgICAgICAgICAgaWYgKHggPCAxNSkgeworICAgICAgICAgICAgICAgICAgICBSRUFEX0ZMSVBfU0lHTihnLT5zYl9oeWJyaWQgKyBzX2luZGV4ICsgISF5LCBSRU5BTUUoZXhwdmFsX3RhYmxlKVtleHBvbmVudF0gKyB4KQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHggKz0gZ2V0X2JpdHN6KCZzLT5nYiwgbGluYml0cyk7CisgICAgICAgICAgICAgICAgICAgIHYgID0gbDNfdW5zY2FsZSh4LCBleHBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAtdjsKKyAgICAgICAgICAgICAgICAgICAgZy0+c2JfaHlicmlkW3NfaW5kZXgrISF5XSA9IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGctPnNiX2h5YnJpZFtzX2luZGV4ICsgIXldID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNfaW5kZXggKz0gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGhpZ2ggZnJlcXVlbmNpZXMgKi8KKyAgICB2bGMgPSAmaHVmZl9xdWFkX3ZsY1tnLT5jb3VudDF0YWJsZV9zZWxlY3RdOworICAgIGxhc3RfcG9zID0gMDsKKyAgICB3aGlsZSAoc19pbmRleCA8PSA1NzIpIHsKKyAgICAgICAgaW50IHBvcywgY29kZTsKKyAgICAgICAgcG9zID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICAgICAgaWYgKHBvcyA+PSBlbmRfcG9zKSB7CisgICAgICAgICAgICBpZiAocG9zID4gZW5kX3BvczIgJiYgbGFzdF9wb3MpIHsKKyAgICAgICAgICAgICAgICAvKiBzb21lIGVuY29kZXJzIGdlbmVyYXRlIGFuIGluY29ycmVjdCBzaXplIGZvciB0aGlzCisgICAgICAgICAgICAgICAgICAgcGFydC4gV2UgbXVzdCBnbyBiYWNrIGludG8gdGhlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICBzX2luZGV4IC09IDQ7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCBsYXN0X3BvcyAtIHBvcyk7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm92ZXJyZWFkLCBza2lwICVkIGVuZGRpc3RzOiAlZCAlZFxuIiwgbGFzdF9wb3MgLSBwb3MsIGVuZF9wb3MtcG9zLCBlbmRfcG9zMi1wb3MpOworICAgICAgICAgICAgICAgIGlmKHMtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9CSVRTVFJFQU18QVZfRUZfQ09NUExJQU5UKSkKKyAgICAgICAgICAgICAgICAgICAgc19pbmRleD0wOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoX2J1ZmZlcihzLCAmcG9zLCAmZW5kX3BvcywgJmVuZF9wb3MyKTsKKyAgICAgICAgICAgIGlmIChwb3MgPj0gZW5kX3BvcykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBsYXN0X3BvcyA9IHBvczsKKworICAgICAgICBjb2RlID0gZ2V0X3ZsYzIoJnMtPmdiLCB2bGMtPnRhYmxlLCB2bGMtPmJpdHMsIDEpOworICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAidD0lZCBjb2RlPSVkXG4iLCBnLT5jb3VudDF0YWJsZV9zZWxlY3QsIGNvZGUpOworICAgICAgICBnLT5zYl9oeWJyaWRbc19pbmRleCswXSA9CisgICAgICAgIGctPnNiX2h5YnJpZFtzX2luZGV4KzFdID0KKyAgICAgICAgZy0+c2JfaHlicmlkW3NfaW5kZXgrMl0gPQorICAgICAgICBnLT5zYl9oeWJyaWRbc19pbmRleCszXSA9IDA7CisgICAgICAgIHdoaWxlIChjb2RlKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGlkeHRhYlsxNl0gPSB7IDMsMywyLDIsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAgfTsKKyAgICAgICAgICAgIGludCB2OworICAgICAgICAgICAgaW50IHBvcyA9IHNfaW5kZXggKyBpZHh0YWJbY29kZV07CisgICAgICAgICAgICBjb2RlICAgXj0gOCA+PiBpZHh0YWJbY29kZV07CisgICAgICAgICAgICBSRUFEX0ZMSVBfU0lHTihnLT5zYl9oeWJyaWQgKyBwb3MsIFJFTkFNRShleHBfdGFibGUpK2V4cG9uZW50c1twb3NdKQorICAgICAgICB9CisgICAgICAgIHNfaW5kZXggKz0gNDsKKyAgICB9CisgICAgLyogc2tpcCBleHRlbnNpb24gYml0cyAqLworICAgIGJpdHNfbGVmdCA9IGVuZF9wb3MyIC0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICBpZiAoYml0c19sZWZ0IDwgMCAmJiAocy0+ZXJyX3JlY29nbml0aW9uICYgKEFWX0VGX0JVRkZFUnxBVl9FRl9DT01QTElBTlQpKSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImJpdHNfbGVmdD0lZFxuIiwgYml0c19sZWZ0KTsKKyAgICAgICAgc19pbmRleD0wOworICAgIH0gZWxzZSBpZiAoYml0c19sZWZ0ID4gMCAmJiAocy0+ZXJyX3JlY29nbml0aW9uICYgKEFWX0VGX0JVRkZFUnxBVl9FRl9BR0dSRVNTSVZFKSkpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJiaXRzX2xlZnQ9JWRcbiIsIGJpdHNfbGVmdCk7CisgICAgICAgIHNfaW5kZXggPSAwOworICAgIH0KKyAgICBtZW1zZXQoJmctPnNiX2h5YnJpZFtzX2luZGV4XSwgMCwgc2l6ZW9mKCpnLT5zYl9oeWJyaWQpICogKDU3NiAtIHNfaW5kZXgpKTsKKyAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIGJpdHNfbGVmdCk7CisKKyAgICBpID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICBzd2l0Y2hfYnVmZmVyKHMsICZpLCAmZW5kX3BvcywgJmVuZF9wb3MyKTsKKworICAgIHJldHVybiAwOworfQorCisvKiBSZW9yZGVyIHNob3J0IGJsb2NrcyBmcm9tIGJpdHN0cmVhbSBvcmRlciB0byBpbnRlcmxlYXZlZCBvcmRlci4gSXQKKyAgIHdvdWxkIGJlIGZhc3RlciB0byBkbyBpdCBpbiBwYXJzaW5nLCBidXQgdGhlIGNvZGUgd291bGQgYmUgZmFyIG1vcmUKKyAgIGNvbXBsaWNhdGVkICovCitzdGF0aWMgdm9pZCByZW9yZGVyX2Jsb2NrKE1QQURlY29kZUNvbnRleHQgKnMsIEdyYW51bGVEZWYgKmcpCit7CisgICAgaW50IGksIGosIGxlbjsKKyAgICBJTlRGTE9BVCAqcHRyLCAqZHN0LCAqcHRyMTsKKyAgICBJTlRGTE9BVCB0bXBbNTc2XTsKKworICAgIGlmIChnLT5ibG9ja190eXBlICE9IDIpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChnLT5zd2l0Y2hfcG9pbnQpIHsKKyAgICAgICAgaWYgKHMtPnNhbXBsZV9yYXRlX2luZGV4ICE9IDgpCisgICAgICAgICAgICBwdHIgPSBnLT5zYl9oeWJyaWQgKyAzNjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHRyID0gZy0+c2JfaHlicmlkICsgNzI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRyID0gZy0+c2JfaHlicmlkOworICAgIH0KKworICAgIGZvciAoaSA9IGctPnNob3J0X3N0YXJ0OyBpIDwgMTM7IGkrKykgeworICAgICAgICBsZW4gID0gYmFuZF9zaXplX3Nob3J0W3MtPnNhbXBsZV9yYXRlX2luZGV4XVtpXTsKKyAgICAgICAgcHRyMSA9IHB0cjsKKyAgICAgICAgZHN0ICA9IHRtcDsKKyAgICAgICAgZm9yIChqID0gbGVuOyBqID4gMDsgai0tKSB7CisgICAgICAgICAgICAqZHN0KysgPSBwdHJbMCpsZW5dOworICAgICAgICAgICAgKmRzdCsrID0gcHRyWzEqbGVuXTsKKyAgICAgICAgICAgICpkc3QrKyA9IHB0clsyKmxlbl07CisgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgfQorICAgICAgICBwdHIgKz0gMiAqIGxlbjsKKyAgICAgICAgbWVtY3B5KHB0cjEsIHRtcCwgbGVuICogMyAqIHNpemVvZigqcHRyMSkpOworICAgIH0KK30KKworI2RlZmluZSBJU1FSVDIgRklYUigwLjcwNzEwNjc4MTE4NjU0NzUyNDQwKQorCitzdGF0aWMgdm9pZCBjb21wdXRlX3N0ZXJlbyhNUEFEZWNvZGVDb250ZXh0ICpzLCBHcmFudWxlRGVmICpnMCwgR3JhbnVsZURlZiAqZzEpCit7CisgICAgaW50IGksIGosIGssIGw7CisgICAgaW50IHNmX21heCwgc2YsIGxlbiwgbm9uX3plcm9fZm91bmQ7CisgICAgSU5URkxPQVQgKCppc190YWIpWzE2XSwgKnRhYjAsICp0YWIxLCB0bXAwLCB0bXAxLCB2MSwgdjI7CisgICAgaW50IG5vbl96ZXJvX2ZvdW5kX3Nob3J0WzNdOworCisgICAgLyogaW50ZW5zaXR5IHN0ZXJlbyAqLworICAgIGlmIChzLT5tb2RlX2V4dCAmIE1PREVfRVhUX0lfU1RFUkVPKSB7CisgICAgICAgIGlmICghcy0+bHNmKSB7CisgICAgICAgICAgICBpc190YWIgPSBpc190YWJsZTsKKyAgICAgICAgICAgIHNmX21heCA9IDc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpc190YWIgPSBpc190YWJsZV9sc2ZbZzEtPnNjYWxlZmFjX2NvbXByZXNzICYgMV07CisgICAgICAgICAgICBzZl9tYXggPSAxNjsKKyAgICAgICAgfQorCisgICAgICAgIHRhYjAgPSBnMC0+c2JfaHlicmlkICsgNTc2OworICAgICAgICB0YWIxID0gZzEtPnNiX2h5YnJpZCArIDU3NjsKKworICAgICAgICBub25femVyb19mb3VuZF9zaG9ydFswXSA9IDA7CisgICAgICAgIG5vbl96ZXJvX2ZvdW5kX3Nob3J0WzFdID0gMDsKKyAgICAgICAgbm9uX3plcm9fZm91bmRfc2hvcnRbMl0gPSAwOworICAgICAgICBrID0gKDEzIC0gZzEtPnNob3J0X3N0YXJ0KSAqIDMgKyBnMS0+bG9uZ19lbmQgLSAzOworICAgICAgICBmb3IgKGkgPSAxMjsgaSA+PSBnMS0+c2hvcnRfc3RhcnQ7IGktLSkgeworICAgICAgICAgICAgLyogZm9yIGxhc3QgYmFuZCwgdXNlIHByZXZpb3VzIHNjYWxlIGZhY3RvciAqLworICAgICAgICAgICAgaWYgKGkgIT0gMTEpCisgICAgICAgICAgICAgICAgayAtPSAzOworICAgICAgICAgICAgbGVuID0gYmFuZF9zaXplX3Nob3J0W3MtPnNhbXBsZV9yYXRlX2luZGV4XVtpXTsKKyAgICAgICAgICAgIGZvciAobCA9IDI7IGwgPj0gMDsgbC0tKSB7CisgICAgICAgICAgICAgICAgdGFiMCAtPSBsZW47CisgICAgICAgICAgICAgICAgdGFiMSAtPSBsZW47CisgICAgICAgICAgICAgICAgaWYgKCFub25femVyb19mb3VuZF9zaG9ydFtsXSkgeworICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0IGlmIG5vbiB6ZXJvIGJhbmQuIGlmIHNvLCBzdG9wIGRvaW5nIGktc3RlcmVvICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYjFbal0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl96ZXJvX2ZvdW5kX3Nob3J0W2xdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZiA9IGcxLT5zY2FsZV9mYWN0b3JzW2sgKyBsXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNmID49IHNmX21heCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmQxOworCisgICAgICAgICAgICAgICAgICAgIHYxID0gaXNfdGFiWzBdW3NmXTsKKyAgICAgICAgICAgICAgICAgICAgdjIgPSBpc190YWJbMV1bc2ZdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDAgICAgPSB0YWIwW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgdGFiMFtqXSA9IE1VTEx4KHRtcDAsIHYxLCBGUkFDX0JJVFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGFiMVtqXSA9IE1VTEx4KHRtcDAsIHYyLCBGUkFDX0JJVFMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKK2ZvdW5kMToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm1vZGVfZXh0ICYgTU9ERV9FWFRfTVNfU1RFUkVPKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb3dlciBwYXJ0IG9mIHRoZSBzcGVjdHJ1bSA6IGRvIG1zIHN0ZXJlbworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCAgICA9IHRhYjBbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMSAgICA9IHRhYjFbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiMFtqXSA9IE1VTEx4KHRtcDAgKyB0bXAxLCBJU1FSVDIsIEZSQUNfQklUUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiMVtqXSA9IE1VTEx4KHRtcDAgLSB0bXAxLCBJU1FSVDIsIEZSQUNfQklUUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBub25femVyb19mb3VuZCA9IG5vbl96ZXJvX2ZvdW5kX3Nob3J0WzBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBub25femVyb19mb3VuZF9zaG9ydFsxXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX3plcm9fZm91bmRfc2hvcnRbMl07CisKKyAgICAgICAgZm9yIChpID0gZzEtPmxvbmdfZW5kIC0gMTtpID49IDA7aS0tKSB7CisgICAgICAgICAgICBsZW4gICA9IGJhbmRfc2l6ZV9sb25nW3MtPnNhbXBsZV9yYXRlX2luZGV4XVtpXTsKKyAgICAgICAgICAgIHRhYjAgLT0gbGVuOworICAgICAgICAgICAgdGFiMSAtPSBsZW47CisgICAgICAgICAgICAvKiB0ZXN0IGlmIG5vbiB6ZXJvIGJhbmQuIGlmIHNvLCBzdG9wIGRvaW5nIGktc3RlcmVvICovCisgICAgICAgICAgICBpZiAoIW5vbl96ZXJvX2ZvdW5kKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWIxW2pdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbl96ZXJvX2ZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmQyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGZvciBsYXN0IGJhbmQsIHVzZSBwcmV2aW91cyBzY2FsZSBmYWN0b3IgKi8KKyAgICAgICAgICAgICAgICBrICA9IChpID09IDIxKSA/IDIwIDogaTsKKyAgICAgICAgICAgICAgICBzZiA9IGcxLT5zY2FsZV9mYWN0b3JzW2tdOworICAgICAgICAgICAgICAgIGlmIChzZiA+PSBzZl9tYXgpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmQyOworICAgICAgICAgICAgICAgIHYxID0gaXNfdGFiWzBdW3NmXTsKKyAgICAgICAgICAgICAgICB2MiA9IGlzX3RhYlsxXVtzZl07CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcDAgICAgPSB0YWIwW2pdOworICAgICAgICAgICAgICAgICAgICB0YWIwW2pdID0gTVVMTHgodG1wMCwgdjEsIEZSQUNfQklUUyk7CisgICAgICAgICAgICAgICAgICAgIHRhYjFbal0gPSBNVUxMeCh0bXAwLCB2MiwgRlJBQ19CSVRTKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworZm91bmQyOgorICAgICAgICAgICAgICAgIGlmIChzLT5tb2RlX2V4dCAmIE1PREVfRVhUX01TX1NURVJFTykgeworICAgICAgICAgICAgICAgICAgICAvKiBsb3dlciBwYXJ0IG9mIHRoZSBzcGVjdHJ1bSA6IGRvIG1zIHN0ZXJlbworICAgICAgICAgICAgICAgICAgICAgICBpZiBlbmFibGVkICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCAgICA9IHRhYjBbal07CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAxICAgID0gdGFiMVtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYjBbal0gPSBNVUxMeCh0bXAwICsgdG1wMSwgSVNRUlQyLCBGUkFDX0JJVFMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGFiMVtqXSA9IE1VTEx4KHRtcDAgLSB0bXAxLCBJU1FSVDIsIEZSQUNfQklUUyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHMtPm1vZGVfZXh0ICYgTU9ERV9FWFRfTVNfU1RFUkVPKSB7CisgICAgICAgIC8qIG1zIHN0ZXJlbyBPTkxZICovCisgICAgICAgIC8qIE5PVEU6IHRoZSAxL3NxcnQoMikgbm9ybWFsaXphdGlvbiBmYWN0b3IgaXMgaW5jbHVkZWQgaW4gdGhlCisgICAgICAgICAgIGdsb2JhbCBnYWluICovCisjaWYgVVNFX0ZMT0FUUworICAgICAgIHMtPmZkc3AtPmJ1dHRlcmZsaWVzX2Zsb2F0KGcwLT5zYl9oeWJyaWQsIGcxLT5zYl9oeWJyaWQsIDU3Nik7CisjZWxzZQorICAgICAgICB0YWIwID0gZzAtPnNiX2h5YnJpZDsKKyAgICAgICAgdGFiMSA9IGcxLT5zYl9oeWJyaWQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1NzY7IGkrKykgeworICAgICAgICAgICAgdG1wMCAgICA9IHRhYjBbaV07CisgICAgICAgICAgICB0bXAxICAgID0gdGFiMVtpXTsKKyAgICAgICAgICAgIHRhYjBbaV0gPSB0bXAwICsgdG1wMTsKKyAgICAgICAgICAgIHRhYjFbaV0gPSB0bXAwIC0gdG1wMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQorCisjaWYgVVNFX0ZMT0FUUworI2lmIEhBVkVfTUlQU0ZQVQorIyAgIGluY2x1ZGUgIm1pcHMvY29tcHV0ZV9hbnRpYWxpYXNfZmxvYXQuaCIKKyNlbmRpZiAvKiBIQVZFX01JUFNGUFUgKi8KKyNlbHNlCisjaWYgSEFWRV9NSVBTRFNQUjEKKyMgICBpbmNsdWRlICJtaXBzL2NvbXB1dGVfYW50aWFsaWFzX2ZpeGVkLmgiCisjZW5kaWYgLyogSEFWRV9NSVBTRFNQUjEgKi8KKyNlbmRpZiAvKiBVU0VfRkxPQVRTICovCisKKyNpZm5kZWYgY29tcHV0ZV9hbnRpYWxpYXMKKyNpZiBVU0VfRkxPQVRTCisjZGVmaW5lIEFBKGopIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZsb2F0IHRtcDAgPSBwdHJbLTEtal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZsb2F0IHRtcDEgPSBwdHJbICAgal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHB0clstMS1qXSA9IHRtcDAgKiBjc2FfdGFibGVbal1bMF0gLSB0bXAxICogY3NhX3RhYmxlW2pdWzFdOyAgICBcCisgICAgICAgIHB0clsgICBqXSA9IHRtcDAgKiBjc2FfdGFibGVbal1bMV0gKyB0bXAxICogY3NhX3RhYmxlW2pdWzBdOyAgICBcCisgICAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEFBKGopIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgdG1wMCA9IHB0clstMS1qXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHRtcDEgPSBwdHJbICAgal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB0bXAyID0gTVVMSCh0bXAwICsgdG1wMSwgY3NhX3RhYmxlW2pdWzBdKTsgICAgICAgICAgXAorICAgICAgICBwdHJbLTEtal0gPSA0ICogKHRtcDIgLSBNVUxIKHRtcDEsIGNzYV90YWJsZVtqXVsyXSkpOyAgIFwKKyAgICAgICAgcHRyWyAgIGpdID0gNCAqICh0bXAyICsgTVVMSCh0bXAwLCBjc2FfdGFibGVbal1bM10pKTsgICBcCisgICAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjb21wdXRlX2FudGlhbGlhcyhNUEFEZWNvZGVDb250ZXh0ICpzLCBHcmFudWxlRGVmICpnKQoreworICAgIElOVEZMT0FUICpwdHI7CisgICAgaW50IG4sIGk7CisKKyAgICAvKiB3ZSBhbnRpYWxpYXMgb25seSAibG9uZyIgYmFuZHMgKi8KKyAgICBpZiAoZy0+YmxvY2tfdHlwZSA9PSAyKSB7CisgICAgICAgIGlmICghZy0+c3dpdGNoX3BvaW50KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvKiBYWFg6IGNoZWNrIHRoaXMgZm9yIDgwMDBIeiBjYXNlICovCisgICAgICAgIG4gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIG4gPSBTQkxJTUlUIC0gMTsKKyAgICB9CisKKyAgICBwdHIgPSBnLT5zYl9oeWJyaWQgKyAxODsKKyAgICBmb3IgKGkgPSBuOyBpID4gMDsgaS0tKSB7CisgICAgICAgIEFBKDApOworICAgICAgICBBQSgxKTsKKyAgICAgICAgQUEoMik7CisgICAgICAgIEFBKDMpOworICAgICAgICBBQSg0KTsKKyAgICAgICAgQUEoNSk7CisgICAgICAgIEFBKDYpOworICAgICAgICBBQSg3KTsKKworICAgICAgICBwdHIgKz0gMTg7CisgICAgfQorfQorI2VuZGlmIC8qIGNvbXB1dGVfYW50aWFsaWFzICovCisKK3N0YXRpYyB2b2lkIGNvbXB1dGVfaW1kY3QoTVBBRGVjb2RlQ29udGV4dCAqcywgR3JhbnVsZURlZiAqZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URkxPQVQgKnNiX3NhbXBsZXMsIElOVEZMT0FUICptZGN0X2J1ZikKK3sKKyAgICBJTlRGTE9BVCAqd2luLCAqb3V0X3B0ciwgKnB0ciwgKmJ1ZiwgKnB0cjE7CisgICAgSU5URkxPQVQgb3V0MlsxMl07CisgICAgaW50IGksIGosIG1kY3RfbG9uZ19lbmQsIHNibGltaXQ7CisKKyAgICAvKiBmaW5kIGxhc3Qgbm9uIHplcm8gYmxvY2sgKi8KKyAgICBwdHIgID0gZy0+c2JfaHlicmlkICsgNTc2OworICAgIHB0cjEgPSBnLT5zYl9oeWJyaWQgKyAyICogMTg7CisgICAgd2hpbGUgKHB0ciA+PSBwdHIxKSB7CisgICAgICAgIGludDMyX3QgKnA7CisgICAgICAgIHB0ciAtPSA2OworICAgICAgICBwICAgID0gKGludDMyX3QqKXB0cjsKKyAgICAgICAgaWYgKHBbMF0gfCBwWzFdIHwgcFsyXSB8IHBbM10gfCBwWzRdIHwgcFs1XSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzYmxpbWl0ID0gKChwdHIgLSBnLT5zYl9oeWJyaWQpIC8gMTgpICsgMTsKKworICAgIGlmIChnLT5ibG9ja190eXBlID09IDIpIHsKKyAgICAgICAgLyogWFhYOiBjaGVjayBmb3IgODAwMCBIeiAqLworICAgICAgICBpZiAoZy0+c3dpdGNoX3BvaW50KQorICAgICAgICAgICAgbWRjdF9sb25nX2VuZCA9IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1kY3RfbG9uZ19lbmQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG1kY3RfbG9uZ19lbmQgPSBzYmxpbWl0OworICAgIH0KKworICAgIHMtPm1wYWRzcC5SRU5BTUUoaW1kY3QzNl9ibG9ja3MpKHNiX3NhbXBsZXMsIG1kY3RfYnVmLCBnLT5zYl9oeWJyaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRjdF9sb25nX2VuZCwgZy0+c3dpdGNoX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGctPmJsb2NrX3R5cGUpOworCisgICAgYnVmID0gbWRjdF9idWYgKyA0KjE4KihtZGN0X2xvbmdfZW5kID4+IDIpICsgKG1kY3RfbG9uZ19lbmQgJiAzKTsKKyAgICBwdHIgPSBnLT5zYl9oeWJyaWQgKyAxOCAqIG1kY3RfbG9uZ19lbmQ7CisKKyAgICBmb3IgKGogPSBtZGN0X2xvbmdfZW5kOyBqIDwgc2JsaW1pdDsgaisrKSB7CisgICAgICAgIC8qIHNlbGVjdCBmcmVxdWVuY3kgaW52ZXJzaW9uICovCisgICAgICAgIHdpbiAgICAgPSBSRU5BTUUoZmZfbWRjdF93aW4pWzIgKyAoNCAgJiAtKGogJiAxKSldOworICAgICAgICBvdXRfcHRyID0gc2Jfc2FtcGxlcyArIGo7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgKm91dF9wdHIgPSBidWZbNCppXTsKKyAgICAgICAgICAgIG91dF9wdHIgKz0gU0JMSU1JVDsKKyAgICAgICAgfQorICAgICAgICBpbWRjdDEyKG91dDIsIHB0ciArIDApOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAqb3V0X3B0ciAgICAgPSBNVUxIMyhvdXQyW2kgICAgXSwgd2luW2kgICAgXSwgMSkgKyBidWZbNCooaSArIDYqMSldOworICAgICAgICAgICAgYnVmWzQqKGkgKyA2KjIpXSA9IE1VTEgzKG91dDJbaSArIDZdLCB3aW5baSArIDZdLCAxKTsKKyAgICAgICAgICAgIG91dF9wdHIgKz0gU0JMSU1JVDsKKyAgICAgICAgfQorICAgICAgICBpbWRjdDEyKG91dDIsIHB0ciArIDEpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAqb3V0X3B0ciAgICAgPSBNVUxIMyhvdXQyW2kgICAgXSwgd2luW2kgICAgXSwgMSkgKyBidWZbNCooaSArIDYqMildOworICAgICAgICAgICAgYnVmWzQqKGkgKyA2KjApXSA9IE1VTEgzKG91dDJbaSArIDZdLCB3aW5baSArIDZdLCAxKTsKKyAgICAgICAgICAgIG91dF9wdHIgKz0gU0JMSU1JVDsKKyAgICAgICAgfQorICAgICAgICBpbWRjdDEyKG91dDIsIHB0ciArIDIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICBidWZbNCooaSArIDYqMCldID0gTVVMSDMob3V0MltpICAgIF0sIHdpbltpICAgIF0sIDEpICsgYnVmWzQqKGkgKyA2KjApXTsKKyAgICAgICAgICAgIGJ1Zls0KihpICsgNioxKV0gPSBNVUxIMyhvdXQyW2kgKyA2XSwgd2luW2kgKyA2XSwgMSk7CisgICAgICAgICAgICBidWZbNCooaSArIDYqMildID0gMDsKKyAgICAgICAgfQorICAgICAgICBwdHIgKz0gMTg7CisgICAgICAgIGJ1ZiArPSAoaiYzKSAhPSAzID8gMSA6ICg0KjE4LTMpOworICAgIH0KKyAgICAvKiB6ZXJvIGJhbmRzICovCisgICAgZm9yIChqID0gc2JsaW1pdDsgaiA8IFNCTElNSVQ7IGorKykgeworICAgICAgICAvKiBvdmVybGFwICovCisgICAgICAgIG91dF9wdHIgPSBzYl9zYW1wbGVzICsgajsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE4OyBpKyspIHsKKyAgICAgICAgICAgICpvdXRfcHRyID0gYnVmWzQqaV07CisgICAgICAgICAgICBidWZbNCppXSAgID0gMDsKKyAgICAgICAgICAgIG91dF9wdHIgKz0gU0JMSU1JVDsKKyAgICAgICAgfQorICAgICAgICBidWYgKz0gKGomMykgIT0gMyA/IDEgOiAoNCoxOC0zKTsKKyAgICB9Cit9CisKKy8qIG1haW4gbGF5ZXIzIGRlY29kaW5nIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IG1wX2RlY29kZV9sYXllcjMoTVBBRGVjb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgbmJfZ3JhbnVsZXMsIG1haW5fZGF0YV9iZWdpbjsKKyAgICBpbnQgZ3IsIGNoLCBibG9ja3NwbGl0X2ZsYWcsIGksIGosIGssIG4sIGJpdHNfcG9zOworICAgIEdyYW51bGVEZWYgKmc7CisgICAgaW50MTZfdCBleHBvbmVudHNbNTc2XTsgLy9GSVhNRSB0cnkgSU5URkxPQVQKKworICAgIC8qIHJlYWQgc2lkZSBpbmZvICovCisgICAgaWYgKHMtPmxzZikgeworICAgICAgICBtYWluX2RhdGFfYmVnaW4gPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCBzLT5uYl9jaGFubmVscyk7CisgICAgICAgIG5iX2dyYW51bGVzID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBtYWluX2RhdGFfYmVnaW4gPSBnZXRfYml0cygmcy0+Z2IsIDkpOworICAgICAgICBpZiAocy0+bmJfY2hhbm5lbHMgPT0gMikKKyAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA1KTsKKyAgICAgICAgbmJfZ3JhbnVsZXMgPSAyOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uYl9jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgcy0+Z3JhbnVsZXNbY2hdWzBdLnNjZnNpID0gMDsvKiBhbGwgc2NhbGUgZmFjdG9ycyBhcmUgdHJhbnNtaXR0ZWQgKi8KKyAgICAgICAgICAgIHMtPmdyYW51bGVzW2NoXVsxXS5zY2ZzaSA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGdyID0gMDsgZ3IgPCBuYl9ncmFudWxlczsgZ3IrKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uYl9jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgImdyPSVkIGNoPSVkOiBzaWRlX2luZm9cbiIsIGdyLCBjaCk7CisgICAgICAgICAgICBnID0gJnMtPmdyYW51bGVzW2NoXVtncl07CisgICAgICAgICAgICBnLT5wYXJ0Ml8zX2xlbmd0aCA9IGdldF9iaXRzKCZzLT5nYiwgMTIpOworICAgICAgICAgICAgZy0+YmlnX3ZhbHVlcyAgICAgPSBnZXRfYml0cygmcy0+Z2IsICA5KTsKKyAgICAgICAgICAgIGlmIChnLT5iaWdfdmFsdWVzID4gMjg4KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJiaWdfdmFsdWVzIHRvbyBiaWdcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnLT5nbG9iYWxfZ2FpbiA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgICAgICAvKiBpZiBNUyBzdGVyZW8gb25seSBpcyBzZWxlY3RlZCwgd2UgcHJlY29tcHV0ZSB0aGUKKyAgICAgICAgICAgICAgIDEvc3FydCgyKSByZW5vcm1hbGl6YXRpb24gZmFjdG9yICovCisgICAgICAgICAgICBpZiAoKHMtPm1vZGVfZXh0ICYgKE1PREVfRVhUX01TX1NURVJFTyB8IE1PREVfRVhUX0lfU1RFUkVPKSkgPT0KKyAgICAgICAgICAgICAgICBNT0RFX0VYVF9NU19TVEVSRU8pCisgICAgICAgICAgICAgICAgZy0+Z2xvYmFsX2dhaW4gLT0gMjsKKyAgICAgICAgICAgIGlmIChzLT5sc2YpCisgICAgICAgICAgICAgICAgZy0+c2NhbGVmYWNfY29tcHJlc3MgPSBnZXRfYml0cygmcy0+Z2IsIDkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGctPnNjYWxlZmFjX2NvbXByZXNzID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsKKyAgICAgICAgICAgIGJsb2Nrc3BsaXRfZmxhZyA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgaWYgKGJsb2Nrc3BsaXRfZmxhZykgeworICAgICAgICAgICAgICAgIGctPmJsb2NrX3R5cGUgPSBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgICAgICAgICAgICAgIGlmIChnLT5ibG9ja190eXBlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGJsb2NrIHR5cGVcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZy0+c3dpdGNoX3BvaW50ID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZy0+dGFibGVfc2VsZWN0W2ldID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgICAgICBnLT5zdWJibG9ja19nYWluW2ldID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICAgICAgICAgICAgICBpbml0X3Nob3J0X3JlZ2lvbihzLCBnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHJlZ2lvbl9hZGRyZXNzMSwgcmVnaW9uX2FkZHJlc3MyOworICAgICAgICAgICAgICAgIGctPmJsb2NrX3R5cGUgPSAwOworICAgICAgICAgICAgICAgIGctPnN3aXRjaF9wb2ludCA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZy0+dGFibGVfc2VsZWN0W2ldID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKKyAgICAgICAgICAgICAgICAvKiBjb21wdXRlIGh1ZmZtYW4gY29kZWQgcmVnaW9uIHNpemVzICovCisgICAgICAgICAgICAgICAgcmVnaW9uX2FkZHJlc3MxID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsKKyAgICAgICAgICAgICAgICByZWdpb25fYWRkcmVzczIgPSBnZXRfYml0cygmcy0+Z2IsIDMpOworICAgICAgICAgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICJyZWdpb24xPSVkIHJlZ2lvbjI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fYWRkcmVzczEsIHJlZ2lvbl9hZGRyZXNzMik7CisgICAgICAgICAgICAgICAgaW5pdF9sb25nX3JlZ2lvbihzLCBnLCByZWdpb25fYWRkcmVzczEsIHJlZ2lvbl9hZGRyZXNzMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWdpb25fb2Zmc2V0MnNpemUoZyk7CisgICAgICAgICAgICBjb21wdXRlX2JhbmRfaW5kZXhlcyhzLCBnKTsKKworICAgICAgICAgICAgZy0+cHJlZmxhZyA9IDA7CisgICAgICAgICAgICBpZiAoIXMtPmxzZikKKyAgICAgICAgICAgICAgICBnLT5wcmVmbGFnID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBnLT5zY2FsZWZhY19zY2FsZSAgICAgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgIGctPmNvdW50MXRhYmxlX3NlbGVjdCA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgImJsb2NrX3R5cGU9JWQgc3dpdGNoX3BvaW50PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICBnLT5ibG9ja190eXBlLCBnLT5zd2l0Y2hfcG9pbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzLT5hZHVfbW9kZSkgeworICAgICAgICBpbnQgc2tpcDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gcy0+Z2IuYnVmZmVyICsgKGdldF9iaXRzX2NvdW50KCZzLT5nYik+PjMpOworICAgICAgICBpbnQgZXh0cmFzaXplID0gYXZfY2xpcChnZXRfYml0c19sZWZ0KCZzLT5nYikgPj4gMywgMCwgRVhUUkFCWVRFUyk7CisgICAgICAgIGF2X2Fzc2VydDEoKGdldF9iaXRzX2NvdW50KCZzLT5nYikgJiA3KSA9PSAwKTsKKyAgICAgICAgLyogbm93IHdlIGdldCBiaXRzIGZyb20gdGhlIG1haW5fZGF0YV9iZWdpbiBvZmZzZXQgKi8KKyAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgInNlZWtiYWNrOiVkLCBsYXN0YnVmOiVkXG4iLAorICAgICAgICAgICAgICAgIG1haW5fZGF0YV9iZWdpbiwgcy0+bGFzdF9idWZfc2l6ZSk7CisKKyAgICAgICAgbWVtY3B5KHMtPmxhc3RfYnVmICsgcy0+bGFzdF9idWZfc2l6ZSwgcHRyLCBleHRyYXNpemUpOworICAgICAgICBzLT5pbl9nYiA9IHMtPmdiOworICAgICAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgcy0+bGFzdF9idWYsIHMtPmxhc3RfYnVmX3NpemUqOCk7CisjaWYgIVVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSCisgICAgICAgIHMtPmdiLnNpemVfaW5fYml0c19wbHVzOCArPSBGRk1BWChleHRyYXNpemUsIExBU1RfQlVGX1NJWkUgLSBzLT5sYXN0X2J1Zl9zaXplKSAqIDg7CisjZW5kaWYKKyAgICAgICAgcy0+bGFzdF9idWZfc2l6ZSA8PD0gMzsKKyAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgbmJfZ3JhbnVsZXMgJiYgKHMtPmxhc3RfYnVmX3NpemUgPj4gMykgPCBtYWluX2RhdGFfYmVnaW47IGdyKyspIHsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgZyA9ICZzLT5ncmFudWxlc1tjaF1bZ3JdOworICAgICAgICAgICAgICAgIHMtPmxhc3RfYnVmX3NpemUgKz0gZy0+cGFydDJfM19sZW5ndGg7CisgICAgICAgICAgICAgICAgbWVtc2V0KGctPnNiX2h5YnJpZCwgMCwgc2l6ZW9mKGctPnNiX2h5YnJpZCkpOworICAgICAgICAgICAgICAgIGNvbXB1dGVfaW1kY3QocywgZywgJnMtPnNiX3NhbXBsZXNbY2hdWzE4ICogZ3JdWzBdLCBzLT5tZGN0X2J1ZltjaF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNraXAgPSBzLT5sYXN0X2J1Zl9zaXplIC0gOCAqIG1haW5fZGF0YV9iZWdpbjsKKyAgICAgICAgaWYgKHNraXAgPj0gcy0+Z2Iuc2l6ZV9pbl9iaXRzICYmIHMtPmluX2diLmJ1ZmZlcikgeworICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmluX2diLCBza2lwIC0gcy0+Z2Iuc2l6ZV9pbl9iaXRzKTsKKyAgICAgICAgICAgIHMtPmdiICAgICAgICAgICA9IHMtPmluX2diOworICAgICAgICAgICAgcy0+aW5fZ2IuYnVmZmVyID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgc2tpcCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBnciA9IDA7CisgICAgfQorCisgICAgZm9yICg7IGdyIDwgbmJfZ3JhbnVsZXM7IGdyKyspIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+bmJfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGcgPSAmcy0+Z3JhbnVsZXNbY2hdW2dyXTsKKyAgICAgICAgICAgIGJpdHNfcG9zID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKworICAgICAgICAgICAgaWYgKCFzLT5sc2YpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpzYzsKKyAgICAgICAgICAgICAgICBpbnQgc2xlbiwgc2xlbjEsIHNsZW4yOworCisgICAgICAgICAgICAgICAgLyogTVBFRzEgc2NhbGUgZmFjdG9ycyAqLworICAgICAgICAgICAgICAgIHNsZW4xID0gc2xlbl90YWJsZVswXVtnLT5zY2FsZWZhY19jb21wcmVzc107CisgICAgICAgICAgICAgICAgc2xlbjIgPSBzbGVuX3RhYmxlWzFdW2ctPnNjYWxlZmFjX2NvbXByZXNzXTsKKyAgICAgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAic2xlbjE9JWQgc2xlbjI9JWRcbiIsIHNsZW4xLCBzbGVuMik7CisgICAgICAgICAgICAgICAgaWYgKGctPmJsb2NrX3R5cGUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBuID0gZy0+c3dpdGNoX3BvaW50ID8gMTcgOiAxODsKKyAgICAgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChzbGVuMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLT5zY2FsZV9mYWN0b3JzW2orK10gPSBnZXRfYml0cygmcy0+Z2IsIHNsZW4xKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy0+c2NhbGVfZmFjdG9yc1tqKytdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc2xlbjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxODsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGctPnNjYWxlX2ZhY3RvcnNbaisrXSA9IGdldF9iaXRzKCZzLT5nYiwgc2xlbjIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLT5zY2FsZV9mYWN0b3JzW2orK10gPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIxOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy0+c2NhbGVfZmFjdG9yc1tqKytdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNjID0gcy0+Z3JhbnVsZXNbY2hdWzBdLnNjYWxlX2ZhY3RvcnM7CisgICAgICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gayA9PSAwID8gNiA6IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGctPnNjZnNpICYgKDB4OCA+PiBrKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZW4gPSAoayA8IDIpID8gc2xlbjEgOiBzbGVuMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2xlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy0+c2NhbGVfZmFjdG9yc1tqKytdID0gZ2V0X2JpdHMoJnMtPmdiLCBzbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy0+c2NhbGVfZmFjdG9yc1tqKytdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpbXBseSBjb3B5IGZyb20gbGFzdCBncmFudWxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLT5zY2FsZV9mYWN0b3JzW2pdID0gc2Nbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZy0+c2NhbGVfZmFjdG9yc1tqKytdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCB0aW5kZXgsIHRpbmRleDIsIHNsZW5bNF0sIHNsLCBzZjsKKworICAgICAgICAgICAgICAgIC8qIExTRiBzY2FsZSBmYWN0b3JzICovCisgICAgICAgICAgICAgICAgaWYgKGctPmJsb2NrX3R5cGUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgdGluZGV4ID0gZy0+c3dpdGNoX3BvaW50ID8gMiA6IDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aW5kZXggPSAwOworCisgICAgICAgICAgICAgICAgc2YgPSBnLT5zY2FsZWZhY19jb21wcmVzczsKKyAgICAgICAgICAgICAgICBpZiAoKHMtPm1vZGVfZXh0ICYgTU9ERV9FWFRfSV9TVEVSRU8pICYmIGNoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaW50ZW5zaXR5IHN0ZXJlbyBjYXNlICovCisgICAgICAgICAgICAgICAgICAgIHNmID4+PSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoc2YgPCAxODApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxzZl9zZl9leHBhbmQoc2xlbiwgc2YsIDYsIDYsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgdGluZGV4MiA9IDM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2YgPCAyNDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxzZl9zZl9leHBhbmQoc2xlbiwgc2YgLSAxODAsIDQsIDQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgdGluZGV4MiA9IDQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsc2Zfc2ZfZXhwYW5kKHNsZW4sIHNmIC0gMjQ0LCAzLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbmRleDIgPSA1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbm9ybWFsIGNhc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNmIDwgNDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsc2Zfc2ZfZXhwYW5kKHNsZW4sIHNmLCA1LCA0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbmRleDIgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNmIDwgNTAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsc2Zfc2ZfZXhwYW5kKHNsZW4sIHNmIC0gNDAwLCA1LCA0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbmRleDIgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbHNmX3NmX2V4cGFuZChzbGVuLCBzZiAtIDUwMCwgMywgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW5kZXgyID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGctPnByZWZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBuICA9IGxzZl9uc2ZfdGFibGVbdGluZGV4Ml1bdGluZGV4XVtrXTsKKyAgICAgICAgICAgICAgICAgICAgc2wgPSBzbGVuW2tdOworICAgICAgICAgICAgICAgICAgICBpZiAoc2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy0+c2NhbGVfZmFjdG9yc1tqKytdID0gZ2V0X2JpdHMoJnMtPmdiLCBzbCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGctPnNjYWxlX2ZhY3RvcnNbaisrXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogWFhYOiBzaG91bGQgY29tcHV0ZSBleGFjdCBzaXplICovCisgICAgICAgICAgICAgICAgZm9yICg7IGogPCA0MDsgaisrKQorICAgICAgICAgICAgICAgICAgICBnLT5zY2FsZV9mYWN0b3JzW2pdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXhwb25lbnRzX2Zyb21fc2NhbGVfZmFjdG9ycyhzLCBnLCBleHBvbmVudHMpOworCisgICAgICAgICAgICAvKiByZWFkIEh1ZmZtYW4gY29kZWQgcmVzaWR1ZSAqLworICAgICAgICAgICAgaHVmZm1hbl9kZWNvZGUocywgZywgZXhwb25lbnRzLCBiaXRzX3BvcyArIGctPnBhcnQyXzNfbGVuZ3RoKTsKKyAgICAgICAgfSAvKiBjaCAqLworCisgICAgICAgIGlmIChzLT5tb2RlID09IE1QQV9KU1RFUkVPKQorICAgICAgICAgICAgY29tcHV0ZV9zdGVyZW8ocywgJnMtPmdyYW51bGVzWzBdW2dyXSwgJnMtPmdyYW51bGVzWzFdW2dyXSk7CisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+bmJfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGcgPSAmcy0+Z3JhbnVsZXNbY2hdW2dyXTsKKworICAgICAgICAgICAgcmVvcmRlcl9ibG9jayhzLCBnKTsKKyAgICAgICAgICAgIGNvbXB1dGVfYW50aWFsaWFzKHMsIGcpOworICAgICAgICAgICAgY29tcHV0ZV9pbWRjdChzLCBnLCAmcy0+c2Jfc2FtcGxlc1tjaF1bMTggKiBncl1bMF0sIHMtPm1kY3RfYnVmW2NoXSk7CisgICAgICAgIH0KKyAgICB9IC8qIGdyICovCisgICAgaWYgKGdldF9iaXRzX2NvdW50KCZzLT5nYikgPCAwKQorICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIC1nZXRfYml0c19jb3VudCgmcy0+Z2IpKTsKKyAgICByZXR1cm4gbmJfZ3JhbnVsZXMgKiAxODsKK30KKworc3RhdGljIGludCBtcF9kZWNvZGVfZnJhbWUoTVBBRGVjb2RlQ29udGV4dCAqcywgT1VUX0lOVCAqKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgaSwgbmJfZnJhbWVzLCBjaCwgcmV0OworICAgIE9VVF9JTlQgKnNhbXBsZXNfcHRyOworCisgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1ZiArIEhFQURFUl9TSVpFLCAoYnVmX3NpemUgLSBIRUFERVJfU0laRSkgKiA4KTsKKworICAgIC8qIHNraXAgZXJyb3IgcHJvdGVjdGlvbiBmaWVsZCAqLworICAgIGlmIChzLT5lcnJvcl9wcm90ZWN0aW9uKQorICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxNik7CisKKyAgICBzd2l0Y2gocy0+bGF5ZXIpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIHMtPmF2Y3R4LT5mcmFtZV9zaXplID0gMzg0OworICAgICAgICBuYl9mcmFtZXMgPSBtcF9kZWNvZGVfbGF5ZXIxKHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHMtPmF2Y3R4LT5mcmFtZV9zaXplID0gMTE1MjsKKyAgICAgICAgbmJfZnJhbWVzID0gbXBfZGVjb2RlX2xheWVyMihzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBzLT5hdmN0eC0+ZnJhbWVfc2l6ZSA9IHMtPmxzZiA/IDU3NiA6IDExNTI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgbmJfZnJhbWVzID0gbXBfZGVjb2RlX2xheWVyMyhzKTsKKworICAgICAgICBzLT5sYXN0X2J1Zl9zaXplPTA7CisgICAgICAgIGlmIChzLT5pbl9nYi5idWZmZXIpIHsKKyAgICAgICAgICAgIGFsaWduX2dldF9iaXRzKCZzLT5nYik7CisgICAgICAgICAgICBpID0gZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpPj4zOworICAgICAgICAgICAgaWYgKGkgPj0gMCAmJiBpIDw9IEJBQ0tTVEVQX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKHMtPmxhc3RfYnVmLCBzLT5nYi5idWZmZXIgKyAoZ2V0X2JpdHNfY291bnQoJnMtPmdiKT4+MyksIGkpOworICAgICAgICAgICAgICAgIHMtPmxhc3RfYnVmX3NpemU9aTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBvbGQgYmFja3N0ZXAgJWRcbiIsIGkpOworICAgICAgICAgICAgcy0+Z2IgICAgICAgICAgID0gcy0+aW5fZ2I7CisgICAgICAgICAgICBzLT5pbl9nYi5idWZmZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJnMtPmdiKTsKKyAgICAgICAgYXZfYXNzZXJ0MSgoZ2V0X2JpdHNfY291bnQoJnMtPmdiKSAmIDcpID09IDApOworICAgICAgICBpID0gZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpID4+IDM7CisKKyAgICAgICAgaWYgKGkgPCAwIHx8IGkgPiBCQUNLU1RFUF9TSVpFIHx8IG5iX2ZyYW1lcyA8IDApIHsKKyAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbmV3IGJhY2tzdGVwICVkXG4iLCBpKTsKKyAgICAgICAgICAgIGkgPSBGRk1JTihCQUNLU1RFUF9TSVpFLCBidWZfc2l6ZSAtIEhFQURFUl9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBhdl9hc3NlcnQxKGkgPD0gYnVmX3NpemUgLSBIRUFERVJfU0laRSAmJiBpID49IDApOworICAgICAgICBtZW1jcHkocy0+bGFzdF9idWYgKyBzLT5sYXN0X2J1Zl9zaXplLCBzLT5nYi5idWZmZXIgKyBidWZfc2l6ZSAtIEhFQURFUl9TSVpFIC0gaSwgaSk7CisgICAgICAgIHMtPmxhc3RfYnVmX3NpemUgKz0gaTsKKyAgICB9CisKKyAgICBpZihuYl9mcmFtZXMgPCAwKQorICAgICAgICByZXR1cm4gbmJfZnJhbWVzOworCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBpZiAoIXNhbXBsZXMpIHsKKyAgICAgICAgYXZfYXNzZXJ0MChzLT5mcmFtZSk7CisgICAgICAgIHMtPmZyYW1lLT5uYl9zYW1wbGVzID0gcy0+YXZjdHgtPmZyYW1lX3NpemU7CisgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihzLT5hdmN0eCwgcy0+ZnJhbWUsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBzYW1wbGVzID0gKE9VVF9JTlQgKiopcy0+ZnJhbWUtPmV4dGVuZGVkX2RhdGE7CisgICAgfQorCisgICAgLyogYXBwbHkgdGhlIHN5bnRoZXNpcyBmaWx0ZXIgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uYl9jaGFubmVsczsgY2grKykgeworICAgICAgICBpbnQgc2FtcGxlX3N0cmlkZTsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5zYW1wbGVfZm10ID09IE9VVF9GTVRfUCkgeworICAgICAgICAgICAgc2FtcGxlc19wdHIgICA9IHNhbXBsZXNbY2hdOworICAgICAgICAgICAgc2FtcGxlX3N0cmlkZSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzYW1wbGVzX3B0ciAgID0gc2FtcGxlc1swXSArIGNoOworICAgICAgICAgICAgc2FtcGxlX3N0cmlkZSA9IHMtPm5iX2NoYW5uZWxzOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9mcmFtZXM7IGkrKykgeworICAgICAgICAgICAgUkVOQU1FKGZmX21wYV9zeW50aF9maWx0ZXIpKCZzLT5tcGFkc3AsIHMtPnN5bnRoX2J1ZltjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzLT5zeW50aF9idWZfb2Zmc2V0W2NoXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVOQU1FKGZmX21wYV9zeW50aF93aW5kb3cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5kaXRoZXJfc3RhdGUsIHNhbXBsZXNfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zdHJpZGUsIHMtPnNiX3NhbXBsZXNbY2hdW2ldKTsKKyAgICAgICAgICAgIHNhbXBsZXNfcHRyICs9IDMyICogc2FtcGxlX3N0cmlkZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuYl9mcmFtZXMgKiAzMiAqIHNpemVvZihPVVRfSU5UKSAqIHMtPm5iX2NoYW5uZWxzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqIGF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmICA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBNUEFEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50MzJfdCBoZWFkZXI7CisgICAgaW50IHJldDsKKworICAgIHdoaWxlKGJ1Zl9zaXplICYmICEqYnVmKXsKKyAgICAgICAgYnVmKys7CisgICAgICAgIGJ1Zl9zaXplLS07CisgICAgfQorCisgICAgaWYgKGJ1Zl9zaXplIDwgSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaGVhZGVyID0gQVZfUkIzMihidWYpOworICAgIGlmIChoZWFkZXI+PjggPT0gQVZfUkIzMigiVEFHIik+PjgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJkaXNjYXJkaW5nIElEMyB0YWdcbiIpOworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorICAgIGlmIChmZl9tcGFfY2hlY2tfaGVhZGVyKGhlYWRlcikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSGVhZGVyIG1pc3NpbmdcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoYXZwcml2X21wZWdhdWRpb19kZWNvZGVfaGVhZGVyKChNUEFEZWNvZGVIZWFkZXIgKilzLCBoZWFkZXIpID09IDEpIHsKKyAgICAgICAgLyogZnJlZSBmb3JtYXQ6IHByZXBhcmUgdG8gY29tcHV0ZSBmcmFtZSBzaXplICovCisgICAgICAgIHMtPmZyYW1lX3NpemUgPSAtMTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIC8qIHVwZGF0ZSBjb2RlYyBpbmZvICovCisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gcy0+bmJfY2hhbm5lbHM7CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gcy0+bmJfY2hhbm5lbHMgPT0gMSA/IEFWX0NIX0xBWU9VVF9NT05PIDogQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICBpZiAoIWF2Y3R4LT5iaXRfcmF0ZSkKKyAgICAgICAgYXZjdHgtPmJpdF9yYXRlID0gcy0+Yml0X3JhdGU7CisKKyAgICBpZiAocy0+ZnJhbWVfc2l6ZSA8PSAwIHx8IHMtPmZyYW1lX3NpemUgPiBidWZfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImluY29tcGxldGUgZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9IGVsc2UgaWYgKHMtPmZyYW1lX3NpemUgPCBidWZfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImluY29ycmVjdCBmcmFtZSBzaXplIC0gbXVsdGlwbGUgZnJhbWVzIGluIGJ1ZmZlcj9cbiIpOworICAgICAgICBidWZfc2l6ZT0gcy0+ZnJhbWVfc2l6ZTsKKyAgICB9CisKKyAgICBzLT5mcmFtZSA9IGRhdGE7CisKKyAgICByZXQgPSBtcF9kZWNvZGVfZnJhbWUocywgTlVMTCwgYnVmLCBidWZfc2l6ZSk7CisgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgIHMtPmZyYW1lLT5uYl9zYW1wbGVzID0gYXZjdHgtPmZyYW1lX3NpemU7CisgICAgICAgICpnb3RfZnJhbWVfcHRyICAgICAgID0gMTsKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlICAgPSBzLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgLy9GSVhNRSBtYXliZSBtb3ZlIHRoZSBvdGhlciBjb2RlYyBpbmZvIHN0dWZmIGZyb20gYWJvdmUgaGVyZSB0b28KKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHdoaWxlIGRlY29kaW5nIE1QRUcgYXVkaW8gZnJhbWUuXG4iKTsKKyAgICAgICAgLyogT25seSByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGJhZCBmcmFtZSBtYWtlcyB1cCB0aGUgd2hvbGUgcGFja2V0IG9yCisgICAgICAgICAqIHRoZSBlcnJvciBpcyByZWxhdGVkIHRvIGJ1ZmZlciBtYW5hZ2VtZW50LgorICAgICAgICAgKiBJZiB0aGVyZSBpcyBtb3JlIGRhdGEgaW4gdGhlIHBhY2tldCwganVzdCBjb25zdW1lIHRoZSBiYWQgZnJhbWUKKyAgICAgICAgICogaW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZXJyb3IsIHdoaWNoIHdvdWxkIGRpc2NhcmQgdGhlIHdob2xlCisgICAgICAgICAqIHBhY2tldC4gKi8KKyAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICBpZiAoYnVmX3NpemUgPT0gYXZwa3QtPnNpemUgfHwgcmV0ICE9IEFWRVJST1JfSU5WQUxJRERBVEEpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBzLT5mcmFtZV9zaXplID0gMDsKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIG1wX2ZsdXNoKE1QQURlY29kZUNvbnRleHQgKmN0eCkKK3sKKyAgICBtZW1zZXQoY3R4LT5zeW50aF9idWYsIDAsIHNpemVvZihjdHgtPnN5bnRoX2J1ZikpOworICAgIG1lbXNldChjdHgtPm1kY3RfYnVmLCAwLCBzaXplb2YoY3R4LT5tZGN0X2J1ZikpOworICAgIGN0eC0+bGFzdF9idWZfc2l6ZSA9IDA7CisgICAgY3R4LT5kaXRoZXJfc3RhdGUgPSAwOworfQorCitzdGF0aWMgdm9pZCBmbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgbXBfZmx1c2goYXZjdHgtPnByaXZfZGF0YSk7Cit9CisKKyNpZiBDT05GSUdfTVAzQURVX0RFQ09ERVIgfHwgQ09ORklHX01QM0FEVUZMT0FUX0RFQ09ERVIKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lX2FkdShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmICA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBNUEFEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50MzJfdCBoZWFkZXI7CisgICAgaW50IGxlbiwgcmV0OworICAgIGludCBhdl91bnVzZWQgb3V0X3NpemU7CisKKyAgICBsZW4gPSBidWZfc2l6ZTsKKworICAgIC8vIERpc2NhcmQgdG9vIHNob3J0IGZyYW1lcworICAgIGlmIChidWZfc2l6ZSA8IEhFQURFUl9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGlzIHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworCisgICAgaWYgKGxlbiA+IE1QQV9NQVhfQ09ERURfRlJBTUVfU0laRSkKKyAgICAgICAgbGVuID0gTVBBX01BWF9DT0RFRF9GUkFNRV9TSVpFOworCisgICAgLy8gR2V0IGhlYWRlciBhbmQgcmVzdG9yZSBzeW5jIHdvcmQKKyAgICBoZWFkZXIgPSBBVl9SQjMyKGJ1ZikgfCAweGZmZTAwMDAwOworCisgICAgaWYgKGZmX21wYV9jaGVja19oZWFkZXIoaGVhZGVyKSA8IDApIHsgLy8gQmFkIGhlYWRlciwgZGlzY2FyZCBmcmFtZQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZwcml2X21wZWdhdWRpb19kZWNvZGVfaGVhZGVyKChNUEFEZWNvZGVIZWFkZXIgKilzLCBoZWFkZXIpOworICAgIC8qIHVwZGF0ZSBjb2RlYyBpbmZvICovCisgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gcy0+c2FtcGxlX3JhdGU7CisgICAgYXZjdHgtPmNoYW5uZWxzICAgID0gcy0+bmJfY2hhbm5lbHM7CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gcy0+bmJfY2hhbm5lbHMgPT0gMSA/IEFWX0NIX0xBWU9VVF9NT05PIDogQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICBpZiAoIWF2Y3R4LT5iaXRfcmF0ZSkKKyAgICAgICAgYXZjdHgtPmJpdF9yYXRlID0gcy0+Yml0X3JhdGU7CisKKyAgICBzLT5mcmFtZV9zaXplID0gbGVuOworCisgICAgcy0+ZnJhbWUgPSBkYXRhOworCisgICAgcmV0ID0gbXBfZGVjb2RlX2ZyYW1lKHMsIE5VTEwsIGJ1ZiwgYnVmX3NpemUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd2hpbGUgZGVjb2RpbmcgTVBFRyBhdWRpbyBmcmFtZS5cbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKyNlbmRpZiAvKiBDT05GSUdfTVAzQURVX0RFQ09ERVIgfHwgQ09ORklHX01QM0FEVUZMT0FUX0RFQ09ERVIgKi8KKworI2lmIENPTkZJR19NUDNPTjRfREVDT0RFUiB8fCBDT05GSUdfTVAzT040RkxPQVRfREVDT0RFUgorCisvKioKKyAqIENvbnRleHQgZm9yIE1QM09uNCBkZWNvZGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IE1QM09uNERlY29kZUNvbnRleHQgeworICAgIGludCBmcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgbXAzIGZyYW1lcyBwZXIgYmxvY2sgKG51bWJlciBvZiBtcDMgZGVjb2RlciBpbnN0YW5jZXMpCisgICAgaW50IHN5bmN3b3JkOyAgICAgICAgICAgICAgICAgICAvLy88IHN5bmN3b3JkIHBhdGNoCisgICAgY29uc3QgdWludDhfdCAqY29mZjsgICAgICAgICAgICAvLy88IGNoYW5uZWwgb2Zmc2V0cyBpbiBvdXRwdXQgYnVmZmVyCisgICAgTVBBRGVjb2RlQ29udGV4dCAqbXAzZGVjY3R4WzVdOyAvLy88IE1QQURlY29kZUNvbnRleHQgZm9yIGV2ZXJ5IGRlY29kZXIgaW5zdGFuY2UKK30gTVAzT240RGVjb2RlQ29udGV4dDsKKworI2luY2x1ZGUgIm1wZWc0YXVkaW8uaCIKKworLyogTmV4dCAzIGFycmF5cyBhcmUgaW5kZXhlZCBieSBjaGFubmVsIGNvbmZpZyBudW1iZXIgKHBhc3NlZCB2aWEgY29kZWNkYXRhKSAqLworCisvKiBudW1iZXIgb2YgbXAzIGRlY29kZXIgaW5zdGFuY2VzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBtcDNGcmFtZXNbOF0gPSB7IDAsIDEsIDEsIDIsIDMsIDMsIDQsIDUgfTsKKworLyogb2Zmc2V0cyBpbnRvIG91dHB1dCBidWZmZXIsIGFzc3VtZSBvdXRwdXQgb3JkZXIgaXMgRkwgRlIgQyBMRkUgQkwgQlIgU0wgU1IgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGNoYW5fb2Zmc2V0WzhdWzVdID0geworICAgIHsgMCAgICAgICAgICAgICB9LAorICAgIHsgMCAgICAgICAgICAgICB9LCAgLy8gQworICAgIHsgMCAgICAgICAgICAgICB9LCAgLy8gRkxSCisgICAgeyAyLCAwICAgICAgICAgIH0sICAvLyBDIEZMUgorICAgIHsgMiwgMCwgMyAgICAgICB9LCAgLy8gQyBGTFIgQlMKKyAgICB7IDIsIDAsIDMgICAgICAgfSwgIC8vIEMgRkxSIEJMUlMKKyAgICB7IDIsIDAsIDQsIDMgICAgfSwgIC8vIEMgRkxSIEJMUlMgTEZFCisgICAgeyAyLCAwLCA2LCA0LCAzIH0sICAvLyBDIEZMUiBCTFJTIEJMUiBMRkUKK307CisKKy8qIG1wM29uNCBjaGFubmVsIGxheW91dHMgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGNoYW5fbGF5b3V0WzhdID0geworICAgIDAsCisgICAgQVZfQ0hfTEFZT1VUX01PTk8sCisgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywKKyAgICBBVl9DSF9MQVlPVVRfU1VSUk9VTkQsCisgICAgQVZfQ0hfTEFZT1VUXzRQT0lOVDAsCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDAsCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDEsCisgICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDEKK307CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfY2xvc2VfbXAzb240KEFWQ29kZWNDb250ZXh0ICogYXZjdHgpCit7CisgICAgTVAzT240RGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZnJhbWVzOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZzLT5tcDNkZWNjdHhbaV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0X21wM29uNChBVkNvZGVjQ29udGV4dCAqIGF2Y3R4KQoreworICAgIE1QM09uNERlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1QRUc0QXVkaW9Db25maWcgY2ZnOworICAgIGludCBpOworCisgICAgaWYgKChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCAyKSB8fCAhYXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvZGVjIGV4dHJhZGF0YSBtaXNzaW5nIG9yIHRvbyBzaG9ydC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdnByaXZfbXBlZzRhdWRpb19nZXRfY29uZmlnKCZjZmcsIGF2Y3R4LT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKiA4LCAxKTsKKyAgICBpZiAoIWNmZy5jaGFuX2NvbmZpZyB8fCBjZmcuY2hhbl9jb25maWcgPiA3KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaGFubmVsIGNvbmZpZyBudW1iZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHMtPmZyYW1lcyAgICAgICAgICAgICA9IG1wM0ZyYW1lc1tjZmcuY2hhbl9jb25maWddOworICAgIHMtPmNvZmYgICAgICAgICAgICAgICA9IGNoYW5fb2Zmc2V0W2NmZy5jaGFuX2NvbmZpZ107CisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gZmZfbXBlZzRhdWRpb19jaGFubmVsc1tjZmcuY2hhbl9jb25maWddOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGNoYW5fbGF5b3V0W2NmZy5jaGFuX2NvbmZpZ107CisKKyAgICBpZiAoY2ZnLnNhbXBsZV9yYXRlIDwgMTYwMDApCisgICAgICAgIHMtPnN5bmN3b3JkID0gMHhmZmUwMDAwMDsKKyAgICBlbHNlCisgICAgICAgIHMtPnN5bmN3b3JkID0gMHhmZmYwMDAwMDsKKworICAgIC8qIEluaXQgdGhlIGZpcnN0IG1wMyBkZWNvZGVyIGluIHN0YW5kYXJkIHdheSwgc28gdGhhdCBhbGwgdGFibGVzIGdldCBidWlsZGVkCisgICAgICogV2UgcmVwbGFjZSBhdmN0eC0+cHJpdl9kYXRhIHdpdGggdGhlIGNvbnRleHQgb2YgdGhlIGZpcnN0IGRlY29kZXIgc28gdGhhdAorICAgICAqIGRlY29kZV9pbml0KCkgZG9lcyBub3QgaGF2ZSB0byBiZSBjaGFuZ2VkLgorICAgICAqIE90aGVyIGRlY29kZXJzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaGVyZSBjb3B5aW5nIGRhdGEgZnJvbSB0aGUgZmlyc3QgY29udGV4dAorICAgICAqLworICAgIC8vIEFsbG9jYXRlIHplcm9lZCBtZW1vcnkgZm9yIHRoZSBmaXJzdCBkZWNvZGVyIGNvbnRleHQKKyAgICBzLT5tcDNkZWNjdHhbMF0gPSBhdl9tYWxsb2N6KHNpemVvZihNUEFEZWNvZGVDb250ZXh0KSk7CisgICAgaWYgKCFzLT5tcDNkZWNjdHhbMF0pCisgICAgICAgIGdvdG8gYWxsb2NfZmFpbDsKKyAgICAvLyBQdXQgZGVjb2RlciBjb250ZXh0IGluIHBsYWNlIHRvIG1ha2UgaW5pdF9kZWNvZGUoKSBoYXBweQorICAgIGF2Y3R4LT5wcml2X2RhdGEgPSBzLT5tcDNkZWNjdHhbMF07CisgICAgZGVjb2RlX2luaXQoYXZjdHgpOworICAgIC8vIFJlc3RvcmUgbXAzb240IGNvbnRleHQgcG9pbnRlcgorICAgIGF2Y3R4LT5wcml2X2RhdGEgPSBzOworICAgIHMtPm1wM2RlY2N0eFswXS0+YWR1X21vZGUgPSAxOyAvLyBTZXQgYWR1IG1vZGUKKworICAgIC8qIENyZWF0ZSBhIHNlcGFyYXRlIGNvZGVjL2NvbnRleHQgZm9yIGVhY2ggZnJhbWUgKGZpcnN0IGlzIGFscmVhZHkgb2spLgorICAgICAqIEVhY2ggZnJhbWUgaXMgMSBvciAyIGNoYW5uZWxzIC0gdXAgdG8gNSBmcmFtZXMgYWxsb3dlZAorICAgICAqLworICAgIGZvciAoaSA9IDE7IGkgPCBzLT5mcmFtZXM7IGkrKykgeworICAgICAgICBzLT5tcDNkZWNjdHhbaV0gPSBhdl9tYWxsb2N6KHNpemVvZihNUEFEZWNvZGVDb250ZXh0KSk7CisgICAgICAgIGlmICghcy0+bXAzZGVjY3R4W2ldKQorICAgICAgICAgICAgZ290byBhbGxvY19mYWlsOworICAgICAgICBzLT5tcDNkZWNjdHhbaV0tPmFkdV9tb2RlID0gMTsKKyAgICAgICAgcy0+bXAzZGVjY3R4W2ldLT5hdmN0eCA9IGF2Y3R4OworICAgICAgICBzLT5tcDNkZWNjdHhbaV0tPm1wYWRzcCA9IHMtPm1wM2RlY2N0eFswXS0+bXBhZHNwOworICAgIH0KKworICAgIHJldHVybiAwOworYWxsb2NfZmFpbDoKKyAgICBkZWNvZGVfY2xvc2VfbXAzb240KGF2Y3R4KTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCisKK3N0YXRpYyB2b2lkIGZsdXNoX21wM29uNChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGk7CisgICAgTVAzT240RGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZnJhbWVzOyBpKyspCisgICAgICAgIG1wX2ZsdXNoKHMtPm1wM2RlY2N0eFtpXSk7Cit9CisKKworc3RhdGljIGludCBkZWNvZGVfZnJhbWVfbXAzb240KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgICAgID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgICAgICA9IGF2cGt0LT5zaXplOworICAgIE1QM09uNERlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1QQURlY29kZUNvbnRleHQgKm07CisgICAgaW50IGZzaXplLCBsZW4gPSBidWZfc2l6ZSwgb3V0X3NpemUgPSAwOworICAgIHVpbnQzMl90IGhlYWRlcjsKKyAgICBPVVRfSU5UICoqb3V0X3NhbXBsZXM7CisgICAgT1VUX0lOVCAqb3V0cHRyWzJdOworICAgIGludCBmciwgY2gsIHJldDsKKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBNUEFfRlJBTUVfU0laRTsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG91dF9zYW1wbGVzID0gKE9VVF9JTlQgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGE7CisKKyAgICAvLyBEaXNjYXJkIHRvbyBzaG9ydCBmcmFtZXMKKyAgICBpZiAoYnVmX3NpemUgPCBIRUFERVJfU0laRSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdmN0eC0+Yml0X3JhdGUgPSAwOworCisgICAgY2ggPSAwOworICAgIGZvciAoZnIgPSAwOyBmciA8IHMtPmZyYW1lczsgZnIrKykgeworICAgICAgICBmc2l6ZSA9IEFWX1JCMTYoYnVmKSA+PiA0OworICAgICAgICBmc2l6ZSA9IEZGTUlOMyhmc2l6ZSwgbGVuLCBNUEFfTUFYX0NPREVEX0ZSQU1FX1NJWkUpOworICAgICAgICBtICAgICA9IHMtPm1wM2RlY2N0eFtmcl07CisgICAgICAgIGF2X2Fzc2VydDEobSk7CisKKyAgICAgICAgaWYgKGZzaXplIDwgSEVBREVSX1NJWkUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRnJhbWUgc2l6ZSBzbWFsbGVyIHRoYW4gaGVhZGVyIHNpemVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaGVhZGVyID0gKEFWX1JCMzIoYnVmKSAmIDB4MDAwZmZmZmYpIHwgcy0+c3luY3dvcmQ7IC8vIHBhdGNoIGhlYWRlcgorCisgICAgICAgIGlmIChmZl9tcGFfY2hlY2tfaGVhZGVyKGhlYWRlcikgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJhZCBoZWFkZXIsIGRpc2NhcmQgYmxvY2tcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBhdnByaXZfbXBlZ2F1ZGlvX2RlY29kZV9oZWFkZXIoKE1QQURlY29kZUhlYWRlciAqKW0sIGhlYWRlcik7CisKKyAgICAgICAgaWYgKGNoICsgbS0+bmJfY2hhbm5lbHMgPiBhdmN0eC0+Y2hhbm5lbHMgfHwKKyAgICAgICAgICAgIHMtPmNvZmZbZnJdICsgbS0+bmJfY2hhbm5lbHMgPiBhdmN0eC0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZnJhbWUgY2hhbm5lbCBjb3VudCBleGNlZWRzIGNvZGVjICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbCBjb3VudFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBjaCArPSBtLT5uYl9jaGFubmVsczsKKworICAgICAgICBvdXRwdHJbMF0gPSBvdXRfc2FtcGxlc1tzLT5jb2ZmW2ZyXV07CisgICAgICAgIGlmIChtLT5uYl9jaGFubmVscyA+IDEpCisgICAgICAgICAgICBvdXRwdHJbMV0gPSBvdXRfc2FtcGxlc1tzLT5jb2ZmW2ZyXSArIDFdOworCisgICAgICAgIGlmICgocmV0ID0gbXBfZGVjb2RlX2ZyYW1lKG0sIG91dHB0ciwgYnVmLCBmc2l6ZSkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmYWlsZWQgdG8gZGVjb2RlIGNoYW5uZWwgJWRcbiIsIGNoKTsKKyAgICAgICAgICAgIG1lbXNldChvdXRwdHJbMF0sIDAsIE1QQV9GUkFNRV9TSVpFKnNpemVvZihPVVRfSU5UKSk7CisgICAgICAgICAgICBpZiAobS0+bmJfY2hhbm5lbHMgPiAxKQorICAgICAgICAgICAgICAgIG1lbXNldChvdXRwdHJbMV0sIDAsIE1QQV9GUkFNRV9TSVpFKnNpemVvZihPVVRfSU5UKSk7CisgICAgICAgICAgICByZXQgPSBtLT5uYl9jaGFubmVscyAqIE1QQV9GUkFNRV9TSVpFKnNpemVvZihPVVRfSU5UKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dF9zaXplICs9IHJldDsKKyAgICAgICAgYnVmICAgICAgKz0gZnNpemU7CisgICAgICAgIGxlbiAgICAgIC09IGZzaXplOworCisgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSArPSBtLT5iaXRfcmF0ZTsKKyAgICB9CisgICAgaWYgKGNoICE9IGF2Y3R4LT5jaGFubmVscykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImZhaWxlZCB0byBkZWNvZGUgYWxsIGNoYW5uZWxzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogdXBkYXRlIGNvZGVjIGluZm8gKi8KKyAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBzLT5tcDNkZWNjdHhbMF0tPnNhbXBsZV9yYXRlOworCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBvdXRfc2l6ZSAvIChhdmN0eC0+Y2hhbm5lbHMgKiBzaXplb2YoT1VUX0lOVCkpOworICAgICpnb3RfZnJhbWVfcHRyICAgID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKyNlbmRpZiAvKiBDT05GSUdfTVAzT040X0RFQ09ERVIgfHwgQ09ORklHX01QM09ONEZMT0FUX0RFQ09ERVIgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RlY2hlYWRlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjaGVhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiMTk1NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RlY2hlYWRlci5jCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogTVBFRyBBdWRpbyBoZWFkZXIgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNUEVHIEF1ZGlvIGhlYWRlciBkZWNvZGVyLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibXBlZ2F1ZGlvLmgiCisjaW5jbHVkZSAibXBlZ2F1ZGlvZGF0YS5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RlY2hlYWRlci5oIgorCisKK2ludCBhdnByaXZfbXBlZ2F1ZGlvX2RlY29kZV9oZWFkZXIoTVBBRGVjb2RlSGVhZGVyICpzLCB1aW50MzJfdCBoZWFkZXIpCit7CisgICAgaW50IHNhbXBsZV9yYXRlLCBmcmFtZV9zaXplLCBtcGVnMjUsIHBhZGRpbmc7CisgICAgaW50IHNhbXBsZV9yYXRlX2luZGV4LCBiaXRyYXRlX2luZGV4OworICAgIGlmIChoZWFkZXIgJiAoMTw8MjApKSB7CisgICAgICAgIHMtPmxzZiA9IChoZWFkZXIgJiAoMTw8MTkpKSA/IDAgOiAxOworICAgICAgICBtcGVnMjUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmxzZiA9IDE7CisgICAgICAgIG1wZWcyNSA9IDE7CisgICAgfQorCisgICAgcy0+bGF5ZXIgPSA0IC0gKChoZWFkZXIgPj4gMTcpICYgMyk7CisgICAgLyogZXh0cmFjdCBmcmVxdWVuY3kgKi8KKyAgICBzYW1wbGVfcmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTApICYgMzsKKyAgICBpZiAoc2FtcGxlX3JhdGVfaW5kZXggPj0gRkZfQVJSQVlfRUxFTVMoYXZwcml2X21wYV9mcmVxX3RhYikpCisgICAgICAgIHNhbXBsZV9yYXRlX2luZGV4ID0gMDsKKyAgICBzYW1wbGVfcmF0ZSA9IGF2cHJpdl9tcGFfZnJlcV90YWJbc2FtcGxlX3JhdGVfaW5kZXhdID4+IChzLT5sc2YgKyBtcGVnMjUpOworICAgIHNhbXBsZV9yYXRlX2luZGV4ICs9IDMgKiAocy0+bHNmICsgbXBlZzI1KTsKKyAgICBzLT5zYW1wbGVfcmF0ZV9pbmRleCA9IHNhbXBsZV9yYXRlX2luZGV4OworICAgIHMtPmVycm9yX3Byb3RlY3Rpb24gPSAoKGhlYWRlciA+PiAxNikgJiAxKSBeIDE7CisgICAgcy0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKworICAgIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4ZjsKKyAgICBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDE7CisgICAgLy9leHRlbnNpb24gPSAoaGVhZGVyID4+IDgpICYgMTsKKyAgICBzLT5tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisgICAgcy0+bW9kZV9leHQgPSAoaGVhZGVyID4+IDQpICYgMzsKKyAgICAvL2NvcHlyaWdodCA9IChoZWFkZXIgPj4gMykgJiAxOworICAgIC8vb3JpZ2luYWwgPSAoaGVhZGVyID4+IDIpICYgMTsKKyAgICAvL2VtcGhhc2lzID0gaGVhZGVyICYgMzsKKworICAgIGlmIChzLT5tb2RlID09IE1QQV9NT05PKQorICAgICAgICBzLT5uYl9jaGFubmVscyA9IDE7CisgICAgZWxzZQorICAgICAgICBzLT5uYl9jaGFubmVscyA9IDI7CisKKyAgICBpZiAoYml0cmF0ZV9pbmRleCAhPSAwKSB7CisgICAgICAgIGZyYW1lX3NpemUgPSBhdnByaXZfbXBhX2JpdHJhdGVfdGFiW3MtPmxzZl1bcy0+bGF5ZXIgLSAxXVtiaXRyYXRlX2luZGV4XTsKKyAgICAgICAgcy0+Yml0X3JhdGUgPSBmcmFtZV9zaXplICogMTAwMDsKKyAgICAgICAgc3dpdGNoKHMtPmxheWVyKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGZyYW1lX3NpemUgPSAoZnJhbWVfc2l6ZSAqIDEyMDAwKSAvIHNhbXBsZV9yYXRlOworICAgICAgICAgICAgZnJhbWVfc2l6ZSA9IChmcmFtZV9zaXplICsgcGFkZGluZykgKiA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGZyYW1lX3NpemUgPSAoZnJhbWVfc2l6ZSAqIDE0NDAwMCkgLyBzYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIGZyYW1lX3NpemUgKz0gcGFkZGluZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBmcmFtZV9zaXplID0gKGZyYW1lX3NpemUgKiAxNDQwMDApIC8gKHNhbXBsZV9yYXRlIDw8IHMtPmxzZik7CisgICAgICAgICAgICBmcmFtZV9zaXplICs9IHBhZGRpbmc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLT5mcmFtZV9zaXplID0gZnJhbWVfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBpZiBubyBmcmFtZSBzaXplIGNvbXB1dGVkLCBzaWduYWwgaXQgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisjaWYgZGVmaW5lZChERUJVRykKKyAgICBhdl9kbG9nKE5VTEwsICJsYXllciVkLCAlZCBIeiwgJWQga2JpdHMvcywgIiwKKyAgICAgICAgICAgcy0+bGF5ZXIsIHMtPnNhbXBsZV9yYXRlLCBzLT5iaXRfcmF0ZSk7CisgICAgaWYgKHMtPm5iX2NoYW5uZWxzID09IDIpIHsKKyAgICAgICAgaWYgKHMtPmxheWVyID09IDMpIHsKKyAgICAgICAgICAgIGlmIChzLT5tb2RlX2V4dCAmIE1PREVfRVhUX01TX1NURVJFTykKKyAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJtcy0iKTsKKyAgICAgICAgICAgIGlmIChzLT5tb2RlX2V4dCAmIE1PREVfRVhUX0lfU1RFUkVPKQorICAgICAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgImktIik7CisgICAgICAgIH0KKyAgICAgICAgYXZfZGxvZyhOVUxMLCAic3RlcmVvIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAibW9ubyIpOworICAgIH0KKyAgICBhdl9kbG9nKE5VTEwsICJcbiIpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdnByaXZfbXBhX2RlY29kZV9oZWFkZXIyKHVpbnQzMl90IGhlYWQsIGludCAqc2FtcGxlX3JhdGUsIGludCAqY2hhbm5lbHMsIGludCAqZnJhbWVfc2l6ZSwgaW50ICpiaXRfcmF0ZSwgZW51bSBBVkNvZGVjSUQgKmNvZGVjX2lkKQoreworICAgIE1QQURlY29kZUhlYWRlciBzMSwgKnMgPSAmczE7CisKKyAgICBpZiAoZmZfbXBhX2NoZWNrX2hlYWRlcihoZWFkKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoYXZwcml2X21wZWdhdWRpb19kZWNvZGVfaGVhZGVyKHMsIGhlYWQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHN3aXRjaChzLT5sYXllcikgeworICAgIGNhc2UgMToKKyAgICAgICAgKmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVAxOworICAgICAgICAqZnJhbWVfc2l6ZSA9IDM4NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICAqY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUDI7CisgICAgICAgICpmcmFtZV9zaXplID0gMTE1MjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDM6CisgICAgICAgICpjb2RlY19pZCA9IEFWX0NPREVDX0lEX01QMzsKKyAgICAgICAgaWYgKHMtPmxzZikKKyAgICAgICAgICAgICpmcmFtZV9zaXplID0gNTc2OworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IDExNTI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgICpzYW1wbGVfcmF0ZSA9IHMtPnNhbXBsZV9yYXRlOworICAgICpjaGFubmVscyA9IHMtPm5iX2NoYW5uZWxzOworICAgICpiaXRfcmF0ZSA9IHMtPmJpdF9yYXRlOworICAgIHJldHVybiBzLT5mcmFtZV9zaXplOworfQorCitpbnQgYXZwcml2X21wYV9kZWNvZGVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdWludDMyX3QgaGVhZCwgaW50ICpzYW1wbGVfcmF0ZSwgaW50ICpjaGFubmVscywgaW50ICpmcmFtZV9zaXplLCBpbnQgKmJpdF9yYXRlKQoreworICAgIHJldHVybiBhdnByaXZfbXBhX2RlY29kZV9oZWFkZXIyKGhlYWQsIHNhbXBsZV9yYXRlLCBjaGFubmVscywgZnJhbWVfc2l6ZSwgYml0X3JhdGUsICZhdmN0eC0+Y29kZWNfaWQpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjaGVhZGVyLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9kZWNoZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRiODVmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjaGVhZGVyLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIE1QRUcgQXVkaW8gaGVhZGVyIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVBFRyBBdWRpbyBoZWFkZXIgZGVjb2Rlci4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTVBFR0FVRElPREVDSEVBREVSX0gKKyNkZWZpbmUgQVZDT0RFQ19NUEVHQVVESU9ERUNIRUFERVJfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCisjZGVmaW5lIE1QM19NQVNLIDB4RkZGRTBDQ0YKKworI2RlZmluZSBNUEFfREVDT0RFX0hFQURFUiBcCisgICAgaW50IGZyYW1lX3NpemU7IFwKKyAgICBpbnQgZXJyb3JfcHJvdGVjdGlvbjsgXAorICAgIGludCBsYXllcjsgXAorICAgIGludCBzYW1wbGVfcmF0ZTsgXAorICAgIGludCBzYW1wbGVfcmF0ZV9pbmRleDsgLyogYmV0d2VlbiAwIGFuZCA4ICovIFwKKyAgICBpbnQgYml0X3JhdGU7IFwKKyAgICBpbnQgbmJfY2hhbm5lbHM7IFwKKyAgICBpbnQgbW9kZTsgXAorICAgIGludCBtb2RlX2V4dDsgXAorICAgIGludCBsc2Y7CisKK3R5cGVkZWYgc3RydWN0IE1QQURlY29kZUhlYWRlciB7CisgIE1QQV9ERUNPREVfSEVBREVSCit9IE1QQURlY29kZUhlYWRlcjsKKworLyogaGVhZGVyIGRlY29kaW5nLiBNVVNUIGNoZWNrIHRoZSBoZWFkZXIgYmVmb3JlIGJlY2F1c2Ugbm8KKyAgIGNvbnNpc3RlbmN5IGNoZWNrIGlzIGRvbmUgdGhlcmUuIFJldHVybiAxIGlmIGZyZWUgZm9ybWF0IGZvdW5kIGFuZAorICAgdGhhdCB0aGUgZnJhbWUgc2l6ZSBtdXN0IGJlIGNvbXB1dGVkIGV4dGVybmFsbHkgKi8KK2ludCBhdnByaXZfbXBlZ2F1ZGlvX2RlY29kZV9oZWFkZXIoTVBBRGVjb2RlSGVhZGVyICpzLCB1aW50MzJfdCBoZWFkZXIpOworCisvKiB1c2VmdWwgaGVscGVyIHRvIGdldCBtcGVnIGF1ZGlvIHN0cmVhbSBpbmZvcy4gUmV0dXJuIC0xIGlmIGVycm9yIGluCisgICBoZWFkZXIsIG90aGVyd2lzZSB0aGUgY29kZWQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLworaW50IGF2cHJpdl9tcGFfZGVjb2RlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQzMl90IGhlYWQsIGludCAqc2FtcGxlX3JhdGUsIGludCAqY2hhbm5lbHMsIGludCAqZnJhbWVfc2l6ZSwgaW50ICpiaXRyYXRlKTsKKworaW50IGF2cHJpdl9tcGFfZGVjb2RlX2hlYWRlcjIodWludDMyX3QgaGVhZCwgaW50ICpzYW1wbGVfcmF0ZSwgaW50ICpjaGFubmVscywgaW50ICpmcmFtZV9zaXplLCBpbnQgKmJpdHJhdGUsIGVudW0gQVZDb2RlY0lEICpjb2RlY19pZCk7CisKKy8qIGZhc3QgaGVhZGVyIGNoZWNrIGZvciByZXN5bmMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZmX21wYV9jaGVja19oZWFkZXIodWludDMyX3QgaGVhZGVyKXsKKyAgICAvKiBoZWFkZXIgKi8KKyAgICBpZiAoKGhlYWRlciAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBsYXllciBjaGVjayAqLworICAgIGlmICgoaGVhZGVyICYgKDM8PDE3KSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIGJpdCByYXRlICovCisgICAgaWYgKChoZWFkZXIgJiAoMHhmPDwxMikpID09IDB4Zjw8MTIpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBmcmVxdWVuY3kgKi8KKyAgICBpZiAoKGhlYWRlciAmICgzPDwxMCkpID09IDM8PDEwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX01QRUdBVURJT0RFQ0hFQURFUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9kZWN0YWIuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RlY3RhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjY2QxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9kZWN0YWIuaApAQCAtMCwwICsxLDYxNSBAQAorLyoKKyAqIE1QRUcgQXVkaW8gZGVjb2RlcgorICogY29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBtcGVnIGF1ZGlvIGxheWVyIGRlY29kZXIgdGFibGVzLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NUEVHQVVESU9ERUNUQUJfSAorI2RlZmluZSBBVkNPREVDX01QRUdBVURJT0RFQ1RBQl9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgIm1wZWdhdWRpby5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGxheWVyIDMgdGFibGVzICovCisKKy8qIGxheWVyIDMgaHVmZm1hbiB0YWJsZXMgKi8KK3R5cGVkZWYgc3RydWN0IEh1ZmZUYWJsZSB7CisgICAgaW50IHhzaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKmJpdHM7CisgICAgY29uc3QgdWludDE2X3QgKmNvZGVzOworfSBIdWZmVGFibGU7CisKKy8qIGxheWVyMyBzY2FsZSBmYWN0b3Igc2l6ZSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2xlbl90YWJsZVsyXVsxNl0gPSB7CisgICAgeyAwLCAwLCAwLCAwLCAzLCAxLCAxLCAxLCAyLCAyLCAyLCAzLCAzLCAzLCA0LCA0IH0sCisgICAgeyAwLCAxLCAyLCAzLCAwLCAxLCAyLCAzLCAxLCAyLCAzLCAxLCAyLCAzLCAyLCAzIH0sCit9OworCisvKiBudW1iZXIgb2YgbHNmIHNjYWxlIGZhY3RvcnMgZm9yIGEgZ2l2ZW4gc2l6ZSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbHNmX25zZl90YWJsZVs2XVszXVs0XSA9IHsKKyAgICB7IHsgIDYsICA1LCAgNSwgNSB9LCB7ICA5LCAgOSwgIDksIDkgfSwgeyAgNiwgIDksICA5LCA5IH0gfSwKKyAgICB7IHsgIDYsICA1LCAgNywgMyB9LCB7ICA5LCAgOSwgMTIsIDYgfSwgeyAgNiwgIDksIDEyLCA2IH0gfSwKKyAgICB7IHsgMTEsIDEwLCAgMCwgMCB9LCB7IDE4LCAxOCwgIDAsIDAgfSwgeyAxNSwgMTgsICAwLCAwIH0gfSwKKyAgICB7IHsgIDcsICA3LCAgNywgMCB9LCB7IDEyLCAxMiwgMTIsIDAgfSwgeyAgNiwgMTUsIDEyLCAwIH0gfSwKKyAgICB7IHsgIDYsICA2LCAgNiwgMyB9LCB7IDEyLCAgOSwgIDksIDYgfSwgeyAgNiwgMTIsICA5LCA2IH0gfSwKKyAgICB7IHsgIDgsICA4LCAgNSwgMCB9LCB7IDE1LCAxMiwgIDksIDAgfSwgeyAgNiwgMTgsICA5LCAwIH0gfSwKK307CisKKy8qIG1wZWdhdWRpbyBsYXllciAzIGh1ZmZtYW4gdGFibGVzICovCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBtcGFfaHVmZmNvZGVzXzFbNF0gPSB7CisgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBhX2h1ZmZiaXRzXzFbNF0gPSB7CisgIDEsICAzLCAgMiwgIDMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgbXBhX2h1ZmZjb2Rlc18yWzldID0geworIDB4MDAwMSwgMHgwMDAyLCAweDAwMDEsIDB4MDAwMywgMHgwMDAxLCAweDAwMDEsIDB4MDAwMywgMHgwMDAyLAorIDB4MDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYV9odWZmYml0c18yWzldID0geworICAxLCAgMywgIDYsICAzLCAgMywgIDUsICA1LCAgNSwKKyAgNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBtcGFfaHVmZmNvZGVzXzNbOV0gPSB7CisgMHgwMDAzLCAweDAwMDIsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAzLCAweDAwMDIsCisgMHgwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBhX2h1ZmZiaXRzXzNbOV0gPSB7CisgIDIsICAyLCAgNiwgIDMsICAyLCAgNSwgIDUsICA1LAorICA2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG1wYV9odWZmY29kZXNfNVsxNl0gPSB7CisgMHgwMDAxLCAweDAwMDIsIDB4MDAwNiwgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwgMHgwMDA0LCAweDAwMDQsCisgMHgwMDA3LCAweDAwMDUsIDB4MDAwNywgMHgwMDAxLCAweDAwMDYsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGFfaHVmZmJpdHNfNVsxNl0gPSB7CisgIDEsICAzLCAgNiwgIDcsICAzLCAgMywgIDYsICA3LAorICA2LCAgNiwgIDcsICA4LCAgNywgIDYsICA3LCAgOCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBtcGFfaHVmZmNvZGVzXzZbMTZdID0geworIDB4MDAwNywgMHgwMDAzLCAweDAwMDUsIDB4MDAwMSwgMHgwMDA2LCAweDAwMDIsIDB4MDAwMywgMHgwMDAyLAorIDB4MDAwNSwgMHgwMDA0LCAweDAwMDQsIDB4MDAwMSwgMHgwMDAzLCAweDAwMDMsIDB4MDAwMiwgMHgwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBhX2h1ZmZiaXRzXzZbMTZdID0geworICAzLCAgMywgIDUsICA3LCAgMywgIDIsICA0LCAgNSwKKyAgNCwgIDQsICA1LCAgNiwgIDYsICA1LCAgNiwgIDcsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgbXBhX2h1ZmZjb2Rlc183WzM2XSA9IHsKKyAweDAwMDEsIDB4MDAwMiwgMHgwMDBhLCAweDAwMTMsIDB4MDAxMCwgMHgwMDBhLCAweDAwMDMsIDB4MDAwMywKKyAweDAwMDcsIDB4MDAwYSwgMHgwMDA1LCAweDAwMDMsIDB4MDAwYiwgMHgwMDA0LCAweDAwMGQsIDB4MDAxMSwKKyAweDAwMDgsIDB4MDAwNCwgMHgwMDBjLCAweDAwMGIsIDB4MDAxMiwgMHgwMDBmLCAweDAwMGIsIDB4MDAwMiwKKyAweDAwMDcsIDB4MDAwNiwgMHgwMDA5LCAweDAwMGUsIDB4MDAwMywgMHgwMDAxLCAweDAwMDYsIDB4MDAwNCwKKyAweDAwMDUsIDB4MDAwMywgMHgwMDAyLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGFfaHVmZmJpdHNfN1szNl0gPSB7CisgIDEsICAzLCAgNiwgIDgsICA4LCAgOSwgIDMsICA0LAorICA2LCAgNywgIDcsICA4LCAgNiwgIDUsICA3LCAgOCwKKyAgOCwgIDksICA3LCAgNywgIDgsICA5LCAgOSwgIDksCisgIDcsICA3LCAgOCwgIDksICA5LCAxMCwgIDgsICA4LAorICA5LCAxMCwgMTAsIDEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG1wYV9odWZmY29kZXNfOFszNl0gPSB7CisgMHgwMDAzLCAweDAwMDQsIDB4MDAwNiwgMHgwMDEyLCAweDAwMGMsIDB4MDAwNSwgMHgwMDA1LCAweDAwMDEsCisgMHgwMDAyLCAweDAwMTAsIDB4MDAwOSwgMHgwMDAzLCAweDAwMDcsIDB4MDAwMywgMHgwMDA1LCAweDAwMGUsCisgMHgwMDA3LCAweDAwMDMsIDB4MDAxMywgMHgwMDExLCAweDAwMGYsIDB4MDAwZCwgMHgwMDBhLCAweDAwMDQsCisgMHgwMDBkLCAweDAwMDUsIDB4MDAwOCwgMHgwMDBiLCAweDAwMDUsIDB4MDAwMSwgMHgwMDBjLCAweDAwMDQsCisgMHgwMDA0LCAweDAwMDEsIDB4MDAwMSwgMHgwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBhX2h1ZmZiaXRzXzhbMzZdID0geworICAyLCAgMywgIDYsICA4LCAgOCwgIDksICAzLCAgMiwKKyAgNCwgIDgsICA4LCAgOCwgIDYsICA0LCAgNiwgIDgsCisgIDgsICA5LCAgOCwgIDgsICA4LCAgOSwgIDksIDEwLAorICA4LCAgNywgIDgsICA5LCAxMCwgMTAsICA5LCAgOCwKKyAgOSwgIDksIDExLCAxMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBtcGFfaHVmZmNvZGVzXzlbMzZdID0geworIDB4MDAwNywgMHgwMDA1LCAweDAwMDksIDB4MDAwZSwgMHgwMDBmLCAweDAwMDcsIDB4MDAwNiwgMHgwMDA0LAorIDB4MDAwNSwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywgMHgwMDA3LCAweDAwMDYsIDB4MDAwOCwgMHgwMDA4LAorIDB4MDAwOCwgMHgwMDA1LCAweDAwMGYsIDB4MDAwNiwgMHgwMDA5LCAweDAwMGEsIDB4MDAwNSwgMHgwMDAxLAorIDB4MDAwYiwgMHgwMDA3LCAweDAwMDksIDB4MDAwNiwgMHgwMDA0LCAweDAwMDEsIDB4MDAwZSwgMHgwMDA0LAorIDB4MDAwNiwgMHgwMDAyLCAweDAwMDYsIDB4MDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYV9odWZmYml0c185WzM2XSA9IHsKKyAgMywgIDMsICA1LCAgNiwgIDgsICA5LCAgMywgIDMsCisgIDQsICA1LCAgNiwgIDgsICA0LCAgNCwgIDUsICA2LAorICA3LCAgOCwgIDYsICA1LCAgNiwgIDcsICA3LCAgOCwKKyAgNywgIDYsICA3LCAgNywgIDgsICA5LCAgOCwgIDcsCisgIDgsICA4LCAgOSwgIDksCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgbXBhX2h1ZmZjb2Rlc18xMFs2NF0gPSB7CisgMHgwMDAxLCAweDAwMDIsIDB4MDAwYSwgMHgwMDE3LCAweDAwMjMsIDB4MDAxZSwgMHgwMDBjLCAweDAwMTEsCisgMHgwMDAzLCAweDAwMDMsIDB4MDAwOCwgMHgwMDBjLCAweDAwMTIsIDB4MDAxNSwgMHgwMDBjLCAweDAwMDcsCisgMHgwMDBiLCAweDAwMDksIDB4MDAwZiwgMHgwMDE1LCAweDAwMjAsIDB4MDAyOCwgMHgwMDEzLCAweDAwMDYsCisgMHgwMDBlLCAweDAwMGQsIDB4MDAxNiwgMHgwMDIyLCAweDAwMmUsIDB4MDAxNywgMHgwMDEyLCAweDAwMDcsCisgMHgwMDE0LCAweDAwMTMsIDB4MDAyMSwgMHgwMDJmLCAweDAwMWIsIDB4MDAxNiwgMHgwMDA5LCAweDAwMDMsCisgMHgwMDFmLCAweDAwMTYsIDB4MDAyOSwgMHgwMDFhLCAweDAwMTUsIDB4MDAxNCwgMHgwMDA1LCAweDAwMDMsCisgMHgwMDBlLCAweDAwMGQsIDB4MDAwYSwgMHgwMDBiLCAweDAwMTAsIDB4MDAwNiwgMHgwMDA1LCAweDAwMDEsCisgMHgwMDA5LCAweDAwMDgsIDB4MDAwNywgMHgwMDA4LCAweDAwMDQsIDB4MDAwNCwgMHgwMDAyLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGFfaHVmZmJpdHNfMTBbNjRdID0geworICAxLCAgMywgIDYsICA4LCAgOSwgIDksICA5LCAxMCwKKyAgMywgIDQsICA2LCAgNywgIDgsICA5LCAgOCwgIDgsCisgIDYsICA2LCAgNywgIDgsICA5LCAxMCwgIDksICA5LAorICA3LCAgNywgIDgsICA5LCAxMCwgMTAsICA5LCAxMCwKKyAgOCwgIDgsICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTAsIDExLAorICA4LCAgOCwgIDksIDEwLCAxMCwgMTAsIDExLCAxMSwKKyAgOSwgIDgsICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgbXBhX2h1ZmZjb2Rlc18xMVs2NF0gPSB7CisgMHgwMDAzLCAweDAwMDQsIDB4MDAwYSwgMHgwMDE4LCAweDAwMjIsIDB4MDAyMSwgMHgwMDE1LCAweDAwMGYsCisgMHgwMDA1LCAweDAwMDMsIDB4MDAwNCwgMHgwMDBhLCAweDAwMjAsIDB4MDAxMSwgMHgwMDBiLCAweDAwMGEsCisgMHgwMDBiLCAweDAwMDcsIDB4MDAwZCwgMHgwMDEyLCAweDAwMWUsIDB4MDAxZiwgMHgwMDE0LCAweDAwMDUsCisgMHgwMDE5LCAweDAwMGIsIDB4MDAxMywgMHgwMDNiLCAweDAwMWIsIDB4MDAxMiwgMHgwMDBjLCAweDAwMDUsCisgMHgwMDIzLCAweDAwMjEsIDB4MDAxZiwgMHgwMDNhLCAweDAwMWUsIDB4MDAxMCwgMHgwMDA3LCAweDAwMDUsCisgMHgwMDFjLCAweDAwMWEsIDB4MDAyMCwgMHgwMDEzLCAweDAwMTEsIDB4MDAwZiwgMHgwMDA4LCAweDAwMGUsCisgMHgwMDBlLCAweDAwMGMsIDB4MDAwOSwgMHgwMDBkLCAweDAwMGUsIDB4MDAwOSwgMHgwMDA0LCAweDAwMDEsCisgMHgwMDBiLCAweDAwMDQsIDB4MDAwNiwgMHgwMDA2LCAweDAwMDYsIDB4MDAwMywgMHgwMDAyLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGFfaHVmZmJpdHNfMTFbNjRdID0geworICAyLCAgMywgIDUsICA3LCAgOCwgIDksICA4LCAgOSwKKyAgMywgIDMsICA0LCAgNiwgIDgsICA4LCAgNywgIDgsCisgIDUsICA1LCAgNiwgIDcsICA4LCAgOSwgIDgsICA4LAorICA3LCAgNiwgIDcsICA5LCAgOCwgMTAsICA4LCAgOSwKKyAgOCwgIDgsICA4LCAgOSwgIDksIDEwLCAgOSwgMTAsCisgIDgsICA4LCAgOSwgMTAsIDEwLCAxMSwgMTAsIDExLAorICA4LCAgNywgIDcsICA4LCAgOSwgMTAsIDEwLCAxMCwKKyAgOCwgIDcsICA4LCAgOSwgMTAsIDEwLCAxMCwgMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgbXBhX2h1ZmZjb2Rlc18xMls2NF0gPSB7CisgMHgwMDA5LCAweDAwMDYsIDB4MDAxMCwgMHgwMDIxLCAweDAwMjksIDB4MDAyNywgMHgwMDI2LCAweDAwMWEsCisgMHgwMDA3LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA5LCAweDAwMTcsIDB4MDAxMCwgMHgwMDFhLCAweDAwMGIsCisgMHgwMDExLCAweDAwMDcsIDB4MDAwYiwgMHgwMDBlLCAweDAwMTUsIDB4MDAxZSwgMHgwMDBhLCAweDAwMDcsCisgMHgwMDExLCAweDAwMGEsIDB4MDAwZiwgMHgwMDBjLCAweDAwMTIsIDB4MDAxYywgMHgwMDBlLCAweDAwMDUsCisgMHgwMDIwLCAweDAwMGQsIDB4MDAxNiwgMHgwMDEzLCAweDAwMTIsIDB4MDAxMCwgMHgwMDA5LCAweDAwMDUsCisgMHgwMDI4LCAweDAwMTEsIDB4MDAxZiwgMHgwMDFkLCAweDAwMTEsIDB4MDAwZCwgMHgwMDA0LCAweDAwMDIsCisgMHgwMDFiLCAweDAwMGMsIDB4MDAwYiwgMHgwMDBmLCAweDAwMGEsIDB4MDAwNywgMHgwMDA0LCAweDAwMDEsCisgMHgwMDFiLCAweDAwMGMsIDB4MDAwOCwgMHgwMDBjLCAweDAwMDYsIDB4MDAwMywgMHgwMDAxLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGFfaHVmZmJpdHNfMTJbNjRdID0geworICA0LCAgMywgIDUsICA3LCAgOCwgIDksICA5LCAgOSwKKyAgMywgIDMsICA0LCAgNSwgIDcsICA3LCAgOCwgIDgsCisgIDUsICA0LCAgNSwgIDYsICA3LCAgOCwgIDcsICA4LAorICA2LCAgNSwgIDYsICA2LCAgNywgIDgsICA4LCAgOCwKKyAgNywgIDYsICA3LCAgNywgIDgsICA4LCAgOCwgIDksCisgIDgsICA3LCAgOCwgIDgsICA4LCAgOSwgIDgsICA5LAorICA4LCAgNywgIDcsICA4LCAgOCwgIDksICA5LCAxMCwKKyAgOSwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgbXBhX2h1ZmZjb2Rlc18xM1syNTZdID0geworIDB4MDAwMSwgMHgwMDA1LCAweDAwMGUsIDB4MDAxNSwgMHgwMDIyLCAweDAwMzMsIDB4MDAyZSwgMHgwMDQ3LAorIDB4MDAyYSwgMHgwMDM0LCAweDAwNDQsIDB4MDAzNCwgMHgwMDQzLCAweDAwMmMsIDB4MDAyYiwgMHgwMDEzLAorIDB4MDAwMywgMHgwMDA0LCAweDAwMGMsIDB4MDAxMywgMHgwMDFmLCAweDAwMWEsIDB4MDAyYywgMHgwMDIxLAorIDB4MDAxZiwgMHgwMDE4LCAweDAwMjAsIDB4MDAxOCwgMHgwMDFmLCAweDAwMjMsIDB4MDAxNiwgMHgwMDBlLAorIDB4MDAwZiwgMHgwMDBkLCAweDAwMTcsIDB4MDAyNCwgMHgwMDNiLCAweDAwMzEsIDB4MDA0ZCwgMHgwMDQxLAorIDB4MDAxZCwgMHgwMDI4LCAweDAwMWUsIDB4MDAyOCwgMHgwMDFiLCAweDAwMjEsIDB4MDAyYSwgMHgwMDEwLAorIDB4MDAxNiwgMHgwMDE0LCAweDAwMjUsIDB4MDAzZCwgMHgwMDM4LCAweDAwNGYsIDB4MDA0OSwgMHgwMDQwLAorIDB4MDAyYiwgMHgwMDRjLCAweDAwMzgsIDB4MDAyNSwgMHgwMDFhLCAweDAwMWYsIDB4MDAxOSwgMHgwMDBlLAorIDB4MDAyMywgMHgwMDEwLCAweDAwM2MsIDB4MDAzOSwgMHgwMDYxLCAweDAwNGIsIDB4MDA3MiwgMHgwMDViLAorIDB4MDAzNiwgMHgwMDQ5LCAweDAwMzcsIDB4MDAyOSwgMHgwMDMwLCAweDAwMzUsIDB4MDAxNywgMHgwMDE4LAorIDB4MDAzYSwgMHgwMDFiLCAweDAwMzIsIDB4MDA2MCwgMHgwMDRjLCAweDAwNDYsIDB4MDA1ZCwgMHgwMDU0LAorIDB4MDA0ZCwgMHgwMDNhLCAweDAwNGYsIDB4MDAxZCwgMHgwMDRhLCAweDAwMzEsIDB4MDAyOSwgMHgwMDExLAorIDB4MDAyZiwgMHgwMDJkLCAweDAwNGUsIDB4MDA0YSwgMHgwMDczLCAweDAwNWUsIDB4MDA1YSwgMHgwMDRmLAorIDB4MDA0NSwgMHgwMDUzLCAweDAwNDcsIDB4MDAzMiwgMHgwMDNiLCAweDAwMjYsIDB4MDAyNCwgMHgwMDBmLAorIDB4MDA0OCwgMHgwMDIyLCAweDAwMzgsIDB4MDA1ZiwgMHgwMDVjLCAweDAwNTUsIDB4MDA1YiwgMHgwMDVhLAorIDB4MDA1NiwgMHgwMDQ5LCAweDAwNGQsIDB4MDA0MSwgMHgwMDMzLCAweDAwMmMsIDB4MDAyYiwgMHgwMDJhLAorIDB4MDAyYiwgMHgwMDE0LCAweDAwMWUsIDB4MDAyYywgMHgwMDM3LCAweDAwNGUsIDB4MDA0OCwgMHgwMDU3LAorIDB4MDA0ZSwgMHgwMDNkLCAweDAwMmUsIDB4MDAzNiwgMHgwMDI1LCAweDAwMWUsIDB4MDAxNCwgMHgwMDEwLAorIDB4MDAzNSwgMHgwMDE5LCAweDAwMjksIDB4MDAyNSwgMHgwMDJjLCAweDAwM2IsIDB4MDAzNiwgMHgwMDUxLAorIDB4MDA0MiwgMHgwMDRjLCAweDAwMzksIDB4MDAzNiwgMHgwMDI1LCAweDAwMTIsIDB4MDAyNywgMHgwMDBiLAorIDB4MDAyMywgMHgwMDIxLCAweDAwMWYsIDB4MDAzOSwgMHgwMDJhLCAweDAwNTIsIDB4MDA0OCwgMHgwMDUwLAorIDB4MDAyZiwgMHgwMDNhLCAweDAwMzcsIDB4MDAxNSwgMHgwMDE2LCAweDAwMWEsIDB4MDAyNiwgMHgwMDE2LAorIDB4MDAzNSwgMHgwMDE5LCAweDAwMTcsIDB4MDAyNiwgMHgwMDQ2LCAweDAwM2MsIDB4MDAzMywgMHgwMDI0LAorIDB4MDAzNywgMHgwMDFhLCAweDAwMjIsIDB4MDAxNywgMHgwMDFiLCAweDAwMGUsIDB4MDAwOSwgMHgwMDA3LAorIDB4MDAyMiwgMHgwMDIwLCAweDAwMWMsIDB4MDAyNywgMHgwMDMxLCAweDAwNGIsIDB4MDAxZSwgMHgwMDM0LAorIDB4MDAzMCwgMHgwMDI4LCAweDAwMzQsIDB4MDAxYywgMHgwMDEyLCAweDAwMTEsIDB4MDAwOSwgMHgwMDA1LAorIDB4MDAyZCwgMHgwMDE1LCAweDAwMjIsIDB4MDA0MCwgMHgwMDM4LCAweDAwMzIsIDB4MDAzMSwgMHgwMDJkLAorIDB4MDAxZiwgMHgwMDEzLCAweDAwMGMsIDB4MDAwZiwgMHgwMDBhLCAweDAwMDcsIDB4MDAwNiwgMHgwMDAzLAorIDB4MDAzMCwgMHgwMDE3LCAweDAwMTQsIDB4MDAyNywgMHgwMDI0LCAweDAwMjMsIDB4MDAzNSwgMHgwMDE1LAorIDB4MDAxMCwgMHgwMDE3LCAweDAwMGQsIDB4MDAwYSwgMHgwMDA2LCAweDAwMDEsIDB4MDAwNCwgMHgwMDAyLAorIDB4MDAxMCwgMHgwMDBmLCAweDAwMTEsIDB4MDAxYiwgMHgwMDE5LCAweDAwMTQsIDB4MDAxZCwgMHgwMDBiLAorIDB4MDAxMSwgMHgwMDBjLCAweDAwMTAsIDB4MDAwOCwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMCwgMHgwMDAxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBhX2h1ZmZiaXRzXzEzWzI1Nl0gPSB7CisgIDEsICA0LCAgNiwgIDcsICA4LCAgOSwgIDksIDEwLAorICA5LCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywKKyAgMywgIDQsICA2LCAgNywgIDgsICA4LCAgOSwgIDksCisgIDksICA5LCAxMCwgMTAsIDExLCAxMiwgMTIsIDEyLAorICA2LCAgNiwgIDcsICA4LCAgOSwgIDksIDEwLCAxMCwKKyAgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMywgMTMsCisgIDcsICA3LCAgOCwgIDksICA5LCAxMCwgMTAsIDEwLAorIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEzLCAxMywKKyAgOCwgIDcsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsCisgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LAorICA5LCAgOCwgIDksIDEwLCAxMCwgMTAsIDExLCAxMSwKKyAxMSwgMTEsIDEyLCAxMSwgMTMsIDEzLCAxNCwgMTQsCisgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLAorIDExLCAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwKKyAxMCwgIDksIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsCisgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTYsIDE2LAorICA5LCAgOCwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwKKyAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNSwgMTUsCisgMTAsICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDEzLAorIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE2LCAxNSwKKyAxMCwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsCisgMTIsIDEzLCAxNCwgMTMsIDE0LCAxNSwgMTYsIDE3LAorIDExLCAxMCwgMTAsIDExLCAxMiwgMTIsIDEyLCAxMiwKKyAxMywgMTMsIDEzLCAxNCwgMTUsIDE1LCAxNSwgMTYsCisgMTEsIDExLCAxMSwgMTIsIDEyLCAxMywgMTIsIDEzLAorIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwKKyAxMiwgMTEsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTUsIDE2LCAxNSwgMTYsIDE2LAorIDEzLCAxMiwgMTIsIDEzLCAxMywgMTMsIDE1LCAxNCwKKyAxNCwgMTcsIDE1LCAxNSwgMTUsIDE3LCAxNiwgMTYsCisgMTIsIDEyLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE0LAorIDE1LCAxNSwgMTYsIDE2LCAxOSwgMTgsIDE5LCAxNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBtcGFfaHVmZmNvZGVzXzE1WzI1Nl0gPSB7CisgMHgwMDA3LCAweDAwMGMsIDB4MDAxMiwgMHgwMDM1LCAweDAwMmYsIDB4MDA0YywgMHgwMDdjLCAweDAwNmMsCisgMHgwMDU5LCAweDAwN2IsIDB4MDA2YywgMHgwMDc3LCAweDAwNmIsIDB4MDA1MSwgMHgwMDdhLCAweDAwM2YsCisgMHgwMDBkLCAweDAwMDUsIDB4MDAxMCwgMHgwMDFiLCAweDAwMmUsIDB4MDAyNCwgMHgwMDNkLCAweDAwMzMsCisgMHgwMDJhLCAweDAwNDYsIDB4MDAzNCwgMHgwMDUzLCAweDAwNDEsIDB4MDAyOSwgMHgwMDNiLCAweDAwMjQsCisgMHgwMDEzLCAweDAwMTEsIDB4MDAwZiwgMHgwMDE4LCAweDAwMjksIDB4MDAyMiwgMHgwMDNiLCAweDAwMzAsCisgMHgwMDI4LCAweDAwNDAsIDB4MDAzMiwgMHgwMDRlLCAweDAwM2UsIDB4MDA1MCwgMHgwMDM4LCAweDAwMjEsCisgMHgwMDFkLCAweDAwMWMsIDB4MDAxOSwgMHgwMDJiLCAweDAwMjcsIDB4MDAzZiwgMHgwMDM3LCAweDAwNWQsCisgMHgwMDRjLCAweDAwM2IsIDB4MDA1ZCwgMHgwMDQ4LCAweDAwMzYsIDB4MDA0YiwgMHgwMDMyLCAweDAwMWQsCisgMHgwMDM0LCAweDAwMTYsIDB4MDAyYSwgMHgwMDI4LCAweDAwNDMsIDB4MDAzOSwgMHgwMDVmLCAweDAwNGYsCisgMHgwMDQ4LCAweDAwMzksIDB4MDA1OSwgMHgwMDQ1LCAweDAwMzEsIDB4MDA0MiwgMHgwMDJlLCAweDAwMWIsCisgMHgwMDRkLCAweDAwMjUsIDB4MDAyMywgMHgwMDQyLCAweDAwM2EsIDB4MDAzNCwgMHgwMDViLCAweDAwNGEsCisgMHgwMDNlLCAweDAwMzAsIDB4MDA0ZiwgMHgwMDNmLCAweDAwNWEsIDB4MDAzZSwgMHgwMDI4LCAweDAwMjYsCisgMHgwMDdkLCAweDAwMjAsIDB4MDAzYywgMHgwMDM4LCAweDAwMzIsIDB4MDA1YywgMHgwMDRlLCAweDAwNDEsCisgMHgwMDM3LCAweDAwNTcsIDB4MDA0NywgMHgwMDMzLCAweDAwNDksIDB4MDAzMywgMHgwMDQ2LCAweDAwMWUsCisgMHgwMDZkLCAweDAwMzUsIDB4MDAzMSwgMHgwMDVlLCAweDAwNTgsIDB4MDA0YiwgMHgwMDQyLCAweDAwN2EsCisgMHgwMDViLCAweDAwNDksIDB4MDAzOCwgMHgwMDJhLCAweDAwNDAsIDB4MDAyYywgMHgwMDE1LCAweDAwMTksCisgMHgwMDVhLCAweDAwMmIsIDB4MDAyOSwgMHgwMDRkLCAweDAwNDksIDB4MDAzZiwgMHgwMDM4LCAweDAwNWMsCisgMHgwMDRkLCAweDAwNDIsIDB4MDAyZiwgMHgwMDQzLCAweDAwMzAsIDB4MDAzNSwgMHgwMDI0LCAweDAwMTQsCisgMHgwMDQ3LCAweDAwMjIsIDB4MDA0MywgMHgwMDNjLCAweDAwM2EsIDB4MDAzMSwgMHgwMDU4LCAweDAwNGMsCisgMHgwMDQzLCAweDAwNmEsIDB4MDA0NywgMHgwMDM2LCAweDAwMjYsIDB4MDAyNywgMHgwMDE3LCAweDAwMGYsCisgMHgwMDZkLCAweDAwMzUsIDB4MDAzMywgMHgwMDJmLCAweDAwNWEsIDB4MDA1MiwgMHgwMDNhLCAweDAwMzksCisgMHgwMDMwLCAweDAwNDgsIDB4MDAzOSwgMHgwMDI5LCAweDAwMTcsIDB4MDAxYiwgMHgwMDNlLCAweDAwMDksCisgMHgwMDU2LCAweDAwMmEsIDB4MDAyOCwgMHgwMDI1LCAweDAwNDYsIDB4MDA0MCwgMHgwMDM0LCAweDAwMmIsCisgMHgwMDQ2LCAweDAwMzcsIDB4MDAyYSwgMHgwMDE5LCAweDAwMWQsIDB4MDAxMiwgMHgwMDBiLCAweDAwMGIsCisgMHgwMDc2LCAweDAwNDQsIDB4MDAxZSwgMHgwMDM3LCAweDAwMzIsIDB4MDAyZSwgMHgwMDRhLCAweDAwNDEsCisgMHgwMDMxLCAweDAwMjcsIDB4MDAxOCwgMHgwMDEwLCAweDAwMTYsIDB4MDAwZCwgMHgwMDBlLCAweDAwMDcsCisgMHgwMDViLCAweDAwMmMsIDB4MDAyNywgMHgwMDI2LCAweDAwMjIsIDB4MDAzZiwgMHgwMDM0LCAweDAwMmQsCisgMHgwMDFmLCAweDAwMzQsIDB4MDAxYywgMHgwMDEzLCAweDAwMGUsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDMsCisgMHgwMDdiLCAweDAwM2MsIDB4MDAzYSwgMHgwMDM1LCAweDAwMmYsIDB4MDAyYiwgMHgwMDIwLCAweDAwMTYsCisgMHgwMDI1LCAweDAwMTgsIDB4MDAxMSwgMHgwMDBjLCAweDAwMGYsIDB4MDAwYSwgMHgwMDAyLCAweDAwMDEsCisgMHgwMDQ3LCAweDAwMjUsIDB4MDAyMiwgMHgwMDFlLCAweDAwMWMsIDB4MDAxNCwgMHgwMDExLCAweDAwMWEsCisgMHgwMDE1LCAweDAwMTAsIDB4MDAwYSwgMHgwMDA2LCAweDAwMDgsIDB4MDAwNiwgMHgwMDAyLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGFfaHVmZmJpdHNfMTVbMjU2XSA9IHsKKyAgMywgIDQsICA1LCAgNywgIDcsICA4LCAgOSwgIDksCisgIDksIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEzLAorICA0LCAgMywgIDUsICA2LCAgNywgIDcsICA4LCAgOCwKKyAgOCwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsCisgIDUsICA1LCAgNSwgIDYsICA3LCAgNywgIDgsICA4LAorICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMSwKKyAgNiwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDksCisgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLAorICA3LCAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwKKyAgOSwgIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsCisgIDgsICA3LCAgNywgIDgsICA4LCAgOCwgIDksICA5LAorICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwKKyAgOSwgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksCisgIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLAorICA5LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAxMCwKKyAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsCisgIDksICA4LCAgOCwgIDksICA5LCAgOSwgIDksIDEwLAorIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMiwKKyAgOSwgIDgsICA5LCAgOSwgIDksICA5LCAxMCwgMTAsCisgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLAorIDEwLCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwKKyAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMywgMTIsCisgMTAsICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLAorIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMywKKyAxMSwgMTAsICA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsCisgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLAorIDExLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwKKyAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsCisgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEyLCAxMywKKyAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsCisgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG1wYV9odWZmY29kZXNfMTZbMjU2XSA9IHsKKyAweDAwMDEsIDB4MDAwNSwgMHgwMDBlLCAweDAwMmMsIDB4MDA0YSwgMHgwMDNmLCAweDAwNmUsIDB4MDA1ZCwKKyAweDAwYWMsIDB4MDA5NSwgMHgwMDhhLCAweDAwZjIsIDB4MDBlMSwgMHgwMGMzLCAweDAxNzgsIDB4MDAxMSwKKyAweDAwMDMsIDB4MDAwNCwgMHgwMDBjLCAweDAwMTQsIDB4MDAyMywgMHgwMDNlLCAweDAwMzUsIDB4MDAyZiwKKyAweDAwNTMsIDB4MDA0YiwgMHgwMDQ0LCAweDAwNzcsIDB4MDBjOSwgMHgwMDZiLCAweDAwY2YsIDB4MDAwOSwKKyAweDAwMGYsIDB4MDAwZCwgMHgwMDE3LCAweDAwMjYsIDB4MDA0MywgMHgwMDNhLCAweDAwNjcsIDB4MDA1YSwKKyAweDAwYTEsIDB4MDA0OCwgMHgwMDdmLCAweDAwNzUsIDB4MDA2ZSwgMHgwMGQxLCAweDAwY2UsIDB4MDAxMCwKKyAweDAwMmQsIDB4MDAxNSwgMHgwMDI3LCAweDAwNDUsIDB4MDA0MCwgMHgwMDcyLCAweDAwNjMsIDB4MDA1NywKKyAweDAwOWUsIDB4MDA4YywgMHgwMGZjLCAweDAwZDQsIDB4MDBjNywgMHgwMTgzLCAweDAxNmQsIDB4MDAxYSwKKyAweDAwNGIsIDB4MDAyNCwgMHgwMDQ0LCAweDAwNDEsIDB4MDA3MywgMHgwMDY1LCAweDAwYjMsIDB4MDBhNCwKKyAweDAwOWIsIDB4MDEwOCwgMHgwMGY2LCAweDAwZTIsIDB4MDE4YiwgMHgwMTdlLCAweDAxNmEsIDB4MDAwOSwKKyAweDAwNDIsIDB4MDAxZSwgMHgwMDNiLCAweDAwMzgsIDB4MDA2NiwgMHgwMGI5LCAweDAwYWQsIDB4MDEwOSwKKyAweDAwOGUsIDB4MDBmZCwgMHgwMGU4LCAweDAxOTAsIDB4MDE4NCwgMHgwMTdhLCAweDAxYmQsIDB4MDAxMCwKKyAweDAwNmYsIDB4MDAzNiwgMHgwMDM0LCAweDAwNjQsIDB4MDBiOCwgMHgwMGIyLCAweDAwYTAsIDB4MDA4NSwKKyAweDAxMDEsIDB4MDBmNCwgMHgwMGU0LCAweDAwZDksIDB4MDE4MSwgMHgwMTZlLCAweDAyY2IsIDB4MDAwYSwKKyAweDAwNjIsIDB4MDAzMCwgMHgwMDViLCAweDAwNTgsIDB4MDBhNSwgMHgwMDlkLCAweDAwOTQsIDB4MDEwNSwKKyAweDAwZjgsIDB4MDE5NywgMHgwMThkLCAweDAxNzQsIDB4MDE3YywgMHgwMzc5LCAweDAzNzQsIDB4MDAwOCwKKyAweDAwNTUsIDB4MDA1NCwgMHgwMDUxLCAweDAwOWYsIDB4MDA5YywgMHgwMDhmLCAweDAxMDQsIDB4MDBmOSwKKyAweDAxYWIsIDB4MDE5MSwgMHgwMTg4LCAweDAxN2YsIDB4MDJkNywgMHgwMmM5LCAweDAyYzQsIDB4MDAwNywKKyAweDAwOWEsIDB4MDA0YywgMHgwMDQ5LCAweDAwOGQsIDB4MDA4MywgMHgwMTAwLCAweDAwZjUsIDB4MDFhYSwKKyAweDAxOTYsIDB4MDE4YSwgMHgwMTgwLCAweDAyZGYsIDB4MDE2NywgMHgwMmM2LCAweDAxNjAsIDB4MDAwYiwKKyAweDAwOGIsIDB4MDA4MSwgMHgwMDQzLCAweDAwN2QsIDB4MDBmNywgMHgwMGU5LCAweDAwZTUsIDB4MDBkYiwKKyAweDAxODksIDB4MDJlNywgMHgwMmUxLCAweDAyZDAsIDB4MDM3NSwgMHgwMzcyLCAweDAxYjcsIDB4MDAwNCwKKyAweDAwZjMsIDB4MDA3OCwgMHgwMDc2LCAweDAwNzMsIDB4MDBlMywgMHgwMGRmLCAweDAxOGMsIDB4MDJlYSwKKyAweDAyZTYsIDB4MDJlMCwgMHgwMmQxLCAweDAyYzgsIDB4MDJjMiwgMHgwMGRmLCAweDAxYjQsIDB4MDAwNiwKKyAweDAwY2EsIDB4MDBlMCwgMHgwMGRlLCAweDAwZGEsIDB4MDBkOCwgMHgwMTg1LCAweDAxODIsIDB4MDE3ZCwKKyAweDAxNmMsIDB4MDM3OCwgMHgwMWJiLCAweDAyYzMsIDB4MDFiOCwgMHgwMWI1LCAweDA2YzAsIDB4MDAwNCwKKyAweDAyZWIsIDB4MDBkMywgMHgwMGQyLCAweDAwZDAsIDB4MDE3MiwgMHgwMTdiLCAweDAyZGUsIDB4MDJkMywKKyAweDAyY2EsIDB4MDZjNywgMHgwMzczLCAweDAzNmQsIDB4MDM2YywgMHgwZDgzLCAweDAzNjEsIDB4MDAwMiwKKyAweDAxNzksIDB4MDE3MSwgMHgwMDY2LCAweDAwYmIsIDB4MDJkNiwgMHgwMmQyLCAweDAxNjYsIDB4MDJjNywKKyAweDAyYzUsIDB4MDM2MiwgMHgwNmM2LCAweDAzNjcsIDB4MGQ4MiwgMHgwMzY2LCAweDAxYjIsIDB4MDAwMCwKKyAweDAwMGMsIDB4MDAwYSwgMHgwMDA3LCAweDAwMGIsIDB4MDAwYSwgMHgwMDExLCAweDAwMGIsIDB4MDAwOSwKKyAweDAwMGQsIDB4MDAwYywgMHgwMDBhLCAweDAwMDcsIDB4MDAwNSwgMHgwMDAzLCAweDAwMDEsIDB4MDAwMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYV9odWZmYml0c18xNlsyNTZdID0geworICAxLCAgNCwgIDYsICA4LCAgOSwgIDksIDEwLCAxMCwKKyAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMywgIDksCisgIDMsICA0LCAgNiwgIDcsICA4LCAgOSwgIDksICA5LAorIDEwLCAxMCwgMTAsIDExLCAxMiwgMTEsIDEyLCAgOCwKKyAgNiwgIDYsICA3LCAgOCwgIDksICA5LCAxMCwgMTAsCisgMTEsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsICA5LAorICA4LCAgNywgIDgsICA5LCAgOSwgMTAsIDEwLCAxMCwKKyAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTAsCisgIDksICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLAorIDExLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAgOSwKKyAgOSwgIDgsICA5LCAgOSwgMTAsIDExLCAxMSwgMTIsCisgMTEsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDEwLAorIDEwLCAgOSwgIDksIDEwLCAxMSwgMTEsIDExLCAxMSwKKyAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTAsCisgMTAsICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLAorIDEyLCAxMywgMTMsIDEzLCAxMywgMTUsIDE1LCAxMCwKKyAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsCisgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDEwLAorIDExLCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywKKyAxMywgMTMsIDEzLCAxNCwgMTMsIDE0LCAxMywgMTEsCisgMTEsIDExLCAxMCwgMTEsIDEyLCAxMiwgMTIsIDEyLAorIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE0LCAxMCwKKyAxMiwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMywgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTQsIDExLAorIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAxMywgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNiwgMTEsCisgMTQsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LAorIDE0LCAxNiwgMTUsIDE1LCAxNSwgMTcsIDE1LCAxMSwKKyAxMywgMTMsIDExLCAxMiwgMTQsIDE0LCAxMywgMTQsCisgMTQsIDE1LCAxNiwgMTUsIDE3LCAxNSwgMTQsIDExLAorICA5LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMCwKKyAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgIDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgbXBhX2h1ZmZjb2Rlc18yNFsyNTZdID0geworIDB4MDAwZiwgMHgwMDBkLCAweDAwMmUsIDB4MDA1MCwgMHgwMDkyLCAweDAxMDYsIDB4MDBmOCwgMHgwMWIyLAorIDB4MDFhYSwgMHgwMjlkLCAweDAyOGQsIDB4MDI4OSwgMHgwMjZkLCAweDAyMDUsIDB4MDQwOCwgMHgwMDU4LAorIDB4MDAwZSwgMHgwMDBjLCAweDAwMTUsIDB4MDAyNiwgMHgwMDQ3LCAweDAwODIsIDB4MDA3YSwgMHgwMGQ4LAorIDB4MDBkMSwgMHgwMGM2LCAweDAxNDcsIDB4MDE1OSwgMHgwMTNmLCAweDAxMjksIDB4MDExNywgMHgwMDJhLAorIDB4MDAyZiwgMHgwMDE2LCAweDAwMjksIDB4MDA0YSwgMHgwMDQ0LCAweDAwODAsIDB4MDA3OCwgMHgwMGRkLAorIDB4MDBjZiwgMHgwMGMyLCAweDAwYjYsIDB4MDE1NCwgMHgwMTNiLCAweDAxMjcsIDB4MDIxZCwgMHgwMDEyLAorIDB4MDA1MSwgMHgwMDI3LCAweDAwNGIsIDB4MDA0NiwgMHgwMDg2LCAweDAwN2QsIDB4MDA3NCwgMHgwMGRjLAorIDB4MDBjYywgMHgwMGJlLCAweDAwYjIsIDB4MDE0NSwgMHgwMTM3LCAweDAxMjUsIDB4MDEwZiwgMHgwMDEwLAorIDB4MDA5MywgMHgwMDQ4LCAweDAwNDUsIDB4MDA4NywgMHgwMDdmLCAweDAwNzYsIDB4MDA3MCwgMHgwMGQyLAorIDB4MDBjOCwgMHgwMGJjLCAweDAxNjAsIDB4MDE0MywgMHgwMTMyLCAweDAxMWQsIDB4MDIxYywgMHgwMDBlLAorIDB4MDEwNywgMHgwMDQyLCAweDAwODEsIDB4MDA3ZSwgMHgwMDc3LCAweDAwNzIsIDB4MDBkNiwgMHgwMGNhLAorIDB4MDBjMCwgMHgwMGI0LCAweDAxNTUsIDB4MDEzZCwgMHgwMTJkLCAweDAxMTksIDB4MDEwNiwgMHgwMDBjLAorIDB4MDBmOSwgMHgwMDdiLCAweDAwNzksIDB4MDA3NSwgMHgwMDcxLCAweDAwZDcsIDB4MDBjZSwgMHgwMGMzLAorIDB4MDBiOSwgMHgwMTViLCAweDAxNGEsIDB4MDEzNCwgMHgwMTIzLCAweDAxMTAsIDB4MDIwOCwgMHgwMDBhLAorIDB4MDFiMywgMHgwMDczLCAweDAwNmYsIDB4MDA2ZCwgMHgwMGQzLCAweDAwY2IsIDB4MDBjNCwgMHgwMGJiLAorIDB4MDE2MSwgMHgwMTRjLCAweDAxMzksIDB4MDEyYSwgMHgwMTFiLCAweDAyMTMsIDB4MDE3ZCwgMHgwMDExLAorIDB4MDFhYiwgMHgwMGQ0LCAweDAwZDAsIDB4MDBjZCwgMHgwMGM5LCAweDAwYzEsIDB4MDBiYSwgMHgwMGIxLAorIDB4MDBhOSwgMHgwMTQwLCAweDAxMmYsIDB4MDExZSwgMHgwMTBjLCAweDAyMDIsIDB4MDE3OSwgMHgwMDEwLAorIDB4MDE0ZiwgMHgwMGM3LCAweDAwYzUsIDB4MDBiZiwgMHgwMGJkLCAweDAwYjUsIDB4MDBhZSwgMHgwMTRkLAorIDB4MDE0MSwgMHgwMTMxLCAweDAxMjEsIDB4MDExMywgMHgwMjA5LCAweDAxN2IsIDB4MDE3MywgMHgwMDBiLAorIDB4MDI5YywgMHgwMGI4LCAweDAwYjcsIDB4MDBiMywgMHgwMGFmLCAweDAxNTgsIDB4MDE0YiwgMHgwMTNhLAorIDB4MDEzMCwgMHgwMTIyLCAweDAxMTUsIDB4MDIxMiwgMHgwMTdmLCAweDAxNzUsIDB4MDE2ZSwgMHgwMDBhLAorIDB4MDI4YywgMHgwMTVhLCAweDAwYWIsIDB4MDBhOCwgMHgwMGE0LCAweDAxM2UsIDB4MDEzNSwgMHgwMTJiLAorIDB4MDExZiwgMHgwMTE0LCAweDAxMDcsIDB4MDIwMSwgMHgwMTc3LCAweDAxNzAsIDB4MDE2YSwgMHgwMDA2LAorIDB4MDI4OCwgMHgwMTQyLCAweDAxM2MsIDB4MDEzOCwgMHgwMTMzLCAweDAxMmUsIDB4MDEyNCwgMHgwMTFjLAorIDB4MDEwZCwgMHgwMTA1LCAweDAyMDAsIDB4MDE3OCwgMHgwMTcyLCAweDAxNmMsIDB4MDE2NywgMHgwMDA0LAorIDB4MDI2YywgMHgwMTJjLCAweDAxMjgsIDB4MDEyNiwgMHgwMTIwLCAweDAxMWEsIDB4MDExMSwgMHgwMTBhLAorIDB4MDIwMywgMHgwMTdjLCAweDAxNzYsIDB4MDE3MSwgMHgwMTZkLCAweDAxNjksIDB4MDE2NSwgMHgwMDAyLAorIDB4MDQwOSwgMHgwMTE4LCAweDAxMTYsIDB4MDExMiwgMHgwMTBiLCAweDAxMDgsIDB4MDEwMywgMHgwMTdlLAorIDB4MDE3YSwgMHgwMTc0LCAweDAxNmYsIDB4MDE2YiwgMHgwMTY4LCAweDAxNjYsIDB4MDE2NCwgMHgwMDAwLAorIDB4MDAyYiwgMHgwMDE0LCAweDAwMTMsIDB4MDAxMSwgMHgwMDBmLCAweDAwMGQsIDB4MDAwYiwgMHgwMDA5LAorIDB4MDAwNywgMHgwMDA2LCAweDAwMDQsIDB4MDAwNywgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwgMHgwMDAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBhX2h1ZmZiaXRzXzI0WzI1Nl0gPSB7CisgIDQsICA0LCAgNiwgIDcsICA4LCAgOSwgIDksIDEwLAorIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAgOSwKKyAgNCwgIDQsICA1LCAgNiwgIDcsICA4LCAgOCwgIDksCisgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsICA4LAorICA2LCAgNSwgIDYsICA3LCAgNywgIDgsICA4LCAgOSwKKyAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwgIDcsCisgIDcsICA2LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LAorICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAgNywKKyAgOCwgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDksCisgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsICA3LAorICA5LCAgNywgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwKKyAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDcsCisgIDksICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LAorICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAgNywKKyAxMCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksCisgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsICA4LAorIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgIDgsCisgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLAorIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAgOCwKKyAxMSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsCisgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsICA4LAorIDExLCAxMCwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwKKyAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgIDgsCisgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAgOCwKKyAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsICA4LAorIDEyLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwKKyAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgIDgsCisgIDgsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAorICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgNCwKK307CisKK3N0YXRpYyBjb25zdCBIdWZmVGFibGUgbXBhX2h1ZmZfdGFibGVzWzE2XSA9IHsKK3sgMSwgTlVMTCwgTlVMTCB9LAoreyAyLCBtcGFfaHVmZmJpdHNfMSwgbXBhX2h1ZmZjb2Rlc18xIH0sCit7IDMsIG1wYV9odWZmYml0c18yLCBtcGFfaHVmZmNvZGVzXzIgfSwKK3sgMywgbXBhX2h1ZmZiaXRzXzMsIG1wYV9odWZmY29kZXNfMyB9LAoreyA0LCBtcGFfaHVmZmJpdHNfNSwgbXBhX2h1ZmZjb2Rlc181IH0sCit7IDQsIG1wYV9odWZmYml0c182LCBtcGFfaHVmZmNvZGVzXzYgfSwKK3sgNiwgbXBhX2h1ZmZiaXRzXzcsIG1wYV9odWZmY29kZXNfNyB9LAoreyA2LCBtcGFfaHVmZmJpdHNfOCwgbXBhX2h1ZmZjb2Rlc184IH0sCit7IDYsIG1wYV9odWZmYml0c185LCBtcGFfaHVmZmNvZGVzXzkgfSwKK3sgOCwgbXBhX2h1ZmZiaXRzXzEwLCBtcGFfaHVmZmNvZGVzXzEwIH0sCit7IDgsIG1wYV9odWZmYml0c18xMSwgbXBhX2h1ZmZjb2Rlc18xMSB9LAoreyA4LCBtcGFfaHVmZmJpdHNfMTIsIG1wYV9odWZmY29kZXNfMTIgfSwKK3sgMTYsIG1wYV9odWZmYml0c18xMywgbXBhX2h1ZmZjb2Rlc18xMyB9LAoreyAxNiwgbXBhX2h1ZmZiaXRzXzE1LCBtcGFfaHVmZmNvZGVzXzE1IH0sCit7IDE2LCBtcGFfaHVmZmJpdHNfMTYsIG1wYV9odWZmY29kZXNfMTYgfSwKK3sgMTYsIG1wYV9odWZmYml0c18yNCwgbXBhX2h1ZmZjb2Rlc18yNCB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBhX2h1ZmZfZGF0YVszMl1bMl0gPSB7Cit7IDAsIDAgfSwKK3sgMSwgMCB9LAoreyAyLCAwIH0sCit7IDMsIDAgfSwKK3sgMCwgMCB9LAoreyA0LCAwIH0sCit7IDUsIDAgfSwKK3sgNiwgMCB9LAoreyA3LCAwIH0sCit7IDgsIDAgfSwKK3sgOSwgMCB9LAoreyAxMCwgMCB9LAoreyAxMSwgMCB9LAoreyAxMiwgMCB9LAoreyAwLCAwIH0sCit7IDEzLCAwIH0sCit7IDE0LCAxIH0sCit7IDE0LCAyIH0sCit7IDE0LCAzIH0sCit7IDE0LCA0IH0sCit7IDE0LCA2IH0sCit7IDE0LCA4IH0sCit7IDE0LCAxMCB9LAoreyAxNCwgMTMgfSwKK3sgMTUsIDQgfSwKK3sgMTUsIDUgfSwKK3sgMTUsIDYgfSwKK3sgMTUsIDcgfSwKK3sgMTUsIDggfSwKK3sgMTUsIDkgfSwKK3sgMTUsIDExIH0sCit7IDE1LCAxMyB9LAorfTsKKworCisvKiBodWZmbWFuIHRhYmxlcyBmb3IgcXVhZHJ1bGVzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGFfcXVhZF9jb2Rlc1syXVsxNl0gPSB7CisgICAgeyAgMSwgIDUsICA0LCAgNSwgIDYsICA1LCAgNCwgIDQsIDcsICAzLCAgNiwgIDAsICA3LCAgMiwgIDMsICAxLCB9LAorICAgIHsgMTUsIDE0LCAxMywgMTIsIDExLCAxMCwgIDksICA4LCA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAgMCwgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wYV9xdWFkX2JpdHNbMl1bMTZdID0geworICAgIHsgMSwgNCwgNCwgNSwgNCwgNiwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNiwgfSwKKyAgICB7IDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIH0sCit9OworCisvKiBiYW5kIHNpemUgdGFibGVzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBiYW5kX3NpemVfbG9uZ1s5XVsyMl0gPSB7Cit7IDQsIDQsIDQsIDQsIDQsIDQsIDYsIDYsIDgsIDgsIDEwLAorICAxMiwgMTYsIDIwLCAyNCwgMjgsIDM0LCA0MiwgNTAsIDU0LCA3NiwgMTU4LCB9LCAvKiA0NDEwMCAqLworeyA0LCA0LCA0LCA0LCA0LCA0LCA2LCA2LCA2LCA4LCAxMCwKKyAgMTIsIDE2LCAxOCwgMjIsIDI4LCAzNCwgNDAsIDQ2LCA1NCwgNTQsIDE5MiwgfSwgLyogNDgwMDAgKi8KK3sgNCwgNCwgNCwgNCwgNCwgNCwgNiwgNiwgOCwgMTAsIDEyLAorICAxNiwgMjAsIDI0LCAzMCwgMzgsIDQ2LCA1NiwgNjgsIDg0LCAxMDIsIDI2LCB9LCAvKiAzMjAwMCAqLworeyA2LCA2LCA2LCA2LCA2LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiwKKyAgMjAsIDI0LCAyOCwgMzIsIDM4LCA0NiwgNTIsIDYwLCA2OCwgNTgsIDU0LCB9LCAvKiAyMjA1MCAqLworeyA2LCA2LCA2LCA2LCA2LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiwKKyAgMTgsIDIyLCAyNiwgMzIsIDM4LCA0NiwgNTIsIDY0LCA3MCwgNzYsIDM2LCB9LCAvKiAyNDAwMCAqLworeyA2LCA2LCA2LCA2LCA2LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiwKKyAgMjAsIDI0LCAyOCwgMzIsIDM4LCA0NiwgNTIsIDYwLCA2OCwgNTgsIDU0LCB9LCAvKiAxNjAwMCAqLworeyA2LCA2LCA2LCA2LCA2LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiwKKyAgMjAsIDI0LCAyOCwgMzIsIDM4LCA0NiwgNTIsIDYwLCA2OCwgNTgsIDU0LCB9LCAvKiAxMTAyNSAqLworeyA2LCA2LCA2LCA2LCA2LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiwKKyAgMjAsIDI0LCAyOCwgMzIsIDM4LCA0NiwgNTIsIDYwLCA2OCwgNTgsIDU0LCB9LCAvKiAxMjAwMCAqLworeyAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxNiwgMjAsIDI0LCAyOCwgMzIsCisgIDQwLCA0OCwgNTYsIDY0LCA3NiwgOTAsIDIsIDIsIDIsIDIsIDIsIH0sIC8qIDgwMDAgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJhbmRfc2l6ZV9zaG9ydFs5XVsxM10gPSB7Cit7IDQsIDQsIDQsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE4LCAyMiwgMzAsIDU2LCB9LCAvKiA0NDEwMCAqLworeyA0LCA0LCA0LCA0LCA2LCA2LCAxMCwgMTIsIDE0LCAxNiwgMjAsIDI2LCA2NiwgfSwgLyogNDgwMDAgKi8KK3sgNCwgNCwgNCwgNCwgNiwgOCwgMTIsIDE2LCAyMCwgMjYsIDM0LCA0MiwgMTIsIH0sIC8qIDMyMDAwICovCit7IDQsIDQsIDQsIDYsIDYsIDgsIDEwLCAxNCwgMTgsIDI2LCAzMiwgNDIsIDE4LCB9LCAvKiAyMjA1MCAqLworeyA0LCA0LCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxOCwgMjQsIDMyLCA0NCwgMTIsIH0sIC8qIDI0MDAwICovCit7IDQsIDQsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE4LCAyNCwgMzAsIDQwLCAxOCwgfSwgLyogMTYwMDAgKi8KK3sgNCwgNCwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTgsIDI0LCAzMCwgNDAsIDE4LCB9LCAvKiAxMTAyNSAqLworeyA0LCA0LCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxOCwgMjQsIDMwLCA0MCwgMTgsIH0sIC8qIDEyMDAwICovCit7IDgsIDgsIDgsIDEyLCAxNiwgMjAsIDI0LCAyOCwgMzYsIDIsIDIsIDIsIDI2LCB9LCAvKiA4MDAwICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGFfcHJldGFiWzJdWzIyXSA9IHsKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDMsIDMsIDMsIDIsIDAgfSwKK307CisKKy8qIHRhYmxlIGZvciBhbGlhcyByZWR1Y3Rpb24gKFhYWDogc3RvcmUgaXQgYXMgaW50ZWdlciAhKSAqLworc3RhdGljIGNvbnN0IGZsb2F0IGNpX3RhYmxlWzhdID0geworICAgIC0wLjYsIC0wLjUzNSwgLTAuMzMsIC0wLjE4NSwgLTAuMDk1LCAtMC4wNDEsIC0wLjAxNDIsIC0wLjAwMzcsCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19NUEVHQVVESU9ERUNUQUJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmUzNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYW5zIFJ1bGxnYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RzcC5oIgorI2luY2x1ZGUgImRjdC5oIgorI2luY2x1ZGUgImRjdDMyLmgiCisKK2F2X2NvbGQgdm9pZCBmZl9tcGFkc3BfaW5pdChNUEFEU1BDb250ZXh0ICpzKQoreworICAgIERDVENvbnRleHQgZGN0OworCisgICAgZmZfZGN0X2luaXQoJmRjdCwgNSwgRENUX0lJKTsKKyAgICBmZl9pbml0X21wYWRzcF90YWJzX2Zsb2F0KCk7CisgICAgZmZfaW5pdF9tcGFkc3BfdGFic19maXhlZCgpOworCisgICAgcy0+YXBwbHlfd2luZG93X2Zsb2F0ID0gZmZfbXBhZHNwX2FwcGx5X3dpbmRvd19mbG9hdDsKKyAgICBzLT5hcHBseV93aW5kb3dfZml4ZWQgPSBmZl9tcGFkc3BfYXBwbHlfd2luZG93X2ZpeGVkOworCisgICAgcy0+ZGN0MzJfZmxvYXQgPSBkY3QuZGN0MzI7CisgICAgcy0+ZGN0MzJfZml4ZWQgPSBmZl9kY3QzMl9maXhlZDsKKworICAgIHMtPmltZGN0MzZfYmxvY2tzX2Zsb2F0ID0gZmZfaW1kY3QzNl9ibG9ja3NfZmxvYXQ7CisgICAgcy0+aW1kY3QzNl9ibG9ja3NfZml4ZWQgPSBmZl9pbWRjdDM2X2Jsb2Nrc19maXhlZDsKKworICAgIGlmIChBUkNIX0FBUkNINjQpIGZmX21wYWRzcF9pbml0X2FhcmNoNjQocyk7CisgICAgaWYgKEFSQ0hfQVJNKSAgICAgZmZfbXBhZHNwX2luaXRfYXJtKHMpOworICAgIGlmIChBUkNIX1BQQykgICAgIGZmX21wYWRzcF9pbml0X3BwYyhzKTsKKyAgICBpZiAoQVJDSF9YODYpICAgICBmZl9tcGFkc3BfaW5pdF94ODYocyk7CisgICAgaWYgKEhBVkVfTUlQU0ZQVSkgICBmZl9tcGFkc3BfaW5pdF9taXBzZnB1KHMpOworICAgIGlmIChIQVZFX01JUFNEU1BSMSkgZmZfbXBhZHNwX2luaXRfbWlwc2RzcHIxKHMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzIyYTJmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTVBFR0FVRElPRFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19NUEVHQVVESU9EU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCit0eXBlZGVmIHN0cnVjdCBNUEFEU1BDb250ZXh0IHsKKyAgICB2b2lkICgqYXBwbHlfd2luZG93X2Zsb2F0KShmbG9hdCAqc3ludGhfYnVmLCBmbG9hdCAqd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyX3N0YXRlLCBmbG9hdCAqc2FtcGxlcywgaW50IGluY3IpOworICAgIHZvaWQgKCphcHBseV93aW5kb3dfZml4ZWQpKGludDMyX3QgKnN5bnRoX2J1ZiwgaW50MzJfdCAqd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyX3N0YXRlLCBpbnQxNl90ICpzYW1wbGVzLCBpbnQgaW5jcik7CisgICAgdm9pZCAoKmRjdDMyX2Zsb2F0KShmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjKTsKKyAgICB2b2lkICgqZGN0MzJfZml4ZWQpKGludCAqZHN0LCBjb25zdCBpbnQgKnNyYyk7CisKKyAgICB2b2lkICgqaW1kY3QzNl9ibG9ja3NfZmxvYXQpKGZsb2F0ICpvdXQsIGZsb2F0ICpidWYsIGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50IHN3aXRjaF9wb2ludCwgaW50IGJsb2NrX3R5cGUpOworICAgIHZvaWQgKCppbWRjdDM2X2Jsb2Nrc19maXhlZCkoaW50ICpvdXQsIGludCAqYnVmLCBpbnQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgc3dpdGNoX3BvaW50LCBpbnQgYmxvY2tfdHlwZSk7Cit9IE1QQURTUENvbnRleHQ7CisKK3ZvaWQgZmZfbXBhZHNwX2luaXQoTVBBRFNQQ29udGV4dCAqcyk7CisKK2V4dGVybiBpbnQzMl90IGZmX21wYV9zeW50aF93aW5kb3dfZml4ZWRbXTsKK2V4dGVybiBmbG9hdCAgIGZmX21wYV9zeW50aF93aW5kb3dfZmxvYXRbXTsKKworZXh0ZXJuIGNvbnN0IGludDMyX3QgZmZfbXBhX2Vud2luZG93WzI1N107CisKK3ZvaWQgZmZfbXBhX3N5bnRoX2ZpbHRlcl9maXhlZChNUEFEU1BDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnN5bnRoX2J1Zl9wdHIsIGludCAqc3ludGhfYnVmX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICp3aW5kb3csIGludCAqZGl0aGVyX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNhbXBsZXMsIGludCBpbmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnNiX3NhbXBsZXMpOworCit2b2lkIGZmX21wYV9zeW50aF9maWx0ZXJfZmxvYXQoTVBBRFNQQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqc3ludGhfYnVmX3B0ciwgaW50ICpzeW50aF9idWZfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICp3aW5kb3csIGludCAqZGl0aGVyX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpzYW1wbGVzLCBpbnQgaW5jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqc2Jfc2FtcGxlcyk7CisKK3ZvaWQgZmZfbXBhZHNwX2luaXRfYWFyY2g2NChNUEFEU1BDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbXBhZHNwX2luaXRfYXJtKE1QQURTUENvbnRleHQgKnMpOwordm9pZCBmZl9tcGFkc3BfaW5pdF9wcGMoTVBBRFNQQ29udGV4dCAqcyk7Cit2b2lkIGZmX21wYWRzcF9pbml0X3g4NihNUEFEU1BDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbXBhZHNwX2luaXRfbWlwc2ZwdShNUEFEU1BDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbXBhZHNwX2luaXRfbWlwc2RzcHIxKE1QQURTUENvbnRleHQgKnMpOworCit2b2lkIGZmX21wYV9zeW50aF9pbml0X2Zsb2F0KGZsb2F0ICp3aW5kb3cpOwordm9pZCBmZl9tcGFfc3ludGhfaW5pdF9maXhlZChpbnQzMl90ICp3aW5kb3cpOworCit2b2lkIGZmX21wYWRzcF9hcHBseV93aW5kb3dfZmxvYXQoZmxvYXQgKnN5bnRoX2J1ZiwgZmxvYXQgKndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpdGhlcl9zdGF0ZSwgZmxvYXQgKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluY3IpOwordm9pZCBmZl9tcGFkc3BfYXBwbHlfd2luZG93X2ZpeGVkKGludDMyX3QgKnN5bnRoX2J1ZiwgaW50MzJfdCAqd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyX3N0YXRlLCBpbnQxNl90ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmNyKTsKKwordm9pZCBmZl9pbWRjdDM2X2Jsb2Nrc19mbG9hdChmbG9hdCAqb3V0LCBmbG9hdCAqYnVmLCBmbG9hdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50IHN3aXRjaF9wb2ludCwgaW50IGJsb2NrX3R5cGUpOworCit2b2lkIGZmX2ltZGN0MzZfYmxvY2tzX2ZpeGVkKGludCAqb3V0LCBpbnQgKmJ1ZiwgaW50ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgc3dpdGNoX3BvaW50LCBpbnQgYmxvY2tfdHlwZSk7CisKK3ZvaWQgZmZfaW5pdF9tcGFkc3BfdGFic19mbG9hdCh2b2lkKTsKK3ZvaWQgZmZfaW5pdF9tcGFkc3BfdGFic19maXhlZCh2b2lkKTsKKworLyoqIEZvciBTU0UgaW1wbGVtZW50YXRpb24sIE1EQ1RfQlVGX1NJWkUvMiBzaG91bGQgYmUgMTI4LWJpdCBhbGlnbmVkICovCisjZGVmaW5lIE1EQ1RfQlVGX1NJWkUgRkZBTElHTigzNiwgMio0KQorCitleHRlcm4gaW50IGZmX21kY3Rfd2luX2ZpeGVkWzhdW01EQ1RfQlVGX1NJWkVdOworZXh0ZXJuIGZsb2F0IGZmX21kY3Rfd2luX2Zsb2F0WzhdW01EQ1RfQlVGX1NJWkVdOworCisjZW5kaWYgLyogQVZDT0RFQ19NUEVHQVVESU9EU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwX2RhdGEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RzcF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1MGRlOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RzcF9kYXRhLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibXBlZ2F1ZGlvZHNwLmgiCisKKy8qIGhhbGYgbXBlZyBlbmNvZGluZyB3aW5kb3cgKGZ1bGwgcHJlY2lzaW9uKSAqLworY29uc3QgaW50MzJfdCBmZl9tcGFfZW53aW5kb3dbMjU3XSA9IHsKKyAgICAgMCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTIsCisgICAgLTIsICAgIC0yLCAgICAtMiwgICAgLTMsICAgIC0zLCAgICAtNCwgICAgLTQsICAgIC01LAorICAgIC01LCAgICAtNiwgICAgLTcsICAgIC03LCAgICAtOCwgICAgLTksICAgLTEwLCAgIC0xMSwKKyAgIC0xMywgICAtMTQsICAgLTE2LCAgIC0xNywgICAtMTksICAgLTIxLCAgIC0yNCwgICAtMjYsCisgICAtMjksICAgLTMxLCAgIC0zNSwgICAtMzgsICAgLTQxLCAgIC00NSwgICAtNDksICAgLTUzLAorICAgLTU4LCAgIC02MywgICAtNjgsICAgLTczLCAgIC03OSwgICAtODUsICAgLTkxLCAgIC05NywKKyAgLTEwNCwgIC0xMTEsICAtMTE3LCAgLTEyNSwgIC0xMzIsICAtMTM5LCAgLTE0NywgIC0xNTQsCisgIC0xNjEsICAtMTY5LCAgLTE3NiwgIC0xODMsICAtMTkwLCAgLTE5NiwgIC0yMDIsICAtMjA4LAorICAgMjEzLCAgIDIxOCwgICAyMjIsICAgMjI1LCAgIDIyNywgICAyMjgsICAgMjI4LCAgIDIyNywKKyAgIDIyNCwgICAyMjEsICAgMjE1LCAgIDIwOCwgICAyMDAsICAgMTg5LCAgIDE3NywgICAxNjMsCisgICAxNDYsICAgMTI3LCAgIDEwNiwgICAgODMsICAgIDU3LCAgICAyOSwgICAgLTIsICAgLTM2LAorICAgLTcyLCAgLTExMSwgIC0xNTMsICAtMTk3LCAgLTI0NCwgIC0yOTQsICAtMzQ3LCAgLTQwMSwKKyAgLTQ1OSwgIC01MTksICAtNTgxLCAgLTY0NSwgIC03MTEsICAtNzc5LCAgLTg0OCwgIC05MTksCisgIC05OTEsIC0xMDY0LCAtMTEzNywgLTEyMTAsIC0xMjgzLCAtMTM1NiwgLTE0MjgsIC0xNDk4LAorIC0xNTY3LCAtMTYzNCwgLTE2OTgsIC0xNzU5LCAtMTgxNywgLTE4NzAsIC0xOTE5LCAtMTk2MiwKKyAtMjAwMSwgLTIwMzIsIC0yMDU3LCAtMjA3NSwgLTIwODUsIC0yMDg3LCAtMjA4MCwgLTIwNjMsCisgIDIwMzcsICAyMDAwLCAgMTk1MiwgIDE4OTMsICAxODIyLCAgMTczOSwgIDE2NDQsICAxNTM1LAorICAxNDE0LCAgMTI4MCwgIDExMzEsICAgOTcwLCAgIDc5NCwgICA2MDUsICAgNDAyLCAgIDE4NSwKKyAgIC00NSwgIC0yODgsICAtNTQ1LCAgLTgxNCwgLTEwOTUsIC0xMzg4LCAtMTY5MiwgLTIwMDYsCisgLTIzMzAsIC0yNjYzLCAtMzAwNCwgLTMzNTEsIC0zNzA1LCAtNDA2MywgLTQ0MjUsIC00Nzg4LAorIC01MTUzLCAtNTUxNywgLTU4NzksIC02MjM3LCAtNjU4OSwgLTY5MzUsIC03MjcxLCAtNzU5NywKKyAtNzkxMCwgLTgyMDksIC04NDkxLCAtODc1NSwgLTg5OTgsIC05MjE5LCAtOTQxNiwgLTk1ODUsCisgLTk3MjcsIC05ODM4LCAtOTkxNiwgLTk5NTksIC05OTY2LCAtOTkzNSwgLTk4NjMsIC05NzUwLAorIC05NTkyLCAtOTM4OSwgLTkxMzksIC04ODQwLCAtODQ5MiwgLTgwOTIsIC03NjQwLCAtNzEzNCwKKyAgNjU3NCwgIDU5NTksICA1Mjg4LCAgNDU2MSwgIDM3NzYsICAyOTM1LCAgMjAzNywgIDEwODIsCisgICAgNzAsICAtOTk4LCAtMjEyMiwgLTMzMDAsIC00NTMzLCAtNTgxOCwgLTcxNTQsIC04NTQwLAorIC05OTc1LC0xMTQ1NSwtMTI5ODAsLTE0NTQ4LC0xNjE1NSwtMTc3OTksLTE5NDc4LC0yMTE4OSwKKy0yMjkyOSwtMjQ2OTQsLTI2NDgyLC0yODI4OSwtMzAxMTIsLTMxOTQ3LC0zMzc5MSwtMzU2NDAsCistMzc0ODksLTM5MzM2LC00MTE3NiwtNDMwMDYsLTQ0ODIxLC00NjYxNywtNDgzOTAsLTUwMTM3LAorLTUxODUzLC01MzUzNCwtNTUxNzgsLTU2Nzc4LC01ODMzMywtNTk4MzgsLTYxMjg5LC02MjY4NCwKKy02NDAxOSwtNjUyOTAsLTY2NDk0LC02NzYyOSwtNjg2OTIsLTY5Njc5LC03MDU5MCwtNzE0MjAsCistNzIxNjksLTcyODM1LC03MzQxNSwtNzM5MDgsLTc0MzEzLC03NDYzMCwtNzQ4NTYsLTc0OTkyLAorIDc1MDM4LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RzcF9maXhlZC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwX2ZpeGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjOWQ2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RzcF9maXhlZC5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBVU0VfRkxPQVRTIDAKKyNpbmNsdWRlICJtcGVnYXVkaW9kc3BfdGVtcGxhdGUuYyIKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RzcF9mbG9hdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwX2Zsb2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1YjEzNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RzcF9mbG9hdC5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBVU0VfRkxPQVRTIDEKKyNpbmNsdWRlICJtcGVnYXVkaW9kc3BfdGVtcGxhdGUuYyIKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RzcF90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0NTRjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2RzcF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJkY3QzMi5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtcGVnYXVkaW9kc3AuaCIKKyNpbmNsdWRlICJtcGVnYXVkaW8uaCIKKworI2lmIFVTRV9GTE9BVFMKKyNkZWZpbmUgUkVOQU1FKG4pIG4jI19mbG9hdAorCitzdGF0aWMgaW5saW5lIGZsb2F0IHJvdW5kX3NhbXBsZShmbG9hdCAqc3VtKQoreworICAgIGZsb2F0IHN1bTE9KnN1bTsKKyAgICAqc3VtID0gMDsKKyAgICByZXR1cm4gc3VtMTsKK30KKworI2RlZmluZSBNQUNTKHJ0LCByYSwgcmIpIHJ0Kz0ocmEpKihyYikKKyNkZWZpbmUgTVVMUyhyYSwgcmIpICgocmEpKihyYikpCisjZGVmaW5lIE1VTEgzKHgsIHksIHMpICgocykqKHkpKih4KSkKKyNkZWZpbmUgTUxTUyhydCwgcmEsIHJiKSBydC09KHJhKSoocmIpCisjZGVmaW5lIE1VTEx4KHgsIHksIHMpICgoeSkqKHgpKQorI2RlZmluZSBGSVhIUih4KSAgICAgICAgKChmbG9hdCkoeCkpCisjZGVmaW5lIEZJWFIoeCkgICAgICAgICgoZmxvYXQpKHgpKQorI2RlZmluZSBTSFIoYSxiKSAgICAgICAoKGEpKigxLjBmLygxPDwoYikpKSkKKworI2Vsc2UKKworI2RlZmluZSBSRU5BTUUobikgbiMjX2ZpeGVkCisjZGVmaW5lIE9VVF9TSElGVCAoV0ZSQUNfQklUUyArIEZSQUNfQklUUyAtIDE1KQorCitzdGF0aWMgaW5saW5lIGludCByb3VuZF9zYW1wbGUoaW50NjRfdCAqc3VtKQoreworICAgIGludCBzdW0xOworICAgIHN1bTEgPSAoaW50KSgoKnN1bSkgPj4gT1VUX1NISUZUKTsKKyAgICAqc3VtICY9ICgxPDxPVVRfU0hJRlQpLTE7CisgICAgcmV0dXJuIGF2X2NsaXBfaW50MTYoc3VtMSk7Cit9CisKKyMgICBkZWZpbmUgTVVMUyhyYSwgcmIpIE1VTDY0KHJhLCByYikKKyMgICBkZWZpbmUgTUFDUyhydCwgcmEsIHJiKSBNQUM2NChydCwgcmEsIHJiKQorIyAgIGRlZmluZSBNTFNTKHJ0LCByYSwgcmIpIE1MUzY0KHJ0LCByYSwgcmIpCisjICAgZGVmaW5lIE1VTEgzKHgsIHksIHMpIE1VTEgoKHMpKih4KSwgeSkKKyMgICBkZWZpbmUgTVVMTHgoeCwgeSwgcykgTVVMTCh4LHkscykKKyMgICBkZWZpbmUgU0hSKGEsYikgICAgICAgKChhKT4+KGIpKQorIyAgIGRlZmluZSBGSVhSKGEpICAgICAgICAoKGludCkoKGEpICogRlJBQ19PTkUgKyAwLjUpKQorIyAgIGRlZmluZSBGSVhIUihhKSAgICAgICAoKGludCkoKGEpICogKDFMTDw8MzIpICsgMC41KSkKKyNlbmRpZgorCisvKiogV2luZG93IGZvciBNRENULiBBY3R1YWxseSBvbmx5IHRoZSBlbGVtZW50cyBpbiBbMCwxN10gYW5kCisgICAgW01EQ1RfQlVGX1NJWkUvMiwgTURDVF9CVUZfU0laRS8yICsgMTddIGFyZSBhY3R1YWxseSB1c2VkLiBUaGUgcmVzdAorICAgIGlzIGp1c3QgdG8gcHJlc2VydmUgYWxpZ25tZW50IGZvciBTSU1EIGltcGxlbWVudGF0aW9ucy4KKyovCitERUNMQVJFX0FMSUdORUQoMTYsIElOVEZMT0FULCBSRU5BTUUoZmZfbWRjdF93aW4pKVs4XVtNRENUX0JVRl9TSVpFXTsKKworREVDTEFSRV9BTElHTkVEKDE2LCBNUEFfSU5ULCBSRU5BTUUoZmZfbXBhX3N5bnRoX3dpbmRvdykpWzUxMisyNTZdOworCisjZGVmaW5lIFNVTTgob3AsIHN1bSwgdywgcCkgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3Aoc3VtLCAodylbMCAqIDY0XSwgKHApWzAgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbMSAqIDY0XSwgKHApWzEgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbMiAqIDY0XSwgKHApWzIgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbMyAqIDY0XSwgKHApWzMgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNCAqIDY0XSwgKHApWzQgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNSAqIDY0XSwgKHApWzUgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNiAqIDY0XSwgKHApWzYgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNyAqIDY0XSwgKHApWzcgKiA2NF0pOyAgICBcCit9CisKKyNkZWZpbmUgU1VNOFAyKHN1bTEsIG9wMSwgc3VtMiwgb3AyLCB3MSwgdzIsIHApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTlRGTE9BVCB0bXA7XAorICAgIHRtcCA9IHBbMCAqIDY0XTtcCisgICAgb3AxKHN1bTEsICh3MSlbMCAqIDY0XSwgdG1wKTtcCisgICAgb3AyKHN1bTIsICh3MilbMCAqIDY0XSwgdG1wKTtcCisgICAgdG1wID0gcFsxICogNjRdO1wKKyAgICBvcDEoc3VtMSwgKHcxKVsxICogNjRdLCB0bXApO1wKKyAgICBvcDIoc3VtMiwgKHcyKVsxICogNjRdLCB0bXApO1wKKyAgICB0bXAgPSBwWzIgKiA2NF07XAorICAgIG9wMShzdW0xLCAodzEpWzIgKiA2NF0sIHRtcCk7XAorICAgIG9wMihzdW0yLCAodzIpWzIgKiA2NF0sIHRtcCk7XAorICAgIHRtcCA9IHBbMyAqIDY0XTtcCisgICAgb3AxKHN1bTEsICh3MSlbMyAqIDY0XSwgdG1wKTtcCisgICAgb3AyKHN1bTIsICh3MilbMyAqIDY0XSwgdG1wKTtcCisgICAgdG1wID0gcFs0ICogNjRdO1wKKyAgICBvcDEoc3VtMSwgKHcxKVs0ICogNjRdLCB0bXApO1wKKyAgICBvcDIoc3VtMiwgKHcyKVs0ICogNjRdLCB0bXApO1wKKyAgICB0bXAgPSBwWzUgKiA2NF07XAorICAgIG9wMShzdW0xLCAodzEpWzUgKiA2NF0sIHRtcCk7XAorICAgIG9wMihzdW0yLCAodzIpWzUgKiA2NF0sIHRtcCk7XAorICAgIHRtcCA9IHBbNiAqIDY0XTtcCisgICAgb3AxKHN1bTEsICh3MSlbNiAqIDY0XSwgdG1wKTtcCisgICAgb3AyKHN1bTIsICh3MilbNiAqIDY0XSwgdG1wKTtcCisgICAgdG1wID0gcFs3ICogNjRdO1wKKyAgICBvcDEoc3VtMSwgKHcxKVs3ICogNjRdLCB0bXApO1wKKyAgICBvcDIoc3VtMiwgKHcyKVs3ICogNjRdLCB0bXApO1wKK30KKwordm9pZCBSRU5BTUUoZmZfbXBhZHNwX2FwcGx5X3dpbmRvdykoTVBBX0lOVCAqc3ludGhfYnVmLCBNUEFfSU5UICp3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXRoZXJfc3RhdGUsIE9VVF9JTlQgKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluY3IpCit7CisgICAgcmVnaXN0ZXIgY29uc3QgTVBBX0lOVCAqdywgKncyLCAqcDsKKyAgICBpbnQgajsKKyAgICBPVVRfSU5UICpzYW1wbGVzMjsKKyNpZiBVU0VfRkxPQVRTCisgICAgZmxvYXQgc3VtLCBzdW0yOworI2Vsc2UKKyAgICBpbnQ2NF90IHN1bSwgc3VtMjsKKyNlbmRpZgorCisgICAgLyogY29weSB0byBhdm9pZCB3cmFwICovCisgICAgbWVtY3B5KHN5bnRoX2J1ZiArIDUxMiwgc3ludGhfYnVmLCAzMiAqIHNpemVvZigqc3ludGhfYnVmKSk7CisKKyAgICBzYW1wbGVzMiA9IHNhbXBsZXMgKyAzMSAqIGluY3I7CisgICAgdyA9IHdpbmRvdzsKKyAgICB3MiA9IHdpbmRvdyArIDMxOworCisgICAgc3VtID0gKmRpdGhlcl9zdGF0ZTsKKyAgICBwID0gc3ludGhfYnVmICsgMTY7CisgICAgU1VNOChNQUNTLCBzdW0sIHcsIHApOworICAgIHAgPSBzeW50aF9idWYgKyA0ODsKKyAgICBTVU04KE1MU1MsIHN1bSwgdyArIDMyLCBwKTsKKyAgICAqc2FtcGxlcyA9IHJvdW5kX3NhbXBsZSgmc3VtKTsKKyAgICBzYW1wbGVzICs9IGluY3I7CisgICAgdysrOworCisgICAgLyogd2UgY2FsY3VsYXRlIHR3byBzYW1wbGVzIGF0IHRoZSBzYW1lIHRpbWUgdG8gYXZvaWQgb25lIG1lbW9yeQorICAgICAgIGFjY2VzcyBwZXIgdHdvIHNhbXBsZSAqLworICAgIGZvcihqPTE7ajwxNjtqKyspIHsKKyAgICAgICAgc3VtMiA9IDA7CisgICAgICAgIHAgPSBzeW50aF9idWYgKyAxNiArIGo7CisgICAgICAgIFNVTThQMihzdW0sIE1BQ1MsIHN1bTIsIE1MU1MsIHcsIHcyLCBwKTsKKyAgICAgICAgcCA9IHN5bnRoX2J1ZiArIDQ4IC0gajsKKyAgICAgICAgU1VNOFAyKHN1bSwgTUxTUywgc3VtMiwgTUxTUywgdyArIDMyLCB3MiArIDMyLCBwKTsKKworICAgICAgICAqc2FtcGxlcyA9IHJvdW5kX3NhbXBsZSgmc3VtKTsKKyAgICAgICAgc2FtcGxlcyArPSBpbmNyOworICAgICAgICBzdW0gKz0gc3VtMjsKKyAgICAgICAgKnNhbXBsZXMyID0gcm91bmRfc2FtcGxlKCZzdW0pOworICAgICAgICBzYW1wbGVzMiAtPSBpbmNyOworICAgICAgICB3Kys7CisgICAgICAgIHcyLS07CisgICAgfQorCisgICAgcCA9IHN5bnRoX2J1ZiArIDMyOworICAgIFNVTTgoTUxTUywgc3VtLCB3ICsgMzIsIHApOworICAgICpzYW1wbGVzID0gcm91bmRfc2FtcGxlKCZzdW0pOworICAgICpkaXRoZXJfc3RhdGU9IHN1bTsKK30KKworLyogMzIgc3ViIGJhbmQgc3ludGhlc2lzIGZpbHRlci4gSW5wdXQ6IDMyIHN1YiBiYW5kIHNhbXBsZXMsIE91dHB1dDoKKyAgIDMyIHNhbXBsZXMuICovCit2b2lkIFJFTkFNRShmZl9tcGFfc3ludGhfZmlsdGVyKShNUEFEU1BDb250ZXh0ICpzLCBNUEFfSU5UICpzeW50aF9idWZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzeW50aF9idWZfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBBX0lOVCAqd2luZG93LCBpbnQgKmRpdGhlcl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVF9JTlQgKnNhbXBsZXMsIGludCBpbmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBBX0lOVCAqc2Jfc2FtcGxlcykKK3sKKyAgICBNUEFfSU5UICpzeW50aF9idWY7CisgICAgaW50IG9mZnNldDsKKworICAgIG9mZnNldCA9ICpzeW50aF9idWZfb2Zmc2V0OworICAgIHN5bnRoX2J1ZiA9IHN5bnRoX2J1Zl9wdHIgKyBvZmZzZXQ7CisKKyAgICBzLT5SRU5BTUUoZGN0MzIpKHN5bnRoX2J1Ziwgc2Jfc2FtcGxlcyk7CisgICAgcy0+UkVOQU1FKGFwcGx5X3dpbmRvdykoc3ludGhfYnVmLCB3aW5kb3csIGRpdGhlcl9zdGF0ZSwgc2FtcGxlcywgaW5jcik7CisKKyAgICBvZmZzZXQgPSAob2Zmc2V0IC0gMzIpICYgNTExOworICAgICpzeW50aF9idWZfb2Zmc2V0ID0gb2Zmc2V0OworfQorCithdl9jb2xkIHZvaWQgUkVOQU1FKGZmX21wYV9zeW50aF9pbml0KShNUEFfSU5UICp3aW5kb3cpCit7CisgICAgaW50IGksIGo7CisKKyAgICAvKiBtYXggPSAxODc2MCwgbWF4IHN1bSBvdmVyIGFsbCAxNiBjb2VmcyA6IDQ0NzM2ICovCisgICAgZm9yKGk9MDtpPDI1NztpKyspIHsKKyAgICAgICAgSU5URkxPQVQgdjsKKyAgICAgICAgdiA9IGZmX21wYV9lbndpbmRvd1tpXTsKKyNpZiBVU0VfRkxPQVRTCisgICAgICAgIHYgKj0gMS4wIC8gKDFMTDw8KDE2ICsgRlJBQ19CSVRTKSk7CisjZW5kaWYKKyAgICAgICAgd2luZG93W2ldID0gdjsKKyAgICAgICAgaWYgKChpICYgNjMpICE9IDApCisgICAgICAgICAgICB2ID0gLXY7CisgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICB3aW5kb3dbNTEyIC0gaV0gPSB2OworICAgIH0KKworCisgICAgLy8gTmVlZGVkIGZvciBhdm9pZGluZyBzaHVmZmxlcyBpbiBBU00gaW1wbGVtZW50YXRpb25zCisgICAgZm9yKGk9MDsgaSA8IDg7IGkrKykKKyAgICAgICAgZm9yKGo9MDsgaiA8IDE2OyBqKyspCisgICAgICAgICAgICB3aW5kb3dbNTEyKzE2Kmkral0gPSB3aW5kb3dbNjQqaSszMi1qXTsKKworICAgIGZvcihpPTA7IGkgPCA4OyBpKyspCisgICAgICAgIGZvcihqPTA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgd2luZG93WzUxMisxMjgrMTYqaStqXSA9IHdpbmRvd1s2NCppKzQ4LWpdOworfQorCithdl9jb2xkIHZvaWQgUkVOQU1FKGZmX2luaXRfbXBhZHNwX3RhYnMpKHZvaWQpCit7CisgICAgaW50IGksIGo7CisgICAgLyogY29tcHV0ZSBtZGN0IHdpbmRvd3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzY7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICBkb3VibGUgZDsKKworICAgICAgICAgICAgaWYgKGogPT0gMiAmJiBpICUgMyAhPSAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBkID0gc2luKE1fUEkgKiAoaSArIDAuNSkgLyAzNi4wKTsKKyAgICAgICAgICAgIGlmIChqID09IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAgICAgIChpID49IDMwKSBkID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpID49IDI0KSBkID0gc2luKE1fUEkgKiAoaSAtIDE4ICsgMC41KSAvIDEyLjApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPj0gMTgpIGQgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChqID09IDMpIHsKKyAgICAgICAgICAgICAgICBpZiAgICAgIChpIDwgICA2KSBkID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpIDwgIDEyKSBkID0gc2luKE1fUEkgKiAoaSAtICA2ICsgMC41KSAvIDEyLjApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPCAgMTgpIGQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9tZXJnZSBsYXN0IHN0YWdlIG9mIGltZGN0IGludG8gdGhlIHdpbmRvdyBjb2VmZmljaWVudHMKKyAgICAgICAgICAgIGQgKj0gMC41ICogSU1EQ1RfU0NBTEFSIC8gY29zKE1fUEkgKiAoMiAqIGkgKyAxOSkgLyA3Mik7CisKKyAgICAgICAgICAgIGlmIChqID09IDIpCisgICAgICAgICAgICAgICAgUkVOQU1FKGZmX21kY3Rfd2luKVtqXVtpLzNdID0gRklYSFIoKGQgLyAoMTw8NSkpKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBpIDwgMTggPyBpIDogaSArIChNRENUX0JVRl9TSVpFLzIgLSAxOCk7CisgICAgICAgICAgICAgICAgUkVOQU1FKGZmX21kY3Rfd2luKVtqXVtpZHhdID0gRklYSFIoKGQgLyAoMTw8NSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE5PVEU6IHdlIGRvIGZyZXF1ZW5jeSBpbnZlcnNpb24gYWR0ZXIgdGhlIE1EQ1QgYnkgY2hhbmdpbmcKKyAgICAgICAgdGhlIHNpZ24gb2YgdGhlIHJpZ2h0IHdpbmRvdyBjb2VmcyAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1EQ1RfQlVGX1NJWkU7IGkgKz0gMikgeworICAgICAgICAgICAgUkVOQU1FKGZmX21kY3Rfd2luKVtqICsgNF1baSAgICBdID0gIFJFTkFNRShmZl9tZGN0X3dpbilbal1baSAgICBdOworICAgICAgICAgICAgUkVOQU1FKGZmX21kY3Rfd2luKVtqICsgNF1baSArIDFdID0gLVJFTkFNRShmZl9tZGN0X3dpbilbal1baSArIDFdOworICAgICAgICB9CisgICAgfQorfQorLyogY29zKHBpKmkvMTgpICovCisjZGVmaW5lIEMxIEZJWEhSKDAuOTg0ODA3NzUzMDEyMjA4MDU5MzYvMikKKyNkZWZpbmUgQzIgRklYSFIoMC45Mzk2OTI2MjA3ODU5MDgzODQwNS8yKQorI2RlZmluZSBDMyBGSVhIUigwLjg2NjAyNTQwMzc4NDQzODY0Njc2LzIpCisjZGVmaW5lIEM0IEZJWEhSKDAuNzY2MDQ0NDQzMTE4OTc4MDM1MjAvMikKKyNkZWZpbmUgQzUgRklYSFIoMC42NDI3ODc2MDk2ODY1MzkzMjYzMi8yKQorI2RlZmluZSBDNiBGSVhIUigwLjUvMikKKyNkZWZpbmUgQzcgRklYSFIoMC4zNDIwMjAxNDMzMjU2Njg3MzMwNC8yKQorI2RlZmluZSBDOCBGSVhIUigwLjE3MzY0ODE3NzY2NjkzMDM0ODg1LzIpCisKKy8qIDAuNSAvIGNvcyhwaSooMippKzEpLzM2KSAqLworc3RhdGljIGNvbnN0IElOVEZMT0FUIGljb3MzNls5XSA9IHsKKyAgICBGSVhSKDAuNTAxOTA5OTE4NzcxNjczNjk0NzkpLAorICAgIEZJWFIoMC41MTc2MzgwOTAyMDUwNDE1MjQ2OSksIC8vMAorICAgIEZJWFIoMC41NTE2ODg5NTk0ODEyNDU4NzgyNCksCisgICAgRklYUigwLjYxMDM4NzI5NDM4MDcyODAzNDE2KSwKKyAgICBGSVhSKDAuNzA3MTA2NzgxMTg2NTQ3NTI0MzkpLCAvLzEKKyAgICBGSVhSKDAuODcxNzIzMzk3ODEwNTQ5MDA5OTEpLAorICAgIEZJWFIoMS4xODMxMDA3OTE1NzYyNDkyNTg5NiksCisgICAgRklYUigxLjkzMTg1MTY1MjU3ODEzNjU3MzQ5KSwgLy8yCisgICAgRklYUig1LjczNjg1NjYyMjgzNDkyNzU2NDYxKSwKK307CisKKy8qIDAuNSAvIGNvcyhwaSooMippKzEpLzM2KSAqLworc3RhdGljIGNvbnN0IElOVEZMT0FUIGljb3MzNmhbOV0gPSB7CisgICAgRklYSFIoMC41MDE5MDk5MTg3NzE2NzM2OTQ3OS8yKSwKKyAgICBGSVhIUigwLjUxNzYzODA5MDIwNTA0MTUyNDY5LzIpLCAvLzAKKyAgICBGSVhIUigwLjU1MTY4ODk1OTQ4MTI0NTg3ODI0LzIpLAorICAgIEZJWEhSKDAuNjEwMzg3Mjk0MzgwNzI4MDM0MTYvMiksCisgICAgRklYSFIoMC43MDcxMDY3ODExODY1NDc1MjQzOS8yKSwgLy8xCisgICAgRklYSFIoMC44NzE3MjMzOTc4MTA1NDkwMDk5MS8yKSwKKyAgICBGSVhIUigxLjE4MzEwMDc5MTU3NjI0OTI1ODk2LzQpLAorICAgIEZJWEhSKDEuOTMxODUxNjUyNTc4MTM2NTczNDkvNCksIC8vMgorLy8gICAgRklYSFIoNS43MzY4NTY2MjI4MzQ5Mjc1NjQ2MSksCit9OworCisvKiB1c2luZyBMZWUgbGlrZSBkZWNvbXBvc2l0aW9uIGZvbGxvd2VkIGJ5IGhhbmQgY29kZWQgOSBwb2ludHMgRENUICovCitzdGF0aWMgdm9pZCBpbWRjdDM2KElOVEZMT0FUICpvdXQsIElOVEZMT0FUICpidWYsIElOVEZMT0FUICppbiwgSU5URkxPQVQgKndpbikKK3sKKyAgICBpbnQgaSwgajsKKyAgICBJTlRGTE9BVCB0MCwgdDEsIHQyLCB0MywgczAsIHMxLCBzMiwgczM7CisgICAgSU5URkxPQVQgdG1wWzE4XSwgKnRtcDEsICppbjE7CisKKyAgICBmb3IgKGkgPSAxNzsgaSA+PSAxOyBpLS0pCisgICAgICAgIGluW2ldICs9IGluW2ktMV07CisgICAgZm9yIChpID0gMTc7IGkgPj0gMzsgaSAtPSAyKQorICAgICAgICBpbltpXSArPSBpbltpLTJdOworCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICB0bXAxID0gdG1wICsgajsKKyAgICAgICAgaW4xID0gaW4gKyBqOworCisgICAgICAgIHQyID0gaW4xWzIqNF0gKyBpbjFbMio4XSAtIGluMVsyKjJdOworCisgICAgICAgIHQzID0gaW4xWzIqMF0gKyBTSFIoaW4xWzIqNl0sMSk7CisgICAgICAgIHQxID0gaW4xWzIqMF0gLSBpbjFbMio2XTsKKyAgICAgICAgdG1wMVsgNl0gPSB0MSAtIFNIUih0MiwxKTsKKyAgICAgICAgdG1wMVsxNl0gPSB0MSArIHQyOworCisgICAgICAgIHQwID0gTVVMSDMoaW4xWzIqMl0gKyBpbjFbMio0XSAsICAgIEMyLCAyKTsKKyAgICAgICAgdDEgPSBNVUxIMyhpbjFbMio0XSAtIGluMVsyKjhdICwgLTIqQzgsIDEpOworICAgICAgICB0MiA9IE1VTEgzKGluMVsyKjJdICsgaW4xWzIqOF0gLCAgIC1DNCwgMik7CisKKyAgICAgICAgdG1wMVsxMF0gPSB0MyAtIHQwIC0gdDI7CisgICAgICAgIHRtcDFbIDJdID0gdDMgKyB0MCArIHQxOworICAgICAgICB0bXAxWzE0XSA9IHQzICsgdDIgLSB0MTsKKworICAgICAgICB0bXAxWyA0XSA9IE1VTEgzKGluMVsyKjVdICsgaW4xWzIqN10gLSBpbjFbMioxXSwgLUMzLCAyKTsKKyAgICAgICAgdDIgPSBNVUxIMyhpbjFbMioxXSArIGluMVsyKjVdLCAgICBDMSwgMik7CisgICAgICAgIHQzID0gTVVMSDMoaW4xWzIqNV0gLSBpbjFbMio3XSwgLTIqQzcsIDEpOworICAgICAgICB0MCA9IE1VTEgzKGluMVsyKjNdLCBDMywgMik7CisKKyAgICAgICAgdDEgPSBNVUxIMyhpbjFbMioxXSArIGluMVsyKjddLCAgIC1DNSwgMik7CisKKyAgICAgICAgdG1wMVsgMF0gPSB0MiArIHQzICsgdDA7CisgICAgICAgIHRtcDFbMTJdID0gdDIgKyB0MSAtIHQwOworICAgICAgICB0bXAxWyA4XSA9IHQzIC0gdDEgLSB0MDsKKyAgICB9CisKKyAgICBpID0gMDsKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIHQwID0gdG1wW2ldOworICAgICAgICB0MSA9IHRtcFtpICsgMl07CisgICAgICAgIHMwID0gdDEgKyB0MDsKKyAgICAgICAgczIgPSB0MSAtIHQwOworCisgICAgICAgIHQyID0gdG1wW2kgKyAxXTsKKyAgICAgICAgdDMgPSB0bXBbaSArIDNdOworICAgICAgICBzMSA9IE1VTEgzKHQzICsgdDIsIGljb3MzNmhbICAgIGpdLCAyKTsKKyAgICAgICAgczMgPSBNVUxMeCh0MyAtIHQyLCBpY29zMzYgWzggLSBqXSwgRlJBQ19CSVRTKTsKKworICAgICAgICB0MCA9IHMwICsgczE7CisgICAgICAgIHQxID0gczAgLSBzMTsKKyAgICAgICAgb3V0Wyg5ICsgaikgKiBTQkxJTUlUXSA9IE1VTEgzKHQxLCB3aW5bICAgICA5ICsgal0sIDEpICsgYnVmWzQqKDkgKyBqKV07CisgICAgICAgIG91dFsoOCAtIGopICogU0JMSU1JVF0gPSBNVUxIMyh0MSwgd2luWyAgICAgOCAtIGpdLCAxKSArIGJ1Zls0Kig4IC0gaildOworICAgICAgICBidWZbNCAqICggOSArIGogICAgICldID0gTVVMSDModDAsIHdpbltNRENUX0JVRl9TSVpFLzIgKyA5ICsgal0sIDEpOworICAgICAgICBidWZbNCAqICggOCAtIGogICAgICldID0gTVVMSDModDAsIHdpbltNRENUX0JVRl9TSVpFLzIgKyA4IC0gal0sIDEpOworCisgICAgICAgIHQwID0gczIgKyBzMzsKKyAgICAgICAgdDEgPSBzMiAtIHMzOworICAgICAgICBvdXRbKDkgKyA4IC0gaikgKiBTQkxJTUlUXSA9IE1VTEgzKHQxLCB3aW5bICAgICA5ICsgOCAtIGpdLCAxKSArIGJ1Zls0Kig5ICsgOCAtIGopXTsKKyAgICAgICAgb3V0WyAgICAgICAgIGogICogU0JMSU1JVF0gPSBNVUxIMyh0MSwgd2luWyAgICAgICAgICAgICBqXSwgMSkgKyBidWZbNCooICAgICAgICBqKV07CisgICAgICAgIGJ1Zls0ICogKCA5ICsgOCAtIGogICAgICldID0gTVVMSDModDAsIHdpbltNRENUX0JVRl9TSVpFLzIgKyA5ICsgOCAtIGpdLCAxKTsKKyAgICAgICAgYnVmWzQgKiAoICAgICAgICAgaiAgICAgKV0gPSBNVUxIMyh0MCwgd2luW01EQ1RfQlVGX1NJWkUvMiAgICAgICAgICsgal0sIDEpOworICAgICAgICBpICs9IDQ7CisgICAgfQorCisgICAgczAgPSB0bXBbMTZdOworICAgIHMxID0gTVVMSDModG1wWzE3XSwgaWNvczM2aFs0XSwgMik7CisgICAgdDAgPSBzMCArIHMxOworICAgIHQxID0gczAgLSBzMTsKKyAgICBvdXRbKDkgKyA0KSAqIFNCTElNSVRdID0gTVVMSDModDEsIHdpblsgICAgIDkgKyA0XSwgMSkgKyBidWZbNCooOSArIDQpXTsKKyAgICBvdXRbKDggLSA0KSAqIFNCTElNSVRdID0gTVVMSDModDEsIHdpblsgICAgIDggLSA0XSwgMSkgKyBidWZbNCooOCAtIDQpXTsKKyAgICBidWZbNCAqICggOSArIDQgICAgICldID0gTVVMSDModDAsIHdpbltNRENUX0JVRl9TSVpFLzIgKyA5ICsgNF0sIDEpOworICAgIGJ1Zls0ICogKCA4IC0gNCAgICAgKV0gPSBNVUxIMyh0MCwgd2luW01EQ1RfQlVGX1NJWkUvMiArIDggLSA0XSwgMSk7Cit9CisKK3ZvaWQgUkVOQU1FKGZmX2ltZGN0MzZfYmxvY2tzKShJTlRGTE9BVCAqb3V0LCBJTlRGTE9BVCAqYnVmLCBJTlRGTE9BVCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgc3dpdGNoX3BvaW50LCBpbnQgYmxvY2tfdHlwZSkKK3sKKyAgICBpbnQgajsKKyAgICBmb3IgKGo9MCA7IGogPCBjb3VudDsgaisrKSB7CisgICAgICAgIC8qIGFwcGx5IHdpbmRvdyAmIG92ZXJsYXAgd2l0aCBwcmV2aW91cyBidWZmZXIgKi8KKworICAgICAgICAvKiBzZWxlY3Qgd2luZG93ICovCisgICAgICAgIGludCB3aW5faWR4ID0gKHN3aXRjaF9wb2ludCAmJiBqIDwgMikgPyAwIDogYmxvY2tfdHlwZTsKKyAgICAgICAgSU5URkxPQVQgKndpbiA9IFJFTkFNRShmZl9tZGN0X3dpbilbd2luX2lkeCArICg0ICYgLShqICYgMSkpXTsKKworICAgICAgICBpbWRjdDM2KG91dCwgYnVmLCBpbiwgd2luKTsKKworICAgICAgICBpbiAgKz0gMTg7CisgICAgICAgIGJ1ZiArPSAoKGomMykgIT0gMyA/IDEgOiAoNzItMykpOworICAgICAgICBvdXQrKzsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2VuY19maXhlZC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZW5jX2ZpeGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyYjZmZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2VuY19maXhlZC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBUaGUgc2ltcGxlc3QgbXBlZyBhdWRpbyBsYXllciAyIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgIm1wZWdhdWRpb2VuY190ZW1wbGF0ZS5jIgorCitBVkNvZGVjIGZmX21wMmZpeGVkX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgICA9ICJtcDJmaXhlZCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUDIgZml4ZWQgcG9pbnQgKE1QRUcgYXVkaW8gbGF5ZXIgMikiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDIsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihNcGVnQXVkaW9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gTVBBX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICAgICAgICAgPSBNUEFfZW5jb2RlX2ZyYW1lLAorICAgIC5zYW1wbGVfZm10cyAgICAgICAgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAuc3VwcG9ydGVkX3NhbXBsZXJhdGVzID0gKGNvbnN0IGludFtdKXsKKyAgICAgICAgNDQxMDAsIDQ4MDAwLCAgMzIwMDAsIDIyMDUwLCAyNDAwMCwgMTYwMDAsIDAKKyAgICB9LAorICAgIC5jaGFubmVsX2xheW91dHMgICAgICAgPSAoY29uc3QgdWludDY0X3RbXSl7IEFWX0NIX0xBWU9VVF9NT05PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB9LAorICAgIC5kZWZhdWx0cyAgICAgICAgICAgICAgPSBtcDJfZGVmYXVsdHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZW5jX2Zsb2F0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9lbmNfZmxvYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRhYjJkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZW5jX2Zsb2F0LmMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIFRoZSBzaW1wbGVzdCBtcGVnIGF1ZGlvIGxheWVyIDIgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIFVTRV9GTE9BVFMgMQorI2luY2x1ZGUgIm1wZWdhdWRpb2VuY190ZW1wbGF0ZS5jIgorCitBVkNvZGVjIGZmX21wMl9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAibXAyIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QMiAoTVBFRyBhdWRpbyBsYXllciAyKSIpLAorICAgIC50eXBlICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QMiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKE1wZWdBdWRpb0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBNUEFfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgICAgICA9IE1QQV9lbmNvZGVfZnJhbWUsCisgICAgLnNhbXBsZV9mbXRzICAgICAgICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5zdXBwb3J0ZWRfc2FtcGxlcmF0ZXMgPSAoY29uc3QgaW50W10peworICAgICAgICA0NDEwMCwgNDgwMDAsICAzMjAwMCwgMjIwNTAsIDI0MDAwLCAxNjAwMCwgMAorICAgIH0sCisgICAgLmNoYW5uZWxfbGF5b3V0cyAgICAgICA9IChjb25zdCB1aW50NjRfdFtdKXsgQVZfQ0hfTEFZT1VUX01PTk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIH0sCisgICAgLmRlZmF1bHRzICAgICAgICAgICAgICA9IG1wMl9kZWZhdWx0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9lbmNfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWdhdWRpb2VuY190ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjk0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW9lbmNfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDc4NSBAQAorLyoKKyAqIFRoZSBzaW1wbGVzdCBtcGVnIGF1ZGlvIGxheWVyIDIgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUaGUgc2ltcGxlc3QgbXBlZyBhdWRpbyBsYXllciAyIGVuY29kZXIuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKworI2RlZmluZSBGUkFDX0JJVFMgICAxNSAgIC8qIGZyYWN0aW9uYWwgYml0cyBmb3Igc2Jfc2FtcGxlcyBhbmQgZGN0ICovCisjZGVmaW5lIFdGUkFDX0JJVFMgIDE0ICAgLyogZnJhY3Rpb25hbCBiaXRzIGZvciB3aW5kb3cgKi8KKworI2luY2x1ZGUgIm1wZWdhdWRpby5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RzcC5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RhdGEuaCIKKyNpbmNsdWRlICJtcGVnYXVkaW90YWIuaCIKKworLyogY3VycmVudGx5LCBjYW5ub3QgY2hhbmdlIHRoZXNlIGNvbnN0YW50cyAobmVlZCB0byBtb2RpZnkKKyAgIHF1YW50aXphdGlvbiBzdGFnZSkgKi8KKyNkZWZpbmUgTVVMKGEsYikgKCgoaW50NjRfdCkoYSkgKiAoaW50NjRfdCkoYikpID4+IEZSQUNfQklUUykKKworI2RlZmluZSBTQU1QTEVTX0JVRl9TSVpFIDQwOTYKKwordHlwZWRlZiBzdHJ1Y3QgTXBlZ0F1ZGlvQ29udGV4dCB7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBpbnQgbmJfY2hhbm5lbHM7CisgICAgaW50IGxzZjsgICAgICAgICAgIC8qIDEgaWYgbXBlZzIgbG93IGJpdHJhdGUgc2VsZWN0ZWQgKi8KKyAgICBpbnQgYml0cmF0ZV9pbmRleDsgLyogYml0IHJhdGUgKi8KKyAgICBpbnQgZnJlcV9pbmRleDsKKyAgICBpbnQgZnJhbWVfc2l6ZTsgLyogZnJhbWUgc2l6ZSwgaW4gYml0cywgd2l0aG91dCBwYWRkaW5nICovCisgICAgLyogcGFkZGluZyBjb21wdXRhdGlvbiAqLworICAgIGludCBmcmFtZV9mcmFjLCBmcmFtZV9mcmFjX2luY3IsIGRvX3BhZGRpbmc7CisgICAgc2hvcnQgc2FtcGxlc19idWZbTVBBX01BWF9DSEFOTkVMU11bU0FNUExFU19CVUZfU0laRV07IC8qIGJ1ZmZlciBmb3IgZmlsdGVyICovCisgICAgaW50IHNhbXBsZXNfb2Zmc2V0W01QQV9NQVhfQ0hBTk5FTFNdOyAgICAgICAvKiBvZmZzZXQgaW4gc2FtcGxlc19idWYgKi8KKyAgICBpbnQgc2Jfc2FtcGxlc1tNUEFfTUFYX0NIQU5ORUxTXVszXVsxMl1bU0JMSU1JVF07CisgICAgdW5zaWduZWQgY2hhciBzY2FsZV9mYWN0b3JzW01QQV9NQVhfQ0hBTk5FTFNdW1NCTElNSVRdWzNdOyAvKiBzY2FsZSBmYWN0b3JzICovCisgICAgLyogY29kZSB0byBncm91cCAzIHNjYWxlIGZhY3RvcnMgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNjYWxlX2NvZGVbTVBBX01BWF9DSEFOTkVMU11bU0JMSU1JVF07CisgICAgaW50IHNibGltaXQ7IC8qIG51bWJlciBvZiB1c2VkIHN1YmJhbmRzICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWxsb2NfdGFibGU7CisgICAgaW50MTZfdCBmaWx0ZXJfYmFua1s1MTJdOworICAgIGludCBzY2FsZV9mYWN0b3JfdGFibGVbNjRdOworICAgIHVuc2lnbmVkIGNoYXIgc2NhbGVfZGlmZl90YWJsZVsxMjhdOworI2lmIFVTRV9GTE9BVFMKKyAgICBmbG9hdCBzY2FsZV9mYWN0b3JfaW52X3RhYmxlWzY0XTsKKyNlbHNlCisgICAgaW50OF90IHNjYWxlX2ZhY3Rvcl9zaGlmdFs2NF07CisgICAgdW5zaWduZWQgc2hvcnQgc2NhbGVfZmFjdG9yX211bHRbNjRdOworI2VuZGlmCisgICAgdW5zaWduZWQgc2hvcnQgdG90YWxfcXVhbnRfYml0c1sxN107IC8qIHRvdGFsIG51bWJlciBvZiBiaXRzIHBlciBhbGxvY2F0aW9uIGdyb3VwICovCit9IE1wZWdBdWRpb0NvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBNUEFfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1wZWdBdWRpb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBmcmVxID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIGludCBiaXRyYXRlID0gYXZjdHgtPmJpdF9yYXRlOworICAgIGludCBjaGFubmVscyA9IGF2Y3R4LT5jaGFubmVsczsKKyAgICBpbnQgaSwgdiwgdGFibGU7CisgICAgZmxvYXQgYTsKKworICAgIGlmIChjaGFubmVscyA8PSAwIHx8IGNoYW5uZWxzID4gMil7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5jb2RpbmcgJWQgY2hhbm5lbChzKSBpcyBub3QgYWxsb3dlZCBpbiBtcDJcbiIsIGNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYml0cmF0ZSA9IGJpdHJhdGUgLyAxMDAwOworICAgIHMtPm5iX2NoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgYXZjdHgtPmZyYW1lX3NpemUgPSBNUEFfRlJBTUVfU0laRTsKKyAgICBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nID0gNTEyIC0gMzIgKyAxOworCisgICAgLyogZW5jb2RpbmcgZnJlcSAqLworICAgIHMtPmxzZiA9IDA7CisgICAgZm9yKGk9MDtpPDM7aSsrKSB7CisgICAgICAgIGlmIChhdnByaXZfbXBhX2ZyZXFfdGFiW2ldID09IGZyZXEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKChhdnByaXZfbXBhX2ZyZXFfdGFiW2ldIC8gMikgPT0gZnJlcSkgeworICAgICAgICAgICAgcy0+bHNmID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IDMpeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNhbXBsaW5nIHJhdGUgJWQgaXMgbm90IGFsbG93ZWQgaW4gbXAyXG4iLCBmcmVxKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcy0+ZnJlcV9pbmRleCA9IGk7CisKKyAgICAvKiBlbmNvZGluZyBiaXRyYXRlICYgZnJlcXVlbmN5ICovCisgICAgZm9yKGk9MTtpPDE1O2krKykgeworICAgICAgICBpZiAoYXZwcml2X21wYV9iaXRyYXRlX3RhYltzLT5sc2ZdWzFdW2ldID09IGJpdHJhdGUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gMTUgJiYgIWF2Y3R4LT5iaXRfcmF0ZSkgeworICAgICAgICBpID0gMTQ7CisgICAgICAgIGJpdHJhdGUgPSBhdnByaXZfbXBhX2JpdHJhdGVfdGFiW3MtPmxzZl1bMV1baV07CisgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IGJpdHJhdGUgKiAxMDAwOworICAgIH0KKyAgICBpZiAoaSA9PSAxNSl7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYml0cmF0ZSAlZCBpcyBub3QgYWxsb3dlZCBpbiBtcDJcbiIsIGJpdHJhdGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBzLT5iaXRyYXRlX2luZGV4ID0gaTsKKworICAgIC8qIGNvbXB1dGUgdG90YWwgaGVhZGVyIHNpemUgJiBwYWQgYml0ICovCisKKyAgICBhID0gKGZsb2F0KShiaXRyYXRlICogMTAwMCAqIE1QQV9GUkFNRV9TSVpFKSAvIChmcmVxICogOC4wKTsKKyAgICBzLT5mcmFtZV9zaXplID0gKChpbnQpYSkgKiA4OworCisgICAgLyogZnJhbWUgZnJhY3Rpb25hbCBzaXplIHRvIGNvbXB1dGUgcGFkZGluZyAqLworICAgIHMtPmZyYW1lX2ZyYWMgPSAwOworICAgIHMtPmZyYW1lX2ZyYWNfaW5jciA9IChpbnQpKChhIC0gZmxvb3IoYSkpICogNjU1MzYuMCk7CisKKyAgICAvKiBzZWxlY3QgdGhlIHJpZ2h0IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICB0YWJsZSA9IGZmX21wYV9sMl9zZWxlY3RfdGFibGUoYml0cmF0ZSwgcy0+bmJfY2hhbm5lbHMsIGZyZXEsIHMtPmxzZik7CisKKyAgICAvKiBudW1iZXIgb2YgdXNlZCBzdWJiYW5kcyAqLworICAgIHMtPnNibGltaXQgPSBmZl9tcGFfc2JsaW1pdF90YWJsZVt0YWJsZV07CisgICAgcy0+YWxsb2NfdGFibGUgPSBmZl9tcGFfYWxsb2NfdGFibGVzW3RhYmxlXTsKKworICAgIGF2X2Rsb2coYXZjdHgsICIlZCBrYi9zLCAlZCBIeiwgZnJhbWVfc2l6ZT0lZCBiaXRzLCB0YWJsZT0lZCwgcGFkaW5jcj0leFxuIiwKKyAgICAgICAgICAgIGJpdHJhdGUsIGZyZXEsIHMtPmZyYW1lX3NpemUsIHRhYmxlLCBzLT5mcmFtZV9mcmFjX2luY3IpOworCisgICAgZm9yKGk9MDtpPHMtPm5iX2NoYW5uZWxzO2krKykKKyAgICAgICAgcy0+c2FtcGxlc19vZmZzZXRbaV0gPSAwOworCisgICAgZm9yKGk9MDtpPDI1NztpKyspIHsKKyAgICAgICAgaW50IHY7CisgICAgICAgIHYgPSBmZl9tcGFfZW53aW5kb3dbaV07CisjaWYgV0ZSQUNfQklUUyAhPSAxNgorICAgICAgICB2ID0gKHYgKyAoMSA8PCAoMTYgLSBXRlJBQ19CSVRTIC0gMSkpKSA+PiAoMTYgLSBXRlJBQ19CSVRTKTsKKyNlbmRpZgorICAgICAgICBzLT5maWx0ZXJfYmFua1tpXSA9IHY7CisgICAgICAgIGlmICgoaSAmIDYzKSAhPSAwKQorICAgICAgICAgICAgdiA9IC12OworICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgICAgcy0+ZmlsdGVyX2JhbmtbNTEyIC0gaV0gPSB2OworICAgIH0KKworICAgIGZvcihpPTA7aTw2NDtpKyspIHsKKyAgICAgICAgdiA9IChpbnQpKGV4cDIoKDMgLSBpKSAvIDMuMCkgKiAoMSA8PCAyMCkpOworICAgICAgICBpZiAodiA8PSAwKQorICAgICAgICAgICAgdiA9IDE7CisgICAgICAgIHMtPnNjYWxlX2ZhY3Rvcl90YWJsZVtpXSA9IHY7CisjaWYgVVNFX0ZMT0FUUworICAgICAgICBzLT5zY2FsZV9mYWN0b3JfaW52X3RhYmxlW2ldID0gZXhwMigtKDMgLSBpKSAvIDMuMCkgLyAoZmxvYXQpKDEgPDwgMjApOworI2Vsc2UKKyNkZWZpbmUgUCAxNQorICAgICAgICBzLT5zY2FsZV9mYWN0b3Jfc2hpZnRbaV0gPSAyMSAtIFAgLSAoaSAvIDMpOworICAgICAgICBzLT5zY2FsZV9mYWN0b3JfbXVsdFtpXSA9ICgxIDw8IFApICogZXhwMigoaSAlIDMpIC8gMy4wKTsKKyNlbmRpZgorICAgIH0KKyAgICBmb3IoaT0wO2k8MTI4O2krKykgeworICAgICAgICB2ID0gaSAtIDY0OworICAgICAgICBpZiAodiA8PSAtMykKKyAgICAgICAgICAgIHYgPSAwOworICAgICAgICBlbHNlIGlmICh2IDwgMCkKKyAgICAgICAgICAgIHYgPSAxOworICAgICAgICBlbHNlIGlmICh2ID09IDApCisgICAgICAgICAgICB2ID0gMjsKKyAgICAgICAgZWxzZSBpZiAodiA8IDMpCisgICAgICAgICAgICB2ID0gMzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdiA9IDQ7CisgICAgICAgIHMtPnNjYWxlX2RpZmZfdGFibGVbaV0gPSB2OworICAgIH0KKworICAgIGZvcihpPTA7aTwxNztpKyspIHsKKyAgICAgICAgdiA9IGZmX21wYV9xdWFudF9iaXRzW2ldOworICAgICAgICBpZiAodiA8IDApCisgICAgICAgICAgICB2ID0gLXY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHYgPSB2ICogMzsKKyAgICAgICAgcy0+dG90YWxfcXVhbnRfYml0c1tpXSA9IDEyICogdjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogMzIgcG9pbnQgZmxvYXRpbmcgcG9pbnQgSURDVCB3aXRob3V0IDEvc3FydCgyKSBjb2VmIHplcm8gc2NhbGluZyAqLworc3RhdGljIHZvaWQgaWRjdDMyKGludCAqb3V0LCBpbnQgKnRhYikKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgKnQsICp0MSwgeHI7CisgICAgY29uc3QgaW50ICp4cCA9IGNvc3RhYjMyOworCisgICAgZm9yKGo9MzE7aj49MztqLT0yKSB0YWJbal0gKz0gdGFiW2ogLSAyXTsKKworICAgIHQgPSB0YWIgKyAzMDsKKyAgICB0MSA9IHRhYiArIDI7CisgICAgZG8geworICAgICAgICB0WzBdICs9IHRbLTRdOworICAgICAgICB0WzFdICs9IHRbMSAtIDRdOworICAgICAgICB0IC09IDQ7CisgICAgfSB3aGlsZSAodCAhPSB0MSk7CisKKyAgICB0ID0gdGFiICsgMjg7CisgICAgdDEgPSB0YWIgKyA0OworICAgIGRvIHsKKyAgICAgICAgdFswXSArPSB0Wy04XTsKKyAgICAgICAgdFsxXSArPSB0WzEtOF07CisgICAgICAgIHRbMl0gKz0gdFsyLThdOworICAgICAgICB0WzNdICs9IHRbMy04XTsKKyAgICAgICAgdCAtPSA4OworICAgIH0gd2hpbGUgKHQgIT0gdDEpOworCisgICAgdCA9IHRhYjsKKyAgICB0MSA9IHRhYiArIDMyOworICAgIGRvIHsKKyAgICAgICAgdFsgM10gPSAtdFsgM107CisgICAgICAgIHRbIDZdID0gLXRbIDZdOworCisgICAgICAgIHRbMTFdID0gLXRbMTFdOworICAgICAgICB0WzEyXSA9IC10WzEyXTsKKyAgICAgICAgdFsxM10gPSAtdFsxM107CisgICAgICAgIHRbMTVdID0gLXRbMTVdOworICAgICAgICB0ICs9IDE2OworICAgIH0gd2hpbGUgKHQgIT0gdDEpOworCisKKyAgICB0ID0gdGFiOworICAgIHQxID0gdGFiICsgODsKKyAgICBkbyB7CisgICAgICAgIGludCB4MSwgeDIsIHgzLCB4NDsKKworICAgICAgICB4MyA9IE1VTCh0WzE2XSwgRklYKFNRUlQyKjAuNSkpOworICAgICAgICB4NCA9IHRbMF0gLSB4MzsKKyAgICAgICAgeDMgPSB0WzBdICsgeDM7CisKKyAgICAgICAgeDIgPSBNVUwoLSh0WzI0XSArIHRbOF0pLCBGSVgoU1FSVDIqMC41KSk7CisgICAgICAgIHgxID0gTVVMKCh0WzhdIC0geDIpLCB4cFswXSk7CisgICAgICAgIHgyID0gTVVMKCh0WzhdICsgeDIpLCB4cFsxXSk7CisKKyAgICAgICAgdFsgMF0gPSB4MyArIHgxOworICAgICAgICB0WyA4XSA9IHg0IC0geDI7CisgICAgICAgIHRbMTZdID0geDQgKyB4MjsKKyAgICAgICAgdFsyNF0gPSB4MyAtIHgxOworICAgICAgICB0Kys7CisgICAgfSB3aGlsZSAodCAhPSB0MSk7CisKKyAgICB4cCArPSAyOworICAgIHQgPSB0YWI7CisgICAgdDEgPSB0YWIgKyA0OworICAgIGRvIHsKKyAgICAgICAgeHIgPSBNVUwodFsyOF0seHBbMF0pOworICAgICAgICB0WzI4XSA9ICh0WzBdIC0geHIpOworICAgICAgICB0WzBdID0gKHRbMF0gKyB4cik7CisKKyAgICAgICAgeHIgPSBNVUwodFs0XSx4cFsxXSk7CisgICAgICAgIHRbIDRdID0gKHRbMjRdIC0geHIpOworICAgICAgICB0WzI0XSA9ICh0WzI0XSArIHhyKTsKKworICAgICAgICB4ciA9IE1VTCh0WzIwXSx4cFsyXSk7CisgICAgICAgIHRbMjBdID0gKHRbOF0gLSB4cik7CisgICAgICAgIHRbIDhdID0gKHRbOF0gKyB4cik7CisKKyAgICAgICAgeHIgPSBNVUwodFsxMl0seHBbM10pOworICAgICAgICB0WzEyXSA9ICh0WzE2XSAtIHhyKTsKKyAgICAgICAgdFsxNl0gPSAodFsxNl0gKyB4cik7CisgICAgICAgIHQrKzsKKyAgICB9IHdoaWxlICh0ICE9IHQxKTsKKyAgICB4cCArPSA0OworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICB4ciA9IE1VTCh0YWJbMzAtaSo0XSx4cFswXSk7CisgICAgICAgIHRhYlszMC1pKjRdID0gKHRhYltpKjRdIC0geHIpOworICAgICAgICB0YWJbICAgaSo0XSA9ICh0YWJbaSo0XSArIHhyKTsKKworICAgICAgICB4ciA9IE1VTCh0YWJbIDIraSo0XSx4cFsxXSk7CisgICAgICAgIHRhYlsgMitpKjRdID0gKHRhYlsyOC1pKjRdIC0geHIpOworICAgICAgICB0YWJbMjgtaSo0XSA9ICh0YWJbMjgtaSo0XSArIHhyKTsKKworICAgICAgICB4ciA9IE1VTCh0YWJbMzEtaSo0XSx4cFswXSk7CisgICAgICAgIHRhYlszMS1pKjRdID0gKHRhYlsxK2kqNF0gLSB4cik7CisgICAgICAgIHRhYlsgMStpKjRdID0gKHRhYlsxK2kqNF0gKyB4cik7CisKKyAgICAgICAgeHIgPSBNVUwodGFiWyAzK2kqNF0seHBbMV0pOworICAgICAgICB0YWJbIDMraSo0XSA9ICh0YWJbMjktaSo0XSAtIHhyKTsKKyAgICAgICAgdGFiWzI5LWkqNF0gPSAodGFiWzI5LWkqNF0gKyB4cik7CisKKyAgICAgICAgeHAgKz0gMjsKKyAgICB9CisKKyAgICB0ID0gdGFiICsgMzA7CisgICAgdDEgPSB0YWIgKyAxOworICAgIGRvIHsKKyAgICAgICAgeHIgPSBNVUwodDFbMF0sICp4cCk7CisgICAgICAgIHQxWzBdID0gKHRbMF0gLSB4cik7CisgICAgICAgIHRbMF0gPSAodFswXSArIHhyKTsKKyAgICAgICAgdCAtPSAyOworICAgICAgICB0MSArPSAyOworICAgICAgICB4cCsrOworICAgIH0gd2hpbGUgKHQgPj0gdGFiKTsKKworICAgIGZvcihpPTA7aTwzMjtpKyspIHsKKyAgICAgICAgb3V0W2ldID0gdGFiW2JpdGludjMyW2ldXTsKKyAgICB9Cit9CisKKyNkZWZpbmUgV1NISUZUIChXRlJBQ19CSVRTICsgMTUgLSBGUkFDX0JJVFMpCisKK3N0YXRpYyB2b2lkIGZpbHRlcihNcGVnQXVkaW9Db250ZXh0ICpzLCBpbnQgY2gsIGNvbnN0IHNob3J0ICpzYW1wbGVzLCBpbnQgaW5jcikKK3sKKyAgICBzaG9ydCAqcCwgKnE7CisgICAgaW50IHN1bSwgb2Zmc2V0LCBpLCBqOworICAgIGludCB0bXBbNjRdOworICAgIGludCB0bXAxWzMyXTsKKyAgICBpbnQgKm91dDsKKworICAgIG9mZnNldCA9IHMtPnNhbXBsZXNfb2Zmc2V0W2NoXTsKKyAgICBvdXQgPSAmcy0+c2Jfc2FtcGxlc1tjaF1bMF1bMF1bMF07CisgICAgZm9yKGo9MDtqPDM2O2orKykgeworICAgICAgICAvKiAzMiBzYW1wbGVzIGF0IG9uY2UgKi8KKyAgICAgICAgZm9yKGk9MDtpPDMyO2krKykgeworICAgICAgICAgICAgcy0+c2FtcGxlc19idWZbY2hdW29mZnNldCArICgzMSAtIGkpXSA9IHNhbXBsZXNbMF07CisgICAgICAgICAgICBzYW1wbGVzICs9IGluY3I7CisgICAgICAgIH0KKworICAgICAgICAvKiBmaWx0ZXIgKi8KKyAgICAgICAgcCA9IHMtPnNhbXBsZXNfYnVmW2NoXSArIG9mZnNldDsKKyAgICAgICAgcSA9IHMtPmZpbHRlcl9iYW5rOworICAgICAgICAvKiBtYXhzdW0gPSAyMzE2OSAqLworICAgICAgICBmb3IoaT0wO2k8NjQ7aSsrKSB7CisgICAgICAgICAgICBzdW0gPSBwWzAqNjRdICogcVswKjY0XTsKKyAgICAgICAgICAgIHN1bSArPSBwWzEqNjRdICogcVsxKjY0XTsKKyAgICAgICAgICAgIHN1bSArPSBwWzIqNjRdICogcVsyKjY0XTsKKyAgICAgICAgICAgIHN1bSArPSBwWzMqNjRdICogcVszKjY0XTsKKyAgICAgICAgICAgIHN1bSArPSBwWzQqNjRdICogcVs0KjY0XTsKKyAgICAgICAgICAgIHN1bSArPSBwWzUqNjRdICogcVs1KjY0XTsKKyAgICAgICAgICAgIHN1bSArPSBwWzYqNjRdICogcVs2KjY0XTsKKyAgICAgICAgICAgIHN1bSArPSBwWzcqNjRdICogcVs3KjY0XTsKKyAgICAgICAgICAgIHRtcFtpXSA9IHN1bTsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIHErKzsKKyAgICAgICAgfQorICAgICAgICB0bXAxWzBdID0gdG1wWzE2XSA+PiBXU0hJRlQ7CisgICAgICAgIGZvciggaT0xOyBpPD0xNjsgaSsrICkgdG1wMVtpXSA9ICh0bXBbaSsxNl0rdG1wWzE2LWldKSA+PiBXU0hJRlQ7CisgICAgICAgIGZvciggaT0xNzsgaTw9MzE7IGkrKyApIHRtcDFbaV0gPSAodG1wW2krMTZdLXRtcFs4MC1pXSkgPj4gV1NISUZUOworCisgICAgICAgIGlkY3QzMihvdXQsIHRtcDEpOworCisgICAgICAgIC8qIGFkdmFuY2Ugb2YgMzIgc2FtcGxlcyAqLworICAgICAgICBvZmZzZXQgLT0gMzI7CisgICAgICAgIG91dCArPSAzMjsKKyAgICAgICAgLyogaGFuZGxlIHRoZSB3cmFwIGFyb3VuZCAqLworICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgbWVtbW92ZShzLT5zYW1wbGVzX2J1ZltjaF0gKyBTQU1QTEVTX0JVRl9TSVpFIC0gKDUxMiAtIDMyKSwKKyAgICAgICAgICAgICAgICAgICAgcy0+c2FtcGxlc19idWZbY2hdLCAoNTEyIC0gMzIpICogMik7CisgICAgICAgICAgICBvZmZzZXQgPSBTQU1QTEVTX0JVRl9TSVpFIC0gNTEyOworICAgICAgICB9CisgICAgfQorICAgIHMtPnNhbXBsZXNfb2Zmc2V0W2NoXSA9IG9mZnNldDsKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZV9zY2FsZV9mYWN0b3JzKE1wZWdBdWRpb0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBzY2FsZV9jb2RlW1NCTElNSVRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgc2NhbGVfZmFjdG9yc1tTQkxJTUlUXVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Jfc2FtcGxlc1szXVsxMl1bU0JMSU1JVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNibGltaXQpCit7CisgICAgaW50ICpwLCB2bWF4LCB2LCBuLCBpLCBqLCBrLCBjb2RlOworICAgIGludCBpbmRleCwgZDEsIGQyOworICAgIHVuc2lnbmVkIGNoYXIgKnNmID0gJnNjYWxlX2ZhY3RvcnNbMF1bMF07CisKKyAgICBmb3Ioaj0wO2o8c2JsaW1pdDtqKyspIHsKKyAgICAgICAgZm9yKGk9MDtpPDM7aSsrKSB7CisgICAgICAgICAgICAvKiBmaW5kIHRoZSBtYXggYWJzb2x1dGUgdmFsdWUgKi8KKyAgICAgICAgICAgIHAgPSAmc2Jfc2FtcGxlc1tpXVswXVtqXTsKKyAgICAgICAgICAgIHZtYXggPSBhYnMoKnApOworICAgICAgICAgICAgZm9yKGs9MTtrPDEyO2srKykgeworICAgICAgICAgICAgICAgIHAgKz0gU0JMSU1JVDsKKyAgICAgICAgICAgICAgICB2ID0gYWJzKCpwKTsKKyAgICAgICAgICAgICAgICBpZiAodiA+IHZtYXgpCisgICAgICAgICAgICAgICAgICAgIHZtYXggPSB2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY29tcHV0ZSB0aGUgc2NhbGUgZmFjdG9yIGluZGV4IHVzaW5nIGxvZyAyIGNvbXB1dGF0aW9ucyAqLworICAgICAgICAgICAgaWYgKHZtYXggPiAxKSB7CisgICAgICAgICAgICAgICAgbiA9IGF2X2xvZzIodm1heCk7CisgICAgICAgICAgICAgICAgLyogbiBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIE1TQiBvZiB2bWF4LiBub3cKKyAgICAgICAgICAgICAgICAgICB1c2UgYXQgbW9zdCAyIGNvbXBhcmVzIHRvIGZpbmQgdGhlIGluZGV4ICovCisgICAgICAgICAgICAgICAgaW5kZXggPSAoMjEgLSBuKSAqIDMgLSAzOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh2bWF4IDw9IHMtPnNjYWxlX2ZhY3Rvcl90YWJsZVtpbmRleCsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwOyAvKiB2ZXJ5IHVubGlrZWx5IGNhc2Ugb2Ygb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZGV4ID0gNjI7IC8qIHZhbHVlIDYzIGlzIG5vdCBhbGxvd2VkICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgIiUyZDolZCBpbj0leCAleCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaiwgaSwgdm1heCwgcy0+c2NhbGVfZmFjdG9yX3RhYmxlW2luZGV4XSwgaW5kZXgpOworICAgICAgICAgICAgLyogc3RvcmUgdGhlIHNjYWxlIGZhY3RvciAqLworICAgICAgICAgICAgYXZfYXNzZXJ0MihpbmRleCA+PTAgJiYgaW5kZXggPD0gNjMpOworICAgICAgICAgICAgc2ZbaV0gPSBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHRyYW5zbWlzc2lvbiBmYWN0b3IgOiBsb29rIGlmIHRoZSBzY2FsZSBmYWN0b3JzCisgICAgICAgICAgIGFyZSBjbG9zZSBlbm91Z2ggdG8gZWFjaCBvdGhlciAqLworICAgICAgICBkMSA9IHMtPnNjYWxlX2RpZmZfdGFibGVbc2ZbMF0gLSBzZlsxXSArIDY0XTsKKyAgICAgICAgZDIgPSBzLT5zY2FsZV9kaWZmX3RhYmxlW3NmWzFdIC0gc2ZbMl0gKyA2NF07CisKKyAgICAgICAgLyogaGFuZGxlIHRoZSAyNSBjYXNlcyAqLworICAgICAgICBzd2l0Y2goZDEgKiA1ICsgZDIpIHsKKyAgICAgICAgY2FzZSAwKjUrMDoKKyAgICAgICAgY2FzZSAwKjUrNDoKKyAgICAgICAgY2FzZSAzKjUrNDoKKyAgICAgICAgY2FzZSA0KjUrMDoKKyAgICAgICAgY2FzZSA0KjUrNDoKKyAgICAgICAgICAgIGNvZGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMCo1KzE6CisgICAgICAgIGNhc2UgMCo1KzI6CisgICAgICAgIGNhc2UgNCo1KzE6CisgICAgICAgIGNhc2UgNCo1KzI6CisgICAgICAgICAgICBjb2RlID0gMzsKKyAgICAgICAgICAgIHNmWzJdID0gc2ZbMV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwKjUrMzoKKyAgICAgICAgY2FzZSA0KjUrMzoKKyAgICAgICAgICAgIGNvZGUgPSAzOworICAgICAgICAgICAgc2ZbMV0gPSBzZlsyXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEqNSswOgorICAgICAgICBjYXNlIDEqNSs0OgorICAgICAgICBjYXNlIDIqNSs0OgorICAgICAgICAgICAgY29kZSA9IDE7CisgICAgICAgICAgICBzZlsxXSA9IHNmWzBdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMSo1KzE6CisgICAgICAgIGNhc2UgMSo1KzI6CisgICAgICAgIGNhc2UgMio1KzA6CisgICAgICAgIGNhc2UgMio1KzE6CisgICAgICAgIGNhc2UgMio1KzI6CisgICAgICAgICAgICBjb2RlID0gMjsKKyAgICAgICAgICAgIHNmWzFdID0gc2ZbMl0gPSBzZlswXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIqNSszOgorICAgICAgICBjYXNlIDMqNSszOgorICAgICAgICAgICAgY29kZSA9IDI7CisgICAgICAgICAgICBzZlswXSA9IHNmWzFdID0gc2ZbMl07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzKjUrMDoKKyAgICAgICAgY2FzZSAzKjUrMToKKyAgICAgICAgY2FzZSAzKjUrMjoKKyAgICAgICAgICAgIGNvZGUgPSAyOworICAgICAgICAgICAgc2ZbMF0gPSBzZlsyXSA9IHNmWzFdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMSo1KzM6CisgICAgICAgICAgICBjb2RlID0gMjsKKyAgICAgICAgICAgIGlmIChzZlswXSA+IHNmWzJdKQorICAgICAgICAgICAgICBzZlswXSA9IHNmWzJdOworICAgICAgICAgICAgc2ZbMV0gPSBzZlsyXSA9IHNmWzBdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQyKDApOyAvL2Nhbm5vdCBoYXBwZW4KKyAgICAgICAgICAgIGNvZGUgPSAwOyAgICAgICAgICAgLyoga2lsbCB3YXJuaW5nICovCisgICAgICAgIH0KKworICAgICAgICBhdl9kbG9nKE5VTEwsICIlZDogJTJkICUyZCAlMmQgJWQgJWQgLT4gJWRcbiIsIGosCisgICAgICAgICAgICAgICAgc2ZbMF0sIHNmWzFdLCBzZlsyXSwgZDEsIGQyLCBjb2RlKTsKKyAgICAgICAgc2NhbGVfY29kZVtqXSA9IGNvZGU7CisgICAgICAgIHNmICs9IDM7CisgICAgfQorfQorCisvKiBUaGUgbW9zdCBpbXBvcnRhbnQgZnVuY3Rpb24gOiBwc3ljaG8gYWNvdXN0aWMgbW9kdWxlLiBJbiB0aGlzCisgICBlbmNvZGVyIHRoZXJlIGlzIGJhc2ljYWxseSBub25lLCBzbyB0aGlzIGlzIHRoZSB3b3JzdCB5b3UgY2FuIGRvLAorICAgYnV0IGFsc28gdGhpcyBpcyB0aGUgc2ltcGxlci4gKi8KK3N0YXRpYyB2b2lkIHBzeWNob19hY291c3RpY19tb2RlbChNcGVnQXVkaW9Db250ZXh0ICpzLCBzaG9ydCBzbXJbU0JMSU1JVF0pCit7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT0wO2k8cy0+c2JsaW1pdDtpKyspIHsKKyAgICAgICAgc21yW2ldID0gKGludCkoZml4ZWRfc21yW2ldICogMTApOworICAgIH0KK30KKworCisjZGVmaW5lIFNCX05PVEFMTE9DQVRFRCAgMAorI2RlZmluZSBTQl9BTExPQ0FURUQgICAgIDEKKyNkZWZpbmUgU0JfTk9NT1JFICAgICAgICAyCisKKy8qIFRyeSB0byBtYXhpbWl6ZSB0aGUgc21yIHdoaWxlIHVzaW5nIGEgbnVtYmVyIG9mIGJpdHMgaW5mZXJpb3IgdG8KKyAgIHRoZSBmcmFtZSBzaXplLiBJIHRyaWVkIHRvIG1ha2UgdGhlIGNvZGUgc2ltcGxlciwgZmFzdGVyIGFuZAorICAgc21hbGxlciB0aGFuIG90aGVyIGVuY29kZXJzIDotKSAqLworc3RhdGljIHZvaWQgY29tcHV0ZV9iaXRfYWxsb2NhdGlvbihNcGVnQXVkaW9Db250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzbXIxW01QQV9NQVhfQ0hBTk5FTFNdW1NCTElNSVRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJpdF9hbGxvY1tNUEFfTUFYX0NIQU5ORUxTXVtTQkxJTUlUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwYWRkaW5nKQoreworICAgIGludCBpLCBjaCwgYiwgbWF4X3NtciwgbWF4X2NoLCBtYXhfc2IsIGN1cnJlbnRfZnJhbWVfc2l6ZSwgbWF4X2ZyYW1lX3NpemU7CisgICAgaW50IGluY3I7CisgICAgc2hvcnQgc21yW01QQV9NQVhfQ0hBTk5FTFNdW1NCTElNSVRdOworICAgIHVuc2lnbmVkIGNoYXIgc3ViYmFuZF9zdGF0dXNbTVBBX01BWF9DSEFOTkVMU11bU0JMSU1JVF07CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWxsb2M7CisKKyAgICBtZW1jcHkoc21yLCBzbXIxLCBzLT5uYl9jaGFubmVscyAqIHNpemVvZihzaG9ydCkgKiBTQkxJTUlUKTsKKyAgICBtZW1zZXQoc3ViYmFuZF9zdGF0dXMsIFNCX05PVEFMTE9DQVRFRCwgcy0+bmJfY2hhbm5lbHMgKiBTQkxJTUlUKTsKKyAgICBtZW1zZXQoYml0X2FsbG9jLCAwLCBzLT5uYl9jaGFubmVscyAqIFNCTElNSVQpOworCisgICAgLyogY29tcHV0ZSBmcmFtZSBzaXplIGFuZCBwYWRkaW5nICovCisgICAgbWF4X2ZyYW1lX3NpemUgPSBzLT5mcmFtZV9zaXplOworICAgIHMtPmZyYW1lX2ZyYWMgKz0gcy0+ZnJhbWVfZnJhY19pbmNyOworICAgIGlmIChzLT5mcmFtZV9mcmFjID49IDY1NTM2KSB7CisgICAgICAgIHMtPmZyYW1lX2ZyYWMgLT0gNjU1MzY7CisgICAgICAgIHMtPmRvX3BhZGRpbmcgPSAxOworICAgICAgICBtYXhfZnJhbWVfc2l6ZSArPSA4OworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmRvX3BhZGRpbmcgPSAwOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgdGhlIGhlYWRlciArIGJpdCBhbGxvYyBzaXplICovCisgICAgY3VycmVudF9mcmFtZV9zaXplID0gMzI7CisgICAgYWxsb2MgPSBzLT5hbGxvY190YWJsZTsKKyAgICBmb3IoaT0wO2k8cy0+c2JsaW1pdDtpKyspIHsKKyAgICAgICAgaW5jciA9IGFsbG9jWzBdOworICAgICAgICBjdXJyZW50X2ZyYW1lX3NpemUgKz0gaW5jciAqIHMtPm5iX2NoYW5uZWxzOworICAgICAgICBhbGxvYyArPSAxIDw8IGluY3I7CisgICAgfQorICAgIGZvcig7OykgeworICAgICAgICAvKiBsb29rIGZvciB0aGUgc3ViYmFuZCB3aXRoIHRoZSBsYXJnZXN0IHNpZ25hbCB0byBtYXNrIHJhdGlvICovCisgICAgICAgIG1heF9zYiA9IC0xOworICAgICAgICBtYXhfY2ggPSAtMTsKKyAgICAgICAgbWF4X3NtciA9IElOVF9NSU47CisgICAgICAgIGZvcihjaD0wO2NoPHMtPm5iX2NoYW5uZWxzO2NoKyspIHsKKyAgICAgICAgICAgIGZvcihpPTA7aTxzLT5zYmxpbWl0O2krKykgeworICAgICAgICAgICAgICAgIGlmIChzbXJbY2hdW2ldID4gbWF4X3NtciAmJiBzdWJiYW5kX3N0YXR1c1tjaF1baV0gIT0gU0JfTk9NT1JFKSB7CisgICAgICAgICAgICAgICAgICAgIG1heF9zbXIgPSBzbXJbY2hdW2ldOworICAgICAgICAgICAgICAgICAgICBtYXhfc2IgPSBpOworICAgICAgICAgICAgICAgICAgICBtYXhfY2ggPSBjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heF9zYiA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiY3VycmVudD0lZCBtYXg9JWQgbWF4X3NiPSVkIG1heF9jaD0lZCBhbGxvYz0lZFxuIiwKKyAgICAgICAgICAgICAgICBjdXJyZW50X2ZyYW1lX3NpemUsIG1heF9mcmFtZV9zaXplLCBtYXhfc2IsIG1heF9jaCwKKyAgICAgICAgICAgICAgICBiaXRfYWxsb2NbbWF4X2NoXVttYXhfc2JdKTsKKworICAgICAgICAvKiBmaW5kIGFsbG9jIHRhYmxlIGVudHJ5IChYWFg6IG5vdCBvcHRpbWFsLCBzaG91bGQgdXNlCisgICAgICAgICAgIHBvaW50ZXIgdGFibGUpICovCisgICAgICAgIGFsbG9jID0gcy0+YWxsb2NfdGFibGU7CisgICAgICAgIGZvcihpPTA7aTxtYXhfc2I7aSsrKSB7CisgICAgICAgICAgICBhbGxvYyArPSAxIDw8IGFsbG9jWzBdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1YmJhbmRfc3RhdHVzW21heF9jaF1bbWF4X3NiXSA9PSBTQl9OT1RBTExPQ0FURUQpIHsKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgd2FzIGNvZGVkIGZvciB0aGlzIGJhbmQ6IGFkZCB0aGUgbmVjZXNzYXJ5IGJpdHMgKi8KKyAgICAgICAgICAgIGluY3IgPSAyICsgbmJfc2NhbGVfZmFjdG9yc1tzLT5zY2FsZV9jb2RlW21heF9jaF1bbWF4X3NiXV0gKiA2OworICAgICAgICAgICAgaW5jciArPSBzLT50b3RhbF9xdWFudF9iaXRzW2FsbG9jWzFdXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGluY3JlbWVudHMgYml0IGFsbG9jYXRpb24gKi8KKyAgICAgICAgICAgIGIgPSBiaXRfYWxsb2NbbWF4X2NoXVttYXhfc2JdOworICAgICAgICAgICAgaW5jciA9IHMtPnRvdGFsX3F1YW50X2JpdHNbYWxsb2NbYiArIDFdXSAtCisgICAgICAgICAgICAgICAgcy0+dG90YWxfcXVhbnRfYml0c1thbGxvY1tiXV07CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VycmVudF9mcmFtZV9zaXplICsgaW5jciA8PSBtYXhfZnJhbWVfc2l6ZSkgeworICAgICAgICAgICAgLyogY2FuIGluY3JlYXNlIHNpemUgKi8KKyAgICAgICAgICAgIGIgPSArK2JpdF9hbGxvY1ttYXhfY2hdW21heF9zYl07CisgICAgICAgICAgICBjdXJyZW50X2ZyYW1lX3NpemUgKz0gaW5jcjsKKyAgICAgICAgICAgIC8qIGRlY3JlYXNlIHNtciBieSB0aGUgcmVzb2x1dGlvbiB3ZSBhZGRlZCAqLworICAgICAgICAgICAgc21yW21heF9jaF1bbWF4X3NiXSA9IHNtcjFbbWF4X2NoXVttYXhfc2JdIC0gcXVhbnRfc25yW2FsbG9jW2JdXTsKKyAgICAgICAgICAgIC8qIG1heCBhbGxvY2F0aW9uIHNpemUgcmVhY2hlZCA/ICovCisgICAgICAgICAgICBpZiAoYiA9PSAoKDEgPDwgYWxsb2NbMF0pIC0gMSkpCisgICAgICAgICAgICAgICAgc3ViYmFuZF9zdGF0dXNbbWF4X2NoXVttYXhfc2JdID0gU0JfTk9NT1JFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN1YmJhbmRfc3RhdHVzW21heF9jaF1bbWF4X3NiXSA9IFNCX0FMTE9DQVRFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGNhbm5vdCBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGlzIHN1YmJhbmQgKi8KKyAgICAgICAgICAgIHN1YmJhbmRfc3RhdHVzW21heF9jaF1bbWF4X3NiXSA9IFNCX05PTU9SRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqcGFkZGluZyA9IG1heF9mcmFtZV9zaXplIC0gY3VycmVudF9mcmFtZV9zaXplOworICAgIGF2X2Fzc2VydDAoKnBhZGRpbmcgPj0gMCk7Cit9CisKKy8qCisgKiBPdXRwdXQgdGhlIG1wZWcgYXVkaW8gbGF5ZXIgMiBmcmFtZS4gTm90ZSBob3cgdGhlIGNvZGUgaXMgc21hbGwKKyAqIGNvbXBhcmVkIHRvIG90aGVyIGVuY29kZXJzIDotKQorICovCitzdGF0aWMgdm9pZCBlbmNvZGVfZnJhbWUoTXBlZ0F1ZGlvQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJpdF9hbGxvY1tNUEFfTUFYX0NIQU5ORUxTXVtTQkxJTUlUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFkZGluZykKK3sKKyAgICBpbnQgaSwgaiwgaywgbCwgYml0X2FsbG9jX2JpdHMsIGIsIGNoOworICAgIHVuc2lnbmVkIGNoYXIgKnNmOworICAgIGludCBxWzNdOworICAgIFB1dEJpdENvbnRleHQgKnAgPSAmcy0+cGI7CisKKyAgICAvKiBoZWFkZXIgKi8KKworICAgIHB1dF9iaXRzKHAsIDEyLCAweGZmZik7CisgICAgcHV0X2JpdHMocCwgMSwgMSAtIHMtPmxzZik7IC8qIDEgPSBtcGVnMSBJRCwgMCA9IG1wZWcyIGxzZiBJRCAqLworICAgIHB1dF9iaXRzKHAsIDIsIDQtMik7ICAvKiBsYXllciAyICovCisgICAgcHV0X2JpdHMocCwgMSwgMSk7IC8qIG5vIGVycm9yIHByb3RlY3Rpb24gKi8KKyAgICBwdXRfYml0cyhwLCA0LCBzLT5iaXRyYXRlX2luZGV4KTsKKyAgICBwdXRfYml0cyhwLCAyLCBzLT5mcmVxX2luZGV4KTsKKyAgICBwdXRfYml0cyhwLCAxLCBzLT5kb19wYWRkaW5nKTsgLyogdXNlIHBhZGRpbmcgKi8KKyAgICBwdXRfYml0cyhwLCAxLCAwKTsgICAgICAgICAgICAgLyogcHJpdmF0ZV9iaXQgKi8KKyAgICBwdXRfYml0cyhwLCAyLCBzLT5uYl9jaGFubmVscyA9PSAyID8gTVBBX1NURVJFTyA6IE1QQV9NT05PKTsKKyAgICBwdXRfYml0cyhwLCAyLCAwKTsgLyogbW9kZV9leHQgKi8KKyAgICBwdXRfYml0cyhwLCAxLCAwKTsgLyogbm8gY29weXJpZ2h0ICovCisgICAgcHV0X2JpdHMocCwgMSwgMSk7IC8qIG9yaWdpbmFsICovCisgICAgcHV0X2JpdHMocCwgMiwgMCk7IC8qIG5vIGVtcGhhc2lzICovCisKKyAgICAvKiBiaXQgYWxsb2NhdGlvbiAqLworICAgIGogPSAwOworICAgIGZvcihpPTA7aTxzLT5zYmxpbWl0O2krKykgeworICAgICAgICBiaXRfYWxsb2NfYml0cyA9IHMtPmFsbG9jX3RhYmxlW2pdOworICAgICAgICBmb3IoY2g9MDtjaDxzLT5uYl9jaGFubmVscztjaCsrKSB7CisgICAgICAgICAgICBwdXRfYml0cyhwLCBiaXRfYWxsb2NfYml0cywgYml0X2FsbG9jW2NoXVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgaiArPSAxIDw8IGJpdF9hbGxvY19iaXRzOworICAgIH0KKworICAgIC8qIHNjYWxlIGNvZGVzICovCisgICAgZm9yKGk9MDtpPHMtPnNibGltaXQ7aSsrKSB7CisgICAgICAgIGZvcihjaD0wO2NoPHMtPm5iX2NoYW5uZWxzO2NoKyspIHsKKyAgICAgICAgICAgIGlmIChiaXRfYWxsb2NbY2hdW2ldKQorICAgICAgICAgICAgICAgIHB1dF9iaXRzKHAsIDIsIHMtPnNjYWxlX2NvZGVbY2hdW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNjYWxlIGZhY3RvcnMgKi8KKyAgICBmb3IoaT0wO2k8cy0+c2JsaW1pdDtpKyspIHsKKyAgICAgICAgZm9yKGNoPTA7Y2g8cy0+bmJfY2hhbm5lbHM7Y2grKykgeworICAgICAgICAgICAgaWYgKGJpdF9hbGxvY1tjaF1baV0pIHsKKyAgICAgICAgICAgICAgICBzZiA9ICZzLT5zY2FsZV9mYWN0b3JzW2NoXVtpXVswXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocy0+c2NhbGVfY29kZVtjaF1baV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHAsIDYsIHNmWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMocCwgNiwgc2ZbMV0pOworICAgICAgICAgICAgICAgICAgICBwdXRfYml0cyhwLCA2LCBzZlsyXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHAsIDYsIHNmWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMocCwgNiwgc2ZbMl0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHAsIDYsIHNmWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogcXVhbnRpemF0aW9uICYgd3JpdGUgc3ViIGJhbmQgc2FtcGxlcyAqLworCisgICAgZm9yKGs9MDtrPDM7aysrKSB7CisgICAgICAgIGZvcihsPTA7bDwxMjtsKz0zKSB7CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgIGZvcihpPTA7aTxzLT5zYmxpbWl0O2krKykgeworICAgICAgICAgICAgICAgIGJpdF9hbGxvY19iaXRzID0gcy0+YWxsb2NfdGFibGVbal07CisgICAgICAgICAgICAgICAgZm9yKGNoPTA7Y2g8cy0+bmJfY2hhbm5lbHM7Y2grKykgeworICAgICAgICAgICAgICAgICAgICBiID0gYml0X2FsbG9jW2NoXVtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBxaW5kZXgsIHN0ZXBzLCBtLCBzYW1wbGUsIGJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBlbmNvZGUgMyBzdWIgYmFuZCBzYW1wbGVzIG9mIHRoZSBzYW1lIHN1YiBiYW5kIGF0IGEgdGltZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcWluZGV4ID0gcy0+YWxsb2NfdGFibGVbaitiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzID0gZmZfbXBhX3F1YW50X3N0ZXBzW3FpbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IobT0wO208MzttKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgPSBzLT5zYl9zYW1wbGVzW2NoXVtrXVtsICsgbV1baV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGl2aWRlIGJ5IHNjYWxlIGZhY3RvciAqLworI2lmIFVTRV9GTE9BVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSAoZmxvYXQpc2FtcGxlICogcy0+c2NhbGVfZmFjdG9yX2ludl90YWJsZVtzLT5zY2FsZV9mYWN0b3JzW2NoXVtpXVtrXV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFbbV0gPSAoaW50KSgoYSArIDEuMCkgKiBzdGVwcyAqIDAuNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxMSwgZSwgc2hpZnQsIG11bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBzLT5zY2FsZV9mYWN0b3JzW2NoXVtpXVtrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSBzLT5zY2FsZV9mYWN0b3Jfc2hpZnRbZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHQgPSBzLT5zY2FsZV9mYWN0b3JfbXVsdFtlXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3JtYWxpemUgdG8gUCBiaXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxMSA9IHNhbXBsZSA8PCAoLXNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTEgPSBzYW1wbGUgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHExID0gKHExICogbXVsdCkgPj4gUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTEgKz0gMSA8PCBQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocTEgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW21dID0gKHExICogKHVuc2lnbmVkKXN0ZXBzKSA+PiAoUCArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxW21dID49IHN0ZXBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW21dID0gc3RlcHMgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIocVttXSA+PSAwICYmIHFbbV0gPCBzdGVwcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzID0gZmZfbXBhX3F1YW50X2JpdHNbcWluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyb3VwIHRoZSAzIHZhbHVlcyB0byBzYXZlIGJpdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cyhwLCAtYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxWzBdICsgc3RlcHMgKiAocVsxXSArIHN0ZXBzICogcVsyXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cyhwLCBiaXRzLCBxWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cyhwLCBiaXRzLCBxWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cyhwLCBiaXRzLCBxWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBuZXh0IHN1YmJhbmQgaW4gYWxsb2MgdGFibGUgKi8KKyAgICAgICAgICAgICAgICBqICs9IDEgPDwgYml0X2FsbG9jX2JpdHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWRkaW5nICovCisgICAgZm9yKGk9MDtpPHBhZGRpbmc7aSsrKQorICAgICAgICBwdXRfYml0cyhwLCAxLCAwKTsKKworICAgIC8qIGZsdXNoICovCisgICAgZmx1c2hfcHV0X2JpdHMocCk7Cit9CisKK3N0YXRpYyBpbnQgTVBBX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBNcGVnQXVkaW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBpbnQxNl90ICpzYW1wbGVzID0gKGNvbnN0IGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKyAgICBzaG9ydCBzbXJbTVBBX01BWF9DSEFOTkVMU11bU0JMSU1JVF07CisgICAgdW5zaWduZWQgY2hhciBiaXRfYWxsb2NbTVBBX01BWF9DSEFOTkVMU11bU0JMSU1JVF07CisgICAgaW50IHBhZGRpbmcsIGksIHJldDsKKworICAgIGZvcihpPTA7aTxzLT5uYl9jaGFubmVscztpKyspIHsKKyAgICAgICAgZmlsdGVyKHMsIGksIHNhbXBsZXMgKyBpLCBzLT5uYl9jaGFubmVscyk7CisgICAgfQorCisgICAgZm9yKGk9MDtpPHMtPm5iX2NoYW5uZWxzO2krKykgeworICAgICAgICBjb21wdXRlX3NjYWxlX2ZhY3RvcnMocywgcy0+c2NhbGVfY29kZVtpXSwgcy0+c2NhbGVfZmFjdG9yc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNiX3NhbXBsZXNbaV0sIHMtPnNibGltaXQpOworICAgIH0KKyAgICBmb3IoaT0wO2k8cy0+bmJfY2hhbm5lbHM7aSsrKSB7CisgICAgICAgIHBzeWNob19hY291c3RpY19tb2RlbChzLCBzbXJbaV0pOworICAgIH0KKyAgICBjb21wdXRlX2JpdF9hbGxvY2F0aW9uKHMsIHNtciwgYml0X2FsbG9jLCAmcGFkZGluZyk7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBNUEFfTUFYX0NPREVEX0ZSQU1FX1NJWkUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIGVuY29kZV9mcmFtZShzLCBiaXRfYWxsb2MsIHBhZGRpbmcpOworCisgICAgaWYgKGZyYW1lLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGF2cGt0LT5wdHMgPSBmcmFtZS0+cHRzIC0gZmZfc2FtcGxlc190b190aW1lX2Jhc2UoYXZjdHgsIGF2Y3R4LT5pbml0aWFsX3BhZGRpbmcpOworCisgICAgYXZwa3QtPnNpemUgPSBwdXRfYml0c19jb3VudCgmcy0+cGIpIC8gODsKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgbXAyX2RlZmF1bHRzW10gPSB7CisgICAgeyAiYiIsICIwIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvdGFiLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVnYXVkaW90YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ0MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvdGFiLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBtcGVnIGF1ZGlvIGxheWVyIDIgdGFibGVzLiBNb3N0IG9mIHRoZW0gY29tZSBmcm9tIHRoZSBtcGVnIGF1ZGlvCisgKiBzcGVjaWZpY2F0aW9uLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbXBlZyBhdWRpbyBsYXllciAyIHRhYmxlcy4KKyAqIE1vc3Qgb2YgdGhlbSBjb21lIGZyb20gdGhlIG1wZWcgYXVkaW8gc3BlY2lmaWNhdGlvbi4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTVBFR0FVRElPVEFCX0gKKyNkZWZpbmUgQVZDT0RFQ19NUEVHQVVESU9UQUJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibXBlZ2F1ZGlvLmgiCisKKyNkZWZpbmUgU1FSVDIgMS40MTQyMTM1NjIzNzMwOTUxNDU0NworCitzdGF0aWMgY29uc3QgaW50IGNvc3RhYjMyWzMwXSA9IHsKKyAgICBGSVgoMC41NDExOTYxMDAxNDYxOTcwMTIyMiksCisgICAgRklYKDEuMzA2NTYyOTY0ODc2Mzc2MzUzNyksCisKKyAgICBGSVgoMC41MDk3OTU1NzkxMDQxNTkxNzk5OCksCisgICAgRklYKDIuNTYyOTE1NDQ3NzQxNTA1NDgxNCksCisgICAgRklYKDAuODk5OTc2MjIzMTM2NDE1NTY1MTMpLAorICAgIEZJWCgwLjYwMTM0NDg4NjkzNTA0NTI4NjM0KSwKKworICAgIEZJWCgwLjUwMjQxOTI4NjE4ODE1NTY3ODIpLAorICAgIEZJWCg1LjEwMTE0ODYxODY4OTE1NTI1NjMpLAorICAgIEZJWCgwLjc4ODE1NDYyMzQ1MTI1MDIwMjQ5KSwKKyAgICBGSVgoMC42NDY4MjE3ODMzNTk5OTAwNzY3OSksCisgICAgRklYKDAuNTY2OTQ0MDM0ODE2MzU3Njg5MjcpLAorICAgIEZJWCgxLjA2MDY3NzY4NTk5MDM0NzA2MzMpLAorICAgIEZJWCgxLjcyMjQ0NzA5ODIzODMzNDE5NTUpLAorICAgIEZJWCgwLjUyMjQ5ODYxNDkzOTY4ODg1NDYyKSwKKworICAgIEZJWCgxMC4xOTAwMDgxMjM1NDgwMzI4NyksCisgICAgRklYKDAuNjc0ODA4MzQxNDU1MDA1Njc4KSwKKyAgICBGSVgoMS4xNjk0Mzk5MzM0MzI4ODQ2NTk2KSwKKyAgICBGSVgoMC41MzEwNDI1OTEwODk3ODQxMzI4NCksCisgICAgRklYKDIuMDU3NzgxMDA5OTUzNDEwODQ0NiksCisgICAgRklYKDAuNTgyOTM0OTY4MjA2MTMzODg1NTQpLAorICAgIEZJWCgwLjgzOTM0OTY0NTQxNTUyNjgxMjcyKSwKKyAgICBGSVgoMC41MDU0NzA5NTk4OTc1NDM2NDc5OCksCisgICAgRklYKDMuNDA3NjA4NDE4NDY4NzE4OTgwNCksCisgICAgRklYKDAuNjIyNTA0MTIzMDM1NjY0ODI0NzUpLAorICAgIEZJWCgwLjk3MjU2ODIzNzg2MTk2MDc4MjYzKSwKKyAgICBGSVgoMC41MTU0NDczMDk5MjI2MjQ1NTI0OSksCisgICAgRklYKDEuNDg0MTY0NjE2MzE0MTY2MTg1MiksCisgICAgRklYKDAuNTUzMTAzODk2MDM0NDQ0NTQyMSksCisgICAgRklYKDAuNzQ0NTM2MjcxMDAyMjk4NTc3NDkpLAorICAgIEZJWCgwLjUwMDYwMjk5ODIzNTE5NjI3MjYpLAorfTsKKworc3RhdGljIGNvbnN0IGludCBiaXRpbnYzMlszMl0gPSB7CisgICAgMCwgIDE2LCAgOCwgMjQsICA0LCAgMjAsICAxMiwgIDI4LAorICAgIDIsICAxOCwgMTAsIDI2LCAgNiwgIDIyLCAgMTQsICAzMCwKKyAgICAxLCAgMTcsICA5LCAyNSwgIDUsICAyMSwgIDEzLCAgMjksCisgICAgMywgIDE5LCAxMSwgMjcsICA3LCAgMjMsICAxNSwgIDMxCit9OworCisKKy8qIHNpZ25hbCB0byBub2lzZSByYXRpbyBvZiBlYWNoIHF1YW50aWZpY2F0aW9uIHN0ZXAgKGNvdWxkIGJlCisgICBjb21wdXRlZCBmcm9tIHF1YW50X3N0ZXBzW10pLiBUaGUgdmFsdWVzIGFyZSBkQiBtdWx0aXBsaWVkIGJ5IDEwCisqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHF1YW50X3NuclsxN10gPSB7CisgICAgIDcwLCAxMTAsIDE2MCwgMjA4LAorICAgIDI1MywgMzE2LCAzNzgsIDQzOSwKKyAgICA0OTksIDU1OSwgNjIwLCA2ODAsCisgICAgNzQwLCA4MDAsIDg2MSwgOTIwLAorICAgIDk4MAorfTsKKworLyogZml4ZWQgcHN5Y2hvIGFjb3VzdGljIG1vZGVsLiBWYWx1ZXMgb2YgU05SIHRha2VuIGZyb20gdGhlICd0b29sYW1lJworICAgcHJvamVjdCAqLworc3RhdGljIGNvbnN0IGZsb2F0IGZpeGVkX3NtcltTQkxJTUlUXSA9ICB7CisgICAgMzAsIDE3LCAxNiwgMTAsIDMsIDEyLCA4LCAyLjUsCisgICAgNSwgNSwgNiwgNiwgNSwgNiwgMTAsIDYsCisgICAgLTQsIC0xMCwgLTIxLCAtMzAsIC00MiwgLTU1LCAtNjgsIC03NSwKKyAgICAtNzUsIC03NSwgLTc1LCAtNzUsIC05MSwgLTEwNywgLTExMCwgLTEwOAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmJfc2NhbGVfZmFjdG9yc1s0XSA9IHsgMywgMiwgMSwgMiB9OworCisjZW5kaWYgLyogQVZDT0RFQ19NUEVHQVVESU9UQUJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ3V0aWxzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVndXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmNjMzZhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ3V0aWxzLmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIE1wZWcgdmlkZW8gZm9ybWF0cy1yZWxhdGVkIGRlZmluZXMgYW5kIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1wZWd1dGlscy5oIgorCit2b2lkIGZmX2RyYXdfaG9yaXpfYmFuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpjdXIsIEFWRnJhbWUgKmxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwgaW50IGgsIGludCBwaWN0dXJlX3N0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdF9maWVsZCwgaW50IGxvd19kZWxheSkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKKyAgICBpbnQgdnNoaWZ0ID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICBjb25zdCBpbnQgZmllbGRfcGljID0gcGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRTsKKyAgICBpZiAoZmllbGRfcGljKSB7CisgICAgICAgIGggPDw9IDE7CisgICAgICAgIHkgPDw9IDE7CisgICAgfQorCisgICAgaCA9IEZGTUlOKGgsIGF2Y3R4LT5oZWlnaHQgLSB5KTsKKworICAgIGlmIChmaWVsZF9waWMgJiYgZmlyc3RfZmllbGQgJiYKKyAgICAgICAgIShhdmN0eC0+c2xpY2VfZmxhZ3MgJiBTTElDRV9GTEFHX0FMTE9XX0ZJRUxEKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGF2Y3R4LT5kcmF3X2hvcml6X2JhbmQpIHsKKyAgICAgICAgQVZGcmFtZSAqc3JjOworICAgICAgICBpbnQgb2Zmc2V0W0FWX05VTV9EQVRBX1BPSU5URVJTXTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYgKGN1ci0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CIHx8IGxvd19kZWxheSB8fAorICAgICAgICAgICAoYXZjdHgtPnNsaWNlX2ZsYWdzICYgU0xJQ0VfRkxBR19DT0RFRF9PUkRFUikpCisgICAgICAgICAgICBzcmMgPSBjdXI7CisgICAgICAgIGVsc2UgaWYgKGxhc3QpCisgICAgICAgICAgICBzcmMgPSBsYXN0OworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGN1ci0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmCisgICAgICAgICAgICBwaWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FICYmCisgICAgICAgICAgICBhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfU1ZRMykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEFWX05VTV9EQVRBX1BPSU5URVJTOyBpKyspCisgICAgICAgICAgICAgICAgb2Zmc2V0W2ldID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZnNldFswXT0geSAqIHNyYy0+bGluZXNpemVbMF07CisgICAgICAgICAgICBvZmZzZXRbMV09CisgICAgICAgICAgICBvZmZzZXRbMl09ICh5ID4+IHZzaGlmdCkgKiBzcmMtPmxpbmVzaXplWzFdOworICAgICAgICAgICAgZm9yIChpID0gMzsgaSA8IEFWX05VTV9EQVRBX1BPSU5URVJTOyBpKyspCisgICAgICAgICAgICAgICAgb2Zmc2V0W2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGVtbXNfYygpOworCisgICAgICAgIGF2Y3R4LT5kcmF3X2hvcml6X2JhbmQoYXZjdHgsIHNyYywgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksIHBpY3R1cmVfc3RydWN0dXJlLCBoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVndXRpbHMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWd1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTljMjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVndXRpbHMuaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIE1wZWcgdmlkZW8gZm9ybWF0cy1yZWxhdGVkIGRlZmluZXMgYW5kIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NUEVHVVRJTFNfSAorI2RlZmluZSBBVkNPREVDX01QRUdVVElMU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworCisvKiBwaWN0dXJlIHR5cGUgKi8KKyNkZWZpbmUgUElDVF9UT1BfRklFTEQgICAgIDEKKyNkZWZpbmUgUElDVF9CT1RUT01fRklFTEQgIDIKKyNkZWZpbmUgUElDVF9GUkFNRSAgICAgICAgIDMKKworLyoqCisgKiBWYWx1ZSBvZiBQaWN0dXJlLnJlZmVyZW5jZSB3aGVuIFBpY3R1cmUgaXMgbm90IGEgcmVmZXJlbmNlIHBpY3R1cmUsIGJ1dAorICogaXMgaGVsZCBmb3IgZGVsYXllZCBvdXRwdXQuCisgKi8KKyNkZWZpbmUgREVMQVlFRF9QSUNfUkVGIDQKKworCisvKiBNQiB0eXBlcyAqLworI2lmICFGRl9BUElfTUJfVFlQRQorI2RlZmluZSBNQl9UWVBFX0lOVFJBNHg0ICAgKDEgPDwgIDApCisjZGVmaW5lIE1CX1RZUEVfSU5UUkExNngxNiAoMSA8PCAgMSkgLy8gRklYTUUgSC4yNjQtc3BlY2lmaWMKKyNkZWZpbmUgTUJfVFlQRV9JTlRSQV9QQ00gICgxIDw8ICAyKSAvLyBGSVhNRSBILjI2NC1zcGVjaWZpYworI2RlZmluZSBNQl9UWVBFXzE2eDE2ICAgICAgKDEgPDwgIDMpCisjZGVmaW5lIE1CX1RZUEVfMTZ4OCAgICAgICAoMSA8PCAgNCkKKyNkZWZpbmUgTUJfVFlQRV84eDE2ICAgICAgICgxIDw8ICA1KQorI2RlZmluZSBNQl9UWVBFXzh4OCAgICAgICAgKDEgPDwgIDYpCisjZGVmaW5lIE1CX1RZUEVfSU5URVJMQUNFRCAoMSA8PCAgNykKKyNkZWZpbmUgTUJfVFlQRV9ESVJFQ1QyICAgICgxIDw8ICA4KSAvLyBGSVhNRQorI2RlZmluZSBNQl9UWVBFX0FDUFJFRCAgICAgKDEgPDwgIDkpCisjZGVmaW5lIE1CX1RZUEVfR01DICAgICAgICAoMSA8PCAxMCkKKyNkZWZpbmUgTUJfVFlQRV9TS0lQICAgICAgICgxIDw8IDExKQorI2RlZmluZSBNQl9UWVBFX1AwTDAgICAgICAgKDEgPDwgMTIpCisjZGVmaW5lIE1CX1RZUEVfUDFMMCAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgTUJfVFlQRV9QMEwxICAgICAgICgxIDw8IDE0KQorI2RlZmluZSBNQl9UWVBFX1AxTDEgICAgICAgKDEgPDwgMTUpCisjZGVmaW5lIE1CX1RZUEVfTDAgICAgICAgICAoTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwKQorI2RlZmluZSBNQl9UWVBFX0wxICAgICAgICAgKE1CX1RZUEVfUDBMMSB8IE1CX1RZUEVfUDFMMSkKKyNkZWZpbmUgTUJfVFlQRV9MMEwxICAgICAgIChNQl9UWVBFX0wwICAgfCBNQl9UWVBFX0wxKQorI2RlZmluZSBNQl9UWVBFX1FVQU5UICAgICAgKDEgPDwgMTYpCisjZGVmaW5lIE1CX1RZUEVfQ0JQICAgICAgICAoMSA8PCAxNykKKyNlbmRpZgorCisjZGVmaW5lIE1CX1RZUEVfSU5UUkEgICAgTUJfVFlQRV9JTlRSQTR4NCAvLyBkZWZhdWx0IG1iX3R5cGUgaWYgdGhlcmUgaXMganVzdCBvbmUgdHlwZQorCisjZGVmaW5lIElTX0lOVFJBNHg0KGEpICAgKChhKSAmIE1CX1RZUEVfSU5UUkE0eDQpCisjZGVmaW5lIElTX0lOVFJBMTZ4MTYoYSkgKChhKSAmIE1CX1RZUEVfSU5UUkExNngxNikKKyNkZWZpbmUgSVNfUENNKGEpICAgICAgICAoKGEpICYgTUJfVFlQRV9JTlRSQV9QQ00pCisjZGVmaW5lIElTX0lOVFJBKGEpICAgICAgKChhKSAmIDcpCisjZGVmaW5lIElTX0lOVEVSKGEpICAgICAgKChhKSAmIChNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV8xNng4IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV84eDE2ICB8IE1CX1RZUEVfOHg4KSkKKyNkZWZpbmUgSVNfU0tJUChhKSAgICAgICAoKGEpICYgTUJfVFlQRV9TS0lQKQorI2RlZmluZSBJU19JTlRSQV9QQ00oYSkgICgoYSkgJiBNQl9UWVBFX0lOVFJBX1BDTSkKKyNkZWZpbmUgSVNfSU5URVJMQUNFRChhKSAoKGEpICYgTUJfVFlQRV9JTlRFUkxBQ0VEKQorI2RlZmluZSBJU19ESVJFQ1QoYSkgICAgICgoYSkgJiBNQl9UWVBFX0RJUkVDVDIpCisjZGVmaW5lIElTX0dNQyhhKSAgICAgICAgKChhKSAmIE1CX1RZUEVfR01DKQorI2RlZmluZSBJU18xNlgxNihhKSAgICAgICgoYSkgJiBNQl9UWVBFXzE2eDE2KQorI2RlZmluZSBJU18xNlg4KGEpICAgICAgICgoYSkgJiBNQl9UWVBFXzE2eDgpCisjZGVmaW5lIElTXzhYMTYoYSkgICAgICAgKChhKSAmIE1CX1RZUEVfOHgxNikKKyNkZWZpbmUgSVNfOFg4KGEpICAgICAgICAoKGEpICYgTUJfVFlQRV84eDgpCisjZGVmaW5lIElTX1NVQl84WDgoYSkgICAgKChhKSAmIE1CX1RZUEVfMTZ4MTYpIC8vIG5vdGUgcmV1c2VkCisjZGVmaW5lIElTX1NVQl84WDQoYSkgICAgKChhKSAmIE1CX1RZUEVfMTZ4OCkgIC8vIG5vdGUgcmV1c2VkCisjZGVmaW5lIElTX1NVQl80WDgoYSkgICAgKChhKSAmIE1CX1RZUEVfOHgxNikgIC8vIG5vdGUgcmV1c2VkCisjZGVmaW5lIElTX1NVQl80WDQoYSkgICAgKChhKSAmIE1CX1RZUEVfOHg4KSAgIC8vIG5vdGUgcmV1c2VkCisjZGVmaW5lIElTX0FDUFJFRChhKSAgICAgKChhKSAmIE1CX1RZUEVfQUNQUkVEKQorI2RlZmluZSBJU19RVUFOVChhKSAgICAgICgoYSkgJiBNQl9UWVBFX1FVQU5UKQorI2RlZmluZSBJU19ESVIoYSwgcGFydCwgbGlzdCkgKChhKSAmIChNQl9UWVBFX1AwTDAgPDwgKChwYXJ0KSArIDIgKiAobGlzdCkpKSkKKworLy8gZG9lcyB0aGlzIG1iIHVzZSBsaXN0WCwgbm90ZSBkb2VzIG5vdCB3b3JrIGlmIHN1Yk1CcworI2RlZmluZSBVU0VTX0xJU1QoYSwgbGlzdCkgKChhKSAmICgoTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwKSA8PCAoMiAqIChsaXN0KSkpKQorCisjZGVmaW5lIEhBU19DQlAoYSkgICAgICAgKChhKSAmIE1CX1RZUEVfQ0JQKQorCisvKiBNQiB0eXBlcyBmb3IgZW5jb2RpbmcgKi8KKyNkZWZpbmUgQ0FORElEQVRFX01CX1RZUEVfSU5UUkEgICAgICAoMSA8PCAgMCkKKyNkZWZpbmUgQ0FORElEQVRFX01CX1RZUEVfSU5URVIgICAgICAoMSA8PCAgMSkKKyNkZWZpbmUgQ0FORElEQVRFX01CX1RZUEVfSU5URVI0ViAgICAoMSA8PCAgMikKKyNkZWZpbmUgQ0FORElEQVRFX01CX1RZUEVfU0tJUFBFRCAgICAoMSA8PCAgMykKKworI2RlZmluZSBDQU5ESURBVEVfTUJfVFlQRV9ESVJFQ1QgICAgICgxIDw8ICA0KQorI2RlZmluZSBDQU5ESURBVEVfTUJfVFlQRV9GT1JXQVJEICAgICgxIDw8ICA1KQorI2RlZmluZSBDQU5ESURBVEVfTUJfVFlQRV9CQUNLV0FSRCAgICgxIDw8ICA2KQorI2RlZmluZSBDQU5ESURBVEVfTUJfVFlQRV9CSURJUiAgICAgICgxIDw8ICA3KQorCisjZGVmaW5lIENBTkRJREFURV9NQl9UWVBFX0lOVEVSX0kgICAgKDEgPDwgIDgpCisjZGVmaW5lIENBTkRJREFURV9NQl9UWVBFX0ZPUldBUkRfSSAgKDEgPDwgIDkpCisjZGVmaW5lIENBTkRJREFURV9NQl9UWVBFX0JBQ0tXQVJEX0kgKDEgPDwgMTApCisjZGVmaW5lIENBTkRJREFURV9NQl9UWVBFX0JJRElSX0kgICAgKDEgPDwgMTEpCisKKyNkZWZpbmUgQ0FORElEQVRFX01CX1RZUEVfRElSRUNUMCAgICAoMSA8PCAxMikKKworCisvKioKKyAqIERyYXcgYSBob3Jpem9udGFsIGJhbmQgaWYgc3VwcG9ydGVkLgorICoKKyAqIEBwYXJhbSBoIGlzIHRoZSBub3JtYWwgaGVpZ2h0LCB0aGlzIHdpbGwgYmUgcmVkdWNlZCBhdXRvbWF0aWNhbGx5IGlmIG5lZWRlZAorICovCit2b2lkIGZmX2RyYXdfaG9yaXpfYmFuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmN1ciwgQVZGcmFtZSAqbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LCBpbnQgaCwgaW50IHBpY3R1cmVfc3RydWN0dXJlLCBpbnQgZmlyc3RfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93X2RlbGF5KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUElDVFRZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVndmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODQ1NTdiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvLmMKQEAgLTAsMCArMSwzNDExIEBACisvKgorICogVGhlIHNpbXBsZXN0IG1wZWcgZW5jb2RlciAod2VsbCwgaXQgd2FzIHRoZSBzaW1wbGVzdCEpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogNE1WICYgaHEgJiBCLWZyYW1lIGVuY29kaW5nIHN0dWZmIGJ5IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFRoZSBzaW1wbGVzdCBtcGVnIGVuY29kZXIgKHdlbGwsIGl0IHdhcyB0aGUgc2ltcGxlc3QhKS4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbW90aW9uX3ZlY3Rvci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJibG9ja2RzcC5oIgorI2luY2x1ZGUgImgyNjRjaHJvbWEuaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAibWpwZWdlbmMuaCIKKyNpbmNsdWRlICJtc21wZWc0LmgiCisjaW5jbHVkZSAicXBlbGRzcC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCitzdGF0aWMgY29uc3QgdWludDhfdCBmZl9kZWZhdWx0X2Nocm9tYV9xc2NhbGVfdGFibGVbMzJdID0geworLy8gICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAxMCAgMTEgIDEyICAxMyAgMTQgIDE1CisgICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfbXBlZzFfZGNfc2NhbGVfdGFibGVbMTI4XSA9IHsKKy8vICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1CisgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXBlZzJfZGNfc2NhbGVfdGFibGUxWzEyOF0gPSB7CisvLyAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNQorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1wZWcyX2RjX3NjYWxlX3RhYmxlMlsxMjhdID0geworLy8gIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtcGVnMl9kY19zY2FsZV90YWJsZTNbMTI4XSA9IHsKKy8vICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1CisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorfTsKKworY29uc3QgdWludDhfdCAqY29uc3QgZmZfbXBlZzJfZGNfc2NhbGVfdGFibGVbNF0gPSB7CisgICAgZmZfbXBlZzFfZGNfc2NhbGVfdGFibGUsCisgICAgbXBlZzJfZGNfc2NhbGVfdGFibGUxLAorICAgIG1wZWcyX2RjX3NjYWxlX3RhYmxlMiwKKyAgICBtcGVnMl9kY19zY2FsZV90YWJsZTMsCit9OworCitjb25zdCB1aW50OF90IGZmX2FsdGVybmF0ZV9ob3Jpem9udGFsX3NjYW5bNjRdID0geworICAgICAwLCAgMSwgIDIsICAzLCAgOCwgIDksIDE2LCAxNywKKyAgICAxMCwgMTEsICA0LCAgNSwgIDYsICA3LCAxNSwgMTQsCisgICAgMTMsIDEyLCAxOSwgMTgsIDI0LCAyNSwgMzIsIDMzLAorICAgIDI2LCAyNywgMjAsIDIxLCAyMiwgMjMsIDI4LCAyOSwKKyAgICAzMCwgMzEsIDM0LCAzNSwgNDAsIDQxLCA0OCwgNDksCisgICAgNDIsIDQzLCAzNiwgMzcsIDM4LCAzOSwgNDQsIDQ1LAorICAgIDQ2LCA0NywgNTAsIDUxLCA1NiwgNTcsIDU4LCA1OSwKKyAgICA1MiwgNTMsIDU0LCA1NSwgNjAsIDYxLCA2MiwgNjMsCit9OworCitjb25zdCB1aW50OF90IGZmX2FsdGVybmF0ZV92ZXJ0aWNhbF9zY2FuWzY0XSA9IHsKKyAgICAgMCwgIDgsIDE2LCAyNCwgIDEsICA5LCAgMiwgMTAsCisgICAgMTcsIDI1LCAzMiwgNDAsIDQ4LCA1NiwgNTcsIDQ5LAorICAgIDQxLCAzMywgMjYsIDE4LCAgMywgMTEsICA0LCAxMiwKKyAgICAxOSwgMjcsIDM0LCA0MiwgNTAsIDU4LCAzNSwgNDMsCisgICAgNTEsIDU5LCAyMCwgMjgsICA1LCAxMywgIDYsIDE0LAorICAgIDIxLCAyOSwgMzYsIDQ0LCA1MiwgNjAsIDM3LCA0NSwKKyAgICA1MywgNjEsIDIyLCAzMCwgIDcsIDE1LCAyMywgMzEsCisgICAgMzgsIDQ2LCA1NCwgNjIsIDM5LCA0NywgNTUsIDYzLAorfTsKKworc3RhdGljIHZvaWQgZGN0X3VucXVhbnRpemVfbXBlZzFfaW50cmFfYyhNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuLCBpbnQgcXNjYWxlKQoreworICAgIGludCBpLCBsZXZlbCwgbkNvZWZmczsKKyAgICBjb25zdCB1aW50MTZfdCAqcXVhbnRfbWF0cml4OworCisgICAgbkNvZWZmcz0gcy0+YmxvY2tfbGFzdF9pbmRleFtuXTsKKworICAgIGJsb2NrWzBdICo9IG4gPCA0ID8gcy0+eV9kY19zY2FsZSA6IHMtPmNfZGNfc2NhbGU7CisgICAgLyogWFhYOiBvbmx5IG1wZWcxICovCisgICAgcXVhbnRfbWF0cml4ID0gcy0+aW50cmFfbWF0cml4OworICAgIGZvcihpPTE7aTw9bkNvZWZmcztpKyspIHsKKyAgICAgICAgaW50IGo9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkW2ldOworICAgICAgICBsZXZlbCA9IGJsb2NrW2pdOworICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChpbnQpKGxldmVsICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiAzOworICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIC0gMSkgfCAxOworICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChpbnQpKGxldmVsICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiAzOworICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIC0gMSkgfCAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxvY2tbal0gPSBsZXZlbDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGN0X3VucXVhbnRpemVfbXBlZzFfaW50ZXJfYyhNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuLCBpbnQgcXNjYWxlKQoreworICAgIGludCBpLCBsZXZlbCwgbkNvZWZmczsKKyAgICBjb25zdCB1aW50MTZfdCAqcXVhbnRfbWF0cml4OworCisgICAgbkNvZWZmcz0gcy0+YmxvY2tfbGFzdF9pbmRleFtuXTsKKworICAgIHF1YW50X21hdHJpeCA9IHMtPmludGVyX21hdHJpeDsKKyAgICBmb3IoaT0wOyBpPD1uQ29lZmZzOyBpKyspIHsKKyAgICAgICAgaW50IGo9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkW2ldOworICAgICAgICBsZXZlbCA9IGJsb2NrW2pdOworICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgICAgICAgICBsZXZlbCA9ICgoKGxldmVsIDw8IDEpICsgMSkgKiBxc2NhbGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KSAocXVhbnRfbWF0cml4W2pdKSkpID4+IDQ7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxldmVsID0gKCgobGV2ZWwgPDwgMSkgKyAxKSAqIHFzY2FsZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpIChxdWFudF9tYXRyaXhbal0pKSkgPj4gNDsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAtIDEpIHwgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJsb2NrW2pdID0gbGV2ZWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjdF91bnF1YW50aXplX21wZWcyX2ludHJhX2MoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgbiwgaW50IHFzY2FsZSkKK3sKKyAgICBpbnQgaSwgbGV2ZWwsIG5Db2VmZnM7CisgICAgY29uc3QgdWludDE2X3QgKnF1YW50X21hdHJpeDsKKworICAgIGlmKHMtPmFsdGVybmF0ZV9zY2FuKSBuQ29lZmZzPSA2MzsKKyAgICBlbHNlIG5Db2VmZnM9IHMtPmJsb2NrX2xhc3RfaW5kZXhbbl07CisKKyAgICBibG9ja1swXSAqPSBuIDwgNCA/IHMtPnlfZGNfc2NhbGUgOiBzLT5jX2RjX3NjYWxlOworICAgIHF1YW50X21hdHJpeCA9IHMtPmludHJhX21hdHJpeDsKKyAgICBmb3IoaT0xO2k8PW5Db2VmZnM7aSsrKSB7CisgICAgICAgIGludCBqPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZFtpXTsKKyAgICAgICAgbGV2ZWwgPSBibG9ja1tqXTsKKyAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAoaW50KShsZXZlbCAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gMzsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAoaW50KShsZXZlbCAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJsb2NrW2pdID0gbGV2ZWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjdF91bnF1YW50aXplX21wZWcyX2ludHJhX2JpdGV4YWN0KE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IG4sIGludCBxc2NhbGUpCit7CisgICAgaW50IGksIGxldmVsLCBuQ29lZmZzOworICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXg7CisgICAgaW50IHN1bT0tMTsKKworICAgIGlmKHMtPmFsdGVybmF0ZV9zY2FuKSBuQ29lZmZzPSA2MzsKKyAgICBlbHNlIG5Db2VmZnM9IHMtPmJsb2NrX2xhc3RfaW5kZXhbbl07CisKKyAgICBibG9ja1swXSAqPSBuIDwgNCA/IHMtPnlfZGNfc2NhbGUgOiBzLT5jX2RjX3NjYWxlOworICAgIHN1bSArPSBibG9ja1swXTsKKyAgICBxdWFudF9tYXRyaXggPSBzLT5pbnRyYV9tYXRyaXg7CisgICAgZm9yKGk9MTtpPD1uQ29lZmZzO2krKykgeworICAgICAgICBpbnQgaj0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWRbaV07CisgICAgICAgIGxldmVsID0gYmxvY2tbal07CisgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkgeworICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgICAgIGxldmVsID0gKGludCkobGV2ZWwgKiBxc2NhbGUgKiBxdWFudF9tYXRyaXhbal0pID4+IDM7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxldmVsID0gKGludCkobGV2ZWwgKiBxc2NhbGUgKiBxdWFudF9tYXRyaXhbal0pID4+IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsOworICAgICAgICAgICAgc3VtKz1sZXZlbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBibG9ja1s2M11ePXN1bSYxOworfQorCitzdGF0aWMgdm9pZCBkY3RfdW5xdWFudGl6ZV9tcGVnMl9pbnRlcl9jKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IG4sIGludCBxc2NhbGUpCit7CisgICAgaW50IGksIGxldmVsLCBuQ29lZmZzOworICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXg7CisgICAgaW50IHN1bT0tMTsKKworICAgIGlmKHMtPmFsdGVybmF0ZV9zY2FuKSBuQ29lZmZzPSA2MzsKKyAgICBlbHNlIG5Db2VmZnM9IHMtPmJsb2NrX2xhc3RfaW5kZXhbbl07CisKKyAgICBxdWFudF9tYXRyaXggPSBzLT5pbnRlcl9tYXRyaXg7CisgICAgZm9yKGk9MDsgaTw9bkNvZWZmczsgaSsrKSB7CisgICAgICAgIGludCBqPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZFtpXTsKKyAgICAgICAgbGV2ZWwgPSBibG9ja1tqXTsKKyAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAoKChsZXZlbCA8PCAxKSArIDEpICogcXNjYWxlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCkgKHF1YW50X21hdHJpeFtqXSkpKSA+PiA0OworICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9ICgoKGxldmVsIDw8IDEpICsgMSkgKiBxc2NhbGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KSAocXVhbnRfbWF0cml4W2pdKSkpID4+IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsOworICAgICAgICAgICAgc3VtKz1sZXZlbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBibG9ja1s2M11ePXN1bSYxOworfQorCitzdGF0aWMgdm9pZCBkY3RfdW5xdWFudGl6ZV9oMjYzX2ludHJhX2MoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuLCBpbnQgcXNjYWxlKQoreworICAgIGludCBpLCBsZXZlbCwgcW11bCwgcWFkZDsKKyAgICBpbnQgbkNvZWZmczsKKworICAgIGF2X2Fzc2VydDIocy0+YmxvY2tfbGFzdF9pbmRleFtuXT49MCB8fCBzLT5oMjYzX2FpYyk7CisKKyAgICBxbXVsID0gcXNjYWxlIDw8IDE7CisKKyAgICBpZiAoIXMtPmgyNjNfYWljKSB7CisgICAgICAgIGJsb2NrWzBdICo9IG4gPCA0ID8gcy0+eV9kY19zY2FsZSA6IHMtPmNfZGNfc2NhbGU7CisgICAgICAgIHFhZGQgPSAocXNjYWxlIC0gMSkgfCAxOworICAgIH1lbHNleworICAgICAgICBxYWRkID0gMDsKKyAgICB9CisgICAgaWYocy0+YWNfcHJlZCkKKyAgICAgICAgbkNvZWZmcz02MzsKKyAgICBlbHNlCisgICAgICAgIG5Db2VmZnM9IHMtPmludGVyX3NjYW50YWJsZS5yYXN0ZXJfZW5kWyBzLT5ibG9ja19sYXN0X2luZGV4W25dIF07CisKKyAgICBmb3IoaT0xOyBpPD1uQ29lZmZzOyBpKyspIHsKKyAgICAgICAgbGV2ZWwgPSBibG9ja1tpXTsKKyAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbCAqIHFtdWwgLSBxYWRkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsICogcW11bCArIHFhZGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibG9ja1tpXSA9IGxldmVsOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkY3RfdW5xdWFudGl6ZV9oMjYzX2ludGVyX2MoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuLCBpbnQgcXNjYWxlKQoreworICAgIGludCBpLCBsZXZlbCwgcW11bCwgcWFkZDsKKyAgICBpbnQgbkNvZWZmczsKKworICAgIGF2X2Fzc2VydDIocy0+YmxvY2tfbGFzdF9pbmRleFtuXT49MCk7CisKKyAgICBxYWRkID0gKHFzY2FsZSAtIDEpIHwgMTsKKyAgICBxbXVsID0gcXNjYWxlIDw8IDE7CisKKyAgICBuQ29lZmZzPSBzLT5pbnRlcl9zY2FudGFibGUucmFzdGVyX2VuZFsgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSBdOworCisgICAgZm9yKGk9MDsgaTw9bkNvZWZmczsgaSsrKSB7CisgICAgICAgIGxldmVsID0gYmxvY2tbaV07CisgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkgeworICAgICAgICAgICAgICAgIGxldmVsID0gbGV2ZWwgKiBxbXVsIC0gcWFkZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbCAqIHFtdWwgKyBxYWRkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxvY2tbaV0gPSBsZXZlbDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgbXBlZ19lcl9kZWNvZGVfbWIodm9pZCAqb3BhcXVlLCBpbnQgcmVmLCBpbnQgbXZfZGlyLCBpbnQgbXZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKm12KVsyXVs0XVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl94LCBpbnQgbWJfeSwgaW50IG1iX2ludHJhLCBpbnQgbWJfc2tpcHBlZCkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9IG9wYXF1ZTsKKworICAgIHMtPm12X2RpciAgICAgPSBtdl9kaXI7CisgICAgcy0+bXZfdHlwZSAgICA9IG12X3R5cGU7CisgICAgcy0+bWJfaW50cmEgICA9IG1iX2ludHJhOworICAgIHMtPm1iX3NraXBwZWQgPSBtYl9za2lwcGVkOworICAgIHMtPm1iX3ggICAgICAgPSBtYl94OworICAgIHMtPm1iX3kgICAgICAgPSBtYl95OworICAgIG1lbWNweShzLT5tdiwgbXYsIHNpemVvZigqbXYpKTsKKworICAgIGZmX2luaXRfYmxvY2tfaW5kZXgocyk7CisgICAgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KHMpOworCisgICAgcy0+YmRzcC5jbGVhcl9ibG9ja3Mocy0+YmxvY2tbMF0pOworCisgICAgcy0+ZGVzdFswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhWzBdICsgKHMtPm1iX3kgKiAgMTYgICAgICAgICAgICAgICAgICAgICAgICogcy0+bGluZXNpemUpICAgKyBzLT5tYl94ICogIDE2OworICAgIHMtPmRlc3RbMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVsxXSArIChzLT5tYl95ICogKDE2ID4+IHMtPmNocm9tYV95X3NoaWZ0KSAqIHMtPnV2bGluZXNpemUpICsgcy0+bWJfeCAqICgxNiA+PiBzLT5jaHJvbWFfeF9zaGlmdCk7CisgICAgcy0+ZGVzdFsyXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhWzJdICsgKHMtPm1iX3kgKiAoMTYgPj4gcy0+Y2hyb21hX3lfc2hpZnQpICogcy0+dXZsaW5lc2l6ZSkgKyBzLT5tYl94ICogKDE2ID4+IHMtPmNocm9tYV94X3NoaWZ0KTsKKworICAgIGlmIChyZWYpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiSW50ZXJsYWNlZCBlcnJvciBjb25jZWFsbWVudCBpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWRcbiIpOworICAgIGZmX21wdl9kZWNvZGVfbWIocywgcy0+YmxvY2spOworfQorCitzdGF0aWMgdm9pZCBncmF5MTYodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBsaW5lc2l6ZSwgaW50IGgpCit7CisgICAgd2hpbGUoaC0tKQorICAgICAgICBtZW1zZXQoZHN0ICsgaCpsaW5lc2l6ZSwgMTI4LCAxNik7Cit9CisKK3N0YXRpYyB2b2lkIGdyYXk4KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgbGluZXNpemUsIGludCBoKQoreworICAgIHdoaWxlKGgtLSkKKyAgICAgICAgbWVtc2V0KGRzdCArIGgqbGluZXNpemUsIDEyOCwgOCk7Cit9CisKKy8qIGluaXQgY29tbW9uIGRjdCBmb3IgYm90aCBlbmNvZGVyIGFuZCBkZWNvZGVyICovCitzdGF0aWMgYXZfY29sZCBpbnQgZGN0X2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgZmZfYmxvY2tkc3BfaW5pdCgmcy0+YmRzcCwgcy0+YXZjdHgpOworICAgIGZmX2gyNjRjaHJvbWFfaW5pdCgmcy0+aDI2NGNocm9tYSwgOCk7IC8vZm9yIGxvd3JlcworICAgIGZmX2hwZWxkc3BfaW5pdCgmcy0+aGRzcCwgcy0+YXZjdHgtPmZsYWdzKTsKKyAgICBmZl9tZV9jbXBfaW5pdCgmcy0+bWVjYywgcy0+YXZjdHgpOworICAgIGZmX21wZWd2aWRlb2RzcF9pbml0KCZzLT5tZHNwKTsKKyAgICBmZl92aWRlb2RzcF9pbml0KCZzLT52ZHNwLCBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSk7CisKKyAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfTk9NQykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgICAgICBzLT5oZHNwLmF2Z19waXhlbHNfdGFiWzBdW2ldID0gZ3JheTE2OworICAgICAgICAgICAgcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYlswXVtpXSA9IGdyYXkxNjsKKyAgICAgICAgICAgIHMtPmhkc3AucHV0X25vX3JuZF9waXhlbHNfdGFiWzBdW2ldID0gZ3JheTE2OworCisgICAgICAgICAgICBzLT5oZHNwLmF2Z19waXhlbHNfdGFiWzFdW2ldID0gZ3JheTg7CisgICAgICAgICAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiWzFdW2ldID0gZ3JheTg7CisgICAgICAgICAgICBzLT5oZHNwLnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVtpXSA9IGdyYXk4OworICAgICAgICB9CisgICAgfQorCisgICAgcy0+ZGN0X3VucXVhbnRpemVfaDI2M19pbnRyYSA9IGRjdF91bnF1YW50aXplX2gyNjNfaW50cmFfYzsKKyAgICBzLT5kY3RfdW5xdWFudGl6ZV9oMjYzX2ludGVyID0gZGN0X3VucXVhbnRpemVfaDI2M19pbnRlcl9jOworICAgIHMtPmRjdF91bnF1YW50aXplX21wZWcxX2ludHJhID0gZGN0X3VucXVhbnRpemVfbXBlZzFfaW50cmFfYzsKKyAgICBzLT5kY3RfdW5xdWFudGl6ZV9tcGVnMV9pbnRlciA9IGRjdF91bnF1YW50aXplX21wZWcxX2ludGVyX2M7CisgICAgcy0+ZGN0X3VucXVhbnRpemVfbXBlZzJfaW50cmEgPSBkY3RfdW5xdWFudGl6ZV9tcGVnMl9pbnRyYV9jOworICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpCisgICAgICAgIHMtPmRjdF91bnF1YW50aXplX21wZWcyX2ludHJhID0gZGN0X3VucXVhbnRpemVfbXBlZzJfaW50cmFfYml0ZXhhY3Q7CisgICAgcy0+ZGN0X3VucXVhbnRpemVfbXBlZzJfaW50ZXIgPSBkY3RfdW5xdWFudGl6ZV9tcGVnMl9pbnRlcl9jOworCisgICAgaWYgKEhBVkVfSU5UUklOU0lDU19ORU9OKQorICAgICAgICBmZl9tcHZfY29tbW9uX2luaXRfbmVvbihzKTsKKworICAgIGlmIChBUkNIX0FMUEhBKQorICAgICAgICBmZl9tcHZfY29tbW9uX2luaXRfYXhwKHMpOworICAgIGlmIChBUkNIX0FSTSkKKyAgICAgICAgZmZfbXB2X2NvbW1vbl9pbml0X2FybShzKTsKKyAgICBpZiAoQVJDSF9QUEMpCisgICAgICAgIGZmX21wdl9jb21tb25faW5pdF9wcGMocyk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9tcHZfY29tbW9uX2luaXRfeDg2KHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9tcHZfaWRjdF9pbml0KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGZmX2lkY3Rkc3BfaW5pdCgmcy0+aWRzcCwgcy0+YXZjdHgpOworCisgICAgLyogbG9hZCAmIHBlcm11dGF0ZSBzY2FudGFibGVzCisgICAgICogbm90ZTogb25seSB3bXYgdXNlcyBkaWZmZXJlbnQgb25lcworICAgICAqLworICAgIGlmIChzLT5hbHRlcm5hdGVfc2NhbikgeworICAgICAgICBmZl9pbml0X3NjYW50YWJsZShzLT5pZHNwLmlkY3RfcGVybXV0YXRpb24sICZzLT5pbnRlcl9zY2FudGFibGUsIGZmX2FsdGVybmF0ZV92ZXJ0aWNhbF9zY2FuKTsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50cmFfc2NhbnRhYmxlLCBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50ZXJfc2NhbnRhYmxlLCBmZl96aWd6YWdfZGlyZWN0KTsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50cmFfc2NhbnRhYmxlLCBmZl96aWd6YWdfZGlyZWN0KTsKKyAgICB9CisgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50cmFfaF9zY2FudGFibGUsIGZmX2FsdGVybmF0ZV9ob3Jpem9udGFsX3NjYW4pOworICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX3Zfc2NhbnRhYmxlLCBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbik7Cit9CisKK3N0YXRpYyBpbnQgZnJhbWVfc2l6ZV9hbGxvYyhNcGVnRW5jQ29udGV4dCAqcywgaW50IGxpbmVzaXplKQoreworICAgIGludCBhbGxvY19zaXplID0gRkZBTElHTihGRkFCUyhsaW5lc2l6ZSkgKyA2NCwgMzIpOworCisgICAgaWYgKHMtPmF2Y3R4LT5od2FjY2VsIHx8IHMtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGxpbmVzaXplIDwgMjQpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbWFnZSB0b28gc21hbGwsIHRlbXBvcmFyeSBidWZmZXJzIGNhbm5vdCBmdW5jdGlvblxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvLyBlZGdlIGVtdSBuZWVkcyBibG9ja3NpemUgKyBmaWx0ZXIgbGVuZ3RoIC0gMQorICAgIC8vICg9IDE3eDE3IGZvciAgaGFsZnBlbCAvIDIxeDIxIGZvciAgaDI2NCkKKyAgICAvLyBWQzEgY29tcHV0ZXMgbHVtYSBhbmQgY2hyb21hIHNpbXVsdGFuZW91c2x5IGFuZCBuZWVkcyAxOVgxOSArIDl4OQorICAgIC8vIGF0IHV2bGluZXNpemUuIEl0IHN1cHBvcnRzIG9ubHkgWVVWNDIwIHNvIDI0eDI0IGlzIGVub3VnaAorICAgIC8vIGxpbmVzaXplICogaW50ZXJsYWNlZCAqIE1Cc2l6ZQorICAgIC8vIHdlIGFsc28gdXNlIHRoaXMgYnVmZmVyIGZvciBlbmNvZGluZyBpbiBlbmNvZGVfbWJfaW50ZXJuYWwoKSBuZWVkaWcgYW4gYWRkaXRpb25hbCAzMiBsaW5lcworICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5lZGdlX2VtdV9idWZmZXIsIGFsbG9jX3NpemUsIDQgKiA2OCwKKyAgICAgICAgICAgICAgICAgICAgICBmYWlsKTsKKworICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5tZS5zY3JhdGNocGFkLCBhbGxvY19zaXplLCA0ICogMTYgKiAyLAorICAgICAgICAgICAgICAgICAgICAgIGZhaWwpCisgICAgcy0+bWUudGVtcCAgICAgICAgID0gcy0+bWUuc2NyYXRjaHBhZDsKKyAgICBzLT5yZF9zY3JhdGNocGFkICAgPSBzLT5tZS5zY3JhdGNocGFkOworICAgIHMtPmJfc2NyYXRjaHBhZCAgICA9IHMtPm1lLnNjcmF0Y2hwYWQ7CisgICAgcy0+b2JtY19zY3JhdGNocGFkID0gcy0+bWUuc2NyYXRjaHBhZCArIDE2OworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGF2X2ZyZWVwKCZzLT5lZGdlX2VtdV9idWZmZXIpOworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSBmcmFtZSBidWZmZXIKKyAqLworc3RhdGljIGludCBhbGxvY19mcmFtZV9idWZmZXIoTXBlZ0VuY0NvbnRleHQgKnMsIFBpY3R1cmUgKnBpYykKK3sKKyAgICBpbnQgZWRnZXNfbmVlZGVkID0gYXZfY29kZWNfaXNfZW5jb2RlcihzLT5hdmN0eC0+Y29kZWMpOworICAgIGludCByLCByZXQ7CisKKyAgICBwaWMtPnRmLmYgPSBwaWMtPmY7CisgICAgaWYgKHMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1dNVjNJTUFHRSAmJgorICAgICAgICBzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WQzFJTUFHRSAgJiYKKyAgICAgICAgcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVNTMikgeworICAgICAgICBpZiAoZWRnZXNfbmVlZGVkKSB7CisgICAgICAgICAgICBwaWMtPmYtPndpZHRoICA9IHMtPmF2Y3R4LT53aWR0aCAgKyAyICogRURHRV9XSURUSDsKKyAgICAgICAgICAgIHBpYy0+Zi0+aGVpZ2h0ID0gcy0+YXZjdHgtPmhlaWdodCArIDIgKiBFREdFX1dJRFRIOworICAgICAgICB9CisKKyAgICAgICAgciA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKHMtPmF2Y3R4LCAmcGljLT50ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+cmVmZXJlbmNlID8gQVZfR0VUX0JVRkZFUl9GTEFHX1JFRiA6IDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHBpYy0+Zi0+d2lkdGggID0gcy0+YXZjdHgtPndpZHRoOworICAgICAgICBwaWMtPmYtPmhlaWdodCA9IHMtPmF2Y3R4LT5oZWlnaHQ7CisgICAgICAgIHBpYy0+Zi0+Zm9ybWF0ID0gcy0+YXZjdHgtPnBpeF9mbXQ7CisgICAgICAgIHIgPSBhdmNvZGVjX2RlZmF1bHRfZ2V0X2J1ZmZlcjIocy0+YXZjdHgsIHBpYy0+ZiwgMCk7CisgICAgfQorCisgICAgaWYgKHIgPCAwIHx8ICFwaWMtPmYtPmJ1ZlswXSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImdldF9idWZmZXIoKSBmYWlsZWQgKCVkICVwKVxuIiwKKyAgICAgICAgICAgICAgIHIsIHBpYy0+Zi0+ZGF0YVswXSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoZWRnZXNfbmVlZGVkKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBwaWMtPmYtPmRhdGFbaV07IGkrKykgeworICAgICAgICAgICAgaW50IG9mZnNldCA9IChFREdFX1dJRFRIID4+IChpID8gcy0+Y2hyb21hX3lfc2hpZnQgOiAwKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+Zi0+bGluZXNpemVbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgIChFREdFX1dJRFRIID4+IChpID8gcy0+Y2hyb21hX3hfc2hpZnQgOiAwKSk7CisgICAgICAgICAgICBwaWMtPmYtPmRhdGFbaV0gKz0gb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIHBpYy0+Zi0+d2lkdGggID0gcy0+YXZjdHgtPndpZHRoOworICAgICAgICBwaWMtPmYtPmhlaWdodCA9IHMtPmF2Y3R4LT5oZWlnaHQ7CisgICAgfQorCisgICAgaWYgKHMtPmF2Y3R4LT5od2FjY2VsKSB7CisgICAgICAgIGFzc2VydCghcGljLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZSk7CisgICAgICAgIGlmIChzLT5hdmN0eC0+aHdhY2NlbC0+ZnJhbWVfcHJpdl9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgIHBpYy0+aHdhY2NlbF9wcml2X2J1ZiA9IGF2X2J1ZmZlcl9hbGxvY3oocy0+YXZjdHgtPmh3YWNjZWwtPmZyYW1lX3ByaXZfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmICghcGljLT5od2FjY2VsX3ByaXZfYnVmKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJhbGxvY19mcmFtZV9idWZmZXIoKSBmYWlsZWQgKGh3YWNjZWwgcHJpdmF0ZSBkYXRhIGFsbG9jYXRpb24pXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwaWMtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlID0gcGljLT5od2FjY2VsX3ByaXZfYnVmLT5kYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPmxpbmVzaXplICYmIChzLT5saW5lc2l6ZSAgICE9IHBpYy0+Zi0+bGluZXNpemVbMF0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnV2bGluZXNpemUgIT0gcGljLT5mLT5saW5lc2l6ZVsxXSkpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiZ2V0X2J1ZmZlcigpIGZhaWxlZCAoc3RyaWRlIGNoYW5nZWQpXG4iKTsKKyAgICAgICAgZmZfbXBlZ191bnJlZl9waWN0dXJlKHMsIHBpYyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocGljLT5mLT5saW5lc2l6ZVsxXSAhPSBwaWMtPmYtPmxpbmVzaXplWzJdKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImdldF9idWZmZXIoKSBmYWlsZWQgKHV2IHN0cmlkZSBtaXNtYXRjaClcbiIpOworICAgICAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgcGljKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghcy0+ZWRnZV9lbXVfYnVmZmVyICYmCisgICAgICAgIChyZXQgPSBmcmFtZV9zaXplX2FsbG9jKHMsIHBpYy0+Zi0+bGluZXNpemVbMF0pKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiZ2V0X2J1ZmZlcigpIGZhaWxlZCB0byBhbGxvY2F0ZSBjb250ZXh0IHNjcmF0Y2ggYnVmZmVycy5cbiIpOworICAgICAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgcGljKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl9mcmVlX3BpY3R1cmVfdGFibGVzKFBpY3R1cmUgKnBpYykKK3sKKyAgICBpbnQgaTsKKworICAgIHBpYy0+YWxsb2NfbWJfd2lkdGggID0KKyAgICBwaWMtPmFsbG9jX21iX2hlaWdodCA9IDA7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJnBpYy0+bWJfdmFyX2J1Zik7CisgICAgYXZfYnVmZmVyX3VucmVmKCZwaWMtPm1jX21iX3Zhcl9idWYpOworICAgIGF2X2J1ZmZlcl91bnJlZigmcGljLT5tYl9tZWFuX2J1Zik7CisgICAgYXZfYnVmZmVyX3VucmVmKCZwaWMtPm1ic2tpcF90YWJsZV9idWYpOworICAgIGF2X2J1ZmZlcl91bnJlZigmcGljLT5xc2NhbGVfdGFibGVfYnVmKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJnBpYy0+bWJfdHlwZV9idWYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnBpYy0+bW90aW9uX3ZhbF9idWZbaV0pOworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnBpYy0+cmVmX2luZGV4X2J1ZltpXSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGFsbG9jX3BpY3R1cmVfdGFibGVzKE1wZWdFbmNDb250ZXh0ICpzLCBQaWN0dXJlICpwaWMpCit7CisgICAgY29uc3QgaW50IGJpZ19tYl9udW0gICAgPSBzLT5tYl9zdHJpZGUgKiAocy0+bWJfaGVpZ2h0ICsgMSkgKyAxOworICAgIGNvbnN0IGludCBtYl9hcnJheV9zaXplID0gcy0+bWJfc3RyaWRlICogcy0+bWJfaGVpZ2h0OworICAgIGNvbnN0IGludCBiOF9hcnJheV9zaXplID0gcy0+Yjhfc3RyaWRlICogcy0+bWJfaGVpZ2h0ICogMjsKKyAgICBpbnQgaTsKKworCisgICAgcGljLT5tYnNraXBfdGFibGVfYnVmID0gYXZfYnVmZmVyX2FsbG9jeihtYl9hcnJheV9zaXplICsgMik7CisgICAgcGljLT5xc2NhbGVfdGFibGVfYnVmID0gYXZfYnVmZmVyX2FsbG9jeihiaWdfbWJfbnVtICsgcy0+bWJfc3RyaWRlKTsKKyAgICBwaWMtPm1iX3R5cGVfYnVmICAgICAgPSBhdl9idWZmZXJfYWxsb2N6KChiaWdfbWJfbnVtICsgcy0+bWJfc3RyaWRlKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpKTsKKyAgICBpZiAoIXBpYy0+bWJza2lwX3RhYmxlX2J1ZiB8fCAhcGljLT5xc2NhbGVfdGFibGVfYnVmIHx8ICFwaWMtPm1iX3R5cGVfYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKHMtPmVuY29kaW5nKSB7CisgICAgICAgIHBpYy0+bWJfdmFyX2J1ZiAgICA9IGF2X2J1ZmZlcl9hbGxvY3oobWJfYXJyYXlfc2l6ZSAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIHBpYy0+bWNfbWJfdmFyX2J1ZiA9IGF2X2J1ZmZlcl9hbGxvY3oobWJfYXJyYXlfc2l6ZSAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIHBpYy0+bWJfbWVhbl9idWYgICA9IGF2X2J1ZmZlcl9hbGxvY3oobWJfYXJyYXlfc2l6ZSk7CisgICAgICAgIGlmICghcGljLT5tYl92YXJfYnVmIHx8ICFwaWMtPm1jX21iX3Zhcl9idWYgfHwgIXBpYy0+bWJfbWVhbl9idWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmIChzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzIHx8IHMtPmVuY29kaW5nIHx8IHMtPmF2Y3R4LT5kZWJ1Z19tdiB8fAorICAgICAgICAocy0+YXZjdHgtPmZsYWdzMiAmIENPREVDX0ZMQUcyX0VYUE9SVF9NVlMpKSB7CisgICAgICAgIGludCBtdl9zaXplICAgICAgICA9IDIgKiAoYjhfYXJyYXlfc2l6ZSArIDQpICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpbnQgcmVmX2luZGV4X3NpemUgPSA0ICogbWJfYXJyYXlfc2l6ZTsKKworICAgICAgICBmb3IgKGkgPSAwOyBtdl9zaXplICYmIGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIHBpYy0+bW90aW9uX3ZhbF9idWZbaV0gPSBhdl9idWZmZXJfYWxsb2N6KG12X3NpemUpOworICAgICAgICAgICAgcGljLT5yZWZfaW5kZXhfYnVmW2ldICA9IGF2X2J1ZmZlcl9hbGxvY3oocmVmX2luZGV4X3NpemUpOworICAgICAgICAgICAgaWYgKCFwaWMtPm1vdGlvbl92YWxfYnVmW2ldIHx8ICFwaWMtPnJlZl9pbmRleF9idWZbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBpYy0+YWxsb2NfbWJfd2lkdGggID0gcy0+bWJfd2lkdGg7CisgICAgcGljLT5hbGxvY19tYl9oZWlnaHQgPSBzLT5tYl9oZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWtlX3RhYmxlc193cml0YWJsZShQaWN0dXJlICpwaWMpCit7CisgICAgaW50IHJldCwgaTsKKyNkZWZpbmUgTUFLRV9XUklUQUJMRSh0YWJsZSkgXAorZG8ge1wKKyAgICBpZiAocGljLT50YWJsZSAmJlwKKyAgICAgICAocmV0ID0gYXZfYnVmZmVyX21ha2Vfd3JpdGFibGUoJnBpYy0+dGFibGUpKSA8IDApXAorICAgIHJldHVybiByZXQ7XAorfSB3aGlsZSAoMCkKKworICAgIE1BS0VfV1JJVEFCTEUobWJfdmFyX2J1Zik7CisgICAgTUFLRV9XUklUQUJMRShtY19tYl92YXJfYnVmKTsKKyAgICBNQUtFX1dSSVRBQkxFKG1iX21lYW5fYnVmKTsKKyAgICBNQUtFX1dSSVRBQkxFKG1ic2tpcF90YWJsZV9idWYpOworICAgIE1BS0VfV1JJVEFCTEUocXNjYWxlX3RhYmxlX2J1Zik7CisgICAgTUFLRV9XUklUQUJMRShtYl90eXBlX2J1Zik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIE1BS0VfV1JJVEFCTEUobW90aW9uX3ZhbF9idWZbaV0pOworICAgICAgICBNQUtFX1dSSVRBQkxFKHJlZl9pbmRleF9idWZbaV0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEFsbG9jYXRlIGEgUGljdHVyZS4KKyAqIFRoZSBwaXhlbHMgYXJlIGFsbG9jYXRlZC9zZXQgYnkgY2FsbGluZyBnZXRfYnVmZmVyKCkgaWYgc2hhcmVkID0gMAorICovCitpbnQgZmZfYWxsb2NfcGljdHVyZShNcGVnRW5jQ29udGV4dCAqcywgUGljdHVyZSAqcGljLCBpbnQgc2hhcmVkKQoreworICAgIGludCBpLCByZXQ7CisKKyAgICBpZiAocGljLT5xc2NhbGVfdGFibGVfYnVmKQorICAgICAgICBpZiAoICAgcGljLT5hbGxvY19tYl93aWR0aCAgIT0gcy0+bWJfd2lkdGgKKyAgICAgICAgICAgIHx8IHBpYy0+YWxsb2NfbWJfaGVpZ2h0ICE9IHMtPm1iX2hlaWdodCkKKyAgICAgICAgICAgIGZmX2ZyZWVfcGljdHVyZV90YWJsZXMocGljKTsKKworICAgIGlmIChzaGFyZWQpIHsKKyAgICAgICAgYXZfYXNzZXJ0MChwaWMtPmYtPmRhdGFbMF0pOworICAgICAgICBwaWMtPnNoYXJlZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfYXNzZXJ0MCghcGljLT5mLT5idWZbMF0pOworCisgICAgICAgIGlmIChhbGxvY19mcmFtZV9idWZmZXIocywgcGljKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgcy0+bGluZXNpemUgICA9IHBpYy0+Zi0+bGluZXNpemVbMF07CisgICAgICAgIHMtPnV2bGluZXNpemUgPSBwaWMtPmYtPmxpbmVzaXplWzFdOworICAgIH0KKworICAgIGlmICghcGljLT5xc2NhbGVfdGFibGVfYnVmKQorICAgICAgICByZXQgPSBhbGxvY19waWN0dXJlX3RhYmxlcyhzLCBwaWMpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gbWFrZV90YWJsZXNfd3JpdGFibGUocGljKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKHMtPmVuY29kaW5nKSB7CisgICAgICAgIHBpYy0+bWJfdmFyICAgID0gKHVpbnQxNl90KilwaWMtPm1iX3Zhcl9idWYtPmRhdGE7CisgICAgICAgIHBpYy0+bWNfbWJfdmFyID0gKHVpbnQxNl90KilwaWMtPm1jX21iX3Zhcl9idWYtPmRhdGE7CisgICAgICAgIHBpYy0+bWJfbWVhbiAgID0gcGljLT5tYl9tZWFuX2J1Zi0+ZGF0YTsKKyAgICB9CisKKyAgICBwaWMtPm1ic2tpcF90YWJsZSA9IHBpYy0+bWJza2lwX3RhYmxlX2J1Zi0+ZGF0YTsKKyAgICBwaWMtPnFzY2FsZV90YWJsZSA9IHBpYy0+cXNjYWxlX3RhYmxlX2J1Zi0+ZGF0YSArIDIgKiBzLT5tYl9zdHJpZGUgKyAxOworICAgIHBpYy0+bWJfdHlwZSAgICAgID0gKHVpbnQzMl90KilwaWMtPm1iX3R5cGVfYnVmLT5kYXRhICsgMiAqIHMtPm1iX3N0cmlkZSArIDE7CisKKyAgICBpZiAocGljLT5tb3Rpb25fdmFsX2J1ZlswXSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBwaWMtPm1vdGlvbl92YWxbaV0gPSAoaW50MTZfdCAoKilbMl0pcGljLT5tb3Rpb25fdmFsX2J1ZltpXS0+ZGF0YSArIDQ7CisgICAgICAgICAgICBwaWMtPnJlZl9pbmRleFtpXSAgPSBwaWMtPnJlZl9pbmRleF9idWZbaV0tPmRhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIGEgcGljdHVyZS5cbiIpOworICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLCBwaWMpOworICAgIGZmX2ZyZWVfcGljdHVyZV90YWJsZXMocGljKTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCisvKioKKyAqIERlYWxsb2NhdGUgYSBwaWN0dXJlLgorICovCit2b2lkIGZmX21wZWdfdW5yZWZfcGljdHVyZShNcGVnRW5jQ29udGV4dCAqcywgUGljdHVyZSAqcGljKQoreworICAgIGludCBvZmYgPSBvZmZzZXRvZihQaWN0dXJlLCBtYl9tZWFuKSArIHNpemVvZihwaWMtPm1iX21lYW4pOworCisgICAgcGljLT50Zi5mID0gcGljLT5mOworICAgIC8qIFdNIEltYWdlIC8gU2NyZWVuIGNvZGVjcyBhbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXJzIHdpdGggZGlmZmVyZW50CisgICAgICogZGltZW5zaW9ucyAvIGNvbG9yc3BhY2VzOyBpZ25vcmUgdXNlci1kZWZpbmVkIGNhbGxiYWNrcyBmb3IgdGhlc2UuICovCisgICAgaWYgKHMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1dNVjNJTUFHRSAmJgorICAgICAgICBzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WQzFJTUFHRSAgJiYKKyAgICAgICAgcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVNTMikKKyAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKHMtPmF2Y3R4LCAmcGljLT50Zik7CisgICAgZWxzZSBpZiAocGljLT5mKQorICAgICAgICBhdl9mcmFtZV91bnJlZihwaWMtPmYpOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZwaWMtPmh3YWNjZWxfcHJpdl9idWYpOworCisgICAgaWYgKHBpYy0+bmVlZHNfcmVhbGxvYykKKyAgICAgICAgZmZfZnJlZV9waWN0dXJlX3RhYmxlcyhwaWMpOworCisgICAgbWVtc2V0KCh1aW50OF90KilwaWMgKyBvZmYsIDAsIHNpemVvZigqcGljKSAtIG9mZik7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3BpY3R1cmVfdGFibGVzKFBpY3R1cmUgKmRzdCwgUGljdHVyZSAqc3JjKQoreworICAgICBpbnQgaTsKKworI2RlZmluZSBVUERBVEVfVEFCTEUodGFibGUpXAorZG8ge1wKKyAgICBpZiAoc3JjLT50YWJsZSAmJlwKKyAgICAgICAgKCFkc3QtPnRhYmxlIHx8IGRzdC0+dGFibGUtPmJ1ZmZlciAhPSBzcmMtPnRhYmxlLT5idWZmZXIpKSB7XAorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmRzdC0+dGFibGUpO1wKKyAgICAgICAgZHN0LT50YWJsZSA9IGF2X2J1ZmZlcl9yZWYoc3JjLT50YWJsZSk7XAorICAgICAgICBpZiAoIWRzdC0+dGFibGUpIHtcCisgICAgICAgICAgICBmZl9mcmVlX3BpY3R1cmVfdGFibGVzKGRzdCk7XAorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTtcCisgICAgICAgIH1cCisgICAgfVwKK30gd2hpbGUgKDApCisKKyAgICBVUERBVEVfVEFCTEUobWJfdmFyX2J1Zik7CisgICAgVVBEQVRFX1RBQkxFKG1jX21iX3Zhcl9idWYpOworICAgIFVQREFURV9UQUJMRShtYl9tZWFuX2J1Zik7CisgICAgVVBEQVRFX1RBQkxFKG1ic2tpcF90YWJsZV9idWYpOworICAgIFVQREFURV9UQUJMRShxc2NhbGVfdGFibGVfYnVmKTsKKyAgICBVUERBVEVfVEFCTEUobWJfdHlwZV9idWYpOworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgVVBEQVRFX1RBQkxFKG1vdGlvbl92YWxfYnVmW2ldKTsKKyAgICAgICAgVVBEQVRFX1RBQkxFKHJlZl9pbmRleF9idWZbaV0pOworICAgIH0KKworICAgIGRzdC0+bWJfdmFyICAgICAgICA9IHNyYy0+bWJfdmFyOworICAgIGRzdC0+bWNfbWJfdmFyICAgICA9IHNyYy0+bWNfbWJfdmFyOworICAgIGRzdC0+bWJfbWVhbiAgICAgICA9IHNyYy0+bWJfbWVhbjsKKyAgICBkc3QtPm1ic2tpcF90YWJsZSAgPSBzcmMtPm1ic2tpcF90YWJsZTsKKyAgICBkc3QtPnFzY2FsZV90YWJsZSAgPSBzcmMtPnFzY2FsZV90YWJsZTsKKyAgICBkc3QtPm1iX3R5cGUgICAgICAgPSBzcmMtPm1iX3R5cGU7CisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBkc3QtPm1vdGlvbl92YWxbaV0gPSBzcmMtPm1vdGlvbl92YWxbaV07CisgICAgICAgIGRzdC0+cmVmX2luZGV4W2ldICA9IHNyYy0+cmVmX2luZGV4W2ldOworICAgIH0KKworICAgIGRzdC0+YWxsb2NfbWJfd2lkdGggID0gc3JjLT5hbGxvY19tYl93aWR0aDsKKyAgICBkc3QtPmFsbG9jX21iX2hlaWdodCA9IHNyYy0+YWxsb2NfbWJfaGVpZ2h0OworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9tcGVnX3JlZl9waWN0dXJlKE1wZWdFbmNDb250ZXh0ICpzLCBQaWN0dXJlICpkc3QsIFBpY3R1cmUgKnNyYykKK3sKKyAgICBpbnQgcmV0OworCisgICAgYXZfYXNzZXJ0MCghZHN0LT5mLT5idWZbMF0pOworICAgIGF2X2Fzc2VydDAoc3JjLT5mLT5idWZbMF0pOworCisgICAgc3JjLT50Zi5mID0gc3JjLT5mOworICAgIGRzdC0+dGYuZiA9IGRzdC0+ZjsKKyAgICByZXQgPSBmZl90aHJlYWRfcmVmX2ZyYW1lKCZkc3QtPnRmLCAmc3JjLT50Zik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldCA9IHVwZGF0ZV9waWN0dXJlX3RhYmxlcyhkc3QsIHNyYyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChzcmMtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlKSB7CisgICAgICAgIGRzdC0+aHdhY2NlbF9wcml2X2J1ZiA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5od2FjY2VsX3ByaXZfYnVmKTsKKyAgICAgICAgaWYgKCFkc3QtPmh3YWNjZWxfcHJpdl9idWYpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGRzdC0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGUgPSBkc3QtPmh3YWNjZWxfcHJpdl9idWYtPmRhdGE7CisgICAgfQorCisgICAgZHN0LT5maWVsZF9waWN0dXJlICAgICAgICAgICA9IHNyYy0+ZmllbGRfcGljdHVyZTsKKyAgICBkc3QtPm1iX3Zhcl9zdW0gICAgICAgICAgICAgID0gc3JjLT5tYl92YXJfc3VtOworICAgIGRzdC0+bWNfbWJfdmFyX3N1bSAgICAgICAgICAgPSBzcmMtPm1jX21iX3Zhcl9zdW07CisgICAgZHN0LT5iX2ZyYW1lX3Njb3JlICAgICAgICAgICA9IHNyYy0+Yl9mcmFtZV9zY29yZTsKKyAgICBkc3QtPm5lZWRzX3JlYWxsb2MgICAgICAgICAgID0gc3JjLT5uZWVkc19yZWFsbG9jOworICAgIGRzdC0+cmVmZXJlbmNlICAgICAgICAgICAgICAgPSBzcmMtPnJlZmVyZW5jZTsKKyAgICBkc3QtPnNoYXJlZCAgICAgICAgICAgICAgICAgID0gc3JjLT5zaGFyZWQ7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgZmZfbXBlZ191bnJlZl9waWN0dXJlKHMsIGRzdCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZXhjaGFuZ2VfdXYoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50MTZfdCAoKnRtcClbNjRdOworCisgICAgdG1wICAgICAgICAgICA9IHMtPnBibG9ja3NbNF07CisgICAgcy0+cGJsb2Nrc1s0XSA9IHMtPnBibG9ja3NbNV07CisgICAgcy0+cGJsb2Nrc1s1XSA9IHRtcDsKK30KKworc3RhdGljIGludCBpbml0X2R1cGxpY2F0ZV9jb250ZXh0KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludCB5X3NpemUgPSBzLT5iOF9zdHJpZGUgKiAoMiAqIHMtPm1iX2hlaWdodCArIDEpOworICAgIGludCBjX3NpemUgPSBzLT5tYl9zdHJpZGUgKiAocy0+bWJfaGVpZ2h0ICsgMSk7CisgICAgaW50IHljX3NpemUgPSB5X3NpemUgKyAyICogY19zaXplOworICAgIGludCBpOworCisgICAgaWYgKHMtPm1iX2hlaWdodCAmIDEpCisgICAgICAgIHljX3NpemUgKz0gMipzLT5iOF9zdHJpZGUgKyAyKnMtPm1iX3N0cmlkZTsKKworICAgIHMtPmVkZ2VfZW11X2J1ZmZlciA9CisgICAgcy0+bWUuc2NyYXRjaHBhZCAgID0KKyAgICBzLT5tZS50ZW1wICAgICAgICAgPQorICAgIHMtPnJkX3NjcmF0Y2hwYWQgICA9CisgICAgcy0+Yl9zY3JhdGNocGFkICAgID0KKyAgICBzLT5vYm1jX3NjcmF0Y2hwYWQgPSBOVUxMOworCisgICAgaWYgKHMtPmVuY29kaW5nKSB7CisgICAgICAgIEZGX0FMTE9DWl9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5tZS5tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1FX01BUF9TSVpFICogc2l6ZW9mKHVpbnQzMl90KSwgZmFpbCkKKyAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8ocy0+YXZjdHgsIHMtPm1lLnNjb3JlX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTUVfTUFQX1NJWkUgKiBzaXplb2YodWludDMyX3QpLCBmYWlsKQorICAgICAgICBpZiAocy0+YXZjdHgtPm5vaXNlX3JlZHVjdGlvbikgeworICAgICAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8ocy0+YXZjdHgsIHMtPmRjdF9lcnJvcl9zdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogNjQgKiBzaXplb2YoaW50KSwgZmFpbCkKKyAgICAgICAgfQorICAgIH0KKyAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+YmxvY2tzLCA2NCAqIDEyICogMiAqIHNpemVvZihpbnQxNl90KSwgZmFpbCkKKyAgICBzLT5ibG9jayA9IHMtPmJsb2Nrc1swXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisgICAgICAgIHMtPnBibG9ja3NbaV0gPSAmcy0+YmxvY2tbaV07CisgICAgfQorICAgIGlmIChzLT5hdmN0eC0+Y29kZWNfdGFnID09IEFWX1JMMzIoIlZDUjIiKSkKKyAgICAgICAgZXhjaGFuZ2VfdXYocyk7CisKKyAgICBpZiAocy0+b3V0X2Zvcm1hdCA9PSBGTVRfSDI2MykgeworICAgICAgICAvKiBhYyB2YWx1ZXMgKi8KKyAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8ocy0+YXZjdHgsIHMtPmFjX3ZhbF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB5Y19zaXplICogc2l6ZW9mKGludDE2X3QpICogMTYsIGZhaWwpOworICAgICAgICBzLT5hY192YWxbMF0gPSBzLT5hY192YWxfYmFzZSArIHMtPmI4X3N0cmlkZSArIDE7CisgICAgICAgIHMtPmFjX3ZhbFsxXSA9IHMtPmFjX3ZhbF9iYXNlICsgeV9zaXplICsgcy0+bWJfc3RyaWRlICsgMTsKKyAgICAgICAgcy0+YWNfdmFsWzJdID0gcy0+YWNfdmFsWzFdICsgY19zaXplOworICAgIH0KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICByZXR1cm4gLTE7IC8vIGZyZWUoKSB0aHJvdWdoIGZmX21wdl9jb21tb25fZW5kKCkKK30KKworc3RhdGljIHZvaWQgZnJlZV9kdXBsaWNhdGVfY29udGV4dChNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybjsKKworICAgIGF2X2ZyZWVwKCZzLT5lZGdlX2VtdV9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT5tZS5zY3JhdGNocGFkKTsKKyAgICBzLT5tZS50ZW1wID0KKyAgICBzLT5yZF9zY3JhdGNocGFkID0KKyAgICBzLT5iX3NjcmF0Y2hwYWQgPQorICAgIHMtPm9ibWNfc2NyYXRjaHBhZCA9IE5VTEw7CisKKyAgICBhdl9mcmVlcCgmcy0+ZGN0X2Vycm9yX3N1bSk7CisgICAgYXZfZnJlZXAoJnMtPm1lLm1hcCk7CisgICAgYXZfZnJlZXAoJnMtPm1lLnNjb3JlX21hcCk7CisgICAgYXZfZnJlZXAoJnMtPmJsb2Nrcyk7CisgICAgYXZfZnJlZXAoJnMtPmFjX3ZhbF9iYXNlKTsKKyAgICBzLT5ibG9jayA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGJhY2t1cF9kdXBsaWNhdGVfY29udGV4dChNcGVnRW5jQ29udGV4dCAqYmFrLCBNcGVnRW5jQ29udGV4dCAqc3JjKQoreworI2RlZmluZSBDT1BZKGEpIGJhay0+YSA9IHNyYy0+YQorICAgIENPUFkoZWRnZV9lbXVfYnVmZmVyKTsKKyAgICBDT1BZKG1lLnNjcmF0Y2hwYWQpOworICAgIENPUFkobWUudGVtcCk7CisgICAgQ09QWShyZF9zY3JhdGNocGFkKTsKKyAgICBDT1BZKGJfc2NyYXRjaHBhZCk7CisgICAgQ09QWShvYm1jX3NjcmF0Y2hwYWQpOworICAgIENPUFkobWUubWFwKTsKKyAgICBDT1BZKG1lLnNjb3JlX21hcCk7CisgICAgQ09QWShibG9ja3MpOworICAgIENPUFkoYmxvY2spOworICAgIENPUFkoc3RhcnRfbWJfeSk7CisgICAgQ09QWShlbmRfbWJfeSk7CisgICAgQ09QWShtZS5tYXBfZ2VuZXJhdGlvbik7CisgICAgQ09QWShwYik7CisgICAgQ09QWShkY3RfZXJyb3Jfc3VtKTsKKyAgICBDT1BZKGRjdF9jb3VudFswXSk7CisgICAgQ09QWShkY3RfY291bnRbMV0pOworICAgIENPUFkoYWNfdmFsX2Jhc2UpOworICAgIENPUFkoYWNfdmFsWzBdKTsKKyAgICBDT1BZKGFjX3ZhbFsxXSk7CisgICAgQ09QWShhY192YWxbMl0pOworI3VuZGVmIENPUFkKK30KKworaW50IGZmX3VwZGF0ZV9kdXBsaWNhdGVfY29udGV4dChNcGVnRW5jQ29udGV4dCAqZHN0LCBNcGVnRW5jQ29udGV4dCAqc3JjKQoreworICAgIE1wZWdFbmNDb250ZXh0IGJhazsKKyAgICBpbnQgaSwgcmV0OworICAgIC8vIEZJWE1FIGNvcHkgb25seSBuZWVkZWQgcGFydHMKKyAgICAvLyBTVEFSVF9USU1FUgorICAgIGJhY2t1cF9kdXBsaWNhdGVfY29udGV4dCgmYmFrLCBkc3QpOworICAgIG1lbWNweShkc3QsIHNyYywgc2l6ZW9mKE1wZWdFbmNDb250ZXh0KSk7CisgICAgYmFja3VwX2R1cGxpY2F0ZV9jb250ZXh0KGRzdCwgJmJhayk7CisgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKyAgICAgICAgZHN0LT5wYmxvY2tzW2ldID0gJmRzdC0+YmxvY2tbaV07CisgICAgfQorICAgIGlmIChkc3QtPmF2Y3R4LT5jb2RlY190YWcgPT0gQVZfUkwzMigiVkNSMiIpKQorICAgICAgICBleGNoYW5nZV91dihkc3QpOworICAgIGlmICghZHN0LT5lZGdlX2VtdV9idWZmZXIgJiYKKyAgICAgICAgKHJldCA9IGZyYW1lX3NpemVfYWxsb2MoZHN0LCBkc3QtPmxpbmVzaXplKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhkc3QtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJmYWlsZWQgdG8gYWxsb2NhdGUgY29udGV4dCAiCisgICAgICAgICAgICAgICAic2NyYXRjaCBidWZmZXJzLlxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIC8vIFNUT1BfVElNRVIoInVwZGF0ZV9kdXBsaWNhdGVfY29udGV4dCIpCisgICAgLy8gYWJvdXQgMTBrIGN5Y2xlcyAvIDAuMDEgc2VjIGZvciAgMTAwMGZyYW1lcyBvbiAxZ2h6IHdpdGggMiB0aHJlYWRzCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9tcGVnX3VwZGF0ZV90aHJlYWRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpzcmMpCit7CisgICAgaW50IGksIHJldDsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9IGRzdC0+cHJpdl9kYXRhLCAqczEgPSBzcmMtPnByaXZfZGF0YTsKKworICAgIGlmIChkc3QgPT0gc3JjKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF2X2Fzc2VydDAocyAhPSBzMSk7CisKKyAgICAvLyBGSVhNRSBjYW4gcGFyYW1ldGVycyBjaGFuZ2Ugb24gSS1mcmFtZXM/CisgICAgLy8gaW4gdGhhdCBjYXNlIGRzdCBtYXkgbmVlZCBhIHJlaW5pdAorICAgIGlmICghcy0+Y29udGV4dF9pbml0aWFsaXplZCkgeworICAgICAgICBpbnQgZXJyOworICAgICAgICBtZW1jcHkocywgczEsIHNpemVvZihNcGVnRW5jQ29udGV4dCkpOworCisgICAgICAgIHMtPmF2Y3R4ICAgICAgICAgICAgICAgICA9IGRzdDsKKyAgICAgICAgcy0+Yml0c3RyZWFtX2J1ZmZlciAgICAgID0gTlVMTDsKKyAgICAgICAgcy0+Yml0c3RyZWFtX2J1ZmZlcl9zaXplID0gcy0+YWxsb2NhdGVkX2JpdHN0cmVhbV9idWZmZXJfc2l6ZSA9IDA7CisKKyAgICAgICAgaWYgKHMxLT5jb250ZXh0X2luaXRpYWxpemVkKXsKKy8vICAgICAgICAgICAgIHMtPnBpY3R1cmVfcmFuZ2Vfc3RhcnQgICs9IE1BWF9QSUNUVVJFX0NPVU5UOworLy8gICAgICAgICAgICAgcy0+cGljdHVyZV9yYW5nZV9lbmQgICAgKz0gTUFYX1BJQ1RVUkVfQ09VTlQ7CisgICAgICAgICAgICBmZl9tcHZfaWRjdF9pbml0KHMpOworICAgICAgICAgICAgaWYoKGVyciA9IGZmX21wdl9jb21tb25faW5pdChzKSkgPCAwKXsKKyAgICAgICAgICAgICAgICBtZW1zZXQocywgMCwgc2l6ZW9mKE1wZWdFbmNDb250ZXh0KSk7CisgICAgICAgICAgICAgICAgcy0+YXZjdHggPSBkc3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5oZWlnaHQgIT0gczEtPmhlaWdodCB8fCBzLT53aWR0aCAhPSBzMS0+d2lkdGggfHwgcy0+Y29udGV4dF9yZWluaXQpIHsKKyAgICAgICAgcy0+Y29udGV4dF9yZWluaXQgPSAwOworICAgICAgICBzLT5oZWlnaHQgPSBzMS0+aGVpZ2h0OworICAgICAgICBzLT53aWR0aCAgPSBzMS0+d2lkdGg7CisgICAgICAgIGlmICgocmV0ID0gZmZfbXB2X2NvbW1vbl9mcmFtZV9zaXplX2NoYW5nZShzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzLT5hdmN0eC0+Y29kZWRfaGVpZ2h0ICA9IHMxLT5hdmN0eC0+Y29kZWRfaGVpZ2h0OworICAgIHMtPmF2Y3R4LT5jb2RlZF93aWR0aCAgID0gczEtPmF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICBzLT5hdmN0eC0+d2lkdGggICAgICAgICA9IHMxLT5hdmN0eC0+d2lkdGg7CisgICAgcy0+YXZjdHgtPmhlaWdodCAgICAgICAgPSBzMS0+YXZjdHgtPmhlaWdodDsKKworICAgIHMtPmNvZGVkX3BpY3R1cmVfbnVtYmVyID0gczEtPmNvZGVkX3BpY3R1cmVfbnVtYmVyOworICAgIHMtPnBpY3R1cmVfbnVtYmVyICAgICAgID0gczEtPnBpY3R1cmVfbnVtYmVyOworCisgICAgYXZfYXNzZXJ0MCghcy0+cGljdHVyZSB8fCBzLT5waWN0dXJlICE9IHMxLT5waWN0dXJlKTsKKyAgICBpZihzLT5waWN0dXJlKQorICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUElDVFVSRV9DT1VOVDsgaSsrKSB7CisgICAgICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLCAmcy0+cGljdHVyZVtpXSk7CisgICAgICAgIGlmIChzMS0+cGljdHVyZVtpXS5mLT5idWZbMF0gJiYKKyAgICAgICAgICAgIChyZXQgPSBmZl9tcGVnX3JlZl9waWN0dXJlKHMsICZzLT5waWN0dXJlW2ldLCAmczEtPnBpY3R1cmVbaV0pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworI2RlZmluZSBVUERBVEVfUElDVFVSRShwaWMpXAorZG8ge1wKKyAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgJnMtPnBpYyk7XAorICAgIGlmIChzMS0+cGljLmYgJiYgczEtPnBpYy5mLT5idWZbMF0pXAorICAgICAgICByZXQgPSBmZl9tcGVnX3JlZl9waWN0dXJlKHMsICZzLT5waWMsICZzMS0+cGljKTtcCisgICAgZWxzZVwKKyAgICAgICAgcmV0ID0gdXBkYXRlX3BpY3R1cmVfdGFibGVzKCZzLT5waWMsICZzMS0+cGljKTtcCisgICAgaWYgKHJldCA8IDApXAorICAgICAgICByZXR1cm4gcmV0O1wKK30gd2hpbGUgKDApCisKKyAgICBVUERBVEVfUElDVFVSRShjdXJyZW50X3BpY3R1cmUpOworICAgIFVQREFURV9QSUNUVVJFKGxhc3RfcGljdHVyZSk7CisgICAgVVBEQVRFX1BJQ1RVUkUobmV4dF9waWN0dXJlKTsKKworICAgIHMtPmxhc3RfcGljdHVyZV9wdHIgICAgPSBSRUJBU0VfUElDVFVSRShzMS0+bGFzdF9waWN0dXJlX3B0ciwgICAgcywgczEpOworICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIgPSBSRUJBU0VfUElDVFVSRShzMS0+Y3VycmVudF9waWN0dXJlX3B0ciwgcywgczEpOworICAgIHMtPm5leHRfcGljdHVyZV9wdHIgICAgPSBSRUJBU0VfUElDVFVSRShzMS0+bmV4dF9waWN0dXJlX3B0ciwgICAgcywgczEpOworCisgICAgLy8gRXJyb3IvYnVnIHJlc2lsaWVuY2UKKyAgICBzLT5uZXh0X3BfZnJhbWVfZGFtYWdlZCA9IHMxLT5uZXh0X3BfZnJhbWVfZGFtYWdlZDsKKyAgICBzLT53b3JrYXJvdW5kX2J1Z3MgICAgICA9IHMxLT53b3JrYXJvdW5kX2J1Z3M7CisgICAgcy0+cGFkZGluZ19idWdfc2NvcmUgICAgPSBzMS0+cGFkZGluZ19idWdfc2NvcmU7CisKKyAgICAvLyBNUEVHNCB0aW1pbmcgaW5mbworICAgIG1lbWNweSgmcy0+bGFzdF90aW1lX2Jhc2UsICZzMS0+bGFzdF90aW1lX2Jhc2UsCisgICAgICAgICAgIChjaGFyICopICZzMS0+cGJfZmllbGRfdGltZSArIHNpemVvZihzMS0+cGJfZmllbGRfdGltZSkgLQorICAgICAgICAgICAoY2hhciAqKSAmczEtPmxhc3RfdGltZV9iYXNlKTsKKworICAgIC8vIEItZnJhbWUgaW5mbworICAgIHMtPm1heF9iX2ZyYW1lcyA9IHMxLT5tYXhfYl9mcmFtZXM7CisgICAgcy0+bG93X2RlbGF5ICAgID0gczEtPmxvd19kZWxheTsKKyAgICBzLT5kcm9wcGFibGUgICAgPSBzMS0+ZHJvcHBhYmxlOworCisgICAgLy8gRGl2WCBoYW5kbGluZyAoZG9lc24ndCB3b3JrKQorICAgIHMtPmRpdnhfcGFja2VkICA9IHMxLT5kaXZ4X3BhY2tlZDsKKworICAgIGlmIChzMS0+Yml0c3RyZWFtX2J1ZmZlcikgeworICAgICAgICBpZiAoczEtPmJpdHN0cmVhbV9idWZmZXJfc2l6ZSArCisgICAgICAgICAgICBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFID4gcy0+YWxsb2NhdGVkX2JpdHN0cmVhbV9idWZmZXJfc2l6ZSkKKyAgICAgICAgICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT5iaXRzdHJlYW1fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmFsbG9jYXRlZF9iaXRzdHJlYW1fYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzMS0+YWxsb2NhdGVkX2JpdHN0cmVhbV9idWZmZXJfc2l6ZSk7CisgICAgICAgICAgICBzLT5iaXRzdHJlYW1fYnVmZmVyX3NpemUgPSBzMS0+Yml0c3RyZWFtX2J1ZmZlcl9zaXplOworICAgICAgICBtZW1jcHkocy0+Yml0c3RyZWFtX2J1ZmZlciwgczEtPmJpdHN0cmVhbV9idWZmZXIsCisgICAgICAgICAgICAgICBzMS0+Yml0c3RyZWFtX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgbWVtc2V0KHMtPmJpdHN0cmVhbV9idWZmZXIgKyBzLT5iaXRzdHJlYW1fYnVmZmVyX3NpemUsIDAsCisgICAgICAgICAgICAgICBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICB9CisKKyAgICAvLyBsaW5lc2l6ZSBkZXBlbmRlbmQgc2NyYXRjaCBidWZmZXIgYWxsb2NhdGlvbgorICAgIGlmICghcy0+ZWRnZV9lbXVfYnVmZmVyKQorICAgICAgICBpZiAoczEtPmxpbmVzaXplKSB7CisgICAgICAgICAgICBpZiAoZnJhbWVfc2l6ZV9hbGxvYyhzLCBzMS0+bGluZXNpemUpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbnRleHQgIgorICAgICAgICAgICAgICAgICAgICAgICAic2NyYXRjaCBidWZmZXJzLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29udGV4dCBzY3JhdGNoIGJ1ZmZlcnMgY291bGQgbm90ICIKKyAgICAgICAgICAgICAgICAgICAiYmUgYWxsb2NhdGVkIGR1ZSB0byB1bmtub3duIHNpemUuXG4iKTsKKyAgICAgICAgfQorCisgICAgLy8gTVBFRzIvaW50ZXJsYWNpbmcgaW5mbworICAgIG1lbWNweSgmcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UsICZzMS0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UsCisgICAgICAgICAgIChjaGFyICopICZzMS0+cnRwX21vZGUgLSAoY2hhciAqKSAmczEtPnByb2dyZXNzaXZlX3NlcXVlbmNlKTsKKworICAgIGlmICghczEtPmZpcnN0X2ZpZWxkKSB7CisgICAgICAgIHMtPmxhc3RfcGljdF90eXBlID0gczEtPnBpY3RfdHlwZTsKKyAgICAgICAgaWYgKHMxLT5jdXJyZW50X3BpY3R1cmVfcHRyKQorICAgICAgICAgICAgcy0+bGFzdF9sYW1iZGFfZm9yW3MxLT5waWN0X3R5cGVdID0gczEtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnF1YWxpdHk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2V0IHRoZSBnaXZlbiBNcGVnRW5jQ29udGV4dCB0byBjb21tb24gZGVmYXVsdHMKKyAqIChzYW1lIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcpLgorICogVGhlIGNoYW5nZWQgZmllbGRzIHdpbGwgbm90IGRlcGVuZCB1cG9uIHRoZQorICogcHJpb3Igc3RhdGUgb2YgdGhlIE1wZWdFbmNDb250ZXh0LgorICovCit2b2lkIGZmX21wdl9jb21tb25fZGVmYXVsdHMoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgcy0+eV9kY19zY2FsZV90YWJsZSAgICAgID0KKyAgICBzLT5jX2RjX3NjYWxlX3RhYmxlICAgICAgPSBmZl9tcGVnMV9kY19zY2FsZV90YWJsZTsKKyAgICBzLT5jaHJvbWFfcXNjYWxlX3RhYmxlICAgPSBmZl9kZWZhdWx0X2Nocm9tYV9xc2NhbGVfdGFibGU7CisgICAgcy0+cHJvZ3Jlc3NpdmVfZnJhbWUgICAgID0gMTsKKyAgICBzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSAgPSAxOworICAgIHMtPnBpY3R1cmVfc3RydWN0dXJlICAgICA9IFBJQ1RfRlJBTUU7CisKKyAgICBzLT5jb2RlZF9waWN0dXJlX251bWJlciAgPSAwOworICAgIHMtPnBpY3R1cmVfbnVtYmVyICAgICAgICA9IDA7CisKKyAgICBzLT5mX2NvZGUgICAgICAgICAgICAgICAgPSAxOworICAgIHMtPmJfY29kZSAgICAgICAgICAgICAgICA9IDE7CisKKyAgICBzLT5zbGljZV9jb250ZXh0X2NvdW50ICAgPSAxOworfQorCisvKioKKyAqIFNldCB0aGUgZ2l2ZW4gTXBlZ0VuY0NvbnRleHQgdG8gZGVmYXVsdHMgZm9yIGRlY29kaW5nLgorICogdGhlIGNoYW5nZWQgZmllbGRzIHdpbGwgbm90IGRlcGVuZCB1cG9uCisgKiB0aGUgcHJpb3Igc3RhdGUgb2YgdGhlIE1wZWdFbmNDb250ZXh0LgorICovCit2b2lkIGZmX21wdl9kZWNvZGVfZGVmYXVsdHMoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgZmZfbXB2X2NvbW1vbl9kZWZhdWx0cyhzKTsKK30KKwordm9pZCBmZl9tcHZfZGVjb2RlX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBzLT5hdmN0eCAgICAgICAgICAgPSBhdmN0eDsKKyAgICBzLT53aWR0aCAgICAgICAgICAgPSBhdmN0eC0+Y29kZWRfd2lkdGg7CisgICAgcy0+aGVpZ2h0ICAgICAgICAgID0gYXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICBzLT5jb2RlY19pZCAgICAgICAgPSBhdmN0eC0+Y29kZWMtPmlkOworICAgIHMtPndvcmthcm91bmRfYnVncyA9IGF2Y3R4LT53b3JrYXJvdW5kX2J1Z3M7CisgICAgcy0+ZmxhZ3MgICAgICAgICAgID0gYXZjdHgtPmZsYWdzOworICAgIHMtPmZsYWdzMiAgICAgICAgICA9IGF2Y3R4LT5mbGFnczI7CisKKyAgICAvKiBjb252ZXJ0IGZvdXJjYyB0byB1cHBlciBjYXNlICovCisgICAgcy0+Y29kZWNfdGFnICAgICAgICAgID0gYXZwcml2X3RvdXBwZXI0KGF2Y3R4LT5jb2RlY190YWcpOworCisgICAgcy0+c3RyZWFtX2NvZGVjX3RhZyAgID0gYXZwcml2X3RvdXBwZXI0KGF2Y3R4LT5zdHJlYW1fY29kZWNfdGFnKTsKK30KKworc3RhdGljIGludCBpbml0X2VyKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIEVSQ29udGV4dCAqZXIgPSAmcy0+ZXI7CisgICAgaW50IG1iX2FycmF5X3NpemUgPSBzLT5tYl9oZWlnaHQgKiBzLT5tYl9zdHJpZGU7CisgICAgaW50IGk7CisKKyAgICBlci0+YXZjdHggICAgICAgPSBzLT5hdmN0eDsKKyAgICBlci0+bWVjYyAgICAgICAgPSAmcy0+bWVjYzsKKworICAgIGVyLT5tYl9pbmRleDJ4eSA9IHMtPm1iX2luZGV4Mnh5OworICAgIGVyLT5tYl9udW0gICAgICA9IHMtPm1iX251bTsKKyAgICBlci0+bWJfd2lkdGggICAgPSBzLT5tYl93aWR0aDsKKyAgICBlci0+bWJfaGVpZ2h0ICAgPSBzLT5tYl9oZWlnaHQ7CisgICAgZXItPm1iX3N0cmlkZSAgID0gcy0+bWJfc3RyaWRlOworICAgIGVyLT5iOF9zdHJpZGUgICA9IHMtPmI4X3N0cmlkZTsKKworICAgIGVyLT5lcl90ZW1wX2J1ZmZlciAgICAgPSBhdl9tYWxsb2Mocy0+bWJfaGVpZ2h0ICogcy0+bWJfc3RyaWRlKTsKKyAgICBlci0+ZXJyb3Jfc3RhdHVzX3RhYmxlID0gYXZfbWFsbG9jeihtYl9hcnJheV9zaXplKTsKKyAgICBpZiAoIWVyLT5lcl90ZW1wX2J1ZmZlciB8fCAhZXItPmVycm9yX3N0YXR1c190YWJsZSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZXItPm1ic2tpcF90YWJsZSAgPSBzLT5tYnNraXBfdGFibGU7CisgICAgZXItPm1iaW50cmFfdGFibGUgPSBzLT5tYmludHJhX3RhYmxlOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPmRjX3ZhbCk7IGkrKykKKyAgICAgICAgZXItPmRjX3ZhbFtpXSA9IHMtPmRjX3ZhbFtpXTsKKworICAgIGVyLT5kZWNvZGVfbWIgPSBtcGVnX2VyX2RlY29kZV9tYjsKKyAgICBlci0+b3BhcXVlICAgID0gczsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBhdl9mcmVlcCgmZXItPmVyX3RlbXBfYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmZXItPmVycm9yX3N0YXR1c190YWJsZSk7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplIGFuZCBhbGxvY2F0ZXMgTXBlZ0VuY0NvbnRleHQgZmllbGRzIGRlcGVuZGVudCBvbiB0aGUgcmVzb2x1dGlvbi4KKyAqLworc3RhdGljIGludCBpbml0X2NvbnRleHRfZnJhbWUoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IHlfc2l6ZSwgY19zaXplLCB5Y19zaXplLCBpLCBtYl9hcnJheV9zaXplLCBtdl90YWJsZV9zaXplLCB4LCB5OworCisgICAgcy0+bWJfd2lkdGggICA9IChzLT53aWR0aCArIDE1KSAvIDE2OworICAgIHMtPm1iX3N0cmlkZSAgPSBzLT5tYl93aWR0aCArIDE7CisgICAgcy0+Yjhfc3RyaWRlICA9IHMtPm1iX3dpZHRoICogMiArIDE7CisgICAgbWJfYXJyYXlfc2l6ZSA9IHMtPm1iX2hlaWdodCAqIHMtPm1iX3N0cmlkZTsKKyAgICBtdl90YWJsZV9zaXplID0gKHMtPm1iX2hlaWdodCArIDIpICogcy0+bWJfc3RyaWRlICsgMTsKKworICAgIC8qIHNldCBkZWZhdWx0IGVkZ2UgcG9zLCB3aWxsIGJlIG92ZXJyaWRkZW4KKyAgICAgKiBpbiBkZWNvZGVfaGVhZGVyIGlmIG5lZWRlZCAqLworICAgIHMtPmhfZWRnZV9wb3MgPSBzLT5tYl93aWR0aCAqIDE2OworICAgIHMtPnZfZWRnZV9wb3MgPSBzLT5tYl9oZWlnaHQgKiAxNjsKKworICAgIHMtPm1iX251bSAgICAgPSBzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodDsKKworICAgIHMtPmJsb2NrX3dyYXBbMF0gPQorICAgIHMtPmJsb2NrX3dyYXBbMV0gPQorICAgIHMtPmJsb2NrX3dyYXBbMl0gPQorICAgIHMtPmJsb2NrX3dyYXBbM10gPSBzLT5iOF9zdHJpZGU7CisgICAgcy0+YmxvY2tfd3JhcFs0XSA9CisgICAgcy0+YmxvY2tfd3JhcFs1XSA9IHMtPm1iX3N0cmlkZTsKKworICAgIHlfc2l6ZSAgPSBzLT5iOF9zdHJpZGUgKiAoMiAqIHMtPm1iX2hlaWdodCArIDEpOworICAgIGNfc2l6ZSAgPSBzLT5tYl9zdHJpZGUgKiAocy0+bWJfaGVpZ2h0ICsgMSk7CisgICAgeWNfc2l6ZSA9IHlfc2l6ZSArIDIgICAqIGNfc2l6ZTsKKworICAgIGlmIChzLT5tYl9oZWlnaHQgJiAxKQorICAgICAgICB5Y19zaXplICs9IDIqcy0+Yjhfc3RyaWRlICsgMipzLT5tYl9zdHJpZGU7CisKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+bWJfaW5kZXgyeHksIChzLT5tYl9udW0gKyAxKSAqIHNpemVvZihpbnQpLCBmYWlsKTsgLy8gZXJyb3IgcmVzc2lsaWVuY2UgY29kZSBsb29rcyBjbGVhbmVyIHdpdGggdGhpcworICAgIGZvciAoeSA9IDA7IHkgPCBzLT5tYl9oZWlnaHQ7IHkrKykKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPm1iX3dpZHRoOyB4KyspCisgICAgICAgICAgICBzLT5tYl9pbmRleDJ4eVt4ICsgeSAqIHMtPm1iX3dpZHRoXSA9IHggKyB5ICogcy0+bWJfc3RyaWRlOworCisgICAgcy0+bWJfaW5kZXgyeHlbcy0+bWJfaGVpZ2h0ICogcy0+bWJfd2lkdGhdID0gKHMtPm1iX2hlaWdodCAtIDEpICogcy0+bWJfc3RyaWRlICsgcy0+bWJfd2lkdGg7IC8vIEZJWE1FIHJlYWxseSBuZWVkZWQ/CisKKyAgICBpZiAocy0+ZW5jb2RpbmcpIHsKKyAgICAgICAgLyogQWxsb2NhdGUgTVYgdGFibGVzICovCisgICAgICAgIEZGX0FMTE9DWl9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5wX212X3RhYmxlX2Jhc2UsICAgICAgICAgICAgICAgICBtdl90YWJsZV9zaXplICogMiAqIHNpemVvZihpbnQxNl90KSwgZmFpbCkKKyAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8ocy0+YXZjdHgsIHMtPmJfZm9yd19tdl90YWJsZV9iYXNlLCAgICAgICAgICAgIG12X3RhYmxlX3NpemUgKiAyICogc2l6ZW9mKGludDE2X3QpLCBmYWlsKQorICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+Yl9iYWNrX212X3RhYmxlX2Jhc2UsICAgICAgICAgICAgbXZfdGFibGVfc2l6ZSAqIDIgKiBzaXplb2YoaW50MTZfdCksIGZhaWwpCisgICAgICAgIEZGX0FMTE9DWl9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5iX2JpZGlyX2ZvcndfbXZfdGFibGVfYmFzZSwgICAgICBtdl90YWJsZV9zaXplICogMiAqIHNpemVvZihpbnQxNl90KSwgZmFpbCkKKyAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8ocy0+YXZjdHgsIHMtPmJfYmlkaXJfYmFja19tdl90YWJsZV9iYXNlLCAgICAgIG12X3RhYmxlX3NpemUgKiAyICogc2l6ZW9mKGludDE2X3QpLCBmYWlsKQorICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+Yl9kaXJlY3RfbXZfdGFibGVfYmFzZSwgICAgICAgICAgbXZfdGFibGVfc2l6ZSAqIDIgKiBzaXplb2YoaW50MTZfdCksIGZhaWwpCisgICAgICAgIHMtPnBfbXZfdGFibGUgICAgICAgICAgICA9IHMtPnBfbXZfdGFibGVfYmFzZSArIHMtPm1iX3N0cmlkZSArIDE7CisgICAgICAgIHMtPmJfZm9yd19tdl90YWJsZSAgICAgICA9IHMtPmJfZm9yd19tdl90YWJsZV9iYXNlICsgcy0+bWJfc3RyaWRlICsgMTsKKyAgICAgICAgcy0+Yl9iYWNrX212X3RhYmxlICAgICAgID0gcy0+Yl9iYWNrX212X3RhYmxlX2Jhc2UgKyBzLT5tYl9zdHJpZGUgKyAxOworICAgICAgICBzLT5iX2JpZGlyX2ZvcndfbXZfdGFibGUgPSBzLT5iX2JpZGlyX2ZvcndfbXZfdGFibGVfYmFzZSArIHMtPm1iX3N0cmlkZSArIDE7CisgICAgICAgIHMtPmJfYmlkaXJfYmFja19tdl90YWJsZSA9IHMtPmJfYmlkaXJfYmFja19tdl90YWJsZV9iYXNlICsgcy0+bWJfc3RyaWRlICsgMTsKKyAgICAgICAgcy0+Yl9kaXJlY3RfbXZfdGFibGUgICAgID0gcy0+Yl9kaXJlY3RfbXZfdGFibGVfYmFzZSArIHMtPm1iX3N0cmlkZSArIDE7CisKKyAgICAgICAgLyogQWxsb2NhdGUgTUIgdHlwZSB0YWJsZSAqLworICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+bWJfdHlwZSwgbWJfYXJyYXlfc2l6ZSAqIHNpemVvZih1aW50MTZfdCksIGZhaWwpIC8vIG5lZWRlZCBmb3IgZW5jb2RpbmcKKworICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+bGFtYmRhX3RhYmxlLCBtYl9hcnJheV9zaXplICogc2l6ZW9mKGludCksIGZhaWwpCisKKyAgICAgICAgRkZfQUxMT0NfT1JfR09UTyhzLT5hdmN0eCwgcy0+Y3BseF90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWJfYXJyYXlfc2l6ZSAqIHNpemVvZihmbG9hdCksIGZhaWwpOworICAgICAgICBGRl9BTExPQ19PUl9HT1RPKHMtPmF2Y3R4LCBzLT5iaXRzX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYl9hcnJheV9zaXplICogc2l6ZW9mKGZsb2F0KSwgZmFpbCk7CisKKyAgICB9CisKKyAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQgfHwKKyAgICAgICAgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19JTlRFUkxBQ0VEX01FKSkgeworICAgICAgICAvKiBpbnRlcmxhY2VkIGRpcmVjdCBtb2RlIGRlY29kaW5nIHRhYmxlcyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaiwgazsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIEZGX0FMTE9DWl9PUl9HT1RPKHMtPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5iX2ZpZWxkX212X3RhYmxlX2Jhc2VbaV1bal1ba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12X3RhYmxlX3NpemUgKiAyICogc2l6ZW9mKGludDE2X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+Yl9maWVsZF9tdl90YWJsZVtpXVtqXVtrXSA9IHMtPmJfZmllbGRfbXZfdGFibGVfYmFzZVtpXVtqXVtrXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYl9zdHJpZGUgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+Yl9maWVsZF9zZWxlY3RfdGFibGUgW2ldW2pdLCBtYl9hcnJheV9zaXplICogMiAqIHNpemVvZih1aW50OF90KSwgZmFpbCkKKyAgICAgICAgICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+cF9maWVsZF9tdl90YWJsZV9iYXNlW2ldW2pdLCBtdl90YWJsZV9zaXplICogMiAqIHNpemVvZihpbnQxNl90KSwgZmFpbCkKKyAgICAgICAgICAgICAgICBzLT5wX2ZpZWxkX212X3RhYmxlW2ldW2pdID0gcy0+cF9maWVsZF9tdl90YWJsZV9iYXNlW2ldW2pdICsgcy0+bWJfc3RyaWRlICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZGX0FMTE9DWl9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5wX2ZpZWxkX3NlbGVjdF90YWJsZVtpXSwgbWJfYXJyYXlfc2l6ZSAqIDIgKiBzaXplb2YodWludDhfdCksIGZhaWwpCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjMpIHsKKyAgICAgICAgLyogY2JwIHZhbHVlcyAqLworICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+Y29kZWRfYmxvY2tfYmFzZSwgeV9zaXplICsgKHMtPm1iX2hlaWdodCYxKSoyKnMtPmI4X3N0cmlkZSwgZmFpbCk7CisgICAgICAgIHMtPmNvZGVkX2Jsb2NrID0gcy0+Y29kZWRfYmxvY2tfYmFzZSArIHMtPmI4X3N0cmlkZSArIDE7CisKKyAgICAgICAgLyogY2JwLCBhY19wcmVkLCBwcmVkX2RpciAqLworICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+Y2JwX3RhYmxlICAgICAsIG1iX2FycmF5X3NpemUgKiBzaXplb2YodWludDhfdCksIGZhaWwpOworICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+cHJlZF9kaXJfdGFibGUsIG1iX2FycmF5X3NpemUgKiBzaXplb2YodWludDhfdCksIGZhaWwpOworICAgIH0KKworICAgIGlmIChzLT5oMjYzX3ByZWQgfHwgcy0+aDI2M19wbHVzIHx8ICFzLT5lbmNvZGluZykgeworICAgICAgICAvKiBkYyB2YWx1ZXMgKi8KKyAgICAgICAgLy8gTU46IHdlIG5lZWQgdGhlc2UgZm9yICBlcnJvciByZXNpbGllbmNlIG9mIGludHJhLWZyYW1lcworICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+ZGNfdmFsX2Jhc2UsIHljX3NpemUgKiBzaXplb2YoaW50MTZfdCksIGZhaWwpOworICAgICAgICBzLT5kY192YWxbMF0gPSBzLT5kY192YWxfYmFzZSArIHMtPmI4X3N0cmlkZSArIDE7CisgICAgICAgIHMtPmRjX3ZhbFsxXSA9IHMtPmRjX3ZhbF9iYXNlICsgeV9zaXplICsgcy0+bWJfc3RyaWRlICsgMTsKKyAgICAgICAgcy0+ZGNfdmFsWzJdID0gcy0+ZGNfdmFsWzFdICsgY19zaXplOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgeWNfc2l6ZTsgaSsrKQorICAgICAgICAgICAgcy0+ZGNfdmFsX2Jhc2VbaV0gPSAxMDI0OworICAgIH0KKworICAgIC8qIHdoaWNoIG1iIGlzIGEgaW50cmEgYmxvY2sgKi8KKyAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+bWJpbnRyYV90YWJsZSwgbWJfYXJyYXlfc2l6ZSwgZmFpbCk7CisgICAgbWVtc2V0KHMtPm1iaW50cmFfdGFibGUsIDEsIG1iX2FycmF5X3NpemUpOworCisgICAgLyogaW5pdCBtYWNyb2Jsb2NrIHNraXAgdGFibGUgKi8KKyAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+bWJza2lwX3RhYmxlLCBtYl9hcnJheV9zaXplICsgMiwgZmFpbCk7CisgICAgLy8gTm90ZSB0aGUgKyAxIGlzIGZvciAgYSBxdWlja2VyIG1wZWc0IHNsaWNlX2VuZCBkZXRlY3Rpb24KKworICAgIHJldHVybiBpbml0X2VyKHMpOworZmFpbDoKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCisvKioKKyAqIGluaXQgY29tbW9uIHN0cnVjdHVyZSBmb3IgYm90aCBlbmNvZGVyIGFuZCBkZWNvZGVyLgorICogdGhpcyBhc3N1bWVzIHRoYXQgc29tZSB2YXJpYWJsZXMgbGlrZSB3aWR0aC9oZWlnaHQgYXJlIGFscmVhZHkgc2V0CisgKi8KK2F2X2NvbGQgaW50IGZmX21wdl9jb21tb25faW5pdChNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbmJfc2xpY2VzID0gKEhBVkVfVEhSRUFEUyAmJgorICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9TTElDRSkgPworICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+dGhyZWFkX2NvdW50IDogMTsKKworICAgIGlmIChzLT5lbmNvZGluZyAmJiBzLT5hdmN0eC0+c2xpY2VzKQorICAgICAgICBuYl9zbGljZXMgPSBzLT5hdmN0eC0+c2xpY2VzOworCisgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYgIXMtPnByb2dyZXNzaXZlX3NlcXVlbmNlKQorICAgICAgICBzLT5tYl9oZWlnaHQgPSAocy0+aGVpZ2h0ICsgMzEpIC8gMzIgKiAyOworICAgIGVsc2UKKyAgICAgICAgcy0+bWJfaGVpZ2h0ID0gKHMtPmhlaWdodCArIDE1KSAvIDE2OworCisgICAgaWYgKHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJkZWNvZGluZyB0byBBVl9QSVhfRk1UX05PTkUgaXMgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKG5iX3NsaWNlcyA+IE1BWF9USFJFQURTIHx8IChuYl9zbGljZXMgPiBzLT5tYl9oZWlnaHQgJiYgcy0+bWJfaGVpZ2h0KSkgeworICAgICAgICBpbnQgbWF4X3NsaWNlczsKKyAgICAgICAgaWYgKHMtPm1iX2hlaWdodCkKKyAgICAgICAgICAgIG1heF9zbGljZXMgPSBGRk1JTihNQVhfVEhSRUFEUywgcy0+bWJfaGVpZ2h0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF4X3NsaWNlcyA9IE1BWF9USFJFQURTOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAidG9vIG1hbnkgdGhyZWFkcy9zbGljZXMgKCVkKSwiCisgICAgICAgICAgICAgICAiIHJlZHVjaW5nIHRvICVkXG4iLCBuYl9zbGljZXMsIG1heF9zbGljZXMpOworICAgICAgICBuYl9zbGljZXMgPSBtYXhfc2xpY2VzOworICAgIH0KKworICAgIGlmICgocy0+d2lkdGggfHwgcy0+aGVpZ2h0KSAmJgorICAgICAgICBhdl9pbWFnZV9jaGVja19zaXplKHMtPndpZHRoLCBzLT5oZWlnaHQsIDAsIHMtPmF2Y3R4KSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZGN0X2luaXQocyk7CisKKyAgICBzLT5mbGFncyAgPSBzLT5hdmN0eC0+ZmxhZ3M7CisgICAgcy0+ZmxhZ3MyID0gcy0+YXZjdHgtPmZsYWdzMjsKKworICAgIC8qIHNldCBjaHJvbWEgc2hpZnRzICovCisgICAgYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUocy0+YXZjdHgtPnBpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmNocm9tYV94X3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jaHJvbWFfeV9zaGlmdCk7CisKKworICAgIEZGX0FMTE9DWl9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgIE1BWF9QSUNUVVJFX0NPVU5UICogc2l6ZW9mKFBpY3R1cmUpLCBmYWlsKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BJQ1RVUkVfQ09VTlQ7IGkrKykgeworICAgICAgICBzLT5waWN0dXJlW2ldLmYgPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICBpZiAoIXMtPnBpY3R1cmVbaV0uZikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgbWVtc2V0KCZzLT5uZXh0X3BpY3R1cmUsIDAsIHNpemVvZihzLT5uZXh0X3BpY3R1cmUpKTsKKyAgICBtZW1zZXQoJnMtPmxhc3RfcGljdHVyZSwgMCwgc2l6ZW9mKHMtPmxhc3RfcGljdHVyZSkpOworICAgIG1lbXNldCgmcy0+Y3VycmVudF9waWN0dXJlLCAwLCBzaXplb2Yocy0+Y3VycmVudF9waWN0dXJlKSk7CisgICAgbWVtc2V0KCZzLT5uZXdfcGljdHVyZSwgMCwgc2l6ZW9mKHMtPm5ld19waWN0dXJlKSk7CisgICAgcy0+bmV4dF9waWN0dXJlLmYgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+bmV4dF9waWN0dXJlLmYpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBzLT5sYXN0X3BpY3R1cmUuZiA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5sYXN0X3BpY3R1cmUuZikKKyAgICAgICAgZ290byBmYWlsOworICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmN1cnJlbnRfcGljdHVyZS5mKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcy0+bmV3X3BpY3R1cmUuZiA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5uZXdfcGljdHVyZS5mKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgaWYgKGluaXRfY29udGV4dF9mcmFtZShzKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBzLT5wYXJzZV9jb250ZXh0LnN0YXRlID0gLTE7CisKKyAgICAgICAgcy0+Y29udGV4dF9pbml0aWFsaXplZCA9IDE7CisgICAgICAgIHMtPnRocmVhZF9jb250ZXh0WzBdICAgPSBzOworCisvLyAgICAgaWYgKHMtPndpZHRoICYmIHMtPmhlaWdodCkgeworICAgICAgICBpZiAobmJfc2xpY2VzID4gMSkgeworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IG5iX3NsaWNlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgcy0+dGhyZWFkX2NvbnRleHRbaV0gPSBhdl9tYWxsb2Moc2l6ZW9mKE1wZWdFbmNDb250ZXh0KSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHMtPnRocmVhZF9jb250ZXh0W2ldLCBzLCBzaXplb2YoTXBlZ0VuY0NvbnRleHQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NsaWNlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluaXRfZHVwbGljYXRlX2NvbnRleHQocy0+dGhyZWFkX2NvbnRleHRbaV0pIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICAgICBzLT50aHJlYWRfY29udGV4dFtpXS0+c3RhcnRfbWJfeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAocy0+bWJfaGVpZ2h0ICogKGkpICsgbmJfc2xpY2VzIC8gMikgLyBuYl9zbGljZXM7CisgICAgICAgICAgICAgICAgICAgIHMtPnRocmVhZF9jb250ZXh0W2ldLT5lbmRfbWJfeSAgID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tYl9oZWlnaHQgKiAoaSArIDEpICsgbmJfc2xpY2VzIC8gMikgLyBuYl9zbGljZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaW5pdF9kdXBsaWNhdGVfY29udGV4dChzKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgcy0+c3RhcnRfbWJfeSA9IDA7CisgICAgICAgICAgICBzLT5lbmRfbWJfeSAgID0gcy0+bWJfaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHMtPnNsaWNlX2NvbnRleHRfY291bnQgPSBuYl9zbGljZXM7CisvLyAgICAgfQorCisgICAgcmV0dXJuIDA7CisgZmFpbDoKKyAgICBmZl9tcHZfY29tbW9uX2VuZChzKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qKgorICogRnJlZXMgYW5kIHJlc2V0cyBNcGVnRW5jQ29udGV4dCBmaWVsZHMgZGVwZW5kaW5nIG9uIHRoZSByZXNvbHV0aW9uLgorICogSXMgdXNlZCBkdXJpbmcgcmVzb2x1dGlvbiBjaGFuZ2VzIHRvIGF2b2lkIGEgZnVsbCByZWluaXRpYWxpemF0aW9uIG9mIHRoZQorICogY29kZWMuCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfY29udGV4dF9mcmFtZShNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGF2X2ZyZWVwKCZzLT5tYl90eXBlKTsKKyAgICBhdl9mcmVlcCgmcy0+cF9tdl90YWJsZV9iYXNlKTsKKyAgICBhdl9mcmVlcCgmcy0+Yl9mb3J3X212X3RhYmxlX2Jhc2UpOworICAgIGF2X2ZyZWVwKCZzLT5iX2JhY2tfbXZfdGFibGVfYmFzZSk7CisgICAgYXZfZnJlZXAoJnMtPmJfYmlkaXJfZm9yd19tdl90YWJsZV9iYXNlKTsKKyAgICBhdl9mcmVlcCgmcy0+Yl9iaWRpcl9iYWNrX212X3RhYmxlX2Jhc2UpOworICAgIGF2X2ZyZWVwKCZzLT5iX2RpcmVjdF9tdl90YWJsZV9iYXNlKTsKKyAgICBzLT5wX212X3RhYmxlICAgICAgICAgICAgPSBOVUxMOworICAgIHMtPmJfZm9yd19tdl90YWJsZSAgICAgICA9IE5VTEw7CisgICAgcy0+Yl9iYWNrX212X3RhYmxlICAgICAgID0gTlVMTDsKKyAgICBzLT5iX2JpZGlyX2ZvcndfbXZfdGFibGUgPSBOVUxMOworICAgIHMtPmJfYmlkaXJfYmFja19tdl90YWJsZSA9IE5VTEw7CisgICAgcy0+Yl9kaXJlY3RfbXZfdGFibGUgICAgID0gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAyOyBrKyspIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcy0+Yl9maWVsZF9tdl90YWJsZV9iYXNlW2ldW2pdW2tdKTsKKyAgICAgICAgICAgICAgICBzLT5iX2ZpZWxkX212X3RhYmxlW2ldW2pdW2tdID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5iX2ZpZWxkX3NlbGVjdF90YWJsZVtpXVtqXSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+cF9maWVsZF9tdl90YWJsZV9iYXNlW2ldW2pdKTsKKyAgICAgICAgICAgIHMtPnBfZmllbGRfbXZfdGFibGVbaV1bal0gPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVwKCZzLT5wX2ZpZWxkX3NlbGVjdF90YWJsZVtpXSk7CisgICAgfQorCisgICAgYXZfZnJlZXAoJnMtPmRjX3ZhbF9iYXNlKTsKKyAgICBhdl9mcmVlcCgmcy0+Y29kZWRfYmxvY2tfYmFzZSk7CisgICAgYXZfZnJlZXAoJnMtPm1iaW50cmFfdGFibGUpOworICAgIGF2X2ZyZWVwKCZzLT5jYnBfdGFibGUpOworICAgIGF2X2ZyZWVwKCZzLT5wcmVkX2Rpcl90YWJsZSk7CisKKyAgICBhdl9mcmVlcCgmcy0+bWJza2lwX3RhYmxlKTsKKworICAgIGF2X2ZyZWVwKCZzLT5lci5lcnJvcl9zdGF0dXNfdGFibGUpOworICAgIGF2X2ZyZWVwKCZzLT5lci5lcl90ZW1wX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPm1iX2luZGV4Mnh5KTsKKyAgICBhdl9mcmVlcCgmcy0+bGFtYmRhX3RhYmxlKTsKKworICAgIGF2X2ZyZWVwKCZzLT5jcGx4X3RhYik7CisgICAgYXZfZnJlZXAoJnMtPmJpdHNfdGFiKTsKKworICAgIHMtPmxpbmVzaXplID0gcy0+dXZsaW5lc2l6ZSA9IDA7Cit9CisKK2ludCBmZl9tcHZfY29tbW9uX2ZyYW1lX3NpemVfY2hhbmdlKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludCBpLCBlcnIgPSAwOworCisgICAgaWYgKCFzLT5jb250ZXh0X2luaXRpYWxpemVkKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKHMtPnNsaWNlX2NvbnRleHRfY291bnQgPiAxKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zbGljZV9jb250ZXh0X2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZyZWVfZHVwbGljYXRlX2NvbnRleHQocy0+dGhyZWFkX2NvbnRleHRbaV0pOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzLT5zbGljZV9jb250ZXh0X2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT50aHJlYWRfY29udGV4dFtpXSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgZnJlZV9kdXBsaWNhdGVfY29udGV4dChzKTsKKworICAgIGZyZWVfY29udGV4dF9mcmFtZShzKTsKKworICAgIGlmIChzLT5waWN0dXJlKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BJQ1RVUkVfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgICAgIHMtPnBpY3R1cmVbaV0ubmVlZHNfcmVhbGxvYyA9IDE7CisgICAgICAgIH0KKworICAgIHMtPmxhc3RfcGljdHVyZV9wdHIgICAgICAgICA9CisgICAgcy0+bmV4dF9waWN0dXJlX3B0ciAgICAgICAgID0KKyAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyICAgICAgPSBOVUxMOworCisgICAgLy8gaW5pdAorICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICYmICFzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSkKKyAgICAgICAgcy0+bWJfaGVpZ2h0ID0gKHMtPmhlaWdodCArIDMxKSAvIDMyICogMjsKKyAgICBlbHNlCisgICAgICAgIHMtPm1iX2hlaWdodCA9IChzLT5oZWlnaHQgKyAxNSkgLyAxNjsKKworICAgIGlmICgocy0+d2lkdGggfHwgcy0+aGVpZ2h0KSAmJgorICAgICAgICAoZXJyID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZShzLT53aWR0aCwgcy0+aGVpZ2h0LCAwLCBzLT5hdmN0eCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKChlcnIgPSBpbml0X2NvbnRleHRfZnJhbWUocykpKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzLT50aHJlYWRfY29udGV4dFswXSAgID0gczsKKworICAgIGlmIChzLT53aWR0aCAmJiBzLT5oZWlnaHQpIHsKKyAgICAgICAgaW50IG5iX3NsaWNlcyA9IHMtPnNsaWNlX2NvbnRleHRfY291bnQ7CisgICAgICAgIGlmIChuYl9zbGljZXMgPiAxKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbmJfc2xpY2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzLT50aHJlYWRfY29udGV4dFtpXSA9IGF2X21hbGxvYyhzaXplb2YoTXBlZ0VuY0NvbnRleHQpKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+dGhyZWFkX2NvbnRleHRbaV0sIHMsIHNpemVvZihNcGVnRW5jQ29udGV4dCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2xpY2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKGVyciA9IGluaXRfZHVwbGljYXRlX2NvbnRleHQocy0+dGhyZWFkX2NvbnRleHRbaV0pKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgcy0+dGhyZWFkX2NvbnRleHRbaV0tPnN0YXJ0X21iX3kgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1iX2hlaWdodCAqIChpKSArIG5iX3NsaWNlcyAvIDIpIC8gbmJfc2xpY2VzOworICAgICAgICAgICAgICAgICAgICBzLT50aHJlYWRfY29udGV4dFtpXS0+ZW5kX21iX3kgICA9CisgICAgICAgICAgICAgICAgICAgICAgICAocy0+bWJfaGVpZ2h0ICogKGkgKyAxKSArIG5iX3NsaWNlcyAvIDIpIC8gbmJfc2xpY2VzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gaW5pdF9kdXBsaWNhdGVfY29udGV4dChzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIHMtPnN0YXJ0X21iX3kgPSAwOworICAgICAgICAgICAgcy0+ZW5kX21iX3kgICA9IHMtPm1iX2hlaWdodDsKKyAgICAgICAgfQorICAgICAgICBzLT5zbGljZV9jb250ZXh0X2NvdW50ID0gbmJfc2xpY2VzOworICAgIH0KKworICAgIHJldHVybiAwOworIGZhaWw6CisgICAgZmZfbXB2X2NvbW1vbl9lbmQocyk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyogaW5pdCBjb21tb24gc3RydWN0dXJlIGZvciBib3RoIGVuY29kZXIgYW5kIGRlY29kZXIgKi8KK3ZvaWQgZmZfbXB2X2NvbW1vbl9lbmQoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAocy0+c2xpY2VfY29udGV4dF9jb3VudCA+IDEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnNsaWNlX2NvbnRleHRfY291bnQ7IGkrKykgeworICAgICAgICAgICAgZnJlZV9kdXBsaWNhdGVfY29udGV4dChzLT50aHJlYWRfY29udGV4dFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMTsgaSA8IHMtPnNsaWNlX2NvbnRleHRfY291bnQ7IGkrKykgeworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPnRocmVhZF9jb250ZXh0W2ldKTsKKyAgICAgICAgfQorICAgICAgICBzLT5zbGljZV9jb250ZXh0X2NvdW50ID0gMTsKKyAgICB9IGVsc2UgZnJlZV9kdXBsaWNhdGVfY29udGV4dChzKTsKKworICAgIGF2X2ZyZWVwKCZzLT5wYXJzZV9jb250ZXh0LmJ1ZmZlcik7CisgICAgcy0+cGFyc2VfY29udGV4dC5idWZmZXJfc2l6ZSA9IDA7CisKKyAgICBhdl9mcmVlcCgmcy0+Yml0c3RyZWFtX2J1ZmZlcik7CisgICAgcy0+YWxsb2NhdGVkX2JpdHN0cmVhbV9idWZmZXJfc2l6ZSA9IDA7CisKKyAgICBpZiAocy0+cGljdHVyZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BJQ1RVUkVfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgZmZfZnJlZV9waWN0dXJlX3RhYmxlcygmcy0+cGljdHVyZVtpXSk7CisgICAgICAgICAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgJnMtPnBpY3R1cmVbaV0pOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+cGljdHVyZVtpXS5mKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9mcmVlcCgmcy0+cGljdHVyZSk7CisgICAgZmZfZnJlZV9waWN0dXJlX3RhYmxlcygmcy0+bGFzdF9waWN0dXJlKTsKKyAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgJnMtPmxhc3RfcGljdHVyZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9waWN0dXJlLmYpOworICAgIGZmX2ZyZWVfcGljdHVyZV90YWJsZXMoJnMtPmN1cnJlbnRfcGljdHVyZSk7CisgICAgZmZfbXBlZ191bnJlZl9waWN0dXJlKHMsICZzLT5jdXJyZW50X3BpY3R1cmUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmN1cnJlbnRfcGljdHVyZS5mKTsKKyAgICBmZl9mcmVlX3BpY3R1cmVfdGFibGVzKCZzLT5uZXh0X3BpY3R1cmUpOworICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLCAmcy0+bmV4dF9waWN0dXJlKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5uZXh0X3BpY3R1cmUuZik7CisgICAgZmZfZnJlZV9waWN0dXJlX3RhYmxlcygmcy0+bmV3X3BpY3R1cmUpOworICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLCAmcy0+bmV3X3BpY3R1cmUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPm5ld19waWN0dXJlLmYpOworCisgICAgZnJlZV9jb250ZXh0X2ZyYW1lKHMpOworCisgICAgcy0+Y29udGV4dF9pbml0aWFsaXplZCAgICAgID0gMDsKKyAgICBzLT5sYXN0X3BpY3R1cmVfcHRyICAgICAgICAgPQorICAgIHMtPm5leHRfcGljdHVyZV9wdHIgICAgICAgICA9CisgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ciAgICAgID0gTlVMTDsKKyAgICBzLT5saW5lc2l6ZSA9IHMtPnV2bGluZXNpemUgPSAwOworfQorCithdl9jb2xkIHZvaWQgZmZfaW5pdF9ybChSTFRhYmxlICpybCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdGljX3N0b3JlWzJdWzIgKiBNQVhfUlVOICsgTUFYX0xFVkVMICsgM10pCit7CisgICAgaW50OF90ICBtYXhfbGV2ZWxbTUFYX1JVTiArIDFdLCBtYXhfcnVuW01BWF9MRVZFTCArIDFdOworICAgIHVpbnQ4X3QgaW5kZXhfcnVuW01BWF9SVU4gKyAxXTsKKyAgICBpbnQgbGFzdCwgcnVuLCBsZXZlbCwgc3RhcnQsIGVuZCwgaTsKKworICAgIC8qIElmIHRhYmxlIGlzIHN0YXRpYywgd2UgY2FuIHF1aXQgaWYgcmwtPm1heF9sZXZlbFswXSBpcyBub3QgTlVMTCAqLworICAgIGlmIChzdGF0aWNfc3RvcmUgJiYgcmwtPm1heF9sZXZlbFswXSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogY29tcHV0ZSBtYXhfbGV2ZWxbXSwgbWF4X3J1bltdIGFuZCBpbmRleF9ydW5bXSAqLworICAgIGZvciAobGFzdCA9IDA7IGxhc3QgPCAyOyBsYXN0KyspIHsKKyAgICAgICAgaWYgKGxhc3QgPT0gMCkgeworICAgICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICAgICAgZW5kID0gcmwtPmxhc3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydCA9IHJsLT5sYXN0OworICAgICAgICAgICAgZW5kID0gcmwtPm47CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQobWF4X2xldmVsLCAwLCBNQVhfUlVOICsgMSk7CisgICAgICAgIG1lbXNldChtYXhfcnVuLCAwLCBNQVhfTEVWRUwgKyAxKTsKKyAgICAgICAgbWVtc2V0KGluZGV4X3J1biwgcmwtPm4sIE1BWF9SVU4gKyAxKTsKKyAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgcnVuICAgPSBybC0+dGFibGVfcnVuW2ldOworICAgICAgICAgICAgbGV2ZWwgPSBybC0+dGFibGVfbGV2ZWxbaV07CisgICAgICAgICAgICBpZiAoaW5kZXhfcnVuW3J1bl0gPT0gcmwtPm4pCisgICAgICAgICAgICAgICAgaW5kZXhfcnVuW3J1bl0gPSBpOworICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4X2xldmVsW3J1bl0pCisgICAgICAgICAgICAgICAgbWF4X2xldmVsW3J1bl0gPSBsZXZlbDsKKyAgICAgICAgICAgIGlmIChydW4gPiBtYXhfcnVuW2xldmVsXSkKKyAgICAgICAgICAgICAgICBtYXhfcnVuW2xldmVsXSA9IHJ1bjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGljX3N0b3JlKQorICAgICAgICAgICAgcmwtPm1heF9sZXZlbFtsYXN0XSA9IHN0YXRpY19zdG9yZVtsYXN0XTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmwtPm1heF9sZXZlbFtsYXN0XSA9IGF2X21hbGxvYyhNQVhfUlVOICsgMSk7CisgICAgICAgIG1lbWNweShybC0+bWF4X2xldmVsW2xhc3RdLCBtYXhfbGV2ZWwsIE1BWF9SVU4gKyAxKTsKKyAgICAgICAgaWYgKHN0YXRpY19zdG9yZSkKKyAgICAgICAgICAgIHJsLT5tYXhfcnVuW2xhc3RdICAgPSBzdGF0aWNfc3RvcmVbbGFzdF0gKyBNQVhfUlVOICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmwtPm1heF9ydW5bbGFzdF0gICA9IGF2X21hbGxvYyhNQVhfTEVWRUwgKyAxKTsKKyAgICAgICAgbWVtY3B5KHJsLT5tYXhfcnVuW2xhc3RdLCBtYXhfcnVuLCBNQVhfTEVWRUwgKyAxKTsKKyAgICAgICAgaWYgKHN0YXRpY19zdG9yZSkKKyAgICAgICAgICAgIHJsLT5pbmRleF9ydW5bbGFzdF0gPSBzdGF0aWNfc3RvcmVbbGFzdF0gKyBNQVhfUlVOICsgTUFYX0xFVkVMICsgMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmwtPmluZGV4X3J1bltsYXN0XSA9IGF2X21hbGxvYyhNQVhfUlVOICsgMSk7CisgICAgICAgIG1lbWNweShybC0+aW5kZXhfcnVuW2xhc3RdLCBpbmRleF9ydW4sIE1BWF9SVU4gKyAxKTsKKyAgICB9Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9pbml0X3ZsY19ybChSTFRhYmxlICpybCwgdW5zaWduZWQgc3RhdGljX3NpemUpCit7CisgICAgaW50IGksIHE7CisgICAgVkxDX1RZUEUgdGFibGVbMTUwMF1bMl0gPSB7ezB9fTsKKyAgICBWTEMgdmxjID0geyAudGFibGUgPSB0YWJsZSwgLnRhYmxlX2FsbG9jYXRlZCA9IHN0YXRpY19zaXplIH07CisgICAgYXZfYXNzZXJ0MChzdGF0aWNfc2l6ZSA8PSBGRl9BUlJBWV9FTEVNUyh0YWJsZSkpOworICAgIGluaXRfdmxjKCZ2bGMsIDksIHJsLT5uICsgMSwgJnJsLT50YWJsZV92bGNbMF1bMV0sIDQsIDIsICZybC0+dGFibGVfdmxjWzBdWzBdLCA0LCAyLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisKKyAgICBmb3IgKHEgPSAwOyBxIDwgMzI7IHErKykgeworICAgICAgICBpbnQgcW11bCA9IHEgKiAyOworICAgICAgICBpbnQgcWFkZCA9IChxIC0gMSkgfCAxOworCisgICAgICAgIGlmIChxID09IDApIHsKKyAgICAgICAgICAgIHFtdWwgPSAxOworICAgICAgICAgICAgcWFkZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHZsYy50YWJsZV9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjb2RlID0gdmxjLnRhYmxlW2ldWzBdOworICAgICAgICAgICAgaW50IGxlbiAgPSB2bGMudGFibGVbaV1bMV07CisgICAgICAgICAgICBpbnQgbGV2ZWwsIHJ1bjsKKworICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7IC8vIGlsbGVnYWwgY29kZQorICAgICAgICAgICAgICAgIHJ1biAgID0gNjY7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBNQVhfTEVWRUw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA8IDApIHsgLy8gbW9yZSBiaXRzIG5lZWRlZAorICAgICAgICAgICAgICAgIHJ1biAgID0gMDsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGNvZGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjb2RlID09IHJsLT5uKSB7IC8vIGVzYworICAgICAgICAgICAgICAgICAgICBydW4gICA9IDY2OworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9ICAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJ1biAgID0gcmwtPnRhYmxlX3J1bltjb2RlXSArIDE7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gcmwtPnRhYmxlX2xldmVsW2NvZGVdICogcW11bCArIHFhZGQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID49IHJsLT5sYXN0KSBydW4gKz0gMTkyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJsLT5ybF92bGNbcV1baV0ubGVuICAgPSBsZW47CisgICAgICAgICAgICBybC0+cmxfdmxjW3FdW2ldLmxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBybC0+cmxfdmxjW3FdW2ldLnJ1biAgID0gcnVuOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX3VudXNlZF9waWN0dXJlcyhNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIHJlbGVhc2Ugbm9uIHJlZmVyZW5jZSBmcmFtZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BJQ1RVUkVfQ09VTlQ7IGkrKykgeworICAgICAgICBpZiAoIXMtPnBpY3R1cmVbaV0ucmVmZXJlbmNlKQorICAgICAgICAgICAgZmZfbXBlZ191bnJlZl9waWN0dXJlKHMsICZzLT5waWN0dXJlW2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBpY19pc191bnVzZWQoTXBlZ0VuY0NvbnRleHQgKnMsIFBpY3R1cmUgKnBpYykKK3sKKyAgICBpZiAocGljID09IHMtPmxhc3RfcGljdHVyZV9wdHIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghcGljLT5mLT5idWZbMF0pCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChwaWMtPm5lZWRzX3JlYWxsb2MgJiYgIShwaWMtPnJlZmVyZW5jZSAmIERFTEFZRURfUElDX1JFRikpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbmRfdW51c2VkX3BpY3R1cmUoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBzaGFyZWQpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoc2hhcmVkKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUElDVFVSRV9DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXMtPnBpY3R1cmVbaV0uZi0+YnVmWzBdICYmICZzLT5waWN0dXJlW2ldICE9IHMtPmxhc3RfcGljdHVyZV9wdHIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BJQ1RVUkVfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgaWYgKHBpY19pc191bnVzZWQocywgJnMtPnBpY3R1cmVbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRkFUQUwsCisgICAgICAgICAgICJJbnRlcm5hbCBlcnJvciwgcGljdHVyZSBidWZmZXIgb3ZlcmZsb3dcbiIpOworICAgIC8qIFdlIGNvdWxkIHJldHVybiAtMSwgYnV0IHRoZSBjb2RlYyB3b3VsZCBjcmFzaCB0cnlpbmcgdG8gZHJhdyBpbnRvIGEKKyAgICAgKiBub24tZXhpc3RpbmcgZnJhbWUgYW55d2F5LiBUaGlzIGlzIHNhZmVyIHRoYW4gd2FpdGluZyBmb3IgYSByYW5kb20gY3Jhc2guCisgICAgICogQWxzbyB0aGUgcmV0dXJuIG9mIHRoaXMgaXMgbmV2ZXIgdXNlZnVsLCBhbiBlbmNvZGVyIG11c3Qgb25seSBhbGxvY2F0ZQorICAgICAqIGFzIG11Y2ggYXMgYWxsb3dlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbi4gVGhpcyBoYXMgbm8gcmVsYXRpb25zaGlwIHRvIGhvdworICAgICAqIG11Y2ggbGliYXZjb2RlYyBjb3VsZCBhbGxvY2F0ZSAoYW5kIE1BWF9QSUNUVVJFX0NPVU5UIGlzIGFsd2F5cyBsYXJnZQorICAgICAqIGVub3VnaCBmb3Igc3VjaCB2YWxpZCBzdHJlYW1zKS4KKyAgICAgKiBQbHVzLCBhIGRlY29kZXIgaGFzIHRvIGNoZWNrIHN0cmVhbSB2YWxpZGl0eSBhbmQgcmVtb3ZlIGZyYW1lcyBpZiB0b28KKyAgICAgKiBtYW55IHJlZmVyZW5jZSBmcmFtZXMgYXJlIGFyb3VuZC4gV2FpdGluZyBmb3IgIk9PTSIgaXMgbm90IGNvcnJlY3QgYXQKKyAgICAgKiBhbGwuIFNpbWlsYXJseSwgbWlzc2luZyByZWZlcmVuY2UgZnJhbWVzIGhhdmUgdG8gYmUgcmVwbGFjZWQgYnkKKyAgICAgKiBpbnRlcnBvbGF0ZWQvTUMgZnJhbWVzLCBhbnl0aGluZyBlbHNlIGlzIGEgYnVnIGluIHRoZSBjb2RlYyAuLi4KKyAgICAgKi8KKyAgICBhYm9ydCgpOworICAgIHJldHVybiAtMTsKK30KKworaW50IGZmX2ZpbmRfdW51c2VkX3BpY3R1cmUoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBzaGFyZWQpCit7CisgICAgaW50IHJldCA9IGZpbmRfdW51c2VkX3BpY3R1cmUocywgc2hhcmVkKTsKKworICAgIGlmIChyZXQgPj0gMCAmJiByZXQgPCBNQVhfUElDVFVSRV9DT1VOVCkgeworICAgICAgICBpZiAocy0+cGljdHVyZVtyZXRdLm5lZWRzX3JlYWxsb2MpIHsKKyAgICAgICAgICAgIHMtPnBpY3R1cmVbcmV0XS5uZWVkc19yZWFsbG9jID0gMDsKKyAgICAgICAgICAgIGZmX2ZyZWVfcGljdHVyZV90YWJsZXMoJnMtPnBpY3R1cmVbcmV0XSk7CisgICAgICAgICAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgJnMtPnBpY3R1cmVbcmV0XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ3JheV9mcmFtZShBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgaSwgaF9jaHJvbWFfc2hpZnQsIHZfY2hyb21hX3NoaWZ0OworCisgICAgYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUoZnJhbWUtPmZvcm1hdCwgJmhfY2hyb21hX3NoaWZ0LCAmdl9jaHJvbWFfc2hpZnQpOworCisgICAgZm9yKGk9MDsgaTxmcmFtZS0+aGVpZ2h0OyBpKyspCisgICAgICAgIG1lbXNldChmcmFtZS0+ZGF0YVswXSArIGZyYW1lLT5saW5lc2l6ZVswXSppLCAweDgwLCBmcmFtZS0+d2lkdGgpOworICAgIGZvcihpPTA7IGk8RkZfQ0VJTF9SU0hJRlQoZnJhbWUtPmhlaWdodCwgdl9jaHJvbWFfc2hpZnQpOyBpKyspIHsKKyAgICAgICAgbWVtc2V0KGZyYW1lLT5kYXRhWzFdICsgZnJhbWUtPmxpbmVzaXplWzFdKmksCisgICAgICAgICAgICAgICAweDgwLCBGRl9DRUlMX1JTSElGVChmcmFtZS0+d2lkdGgsIGhfY2hyb21hX3NoaWZ0KSk7CisgICAgICAgIG1lbXNldChmcmFtZS0+ZGF0YVsyXSArIGZyYW1lLT5saW5lc2l6ZVsyXSppLAorICAgICAgICAgICAgICAgMHg4MCwgRkZfQ0VJTF9SU0hJRlQoZnJhbWUtPndpZHRoLCBoX2Nocm9tYV9zaGlmdCkpOworICAgIH0KK30KKworLyoqCisgKiBnZW5lcmljIGZ1bmN0aW9uIGNhbGxlZCBhZnRlciBkZWNvZGluZworICogdGhlIGhlYWRlciBhbmQgYmVmb3JlIGEgZnJhbWUgaXMgZGVjb2RlZC4KKyAqLworaW50IGZmX21wdl9mcmFtZV9zdGFydChNcGVnRW5jQ29udGV4dCAqcywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBpLCByZXQ7CisgICAgUGljdHVyZSAqcGljOworICAgIHMtPm1iX3NraXBwZWQgPSAwOworCisgICAgaWYgKCFmZl90aHJlYWRfY2FuX3N0YXJ0X2ZyYW1lKGF2Y3R4KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkF0dGVtcHQgdG8gc3RhcnQgYSBmcmFtZSBvdXRzaWRlIFNFVFVQIHN0YXRlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIG1hcmsgJiByZWxlYXNlIG9sZCBmcmFtZXMgKi8KKyAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CICYmIHMtPmxhc3RfcGljdHVyZV9wdHIgJiYKKyAgICAgICAgcy0+bGFzdF9waWN0dXJlX3B0ciAhPSBzLT5uZXh0X3BpY3R1cmVfcHRyICYmCisgICAgICAgIHMtPmxhc3RfcGljdHVyZV9wdHItPmYtPmJ1ZlswXSkgeworICAgICAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgcy0+bGFzdF9waWN0dXJlX3B0cik7CisgICAgfQorCisgICAgLyogcmVsZWFzZSBmb3Jnb3R0ZW4gcGljdHVyZXMgKi8KKyAgICAvKiBpZiAobXBlZzEyNC9oMjYzKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUElDVFVSRV9DT1VOVDsgaSsrKSB7CisgICAgICAgIGlmICgmcy0+cGljdHVyZVtpXSAhPSBzLT5sYXN0X3BpY3R1cmVfcHRyICYmCisgICAgICAgICAgICAmcy0+cGljdHVyZVtpXSAhPSBzLT5uZXh0X3BpY3R1cmVfcHRyICYmCisgICAgICAgICAgICBzLT5waWN0dXJlW2ldLnJlZmVyZW5jZSAmJiAhcy0+cGljdHVyZVtpXS5uZWVkc19yZWFsbG9jKSB7CisgICAgICAgICAgICBpZiAoIShhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSkKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2luZyB6b21iaWUgcGljdHVyZVxuIik7CisgICAgICAgICAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgJnMtPnBpY3R1cmVbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgZmZfbXBlZ191bnJlZl9waWN0dXJlKHMsICZzLT5jdXJyZW50X3BpY3R1cmUpOworCisgICAgcmVsZWFzZV91bnVzZWRfcGljdHVyZXMocyk7CisKKyAgICBpZiAocy0+Y3VycmVudF9waWN0dXJlX3B0ciAmJiAhcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+YnVmWzBdKSB7CisgICAgICAgIC8vIHdlIGFscmVhZHkgaGF2ZSBhIHVudXNlZCBpbWFnZQorICAgICAgICAvLyAobWF5YmUgaXQgd2FzIHNldCBiZWZvcmUgcmVhZGluZyB0aGUgaGVhZGVyKQorICAgICAgICBwaWMgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGkgICA9IGZmX2ZpbmRfdW51c2VkX3BpY3R1cmUocywgMCk7CisgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJubyBmcmFtZSBidWZmZXIgYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgICAgIHBpYyA9ICZzLT5waWN0dXJlW2ldOworICAgIH0KKworICAgIHBpYy0+cmVmZXJlbmNlID0gMDsKKyAgICBpZiAoIXMtPmRyb3BwYWJsZSkgeworICAgICAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgcGljLT5yZWZlcmVuY2UgPSAzOworICAgIH0KKworICAgIHBpYy0+Zi0+Y29kZWRfcGljdHVyZV9udW1iZXIgPSBzLT5jb2RlZF9waWN0dXJlX251bWJlcisrOworCisgICAgaWYgKGZmX2FsbG9jX3BpY3R1cmUocywgcGljLCAwKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIgPSBwaWM7CisgICAgLy8gRklYTUUgdXNlIG9ubHkgdGhlIHZhcnMgZnJvbSBjdXJyZW50X3BpYworICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnRvcF9maWVsZF9maXJzdCA9IHMtPnRvcF9maWVsZF9maXJzdDsKKyAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzFWSURFTyB8fAorICAgICAgICBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CisgICAgICAgIGlmIChzLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FKQorICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+dG9wX2ZpZWxkX2ZpcnN0ID0KKyAgICAgICAgICAgICAgICAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9UT1BfRklFTEQpID09IHMtPmZpcnN0X2ZpZWxkOworICAgIH0KKyAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5pbnRlcmxhY2VkX2ZyYW1lID0gIXMtPnByb2dyZXNzaXZlX2ZyYW1lICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXMtPnByb2dyZXNzaXZlX3NlcXVlbmNlOworICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmZpZWxkX3BpY3R1cmUgICAgICA9ICBzLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FOworCisgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+cGljdF90eXBlID0gcy0+cGljdF90eXBlOworICAgIC8vIGlmIChzLT5mbGFncyAmJiBDT0RFQ19GTEFHX1FTQ0FMRSkKKyAgICAvLyAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+cXVhbGl0eSA9IHMtPm5ld19waWN0dXJlX3B0ci0+cXVhbGl0eTsKKyAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5rZXlfZnJhbWUgPSBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICBpZiAoKHJldCA9IGZmX21wZWdfcmVmX3BpY3R1cmUocywgJnMtPmN1cnJlbnRfcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0cikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgcy0+bGFzdF9waWN0dXJlX3B0ciA9IHMtPm5leHRfcGljdHVyZV9wdHI7CisgICAgICAgIGlmICghcy0+ZHJvcHBhYmxlKQorICAgICAgICAgICAgcy0+bmV4dF9waWN0dXJlX3B0ciA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHI7CisgICAgfQorICAgIGF2X2Rsb2cocy0+YXZjdHgsICJMJXAgTiVwIEMlcCBMJXAgTiVwIEMlcCB0eXBlOiVkIGRyb3A6JWRcbiIsCisgICAgICAgICAgICBzLT5sYXN0X3BpY3R1cmVfcHRyLCBzLT5uZXh0X3BpY3R1cmVfcHRyLHMtPmN1cnJlbnRfcGljdHVyZV9wdHIsCisgICAgICAgICAgICBzLT5sYXN0X3BpY3R1cmVfcHRyICAgID8gcy0+bGFzdF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVswXSAgICA6IE5VTEwsCisgICAgICAgICAgICBzLT5uZXh0X3BpY3R1cmVfcHRyICAgID8gcy0+bmV4dF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVswXSAgICA6IE5VTEwsCisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyID8gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVswXSA6IE5VTEwsCisgICAgICAgICAgICBzLT5waWN0X3R5cGUsIHMtPmRyb3BwYWJsZSk7CisKKyAgICBpZiAoKCFzLT5sYXN0X3BpY3R1cmVfcHRyIHx8ICFzLT5sYXN0X3BpY3R1cmVfcHRyLT5mLT5idWZbMF0pICYmCisgICAgICAgIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kgfHwKKyAgICAgICAgIHMtPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUUpKSB7CisgICAgICAgIGludCBoX2Nocm9tYV9zaGlmdCwgdl9jaHJvbWFfc2hpZnQ7CisgICAgICAgIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKHMtPmF2Y3R4LT5waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9jaHJvbWFfc2hpZnQsICZ2X2Nocm9tYV9zaGlmdCk7CisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgcy0+bmV4dF9waWN0dXJlX3B0ciAmJiBzLT5uZXh0X3BpY3R1cmVfcHRyLT5mLT5idWZbMF0pCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAiYWxsb2NhdGluZyBkdW1teSBsYXN0IHBpY3R1cmUgZm9yIEIgZnJhbWVcbiIpOworICAgICAgICBlbHNlIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAid2FybmluZzogZmlyc3QgZnJhbWUgaXMgbm8ga2V5ZnJhbWVcbiIpOworICAgICAgICBlbHNlIGlmIChzLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgImFsbG9jYXRlIGR1bW15IGxhc3QgcGljdHVyZSBmb3IgZmllbGQgYmFzZWQgZmlyc3Qga2V5ZnJhbWVcbiIpOworCisgICAgICAgIC8qIEFsbG9jYXRlIGEgZHVtbXkgZnJhbWUgKi8KKyAgICAgICAgaSA9IGZmX2ZpbmRfdW51c2VkX3BpY3R1cmUocywgMCk7CisgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJubyBmcmFtZSBidWZmZXIgYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgICAgIHMtPmxhc3RfcGljdHVyZV9wdHIgPSAmcy0+cGljdHVyZVtpXTsKKworICAgICAgICBzLT5sYXN0X3BpY3R1cmVfcHRyLT5yZWZlcmVuY2UgICA9IDM7CisgICAgICAgIHMtPmxhc3RfcGljdHVyZV9wdHItPmYtPmtleV9mcmFtZSA9IDA7CisgICAgICAgIHMtPmxhc3RfcGljdHVyZV9wdHItPmYtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworCisgICAgICAgIGlmIChmZl9hbGxvY19waWN0dXJlKHMsIHMtPmxhc3RfcGljdHVyZV9wdHIsIDApIDwgMCkgeworICAgICAgICAgICAgcy0+bGFzdF9waWN0dXJlX3B0ciA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWF2Y3R4LT5od2FjY2VsICYmICEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMmQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpKSB7CisgICAgICAgICAgICBmb3IoaT0wOyBpPGF2Y3R4LT5oZWlnaHQ7IGkrKykKKyAgICAgICAgICAgICAgICBtZW1zZXQocy0+bGFzdF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVswXSArIHMtPmxhc3RfcGljdHVyZV9wdHItPmYtPmxpbmVzaXplWzBdKmksCisgICAgICAgICAgICAgICAgICAgICAgIDB4ODAsIGF2Y3R4LT53aWR0aCk7CisgICAgICAgICAgICBmb3IoaT0wOyBpPEZGX0NFSUxfUlNISUZUKGF2Y3R4LT5oZWlnaHQsIHZfY2hyb21hX3NoaWZ0KTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmxhc3RfcGljdHVyZV9wdHItPmYtPmRhdGFbMV0gKyBzLT5sYXN0X3BpY3R1cmVfcHRyLT5mLT5saW5lc2l6ZVsxXSppLAorICAgICAgICAgICAgICAgICAgICAgICAweDgwLCBGRl9DRUlMX1JTSElGVChhdmN0eC0+d2lkdGgsIGhfY2hyb21hX3NoaWZ0KSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmxhc3RfcGljdHVyZV9wdHItPmYtPmRhdGFbMl0gKyBzLT5sYXN0X3BpY3R1cmVfcHRyLT5mLT5saW5lc2l6ZVsyXSppLAorICAgICAgICAgICAgICAgICAgICAgICAweDgwLCBGRl9DRUlMX1JTSElGVChhdmN0eC0+d2lkdGgsIGhfY2hyb21hX3NoaWZ0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZMVjEgfHwgcy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2Myl7CisgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxhdmN0eC0+aGVpZ2h0OyBpKyspCisgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmxhc3RfcGljdHVyZV9wdHItPmYtPmRhdGFbMF0gKyBzLT5sYXN0X3BpY3R1cmVfcHRyLT5mLT5saW5lc2l6ZVswXSppLCAxNiwgYXZjdHgtPndpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPmxhc3RfcGljdHVyZV9wdHItPnRmLCBJTlRfTUFYLCAwKTsKKyAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmcy0+bGFzdF9waWN0dXJlX3B0ci0+dGYsIElOVF9NQVgsIDEpOworICAgIH0KKyAgICBpZiAoKCFzLT5uZXh0X3BpY3R1cmVfcHRyIHx8ICFzLT5uZXh0X3BpY3R1cmVfcHRyLT5mLT5idWZbMF0pICYmCisgICAgICAgIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICAvKiBBbGxvY2F0ZSBhIGR1bW15IGZyYW1lICovCisgICAgICAgIGkgPSBmZl9maW5kX3VudXNlZF9waWN0dXJlKHMsIDApOworICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibm8gZnJhbWUgYnVmZmVyIGF2YWlsYWJsZVxuIik7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICBzLT5uZXh0X3BpY3R1cmVfcHRyID0gJnMtPnBpY3R1cmVbaV07CisKKyAgICAgICAgcy0+bmV4dF9waWN0dXJlX3B0ci0+cmVmZXJlbmNlICAgPSAzOworICAgICAgICBzLT5uZXh0X3BpY3R1cmVfcHRyLT5mLT5rZXlfZnJhbWUgPSAwOworICAgICAgICBzLT5uZXh0X3BpY3R1cmVfcHRyLT5mLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKworICAgICAgICBpZiAoZmZfYWxsb2NfcGljdHVyZShzLCBzLT5uZXh0X3BpY3R1cmVfcHRyLCAwKSA8IDApIHsKKyAgICAgICAgICAgIHMtPm5leHRfcGljdHVyZV9wdHIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPm5leHRfcGljdHVyZV9wdHItPnRmLCBJTlRfTUFYLCAwKTsKKyAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmcy0+bmV4dF9waWN0dXJlX3B0ci0+dGYsIElOVF9NQVgsIDEpOworICAgIH0KKworI2lmIDAgLy8gQlVGUkVGLUZJWE1FCisgICAgbWVtc2V0KHMtPmxhc3RfcGljdHVyZS5mLT5kYXRhLCAwLCBzaXplb2Yocy0+bGFzdF9waWN0dXJlLmYtPmRhdGEpKTsKKyAgICBtZW1zZXQocy0+bmV4dF9waWN0dXJlLmYtPmRhdGEsIDAsIHNpemVvZihzLT5uZXh0X3BpY3R1cmUuZi0+ZGF0YSkpOworI2VuZGlmCisgICAgaWYgKHMtPmxhc3RfcGljdHVyZV9wdHIpIHsKKyAgICAgICAgZmZfbXBlZ191bnJlZl9waWN0dXJlKHMsICZzLT5sYXN0X3BpY3R1cmUpOworICAgICAgICBpZiAocy0+bGFzdF9waWN0dXJlX3B0ci0+Zi0+YnVmWzBdICYmCisgICAgICAgICAgICAocmV0ID0gZmZfbXBlZ19yZWZfcGljdHVyZShzLCAmcy0+bGFzdF9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9waWN0dXJlX3B0cikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChzLT5uZXh0X3BpY3R1cmVfcHRyKSB7CisgICAgICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLCAmcy0+bmV4dF9waWN0dXJlKTsKKyAgICAgICAgaWYgKHMtPm5leHRfcGljdHVyZV9wdHItPmYtPmJ1ZlswXSAmJgorICAgICAgICAgICAgKHJldCA9IGZmX21wZWdfcmVmX3BpY3R1cmUocywgJnMtPm5leHRfcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5leHRfcGljdHVyZV9wdHIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGF2X2Fzc2VydDAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JIHx8IChzLT5sYXN0X3BpY3R1cmVfcHRyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9waWN0dXJlX3B0ci0+Zi0+YnVmWzBdKSk7CisKKyAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUhPSBQSUNUX0ZSQU1FKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpIHsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVtpXSArPQorICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbaV0gKj0gMjsKKyAgICAgICAgICAgIHMtPmxhc3RfcGljdHVyZS5mLT5saW5lc2l6ZVtpXSAgICAqPSAyOworICAgICAgICAgICAgcy0+bmV4dF9waWN0dXJlLmYtPmxpbmVzaXplW2ldICAgICo9IDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5lcnJfcmVjb2duaXRpb24gPSBhdmN0eC0+ZXJyX3JlY29nbml0aW9uOworCisgICAgLyogc2V0IGRlcXVhbnRpemVyLCB3ZSBjYW4ndCBkbyBpdCBkdXJpbmcgaW5pdCBhcworICAgICAqIGl0IG1pZ2h0IGNoYW5nZSBmb3IgbXBlZzQgYW5kIHdlIGNhbid0IGRvIGl0IGluIHRoZSBoZWFkZXIKKyAgICAgKiBkZWNvZGUgYXMgaW5pdCBpcyBub3QgY2FsbGVkIGZvciBtcGVnNCB0aGVyZSB5ZXQgKi8KKyAgICBpZiAocy0+bXBlZ19xdWFudCB8fCBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CisgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2ludHJhID0gcy0+ZGN0X3VucXVhbnRpemVfbXBlZzJfaW50cmE7CisgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2ludGVyID0gcy0+ZGN0X3VucXVhbnRpemVfbXBlZzJfaW50ZXI7CisgICAgfSBlbHNlIGlmIChzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzIHx8IHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjEpIHsKKyAgICAgICAgcy0+ZGN0X3VucXVhbnRpemVfaW50cmEgPSBzLT5kY3RfdW5xdWFudGl6ZV9oMjYzX2ludHJhOworICAgICAgICBzLT5kY3RfdW5xdWFudGl6ZV9pbnRlciA9IHMtPmRjdF91bnF1YW50aXplX2gyNjNfaW50ZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+ZGN0X3VucXVhbnRpemVfaW50cmEgPSBzLT5kY3RfdW5xdWFudGl6ZV9tcGVnMV9pbnRyYTsKKyAgICAgICAgcy0+ZGN0X3VucXVhbnRpemVfaW50ZXIgPSBzLT5kY3RfdW5xdWFudGl6ZV9tcGVnMV9pbnRlcjsKKyAgICB9CisKKyAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfTk9NQykgeworICAgICAgICBncmF5X2ZyYW1lKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiBjYWxsZWQgYWZ0ZXIgYSBmcmFtZSBoYXMgYmVlbiBkZWNvZGVkLiAqLwordm9pZCBmZl9tcHZfZnJhbWVfZW5kKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGVtbXNfYygpOworCisgICAgaWYgKHMtPmN1cnJlbnRfcGljdHVyZS5yZWZlcmVuY2UpCisgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPmN1cnJlbnRfcGljdHVyZV9wdHItPnRmLCBJTlRfTUFYLCAwKTsKK30KKworCisjaWYgRkZfQVBJX1ZJU01WCitzdGF0aWMgaW50IGNsaXBfbGluZShpbnQgKnN4LCBpbnQgKnN5LCBpbnQgKmV4LCBpbnQgKmV5LCBpbnQgbWF4eCkKK3sKKyAgICBpZigqc3ggPiAqZXgpCisgICAgICAgIHJldHVybiBjbGlwX2xpbmUoZXgsIGV5LCBzeCwgc3ksIG1heHgpOworCisgICAgaWYgKCpzeCA8IDApIHsKKyAgICAgICAgaWYgKCpleCA8IDApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgKnN5ID0gKmV5ICsgKCpzeSAtICpleSkgKiAoaW50NjRfdCkqZXggLyAoKmV4IC0gKnN4KTsKKyAgICAgICAgKnN4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKmV4ID4gbWF4eCkgeworICAgICAgICBpZiAoKnN4ID4gbWF4eCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAqZXkgPSAqc3kgKyAoKmV5IC0gKnN5KSAqIChpbnQ2NF90KShtYXh4IC0gKnN4KSAvICgqZXggLSAqc3gpOworICAgICAgICAqZXggPSBtYXh4OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIERyYXcgYSBsaW5lIGZyb20gKGV4LCBleSkgLT4gKHN4LCBzeSkuCisgKiBAcGFyYW0gdyB3aWR0aCBvZiB0aGUgaW1hZ2UKKyAqIEBwYXJhbSBoIGhlaWdodCBvZiB0aGUgaW1hZ2UKKyAqIEBwYXJhbSBzdHJpZGUgc3RyaWRlL2xpbmVzaXplIG9mIHRoZSBpbWFnZQorICogQHBhcmFtIGNvbG9yIGNvbG9yIG9mIHRoZSBhcnJvdworICovCitzdGF0aWMgdm9pZCBkcmF3X2xpbmUodWludDhfdCAqYnVmLCBpbnQgc3gsIGludCBzeSwgaW50IGV4LCBpbnQgZXksCisgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlLCBpbnQgY29sb3IpCit7CisgICAgaW50IHgsIHksIGZyLCBmOworCisgICAgaWYgKGNsaXBfbGluZSgmc3gsICZzeSwgJmV4LCAmZXksIHcgLSAxKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChjbGlwX2xpbmUoJnN5LCAmc3gsICZleSwgJmV4LCBoIC0gMSkpCisgICAgICAgIHJldHVybjsKKworICAgIHN4ID0gYXZfY2xpcChzeCwgMCwgdyAtIDEpOworICAgIHN5ID0gYXZfY2xpcChzeSwgMCwgaCAtIDEpOworICAgIGV4ID0gYXZfY2xpcChleCwgMCwgdyAtIDEpOworICAgIGV5ID0gYXZfY2xpcChleSwgMCwgaCAtIDEpOworCisgICAgYnVmW3N5ICogc3RyaWRlICsgc3hdICs9IGNvbG9yOworCisgICAgaWYgKEZGQUJTKGV4IC0gc3gpID4gRkZBQlMoZXkgLSBzeSkpIHsKKyAgICAgICAgaWYgKHN4ID4gZXgpIHsKKyAgICAgICAgICAgIEZGU1dBUChpbnQsIHN4LCBleCk7CisgICAgICAgICAgICBGRlNXQVAoaW50LCBzeSwgZXkpOworICAgICAgICB9CisgICAgICAgIGJ1ZiArPSBzeCArIHN5ICogc3RyaWRlOworICAgICAgICBleCAgLT0gc3g7CisgICAgICAgIGYgICAgPSAoKGV5IC0gc3kpIDw8IDE2KSAvIGV4OworICAgICAgICBmb3IgKHggPSAwOyB4IDw9IGV4OyB4KyspIHsKKyAgICAgICAgICAgIHkgID0gKHggKiBmKSA+PiAxNjsKKyAgICAgICAgICAgIGZyID0gKHggKiBmKSAmIDB4RkZGRjsKKyAgICAgICAgICAgIGJ1Zlt5ICogc3RyaWRlICsgeF0gICAgICAgKz0gKGNvbG9yICogKDB4MTAwMDAgLSBmcikpID4+IDE2OworICAgICAgICAgICAgaWYoZnIpIGJ1ZlsoeSArIDEpICogc3RyaWRlICsgeF0gKz0gKGNvbG9yICogICAgICAgICAgICBmciApID4+IDE2OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN5ID4gZXkpIHsKKyAgICAgICAgICAgIEZGU1dBUChpbnQsIHN4LCBleCk7CisgICAgICAgICAgICBGRlNXQVAoaW50LCBzeSwgZXkpOworICAgICAgICB9CisgICAgICAgIGJ1ZiArPSBzeCArIHN5ICogc3RyaWRlOworICAgICAgICBleSAgLT0gc3k7CisgICAgICAgIGlmIChleSkKKyAgICAgICAgICAgIGYgPSAoKGV4IC0gc3gpIDw8IDE2KSAvIGV5OworICAgICAgICBlbHNlCisgICAgICAgICAgICBmID0gMDsKKyAgICAgICAgZm9yKHk9IDA7IHkgPD0gZXk7IHkrKyl7CisgICAgICAgICAgICB4ICA9ICh5KmYpID4+IDE2OworICAgICAgICAgICAgZnIgPSAoeSpmKSAmIDB4RkZGRjsKKyAgICAgICAgICAgIGJ1Zlt5ICogc3RyaWRlICsgeF0gICAgICs9IChjb2xvciAqICgweDEwMDAwIC0gZnIpKSA+PiAxNjsKKyAgICAgICAgICAgIGlmKGZyKSBidWZbeSAqIHN0cmlkZSArIHggKyAxXSArPSAoY29sb3IgKiAgICAgICAgICAgIGZyICkgPj4gMTY7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRHJhdyBhbiBhcnJvdyBmcm9tIChleCwgZXkpIC0+IChzeCwgc3kpLgorICogQHBhcmFtIHcgd2lkdGggb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gaCBoZWlnaHQgb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gc3RyaWRlIHN0cmlkZS9saW5lc2l6ZSBvZiB0aGUgaW1hZ2UKKyAqIEBwYXJhbSBjb2xvciBjb2xvciBvZiB0aGUgYXJyb3cKKyAqLworc3RhdGljIHZvaWQgZHJhd19hcnJvdyh1aW50OF90ICpidWYsIGludCBzeCwgaW50IHN5LCBpbnQgZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBleSwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlLCBpbnQgY29sb3IsIGludCB0YWlsLCBpbnQgZGlyZWN0aW9uKQoreworICAgIGludCBkeCxkeTsKKworICAgIGlmIChkaXJlY3Rpb24pIHsKKyAgICAgICAgRkZTV0FQKGludCwgc3gsIGV4KTsKKyAgICAgICAgRkZTV0FQKGludCwgc3ksIGV5KTsKKyAgICB9CisKKyAgICBzeCA9IGF2X2NsaXAoc3gsIC0xMDAsIHcgKyAxMDApOworICAgIHN5ID0gYXZfY2xpcChzeSwgLTEwMCwgaCArIDEwMCk7CisgICAgZXggPSBhdl9jbGlwKGV4LCAtMTAwLCB3ICsgMTAwKTsKKyAgICBleSA9IGF2X2NsaXAoZXksIC0xMDAsIGggKyAxMDApOworCisgICAgZHggPSBleCAtIHN4OworICAgIGR5ID0gZXkgLSBzeTsKKworICAgIGlmIChkeCAqIGR4ICsgZHkgKiBkeSA+IDMgKiAzKSB7CisgICAgICAgIGludCByeCA9ICBkeCArIGR5OworICAgICAgICBpbnQgcnkgPSAtZHggKyBkeTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGZmX3NxcnQoKHJ4ICogcnggKyByeSAqIHJ5KSA8PCA4KTsKKworICAgICAgICAvLyBGSVhNRSBzdWJwaXhlbCBhY2N1cmFjeQorICAgICAgICByeCA9IFJPVU5ERURfRElWKHJ4ICogMyA8PCA0LCBsZW5ndGgpOworICAgICAgICByeSA9IFJPVU5ERURfRElWKHJ5ICogMyA8PCA0LCBsZW5ndGgpOworCisgICAgICAgIGlmICh0YWlsKSB7CisgICAgICAgICAgICByeCA9IC1yeDsKKyAgICAgICAgICAgIHJ5ID0gLXJ5OworICAgICAgICB9CisKKyAgICAgICAgZHJhd19saW5lKGJ1Ziwgc3gsIHN5LCBzeCArIHJ4LCBzeSArIHJ5LCB3LCBoLCBzdHJpZGUsIGNvbG9yKTsKKyAgICAgICAgZHJhd19saW5lKGJ1Ziwgc3gsIHN5LCBzeCAtIHJ5LCBzeSArIHJ4LCB3LCBoLCBzdHJpZGUsIGNvbG9yKTsKKyAgICB9CisgICAgZHJhd19saW5lKGJ1Ziwgc3gsIHN5LCBleCwgZXksIHcsIGgsIHN0cmlkZSwgY29sb3IpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYWRkX21iKEFWTW90aW9uVmVjdG9yICptYiwgdWludDMyX3QgbWJfdHlwZSwKKyAgICAgICAgICAgICAgICAgIGludCBkc3RfeCwgaW50IGRzdF95LAorICAgICAgICAgICAgICAgICAgaW50IHNyY194LCBpbnQgc3JjX3ksCisgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQoreworICAgIGlmIChkc3RfeCA9PSBzcmNfeCAmJiBkc3RfeSA9PSBzcmNfeSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbWItPncgPSBJU184WDgobWJfdHlwZSkgfHwgSVNfOFgxNihtYl90eXBlKSA/IDggOiAxNjsKKyAgICBtYi0+aCA9IElTXzhYOChtYl90eXBlKSB8fCBJU18xNlg4KG1iX3R5cGUpID8gOCA6IDE2OworICAgIG1iLT5zcmNfeCA9IHNyY194OworICAgIG1iLT5zcmNfeSA9IHNyY195OworICAgIG1iLT5kc3RfeCA9IGRzdF94OworICAgIG1iLT5kc3RfeSA9IGRzdF95OworICAgIG1iLT5zb3VyY2UgPSBkaXJlY3Rpb24gPyAxIDogLTE7CisgICAgbWItPmZsYWdzID0gMDsgLy8gWFhYOiBkb2VzIG1iX3R5cGUgY29udGFpbiBleHRyYSBpbmZvcm1hdGlvbiB0aGF0IGNvdWxkIGJlIGV4cG9ydGVkIGhlcmU/CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogUHJpbnQgZGVidWdnaW5nIGluZm8gZm9yIHRoZSBnaXZlbiBwaWN0dXJlLgorICovCit2b2lkIGZmX3ByaW50X2RlYnVnX2luZm8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcGljdCwgdWludDhfdCAqbWJza2lwX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICptYnR5cGVfdGFibGUsIGludDhfdCAqcXNjYWxlX3RhYmxlLCBpbnQxNl90ICgqbW90aW9uX3ZhbFsyXSlbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsb3dfZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3dpZHRoLCBpbnQgbWJfaGVpZ2h0LCBpbnQgbWJfc3RyaWRlLCBpbnQgcXVhcnRlcl9zYW1wbGUpCit7CisgICAgaWYgKChhdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfRVhQT1JUX01WUykgJiYgbWJ0eXBlX3RhYmxlICYmIG1vdGlvbl92YWxbMF0pIHsKKyAgICAgICAgY29uc3QgaW50IHNoaWZ0ID0gMSArIHF1YXJ0ZXJfc2FtcGxlOworICAgICAgICBjb25zdCBpbnQgbXZfc2FtcGxlX2xvZzIgPSBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fCBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1ZRMyA/IDIgOiAxOworICAgICAgICBjb25zdCBpbnQgbXZfc3RyaWRlICAgICAgPSAobWJfd2lkdGggPDwgbXZfc2FtcGxlX2xvZzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfSDI2NCA/IDAgOiAxKTsKKyAgICAgICAgaW50IG1iX3gsIG1iX3ksIG1iY291bnQgPSAwOworCisgICAgICAgIC8qIHNpemUgaXMgd2lkdGggKiBoZWlnaHQgKiAyICogNCB3aGVyZSAyIGlzIGZvciBkaXJlY3Rpb25zIGFuZCA0IGlzCisgICAgICAgICAqIGZvciB0aGUgbWF4aW11bSBudW1iZXIgb2YgTUIgKDQgTUIgaW4gY2FzZSBvZiBJU184eDgpICovCisgICAgICAgIEFWTW90aW9uVmVjdG9yICptdnMgPSBhdl9tYWxsb2NfYXJyYXkobWJfd2lkdGggKiBtYl9oZWlnaHQsIDIgKiA0ICogc2l6ZW9mKEFWTW90aW9uVmVjdG9yKSk7CisgICAgICAgIGlmICghbXZzKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBtYl9oZWlnaHQ7IG1iX3krKykgeworICAgICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IG1iX3dpZHRoOyBtYl94KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaSwgZGlyZWN0aW9uLCBtYl90eXBlID0gbWJ0eXBlX3RhYmxlW21iX3ggKyBtYl95ICogbWJfc3RyaWRlXTsKKyAgICAgICAgICAgICAgICBmb3IgKGRpcmVjdGlvbiA9IDA7IGRpcmVjdGlvbiA8IDI7IGRpcmVjdGlvbisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghVVNFU19MSVNUKG1iX3R5cGUsIGRpcmVjdGlvbikpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElTXzhYOChtYl90eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeCA9IG1iX3ggKiAxNiArIDQgKyA4ICogKGkgJiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3kgPSBtYl95ICogMTYgKyA0ICsgOCAqIChpID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4eSA9IChtYl94ICogMiArIChpICYgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWJfeSAqIDIgKyAoaSA+PiAxKSkgKiBtdl9zdHJpZGUpIDw8IChtdl9zYW1wbGVfbG9nMiAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteCA9IChtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzBdID4+IHNoaWZ0KSArIHN4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteSA9IChtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdID4+IHNoaWZ0KSArIHN5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iY291bnQgKz0gYWRkX21iKG12cyArIG1iY291bnQsIG1iX3R5cGUsIHN4LCBzeSwgbXgsIG15LCBkaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTXzE2WDgobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ggPSBtYl94ICogMTYgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeSA9IG1iX3kgKiAxNiArIDQgKyA4ICogaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHkgPSAobWJfeCAqIDIgKyAobWJfeSAqIDIgKyBpKSAqIG12X3N0cmlkZSkgPDwgKG12X3NhbXBsZV9sb2cyIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14ID0gKG1vdGlvbl92YWxbZGlyZWN0aW9uXVt4eV1bMF0gPj4gc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteSA9IChtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdID4+IHNoaWZ0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJU19JTlRFUkxBQ0VEKG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAqPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJjb3VudCArPSBhZGRfbWIobXZzICsgbWJjb3VudCwgbWJfdHlwZSwgc3gsIHN5LCBteCArIHN4LCBteSArIHN5LCBkaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTXzhYMTYobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ggPSBtYl94ICogMTYgKyA0ICsgOCAqIGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5ID0gbWJfeSAqIDE2ICsgODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHkgPSAobWJfeCAqIDIgKyBpICsgbWJfeSAqIDIgKiBtdl9zdHJpZGUpIDw8IChtdl9zYW1wbGVfbG9nMiAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteCA9IG1vdGlvbl92YWxbZGlyZWN0aW9uXVt4eV1bMF0gPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG15ID0gbW90aW9uX3ZhbFtkaXJlY3Rpb25dW3h5XVsxXSA+PiBzaGlmdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJU19JTlRFUkxBQ0VEKG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAqPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJjb3VudCArPSBhZGRfbWIobXZzICsgbWJjb3VudCwgbWJfdHlwZSwgc3gsIHN5LCBteCArIHN4LCBteSArIHN5LCBkaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ggPSBtYl94ICogMTYgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3kgPSBtYl95ICogMTYgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHkgPSAobWJfeCArIG1iX3kgKiBtdl9zdHJpZGUpIDw8IG12X3NhbXBsZV9sb2cyOworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXggPSAobW90aW9uX3ZhbFtkaXJlY3Rpb25dW3h5XVswXT4+c2hpZnQpICsgc3g7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteSA9IChtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdPj5zaGlmdCkgKyBzeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWJjb3VudCArPSBhZGRfbWIobXZzICsgbWJjb3VudCwgbWJfdHlwZSwgc3gsIHN5LCBteCwgbXksIGRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobWJjb3VudCkgeworICAgICAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZDsKKworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJBZGRpbmcgJWQgTVZzIGluZm8gdG8gZnJhbWUgJWRcbiIsIG1iY291bnQsIGF2Y3R4LT5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgc2QgPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKHBpY3QsIEFWX0ZSQU1FX0RBVEFfTU9USU9OX1ZFQ1RPUlMsIG1iY291bnQgKiBzaXplb2YoQVZNb3Rpb25WZWN0b3IpKTsKKyAgICAgICAgICAgIGlmICghc2QpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgbWVtY3B5KHNkLT5kYXRhLCBtdnMsIG1iY291bnQgKiBzaXplb2YoQVZNb3Rpb25WZWN0b3IpKTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyZWVwKCZtdnMpOworICAgIH0KKworICAgIC8qIFRPRE86IGV4cG9ydCBhbGwgdGhlIGZvbGxvd2luZyB0byBtYWtlIHRoZW0gYWNjZXNzaWJsZSBmb3IgdXNlcnMgKGFuZCBmaWx0ZXJzKSAqLworICAgIGlmIChhdmN0eC0+aHdhY2NlbCB8fCAhbWJ0eXBlX3RhYmxlCisgICAgICAgIHx8IChhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyZDT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVSkpCisgICAgICAgIHJldHVybjsKKworCisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIChGRl9ERUJVR19TS0lQIHwgRkZfREVCVUdfUVAgfCBGRl9ERUJVR19NQl9UWVBFKSkgeworICAgICAgICBpbnQgeCx5OworCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiTmV3IGZyYW1lLCB0eXBlOiAlY1xuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihwaWN0LT5waWN0X3R5cGUpKTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IG1iX2hlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbWJfd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19TS0lQKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1ic2tpcF90YWJsZVt4ICsgeSAqIG1iX3N0cmlkZV07CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDk7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiJTFkIiwgY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUVApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIlMmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcXNjYWxlX3RhYmxlW3ggKyB5ICogbWJfc3RyaWRlXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19NQl9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlID0gbWJ0eXBlX3RhYmxlW3ggKyB5ICogbWJfc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVHlwZSAmIE1WIGRpcmVjdGlvbgorICAgICAgICAgICAgICAgICAgICBpZiAoSVNfUENNKG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJQIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTX0lOVFJBKG1iX3R5cGUpICYmIElTX0FDUFJFRChtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiQSIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU19JTlRSQTR4NChtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiaSIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU19JTlRSQTE2eDE2KG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJJIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTX0RJUkVDVChtYl90eXBlKSAmJiBJU19TS0lQKG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJkIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTX0RJUkVDVChtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRCIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU19HTUMobWJfdHlwZSkgJiYgSVNfU0tJUChtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZyIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU19HTUMobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkciKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNfU0tJUChtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUyIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghVVNFU19MSVNUKG1iX3R5cGUsIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICI+Iik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFVU0VTX0xJU1QobWJfdHlwZSwgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIjwiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKFVTRVNfTElTVChtYl90eXBlLCAwKSAmJiBVU0VTX0xJU1QobWJfdHlwZSwgMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJYIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzZWdtZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKElTXzhYOChtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiKyIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU18xNlg4KG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICItIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTXzhYMTYobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInwiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNfSU5UUkEobWJfdHlwZSkgfHwgSVNfMTZYMTYobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICI/Iik7CisKKworICAgICAgICAgICAgICAgICAgICBpZiAoSVNfSU5URVJMQUNFRChtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGF2Y3R4LT5kZWJ1ZyAmIChGRl9ERUJVR19WSVNfUVAgfCBGRl9ERUJVR19WSVNfTUJfVFlQRSkpIHx8CisgICAgICAgIChhdmN0eC0+ZGVidWdfbXYpKSB7CisgICAgICAgIGludCBtYl95OworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGhfY2hyb21hX3NoaWZ0LCB2X2Nocm9tYV9zaGlmdCwgYmxvY2tfaGVpZ2h0OworI2lmIEZGX0FQSV9WSVNNVgorICAgICAgICBjb25zdCBpbnQgc2hpZnQgPSAxICsgcXVhcnRlcl9zYW1wbGU7CisgICAgICAgIHVpbnQ4X3QgKnB0cjsKKyAgICAgICAgY29uc3QgaW50IHdpZHRoICAgICAgICAgID0gYXZjdHgtPndpZHRoOworICAgICAgICBjb25zdCBpbnQgaGVpZ2h0ICAgICAgICAgPSBhdmN0eC0+aGVpZ2h0OworI2VuZGlmCisgICAgICAgIGNvbnN0IGludCBtdl9zYW1wbGVfbG9nMiA9IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TVlEzID8gMiA6IDE7CisgICAgICAgIGNvbnN0IGludCBtdl9zdHJpZGUgICAgICA9IChtYl93aWR0aCA8PCBtdl9zYW1wbGVfbG9nMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ID8gMCA6IDEpOworCisgICAgICAgICpsb3dfZGVsYXkgPSAwOyAvLyBuZWVkZWQgdG8gc2VlIHRoZSB2ZWN0b3JzIHdpdGhvdXQgdHJhc2hpbmcgdGhlIGJ1ZmZlcnMKKworICAgICAgICBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmN0eC0+cGl4X2ZtdCwgJmhfY2hyb21hX3NoaWZ0LCAmdl9jaHJvbWFfc2hpZnQpOworCisgICAgICAgIGF2X2ZyYW1lX21ha2Vfd3JpdGFibGUocGljdCk7CisKKyAgICAgICAgcGljdC0+b3BhcXVlID0gTlVMTDsKKyNpZiBGRl9BUElfVklTTVYKKyAgICAgICAgcHRyICAgICAgICAgID0gcGljdC0+ZGF0YVswXTsKKyNlbmRpZgorICAgICAgICBibG9ja19oZWlnaHQgPSAxNiA+PiB2X2Nocm9tYV9zaGlmdDsKKworICAgICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgbWJfaGVpZ2h0OyBtYl95KyspIHsKKyAgICAgICAgICAgIGludCBtYl94OworICAgICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IG1iX3dpZHRoOyBtYl94KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWJfaW5kZXggPSBtYl94ICsgbWJfeSAqIG1iX3N0cmlkZTsKKyNpZiBGRl9BUElfVklTTVYKKyAgICAgICAgICAgICAgICBpZiAoKGF2Y3R4LT5kZWJ1Z19tdikgJiYgbW90aW9uX3ZhbFswXSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh0eXBlID0gMDsgdHlwZSA8IDM7IHR5cGUrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCEoYXZjdHgtPmRlYnVnX212ICYgRkZfREVCVUdfVklTX01WX1BfRk9SKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBpY3QtPnBpY3RfdHlwZSE9IEFWX1BJQ1RVUkVfVFlQRV9QKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCEoYXZjdHgtPmRlYnVnX212ICYgRkZfREVCVUdfVklTX01WX0JfRk9SKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBpY3QtPnBpY3RfdHlwZSE9IEFWX1BJQ1RVUkVfVFlQRV9CKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCEoYXZjdHgtPmRlYnVnX212ICYgRkZfREVCVUdfVklTX01WX0JfQkFDSykpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwaWN0LT5waWN0X3R5cGUhPSBBVl9QSUNUVVJFX1RZUEVfQikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVVTRVNfTElTVChtYnR5cGVfdGFibGVbbWJfaW5kZXhdLCBkaXJlY3Rpb24pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSVNfOFg4KG1idHlwZV90YWJsZVttYl9pbmRleF0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ggPSBtYl94ICogMTYgKyA0ICsgOCAqIChpICYgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeSA9IG1iX3kgKiAxNiArIDQgKyA4ICogKGkgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4eSA9IChtYl94ICogMiArIChpICYgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1iX3kgKiAyICsgKGkgPj4gMSkpICogbXZfc3RyaWRlKSA8PCAobXZfc2FtcGxlX2xvZzIgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14ID0gKG1vdGlvbl92YWxbZGlyZWN0aW9uXVt4eV1bMF0gPj4gc2hpZnQpICsgc3g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteSA9IChtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdID4+IHNoaWZ0KSArIHN5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2Fycm93KHB0ciwgc3gsIHN5LCBteCwgbXksIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcGljdC0+bGluZXNpemVbMF0sIDEwMCwgMCwgZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTXzE2WDgobWJ0eXBlX3RhYmxlW21iX2luZGV4XSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeCA9IG1iX3ggKiAxNiArIDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeSA9IG1iX3kgKiAxNiArIDQgKyA4ICogaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHh5ID0gKG1iX3ggKiAyICsgKG1iX3kgKiAyICsgaSkgKiBtdl9zdHJpZGUpIDw8IChtdl9zYW1wbGVfbG9nMiAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXggPSAobW90aW9uX3ZhbFtkaXJlY3Rpb25dW3h5XVswXSA+PiBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteSA9IChtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdID4+IHNoaWZ0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSVNfSU5URVJMQUNFRChtYnR5cGVfdGFibGVbbWJfaW5kZXhdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICo9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19hcnJvdyhwdHIsIHN4LCBzeSwgbXggKyBzeCwgbXkgKyBzeSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwaWN0LT5saW5lc2l6ZVswXSwgMTAwLCAwLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfOFgxNihtYnR5cGVfdGFibGVbbWJfaW5kZXhdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN4ID0gbWJfeCAqIDE2ICsgNCArIDggKiBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3kgPSBtYl95ICogMTYgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHkgPSAobWJfeCAqIDIgKyBpICsgbWJfeSAqIDIgKiBtdl9zdHJpZGUpIDw8IChtdl9zYW1wbGVfbG9nMiAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXggPSBtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzBdID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXkgPSBtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdID4+IHNoaWZ0OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJU19JTlRFUkxBQ0VEKG1idHlwZV90YWJsZVttYl9pbmRleF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgKj0gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2Fycm93KHB0ciwgc3gsIHN5LCBteCArIHN4LCBteSArIHN5LCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHBpY3QtPmxpbmVzaXplWzBdLCAxMDAsIDAsIGRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeD0gbWJfeCAqIDE2ICsgODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeT0gbWJfeSAqIDE2ICsgODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4eT0gKG1iX3ggKyBtYl95ICogbXZfc3RyaWRlKSA8PCBtdl9zYW1wbGVfbG9nMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteD0gKG1vdGlvbl92YWxbZGlyZWN0aW9uXVt4eV1bMF0+PnNoaWZ0KSArIHN4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG15PSAobW90aW9uX3ZhbFtkaXJlY3Rpb25dW3h5XVsxXT4+c2hpZnQpICsgc3k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2Fycm93KHB0ciwgc3gsIHN5LCBteCwgbXksIHdpZHRoLCBoZWlnaHQsIHBpY3QtPmxpbmVzaXplWzBdLCAxMDAsIDAsIGRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1ZJU19RUCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYyA9IChxc2NhbGVfdGFibGVbbWJfaW5kZXhdICogMTI4IC8gMzEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMTAxMDEwMTAxMDEwMVVMTDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBibG9ja19oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50NjRfdCAqKShwaWN0LT5kYXRhWzFdICsgOCAqIG1iX3ggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2tfaGVpZ2h0ICogbWJfeSArIHkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC0+bGluZXNpemVbMV0pID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWludDY0X3QgKikocGljdC0+ZGF0YVsyXSArIDggKiBtYl94ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrX2hlaWdodCAqIG1iX3kgKyB5KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmxpbmVzaXplWzJdKSA9IGM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19WSVNfTUJfVFlQRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3ZhbFswXSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbWJfdHlwZSA9IG1idHlwZV90YWJsZVttYl9pbmRleF07CisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHUsdjsKKyAgICAgICAgICAgICAgICAgICAgaW50IHk7CisjZGVmaW5lIENPTE9SKHRoZXRhLCByKSBcCisgICAgdSA9IChpbnQpKDEyOCArIHIgKiBjb3ModGhldGEgKiAzLjE0MTU5MiAvIDE4MCkpOyBcCisgICAgdiA9IChpbnQpKDEyOCArIHIgKiBzaW4odGhldGEgKiAzLjE0MTU5MiAvIDE4MCkpOworCisKKyAgICAgICAgICAgICAgICAgICAgdSA9IHYgPSAxMjg7CisgICAgICAgICAgICAgICAgICAgIGlmIChJU19QQ00obWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SKDEyMCwgNDgpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKElTX0lOVFJBKG1iX3R5cGUpICYmIElTX0FDUFJFRChtYl90eXBlKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19JTlRSQTE2eDE2KG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUigzMCwgNDgpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfSU5UUkE0eDQobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SKDkwLCA0OCkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJU19ESVJFQ1QobWJfdHlwZSkgJiYgSVNfU0tJUChtYl90eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ09MT1IoMTIwLCA0OCkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJU19ESVJFQ1QobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SKDE1MCwgNDgpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfR01DKG1iX3R5cGUpICYmIElTX1NLSVAobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SKDE3MCwgNDgpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfR01DKG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUigxOTAsIDQ4KQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTX1NLSVAobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENPTE9SKDE4MCwgNDgpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIVVTRVNfTElTVChtYl90eXBlLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1IoMjQwLCA0OCkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghVVNFU19MSVNUKG1iX3R5cGUsIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUigwLCA0OCkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIoVVNFU19MSVNUKG1iX3R5cGUsIDApICYmIFVTRVNfTElTVChtYl90eXBlLCAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUigzMDAsNDgpCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1ICo9IDB4MDEwMTAxMDEwMTAxMDEwMVVMTDsKKyAgICAgICAgICAgICAgICAgICAgdiAqPSAweDAxMDEwMTAxMDEwMTAxMDFVTEw7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBibG9ja19oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50NjRfdCAqKShwaWN0LT5kYXRhWzFdICsgOCAqIG1iX3ggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2tfaGVpZ2h0ICogbWJfeSArIHkpICogcGljdC0+bGluZXNpemVbMV0pID0gdTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWludDY0X3QgKikocGljdC0+ZGF0YVsyXSArIDggKiBtYl94ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrX2hlaWdodCAqIG1iX3kgKyB5KSAqIHBpY3QtPmxpbmVzaXplWzJdKSA9IHY7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzZWdtZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKElTXzhYOChtYl90eXBlKSB8fCBJU18xNlg4KG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQ2NF90ICopKHBpY3QtPmRhdGFbMF0gKyAxNiAqIG1iX3ggKyAwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE2ICogbWJfeSArIDgpICogcGljdC0+bGluZXNpemVbMF0pIF49IDB4ODA4MDgwODA4MDgwODA4MFVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWludDY0X3QgKikocGljdC0+ZGF0YVswXSArIDE2ICogbWJfeCArIDggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTYgKiBtYl95ICsgOCkgKiBwaWN0LT5saW5lc2l6ZVswXSkgXj0gMHg4MDgwODA4MDgwODA4MDgwVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChJU184WDgobWJfdHlwZSkgfHwgSVNfOFgxNihtYl90eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC0+ZGF0YVswXVsxNiAqIG1iX3ggKyA4ICsgKDE2ICogbWJfeSArIHkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmxpbmVzaXplWzBdXSBePSAweDgwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChJU184WDgobWJfdHlwZSkgJiYgbXZfc2FtcGxlX2xvZzIgPj0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRtID0gMSA8PCAobXZfc2FtcGxlX2xvZzIgLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ggPSBtYl94ICogMTYgKyA4ICogKGkgJiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3kgPSBtYl95ICogMTYgKyA4ICogKGkgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHh5ID0gKG1iX3ggKiAyICsgKGkgJiAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1iX3kgKiAyICsgKGkgPj4gMSkpICogbXZfc3RyaWRlKSA8PCAobXZfc2FtcGxlX2xvZzIgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBiaWRpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKm12ID0gKGludDMyX3QgKikgJm1vdGlvbl92YWxbMF1beHldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdlswXSAhPSBtdltkbV0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZbZG0gKiBtdl9zdHJpZGVdICE9IG12W2RtICogKG12X3N0cmlkZSArIDEpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmRhdGFbMF1bc3ggKyA0ICsgKHN5ICsgeSkgKiBwaWN0LT5saW5lc2l6ZVswXV0gXj0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXZbMF0gIT0gbXZbZG0gKiBtdl9zdHJpZGVdIHx8IG12W2RtXSAhPSBtdltkbSAqIChtdl9zdHJpZGUgKyAxKV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodWludDY0X3QgKikocGljdC0+ZGF0YVswXSArIHN4ICsgKHN5ICsgNCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmxpbmVzaXplWzBdKSBePSAweDgwODA4MDgwODA4MDgwODBVTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoSVNfSU5URVJMQUNFRChtYl90eXBlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBobW0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYnNraXBfdGFibGVbbWJfaW5kZXhdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl9wcmludF9kZWJ1Z19pbmZvKE1wZWdFbmNDb250ZXh0ICpzLCBQaWN0dXJlICpwLCBBVkZyYW1lICpwaWN0KQoreworICAgIGZmX3ByaW50X2RlYnVnX2luZm8yKHMtPmF2Y3R4LCBwaWN0LCBzLT5tYnNraXBfdGFibGUsIHAtPm1iX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cXNjYWxlX3RhYmxlLCBwLT5tb3Rpb25fdmFsLCAmcy0+bG93X2RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3dpZHRoLCBzLT5tYl9oZWlnaHQsIHMtPm1iX3N0cmlkZSwgcy0+cXVhcnRlcl9zYW1wbGUpOworfQorCitpbnQgZmZfbXB2X2V4cG9ydF9xcF90YWJsZShNcGVnRW5jQ29udGV4dCAqcywgQVZGcmFtZSAqZiwgUGljdHVyZSAqcCwgaW50IHFwX3R5cGUpCit7CisgICAgQVZCdWZmZXJSZWYgKnJlZiA9IGF2X2J1ZmZlcl9yZWYocC0+cXNjYWxlX3RhYmxlX2J1Zik7CisgICAgaW50IG9mZnNldCA9IDIqcy0+bWJfc3RyaWRlICsgMTsKKyAgICBpZighcmVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2X2Fzc2VydDAocmVmLT5zaXplID49IG9mZnNldCArIHMtPm1iX3N0cmlkZSAqICgoZi0+aGVpZ2h0KzE1KS8xNikpOworICAgIHJlZi0+c2l6ZSAtPSBvZmZzZXQ7CisgICAgcmVmLT5kYXRhICs9IG9mZnNldDsKKyAgICByZXR1cm4gYXZfZnJhbWVfc2V0X3FwX3RhYmxlKGYsIHJlZiwgcy0+bWJfc3RyaWRlLCBxcF90eXBlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaHBlbF9tb3Rpb25fbG93cmVzKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfYmFzZWQsIGludCBmaWVsZF9zZWxlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY194LCBpbnQgc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoX2VkZ2VfcG9zLCBpbnQgdl9lZGdlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGgyNjRfY2hyb21hX21jX2Z1bmMgKnBpeF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uX3gsIGludCBtb3Rpb25feSkKK3sKKyAgICBjb25zdCBpbnQgbG93cmVzICAgPSBzLT5hdmN0eC0+bG93cmVzOworICAgIGNvbnN0IGludCBvcF9pbmRleCA9IEZGTUlOKGxvd3JlcywgMyk7CisgICAgY29uc3QgaW50IHNfbWFzayAgID0gKDIgPDwgbG93cmVzKSAtIDE7CisgICAgaW50IGVtdSA9IDA7CisgICAgaW50IHN4LCBzeTsKKworICAgIGlmIChzLT5xdWFydGVyX3NhbXBsZSkgeworICAgICAgICBtb3Rpb25feCAvPSAyOworICAgICAgICBtb3Rpb25feSAvPSAyOworICAgIH0KKworICAgIHN4ID0gbW90aW9uX3ggJiBzX21hc2s7CisgICAgc3kgPSBtb3Rpb25feSAmIHNfbWFzazsKKyAgICBzcmNfeCArPSBtb3Rpb25feCA+PiBsb3dyZXMgKyAxOworICAgIHNyY195ICs9IG1vdGlvbl95ID4+IGxvd3JlcyArIDE7CisKKyAgICBzcmMgICArPSBzcmNfeSAqIHN0cmlkZSArIHNyY194OworCisgICAgaWYgKCh1bnNpZ25lZClzcmNfeCA+IEZGTUFYKCBoX2VkZ2VfcG9zIC0gKCEhc3gpIC0gdywgICAgICAgICAgICAgICAgIDApIHx8CisgICAgICAgICh1bnNpZ25lZClzcmNfeSA+IEZGTUFYKCh2X2VkZ2VfcG9zID4+IGZpZWxkX2Jhc2VkKSAtICghIXN5KSAtIGgsIDApKSB7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVzaXplLCBzLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKyAxLCAoaCArIDEpIDw8IGZpZWxkX2Jhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3gsIHNyY195ICAgPDwgZmllbGRfYmFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VkZ2VfcG9zLCB2X2VkZ2VfcG9zKTsKKyAgICAgICAgc3JjID0gcy0+ZWRnZV9lbXVfYnVmZmVyOworICAgICAgICBlbXUgPSAxOworICAgIH0KKworICAgIHN4ID0gKHN4IDw8IDIpID4+IGxvd3JlczsKKyAgICBzeSA9IChzeSA8PCAyKSA+PiBsb3dyZXM7CisgICAgaWYgKGZpZWxkX3NlbGVjdCkKKyAgICAgICAgc3JjICs9IHMtPmxpbmVzaXplOworICAgIHBpeF9vcFtvcF9pbmRleF0oZGVzdCwgc3JjLCBzdHJpZGUsIGgsIHN4LCBzeSk7CisgICAgcmV0dXJuIGVtdTsKK30KKworLyogYXBwbHkgb25lIG1wZWcgbW90aW9uIHZlY3RvciB0byB0aGUgdGhyZWUgY29tcG9uZW50cyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtcGVnX21vdGlvbl9sb3dyZXMoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9iYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib3R0b21fZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnJlZl9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF9jaHJvbWFfbWNfZnVuYyAqcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG1iX3kpCit7CisgICAgdWludDhfdCAqcHRyX3ksICpwdHJfY2IsICpwdHJfY3I7CisgICAgaW50IG14LCBteSwgc3JjX3gsIHNyY195LCB1dnNyY194LCB1dnNyY195LCBzeCwgc3ksIHV2c3gsIHV2c3k7CisgICAgcHRyZGlmZl90IHV2bGluZXNpemUsIGxpbmVzaXplOworICAgIGNvbnN0IGludCBsb3dyZXMgICAgID0gcy0+YXZjdHgtPmxvd3JlczsKKyAgICBjb25zdCBpbnQgb3BfaW5kZXggICA9IEZGTUlOKGxvd3Jlcy0xK3MtPmNocm9tYV94X3NoaWZ0LCAzKTsKKyAgICBjb25zdCBpbnQgYmxvY2tfcyAgICA9IDg+Pmxvd3JlczsKKyAgICBjb25zdCBpbnQgc19tYXNrICAgICA9ICgyIDw8IGxvd3JlcykgLSAxOworICAgIGNvbnN0IGludCBoX2VkZ2VfcG9zID0gcy0+aF9lZGdlX3BvcyA+PiBsb3dyZXM7CisgICAgY29uc3QgaW50IHZfZWRnZV9wb3MgPSBzLT52X2VkZ2VfcG9zID4+IGxvd3JlczsKKyAgICBsaW5lc2l6ZSAgID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWzBdIDw8IGZpZWxkX2Jhc2VkOworICAgIHV2bGluZXNpemUgPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbMV0gPDwgZmllbGRfYmFzZWQ7CisKKyAgICAvLyBGSVhNRSBvYnZpb3VzbHkgbm90IHBlcmZlY3QgYnV0IHFwZWwgd2lsbCBub3Qgd29yayBpbiBsb3dyZXMgYW55d2F5CisgICAgaWYgKHMtPnF1YXJ0ZXJfc2FtcGxlKSB7CisgICAgICAgIG1vdGlvbl94IC89IDI7CisgICAgICAgIG1vdGlvbl95IC89IDI7CisgICAgfQorCisgICAgaWYoZmllbGRfYmFzZWQpeworICAgICAgICBtb3Rpb25feSArPSAoYm90dG9tX2ZpZWxkIC0gZmllbGRfc2VsZWN0KSooKDEgPDwgbG93cmVzKS0xKTsKKyAgICB9CisKKyAgICBzeCA9IG1vdGlvbl94ICYgc19tYXNrOworICAgIHN5ID0gbW90aW9uX3kgJiBzX21hc2s7CisgICAgc3JjX3ggPSBzLT5tYl94ICogMiAqIGJsb2NrX3MgKyAobW90aW9uX3ggPj4gbG93cmVzICsgMSk7CisgICAgc3JjX3kgPSAobWJfeSAqIDIgKiBibG9ja19zID4+IGZpZWxkX2Jhc2VkKSArIChtb3Rpb25feSA+PiBsb3dyZXMgKyAxKTsKKworICAgIGlmIChzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzKSB7CisgICAgICAgIHV2c3ggICAgPSAoKG1vdGlvbl94ID4+IDEpICYgc19tYXNrKSB8IChzeCAmIDEpOworICAgICAgICB1dnN5ICAgID0gKChtb3Rpb25feSA+PiAxKSAmIHNfbWFzaykgfCAoc3kgJiAxKTsKKyAgICAgICAgdXZzcmNfeCA9IHNyY194ID4+IDE7CisgICAgICAgIHV2c3JjX3kgPSBzcmNfeSA+PiAxOworICAgIH0gZWxzZSBpZiAocy0+b3V0X2Zvcm1hdCA9PSBGTVRfSDI2MSkgeworICAgICAgICAvLyBldmVuIGNocm9tYSBtdidzIGFyZSBmdWxsIHBlbCBpbiBIMjYxCisgICAgICAgIG14ICAgICAgPSBtb3Rpb25feCAvIDQ7CisgICAgICAgIG15ICAgICAgPSBtb3Rpb25feSAvIDQ7CisgICAgICAgIHV2c3ggICAgPSAoMiAqIG14KSAmIHNfbWFzazsKKyAgICAgICAgdXZzeSAgICA9ICgyICogbXkpICYgc19tYXNrOworICAgICAgICB1dnNyY194ID0gcy0+bWJfeCAqIGJsb2NrX3MgKyAobXggPj4gbG93cmVzKTsKKyAgICAgICAgdXZzcmNfeSA9ICAgIG1iX3kgKiBibG9ja19zICsgKG15ID4+IGxvd3Jlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYocy0+Y2hyb21hX3lfc2hpZnQpeworICAgICAgICAgICAgbXggICAgICA9IG1vdGlvbl94IC8gMjsKKyAgICAgICAgICAgIG15ICAgICAgPSBtb3Rpb25feSAvIDI7CisgICAgICAgICAgICB1dnN4ICAgID0gbXggJiBzX21hc2s7CisgICAgICAgICAgICB1dnN5ICAgID0gbXkgJiBzX21hc2s7CisgICAgICAgICAgICB1dnNyY194ID0gcy0+bWJfeCAqIGJsb2NrX3MgICAgICAgICAgICAgICAgICsgKG14ID4+IGxvd3JlcyArIDEpOworICAgICAgICAgICAgdXZzcmNfeSA9ICAgKG1iX3kgKiBibG9ja19zID4+IGZpZWxkX2Jhc2VkKSArIChteSA+PiBsb3dyZXMgKyAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKHMtPmNocm9tYV94X3NoaWZ0KXsKKyAgICAgICAgICAgIC8vQ2hyb21hNDIyCisgICAgICAgICAgICAgICAgbXggPSBtb3Rpb25feCAvIDI7CisgICAgICAgICAgICAgICAgdXZzeCA9IG14ICYgc19tYXNrOworICAgICAgICAgICAgICAgIHV2c3kgPSBtb3Rpb25feSAmIHNfbWFzazsKKyAgICAgICAgICAgICAgICB1dnNyY195ID0gc3JjX3k7CisgICAgICAgICAgICAgICAgdXZzcmNfeCA9IHMtPm1iX3gqYmxvY2tfcyAgICAgICAgICAgICAgICsgKG14ID4+IChsb3dyZXMrMSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vQ2hyb21hNDQ0CisgICAgICAgICAgICAgICAgdXZzeCA9IG1vdGlvbl94ICYgc19tYXNrOworICAgICAgICAgICAgICAgIHV2c3kgPSBtb3Rpb25feSAmIHNfbWFzazsKKyAgICAgICAgICAgICAgICB1dnNyY194ID0gc3JjX3g7CisgICAgICAgICAgICAgICAgdXZzcmNfeSA9IHNyY195OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHRyX3kgID0gcmVmX3BpY3R1cmVbMF0gKyBzcmNfeSAgICogbGluZXNpemUgICArIHNyY194OworICAgIHB0cl9jYiA9IHJlZl9waWN0dXJlWzFdICsgdXZzcmNfeSAqIHV2bGluZXNpemUgKyB1dnNyY194OworICAgIHB0cl9jciA9IHJlZl9waWN0dXJlWzJdICsgdXZzcmNfeSAqIHV2bGluZXNpemUgKyB1dnNyY194OworCisgICAgaWYgKCh1bnNpZ25lZCkgc3JjX3ggPiBGRk1BWCggaF9lZGdlX3BvcyAtICghIXN4KSAtIDIgKiBibG9ja19zLCAgICAgICAwKSB8fCB1dnNyY195PDAgfHwKKyAgICAgICAgKHVuc2lnbmVkKSBzcmNfeSA+IEZGTUFYKCh2X2VkZ2VfcG9zID4+IGZpZWxkX2Jhc2VkKSAtICghIXN5KSAtIGgsIDApKSB7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsIHB0cl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUgPj4gZmllbGRfYmFzZWQsIGxpbmVzaXplID4+IGZpZWxkX2Jhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIDE3ICsgZmllbGRfYmFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY194LCBzcmNfeSA8PCBmaWVsZF9iYXNlZCwgaF9lZGdlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9lZGdlX3Bvcyk7CisgICAgICAgIHB0cl95ID0gcy0+ZWRnZV9lbXVfYnVmZmVyOworICAgICAgICBpZiAoIUNPTkZJR19HUkFZIHx8ICEocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgICAgICB1aW50OF90ICp1YnVmID0gcy0+ZWRnZV9lbXVfYnVmZmVyICsgMTggKiBzLT5saW5lc2l6ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnZidWYgPXVidWYgKyA5ICogcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh1YnVmLCAgcHRyX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUgPj4gZmllbGRfYmFzZWQsIHV2bGluZXNpemUgPj4gZmllbGRfYmFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOSArIGZpZWxkX2Jhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZzcmNfeCwgdXZzcmNfeSA8PCBmaWVsZF9iYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZWRnZV9wb3MgPj4gMSwgdl9lZGdlX3BvcyA+PiAxKTsKKyAgICAgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh2YnVmLCAgcHRyX2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUgPj4gZmllbGRfYmFzZWQsdXZsaW5lc2l6ZSA+PiBmaWVsZF9iYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LCA5ICsgZmllbGRfYmFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dnNyY194LCB1dnNyY195IDw8IGZpZWxkX2Jhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lZGdlX3BvcyA+PiAxLCB2X2VkZ2VfcG9zID4+IDEpOworICAgICAgICAgICAgcHRyX2NiID0gdWJ1ZjsKKyAgICAgICAgICAgIHB0cl9jciA9IHZidWY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGSVhNRSB1c2UgdGhpcyBmb3IgZmllbGQgcGl4IHRvbyBpbnN0ZWFkIG9mIHRoZSBvYm5veGlvdXMgaGFjayB3aGljaCBjaGFuZ2VzIHBpY3R1cmUuZi0+ZGF0YQorICAgIGlmIChib3R0b21fZmllbGQpIHsKKyAgICAgICAgZGVzdF95ICArPSBzLT5saW5lc2l6ZTsKKyAgICAgICAgZGVzdF9jYiArPSBzLT51dmxpbmVzaXplOworICAgICAgICBkZXN0X2NyICs9IHMtPnV2bGluZXNpemU7CisgICAgfQorCisgICAgaWYgKGZpZWxkX3NlbGVjdCkgeworICAgICAgICBwdHJfeSAgICs9IHMtPmxpbmVzaXplOworICAgICAgICBwdHJfY2IgICs9IHMtPnV2bGluZXNpemU7CisgICAgICAgIHB0cl9jciAgKz0gcy0+dXZsaW5lc2l6ZTsKKyAgICB9CisKKyAgICBzeCA9IChzeCA8PCAyKSA+PiBsb3dyZXM7CisgICAgc3kgPSAoc3kgPDwgMikgPj4gbG93cmVzOworICAgIHBpeF9vcFtsb3dyZXMgLSAxXShkZXN0X3ksIHB0cl95LCBsaW5lc2l6ZSwgaCwgc3gsIHN5KTsKKworICAgIGlmICghQ09ORklHX0dSQVkgfHwgIShzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgaW50IGhjID0gcy0+Y2hyb21hX3lfc2hpZnQgPyAoaCsxLWJvdHRvbV9maWVsZCk+PjEgOiBoOworICAgICAgICB1dnN4ID0gKHV2c3ggPDwgMikgPj4gbG93cmVzOworICAgICAgICB1dnN5ID0gKHV2c3kgPDwgMikgPj4gbG93cmVzOworICAgICAgICBpZiAoaGMpIHsKKyAgICAgICAgICAgIHBpeF9vcFtvcF9pbmRleF0oZGVzdF9jYiwgcHRyX2NiLCB1dmxpbmVzaXplLCBoYywgdXZzeCwgdXZzeSk7CisgICAgICAgICAgICBwaXhfb3Bbb3BfaW5kZXhdKGRlc3RfY3IsIHB0cl9jciwgdXZsaW5lc2l6ZSwgaGMsIHV2c3gsIHV2c3kpOworICAgICAgICB9CisgICAgfQorICAgIC8vIEZJWE1FIGgyNjEgbG93cmVzIGxvb3AgZmlsdGVyCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaHJvbWFfNG12X21vdGlvbl9sb3dyZXMoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY2IsIHVpbnQ4X3QgKmRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipyZWZfcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF9jaHJvbWFfbWNfZnVuYyAqIHBpeF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14LCBpbnQgbXkpCit7CisgICAgY29uc3QgaW50IGxvd3JlcyAgICAgPSBzLT5hdmN0eC0+bG93cmVzOworICAgIGNvbnN0IGludCBvcF9pbmRleCAgID0gRkZNSU4obG93cmVzLCAzKTsKKyAgICBjb25zdCBpbnQgYmxvY2tfcyAgICA9IDggPj4gbG93cmVzOworICAgIGNvbnN0IGludCBzX21hc2sgICAgID0gKDIgPDwgbG93cmVzKSAtIDE7CisgICAgY29uc3QgaW50IGhfZWRnZV9wb3MgPSBzLT5oX2VkZ2VfcG9zID4+IGxvd3JlcyArIDE7CisgICAgY29uc3QgaW50IHZfZWRnZV9wb3MgPSBzLT52X2VkZ2VfcG9zID4+IGxvd3JlcyArIDE7CisgICAgaW50IGVtdSA9IDAsIHNyY194LCBzcmNfeSwgc3gsIHN5OworICAgIHB0cmRpZmZfdCBvZmZzZXQ7CisgICAgdWludDhfdCAqcHRyOworCisgICAgaWYgKHMtPnF1YXJ0ZXJfc2FtcGxlKSB7CisgICAgICAgIG14IC89IDI7CisgICAgICAgIG15IC89IDI7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA4WDgsIHdlIGNvbnN0cnVjdCBhIHNpbmdsZSBjaHJvbWEgbW90aW9uIHZlY3RvcgorICAgICAgIHdpdGggYSBzcGVjaWFsIHJvdW5kaW5nICovCisgICAgbXggPSBmZl9oMjYzX3JvdW5kX2Nocm9tYShteCk7CisgICAgbXkgPSBmZl9oMjYzX3JvdW5kX2Nocm9tYShteSk7CisKKyAgICBzeCA9IG14ICYgc19tYXNrOworICAgIHN5ID0gbXkgJiBzX21hc2s7CisgICAgc3JjX3ggPSBzLT5tYl94ICogYmxvY2tfcyArIChteCA+PiBsb3dyZXMgKyAxKTsKKyAgICBzcmNfeSA9IHMtPm1iX3kgKiBibG9ja19zICsgKG15ID4+IGxvd3JlcyArIDEpOworCisgICAgb2Zmc2V0ID0gc3JjX3kgKiBzLT51dmxpbmVzaXplICsgc3JjX3g7CisgICAgcHRyID0gcmVmX3BpY3R1cmVbMV0gKyBvZmZzZXQ7CisgICAgaWYgKCh1bnNpZ25lZCkgc3JjX3ggPiBGRk1BWChoX2VkZ2VfcG9zIC0gKCEhc3gpIC0gYmxvY2tfcywgMCkgfHwKKyAgICAgICAgKHVuc2lnbmVkKSBzcmNfeSA+IEZGTUFYKHZfZWRnZV9wb3MgLSAoISFzeSkgLSBibG9ja19zLCAwKSkgeworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyLCBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT51dmxpbmVzaXplLCBzLT51dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY194LCBzcmNfeSwgaF9lZGdlX3Bvcywgdl9lZGdlX3Bvcyk7CisgICAgICAgIHB0ciA9IHMtPmVkZ2VfZW11X2J1ZmZlcjsKKyAgICAgICAgZW11ID0gMTsKKyAgICB9CisgICAgc3ggPSAoc3ggPDwgMikgPj4gbG93cmVzOworICAgIHN5ID0gKHN5IDw8IDIpID4+IGxvd3JlczsKKyAgICBwaXhfb3Bbb3BfaW5kZXhdKGRlc3RfY2IsIHB0ciwgcy0+dXZsaW5lc2l6ZSwgYmxvY2tfcywgc3gsIHN5KTsKKworICAgIHB0ciA9IHJlZl9waWN0dXJlWzJdICsgb2Zmc2V0OworICAgIGlmIChlbXUpIHsKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlciwgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZsaW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfeCwgc3JjX3ksIGhfZWRnZV9wb3MsIHZfZWRnZV9wb3MpOworICAgICAgICBwdHIgPSBzLT5lZGdlX2VtdV9idWZmZXI7CisgICAgfQorICAgIHBpeF9vcFtvcF9pbmRleF0oZGVzdF9jciwgcHRyLCBzLT51dmxpbmVzaXplLCBibG9ja19zLCBzeCwgc3kpOworfQorCisvKioKKyAqIG1vdGlvbiBjb21wZW5zYXRpb24gb2YgYSBzaW5nbGUgbWFjcm9ibG9jaworICogQHBhcmFtIHMgY29udGV4dAorICogQHBhcmFtIGRlc3RfeSBsdW1hIGRlc3RpbmF0aW9uIHBvaW50ZXIKKyAqIEBwYXJhbSBkZXN0X2NiIGNocm9tYSBjYi91IGRlc3RpbmF0aW9uIHBvaW50ZXIKKyAqIEBwYXJhbSBkZXN0X2NyIGNocm9tYSBjci92IGRlc3RpbmF0aW9uIHBvaW50ZXIKKyAqIEBwYXJhbSBkaXIgZGlyZWN0aW9uICgwLT5mb3J3YXJkLCAxLT5iYWNrd2FyZCkKKyAqIEBwYXJhbSByZWZfcGljdHVyZSBhcnJheVszXSBvZiBwb2ludGVycyB0byB0aGUgMyBwbGFuZXMgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlCisgKiBAcGFyYW0gcGl4X29wIGhhbGZwZWwgbW90aW9uIGNvbXBlbnNhdGlvbiBmdW5jdGlvbiAoYXZlcmFnZSBvciBwdXQgbm9ybWFsbHkpCisgKiB0aGUgbW90aW9uIHZlY3RvcnMgYXJlIHRha2VuIGZyb20gcy0+bXYgYW5kIHRoZSBNViB0eXBlIGZyb20gcy0+bXZfdHlwZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgTVBWX21vdGlvbl9sb3dyZXMoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF95LCB1aW50OF90ICpkZXN0X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgdWludDhfdCAqKnJlZl9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRfY2hyb21hX21jX2Z1bmMgKnBpeF9vcCkKK3sKKyAgICBpbnQgbXgsIG15OworICAgIGludCBtYl94LCBtYl95LCBpOworICAgIGNvbnN0IGludCBsb3dyZXMgID0gcy0+YXZjdHgtPmxvd3JlczsKKyAgICBjb25zdCBpbnQgYmxvY2tfcyA9IDggPj5sb3dyZXM7CisKKyAgICBtYl94ID0gcy0+bWJfeDsKKyAgICBtYl95ID0gcy0+bWJfeTsKKworICAgIHN3aXRjaCAocy0+bXZfdHlwZSkgeworICAgIGNhc2UgTVZfVFlQRV8xNlgxNjoKKyAgICAgICAgbXBlZ19tb3Rpb25fbG93cmVzKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcGljdHVyZSwgcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVswXVswXSwgcy0+bXZbZGlyXVswXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBibG9ja19zLCBtYl95KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNVl9UWVBFXzhYODoKKyAgICAgICAgbXggPSAwOworICAgICAgICBteSA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGhwZWxfbW90aW9uX2xvd3JlcyhzLCBkZXN0X3kgKyAoKGkgJiAxKSArIChpID4+IDEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lc2l6ZSkgKiBibG9ja19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9waWN0dXJlWzBdLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyICogbWJfeCArIChpICYgMSkpICogYmxvY2tfcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiAqIG1iX3kgKyAoaSA+PiAxKSkgKiBibG9ja19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPndpZHRoLCBzLT5oZWlnaHQsIHMtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhfZWRnZV9wb3MgPj4gbG93cmVzLCBzLT52X2VkZ2VfcG9zID4+IGxvd3JlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19zLCBibG9ja19zLCBwaXhfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVtpXVswXSwgcy0+bXZbZGlyXVtpXVsxXSk7CisKKyAgICAgICAgICAgIG14ICs9IHMtPm12W2Rpcl1baV1bMF07CisgICAgICAgICAgICBteSArPSBzLT5tdltkaXJdW2ldWzFdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFDT05GSUdfR1JBWSB8fCAhKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkKKyAgICAgICAgICAgIGNocm9tYV80bXZfbW90aW9uX2xvd3JlcyhzLCBkZXN0X2NiLCBkZXN0X2NyLCByZWZfcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhfb3AsIG14LCBteSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVZfVFlQRV9GSUVMRDoKKyAgICAgICAgaWYgKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpIHsKKyAgICAgICAgICAgIC8qIHRvcCBmaWVsZCAqLworICAgICAgICAgICAgbXBlZ19tb3Rpb25fbG93cmVzKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCBzLT5maWVsZF9zZWxlY3RbZGlyXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcGljdHVyZSwgcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1bMF1bMF0sIHMtPm12W2Rpcl1bMF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfcywgbWJfeSk7CisgICAgICAgICAgICAvKiBib3R0b20gZmllbGQgKi8KKyAgICAgICAgICAgIG1wZWdfbW90aW9uX2xvd3JlcyhzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgcy0+ZmllbGRfc2VsZWN0W2Rpcl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3BpY3R1cmUsIHBpeF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltkaXJdWzFdWzBdLCBzLT5tdltkaXJdWzFdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3MsIG1iX3kpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHMtPnBpY3R1cmVfc3RydWN0dXJlICE9IHMtPmZpZWxkX3NlbGVjdFtkaXJdWzBdICsgMSAmJgorICAgICAgICAgICAgICAgIHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQiAmJiAhcy0+Zmlyc3RfZmllbGQpIHsKKyAgICAgICAgICAgICAgICByZWZfcGljdHVyZSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmRhdGE7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1wZWdfbW90aW9uX2xvd3JlcyhzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgcy0+ZmllbGRfc2VsZWN0W2Rpcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3BpY3R1cmUsIHBpeF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltkaXJdWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1bMF1bMV0sIDIgKiBibG9ja19zLCBtYl95ID4+IDEpOworICAgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1WX1RZUEVfMTZYODoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgdWludDhfdCAqKnJlZjJwaWN0dXJlOworCisgICAgICAgICAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gcy0+ZmllbGRfc2VsZWN0W2Rpcl1baV0gKyAxIHx8CisgICAgICAgICAgICAgICAgcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CIHx8IHMtPmZpcnN0X2ZpZWxkKSB7CisgICAgICAgICAgICAgICAgcmVmMnBpY3R1cmUgPSByZWZfcGljdHVyZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVmMnBpY3R1cmUgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5kYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtcGVnX21vdGlvbl9sb3dyZXMocywgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIHMtPmZpZWxkX3NlbGVjdFtkaXJdW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjJwaWN0dXJlLCBwaXhfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVtpXVswXSwgcy0+bXZbZGlyXVtpXVsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIGJsb2NrX3MgKiBpLCBibG9ja19zLCBtYl95ID4+IDEpOworCisgICAgICAgICAgICBkZXN0X3kgICs9ICAyICogYmxvY2tfcyAqICBzLT5saW5lc2l6ZTsKKyAgICAgICAgICAgIGRlc3RfY2IgKz0gKDIgKiBibG9ja19zID4+IHMtPmNocm9tYV95X3NoaWZ0KSAqIHMtPnV2bGluZXNpemU7CisgICAgICAgICAgICBkZXN0X2NyICs9ICgyICogYmxvY2tfcyA+PiBzLT5jaHJvbWFfeV9zaGlmdCkgKiBzLT51dmxpbmVzaXplOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVZfVFlQRV9ETVY6CisgICAgICAgIGlmIChzLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgICAgICBtcGVnX21vdGlvbl9sb3dyZXMocywgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgaiwgaiBeIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcGljdHVyZSwgcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVsyICogaSArIGpdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVsyICogaSArIGpdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfcywgbWJfeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBpeF9vcCA9IHMtPmgyNjRjaHJvbWEuYXZnX2gyNjRfY2hyb21hX3BpeGVsc190YWI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgbXBlZ19tb3Rpb25fbG93cmVzKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgcy0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gaSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9waWN0dXJlLCBwaXhfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1bMiAqIGldWzBdLHMtPm12W2Rpcl1bMiAqIGldWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogYmxvY2tfcywgbWJfeSA+PiAxKTsKKworICAgICAgICAgICAgICAgIC8vIGFmdGVyIHB1dCB3ZSBtYWtlIGF2ZyBvZiB0aGUgc2FtZSBibG9jaworICAgICAgICAgICAgICAgIHBpeF9vcCA9IHMtPmgyNjRjaHJvbWEuYXZnX2gyNjRfY2hyb21hX3BpeGVsc190YWI7CisKKyAgICAgICAgICAgICAgICAvLyBvcHBvc2l0ZSBwYXJpdHkgaXMgYWx3YXlzIGluIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgLy8gZnJhbWUgaWYgdGhpcyBpcyBzZWNvbmQgZmllbGQKKyAgICAgICAgICAgICAgICBpZiAoIXMtPmZpcnN0X2ZpZWxkKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZl9waWN0dXJlID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+ZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfYXNzZXJ0MigwKTsKKyAgICB9Cit9CisKKy8qKgorICogZmluZCB0aGUgbG93ZXN0IE1CIHJvdyByZWZlcmVuY2VkIGluIHRoZSBNVnMKKyAqLworaW50IGZmX21wdl9sb3dlc3RfcmVmZXJlbmNlZF9yb3coTXBlZ0VuY0NvbnRleHQgKnMsIGludCBkaXIpCit7CisgICAgaW50IG15X21heCA9IElOVF9NSU4sIG15X21pbiA9IElOVF9NQVgsIHFwZWxfc2hpZnQgPSAhcy0+cXVhcnRlcl9zYW1wbGU7CisgICAgaW50IG15LCBvZmYsIGksIG12czsKKworICAgIGlmIChzLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FIHx8IHMtPm1jc2VsKQorICAgICAgICBnb3RvIHVuaGFuZGxlZDsKKworICAgIHN3aXRjaCAocy0+bXZfdHlwZSkgeworICAgICAgICBjYXNlIE1WX1RZUEVfMTZYMTY6CisgICAgICAgICAgICBtdnMgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVZfVFlQRV8xNlg4OgorICAgICAgICAgICAgbXZzID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1WX1RZUEVfOFg4OgorICAgICAgICAgICAgbXZzID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byB1bmhhbmRsZWQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG12czsgaSsrKSB7CisgICAgICAgIG15ID0gcy0+bXZbZGlyXVtpXVsxXTw8cXBlbF9zaGlmdDsKKyAgICAgICAgbXlfbWF4ID0gRkZNQVgobXlfbWF4LCBteSk7CisgICAgICAgIG15X21pbiA9IEZGTUlOKG15X21pbiwgbXkpOworICAgIH0KKworICAgIG9mZiA9IChGRk1BWCgtbXlfbWluLCBteV9tYXgpICsgNjMpID4+IDY7CisKKyAgICByZXR1cm4gRkZNSU4oRkZNQVgocy0+bWJfeSArIG9mZiwgMCksIHMtPm1iX2hlaWdodC0xKTsKK3VuaGFuZGxlZDoKKyAgICByZXR1cm4gcy0+bWJfaGVpZ2h0LTE7Cit9CisKKy8qIHB1dCBibG9ja1tdIHRvIGRlc3RbXSAqLworc3RhdGljIGlubGluZSB2b2lkIHB1dF9kY3QoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IGksIHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludCBxc2NhbGUpCit7CisgICAgcy0+ZGN0X3VucXVhbnRpemVfaW50cmEocywgYmxvY2ssIGksIHFzY2FsZSk7CisgICAgcy0+aWRzcC5pZGN0X3B1dChkZXN0LCBsaW5lX3NpemUsIGJsb2NrKTsKK30KKworLyogYWRkIGJsb2NrW10gdG8gZGVzdFtdICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2RjdChNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgaSwgdWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSkKK3sKKyAgICBpZiAocy0+YmxvY2tfbGFzdF9pbmRleFtpXSA+PSAwKSB7CisgICAgICAgIHMtPmlkc3AuaWRjdF9hZGQoZGVzdCwgbGluZV9zaXplLCBibG9jayk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2RlcXVhbnRfZGN0KE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBpLCB1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQgcXNjYWxlKQoreworICAgIGlmIChzLT5ibG9ja19sYXN0X2luZGV4W2ldID49IDApIHsKKyAgICAgICAgcy0+ZGN0X3VucXVhbnRpemVfaW50ZXIocywgYmxvY2ssIGksIHFzY2FsZSk7CisKKyAgICAgICAgcy0+aWRzcC5pZGN0X2FkZChkZXN0LCBsaW5lX3NpemUsIGJsb2NrKTsKKyAgICB9Cit9CisKKy8qKgorICogQ2xlYW4gZGMsIGFjLCBjb2RlZF9ibG9jayBmb3IgdGhlIGN1cnJlbnQgbm9uLWludHJhIE1CLgorICovCit2b2lkIGZmX2NsZWFuX2ludHJhX3RhYmxlX2VudHJpZXMoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IHdyYXAgPSBzLT5iOF9zdHJpZGU7CisgICAgaW50IHh5ID0gcy0+YmxvY2tfaW5kZXhbMF07CisKKyAgICBzLT5kY192YWxbMF1beHkgICAgICAgICAgIF0gPQorICAgIHMtPmRjX3ZhbFswXVt4eSArIDEgICAgICAgXSA9CisgICAgcy0+ZGNfdmFsWzBdW3h5ICAgICArIHdyYXBdID0KKyAgICBzLT5kY192YWxbMF1beHkgKyAxICsgd3JhcF0gPSAxMDI0OworICAgIC8qIGFjIHByZWQgKi8KKyAgICBtZW1zZXQocy0+YWNfdmFsWzBdW3h5ICAgICAgIF0sIDAsIDMyICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICBtZW1zZXQocy0+YWNfdmFsWzBdW3h5ICsgd3JhcF0sIDAsIDMyICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICBpZiAocy0+bXNtcGVnNF92ZXJzaW9uPj0zKSB7CisgICAgICAgIHMtPmNvZGVkX2Jsb2NrW3h5ICAgICAgICAgICBdID0KKyAgICAgICAgcy0+Y29kZWRfYmxvY2tbeHkgKyAxICAgICAgIF0gPQorICAgICAgICBzLT5jb2RlZF9ibG9ja1t4eSAgICAgKyB3cmFwXSA9CisgICAgICAgIHMtPmNvZGVkX2Jsb2NrW3h5ICsgMSArIHdyYXBdID0gMDsKKyAgICB9CisgICAgLyogY2hyb21hICovCisgICAgd3JhcCA9IHMtPm1iX3N0cmlkZTsKKyAgICB4eSA9IHMtPm1iX3ggKyBzLT5tYl95ICogd3JhcDsKKyAgICBzLT5kY192YWxbMV1beHldID0KKyAgICBzLT5kY192YWxbMl1beHldID0gMTAyNDsKKyAgICAvKiBhYyBwcmVkICovCisgICAgbWVtc2V0KHMtPmFjX3ZhbFsxXVt4eV0sIDAsIDE2ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICBtZW1zZXQocy0+YWNfdmFsWzJdW3h5XSwgMCwgMTYgKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgcy0+bWJpbnRyYV90YWJsZVt4eV09IDA7Cit9CisKKy8qIGdlbmVyaWMgZnVuY3Rpb24gY2FsbGVkIGFmdGVyIGEgbWFjcm9ibG9jayBoYXMgYmVlbiBwYXJzZWQgYnkgdGhlCisgICBkZWNvZGVyIG9yIGFmdGVyIGl0IGhhcyBiZWVuIGVuY29kZWQgYnkgdGhlIGVuY29kZXIuCisKKyAgIEltcG9ydGFudCB2YXJpYWJsZXMgdXNlZDoKKyAgIHMtPm1iX2ludHJhIDogdHJ1ZSBpZiBpbnRyYSBtYWNyb2Jsb2NrCisgICBzLT5tdl9kaXIgICA6IG1vdGlvbiB2ZWN0b3IgZGlyZWN0aW9uCisgICBzLT5tdl90eXBlICA6IG1vdGlvbiB2ZWN0b3IgdHlwZQorICAgcy0+bXYgICAgICAgOiBtb3Rpb24gdmVjdG9yCisgICBzLT5pbnRlcmxhY2VkX2RjdCA6IHRydWUgaWYgaW50ZXJsYWNlZCBkY3QgdXNlZCAobXBlZzIpCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIG1wdl9kZWNvZGVfbWJfaW50ZXJuYWwoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgYmxvY2tbMTJdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93cmVzX2ZsYWcsIGludCBpc19tcGVnMTIpCit7CisgICAgY29uc3QgaW50IG1iX3h5ID0gcy0+bWJfeSAqIHMtPm1iX3N0cmlkZSArIHMtPm1iX3g7CisKKyAgICBpZiAoQ09ORklHX1hWTUMgJiYKKyAgICAgICAgcy0+YXZjdHgtPmh3YWNjZWwgJiYgcy0+YXZjdHgtPmh3YWNjZWwtPmRlY29kZV9tYikgeworICAgICAgICBzLT5hdmN0eC0+aHdhY2NlbC0+ZGVjb2RlX21iKHMpOy8veHZtYyB1c2VzIHBibG9ja3MKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKHMtPmF2Y3R4LT5kZWJ1ZyZGRl9ERUJVR19EQ1RfQ09FRkYpIHsKKyAgICAgICAvKiBwcmludCBEQ1QgY29lZmZpY2llbnRzICovCisgICAgICAgaW50IGksajsKKyAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkRDVCBjb2VmZnMgb2YgTUIgYXQgJWR4JWQ6XG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICBmb3IoaT0wOyBpPDY7IGkrKyl7CisgICAgICAgICAgIGZvcihqPTA7IGo8NjQ7IGorKyl7CisgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIiU1ZCIsCisgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbaV1bcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2pdXSk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3h5XSA9IHMtPnFzY2FsZTsKKworICAgIC8qIHVwZGF0ZSBEQyBwcmVkaWN0b3JzIGZvciBQIG1hY3JvYmxvY2tzICovCisgICAgaWYgKCFzLT5tYl9pbnRyYSkgeworICAgICAgICBpZiAoIWlzX21wZWcxMiAmJiAocy0+aDI2M19wcmVkIHx8IHMtPmgyNjNfYWljKSkgeworICAgICAgICAgICAgaWYocy0+bWJpbnRyYV90YWJsZVttYl94eV0pCisgICAgICAgICAgICAgICAgZmZfY2xlYW5faW50cmFfdGFibGVfZW50cmllcyhzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPmxhc3RfZGNbMF0gPQorICAgICAgICAgICAgcy0+bGFzdF9kY1sxXSA9CisgICAgICAgICAgICBzLT5sYXN0X2RjWzJdID0gMTI4IDw8IHMtPmludHJhX2RjX3ByZWNpc2lvbjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghaXNfbXBlZzEyICYmIChzLT5oMjYzX3ByZWQgfHwgcy0+aDI2M19haWMpKQorICAgICAgICBzLT5tYmludHJhX3RhYmxlW21iX3h5XT0xOworCisgICAgaWYgKCAgIChzLT5mbGFncyZDT0RFQ19GTEFHX1BTTlIpCisgICAgICAgIHx8IHMtPmF2Y3R4LT5mcmFtZV9za2lwX3RocmVzaG9sZCB8fCBzLT5hdmN0eC0+ZnJhbWVfc2tpcF9mYWN0b3IKKyAgICAgICAgfHwgIShzLT5lbmNvZGluZyAmJiAocy0+aW50cmFfb25seSB8fCBzLT5waWN0X3R5cGU9PUFWX1BJQ1RVUkVfVFlQRV9CKSAmJiBzLT5hdmN0eC0+bWJfZGVjaXNpb24gIT0gRkZfTUJfREVDSVNJT05fUkQpKSB7IC8vRklYTUUgcHJlY2FsYworICAgICAgICB1aW50OF90ICpkZXN0X3ksICpkZXN0X2NiLCAqZGVzdF9jcjsKKyAgICAgICAgaW50IGRjdF9saW5lc2l6ZSwgZGN0X29mZnNldDsKKyAgICAgICAgb3BfcGl4ZWxzX2Z1bmMgKCpvcF9waXgpWzRdOworICAgICAgICBxcGVsX21jX2Z1bmMgKCpvcF9xcGl4KVsxNl07CisgICAgICAgIGNvbnN0IGludCBsaW5lc2l6ZSAgID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWzBdOyAvL25vdCBzLT5saW5lc2l6ZSBhcyB0aGlzIHdvdWxkIGJlIHdyb25nIGZvciBmaWVsZCBwaWNzCisgICAgICAgIGNvbnN0IGludCB1dmxpbmVzaXplID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWzFdOworICAgICAgICBjb25zdCBpbnQgcmVhZGFibGU9IHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQiB8fCBzLT5lbmNvZGluZyB8fCBzLT5hdmN0eC0+ZHJhd19ob3Jpel9iYW5kIHx8IGxvd3Jlc19mbGFnOworICAgICAgICBjb25zdCBpbnQgYmxvY2tfc2l6ZT0gbG93cmVzX2ZsYWcgPyA4Pj5zLT5hdmN0eC0+bG93cmVzIDogODsKKworICAgICAgICAvKiBhdm9pZCBjb3B5IGlmIG1hY3JvYmxvY2sgc2tpcHBlZCBpbiBsYXN0IGZyYW1lIHRvbyAqLworICAgICAgICAvKiBza2lwIG9ubHkgZHVyaW5nIGRlY29kaW5nIGFzIHdlIG1pZ2h0IHRyYXNoIHRoZSBidWZmZXJzIGR1cmluZyBlbmNvZGluZyBhIGJpdCAqLworICAgICAgICBpZighcy0+ZW5jb2RpbmcpeworICAgICAgICAgICAgdWludDhfdCAqbWJza2lwX3B0ciA9ICZzLT5tYnNraXBfdGFibGVbbWJfeHldOworCisgICAgICAgICAgICBpZiAocy0+bWJfc2tpcHBlZCkgeworICAgICAgICAgICAgICAgIHMtPm1iX3NraXBwZWQ9IDA7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihzLT5waWN0X3R5cGUhPUFWX1BJQ1RVUkVfVFlQRV9JKTsKKyAgICAgICAgICAgICAgICAqbWJza2lwX3B0ciA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYoIXMtPmN1cnJlbnRfcGljdHVyZS5yZWZlcmVuY2UpIHsKKyAgICAgICAgICAgICAgICAqbWJza2lwX3B0ciA9IDE7CisgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgKm1ic2tpcF9wdHIgPSAwOyAvKiBub3Qgc2tpcHBlZCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGN0X2xpbmVzaXplID0gbGluZXNpemUgPDwgcy0+aW50ZXJsYWNlZF9kY3Q7CisgICAgICAgIGRjdF9vZmZzZXQgICA9IHMtPmludGVybGFjZWRfZGN0ID8gbGluZXNpemUgOiBsaW5lc2l6ZSAqIGJsb2NrX3NpemU7CisKKyAgICAgICAgaWYocmVhZGFibGUpeworICAgICAgICAgICAgZGVzdF95PSAgcy0+ZGVzdFswXTsKKyAgICAgICAgICAgIGRlc3RfY2I9IHMtPmRlc3RbMV07CisgICAgICAgICAgICBkZXN0X2NyPSBzLT5kZXN0WzJdOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGRlc3RfeSA9IHMtPmJfc2NyYXRjaHBhZDsKKyAgICAgICAgICAgIGRlc3RfY2I9IHMtPmJfc2NyYXRjaHBhZCsxNipsaW5lc2l6ZTsKKyAgICAgICAgICAgIGRlc3RfY3I9IHMtPmJfc2NyYXRjaHBhZCszMipsaW5lc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcy0+bWJfaW50cmEpIHsKKyAgICAgICAgICAgIC8qIG1vdGlvbiBoYW5kbGluZyAqLworICAgICAgICAgICAgLyogZGVjb2Rpbmcgb3IgbW9yZSB0aGFuIG9uZSBtYl90eXBlIChNQyB3YXMgYWxyZWFkeSBkb25lIG90aGVyd2lzZSkgKi8KKyAgICAgICAgICAgIGlmKCFzLT5lbmNvZGluZyl7CisKKyAgICAgICAgICAgICAgICBpZihIQVZFX1RIUkVBRFMgJiYgcy0+YXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSZGRl9USFJFQURfRlJBTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm12X2RpciAmIE1WX0RJUl9GT1JXQVJEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnMtPmxhc3RfcGljdHVyZV9wdHItPnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21wdl9sb3dlc3RfcmVmZXJlbmNlZF9yb3cocywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm12X2RpciAmIE1WX0RJUl9CQUNLV0FSRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKCZzLT5uZXh0X3BpY3R1cmVfcHRyLT50ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9tcHZfbG93ZXN0X3JlZmVyZW5jZWRfcm93KHMsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYobG93cmVzX2ZsYWcpeworICAgICAgICAgICAgICAgICAgICBoMjY0X2Nocm9tYV9tY19mdW5jICpvcF9waXggPSBzLT5oMjY0Y2hyb21hLnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tdl9kaXIgJiBNVl9ESVJfRk9SV0FSRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTVBWX21vdGlvbl9sb3dyZXMocywgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLCAwLCBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YSwgb3BfcGl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wX3BpeCA9IHMtPmgyNjRjaHJvbWEuYXZnX2gyNjRfY2hyb21hX3BpeGVsc190YWI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm12X2RpciAmIE1WX0RJUl9CQUNLV0FSRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTVBWX21vdGlvbl9sb3dyZXMocywgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLCAxLCBzLT5uZXh0X3BpY3R1cmUuZi0+ZGF0YSwgb3BfcGl4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBvcF9xcGl4ID0gcy0+bWUucXBlbF9wdXQ7CisgICAgICAgICAgICAgICAgICAgIGlmICgoIXMtPm5vX3JvdW5kaW5nKSB8fCBzLT5waWN0X3R5cGU9PUFWX1BJQ1RVUkVfVFlQRV9CKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wX3BpeCA9IHMtPmhkc3AucHV0X3BpeGVsc190YWI7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgb3BfcGl4ID0gcy0+aGRzcC5wdXRfbm9fcm5kX3BpeGVsc190YWI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm12X2RpciAmIE1WX0RJUl9GT1JXQVJEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmZl9tcHZfbW90aW9uKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgMCwgcy0+bGFzdF9waWN0dXJlLmYtPmRhdGEsIG9wX3BpeCwgb3BfcXBpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcF9waXggPSBzLT5oZHNwLmF2Z19waXhlbHNfdGFiOworICAgICAgICAgICAgICAgICAgICAgICAgb3BfcXBpeD0gcy0+bWUucXBlbF9hdmc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm12X2RpciAmIE1WX0RJUl9CQUNLV0FSRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXB2X21vdGlvbihzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIDEsIHMtPm5leHRfcGljdHVyZS5mLT5kYXRhLCBvcF9waXgsIG9wX3FwaXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBza2lwIGRlcXVhbnQgLyBpZGN0IGlmIHdlIGFyZSByZWFsbHkgbGF0ZSA7KSAqLworICAgICAgICAgICAgaWYocy0+YXZjdHgtPnNraXBfaWRjdCl7CisgICAgICAgICAgICAgICAgaWYoICAocy0+YXZjdHgtPnNraXBfaWRjdCA+PSBBVkRJU0NBUkRfTk9OUkVGICYmIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgICAgICAgICAgICB8fChzLT5hdmN0eC0+c2tpcF9pZGN0ID49IEFWRElTQ0FSRF9OT05LRVkgJiYgcy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JKQorICAgICAgICAgICAgICAgICAgIHx8IHMtPmF2Y3R4LT5za2lwX2lkY3QgPj0gQVZESVNDQVJEX0FMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBza2lwX2lkY3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGFkZCBkY3QgcmVzaWR1ZSAqLworICAgICAgICAgICAgaWYocy0+ZW5jb2RpbmcgfHwgISggICBzLT5tc21wZWc0X3ZlcnNpb24gfHwgcy0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX01QRUcxVklERU8gfHwgcy0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX01QRUcyVklERU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHMtPmNvZGVjX2lkPT1BVl9DT0RFQ19JRF9NUEVHNCAmJiAhcy0+bXBlZ19xdWFudCkpKXsKKyAgICAgICAgICAgICAgICBhZGRfZGVxdWFudF9kY3QocywgYmxvY2tbMF0sIDAsIGRlc3RfeSAgICAgICAgICAgICAgICAgICAgICAgICAgLCBkY3RfbGluZXNpemUsIHMtPnFzY2FsZSk7CisgICAgICAgICAgICAgICAgYWRkX2RlcXVhbnRfZGN0KHMsIGJsb2NrWzFdLCAxLCBkZXN0X3kgICAgICAgICAgICAgICsgYmxvY2tfc2l6ZSwgZGN0X2xpbmVzaXplLCBzLT5xc2NhbGUpOworICAgICAgICAgICAgICAgIGFkZF9kZXF1YW50X2RjdChzLCBibG9ja1syXSwgMiwgZGVzdF95ICsgZGN0X29mZnNldCAgICAgICAgICAgICAsIGRjdF9saW5lc2l6ZSwgcy0+cXNjYWxlKTsKKyAgICAgICAgICAgICAgICBhZGRfZGVxdWFudF9kY3QocywgYmxvY2tbM10sIDMsIGRlc3RfeSArIGRjdF9vZmZzZXQgKyBibG9ja19zaXplLCBkY3RfbGluZXNpemUsIHMtPnFzY2FsZSk7CisKKyAgICAgICAgICAgICAgICBpZighQ09ORklHX0dSQVkgfHwgIShzLT5mbGFncyZDT0RFQ19GTEFHX0dSQVkpKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmNocm9tYV95X3NoaWZ0KXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9kZXF1YW50X2RjdChzLCBibG9ja1s0XSwgNCwgZGVzdF9jYiwgdXZsaW5lc2l6ZSwgcy0+Y2hyb21hX3FzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZGVxdWFudF9kY3QocywgYmxvY2tbNV0sIDUsIGRlc3RfY3IsIHV2bGluZXNpemUsIHMtPmNocm9tYV9xc2NhbGUpOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZSA+Pj0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRjdF9vZmZzZXQgPj49MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9kZXF1YW50X2RjdChzLCBibG9ja1s0XSwgNCwgZGVzdF9jYiwgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZSwgcy0+Y2hyb21hX3FzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZGVxdWFudF9kY3QocywgYmxvY2tbNV0sIDUsIGRlc3RfY3IsICAgICAgICAgICAgICBkY3RfbGluZXNpemUsIHMtPmNocm9tYV9xc2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2RlcXVhbnRfZGN0KHMsIGJsb2NrWzZdLCA2LCBkZXN0X2NiICsgZGN0X29mZnNldCwgZGN0X2xpbmVzaXplLCBzLT5jaHJvbWFfcXNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9kZXF1YW50X2RjdChzLCBibG9ja1s3XSwgNywgZGVzdF9jciArIGRjdF9vZmZzZXQsIGRjdF9saW5lc2l6ZSwgcy0+Y2hyb21hX3FzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYoaXNfbXBlZzEyIHx8IChzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XTVYyKSl7CisgICAgICAgICAgICAgICAgYWRkX2RjdChzLCBibG9ja1swXSwgMCwgZGVzdF95ICAgICAgICAgICAgICAgICAgICAgICAgICAsIGRjdF9saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgYWRkX2RjdChzLCBibG9ja1sxXSwgMSwgZGVzdF95ICAgICAgICAgICAgICArIGJsb2NrX3NpemUsIGRjdF9saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgYWRkX2RjdChzLCBibG9ja1syXSwgMiwgZGVzdF95ICsgZGN0X29mZnNldCAgICAgICAgICAgICAsIGRjdF9saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgYWRkX2RjdChzLCBibG9ja1szXSwgMywgZGVzdF95ICsgZGN0X29mZnNldCArIGJsb2NrX3NpemUsIGRjdF9saW5lc2l6ZSk7CisKKyAgICAgICAgICAgICAgICBpZighQ09ORklHX0dSQVkgfHwgIShzLT5mbGFncyZDT0RFQ19GTEFHX0dSQVkpKXsKKyAgICAgICAgICAgICAgICAgICAgaWYocy0+Y2hyb21hX3lfc2hpZnQpey8vQ2hyb21hNDIwCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZGN0KHMsIGJsb2NrWzRdLCA0LCBkZXN0X2NiLCB1dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9kY3QocywgYmxvY2tbNV0sIDUsIGRlc3RfY3IsIHV2bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vY2hyb21hNDIyCisgICAgICAgICAgICAgICAgICAgICAgICBkY3RfbGluZXNpemUgPSB1dmxpbmVzaXplIDw8IHMtPmludGVybGFjZWRfZGN0OworICAgICAgICAgICAgICAgICAgICAgICAgZGN0X29mZnNldCAgID0gcy0+aW50ZXJsYWNlZF9kY3QgPyB1dmxpbmVzaXplIDogdXZsaW5lc2l6ZSpibG9ja19zaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZGN0KHMsIGJsb2NrWzRdLCA0LCBkZXN0X2NiLCBkY3RfbGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2RjdChzLCBibG9ja1s1XSwgNSwgZGVzdF9jciwgZGN0X2xpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9kY3QocywgYmxvY2tbNl0sIDYsIGRlc3RfY2IrZGN0X29mZnNldCwgZGN0X2xpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9kY3QocywgYmxvY2tbN10sIDcsIGRlc3RfY3IrZGN0X29mZnNldCwgZGN0X2xpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFzLT5jaHJvbWFfeF9zaGlmdCl7Ly9DaHJvbWE0NDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZGN0KHMsIGJsb2NrWzhdLCA4LCBkZXN0X2NiK2Jsb2NrX3NpemUsIGRjdF9saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2RjdChzLCBibG9ja1s5XSwgOSwgZGVzdF9jcitibG9ja19zaXplLCBkY3RfbGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9kY3QocywgYmxvY2tbMTBdLCAxMCwgZGVzdF9jYitibG9ja19zaXplK2RjdF9vZmZzZXQsIGRjdF9saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2RjdChzLCBibG9ja1sxMV0sIDExLCBkZXN0X2NyK2Jsb2NrX3NpemUrZGN0X29mZnNldCwgZGN0X2xpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0vL2ZpIGdyYXkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKENPTkZJR19XTVYyX0RFQ09ERVIgfHwgQ09ORklHX1dNVjJfRU5DT0RFUikgeworICAgICAgICAgICAgICAgIGZmX3dtdjJfYWRkX21iKHMsIGJsb2NrLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZGN0IG9ubHkgaW4gaW50cmEgYmxvY2sgKi8KKyAgICAgICAgICAgIGlmKHMtPmVuY29kaW5nIHx8ICEocy0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX01QRUcxVklERU8gfHwgcy0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX01QRUcyVklERU8pKXsKKyAgICAgICAgICAgICAgICBwdXRfZGN0KHMsIGJsb2NrWzBdLCAwLCBkZXN0X3kgICAgICAgICAgICAgICAgICAgICAgICAgICwgZGN0X2xpbmVzaXplLCBzLT5xc2NhbGUpOworICAgICAgICAgICAgICAgIHB1dF9kY3QocywgYmxvY2tbMV0sIDEsIGRlc3RfeSAgICAgICAgICAgICAgKyBibG9ja19zaXplLCBkY3RfbGluZXNpemUsIHMtPnFzY2FsZSk7CisgICAgICAgICAgICAgICAgcHV0X2RjdChzLCBibG9ja1syXSwgMiwgZGVzdF95ICsgZGN0X29mZnNldCAgICAgICAgICAgICAsIGRjdF9saW5lc2l6ZSwgcy0+cXNjYWxlKTsKKyAgICAgICAgICAgICAgICBwdXRfZGN0KHMsIGJsb2NrWzNdLCAzLCBkZXN0X3kgKyBkY3Rfb2Zmc2V0ICsgYmxvY2tfc2l6ZSwgZGN0X2xpbmVzaXplLCBzLT5xc2NhbGUpOworCisgICAgICAgICAgICAgICAgaWYoIUNPTkZJR19HUkFZIHx8ICEocy0+ZmxhZ3MmQ09ERUNfRkxBR19HUkFZKSl7CisgICAgICAgICAgICAgICAgICAgIGlmKHMtPmNocm9tYV95X3NoaWZ0KXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9kY3QocywgYmxvY2tbNF0sIDQsIGRlc3RfY2IsIHV2bGluZXNpemUsIHMtPmNocm9tYV9xc2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2RjdChzLCBibG9ja1s1XSwgNSwgZGVzdF9jciwgdXZsaW5lc2l6ZSwgcy0+Y2hyb21hX3FzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgZGN0X29mZnNldCA+Pj0xOworICAgICAgICAgICAgICAgICAgICAgICAgZGN0X2xpbmVzaXplID4+PTE7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfZGN0KHMsIGJsb2NrWzRdLCA0LCBkZXN0X2NiLCAgICAgICAgICAgICAgZGN0X2xpbmVzaXplLCBzLT5jaHJvbWFfcXNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9kY3QocywgYmxvY2tbNV0sIDUsIGRlc3RfY3IsICAgICAgICAgICAgICBkY3RfbGluZXNpemUsIHMtPmNocm9tYV9xc2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2RjdChzLCBibG9ja1s2XSwgNiwgZGVzdF9jYiArIGRjdF9vZmZzZXQsIGRjdF9saW5lc2l6ZSwgcy0+Y2hyb21hX3FzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfZGN0KHMsIGJsb2NrWzddLCA3LCBkZXN0X2NyICsgZGN0X29mZnNldCwgZGN0X2xpbmVzaXplLCBzLT5jaHJvbWFfcXNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF95LCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZSwgYmxvY2tbMF0pOworICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF95ICAgICAgICAgICAgICArIGJsb2NrX3NpemUsIGRjdF9saW5lc2l6ZSwgYmxvY2tbMV0pOworICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF95ICsgZGN0X29mZnNldCwgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZSwgYmxvY2tbMl0pOworICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF95ICsgZGN0X29mZnNldCArIGJsb2NrX3NpemUsIGRjdF9saW5lc2l6ZSwgYmxvY2tbM10pOworCisgICAgICAgICAgICAgICAgaWYoIUNPTkZJR19HUkFZIHx8ICEocy0+ZmxhZ3MmQ09ERUNfRkxBR19HUkFZKSl7CisgICAgICAgICAgICAgICAgICAgIGlmKHMtPmNocm9tYV95X3NoaWZ0KXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF9jYiwgdXZsaW5lc2l6ZSwgYmxvY2tbNF0pOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aWRzcC5pZGN0X3B1dChkZXN0X2NyLCB1dmxpbmVzaXplLCBibG9ja1s1XSk7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworCisgICAgICAgICAgICAgICAgICAgICAgICBkY3RfbGluZXNpemUgPSB1dmxpbmVzaXplIDw8IHMtPmludGVybGFjZWRfZGN0OworICAgICAgICAgICAgICAgICAgICAgICAgZGN0X29mZnNldCAgID0gcy0+aW50ZXJsYWNlZF9kY3QgPyB1dmxpbmVzaXplIDogdXZsaW5lc2l6ZSpibG9ja19zaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5pZHNwLmlkY3RfcHV0KGRlc3RfY2IsICAgICAgICAgICAgICBkY3RfbGluZXNpemUsIGJsb2NrWzRdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF9jciwgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZSwgYmxvY2tbNV0pOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aWRzcC5pZGN0X3B1dChkZXN0X2NiICsgZGN0X29mZnNldCwgZGN0X2xpbmVzaXplLCBibG9ja1s2XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5pZHNwLmlkY3RfcHV0KGRlc3RfY3IgKyBkY3Rfb2Zmc2V0LCBkY3RfbGluZXNpemUsIGJsb2NrWzddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFzLT5jaHJvbWFfeF9zaGlmdCl7Ly9DaHJvbWE0NDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pZHNwLmlkY3RfcHV0KGRlc3RfY2IgKyBibG9ja19zaXplLCAgICAgICAgICAgICAgZGN0X2xpbmVzaXplLCBibG9ja1s4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aWRzcC5pZGN0X3B1dChkZXN0X2NyICsgYmxvY2tfc2l6ZSwgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZSwgYmxvY2tbOV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF9jYiArIGJsb2NrX3NpemUgKyBkY3Rfb2Zmc2V0LCBkY3RfbGluZXNpemUsIGJsb2NrWzEwXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aWRzcC5pZGN0X3B1dChkZXN0X2NyICsgYmxvY2tfc2l6ZSArIGRjdF9vZmZzZXQsIGRjdF9saW5lc2l6ZSwgYmxvY2tbMTFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0vL2dyYXkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorc2tpcF9pZGN0OgorICAgICAgICBpZighcmVhZGFibGUpeworICAgICAgICAgICAgcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYlswXVswXShzLT5kZXN0WzBdLCBkZXN0X3kgLCAgIGxpbmVzaXplLDE2KTsKKyAgICAgICAgICAgIHMtPmhkc3AucHV0X3BpeGVsc190YWJbcy0+Y2hyb21hX3hfc2hpZnRdWzBdKHMtPmRlc3RbMV0sIGRlc3RfY2IsIHV2bGluZXNpemUsMTYgPj4gcy0+Y2hyb21hX3lfc2hpZnQpOworICAgICAgICAgICAgcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYltzLT5jaHJvbWFfeF9zaGlmdF1bMF0ocy0+ZGVzdFsyXSwgZGVzdF9jciwgdXZsaW5lc2l6ZSwxNiA+PiBzLT5jaHJvbWFfeV9zaGlmdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZmZfbXB2X2RlY29kZV9tYihNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1sxMl1bNjRdKQoreworI2lmICFDT05GSUdfU01BTEwKKyAgICBpZihzLT5vdXRfZm9ybWF0ID09IEZNVF9NUEVHMSkgeworICAgICAgICBpZihzLT5hdmN0eC0+bG93cmVzKSBtcHZfZGVjb2RlX21iX2ludGVybmFsKHMsIGJsb2NrLCAxLCAxKTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgbXB2X2RlY29kZV9tYl9pbnRlcm5hbChzLCBibG9jaywgMCwgMSk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICBpZihzLT5hdmN0eC0+bG93cmVzKSBtcHZfZGVjb2RlX21iX2ludGVybmFsKHMsIGJsb2NrLCAxLCAwKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgbXB2X2RlY29kZV9tYl9pbnRlcm5hbChzLCBibG9jaywgMCwgMCk7Cit9CisKK3ZvaWQgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQoTXBlZ0VuY0NvbnRleHQgKnMsIGludCB5LCBpbnQgaCkKK3sKKyAgICBmZl9kcmF3X2hvcml6X2JhbmQocy0+YXZjdHgsIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfcGljdHVyZV9wdHIgPyBzLT5sYXN0X3BpY3R1cmVfcHRyLT5mIDogTlVMTCwgeSwgaCwgcy0+cGljdHVyZV9zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpcnN0X2ZpZWxkLCBzLT5sb3dfZGVsYXkpOworfQorCit2b2lkIGZmX2luaXRfYmxvY2tfaW5kZXgoTXBlZ0VuY0NvbnRleHQgKnMpeyAvL0ZJWE1FIG1heWJlIHJlbmFtZQorICAgIGNvbnN0IGludCBsaW5lc2l6ZSAgID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWzBdOyAvL25vdCBzLT5saW5lc2l6ZSBhcyB0aGlzIHdvdWxkIGJlIHdyb25nIGZvciBmaWVsZCBwaWNzCisgICAgY29uc3QgaW50IHV2bGluZXNpemUgPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbMV07CisgICAgY29uc3QgaW50IG1iX3NpemU9IDQgLSBzLT5hdmN0eC0+bG93cmVzOworCisgICAgcy0+YmxvY2tfaW5kZXhbMF09IHMtPmI4X3N0cmlkZSoocy0+bWJfeSoyICAgICkgLSAyICsgcy0+bWJfeCoyOworICAgIHMtPmJsb2NrX2luZGV4WzFdPSBzLT5iOF9zdHJpZGUqKHMtPm1iX3kqMiAgICApIC0gMSArIHMtPm1iX3gqMjsKKyAgICBzLT5ibG9ja19pbmRleFsyXT0gcy0+Yjhfc3RyaWRlKihzLT5tYl95KjIgKyAxKSAtIDIgKyBzLT5tYl94KjI7CisgICAgcy0+YmxvY2tfaW5kZXhbM109IHMtPmI4X3N0cmlkZSoocy0+bWJfeSoyICsgMSkgLSAxICsgcy0+bWJfeCoyOworICAgIHMtPmJsb2NrX2luZGV4WzRdPSBzLT5tYl9zdHJpZGUqKHMtPm1iX3kgKyAxKSAgICAgICAgICAgICAgICArIHMtPmI4X3N0cmlkZSpzLT5tYl9oZWlnaHQqMiArIHMtPm1iX3ggLSAxOworICAgIHMtPmJsb2NrX2luZGV4WzVdPSBzLT5tYl9zdHJpZGUqKHMtPm1iX3kgKyBzLT5tYl9oZWlnaHQgKyAyKSArIHMtPmI4X3N0cmlkZSpzLT5tYl9oZWlnaHQqMiArIHMtPm1iX3ggLSAxOworICAgIC8vYmxvY2tfaW5kZXggaXMgbm90IHVzZWQgYnkgbXBlZzIsIHNvIGl0IGlzIG5vdCBhZmZlY3RlZCBieSBjaHJvbWFfZm9ybWF0CisKKyAgICBzLT5kZXN0WzBdID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMF0gKyAoKHMtPm1iX3ggLSAxKSA8PCAgbWJfc2l6ZSk7CisgICAgcy0+ZGVzdFsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhWzFdICsgKChzLT5tYl94IC0gMSkgPDwgKG1iX3NpemUgLSBzLT5jaHJvbWFfeF9zaGlmdCkpOworICAgIHMtPmRlc3RbMl0gPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVsyXSArICgocy0+bWJfeCAtIDEpIDw8IChtYl9zaXplIC0gcy0+Y2hyb21hX3hfc2hpZnQpKTsKKworICAgIGlmKCEocy0+cGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfQiAmJiBzLT5hdmN0eC0+ZHJhd19ob3Jpel9iYW5kICYmIHMtPnBpY3R1cmVfc3RydWN0dXJlPT1QSUNUX0ZSQU1FKSkKKyAgICB7CisgICAgICAgIGlmKHMtPnBpY3R1cmVfc3RydWN0dXJlPT1QSUNUX0ZSQU1FKXsKKyAgICAgICAgcy0+ZGVzdFswXSArPSBzLT5tYl95ICogICBsaW5lc2l6ZSA8PCBtYl9zaXplOworICAgICAgICBzLT5kZXN0WzFdICs9IHMtPm1iX3kgKiB1dmxpbmVzaXplIDw8IChtYl9zaXplIC0gcy0+Y2hyb21hX3lfc2hpZnQpOworICAgICAgICBzLT5kZXN0WzJdICs9IHMtPm1iX3kgKiB1dmxpbmVzaXplIDw8IChtYl9zaXplIC0gcy0+Y2hyb21hX3lfc2hpZnQpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHMtPmRlc3RbMF0gKz0gKHMtPm1iX3k+PjEpICogICBsaW5lc2l6ZSA8PCBtYl9zaXplOworICAgICAgICAgICAgcy0+ZGVzdFsxXSArPSAocy0+bWJfeT4+MSkgKiB1dmxpbmVzaXplIDw8IChtYl9zaXplIC0gcy0+Y2hyb21hX3lfc2hpZnQpOworICAgICAgICAgICAgcy0+ZGVzdFsyXSArPSAocy0+bWJfeT4+MSkgKiB1dmxpbmVzaXplIDw8IChtYl9zaXplIC0gcy0+Y2hyb21hX3lfc2hpZnQpOworICAgICAgICAgICAgYXZfYXNzZXJ0MSgocy0+bWJfeSYxKSA9PSAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBQZXJtdXRlIGFuIDh4OCBibG9jay4KKyAqIEBwYXJhbSBibG9jayB0aGUgYmxvY2sgd2hpY2ggd2lsbCBiZSBwZXJtdXRlZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHBlcm11dGF0aW9uIHZlY3RvcgorICogQHBhcmFtIHBlcm11dGF0aW9uIHRoZSBwZXJtdXRhdGlvbiB2ZWN0b3IKKyAqIEBwYXJhbSBsYXN0IHRoZSBsYXN0IG5vbiB6ZXJvIGNvZWZmaWNpZW50IGluIHNjYW50YWJsZSBvcmRlciwgdXNlZCB0byBzcGVlZCB0aGUgcGVybXV0YXRpb24gdXAKKyAqIEBwYXJhbSBzY2FudGFibGUgdGhlIHVzZWQgc2NhbnRhYmxlLCB0aGlzIGlzIG9ubHkgdXNlZCB0byBzcGVlZCB0aGUgcGVybXV0YXRpb24gdXAsIHRoZSBibG9jayBpcyBub3QKKyAqICAgICAgICAgICAgICAgICAgKGludmVyc2UpIHBlcm11dGF0ZWQgdG8gc2NhbnRhYmxlIG9yZGVyIQorICovCit2b2lkIGZmX2Jsb2NrX3Blcm11dGUoaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBlcm11dGF0aW9uLCBjb25zdCB1aW50OF90ICpzY2FudGFibGUsIGludCBsYXN0KQoreworICAgIGludCBpOworICAgIGludDE2X3QgdGVtcFs2NF07CisKKyAgICBpZihsYXN0PD0wKSByZXR1cm47CisgICAgLy9pZihwZXJtdXRhdGlvblsxXT09MSkgcmV0dXJuOyAvL0ZJWE1FIGl0IGlzIG9rIGJ1dCBub3QgY2xlYW4gYW5kIG1pZ2h0IGZhaWwgZm9yIHNvbWUgcGVybXV0YXRpb25zCisKKyAgICBmb3IoaT0wOyBpPD1sYXN0OyBpKyspeworICAgICAgICBjb25zdCBpbnQgaj0gc2NhbnRhYmxlW2ldOworICAgICAgICB0ZW1wW2pdPSBibG9ja1tqXTsKKyAgICAgICAgYmxvY2tbal09MDsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPD1sYXN0OyBpKyspeworICAgICAgICBjb25zdCBpbnQgaj0gc2NhbnRhYmxlW2ldOworICAgICAgICBjb25zdCBpbnQgcGVybV9qPSBwZXJtdXRhdGlvbltqXTsKKyAgICAgICAgYmxvY2tbcGVybV9qXT0gdGVtcFtqXTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfbXBlZ19mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpeworICAgIGludCBpOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmICghcyB8fCAhcy0+cGljdHVyZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9QSUNUVVJFX0NPVU5UOyBpKyspCisgICAgICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLCAmcy0+cGljdHVyZVtpXSk7CisgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ciA9IHMtPmxhc3RfcGljdHVyZV9wdHIgPSBzLT5uZXh0X3BpY3R1cmVfcHRyID0gTlVMTDsKKworICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLCAmcy0+Y3VycmVudF9waWN0dXJlKTsKKyAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgJnMtPmxhc3RfcGljdHVyZSk7CisgICAgZmZfbXBlZ191bnJlZl9waWN0dXJlKHMsICZzLT5uZXh0X3BpY3R1cmUpOworCisgICAgcy0+bWJfeD0gcy0+bWJfeT0gMDsKKyAgICBzLT5jbG9zZWRfZ29wPSAwOworCisgICAgcy0+cGFyc2VfY29udGV4dC5zdGF0ZT0gLTE7CisgICAgcy0+cGFyc2VfY29udGV4dC5mcmFtZV9zdGFydF9mb3VuZD0gMDsKKyAgICBzLT5wYXJzZV9jb250ZXh0Lm92ZXJyZWFkPSAwOworICAgIHMtPnBhcnNlX2NvbnRleHQub3ZlcnJlYWRfaW5kZXg9IDA7CisgICAgcy0+cGFyc2VfY29udGV4dC5pbmRleD0gMDsKKyAgICBzLT5wYXJzZV9jb250ZXh0Lmxhc3RfaW5kZXg9IDA7CisgICAgcy0+Yml0c3RyZWFtX2J1ZmZlcl9zaXplPTA7CisgICAgcy0+cHBfdGltZT0wOworfQorCisvKioKKyAqIHNldCBxc2NhbGUgYW5kIHVwZGF0ZSBxc2NhbGUgZGVwZW5kZW50IHZhcmlhYmxlcy4KKyAqLwordm9pZCBmZl9zZXRfcXNjYWxlKE1wZWdFbmNDb250ZXh0ICogcywgaW50IHFzY2FsZSkKK3sKKyAgICBpZiAocXNjYWxlIDwgMSkKKyAgICAgICAgcXNjYWxlID0gMTsKKyAgICBlbHNlIGlmIChxc2NhbGUgPiAzMSkKKyAgICAgICAgcXNjYWxlID0gMzE7CisKKyAgICBzLT5xc2NhbGUgPSBxc2NhbGU7CisgICAgcy0+Y2hyb21hX3FzY2FsZT0gcy0+Y2hyb21hX3FzY2FsZV90YWJsZVtxc2NhbGVdOworCisgICAgcy0+eV9kY19zY2FsZT0gcy0+eV9kY19zY2FsZV90YWJsZVsgcXNjYWxlIF07CisgICAgcy0+Y19kY19zY2FsZT0gcy0+Y19kY19zY2FsZV90YWJsZVsgcy0+Y2hyb21hX3FzY2FsZSBdOworfQorCit2b2lkIGZmX21wdl9yZXBvcnRfZGVjb2RlX3Byb2dyZXNzKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgIXMtPnBhcnRpdGlvbmVkX2ZyYW1lICYmICFzLT5lci5lcnJvcl9vY2N1cnJlZCkKKyAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+dGYsIHMtPm1iX3ksIDApOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVndmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWRmNmYyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvLmgKQEAgLTAsMCArMSw5MTggQEAKKy8qCisgKiBHZW5lcmljIERDVCBiYXNlZCBoeWJyaWQgdmlkZW8gZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBtcGVndmlkZW8gaGVhZGVyLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NUEVHVklERU9fSAorI2RlZmluZSBBVkNPREVDX01QRUdWSURFT19ICisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJsb2NrZHNwLmgiCisjaW5jbHVkZSAiZXJyb3JfcmVzaWxpZW5jZS5oIgorI2luY2x1ZGUgImZkY3Rkc3AuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImgyNjRjaHJvbWEuaCIKKyNpbmNsdWRlICJoMjYzZHNwLmgiCisjaW5jbHVkZSAiaHBlbGRzcC5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJtZV9jbXAuaCIKKyNpbmNsdWRlICJtcGVndmlkZW9kc3AuaCIKKyNpbmNsdWRlICJtcGVndmlkZW9lbmNkc3AuaCIKKyNpbmNsdWRlICJwaXhibG9ja2RzcC5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAicmF0ZWNvbnRyb2wuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJtcGVnMTJkYXRhLmgiCisjaW5jbHVkZSAicXBlbGRzcC5oIgorI2luY2x1ZGUgInJsLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAidmlkZW9kc3AuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZWNvZGUuaCIKKworI2RlZmluZSBGUkFNRV9TS0lQUEVEIDEwMCAvLy88IHJldHVybiB2YWx1ZSBmb3IgaGVhZGVyIHBhcnNlcnMgaWYgZnJhbWUgaXMgbm90IGNvZGVkCisKK2VudW0gT3V0cHV0Rm9ybWF0IHsKKyAgICBGTVRfTVBFRzEsCisgICAgRk1UX0gyNjEsCisgICAgRk1UX0gyNjMsCisgICAgRk1UX01KUEVHLAorfTsKKworI2RlZmluZSBNQVhfRkNPREUgNworI2RlZmluZSBNQVhfTVYgNDA5NgorCisjZGVmaW5lIE1BWF9USFJFQURTIDMyCisjZGVmaW5lIE1BWF9QSUNUVVJFX0NPVU5UIDM2CisKKyNkZWZpbmUgTUFYX0JfRlJBTUVTIDE2CisKKyNkZWZpbmUgTUVfTUFQX1NJWkUgNjQKKworI2RlZmluZSBNQVhfTUJfQllURVMgKDMwKjE2KjE2KjMvOCArIDEyMCkKKworI2RlZmluZSBJTlBMQUNFX09GRlNFVCAxNgorCisjZGVmaW5lIEVER0VfV0lEVEggMTYKKworLyogU3RhcnQgY29kZXMuICovCisjZGVmaW5lIFNFUV9FTkRfQ09ERSAgICAgICAgICAgIDB4MDAwMDAxYjcKKyNkZWZpbmUgU0VRX1NUQVJUX0NPREUgICAgICAgICAgMHgwMDAwMDFiMworI2RlZmluZSBHT1BfU1RBUlRfQ09ERSAgICAgICAgICAweDAwMDAwMWI4CisjZGVmaW5lIFBJQ1RVUkVfU1RBUlRfQ09ERSAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgU0xJQ0VfTUlOX1NUQVJUX0NPREUgICAgMHgwMDAwMDEwMQorI2RlZmluZSBTTElDRV9NQVhfU1RBUlRfQ09ERSAgICAweDAwMDAwMWFmCisjZGVmaW5lIEVYVF9TVEFSVF9DT0RFICAgICAgICAgIDB4MDAwMDAxYjUKKyNkZWZpbmUgVVNFUl9TVEFSVF9DT0RFICAgICAgICAgMHgwMDAwMDFiMgorCisvKiBlbmNvZGluZyBzY2FucyAqLworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfYWx0ZXJuYXRlX2hvcml6b250YWxfc2Nhbls2NF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbls2NF07CisKK3N0cnVjdCBNcGVnRW5jQ29udGV4dDsKKworLyoqCisgKiBQaWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBQaWN0dXJleworICAgIHN0cnVjdCBBVkZyYW1lICpmOworICAgIFRocmVhZEZyYW1lIHRmOworCisgICAgQVZCdWZmZXJSZWYgKnFzY2FsZV90YWJsZV9idWY7CisgICAgaW50OF90ICpxc2NhbGVfdGFibGU7CisKKyAgICBBVkJ1ZmZlclJlZiAqbW90aW9uX3ZhbF9idWZbMl07CisgICAgaW50MTZfdCAoKm1vdGlvbl92YWxbMl0pWzJdOworCisgICAgQVZCdWZmZXJSZWYgKm1iX3R5cGVfYnVmOworICAgIHVpbnQzMl90ICptYl90eXBlOyAgICAgICAgICAvLy88IHR5cGVzIGFuZCBtYWNyb3MgYXJlIGRlZmluZWQgaW4gbXBlZ3V0aWxzLmgKKworICAgIEFWQnVmZmVyUmVmICptYnNraXBfdGFibGVfYnVmOworICAgIHVpbnQ4X3QgKm1ic2tpcF90YWJsZTsKKworICAgIEFWQnVmZmVyUmVmICpyZWZfaW5kZXhfYnVmWzJdOworICAgIGludDhfdCAqcmVmX2luZGV4WzJdOworCisgICAgQVZCdWZmZXJSZWYgKm1iX3Zhcl9idWY7CisgICAgdWludDE2X3QgKm1iX3ZhcjsgICAgICAgICAgIC8vLzwgVGFibGUgZm9yIE1CIHZhcmlhbmNlcworCisgICAgQVZCdWZmZXJSZWYgKm1jX21iX3Zhcl9idWY7CisgICAgdWludDE2X3QgKm1jX21iX3ZhcjsgICAgICAgIC8vLzwgVGFibGUgZm9yIG1vdGlvbiBjb21wZW5zYXRlZCBNQiB2YXJpYW5jZXMKKworICAgIGludCBhbGxvY19tYl93aWR0aDsgICAgICAgICAvLy88IG1iX3dpZHRoIHVzZWQgdG8gYWxsb2NhdGUgdGFibGVzCisgICAgaW50IGFsbG9jX21iX2hlaWdodDsgICAgICAgIC8vLzwgbWJfaGVpZ2h0IHVzZWQgdG8gYWxsb2NhdGUgdGFibGVzCisKKyAgICBBVkJ1ZmZlclJlZiAqbWJfbWVhbl9idWY7CisgICAgdWludDhfdCAqbWJfbWVhbjsgICAgICAgICAgIC8vLzwgVGFibGUgZm9yIE1CIGx1bWluYW5jZQorCisgICAgQVZCdWZmZXJSZWYgKmh3YWNjZWxfcHJpdl9idWY7CisgICAgLyoqCisgICAgICogaGFyZHdhcmUgYWNjZWxlcmF0b3IgcHJpdmF0ZSBkYXRhCisgICAgICovCisgICAgdm9pZCAqaHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisKKyAgICBpbnQgZmllbGRfcGljdHVyZTsgICAgICAgICAgLy8vPCB3aGV0aGVyIG9yIG5vdCB0aGUgcGljdHVyZSB3YXMgZW5jb2RlZCBpbiBzZXBhcmF0ZSBmaWVsZHMKKworICAgIGludDY0X3QgbWJfdmFyX3N1bTsgICAgICAgICAvLy88IHN1bSBvZiBNQiB2YXJpYW5jZSBmb3IgY3VycmVudCBmcmFtZQorICAgIGludDY0X3QgbWNfbWJfdmFyX3N1bTsgICAgICAvLy88IG1vdGlvbiBjb21wZW5zYXRlZCBNQiB2YXJpYW5jZSBmb3IgY3VycmVudCBmcmFtZQorCisgICAgaW50IGJfZnJhbWVfc2NvcmU7CisgICAgaW50IG5lZWRzX3JlYWxsb2M7ICAgICAgICAgIC8vLzwgUGljdHVyZSBuZWVkcyB0byBiZSByZWFsbG9jYXRlZCAoZWcgZHVlIHRvIGEgZnJhbWUgc2l6ZSBjaGFuZ2UpCisKKyAgICBpbnQgcmVmZXJlbmNlOworICAgIGludCBzaGFyZWQ7CisKKyAgICB1aW50NjRfdCBlcnJvcltBVl9OVU1fREFUQV9QT0lOVEVSU107Cit9IFBpY3R1cmU7CisKKy8qKgorICogTW90aW9uIGVzdGltYXRpb24gY29udGV4dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTW90aW9uRXN0Q29udGV4dHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgaW50IHNraXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHNldCBpZiBNRSBpcyBza2lwcGVkIGZvciB0aGUgY3VycmVudCBNQgorICAgIGludCBjb19sb2NhdGVkX212WzRdWzJdOyAgICAgICAgICAgLy8vPCBtdiBmcm9tIGxhc3QgUC1mcmFtZSBmb3IgZGlyZWN0IG1vZGUgTUUKKyAgICBpbnQgZGlyZWN0X2Jhc2lzX212WzRdWzJdOworICAgIHVpbnQ4X3QgKnNjcmF0Y2hwYWQ7ICAgICAgICAgICAgICAgLy8vPCBkYXRhIGFyZWEgZm9yIHRoZSBNRSBhbGdvLCBzbyB0aGF0IHRoZSBNRSBkb2VzIG5vdCBuZWVkIHRvIG1hbGxvYy9mcmVlCisgICAgdWludDhfdCAqYmVzdF9tYjsKKyAgICB1aW50OF90ICp0ZW1wX21iWzJdOworICAgIHVpbnQ4X3QgKnRlbXA7CisgICAgaW50IGJlc3RfYml0czsKKyAgICB1aW50MzJfdCAqbWFwOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgbWFwIHRvIGF2b2lkIGR1cGxpY2F0ZSBldmFsdWF0aW9ucworICAgIHVpbnQzMl90ICpzY29yZV9tYXA7ICAgICAgICAgICAgICAgLy8vPCBtYXAgdG8gc3RvcmUgdGhlIHNjb3JlcworICAgIHVuc2lnbmVkIG1hcF9nZW5lcmF0aW9uOworICAgIGludCBwcmVfcGVuYWx0eV9mYWN0b3I7CisgICAgaW50IHBlbmFsdHlfZmFjdG9yOyAgICAgICAgICAgICAgICAvKio8IGFuIGVzdGltYXRlIG9mIHRoZSBiaXRzIHJlcXVpcmVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSBhIGdpdmVuIG12IHZhbHVlLCBlLmcuICgxLDApIHRha2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBiaXRzIHRoYW4gKDAsMCkuIFdlIGhhdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZSB3aGV0aGVyIGFueSByZWR1Y3Rpb24gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpZHVhbCBpcyB3b3J0aCB0aGUgZXh0cmEgYml0cy4gKi8KKyAgICBpbnQgc3ViX3BlbmFsdHlfZmFjdG9yOworICAgIGludCBtYl9wZW5hbHR5X2ZhY3RvcjsKKyAgICBpbnQgZmxhZ3M7CisgICAgaW50IHN1Yl9mbGFnczsKKyAgICBpbnQgbWJfZmxhZ3M7CisgICAgaW50IHByZV9wYXNzOyAgICAgICAgICAgICAgICAgICAgICAvLy88ID0gMSBmb3IgdGhlIHByZSBwYXNzCisgICAgaW50IGRpYV9zaXplOworICAgIGludCB4bWluOworICAgIGludCB4bWF4OworICAgIGludCB5bWluOworICAgIGludCB5bWF4OworICAgIGludCBwcmVkX3g7CisgICAgaW50IHByZWRfeTsKKyAgICB1aW50OF90ICpzcmNbNF1bNF07CisgICAgdWludDhfdCAqcmVmWzRdWzRdOworICAgIGludCBzdHJpZGU7CisgICAgaW50IHV2c3RyaWRlOworICAgIC8qIHRlbXAgdmFyaWFibGVzIGZvciBwaWN0dXJlIGNvbXBsZXhpdHkgY2FsY3VsYXRpb24gKi8KKyAgICBpbnQ2NF90IG1jX21iX3Zhcl9zdW1fdGVtcDsKKyAgICBpbnQ2NF90IG1iX3Zhcl9zdW1fdGVtcDsKKyAgICBpbnQgc2NlbmVfY2hhbmdlX3Njb3JlOworLyogICAgY21wLCBjaHJvbWFfY21wOyovCisgICAgb3BfcGl4ZWxzX2Z1bmMgKCpocGVsX3B1dClbNF07CisgICAgb3BfcGl4ZWxzX2Z1bmMgKCpocGVsX2F2ZylbNF07CisgICAgcXBlbF9tY19mdW5jICgqcXBlbF9wdXQpWzE2XTsKKyAgICBxcGVsX21jX2Z1bmMgKCpxcGVsX2F2ZylbMTZdOworICAgIHVpbnQ4X3QgKCptdl9wZW5hbHR5KVtNQVhfTVYqMisxXTsgIC8vLzwgYW1vdW50IG9mIGJpdHMgbmVlZGVkIHRvIGVuY29kZSBhIE1WCisgICAgdWludDhfdCAqY3VycmVudF9tdl9wZW5hbHR5OworICAgIGludCAoKnN1Yl9tb3Rpb25fc2VhcmNoKShzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbXhfcHRyLCBpbnQgKm15X3B0ciwgaW50IGRtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGgpOworfU1vdGlvbkVzdENvbnRleHQ7CisKKy8qKgorICogTXBlZ0VuY0NvbnRleHQuCisgKi8KK3R5cGVkZWYgc3RydWN0IE1wZWdFbmNDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKworICAgIGludCB5X2RjX3NjYWxlLCBjX2RjX3NjYWxlOworICAgIGludCBhY19wcmVkOworICAgIGludCBibG9ja19sYXN0X2luZGV4WzEyXTsgIC8vLzwgbGFzdCBub24gemVybyBjb2VmZmljaWVudCBpbiBibG9jaworICAgIGludCBoMjYzX2FpYzsgICAgICAgICAgICAgIC8vLzwgQWR2YW5kZWQgSU5UUkEgQ29kaW5nIChBSUMpCisKKyAgICAvKiBzY2FudGFibGVzICovCisgICAgU2NhblRhYmxlIGludGVyX3NjYW50YWJsZTsgLy8vPCBpZiBpbnRlciA9PSBpbnRyYSB0aGVuIGludHJhIHNob3VsZCBiZSB1c2VkIHRvIHJlZHVjZSB0aGEgY2FjaGUgdXNhZ2UKKyAgICBTY2FuVGFibGUgaW50cmFfc2NhbnRhYmxlOworICAgIFNjYW5UYWJsZSBpbnRyYV9oX3NjYW50YWJsZTsKKyAgICBTY2FuVGFibGUgaW50cmFfdl9zY2FudGFibGU7CisKKyAgICAvKiBXQVJOSU5HOiBjaGFuZ2VzIGFib3ZlIHRoaXMgbGluZSByZXF1aXJlIHVwZGF0ZXMgdG8gaGFyZGNvZGVkCisgICAgICogICAgICAgICAgb2Zmc2V0cyB1c2VkIGluIGFzbS4gKi8KKworICAgIHN0cnVjdCBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgLyogdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGVuY29kaW5nICovCisgICAgaW50IHdpZHRoLCBoZWlnaHQ7Ly8vPCBwaWN0dXJlIHNpemUuIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNgorICAgIGludCBnb3Bfc2l6ZTsKKyAgICBpbnQgaW50cmFfb25seTsgICAvLy88IGlmIHRydWUsIG9ubHkgaW50cmEgcGljdHVyZXMgYXJlIGdlbmVyYXRlZAorICAgIGludCBiaXRfcmF0ZTsgICAgIC8vLzwgd2FudGVkIGJpdCByYXRlCisgICAgZW51bSBPdXRwdXRGb3JtYXQgb3V0X2Zvcm1hdDsgLy8vPCBvdXRwdXQgZm9ybWF0CisgICAgaW50IGgyNjNfcHJlZDsgICAgLy8vPCB1c2UgbXBlZzQvaDI2MyBhYy9kYyBwcmVkaWN0aW9ucworICAgIGludCBwYl9mcmFtZTsgICAgIC8vLzwgUEIgZnJhbWUgbW9kZSAoMCA9IG5vbmUsIDEgPSBiYXNlLCAyID0gaW1wcm92ZWQpCisKKy8qIHRoZSBmb2xsb3dpbmcgY29kZWMgaWQgZmllbGRzIGFyZSBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGNvZGVjX2lkICovCisgICAgaW50IGgyNjNfcGx1czsgICAgLy8vPCBoMjYzIHBsdXMgaGVhZGVycworICAgIGludCBoMjYzX2ZsdjsgICAgIC8vLzwgdXNlIGZsdiBoMjYzIGhlYWRlcgorCisgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQ7ICAgICAvKiBzZWUgQVZfQ09ERUNfSURfeHh4ICovCisgICAgaW50IGZpeGVkX3FzY2FsZTsgLy8vPCBmaXhlZCBxc2NhbGUgaWYgbm9uIHplcm8KKyAgICBpbnQgZW5jb2Rpbmc7ICAgICAvLy88IHRydWUgaWYgd2UgYXJlIGVuY29kaW5nICh2cyBkZWNvZGluZykKKyAgICBpbnQgZmxhZ3M7ICAgICAgICAvLy88IEFWQ29kZWNDb250ZXh0LmZsYWdzIChIUSwgTVY0LCAuLi4pCisgICAgaW50IGZsYWdzMjsgICAgICAgLy8vPCBBVkNvZGVjQ29udGV4dC5mbGFnczIKKyAgICBpbnQgbWF4X2JfZnJhbWVzOyAvLy88IG1heCBudW1iZXIgb2YgYi1mcmFtZXMgZm9yIGVuY29kaW5nCisgICAgaW50IGx1bWFfZWxpbV90aHJlc2hvbGQ7CisgICAgaW50IGNocm9tYV9lbGltX3RocmVzaG9sZDsKKyAgICBpbnQgc3RyaWN0X3N0ZF9jb21wbGlhbmNlOyAvLy88IHN0cmljdGx5IGZvbGxvdyB0aGUgc3RkIChNUEVHNCwgLi4uKQorICAgIGludCB3b3JrYXJvdW5kX2J1Z3M7ICAgICAgIC8vLzwgd29ya2Fyb3VuZCBidWdzIGluIGVuY29kZXJzIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5CisgICAgaW50IGNvZGVjX3RhZzsgICAgICAgICAgICAgLy8vPCBpbnRlcm5hbCBjb2RlY190YWcgdXBwZXIgY2FzZSBjb252ZXJ0ZWQgZnJvbSBhdmN0eCBjb2RlY190YWcKKyAgICBpbnQgc3RyZWFtX2NvZGVjX3RhZzsgICAgICAvLy88IGludGVybmFsIHN0cmVhbV9jb2RlY190YWcgdXBwZXIgY2FzZSBjb252ZXJ0ZWQgZnJvbSBhdmN0eCBzdHJlYW1fY29kZWNfdGFnCisgICAgLyogdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG1hbmFnZWQgaW50ZXJuYWxseSBieSB0aGUgZW5jb2RlciAqLworCisgICAgLyogc2VxdWVuY2UgcGFyYW1ldGVycyAqLworICAgIGludCBjb250ZXh0X2luaXRpYWxpemVkOworICAgIGludCBpbnB1dF9waWN0dXJlX251bWJlcjsgIC8vLzwgdXNlZCB0byBzZXQgcGljLT5kaXNwbGF5X3BpY3R1cmVfbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgZm9yL2J5IGFueXRoaW5nIGVsc2UKKyAgICBpbnQgY29kZWRfcGljdHVyZV9udW1iZXI7ICAvLy88IHVzZWQgdG8gc2V0IHBpYy0+Y29kZWRfcGljdHVyZV9udW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBmb3IvYnkgYW55dGhpbmcgZWxzZQorICAgIGludCBwaWN0dXJlX251bWJlcjsgICAgICAgLy9GSVhNRSByZW1vdmUsIHVuY2xlYXIgZGVmaW5pdGlvbgorICAgIGludCBwaWN0dXJlX2luX2dvcF9udW1iZXI7IC8vLzwgMC0+IGZpcnN0IHBpYyBpbiBnb3AsIC4uLgorICAgIGludCBtYl93aWR0aCwgbWJfaGVpZ2h0OyAgIC8vLzwgbnVtYmVyIG9mIE1CcyBob3Jpem9udGFsbHkgJiB2ZXJ0aWNhbGx5CisgICAgaW50IG1iX3N0cmlkZTsgICAgICAgICAgICAgLy8vPCBtYl93aWR0aCsxIHVzZWQgZm9yIHNvbWUgYXJyYXlzIHRvIGFsbG93IHNpbXBsZSBhZGRyZXNzaW5nIG9mIGxlZnQgJiB0b3AgTUJzIHdpdGhvdXQgc2lnMTEKKyAgICBpbnQgYjhfc3RyaWRlOyAgICAgICAgICAgICAvLy88IDIqbWJfd2lkdGgrMSB1c2VkIGZvciBzb21lIDh4OCBibG9jayBhcnJheXMgdG8gYWxsb3cgc2ltcGxlIGFkZHJlc3NpbmcKKyAgICBpbnQgaF9lZGdlX3Bvcywgdl9lZGdlX3BvczsvLy88IGhvcml6b250YWwgLyB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgcmlnaHQvYm90dG9tIGVkZ2UgKHBpeGVsIHJlcGxpY2F0aW9uKQorICAgIGludCBtYl9udW07ICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIE1CcyBvZiBhIHBpY3R1cmUKKyAgICBwdHJkaWZmX3QgbGluZXNpemU7ICAgICAgICAvLy88IGxpbmUgc2l6ZSwgaW4gYnl0ZXMsIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB3aWR0aAorICAgIHB0cmRpZmZfdCB1dmxpbmVzaXplOyAgICAgIC8vLzwgbGluZSBzaXplLCBmb3IgY2hyb21hIGluIGJ5dGVzLCBtYXkgYmUgZGlmZmVyZW50IGZyb20gd2lkdGgKKyAgICBQaWN0dXJlICpwaWN0dXJlOyAgICAgICAgICAvLy88IG1haW4gcGljdHVyZSBidWZmZXIKKyAgICBQaWN0dXJlICoqaW5wdXRfcGljdHVyZTsgICAvLy88IG5leHQgcGljdHVyZXMgb24gZGlzcGxheSBvcmRlciBmb3IgZW5jb2RpbmcKKyAgICBQaWN0dXJlICoqcmVvcmRlcmVkX2lucHV0X3BpY3R1cmU7IC8vLzwgcG9pbnRlciB0byB0aGUgbmV4dCBwaWN0dXJlcyBpbiBjb2RlZG9yZGVyIGZvciBlbmNvZGluZworCisgICAgaW50NjRfdCB1c2VyX3NwZWNpZmllZF9wdHM7IC8vLzwgbGFzdCBub24temVybyBwdHMgZnJvbSBBVkZyYW1lIHdoaWNoIHdhcyBwYXNzZWQgaW50byBhdmNvZGVjX2VuY29kZV92aWRlbzIoKQorICAgIC8qKgorICAgICAqIHB0cyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgaW5wdXQgZnJhbWUsIHVzZWQgZm9yCisgICAgICogY2FsY3VsYXRpbmcgZHRzIG9mIHRoZSBmaXJzdCBmcmFtZSB3aGVuIHRoZXJlJ3MgYSBkZWxheSAqLworICAgIGludDY0X3QgZHRzX2RlbHRhOworICAgIC8qKgorICAgICAqIHJlb3JkZXJlZCBwdHMgdG8gYmUgdXNlZCBhcyBkdHMgZm9yIHRoZSBuZXh0IG91dHB1dCBmcmFtZSB3aGVuIHRoZXJlJ3MKKyAgICAgKiBhIGRlbGF5ICovCisgICAgaW50NjRfdCByZW9yZGVyZWRfcHRzOworCisgICAgLyoqIGJpdCBvdXRwdXQgKi8KKyAgICBQdXRCaXRDb250ZXh0IHBiOworCisgICAgaW50IHN0YXJ0X21iX3k7ICAgICAgICAgICAgLy8vPCBzdGFydCBtYl95IG9mIHRoaXMgdGhyZWFkIChzbyBjdXJyZW50IHRocmVhZCBzaG91bGQgcHJvY2VzcyBzdGFydF9tYl95IDw9IHJvdyA8IGVuZF9tYl95KQorICAgIGludCBlbmRfbWJfeTsgICAgICAgICAgICAgIC8vLzwgZW5kICAgbWJfeSBvZiB0aGlzIHRocmVhZCAoc28gY3VycmVudCB0aHJlYWQgc2hvdWxkIHByb2Nlc3Mgc3RhcnRfbWJfeSA8PSByb3cgPCBlbmRfbWJfeSkKKyAgICBzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnRocmVhZF9jb250ZXh0W01BWF9USFJFQURTXTsKKyAgICBpbnQgc2xpY2VfY29udGV4dF9jb3VudDsgICAvLy88IG51bWJlciBvZiB1c2VkIHRocmVhZF9jb250ZXh0cworCisgICAgLyoqCisgICAgICogY29weSBvZiB0aGUgcHJldmlvdXMgcGljdHVyZSBzdHJ1Y3R1cmUuCisgICAgICogbm90ZSwgbGluZXNpemUgJiBkYXRhLCBtaWdodCBub3QgbWF0Y2ggdGhlIHByZXZpb3VzIHBpY3R1cmUgKGZvciBmaWVsZCBwaWN0dXJlcykKKyAgICAgKi8KKyAgICBQaWN0dXJlIGxhc3RfcGljdHVyZTsKKworICAgIC8qKgorICAgICAqIGNvcHkgb2YgdGhlIG5leHQgcGljdHVyZSBzdHJ1Y3R1cmUuCisgICAgICogbm90ZSwgbGluZXNpemUgJiBkYXRhLCBtaWdodCBub3QgbWF0Y2ggdGhlIG5leHQgcGljdHVyZSAoZm9yIGZpZWxkIHBpY3R1cmVzKQorICAgICAqLworICAgIFBpY3R1cmUgbmV4dF9waWN0dXJlOworCisgICAgLyoqCisgICAgICogY29weSBvZiB0aGUgc291cmNlIHBpY3R1cmUgc3RydWN0dXJlIGZvciBlbmNvZGluZy4KKyAgICAgKiBub3RlLCBsaW5lc2l6ZSAmIGRhdGEsIG1pZ2h0IG5vdCBtYXRjaCB0aGUgc291cmNlIHBpY3R1cmUgKGZvciBmaWVsZCBwaWN0dXJlcykKKyAgICAgKi8KKyAgICBQaWN0dXJlIG5ld19waWN0dXJlOworCisgICAgLyoqCisgICAgICogY29weSBvZiB0aGUgY3VycmVudCBwaWN0dXJlIHN0cnVjdHVyZS4KKyAgICAgKiBub3RlLCBsaW5lc2l6ZSAmIGRhdGEsIG1pZ2h0IG5vdCBtYXRjaCB0aGUgY3VycmVudCBwaWN0dXJlIChmb3IgZmllbGQgcGljdHVyZXMpCisgICAgICovCisgICAgUGljdHVyZSBjdXJyZW50X3BpY3R1cmU7ICAgIC8vLzwgYnVmZmVyIHRvIHN0b3JlIHRoZSBkZWNvbXByZXNzZWQgY3VycmVudCBwaWN0dXJlCisKKyAgICBQaWN0dXJlICpsYXN0X3BpY3R1cmVfcHRyOyAgICAgLy8vPCBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBwaWN0dXJlLgorICAgIFBpY3R1cmUgKm5leHRfcGljdHVyZV9wdHI7ICAgICAvLy88IHBvaW50ZXIgdG8gdGhlIG5leHQgcGljdHVyZSAoZm9yIGJpZGlyIHByZWQpCisgICAgUGljdHVyZSAqY3VycmVudF9waWN0dXJlX3B0cjsgIC8vLzwgcG9pbnRlciB0byB0aGUgY3VycmVudCBwaWN0dXJlCisgICAgaW50IGxhc3RfZGNbM107ICAgICAgICAgICAgICAgIC8vLzwgbGFzdCBEQyB2YWx1ZXMgZm9yIE1QRUcxCisgICAgaW50MTZfdCAqZGNfdmFsX2Jhc2U7CisgICAgaW50MTZfdCAqZGNfdmFsWzNdOyAgICAgICAgICAgIC8vLzwgdXNlZCBmb3IgbXBlZzQgREMgcHJlZGljdGlvbiwgYWxsIDMgYXJyYXlzIG11c3QgYmUgY29udGludW91cworICAgIGNvbnN0IHVpbnQ4X3QgKnlfZGNfc2NhbGVfdGFibGU7ICAgICAvLy88IHFzY2FsZSAtPiB5X2RjX3NjYWxlIHRhYmxlCisgICAgY29uc3QgdWludDhfdCAqY19kY19zY2FsZV90YWJsZTsgICAgIC8vLzwgcXNjYWxlIC0+IGNfZGNfc2NhbGUgdGFibGUKKyAgICBjb25zdCB1aW50OF90ICpjaHJvbWFfcXNjYWxlX3RhYmxlOyAgLy8vPCBxc2NhbGUgLT4gY2hyb21hX3FzY2FsZSAoaDI2MykKKyAgICB1aW50OF90ICpjb2RlZF9ibG9ja19iYXNlOworICAgIHVpbnQ4X3QgKmNvZGVkX2Jsb2NrOyAgICAgICAgICAvLy88IHVzZWQgZm9yIGNvZGVkIGJsb2NrIHBhdHRlcm4gcHJlZGljdGlvbiAobXNtcGVnNHYzLCB3bXYxKQorICAgIGludDE2X3QgKCphY192YWxfYmFzZSlbMTZdOworICAgIGludDE2X3QgKCphY192YWxbM10pWzE2XTsgICAgICAvLy88IHVzZWQgZm9yIG1wZWc0IEFDIHByZWRpY3Rpb24sIGFsbCAzIGFycmF5cyBtdXN0IGJlIGNvbnRpbnVvdXMKKyAgICBpbnQgbWJfc2tpcHBlZDsgICAgICAgICAgICAgICAgLy8vPCBNVVNUIEJFIFNFVCBvbmx5IGR1cmluZyBERUNPRElORworICAgIHVpbnQ4X3QgKm1ic2tpcF90YWJsZTsgICAgICAgIC8qKjwgdXNlZCB0byBhdm9pZCBjb3B5IGlmIG1hY3JvYmxvY2sgc2tpcHBlZCAoZm9yIGJsYWNrIHJlZ2lvbnMgZm9yIGV4YW1wbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VkIGZvciBiLWZyYW1lIGVuY29kaW5nICYgZGVjb2RpbmcgKGNvbnRhaW5zIHNraXAgdGFibGUgb2YgbmV4dCBQIEZyYW1lKSAqLworICAgIHVpbnQ4X3QgKm1iaW50cmFfdGFibGU7ICAgICAgIC8vLzwgdXNlZCB0byBhdm9pZCBzZXR0aW5nIHthYywgZGMsIGNicH0tcHJlZCBzdHVmZiB0byB6ZXJvIG9uIGludGVyIE1CIGRlY29kaW5nCisgICAgdWludDhfdCAqY2JwX3RhYmxlOyAgICAgICAgICAgLy8vPCB1c2VkIHRvIHN0b3JlIGNicCwgYWNfcHJlZCBmb3IgcGFydGl0aW9uZWQgZGVjb2RpbmcKKyAgICB1aW50OF90ICpwcmVkX2Rpcl90YWJsZTsgICAgICAvLy88IHVzZWQgdG8gc3RvcmUgcHJlZF9kaXIgZm9yIHBhcnRpdGlvbmVkIGRlY29kaW5nCisgICAgdWludDhfdCAqZWRnZV9lbXVfYnVmZmVyOyAgICAgLy8vPCB0ZW1wb3JhcnkgYnVmZmVyIGZvciBpZiBNVnMgcG9pbnQgdG8gb3V0LW9mLWZyYW1lIGRhdGEKKyAgICB1aW50OF90ICpyZF9zY3JhdGNocGFkOyAgICAgICAvLy88IHNjcmF0Y2hwYWQgZm9yIHJhdGUgZGlzdG9ydGlvbiBtYiBkZWNpc2lvbgorICAgIHVpbnQ4X3QgKm9ibWNfc2NyYXRjaHBhZDsKKyAgICB1aW50OF90ICpiX3NjcmF0Y2hwYWQ7ICAgICAgICAvLy88IHNjcmF0Y2hwYWQgdXNlZCBmb3Igd3JpdGluZyBpbnRvIHdyaXRlIG9ubHkgYnVmZmVycworCisgICAgaW50IHFzY2FsZTsgICAgICAgICAgICAgICAgIC8vLzwgUVAKKyAgICBpbnQgY2hyb21hX3FzY2FsZTsgICAgICAgICAgLy8vPCBjaHJvbWEgUVAKKyAgICB1bnNpZ25lZCBpbnQgbGFtYmRhOyAgICAgICAgLy8vPCBsYWdyYW5nZSBtdWx0aXBsZXIgdXNlZCBpbiByYXRlIGRpc3RvcnRpb24KKyAgICB1bnNpZ25lZCBpbnQgbGFtYmRhMjsgICAgICAgLy8vPCAobGFtYmRhKmxhbWJkYSkgPj4gRkZfTEFNQkRBX1NISUZUCisgICAgaW50ICpsYW1iZGFfdGFibGU7CisgICAgaW50IGFkYXB0aXZlX3F1YW50OyAgICAgICAgIC8vLzwgdXNlIGFkYXB0aXZlIHF1YW50aXphdGlvbgorICAgIGludCBkcXVhbnQ7ICAgICAgICAgICAgICAgICAvLy88IHFzY2FsZSBkaWZmZXJlbmNlIHRvIHByZXYgcXNjYWxlCisgICAgaW50IGNsb3NlZF9nb3A7ICAgICAgICAgICAgIC8vLzwgTVBFRzEvMiBHT1AgaXMgY2xvc2VkCisgICAgaW50IHBpY3RfdHlwZTsgICAgICAgICAgICAgIC8vLzwgQVZfUElDVFVSRV9UWVBFX0ksIEFWX1BJQ1RVUkVfVFlQRV9QLCBBVl9QSUNUVVJFX1RZUEVfQiwgLi4uCisgICAgaW50IHZidl9kZWxheTsKKyAgICBpbnQgbGFzdF9waWN0X3R5cGU7IC8vRklYTUUgcmVtb3ZlcworICAgIGludCBsYXN0X25vbl9iX3BpY3RfdHlwZTsgICAvLy88IHVzZWQgZm9yIG1wZWc0IGdtYyBiLWZyYW1lcyAmIHJhdGVjb250cm9sCisgICAgaW50IGRyb3BwYWJsZTsKKyAgICBpbnQgZnJhbWVfcmF0ZV9pbmRleDsKKyAgICBBVlJhdGlvbmFsIG1wZWcyX2ZyYW1lX3JhdGVfZXh0OworICAgIGludCBsYXN0X2xhbWJkYV9mb3JbNV07ICAgICAvLy88IGxhc3QgbGFtYmRhIGZvciBhIHNwZWNpZmljIHBpY3QgdHlwZQorICAgIGludCBza2lwZGN0OyAgICAgICAgICAgICAgICAvLy88IHNraXAgZGN0IGFuZCBjb2RlIHplcm8gcmVzaWR1YWwKKworICAgIC8qIG1vdGlvbiBjb21wZW5zYXRpb24gKi8KKyAgICBpbnQgdW5yZXN0cmljdGVkX212OyAgICAgICAgLy8vPCBtdiBjYW4gcG9pbnQgb3V0c2lkZSBvZiB0aGUgY29kZWQgcGljdHVyZQorICAgIGludCBoMjYzX2xvbmdfdmVjdG9yczsgICAgICAvLy88IHVzZSBob3JyaWJsZSBoMjYzdjEgbG9uZyB2ZWN0b3IgbW9kZQorCisgICAgQmxvY2tEU1BDb250ZXh0IGJkc3A7CisgICAgRkRDVERTUENvbnRleHQgZmRzcDsKKyAgICBIMjY0Q2hyb21hQ29udGV4dCBoMjY0Y2hyb21hOworICAgIEhwZWxEU1BDb250ZXh0IGhkc3A7CisgICAgSURDVERTUENvbnRleHQgaWRzcDsKKyAgICBNRUNtcENvbnRleHQgbWVjYzsKKyAgICBNcGVnVmlkZW9EU1BDb250ZXh0IG1kc3A7CisgICAgTXBlZ3ZpZGVvRW5jRFNQQ29udGV4dCBtcHZlbmNkc3A7CisgICAgUGl4YmxvY2tEU1BDb250ZXh0IHBkc3A7CisgICAgUXBlbERTUENvbnRleHQgcWRzcDsKKyAgICBWaWRlb0RTUENvbnRleHQgdmRzcDsKKyAgICBIMjYzRFNQQ29udGV4dCBoMjYzZHNwOworICAgIGludCBmX2NvZGU7ICAgICAgICAgICAgICAgICAvLy88IGZvcndhcmQgTVYgcmVzb2x1dGlvbgorICAgIGludCBiX2NvZGU7ICAgICAgICAgICAgICAgICAvLy88IGJhY2t3YXJkIE1WIHJlc29sdXRpb24gZm9yIEIgRnJhbWVzIChtcGVnNCkKKyAgICBpbnQxNl90ICgqcF9tdl90YWJsZV9iYXNlKVsyXTsKKyAgICBpbnQxNl90ICgqYl9mb3J3X212X3RhYmxlX2Jhc2UpWzJdOworICAgIGludDE2X3QgKCpiX2JhY2tfbXZfdGFibGVfYmFzZSlbMl07CisgICAgaW50MTZfdCAoKmJfYmlkaXJfZm9yd19tdl90YWJsZV9iYXNlKVsyXTsKKyAgICBpbnQxNl90ICgqYl9iaWRpcl9iYWNrX212X3RhYmxlX2Jhc2UpWzJdOworICAgIGludDE2X3QgKCpiX2RpcmVjdF9tdl90YWJsZV9iYXNlKVsyXTsKKyAgICBpbnQxNl90ICgqcF9maWVsZF9tdl90YWJsZV9iYXNlWzJdWzJdKVsyXTsKKyAgICBpbnQxNl90ICgqYl9maWVsZF9tdl90YWJsZV9iYXNlWzJdWzJdWzJdKVsyXTsKKyAgICBpbnQxNl90ICgqcF9tdl90YWJsZSlbMl07ICAgICAgICAgICAgLy8vPCBNViB0YWJsZSAoMU1WIHBlciBNQikgcC1mcmFtZSBlbmNvZGluZworICAgIGludDE2X3QgKCpiX2ZvcndfbXZfdGFibGUpWzJdOyAgICAgICAvLy88IE1WIHRhYmxlICgxTVYgcGVyIE1CKSBmb3J3YXJkIG1vZGUgYi1mcmFtZSBlbmNvZGluZworICAgIGludDE2X3QgKCpiX2JhY2tfbXZfdGFibGUpWzJdOyAgICAgICAvLy88IE1WIHRhYmxlICgxTVYgcGVyIE1CKSBiYWNrd2FyZCBtb2RlIGItZnJhbWUgZW5jb2RpbmcKKyAgICBpbnQxNl90ICgqYl9iaWRpcl9mb3J3X212X3RhYmxlKVsyXTsgLy8vPCBNViB0YWJsZSAoMU1WIHBlciBNQikgYmlkaXIgbW9kZSBiLWZyYW1lIGVuY29kaW5nCisgICAgaW50MTZfdCAoKmJfYmlkaXJfYmFja19tdl90YWJsZSlbMl07IC8vLzwgTVYgdGFibGUgKDFNViBwZXIgTUIpIGJpZGlyIG1vZGUgYi1mcmFtZSBlbmNvZGluZworICAgIGludDE2X3QgKCpiX2RpcmVjdF9tdl90YWJsZSlbMl07ICAgICAvLy88IE1WIHRhYmxlICgxTVYgcGVyIE1CKSBkaXJlY3QgbW9kZSBiLWZyYW1lIGVuY29kaW5nCisgICAgaW50MTZfdCAoKnBfZmllbGRfbXZfdGFibGVbMl1bMl0pWzJdOyAgIC8vLzwgTVYgdGFibGUgKDJNViBwZXIgTUIpIGludGVybGFjZWQgcC1mcmFtZSBlbmNvZGluZworICAgIGludDE2X3QgKCpiX2ZpZWxkX212X3RhYmxlWzJdWzJdWzJdKVsyXTsvLy88IE1WIHRhYmxlICg0TVYgcGVyIE1CKSBpbnRlcmxhY2VkIGItZnJhbWUgZW5jb2RpbmcKKyAgICB1aW50OF90ICgqcF9maWVsZF9zZWxlY3RfdGFibGVbMl0pOworICAgIHVpbnQ4X3QgKCpiX2ZpZWxkX3NlbGVjdF90YWJsZVsyXVsyXSk7CisgICAgaW50IG1lX21ldGhvZDsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTUUgYWxnb3JpdGhtCisgICAgaW50IG12X2RpcjsKKyNkZWZpbmUgTVZfRElSX0ZPUldBUkQgICAxCisjZGVmaW5lIE1WX0RJUl9CQUNLV0FSRCAgMgorI2RlZmluZSBNVl9ESVJFQ1QgICAgICAgIDQgLy8vPCBiaWRpcmVjdGlvbmFsIG1vZGUgd2hlcmUgdGhlIGRpZmZlcmVuY2UgZXF1YWxzIHRoZSBNViBvZiB0aGUgbGFzdCBQL1MvSS1GcmFtZSAobXBlZzQpCisgICAgaW50IG12X3R5cGU7CisjZGVmaW5lIE1WX1RZUEVfMTZYMTYgICAgICAgMCAgIC8vLzwgMSB2ZWN0b3IgZm9yIHRoZSB3aG9sZSBtYgorI2RlZmluZSBNVl9UWVBFXzhYOCAgICAgICAgIDEgICAvLy88IDQgdmVjdG9ycyAoaDI2MywgbXBlZzQgNE1WKQorI2RlZmluZSBNVl9UWVBFXzE2WDggICAgICAgIDIgICAvLy88IDIgdmVjdG9ycywgb25lIHBlciAxNng4IGJsb2NrCisjZGVmaW5lIE1WX1RZUEVfRklFTEQgICAgICAgMyAgIC8vLzwgMiB2ZWN0b3JzLCBvbmUgcGVyIGZpZWxkCisjZGVmaW5lIE1WX1RZUEVfRE1WICAgICAgICAgNCAgIC8vLzwgMiB2ZWN0b3JzLCBzcGVjaWFsIG1wZWcyIER1YWwgUHJpbWUgVmVjdG9ycworICAgIC8qKm1vdGlvbiB2ZWN0b3JzIGZvciBhIG1hY3JvYmxvY2sKKyAgICAgICBmaXJzdCBjb29yZGluYXRlIDogMCA9IGZvcndhcmQgMSA9IGJhY2t3YXJkCisgICAgICAgc2Vjb25kICIgICAgICAgICA6IGRlcGVuZCBvbiB0eXBlCisgICAgICAgdGhpcmQgICIgICAgICAgICA6IDAgPSB4LCAxID0geQorICAgICovCisgICAgaW50IG12WzJdWzRdWzJdOworICAgIGludCBmaWVsZF9zZWxlY3RbMl1bMl07CisgICAgaW50IGxhc3RfbXZbMl1bMl1bMl07ICAgICAgICAgICAgIC8vLzwgbGFzdCBNViwgdXNlZCBmb3IgTVYgcHJlZGljdGlvbiBpbiBNUEVHMSAmIEItZnJhbWUgTVBFRzQKKyAgICB1aW50OF90ICpmY29kZV90YWI7ICAgICAgICAgICAgICAgLy8vPCBzbWFsbGVzdCBmY29kZSBuZWVkZWQgZm9yIGVhY2ggTVYKKyAgICBpbnQxNl90IGRpcmVjdF9zY2FsZV9tdlsyXVs2NF07ICAgLy8vPCBwcmVjb21wdXRlZCB0byBhdm9pZCBkaXZpc2lvbnMgaW4gZmZfbXBlZzRfc2V0X2RpcmVjdF9tdgorCisgICAgTW90aW9uRXN0Q29udGV4dCBtZTsKKworICAgIGludCBub19yb3VuZGluZzsgIC8qKjwgYXBwbHkgbm8gcm91bmRpbmcgdG8gbW90aW9uIGNvbXBlbnNhdGlvbiAoTVBFRzQsIG1zbXBlZzQsIC4uLikKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBiLWZyYW1lcyByb3VuZGluZyBtb2RlIGlzIGFsd2F5cyAwICovCisKKyAgICAvKiBtYWNyb2Jsb2NrIGxheWVyICovCisgICAgaW50IG1iX3gsIG1iX3k7CisgICAgaW50IG1iX3NraXBfcnVuOworICAgIGludCBtYl9pbnRyYTsKKyAgICB1aW50MTZfdCAqbWJfdHlwZTsgIC8vLzwgVGFibGUgZm9yIGNhbmRpZGF0ZSBNQiB0eXBlcyBmb3IgZW5jb2RpbmcgKGRlZmluZXMgaW4gbXBlZ3V0aWxzLmgpCisKKyAgICBpbnQgYmxvY2tfaW5kZXhbNl07IC8vLzwgaW5kZXggdG8gY3VycmVudCBNQiBpbiBibG9jayBiYXNlZCBhcnJheXMgd2l0aCBlZGdlcworICAgIGludCBibG9ja193cmFwWzZdOworICAgIHVpbnQ4X3QgKmRlc3RbM107CisKKyAgICBpbnQgKm1iX2luZGV4Mnh5OyAgICAgICAgLy8vPCBtYl9pbmRleCAtPiBtYl94ICsgbWJfeSptYl9zdHJpZGUKKworICAgIC8qKiBtYXRyaXggdHJhbnNtaXR0ZWQgaW4gdGhlIGJpdHN0cmVhbSAqLworICAgIHVpbnQxNl90IGludHJhX21hdHJpeFs2NF07CisgICAgdWludDE2X3QgY2hyb21hX2ludHJhX21hdHJpeFs2NF07CisgICAgdWludDE2X3QgaW50ZXJfbWF0cml4WzY0XTsKKyAgICB1aW50MTZfdCBjaHJvbWFfaW50ZXJfbWF0cml4WzY0XTsKKworICAgIGludCBpbnRyYV9xdWFudF9iaWFzOyAgICAvLy88IGJpYXMgZm9yIHRoZSBxdWFudGl6ZXIKKyAgICBpbnQgaW50ZXJfcXVhbnRfYmlhczsgICAgLy8vPCBiaWFzIGZvciB0aGUgcXVhbnRpemVyCisgICAgaW50IG1pbl9xY29lZmY7ICAgICAgICAgIC8vLzwgbWluaW11bSBlbmNvZGFibGUgY29lZmZpY2llbnQKKyAgICBpbnQgbWF4X3Fjb2VmZjsgICAgICAgICAgLy8vPCBtYXhpbXVtIGVuY29kYWJsZSBjb2VmZmljaWVudAorICAgIGludCBhY19lc2NfbGVuZ3RoOyAgICAgICAvLy88IG51bSBvZiBiaXRzIG5lZWRlZCB0byBlbmNvZGUgdGhlIGxvbmdlc3QgZXNjCisgICAgdWludDhfdCAqaW50cmFfYWNfdmxjX2xlbmd0aDsKKyAgICB1aW50OF90ICppbnRyYV9hY192bGNfbGFzdF9sZW5ndGg7CisgICAgdWludDhfdCAqaW50ZXJfYWNfdmxjX2xlbmd0aDsKKyAgICB1aW50OF90ICppbnRlcl9hY192bGNfbGFzdF9sZW5ndGg7CisgICAgdWludDhfdCAqbHVtYV9kY192bGNfbGVuZ3RoOworI2RlZmluZSBVTklfQUNfRU5DX0lOREVYKHJ1bixsZXZlbCkgKChydW4pKjEyOCArIChsZXZlbCkpCisKKyAgICBpbnQgY29kZWRfc2NvcmVbMTJdOworCisgICAgLyoqIHByZWNvbXB1dGVkIG1hdHJpeCAoY29tYmluZSBxc2NhbGUgYW5kIERDVCByZW5vcm0pICovCisgICAgaW50ICgqcV9pbnRyYV9tYXRyaXgpWzY0XTsKKyAgICBpbnQgKCpxX2Nocm9tYV9pbnRyYV9tYXRyaXgpWzY0XTsKKyAgICBpbnQgKCpxX2ludGVyX21hdHJpeClbNjRdOworICAgIC8qKiBpZGVudGljYWwgdG8gdGhlIGFib3ZlIGJ1dCBmb3IgTU1YICYgdGhlc2UgYXJlIG5vdCBwZXJtdXRhdGVkLCBzZWNvbmQgNjQgZW50cmllcyBhcmUgYmlhcyovCisgICAgdWludDE2X3QgKCpxX2ludHJhX21hdHJpeDE2KVsyXVs2NF07CisgICAgdWludDE2X3QgKCpxX2Nocm9tYV9pbnRyYV9tYXRyaXgxNilbMl1bNjRdOworICAgIHVpbnQxNl90ICgqcV9pbnRlcl9tYXRyaXgxNilbMl1bNjRdOworCisgICAgLyogbm9pc2UgcmVkdWN0aW9uICovCisgICAgaW50ICgqZGN0X2Vycm9yX3N1bSlbNjRdOworICAgIGludCBkY3RfY291bnRbMl07CisgICAgdWludDE2X3QgKCpkY3Rfb2Zmc2V0KVs2NF07CisKKyAgICAvKiBiaXQgcmF0ZSBjb250cm9sICovCisgICAgaW50NjRfdCB0b3RhbF9iaXRzOworICAgIGludCBmcmFtZV9iaXRzOyAgICAgICAgICAgICAgICAvLy88IGJpdHMgdXNlZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBpbnQgc3R1ZmZpbmdfYml0czsgICAgICAgICAgICAgLy8vPCBiaXRzIHVzZWQgZm9yIHN0dWZmaW5nCisgICAgaW50IG5leHRfbGFtYmRhOyAgICAgICAgICAgICAgIC8vLzwgbmV4dCBsYW1iZGEgdXNlZCBmb3IgcmV0cnlpbmcgdG8gZW5jb2RlIGEgZnJhbWUKKyAgICBSYXRlQ29udHJvbENvbnRleHQgcmNfY29udGV4dDsgLy8vPCBjb250YWlucyBzdHVmZiBvbmx5IGFjY2Vzc2VkIGluIHJhdGVjb250cm9sLmMKKworICAgIC8qIHN0YXRpc3RpY3MsIHVzZWQgZm9yIDItcGFzcyBlbmNvZGluZyAqLworICAgIGludCBtdl9iaXRzOworICAgIGludCBoZWFkZXJfYml0czsKKyAgICBpbnQgaV90ZXhfYml0czsKKyAgICBpbnQgcF90ZXhfYml0czsKKyAgICBpbnQgaV9jb3VudDsKKyAgICBpbnQgZl9jb3VudDsKKyAgICBpbnQgYl9jb3VudDsKKyAgICBpbnQgc2tpcF9jb3VudDsKKyAgICBpbnQgbWlzY19iaXRzOyAvLy88IGNicCwgbWJfdHlwZQorICAgIGludCBsYXN0X2JpdHM7IC8vLzwgdGVtcCB2YXIgdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIGFib3ZlIHZhcnMKKworICAgIC8qIGVycm9yIGNvbmNlYWxtZW50IC8gcmVzeW5jICovCisgICAgaW50IHJlc3luY19tYl94OyAgICAgICAgICAgICAgICAgLy8vPCB4IHBvc2l0aW9uIG9mIGxhc3QgcmVzeW5jIG1hcmtlcgorICAgIGludCByZXN5bmNfbWJfeTsgICAgICAgICAgICAgICAgIC8vLzwgeSBwb3NpdGlvbiBvZiBsYXN0IHJlc3luYyBtYXJrZXIKKyAgICBHZXRCaXRDb250ZXh0IGxhc3RfcmVzeW5jX2diOyAgICAvLy88IHVzZWQgdG8gc2VhcmNoIGZvciB0aGUgbmV4dCByZXN5bmMgbWFya2VyCisgICAgaW50IG1iX251bV9sZWZ0OyAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgTUJzIGxlZnQgaW4gdGhpcyB2aWRlbyBwYWNrZXQgKGZvciBwYXJ0aXRpb25lZCBTbGljZXMgb25seSkKKyAgICBpbnQgbmV4dF9wX2ZyYW1lX2RhbWFnZWQ7ICAgICAgICAvLy88IHNldCBpZiB0aGUgbmV4dCBwIGZyYW1lIGlzIGRhbWFnZWQsIHRvIGF2b2lkIHNob3dpbmcgdHJhc2hlZCBiIGZyYW1lcworICAgIGludCBlcnJfcmVjb2duaXRpb247CisKKyAgICBQYXJzZUNvbnRleHQgcGFyc2VfY29udGV4dDsKKworICAgIC8qIEguMjYzIHNwZWNpZmljICovCisgICAgaW50IGdvYl9pbmRleDsKKyAgICBpbnQgb2JtYzsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgb3ZlcmxhcHBlZCBibG9jayBtb3Rpb24gY29tcGVuc2F0aW9uCisgICAgaW50IG1iX2luZm87ICAgICAgICAgICAgICAgICAgICAvLy88IGludGVydmFsIGZvciBvdXRwdXR0aW5nIGluZm8gYWJvdXQgbWIgb2Zmc2V0cyBhcyBzaWRlIGRhdGEKKyAgICBpbnQgcHJldl9tYl9pbmZvLCBsYXN0X21iX2luZm87CisgICAgdWludDhfdCAqbWJfaW5mb19wdHI7CisgICAgaW50IG1iX2luZm9fc2l6ZTsKKyAgICBpbnQgZWhjX21vZGU7CisKKyAgICAvKiBILjI2Mysgc3BlY2lmaWMgKi8KKyAgICBpbnQgdW12cGx1czsgICAgICAgICAgICAgICAgICAgIC8vLzwgPT0gSDI2MysgJiYgdW5yZXN0cmljdGVkX212CisgICAgaW50IGgyNjNfYWljX2RpcjsgICAgICAgICAgICAgICAvLy88IEFJQyBkaXJlY3Rpb246IDAgPSBsZWZ0LCAxID0gdG9wCisgICAgaW50IGgyNjNfc2xpY2Vfc3RydWN0dXJlZDsKKyAgICBpbnQgYWx0X2ludGVyX3ZsYzsgICAgICAgICAgICAgIC8vLzwgYWx0ZXJuYXRpdmUgaW50ZXIgdmxjCisgICAgaW50IG1vZGlmaWVkX3F1YW50OworICAgIGludCBsb29wX2ZpbHRlcjsKKyAgICBpbnQgY3VzdG9tX3BjZjsKKworICAgIC8qIG1wZWc0IHNwZWNpZmljICovCisgICAgLy8vPCBudW1iZXIgb2YgYml0cyB0byByZXByZXNlbnQgdGhlIGZyYWN0aW9uYWwgcGFydCBvZiB0aW1lIChlbmNvZGVyIG9ubHkpCisgICAgaW50IHRpbWVfaW5jcmVtZW50X2JpdHM7CisgICAgaW50IGxhc3RfdGltZV9iYXNlOworICAgIGludCB0aW1lX2Jhc2U7ICAgICAgICAgICAgICAgICAgLy8vPCB0aW1lIGluIHNlY29uZHMgb2YgbGFzdCBJLFAsUyBGcmFtZQorICAgIGludDY0X3QgdGltZTsgICAgICAgICAgICAgICAgICAgLy8vPCB0aW1lIG9mIGN1cnJlbnQgZnJhbWUKKyAgICBpbnQ2NF90IGxhc3Rfbm9uX2JfdGltZTsKKyAgICB1aW50MTZfdCBwcF90aW1lOyAgICAgICAgICAgICAgIC8vLzwgdGltZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBsYXN0IDIgcCxzLGkgZnJhbWVzCisgICAgdWludDE2X3QgcGJfdGltZTsgICAgICAgICAgICAgICAvLy88IHRpbWUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgbGFzdCBiIGFuZCBwLHMsaSBmcmFtZQorICAgIHVpbnQxNl90IHBwX2ZpZWxkX3RpbWU7CisgICAgdWludDE2X3QgcGJfZmllbGRfdGltZTsgICAgICAgICAvLy88IGxpa2UgYWJvdmUsIGp1c3QgZm9yIGludGVybGFjZWQKKyAgICBpbnQgcmVhbF9zcHJpdGVfd2FycGluZ19wb2ludHM7CisgICAgaW50IHNwcml0ZV9vZmZzZXRbMl1bMl07ICAgICAgICAgLy8vPCBzcHJpdGUgb2Zmc2V0W2lzQ2hyb21hXVtpc01WWV0KKyAgICBpbnQgc3ByaXRlX2RlbHRhWzJdWzJdOyAgICAgICAgICAvLy88IHNwcml0ZV9kZWx0YSBbaXNZXVtpc01WWV0KKyAgICBpbnQgbWNzZWw7CisgICAgaW50IHF1YW50X3ByZWNpc2lvbjsKKyAgICBpbnQgcXVhcnRlcl9zYW1wbGU7ICAgICAgICAgICAgICAvLy88IDEtPnFwZWwsIDAtPmhhbGYgcGVsIE1FL01DCisgICAgaW50IGFzcGVjdF9yYXRpb19pbmZvOyAvL0ZJWE1FIHJlbW92ZQorICAgIGludCBzcHJpdGVfd2FycGluZ19hY2N1cmFjeTsKKyAgICBpbnQgZGF0YV9wYXJ0aXRpb25pbmc7ICAgICAgICAgICAvLy88IGRhdGEgcGFydGl0aW9uaW5nIGZsYWcgZnJvbSBoZWFkZXIKKyAgICBpbnQgcGFydGl0aW9uZWRfZnJhbWU7ICAgICAgICAgICAvLy88IGlzIGN1cnJlbnQgZnJhbWUgcGFydGl0aW9uZWQKKyAgICBpbnQgbG93X2RlbGF5OyAgICAgICAgICAgICAgICAgICAvLy88IG5vIHJlb3JkZXJpbmcgbmVlZGVkIC8gaGFzIG5vIGItZnJhbWVzCisgICAgaW50IHZvX3R5cGU7CisgICAgUHV0Qml0Q29udGV4dCB0ZXhfcGI7ICAgICAgICAgICAgLy8vPCB1c2VkIGZvciBkYXRhIHBhcnRpdGlvbmVkIFZPUHMKKyAgICBQdXRCaXRDb250ZXh0IHBiMjsgICAgICAgICAgICAgICAvLy88IHVzZWQgZm9yIGRhdGEgcGFydGl0aW9uZWQgVk9QcworICAgIGludCBtcGVnX3F1YW50OworICAgIGludCBwYWRkaW5nX2J1Z19zY29yZTsgICAgICAgICAgICAgLy8vPCB1c2VkIHRvIGRldGVjdCB0aGUgVkVSWSBjb21tb24gcGFkZGluZyBidWcgaW4gTVBFRzQKKworICAgIC8qIGRpdnggc3BlY2lmaWMsIHVzZWQgdG8gd29ya2Fyb3VuZCAobWFueSkgYnVncyBpbiBkaXZ4NSAqLworICAgIGludCBkaXZ4X3BhY2tlZDsKKyAgICB1aW50OF90ICpiaXRzdHJlYW1fYnVmZmVyOyAvL0RpdnggNS4wMSBwdXRzIHNldmVyYWwgZnJhbWVzIGluIGEgc2luZ2xlIG9uZSwgdGhpcyBpcyB1c2VkIHRvIHJlb3JkZXIgdGhlbQorICAgIGludCBiaXRzdHJlYW1fYnVmZmVyX3NpemU7CisgICAgdW5zaWduZWQgaW50IGFsbG9jYXRlZF9iaXRzdHJlYW1fYnVmZmVyX3NpemU7CisKKyAgICAvKiBSVjEwIHNwZWNpZmljICovCisgICAgaW50IHJ2MTBfdmVyc2lvbjsgLy8vPCBSVjEwIHZlcnNpb246IDAgb3IgMworICAgIGludCBydjEwX2ZpcnN0X2RjX2NvZGVkWzNdOworCisgICAgLyogTUpQRUcgc3BlY2lmaWMgKi8KKyAgICBzdHJ1Y3QgTUpwZWdDb250ZXh0ICptanBlZ19jdHg7CisgICAgaW50IGVzY19wb3M7CisKKyAgICAvKiBNU01QRUc0IHNwZWNpZmljICovCisgICAgaW50IG12X3RhYmxlX2luZGV4OworICAgIGludCBybF90YWJsZV9pbmRleDsKKyAgICBpbnQgcmxfY2hyb21hX3RhYmxlX2luZGV4OworICAgIGludCBkY190YWJsZV9pbmRleDsKKyAgICBpbnQgdXNlX3NraXBfbWJfY29kZTsKKyAgICBpbnQgc2xpY2VfaGVpZ2h0OyAgICAgIC8vLzwgaW4gbWFjcm9ibG9ja3MKKyAgICBpbnQgZmlyc3Rfc2xpY2VfbGluZTsgIC8vLzwgdXNlZCBpbiBtcGVnNCB0b28gdG8gaGFuZGxlIHJlc3luYyBtYXJrZXJzCisgICAgaW50IGZsaXBmbG9wX3JvdW5kaW5nOworICAgIGludCBtc21wZWc0X3ZlcnNpb247ICAgLy8vPCAwPW5vdCBtc21wZWc0LCAxPW1wNDEsIDI9bXA0MiwgMz1tcDQzL2RpdngzIDQ9d212MS83IDU9d212Mi84CisgICAgaW50IHBlcl9tYl9ybF90YWJsZTsKKyAgICBpbnQgZXNjM19sZXZlbF9sZW5ndGg7CisgICAgaW50IGVzYzNfcnVuX2xlbmd0aDsKKyAgICAvKiogW21iX2ludHJhXVtpc0Nocm9tYV1bbGV2ZWxdW3J1bl1bbGFzdF0gKi8KKyAgICBpbnQgKCphY19zdGF0cylbMl1bTUFYX0xFVkVMKzFdW01BWF9SVU4rMV1bMl07CisgICAgaW50IGludGVyX2ludHJhX3ByZWQ7CisgICAgaW50IG1zcGVsOworCisgICAgLyogZGVjb21wcmVzc2lvbiBzcGVjaWZpYyAqLworICAgIEdldEJpdENvbnRleHQgZ2I7CisKKyAgICAvKiBNcGVnMSBzcGVjaWZpYyAqLworICAgIGludCBnb3BfcGljdHVyZV9udW1iZXI7ICAvLy88IGluZGV4IG9mIHRoZSBmaXJzdCBwaWN0dXJlIG9mIGEgR09QIGJhc2VkIG9uIGZha2VfcGljX251bSAmIG1wZWcxIHNwZWNpZmljCisgICAgaW50IGxhc3RfbXZfZGlyOyAgICAgICAgIC8vLzwgbGFzdCBtdl9kaXIsIHVzZWQgZm9yIGIgZnJhbWUgZW5jb2RpbmcKKyAgICB1aW50OF90ICp2YnZfZGVsYXlfcHRyOyAgLy8vPCBwb2ludGVyIHRvIHZidl9kZWxheSBpbiB0aGUgYml0c3RyZWFtCisKKyAgICAvKiBNUEVHLTItc3BlY2lmaWMgLSBJIHdpc2hlZCBub3QgdG8gaGF2ZSB0byBzdXBwb3J0IHRoaXMgbWVzcy4gKi8KKyAgICBpbnQgcHJvZ3Jlc3NpdmVfc2VxdWVuY2U7CisgICAgaW50IG1wZWdfZl9jb2RlWzJdWzJdOworCisgICAgLy8gcGljdHVyZSBzdHJ1Y3R1cmUgZGVmaW5lcyBhcmUgbG9hZGVkIGZyb20gbXBlZ3V0aWxzLmgKKyAgICBpbnQgcGljdHVyZV9zdHJ1Y3R1cmU7CisKKyAgICBpbnQgaW50cmFfZGNfcHJlY2lzaW9uOworICAgIGludCBmcmFtZV9wcmVkX2ZyYW1lX2RjdDsKKyAgICBpbnQgdG9wX2ZpZWxkX2ZpcnN0OworICAgIGludCBjb25jZWFsbWVudF9tb3Rpb25fdmVjdG9yczsKKyAgICBpbnQgcV9zY2FsZV90eXBlOworICAgIGludCBpbnRyYV92bGNfZm9ybWF0OworICAgIGludCBhbHRlcm5hdGVfc2NhbjsKKyAgICBpbnQgc2VxX2Rpc3BfZXh0OworICAgIGludCByZXBlYXRfZmlyc3RfZmllbGQ7CisgICAgaW50IGNocm9tYV80MjBfdHlwZTsKKyAgICBpbnQgY2hyb21hX2Zvcm1hdDsKKyNkZWZpbmUgQ0hST01BXzQyMCAxCisjZGVmaW5lIENIUk9NQV80MjIgMgorI2RlZmluZSBDSFJPTUFfNDQ0IDMKKyAgICBpbnQgY2hyb21hX3hfc2hpZnQ7Ly9kZXBlbmQgb24gcGl4X2Zvcm1hdCwgdGhhdCBkZXBlbmQgb24gY2hyb21hX2Zvcm1hdAorICAgIGludCBjaHJvbWFfeV9zaGlmdDsKKworICAgIGludCBwcm9ncmVzc2l2ZV9mcmFtZTsKKyAgICBpbnQgZnVsbF9wZWxbMl07CisgICAgaW50IGludGVybGFjZWRfZGN0OworICAgIGludCBmaXJzdF9maWVsZDsgICAgICAgICAvLy88IGlzIDEgZm9yIHRoZSBmaXJzdCBmaWVsZCBvZiBhIGZpZWxkIHBpY3R1cmUgMCBvdGhlcndpc2UKKyAgICBpbnQgZHJvcF9mcmFtZV90aW1lY29kZTsgLy8vPCB0aW1lY29kZSBpcyBpbiBkcm9wIGZyYW1lIGZvcm1hdC4KKyAgICBpbnQgc2Nhbl9vZmZzZXQ7ICAgICAgICAgLy8vPCByZXNlcnZlIHNwYWNlIGZvciBTVkNEIHNjYW4gb2Zmc2V0IHVzZXIgZGF0YS4KKworICAgIC8qIFJUUCBzcGVjaWZpYyAqLworICAgIGludCBydHBfbW9kZTsKKworICAgIGNoYXIgKnRjX29wdF9zdHI7ICAgICAgICAvLy88IHRpbWVjb2RlIG9wdGlvbiBzdHJpbmcKKyAgICBBVlRpbWVjb2RlIHRjOyAgICAgICAgICAgLy8vPCB0aW1lY29kZSBjb250ZXh0CisKKyAgICB1aW50OF90ICpwdHJfbGFzdGdvYjsKKyAgICBpbnQgc3dhcF91djsgICAgICAgICAgICAgLy92Y3IyIGNvZGVjIGlzIGFuIE1QRUctMiB2YXJpYW50IHdpdGggVSBhbmQgViBzd2FwcGVkCisgICAgaW50IHBhY2tfcGJsb2NrczsgICAgICAgIC8veHZtYyBuZWVkcyB0byBrZWVwIGJsb2NrcyB3aXRob3V0IGdhcHMuCisgICAgaW50MTZfdCAoKnBibG9ja3NbMTJdKVs2NF07CisKKyAgICBpbnQxNl90ICgqYmxvY2spWzY0XTsgLy8vPCBwb2ludHMgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgYmxvY2tzCisgICAgaW50MTZfdCAoKmJsb2NrcylbMTJdWzY0XTsgLy8gZm9yIEhRIG1vZGUgd2UgbmVlZCB0byBrZWVwIHRoZSBiZXN0IGJsb2NrCisgICAgaW50ICgqZGVjb2RlX21iKShzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgYmxvY2tbNl1bNjRdKTsgLy8gdXNlZCBieSBzb21lIGNvZGVjcyB0byBhdm9pZCBhIHN3aXRjaCgpCisjZGVmaW5lIFNMSUNFX09LICAgICAgICAgMAorI2RlZmluZSBTTElDRV9FUlJPUiAgICAgLTEKKyNkZWZpbmUgU0xJQ0VfRU5EICAgICAgIC0yIC8vLzxlbmQgbWFya2VyIGZvdW5kCisjZGVmaW5lIFNMSUNFX05PRU5EICAgICAtMyAvLy88bm8gZW5kIG1hcmtlciBvciBlcnJvciBmb3VuZCBidXQgbWIgY291bnQgZXhjZWVkZWQKKworICAgIHZvaWQgKCpkY3RfdW5xdWFudGl6ZV9tcGVnMV9pbnRyYSkoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2svKmFsaWduIDE2Ki8sIGludCBuLCBpbnQgcXNjYWxlKTsKKyAgICB2b2lkICgqZGN0X3VucXVhbnRpemVfbXBlZzFfaW50ZXIpKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLyphbGlnbiAxNiovLCBpbnQgbiwgaW50IHFzY2FsZSk7CisgICAgdm9pZCAoKmRjdF91bnF1YW50aXplX21wZWcyX2ludHJhKShzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jay8qYWxpZ24gMTYqLywgaW50IG4sIGludCBxc2NhbGUpOworICAgIHZvaWQgKCpkY3RfdW5xdWFudGl6ZV9tcGVnMl9pbnRlcikoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2svKmFsaWduIDE2Ki8sIGludCBuLCBpbnQgcXNjYWxlKTsKKyAgICB2b2lkICgqZGN0X3VucXVhbnRpemVfaDI2M19pbnRyYSkoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2svKmFsaWduIDE2Ki8sIGludCBuLCBpbnQgcXNjYWxlKTsKKyAgICB2b2lkICgqZGN0X3VucXVhbnRpemVfaDI2M19pbnRlcikoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2svKmFsaWduIDE2Ki8sIGludCBuLCBpbnQgcXNjYWxlKTsKKyAgICB2b2lkICgqZGN0X3VucXVhbnRpemVfaW50cmEpKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywgLy8gdW5xdWFudGl6ZXIgdG8gdXNlIChtcGVnNCBjYW4gdXNlIGJvdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jay8qYWxpZ24gMTYqLywgaW50IG4sIGludCBxc2NhbGUpOworICAgIHZvaWQgKCpkY3RfdW5xdWFudGl6ZV9pbnRlcikoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLCAvLyB1bnF1YW50aXplciB0byB1c2UgKG1wZWc0IGNhbiB1c2UgYm90aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLyphbGlnbiAxNiovLCBpbnQgbiwgaW50IHFzY2FsZSk7CisgICAgaW50ICgqZGN0X3F1YW50aXplKShzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgKmJsb2NrLyphbGlnbiAxNiovLCBpbnQgbiwgaW50IHFzY2FsZSwgaW50ICpvdmVyZmxvdyk7CisgICAgaW50ICgqZmFzdF9kY3RfcXVhbnRpemUpKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2svKmFsaWduIDE2Ki8sIGludCBuLCBpbnQgcXNjYWxlLCBpbnQgKm92ZXJmbG93KTsKKyAgICB2b2lkICgqZGVub2lzZV9kY3QpKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2spOworCisgICAgaW50IG1wdl9mbGFnczsgICAgICAvLy88IGZsYWdzIHNldCBieSBwcml2YXRlIG9wdGlvbnMKKyAgICBpbnQgcXVhbnRpemVyX25vaXNlX3NoYXBpbmc7CisKKyAgICAvKioKKyAgICAgKiByYXRlY29udHJvbCBxbWluIHFtYXggbGltaXRpbmcgbWV0aG9kCisgICAgICogMC0+IGNsaXBwaW5nLCAxLT4gdXNlIGEgbmljZSBjb250aW51b3VzIGZ1bmN0aW9uIHRvIGxpbWl0IHFzY2FsZSB3aXRoaW4gcW1pbi9xbWF4LgorICAgICAqLworICAgIGZsb2F0IHJjX3FzcXVpc2g7CisgICAgZmxvYXQgcmNfcW1vZF9hbXA7CisgICAgaW50ICAgcmNfcW1vZF9mcmVxOworICAgIGZsb2F0IHJjX2luaXRpYWxfY3BseDsKKyAgICBmbG9hdCByY19idWZmZXJfYWdncmVzc2l2aXR5OworICAgIGZsb2F0IGJvcmRlcl9tYXNraW5nOworICAgIGludCBsbWluLCBsbWF4OworCisgICAgY2hhciAqcmNfZXE7CisKKyAgICAvKiB0ZW1wIGJ1ZmZlcnMgZm9yIHJhdGUgY29udHJvbCAqLworICAgIGZsb2F0ICpjcGx4X3RhYiwgKmJpdHNfdGFiOworCisgICAgLyogZmxhZyB0byBpbmRpY2F0ZSBhIHJlaW5pdGlhbGl6YXRpb24gaXMgcmVxdWlyZWQsIGUuZy4gYWZ0ZXIKKyAgICAgKiBhIGZyYW1lIHNpemUgY2hhbmdlICovCisgICAgaW50IGNvbnRleHRfcmVpbml0OworCisgICAgRVJDb250ZXh0IGVyOworCisgICAgaW50IGVycm9yX3JhdGU7CisKKyAgICAvKiB0ZW1wb3JhcnkgZnJhbWVzIHVzZWQgYnkgYl9mcmFtZV9zdHJhdGVneSA9IDIgKi8KKyAgICBBVkZyYW1lICp0bXBfZnJhbWVzW01BWF9CX0ZSQU1FUyArIDJdOworfSBNcGVnRW5jQ29udGV4dDsKKworI2RlZmluZSBSRUJBU0VfUElDVFVSRShwaWMsIG5ld19jdHgsIG9sZF9jdHgpICAgICAgICAgICAgIFwKKyAgICAoKHBpYyAmJiBwaWMgPj0gb2xkX2N0eC0+cGljdHVyZSAmJiAgICAgICAgICAgICAgICAgICBcCisgICAgICBwaWMgPCBvbGRfY3R4LT5waWN0dXJlICsgTUFYX1BJQ1RVUkVfQ09VTlQpID8gIFwKKyAgICAgICAgJm5ld19jdHgtPnBpY3R1cmVbcGljIC0gb2xkX2N0eC0+cGljdHVyZV0gOiBOVUxMKQorCisvKiBtcGVndmlkZW9fZW5jIGNvbW1vbiBvcHRpb25zICovCisjZGVmaW5lIEZGX01QVl9GTEFHX1NLSVBfUkQgICAgICAweDAwMDEKKyNkZWZpbmUgRkZfTVBWX0ZMQUdfU1RSSUNUX0dPUCAgIDB4MDAwMgorI2RlZmluZSBGRl9NUFZfRkxBR19RUF9SRCAgICAgICAgMHgwMDA0CisjZGVmaW5lIEZGX01QVl9GTEFHX0NCUF9SRCAgICAgICAweDAwMDgKKyNkZWZpbmUgRkZfTVBWX0ZMQUdfTkFRICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBGRl9NUFZfRkxBR19NVjAgICAgICAgICAgMHgwMDIwCisKKyNpZm5kZWYgRkZfTVBWX09GRlNFVAorI2RlZmluZSBGRl9NUFZfT0ZGU0VUKHgpIG9mZnNldG9mKE1wZWdFbmNDb250ZXh0LCB4KQorI2VuZGlmCisjZGVmaW5lIEZGX01QVl9PUFRfRkxBR1MgKEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0pCisjZGVmaW5lIEZGX01QVl9DT01NT05fT1BUUyBcCit7ICJtcHZfZmxhZ3MiLCAgICAgICJGbGFncyBjb21tb24gZm9yIGFsbCBtcGVndmlkZW8tYmFzZWQgZW5jb2RlcnMuIiwgRkZfTVBWX09GRlNFVChtcHZfZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgeyAuaTY0ID0gMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGRl9NUFZfT1BUX0ZMQUdTLCAibXB2X2ZsYWdzIiB9LFwKK3sgInNraXBfcmQiLCAgICAgICAgIlJEIG9wdGltYWwgTUIgbGV2ZWwgcmVzaWR1YWwgc2tpcHBpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRkZfTVBWX0ZMQUdfU0tJUF9SRCB9LCAgICAwLCAwLCBGRl9NUFZfT1BUX0ZMQUdTLCAibXB2X2ZsYWdzIiB9LFwKK3sgInN0cmljdF9nb3AiLCAgICAgIlN0cmljdGx5IGVuZm9yY2UgZ29wIHNpemUiLCAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRkZfTVBWX0ZMQUdfU1RSSUNUX0dPUCB9LCAwLCAwLCBGRl9NUFZfT1BUX0ZMQUdTLCAibXB2X2ZsYWdzIiB9LFwKK3sgInFwX3JkIiwgICAgICAgICAgIlVzZSByYXRlIGRpc3RvcnRpb24gb3B0aW1pemF0aW9uIGZvciBxcCBzZWxlY3Rpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRkZfTVBWX0ZMQUdfUVBfUkQgfSwgIDAsIDAsIEZGX01QVl9PUFRfRkxBR1MsICJtcHZfZmxhZ3MiIH0sXAoreyAiY2JwX3JkIiwgICAgICAgICAidXNlIHJhdGUgZGlzdG9ydGlvbiBvcHRpbWl6YXRpb24gZm9yIENCUCIsICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGRl9NUFZfRkxBR19DQlBfUkQgfSwgMCwgMCwgRkZfTVBWX09QVF9GTEFHUywgIm1wdl9mbGFncyIgfSxcCit7ICJuYXEiLCAgICAgICAgICAgICJub3JtYWxpemUgYWRhcHRpdmUgcXVhbnRpemF0aW9uIiwgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZGX01QVl9GTEFHX05BUSB9LCAgICAwLCAwLCBGRl9NUFZfT1BUX0ZMQUdTLCAibXB2X2ZsYWdzIiB9LFwKK3sgIm12MCIsICAgICAgICAgICAgImFsd2F5cyB0cnkgYSBtYiB3aXRoIG12PTwwLDA+IiwgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRkZfTVBWX0ZMQUdfTVYwIH0sICAgIDAsIDAsIEZGX01QVl9PUFRfRkxBR1MsICJtcHZfZmxhZ3MiIH0sXAoreyAibHVtYV9lbGltX3RocmVzaG9sZCIsICAgInNpbmdsZSBjb2VmZmljaWVudCBlbGltaW5hdGlvbiB0aHJlc2hvbGQgZm9yIGx1bWluYW5jZSAobmVnYXRpdmUgdmFsdWVzIGFsc28gY29uc2lkZXIgZGMgY29lZmZpY2llbnQpIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfTVBWX09GRlNFVChsdW1hX2VsaW1fdGhyZXNob2xkKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIElOVF9NSU4sIElOVF9NQVgsIEZGX01QVl9PUFRfRkxBR1MgfSxcCit7ICJjaHJvbWFfZWxpbV90aHJlc2hvbGQiLCAic2luZ2xlIGNvZWZmaWNpZW50IGVsaW1pbmF0aW9uIHRocmVzaG9sZCBmb3IgY2hyb21pbmFuY2UgKG5lZ2F0aXZlIHZhbHVlcyBhbHNvIGNvbnNpZGVyIGRjIGNvZWZmaWNpZW50KSIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX01QVl9PRkZTRVQoY2hyb21hX2VsaW1fdGhyZXNob2xkKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIElOVF9NSU4sIElOVF9NQVgsIEZGX01QVl9PUFRfRkxBR1MgfSxcCit7ICJxdWFudGl6ZXJfbm9pc2Vfc2hhcGluZyIsIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX01QVl9PRkZTRVQocXVhbnRpemVyX25vaXNlX3NoYXBpbmcpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgICAgICAgMCwgSU5UX01BWCwgRkZfTVBWX09QVF9GTEFHUyB9LFwKK3sgImVycm9yX3JhdGUiLCAiU2ltdWxhdGUgZXJyb3JzIGluIHRoZSBiaXRzdHJlYW0gdG8gdGVzdCBlcnJvciBjb25jZWFsbWVudC4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9NUFZfT0ZGU0VUKGVycm9yX3JhdGUpLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sICAgICAgIDAsIElOVF9NQVgsIEZGX01QVl9PUFRfRkxBR1MgfSxcCit7InFzcXVpc2giLCAiaG93IHRvIGtlZXAgcXVhbnRpemVyIGJldHdlZW4gcW1pbiBhbmQgcW1heCAoMCA9IGNsaXAsIDEgPSB1c2UgZGlmZmVyZW50aWFibGUgZnVuY3Rpb24pIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfTVBWX09GRlNFVChyY19xc3F1aXNoKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMCB9LCAwLCA5OSwgRkZfTVBWX09QVF9GTEFHU30sICAgICAgICAgICAgICAgICAgICAgICAgXAoreyJyY19xbW9kX2FtcCIsICJleHBlcmltZW50YWwgcXVhbnRpemVyIG1vZHVsYXRpb24iLCAgICAgICAgICAgICAgICBGRl9NUFZfT0ZGU0VUKHJjX3Ftb2RfYW1wKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMCB9LCAtRkxUX01BWCwgRkxUX01BWCwgRkZfTVBWX09QVF9GTEFHU30sICAgICAgICAgICBcCit7InJjX3Ftb2RfZnJlcSIsICJleHBlcmltZW50YWwgcXVhbnRpemVyIG1vZHVsYXRpb24iLCAgICAgICAgICAgICAgIEZGX01QVl9PRkZTRVQocmNfcW1vZF9mcmVxKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDAgfSwgSU5UX01JTiwgSU5UX01BWCwgRkZfTVBWX09QVF9GTEFHU30sICAgICAgICAgICAgIFwKK3sicmNfZXEiLCAiU2V0IHJhdGUgY29udHJvbCBlcXVhdGlvbi4gV2hlbiBjb21wdXRpbmcgdGhlIGV4cHJlc3Npb24sIGJlc2lkZXMgdGhlIHN0YW5kYXJkIGZ1bmN0aW9ucyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJkZWZpbmVkIGluIHRoZSBzZWN0aW9uICdFeHByZXNzaW9uIEV2YWx1YXRpb24nLCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlOiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgImJpdHMycXAoYml0cyksIHFwMmJpdHMocXApLiBBbHNvIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSBhdmFpbGFibGU6IGlUZXggcFRleCB0ZXggbXYgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiZkNvZGUgaUNvdW50IG1jVmFyIHZhciBpc0kgaXNQIGlzQiBhdmdRUCBxQ29tcCBhdmdJSVRleCBhdmdQSVRleCBhdmdQUFRleCBhdmdCUFRleCBhdmdUZXguIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9NUFZfT0ZGU0VUKHJjX2VxKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mbGFncyA9IEZGX01QVl9PUFRfRkxBR1MgfSwgICAgICAgICAgICBcCit7InJjX2luaXRfY3BseCIsICJpbml0aWFsIGNvbXBsZXhpdHkgZm9yIDEtcGFzcyBlbmNvZGluZyIsICAgICAgICAgIEZGX01QVl9PRkZTRVQocmNfaW5pdGlhbF9jcGx4KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMCB9LCAtRkxUX01BWCwgRkxUX01BWCwgRkZfTVBWX09QVF9GTEFHU30sICAgICAgIFwKK3sicmNfYnVmX2FnZ3Jlc3Npdml0eSIsICJjdXJyZW50bHkgdXNlbGVzcyIsICAgICAgICAgICAgICAgICAgICAgICAgRkZfTVBWX09GRlNFVChyY19idWZmZXJfYWdncmVzc2l2aXR5KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMS4wIH0sIC1GTFRfTUFYLCBGTFRfTUFYLCBGRl9NUFZfT1BUX0ZMQUdTfSwgXAoreyJib3JkZXJfbWFzayIsICJpbmNyZWFzZSB0aGUgcXVhbnRpemVyIGZvciBtYWNyb2Jsb2NrcyBjbG9zZSB0byBib3JkZXJzIiwgRkZfTVBWX09GRlNFVChib3JkZXJfbWFza2luZyksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IDAgfSwgLUZMVF9NQVgsIEZMVF9NQVgsIEZGX01QVl9PUFRfRkxBR1N9LCAgICBcCit7ImxtaW4iLCAibWluaW11bSBMYWdyYW5nZSBmYWN0b3IgKFZCUikiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX01QVl9PRkZTRVQobG1pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAgMipGRl9RUDJMQU1CREEgfSwgMCwgSU5UX01BWCwgRkZfTVBWX09QVF9GTEFHUyB9LCAgICAgICAgICAgIFwKK3sibG1heCIsICJtYXhpbXVtIExhZ3JhbmdlIGZhY3RvciAoVkJSKSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfTVBWX09GRlNFVChsbWF4KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDMxKkZGX1FQMkxBTUJEQSB9LCAwLCBJTlRfTUFYLCBGRl9NUFZfT1BUX0ZMQUdTIH0sICAgICAgICAgICAgXAorCitleHRlcm4gY29uc3QgQVZPcHRpb24gZmZfbXB2X2dlbmVyaWNfb3B0aW9uc1tdOworCisjZGVmaW5lIEZGX01QVl9HRU5FUklDX0NMQVNTKG5hbWUpIFwKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG5hbWUgIyMgX2NsYXNzID0ge1wKKyAgICAuY2xhc3NfbmFtZSA9ICNuYW1lICIgZW5jb2RlciIsXAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsXAorICAgIC5vcHRpb24gICAgID0gZmZfbXB2X2dlbmVyaWNfb3B0aW9ucyxcCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsXAorfTsKKworLyoqCisgKiBTZXQgdGhlIGdpdmVuIE1wZWdFbmNDb250ZXh0IHRvIGNvbW1vbiBkZWZhdWx0cyAoc2FtZSBmb3IgZW5jb2RpbmcKKyAqIGFuZCBkZWNvZGluZykuICBUaGUgY2hhbmdlZCBmaWVsZHMgd2lsbCBub3QgZGVwZW5kIHVwb24gdGhlIHByaW9yCisgKiBzdGF0ZSBvZiB0aGUgTXBlZ0VuY0NvbnRleHQuCisgKi8KK3ZvaWQgZmZfbXB2X2NvbW1vbl9kZWZhdWx0cyhNcGVnRW5jQ29udGV4dCAqcyk7CisKK3ZvaWQgZmZfZGN0X2VuY29kZV9pbml0X3g4NihNcGVnRW5jQ29udGV4dCAqcyk7CisKK2ludCBmZl9tcHZfY29tbW9uX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpOwordm9pZCBmZl9tcHZfY29tbW9uX2luaXRfYXJtKE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbXB2X2NvbW1vbl9pbml0X2F4cChNcGVnRW5jQ29udGV4dCAqcyk7Cit2b2lkIGZmX21wdl9jb21tb25faW5pdF9uZW9uKE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbXB2X2NvbW1vbl9pbml0X3BwYyhNcGVnRW5jQ29udGV4dCAqcyk7Cit2b2lkIGZmX21wdl9jb21tb25faW5pdF94ODYoTXBlZ0VuY0NvbnRleHQgKnMpOworCitpbnQgZmZfbXB2X2NvbW1vbl9mcmFtZV9zaXplX2NoYW5nZShNcGVnRW5jQ29udGV4dCAqcyk7Cit2b2lkIGZmX21wdl9jb21tb25fZW5kKE1wZWdFbmNDb250ZXh0ICpzKTsKKwordm9pZCBmZl9tcHZfZGVjb2RlX2RlZmF1bHRzKE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbXB2X2RlY29kZV9pbml0KE1wZWdFbmNDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl9tcHZfZGVjb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzEyXVs2NF0pOwordm9pZCBmZl9tcHZfcmVwb3J0X2RlY29kZV9wcm9ncmVzcyhNcGVnRW5jQ29udGV4dCAqcyk7CisKK2ludCBmZl9tcHZfZnJhbWVfc3RhcnQoTXBlZ0VuY0NvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cit2b2lkIGZmX21wdl9mcmFtZV9lbmQoTXBlZ0VuY0NvbnRleHQgKnMpOworCitpbnQgZmZfbXB2X2xvd2VzdF9yZWZlcmVuY2VkX3JvdyhNcGVnRW5jQ29udGV4dCAqcywgaW50IGRpcik7CisKK2ludCBmZl9tcHZfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK3ZvaWQgZmZfbXB2X2VuY29kZV9pbml0X3g4NihNcGVnRW5jQ29udGV4dCAqcyk7CisKK2ludCBmZl9tcHZfZW5jb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworaW50IGZmX21wdl9lbmNvZGVfcGljdHVyZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpOworCit2b2lkIGZmX2NsZWFuX2ludHJhX3RhYmxlX2VudHJpZXMoTXBlZ0VuY0NvbnRleHQgKnMpOwordm9pZCBmZl9tcGVnX2RyYXdfaG9yaXpfYmFuZChNcGVnRW5jQ29udGV4dCAqcywgaW50IHksIGludCBoKTsKK3ZvaWQgZmZfbXBlZ19mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCit2b2lkIGZmX3ByaW50X2RlYnVnX2luZm8oTXBlZ0VuY0NvbnRleHQgKnMsIFBpY3R1cmUgKnAsIEFWRnJhbWUgKnBpY3QpOwordm9pZCBmZl9wcmludF9kZWJ1Z19pbmZvMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnBpY3QsIHVpbnQ4X3QgKm1ic2tpcF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbWJ0eXBlX3RhYmxlLCBpbnQ4X3QgKnFzY2FsZV90YWJsZSwgaW50MTZfdCAoKm1vdGlvbl92YWxbMl0pWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbG93X2RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl93aWR0aCwgaW50IG1iX2hlaWdodCwgaW50IG1iX3N0cmlkZSwgaW50IHF1YXJ0ZXJfc2FtcGxlKTsKKworaW50IGZmX21wdl9leHBvcnRfcXBfdGFibGUoTXBlZ0VuY0NvbnRleHQgKnMsIEFWRnJhbWUgKmYsIFBpY3R1cmUgKnAsIGludCBxcF90eXBlKTsKKwordm9pZCBmZl93cml0ZV9xdWFudF9tYXRyaXgoUHV0Qml0Q29udGV4dCAqcGIsIHVpbnQxNl90ICptYXRyaXgpOworaW50IGZmX2ZpbmRfdW51c2VkX3BpY3R1cmUoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBzaGFyZWQpOwordm9pZCBmZl9kZW5vaXNlX2RjdChNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2spOworaW50IGZmX3VwZGF0ZV9kdXBsaWNhdGVfY29udGV4dChNcGVnRW5jQ29udGV4dCAqZHN0LCBNcGVnRW5jQ29udGV4dCAqc3JjKTsKK2ludCBmZl9tcGVnX3VwZGF0ZV90aHJlYWRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqZHN0LCBjb25zdCBBVkNvZGVjQ29udGV4dCAqc3JjKTsKK3ZvaWQgZmZfc2V0X3FzY2FsZShNcGVnRW5jQ29udGV4dCAqIHMsIGludCBxc2NhbGUpOworCit2b2lkIGZmX21wdl9pZGN0X2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpOworaW50IGZmX2RjdF9lbmNvZGVfaW5pdChNcGVnRW5jQ29udGV4dCAqcyk7Cit2b2lkIGZmX2NvbnZlcnRfbWF0cml4KE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgKCpxbWF0KVs2NF0sIHVpbnQxNl90ICgqcW1hdDE2KVsyXVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXgsIGludCBiaWFzLCBpbnQgcW1pbiwgaW50IHFtYXgsIGludCBpbnRyYSk7CitpbnQgZmZfZGN0X3F1YW50aXplX2MoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgKmJsb2NrLCBpbnQgbiwgaW50IHFzY2FsZSwgaW50ICpvdmVyZmxvdyk7CisKK3ZvaWQgZmZfaW5pdF9ibG9ja19pbmRleChNcGVnRW5jQ29udGV4dCAqcyk7CisKK3ZvaWQgZmZfbXB2X21vdGlvbihNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X3ksIHVpbnQ4X3QgKmRlc3RfY2IsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF9jciwgaW50IGRpciwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcmVmX3BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgb3BfcGl4ZWxzX2Z1bmMgKCpwaXhfb3ApWzRdLAorICAgICAgICAgICAgICAgICAgIHFwZWxfbWNfZnVuYyAoKnFwaXhfb3ApWzE2XSk7CisKKy8qKgorICogQWxsb2NhdGUgYSBQaWN0dXJlLgorICogVGhlIHBpeGVscyBhcmUgYWxsb2NhdGVkL3NldCBieSBjYWxsaW5nIGdldF9idWZmZXIoKSBpZiBzaGFyZWQgPSAwLgorICovCitpbnQgZmZfYWxsb2NfcGljdHVyZShNcGVnRW5jQ29udGV4dCAqcywgUGljdHVyZSAqcGljLCBpbnQgc2hhcmVkKTsKKworLyoqCisgKiBwZXJtdXRlIGJsb2NrIGFjY29yZGluZyB0byBwZXJtdWF0YXRpb24uCisgKiBAcGFyYW0gbGFzdCBsYXN0IG5vbiB6ZXJvIGVsZW1lbnQgaW4gc2NhbnRhYmxlIG9yZGVyCisgKi8KK3ZvaWQgZmZfYmxvY2tfcGVybXV0ZShpbnQxNl90ICpibG9jaywgdWludDhfdCAqcGVybXV0YXRpb24sIGNvbnN0IHVpbnQ4X3QgKnNjYW50YWJsZSwgaW50IGxhc3QpOworCitzdGF0aWMgaW5saW5lIHZvaWQgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KE1wZWdFbmNDb250ZXh0ICpzKXsKKyAgICBjb25zdCBpbnQgYmxvY2tfc2l6ZT0gOCA+PiBzLT5hdmN0eC0+bG93cmVzOworCisgICAgcy0+YmxvY2tfaW5kZXhbMF0rPTI7CisgICAgcy0+YmxvY2tfaW5kZXhbMV0rPTI7CisgICAgcy0+YmxvY2tfaW5kZXhbMl0rPTI7CisgICAgcy0+YmxvY2tfaW5kZXhbM10rPTI7CisgICAgcy0+YmxvY2tfaW5kZXhbNF0rKzsKKyAgICBzLT5ibG9ja19pbmRleFs1XSsrOworICAgIHMtPmRlc3RbMF0rPSAyKmJsb2NrX3NpemU7CisgICAgcy0+ZGVzdFsxXSs9IGJsb2NrX3NpemU7CisgICAgcy0+ZGVzdFsyXSs9IGJsb2NrX3NpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9iaXRzX2RpZmYoTXBlZ0VuY0NvbnRleHQgKnMpeworICAgIGNvbnN0IGludCBiaXRzPSBwdXRfYml0c19jb3VudCgmcy0+cGIpOworICAgIGNvbnN0IGludCBsYXN0PSBzLT5sYXN0X2JpdHM7CisKKyAgICBzLT5sYXN0X2JpdHMgPSBiaXRzOworCisgICAgcmV0dXJuIGJpdHMgLSBsYXN0OworfQorCitzdGF0aWMgaW5saW5lIGludCBmZl9oMjYzX3JvdW5kX2Nocm9tYShpbnQgeCl7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaDI2M19jaHJvbWFfcm91bmR0YWJbMTZdID0geworICAgIC8vICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1CisgICAgICAgIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsCisgICAgfTsKKyAgICByZXR1cm4gaDI2M19jaHJvbWFfcm91bmR0YWJbeCAmIDB4Zl0gKyAoeCA+PiAzKTsKK30KKworLyogbW90aW9uX2VzdC5jICovCit2b2lkIGZmX2VzdGltYXRlX3BfZnJhbWVfbW90aW9uKE1wZWdFbmNDb250ZXh0ICogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3gsIGludCBtYl95KTsKK3ZvaWQgZmZfZXN0aW1hdGVfYl9mcmFtZV9tb3Rpb24oTXBlZ0VuY0NvbnRleHQgKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfeCwgaW50IG1iX3kpOworaW50IGZmX2dldF9iZXN0X2Zjb2RlKE1wZWdFbmNDb250ZXh0ICogcywgaW50MTZfdCAoKm12X3RhYmxlKVsyXSwgaW50IHR5cGUpOwordm9pZCBmZl9maXhfbG9uZ19wX212cyhNcGVnRW5jQ29udGV4dCAqIHMpOwordm9pZCBmZl9maXhfbG9uZ19tdnMoTXBlZ0VuY0NvbnRleHQgKiBzLCB1aW50OF90ICpmaWVsZF9zZWxlY3RfdGFibGUsIGludCBmaWVsZF9zZWxlY3QsCisgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICgqbXZfdGFibGUpWzJdLCBpbnQgZl9jb2RlLCBpbnQgdHlwZSwgaW50IHRydW5jYXRlKTsKK2ludCBmZl9pbml0X21lKE1wZWdFbmNDb250ZXh0ICpzKTsKK2ludCBmZl9wcmVfZXN0aW1hdGVfcF9mcmFtZV9tb3Rpb24oTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgbWJfeCwgaW50IG1iX3kpOworaW50IGZmX2VwenNfbW90aW9uX3NlYXJjaChNcGVnRW5jQ29udGV4dCAqIHMsIGludCAqbXhfcHRyLCBpbnQgKm15X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFBbMTBdWzJdLCBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LCBpbnQxNl90ICgqbGFzdF9tdilbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWZfbXZfc2NhbGUsIGludCBzaXplLCBpbnQgaCk7CitpbnQgZmZfZ2V0X21iX3Njb3JlKE1wZWdFbmNDb250ZXh0ICogcywgaW50IG14LCBpbnQgbXksIGludCBzcmNfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZl9pbmRleCwgaW50IHNpemUsIGludCBoLCBpbnQgYWRkX3JhdGUpOworCisvKiBtcGVnMTIuYyAqLworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfbXBlZzFfZGNfc2NhbGVfdGFibGVbMTI4XTsKK2V4dGVybiBjb25zdCB1aW50OF90ICogY29uc3QgZmZfbXBlZzJfZGNfc2NhbGVfdGFibGVbNF07CisKK3ZvaWQgZmZfbXBlZzFfZW5jb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgcGljdHVyZV9udW1iZXIpOwordm9pZCBmZl9tcGVnMV9lbmNvZGVfbWIoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGJsb2NrWzhdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feCwgaW50IG1vdGlvbl95KTsKK3ZvaWQgZmZfbXBlZzFfZW5jb2RlX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpOwordm9pZCBmZl9tcGVnMV9lbmNvZGVfc2xpY2VfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzKTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfYWljX2RjX3NjYWxlX3RhYmxlWzMyXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2gyNjNfY2hyb21hX3FzY2FsZV90YWJsZVszMl07CisKKy8qIHJ2MTAuYyAqLwordm9pZCBmZl9ydjEwX2VuY29kZV9waWN0dXJlX2hlYWRlcihNcGVnRW5jQ29udGV4dCAqcywgaW50IHBpY3R1cmVfbnVtYmVyKTsKK2ludCBmZl9ydl9kZWNvZGVfZGMoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBuKTsKK3ZvaWQgZmZfcnYyMF9lbmNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBwaWN0dXJlX251bWJlcik7CisKKworLyogbXNtcGVnNC5jICovCit2b2lkIGZmX21zbXBlZzRfZW5jb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICogcywgaW50IHBpY3R1cmVfbnVtYmVyKTsKK3ZvaWQgZmZfbXNtcGVnNF9lbmNvZGVfZXh0X2hlYWRlcihNcGVnRW5jQ29udGV4dCAqIHMpOwordm9pZCBmZl9tc21wZWc0X2VuY29kZV9tYihNcGVnRW5jQ29udGV4dCAqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgYmxvY2tbNl1bNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uX3gsIGludCBtb3Rpb25feSk7CitpbnQgZmZfbXNtcGVnNF9kZWNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKiBzKTsKK2ludCBmZl9tc21wZWc0X2RlY29kZV9leHRfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICogcywgaW50IGJ1Zl9zaXplKTsKK2ludCBmZl9tc21wZWc0X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cit2b2lkIGZmX21zbXBlZzRfZW5jb2RlX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpOworaW50IGZmX3dtdjJfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICogcyk7CitpbnQgZmZfd212Ml9kZWNvZGVfc2Vjb25kYXJ5X3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICogcyk7Cit2b2lkIGZmX3dtdjJfYWRkX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzZdWzY0XSwgdWludDhfdCAqZGVzdF95LCB1aW50OF90ICpkZXN0X2NiLCB1aW50OF90ICpkZXN0X2NyKTsKK3ZvaWQgZmZfbXNwZWxfbW90aW9uKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfeSwgdWludDhfdCAqZGVzdF9jYiwgdWludDhfdCAqZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcmVmX3BpY3R1cmUsIG9wX3BpeGVsc19mdW5jICgqcGl4X29wKVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uX3gsIGludCBtb3Rpb25feSwgaW50IGgpOworaW50IGZmX3dtdjJfZW5jb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICogcywgaW50IHBpY3R1cmVfbnVtYmVyKTsKK3ZvaWQgZmZfd212Ml9lbmNvZGVfbWIoTXBlZ0VuY0NvbnRleHQgKiBzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGJsb2NrWzZdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3kpOworCitpbnQgZmZfbXBlZ19yZWZfcGljdHVyZShNcGVnRW5jQ29udGV4dCAqcywgUGljdHVyZSAqZHN0LCBQaWN0dXJlICpzcmMpOwordm9pZCBmZl9tcGVnX3VucmVmX3BpY3R1cmUoTXBlZ0VuY0NvbnRleHQgKnMsIFBpY3R1cmUgKnBpY3R1cmUpOwordm9pZCBmZl9mcmVlX3BpY3R1cmVfdGFibGVzKFBpY3R1cmUgKnBpYyk7CisKKworI2VuZGlmIC8qIEFWQ09ERUNfTVBFR1ZJREVPX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWd2aWRlb19lbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWd2aWRlb19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzE1M2NmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvX2VuYy5jCkBAIC0wLDAgKzEsNDYzNSBAQAorLyoKKyAqIFRoZSBzaW1wbGVzdCBtcGVnIGVuY29kZXIgKHdlbGwsIGl0IHdhcyB0aGUgc2ltcGxlc3QhKQorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIDRNViAmIGhxICYgQi1mcmFtZSBlbmNvZGluZyBzdHVmZiBieSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUaGUgc2ltcGxlc3QgbXBlZyBlbmNvZGVyICh3ZWxsLCBpdCB3YXMgdGhlIHNpbXBsZXN0ISkuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludG1hdGguaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZGN0LmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgIm1wZWcxMi5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgImgyNjEuaCIKKyNpbmNsdWRlICJoMjYzLmgiCisjaW5jbHVkZSAibWpwZWdlbmNfY29tbW9uLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgIm1wZWd1dGlscy5oIgorI2luY2x1ZGUgIm1qcGVnZW5jLmgiCisjaW5jbHVkZSAibXNtcGVnNC5oIgorI2luY2x1ZGUgInBpeGJsb2NrZHNwLmgiCisjaW5jbHVkZSAicXBlbGRzcC5oIgorI2luY2x1ZGUgImZhYW5kY3QuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJhYW5kY3R0YWIuaCIKKyNpbmNsdWRlICJmbHYuaCIKKyNpbmNsdWRlICJtcGVnNHZpZGVvLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAic3A1eC5oIgorCisjZGVmaW5lIFFVQU5UX0JJQVNfU0hJRlQgOAorCisjZGVmaW5lIFFNQVRfU0hJRlRfTU1YIDE2CisjZGVmaW5lIFFNQVRfU0hJRlQgMjEKKworc3RhdGljIGludCBlbmNvZGVfcGljdHVyZShNcGVnRW5jQ29udGV4dCAqcywgaW50IHBpY3R1cmVfbnVtYmVyKTsKK3N0YXRpYyBpbnQgZGN0X3F1YW50aXplX3JlZmluZShNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2ssIGludDE2X3QgKndlaWdodCwgaW50MTZfdCAqb3JpZywgaW50IG4sIGludCBxc2NhbGUpOworc3RhdGljIGludCBzc2VfbWIoTXBlZ0VuY0NvbnRleHQgKnMpOworc3RhdGljIHZvaWQgZGVub2lzZV9kY3RfYyhNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2spOworc3RhdGljIGludCBkY3RfcXVhbnRpemVfdHJlbGxpc19jKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywgaW50IG4sIGludCBxc2NhbGUsIGludCAqb3ZlcmZsb3cpOworCitzdGF0aWMgdWludDhfdCBkZWZhdWx0X212X3BlbmFsdHlbTUFYX0ZDT0RFICsgMV1bTUFYX01WICogMiArIDFdOworc3RhdGljIHVpbnQ4X3QgZGVmYXVsdF9mY29kZV90YWJbTUFYX01WICogMiArIDFdOworCitjb25zdCBBVk9wdGlvbiBmZl9tcHZfZ2VuZXJpY19vcHRpb25zW10gPSB7CisgICAgRkZfTVBWX0NPTU1PTl9PUFRTCisgICAgeyBOVUxMIH0sCit9OworCit2b2lkIGZmX2NvbnZlcnRfbWF0cml4KE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgKCpxbWF0KVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICgqcW1hdDE2KVsyXVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWFzLCBpbnQgcW1pbiwgaW50IHFtYXgsIGludCBpbnRyYSkKK3sKKyAgICBGRENURFNQQ29udGV4dCAqZmRzcCA9ICZzLT5mZHNwOworICAgIGludCBxc2NhbGU7CisgICAgaW50IHNoaWZ0ID0gMDsKKworICAgIGZvciAocXNjYWxlID0gcW1pbjsgcXNjYWxlIDw9IHFtYXg7IHFzY2FsZSsrKSB7CisgICAgICAgIGludCBpOworICAgICAgICBpZiAoZmRzcC0+ZmRjdCA9PSBmZl9qcGVnX2ZkY3RfaXNsb3dfOCAgfHwKKyNpZiBDT05GSUdfRkFBTkRDVAorICAgICAgICAgICAgZmRzcC0+ZmRjdCA9PSBmZl9mYWFuZGN0ICAgICAgICAgICAgfHwKKyNlbmRpZiAvKiBDT05GSUdfRkFBTkRDVCAqLworICAgICAgICAgICAgZmRzcC0+ZmRjdCA9PSBmZl9qcGVnX2ZkY3RfaXNsb3dfMTApIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV07CisgICAgICAgICAgICAgICAgaW50NjRfdCBkZW4gPSAoaW50NjRfdCkgcXNjYWxlICogcXVhbnRfbWF0cml4W2pdOworICAgICAgICAgICAgICAgIC8qIDE2IDw9IHFzY2FsZSAqIHF1YW50X21hdHJpeFtpXSA8PSA3OTA1CisgICAgICAgICAgICAgICAgICogQXNzdW1lIHggPSBmZl9hYW5zY2FsZXNbaV0gKiBxc2NhbGUgKiBxdWFudF9tYXRyaXhbaV0KKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAxOTk1MiA8PSAgICAgICAgICAgICAgeCAgPD0gMjQ5MjA1MDI2CisgICAgICAgICAgICAgICAgICogKDEgPDwgMzYpIC8gMTk5NTIgPj0gKDEgPDwgMzYpIC8gKHgpID49ICgxIDw8IDM2KSAvIDI0OTIwNTAyNgorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAzNDQ0MjQwID49ICgxIDw8IDM2KSAvICh4KSA+PSAyNzUgKi8KKworICAgICAgICAgICAgICAgIHFtYXRbcXNjYWxlXVtpXSA9IChpbnQpKChVSU5UNjRfQygxKSA8PCBRTUFUX1NISUZUKSAvIGRlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZmRzcC0+ZmRjdCA9PSBmZl9mZGN0X2lmYXN0KSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBqID0gcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ldOworICAgICAgICAgICAgICAgIGludDY0X3QgZGVuID0gZmZfYWFuc2NhbGVzW2ldICogKGludDY0X3QpIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXTsKKyAgICAgICAgICAgICAgICAvKiAxNiA8PSBxc2NhbGUgKiBxdWFudF9tYXRyaXhbaV0gPD0gNzkwNQorICAgICAgICAgICAgICAgICAqIEFzc3VtZSB4ID0gZmZfYWFuc2NhbGVzW2ldICogcXNjYWxlICogcXVhbnRfbWF0cml4W2ldCisgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgMTk5NTIgPD0gICAgICAgICAgICAgIHggIDw9IDI0OTIwNTAyNgorICAgICAgICAgICAgICAgICAqICgxIDw8IDM2KSAvIDE5OTUyID49ICgxIDw8IDM2KSAvICh4KSA+PSAoMSA8PCAzNikgLyAyNDkyMDUwMjYKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgMzQ0NDI0MCA+PSAoMSA8PCAzNikgLyAoeCkgPj0gMjc1ICovCisKKyAgICAgICAgICAgICAgICBxbWF0W3FzY2FsZV1baV0gPSAoaW50KSgoVUlOVDY0X0MoMSkgPDwgKFFNQVRfU0hJRlQgKyAxNCkpIC8gZGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV07CisgICAgICAgICAgICAgICAgaW50NjRfdCBkZW4gPSAoaW50NjRfdCkgcXNjYWxlICogcXVhbnRfbWF0cml4W2pdOworICAgICAgICAgICAgICAgIC8qIFdlIGNhbiBzYWZlbHkgc3VwcG9zZSB0aGF0IDE2IDw9IHF1YW50X21hdHJpeFtpXSA8PSAyNTUKKyAgICAgICAgICAgICAgICAgKiBBc3N1bWUgeCA9IHFzY2FsZSAqIHF1YW50X21hdHJpeFtpXQorICAgICAgICAgICAgICAgICAqIFNvICAgICAgICAgICAgIDE2IDw9ICAgICAgICAgICAgICB4ICA8PSA3OTA1CisgICAgICAgICAgICAgICAgICogc28gKDEgPDwgMTkpIC8gMTYgPj0gKDEgPDwgMTkpIC8gKHgpID49ICgxIDw8IDE5KSAvIDc5MDUKKyAgICAgICAgICAgICAgICAgKiBzbyAgICAgICAgICAzMjc2OCA+PSAoMSA8PCAxOSkgLyAoeCkgPj0gNjcgKi8KKyAgICAgICAgICAgICAgICBxbWF0W3FzY2FsZV1baV0gPSAoaW50KSgoVUlOVDY0X0MoMSkgPDwgUU1BVF9TSElGVCkgLyBkZW4pOworICAgICAgICAgICAgICAgIC8vcW1hdCAgW3FzY2FsZV1baV0gPSAoMSA8PCBRTUFUX1NISUZUX01NWCkgLworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAocXNjYWxlICogcXVhbnRfbWF0cml4W2ldKTsKKyAgICAgICAgICAgICAgICBxbWF0MTZbcXNjYWxlXVswXVtpXSA9ICgxIDw8IFFNQVRfU0hJRlRfTU1YKSAvIGRlbjsKKworICAgICAgICAgICAgICAgIGlmIChxbWF0MTZbcXNjYWxlXVswXVtpXSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIHFtYXQxNltxc2NhbGVdWzBdW2ldID09IDEyOCAqIDI1NikKKyAgICAgICAgICAgICAgICAgICAgcW1hdDE2W3FzY2FsZV1bMF1baV0gPSAxMjggKiAyNTYgLSAxOworICAgICAgICAgICAgICAgIHFtYXQxNltxc2NhbGVdWzFdW2ldID0KKyAgICAgICAgICAgICAgICAgICAgUk9VTkRFRF9ESVYoYmlhcyA8PCAoMTYgLSBRVUFOVF9CSUFTX1NISUZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1hdDE2W3FzY2FsZV1bMF1baV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gaW50cmE7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICBpbnQ2NF90IG1heCA9IDgxOTE7CisgICAgICAgICAgICBpZiAoZmRzcC0+ZmRjdCA9PSBmZl9mZGN0X2lmYXN0KSB7CisgICAgICAgICAgICAgICAgbWF4ID0gKDgxOTFMTCAqIGZmX2FhbnNjYWxlc1tpXSkgPj4gMTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoKChtYXggKiBxbWF0W3FzY2FsZV1baV0pID4+IHNoaWZ0KSA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBzaGlmdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzaGlmdCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAiV2FybmluZywgUU1BVF9TSElGVCBpcyBsYXJnZXIgdGhhbiAlZCwgb3ZlcmZsb3dzIHBvc3NpYmxlXG4iLAorICAgICAgICAgICAgICAgUU1BVF9TSElGVCAtIHNoaWZ0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfcXNjYWxlKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIHMtPnFzY2FsZSA9IChzLT5sYW1iZGEgKiAxMzkgKyBGRl9MQU1CREFfU0NBTEUgKiA2NCkgPj4KKyAgICAgICAgICAgICAgICAoRkZfTEFNQkRBX1NISUZUICsgNyk7CisgICAgcy0+cXNjYWxlID0gYXZfY2xpcChzLT5xc2NhbGUsIHMtPmF2Y3R4LT5xbWluLCBzLT5hdmN0eC0+cW1heCk7CisKKyAgICBzLT5sYW1iZGEyID0gKHMtPmxhbWJkYSAqIHMtPmxhbWJkYSArIEZGX0xBTUJEQV9TQ0FMRSAvIDIpID4+CisgICAgICAgICAgICAgICAgIEZGX0xBTUJEQV9TSElGVDsKK30KKwordm9pZCBmZl93cml0ZV9xdWFudF9tYXRyaXgoUHV0Qml0Q29udGV4dCAqcGIsIHVpbnQxNl90ICptYXRyaXgpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAobWF0cml4KSB7CisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAxKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCA4LCBtYXRyaXhbZmZfemlnemFnX2RpcmVjdFtpXV0pOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKK30KKworLyoqCisgKiBpbml0IHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGUgZnJvbSBzLT5sYW1iZGFfdGFibGUKKyAqLwordm9pZCBmZl9pbml0X3FzY2FsZV90YWIoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50OF90ICogY29uc3QgcXNjYWxlX3RhYmxlID0gcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgeworICAgICAgICB1bnNpZ25lZCBpbnQgbGFtID0gcy0+bGFtYmRhX3RhYmxlW3MtPm1iX2luZGV4Mnh5W2ldXTsKKyAgICAgICAgaW50IHFwID0gKGxhbSAqIDEzOSArIEZGX0xBTUJEQV9TQ0FMRSAqIDY0KSA+PiAoRkZfTEFNQkRBX1NISUZUICsgNyk7CisgICAgICAgIHFzY2FsZV90YWJsZVtzLT5tYl9pbmRleDJ4eVtpXV0gPSBhdl9jbGlwKHFwLCBzLT5hdmN0eC0+cW1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnFtYXgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2R1cGxpY2F0ZV9jb250ZXh0X2FmdGVyX21lKE1wZWdFbmNDb250ZXh0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXBlZ0VuY0NvbnRleHQgKnNyYykKK3sKKyNkZWZpbmUgQ09QWShhKSBkc3QtPmE9IHNyYy0+YQorICAgIENPUFkocGljdF90eXBlKTsKKyAgICBDT1BZKGN1cnJlbnRfcGljdHVyZSk7CisgICAgQ09QWShmX2NvZGUpOworICAgIENPUFkoYl9jb2RlKTsKKyAgICBDT1BZKHFzY2FsZSk7CisgICAgQ09QWShsYW1iZGEpOworICAgIENPUFkobGFtYmRhMik7CisgICAgQ09QWShwaWN0dXJlX2luX2dvcF9udW1iZXIpOworICAgIENPUFkoZ29wX3BpY3R1cmVfbnVtYmVyKTsKKyAgICBDT1BZKGZyYW1lX3ByZWRfZnJhbWVfZGN0KTsgLy8gRklYTUUgZG9uJ3Qgc2V0IGluIGVuY29kZV9oZWFkZXIKKyAgICBDT1BZKHByb2dyZXNzaXZlX2ZyYW1lKTsgICAgLy8gRklYTUUgZG9uJ3Qgc2V0IGluIGVuY29kZV9oZWFkZXIKKyAgICBDT1BZKHBhcnRpdGlvbmVkX2ZyYW1lKTsgICAgLy8gRklYTUUgZG9uJ3Qgc2V0IGluIGVuY29kZV9oZWFkZXIKKyN1bmRlZiBDT1BZCit9CisKKy8qKgorICogU2V0IHRoZSBnaXZlbiBNcGVnRW5jQ29udGV4dCB0byBkZWZhdWx0cyBmb3IgZW5jb2RpbmcuCisgKiB0aGUgY2hhbmdlZCBmaWVsZHMgd2lsbCBub3QgZGVwZW5kIHVwb24gdGhlIHByaW9yIHN0YXRlIG9mIHRoZSBNcGVnRW5jQ29udGV4dC4KKyAqLworc3RhdGljIHZvaWQgbXB2X2VuY29kZV9kZWZhdWx0cyhNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBmZl9tcHZfY29tbW9uX2RlZmF1bHRzKHMpOworCisgICAgZm9yIChpID0gLTE2OyBpIDwgMTY7IGkrKykgeworICAgICAgICBkZWZhdWx0X2Zjb2RlX3RhYltpICsgTUFYX01WXSA9IDE7CisgICAgfQorICAgIHMtPm1lLm12X3BlbmFsdHkgPSBkZWZhdWx0X212X3BlbmFsdHk7CisgICAgcy0+ZmNvZGVfdGFiICAgICA9IGRlZmF1bHRfZmNvZGVfdGFiOworCisgICAgcy0+aW5wdXRfcGljdHVyZV9udW1iZXIgID0gMDsKKyAgICBzLT5waWN0dXJlX2luX2dvcF9udW1iZXIgPSAwOworfQorCithdl9jb2xkIGludCBmZl9kY3RfZW5jb2RlX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpIHsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2RjdF9lbmNvZGVfaW5pdF94ODYocyk7CisKKyAgICBpZiAoQ09ORklHX0gyNjNfRU5DT0RFUikKKyAgICAgICAgZmZfaDI2M2RzcF9pbml0KCZzLT5oMjYzZHNwKTsKKyAgICBpZiAoIXMtPmRjdF9xdWFudGl6ZSkKKyAgICAgICAgcy0+ZGN0X3F1YW50aXplID0gZmZfZGN0X3F1YW50aXplX2M7CisgICAgaWYgKCFzLT5kZW5vaXNlX2RjdCkKKyAgICAgICAgcy0+ZGVub2lzZV9kY3QgID0gZGVub2lzZV9kY3RfYzsKKyAgICBzLT5mYXN0X2RjdF9xdWFudGl6ZSA9IHMtPmRjdF9xdWFudGl6ZTsKKyAgICBpZiAocy0+YXZjdHgtPnRyZWxsaXMpCisgICAgICAgIHMtPmRjdF9xdWFudGl6ZSAgPSBkY3RfcXVhbnRpemVfdHJlbGxpc19jOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGluaXQgdmlkZW8gZW5jb2RlciAqLworYXZfY29sZCBpbnQgZmZfbXB2X2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIHJldCwgZm9ybWF0X3N1cHBvcnRlZDsKKworICAgIG1wdl9lbmNvZGVfZGVmYXVsdHMocyk7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzJWSURFTzoKKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ICE9IEFWX1BJWF9GTVRfWVVWNDIwUCAmJgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9ZVVY0MjJQKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAib25seSBZVVY0MjAgYW5kIFlVVjQyMiBhcmUgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01KUEVHOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQU1WOgorICAgICAgICBmb3JtYXRfc3VwcG9ydGVkID0gMDsKKyAgICAgICAgLyogSlBFRyBjb2xvciBzcGFjZSAqLworICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZKNDIwUCB8fAorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZKNDIyUCB8fAorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZKNDQ0UCB8fAorICAgICAgICAgICAgKGF2Y3R4LT5jb2xvcl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9KUEVHICYmCisgICAgICAgICAgICAgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCB8fAorICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlAgfHwKKyAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQKSkpCisgICAgICAgICAgICBmb3JtYXRfc3VwcG9ydGVkID0gMTsKKyAgICAgICAgLyogTVBFRyBjb2xvciBzcGFjZSAqLworICAgICAgICBlbHNlIGlmIChhdmN0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlIDw9IEZGX0NPTVBMSUFOQ0VfVU5PRkZJQ0lBTCAmJgorICAgICAgICAgICAgICAgICAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQIHx8CisgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlAgfHwKKyAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDQ0UCkpCisgICAgICAgICAgICBmb3JtYXRfc3VwcG9ydGVkID0gMTsKKworICAgICAgICBpZiAoIWZvcm1hdF9zdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiY29sb3JzcGFjZSBub3Qgc3VwcG9ydGVkIGluIGpwZWdcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1lVVjQyMFApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAib25seSBZVVY0MjAgaXMgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQ0NFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6CisgICAgICAgIHMtPmNocm9tYV9mb3JtYXQgPSBDSFJPTUFfNDQ0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQyMlA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6CisgICAgICAgIHMtPmNocm9tYV9mb3JtYXQgPSBDSFJPTUFfNDIyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQyMFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgZGVmYXVsdDoKKyAgICAgICAgcy0+Y2hyb21hX2Zvcm1hdCA9IENIUk9NQV80MjA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHMtPmJpdF9yYXRlID0gYXZjdHgtPmJpdF9yYXRlOworICAgIHMtPndpZHRoICAgID0gYXZjdHgtPndpZHRoOworICAgIHMtPmhlaWdodCAgID0gYXZjdHgtPmhlaWdodDsKKyAgICBpZiAoYXZjdHgtPmdvcF9zaXplID4gNjAwICYmCisgICAgICAgIGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgImtleWZyYW1lIGludGVydmFsIHRvbyBsYXJnZSEsIHJlZHVjaW5nIGl0IGZyb20gJWQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+Z29wX3NpemUsIDYwMCk7CisgICAgICAgIGF2Y3R4LT5nb3Bfc2l6ZSA9IDYwMDsKKyAgICB9CisgICAgcy0+Z29wX3NpemUgICAgID0gYXZjdHgtPmdvcF9zaXplOworICAgIHMtPmF2Y3R4ICAgICAgICA9IGF2Y3R4OworICAgIHMtPmZsYWdzICAgICAgICA9IGF2Y3R4LT5mbGFnczsKKyAgICBzLT5mbGFnczIgICAgICAgPSBhdmN0eC0+ZmxhZ3MyOworICAgIGlmIChhdmN0eC0+bWF4X2JfZnJhbWVzID4gTUFYX0JfRlJBTUVTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgQi1mcmFtZXMgcmVxdWVzdGVkLCBtYXhpbXVtICIKKyAgICAgICAgICAgICAgICJpcyAlZC5cbiIsIE1BWF9CX0ZSQU1FUyk7CisgICAgICAgIGF2Y3R4LT5tYXhfYl9mcmFtZXMgPSBNQVhfQl9GUkFNRVM7CisgICAgfQorICAgIHMtPm1heF9iX2ZyYW1lcyA9IGF2Y3R4LT5tYXhfYl9mcmFtZXM7CisgICAgcy0+Y29kZWNfaWQgICAgID0gYXZjdHgtPmNvZGVjLT5pZDsKKyAgICBzLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPSBhdmN0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlOworICAgIHMtPnF1YXJ0ZXJfc2FtcGxlICAgICA9IChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FQRUwpICE9IDA7CisgICAgcy0+bXBlZ19xdWFudCAgICAgICAgID0gYXZjdHgtPm1wZWdfcXVhbnQ7CisgICAgcy0+cnRwX21vZGUgICAgICAgICAgID0gISFhdmN0eC0+cnRwX3BheWxvYWRfc2l6ZTsKKyAgICBzLT5pbnRyYV9kY19wcmVjaXNpb24gPSBhdmN0eC0+aW50cmFfZGNfcHJlY2lzaW9uOworCisgICAgLy8gd29ya2Fyb3VuZCBzb21lIGRpZmZlcmVuY2VzIGJldHdlZW4gaG93IGFwcGxpY2F0aW9ucyBzcGVjaWZ5IGRjIHByZWNpc3Npb24KKyAgICBpZiAocy0+aW50cmFfZGNfcHJlY2lzaW9uIDwgMCkgeworICAgICAgICBzLT5pbnRyYV9kY19wcmVjaXNpb24gKz0gODsKKyAgICB9IGVsc2UgaWYgKHMtPmludHJhX2RjX3ByZWNpc2lvbiA+PSA4KQorICAgICAgICBzLT5pbnRyYV9kY19wcmVjaXNpb24gLT0gODsKKworICAgIGlmIChzLT5pbnRyYV9kY19wcmVjaXNpb24gPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJpbnRyYSBkYyBwcmVjaXNpb24gbXVzdCBiZSBwb3NpdGl2ZSwgbm90ZSBzb21lIGFwcGxpY2F0aW9ucyB1c2UiCisgICAgICAgICAgICAgICAgIiAwIGFuZCBzb21lIDggYXMgYmFzZSBtZWFuaW5nIDhiaXQsIHRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBzbWFsbGVyIHRoYW4gdGhhdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKHMtPmludHJhX2RjX3ByZWNpc2lvbiA+IChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTyA/IDMgOiAwKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludHJhIGRjIHByZWNpc2lvbiB0b28gbGFyZ2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBzLT51c2VyX3NwZWNpZmllZF9wdHMgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIGlmIChzLT5nb3Bfc2l6ZSA8PSAxKSB7CisgICAgICAgIHMtPmludHJhX29ubHkgPSAxOworICAgICAgICBzLT5nb3Bfc2l6ZSAgID0gMTI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+aW50cmFfb25seSA9IDA7CisgICAgfQorCisgICAgcy0+bWVfbWV0aG9kID0gYXZjdHgtPm1lX21ldGhvZDsKKworICAgIC8qIEZpeGVkIFFTQ0FMRSAqLworICAgIHMtPmZpeGVkX3FzY2FsZSA9ICEhKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUVNDQUxFKTsKKworI2lmIEZGX0FQSV9NUFZfT1BUCisgICAgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGlmIChhdmN0eC0+Ym9yZGVyX21hc2tpbmcgIT0gMC4wKQorICAgICAgICBzLT5ib3JkZXJfbWFza2luZyA9IGF2Y3R4LT5ib3JkZXJfbWFza2luZzsKKyAgICBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorCisgICAgcy0+YWRhcHRpdmVfcXVhbnQgPSAocy0+YXZjdHgtPmx1bWlfbWFza2luZyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5kYXJrX21hc2tpbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+dGVtcG9yYWxfY3BseF9tYXNraW5nIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnNwYXRpYWxfY3BseF9tYXNraW5nICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5wX21hc2tpbmcgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJvcmRlcl9tYXNraW5nIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX1FQX1JEKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFzLT5maXhlZF9xc2NhbGU7CisKKyAgICBzLT5sb29wX2ZpbHRlciAgICAgID0gISEocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0xPT1BfRklMVEVSKTsKKworICAgIGlmIChhdmN0eC0+cmNfbWF4X3JhdGUgJiYgIWF2Y3R4LT5yY19idWZmZXJfc2l6ZSkgeworICAgICAgICBzd2l0Y2goYXZjdHgtPmNvZGVjX2lkKSB7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTzoKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOgorICAgICAgICAgICAgYXZjdHgtPnJjX2J1ZmZlcl9zaXplID0gRkZNQVgoYXZjdHgtPnJjX21heF9yYXRlLCAxNTAwMDAwMCkgKiAxMTJMIC8gMTUwMDAwMDAgKiAxNjM4NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01TTVBFRzRWMToKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NU01QRUc0VjI6CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVNNUEVHNFYzOgorICAgICAgICAgICAgaWYgICAgICAgKGF2Y3R4LT5yY19tYXhfcmF0ZSA+PSAxNTAwMDAwMCkgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5yY19idWZmZXJfc2l6ZSA9IDMyMCArIChhdmN0eC0+cmNfbWF4X3JhdGUgLSAxNTAwMDAwMEwpICogKDc2MC0zMjApIC8gKDM4NDAwMDAwIC0gMTUwMDAwMDApOworICAgICAgICAgICAgfSBlbHNlIGlmKGF2Y3R4LT5yY19tYXhfcmF0ZSA+PSAgMjAwMDAwMCkgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5yY19idWZmZXJfc2l6ZSA9ICA4MCArIChhdmN0eC0+cmNfbWF4X3JhdGUgLSAgMjAwMDAwMEwpICogKDMyMC0gODApIC8gKDE1MDAwMDAwIC0gIDIwMDAwMDApOworICAgICAgICAgICAgfSBlbHNlIGlmKGF2Y3R4LT5yY19tYXhfcmF0ZSA+PSAgIDM4NDAwMCkgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5yY19idWZmZXJfc2l6ZSA9ICA0MCArIChhdmN0eC0+cmNfbWF4X3JhdGUgLSAgIDM4NDAwMEwpICogKCA4MC0gNDApIC8gKCAyMDAwMDAwIC0gICAzODQwMDApOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYXZjdHgtPnJjX2J1ZmZlcl9zaXplID0gNDA7CisgICAgICAgICAgICBhdmN0eC0+cmNfYnVmZmVyX3NpemUgKj0gMTYzODQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZjdHgtPnJjX2J1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiQXV0b21hdGljYWxseSBjaG9vc2luZyBWQlYgYnVmZmVyIHNpemUgb2YgJWQga2J5dGVcbiIsIGF2Y3R4LT5yY19idWZmZXJfc2l6ZS84MTkyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoIWF2Y3R4LT5yY19tYXhfcmF0ZSkgIT0gKCFhdmN0eC0+cmNfYnVmZmVyX3NpemUpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRWl0aGVyIGJvdGggYnVmZmVyIHNpemUgYW5kIG1heCByYXRlIG9yIG5laXRoZXIgbXVzdCBiZSBzcGVjaWZpZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5yY19taW5fcmF0ZSAmJiBhdmN0eC0+cmNfbWF4X3JhdGUgIT0gYXZjdHgtPnJjX21pbl9yYXRlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAiV2FybmluZyBtaW5fcmF0ZSA+IDAgYnV0IG1pbl9yYXRlICE9IG1heF9yYXRlIGlzbid0IHJlY29tbWVuZGVkIVxuIik7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5yY19taW5fcmF0ZSAmJiBhdmN0eC0+cmNfbWluX3JhdGUgPiBhdmN0eC0+Yml0X3JhdGUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJiaXRyYXRlIGJlbG93IG1pbiBiaXRyYXRlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cmNfbWF4X3JhdGUgJiYgYXZjdHgtPnJjX21heF9yYXRlIDwgYXZjdHgtPmJpdF9yYXRlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYml0cmF0ZSBhYm92ZSBtYXggYml0cmF0ZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPnJjX21heF9yYXRlICYmCisgICAgICAgIGF2Y3R4LT5yY19tYXhfcmF0ZSA9PSBhdmN0eC0+Yml0X3JhdGUgJiYKKyAgICAgICAgYXZjdHgtPnJjX21heF9yYXRlICE9IGF2Y3R4LT5yY19taW5fcmF0ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgImltcG9zc2libGUgYml0cmF0ZSBjb25zdHJhaW50cywgdGhpcyB3aWxsIGZhaWxcbiIpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cmNfYnVmZmVyX3NpemUgJiYKKyAgICAgICAgYXZjdHgtPmJpdF9yYXRlICogKGludDY0X3QpYXZjdHgtPnRpbWVfYmFzZS5udW0gPgorICAgICAgICAgICAgYXZjdHgtPnJjX2J1ZmZlcl9zaXplICogKGludDY0X3QpYXZjdHgtPnRpbWVfYmFzZS5kZW4pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJWQlYgYnVmZmVyIHRvbyBzbWFsbCBmb3IgYml0cmF0ZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIXMtPmZpeGVkX3FzY2FsZSAmJgorICAgICAgICBhdmN0eC0+Yml0X3JhdGUgKiBhdl9xMmQoYXZjdHgtPnRpbWVfYmFzZSkgPgorICAgICAgICAgICAgYXZjdHgtPmJpdF9yYXRlX3RvbGVyYW5jZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgImJpdHJhdGUgdG9sZXJhbmNlICVkIHRvbyBzbWFsbCBmb3IgYml0cmF0ZSAlZCwgb3ZlcnJpZGluZ1xuIiwgYXZjdHgtPmJpdF9yYXRlX3RvbGVyYW5jZSwgYXZjdHgtPmJpdF9yYXRlKTsKKyAgICAgICAgYXZjdHgtPmJpdF9yYXRlX3RvbGVyYW5jZSA9IDUgKiBhdmN0eC0+Yml0X3JhdGUgKiBhdl9xMmQoYXZjdHgtPnRpbWVfYmFzZSk7CisgICAgfQorCisgICAgaWYgKHMtPmF2Y3R4LT5yY19tYXhfcmF0ZSAmJgorICAgICAgICBzLT5hdmN0eC0+cmNfbWluX3JhdGUgPT0gcy0+YXZjdHgtPnJjX21heF9yYXRlICYmCisgICAgICAgIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPIHx8CisgICAgICAgICBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSAmJgorICAgICAgICA5MDAwMExMICogKGF2Y3R4LT5yY19idWZmZXJfc2l6ZSAtIDEpID4KKyAgICAgICAgICAgIHMtPmF2Y3R4LT5yY19tYXhfcmF0ZSAqIDB4RkZGRkxMKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAiV2FybmluZyB2YnZfZGVsYXkgd2lsbCBiZSBzZXQgdG8gMHhGRkZGICg9VkJSKSBhcyB0aGUgIgorICAgICAgICAgICAgICAgInNwZWNpZmllZCB2YnYgYnVmZmVyIGlzIHRvbyBsYXJnZSBmb3IgdGhlIGdpdmVuIGJpdHJhdGUhXG4iKTsKKyAgICB9CisKKyAgICBpZiAoKHMtPmZsYWdzICYgQ09ERUNfRkxBR180TVYpICAmJiBzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUEVHNCAmJgorICAgICAgICBzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9IMjYzICYmIHMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0gyNjNQICYmCisgICAgICAgIHMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0ZMVjEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICI0TVYgbm90IHN1cHBvcnRlZCBieSBjb2RlY1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocy0+b2JtYyAmJiBzLT5hdmN0eC0+bWJfZGVjaXNpb24gIT0gRkZfTUJfREVDSVNJT05fU0lNUExFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk9CTUMgaXMgb25seSBzdXBwb3J0ZWQgd2l0aCBzaW1wbGUgbWIgZGVjaXNpb25cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHMtPnF1YXJ0ZXJfc2FtcGxlICYmIHMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QRUc0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicXBlbCBub3Qgc3VwcG9ydGVkIGJ5IGNvZGVjXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT5tYXhfYl9mcmFtZXMgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgIHMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QRUc0ICAgICAgJiYKKyAgICAgICAgcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzFWSURFTyAmJgorICAgICAgICBzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYiBmcmFtZXMgbm90IHN1cHBvcnRlZCBieSBjb2RlY1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHMtPm1heF9iX2ZyYW1lcyA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAibWF4IGIgZnJhbWVzIG11c3QgYmUgMCBvciBwb3NpdGl2ZSBmb3IgbXBlZ3ZpZGVvIGJhc2VkIGVuY29kZXJzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICgocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQgfHwKKyAgICAgICAgIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjMgIHx8CisgICAgICAgICBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzUCkgJiYKKyAgICAgICAgKGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA+IDI1NSB8fAorICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID4gMjU1KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkludmFsaWQgcGl4ZWwgYXNwZWN0IHJhdGlvICVpLyVpLCBsaW1pdCBpcyAyNTUvMjU1IHJlZHVjaW5nXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICBhdl9yZWR1Y2UoJmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgJmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sIDI1NSk7CisgICAgfQorCisgICAgaWYgKChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzICB8fAorICAgICAgICAgcy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2M1ApICYmCisgICAgICAgIChhdmN0eC0+d2lkdGggID4gMjA0OCB8fAorICAgICAgICAgYXZjdHgtPmhlaWdodCA+IDExNTIgKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkguMjYzIGRvZXMgbm90IHN1cHBvcnQgcmVzb2x1dGlvbnMgYWJvdmUgMjA0OHgxMTUyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjMgIHx8CisgICAgICAgICBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzUCkgJiYKKyAgICAgICAgKChhdmN0eC0+d2lkdGggJjMpIHx8CisgICAgICAgICAoYXZjdHgtPmhlaWdodCYzKSApKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidy9oIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPICYmCisgICAgICAgIChhdmN0eC0+d2lkdGggID4gNDA5NSB8fAorICAgICAgICAgYXZjdHgtPmhlaWdodCA+IDQwOTUgKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1QRUctMSBkb2VzIG5vdCBzdXBwb3J0IHJlc29sdXRpb25zIGFib3ZlIDQwOTV4NDA5NVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTyAmJgorICAgICAgICAoYXZjdHgtPndpZHRoICA+IDE2MzgzIHx8CisgICAgICAgICBhdmN0eC0+aGVpZ2h0ID4gMTYzODMgKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1QRUctMiBkb2VzIG5vdCBzdXBwb3J0IHJlc29sdXRpb25zIGFib3ZlIDE2MzgzeDE2MzgzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjEwICYmCisgICAgICAgIChhdmN0eC0+d2lkdGggJjE1IHx8CisgICAgICAgICBhdmN0eC0+aGVpZ2h0JjE1ICkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWMjAgJiYKKyAgICAgICAgKGF2Y3R4LT53aWR0aCAmMyB8fAorICAgICAgICAgYXZjdHgtPmhlaWdodCYzICkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNVjEgfHwKKyAgICAgICAgIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNVjIpICYmCisgICAgICAgICBhdmN0eC0+d2lkdGggJiAxKSB7CisgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIndpZHRoIG11c3QgYmUgbXVsdGlwbGUgb2YgMlxuIik7CisgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKChzLT5mbGFncyAmIChDT0RFQ19GTEFHX0lOVEVSTEFDRURfRENUIHwgQ09ERUNfRkxBR19JTlRFUkxBQ0VEX01FKSkgJiYKKyAgICAgICAgcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzQgJiYgcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludGVybGFjaW5nIG5vdCBzdXBwb3J0ZWQgYnkgY29kZWNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gRklYTUUgbXBlZzIgdXNlcyB0aGF0IHRvbworICAgIGlmIChzLT5tcGVnX3F1YW50ICYmICggICBzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUEVHNAorICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJtcGVnMiBzdHlsZSBxdWFudGl6YXRpb24gbm90IHN1cHBvcnRlZCBieSBjb2RlY1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX0NCUF9SRCkgJiYgIWF2Y3R4LT50cmVsbGlzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ0JQIFJEIG5lZWRzIHRyZWxsaXMgcXVhbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKChzLT5tcHZfZmxhZ3MgJiBGRl9NUFZfRkxBR19RUF9SRCkgJiYKKyAgICAgICAgcy0+YXZjdHgtPm1iX2RlY2lzaW9uICE9IEZGX01CX0RFQ0lTSU9OX1JEKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUVAgUkQgbmVlZHMgbWJkPTJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHMtPmF2Y3R4LT5zY2VuZWNoYW5nZV90aHJlc2hvbGQgPCAxMDAwMDAwMDAwICYmCisgICAgICAgIChzLT5mbGFncyAmIENPREVDX0ZMQUdfQ0xPU0VEX0dPUCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiY2xvc2VkIGdvcCB3aXRoIHNjZW5lIGNoYW5nZSBkZXRlY3Rpb24gYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LCAiCisgICAgICAgICAgICAgICAic2V0IHRocmVzaG9sZCB0byAxMDAwMDAwMDAwXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfTE9XX0RFTEFZKSB7CisgICAgICAgIGlmIChzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJsb3cgZGVsYXkgZm9yY2luZyBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgbXBlZzJcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5tYXhfYl9mcmFtZXMgIT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImIgZnJhbWVzIGNhbm5vdCBiZSB1c2VkIHdpdGggbG93IGRlbGF5XG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5xX3NjYWxlX3R5cGUgPT0gMSkgeworICAgICAgICBpZiAoYXZjdHgtPnFtYXggPiAxMikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIm5vbiBsaW5lYXIgcXVhbnQgb25seSBzdXBwb3J0cyBxbWF4IDw9IDEyIGN1cnJlbnRseVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+YXZjdHgtPnRocmVhZF9jb3VudCA+IDEgICAgICAgICAmJgorICAgICAgICBzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUEVHNCAgICAgICYmCisgICAgICAgIHMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QRUcxVklERU8gJiYKKyAgICAgICAgcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTyAmJgorICAgICAgICBzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NSlBFRyAgICAgICYmCisgICAgICAgIChzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9IMjYzUCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAibXVsdGkgdGhyZWFkZWQgZW5jb2Rpbmcgbm90IHN1cHBvcnRlZCBieSBjb2RlY1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocy0+YXZjdHgtPnRocmVhZF9jb3VudCA8IDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiYXV0b21hdGljIHRocmVhZCBudW1iZXIgZGV0ZWN0aW9uIG5vdCBzdXBwb3J0ZWQgYnkgY29kZWMsICIKKyAgICAgICAgICAgICAgICJwYXRjaCB3ZWxjb21lXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT5hdmN0eC0+c2xpY2VzID4gMSB8fCBzLT5hdmN0eC0+dGhyZWFkX2NvdW50ID4gMSkKKyAgICAgICAgcy0+cnRwX21vZGUgPSAxOworCisgICAgaWYgKHMtPmF2Y3R4LT50aHJlYWRfY291bnQgPiAxICYmIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjNQKQorICAgICAgICBzLT5oMjYzX3NsaWNlX3N0cnVjdHVyZWQgPSAxOworCisgICAgaWYgKCFhdmN0eC0+dGltZV9iYXNlLmRlbiB8fCAhYXZjdHgtPnRpbWVfYmFzZS5udW0pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmcmFtZXJhdGUgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmJfZnJhbWVfc3RyYXRlZ3kgJiYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzIpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAibm90aWNlOiBiX2ZyYW1lX3N0cmF0ZWd5IG9ubHkgYWZmZWN0cyB0aGUgZmlyc3QgcGFzc1xuIik7CisgICAgICAgIGF2Y3R4LT5iX2ZyYW1lX3N0cmF0ZWd5ID0gMDsKKyAgICB9CisKKyAgICBpID0gYXZfZ2NkKGF2Y3R4LT50aW1lX2Jhc2UuZGVuLCBhdmN0eC0+dGltZV9iYXNlLm51bSk7CisgICAgaWYgKGkgPiAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJyZW1vdmluZyBjb21tb24gZmFjdG9ycyBmcm9tIGZyYW1lcmF0ZVxuIik7CisgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UuZGVuIC89IGk7CisgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UubnVtIC89IGk7CisgICAgICAgIC8vcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT5tcGVnX3F1YW50IHx8IHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8gfHwgcy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTyB8fCBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRyB8fCBzLT5jb2RlY19pZD09QVZfQ09ERUNfSURfQU1WKSB7CisgICAgICAgIC8vIChhICsgeCAqIDMgLyA4KSAvIHgKKyAgICAgICAgcy0+aW50cmFfcXVhbnRfYmlhcyA9IDMgPDwgKFFVQU5UX0JJQVNfU0hJRlQgLSAzKTsKKyAgICAgICAgcy0+aW50ZXJfcXVhbnRfYmlhcyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+aW50cmFfcXVhbnRfYmlhcyA9IDA7CisgICAgICAgIC8vIChhIC0geCAvIDQpIC8geAorICAgICAgICBzLT5pbnRlcl9xdWFudF9iaWFzID0gLSgxIDw8IChRVUFOVF9CSUFTX1NISUZUIC0gMikpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cW1pbiA+IGF2Y3R4LT5xbWF4IHx8IGF2Y3R4LT5xbWluIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJxbWluIGFuZCBvciBxbWF4IGFyZSBpbnZhbGlkLCB0aGV5IG11c3QgYmUgMCA8IG1pbiA8PSBtYXhcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+aW50cmFfcXVhbnRfYmlhcyAhPSBGRl9ERUZBVUxUX1FVQU5UX0JJQVMpCisgICAgICAgIHMtPmludHJhX3F1YW50X2JpYXMgPSBhdmN0eC0+aW50cmFfcXVhbnRfYmlhczsKKyAgICBpZiAoYXZjdHgtPmludGVyX3F1YW50X2JpYXMgIT0gRkZfREVGQVVMVF9RVUFOVF9CSUFTKQorICAgICAgICBzLT5pbnRlcl9xdWFudF9iaWFzID0gYXZjdHgtPmludGVyX3F1YW50X2JpYXM7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImludHJhX3F1YW50X2JpYXMgPSAlZCBpbnRlcl9xdWFudF9iaWFzID0gJWRcbiIscy0+aW50cmFfcXVhbnRfYmlhcyxzLT5pbnRlcl9xdWFudF9iaWFzKTsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQgJiYKKyAgICAgICAgcy0+YXZjdHgtPnRpbWVfYmFzZS5kZW4gPiAoMSA8PCAxNikgLSAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInRpbWViYXNlICVkLyVkIG5vdCBzdXBwb3J0ZWQgYnkgTVBFRyA0IHN0YW5kYXJkLCAiCisgICAgICAgICAgICAgICAidGhlIG1heGltdW0gYWRtaXR0ZWQgdmFsdWUgZm9yIHRoZSB0aW1lYmFzZSBkZW5vbWluYXRvciAiCisgICAgICAgICAgICAgICAiaXMgJWRcbiIsIHMtPmF2Y3R4LT50aW1lX2Jhc2UubnVtLCBzLT5hdmN0eC0+dGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICgxIDw8IDE2KSAtIDEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHMtPnRpbWVfaW5jcmVtZW50X2JpdHMgPSBhdl9sb2cyKHMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuIC0gMSkgKyAxOworCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWMtPmlkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPOgorICAgICAgICBzLT5vdXRfZm9ybWF0ID0gRk1UX01QRUcxOworICAgICAgICBzLT5sb3dfZGVsYXkgID0gISEocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0xPV19ERUxBWSk7CisgICAgICAgIGF2Y3R4LT5kZWxheSAgPSBzLT5sb3dfZGVsYXkgPyAwIDogKHMtPm1heF9iX2ZyYW1lcyArIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcyVklERU86CisgICAgICAgIHMtPm91dF9mb3JtYXQgPSBGTVRfTVBFRzE7CisgICAgICAgIHMtPmxvd19kZWxheSAgPSAhIShzLT5mbGFncyAmIENPREVDX0ZMQUdfTE9XX0RFTEFZKTsKKyAgICAgICAgYXZjdHgtPmRlbGF5ICA9IHMtPmxvd19kZWxheSA/IDAgOiAocy0+bWF4X2JfZnJhbWVzICsgMSk7CisgICAgICAgIHMtPnJ0cF9tb2RlICAgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01KUEVHOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQU1WOgorICAgICAgICBzLT5vdXRfZm9ybWF0ID0gRk1UX01KUEVHOworICAgICAgICBzLT5pbnRyYV9vbmx5ID0gMTsgLyogZm9yY2UgaW50cmEgb25seSBmb3IganBlZyAqLworICAgICAgICBpZiAoIUNPTkZJR19NSlBFR19FTkNPREVSIHx8CisgICAgICAgICAgICBmZl9tanBlZ19lbmNvZGVfaW5pdChzKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGF2Y3R4LT5kZWxheSA9IDA7CisgICAgICAgIHMtPmxvd19kZWxheSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2MToKKyAgICAgICAgaWYgKCFDT05GSUdfSDI2MV9FTkNPREVSKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoZmZfaDI2MV9nZXRfcGljdHVyZV9mb3JtYXQocy0+d2lkdGgsIHMtPmhlaWdodCkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVGhlIHNwZWNpZmllZCBwaWN0dXJlIHNpemUgb2YgJWR4JWQgaXMgbm90IHZhbGlkIGZvciB0aGUgIgorICAgICAgICAgICAgICAgICAgICJILjI2MSBjb2RlYy5cblZhbGlkIHNpemVzIGFyZSAxNzZ4MTQ0LCAzNTJ4Mjg4XG4iLAorICAgICAgICAgICAgICAgICAgICBzLT53aWR0aCwgcy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzLT5vdXRfZm9ybWF0ID0gRk1UX0gyNjE7CisgICAgICAgIGF2Y3R4LT5kZWxheSAgPSAwOworICAgICAgICBzLT5sb3dfZGVsYXkgID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzOgorICAgICAgICBpZiAoIUNPTkZJR19IMjYzX0VOQ09ERVIpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChmZl9tYXRjaF8ydWludDE2KGZmX2gyNjNfZm9ybWF0LCBGRl9BUlJBWV9FTEVNUyhmZl9oMjYzX2Zvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPndpZHRoLCBzLT5oZWlnaHQpID09IDgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJUaGUgc3BlY2lmaWVkIHBpY3R1cmUgc2l6ZSBvZiAlZHglZCBpcyBub3QgdmFsaWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAidGhlIEguMjYzIGNvZGVjLlxuVmFsaWQgc2l6ZXMgYXJlIDEyOHg5NiwgMTc2eDE0NCwgIgorICAgICAgICAgICAgICAgICAgICIzNTJ4Mjg4LCA3MDR4NTc2LCBhbmQgMTQwOHgxMTUyLiAiCisgICAgICAgICAgICAgICAgICAgIlRyeSBILjI2MysuXG4iLCBzLT53aWR0aCwgcy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzLT5vdXRfZm9ybWF0ID0gRk1UX0gyNjM7CisgICAgICAgIGF2Y3R4LT5kZWxheSAgPSAwOworICAgICAgICBzLT5sb3dfZGVsYXkgID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzUDoKKyAgICAgICAgcy0+b3V0X2Zvcm1hdCA9IEZNVF9IMjYzOworICAgICAgICBzLT5oMjYzX3BsdXMgID0gMTsKKyAgICAgICAgLyogRnggKi8KKyAgICAgICAgcy0+aDI2M19haWMgICAgICAgID0gKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQUNfUFJFRCkgPyAxIDogMDsKKyAgICAgICAgcy0+bW9kaWZpZWRfcXVhbnQgID0gcy0+aDI2M19haWM7CisgICAgICAgIHMtPmxvb3BfZmlsdGVyICAgICA9IChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0xPT1BfRklMVEVSKSA/IDEgOiAwOworICAgICAgICBzLT51bnJlc3RyaWN0ZWRfbXYgPSBzLT5vYm1jIHx8IHMtPmxvb3BfZmlsdGVyIHx8IHMtPnVtdnBsdXM7CisKKyAgICAgICAgLyogL0Z4ICovCisgICAgICAgIC8qIFRoZXNlIGFyZSBqdXN0IHRvIGJlIHN1cmUgKi8KKyAgICAgICAgYXZjdHgtPmRlbGF5ID0gMDsKKyAgICAgICAgcy0+bG93X2RlbGF5ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9GTFYxOgorICAgICAgICBzLT5vdXRfZm9ybWF0ICAgICAgPSBGTVRfSDI2MzsKKyAgICAgICAgcy0+aDI2M19mbHYgICAgICAgID0gMjsgLyogZm9ybWF0ID0gMTsgMTEtYml0IGNvZGVzICovCisgICAgICAgIHMtPnVucmVzdHJpY3RlZF9tdiA9IDE7CisgICAgICAgIHMtPnJ0cF9tb2RlICA9IDA7IC8qIGRvbid0IGFsbG93IEdPQiAqLworICAgICAgICBhdmN0eC0+ZGVsYXkgPSAwOworICAgICAgICBzLT5sb3dfZGVsYXkgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1JWMTA6CisgICAgICAgIHMtPm91dF9mb3JtYXQgPSBGTVRfSDI2MzsKKyAgICAgICAgYXZjdHgtPmRlbGF5ICA9IDA7CisgICAgICAgIHMtPmxvd19kZWxheSAgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1JWMjA6CisgICAgICAgIHMtPm91dF9mb3JtYXQgICAgICA9IEZNVF9IMjYzOworICAgICAgICBhdmN0eC0+ZGVsYXkgICAgICAgPSAwOworICAgICAgICBzLT5sb3dfZGVsYXkgICAgICAgPSAxOworICAgICAgICBzLT5tb2RpZmllZF9xdWFudCAgPSAxOworICAgICAgICBzLT5oMjYzX2FpYyAgICAgICAgPSAxOworICAgICAgICBzLT5oMjYzX3BsdXMgICAgICAgPSAxOworICAgICAgICBzLT5sb29wX2ZpbHRlciAgICAgPSAxOworICAgICAgICBzLT51bnJlc3RyaWN0ZWRfbXYgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OgorICAgICAgICBzLT5vdXRfZm9ybWF0ICAgICAgPSBGTVRfSDI2MzsKKyAgICAgICAgcy0+aDI2M19wcmVkICAgICAgID0gMTsKKyAgICAgICAgcy0+dW5yZXN0cmljdGVkX212ID0gMTsKKyAgICAgICAgcy0+bG93X2RlbGF5ICAgICAgID0gcy0+bWF4X2JfZnJhbWVzID8gMCA6IDE7CisgICAgICAgIGF2Y3R4LT5kZWxheSAgICAgICA9IHMtPmxvd19kZWxheSA/IDAgOiAocy0+bWF4X2JfZnJhbWVzICsgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVNNUEVHNFYyOgorICAgICAgICBzLT5vdXRfZm9ybWF0ICAgICAgPSBGTVRfSDI2MzsKKyAgICAgICAgcy0+aDI2M19wcmVkICAgICAgID0gMTsKKyAgICAgICAgcy0+dW5yZXN0cmljdGVkX212ID0gMTsKKyAgICAgICAgcy0+bXNtcGVnNF92ZXJzaW9uID0gMjsKKyAgICAgICAgYXZjdHgtPmRlbGF5ICAgICAgID0gMDsKKyAgICAgICAgcy0+bG93X2RlbGF5ICAgICAgID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NU01QRUc0VjM6CisgICAgICAgIHMtPm91dF9mb3JtYXQgICAgICAgID0gRk1UX0gyNjM7CisgICAgICAgIHMtPmgyNjNfcHJlZCAgICAgICAgID0gMTsKKyAgICAgICAgcy0+dW5yZXN0cmljdGVkX212ICAgPSAxOworICAgICAgICBzLT5tc21wZWc0X3ZlcnNpb24gICA9IDM7CisgICAgICAgIHMtPmZsaXBmbG9wX3JvdW5kaW5nID0gMTsKKyAgICAgICAgYXZjdHgtPmRlbGF5ICAgICAgICAgPSAwOworICAgICAgICBzLT5sb3dfZGVsYXkgICAgICAgICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfV01WMToKKyAgICAgICAgcy0+b3V0X2Zvcm1hdCAgICAgICAgPSBGTVRfSDI2MzsKKyAgICAgICAgcy0+aDI2M19wcmVkICAgICAgICAgPSAxOworICAgICAgICBzLT51bnJlc3RyaWN0ZWRfbXYgICA9IDE7CisgICAgICAgIHMtPm1zbXBlZzRfdmVyc2lvbiAgID0gNDsKKyAgICAgICAgcy0+ZmxpcGZsb3Bfcm91bmRpbmcgPSAxOworICAgICAgICBhdmN0eC0+ZGVsYXkgICAgICAgICA9IDA7CisgICAgICAgIHMtPmxvd19kZWxheSAgICAgICAgID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9XTVYyOgorICAgICAgICBzLT5vdXRfZm9ybWF0ICAgICAgICA9IEZNVF9IMjYzOworICAgICAgICBzLT5oMjYzX3ByZWQgICAgICAgICA9IDE7CisgICAgICAgIHMtPnVucmVzdHJpY3RlZF9tdiAgID0gMTsKKyAgICAgICAgcy0+bXNtcGVnNF92ZXJzaW9uICAgPSA1OworICAgICAgICBzLT5mbGlwZmxvcF9yb3VuZGluZyA9IDE7CisgICAgICAgIGF2Y3R4LT5kZWxheSAgICAgICAgID0gMDsKKyAgICAgICAgcy0+bG93X2RlbGF5ICAgICAgICAgPSAxOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYXZjdHgtPmhhc19iX2ZyYW1lcyA9ICFzLT5sb3dfZGVsYXk7CisKKyAgICBzLT5lbmNvZGluZyA9IDE7CisKKyAgICBzLT5wcm9ncmVzc2l2ZV9mcmFtZSAgICA9CisgICAgcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UgPSAhKGF2Y3R4LT5mbGFncyAmIChDT0RFQ19GTEFHX0lOVEVSTEFDRURfRENUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVDX0ZMQUdfSU5URVJMQUNFRF9NRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWx0ZXJuYXRlX3NjYW4pOworCisgICAgLyogaW5pdCAqLworICAgIGZmX21wdl9pZGN0X2luaXQocyk7CisgICAgaWYgKGZmX21wdl9jb21tb25faW5pdChzKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZmX2ZkY3Rkc3BfaW5pdCgmcy0+ZmRzcCwgYXZjdHgpOworICAgIGZmX21lX2NtcF9pbml0KCZzLT5tZWNjLCBhdmN0eCk7CisgICAgZmZfbXBlZ3ZpZGVvZW5jZHNwX2luaXQoJnMtPm1wdmVuY2RzcCwgYXZjdHgpOworICAgIGZmX3BpeGJsb2NrZHNwX2luaXQoJnMtPnBkc3AsIGF2Y3R4KTsKKyAgICBmZl9xcGVsZHNwX2luaXQoJnMtPnFkc3ApOworCisgICAgcy0+YXZjdHgtPmNvZGVkX2ZyYW1lID0gcy0+Y3VycmVudF9waWN0dXJlLmY7CisKKyAgICBpZiAocy0+bXNtcGVnNF92ZXJzaW9uKSB7CisgICAgICAgIEZGX0FMTE9DWl9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5hY19zdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIDIgKiAoTUFYX0xFVkVMICsgMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAoTUFYX1JVTiArIDEpICogMiAqIHNpemVvZihpbnQpLCBmYWlsKTsKKyAgICB9CisgICAgRkZfQUxMT0NaX09SX0dPVE8ocy0+YXZjdHgsIHMtPmF2Y3R4LT5zdGF0c19vdXQsIDI1NiwgZmFpbCk7CisKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+cV9pbnRyYV9tYXRyaXgsICAgNjQgKiAzMiAqIHNpemVvZihpbnQpLCBmYWlsKTsKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+cV9jaHJvbWFfaW50cmFfbWF0cml4LCA2NCAqIDMyICogc2l6ZW9mKGludCksIGZhaWwpOworICAgIEZGX0FMTE9DWl9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5xX2ludGVyX21hdHJpeCwgICA2NCAqIDMyICogc2l6ZW9mKGludCksIGZhaWwpOworICAgIEZGX0FMTE9DWl9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5xX2ludHJhX21hdHJpeDE2LCA2NCAqIDMyICogMiAqIHNpemVvZih1aW50MTZfdCksIGZhaWwpOworICAgIEZGX0FMTE9DWl9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5xX2Nocm9tYV9pbnRyYV9tYXRyaXgxNiwgNjQgKiAzMiAqIDIgKiBzaXplb2YodWludDE2X3QpLCBmYWlsKTsKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+cV9pbnRlcl9tYXRyaXgxNiwgNjQgKiAzMiAqIDIgKiBzaXplb2YodWludDE2X3QpLCBmYWlsKTsKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+aW5wdXRfcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICBNQVhfUElDVFVSRV9DT1VOVCAqIHNpemVvZihQaWN0dXJlICopLCBmYWlsKTsKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+cmVvcmRlcmVkX2lucHV0X3BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgTUFYX1BJQ1RVUkVfQ09VTlQgKiBzaXplb2YoUGljdHVyZSAqKSwgZmFpbCk7CisKKyAgICBpZiAocy0+YXZjdHgtPm5vaXNlX3JlZHVjdGlvbikgeworICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+ZGN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIDY0ICogc2l6ZW9mKHVpbnQxNl90KSwgZmFpbCk7CisgICAgfQorCisgICAgZmZfZGN0X2VuY29kZV9pbml0KHMpOworCisgICAgaWYgKChDT05GSUdfSDI2M1BfRU5DT0RFUiB8fCBDT05GSUdfUlYyMF9FTkNPREVSKSAmJiBzLT5tb2RpZmllZF9xdWFudCkKKyAgICAgICAgcy0+Y2hyb21hX3FzY2FsZV90YWJsZSA9IGZmX2gyNjNfY2hyb21hX3FzY2FsZV90YWJsZTsKKworICAgIHMtPnF1YW50X3ByZWNpc2lvbiA9IDU7CisKKyAgICBmZl9zZXRfY21wKCZzLT5tZWNjLCBzLT5tZWNjLmlsZGN0X2NtcCwgICAgICBzLT5hdmN0eC0+aWxkY3RfY21wKTsKKyAgICBmZl9zZXRfY21wKCZzLT5tZWNjLCBzLT5tZWNjLmZyYW1lX3NraXBfY21wLCBzLT5hdmN0eC0+ZnJhbWVfc2tpcF9jbXApOworCisgICAgaWYgKENPTkZJR19IMjYxX0VOQ09ERVIgJiYgcy0+b3V0X2Zvcm1hdCA9PSBGTVRfSDI2MSkKKyAgICAgICAgZmZfaDI2MV9lbmNvZGVfaW5pdChzKTsKKyAgICBpZiAoQ09ORklHX0gyNjNfRU5DT0RFUiAmJiBzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzKQorICAgICAgICBmZl9oMjYzX2VuY29kZV9pbml0KHMpOworICAgIGlmIChDT05GSUdfTVNNUEVHNF9FTkNPREVSICYmIHMtPm1zbXBlZzRfdmVyc2lvbikKKyAgICAgICAgZmZfbXNtcGVnNF9lbmNvZGVfaW5pdChzKTsKKyAgICBpZiAoKENPTkZJR19NUEVHMVZJREVPX0VOQ09ERVIgfHwgQ09ORklHX01QRUcyVklERU9fRU5DT0RFUikKKyAgICAgICAgJiYgcy0+b3V0X2Zvcm1hdCA9PSBGTVRfTVBFRzEpCisgICAgICAgIGZmX21wZWcxX2VuY29kZV9pbml0KHMpOworCisgICAgLyogaW5pdCBxIG1hdHJpeCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIGludCBqID0gcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ldOworICAgICAgICBpZiAoQ09ORklHX01QRUc0X0VOQ09ERVIgJiYgcy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQgJiYKKyAgICAgICAgICAgIHMtPm1wZWdfcXVhbnQpIHsKKyAgICAgICAgICAgIHMtPmludHJhX21hdHJpeFtqXSA9IGZmX21wZWc0X2RlZmF1bHRfaW50cmFfbWF0cml4W2ldOworICAgICAgICAgICAgcy0+aW50ZXJfbWF0cml4W2pdID0gZmZfbXBlZzRfZGVmYXVsdF9ub25faW50cmFfbWF0cml4W2ldOworICAgICAgICB9IGVsc2UgaWYgKHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjMgfHwgcy0+b3V0X2Zvcm1hdCA9PSBGTVRfSDI2MSkgeworICAgICAgICAgICAgcy0+aW50cmFfbWF0cml4W2pdID0KKyAgICAgICAgICAgIHMtPmludGVyX21hdHJpeFtqXSA9IGZmX21wZWcxX2RlZmF1bHRfbm9uX2ludHJhX21hdHJpeFtpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG1wZWcxLzIgKi8KKyAgICAgICAgICAgIHMtPmludHJhX21hdHJpeFtqXSA9IGZmX21wZWcxX2RlZmF1bHRfaW50cmFfbWF0cml4W2ldOworICAgICAgICAgICAgcy0+aW50ZXJfbWF0cml4W2pdID0gZmZfbXBlZzFfZGVmYXVsdF9ub25faW50cmFfbWF0cml4W2ldOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5hdmN0eC0+aW50cmFfbWF0cml4KQorICAgICAgICAgICAgcy0+aW50cmFfbWF0cml4W2pdID0gcy0+YXZjdHgtPmludHJhX21hdHJpeFtpXTsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5pbnRlcl9tYXRyaXgpCisgICAgICAgICAgICBzLT5pbnRlcl9tYXRyaXhbal0gPSBzLT5hdmN0eC0+aW50ZXJfbWF0cml4W2ldOworICAgIH0KKworICAgIC8qIHByZWNvbXB1dGUgbWF0cml4ICovCisgICAgLyogZm9yIG1qcGVnLCB3ZSBkbyBpbmNsdWRlIHFzY2FsZSBpbiB0aGUgbWF0cml4ICovCisgICAgaWYgKHMtPm91dF9mb3JtYXQgIT0gRk1UX01KUEVHKSB7CisgICAgICAgIGZmX2NvbnZlcnRfbWF0cml4KHMsIHMtPnFfaW50cmFfbWF0cml4LCBzLT5xX2ludHJhX21hdHJpeDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnRyYV9tYXRyaXgsIHMtPmludHJhX3F1YW50X2JpYXMsIGF2Y3R4LT5xbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAzMSwgMSk7CisgICAgICAgIGZmX2NvbnZlcnRfbWF0cml4KHMsIHMtPnFfaW50ZXJfbWF0cml4LCBzLT5xX2ludGVyX21hdHJpeDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnRlcl9tYXRyaXgsIHMtPmludGVyX3F1YW50X2JpYXMsIGF2Y3R4LT5xbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAzMSwgMCk7CisgICAgfQorCisgICAgaWYgKGZmX3JhdGVfY29udHJvbF9pbml0KHMpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisjaWYgRkZfQVBJX0VSUk9SX1JBVEUKKyAgICBGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgaWYgKGF2Y3R4LT5lcnJvcl9yYXRlKQorICAgICAgICBzLT5lcnJvcl9yYXRlID0gYXZjdHgtPmVycm9yX3JhdGU7CisgICAgRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTOworI2VuZGlmCisKKyNpZiBGRl9BUElfTk9STUFMSVpFX0FRUAorICAgIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19OT1JNQUxJWkVfQVFQKQorICAgICAgICBzLT5tcHZfZmxhZ3MgfD0gRkZfTVBWX0ZMQUdfTkFROworICAgIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUzsKKyNlbmRpZgorCisjaWYgRkZfQVBJX01WMAorICAgIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19NVjApCisgICAgICAgIHMtPm1wdl9mbGFncyB8PSBGRl9NUFZfRkxBR19NVjA7CisgICAgRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKworI2lmIEZGX0FQSV9NUFZfT1BUCisgICAgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGlmIChhdmN0eC0+cmNfcXNxdWlzaCAhPSAwLjApCisgICAgICAgIHMtPnJjX3FzcXVpc2ggPSBhdmN0eC0+cmNfcXNxdWlzaDsKKyAgICBpZiAoYXZjdHgtPnJjX3Ftb2RfYW1wICE9IDAuMCkKKyAgICAgICAgcy0+cmNfcW1vZF9hbXAgPSBhdmN0eC0+cmNfcW1vZF9hbXA7CisgICAgaWYgKGF2Y3R4LT5yY19xbW9kX2ZyZXEpCisgICAgICAgIHMtPnJjX3Ftb2RfZnJlcSA9IGF2Y3R4LT5yY19xbW9kX2ZyZXE7CisgICAgaWYgKGF2Y3R4LT5yY19idWZmZXJfYWdncmVzc2l2aXR5ICE9IDEuMCkKKyAgICAgICAgcy0+cmNfYnVmZmVyX2FnZ3Jlc3Npdml0eSA9IGF2Y3R4LT5yY19idWZmZXJfYWdncmVzc2l2aXR5OworICAgIGlmIChhdmN0eC0+cmNfaW5pdGlhbF9jcGx4ICE9IDAuMCkKKyAgICAgICAgcy0+cmNfaW5pdGlhbF9jcGx4ID0gYXZjdHgtPnJjX2luaXRpYWxfY3BseDsKKyAgICBpZiAoYXZjdHgtPmxtaW4pCisgICAgICAgIHMtPmxtaW4gPSBhdmN0eC0+bG1pbjsKKyAgICBpZiAoYXZjdHgtPmxtYXgpCisgICAgICAgIHMtPmxtYXggPSBhdmN0eC0+bG1heDsKKworICAgIGlmIChhdmN0eC0+cmNfZXEpIHsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnJjX2VxKTsKKyAgICAgICAgcy0+cmNfZXEgPSBhdl9zdHJkdXAoYXZjdHgtPnJjX2VxKTsKKyAgICAgICAgaWYgKCFzLT5yY19lcSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisKKyAgICBpZiAoYXZjdHgtPmJfZnJhbWVfc3RyYXRlZ3kgPT0gMikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bWF4X2JfZnJhbWVzICsgMjsgaSsrKSB7CisgICAgICAgICAgICBzLT50bXBfZnJhbWVzW2ldID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICAgICAgICAgIGlmICghcy0+dG1wX2ZyYW1lc1tpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBzLT50bXBfZnJhbWVzW2ldLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgICAgICBzLT50bXBfZnJhbWVzW2ldLT53aWR0aCAgPSBzLT53aWR0aCAgPj4gYXZjdHgtPmJyZF9zY2FsZTsKKyAgICAgICAgICAgIHMtPnRtcF9mcmFtZXNbaV0tPmhlaWdodCA9IHMtPmhlaWdodCA+PiBhdmN0eC0+YnJkX3NjYWxlOworCisgICAgICAgICAgICByZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKHMtPnRtcF9mcmFtZXNbaV0sIDMyKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgZmZfbXB2X2VuY29kZV9lbmQoYXZjdHgpOworICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047Cit9CisKK2F2X2NvbGQgaW50IGZmX21wdl9lbmNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmZl9yYXRlX2NvbnRyb2xfdW5pbml0KHMpOworCisgICAgZmZfbXB2X2NvbW1vbl9lbmQocyk7CisgICAgaWYgKENPTkZJR19NSlBFR19FTkNPREVSICYmCisgICAgICAgIHMtPm91dF9mb3JtYXQgPT0gRk1UX01KUEVHKQorICAgICAgICBmZl9tanBlZ19lbmNvZGVfY2xvc2Uocyk7CisKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmV4dHJhZGF0YSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+dG1wX2ZyYW1lcyk7IGkrKykKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+dG1wX2ZyYW1lc1tpXSk7CisKKyAgICBmZl9mcmVlX3BpY3R1cmVfdGFibGVzKCZzLT5uZXdfcGljdHVyZSk7CisgICAgZmZfbXBlZ191bnJlZl9waWN0dXJlKHMsICZzLT5uZXdfcGljdHVyZSk7CisKKyAgICBhdl9mcmVlcCgmcy0+YXZjdHgtPnN0YXRzX291dCk7CisgICAgYXZfZnJlZXAoJnMtPmFjX3N0YXRzKTsKKworICAgIGlmKHMtPnFfY2hyb21hX2ludHJhX21hdHJpeCAgICE9IHMtPnFfaW50cmFfbWF0cml4ICApIGF2X2ZyZWVwKCZzLT5xX2Nocm9tYV9pbnRyYV9tYXRyaXgpOworICAgIGlmKHMtPnFfY2hyb21hX2ludHJhX21hdHJpeDE2ICE9IHMtPnFfaW50cmFfbWF0cml4MTYpIGF2X2ZyZWVwKCZzLT5xX2Nocm9tYV9pbnRyYV9tYXRyaXgxNik7CisgICAgcy0+cV9jaHJvbWFfaW50cmFfbWF0cml4PSAgIE5VTEw7CisgICAgcy0+cV9jaHJvbWFfaW50cmFfbWF0cml4MTY9IE5VTEw7CisgICAgYXZfZnJlZXAoJnMtPnFfaW50cmFfbWF0cml4KTsKKyAgICBhdl9mcmVlcCgmcy0+cV9pbnRlcl9tYXRyaXgpOworICAgIGF2X2ZyZWVwKCZzLT5xX2ludHJhX21hdHJpeDE2KTsKKyAgICBhdl9mcmVlcCgmcy0+cV9pbnRlcl9tYXRyaXgxNik7CisgICAgYXZfZnJlZXAoJnMtPmlucHV0X3BpY3R1cmUpOworICAgIGF2X2ZyZWVwKCZzLT5yZW9yZGVyZWRfaW5wdXRfcGljdHVyZSk7CisgICAgYXZfZnJlZXAoJnMtPmRjdF9vZmZzZXQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NhZSh1aW50OF90ICpzcmMsIGludCByZWYsIGludCBzdHJpZGUpCit7CisgICAgaW50IHgseTsKKyAgICBpbnQgYWNjID0gMDsKKworICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKSB7CisgICAgICAgICAgICBhY2MgKz0gRkZBQlMoc3JjW3ggKyB5ICogc3RyaWRlXSAtIHJlZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYWNjOworfQorCitzdGF0aWMgaW50IGdldF9pbnRyYV9jb3VudChNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcmVmLCBpbnQgc3RyaWRlKQoreworICAgIGludCB4LCB5LCB3LCBoOworICAgIGludCBhY2MgPSAwOworCisgICAgdyA9IHMtPndpZHRoICAmIH4xNTsKKyAgICBoID0gcy0+aGVpZ2h0ICYgfjE1OworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkgKz0gMTYpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMTYpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSB4ICsgeSAqIHN0cmlkZTsKKyAgICAgICAgICAgIGludCBzYWQgID0gcy0+bWVjYy5zYWRbMF0oTlVMTCwgc3JjICsgb2Zmc2V0LCByZWYgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgMTYpOworICAgICAgICAgICAgaW50IG1lYW4gPSAocy0+bXB2ZW5jZHNwLnBpeF9zdW0oc3JjICsgb2Zmc2V0LCBzdHJpZGUpICsgMTI4KSA+PiA4OworICAgICAgICAgICAgaW50IHNhZSAgPSBnZXRfc2FlKHNyYyArIG9mZnNldCwgbWVhbiwgc3RyaWRlKTsKKworICAgICAgICAgICAgYWNjICs9IHNhZSArIDUwMCA8IHNhZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWNjOworfQorCisKK3N0YXRpYyBpbnQgbG9hZF9pbnB1dF9waWN0dXJlKE1wZWdFbmNDb250ZXh0ICpzLCBjb25zdCBBVkZyYW1lICpwaWNfYXJnKQoreworICAgIFBpY3R1cmUgKnBpYyA9IE5VTEw7CisgICAgaW50NjRfdCBwdHM7CisgICAgaW50IGksIGRpc3BsYXlfcGljdHVyZV9udW1iZXIgPSAwLCByZXQ7CisgICAgY29uc3QgaW50IGVuY29kaW5nX2RlbGF5ID0gcy0+bWF4X2JfZnJhbWVzID8gcy0+bWF4X2JfZnJhbWVzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+bG93X2RlbGF5ID8gMCA6IDEpOworICAgIGludCBkaXJlY3QgPSAxOworCisgICAgaWYgKHBpY19hcmcpIHsKKyAgICAgICAgcHRzID0gcGljX2FyZy0+cHRzOworICAgICAgICBkaXNwbGF5X3BpY3R1cmVfbnVtYmVyID0gcy0+aW5wdXRfcGljdHVyZV9udW1iZXIrKzsKKworICAgICAgICBpZiAocHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBpZiAocy0+dXNlcl9zcGVjaWZpZWRfcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBsYXN0ID0gcy0+dXNlcl9zcGVjaWZpZWRfcHRzOworCisgICAgICAgICAgICAgICAgaWYgKHB0cyA8PSBsYXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcHRzICglIlBSSWQ2NCIpIDw9IGxhc3QgKCUiUFJJZDY0IilcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHMsIGxhc3QpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghcy0+bG93X2RlbGF5ICYmIGRpc3BsYXlfcGljdHVyZV9udW1iZXIgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcy0+ZHRzX2RlbHRhID0gcHRzIC0gbGFzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnVzZXJfc3BlY2lmaWVkX3B0cyA9IHB0czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzLT51c2VyX3NwZWNpZmllZF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICBzLT51c2VyX3NwZWNpZmllZF9wdHMgPQorICAgICAgICAgICAgICAgIHB0cyA9IHMtPnVzZXJfc3BlY2lmaWVkX3B0cyArIDE7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IEFWRnJhbWUucHRzPT8gdHJ5aW5nIHRvIGd1ZXNzICglIlBSSWQ2NCIpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwdHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdHMgPSBkaXNwbGF5X3BpY3R1cmVfbnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBpY19hcmcpIHsKKyAgICAgICAgaWYgKCFwaWNfYXJnLT5idWZbMF0gfHwKKyAgICAgICAgICAgIHBpY19hcmctPmxpbmVzaXplWzBdICE9IHMtPmxpbmVzaXplIHx8CisgICAgICAgICAgICBwaWNfYXJnLT5saW5lc2l6ZVsxXSAhPSBzLT51dmxpbmVzaXplIHx8CisgICAgICAgICAgICBwaWNfYXJnLT5saW5lc2l6ZVsyXSAhPSBzLT51dmxpbmVzaXplKQorICAgICAgICAgICAgZGlyZWN0ID0gMDsKKyAgICAgICAgaWYgKChzLT53aWR0aCAmIDE1KSB8fCAocy0+aGVpZ2h0ICYgMTUpKQorICAgICAgICAgICAgZGlyZWN0ID0gMDsKKyAgICAgICAgaWYgKCgoaW50cHRyX3QpKHBpY19hcmctPmRhdGFbMF0pKSAmIChTVFJJREVfQUxJR04tMSkpCisgICAgICAgICAgICBkaXJlY3QgPSAwOworICAgICAgICBpZiAocy0+bGluZXNpemUgJiAoU1RSSURFX0FMSUdOLTEpKQorICAgICAgICAgICAgZGlyZWN0ID0gMDsKKworICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiJWQgJWQgJSJQVFJESUZGX1NQRUNJRklFUiIgJSJQVFJESUZGX1NQRUNJRklFUiJcbiIsIHBpY19hcmctPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgIHBpY19hcmctPmxpbmVzaXplWzFdLCBzLT5saW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSk7CisKKyAgICAgICAgaSA9IGZmX2ZpbmRfdW51c2VkX3BpY3R1cmUocywgZGlyZWN0KTsKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGk7CisKKyAgICAgICAgcGljID0gJnMtPnBpY3R1cmVbaV07CisgICAgICAgIHBpYy0+cmVmZXJlbmNlID0gMzsKKworICAgICAgICBpZiAoZGlyZWN0KSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihwaWMtPmYsIHBpY19hcmcpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGlmIChmZl9hbGxvY19waWN0dXJlKHMsIHBpYywgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGZmX2FsbG9jX3BpY3R1cmUocywgcGljLCAwKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwaWMtPmYtPmRhdGFbMF0gKyBJTlBMQUNFX09GRlNFVCA9PSBwaWNfYXJnLT5kYXRhWzBdICYmCisgICAgICAgICAgICAgICAgcGljLT5mLT5kYXRhWzFdICsgSU5QTEFDRV9PRkZTRVQgPT0gcGljX2FyZy0+ZGF0YVsxXSAmJgorICAgICAgICAgICAgICAgIHBpYy0+Zi0+ZGF0YVsyXSArIElOUExBQ0VfT0ZGU0VUID09IHBpY19hcmctPmRhdGFbMl0pIHsKKyAgICAgICAgICAgICAgICAvLyBlbXB0eQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgaF9jaHJvbWFfc2hpZnQsIHZfY2hyb21hX3NoaWZ0OworICAgICAgICAgICAgICAgIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKHMtPmF2Y3R4LT5waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2Nocm9tYV9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9jaHJvbWFfc2hpZnQpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZSA9IHBpY19hcmctPmxpbmVzaXplW2ldOworICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSA9IGkgPyBzLT51dmxpbmVzaXplIDogcy0+bGluZXNpemU7CisgICAgICAgICAgICAgICAgICAgIGludCBoX3NoaWZ0ID0gaSA/IGhfY2hyb21hX3NoaWZ0IDogMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZfc2hpZnQgPSBpID8gdl9jaHJvbWFfc2hpZnQgOiAwOworICAgICAgICAgICAgICAgICAgICBpbnQgdyA9IHMtPndpZHRoICA+PiBoX3NoaWZ0OworICAgICAgICAgICAgICAgICAgICBpbnQgaCA9IHMtPmhlaWdodCA+PiB2X3NoaWZ0OworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMgPSBwaWNfYXJnLT5kYXRhW2ldOworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBwaWMtPmYtPmRhdGFbaV07CisgICAgICAgICAgICAgICAgICAgIGludCB2cGFkID0gMTY7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAgIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8KKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgRkZBTElHTihzLT5oZWlnaHQsIDMyKSAtIHMtPmhlaWdodCA+IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgdnBhZCA9IDMyOworCisgICAgICAgICAgICAgICAgICAgIGlmICghcy0+YXZjdHgtPnJjX2J1ZmZlcl9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICs9IElOUExBQ0VfT0ZGU0VUOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfc3RyaWRlID09IGRzdF9zdHJpZGUpCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHNyY19zdHJpZGUgKiBoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaDIgPSBoOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0MiA9IGRzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChoMi0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdDIsIHNyYywgdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MiArPSBkc3Rfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgocy0+d2lkdGggJiAxNSkgfHwgKHMtPmhlaWdodCAmICh2cGFkLTEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXB2ZW5jZHNwLmRyYXdfZWRnZXMoZHN0LCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Pj5oX3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnBhZD4+dl9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVER0VfQk9UVE9NKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXQgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKHBpYy0+ZiwgcGljX2FyZyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBwaWMtPmYtPmRpc3BsYXlfcGljdHVyZV9udW1iZXIgPSBkaXNwbGF5X3BpY3R1cmVfbnVtYmVyOworICAgICAgICBwaWMtPmYtPnB0cyA9IHB0czsgLy8gd2Ugc2V0IHRoaXMgaGVyZSB0byBhdm9pZCBtb2RpZml5aW5nIHBpY19hcmcKKyAgICB9CisKKyAgICAvKiBzaGlmdCBidWZmZXIgZW50cmllcyAqLworICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfUElDVFVSRV9DT1VOVCAvKnMtPmVuY29kaW5nX2RlbGF5ICsgMSovOyBpKyspCisgICAgICAgIHMtPmlucHV0X3BpY3R1cmVbaSAtIDFdID0gcy0+aW5wdXRfcGljdHVyZVtpXTsKKworICAgIHMtPmlucHV0X3BpY3R1cmVbZW5jb2RpbmdfZGVsYXldID0gKFBpY3R1cmUqKSBwaWM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBza2lwX2NoZWNrKE1wZWdFbmNDb250ZXh0ICpzLCBQaWN0dXJlICpwLCBQaWN0dXJlICpyZWYpCit7CisgICAgaW50IHgsIHksIHBsYW5lOworICAgIGludCBzY29yZSA9IDA7CisgICAgaW50NjRfdCBzY29yZTY0ID0gMDsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDM7IHBsYW5lKyspIHsKKyAgICAgICAgY29uc3QgaW50IHN0cmlkZSA9IHAtPmYtPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgY29uc3QgaW50IGJ3ID0gcGxhbmUgPyAxIDogMjsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPm1iX2hlaWdodCAqIGJ3OyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5tYl93aWR0aCAqIGJ3OyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgb2ZmID0gcC0+c2hhcmVkID8gMCA6IDE2OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRwdHIgPSBwLT5mLT5kYXRhW3BsYW5lXSArIDggKiAoeCArIHkgKiBzdHJpZGUpICsgb2ZmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJwdHIgPSByZWYtPmYtPmRhdGFbcGxhbmVdICsgOCAqICh4ICsgeSAqIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgaW50IHYgPSBzLT5tZWNjLmZyYW1lX3NraXBfY21wWzFdKHMsIGRwdHIsIHJwdHIsIHN0cmlkZSwgOCk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKEZGQUJTKHMtPmF2Y3R4LT5mcmFtZV9za2lwX2V4cCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHNjb3JlICAgID0gIEZGTUFYKHNjb3JlLCB2KTsgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiBzY29yZSAgICs9IEZGQUJTKHYpOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogc2NvcmU2NCArPSB2ICogKGludDY0X3QpdjsgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogc2NvcmU2NCArPSBGRkFCUyh2ICogKGludDY0X3QpdiAqIHYpOyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogc2NvcmU2NCArPSAodiAqIChpbnQ2NF90KXYpICogKHYgKiAoaW50NjRfdCl2KTsgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbW1zX2MoKTsKKworICAgIGlmIChzY29yZSkKKyAgICAgICAgc2NvcmU2NCA9IHNjb3JlOworICAgIGlmIChzLT5hdmN0eC0+ZnJhbWVfc2tpcF9leHAgPCAwKQorICAgICAgICBzY29yZTY0ID0gcG93KHNjb3JlNjQgLyAoZG91YmxlKShzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgLTEuMC9zLT5hdmN0eC0+ZnJhbWVfc2tpcF9leHApOworCisgICAgaWYgKHNjb3JlNjQgPCBzLT5hdmN0eC0+ZnJhbWVfc2tpcF90aHJlc2hvbGQpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChzY29yZTY0IDwgKChzLT5hdmN0eC0+ZnJhbWVfc2tpcF9mYWN0b3IgKiAoaW50NjRfdClzLT5sYW1iZGEpID4+IDgpKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWUGFja2V0IHBrdCA9IHsgMCB9OworICAgIGludCByZXQsIGdvdF9vdXRwdXQ7CisKKyAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKKyAgICByZXQgPSBhdmNvZGVjX2VuY29kZV92aWRlbzIoYywgJnBrdCwgZnJhbWUsICZnb3Rfb3V0cHV0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IHBrdC5zaXplOworICAgIGF2X2ZyZWVfcGFja2V0KCZwa3QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXN0aW1hdGVfYmVzdF9iX2NvdW50KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIEFWQ29kZWMgKmNvZGVjICAgID0gYXZjb2RlY19maW5kX2VuY29kZXIocy0+YXZjdHgtPmNvZGVjX2lkKTsKKyAgICBBVkNvZGVjQ29udGV4dCAqYyA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoTlVMTCk7CisgICAgY29uc3QgaW50IHNjYWxlID0gcy0+YXZjdHgtPmJyZF9zY2FsZTsKKyAgICBpbnQgaSwgaiwgb3V0X3NpemUsIHBfbGFtYmRhLCBiX2xhbWJkYSwgbGFtYmRhMjsKKyAgICBpbnQ2NF90IGJlc3RfcmQgID0gSU5UNjRfTUFYOworICAgIGludCBiZXN0X2JfY291bnQgPSAtMTsKKworICAgIGF2X2Fzc2VydDAoc2NhbGUgPj0gMCAmJiBzY2FsZSA8PSAzKTsKKworICAgIC8vZW1tc19jKCk7CisgICAgLy9zLT5uZXh0X3BpY3R1cmVfcHRyLT5xdWFsaXR5OworICAgIHBfbGFtYmRhID0gcy0+bGFzdF9sYW1iZGFfZm9yW0FWX1BJQ1RVUkVfVFlQRV9QXTsKKyAgICAvL3BfbGFtYmRhICogRkZBQlMocy0+YXZjdHgtPmJfcXVhbnRfZmFjdG9yKSArIHMtPmF2Y3R4LT5iX3F1YW50X29mZnNldDsKKyAgICBiX2xhbWJkYSA9IHMtPmxhc3RfbGFtYmRhX2ZvcltBVl9QSUNUVVJFX1RZUEVfQl07CisgICAgaWYgKCFiX2xhbWJkYSkgLy8gRklYTUUgd2Ugc2hvdWxkIGRvIHRoaXMgc29tZXdoZXJlIGVsc2UKKyAgICAgICAgYl9sYW1iZGEgPSBwX2xhbWJkYTsKKyAgICBsYW1iZGEyICA9IChiX2xhbWJkYSAqIGJfbGFtYmRhICsgKDEgPDwgRkZfTEFNQkRBX1NISUZUKSAvIDIpID4+CisgICAgICAgICAgICAgICBGRl9MQU1CREFfU0hJRlQ7CisKKyAgICBjLT53aWR0aCAgICAgICAgPSBzLT53aWR0aCAgPj4gc2NhbGU7CisgICAgYy0+aGVpZ2h0ICAgICAgID0gcy0+aGVpZ2h0ID4+IHNjYWxlOworICAgIGMtPmZsYWdzICAgICAgICA9IENPREVDX0ZMQUdfUVNDQUxFIHwgQ09ERUNfRkxBR19QU05SOworICAgIGMtPmZsYWdzICAgICAgIHw9IHMtPmF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUVBFTDsKKyAgICBjLT5tYl9kZWNpc2lvbiAgPSBzLT5hdmN0eC0+bWJfZGVjaXNpb247CisgICAgYy0+bWVfY21wICAgICAgID0gcy0+YXZjdHgtPm1lX2NtcDsKKyAgICBjLT5tYl9jbXAgICAgICAgPSBzLT5hdmN0eC0+bWJfY21wOworICAgIGMtPm1lX3N1Yl9jbXAgICA9IHMtPmF2Y3R4LT5tZV9zdWJfY21wOworICAgIGMtPnBpeF9mbXQgICAgICA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICBjLT50aW1lX2Jhc2UgICAgPSBzLT5hdmN0eC0+dGltZV9iYXNlOworICAgIGMtPm1heF9iX2ZyYW1lcyA9IHMtPm1heF9iX2ZyYW1lczsKKworICAgIGlmIChhdmNvZGVjX29wZW4yKGMsIGNvZGVjLCBOVUxMKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYXhfYl9mcmFtZXMgKyAyOyBpKyspIHsKKyAgICAgICAgUGljdHVyZSBwcmVfaW5wdXQsICpwcmVfaW5wdXRfcHRyID0gaSA/IHMtPmlucHV0X3BpY3R1cmVbaSAtIDFdIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5leHRfcGljdHVyZV9wdHI7CisgICAgICAgIHVpbnQ4X3QgKmRhdGFbNF07CisKKyAgICAgICAgaWYgKHByZV9pbnB1dF9wdHIgJiYgKCFpIHx8IHMtPmlucHV0X3BpY3R1cmVbaSAtIDFdKSkgeworICAgICAgICAgICAgcHJlX2lucHV0ID0gKnByZV9pbnB1dF9wdHI7CisgICAgICAgICAgICBtZW1jcHkoZGF0YSwgcHJlX2lucHV0X3B0ci0+Zi0+ZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKworICAgICAgICAgICAgaWYgKCFwcmVfaW5wdXQuc2hhcmVkICYmIGkpIHsKKyAgICAgICAgICAgICAgICBkYXRhWzBdICs9IElOUExBQ0VfT0ZGU0VUOworICAgICAgICAgICAgICAgIGRhdGFbMV0gKz0gSU5QTEFDRV9PRkZTRVQ7CisgICAgICAgICAgICAgICAgZGF0YVsyXSArPSBJTlBMQUNFX09GRlNFVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+bXB2ZW5jZHNwLnNocmlua1tzY2FsZV0ocy0+dG1wX2ZyYW1lc1tpXS0+ZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRtcF9mcmFtZXNbaV0tPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9pbnB1dC5mLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPndpZHRoLCBjLT5oZWlnaHQpOworICAgICAgICAgICAgcy0+bXB2ZW5jZHNwLnNocmlua1tzY2FsZV0ocy0+dG1wX2ZyYW1lc1tpXS0+ZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRtcF9mcmFtZXNbaV0tPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9pbnB1dC5mLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPndpZHRoID4+IDEsIGMtPmhlaWdodCA+PiAxKTsKKyAgICAgICAgICAgIHMtPm1wdmVuY2RzcC5zaHJpbmtbc2NhbGVdKHMtPnRtcF9mcmFtZXNbaV0tPmRhdGFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50bXBfZnJhbWVzW2ldLT5saW5lc2l6ZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfaW5wdXQuZi0+bGluZXNpemVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT53aWR0aCA+PiAxLCBjLT5oZWlnaHQgPj4gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgcy0+bWF4X2JfZnJhbWVzICsgMTsgaisrKSB7CisgICAgICAgIGludDY0X3QgcmQgPSAwOworCisgICAgICAgIGlmICghcy0+aW5wdXRfcGljdHVyZVtqXSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGMtPmVycm9yWzBdID0gYy0+ZXJyb3JbMV0gPSBjLT5lcnJvclsyXSA9IDA7CisKKyAgICAgICAgcy0+dG1wX2ZyYW1lc1swXS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIHMtPnRtcF9mcmFtZXNbMF0tPnF1YWxpdHkgICA9IDEgKiBGRl9RUDJMQU1CREE7CisKKyAgICAgICAgb3V0X3NpemUgPSBlbmNvZGVfZnJhbWUoYywgcy0+dG1wX2ZyYW1lc1swXSk7CisKKyAgICAgICAgLy9yZCArPSAob3V0X3NpemUgKiBsYW1iZGEyKSA+PiBGRl9MQU1CREFfU0hJRlQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm1heF9iX2ZyYW1lcyArIDE7IGkrKykgeworICAgICAgICAgICAgaW50IGlzX3AgPSBpICUgKGogKyAxKSA9PSBqIHx8IGkgPT0gcy0+bWF4X2JfZnJhbWVzOworCisgICAgICAgICAgICBzLT50bXBfZnJhbWVzW2kgKyAxXS0+cGljdF90eXBlID0gaXNfcCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElDVFVSRV9UWVBFX1AgOiBBVl9QSUNUVVJFX1RZUEVfQjsKKyAgICAgICAgICAgIHMtPnRtcF9mcmFtZXNbaSArIDFdLT5xdWFsaXR5ICAgPSBpc19wID8gcF9sYW1iZGEgOiBiX2xhbWJkYTsKKworICAgICAgICAgICAgb3V0X3NpemUgPSBlbmNvZGVfZnJhbWUoYywgcy0+dG1wX2ZyYW1lc1tpICsgMV0pOworCisgICAgICAgICAgICByZCArPSAob3V0X3NpemUgKiBsYW1iZGEyKSA+PiAoRkZfTEFNQkRBX1NISUZUIC0gMyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgdGhlIGRlbGF5ZWQgZnJhbWVzICovCisgICAgICAgIHdoaWxlIChvdXRfc2l6ZSkgeworICAgICAgICAgICAgb3V0X3NpemUgPSBlbmNvZGVfZnJhbWUoYywgTlVMTCk7CisgICAgICAgICAgICByZCArPSAob3V0X3NpemUgKiBsYW1iZGEyKSA+PiAoRkZfTEFNQkRBX1NISUZUIC0gMyk7CisgICAgICAgIH0KKworICAgICAgICByZCArPSBjLT5lcnJvclswXSArIGMtPmVycm9yWzFdICsgYy0+ZXJyb3JbMl07CisKKyAgICAgICAgaWYgKHJkIDwgYmVzdF9yZCkgeworICAgICAgICAgICAgYmVzdF9yZCA9IHJkOworICAgICAgICAgICAgYmVzdF9iX2NvdW50ID0gajsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2Y29kZWNfY2xvc2UoYyk7CisgICAgYXZfZnJlZXAoJmMpOworCisgICAgcmV0dXJuIGJlc3RfYl9jb3VudDsKK30KKworc3RhdGljIGludCBzZWxlY3RfaW5wdXRfcGljdHVyZShNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgcmV0OworCisgICAgZm9yIChpID0gMTsgaSA8IE1BWF9QSUNUVVJFX0NPVU5UOyBpKyspCisgICAgICAgIHMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlW2kgLSAxXSA9IHMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlW2ldOworICAgIHMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlW01BWF9QSUNUVVJFX0NPVU5UIC0gMV0gPSBOVUxMOworCisgICAgLyogc2V0IG5leHQgcGljdHVyZSB0eXBlICYgb3JkZXJpbmcgKi8KKyAgICBpZiAoIXMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlWzBdICYmIHMtPmlucHV0X3BpY3R1cmVbMF0pIHsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5mcmFtZV9za2lwX3RocmVzaG9sZCB8fCBzLT5hdmN0eC0+ZnJhbWVfc2tpcF9mYWN0b3IpIHsKKyAgICAgICAgICAgIGlmIChzLT5waWN0dXJlX2luX2dvcF9udW1iZXIgPCBzLT5nb3Bfc2l6ZSAmJgorICAgICAgICAgICAgICAgIHMtPm5leHRfcGljdHVyZV9wdHIgJiYKKyAgICAgICAgICAgICAgICBza2lwX2NoZWNrKHMsIHMtPmlucHV0X3BpY3R1cmVbMF0sIHMtPm5leHRfcGljdHVyZV9wdHIpKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgY2hlY2sgdGhhdCB0ZSBnb3AgY2hlY2sgYWJvdmUgaXMgKy0xIGNvcnJlY3QKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5pbnB1dF9waWN0dXJlWzBdLT5mKTsKKworICAgICAgICAgICAgICAgIGZmX3Zidl91cGRhdGUocywgMCk7CisKKyAgICAgICAgICAgICAgICBnb3RvIG5vX291dHB1dF9waWM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoLypzLT5waWN0dXJlX2luX2dvcF9udW1iZXIgPj0gcy0+Z29wX3NpemUgfHwqLworICAgICAgICAgICAgIXMtPm5leHRfcGljdHVyZV9wdHIgfHwgcy0+aW50cmFfb25seSkgeworICAgICAgICAgICAgcy0+cmVvcmRlcmVkX2lucHV0X3BpY3R1cmVbMF0gPSBzLT5pbnB1dF9waWN0dXJlWzBdOworICAgICAgICAgICAgcy0+cmVvcmRlcmVkX2lucHV0X3BpY3R1cmVbMF0tPmYtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICAgICAgcy0+cmVvcmRlcmVkX2lucHV0X3BpY3R1cmVbMF0tPmYtPmNvZGVkX3BpY3R1cmVfbnVtYmVyID0KKyAgICAgICAgICAgICAgICBzLT5jb2RlZF9waWN0dXJlX251bWJlcisrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGJfZnJhbWVzOworCisgICAgICAgICAgICBpZiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1BBU1MyKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm1heF9iX2ZyYW1lcyArIDE7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgcGljdF9udW0gPSBzLT5pbnB1dF9waWN0dXJlWzBdLT5mLT5kaXNwbGF5X3BpY3R1cmVfbnVtYmVyICsgaTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocGljdF9udW0gPj0gcy0+cmNfY29udGV4dC5udW1fZW50cmllcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPmlucHV0X3BpY3R1cmVbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJjX2NvbnRleHQuZW50cnlbcGljdF9udW0gLSAxXS5uZXdfcGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHMtPmlucHV0X3BpY3R1cmVbaV0tPmYtPnBpY3RfdHlwZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5yY19jb250ZXh0LmVudHJ5W3BpY3RfbnVtXS5uZXdfcGljdF90eXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5iX2ZyYW1lX3N0cmF0ZWd5ID09IDApIHsKKyAgICAgICAgICAgICAgICBiX2ZyYW1lcyA9IHMtPm1heF9iX2ZyYW1lczsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYl9mcmFtZXMgJiYgIXMtPmlucHV0X3BpY3R1cmVbYl9mcmFtZXNdKQorICAgICAgICAgICAgICAgICAgICBiX2ZyYW1lcy0tOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hdmN0eC0+Yl9mcmFtZV9zdHJhdGVneSA9PSAxKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHMtPm1heF9iX2ZyYW1lcyArIDE7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+aW5wdXRfcGljdHVyZVtpXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfcGljdHVyZVtpXS0+Yl9mcmFtZV9zY29yZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnB1dF9waWN0dXJlW2ldLT5iX2ZyYW1lX3Njb3JlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaW50cmFfY291bnQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfcGljdHVyZVtpICAgIF0tPmYtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmlucHV0X3BpY3R1cmVbaSAtIDFdLT5mLT5kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lc2l6ZSkgKyAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYXhfYl9mcmFtZXMgKyAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzLT5pbnB1dF9waWN0dXJlW2ldIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnB1dF9waWN0dXJlW2ldLT5iX2ZyYW1lX3Njb3JlIC0gMSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfbnVtIC8gcy0+YXZjdHgtPmJfc2Vuc2l0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiX2ZyYW1lcyA9IEZGTUFYKDAsIGkgLSAxKTsKKworICAgICAgICAgICAgICAgIC8qIHJlc2V0IHNjb3JlcyAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiX2ZyYW1lcyArIDE7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzLT5pbnB1dF9waWN0dXJlW2ldLT5iX2ZyYW1lX3Njb3JlID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmF2Y3R4LT5iX2ZyYW1lX3N0cmF0ZWd5ID09IDIpIHsKKyAgICAgICAgICAgICAgICBiX2ZyYW1lcyA9IGVzdGltYXRlX2Jlc3RfYl9jb3VudChzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIGIgZnJhbWUgc3RyYXRlZ3lcbiIpOworICAgICAgICAgICAgICAgIGJfZnJhbWVzID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW1tc19jKCk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IGJfZnJhbWVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpbnQgdHlwZSA9IHMtPmlucHV0X3BpY3R1cmVbaV0tPmYtPnBpY3RfdHlwZTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSAmJiB0eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgICAgICAgICBiX2ZyYW1lcyA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+aW5wdXRfcGljdHVyZVtiX2ZyYW1lc10tPmYtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJgorICAgICAgICAgICAgICAgIGJfZnJhbWVzID09IHMtPm1heF9iX2ZyYW1lcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZywgdG9vIG1hbnkgYiBmcmFtZXMgaW4gYSByb3dcbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocy0+cGljdHVyZV9pbl9nb3BfbnVtYmVyICsgYl9mcmFtZXMgPj0gcy0+Z29wX3NpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX1NUUklDVF9HT1ApICYmCisgICAgICAgICAgICAgICAgICAgIHMtPmdvcF9zaXplID4gcy0+cGljdHVyZV9pbl9nb3BfbnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGJfZnJhbWVzID0gcy0+Z29wX3NpemUgLSBzLT5waWN0dXJlX2luX2dvcF9udW1iZXIgLSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfQ0xPU0VEX0dPUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJfZnJhbWVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfcGljdHVyZVtiX2ZyYW1lc10tPmYtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChzLT5mbGFncyAmIENPREVDX0ZMQUdfQ0xPU0VEX0dPUCkgJiYgYl9mcmFtZXMgJiYKKyAgICAgICAgICAgICAgICBzLT5pbnB1dF9waWN0dXJlW2JfZnJhbWVzXS0+Zi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKQorICAgICAgICAgICAgICAgIGJfZnJhbWVzLS07CisKKyAgICAgICAgICAgIHMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlWzBdID0gcy0+aW5wdXRfcGljdHVyZVtiX2ZyYW1lc107CisgICAgICAgICAgICBpZiAocy0+cmVvcmRlcmVkX2lucHV0X3BpY3R1cmVbMF0tPmYtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkKKyAgICAgICAgICAgICAgICBzLT5yZW9yZGVyZWRfaW5wdXRfcGljdHVyZVswXS0+Zi0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgICAgICAgICBzLT5yZW9yZGVyZWRfaW5wdXRfcGljdHVyZVswXS0+Zi0+Y29kZWRfcGljdHVyZV9udW1iZXIgPQorICAgICAgICAgICAgICAgIHMtPmNvZGVkX3BpY3R1cmVfbnVtYmVyKys7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYl9mcmFtZXM7IGkrKykgeworICAgICAgICAgICAgICAgIHMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlW2kgKyAxXSA9IHMtPmlucHV0X3BpY3R1cmVbaV07CisgICAgICAgICAgICAgICAgcy0+cmVvcmRlcmVkX2lucHV0X3BpY3R1cmVbaSArIDFdLT5mLT5waWN0X3R5cGUgPQorICAgICAgICAgICAgICAgICAgICBBVl9QSUNUVVJFX1RZUEVfQjsKKyAgICAgICAgICAgICAgICBzLT5yZW9yZGVyZWRfaW5wdXRfcGljdHVyZVtpICsgMV0tPmYtPmNvZGVkX3BpY3R1cmVfbnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgcy0+Y29kZWRfcGljdHVyZV9udW1iZXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK25vX291dHB1dF9waWM6CisgICAgaWYgKHMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlWzBdKSB7CisgICAgICAgIHMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlWzBdLT5yZWZlcmVuY2UgPQorICAgICAgICAgICBzLT5yZW9yZGVyZWRfaW5wdXRfcGljdHVyZVswXS0+Zi0+cGljdF90eXBlICE9CisgICAgICAgICAgICAgICBBVl9QSUNUVVJFX1RZUEVfQiA/IDMgOiAwOworCisgICAgICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLCAmcy0+bmV3X3BpY3R1cmUpOworICAgICAgICBpZiAoKHJldCA9IGZmX21wZWdfcmVmX3BpY3R1cmUocywgJnMtPm5ld19waWN0dXJlLCBzLT5yZW9yZGVyZWRfaW5wdXRfcGljdHVyZVswXSkpKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAocy0+cmVvcmRlcmVkX2lucHV0X3BpY3R1cmVbMF0tPnNoYXJlZCB8fCBzLT5hdmN0eC0+cmNfYnVmZmVyX3NpemUpIHsKKyAgICAgICAgICAgIC8vIGlucHV0IGlzIGEgc2hhcmVkIHBpeCwgc28gd2UgY2FuJ3QgbW9kaWZpeSBpdCAtPiBhbGxvYyBhIG5ldworICAgICAgICAgICAgLy8gb25lICYgZW5zdXJlIHRoYXQgdGhlIHNoYXJlZCBvbmUgaXMgcmV1c2VhYmxlCisKKyAgICAgICAgICAgIFBpY3R1cmUgKnBpYzsKKyAgICAgICAgICAgIGludCBpID0gZmZfZmluZF91bnVzZWRfcGljdHVyZShzLCAwKTsKKyAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIHBpYyA9ICZzLT5waWN0dXJlW2ldOworCisgICAgICAgICAgICBwaWMtPnJlZmVyZW5jZSA9IHMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlWzBdLT5yZWZlcmVuY2U7CisgICAgICAgICAgICBpZiAoZmZfYWxsb2NfcGljdHVyZShzLCBwaWMsIDApIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhwaWMtPmYsIHMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlWzBdLT5mKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIC8qIG1hcmsgdXMgdW51c2VkIC8gZnJlZSBzaGFyZWQgcGljICovCisgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5yZW9yZGVyZWRfaW5wdXRfcGljdHVyZVswXS0+Zik7CisgICAgICAgICAgICBzLT5yZW9yZGVyZWRfaW5wdXRfcGljdHVyZVswXS0+c2hhcmVkID0gMDsKKworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ciA9IHBpYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlucHV0IGlzIG5vdCBhIHNoYXJlZCBwaXggLT4gcmV1c2UgYnVmZmVyIGZvciBjdXJyZW50X3BpeAorICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ciA9IHMtPnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlWzBdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgIHMtPm5ld19waWN0dXJlLmYtPmRhdGFbaV0gKz0gSU5QTEFDRV9PRkZTRVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmZfbXBlZ191bnJlZl9waWN0dXJlKHMsICZzLT5jdXJyZW50X3BpY3R1cmUpOworICAgICAgICBpZiAoKHJldCA9IGZmX21wZWdfcmVmX3BpY3R1cmUocywgJnMtPmN1cnJlbnRfcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHMtPnBpY3R1cmVfbnVtYmVyID0gcy0+bmV3X3BpY3R1cmUuZi0+ZGlzcGxheV9waWN0dXJlX251bWJlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgJnMtPm5ld19waWN0dXJlKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyYW1lX2VuZChNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpZiAocy0+dW5yZXN0cmljdGVkX212ICYmCisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5yZWZlcmVuY2UgJiYKKyAgICAgICAgIXMtPmludHJhX29ubHkpIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzLT5hdmN0eC0+cGl4X2ZtdCk7CisgICAgICAgIGludCBoc2hpZnQgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgICAgICBpbnQgdnNoaWZ0ID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICAgICAgcy0+bXB2ZW5jZHNwLmRyYXdfZWRnZXMocy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3Bvcywgcy0+dl9lZGdlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURHRV9XSURUSCwgRURHRV9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURHRV9UT1AgfCBFREdFX0JPVFRPTSk7CisgICAgICAgIHMtPm1wdmVuY2RzcC5kcmF3X2VkZ2VzKHMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhfZWRnZV9wb3MgPj4gaHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT52X2VkZ2VfcG9zID4+IHZzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURHRV9XSURUSCA+PiBoc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVER0VfV0lEVEggPj4gdnNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREdFX1RPUCB8IEVER0VfQk9UVE9NKTsKKyAgICAgICAgcy0+bXB2ZW5jZHNwLmRyYXdfZWRnZXMocy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5saW5lc2l6ZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3BvcyA+PiBoc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnZfZWRnZV9wb3MgPj4gdnNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREdFX1dJRFRIID4+IGhzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURHRV9XSURUSCA+PiB2c2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVER0VfVE9QIHwgRURHRV9CT1RUT00pOworICAgIH0KKworICAgIGVtbXNfYygpOworCisgICAgcy0+bGFzdF9waWN0X3R5cGUgICAgICAgICAgICAgICAgID0gcy0+cGljdF90eXBlOworICAgIHMtPmxhc3RfbGFtYmRhX2ZvciBbcy0+cGljdF90eXBlXSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnF1YWxpdHk7CisgICAgaWYgKHMtPnBpY3RfdHlwZSE9IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICBzLT5sYXN0X25vbl9iX3BpY3RfdHlwZSA9IHMtPnBpY3RfdHlwZTsKKworICAgIHMtPmF2Y3R4LT5jb2RlZF9mcmFtZSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmY7CisKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX25vaXNlX3JlZHVjdGlvbihNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaW50cmEsIGk7CisKKyAgICBmb3IgKGludHJhID0gMDsgaW50cmEgPCAyOyBpbnRyYSsrKSB7CisgICAgICAgIGlmIChzLT5kY3RfY291bnRbaW50cmFdID4gKDEgPDwgMTYpKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgICAgIHMtPmRjdF9lcnJvcl9zdW1baW50cmFdW2ldID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+ZGN0X2NvdW50W2ludHJhXSA+Pj0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICBzLT5kY3Rfb2Zmc2V0W2ludHJhXVtpXSA9IChzLT5hdmN0eC0+bm9pc2VfcmVkdWN0aW9uICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRjdF9jb3VudFtpbnRyYV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGN0X2Vycm9yX3N1bVtpbnRyYV1baV0gLyAyKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5kY3RfZXJyb3Jfc3VtW2ludHJhXVtpXSArIDEpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGZyYW1lX3N0YXJ0KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludCByZXQ7CisKKyAgICAvKiBtYXJrICYgcmVsZWFzZSBvbGQgZnJhbWVzICovCisgICAgaWYgKHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQiAmJiBzLT5sYXN0X3BpY3R1cmVfcHRyICYmCisgICAgICAgIHMtPmxhc3RfcGljdHVyZV9wdHIgIT0gcy0+bmV4dF9waWN0dXJlX3B0ciAmJgorICAgICAgICBzLT5sYXN0X3BpY3R1cmVfcHRyLT5mLT5idWZbMF0pIHsKKyAgICAgICAgZmZfbXBlZ191bnJlZl9waWN0dXJlKHMsIHMtPmxhc3RfcGljdHVyZV9wdHIpOworICAgIH0KKworICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnBpY3RfdHlwZSA9IHMtPnBpY3RfdHlwZTsKKyAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5rZXlfZnJhbWUgPSBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgJnMtPmN1cnJlbnRfcGljdHVyZSk7CisgICAgaWYgKChyZXQgPSBmZl9tcGVnX3JlZl9waWN0dXJlKHMsICZzLT5jdXJyZW50X3BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIHMtPmxhc3RfcGljdHVyZV9wdHIgPSBzLT5uZXh0X3BpY3R1cmVfcHRyOworICAgICAgICBpZiAoIXMtPmRyb3BwYWJsZSkKKyAgICAgICAgICAgIHMtPm5leHRfcGljdHVyZV9wdHIgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyOworICAgIH0KKworICAgIGlmIChzLT5sYXN0X3BpY3R1cmVfcHRyKSB7CisgICAgICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLCAmcy0+bGFzdF9waWN0dXJlKTsKKyAgICAgICAgaWYgKHMtPmxhc3RfcGljdHVyZV9wdHItPmYtPmJ1ZlswXSAmJgorICAgICAgICAgICAgKHJldCA9IGZmX21wZWdfcmVmX3BpY3R1cmUocywgJnMtPmxhc3RfcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfcGljdHVyZV9wdHIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAocy0+bmV4dF9waWN0dXJlX3B0cikgeworICAgICAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocywgJnMtPm5leHRfcGljdHVyZSk7CisgICAgICAgIGlmIChzLT5uZXh0X3BpY3R1cmVfcHRyLT5mLT5idWZbMF0gJiYKKyAgICAgICAgICAgIChyZXQgPSBmZl9tcGVnX3JlZl9waWN0dXJlKHMsICZzLT5uZXh0X3BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5uZXh0X3BpY3R1cmVfcHRyKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUhPSBQSUNUX0ZSQU1FKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpIHsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVtpXSArPQorICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbaV0gKj0gMjsKKyAgICAgICAgICAgIHMtPmxhc3RfcGljdHVyZS5mLT5saW5lc2l6ZVtpXSAgICAqPSAyOworICAgICAgICAgICAgcy0+bmV4dF9waWN0dXJlLmYtPmxpbmVzaXplW2ldICAgICo9IDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+bXBlZ19xdWFudCB8fCBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CisgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2ludHJhID0gcy0+ZGN0X3VucXVhbnRpemVfbXBlZzJfaW50cmE7CisgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2ludGVyID0gcy0+ZGN0X3VucXVhbnRpemVfbXBlZzJfaW50ZXI7CisgICAgfSBlbHNlIGlmIChzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzIHx8IHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjEpIHsKKyAgICAgICAgcy0+ZGN0X3VucXVhbnRpemVfaW50cmEgPSBzLT5kY3RfdW5xdWFudGl6ZV9oMjYzX2ludHJhOworICAgICAgICBzLT5kY3RfdW5xdWFudGl6ZV9pbnRlciA9IHMtPmRjdF91bnF1YW50aXplX2gyNjNfaW50ZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+ZGN0X3VucXVhbnRpemVfaW50cmEgPSBzLT5kY3RfdW5xdWFudGl6ZV9tcGVnMV9pbnRyYTsKKyAgICAgICAgcy0+ZGN0X3VucXVhbnRpemVfaW50ZXIgPSBzLT5kY3RfdW5xdWFudGl6ZV9tcGVnMV9pbnRlcjsKKyAgICB9CisKKyAgICBpZiAocy0+ZGN0X2Vycm9yX3N1bSkgeworICAgICAgICBhdl9hc3NlcnQyKHMtPmF2Y3R4LT5ub2lzZV9yZWR1Y3Rpb24gJiYgcy0+ZW5jb2RpbmcpOworICAgICAgICB1cGRhdGVfbm9pc2VfcmVkdWN0aW9uKHMpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfbXB2X2VuY29kZV9waWN0dXJlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljX2FyZywgaW50ICpnb3RfcGFja2V0KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgc3R1ZmZpbmdfY291bnQsIHJldDsKKyAgICBpbnQgY29udGV4dF9jb3VudCA9IHMtPnNsaWNlX2NvbnRleHRfY291bnQ7CisKKyAgICBzLT5waWN0dXJlX2luX2dvcF9udW1iZXIrKzsKKworICAgIGlmIChsb2FkX2lucHV0X3BpY3R1cmUocywgcGljX2FyZykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoc2VsZWN0X2lucHV0X3BpY3R1cmUocykgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBvdXRwdXQ/ICovCisgICAgaWYgKHMtPm5ld19waWN0dXJlLmYtPmRhdGFbMF0pIHsKKyAgICAgICAgaW50IGdyb3dpbmdfYnVmZmVyID0gY29udGV4dF9jb3VudCA9PSAxICYmICFwa3QtPmRhdGEgJiYgIXMtPmRhdGFfcGFydGl0aW9uaW5nOworICAgICAgICBpbnQgcGt0X3NpemUgPSBncm93aW5nX2J1ZmZlciA/IEZGTUFYKHMtPm1iX3dpZHRoKnMtPm1iX2hlaWdodCo2NCsxMDAwMCwgYXZjdHgtPmludGVybmFsLT5ieXRlX2J1ZmZlcl9zaXplKSAtIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfd2lkdGgqcy0+bWJfaGVpZ2h0KihNQVhfTUJfQllURVMrMTAwKSsxMDAwMDsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIHBrdF9zaXplKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHMtPm1iX2luZm8pIHsKKyAgICAgICAgICAgIHMtPm1iX2luZm9fcHRyID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfSDI2M19NQl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfd2lkdGgqcy0+bWJfaGVpZ2h0KjEyKTsKKyAgICAgICAgICAgIHMtPnByZXZfbWJfaW5mbyA9IHMtPmxhc3RfbWJfaW5mbyA9IHMtPm1iX2luZm9fc2l6ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgc3RhcnRfeSA9IHMtPnRocmVhZF9jb250ZXh0W2ldLT5zdGFydF9tYl95OworICAgICAgICAgICAgaW50ICAgZW5kX3kgPSBzLT50aHJlYWRfY29udGV4dFtpXS0+ICBlbmRfbWJfeTsKKyAgICAgICAgICAgIGludCBoICAgICAgID0gcy0+bWJfaGVpZ2h0OworICAgICAgICAgICAgdWludDhfdCAqc3RhcnQgPSBwa3QtPmRhdGEgKyAoc2l6ZV90KSgoKGludDY0X3QpIHBrdC0+c2l6ZSkgKiBzdGFydF95IC8gaCk7CisgICAgICAgICAgICB1aW50OF90ICplbmQgICA9IHBrdC0+ZGF0YSArIChzaXplX3QpKCgoaW50NjRfdCkgcGt0LT5zaXplKSAqICAgZW5kX3kgLyBoKTsKKworICAgICAgICAgICAgaW5pdF9wdXRfYml0cygmcy0+dGhyZWFkX2NvbnRleHRbaV0tPnBiLCBzdGFydCwgZW5kIC0gc3RhcnQpOworICAgICAgICB9CisKKyAgICAgICAgcy0+cGljdF90eXBlID0gcy0+bmV3X3BpY3R1cmUuZi0+cGljdF90eXBlOworICAgICAgICAvL2VtbXNfYygpOworICAgICAgICByZXQgPSBmcmFtZV9zdGFydChzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwordmJ2X3JldHJ5OgorICAgICAgICByZXQgPSBlbmNvZGVfcGljdHVyZShzLCBzLT5waWN0dXJlX251bWJlcik7CisgICAgICAgIGlmIChncm93aW5nX2J1ZmZlcikgeworICAgICAgICAgICAgYXZfYXNzZXJ0MChzLT5wYi5idWYgPT0gYXZjdHgtPmludGVybmFsLT5ieXRlX2J1ZmZlcik7CisgICAgICAgICAgICBwa3QtPmRhdGEgPSBzLT5wYi5idWY7CisgICAgICAgICAgICBwa3QtPnNpemUgPSBhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgYXZjdHgtPmhlYWRlcl9iaXRzID0gcy0+aGVhZGVyX2JpdHM7CisgICAgICAgIGF2Y3R4LT5tdl9iaXRzICAgICA9IHMtPm12X2JpdHM7CisgICAgICAgIGF2Y3R4LT5taXNjX2JpdHMgICA9IHMtPm1pc2NfYml0czsKKyAgICAgICAgYXZjdHgtPmlfdGV4X2JpdHMgID0gcy0+aV90ZXhfYml0czsKKyAgICAgICAgYXZjdHgtPnBfdGV4X2JpdHMgID0gcy0+cF90ZXhfYml0czsKKyAgICAgICAgYXZjdHgtPmlfY291bnQgICAgID0gcy0+aV9jb3VudDsKKyAgICAgICAgLy8gRklYTUUgZi9iX2NvdW50IGluIGF2Y3R4CisgICAgICAgIGF2Y3R4LT5wX2NvdW50ICAgICA9IHMtPm1iX251bSAtIHMtPmlfY291bnQgLSBzLT5za2lwX2NvdW50OworICAgICAgICBhdmN0eC0+c2tpcF9jb3VudCAgPSBzLT5za2lwX2NvdW50OworCisgICAgICAgIGZyYW1lX2VuZChzKTsKKworICAgICAgICBpZiAoQ09ORklHX01KUEVHX0VOQ09ERVIgJiYgcy0+b3V0X2Zvcm1hdCA9PSBGTVRfTUpQRUcpCisgICAgICAgICAgICBmZl9tanBlZ19lbmNvZGVfcGljdHVyZV90cmFpbGVyKCZzLT5wYiwgcy0+aGVhZGVyX2JpdHMpOworCisgICAgICAgIGlmIChhdmN0eC0+cmNfYnVmZmVyX3NpemUpIHsKKyAgICAgICAgICAgIFJhdGVDb250cm9sQ29udGV4dCAqcmNjID0gJnMtPnJjX2NvbnRleHQ7CisgICAgICAgICAgICBpbnQgbWF4X3NpemUgPSBGRk1BWChyY2MtPmJ1ZmZlcl9pbmRleCAqIGF2Y3R4LT5yY19tYXhfYXZhaWxhYmxlX3Zidl91c2UsIHJjYy0+YnVmZmVyX2luZGV4IC0gNTAwKTsKKworICAgICAgICAgICAgaWYgKHB1dF9iaXRzX2NvdW50KCZzLT5wYikgPiBtYXhfc2l6ZSAmJgorICAgICAgICAgICAgICAgIHMtPmxhbWJkYSA8IHMtPmxtYXgpIHsKKyAgICAgICAgICAgICAgICBzLT5uZXh0X2xhbWJkYSA9IEZGTUFYKHMtPmxhbWJkYSArIDEsIHMtPmxhbWJkYSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+cXNjYWxlICsgMSkgLyBzLT5xc2NhbGUpOworICAgICAgICAgICAgICAgIGlmIChzLT5hZGFwdGl2ZV9xdWFudCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm1iX2hlaWdodCAqIHMtPm1iX3N0cmlkZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFtYmRhX3RhYmxlW2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1BWChzLT5sYW1iZGFfdGFibGVbaV0gKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhbWJkYV90YWJsZVtpXSAqIChzLT5xc2NhbGUgKyAxKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cXNjYWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+bWJfc2tpcHBlZCA9IDA7ICAgICAgICAvLyBkb25lIGluIGZyYW1lX3N0YXJ0KCkKKyAgICAgICAgICAgICAgICAvLyBkb25lIGluIGVuY29kZV9waWN0dXJlKCkgc28gd2UgbXVzdCB1bmRvIGl0CisgICAgICAgICAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+ZmxpcGZsb3Bfcm91bmRpbmcgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjNQIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5vX3JvdW5kaW5nIF49IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+dGltZV9iYXNlICAgICAgID0gcy0+bGFzdF90aW1lX2Jhc2U7CisgICAgICAgICAgICAgICAgICAgIHMtPmxhc3Rfbm9uX2JfdGltZSA9IHMtPnRpbWUgLSBzLT5wcF90aW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKnBiID0gJnMtPnRocmVhZF9jb250ZXh0W2ldLT5wYjsKKyAgICAgICAgICAgICAgICAgICAgaW5pdF9wdXRfYml0cyhwYiwgcGItPmJ1ZiwgcGItPmJ1Zl9lbmQgLSBwYi0+YnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgInJlZW5jb2RpbmcgZnJhbWUgZHVlIHRvIFZCVlxuIik7CisgICAgICAgICAgICAgICAgZ290byB2YnZfcmV0cnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDAocy0+YXZjdHgtPnJjX21heF9yYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzEpCisgICAgICAgICAgICBmZl93cml0ZV9wYXNzMV9zdGF0cyhzKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5lcnJvcltpXSA9CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZXJyb3JbaV0gPQorICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5lcnJvcltpXTsKKyAgICAgICAgICAgIGF2Y3R4LT5lcnJvcltpXSArPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5lcnJvcltpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzEpCisgICAgICAgICAgICBhc3NlcnQoYXZjdHgtPmhlYWRlcl9iaXRzICsgYXZjdHgtPm12X2JpdHMgKyBhdmN0eC0+bWlzY19iaXRzICsKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+aV90ZXhfYml0cyArIGF2Y3R4LT5wX3RleF9iaXRzID09CisgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzX2NvdW50KCZzLT5wYikpOworICAgICAgICBmbHVzaF9wdXRfYml0cygmcy0+cGIpOworICAgICAgICBzLT5mcmFtZV9iaXRzICA9IHB1dF9iaXRzX2NvdW50KCZzLT5wYik7CisKKyAgICAgICAgc3R1ZmZpbmdfY291bnQgPSBmZl92YnZfdXBkYXRlKHMsIHMtPmZyYW1lX2JpdHMpOworICAgICAgICBzLT5zdHVmZmluZ19iaXRzID0gOCpzdHVmZmluZ19jb3VudDsKKyAgICAgICAgaWYgKHN0dWZmaW5nX2NvdW50KSB7CisgICAgICAgICAgICBpZiAocy0+cGIuYnVmX2VuZCAtIHMtPnBiLmJ1ZiAtIChwdXRfYml0c19jb3VudCgmcy0+cGIpID4+IDMpIDwKKyAgICAgICAgICAgICAgICAgICAgc3R1ZmZpbmdfY291bnQgKyA1MCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic3R1ZmZpbmcgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAocy0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTzoKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzJWSURFTzoKKyAgICAgICAgICAgICAgICB3aGlsZSAoc3R1ZmZpbmdfY291bnQtLSkgeworICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHNDoKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDE2LCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDE2LCAweDFDMyk7CisgICAgICAgICAgICAgICAgc3R1ZmZpbmdfY291bnQgLT0gNDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoc3R1ZmZpbmdfY291bnQtLSkgeworICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIDB4RkYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInZidiBidWZmZXIgb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmx1c2hfcHV0X2JpdHMoJnMtPnBiKTsKKyAgICAgICAgICAgIHMtPmZyYW1lX2JpdHMgID0gcHV0X2JpdHNfY291bnQoJnMtPnBiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVwZGF0ZSBtcGVnMS8yIHZidl9kZWxheSBmb3IgQ0JSICovCisgICAgICAgIGlmIChzLT5hdmN0eC0+cmNfbWF4X3JhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICBzLT5hdmN0eC0+cmNfbWluX3JhdGUgPT0gcy0+YXZjdHgtPnJjX21heF9yYXRlICYmCisgICAgICAgICAgICBzLT5vdXRfZm9ybWF0ID09IEZNVF9NUEVHMSAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICA5MDAwMExMICogKGF2Y3R4LT5yY19idWZmZXJfc2l6ZSAtIDEpIDw9CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnJjX21heF9yYXRlICogMHhGRkZGTEwpIHsKKyAgICAgICAgICAgIGludCB2YnZfZGVsYXksIG1pbl9kZWxheTsKKyAgICAgICAgICAgIGRvdWJsZSBpbmJpdHMgID0gcy0+YXZjdHgtPnJjX21heF9yYXRlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcTJkKHMtPmF2Y3R4LT50aW1lX2Jhc2UpOworICAgICAgICAgICAgaW50ICAgIG1pbmJpdHMgPSBzLT5mcmFtZV9iaXRzIC0gOCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT52YnZfZGVsYXlfcHRyIC0gcy0+cGIuYnVmIC0gMSk7CisgICAgICAgICAgICBkb3VibGUgYml0cyAgICA9IHMtPnJjX2NvbnRleHQuYnVmZmVyX2luZGV4ICsgbWluYml0cyAtIGluYml0czsKKworICAgICAgICAgICAgaWYgKGJpdHMgPCAwKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJuYWwgZXJyb3IsIG5lZ2F0aXZlIGJpdHNcbiIpOworCisgICAgICAgICAgICBhc3NlcnQocy0+cmVwZWF0X2ZpcnN0X2ZpZWxkID09IDApOworCisgICAgICAgICAgICB2YnZfZGVsYXkgPSBiaXRzICogOTAwMDAgLyBzLT5hdmN0eC0+cmNfbWF4X3JhdGU7CisgICAgICAgICAgICBtaW5fZGVsYXkgPSAobWluYml0cyAqIDkwMDAwTEwgKyBzLT5hdmN0eC0+cmNfbWF4X3JhdGUgLSAxKSAvCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+cmNfbWF4X3JhdGU7CisKKyAgICAgICAgICAgIHZidl9kZWxheSA9IEZGTUFYKHZidl9kZWxheSwgbWluX2RlbGF5KTsKKworICAgICAgICAgICAgYXZfYXNzZXJ0MCh2YnZfZGVsYXkgPCAweEZGRkYpOworCisgICAgICAgICAgICBzLT52YnZfZGVsYXlfcHRyWzBdICY9IDB4Rjg7CisgICAgICAgICAgICBzLT52YnZfZGVsYXlfcHRyWzBdIHw9IHZidl9kZWxheSA+PiAxMzsKKyAgICAgICAgICAgIHMtPnZidl9kZWxheV9wdHJbMV0gID0gdmJ2X2RlbGF5ID4+IDU7CisgICAgICAgICAgICBzLT52YnZfZGVsYXlfcHRyWzJdICY9IDB4MDc7CisgICAgICAgICAgICBzLT52YnZfZGVsYXlfcHRyWzJdIHw9IHZidl9kZWxheSA8PCAzOworICAgICAgICAgICAgYXZjdHgtPnZidl9kZWxheSAgICAgPSB2YnZfZGVsYXkgKiAzMDA7CisgICAgICAgIH0KKyAgICAgICAgcy0+dG90YWxfYml0cyAgICAgKz0gcy0+ZnJhbWVfYml0czsKKyAgICAgICAgYXZjdHgtPmZyYW1lX2JpdHMgID0gcy0+ZnJhbWVfYml0czsKKworICAgICAgICBwa3QtPnB0cyA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5wdHM7CisgICAgICAgIGlmICghcy0+bG93X2RlbGF5ICYmIHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICAgICAgaWYgKCFzLT5jdXJyZW50X3BpY3R1cmUuZi0+Y29kZWRfcGljdHVyZV9udW1iZXIpCisgICAgICAgICAgICAgICAgcGt0LT5kdHMgPSBwa3QtPnB0cyAtIHMtPmR0c19kZWx0YTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwa3QtPmR0cyA9IHMtPnJlb3JkZXJlZF9wdHM7CisgICAgICAgICAgICBzLT5yZW9yZGVyZWRfcHRzID0gcGt0LT5wdHM7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcGt0LT5kdHMgPSBwa3QtPnB0czsKKyAgICAgICAgaWYgKHMtPmN1cnJlbnRfcGljdHVyZS5mLT5rZXlfZnJhbWUpCisgICAgICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgaWYgKHMtPm1iX2luZm8pCisgICAgICAgICAgICBhdl9wYWNrZXRfc2hyaW5rX3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX0gyNjNfTUJfSU5GTywgcy0+bWJfaW5mb19zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5mcmFtZV9iaXRzID0gMDsKKyAgICB9CisKKyAgICAvKiByZWxlYXNlIG5vbi1yZWZlcmVuY2UgZnJhbWVzICovCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9QSUNUVVJFX0NPVU5UOyBpKyspIHsKKyAgICAgICAgaWYgKCFzLT5waWN0dXJlW2ldLnJlZmVyZW5jZSkKKyAgICAgICAgICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLCAmcy0+cGljdHVyZVtpXSk7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MSgocy0+ZnJhbWVfYml0cyAmIDcpID09IDApOworCisgICAgcGt0LT5zaXplID0gcy0+ZnJhbWVfYml0cyAvIDg7CisgICAgKmdvdF9wYWNrZXQgPSAhIXBrdC0+c2l6ZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRjdF9zaW5nbGVfY29lZmZfZWxpbWluYXRpb24oTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IHRocmVzaG9sZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciB0YWJbNjRdID0geworICAgICAgICAzLCAyLCAyLCAxLCAxLCAxLCAxLCAxLAorICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCisgICAgfTsKKyAgICBpbnQgc2NvcmUgPSAwOworICAgIGludCBydW4gPSAwOworICAgIGludCBpOworICAgIGludDE2X3QgKmJsb2NrID0gcy0+YmxvY2tbbl07CisgICAgY29uc3QgaW50IGxhc3RfaW5kZXggPSBzLT5ibG9ja19sYXN0X2luZGV4W25dOworICAgIGludCBza2lwX2RjOworCisgICAgaWYgKHRocmVzaG9sZCA8IDApIHsKKyAgICAgICAgc2tpcF9kYyA9IDA7CisgICAgICAgIHRocmVzaG9sZCA9IC10aHJlc2hvbGQ7CisgICAgfSBlbHNlCisgICAgICAgIHNraXBfZGMgPSAxOworCisgICAgLyogQXJlIGFsbCB3ZSBjb3VsZCBzZXQgdG8gemVybyBhbHJlYWR5IHplcm8/ICovCisgICAgaWYgKGxhc3RfaW5kZXggPD0gc2tpcF9kYyAtIDEpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gbGFzdF9pbmRleDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBqID0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWRbaV07CisgICAgICAgIGNvbnN0IGludCBsZXZlbCA9IEZGQUJTKGJsb2NrW2pdKTsKKyAgICAgICAgaWYgKGxldmVsID09IDEpIHsKKyAgICAgICAgICAgIGlmIChza2lwX2RjICYmIGkgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHNjb3JlICs9IHRhYltydW5dOworICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA+IDEpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bisrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzY29yZSA+PSB0aHJlc2hvbGQpCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKGkgPSBza2lwX2RjOyBpIDw9IGxhc3RfaW5kZXg7IGkrKykgeworICAgICAgICBjb25zdCBpbnQgaiA9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkW2ldOworICAgICAgICBibG9ja1tqXSA9IDA7CisgICAgfQorICAgIGlmIChibG9ja1swXSkKKyAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSA9IDA7CisgICAgZWxzZQorICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGlwX2NvZWZmcyhNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RfaW5kZXgpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgaW50IG1heGxldmVsID0gcy0+bWF4X3Fjb2VmZjsKKyAgICBjb25zdCBpbnQgbWlubGV2ZWwgPSBzLT5taW5fcWNvZWZmOworICAgIGludCBvdmVyZmxvdyA9IDA7CisKKyAgICBpZiAocy0+bWJfaW50cmEpIHsKKyAgICAgICAgaSA9IDE7IC8vIHNraXAgY2xpcHBpbmcgb2YgaW50cmEgZGMKKyAgICB9IGVsc2UKKyAgICAgICAgaSA9IDA7CisKKyAgICBmb3IgKDsgaSA8PSBsYXN0X2luZGV4OyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IGogPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZFtpXTsKKyAgICAgICAgaW50IGxldmVsID0gYmxvY2tbal07CisKKyAgICAgICAgaWYgKGxldmVsID4gbWF4bGV2ZWwpIHsKKyAgICAgICAgICAgIGxldmVsID0gbWF4bGV2ZWw7CisgICAgICAgICAgICBvdmVyZmxvdysrOworICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDwgbWlubGV2ZWwpIHsKKyAgICAgICAgICAgIGxldmVsID0gbWlubGV2ZWw7CisgICAgICAgICAgICBvdmVyZmxvdysrOworICAgICAgICB9CisKKyAgICAgICAgYmxvY2tbal0gPSBsZXZlbDsKKyAgICB9CisKKyAgICBpZiAob3ZlcmZsb3cgJiYgcy0+YXZjdHgtPm1iX2RlY2lzaW9uID09IEZGX01CX0RFQ0lTSU9OX1NJTVBMRSkKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICJ3YXJuaW5nLCBjbGlwcGluZyAlZCBkY3QgY29lZmZpY2llbnRzIHRvICVkLi4lZFxuIiwKKyAgICAgICAgICAgICAgIG92ZXJmbG93LCBtaW5sZXZlbCwgbWF4bGV2ZWwpOworfQorCitzdGF0aWMgdm9pZCBnZXRfdmlzdWFsX3dlaWdodChpbnQxNl90ICp3ZWlnaHQsIHVpbnQ4X3QgKnB0ciwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICAvLyBGSVhNRSBvcHRpbWl6ZQorICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykgeworICAgICAgICAgICAgaW50IHgyLCB5MjsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICAgICAgaW50IHNxciA9IDA7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworCisgICAgICAgICAgICBmb3IgKHkyID0gRkZNQVgoeSAtIDEsIDApOyB5MiA8IEZGTUlOKDgsIHkgKyAyKTsgeTIrKykgeworICAgICAgICAgICAgICAgIGZvciAoeDI9IEZGTUFYKHggLSAxLCAwKTsgeDIgPCBGRk1JTig4LCB4ICsgMik7IHgyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHYgPSBwdHJbeDIgKyB5MiAqIHN0cmlkZV07CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSB2OworICAgICAgICAgICAgICAgICAgICBzcXIgKz0gdiAqIHY7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2VpZ2h0W3ggKyA4ICogeV09ICgzNiAqIGZmX3NxcnQoY291bnQgKiBzcXIgLSBzdW0gKiBzdW0pKSAvIGNvdW50OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGVuY29kZV9tYl9pbnRlcm5hbChNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feCwgaW50IG1vdGlvbl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX2Jsb2NrX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9ibG9ja193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9ibG9ja19jb3VudCkKK3sKKyAgICBpbnQxNl90IHdlaWdodFsxMl1bNjRdOworICAgIGludDE2X3Qgb3JpZ1sxMl1bNjRdOworICAgIGNvbnN0IGludCBtYl94ID0gcy0+bWJfeDsKKyAgICBjb25zdCBpbnQgbWJfeSA9IHMtPm1iX3k7CisgICAgaW50IGk7CisgICAgaW50IHNraXBfZGN0WzEyXTsKKyAgICBpbnQgZGN0X29mZnNldCA9IHMtPmxpbmVzaXplICogODsgLy8gZGVmYXVsdCBmb3IgcHJvZ3Jlc3NpdmUgZnJhbWVzCisgICAgaW50IHV2X2RjdF9vZmZzZXQgPSBzLT51dmxpbmVzaXplICogODsKKyAgICB1aW50OF90ICpwdHJfeSwgKnB0cl9jYiwgKnB0cl9jcjsKKyAgICBwdHJkaWZmX3Qgd3JhcF95LCB3cmFwX2M7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWJfYmxvY2tfY291bnQ7IGkrKykKKyAgICAgICAgc2tpcF9kY3RbaV0gPSBzLT5za2lwZGN0OworCisgICAgaWYgKHMtPmFkYXB0aXZlX3F1YW50KSB7CisgICAgICAgIGNvbnN0IGludCBsYXN0X3FwID0gcy0+cXNjYWxlOworICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBtYl94ICsgbWJfeSAqIHMtPm1iX3N0cmlkZTsKKworICAgICAgICBzLT5sYW1iZGEgPSBzLT5sYW1iZGFfdGFibGVbbWJfeHldOworICAgICAgICB1cGRhdGVfcXNjYWxlKHMpOworCisgICAgICAgIGlmICghKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX1FQX1JEKSkgeworICAgICAgICAgICAgcy0+cXNjYWxlID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+cXNjYWxlX3RhYmxlW21iX3h5XTsKKyAgICAgICAgICAgIHMtPmRxdWFudCA9IHMtPnFzY2FsZSAtIGxhc3RfcXA7CisKKyAgICAgICAgICAgIGlmIChzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzKSB7CisgICAgICAgICAgICAgICAgcy0+ZHF1YW50ID0gYXZfY2xpcChzLT5kcXVhbnQsIC0yLCAyKTsKKworICAgICAgICAgICAgICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPm1iX2ludHJhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmRxdWFudCAmIDEgfHwgcy0+bXZfZGlyICYgTVZfRElSRUNUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kcXVhbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm12X3R5cGUgPT0gTVZfVFlQRV84WDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHF1YW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmZl9zZXRfcXNjYWxlKHMsIGxhc3RfcXAgKyBzLT5kcXVhbnQpOworICAgIH0gZWxzZSBpZiAocy0+bXB2X2ZsYWdzICYgRkZfTVBWX0ZMQUdfUVBfUkQpCisgICAgICAgIGZmX3NldF9xc2NhbGUocywgcy0+cXNjYWxlICsgcy0+ZHF1YW50KTsKKworICAgIHdyYXBfeSA9IHMtPmxpbmVzaXplOworICAgIHdyYXBfYyA9IHMtPnV2bGluZXNpemU7CisgICAgcHRyX3kgID0gcy0+bmV3X3BpY3R1cmUuZi0+ZGF0YVswXSArCisgICAgICAgICAgICAgKG1iX3kgKiAxNiAqIHdyYXBfeSkgICAgICAgICAgICAgICsgbWJfeCAqIDE2OworICAgIHB0cl9jYiA9IHMtPm5ld19waWN0dXJlLmYtPmRhdGFbMV0gKworICAgICAgICAgICAgIChtYl95ICogbWJfYmxvY2tfaGVpZ2h0ICogd3JhcF9jKSArIG1iX3ggKiBtYl9ibG9ja193aWR0aDsKKyAgICBwdHJfY3IgPSBzLT5uZXdfcGljdHVyZS5mLT5kYXRhWzJdICsKKyAgICAgICAgICAgICAobWJfeSAqIG1iX2Jsb2NrX2hlaWdodCAqIHdyYXBfYykgKyBtYl94ICogbWJfYmxvY2tfd2lkdGg7CisKKyAgICBpZigobWJfeCAqIDE2ICsgMTYgPiBzLT53aWR0aCB8fCBtYl95ICogMTYgKyAxNiA+IHMtPmhlaWdodCkgJiYgcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQU1WKXsKKyAgICAgICAgdWludDhfdCAqZWJ1ZiA9IHMtPmVkZ2VfZW11X2J1ZmZlciArIDM2ICogd3JhcF95OworICAgICAgICBpbnQgY3cgPSAocy0+d2lkdGggICsgcy0+Y2hyb21hX3hfc2hpZnQpID4+IHMtPmNocm9tYV94X3NoaWZ0OworICAgICAgICBpbnQgY2ggPSAocy0+aGVpZ2h0ICsgcy0+Y2hyb21hX3lfc2hpZnQpID4+IHMtPmNocm9tYV95X3NoaWZ0OworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMoZWJ1ZiwgcHRyX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX3ksIHdyYXBfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAxNiwgbWJfeCAqIDE2LCBtYl95ICogMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53aWR0aCwgcy0+aGVpZ2h0KTsKKyAgICAgICAgcHRyX3kgPSBlYnVmOworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMoZWJ1ZiArIDE2ICogd3JhcF95LCBwdHJfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX2MsIHdyYXBfYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX2Jsb2NrX3dpZHRoLCBtYl9ibG9ja19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl94ICogbWJfYmxvY2tfd2lkdGgsIG1iX3kgKiBtYl9ibG9ja19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdywgY2gpOworICAgICAgICBwdHJfY2IgPSBlYnVmICsgMTYgKiB3cmFwX3k7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhlYnVmICsgMTYgKiB3cmFwX3kgKyAxNiwgcHRyX2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF9jLCB3cmFwX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl9ibG9ja193aWR0aCwgbWJfYmxvY2tfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfeCAqIG1iX2Jsb2NrX3dpZHRoLCBtYl95ICogbWJfYmxvY2tfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3csIGNoKTsKKyAgICAgICAgcHRyX2NyID0gZWJ1ZiArIDE2ICogd3JhcF95ICsgMTY7CisgICAgfQorCisgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfSU5URVJMQUNFRF9EQ1QpIHsKKyAgICAgICAgICAgIGludCBwcm9ncmVzc2l2ZV9zY29yZSwgaW50ZXJsYWNlZF9zY29yZTsKKworICAgICAgICAgICAgcy0+aW50ZXJsYWNlZF9kY3QgPSAwOworICAgICAgICAgICAgcHJvZ3Jlc3NpdmVfc2NvcmUgPSBzLT5tZWNjLmlsZGN0X2NtcFs0XShzLCBwdHJfeSwgTlVMTCwgd3JhcF95LCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1lY2MuaWxkY3RfY21wWzRdKHMsIHB0cl95ICsgd3JhcF95ICogOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgd3JhcF95LCA4KSAtIDQwMDsKKworICAgICAgICAgICAgaWYgKHByb2dyZXNzaXZlX3Njb3JlID4gMCkgeworICAgICAgICAgICAgICAgIGludGVybGFjZWRfc2NvcmUgPSBzLT5tZWNjLmlsZGN0X2NtcFs0XShzLCBwdHJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgd3JhcF95ICogMiwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tZWNjLmlsZGN0X2NtcFs0XShzLCBwdHJfeSArIHdyYXBfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgd3JhcF95ICogMiwgOCk7CisgICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzaXZlX3Njb3JlID4gaW50ZXJsYWNlZF9zY29yZSkgeworICAgICAgICAgICAgICAgICAgICBzLT5pbnRlcmxhY2VkX2RjdCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgZGN0X29mZnNldCA9IHdyYXBfeTsKKyAgICAgICAgICAgICAgICAgICAgdXZfZGN0X29mZnNldCA9IHdyYXBfYzsKKyAgICAgICAgICAgICAgICAgICAgd3JhcF95IDw8PSAxOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Y2hyb21hX2Zvcm1hdCA9PSBDSFJPTUFfNDIyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jaHJvbWFfZm9ybWF0ID09IENIUk9NQV80NDQpCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX2MgPDw9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcy0+cGRzcC5nZXRfcGl4ZWxzKHMtPmJsb2NrWzBdLCBwdHJfeSwgICAgICAgICAgICAgICAgICB3cmFwX3kpOworICAgICAgICBzLT5wZHNwLmdldF9waXhlbHMocy0+YmxvY2tbMV0sIHB0cl95ICsgOCwgICAgICAgICAgICAgIHdyYXBfeSk7CisgICAgICAgIHMtPnBkc3AuZ2V0X3BpeGVscyhzLT5ibG9ja1syXSwgcHRyX3kgKyBkY3Rfb2Zmc2V0LCAgICAgd3JhcF95KTsKKyAgICAgICAgcy0+cGRzcC5nZXRfcGl4ZWxzKHMtPmJsb2NrWzNdLCBwdHJfeSArIGRjdF9vZmZzZXQgKyA4LCB3cmFwX3kpOworCisgICAgICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkgeworICAgICAgICAgICAgc2tpcF9kY3RbNF0gPSAxOworICAgICAgICAgICAgc2tpcF9kY3RbNV0gPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+cGRzcC5nZXRfcGl4ZWxzKHMtPmJsb2NrWzRdLCBwdHJfY2IsIHdyYXBfYyk7CisgICAgICAgICAgICBzLT5wZHNwLmdldF9waXhlbHMocy0+YmxvY2tbNV0sIHB0cl9jciwgd3JhcF9jKTsKKyAgICAgICAgICAgIGlmICghcy0+Y2hyb21hX3lfc2hpZnQgJiYgcy0+Y2hyb21hX3hfc2hpZnQpIHsgLyogNDIyICovCisgICAgICAgICAgICAgICAgcy0+cGRzcC5nZXRfcGl4ZWxzKHMtPmJsb2NrWzZdLCBwdHJfY2IgKyB1dl9kY3Rfb2Zmc2V0LCB3cmFwX2MpOworICAgICAgICAgICAgICAgIHMtPnBkc3AuZ2V0X3BpeGVscyhzLT5ibG9ja1s3XSwgcHRyX2NyICsgdXZfZGN0X29mZnNldCwgd3JhcF9jKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXMtPmNocm9tYV95X3NoaWZ0ICYmICFzLT5jaHJvbWFfeF9zaGlmdCkgeyAvKiA0NDQgKi8KKyAgICAgICAgICAgICAgICBzLT5wZHNwLmdldF9waXhlbHMocy0+YmxvY2tbIDZdLCBwdHJfY2IgKyA4LCB3cmFwX2MpOworICAgICAgICAgICAgICAgIHMtPnBkc3AuZ2V0X3BpeGVscyhzLT5ibG9ja1sgN10sIHB0cl9jciArIDgsIHdyYXBfYyk7CisgICAgICAgICAgICAgICAgcy0+cGRzcC5nZXRfcGl4ZWxzKHMtPmJsb2NrWyA4XSwgcHRyX2NiICsgdXZfZGN0X29mZnNldCwgd3JhcF9jKTsKKyAgICAgICAgICAgICAgICBzLT5wZHNwLmdldF9waXhlbHMocy0+YmxvY2tbIDldLCBwdHJfY3IgKyB1dl9kY3Rfb2Zmc2V0LCB3cmFwX2MpOworICAgICAgICAgICAgICAgIHMtPnBkc3AuZ2V0X3BpeGVscyhzLT5ibG9ja1sxMF0sIHB0cl9jYiArIHV2X2RjdF9vZmZzZXQgKyA4LCB3cmFwX2MpOworICAgICAgICAgICAgICAgIHMtPnBkc3AuZ2V0X3BpeGVscyhzLT5ibG9ja1sxMV0sIHB0cl9jciArIHV2X2RjdF9vZmZzZXQgKyA4LCB3cmFwX2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BfcGl4ZWxzX2Z1bmMgKCpvcF9waXgpWzRdOworICAgICAgICBxcGVsX21jX2Z1bmMgKCpvcF9xcGl4KVsxNl07CisgICAgICAgIHVpbnQ4X3QgKmRlc3RfeSwgKmRlc3RfY2IsICpkZXN0X2NyOworCisgICAgICAgIGRlc3RfeSAgPSBzLT5kZXN0WzBdOworICAgICAgICBkZXN0X2NiID0gcy0+ZGVzdFsxXTsKKyAgICAgICAgZGVzdF9jciA9IHMtPmRlc3RbMl07CisKKyAgICAgICAgaWYgKCghcy0+bm9fcm91bmRpbmcpIHx8IHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICAgICAgb3BfcGl4ICA9IHMtPmhkc3AucHV0X3BpeGVsc190YWI7CisgICAgICAgICAgICBvcF9xcGl4ID0gcy0+cWRzcC5wdXRfcXBlbF9waXhlbHNfdGFiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3BfcGl4ICA9IHMtPmhkc3AucHV0X25vX3JuZF9waXhlbHNfdGFiOworICAgICAgICAgICAgb3BfcXBpeCA9IHMtPnFkc3AucHV0X25vX3JuZF9xcGVsX3BpeGVsc190YWI7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+bXZfZGlyICYgTVZfRElSX0ZPUldBUkQpIHsKKyAgICAgICAgICAgIGZmX21wdl9tb3Rpb24ocywgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfcGl4LCBvcF9xcGl4KTsKKyAgICAgICAgICAgIG9wX3BpeCAgPSBzLT5oZHNwLmF2Z19waXhlbHNfdGFiOworICAgICAgICAgICAgb3BfcXBpeCA9IHMtPnFkc3AuYXZnX3FwZWxfcGl4ZWxzX3RhYjsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+bXZfZGlyICYgTVZfRElSX0JBQ0tXQVJEKSB7CisgICAgICAgICAgICBmZl9tcHZfbW90aW9uKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmV4dF9waWN0dXJlLmYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3BpeCwgb3BfcXBpeCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0lOVEVSTEFDRURfRENUKSB7CisgICAgICAgICAgICBpbnQgcHJvZ3Jlc3NpdmVfc2NvcmUsIGludGVybGFjZWRfc2NvcmU7CisKKyAgICAgICAgICAgIHMtPmludGVybGFjZWRfZGN0ID0gMDsKKyAgICAgICAgICAgIHByb2dyZXNzaXZlX3Njb3JlID0gcy0+bWVjYy5pbGRjdF9jbXBbMF0ocywgZGVzdF95LCBwdHJfeSwgd3JhcF95LCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1lY2MuaWxkY3RfY21wWzBdKHMsIGRlc3RfeSArIHdyYXBfeSAqIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl95ICsgd3JhcF95ICogOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF95LCA4KSAtIDQwMDsKKworICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5pbGRjdF9jbXAgPT0gRkZfQ01QX1ZTU0UpCisgICAgICAgICAgICAgICAgcHJvZ3Jlc3NpdmVfc2NvcmUgLT0gNDAwOworCisgICAgICAgICAgICBpZiAocHJvZ3Jlc3NpdmVfc2NvcmUgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50ZXJsYWNlZF9zY29yZSA9IHMtPm1lY2MuaWxkY3RfY21wWzBdKHMsIGRlc3RfeSwgcHRyX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfeSAqIDIsIDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWVjYy5pbGRjdF9jbXBbMF0ocywgZGVzdF95ICsgd3JhcF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfeSArIHdyYXBfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF95ICogMiwgOCk7CisKKyAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NpdmVfc2NvcmUgPiBpbnRlcmxhY2VkX3Njb3JlKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmludGVybGFjZWRfZGN0ID0gMTsKKworICAgICAgICAgICAgICAgICAgICBkY3Rfb2Zmc2V0ID0gd3JhcF95OworICAgICAgICAgICAgICAgICAgICB1dl9kY3Rfb2Zmc2V0ID0gd3JhcF9jOworICAgICAgICAgICAgICAgICAgICB3cmFwX3kgPDw9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5jaHJvbWFfZm9ybWF0ID09IENIUk9NQV80MjIpCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX2MgPDw9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcy0+cGRzcC5kaWZmX3BpeGVscyhzLT5ibG9ja1swXSwgcHRyX3ksIGRlc3RfeSwgd3JhcF95KTsKKyAgICAgICAgcy0+cGRzcC5kaWZmX3BpeGVscyhzLT5ibG9ja1sxXSwgcHRyX3kgKyA4LCBkZXN0X3kgKyA4LCB3cmFwX3kpOworICAgICAgICBzLT5wZHNwLmRpZmZfcGl4ZWxzKHMtPmJsb2NrWzJdLCBwdHJfeSArIGRjdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF95ICsgZGN0X29mZnNldCwgd3JhcF95KTsKKyAgICAgICAgcy0+cGRzcC5kaWZmX3BpeGVscyhzLT5ibG9ja1szXSwgcHRyX3kgKyBkY3Rfb2Zmc2V0ICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3kgKyBkY3Rfb2Zmc2V0ICsgOCwgd3JhcF95KTsKKworICAgICAgICBpZiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpIHsKKyAgICAgICAgICAgIHNraXBfZGN0WzRdID0gMTsKKyAgICAgICAgICAgIHNraXBfZGN0WzVdID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnBkc3AuZGlmZl9waXhlbHMocy0+YmxvY2tbNF0sIHB0cl9jYiwgZGVzdF9jYiwgd3JhcF9jKTsKKyAgICAgICAgICAgIHMtPnBkc3AuZGlmZl9waXhlbHMocy0+YmxvY2tbNV0sIHB0cl9jciwgZGVzdF9jciwgd3JhcF9jKTsKKyAgICAgICAgICAgIGlmICghcy0+Y2hyb21hX3lfc2hpZnQpIHsgLyogNDIyICovCisgICAgICAgICAgICAgICAgcy0+cGRzcC5kaWZmX3BpeGVscyhzLT5ibG9ja1s2XSwgcHRyX2NiICsgdXZfZGN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfY2IgKyB1dl9kY3Rfb2Zmc2V0LCB3cmFwX2MpOworICAgICAgICAgICAgICAgIHMtPnBkc3AuZGlmZl9waXhlbHMocy0+YmxvY2tbN10sIHB0cl9jciArIHV2X2RjdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2NyICsgdXZfZGN0X29mZnNldCwgd3JhcF9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBwcmUgcXVhbnRpemF0aW9uICovCisgICAgICAgIGlmIChzLT5jdXJyZW50X3BpY3R1cmUubWNfbWJfdmFyW3MtPm1iX3N0cmlkZSAqIG1iX3kgKyBtYl94XSA8CisgICAgICAgICAgICAgICAgMiAqIHMtPnFzY2FsZSAqIHMtPnFzY2FsZSkgeworICAgICAgICAgICAgLy8gRklYTUUgb3B0aW1pemUKKyAgICAgICAgICAgIGlmIChzLT5tZWNjLnNhZFsxXShOVUxMLCBwdHJfeSwgZGVzdF95LCB3cmFwX3ksIDgpIDwgMjAgKiBzLT5xc2NhbGUpCisgICAgICAgICAgICAgICAgc2tpcF9kY3RbMF0gPSAxOworICAgICAgICAgICAgaWYgKHMtPm1lY2Muc2FkWzFdKE5VTEwsIHB0cl95ICsgOCwgZGVzdF95ICsgOCwgd3JhcF95LCA4KSA8IDIwICogcy0+cXNjYWxlKQorICAgICAgICAgICAgICAgIHNraXBfZGN0WzFdID0gMTsKKyAgICAgICAgICAgIGlmIChzLT5tZWNjLnNhZFsxXShOVUxMLCBwdHJfeSArIGRjdF9vZmZzZXQsIGRlc3RfeSArIGRjdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF95LCA4KSA8IDIwICogcy0+cXNjYWxlKQorICAgICAgICAgICAgICAgIHNraXBfZGN0WzJdID0gMTsKKyAgICAgICAgICAgIGlmIChzLT5tZWNjLnNhZFsxXShOVUxMLCBwdHJfeSArIGRjdF9vZmZzZXQgKyA4LCBkZXN0X3kgKyBkY3Rfb2Zmc2V0ICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX3ksIDgpIDwgMjAgKiBzLT5xc2NhbGUpCisgICAgICAgICAgICAgICAgc2tpcF9kY3RbM10gPSAxOworICAgICAgICAgICAgaWYgKHMtPm1lY2Muc2FkWzFdKE5VTEwsIHB0cl9jYiwgZGVzdF9jYiwgd3JhcF9jLCA4KSA8IDIwICogcy0+cXNjYWxlKQorICAgICAgICAgICAgICAgIHNraXBfZGN0WzRdID0gMTsKKyAgICAgICAgICAgIGlmIChzLT5tZWNjLnNhZFsxXShOVUxMLCBwdHJfY3IsIGRlc3RfY3IsIHdyYXBfYywgOCkgPCAyMCAqIHMtPnFzY2FsZSkKKyAgICAgICAgICAgICAgICBza2lwX2RjdFs1XSA9IDE7CisgICAgICAgICAgICBpZiAoIXMtPmNocm9tYV95X3NoaWZ0KSB7IC8qIDQyMiAqLworICAgICAgICAgICAgICAgIGlmIChzLT5tZWNjLnNhZFsxXShOVUxMLCBwdHJfY2IgKyB1dl9kY3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2NiICsgdXZfZGN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF9jLCA4KSA8IDIwICogcy0+cXNjYWxlKQorICAgICAgICAgICAgICAgICAgICBza2lwX2RjdFs2XSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKHMtPm1lY2Muc2FkWzFdKE5VTEwsIHB0cl9jciArIHV2X2RjdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfY3IgKyB1dl9kY3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX2MsIDgpIDwgMjAgKiBzLT5xc2NhbGUpCisgICAgICAgICAgICAgICAgICAgIHNraXBfZGN0WzddID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5xdWFudGl6ZXJfbm9pc2Vfc2hhcGluZykgeworICAgICAgICBpZiAoIXNraXBfZGN0WzBdKQorICAgICAgICAgICAgZ2V0X3Zpc3VhbF93ZWlnaHQod2VpZ2h0WzBdLCBwdHJfeSAgICAgICAgICAgICAgICAgLCB3cmFwX3kpOworICAgICAgICBpZiAoIXNraXBfZGN0WzFdKQorICAgICAgICAgICAgZ2V0X3Zpc3VhbF93ZWlnaHQod2VpZ2h0WzFdLCBwdHJfeSAgICAgICAgICAgICAgKyA4LCB3cmFwX3kpOworICAgICAgICBpZiAoIXNraXBfZGN0WzJdKQorICAgICAgICAgICAgZ2V0X3Zpc3VhbF93ZWlnaHQod2VpZ2h0WzJdLCBwdHJfeSArIGRjdF9vZmZzZXQgICAgLCB3cmFwX3kpOworICAgICAgICBpZiAoIXNraXBfZGN0WzNdKQorICAgICAgICAgICAgZ2V0X3Zpc3VhbF93ZWlnaHQod2VpZ2h0WzNdLCBwdHJfeSArIGRjdF9vZmZzZXQgKyA4LCB3cmFwX3kpOworICAgICAgICBpZiAoIXNraXBfZGN0WzRdKQorICAgICAgICAgICAgZ2V0X3Zpc3VhbF93ZWlnaHQod2VpZ2h0WzRdLCBwdHJfY2IgICAgICAgICAgICAgICAgLCB3cmFwX2MpOworICAgICAgICBpZiAoIXNraXBfZGN0WzVdKQorICAgICAgICAgICAgZ2V0X3Zpc3VhbF93ZWlnaHQod2VpZ2h0WzVdLCBwdHJfY3IgICAgICAgICAgICAgICAgLCB3cmFwX2MpOworICAgICAgICBpZiAoIXMtPmNocm9tYV95X3NoaWZ0KSB7IC8qIDQyMiAqLworICAgICAgICAgICAgaWYgKCFza2lwX2RjdFs2XSkKKyAgICAgICAgICAgICAgICBnZXRfdmlzdWFsX3dlaWdodCh3ZWlnaHRbNl0sIHB0cl9jYiArIHV2X2RjdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF9jKTsKKyAgICAgICAgICAgIGlmICghc2tpcF9kY3RbN10pCisgICAgICAgICAgICAgICAgZ2V0X3Zpc3VhbF93ZWlnaHQod2VpZ2h0WzddLCBwdHJfY3IgKyB1dl9kY3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfYyk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KG9yaWdbMF0sIHMtPmJsb2NrWzBdLCBzaXplb2YoaW50MTZfdCkgKiA2NCAqIG1iX2Jsb2NrX2NvdW50KTsKKyAgICB9CisKKyAgICAvKiBEQ1QgJiBxdWFudGl6ZSAqLworICAgIGF2X2Fzc2VydDIocy0+b3V0X2Zvcm1hdCAhPSBGTVRfTUpQRUcgfHwgcy0+cXNjYWxlID09IDgpOworICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1iX2Jsb2NrX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc2tpcF9kY3RbaV0pIHsKKyAgICAgICAgICAgICAgICBpbnQgb3ZlcmZsb3c7CisgICAgICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9IHMtPmRjdF9xdWFudGl6ZShzLCBzLT5ibG9ja1tpXSwgaSwgcy0+cXNjYWxlLCAmb3ZlcmZsb3cpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIHdlIGNvdWxkIGRlY2lkZSB0byBjaGFuZ2UgdG8gcXVhbnRpemVyIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAvLyBjbGlwcGluZworICAgICAgICAgICAgICAgIC8vIEpTOiBJIGRvbid0IHRoaW5rIHRoYXQgd291bGQgYmUgYSBnb29kIGlkZWEgaXQgY291bGQgbG93ZXIKKyAgICAgICAgICAgICAgICAvLyAgICAgcXVhbGl0eSBpbnN0ZWFkIG9mIGltcHJvdmUgaXQuIEp1c3QgSU5UUkFEQyBjbGlwcGluZworICAgICAgICAgICAgICAgIC8vICAgICBkZXNlcnZlcyBjaGFuZ2VzIGluIHF1YW50aXplcgorICAgICAgICAgICAgICAgIGlmIChvdmVyZmxvdykKKyAgICAgICAgICAgICAgICAgICAgY2xpcF9jb2VmZnMocywgcy0+YmxvY2tbaV0sIHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0pOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9IC0xOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5xdWFudGl6ZXJfbm9pc2Vfc2hhcGluZykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1iX2Jsb2NrX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNraXBfZGN0W2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgZGN0X3F1YW50aXplX3JlZmluZShzLCBzLT5ibG9ja1tpXSwgd2VpZ2h0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnW2ldLCBpLCBzLT5xc2NhbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5sdW1hX2VsaW1fdGhyZXNob2xkICYmICFzLT5tYl9pbnRyYSkKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgZGN0X3NpbmdsZV9jb2VmZl9lbGltaW5hdGlvbihzLCBpLCBzLT5sdW1hX2VsaW1fdGhyZXNob2xkKTsKKyAgICAgICAgaWYgKHMtPmNocm9tYV9lbGltX3RocmVzaG9sZCAmJiAhcy0+bWJfaW50cmEpCisgICAgICAgICAgICBmb3IgKGkgPSA0OyBpIDwgbWJfYmxvY2tfY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICBkY3Rfc2luZ2xlX2NvZWZmX2VsaW1pbmF0aW9uKHMsIGksIHMtPmNocm9tYV9lbGltX3RocmVzaG9sZCk7CisKKyAgICAgICAgaWYgKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX0NCUF9SRCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1iX2Jsb2NrX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgcy0+Y29kZWRfc2NvcmVbaV0gPSBJTlRfTUFYIC8gMjU2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkgJiYgcy0+bWJfaW50cmEpIHsKKyAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFs0XSA9CisgICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbNV0gPSAwOworICAgICAgICBzLT5ibG9ja1s0XVswXSA9CisgICAgICAgIHMtPmJsb2NrWzVdWzBdID0gKDEwMjQgKyBzLT5jX2RjX3NjYWxlIC8gMikgLyBzLT5jX2RjX3NjYWxlOworICAgICAgICBpZiAoIXMtPmNocm9tYV95X3NoaWZ0KSB7IC8qIDQyMiAvIDQ0NCAqLworICAgICAgICAgICAgZm9yIChpPTY7IGk8MTI7IGkrKykgeworICAgICAgICAgICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPSAwOworICAgICAgICAgICAgICAgIHMtPmJsb2NrW2ldWzBdID0gcy0+YmxvY2tbNF1bMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBub24gYyBxdWFudGl6ZSBjb2RlIHJldHVybnMgaW5jb3JyZWN0IGJsb2NrX2xhc3RfaW5kZXggRklYTUUKKyAgICBpZiAocy0+YWx0ZXJuYXRlX3NjYW4gJiYgcy0+ZGN0X3F1YW50aXplICE9IGZmX2RjdF9xdWFudGl6ZV9jKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYl9ibG9ja19jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGlmIChzLT5ibG9ja19sYXN0X2luZGV4W2ldID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDYzOyBqID4gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5ibG9ja1tpXVtzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZFtqXV0pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBodWZmbWFuIGVuY29kZSAqLworICAgIHN3aXRjaChzLT5jb2RlY19pZCl7IC8vRklYTUUgZnVuY3QgcHRyIGNvdWxkIGJlIHNsaWdodGx5IGZhc3RlcgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcyVklERU86CisgICAgICAgIGlmIChDT05GSUdfTVBFRzFWSURFT19FTkNPREVSIHx8IENPTkZJR19NUEVHMlZJREVPX0VOQ09ERVIpCisgICAgICAgICAgICBmZl9tcGVnMV9lbmNvZGVfbWIocywgcy0+YmxvY2ssIG1vdGlvbl94LCBtb3Rpb25feSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzQ6CisgICAgICAgIGlmIChDT05GSUdfTVBFRzRfRU5DT0RFUikKKyAgICAgICAgICAgIGZmX21wZWc0X2VuY29kZV9tYihzLCBzLT5ibG9jaywgbW90aW9uX3gsIG1vdGlvbl95KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NU01QRUc0VjI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NU01QRUc0VjM6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9XTVYxOgorICAgICAgICBpZiAoQ09ORklHX01TTVBFRzRfRU5DT0RFUikKKyAgICAgICAgICAgIGZmX21zbXBlZzRfZW5jb2RlX21iKHMsIHMtPmJsb2NrLCBtb3Rpb25feCwgbW90aW9uX3kpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1dNVjI6CisgICAgICAgIGlmIChDT05GSUdfV01WMl9FTkNPREVSKQorICAgICAgICAgICAgZmZfd212Ml9lbmNvZGVfbWIocywgcy0+YmxvY2ssIG1vdGlvbl94LCBtb3Rpb25feSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2MToKKyAgICAgICAgaWYgKENPTkZJR19IMjYxX0VOQ09ERVIpCisgICAgICAgICAgICBmZl9oMjYxX2VuY29kZV9tYihzLCBzLT5ibG9jaywgbW90aW9uX3gsIG1vdGlvbl95KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzOgorICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2M1A6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9GTFYxOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUlYxMDoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1JWMjA6CisgICAgICAgIGlmIChDT05GSUdfSDI2M19FTkNPREVSKQorICAgICAgICAgICAgZmZfaDI2M19lbmNvZGVfbWIocywgcy0+YmxvY2ssIG1vdGlvbl94LCBtb3Rpb25feSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfTUpQRUc6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BTVY6CisgICAgICAgIGlmIChDT05GSUdfTUpQRUdfRU5DT0RFUikKKyAgICAgICAgICAgIGZmX21qcGVnX2VuY29kZV9tYihzLCBzLT5ibG9jayk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDEoMCk7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGVuY29kZV9tYihNcGVnRW5jQ29udGV4dCAqcywgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3kpCit7CisgICAgaWYgKHMtPmNocm9tYV9mb3JtYXQgPT0gQ0hST01BXzQyMCkgZW5jb2RlX21iX2ludGVybmFsKHMsIG1vdGlvbl94LCBtb3Rpb25feSwgIDgsIDgsIDYpOworICAgIGVsc2UgaWYgKHMtPmNocm9tYV9mb3JtYXQgPT0gQ0hST01BXzQyMikgZW5jb2RlX21iX2ludGVybmFsKHMsIG1vdGlvbl94LCBtb3Rpb25feSwgMTYsIDgsIDgpOworICAgIGVsc2UgZW5jb2RlX21iX2ludGVybmFsKHMsIG1vdGlvbl94LCBtb3Rpb25feSwgMTYsIDE2LCAxMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2NvbnRleHRfYmVmb3JlX2VuY29kZShNcGVnRW5jQ29udGV4dCAqZCwgTXBlZ0VuY0NvbnRleHQgKnMsIGludCB0eXBlKXsKKyAgICBpbnQgaTsKKworICAgIG1lbWNweShkLT5sYXN0X212LCBzLT5sYXN0X212LCAyKjIqMipzaXplb2YoaW50KSk7IC8vRklYTUUgaXMgbWVtY3B5IGZhc3RlciB0aGFuIGEgbG9vcD8KKworICAgIC8qIG1wZWcxICovCisgICAgZC0+bWJfc2tpcF9ydW49IHMtPm1iX3NraXBfcnVuOworICAgIGZvcihpPTA7IGk8MzsgaSsrKQorICAgICAgICBkLT5sYXN0X2RjW2ldID0gcy0+bGFzdF9kY1tpXTsKKworICAgIC8qIHN0YXRpc3RpY3MgKi8KKyAgICBkLT5tdl9iaXRzPSBzLT5tdl9iaXRzOworICAgIGQtPmlfdGV4X2JpdHM9IHMtPmlfdGV4X2JpdHM7CisgICAgZC0+cF90ZXhfYml0cz0gcy0+cF90ZXhfYml0czsKKyAgICBkLT5pX2NvdW50PSBzLT5pX2NvdW50OworICAgIGQtPmZfY291bnQ9IHMtPmZfY291bnQ7CisgICAgZC0+Yl9jb3VudD0gcy0+Yl9jb3VudDsKKyAgICBkLT5za2lwX2NvdW50PSBzLT5za2lwX2NvdW50OworICAgIGQtPm1pc2NfYml0cz0gcy0+bWlzY19iaXRzOworICAgIGQtPmxhc3RfYml0cz0gMDsKKworICAgIGQtPm1iX3NraXBwZWQ9IDA7CisgICAgZC0+cXNjYWxlPSBzLT5xc2NhbGU7CisgICAgZC0+ZHF1YW50PSBzLT5kcXVhbnQ7CisKKyAgICBkLT5lc2MzX2xldmVsX2xlbmd0aD0gcy0+ZXNjM19sZXZlbF9sZW5ndGg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2NvbnRleHRfYWZ0ZXJfZW5jb2RlKE1wZWdFbmNDb250ZXh0ICpkLCBNcGVnRW5jQ29udGV4dCAqcywgaW50IHR5cGUpeworICAgIGludCBpOworCisgICAgbWVtY3B5KGQtPm12LCBzLT5tdiwgMio0KjIqc2l6ZW9mKGludCkpOworICAgIG1lbWNweShkLT5sYXN0X212LCBzLT5sYXN0X212LCAyKjIqMipzaXplb2YoaW50KSk7IC8vRklYTUUgaXMgbWVtY3B5IGZhc3RlciB0aGFuIGEgbG9vcD8KKworICAgIC8qIG1wZWcxICovCisgICAgZC0+bWJfc2tpcF9ydW49IHMtPm1iX3NraXBfcnVuOworICAgIGZvcihpPTA7IGk8MzsgaSsrKQorICAgICAgICBkLT5sYXN0X2RjW2ldID0gcy0+bGFzdF9kY1tpXTsKKworICAgIC8qIHN0YXRpc3RpY3MgKi8KKyAgICBkLT5tdl9iaXRzPSBzLT5tdl9iaXRzOworICAgIGQtPmlfdGV4X2JpdHM9IHMtPmlfdGV4X2JpdHM7CisgICAgZC0+cF90ZXhfYml0cz0gcy0+cF90ZXhfYml0czsKKyAgICBkLT5pX2NvdW50PSBzLT5pX2NvdW50OworICAgIGQtPmZfY291bnQ9IHMtPmZfY291bnQ7CisgICAgZC0+Yl9jb3VudD0gcy0+Yl9jb3VudDsKKyAgICBkLT5za2lwX2NvdW50PSBzLT5za2lwX2NvdW50OworICAgIGQtPm1pc2NfYml0cz0gcy0+bWlzY19iaXRzOworCisgICAgZC0+bWJfaW50cmE9IHMtPm1iX2ludHJhOworICAgIGQtPm1iX3NraXBwZWQ9IHMtPm1iX3NraXBwZWQ7CisgICAgZC0+bXZfdHlwZT0gcy0+bXZfdHlwZTsKKyAgICBkLT5tdl9kaXI9IHMtPm12X2RpcjsKKyAgICBkLT5wYj0gcy0+cGI7CisgICAgaWYocy0+ZGF0YV9wYXJ0aXRpb25pbmcpeworICAgICAgICBkLT5wYjI9IHMtPnBiMjsKKyAgICAgICAgZC0+dGV4X3BiPSBzLT50ZXhfcGI7CisgICAgfQorICAgIGQtPmJsb2NrPSBzLT5ibG9jazsKKyAgICBmb3IoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgZC0+YmxvY2tfbGFzdF9pbmRleFtpXT0gcy0+YmxvY2tfbGFzdF9pbmRleFtpXTsKKyAgICBkLT5pbnRlcmxhY2VkX2RjdD0gcy0+aW50ZXJsYWNlZF9kY3Q7CisgICAgZC0+cXNjYWxlPSBzLT5xc2NhbGU7CisKKyAgICBkLT5lc2MzX2xldmVsX2xlbmd0aD0gcy0+ZXNjM19sZXZlbF9sZW5ndGg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfbWJfaHEoTXBlZ0VuY0NvbnRleHQgKnMsIE1wZWdFbmNDb250ZXh0ICpiYWNrdXAsIE1wZWdFbmNDb250ZXh0ICpiZXN0LCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgcGJbMl0sIFB1dEJpdENvbnRleHQgcGIyWzJdLCBQdXRCaXRDb250ZXh0IHRleF9wYlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZG1pbiwgaW50ICpuZXh0X2Jsb2NrLCBpbnQgbW90aW9uX3gsIGludCBtb3Rpb25feSkKK3sKKyAgICBpbnQgc2NvcmU7CisgICAgdWludDhfdCAqZGVzdF9iYWNrdXBbM107CisKKyAgICBjb3B5X2NvbnRleHRfYmVmb3JlX2VuY29kZShzLCBiYWNrdXAsIHR5cGUpOworCisgICAgcy0+YmxvY2s9IHMtPmJsb2Nrc1sqbmV4dF9ibG9ja107CisgICAgcy0+cGI9IHBiWypuZXh0X2Jsb2NrXTsKKyAgICBpZihzLT5kYXRhX3BhcnRpdGlvbmluZyl7CisgICAgICAgIHMtPnBiMiAgID0gcGIyICAgWypuZXh0X2Jsb2NrXTsKKyAgICAgICAgcy0+dGV4X3BiPSB0ZXhfcGJbKm5leHRfYmxvY2tdOworICAgIH0KKworICAgIGlmKCpuZXh0X2Jsb2NrKXsKKyAgICAgICAgbWVtY3B5KGRlc3RfYmFja3VwLCBzLT5kZXN0LCBzaXplb2Yocy0+ZGVzdCkpOworICAgICAgICBzLT5kZXN0WzBdID0gcy0+cmRfc2NyYXRjaHBhZDsKKyAgICAgICAgcy0+ZGVzdFsxXSA9IHMtPnJkX3NjcmF0Y2hwYWQgKyAxNipzLT5saW5lc2l6ZTsKKyAgICAgICAgcy0+ZGVzdFsyXSA9IHMtPnJkX3NjcmF0Y2hwYWQgKyAxNipzLT5saW5lc2l6ZSArIDg7CisgICAgICAgIGF2X2Fzc2VydDAocy0+bGluZXNpemUgPj0gMzIpOyAvL0ZJWE1FCisgICAgfQorCisgICAgZW5jb2RlX21iKHMsIG1vdGlvbl94LCBtb3Rpb25feSk7CisKKyAgICBzY29yZT0gcHV0X2JpdHNfY291bnQoJnMtPnBiKTsKKyAgICBpZihzLT5kYXRhX3BhcnRpdGlvbmluZyl7CisgICAgICAgIHNjb3JlKz0gcHV0X2JpdHNfY291bnQoJnMtPnBiMik7CisgICAgICAgIHNjb3JlKz0gcHV0X2JpdHNfY291bnQoJnMtPnRleF9wYik7CisgICAgfQorCisgICAgaWYocy0+YXZjdHgtPm1iX2RlY2lzaW9uID09IEZGX01CX0RFQ0lTSU9OX1JEKXsKKyAgICAgICAgZmZfbXB2X2RlY29kZV9tYihzLCBzLT5ibG9jayk7CisKKyAgICAgICAgc2NvcmUgKj0gcy0+bGFtYmRhMjsKKyAgICAgICAgc2NvcmUgKz0gc3NlX21iKHMpIDw8IEZGX0xBTUJEQV9TSElGVDsKKyAgICB9CisKKyAgICBpZigqbmV4dF9ibG9jayl7CisgICAgICAgIG1lbWNweShzLT5kZXN0LCBkZXN0X2JhY2t1cCwgc2l6ZW9mKHMtPmRlc3QpKTsKKyAgICB9CisKKyAgICBpZihzY29yZTwqZG1pbil7CisgICAgICAgICpkbWluPSBzY29yZTsKKyAgICAgICAgKm5leHRfYmxvY2tePTE7CisKKyAgICAgICAgY29weV9jb250ZXh0X2FmdGVyX2VuY29kZShiZXN0LCBzLCB0eXBlKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgc3NlKE1wZWdFbmNDb250ZXh0ICpzLCB1aW50OF90ICpzcmMxLCB1aW50OF90ICpzcmMyLCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpeworICAgIHVpbnQzMl90ICpzcSA9IGZmX3NxdWFyZV90YWIgKyAyNTY7CisgICAgaW50IGFjYz0wOworICAgIGludCB4LHk7CisKKyAgICBpZih3PT0xNiAmJiBoPT0xNikKKyAgICAgICAgcmV0dXJuIHMtPm1lY2Muc3NlWzBdKE5VTEwsIHNyYzEsIHNyYzIsIHN0cmlkZSwgMTYpOworICAgIGVsc2UgaWYodz09OCAmJiBoPT04KQorICAgICAgICByZXR1cm4gcy0+bWVjYy5zc2VbMV0oTlVMTCwgc3JjMSwgc3JjMiwgc3RyaWRlLCA4KTsKKworICAgIGZvcih5PTA7IHk8aDsgeSsrKXsKKyAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICAgICAgYWNjKz0gc3Fbc3JjMVt4ICsgeSpzdHJpZGVdIC0gc3JjMlt4ICsgeSpzdHJpZGVdXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2Fzc2VydDIoYWNjPj0wKTsKKworICAgIHJldHVybiBhY2M7Cit9CisKK3N0YXRpYyBpbnQgc3NlX21iKE1wZWdFbmNDb250ZXh0ICpzKXsKKyAgICBpbnQgdz0gMTY7CisgICAgaW50IGg9IDE2OworCisgICAgaWYocy0+bWJfeCoxNiArIDE2ID4gcy0+d2lkdGggKSB3PSBzLT53aWR0aCAtIHMtPm1iX3gqMTY7CisgICAgaWYocy0+bWJfeSoxNiArIDE2ID4gcy0+aGVpZ2h0KSBoPSBzLT5oZWlnaHQtIHMtPm1iX3kqMTY7CisKKyAgICBpZih3PT0xNiAmJiBoPT0xNikKKyAgICAgIGlmKHMtPmF2Y3R4LT5tYl9jbXAgPT0gRkZfQ01QX05TU0UpeworICAgICAgICByZXR1cm4gcy0+bWVjYy5uc3NlWzBdKHMsIHMtPm5ld19waWN0dXJlLmYtPmRhdGFbMF0gKyBzLT5tYl94ICogMTYgKyBzLT5tYl95ICogcy0+bGluZXNpemUgICAqIDE2LCBzLT5kZXN0WzBdLCBzLT5saW5lc2l6ZSwgICAxNikgKworICAgICAgICAgICAgICAgcy0+bWVjYy5uc3NlWzFdKHMsIHMtPm5ld19waWN0dXJlLmYtPmRhdGFbMV0gKyBzLT5tYl94ICogIDggKyBzLT5tYl95ICogcy0+dXZsaW5lc2l6ZSAqICA4LCBzLT5kZXN0WzFdLCBzLT51dmxpbmVzaXplLCAgOCkgKworICAgICAgICAgICAgICAgcy0+bWVjYy5uc3NlWzFdKHMsIHMtPm5ld19waWN0dXJlLmYtPmRhdGFbMl0gKyBzLT5tYl94ICogIDggKyBzLT5tYl95ICogcy0+dXZsaW5lc2l6ZSAqICA4LCBzLT5kZXN0WzJdLCBzLT51dmxpbmVzaXplLCAgOCk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgcmV0dXJuIHMtPm1lY2Muc3NlWzBdKE5VTEwsIHMtPm5ld19waWN0dXJlLmYtPmRhdGFbMF0gKyBzLT5tYl94ICogMTYgKyBzLT5tYl95ICogcy0+bGluZXNpemUgICAqIDE2LCBzLT5kZXN0WzBdLCBzLT5saW5lc2l6ZSwgICAxNikgKworICAgICAgICAgICAgICAgcy0+bWVjYy5zc2VbMV0oTlVMTCwgcy0+bmV3X3BpY3R1cmUuZi0+ZGF0YVsxXSArIHMtPm1iX3ggKiAgOCArIHMtPm1iX3kgKiBzLT51dmxpbmVzaXplICogIDgsIHMtPmRlc3RbMV0sIHMtPnV2bGluZXNpemUsICA4KSArCisgICAgICAgICAgICAgICBzLT5tZWNjLnNzZVsxXShOVUxMLCBzLT5uZXdfcGljdHVyZS5mLT5kYXRhWzJdICsgcy0+bWJfeCAqICA4ICsgcy0+bWJfeSAqIHMtPnV2bGluZXNpemUgKiAgOCwgcy0+ZGVzdFsyXSwgcy0+dXZsaW5lc2l6ZSwgIDgpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICBzc2Uocywgcy0+bmV3X3BpY3R1cmUuZi0+ZGF0YVswXSArIHMtPm1iX3gqMTYgKyBzLT5tYl95KnMtPmxpbmVzaXplKjE2LCBzLT5kZXN0WzBdLCB3LCBoLCBzLT5saW5lc2l6ZSkKKyAgICAgICAgICAgICAgICtzc2Uocywgcy0+bmV3X3BpY3R1cmUuZi0+ZGF0YVsxXSArIHMtPm1iX3gqOCAgKyBzLT5tYl95KnMtPnV2bGluZXNpemUqOCxzLT5kZXN0WzFdLCB3Pj4xLCBoPj4xLCBzLT51dmxpbmVzaXplKQorICAgICAgICAgICAgICAgK3NzZShzLCBzLT5uZXdfcGljdHVyZS5mLT5kYXRhWzJdICsgcy0+bWJfeCo4ICArIHMtPm1iX3kqcy0+dXZsaW5lc2l6ZSo4LHMtPmRlc3RbMl0sIHc+PjEsIGg+PjEsIHMtPnV2bGluZXNpemUpOworfQorCitzdGF0aWMgaW50IHByZV9lc3RpbWF0ZV9tb3Rpb25fdGhyZWFkKEFWQ29kZWNDb250ZXh0ICpjLCB2b2lkICphcmcpeworICAgIE1wZWdFbmNDb250ZXh0ICpzPSAqKHZvaWQqKilhcmc7CisKKworICAgIHMtPm1lLnByZV9wYXNzPTE7CisgICAgcy0+bWUuZGlhX3NpemU9IHMtPmF2Y3R4LT5wcmVfZGlhX3NpemU7CisgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZT0xOworICAgIGZvcihzLT5tYl95PSBzLT5lbmRfbWJfeS0xOyBzLT5tYl95ID49IHMtPnN0YXJ0X21iX3k7IHMtPm1iX3ktLSkgeworICAgICAgICBmb3Iocy0+bWJfeD1zLT5tYl93aWR0aC0xOyBzLT5tYl94ID49MCA7cy0+bWJfeC0tKSB7CisgICAgICAgICAgICBmZl9wcmVfZXN0aW1hdGVfcF9mcmFtZV9tb3Rpb24ocywgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgIH0KKyAgICAgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZT0wOworICAgIH0KKworICAgIHMtPm1lLnByZV9wYXNzPTA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlc3RpbWF0ZV9tb3Rpb25fdGhyZWFkKEFWQ29kZWNDb250ZXh0ICpjLCB2b2lkICphcmcpeworICAgIE1wZWdFbmNDb250ZXh0ICpzPSAqKHZvaWQqKilhcmc7CisKKyAgICBmZl9jaGVja19hbGlnbm1lbnQoKTsKKworICAgIHMtPm1lLmRpYV9zaXplPSBzLT5hdmN0eC0+ZGlhX3NpemU7CisgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZT0xOworICAgIGZvcihzLT5tYl95PSBzLT5zdGFydF9tYl95OyBzLT5tYl95IDwgcy0+ZW5kX21iX3k7IHMtPm1iX3krKykgeworICAgICAgICBzLT5tYl94PTA7IC8vZm9yIGJsb2NrIGluaXQgYmVsb3cKKyAgICAgICAgZmZfaW5pdF9ibG9ja19pbmRleChzKTsKKyAgICAgICAgZm9yKHMtPm1iX3g9MDsgcy0+bWJfeCA8IHMtPm1iX3dpZHRoOyBzLT5tYl94KyspIHsKKyAgICAgICAgICAgIHMtPmJsb2NrX2luZGV4WzBdKz0yOworICAgICAgICAgICAgcy0+YmxvY2tfaW5kZXhbMV0rPTI7CisgICAgICAgICAgICBzLT5ibG9ja19pbmRleFsyXSs9MjsKKyAgICAgICAgICAgIHMtPmJsb2NrX2luZGV4WzNdKz0yOworCisgICAgICAgICAgICAvKiBjb21wdXRlIG1vdGlvbiB2ZWN0b3IgJiBtYl90eXBlIGFuZCBzdG9yZSBpbiBjb250ZXh0ICovCisgICAgICAgICAgICBpZihzLT5waWN0X3R5cGU9PUFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgICAgIGZmX2VzdGltYXRlX2JfZnJhbWVfbW90aW9uKHMsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZmX2VzdGltYXRlX3BfZnJhbWVfbW90aW9uKHMsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICB9CisgICAgICAgIHMtPmZpcnN0X3NsaWNlX2xpbmU9MDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWJfdmFyX3RocmVhZChBVkNvZGVjQ29udGV4dCAqYywgdm9pZCAqYXJnKXsKKyAgICBNcGVnRW5jQ29udGV4dCAqcz0gKih2b2lkKiopYXJnOworICAgIGludCBtYl94LCBtYl95OworCisgICAgZmZfY2hlY2tfYWxpZ25tZW50KCk7CisKKyAgICBmb3IobWJfeT1zLT5zdGFydF9tYl95OyBtYl95IDwgcy0+ZW5kX21iX3k7IG1iX3krKykgeworICAgICAgICBmb3IobWJfeD0wOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgaW50IHh4ID0gbWJfeCAqIDE2OworICAgICAgICAgICAgaW50IHl5ID0gbWJfeSAqIDE2OworICAgICAgICAgICAgdWludDhfdCAqcGl4ID0gcy0+bmV3X3BpY3R1cmUuZi0+ZGF0YVswXSArICh5eSAqIHMtPmxpbmVzaXplKSArIHh4OworICAgICAgICAgICAgaW50IHZhcmM7CisgICAgICAgICAgICBpbnQgc3VtID0gcy0+bXB2ZW5jZHNwLnBpeF9zdW0ocGl4LCBzLT5saW5lc2l6ZSk7CisKKyAgICAgICAgICAgIHZhcmMgPSAocy0+bXB2ZW5jZHNwLnBpeF9ub3JtMShwaXgsIHMtPmxpbmVzaXplKSAtCisgICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkKSBzdW0gKiBzdW0pID4+IDgpICsgNTAwICsgMTI4KSA+PiA4OworCisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdmFyIFtzLT5tYl9zdHJpZGUgKiBtYl95ICsgbWJfeF0gPSB2YXJjOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX21lYW5bcy0+bWJfc3RyaWRlICogbWJfeSArIG1iX3hdID0gKHN1bSsxMjgpPj44OworICAgICAgICAgICAgcy0+bWUubWJfdmFyX3N1bV90ZW1wICAgICs9IHZhcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3NsaWNlX2VuZChNcGVnRW5jQ29udGV4dCAqcyl7CisgICAgaWYoQ09ORklHX01QRUc0X0VOQ09ERVIgJiYgcy0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX01QRUc0KXsKKyAgICAgICAgaWYocy0+cGFydGl0aW9uZWRfZnJhbWUpeworICAgICAgICAgICAgZmZfbXBlZzRfbWVyZ2VfcGFydGl0aW9ucyhzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZmX21wZWc0X3N0dWZmaW5nKCZzLT5wYik7CisgICAgfWVsc2UgaWYoQ09ORklHX01KUEVHX0VOQ09ERVIgJiYgcy0+b3V0X2Zvcm1hdCA9PSBGTVRfTUpQRUcpeworICAgICAgICBmZl9tanBlZ19lbmNvZGVfc3R1ZmZpbmcocyk7CisgICAgfQorCisgICAgYXZwcml2X2FsaWduX3B1dF9iaXRzKCZzLT5wYik7CisgICAgZmx1c2hfcHV0X2JpdHMoJnMtPnBiKTsKKworICAgIGlmKChzLT5mbGFncyZDT0RFQ19GTEFHX1BBU1MxKSAmJiAhcy0+cGFydGl0aW9uZWRfZnJhbWUpCisgICAgICAgIHMtPm1pc2NfYml0cys9IGdldF9iaXRzX2RpZmYocyk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX21iX2luZm8oTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgdWludDhfdCAqcHRyID0gcy0+bWJfaW5mb19wdHIgKyBzLT5tYl9pbmZvX3NpemUgLSAxMjsKKyAgICBpbnQgb2Zmc2V0ID0gcHV0X2JpdHNfY291bnQoJnMtPnBiKTsKKyAgICBpbnQgbWJhICA9IHMtPm1iX3ggKyBzLT5tYl93aWR0aCAqIChzLT5tYl95ICUgcy0+Z29iX2luZGV4KTsKKyAgICBpbnQgZ29ibiA9IHMtPm1iX3kgLyBzLT5nb2JfaW5kZXg7CisgICAgaW50IHByZWRfeCwgcHJlZF95OworICAgIGlmIChDT05GSUdfSDI2M19FTkNPREVSKQorICAgICAgICBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIDAsIDAsICZwcmVkX3gsICZwcmVkX3kpOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJnB0ciwgb2Zmc2V0KTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwdHIsIHMtPnFzY2FsZSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcHRyLCBnb2JuKTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZwdHIsIG1iYSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcHRyLCBwcmVkX3gpOyAvKiBobXYxICovCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcHRyLCBwcmVkX3kpOyAvKiB2bXYxICovCisgICAgLyogNE1WIG5vdCBpbXBsZW1lbnRlZCAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnB0ciwgMCk7IC8qIGhtdjIgKi8KKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwdHIsIDApOyAvKiB2bXYyICovCit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9tYl9pbmZvKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgc3RhcnRjb2RlKQoreworICAgIGlmICghcy0+bWJfaW5mbykKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChwdXRfYml0c19jb3VudCgmcy0+cGIpIC0gcy0+cHJldl9tYl9pbmZvKjggPj0gcy0+bWJfaW5mbyo4KSB7CisgICAgICAgIHMtPm1iX2luZm9fc2l6ZSArPSAxMjsKKyAgICAgICAgcy0+cHJldl9tYl9pbmZvID0gcy0+bGFzdF9tYl9pbmZvOworICAgIH0KKyAgICBpZiAoc3RhcnRjb2RlKSB7CisgICAgICAgIHMtPnByZXZfbWJfaW5mbyA9IHB1dF9iaXRzX2NvdW50KCZzLT5wYikvODsKKyAgICAgICAgLyogVGhpcyBtaWdodCBoYXZlIGluY3JlbWVudGVkIG1iX2luZm9fc2l6ZSBhYm92ZSwgYW5kIHdlIHJldHVybiB3aXRob3V0CisgICAgICAgICAqIGFjdHVhbGx5IHdyaXRpbmcgYW55IGluZm8gaW50byB0aGF0IHNsb3QgeWV0LiBCdXQgaW4gdGhhdCBjYXNlLAorICAgICAgICAgKiB0aGlzIHdpbGwgYmUgY2FsbGVkIGFnYWluIGF0IHRoZSBzdGFydCBvZiB0aGUgYWZ0ZXIgd3JpdGluZyB0aGUKKyAgICAgICAgICogc3RhcnQgY29kZSwgYWN0dWFsbHkgd3JpdGluZyB0aGUgbWIgaW5mby4gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHMtPmxhc3RfbWJfaW5mbyA9IHB1dF9iaXRzX2NvdW50KCZzLT5wYikvODsKKyAgICBpZiAoIXMtPm1iX2luZm9fc2l6ZSkKKyAgICAgICAgcy0+bWJfaW5mb19zaXplICs9IDEyOworICAgIHdyaXRlX21iX2luZm8ocyk7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3RocmVhZChBVkNvZGVjQ29udGV4dCAqYywgdm9pZCAqYXJnKXsKKyAgICBNcGVnRW5jQ29udGV4dCAqcz0gKih2b2lkKiopYXJnOworICAgIGludCBtYl94LCBtYl95LCBwZGlmID0gMDsKKyAgICBpbnQgY2hyX2g9IDE2Pj5zLT5jaHJvbWFfeV9zaGlmdDsKKyAgICBpbnQgaSwgajsKKyAgICBNcGVnRW5jQ29udGV4dCBiZXN0X3MsIGJhY2t1cF9zOworICAgIHVpbnQ4X3QgYml0X2J1ZlsyXVtNQVhfTUJfQllURVNdOworICAgIHVpbnQ4X3QgYml0X2J1ZjJbMl1bTUFYX01CX0JZVEVTXTsKKyAgICB1aW50OF90IGJpdF9idWZfdGV4WzJdW01BWF9NQl9CWVRFU107CisgICAgUHV0Qml0Q29udGV4dCBwYlsyXSwgcGIyWzJdLCB0ZXhfcGJbMl07CisKKyAgICBmZl9jaGVja19hbGlnbm1lbnQoKTsKKworICAgIGZvcihpPTA7IGk8MjsgaSsrKXsKKyAgICAgICAgaW5pdF9wdXRfYml0cygmcGIgICAgW2ldLCBiaXRfYnVmICAgIFtpXSwgTUFYX01CX0JZVEVTKTsKKyAgICAgICAgaW5pdF9wdXRfYml0cygmcGIyICAgW2ldLCBiaXRfYnVmMiAgIFtpXSwgTUFYX01CX0JZVEVTKTsKKyAgICAgICAgaW5pdF9wdXRfYml0cygmdGV4X3BiW2ldLCBiaXRfYnVmX3RleFtpXSwgTUFYX01CX0JZVEVTKTsKKyAgICB9CisKKyAgICBzLT5sYXN0X2JpdHM9IHB1dF9iaXRzX2NvdW50KCZzLT5wYik7CisgICAgcy0+bXZfYml0cz0wOworICAgIHMtPm1pc2NfYml0cz0wOworICAgIHMtPmlfdGV4X2JpdHM9MDsKKyAgICBzLT5wX3RleF9iaXRzPTA7CisgICAgcy0+aV9jb3VudD0wOworICAgIHMtPmZfY291bnQ9MDsKKyAgICBzLT5iX2NvdW50PTA7CisgICAgcy0+c2tpcF9jb3VudD0wOworCisgICAgZm9yKGk9MDsgaTwzOyBpKyspeworICAgICAgICAvKiBpbml0IGxhc3QgZGMgdmFsdWVzICovCisgICAgICAgIC8qIG5vdGU6IHF1YW50IG1hdHJpeCB2YWx1ZSAoOCkgaXMgaW1wbGllZCBoZXJlICovCisgICAgICAgIHMtPmxhc3RfZGNbaV0gPSAxMjggPDwgcy0+aW50cmFfZGNfcHJlY2lzaW9uOworCisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5lcnJvcltpXSA9IDA7CisgICAgfQorICAgIGlmKHMtPmNvZGVjX2lkPT1BVl9DT0RFQ19JRF9BTVYpeworICAgICAgICBzLT5sYXN0X2RjWzBdID0gMTI4KjgvMTM7CisgICAgICAgIHMtPmxhc3RfZGNbMV0gPSAxMjgqOC8xNDsKKyAgICAgICAgcy0+bGFzdF9kY1syXSA9IDEyOCo4LzE0OworICAgIH0KKyAgICBzLT5tYl9za2lwX3J1biA9IDA7CisgICAgbWVtc2V0KHMtPmxhc3RfbXYsIDAsIHNpemVvZihzLT5sYXN0X212KSk7CisKKyAgICBzLT5sYXN0X212X2RpciA9IDA7CisKKyAgICBzd2l0Y2gocy0+Y29kZWNfaWQpeworICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2MzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjNQOgorICAgIGNhc2UgQVZfQ09ERUNfSURfRkxWMToKKyAgICAgICAgaWYgKENPTkZJR19IMjYzX0VOQ09ERVIpCisgICAgICAgICAgICBzLT5nb2JfaW5kZXggPSBmZl9oMjYzX2dldF9nb2JfaGVpZ2h0KHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OgorICAgICAgICBpZihDT05GSUdfTVBFRzRfRU5DT0RFUiAmJiBzLT5wYXJ0aXRpb25lZF9mcmFtZSkKKyAgICAgICAgICAgIGZmX21wZWc0X2luaXRfcGFydGl0aW9ucyhzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcy0+cmVzeW5jX21iX3g9MDsKKyAgICBzLT5yZXN5bmNfbWJfeT0wOworICAgIHMtPmZpcnN0X3NsaWNlX2xpbmUgPSAxOworICAgIHMtPnB0cl9sYXN0Z29iID0gcy0+cGIuYnVmOworICAgIGZvcihtYl95PSBzLT5zdGFydF9tYl95OyBtYl95IDwgcy0+ZW5kX21iX3k7IG1iX3krKykgeworICAgICAgICBzLT5tYl94PTA7CisgICAgICAgIHMtPm1iX3k9IG1iX3k7CisKKyAgICAgICAgZmZfc2V0X3FzY2FsZShzLCBzLT5xc2NhbGUpOworICAgICAgICBmZl9pbml0X2Jsb2NrX2luZGV4KHMpOworCisgICAgICAgIGZvcihtYl94PTA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICBpbnQgeHk9IG1iX3kqcy0+bWJfc3RyaWRlICsgbWJfeDsgLy8gcmVtb3ZlZCBjb25zdCwgSDI2MSBuZWVkcyB0byBhZGp1c3QgdGhpcworICAgICAgICAgICAgaW50IG1iX3R5cGU9IHMtPm1iX3R5cGVbeHldOworLy8gICAgICAgICAgICBpbnQgZDsKKyAgICAgICAgICAgIGludCBkbWluPSBJTlRfTUFYOworICAgICAgICAgICAgaW50IGRpcjsKKworICAgICAgICAgICAgaWYgKCAgIHMtPnBiLmJ1Zl9lbmQgLSBzLT5wYi5idWYgLSAocHV0X2JpdHNfY291bnQoJnMtPnBiKT4+MykgPCBNQVhfTUJfQllURVMKKyAgICAgICAgICAgICAgICAmJiBzLT5zbGljZV9jb250ZXh0X2NvdW50ID09IDEKKyAgICAgICAgICAgICAgICAmJiBzLT5wYi5idWYgPT0gcy0+YXZjdHgtPmludGVybmFsLT5ieXRlX2J1ZmZlcikgeworICAgICAgICAgICAgICAgIGludCBuZXdfc2l6ZSA9ICBzLT5hdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcy0+YXZjdHgtPmludGVybmFsLT5ieXRlX2J1ZmZlcl9zaXplLzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcy0+bWJfd2lkdGgqTUFYX01CX0JZVEVTOworICAgICAgICAgICAgICAgIGludCBsYXN0Z29iX3BvcyA9IHMtPnB0cl9sYXN0Z29iIC0gcy0+cGIuYnVmOworICAgICAgICAgICAgICAgIGludCB2YnZfcG9zICAgICA9IHMtPnZidl9kZWxheV9wdHIgLSBzLT5wYi5idWY7CisKKyAgICAgICAgICAgICAgICB1aW50OF90ICpuZXdfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpbnQgbmV3X2J1ZmZlcl9zaXplID0gMDsKKworICAgICAgICAgICAgICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmbmV3X2J1ZmZlciwgJm5ld19idWZmZXJfc2l6ZSwgbmV3X3NpemUpOworICAgICAgICAgICAgICAgIGlmIChuZXdfYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShuZXdfYnVmZmVyLCBzLT5hdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyLCBzLT5hdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyX3NpemUpOworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKHMtPmF2Y3R4LT5pbnRlcm5hbC0+Ynl0ZV9idWZmZXIpOworICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyICAgICAgPSBuZXdfYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyX3NpemUgPSBuZXdfYnVmZmVyX3NpemU7CisgICAgICAgICAgICAgICAgICAgIHJlYmFzZV9wdXRfYml0cygmcy0+cGIsIG5ld19idWZmZXIsIG5ld19idWZmZXJfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHMtPnB0cl9sYXN0Z29iICAgPSBzLT5wYi5idWYgKyBsYXN0Z29iX3BvczsKKyAgICAgICAgICAgICAgICAgICAgcy0+dmJ2X2RlbGF5X3B0ciA9IHMtPnBiLmJ1ZiArIHZidl9wb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocy0+cGIuYnVmX2VuZCAtIHMtPnBiLmJ1ZiAtIChwdXRfYml0c19jb3VudCgmcy0+cGIpPj4zKSA8IE1BWF9NQl9CWVRFUyl7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlbmNvZGVkIGZyYW1lIHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocy0+ZGF0YV9wYXJ0aXRpb25pbmcpeworICAgICAgICAgICAgICAgIGlmKCAgIHMtPnBiMiAgIC5idWZfZW5kIC0gcy0+cGIyICAgLmJ1ZiAtIChwdXRfYml0c19jb3VudCgmcy0+ICAgIHBiMik+PjMpIDwgTUFYX01CX0JZVEVTCisgICAgICAgICAgICAgICAgICAgfHwgcy0+dGV4X3BiLmJ1Zl9lbmQgLSBzLT50ZXhfcGIuYnVmIC0gKHB1dF9iaXRzX2NvdW50KCZzLT50ZXhfcGIgKT4+MykgPCBNQVhfTUJfQllURVMpeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVuY29kZWQgcGFydGl0aW9uZWQgZnJhbWUgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+bWJfeCA9IG1iX3g7CisgICAgICAgICAgICBzLT5tYl95ID0gbWJfeTsgIC8vIG1vdmVkIGludG8gbG9vcCwgY2FuIGdldCBjaGFuZ2VkIGJ5IEguMjYxCisgICAgICAgICAgICBmZl91cGRhdGVfYmxvY2tfaW5kZXgocyk7CisKKyAgICAgICAgICAgIGlmKENPTkZJR19IMjYxX0VOQ09ERVIgJiYgcy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2MSl7CisgICAgICAgICAgICAgICAgZmZfaDI2MV9yZW9yZGVyX21iX2luZGV4KHMpOworICAgICAgICAgICAgICAgIHh5PSBzLT5tYl95KnMtPm1iX3N0cmlkZSArIHMtPm1iX3g7CisgICAgICAgICAgICAgICAgbWJfdHlwZT0gcy0+bWJfdHlwZVt4eV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHdyaXRlIGdvYiAvIHZpZGVvIHBhY2tldCBoZWFkZXIgICovCisgICAgICAgICAgICBpZihzLT5ydHBfbW9kZSl7CisgICAgICAgICAgICAgICAgaW50IGN1cnJlbnRfcGFja2V0X3NpemUsIGlzX2dvYl9zdGFydDsKKworICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFja2V0X3NpemU9ICgocHV0X2JpdHNfY291bnQoJnMtPnBiKSs3KT4+MykgLSAocy0+cHRyX2xhc3Rnb2IgLSBzLT5wYi5idWYpOworCisgICAgICAgICAgICAgICAgaXNfZ29iX3N0YXJ0PSBzLT5hdmN0eC0+cnRwX3BheWxvYWRfc2l6ZSAmJiBjdXJyZW50X3BhY2tldF9zaXplID49IHMtPmF2Y3R4LT5ydHBfcGF5bG9hZF9zaXplICYmIG1iX3kgKyBtYl94PjA7CisKKyAgICAgICAgICAgICAgICBpZihzLT5zdGFydF9tYl95ID09IG1iX3kgJiYgbWJfeSA+IDAgJiYgbWJfeD09MCkgaXNfZ29iX3N0YXJ0PTE7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2gocy0+Y29kZWNfaWQpeworICAgICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2MToKKyAgICAgICAgICAgICAgICAgICAgaXNfZ29iX3N0YXJ0PTA7Ly9GSVhNRQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjM6CisgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzUDoKKyAgICAgICAgICAgICAgICAgICAgaWYoIXMtPmgyNjNfc2xpY2Vfc3RydWN0dXJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHMtPm1iX3ggfHwgcy0+bWJfeSVzLT5nb2JfaW5kZXgpIGlzX2dvYl9zdGFydD0wOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcyVklERU86CisgICAgICAgICAgICAgICAgICAgIGlmKHMtPm1iX3g9PTAgJiYgcy0+bWJfeSE9MCkgaXNfZ29iX3N0YXJ0PTE7CisgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPOgorICAgICAgICAgICAgICAgICAgICBpZihzLT5tYl9za2lwX3J1bikgaXNfZ29iX3N0YXJ0PTA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTUpQRUc6CisgICAgICAgICAgICAgICAgICAgIGlmKHMtPm1iX3g9PTAgJiYgcy0+bWJfeSE9MCkgaXNfZ29iX3N0YXJ0PTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKGlzX2dvYl9zdGFydCl7CisgICAgICAgICAgICAgICAgICAgIGlmKHMtPnN0YXJ0X21iX3kgIT0gbWJfeSB8fCBtYl94IT0wKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3NsaWNlX2VuZChzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoQ09ORklHX01QRUc0X0VOQ09ERVIgJiYgcy0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX01QRUc0ICYmIHMtPnBhcnRpdGlvbmVkX2ZyYW1lKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9tcGVnNF9pbml0X3BhcnRpdGlvbnMocyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKChwdXRfYml0c19jb3VudCgmcy0+cGIpJjcpID09IDApOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3BhY2tldF9zaXplPSBwdXRfYml0c19wdHIoJnMtPnBiKSAtIHMtPnB0cl9sYXN0Z29iOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5lcnJvcl9yYXRlICYmIHMtPnJlc3luY19tYl94ICsgcy0+cmVzeW5jX21iX3kgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcj0gcHV0X2JpdHNfY291bnQoJnMtPnBiKS84ICsgcy0+cGljdHVyZV9udW1iZXIgKyAxNiArIHMtPm1iX3ggKyBzLT5tYl95OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGQgPSAxMDAgLyBzLT5lcnJvcl9yYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYociAlIGQgPT0gMCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9wYWNrZXRfc2l6ZT0wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBiLmJ1Zl9wdHI9IHMtPnB0cl9sYXN0Z29iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChwdXRfYml0c19wdHIoJnMtPnBiKSA9PSBzLT5wdHJfbGFzdGdvYik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocy0+YXZjdHgtPnJ0cF9jYWxsYmFjayl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyX21iID0gKG1iX3kgLSBzLT5yZXN5bmNfbWJfeSkqcy0+bWJfd2lkdGggKyBtYl94IC0gcy0+cmVzeW5jX21iX3g7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+cnRwX2NhbGxiYWNrKHMtPmF2Y3R4LCBzLT5wdHJfbGFzdGdvYiwgY3VycmVudF9wYWNrZXRfc2l6ZSwgbnVtYmVyX21iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1cGRhdGVfbWJfaW5mbyhzLCAxKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocy0+Y29kZWNfaWQpeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENPTkZJR19NUEVHNF9FTkNPREVSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzRfZW5jb2RlX3ZpZGVvX3BhY2tldF9oZWFkZXIocyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzRfY2xlYW5fYnVmZmVycyhzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENPTkZJR19NUEVHMVZJREVPX0VOQ09ERVIgfHwgQ09ORklHX01QRUcyVklERU9fRU5DT0RFUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21wZWcxX2VuY29kZV9zbGljZV9oZWFkZXIocyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzFfY2xlYW5fYnVmZmVycyhzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2MzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDT05GSUdfSDI2M19FTkNPREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfZW5jb2RlX2dvYl9oZWFkZXIocywgbWJfeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYocy0+ZmxhZ3MmQ09ERUNfRkxBR19QQVNTMSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cz0gcHV0X2JpdHNfY291bnQoJnMtPnBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1pc2NfYml0cys9IGJpdHMgLSBzLT5sYXN0X2JpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X2JpdHM9IGJpdHM7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzLT5wdHJfbGFzdGdvYiArPSBjdXJyZW50X3BhY2tldF9zaXplOworICAgICAgICAgICAgICAgICAgICBzLT5maXJzdF9zbGljZV9saW5lPTE7CisgICAgICAgICAgICAgICAgICAgIHMtPnJlc3luY19tYl94PW1iX3g7CisgICAgICAgICAgICAgICAgICAgIHMtPnJlc3luY19tYl95PW1iX3k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggIChzLT5yZXN5bmNfbWJfeCAgID09IHMtPm1iX3gpCisgICAgICAgICAgICAgICAmJiBzLT5yZXN5bmNfbWJfeSsxID09IHMtPm1iX3kpeworICAgICAgICAgICAgICAgIHMtPmZpcnN0X3NsaWNlX2xpbmU9MDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+bWJfc2tpcHBlZD0wOworICAgICAgICAgICAgcy0+ZHF1YW50PTA7IC8vb25seSBmb3IgUVBfUkQKKworICAgICAgICAgICAgdXBkYXRlX21iX2luZm8ocywgMCk7CisKKyAgICAgICAgICAgIGlmIChtYl90eXBlICYgKG1iX3R5cGUtMSkgfHwgKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX1FQX1JEKSkgeyAvLyBtb3JlIHRoYW4gMSBNQiB0eXBlIHBvc3NpYmxlIG9yIEZGX01QVl9GTEFHX1FQX1JECisgICAgICAgICAgICAgICAgaW50IG5leHRfYmxvY2s9MDsKKyAgICAgICAgICAgICAgICBpbnQgcGJfYml0c19jb3VudCwgcGIyX2JpdHNfY291bnQsIHRleF9wYl9iaXRzX2NvdW50OworCisgICAgICAgICAgICAgICAgY29weV9jb250ZXh0X2JlZm9yZV9lbmNvZGUoJmJhY2t1cF9zLCBzLCAtMSk7CisgICAgICAgICAgICAgICAgYmFja3VwX3MucGI9IHMtPnBiOworICAgICAgICAgICAgICAgIGJlc3Rfcy5kYXRhX3BhcnRpdGlvbmluZz0gcy0+ZGF0YV9wYXJ0aXRpb25pbmc7CisgICAgICAgICAgICAgICAgYmVzdF9zLnBhcnRpdGlvbmVkX2ZyYW1lPSBzLT5wYXJ0aXRpb25lZF9mcmFtZTsKKyAgICAgICAgICAgICAgICBpZihzLT5kYXRhX3BhcnRpdGlvbmluZyl7CisgICAgICAgICAgICAgICAgICAgIGJhY2t1cF9zLnBiMj0gcy0+cGIyOworICAgICAgICAgICAgICAgICAgICBiYWNrdXBfcy50ZXhfcGI9IHMtPnRleF9wYjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihtYl90eXBlJkNBTkRJREFURV9NQl9UWVBFX0lOVEVSKXsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSBzLT5wX212X3RhYmxlW3h5XVswXTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSBzLT5wX212X3RhYmxlW3h5XVsxXTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21iX2hxKHMsICZiYWNrdXBfcywgJmJlc3RfcywgQ0FORElEQVRFX01CX1RZUEVfSU5URVIsIHBiLCBwYjIsIHRleF9wYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbWluLCAmbmV4dF9ibG9jaywgcy0+bXZbMF1bMF1bMF0sIHMtPm12WzBdWzBdWzFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobWJfdHlwZSZDQU5ESURBVEVfTUJfVFlQRV9JTlRFUl9JKXsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFX0ZJRUxEOworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgaj0gcy0+ZmllbGRfc2VsZWN0WzBdW2ldID0gcy0+cF9maWVsZF9zZWxlY3RfdGFibGVbaV1beHldOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1baV1bMF0gPSBzLT5wX2ZpZWxkX212X3RhYmxlW2ldW2pdW3h5XVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzFdID0gcy0+cF9maWVsZF9tdl90YWJsZVtpXVtqXVt4eV1bMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21iX2hxKHMsICZiYWNrdXBfcywgJmJlc3RfcywgQ0FORElEQVRFX01CX1RZUEVfSU5URVJfSSwgcGIsIHBiMiwgdGV4X3BiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRtaW4sICZuZXh0X2Jsb2NrLCAwLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobWJfdHlwZSZDQU5ESURBVEVfTUJfVFlQRV9TS0lQUEVEKXsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSAwOworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZV9tYl9ocShzLCAmYmFja3VwX3MsICZiZXN0X3MsIENBTkRJREFURV9NQl9UWVBFX1NLSVBQRUQsIHBiLCBwYjIsIHRleF9wYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbWluLCAmbmV4dF9ibG9jaywgcy0+bXZbMF1bMF1bMF0sIHMtPm12WzBdWzBdWzFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobWJfdHlwZSZDQU5ESURBVEVfTUJfVFlQRV9JTlRFUjRWKXsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzhYODsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWJfaW50cmE9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1baV1bMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVtzLT5ibG9ja19pbmRleFtpXV1bMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21iX2hxKHMsICZiYWNrdXBfcywgJmJlc3RfcywgQ0FORElEQVRFX01CX1RZUEVfSU5URVI0ViwgcGIsIHBiMiwgdGV4X3BiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRtaW4sICZuZXh0X2Jsb2NrLCAwLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobWJfdHlwZSZDQU5ESURBVEVfTUJfVFlQRV9GT1JXQVJEKXsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSBzLT5iX2ZvcndfbXZfdGFibGVbeHldWzBdOworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IHMtPmJfZm9yd19tdl90YWJsZVt4eV1bMV07CisgICAgICAgICAgICAgICAgICAgIGVuY29kZV9tYl9ocShzLCAmYmFja3VwX3MsICZiZXN0X3MsIENBTkRJREFURV9NQl9UWVBFX0ZPUldBUkQsIHBiLCBwYjIsIHRleF9wYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbWluLCAmbmV4dF9ibG9jaywgcy0+bXZbMF1bMF1bMF0sIHMtPm12WzBdWzBdWzFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobWJfdHlwZSZDQU5ESURBVEVfTUJfVFlQRV9CQUNLV0FSRCl7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9CQUNLV0FSRDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfdHlwZSA9IE1WX1RZUEVfMTZYMTY7CisgICAgICAgICAgICAgICAgICAgIHMtPm1iX2ludHJhPSAwOworICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVswXSA9IHMtPmJfYmFja19tdl90YWJsZVt4eV1bMF07CisgICAgICAgICAgICAgICAgICAgIHMtPm12WzFdWzBdWzFdID0gcy0+Yl9iYWNrX212X3RhYmxlW3h5XVsxXTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21iX2hxKHMsICZiYWNrdXBfcywgJmJlc3RfcywgQ0FORElEQVRFX01CX1RZUEVfQkFDS1dBUkQsIHBiLCBwYjIsIHRleF9wYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbWluLCAmbmV4dF9ibG9jaywgcy0+bXZbMV1bMF1bMF0sIHMtPm12WzFdWzBdWzFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobWJfdHlwZSZDQU5ESURBVEVfTUJfVFlQRV9CSURJUil7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEIHwgTVZfRElSX0JBQ0tXQVJEOworICAgICAgICAgICAgICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV8xNlgxNjsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWJfaW50cmE9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzBdID0gcy0+Yl9iaWRpcl9mb3J3X212X3RhYmxlW3h5XVswXTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSBzLT5iX2JpZGlyX2ZvcndfbXZfdGFibGVbeHldWzFdOworICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVswXSA9IHMtPmJfYmlkaXJfYmFja19tdl90YWJsZVt4eV1bMF07CisgICAgICAgICAgICAgICAgICAgIHMtPm12WzFdWzBdWzFdID0gcy0+Yl9iaWRpcl9iYWNrX212X3RhYmxlW3h5XVsxXTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21iX2hxKHMsICZiYWNrdXBfcywgJmJlc3RfcywgQ0FORElEQVRFX01CX1RZUEVfQklESVIsIHBiLCBwYjIsIHRleF9wYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbWluLCAmbmV4dF9ibG9jaywgMCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKG1iX3R5cGUmQ0FORElEQVRFX01CX1RZUEVfRk9SV0FSRF9JKXsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFX0ZJRUxEOworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgaj0gcy0+ZmllbGRfc2VsZWN0WzBdW2ldID0gcy0+Yl9maWVsZF9zZWxlY3RfdGFibGVbMF1baV1beHldOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1baV1bMF0gPSBzLT5iX2ZpZWxkX212X3RhYmxlWzBdW2ldW2pdW3h5XVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzFdID0gcy0+Yl9maWVsZF9tdl90YWJsZVswXVtpXVtqXVt4eV1bMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21iX2hxKHMsICZiYWNrdXBfcywgJmJlc3RfcywgQ0FORElEQVRFX01CX1RZUEVfRk9SV0FSRF9JLCBwYiwgcGIyLCB0ZXhfcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG1pbiwgJm5leHRfYmxvY2ssIDAsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihtYl90eXBlJkNBTkRJREFURV9NQl9UWVBFX0JBQ0tXQVJEX0kpeworICAgICAgICAgICAgICAgICAgICBzLT5tdl9kaXIgPSBNVl9ESVJfQkFDS1dBUkQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFX0ZJRUxEOworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgaj0gcy0+ZmllbGRfc2VsZWN0WzFdW2ldID0gcy0+Yl9maWVsZF9zZWxlY3RfdGFibGVbMV1baV1beHldOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMV1baV1bMF0gPSBzLT5iX2ZpZWxkX212X3RhYmxlWzFdW2ldW2pdW3h5XVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzFdW2ldWzFdID0gcy0+Yl9maWVsZF9tdl90YWJsZVsxXVtpXVtqXVt4eV1bMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21iX2hxKHMsICZiYWNrdXBfcywgJmJlc3RfcywgQ0FORElEQVRFX01CX1RZUEVfQkFDS1dBUkRfSSwgcGIsIHBiMiwgdGV4X3BiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRtaW4sICZuZXh0X2Jsb2NrLCAwLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobWJfdHlwZSZDQU5ESURBVEVfTUJfVFlQRV9CSURJUl9JKXsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQgfCBNVl9ESVJfQkFDS1dBUkQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFX0ZJRUxEOworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGRpcj0wOyBkaXI8MjsgZGlyKyspeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGo9IHMtPmZpZWxkX3NlbGVjdFtkaXJdW2ldID0gcy0+Yl9maWVsZF9zZWxlY3RfdGFibGVbZGlyXVtpXVt4eV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVtpXVswXSA9IHMtPmJfZmllbGRfbXZfdGFibGVbZGlyXVtpXVtqXVt4eV1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVtpXVsxXSA9IHMtPmJfZmllbGRfbXZfdGFibGVbZGlyXVtpXVtqXVt4eV1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21iX2hxKHMsICZiYWNrdXBfcywgJmJlc3RfcywgQ0FORElEQVRFX01CX1RZUEVfQklESVJfSSwgcGIsIHBiMiwgdGV4X3BiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRtaW4sICZuZXh0X2Jsb2NrLCAwLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobWJfdHlwZSZDQU5ESURBVEVfTUJfVFlQRV9JTlRSQSl7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSAwOworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZV9tYl9ocShzLCAmYmFja3VwX3MsICZiZXN0X3MsIENBTkRJREFURV9NQl9UWVBFX0lOVFJBLCBwYiwgcGIyLCB0ZXhfcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG1pbiwgJm5leHRfYmxvY2ssIDAsIDApOworICAgICAgICAgICAgICAgICAgICBpZihzLT5oMjYzX3ByZWQgfHwgcy0+aDI2M19haWMpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoYmVzdF9zLm1iX2ludHJhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iaW50cmFfdGFibGVbbWJfeCArIG1iX3kqcy0+bWJfc3RyaWRlXT0xOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NsZWFuX2ludHJhX3RhYmxlX2VudHJpZXMocyk7IC8vb2xkIG1vZGU/CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX1FQX1JEKSAmJiBkbWluIDwgSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICBpZihiZXN0X3MubXZfdHlwZT09TVZfVFlQRV8xNlgxNil7IC8vRklYTUUgbW92ZSA0bXYgYWZ0ZXIgUVBSRAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxhc3RfcXA9IGJhY2t1cF9zLnFzY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBxcGksIHFwLCBkY1s2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgYWNbNl1bMTZdOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG12ZGlyPSAoYmVzdF9zLm12X2RpciZNVl9ESVJfQkFDS1dBUkQpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGRxdWFudF90YWJbNF09ey0xLDEsLTIsMn07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcmVjb2VmcyA9IHMtPm1iX2ludHJhICYmIHMtPmRjX3ZhbFswXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihiYWNrdXBfcy5kcXVhbnQgPT0gMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vRklYTUUgaW50cmEKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12X2Rpcj0gYmVzdF9zLm12X2RpcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfaW50cmE9IGJlc3Rfcy5tYl9pbnRyYTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzBdID0gYmVzdF9zLm12WzBdWzBdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSBiZXN0X3MubXZbMF1bMF1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVswXSA9IGJlc3Rfcy5tdlsxXVswXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzFdWzBdWzFdID0gYmVzdF9zLm12WzFdWzBdWzFdOworCisgICAgICAgICAgICAgICAgICAgICAgICBxcGkgPSBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgPyAyIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcig7IHFwaTw0OyBxcGkrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRxdWFudD0gZHF1YW50X3RhYltxcGldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFwPSBsYXN0X3FwICsgZHF1YW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHFwIDwgcy0+YXZjdHgtPnFtaW4gfHwgcXAgPiBzLT5hdmN0eC0+cW1heCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwX3MuZHF1YW50PSBkcXVhbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RvcmVjb2Vmcyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8NjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjW2ldPSBzLT5kY192YWxbMF1bIHMtPmJsb2NrX2luZGV4W2ldIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYWNbaV0sIHMtPmFjX3ZhbFswXVtzLT5ibG9ja19pbmRleFtpXV0sIHNpemVvZihpbnQxNl90KSoxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfbWJfaHEocywgJmJhY2t1cF9zLCAmYmVzdF9zLCBDQU5ESURBVEVfTUJfVFlQRV9JTlRFUiAvKiB3cm9uZyBidXQgdW51c2VkICovLCBwYiwgcGIyLCB0ZXhfcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbWluLCAmbmV4dF9ibG9jaywgcy0+bXZbbXZkaXJdWzBdWzBdLCBzLT5tdlttdmRpcl1bMF1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJlc3Rfcy5xc2NhbGUgIT0gcXApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdG9yZWNvZWZzKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8NjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kY192YWxbMF1bIHMtPmJsb2NrX2luZGV4W2ldIF09IGRjW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5hY192YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dLCBhY1tpXSwgc2l6ZW9mKGludDE2X3QpKjE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihDT05GSUdfTVBFRzRfRU5DT0RFUiAmJiBtYl90eXBlJkNBTkRJREFURV9NQl9UWVBFX0RJUkVDVCl7CisgICAgICAgICAgICAgICAgICAgIGludCBteD0gcy0+Yl9kaXJlY3RfbXZfdGFibGVbeHldWzBdOworICAgICAgICAgICAgICAgICAgICBpbnQgbXk9IHMtPmJfZGlyZWN0X212X3RhYmxlW3h5XVsxXTsKKworICAgICAgICAgICAgICAgICAgICBiYWNrdXBfcy5kcXVhbnQgPSAwOworICAgICAgICAgICAgICAgICAgICBzLT5tdl9kaXIgPSBNVl9ESVJfRk9SV0FSRCB8IE1WX0RJUl9CQUNLV0FSRCB8IE1WX0RJUkVDVDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWJfaW50cmE9IDA7CisgICAgICAgICAgICAgICAgICAgIGZmX21wZWc0X3NldF9kaXJlY3RfbXYocywgbXgsIG15KTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21iX2hxKHMsICZiYWNrdXBfcywgJmJlc3RfcywgQ0FORElEQVRFX01CX1RZUEVfRElSRUNULCBwYiwgcGIyLCB0ZXhfcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG1pbiwgJm5leHRfYmxvY2ssIG14LCBteSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKENPTkZJR19NUEVHNF9FTkNPREVSICYmIG1iX3R5cGUmQ0FORElEQVRFX01CX1RZUEVfRElSRUNUMCl7CisgICAgICAgICAgICAgICAgICAgIGJhY2t1cF9zLmRxdWFudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEIHwgTVZfRElSX0JBQ0tXQVJEIHwgTVZfRElSRUNUOworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzRfc2V0X2RpcmVjdF9tdihzLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21iX2hxKHMsICZiYWNrdXBfcywgJmJlc3RfcywgQ0FORElEQVRFX01CX1RZUEVfRElSRUNULCBwYiwgcGIyLCB0ZXhfcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG1pbiwgJm5leHRfYmxvY2ssIDAsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWJlc3Rfcy5tYl9pbnRyYSAmJiBzLT5tcHZfZmxhZ3MgJiBGRl9NUFZfRkxBR19TS0lQX1JEKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlZD0wOworICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDY7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVkIHw9IHMtPmJsb2NrX2xhc3RfaW5kZXhbaV07CisgICAgICAgICAgICAgICAgICAgIGlmKGNvZGVkKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBteCxteTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5tdiwgYmVzdF9zLm12LCBzaXplb2Yocy0+bXYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKENPTkZJR19NUEVHNF9FTkNPREVSICYmIGJlc3Rfcy5tdl9kaXIgJiBNVl9ESVJFQ1QpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14PW15PTA7IC8vRklYTUUgZmluZCB0aGUgb25lIHdlIGFjdHVhbGx5IHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9tcGVnNF9zZXRfZGlyZWN0X212KHMsIG14LCBteSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihiZXN0X3MubXZfZGlyJk1WX0RJUl9CQUNLV0FSRCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXg9IHMtPm12WzFdWzBdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15PSBzLT5tdlsxXVswXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14PSBzLT5tdlswXVswXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteT0gcy0+bXZbMF1bMF1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12X2Rpcj0gYmVzdF9zLm12X2RpcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBiZXN0X3MubXZfdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX2ludHJhPSAwOworLyogICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9IGJlc3Rfcy5tdlswXVswXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdID0gYmVzdF9zLm12WzBdWzBdWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMV1bMF1bMF0gPSBiZXN0X3MubXZbMV1bMF1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVsxXSA9IGJlc3Rfcy5tdlsxXVswXVsxXTsqLworICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwX3MuZHF1YW50PSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2tpcGRjdD0xOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21iX2hxKHMsICZiYWNrdXBfcywgJmJlc3RfcywgQ0FORElEQVRFX01CX1RZUEVfSU5URVIgLyogd3JvbmcgYnV0IHVudXNlZCAqLywgcGIsIHBiMiwgdGV4X3BiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbWluLCAmbmV4dF9ibG9jaywgbXgsIG15KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNraXBkY3Q9MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbeHldID0gYmVzdF9zLnFzY2FsZTsKKworICAgICAgICAgICAgICAgIGNvcHlfY29udGV4dF9hZnRlcl9lbmNvZGUocywgJmJlc3RfcywgLTEpOworCisgICAgICAgICAgICAgICAgcGJfYml0c19jb3VudD0gcHV0X2JpdHNfY291bnQoJnMtPnBiKTsKKyAgICAgICAgICAgICAgICBmbHVzaF9wdXRfYml0cygmcy0+cGIpOworICAgICAgICAgICAgICAgIGF2cHJpdl9jb3B5X2JpdHMoJmJhY2t1cF9zLnBiLCBiaXRfYnVmW25leHRfYmxvY2teMV0sIHBiX2JpdHNfY291bnQpOworICAgICAgICAgICAgICAgIHMtPnBiPSBiYWNrdXBfcy5wYjsKKworICAgICAgICAgICAgICAgIGlmKHMtPmRhdGFfcGFydGl0aW9uaW5nKXsKKyAgICAgICAgICAgICAgICAgICAgcGIyX2JpdHNfY291bnQ9IHB1dF9iaXRzX2NvdW50KCZzLT5wYjIpOworICAgICAgICAgICAgICAgICAgICBmbHVzaF9wdXRfYml0cygmcy0+cGIyKTsKKyAgICAgICAgICAgICAgICAgICAgYXZwcml2X2NvcHlfYml0cygmYmFja3VwX3MucGIyLCBiaXRfYnVmMltuZXh0X2Jsb2NrXjFdLCBwYjJfYml0c19jb3VudCk7CisgICAgICAgICAgICAgICAgICAgIHMtPnBiMj0gYmFja3VwX3MucGIyOworCisgICAgICAgICAgICAgICAgICAgIHRleF9wYl9iaXRzX2NvdW50PSBwdXRfYml0c19jb3VudCgmcy0+dGV4X3BiKTsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hfcHV0X2JpdHMoJnMtPnRleF9wYik7CisgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9jb3B5X2JpdHMoJmJhY2t1cF9zLnRleF9wYiwgYml0X2J1Zl90ZXhbbmV4dF9ibG9ja14xXSwgdGV4X3BiX2JpdHNfY291bnQpOworICAgICAgICAgICAgICAgICAgICBzLT50ZXhfcGI9IGJhY2t1cF9zLnRleF9wYjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+bGFzdF9iaXRzPSBwdXRfYml0c19jb3VudCgmcy0+cGIpOworCisgICAgICAgICAgICAgICAgaWYgKENPTkZJR19IMjYzX0VOQ09ERVIgJiYKKyAgICAgICAgICAgICAgICAgICAgcy0+b3V0X2Zvcm1hdCA9PSBGTVRfSDI2MyAmJiBzLT5waWN0X3R5cGUhPUFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgICAgICAgICBmZl9oMjYzX3VwZGF0ZV9tb3Rpb25fdmFsKHMpOworCisgICAgICAgICAgICAgICAgaWYobmV4dF9ibG9jaz09MCl7IC8vRklYTUUgMTYgdnMgbGluZXNpemUxNgorICAgICAgICAgICAgICAgICAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiWzBdWzBdKHMtPmRlc3RbMF0sIHMtPnJkX3NjcmF0Y2hwYWQgICAgICAgICAgICAgICAgICAgICAsIHMtPmxpbmVzaXplICAsMTYpOworICAgICAgICAgICAgICAgICAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiWzFdWzBdKHMtPmRlc3RbMV0sIHMtPnJkX3NjcmF0Y2hwYWQgKyAxNipzLT5saW5lc2l6ZSAgICAsIHMtPnV2bGluZXNpemUsIDgpOworICAgICAgICAgICAgICAgICAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiWzFdWzBdKHMtPmRlc3RbMl0sIHMtPnJkX3NjcmF0Y2hwYWQgKyAxNipzLT5saW5lc2l6ZSArIDgsIHMtPnV2bGluZXNpemUsIDgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKHMtPmF2Y3R4LT5tYl9kZWNpc2lvbiA9PSBGRl9NQl9ERUNJU0lPTl9CSVRTKQorICAgICAgICAgICAgICAgICAgICBmZl9tcHZfZGVjb2RlX21iKHMsIHMtPmJsb2NrKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94ID0gMCwgbW90aW9uX3kgPSAwOworICAgICAgICAgICAgICAgIHMtPm12X3R5cGU9TVZfVFlQRV8xNlgxNjsKKyAgICAgICAgICAgICAgICAvLyBvbmx5IG9uZSBNQi1UeXBlIHBvc3NpYmxlCisKKyAgICAgICAgICAgICAgICBzd2l0Y2gobWJfdHlwZSl7CisgICAgICAgICAgICAgICAgY2FzZSBDQU5ESURBVEVfTUJfVFlQRV9JTlRSQToKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWJfaW50cmE9IDE7CisgICAgICAgICAgICAgICAgICAgIG1vdGlvbl94PSBzLT5tdlswXVswXVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95PSBzLT5tdlswXVswXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0FORElEQVRFX01CX1RZUEVfSU5URVI6CisgICAgICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3g9IHMtPm12WzBdWzBdWzBdID0gcy0+cF9tdl90YWJsZVt4eV1bMF07CisgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95PSBzLT5tdlswXVswXVsxXSA9IHMtPnBfbXZfdGFibGVbeHldWzFdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENBTkRJREFURV9NQl9UWVBFX0lOVEVSX0k6CisgICAgICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICAgICAgICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV9GSUVMRDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWJfaW50cmE9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8MjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGo9IHMtPmZpZWxkX3NlbGVjdFswXVtpXSA9IHMtPnBfZmllbGRfc2VsZWN0X3RhYmxlW2ldW3h5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzBdID0gcy0+cF9maWVsZF9tdl90YWJsZVtpXVtqXVt4eV1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVtpXVsxXSA9IHMtPnBfZmllbGRfbXZfdGFibGVbaV1bal1beHldWzFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0FORElEQVRFX01CX1RZUEVfSU5URVI0VjoKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzhYODsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWJfaW50cmE9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1baV1bMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVtzLT5ibG9ja19pbmRleFtpXV1bMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDQU5ESURBVEVfTUJfVFlQRV9ESVJFQ1Q6CisgICAgICAgICAgICAgICAgICAgIGlmIChDT05GSUdfTVBFRzRfRU5DT0RFUikgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkR8TVZfRElSX0JBQ0tXQVJEfE1WX0RJUkVDVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX2ludHJhPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3g9cy0+Yl9kaXJlY3RfbXZfdGFibGVbeHldWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3k9cy0+Yl9kaXJlY3RfbXZfdGFibGVbeHldWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzRfc2V0X2RpcmVjdF9tdihzLCBtb3Rpb25feCwgbW90aW9uX3kpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0FORElEQVRFX01CX1RZUEVfRElSRUNUMDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKENPTkZJR19NUEVHNF9FTkNPREVSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdl9kaXIgPSBNVl9ESVJfRk9SV0FSRHxNVl9ESVJfQkFDS1dBUkR8TVZfRElSRUNUOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfaW50cmE9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmZl9tcGVnNF9zZXRfZGlyZWN0X212KHMsIDAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0FORElEQVRFX01CX1RZUEVfQklESVI6CisgICAgICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEIHwgTVZfRElSX0JBQ0tXQVJEOworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSBzLT5iX2JpZGlyX2ZvcndfbXZfdGFibGVbeHldWzBdOworICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IHMtPmJfYmlkaXJfZm9yd19tdl90YWJsZVt4eV1bMV07CisgICAgICAgICAgICAgICAgICAgIHMtPm12WzFdWzBdWzBdID0gcy0+Yl9iaWRpcl9iYWNrX212X3RhYmxlW3h5XVswXTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZbMV1bMF1bMV0gPSBzLT5iX2JpZGlyX2JhY2tfbXZfdGFibGVbeHldWzFdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENBTkRJREFURV9NQl9UWVBFX0JBQ0tXQVJEOgorICAgICAgICAgICAgICAgICAgICBzLT5tdl9kaXIgPSBNVl9ESVJfQkFDS1dBUkQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm1iX2ludHJhPSAwOworICAgICAgICAgICAgICAgICAgICBtb3Rpb25feD0gcy0+bXZbMV1bMF1bMF0gPSBzLT5iX2JhY2tfbXZfdGFibGVbeHldWzBdOworICAgICAgICAgICAgICAgICAgICBtb3Rpb25feT0gcy0+bXZbMV1bMF1bMV0gPSBzLT5iX2JhY2tfbXZfdGFibGVbeHldWzFdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENBTkRJREFURV9NQl9UWVBFX0ZPUldBUkQ6CisgICAgICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3g9IHMtPm12WzBdWzBdWzBdID0gcy0+Yl9mb3J3X212X3RhYmxlW3h5XVswXTsKKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3k9IHMtPm12WzBdWzBdWzFdID0gcy0+Yl9mb3J3X212X3RhYmxlW3h5XVsxXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDQU5ESURBVEVfTUJfVFlQRV9GT1JXQVJEX0k6CisgICAgICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICAgICAgICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV9GSUVMRDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWJfaW50cmE9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8MjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGo9IHMtPmZpZWxkX3NlbGVjdFswXVtpXSA9IHMtPmJfZmllbGRfc2VsZWN0X3RhYmxlWzBdW2ldW3h5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzBdID0gcy0+Yl9maWVsZF9tdl90YWJsZVswXVtpXVtqXVt4eV1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVtpXVsxXSA9IHMtPmJfZmllbGRfbXZfdGFibGVbMF1baV1bal1beHldWzFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0FORElEQVRFX01CX1RZUEVfQkFDS1dBUkRfSToKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0JBQ0tXQVJEOworICAgICAgICAgICAgICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV9GSUVMRDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWJfaW50cmE9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8MjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGo9IHMtPmZpZWxkX3NlbGVjdFsxXVtpXSA9IHMtPmJfZmllbGRfc2VsZWN0X3RhYmxlWzFdW2ldW3h5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzFdW2ldWzBdID0gcy0+Yl9maWVsZF9tdl90YWJsZVsxXVtpXVtqXVt4eV1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVtpXVsxXSA9IHMtPmJfZmllbGRfbXZfdGFibGVbMV1baV1bal1beHldWzFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0FORElEQVRFX01CX1RZUEVfQklESVJfSToKKyAgICAgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQgfCBNVl9ESVJfQkFDS1dBUkQ7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFX0ZJRUxEOworICAgICAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYT0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGRpcj0wOyBkaXI8MjsgZGlyKyspeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGo9IHMtPmZpZWxkX3NlbGVjdFtkaXJdW2ldID0gcy0+Yl9maWVsZF9zZWxlY3RfdGFibGVbZGlyXVtpXVt4eV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVtpXVswXSA9IHMtPmJfZmllbGRfbXZfdGFibGVbZGlyXVtpXVtqXVt4eV1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVtpXVsxXSA9IHMtPmJfZmllbGRfbXZfdGFibGVbZGlyXVtpXVtqXVt4eV1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIE1CIHR5cGVcbiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVuY29kZV9tYihzLCBtb3Rpb25feCwgbW90aW9uX3kpOworCisgICAgICAgICAgICAgICAgLy8gUkFMOiBVcGRhdGUgbGFzdCBtYWNyb2Jsb2NrIHR5cGUKKyAgICAgICAgICAgICAgICBzLT5sYXN0X212X2RpciA9IHMtPm12X2RpcjsKKworICAgICAgICAgICAgICAgIGlmIChDT05GSUdfSDI2M19FTkNPREVSICYmCisgICAgICAgICAgICAgICAgICAgIHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjMgJiYgcy0+cGljdF90eXBlIT1BVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgICAgICAgICAgICAgZmZfaDI2M191cGRhdGVfbW90aW9uX3ZhbChzKTsKKworICAgICAgICAgICAgICAgIGZmX21wdl9kZWNvZGVfbWIocywgcy0+YmxvY2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjbGVhbiB0aGUgTVYgdGFibGUgaW4gSVBTIGZyYW1lcyBmb3IgZGlyZWN0IG1vZGUgaW4gQiBmcmFtZXMgKi8KKyAgICAgICAgICAgIGlmKHMtPm1iX2ludHJhIC8qICYmIEksUCxTX1RZUEUgKi8peworICAgICAgICAgICAgICAgIHMtPnBfbXZfdGFibGVbeHldWzBdPTA7CisgICAgICAgICAgICAgICAgcy0+cF9tdl90YWJsZVt4eV1bMV09MDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYocy0+ZmxhZ3MmQ09ERUNfRkxBR19QU05SKXsKKyAgICAgICAgICAgICAgICBpbnQgdz0gMTY7CisgICAgICAgICAgICAgICAgaW50IGg9IDE2OworCisgICAgICAgICAgICAgICAgaWYocy0+bWJfeCoxNiArIDE2ID4gcy0+d2lkdGggKSB3PSBzLT53aWR0aCAtIHMtPm1iX3gqMTY7CisgICAgICAgICAgICAgICAgaWYocy0+bWJfeSoxNiArIDE2ID4gcy0+aGVpZ2h0KSBoPSBzLT5oZWlnaHQtIHMtPm1iX3kqMTY7CisKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZXJyb3JbMF0gKz0gc3NlKAorICAgICAgICAgICAgICAgICAgICBzLCBzLT5uZXdfcGljdHVyZS5mLT5kYXRhWzBdICsgcy0+bWJfeCoxNiArIHMtPm1iX3kqcy0+bGluZXNpemUqMTYsCisgICAgICAgICAgICAgICAgICAgIHMtPmRlc3RbMF0sIHcsIGgsIHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZXJyb3JbMV0gKz0gc3NlKAorICAgICAgICAgICAgICAgICAgICBzLCBzLT5uZXdfcGljdHVyZS5mLT5kYXRhWzFdICsgcy0+bWJfeCo4ICArIHMtPm1iX3kqcy0+dXZsaW5lc2l6ZSpjaHJfaCwKKyAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdFsxXSwgdz4+MSwgaD4+cy0+Y2hyb21hX3lfc2hpZnQsIHMtPnV2bGluZXNpemUpOworICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5lcnJvclsyXSArPSBzc2UoCisgICAgICAgICAgICAgICAgICAgIHMsIHMtPm5ld19waWN0dXJlLmYtPmRhdGFbMl0gKyBzLT5tYl94KjggICsgcy0+bWJfeSpzLT51dmxpbmVzaXplKmNocl9oLAorICAgICAgICAgICAgICAgICAgICBzLT5kZXN0WzJdLCB3Pj4xLCBoPj5zLT5jaHJvbWFfeV9zaGlmdCwgcy0+dXZsaW5lc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihzLT5sb29wX2ZpbHRlcil7CisgICAgICAgICAgICAgICAgaWYoQ09ORklHX0gyNjNfRU5DT0RFUiAmJiBzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzKQorICAgICAgICAgICAgICAgICAgICBmZl9oMjYzX2xvb3BfZmlsdGVyKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgIk1CICVkICVkIGJpdHNcbiIsCisgICAgICAgICAgICAgICAgICAgIHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlLCBwdXRfYml0c19jb3VudCgmcy0+cGIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vbm90IGJlYXV0aWZ1bCBoZXJlIGJ1dCB3ZSBtdXN0IHdyaXRlIGl0IGJlZm9yZSBmbHVzaGluZyBzbyBpdCBoYXMgdG8gYmUgaGVyZQorICAgIGlmIChDT05GSUdfTVNNUEVHNF9FTkNPREVSICYmIHMtPm1zbXBlZzRfdmVyc2lvbiAmJiBzLT5tc21wZWc0X3ZlcnNpb248NCAmJiBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgIGZmX21zbXBlZzRfZW5jb2RlX2V4dF9oZWFkZXIocyk7CisKKyAgICB3cml0ZV9zbGljZV9lbmQocyk7CisKKyAgICAvKiBTZW5kIHRoZSBsYXN0IEdPQiBpZiBSVFAgKi8KKyAgICBpZiAocy0+YXZjdHgtPnJ0cF9jYWxsYmFjaykgeworICAgICAgICBpbnQgbnVtYmVyX21iID0gKG1iX3kgLSBzLT5yZXN5bmNfbWJfeSkqcy0+bWJfd2lkdGggLSBzLT5yZXN5bmNfbWJfeDsKKyAgICAgICAgcGRpZiA9IHB1dF9iaXRzX3B0cigmcy0+cGIpIC0gcy0+cHRyX2xhc3Rnb2I7CisgICAgICAgIC8qIENhbGwgdGhlIFJUUCBjYWxsYmFjayB0byBzZW5kIHRoZSBsYXN0IEdPQiAqLworICAgICAgICBlbW1zX2MoKTsKKyAgICAgICAgcy0+YXZjdHgtPnJ0cF9jYWxsYmFjayhzLT5hdmN0eCwgcy0+cHRyX2xhc3Rnb2IsIHBkaWYsIG51bWJlcl9tYik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUVSR0UoZmllbGQpIGRzdC0+ZmllbGQgKz0gc3JjLT5maWVsZDsgc3JjLT5maWVsZD0wCitzdGF0aWMgdm9pZCBtZXJnZV9jb250ZXh0X2FmdGVyX21lKE1wZWdFbmNDb250ZXh0ICpkc3QsIE1wZWdFbmNDb250ZXh0ICpzcmMpeworICAgIE1FUkdFKG1lLnNjZW5lX2NoYW5nZV9zY29yZSk7CisgICAgTUVSR0UobWUubWNfbWJfdmFyX3N1bV90ZW1wKTsKKyAgICBNRVJHRShtZS5tYl92YXJfc3VtX3RlbXApOworfQorCitzdGF0aWMgdm9pZCBtZXJnZV9jb250ZXh0X2FmdGVyX2VuY29kZShNcGVnRW5jQ29udGV4dCAqZHN0LCBNcGVnRW5jQ29udGV4dCAqc3JjKXsKKyAgICBpbnQgaTsKKworICAgIE1FUkdFKGRjdF9jb3VudFswXSk7IC8vbm90ZSwgdGhlIG90aGVyIGRjdCB2YXJzIGFyZSBub3QgcGFydCBvZiB0aGUgY29udGV4dAorICAgIE1FUkdFKGRjdF9jb3VudFsxXSk7CisgICAgTUVSR0UobXZfYml0cyk7CisgICAgTUVSR0UoaV90ZXhfYml0cyk7CisgICAgTUVSR0UocF90ZXhfYml0cyk7CisgICAgTUVSR0UoaV9jb3VudCk7CisgICAgTUVSR0UoZl9jb3VudCk7CisgICAgTUVSR0UoYl9jb3VudCk7CisgICAgTUVSR0Uoc2tpcF9jb3VudCk7CisgICAgTUVSR0UobWlzY19iaXRzKTsKKyAgICBNRVJHRShlci5lcnJvcl9jb3VudCk7CisgICAgTUVSR0UocGFkZGluZ19idWdfc2NvcmUpOworICAgIE1FUkdFKGN1cnJlbnRfcGljdHVyZS5lcnJvclswXSk7CisgICAgTUVSR0UoY3VycmVudF9waWN0dXJlLmVycm9yWzFdKTsKKyAgICBNRVJHRShjdXJyZW50X3BpY3R1cmUuZXJyb3JbMl0pOworCisgICAgaWYoZHN0LT5hdmN0eC0+bm9pc2VfcmVkdWN0aW9uKXsKKyAgICAgICAgZm9yKGk9MDsgaTw2NDsgaSsrKXsKKyAgICAgICAgICAgIE1FUkdFKGRjdF9lcnJvcl9zdW1bMF1baV0pOworICAgICAgICAgICAgTUVSR0UoZGN0X2Vycm9yX3N1bVsxXVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQocHV0X2JpdHNfY291bnQoJnNyYy0+cGIpICUgOCA9PTApOworICAgIGFzc2VydChwdXRfYml0c19jb3VudCgmZHN0LT5wYikgJSA4ID09MCk7CisgICAgYXZwcml2X2NvcHlfYml0cygmZHN0LT5wYiwgc3JjLT5wYi5idWYsIHB1dF9iaXRzX2NvdW50KCZzcmMtPnBiKSk7CisgICAgZmx1c2hfcHV0X2JpdHMoJmRzdC0+cGIpOworfQorCitzdGF0aWMgaW50IGVzdGltYXRlX3FwKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgZHJ5X3J1bil7CisgICAgaWYgKHMtPm5leHRfbGFtYmRhKXsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+cXVhbGl0eSA9CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5xdWFsaXR5ID0gcy0+bmV4dF9sYW1iZGE7CisgICAgICAgIGlmKCFkcnlfcnVuKSBzLT5uZXh0X2xhbWJkYT0gMDsKKyAgICB9IGVsc2UgaWYgKCFzLT5maXhlZF9xc2NhbGUpIHsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+cXVhbGl0eSA9CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5xdWFsaXR5ID0gZmZfcmF0ZV9lc3RpbWF0ZV9xc2NhbGUocywgZHJ5X3J1bik7CisgICAgICAgIGlmIChzLT5jdXJyZW50X3BpY3R1cmUuZi0+cXVhbGl0eSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYocy0+YWRhcHRpdmVfcXVhbnQpeworICAgICAgICBzd2l0Y2gocy0+Y29kZWNfaWQpeworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OgorICAgICAgICAgICAgaWYgKENPTkZJR19NUEVHNF9FTkNPREVSKQorICAgICAgICAgICAgICAgIGZmX2NsZWFuX21wZWc0X3FzY2FsZXMocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjNQOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0ZMVjE6CisgICAgICAgICAgICBpZiAoQ09ORklHX0gyNjNfRU5DT0RFUikKKyAgICAgICAgICAgICAgICBmZl9jbGVhbl9oMjYzX3FzY2FsZXMocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZmX2luaXRfcXNjYWxlX3RhYihzKTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmxhbWJkYT0gcy0+bGFtYmRhX3RhYmxlWzBdOworICAgICAgICAvL0ZJWE1FIGJyb2tlbgorICAgIH1lbHNlCisgICAgICAgIHMtPmxhbWJkYSA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5xdWFsaXR5OworICAgIHVwZGF0ZV9xc2NhbGUocyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB3cml0aW5nIHRoZSBoZWFkZXIgKi8KK3N0YXRpYyB2b2lkIHNldF9mcmFtZV9kaXN0YW5jZXMoTXBlZ0VuY0NvbnRleHQgKiBzKXsKKyAgICBhdl9hc3NlcnQxKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSk7CisgICAgcy0+dGltZSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnB0cyAqIHMtPmF2Y3R4LT50aW1lX2Jhc2UubnVtOworCisgICAgaWYocy0+cGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfQil7CisgICAgICAgIHMtPnBiX3RpbWU9IHMtPnBwX3RpbWUgLSAocy0+bGFzdF9ub25fYl90aW1lIC0gcy0+dGltZSk7CisgICAgICAgIGFzc2VydChzLT5wYl90aW1lID4gMCAmJiBzLT5wYl90aW1lIDwgcy0+cHBfdGltZSk7CisgICAgfWVsc2V7CisgICAgICAgIHMtPnBwX3RpbWU9IHMtPnRpbWUgLSBzLT5sYXN0X25vbl9iX3RpbWU7CisgICAgICAgIHMtPmxhc3Rfbm9uX2JfdGltZT0gcy0+dGltZTsKKyAgICAgICAgYXNzZXJ0KHMtPnBpY3R1cmVfbnVtYmVyPT0wIHx8IHMtPnBwX3RpbWUgPiAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3BpY3R1cmUoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBwaWN0dXJlX251bWJlcikKK3sKKyAgICBpbnQgaSwgcmV0OworICAgIGludCBiaXRzOworICAgIGludCBjb250ZXh0X2NvdW50ID0gcy0+c2xpY2VfY29udGV4dF9jb3VudDsKKworICAgIHMtPnBpY3R1cmVfbnVtYmVyID0gcGljdHVyZV9udW1iZXI7CisKKyAgICAvKiBSZXNldCB0aGUgYXZlcmFnZSBNQiB2YXJpYW5jZSAqLworICAgIHMtPm1lLm1iX3Zhcl9zdW1fdGVtcCAgICA9CisgICAgcy0+bWUubWNfbWJfdmFyX3N1bV90ZW1wID0gMDsKKworICAgIC8qIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBzb21lIHRpbWUgdmFycyBiZWZvcmUgd2UgY2FuIGVuY29kZSBiLWZyYW1lcyAqLworICAgIC8vIFJBTDogQ29uZGl0aW9uIGFkZGVkIGZvciBNUEVHMVZJREVPCisgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8gfHwgcy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTyB8fCAocy0+aDI2M19wcmVkICYmICFzLT5tc21wZWc0X3ZlcnNpb24pKQorICAgICAgICBzZXRfZnJhbWVfZGlzdGFuY2VzKHMpOworICAgIGlmKENPTkZJR19NUEVHNF9FTkNPREVSICYmIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KQorICAgICAgICBmZl9zZXRfbXBlZzRfdGltZShzKTsKKworICAgIHMtPm1lLnNjZW5lX2NoYW5nZV9zY29yZT0wOworCisvLyAgICBzLT5sYW1iZGE9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPnF1YWxpdHk7IC8vRklYTUUgcXNjYWxlIC8gLi4uIHN0dWZmIGZvciBNRSByYXRlIGRpc3RvcnRpb24KKworICAgIGlmKHMtPnBpY3RfdHlwZT09QVZfUElDVFVSRV9UWVBFX0kpeworICAgICAgICBpZihzLT5tc21wZWc0X3ZlcnNpb24gPj0gMykgcy0+bm9fcm91bmRpbmc9MTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5vX3JvdW5kaW5nPTA7CisgICAgfWVsc2UgaWYocy0+cGljdF90eXBlIT1BVl9QSUNUVVJFX1RZUEVfQil7CisgICAgICAgIGlmKHMtPmZsaXBmbG9wX3JvdW5kaW5nIHx8IHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjNQIHx8IHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KQorICAgICAgICAgICAgcy0+bm9fcm91bmRpbmcgXj0gMTsKKyAgICB9CisKKyAgICBpZihzLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzIpeworICAgICAgICBpZiAoZXN0aW1hdGVfcXAocywxKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGZmX2dldF8ycGFzc19mY29kZShzKTsKKyAgICB9ZWxzZSBpZighKHMtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpKXsKKyAgICAgICAgaWYocy0+cGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgICAgIHMtPmxhbWJkYT0gcy0+bGFzdF9sYW1iZGFfZm9yW3MtPnBpY3RfdHlwZV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmxhbWJkYT0gcy0+bGFzdF9sYW1iZGFfZm9yW3MtPmxhc3Rfbm9uX2JfcGljdF90eXBlXTsKKyAgICAgICAgdXBkYXRlX3FzY2FsZShzKTsKKyAgICB9CisKKyAgICBpZihzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9BTVYgJiYgcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTUpQRUcpeworICAgICAgICBpZihzLT5xX2Nocm9tYV9pbnRyYV9tYXRyaXggICAhPSBzLT5xX2ludHJhX21hdHJpeCAgKSBhdl9mcmVlcCgmcy0+cV9jaHJvbWFfaW50cmFfbWF0cml4KTsKKyAgICAgICAgaWYocy0+cV9jaHJvbWFfaW50cmFfbWF0cml4MTYgIT0gcy0+cV9pbnRyYV9tYXRyaXgxNikgYXZfZnJlZXAoJnMtPnFfY2hyb21hX2ludHJhX21hdHJpeDE2KTsKKyAgICAgICAgcy0+cV9jaHJvbWFfaW50cmFfbWF0cml4ICAgPSBzLT5xX2ludHJhX21hdHJpeDsKKyAgICAgICAgcy0+cV9jaHJvbWFfaW50cmFfbWF0cml4MTYgPSBzLT5xX2ludHJhX21hdHJpeDE2OworICAgIH0KKworICAgIHMtPm1iX2ludHJhPTA7IC8vZm9yIHRoZSByYXRlIGRpc3RvcnRpb24gJiBiaXQgY29tcGFyZSBmdW5jdGlvbnMKKyAgICBmb3IoaT0xOyBpPGNvbnRleHRfY291bnQ7IGkrKyl7CisgICAgICAgIHJldCA9IGZmX3VwZGF0ZV9kdXBsaWNhdGVfY29udGV4dChzLT50aHJlYWRfY29udGV4dFtpXSwgcyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZihmZl9pbml0X21lKHMpPDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIEVzdGltYXRlIG1vdGlvbiBmb3IgZXZlcnkgTUIgKi8KKyAgICBpZihzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpeworICAgICAgICBzLT5sYW1iZGEgPSAocy0+bGFtYmRhICogcy0+YXZjdHgtPm1lX3BlbmFsdHlfY29tcGVuc2F0aW9uICsgMTI4KT4+ODsKKyAgICAgICAgcy0+bGFtYmRhMj0gKHMtPmxhbWJkYTIqIChpbnQ2NF90KXMtPmF2Y3R4LT5tZV9wZW5hbHR5X2NvbXBlbnNhdGlvbiArIDEyOCk+Pjg7CisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgIGlmKChzLT5hdmN0eC0+cHJlX21lICYmIHMtPmxhc3Rfbm9uX2JfcGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfSSkgfHwgcy0+YXZjdHgtPnByZV9tZT09Mil7CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmV4ZWN1dGUocy0+YXZjdHgsIHByZV9lc3RpbWF0ZV9tb3Rpb25fdGhyZWFkLCAmcy0+dGhyZWFkX2NvbnRleHRbMF0sIE5VTEwsIGNvbnRleHRfY291bnQsIHNpemVvZih2b2lkKikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcy0+YXZjdHgtPmV4ZWN1dGUocy0+YXZjdHgsIGVzdGltYXRlX21vdGlvbl90aHJlYWQsICZzLT50aHJlYWRfY29udGV4dFswXSwgTlVMTCwgY29udGV4dF9jb3VudCwgc2l6ZW9mKHZvaWQqKSk7CisgICAgfWVsc2UgLyogaWYocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSAqL3sKKyAgICAgICAgLyogSS1GcmFtZSAqLworICAgICAgICBmb3IoaT0wOyBpPHMtPm1iX3N0cmlkZSpzLT5tYl9oZWlnaHQ7IGkrKykKKyAgICAgICAgICAgIHMtPm1iX3R5cGVbaV09IENBTkRJREFURV9NQl9UWVBFX0lOVFJBOworCisgICAgICAgIGlmKCFzLT5maXhlZF9xc2NhbGUpeworICAgICAgICAgICAgLyogZmluZGluZyBzcGF0aWFsIGNvbXBsZXhpdHkgZm9yIEktZnJhbWUgcmF0ZSBjb250cm9sICovCisgICAgICAgICAgICBzLT5hdmN0eC0+ZXhlY3V0ZShzLT5hdmN0eCwgbWJfdmFyX3RocmVhZCwgJnMtPnRocmVhZF9jb250ZXh0WzBdLCBOVUxMLCBjb250ZXh0X2NvdW50LCBzaXplb2Yodm9pZCopKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IoaT0xOyBpPGNvbnRleHRfY291bnQ7IGkrKyl7CisgICAgICAgIG1lcmdlX2NvbnRleHRfYWZ0ZXJfbWUocywgcy0+dGhyZWFkX2NvbnRleHRbaV0pOworICAgIH0KKyAgICBzLT5jdXJyZW50X3BpY3R1cmUubWNfbWJfdmFyX3N1bT0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bWNfbWJfdmFyX3N1bT0gcy0+bWUubWNfbWJfdmFyX3N1bV90ZW1wOworICAgIHMtPmN1cnJlbnRfcGljdHVyZS4gICBtYl92YXJfc3VtPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT4gICBtYl92YXJfc3VtPSBzLT5tZS4gICBtYl92YXJfc3VtX3RlbXA7CisgICAgZW1tc19jKCk7CisKKyAgICBpZihzLT5tZS5zY2VuZV9jaGFuZ2Vfc2NvcmUgPiBzLT5hdmN0eC0+c2NlbmVjaGFuZ2VfdGhyZXNob2xkICYmIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCl7CisgICAgICAgIHMtPnBpY3RfdHlwZT0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIGZvcihpPTA7IGk8cy0+bWJfc3RyaWRlKnMtPm1iX2hlaWdodDsgaSsrKQorICAgICAgICAgICAgcy0+bWJfdHlwZVtpXT0gQ0FORElEQVRFX01CX1RZUEVfSU5UUkE7CisgICAgICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbiA+PSAzKQorICAgICAgICAgICAgcy0+bm9fcm91bmRpbmc9MTsKKyAgICAgICAgYXZfZGxvZyhzLCAiU2NlbmUgY2hhbmdlIGRldGVjdGVkLCBlbmNvZGluZyBhcyBJIEZyYW1lICUiUFJJZDY0IiAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3Zhcl9zdW0sIHMtPmN1cnJlbnRfcGljdHVyZS5tY19tYl92YXJfc3VtKTsKKyAgICB9CisKKyAgICBpZighcy0+dW12cGx1cyl7CisgICAgICAgIGlmKHMtPnBpY3RfdHlwZT09QVZfUElDVFVSRV9UWVBFX1AgfHwgcy0+cGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfUykgeworICAgICAgICAgICAgcy0+Zl9jb2RlPSBmZl9nZXRfYmVzdF9mY29kZShzLCBzLT5wX212X3RhYmxlLCBDQU5ESURBVEVfTUJfVFlQRV9JTlRFUik7CisKKyAgICAgICAgICAgIGlmKHMtPmZsYWdzICYgQ09ERUNfRkxBR19JTlRFUkxBQ0VEX01FKXsKKyAgICAgICAgICAgICAgICBpbnQgYSxiOworICAgICAgICAgICAgICAgIGE9IGZmX2dldF9iZXN0X2Zjb2RlKHMsIHMtPnBfZmllbGRfbXZfdGFibGVbMF1bMF0sIENBTkRJREFURV9NQl9UWVBFX0lOVEVSX0kpOyAvL0ZJWE1FIGZpZWxkX3NlbGVjdAorICAgICAgICAgICAgICAgIGI9IGZmX2dldF9iZXN0X2Zjb2RlKHMsIHMtPnBfZmllbGRfbXZfdGFibGVbMV1bMV0sIENBTkRJREFURV9NQl9UWVBFX0lOVEVSX0kpOworICAgICAgICAgICAgICAgIHMtPmZfY29kZT0gRkZNQVgzKHMtPmZfY29kZSwgYSwgYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZmX2ZpeF9sb25nX3BfbXZzKHMpOworICAgICAgICAgICAgZmZfZml4X2xvbmdfbXZzKHMsIE5VTEwsIDAsIHMtPnBfbXZfdGFibGUsIHMtPmZfY29kZSwgQ0FORElEQVRFX01CX1RZUEVfSU5URVIsIDApOworICAgICAgICAgICAgaWYocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0lOVEVSTEFDRURfTUUpeworICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8MjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDsgajwyOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9maXhfbG9uZ19tdnMocywgcy0+cF9maWVsZF9zZWxlY3RfdGFibGVbaV0sIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cF9maWVsZF9tdl90YWJsZVtpXVtqXSwgcy0+Zl9jb2RlLCBDQU5ESURBVEVfTUJfVFlQRV9JTlRFUl9JLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihzLT5waWN0X3R5cGU9PUFWX1BJQ1RVUkVfVFlQRV9CKXsKKyAgICAgICAgICAgIGludCBhLCBiOworCisgICAgICAgICAgICBhID0gZmZfZ2V0X2Jlc3RfZmNvZGUocywgcy0+Yl9mb3J3X212X3RhYmxlLCBDQU5ESURBVEVfTUJfVFlQRV9GT1JXQVJEKTsKKyAgICAgICAgICAgIGIgPSBmZl9nZXRfYmVzdF9mY29kZShzLCBzLT5iX2JpZGlyX2ZvcndfbXZfdGFibGUsIENBTkRJREFURV9NQl9UWVBFX0JJRElSKTsKKyAgICAgICAgICAgIHMtPmZfY29kZSA9IEZGTUFYKGEsIGIpOworCisgICAgICAgICAgICBhID0gZmZfZ2V0X2Jlc3RfZmNvZGUocywgcy0+Yl9iYWNrX212X3RhYmxlLCBDQU5ESURBVEVfTUJfVFlQRV9CQUNLV0FSRCk7CisgICAgICAgICAgICBiID0gZmZfZ2V0X2Jlc3RfZmNvZGUocywgcy0+Yl9iaWRpcl9iYWNrX212X3RhYmxlLCBDQU5ESURBVEVfTUJfVFlQRV9CSURJUik7CisgICAgICAgICAgICBzLT5iX2NvZGUgPSBGRk1BWChhLCBiKTsKKworICAgICAgICAgICAgZmZfZml4X2xvbmdfbXZzKHMsIE5VTEwsIDAsIHMtPmJfZm9yd19tdl90YWJsZSwgcy0+Zl9jb2RlLCBDQU5ESURBVEVfTUJfVFlQRV9GT1JXQVJELCAxKTsKKyAgICAgICAgICAgIGZmX2ZpeF9sb25nX212cyhzLCBOVUxMLCAwLCBzLT5iX2JhY2tfbXZfdGFibGUsIHMtPmJfY29kZSwgQ0FORElEQVRFX01CX1RZUEVfQkFDS1dBUkQsIDEpOworICAgICAgICAgICAgZmZfZml4X2xvbmdfbXZzKHMsIE5VTEwsIDAsIHMtPmJfYmlkaXJfZm9yd19tdl90YWJsZSwgcy0+Zl9jb2RlLCBDQU5ESURBVEVfTUJfVFlQRV9CSURJUiwgMSk7CisgICAgICAgICAgICBmZl9maXhfbG9uZ19tdnMocywgTlVMTCwgMCwgcy0+Yl9iaWRpcl9iYWNrX212X3RhYmxlLCBzLT5iX2NvZGUsIENBTkRJREFURV9NQl9UWVBFX0JJRElSLCAxKTsKKyAgICAgICAgICAgIGlmKHMtPmZsYWdzICYgQ09ERUNfRkxBR19JTlRFUkxBQ0VEX01FKXsKKyAgICAgICAgICAgICAgICBpbnQgZGlyLCBqOworICAgICAgICAgICAgICAgIGZvcihkaXI9MDsgZGlyPDI7IGRpcisrKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDsgajwyOyBqKyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlPSBkaXIgPyAoQ0FORElEQVRFX01CX1RZUEVfQkFDS1dBUkRfSXxDQU5ESURBVEVfTUJfVFlQRV9CSURJUl9JKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoQ0FORElEQVRFX01CX1RZUEVfRk9SV0FSRF9JIHxDQU5ESURBVEVfTUJfVFlQRV9CSURJUl9JKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9maXhfbG9uZ19tdnMocywgcy0+Yl9maWVsZF9zZWxlY3RfdGFibGVbZGlyXVtpXSwgaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Yl9maWVsZF9tdl90YWJsZVtkaXJdW2ldW2pdLCBkaXIgPyBzLT5iX2NvZGUgOiBzLT5mX2NvZGUsIHR5cGUsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVzdGltYXRlX3FwKHMsIDApIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYocy0+cXNjYWxlIDwgMyAmJiBzLT5tYXhfcWNvZWZmPD0xMjggJiYgcy0+cGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfSSAmJiAhKHMtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpKQorICAgICAgICBzLT5xc2NhbGU9IDM7IC8vcmVkdWNlIGNsaXBwaW5nIHByb2JsZW1zCisKKyAgICBpZiAocy0+b3V0X2Zvcm1hdCA9PSBGTVRfTUpQRUcpIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKiAgbHVtYV9tYXRyaXggPSBmZl9tcGVnMV9kZWZhdWx0X2ludHJhX21hdHJpeDsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKmNocm9tYV9tYXRyaXggPSBmZl9tcGVnMV9kZWZhdWx0X2ludHJhX21hdHJpeDsKKworICAgICAgICBpZiAocy0+YXZjdHgtPmludHJhX21hdHJpeCkgeworICAgICAgICAgICAgY2hyb21hX21hdHJpeCA9CisgICAgICAgICAgICBsdW1hX21hdHJpeCA9IHMtPmF2Y3R4LT5pbnRyYV9tYXRyaXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5jaHJvbWFfaW50cmFfbWF0cml4KQorICAgICAgICAgICAgY2hyb21hX21hdHJpeCA9IHMtPmF2Y3R4LT5jaHJvbWFfaW50cmFfbWF0cml4OworCisgICAgICAgIC8qIGZvciBtanBlZywgd2UgZG8gaW5jbHVkZSBxc2NhbGUgaW4gdGhlIG1hdHJpeCAqLworICAgICAgICBmb3IoaT0xO2k8NjQ7aSsrKXsKKyAgICAgICAgICAgIGludCBqID0gcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ldOworCisgICAgICAgICAgICBzLT5jaHJvbWFfaW50cmFfbWF0cml4W2pdID0gYXZfY2xpcF91aW50OCgoY2hyb21hX21hdHJpeFtpXSAqIHMtPnFzY2FsZSkgPj4gMyk7CisgICAgICAgICAgICBzLT4gICAgICAgaW50cmFfbWF0cml4W2pdID0gYXZfY2xpcF91aW50OCgoICBsdW1hX21hdHJpeFtpXSAqIHMtPnFzY2FsZSkgPj4gMyk7CisgICAgICAgIH0KKyAgICAgICAgcy0+eV9kY19zY2FsZV90YWJsZT0KKyAgICAgICAgcy0+Y19kY19zY2FsZV90YWJsZT0gZmZfbXBlZzJfZGNfc2NhbGVfdGFibGVbcy0+aW50cmFfZGNfcHJlY2lzaW9uXTsKKyAgICAgICAgcy0+Y2hyb21hX2ludHJhX21hdHJpeFswXSA9CisgICAgICAgIHMtPmludHJhX21hdHJpeFswXSA9IGZmX21wZWcyX2RjX3NjYWxlX3RhYmxlW3MtPmludHJhX2RjX3ByZWNpc2lvbl1bOF07CisgICAgICAgIGZmX2NvbnZlcnRfbWF0cml4KHMsIHMtPnFfaW50cmFfbWF0cml4LCBzLT5xX2ludHJhX21hdHJpeDE2LAorICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnRyYV9tYXRyaXgsIHMtPmludHJhX3F1YW50X2JpYXMsIDgsIDgsIDEpOworICAgICAgICBmZl9jb252ZXJ0X21hdHJpeChzLCBzLT5xX2Nocm9tYV9pbnRyYV9tYXRyaXgsIHMtPnFfY2hyb21hX2ludHJhX21hdHJpeDE2LAorICAgICAgICAgICAgICAgICAgICAgICBzLT5jaHJvbWFfaW50cmFfbWF0cml4LCBzLT5pbnRyYV9xdWFudF9iaWFzLCA4LCA4LCAxKTsKKyAgICAgICAgcy0+cXNjYWxlPSA4OworICAgIH0KKyAgICBpZihzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTVYpeworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCB5WzMyXT17MTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTN9OworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBjWzMyXT17MTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTR9OworICAgICAgICBmb3IoaT0xO2k8NjQ7aSsrKXsKKyAgICAgICAgICAgIGludCBqPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25bZmZfemlnemFnX2RpcmVjdFtpXV07CisKKyAgICAgICAgICAgIHMtPmludHJhX21hdHJpeFtqXSA9IHNwNXhfcXVhbnRfdGFibGVbNSoyKzBdW2ldOworICAgICAgICAgICAgcy0+Y2hyb21hX2ludHJhX21hdHJpeFtqXSA9IHNwNXhfcXVhbnRfdGFibGVbNSoyKzFdW2ldOworICAgICAgICB9CisgICAgICAgIHMtPnlfZGNfc2NhbGVfdGFibGU9IHk7CisgICAgICAgIHMtPmNfZGNfc2NhbGVfdGFibGU9IGM7CisgICAgICAgIHMtPmludHJhX21hdHJpeFswXSA9IDEzOworICAgICAgICBzLT5jaHJvbWFfaW50cmFfbWF0cml4WzBdID0gMTQ7CisgICAgICAgIGZmX2NvbnZlcnRfbWF0cml4KHMsIHMtPnFfaW50cmFfbWF0cml4LCBzLT5xX2ludHJhX21hdHJpeDE2LAorICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnRyYV9tYXRyaXgsIHMtPmludHJhX3F1YW50X2JpYXMsIDgsIDgsIDEpOworICAgICAgICBmZl9jb252ZXJ0X21hdHJpeChzLCBzLT5xX2Nocm9tYV9pbnRyYV9tYXRyaXgsIHMtPnFfY2hyb21hX2ludHJhX21hdHJpeDE2LAorICAgICAgICAgICAgICAgICAgICAgICBzLT5jaHJvbWFfaW50cmFfbWF0cml4LCBzLT5pbnRyYV9xdWFudF9iaWFzLCA4LCA4LCAxKTsKKyAgICAgICAgcy0+cXNjYWxlPSA4OworICAgIH0KKworICAgIC8vRklYTUUgdmFyIGR1cGxpY2F0aW9uCisgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+a2V5X2ZyYW1lID0KKyAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+a2V5X2ZyYW1lID0gcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JOyAvL0ZJWE1FIHBpY19wdHIKKyAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5waWN0X3R5cGUgPQorICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5waWN0X3R5cGUgPSBzLT5waWN0X3R5cGU7CisKKyAgICBpZiAocy0+Y3VycmVudF9waWN0dXJlLmYtPmtleV9mcmFtZSkKKyAgICAgICAgcy0+cGljdHVyZV9pbl9nb3BfbnVtYmVyPTA7CisKKyAgICBzLT5tYl94ID0gcy0+bWJfeSA9IDA7CisgICAgcy0+bGFzdF9iaXRzPSBwdXRfYml0c19jb3VudCgmcy0+cGIpOworICAgIHN3aXRjaChzLT5vdXRfZm9ybWF0KSB7CisgICAgY2FzZSBGTVRfTUpQRUc6CisgICAgICAgIGlmIChDT05GSUdfTUpQRUdfRU5DT0RFUikKKyAgICAgICAgICAgIGZmX21qcGVnX2VuY29kZV9waWN0dXJlX2hlYWRlcihzLT5hdmN0eCwgJnMtPnBiLCAmcy0+aW50cmFfc2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmludHJhX21hdHJpeCwgcy0+Y2hyb21hX2ludHJhX21hdHJpeCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk1UX0gyNjE6CisgICAgICAgIGlmIChDT05GSUdfSDI2MV9FTkNPREVSKQorICAgICAgICAgICAgZmZfaDI2MV9lbmNvZGVfcGljdHVyZV9oZWFkZXIocywgcGljdHVyZV9udW1iZXIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZNVF9IMjYzOgorICAgICAgICBpZiAoQ09ORklHX1dNVjJfRU5DT0RFUiAmJiBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XTVYyKQorICAgICAgICAgICAgZmZfd212Ml9lbmNvZGVfcGljdHVyZV9oZWFkZXIocywgcGljdHVyZV9udW1iZXIpOworICAgICAgICBlbHNlIGlmIChDT05GSUdfTVNNUEVHNF9FTkNPREVSICYmIHMtPm1zbXBlZzRfdmVyc2lvbikKKyAgICAgICAgICAgIGZmX21zbXBlZzRfZW5jb2RlX3BpY3R1cmVfaGVhZGVyKHMsIHBpY3R1cmVfbnVtYmVyKTsKKyAgICAgICAgZWxzZSBpZiAoQ09ORklHX01QRUc0X0VOQ09ERVIgJiYgcy0+aDI2M19wcmVkKQorICAgICAgICAgICAgZmZfbXBlZzRfZW5jb2RlX3BpY3R1cmVfaGVhZGVyKHMsIHBpY3R1cmVfbnVtYmVyKTsKKyAgICAgICAgZWxzZSBpZiAoQ09ORklHX1JWMTBfRU5DT0RFUiAmJiBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjEwKQorICAgICAgICAgICAgZmZfcnYxMF9lbmNvZGVfcGljdHVyZV9oZWFkZXIocywgcGljdHVyZV9udW1iZXIpOworICAgICAgICBlbHNlIGlmIChDT05GSUdfUlYyMF9FTkNPREVSICYmIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWMjApCisgICAgICAgICAgICBmZl9ydjIwX2VuY29kZV9waWN0dXJlX2hlYWRlcihzLCBwaWN0dXJlX251bWJlcik7CisgICAgICAgIGVsc2UgaWYgKENPTkZJR19GTFZfRU5DT0RFUiAmJiBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTFYxKQorICAgICAgICAgICAgZmZfZmx2X2VuY29kZV9waWN0dXJlX2hlYWRlcihzLCBwaWN0dXJlX251bWJlcik7CisgICAgICAgIGVsc2UgaWYgKENPTkZJR19IMjYzX0VOQ09ERVIpCisgICAgICAgICAgICBmZl9oMjYzX2VuY29kZV9waWN0dXJlX2hlYWRlcihzLCBwaWN0dXJlX251bWJlcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk1UX01QRUcxOgorICAgICAgICBpZiAoQ09ORklHX01QRUcxVklERU9fRU5DT0RFUiB8fCBDT05GSUdfTVBFRzJWSURFT19FTkNPREVSKQorICAgICAgICAgICAgZmZfbXBlZzFfZW5jb2RlX3BpY3R1cmVfaGVhZGVyKHMsIHBpY3R1cmVfbnVtYmVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICB9CisgICAgYml0cz0gcHV0X2JpdHNfY291bnQoJnMtPnBiKTsKKyAgICBzLT5oZWFkZXJfYml0cz0gYml0cyAtIHMtPmxhc3RfYml0czsKKworICAgIGZvcihpPTE7IGk8Y29udGV4dF9jb3VudDsgaSsrKXsKKyAgICAgICAgdXBkYXRlX2R1cGxpY2F0ZV9jb250ZXh0X2FmdGVyX21lKHMtPnRocmVhZF9jb250ZXh0W2ldLCBzKTsKKyAgICB9CisgICAgcy0+YXZjdHgtPmV4ZWN1dGUocy0+YXZjdHgsIGVuY29kZV90aHJlYWQsICZzLT50aHJlYWRfY29udGV4dFswXSwgTlVMTCwgY29udGV4dF9jb3VudCwgc2l6ZW9mKHZvaWQqKSk7CisgICAgZm9yKGk9MTsgaTxjb250ZXh0X2NvdW50OyBpKyspeworICAgICAgICBtZXJnZV9jb250ZXh0X2FmdGVyX2VuY29kZShzLCBzLT50aHJlYWRfY29udGV4dFtpXSk7CisgICAgfQorICAgIGVtbXNfYygpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZW5vaXNlX2RjdF9jKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jayl7CisgICAgY29uc3QgaW50IGludHJhPSBzLT5tYl9pbnRyYTsKKyAgICBpbnQgaTsKKworICAgIHMtPmRjdF9jb3VudFtpbnRyYV0rKzsKKworICAgIGZvcihpPTA7IGk8NjQ7IGkrKyl7CisgICAgICAgIGludCBsZXZlbD0gYmxvY2tbaV07CisKKyAgICAgICAgaWYobGV2ZWwpeworICAgICAgICAgICAgaWYobGV2ZWw+MCl7CisgICAgICAgICAgICAgICAgcy0+ZGN0X2Vycm9yX3N1bVtpbnRyYV1baV0gKz0gbGV2ZWw7CisgICAgICAgICAgICAgICAgbGV2ZWwgLT0gcy0+ZGN0X29mZnNldFtpbnRyYV1baV07CisgICAgICAgICAgICAgICAgaWYobGV2ZWw8MCkgbGV2ZWw9MDsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHMtPmRjdF9lcnJvcl9zdW1baW50cmFdW2ldIC09IGxldmVsOworICAgICAgICAgICAgICAgIGxldmVsICs9IHMtPmRjdF9vZmZzZXRbaW50cmFdW2ldOworICAgICAgICAgICAgICAgIGlmKGxldmVsPjApIGxldmVsPTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibG9ja1tpXT0gbGV2ZWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGN0X3F1YW50aXplX3RyZWxsaXNfYyhNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHFzY2FsZSwgaW50ICpvdmVyZmxvdyl7CisgICAgY29uc3QgaW50ICpxbWF0OworICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW50YWJsZT0gcy0+aW50cmFfc2NhbnRhYmxlLnNjYW50YWJsZTsKKyAgICBjb25zdCB1aW50OF90ICpwZXJtX3NjYW50YWJsZT0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7CisgICAgaW50IG1heD0wOworICAgIHVuc2lnbmVkIGludCB0aHJlc2hvbGQxLCB0aHJlc2hvbGQyOworICAgIGludCBiaWFzPTA7CisgICAgaW50IHJ1bl90YWJbNjVdOworICAgIGludCBsZXZlbF90YWJbNjVdOworICAgIGludCBzY29yZV90YWJbNjVdOworICAgIGludCBzdXJ2aXZvcls2NV07CisgICAgaW50IHN1cnZpdm9yX2NvdW50OworICAgIGludCBsYXN0X3J1bj0wOworICAgIGludCBsYXN0X2xldmVsPTA7CisgICAgaW50IGxhc3Rfc2NvcmU9IDA7CisgICAgaW50IGxhc3RfaTsKKyAgICBpbnQgY29lZmZbMl1bNjRdOworICAgIGludCBjb2VmZl9jb3VudFs2NF07CisgICAgaW50IHFtdWwsIHFhZGQsIHN0YXJ0X2ksIGxhc3Rfbm9uX3plcm8sIGksIGRjOworICAgIGNvbnN0IGludCBlc2NfbGVuZ3RoPSBzLT5hY19lc2NfbGVuZ3RoOworICAgIHVpbnQ4X3QgKiBsZW5ndGg7CisgICAgdWludDhfdCAqIGxhc3RfbGVuZ3RoOworICAgIGNvbnN0IGludCBsYW1iZGE9IHMtPmxhbWJkYTIgPj4gKEZGX0xBTUJEQV9TSElGVCAtIDYpOworCisgICAgcy0+ZmRzcC5mZGN0KGJsb2NrKTsKKworICAgIGlmKHMtPmRjdF9lcnJvcl9zdW0pCisgICAgICAgIHMtPmRlbm9pc2VfZGN0KHMsIGJsb2NrKTsKKyAgICBxbXVsPSBxc2NhbGUqMTY7CisgICAgcWFkZD0gKChxc2NhbGUtMSl8MSkqODsKKworICAgIGlmIChzLT5tYl9pbnRyYSkgeworICAgICAgICBpbnQgcTsKKyAgICAgICAgaWYgKCFzLT5oMjYzX2FpYykgeworICAgICAgICAgICAgaWYgKG4gPCA0KQorICAgICAgICAgICAgICAgIHEgPSBzLT55X2RjX3NjYWxlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHEgPSBzLT5jX2RjX3NjYWxlOworICAgICAgICAgICAgcSA9IHEgPDwgMzsKKyAgICAgICAgfSBlbHNleworICAgICAgICAgICAgLyogRm9yIEFJQyB3ZSBza2lwIHF1YW50L2RlcXVhbnQgb2YgSU5UUkFEQyAqLworICAgICAgICAgICAgcSA9IDEgPDwgMzsKKyAgICAgICAgICAgIHFhZGQ9MDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5vdGU6IGJsb2NrWzBdIGlzIGFzc3VtZWQgdG8gYmUgcG9zaXRpdmUgKi8KKyAgICAgICAgYmxvY2tbMF0gPSAoYmxvY2tbMF0gKyAocSA+PiAxKSkgLyBxOworICAgICAgICBzdGFydF9pID0gMTsKKyAgICAgICAgbGFzdF9ub25femVybyA9IDA7CisgICAgICAgIHFtYXQgPSBuIDwgNCA/IHMtPnFfaW50cmFfbWF0cml4W3FzY2FsZV0gOiBzLT5xX2Nocm9tYV9pbnRyYV9tYXRyaXhbcXNjYWxlXTsKKyAgICAgICAgaWYocy0+bXBlZ19xdWFudCB8fCBzLT5vdXRfZm9ybWF0ID09IEZNVF9NUEVHMSkKKyAgICAgICAgICAgIGJpYXM9IDE8PChRTUFUX1NISUZULTEpOworICAgICAgICBsZW5ndGggICAgID0gcy0+aW50cmFfYWNfdmxjX2xlbmd0aDsKKyAgICAgICAgbGFzdF9sZW5ndGg9IHMtPmludHJhX2FjX3ZsY19sYXN0X2xlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydF9pID0gMDsKKyAgICAgICAgbGFzdF9ub25femVybyA9IC0xOworICAgICAgICBxbWF0ID0gcy0+cV9pbnRlcl9tYXRyaXhbcXNjYWxlXTsKKyAgICAgICAgbGVuZ3RoICAgICA9IHMtPmludGVyX2FjX3ZsY19sZW5ndGg7CisgICAgICAgIGxhc3RfbGVuZ3RoPSBzLT5pbnRlcl9hY192bGNfbGFzdF9sZW5ndGg7CisgICAgfQorICAgIGxhc3RfaT0gc3RhcnRfaTsKKworICAgIHRocmVzaG9sZDE9ICgxPDxRTUFUX1NISUZUKSAtIGJpYXMgLSAxOworICAgIHRocmVzaG9sZDI9ICh0aHJlc2hvbGQxPDwxKTsKKworICAgIGZvcihpPTYzOyBpPj1zdGFydF9pOyBpLS0pIHsKKyAgICAgICAgY29uc3QgaW50IGogPSBzY2FudGFibGVbaV07CisgICAgICAgIGludCBsZXZlbCA9IGJsb2NrW2pdICogcW1hdFtqXTsKKworICAgICAgICBpZigoKHVuc2lnbmVkKShsZXZlbCt0aHJlc2hvbGQxKSk+dGhyZXNob2xkMil7CisgICAgICAgICAgICBsYXN0X25vbl96ZXJvID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9c3RhcnRfaTsgaTw9bGFzdF9ub25femVybzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBqID0gc2NhbnRhYmxlW2ldOworICAgICAgICBpbnQgbGV2ZWwgPSBibG9ja1tqXSAqIHFtYXRbal07CisKKy8vICAgICAgICBpZiggICBiaWFzK2xldmVsID49ICgxPDwoUU1BVF9TSElGVCAtIDMpKQorLy8gICAgICAgICAgIHx8IGJpYXMtbGV2ZWwgPj0gKDE8PChRTUFUX1NISUZUIC0gMykpKXsKKyAgICAgICAgaWYoKCh1bnNpZ25lZCkobGV2ZWwrdGhyZXNob2xkMSkpPnRocmVzaG9sZDIpeworICAgICAgICAgICAgaWYobGV2ZWw+MCl7CisgICAgICAgICAgICAgICAgbGV2ZWw9IChiaWFzICsgbGV2ZWwpPj5RTUFUX1NISUZUOworICAgICAgICAgICAgICAgIGNvZWZmWzBdW2ldPSBsZXZlbDsKKyAgICAgICAgICAgICAgICBjb2VmZlsxXVtpXT0gbGV2ZWwtMTsKKy8vICAgICAgICAgICAgICAgIGNvZWZmWzJdW2tdPSBsZXZlbC0yOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgbGV2ZWw9IChiaWFzIC0gbGV2ZWwpPj5RTUFUX1NISUZUOworICAgICAgICAgICAgICAgIGNvZWZmWzBdW2ldPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgY29lZmZbMV1baV09IC1sZXZlbCsxOworLy8gICAgICAgICAgICAgICAgY29lZmZbMl1ba109IC1sZXZlbCsyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29lZmZfY291bnRbaV09IEZGTUlOKGxldmVsLCAyKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDIoY29lZmZfY291bnRbaV0pOworICAgICAgICAgICAgbWF4IHw9bGV2ZWw7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgY29lZmZbMF1baV09IChsZXZlbD4+MzEpfDE7CisgICAgICAgICAgICBjb2VmZl9jb3VudFtpXT0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpvdmVyZmxvdz0gcy0+bWF4X3Fjb2VmZiA8IG1heDsgLy9vdmVyZmxvdyBtaWdodCBoYXZlIGhhcHBlbmVkCisKKyAgICBpZihsYXN0X25vbl96ZXJvIDwgc3RhcnRfaSl7CisgICAgICAgIG1lbXNldChibG9jayArIHN0YXJ0X2ksIDAsICg2NC1zdGFydF9pKSpzaXplb2YoaW50MTZfdCkpOworICAgICAgICByZXR1cm4gbGFzdF9ub25femVybzsKKyAgICB9CisKKyAgICBzY29yZV90YWJbc3RhcnRfaV09IDA7CisgICAgc3Vydml2b3JbMF09IHN0YXJ0X2k7CisgICAgc3Vydml2b3JfY291bnQ9IDE7CisKKyAgICBmb3IoaT1zdGFydF9pOyBpPD1sYXN0X25vbl96ZXJvOyBpKyspeworICAgICAgICBpbnQgbGV2ZWxfaW5kZXgsIGosIHplcm9fZGlzdG9ydGlvbjsKKyAgICAgICAgaW50IGRjdF9jb2VmZj0gRkZBQlMoYmxvY2tbIHNjYW50YWJsZVtpXSBdKTsKKyAgICAgICAgaW50IGJlc3Rfc2NvcmU9MjU2KjI1NioyNTYqMTIwOworCisgICAgICAgIGlmIChzLT5mZHNwLmZkY3QgPT0gZmZfZmRjdF9pZmFzdCkKKyAgICAgICAgICAgIGRjdF9jb2VmZj0gKGRjdF9jb2VmZipmZl9pbnZfYWFuc2NhbGVzWyBzY2FudGFibGVbaV0gXSkgPj4gMTI7CisgICAgICAgIHplcm9fZGlzdG9ydGlvbj0gZGN0X2NvZWZmKmRjdF9jb2VmZjsKKworICAgICAgICBmb3IobGV2ZWxfaW5kZXg9MDsgbGV2ZWxfaW5kZXggPCBjb2VmZl9jb3VudFtpXTsgbGV2ZWxfaW5kZXgrKyl7CisgICAgICAgICAgICBpbnQgZGlzdG9ydGlvbjsKKyAgICAgICAgICAgIGludCBsZXZlbD0gY29lZmZbbGV2ZWxfaW5kZXhdW2ldOworICAgICAgICAgICAgY29uc3QgaW50IGFsZXZlbD0gRkZBQlMobGV2ZWwpOworICAgICAgICAgICAgaW50IHVucXVhbnRfY29lZmY7CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDIobGV2ZWwpOworCisgICAgICAgICAgICBpZihzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzIHx8IHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjEpeworICAgICAgICAgICAgICAgIHVucXVhbnRfY29lZmY9IGFsZXZlbCpxbXVsICsgcWFkZDsKKyAgICAgICAgICAgIH1lbHNleyAvL01QRUcxCisgICAgICAgICAgICAgICAgaiA9IHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltzY2FudGFibGVbaV1dOyAvLyBGSVhNRTogb3B0aW1pemUKKyAgICAgICAgICAgICAgICBpZihzLT5tYl9pbnRyYSl7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnF1YW50X2NvZWZmID0gKGludCkoICBhbGV2ZWwgICogcXNjYWxlICogcy0+aW50cmFfbWF0cml4W2pdKSA+PiAzOworICAgICAgICAgICAgICAgICAgICAgICAgdW5xdWFudF9jb2VmZiA9ICAgKHVucXVhbnRfY29lZmYgLSAxKSB8IDE7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnF1YW50X2NvZWZmID0gKCgoICBhbGV2ZWwgIDw8IDEpICsgMSkgKiBxc2NhbGUgKiAoKGludCkgcy0+aW50ZXJfbWF0cml4W2pdKSkgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVucXVhbnRfY29lZmYgPSAgICh1bnF1YW50X2NvZWZmIC0gMSkgfCAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1bnF1YW50X2NvZWZmPDw9IDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRpc3RvcnRpb249ICh1bnF1YW50X2NvZWZmIC0gZGN0X2NvZWZmKSAqICh1bnF1YW50X2NvZWZmIC0gZGN0X2NvZWZmKSAtIHplcm9fZGlzdG9ydGlvbjsKKyAgICAgICAgICAgIGxldmVsKz02NDsKKyAgICAgICAgICAgIGlmKChsZXZlbCYofjEyNykpID09IDApeworICAgICAgICAgICAgICAgIGZvcihqPXN1cnZpdm9yX2NvdW50LTE7IGo+PTA7IGotLSl7CisgICAgICAgICAgICAgICAgICAgIGludCBydW49IGkgLSBzdXJ2aXZvcltqXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNjb3JlPSBkaXN0b3J0aW9uICsgbGVuZ3RoW1VOSV9BQ19FTkNfSU5ERVgocnVuLCBsZXZlbCldKmxhbWJkYTsKKyAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gc2NvcmVfdGFiW2ktcnVuXTsKKworICAgICAgICAgICAgICAgICAgICBpZihzY29yZSA8IGJlc3Rfc2NvcmUpeworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9zY29yZT0gc2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5fdGFiW2krMV09IHJ1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsX3RhYltpKzFdPSBsZXZlbC02NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjMgfHwgcy0+b3V0X2Zvcm1hdCA9PSBGTVRfSDI2MSl7CisgICAgICAgICAgICAgICAgICAgIGZvcihqPXN1cnZpdm9yX2NvdW50LTE7IGo+PTA7IGotLSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVuPSBpIC0gc3Vydml2b3Jbal07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NvcmU9IGRpc3RvcnRpb24gKyBsYXN0X2xlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1biwgbGV2ZWwpXSpsYW1iZGE7CisgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSArPSBzY29yZV90YWJbaS1ydW5dOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2NvcmUgPCBsYXN0X3Njb3JlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3Njb3JlPSBzY29yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3J1bj0gcnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbGV2ZWw9IGxldmVsLTY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfaT0gaSsxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgZGlzdG9ydGlvbiArPSBlc2NfbGVuZ3RoKmxhbWJkYTsKKyAgICAgICAgICAgICAgICBmb3Ioaj1zdXJ2aXZvcl9jb3VudC0xOyBqPj0wOyBqLS0peworICAgICAgICAgICAgICAgICAgICBpbnQgcnVuPSBpIC0gc3Vydml2b3Jbal07CisgICAgICAgICAgICAgICAgICAgIGludCBzY29yZT0gZGlzdG9ydGlvbiArIHNjb3JlX3RhYltpLXJ1bl07CisKKyAgICAgICAgICAgICAgICAgICAgaWYoc2NvcmUgPCBiZXN0X3Njb3JlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3Rfc2NvcmU9IHNjb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgcnVuX3RhYltpKzFdPSBydW47CisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbF90YWJbaSsxXT0gbGV2ZWwtNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzIHx8IHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjEpeworICAgICAgICAgICAgICAgICAgZm9yKGo9c3Vydml2b3JfY291bnQtMTsgaj49MDsgai0tKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBydW49IGkgLSBzdXJ2aXZvcltqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY29yZT0gZGlzdG9ydGlvbiArIHNjb3JlX3RhYltpLXJ1bl07CisgICAgICAgICAgICAgICAgICAgICAgICBpZihzY29yZSA8IGxhc3Rfc2NvcmUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Rfc2NvcmU9IHNjb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcnVuPSBydW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9sZXZlbD0gbGV2ZWwtNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9pPSBpKzE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzY29yZV90YWJbaSsxXT0gYmVzdF9zY29yZTsKKworICAgICAgICAvL05vdGU6IHRoZXJlIGlzIGEgdmxjIGNvZGUgaW4gbXBlZzQgd2hpY2ggaXMgMSBiaXQgc2hvcnRlciB0aGVuIGFub3RoZXIgb25lIHdpdGggYSBzaG9ydGVyIHJ1biBhbmQgdGhlIHNhbWUgbGV2ZWwKKyAgICAgICAgaWYobGFzdF9ub25femVybyA8PSAyNyl7CisgICAgICAgICAgICBmb3IoOyBzdXJ2aXZvcl9jb3VudDsgc3Vydml2b3JfY291bnQtLSl7CisgICAgICAgICAgICAgICAgaWYoc2NvcmVfdGFiWyBzdXJ2aXZvcltzdXJ2aXZvcl9jb3VudC0xXSBdIDw9IGJlc3Rfc2NvcmUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGZvcig7IHN1cnZpdm9yX2NvdW50OyBzdXJ2aXZvcl9jb3VudC0tKXsKKyAgICAgICAgICAgICAgICBpZihzY29yZV90YWJbIHN1cnZpdm9yW3N1cnZpdm9yX2NvdW50LTFdIF0gPD0gYmVzdF9zY29yZSArIGxhbWJkYSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdXJ2aXZvclsgc3Vydml2b3JfY291bnQrKyBdPSBpKzE7CisgICAgfQorCisgICAgaWYocy0+b3V0X2Zvcm1hdCAhPSBGTVRfSDI2MyAmJiBzLT5vdXRfZm9ybWF0ICE9IEZNVF9IMjYxKXsKKyAgICAgICAgbGFzdF9zY29yZT0gMjU2KjI1NioyNTYqMTIwOworICAgICAgICBmb3IoaT0gc3Vydml2b3JbMF07IGk8PWxhc3Rfbm9uX3plcm8gKyAxOyBpKyspeworICAgICAgICAgICAgaW50IHNjb3JlPSBzY29yZV90YWJbaV07CisgICAgICAgICAgICBpZihpKSBzY29yZSArPSBsYW1iZGEqMjsgLy9GSVhNRSBleGFjdGVyPworCisgICAgICAgICAgICBpZihzY29yZSA8IGxhc3Rfc2NvcmUpeworICAgICAgICAgICAgICAgIGxhc3Rfc2NvcmU9IHNjb3JlOworICAgICAgICAgICAgICAgIGxhc3RfaT0gaTsKKyAgICAgICAgICAgICAgICBsYXN0X2xldmVsPSBsZXZlbF90YWJbaV07CisgICAgICAgICAgICAgICAgbGFzdF9ydW49IHJ1bl90YWJbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5jb2RlZF9zY29yZVtuXSA9IGxhc3Rfc2NvcmU7CisKKyAgICBkYz0gRkZBQlMoYmxvY2tbMF0pOworICAgIGxhc3Rfbm9uX3plcm89IGxhc3RfaSAtIDE7CisgICAgbWVtc2V0KGJsb2NrICsgc3RhcnRfaSwgMCwgKDY0LXN0YXJ0X2kpKnNpemVvZihpbnQxNl90KSk7CisKKyAgICBpZihsYXN0X25vbl96ZXJvIDwgc3RhcnRfaSkKKyAgICAgICAgcmV0dXJuIGxhc3Rfbm9uX3plcm87CisKKyAgICBpZihsYXN0X25vbl96ZXJvID09IDAgJiYgc3RhcnRfaSA9PSAwKXsKKyAgICAgICAgaW50IGJlc3RfbGV2ZWw9IDA7CisgICAgICAgIGludCBiZXN0X3Njb3JlPSBkYyAqIGRjOworCisgICAgICAgIGZvcihpPTA7IGk8Y29lZmZfY291bnRbMF07IGkrKyl7CisgICAgICAgICAgICBpbnQgbGV2ZWw9IGNvZWZmW2ldWzBdOworICAgICAgICAgICAgaW50IGFsZXZlbD0gRkZBQlMobGV2ZWwpOworICAgICAgICAgICAgaW50IHVucXVhbnRfY29lZmYsIHNjb3JlLCBkaXN0b3J0aW9uOworCisgICAgICAgICAgICBpZihzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzIHx8IHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjEpeworICAgICAgICAgICAgICAgICAgICB1bnF1YW50X2NvZWZmPSAoYWxldmVsKnFtdWwgKyBxYWRkKT4+MzsKKyAgICAgICAgICAgIH1lbHNleyAvL01QRUcxCisgICAgICAgICAgICAgICAgICAgIHVucXVhbnRfY29lZmYgPSAoKCggIGFsZXZlbCAgPDwgMSkgKyAxKSAqIHFzY2FsZSAqICgoaW50KSBzLT5pbnRlcl9tYXRyaXhbMF0pKSA+PiA0OworICAgICAgICAgICAgICAgICAgICB1bnF1YW50X2NvZWZmID0gICAodW5xdWFudF9jb2VmZiAtIDEpIHwgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVucXVhbnRfY29lZmYgPSAodW5xdWFudF9jb2VmZiArIDQpID4+IDM7CisgICAgICAgICAgICB1bnF1YW50X2NvZWZmPDw9IDMgKyAzOworCisgICAgICAgICAgICBkaXN0b3J0aW9uPSAodW5xdWFudF9jb2VmZiAtIGRjKSAqICh1bnF1YW50X2NvZWZmIC0gZGMpOworICAgICAgICAgICAgbGV2ZWwrPTY0OworICAgICAgICAgICAgaWYoKGxldmVsJih+MTI3KSkgPT0gMCkgc2NvcmU9IGRpc3RvcnRpb24gKyBsYXN0X2xlbmd0aFtVTklfQUNfRU5DX0lOREVYKDAsIGxldmVsKV0qbGFtYmRhOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgc2NvcmU9IGRpc3RvcnRpb24gKyBlc2NfbGVuZ3RoKmxhbWJkYTsKKworICAgICAgICAgICAgaWYoc2NvcmUgPCBiZXN0X3Njb3JlKXsKKyAgICAgICAgICAgICAgICBiZXN0X3Njb3JlPSBzY29yZTsKKyAgICAgICAgICAgICAgICBiZXN0X2xldmVsPSBsZXZlbCAtIDY0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJsb2NrWzBdPSBiZXN0X2xldmVsOworICAgICAgICBzLT5jb2RlZF9zY29yZVtuXSA9IGJlc3Rfc2NvcmUgLSBkYypkYzsKKyAgICAgICAgaWYoYmVzdF9sZXZlbCA9PSAwKSByZXR1cm4gLTE7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3Rfbm9uX3plcm87CisgICAgfQorCisgICAgaT0gbGFzdF9pOworICAgIGF2X2Fzc2VydDIobGFzdF9sZXZlbCk7CisKKyAgICBibG9ja1sgcGVybV9zY2FudGFibGVbbGFzdF9ub25femVyb10gXT0gbGFzdF9sZXZlbDsKKyAgICBpIC09IGxhc3RfcnVuICsgMTsKKworICAgIGZvcig7IGk+c3RhcnRfaTsgaSAtPSBydW5fdGFiW2ldICsgMSl7CisgICAgICAgIGJsb2NrWyBwZXJtX3NjYW50YWJsZVtpLTFdIF09IGxldmVsX3RhYltpXTsKKyAgICB9CisKKyAgICByZXR1cm4gbGFzdF9ub25femVybzsKK30KKworLy8jZGVmaW5lIFJFRklORV9TVEFUUyAxCitzdGF0aWMgaW50MTZfdCBiYXNpc1s2NF1bNjRdOworCitzdGF0aWMgdm9pZCBidWlsZF9iYXNpcyh1aW50OF90ICpwZXJtKXsKKyAgICBpbnQgaSwgaiwgeCwgeTsKKyAgICBlbW1zX2MoKTsKKyAgICBmb3IoaT0wOyBpPDg7IGkrKyl7CisgICAgICAgIGZvcihqPTA7IGo8ODsgaisrKXsKKyAgICAgICAgICAgIGZvcih5PTA7IHk8ODsgeSsrKXsKKyAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PDg7IHgrKyl7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzPSAwLjI1KigxPDxCQVNJU19TSElGVCk7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleD0gOCppICsgajsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBlcm1faW5kZXg9IHBlcm1baW5kZXhdOworICAgICAgICAgICAgICAgICAgICBpZihpPT0wKSBzKj0gc3FydCgwLjUpOworICAgICAgICAgICAgICAgICAgICBpZihqPT0wKSBzKj0gc3FydCgwLjUpOworICAgICAgICAgICAgICAgICAgICBiYXNpc1twZXJtX2luZGV4XVs4KnggKyB5XT0gbHJpbnRmKHMgKiBjb3MoKE1fUEkvOC4wKSppKih4KzAuNSkpICogY29zKChNX1BJLzguMCkqaiooeSswLjUpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGRjdF9xdWFudGl6ZV9yZWZpbmUoTXBlZ0VuY0NvbnRleHQgKnMsIC8vRklYTUUgYnJlYWtzIGRlbm9pc2U/CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50MTZfdCAqd2VpZ2h0LCBpbnQxNl90ICpvcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCBxc2NhbGUpeworICAgIGludDE2X3QgcmVtWzY0XTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIGQxLCBbNjRdKTsKKyAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGU9IHMtPmludHJhX3NjYW50YWJsZS5zY2FudGFibGU7CisgICAgY29uc3QgdWludDhfdCAqcGVybV9zY2FudGFibGU9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkOworLy8gICAgdW5zaWduZWQgaW50IHRocmVzaG9sZDEsIHRocmVzaG9sZDI7CisvLyAgICBpbnQgYmlhcz0wOworICAgIGludCBydW5fdGFiWzY1XTsKKyAgICBpbnQgcHJldl9ydW49MDsKKyAgICBpbnQgcHJldl9sZXZlbD0wOworICAgIGludCBxbXVsLCBxYWRkLCBzdGFydF9pLCBsYXN0X25vbl96ZXJvLCBpLCBkYzsKKyAgICB1aW50OF90ICogbGVuZ3RoOworICAgIHVpbnQ4X3QgKiBsYXN0X2xlbmd0aDsKKyAgICBpbnQgbGFtYmRhOworICAgIGludCBybGVfaW5kZXgsIHJ1biwgcSA9IDEsIHN1bTsgLy9xIGlzIG9ubHkgdXNlZCB3aGVuIHMtPm1iX2ludHJhIGlzIHRydWUKKyNpZmRlZiBSRUZJTkVfU1RBVFMKK3N0YXRpYyBpbnQgY291bnQ9MDsKK3N0YXRpYyBpbnQgYWZ0ZXJfbGFzdD0wOworc3RhdGljIGludCB0b196ZXJvPTA7CitzdGF0aWMgaW50IGZyb21femVybz0wOworc3RhdGljIGludCByYWlzZT0wOworc3RhdGljIGludCBsb3dlcj0wOworc3RhdGljIGludCBtZXNzZWRfc2lnbj0wOworI2VuZGlmCisKKyAgICBpZihiYXNpc1swXVswXSA9PSAwKQorICAgICAgICBidWlsZF9iYXNpcyhzLT5pZHNwLmlkY3RfcGVybXV0YXRpb24pOworCisgICAgcW11bD0gcXNjYWxlKjI7CisgICAgcWFkZD0gKHFzY2FsZS0xKXwxOworICAgIGlmIChzLT5tYl9pbnRyYSkgeworICAgICAgICBpZiAoIXMtPmgyNjNfYWljKSB7CisgICAgICAgICAgICBpZiAobiA8IDQpCisgICAgICAgICAgICAgICAgcSA9IHMtPnlfZGNfc2NhbGU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcSA9IHMtPmNfZGNfc2NhbGU7CisgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgIC8qIEZvciBBSUMgd2Ugc2tpcCBxdWFudC9kZXF1YW50IG9mIElOVFJBREMgKi8KKyAgICAgICAgICAgIHEgPSAxOworICAgICAgICAgICAgcWFkZD0wOworICAgICAgICB9CisgICAgICAgIHEgPDw9IFJFQ09OX1NISUZULTM7CisgICAgICAgIC8qIG5vdGU6IGJsb2NrWzBdIGlzIGFzc3VtZWQgdG8gYmUgcG9zaXRpdmUgKi8KKyAgICAgICAgZGM9IGJsb2NrWzBdKnE7CisvLyAgICAgICAgYmxvY2tbMF0gPSAoYmxvY2tbMF0gKyAocSA+PiAxKSkgLyBxOworICAgICAgICBzdGFydF9pID0gMTsKKy8vICAgICAgICBpZihzLT5tcGVnX3F1YW50IHx8IHMtPm91dF9mb3JtYXQgPT0gRk1UX01QRUcxKQorLy8gICAgICAgICAgICBiaWFzPSAxPDwoUU1BVF9TSElGVC0xKTsKKyAgICAgICAgbGVuZ3RoICAgICA9IHMtPmludHJhX2FjX3ZsY19sZW5ndGg7CisgICAgICAgIGxhc3RfbGVuZ3RoPSBzLT5pbnRyYV9hY192bGNfbGFzdF9sZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGM9IDA7CisgICAgICAgIHN0YXJ0X2kgPSAwOworICAgICAgICBsZW5ndGggICAgID0gcy0+aW50ZXJfYWNfdmxjX2xlbmd0aDsKKyAgICAgICAgbGFzdF9sZW5ndGg9IHMtPmludGVyX2FjX3ZsY19sYXN0X2xlbmd0aDsKKyAgICB9CisgICAgbGFzdF9ub25femVybyA9IHMtPmJsb2NrX2xhc3RfaW5kZXhbbl07CisKKyNpZmRlZiBSRUZJTkVfU1RBVFMKK3tTVEFSVF9USU1FUgorI2VuZGlmCisgICAgZGMgKz0gKDE8PChSRUNPTl9TSElGVC0xKSk7CisgICAgZm9yKGk9MDsgaTw2NDsgaSsrKXsKKyAgICAgICAgcmVtW2ldPSBkYyAtIChvcmlnW2ldPDxSRUNPTl9TSElGVCk7IC8vRklYTUUgIHVzZSBvcmlnIGRpcnJlY3RseSBpbnN0ZWFkIG9mIGNvcHlpbmcgdG8gcmVtW10KKyAgICB9CisjaWZkZWYgUkVGSU5FX1NUQVRTCitTVE9QX1RJTUVSKCJtZW1zZXQgcmVtW10iKX0KKyNlbmRpZgorICAgIHN1bT0wOworICAgIGZvcihpPTA7IGk8NjQ7IGkrKyl7CisgICAgICAgIGludCBvbmU9IDM2OworICAgICAgICBpbnQgcW5zPTQ7CisgICAgICAgIGludCB3OworCisgICAgICAgIHc9IEZGQUJTKHdlaWdodFtpXSkgKyBxbnMqb25lOworICAgICAgICB3PSAxNSArICg0OCpxbnMqb25lICsgdy8yKS93OyAvLyAxNiAuLiA2MworCisgICAgICAgIHdlaWdodFtpXSA9IHc7CisvLyAgICAgICAgdz13ZWlnaHRbaV0gPSAoNjMqcW5zICsgKHcvMikpIC8gdzsKKworICAgICAgICBhdl9hc3NlcnQyKHc+MCk7CisgICAgICAgIGF2X2Fzc2VydDIodzwoMTw8NikpOworICAgICAgICBzdW0gKz0gdyp3OworICAgIH0KKyAgICBsYW1iZGE9IHN1bSoodWludDY0X3Qpcy0+bGFtYmRhMiA+PiAoRkZfTEFNQkRBX1NISUZUIC0gNiArIDYgKyA2ICsgNik7CisjaWZkZWYgUkVGSU5FX1NUQVRTCit7U1RBUlRfVElNRVIKKyNlbmRpZgorICAgIHJ1bj0wOworICAgIHJsZV9pbmRleD0wOworICAgIGZvcihpPXN0YXJ0X2k7IGk8PWxhc3Rfbm9uX3plcm87IGkrKyl7CisgICAgICAgIGludCBqPSBwZXJtX3NjYW50YWJsZVtpXTsKKyAgICAgICAgY29uc3QgaW50IGxldmVsPSBibG9ja1tqXTsKKyAgICAgICAgaW50IGNvZWZmOworCisgICAgICAgIGlmKGxldmVsKXsKKyAgICAgICAgICAgIGlmKGxldmVsPDApIGNvZWZmPSBxbXVsKmxldmVsIC0gcWFkZDsKKyAgICAgICAgICAgIGVsc2UgICAgICAgIGNvZWZmPSBxbXVsKmxldmVsICsgcWFkZDsKKyAgICAgICAgICAgIHJ1bl90YWJbcmxlX2luZGV4KytdPXJ1bjsKKyAgICAgICAgICAgIHJ1bj0wOworCisgICAgICAgICAgICBzLT5tcHZlbmNkc3AuYWRkXzh4OGJhc2lzKHJlbSwgYmFzaXNbal0sIGNvZWZmKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBydW4rKzsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBSRUZJTkVfU1RBVFMKK2lmKGxhc3Rfbm9uX3plcm8+MCl7CitTVE9QX1RJTUVSKCJpbml0IHJlbVtdIikKK30KK30KKwore1NUQVJUX1RJTUVSCisjZW5kaWYKKyAgICBmb3IoOzspeworICAgICAgICBpbnQgYmVzdF9zY29yZSA9IHMtPm1wdmVuY2RzcC50cnlfOHg4YmFzaXMocmVtLCB3ZWlnaHQsIGJhc2lzWzBdLCAwKTsKKyAgICAgICAgaW50IGJlc3RfY29lZmY9MDsKKyAgICAgICAgaW50IGJlc3RfY2hhbmdlPTA7CisgICAgICAgIGludCBydW4yLCBiZXN0X3VucXVhbnRfY2hhbmdlPTAsIGFuYWx5emVfZ3JhZGllbnQ7CisjaWZkZWYgUkVGSU5FX1NUQVRTCit7U1RBUlRfVElNRVIKKyNlbmRpZgorICAgICAgICBhbmFseXplX2dyYWRpZW50ID0gbGFzdF9ub25femVybyA+IDIgfHwgcy0+cXVhbnRpemVyX25vaXNlX3NoYXBpbmcgPj0gMzsKKworICAgICAgICBpZihhbmFseXplX2dyYWRpZW50KXsKKyNpZmRlZiBSRUZJTkVfU1RBVFMKK3tTVEFSVF9USU1FUgorI2VuZGlmCisgICAgICAgICAgICBmb3IoaT0wOyBpPDY0OyBpKyspeworICAgICAgICAgICAgICAgIGludCB3PSB3ZWlnaHRbaV07CisKKyAgICAgICAgICAgICAgICBkMVtpXSA9IChyZW1baV0qdyp3ICsgKDE8PChSRUNPTl9TSElGVCsxMi0xKSkpPj4oUkVDT05fU0hJRlQrMTIpOworICAgICAgICAgICAgfQorI2lmZGVmIFJFRklORV9TVEFUUworU1RPUF9USU1FUigicmVtKncqdyIpfQore1NUQVJUX1RJTUVSCisjZW5kaWYKKyAgICAgICAgICAgIHMtPmZkc3AuZmRjdChkMSk7CisjaWZkZWYgUkVGSU5FX1NUQVRTCitTVE9QX1RJTUVSKCJkY3QiKX0KKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYoc3RhcnRfaSl7CisgICAgICAgICAgICBjb25zdCBpbnQgbGV2ZWw9IGJsb2NrWzBdOworICAgICAgICAgICAgaW50IGNoYW5nZSwgb2xkX2NvZWZmOworCisgICAgICAgICAgICBhdl9hc3NlcnQyKHMtPm1iX2ludHJhKTsKKworICAgICAgICAgICAgb2xkX2NvZWZmPSBxKmxldmVsOworCisgICAgICAgICAgICBmb3IoY2hhbmdlPS0xOyBjaGFuZ2U8PTE7IGNoYW5nZSs9Mil7CisgICAgICAgICAgICAgICAgaW50IG5ld19sZXZlbD0gbGV2ZWwgKyBjaGFuZ2U7CisgICAgICAgICAgICAgICAgaW50IHNjb3JlLCBuZXdfY29lZmY7CisKKyAgICAgICAgICAgICAgICBuZXdfY29lZmY9IHEqbmV3X2xldmVsOworICAgICAgICAgICAgICAgIGlmKG5ld19jb2VmZiA+PSAyMDQ4IHx8IG5ld19jb2VmZiA8IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgc2NvcmUgPSBzLT5tcHZlbmNkc3AudHJ5Xzh4OGJhc2lzKHJlbSwgd2VpZ2h0LCBiYXNpc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NvZWZmIC0gb2xkX2NvZWZmKTsKKyAgICAgICAgICAgICAgICBpZihzY29yZTxiZXN0X3Njb3JlKXsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9zY29yZT0gc2NvcmU7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfY29lZmY9IDA7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfY2hhbmdlPSBjaGFuZ2U7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfdW5xdWFudF9jaGFuZ2U9IG5ld19jb2VmZiAtIG9sZF9jb2VmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBydW49MDsKKyAgICAgICAgcmxlX2luZGV4PTA7CisgICAgICAgIHJ1bjI9IHJ1bl90YWJbcmxlX2luZGV4KytdOworICAgICAgICBwcmV2X2xldmVsPTA7CisgICAgICAgIHByZXZfcnVuPTA7CisKKyAgICAgICAgZm9yKGk9c3RhcnRfaTsgaTw2NDsgaSsrKXsKKyAgICAgICAgICAgIGludCBqPSBwZXJtX3NjYW50YWJsZVtpXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBsZXZlbD0gYmxvY2tbal07CisgICAgICAgICAgICBpbnQgY2hhbmdlLCBvbGRfY29lZmY7CisKKyAgICAgICAgICAgIGlmKHMtPnF1YW50aXplcl9ub2lzZV9zaGFwaW5nIDwgMyAmJiBpID4gbGFzdF9ub25femVybyArIDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmKGxldmVsKXsKKyAgICAgICAgICAgICAgICBpZihsZXZlbDwwKSBvbGRfY29lZmY9IHFtdWwqbGV2ZWwgLSBxYWRkOworICAgICAgICAgICAgICAgIGVsc2UgICAgICAgIG9sZF9jb2VmZj0gcW11bCpsZXZlbCArIHFhZGQ7CisgICAgICAgICAgICAgICAgcnVuMj0gcnVuX3RhYltybGVfaW5kZXgrK107IC8vRklYTUUgISBtYXliZSBhZnRlciBsYXN0CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBvbGRfY29lZmY9MDsKKyAgICAgICAgICAgICAgICBydW4yLS07CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihydW4yPj0wIHx8IGkgPj0gbGFzdF9ub25femVybyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoY2hhbmdlPS0xOyBjaGFuZ2U8PTE7IGNoYW5nZSs9Mil7CisgICAgICAgICAgICAgICAgaW50IG5ld19sZXZlbD0gbGV2ZWwgKyBjaGFuZ2U7CisgICAgICAgICAgICAgICAgaW50IHNjb3JlLCBuZXdfY29lZmYsIHVucXVhbnRfY2hhbmdlOworCisgICAgICAgICAgICAgICAgc2NvcmU9MDsKKyAgICAgICAgICAgICAgICBpZihzLT5xdWFudGl6ZXJfbm9pc2Vfc2hhcGluZyA8IDIgJiYgRkZBQlMobmV3X2xldmVsKSA+IEZGQUJTKGxldmVsKSkKKyAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmKG5ld19sZXZlbCl7CisgICAgICAgICAgICAgICAgICAgIGlmKG5ld19sZXZlbDwwKSBuZXdfY29lZmY9IHFtdWwqbmV3X2xldmVsIC0gcWFkZDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIG5ld19jb2VmZj0gcW11bCpuZXdfbGV2ZWwgKyBxYWRkOworICAgICAgICAgICAgICAgICAgICBpZihuZXdfY29lZmYgPj0gMjA0OCB8fCBuZXdfY29lZmYgPD0gLTIwNDgpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgLy9GSVhNRSBjaGVjayBmb3Igb3ZlcmZsb3cKKworICAgICAgICAgICAgICAgICAgICBpZihsZXZlbCl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihsZXZlbCA8IDYzICYmIGxldmVsID4gLTYzKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpIDwgbGFzdF9ub25femVybykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gICBsZW5ndGhbVU5JX0FDX0VOQ19JTkRFWChydW4sIG5ld19sZXZlbCs2NCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbGVuZ3RoW1VOSV9BQ19FTkNfSU5ERVgocnVuLCBsZXZlbCs2NCldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gICBsYXN0X2xlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1biwgbmV3X2xldmVsKzY0KV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBsYXN0X2xlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1biwgbGV2ZWwrNjQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKEZGQUJTKG5ld19sZXZlbCk9PTEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihhbmFseXplX2dyYWRpZW50KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZz0gZDFbIHNjYW50YWJsZVtpXSBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGcgJiYgKGdebmV3X2xldmVsKSA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA8IGxhc3Rfbm9uX3plcm8peworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0X2k9IGkgKyBydW4yICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dF9sZXZlbD0gYmxvY2tbIHBlcm1fc2NhbnRhYmxlW25leHRfaV0gXSArIDY0OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV4dF9sZXZlbCYofjEyNykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfbGV2ZWw9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXh0X2kgPCBsYXN0X25vbl96ZXJvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSArPSAgIGxlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1biwgNjUpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1bjIsIG5leHRfbGV2ZWwpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGxlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1biArIHJ1bjIgKyAxLCBuZXh0X2xldmVsKV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSArPSAgbGVuZ3RoW1VOSV9BQ19FTkNfSU5ERVgocnVuLCA2NSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsYXN0X2xlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1bjIsIG5leHRfbGV2ZWwpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbGFzdF9sZW5ndGhbVU5JX0FDX0VOQ19JTkRFWChydW4gKyBydW4yICsgMSwgbmV4dF9sZXZlbCldOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gbGFzdF9sZW5ndGhbVU5JX0FDX0VOQ19JTkRFWChydW4sIDY1KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJldl9sZXZlbCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlICs9ICBsZW5ndGhbVU5JX0FDX0VOQ19JTkRFWChwcmV2X3J1biwgcHJldl9sZXZlbCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBsYXN0X2xlbmd0aFtVTklfQUNfRU5DX0lOREVYKHByZXZfcnVuLCBwcmV2X2xldmVsKV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIG5ld19jb2VmZj0wOworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKEZGQUJTKGxldmVsKT09MSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoaSA8IGxhc3Rfbm9uX3plcm8peworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5leHRfaT0gaSArIHJ1bjIgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5leHRfbGV2ZWw9IGJsb2NrWyBwZXJtX3NjYW50YWJsZVtuZXh0X2ldIF0gKyA2NDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV4dF9sZXZlbCYofjEyNykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9sZXZlbD0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV4dF9pIDwgbGFzdF9ub25femVybykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSArPSAgIGxlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1biArIHJ1bjIgKyAxLCBuZXh0X2xldmVsKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGxlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1bjIsIG5leHRfbGV2ZWwpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbGVuZ3RoW1VOSV9BQ19FTkNfSU5ERVgocnVuLCA2NSldOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlICs9ICAgbGFzdF9sZW5ndGhbVU5JX0FDX0VOQ19JTkRFWChydW4gKyBydW4yICsgMSwgbmV4dF9sZXZlbCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBsYXN0X2xlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1bjIsIG5leHRfbGV2ZWwpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbGVuZ3RoW1VOSV9BQ19FTkNfSU5ERVgocnVuLCA2NSldOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlICs9IC1sYXN0X2xlbmd0aFtVTklfQUNfRU5DX0lOREVYKHJ1biwgNjUpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZXZfbGV2ZWwpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlICs9ICBsYXN0X2xlbmd0aFtVTklfQUNfRU5DX0lOREVYKHByZXZfcnVuLCBwcmV2X2xldmVsKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbGVuZ3RoW1VOSV9BQ19FTkNfSU5ERVgocHJldl9ydW4sIHByZXZfbGV2ZWwpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNjb3JlICo9IGxhbWJkYTsKKworICAgICAgICAgICAgICAgIHVucXVhbnRfY2hhbmdlPSBuZXdfY29lZmYgLSBvbGRfY29lZmY7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0Migoc2NvcmUgPCAxMDAqbGFtYmRhICYmIHNjb3JlID4gLTEwMCpsYW1iZGEpIHx8IGxhbWJkYT09MCk7CisKKyAgICAgICAgICAgICAgICBzY29yZSArPSBzLT5tcHZlbmNkc3AudHJ5Xzh4OGJhc2lzKHJlbSwgd2VpZ2h0LCBiYXNpc1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucXVhbnRfY2hhbmdlKTsKKyAgICAgICAgICAgICAgICBpZihzY29yZTxiZXN0X3Njb3JlKXsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9zY29yZT0gc2NvcmU7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfY29lZmY9IGk7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfY2hhbmdlPSBjaGFuZ2U7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfdW5xdWFudF9jaGFuZ2U9IHVucXVhbnRfY2hhbmdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGxldmVsKXsKKyAgICAgICAgICAgICAgICBwcmV2X2xldmVsPSBsZXZlbCArIDY0OworICAgICAgICAgICAgICAgIGlmKHByZXZfbGV2ZWwmKH4xMjcpKQorICAgICAgICAgICAgICAgICAgICBwcmV2X2xldmVsPSAwOworICAgICAgICAgICAgICAgIHByZXZfcnVuPSBydW47CisgICAgICAgICAgICAgICAgcnVuPTA7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBydW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmZGVmIFJFRklORV9TVEFUUworU1RPUF9USU1FUigiaXRlcmF0aXZlIHN0ZXAiKX0KKyNlbmRpZgorCisgICAgICAgIGlmKGJlc3RfY2hhbmdlKXsKKyAgICAgICAgICAgIGludCBqPSBwZXJtX3NjYW50YWJsZVsgYmVzdF9jb2VmZiBdOworCisgICAgICAgICAgICBibG9ja1tqXSArPSBiZXN0X2NoYW5nZTsKKworICAgICAgICAgICAgaWYoYmVzdF9jb2VmZiA+IGxhc3Rfbm9uX3plcm8peworICAgICAgICAgICAgICAgIGxhc3Rfbm9uX3plcm89IGJlc3RfY29lZmY7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihibG9ja1tqXSk7CisjaWZkZWYgUkVGSU5FX1NUQVRTCithZnRlcl9sYXN0Kys7CisjZW5kaWYKKyAgICAgICAgICAgIH1lbHNleworI2lmZGVmIFJFRklORV9TVEFUUworaWYoYmxvY2tbal0peworICAgIGlmKGJsb2NrW2pdIC0gYmVzdF9jaGFuZ2UpeworICAgICAgICBpZihGRkFCUyhibG9ja1tqXSkgPiBGRkFCUyhibG9ja1tqXSAtIGJlc3RfY2hhbmdlKSl7CisgICAgICAgICAgICByYWlzZSsrOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGxvd2VyKys7CisgICAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgICAgZnJvbV96ZXJvKys7CisgICAgfQorfWVsc2V7CisgICAgdG9femVybysrOworfQorI2VuZGlmCisgICAgICAgICAgICAgICAgZm9yKDsgbGFzdF9ub25femVybz49c3RhcnRfaTsgbGFzdF9ub25femVyby0tKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoYmxvY2tbcGVybV9zY2FudGFibGVbbGFzdF9ub25femVyb11dKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmZGVmIFJFRklORV9TVEFUUworY291bnQrKzsKK2lmKDI1NioyNTYqMjU2KjY0ICUgY291bnQgPT0gMCl7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJhZnRlcl9sYXN0OiVkIHRvX3plcm86JWQgZnJvbV96ZXJvOiVkIHJhaXNlOiVkIGxvd2VyOiVkIHNpZ246JWQgeHlwOiVkLyVkLyVkXG4iLCBhZnRlcl9sYXN0LCB0b196ZXJvLCBmcm9tX3plcm8sIHJhaXNlLCBsb3dlciwgbWVzc2VkX3NpZ24sIHMtPm1iX3gsIHMtPm1iX3ksIHMtPnBpY3R1cmVfbnVtYmVyKTsKK30KKyNlbmRpZgorICAgICAgICAgICAgcnVuPTA7CisgICAgICAgICAgICBybGVfaW5kZXg9MDsKKyAgICAgICAgICAgIGZvcihpPXN0YXJ0X2k7IGk8PWxhc3Rfbm9uX3plcm87IGkrKyl7CisgICAgICAgICAgICAgICAgaW50IGo9IHBlcm1fc2NhbnRhYmxlW2ldOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBsZXZlbD0gYmxvY2tbal07CisKKyAgICAgICAgICAgICAgICAgaWYobGV2ZWwpeworICAgICAgICAgICAgICAgICAgICAgcnVuX3RhYltybGVfaW5kZXgrK109cnVuOworICAgICAgICAgICAgICAgICAgICAgcnVuPTA7CisgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgcnVuKys7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+bXB2ZW5jZHNwLmFkZF84eDhiYXNpcyhyZW0sIGJhc2lzW2pdLCBiZXN0X3VucXVhbnRfY2hhbmdlKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBSRUZJTkVfU1RBVFMKK2lmKGxhc3Rfbm9uX3plcm8+MCl7CitTVE9QX1RJTUVSKCJpdGVyYXRpdmUgc2VhcmNoIikKK30KK30KKyNlbmRpZgorCisgICAgcmV0dXJuIGxhc3Rfbm9uX3plcm87Cit9CisKK2ludCBmZl9kY3RfcXVhbnRpemVfYyhNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBxc2NhbGUsIGludCAqb3ZlcmZsb3cpCit7CisgICAgaW50IGksIGosIGxldmVsLCBsYXN0X25vbl96ZXJvLCBxLCBzdGFydF9pOworICAgIGNvbnN0IGludCAqcW1hdDsKKyAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGU9IHMtPmludHJhX3NjYW50YWJsZS5zY2FudGFibGU7CisgICAgaW50IGJpYXM7CisgICAgaW50IG1heD0wOworICAgIHVuc2lnbmVkIGludCB0aHJlc2hvbGQxLCB0aHJlc2hvbGQyOworCisgICAgcy0+ZmRzcC5mZGN0KGJsb2NrKTsKKworICAgIGlmKHMtPmRjdF9lcnJvcl9zdW0pCisgICAgICAgIHMtPmRlbm9pc2VfZGN0KHMsIGJsb2NrKTsKKworICAgIGlmIChzLT5tYl9pbnRyYSkgeworICAgICAgICBpZiAoIXMtPmgyNjNfYWljKSB7CisgICAgICAgICAgICBpZiAobiA8IDQpCisgICAgICAgICAgICAgICAgcSA9IHMtPnlfZGNfc2NhbGU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcSA9IHMtPmNfZGNfc2NhbGU7CisgICAgICAgICAgICBxID0gcSA8PCAzOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIC8qIEZvciBBSUMgd2Ugc2tpcCBxdWFudC9kZXF1YW50IG9mIElOVFJBREMgKi8KKyAgICAgICAgICAgIHEgPSAxIDw8IDM7CisKKyAgICAgICAgLyogbm90ZTogYmxvY2tbMF0gaXMgYXNzdW1lZCB0byBiZSBwb3NpdGl2ZSAqLworICAgICAgICBibG9ja1swXSA9IChibG9ja1swXSArIChxID4+IDEpKSAvIHE7CisgICAgICAgIHN0YXJ0X2kgPSAxOworICAgICAgICBsYXN0X25vbl96ZXJvID0gMDsKKyAgICAgICAgcW1hdCA9IG4gPCA0ID8gcy0+cV9pbnRyYV9tYXRyaXhbcXNjYWxlXSA6IHMtPnFfY2hyb21hX2ludHJhX21hdHJpeFtxc2NhbGVdOworICAgICAgICBiaWFzPSBzLT5pbnRyYV9xdWFudF9iaWFzPDwoUU1BVF9TSElGVCAtIFFVQU5UX0JJQVNfU0hJRlQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXJ0X2kgPSAwOworICAgICAgICBsYXN0X25vbl96ZXJvID0gLTE7CisgICAgICAgIHFtYXQgPSBzLT5xX2ludGVyX21hdHJpeFtxc2NhbGVdOworICAgICAgICBiaWFzPSBzLT5pbnRlcl9xdWFudF9iaWFzPDwoUU1BVF9TSElGVCAtIFFVQU5UX0JJQVNfU0hJRlQpOworICAgIH0KKyAgICB0aHJlc2hvbGQxPSAoMTw8UU1BVF9TSElGVCkgLSBiaWFzIC0gMTsKKyAgICB0aHJlc2hvbGQyPSAodGhyZXNob2xkMTw8MSk7CisgICAgZm9yKGk9NjM7aT49c3RhcnRfaTtpLS0pIHsKKyAgICAgICAgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgbGV2ZWwgPSBibG9ja1tqXSAqIHFtYXRbal07CisKKyAgICAgICAgaWYoKCh1bnNpZ25lZCkobGV2ZWwrdGhyZXNob2xkMSkpPnRocmVzaG9sZDIpeworICAgICAgICAgICAgbGFzdF9ub25femVybyA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBibG9ja1tqXT0wOworICAgICAgICB9CisgICAgfQorICAgIGZvcihpPXN0YXJ0X2k7IGk8PWxhc3Rfbm9uX3plcm87IGkrKykgeworICAgICAgICBqID0gc2NhbnRhYmxlW2ldOworICAgICAgICBsZXZlbCA9IGJsb2NrW2pdICogcW1hdFtqXTsKKworLy8gICAgICAgIGlmKCAgIGJpYXMrbGV2ZWwgPj0gKDE8PFFNQVRfU0hJRlQpCisvLyAgICAgICAgICAgfHwgYmlhcy1sZXZlbCA+PSAoMTw8UU1BVF9TSElGVCkpeworICAgICAgICBpZigoKHVuc2lnbmVkKShsZXZlbCt0aHJlc2hvbGQxKSk+dGhyZXNob2xkMil7CisgICAgICAgICAgICBpZihsZXZlbD4wKXsKKyAgICAgICAgICAgICAgICBsZXZlbD0gKGJpYXMgKyBsZXZlbCk+PlFNQVRfU0hJRlQ7CisgICAgICAgICAgICAgICAgYmxvY2tbal09IGxldmVsOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgbGV2ZWw9IChiaWFzIC0gbGV2ZWwpPj5RTUFUX1NISUZUOworICAgICAgICAgICAgICAgIGJsb2NrW2pdPSAtbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXggfD1sZXZlbDsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBibG9ja1tqXT0wOworICAgICAgICB9CisgICAgfQorICAgICpvdmVyZmxvdz0gcy0+bWF4X3Fjb2VmZiA8IG1heDsgLy9vdmVyZmxvdyBtaWdodCBoYXZlIGhhcHBlbmVkCisKKyAgICAvKiB3ZSBuZWVkIHRoaXMgcGVybXV0YXRpb24gc28gdGhhdCB3ZSBjb3JyZWN0IHRoZSBJRENULCB3ZSBvbmx5IHBlcm11dGUgdGhlICE9MCBlbGVtZW50cyAqLworICAgIGlmIChzLT5pZHNwLnBlcm1fdHlwZSAhPSBGRl9JRENUX1BFUk1fTk9ORSkKKyAgICAgICAgZmZfYmxvY2tfcGVybXV0ZShibG9jaywgcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW50YWJsZSwgbGFzdF9ub25femVybyk7CisKKyAgICByZXR1cm4gbGFzdF9ub25femVybzsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTXBlZ0VuY0NvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBoMjYzX29wdGlvbnNbXSA9IHsKKyAgICB7ICJvYm1jIiwgICAgICAgICAidXNlIG92ZXJsYXBwZWQgYmxvY2sgbW90aW9uIGNvbXBlbnNhdGlvbi4iLCBPRkZTRVQob2JtYyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgInN0cnVjdHVyZWRfc2xpY2VzIiwiV3JpdGUgc2xpY2Ugc3RhcnQgcG9zaXRpb24gYXQgZXZlcnkgR09CIGhlYWRlciBpbnN0ZWFkIG9mIGp1c3QgR09CIG51bWJlci4iLCBPRkZTRVQoaDI2M19zbGljZV9zdHJ1Y3R1cmVkKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFfSwKKyAgICB7ICJtYl9pbmZvIiwgICAgICAiZW1pdCBtYWNyb2Jsb2NrIGluZm8gZm9yIFJGQyAyMTkwIHBhY2tldGl6YXRpb24sIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgdGhlIG1heGltdW0gcGF5bG9hZCBzaXplIiwgT0ZGU0VUKG1iX2luZm8pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgVkUgfSwKKyAgICBGRl9NUFZfQ09NTU9OX09QVFMKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGgyNjNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiSC4yNjMgZW5jb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGgyNjNfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfaDI2M19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoMjYzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSC4yNjMgLyBILjI2My0xOTk2IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1wZWdFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9tcHZfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZmZfbXB2X2VuY29kZV9waWN0dXJlLAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX21wdl9lbmNvZGVfZW5kLAorICAgIC5waXhfZm10cz0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXtBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfTk9ORX0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJmgyNjNfY2xhc3MsCit9OworCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaDI2M3Bfb3B0aW9uc1tdID0geworICAgIHsgInVtdiIsICAgICAgICAiVXNlIHVubGltaXRlZCBtb3Rpb24gdmVjdG9ycy4iLCAgICBPRkZTRVQodW12cGx1cyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgImFpdiIsICAgICAgICAiVXNlIGFsdGVybmF0aXZlIGludGVyIFZMQy4iLCAgICAgICBPRkZTRVQoYWx0X2ludGVyX3ZsYyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgIm9ibWMiLCAgICAgICAidXNlIG92ZXJsYXBwZWQgYmxvY2sgbW90aW9uIGNvbXBlbnNhdGlvbi4iLCBPRkZTRVQob2JtYyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgInN0cnVjdHVyZWRfc2xpY2VzIiwgIldyaXRlIHNsaWNlIHN0YXJ0IHBvc2l0aW9uIGF0IGV2ZXJ5IEdPQiBoZWFkZXIgaW5zdGVhZCBvZiBqdXN0IEdPQiBudW1iZXIuIiwgT0ZGU0VUKGgyNjNfc2xpY2Vfc3RydWN0dXJlZCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRX0sCisgICAgRkZfTVBWX0NPTU1PTl9PUFRTCisgICAgeyBOVUxMIH0sCit9Oworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaDI2M3BfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiSC4yNjNwIGVuY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBoMjYzcF9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9oMjYzcF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoMjYzcCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkguMjYzKyAvIEguMjYzLTE5OTggLyBILjI2MyB2ZXJzaW9uIDIiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2M1AsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1wZWdFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9tcHZfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZmZfbXB2X2VuY29kZV9waWN0dXJlLAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX21wdl9lbmNvZGVfZW5kLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9TTElDRV9USFJFQURTLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJmgyNjNwX2NsYXNzLAorfTsKKworRkZfTVBWX0dFTkVSSUNfQ0xBU1MobXNtcGVnNHYyKQorCitBVkNvZGVjIGZmX21zbXBlZzR2Ml9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtc21wZWc0djIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTQgcGFydCAyIE1pY3Jvc29mdCB2YXJpYW50IHZlcnNpb24gMiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NU01QRUc0VjIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1wZWdFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9tcHZfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZmZfbXB2X2VuY29kZV9waWN0dXJlLAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX21wdl9lbmNvZGVfZW5kLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJm1zbXBlZzR2Ml9jbGFzcywKK307CisKK0ZGX01QVl9HRU5FUklDX0NMQVNTKG1zbXBlZzR2MykKKworQVZDb2RlYyBmZl9tc21wZWc0djNfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXNtcGVnNCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctNCBwYXJ0IDIgTWljcm9zb2Z0IHZhcmlhbnQgdmVyc2lvbiAzIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01TTVBFRzRWMywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ0VuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX21wdl9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBmZl9tcHZfZW5jb2RlX3BpY3R1cmUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9lbmQsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmbXNtcGVnNHYzX2NsYXNzLAorfTsKKworRkZfTVBWX0dFTkVSSUNfQ0xBU1Mod212MSkKKworQVZDb2RlYyBmZl93bXYxX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIndtdjEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIFZpZGVvIDciKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV01WMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ0VuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX21wdl9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBmZl9tcHZfZW5jb2RlX3BpY3R1cmUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9lbmQsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmd212MV9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVndmlkZW9fbW90aW9uLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVndmlkZW9fbW90aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhNTg1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWd2aWRlb19tb3Rpb24uYwpAQCAtMCwwICsxLDk4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiA0TVYgJiBocSAmIEItZnJhbWUgZW5jb2Rpbmcgc3R1ZmYgYnkgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjEuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJtanBlZ2VuYy5oIgorI2luY2x1ZGUgIm1zbXBlZzQuaCIKKyNpbmNsdWRlICJxcGVsZHNwLmgiCisjaW5jbHVkZSA8bGltaXRzLmg+CisKK3N0YXRpYyB2b2lkIGdtYzFfbW90aW9uKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF95LCB1aW50OF90ICpkZXN0X2NiLCB1aW50OF90ICpkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnJlZl9waWN0dXJlKQoreworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICBpbnQgc3JjX3gsIHNyY195LCBtb3Rpb25feCwgbW90aW9uX3k7CisgICAgcHRyZGlmZl90IG9mZnNldCwgbGluZXNpemUsIHV2bGluZXNpemU7CisgICAgaW50IGVtdSA9IDA7CisKKyAgICBtb3Rpb25feCAgID0gcy0+c3ByaXRlX29mZnNldFswXVswXTsKKyAgICBtb3Rpb25feSAgID0gcy0+c3ByaXRlX29mZnNldFswXVsxXTsKKyAgICBzcmNfeCAgICAgID0gcy0+bWJfeCAqIDE2ICsgKG1vdGlvbl94ID4+IChzLT5zcHJpdGVfd2FycGluZ19hY2N1cmFjeSArIDEpKTsKKyAgICBzcmNfeSAgICAgID0gcy0+bWJfeSAqIDE2ICsgKG1vdGlvbl95ID4+IChzLT5zcHJpdGVfd2FycGluZ19hY2N1cmFjeSArIDEpKTsKKyAgICBtb3Rpb25feCA8PD0gKDMgLSBzLT5zcHJpdGVfd2FycGluZ19hY2N1cmFjeSk7CisgICAgbW90aW9uX3kgPDw9ICgzIC0gcy0+c3ByaXRlX3dhcnBpbmdfYWNjdXJhY3kpOworICAgIHNyY194ICAgICAgPSBhdl9jbGlwKHNyY194LCAtMTYsIHMtPndpZHRoKTsKKyAgICBpZiAoc3JjX3ggPT0gcy0+d2lkdGgpCisgICAgICAgIG1vdGlvbl94ID0gMDsKKyAgICBzcmNfeSA9IGF2X2NsaXAoc3JjX3ksIC0xNiwgcy0+aGVpZ2h0KTsKKyAgICBpZiAoc3JjX3kgPT0gcy0+aGVpZ2h0KQorICAgICAgICBtb3Rpb25feSA9IDA7CisKKyAgICBsaW5lc2l6ZSAgID0gcy0+bGluZXNpemU7CisgICAgdXZsaW5lc2l6ZSA9IHMtPnV2bGluZXNpemU7CisKKyAgICBwdHIgPSByZWZfcGljdHVyZVswXSArIHNyY195ICogbGluZXNpemUgKyBzcmNfeDsKKworICAgIGlmICgodW5zaWduZWQpc3JjX3ggPj0gRkZNQVgocy0+aF9lZGdlX3BvcyAtIDE3LCAwKSB8fAorICAgICAgICAodW5zaWduZWQpc3JjX3kgPj0gRkZNQVgocy0+dl9lZGdlX3BvcyAtIDE3LCAwKSkgeworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyLCBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfeCwgc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zLCBzLT52X2VkZ2VfcG9zKTsKKyAgICAgICAgcHRyID0gcy0+ZWRnZV9lbXVfYnVmZmVyOworICAgIH0KKworICAgIGlmICgobW90aW9uX3ggfCBtb3Rpb25feSkgJiA3KSB7CisgICAgICAgIHMtPm1kc3AuZ21jMShkZXN0X3ksIHB0ciwgbGluZXNpemUsIDE2LAorICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3ggJiAxNSwgbW90aW9uX3kgJiAxNSwgMTI4IC0gcy0+bm9fcm91bmRpbmcpOworICAgICAgICBzLT5tZHNwLmdtYzEoZGVzdF95ICsgOCwgcHRyICsgOCwgbGluZXNpemUsIDE2LAorICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3ggJiAxNSwgbW90aW9uX3kgJiAxNSwgMTI4IC0gcy0+bm9fcm91bmRpbmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBkeHk7CisKKyAgICAgICAgZHh5ID0gKChtb3Rpb25feCA+PiAzKSAmIDEpIHwgKChtb3Rpb25feSA+PiAyKSAmIDIpOworICAgICAgICBpZiAocy0+bm9fcm91bmRpbmcpIHsKKyAgICAgICAgICAgIHMtPmhkc3AucHV0X25vX3JuZF9waXhlbHNfdGFiWzBdW2R4eV0oZGVzdF95LCBwdHIsIGxpbmVzaXplLCAxNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiWzBdW2R4eV0oZGVzdF95LCBwdHIsIGxpbmVzaXplLCAxNik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoQ09ORklHX0dSQVkgJiYgcy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpCisgICAgICAgIHJldHVybjsKKworICAgIG1vdGlvbl94ICAgPSBzLT5zcHJpdGVfb2Zmc2V0WzFdWzBdOworICAgIG1vdGlvbl95ICAgPSBzLT5zcHJpdGVfb2Zmc2V0WzFdWzFdOworICAgIHNyY194ICAgICAgPSBzLT5tYl94ICogOCArIChtb3Rpb25feCA+PiAocy0+c3ByaXRlX3dhcnBpbmdfYWNjdXJhY3kgKyAxKSk7CisgICAgc3JjX3kgICAgICA9IHMtPm1iX3kgKiA4ICsgKG1vdGlvbl95ID4+IChzLT5zcHJpdGVfd2FycGluZ19hY2N1cmFjeSArIDEpKTsKKyAgICBtb3Rpb25feCA8PD0gKDMgLSBzLT5zcHJpdGVfd2FycGluZ19hY2N1cmFjeSk7CisgICAgbW90aW9uX3kgPDw9ICgzIC0gcy0+c3ByaXRlX3dhcnBpbmdfYWNjdXJhY3kpOworICAgIHNyY194ICAgICAgPSBhdl9jbGlwKHNyY194LCAtOCwgcy0+d2lkdGggPj4gMSk7CisgICAgaWYgKHNyY194ID09IHMtPndpZHRoID4+IDEpCisgICAgICAgIG1vdGlvbl94ID0gMDsKKyAgICBzcmNfeSA9IGF2X2NsaXAoc3JjX3ksIC04LCBzLT5oZWlnaHQgPj4gMSk7CisgICAgaWYgKHNyY195ID09IHMtPmhlaWdodCA+PiAxKQorICAgICAgICBtb3Rpb25feSA9IDA7CisKKyAgICBvZmZzZXQgPSAoc3JjX3kgKiB1dmxpbmVzaXplKSArIHNyY194OworICAgIHB0ciAgICA9IHJlZl9waWN0dXJlWzFdICsgb2Zmc2V0OworICAgIGlmICgodW5zaWduZWQpc3JjX3ggPj0gRkZNQVgoKHMtPmhfZWRnZV9wb3MgPj4gMSkgLSA5LCAwKSB8fAorICAgICAgICAodW5zaWduZWQpc3JjX3kgPj0gRkZNQVgoKHMtPnZfZWRnZV9wb3MgPj4gMSkgLSA5LCAwKSkgeworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyLCBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dmxpbmVzaXplLCB1dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY194LCBzcmNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhfZWRnZV9wb3MgPj4gMSwgcy0+dl9lZGdlX3BvcyA+PiAxKTsKKyAgICAgICAgcHRyID0gcy0+ZWRnZV9lbXVfYnVmZmVyOworICAgICAgICBlbXUgPSAxOworICAgIH0KKyAgICBzLT5tZHNwLmdtYzEoZGVzdF9jYiwgcHRyLCB1dmxpbmVzaXplLCA4LAorICAgICAgICAgICAgICAgICBtb3Rpb25feCAmIDE1LCBtb3Rpb25feSAmIDE1LCAxMjggLSBzLT5ub19yb3VuZGluZyk7CisKKyAgICBwdHIgPSByZWZfcGljdHVyZVsyXSArIG9mZnNldDsKKyAgICBpZiAoZW11KSB7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUsIHV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LCA5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3gsIHNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3BvcyA+PiAxLCBzLT52X2VkZ2VfcG9zID4+IDEpOworICAgICAgICBwdHIgPSBzLT5lZGdlX2VtdV9idWZmZXI7CisgICAgfQorICAgIHMtPm1kc3AuZ21jMShkZXN0X2NyLCBwdHIsIHV2bGluZXNpemUsIDgsCisgICAgICAgICAgICAgICAgIG1vdGlvbl94ICYgMTUsIG1vdGlvbl95ICYgMTUsIDEyOCAtIHMtPm5vX3JvdW5kaW5nKTsKK30KKworc3RhdGljIHZvaWQgZ21jX21vdGlvbihNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF95LCB1aW50OF90ICpkZXN0X2NiLCB1aW50OF90ICpkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcmVmX3BpY3R1cmUpCit7CisgICAgdWludDhfdCAqcHRyOworICAgIGludCBsaW5lc2l6ZSwgdXZsaW5lc2l6ZTsKKyAgICBjb25zdCBpbnQgYSA9IHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5OworICAgIGludCBveCwgb3k7CisKKyAgICBsaW5lc2l6ZSAgID0gcy0+bGluZXNpemU7CisgICAgdXZsaW5lc2l6ZSA9IHMtPnV2bGluZXNpemU7CisKKyAgICBwdHIgPSByZWZfcGljdHVyZVswXTsKKworICAgIG94ID0gcy0+c3ByaXRlX29mZnNldFswXVswXSArIHMtPnNwcml0ZV9kZWx0YVswXVswXSAqIHMtPm1iX3ggKiAxNiArCisgICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMF1bMV0gKiBzLT5tYl95ICogMTY7CisgICAgb3kgPSBzLT5zcHJpdGVfb2Zmc2V0WzBdWzFdICsgcy0+c3ByaXRlX2RlbHRhWzFdWzBdICogcy0+bWJfeCAqIDE2ICsKKyAgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVsxXSAqIHMtPm1iX3kgKiAxNjsKKworICAgIHMtPm1kc3AuZ21jKGRlc3RfeSwgcHRyLCBsaW5lc2l6ZSwgMTYsCisgICAgICAgICAgICAgICAgb3gsIG95LAorICAgICAgICAgICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVswXSwgcy0+c3ByaXRlX2RlbHRhWzBdWzFdLAorICAgICAgICAgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVswXSwgcy0+c3ByaXRlX2RlbHRhWzFdWzFdLAorICAgICAgICAgICAgICAgIGEgKyAxLCAoMSA8PCAoMiAqIGEgKyAxKSkgLSBzLT5ub19yb3VuZGluZywKKyAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zLCBzLT52X2VkZ2VfcG9zKTsKKyAgICBzLT5tZHNwLmdtYyhkZXN0X3kgKyA4LCBwdHIsIGxpbmVzaXplLCAxNiwKKyAgICAgICAgICAgICAgICBveCArIHMtPnNwcml0ZV9kZWx0YVswXVswXSAqIDgsCisgICAgICAgICAgICAgICAgb3kgKyBzLT5zcHJpdGVfZGVsdGFbMV1bMF0gKiA4LAorICAgICAgICAgICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVswXSwgcy0+c3ByaXRlX2RlbHRhWzBdWzFdLAorICAgICAgICAgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVswXSwgcy0+c3ByaXRlX2RlbHRhWzFdWzFdLAorICAgICAgICAgICAgICAgIGEgKyAxLCAoMSA8PCAoMiAqIGEgKyAxKSkgLSBzLT5ub19yb3VuZGluZywKKyAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zLCBzLT52X2VkZ2VfcG9zKTsKKworICAgIGlmIChDT05GSUdfR1JBWSAmJiBzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkKKyAgICAgICAgcmV0dXJuOworCisgICAgb3ggPSBzLT5zcHJpdGVfb2Zmc2V0WzFdWzBdICsgcy0+c3ByaXRlX2RlbHRhWzBdWzBdICogcy0+bWJfeCAqIDggKworICAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzBdWzFdICogcy0+bWJfeSAqIDg7CisgICAgb3kgPSBzLT5zcHJpdGVfb2Zmc2V0WzFdWzFdICsgcy0+c3ByaXRlX2RlbHRhWzFdWzBdICogcy0+bWJfeCAqIDggKworICAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzFdWzFdICogcy0+bWJfeSAqIDg7CisKKyAgICBwdHIgPSByZWZfcGljdHVyZVsxXTsKKyAgICBzLT5tZHNwLmdtYyhkZXN0X2NiLCBwdHIsIHV2bGluZXNpemUsIDgsCisgICAgICAgICAgICAgICAgb3gsIG95LAorICAgICAgICAgICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVswXSwgcy0+c3ByaXRlX2RlbHRhWzBdWzFdLAorICAgICAgICAgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVswXSwgcy0+c3ByaXRlX2RlbHRhWzFdWzFdLAorICAgICAgICAgICAgICAgIGEgKyAxLCAoMSA8PCAoMiAqIGEgKyAxKSkgLSBzLT5ub19yb3VuZGluZywKKyAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHMtPnZfZWRnZV9wb3MgPj4gMSk7CisKKyAgICBwdHIgPSByZWZfcGljdHVyZVsyXTsKKyAgICBzLT5tZHNwLmdtYyhkZXN0X2NyLCBwdHIsIHV2bGluZXNpemUsIDgsCisgICAgICAgICAgICAgICAgb3gsIG95LAorICAgICAgICAgICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVswXSwgcy0+c3ByaXRlX2RlbHRhWzBdWzFdLAorICAgICAgICAgICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVswXSwgcy0+c3ByaXRlX2RlbHRhWzFdWzFdLAorICAgICAgICAgICAgICAgIGEgKyAxLCAoMSA8PCAoMiAqIGEgKyAxKSkgLSBzLT5ub19yb3VuZGluZywKKyAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHMtPnZfZWRnZV9wb3MgPj4gMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhwZWxfbW90aW9uKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY194LCBpbnQgc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9waXhlbHNfZnVuYyAqcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3kpCit7CisgICAgaW50IGR4eSA9IDA7CisgICAgaW50IGVtdSA9IDA7CisKKyAgICBzcmNfeCArPSBtb3Rpb25feCA+PiAxOworICAgIHNyY195ICs9IG1vdGlvbl95ID4+IDE7CisKKyAgICAvKiBXQVJOSU5HOiBkbyBubyBmb3JnZXQgaGFsZiBwZWxzICovCisgICAgc3JjX3ggPSBhdl9jbGlwKHNyY194LCAtMTYsIHMtPndpZHRoKTsgLy8gRklYTUUgdW5uZWVkZWQgZm9yIGVtdT8KKyAgICBpZiAoc3JjX3ggIT0gcy0+d2lkdGgpCisgICAgICAgIGR4eSB8PSBtb3Rpb25feCAmIDE7CisgICAgc3JjX3kgPSBhdl9jbGlwKHNyY195LCAtMTYsIHMtPmhlaWdodCk7CisgICAgaWYgKHNyY195ICE9IHMtPmhlaWdodCkKKyAgICAgICAgZHh5IHw9IChtb3Rpb25feSAmIDEpIDw8IDE7CisgICAgc3JjICs9IHNyY195ICogcy0+bGluZXNpemUgKyBzcmNfeDsKKworICAgICAgICBpZiAoKHVuc2lnbmVkKXNyY194ID4gRkZNQVgocy0+aF9lZGdlX3BvcyAtIChtb3Rpb25feCAmIDEpIC0gOCwgMCkgfHwKKyAgICAgICAgICAgICh1bnNpZ25lZClzcmNfeSA+IEZGTUFYKHMtPnZfZWRnZV9wb3MgLSAobW90aW9uX3kgJiAxKSAtIDgsIDApKSB7CisgICAgICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyLCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemUsIHMtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3gsIHNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhfZWRnZV9wb3MsIHMtPnZfZWRnZV9wb3MpOworICAgICAgICAgICAgc3JjID0gcy0+ZWRnZV9lbXVfYnVmZmVyOworICAgICAgICAgICAgZW11ID0gMTsKKyAgICAgICAgfQorICAgIHBpeF9vcFtkeHldKGRlc3QsIHNyYywgcy0+bGluZXNpemUsIDgpOworICAgIHJldHVybiBlbXU7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIG1wZWdfbW90aW9uX2ludGVybmFsKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9iYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbV9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX3NlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnJlZl9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9waXhlbHNfZnVuYyAoKnBpeF9vcClbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX21wZWcxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3kpCit7CisgICAgdWludDhfdCAqcHRyX3ksICpwdHJfY2IsICpwdHJfY3I7CisgICAgaW50IGR4eSwgdXZkeHksIG14LCBteSwgc3JjX3gsIHNyY195LAorICAgICAgICB1dnNyY194LCB1dnNyY195LCB2X2VkZ2VfcG9zOworICAgIHB0cmRpZmZfdCB1dmxpbmVzaXplLCBsaW5lc2l6ZTsKKworI2lmIDAKKyAgICBpZiAocy0+cXVhcnRlcl9zYW1wbGUpIHsKKyAgICAgICAgbW90aW9uX3ggPj49IDE7CisgICAgICAgIG1vdGlvbl95ID4+PSAxOworICAgIH0KKyNlbmRpZgorCisgICAgdl9lZGdlX3BvcyA9IHMtPnZfZWRnZV9wb3MgPj4gZmllbGRfYmFzZWQ7CisgICAgbGluZXNpemUgICA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5saW5lc2l6ZVswXSA8PCBmaWVsZF9iYXNlZDsKKyAgICB1dmxpbmVzaXplID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWzFdIDw8IGZpZWxkX2Jhc2VkOworCisgICAgZHh5ICAgPSAoKG1vdGlvbl95ICYgMSkgPDwgMSkgfCAobW90aW9uX3ggJiAxKTsKKyAgICBzcmNfeCA9IHMtPm1iX3ggKiAxNiArIChtb3Rpb25feCA+PiAxKTsKKyAgICBzcmNfeSA9IChtYl95IDw8ICg0IC0gZmllbGRfYmFzZWQpKSArIChtb3Rpb25feSA+PiAxKTsKKworICAgIGlmICghaXNfbXBlZzEyICYmIHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjMpIHsKKyAgICAgICAgaWYgKChzLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfSFBFTF9DSFJPTUEpICYmIGZpZWxkX2Jhc2VkKSB7CisgICAgICAgICAgICBteCAgICAgID0gKG1vdGlvbl94ID4+IDEpIHwgKG1vdGlvbl94ICYgMSk7CisgICAgICAgICAgICBteSAgICAgID0gbW90aW9uX3kgPj4gMTsKKyAgICAgICAgICAgIHV2ZHh5ICAgPSAoKG15ICYgMSkgPDwgMSkgfCAobXggJiAxKTsKKyAgICAgICAgICAgIHV2c3JjX3ggPSBzLT5tYl94ICogOCArIChteCA+PiAxKTsKKyAgICAgICAgICAgIHV2c3JjX3kgPSAobWJfeSA8PCAoMyAtIGZpZWxkX2Jhc2VkKSkgKyAobXkgPj4gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1dmR4eSAgID0gZHh5IHwgKG1vdGlvbl95ICYgMikgfCAoKG1vdGlvbl94ICYgMikgPj4gMSk7CisgICAgICAgICAgICB1dnNyY194ID0gc3JjX3ggPj4gMTsKKyAgICAgICAgICAgIHV2c3JjX3kgPSBzcmNfeSA+PiAxOworICAgICAgICB9CisgICAgLy8gRXZlbiBjaHJvbWEgbXYncyBhcmUgZnVsbCBwZWwgaW4gSDI2MQorICAgIH0gZWxzZSBpZiAoIWlzX21wZWcxMiAmJiBzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYxKSB7CisgICAgICAgIG14ICAgICAgPSBtb3Rpb25feCAvIDQ7CisgICAgICAgIG15ICAgICAgPSBtb3Rpb25feSAvIDQ7CisgICAgICAgIHV2ZHh5ICAgPSAwOworICAgICAgICB1dnNyY194ID0gcy0+bWJfeCAqIDggKyBteDsKKyAgICAgICAgdXZzcmNfeSA9IG1iX3kgKiA4ICsgbXk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPmNocm9tYV95X3NoaWZ0KSB7CisgICAgICAgICAgICBteCAgICAgID0gbW90aW9uX3ggLyAyOworICAgICAgICAgICAgbXkgICAgICA9IG1vdGlvbl95IC8gMjsKKyAgICAgICAgICAgIHV2ZHh5ICAgPSAoKG15ICYgMSkgPDwgMSkgfCAobXggJiAxKTsKKyAgICAgICAgICAgIHV2c3JjX3ggPSBzLT5tYl94ICogOCArIChteCA+PiAxKTsKKyAgICAgICAgICAgIHV2c3JjX3kgPSAobWJfeSA8PCAoMyAtIGZpZWxkX2Jhc2VkKSkgKyAobXkgPj4gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocy0+Y2hyb21hX3hfc2hpZnQpIHsKKyAgICAgICAgICAgICAgICAvLyBDaHJvbWE0MjIKKyAgICAgICAgICAgICAgICBteCAgICAgID0gbW90aW9uX3ggLyAyOworICAgICAgICAgICAgICAgIHV2ZHh5ICAgPSAoKG1vdGlvbl95ICYgMSkgPDwgMSkgfCAobXggJiAxKTsKKyAgICAgICAgICAgICAgICB1dnNyY194ID0gcy0+bWJfeCAqIDggKyAobXggPj4gMSk7CisgICAgICAgICAgICAgICAgdXZzcmNfeSA9IHNyY195OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBDaHJvbWE0NDQKKyAgICAgICAgICAgICAgICB1dmR4eSAgID0gZHh5OworICAgICAgICAgICAgICAgIHV2c3JjX3ggPSBzcmNfeDsKKyAgICAgICAgICAgICAgICB1dnNyY195ID0gc3JjX3k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdHJfeSAgPSByZWZfcGljdHVyZVswXSArIHNyY195ICogbGluZXNpemUgKyBzcmNfeDsKKyAgICBwdHJfY2IgPSByZWZfcGljdHVyZVsxXSArIHV2c3JjX3kgKiB1dmxpbmVzaXplICsgdXZzcmNfeDsKKyAgICBwdHJfY3IgPSByZWZfcGljdHVyZVsyXSArIHV2c3JjX3kgKiB1dmxpbmVzaXplICsgdXZzcmNfeDsKKworICAgIGlmICgodW5zaWduZWQpc3JjX3ggPiBGRk1BWChzLT5oX2VkZ2VfcG9zIC0gKG1vdGlvbl94ICYgMSkgLSAxNiwgMCkgfHwKKyAgICAgICAgKHVuc2lnbmVkKXNyY195ID4gRkZNQVgoICAgdl9lZGdlX3BvcyAtIChtb3Rpb25feSAmIDEpIC0gaCAsIDApKSB7CisgICAgICAgIGlmIChpc19tcGVnMTIgfHwKKyAgICAgICAgICAgIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gfHwKKyAgICAgICAgICAgIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8pIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJNUEVHIG1vdGlvbiB2ZWN0b3Igb3V0IG9mIGJvdW5kYXJ5ICglZCAlZClcbiIsIHNyY194LAorICAgICAgICAgICAgICAgICAgIHNyY195KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyLCBwdHJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVzaXplLCBzLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3LCAxNyArIGZpZWxkX2Jhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3gsIHNyY195IDw8IGZpZWxkX2Jhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3Bvcywgcy0+dl9lZGdlX3Bvcyk7CisgICAgICAgIHB0cl95ID0gcy0+ZWRnZV9lbXVfYnVmZmVyOworICAgICAgICBpZiAoIUNPTkZJR19HUkFZIHx8ICEocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgICAgICB1aW50OF90ICp1YnVmID0gcy0+ZWRnZV9lbXVfYnVmZmVyICsgMTggKiBzLT5saW5lc2l6ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnZidWYgPSB1YnVmICsgOSAqIHMtPnV2bGluZXNpemU7CisgICAgICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWModWJ1ZiwgcHRyX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnV2bGluZXNpemUsIHMtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOSArIGZpZWxkX2Jhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c3JjX3gsIHV2c3JjX3kgPDwgZmllbGRfYmFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3BvcyA+PiAxLCBzLT52X2VkZ2VfcG9zID4+IDEpOworICAgICAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHZidWYsIHB0cl9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT51dmxpbmVzaXplLCBzLT51dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIDkgKyBmaWVsZF9iYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dnNyY194LCB1dnNyY195IDw8IGZpZWxkX2Jhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhfZWRnZV9wb3MgPj4gMSwgcy0+dl9lZGdlX3BvcyA+PiAxKTsKKyAgICAgICAgICAgIHB0cl9jYiA9IHVidWY7CisgICAgICAgICAgICBwdHJfY3IgPSB2YnVmOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRklYTUUgdXNlIHRoaXMgZm9yIGZpZWxkIHBpeCB0b28gaW5zdGVhZCBvZiB0aGUgb2Jub3hpb3VzIGhhY2sgd2hpY2gKKyAgICAgKiBjaGFuZ2VzIHBpY3R1cmUuZGF0YSAqLworICAgIGlmIChib3R0b21fZmllbGQpIHsKKyAgICAgICAgZGVzdF95ICArPSBzLT5saW5lc2l6ZTsKKyAgICAgICAgZGVzdF9jYiArPSBzLT51dmxpbmVzaXplOworICAgICAgICBkZXN0X2NyICs9IHMtPnV2bGluZXNpemU7CisgICAgfQorCisgICAgaWYgKGZpZWxkX3NlbGVjdCkgeworICAgICAgICBwdHJfeSAgKz0gcy0+bGluZXNpemU7CisgICAgICAgIHB0cl9jYiArPSBzLT51dmxpbmVzaXplOworICAgICAgICBwdHJfY3IgKz0gcy0+dXZsaW5lc2l6ZTsKKyAgICB9CisKKyAgICBwaXhfb3BbMF1bZHh5XShkZXN0X3ksIHB0cl95LCBsaW5lc2l6ZSwgaCk7CisKKyAgICBpZiAoIUNPTkZJR19HUkFZIHx8ICEocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgIHBpeF9vcFtzLT5jaHJvbWFfeF9zaGlmdF1bdXZkeHldCisgICAgICAgICAgICAoZGVzdF9jYiwgcHRyX2NiLCB1dmxpbmVzaXplLCBoID4+IHMtPmNocm9tYV95X3NoaWZ0KTsKKyAgICAgICAgcGl4X29wW3MtPmNocm9tYV94X3NoaWZ0XVt1dmR4eV0KKyAgICAgICAgICAgIChkZXN0X2NyLCBwdHJfY3IsIHV2bGluZXNpemUsIGggPj4gcy0+Y2hyb21hX3lfc2hpZnQpOworICAgIH0KKyAgICBpZiAoIWlzX21wZWcxMiAmJiAoQ09ORklHX0gyNjFfRU5DT0RFUiB8fCBDT05GSUdfSDI2MV9ERUNPREVSKSAmJgorICAgICAgICBzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYxKSB7CisgICAgICAgIGZmX2gyNjFfbG9vcF9maWx0ZXIocyk7CisgICAgfQorfQorLyogYXBwbHkgb25lIG1wZWcgbW90aW9uIHZlY3RvciB0byB0aGUgdGhyZWUgY29tcG9uZW50cyAqLworc3RhdGljIHZvaWQgbXBlZ19tb3Rpb24oTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X3ksIHVpbnQ4X3QgKmRlc3RfY2IsIHVpbnQ4X3QgKmRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfc2VsZWN0LCB1aW50OF90ICoqcmVmX3BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICBvcF9waXhlbHNfZnVuYyAoKnBpeF9vcClbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uX3gsIGludCBtb3Rpb25feSwgaW50IGgsIGludCBtYl95KQoreworI2lmICFDT05GSUdfU01BTEwKKyAgICBpZiAocy0+b3V0X2Zvcm1hdCA9PSBGTVRfTVBFRzEpCisgICAgICAgIG1wZWdfbW90aW9uX2ludGVybmFsKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfc2VsZWN0LCByZWZfcGljdHVyZSwgcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feCwgbW90aW9uX3ksIGgsIDEsIG1iX3kpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBtcGVnX21vdGlvbl9pbnRlcm5hbChzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3NlbGVjdCwgcmVmX3BpY3R1cmUsIHBpeF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3gsIG1vdGlvbl95LCBoLCAwLCBtYl95KTsKK30KKworc3RhdGljIHZvaWQgbXBlZ19tb3Rpb25fZmllbGQoTXBlZ0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRlc3RfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY2IsIHVpbnQ4X3QgKmRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm90dG9tX2ZpZWxkLCBpbnQgZmllbGRfc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnJlZl9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfcGl4ZWxzX2Z1bmMgKCpwaXhfb3ApWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3ksIGludCBoLCBpbnQgbWJfeSkKK3sKKyNpZiAhQ09ORklHX1NNQUxMCisgICAgaWYgKHMtPm91dF9mb3JtYXQgPT0gRk1UX01QRUcxKQorICAgICAgICBtcGVnX21vdGlvbl9pbnRlcm5hbChzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbV9maWVsZCwgZmllbGRfc2VsZWN0LCByZWZfcGljdHVyZSwgcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feCwgbW90aW9uX3ksIGgsIDEsIG1iX3kpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBtcGVnX21vdGlvbl9pbnRlcm5hbChzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbV9maWVsZCwgZmllbGRfc2VsZWN0LCByZWZfcGljdHVyZSwgcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feCwgbW90aW9uX3ksIGgsIDAsIG1iX3kpOworfQorCisvLyBGSVhNRTogU0lNRGlmeSwgYXZnIHZhcmlhbnQsIDE2eDE2IHZlcnNpb24KK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfb2JtYyh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgeDsKKyAgICB1aW50OF90ICpjb25zdCB0b3AgICAgPSBzcmNbMV07CisgICAgdWludDhfdCAqY29uc3QgbGVmdCAgID0gc3JjWzJdOworICAgIHVpbnQ4X3QgKmNvbnN0IG1pZCAgICA9IHNyY1swXTsKKyAgICB1aW50OF90ICpjb25zdCByaWdodCAgPSBzcmNbM107CisgICAgdWludDhfdCAqY29uc3QgYm90dG9tID0gc3JjWzRdOworI2RlZmluZSBPQk1DX0ZJTFRFUih4LCB0LCBsLCBtLCByLCBiKVwKKyAgICBkc3RbeF09ICh0KnRvcFt4XSArIGwqbGVmdFt4XSArIG0qbWlkW3hdICsgcipyaWdodFt4XSArIGIqYm90dG9tW3hdICsgNCk+PjMKKyNkZWZpbmUgT0JNQ19GSUxURVI0KHgsIHQsIGwsIG0sIHIsIGIpXAorICAgIE9CTUNfRklMVEVSKHggICAgICAgICAsIHQsIGwsIG0sIHIsIGIpO1wKKyAgICBPQk1DX0ZJTFRFUih4KzEgICAgICAgLCB0LCBsLCBtLCByLCBiKTtcCisgICAgT0JNQ19GSUxURVIoeCAgK3N0cmlkZSwgdCwgbCwgbSwgciwgYik7XAorICAgIE9CTUNfRklMVEVSKHgrMStzdHJpZGUsIHQsIGwsIG0sIHIsIGIpOworCisgICAgeCA9IDA7CisgICAgT0JNQ19GSUxURVIgKHggICAgLCAyLCAyLCA0LCAwLCAwKTsKKyAgICBPQk1DX0ZJTFRFUiAoeCArIDEsIDIsIDEsIDUsIDAsIDApOworICAgIE9CTUNfRklMVEVSNCh4ICsgMiwgMiwgMSwgNSwgMCwgMCk7CisgICAgT0JNQ19GSUxURVI0KHggKyA0LCAyLCAwLCA1LCAxLCAwKTsKKyAgICBPQk1DX0ZJTFRFUiAoeCArIDYsIDIsIDAsIDUsIDEsIDApOworICAgIE9CTUNfRklMVEVSICh4ICsgNywgMiwgMCwgNCwgMiwgMCk7CisgICAgeCArPSBzdHJpZGU7CisgICAgT0JNQ19GSUxURVIgKHggICAgLCAxLCAyLCA1LCAwLCAwKTsKKyAgICBPQk1DX0ZJTFRFUiAoeCArIDEsIDEsIDIsIDUsIDAsIDApOworICAgIE9CTUNfRklMVEVSICh4ICsgNiwgMSwgMCwgNSwgMiwgMCk7CisgICAgT0JNQ19GSUxURVIgKHggKyA3LCAxLCAwLCA1LCAyLCAwKTsKKyAgICB4ICs9IHN0cmlkZTsKKyAgICBPQk1DX0ZJTFRFUjQoeCAgICAsIDEsIDIsIDUsIDAsIDApOworICAgIE9CTUNfRklMVEVSNCh4ICsgMiwgMSwgMSwgNiwgMCwgMCk7CisgICAgT0JNQ19GSUxURVI0KHggKyA0LCAxLCAwLCA2LCAxLCAwKTsKKyAgICBPQk1DX0ZJTFRFUjQoeCArIDYsIDEsIDAsIDUsIDIsIDApOworICAgIHggKz0gMiAqIHN0cmlkZTsKKyAgICBPQk1DX0ZJTFRFUjQoeCAgICAsIDAsIDIsIDUsIDAsIDEpOworICAgIE9CTUNfRklMVEVSNCh4ICsgMiwgMCwgMSwgNiwgMCwgMSk7CisgICAgT0JNQ19GSUxURVI0KHggKyA0LCAwLCAwLCA2LCAxLCAxKTsKKyAgICBPQk1DX0ZJTFRFUjQoeCArIDYsIDAsIDAsIDUsIDIsIDEpOworICAgIHggKz0gMipzdHJpZGU7CisgICAgT0JNQ19GSUxURVIgKHggICAgLCAwLCAyLCA1LCAwLCAxKTsKKyAgICBPQk1DX0ZJTFRFUiAoeCArIDEsIDAsIDIsIDUsIDAsIDEpOworICAgIE9CTUNfRklMVEVSNCh4ICsgMiwgMCwgMSwgNSwgMCwgMik7CisgICAgT0JNQ19GSUxURVI0KHggKyA0LCAwLCAwLCA1LCAxLCAyKTsKKyAgICBPQk1DX0ZJTFRFUiAoeCArIDYsIDAsIDAsIDUsIDIsIDEpOworICAgIE9CTUNfRklMVEVSICh4ICsgNywgMCwgMCwgNSwgMiwgMSk7CisgICAgeCArPSBzdHJpZGU7CisgICAgT0JNQ19GSUxURVIgKHggICAgLCAwLCAyLCA0LCAwLCAyKTsKKyAgICBPQk1DX0ZJTFRFUiAoeCArIDEsIDAsIDEsIDUsIDAsIDIpOworICAgIE9CTUNfRklMVEVSICh4ICsgNiwgMCwgMCwgNSwgMSwgMik7CisgICAgT0JNQ19GSUxURVIgKHggKyA3LCAwLCAwLCA0LCAyLCAyKTsKK30KKworLyogb2JtYyBmb3IgMSA4eDggbHVtYSBibG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIG9ibWNfbW90aW9uKE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9waXhlbHNfZnVuYyAqcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgbXZbNV1bMl0gLyogbWlkIHRvcCBsZWZ0IHJpZ2h0IGJvdHRvbSAqLykKKyNkZWZpbmUgTUlEICAgIDAKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90ICpwdHJbNV07CisKKyAgICBhdl9hc3NlcnQyKHMtPnF1YXJ0ZXJfc2FtcGxlID09IDApOworCisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICBpZiAoaSAmJiBtdltpXVswXSA9PSBtdltNSURdWzBdICYmIG12W2ldWzFdID09IG12W01JRF1bMV0pIHsKKyAgICAgICAgICAgIHB0cltpXSA9IHB0cltNSURdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHRyW2ldID0gcy0+b2JtY19zY3JhdGNocGFkICsgOCAqIChpICYgMSkgKworICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemUgKiA4ICogKGkgPj4gMSk7CisgICAgICAgICAgICBocGVsX21vdGlvbihzLCBwdHJbaV0sIHNyYywgc3JjX3gsIHNyY195LCBwaXhfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBtdltpXVswXSwgbXZbaV1bMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHV0X29ibWMoZGVzdCwgcHRyLCBzLT5saW5lc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxcGVsX21vdGlvbihNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9iYXNlZCwgaW50IGJvdHRvbV9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfc2VsZWN0LCB1aW50OF90ICoqcmVmX3BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfcGl4ZWxzX2Z1bmMgKCpwaXhfb3ApWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFwZWxfbWNfZnVuYyAoKnFwaXhfb3ApWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uX3gsIGludCBtb3Rpb25feSwgaW50IGgpCit7CisgICAgdWludDhfdCAqcHRyX3ksICpwdHJfY2IsICpwdHJfY3I7CisgICAgaW50IGR4eSwgdXZkeHksIG14LCBteSwgc3JjX3gsIHNyY195LCB1dnNyY194LCB1dnNyY195LCB2X2VkZ2VfcG9zOworICAgIHB0cmRpZmZfdCBsaW5lc2l6ZSwgdXZsaW5lc2l6ZTsKKworICAgIGR4eSAgID0gKChtb3Rpb25feSAmIDMpIDw8IDIpIHwgKG1vdGlvbl94ICYgMyk7CisKKyAgICBzcmNfeCA9IHMtPm1iX3ggKiAgMTYgICAgICAgICAgICAgICAgICsgKG1vdGlvbl94ID4+IDIpOworICAgIHNyY195ID0gcy0+bWJfeSAqICgxNiA+PiBmaWVsZF9iYXNlZCkgKyAobW90aW9uX3kgPj4gMik7CisKKyAgICB2X2VkZ2VfcG9zID0gcy0+dl9lZGdlX3BvcyA+PiBmaWVsZF9iYXNlZDsKKyAgICBsaW5lc2l6ZSAgID0gcy0+bGluZXNpemUgICA8PCBmaWVsZF9iYXNlZDsKKyAgICB1dmxpbmVzaXplID0gcy0+dXZsaW5lc2l6ZSA8PCBmaWVsZF9iYXNlZDsKKworICAgIGlmIChmaWVsZF9iYXNlZCkgeworICAgICAgICBteCA9IG1vdGlvbl94IC8gMjsKKyAgICAgICAgbXkgPSBtb3Rpb25feSA+PiAxOworICAgIH0gZWxzZSBpZiAocy0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX1FQRUxfQ0hST01BMikgeworICAgICAgICBzdGF0aWMgY29uc3QgaW50IHJ0YWJbOF0gPSB7IDAsIDAsIDEsIDEsIDAsIDAsIDAsIDEgfTsKKyAgICAgICAgbXggPSAobW90aW9uX3ggPj4gMSkgKyBydGFiW21vdGlvbl94ICYgN107CisgICAgICAgIG15ID0gKG1vdGlvbl95ID4+IDEpICsgcnRhYlttb3Rpb25feSAmIDddOworICAgIH0gZWxzZSBpZiAocy0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX1FQRUxfQ0hST01BKSB7CisgICAgICAgIG14ID0gKG1vdGlvbl94ID4+IDEpIHwgKG1vdGlvbl94ICYgMSk7CisgICAgICAgIG15ID0gKG1vdGlvbl95ID4+IDEpIHwgKG1vdGlvbl95ICYgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXggPSBtb3Rpb25feCAvIDI7CisgICAgICAgIG15ID0gbW90aW9uX3kgLyAyOworICAgIH0KKyAgICBteCA9IChteCA+PiAxKSB8IChteCAmIDEpOworICAgIG15ID0gKG15ID4+IDEpIHwgKG15ICYgMSk7CisKKyAgICB1dmR4eSA9IChteCAmIDEpIHwgKChteSAmIDEpIDw8IDEpOworICAgIG14ICA+Pj0gMTsKKyAgICBteSAgPj49IDE7CisKKyAgICB1dnNyY194ID0gcy0+bWJfeCAqICA4ICAgICAgICAgICAgICAgICArIG14OworICAgIHV2c3JjX3kgPSBzLT5tYl95ICogKDggPj4gZmllbGRfYmFzZWQpICsgbXk7CisKKyAgICBwdHJfeSAgPSByZWZfcGljdHVyZVswXSArIHNyY195ICAgKiBsaW5lc2l6ZSAgICsgc3JjX3g7CisgICAgcHRyX2NiID0gcmVmX3BpY3R1cmVbMV0gKyB1dnNyY195ICogdXZsaW5lc2l6ZSArIHV2c3JjX3g7CisgICAgcHRyX2NyID0gcmVmX3BpY3R1cmVbMl0gKyB1dnNyY195ICogdXZsaW5lc2l6ZSArIHV2c3JjX3g7CisKKyAgICBpZiAoKHVuc2lnbmVkKXNyY194ID4gRkZNQVgocy0+aF9lZGdlX3BvcyAtIChtb3Rpb25feCAmIDMpIC0gMTYsIDApIHx8CisgICAgICAgICh1bnNpZ25lZClzcmNfeSA+IEZGTUFYKCAgIHZfZWRnZV9wb3MgLSAobW90aW9uX3kgJiAzKSAtIGgsIDApKSB7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsIHB0cl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemUsIHMtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIDE3ICsgZmllbGRfYmFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfeCwgc3JjX3kgPDwgZmllbGRfYmFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zLCBzLT52X2VkZ2VfcG9zKTsKKyAgICAgICAgcHRyX3kgPSBzLT5lZGdlX2VtdV9idWZmZXI7CisgICAgICAgIGlmICghQ09ORklHX0dSQVkgfHwgIShzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnVidWYgPSBzLT5lZGdlX2VtdV9idWZmZXIgKyAxOCAqIHMtPmxpbmVzaXplOworICAgICAgICAgICAgdWludDhfdCAqdmJ1ZiA9IHVidWYgKyA5ICogcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh1YnVmLCBwdHJfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZsaW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LCA5ICsgZmllbGRfYmFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZzcmNfeCwgdXZzcmNfeSA8PCBmaWVsZF9iYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHMtPnZfZWRnZV9wb3MgPj4gMSk7CisgICAgICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWModmJ1ZiwgcHRyX2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnV2bGluZXNpemUsIHMtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOSArIGZpZWxkX2Jhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c3JjX3gsIHV2c3JjX3kgPDwgZmllbGRfYmFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3BvcyA+PiAxLCBzLT52X2VkZ2VfcG9zID4+IDEpOworICAgICAgICAgICAgcHRyX2NiID0gdWJ1ZjsKKyAgICAgICAgICAgIHB0cl9jciA9IHZidWY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZpZWxkX2Jhc2VkKQorICAgICAgICBxcGl4X29wWzBdW2R4eV0oZGVzdF95LCBwdHJfeSwgbGluZXNpemUpOworICAgIGVsc2UgeworICAgICAgICBpZiAoYm90dG9tX2ZpZWxkKSB7CisgICAgICAgICAgICBkZXN0X3kgICs9IHMtPmxpbmVzaXplOworICAgICAgICAgICAgZGVzdF9jYiArPSBzLT51dmxpbmVzaXplOworICAgICAgICAgICAgZGVzdF9jciArPSBzLT51dmxpbmVzaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpZWxkX3NlbGVjdCkgeworICAgICAgICAgICAgcHRyX3kgICs9IHMtPmxpbmVzaXplOworICAgICAgICAgICAgcHRyX2NiICs9IHMtPnV2bGluZXNpemU7CisgICAgICAgICAgICBwdHJfY3IgKz0gcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBkYW1uIGludGVybGFjZWQgbW9kZQorICAgICAgICAvLyBGSVhNRSBib3VuZGFyeSBtaXJyb3JpbmcgaXMgbm90IGV4YWN0bHkgY29ycmVjdCBoZXJlCisgICAgICAgIHFwaXhfb3BbMV1bZHh5XShkZXN0X3ksIHB0cl95LCBsaW5lc2l6ZSk7CisgICAgICAgIHFwaXhfb3BbMV1bZHh5XShkZXN0X3kgKyA4LCBwdHJfeSArIDgsIGxpbmVzaXplKTsKKyAgICB9CisgICAgaWYgKCFDT05GSUdfR1JBWSB8fCAhKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkgeworICAgICAgICBwaXhfb3BbMV1bdXZkeHldKGRlc3RfY3IsIHB0cl9jciwgdXZsaW5lc2l6ZSwgaCA+PiAxKTsKKyAgICAgICAgcGl4X29wWzFdW3V2ZHh5XShkZXN0X2NiLCBwdHJfY2IsIHV2bGluZXNpemUsIGggPj4gMSk7CisgICAgfQorfQorCisvKioKKyAqIGgyNjMgY2hyb21hIDRtdiBtb3Rpb24gY29tcGVuc2F0aW9uLgorICovCitzdGF0aWMgdm9pZCBjaHJvbWFfNG12X21vdGlvbihNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY2IsIHVpbnQ4X3QgKmRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcmVmX3BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9waXhlbHNfZnVuYyAqcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14LCBpbnQgbXkpCit7CisgICAgdWludDhfdCAqcHRyOworICAgIGludCBzcmNfeCwgc3JjX3ksIGR4eSwgZW11ID0gMDsKKyAgICBwdHJkaWZmX3Qgb2Zmc2V0OworCisgICAgLyogSW4gY2FzZSBvZiA4WDgsIHdlIGNvbnN0cnVjdCBhIHNpbmdsZSBjaHJvbWEgbW90aW9uIHZlY3RvcgorICAgICAqIHdpdGggYSBzcGVjaWFsIHJvdW5kaW5nICovCisgICAgbXggPSBmZl9oMjYzX3JvdW5kX2Nocm9tYShteCk7CisgICAgbXkgPSBmZl9oMjYzX3JvdW5kX2Nocm9tYShteSk7CisKKyAgICBkeHkgID0gKChteSAmIDEpIDw8IDEpIHwgKG14ICYgMSk7CisgICAgbXggPj49IDE7CisgICAgbXkgPj49IDE7CisKKyAgICBzcmNfeCA9IHMtPm1iX3ggKiA4ICsgbXg7CisgICAgc3JjX3kgPSBzLT5tYl95ICogOCArIG15OworICAgIHNyY194ID0gYXZfY2xpcChzcmNfeCwgLTgsIChzLT53aWR0aCA+PiAxKSk7CisgICAgaWYgKHNyY194ID09IChzLT53aWR0aCA+PiAxKSkKKyAgICAgICAgZHh5ICY9IH4xOworICAgIHNyY195ID0gYXZfY2xpcChzcmNfeSwgLTgsIChzLT5oZWlnaHQgPj4gMSkpOworICAgIGlmIChzcmNfeSA9PSAocy0+aGVpZ2h0ID4+IDEpKQorICAgICAgICBkeHkgJj0gfjI7CisKKyAgICBvZmZzZXQgPSBzcmNfeSAqIHMtPnV2bGluZXNpemUgKyBzcmNfeDsKKyAgICBwdHIgICAgPSByZWZfcGljdHVyZVsxXSArIG9mZnNldDsKKyAgICBpZiAoKHVuc2lnbmVkKXNyY194ID4gRkZNQVgoKHMtPmhfZWRnZV9wb3MgPj4gMSkgLSAoZHh5ICYgMSkgLSA4LCAwKSB8fAorICAgICAgICAodW5zaWduZWQpc3JjX3kgPiBGRk1BWCgocy0+dl9lZGdlX3BvcyA+PiAxKSAtIChkeHkgPj4gMSkgLSA4LCAwKSkgeworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyLCBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT51dmxpbmVzaXplLCBzLT51dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOSwgc3JjX3gsIHNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3BvcyA+PiAxLCBzLT52X2VkZ2VfcG9zID4+IDEpOworICAgICAgICBwdHIgPSBzLT5lZGdlX2VtdV9idWZmZXI7CisgICAgICAgIGVtdSA9IDE7CisgICAgfQorICAgIHBpeF9vcFtkeHldKGRlc3RfY2IsIHB0ciwgcy0+dXZsaW5lc2l6ZSwgOCk7CisKKyAgICBwdHIgPSByZWZfcGljdHVyZVsyXSArIG9mZnNldDsKKyAgICBpZiAoZW11KSB7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnV2bGluZXNpemUsIHMtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LCA5LCBzcmNfeCwgc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHMtPnZfZWRnZV9wb3MgPj4gMSk7CisgICAgICAgIHB0ciA9IHMtPmVkZ2VfZW11X2J1ZmZlcjsKKyAgICB9CisgICAgcGl4X29wW2R4eV0oZGVzdF9jciwgcHRyLCBzLT51dmxpbmVzaXplLCA4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNoX21vdGlvbihNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqKnBpeCwgaW50IGRpcikKK3sKKyAgICAvKiBmZXRjaCBwaXhlbHMgZm9yIGVzdGltYXRlZCBtdiA0IG1hY3JvYmxvY2tzIGFoZWFkCisgICAgICogb3B0aW1pemVkIGZvciA2NGJ5dGUgY2FjaGUgbGluZXMgKi8KKyAgICBjb25zdCBpbnQgc2hpZnQgPSBzLT5xdWFydGVyX3NhbXBsZSA/IDIgOiAxOworICAgIGNvbnN0IGludCBteCAgICA9IChzLT5tdltkaXJdWzBdWzBdID4+IHNoaWZ0KSArIDE2ICogcy0+bWJfeCArIDg7CisgICAgY29uc3QgaW50IG15ICAgID0gKHMtPm12W2Rpcl1bMF1bMV0gPj4gc2hpZnQpICsgMTYgKiBzLT5tYl95OworICAgIGludCBvZmYgICAgICAgICA9IG14ICsgKG15ICsgKHMtPm1iX3ggJiAzKSAqIDQpICogcy0+bGluZXNpemUgKyA2NDsKKworICAgIHMtPnZkc3AucHJlZmV0Y2gocGl4WzBdICsgb2ZmLCBzLT5saW5lc2l6ZSwgNCk7CisgICAgb2ZmID0gKG14ID4+IDEpICsgKChteSA+PiAxKSArIChzLT5tYl94ICYgNykpICogcy0+dXZsaW5lc2l6ZSArIDY0OworICAgIHMtPnZkc3AucHJlZmV0Y2gocGl4WzFdICsgb2ZmLCBwaXhbMl0gLSBwaXhbMV0sIDIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwbHlfb2JtYyhNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnJlZl9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfcGl4ZWxzX2Z1bmMgKCpwaXhfb3ApWzRdKQoreworICAgIExPQ0FMX0FMSUdORURfOChpbnQxNl90LCBtdl9jYWNoZSwgWzRdLCBbNF1bMl0pOworICAgIFBpY3R1cmUgKmN1cl9mcmFtZSAgID0gJnMtPmN1cnJlbnRfcGljdHVyZTsKKyAgICBpbnQgbWJfeCA9IHMtPm1iX3g7CisgICAgaW50IG1iX3kgPSBzLT5tYl95OworICAgIGNvbnN0IGludCB4eSAgICAgICAgID0gbWJfeCArIG1iX3kgKiBzLT5tYl9zdHJpZGU7CisgICAgY29uc3QgaW50IG1vdF9zdHJpZGUgPSBzLT5iOF9zdHJpZGU7CisgICAgY29uc3QgaW50IG1vdF94eSAgICAgPSBtYl94ICogMiArIG1iX3kgKiAyICogbW90X3N0cmlkZTsKKyAgICBpbnQgbXgsIG15LCBpOworCisgICAgYXZfYXNzZXJ0Mighcy0+bWJfc2tpcHBlZCk7CisKKyAgICBBVl9DT1BZMzIobXZfY2FjaGVbMV1bMV0sIGN1cl9mcmFtZS0+bW90aW9uX3ZhbFswXVttb3RfeHldKTsKKyAgICBBVl9DT1BZMzIobXZfY2FjaGVbMV1bMl0sIGN1cl9mcmFtZS0+bW90aW9uX3ZhbFswXVttb3RfeHkgKyAxXSk7CisKKyAgICBBVl9DT1BZMzIobXZfY2FjaGVbMl1bMV0sCisgICAgICAgICAgICAgIGN1cl9mcmFtZS0+bW90aW9uX3ZhbFswXVttb3RfeHkgKyBtb3Rfc3RyaWRlXSk7CisgICAgQVZfQ09QWTMyKG12X2NhY2hlWzJdWzJdLAorICAgICAgICAgICAgICBjdXJfZnJhbWUtPm1vdGlvbl92YWxbMF1bbW90X3h5ICsgbW90X3N0cmlkZSArIDFdKTsKKworICAgIEFWX0NPUFkzMihtdl9jYWNoZVszXVsxXSwKKyAgICAgICAgICAgICAgY3VyX2ZyYW1lLT5tb3Rpb25fdmFsWzBdW21vdF94eSArIG1vdF9zdHJpZGVdKTsKKyAgICBBVl9DT1BZMzIobXZfY2FjaGVbM11bMl0sCisgICAgICAgICAgICAgIGN1cl9mcmFtZS0+bW90aW9uX3ZhbFswXVttb3RfeHkgKyBtb3Rfc3RyaWRlICsgMV0pOworCisgICAgaWYgKG1iX3kgPT0gMCB8fCBJU19JTlRSQShjdXJfZnJhbWUtPm1iX3R5cGVbeHkgLSBzLT5tYl9zdHJpZGVdKSkgeworICAgICAgICBBVl9DT1BZMzIobXZfY2FjaGVbMF1bMV0sIG12X2NhY2hlWzFdWzFdKTsKKyAgICAgICAgQVZfQ09QWTMyKG12X2NhY2hlWzBdWzJdLCBtdl9jYWNoZVsxXVsyXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVZfQ09QWTMyKG12X2NhY2hlWzBdWzFdLAorICAgICAgICAgICAgICAgICAgY3VyX2ZyYW1lLT5tb3Rpb25fdmFsWzBdW21vdF94eSAtIG1vdF9zdHJpZGVdKTsKKyAgICAgICAgQVZfQ09QWTMyKG12X2NhY2hlWzBdWzJdLAorICAgICAgICAgICAgICAgICAgY3VyX2ZyYW1lLT5tb3Rpb25fdmFsWzBdW21vdF94eSAtIG1vdF9zdHJpZGUgKyAxXSk7CisgICAgfQorCisgICAgaWYgKG1iX3ggPT0gMCB8fCBJU19JTlRSQShjdXJfZnJhbWUtPm1iX3R5cGVbeHkgLSAxXSkpIHsKKyAgICAgICAgQVZfQ09QWTMyKG12X2NhY2hlWzFdWzBdLCBtdl9jYWNoZVsxXVsxXSk7CisgICAgICAgIEFWX0NPUFkzMihtdl9jYWNoZVsyXVswXSwgbXZfY2FjaGVbMl1bMV0pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFWX0NPUFkzMihtdl9jYWNoZVsxXVswXSwgY3VyX2ZyYW1lLT5tb3Rpb25fdmFsWzBdW21vdF94eSAtIDFdKTsKKyAgICAgICAgQVZfQ09QWTMyKG12X2NhY2hlWzJdWzBdLAorICAgICAgICAgICAgICAgICAgY3VyX2ZyYW1lLT5tb3Rpb25fdmFsWzBdW21vdF94eSAtIDEgKyBtb3Rfc3RyaWRlXSk7CisgICAgfQorCisgICAgaWYgKG1iX3ggKyAxID49IHMtPm1iX3dpZHRoIHx8IElTX0lOVFJBKGN1cl9mcmFtZS0+bWJfdHlwZVt4eSArIDFdKSkgeworICAgICAgICBBVl9DT1BZMzIobXZfY2FjaGVbMV1bM10sIG12X2NhY2hlWzFdWzJdKTsKKyAgICAgICAgQVZfQ09QWTMyKG12X2NhY2hlWzJdWzNdLCBtdl9jYWNoZVsyXVsyXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVZfQ09QWTMyKG12X2NhY2hlWzFdWzNdLCBjdXJfZnJhbWUtPm1vdGlvbl92YWxbMF1bbW90X3h5ICsgMl0pOworICAgICAgICBBVl9DT1BZMzIobXZfY2FjaGVbMl1bM10sCisgICAgICAgICAgICAgICAgICBjdXJfZnJhbWUtPm1vdGlvbl92YWxbMF1bbW90X3h5ICsgMiArIG1vdF9zdHJpZGVdKTsKKyAgICB9CisKKyAgICBteCA9IDA7CisgICAgbXkgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IHggICAgICA9IChpICYgMSkgKyAxOworICAgICAgICBjb25zdCBpbnQgeSAgICAgID0gKGkgPj4gMSkgKyAxOworICAgICAgICBpbnQxNl90IG12WzVdWzJdID0geworICAgICAgICAgICAgeyBtdl9jYWNoZVt5XVt4XVswXSwgICAgIG12X2NhY2hlW3ldW3hdWzFdICAgICAgICAgfSwKKyAgICAgICAgICAgIHsgbXZfY2FjaGVbeSAtIDFdW3hdWzBdLCBtdl9jYWNoZVt5IC0gMV1beF1bMV0gICAgIH0sCisgICAgICAgICAgICB7IG12X2NhY2hlW3ldW3ggLSAxXVswXSwgbXZfY2FjaGVbeV1beCAtIDFdWzFdICAgICB9LAorICAgICAgICAgICAgeyBtdl9jYWNoZVt5XVt4ICsgMV1bMF0sIG12X2NhY2hlW3ldW3ggKyAxXVsxXSAgICAgfSwKKyAgICAgICAgICAgIHsgbXZfY2FjaGVbeSArIDFdW3hdWzBdLCBtdl9jYWNoZVt5ICsgMV1beF1bMV0gICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgLy8gRklYTUUgY2xlYW51cAorICAgICAgICBvYm1jX21vdGlvbihzLCBkZXN0X3kgKyAoKGkgJiAxKSAqIDgpICsgKGkgPj4gMSkgKiA4ICogcy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgIHJlZl9waWN0dXJlWzBdLAorICAgICAgICAgICAgICAgICAgICBtYl94ICogMTYgKyAoaSAmIDEpICogOCwgbWJfeSAqIDE2ICsgKGkgPj4gMSkgKiA4LAorICAgICAgICAgICAgICAgICAgICBwaXhfb3BbMV0sCisgICAgICAgICAgICAgICAgICAgIG12KTsKKworICAgICAgICBteCArPSBtdlswXVswXTsKKyAgICAgICAgbXkgKz0gbXZbMF1bMV07CisgICAgfQorICAgIGlmICghQ09ORklHX0dSQVkgfHwgIShzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpCisgICAgICAgIGNocm9tYV80bXZfbW90aW9uKHMsIGRlc3RfY2IsIGRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9waWN0dXJlLCBwaXhfb3BbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG14LCBteSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcHBseV84eDgoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnJlZl9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcGVsX21jX2Z1bmMgKCpxcGl4X29wKVsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3BpeGVsc19mdW5jICgqcGl4X29wKVs0XSkKK3sKKyAgICBpbnQgZHh5LCBteCwgbXksIHNyY194LCBzcmNfeTsKKyAgICBpbnQgaTsKKyAgICBpbnQgbWJfeCA9IHMtPm1iX3g7CisgICAgaW50IG1iX3kgPSBzLT5tYl95OworICAgIHVpbnQ4X3QgKnB0ciwgKmRlc3Q7CisKKyAgICBteCA9IDA7CisgICAgbXkgPSAwOworICAgIGlmIChzLT5xdWFydGVyX3NhbXBsZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbW90aW9uX3ggPSBzLT5tdltkaXJdW2ldWzBdOworICAgICAgICAgICAgaW50IG1vdGlvbl95ID0gcy0+bXZbZGlyXVtpXVsxXTsKKworICAgICAgICAgICAgZHh5ICAgPSAoKG1vdGlvbl95ICYgMykgPDwgMikgfCAobW90aW9uX3ggJiAzKTsKKyAgICAgICAgICAgIHNyY194ID0gbWJfeCAqIDE2ICsgKG1vdGlvbl94ID4+IDIpICsgKGkgJiAxKSAqIDg7CisgICAgICAgICAgICBzcmNfeSA9IG1iX3kgKiAxNiArIChtb3Rpb25feSA+PiAyKSArIChpID4+IDEpICogODsKKworICAgICAgICAgICAgLyogV0FSTklORzogZG8gbm8gZm9yZ2V0IGhhbGYgcGVscyAqLworICAgICAgICAgICAgc3JjX3ggPSBhdl9jbGlwKHNyY194LCAtMTYsIHMtPndpZHRoKTsKKyAgICAgICAgICAgIGlmIChzcmNfeCA9PSBzLT53aWR0aCkKKyAgICAgICAgICAgICAgICBkeHkgJj0gfjM7CisgICAgICAgICAgICBzcmNfeSA9IGF2X2NsaXAoc3JjX3ksIC0xNiwgcy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChzcmNfeSA9PSBzLT5oZWlnaHQpCisgICAgICAgICAgICAgICAgZHh5ICY9IH4xMjsKKworICAgICAgICAgICAgcHRyID0gcmVmX3BpY3R1cmVbMF0gKyAoc3JjX3kgKiBzLT5saW5lc2l6ZSkgKyAoc3JjX3gpOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClzcmNfeCA+IEZGTUFYKHMtPmhfZWRnZV9wb3MgLSAobW90aW9uX3ggJiAzKSAtIDgsIDApIHx8CisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXNyY195ID4gRkZNQVgocy0+dl9lZGdlX3BvcyAtIChtb3Rpb25feSAmIDMpIC0gOCwgMCkpIHsKKyAgICAgICAgICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyLCBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVzaXplLCBzLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3gsIHNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT52X2VkZ2VfcG9zKTsKKyAgICAgICAgICAgICAgICBwdHIgPSBzLT5lZGdlX2VtdV9idWZmZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ID0gZGVzdF95ICsgKChpICYgMSkgKiA4KSArIChpID4+IDEpICogOCAqIHMtPmxpbmVzaXplOworICAgICAgICAgICAgcXBpeF9vcFsxXVtkeHldKGRlc3QsIHB0ciwgcy0+bGluZXNpemUpOworCisgICAgICAgICAgICBteCArPSBzLT5tdltkaXJdW2ldWzBdIC8gMjsKKyAgICAgICAgICAgIG15ICs9IHMtPm12W2Rpcl1baV1bMV0gLyAyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgaHBlbF9tb3Rpb24ocywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfeSArICgoaSAmIDEpICogOCkgKyAoaSA+PiAxKSAqIDggKiBzLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9waWN0dXJlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgbWJfeCAqIDE2ICsgKGkgJiAxKSAqIDgsCisgICAgICAgICAgICAgICAgICAgICAgICBtYl95ICogMTYgKyAoaSA+PiAxKSAqIDgsCisgICAgICAgICAgICAgICAgICAgICAgICBwaXhfb3BbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltkaXJdW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVtpXVsxXSk7CisKKyAgICAgICAgICAgIG14ICs9IHMtPm12W2Rpcl1baV1bMF07CisgICAgICAgICAgICBteSArPSBzLT5tdltkaXJdW2ldWzFdOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFDT05GSUdfR1JBWSB8fCAhKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkKKyAgICAgICAgY2hyb21hXzRtdl9tb3Rpb24ocywgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3BpY3R1cmUsIHBpeF9vcFsxXSwgbXgsIG15KTsKK30KKworLyoqCisgKiBtb3Rpb24gY29tcGVuc2F0aW9uIG9mIGEgc2luZ2xlIG1hY3JvYmxvY2sKKyAqIEBwYXJhbSBzIGNvbnRleHQKKyAqIEBwYXJhbSBkZXN0X3kgbHVtYSBkZXN0aW5hdGlvbiBwb2ludGVyCisgKiBAcGFyYW0gZGVzdF9jYiBjaHJvbWEgY2IvdSBkZXN0aW5hdGlvbiBwb2ludGVyCisgKiBAcGFyYW0gZGVzdF9jciBjaHJvbWEgY3IvdiBkZXN0aW5hdGlvbiBwb2ludGVyCisgKiBAcGFyYW0gZGlyIGRpcmVjdGlvbiAoMC0+Zm9yd2FyZCwgMS0+YmFja3dhcmQpCisgKiBAcGFyYW0gcmVmX3BpY3R1cmUgYXJyYXlbM10gb2YgcG9pbnRlcnMgdG8gdGhlIDMgcGxhbmVzIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZQorICogQHBhcmFtIHBpeF9vcCBoYWxmcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZnVuY3Rpb24gKGF2ZXJhZ2Ugb3IgcHV0IG5vcm1hbGx5KQorICogQHBhcmFtIHFwaXhfb3AgcXBlbCBtb3Rpb24gY29tcGVuc2F0aW9uIGZ1bmN0aW9uIChhdmVyYWdlIG9yIHB1dCBub3JtYWxseSkKKyAqIHRoZSBtb3Rpb24gdmVjdG9ycyBhcmUgdGFrZW4gZnJvbSBzLT5tdiBhbmQgdGhlIE1WIHR5cGUgZnJvbSBzLT5tdl90eXBlCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgbXB2X21vdGlvbl9pbnRlcm5hbChNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnJlZl9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3BpeGVsc19mdW5jICgqcGl4X29wKVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcGVsX21jX2Z1bmMgKCpxcGl4X29wKVsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX21wZWcxMikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbWJfeSA9IHMtPm1iX3k7CisKKyAgICBwcmVmZXRjaF9tb3Rpb24ocywgcmVmX3BpY3R1cmUsIGRpcik7CisKKyAgICBpZiAoIWlzX21wZWcxMiAmJiBzLT5vYm1jICYmIHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICBhcHBseV9vYm1jKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgcmVmX3BpY3R1cmUsIHBpeF9vcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHMtPm12X3R5cGUpIHsKKyAgICBjYXNlIE1WX1RZUEVfMTZYMTY6CisgICAgICAgIGlmIChzLT5tY3NlbCkgeworICAgICAgICAgICAgaWYgKHMtPnJlYWxfc3ByaXRlX3dhcnBpbmdfcG9pbnRzID09IDEpIHsKKyAgICAgICAgICAgICAgICBnbWMxX21vdGlvbihzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3BpY3R1cmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnbWNfbW90aW9uKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9waWN0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghaXNfbXBlZzEyICYmIHMtPnF1YXJ0ZXJfc2FtcGxlKSB7CisgICAgICAgICAgICBxcGVsX21vdGlvbihzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3BpY3R1cmUsIHBpeF9vcCwgcXBpeF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1bMF1bMF0sIHMtPm12W2Rpcl1bMF1bMV0sIDE2KTsKKyAgICAgICAgfSBlbHNlIGlmICghaXNfbXBlZzEyICYmIChDT05GSUdfV01WMl9ERUNPREVSIHx8IENPTkZJR19XTVYyX0VOQ09ERVIpICYmCisgICAgICAgICAgICAgICAgICAgcy0+bXNwZWwgJiYgcy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01WMikgeworICAgICAgICAgICAgZmZfbXNwZWxfbW90aW9uKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcGljdHVyZSwgcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1bMF1bMF0sIHMtPm12W2Rpcl1bMF1bMV0sIDE2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1wZWdfbW90aW9uKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9waWN0dXJlLCBwaXhfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltkaXJdWzBdWzBdLCBzLT5tdltkaXJdWzBdWzFdLCAxNiwgbWJfeSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNVl9UWVBFXzhYODoKKyAgICAgICAgaWYgKCFpc19tcGVnMTIpCisgICAgICAgICAgICBhcHBseV84eDgocywgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgIGRpciwgcmVmX3BpY3R1cmUsIHFwaXhfb3AsIHBpeF9vcCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVZfVFlQRV9GSUVMRDoKKyAgICAgICAgaWYgKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpIHsKKyAgICAgICAgICAgIGlmICghaXNfbXBlZzEyICYmIHMtPnF1YXJ0ZXJfc2FtcGxlKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcXBlbF9tb3Rpb24ocywgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBpLCBzLT5maWVsZF9zZWxlY3RbZGlyXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3BpY3R1cmUsIHBpeF9vcCwgcXBpeF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVtpXVswXSwgcy0+bXZbZGlyXVtpXVsxXSwgOCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIHRvcCBmaWVsZCAqLworICAgICAgICAgICAgICAgIG1wZWdfbW90aW9uX2ZpZWxkKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBzLT5maWVsZF9zZWxlY3RbZGlyXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcGljdHVyZSwgcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1bMF1bMF0sIHMtPm12W2Rpcl1bMF1bMV0sIDgsIG1iX3kpOworICAgICAgICAgICAgICAgIC8qIGJvdHRvbSBmaWVsZCAqLworICAgICAgICAgICAgICAgIG1wZWdfbW90aW9uX2ZpZWxkKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBzLT5maWVsZF9zZWxlY3RbZGlyXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcGljdHVyZSwgcGl4X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1bMV1bMF0sIHMtPm12W2Rpcl1bMV1bMV0sIDgsIG1iX3kpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCAgIHMtPnBpY3R1cmVfc3RydWN0dXJlICE9IHMtPmZpZWxkX3NlbGVjdFtkaXJdWzBdICsgMSAmJiBzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgIXMtPmZpcnN0X2ZpZWxkCisgICAgICAgICAgICAgICAgfHwgIXJlZl9waWN0dXJlWzBdKSB7CisgICAgICAgICAgICAgICAgcmVmX3BpY3R1cmUgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5kYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtcGVnX21vdGlvbihzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9zZWxlY3RbZGlyXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9waWN0dXJlLCBwaXhfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltkaXJdWzBdWzBdLCBzLT5tdltkaXJdWzBdWzFdLCAxNiwgbWJfeSA+PiAxKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1WX1RZUEVfMTZYODoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgdWludDhfdCAqKnJlZjJwaWN0dXJlOworCisgICAgICAgICAgICBpZiAoKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IHMtPmZpZWxkX3NlbGVjdFtkaXJdW2ldICsgMQorICAgICAgICAgICAgICAgIHx8IHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiB8fCBzLT5maXJzdF9maWVsZCkgJiYgcmVmX3BpY3R1cmVbMF0pIHsKKyAgICAgICAgICAgICAgICByZWYycGljdHVyZSA9IHJlZl9waWN0dXJlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWYycGljdHVyZSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmRhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1wZWdfbW90aW9uKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX3NlbGVjdFtkaXJdW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmMnBpY3R1cmUsIHBpeF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1baV1bMF0sIHMtPm12W2Rpcl1baV1bMV0gKyAxNiAqIGksCisgICAgICAgICAgICAgICAgICAgICAgICA4LCBtYl95ID4+IDEpOworCisgICAgICAgICAgICBkZXN0X3kgICs9IDE2ICogcy0+bGluZXNpemU7CisgICAgICAgICAgICBkZXN0X2NiICs9ICgxNiA+PiBzLT5jaHJvbWFfeV9zaGlmdCkgKiBzLT51dmxpbmVzaXplOworICAgICAgICAgICAgZGVzdF9jciArPSAoMTYgPj4gcy0+Y2hyb21hX3lfc2hpZnQpICogcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1WX1RZUEVfRE1WOgorICAgICAgICBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICAgICAgICAgIG1wZWdfbW90aW9uX2ZpZWxkKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaiBeIGksIHJlZl9waWN0dXJlLCBwaXhfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1bMiAqIGkgKyBqXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVsyICogaSArIGpdWzFdLCA4LCBtYl95KTsKKyAgICAgICAgICAgICAgICBwaXhfb3AgPSBzLT5oZHNwLmF2Z19waXhlbHNfdGFiOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFyZWZfcGljdHVyZVswXSkgeworICAgICAgICAgICAgICAgIHJlZl9waWN0dXJlID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+ZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtcGVnX21vdGlvbihzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gaSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3BpY3R1cmUsIHBpeF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltkaXJdWzIgKiBpXVswXSwgcy0+bXZbZGlyXVsyICogaV1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIG1iX3kgPj4gMSk7CisKKyAgICAgICAgICAgICAgICAvLyBhZnRlciBwdXQgd2UgbWFrZSBhdmcgb2YgdGhlIHNhbWUgYmxvY2sKKyAgICAgICAgICAgICAgICBwaXhfb3AgPSBzLT5oZHNwLmF2Z19waXhlbHNfdGFiOworCisgICAgICAgICAgICAgICAgLyogb3Bwb3NpdGUgcGFyaXR5IGlzIGFsd2F5cyBpbiB0aGUgc2FtZSBmcmFtZSBpZiB0aGlzIGlzCisgICAgICAgICAgICAgICAgICogc2Vjb25kIGZpZWxkICovCisgICAgICAgICAgICAgICAgaWYgKCFzLT5maXJzdF9maWVsZCkgeworICAgICAgICAgICAgICAgICAgICByZWZfcGljdHVyZSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmRhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IGF2X2Fzc2VydDIoMCk7CisgICAgfQorfQorCit2b2lkIGZmX21wdl9tb3Rpb24oTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF95LCB1aW50OF90ICpkZXN0X2NiLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RfY3IsIGludCBkaXIsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnJlZl9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgIG9wX3BpeGVsc19mdW5jICgqcGl4X29wKVs0XSwKKyAgICAgICAgICAgICAgICAgICBxcGVsX21jX2Z1bmMgKCpxcGl4X29wKVsxNl0pCit7CisjaWYgIUNPTkZJR19TTUFMTAorICAgIGlmIChzLT5vdXRfZm9ybWF0ID09IEZNVF9NUEVHMSkKKyAgICAgICAgbXB2X21vdGlvbl9pbnRlcm5hbChzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcGljdHVyZSwgcGl4X29wLCBxcGl4X29wLCAxKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgbXB2X21vdGlvbl9pbnRlcm5hbChzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcGljdHVyZSwgcGl4X29wLCBxcGl4X29wLCAwKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWd2aWRlb19wYXJzZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWd2aWRlb19wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTU5NDIxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvX3BhcnNlci5jCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogTVBFRzEgLyBNUEVHMiB2aWRlbyBwYXJzZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgIm1wZWcxMi5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0cnVjdCBNcHZQYXJzZUNvbnRleHQgeworICAgIFBhcnNlQ29udGV4dCBwYzsKKyAgICBBVlJhdGlvbmFsIGZyYW1lX3JhdGU7CisgICAgaW50IHByb2dyZXNzaXZlX3NlcXVlbmNlOworICAgIGludCB3aWR0aCwgaGVpZ2h0OworfTsKKworCitzdGF0aWMgdm9pZCBtcGVndmlkZW9fZXh0cmFjdF9oZWFkZXJzKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIHN0cnVjdCBNcHZQYXJzZUNvbnRleHQgKnBjID0gcy0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBidWYgKyBidWZfc2l6ZTsKKyAgICB1aW50MzJfdCBzdGFydF9jb2RlOworICAgIGludCBmcmFtZV9yYXRlX2luZGV4LCBleHRfdHlwZSwgYnl0ZXNfbGVmdDsKKyAgICBpbnQgZnJhbWVfcmF0ZV9leHRfbiwgZnJhbWVfcmF0ZV9leHRfZDsKKyAgICBpbnQgdG9wX2ZpZWxkX2ZpcnN0LCByZXBlYXRfZmlyc3RfZmllbGQsIHByb2dyZXNzaXZlX2ZyYW1lOworICAgIGludCBob3Jpel9zaXplX2V4dCwgdmVydF9zaXplX2V4dCwgYml0X3JhdGVfZXh0OworICAgIGludCBkaWRfc2V0X3NpemU9MDsKKyAgICBpbnQgYml0X3JhdGUgPSAwOworICAgIGludCB2YnZfZGVsYXkgPSAwOworLy9GSVhNRSByZXBsYWNlIHRoZSBjcmFwIHdpdGggZ2V0X2JpdHMoKQorICAgIHMtPnJlcGVhdF9waWN0ID0gMDsKKworICAgIHdoaWxlIChidWYgPCBidWZfZW5kKSB7CisgICAgICAgIHN0YXJ0X2NvZGU9IC0xOworICAgICAgICBidWY9IGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUoYnVmLCBidWZfZW5kLCAmc3RhcnRfY29kZSk7CisgICAgICAgIGJ5dGVzX2xlZnQgPSBidWZfZW5kIC0gYnVmOworICAgICAgICBzd2l0Y2goc3RhcnRfY29kZSkgeworICAgICAgICBjYXNlIFBJQ1RVUkVfU1RBUlRfQ09ERToKKyAgICAgICAgICAgIGlmIChieXRlc19sZWZ0ID49IDIpIHsKKyAgICAgICAgICAgICAgICBzLT5waWN0X3R5cGUgPSAoYnVmWzFdID4+IDMpICYgNzsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNfbGVmdCA+PSA0KQorICAgICAgICAgICAgICAgIHZidl9kZWxheSA9ICgoYnVmWzFdICYgMHgwNykgPDwgMTMpIHwgKGJ1ZlsyXSA8PCA1KSB8IChidWZbM10gID4+IDMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0VRX1NUQVJUX0NPREU6CisgICAgICAgICAgICBpZiAoYnl0ZXNfbGVmdCA+PSA3KSB7CisgICAgICAgICAgICAgICAgcGMtPndpZHRoICA9IChidWZbMF0gPDwgNCkgfCAoYnVmWzFdID4+IDQpOworICAgICAgICAgICAgICAgIHBjLT5oZWlnaHQgPSAoKGJ1ZlsxXSAmIDB4MGYpIDw8IDgpIHwgYnVmWzJdOworICAgICAgICAgICAgICAgIGlmKCFhdmN0eC0+d2lkdGggfHwgIWF2Y3R4LT5oZWlnaHQgfHwgIWF2Y3R4LT5jb2RlZF93aWR0aCB8fCAhYXZjdHgtPmNvZGVkX2hlaWdodCl7CisgICAgICAgICAgICAgICAgICAgIGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBwYy0+d2lkdGgsIHBjLT5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBkaWRfc2V0X3NpemU9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJhbWVfcmF0ZV9pbmRleCA9IGJ1ZlszXSAmIDB4ZjsKKyAgICAgICAgICAgICAgICBwYy0+ZnJhbWVfcmF0ZSA9IGF2Y3R4LT5mcmFtZXJhdGUgPSBmZl9tcGVnMTJfZnJhbWVfcmF0ZV90YWJbZnJhbWVfcmF0ZV9pbmRleF07CisgICAgICAgICAgICAgICAgYml0X3JhdGUgPSAoYnVmWzRdPDwxMCkgfCAoYnVmWzVdPDwyKSB8IChidWZbNl0+PjYpOworICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QRUcxVklERU87CisgICAgICAgICAgICAgICAgYXZjdHgtPnRpY2tzX3Blcl9mcmFtZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFWFRfU1RBUlRfQ09ERToKKyAgICAgICAgICAgIGlmIChieXRlc19sZWZ0ID49IDEpIHsKKyAgICAgICAgICAgICAgICBleHRfdHlwZSA9IChidWZbMF0gPj4gNCk7CisgICAgICAgICAgICAgICAgc3dpdGNoKGV4dF90eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAweDE6IC8qIHNlcXVlbmNlIGV4dGVuc2lvbiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNfbGVmdCA+PSA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBob3Jpel9zaXplX2V4dCA9ICgoYnVmWzFdICYgMSkgPDwgMSkgfCAoYnVmWzJdID4+IDcpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVydF9zaXplX2V4dCA9IChidWZbMl0gPj4gNSkgJiAzOworICAgICAgICAgICAgICAgICAgICAgICAgYml0X3JhdGVfZXh0ID0gKChidWZbMl0gJiAweDFGKTw8NykgfCAoYnVmWzNdPj4xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3JhdGVfZXh0X24gPSAoYnVmWzVdID4+IDUpICYgMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3JhdGVfZXh0X2QgPSAoYnVmWzVdICYgMHgxZik7CisgICAgICAgICAgICAgICAgICAgICAgICBwYy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UgPSBidWZbMV0gJiAoMSA8PCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5oYXNfYl9mcmFtZXM9ICEoYnVmWzVdID4+IDcpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwYy0+d2lkdGggIHw9KGhvcml6X3NpemVfZXh0IDw8IDEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjLT5oZWlnaHQgfD0oIHZlcnRfc2l6ZV9leHQgPDwgMTIpOworICAgICAgICAgICAgICAgICAgICAgICAgYml0X3JhdGUgPSAoYml0X3JhdGUmMHgzRkZGRikgfCAoYml0X3JhdGVfZXh0IDw8IDE4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRpZF9zZXRfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgcGMtPndpZHRoLCBwYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5mcmFtZXJhdGUubnVtID0gcGMtPmZyYW1lX3JhdGUubnVtICogKGZyYW1lX3JhdGVfZXh0X24gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5mcmFtZXJhdGUuZGVuID0gcGMtPmZyYW1lX3JhdGUuZGVuICogKGZyYW1lX3JhdGVfZXh0X2QgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QRUcyVklERU87CisgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+dGlja3NfcGVyX2ZyYW1lID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4ODogLyogcGljdHVyZSBjb2RpbmcgZXh0ZW5zaW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc19sZWZ0ID49IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9maWVsZF9maXJzdCA9IGJ1ZlszXSAmICgxIDw8IDcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0X2ZpcnN0X2ZpZWxkID0gYnVmWzNdICYgKDEgPDwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc2l2ZV9mcmFtZSA9IGJ1Zls0XSAmICgxIDw8IDcpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiB3ZSBtdXN0IHJlcGVhdCB0aGUgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlcGVhdF9waWN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRfZmlyc3RfZmllbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGMtPnByb2dyZXNzaXZlX3NlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3BfZmllbGRfZmlyc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZXBlYXRfcGljdCA9IDU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlcGVhdF9waWN0ID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2dyZXNzaXZlX2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlcGVhdF9waWN0ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGMtPnByb2dyZXNzaXZlX3NlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvcF9maWVsZF9maXJzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmllbGRfb3JkZXIgPSBBVl9GSUVMRF9UVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfQkI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1BST0dSRVNTSVZFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogd2Ugc3RvcCBwYXJzaW5nIHdoZW4gd2UgZW5jb3VudGVyIGEgc2xpY2UuIEl0IGVuc3VyZXMKKyAgICAgICAgICAgICAgIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBhIG5lZ2xpZ2libGUgYW1vdW50IG9mIHRpbWUgKi8KKyAgICAgICAgICAgIGlmIChzdGFydF9jb2RlID49IFNMSUNFX01JTl9TVEFSVF9DT0RFICYmCisgICAgICAgICAgICAgICAgc3RhcnRfY29kZSA8PSBTTElDRV9NQVhfU1RBUlRfQ09ERSkKKyAgICAgICAgICAgICAgICBnb3RvIHRoZV9lbmQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyB0aGVfZW5kOiA7CisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICYmIGJpdF9yYXRlKSB7CisgICAgICAgIGF2Y3R4LT5yY19tYXhfcmF0ZSA9IDQwMCpiaXRfcmF0ZTsKKyAgICB9CisgICAgaWYgKGJpdF9yYXRlICYmCisgICAgICAgICgoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8gJiYgYml0X3JhdGUgIT0gMHgzRkZGRikgfHwgdmJ2X2RlbGF5ICE9IDB4RkZGRikpIHsKKyAgICAgICAgYXZjdHgtPmJpdF9yYXRlID0gNDAwKmJpdF9yYXRlOworICAgIH0KKyNpZiBGRl9BUElfQVZDVFhfVElNRUJBU0UKKyAgICBpZiAoYXZjdHgtPmZyYW1lcmF0ZS5udW0pCisgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UgPSBhdl9pbnZfcShhdl9tdWxfcShhdmN0eC0+ZnJhbWVyYXRlLCAoQVZSYXRpb25hbCl7YXZjdHgtPnRpY2tzX3Blcl9mcmFtZSwgMX0pKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IG1wZWd2aWRlb19wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIHN0cnVjdCBNcHZQYXJzZUNvbnRleHQgKnBjMSA9IHMtPnByaXZfZGF0YTsKKyAgICBQYXJzZUNvbnRleHQgKnBjPSAmcGMxLT5wYzsKKyAgICBpbnQgbmV4dDsKKworICAgIGlmKHMtPmZsYWdzICYgUEFSU0VSX0ZMQUdfQ09NUExFVEVfRlJBTUVTKXsKKyAgICAgICAgbmV4dD0gYnVmX3NpemU7CisgICAgfWVsc2V7CisgICAgICAgIG5leHQ9IGZmX21wZWcxX2ZpbmRfZnJhbWVfZW5kKHBjLCBidWYsIGJ1Zl9zaXplLCBzKTsKKworICAgICAgICBpZiAoZmZfY29tYmluZV9mcmFtZShwYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgICAgICpwb3V0YnVmID0gTlVMTDsKKyAgICAgICAgICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICB9CisKKyAgICB9CisgICAgLyogd2UgaGF2ZSBhIGZ1bGwgZnJhbWUgOiB3ZSBqdXN0IHBhcnNlIHRoZSBmaXJzdCBmZXcgTVBFRyBoZWFkZXJzCisgICAgICAgdG8gaGF2ZSB0aGUgZnVsbCB0aW1pbmcgaW5mb3JtYXRpb24uIFRoZSB0aW1lIHRha2UgYnkgdGhpcworICAgICAgIGZ1bmN0aW9uIHNob3VsZCBiZSBuZWdsaWdpYmxlIGZvciB1bmNvcnJ1cHRlZCBzdHJlYW1zICovCisgICAgbXBlZ3ZpZGVvX2V4dHJhY3RfaGVhZGVycyhzLCBhdmN0eCwgYnVmLCBidWZfc2l6ZSk7CisgICAgYXZfZGxvZyhOVUxMLCAicGljdF90eXBlPSVkIGZyYW1lX3JhdGU9JTAuM2YgcmVwZWF0X3BpY3Q9JWRcbiIsCisgICAgICAgICAgICBzLT5waWN0X3R5cGUsIGF2X3EyZChhdmN0eC0+ZnJhbWVyYXRlKSwgcy0+cmVwZWF0X3BpY3QpOworCisgICAgKnBvdXRidWYgPSBidWY7CisgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIHJldHVybiBuZXh0OworfQorCitzdGF0aWMgaW50IG1wZWd2aWRlb19zcGxpdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50MzJfdCBzdGF0ZT0gLTE7CisgICAgaW50IGZvdW5kPTA7CisKKyAgICBmb3IoaT0wOyBpPGJ1Zl9zaXplOyBpKyspeworICAgICAgICBzdGF0ZT0gKHN0YXRlPDw4KSB8IGJ1ZltpXTsKKyAgICAgICAgaWYoc3RhdGUgPT0gMHgxQjMpeworICAgICAgICAgICAgZm91bmQ9MTsKKyAgICAgICAgfWVsc2UgaWYoZm91bmQgJiYgc3RhdGUgIT0gMHgxQjUgJiYgc3RhdGUgPCAweDIwMCAmJiBzdGF0ZSA+PSAweDEwMCkKKyAgICAgICAgICAgIHJldHVybiBpLTM7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wZWd2aWRlb19wYXJzZV9pbml0KEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzKQoreworICAgIHMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9OT05FOyAvLyBmaXJzdCBmcmFtZSBtaWdodCBiZSBwYXJ0aWFsCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWNQYXJzZXIgZmZfbXBlZ3ZpZGVvX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX01QRUcxVklERU8sIEFWX0NPREVDX0lEX01QRUcyVklERU8gfSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IE1wdlBhcnNlQ29udGV4dCksCisgICAgLnBhcnNlcl9pbml0ICAgID0gbXBlZ3ZpZGVvX3BhcnNlX2luaXQsCisgICAgLnBhcnNlcl9wYXJzZSAgID0gbXBlZ3ZpZGVvX3BhcnNlLAorICAgIC5wYXJzZXJfY2xvc2UgICA9IGZmX3BhcnNlX2Nsb3NlLAorICAgIC5zcGxpdCAgICAgICAgICA9IG1wZWd2aWRlb19zcGxpdCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVndmlkZW9feHZtYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvX3h2bWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDYzMWNiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvX3h2bWMuYwpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIFhWaWRlbyBNb3Rpb24gQ29tcGVuc2F0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSXZhbiBLYWx2YWNoZXYKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1h2TUMuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKworI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAieHZtYy5oIgorI2luY2x1ZGUgInh2bWNfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgYmxvY2sgZmllbGQgb2YgdGhlIE1wZWdFbmNDb250ZXh0IHBvaW50ZXIgcGFzc2VkIGFzCisgKiBwYXJhbWV0ZXIgYWZ0ZXIgbWFraW5nIHN1cmUgdGhhdCB0aGUgZGF0YSBpcyBub3QgY29ycnVwdGVkLgorICogSW4gb3JkZXIgdG8gaW1wbGVtZW50IHNvbWV0aGluZyBsaWtlIGRpcmVjdCByZW5kZXJpbmcgaW5zdGVhZCBvZiBkZWNvZGluZworICogY29lZmZpY2llbnRzIGluIHMtPmJsb2NrcyBhbmQgdGhlbiBjb3B5aW5nIHRoZW0sIGNvcHkgdGhlbSBkaXJlY3RseQorICogaW50byB0aGUgZGF0YV9ibG9ja3MgYXJyYXkgcHJvdmlkZWQgYnkgeHZtYy4KKyAqLwordm9pZCBmZl94dm1jX2luaXRfYmxvY2soTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgc3RydWN0IHh2bWNfcGl4X2ZtdCAqcmVuZGVyID0gKHN0cnVjdCB4dm1jX3BpeF9mbXQqKXMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhWzJdOworICAgIGFzc2VydChyZW5kZXIgJiYgcmVuZGVyLT54dm1jX2lkID09IEFWX1hWTUNfSUQpOworCisgICAgcy0+YmxvY2sgPSAoaW50MTZfdCAoKilbNjRdKShyZW5kZXItPmRhdGFfYmxvY2tzICsgcmVuZGVyLT5uZXh0X2ZyZWVfZGF0YV9ibG9ja19udW0gKiA2NCk7Cit9CisKK3N0YXRpYyB2b2lkIGV4Y2hhbmdlX3V2KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludDE2X3QgKCp0bXApWzY0XTsKKworICAgIHRtcCAgICAgICAgICAgPSBzLT5wYmxvY2tzWzRdOworICAgIHMtPnBibG9ja3NbNF0gPSBzLT5wYmxvY2tzWzVdOworICAgIHMtPnBibG9ja3NbNV0gPSB0bXA7Cit9CisKKy8qKgorICogRmlsbCBpbmRpdmlkdWFsIGJsb2NrIHBvaW50ZXJzLCBzbyB0aGVyZSBhcmUgbm8gZ2FwcyBpbiB0aGUgZGF0YV9ibG9jayBhcnJheQorICogaW4gY2FzZSBub3QgYWxsIGJsb2NrcyBpbiB0aGUgbWFjcm9ibG9jayBhcmUgY29kZWQuCisgKi8KK3ZvaWQgZmZfeHZtY19wYWNrX3BibG9ja3MoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBjYnApCit7CisgICAgaW50IGksIGogPSAwOworICAgIGNvbnN0IGludCBtYl9ibG9ja19jb3VudCA9IDQgKyAoMSA8PCBzLT5jaHJvbWFfZm9ybWF0KTsKKworICAgIGNicCA8PD0gMTItbWJfYmxvY2tfY291bnQ7CisgICAgZm9yIChpID0gMDsgaSA8IG1iX2Jsb2NrX2NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGNicCAmICgxIDw8IDExKSkKKyAgICAgICAgICAgIHMtPnBibG9ja3NbaV0gPSAmcy0+YmxvY2tbaisrXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+cGJsb2Nrc1tpXSA9IE5VTEw7CisgICAgICAgIGNicCArPSBjYnA7CisgICAgfQorICAgIGlmIChzLT5zd2FwX3V2KSB7CisgICAgICAgIGV4Y2hhbmdlX3V2KHMpOworICAgIH0KK30KKworLyoqCisgKiBGaW5kIGFuZCBzdG9yZSB0aGUgc3VyZmFjZXMgdGhhdCBhcmUgdXNlZCBhcyByZWZlcmVuY2UgZnJhbWVzLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZvciBldmVyeSBuZXcgZmllbGQgYW5kL29yIGZyYW1lLgorICogSXQgc2hvdWxkIGJlIHNhZmUgdG8gY2FsbCB0aGUgZnVuY3Rpb24gYSBmZXcgdGltZXMgZm9yIHRoZSBzYW1lIGZpZWxkLgorICovCitzdGF0aWMgaW50IGZmX3h2bWNfZmllbGRfc3RhcnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9zaXplKQoreworICAgIHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IHh2bWNfcGl4X2ZtdCAqbGFzdCwgKm5leHQsICpyZW5kZXIgPSAoc3RydWN0IHh2bWNfcGl4X2ZtdCopcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMl07CisgICAgY29uc3QgaW50IG1iX2Jsb2NrX2NvdW50ID0gNCArICgxIDw8IHMtPmNocm9tYV9mb3JtYXQpOworCisgICAgYXNzZXJ0KGF2Y3R4KTsKKyAgICBpZiAoIXJlbmRlciB8fCByZW5kZXItPnh2bWNfaWQgIT0gQVZfWFZNQ19JRCB8fAorICAgICAgICAhcmVuZGVyLT5kYXRhX2Jsb2NrcyB8fCAhcmVuZGVyLT5tdl9ibG9ja3MgfHwKKyAgICAgICAgKHVuc2lnbmVkIGludClyZW5kZXItPmFsbG9jYXRlZF9tdl9ibG9ja3MgICA+IElOVF9NQVgvKDY0KjYpIHx8CisgICAgICAgICh1bnNpZ25lZCBpbnQpcmVuZGVyLT5hbGxvY2F0ZWRfZGF0YV9ibG9ja3MgPiBJTlRfTUFYLzY0ICAgICB8fAorICAgICAgICAhcmVuZGVyLT5wX3N1cmZhY2UpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiUmVuZGVyIHRva2VuIGRvZXNuJ3QgbG9vayBhcyBleHBlY3RlZC5cbiIpOworICAgICAgICByZXR1cm4gLTE7IC8vIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgYSByZW5kZXIgcGFja2V0CisgICAgfQorCisgICAgaWYgKHJlbmRlci0+ZmlsbGVkX212X2Jsb2Nrc19udW0pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiUmVuZGVyaW5nIHN1cmZhY2UgY29udGFpbnMgJWkgdW5wcm9jZXNzZWQgYmxvY2tzLlxuIiwKKyAgICAgICAgICAgICAgIHJlbmRlci0+ZmlsbGVkX212X2Jsb2Nrc19udW0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyZW5kZXItPmFsbG9jYXRlZF9tdl9ibG9ja3MgICA8IDEgfHwKKyAgICAgICAgcmVuZGVyLT5hbGxvY2F0ZWRfZGF0YV9ibG9ja3MgPCAgcmVuZGVyLT5hbGxvY2F0ZWRfbXZfYmxvY2tzKm1iX2Jsb2NrX2NvdW50IHx8CisgICAgICAgIHJlbmRlci0+c3RhcnRfbXZfYmxvY2tzX251bSAgID49IHJlbmRlci0+YWxsb2NhdGVkX212X2Jsb2NrcyAgICAgICAgICAgICAgICB8fAorICAgICAgICByZW5kZXItPm5leHRfZnJlZV9kYXRhX2Jsb2NrX251bSA+CisgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXItPmFsbG9jYXRlZF9kYXRhX2Jsb2NrcyAtCisgICAgICAgICAgICAgICAgICAgICAgICBtYl9ibG9ja19jb3VudCoocmVuZGVyLT5hbGxvY2F0ZWRfbXZfYmxvY2tzLXJlbmRlci0+c3RhcnRfbXZfYmxvY2tzX251bSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiUmVuZGVyaW5nIHN1cmZhY2UgZG9lc24ndCBwcm92aWRlIGVub3VnaCBibG9jayBzdHJ1Y3R1cmVzIHRvIHdvcmsgd2l0aC5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmVuZGVyLT5waWN0dXJlX3N0cnVjdHVyZSA9IHMtPnBpY3R1cmVfc3RydWN0dXJlOworICAgIHJlbmRlci0+ZmxhZ3MgICAgICAgICAgICAgPSBzLT5maXJzdF9maWVsZCA/IDAgOiBYVk1DX1NFQ09ORF9GSUVMRDsKKyAgICByZW5kZXItPnBfZnV0dXJlX3N1cmZhY2UgID0gTlVMTDsKKyAgICByZW5kZXItPnBfcGFzdF9zdXJmYWNlICAgID0gTlVMTDsKKworICAgIHN3aXRjaChzLT5waWN0X3R5cGUpIHsKKyAgICAgICAgY2FzZSAgQVZfUElDVFVSRV9UWVBFX0k6CisgICAgICAgICAgICByZXR1cm4gMDsgLy8gbm8gcHJlZGljdGlvbiBmcm9tIG90aGVyIGZyYW1lcworICAgICAgICBjYXNlICBBVl9QSUNUVVJFX1RZUEVfQjoKKyAgICAgICAgICAgIG5leHQgPSAoc3RydWN0IHh2bWNfcGl4X2ZtdCopcy0+bmV4dF9waWN0dXJlLmYtPmRhdGFbMl07CisgICAgICAgICAgICBpZiAoIW5leHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKG5leHQtPnh2bWNfaWQgIT0gQVZfWFZNQ19JRCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZW5kZXItPnBfZnV0dXJlX3N1cmZhY2UgPSBuZXh0LT5wX3N1cmZhY2U7CisgICAgICAgICAgICAvLyBubyByZXR1cm4gaGVyZSwgZ29pbmcgdG8gc2V0IGZvcndhcmQgcHJlZGljdGlvbgorICAgICAgICBjYXNlICBBVl9QSUNUVVJFX1RZUEVfUDoKKyAgICAgICAgICAgIGxhc3QgPSAoc3RydWN0IHh2bWNfcGl4X2ZtdCopcy0+bGFzdF9waWN0dXJlLmYtPmRhdGFbMl07CisgICAgICAgICAgICBpZiAoIWxhc3QpCisgICAgICAgICAgICAgICAgbGFzdCA9IHJlbmRlcjsgLy8gcHJlZGljdCBzZWNvbmQgZmllbGQgZnJvbSB0aGUgZmlyc3QKKyAgICAgICAgICAgIGlmIChsYXN0LT54dm1jX2lkICE9IEFWX1hWTUNfSUQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmVuZGVyLT5wX3Bhc3Rfc3VyZmFjZSA9IGxhc3QtPnBfc3VyZmFjZTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworcmV0dXJuIC0xOworfQorCisvKioKKyAqIENvbXBsZXRlIGZyYW1lL2ZpZWxkIHJlbmRlcmluZyBieSBwYXNzaW5nIGFueSByZW1haW5pbmcgYmxvY2tzLgorICogTm9ybWFsbHkgZmZfZHJhd19ob3Jpel9iYW5kKCkgaXMgY2FsbGVkIGZvciBlYWNoIHNsaWNlLCBob3dldmVyLAorICogc29tZSBsZWZ0b3ZlciBibG9ja3MsIGZvciBleGFtcGxlIGZyb20gZXJyb3JfcmVzaWxpZW5jZSgpLCBtYXkgcmVtYWluLgorICogSXQgc2hvdWxkIGJlIHNhZmUgdG8gY2FsbCB0aGUgZnVuY3Rpb24gYSBmZXcgdGltZXMgZm9yIHRoZSBzYW1lIGZpZWxkLgorICovCitzdGF0aWMgaW50IGZmX3h2bWNfZmllbGRfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCB4dm1jX3BpeF9mbXQgKnJlbmRlciA9IChzdHJ1Y3QgeHZtY19waXhfZm10KilzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVsyXTsKKyAgICBhc3NlcnQocmVuZGVyKTsKKworICAgIGlmIChyZW5kZXItPmZpbGxlZF9tdl9ibG9ja3NfbnVtID4gMCkKKyAgICAgICAgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQocywgMCwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogU3ludGhlc2l6ZSB0aGUgZGF0YSBuZWVkZWQgYnkgWHZNQyB0byByZW5kZXIgb25lIG1hY3JvYmxvY2sgb2YgZGF0YS4KKyAqIEZpbGwgYWxsIHJlbGV2YW50IGZpZWxkcywgaWYgbmVjZXNzYXJ5IGRvIElEQ1QuCisgKi8KK3N0YXRpYyB2b2lkIGZmX3h2bWNfZGVjb2RlX21iKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBYdk1DTWFjcm9CbG9jayAqbXZfYmxvY2s7CisgICAgc3RydWN0IHh2bWNfcGl4X2ZtdCAqcmVuZGVyOworICAgIGludCBpLCBjYnAsIGJsb2Nrc19wZXJfbWI7CisKKyAgICBjb25zdCBpbnQgbWJfeHkgPSBzLT5tYl95ICogcy0+bWJfc3RyaWRlICsgcy0+bWJfeDsKKworCisgICAgaWYgKHMtPmVuY29kaW5nKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiWFZNQyBkb2Vzbid0IHN1cHBvcnQgZW5jb2RpbmchISFcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gZnJvbSBmZl9tcHZfZGVjb2RlX21iKCksIHVwZGF0ZSBEQyBwcmVkaWN0b3JzIGZvciBQIG1hY3JvYmxvY2tzCisgICAgaWYgKCFzLT5tYl9pbnRyYSkgeworICAgICAgICBzLT5sYXN0X2RjWzBdID0KKyAgICAgICAgcy0+bGFzdF9kY1sxXSA9CisgICAgICAgIHMtPmxhc3RfZGNbMl0gPSAgMTI4IDw8IHMtPmludHJhX2RjX3ByZWNpc2lvbjsKKyAgICB9CisKKyAgICAvLyBNQyBkb2Vzbid0IHNraXAgYmxvY2tzCisgICAgcy0+bWJfc2tpcHBlZCA9IDA7CisKKworICAgIC8vIERvIEkgbmVlZCB0byBleHBvcnQgcXVhbnQgd2hlbiBJIGNvdWxkIG5vdCBwZXJmb3JtIHBvc3Rwcm9jZXNzaW5nPworICAgIC8vIEFueXdheSwgaXQgZG9lc24ndCBodXJ0LgorICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfeHldID0gcy0+cXNjYWxlOworCisgICAgLy8gc3RhcnQgb2YgWFZNQy1zcGVjaWZpYyBjb2RlCisgICAgcmVuZGVyID0gKHN0cnVjdCB4dm1jX3BpeF9mbXQqKXMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhWzJdOworICAgIGFzc2VydChyZW5kZXIpOworICAgIGFzc2VydChyZW5kZXItPnh2bWNfaWQgPT0gQVZfWFZNQ19JRCk7CisgICAgYXNzZXJ0KHJlbmRlci0+bXZfYmxvY2tzKTsKKworICAgIC8vIHRha2UgdGhlIG5leHQgZnJlZSBtYWNyb2Jsb2NrCisgICAgbXZfYmxvY2sgPSAmcmVuZGVyLT5tdl9ibG9ja3NbcmVuZGVyLT5zdGFydF9tdl9ibG9ja3NfbnVtICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXItPmZpbGxlZF9tdl9ibG9ja3NfbnVtXTsKKworICAgIG12X2Jsb2NrLT54ICAgICAgICA9IHMtPm1iX3g7CisgICAgbXZfYmxvY2stPnkgICAgICAgID0gcy0+bWJfeTsKKyAgICBtdl9ibG9jay0+ZGN0X3R5cGUgPSBzLT5pbnRlcmxhY2VkX2RjdDsgLy8gWFZNQ19EQ1RfVFlQRV9GUkFNRS9GSUVMRDsKKyAgICBpZiAocy0+bWJfaW50cmEpIHsKKyAgICAgICAgbXZfYmxvY2stPm1hY3JvYmxvY2tfdHlwZSA9IFhWTUNfTUJfVFlQRV9JTlRSQTsgLy8gbm8gTUMsIGFsbCBkb25lCisgICAgfSBlbHNlIHsKKyAgICAgICAgbXZfYmxvY2stPm1hY3JvYmxvY2tfdHlwZSA9IFhWTUNfTUJfVFlQRV9QQVRURVJOOworCisgICAgICAgIGlmIChzLT5tdl9kaXIgJiBNVl9ESVJfRk9SV0FSRCkgeworICAgICAgICAgICAgbXZfYmxvY2stPm1hY3JvYmxvY2tfdHlwZSB8PSBYVk1DX01CX1RZUEVfTU9USU9OX0ZPUldBUkQ7CisgICAgICAgICAgICAvLyBQTVZbbl1bZGlyXVt4eV0gPSBtdltkaXJdW25dW3h5XQorICAgICAgICAgICAgbXZfYmxvY2stPlBNVlswXVswXVswXSA9IHMtPm12WzBdWzBdWzBdOworICAgICAgICAgICAgbXZfYmxvY2stPlBNVlswXVswXVsxXSA9IHMtPm12WzBdWzBdWzFdOworICAgICAgICAgICAgbXZfYmxvY2stPlBNVlsxXVswXVswXSA9IHMtPm12WzBdWzFdWzBdOworICAgICAgICAgICAgbXZfYmxvY2stPlBNVlsxXVswXVsxXSA9IHMtPm12WzBdWzFdWzFdOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5tdl9kaXIgJiBNVl9ESVJfQkFDS1dBUkQpIHsKKyAgICAgICAgICAgIG12X2Jsb2NrLT5tYWNyb2Jsb2NrX3R5cGUgfD0gWFZNQ19NQl9UWVBFX01PVElPTl9CQUNLV0FSRDsKKyAgICAgICAgICAgIG12X2Jsb2NrLT5QTVZbMF1bMV1bMF0gPSBzLT5tdlsxXVswXVswXTsKKyAgICAgICAgICAgIG12X2Jsb2NrLT5QTVZbMF1bMV1bMV0gPSBzLT5tdlsxXVswXVsxXTsKKyAgICAgICAgICAgIG12X2Jsb2NrLT5QTVZbMV1bMV1bMF0gPSBzLT5tdlsxXVsxXVswXTsKKyAgICAgICAgICAgIG12X2Jsb2NrLT5QTVZbMV1bMV1bMV0gPSBzLT5tdlsxXVsxXVsxXTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChzLT5tdl90eXBlKSB7CisgICAgICAgICAgICBjYXNlICBNVl9UWVBFXzE2WDE2OgorICAgICAgICAgICAgICAgIG12X2Jsb2NrLT5tb3Rpb25fdHlwZSA9IFhWTUNfUFJFRElDVElPTl9GUkFNRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIE1WX1RZUEVfMTZYODoKKyAgICAgICAgICAgICAgICBtdl9ibG9jay0+bW90aW9uX3R5cGUgPSBYVk1DX1BSRURJQ1RJT05fMTZ4ODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIE1WX1RZUEVfRklFTEQ6CisgICAgICAgICAgICAgICAgbXZfYmxvY2stPm1vdGlvbl90eXBlID0gWFZNQ19QUkVESUNUSU9OX0ZJRUxEOworICAgICAgICAgICAgICAgIGlmIChzLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgICAgIG12X2Jsb2NrLT5QTVZbMF1bMF1bMV0gPDw9IDE7CisgICAgICAgICAgICAgICAgICAgIG12X2Jsb2NrLT5QTVZbMV1bMF1bMV0gPDw9IDE7CisgICAgICAgICAgICAgICAgICAgIG12X2Jsb2NrLT5QTVZbMF1bMV1bMV0gPDw9IDE7CisgICAgICAgICAgICAgICAgICAgIG12X2Jsb2NrLT5QTVZbMV1bMV1bMV0gPDw9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAgTVZfVFlQRV9ETVY6CisgICAgICAgICAgICAgICAgbXZfYmxvY2stPm1vdGlvbl90eXBlID0gWFZNQ19QUkVESUNUSU9OX0RVQUxfUFJJTUU7CisgICAgICAgICAgICAgICAgaWYgKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpIHsKKworICAgICAgICAgICAgICAgICAgICBtdl9ibG9jay0+UE1WWzBdWzBdWzBdID0gcy0+bXZbMF1bMF1bMF07ICAgICAgLy8gdG9wIGZyb20gdG9wCisgICAgICAgICAgICAgICAgICAgIG12X2Jsb2NrLT5QTVZbMF1bMF1bMV0gPSBzLT5tdlswXVswXVsxXSA8PCAxOworCisgICAgICAgICAgICAgICAgICAgIG12X2Jsb2NrLT5QTVZbMF1bMV1bMF0gPSBzLT5tdlswXVswXVswXTsgICAgICAvLyBib3R0b20gZnJvbSBib3R0b20KKyAgICAgICAgICAgICAgICAgICAgbXZfYmxvY2stPlBNVlswXVsxXVsxXSA9IHMtPm12WzBdWzBdWzFdIDw8IDE7CisKKyAgICAgICAgICAgICAgICAgICAgbXZfYmxvY2stPlBNVlsxXVswXVswXSA9IHMtPm12WzBdWzJdWzBdOyAgICAgIC8vIGRtdjAwLCB0b3AgZnJvbSBib3R0b20KKyAgICAgICAgICAgICAgICAgICAgbXZfYmxvY2stPlBNVlsxXVswXVsxXSA9IHMtPm12WzBdWzJdWzFdIDw8IDE7IC8vIGRtdjAxCisKKyAgICAgICAgICAgICAgICAgICAgbXZfYmxvY2stPlBNVlsxXVsxXVswXSA9IHMtPm12WzBdWzNdWzBdOyAgICAgIC8vIGRtdjEwLCBib3R0b20gZnJvbSB0b3AKKyAgICAgICAgICAgICAgICAgICAgbXZfYmxvY2stPlBNVlsxXVsxXVsxXSA9IHMtPm12WzBdWzNdWzFdIDw8IDE7IC8vIGRtdjExCisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtdl9ibG9jay0+UE1WWzBdWzFdWzBdID0gcy0+bXZbMF1bMl1bMF07ICAgICAgLy8gZG12MDAKKyAgICAgICAgICAgICAgICAgICAgbXZfYmxvY2stPlBNVlswXVsxXVsxXSA9IHMtPm12WzBdWzJdWzFdOyAgICAgIC8vIGRtdjAxCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIH0KKworICAgICAgICBtdl9ibG9jay0+bW90aW9uX3ZlcnRpY2FsX2ZpZWxkX3NlbGVjdCA9IDA7CisKKyAgICAgICAgLy8gc2V0IGNvcnJlY3QgZmllbGQgcmVmZXJlbmNlcworICAgICAgICBpZiAocy0+bXZfdHlwZSA9PSBNVl9UWVBFX0ZJRUxEIHx8IHMtPm12X3R5cGUgPT0gTVZfVFlQRV8xNlg4KSB7CisgICAgICAgICAgICBtdl9ibG9jay0+bW90aW9uX3ZlcnRpY2FsX2ZpZWxkX3NlbGVjdCB8PSBzLT5maWVsZF9zZWxlY3RbMF1bMF07CisgICAgICAgICAgICBtdl9ibG9jay0+bW90aW9uX3ZlcnRpY2FsX2ZpZWxkX3NlbGVjdCB8PSBzLT5maWVsZF9zZWxlY3RbMV1bMF0gPDwgMTsKKyAgICAgICAgICAgIG12X2Jsb2NrLT5tb3Rpb25fdmVydGljYWxfZmllbGRfc2VsZWN0IHw9IHMtPmZpZWxkX3NlbGVjdFswXVsxXSA8PCAyOworICAgICAgICAgICAgbXZfYmxvY2stPm1vdGlvbl92ZXJ0aWNhbF9maWVsZF9zZWxlY3QgfD0gcy0+ZmllbGRfc2VsZWN0WzFdWzFdIDw8IDM7CisgICAgICAgIH0KKyAgICB9IC8vICFpbnRyYQorICAgIC8vIHRpbWUgdG8gaGFuZGxlIGRhdGEgYmxvY2tzCisgICAgbXZfYmxvY2stPmluZGV4ID0gcmVuZGVyLT5uZXh0X2ZyZWVfZGF0YV9ibG9ja19udW07CisKKyAgICBibG9ja3NfcGVyX21iID0gNjsKKyAgICBpZiAocy0+Y2hyb21hX2Zvcm1hdCA+PSAyKSB7CisgICAgICAgIGJsb2Nrc19wZXJfbWIgPSA0ICsgKDEgPDwgcy0+Y2hyb21hX2Zvcm1hdCk7CisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIGNicAorICAgIGNicCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGJsb2Nrc19wZXJfbWI7IGkrKykgeworICAgICAgICBjYnAgKz0gY2JwOworICAgICAgICBpZiAocy0+YmxvY2tfbGFzdF9pbmRleFtpXSA+PSAwKQorICAgICAgICAgICAgY2JwKys7CisgICAgfQorCisgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSB7CisgICAgICAgIGlmIChzLT5tYl9pbnRyYSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cmEgZnJhbWVzIGFyZSBhbHdheXMgZnVsbCBjaHJvbWEgYmxvY2tzCisgICAgICAgICAgICBmb3IgKGkgPSA0OyBpIDwgYmxvY2tzX3Blcl9tYjsgaSsrKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHMtPnBibG9ja3NbaV0sIDAsIHNpemVvZigqcy0+cGJsb2Nrc1tpXSkpOyAgLy8gc28gd2UgbmVlZCB0byBjbGVhciB0aGVtCisgICAgICAgICAgICAgICAgaWYgKCFyZW5kZXItPnVuc2lnbmVkX2ludHJhKQorICAgICAgICAgICAgICAgICAgICAqcy0+cGJsb2Nrc1tpXVswXSA9IDEgPDwgMTA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYnAgJj0gMHhmIDw8IChibG9ja3NfcGVyX21iIC0gNCk7CisgICAgICAgICAgICBibG9ja3NfcGVyX21iID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbHVtaW5hbmNlIGJsb2NrcyBvbmx5CisgICAgICAgIH0KKyAgICB9CisgICAgbXZfYmxvY2stPmNvZGVkX2Jsb2NrX3BhdHRlcm4gPSBjYnA7CisgICAgaWYgKGNicCA9PSAwKQorICAgICAgICBtdl9ibG9jay0+bWFjcm9ibG9ja190eXBlICY9IH5YVk1DX01CX1RZUEVfUEFUVEVSTjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3NfcGVyX21iOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPj0gMCkgeworICAgICAgICAgICAgLy8gSSBkbyBub3QgaGF2ZSB1bnNpZ25lZF9pbnRyYSBNT0NPIHRvIHRlc3QsIGhvcGUgaXQgaXMgT0suCisgICAgICAgICAgICBpZiAocy0+bWJfaW50cmEgJiYgKHJlbmRlci0+aWRjdCB8fCAhcmVuZGVyLT51bnNpZ25lZF9pbnRyYSkpCisgICAgICAgICAgICAgICAgKnMtPnBibG9ja3NbaV1bMF0gLT0gMSA8PCAxMDsKKyAgICAgICAgICAgIGlmICghcmVuZGVyLT5pZGN0KSB7CisgICAgICAgICAgICAgICAgcy0+aWRzcC5pZGN0KCpzLT5wYmxvY2tzW2ldKTsKKyAgICAgICAgICAgICAgICAvKiBJdCBpcyB1bmNsZWFyIGlmIE1DIGhhcmR3YXJlIHJlcXVpcmVzIHBpeGVsIGRpZmYgdmFsdWVzIHRvIGJlCisgICAgICAgICAgICAgICAgICogaW4gdGhlIHJhbmdlIFstMjU1OzI1NV0uIFRPRE86IENsaXBwaW5nIGlmIHN1Y2ggaGFyZHdhcmUgaXMKKyAgICAgICAgICAgICAgICAgKiBldmVyIGZvdW5kLiBBcyBvZiBub3cgaXQgd291bGQgb25seSBiZSBhbiB1bm5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAqIHNsb3dkb3duLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY29weSBibG9ja3Mgb25seSBpZiB0aGUgY29kZWMgZG9lc24ndCBzdXBwb3J0IHBibG9ja3MgcmVvcmRlcmluZworICAgICAgICAgICAgaWYgKCFzLT5wYWNrX3BibG9ja3MpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnJlbmRlci0+ZGF0YV9ibG9ja3NbcmVuZGVyLT5uZXh0X2ZyZWVfZGF0YV9ibG9ja19udW0qNjRdLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5wYmxvY2tzW2ldLCBzaXplb2YoKnMtPnBibG9ja3NbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbmRlci0+bmV4dF9mcmVlX2RhdGFfYmxvY2tfbnVtKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVuZGVyLT5maWxsZWRfbXZfYmxvY2tzX251bSsrOworCisgICAgYXNzZXJ0KHJlbmRlci0+ZmlsbGVkX212X2Jsb2Nrc19udW0gICAgIDw9IHJlbmRlci0+YWxsb2NhdGVkX212X2Jsb2Nrcyk7CisgICAgYXNzZXJ0KHJlbmRlci0+bmV4dF9mcmVlX2RhdGFfYmxvY2tfbnVtIDw9IHJlbmRlci0+YWxsb2NhdGVkX2RhdGFfYmxvY2tzKTsKKyAgICAvKiBUaGUgYWJvdmUgY29uZGl0aW9ucyBzaG91bGQgbm90IGJlIGFibGUgdG8gZmFpbCBhcyBsb25nIGFzIHRoaXMgZnVuY3Rpb24KKyAgICAgKiBpcyB1c2VkIGFuZCB0aGUgZm9sbG93aW5nICdpZiAoKScgYXV0b21hdGljYWxseSBjYWxscyBhIGNhbGxiYWNrIHRvIGZyZWUKKyAgICAgKiBibG9ja3MuICovCisKKworICAgIGlmIChyZW5kZXItPmZpbGxlZF9tdl9ibG9ja3NfbnVtID09IHJlbmRlci0+YWxsb2NhdGVkX212X2Jsb2NrcykKKyAgICAgICAgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQocywgMCwgMCk7Cit9CisKKyNpZiBDT05GSUdfTVBFRzFfWFZNQ19IV0FDQ0VMCitBVkhXQWNjZWwgZmZfbXBlZzFfeHZtY19od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVnMV94dm1jIiwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzFWSURFTywKKyAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1hWTUMsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gZmZfeHZtY19maWVsZF9zdGFydCwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSBmZl94dm1jX2ZpZWxkX2VuZCwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSBOVUxMLAorICAgIC5kZWNvZGVfbWIgICAgICA9IGZmX3h2bWNfZGVjb2RlX21iLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IDAsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfTVBFRzJfWFZNQ19IV0FDQ0VMCitBVkhXQWNjZWwgZmZfbXBlZzJfeHZtY19od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVnMl94dm1jIiwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFTywKKyAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1hWTUMsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gZmZfeHZtY19maWVsZF9zdGFydCwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSBmZl94dm1jX2ZpZWxkX2VuZCwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSBOVUxMLAorICAgIC5kZWNvZGVfbWIgICAgICA9IGZmX3h2bWNfZGVjb2RlX21iLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IDAsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVndmlkZW9kc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWd2aWRlb2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OGU0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVndmlkZW9kc3AuYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvZHNwLmgiCisKK3N0YXRpYyB2b2lkIGdtYzFfYyh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCisgICAgICAgICAgICAgICAgICAgaW50IHgxNiwgaW50IHkxNiwgaW50IHJvdW5kZXIpCit7CisgICAgY29uc3QgaW50IEEgPSAoMTYgLSB4MTYpICogKDE2IC0geTE2KTsKKyAgICBjb25zdCBpbnQgQiA9ICh4MTYpICAgICAgKiAoMTYgLSB5MTYpOworICAgIGNvbnN0IGludCBDID0gKDE2IC0geDE2KSAqICh5MTYpOworICAgIGNvbnN0IGludCBEID0gKHgxNikgICAgICAqICh5MTYpOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBkc3RbMF0gPSAoQSAqIHNyY1swXSArIEIgKiBzcmNbMV0gKyBDICogc3JjW3N0cmlkZSArIDBdICsgRCAqIHNyY1tzdHJpZGUgKyAxXSArIHJvdW5kZXIpID4+IDg7CisgICAgICAgIGRzdFsxXSA9IChBICogc3JjWzFdICsgQiAqIHNyY1syXSArIEMgKiBzcmNbc3RyaWRlICsgMV0gKyBEICogc3JjW3N0cmlkZSArIDJdICsgcm91bmRlcikgPj4gODsKKyAgICAgICAgZHN0WzJdID0gKEEgKiBzcmNbMl0gKyBCICogc3JjWzNdICsgQyAqIHNyY1tzdHJpZGUgKyAyXSArIEQgKiBzcmNbc3RyaWRlICsgM10gKyByb3VuZGVyKSA+PiA4OworICAgICAgICBkc3RbM10gPSAoQSAqIHNyY1szXSArIEIgKiBzcmNbNF0gKyBDICogc3JjW3N0cmlkZSArIDNdICsgRCAqIHNyY1tzdHJpZGUgKyA0XSArIHJvdW5kZXIpID4+IDg7CisgICAgICAgIGRzdFs0XSA9IChBICogc3JjWzRdICsgQiAqIHNyY1s1XSArIEMgKiBzcmNbc3RyaWRlICsgNF0gKyBEICogc3JjW3N0cmlkZSArIDVdICsgcm91bmRlcikgPj4gODsKKyAgICAgICAgZHN0WzVdID0gKEEgKiBzcmNbNV0gKyBCICogc3JjWzZdICsgQyAqIHNyY1tzdHJpZGUgKyA1XSArIEQgKiBzcmNbc3RyaWRlICsgNl0gKyByb3VuZGVyKSA+PiA4OworICAgICAgICBkc3RbNl0gPSAoQSAqIHNyY1s2XSArIEIgKiBzcmNbN10gKyBDICogc3JjW3N0cmlkZSArIDZdICsgRCAqIHNyY1tzdHJpZGUgKyA3XSArIHJvdW5kZXIpID4+IDg7CisgICAgICAgIGRzdFs3XSA9IChBICogc3JjWzddICsgQiAqIHNyY1s4XSArIEMgKiBzcmNbc3RyaWRlICsgN10gKyBEICogc3JjW3N0cmlkZSArIDhdICsgcm91bmRlcikgPj4gODsKKyAgICAgICAgZHN0ICAgKz0gc3RyaWRlOworICAgICAgICBzcmMgICArPSBzdHJpZGU7CisgICAgfQorfQorCit2b2lkIGZmX2dtY19jKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IG94LCBpbnQgb3ksCisgICAgICAgICAgICAgIGludCBkeHgsIGludCBkeHksIGludCBkeXgsIGludCBkeXksIGludCBzaGlmdCwgaW50IHIsCisgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgeSwgdngsIHZ5OworICAgIGNvbnN0IGludCBzID0gMSA8PCBzaGlmdDsKKworICAgIHdpZHRoLS07CisgICAgaGVpZ2h0LS07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGludCB4OworCisgICAgICAgIHZ4ID0gb3g7CisgICAgICAgIHZ5ID0gb3k7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsgLy8gRklYTUU6IG9wdGltaXplCisgICAgICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgICAgICBpbnQgc3JjX3ggID0gdnggPj4gMTY7CisgICAgICAgICAgICBpbnQgc3JjX3kgID0gdnkgPj4gMTY7CisgICAgICAgICAgICBpbnQgZnJhY194ID0gc3JjX3ggJiAocyAtIDEpOworICAgICAgICAgICAgaW50IGZyYWNfeSA9IHNyY195ICYgKHMgLSAxKTsKKworICAgICAgICAgICAgc3JjX3ggPj49IHNoaWZ0OworICAgICAgICAgICAgc3JjX3kgPj49IHNoaWZ0OworCisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSBzcmNfeCA8IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkgc3JjX3kgPCBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBzcmNfeCArIHNyY195ICogc3RyaWRlOworICAgICAgICAgICAgICAgICAgICBkc3RbeSAqIHN0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW2luZGV4XSAgICAgICAgICAgICAgICAgICAgICAgICogKHMgLSBmcmFjX3gpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW2luZGV4ICsgMV0gICAgICAgICAgKiBmcmFjX3gpICogKHMgLSBmcmFjX3kpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjW2luZGV4ICsgc3RyaWRlXSAgICAgICAgICAgICAgICogKHMgLSBmcmFjX3gpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW2luZGV4ICsgc3RyaWRlICsgMV0gKiBmcmFjX3gpICogICAgICBmcmFjX3kgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICByKSA+PiAoc2hpZnQgKiAyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHNyY194ICsgYXZfY2xpcChzcmNfeSwgMCwgaGVpZ2h0KSAqIHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W3kgKiBzdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tpbmRleF0gICAgICAgICAgICAgICAqIChzIC0gZnJhY194KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tpbmRleCArIDFdICogZnJhY194KSAqICBzICAgICAgICAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgcikgPj4gKHNoaWZ0ICogMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSBzcmNfeSA8IGhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGF2X2NsaXAoc3JjX3gsIDAsIHdpZHRoKSArIHNyY195ICogc3RyaWRlOworICAgICAgICAgICAgICAgICAgICBkc3RbeSAqIHN0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW2luZGV4XSAgICAgICAgICAgICAgICAgICAgKiAocyAtIGZyYWNfeSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbaW5kZXggKyBzdHJpZGVdICogZnJhY195KSAqICBzICAgICAgICAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgcikgPj4gKHNoaWZ0ICogMik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBhdl9jbGlwKHNyY194LCAwLCB3aWR0aCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2NsaXAoc3JjX3ksIDAsIGhlaWdodCkgKiBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIGRzdFt5ICogc3RyaWRlICsgeF0gPSBzcmNbaW5kZXhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdnggKz0gZHh4OworICAgICAgICAgICAgdnkgKz0gZHl4OworICAgICAgICB9CisgICAgICAgIG94ICs9IGR4eTsKKyAgICAgICAgb3kgKz0gZHl5OworICAgIH0KK30KKworYXZfY29sZCB2b2lkIGZmX21wZWd2aWRlb2RzcF9pbml0KE1wZWdWaWRlb0RTUENvbnRleHQgKmMpCit7CisgICAgYy0+Z21jMSA9IGdtYzFfYzsKKyAgICBjLT5nbWMgID0gZmZfZ21jX2M7CisKKyAgICBpZiAoQVJDSF9QUEMpCisgICAgICAgIGZmX21wZWd2aWRlb2RzcF9pbml0X3BwYyhjKTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX21wZWd2aWRlb2RzcF9pbml0X3g4NihjKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21wZWd2aWRlb2RzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzZTI1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWd2aWRlb2RzcC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01QRUdWSURFT0RTUF9ICisjZGVmaW5lIEFWQ09ERUNfTVBFR1ZJREVPRFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIGZmX2dtY19jKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IG94LCBpbnQgb3ksCisgICAgICAgICAgICAgIGludCBkeHgsIGludCBkeHksIGludCBkeXgsIGludCBkeXksIGludCBzaGlmdCwgaW50IHIsCisgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKK3R5cGVkZWYgc3RydWN0IE1wZWdWaWRlb0RTUENvbnRleHQgeworICAgIC8qKgorICAgICAqIHRyYW5zbGF0aW9uYWwgZ2xvYmFsIG1vdGlvbiBjb21wZW5zYXRpb24uCisgICAgICovCisgICAgdm9pZCAoKmdtYzEpKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiA4ICovLCB1aW50OF90ICpzcmMgLyogYWxpZ24gMSAqLywKKyAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZSwgaW50IGgsIGludCB4MTYsIGludCB5MTYsIGludCByb3VuZGVyKTsKKyAgICAvKioKKyAgICAgKiBnbG9iYWwgbW90aW9uIGNvbXBlbnNhdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkICgqZ21jKSh1aW50OF90ICpkc3QgLyogYWxpZ24gOCAqLywgdWludDhfdCAqc3JjIC8qIGFsaWduIDEgKi8sCisgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCBveCwgaW50IG95LAorICAgICAgICAgICAgICAgIGludCBkeHgsIGludCBkeHksIGludCBkeXgsIGludCBkeXksCisgICAgICAgICAgICAgICAgaW50IHNoaWZ0LCBpbnQgciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK30gTXBlZ1ZpZGVvRFNQQ29udGV4dDsKKwordm9pZCBmZl9tcGVndmlkZW9kc3BfaW5pdChNcGVnVmlkZW9EU1BDb250ZXh0ICpjKTsKK3ZvaWQgZmZfbXBlZ3ZpZGVvZHNwX2luaXRfcHBjKE1wZWdWaWRlb0RTUENvbnRleHQgKmMpOwordm9pZCBmZl9tcGVndmlkZW9kc3BfaW5pdF94ODYoTXBlZ1ZpZGVvRFNQQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX01QRUdWSURFT0RTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVndmlkZW9lbmNkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWd2aWRlb2VuY2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MGMyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVndmlkZW9lbmNkc3AuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbWdjb252ZXJ0LmgiCisjaW5jbHVkZSAibWVfY21wLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvZW5jZHNwLmgiCisKK3N0YXRpYyBpbnQgdHJ5Xzh4OGJhc2lzX2MoaW50MTZfdCByZW1bNjRdLCBpbnQxNl90IHdlaWdodFs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgYmFzaXNbNjRdLCBpbnQgc2NhbGUpCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgaW50IHN1bSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgOCAqIDg7IGkrKykgeworICAgICAgICBpbnQgYiA9IHJlbVtpXSArICgoYmFzaXNbaV0gKiBzY2FsZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAoQkFTSVNfU0hJRlQgLSBSRUNPTl9TSElGVCAtIDEpKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEJBU0lTX1NISUZUIC0gUkVDT05fU0hJRlQpKTsKKyAgICAgICAgaW50IHcgPSB3ZWlnaHRbaV07CisgICAgICAgIGIgPj49IFJFQ09OX1NISUZUOworICAgICAgICBhdl9hc3NlcnQyKC01MTIgPCBiICYmIGIgPCA1MTIpOworCisgICAgICAgIHN1bSArPSAodyAqIGIpICogKHcgKiBiKSA+PiA0OworICAgIH0KKyAgICByZXR1cm4gc3VtID4+IDI7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF84eDhiYXNpc19jKGludDE2X3QgcmVtWzY0XSwgaW50MTZfdCBiYXNpc1s2NF0sIGludCBzY2FsZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4ICogODsgaSsrKQorICAgICAgICByZW1baV0gKz0gKGJhc2lzW2ldICogc2NhbGUgKworICAgICAgICAgICAgICAgICAgICgxIDw8IChCQVNJU19TSElGVCAtIFJFQ09OX1NISUZUIC0gMSkpKSA+PgorICAgICAgICAgICAgICAgICAgKEJBU0lTX1NISUZUIC0gUkVDT05fU0hJRlQpOworfQorCitzdGF0aWMgaW50IHBpeF9zdW1fYyh1aW50OF90ICpwaXgsIGludCBsaW5lX3NpemUpCit7CisgICAgaW50IHMgPSAwLCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IDgpIHsKKyAgICAgICAgICAgIHMgICArPSBwaXhbMF07CisgICAgICAgICAgICBzICAgKz0gcGl4WzFdOworICAgICAgICAgICAgcyAgICs9IHBpeFsyXTsKKyAgICAgICAgICAgIHMgICArPSBwaXhbM107CisgICAgICAgICAgICBzICAgKz0gcGl4WzRdOworICAgICAgICAgICAgcyAgICs9IHBpeFs1XTsKKyAgICAgICAgICAgIHMgICArPSBwaXhbNl07CisgICAgICAgICAgICBzICAgKz0gcGl4WzddOworICAgICAgICAgICAgcGl4ICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgcGl4ICs9IGxpbmVfc2l6ZSAtIDE2OworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIGludCBwaXhfbm9ybTFfYyh1aW50OF90ICpwaXgsIGludCBsaW5lX3NpemUpCit7CisgICAgaW50IHMgPSAwLCBpLCBqOworICAgIHVpbnQzMl90ICpzcSA9IGZmX3NxdWFyZV90YWIgKyAyNTY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGogKz0gOCkgeworI2lmIDAKKyAgICAgICAgICAgIHMgKz0gc3FbcGl4WzBdXTsKKyAgICAgICAgICAgIHMgKz0gc3FbcGl4WzFdXTsKKyAgICAgICAgICAgIHMgKz0gc3FbcGl4WzJdXTsKKyAgICAgICAgICAgIHMgKz0gc3FbcGl4WzNdXTsKKyAgICAgICAgICAgIHMgKz0gc3FbcGl4WzRdXTsKKyAgICAgICAgICAgIHMgKz0gc3FbcGl4WzVdXTsKKyAgICAgICAgICAgIHMgKz0gc3FbcGl4WzZdXTsKKyAgICAgICAgICAgIHMgKz0gc3FbcGl4WzddXTsKKyNlbHNlCisjaWYgSEFWRV9GQVNUXzY0QklUCisgICAgICAgICAgICByZWdpc3RlciB1aW50NjRfdCB4ID0gKih1aW50NjRfdCAqKSBwaXg7CisgICAgICAgICAgICBzICs9IHNxW3ggICAgICAgICAmIDB4ZmZdOworICAgICAgICAgICAgcyArPSBzcVsoeCA+PiAgOCkgJiAweGZmXTsKKyAgICAgICAgICAgIHMgKz0gc3FbKHggPj4gMTYpICYgMHhmZl07CisgICAgICAgICAgICBzICs9IHNxWyh4ID4+IDI0KSAmIDB4ZmZdOworICAgICAgICAgICAgcyArPSBzcVsoeCA+PiAzMikgJiAweGZmXTsKKyAgICAgICAgICAgIHMgKz0gc3FbKHggPj4gNDApICYgMHhmZl07CisgICAgICAgICAgICBzICs9IHNxWyh4ID4+IDQ4KSAmIDB4ZmZdOworICAgICAgICAgICAgcyArPSBzcVsoeCA+PiA1NikgJiAweGZmXTsKKyNlbHNlCisgICAgICAgICAgICByZWdpc3RlciB1aW50MzJfdCB4ID0gKih1aW50MzJfdCAqKSBwaXg7CisgICAgICAgICAgICBzICs9IHNxW3ggICAgICAgICAmIDB4ZmZdOworICAgICAgICAgICAgcyArPSBzcVsoeCA+PiAgOCkgJiAweGZmXTsKKyAgICAgICAgICAgIHMgKz0gc3FbKHggPj4gMTYpICYgMHhmZl07CisgICAgICAgICAgICBzICs9IHNxWyh4ID4+IDI0KSAmIDB4ZmZdOworICAgICAgICAgICAgeCAgPSAqKHVpbnQzMl90ICopIChwaXggKyA0KTsKKyAgICAgICAgICAgIHMgKz0gc3FbeCAgICAgICAgICYgMHhmZl07CisgICAgICAgICAgICBzICs9IHNxWyh4ID4+ICA4KSAmIDB4ZmZdOworICAgICAgICAgICAgcyArPSBzcVsoeCA+PiAxNikgJiAweGZmXTsKKyAgICAgICAgICAgIHMgKz0gc3FbKHggPj4gMjQpICYgMHhmZl07CisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICAgcGl4ICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgcGl4ICs9IGxpbmVfc2l6ZSAtIDE2OworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworLyogZHJhdyB0aGUgZWRnZXMgb2Ygd2lkdGggJ3cnIG9mIGFuIGltYWdlIG9mIHNpemUgd2lkdGgsIGhlaWdodCAqLworLy8gRklYTUU6IENoZWNrIHRoYXQgdGhpcyBpcyBPSyBmb3IgTVBFRy00IGludGVybGFjZWQuCitzdGF0aWMgdm9pZCBkcmF3X2VkZ2VzXzhfYyh1aW50OF90ICpidWYsIGludCB3cmFwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzaWRlcykKK3sKKyAgICB1aW50OF90ICpwdHIgPSBidWYsICpsYXN0X2xpbmU7CisgICAgaW50IGk7CisKKyAgICAvKiBsZWZ0IGFuZCByaWdodCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBtZW1zZXQocHRyIC0gdywgcHRyWzBdLCB3KTsKKyAgICAgICAgbWVtc2V0KHB0ciArIHdpZHRoLCBwdHJbd2lkdGggLSAxXSwgdyk7CisgICAgICAgIHB0ciArPSB3cmFwOworICAgIH0KKworICAgIC8qIHRvcCBhbmQgYm90dG9tICsgY29ybmVycyAqLworICAgIGJ1ZiAtPSB3OworICAgIGxhc3RfbGluZSA9IGJ1ZiArIChoZWlnaHQgLSAxKSAqIHdyYXA7CisgICAgaWYgKHNpZGVzICYgRURHRV9UT1ApCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspCisgICAgICAgICAgICAvLyB0b3AKKyAgICAgICAgICAgIG1lbWNweShidWYgLSAoaSArIDEpICogd3JhcCwgYnVmLCB3aWR0aCArIHcgKyB3KTsKKyAgICBpZiAoc2lkZXMgJiBFREdFX0JPVFRPTSkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykKKyAgICAgICAgICAgIC8vIGJvdHRvbQorICAgICAgICAgICAgbWVtY3B5KGxhc3RfbGluZSArIChpICsgMSkgKiB3cmFwLCBsYXN0X2xpbmUsIHdpZHRoICsgdyArIHcpOworfQorCithdl9jb2xkIHZvaWQgZmZfbXBlZ3ZpZGVvZW5jZHNwX2luaXQoTXBlZ3ZpZGVvRW5jRFNQQ29udGV4dCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYy0+dHJ5Xzh4OGJhc2lzID0gdHJ5Xzh4OGJhc2lzX2M7CisgICAgYy0+YWRkXzh4OGJhc2lzID0gYWRkXzh4OGJhc2lzX2M7CisKKyAgICBjLT5zaHJpbmtbMF0gPSBhdl9pbWFnZV9jb3B5X3BsYW5lOworICAgIGMtPnNocmlua1sxXSA9IGZmX3NocmluazIyOworICAgIGMtPnNocmlua1syXSA9IGZmX3NocmluazQ0OworICAgIGMtPnNocmlua1szXSA9IGZmX3Nocmluazg4OworCisgICAgYy0+cGl4X3N1bSAgID0gcGl4X3N1bV9jOworICAgIGMtPnBpeF9ub3JtMSA9IHBpeF9ub3JtMV9jOworCisgICAgYy0+ZHJhd19lZGdlcyA9IGRyYXdfZWRnZXNfOF9jOworCisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl9tcGVndmlkZW9lbmNkc3BfaW5pdF9hcm0oYywgYXZjdHgpOworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfbXBlZ3ZpZGVvZW5jZHNwX2luaXRfcHBjKGMsIGF2Y3R4KTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX21wZWd2aWRlb2VuY2RzcF9pbml0X3g4NihjLCBhdmN0eCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcGVndmlkZW9lbmNkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21wZWd2aWRlb2VuY2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMmY0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGVndmlkZW9lbmNkc3AuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NUEVHVklERU9FTkNEU1BfSAorI2RlZmluZSBBVkNPREVDX01QRUdWSURFT0VOQ0RTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKworI2RlZmluZSBCQVNJU19TSElGVCAxNgorI2RlZmluZSBSRUNPTl9TSElGVCA2CisKKyNkZWZpbmUgRURHRV9UT1AgICAgMQorI2RlZmluZSBFREdFX0JPVFRPTSAyCisKK3R5cGVkZWYgc3RydWN0IE1wZWd2aWRlb0VuY0RTUENvbnRleHQgeworICAgIGludCAoKnRyeV84eDhiYXNpcykoaW50MTZfdCByZW1bNjRdLCBpbnQxNl90IHdlaWdodFs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGJhc2lzWzY0XSwgaW50IHNjYWxlKTsKKyAgICB2b2lkICgqYWRkXzh4OGJhc2lzKShpbnQxNl90IHJlbVs2NF0sIGludDE2X3QgYmFzaXNbNjRdLCBpbnQgc2NhbGUpOworCisgICAgaW50ICgqcGl4X3N1bSkodWludDhfdCAqcGl4LCBpbnQgbGluZV9zaXplKTsKKyAgICBpbnQgKCpwaXhfbm9ybTEpKHVpbnQ4X3QgKnBpeCwgaW50IGxpbmVfc2l6ZSk7CisKKyAgICB2b2lkICgqc2hyaW5rWzRdKSh1aW50OF90ICpkc3QsIGludCBkc3Rfd3JhcCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd3JhcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgIHZvaWQgKCpkcmF3X2VkZ2VzKSh1aW50OF90ICpidWYsIGludCB3cmFwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHNpZGVzKTsKK30gTXBlZ3ZpZGVvRW5jRFNQQ29udGV4dDsKKwordm9pZCBmZl9tcGVndmlkZW9lbmNkc3BfaW5pdChNcGVndmlkZW9FbmNEU1BDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl9tcGVndmlkZW9lbmNkc3BfaW5pdF9hcm0oTXBlZ3ZpZGVvRW5jRFNQQ29udGV4dCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cit2b2lkIGZmX21wZWd2aWRlb2VuY2RzcF9pbml0X3BwYyhNcGVndmlkZW9FbmNEU1BDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK3ZvaWQgZmZfbXBlZ3ZpZGVvZW5jZHNwX2luaXRfeDg2KE1wZWd2aWRlb0VuY0RTUENvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisjZW5kaWYgLyogQVZDT0RFQ19NUEVHVklERU9FTkNEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXBsMmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXBsMmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTVkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcGwyZGVjLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVBMMiBzdWJ0aXRsZXMgZGVjb2RlcgorICoKKyAqIEBzZWUgaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwOTAzMjgwNDAyMzMvaHR0cDovL25hcGlzeS51c3Nicm93YXJlay5vcmcvbXBsMi1lbmcuaHRtbAorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYXNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorCitzdGF0aWMgaW50IG1wbDJfZXZlbnRfdG9fYXNzKEFWQlByaW50ICpidWYsIGNvbnN0IGNoYXIgKnApCit7CisgICAgaWYgKCpwID09ICcgJykKKyAgICAgICAgcCsrOworCisgICAgd2hpbGUgKCpwKSB7CisgICAgICAgIGludCBnb3Rfc3R5bGUgPSAwOworCisgICAgICAgIHdoaWxlICgqcCAmJiBzdHJjaHIoIi9cXF8iLCAqcCkpIHsKKyAgICAgICAgICAgIGlmICAgICAgKCpwID09ICcvJykgIGF2X2JwcmludGYoYnVmLCAie1xcaTF9Iik7CisgICAgICAgICAgICBlbHNlIGlmICgqcCA9PSAnXFwnKSBhdl9icHJpbnRmKGJ1ZiwgIntcXGIxfSIpOworICAgICAgICAgICAgZWxzZSBpZiAoKnAgPT0gJ18nKSAgYXZfYnByaW50ZihidWYsICJ7XFx1MX0iKTsKKyAgICAgICAgICAgIGdvdF9zdHlsZSA9IDE7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJ3wnKSB7CisgICAgICAgICAgICBpZiAoKnAgIT0gJ1xyJyAmJiAqcCAhPSAnXG4nKQorICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhidWYsICpwLCAxKTsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqcCA9PSAnfCcpIHsKKyAgICAgICAgICAgIGlmIChnb3Rfc3R5bGUpCisgICAgICAgICAgICAgICAgYXZfYnByaW50ZihidWYsICJ7XFxyfSIpOworICAgICAgICAgICAgYXZfYnByaW50ZihidWYsICJcXE4iKTsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wbDJfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3Rfc3ViX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGludCByZXQgPSAwOworICAgIEFWQlByaW50IGJ1ZjsKKyAgICBBVlN1YnRpdGxlICpzdWIgPSBkYXRhOworICAgIGNvbnN0IGNoYXIgKnB0ciA9IGF2cGt0LT5kYXRhOworICAgIGNvbnN0IGludCB0c19zdGFydCAgICAgPSBhdl9yZXNjYWxlX3EoYXZwa3QtPnB0cywgICAgICBhdmN0eC0+dGltZV9iYXNlLCAoQVZSYXRpb25hbCl7MSwxMDB9KTsKKyAgICBjb25zdCBpbnQgdHNfZHVyYXRpb24gID0gYXZwa3QtPmR1cmF0aW9uICE9IC0xID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKGF2cGt0LT5kdXJhdGlvbiwgYXZjdHgtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsMTAwfSkgOiAtMTsKKworICAgIGF2X2JwcmludF9pbml0KCZidWYsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgaWYgKHB0ciAmJiBhdnBrdC0+c2l6ZSA+IDAgJiYgKnB0ciAmJiAhbXBsMl9ldmVudF90b19hc3MoJmJ1ZiwgcHRyKSkKKyAgICAgICAgcmV0ID0gZmZfYXNzX2FkZF9yZWN0X2JwcmludChzdWIsICZidWYsIHRzX3N0YXJ0LCB0c19kdXJhdGlvbik7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgICpnb3Rfc3ViX3B0ciA9IHN1Yi0+bnVtX3JlY3RzID4gMDsKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfbXBsMl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcGwyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBMMiBzdWJ0aXRsZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEwyLAorICAgIC5kZWNvZGUgICAgICAgICA9IG1wbDJfZGVjb2RlX2ZyYW1lLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXJfZGVmYXVsdCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21xYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZDFlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcWMuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIE1RLWNvZGVyIGVuY29kZXIgYW5kIGRlY29kZXIgY29tbW9uIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDA3IEthbWlsIE5vd29zYWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBNUS1jb2RlciBjb21tb24gKGRlY29kZXIvZW5jb2RlcikgZnVuY3Rpb25zCisgKiBAZmlsZQorICogQGF1dGhvciBLYW1pbCBOb3dvc2FkCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKworI2luY2x1ZGUgIm1xYy5oIgorCisvKiBNUSBjb2RlciBjb250ZXh0IHN0YXRlIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgTXFjQ3hTdGF0ZSB7CisgICAgdWludDE2X3QgcWU7CisgICAgdWludDhfdCAgbm1wczsKKyAgICB1aW50OF90ICBubHBzOworICAgIHVpbnQ4X3QgIHN3OworfSBNcWNDeFN0YXRlOworCitzdGF0aWMgY29uc3QgTXFjQ3hTdGF0ZSBjeF9zdGF0ZXNbNDddID0geworICAgIHsgMHg1NjAxLCAgMSwgIDEsIDEgfSwKKyAgICB7IDB4MzQwMSwgIDIsICA2LCAwIH0sCisgICAgeyAweDE4MDEsICAzLCAgOSwgMCB9LAorICAgIHsgMHgwQUMxLCAgNCwgMTIsIDAgfSwKKyAgICB7IDB4MDUyMSwgIDUsIDI5LCAwIH0sCisgICAgeyAweDAyMjEsIDM4LCAzMywgMCB9LAorICAgIHsgMHg1NjAxLCAgNywgIDYsIDEgfSwKKyAgICB7IDB4NTQwMSwgIDgsIDE0LCAwIH0sCisgICAgeyAweDQ4MDEsICA5LCAxNCwgMCB9LAorICAgIHsgMHgzODAxLCAxMCwgMTQsIDAgfSwKKyAgICB7IDB4MzAwMSwgMTEsIDE3LCAwIH0sCisgICAgeyAweDI0MDEsIDEyLCAxOCwgMCB9LAorICAgIHsgMHgxQzAxLCAxMywgMjAsIDAgfSwKKyAgICB7IDB4MTYwMSwgMjksIDIxLCAwIH0sCisgICAgeyAweDU2MDEsIDE1LCAxNCwgMSB9LAorICAgIHsgMHg1NDAxLCAxNiwgMTQsIDAgfSwKKyAgICB7IDB4NTEwMSwgMTcsIDE1LCAwIH0sCisgICAgeyAweDQ4MDEsIDE4LCAxNiwgMCB9LAorICAgIHsgMHgzODAxLCAxOSwgMTcsIDAgfSwKKyAgICB7IDB4MzQwMSwgMjAsIDE4LCAwIH0sCisgICAgeyAweDMwMDEsIDIxLCAxOSwgMCB9LAorICAgIHsgMHgyODAxLCAyMiwgMTksIDAgfSwKKyAgICB7IDB4MjQwMSwgMjMsIDIwLCAwIH0sCisgICAgeyAweDIyMDEsIDI0LCAyMSwgMCB9LAorICAgIHsgMHgxQzAxLCAyNSwgMjIsIDAgfSwKKyAgICB7IDB4MTgwMSwgMjYsIDIzLCAwIH0sCisgICAgeyAweDE2MDEsIDI3LCAyNCwgMCB9LAorICAgIHsgMHgxNDAxLCAyOCwgMjUsIDAgfSwKKyAgICB7IDB4MTIwMSwgMjksIDI2LCAwIH0sCisgICAgeyAweDExMDEsIDMwLCAyNywgMCB9LAorICAgIHsgMHgwQUMxLCAzMSwgMjgsIDAgfSwKKyAgICB7IDB4MDlDMSwgMzIsIDI5LCAwIH0sCisgICAgeyAweDA4QTEsIDMzLCAzMCwgMCB9LAorICAgIHsgMHgwNTIxLCAzNCwgMzEsIDAgfSwKKyAgICB7IDB4MDQ0MSwgMzUsIDMyLCAwIH0sCisgICAgeyAweDAyQTEsIDM2LCAzMywgMCB9LAorICAgIHsgMHgwMjIxLCAzNywgMzQsIDAgfSwKKyAgICB7IDB4MDE0MSwgMzgsIDM1LCAwIH0sCisgICAgeyAweDAxMTEsIDM5LCAzNiwgMCB9LAorICAgIHsgMHgwMDg1LCA0MCwgMzcsIDAgfSwKKyAgICB7IDB4MDA0OSwgNDEsIDM4LCAwIH0sCisgICAgeyAweDAwMjUsIDQyLCAzOSwgMCB9LAorICAgIHsgMHgwMDE1LCA0MywgNDAsIDAgfSwKKyAgICB7IDB4MDAwOSwgNDQsIDQxLCAwIH0sCisgICAgeyAweDAwMDUsIDQ1LCA0MiwgMCB9LAorICAgIHsgMHgwMDAxLCA0NSwgNDMsIDAgfSwKKyAgICB7IDB4NTYwMSwgNDYsIDQ2LCAwIH0KK307CisKK3VpbnQxNl90IGZmX21xY19xZSBbMiAqIDQ3XTsKK3VpbnQ4X3QgZmZfbXFjX25scHNbMiAqIDQ3XTsKK3VpbnQ4X3QgZmZfbXFjX25tcHNbMiAqIDQ3XTsKKwordm9pZCBhdl9jb2xkIGZmX21xY19pbml0X2NvbnRleHRfdGFibGVzKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ3OyBpKyspIHsKKyAgICAgICAgZmZfbXFjX3FlWzIgKiBpXSAgICAgPQorICAgICAgICBmZl9tcWNfcWVbMiAqIGkgKyAxXSA9IGN4X3N0YXRlc1tpXS5xZTsKKworICAgICAgICBmZl9tcWNfbmxwc1syICogaV0gICAgID0gMiAqIGN4X3N0YXRlc1tpXS5ubHBzICsgY3hfc3RhdGVzW2ldLnN3OworICAgICAgICBmZl9tcWNfbmxwc1syICogaSArIDFdID0gMiAqIGN4X3N0YXRlc1tpXS5ubHBzICsgMSAtIGN4X3N0YXRlc1tpXS5zdzsKKyAgICAgICAgZmZfbXFjX25tcHNbMiAqIGldICAgICA9IDIgKiBjeF9zdGF0ZXNbaV0ubm1wczsKKyAgICAgICAgZmZfbXFjX25tcHNbMiAqIGkgKyAxXSA9IDIgKiBjeF9zdGF0ZXNbaV0ubm1wcyArIDE7CisgICAgfQorfQorCit2b2lkIGZmX21xY19pbml0X2NvbnRleHRzKE1xY1N0YXRlICptcWMpCit7CisgICAgbWVtc2V0KG1xYy0+Y3hfc3RhdGVzLCAwLCBzaXplb2YobXFjLT5jeF9zdGF0ZXMpKTsKKyAgICBtcWMtPmN4X3N0YXRlc1tNUUNfQ1hfVU5JXSA9IDIgKiA0NjsKKyAgICBtcWMtPmN4X3N0YXRlc1tNUUNfQ1hfUkxdICA9IDIgKiAzOworICAgIG1xYy0+Y3hfc3RhdGVzWzBdICAgICAgICAgID0gMiAqIDQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tcWMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21xYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwODI3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tcWMuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogTVEtY29kZXI6IHN0cnVjdHVyZXMsIGNvbW1vbiBhbmQgZGVjb2RlciBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwNyBLYW1pbCBOb3dvc2FkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NUUNfSAorI2RlZmluZSBBVkNPREVDX01RQ19ICisKKy8qKgorICogTVEtY29kZXIKKyAqIEBmaWxlCisgKiBAYXV0aG9yIEthbWlsIE5vd29zYWQKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgTVFDX0NYX1VOSSAxNworI2RlZmluZSBNUUNfQ1hfUkwgIDE4CisKK2V4dGVybiB1aW50MTZfdCBmZl9tcWNfcWVbMiAqIDQ3XTsKK2V4dGVybiB1aW50OF90ICBmZl9tcWNfbmxwc1syICogNDddOworZXh0ZXJuIHVpbnQ4X3QgIGZmX21xY19ubXBzWzIgKiA0N107CisKK3R5cGVkZWYgc3RydWN0IE1xY1N0YXRlIHsKKyAgICB1aW50OF90ICpicCwgKmJwc3RhcnQ7CisgICAgdW5zaWduZWQgaW50IGE7CisgICAgdW5zaWduZWQgaW50IGM7CisgICAgdW5zaWduZWQgaW50IGN0OworICAgIHVpbnQ4X3QgY3hfc3RhdGVzWzE5XTsKK30gTXFjU3RhdGU7CisKKy8qIGVuY29kZXIgKi8KKworLyoqIGluaXRpYWxpemUgdGhlIGVuY29kZXIgKi8KK3ZvaWQgZmZfbXFjX2luaXRlbmMoTXFjU3RhdGUgKm1xYywgdWludDhfdCAqYnApOworCisvKiogY29kZSBiaXQgZCB3aXRoIGNvbnRleHQgY3ggKi8KK3ZvaWQgZmZfbXFjX2VuY29kZShNcWNTdGF0ZSAqbXFjLCB1aW50OF90ICpjeHN0YXRlLCBpbnQgZCk7CisKKy8qKiBudW1iZXIgb2YgZW5jb2RlZCBieXRlcyAqLworaW50IGZmX21xY19sZW5ndGgoTXFjU3RhdGUgKm1xYyk7CisKKy8qKiBmbHVzaCB0aGUgZW5jb2RlciBbcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgZW5jb2RlZF0gKi8KK2ludCBmZl9tcWNfZmx1c2goTXFjU3RhdGUgKm1xYyk7CisKKy8qIGRlY29kZXIgKi8KKworLyoqCisgKiBJbml0aWFsaXplIE1RLWRlY29kZXIuCisgKiBAcGFyYW0gbXFjICAgTVEgZGVjb2RlciBzdGF0ZQorICogQHBhcmFtIGJwICAgIGJ5dGUgcG9pdGVyCisgKi8KK3ZvaWQgZmZfbXFjX2luaXRkZWMoTXFjU3RhdGUgKm1xYywgdWludDhfdCAqYnApOworCisvKioKKyAqIE1RIGRlY29kZXIuCisgKiBAcGFyYW0gbXFjICAgICAgIE1RIGRlY29kZXIgc3RhdGUKKyAqIEBwYXJhbSBjeHN0YXRlICAgQ29udGV4dAorICogQHJldHVybiAgICAgICAgICBEZWNpc2lvbiAoMCBvdCAxKQorICovCitpbnQgZmZfbXFjX2RlY29kZShNcWNTdGF0ZSAqbXFjLCB1aW50OF90ICpjeHN0YXRlKTsKKworLyogY29tbW9uICovCisKKy8qKgorICogTVEtY29kZXIgSW5pdGlhbGl6ZSBjb250ZXh0IHRhYmxlcyAoUUUsIE5MUFMsIE5NUFMpCisgKi8KK3ZvaWQgZmZfbXFjX2luaXRfY29udGV4dF90YWJsZXModm9pZCk7CisKKy8qKgorICogTVEtY29kZXIgY29udGV4dCBpbml0aWFsaXNhdGlvbnMuCisgKiBAcGFyYW0gbXFjICAgICAgIE1RLWNvZGVyIGNvbnRleHQKKyAqLwordm9pZCBmZl9tcWNfaW5pdF9jb250ZXh0cyhNcWNTdGF0ZSAqbXFjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTVFDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21xY2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXFjZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyNTA2OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21xY2RlYy5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBNUS1jb2RlciBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS2FtaWwgTm93b3NhZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIE1RLWNvZGVyIGRlY29kZXIKKyAqIEBmaWxlCisgKiBAYXV0aG9yIEthbWlsIE5vd29zYWQKKyAqLworCisjaW5jbHVkZSAibXFjLmgiCisKK3N0YXRpYyB2b2lkIGJ5dGVpbihNcWNTdGF0ZSAqbXFjKQoreworICAgIGlmICgqbXFjLT5icCA9PSAweGZmKSB7CisgICAgICAgIGlmICgqKG1xYy0+YnAgKyAxKSA+IDB4OGYpCisgICAgICAgICAgICBtcWMtPmMrKzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtcWMtPmJwKys7CisgICAgICAgICAgICBtcWMtPmMgKz0gMiArIDB4ZmUwMCAtICgqbXFjLT5icCA8PCA5KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1xYy0+YnArKzsKKyAgICAgICAgbXFjLT5jICs9IDEgKyAweGZmMDAgLSAoKm1xYy0+YnAgPDwgOCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGV4Y2hhbmdlKE1xY1N0YXRlICptcWMsIHVpbnQ4X3QgKmN4c3RhdGUsIGludCBscHMpCit7CisgICAgaW50IGQ7CisgICAgaWYgKChtcWMtPmEgPCBmZl9tcWNfcWVbKmN4c3RhdGVdKSBeICghbHBzKSkgeworICAgICAgICBpZiAobHBzKQorICAgICAgICAgICAgbXFjLT5hID0gZmZfbXFjX3FlWypjeHN0YXRlXTsKKyAgICAgICAgZCA9ICpjeHN0YXRlICYgMTsKKyAgICAgICAgKmN4c3RhdGUgPSBmZl9tcWNfbm1wc1sqY3hzdGF0ZV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGxwcykKKyAgICAgICAgICAgIG1xYy0+YSA9IGZmX21xY19xZVsqY3hzdGF0ZV07CisgICAgICAgIGQgPSAxIC0gKCpjeHN0YXRlICYgMSk7CisgICAgICAgICpjeHN0YXRlID0gZmZfbXFjX25scHNbKmN4c3RhdGVdOworICAgIH0KKyAgICAvLyBkbyBSRU5PUk1EOiBzZWUgSVNPL0lFQyAxNTQ0NC0xOjIwMDIgwqdDLjMuMworICAgIGRvIHsKKyAgICAgICAgaWYgKCEobXFjLT5jICYgMHhmZikpIHsKKyAgICAgICAgICAgIG1xYy0+YyAtPSAweDEwMDsKKyAgICAgICAgICAgIGJ5dGVpbihtcWMpOworICAgICAgICB9CisgICAgICAgIG1xYy0+YSArPSBtcWMtPmE7CisgICAgICAgIG1xYy0+YyArPSBtcWMtPmM7CisgICAgfSB3aGlsZSAoIShtcWMtPmEgJiAweDgwMDApKTsKKyAgICByZXR1cm4gZDsKK30KKwordm9pZCBmZl9tcWNfaW5pdGRlYyhNcWNTdGF0ZSAqbXFjLCB1aW50OF90ICpicCkKK3sKKyAgICBmZl9tcWNfaW5pdF9jb250ZXh0cyhtcWMpOworICAgIG1xYy0+YnAgPSBicDsKKyAgICBtcWMtPmMgID0gKCptcWMtPmJwIF4gMHhmZikgPDwgMTY7CisgICAgYnl0ZWluKG1xYyk7CisgICAgbXFjLT5jID0gbXFjLT5jIDw8IDc7CisgICAgbXFjLT5hID0gMHg4MDAwOworfQorCitpbnQgZmZfbXFjX2RlY29kZShNcWNTdGF0ZSAqbXFjLCB1aW50OF90ICpjeHN0YXRlKQoreworICAgIG1xYy0+YSAtPSBmZl9tcWNfcWVbKmN4c3RhdGVdOworICAgIGlmICgobXFjLT5jID4+IDE2KSA8IG1xYy0+YSkgeworICAgICAgICBpZiAobXFjLT5hICYgMHg4MDAwKQorICAgICAgICAgICAgcmV0dXJuICpjeHN0YXRlICYgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGV4Y2hhbmdlKG1xYywgY3hzdGF0ZSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXFjLT5jIC09IG1xYy0+YSA8PCAxNjsKKyAgICAgICAgcmV0dXJuIGV4Y2hhbmdlKG1xYywgY3hzdGF0ZSwgMSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXFjZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tcWNlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2QzNTJiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXFjZW5jLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBNUS1jb2RlciBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS2FtaWwgTm93b3NhZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIE1RLWNvZGVyIGVuY29kZXIKKyAqIEBmaWxlCisgKiBAYXV0aG9yIEthbWlsIE5vd29zYWQKKyAqLworCisjaW5jbHVkZSAibXFjLmgiCisKK3N0YXRpYyB2b2lkIGJ5dGVvdXQoTXFjU3RhdGUgKm1xYykKK3sKK3JldHJ5OgorICAgIGlmICgqbXFjLT5icCA9PSAweGZmKXsKKyAgICAgICAgbXFjLT5icCsrOworICAgICAgICAqbXFjLT5icCA9IG1xYy0+YyA+PiAyMDsKKyAgICAgICAgbXFjLT5jICY9IDB4ZmZmZmY7CisgICAgICAgIG1xYy0+Y3QgPSA3OworICAgIH0gZWxzZSBpZiAoKG1xYy0+YyAmIDB4ODAwMDAwMCkpeworICAgICAgICAoKm1xYy0+YnApKys7CisgICAgICAgIG1xYy0+YyAmPSAweDdmZmZmZmY7CisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfSBlbHNleworICAgICAgICBtcWMtPmJwKys7CisgICAgICAgICptcWMtPmJwID0gbXFjLT5jID4+IDE5OworICAgICAgICBtcWMtPmMgJj0gMHg3ZmZmZjsKKyAgICAgICAgbXFjLT5jdCA9IDg7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZW5vcm1lKE1xY1N0YXRlICptcWMpCit7CisgICAgZG97CisgICAgICAgIG1xYy0+YSArPSBtcWMtPmE7CisgICAgICAgIG1xYy0+YyArPSBtcWMtPmM7CisgICAgICAgIGlmICghLS1tcWMtPmN0KQorICAgICAgICAgICAgYnl0ZW91dChtcWMpOworICAgIH0gd2hpbGUgKCEobXFjLT5hICYgMHg4MDAwKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldGJpdHMoTXFjU3RhdGUgKm1xYykKK3sKKyAgICBpbnQgdG1wID0gbXFjLT5jICsgbXFjLT5hOworICAgIG1xYy0+YyB8PSAweGZmZmY7CisgICAgaWYgKG1xYy0+YyA+PSB0bXApCisgICAgICAgIG1xYy0+YyAtPSAweDgwMDA7Cit9CisKK3ZvaWQgZmZfbXFjX2luaXRlbmMoTXFjU3RhdGUgKm1xYywgdWludDhfdCAqYnApCit7CisgICAgZmZfbXFjX2luaXRfY29udGV4dHMobXFjKTsKKyAgICBtcWMtPmEgPSAweDgwMDA7CisgICAgbXFjLT5jID0gMDsKKyAgICBtcWMtPmJwID0gYnAtMTsKKyAgICBtcWMtPmJwc3RhcnQgPSBicDsKKyAgICBtcWMtPmN0ID0gMTIgKyAoKm1xYy0+YnAgPT0gMHhmZik7Cit9CisKK3ZvaWQgZmZfbXFjX2VuY29kZShNcWNTdGF0ZSAqbXFjLCB1aW50OF90ICpjeHN0YXRlLCBpbnQgZCkKK3sKKyAgICBpbnQgcWU7CisKKyAgICBxZSA9IGZmX21xY19xZVsqY3hzdGF0ZV07CisgICAgbXFjLT5hIC09IHFlOworICAgIGlmICgoKmN4c3RhdGUgJiAxKSA9PSBkKXsKKyAgICAgICAgaWYgKCEobXFjLT5hICYgMHg4MDAwKSl7CisgICAgICAgICAgICBpZiAobXFjLT5hIDwgcWUpCisgICAgICAgICAgICAgICAgbXFjLT5hID0gcWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbXFjLT5jICs9IHFlOworICAgICAgICAgICAgKmN4c3RhdGUgPSBmZl9tcWNfbm1wc1sqY3hzdGF0ZV07CisgICAgICAgICAgICByZW5vcm1lKG1xYyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbXFjLT5jICs9IHFlOworICAgIH0gZWxzZXsKKyAgICAgICAgaWYgKG1xYy0+YSA8IHFlKQorICAgICAgICAgICAgbXFjLT5jICs9IHFlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtcWMtPmEgPSBxZTsKKyAgICAgICAgKmN4c3RhdGUgPSBmZl9tcWNfbmxwc1sqY3hzdGF0ZV07CisgICAgICAgIHJlbm9ybWUobXFjKTsKKyAgICB9Cit9CisKK2ludCBmZl9tcWNfbGVuZ3RoKE1xY1N0YXRlICptcWMpCit7CisgICAgcmV0dXJuIG1xYy0+YnAgLSBtcWMtPmJwc3RhcnQ7Cit9CisKK2ludCBmZl9tcWNfZmx1c2goTXFjU3RhdGUgKm1xYykKK3sKKyAgICBzZXRiaXRzKG1xYyk7CisgICAgbXFjLT5jID0gbXFjLT5jIDw8IG1xYy0+Y3Q7CisgICAgYnl0ZW91dChtcWMpOworICAgIG1xYy0+YyA9IG1xYy0+YyA8PCBtcWMtPmN0OworICAgIGJ5dGVvdXQobXFjKTsKKyAgICBpZiAoKm1xYy0+YnAgIT0gMHhmZikKKyAgICAgICAgbXFjLT5icCsrOworICAgIHJldHVybiBtcWMtPmJwIC0gbXFjLT5icHN0YXJ0OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXNnc21kZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21zZ3NtZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0ZGRiNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21zZ3NtZGVjLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIGdzbSAwNi4xMCBkZWNvZGVyLCBNaWNyb3NvZnQgdmFyaWFudAorICogQ29weXJpZ2h0IChjKSAyMDEwIFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtc2dzbWRlYy5oIgorI2luY2x1ZGUgImdzbS5oIgorI2luY2x1ZGUgImdzbWRlY190ZW1wbGF0ZS5jIgorCitpbnQgZmZfbXNnc21fZGVjb2RlX2Jsb2NrKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50MTZfdCAqc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbW9kZSkKK3sKKyAgICBpbnQgcmVzOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgR1NNX01TX0JMT0NLX1NJWkUgKiA4KTsKKyAgICByZXMgPSBnc21fZGVjb2RlX2Jsb2NrKGF2Y3R4LCBzYW1wbGVzLCAmZ2IsIG1vZGUpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworICAgIHJldHVybiBnc21fZGVjb2RlX2Jsb2NrKGF2Y3R4LCBzYW1wbGVzICsgR1NNX0ZSQU1FX1NJWkUsICZnYiwgbW9kZSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tc2dzbWRlYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNnc21kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmExYTYyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNnc21kZWMuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogZ3NtIDA2LjEwIGRlY29kZXIsIE1pY3Jvc29mdCB2YXJpYW50CisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01TR1NNREVDX0gKKyNkZWZpbmUgQVZDT0RFQ19NU0dTTURFQ19ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKK2ludCBmZl9tc2dzbV9kZWNvZGVfYmxvY2soQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQxNl90ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBtb2RlKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTVNHU01ERUNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXNtcGVnNC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNtcGVnNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMDBhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tc21wZWc0LmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiBNU01QRUc0IGJhY2tlbmQgZm9yIGVuY29kZXIgYW5kIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogbXNtcGVnNHYxICYgdjIgc3R1ZmYgYnkgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVNNUEVHNCBiYWNrZW5kIGZvciBlbmNvZGVyIGFuZCBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAibXNtcGVnNC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAiaDI2My5oIgorI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKKyNpbmNsdWRlICJtc21wZWc0ZGF0YS5oIgorI2luY2x1ZGUgInZjMWRhdGEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKworLyoKKyAqIFlvdSBjYW4gYWxzbyBjYWxsIHRoaXMgY29kZWMgOiBNUEVHNCB3aXRoIGEgdHdpc3QgIQorICoKKyAqIFRPRE86CisgKiAgICAgICAgLSAoZW5jb2RpbmcpIHNlbGVjdCBiZXN0IG12IHRhYmxlICh0d28gY2hvaWNlcykKKyAqICAgICAgICAtIChlbmNvZGluZykgc2VsZWN0IGJlc3QgdmxjL2RjIHRhYmxlCisgKi8KKworLyogVGhpcyB0YWJsZSBpcyBwcmFjdGljYWxseSBpZGVudGljYWwgdG8gdGhlIG9uZSBmcm9tIGgyNjMKKyAqIGV4Y2VwdCB0aGF0IGl0IGlzIGludmVydGVkLiAqLworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X2gyNjNfZGNfZm9yX21zbXBlZzQodm9pZCkKK3sKKyAgICAgICAgaW50IGxldmVsLCB1bmlfY29kZSwgdW5pX2xlbjsKKworICAgICAgICBpZihmZl92Ml9kY19jaHJvbWFfdGFibGVbMjU1ICsgMjU2XVsxXSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IobGV2ZWw9LTI1NjsgbGV2ZWw8MjU2OyBsZXZlbCsrKXsKKyAgICAgICAgICAgIGludCBzaXplLCB2LCBsOworICAgICAgICAgICAgLyogZmluZCBudW1iZXIgb2YgYml0cyAqLworICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgICAgICB2ID0gYWJzKGxldmVsKTsKKyAgICAgICAgICAgIHdoaWxlICh2KSB7CisgICAgICAgICAgICAgICAgdiA+Pj0gMTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKQorICAgICAgICAgICAgICAgIGw9ICgtbGV2ZWwpIF4gKCgxIDw8IHNpemUpIC0gMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbD0gbGV2ZWw7CisKKyAgICAgICAgICAgIC8qIGx1bWluYW5jZSBoMjYzICovCisgICAgICAgICAgICB1bmlfY29kZT0gZmZfbXBlZzRfREN0YWJfbHVtW3NpemVdWzBdOworICAgICAgICAgICAgdW5pX2xlbiA9IGZmX21wZWc0X0RDdGFiX2x1bVtzaXplXVsxXTsKKyAgICAgICAgICAgIHVuaV9jb2RlIF49ICgxPDx1bmlfbGVuKS0xOyAvL00kIGRvZXMgbm90IGxpa2UgY29tcGF0aWJpbGl0eQorCisgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICB1bmlfY29kZTw8PXNpemU7IHVuaV9jb2RlfD1sOworICAgICAgICAgICAgICAgIHVuaV9sZW4rPXNpemU7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiA4KXsKKyAgICAgICAgICAgICAgICAgICAgdW5pX2NvZGU8PD0xOyB1bmlfY29kZXw9MTsKKyAgICAgICAgICAgICAgICAgICAgdW5pX2xlbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZmX3YyX2RjX2x1bV90YWJsZVtsZXZlbCArIDI1Nl1bMF0gPSB1bmlfY29kZTsKKyAgICAgICAgICAgIGZmX3YyX2RjX2x1bV90YWJsZVtsZXZlbCArIDI1Nl1bMV0gPSB1bmlfbGVuOworCisgICAgICAgICAgICAvKiBjaHJvbWluYW5jZSBoMjYzICovCisgICAgICAgICAgICB1bmlfY29kZT0gZmZfbXBlZzRfREN0YWJfY2hyb21bc2l6ZV1bMF07CisgICAgICAgICAgICB1bmlfbGVuID0gZmZfbXBlZzRfREN0YWJfY2hyb21bc2l6ZV1bMV07CisgICAgICAgICAgICB1bmlfY29kZSBePSAoMTw8dW5pX2xlbiktMTsgLy9NJCBkb2VzIG5vdCBsaWtlIGNvbXBhdGliaWxpdHkKKworICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgdW5pX2NvZGU8PD1zaXplOyB1bmlfY29kZXw9bDsKKyAgICAgICAgICAgICAgICB1bmlfbGVuKz1zaXplOworICAgICAgICAgICAgICAgIGlmIChzaXplID4gOCl7CisgICAgICAgICAgICAgICAgICAgIHVuaV9jb2RlPDw9MTsgdW5pX2NvZGV8PTE7CisgICAgICAgICAgICAgICAgICAgIHVuaV9sZW4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZl92Ml9kY19jaHJvbWFfdGFibGVbbGV2ZWwgKyAyNTZdWzBdID0gdW5pX2NvZGU7CisgICAgICAgICAgICBmZl92Ml9kY19jaHJvbWFfdGFibGVbbGV2ZWwgKyAyNTZdWzFdID0gdW5pX2xlbjsKKworICAgICAgICB9Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9tc21wZWc0X2NvbW1vbl9pbml0KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIHN3aXRjaChzLT5tc21wZWc0X3ZlcnNpb24peworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgICAgIHMtPnlfZGNfc2NhbGVfdGFibGU9CisgICAgICAgIHMtPmNfZGNfc2NhbGVfdGFibGU9IGZmX21wZWcxX2RjX3NjYWxlX3RhYmxlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGlmKHMtPndvcmthcm91bmRfYnVncyl7CisgICAgICAgICAgICBzLT55X2RjX3NjYWxlX3RhYmxlPSBmZl9vbGRfZmZfeV9kY19zY2FsZV90YWJsZTsKKyAgICAgICAgICAgIHMtPmNfZGNfc2NhbGVfdGFibGU9IGZmX3dtdjFfY19kY19zY2FsZV90YWJsZTsKKyAgICAgICAgfSBlbHNleworICAgICAgICAgICAgcy0+eV9kY19zY2FsZV90YWJsZT0gZmZfbXBlZzRfeV9kY19zY2FsZV90YWJsZTsKKyAgICAgICAgICAgIHMtPmNfZGNfc2NhbGVfdGFibGU9IGZmX21wZWc0X2NfZGNfc2NhbGVfdGFibGU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgIGNhc2UgNToKKyAgICAgICAgcy0+eV9kY19zY2FsZV90YWJsZT0gZmZfd212MV95X2RjX3NjYWxlX3RhYmxlOworICAgICAgICBzLT5jX2RjX3NjYWxlX3RhYmxlPSBmZl93bXYxX2NfZGNfc2NhbGVfdGFibGU7CisgICAgICAgIGJyZWFrOworI2lmIENPTkZJR19WQzFfREVDT0RFUgorICAgIGNhc2UgNjoKKyAgICAgICAgcy0+eV9kY19zY2FsZV90YWJsZT0gZmZfd212M19kY19zY2FsZV90YWJsZTsKKyAgICAgICAgcy0+Y19kY19zY2FsZV90YWJsZT0gZmZfd212M19kY19zY2FsZV90YWJsZTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIH0KKworCisgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uPj00KXsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50cmFfc2NhbnRhYmxlLCAgIGZmX3dtdjFfc2NhbnRhYmxlWzFdKTsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50cmFfaF9zY2FudGFibGUsIGZmX3dtdjFfc2NhbnRhYmxlWzJdKTsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50cmFfdl9zY2FudGFibGUsIGZmX3dtdjFfc2NhbnRhYmxlWzNdKTsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50ZXJfc2NhbnRhYmxlLCAgIGZmX3dtdjFfc2NhbnRhYmxlWzBdKTsKKyAgICB9CisgICAgLy9Ob3RlIHRoZSBkZWZhdWx0IHRhYmxlcyBhcmUgc2V0IGluIGNvbW1vbl9pbml0IGluIG1wZWd2aWRlby5jCisKKyAgICBpbml0X2gyNjNfZGNfZm9yX21zbXBlZzQoKTsKK30KKworLyogcHJlZGljdCBjb2RlZCBibG9jayAqLworaW50IGZmX21zbXBlZzRfY29kZWRfYmxvY2tfcHJlZChNcGVnRW5jQ29udGV4dCAqIHMsIGludCBuLCB1aW50OF90ICoqY29kZWRfYmxvY2tfcHRyKQoreworICAgIGludCB4eSwgd3JhcCwgcHJlZCwgYSwgYiwgYzsKKworICAgIHh5ID0gcy0+YmxvY2tfaW5kZXhbbl07CisgICAgd3JhcCA9IHMtPmI4X3N0cmlkZTsKKworICAgIC8qIEIgQworICAgICAqIEEgWAorICAgICAqLworICAgIGEgPSBzLT5jb2RlZF9ibG9ja1t4eSAtIDEgICAgICAgXTsKKyAgICBiID0gcy0+Y29kZWRfYmxvY2tbeHkgLSAxIC0gd3JhcF07CisgICAgYyA9IHMtPmNvZGVkX2Jsb2NrW3h5ICAgICAtIHdyYXBdOworCisgICAgaWYgKGIgPT0gYykgeworICAgICAgICBwcmVkID0gYTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmVkID0gYzsKKyAgICB9CisKKyAgICAvKiBzdG9yZSB2YWx1ZSAqLworICAgICpjb2RlZF9ibG9ja19wdHIgPSAmcy0+Y29kZWRfYmxvY2tbeHldOworCisgICAgcmV0dXJuIHByZWQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2RjKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHNjYWxlLCBpbnQgYmxvY2tfc2l6ZSkKK3sKKyAgICBpbnQgeTsKKyAgICBpbnQgc3VtPTA7CisgICAgZm9yKHk9MDsgeTxibG9ja19zaXplOyB5KyspeworICAgICAgICBpbnQgeDsKKyAgICAgICAgZm9yKHg9MDsgeDxibG9ja19zaXplOyB4KyspeworICAgICAgICAgICAgc3VtKz1zcmNbeCArIHkqc3RyaWRlXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkFTVERJVigoc3VtICsgKHNjYWxlPj4xKSksIHNjYWxlKTsKK30KKworLyogZGlyID0gMDogbGVmdCwgZGlyID0gMTogdG9wIHByZWRpY3Rpb24gKi8KK2ludCBmZl9tc21wZWc0X3ByZWRfZGMoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICoqZGNfdmFsX3B0ciwgaW50ICpkaXJfcHRyKQoreworICAgIGludCBhLCBiLCBjLCB3cmFwLCBwcmVkLCBzY2FsZTsKKyAgICBpbnQxNl90ICpkY192YWw7CisKKyAgICAvKiBmaW5kIHByZWRpY3Rpb24gKi8KKyAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgc2NhbGUgPSBzLT55X2RjX3NjYWxlOworICAgIH0gZWxzZSB7CisgICAgICAgIHNjYWxlID0gcy0+Y19kY19zY2FsZTsKKyAgICB9CisKKyAgICB3cmFwID0gcy0+YmxvY2tfd3JhcFtuXTsKKyAgICBkY192YWw9IHMtPmRjX3ZhbFswXSArIHMtPmJsb2NrX2luZGV4W25dOworCisgICAgLyogQiBDCisgICAgICogQSBYCisgICAgICovCisgICAgYSA9IGRjX3ZhbFsgLSAxXTsKKyAgICBiID0gZGNfdmFsWyAtIDEgLSB3cmFwXTsKKyAgICBjID0gZGNfdmFsWyAtIHdyYXBdOworCisgICAgaWYocy0+Zmlyc3Rfc2xpY2VfbGluZSAmJiAobiYyKT09MCAmJiBzLT5tc21wZWc0X3ZlcnNpb248NCl7CisgICAgICAgIGI9Yz0xMDI0OworICAgIH0KKworICAgIC8qIFhYWDogdGhlIGZvbGxvd2luZyBzb2x1dGlvbiBjb25zdW1lcyBkaXZpc2lvbnMsIGJ1dCBpdCBkb2VzIG5vdAorICAgICAgIG5lY2Vzc2l0YXRlIHRvIG1vZGlmeSBtcGVndmlkZW8uYy4gVGhlIHByb2JsZW0gY29tZXMgZnJvbSB0aGUKKyAgICAgICBmYWN0IHRoZXkgZGVjaWRlZCB0byBzdG9yZSB0aGUgcXVhbnRpemVkIERDICh3aGljaCB3b3VsZCBsZWFkCisgICAgICAgdG8gcHJvYmxlbXMgaWYgUSBjb3VsZCB2YXJ5ICEpICovCisjaWYgQVJDSF9YODYgJiYgSEFWRV83UkVHUyAmJiBIQVZFX0VCWF9BVkFJTEFCTEUKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92bCAlMywgJSVlYXggICAgICAgICBcblx0IgorICAgICAgICAic2hybCAkMSwgJSVlYXggICAgICAgICBcblx0IgorICAgICAgICAiYWRkbCAlJWVheCwgJTIgICAgICAgICBcblx0IgorICAgICAgICAiYWRkbCAlJWVheCwgJTEgICAgICAgICBcblx0IgorICAgICAgICAiYWRkbCAlMCwgJSVlYXggICAgICAgICBcblx0IgorICAgICAgICAiaW11bGwgJTQgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92bCAlJWVkeCwgJTAgICAgICAgICBcblx0IgorICAgICAgICAibW92bCAlMSwgJSVlYXggICAgICAgICBcblx0IgorICAgICAgICAiaW11bGwgJTQgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92bCAlJWVkeCwgJTEgICAgICAgICBcblx0IgorICAgICAgICAibW92bCAlMiwgJSVlYXggICAgICAgICBcblx0IgorICAgICAgICAiaW11bGwgJTQgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92bCAlJWVkeCwgJTIgICAgICAgICBcblx0IgorICAgICAgICA6ICIrYiIgKGEpLCAiK2MiIChiKSwgIitEIiAoYykKKyAgICAgICAgOiAiZyIgKHNjYWxlKSwgIlMiIChmZl9pbnZlcnNlW3NjYWxlXSkKKyAgICAgICAgOiAiJWVheCIsICIlZWR4IgorICAgICk7CisjZWxzZQorICAgIC8qIERpdmlzaW9ucyBhcmUgY29zdGx5IGV2ZXJ5d2hlcmU7IG9wdGltaXplIHRoZSBtb3N0IGNvbW1vbiBjYXNlLiAqLworICAgIGlmIChzY2FsZSA9PSA4KSB7CisgICAgICAgIGEgPSAoYSArICg4ID4+IDEpKSAvIDg7CisgICAgICAgIGIgPSAoYiArICg4ID4+IDEpKSAvIDg7CisgICAgICAgIGMgPSAoYyArICg4ID4+IDEpKSAvIDg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYSA9IEZBU1RESVYoKGEgKyAoc2NhbGUgPj4gMSkpLCBzY2FsZSk7CisgICAgICAgIGIgPSBGQVNURElWKChiICsgKHNjYWxlID4+IDEpKSwgc2NhbGUpOworICAgICAgICBjID0gRkFTVERJVigoYyArIChzY2FsZSA+PiAxKSksIHNjYWxlKTsKKyAgICB9CisjZW5kaWYKKyAgICAvKiBYWFg6IFdBUk5JTkc6IHRoZXkgZGlkIG5vdCBjaG9vc2UgdGhlIHNhbWUgdGVzdCBhcyBNUEVHNC4gVGhpcworICAgICAgIGlzIHZlcnkgaW1wb3J0YW50ICEgKi8KKyAgICBpZihzLT5tc21wZWc0X3ZlcnNpb24+Myl7CisgICAgICAgIGlmKHMtPmludGVyX2ludHJhX3ByZWQpeworICAgICAgICAgICAgdWludDhfdCAqZGVzdDsKKyAgICAgICAgICAgIGludCB3cmFwOworCisgICAgICAgICAgICBpZihuPT0xKXsKKyAgICAgICAgICAgICAgICBwcmVkPWE7CisgICAgICAgICAgICAgICAgKmRpcl9wdHIgPSAwOworICAgICAgICAgICAgfWVsc2UgaWYobj09Mil7CisgICAgICAgICAgICAgICAgcHJlZD1jOworICAgICAgICAgICAgICAgICpkaXJfcHRyID0gMTsKKyAgICAgICAgICAgIH1lbHNlIGlmKG49PTMpeworICAgICAgICAgICAgICAgIGlmIChhYnMoYSAtIGIpIDwgYWJzKGIgLSBjKSkgeworICAgICAgICAgICAgICAgICAgICBwcmVkID0gYzsKKyAgICAgICAgICAgICAgICAgICAgKmRpcl9wdHIgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByZWQgPSBhOworICAgICAgICAgICAgICAgICAgICAqZGlyX3B0ciA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgaW50IGJzID0gOCA+PiBzLT5hdmN0eC0+bG93cmVzOworICAgICAgICAgICAgICAgIGlmKG48NCl7CisgICAgICAgICAgICAgICAgICAgIHdyYXA9IHMtPmxpbmVzaXplOworICAgICAgICAgICAgICAgICAgICBkZXN0PSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVswXSArICgoKG4gPj4gMSkgKyAyKnMtPm1iX3kpICogYnMqICB3cmFwICkgKyAoKG4gJiAxKSArIDIqcy0+bWJfeCkgKiBiczsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgd3JhcD0gcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgZGVzdD0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbbiAtIDNdICsgKHMtPm1iX3kgKiBicyAqIHdyYXApICsgcy0+bWJfeCAqIGJzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihzLT5tYl94PT0wKSBhPSAoMTAyNCArIChzY2FsZT4+MSkpL3NjYWxlOworICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgIGE9IGdldF9kYyhkZXN0LWJzLCB3cmFwLCBzY2FsZSo4Pj4oMipzLT5hdmN0eC0+bG93cmVzKSwgYnMpOworICAgICAgICAgICAgICAgIGlmKHMtPm1iX3k9PTApIGM9ICgxMDI0ICsgKHNjYWxlPj4xKSkvc2NhbGU7CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgYz0gZ2V0X2RjKGRlc3QtYnMqd3JhcCwgd3JhcCwgc2NhbGUqOD4+KDIqcy0+YXZjdHgtPmxvd3JlcyksIGJzKTsKKworICAgICAgICAgICAgICAgIGlmIChzLT5oMjYzX2FpY19kaXI9PTApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZD0gYTsKKyAgICAgICAgICAgICAgICAgICAgKmRpcl9wdHIgPSAwOworICAgICAgICAgICAgICAgIH1lbHNlIGlmIChzLT5oMjYzX2FpY19kaXI9PTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYobj09MCl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgKmRpcl9wdHIgPSAxOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWQ9IGE7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGlyX3B0ciA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ZWxzZSBpZiAocy0+aDI2M19haWNfZGlyPT0yKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKG49PTApeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZD0gYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkaXJfcHRyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgKmRpcl9wdHIgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZD0gYzsKKyAgICAgICAgICAgICAgICAgICAgKmRpcl9wdHIgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpZiAoYWJzKGEgLSBiKSA8IGFicyhiIC0gYykpIHsKKyAgICAgICAgICAgICAgICBwcmVkID0gYzsKKyAgICAgICAgICAgICAgICAqZGlyX3B0ciA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByZWQgPSBhOworICAgICAgICAgICAgICAgICpkaXJfcHRyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBpZiAoYWJzKGEgLSBiKSA8PSBhYnMoYiAtIGMpKSB7CisgICAgICAgICAgICBwcmVkID0gYzsKKyAgICAgICAgICAgICpkaXJfcHRyID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZWQgPSBhOworICAgICAgICAgICAgKmRpcl9wdHIgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogdXBkYXRlIHByZWRpY3RvciAqLworICAgICpkY192YWxfcHRyID0gJmRjX3ZhbFswXTsKKyAgICByZXR1cm4gcHJlZDsKK30KKwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXNtcGVnNC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNtcGVnNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzdjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tc21wZWc0LmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIE1TTVBFRzQgYmFja2VuZCBmb3IgZW5jb2RlciBhbmQgZGVjb2RlcgorICogY29weXJpZ2h0IChjKSAyMDA3IEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01TTVBFRzRfSAorI2RlZmluZSBBVkNPREVDX01TTVBFRzRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAibXNtcGVnNGRhdGEuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCisjZGVmaW5lIElOVEVSX0lOVFJBX1ZMQ19CSVRTIDMKKyNkZWZpbmUgTUJfTk9OX0lOVFJBX1ZMQ19CSVRTIDkKKyNkZWZpbmUgTUJfSU5UUkFfVkxDX0JJVFMgOQorCisjZGVmaW5lIElJX0JJVFJBVEUgMTI4KjEwMjQKKyNkZWZpbmUgTUJBQ19CSVRSQVRFIDUwKjEwMjQKKworI2RlZmluZSBEQ19NQVggMTE5CisKK2V4dGVybiBWTEMgZmZfbWJfbm9uX2ludHJhX3ZsY1s0XTsKK2V4dGVybiBWTEMgZmZfaW50ZXJfaW50cmFfdmxjOworCit2b2lkIGZmX21zbXBlZzRfY29kZTAxMihQdXRCaXRDb250ZXh0ICpwYiwgaW50IG4pOwordm9pZCBmZl9tc21wZWc0X2NvbW1vbl9pbml0KE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbXNtcGVnNF9lbmNvZGVfYmxvY2soTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQxNl90ICogYmxvY2ssIGludCBuKTsKK3ZvaWQgZmZfbXNtcGVnNF9oYW5kbGVfc2xpY2VzKE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfbXNtcGVnNF9lbmNvZGVfbW90aW9uKE1wZWdFbmNDb250ZXh0ICogcywgaW50IG14LCBpbnQgbXkpOworaW50IGZmX21zbXBlZzRfY29kZWRfYmxvY2tfcHJlZChNcGVnRW5jQ29udGV4dCAqIHMsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqY29kZWRfYmxvY2tfcHRyKTsKK2ludCBmZl9tc21wZWc0X2RlY29kZV9tb3Rpb24oTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgKm14X3B0ciwgaW50ICpteV9wdHIpOworaW50IGZmX21zbXBlZzRfZGVjb2RlX2Jsb2NrKE1wZWdFbmNDb250ZXh0ICogcywgaW50MTZfdCAqIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgY29kZWQsIGNvbnN0IHVpbnQ4X3QgKnNjYW5fdGFibGUpOworaW50IGZmX21zbXBlZzRfcHJlZF9kYyhNcGVnRW5jQ29udGV4dCAqcywgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKipkY192YWxfcHRyLCBpbnQgKmRpcl9wdHIpOworaW50IGZmX3dtdjJfZGVjb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzZdWzY0XSk7CisKKyNkZWZpbmUgQ09ORklHX01TTVBFRzRfREVDT0RFUiAoQ09ORklHX01TTVBFRzRWMV9ERUNPREVSIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX01TTVBFRzRWMl9ERUNPREVSIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX01TTVBFRzRWM19ERUNPREVSIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX1dNVjFfREVDT0RFUiAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX1dNVjJfREVDT0RFUiAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX1ZDMV9ERUNPREVSKQorI2RlZmluZSBDT05GSUdfTVNNUEVHNF9FTkNPREVSIChDT05GSUdfTVNNUEVHNFYyX0VOQ09ERVIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfTVNNUEVHNFYzX0VOQ09ERVIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfV01WMV9FTkNPREVSICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfV01WMl9FTkNPREVSKQorCisjZW5kaWYgLyogQVZDT0RFQ19NU01QRUc0X0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21zbXBlZzRkYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tc21wZWc0ZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjA3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tc21wZWc0ZGF0YS5jCkBAIC0wLDAgKzEsMTk5OSBAQAorLyoKKyAqIE1TTVBFRzQgYmFja2VuZCBmb3IgZW5jb2RlciBhbmQgZGVjb2RlcgorICogY29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogY29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBtc21wZWc0djEgJiB2MiBzdHVmZiBieSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNU01QRUc0IGRhdGEgdGFibGVzLgorICovCisKKyNpbmNsdWRlICJoMjYzLmgiCisjaW5jbHVkZSAibXBlZzR2aWRlby5oIgorI2luY2x1ZGUgIm1zbXBlZzRkYXRhLmgiCisKK3VpbnQzMl90IGZmX3YyX2RjX2x1bV90YWJsZVs1MTJdWzJdOwordWludDMyX3QgZmZfdjJfZGNfY2hyb21hX3RhYmxlWzUxMl1bMl07Cit1aW50OF90ICBmZl9zdGF0aWNfcmxfdGFibGVfc3RvcmVbTkJfUkxfVEFCTEVTXVsyXVsyICogTUFYX1JVTiArIE1BWF9MRVZFTCArIDNdOworCitWTEMgZmZfbXNtcDRfbWJfaV92bGM7CitWTEMgZmZfbXNtcDRfZGNfbHVtYV92bGNbMl07CitWTEMgZmZfbXNtcDRfZGNfY2hyb21hX3ZsY1syXTsKKworLyogaW50cmEgcGljdHVyZSBtYWNyb2Jsb2NrIGNvZGVkIGJsb2NrIHBhdHRlcm4gKi8KK2NvbnN0IHVpbnQxNl90IGZmX21zbXA0X21iX2lfdGFibGVbNjRdWzJdID0geworeyAgMHgxLCAxIH0seyAgMHgxNywgIDYgfSx7ICAgMHg5LCAgNSB9LHsgICAweDUsICA1IH0sCit7ICAweDYsIDUgfSx7ICAweDQ3LCAgOSB9LHsgIDB4MjAsICA3IH0seyAgMHgxMCwgIDcgfSwKK3sgIDB4MiwgNSB9LHsgIDB4N2MsICA5IH0seyAgMHgzYSwgIDcgfSx7ICAweDFkLCAgNyB9LAoreyAgMHgyLCA2IH0seyAgMHhlYywgIDkgfSx7ICAweDc3LCAgOCB9LHsgICAweDAsICA4IH0sCit7ICAweDMsIDUgfSx7ICAweGI3LCAgOSB9LHsgIDB4MmMsICA3IH0seyAgMHgxMywgIDcgfSwKK3sgIDB4MSwgNiB9LHsgMHgxNjgsIDEwIH0seyAgMHg0NiwgIDggfSx7ICAweDNmLCAgOCB9LAoreyAweDFlLCA2IH0seyAweDcxMiwgMTMgfSx7ICAweGI1LCAgOSB9LHsgIDB4NDIsICA4IH0sCit7IDB4MjIsIDcgfSx7IDB4MWM1LCAxMSB9LHsgMHgxMWUsIDEwIH0seyAgMHg4NywgIDkgfSwKK3sgIDB4NiwgNCB9LHsgICAweDMsICA5IH0seyAgMHgxZSwgIDcgfSx7ICAweDFjLCAgNiB9LAoreyAweDEyLCA3IH0seyAweDM4OCwgMTIgfSx7ICAweDQ0LCAgOSB9LHsgIDB4NzAsICA5IH0sCit7IDB4MWYsIDYgfSx7IDB4MjNlLCAxMSB9LHsgIDB4MzksICA4IH0seyAgMHg4ZSwgIDkgfSwKK3sgIDB4MSwgNyB9LHsgMHgxYzYsIDExIH0seyAgMHhiNiwgIDkgfSx7ICAweDQ1LCAgOSB9LAoreyAweDE0LCA2IH0seyAweDIzZiwgMTEgfSx7ICAweDdkLCAgOSB9LHsgIDB4MTgsICA5IH0sCit7ICAweDcsIDcgfSx7IDB4MWM3LCAxMSB9LHsgIDB4ODYsICA5IH0seyAgMHgxOSwgIDkgfSwKK3sgMHgxNSwgNiB9LHsgMHgxZGIsIDEwIH0seyAgIDB4MiwgIDkgfSx7ICAweDQ2LCAgOSB9LAoreyAgMHhkLCA4IH0seyAweDcxMywgMTMgfSx7IDB4MWRhLCAxMCB9LHsgMHgxNjksIDEwIH0sCit9OworCisvKiBub24gaW50cmEgcGljdHVyZSBtYWNyb2Jsb2NrIGNvZGVkIGJsb2NrIHBhdHRlcm4gKyBtYiB0eXBlICovCitjb25zdCB1aW50MzJfdCBmZl90YWJsZV9tYl9ub25faW50cmFbMTI4XVsyXSA9IHsKK3sgICAweDQwLCAgNyB9LHsgICAweDEzYzksIDEzIH0seyAgIDB4OWZkLCAxMiB9LHsgICAweDFmYywgMTUgfSwKK3sgIDB4OWZjLCAxMiB9LHsgICAgMHhhODMsIDE4IH0seyAweDEyZDM0LCAxNyB9LHsgIDB4ODNiYywgMTYgfSwKK3sgIDB4ODNhLCAxMiB9LHsgICAgMHg3ZjgsIDE3IH0seyAgIDB4M2ZkLCAxNiB9LHsgICAweDNmZiwgMTYgfSwKK3sgICAweDc5LCAxMyB9LHsgICAgMHhhODIsIDE4IH0seyAgMHg5NjlkLCAxNiB9LHsgICAweDJhNCwgMTYgfSwKK3sgIDB4OTc4LCAxMiB9LHsgICAgMHg1NDMsIDE3IH0seyAgMHg0MWRmLCAxNSB9LHsgICAweDdmOSwgMTcgfSwKK3sgMHgxMmYzLCAxMyB9LHsgIDB4MjVhNmIsIDE4IH0seyAweDI1ZWY5LCAxOCB9LHsgICAweDNmYSwgMTYgfSwKK3sgMHgyMGVlLCAxNCB9LHsgIDB4OTY5YWIsIDIwIH0seyAgMHg5NjljLCAxNiB9LHsgMHgyNWVmOCwgMTggfSwKK3sgMHgxMmQyLCAxMyB9LHsgICAgMHhhODUsIDE4IH0seyAgMHg5NjllLCAxNiB9LHsgIDB4NGJjOCwgMTUgfSwKK3sgICAweDNkLCAxMiB9LHsgIDB4MTJmN2YsIDE3IH0seyAgIDB4MmEyLCAxNiB9LHsgIDB4OTY5ZiwgMTYgfSwKK3sgMHgyNWVlLCAxNCB9LHsgMHgxMmQzNTUsIDIxIH0seyAweDEyZjdkLCAxNyB9LHsgMHgxMmY3ZSwgMTcgfSwKK3sgIDB4OWU1LCAxMiB9LHsgICAgMHhhODEsIDE4IH0seyAweDRiNGQ0LCAxOSB9LHsgIDB4ODNiZCwgMTYgfSwKK3sgICAweDc4LCAxMyB9LHsgICAweDk2OWIsIDE2IH0seyAgIDB4M2ZlLCAxNiB9LHsgICAweDJhNSwgMTYgfSwKK3sgICAweDdlLCAxMyB9LHsgICAgMHhhODAsIDE4IH0seyAgIDB4MmEzLCAxNiB9LHsgICAweDNmYiwgMTYgfSwKK3sgMHgxMDc2LCAxMyB9LHsgICAgMHhhODQsIDE4IH0seyAgIDB4MTUzLCAxNSB9LHsgIDB4NGJjOSwgMTUgfSwKK3sgICAweDU1LCAxMyB9LHsgMHgxMmQzNTQsIDIxIH0seyAgMHg0YmRlLCAxNSB9LHsgIDB4MjVlNSwgMTQgfSwKK3sgIDB4MjViLCAxMCB9LHsgICAweDRiNGMsIDE1IH0seyAgIDB4OTZiLCAxMiB9LHsgICAweDk2YSwgMTIgfSwKK3sgICAgMHgxLCAgMiB9LHsgICAgICAweDAsICA3IH0seyAgICAweDI2LCAgNiB9LHsgICAweDEyYiwgIDkgfSwKK3sgICAgMHg3LCAgMyB9LHsgICAgMHgyMGYsIDEwIH0seyAgICAgMHg0LCAgOSB9LHsgICAgMHgyOCwgMTIgfSwKK3sgICAgMHg2LCAgMyB9LHsgICAgMHgyMGEsIDEwIH0seyAgIDB4MTI4LCAgOSB9LHsgICAgMHgyYiwgMTIgfSwKK3sgICAweDExLCAgNSB9LHsgICAgIDB4MWIsIDExIH0seyAgIDB4MTNhLCAgOSB9LHsgICAweDRmZiwgMTEgfSwKK3sgICAgMHgzLCAgNCB9LHsgICAgMHgyNzcsIDEwIH0seyAgIDB4MTA2LCAgOSB9LHsgICAweDgzOSwgMTIgfSwKK3sgICAgMHhiLCAgNCB9LHsgICAgMHgyN2IsIDEwIH0seyAgIDB4MTJjLCAgOSB9LHsgICAweDRiZiwgMTEgfSwKK3sgICAgMHg5LCAgNiB9LHsgICAgIDB4MzUsIDEyIH0seyAgIDB4MjdlLCAxMCB9LHsgIDB4MTNjOCwgMTMgfSwKK3sgICAgMHgxLCAgNiB9LHsgICAgMHg0YWEsIDExIH0seyAgIDB4MjA4LCAxMCB9LHsgICAgMHgyOSwgMTIgfSwKK3sgICAgMHgxLCAgNCB9LHsgICAgMHgyNTQsIDEwIH0seyAgIDB4MTJlLCAgOSB9LHsgICAweDgzOCwgMTIgfSwKK3sgICAweDI0LCAgNiB9LHsgICAgMHg0ZjMsIDExIH0seyAgIDB4Mjc2LCAxMCB9LHsgIDB4MTJmNiwgMTMgfSwKK3sgICAgMHgxLCAgNSB9LHsgICAgMHgyN2EsIDEwIH0seyAgIDB4MTNlLCAgOSB9LHsgICAgMHgzZSwgMTIgfSwKK3sgICAgMHg4LCAgNiB9LHsgICAgMHg0MTMsIDExIH0seyAgICAgMHhjLCAxMCB9LHsgICAweDRiZSwgMTEgfSwKK3sgICAweDE0LCAgNSB9LHsgICAgMHg0MTIsIDExIH0seyAgIDB4MjUzLCAxMCB9LHsgICAweDk3YSwgMTIgfSwKK3sgICAweDIxLCAgNiB9LHsgICAgMHg0YWIsIDExIH0seyAgIDB4MjBiLCAxMCB9LHsgICAgMHgzNCwgMTIgfSwKK3sgICAweDE1LCAgNSB9LHsgICAgMHgyNzgsIDEwIH0seyAgIDB4MjUyLCAxMCB9LHsgICAweDk2OCwgMTIgfSwKK3sgICAgMHg1LCAgNSB9LHsgICAgICAweGIsIDEwIH0seyAgICAweDljLCAgOCB9LHsgICAgIDB4ZSwgMTAgfSwKK307CisKKy8qIGRjIHRhYmxlIDAgKi8KKworY29uc3QgdWludDMyX3QgZmZfdGFibGUwX2RjX2x1bVsxMjBdWzJdID0geworeyAgICAgMHgxLCAgMSB9LHsgICAgICAweDEsIDIgfSx7ICAgICAweDEsICA0IH0seyAgICAgMHgxLCAgNSB9LAoreyAgICAgMHg1LCAgNSB9LHsgICAgICAweDcsIDUgfSx7ICAgICAweDgsICA2IH0seyAgICAgMHhjLCAgNiB9LAoreyAgICAgMHgwLCAgNyB9LHsgICAgICAweDIsIDcgfSx7ICAgIDB4MTIsICA3IH0seyAgICAweDFhLCAgNyB9LAoreyAgICAgMHgzLCAgOCB9LHsgICAgICAweDcsIDggfSx7ICAgIDB4MjcsICA4IH0seyAgICAweDM3LCAgOCB9LAoreyAgICAgMHg1LCAgOSB9LHsgICAgIDB4NGMsIDkgfSx7ICAgIDB4NmMsICA5IH0seyAgICAweDZkLCAgOSB9LAoreyAgICAgMHg4LCAxMCB9LHsgICAgMHgxOSwgMTAgfSx7ICAgIDB4OWIsIDEwIH0seyAgICAweDFiLCAxMCB9LAoreyAgICAweDlhLCAxMCB9LHsgICAgMHgxMywgMTEgfSx7ICAgIDB4MzQsIDExIH0seyAgICAweDM1LCAxMSB9LAoreyAgICAweDYxLCAxMiB9LHsgICAgMHg0OCwgMTMgfSx7ICAgIDB4YzQsIDEzIH0seyAgICAweDRhLCAxMyB9LAoreyAgICAweGM2LCAxMyB9LHsgICAgMHhjNywgMTMgfSx7ICAgIDB4OTIsIDE0IH0seyAgIDB4MThiLCAxNCB9LAoreyAgICAweDkzLCAxNCB9LHsgICAweDE4MywgMTQgfSx7ICAgMHgxODIsIDE0IH0seyAgICAweDk2LCAxNCB9LAoreyAgICAweDk3LCAxNCB9LHsgICAweDE4MCwgMTQgfSx7ICAgMHgzMTQsIDE1IH0seyAgIDB4MzE1LCAxNSB9LAoreyAgIDB4NjA1LCAxNiB9LHsgICAweDYwNCwgMTYgfSx7ICAgMHg2MDYsIDE2IH0seyAgIDB4YzBlLCAxNyB9LAoreyAweDMwM2NkLCAyMyB9LHsgMHgzMDNjOSwgMjMgfSx7IDB4MzAzYzgsIDIzIH0seyAweDMwM2NhLCAyMyB9LAoreyAweDMwM2NiLCAyMyB9LHsgMHgzMDNjYywgMjMgfSx7IDB4MzAzY2UsIDIzIH0seyAweDMwM2NmLCAyMyB9LAoreyAweDMwM2QwLCAyMyB9LHsgMHgzMDNkMSwgMjMgfSx7IDB4MzAzZDIsIDIzIH0seyAweDMwM2QzLCAyMyB9LAoreyAweDMwM2Q0LCAyMyB9LHsgMHgzMDNkNSwgMjMgfSx7IDB4MzAzZDYsIDIzIH0seyAweDMwM2Q3LCAyMyB9LAoreyAweDMwM2Q4LCAyMyB9LHsgMHgzMDNkOSwgMjMgfSx7IDB4MzAzZGEsIDIzIH0seyAweDMwM2RiLCAyMyB9LAoreyAweDMwM2RjLCAyMyB9LHsgMHgzMDNkZCwgMjMgfSx7IDB4MzAzZGUsIDIzIH0seyAweDMwM2RmLCAyMyB9LAoreyAweDMwM2UwLCAyMyB9LHsgMHgzMDNlMSwgMjMgfSx7IDB4MzAzZTIsIDIzIH0seyAweDMwM2UzLCAyMyB9LAoreyAweDMwM2U0LCAyMyB9LHsgMHgzMDNlNSwgMjMgfSx7IDB4MzAzZTYsIDIzIH0seyAweDMwM2U3LCAyMyB9LAoreyAweDMwM2U4LCAyMyB9LHsgMHgzMDNlOSwgMjMgfSx7IDB4MzAzZWEsIDIzIH0seyAweDMwM2ViLCAyMyB9LAoreyAweDMwM2VjLCAyMyB9LHsgMHgzMDNlZCwgMjMgfSx7IDB4MzAzZWUsIDIzIH0seyAweDMwM2VmLCAyMyB9LAoreyAweDMwM2YwLCAyMyB9LHsgMHgzMDNmMSwgMjMgfSx7IDB4MzAzZjIsIDIzIH0seyAweDMwM2YzLCAyMyB9LAoreyAweDMwM2Y0LCAyMyB9LHsgMHgzMDNmNSwgMjMgfSx7IDB4MzAzZjYsIDIzIH0seyAweDMwM2Y3LCAyMyB9LAoreyAweDMwM2Y4LCAyMyB9LHsgMHgzMDNmOSwgMjMgfSx7IDB4MzAzZmEsIDIzIH0seyAweDMwM2ZiLCAyMyB9LAoreyAweDMwM2ZjLCAyMyB9LHsgMHgzMDNmZCwgMjMgfSx7IDB4MzAzZmUsIDIzIH0seyAweDMwM2ZmLCAyMyB9LAoreyAweDYwNzgwLCAyNCB9LHsgMHg2MDc4MSwgMjQgfSx7IDB4NjA3ODIsIDI0IH0seyAweDYwNzgzLCAyNCB9LAoreyAweDYwNzg0LCAyNCB9LHsgMHg2MDc4NSwgMjQgfSx7IDB4NjA3ODYsIDI0IH0seyAweDYwNzg3LCAyNCB9LAoreyAweDYwNzg4LCAyNCB9LHsgMHg2MDc4OSwgMjQgfSx7IDB4NjA3OGEsIDI0IH0seyAweDYwNzhiLCAyNCB9LAoreyAweDYwNzhjLCAyNCB9LHsgMHg2MDc4ZCwgMjQgfSx7IDB4NjA3OGUsIDI0IH0seyAweDYwNzhmLCAyNCB9LAorfTsKKworY29uc3QgdWludDMyX3QgZmZfdGFibGUwX2RjX2Nocm9tYVsxMjBdWzJdID0geworeyAgICAgIDB4MCwgIDIgfSx7ICAgICAgMHgxLCAgMiB9LHsgICAgICAweDUsICAzIH0seyAgICAgIDB4OSwgIDQgfSwKK3sgICAgICAweGQsICA0IH0seyAgICAgMHgxMSwgIDUgfSx7ICAgICAweDFkLCAgNSB9LHsgICAgIDB4MWYsICA1IH0sCit7ICAgICAweDIxLCAgNiB9LHsgICAgIDB4MzEsICA2IH0seyAgICAgMHgzOCwgIDYgfSx7ICAgICAweDMzLCAgNiB9LAoreyAgICAgMHgzOSwgIDYgfSx7ICAgICAweDNkLCAgNiB9LHsgICAgIDB4NjEsICA3IH0seyAgICAgMHg3OSwgIDcgfSwKK3sgICAgIDB4ODAsICA4IH0seyAgICAgMHhjOCwgIDggfSx7ICAgICAweGNhLCAgOCB9LHsgICAgIDB4ZjAsICA4IH0sCit7ICAgICAweDgxLCAgOCB9LHsgICAgIDB4YzAsICA4IH0seyAgICAgMHhjOSwgIDggfSx7ICAgIDB4MTA3LCAgOSB9LAoreyAgICAweDEwNiwgIDkgfSx7ICAgIDB4MTk2LCAgOSB9LHsgICAgMHgxODMsICA5IH0seyAgICAweDFlMywgIDkgfSwKK3sgICAgMHgxZTIsICA5IH0seyAgICAweDIwYSwgMTAgfSx7ICAgIDB4MjBiLCAxMCB9LHsgICAgMHg2MDksIDExIH0sCit7ICAgIDB4NDEyLCAxMSB9LHsgICAgMHg0MTMsIDExIH0seyAgICAweDYwYiwgMTEgfSx7ICAgIDB4NDExLCAxMSB9LAoreyAgICAweDYwYSwgMTEgfSx7ICAgIDB4NjVmLCAxMSB9LHsgICAgMHg0MTAsIDExIH0seyAgICAweDY1ZCwgMTEgfSwKK3sgICAgMHg2NWUsIDExIH0seyAgICAweGNiOCwgMTIgfSx7ICAgIDB4YzEwLCAxMiB9LHsgICAgMHhjYjksIDEyIH0sCit7ICAgMHgxODIzLCAxMyB9LHsgICAweDMwNDUsIDE0IH0seyAgIDB4NjA4OSwgMTUgfSx7ICAgMHhjMTEwLCAxNiB9LAoreyAweDMwNDQ0OCwgMjIgfSx7IDB4MzA0NDQ5LCAyMiB9LHsgMHgzMDQ0NGEsIDIyIH0seyAweDMwNDQ0YiwgMjIgfSwKK3sgMHgzMDQ0NGMsIDIyIH0seyAweDMwNDQ0ZCwgMjIgfSx7IDB4MzA0NDRlLCAyMiB9LHsgMHgzMDQ0NGYsIDIyIH0sCit7IDB4MzA0NDUwLCAyMiB9LHsgMHgzMDQ0NTEsIDIyIH0seyAweDMwNDQ1MiwgMjIgfSx7IDB4MzA0NDUzLCAyMiB9LAoreyAweDMwNDQ1NCwgMjIgfSx7IDB4MzA0NDU1LCAyMiB9LHsgMHgzMDQ0NTYsIDIyIH0seyAweDMwNDQ1NywgMjIgfSwKK3sgMHgzMDQ0NTgsIDIyIH0seyAweDMwNDQ1OSwgMjIgfSx7IDB4MzA0NDVhLCAyMiB9LHsgMHgzMDQ0NWIsIDIyIH0sCit7IDB4MzA0NDVjLCAyMiB9LHsgMHgzMDQ0NWQsIDIyIH0seyAweDMwNDQ1ZSwgMjIgfSx7IDB4MzA0NDVmLCAyMiB9LAoreyAweDMwNDQ2MCwgMjIgfSx7IDB4MzA0NDYxLCAyMiB9LHsgMHgzMDQ0NjIsIDIyIH0seyAweDMwNDQ2MywgMjIgfSwKK3sgMHgzMDQ0NjQsIDIyIH0seyAweDMwNDQ2NSwgMjIgfSx7IDB4MzA0NDY2LCAyMiB9LHsgMHgzMDQ0NjcsIDIyIH0sCit7IDB4MzA0NDY4LCAyMiB9LHsgMHgzMDQ0NjksIDIyIH0seyAweDMwNDQ2YSwgMjIgfSx7IDB4MzA0NDZiLCAyMiB9LAoreyAweDMwNDQ2YywgMjIgfSx7IDB4MzA0NDZkLCAyMiB9LHsgMHgzMDQ0NmUsIDIyIH0seyAweDMwNDQ2ZiwgMjIgfSwKK3sgMHgzMDQ0NzAsIDIyIH0seyAweDMwNDQ3MSwgMjIgfSx7IDB4MzA0NDcyLCAyMiB9LHsgMHgzMDQ0NzMsIDIyIH0sCit7IDB4MzA0NDc0LCAyMiB9LHsgMHgzMDQ0NzUsIDIyIH0seyAweDMwNDQ3NiwgMjIgfSx7IDB4MzA0NDc3LCAyMiB9LAoreyAweDMwNDQ3OCwgMjIgfSx7IDB4MzA0NDc5LCAyMiB9LHsgMHgzMDQ0N2EsIDIyIH0seyAweDMwNDQ3YiwgMjIgfSwKK3sgMHgzMDQ0N2MsIDIyIH0seyAweDMwNDQ3ZCwgMjIgfSx7IDB4MzA0NDdlLCAyMiB9LHsgMHgzMDQ0N2YsIDIyIH0sCit7IDB4NjA4ODgwLCAyMyB9LHsgMHg2MDg4ODEsIDIzIH0seyAweDYwODg4MiwgMjMgfSx7IDB4NjA4ODgzLCAyMyB9LAoreyAweDYwODg4NCwgMjMgfSx7IDB4NjA4ODg1LCAyMyB9LHsgMHg2MDg4ODYsIDIzIH0seyAweDYwODg4NywgMjMgfSwKK3sgMHg2MDg4ODgsIDIzIH0seyAweDYwODg4OSwgMjMgfSx7IDB4NjA4ODhhLCAyMyB9LHsgMHg2MDg4OGIsIDIzIH0sCit7IDB4NjA4ODhjLCAyMyB9LHsgMHg2MDg4OGQsIDIzIH0seyAweDYwODg4ZSwgMjMgfSx7IDB4NjA4ODhmLCAyMyB9LAorfTsKKworLyogZGMgdGFibGUgMSAqLworCitjb25zdCB1aW50MzJfdCBmZl90YWJsZTFfZGNfbHVtWzEyMF1bMl0gPSB7Cit7ICAgICAgMHgyLCAgMiB9LHsgICAgICAweDMsICAyIH0seyAgICAgIDB4MywgIDMgfSx7ICAgICAgMHgyLCAgNCB9LAoreyAgICAgIDB4NSwgIDQgfSx7ICAgICAgMHgxLCAgNSB9LHsgICAgICAweDMsICA1IH0seyAgICAgIDB4OCwgIDUgfSwKK3sgICAgICAweDAsICA2IH0seyAgICAgIDB4NSwgIDYgfSx7ICAgICAgMHhkLCAgNiB9LHsgICAgICAweGYsICA2IH0sCit7ICAgICAweDEzLCAgNiB9LHsgICAgICAweDgsICA3IH0seyAgICAgMHgxOCwgIDcgfSx7ICAgICAweDFjLCAgNyB9LAoreyAgICAgMHgyNCwgIDcgfSx7ICAgICAgMHg0LCAgOCB9LHsgICAgICAweDYsICA4IH0seyAgICAgMHgxMiwgIDggfSwKK3sgICAgIDB4MzIsICA4IH0seyAgICAgMHgzYiwgIDggfSx7ICAgICAweDRhLCAgOCB9LHsgICAgIDB4NGIsICA4IH0sCit7ICAgICAgMHhiLCAgOSB9LHsgICAgIDB4MjYsICA5IH0seyAgICAgMHgyNywgIDkgfSx7ICAgICAweDY2LCAgOSB9LAoreyAgICAgMHg3NCwgIDkgfSx7ICAgICAweDc1LCAgOSB9LHsgICAgIDB4MTQsIDEwIH0seyAgICAgMHgxYywgMTAgfSwKK3sgICAgIDB4MWYsIDEwIH0seyAgICAgMHgxZCwgMTAgfSx7ICAgICAweDJiLCAxMSB9LHsgICAgIDB4M2QsIDExIH0sCit7ICAgIDB4MTlkLCAxMSB9LHsgICAgMHgxOWYsIDExIH0seyAgICAgMHg1NCwgMTIgfSx7ICAgIDB4MzM5LCAxMiB9LAoreyAgICAweDMzOCwgMTIgfSx7ICAgIDB4MzNkLCAxMiB9LHsgICAgIDB4YWIsIDEzIH0seyAgICAgMHhmMSwgMTMgfSwKK3sgICAgMHg2NzgsIDEzIH0seyAgICAgMHhmMiwgMTMgfSx7ICAgIDB4MWUwLCAxNCB9LHsgICAgMHgxZTEsIDE0IH0sCit7ICAgIDB4MTU0LCAxNCB9LHsgICAgMHhjZjIsIDE0IH0seyAgICAweDNjYywgMTUgfSx7ICAgIDB4MmFiLCAxNSB9LAoreyAgIDB4MTllNywgMTUgfSx7ICAgIDB4M2NlLCAxNSB9LHsgICAweDE5ZTYsIDE1IH0seyAgICAweDU1NCwgMTYgfSwKK3sgICAgMHg3OWYsIDE2IH0seyAgICAweDU1NSwgMTYgfSx7ICAgIDB4ZjNkLCAxNyB9LHsgICAgMHhmMzcsIDE3IH0sCit7ICAgIDB4ZjNjLCAxNyB9LHsgICAgMHhmMzUsIDE3IH0seyAgIDB4MWU2ZCwgMTggfSx7ICAgMHgxZTY4LCAxOCB9LAoreyAgIDB4M2NkOCwgMTkgfSx7ICAgMHgzY2QzLCAxOSB9LHsgICAweDNjZDksIDE5IH0seyAgIDB4NzlhNCwgMjAgfSwKK3sgIDB4ZjM0YmEsIDI1IH0seyAgMHhmMzRiNCwgMjUgfSx7ICAweGYzNGI1LCAyNSB9LHsgIDB4ZjM0YjYsIDI1IH0sCit7ICAweGYzNGI3LCAyNSB9LHsgIDB4ZjM0YjgsIDI1IH0seyAgMHhmMzRiOSwgMjUgfSx7ICAweGYzNGJiLCAyNSB9LAoreyAgMHhmMzRiYywgMjUgfSx7ICAweGYzNGJkLCAyNSB9LHsgIDB4ZjM0YmUsIDI1IH0seyAgMHhmMzRiZiwgMjUgfSwKK3sgMHgxZTY5NDAsIDI2IH0seyAweDFlNjk0MSwgMjYgfSx7IDB4MWU2OTQyLCAyNiB9LHsgMHgxZTY5NDMsIDI2IH0sCit7IDB4MWU2OTQ0LCAyNiB9LHsgMHgxZTY5NDUsIDI2IH0seyAweDFlNjk0NiwgMjYgfSx7IDB4MWU2OTQ3LCAyNiB9LAoreyAweDFlNjk0OCwgMjYgfSx7IDB4MWU2OTQ5LCAyNiB9LHsgMHgxZTY5NGEsIDI2IH0seyAweDFlNjk0YiwgMjYgfSwKK3sgMHgxZTY5NGMsIDI2IH0seyAweDFlNjk0ZCwgMjYgfSx7IDB4MWU2OTRlLCAyNiB9LHsgMHgxZTY5NGYsIDI2IH0sCit7IDB4MWU2OTUwLCAyNiB9LHsgMHgxZTY5NTEsIDI2IH0seyAweDFlNjk1MiwgMjYgfSx7IDB4MWU2OTUzLCAyNiB9LAoreyAweDFlNjk1NCwgMjYgfSx7IDB4MWU2OTU1LCAyNiB9LHsgMHgxZTY5NTYsIDI2IH0seyAweDFlNjk1NywgMjYgfSwKK3sgMHgxZTY5NTgsIDI2IH0seyAweDFlNjk1OSwgMjYgfSx7IDB4MWU2OTVhLCAyNiB9LHsgMHgxZTY5NWIsIDI2IH0sCit7IDB4MWU2OTVjLCAyNiB9LHsgMHgxZTY5NWQsIDI2IH0seyAweDFlNjk1ZSwgMjYgfSx7IDB4MWU2OTVmLCAyNiB9LAoreyAweDFlNjk2MCwgMjYgfSx7IDB4MWU2OTYxLCAyNiB9LHsgMHgxZTY5NjIsIDI2IH0seyAweDFlNjk2MywgMjYgfSwKK3sgMHgxZTY5NjQsIDI2IH0seyAweDFlNjk2NSwgMjYgfSx7IDB4MWU2OTY2LCAyNiB9LHsgMHgxZTY5NjcsIDI2IH0sCit9OworCitjb25zdCB1aW50MzJfdCBmZl90YWJsZTFfZGNfY2hyb21hWzEyMF1bMl0gPSB7Cit7ICAgICAgIDB4MCwgIDIgfSx7ICAgICAgIDB4MSwgIDIgfSx7ICAgICAgIDB4NCwgIDMgfSx7ICAgICAgIDB4NywgIDMgfSwKK3sgICAgICAgMHhiLCAgNCB9LHsgICAgICAgMHhkLCAgNCB9LHsgICAgICAweDE1LCAgNSB9LHsgICAgICAweDI4LCAgNiB9LAoreyAgICAgIDB4MzAsICA2IH0seyAgICAgIDB4MzIsICA2IH0seyAgICAgIDB4NTIsICA3IH0seyAgICAgIDB4NjIsICA3IH0sCit7ICAgICAgMHg2NiwgIDcgfSx7ICAgICAgMHhhNiwgIDggfSx7ICAgICAgMHhjNiwgIDggfSx7ICAgICAgMHhjZiwgIDggfSwKK3sgICAgIDB4MTRmLCAgOSB9LHsgICAgIDB4MThlLCAgOSB9LHsgICAgIDB4MTljLCAgOSB9LHsgICAgIDB4MjlkLCAxMCB9LAoreyAgICAgMHgzM2EsIDEwIH0seyAgICAgMHg1MzgsIDExIH0seyAgICAgMHg2M2MsIDExIH0seyAgICAgMHg2M2UsIDExIH0sCit7ICAgICAweDYzZiwgMTEgfSx7ICAgICAweDY3NiwgMTEgfSx7ICAgICAweGE3MywgMTIgfSx7ICAgICAweGM3YSwgMTIgfSwKK3sgICAgIDB4Y2VmLCAxMiB9LHsgICAgMHgxNGU1LCAxMyB9LHsgICAgMHgxOWRkLCAxMyB9LHsgICAgMHgyOWM4LCAxNCB9LAoreyAgICAweDI5YzksIDE0IH0seyAgICAweDYzZGQsIDE1IH0seyAgICAweDMzYjgsIDE0IH0seyAgICAweDMzYjksIDE0IH0sCit7ICAgIDB4YzdiNiwgMTYgfSx7ICAgIDB4NjNkOCwgMTUgfSx7ICAgIDB4NjNkZiwgMTUgfSx7ICAgIDB4YzdiMywgMTYgfSwKK3sgICAgMHhjN2I0LCAxNiB9LHsgICAgMHhjN2I1LCAxNiB9LHsgICAgMHg2M2RlLCAxNSB9LHsgICAgMHhjN2I3LCAxNiB9LAoreyAgICAweGM3YjgsIDE2IH0seyAgICAweGM3YjksIDE2IH0seyAgIDB4MThmNjUsIDE3IH0seyAgIDB4MzFlYzgsIDE4IH0sCit7ICAweGM3YjI0OCwgMjQgfSx7ICAweGM3YjI0OSwgMjQgfSx7ICAweGM3YjI0YSwgMjQgfSx7ICAweGM3YjI0YiwgMjQgfSwKK3sgIDB4YzdiMjRjLCAyNCB9LHsgIDB4YzdiMjRkLCAyNCB9LHsgIDB4YzdiMjRlLCAyNCB9LHsgIDB4YzdiMjRmLCAyNCB9LAoreyAgMHhjN2IyNTAsIDI0IH0seyAgMHhjN2IyNTEsIDI0IH0seyAgMHhjN2IyNTIsIDI0IH0seyAgMHhjN2IyNTMsIDI0IH0sCit7ICAweGM3YjI1NCwgMjQgfSx7ICAweGM3YjI1NSwgMjQgfSx7ICAweGM3YjI1NiwgMjQgfSx7ICAweGM3YjI1NywgMjQgfSwKK3sgIDB4YzdiMjU4LCAyNCB9LHsgIDB4YzdiMjU5LCAyNCB9LHsgIDB4YzdiMjVhLCAyNCB9LHsgIDB4YzdiMjViLCAyNCB9LAoreyAgMHhjN2IyNWMsIDI0IH0seyAgMHhjN2IyNWQsIDI0IH0seyAgMHhjN2IyNWUsIDI0IH0seyAgMHhjN2IyNWYsIDI0IH0sCit7ICAweGM3YjI2MCwgMjQgfSx7ICAweGM3YjI2MSwgMjQgfSx7ICAweGM3YjI2MiwgMjQgfSx7ICAweGM3YjI2MywgMjQgfSwKK3sgIDB4YzdiMjY0LCAyNCB9LHsgIDB4YzdiMjY1LCAyNCB9LHsgIDB4YzdiMjY2LCAyNCB9LHsgIDB4YzdiMjY3LCAyNCB9LAoreyAgMHhjN2IyNjgsIDI0IH0seyAgMHhjN2IyNjksIDI0IH0seyAgMHhjN2IyNmEsIDI0IH0seyAgMHhjN2IyNmIsIDI0IH0sCit7ICAweGM3YjI2YywgMjQgfSx7ICAweGM3YjI2ZCwgMjQgfSx7ICAweGM3YjI2ZSwgMjQgfSx7ICAweGM3YjI2ZiwgMjQgfSwKK3sgIDB4YzdiMjcwLCAyNCB9LHsgIDB4YzdiMjcxLCAyNCB9LHsgIDB4YzdiMjcyLCAyNCB9LHsgIDB4YzdiMjczLCAyNCB9LAoreyAgMHhjN2IyNzQsIDI0IH0seyAgMHhjN2IyNzUsIDI0IH0seyAgMHhjN2IyNzYsIDI0IH0seyAgMHhjN2IyNzcsIDI0IH0sCit7ICAweGM3YjI3OCwgMjQgfSx7ICAweGM3YjI3OSwgMjQgfSx7ICAweGM3YjI3YSwgMjQgfSx7ICAweGM3YjI3YiwgMjQgfSwKK3sgIDB4YzdiMjdjLCAyNCB9LHsgIDB4YzdiMjdkLCAyNCB9LHsgIDB4YzdiMjdlLCAyNCB9LHsgIDB4YzdiMjdmLCAyNCB9LAoreyAweDE4ZjY0ODAsIDI1IH0seyAweDE4ZjY0ODEsIDI1IH0seyAweDE4ZjY0ODIsIDI1IH0seyAweDE4ZjY0ODMsIDI1IH0sCit7IDB4MThmNjQ4NCwgMjUgfSx7IDB4MThmNjQ4NSwgMjUgfSx7IDB4MThmNjQ4NiwgMjUgfSx7IDB4MThmNjQ4NywgMjUgfSwKK3sgMHgxOGY2NDg4LCAyNSB9LHsgMHgxOGY2NDg5LCAyNSB9LHsgMHgxOGY2NDhhLCAyNSB9LHsgMHgxOGY2NDhiLCAyNSB9LAoreyAweDE4ZjY0OGMsIDI1IH0seyAweDE4ZjY0OGQsIDI1IH0seyAweDE4ZjY0OGUsIDI1IH0seyAweDE4ZjY0OGYsIDI1IH0sCit9OworCisvKiB2bGMgdGFibGUgMCwgZm9yIGludHJhIGx1bWEgKi8KKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHRhYmxlMF92bGNbMTMzXVsyXSA9IHsKK3sgICAweDEsICAyIH0seyAgIDB4NiwgIDMgfSx7ICAgMHhmLCAgNCB9LHsgIDB4MTYsICA1IH0sCit7ICAweDIwLCAgNiB9LHsgIDB4MTgsICA3IH0seyAgIDB4OCwgIDggfSx7ICAweDlhLCAgOCB9LAoreyAgMHg1NiwgIDkgfSx7IDB4MTNlLCAgOSB9LHsgIDB4ZjAsIDEwIH0seyAweDNhNSwgMTAgfSwKK3sgIDB4NzcsIDExIH0seyAweDFlZiwgMTEgfSx7ICAweDlhLCAxMiB9LHsgIDB4NWQsIDEzIH0sCit7ICAgMHgxLCAgNCB9LHsgIDB4MTEsICA1IH0seyAgIDB4MiwgIDcgfSx7ICAgMHhiLCAgOCB9LAoreyAgMHgxMiwgIDkgfSx7IDB4MWQ2LCAgOSB9LHsgMHgyN2UsIDEwIH0seyAweDE5MSwgMTEgfSwKK3sgIDB4ZWEsIDEyIH0seyAweDNkYywgMTIgfSx7IDB4MTNiLCAxMyB9LHsgICAweDQsICA1IH0sCit7ICAweDE0LCAgNyB9LHsgIDB4OWUsICA4IH0seyAgIDB4OSwgMTAgfSx7IDB4MWFjLCAxMSB9LAoreyAweDFlMiwgMTEgfSx7IDB4M2NhLCAxMiB9LHsgIDB4NWYsIDEzIH0seyAgMHgxNywgIDUgfSwKK3sgIDB4NGUsICA3IH0seyAgMHg1ZSwgIDkgfSx7ICAweGYzLCAxMCB9LHsgMHgxYWQsIDExIH0sCit7ICAweGVjLCAxMiB9LHsgMHg1ZjAsIDEzIH0seyAgIDB4ZSwgIDYgfSx7ICAweGUxLCAgOCB9LAoreyAweDNhNCwgMTAgfSx7ICAweDljLCAxMiB9LHsgMHgxM2QsIDEzIH0seyAgMHgzYiwgIDYgfSwKK3sgIDB4MWMsICA5IH0seyAgMHgxNCwgMTEgfSx7IDB4OWJlLCAxMiB9LHsgICAweDYsICA3IH0sCit7ICAweDdhLCAgOSB9LHsgMHgxOTAsIDExIH0seyAweDEzNywgMTMgfSx7ICAweDFiLCAgNyB9LAoreyAgIDB4OCwgMTAgfSx7IDB4NzVjLCAxMSB9LHsgIDB4NzEsICA3IH0seyAgMHhkNywgMTAgfSwKK3sgMHg5YmYsIDEyIH0seyAgIDB4NywgIDggfSx7ICAweGFmLCAxMCB9LHsgMHg0Y2MsIDExIH0sCit7ICAweDM0LCAgOCB9LHsgMHgyNjUsIDEwIH0seyAgMHg5ZiwgMTIgfSx7ICAweGUwLCAgOCB9LAoreyAgMHgxNiwgMTEgfSx7IDB4MzI3LCAxMiB9LHsgIDB4MTUsICA5IH0seyAweDE3ZCwgMTEgfSwKK3sgMHhlYmIsIDEyIH0seyAgMHgxNCwgIDkgfSx7ICAweGY2LCAxMCB9LHsgMHgxZTQsIDExIH0sCit7ICAweGNiLCAxMCB9LHsgMHg5OWQsIDEyIH0seyAgMHhjYSwgMTAgfSx7IDB4MmZjLCAxMiB9LAoreyAweDE3ZiwgMTEgfSx7IDB4NGNkLCAxMSB9LHsgMHgyZmQsIDEyIH0seyAweDRmZSwgMTEgfSwKK3sgMHgxM2EsIDEzIH0seyAgIDB4YSwgIDQgfSx7ICAweDQyLCAgNyB9LHsgMHgxZDMsICA5IH0sCit7IDB4NGRkLCAxMSB9LHsgIDB4MTIsICA1IH0seyAgMHhlOCwgIDggfSx7ICAweDRjLCAxMSB9LAoreyAweDEzNiwgMTMgfSx7ICAweDM5LCAgNiB9LHsgMHgyNjQsIDEwIH0seyAweGViYSwgMTIgfSwKK3sgICAweDAsICA3IH0seyAgMHhhZSwgMTAgfSx7IDB4OTljLCAxMiB9LHsgIDB4MWYsICA3IH0sCit7IDB4NGRlLCAxMSB9LHsgIDB4NDMsICA3IH0seyAweDRkYywgMTEgfSx7ICAgMHgzLCAgOCB9LAoreyAweDNjYiwgMTIgfSx7ICAgMHg2LCAgOCB9LHsgMHg5OWUsIDEyIH0seyAgMHgyYSwgIDggfSwKK3sgMHg1ZjEsIDEzIH0seyAgIDB4ZiwgIDggfSx7IDB4OWZlLCAxMiB9LHsgIDB4MzMsICA4IH0sCit7IDB4OWZmLCAxMiB9LHsgIDB4OTgsICA4IH0seyAweDk5ZiwgMTIgfSx7ICAweGVhLCAgOCB9LAoreyAweDEzYywgMTMgfSx7ICAweDJlLCAgOCB9LHsgMHgxOTIsIDExIH0seyAweDEzNiwgIDkgfSwKK3sgIDB4NmEsICA5IH0seyAgMHgxNSwgMTEgfSx7IDB4M2FmLCAxMCB9LHsgMHgxZTMsIDExIH0sCit7ICAweDc0LCAxMSB9LHsgIDB4ZWIsIDEyIH0seyAweDJmOSwgMTIgfSx7ICAweDVjLCAxMyB9LAoreyAgMHhlZCwgMTIgfSx7IDB4M2RkLCAxMiB9LHsgMHgzMjYsIDEyIH0seyAgMHg1ZSwgMTMgfSwKK3sgIDB4MTYsICA3IH0sCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IHRhYmxlMF9sZXZlbFsxMzJdID0geworICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwKKyAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCisgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LAorICA5LCAxMCwgMTEsICAxLCAgMiwgIDMsICA0LCAgNSwKKyAgNiwgIDcsICA4LCAgMSwgIDIsICAzLCAgNCwgIDUsCisgIDYsICA3LCAgMSwgIDIsICAzLCAgNCwgIDUsICAxLAorICAyLCAgMywgIDQsICAxLCAgMiwgIDMsICA0LCAgMSwKKyAgMiwgIDMsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsCisgIDEsICAyLCAgMywgIDEsICAyLCAgMywgIDEsICAyLAorICAzLCAgMSwgIDIsICAzLCAgMSwgIDIsICAxLCAgMiwKKyAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwgIDMsCisgIDQsICAxLCAgMiwgIDMsICA0LCAgMSwgIDIsICAzLAorICAxLCAgMiwgIDMsICAxLCAgMiwgIDEsICAyLCAgMSwKKyAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsCisgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLAorICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgMSwgIDEsICAxLCAgMSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgdGFibGUwX3J1blsxMzJdID0geworICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAxLCAgMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMiwKKyAgMiwgIDIsICAyLCAgMywgIDMsICAzLCAgMywgIDMsCisgIDMsICAzLCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LAorICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNywKKyAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksCisgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLAorIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwKKyAxNiwgMTcsIDE4LCAxOSwgMjAsICAwLCAgMCwgIDAsCisgIDAsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLAorICAzLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwKKyAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsCisgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LAorIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwKKyAyMywgMjQsIDI1LCAyNiwKK307CisKKy8qIHZsYyB0YWJsZSAxLCBmb3IgaW50cmEgY2hyb21hIGFuZCBQIG1hY3JvYmxvY2tzICovCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB0YWJsZTFfdmxjWzE0OV1bMl0gPSB7Cit7ICAgIDB4NCwgIDMgfSx7ICAgMHgxNCwgIDUgfSx7ICAgMHgxNywgIDcgfSx7ICAgMHg3ZiwgIDggfSwKK3sgIDB4MTU0LCAgOSB9LHsgIDB4MWYyLCAxMCB9LHsgICAweGJmLCAxMSB9LHsgICAweDY1LCAxMiB9LAoreyAgMHhhYWEsIDEyIH0seyAgMHg2MzAsIDEzIH0seyAweDE1OTcsIDEzIH0seyAgMHgzYjcsIDE0IH0sCit7IDB4MmIyMiwgMTQgfSx7ICAweGJlNiwgMTUgfSx7ICAgIDB4YiwgIDQgfSx7ICAgMHgzNywgIDcgfSwKK3sgICAweDYyLCAgOSB9LHsgICAgMHg3LCAxMSB9LHsgIDB4MTY2LCAxMiB9LHsgICAweGNlLCAxMyB9LAoreyAweDE1OTAsIDEzIH0seyAgMHg1ZjYsIDE0IH0seyAgMHhiZTcsIDE1IH0seyAgICAweDcsICA1IH0sCit7ICAgMHg2ZCwgIDggfSx7ICAgIDB4MywgMTEgfSx7ICAweDMxZiwgMTIgfSx7ICAweDVmMiwgMTQgfSwKK3sgICAgMHgyLCAgNiB9LHsgICAweDYxLCAgOSB9LHsgICAweDU1LCAxMiB9LHsgIDB4MWRmLCAxNCB9LAoreyAgIDB4MWEsICA2IH0seyAgIDB4MWUsIDEwIH0seyAgMHhhYzksIDEyIH0seyAweDJiMjMsIDE0IH0sCit7ICAgMHgxZSwgIDYgfSx7ICAgMHgxZiwgMTAgfSx7ICAweGFjMywgMTIgfSx7IDB4MmIyYiwgMTQgfSwKK3sgICAgMHg2LCAgNyB9LHsgICAgMHg0LCAxMSB9LHsgIDB4MmY4LCAxMyB9LHsgICAweDE5LCAgNyB9LAoreyAgICAweDYsIDExIH0seyAgMHg2M2QsIDEzIH0seyAgIDB4NTcsICA3IH0seyAgMHgxODIsIDExIH0sCit7IDB4MmFhMiwgMTQgfSx7ICAgIDB4NCwgIDggfSx7ICAweDE4MCwgMTEgfSx7ICAweDU5YywgMTQgfSwKK3sgICAweDdkLCAgOCB9LHsgIDB4MTY0LCAxMiB9LHsgIDB4NzZkLCAxNSB9LHsgICAgMHgyLCAgOSB9LAoreyAgMHgxOGQsIDExIH0seyAweDE1ODEsIDEzIH0seyAgIDB4YWQsICA4IH0seyAgIDB4NjAsIDEyIH0sCit7ICAweGM2NywgMTQgfSx7ICAgMHgxYywgIDkgfSx7ICAgMHhlZSwgMTMgfSx7ICAgIDB4MywgIDkgfSwKK3sgIDB4MmNmLCAxMyB9LHsgICAweGQ5LCAgOSB9LHsgMHgxNTgwLCAxMyB9LHsgICAgMHgyLCAxMSB9LAoreyAgMHgxODMsIDExIH0seyAgIDB4NTcsIDEyIH0seyAgIDB4NjEsIDEyIH0seyAgIDB4MzEsIDExIH0sCit7ICAgMHg2NiwgMTIgfSx7ICAweDYzMSwgMTMgfSx7ICAweDYzMiwgMTMgfSx7ICAgMHhhYywgMTMgfSwKK3sgIDB4MzFkLCAxMiB9LHsgICAweDc2LCAxMiB9LHsgICAweDNhLCAxMSB9LHsgIDB4MTY1LCAxMiB9LAoreyAgMHhjNjYsIDE0IH0seyAgICAweDMsICAyIH0seyAgIDB4NTQsICA3IH0seyAgMHgyYWIsIDEwIH0sCit7ICAgMHgxNiwgMTMgfSx7ICAweDVmNywgMTQgfSx7ICAgIDB4NSwgIDQgfSx7ICAgMHhmOCwgIDkgfSwKK3sgIDB4YWE5LCAxMiB9LHsgICAweDVmLCAxNSB9LHsgICAgMHg0LCAgNCB9LHsgICAweDFjLCAxMCB9LAoreyAweDE1NTAsIDEzIH0seyAgICAweDQsICA1IH0seyAgIDB4NzcsIDExIH0seyAgMHg3NmMsIDE1IH0sCit7ICAgIDB4ZSwgIDUgfSx7ICAgIDB4YSwgMTIgfSx7ICAgIDB4YywgIDUgfSx7ICAweDU2MiwgMTEgfSwKK3sgICAgMHg0LCAgNiB9LHsgIDB4MzFjLCAxMiB9LHsgICAgMHg2LCAgNiB9LHsgICAweGM4LCAxMyB9LAoreyAgICAweGQsICA2IH0seyAgMHgxZGEsIDEzIH0seyAgICAweDcsICA2IH0seyAgIDB4YzksIDEzIH0sCit7ICAgIDB4MSwgIDcgfSx7ICAgMHgyZSwgMTQgfSx7ICAgMHgxNCwgIDcgfSx7IDB4MTU5NiwgMTMgfSwKK3sgICAgMHhhLCAgNyB9LHsgIDB4YWMyLCAxMiB9LHsgICAweDE2LCAgNyB9LHsgIDB4MTViLCAxNCB9LAoreyAgIDB4MTUsICA3IH0seyAgMHgxNWEsIDE0IH0seyAgICAweGYsICA4IH0seyAgIDB4NWUsIDE1IH0sCit7ICAgMHg3ZSwgIDggfSx7ICAgMHhhYiwgIDggfSx7ICAgMHgyZCwgIDkgfSx7ICAgMHhkOCwgIDkgfSwKK3sgICAgMHhiLCAgOSB9LHsgICAweDE0LCAxMCB9LHsgIDB4MmIzLCAxMCB9LHsgIDB4MWYzLCAxMCB9LAoreyAgIDB4M2EsIDEwIH0seyAgICAweDAsIDEwIH0seyAgIDB4NTgsIDEwIH0seyAgIDB4MmUsICA5IH0sCit7ICAgMHg1ZSwgMTAgfSx7ICAweDU2MywgMTEgfSx7ICAgMHhlYywgMTIgfSx7ICAgMHg1NCwgMTIgfSwKK3sgIDB4YWMxLCAxMiB9LHsgMHgxNTU2LCAxMyB9LHsgIDB4MmZhLCAxMyB9LHsgIDB4MTgxLCAxMSB9LAoreyAweDE1NTcsIDEzIH0seyAgMHg1OWQsIDE0IH0seyAweDJhYTMsIDE0IH0seyAweDJiMmEsIDE0IH0sCit7ICAweDFkZSwgMTQgfSx7ICAweDYzYywgMTMgfSx7ICAgMHhjZiwgMTMgfSx7IDB4MTU5NCwgMTMgfSwKK3sgICAgMHhkLCAgOSB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB0YWJsZTFfbGV2ZWxbMTQ4XSA9IHsKKyAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCisgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgIDEsICAyLAorICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMSwKKyAgMiwgIDMsICA0LCAgNSwgIDEsICAyLCAgMywgIDQsCisgIDEsICAyLCAgMywgIDQsICAxLCAgMiwgIDMsICA0LAorICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsICAxLCAgMiwKKyAgMywgIDEsICAyLCAgMywgIDEsICAyLCAgMywgIDEsCisgIDIsICAzLCAgMSwgIDIsICAzLCAgMSwgIDIsICAxLAorICAyLCAgMSwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMiwgIDMsICA0LCAgNSwgIDEsICAyLAorICAzLCAgNCwgIDEsICAyLCAgMywgIDEsICAyLCAgMywKKyAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsCisgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLAorICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwKKyAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgMSwgIDEsICAxLCAgMSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgdGFibGUxX3J1blsxNDhdID0geworICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAyLAorICAyLCAgMiwgIDIsICAyLCAgMywgIDMsICAzLCAgMywKKyAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDUsCisgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LAorICA4LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwKKyAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsCisgMTQsIDE1LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLAorIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwKKyAyOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsCisgIDEsICAxLCAgMiwgIDIsICAyLCAgMywgIDMsICAzLAorICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywKKyAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsCisgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LAorIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKKyAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LAorIDQwLCA0MSwgNDIsIDQzLAorfTsKKworLyogdGhpcmQgdmxjIHRhYmxlICovCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB0YWJsZTJfdmxjWzE4Nl1bMl0gPSB7Cit7ICAgIDB4MSwgIDIgfSx7ICAgIDB4NSwgIDMgfSx7ICAgIDB4ZCwgIDQgfSx7ICAgMHgxMiwgIDUgfSwKK3sgICAgMHhlLCAgNiB9LHsgICAweDE1LCAgNyB9LHsgICAweDEzLCAgOCB9LHsgICAweDNmLCAgOCB9LAoreyAgIDB4NGIsICA5IH0seyAgMHgxMWYsICA5IH0seyAgIDB4YjgsIDEwIH0seyAgMHgzZTMsIDEwIH0sCit7ICAweDE3MiwgMTEgfSx7ICAweDI0ZCwgMTIgfSx7ICAweDNkYSwgMTIgfSx7ICAweDJkZCwgMTMgfSwKK3sgMHgxZjU1LCAxMyB9LHsgIDB4NWI5LCAxNCB9LHsgMHgzZWFlLCAxNCB9LHsgICAgMHgwLCAgNCB9LAoreyAgIDB4MTAsICA1IH0seyAgICAweDgsICA3IH0seyAgIDB4MjAsICA4IH0seyAgIDB4MjksICA5IH0sCit7ICAweDFmNCwgIDkgfSx7ICAweDIzMywgMTAgfSx7ICAweDFlMCwgMTEgfSx7ICAweDEyYSwgMTIgfSwKK3sgIDB4M2RkLCAxMiB9LHsgIDB4NTBhLCAxMyB9LHsgMHgxZjI5LCAxMyB9LHsgIDB4YTQyLCAxNCB9LAoreyAweDEyNzIsIDE1IH0seyAweDE3MzcsIDE1IH0seyAgICAweDMsICA1IH0seyAgIDB4MTEsICA3IH0sCit7ICAgMHhjNCwgIDggfSx7ICAgMHg0YiwgMTAgfSx7ICAgMHhiNCwgMTEgfSx7ICAweDdkNCwgMTEgfSwKK3sgIDB4MzQ1LCAxMiB9LHsgIDB4MmQ3LCAxMyB9LHsgIDB4N2JmLCAxMyB9LHsgIDB4OTM4LCAxNCB9LAoreyAgMHhiYmIsIDE0IH0seyAgMHg5NWUsIDE1IH0seyAgIDB4MTMsICA1IH0seyAgIDB4NzgsICA3IH0sCit7ICAgMHg2OSwgIDkgfSx7ICAweDIzMiwgMTAgfSx7ICAweDQ2MSwgMTEgfSx7ICAweDNlYywgMTIgfSwKK3sgIDB4NTIwLCAxMyB9LHsgMHgxZjJhLCAxMyB9LHsgMHgzZTUwLCAxNCB9LHsgMHgzZTUxLCAxNCB9LAoreyAweDE0ODYsIDE1IH0seyAgICAweGMsICA2IH0seyAgIDB4MjQsICA5IH0seyAgIDB4OTQsIDExIH0sCit7ICAweDhjMCwgMTIgfSx7ICAweGYwOSwgMTQgfSx7IDB4MWVmMCwgMTUgfSx7ICAgMHgzZCwgIDYgfSwKK3sgICAweDUzLCAgOSB9LHsgIDB4MWEwLCAxMSB9LHsgIDB4MmQ2LCAxMyB9LHsgIDB4ZjA4LCAxNCB9LAoreyAgIDB4MTMsICA3IH0seyAgIDB4N2MsICA5IH0seyAgMHg3YzEsIDExIH0seyAgMHg0YWMsIDE0IH0sCit7ICAgMHgxYiwgIDcgfSx7ICAgMHhhMCwgMTAgfSx7ICAweDM0NCwgMTIgfSx7ICAweGY3OSwgMTQgfSwKK3sgICAweDc5LCAgNyB9LHsgIDB4M2UxLCAxMCB9LHsgIDB4MmQ0LCAxMyB9LHsgMHgyMzA2LCAxNCB9LAoreyAgIDB4MjEsICA4IH0seyAgMHgyM2MsIDEwIH0seyAgMHhmYWUsIDEyIH0seyAweDIzZGUsIDE0IH0sCit7ICAgMHgzNSwgIDggfSx7ICAweDE3NSwgMTEgfSx7ICAweDdiMywgMTMgfSx7ICAgMHhjNSwgIDggfSwKK3sgIDB4MTc0LCAxMSB9LHsgIDB4Nzg1LCAxMyB9LHsgICAweDQ4LCAgOSB9LHsgIDB4MWEzLCAxMSB9LAoreyAgMHg0OWUsIDEzIH0seyAgIDB4MmMsICA5IH0seyAgIDB4ZmEsIDEwIH0seyAgMHg3ZDYsIDExIH0sCit7ICAgMHg5MiwgMTAgfSx7ICAweDVjYywgMTMgfSx7IDB4MWVmMSwgMTUgfSx7ICAgMHhhMywgMTAgfSwKK3sgIDB4M2VkLCAxMiB9LHsgIDB4OTNlLCAxNCB9LHsgIDB4MWUyLCAxMSB9LHsgMHgxMjczLCAxNSB9LAoreyAgMHg3YzQsIDExIH0seyAweDE0ODcsIDE1IH0seyAgMHgyOTEsIDEyIH0seyAgMHgyOTMsIDEyIH0sCit7ICAweGY4YSwgMTIgfSx7ICAweDUwOSwgMTMgfSx7ICAweDUwOCwgMTMgfSx7ICAweDc4ZCwgMTMgfSwKK3sgIDB4N2JlLCAxMyB9LHsgIDB4NzhjLCAxMyB9LHsgIDB4NGFlLCAxNCB9LHsgIDB4YmJhLCAxNCB9LAoreyAweDIzMDcsIDE0IH0seyAgMHhiOWEsIDE0IH0seyAweDE3MzYsIDE1IH0seyAgICAweGUsICA0IH0sCit7ICAgMHg0NSwgIDcgfSx7ICAweDFmMywgIDkgfSx7ICAweDQ3YSwgMTEgfSx7ICAweDVkYywgMTMgfSwKK3sgMHgyM2RmLCAxNCB9LHsgICAweDE5LCAgNSB9LHsgICAweDI4LCAgOSB9LHsgIDB4MTc2LCAxMSB9LAoreyAgMHg0OWQsIDEzIH0seyAweDIzZGQsIDE0IH0seyAgIDB4MzAsICA2IH0seyAgIDB4YTIsIDEwIH0sCit7ICAweDJlZiwgMTIgfSx7ICAweDViOCwgMTQgfSx7ICAgMHgzZiwgIDYgfSx7ICAgMHhhNSwgMTAgfSwKK3sgIDB4M2RiLCAxMiB9LHsgIDB4OTNmLCAxNCB9LHsgICAweDQ0LCAgNyB9LHsgIDB4N2NiLCAxMSB9LAoreyAgMHg5NWYsIDE1IH0seyAgIDB4NjMsICA3IH0seyAgMHgzYzMsIDEyIH0seyAgIDB4MTUsICA4IH0sCit7ICAweDhmNiwgMTIgfSx7ICAgMHgxNywgIDggfSx7ICAweDQ5OCwgMTMgfSx7ICAgMHgyYywgIDggfSwKK3sgIDB4N2IyLCAxMyB9LHsgICAweDJmLCAgOCB9LHsgMHgxZjU0LCAxMyB9LHsgICAweDhkLCAgOCB9LAoreyAgMHg3YmQsIDEzIH0seyAgIDB4OGUsICA4IH0seyAweDExODIsIDEzIH0seyAgIDB4ZmIsICA4IH0sCit7ICAweDUwYiwgMTMgfSx7ICAgMHgyZCwgIDggfSx7ICAweDdjMCwgMTEgfSx7ICAgMHg3OSwgIDkgfSwKK3sgMHgxZjVmLCAxMyB9LHsgICAweDdhLCAgOSB9LHsgMHgxZjU2LCAxMyB9LHsgIDB4MjMxLCAxMCB9LAoreyAgMHgzZTQsIDEwIH0seyAgMHgxYTEsIDExIH0seyAgMHgxNDMsIDExIH0seyAgMHgxZjcsIDExIH0sCit7ICAweDE2ZiwgMTIgfSx7ICAweDI5MiwgMTIgfSx7ICAweDJlNywgMTIgfSx7ICAweDE2YywgMTIgfSwKK3sgIDB4MTZkLCAxMiB9LHsgIDB4M2RjLCAxMiB9LHsgIDB4ZjhiLCAxMiB9LHsgIDB4NDk5LCAxMyB9LAoreyAgMHgzZDgsIDEyIH0seyAgMHg3OGUsIDEzIH0seyAgMHgyZDUsIDEzIH0seyAweDFmNWUsIDEzIH0sCit7IDB4MWYyYiwgMTMgfSx7ICAweDc4ZiwgMTMgfSx7ICAweDRhZCwgMTQgfSx7IDB4M2VhZiwgMTQgfSwKK3sgMHgyM2RjLCAxNCB9LHsgICAweDRhLCAgOSB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB0YWJsZTJfbGV2ZWxbMTg1XSA9IHsKKyAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCisgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LAorIDE3LCAxOCwgMTksICAxLCAgMiwgIDMsICA0LCAgNSwKKyAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsCisgMTQsIDE1LCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LAorICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsICAxLCAgMiwKKyAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsCisgMTEsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICAxLAorICAyLCAgMywgIDQsICA1LCAgMSwgIDIsICAzLCAgNCwKKyAgMSwgIDIsICAzLCAgNCwgIDEsICAyLCAgMywgIDQsCisgIDEsICAyLCAgMywgIDQsICAxLCAgMiwgIDMsICAxLAorICAyLCAgMywgIDEsICAyLCAgMywgIDEsICAyLCAgMywKKyAgMSwgIDIsICAzLCAgMSwgIDIsICAzLCAgMSwgIDIsCisgIDEsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgMiwgIDMsICA0LCAgNSwgIDYsICAxLCAgMiwgIDMsCisgIDQsICA1LCAgMSwgIDIsICAzLCAgNCwgIDEsICAyLAorICAzLCAgNCwgIDEsICAyLCAgMywgIDEsICAyLCAgMSwKKyAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsCisgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLAorICAyLCAgMSwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAxLAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB0YWJsZTJfcnVuWzE4NV0gPSB7CisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwKKyAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMywgIDMsCisgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLAorICAzLCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwKKyAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsCisgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LAorICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwKKyAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsCisgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LAorIDE3LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKKyAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLAorICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAzLCAgMywKKyAgMywgIDMsICA0LCAgNCwgIDQsICA1LCAgNSwgIDYsCisgIDYsICA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLAorIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwKKyAxNCwgMTUsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsCisgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LAorIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwKKyAzNywKK307CisKKy8qIHNlY29uZCBub24gaW50cmEgdmxjIHRhYmxlICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgdGFibGU0X3ZsY1sxNjldWzJdID0geworeyAgICAweDAsICAzIH0seyAgICAweDMsICA0IH0seyAgICAweGIsICA1IH0seyAgIDB4MTQsICA2IH0sCit7ICAgMHgzZiwgIDYgfSx7ICAgMHg1ZCwgIDcgfSx7ICAgMHhhMiwgIDggfSx7ICAgMHhhYywgIDkgfSwKK3sgIDB4MTZlLCAgOSB9LHsgIDB4MjBhLCAxMCB9LHsgIDB4MmUyLCAxMCB9LHsgIDB4NDMyLCAxMSB9LAoreyAgMHg1YzksIDExIH0seyAgMHg4MjcsIDEyIH0seyAgMHhiNTQsIDEyIH0seyAgMHg0ZTYsIDEzIH0sCit7IDB4MTA1ZiwgMTMgfSx7IDB4MTcyYSwgMTMgfSx7IDB4MjBiMiwgMTQgfSx7IDB4MmQ0ZSwgMTQgfSwKK3sgMHgzOWYwLCAxNCB9LHsgMHg0MTc1LCAxNSB9LHsgMHg1YTllLCAxNSB9LHsgICAgMHg0LCAgNCB9LAoreyAgIDB4MWUsICA1IH0seyAgIDB4NDIsICA3IH0seyAgIDB4YjYsICA4IH0seyAgMHgxNzMsICA5IH0sCit7ICAweDM5NSwgMTAgfSx7ICAweDcyZSwgMTEgfSx7ICAweGI5NCwgMTIgfSx7IDB4MTZhNCwgMTMgfSwKK3sgMHgyMGIzLCAxNCB9LHsgMHgyZTQ1LCAxNCB9LHsgICAgMHg1LCAgNSB9LHsgICAweDQwLCAgNyB9LAoreyAgIDB4NDksICA5IH0seyAgMHgyOGYsIDEwIH0seyAgMHg1Y2IsIDExIH0seyAgMHg0OGEsIDEzIH0sCit7ICAweDlkZCwgMTQgfSx7IDB4NzNlMiwgMTUgfSx7ICAgMHgxOCwgIDUgfSx7ICAgMHgyNSwgIDggfSwKK3sgICAweDhhLCAxMCB9LHsgIDB4NTFiLCAxMSB9LHsgIDB4ZTVmLCAxMiB9LHsgIDB4OWM5LCAxNCB9LAoreyAweDEzOWMsIDE1IH0seyAgIDB4MjksICA2IH0seyAgIDB4NGYsICA5IH0seyAgMHg0MTIsIDExIH0sCit7ICAweDQ4ZCwgMTMgfSx7IDB4MmU0MSwgMTQgfSx7ICAgMHgzOCwgIDYgfSx7ICAweDEwZSwgIDkgfSwKK3sgIDB4NWE4LCAxMSB9LHsgMHgxMDVjLCAxMyB9LHsgMHgzOWYyLCAxNCB9LHsgICAweDU4LCAgNyB9LAoreyAgMHgyMWYsIDEwIH0seyAgMHhlN2UsIDEyIH0seyAweDM5ZmYsIDE0IH0seyAgIDB4MjMsICA4IH0sCit7ICAweDJlMywgMTAgfSx7ICAweDRlNSwgMTMgfSx7IDB4MmU0MCwgMTQgfSx7ICAgMHhhMSwgIDggfSwKK3sgIDB4NWJlLCAxMSB9LHsgIDB4OWM4LCAxNCB9LHsgICAweDgzLCAgOCB9LHsgIDB4MTNhLCAxMSB9LAoreyAweDE3MjEsIDEzIH0seyAgIDB4NDQsICA5IH0seyAgMHgyNzYsIDEyIH0seyAweDM5ZjYsIDE0IH0sCit7ICAgMHg4YiwgMTAgfSx7ICAweDRlZiwgMTMgfSx7IDB4NWE5YiwgMTUgfSx7ICAweDIwOCwgMTAgfSwKK3sgMHgxY2ZlLCAxMyB9LHsgIDB4Mzk5LCAxMCB9LHsgMHgxY2I0LCAxMyB9LHsgIDB4MzllLCAxMCB9LAoreyAweDM5ZjMsIDE0IH0seyAgMHg1YWIsIDExIH0seyAweDczZTMsIDE1IH0seyAgMHg3MzcsIDExIH0sCit7IDB4NWE5ZiwgMTUgfSx7ICAweDgyZCwgMTIgfSx7ICAweGU2OSwgMTIgfSx7ICAweGU2OCwgMTIgfSwKK3sgIDB4NDMzLCAxMSB9LHsgIDB4YjdiLCAxMiB9LHsgMHgyZGY4LCAxNCB9LHsgMHgyZTU2LCAxNCB9LAoreyAweDJlNTcsIDE0IH0seyAweDM5ZjcsIDE0IH0seyAweDUxYTUsIDE1IH0seyAgICAweDMsICAzIH0sCit7ICAgMHgyYSwgIDYgfSx7ICAgMHhlNCwgIDggfSx7ICAweDI4ZSwgMTAgfSx7ICAweDczNSwgMTEgfSwKK3sgMHgxMDU4LCAxMyB9LHsgMHgxY2ZhLCAxMyB9LHsgMHgyZGY5LCAxNCB9LHsgMHg0MTc0LCAxNSB9LAoreyAgICAweDksICA0IH0seyAgIDB4NTQsICA4IH0seyAgMHgzOTgsIDEwIH0seyAgMHg0OGIsIDEzIH0sCit7IDB4MTM5ZCwgMTUgfSx7ICAgIDB4ZCwgIDQgfSx7ICAgMHhhZCwgIDkgfSx7ICAweDgyNiwgMTIgfSwKK3sgMHgyZDRjLCAxNCB9LHsgICAweDExLCAgNSB9LHsgIDB4MTZiLCAgOSB9LHsgIDB4YjdmLCAxMiB9LAoreyAweDUxYTQsIDE1IH0seyAgIDB4MTksICA1IH0seyAgMHgyMWIsIDEwIH0seyAweDE2ZmQsIDEzIH0sCit7ICAgMHgxZCwgIDUgfSx7ICAweDM5NCwgMTAgfSx7IDB4MjhkMywgMTQgfSx7ICAgMHgyYiwgIDYgfSwKK3sgIDB4NWJjLCAxMSB9LHsgMHg1YTlhLCAxNSB9LHsgICAweDJmLCAgNiB9LHsgIDB4MjQ3LCAxMiB9LAoreyAgIDB4MTAsICA3IH0seyAgMHhhMzUsIDEyIH0seyAgIDB4M2UsICA2IH0seyAgMHhiN2EsIDEyIH0sCit7ICAgMHg1OSwgIDcgfSx7IDB4MTA1ZSwgMTMgfSx7ICAgMHgyNiwgIDggfSx7ICAweDljZiwgMTQgfSwKK3sgICAweDU1LCAgOCB9LHsgMHgxY2I1LCAxMyB9LHsgICAweDU3LCAgOCB9LHsgIDB4ZTViLCAxMiB9LAoreyAgIDB4YTAsICA4IH0seyAweDE0NjgsIDEzIH0seyAgMHgxNzAsICA5IH0seyAgIDB4OTAsIDEwIH0sCit7ICAweDFjZSwgIDkgfSx7ICAweDIxYSwgMTAgfSx7ICAweDIxOCwgMTAgfSx7ICAweDE2OCwgIDkgfSwKK3sgIDB4MjFlLCAxMCB9LHsgIDB4MjQ0LCAxMiB9LHsgIDB4NzM2LCAxMSB9LHsgIDB4MTM4LCAxMSB9LAoreyAgMHg1MTksIDExIH0seyAgMHhlNWUsIDEyIH0seyAgMHg3MmMsIDExIH0seyAgMHhiNTUsIDEyIH0sCit7ICAweDlkYywgMTQgfSx7IDB4MjBiYiwgMTQgfSx7ICAweDQ4YywgMTMgfSx7IDB4MTcyMywgMTMgfSwKK3sgMHgyZTQ0LCAxNCB9LHsgMHgxNmE1LCAxMyB9LHsgIDB4NTE4LCAxMSB9LHsgMHgzOWZlLCAxNCB9LAoreyAgMHgxNjksICA5IH0sCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IHRhYmxlNF9sZXZlbFsxNjhdID0geworICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwKKyAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCisgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsICAxLAorICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwKKyAxMCwgMTEsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsCisgIDcsICA4LCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LAorICA3LCAgMSwgIDIsICAzLCAgNCwgIDUsICAxLCAgMiwKKyAgMywgIDQsICA1LCAgMSwgIDIsICAzLCAgNCwgIDEsCisgIDIsICAzLCAgNCwgIDEsICAyLCAgMywgIDEsICAyLAorICAzLCAgMSwgIDIsICAzLCAgMSwgIDIsICAzLCAgMSwKKyAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsCisgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAxLCAgMSwgIDEsICAxLCAgMiwgIDMsICA0LCAgNSwKKyAgNiwgIDcsICA4LCAgOSwgIDEsICAyLCAgMywgIDQsCisgIDUsICAxLCAgMiwgIDMsICA0LCAgMSwgIDIsICAzLAorICA0LCAgMSwgIDIsICAzLCAgMSwgIDIsICAzLCAgMSwKKyAgMiwgIDMsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsCisgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLAorICAxLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB0YWJsZTRfcnVuWzE2OF0gPSB7CisgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsCisgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwKKyAgMiwgIDIsICAzLCAgMywgIDMsICAzLCAgMywgIDMsCisgIDMsICA0LCAgNCwgIDQsICA0LCAgNCwgIDUsICA1LAorICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNywKKyAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOSwgIDksCisgIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLAorIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNiwKKyAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsCisgMjQsIDI1LCAyNiwgIDAsICAwLCAgMCwgIDAsICAwLAorICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwKKyAgMSwgIDIsICAyLCAgMiwgIDIsICAzLCAgMywgIDMsCisgIDMsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA2LAorICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwKKyAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsCisgMTQsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLAorIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwKKyAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsCit9OworCitSTFRhYmxlIGZmX3JsX3RhYmxlW05CX1JMX1RBQkxFU10gPSB7CisgICAgLyogaW50cmEgbHVtaW5hbmNlIHRhYmxlcyAqLworICAgIC8qIGxvdyBtb3Rpb24gICovCisgICAgeworICAgICAgICAxMzIsCisgICAgICAgIDg1LAorICAgICAgICB0YWJsZTBfdmxjLAorICAgICAgICB0YWJsZTBfcnVuLAorICAgICAgICB0YWJsZTBfbGV2ZWwsCisgICAgfSwKKyAgICAvKiBoaWdoIG1vdGlvbiAqLworICAgIHsKKyAgICAgICAgMTg1LAorICAgICAgICAxMTksCisgICAgICAgIHRhYmxlMl92bGMsCisgICAgICAgIHRhYmxlMl9ydW4sCisgICAgICAgIHRhYmxlMl9sZXZlbCwKKyAgICB9LAorICAgIC8qIG1pZC1yYXRlICovCisgICAgeworICAgICAgICAxMDIsCisgICAgICAgIDY3LAorICAgICAgICBmZl9tcGVnNF9pbnRyYV92bGMsCisgICAgICAgIGZmX21wZWc0X2ludHJhX3J1biwKKyAgICAgICAgZmZfbXBlZzRfaW50cmFfbGV2ZWwsCisgICAgfSwKKyAgICAvKiBpbnRyYSBjaHJvbWluYW5jZSAvIG5vbiBpbnRyYSB0YWJsZXMgKi8KKyAgICAvKiBsb3cgbW90aW9uIGludGVyICovCisgICAgeworICAgICAgICAxNDgsCisgICAgICAgIDgxLAorICAgICAgICB0YWJsZTFfdmxjLAorICAgICAgICB0YWJsZTFfcnVuLAorICAgICAgICB0YWJsZTFfbGV2ZWwsCisgICAgfSwKKyAgICAvKiBoaWdoIG1vdGlvbiBpbnRlciAqLworICAgIHsKKyAgICAgICAgMTY4LAorICAgICAgICA5OSwKKyAgICAgICAgdGFibGU0X3ZsYywKKyAgICAgICAgdGFibGU0X3J1biwKKyAgICAgICAgdGFibGU0X2xldmVsLAorICAgIH0sCisgICAgLyogbWlkIHJhdGUgaW50ZXIgKi8KKyAgICB7CisgICAgICAgIDEwMiwKKyAgICAgICAgNTgsCisgICAgICAgIGZmX2ludGVyX3ZsYywKKyAgICAgICAgZmZfaW50ZXJfcnVuLAorICAgICAgICBmZl9pbnRlcl9sZXZlbCwKKyAgICB9LAorfTsKKworLyogbW90aW9uIHZlY3RvciB0YWJsZSAwICovCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB0YWJsZTBfbXZfY29kZVsxMTAwXSA9IHsKKyAweDAwMDEsIDB4MDAwMywgMHgwMDA1LCAweDAwMDcsIDB4MDAwMywgMHgwMDA4LCAweDAwMGMsIDB4MDAwMSwKKyAweDAwMDIsIDB4MDAxYiwgMHgwMDA2LCAweDAwMGIsIDB4MDAxNSwgMHgwMDAyLCAweDAwMGUsIDB4MDAwZiwKKyAweDAwMTQsIDB4MDAyMCwgMHgwMDIyLCAweDAwMjUsIDB4MDAyNywgMHgwMDI5LCAweDAwMmQsIDB4MDA0YiwKKyAweDAwNGQsIDB4MDAwMywgMHgwMDIyLCAweDAwMjMsIDB4MDAyNSwgMHgwMDI3LCAweDAwNDIsIDB4MDA0OCwKKyAweDAwNDksIDB4MDA1MCwgMHgwMDVjLCAweDAwOTEsIDB4MDA5ZiwgMHgwMDBlLCAweDAwNDMsIDB4MDA0YywKKyAweDAwNTQsIDB4MDA1NiwgMHgwMDhjLCAweDAwOTgsIDB4MDA5YSwgMHgwMDliLCAweDAwYjEsIDB4MDBiMiwKKyAweDAxMjAsIDB4MDEyMSwgMHgwMTI2LCAweDAxMzMsIDB4MDEzOSwgMHgwMWExLCAweDAxYTQsIDB4MDFhNSwKKyAweDAxYTYsIDB4MDFhNywgMHgwMWFlLCAweDAxYWYsIDB4MDAwYiwgMHgwMDE5LCAweDAwODUsIDB4MDA5MCwKKyAweDAwOWIsIDB4MDBhYSwgMHgwMGFmLCAweDAxMGMsIDB4MDEwZSwgMHgwMTFjLCAweDAxMWUsIDB4MDEzMywKKyAweDAxNDQsIDB4MDE2MCwgMHgwMTc0LCAweDAxNzUsIDB4MDE3NywgMHgwMTc4LCAweDAyNDksIDB4MDI0YiwKKyAweDAyNTIsIDB4MDI2MSwgMHgwMjY1LCAweDAyNzAsIDB4MDM1MiwgMHgwMzUzLCAweDAzNTUsIDB4MDM1OSwKKyAweDAwMTAsIDB4MDAxMSwgMHgwMDEzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzZCwKKyAweDAwM2UsIDB4MDEwOSwgMHgwMTI2LCAweDAxNTYsIDB4MDIxYSwgMHgwMjFlLCAweDAyM2EsIDB4MDIzZSwKKyAweDAyOGUsIDB4MDI4ZiwgMHgwMmNmLCAweDA0OTEsIDB4MDQ5NCwgMHgwNDlmLCAweDA0YTAsIDB4MDRhMywKKyAweDA0YTYsIDB4MDRhNywgMHgwNGFkLCAweDA0YWUsIDB4MDRjMCwgMHgwNGM0LCAweDA0YzYsIDB4MDRjOCwKKyAweDA0YzksIDB4MDRmNSwgMHgwNGY2LCAweDA0ZjcsIDB4MDY4MCwgMHgwNjgyLCAweDA2ODMsIDB4MDY4OCwKKyAweDA2ODksIDB4MDY4ZCwgMHgwNjhlLCAweDA2OGYsIDB4MDZhMiwgMHgwNmEzLCAweDA2YTksIDB4MDZiMCwKKyAweDA2YjEsIDB4MDZiNCwgMHgwNmI1LCAweDAwMjQsIDB4MDA2MCwgMHgwMDYzLCAweDAwNzgsIDB4MDA3OSwKKyAweDAyMTEsIDB4MDI0NCwgMHgwMjQ1LCAweDAyNDcsIDB4MDI0OCwgMHgwMjQ5LCAweDAyNGEsIDB4MDI0YiwKKyAweDAyNmIsIDB4MDJhZiwgMHgwMmI4LCAweDAyYmIsIDB4MDQzNiwgMHgwNDc2LCAweDA0NzcsIDB4MDQ3ZSwKKyAweDA0YzgsIDB4MDRjOSwgMHgwNGNhLCAweDA1MTQsIDB4MDU4NiwgMHgwNTg3LCAweDA1OTgsIDB4MDU5ZCwKKyAweDA1ZDksIDB4MDVkYSwgMHgwOTIwLCAweDA5MjEsIDB4MDkzYiwgMHgwOTNjLCAweDA5M2QsIDB4MDk0MiwKKyAweDA5NDMsIDB4MDk0NCwgMHgwOTQ1LCAweDA5NTksIDB4MDk1ZSwgMHgwOTVmLCAweDA5ODIsIDB4MDk4MywKKyAweDA5OGUsIDB4MDk4ZiwgMHgwOWM0LCAweDA5ZTcsIDB4MDllOCwgMHgwOWU5LCAweDBkMDIsIDB4MGQxNywKKyAweDBkMTgsIDB4MGQxOSwgMHgwZDQxLCAweDBkNDIsIDB4MGQ0MywgMHgwZDUwLCAweDBkNWYsIDB4MGQ2ZCwKKyAweDBkNmUsIDB4MGQ2ZiwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAweDAwYzIsIDB4MDBjMywgMHgwMGM0LCAweDAwYzUsIDB4MDQxZSwgMHgwNDFmLCAweDA0MjAsIDB4MDQyMSwKKyAweDA0OGMsIDB4MDQ4ZCwgMHgwNGQzLCAweDA0ZDQsIDB4MDRkNSwgMHgwNTVjLCAweDA1NWQsIDB4MDU3MiwKKyAweDA1NzMsIDB4MDU3NCwgMHgwNTc1LCAweDA4ZGUsIDB4MDhkZiwgMHgwOGZlLCAweDA4ZmYsIDB4MDk5NiwKKyAweDBhMzYsIDB4MGEzNywgMHgwYjA4LCAweDBiMDksIDB4MGIwYSwgMHgwYjBiLCAweDBiMzIsIDB4MGIzMywKKyAweDBiMzQsIDB4MGIzNSwgMHgwYjM2LCAweDBiMzcsIDB4MGIzOCwgMHgwYjM5LCAweDBiYjAsIDB4MGJmNywKKyAweDBiZjgsIDB4MGJmOSwgMHgwYmZhLCAweDBiZmIsIDB4MGJmYywgMHgwYmZkLCAweDBiZmUsIDB4MGJmZiwKKyAweDEyNTQsIDB4MTI1NSwgMHgxMjU2LCAweDEyNTcsIDB4MTI3MCwgMHgxMjcxLCAweDEyNzIsIDB4MTI3MywKKyAweDEyNzQsIDB4MTI3NSwgMHgxMmFiLCAweDEyYWMsIDB4MTJhZCwgMHgxMmFlLCAweDEyYWYsIDB4MTJiMCwKKyAweDEyYjEsIDB4MTMxNSwgMHgxMzE2LCAweDEzMTcsIDB4MTNiZiwgMHgxM2MwLCAweDEzYzEsIDB4MTNjMiwKKyAweDEzYzMsIDB4MTNjNCwgMHgxM2M1LCAweDEzYzYsIDB4MTNjNywgMHgxM2M4LCAweDEzYzksIDB4MTNjYSwKKyAweDEzY2IsIDB4MTNjYywgMHgxM2NkLCAweDFhMDYsIDB4MWEwNywgMHgxYTI4LCAweDFhMjksIDB4MWEyYSwKKyAweDFhMmIsIDB4MWEyYywgMHgxYTJkLCAweDFhODAsIDB4MWFiYiwgMHgxYWJjLCAweDFhYmQsIDB4MWFkOCwKKyAweDFhZDksIDB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywgMHgwMGEwLCAweDAwYTEsIDB4MDBhMiwKKyAweDAwYTMsIDB4MDgzMSwgMHgwODMyLCAweDA4MzMsIDB4MDgzNCwgMHgwODM1LCAweDA4MzYsIDB4MDgzNywKKyAweDA4MzgsIDB4MDgzOSwgMHgwODNhLCAweDA4M2IsIDB4MDkzOSwgMHgwOTNhLCAweDA5M2IsIDB4MDkzYywKKyAweDA5M2QsIDB4MDkzZSwgMHgwOTNmLCAweDA5YTAsIDB4MDlhMSwgMHgwOWEyLCAweDA5YTMsIDB4MDlhNCwKKyAweDA5YTUsIDB4MTFhYywgMHgxMWFkLCAweDExYWUsIDB4MTFhZiwgMHgxMWIwLCAweDExYjEsIDB4MTFiMiwKKyAweDExYjMsIDB4MTFiNCwgMHgxMWI1LCAweDExYjYsIDB4MTFiNywgMHgxMWI4LCAweDExYjksIDB4MTFiYSwKKyAweDExYmIsIDB4MTMyZiwgMHgxNDU0LCAweDE0NTUsIDB4MTQ1NiwgMHgxNDU3LCAweDE0NTgsIDB4MTQ1OSwKKyAweDE0NWEsIDB4MTQ1YiwgMHgxNDVjLCAweDE0NWQsIDB4MTQ1ZSwgMHgxNDVmLCAweDE0NjAsIDB4MTQ2MSwKKyAweDE0NjIsIDB4MTQ2MywgMHgxNDY0LCAweDE0NjUsIDB4MTQ2NiwgMHgxNDY3LCAweDE0NjgsIDB4MTQ2OSwKKyAweDE0NmEsIDB4MTQ2YiwgMHgxN2RlLCAweDE3ZGYsIDB4MTdlMCwgMHgxN2UxLCAweDE3ZTIsIDB4MTdlMywKKyAweDE3ZTQsIDB4MTdlNSwgMHgxN2U2LCAweDE3ZTcsIDB4MTdlOCwgMHgxN2U5LCAweDE3ZWEsIDB4MTdlYiwKKyAweDE3ZWMsIDB4MTdlZCwgMHgyNTQwLCAweDI1NDEsIDB4MjU0MiwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwKKyAweDI1NDYsIDB4MjU0NywgMHgyNTQ4LCAweDI1NDksIDB4MjU0YSwgMHgyNTRiLCAweDI1NGMsIDB4MjU0ZCwKKyAweDI1NGUsIDB4MjU0ZiwgMHgyNTUwLCAweDI1NTEsIDB4MjU1MiwgMHgyNTUzLCAweDI1NTQsIDB4MjU1NSwKKyAweDI2MjgsIDB4Mjc2NiwgMHgyNzY3LCAweDI3NjgsIDB4Mjc2OSwgMHgyNzZhLCAweDI3NmIsIDB4Mjc2YywKKyAweDI3NmQsIDB4Mjc2ZSwgMHgyNzZmLCAweDI3NzAsIDB4Mjc3MSwgMHgyNzcyLCAweDI3NzMsIDB4Mjc3NCwKKyAweDI3NzUsIDB4Mjc3NiwgMHgyNzc3LCAweDI3NzgsIDB4Mjc3OSwgMHgyNzdhLCAweDI3N2IsIDB4Mjc3YywKKyAweDI3N2QsIDB4MzUwMywgMHgzNTQ0LCAweDM1NDUsIDB4MzU0NiwgMHgzNTQ3LCAweDM1NjAsIDB4MzU2MSwKKyAweDM1NjIsIDB4MzU2MywgMHgzNTY0LCAweDM1NjUsIDB4MzU2NiwgMHgzNTY3LCAweDM1NjgsIDB4MzU2OSwKKyAweDM1NmEsIDB4MzU2YiwgMHgzNTZjLCAweDM1NmQsIDB4MzU2ZSwgMHgzNTZmLCAweDM1NzAsIDB4MzU3MSwKKyAweDM1NzIsIDB4MzU3MywgMHgzNTc0LCAweDM1NzUsIDB4MDNmMCwgMHgxMDNkLCAweDEwM2UsIDB4MTAzZiwKKyAweDEwNDAsIDB4MTA0MSwgMHgxMDQyLCAweDEwNDMsIDB4MTA0NCwgMHgxMDQ1LCAweDEwNDYsIDB4MTA0NywKKyAweDEwNDgsIDB4MTA0OSwgMHgxMDRhLCAweDEwNGIsIDB4MTA0YywgMHgxMDRkLCAweDEwNGUsIDB4MTA0ZiwKKyAweDEwNTAsIDB4MTA1MSwgMHgxMDUyLCAweDEwNTMsIDB4MTA1NCwgMHgxMDU1LCAweDEwNTYsIDB4MTA1NywKKyAweDEwNTgsIDB4MTA1OSwgMHgxMDVhLCAweDEwNWIsIDB4MTA1YywgMHgxMDVkLCAweDEwNWUsIDB4MTA1ZiwKKyAweDEwNjAsIDB4MTA2MSwgMHgxMjcwLCAweDEyNzEsIDB4MjFiOCwgMHgyMWI5LCAweDIxYmEsIDB4MjFiYiwKKyAweDIxYmMsIDB4MjFiZCwgMHgyMWJlLCAweDIxYmYsIDB4MjFmMCwgMHgyMWYxLCAweDIxZjIsIDB4MjFmMywKKyAweDIxZjQsIDB4MjFmNSwgMHgyMWY2LCAweDIxZjcsIDB4MjFmOCwgMHgyMWY5LCAweDIxZmEsIDB4MjFmYiwKKyAweDIxZmMsIDB4MjFmZCwgMHgyMWZlLCAweDIxZmYsIDB4MjM0MCwgMHgyMzQxLCAweDIzNDIsIDB4MjM0MywKKyAweDIzNDQsIDB4MjM0NSwgMHgyMzQ2LCAweDIzNDcsIDB4MjM0OCwgMHgyMzQ5LCAweDIzNGEsIDB4MjM0YiwKKyAweDIzNGMsIDB4MjM0ZCwgMHgyMzRlLCAweDIzNGYsIDB4MjM1MCwgMHgyMzUxLCAweDIzNTIsIDB4MjM1MywKKyAweDIzNTQsIDB4MjM1NSwgMHgyMzU2LCAweDIzNTcsIDB4MjY1YywgMHgyZjg4LCAweDJmODksIDB4MmY4YSwKKyAweDJmOGIsIDB4MmY4YywgMHgyZjhkLCAweDJmOGUsIDB4MmY4ZiwgMHgyZjkwLCAweDJmOTEsIDB4MmY5MiwKKyAweDJmOTMsIDB4MmY5NCwgMHgyZjk1LCAweDJmOTYsIDB4MmY5NywgMHgyZjk4LCAweDJmOTksIDB4MmY5YSwKKyAweDJmOWIsIDB4MmY5YywgMHgyZjlkLCAweDJmOWUsIDB4MmY5ZiwgMHgyZmEwLCAweDJmYTEsIDB4MmZhMiwKKyAweDJmYTMsIDB4MmZhNCwgMHgyZmE1LCAweDJmYTYsIDB4MmZhNywgMHgyZmE4LCAweDJmYTksIDB4MmZhYSwKKyAweDJmYWIsIDB4MmZhYywgMHgyZmFkLCAweDJmYWUsIDB4MmZhZiwgMHgyZmIwLCAweDJmYjEsIDB4MmZiMiwKKyAweDJmYjMsIDB4MmZiNCwgMHgyZmI1LCAweDJmYjYsIDB4MmZiNywgMHgyZmI4LCAweDJmYjksIDB4MmZiYSwKKyAweDJmYmIsIDB4NGM1MiwgMHg0YzUzLCAweDRlMjgsIDB4NGUyOSwgMHg0ZTJhLCAweDRlMmIsIDB4NGUyYywKKyAweDRlMmQsIDB4NGUyZSwgMHg0ZTJmLCAweDRlMzAsIDB4NGUzMSwgMHg0ZTMyLCAweDRlMzMsIDB4NGUzNCwKKyAweDRlMzUsIDB4NGUzNiwgMHg0ZTM3LCAweDRlMzgsIDB4NGUzOSwgMHg0ZTNhLCAweDRlM2IsIDB4NGUzYywKKyAweDRlM2QsIDB4NGUzZSwgMHg0ZTNmLCAweDRlODAsIDB4NGU4MSwgMHg0ZTgyLCAweDRlODMsIDB4NGU4NCwKKyAweDRlODUsIDB4NGU4NiwgMHg0ZTg3LCAweDRlODgsIDB4NGU4OSwgMHg0ZThhLCAweDRlOGIsIDB4NGU4YywKKyAweDRlOGQsIDB4NGU4ZSwgMHg0ZThmLCAweDRlOTAsIDB4NGU5MSwgMHg0ZTkyLCAweDRlOTMsIDB4NGU5NCwKKyAweDRlOTUsIDB4NGU5NiwgMHg0ZTk3LCAweDRlOTgsIDB4NGU5OSwgMHg0ZTlhLCAweDRlOWIsIDB4NGU5YywKKyAweDRlOWQsIDB4NGU5ZSwgMHg0ZTlmLCAweDRlYTAsIDB4NGVhMSwgMHg0ZWEyLCAweDRlYTMsIDB4NGVhNCwKKyAweDRlYTUsIDB4NGVhNiwgMHg0ZWE3LCAweDRlYTgsIDB4NGVhOSwgMHg0ZWFhLCAweDRlYWIsIDB4NGVhYywKKyAweDRlYWQsIDB4NGVhZSwgMHg0ZWFmLCAweDRlYjAsIDB4NGViMSwgMHg0ZWIyLCAweDRlYjMsIDB4NGViNCwKKyAweDRlYjUsIDB4NGViNiwgMHg0ZWI3LCAweDRlYjgsIDB4NGViOSwgMHg0ZWJhLCAweDRlYmIsIDB4NGViYywKKyAweDRlYmQsIDB4NGViZSwgMHg0ZWJmLCAweDRlYzAsIDB4NGVjMSwgMHg0ZWMyLCAweDRlYzMsIDB4NGVjNCwKKyAweDRlYzUsIDB4NGVjNiwgMHg0ZWM3LCAweDRlYzgsIDB4NGVjOSwgMHg0ZWNhLCAweDRlY2IsIDB4NmEwNCwKKyAweDZhMDUsIDB4MDdlMiwgMHgwN2UzLCAweDA3ZTQsIDB4MDdlNSwgMHgwN2U2LCAweDA3ZTcsIDB4MDdlOCwKKyAweDA3ZTksIDB4MDdlYSwgMHgwN2ViLCAweDA3ZWMsIDB4MDdlZCwgMHgwN2VlLCAweDA3ZWYsIDB4MDdmMCwKKyAweDA3ZjEsIDB4MDdmMiwgMHgwN2YzLCAweDA3ZjQsIDB4MDdmNSwgMHgwN2Y2LCAweDA3ZjcsIDB4MDdmOCwKKyAweDA3ZjksIDB4MDdmYSwgMHgwN2ZiLCAweDA3ZmMsIDB4MDdmZCwgMHgwN2ZlLCAweDA3ZmYsIDB4MjAwMCwKKyAweDIwMDEsIDB4MjAwMiwgMHgyMDAzLCAweDIwMDQsIDB4MjAwNSwgMHgyMDA2LCAweDIwMDcsIDB4MjAwOCwKKyAweDIwMDksIDB4MjAwYSwgMHgyMDBiLCAweDIwMGMsIDB4MjAwZCwgMHgyMDBlLCAweDIwMGYsIDB4MjAxMCwKKyAweDIwMTEsIDB4MjAxMiwgMHgyMDEzLCAweDIwMTQsIDB4MjAxNSwgMHgyMDE2LCAweDIwMTcsIDB4MjAxOCwKKyAweDIwMTksIDB4MjAxYSwgMHgyMDFiLCAweDIwMWMsIDB4MjAxZCwgMHgyMDFlLCAweDIwMWYsIDB4MjAyMCwKKyAweDIwMjEsIDB4MjAyMiwgMHgyMDIzLCAweDIwMjQsIDB4MjAyNSwgMHgyMDI2LCAweDIwMjcsIDB4MjAyOCwKKyAweDIwMjksIDB4MjAyYSwgMHgyMDJiLCAweDIwMmMsIDB4MjAyZCwgMHgyMDJlLCAweDIwMmYsIDB4MjAzMCwKKyAweDIwMzEsIDB4MjAzMiwgMHgyMDMzLCAweDIwMzQsIDB4MjAzNSwgMHgyMDM2LCAweDIwMzcsIDB4MjAzOCwKKyAweDIwMzksIDB4MjAzYSwgMHgyMDNiLCAweDIwM2MsIDB4MjAzZCwgMHgyMDNlLCAweDIwM2YsIDB4MjA0MCwKKyAweDIwNDEsIDB4MjA0MiwgMHgyMDQzLCAweDIwNDQsIDB4MjA0NSwgMHgyMDQ2LCAweDIwNDcsIDB4MjA0OCwKKyAweDIwNDksIDB4MjA0YSwgMHgyMDRiLCAweDIwNGMsIDB4MjA0ZCwgMHgyMDRlLCAweDIwNGYsIDB4MjA1MCwKKyAweDIwNTEsIDB4MjA1MiwgMHgyMDUzLCAweDIwNTQsIDB4MjA1NSwgMHgyMDU2LCAweDIwNTcsIDB4MjA1OCwKKyAweDIwNTksIDB4MjA1YSwgMHgyMDViLCAweDIwNWMsIDB4MjA1ZCwgMHgyMDVlLCAweDIwNWYsIDB4MjA2MCwKKyAweDIwNjEsIDB4MjA2MiwgMHgyMDYzLCAweDIwNjQsIDB4MjA2NSwgMHgyMDY2LCAweDIwNjcsIDB4MjA2OCwKKyAweDIwNjksIDB4MjA2YSwgMHgyMDZiLCAweDIwNmMsIDB4MjA2ZCwgMHgyMDZlLCAweDIwNmYsIDB4MjA3MCwKKyAweDIwNzEsIDB4MjA3MiwgMHgyMDczLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsIDB4MjA3OCwKKyAweDIwNzksIDB4NGNiYSwgMHg0Y2JiLCAweDVkODgsIDB4NWQ4OSwgMHg1ZDhhLCAweDVkOGIsIDB4NWQ4YywKKyAweDVkOGQsIDB4NWQ4ZSwgMHg1ZDhmLCAweDVkYjAsIDB4NWRiMSwgMHg1ZGIyLCAweDVkYjMsIDB4NWRiNCwKKyAweDVkYjUsIDB4NWRiNiwgMHg1ZGI3LCAweDVkYjgsIDB4NWRiOSwgMHg1ZGJhLCAweDVkYmIsIDB4NWRiYywKKyAweDVkYmQsIDB4NWRiZSwgMHg1ZGJmLCAweDVlNDAsIDB4NWU0MSwgMHg1ZTQyLCAweDVlNDMsIDB4NWU0NCwKKyAweDVlNDUsIDB4NWU0NiwgMHg1ZTQ3LCAweDVlNDgsIDB4NWU0OSwgMHg1ZTRhLCAweDVlNGIsIDB4NWU0YywKKyAweDVlNGQsIDB4NWU0ZSwgMHg1ZTRmLCAweDVlNTAsIDB4NWU1MSwgMHg1ZTUyLCAweDVlNTMsIDB4NWU1NCwKKyAweDVlNTUsIDB4NWU1NiwgMHg1ZTU3LCAweDVlNTgsIDB4NWU1OSwgMHg1ZTVhLCAweDVlNWIsIDB4NWU1YywKKyAweDVlNWQsIDB4NWU1ZSwgMHg1ZTVmLCAweDVlNjAsIDB4NWU2MSwgMHg1ZTYyLCAweDVlNjMsIDB4NWU2NCwKKyAweDVlNjUsIDB4NWU2NiwgMHg1ZTY3LCAweDVlNjgsIDB4NWU2OSwgMHg1ZTZhLCAweDVlNmIsIDB4NWU2YywKKyAweDVlNmQsIDB4NWU2ZSwgMHg1ZTZmLCAweDVlNzAsIDB4NWU3MSwgMHg1ZTcyLCAweDVlNzMsIDB4NWU3NCwKKyAweDVlNzUsIDB4NWU3NiwgMHg1ZTc3LCAweDVlNzgsIDB4NWU3OSwgMHg1ZTdhLCAweDVlN2IsIDB4NWU3YywKKyAweDVlN2QsIDB4NWU3ZSwgMHg1ZTdmLCAweDVlODAsIDB4NWU4MSwgMHg1ZTgyLCAweDVlODMsIDB4NWU4NCwKKyAweDVlODUsIDB4NWU4NiwgMHg1ZTg3LCAweDVlODgsIDB4NWU4OSwgMHg1ZThhLCAweDVlOGIsIDB4NWU4YywKKyAweDVlOGQsIDB4NWU4ZSwgMHg1ZThmLCAweDVlOTAsIDB4NWU5MSwgMHg1ZTkyLCAweDVlOTMsIDB4NWU5NCwKKyAweDVlOTUsIDB4NWU5NiwgMHg1ZTk3LCAweDVlOTgsIDB4NWU5OSwgMHg1ZTlhLCAweDVlOWIsIDB4NWU5YywKKyAweDVlOWQsIDB4NWU5ZSwgMHg1ZTlmLCAweDVlYTAsIDB4NWVhMSwgMHg1ZWEyLCAweDVlYTMsIDB4NWVhNCwKKyAweDVlYTUsIDB4NWVhNiwgMHg1ZWE3LCAweDVlYTgsIDB4NWVhOSwgMHg1ZWFhLCAweDVlYWIsIDB4NWVhYywKKyAweDVlYWQsIDB4NWVhZSwgMHg1ZWFmLCAweDVlYjAsIDB4NWViMSwgMHg1ZWIyLCAweDVlYjMsIDB4NWViNCwKKyAweDVlYjUsIDB4NWViNiwgMHg1ZWI3LCAweDVlYjgsIDB4NWViOSwgMHg1ZWJhLCAweDVlYmIsIDB4NWViYywKKyAweDVlYmQsIDB4NWViZSwgMHg1ZWJmLCAweDVlYzAsIDB4NWVjMSwgMHg1ZWMyLCAweDVlYzMsIDB4NWVjNCwKKyAweDVlYzUsIDB4NWVjNiwgMHg1ZWM3LCAweDVlYzgsIDB4NWVjOSwgMHg1ZWNhLCAweDVlY2IsIDB4NWVjYywKKyAweDVlY2QsIDB4NWVjZSwgMHg1ZWNmLCAweDVlZDAsIDB4NWVkMSwgMHg1ZWQyLCAweDVlZDMsIDB4NWVkNCwKKyAweDVlZDUsIDB4NWVkNiwgMHg1ZWQ3LCAweDVlZDgsIDB4NWVkOSwgMHg1ZWRhLCAweDVlZGIsIDB4NWVkYywKKyAweDVlZGQsIDB4NWVkZSwgMHg1ZWRmLCAweDVlZTAsIDB4NWVlMSwgMHg1ZWUyLCAweDVlZTMsIDB4NWVlNCwKKyAweDVlZTUsIDB4NWVlNiwgMHg1ZWU3LCAweDVlZTgsIDB4NWVlOSwgMHg1ZWVhLCAweDVlZWIsIDB4NWVlYywKKyAweDVlZWQsIDB4NWVlZSwgMHg1ZWVmLCAweDVlZjAsIDB4NWVmMSwgMHg1ZWYyLCAweDVlZjMsIDB4NWVmNCwKKyAweDVlZjUsIDB4NWVmNiwgMHg1ZWY3LCAweDVlZjgsIDB4NWVmOSwgMHg1ZWZhLCAweDVlZmIsIDB4NWVmYywKKyAweDVlZmQsIDB4NWVmZSwgMHg1ZWZmLCAweDVmMDAsIDB4NWYwMSwgMHg1ZjAyLCAweDVmMDMsIDB4NWYwNCwKKyAweDVmMDUsIDB4NWYwNiwgMHg1ZjA3LCAweDVmMDgsIDB4NWYwOSwgMHg1ZjBhLCAweDVmMGIsIDB4NWYwYywKKyAweDVmMGQsIDB4NWYwZSwgMHg1ZjBmLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0YWJsZTBfbXZfYml0c1sxMTAwXSA9IHsKKyAgMSwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsCisgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LAorICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLAorIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLAorIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorIDE3LCAxNywgMTcsICA4LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFibGUwX212eFsxMDk5XSA9IHsKKyAzMiwgMzIsIDMxLCAzMiwgMzMsIDMxLCAzMywgMzEsCisgMzMsIDMyLCAzNCwgMzIsIDMwLCAzMiwgMzEsIDM0LAorIDM1LCAzMiwgMzQsIDMzLCAyOSwgMzMsIDMwLCAzMCwKKyAzMSwgMzEsIDM1LCAyOSwgMzMsIDM1LCAzMywgMzQsCisgMzEsIDI5LCAzMCwgMzQsIDMwLCAzNiwgMjgsIDMyLAorIDM0LCAzNywgMzAsIDI3LCAzMiwgMjUsIDM5LCAzMiwKKyAzNCwgMzIsIDM1LCAzNSwgMzUsIDMxLCAzNSwgMjksCisgMzIsIDI5LCAzMCwgMjksIDM3LCAyNywgMzYsIDM4LAorIDM3LCAzMywgMzIsIDMxLCAyOSwgMzEsIDI4LCAzNiwKKyAzMywgMzAsIDM0LCAzMywgMzMsIDI4LCAyNywgMjUsCisgMzEsIDI2LCAzOSwgMzIsIDMyLCAzMSwgMzMsIDM5LAorIDMxLCAzOCwgMjgsIDM2LCAyMSwgMjMsIDQzLCAzNiwKKyAzNCwgNDEsIDMwLCAyNSwgMjgsIDMxLCAzMCwgMzQsCisgMzgsIDM1LCA2MSwgMzQsIDI4LCAzMCwgMzcsIDM3LAorIDM1LCAyNywgMzYsICAzLCA1OSwgMzgsIDM3LCAzMiwKKyAzMSwgMjksIDI2LCAzMywgMzcsIDMzLCAyNywgMjcsCisgMzUsIDM0LCAzNCwgNDAsIDQyLCAzMywgMzIsIDI5LAorICA0LCAgNSwgMjgsIDI0LCAyNSwgMzUsIDM5LCAzOCwKKyAzMiwgMjMsIDI3LCAzMiwgMzAsIDM1LCAyNiwgMzQsCisgNjAsIDM2LCAyOSwgMjIsIDI2LCA0MSwgIDcsIDMwLAorIDM4LCAzMCwgMzYsIDI5LCAzMCwgNDEsIDI2LCAyNSwKKyAzMiwgMzQsIDI0LCAzOSwgIDEsIDI1LCAzOSwgMzIsCisgMjgsIDI5LCAzMiwgMzgsIDI2LCAzNiwgMjgsIDYzLAorIDI4LCAzOSwgMjMsIDIxLCAyNiwgMzUsIDMxLCAzNSwKKyA1NywgMzEsIDI5LCAyOSwgMjgsIDMwLCAyNywgMzUsCisgIDIsIDM4LCA0MCwgMzQsIDM3LCAyOSwgMzgsIDQzLAorIDI2LCAzMiwgMzMsIDQyLCAyNCwgNDAsIDI4LCAzMiwKKyAzMiwgMzIsIDM2LCAzMiwgNDMsIDI1LCAyMSwgMzEsCisgMzAsIDMxLCA0MSwgMjksIDMzLCAzNywgMjYsIDM3LAorIDI3LCA1OSwgMjMsIDMzLCAzNSwgMzEsIDMxLCAzNywKKyAzOCwgMzksIDMyLCAyMywgMzIsIDI3LCAzNywgMzYsCisgMzEsIDQwLCAyNSwgMjcsIDM4LCAzMSwgMzYsIDI4LAorIDMxLCAzNiwgMjUsIDQ1LCAgMywgMzQsIDM4LCAzOSwKKyA0MCwgMzgsIDMwLCAzMiwgMTksIDI0LCAyNSwgMjYsCisgNDUsIDIwLCAyNCwgMzMsIDMzLCAzMSwgNDEsIDM0LAorIDM5LCA0NywgNDAsIDU4LCA1OSwgNDEsIDMzLCAgMywKKyAxNywgNjEsIDQyLCAzMCwgMjYsIDI5LCAzNiwgNjEsCisgMzMsIDM3LCA2MiwgMjgsIDI1LCAzOCwgMjUsIDM4LAorIDE3LCAyMywgMzQsIDMzLCAyMSwgMzMsIDQ5LCAyNywKKyAzMiwgMjMsIDI3LCAyMiwgMjQsIDIyLCAzOSwgNDMsCisgMjcsIDM3LCAgNiwgNDIsIDQ3LCAyNiwgMzAsIDMxLAorIDQxLCAzOSwgMzMsIDIyLCA0NSwgMzYsIDMyLCA0NSwKKyAxOSwgMjIsIDMwLCAgNSwgIDUsIDE3LCAyOSwgMjIsCisgMzEsIDMxLCA0MywgMzcsIDI3LCAzMiwgMzIsIDMyLAorIDMzLCAzNCwgNDMsIDM1LCAyOSwgMjYsIDIyLCAzMiwKKyAxOSwgMzIsIDI1LCAzMSwgNDEsIDQ5LCAyOCwgMzQsCisgMjgsIDM5LCAzNCwgMTksIDM3LCAzOCwgMjksIDIxLAorIDM2LCA0MiwgMjQsIDQ4LCAxNiwgMjgsIDQ5LCAyMiwKKyAzNCwgMzEsIDM4LCAzOSwgNDQsIDExLCAzNSwgMzAsCisgMzMsIDMzLCAyMywgMjgsIDMzLCA0NiwgMTUsIDEzLAorIDI0LCA0MSwgMjQsIDM0LCAzNCwgMzAsIDI2LCAyNCwKKyAxNCwgNjAsIDIxLCAyOSwgMzksIDIzLCAzNSwgMzcsCisgNjMsIDQ1LCAzMywgMzQsIDQ3LCA0MSwgMjIsIDQyLAorIDM1LCAzNSwgMjMsIDMyLCAzNSwgNDMsIDMyLCAgNywKKyAzMSwgNDEsIDIwLCAzMSwgMTYsIDEzLCA2MywgMjUsCisgMzAsIDMyLCAzNSwgMzAsIDMwLCAzMSwgNDIsIDQ3LAorIDM5LCAzOCwgNDAsIDQwLCA1MSwgNTUsIDU2LCAxOCwKKyAyMSwgMzksIDM5LCAzMywgMTcsIDQxLCAyMywgMjQsCisgNDMsIDI1LCAzMSwgMjAsIDE5LCA0NSwgIDEsIDM0LAorIDMxLCAyMiwgMzUsIDE1LCA0NiwgNDYsIDM1LCAzMSwKKyAyOCwgMjksIDI5LCAyMywgNDEsIDI3LCAxNCwgNTMsCisgNTMsIDI3LCAyNCwgMzIsIDU3LCAzMiwgMTcsIDQyLAorIDM3LCAyOSwgMzMsICAxLCAyNSwgMzIsIDMyLCA2MywKKyAyNiwgNDAsIDQ0LCAzNiwgMzEsIDM5LCAyMCwgMjAsCisgNDQsIDIzLCAzMywgMzQsIDM1LCAzMywgMzMsIDI4LAorIDQxLCAyMywgNDEsIDQxLCAyOSwgMjUsIDI2LCA0OSwKKyAyOSwgMjQsIDM3LCA0OSwgNTAsIDUxLCA1MSwgMjYsCisgMzksIDI1LCAyNiwgMTUsIDM5LCAxOCwgNDIsIDE3LAorICA0LCAzMSwgMzIsIDMyLCA2MCwgIDEsIDQyLCAzMiwKKyAgMCwgMTIsIDE5LCAzNSwgMjEsIDQxLCAxNywgMjYsCisgMjAsIDQ1LCA0NiwgMzIsIDM3LCAyMiwgNDcsIDI5LAorIDMxLCAyNywgMjksIDMwLCAyMSwgMzMsIDM1LCAxOCwKKyAyNSwgMzMsIDUwLCA1MSwgNDIsICAyLCAxNSwgNTEsCisgNTMsIDMzLCAyNSwgMjksIDU1LCAzNywgMzgsIDMzLAorIDM4LCA1OSwgMzgsIDMzLCAzOSwgMTMsIDMyLCA0MCwKKyA2MSwgNjEsIDMyLCAgOSwgNDQsICAzLCAzMSwgMjksCisgMjUsIDMxLCAyNywgMjMsICA5LCAyNSwgIDksIDI5LAorIDIwLCAzMCwgMzAsIDQyLCAxOCwgMjgsIDI1LCAyOCwKKyAyOCwgMjEsIDI5LCA0MywgMjksIDQzLCAyNiwgNDQsCisgNDQsIDIxLCAzOCwgMjEsIDI0LCA0NSwgNDUsIDM1LAorIDM5LCAyMiwgMzUsIDM2LCAzNCwgMzQsIDQ1LCAzNCwKKyAyOSwgMzEsIDQ2LCAyNSwgNDYsIDE2LCAxNywgMzEsCisgMjAsIDMyLCA0NywgNDcsIDQ3LCAzMiwgNDksIDQ5LAorIDQ5LCAzMSwgIDEsIDI3LCAyOCwgMzksIDM5LCAyMSwKKyAzNiwgMjMsIDUxLCAgMiwgNDAsIDUxLCAzMiwgNTMsCisgMjQsIDMwLCAyNCwgMzAsIDIxLCA0MCwgNTcsIDU3LAorIDMxLCA0MSwgNTgsIDMyLCAxMiwgIDQsIDMyLCAzNCwKKyA1OSwgMzEsIDMyLCAxMywgIDksIDM1LCAyNiwgMzUsCisgMzcsIDYxLCAzNywgNjMsIDI2LCAyOSwgNDEsIDM4LAorIDIzLCAyMCwgNDEsIDI2LCA0MSwgNDIsIDQyLCA0MiwKKyAyNiwgMjYsIDI2LCAyNiwgIDEsIDI2LCAzNywgMzcsCisgMzcsIDIzLCAzNCwgNDIsIDI3LCA0MywgMzQsIDI3LAorIDMxLCAyNCwgMzMsIDE2LCAgMywgMzEsIDI0LCAzMywKKyAyNCwgIDQsIDQ0LCA0NCwgMTEsIDQ0LCAzMSwgMTMsCisgMTMsIDQ0LCA0NSwgMTMsIDI1LCAyMiwgMzgsIDI2LAorIDM4LCAzOCwgMzksIDMyLCAzMCwgMzksIDMwLCAyMiwKKyAzMiwgMjYsIDMwLCA0NywgNDcsIDQ3LCAxOSwgNDcsCisgMzAsIDMxLCAzNSwgIDgsIDIzLCA0NywgNDcsIDI3LAorIDM1LCA0NywgMzEsIDQ4LCAzNSwgMTksIDM2LCA0OSwKKyA0OSwgMzMsIDMxLCAzOSwgMjcsIDM5LCA0OSwgNDksCisgNTAsIDUwLCA1MCwgMzksIDMxLCA1MSwgNTEsIDM5LAorIDI4LCAzMywgMzMsIDIxLCA0MCwgMzEsIDUyLCA1MywKKyA0MCwgNTMsICA5LCAzMywgMzEsIDUzLCA1NCwgNTQsCisgNTQsIDU1LCA1NSwgMzQsIDE1LCA1NiwgMjUsIDU2LAorIDIxLCAyMSwgNDAsIDQwLCAyNSwgNDAsIDU4LCAzNiwKKyAgNSwgNDEsIDQxLCAxMiwgNjAsIDQxLCA0MSwgMzcsCisgMjIsIDYxLCAxOCwgMjksIDI5LCAzMCwgNjEsIDMwLAorIDYxLCA2MiwgNjIsIDMwLCAzMCwgNjMsIDE4LCAxMywKKyAzMCwgMjMsIDE5LCAyMCwgMjAsIDQxLCAxMywgIDIsCisgIDUsICA1LCAgMSwgIDUsIDMyLCAgNiwgMzIsIDM1LAorIDIwLCAzNSwgMjcsIDM1LCAzNSwgMzYsIDM2LCAxMywKKyAzNiwgNDEsIDQxLCA0MSwgIDMsIDMwLCA0MiwgMjcsCisgMjAsIDMwLCAyNywgMjgsIDMwLCAyMSwgMzMsIDMzLAorIDE0LCAyNCwgMzAsIDQyLCAyNCwgMzMsIDI1LCA0MiwKKyA0MywgMTQsIDQzLCA0MywgMTQsIDQzLCAgNywgMzYsCisgMzcsIDM3LCAzNywgMzcsICA3LCAxNCwgMjUsIDQzLAorIDQzLCA0NCwgMTUsIDM3LCAgNywgIDcsICAzLCAgMSwKKyAgOCwgMTUsIDE1LCAgOCwgNDQsIDQ0LCA0NCwgNDUsCisgNDUsIDQ1LCA0NSwgIDgsICA4LCA0NSwgMjEsIDQ1LAorIDI4LCAyOCwgMjgsIDIxLCAyOCwgMjgsIDIyLCAzNywKKyA0NiwgNDYsIDM3LCAgOCwgMjksIDM3LCAyOSwgMjIsCisgNDYsIDM3LCAyMiwgMjksIDQ3LCA0NywgMzgsIDM4LAorIDE2LCAzOCwgMzgsIDMzLCAzOCwgMjIsIDQ3LCA0NywKKyAyOSwgMjUsIDE2LCAgMCwgNDgsICAxLCAzNCwgNDgsCisgNDgsIDM0LCAyNSwgMjYsIDI2LCA0OSwgNDksIDI2LAorICAxLCA0OSwgIDQsIDI2LCAgNCwgNDksICAxLCAgOSwKKyA0OSwgNDksIDQ5LCAxMCwgNDksIDE3LCAzOCwgMTcsCisgMTcsIDUwLCAzOCwgNTAsIDUwLCAyMiwgMzgsIDUxLAorIDM4LCAzOCwgNTEsIDM5LCAzOSwgMTgsIDIyLCAzOSwKKyA1MSwgMjIsIDUyLCA1MiwgNTIsIDM5LCA1MywgNTMsCisgMTAsIDIzLCAxOCwgMjksIDEwLCA1MywgMjksIDU0LAorIDExLCA1NCwgMTEsIDExLCA1NSwgIDEsIDE4LCA1NSwKKyA1NSwgNTUsIDU1LCA1NSwgNTUsIDI5LCAzNCwgMTgsCisgMjksIDU2LCA1NiwgMzQsIDU3LCAzNCwgMzQsIDI5LAorIDI5LCA1NywgNTcsIDM1LCAzNSwgMzUsIDM1LCAzNSwKKyAzOSwgMzUsIDU5LCA1OSwgMTgsIDU5LCAzOSwgMzAsCisgMTgsIDQwLCA2MCwgNjAsIDYxLCAzMCwgMTgsIDYxLAorIDYxLCAxOSwgMTksCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0YWJsZTBfbXZ5WzEwOTldID0geworIDMyLCAzMSwgMzIsIDMzLCAzMiwgMzEsIDMxLCAzMywKKyAzMywgMzQsIDMyLCAzMCwgMzIsIDM1LCAzNCwgMzEsCisgMzIsIDI5LCAzMywgMzAsIDMyLCAzNCwgMzMsIDMxLAorIDMwLCAzNSwgMzEsIDMxLCAyOSwgMzMsIDM1LCAzMCwKKyAyOSwgMzMsIDM0LCAzNCwgMzAsIDMyLCAzMiwgMzYsCisgMjksIDMyLCAzNSwgMzIsIDI4LCAzMiwgMzIsIDI3LAorIDM1LCAzNywgMzQsIDI5LCAzMCwgMzYsIDM1LCAzNCwKKyAyNSwgMzAsIDI5LCAzNSwgMzMsIDMxLCAzMSwgMzIsCisgMzEsIDI4LCAzOSwgMjgsIDI5LCAzNywgMzEsIDMzLAorIDI3LCAzNiwgMjgsIDM2LCAzNywgMzMsIDMzLCAzMSwKKyAyNywgMzIsIDMxLCAzOCwgMjYsIDI1LCAyNSwgMzMsCisgMzksIDMxLCAzNCwgMzAsIDMyLCAzMiwgMzIsIDM0LAorIDM2LCAzMiwgMjgsIDMzLCAzMCwgMzgsIDM3LCAyNywKKyAzMywgMjgsIDMyLCAzNywgMzUsIDM4LCAyOSwgMzQsCisgMjcsIDI5LCAyOSwgMzIsIDMyLCAzNCwgMzUsICAzLAorIDI2LCAzNiwgMzEsIDM4LCAzMCwgMjYsIDM1LCAzNCwKKyAzNywgMjYsIDI1LCAzMiwgMzIsIDM5LCAyMywgMzcsCisgMzIsIDMyLCAyOSwgMzIsIDI5LCAzNiwgMjksIDMwLAorIDQxLCAzMSwgMzAsIDIxLCAzOSwgMjUsIDM0LCAzOCwKKyAzMiwgMzUsIDM5LCAzMiwgMzMsIDMzLCAzMiwgMjcsCisgMjksIDI1LCAyOCwgMjcsIDI2LCAzMSwgMzAsIDM1LAorIDI0LCAyNCwgMzEsIDM0LCAzMiwgMzAsIDM1LCA0MCwKKyAyOCwgMzgsICA1LCAzNSwgMjksIDM2LCAzNiwgMzIsCisgMzgsIDMwLCAzMywgMzEsIDM1LCAyNiwgMjMsIDM4LAorIDMyLCA0MSwgMjgsIDI1LCAzNywgNDAsIDM3LCAzOSwKKyAzMiwgMzYsIDMzLCAzOSwgMjUsIDI2LCAyOCwgMzEsCisgMjgsIDQyLCAyMywgMzEsIDMzLCAzMSwgMzksICAxLAorIDU5LCAyMiwgMjcsICA0LCAzMywgMzQsIDMzLCAyNCwKKyA0MSwgIDMsIDM1LCA0MSwgNDEsIDI4LCAzNiwgMzYsCisgMjgsIDMzLCAzNSwgMjEsIDIzLCAyMSwgMjIsIDM3LAorIDI3LCAyNywgNDMsIDI5LCA2MCwgMzksIDI3LCAyNSwKKyA1OSwgMzQsIDI3LCAyNywgMjYsIDQwLCAzNywgMjcsCisgNjEsIDI2LCAzOSwgMzMsIDMxLCAyMiwgMzcsIDI1LAorIDMwLCAyNSwgMjQsIDYxLCAzMSwgMzQsIDI1LCAzOCwKKyAzMiwgMzIsIDMwLCAgMywgNjEsIDQzLCAyOSwgMjMsCisgMjgsIDMyLCAyOCwgMzIsIDMxLCAzNCwgIDUsIDMzLAorIDMyLCAzMywgMzMsIDQyLCAzNywgMjMsIDM4LCAzMSwKKyA0MCwgMjYsIDMyLCAyNiwgMzcsIDM4LCAzNiwgMjQsCisgMjksIDMwLCAyMCwgMjIsIDI5LCAyNCwgMzIsIDQxLAorICAyLCAzNCwgMjUsIDMzLCAyOSwgMzEsIDM5LCAzNSwKKyAzNiwgMjQsIDMyLCAzMCwgMzMsIDI3LCA0NCwgNjAsCisgMzAsIDM2LCAxOSwgMzQsIDMxLCAyNCwgMTYsIDM1LAorIDMyLCAzOCwgMjEsIDMzLCAzMSwgMzEsIDIxLCAzNSwKKyAgNSwgMTcsIDI5LCAzOCwgMzgsIDE4LCA1OCwgMTksCisgNDMsIDQxLCAzMCwgNDEsIDQzLCAzOSwgMjksICA3LAorIDI5LCAxNywgMjgsIDE5LCAyOCwgMzEsIDI1LCAxOSwKKyA0MCwgMjYsIDIxLCAzMywgMzksIDIzLCA0MCwgMzAsCisgMzksIDM0LCAzNSwgMzIsIDMyLCAyNCwgMzMsIDMwLAorIDQwLCA0NywgMzksIDM3LCAzMiwgMzMsIDI0LCAyMywKKyA0NSwgNDcsIDI3LCAyMywgNDIsIDMyLCAzMiwgMzMsCisgMzYsIDM3LCAzNywgMTcsIDE4LCAyMiwgNDAsIDM4LAorIDMyLCAzMSwgMzUsIDI0LCAxNywgMjUsIDE3LCAyMywKKyAzMywgMzQsIDUxLCA0MiwgMzEsIDM2LCAzNiwgMjksCisgMjEsIDIyLCAzNywgNDQsIDQzLCAyNSwgNDcsIDMzLAorIDQ1LCAyNywgMzEsIDU4LCAzMSwgMzIsIDMxLCAzOCwKKyA0MywgMjAsIDQ3LCA0NSwgNTQsICAxLCAyNiwgMzQsCisgMzgsIDE0LCAyMiwgMjQsIDMzLCAzNCwgMzIsIDMyLAorIDM3LCAyMSwgMjMsIDQ5LCAzNSwgMjMsIDI4LCAzOSwKKyAzOSwgMjMsIDU1LCAzMywgMzAsIDMwLCA2MywgMTYsCisgNDIsIDI4LCAxMywgMzMsIDMzLCAzNSwgMTksIDQ2LAorIDQzLCAxNywgMTksIDM2LCAzOSwgMjQsIDMxLCAzMiwKKyAzMywgMjYsIDI4LCA2MiwgMzMsIDYzLCAzMywgMzksCisgMTksIDQ5LCAxNywgMzEsIDQzLCAxMywgMTUsIDI5LAorIDI1LCAzNSwgMzMsIDIzLCA0OSwgNDEsIDI4LCAyOSwKKyAzNCwgMzgsICA3LCA2MSwgMTEsIDUwLCAxMywgNDEsCisgMTksIDQ3LCAyNSwgMjYsIDE1LCA0MiwgNDEsIDI5LAorIDQ1LCAyNywgMTcsIDM1LCAzMiwgMjksIDMyLCAyNCwKKyAxMywgMjYsIDI2LCAzMSwgMjQsIDMzLCAyOCwgMzAsCisgMzEsIDExLCA0NSwgNDYsIDMzLCAzMywgMzUsIDU3LAorIDMyLCAzMiwgMzUsIDQ1LCAzNCwgMTEsIDM3LCA0MiwKKyAzOSwgMzcsIDMxLCA0OSwgMjEsIDI3LCAyOSwgNDcsCisgNTMsIDQwLCA1MSwgMTYsIDI2LCAgMSwgNDAsIDMwLAorIDQxLCA0NCwgMzQsIDI1LCAyNywgMzEsIDM1LCAzNSwKKyAzMSwgMTUsIDQ5LCAgMSwgMzUsIDQwLCAgNSwgNTgsCisgMjEsIDI5LCAyMiwgNTksIDQ1LCAzMSwgIDksIDI2LAorICA5LCAyOSwgMTEsIDMyLCAzMCwgIDMsIDEzLCAyMCwKKyAxOCwgMjAsIDExLCAgMywgMjksIDQwLCAzMSwgNTMsCisgMzAsIDE3LCAyMCwgMzcsIDMxLCA0MiwgNDcsIDQ3LAorIDU0LCAzOCwgIDksIDM0LCAxMywgMzcsIDIxLCAyNSwKKyAyNywgNDMsIDQyLCA0NSwgNDAsIDI1LCAyNywgNDYsCisgMjIsIDI1LCA1MywgMjAsICAyLCAxNCwgMzksIDE1LAorIDIyLCA0NCwgMzQsIDIxLCAzOCwgMzMsIDI3LCA0OCwKKyAzNCwgNTIsIDM1LCA0NywgNDksIDU0LCAgMiwgMTMsCisgMjMsIDUyLCAyOSwgNDUsIDIyLCA0OSwgNTQsIDIxLAorIDQwLCA0MiwgMzEsIDMwLCAyOSwgMzQsICAwLCAyNSwKKyAyMywgNTEsIDI0LCA1OSwgMjgsIDM4LCAyOSwgMzEsCisgIDIsIDEzLCAzMSwgIDgsIDMxLCAzMywgMTIsIDQ1LAorIDQxLCAgNywgMTQsIDMwLCAyNSwgMTgsIDQzLCAyMCwKKyA0MywgMzUsIDQ0LCAgMSwgNDksIDQyLCA0MiwgMTgsCisgNDEsIDM4LCA0MSwgNDQsIDUzLCAxMSwgMjAsIDI1LAorIDQ1LCA0NiwgNDcsIDQ4LCAzOSwgNTIsIDQ2LCA0OSwKKyA2MywgNTUsIDQ0LCAzOCwgMTMsIDEzLCA1NywgMjIsCisgNTEsIDE2LCAxMiwgMjgsIDM1LCA1NywgMjUsIDIwLAorIDI2LCAyOCwgMjgsIDI5LCAzMiwgMzEsIDYyLCAzNCwKKyAzNSwgMzUsIDE5LCA0OSwgNDgsIDM5LCA0MCwgMTgsCisgNDMsIDQ2LCAxMSwgIDYsIDQ4LCAxOSwgNDksIDQxLAorIDEwLCAyMywgNTgsIDE3LCAyMSwgMjMsIDM0LCAzMCwKKyA2MCwgIDAsIDQ0LCAzNCwgMjYsIDM3LCA0NiwgNDMsCisgNDksIDU5LCAgNCwgMzQsIDU5LCAzNywgMjIsIDI1LAorIDI4LCA0NiwgIDYsIDQwLCA1OSwgNDIsIDM2LCA2MSwKKyAyOCwgMzAsIDMxLCA0MywgMTAsIDIyLCAyMywgNDcsCisgMjAsIDUyLCA1NSwgMzYsIDI1LCAxNiwgIDEsIDExLAorIDI3LCAyOSwgIDUsIDYzLCAxOCwgNDEsIDMxLCAzNCwKKyAzOCwgIDEsICA1LCAxMywgMjgsIDMxLCAxNywgMzgsCisgMzksIDQxLCAzNiwgMzcsIDIyLCAzOSwgMzMsIDQzLAorIDQzLCAxNSwgMTcsIDQ5LCAzMCwgMjEsIDIyLCAyMCwKKyAxMCwgMTcsIDI1LCA1NCwgNTcsICAzLCAzNCwgIDgsCisgMzYsIDI1LCAzMSwgMTQsIDE1LCAxOSwgMjksIDI1LAorIDE4LCAzOSwgNTMsIDIyLCAyNywgMjAsIDI5LCAzMywKKyA0MSwgNDIsIDM1LCA2MiwgNTAsIDI5LCA1MywgNTAsCisgMzUsIDU1LCA0MiwgNjEsIDYzLCAgNCwgIDcsIDQyLAorIDIxLCA0NiwgNDcsIDQ5LCAyNywgNDYsIDE3LCA1NSwKKyA0MSwgNTAsIDYzLCAgNCwgNTYsIDE4LCAgOCwgMTAsCisgMTgsIDUxLCA2MywgMzYsIDU1LCAxOCwgIDUsIDU1LAorICA5LCAyOSwgMTcsIDIxLCAzMCwgMjcsICAxLCA1OSwKKyAgNywgMTEsIDEyLCAxNSwgIDUsIDQyLCAyNCwgNDEsCisgNDMsICA3LCAyNywgMjIsIDI1LCAzMSwgMzAsIDM3LAorIDIyLCAzOSwgNTMsIDI5LCAzNiwgMzcsIDQ4LCAgMCwKKyAgNSwgMTMsIDE3LCAzMSwgMzIsIDI2LCA0NiwgMjgsCisgNDQsIDQ1LCA0NiwgNTMsIDQ5LCA1MSwgIDMsIDQxLAorICAzLCAyMiwgNDIsIDMzLCAgNSwgNDUsICA3LCAyMiwKKyA0MCwgNTMsIDI0LCAxNCwgMjUsIDI3LCAxMCwgMTIsCisgMzQsIDE2LCAxNywgNTMsIDIwLCAyNiwgMzksIDQ1LAorIDE4LCA0NSwgMzUsIDMzLCAzMSwgNDksICA0LCAzOSwKKyA0MiwgMTEsIDUxLCAgNSwgMTMsIDI2LCAyNywgMTcsCisgNTIsIDMwLCAgMCwgMjIsIDEyLCAzNCwgNjIsIDM2LAorIDM4LCA0MSwgNDcsIDMwLCA2MywgMzgsIDQxLCA0MywKKyA1OSwgMzMsIDQ1LCAzNywgMzgsIDQwLCA0NywgMjQsCisgNDgsIDQ5LCAzMCwgIDEsIDEwLCAyMiwgNDksIDE1LAorIDM5LCA1OSwgMzEsIDMyLCAzMywgMTgsIDEzLCAxNSwKKyAzMSwgMjEsIDI3LCA0NCwgNDIsIDM5LCA0NiwgMTcsCisgMjYsIDMyLCAzMCwgMzEsICAwLCAzMCwgMzQsICA5LAorIDEyLCAxMywgMjUsIDMxLCAzMiwgNTUsIDQzLCAzNSwKKyA2MSwgMzMsIDM1LCA0NiwgMjUsIDQ3LCA0OCwgNjIsCisgNjMsIDM4LCA2MSwgIDEsICAyLCAgNSwgIDcsICA5LAorIDQ2LCAxMCwgMzQsIDM1LCAzNiwgNTUsIDUxLCAgNywKKyA0MCwgMjMsIDM0LCAzNywgIDUsIDEzLCA0MiwgMTgsCisgMjUsIDI3LCAyOCwKK307CisKKy8qIG1vdGlvbiB2ZWN0b3IgdGFibGUgMSAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IHRhYmxlMV9tdl9jb2RlWzExMDBdID0geworIDB4MDAwMCwgMHgwMDA3LCAweDAwMDksIDB4MDAwZiwgMHgwMDBhLCAweDAwMTEsIDB4MDAxYSwgMHgwMDFjLAorIDB4MDAxMSwgMHgwMDMxLCAweDAwMjUsIDB4MDAyZCwgMHgwMDJmLCAweDAwNmYsIDB4MDA3NSwgMHgwMDQxLAorIDB4MDA0YywgMHgwMDRlLCAweDAwNWMsIDB4MDA2MCwgMHgwMDYyLCAweDAwNjYsIDB4MDA2OCwgMHgwMDY5LAorIDB4MDA2YiwgMHgwMGE2LCAweDAwYzEsIDB4MDBjYiwgMHgwMGNjLCAweDAwY2UsIDB4MDBkYSwgMHgwMGU4LAorIDB4MDBlZSwgMHgwMDg3LCAweDAwOTAsIDB4MDA5ZSwgMHgwMDlmLCAweDAwYmEsIDB4MDBjYSwgMHgwMGQ4LAorIDB4MDBkYiwgMHgwMGRmLCAweDAxMDQsIDB4MDEwOSwgMHgwMTBjLCAweDAxNDMsIDB4MDE0NSwgMHgwMTRhLAorIDB4MDE1NiwgMHgwMTVjLCAweDAxYjMsIDB4MDFkMywgMHgwMWRhLCAweDAxMDMsIDB4MDEwOSwgMHgwMTBiLAorIDB4MDEyMiwgMHgwMTI3LCAweDAxMzQsIDB4MDE2MSwgMHgwMTY0LCAweDAxNzYsIDB4MDE4NCwgMHgwMThkLAorIDB4MDE4ZSwgMHgwMThmLCAweDAxOTAsIDB4MDE5MywgMHgwMTk2LCAweDAxOWQsIDB4MDE5ZSwgMHgwMTlmLAorIDB4MDFhOSwgMHgwMWIyLCAweDAxYjQsIDB4MDFiYSwgMHgwMWJiLCAweDAxYmMsIDB4MDIwMSwgMHgwMjAyLAorIDB4MDIwNSwgMHgwMjA3LCAweDAyMGQsIDB4MDIxMCwgMHgwMjExLCAweDAyMTUsIDB4MDIxYiwgMHgwMjFmLAorIDB4MDI4MSwgMHgwMjg1LCAweDAyOTAsIDB4MDI5YywgMHgwMjlkLCAweDAyYTIsIDB4MDJhNywgMHgwMmE4LAorIDB4MDJhYSwgMHgwMmIwLCAweDAyYjEsIDB4MDJiNCwgMHgwMmJjLCAweDAyYmYsIDB4MDMyMCwgMHgwMzI2LAorIDB4MDMyNywgMHgwMzI5LCAweDAzMmEsIDB4MDMzNiwgMHgwMzYwLCAweDAzNjIsIDB4MDM2MywgMHgwMzcyLAorIDB4MDNiMiwgMHgwM2JjLCAweDAzYmQsIDB4MDIwMywgMHgwMjA1LCAweDAyMWEsIDB4MDI0OSwgMHgwMjRhLAorIDB4MDI0YywgMHgwMmM3LCAweDAyY2EsIDB4MDJjZSwgMHgwMmVmLCAweDAzMGQsIDB4MDMyMiwgMHgwMzI1LAorIDB4MDMzOCwgMHgwMzczLCAweDAzN2EsIDB4MDQwOSwgMHgwNDE1LCAweDA0MTYsIDB4MDQxOCwgMHgwNDI4LAorIDB4MDQyZCwgMHgwNDJmLCAweDA0MzQsIDB4MDUwOCwgMHgwNTA5LCAweDA1MTAsIDB4MDUxMSwgMHgwNTFjLAorIDB4MDUxZSwgMHgwNTI0LCAweDA1NDEsIDB4MDU0MywgMHgwNTQ2LCAweDA1NDcsIDB4MDU0ZCwgMHgwNTU3LAorIDB4MDU1ZiwgMHgwNTZhLCAweDA1NmMsIDB4MDU2ZCwgMHgwNTZmLCAweDA1NzYsIDB4MDU3NywgMHgwNTdhLAorIDB4MDU3YiwgMHgwNTdjLCAweDA1N2QsIDB4MDYwMCwgMHgwNjAxLCAweDA2MDMsIDB4MDYxNCwgMHgwNjE2LAorIDB4MDYxNywgMHgwNjFjLCAweDA2MWYsIDB4MDY0MiwgMHgwNjQ4LCAweDA2NDksIDB4MDY0YSwgMHgwNjRiLAorIDB4MDY1NywgMHgwNjY4LCAweDA2NjksIDB4MDY2YiwgMHgwNjZlLCAweDA2N2YsIDB4MDZjMiwgMHgwNmM4LAorIDB4MDZjYiwgMHgwNmRlLCAweDA2ZGYsIDB4MDZlMiwgMHgwNmUzLCAweDA2ZWYsIDB4MDc0OCwgMHgwNzRiLAorIDB4MDc2ZSwgMHgwNzZmLCAweDA3N2MsIDB4MDQwOSwgMHgwNDIzLCAweDA0MjgsIDB4MDQyOSwgMHgwNDJhLAorIDB4MDQyYiwgMHgwNDMyLCAweDA0MzMsIDB4MDQ5NiwgMHgwNDlhLCAweDA0ZDUsIDB4MDRkYiwgMHgwNTgxLAorIDB4MDU4MiwgMHgwNThiLCAweDA1OGMsIDB4MDU4ZCwgMHgwNTk4LCAweDA1OTksIDB4MDU5YSwgMHgwNTllLAorIDB4MDVkZCwgMHgwNjE5LCAweDA2MzIsIDB4MDYzMywgMHgwNjQ4LCAweDA2NzIsIDB4MDZhMSwgMHgwNmEyLAorIDB4MDZhMywgMHgwNmFmLCAweDA2ZTIsIDB4MDZlMywgMHgwNmU0LCAweDA4MDAsIDB4MDgwMSwgMHgwODAyLAorIDB4MDgwMywgMHgwODFhLCAweDA4MWIsIDB4MDgyOSwgMHgwODJmLCAweDA4MzIsIDB4MDgzZSwgMHgwODNmLAorIDB4MDg1MiwgMHgwODUzLCAweDA4NTgsIDB4MDg2YiwgMHgwODc3LCAweDA4NzgsIDB4MDg3OSwgMHgwODdhLAorIDB4MDg3YiwgMHgwYTAwLCAweDBhMDEsIDB4MGEwZCwgMHgwYTBlLCAweDBhMGYsIDB4MGEyNCwgMHgwYTM3LAorIDB4MGEzYSwgMHgwYTNiLCAweDBhM2UsIDB4MGE0NiwgMHgwYTQ3LCAweDBhNGEsIDB4MGE0YiwgMHgwYTVmLAorIDB4MGE3OSwgMHgwYTdhLCAweDBhN2IsIDB4MGE4MCwgMHgwYTgxLCAweDBhODQsIDB4MGE4NSwgMHgwYTk5LAorIDB4MGFhNSwgMHgwYWE2LCAweDBhYjgsIDB4MGFiYSwgMHgwYWJiLCAweDBhYmMsIDB4MGFiZCwgMHgwYWM4LAorIDB4MGFjZSwgMHgwYWNmLCAweDBhZDcsIDB4MGFkYywgMHgwYWViLCAweDBjMDQsIDB4MGMyNSwgMHgwYzI2LAorIDB4MGMyNywgMHgwYzJhLCAweDBjMmIsIDB4MGMzYSwgMHgwYzNiLCAweDBjM2MsIDB4MGMzZCwgMHgwY2EwLAorIDB4MGNhZCwgMHgwY2Q0LCAweDBjZDUsIDB4MGNmYywgMHgwY2ZkLCAweDBkODYsIDB4MGQ5MiwgMHgwZDkzLAorIDB4MGQ5NCwgMHgwZDk1LCAweDBkYjAsIDB4MGRiOCwgMHgwZGI5LCAweDBkYmEsIDB4MGRiYiwgMHgwZGMwLAorIDB4MGRjMiwgMHgwZGMzLCAweDBkZGEsIDB4MGRkYiwgMHgwZGRjLCAweDBkZGQsIDB4MGU5MiwgMHgwZTkzLAorIDB4MGU5NCwgMHgwZTk1LCAweDBlYzcsIDB4MGVjYywgMHgwZWNlLCAweDBlY2YsIDB4MGVkOCwgMHgwZWQ5LAorIDB4MGVkYSwgMHgwZWRiLCAweDA4MDgsIDB4MDgwOSwgMHgwODBhLCAweDA4MTAsIDB4MDgxMSwgMHgwODQ0LAorIDB4MDg0NSwgMHgwODYxLCAweDA4NjIsIDB4MDg2MywgMHgwODZjLCAweDA5MjIsIDB4MDkyMywgMHgwOTJlLAorIDB4MDkyZiwgMHgwOTM2LCAweDA5MzcsIDB4MDliMSwgMHgwOWIyLCAweDA5YjMsIDB4MDliNCwgMHgwOWI1LAorIDB4MDliOCwgMHgwOWI5LCAweDA5YmEsIDB4MDliYiwgMHgwOWJjLCAweDA5YmQsIDB4MDliZSwgMHgwOWJmLAorIDB4MGIwMCwgMHgwYjE1LCAweDBiMmMsIDB4MGIyZCwgMHgwYjJlLCAweDBiMmYsIDB4MGIzNiwgMHgwYmI5LAorIDB4MGMyOCwgMHgwYzJhLCAweDBjMmIsIDB4MGMyYywgMHgwYzJkLCAweDBjMmUsIDB4MGMyZiwgMHgwYzMwLAorIDB4MGMzMSwgMHgwYzM4LCAweDBjNjAsIDB4MGM2MSwgMHgwYzYyLCAweDBjNjMsIDB4MGM4ZCwgMHgwYzhlLAorIDB4MGM4ZiwgMHgwYzkyLCAweDBjYmUsIDB4MGNiZiwgMHgwY2U2LCAweDBjZTcsIDB4MGQ0MCwgMHgwZDQxLAorIDB4MGQ1NywgMHgwZDU4LCAweDBkNTksIDB4MGQ1YSwgMHgwZDViLCAweDBkNWMsIDB4MGQ1ZCwgMHgwZDk4LAorIDB4MGQ5OSwgMHgwZDlhLCAweDBkOWIsIDB4MGQ5YywgMHgwZDlkLCAweDBkYWQsIDB4MGRhZSwgMHgwZGFmLAorIDB4MGRjMCwgMHgwZGMxLCAweDBkYzIsIDB4MGRjMywgMHgwZGNhLCAweDBkY2IsIDB4MGRlYywgMHgwZGVkLAorIDB4MGRlZSwgMHgwZGVmLCAweDEwMTgsIDB4MTAyMiwgMHgxMDIzLCAweDEwMzAsIDB4MTAzMSwgMHgxMDMyLAorIDB4MTAzMywgMHgxMDUwLCAweDEwNTEsIDB4MTA1YywgMHgxMDc0LCAweDEwNzUsIDB4MTA3NiwgMHgxMDc3LAorIDB4MTA3OCwgMHgxMDc5LCAweDEwN2EsIDB4MTA3YiwgMHgxMGIyLCAweDEwYjMsIDB4MTBiOCwgMHgxMGI5LAorIDB4MTBiYSwgMHgxMGJiLCAweDEwZDQsIDB4MTBlYSwgMHgxMGViLCAweDEwZWMsIDB4MTBlZCwgMHgxNDA0LAorIDB4MTQwNSwgMHgxNDA2LCAweDE0MDcsIDB4MTQxMCwgMHgxNDExLCAweDE0MTIsIDB4MTQxMywgMHgxNDE0LAorIDB4MTQxNSwgMHgxNDE2LCAweDE0MTcsIDB4MTQxOCwgMHgxNDE5LCAweDE0NjYsIDB4MTQ2NywgMHgxNDY4LAorIDB4MTQ2OSwgMHgxNDZhLCAweDE0NmIsIDB4MTQ2YywgMHgxNDZkLCAweDE0N2UsIDB4MTQ3ZiwgMHgxNDg4LAorIDB4MTQ4OSwgMHgxNDhhLCAweDE0OGIsIDB4MTRiNiwgMHgxNGI3LCAweDE0YjgsIDB4MTRiOSwgMHgxNGJhLAorIDB4MTRiYiwgMHgxNGJjLCAweDE0YmQsIDB4MTRmMCwgMHgxNGYxLCAweDE0ZjgsIDB4MTRmOSwgMHgxNGZhLAorIDB4MTRmYiwgMHgxNGZjLCAweDE0ZmQsIDB4MTRmZSwgMHgxNGZmLCAweDE1MmEsIDB4MTUyYiwgMHgxNTJjLAorIDB4MTUyZCwgMHgxNTJlLCAweDE1MmYsIDB4MTUzMCwgMHgxNTMxLCAweDE1NDgsIDB4MTU0OSwgMHgxNTRlLAorIDB4MTU0ZiwgMHgxNTU4LCAweDE1NTksIDB4MTU1YSwgMHgxNTViLCAweDE1NzIsIDB4MTU5YSwgMHgxNTliLAorIDB4MTVhYywgMHgxNWJhLCAweDE1YmIsIDB4MTVkMCwgMHgxNWQxLCAweDE1ZDIsIDB4MTVkMywgMHgxNWQ0LAorIDB4MTVkNSwgMHgxODFkLCAweDE4MWUsIDB4MTgxZiwgMHgxODQwLCAweDE4NDEsIDB4MTg0MiwgMHgxODQzLAorIDB4MTg0NCwgMHgxODQ1LCAweDE4NDYsIDB4MTg0NywgMHgxODQ4LCAweDE4NDksIDB4MTg2MSwgMHgxODYyLAorIDB4MTg2MywgMHgxODY0LCAweDE4NjUsIDB4MTg2NiwgMHgxODY3LCAweDE4NjgsIDB4MTg2OSwgMHgxODZhLAorIDB4MTg2YiwgMHgxODZjLCAweDE4NmQsIDB4MTg2ZSwgMHgxOTFiLCAweDE5MWMsIDB4MTkxZCwgMHgxOTFlLAorIDB4MTkxZiwgMHgxOTQyLCAweDE5NDMsIDB4MTk0NCwgMHgxOTQ1LCAweDE5NDYsIDB4MTk0NywgMHgxOTU4LAorIDB4MTk1OSwgMHgxOWVkLCAweDE5ZWUsIDB4MTllZiwgMHgxOWYwLCAweDE5ZjEsIDB4MTlmMiwgMHgxOWYzLAorIDB4MTlmNCwgMHgxOWY1LCAweDE5ZjYsIDB4MTlmNywgMHgxYjBlLCAweDFiMGYsIDB4MWI2MiwgMHgxYjYzLAorIDB4MWI2NCwgMHgxYjY1LCAweDFiNjYsIDB4MWI2NywgMHgxYjY4LCAweDFiNjksIDB4MWI2YSwgMHgxYjZiLAorIDB4MWI2YywgMHgxYjZkLCAweDFiNmUsIDB4MWI2ZiwgMHgxYjgyLCAweDFiYTgsIDB4MWJhOSwgMHgxYmFhLAorIDB4MWJhYiwgMHgxYmFjLCAweDFiYWQsIDB4MWJhZSwgMHgxYmFmLCAweDFiYjAsIDB4MWJiMSwgMHgxYmIyLAorIDB4MWJiMywgMHgxZDgwLCAweDFkODEsIDB4MWQ4MiwgMHgxZDgzLCAweDFkODQsIDB4MWQ4NSwgMHgxZDg2LAorIDB4MWQ4NywgMHgxZDg4LCAweDFkODksIDB4MWQ4YSwgMHgxZDhiLCAweDFkOGMsIDB4MWQ4ZCwgMHgxMDA3LAorIDB4MTAwOCwgMHgxMDA5LCAweDEwMGEsIDB4MTAwYiwgMHgxMDBjLCAweDEwMGQsIDB4MTAwZSwgMHgxMDBmLAorIDB4MTAxNiwgMHgxMDgwLCAweDEwODEsIDB4MTA4MiwgMHgxMDgzLCAweDEwODQsIDB4MTA4NSwgMHgxMDg2LAorIDB4MTA4NywgMHgxMGMwLCAweDEyM2EsIDB4MTIzYiwgMHgxMjNjLCAweDEyM2QsIDB4MTIzZSwgMHgxMjNmLAorIDB4MTI0MCwgMHgxMjQxLCAweDEyNDIsIDB4MTI0MywgMHgxMzUwLCAweDEzNTIsIDB4MTM1MywgMHgxMzU4LAorIDB4MTM1OSwgMHgxMzVhLCAweDEzNWIsIDB4MTM1YywgMHgxMzVkLCAweDEzNWUsIDB4MTM1ZiwgMHgxMzYwLAorIDB4MTM2MSwgMHgxNjAyLCAweDE2MDMsIDB4MTYwYywgMHgxNjBkLCAweDE2MGUsIDB4MTYwZiwgMHgxNjIwLAorIDB4MTYyMSwgMHgxNjIyLCAweDE2MjMsIDB4MTYyNCwgMHgxNjI1LCAweDE2MjYsIDB4MTYyNywgMHgxNjI4LAorIDB4MTYyOSwgMHgxNjZlLCAweDE2NmYsIDB4MTY3YywgMHgxNjdkLCAweDE2N2UsIDB4MTY3ZiwgMHgxNzcwLAorIDB4MTc3MSwgMHgxODUyLCAweDE4NTMsIDB4MTg3MiwgMHgxODczLCAweDE4NzQsIDB4MTg3NSwgMHgxODc2LAorIDB4MTg3NywgMHgxODc4LCAweDE4NzksIDB4MTg3YSwgMHgxODdiLCAweDE4N2MsIDB4MTg3ZCwgMHgxODdlLAorIDB4MTg3ZiwgMHgxOTE4LCAweDE5MTksIDB4MTkyNiwgMHgxOTI3LCAweDE5NzAsIDB4MTk3MSwgMHgxOTcyLAorIDB4MTk3MywgMHgxOTc0LCAweDE5NzUsIDB4MTk3NiwgMHgxOTc3LCAweDE5NzgsIDB4MTk3OSwgMHgxOTdhLAorIDB4MTk3YiwgMHgxYWEwLCAweDFhYTEsIDB4MWFhMiwgMHgxYWEzLCAweDFhYTQsIDB4MWFhNSwgMHgxYWE2LAorIDB4MWFhNywgMHgxYWE4LCAweDFhYTksIDB4MWFhYSwgMHgxYWFiLCAweDFhYWMsIDB4MWFhZCwgMHgxYjNjLAorIDB4MWIzZCwgMHgxYjNlLCAweDFiM2YsIDB4MWI1MCwgMHgxYjUxLCAweDFiNTIsIDB4MWI1MywgMHgxYjU0LAorIDB4MWI1NSwgMHgxYjU2LCAweDFiNTcsIDB4MWI1OCwgMHgxYjU5LCAweDIwMzIsIDB4MjAzMywgMHgyMDM0LAorIDB4MjAzNSwgMHgyMDM2LCAweDIwMzcsIDB4MjAzOCwgMHgyMDM5LCAweDIwM2EsIDB4MjAzYiwgMHgyMDNjLAorIDB4MjAzZCwgMHgyMDNlLCAweDIwM2YsIDB4MjA0MCwgMHgyMDQxLCAweDIwNDIsIDB4MjA0MywgMHgyMGJhLAorIDB4MjBiYiwgMHgyMGNjLCAweDIwY2QsIDB4MjBjZSwgMHgyMGNmLCAweDIwZTAsIDB4MjBlMSwgMHgyMGUyLAorIDB4MjBlMywgMHgyMGU0LCAweDIwZTUsIDB4MjBlNiwgMHgyMGU3LCAweDIxYWEsIDB4MjFhYiwgMHgyMWMwLAorIDB4MjFjMSwgMHgyMWMyLCAweDIxYzMsIDB4MjFjNCwgMHgyMWM1LCAweDIxYzYsIDB4MjFjNywgMHgyMWM4LAorIDB4MjFjOSwgMHgyMWNhLCAweDIxY2IsIDB4MjFjYywgMHgyMWNkLCAweDIxY2UsIDB4MjFjZiwgMHgyMWQwLAorIDB4MjFkMSwgMHgyMWQyLCAweDIxZDMsIDB4Mjg5NCwgMHgyODk1LCAweDI4OTYsIDB4Mjg5NywgMHgyODk4LAorIDB4Mjg5OSwgMHgyODlhLCAweDI4OWIsIDB4Mjg5YywgMHgyODlkLCAweDI4OWUsIDB4Mjg5ZiwgMHgyOGMwLAorIDB4MjhjMSwgMHgyOGMyLCAweDI4YzMsIDB4MjhjNCwgMHgyOGM1LCAweDI4YzYsIDB4MjhjNywgMHgyOGM4LAorIDB4MjhjOSwgMHgyOGNhLCAweDI4Y2IsIDB4MjkzMCwgMHgyOTMxLCAweDI5MzIsIDB4MjkzMywgMHgyOTM0LAorIDB4MjkzNSwgMHgyOTM2LCAweDI5MzcsIDB4MjkzOCwgMHgyOTM5LCAweDI5M2EsIDB4MjkzYiwgMHgyOTNjLAorIDB4MjkzZCwgMHgyOTNlLCAweDI5M2YsIDB4Mjk2MCwgMHgyOTYxLCAweDI5NjIsIDB4Mjk2MywgMHgyOTY0LAorIDB4Mjk2NSwgMHgyOTY2LCAweDI5NjcsIDB4Mjk2OCwgMHgyOTY5LCAweDI5NmEsIDB4Mjk2YiwgMHgyYTQwLAorIDB4MmE0MSwgMHgyYTQyLCAweDJhNDMsIDB4MmE0NCwgMHgyYTQ1LCAweDJhNDYsIDB4MmE0NywgMHgyYTQ4LAorIDB4MmE0OSwgMHgyYTRhLCAweDJhNGIsIDB4MmE0YywgMHgyYTRkLCAweDJhNGUsIDB4MmE0ZiwgMHgyYTUwLAorIDB4MmE1MSwgMHgyYTUyLCAweDJhNTMsIDB4MmFlNiwgMHgyYWU3LCAweDJiMjQsIDB4MmIyNSwgMHgyYjI2LAorIDB4MmIyNywgMHgyYjI4LCAweDJiMjksIDB4MmIyYSwgMHgyYjJiLCAweDJiMmMsIDB4MmIyZCwgMHgyYjJlLAorIDB4MmIyZiwgMHgyYjMwLCAweDJiMzEsIDB4MmIzMiwgMHgyYjMzLCAweDJiNWEsIDB4MmI1YiwgMHgzMDE0LAorIDB4MzAxNSwgMHgzMDE2LCAweDMwMTcsIDB4MzAyMCwgMHgzMDIxLCAweDMwMjIsIDB4MzAyMywgMHgzMDI0LAorIDB4MzAyNSwgMHgzMDI2LCAweDMwMjcsIDB4MzAyOCwgMHgzMDI5LCAweDMwMmEsIDB4MzAyYiwgMHgzMDJjLAorIDB4MzAyZCwgMHgzMDJlLCAweDMwMmYsIDB4MzAzMCwgMHgzMDMxLCAweDMwMzIsIDB4MzAzMywgMHgzMDM0LAorIDB4MzAzNSwgMHgzMDM2LCAweDMwMzcsIDB4MzAzOCwgMHgzMDM5LCAweDMwYzAsIDB4MzBjMSwgMHgzMGRlLAorIDB4MzBkZiwgMHgzMjE4LCAweDMyMTksIDB4MzIxYSwgMHgzMjFiLCAweDMyMWMsIDB4MzIxZCwgMHgzMjFlLAorIDB4MzIxZiwgMHgzMjIwLCAweDMyMjEsIDB4MzIyMiwgMHgzMjIzLCAweDMyMjQsIDB4MzIyNSwgMHgzMjI2LAorIDB4MzIyNywgMHgzMjI4LCAweDMyMjksIDB4MzIyYSwgMHgzMjJiLCAweDMyMmMsIDB4MzIyZCwgMHgzMjJlLAorIDB4MzIyZiwgMHgzMjMwLCAweDMyMzEsIDB4MzIzMiwgMHgzMjMzLCAweDMyMzQsIDB4MzIzNSwgMHgzMzc4LAorIDB4MzM3OSwgMHgzMzdhLCAweDMzN2IsIDB4MzM3YywgMHgzMzdkLCAweDMzN2UsIDB4MzM3ZiwgMHgzM2MwLAorIDB4MzNjMSwgMHgzM2MyLCAweDMzYzMsIDB4MzNjNCwgMHgzM2M1LCAweDMzYzYsIDB4MzNjNywgMHgzM2M4LAorIDB4MzNjOSwgMHgzM2NhLCAweDMzY2IsIDB4MzNjYywgMHgzM2NkLCAweDMzY2UsIDB4MzNjZiwgMHgzM2QwLAorIDB4MzNkMSwgMHgzM2QyLCAweDMzZDMsIDB4MzNkNCwgMHgzM2Q1LCAweDMzZDYsIDB4MzNkNywgMHgzM2Q4LAorIDB4MzNkOSwgMHgzNzA2LCAweDM3MDcsIDB4MzczMCwgMHgzNzMxLCAweDM3MzIsIDB4MzczMywgMHgzNzM0LAorIDB4MzczNSwgMHgzNzM2LCAweDM3MzcsIDB4MzczOCwgMHgzNzM5LCAweDM3M2EsIDB4MzczYiwgMHgzNzNjLAorIDB4MzczZCwgMHgzNzNlLCAweDM3M2YsIDB4Mzc0MCwgMHgzNzQxLCAweDM3NDIsIDB4Mzc0MywgMHgzNzQ0LAorIDB4Mzc0NSwgMHgzNzQ2LCAweDM3NDcsIDB4Mzc0OCwgMHgzNzQ5LCAweDM3NGEsIDB4Mzc0YiwgMHgzNzRjLAorIDB4Mzc0ZCwgMHgzNzRlLCAweDM3NGYsIDB4M2IzNCwgMHgzYjM1LCAweDNiMzYsIDB4M2IzNywgMHgzYmU4LAorIDB4M2JlOSwgMHgzYmVhLCAweDNiZWIsIDB4M2JlYywgMHgzYmVkLCAweDNiZWUsIDB4M2JlZiwgMHgzYmYwLAorIDB4M2JmMSwgMHgzYmYyLCAweDNiZjMsIDB4M2JmNCwgMHgzYmY1LCAweDNiZjYsIDB4M2JmNywgMHgzYmY4LAorIDB4M2JmOSwgMHgzYmZhLCAweDNiZmIsIDB4M2JmYywgMHgzYmZkLCAweDNiZmUsIDB4M2JmZiwgMHgyMDAwLAorIDB4MjAwMSwgMHgyMDAyLCAweDIwMDMsIDB4MjAwNCwgMHgyMDA1LCAweDIwMDYsIDB4MjAwNywgMHgyMDA4LAorIDB4MjAwOSwgMHgyMDBhLCAweDIwMGIsIDB4MjAwYywgMHgyMDBkLCAweDIwMmUsIDB4MjAyZiwgMHgyMTgyLAorIDB4MjE4MywgMHgyMWI0LCAweDIxYjUsIDB4MjFiNiwgMHgyMWI3LCAweDIxYjgsIDB4MjFiOSwgMHgyMWJhLAorIDB4MjFiYiwgMHgyMWJjLCAweDIxYmQsIDB4MjFiZSwgMHgyMWJmLCAweDI0NjAsIDB4MjQ2MSwgMHgyNDYyLAorIDB4MjQ2MywgMHgyNDY0LCAweDI0NjUsIDB4MjQ2NiwgMHgyNDY3LCAweDI0NjgsIDB4MjQ2OSwgMHgyNDZhLAorIDB4MjQ2YiwgMHgyNDZjLCAweDI0NmQsIDB4MjQ2ZSwgMHgyNDZmLCAweDI0NzAsIDB4MjQ3MSwgMHgyNDcyLAorIDB4MjQ3MywgMHgyNmEyLCAweDI2YTMsIDB4MDAwYiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlMV9tdl9iaXRzWzExMDBdID0geworICAyLCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwKKyAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDgsCisgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAorICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwKKyAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLAorIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsCisgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgMTUsIDE1LCAxNSwgIDQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0YWJsZTFfbXZ4WzEwOTldID0geworIDMyLCAzMSwgMzIsIDMxLCAzMywgMzIsIDMzLCAzMywKKyAzMSwgMzQsIDMwLCAzMiwgMzIsIDM0LCAzNSwgMzIsCisgMzQsIDMzLCAyOSwgMzAsIDMwLCAzMiwgMzEsIDMxLAorIDMzLCAzNSwgMzUsIDMzLCAzMSwgMjksIDI5LCAzMywKKyAzNCwgMzAsIDMxLCAyOCwgMzYsIDMwLCAzNCwgMzIsCisgMzIsIDM3LCAzMiwgMzIsIDI1LCAyNywgMzksIDMyLAorIDMyLCAzMiwgMzgsIDM1LCAzNiwgMzIsIDM3LCA2MSwKKyAyNiwgMzIsIDM0LCAzNSwgIDMsIDM1LCAyNywgMjgsCisgMjksIDM0LCAyOCwgMzcsIDMxLCAzNiwgMzIsIDI3LAorIDMxLCAzMCwgMjksIDM5LCAzMywgMjksIDMzLCAzNSwKKyAyNSwgMjUsIDI5LCAzMywgMzEsIDMxLCAzMSwgMzMsCisgMzIsIDMwLCAzMiwgMzIsIDQxLCAzOSwgMzMsIDM2LAorIDMyLCAyOCwgMzQsIDM2LCAzOCwgMjQsIDYwLCAzMSwKKyAyMywgMjgsIDMyLCAzMywgNTksIDMyLCA0MCwgMzAsCisgIDUsIDM0LCAzMiwgMzgsIDMyLCAzMCwgNDMsICA0LAorIDMyLCAzMiwgNDIsIDMxLCAzMSwgMzIsIDI2LCAzOCwKKyAyNiwgMjIsIDIxLCAzNywgNjEsIDYzLCAzNywgMzEsCisgMzIsIDMzLCAgMiwgIDEsIDIzLCAzMywgNDEsIDI3LAorIDM1LCAzMCwgMzgsIDIzLCAzMywgIDMsIDI4LCAzNCwKKyAzNCwgMjcsIDQxLCAyOSwgMzksIDM1LCAzNiwgMjksCisgMzIsIDI3LCAzMCwgMzIsIDI0LCA2MSwgMzcsIDI2LAorIDU5LCAyNSwgMzUsIDI3LCAzNiwgMzcsIDMwLCAzMSwKKyAzNCwgNDAsICAzLCAyOCwgMzQsIDM5LCAzMiwgMzEsCisgMzIsIDMwLCAyNCwgMjgsIDM1LCAzNiwgMjYsIDMyLAorIDMxLCAzMywgMjksIDMzLCAzOSwgMjUsIDMwLCAyNCwKKyAzNSwgNTksIDI5LCAzNCwgMjUsIDMwLCAyMSwgMzUsCisgNDMsIDQwLCAzMiwgMjksICA1LCAyOCwgMzEsIDYyLAorIDMzLCAzMywgMjUsIDMxLCAyMSwgMzEsIDQzLCAzMSwKKyAzNCwgMzMsIDIwLCA0MCwgMzksIDMxLCAzMSwgNTcsCisgMzgsIDMyLCA0MiwgMzMsIDMyLCAzMSwgMzIsIDI5LAorIDMwLCA0NCwgIDUsIDMxLCAyMiwgMzQsIDM2LCAxNywKKyAzOCwgNTgsIDM4LCAzNSwgMzIsIDYwLCAzNSwgMjQsCisgMzIsIDM4LCAxNiwgNDUsIDQyLCAzMiwgMzEsIDI5LAorICA0LCAzMCwgMTcsIDQwLCA0NiwgNDgsIDYzLCAzMiwKKyA0MiwgMTksIDQxLCAyMiwgMjgsIDM2LCA0NSwgMzMsCisgMzMsIDMyLCAyOSwgIDcsIDQxLCA0MiwgMTgsIDMzLAorIDMzLCAzMiwgMjIsIDM3LCAgMSwgMjYsIDIyLCAyMywKKyA0OSwgMjgsIDI2LCAyNywgMzIsIDMzLCAyNywgMjMsCisgMjgsIDM2LCAxNSwgIDYsIDM0LCAyNywgMzEsIDI2LAorIDIzLCAgMiwgMzMsIDMyLCAzNCwgNDEsIDI4LCAzMiwKKyA0MSwgIDAsIDM2LCAzOCwgMzQsIDMxLCA0NywgMzIsCisgMTcsIDMxLCAzOSwgMzMsIDM3LCA1MSwgMzAsIDQ3LAorIDMyLCA1MCwgMzIsIDE5LCA2MywgMzAsIDI1LCAyNywKKyAzMywgNjIsIDI0LCAzMSwgMjcsIDMwLCAzNywgMzEsCisgNDUsIDMyLCAzOSwgMjAsIDQ2LCA0NywgMzUsIDE5LAorIDM0LCAgMSwgNDksIDIxLCAyMSwgMTQsIDUxLCAyNiwKKyAyMywgMzEsIDM2LCAzNSwgNTgsIDI5LCAyOSwgMjEsCisgMjAsIDQyLCAxMywgMjgsIDEyLCA0MCwgMzEsIDMzLAorIDM5LCA2MCwgMzIsIDQ0LCAzMywgMzEsIDI4LCAzNywKKyAyOSwgMzIsIDMwLCA0OSwgNDMsIDI4LCAzOSwgMjUsCisgMzIsIDQ4LCAgMiwgMTUsIDIwLCAyNSwgMzEsIDI4LAorIDIxLCAyNCwgMjUsIDE1LCAzMSwgMTcsIDM3LCA0MywKKyAxOCwgMzIsIDMzLCAyNCwgMzMsIDM2LCAxMywgMzMsCisgMzEsIDM5LCAxMSwgMzEsIDMzLCAzMiwgMzksIDM3LAorIDMyLCAzMiwgMjksIDE3LCA0NCwgNDYsIDM2LCAzNSwKKyAyNiwgMzcsIDU4LCAzMiwgMzQsIDM4LCAgOCwgMzgsCisgMzgsIDIyLCAyOSwgMjUsIDE2LCAzNSwgMzIsIDM1LAorIDMzLCA0MywgMTgsIDQ2LCAzOCwgNTAsIDMzLCAxOCwKKyA1MywgNjAsIDEzLCAzMiwgMzYsIDMzLCA1MSwgMzYsCisgNDMsIDQ1LCAyNywgNDIsIDI5LCAyNCwgMzAsIDI1LAorIDMxLCA1MiwgMzEsIDM1LCAzOCwgIDksIDIyLCAzNCwKKyAgNCwgMTcsIDI4LCA1NSwgNDIsIDI1LCAxNywgMjAsCisgNDcsIDM0LCAzMywgMTYsIDQwLCAyNSwgMTYsIDMwLAorIDUzLCAyOSwgMTAsIDExLCAxNCwgMjYsIDMzLCAgNCwKKyAzNSwgNDQsIDI2LCAxNiwgMzEsIDI2LCAzNCwgMzgsCisgMjksIDMxLCAzMCwgMjQsIDIyLCA2MSwgMzIsICA5LAorIDQ1LCAzNCwgMzEsIDE5LCAgOSwgMzEsIDQ2LCAzMSwKKyAzNSwgNTQsIDI5LCA1NywgMzAsIDUwLCAgMywgMzEsCisgNjMsIDM0LCA0NywgNDEsIDUxLCAxOCwgMzEsIDE0LAorIDM3LCAzOCwgMzEsIDI0LCAzMiwgMzEsIDUwLCAzMywKKyAzMSwgNTQsIDI3LCAgOSwgMzMsIDIzLCAxOSwgMzIsCisgMjksIDI5LCAzMywgMjgsIDQ3LCA0OSwgMzAsIDQ3LAorIDMzLCAyNywgMjUsIDU0LCA0NCwgNDUsIDUwLCA1OCwKKyA1MSwgNDgsIDMzLCA1OSwgMzMsIDM0LCA1NywgMTMsCisgMjYsIDMzLCAxMywgNDgsIDMwLCAxMSwgIDcsIDU2LAorIDM0LCA1NSwgMjYsICAwLCAyNiwgMzUsICAxLCA1MSwKKyAzMywgNTMsIDMxLCA0NSwgMTIsIDI5LCAyOSwgNTEsCisgMzEsIDQ4LCAgMiwgIDYsIDM0LCAzMCwgMjgsIDMzLAorIDYwLCA0MCwgMjcsIDQ2LCAzMSwgIDksIDM1LCAyOSwKKyAzMSwgMzksIDU1LCA0NiwgMTksIDM3LCA2MiwgMzQsCisgMzAsIDE2LCAxOSwgNDksIDQxLCA0MSwgMzksIDM3LAorIDE0LCAgNSwgMTMsIDM1LCA1NSwgMzAsIDQwLCA0MCwKKyA0MiwgIDgsIDIwLCAyNSwgNDUsIDM1LCAzMywgMzYsCisgNTQsIDM4LCAyNywgMzcsIDYyLCA0MCwgMTUsIDU5LAorIDQ5LCAzMSwgMjksIDM0LCAzNCwgMzksIDI0LCAyOSwKKyAyNSwgMjksIDIxLCAyOSwgMTAsIDYxLCAzMywgNDksCisgMzUsIDM0LCAgMywgMzgsIDM5LCAyOSwgIDcsIDQxLAorICAxLCAzNSwgIDQsIDIzLCAxNSwgMjMsIDExLCAzNywKKyAyOCwgMzUsIDMwLCAzMCwgMjQsICAxLCA0MywgNTYsCisgIDgsIDM0LCA0MiwgMjQsIDQ1LCAzMCwgMjAsIDIzLAorICA4LCAzOCwgMjIsIDMzLCAxNywgNTIsIDM0LCAyMiwKKyA1MywgNDMsIDQ0LCAgMSwgMjcsIDMxLCA0MSwgNDMsCisgNDEsIDMwLCAzMSwgMzYsIDMwLCAgNSwgNTUsIDMxLAorIDMzLCAzMCwgNDAsIDIzLCAxNSwgMjksIDM0LCAzNCwKKyA1OSwgMzQsIDMwLCAxMSwgMTMsIDM4LCAgNSwgIDAsCisgMzAsIDQyLCAgNSwgMzAsIDI5LCAzNCwgMTAsIDQ0LAorIDMwLCA2MywgMzUsIDEyLCAgMywgMjYsIDE1LCAxNywKKyAyNSwgMzQsIDQzLCAzOSwgMzQsIDU2LCAyOSwgMjMsCisgMzAsIDEyLCAzMCwgMTAsIDM1LCAgOSwgMjQsIDU4LAorIDEwLCAxMiwgNTQsIDMzLCAzNywgMjAsIDQxLCAzNSwKKyAyOSwgMTgsIDYxLCAzMCwgNDAsIDI0LCAzOSwgNTMsCisgNjIsIDI2LCAyOSwgMzMsIDM0LCA1MywgNDksIDIxLAorIDI3LCAxMSwgNjMsIDIwLCAyNiwgMjMsICA3LCAxMywKKyAgNiwgNDcsIDI5LCAzMCwgIDksIDUxLCAyMiwgMzQsCisgMjEsIDI1LCAzMywgNTYsIDU3LCAzMCwgMzgsIDUxLAorIDUxLCAzOCwgNjMsIDI4LCA0MCwgMzUsIDMzLCAxOCwKKyAzMywgMzMsIDI0LCA1OCwgNTgsIDM0LCA0OSwgMjksCisgNDMsICA0LCAgMSwgIDQsIDQyLCAzNSwgMzUsIDMwLAorIDE3LCAgNSwgNTYsIDYxLCAyNSwgMzcsIDM2LCA1NSwKKyAyOCwgMzUsIDI5LCA1MCwgNDgsIDUyLCAgMiwgNDIsCisgMzQsIDQwLCA0NiwgNDYsIDQzLCAzNSwgMjksIDQ4LAorIDIwLCAyOSwgMzEsIDQxLCAgNywgMzAsIDM1LCAxOSwKKyAxNCwgMjEsICA4LCAzOSwgMzksIDQwLCA0NiwgNTUsCisgMzQsICA2LCAzMCwgMzQsIDM3LCAyNSwgMzcsIDMzLAorIDIyLCA0NCwgNTIsIDE3LCAzNSwgMjksIDM2LCAzNSwKKyA0MCwgMzcsIDI4LCAzMCwgNTAsIDE0LCAyOCwgNTUsCisgIDYsIDIzLCAxOSwgMTQsIDMwLCAgMywgMzAsIDI4LAorIDI4LCA2MSwgNjEsIDQ3LCA0NSwgNDgsIDQwLCA0MCwKKyAzNCwgMzQsIDI1LCAzMCwgMjksIDM1LCAgNCwgMjYsCisgNTMsIDUwLCAyNiwgNDEsIDI3LCA1OSwgMjcsIDM4LAorIDM5LCAgMywgNTAsIDQzLCA0NywgMjMsIDMzLCA1NSwKKyAzNSwgMjEsIDIzLCAzNSwgNjEsIDMzLCA0NiwgNTIsCisgMzUsIDM0LCAyNCwgMzAsIDQzLCAxNiwgMzcsIDIxLAorICAyLCAyNCwgNDUsIDM0LCAzMCwgNTUsIDU1LCAgMSwKKyAyOSwgMjksIDI2LCAyOCwgMjUsIDMxLCAzNiwgMjIsCisgMTcsIDMwLCA1MiwgIDIsIDQ0LCA0NCwgNTcsIDI2LAorIDYyLCA0MSwgMzksIDU3LCAyNiwgNDYsIDQ5LCAxMSwKKyAxNiwgMTksICA1LCA1OSwgMzgsIDM5LCA1OCwgMzgsCisgMjUsIDQ5LCA1MCwgMjIsIDI4LCA1OSwgIDksIDU5LAorICA3LCAyOCwgNTUsIDE3LCAgNCwgMzUsIDUwLCAyMSwKKyAyOSwgNDQsIDQ3LCAxOCwgMjQsIDE5LCAyNSwgNDIsCisgMzUsICAzLCA1MSwgMzUsIDE2LCAzNSwgMzAsIDYzLAorIDU3LCAzOSwgMzksIDI1LCAzNSwgMzgsICA5LCAxNiwKKyAzNiwgNDUsIDMxLCA2MCwgMTQsIDM0LCA0MiwgMjQsCisgIDAsIDM3LCAxOCwgNjEsIDU3LCAzNywgMjgsIDUzLAorIDIwLCA0NiwgMTQsIDQ3LCAzOCwgMzgsIDM4LCAgOSwKKyAzNCwgMzksIDQzLCAxNywgMzksIDU5LCAgNSwgMjcsCisgIDAsIDEyLCAyNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlMV9tdnlbMTA5OV0gPSB7CisgMzIsIDMyLCAzMSwgMzEsIDMyLCAzMywgMzEsIDMzLAorIDMzLCAzMiwgMzIsIDMwLCAzNCwgMzEsIDMyLCAyOSwKKyAzMywgMzAsIDMyLCAzMywgMzEsIDM1LCAzNCwgMzAsCisgMzQsIDMxLCAzMywgMjksIDI5LCAzMSwgMzMsIDM1LAorIDMwLCAzMCwgMzUsIDMyLCAzMiwgMzQsIDM0LCAyOCwKKyAyNSwgMzIsIDM2LCAyNywgMzIsIDMyLCAzMiwgMzcsCisgMzksICAzLCAzMiwgMzAsIDMxLCAyNiwgMzEsIDMyLAorIDMyLCAzOCwgMjksIDI5LCAzMiwgMzQsIDMxLCAzMSwKKyAzNCwgMzUsIDMzLCAzMywgMjgsIDMzLCAgMSwgMzMsCisgMjcsIDI5LCAzMCwgMzEsIDI4LCAyOSwgMzcsIDM1LAorIDMxLCAzMywgMzUsIDI3LCAzNiwgMzcsIDI1LCAyNSwKKyA2MSwgMzUsICA0LCAgNSwgMzIsIDMzLCAzNiwgMzAsCisgMjMsIDMwLCAyOCwgMzQsIDMxLCAzMiwgMzIsIDM5LAorIDMyLCAzNCwgMjEsIDM5LCAzMiwgNTksIDMyLCAyOCwKKyAzMiwgMzYsIDYwLCAzMywgMjQsIDM2LCAzMiwgMzIsCisgNDEsICAyLCAzMiwgMzgsIDI2LCAyMiwgMzMsIDMwLAorIDMxLCAzMiwgMzIsIDMwLCAzMSwgMzIsIDI5LCAgMywKKyA0MCwgMzgsIDMyLCAzMiwgMzMsIDI2LCAzMSwgMzQsCisgMjgsIDM4LCAzNCwgMzEsICAzLCAzMSwgMzUsIDM4LAorIDI3LCAzNSwgMzMsIDI4LCAyOSwgMjcsIDI5LCAyNywKKyA0MywgMjksIDM3LCA2MywgMzEsIDMzLCAzNCwgMzAsCisgMzEsIDMwLCAzNywgMzAsIDM1LCAzNSwgMjYsIDQxLAorIDM3LCAzMSwgMzMsIDI4LCAyNiwgMzAsIDQyLCAyNCwKKyAgNywgMjcsIDMzLCAyOSwgMzYsIDI4LCAzNCwgNTcsCisgMjMsIDQxLCAzNiwgMjMsIDM1LCAzNCwgMjUsIDMwLAorIDI1LCAzMywgMjUsIDI1LCAyOSwgMjQsIDMzLCAzOSwKKyAzMywgMzMsICAwLCAzNywgMzEsIDM2LCAyMSwgMzIsCisgNjEsIDI0LCAzNSwgNjEsIDMxLCAgNSwgMzEsIDU5LAorIDM5LCAyMSwgMzIsIDMwLCAzNCwgMjIsIDQwLCAzMiwKKyAyOSwgMTYsIDMxLCAgNSwgNjIsICAyLCAyMCwgMzksCisgMzksIDMyLCAzMywgIDEsIDMxLCAyNCwgMzYsIDMyLAorIDM2LCAzMiwgMjgsIDI2LCAgNiwgMzEsIDM4LCAzNCwKKyA1OCwgMzUsIDMyLCAzMywgMzMsIDE3LCA0MywgMjYsCisgMzEsIDQwLCAzMSwgMzQsIDMyLCAzMiwgMzEsIDE5LAorIDMwLCAzMiwgMjksIDMzLCAzOCwgMzgsIDMyLCA1OSwKKyA0MCwgMTgsIDM4LCAzMiwgMzUsIDM0LCAzMiwgMTcsCisgIDEsIDE1LCAzMCwgMjgsIDMxLCAyOCwgMzQsIDI5LAorIDMyLCAyNywgMzUsIDI3LCA0OSwgMjIsIDM3LCAzNCwKKyAzNywgMjYsIDMyLCAzMiwgMjIsIDI4LCA0NSwgMjksCisgMzAsIDMxLCA0MywgNDYsIDQxLCAzMCwgMjYsIDEzLAorIDM0LCAzMiwgMjcsIDM4LCA0MiwgNDIsIDMzLCA0NywKKyAzMywgNjAsIDI3LCA0MiwgMjUsIDMyLCAyMiwgMzIsCisgNDgsIDMyLCA0NSwgMzMsIDMzLCA0MSwgMjcsIDI1LAorIDE5LCAzMSwgMzUsIDE5LCAzNiwgNDIsIDI3LCAxNywKKyAzMSwgNDQsIDI4LCAzMywgMzMsIDMxLCAyMywgMzEsCisgNDAsIDMzLCAzMSwgMzQsIDMwLCAzMiwgMzMsIDM2LAorIDM1LCA0NywgMzcsIDQxLCAzMSwgMjMsIDQxLCAyOSwKKyAzMCwgMzUsIDMyLCAyNSwgMzIsIDI4LCA1OCwgIDIsCisgMzcsIDMzLCAxNCwgMzMsIDQ5LCAyMCwgMzksIDM2LAorIDIxLCAgOSwgMjMsIDMzLCAzNSwgMjQsIDM5LCAzNywKKyAxMSwgMzMsIDMwLCAzMSwgMzEsIDI4LCA1MSwgNDAsCisgMzUsIDI5LCAyNSwgMzMsIDQ2LCAzNSwgMzcsIDMwLAorIDMwLCAgOCwgNjMsIDI4LCAxNSwgNDAsIDMzLCA0NSwKKyA0OSwgMjUsIDMyLCAgNCwgNDcsIDUxLCAzNiwgMzksCisgNTMsIDEwLCAyNCwgMjksIDMwLCAzMSwgMjUsIDQwLAorIDM4LCAzOCwgMzMsIDU2LCAyMywgMjcsIDMyLCAzNywKKyAyNiwgMjksIDQzLCAzNiwgMzMsIDI0LCA1NSwgNDMsCisgIDksIDI5LCAzNCwgMzQsIDI0LCAzMywgMTgsIDMzLAorIDMzLCAzMCwgMzEsIDUwLCAyNCwgNjAsIDMwLCAzOSwKKyAzNCwgMzAsIDM5LCAyOCwgMjIsIDM4LCAgMiwgMjYsCisgNjMsIDMyLCA1NywgMjEsIDM5LCAzMywgMjgsIDE4LAorIDMwLCAzNCwgMjIsIDMzLCAyOSwgNDEsIDMwLCAzNCwKKyAzNSwgMjEsIDEzLCAzNCwgMzUsIDM5LCAzMCwgNDYsCisgMzIsIDQyLCAzMiwgMzEsIDMzLCAyNiwgMTEsIDMzLAorIDIyLCAzMSwgMjUsIDMxLCA1MywgMjcsIDQzLCAyNSwKKyA0MCwgNTAsIDIxLCAzNiwgMzgsIDMwLCAxMiwgMzEsCisgMzQsIDIwLCAxNSwgMjksIDMyLCA2MiwgMzAsIDEzLAorIDE3LCAzMiwgMTksIDMxLCAyMCwgMzEsIDMwLCAgNywKKyAgMSwgMTcsIDM0LCAzNywgMzEsIDMxLCA0NCwgMzQsCisgMjYsIDQwLCAxNiwgMzcsIDUyLCA0OCwgMzAsIDIwLAorIDE4LCAzMywgMzgsIDI5LCAgNywgMjUsIDMwLCA1NCwKKyA0NSwgNDcsIDQ2LCA0MSwgMjksIDI5LCAxNiwgMzAsCisgMTQsIDI2LCAzOCwgMzQsIDM0LCAyOSwgMzQsIDMwLAorIDI5LCAzMCwgNTcsIDMwLCAgNCwgNDYsIDMzLCAyOSwKKyAzOSwgNDQsIDMwLCAzMSwgNTAsIDMzLCAzMSwgMzIsCisgMTksIDMyLCA0MCwgMzEsIDM3LCA0NywgIDEsIDM1LAorIDE2LCAzMSwgIDAsIDM1LCAzMywgIDEsIDE3LCAzNCwKKyAgOSwgMzQsIDMzLCAzMSwgNDksIDQzLCA0MiwgNTEsCisgMzQsIDI5LCAyMywgMjksIDE0LCAzMCwgNDUsIDQ5LAorIDExLCAyNCwgMzEsIDI4LCAzNSwgNDEsIDMwLCA0NCwKKyAxOCwgMjksIDM0LCAzNSwgMzYsIDI1LCAyNiwgMjEsCisgMzEsIDMwLCAzNCwgMTksIDM0LCA0NCwgMzYsIDM4LAorIDI1LCAzMSwgMjgsIDIzLCAzNywgIDMsIDU1LCA0MSwKKyAzMCwgMjIsIDQxLCAyNCwgMzMsIDI2LCAzNSwgMzUsCisgMzAsIDU1LCA1MSwgNDcsIDQ4LCAzOCwgMjQsIDE1LAorIDIxLCA1MCwgMjUsIDQ2LCAzMCwgMjksIDEwLCAzNCwKKyA0MiwgNDUsIDI5LCA0MiwgMjIsICAzLCAzMywgMjcsCisgMzQsICAxLCAzNCwgMjgsIDM0LCAzNiwgMzUsIDIzLAorIDIzLCAxMywgNTgsICAzLCAyNiwgNjMsIDI1LCAzMSwKKyAzNCwgNjEsIDM4LCAzOSwgMjUsIDYxLCAyOSwgMzcsCisgMzAsIDQxLCAyNiwgNDgsIDI4LCAzMywgNTAsIDM1LAorIDMwLCAzNywgMjksIDI5LCA0MCwgIDYsIDM5LCAyOCwKKyAyOCwgMTksICA4LCAyMiwgNDUsIDM0LCAzNSwgMTAsCisgNTgsIDE3LCAzNywgMzksIDMwLCAxOCwgNTQsIDE0LAorIDI5LCAxNiwgNTksIDMwLCAzNSwgMjMsIDM1LCAzMCwKKyA0NywgMzYsIDI5LCA1NSwgMjAsIDEyLCAzMSwgMzUsCisgMTQsIDI5LCAxOCwgMzQsIDM0LCAyNCwgMjksIDI2LAorIDIyLCAgMiwgMjcsIDIzLCAgOCwgMzAsIDU1LCAzOCwKKyA2MCwgMzEsICA0LCAzNCwgNDksIDM0LCAyNywgMzQsCisgMzMsIDMwLCAzMSwgNTQsIDQyLCAzNSwgMzgsIDQ2LAorIDQ0LCAyNiwgMjcsICA5LCAzOSwgMjUsIDIxLCAyOSwKKyAyOCwgNDIsIDEzLCAgMCwgIDUsIDM0LCAzNywgMjgsCisgMjQsIDI5LCA2MywgMjYsIDIyLCAyNywgMjksIDI1LAorIDMzLCAyNSwgNjEsICAwLCAzNSwgMjUsIDM2LCAxNSwKKyAyNywgNDAsIDUzLCAzMywgIDMsIDEwLCAxNiwgMzcsCisgMzgsIDE4LCAzMCwgNDYsIDI3LCAgOSwgIDYsIDI5LAorIDYyLCAgOCwgNDIsIDI4LCAyOSwgIDMsIDI1LCAxNiwKKyAyNiwgMjksIDM1LCAyOCwgMjcsIDUxLCA2MSwgNDgsCisgMzcsICA5LCAzNCwgIDcsIDQ5LCA0NSwgMjAsIDI5LAorIDIxLCAgNSwgIDUsIDI5LCAyOCwgMzQsIDI5LCAyNCwKKyAxMCwgMjQsIDM1LCAzNiwgMzgsIDU1LCAxMSwgMzYsCisgMzgsIDUzLCA1NCwgMjYsIDMwLCA0OSwgMjAsIDI3LAorIDMwLCAzOSwgMzMsIDQxLCA0OSwgMjIsIDM4LCAzOCwKKyAgNCwgMzAsICA4LCAgOSwgIDMsIDI0LCAyMiwgNTAsCisgMzcsIDM2LCAzMSwgMjcsICAyLCAgOSwgNDIsIDYzLAorIDI1LCAxOSwgNDQsICAxLCAyOCwgMjgsIDQ4LCAzMCwKKyAzNCwgNDEsIDQxLCAzOCwgMTIsIDI3LCAxNSwgIDAsCisgMTYsIDM0LCAzNSwgMzgsIDI4LCAyOSwgNDAsIDQyLAorIDUxLCA1MiwgNDUsIDU0LCA1OSwgNTksIDQyLCA0NCwKKyAzNywgMjYsIDQ2LCAyNCwgMTUsIDM5LCAyMiwgNDYsCisgMTksIDM1LCAzOCwgMTcsIDM3LCAyMywgNTIsIDU1LAorIDUwLCAzNywgMjYsIDExLCAzNywgMTIsIDI0LCAzMCwKKyAxNiwgMTMsIDIyLCAxMywgMzYsIDM1LCA0MCwgNDEsCisgMzQsIDQxLCAyNiwgNTMsIDUxLCAgNSwgMjEsIDMwLAorICAyLCA2MywgNDEsIDIwLCAgMSwgNTYsIDIxLCAyNCwKKyAyNSwgIDUsIDI4LCAzNSwgMjYsIDI4LCAzMCwgMTgsCisgMjksIDIzLCA0MCwgMzQsIDIwLCA0MiwgMzksIDM0LAorIDI4LCA2MSwgMzgsIDI3LCA2MiwgIDksIDM2LCAxNywKKyAgOSwgNDksIDI0LCAyNSwgNTQsIDM0LCAzOSwgMzcsCisgIDMsICAxLCAyNSwgMzgsIDM4LCA0NCwgMzUsIDM2LAorIDEyLCA2MCwgMzYsIDM4LCA0MCwgMjUsIDQzLCAzOSwKKyA1MywgMjgsIDM5LCA1NywgNDYsIDEwLCA1MiwgMjcsCisgMzUsIDQyLCA0NSwgNTksIDE1LCA2MCwgMzgsIDI0LAorIDIzLCAzOSwgMTIsIDI5LCAyNCwgIDAsIDIwLCAxNiwKKyAyOCwgNDMsIDM1LCAyOCwgIDEsIDQ5LCAgNCwgMjEsCisgNDIsIDM5LCAyOSwgIDMsIDQ0LCAyMSwgNTMsIDU1LAorIDExLCAgNSwgIDMsIDM5LCA1MywgMjgsIDI1LCAxOSwKKyAzNCwgMjgsIDIxLAorfTsKKworTVZUYWJsZSBmZl9tdl90YWJsZXNbMl0gPSB7CisgICAgeworICAgICAgICAxMDk5LAorICAgICAgICB0YWJsZTBfbXZfY29kZSwKKyAgICAgICAgdGFibGUwX212X2JpdHMsCisgICAgICAgIHRhYmxlMF9tdngsCisgICAgICAgIHRhYmxlMF9tdnksCisgICAgfSwKKyAgICB7CisgICAgICAgIDEwOTksCisgICAgICAgIHRhYmxlMV9tdl9jb2RlLAorICAgICAgICB0YWJsZTFfbXZfYml0cywKKyAgICAgICAgdGFibGUxX212eCwKKyAgICAgICAgdGFibGUxX212eSwKKyAgICB9Cit9OworCitjb25zdCB1aW50OF90IGZmX3YyX21iX3R5cGVbOF1bMl0gPSB7CisgezEsIDF9LCB7MCAgICwgMn0sIHszICAgLCAzfSwgezkgICAsIDV9LAorIHs1LCA0fSwgezB4MjEsIDd9LCB7MHgyMCwgN30sIHsweDExLCA2fSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdjJfaW50cmFfY2JwY1s0XVsyXSA9IHsKKyB7MSwgMX0sIHswLCAzfSwgezEsIDN9LCB7MSwgMn0sCit9OworCitjb25zdCB1aW50OF90IGZmX3dtdjFfeV9kY19zY2FsZV90YWJsZVszMl09eworLy8gIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEKKyAgICAwLCA4LCA4LCA4LCA4LCA4LCA5LCA5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzLDE0LDE0LDE1LDE1LDE2LDE2LDE3LDE3LDE4LDE4LDE5LDE5LDIwLDIwLDIxLDIxCit9OworY29uc3QgdWludDhfdCBmZl93bXYxX2NfZGNfc2NhbGVfdGFibGVbMzJdPXsKKy8vICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxCisgICAgMCwgOCwgOCwgOCwgOCwgOSwgOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywxNCwxNCwxNSwxNSwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMgorfTsKKworY29uc3QgdWludDhfdCBmZl9vbGRfZmZfeV9kY19zY2FsZV90YWJsZVszMl09eworLy8gIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEKKyAgICAwLCA4LCA4LCA4LCA4LDEwLDEyLDE0LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5Cit9OworCitjb25zdCB1aW50OF90IGZmX3dtdjFfc2NhbnRhYmxlW1dNVjFfU0NBTlRBQkxFX0NPVU5UXVs2NF09eworICB7CisgICAgMHgwMCwgMHgwOCwgMHgwMSwgMHgwMiwgMHgwOSwgMHgxMCwgMHgxOCwgMHgxMSwKKyAgICAweDBBLCAweDAzLCAweDA0LCAweDBCLCAweDEyLCAweDE5LCAweDIwLCAweDI4LAorICAgIDB4MzAsIDB4MzgsIDB4MjksIDB4MjEsIDB4MUEsIDB4MTMsIDB4MEMsIDB4MDUsCisgICAgMHgwNiwgMHgwRCwgMHgxNCwgMHgxQiwgMHgyMiwgMHgzMSwgMHgzOSwgMHgzQSwKKyAgICAweDMyLCAweDJBLCAweDIzLCAweDFDLCAweDE1LCAweDBFLCAweDA3LCAweDBGLAorICAgIDB4MTYsIDB4MUQsIDB4MjQsIDB4MkIsIDB4MzMsIDB4M0IsIDB4M0MsIDB4MzQsCisgICAgMHgyQywgMHgyNSwgMHgxRSwgMHgxNywgMHgxRiwgMHgyNiwgMHgyRCwgMHgzNSwKKyAgICAweDNELCAweDNFLCAweDM2LCAweDJFLCAweDI3LCAweDJGLCAweDM3LCAweDNGLAorICB9LAorICB7CisgICAgMHgwMCwgMHgwOCwgMHgwMSwgMHgwMiwgMHgwOSwgMHgxMCwgMHgxOCwgMHgxMSwKKyAgICAweDBBLCAweDAzLCAweDA0LCAweDBCLCAweDEyLCAweDE5LCAweDIwLCAweDI4LAorICAgIDB4MjEsIDB4MzAsIDB4MUEsIDB4MTMsIDB4MEMsIDB4MDUsIDB4MDYsIDB4MEQsCisgICAgMHgxNCwgMHgxQiwgMHgyMiwgMHgyOSwgMHgzOCwgMHgzMSwgMHgzOSwgMHgyQSwKKyAgICAweDIzLCAweDFDLCAweDE1LCAweDBFLCAweDA3LCAweDBGLCAweDE2LCAweDFELAorICAgIDB4MjQsIDB4MkIsIDB4MzIsIDB4M0EsIDB4MzMsIDB4M0IsIDB4MkMsIDB4MjUsCisgICAgMHgxRSwgMHgxNywgMHgxRiwgMHgyNiwgMHgyRCwgMHgzNCwgMHgzQywgMHgzNSwKKyAgICAweDNELCAweDJFLCAweDI3LCAweDJGLCAweDM2LCAweDNFLCAweDM3LCAweDNGLAorICB9LAorICB7CisgICAgMHgwMCwgMHgwMSwgMHgwOCwgMHgwMiwgMHgwMywgMHgwOSwgMHgxMCwgMHgxOCwKKyAgICAweDExLCAweDBBLCAweDA0LCAweDA1LCAweDBCLCAweDEyLCAweDE5LCAweDIwLAorICAgIDB4MjgsIDB4MzAsIDB4MjEsIDB4MUEsIDB4MTMsIDB4MEMsIDB4MDYsIDB4MDcsCisgICAgMHgwRCwgMHgxNCwgMHgxQiwgMHgyMiwgMHgyOSwgMHgzOCwgMHgzMSwgMHgzOSwKKyAgICAweDJBLCAweDIzLCAweDFDLCAweDE1LCAweDBFLCAweDBGLCAweDE2LCAweDFELAorICAgIDB4MjQsIDB4MkIsIDB4MzIsIDB4M0EsIDB4MzMsIDB4MkMsIDB4MjUsIDB4MUUsCisgICAgMHgxNywgMHgxRiwgMHgyNiwgMHgyRCwgMHgzNCwgMHgzQiwgMHgzQywgMHgzNSwKKyAgICAweDJFLCAweDI3LCAweDJGLCAweDM2LCAweDNELCAweDNFLCAweDM3LCAweDNGLAorICB9LAorICB7CisgICAgMHgwMCwgMHgwOCwgMHgxMCwgMHgwMSwgMHgxOCwgMHgyMCwgMHgyOCwgMHgwOSwKKyAgICAweDAyLCAweDAzLCAweDBBLCAweDExLCAweDE5LCAweDMwLCAweDM4LCAweDI5LAorICAgIDB4MjEsIDB4MUEsIDB4MTIsIDB4MEIsIDB4MDQsIDB4MDUsIDB4MEMsIDB4MTMsCisgICAgMHgxQiwgMHgyMiwgMHgzMSwgMHgzOSwgMHgzMiwgMHgyQSwgMHgyMywgMHgxQywKKyAgICAweDE0LCAweDBELCAweDA2LCAweDA3LCAweDBFLCAweDE1LCAweDFELCAweDI0LAorICAgIDB4MkIsIDB4MzMsIDB4M0EsIDB4M0IsIDB4MzQsIDB4MkMsIDB4MjUsIDB4MUUsCisgICAgMHgxNiwgMHgwRiwgMHgxNywgMHgxRiwgMHgyNiwgMHgyRCwgMHgzQywgMHgzNSwKKyAgICAweDJFLCAweDI3LCAweDJGLCAweDM2LCAweDNELCAweDNFLCAweDM3LCAweDNGLAorICB9Cit9OworCitjb25zdCB1aW50OF90IGZmX3RhYmxlX2ludGVyX2ludHJhWzRdWzJdPXsKKyAgICB7MCwxfSAvKkx1bWEtTGVmdCBDaHJvbWEtTGVmdCovLAorICAgIHsyLDJ9IC8qTHVtYS1Ub3AgIENocm9tYS1MZWZ0Ki8sCisgICAgezYsM30gLypsdW1hLUxlZnQgQ2hyb21hLVRvcCAqLywKKyAgICB7NywzfSAvKmx1bWEtVG9wICBDaHJvbWEtVG9wICovCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdGFibGVfbWJfbm9uX2ludHJhMlsxMjhdWzJdID0geworezB4MDAwMEE3LCAxNH0sIHsweDAxQjJCOCwgMTh9LCB7MHgwMUIyOEUsIDE4fSwgezB4MDM2NTc1LCAxOX0sCit7MHgwMDZDQUMsIDE2fSwgezB4MDAwQTY5LCAxOH0sIHsweDAwMjkzNCwgMjB9LCB7MHgwMDUyNkIsIDIxfSwKK3sweDAwNkNBMSwgMTZ9LCB7MHgwMUIyQjksIDE4fSwgezB4MDAyOUFELCAyMH0sIHsweDAyOTM1MywgMjR9LAorezB4MDA2Q0E3LCAxNn0sIHsweDAwNkNBQiwgMTZ9LCB7MHgwMUIyQkIsIDE4fSwgezB4MDAwMjlCLCAxNn0sCit7MHgwMEQ5NDQsIDE3fSwgezB4MDAwQTZBLCAxOH0sIHsweDAxNDlBOCwgMjN9LCB7MHgwMzY1MUYsIDE5fSwKK3sweDAwNkNBRiwgMTZ9LCB7MHgwMDBBNEMsIDE4fSwgezB4MDM2NTFFLCAxOX0sIHsweDAwMEE0OCwgMTh9LAorezB4MDAyOTlDLCAyMH0sIHsweDAwMjk5RiwgMjB9LCB7MHgwMjkzNTIsIDI0fSwgezB4MDAyOUFDLCAyMH0sCit7MHgwMDAyOTYsIDE2fSwgezB4MDBEOTQ2LCAxN30sIHsweDAwMEE2OCwgMTh9LCB7MHgwMDAyOTgsIDE2fSwKK3sweDAwMDUyNywgMTd9LCB7MHgwMEQ5NEQsIDE3fSwgezB4MDAxNEQ3LCAxOX0sIHsweDAzNjU3NCwgMTl9LAorezB4MDAwQTVDLCAxOH0sIHsweDAxQjI5OSwgMTh9LCB7MHgwMDI5OUQsIDIwfSwgezB4MDAyOTlFLCAyMH0sCit7MHgwMDA1MjUsIDE3fSwgezB4MDAwQTY2LCAxOH0sIHsweDAwQTRENSwgMjJ9LCB7MHgwMDE0OUIsIDE5fSwKK3sweDAwMDI5NSwgMTZ9LCB7MHgwMDZDQUQsIDE2fSwgezB4MDAwQTQ5LCAxOH0sIHsweDAwMDUyMSwgMTd9LAorezB4MDA2Q0FBLCAxNn0sIHsweDAwRDk0NSwgMTd9LCB7MHgwMUIyOTgsIDE4fSwgezB4MDAwNTJGLCAxN30sCit7MHgwMDM2NTQsIDE1fSwgezB4MDA2Q0EwLCAxNn0sIHsweDAwMDUzMiwgMTd9LCB7MHgwMDAyOTEsIDE2fSwKK3sweDAwMzY1MiwgMTV9LCB7MHgwMDA1MjAsIDE3fSwgezB4MDAwQTVELCAxOH0sIHsweDAwMDI5NCwgMTZ9LAorezB4MDAwMDlCLCAxMX0sIHsweDAwMDZFMiwgMTJ9LCB7MHgwMDAwMjgsIDEyfSwgezB4MDAwMUIwLCAxMH0sCit7MHgwMDAwMDEsICAzfSwgezB4MDAwMDEwLCAgOH0sIHsweDAwMDAyRiwgIDZ9LCB7MHgwMDAwNEMsIDEwfSwKK3sweDAwMDAwRCwgIDR9LCB7MHgwMDAwMDAsIDEwfSwgezB4MDAwMDA2LCAgOX0sIHsweDAwMDEzNCwgMTJ9LAorezB4MDAwMDBDLCAgNH0sIHsweDAwMDAwNywgMTB9LCB7MHgwMDAwMDcsICA5fSwgezB4MDAwNkUxLCAxMn0sCit7MHgwMDAwMEUsICA1fSwgezB4MDAwMERBLCAgOX0sIHsweDAwMDAyMiwgIDl9LCB7MHgwMDAzNjQsIDExfSwKK3sweDAwMDAwRiwgIDR9LCB7MHgwMDAwMDYsIDEwfSwgezB4MDAwMDBGLCAgOX0sIHsweDAwMDEzNSwgMTJ9LAorezB4MDAwMDE0LCAgNX0sIHsweDAwMDBERCwgIDl9LCB7MHgwMDAwMDQsICA5fSwgezB4MDAwMDE1LCAxMX0sCit7MHgwMDAwMUEsICA2fSwgezB4MDAwMUIzLCAxMH0sIHsweDAwMDAwNSwgMTB9LCB7MHgwMDA2RTMsIDEyfSwKK3sweDAwMDAwQywgIDV9LCB7MHgwMDAwQjksICA4fSwgezB4MDAwMDA0LCAgOH0sIHsweDAwMDBEQiwgIDl9LAorezB4MDAwMDBFLCAgNH0sIHsweDAwMDAwQiwgMTB9LCB7MHgwMDAwMjMsICA5fSwgezB4MDAwNkNCLCAxMn0sCit7MHgwMDAwMDUsICA2fSwgezB4MDAwMUIxLCAxMH0sIHsweDAwMDAwMSwgMTB9LCB7MHgwMDA2RTAsIDEyfSwKK3sweDAwMDAxMSwgIDV9LCB7MHgwMDAwREYsICA5fSwgezB4MDAwMDBFLCAgOX0sIHsweDAwMDM3MywgMTF9LAorezB4MDAwMDAzLCAgNX0sIHsweDAwMDBCOCwgIDh9LCB7MHgwMDAwMDYsICA4fSwgezB4MDAwMTc1LCAgOX0sCit7MHgwMDAwMTUsICA1fSwgezB4MDAwMTc0LCAgOX0sIHsweDAwMDAyNywgIDl9LCB7MHgwMDAzNzIsIDExfSwKK3sweDAwMDAxMCwgIDV9LCB7MHgwMDAwQkIsICA4fSwgezB4MDAwMDA1LCAgOH0sIHsweDAwMDBERSwgIDl9LAorezB4MDAwMDBGLCAgNX0sIHsweDAwMDAwMSwgIDl9LCB7MHgwMDAwMTIsICA4fSwgezB4MDAwMDA0LCAxMH0sCit7MHgwMDAwMDIsICAzfSwgezB4MDAwMDE2LCAgNX0sIHsweDAwMDAwOSwgIDR9LCB7MHgwMDAwMDEsICA1fSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB0YWJsZV9tYl9ub25faW50cmEzWzEyOF1bMl0gPSB7Cit7MHgwMDAyQTEsIDEwfSwgezB4MDA1NzQwLCAxNX0sIHsweDAxQTBCRiwgMTh9LCB7MHgwMTVEMTksIDE3fSwKK3sweDAwMTUxNCwgMTN9LCB7MHgwMDQ2MUUsIDE1fSwgezB4MDE1MTc2LCAxN30sIHsweDAxNTE3NywgMTd9LAorezB4MDAxMUFELCAxM30sIHsweDAwNjgyRSwgMTZ9LCB7MHgwNjgyRjksIDIwfSwgezB4MDM0MTdELCAxOX0sCit7MHgwMDFBMzYsIDE0fSwgezB4MDAyQTJELCAxNH0sIHsweDAwRDA1RSwgMTd9LCB7MHgwMDY4MjQsIDE2fSwKK3sweDAwMTUxNSwgMTN9LCB7MHgwMDU0NUMsIDE1fSwgezB4MDIzMEU5LCAxOH0sIHsweDAxMUFGQSwgMTd9LAorezB4MDAxNUQ3LCAxM30sIHsweDAwNTc0NywgMTV9LCB7MHgwMDhENzksIDE2fSwgezB4MDA2ODI1LCAxNn0sCit7MHgwMDJCQTIsIDE0fSwgezB4MDBBOEJBLCAxNn0sIHsweDAyMzVGNiwgMTh9LCB7MHgwMTVEMTgsIDE3fSwKK3sweDAwMTFBRSwgMTN9LCB7MHgwMDM0NkYsIDE1fSwgezB4MDA4QzNCLCAxNn0sIHsweDAwMzQ2RSwgMTV9LAorezB4MDAwRDFBLCAxM30sIHsweDAwNDYxRiwgMTV9LCB7MHgwNjgyRjgsIDIwfSwgezB4MDExODc1LCAxN30sCit7MHgwMDJCQTEsIDE0fSwgezB4MDA4RDYxLCAxNn0sIHsweDAyMzVGNywgMTh9LCB7MHgwMjMwRTgsIDE4fSwKK3sweDAwMTUxMywgMTN9LCB7MHgwMDhEN0IsIDE2fSwgezB4MDExQUY0LCAxN30sIHsweDAxMUFGNSwgMTd9LAorezB4MDAxMTg1LCAxM30sIHsweDAwNDZCRiwgMTV9LCB7MHgwMDhENjAsIDE2fSwgezB4MDA4RDdDLCAxNn0sCit7MHgwMDE1MTIsIDEzfSwgezB4MDA0NjFDLCAxNX0sIHsweDAwQUU4RCwgMTZ9LCB7MHgwMDhENzgsIDE2fSwKK3sweDAwMEQwRSwgMTN9LCB7MHgwMDM0MTMsIDE1fSwgezB4MDA0NkIxLCAxNX0sIHsweDAwMzQxNiwgMTV9LAorezB4MDAwQUVBLCAxMn0sIHsweDAwMkEyQywgMTR9LCB7MHgwMDU3NDEsIDE1fSwgezB4MDAyQTJGLCAxNH0sCit7MHgwMDAxNTgsICA5fSwgezB4MDAwOEQyLCAxMn0sIHsweDAwMDU0QywgMTF9LCB7MHgwMDA2ODYsIDEyfSwKK3sweDAwMDAwMCwgIDJ9LCB7MHgwMDAwNjksICA4fSwgezB4MDAwMDZCLCAgOH0sIHsweDAwMDY4QywgMTJ9LAorezB4MDAwMDA3LCAgM30sIHsweDAwMDE1RSwgIDl9LCB7MHgwMDAyQTMsIDEwfSwgezB4MDAwQUU5LCAxMn0sCit7MHgwMDAwMDYsICAzfSwgezB4MDAwMjMxLCAxMH0sIHsweDAwMDJCOCwgMTB9LCB7MHgwMDFBMDgsIDE0fSwKK3sweDAwMDAxMCwgIDV9LCB7MHgwMDAxQTksIDEwfSwgezB4MDAwMzQyLCAxMX0sIHsweDAwMEE4OCwgMTJ9LAorezB4MDAwMDA0LCAgNH0sIHsweDAwMDFBMiwgMTB9LCB7MHgwMDAyQTQsIDEwfSwgezB4MDAxMTg0LCAxM30sCit7MHgwMDAwMTIsICA1fSwgezB4MDAwMjMyLCAxMH0sIHsweDAwMDJCMiwgMTB9LCB7MHgwMDA2ODAsIDEyfSwKK3sweDAwMDAxQiwgIDZ9LCB7MHgwMDA0NkEsIDExfSwgezB4MDAwNjhFLCAxMn0sIHsweDAwMjM1OSwgMTR9LAorezB4MDAwMDE2LCAgNX0sIHsweDAwMDE1RiwgIDl9LCB7MHgwMDAyQTAsIDEwfSwgezB4MDAwNTRELCAxMX0sCit7MHgwMDAwMDUsICA0fSwgezB4MDAwMjMzLCAxMH0sIHsweDAwMDJCOSwgMTB9LCB7MHgwMDE1RDYsIDEzfSwKK3sweDAwMDAyMiwgIDZ9LCB7MHgwMDA0NjgsIDExfSwgezB4MDAwNjgzLCAxMn0sIHsweDAwMUEwQSwgMTR9LAorezB4MDAwMDEzLCAgNX0sIHsweDAwMDIzNiwgMTB9LCB7MHgwMDAyQkIsIDEwfSwgezB4MDAxMTg2LCAxM30sCit7MHgwMDAwMTcsICA1fSwgezB4MDAwMUFCLCAxMH0sIHsweDAwMDJBNywgMTB9LCB7MHgwMDA4RDMsIDEyfSwKK3sweDAwMDAxNCwgIDV9LCB7MHgwMDAyMzcsIDEwfSwgezB4MDAwNDYwLCAxMX0sIHsweDAwMEQwRiwgMTN9LAorezB4MDAwMDE5LCAgNn0sIHsweDAwMDFBQSwgMTB9LCB7MHgwMDAyQjMsIDEwfSwgezB4MDAwNjgxLCAxMn0sCit7MHgwMDAwMTgsICA2fSwgezB4MDAwMUE4LCAxMH0sIHsweDAwMDJBNSwgMTB9LCB7MHgwMDA2OEYsIDEyfSwKK3sweDAwMDAwNywgIDR9LCB7MHgwMDAwNTUsICA3fSwgezB4MDAwMDQ3LCAgN30sIHsweDAwMDBBRCwgIDh9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHRhYmxlX21iX25vbl9pbnRyYTRbMTI4XVsyXSA9IHsKK3sweDAwMDBENCwgIDh9LCB7MHgwMDIxQzUsIDE0fSwgezB4MDBGMThBLCAxNn0sIHsweDAwRDVCQywgMTZ9LAorezB4MDAwODc5LCAxMn0sIHsweDAwMzU0RCwgMTR9LCB7MHgwMTBFM0YsIDE3fSwgezB4MDEwRjU0LCAxN30sCit7MHgwMDA4NjYsIDEyfSwgezB4MDAzNTZFLCAxNH0sIHsweDAxMEY1NSwgMTd9LCB7MHgwMTBFM0UsIDE3fSwKK3sweDAwMTBDRSwgMTN9LCB7MHgwMDNDODQsIDE0fSwgezB4MDBENUJELCAxNn0sIHsweDAwRjE4QiwgMTZ9LAorezB4MDAwODY4LCAxMn0sIHsweDAwNDM4QywgMTV9LCB7MHgwMDg3QUIsIDE2fSwgezB4MDA3OTBCLCAxNX0sCit7MHgwMDBGMTAsIDEyfSwgezB4MDA0MzNELCAxNX0sIHsweDAwNkFEMywgMTV9LCB7MHgwMDc5MEEsIDE1fSwKK3sweDAwMUFBNywgMTN9LCB7MHgwMDQzRDQsIDE1fSwgezB4MDA4NzFFLCAxNn0sIHsweDAwNkFERiwgMTV9LAorezB4MDAwRDdDLCAxMn0sIHsweDAwM0M5NCwgMTR9LCB7MHgwMDQzOEQsIDE1fSwgezB4MDA2QUQyLCAxNX0sCit7MHgwMDA2QkMsIDExfSwgezB4MDAyMUU5LCAxNH0sIHsweDAwNkFEQSwgMTV9LCB7MHgwMDZBOTksIDE1fSwKK3sweDAwMTBGNywgMTN9LCB7MHgwMDQzODksIDE1fSwgezB4MDA2QURCLCAxNX0sIHsweDAwNzhDNCwgMTV9LAorezB4MDAwRDU2LCAxMn0sIHsweDAwMzVGNywgMTR9LCB7MHgwMDQzOEUsIDE1fSwgezB4MDA2QTk4LCAxNX0sCit7MHgwMDBENTIsIDEyfSwgezB4MDAzQzk1LCAxNH0sIHsweDAwNDM4OCwgMTV9LCB7MHgwMDQzM0MsIDE1fSwKK3sweDAwMEQ1NCwgMTJ9LCB7MHgwMDFFNEIsIDEzfSwgezB4MDAzQzYzLCAxNH0sIHsweDAwM0M4MywgMTR9LAorezB4MDAwODYxLCAxMn0sIHsweDAwMjFFQiwgMTR9LCB7MHgwMDM1NkMsIDE0fSwgezB4MDAzNUY2LCAxNH0sCit7MHgwMDA4NjMsIDEyfSwgezB4MDAyMTlGLCAxNH0sIHsweDAwMzU2OCwgMTR9LCB7MHgwMDNDODIsIDE0fSwKK3sweDAwMDFBRSwgIDl9LCB7MHgwMDEwQzAsIDEzfSwgezB4MDAwRjExLCAxMn0sIHsweDAwMUFGQSwgMTN9LAorezB4MDAwMDAwLCAgMX0sIHsweDAwMDBGMCwgIDh9LCB7MHgwMDAxQUQsICA5fSwgezB4MDAxMEMxLCAxM30sCit7MHgwMDAwMEEsICA0fSwgezB4MDAwM0M1LCAxMH0sIHsweDAwMDc4OSwgMTF9LCB7MHgwMDFBQjUsIDEzfSwKK3sweDAwMDAwOSwgIDR9LCB7MHgwMDA0MzUsIDExfSwgezB4MDAwNzkzLCAxMX0sIHsweDAwMUU0MCwgMTN9LAorezB4MDAwMDFELCAgNX0sIHsweDAwMDNDQiwgMTB9LCB7MHgwMDA4NzgsIDEyfSwgezB4MDAxQUFGLCAxM30sCit7MHgwMDAwMEIsICA0fSwgezB4MDAwM0M3LCAxMH0sIHsweDAwMDc5MSwgMTF9LCB7MHgwMDFBQUIsIDEzfSwKK3sweDAwMDAxRiwgIDV9LCB7MHgwMDA0MzYsIDExfSwgezB4MDAwNkJGLCAxMX0sIHsweDAwMEYxOSwgMTJ9LAorezB4MDAwMDNELCAgNn0sIHsweDAwMEQ1MSwgMTJ9LCB7MHgwMDEwQzQsIDEzfSwgezB4MDAyMUU4LCAxNH0sCit7MHgwMDAwMzYsICA2fSwgezB4MDAwNDM3LCAxMX0sIHsweDAwMDZBRiwgMTF9LCB7MHgwMDEwQzUsIDEzfSwKK3sweDAwMDAwQywgIDR9LCB7MHgwMDA0MzIsIDExfSwgezB4MDAwNzk0LCAxMX0sIHsweDAwMUUzMCwgMTN9LAorezB4MDAwMDQyLCAgN30sIHsweDAwMDg3MCwgMTJ9LCB7MHgwMDBGMjQsIDEyfSwgezB4MDAxRTQzLCAxM30sCit7MHgwMDAwMjAsICA2fSwgezB4MDAwNDNFLCAxMX0sIHsweDAwMDc5NSwgMTF9LCB7MHgwMDFBQUEsIDEzfSwKK3sweDAwMDAzNywgIDZ9LCB7MHgwMDA2QUMsIDExfSwgezB4MDAwNkFFLCAxMX0sIHsweDAwMTBGNiwgMTN9LAorezB4MDAwMDM0LCAgNn0sIHsweDAwMDQzQSwgMTF9LCB7MHgwMDBENTAsIDEyfSwgezB4MDAxQUFFLCAxM30sCit7MHgwMDAwMzksICA2fSwgezB4MDAwNDNGLCAxMX0sIHsweDAwMDc4RCwgMTF9LCB7MHgwMDEwRDIsIDEzfSwKK3sweDAwMDAzOCwgIDZ9LCB7MHgwMDA0M0IsIDExfSwgezB4MDAwNkJELCAxMX0sIHsweDAwMTBEMywgMTN9LAorezB4MDAwMDExLCAgNX0sIHsweDAwMDFBQywgIDl9LCB7MHgwMDAwRjMsICA4fSwgezB4MDAwNDM5LCAxMX0sCit9OworCitjb25zdCB1aW50MzJfdCAoKiBjb25zdCBmZl93bXYyX2ludGVyX3RhYmxlW1dNVjJfSU5URVJfQ0JQX1RBQkxFX0NPVU5UXSlbMl09eworICAgIHRhYmxlX21iX25vbl9pbnRyYTIsCisgICAgdGFibGVfbWJfbm9uX2ludHJhMywKKyAgICB0YWJsZV9tYl9ub25faW50cmE0LAorICAgIGZmX3RhYmxlX21iX25vbl9pbnRyYSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfd212Ml9zY2FudGFibGVBWzY0XT17CisweDAwLCAweDAxLCAweDAyLCAweDA4LCAweDAzLCAweDA5LCAweDBBLCAweDEwLAorMHgwNCwgMHgwQiwgMHgxMSwgMHgxOCwgMHgxMiwgMHgwQywgMHgwNSwgMHgxMywKKzB4MTksIDB4MEQsIDB4MTQsIDB4MUEsIDB4MUIsIDB4MDYsIDB4MTUsIDB4MUMsCisweDBFLCAweDE2LCAweDFELCAweDA3LCAweDFFLCAweDBGLCAweDE3LCAweDFGLAorfTsKKworY29uc3QgdWludDhfdCBmZl93bXYyX3NjYW50YWJsZUJbNjRdPXsKKzB4MDAsIDB4MDgsIDB4MDEsIDB4MTAsIDB4MDksIDB4MTgsIDB4MTEsIDB4MDIsCisweDIwLCAweDBBLCAweDE5LCAweDI4LCAweDEyLCAweDMwLCAweDIxLCAweDFBLAorMHgzOCwgMHgyOSwgMHgyMiwgMHgwMywgMHgzMSwgMHgzOSwgMHgwQiwgMHgyQSwKKzB4MTMsIDB4MzIsIDB4MUIsIDB4M0EsIDB4MjMsIDB4MkIsIDB4MzMsIDB4M0IsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXNtcGVnNGRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21zbXBlZzRkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhMTBkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21zbXBlZzRkYXRhLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIE1TTVBFRzQgYmFja2VuZCBmb3IgZW5jb2RlciBhbmQgZGVjb2RlcgorICogY29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogY29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBtc21wZWc0djEgJiB2MiBzdHVmZiBieSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNU01QRUc0IGRhdGEgdGFibGVzLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NU01QRUc0REFUQV9ICisjZGVmaW5lIEFWQ09ERUNfTVNNUEVHNERBVEFfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAicmwuaCIKKworLyogbW90aW9uIHZlY3RvciB0YWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QgTVZUYWJsZSB7CisgICAgaW50IG47CisgICAgY29uc3QgdWludDE2X3QgKnRhYmxlX212X2NvZGU7CisgICAgY29uc3QgdWludDhfdCAqdGFibGVfbXZfYml0czsKKyAgICBjb25zdCB1aW50OF90ICp0YWJsZV9tdng7CisgICAgY29uc3QgdWludDhfdCAqdGFibGVfbXZ5OworICAgIHVpbnQxNl90ICp0YWJsZV9tdl9pbmRleDsgLyogZW5jb2Rpbmc6IGNvbnZlcnQgbXYgdG8gaW5kZXggaW4gdGFibGVfbXYgKi8KKyAgICBWTEMgdmxjOyAgICAgICAgICAgICAgICAvKiBkZWNvZGluZzogdmxjICovCit9IE1WVGFibGU7CisKK2V4dGVybiBWTEMgZmZfbXNtcDRfbWJfaV92bGM7CitleHRlcm4gVkxDIGZmX21zbXA0X2RjX2x1bWFfdmxjWzJdOworZXh0ZXJuIFZMQyBmZl9tc21wNF9kY19jaHJvbWFfdmxjWzJdOworCisvKiBpbnRyYSBwaWN0dXJlIG1hY3JvYmxvY2sgY29kZWQgYmxvY2sgcGF0dGVybiAqLworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX21zbXA0X21iX2lfdGFibGVbNjRdWzJdOworCisjZGVmaW5lIFdNVjFfU0NBTlRBQkxFX0NPVU5UIDQKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfd212MV9zY2FudGFibGVbV01WMV9TQ0FOVEFCTEVfQ09VTlRdWzY0XTsKKworI2RlZmluZSBOQl9STF9UQUJMRVMgIDYKKworZXh0ZXJuIFJMVGFibGUgZmZfcmxfdGFibGVbTkJfUkxfVEFCTEVTXTsKK2V4dGVybiB1aW50OF90IGZmX3N0YXRpY19ybF90YWJsZV9zdG9yZVtOQl9STF9UQUJMRVNdWzJdWzIgKiBNQVhfUlVOICsgTUFYX0xFVkVMICsgM107CisKK2V4dGVybiB1aW50MzJfdCBmZl92Ml9kY19sdW1fdGFibGVbNTEyXVsyXTsKK2V4dGVybiB1aW50MzJfdCBmZl92Ml9kY19jaHJvbWFfdGFibGVbNTEyXVsyXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfd212MV95X2RjX3NjYWxlX3RhYmxlWzMyXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3dtdjFfY19kY19zY2FsZV90YWJsZVszMl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9vbGRfZmZfeV9kY19zY2FsZV90YWJsZVszMl07CisKK2V4dGVybiBNVlRhYmxlIGZmX212X3RhYmxlc1syXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdjJfbWJfdHlwZVs4XVsyXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3YyX2ludHJhX2NicGNbNF1bMl07CisKK2V4dGVybiBjb25zdCB1aW50MzJfdCBmZl90YWJsZV9tYl9ub25faW50cmFbMTI4XVsyXTsKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl90YWJsZV9pbnRlcl9pbnRyYVs0XVsyXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGZmX3RhYmxlMF9kY19sdW1bMTIwXVsyXTsKK2V4dGVybiBjb25zdCB1aW50MzJfdCBmZl90YWJsZTFfZGNfbHVtWzEyMF1bMl07CitleHRlcm4gY29uc3QgdWludDMyX3QgZmZfdGFibGUwX2RjX2Nocm9tYVsxMjBdWzJdOworZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGZmX3RhYmxlMV9kY19jaHJvbWFbMTIwXVsyXTsKKworI2RlZmluZSBXTVYyX0lOVEVSX0NCUF9UQUJMRV9DT1VOVCA0CitleHRlcm4gY29uc3QgdWludDMyX3QgKCogY29uc3QgZmZfd212Ml9pbnRlcl90YWJsZVtXTVYyX0lOVEVSX0NCUF9UQUJMRV9DT1VOVF0pWzJdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl93bXYyX3NjYW50YWJsZUFbNjRdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfd212Ml9zY2FudGFibGVCWzY0XTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTVNNUEVHNERBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXNtcGVnNGRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNtcGVnNGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZWEzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tc21wZWc0ZGVjLmMKQEAgLTAsMCArMSw5ODAgQEAKKy8qCisgKiBNU01QRUc0IGJhY2tlbmQgZm9yIGVuY29kZXIgYW5kIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDEzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogbXNtcGVnNHYxICYgdjIgc3R1ZmYgYnkgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJtc21wZWc0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJoMjYzLmgiCisjaW5jbHVkZSAibXBlZzR2aWRlby5oIgorI2luY2x1ZGUgIm1zbXBlZzRkYXRhLmgiCisjaW5jbHVkZSAidmMxZGF0YS5oIgorCisjZGVmaW5lIERDX1ZMQ19CSVRTIDkKKyNkZWZpbmUgVjJfSU5UUkFfQ0JQQ19WTENfQklUUyAzCisjZGVmaW5lIFYyX01CX1RZUEVfVkxDX0JJVFMgNworI2RlZmluZSBNVl9WTENfQklUUyA5CisjZGVmaW5lIFYyX01WX1ZMQ19CSVRTIDkKKyNkZWZpbmUgVEVYX1ZMQ19CSVRTIDkKKworI2RlZmluZSBERUZBVUxUX0lOVEVSX0lOREVYIDMKKworc3RhdGljIGlubGluZSBpbnQgbXNtcGVnNHYxX3ByZWRfZGMoTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKipkY192YWxfcHRyKQoreworICAgIGludCBpOworCisgICAgaWYgKG4gPCA0KSB7CisgICAgICAgIGk9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaT0gbi0zOworICAgIH0KKworICAgICpkY192YWxfcHRyPSAmcy0+bGFzdF9kY1tpXTsKKyAgICByZXR1cm4gcy0+bGFzdF9kY1tpXTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkZWNvZGluZyBzdHVmZiAqLworCitWTEMgZmZfbWJfbm9uX2ludHJhX3ZsY1s0XTsKK3N0YXRpYyBWTEMgdjJfZGNfbHVtX3ZsYzsKK3N0YXRpYyBWTEMgdjJfZGNfY2hyb21hX3ZsYzsKK3N0YXRpYyBWTEMgdjJfaW50cmFfY2JwY192bGM7CitzdGF0aWMgVkxDIHYyX21iX3R5cGVfdmxjOworc3RhdGljIFZMQyB2Ml9tdl92bGM7CitWTEMgZmZfaW50ZXJfaW50cmFfdmxjOworCisvKiBUaGlzIGlzIGlkZW50aWNhbCB0byBoMjYzIGV4Y2VwdCB0aGF0IGl0cyByYW5nZSBpcyBtdWx0aXBsaWVkIGJ5IDIuICovCitzdGF0aWMgaW50IG1zbXBlZzR2Ml9kZWNvZGVfbW90aW9uKE1wZWdFbmNDb250ZXh0ICogcywgaW50IHByZWQsIGludCBmX2NvZGUpCit7CisgICAgaW50IGNvZGUsIHZhbCwgc2lnbiwgc2hpZnQ7CisKKyAgICBjb2RlID0gZ2V0X3ZsYzIoJnMtPmdiLCB2Ml9tdl92bGMudGFibGUsIFYyX01WX1ZMQ19CSVRTLCAyKTsKKyAgICBhdl9kbG9nKHMsICJNViBjb2RlICVkIGF0ICVkICVkIHByZWQ6ICVkXG4iLCBjb2RlLCBzLT5tYl94LHMtPm1iX3ksIHByZWQpOworICAgIGlmIChjb2RlIDwgMCkKKyAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKworICAgIGlmIChjb2RlID09IDApCisgICAgICAgIHJldHVybiBwcmVkOworICAgIHNpZ24gPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICBzaGlmdCA9IGZfY29kZSAtIDE7CisgICAgdmFsID0gY29kZTsKKyAgICBpZiAoc2hpZnQpIHsKKyAgICAgICAgdmFsID0gKHZhbCAtIDEpIDw8IHNoaWZ0OworICAgICAgICB2YWwgfD0gZ2V0X2JpdHMoJnMtPmdiLCBzaGlmdCk7CisgICAgICAgIHZhbCsrOworICAgIH0KKyAgICBpZiAoc2lnbikKKyAgICAgICAgdmFsID0gLXZhbDsKKworICAgIHZhbCArPSBwcmVkOworICAgIGlmICh2YWwgPD0gLTY0KQorICAgICAgICB2YWwgKz0gNjQ7CisgICAgZWxzZSBpZiAodmFsID49IDY0KQorICAgICAgICB2YWwgLT0gNjQ7CisKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IG1zbXBlZzR2MTJfZGVjb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzZdWzY0XSkKK3sKKyAgICBpbnQgY2JwLCBjb2RlLCBpOworICAgIHVpbnQzMl90ICogY29uc3QgbWJfdHlwZV9wdHIgPSAmcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbcy0+bWJfeCArIHMtPm1iX3kqcy0+bWJfc3RyaWRlXTsKKworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApIHsKKyAgICAgICAgaWYgKHMtPnVzZV9za2lwX21iX2NvZGUpIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgIC8qIHNraXAgbWIgKi8KKyAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYSA9IDA7CisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPDY7aSsrKQorICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4W2ldID0gLTE7CisgICAgICAgICAgICAgICAgcy0+bXZfZGlyID0gTVZfRElSX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgcy0+bXZfdHlwZSA9IE1WX1RZUEVfMTZYMTY7CisgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSAwOworICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdID0gMDsKKyAgICAgICAgICAgICAgICBzLT5tYl9za2lwcGVkID0gMTsKKyAgICAgICAgICAgICAgICAqbWJfdHlwZV9wdHIgPSBNQl9UWVBFX1NLSVAgfCBNQl9UWVBFX0wwIHwgTUJfVFlQRV8xNngxNjsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj09MikKKyAgICAgICAgICAgIGNvZGUgPSBnZXRfdmxjMigmcy0+Z2IsIHYyX21iX3R5cGVfdmxjLnRhYmxlLCBWMl9NQl9UWVBFX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29kZSA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19pbnRlcl9NQ0JQQ192bGMudGFibGUsIElOVEVSX01DQlBDX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgaWYoY29kZTwwIHx8IGNvZGU+Nyl7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNicGMgJWQgaW52YWxpZCBhdCAlZCAlZFxuIiwgY29kZSwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzLT5tYl9pbnRyYSA9IGNvZGUgPj4yOworCisgICAgICAgIGNicCA9IGNvZGUgJiAweDM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bWJfaW50cmEgPSAxOworICAgICAgICBpZihzLT5tc21wZWc0X3ZlcnNpb249PTIpCisgICAgICAgICAgICBjYnA9IGdldF92bGMyKCZzLT5nYiwgdjJfaW50cmFfY2JwY192bGMudGFibGUsIFYyX0lOVFJBX0NCUENfVkxDX0JJVFMsIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjYnA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19pbnRyYV9NQ0JQQ192bGMudGFibGUsIElOVFJBX01DQlBDX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgaWYoY2JwPDAgfHwgY2JwPjMpeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjYnBjICVkIGludmFsaWQgYXQgJWQgJWRcbiIsIGNicCwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXMtPm1iX2ludHJhKSB7CisgICAgICAgIGludCBteCwgbXksIGNicHk7CisKKyAgICAgICAgY2JweT0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9oMjYzX2NicHlfdmxjLnRhYmxlLCBDQlBZX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgaWYoY2JweTwwKXsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2JweSAlZCBpbnZhbGlkIGF0ICVkICVkXG4iLCBjYnAsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgY2JwfD0gY2JweTw8MjsKKyAgICAgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uPT0xIHx8IChjYnAmMykgIT0gMykgY2JwXj0gMHgzQzsKKworICAgICAgICBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIDAsIDAsICZteCwgJm15KTsKKyAgICAgICAgbXg9IG1zbXBlZzR2Ml9kZWNvZGVfbW90aW9uKHMsIG14LCAxKTsKKyAgICAgICAgbXk9IG1zbXBlZzR2Ml9kZWNvZGVfbW90aW9uKHMsIG15LCAxKTsKKworICAgICAgICBzLT5tdl9kaXIgPSBNVl9ESVJfRk9SV0FSRDsKKyAgICAgICAgcy0+bXZfdHlwZSA9IE1WX1RZUEVfMTZYMTY7CisgICAgICAgIHMtPm12WzBdWzBdWzBdID0gbXg7CisgICAgICAgIHMtPm12WzBdWzBdWzFdID0gbXk7CisgICAgICAgICptYl90eXBlX3B0ciA9IE1CX1RZUEVfTDAgfCBNQl9UWVBFXzE2eDE2OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj09Mil7CisgICAgICAgICAgICBzLT5hY19wcmVkID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBjYnB8PSBnZXRfdmxjMigmcy0+Z2IsIGZmX2gyNjNfY2JweV92bGMudGFibGUsIENCUFlfVkxDX0JJVFMsIDEpPDwyOyAvL0ZJWE1FIGNoZWNrIGVycm9ycworICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICBzLT5hY19wcmVkID0gMDsKKyAgICAgICAgICAgIGNicHw9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19jYnB5X3ZsYy50YWJsZSwgQ0JQWV9WTENfQklUUywgMSk8PDI7IC8vRklYTUUgY2hlY2sgZXJyb3JzCisgICAgICAgICAgICBpZihzLT5waWN0X3R5cGU9PUFWX1BJQ1RVUkVfVFlQRV9QKSBjYnBePTB4M0M7CisgICAgICAgIH0KKyAgICAgICAgKm1iX3R5cGVfcHRyID0gTUJfVFlQRV9JTlRSQTsKKyAgICB9CisKKyAgICBzLT5iZHNwLmNsZWFyX2Jsb2NrcyhzLT5ibG9ja1swXSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICBpZiAoZmZfbXNtcGVnNF9kZWNvZGVfYmxvY2socywgYmxvY2tbaV0sIGksIChjYnAgPj4gKDUgLSBpKSkgJiAxLCBOVUxMKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlxuZXJyb3Igd2hpbGUgZGVjb2RpbmcgYmxvY2s6ICVkIHggJWQgKCVkKVxuIiwgcy0+bWJfeCwgcy0+bWJfeSwgaSk7CisgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbXBlZzR2MzRfZGVjb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzZdWzY0XSkKK3sKKyAgICBpbnQgY2JwLCBjb2RlLCBpOworICAgIHVpbnQ4X3QgKmNvZGVkX3ZhbDsKKyAgICB1aW50MzJfdCAqIGNvbnN0IG1iX3R5cGVfcHRyID0gJnMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3MtPm1iX3ggKyBzLT5tYl95KnMtPm1iX3N0cmlkZV07CisKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB7CisgICAgICAgIGlmIChzLT51c2Vfc2tpcF9tYl9jb2RlKSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgICAgICAgICAvKiBza2lwIG1iICovCisgICAgICAgICAgICAgICAgcy0+bWJfaW50cmEgPSAwOworICAgICAgICAgICAgICAgIGZvcihpPTA7aTw2O2krKykKKyAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9IC0xOworICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICAgICAgICAgIHMtPm12X3R5cGUgPSBNVl9UWVBFXzE2WDE2OworICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzBdID0gMDsKKyAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgcy0+bWJfc2tpcHBlZCA9IDE7CisgICAgICAgICAgICAgICAgKm1iX3R5cGVfcHRyID0gTUJfVFlQRV9TS0lQIHwgTUJfVFlQRV9MMCB8IE1CX1RZUEVfMTZ4MTY7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvZGUgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX21iX25vbl9pbnRyYV92bGNbREVGQVVMVF9JTlRFUl9JTkRFWF0udGFibGUsIE1CX05PTl9JTlRSQV9WTENfQklUUywgMyk7CisgICAgICAgIGlmIChjb2RlIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgLy9zLT5tYl9pbnRyYSA9IChjb2RlICYgMHg0MCkgPyAwIDogMTsKKyAgICAgICAgcy0+bWJfaW50cmEgPSAofmNvZGUgJiAweDQwKSA+PiA2OworCisgICAgICAgIGNicCA9IGNvZGUgJiAweDNmOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPm1iX2ludHJhID0gMTsKKyAgICAgICAgY29kZSA9IGdldF92bGMyKCZzLT5nYiwgZmZfbXNtcDRfbWJfaV92bGMudGFibGUsIE1CX0lOVFJBX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgaWYgKGNvZGUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAvKiBwcmVkaWN0IGNvZGVkIGJsb2NrIHBhdHRlcm4gKi8KKyAgICAgICAgY2JwID0gMDsKKyAgICAgICAgZm9yKGk9MDtpPDY7aSsrKSB7CisgICAgICAgICAgICBpbnQgdmFsID0gKChjb2RlID4+ICg1IC0gaSkpICYgMSk7CisgICAgICAgICAgICBpZiAoaSA8IDQpIHsKKyAgICAgICAgICAgICAgICBpbnQgcHJlZCA9IGZmX21zbXBlZzRfY29kZWRfYmxvY2tfcHJlZChzLCBpLCAmY29kZWRfdmFsKTsKKyAgICAgICAgICAgICAgICB2YWwgPSB2YWwgXiBwcmVkOworICAgICAgICAgICAgICAgICpjb2RlZF92YWwgPSB2YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYnAgfD0gdmFsIDw8ICg1IC0gaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXMtPm1iX2ludHJhKSB7CisgICAgICAgIGludCBteCwgbXk7CisgICAgICAgIGlmKHMtPnBlcl9tYl9ybF90YWJsZSAmJiBjYnApeworICAgICAgICAgICAgcy0+cmxfdGFibGVfaW5kZXggPSBkZWNvZGUwMTIoJnMtPmdiKTsKKyAgICAgICAgICAgIHMtPnJsX2Nocm9tYV90YWJsZV9pbmRleCA9IHMtPnJsX3RhYmxlX2luZGV4OworICAgICAgICB9CisgICAgICAgIGZmX2gyNjNfcHJlZF9tb3Rpb24ocywgMCwgMCwgJm14LCAmbXkpOworICAgICAgICBpZiAoZmZfbXNtcGVnNF9kZWNvZGVfbW90aW9uKHMsICZteCwgJm15KSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV8xNlgxNjsKKyAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSBteDsKKyAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSBteTsKKyAgICAgICAgKm1iX3R5cGVfcHRyID0gTUJfVFlQRV9MMCB8IE1CX1RZUEVfMTZ4MTY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfZGxvZyhzLCAiSSBhdCAlZCAlZCAlZCAlMDZYXG4iLCBzLT5tYl94LCBzLT5tYl95LAorICAgICAgICAgICAgICAgICgoY2JwICYgMykgPyAxIDogMCkgKygoY2JwICYgMHgzQyk/IDIgOiAwKSwKKyAgICAgICAgICAgICAgICBzaG93X2JpdHMoJnMtPmdiLCAyNCkpOworICAgICAgICBzLT5hY19wcmVkID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICptYl90eXBlX3B0ciA9IE1CX1RZUEVfSU5UUkE7CisgICAgICAgIGlmKHMtPmludGVyX2ludHJhX3ByZWQpeworICAgICAgICAgICAgcy0+aDI2M19haWNfZGlyPSBnZXRfdmxjMigmcy0+Z2IsIGZmX2ludGVyX2ludHJhX3ZsYy50YWJsZSwgSU5URVJfSU5UUkFfVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgYXZfZGxvZyhzLCAiJWQlZCAlZCAlZC8iLAorICAgICAgICAgICAgICAgICAgICBzLT5hY19wcmVkLCBzLT5oMjYzX2FpY19kaXIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICB9CisgICAgICAgIGlmKHMtPnBlcl9tYl9ybF90YWJsZSAmJiBjYnApeworICAgICAgICAgICAgcy0+cmxfdGFibGVfaW5kZXggPSBkZWNvZGUwMTIoJnMtPmdiKTsKKyAgICAgICAgICAgIHMtPnJsX2Nocm9tYV90YWJsZV9pbmRleCA9IHMtPnJsX3RhYmxlX2luZGV4OworICAgICAgICB9CisgICAgfQorCisgICAgcy0+YmRzcC5jbGVhcl9ibG9ja3Mocy0+YmxvY2tbMF0pOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgaWYgKGZmX21zbXBlZzRfZGVjb2RlX2Jsb2NrKHMsIGJsb2NrW2ldLCBpLCAoY2JwID4+ICg1IC0gaSkpICYgMSwgTlVMTCkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlxuZXJyb3Igd2hpbGUgZGVjb2RpbmcgYmxvY2s6ICVkIHggJWQgKCVkKVxuIiwgcy0+bWJfeCwgcy0+bWJfeSwgaSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogaW5pdCBhbGwgdmxjIGRlY29kaW5nIHRhYmxlcyAqLworYXZfY29sZCBpbnQgZmZfbXNtcGVnNF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQgZG9uZSA9IDA7CisgICAgaW50IGksIHJldDsKKyAgICBNVlRhYmxlICptdjsKKworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIDAsIGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGZmX2gyNjNfZGVjb2RlX2luaXQoYXZjdHgpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZmZfbXNtcGVnNF9jb21tb25faW5pdChzKTsKKworICAgIGlmICghZG9uZSkgeworICAgICAgICBmb3IoaT0wO2k8TkJfUkxfVEFCTEVTO2krKykgeworICAgICAgICAgICAgZmZfaW5pdF9ybCgmZmZfcmxfdGFibGVbaV0sIGZmX3N0YXRpY19ybF90YWJsZV9zdG9yZVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgSU5JVF9WTENfUkwoZmZfcmxfdGFibGVbMF0sIDY0Mik7CisgICAgICAgIElOSVRfVkxDX1JMKGZmX3JsX3RhYmxlWzFdLCAxMTA0KTsKKyAgICAgICAgSU5JVF9WTENfUkwoZmZfcmxfdGFibGVbMl0sIDU1NCk7CisgICAgICAgIElOSVRfVkxDX1JMKGZmX3JsX3RhYmxlWzNdLCA5NDApOworICAgICAgICBJTklUX1ZMQ19STChmZl9ybF90YWJsZVs0XSwgOTYyKTsKKyAgICAgICAgSU5JVF9WTENfUkwoZmZfcmxfdGFibGVbNV0sIDU1NCk7CisKKyAgICAgICAgbXYgPSAmZmZfbXZfdGFibGVzWzBdOworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJm12LT52bGMsIE1WX1ZMQ19CSVRTLCBtdi0+biArIDEsCisgICAgICAgICAgICAgICAgICAgIG12LT50YWJsZV9tdl9iaXRzLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICBtdi0+dGFibGVfbXZfY29kZSwgMiwgMiwgMzcxNCk7CisgICAgICAgIG12ID0gJmZmX212X3RhYmxlc1sxXTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZtdi0+dmxjLCBNVl9WTENfQklUUywgbXYtPm4gKyAxLAorICAgICAgICAgICAgICAgICAgICBtdi0+dGFibGVfbXZfYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgbXYtPnRhYmxlX212X2NvZGUsIDIsIDIsIDI2OTQpOworCisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmZmZfbXNtcDRfZGNfbHVtYV92bGNbMF0sIERDX1ZMQ19CSVRTLCAxMjAsCisgICAgICAgICAgICAgICAgICZmZl90YWJsZTBfZGNfbHVtWzBdWzFdLCA4LCA0LAorICAgICAgICAgICAgICAgICAmZmZfdGFibGUwX2RjX2x1bVswXVswXSwgOCwgNCwgMTE1OCk7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmZmZfbXNtcDRfZGNfY2hyb21hX3ZsY1swXSwgRENfVkxDX0JJVFMsIDEyMCwKKyAgICAgICAgICAgICAgICAgJmZmX3RhYmxlMF9kY19jaHJvbWFbMF1bMV0sIDgsIDQsCisgICAgICAgICAgICAgICAgICZmZl90YWJsZTBfZGNfY2hyb21hWzBdWzBdLCA4LCA0LCAxMTE4KTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZmZl9tc21wNF9kY19sdW1hX3ZsY1sxXSwgRENfVkxDX0JJVFMsIDEyMCwKKyAgICAgICAgICAgICAgICAgJmZmX3RhYmxlMV9kY19sdW1bMF1bMV0sIDgsIDQsCisgICAgICAgICAgICAgICAgICZmZl90YWJsZTFfZGNfbHVtWzBdWzBdLCA4LCA0LCAxNDc2KTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZmZl9tc21wNF9kY19jaHJvbWFfdmxjWzFdLCBEQ19WTENfQklUUywgMTIwLAorICAgICAgICAgICAgICAgICAmZmZfdGFibGUxX2RjX2Nocm9tYVswXVsxXSwgOCwgNCwKKyAgICAgICAgICAgICAgICAgJmZmX3RhYmxlMV9kY19jaHJvbWFbMF1bMF0sIDgsIDQsIDEyMTYpOworCisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmdjJfZGNfbHVtX3ZsYywgRENfVkxDX0JJVFMsIDUxMiwKKyAgICAgICAgICAgICAgICAgJmZmX3YyX2RjX2x1bV90YWJsZVswXVsxXSwgOCwgNCwKKyAgICAgICAgICAgICAgICAgJmZmX3YyX2RjX2x1bV90YWJsZVswXVswXSwgOCwgNCwgMTQ3Mik7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmdjJfZGNfY2hyb21hX3ZsYywgRENfVkxDX0JJVFMsIDUxMiwKKyAgICAgICAgICAgICAgICAgJmZmX3YyX2RjX2Nocm9tYV90YWJsZVswXVsxXSwgOCwgNCwKKyAgICAgICAgICAgICAgICAgJmZmX3YyX2RjX2Nocm9tYV90YWJsZVswXVswXSwgOCwgNCwgMTUwNik7CisKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZ2Ml9pbnRyYV9jYnBjX3ZsYywgVjJfSU5UUkFfQ0JQQ19WTENfQklUUywgNCwKKyAgICAgICAgICAgICAgICAgJmZmX3YyX2ludHJhX2NicGNbMF1bMV0sIDIsIDEsCisgICAgICAgICAgICAgICAgICZmZl92Ml9pbnRyYV9jYnBjWzBdWzBdLCAyLCAxLCA4KTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZ2Ml9tYl90eXBlX3ZsYywgVjJfTUJfVFlQRV9WTENfQklUUywgOCwKKyAgICAgICAgICAgICAgICAgJmZmX3YyX21iX3R5cGVbMF1bMV0sIDIsIDEsCisgICAgICAgICAgICAgICAgICZmZl92Ml9tYl90eXBlWzBdWzBdLCAyLCAxLCAxMjgpOworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJnYyX212X3ZsYywgVjJfTVZfVkxDX0JJVFMsIDMzLAorICAgICAgICAgICAgICAgICAmZmZfbXZ0YWJbMF1bMV0sIDIsIDEsCisgICAgICAgICAgICAgICAgICZmZl9tdnRhYlswXVswXSwgMiwgMSwgNTM4KTsKKworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmZmX21iX25vbl9pbnRyYV92bGNbMF0sIE1CX05PTl9JTlRSQV9WTENfQklUUywgMTI4LAorICAgICAgICAgICAgICAgICAgICAgJmZmX3dtdjJfaW50ZXJfdGFibGVbMF1bMF1bMV0sIDgsIDQsCisgICAgICAgICAgICAgICAgICAgICAmZmZfd212Ml9pbnRlcl90YWJsZVswXVswXVswXSwgOCwgNCwgMTYzNik7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmZmZfbWJfbm9uX2ludHJhX3ZsY1sxXSwgTUJfTk9OX0lOVFJBX1ZMQ19CSVRTLCAxMjgsCisgICAgICAgICAgICAgICAgICAgICAmZmZfd212Ml9pbnRlcl90YWJsZVsxXVswXVsxXSwgOCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICZmZl93bXYyX2ludGVyX3RhYmxlWzFdWzBdWzBdLCA4LCA0LCAyNjQ4KTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZmZl9tYl9ub25faW50cmFfdmxjWzJdLCBNQl9OT05fSU5UUkFfVkxDX0JJVFMsIDEyOCwKKyAgICAgICAgICAgICAgICAgICAgICZmZl93bXYyX2ludGVyX3RhYmxlWzJdWzBdWzFdLCA4LCA0LAorICAgICAgICAgICAgICAgICAgICAgJmZmX3dtdjJfaW50ZXJfdGFibGVbMl1bMF1bMF0sIDgsIDQsIDE1MzIpOworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmZmX21iX25vbl9pbnRyYV92bGNbM10sIE1CX05PTl9JTlRSQV9WTENfQklUUywgMTI4LAorICAgICAgICAgICAgICAgICAgICAgJmZmX3dtdjJfaW50ZXJfdGFibGVbM11bMF1bMV0sIDgsIDQsCisgICAgICAgICAgICAgICAgICAgICAmZmZfd212Ml9pbnRlcl90YWJsZVszXVswXVswXSwgOCwgNCwgMjQ4OCk7CisKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZmZl9tc21wNF9tYl9pX3ZsYywgTUJfSU5UUkFfVkxDX0JJVFMsIDY0LAorICAgICAgICAgICAgICAgICAmZmZfbXNtcDRfbWJfaV90YWJsZVswXVsxXSwgNCwgMiwKKyAgICAgICAgICAgICAgICAgJmZmX21zbXA0X21iX2lfdGFibGVbMF1bMF0sIDQsIDIsIDUzNik7CisKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZmZl9pbnRlcl9pbnRyYV92bGMsIElOVEVSX0lOVFJBX1ZMQ19CSVRTLCA0LAorICAgICAgICAgICAgICAgICAmZmZfdGFibGVfaW50ZXJfaW50cmFbMF1bMV0sIDIsIDEsCisgICAgICAgICAgICAgICAgICZmZl90YWJsZV9pbnRlcl9pbnRyYVswXVswXSwgMiwgMSwgOCk7CisgICAgICAgIGRvbmUgPSAxOworICAgIH0KKworICAgIHN3aXRjaChzLT5tc21wZWc0X3ZlcnNpb24peworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgICAgIHMtPmRlY29kZV9tYj0gbXNtcGVnNHYxMl9kZWNvZGVfbWI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICBjYXNlIDQ6CisgICAgICAgIHMtPmRlY29kZV9tYj0gbXNtcGVnNHYzNF9kZWNvZGVfbWI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgaWYgKENPTkZJR19XTVYyX0RFQ09ERVIpCisgICAgICAgICAgICBzLT5kZWNvZGVfbWI9IGZmX3dtdjJfZGVjb2RlX21iOworICAgIGNhc2UgNjoKKyAgICAgICAgLy9GSVhNRSArIFRPRE8gVkMxIGRlY29kZSBtYgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzLT5zbGljZV9oZWlnaHQ9IHMtPm1iX2hlaWdodDsgLy90byBhdm9pZCAxLzAgaWYgdGhlIGZpcnN0IGZyYW1lIGlzIG5vdCBhIGtleWZyYW1lCisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX21zbXBlZzRfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICogcykKK3sKKyAgICBpbnQgY29kZTsKKworICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj09MSl7CisgICAgICAgIGludCBzdGFydF9jb2RlID0gZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIDMyKTsKKyAgICAgICAgaWYoc3RhcnRfY29kZSE9MHgwMDAwMDEwMCl7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc3RhcnRjb2RlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDUpOyAvLyBmcmFtZSBudW1iZXIgKi8KKyAgICB9CisKKyAgICBzLT5waWN0X3R5cGUgPSBnZXRfYml0cygmcy0+Z2IsIDIpICsgMTsKKyAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JICYmCisgICAgICAgIHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfUCl7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBwaWN0dXJlIHR5cGVcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorI2lmIDAKK3sKKyAgICBzdGF0aWMgaW50IGhhZF9pPTA7CisgICAgaWYocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSBoYWRfaT0xOworICAgIGlmKCFoYWRfaSkgcmV0dXJuIC0xOworfQorI2VuZGlmCisgICAgcy0+Y2hyb21hX3FzY2FsZT0gcy0+cXNjYWxlID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKKyAgICBpZihzLT5xc2NhbGU9PTApeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgcXNjYWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgY29kZSA9IGdldF9iaXRzKCZzLT5nYiwgNSk7CisgICAgICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj09MSl7CisgICAgICAgICAgICBpZihjb2RlPT0wIHx8IGNvZGU+cy0+bWJfaGVpZ2h0KXsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc2xpY2UgaGVpZ2h0ICVkXG4iLCBjb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHMtPnNsaWNlX2hlaWdodCA9IGNvZGU7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogMHgxNzogb25lIHNsaWNlLCAweDE4OiB0d28gc2xpY2VzLCAuLi4gKi8KKyAgICAgICAgICAgIGlmIChjb2RlIDwgMHgxNyl7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciwgc2xpY2UgY29kZSB3YXMgJVhcbiIsIGNvZGUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+c2xpY2VfaGVpZ2h0ID0gcy0+bWJfaGVpZ2h0IC8gKGNvZGUgLSAweDE2KTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChzLT5tc21wZWc0X3ZlcnNpb24peworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHMtPnJsX2Nocm9tYV90YWJsZV9pbmRleCA9IDI7CisgICAgICAgICAgICBzLT5ybF90YWJsZV9pbmRleCA9IDI7CisKKyAgICAgICAgICAgIHMtPmRjX3RhYmxlX2luZGV4ID0gMDsgLy9ub3QgdXNlZAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHMtPnJsX2Nocm9tYV90YWJsZV9pbmRleCA9IGRlY29kZTAxMigmcy0+Z2IpOworICAgICAgICAgICAgcy0+cmxfdGFibGVfaW5kZXggPSBkZWNvZGUwMTIoJnMtPmdiKTsKKworICAgICAgICAgICAgcy0+ZGNfdGFibGVfaW5kZXggPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBmZl9tc21wZWc0X2RlY29kZV9leHRfaGVhZGVyKHMsICgyKzUrNSsxNys3KS84KTsKKworICAgICAgICAgICAgaWYocy0+Yml0X3JhdGUgPiBNQkFDX0JJVFJBVEUpIHMtPnBlcl9tYl9ybF90YWJsZT0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVyX21iX3JsX3RhYmxlPSAwOworCisgICAgICAgICAgICBpZighcy0+cGVyX21iX3JsX3RhYmxlKXsKKyAgICAgICAgICAgICAgICBzLT5ybF9jaHJvbWFfdGFibGVfaW5kZXggPSBkZWNvZGUwMTIoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBzLT5ybF90YWJsZV9pbmRleCA9IGRlY29kZTAxMigmcy0+Z2IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5kY190YWJsZV9pbmRleCA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgcy0+aW50ZXJfaW50cmFfcHJlZD0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMtPm5vX3JvdW5kaW5nID0gMTsKKyAgICAgICAgaWYocy0+YXZjdHgtPmRlYnVnJkZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicXNjYWxlOiVkIHJsYzolZCBybDolZCBkYzolZCBtYnJsOiVkIHNsaWNlOiVkICAgXG4iLAorICAgICAgICAgICAgICAgIHMtPnFzY2FsZSwKKyAgICAgICAgICAgICAgICBzLT5ybF9jaHJvbWFfdGFibGVfaW5kZXgsCisgICAgICAgICAgICAgICAgcy0+cmxfdGFibGVfaW5kZXgsCisgICAgICAgICAgICAgICAgcy0+ZGNfdGFibGVfaW5kZXgsCisgICAgICAgICAgICAgICAgcy0+cGVyX21iX3JsX3RhYmxlLAorICAgICAgICAgICAgICAgIHMtPnNsaWNlX2hlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoKHMtPm1zbXBlZzRfdmVyc2lvbil7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uPT0xKQorICAgICAgICAgICAgICAgIHMtPnVzZV9za2lwX21iX2NvZGUgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHMtPnVzZV9za2lwX21iX2NvZGUgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgIHMtPnJsX3RhYmxlX2luZGV4ID0gMjsKKyAgICAgICAgICAgIHMtPnJsX2Nocm9tYV90YWJsZV9pbmRleCA9IHMtPnJsX3RhYmxlX2luZGV4OworICAgICAgICAgICAgcy0+ZGNfdGFibGVfaW5kZXggPSAwOyAvL25vdCB1c2VkCisgICAgICAgICAgICBzLT5tdl90YWJsZV9pbmRleCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcy0+dXNlX3NraXBfbWJfY29kZSA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgcy0+cmxfdGFibGVfaW5kZXggPSBkZWNvZGUwMTIoJnMtPmdiKTsKKyAgICAgICAgICAgIHMtPnJsX2Nocm9tYV90YWJsZV9pbmRleCA9IHMtPnJsX3RhYmxlX2luZGV4OworCisgICAgICAgICAgICBzLT5kY190YWJsZV9pbmRleCA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgICAgICAgICBzLT5tdl90YWJsZV9pbmRleCA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHMtPnVzZV9za2lwX21iX2NvZGUgPSBnZXRfYml0czEoJnMtPmdiKTsKKworICAgICAgICAgICAgaWYocy0+Yml0X3JhdGUgPiBNQkFDX0JJVFJBVEUpIHMtPnBlcl9tYl9ybF90YWJsZT0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVyX21iX3JsX3RhYmxlPSAwOworCisgICAgICAgICAgICBpZighcy0+cGVyX21iX3JsX3RhYmxlKXsKKyAgICAgICAgICAgICAgICBzLT5ybF90YWJsZV9pbmRleCA9IGRlY29kZTAxMigmcy0+Z2IpOworICAgICAgICAgICAgICAgIHMtPnJsX2Nocm9tYV90YWJsZV9pbmRleCA9IHMtPnJsX3RhYmxlX2luZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5kY190YWJsZV9pbmRleCA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgICAgICAgICBzLT5tdl90YWJsZV9pbmRleCA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgcy0+aW50ZXJfaW50cmFfcHJlZD0gKHMtPndpZHRoKnMtPmhlaWdodCA8IDMyMCoyNDAgJiYgcy0+Yml0X3JhdGU8PUlJX0JJVFJBVEUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZihzLT5hdmN0eC0+ZGVidWcmRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJza2lwOiVkIHJsOiVkIHJsYzolZCBkYzolZCBtdjolZCBtYnJsOiVkIHFwOiVkICAgXG4iLAorICAgICAgICAgICAgICAgIHMtPnVzZV9za2lwX21iX2NvZGUsCisgICAgICAgICAgICAgICAgcy0+cmxfdGFibGVfaW5kZXgsCisgICAgICAgICAgICAgICAgcy0+cmxfY2hyb21hX3RhYmxlX2luZGV4LAorICAgICAgICAgICAgICAgIHMtPmRjX3RhYmxlX2luZGV4LAorICAgICAgICAgICAgICAgIHMtPm12X3RhYmxlX2luZGV4LAorICAgICAgICAgICAgICAgIHMtPnBlcl9tYl9ybF90YWJsZSwKKyAgICAgICAgICAgICAgICBzLT5xc2NhbGUpOworCisgICAgICAgIGlmKHMtPmZsaXBmbG9wX3JvdW5kaW5nKXsKKyAgICAgICAgICAgIHMtPm5vX3JvdW5kaW5nIF49IDE7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgcy0+bm9fcm91bmRpbmcgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGF2X2Rsb2cocy0+YXZjdHgsICIlZCAlZCAlZCAlZCAlZFxuIiwgcy0+cGljdF90eXBlLCBzLT5iaXRfcmF0ZSwKKyAgICAgICAgICAgIHMtPmludGVyX2ludHJhX3ByZWQsIHMtPndpZHRoLCBzLT5oZWlnaHQpOworCisgICAgcy0+ZXNjM19sZXZlbF9sZW5ndGg9IDA7CisgICAgcy0+ZXNjM19ydW5fbGVuZ3RoPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9tc21wZWc0X2RlY29kZV9leHRfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICogcywgaW50IGJ1Zl9zaXplKQoreworICAgIGludCBsZWZ0PSBidWZfc2l6ZSo4IC0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICBpbnQgbGVuZ3RoPSBzLT5tc21wZWc0X3ZlcnNpb24+PTMgPyAxNyA6IDE2OworICAgIC8qIHRoZSBhbHRfYml0c3RyZWFtIHJlYWRlciBjb3VsZCByZWFkIG92ZXIgdGhlIGVuZCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGl0ICovCisgICAgaWYobGVmdD49bGVuZ3RoICYmIGxlZnQ8bGVuZ3RoKzgpCisgICAgeworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA1KTsgLyogZnBzICovCisgICAgICAgIHMtPmJpdF9yYXRlPSBnZXRfYml0cygmcy0+Z2IsIDExKSoxMDI0OworICAgICAgICBpZihzLT5tc21wZWc0X3ZlcnNpb24+PTMpCisgICAgICAgICAgICBzLT5mbGlwZmxvcF9yb3VuZGluZz0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmZsaXBmbG9wX3JvdW5kaW5nPSAwOworICAgIH0KKyAgICBlbHNlIGlmKGxlZnQ8bGVuZ3RoKzgpCisgICAgeworICAgICAgICBzLT5mbGlwZmxvcF9yb3VuZGluZz0gMDsKKyAgICAgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uICE9IDIpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImV4dCBoZWFkZXIgbWlzc2luZywgJWQgbGVmdFxuIiwgbGVmdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSSBmcmFtZSB0b28gbG9uZywgaWdub3JpbmcgZXh0IGhlYWRlclxuIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtcGVnNF9kZWNvZGVfZGMoTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgbiwgaW50ICpkaXJfcHRyKQoreworICAgIGludCBsZXZlbCwgcHJlZDsKKworICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbjw9Mil7CisgICAgICAgIGlmIChuIDwgNCkgeworICAgICAgICAgICAgbGV2ZWwgPSBnZXRfdmxjMigmcy0+Z2IsIHYyX2RjX2x1bV92bGMudGFibGUsIERDX1ZMQ19CSVRTLCAzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxldmVsID0gZ2V0X3ZsYzIoJnMtPmdiLCB2Ml9kY19jaHJvbWFfdmxjLnRhYmxlLCBEQ19WTENfQklUUywgMyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIGRjIHZsY1xuIik7CisgICAgICAgICAgICAqZGlyX3B0ciA9IDA7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbGV2ZWwtPTI1NjsKKyAgICB9ZWxzZXsgIC8vRklYTUUgb3B0aW1pemUgdXNlIHVuaWZpZWQgdGFibGVzICYgaW5kZXgKKyAgICAgICAgaWYgKG4gPCA0KSB7CisgICAgICAgICAgICBsZXZlbCA9IGdldF92bGMyKCZzLT5nYiwgZmZfbXNtcDRfZGNfbHVtYV92bGNbcy0+ZGNfdGFibGVfaW5kZXhdLnRhYmxlLCBEQ19WTENfQklUUywgMyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXZlbCA9IGdldF92bGMyKCZzLT5nYiwgZmZfbXNtcDRfZGNfY2hyb21hX3ZsY1tzLT5kY190YWJsZV9pbmRleF0udGFibGUsIERDX1ZMQ19CSVRTLCAzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGV2ZWwgPCAwKXsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBkYyB2bGNcbiIpOworICAgICAgICAgICAgKmRpcl9wdHIgPSAwOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxldmVsID09IERDX01BWCkgeworICAgICAgICAgICAgbGV2ZWwgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICB9IGVsc2UgaWYgKGxldmVsICE9IDApIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkKKyAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj09MSl7CisgICAgICAgIGludDMyX3QgKmRjX3ZhbDsKKyAgICAgICAgcHJlZCA9IG1zbXBlZzR2MV9wcmVkX2RjKHMsIG4sICZkY192YWwpOworICAgICAgICBsZXZlbCArPSBwcmVkOworCisgICAgICAgIC8qIHVwZGF0ZSBwcmVkaWN0b3IgKi8KKyAgICAgICAgKmRjX3ZhbD0gbGV2ZWw7CisgICAgfWVsc2V7CisgICAgICAgIGludDE2X3QgKmRjX3ZhbDsKKyAgICAgICAgcHJlZCAgID0gZmZfbXNtcGVnNF9wcmVkX2RjKHMsIG4sICZkY192YWwsIGRpcl9wdHIpOworICAgICAgICBsZXZlbCArPSBwcmVkOworCisgICAgICAgIC8qIHVwZGF0ZSBwcmVkaWN0b3IgKi8KKyAgICAgICAgaWYgKG4gPCA0KSB7CisgICAgICAgICAgICAqZGNfdmFsID0gbGV2ZWwgKiBzLT55X2RjX3NjYWxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRjX3ZhbCA9IGxldmVsICogcy0+Y19kY19zY2FsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsZXZlbDsKK30KKworLy8jZGVmaW5lIEVSUk9SX0RFVEFJTFMKK2ludCBmZl9tc21wZWc0X2RlY29kZV9ibG9jayhNcGVnRW5jQ29udGV4dCAqIHMsIGludDE2X3QgKiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgY29kZWQsIGNvbnN0IHVpbnQ4X3QgKnNjYW5fdGFibGUpCit7CisgICAgaW50IGxldmVsLCBpLCBsYXN0LCBydW4sIHJ1bl9kaWZmOworICAgIGludCBhdl91bmluaXQoZGNfcHJlZF9kaXIpOworICAgIFJMVGFibGUgKnJsOworICAgIFJMX1ZMQ19FTEVNICpybF92bGM7CisgICAgaW50IHFtdWwsIHFhZGQ7CisKKyAgICBpZiAocy0+bWJfaW50cmEpIHsKKyAgICAgICAgcW11bD0xOworICAgICAgICBxYWRkPTA7CisKKyAgICAgICAgLyogREMgY29lZiAqLworICAgICAgICBsZXZlbCA9IG1zbXBlZzRfZGVjb2RlX2RjKHMsIG4sICZkY19wcmVkX2Rpcik7CisKKyAgICAgICAgaWYgKGxldmVsIDwgMCl7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRjIG92ZXJmbG93LSBibG9jazogJWQgcXNjYWxlOiAlZC8vXG4iLCBuLCBzLT5xc2NhbGUpOworICAgICAgICAgICAgaWYocy0+aW50ZXJfaW50cmFfcHJlZCkgbGV2ZWw9MDsKKyAgICAgICAgfQorICAgICAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgICAgIHJsID0gJmZmX3JsX3RhYmxlW3MtPnJsX3RhYmxlX2luZGV4XTsKKyAgICAgICAgICAgIGlmKGxldmVsID4gMjU2KnMtPnlfZGNfc2NhbGUpeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGMgb3ZlcmZsb3crIEwgcXNjYWxlOiAlZC8vXG4iLCBzLT5xc2NhbGUpOworICAgICAgICAgICAgICAgIGlmKCFzLT5pbnRlcl9pbnRyYV9wcmVkKSByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBybCA9ICZmZl9ybF90YWJsZVszICsgcy0+cmxfY2hyb21hX3RhYmxlX2luZGV4XTsKKyAgICAgICAgICAgIGlmKGxldmVsID4gMjU2KnMtPmNfZGNfc2NhbGUpeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGMgb3ZlcmZsb3crIEMgcXNjYWxlOiAlZC8vXG4iLCBzLT5xc2NhbGUpOworICAgICAgICAgICAgICAgIGlmKCFzLT5pbnRlcl9pbnRyYV9wcmVkKSByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYmxvY2tbMF0gPSBsZXZlbDsKKworICAgICAgICBydW5fZGlmZiA9IHMtPm1zbXBlZzRfdmVyc2lvbiA+PSA0OworICAgICAgICBpID0gMDsKKyAgICAgICAgaWYgKCFjb2RlZCkgeworICAgICAgICAgICAgZ290byBub3RfY29kZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmFjX3ByZWQpIHsKKyAgICAgICAgICAgIGlmIChkY19wcmVkX2RpciA9PSAwKQorICAgICAgICAgICAgICAgIHNjYW5fdGFibGUgPSBzLT5pbnRyYV92X3NjYW50YWJsZS5wZXJtdXRhdGVkOyAvKiBsZWZ0ICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2Nhbl90YWJsZSA9IHMtPmludHJhX2hfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7IC8qIHRvcCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2Nhbl90YWJsZSA9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkOworICAgICAgICB9CisgICAgICAgIHJsX3ZsYz0gcmwtPnJsX3ZsY1swXTsKKyAgICB9IGVsc2UgeworICAgICAgICBxbXVsID0gcy0+cXNjYWxlIDw8IDE7CisgICAgICAgIHFhZGQgPSAocy0+cXNjYWxlIC0gMSkgfCAxOworICAgICAgICBpID0gLTE7CisgICAgICAgIHJsID0gJmZmX3JsX3RhYmxlWzMgKyBzLT5ybF90YWJsZV9pbmRleF07CisKKyAgICAgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uPT0yKQorICAgICAgICAgICAgcnVuX2RpZmYgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBydW5fZGlmZiA9IDE7CisKKyAgICAgICAgaWYgKCFjb2RlZCkgeworICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSA9IGk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZighc2Nhbl90YWJsZSkKKyAgICAgICAgICAgIHNjYW5fdGFibGUgPSBzLT5pbnRlcl9zY2FudGFibGUucGVybXV0YXRlZDsKKyAgICAgICAgcmxfdmxjPSBybC0+cmxfdmxjW3MtPnFzY2FsZV07CisgICAgfQorICB7CisgICAgT1BFTl9SRUFERVIocmUsICZzLT5nYik7CisgICAgZm9yKDs7KSB7CisgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgR0VUX1JMX1ZMQyhsZXZlbCwgcnVuLCByZSwgJnMtPmdiLCBybF92bGMsIFRFWF9WTENfQklUUywgMiwgMCk7CisgICAgICAgIGlmIChsZXZlbD09MCkgeworICAgICAgICAgICAgaW50IGNhY2hlOworICAgICAgICAgICAgY2FjaGU9IEdFVF9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgIC8qIGVzY2FwZSAqLworICAgICAgICAgICAgaWYgKHMtPm1zbXBlZzRfdmVyc2lvbj09MSB8fCAoY2FjaGUmMHg4MDAwMDAwMCk9PTApIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+bXNtcGVnNF92ZXJzaW9uPT0xIHx8IChjYWNoZSYweDQwMDAwMDAwKT09MCkgeworICAgICAgICAgICAgICAgICAgICAvKiB0aGlyZCBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uIT0xKSBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICBpZihzLT5tc21wZWc0X3ZlcnNpb248PTMpeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gIFNIT1dfVUJJVFMocmUsICZzLT5nYiwgMSk7IFNLSVBfQ0FDSEUocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBydW49ICAgU0hPV19VQklUUyhyZSwgJnMtPmdiLCA2KTsgU0tJUF9DQUNIRShyZSwgJnMtPmdiLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgU0tJUF9DT1VOVEVSKHJlLCAmcy0+Z2IsIDErNis4KTsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2lnbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q9ICBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDEpOyBTS0lQX0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighcy0+ZXNjM19sZXZlbF9sZW5ndGgpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiRVNDLTMgJVggYXQgJWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2JpdHMoJnMtPmdiLCAyNCksIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHMtPnFzY2FsZTw4KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGw9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgMyk7IFNLSVBfQklUUyhyZSwgJnMtPmdiLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGw9PTApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGw9IDgrU0hPV19VQklUUyhyZSwgJnMtPmdiLCAxKTsgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsPTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGxsPDggJiYgU0hPV19VQklUUyhyZSwgJnMtPmdiLCAxKT09MCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxsPDgpIFNLSVBfQklUUyhyZSwgJnMtPmdiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5lc2MzX2xldmVsX2xlbmd0aD0gbGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZXNjM19ydW5fbGVuZ3RoPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDIpICsgMzsgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bj0gICBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIHMtPmVzYzNfcnVuX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgcy0+ZXNjM19ydW5fbGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbj0gIFNIT1dfVUJJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIHMtPmVzYzNfbGV2ZWxfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCBzLT5lc2MzX2xldmVsX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihzaWduKSBsZXZlbD0gLWxldmVsOworICAgICAgICAgICAgICAgICAgICB9CisKKyNpZiAwIC8vIHdhc3RlIG9mIHRpbWUgLyB0aGlzIHdpbGwgZGV0ZWN0IHZlcnkgZmV3IGVycm9ycworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYWJzX2xldmVsPSBGRkFCUyhsZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcnVuMT0gcnVuIC0gcmwtPm1heF9ydW5bbGFzdF1bYWJzX2xldmVsXSAtIHJ1bl9kaWZmOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWJzX2xldmVsPD1NQVhfTEVWRUwgJiYgcnVuPD1NQVhfUlVOKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhYnNfbGV2ZWwgPD0gcmwtPm1heF9sZXZlbFtsYXN0XVtydW5dKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIDMuIGVzYywgdmxjIGVuY29kaW5nIHBvc3NpYmxlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQ09ESU5HX0FDX0xPU1Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFic19sZXZlbCA8PSBybC0+bWF4X2xldmVsW2xhc3RdW3J1bl0qMil7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCAzLiBlc2MsIGVzYyAxIGVuY29kaW5nIHBvc3NpYmxlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQ09ESU5HX0FDX0xPU1Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJ1bjE+PTAgJiYgYWJzX2xldmVsIDw9IHJsLT5tYXhfbGV2ZWxbbGFzdF1bcnVuMV0peworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgMy4gZXNjLCBlc2MgMiBlbmNvZGluZyBwb3NzaWJsZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBERUNPRElOR19BQ19MT1NUOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8vbGV2ZWwgPSBsZXZlbCAqIHFtdWwgKyAobGV2ZWw+MCkgKiBxYWRkIC0gKGxldmVsPD0wKSAqIHFhZGQgOworICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWw+MCkgbGV2ZWw9IGxldmVsICogcW11bCArIHFhZGQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICBsZXZlbD0gbGV2ZWwgKiBxbXVsIC0gcWFkZDsKKyNpZiAwIC8vIHdhc3RlIG9mIHRpbWUgdG9vIDooCisgICAgICAgICAgICAgICAgICAgIGlmKGxldmVsPjIwNDggfHwgbGV2ZWw8LTIwNDgpeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ8bGV2ZWx8IG92ZXJmbG93IGluIDMuIGVzY1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVDT0RJTkdfQUNfTE9TVDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGkrPSBydW4gKyAxOworICAgICAgICAgICAgICAgICAgICBpZihsYXN0KSBpKz0xOTI7CisjaWZkZWYgRVJST1JfREVUQUlMUworICAgICAgICAgICAgICAgIGlmKHJ1bj09NjYpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCB2bGMgY29kZSBpbiBFU0MzIGxldmVsPSVkXG4iLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZigoaT42MiAmJiBpPDE5MikgfHwgaT4xOTIrNjMpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicnVuIG92ZXJmbG93IGluIEVTQzMgaT0lZCBydW49JWQgbGV2ZWw9JWRcbiIsIGksIHJ1biwgbGV2ZWwpOworI2VuZGlmCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIGVzY2FwZSAqLworICAgICAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgMik7CisgICAgICAgICAgICAgICAgICAgIEdFVF9STF9WTEMobGV2ZWwsIHJ1biwgcmUsICZzLT5nYiwgcmxfdmxjLCBURVhfVkxDX0JJVFMsIDIsIDEpOworICAgICAgICAgICAgICAgICAgICBpKz0gcnVuICsgcmwtPm1heF9ydW5bcnVuPj43XVtsZXZlbC9xbXVsXSArIHJ1bl9kaWZmOyAvL0ZJWE1FIG9wdCBpbmRleGluZworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCBeIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSkpIC0gU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsICZzLT5nYiwgMSk7CisjaWZkZWYgRVJST1JfREVUQUlMUworICAgICAgICAgICAgICAgIGlmKHJ1bj09NjYpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCB2bGMgY29kZSBpbiBFU0MyIGxldmVsPSVkXG4iLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZigoaT42MiAmJiBpPDE5MikgfHwgaT4xOTIrNjMpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicnVuIG92ZXJmbG93IGluIEVTQzIgaT0lZCBydW49JWQgbGV2ZWw9JWRcbiIsIGksIHJ1biwgbGV2ZWwpOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgMSk7CisgICAgICAgICAgICAgICAgR0VUX1JMX1ZMQyhsZXZlbCwgcnVuLCByZSwgJnMtPmdiLCBybF92bGMsIFRFWF9WTENfQklUUywgMiwgMSk7CisgICAgICAgICAgICAgICAgaSs9IHJ1bjsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsICsgcmwtPm1heF9sZXZlbFtydW4+PjddWyhydW4tMSkmNjNdICogcW11bDsvL0ZJWE1FIG9wdCBpbmRleGluZworICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIF4gU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKSkgLSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOworI2lmZGVmIEVSUk9SX0RFVEFJTFMKKyAgICAgICAgICAgICAgICBpZihydW49PTY2KQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgdmxjIGNvZGUgaW4gRVNDMSBsZXZlbD0lZFxuIiwgbGV2ZWwpOworICAgICAgICAgICAgICAgIGVsc2UgaWYoKGk+NjIgJiYgaTwxOTIpIHx8IGk+MTkyKzYzKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJ1biBvdmVyZmxvdyBpbiBFU0MxIGk9JWQgcnVuPSVkIGxldmVsPSVkXG4iLCBpLCBydW4sIGxldmVsKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaSs9IHJ1bjsKKyAgICAgICAgICAgIGxldmVsID0gKGxldmVsIF4gU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKSkgLSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpOworICAgICAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsICZzLT5nYiwgMSk7CisjaWZkZWYgRVJST1JfREVUQUlMUworICAgICAgICAgICAgICAgIGlmKHJ1bj09NjYpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCB2bGMgY29kZSBsZXZlbD0lZFxuIiwgbGV2ZWwpOworICAgICAgICAgICAgICAgIGVsc2UgaWYoKGk+NjIgJiYgaTwxOTIpIHx8IGk+MTkyKzYzKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJ1biBvdmVyZmxvdyBpPSVkIHJ1bj0lZCBsZXZlbD0lZFxuIiwgaSwgcnVuLCBsZXZlbCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA+IDYyKXsKKyAgICAgICAgICAgIGktPSAxOTI7CisgICAgICAgICAgICBpZihpJih+NjMpKXsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGVmdD0gZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpOworICAgICAgICAgICAgICAgIGlmKCgoaSsxOTIgPT0gNjQgJiYgbGV2ZWwvcW11bD09LTEpIHx8ICEocy0+ZXJyX3JlY29nbml0aW9uJihBVl9FRl9CSVRTVFJFQU18QVZfRUZfQ09NUExJQU5UKSkpICYmIGxlZnQ+PTApeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlnbm9yaW5nIG92ZXJmbG93IGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgICAgICAgICAgaSA9IDYzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJhYy10ZXggZGFtYWdlZCBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJsb2NrW3NjYW5fdGFibGVbaV1dID0gbGV2ZWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJsb2NrW3NjYW5fdGFibGVbaV1dID0gbGV2ZWw7CisgICAgfQorICAgIENMT1NFX1JFQURFUihyZSwgJnMtPmdiKTsKKyAgfQorIG5vdF9jb2RlZDoKKyAgICBpZiAocy0+bWJfaW50cmEpIHsKKyAgICAgICAgZmZfbXBlZzRfcHJlZF9hYyhzLCBibG9jaywgbiwgZGNfcHJlZF9kaXIpOworICAgICAgICBpZiAocy0+YWNfcHJlZCkgeworICAgICAgICAgICAgaSA9IDYzOyAvKiBYWFg6IG5vdCBvcHRpbWFsICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uPj00ICYmIGk+MCkgaT02MzsgLy9GSVhNRS9YWFggb3B0aW1pemUKKyAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfbXNtcGVnNF9kZWNvZGVfbW90aW9uKE1wZWdFbmNDb250ZXh0ICogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbXhfcHRyLCBpbnQgKm15X3B0cikKK3sKKyAgICBNVlRhYmxlICptdjsKKyAgICBpbnQgY29kZSwgbXgsIG15OworCisgICAgbXYgPSAmZmZfbXZfdGFibGVzW3MtPm12X3RhYmxlX2luZGV4XTsKKworICAgIGNvZGUgPSBnZXRfdmxjMigmcy0+Z2IsIG12LT52bGMudGFibGUsIE1WX1ZMQ19CSVRTLCAyKTsKKyAgICBpZiAoY29kZSA8IDApeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgTVYgY29kZSBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGNvZGUgPT0gbXYtPm4pIHsKKyAgICAgICAgbXggPSBnZXRfYml0cygmcy0+Z2IsIDYpOworICAgICAgICBteSA9IGdldF9iaXRzKCZzLT5nYiwgNik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXggPSBtdi0+dGFibGVfbXZ4W2NvZGVdOworICAgICAgICBteSA9IG12LT50YWJsZV9tdnlbY29kZV07CisgICAgfQorCisgICAgbXggKz0gKm14X3B0ciAtIDMyOworICAgIG15ICs9ICpteV9wdHIgLSAzMjsKKyAgICAvKiBXQVJOSU5HIDogdGhleSBkbyBub3QgZG8gZXhhY3RseSBtb2R1bG8gZW5jb2RpbmcgKi8KKyAgICBpZiAobXggPD0gLTY0KQorICAgICAgICBteCArPSA2NDsKKyAgICBlbHNlIGlmIChteCA+PSA2NCkKKyAgICAgICAgbXggLT0gNjQ7CisKKyAgICBpZiAobXkgPD0gLTY0KQorICAgICAgICBteSArPSA2NDsKKyAgICBlbHNlIGlmIChteSA+PSA2NCkKKyAgICAgICAgbXkgLT0gNjQ7CisgICAgKm14X3B0ciA9IG14OworICAgICpteV9wdHIgPSBteTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9tc21wZWc0djFfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXNtcGVnNHYxIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy00IHBhcnQgMiBNaWNyb3NvZnQgdmFyaWFudCB2ZXJzaW9uIDEiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVNNUEVHNFYxLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmZfbXNtcGVnNF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IENPREVDX0NBUF9EUjEsCisgICAgLm1heF9sb3dyZXMgICAgID0gMywKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKKworQVZDb2RlYyBmZl9tc21wZWc0djJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXNtcGVnNHYyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy00IHBhcnQgMiBNaWNyb3NvZnQgdmFyaWFudCB2ZXJzaW9uIDIiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVNNUEVHNFYyLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmZfbXNtcGVnNF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IENPREVDX0NBUF9EUjEsCisgICAgLm1heF9sb3dyZXMgICAgID0gMywKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKKworQVZDb2RlYyBmZl9tc21wZWc0djNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXNtcGVnNCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctNCBwYXJ0IDIgTWljcm9zb2Z0IHZhcmlhbnQgdmVyc2lvbiAzIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01TTVBFRzRWMywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ0VuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX21zbXBlZzRfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBDT0RFQ19DQVBfRFIxLAorICAgIC5tYXhfbG93cmVzICAgICA9IDMsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKK307CisKK0FWQ29kZWMgZmZfd212MV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ3bXYxIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2luZG93cyBNZWRpYSBWaWRlbyA3IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dNVjEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1wZWdFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9tc21wZWc0X2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFJBV19IT1JJWl9CQU5EIHwgQ09ERUNfQ0FQX0RSMSwKKyAgICAubWF4X2xvd3JlcyAgICAgPSAzLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeworICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXNtcGVnNGVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNtcGVnNGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZjUxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tc21wZWc0ZW5jLmMKQEAgLTAsMCArMSw2OTEgQEAKKy8qCisgKiBNU01QRUc0IGVuY29kZXIgYmFja2VuZAorICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBtc21wZWc0djEgJiB2MiBzdHVmZiBieSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNU01QRUc0IGVuY29kZXIgYmFja2VuZAorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJoMjYzLmgiCisjaW5jbHVkZSAibXBlZzR2aWRlby5oIgorI2luY2x1ZGUgIm1zbXBlZzQuaCIKKyNpbmNsdWRlICJtc21wZWc0ZGF0YS5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAicmwuaCIKKyNpbmNsdWRlICJ2YzFkYXRhLmgiCisKK3N0YXRpYyB1aW50OF90IHJsX2xlbmd0aFtOQl9STF9UQUJMRVNdW01BWF9MRVZFTCsxXVtNQVhfUlVOKzFdWzJdOworCisvKiBidWlsZCB0aGUgdGFibGUgd2hpY2ggYXNzb2NpYXRlIGEgKHgseSkgbW90aW9uIHZlY3RvciB0byBhIHZsYyAqLworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X212X3RhYmxlKE1WVGFibGUgKnRhYikKK3sKKyAgICBpbnQgaSwgeCwgeTsKKworICAgIHRhYi0+dGFibGVfbXZfaW5kZXggPSBhdl9tYWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqIDQwOTYpOworICAgIC8qIG1hcmsgYWxsIGVudHJpZXMgYXMgbm90IHVzZWQgKi8KKyAgICBmb3IoaT0wO2k8NDA5NjtpKyspCisgICAgICAgIHRhYi0+dGFibGVfbXZfaW5kZXhbaV0gPSB0YWItPm47CisKKyAgICBmb3IoaT0wO2k8dGFiLT5uO2krKykgeworICAgICAgICB4ID0gdGFiLT50YWJsZV9tdnhbaV07CisgICAgICAgIHkgPSB0YWItPnRhYmxlX212eVtpXTsKKyAgICAgICAgdGFiLT50YWJsZV9tdl9pbmRleFsoeCA8PCA2KSB8IHldID0gaTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfbXNtcGVnNF9jb2RlMDEyKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgbikKK3sKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXRfYml0cyhwYiwgMSwgMSk7CisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAobiA+PSAyKSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGdldF9zaXplX29mX2NvZGUoTXBlZ0VuY0NvbnRleHQgKiBzLCBSTFRhYmxlICpybCwgaW50IGxhc3QsIGludCBydW4sIGludCBsZXZlbCwgaW50IGludHJhKXsKKyAgICBpbnQgc2l6ZT0wOworICAgIGludCBjb2RlOworICAgIGludCBydW5fZGlmZj0gaW50cmEgPyAwIDogMTsKKworICAgIGNvZGUgPSBnZXRfcmxfaW5kZXgocmwsIGxhc3QsIHJ1biwgbGV2ZWwpOworICAgIHNpemUrPSBybC0+dGFibGVfdmxjW2NvZGVdWzFdOworICAgIGlmIChjb2RlID09IHJsLT5uKSB7CisgICAgICAgIGludCBsZXZlbDEsIHJ1bjE7CisKKyAgICAgICAgbGV2ZWwxID0gbGV2ZWwgLSBybC0+bWF4X2xldmVsW2xhc3RdW3J1bl07CisgICAgICAgIGlmIChsZXZlbDEgPCAxKQorICAgICAgICAgICAgZ290byBlc2MyOworICAgICAgICBjb2RlID0gZ2V0X3JsX2luZGV4KHJsLCBsYXN0LCBydW4sIGxldmVsMSk7CisgICAgICAgIGlmIChjb2RlID09IHJsLT5uKSB7CisgICAgICAgICAgICBlc2MyOgorICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICAgICAgaWYgKGxldmVsID4gTUFYX0xFVkVMKQorICAgICAgICAgICAgICAgIGdvdG8gZXNjMzsKKyAgICAgICAgICAgIHJ1bjEgPSBydW4gLSBybC0+bWF4X3J1bltsYXN0XVtsZXZlbF0gLSBydW5fZGlmZjsKKyAgICAgICAgICAgIGlmIChydW4xIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVzYzM7CisgICAgICAgICAgICBjb2RlID0gZ2V0X3JsX2luZGV4KHJsLCBsYXN0LCBydW4xLCBsZXZlbCk7CisgICAgICAgICAgICBpZiAoY29kZSA9PSBybC0+bikgeworICAgICAgICAgICAgZXNjMzoKKyAgICAgICAgICAgICAgICAvKiB0aGlyZCBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICBzaXplKz0xKzErNis4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzZWNvbmQgZXNjYXBlICovCisgICAgICAgICAgICAgICAgc2l6ZSs9IDErMSsgcmwtPnRhYmxlX3ZsY1tjb2RlXVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGZpcnN0IGVzY2FwZSAqLworICAgICAgICAgICAgc2l6ZSs9IDErMSsgcmwtPnRhYmxlX3ZsY1tjb2RlXVsxXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNpemUrKzsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9tc21wZWc0X2VuY29kZV9pbml0KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIHN0YXRpYyBpbnQgaW5pdF9kb25lPTA7CisgICAgaW50IGk7CisKKyAgICBmZl9tc21wZWc0X2NvbW1vbl9pbml0KHMpOworICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj49NCl7CisgICAgICAgIHMtPm1pbl9xY29lZmY9IC0yNTU7CisgICAgICAgIHMtPm1heF9xY29lZmY9ICAyNTU7CisgICAgfQorCisgICAgaWYgKCFpbml0X2RvbmUpIHsKKyAgICAgICAgLyogaW5pdCB2YXJpb3VzIGVuY29kaW5nIHRhYmxlcyAqLworICAgICAgICBpbml0X2RvbmUgPSAxOworICAgICAgICBpbml0X212X3RhYmxlKCZmZl9tdl90YWJsZXNbMF0pOworICAgICAgICBpbml0X212X3RhYmxlKCZmZl9tdl90YWJsZXNbMV0pOworICAgICAgICBmb3IoaT0wO2k8TkJfUkxfVEFCTEVTO2krKykKKyAgICAgICAgICAgIGZmX2luaXRfcmwoJmZmX3JsX3RhYmxlW2ldLCBmZl9zdGF0aWNfcmxfdGFibGVfc3RvcmVbaV0pOworCisgICAgICAgIGZvcihpPTA7IGk8TkJfUkxfVEFCTEVTOyBpKyspeworICAgICAgICAgICAgaW50IGxldmVsOworICAgICAgICAgICAgZm9yIChsZXZlbCA9IDE7IGxldmVsIDw9IE1BWF9MRVZFTDsgbGV2ZWwrKykgeworICAgICAgICAgICAgICAgIGludCBydW47CisgICAgICAgICAgICAgICAgZm9yKHJ1bj0wOyBydW48PU1BWF9SVU47IHJ1bisrKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgIGZvcihsYXN0PTA7IGxhc3Q8MjsgbGFzdCsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJsX2xlbmd0aFtpXVtsZXZlbF1bcnVuXVtsYXN0XT0gZ2V0X3NpemVfb2ZfY29kZShzLCAmZmZfcmxfdGFibGVbICBpXSwgbGFzdCwgcnVuLCBsZXZlbCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbmRfYmVzdF90YWJsZXMoTXBlZ0VuY0NvbnRleHQgKiBzKQoreworICAgIGludCBpOworICAgIGludCBiZXN0ICAgICAgICA9IDAsIGJlc3Rfc2l6ZSAgICAgICAgPSBJTlRfTUFYOworICAgIGludCBjaHJvbWFfYmVzdCA9IDAsIGJlc3RfY2hyb21hX3NpemUgPSBJTlRfTUFYOworCisgICAgZm9yKGk9MDsgaTwzOyBpKyspeworICAgICAgICBpbnQgbGV2ZWw7CisgICAgICAgIGludCBjaHJvbWFfc2l6ZT0wOworICAgICAgICBpbnQgc2l6ZT0wOworCisgICAgICAgIGlmKGk+MCl7Ly8gOykKKyAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgICAgIGNocm9tYV9zaXplKys7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGxldmVsPTA7IGxldmVsPD1NQVhfTEVWRUw7IGxldmVsKyspeworICAgICAgICAgICAgaW50IHJ1bjsKKyAgICAgICAgICAgIGZvcihydW49MDsgcnVuPD1NQVhfUlVOOyBydW4rKyl7CisgICAgICAgICAgICAgICAgaW50IGxhc3Q7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGxhc3Rfc2l6ZT0gc2l6ZSArIGNocm9tYV9zaXplOworICAgICAgICAgICAgICAgIGZvcihsYXN0PTA7IGxhc3Q8MjsgbGFzdCsrKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IGludGVyX2NvdW50ICAgICAgID0gcy0+YWNfc3RhdHNbMF1bMF1bbGV2ZWxdW3J1bl1bbGFzdF0gKyBzLT5hY19zdGF0c1swXVsxXVtsZXZlbF1bcnVuXVtsYXN0XTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGludHJhX2x1bWFfY291bnQgID0gcy0+YWNfc3RhdHNbMV1bMF1bbGV2ZWxdW3J1bl1bbGFzdF07CisgICAgICAgICAgICAgICAgICAgIGludCBpbnRyYV9jaHJvbWFfY291bnQ9IHMtPmFjX3N0YXRzWzFdWzFdW2xldmVsXVtydW5dW2xhc3RdOworCisgICAgICAgICAgICAgICAgICAgIGlmKHMtPnBpY3RfdHlwZT09QVZfUElDVFVSRV9UWVBFX0kpeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgICAgICArPSBpbnRyYV9sdW1hX2NvdW50ICAqcmxfbGVuZ3RoW2kgIF1bbGV2ZWxdW3J1bl1bbGFzdF07CisgICAgICAgICAgICAgICAgICAgICAgICBjaHJvbWFfc2l6ZSs9IGludHJhX2Nocm9tYV9jb3VudCpybF9sZW5ndGhbaSszXVtsZXZlbF1bcnVuXVtsYXN0XTsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplKz0gICAgICAgIGludHJhX2x1bWFfY291bnQgICpybF9sZW5ndGhbaSAgXVtsZXZlbF1bcnVuXVtsYXN0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtpbnRyYV9jaHJvbWFfY291bnQqcmxfbGVuZ3RoW2krM11bbGV2ZWxdW3J1bl1bbGFzdF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAraW50ZXJfY291bnQgICAgICAgKnJsX2xlbmd0aFtpKzNdW2xldmVsXVtydW5dW2xhc3RdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGxhc3Rfc2l6ZSA9PSBzaXplK2Nocm9tYV9zaXplKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihzaXplPGJlc3Rfc2l6ZSl7CisgICAgICAgICAgICBiZXN0X3NpemU9IHNpemU7CisgICAgICAgICAgICBiZXN0PSBpOworICAgICAgICB9CisgICAgICAgIGlmKGNocm9tYV9zaXplPGJlc3RfY2hyb21hX3NpemUpeworICAgICAgICAgICAgYmVzdF9jaHJvbWFfc2l6ZT0gY2hyb21hX3NpemU7CisgICAgICAgICAgICBjaHJvbWFfYmVzdD0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHMtPnBpY3RfdHlwZT09QVZfUElDVFVSRV9UWVBFX1ApIGNocm9tYV9iZXN0PSBiZXN0OworCisgICAgbWVtc2V0KHMtPmFjX3N0YXRzLCAwLCBzaXplb2YoaW50KSooTUFYX0xFVkVMKzEpKihNQVhfUlVOKzEpKjIqMioyKTsKKworICAgIHMtPnJsX3RhYmxlX2luZGV4ICAgICAgID0gICAgICAgIGJlc3Q7CisgICAgcy0+cmxfY2hyb21hX3RhYmxlX2luZGV4PSBjaHJvbWFfYmVzdDsKKworICAgIGlmKHMtPnBpY3RfdHlwZSAhPSBzLT5sYXN0X25vbl9iX3BpY3RfdHlwZSl7CisgICAgICAgIHMtPnJsX3RhYmxlX2luZGV4PSAyOworICAgICAgICBpZihzLT5waWN0X3R5cGU9PUFWX1BJQ1RVUkVfVFlQRV9JKQorICAgICAgICAgICAgcy0+cmxfY2hyb21hX3RhYmxlX2luZGV4PSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5ybF9jaHJvbWFfdGFibGVfaW5kZXg9IDI7CisgICAgfQorCit9CisKKy8qIHdyaXRlIE1TTVBFRzQgY29tcGF0aWJsZSBmcmFtZSBoZWFkZXIgKi8KK3ZvaWQgZmZfbXNtcGVnNF9lbmNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgcGljdHVyZV9udW1iZXIpCit7CisgICAgZmluZF9iZXN0X3RhYmxlcyhzKTsKKworICAgIGF2cHJpdl9hbGlnbl9wdXRfYml0cygmcy0+cGIpOworICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgcy0+cGljdF90eXBlIC0gMSk7CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDUsIHMtPnFzY2FsZSk7CisgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uPD0yKXsKKyAgICAgICAgcy0+cmxfdGFibGVfaW5kZXggPSAyOworICAgICAgICBzLT5ybF9jaHJvbWFfdGFibGVfaW5kZXggPSAyOworICAgIH0KKworICAgIHMtPmRjX3RhYmxlX2luZGV4ID0gMTsKKyAgICBzLT5tdl90YWJsZV9pbmRleCA9IDE7IC8qIG9ubHkgaWYgUCBmcmFtZSAqLworICAgIHMtPnVzZV9za2lwX21iX2NvZGUgPSAxOyAvKiBvbmx5IGlmIFAgZnJhbWUgKi8KKyAgICBzLT5wZXJfbWJfcmxfdGFibGUgPSAwOworICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj09NCkKKyAgICAgICAgcy0+aW50ZXJfaW50cmFfcHJlZD0gKHMtPndpZHRoKnMtPmhlaWdodCA8IDMyMCoyNDAgJiYgcy0+Yml0X3JhdGU8PUlJX0JJVFJBVEUgJiYgcy0+cGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfUCk7CisgICAgYXZfZGxvZyhzLCAiJWQgJWQgJWQgJWQgJWRcbiIsIHMtPnBpY3RfdHlwZSwgcy0+Yml0X3JhdGUsCisgICAgICAgICAgICBzLT5pbnRlcl9pbnRyYV9wcmVkLCBzLT53aWR0aCwgcy0+aGVpZ2h0KTsKKworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgcy0+c2xpY2VfaGVpZ2h0PSBzLT5tYl9oZWlnaHQvMTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA1LCAweDE2ICsgcy0+bWJfaGVpZ2h0L3MtPnNsaWNlX2hlaWdodCk7CisKKyAgICAgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uPT00KXsKKyAgICAgICAgICAgIGZmX21zbXBlZzRfZW5jb2RlX2V4dF9oZWFkZXIocyk7CisgICAgICAgICAgICBpZihzLT5iaXRfcmF0ZT5NQkFDX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5wZXJfbWJfcmxfdGFibGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uPjIpeworICAgICAgICAgICAgaWYoIXMtPnBlcl9tYl9ybF90YWJsZSl7CisgICAgICAgICAgICAgICAgZmZfbXNtcGVnNF9jb2RlMDEyKCZzLT5wYiwgcy0+cmxfY2hyb21hX3RhYmxlX2luZGV4KTsKKyAgICAgICAgICAgICAgICBmZl9tc21wZWc0X2NvZGUwMTIoJnMtPnBiLCBzLT5ybF90YWJsZV9pbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+ZGNfdGFibGVfaW5kZXgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT51c2Vfc2tpcF9tYl9jb2RlKTsKKworICAgICAgICBpZihzLT5tc21wZWc0X3ZlcnNpb249PTQgJiYgcy0+Yml0X3JhdGU+TUJBQ19CSVRSQVRFKQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5wZXJfbWJfcmxfdGFibGUpOworCisgICAgICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj4yKXsKKyAgICAgICAgICAgIGlmKCFzLT5wZXJfbWJfcmxfdGFibGUpCisgICAgICAgICAgICAgICAgZmZfbXNtcGVnNF9jb2RlMDEyKCZzLT5wYiwgcy0+cmxfdGFibGVfaW5kZXgpOworCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPmRjX3RhYmxlX2luZGV4KTsKKworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5tdl90YWJsZV9pbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5lc2MzX2xldmVsX2xlbmd0aD0gMDsKKyAgICBzLT5lc2MzX3J1bl9sZW5ndGg9IDA7Cit9CisKK3ZvaWQgZmZfbXNtcGVnNF9lbmNvZGVfZXh0X2hlYWRlcihNcGVnRW5jQ29udGV4dCAqIHMpCit7CisgICAgICAgIHVuc2lnbmVkIGZwcyA9IHMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuIC8gcy0+YXZjdHgtPnRpbWVfYmFzZS5udW0gLyBGRk1BWChzLT5hdmN0eC0+dGlja3NfcGVyX2ZyYW1lLCAxKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA1LCBGRk1JTihmcHMsIDMxKSk7IC8veWVzIDI5Ljk3IC0+IDI5CisKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxMSwgRkZNSU4ocy0+Yml0X3JhdGUvMTAyNCwgMjA0NykpOworCisgICAgICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj49MykKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+ZmxpcGZsb3Bfcm91bmRpbmcpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdl9hc3NlcnQwKHMtPmZsaXBmbG9wX3JvdW5kaW5nPT0wKTsKK30KKwordm9pZCBmZl9tc21wZWc0X2VuY29kZV9tb3Rpb24oTXBlZ0VuY0NvbnRleHQgKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteCwgaW50IG15KQoreworICAgIGludCBjb2RlOworICAgIE1WVGFibGUgKm12OworCisgICAgLyogbW9kdWxvIGVuY29kaW5nICovCisgICAgLyogV0FSTklORyA6IHlvdSBjYW5ub3QgcmVhY2ggYWxsIHRoZSBNVnMgZXZlbiB3aXRoIHRoZSBtb2R1bG8KKyAgICAgICBlbmNvZGluZy4gVGhpcyBpcyBhIHNvbWV3aGF0IHN0cmFuZ2UgY29tcHJvbWlzZSB0aGV5IHRvb2sgISEhICAqLworICAgIGlmIChteCA8PSAtNjQpCisgICAgICAgIG14ICs9IDY0OworICAgIGVsc2UgaWYgKG14ID49IDY0KQorICAgICAgICBteCAtPSA2NDsKKyAgICBpZiAobXkgPD0gLTY0KQorICAgICAgICBteSArPSA2NDsKKyAgICBlbHNlIGlmIChteSA+PSA2NCkKKyAgICAgICAgbXkgLT0gNjQ7CisKKyAgICBteCArPSAzMjsKKyAgICBteSArPSAzMjsKKyNpZiAwCisgICAgaWYgKCh1bnNpZ25lZClteCA+PSA2NCB8fAorICAgICAgICAodW5zaWduZWQpbXkgPj0gNjQpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgbXg9JWQgbXk9JWRcbiIsIG14LCBteSk7CisjZW5kaWYKKyAgICBtdiA9ICZmZl9tdl90YWJsZXNbcy0+bXZfdGFibGVfaW5kZXhdOworCisgICAgY29kZSA9IG12LT50YWJsZV9tdl9pbmRleFsobXggPDwgNikgfCBteV07CisgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgIG12LT50YWJsZV9tdl9iaXRzW2NvZGVdLAorICAgICAgICAgICAgIG12LT50YWJsZV9tdl9jb2RlW2NvZGVdKTsKKyAgICBpZiAoY29kZSA9PSBtdi0+bikgeworICAgICAgICAvKiBlc2NhcGUgOiBjb2RlIGxpdGVyYWxseSAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDYsIG14KTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA2LCBteSk7CisgICAgfQorfQorCit2b2lkIGZmX21zbXBlZzRfaGFuZGxlX3NsaWNlcyhNcGVnRW5jQ29udGV4dCAqcyl7CisgICAgaWYgKHMtPm1iX3ggPT0gMCkgeworICAgICAgICBpZiAocy0+c2xpY2VfaGVpZ2h0ICYmIChzLT5tYl95ICUgcy0+c2xpY2VfaGVpZ2h0KSA9PSAwKSB7CisgICAgICAgICAgICBpZihzLT5tc21wZWc0X3ZlcnNpb24gPCA0KXsKKyAgICAgICAgICAgICAgICBmZl9tcGVnNF9jbGVhbl9idWZmZXJzKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5maXJzdF9zbGljZV9saW5lID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgbXNtcGVnNHYyX2VuY29kZV9tb3Rpb24oTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgdmFsKQoreworICAgIGludCByYW5nZSwgYml0X3NpemUsIHNpZ24sIGNvZGUsIGJpdHM7CisKKyAgICBpZiAodmFsID09IDApIHsKKyAgICAgICAgLyogemVybyB2ZWN0b3IgKi8KKyAgICAgICAgY29kZSA9IDA7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgZmZfbXZ0YWJbY29kZV1bMV0sIGZmX212dGFiW2NvZGVdWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBiaXRfc2l6ZSA9IHMtPmZfY29kZSAtIDE7CisgICAgICAgIHJhbmdlID0gMSA8PCBiaXRfc2l6ZTsKKyAgICAgICAgaWYgKHZhbCA8PSAtNjQpCisgICAgICAgICAgICB2YWwgKz0gNjQ7CisgICAgICAgIGVsc2UgaWYgKHZhbCA+PSA2NCkKKyAgICAgICAgICAgIHZhbCAtPSA2NDsKKworICAgICAgICBpZiAodmFsID49IDApIHsKKyAgICAgICAgICAgIHNpZ24gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsID0gLXZhbDsKKyAgICAgICAgICAgIHNpZ24gPSAxOworICAgICAgICB9CisgICAgICAgIHZhbC0tOworICAgICAgICBjb2RlID0gKHZhbCA+PiBiaXRfc2l6ZSkgKyAxOworICAgICAgICBiaXRzID0gdmFsICYgKHJhbmdlIC0gMSk7CisKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBmZl9tdnRhYltjb2RlXVsxXSArIDEsIChmZl9tdnRhYltjb2RlXVswXSA8PCAxKSB8IHNpZ24pOworICAgICAgICBpZiAoYml0X3NpemUgPiAwKSB7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIGJpdF9zaXplLCBiaXRzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl9tc21wZWc0X2VuY29kZV9tYihNcGVnRW5jQ29udGV4dCAqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgYmxvY2tbNl1bNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uX3gsIGludCBtb3Rpb25feSkKK3sKKyAgICBpbnQgY2JwLCBjb2RlZF9jYnAsIGk7CisgICAgaW50IHByZWRfeCwgcHJlZF95OworICAgIHVpbnQ4X3QgKmNvZGVkX2Jsb2NrOworCisgICAgZmZfbXNtcGVnNF9oYW5kbGVfc2xpY2VzKHMpOworCisgICAgaWYgKCFzLT5tYl9pbnRyYSkgeworICAgICAgICAvKiBjb21wdXRlIGNicCAqLworICAgICAgICBjYnAgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+YmxvY2tfbGFzdF9pbmRleFtpXSA+PSAwKQorICAgICAgICAgICAgICAgIGNicCB8PSAxIDw8ICg1IC0gaSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnVzZV9za2lwX21iX2NvZGUgJiYgKGNicCB8IG1vdGlvbl94IHwgbW90aW9uX3kpID09IDApIHsKKyAgICAgICAgICAgIC8qIHNraXAgbWFjcm9ibG9jayAqLworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsKKyAgICAgICAgICAgIHMtPmxhc3RfYml0cysrOworICAgICAgICAgICAgcy0+bWlzY19iaXRzKys7CisgICAgICAgICAgICBzLT5za2lwX2NvdW50Kys7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+dXNlX3NraXBfbWJfY29kZSkKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAvKiBtYiBjb2RlZCAqLworCisgICAgICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbjw9Mil7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgICAgICBmZl92Ml9tYl90eXBlW2NicCYzXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3YyX21iX3R5cGVbY2JwJjNdWzBdKTsKKyAgICAgICAgICAgIGlmKChjYnAmMykgIT0gMykgY29kZWRfY2JwPSBjYnAgXiAweDNDOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICBjb2RlZF9jYnA9IGNicDsKKworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgZmZfaDI2M19jYnB5X3RhYltjb2RlZF9jYnA+PjJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgZmZfaDI2M19jYnB5X3RhYltjb2RlZF9jYnA+PjJdWzBdKTsKKworICAgICAgICAgICAgcy0+bWlzY19iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisKKyAgICAgICAgICAgIGZmX2gyNjNfcHJlZF9tb3Rpb24ocywgMCwgMCwgJnByZWRfeCwgJnByZWRfeSk7CisgICAgICAgICAgICBtc21wZWc0djJfZW5jb2RlX21vdGlvbihzLCBtb3Rpb25feCAtIHByZWRfeCk7CisgICAgICAgICAgICBtc21wZWc0djJfZW5jb2RlX21vdGlvbihzLCBtb3Rpb25feSAtIHByZWRfeSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgZmZfdGFibGVfbWJfbm9uX2ludHJhW2NicCArIDY0XVsxXSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3RhYmxlX21iX25vbl9pbnRyYVtjYnAgKyA2NF1bMF0pOworCisgICAgICAgICAgICBzLT5taXNjX2JpdHMgKz0gZ2V0X2JpdHNfZGlmZihzKTsKKworICAgICAgICAgICAgLyogbW90aW9uIHZlY3RvciAqLworICAgICAgICAgICAgZmZfaDI2M19wcmVkX21vdGlvbihzLCAwLCAwLCAmcHJlZF94LCAmcHJlZF95KTsKKyAgICAgICAgICAgIGZmX21zbXBlZzRfZW5jb2RlX21vdGlvbihzLCBtb3Rpb25feCAtIHByZWRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feSAtIHByZWRfeSk7CisgICAgICAgIH0KKworICAgICAgICBzLT5tdl9iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgZmZfbXNtcGVnNF9lbmNvZGVfYmxvY2socywgYmxvY2tbaV0sIGkpOworICAgICAgICB9CisgICAgICAgIHMtPnBfdGV4X2JpdHMgKz0gZ2V0X2JpdHNfZGlmZihzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBjb21wdXRlIGNicCAqLworICAgICAgICBjYnAgPSAwOworICAgICAgICBjb2RlZF9jYnAgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgdmFsLCBwcmVkOworICAgICAgICAgICAgdmFsID0gKHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPj0gMSk7CisgICAgICAgICAgICBjYnAgfD0gdmFsIDw8ICg1IC0gaSk7CisgICAgICAgICAgICBpZiAoaSA8IDQpIHsKKyAgICAgICAgICAgICAgICAvKiBwcmVkaWN0IHZhbHVlIGZvciBjbG9zZSBibG9ja3Mgb25seSBmb3IgbHVtYSAqLworICAgICAgICAgICAgICAgIHByZWQgPSBmZl9tc21wZWc0X2NvZGVkX2Jsb2NrX3ByZWQocywgaSwgJmNvZGVkX2Jsb2NrKTsKKyAgICAgICAgICAgICAgICAqY29kZWRfYmxvY2sgPSB2YWw7CisgICAgICAgICAgICAgICAgdmFsID0gdmFsIF4gcHJlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGVkX2NicCB8PSB2YWwgPDwgKDUgLSBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbjw9Mil7CisgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZmX3YyX2ludHJhX2NicGNbY2JwJjNdWzFdLCBmZl92Ml9pbnRyYV9jYnBjW2NicCYzXVswXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzLT51c2Vfc2tpcF9tYl9jb2RlKQorICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgLyogbWIgY29kZWQgKi8KKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdjJfbWJfdHlwZVsoY2JwJjMpICsgNF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdjJfbWJfdHlwZVsoY2JwJjMpICsgNF1bMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAgLyogbm8gQUMgcHJlZGljdGlvbiB5ZXQgKi8KKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwKKyAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfY2JweV90YWJbY2JwPj4yXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjNfY2JweV90YWJbY2JwPj4yXVswXSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmZl9tc21wNF9tYl9pX3RhYmxlW2NvZGVkX2NicF1bMV0sIGZmX21zbXA0X21iX2lfdGFibGVbY29kZWRfY2JwXVswXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzLT51c2Vfc2tpcF9tYl9jb2RlKQorICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgLyogbWIgY29kZWQgKi8KKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdGFibGVfbWJfbm9uX2ludHJhW2NicF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdGFibGVfbWJfbm9uX2ludHJhW2NicF1bMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAgICAgLyogbm8gQUMgcHJlZGljdGlvbiB5ZXQgKi8KKyAgICAgICAgICAgIGlmKHMtPmludGVyX2ludHJhX3ByZWQpeworICAgICAgICAgICAgICAgIHMtPmgyNjNfYWljX2Rpcj0wOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgZmZfdGFibGVfaW50ZXJfaW50cmFbcy0+aDI2M19haWNfZGlyXVsxXSwgZmZfdGFibGVfaW50ZXJfaW50cmFbcy0+aDI2M19haWNfZGlyXVswXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcy0+bWlzY19iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgZmZfbXNtcGVnNF9lbmNvZGVfYmxvY2socywgYmxvY2tbaV0sIGkpOworICAgICAgICB9CisgICAgICAgIHMtPmlfdGV4X2JpdHMgKz0gZ2V0X2JpdHNfZGlmZihzKTsKKyAgICAgICAgcy0+aV9jb3VudCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbXNtcGVnNF9lbmNvZGVfZGMoTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgbGV2ZWwsIGludCBuLCBpbnQgKmRpcl9wdHIpCit7CisgICAgaW50IHNpZ24sIGNvZGU7CisgICAgaW50IHByZWQsIGF2X3VuaW5pdChleHRxdWFudCk7CisgICAgaW50IGV4dHJhYml0cyA9IDA7CisKKyAgICBpbnQxNl90ICpkY192YWw7CisgICAgcHJlZCA9IGZmX21zbXBlZzRfcHJlZF9kYyhzLCBuLCAmZGNfdmFsLCBkaXJfcHRyKTsKKworICAgIC8qIHVwZGF0ZSBwcmVkaWN0b3IgKi8KKyAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgKmRjX3ZhbCA9IGxldmVsICogcy0+eV9kY19zY2FsZTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZGNfdmFsID0gbGV2ZWwgKiBzLT5jX2RjX3NjYWxlOworICAgIH0KKworICAgIC8qIGRvIHRoZSBwcmVkaWN0aW9uICovCisgICAgbGV2ZWwgLT0gcHJlZDsKKworICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbjw9Mil7CisgICAgICAgIGlmIChuIDwgNCkgeworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgZmZfdjJfZGNfbHVtX3RhYmxlW2xldmVsICsgMjU2XVsxXSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3YyX2RjX2x1bV90YWJsZVtsZXZlbCArIDI1Nl1bMF0pOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3YyX2RjX2Nocm9tYV90YWJsZVtsZXZlbCArIDI1Nl1bMV0sCisgICAgICAgICAgICAgICAgICAgICBmZl92Ml9kY19jaHJvbWFfdGFibGVbbGV2ZWwgKyAyNTZdWzBdKTsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBzaWduID0gMDsKKyAgICAgICAgaWYgKGxldmVsIDwgMCkgeworICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICBzaWduID0gMTsKKyAgICAgICAgfQorICAgICAgICBjb2RlID0gbGV2ZWw7CisgICAgICAgIGlmIChjb2RlID4gRENfTUFYKQorICAgICAgICAgICAgY29kZSA9IERDX01BWDsKKyAgICAgICAgZWxzZSBpZiggcy0+bXNtcGVnNF92ZXJzaW9uPj02ICkgeworICAgICAgICAgICAgaWYoIHMtPnFzY2FsZSA9PSAxICkgeworICAgICAgICAgICAgICAgIGV4dHF1YW50ID0gKGxldmVsICsgMykgJiAweDM7CisgICAgICAgICAgICAgICAgY29kZSAgPSAoKGxldmVsKzMpPj4yKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggcy0+cXNjYWxlID09IDIgKSB7CisgICAgICAgICAgICAgICAgZXh0cXVhbnQgPSAobGV2ZWwgKyAxKSAmIDB4MTsKKyAgICAgICAgICAgICAgICBjb2RlICA9ICgobGV2ZWwrMSk+PjEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPmRjX3RhYmxlX2luZGV4ID09IDApIHsKKyAgICAgICAgICAgIGlmIChuIDwgNCkgeworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgZmZfdGFibGUwX2RjX2x1bVtjb2RlXVsxXSwgZmZfdGFibGUwX2RjX2x1bVtjb2RlXVswXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgZmZfdGFibGUwX2RjX2Nocm9tYVtjb2RlXVsxXSwgZmZfdGFibGUwX2RjX2Nocm9tYVtjb2RlXVswXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIGZmX3RhYmxlMV9kY19sdW1bY29kZV1bMV0sIGZmX3RhYmxlMV9kY19sdW1bY29kZV1bMF0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIGZmX3RhYmxlMV9kY19jaHJvbWFbY29kZV1bMV0sIGZmX3RhYmxlMV9kY19jaHJvbWFbY29kZV1bMF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uPj02ICYmIHMtPnFzY2FsZTw9MikKKyAgICAgICAgICAgIGV4dHJhYml0cyA9IDMgLSBzLT5xc2NhbGU7CisKKyAgICAgICAgaWYgKGNvZGUgPT0gRENfTUFYKQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA4ICsgZXh0cmFiaXRzLCBsZXZlbCk7CisgICAgICAgIGVsc2UgaWYoZXh0cmFiaXRzID4gMCkvLz09IFZDMSAmJiBzLT5xc2NhbGU8PTIKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgZXh0cmFiaXRzLCBleHRxdWFudCk7CisKKyAgICAgICAgaWYgKGxldmVsICE9IDApIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgc2lnbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIEVuY29kaW5nIG9mIGEgYmxvY2suIFZlcnkgc2ltaWxhciB0byBNUEVHNCBleGNlcHQgZm9yIGEgZGlmZmVyZW50CisgICBlc2NhcGUgY29kaW5nIChzYW1lIGFzIEgyNjMpIGFuZCBtb3JlIHZsYyB0YWJsZXMuCisgKi8KK3ZvaWQgZmZfbXNtcGVnNF9lbmNvZGVfYmxvY2soTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQxNl90ICogYmxvY2ssIGludCBuKQoreworICAgIGludCBsZXZlbCwgcnVuLCBsYXN0LCBpLCBqLCBsYXN0X2luZGV4OworICAgIGludCBsYXN0X25vbl96ZXJvLCBzaWduLCBzbGV2ZWw7CisgICAgaW50IGNvZGUsIHJ1bl9kaWZmLCBkY19wcmVkX2RpcjsKKyAgICBjb25zdCBSTFRhYmxlICpybDsKKyAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGU7CisKKyAgICBpZiAocy0+bWJfaW50cmEpIHsKKyAgICAgICAgbXNtcGVnNF9lbmNvZGVfZGMocywgYmxvY2tbMF0sIG4sICZkY19wcmVkX2Rpcik7CisgICAgICAgIGkgPSAxOworICAgICAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgICAgIHJsID0gJmZmX3JsX3RhYmxlW3MtPnJsX3RhYmxlX2luZGV4XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJsID0gJmZmX3JsX3RhYmxlWzMgKyBzLT5ybF9jaHJvbWFfdGFibGVfaW5kZXhdOworICAgICAgICB9CisgICAgICAgIHJ1bl9kaWZmID0gcy0+bXNtcGVnNF92ZXJzaW9uPj00OworICAgICAgICBzY2FudGFibGU9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkOworICAgIH0gZWxzZSB7CisgICAgICAgIGkgPSAwOworICAgICAgICBybCA9ICZmZl9ybF90YWJsZVszICsgcy0+cmxfdGFibGVfaW5kZXhdOworICAgICAgICBpZihzLT5tc21wZWc0X3ZlcnNpb248PTIpCisgICAgICAgICAgICBydW5fZGlmZiA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJ1bl9kaWZmID0gMTsKKyAgICAgICAgc2NhbnRhYmxlPSBzLT5pbnRlcl9zY2FudGFibGUucGVybXV0YXRlZDsKKyAgICB9CisKKyAgICAvKiByZWNhbGN1bGF0ZSBibG9ja19sYXN0X2luZGV4IGZvciBNJCB3bXYxICovCisgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uPj00ICYmIHMtPm1zbXBlZzRfdmVyc2lvbjw2ICYmIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0+MCl7CisgICAgICAgIGZvcihsYXN0X2luZGV4PTYzOyBsYXN0X2luZGV4Pj0wOyBsYXN0X2luZGV4LS0peworICAgICAgICAgICAgaWYoYmxvY2tbc2NhbnRhYmxlW2xhc3RfaW5kZXhdXSkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtuXT0gbGFzdF9pbmRleDsKKyAgICB9ZWxzZQorICAgICAgICBsYXN0X2luZGV4ID0gcy0+YmxvY2tfbGFzdF9pbmRleFtuXTsKKyAgICAvKiBBQyBjb2VmcyAqLworICAgIGxhc3Rfbm9uX3plcm8gPSBpIC0gMTsKKyAgICBmb3IgKDsgaSA8PSBsYXN0X2luZGV4OyBpKyspIHsKKyAgICAgICAgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgbGV2ZWwgPSBibG9ja1tqXTsKKyAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICBydW4gPSBpIC0gbGFzdF9ub25femVybyAtIDE7CisgICAgICAgICAgICBsYXN0ID0gKGkgPT0gbGFzdF9pbmRleCk7CisgICAgICAgICAgICBzaWduID0gMDsKKyAgICAgICAgICAgIHNsZXZlbCA9IGxldmVsOworICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkgeworICAgICAgICAgICAgICAgIHNpZ24gPSAxOworICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihsZXZlbDw9TUFYX0xFVkVMICYmIHJ1bjw9TUFYX1JVTil7CisgICAgICAgICAgICAgICAgcy0+YWNfc3RhdHNbcy0+bWJfaW50cmFdW24+M11bbGV2ZWxdW3J1bl1bbGFzdF0rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+YWNfc3RhdHNbcy0+bWJfaW50cmFdW24gPiAzXVs0MF1bNjNdWzBdKys7IC8vZXNjMyBsaWtlCisKKyAgICAgICAgICAgIGNvZGUgPSBnZXRfcmxfaW5kZXgocmwsIGxhc3QsIHJ1biwgbGV2ZWwpOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBybC0+dGFibGVfdmxjW2NvZGVdWzFdLCBybC0+dGFibGVfdmxjW2NvZGVdWzBdKTsKKyAgICAgICAgICAgIGlmIChjb2RlID09IHJsLT5uKSB7CisgICAgICAgICAgICAgICAgaW50IGxldmVsMSwgcnVuMTsKKworICAgICAgICAgICAgICAgIGxldmVsMSA9IGxldmVsIC0gcmwtPm1heF9sZXZlbFtsYXN0XVtydW5dOworICAgICAgICAgICAgICAgIGlmIChsZXZlbDEgPCAxKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVzYzI7CisgICAgICAgICAgICAgICAgY29kZSA9IGdldF9ybF9pbmRleChybCwgbGFzdCwgcnVuLCBsZXZlbDEpOworICAgICAgICAgICAgICAgIGlmIChjb2RlID09IHJsLT5uKSB7CisgICAgICAgICAgICAgICAgZXNjMjoKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gTUFYX0xFVkVMKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlc2MzOworICAgICAgICAgICAgICAgICAgICBydW4xID0gcnVuIC0gcmwtPm1heF9ydW5bbGFzdF1bbGV2ZWxdIC0gcnVuX2RpZmY7CisgICAgICAgICAgICAgICAgICAgIGlmIChydW4xIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXNjMzsKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IGdldF9ybF9pbmRleChybCwgbGFzdCwgcnVuMSsxLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tc21wZWc0X3ZlcnNpb24gPT0gNCAmJiBjb2RlID09IHJsLT5uKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlc2MzOworICAgICAgICAgICAgICAgICAgICBjb2RlID0gZ2V0X3JsX2luZGV4KHJsLCBsYXN0LCBydW4xLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IHJsLT5uKSB7CisgICAgICAgICAgICAgICAgICAgIGVzYzM6CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlyZCBlc2NhcGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIGxhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYocy0+bXNtcGVnNF92ZXJzaW9uPj00KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzLT5lc2MzX2xldmVsX2xlbmd0aD09MCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmVzYzNfbGV2ZWxfbGVuZ3RoPTg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmVzYzNfcnVuX2xlbmd0aD0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9FU0NMVkxTWiArIEVTQ1JVTlNaCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHMtPnFzY2FsZTw4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA2ICsgKHMtPm1zbXBlZzRfdmVyc2lvbj49NiksIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIHMtPmVzYzNfcnVuX2xlbmd0aCwgcnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHNpZ24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcy0+ZXNjM19sZXZlbF9sZW5ndGgsIGxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgNiwgcnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCA4LCBzbGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIGVzY2FwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcmwtPnRhYmxlX3ZsY1tjb2RlXVsxXSwgcmwtPnRhYmxlX3ZsY1tjb2RlXVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHNpZ24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgZXNjYXBlICovCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcmwtPnRhYmxlX3ZsY1tjb2RlXVsxXSwgcmwtPnRhYmxlX3ZsY1tjb2RlXVswXSk7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgc2lnbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHNpZ24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdF9ub25femVybyA9IGk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tc3JsZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNybGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjBhZDgwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNybGUuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIE1pY3Jvc29mdCBSTEUgdmlkZW8gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNUyBSTEUgdmlkZW8gZGVjb2RlciBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE1TIFJMRSBmb3JtYXQsIHZpc2l0OgorICogICBodHRwOi8vd3d3LnBjaXN5cy5uZXQvfm1lbGFuc29uL2NvZGVjcy8KKyAqCisgKiBUaGUgTVMgUkxFIGRlY29kZXIgb3V0cHV0cyBQQUw4IGNvbG9yc3BhY2UgZGF0YS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1zcmxlZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisKK3R5cGVkZWYgc3RydWN0IE1zcmxlQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRnJhbWUgKmZyYW1lOworCisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmOworICAgIGludCBzaXplOworCisgICAgdWludDMyX3QgcGFsWzI1Nl07Cit9IE1zcmxlQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IG1zcmxlX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNc3JsZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIHN3aXRjaCAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgIGNhc2UgMToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX01PTk9XSElURTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgIGNhc2UgODoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IyNDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBiaXRzIHBlciBzYW1wbGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPj0gNCkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGTUlOKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSwgQVZQQUxFVFRFX1NJWkUpLzQ7IGkrKykKKyAgICAgICAgICAgIHMtPnBhbFtpXSA9IDB4RkZVPDwyNCB8IEFWX1JMMzIoYXZjdHgtPmV4dHJhZGF0YSs0KmkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNybGVfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIE1zcmxlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGlzdHJpZGUgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCphdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlLCAzMikgLyA4OworICAgIGludCByZXQ7CisKKyAgICBzLT5idWYgPSBidWY7CisgICAgcy0+c2l6ZSA9IGJ1Zl9zaXplOworCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPiAxICYmIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPD0gOCkgeworICAgICAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgTlVMTCk7CisKKyAgICAgICAgaWYgKHBhbCkgeworICAgICAgICAgICAgcy0+ZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgICAgICAgICAgbWVtY3B5KHMtPnBhbCwgcGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgIH0KKyAgICAgICAgLyogbWFrZSB0aGUgcGFsZXR0ZSBhdmFpbGFibGUgKi8KKyAgICAgICAgbWVtY3B5KHMtPmZyYW1lLT5kYXRhWzFdLCBzLT5wYWwsIEFWUEFMRVRURV9TSVpFKTsKKyAgICB9CisKKyAgICAvKiBGSVhNRSBob3cgdG8gY29ycmVjdGx5IGRldGVjdCBSTEUgPz8/ICovCisgICAgaWYgKGF2Y3R4LT5oZWlnaHQgKiBpc3RyaWRlID09IGF2cGt0LT5zaXplKSB7IC8qIGFzc3VtZSB1bmNvbXByZXNzZWQgKi8KKyAgICAgICAgaW50IGxpbmVzaXplID0gYXZfaW1hZ2VfZ2V0X2xpbmVzaXplKGF2Y3R4LT5waXhfZm10LCBhdmN0eC0+d2lkdGgsIDApOworICAgICAgICB1aW50OF90ICpwdHIgPSBzLT5mcmFtZS0+ZGF0YVswXTsKKyAgICAgICAgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGEgKyAoYXZjdHgtPmhlaWdodC0xKSppc3RyaWRlOworICAgICAgICBpbnQgaSwgajsKKworICAgICAgICBpZiAobGluZXNpemUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGxpbmVzaXplOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPndpZHRoIC0gMTsgaiArPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHB0cltqKzBdID0gYnVmW2o+PjFdID4+IDQ7CisgICAgICAgICAgICAgICAgICAgIHB0cltqKzFdID0gYnVmW2o+PjFdICYgMHhGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPndpZHRoICYgMSkKKyAgICAgICAgICAgICAgICAgICAgcHRyW2orMF0gPSBidWZbaj4+MV0gPj4gNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHB0ciwgYnVmLCBsaW5lc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYgLT0gaXN0cmlkZTsKKyAgICAgICAgICAgIHB0ciArPSBzLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZzLT5nYiwgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgIGZmX21zcmxlX2RlY29kZShhdmN0eCwgKEFWUGljdHVyZSopcy0+ZnJhbWUsIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsICZzLT5nYik7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqZ290X2ZyYW1lICAgICAgPSAxOworCisgICAgLyogcmVwb3J0IHRoYXQgdGhlIGJ1ZmZlciB3YXMgY29tcGxldGVseSBjb25zdW1lZCAqLworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG1zcmxlX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1zcmxlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICAvKiByZWxlYXNlIHRoZSBsYXN0IGZyYW1lICovCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbXNybGVfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXNybGUiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNaWNyb3NvZnQgUkxFIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01TUkxFLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNc3JsZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IG1zcmxlX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IG1zcmxlX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gbXNybGVfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXNybGVkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21zcmxlZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzZGE1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21zcmxlZGVjLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBNaWNyb3NvZnQgUkxFIGRlY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1TIFJMRSBkZWNvZGVyIGJhc2VkIG9uIGRlY29kZXIgYnkgTWlrZSBNZWxhbnNvbiBhbmQgbXkgb3duIGZvciBUU0NDCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTVMgUkxFIGZvcm1hdCwgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cubXVsdGltZWRpYS5jeC9tc3JsZS50eHQKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtc3JsZWRlYy5oIgorCitzdGF0aWMgaW50IG1zcmxlX2RlY29kZV9wYWw0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQaWN0dXJlICpwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJ5dGVDb250ZXh0ICpnYikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHJsZV9jb2RlOworICAgIHVuc2lnbmVkIGNoYXIgZXh0cmFfYnl0ZSwgb2RkX3BpeGVsOworICAgIHVuc2lnbmVkIGNoYXIgc3RyZWFtX2J5dGU7CisgICAgdW5zaWduZWQgaW50IHBpeGVsX3B0ciA9IDA7CisgICAgaW50IHJvd19kZWMgPSBwaWMtPmxpbmVzaXplWzBdOworICAgIGludCByb3dfcHRyID0gKGF2Y3R4LT5oZWlnaHQgLSAxKSAqIHJvd19kZWM7CisgICAgaW50IGZyYW1lX3NpemUgPSByb3dfZGVjICogYXZjdHgtPmhlaWdodDsKKyAgICBpbnQgaTsKKworICAgIHdoaWxlIChyb3dfcHRyID49IDApIHsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTVMgUkxFOiBieXRlc3RyZWFtIG92ZXJydW4sICVkIHJvd3MgbGVmdFxuIiwKKyAgICAgICAgICAgICAgICAgICByb3dfcHRyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHJsZV9jb2RlID0gc3RyZWFtX2J5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoZ2IpOworICAgICAgICBpZiAocmxlX2NvZGUgPT0gMCkgeworICAgICAgICAgICAgLyogZmV0Y2ggdGhlIG5leHQgYnl0ZSB0byBzZWUgaG93IHRvIGhhbmRsZSBlc2NhcGUgY29kZSAqLworICAgICAgICAgICAgc3RyZWFtX2J5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICBpZiAoc3RyZWFtX2J5dGUgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIGxpbmUgaXMgZG9uZSwgZ290byB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgICAgICByb3dfcHRyIC09IHJvd19kZWM7CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtX2J5dGUgPT0gMSkgeworICAgICAgICAgICAgICAgIC8qIGRlY29kZSBpcyBkb25lICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbV9ieXRlID09IDIpIHsKKyAgICAgICAgICAgICAgICAvKiByZXBvc2l0aW9uIGZyYW1lIGRlY29kZSBjb29yZGluYXRlcyAqLworICAgICAgICAgICAgICAgIHN0cmVhbV9ieXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSBzdHJlYW1fYnl0ZTsKKyAgICAgICAgICAgICAgICBzdHJlYW1fYnl0ZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgICAgICByb3dfcHRyIC09IHN0cmVhbV9ieXRlICogcm93X2RlYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY29weSBwaXhlbHMgZnJvbSBlbmNvZGVkIHN0cmVhbQorICAgICAgICAgICAgICAgIG9kZF9waXhlbCA9ICBzdHJlYW1fYnl0ZSAmIDE7CisgICAgICAgICAgICAgICAgcmxlX2NvZGUgPSAoc3RyZWFtX2J5dGUgKyAxKSAvIDI7CisgICAgICAgICAgICAgICAgZXh0cmFfYnl0ZSA9IHJsZV9jb2RlICYgMHgwMTsKKyAgICAgICAgICAgICAgICBpZiAocm93X3B0ciArIHBpeGVsX3B0ciArIHN0cmVhbV9ieXRlID4gZnJhbWVfc2l6ZSB8fAorICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCBybGVfY29kZSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJNUyBSTEU6IGZyYW1lL3N0cmVhbSBwdHIganVzdCB3ZW50IG91dCBvZiBib3VuZHMgKGNvcHkpXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJsZV9jb2RlOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsX3B0ciA+PSBhdmN0eC0+d2lkdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2J5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoZ2IpOworICAgICAgICAgICAgICAgICAgICBwaWMtPmRhdGFbMF1bcm93X3B0ciArIHBpeGVsX3B0cl0gPSBzdHJlYW1fYnl0ZSA+PiA0OworICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09IHJsZV9jb2RlICYmIG9kZF9waXhlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfcHRyID49IGF2Y3R4LT53aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBwaWMtPmRhdGFbMF1bcm93X3B0ciArIHBpeGVsX3B0cl0gPSBzdHJlYW1fYnl0ZSAmIDB4MEY7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0cisrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBSTEUgY29kZSBpcyBvZGQsIHNraXAgYSBieXRlIGluIHRoZSBzdHJlYW0KKyAgICAgICAgICAgICAgICBpZiAoZXh0cmFfYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBkZWNvZGUgYSBydW4gb2YgZGF0YQorICAgICAgICAgICAgaWYgKHJvd19wdHIgKyBwaXhlbF9wdHIgKyBzdHJlYW1fYnl0ZSA+IGZyYW1lX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk1TIFJMRTogZnJhbWUgcHRyIGp1c3Qgd2VudCBvdXQgb2YgYm91bmRzIChydW4pXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbV9ieXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJsZV9jb2RlOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGl4ZWxfcHRyID49IGF2Y3R4LT53aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKChpICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcGljLT5kYXRhWzBdW3Jvd19wdHIgKyBwaXhlbF9wdHJdID0gc3RyZWFtX2J5dGUgPj4gNDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBpYy0+ZGF0YVswXVtyb3dfcHRyICsgcGl4ZWxfcHRyXSA9IHN0cmVhbV9ieXRlICYgMHgwRjsKKyAgICAgICAgICAgICAgICBwaXhlbF9wdHIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG9uZSBsYXN0IHNhbml0eSBjaGVjayBvbiB0aGUgd2F5IG91dCAqLworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTVMgUkxFOiBlbmRlZCBmcmFtZSBkZWNvZGUgd2l0aCAlZCBieXRlcyBsZWZ0IG92ZXJcbiIsCisgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG1zcmxlX2RlY29kZV84XzE2XzI0XzMyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQaWN0dXJlICpwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXB0aCwgR2V0Qnl0ZUNvbnRleHQgKmdiKQoreworICAgIHVpbnQ4X3QgKm91dHB1dCwgKm91dHB1dF9lbmQ7CisgICAgaW50IHAxLCBwMiwgbGluZT1hdmN0eC0+aGVpZ2h0IC0gMSwgcG9zPTAsIGk7CisgICAgdWludDE2X3QgcGl4MTY7CisgICAgdWludDMyX3QgcGl4MzI7CisgICAgdW5zaWduZWQgaW50IHdpZHRoPSBGRkFCUyhwaWMtPmxpbmVzaXplWzBdKSAvIChkZXB0aCA+PiAzKTsKKworICAgIG91dHB1dCAgICAgPSBwaWMtPmRhdGFbMF0gKyAoYXZjdHgtPmhlaWdodCAtIDEpICogcGljLT5saW5lc2l6ZVswXTsKKyAgICBvdXRwdXRfZW5kID0gb3V0cHV0ICsgRkZBQlMocGljLT5saW5lc2l6ZVswXSk7CisKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID4gMCkgeworICAgICAgICBwMSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldShnYik7CisgICAgICAgIGlmKHAxID09IDApIHsgLy9Fc2NhcGUgY29kZQorICAgICAgICAgICAgcDIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICBpZihwMiA9PSAwKSB7IC8vRW5kLW9mLWxpbmUKKyAgICAgICAgICAgICAgICBpZiAoLS1saW5lIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoZ2IpID09IDEpIHsgLy8gZW5kLW9mLXBpY3R1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5leHQgbGluZSBpcyBiZXlvbmQgcGljdHVyZSBib3VuZHMgKCVkIGJ5dGVzIGxlZnQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBwaWMtPmRhdGFbMF0gKyBsaW5lICogcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICBvdXRwdXRfZW5kID0gb3V0cHV0ICsgRkZBQlMocGljLT5saW5lc2l6ZVswXSk7CisgICAgICAgICAgICAgICAgcG9zID0gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihwMiA9PSAxKSB7IC8vRW5kLW9mLXBpY3R1cmUKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZihwMiA9PSAyKSB7IC8vU2tpcAorICAgICAgICAgICAgICAgIHAxID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgICAgIHAyID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgICAgIGxpbmUgLT0gcDI7CisgICAgICAgICAgICAgICAgcG9zICs9IHAxOworICAgICAgICAgICAgICAgIGlmIChsaW5lIDwgMCB8fCBwb3MgPj0gd2lkdGgpeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNraXAgYmV5b25kIHBpY3R1cmUgYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBwaWMtPmRhdGFbMF0gKyBsaW5lICogcGljLT5saW5lc2l6ZVswXSArIHBvcyAqIChkZXB0aCA+PiAzKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRfZW5kID0gcGljLT5kYXRhWzBdICsgbGluZSAqIHBpYy0+bGluZXNpemVbMF0gKyBGRkFCUyhwaWMtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENvcHkgZGF0YQorICAgICAgICAgICAgaWYgKG91dHB1dCArIHAyICogKGRlcHRoID4+IDMpID4gb3V0cHV0X2VuZCkgeworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIDIgKiAoZGVwdGggPj4gMykpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCBwMiAqIChkZXB0aCA+PiAzKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYnl0ZXN0cmVhbSBvdmVycnVuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChkZXB0aCA9PSA4KSB8fCAoZGVwdGggPT0gMjQpKSB7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcnUoZ2IsIG91dHB1dCwgcDIgKiAoZGVwdGggPj4gMykpOworICAgICAgICAgICAgICAgIG91dHB1dCArPSBwMiAqIChkZXB0aCA+PiAzKTsKKworICAgICAgICAgICAgICAgIC8vIFJMRTggY29weSBpcyBhY3R1YWxseSBwYWRkZWQgLSBhbmQgcnVucyBhcmUgbm90IQorICAgICAgICAgICAgICAgIGlmKGRlcHRoID09IDggJiYgKHAyICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgeworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgKih1aW50MTZfdCopb3V0cHV0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KGdiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAzMikgeworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCopb3V0cHV0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzJ1KGdiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zICs9IHAyOworICAgICAgICB9IGVsc2UgeyAvL3J1biBvZiBwaXhlbHMKKyAgICAgICAgICAgIHVpbnQ4X3QgcGl4WzNdOyAvL29yaWdpbmFsIHBpeGVsCisgICAgICAgICAgICBpZiAob3V0cHV0ICsgcDEgKiAoZGVwdGggPj4gMykgPiBvdXRwdXRfZW5kKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBzd2l0Y2goZGVwdGgpeworICAgICAgICAgICAgY2FzZSAgODoKKyAgICAgICAgICAgICAgICBwaXhbMF0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICAgICAgbWVtc2V0KG91dHB1dCwgcGl4WzBdLCBwMSk7CisgICAgICAgICAgICAgICAgb3V0cHV0ICs9IHAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICBwaXgxNiAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYik7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcDE7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50MTZfdCopb3V0cHV0ID0gcGl4MTY7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgIHBpeFswXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgICAgICBwaXhbMV0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICAgICAgcGl4WzJdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IHBpeFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IHBpeFsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IHBpeFsyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgIHBpeDMyICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiKTsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBwMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilvdXRwdXQgPSBwaXgzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcyArPSBwMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJNUyBSTEUgd2FybmluZzogbm8gZW5kLW9mLXBpY3R1cmUgY29kZVxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IGZmX21zcmxlX2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGljdHVyZSAqcGljLAorICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgsIEdldEJ5dGVDb250ZXh0ICpnYikKK3sKKyAgICBzd2l0Y2goZGVwdGgpeworICAgIGNhc2UgIDQ6CisgICAgICAgIHJldHVybiBtc3JsZV9kZWNvZGVfcGFsNChhdmN0eCwgcGljLCBnYik7CisgICAgY2FzZSAgODoKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMjQ6CisgICAgY2FzZSAzMjoKKyAgICAgICAgcmV0dXJuIG1zcmxlX2RlY29kZV84XzE2XzI0XzMyKGF2Y3R4LCBwaWMsIGRlcHRoLCBnYik7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGRlcHRoICVkXG4iLCBkZXB0aCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tc3JsZWRlYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNybGVkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjY2NjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNybGVkZWMuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogTWljcm9zb2Z0IFJMRSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTVNSTEVERUNfSAorI2RlZmluZSBBVkNPREVDX01TUkxFREVDX0gKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisKKy8qKgorICogRGVjb2RlIHN0cmVhbSBpbiBNUyBSTEUgZm9ybWF0IGludG8gZnJhbWUuCisgKgorICogQHBhcmFtIGF2Y3R4ICAgICBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW0gcGljICAgICAgIGRlc3RpbmF0aW9uIGZyYW1lCisgKiBAcGFyYW0gZGVwdGggICAgIGJpdCBkZXB0aAorICogQHBhcmFtIGdiICAgICAgICBpbnB1dCBieXRlc3RyZWFtIGNvbnRleHQKKyAqLworaW50IGZmX21zcmxlX2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGljdHVyZSAqcGljLAorICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgsIEdldEJ5dGVDb250ZXh0ICpnYik7CisKKyNlbmRpZiAvKiBBVkNPREVDX01TUkxFREVDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21zczEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21zczEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWI2N2RmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNzMS5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogTWljcm9zb2Z0IFNjcmVlbiAxIChha2EgV2luZG93cyBNZWRpYSBWaWRlbyBWNyBTY3JlZW4pIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1pY3Jvc29mdCBTY3JlZW4gMSAoYWthIFdpbmRvd3MgTWVkaWEgVmlkZW8gVjcgU2NyZWVuKSBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1zczEyLmgiCisKK3R5cGVkZWYgc3RydWN0IE1TUzFDb250ZXh0IHsKKyAgICBNU1MxMkNvbnRleHQgICBjdHg7CisgICAgQVZGcmFtZSAgICAgICAqcGljOworICAgIFNsaWNlQ29udGV4dCAgIHNjOworfSBNU1MxQ29udGV4dDsKKworc3RhdGljIHZvaWQgYXJpdGhfbm9ybWFsaXNlKEFyaXRoQ29kZXIgKmMpCit7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoYy0+aGlnaCA+PSAweDgwMDApIHsKKyAgICAgICAgICAgIGlmIChjLT5sb3cgPCAweDgwMDApIHsKKyAgICAgICAgICAgICAgICBpZiAoYy0+bG93ID49IDB4NDAwMCAmJiBjLT5oaWdoIDwgMHhDMDAwKSB7CisgICAgICAgICAgICAgICAgICAgIGMtPnZhbHVlIC09IDB4NDAwMDsKKyAgICAgICAgICAgICAgICAgICAgYy0+bG93ICAgLT0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICBjLT5oaWdoICAtPSAweDQwMDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYy0+dmFsdWUgLT0gMHg4MDAwOworICAgICAgICAgICAgICAgIGMtPmxvdyAgIC09IDB4ODAwMDsKKyAgICAgICAgICAgICAgICBjLT5oaWdoICAtPSAweDgwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYy0+dmFsdWUgPDw9IDE7CisgICAgICAgIGMtPmxvdyAgIDw8PSAxOworICAgICAgICBjLT5oaWdoICA8PD0gMTsKKyAgICAgICAgYy0+aGlnaCAgIHw9IDE7CisgICAgICAgIGMtPnZhbHVlICB8PSBnZXRfYml0czEoYy0+Z2JjLmdiKTsKKyAgICB9Cit9CisKK0FSSVRIX0dFVF9CSVQoYXJpdGgpCisKK3N0YXRpYyBpbnQgYXJpdGhfZ2V0X2JpdHMoQXJpdGhDb2RlciAqYywgaW50IGJpdHMpCit7CisgICAgaW50IHJhbmdlID0gYy0+aGlnaCAtIGMtPmxvdyArIDE7CisgICAgaW50IHZhbCAgID0gKCgoYy0+dmFsdWUgLSBjLT5sb3cgKyAxKSA8PCBiaXRzKSAtIDEpIC8gcmFuZ2U7CisgICAgaW50IHByb2IgID0gcmFuZ2UgKiB2YWw7CisKKyAgICBjLT5oaWdoICAgPSAoKHByb2IgKyByYW5nZSkgPj4gYml0cykgKyBjLT5sb3cgLSAxOworICAgIGMtPmxvdyAgICs9IHByb2IgPj4gYml0czsKKworICAgIGFyaXRoX25vcm1hbGlzZShjKTsKKworICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgYXJpdGhfZ2V0X251bWJlcihBcml0aENvZGVyICpjLCBpbnQgbW9kX3ZhbCkKK3sKKyAgICBpbnQgcmFuZ2UgPSBjLT5oaWdoIC0gYy0+bG93ICsgMTsKKyAgICBpbnQgdmFsICAgPSAoKGMtPnZhbHVlIC0gYy0+bG93ICsgMSkgKiBtb2RfdmFsIC0gMSkgLyByYW5nZTsKKyAgICBpbnQgcHJvYiAgPSByYW5nZSAqIHZhbDsKKworICAgIGMtPmhpZ2ggICA9IChwcm9iICsgcmFuZ2UpIC8gbW9kX3ZhbCArIGMtPmxvdyAtIDE7CisgICAgYy0+bG93ICAgKz0gcHJvYiAvIG1vZF92YWw7CisKKyAgICBhcml0aF9ub3JtYWxpc2UoYyk7CisKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IGFyaXRoX2dldF9wcm9iKEFyaXRoQ29kZXIgKmMsIGludDE2X3QgKnByb2JzKQoreworICAgIGludCByYW5nZSA9IGMtPmhpZ2ggLSBjLT5sb3cgKyAxOworICAgIGludCB2YWwgICA9ICgoYy0+dmFsdWUgLSBjLT5sb3cgKyAxKSAqIHByb2JzWzBdIC0gMSkgLyByYW5nZTsKKyAgICBpbnQgc3ltICAgPSAxOworCisgICAgd2hpbGUgKHByb2JzW3N5bV0gPiB2YWwpCisgICAgICAgIHN5bSsrOworCisgICAgYy0+aGlnaCA9IHJhbmdlICogcHJvYnNbc3ltIC0gMV0gLyBwcm9ic1swXSArIGMtPmxvdyAtIDE7CisgICAgYy0+bG93ICs9IHJhbmdlICogcHJvYnNbc3ltXSAgICAgLyBwcm9ic1swXTsKKworICAgIHJldHVybiBzeW07Cit9CisKK0FSSVRIX0dFVF9NT0RFTF9TWU0oYXJpdGgpCisKK3N0YXRpYyB2b2lkIGFyaXRoX2luaXQoQXJpdGhDb2RlciAqYywgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgYy0+bG93ICAgICAgICAgICA9IDA7CisgICAgYy0+aGlnaCAgICAgICAgICA9IDB4RkZGRjsKKyAgICBjLT52YWx1ZSAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDE2KTsKKyAgICBjLT5nYmMuZ2IgICAgICAgID0gZ2I7CisgICAgYy0+Z2V0X21vZGVsX3N5bSA9IGFyaXRoX2dldF9tb2RlbF9zeW07CisgICAgYy0+Z2V0X251bWJlciAgICA9IGFyaXRoX2dldF9udW1iZXI7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3BhbChNU1MxMkNvbnRleHQgKmN0eCwgQXJpdGhDb2RlciAqYWNvZGVyKQoreworICAgIGludCBpLCBuY29sLCByLCBnLCBiOworICAgIHVpbnQzMl90ICpwYWwgPSBjdHgtPnBhbCArIDI1NiAtIGN0eC0+ZnJlZV9jb2xvdXJzOworCisgICAgaWYgKCFjdHgtPmZyZWVfY29sb3VycykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBuY29sID0gYXJpdGhfZ2V0X251bWJlcihhY29kZXIsIGN0eC0+ZnJlZV9jb2xvdXJzICsgMSk7CisgICAgZm9yIChpID0gMDsgaSA8IG5jb2w7IGkrKykgeworICAgICAgICByID0gYXJpdGhfZ2V0X2JpdHMoYWNvZGVyLCA4KTsKKyAgICAgICAgZyA9IGFyaXRoX2dldF9iaXRzKGFjb2RlciwgOCk7CisgICAgICAgIGIgPSBhcml0aF9nZXRfYml0cyhhY29kZXIsIDgpOworICAgICAgICAqcGFsKysgPSAoMHhGRlUgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworICAgIH0KKworICAgIHJldHVybiAhIW5jb2w7Cit9CisKK3N0YXRpYyBpbnQgbXNzMV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIE1TUzFDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1TUzEyQ29udGV4dCAqYyA9ICZjdHgtPmN0eDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIEFyaXRoQ29kZXIgYWNvZGVyOworICAgIGludCBwYWxfY2hhbmdlZCA9IDA7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhcml0aF9pbml0KCZhY29kZXIsICZnYik7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgY3R4LT5waWMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBjLT5wYWxfcGljICAgID0gIGN0eC0+cGljLT5kYXRhWzBdICsgY3R4LT5waWMtPmxpbmVzaXplWzBdICogKGF2Y3R4LT5oZWlnaHQgLSAxKTsKKyAgICBjLT5wYWxfc3RyaWRlID0gLWN0eC0+cGljLT5saW5lc2l6ZVswXTsKKyAgICBjLT5rZXlmcmFtZSAgID0gIWFyaXRoX2dldF9iaXQoJmFjb2Rlcik7CisgICAgaWYgKGMtPmtleWZyYW1lKSB7CisgICAgICAgIGMtPmNvcnJ1cHRlZCA9IDA7CisgICAgICAgIGZmX21zczEyX3NsaWNlY29udGV4dF9yZXNldCgmY3R4LT5zYyk7CisgICAgICAgIHBhbF9jaGFuZ2VkICAgICAgICA9IGRlY29kZV9wYWwoYywgJmFjb2Rlcik7CisgICAgICAgIGN0eC0+cGljLT5rZXlfZnJhbWUgPSAxOworICAgICAgICBjdHgtPnBpYy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGMtPmNvcnJ1cHRlZCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBjdHgtPnBpYy0+a2V5X2ZyYW1lID0gMDsKKyAgICAgICAgY3R4LT5waWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgIH0KKyAgICBjLT5jb3JydXB0ZWQgPSBmZl9tc3MxMl9kZWNvZGVfcmVjdCgmY3R4LT5zYywgJmFjb2RlciwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworICAgIGlmIChjLT5jb3JydXB0ZWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIG1lbWNweShjdHgtPnBpYy0+ZGF0YVsxXSwgYy0+cGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgY3R4LT5waWMtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSBwYWxfY2hhbmdlZDsKKworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIGN0eC0+cGljKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9mcmFtZSAgICAgID0gMTsKKworICAgIC8qIGFsd2F5cyByZXBvcnQgdGhhdCB0aGUgYnVmZmVyIHdhcyBjb21wbGV0ZWx5IGNvbnN1bWVkICovCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbXNzMV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTVNTMUNvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgYy0+Y3R4LmF2Y3R4ICAgICAgID0gYXZjdHg7CisKKyAgICBjLT5waWMgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYy0+cGljKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gZmZfbXNzMTJfZGVjb2RlX2luaXQoJmMtPmN0eCwgMCwgJmMtPnNjLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmYy0+cGljKTsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG1zczFfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTVNTMUNvbnRleHQgKiBjb25zdCBjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmY3R4LT5waWMpOworICAgIGZmX21zczEyX2RlY29kZV9lbmQoJmN0eC0+Y3R4KTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX21zczFfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXNzMSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1TIFNjcmVlbiAxIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01TUzEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1TUzFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBtc3MxX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IG1zczFfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBtc3MxX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21zczEyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tc3MxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTRkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tc3MxMi5jCkBAIC0wLDAgKzEsNjgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ29tbW9uIGZ1bmN0aW9ucyBmb3IgTWljcm9zb2Z0IFNjcmVlbiAxIGFuZCAyCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1zczEyLmgiCisKK2VudW0gU3BsaXRNb2RlIHsKKyAgICBTUExJVF9WRVJUID0gMCwKKyAgICBTUExJVF9IT1IsCisgICAgU1BMSVRfTk9ORQorfTsKKworc3RhdGljIGNvbnN0IGludCBzZWNfb3JkZXJfc2l6ZXNbNF0gPSB7IDEsIDcsIDYsIDEgfTsKKworZW51bSBDb250ZXh0RGlyZWN0aW9uIHsKKyAgICBUT1BfTEVGVCA9IDAsCisgICAgVE9QLAorICAgIFRPUF9SSUdIVCwKKyAgICBMRUZUCit9OworCitzdGF0aWMgaW50IG1vZGVsX2NhbGNfdGhyZXNob2xkKE1vZGVsICptKQoreworICAgIGludCB0aHI7CisKKyAgICB0aHIgPSAyICogbS0+d2VpZ2h0c1ttLT5udW1fc3ltc10gLSAxOworICAgIHRociA9ICgodGhyID4+IDEpICsgNCAqIG0tPmN1bV9wcm9iWzBdKSAvIHRocjsKKworICAgIHJldHVybiBGRk1JTih0aHIsIDB4M0ZGRik7Cit9CisKK3N0YXRpYyB2b2lkIG1vZGVsX3Jlc2V0KE1vZGVsICptKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8PSBtLT5udW1fc3ltczsgaSsrKSB7CisgICAgICAgIG0tPndlaWdodHNbaV0gID0gMTsKKyAgICAgICAgbS0+Y3VtX3Byb2JbaV0gPSBtLT5udW1fc3ltcyAtIGk7CisgICAgfQorICAgIG0tPndlaWdodHNbMF0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBtLT5udW1fc3ltczsgaSsrKQorICAgICAgICBtLT5pZHgyc3ltW2kgKyAxXSA9IGk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgbW9kZWxfaW5pdChNb2RlbCAqbSwgaW50IG51bV9zeW1zLCBpbnQgdGhyX3dlaWdodCkKK3sKKyAgICBtLT5udW1fc3ltcyAgID0gbnVtX3N5bXM7CisgICAgbS0+dGhyX3dlaWdodCA9IHRocl93ZWlnaHQ7CisgICAgbS0+dGhyZXNob2xkICA9IG51bV9zeW1zICogdGhyX3dlaWdodDsKK30KKworc3RhdGljIHZvaWQgbW9kZWxfcmVzY2FsZV93ZWlnaHRzKE1vZGVsICptKQoreworICAgIGludCBpOworICAgIGludCBjdW1fcHJvYjsKKworICAgIGlmIChtLT50aHJfd2VpZ2h0ID09IFRIUkVTSF9BREFQVElWRSkKKyAgICAgICAgbS0+dGhyZXNob2xkID0gbW9kZWxfY2FsY190aHJlc2hvbGQobSk7CisgICAgd2hpbGUgKG0tPmN1bV9wcm9iWzBdID4gbS0+dGhyZXNob2xkKSB7CisgICAgICAgIGN1bV9wcm9iID0gMDsKKyAgICAgICAgZm9yIChpID0gbS0+bnVtX3N5bXM7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtLT5jdW1fcHJvYltpXSA9IGN1bV9wcm9iOworICAgICAgICAgICAgbS0+d2VpZ2h0c1tpXSAgPSAobS0+d2VpZ2h0c1tpXSArIDEpID4+IDE7CisgICAgICAgICAgICBjdW1fcHJvYiAgICAgICs9IG0tPndlaWdodHNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZmZfbXNzMTJfbW9kZWxfdXBkYXRlKE1vZGVsICptLCBpbnQgdmFsKQoreworICAgIGludCBpOworCisgICAgaWYgKG0tPndlaWdodHNbdmFsXSA9PSBtLT53ZWlnaHRzW3ZhbCAtIDFdKSB7CisgICAgICAgIGZvciAoaSA9IHZhbDsgbS0+d2VpZ2h0c1tpIC0gMV0gPT0gbS0+d2VpZ2h0c1t2YWxdOyBpLS0pOworICAgICAgICBpZiAoaSAhPSB2YWwpIHsKKyAgICAgICAgICAgIGludCBzeW0xLCBzeW0yOworCisgICAgICAgICAgICBzeW0xID0gbS0+aWR4MnN5bVt2YWxdOworICAgICAgICAgICAgc3ltMiA9IG0tPmlkeDJzeW1baV07CisKKyAgICAgICAgICAgIG0tPmlkeDJzeW1bdmFsXSAgPSBzeW0yOworICAgICAgICAgICAgbS0+aWR4MnN5bVtpXSAgICA9IHN5bTE7CisKKyAgICAgICAgICAgIHZhbCA9IGk7CisgICAgICAgIH0KKyAgICB9CisgICAgbS0+d2VpZ2h0c1t2YWxdKys7CisgICAgZm9yIChpID0gdmFsIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgIG0tPmN1bV9wcm9iW2ldKys7CisgICAgbW9kZWxfcmVzY2FsZV93ZWlnaHRzKG0pOworfQorCitzdGF0aWMgdm9pZCBwaXhjdHhfcmVzZXQoUGl4Q29udGV4dCAqY3R4KQoreworICAgIGludCBpLCBqOworCisgICAgaWYgKCFjdHgtPnNwZWNpYWxfaW5pdGlhbF9jYWNoZSkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+Y2FjaGVfc2l6ZTsgaSsrKQorICAgICAgICAgICAgY3R4LT5jYWNoZVtpXSA9IGk7CisgICAgZWxzZSB7CisgICAgICAgIGN0eC0+Y2FjaGVbMF0gPSAxOworICAgICAgICBjdHgtPmNhY2hlWzFdID0gMjsKKyAgICAgICAgY3R4LT5jYWNoZVsyXSA9IDQ7CisgICAgfQorCisgICAgbW9kZWxfcmVzZXQoJmN0eC0+Y2FjaGVfbW9kZWwpOworICAgIG1vZGVsX3Jlc2V0KCZjdHgtPmZ1bGxfbW9kZWwpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICBtb2RlbF9yZXNldCgmY3R4LT5zZWNfbW9kZWxzW2ldW2pdKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBwaXhjdHhfaW5pdChQaXhDb250ZXh0ICpjdHgsIGludCBjYWNoZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnVsbF9tb2RlbF9zeW1zLCBpbnQgc3BlY2lhbF9pbml0aWFsX2NhY2hlKQoreworICAgIGludCBpLCBqLCBrLCBpZHg7CisKKyAgICBjdHgtPmNhY2hlX3NpemUgICAgICAgICAgICA9IGNhY2hlX3NpemUgKyA0OworICAgIGN0eC0+bnVtX3N5bXMgICAgICAgICAgICAgID0gY2FjaGVfc2l6ZTsKKyAgICBjdHgtPnNwZWNpYWxfaW5pdGlhbF9jYWNoZSA9IHNwZWNpYWxfaW5pdGlhbF9jYWNoZTsKKworICAgIG1vZGVsX2luaXQoJmN0eC0+Y2FjaGVfbW9kZWwsIGN0eC0+bnVtX3N5bXMgKyAxLCBUSFJFU0hfTE9XKTsKKyAgICBtb2RlbF9pbml0KCZjdHgtPmZ1bGxfbW9kZWwsIGZ1bGxfbW9kZWxfc3ltcywgVEhSRVNIX0hJR0gpOworCisgICAgZm9yIChpID0gMCwgaWR4ID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNlY19vcmRlcl9zaXplc1tpXTsgaisrLCBpZHgrKykKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCisgICAgICAgICAgICAgICAgbW9kZWxfaW5pdCgmY3R4LT5zZWNfbW9kZWxzW2lkeF1ba10sIDIgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA/IFRIUkVTSF9MT1cgOiBUSFJFU0hfQURBUFRJVkUpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZGVjb2RlX3BpeGVsKEFyaXRoQ29kZXIgKmFjb2RlciwgUGl4Q29udGV4dCAqcGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbmdiLCBpbnQgbnVtX25nYiwgaW50IGFueV9uZ2IpCit7CisgICAgaW50IGksIHZhbCwgcGl4OworCisgICAgdmFsID0gYWNvZGVyLT5nZXRfbW9kZWxfc3ltKGFjb2RlciwgJnBjdHgtPmNhY2hlX21vZGVsKTsKKyAgICBpZiAodmFsIDwgcGN0eC0+bnVtX3N5bXMpIHsKKyAgICAgICAgaWYgKGFueV9uZ2IpIHsKKyAgICAgICAgICAgIGludCBpZHgsIGo7CisKKyAgICAgICAgICAgIGlkeCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGN0eC0+Y2FjaGVfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9uZ2I7IGorKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBjdHgtPmNhY2hlW2ldID09IG5nYltqXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChqID09IG51bV9uZ2IpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSB2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsID0gRkZNSU4oaSwgcGN0eC0+Y2FjaGVfc2l6ZSAtIDEpOworICAgICAgICB9CisgICAgICAgIHBpeCA9IHBjdHgtPmNhY2hlW3ZhbF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGl4ID0gYWNvZGVyLT5nZXRfbW9kZWxfc3ltKGFjb2RlciwgJnBjdHgtPmZ1bGxfbW9kZWwpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGN0eC0+Y2FjaGVfc2l6ZSAtIDE7IGkrKykKKyAgICAgICAgICAgIGlmIChwY3R4LT5jYWNoZVtpXSA9PSBwaXgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHZhbCA9IGk7CisgICAgfQorICAgIGlmICh2YWwpIHsKKyAgICAgICAgZm9yIChpID0gdmFsOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgcGN0eC0+Y2FjaGVbaV0gPSBwY3R4LT5jYWNoZVtpIC0gMV07CisgICAgICAgIHBjdHgtPmNhY2hlWzBdID0gcGl4OworICAgIH0KKworICAgIHJldHVybiBwaXg7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3BpeGVsX2luX2NvbnRleHQoQXJpdGhDb2RlciAqYWNvZGVyLCBQaXhDb250ZXh0ICpwY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19yaWdodCkKK3sKKyAgICB1aW50OF90IG5laWdoYm91cnNbNF07CisgICAgdWludDhfdCByZWZfcGl4WzRdOworICAgIGludCBubGVuOworICAgIGludCBsYXllciA9IDAsIHN1YjsKKyAgICBpbnQgcGl4OworICAgIGludCBpLCBqOworCisgICAgaWYgKCF5KSB7CisgICAgICAgIG1lbXNldChuZWlnaGJvdXJzLCBzcmNbLTFdLCA0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZWlnaGJvdXJzW1RPUF0gPSBzcmNbLXN0cmlkZV07CisgICAgICAgIGlmICgheCkgeworICAgICAgICAgICAgbmVpZ2hib3Vyc1tUT1BfTEVGVF0gPSBuZWlnaGJvdXJzW0xFRlRdID0gbmVpZ2hib3Vyc1tUT1BdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmVpZ2hib3Vyc1tUT1BfTEVGVF0gPSBzcmNbLXN0cmlkZSAtIDFdOworICAgICAgICAgICAgbmVpZ2hib3Vyc1sgICAgTEVGVF0gPSBzcmNbLTFdOworICAgICAgICB9CisgICAgICAgIGlmIChoYXNfcmlnaHQpCisgICAgICAgICAgICBuZWlnaGJvdXJzW1RPUF9SSUdIVF0gPSBzcmNbLXN0cmlkZSArIDFdOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuZWlnaGJvdXJzW1RPUF9SSUdIVF0gPSBuZWlnaGJvdXJzW1RPUF07CisgICAgfQorCisgICAgc3ViID0gMDsKKyAgICBpZiAoeCA+PSAyICYmIHNyY1stMl0gPT0gbmVpZ2hib3Vyc1tMRUZUXSkKKyAgICAgICAgc3ViICA9IDE7CisgICAgaWYgKHkgPj0gMiAmJiBzcmNbLTIgKiBzdHJpZGVdID09IG5laWdoYm91cnNbVE9QXSkKKyAgICAgICAgc3ViIHw9IDI7CisKKyAgICBubGVuID0gMTsKKyAgICByZWZfcGl4WzBdID0gbmVpZ2hib3Vyc1swXTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBubGVuOyBqKyspCisgICAgICAgICAgICBpZiAocmVmX3BpeFtqXSA9PSBuZWlnaGJvdXJzW2ldKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoaiA9PSBubGVuKQorICAgICAgICAgICAgcmVmX3BpeFtubGVuKytdID0gbmVpZ2hib3Vyc1tpXTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5sZW4pIHsKKyAgICBjYXNlIDE6CisgICAgICAgIGxheWVyID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAobmVpZ2hib3Vyc1tUT1BdID09IG5laWdoYm91cnNbVE9QX0xFRlRdKSB7CisgICAgICAgICAgICBpZiAobmVpZ2hib3Vyc1tUT1BfUklHSFRdID09IG5laWdoYm91cnNbVE9QX0xFRlRdKQorICAgICAgICAgICAgICAgIGxheWVyID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG5laWdoYm91cnNbTEVGVF0gPT0gbmVpZ2hib3Vyc1tUT1BfTEVGVF0pCisgICAgICAgICAgICAgICAgbGF5ZXIgPSAyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxheWVyID0gMzsKKyAgICAgICAgfSBlbHNlIGlmIChuZWlnaGJvdXJzW1RPUF9SSUdIVF0gPT0gbmVpZ2hib3Vyc1tUT1BfTEVGVF0pIHsKKyAgICAgICAgICAgIGlmIChuZWlnaGJvdXJzW0xFRlRdID09IG5laWdoYm91cnNbVE9QX0xFRlRdKQorICAgICAgICAgICAgICAgIGxheWVyID0gNDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsYXllciA9IDU7CisgICAgICAgIH0gZWxzZSBpZiAobmVpZ2hib3Vyc1tMRUZUXSA9PSBuZWlnaGJvdXJzW1RPUF9MRUZUXSkgeworICAgICAgICAgICAgbGF5ZXIgPSA2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGF5ZXIgPSA3OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKG5laWdoYm91cnNbVE9QXSA9PSBuZWlnaGJvdXJzW1RPUF9MRUZUXSkKKyAgICAgICAgICAgIGxheWVyID0gODsKKyAgICAgICAgZWxzZSBpZiAobmVpZ2hib3Vyc1tUT1BfUklHSFRdID09IG5laWdoYm91cnNbVE9QX0xFRlRdKQorICAgICAgICAgICAgbGF5ZXIgPSA5OworICAgICAgICBlbHNlIGlmIChuZWlnaGJvdXJzW0xFRlRdID09IG5laWdoYm91cnNbVE9QX0xFRlRdKQorICAgICAgICAgICAgbGF5ZXIgPSAxMDsKKyAgICAgICAgZWxzZSBpZiAobmVpZ2hib3Vyc1tUT1BfUklHSFRdID09IG5laWdoYm91cnNbVE9QXSkKKyAgICAgICAgICAgIGxheWVyID0gMTE7CisgICAgICAgIGVsc2UgaWYgKG5laWdoYm91cnNbVE9QXSA9PSBuZWlnaGJvdXJzW0xFRlRdKQorICAgICAgICAgICAgbGF5ZXIgPSAxMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGF5ZXIgPSAxMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBsYXllciA9IDE0OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBwaXggPSBhY29kZXItPmdldF9tb2RlbF9zeW0oYWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGN0eC0+c2VjX21vZGVsc1tsYXllcl1bc3ViXSk7CisgICAgaWYgKHBpeCA8IG5sZW4pCisgICAgICAgIHJldHVybiByZWZfcGl4W3BpeF07CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZGVjb2RlX3BpeGVsKGFjb2RlciwgcGN0eCwgcmVmX3BpeCwgbmxlbiwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3JlZ2lvbihBcml0aENvZGVyICphY29kZXIsIHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqcmdiX3BpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdiX3N0cmlkZSwgUGl4Q29udGV4dCAqcGN0eCwgY29uc3QgdWludDMyX3QgKnBhbCkKK3sKKyAgICBpbnQgaSwgaiwgcDsKKyAgICB1aW50OF90ICpyZ2JfZHN0ID0gcmdiX3BpYyArIHggKiAzICsgeSAqIHJnYl9zdHJpZGU7CisKKyAgICBkc3QgKz0geCArIHkgKiBzdHJpZGU7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghaSAmJiAhaikKKyAgICAgICAgICAgICAgICBwID0gZGVjb2RlX3BpeGVsKGFjb2RlciwgcGN0eCwgTlVMTCwgMCwgMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcCA9IGRlY29kZV9waXhlbF9pbl9jb250ZXh0KGFjb2RlciwgcGN0eCwgZHN0ICsgaSwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBqLCB3aWR0aCAtIGkgLSAxKTsKKyAgICAgICAgICAgIGRzdFtpXSA9IHA7CisKKyAgICAgICAgICAgIGlmIChyZ2JfcGljKQorICAgICAgICAgICAgICAgIEFWX1dCMjQocmdiX2RzdCArIGkgKiAzLCBwYWxbcF0pOworICAgICAgICB9CisgICAgICAgIGRzdCAgICAgKz0gc3RyaWRlOworICAgICAgICByZ2JfZHN0ICs9IHJnYl9zdHJpZGU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfcmVjdGFuZ2xlcyhNU1MxMkNvbnRleHQgY29uc3QgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IGo7CisKKyAgICBpZiAoYy0+bGFzdF9yZ2JfcGljKQorICAgICAgICBmb3IgKGogPSB5OyBqIDwgeSArIGhlaWdodDsgaisrKSB7CisgICAgICAgICAgICBtZW1jcHkoYy0+cmdiX3BpYyAgICAgICsgaiAqIGMtPnJnYl9zdHJpZGUgKyB4ICogMywKKyAgICAgICAgICAgICAgICAgICBjLT5sYXN0X3JnYl9waWMgKyBqICogYy0+cmdiX3N0cmlkZSArIHggKiAzLAorICAgICAgICAgICAgICAgICAgIHdpZHRoICogMyk7CisgICAgICAgICAgICBtZW1jcHkoYy0+cGFsX3BpYyAgICAgICsgaiAqIGMtPnBhbF9zdHJpZGUgKyB4LAorICAgICAgICAgICAgICAgICAgIGMtPmxhc3RfcGFsX3BpYyArIGogKiBjLT5wYWxfc3RyaWRlICsgeCwKKyAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBtb3Rpb25fY29tcGVuc2F0aW9uKE1TUzEyQ29udGV4dCBjb25zdCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpZiAoeCArIGMtPm12WCA8IDAgfHwgeCArIGMtPm12WCArIHdpZHRoICA+IGMtPmF2Y3R4LT53aWR0aCAgfHwKKyAgICAgICAgeSArIGMtPm12WSA8IDAgfHwgeSArIGMtPm12WSArIGhlaWdodCA+IGMtPmF2Y3R4LT5oZWlnaHQgfHwKKyAgICAgICAgIWMtPnJnYl9waWMpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlIHsKKyAgICAgICAgdWludDhfdCAqZHN0ICAgICA9IGMtPnBhbF9waWMgKyB4ICAgICArIHkgKiBjLT5wYWxfc3RyaWRlOworICAgICAgICB1aW50OF90ICpyZ2JfZHN0ID0gYy0+cmdiX3BpYyArIHggKiAzICsgeSAqIGMtPnJnYl9zdHJpZGU7CisgICAgICAgIHVpbnQ4X3QgKnNyYzsKKyAgICAgICAgdWludDhfdCAqcmdiX3NyYzsKKyAgICAgICAgaW50IGo7CisgICAgICAgIHggKz0gYy0+bXZYOworICAgICAgICB5ICs9IGMtPm12WTsKKyAgICAgICAgaWYgKGMtPmxhc3RfcmdiX3BpYykgeworICAgICAgICAgICAgc3JjICAgICA9IGMtPmxhc3RfcGFsX3BpYyArIHggKyAgICAgeSAqIGMtPnBhbF9zdHJpZGU7CisgICAgICAgICAgICByZ2Jfc3JjID0gYy0+bGFzdF9yZ2JfcGljICsgeCAqIDMgKyB5ICogYy0+cmdiX3N0cmlkZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyYyAgICAgPSBjLT5wYWxfcGljICsgeCAgICAgKyB5ICogYy0+cGFsX3N0cmlkZTsKKyAgICAgICAgICAgIHJnYl9zcmMgPSBjLT5yZ2JfcGljICsgeCAqIDMgKyB5ICogYy0+cmdiX3N0cmlkZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICAgIG1lbW1vdmUoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgICAgIG1lbW1vdmUocmdiX2RzdCwgcmdiX3NyYywgd2lkdGggKiAzKTsKKyAgICAgICAgICAgIGRzdCAgICAgKz0gYy0+cGFsX3N0cmlkZTsKKyAgICAgICAgICAgIHNyYyAgICAgKz0gYy0+cGFsX3N0cmlkZTsKKyAgICAgICAgICAgIHJnYl9kc3QgKz0gYy0+cmdiX3N0cmlkZTsKKyAgICAgICAgICAgIHJnYl9zcmMgKz0gYy0+cmdiX3N0cmlkZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcmVnaW9uX21hc2tlZChNU1MxMkNvbnRleHQgY29uc3QgKmMsIEFyaXRoQ29kZXIgKmFjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLCB1aW50OF90ICptYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19zdHJpZGUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhDb250ZXh0ICpwY3R4KQoreworICAgIGludCBpLCBqLCBwOworICAgIHVpbnQ4X3QgKnJnYl9kc3QgPSBjLT5yZ2JfcGljICsgeCAqIDMgKyB5ICogYy0+cmdiX3N0cmlkZTsKKworICAgIGRzdCAgKz0geCArIHkgKiBzdHJpZGU7CisgICAgbWFzayArPSB4ICsgeSAqIG1hc2tfc3RyaWRlOworCisgICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUgJiYKKyAgICAgICAgICAgICAgICAoIGMtPnJnYl9waWMgJiYgbWFza1tpXSAhPSAweDAxICYmIG1hc2tbaV0gIT0gMHgwMiAmJiBtYXNrW2ldICE9IDB4MDQgfHwKKyAgICAgICAgICAgICAgICAgIWMtPnJnYl9waWMgJiYgbWFza1tpXSAhPSAweDgwICYmIG1hc2tbaV0gIT0gMHhGRikpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBpZiAobWFza1tpXSA9PSAweDAyKSB7CisgICAgICAgICAgICAgICAgY29weV9yZWN0YW5nbGVzKGMsIHggKyBpLCB5ICsgaiwgMSwgMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1hc2tbaV0gPT0gMHgwNCkgeworICAgICAgICAgICAgICAgIGlmIChtb3Rpb25fY29tcGVuc2F0aW9uKGMsIHggKyBpLCB5ICsgaiwgMSwgMSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWFza1tpXSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpICYmICFqKQorICAgICAgICAgICAgICAgICAgICBwID0gZGVjb2RlX3BpeGVsKGFjb2RlciwgcGN0eCwgTlVMTCwgMCwgMCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwID0gZGVjb2RlX3BpeGVsX2luX2NvbnRleHQoYWNvZGVyLCBwY3R4LCBkc3QgKyBpLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBqLCB3aWR0aCAtIGkgLSAxKTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBwOworICAgICAgICAgICAgICAgIGlmIChjLT5yZ2JfcGljKQorICAgICAgICAgICAgICAgICAgICBBVl9XQjI0KHJnYl9kc3QgKyBpICogMywgYy0+cGFsW3BdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc3QgICAgICs9IHN0cmlkZTsKKyAgICAgICAgbWFzayAgICArPSBtYXNrX3N0cmlkZTsKKyAgICAgICAgcmdiX2RzdCArPSBjLT5yZ2Jfc3RyaWRlOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHNsaWNlY29udGV4dF9pbml0KFNsaWNlQ29udGV4dCAqc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uLCBpbnQgZnVsbF9tb2RlbF9zeW1zKQoreworICAgIG1vZGVsX2luaXQoJnNjLT5pbnRyYV9yZWdpb24sIDIsIFRIUkVTSF9BREFQVElWRSk7CisgICAgbW9kZWxfaW5pdCgmc2MtPmludGVyX3JlZ2lvbiwgMiwgVEhSRVNIX0FEQVBUSVZFKTsKKyAgICBtb2RlbF9pbml0KCZzYy0+c3BsaXRfbW9kZSwgICAzLCBUSFJFU0hfSElHSCk7CisgICAgbW9kZWxfaW5pdCgmc2MtPmVkZ2VfbW9kZSwgICAgMiwgVEhSRVNIX0hJR0gpOworICAgIG1vZGVsX2luaXQoJnNjLT5waXZvdCwgICAgICAgIDMsIFRIUkVTSF9MT1cpOworCisgICAgcGl4Y3R4X2luaXQoJnNjLT5pbnRyYV9waXhfY3R4LCA4LCBmdWxsX21vZGVsX3N5bXMsIDApOworCisgICAgcGl4Y3R4X2luaXQoJnNjLT5pbnRlcl9waXhfY3R4LCB2ZXJzaW9uID8gMyA6IDIsCisgICAgICAgICAgICAgICAgZnVsbF9tb2RlbF9zeW1zLCB2ZXJzaW9uID8gMSA6IDApOworfQorCit2b2lkIGZmX21zczEyX3NsaWNlY29udGV4dF9yZXNldChTbGljZUNvbnRleHQgKnNjKQoreworICAgIG1vZGVsX3Jlc2V0KCZzYy0+aW50cmFfcmVnaW9uKTsKKyAgICBtb2RlbF9yZXNldCgmc2MtPmludGVyX3JlZ2lvbik7CisgICAgbW9kZWxfcmVzZXQoJnNjLT5zcGxpdF9tb2RlKTsKKyAgICBtb2RlbF9yZXNldCgmc2MtPmVkZ2VfbW9kZSk7CisgICAgbW9kZWxfcmVzZXQoJnNjLT5waXZvdCk7CisgICAgcGl4Y3R4X3Jlc2V0KCZzYy0+aW50cmFfcGl4X2N0eCk7CisgICAgcGl4Y3R4X3Jlc2V0KCZzYy0+aW50ZXJfcGl4X2N0eCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3Bpdm90KFNsaWNlQ29udGV4dCAqc2MsIEFyaXRoQ29kZXIgKmFjb2RlciwgaW50IGJhc2UpCit7CisgICAgaW50IHZhbCwgaW52OworCisgICAgaW52ID0gYWNvZGVyLT5nZXRfbW9kZWxfc3ltKGFjb2RlciwgJnNjLT5lZGdlX21vZGUpOworICAgIHZhbCA9IGFjb2Rlci0+Z2V0X21vZGVsX3N5bShhY29kZXIsICZzYy0+cGl2b3QpICsgMTsKKworICAgIGlmICh2YWwgPiAyKSB7CisgICAgICAgIGlmICgoYmFzZSArIDEpIC8gMiAtIDIgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICB2YWwgPSBhY29kZXItPmdldF9udW1iZXIoYWNvZGVyLCAoYmFzZSArIDEpIC8gMiAtIDIpICsgMzsKKyAgICB9CisKKyAgICBpZiAoKHVuc2lnbmVkKXZhbCA+PSBiYXNlKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gaW52ID8gYmFzZSAtIHZhbCA6IHZhbDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcmVnaW9uX2ludHJhKFNsaWNlQ29udGV4dCAqc2MsIEFyaXRoQ29kZXIgKmFjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBNU1MxMkNvbnRleHQgY29uc3QgKmMgPSBzYy0+YzsKKyAgICBpbnQgbW9kZTsKKworICAgIG1vZGUgPSBhY29kZXItPmdldF9tb2RlbF9zeW0oYWNvZGVyLCAmc2MtPmludHJhX3JlZ2lvbik7CisKKyAgICBpZiAoIW1vZGUpIHsKKyAgICAgICAgaW50IGksIGosIHBpeCwgcmdiX3BpeDsKKyAgICAgICAgaW50IHN0cmlkZSAgICAgICA9IGMtPnBhbF9zdHJpZGU7CisgICAgICAgIGludCByZ2Jfc3RyaWRlICAgPSBjLT5yZ2Jfc3RyaWRlOworICAgICAgICB1aW50OF90ICpkc3QgICAgID0gYy0+cGFsX3BpYyArIHggICAgICsgeSAqIHN0cmlkZTsKKyAgICAgICAgdWludDhfdCAqcmdiX2RzdCA9IGMtPnJnYl9waWMgKyB4ICogMyArIHkgKiByZ2Jfc3RyaWRlOworCisgICAgICAgIHBpeCAgICAgPSBkZWNvZGVfcGl4ZWwoYWNvZGVyLCAmc2MtPmludHJhX3BpeF9jdHgsIE5VTEwsIDAsIDApOworICAgICAgICByZ2JfcGl4ID0gYy0+cGFsW3BpeF07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKywgZHN0ICs9IHN0cmlkZSwgcmdiX2RzdCArPSByZ2Jfc3RyaWRlKSB7CisgICAgICAgICAgICBtZW1zZXQoZHN0LCBwaXgsIHdpZHRoKTsKKyAgICAgICAgICAgIGlmIChjLT5yZ2JfcGljKQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aCAqIDM7IGogKz0gMykKKyAgICAgICAgICAgICAgICAgICAgQVZfV0IyNChyZ2JfZHN0ICsgaiwgcmdiX3BpeCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZGVjb2RlX3JlZ2lvbihhY29kZXIsIGMtPnBhbF9waWMsIGMtPnJnYl9waWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIGMtPnBhbF9zdHJpZGUsIGMtPnJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYy0+aW50cmFfcGl4X2N0eCwgJmMtPnBhbFswXSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3JlZ2lvbl9pbnRlcihTbGljZUNvbnRleHQgKnNjLCBBcml0aENvZGVyICphY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgTVNTMTJDb250ZXh0IGNvbnN0ICpjID0gc2MtPmM7CisgICAgaW50IG1vZGU7CisKKyAgICBtb2RlID0gYWNvZGVyLT5nZXRfbW9kZWxfc3ltKGFjb2RlciwgJnNjLT5pbnRlcl9yZWdpb24pOworCisgICAgaWYgKCFtb2RlKSB7CisgICAgICAgIG1vZGUgPSBkZWNvZGVfcGl4ZWwoYWNvZGVyLCAmc2MtPmludGVyX3BpeF9jdHgsIE5VTEwsIDAsIDApOworCisgICAgICAgIGlmIChjLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSAmJgorICAgICAgICAgICAgKCBjLT5yZ2JfcGljICYmIG1vZGUgIT0gMHgwMSAmJiBtb2RlICE9IDB4MDIgJiYgbW9kZSAhPSAweDA0IHx8CisgICAgICAgICAgICAgIWMtPnJnYl9waWMgJiYgbW9kZSAhPSAweDgwICYmIG1vZGUgIT0gMHhGRikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgaWYgKG1vZGUgPT0gMHgwMikKKyAgICAgICAgICAgIGNvcHlfcmVjdGFuZ2xlcyhjLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgZWxzZSBpZiAobW9kZSA9PSAweDA0KQorICAgICAgICAgICAgcmV0dXJuIG1vdGlvbl9jb21wZW5zYXRpb24oYywgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGVsc2UgaWYgKG1vZGUgIT0gMHg4MCkKKyAgICAgICAgICAgIHJldHVybiBkZWNvZGVfcmVnaW9uX2ludHJhKHNjLCBhY29kZXIsIHgsIHksIHdpZHRoLCBoZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkZWNvZGVfcmVnaW9uKGFjb2RlciwgYy0+bWFzaywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgd2lkdGgsIGhlaWdodCwgYy0+bWFza19zdHJpZGUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYy0+aW50ZXJfcGl4X2N0eCwgJmMtPnBhbFswXSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gZGVjb2RlX3JlZ2lvbl9tYXNrZWQoYywgYWNvZGVyLCBjLT5wYWxfcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGFsX3N0cmlkZSwgYy0+bWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPm1hc2tfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYy0+aW50cmFfcGl4X2N0eCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9tc3MxMl9kZWNvZGVfcmVjdChTbGljZUNvbnRleHQgKnNjLCBBcml0aENvZGVyICphY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IG1vZGUsIHBpdm90OworCisgICAgbW9kZSA9IGFjb2Rlci0+Z2V0X21vZGVsX3N5bShhY29kZXIsICZzYy0+c3BsaXRfbW9kZSk7CisKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFNQTElUX1ZFUlQ6CisgICAgICAgIGlmICgocGl2b3QgPSBkZWNvZGVfcGl2b3Qoc2MsIGFjb2RlciwgaGVpZ2h0KSkgPCAxKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoZmZfbXNzMTJfZGVjb2RlX3JlY3Qoc2MsIGFjb2RlciwgeCwgeSwgd2lkdGgsIHBpdm90KSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGZmX21zczEyX2RlY29kZV9yZWN0KHNjLCBhY29kZXIsIHgsIHkgKyBwaXZvdCwgd2lkdGgsIGhlaWdodCAtIHBpdm90KSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTUExJVF9IT1I6CisgICAgICAgIGlmICgocGl2b3QgPSBkZWNvZGVfcGl2b3Qoc2MsIGFjb2Rlciwgd2lkdGgpKSA8IDEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChmZl9tc3MxMl9kZWNvZGVfcmVjdChzYywgYWNvZGVyLCB4LCB5LCBwaXZvdCwgaGVpZ2h0KSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGZmX21zczEyX2RlY29kZV9yZWN0KHNjLCBhY29kZXIsIHggKyBwaXZvdCwgeSwgd2lkdGggLSBwaXZvdCwgaGVpZ2h0KSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTUExJVF9OT05FOgorICAgICAgICBpZiAoc2MtPmMtPmtleWZyYW1lKQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9yZWdpb25faW50cmEoc2MsIGFjb2RlciwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBkZWNvZGVfcmVnaW9uX2ludGVyKHNjLCBhY29kZXIsIHgsIHksIHdpZHRoLCBoZWlnaHQpOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworYXZfY29sZCBpbnQgZmZfbXNzMTJfZGVjb2RlX2luaXQoTVNTMTJDb250ZXh0ICpjLCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlQ29udGV4dCogc2MxLCBTbGljZUNvbnRleHQgKnNjMikKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBjLT5hdmN0eDsKKyAgICBpbnQgaTsKKworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCA1MiArIDI1NiAqIDMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnN1ZmZpY2llbnQgZXh0cmFkYXRhIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhKSA8IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnN1ZmZpY2llbnQgZXh0cmFkYXRhIHNpemU6IGV4cGVjdGVkICUiUFJJdTMyIiBnb3QgJWRcbiIsCisgICAgICAgICAgICAgICBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGEpLAorICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZjdHgtPmNvZGVkX3dpZHRoICA9IEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDIwKTsKKyAgICBhdmN0eC0+Y29kZWRfaGVpZ2h0ID0gQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhICsgMjQpOworICAgIGlmIChhdmN0eC0+Y29kZWRfd2lkdGggPiA0MDk2IHx8IGF2Y3R4LT5jb2RlZF9oZWlnaHQgPiA0MDk2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRnJhbWUgZGltZW5zaW9ucyAlZHglZCB0b28gbGFyZ2UiLAorICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVkX3dpZHRoLCBhdmN0eC0+Y29kZWRfaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChhdmN0eC0+Y29kZWRfd2lkdGggPCAxIHx8IGF2Y3R4LT5jb2RlZF9oZWlnaHQgPCAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRnJhbWUgZGltZW5zaW9ucyAlZHglZCB0b28gc21hbGwiLAorICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVkX3dpZHRoLCBhdmN0eC0+Y29kZWRfaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJFbmNvZGVyIHZlcnNpb24gJSJQUkl1MzIiLiUiUFJJdTMyIlxuIiwKKyAgICAgICAgICAgQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhICsgNCksIEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDgpKTsKKyAgICBpZiAodmVyc2lvbiAhPSBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGEgKyA0KSA+IDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSGVhZGVyIHZlcnNpb24gZG9lc24ndCBtYXRjaCBjb2RlYyB0YWdcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYy0+ZnJlZV9jb2xvdXJzID0gQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhICsgNDgpOworICAgIGlmICgodW5zaWduZWQpYy0+ZnJlZV9jb2xvdXJzID4gMjU2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkluY29ycmVjdCBudW1iZXIgb2YgY2hhbmdlYWJsZSBwYWxldHRlIGVudHJpZXM6ICVkXG4iLAorICAgICAgICAgICAgICAgYy0+ZnJlZV9jb2xvdXJzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiJWQgZnJlZSBjb2xvdXIocylcbiIsIGMtPmZyZWVfY29sb3Vycyk7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkRpc3BsYXkgZGltZW5zaW9ucyAlIlBSSXUzMiJ4JSJQUkl1MzIiXG4iLAorICAgICAgICAgICBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGEgKyAxMiksIEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDE2KSk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJDb2RlZCBkaW1lbnNpb25zICVkeCVkXG4iLAorICAgICAgICAgICBhdmN0eC0+Y29kZWRfd2lkdGgsIGF2Y3R4LT5jb2RlZF9oZWlnaHQpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiJWcgZnJhbWVzIHBlciBzZWNvbmRcbiIsCisgICAgICAgICAgIGF2X2ludDJmbG9hdChBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGEgKyAyOCkpKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkJpdHJhdGUgJSJQUkl1MzIiIGJwc1xuIiwKKyAgICAgICAgICAgQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhICsgMzIpKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIk1heC4gbGVhZCB0aW1lICVnIG1zXG4iLAorICAgICAgICAgICBhdl9pbnQyZmxvYXQoQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhICsgMzYpKSk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJNYXguIGxhZyB0aW1lICVnIG1zXG4iLAorICAgICAgICAgICBhdl9pbnQyZmxvYXQoQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhICsgNDApKSk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJNYXguIHNlZWsgdGltZSAlZyBtc1xuIiwKKyAgICAgICAgICAgYXZfaW50MmZsb2F0KEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDQ0KSkpOworCisgICAgaWYgKHZlcnNpb24pIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDYwICsgMjU2ICogMykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkluc3VmZmljaWVudCBleHRyYWRhdGEgc2l6ZSAlZCBmb3IgdjJcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgYy0+c2xpY2Vfc3BsaXQgPSBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGEgKyA1Mik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU2xpY2Ugc3BsaXQgJWRcbiIsIGMtPnNsaWNlX3NwbGl0KTsKKworICAgICAgICBjLT5mdWxsX21vZGVsX3N5bXMgPSBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGEgKyA1Nik7CisgICAgICAgIGlmIChjLT5mdWxsX21vZGVsX3N5bXMgPCAyIHx8IGMtPmZ1bGxfbW9kZWxfc3ltcyA+IDI1NikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkluY29ycmVjdCBudW1iZXIgb2YgdXNlZCBjb2xvdXJzICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGMtPmZ1bGxfbW9kZWxfc3ltcyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlVzZWQgY29sb3VycyAlZFxuIiwKKyAgICAgICAgICAgICAgIGMtPmZ1bGxfbW9kZWxfc3ltcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+c2xpY2Vfc3BsaXQgICAgID0gMDsKKyAgICAgICAgYy0+ZnVsbF9tb2RlbF9zeW1zID0gMjU2OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgYy0+cGFsW2ldID0gMHhGRlUgPDwgMjQgfCBBVl9SQjI0KGF2Y3R4LT5leHRyYWRhdGEgKyA1MiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24gPyA4IDogMCkgKyBpICogMyk7CisKKyAgICBjLT5tYXNrX3N0cmlkZSA9IEZGQUxJR04oYXZjdHgtPndpZHRoLCAxNik7CisgICAgYy0+bWFzayAgICAgICAgPSBhdl9tYWxsb2MoYy0+bWFza19zdHJpZGUgKiBhdmN0eC0+aGVpZ2h0KTsKKyAgICBpZiAoIWMtPm1hc2spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgbWFzayBwbGFuZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgc2MxLT5jID0gYzsKKyAgICBzbGljZWNvbnRleHRfaW5pdChzYzEsIHZlcnNpb24sIGMtPmZ1bGxfbW9kZWxfc3ltcyk7CisgICAgaWYgKGMtPnNsaWNlX3NwbGl0KSB7CisgICAgICAgIHNjMi0+YyA9IGM7CisgICAgICAgIHNsaWNlY29udGV4dF9pbml0KHNjMiwgdmVyc2lvbiwgYy0+ZnVsbF9tb2RlbF9zeW1zKTsKKyAgICB9CisgICAgYy0+Y29ycnVwdGVkID0gMTsKKworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIGludCBmZl9tc3MxMl9kZWNvZGVfZW5kKE1TUzEyQ29udGV4dCAqYykKK3sKKyAgICBhdl9mcmVlcCgmYy0+bWFzayk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21zczEyLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tc3MxMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NTMxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tc3MxMi5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ29tbW9uIGhlYWRlciBmb3IgTWljcm9zb2Z0IFNjcmVlbiAxIGFuZCAyCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01TUzEyX0gKKyNkZWZpbmUgQVZDT0RFQ19NU1MxMl9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorCisjZGVmaW5lIE1PREVMX01JTl9TWU1TICAgIDIKKyNkZWZpbmUgTU9ERUxfTUFYX1NZTVMgIDI1NgorI2RlZmluZSBUSFJFU0hfQURBUFRJVkUgIC0xCisjZGVmaW5lIFRIUkVTSF9MT1cgICAgICAgMTUKKyNkZWZpbmUgVEhSRVNIX0hJR0ggICAgICA1MAorCit0eXBlZGVmIHN0cnVjdCBNb2RlbCB7CisgICAgaW50MTZfdCBjdW1fcHJvYltNT0RFTF9NQVhfU1lNUyArIDFdOworICAgIGludDE2X3Qgd2VpZ2h0c1tNT0RFTF9NQVhfU1lNUyArIDFdOworICAgIHVpbnQ4X3QgaWR4MnN5bVtNT0RFTF9NQVhfU1lNUyArIDFdOworICAgIGludCBudW1fc3ltczsKKyAgICBpbnQgdGhyX3dlaWdodCwgdGhyZXNob2xkOworfSBNb2RlbDsKKwordHlwZWRlZiBzdHJ1Y3QgQXJpdGhDb2RlciB7CisgICAgaW50IGxvdywgaGlnaCwgdmFsdWU7CisgICAgdW5pb24geworICAgICAgICBHZXRCaXRDb250ZXh0ICpnYjsKKyAgICAgICAgR2V0Qnl0ZUNvbnRleHQgKmdCOworICAgIH0gZ2JjOworICAgIGludCAoKmdldF9tb2RlbF9zeW0pKHN0cnVjdCBBcml0aENvZGVyICpjLCBNb2RlbCAqbSk7CisgICAgaW50ICgqZ2V0X251bWJlcikgICAoc3RydWN0IEFyaXRoQ29kZXIgKmMsIGludCBuKTsKK30gQXJpdGhDb2RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgUGl4Q29udGV4dCB7CisgICAgaW50IGNhY2hlX3NpemUsIG51bV9zeW1zOworICAgIHVpbnQ4X3QgY2FjaGVbMTJdOworICAgIE1vZGVsIGNhY2hlX21vZGVsLCBmdWxsX21vZGVsOworICAgIE1vZGVsIHNlY19tb2RlbHNbMTVdWzRdOworICAgIGludCBzcGVjaWFsX2luaXRpYWxfY2FjaGU7Cit9IFBpeENvbnRleHQ7CisKK3N0cnVjdCBNU1MxMkNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFNsaWNlQ29udGV4dCB7CisgICAgc3RydWN0IE1TUzEyQ29udGV4dCAqYzsKKyAgICBNb2RlbCAgICAgIGludHJhX3JlZ2lvbiwgaW50ZXJfcmVnaW9uOworICAgIE1vZGVsICAgICAgcGl2b3QsIGVkZ2VfbW9kZSwgc3BsaXRfbW9kZTsKKyAgICBQaXhDb250ZXh0IGludHJhX3BpeF9jdHgsIGludGVyX3BpeF9jdHg7Cit9IFNsaWNlQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgTVNTMTJDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgdWludDMyX3QgICAgICAgcGFsWzI1Nl07CisgICAgdWludDhfdCAgICAgICAgKnBhbF9waWM7CisgICAgdWludDhfdCAgICAgICAgKmxhc3RfcGFsX3BpYzsKKyAgICBpbnQgICAgICAgICAgICBwYWxfc3RyaWRlOworICAgIHVpbnQ4X3QgICAgICAgICptYXNrOworICAgIGludCAgICAgICAgICAgIG1hc2tfc3RyaWRlOworICAgIHVpbnQ4X3QgICAgICAgICpyZ2JfcGljOworICAgIHVpbnQ4X3QgICAgICAgICpsYXN0X3JnYl9waWM7CisgICAgaW50ICAgICAgICAgICAgcmdiX3N0cmlkZTsKKyAgICBpbnQgICAgICAgICAgICBmcmVlX2NvbG91cnM7CisgICAgaW50ICAgICAgICAgICAga2V5ZnJhbWU7CisgICAgaW50ICAgICAgICAgICAgbXZYLCBtdlk7CisgICAgaW50ICAgICAgICAgICAgY29ycnVwdGVkOworICAgIGludCAgICAgICAgICAgIHNsaWNlX3NwbGl0OworICAgIGludCAgICAgICAgICAgIGZ1bGxfbW9kZWxfc3ltczsKK30gTVNTMTJDb250ZXh0OworCitpbnQgZmZfbXNzMTJfZGVjb2RlX3JlY3QoU2xpY2VDb250ZXh0ICpjdHgsIEFyaXRoQ29kZXIgKmFjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7Cit2b2lkIGZmX21zczEyX21vZGVsX3VwZGF0ZShNb2RlbCAqbSwgaW50IHZhbCk7Cit2b2lkIGZmX21zczEyX3NsaWNlY29udGV4dF9yZXNldChTbGljZUNvbnRleHQgKnNjKTsKK2ludCBmZl9tc3MxMl9kZWNvZGVfaW5pdChNU1MxMkNvbnRleHQgKmMsIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlQ29udGV4dCAqc2MxLCBTbGljZUNvbnRleHQgKnNjMik7CitpbnQgZmZfbXNzMTJfZGVjb2RlX2VuZChNU1MxMkNvbnRleHQgKmN0eCk7CisKKyNkZWZpbmUgQVJJVEhfR0VUX0JJVChwcmVmaXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbnQgcHJlZml4ICMjIF9nZXRfYml0KEFyaXRoQ29kZXIgKmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgcmFuZ2UgPSBjLT5oaWdoIC0gYy0+bG93ICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYml0ICAgPSAyICogYy0+dmFsdWUgLSBjLT5sb3cgPj0gYy0+aGlnaDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYml0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYy0+bG93ICs9IHJhbmdlID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYy0+aGlnaCA9IGMtPmxvdyArIChyYW5nZSA+PiAxKSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmVmaXggIyMgX25vcm1hbGlzZShjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gYml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBBUklUSF9HRVRfTU9ERUxfU1lNKHByZWZpeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCBwcmVmaXggIyMgX2dldF9tb2RlbF9zeW0oQXJpdGhDb2RlciAqYywgTW9kZWwgKm0pICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpZHgsIHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlkeCA9IHByZWZpeCAjIyBfZ2V0X3Byb2IoYywgbS0+Y3VtX3Byb2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZhbCA9IG0tPmlkeDJzeW1baWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZmX21zczEyX21vZGVsX3VwZGF0ZShtLCBpZHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByZWZpeCAjIyBfbm9ybWFsaXNlKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZW5kaWYgLyogQVZDT0RFQ19NU1MxMl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tc3MyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tc3MyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ1M2Y4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21zczIuYwpAQCAtMCwwICsxLDg1MiBAQAorLyoKKyAqIE1pY3Jvc29mdCBTY3JlZW4gMiAoYWthIFdpbmRvd3MgTWVkaWEgVmlkZW8gVjkgU2NyZWVuKSBkZWNvZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1pY3Jvc29mdCBTY3JlZW4gMiAoYWthIFdpbmRvd3MgTWVkaWEgVmlkZW8gVjkgU2NyZWVuKSBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImVycm9yX3Jlc2lsaWVuY2UuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1wZWdfZXIuaCIKKyNpbmNsdWRlICJtc21wZWc0ZGF0YS5oIgorI2luY2x1ZGUgInFwZWxkc3AuaCIKKyNpbmNsdWRlICJ2YzEuaCIKKyNpbmNsdWRlICJtc3MxMi5oIgorI2luY2x1ZGUgIm1zczJkc3AuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTVNTMkNvbnRleHQgeworICAgIFZDMUNvbnRleHQgICAgIHY7CisgICAgaW50ICAgICAgICAgICAgc3BsaXRfcG9zaXRpb247CisgICAgQVZGcmFtZSAgICAgICAqbGFzdF9waWM7CisgICAgTVNTMTJDb250ZXh0ICAgYzsKKyAgICBNU1MyRFNQQ29udGV4dCBkc3A7CisgICAgUXBlbERTUENvbnRleHQgcWRzcDsKKyAgICBTbGljZUNvbnRleHQgICBzY1syXTsKK30gTVNTMkNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIGFyaXRoMl9ub3JtYWxpc2UoQXJpdGhDb2RlciAqYykKK3sKKyAgICB3aGlsZSAoKGMtPmhpZ2ggPj4gMTUpIC0gKGMtPmxvdyA+PiAxNSkgPCAyKSB7CisgICAgICAgIGlmICgoYy0+bG93IF4gYy0+aGlnaCkgJiAweDEwMDAwKSB7CisgICAgICAgICAgICBjLT5oaWdoICBePSAweDgwMDA7CisgICAgICAgICAgICBjLT52YWx1ZSBePSAweDgwMDA7CisgICAgICAgICAgICBjLT5sb3cgICBePSAweDgwMDA7CisgICAgICAgIH0KKyAgICAgICAgYy0+aGlnaCAgPSBjLT5oaWdoICA8PCA4ICYgMHhGRkZGRkYgfCAweEZGOworICAgICAgICBjLT52YWx1ZSA9IGMtPnZhbHVlIDw8IDggJiAweEZGRkZGRiB8IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGMtPmdiYy5nQik7CisgICAgICAgIGMtPmxvdyAgID0gYy0+bG93ICAgPDwgOCAmIDB4RkZGRkZGOworICAgIH0KK30KKworQVJJVEhfR0VUX0JJVChhcml0aDIpCisKKy8qIEwuIFN0dWl2ZXIgYW5kIEEuIE1vZmZhdDogIlBpZWNld2lzZSBJbnRlZ2VyIE1hcHBpbmcgZm9yIEFyaXRobWV0aWMgQ29kaW5nLiIKKyAqIEluIFByb2MuIDh0aCBEYXRhIENvbXByZXNzaW9uIENvbmZlcmVuY2UgKERDQyAnOTgpLCBwcC4gMy0xMiwgTWFyLiAxOTk4ICovCisKK3N0YXRpYyBpbnQgYXJpdGgyX2dldF9zY2FsZWRfdmFsdWUoaW50IHZhbHVlLCBpbnQgbiwgaW50IHJhbmdlKQoreworICAgIGludCBzcGxpdCA9IChuIDw8IDEpIC0gcmFuZ2U7CisKKyAgICBpZiAodmFsdWUgPiBzcGxpdCkKKyAgICAgICAgcmV0dXJuIHNwbGl0ICsgKHZhbHVlIC0gc3BsaXQgPj4gMSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGFyaXRoMl9yZXNjYWxlX2ludGVydmFsKEFyaXRoQ29kZXIgKmMsIGludCByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3csIGludCBoaWdoLCBpbnQgbikKK3sKKyAgICBpbnQgc3BsaXQgPSAobiA8PCAxKSAtIHJhbmdlOworCisgICAgaWYgKGhpZ2ggPiBzcGxpdCkKKyAgICAgICAgYy0+aGlnaCA9IHNwbGl0ICsgKGhpZ2ggLSBzcGxpdCA8PCAxKTsKKyAgICBlbHNlCisgICAgICAgIGMtPmhpZ2ggPSBoaWdoOworCisgICAgYy0+aGlnaCArPSBjLT5sb3cgLSAxOworCisgICAgaWYgKGxvdyA+IHNwbGl0KQorICAgICAgICBjLT5sb3cgKz0gc3BsaXQgKyAobG93IC0gc3BsaXQgPDwgMSk7CisgICAgZWxzZQorICAgICAgICBjLT5sb3cgKz0gbG93OworfQorCitzdGF0aWMgaW50IGFyaXRoMl9nZXRfbnVtYmVyKEFyaXRoQ29kZXIgKmMsIGludCBuKQoreworICAgIGludCByYW5nZSA9IGMtPmhpZ2ggLSBjLT5sb3cgKyAxOworICAgIGludCBzY2FsZSA9IGF2X2xvZzIocmFuZ2UpIC0gYXZfbG9nMihuKTsKKyAgICBpbnQgdmFsOworCisgICAgaWYgKG4gPDwgc2NhbGUgPiByYW5nZSkKKyAgICAgICAgc2NhbGUtLTsKKworICAgIG4gPDw9IHNjYWxlOworCisgICAgdmFsID0gYXJpdGgyX2dldF9zY2FsZWRfdmFsdWUoYy0+dmFsdWUgLSBjLT5sb3csIG4sIHJhbmdlKSA+PiBzY2FsZTsKKworICAgIGFyaXRoMl9yZXNjYWxlX2ludGVydmFsKGMsIHJhbmdlLCB2YWwgPDwgc2NhbGUsICh2YWwgKyAxKSA8PCBzY2FsZSwgbik7CisKKyAgICBhcml0aDJfbm9ybWFsaXNlKGMpOworCisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBhcml0aDJfZ2V0X3Byb2IoQXJpdGhDb2RlciAqYywgaW50MTZfdCAqcHJvYnMpCit7CisgICAgaW50IHJhbmdlID0gYy0+aGlnaCAtIGMtPmxvdyArIDEsIG4gPSAqcHJvYnM7CisgICAgaW50IHNjYWxlID0gYXZfbG9nMihyYW5nZSkgLSBhdl9sb2cyKG4pOworICAgIGludCBpICAgICA9IDAsIHZhbDsKKworICAgIGlmIChuIDw8IHNjYWxlID4gcmFuZ2UpCisgICAgICAgIHNjYWxlLS07CisKKyAgICBuIDw8PSBzY2FsZTsKKworICAgIHZhbCA9IGFyaXRoMl9nZXRfc2NhbGVkX3ZhbHVlKGMtPnZhbHVlIC0gYy0+bG93LCBuLCByYW5nZSkgPj4gc2NhbGU7CisgICAgd2hpbGUgKHByb2JzWysraV0gPiB2YWwpIDsKKworICAgIGFyaXRoMl9yZXNjYWxlX2ludGVydmFsKGMsIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JzW2ldIDw8IHNjYWxlLCBwcm9ic1tpIC0gMV0gPDwgc2NhbGUsIG4pOworCisgICAgcmV0dXJuIGk7Cit9CisKK0FSSVRIX0dFVF9NT0RFTF9TWU0oYXJpdGgyKQorCitzdGF0aWMgaW50IGFyaXRoMl9nZXRfY29uc3VtZWRfYnl0ZXMoQXJpdGhDb2RlciAqYykKK3sKKyAgICBpbnQgZGlmZiA9IChjLT5oaWdoID4+IDE2KSAtIChjLT5sb3cgPj4gMTYpOworICAgIGludCBicCAgID0gYnl0ZXN0cmVhbTJfdGVsbChjLT5nYmMuZ0IpIC0gMyA8PCAzOworICAgIGludCBiaXRzID0gMTsKKworICAgIHdoaWxlICghKGRpZmYgJiAweDgwKSkgeworICAgICAgICBiaXRzKys7CisgICAgICAgIGRpZmYgPDw9IDE7CisgICAgfQorCisgICAgcmV0dXJuIChiaXRzICsgYnAgKyA3ID4+IDMpICsgKChjLT5sb3cgPj4gMTYpICsgMSA9PSBjLT5oaWdoID4+IDE2KTsKK30KKworc3RhdGljIHZvaWQgYXJpdGgyX2luaXQoQXJpdGhDb2RlciAqYywgR2V0Qnl0ZUNvbnRleHQgKmdCKQoreworICAgIGMtPmxvdyAgICAgICAgICAgPSAwOworICAgIGMtPmhpZ2ggICAgICAgICAgPSAweEZGRkZGRjsKKyAgICBjLT52YWx1ZSAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMjQoZ0IpOworICAgIGMtPmdiYy5nQiAgICAgICAgPSBnQjsKKyAgICBjLT5nZXRfbW9kZWxfc3ltID0gYXJpdGgyX2dldF9tb2RlbF9zeW07CisgICAgYy0+Z2V0X251bWJlciAgICA9IGFyaXRoMl9nZXRfbnVtYmVyOworfQorCitzdGF0aWMgaW50IGRlY29kZV9wYWxfdjIoTVNTMTJDb250ZXh0ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIGludCBpLCBuY29sOworICAgIHVpbnQzMl90ICpwYWwgPSBjdHgtPnBhbCArIDI1NiAtIGN0eC0+ZnJlZV9jb2xvdXJzOworCisgICAgaWYgKCFjdHgtPmZyZWVfY29sb3VycykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBuY29sID0gKmJ1ZisrOworICAgIGlmIChuY29sID4gY3R4LT5mcmVlX2NvbG91cnMgfHwgYnVmX3NpemUgPCAyICsgbmNvbCAqIDMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGZvciAoaSA9IDA7IGkgPCBuY29sOyBpKyspCisgICAgICAgICpwYWwrKyA9IEFWX1JCMjQoYnVmICsgMyAqIGkpOworCisgICAgcmV0dXJuIDEgKyBuY29sICogMzsKK30KKworc3RhdGljIGludCBkZWNvZGVfNTU1KEdldEJ5dGVDb250ZXh0ICpnQiwgdWludDE2X3QgKmRzdCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5ZnJhbWUsIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgbGFzdF9zeW1ib2wgPSAwLCByZXBlYXQgPSAwLCBwcmV2X2F2YWlsID0gMDsKKworICAgIGlmICgha2V5ZnJhbWUpIHsKKyAgICAgICAgaW50IHgsIHksIGVuZHgsIGVuZHksIHQ7CisKKyNkZWZpbmUgUkVBRF9QQUlSKGEsIGIpICAgICAgICAgICAgICAgICBcCisgICAgYSAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnQikgPDwgNDsgXAorICAgIHQgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ0IpOyAgICAgIFwKKyAgICBhIHw9IHQgPj4gNDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYiAgPSAodCAmIDB4RikgPDwgODsgICAgICAgICAgICAgICAgXAorICAgIGIgfD0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ0IpOyAgICAgIFwKKworICAgICAgICBSRUFEX1BBSVIoeCwgZW5keCkKKyAgICAgICAgUkVBRF9QQUlSKHksIGVuZHkpCisKKyAgICAgICAgaWYgKGVuZHggPj0gdyB8fCBlbmR5ID49IGggfHwgeCA+IGVuZHggfHwgeSA+IGVuZHkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZHN0ICs9IHggKyBzdHJpZGUgKiB5OworICAgICAgICB3ICAgID0gZW5keCAtIHggKyAxOworICAgICAgICBoICAgID0gZW5keSAtIHkgKyAxOworICAgICAgICBpZiAoeSkKKyAgICAgICAgICAgIHByZXZfYXZhaWwgPSAxOworICAgIH0KKworICAgIGRvIHsKKyAgICAgICAgdWludDE2X3QgKnAgPSBkc3Q7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChyZXBlYXQtLSA8IDEpIHsKKyAgICAgICAgICAgICAgICBpbnQgYiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdCKTsKKyAgICAgICAgICAgICAgICBpZiAoYiA8IDEyOCkKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9zeW1ib2wgPSBiIDw8IDggfCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnQik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYiA+IDEyOSkgeworICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYi0tID4gMTMwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ID0gKHJlcGVhdCA8PCA4KSArIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdCKSArIDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X3N5bWJvbCA9PSAtMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXAgPSBGRk1JTigodW5zaWduZWQpcmVwZWF0LCBkc3QgKyB3IC0gcCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXQgLT0gc2tpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgICAgICArPSBza2lwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGxhc3Rfc3ltYm9sID0gMTI3IC0gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXN0X3N5bWJvbCA+PSAwKQorICAgICAgICAgICAgICAgICpwID0gbGFzdF9zeW1ib2w7CisgICAgICAgICAgICBlbHNlIGlmIChsYXN0X3N5bWJvbCA9PSAtMSAmJiBwcmV2X2F2YWlsKQorICAgICAgICAgICAgICAgICpwID0gKihwIC0gc3RyaWRlKTsKKyAgICAgICAgfSB3aGlsZSAoKytwIDwgZHN0ICsgdyk7CisgICAgICAgIGRzdCAgICAgICArPSBzdHJpZGU7CisgICAgICAgIHByZXZfYXZhaWwgPSAxOworICAgIH0gd2hpbGUgKC0taCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcmxlKEdldEJpdENvbnRleHQgKmdiLCB1aW50OF90ICpwYWxfZHN0LCBpbnQgcGFsX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyZ2JfZHN0LCBpbnQgcmdiX3N0cmlkZSwgdWludDMyX3QgKnBhbCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5ZnJhbWUsIGludCBrZl9zbGlwdCwgaW50IHNsaWNlLCBpbnQgdywgaW50IGgpCit7CisgICAgdWludDhfdCBiaXRzWzI3MF0gPSB7IDAgfTsKKyAgICB1aW50MzJfdCBjb2Rlc1syNzBdOworICAgIFZMQyB2bGM7CisKKyAgICBpbnQgY3VycmVudF9sZW5ndGggPSAwLCByZWFkX2NvZGVzID0gMCwgbmV4dF9jb2RlID0gMCwgY3VycmVudF9jb2RlcyA9IDA7CisgICAgaW50IHJlbWFpbmluZ19jb2Rlcywgc3VycGx1c19jb2RlcywgaTsKKworICAgIGNvbnN0IGludCBhbHBoYWJldF9zaXplID0gMjcwIC0ga2V5ZnJhbWU7CisKKyAgICBpbnQgbGFzdF9zeW1ib2wgPSAwLCByZXBlYXQgPSAwLCBwcmV2X2F2YWlsID0gMDsKKworICAgIGlmICgha2V5ZnJhbWUpIHsKKyAgICAgICAgaW50IHgsIHksIGNsaXB3LCBjbGlwaDsKKworICAgICAgICB4ICAgICA9IGdldF9iaXRzKGdiLCAxMik7CisgICAgICAgIHkgICAgID0gZ2V0X2JpdHMoZ2IsIDEyKTsKKyAgICAgICAgY2xpcHcgPSBnZXRfYml0cyhnYiwgMTIpICsgMTsKKyAgICAgICAgY2xpcGggPSBnZXRfYml0cyhnYiwgMTIpICsgMTsKKworICAgICAgICBpZiAoeCArIGNsaXB3ID4gdyB8fCB5ICsgY2xpcGggPiBoKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHBhbF9kc3QgKz0gcGFsX3N0cmlkZSAqIHkgKyB4OworICAgICAgICByZ2JfZHN0ICs9IHJnYl9zdHJpZGUgKiB5ICsgeCAqIDM7CisgICAgICAgIHcgICAgICAgID0gY2xpcHc7CisgICAgICAgIGggICAgICAgID0gY2xpcGg7CisgICAgICAgIGlmICh5KQorICAgICAgICAgICAgcHJldl9hdmFpbCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNsaWNlID4gMCkgeworICAgICAgICAgICAgcGFsX2RzdCAgICs9IHBhbF9zdHJpZGUgKiBrZl9zbGlwdDsKKyAgICAgICAgICAgIHJnYl9kc3QgICArPSByZ2Jfc3RyaWRlICoga2Zfc2xpcHQ7CisgICAgICAgICAgICBwcmV2X2F2YWlsID0gMTsKKyAgICAgICAgICAgIGggICAgICAgICAtPSBrZl9zbGlwdDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBoID0ga2Zfc2xpcHQ7CisgICAgfQorCisgICAgLyogcmVhZCBleHBsaWNpdCBjb2RlcyAqLworICAgIGRvIHsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRfY29kZXMtLSkgeworICAgICAgICAgICAgaW50IHN5bWJvbCA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGlmIChzeW1ib2wgPj0gMjA0IC0ga2V5ZnJhbWUpCisgICAgICAgICAgICAgICAgc3ltYm9sICs9IDE0IC0ga2V5ZnJhbWU7CisgICAgICAgICAgICBlbHNlIGlmIChzeW1ib2wgPiAxODkpCisgICAgICAgICAgICAgICAgc3ltYm9sID0gZ2V0X2JpdHMxKGdiKSArIChzeW1ib2wgPDwgMSkgLSAxOTA7CisgICAgICAgICAgICBpZiAoYml0c1tzeW1ib2xdKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYml0c1tzeW1ib2xdICA9IGN1cnJlbnRfbGVuZ3RoOworICAgICAgICAgICAgY29kZXNbc3ltYm9sXSA9IG5leHRfY29kZSsrOworICAgICAgICAgICAgcmVhZF9jb2RlcysrOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRfbGVuZ3RoKys7CisgICAgICAgIG5leHRfY29kZSAgICAgPDw9IDE7CisgICAgICAgIHJlbWFpbmluZ19jb2RlcyA9ICgxIDw8IGN1cnJlbnRfbGVuZ3RoKSAtIG5leHRfY29kZTsKKyAgICAgICAgY3VycmVudF9jb2RlcyAgID0gZ2V0X2JpdHMoZ2IsIGF2X2NlaWxfbG9nMihyZW1haW5pbmdfY29kZXMgKyAxKSk7CisgICAgICAgIGlmIChjdXJyZW50X2xlbmd0aCA+IDIyIHx8IGN1cnJlbnRfY29kZXMgPiByZW1haW5pbmdfY29kZXMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9IHdoaWxlIChjdXJyZW50X2NvZGVzICE9IHJlbWFpbmluZ19jb2Rlcyk7CisKKyAgICByZW1haW5pbmdfY29kZXMgPSBhbHBoYWJldF9zaXplIC0gcmVhZF9jb2RlczsKKworICAgIC8qIGRldGVybWluZSB0aGUgbWluaW11bSBsZW5ndGggdG8gZml0IHRoZSByZXN0IG9mIHRoZSBhbHBoYWJldCAqLworICAgIHdoaWxlICgoc3VycGx1c19jb2RlcyA9ICgyIDw8IGN1cnJlbnRfbGVuZ3RoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRfY29kZSA8PCAxKSAtIHJlbWFpbmluZ19jb2RlcykgPCAwKSB7CisgICAgICAgIGN1cnJlbnRfbGVuZ3RoKys7CisgICAgICAgIG5leHRfY29kZSA8PD0gMTsKKyAgICB9CisKKyAgICAvKiBhZGQgdGhlIHJlc3Qgb2YgdGhlIHN5bWJvbHMgbGV4aWNvZ3JhcGhpY2FsbHkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYWxwaGFiZXRfc2l6ZTsgaSsrKQorICAgICAgICBpZiAoIWJpdHNbaV0pIHsKKyAgICAgICAgICAgIGlmIChzdXJwbHVzX2NvZGVzLS0gPT0gMCkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRfbGVuZ3RoKys7CisgICAgICAgICAgICAgICAgbmV4dF9jb2RlIDw8PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYml0c1tpXSAgPSBjdXJyZW50X2xlbmd0aDsKKyAgICAgICAgICAgIGNvZGVzW2ldID0gbmV4dF9jb2RlKys7CisgICAgICAgIH0KKworICAgIGlmIChuZXh0X2NvZGUgIT0gMSA8PCBjdXJyZW50X2xlbmd0aCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoaSA9IGluaXRfdmxjKCZ2bGMsIDksIGFscGhhYmV0X3NpemUsIGJpdHMsIDEsIDEsIGNvZGVzLCA0LCA0LCAwKSkKKyAgICAgICAgcmV0dXJuIGk7CisKKyAgICAvKiBmcmFtZSBkZWNvZGUgKi8KKyAgICBkbyB7CisgICAgICAgIHVpbnQ4X3QgKnBwID0gcGFsX2RzdDsKKyAgICAgICAgdWludDhfdCAqcnAgPSByZ2JfZHN0OworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAocmVwZWF0LS0gPCAxKSB7CisgICAgICAgICAgICAgICAgaW50IGIgPSBnZXRfdmxjMihnYiwgdmxjLnRhYmxlLCA5LCAzKTsKKyAgICAgICAgICAgICAgICBpZiAoYiA8IDI1NikKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9zeW1ib2wgPSBiOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIgPCAyNjgpIHsKKyAgICAgICAgICAgICAgICAgICAgYiAtPSAyNTY7CisgICAgICAgICAgICAgICAgICAgIGlmIChiID09IDExKQorICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGdldF9iaXRzKGdiLCA0KSArIDEwOworCisgICAgICAgICAgICAgICAgICAgIGlmICghYikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdCA9IGdldF9iaXRzKGdiLCBiKTsKKworICAgICAgICAgICAgICAgICAgICByZXBlYXQgKz0gKDEgPDwgYikgLSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X3N5bWJvbCA9PSAtMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXAgPSBGRk1JTihyZXBlYXQsIHBhbF9kc3QgKyB3IC0gcHApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0IC09IHNraXA7CisgICAgICAgICAgICAgICAgICAgICAgICBwcCAgICAgKz0gc2tpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJwICAgICArPSBza2lwICogMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBsYXN0X3N5bWJvbCA9IDI2NyAtIGI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdF9zeW1ib2wgPj0gMCkgeworICAgICAgICAgICAgICAgICpwcCA9IGxhc3Rfc3ltYm9sOworICAgICAgICAgICAgICAgIEFWX1dCMjQocnAsIHBhbFtsYXN0X3N5bWJvbF0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0X3N5bWJvbCA9PSAtMSAmJiBwcmV2X2F2YWlsKSB7CisgICAgICAgICAgICAgICAgKnBwID0gKihwcCAtIHBhbF9zdHJpZGUpOworICAgICAgICAgICAgICAgIG1lbWNweShycCwgcnAgLSByZ2Jfc3RyaWRlLCAzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJwICs9IDM7CisgICAgICAgIH0gd2hpbGUgKCsrcHAgPCBwYWxfZHN0ICsgdyk7CisgICAgICAgIHBhbF9kc3QgICArPSBwYWxfc3RyaWRlOworICAgICAgICByZ2JfZHN0ICAgKz0gcmdiX3N0cmlkZTsKKyAgICAgICAgcHJldl9hdmFpbCA9IDE7CisgICAgfSB3aGlsZSAoLS1oKTsKKworICAgIGZmX2ZyZWVfdmxjKCZ2bGMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV93bXY5KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgd212OV9tYXNrKQoreworICAgIE1TUzJDb250ZXh0ICpjdHggID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNU1MxMkNvbnRleHQgKmMgICA9ICZjdHgtPmM7CisgICAgVkMxQ29udGV4dCAqdiAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgQVZGcmFtZSAqZjsKKyAgICBpbnQgcmV0OworCisgICAgZmZfbXBlZ19mbHVzaChhdmN0eCk7CisKKyAgICBpZiAoKHJldCA9IGluaXRfZ2V0X2JpdHM4KCZzLT5nYiwgYnVmLCBidWZfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHMtPmxvb3BfZmlsdGVyID0gYXZjdHgtPnNraXBfbG9vcF9maWx0ZXIgPCBBVkRJU0NBUkRfQUxMOworCisgICAgaWYgKGZmX3ZjMV9wYXJzZV9mcmFtZV9oZWFkZXIodiwgJnMtPmdiKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19FUlJPUiwgImhlYWRlciBlcnJvclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19FUlJPUiwgImV4cGVjdGVkIEktZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKworICAgIGlmICgocmV0ID0gZmZfbXB2X2ZyYW1lX3N0YXJ0KHMsIGF2Y3R4KSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfRVJST1IsICJmZl9tcHZfZnJhbWVfc3RhcnQgZXJyb3JcbiIpOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZmZfbXBlZ19lcl9mcmFtZV9zdGFydChzKTsKKworICAgIHYtPmJpdHMgPSBidWZfc2l6ZSAqIDg7CisKKyAgICB2LT5lbmRfbWJfeCA9ICh3ICsgMTUpID4+IDQ7CisgICAgcy0+ZW5kX21iX3kgPSAoaCArIDE1KSA+PiA0OworICAgIGlmICh2LT5yZXNwaWMgJiAxKQorICAgICAgICB2LT5lbmRfbWJfeCA9IHYtPmVuZF9tYl94ICsgMSA+PiAxOworICAgIGlmICh2LT5yZXNwaWMgJiAyKQorICAgICAgICBzLT5lbmRfbWJfeSA9IHMtPmVuZF9tYl95ICsgMSA+PiAxOworCisgICAgZmZfdmMxX2RlY29kZV9ibG9ja3Modik7CisKKyAgICBmZl9lcl9mcmFtZV9lbmQoJnMtPmVyKTsKKworICAgIGZmX21wdl9mcmFtZV9lbmQocyk7CisKKyAgICBmID0gcy0+Y3VycmVudF9waWN0dXJlLmY7CisKKyAgICBpZiAodi0+cmVzcGljID09IDMpIHsKKyAgICAgICAgY3R4LT5kc3AudXBzYW1wbGVfcGxhbmUoZi0+ZGF0YVswXSwgZi0+bGluZXNpemVbMF0sIHcsICAgICAgaCk7CisgICAgICAgIGN0eC0+ZHNwLnVwc2FtcGxlX3BsYW5lKGYtPmRhdGFbMV0sIGYtPmxpbmVzaXplWzFdLCB3KzEgPj4gMSwgaCsxID4+IDEpOworICAgICAgICBjdHgtPmRzcC51cHNhbXBsZV9wbGFuZShmLT5kYXRhWzJdLCBmLT5saW5lc2l6ZVsyXSwgdysxID4+IDEsIGgrMSA+PiAxKTsKKyAgICB9IGVsc2UgaWYgKHYtPnJlc3BpYykKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHYtPnMuYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bW1ldHJpYyBXTVY5IHJlY3RhbmdsZSBzdWJzYW1wbGluZyIpOworCisgICAgYXZfYXNzZXJ0MChmLT5saW5lc2l6ZVsxXSA9PSBmLT5saW5lc2l6ZVsyXSk7CisKKyAgICBpZiAod212OV9tYXNrICE9IC0xKQorICAgICAgICBjdHgtPmRzcC5tc3MyX2JsaXRfd212OV9tYXNrZWQoYy0+cmdiX3BpYyArIHkgKiBjLT5yZ2Jfc3RyaWRlICsgeCAqIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5yZ2Jfc3RyaWRlLCB3bXY5X21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5wYWxfcGljICsgeSAqIGMtPnBhbF9zdHJpZGUgKyB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGFsX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmRhdGFbMF0sIGYtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+ZGF0YVsxXSwgZi0+ZGF0YVsyXSwgZi0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoKTsKKyAgICBlbHNlCisgICAgICAgIGN0eC0+ZHNwLm1zczJfYmxpdF93bXY5KGMtPnJnYl9waWMgKyB5ICogYy0+cmdiX3N0cmlkZSArIHggKiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5yZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5kYXRhWzBdLCBmLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+ZGF0YVsxXSwgZi0+ZGF0YVsyXSwgZi0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIGgpOworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjI0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IFJlY3RhbmdsZSB7CisgICAgaW50IGNvZGVkLCB4LCB5LCB3LCBoOworfSBSZWN0YW5nbGU7CisKKyNkZWZpbmUgTUFYX1dNVjlfUkVDVEFOR0xFUyAyMAorI2RlZmluZSBBUklUSDJfUEFERElORyAyCisKK3N0YXRpYyBpbnQgbXNzMl9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIE1TUzJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1TUzEyQ29udGV4dCAqYyAgPSAmY3R4LT5jOworICAgIEFWRnJhbWUgKmZyYW1lICAgPSBkYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ0I7CisgICAgQXJpdGhDb2RlciBhY29kZXI7CisKKyAgICBpbnQga2V5ZnJhbWUsIGhhc193bXY5LCBoYXNfbXYsIGlzX3JsZSwgaXNfNTU1LCByZXQ7CisKKyAgICBSZWN0YW5nbGUgd212OXJlY3RzW01BWF9XTVY5X1JFQ1RBTkdMRVNdLCAqcjsKKyAgICBpbnQgdXNlZF9yZWN0cyA9IDAsIGksIGltcGxpY2l0X3JlY3QgPSAwLCBhdl91bmluaXQod212OV9tYXNrKTsKKworICAgIGF2X2Fzc2VydDAoRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSA+PQorICAgICAgICAgICAgICAgQVJJVEgyX1BBRERJTkcgKyAoTUlOX0NBQ0hFX0JJVFMgKyA3KSAvIDgpOworCisgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIGJ1ZiwgYnVmX3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoa2V5ZnJhbWUgPSBnZXRfYml0czEoJmdiKSkKKyAgICAgICAgc2tpcF9iaXRzKCZnYiwgNyk7CisgICAgaGFzX3dtdjkgPSBnZXRfYml0czEoJmdiKTsKKyAgICBoYXNfbXYgICA9IGtleWZyYW1lID8gMCA6IGdldF9iaXRzMSgmZ2IpOworICAgIGlzX3JsZSAgID0gZ2V0X2JpdHMxKCZnYik7CisgICAgaXNfNTU1ICAgPSBpc19ybGUgJiYgZ2V0X2JpdHMxKCZnYik7CisgICAgaWYgKGMtPnNsaWNlX3NwbGl0ID4gMCkKKyAgICAgICAgY3R4LT5zcGxpdF9wb3NpdGlvbiA9IGMtPnNsaWNlX3NwbGl0OworICAgIGVsc2UgaWYgKGMtPnNsaWNlX3NwbGl0IDwgMCkgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKCZnYikpIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJmdiKSkgeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJmdiKSkKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5zcGxpdF9wb3NpdGlvbiA9IGdldF9iaXRzKCZnYiwgMTYpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5zcGxpdF9wb3NpdGlvbiA9IGdldF9iaXRzKCZnYiwgMTIpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgY3R4LT5zcGxpdF9wb3NpdGlvbiA9IGdldF9iaXRzKCZnYiwgOCkgPDwgNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChrZXlmcmFtZSkKKyAgICAgICAgICAgICAgICBjdHgtPnNwbGl0X3Bvc2l0aW9uID0gYXZjdHgtPmhlaWdodCAvIDI7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgY3R4LT5zcGxpdF9wb3NpdGlvbiA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICBpZiAoYy0+c2xpY2Vfc3BsaXQgJiYgKGN0eC0+c3BsaXRfcG9zaXRpb24gPCAxIC0gaXNfNTU1IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnNwbGl0X3Bvc2l0aW9uID4gYXZjdHgtPmhlaWdodCAtIDEpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGFsaWduX2dldF9iaXRzKCZnYik7CisgICAgYnVmICAgICAgKz0gZ2V0X2JpdHNfY291bnQoJmdiKSA+PiAzOworICAgIGJ1Zl9zaXplIC09IGdldF9iaXRzX2NvdW50KCZnYikgPj4gMzsKKworICAgIGlmIChidWZfc2l6ZSA8IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGlzXzU1NSAmJiAoaGFzX3dtdjkgfHwgaGFzX212IHx8IGMtPnNsaWNlX3NwbGl0ICYmIGN0eC0+c3BsaXRfcG9zaXRpb24pKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gaXNfNTU1ID8gQVZfUElYX0ZNVF9SR0I1NTUgOiBBVl9QSVhfRk1UX1JHQjI0OworICAgIGlmIChjdHgtPmxhc3RfcGljLT5mb3JtYXQgIT0gYXZjdHgtPnBpeF9mbXQpCisgICAgICAgIGF2X2ZyYW1lX3VucmVmKGN0eC0+bGFzdF9waWMpOworCisgICAgaWYgKGhhc193bXY5KSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdCLCBidWYsIGJ1Zl9zaXplICsgQVJJVEgyX1BBRERJTkcpOworICAgICAgICBhcml0aDJfaW5pdCgmYWNvZGVyLCAmZ0IpOworCisgICAgICAgIGltcGxpY2l0X3JlY3QgPSAhYXJpdGgyX2dldF9iaXQoJmFjb2Rlcik7CisKKyAgICAgICAgd2hpbGUgKGFyaXRoMl9nZXRfYml0KCZhY29kZXIpKSB7CisgICAgICAgICAgICBpZiAodXNlZF9yZWN0cyA9PSBNQVhfV01WOV9SRUNUQU5HTEVTKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgciA9ICZ3bXY5cmVjdHNbdXNlZF9yZWN0c107CisgICAgICAgICAgICBpZiAoIXVzZWRfcmVjdHMpCisgICAgICAgICAgICAgICAgci0+eCA9IGFyaXRoMl9nZXRfbnVtYmVyKCZhY29kZXIsIGF2Y3R4LT53aWR0aCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgci0+eCA9IGFyaXRoMl9nZXRfbnVtYmVyKCZhY29kZXIsIGF2Y3R4LT53aWR0aCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdtdjlyZWN0c1t1c2VkX3JlY3RzIC0gMV0ueCkgKworICAgICAgICAgICAgICAgICAgICAgICB3bXY5cmVjdHNbdXNlZF9yZWN0cyAtIDFdLng7CisgICAgICAgICAgICByLT55ID0gYXJpdGgyX2dldF9udW1iZXIoJmFjb2RlciwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgICAgICByLT53ID0gYXJpdGgyX2dldF9udW1iZXIoJmFjb2RlciwgYXZjdHgtPndpZHRoICAtIHItPngpICsgMTsKKyAgICAgICAgICAgIHItPmggPSBhcml0aDJfZ2V0X251bWJlcigmYWNvZGVyLCBhdmN0eC0+aGVpZ2h0IC0gci0+eSkgKyAxOworICAgICAgICAgICAgdXNlZF9yZWN0cysrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGltcGxpY2l0X3JlY3QgJiYgdXNlZF9yZWN0cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbXBsaWNpdF9yZWN0ICYmIHVzZWRfcmVjdHMgPiAwXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGltcGxpY2l0X3JlY3QpIHsKKyAgICAgICAgICAgIHdtdjlyZWN0c1swXS54ID0gMDsKKyAgICAgICAgICAgIHdtdjlyZWN0c1swXS55ID0gMDsKKyAgICAgICAgICAgIHdtdjlyZWN0c1swXS53ID0gYXZjdHgtPndpZHRoOworICAgICAgICAgICAgd212OXJlY3RzWzBdLmggPSBhdmN0eC0+aGVpZ2h0OworCisgICAgICAgICAgICB1c2VkX3JlY3RzID0gMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdXNlZF9yZWN0czsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWltcGxpY2l0X3JlY3QgJiYgYXJpdGgyX2dldF9iaXQoJmFjb2RlcikpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuZXhwZWN0ZWQgZ3JhbmRjaGlsZHJlblxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWkpIHsKKyAgICAgICAgICAgICAgICB3bXY5X21hc2sgPSBhcml0aDJfZ2V0X2JpdCgmYWNvZGVyKSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKCF3bXY5X21hc2spCisgICAgICAgICAgICAgICAgICAgIHdtdjlfbWFzayA9IGFyaXRoMl9nZXRfbnVtYmVyKCZhY29kZXIsIDI1Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3bXY5cmVjdHNbaV0uY29kZWQgPSBhcml0aDJfZ2V0X251bWJlcigmYWNvZGVyLCAyKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZiAgICAgICs9IGFyaXRoMl9nZXRfY29uc3VtZWRfYnl0ZXMoJmFjb2Rlcik7CisgICAgICAgIGJ1Zl9zaXplIC09IGFyaXRoMl9nZXRfY29uc3VtZWRfYnl0ZXMoJmFjb2Rlcik7CisgICAgICAgIGlmIChidWZfc2l6ZSA8IDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBjLT5tdlggPSBjLT5tdlkgPSAwOworICAgIGlmIChrZXlmcmFtZSAmJiAhaXNfNTU1KSB7CisgICAgICAgIGlmICgoaSA9IGRlY29kZV9wYWxfdjIoYywgYnVmLCBidWZfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBidWYgICAgICArPSBpOworICAgICAgICBidWZfc2l6ZSAtPSBpOworICAgIH0gZWxzZSBpZiAoaGFzX212KSB7CisgICAgICAgIGJ1ZiAgICAgICs9IDQ7CisgICAgICAgIGJ1Zl9zaXplIC09IDQ7CisgICAgICAgIGlmIChidWZfc2l6ZSA8IDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgYy0+bXZYID0gQVZfUkIxNihidWYgLSA0KSAtIGF2Y3R4LT53aWR0aDsKKyAgICAgICAgYy0+bXZZID0gQVZfUkIxNihidWYgLSAyKSAtIGF2Y3R4LT5oZWlnaHQ7CisgICAgfQorCisgICAgaWYgKGMtPm12WCA8IDAgfHwgYy0+bXZZIDwgMCkgeworICAgICAgICBGRlNXQVAodWludDhfdCAqLCBjLT5wYWxfcGljLCBjLT5sYXN0X3BhbF9waWMpOworCisgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmIChjdHgtPmxhc3RfcGljLT5kYXRhWzBdKSB7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGZyYW1lLT5saW5lc2l6ZVswXSA9PSBjdHgtPmxhc3RfcGljLT5saW5lc2l6ZVswXSk7CisgICAgICAgICAgICBjLT5sYXN0X3JnYl9waWMgPSBjdHgtPmxhc3RfcGljLT5kYXRhWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bGFzdF9waWMtPmxpbmVzaXplWzBdICogKGF2Y3R4LT5oZWlnaHQgLSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBrZXlmcmFtZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBjdHgtPmxhc3RfcGljKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZnJhbWUsIGN0eC0+bGFzdF9waWMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGMtPmxhc3RfcmdiX3BpYyA9IE5VTEw7CisgICAgfQorICAgIGMtPnJnYl9waWMgICAgPSBmcmFtZS0+ZGF0YVswXSArCisgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVswXSAqIChhdmN0eC0+aGVpZ2h0IC0gMSk7CisgICAgYy0+cmdiX3N0cmlkZSA9IC1mcmFtZS0+bGluZXNpemVbMF07CisKKyAgICBmcmFtZS0+a2V5X2ZyYW1lID0ga2V5ZnJhbWU7CisgICAgZnJhbWUtPnBpY3RfdHlwZSA9IGtleWZyYW1lID8gQVZfUElDVFVSRV9UWVBFX0kgOiBBVl9QSUNUVVJFX1RZUEVfUDsKKworICAgIGlmIChpc181NTUpIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ0IsIGJ1ZiwgYnVmX3NpemUpOworCisgICAgICAgIGlmIChkZWNvZGVfNTU1KCZnQiwgKHVpbnQxNl90ICopYy0+cmdiX3BpYywgYy0+cmdiX3N0cmlkZSA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICBrZXlmcmFtZSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGJ1Zl9zaXplIC09IGJ5dGVzdHJlYW0yX3RlbGwoJmdCKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoa2V5ZnJhbWUpIHsKKyAgICAgICAgICAgIGMtPmNvcnJ1cHRlZCA9IDA7CisgICAgICAgICAgICBmZl9tc3MxMl9zbGljZWNvbnRleHRfcmVzZXQoJmN0eC0+c2NbMF0pOworICAgICAgICAgICAgaWYgKGMtPnNsaWNlX3NwbGl0KQorICAgICAgICAgICAgICAgIGZmX21zczEyX3NsaWNlY29udGV4dF9yZXNldCgmY3R4LT5zY1sxXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzX3JsZSkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIGJ1ZiwgYnVmX3NpemUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGlmIChyZXQgPSBkZWNvZGVfcmxlKCZnYiwgYy0+cGFsX3BpYywgYy0+cGFsX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnJnYl9waWMsIGMtPnJnYl9zdHJpZGUsIGMtPnBhbCwga2V5ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnNwbGl0X3Bvc2l0aW9uLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJmdiKTsKKworICAgICAgICAgICAgaWYgKGMtPnNsaWNlX3NwbGl0KQorICAgICAgICAgICAgICAgIGlmIChyZXQgPSBkZWNvZGVfcmxlKCZnYiwgYy0+cGFsX3BpYywgYy0+cGFsX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5yZ2JfcGljLCBjLT5yZ2Jfc3RyaWRlLCBjLT5wYWwsIGtleWZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+c3BsaXRfcG9zaXRpb24sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJmdiKTsKKyAgICAgICAgICAgIGJ1ZiAgICAgICs9IGdldF9iaXRzX2NvdW50KCZnYikgPj4gMzsKKyAgICAgICAgICAgIGJ1Zl9zaXplIC09IGdldF9iaXRzX2NvdW50KCZnYikgPj4gMzsKKyAgICAgICAgfSBlbHNlIGlmICghaW1wbGljaXRfcmVjdCB8fCB3bXY5X21hc2sgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChjLT5jb3JydXB0ZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnQiwgYnVmLCBidWZfc2l6ZSArIEFSSVRIMl9QQURESU5HKTsKKyAgICAgICAgICAgIGFyaXRoMl9pbml0KCZhY29kZXIsICZnQik7CisgICAgICAgICAgICBjLT5rZXlmcmFtZSA9IGtleWZyYW1lOworICAgICAgICAgICAgaWYgKGMtPmNvcnJ1cHRlZCA9IGZmX21zczEyX2RlY29kZV9yZWN0KCZjdHgtPnNjWzBdLCAmYWNvZGVyLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnNwbGl0X3Bvc2l0aW9uKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgYnVmICAgICAgKz0gYXJpdGgyX2dldF9jb25zdW1lZF9ieXRlcygmYWNvZGVyKTsKKyAgICAgICAgICAgIGJ1Zl9zaXplIC09IGFyaXRoMl9nZXRfY29uc3VtZWRfYnl0ZXMoJmFjb2Rlcik7CisgICAgICAgICAgICBpZiAoYy0+c2xpY2Vfc3BsaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmX3NpemUgPCAxKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnQiwgYnVmLCBidWZfc2l6ZSArIEFSSVRIMl9QQURESU5HKTsKKyAgICAgICAgICAgICAgICBhcml0aDJfaW5pdCgmYWNvZGVyLCAmZ0IpOworICAgICAgICAgICAgICAgIGlmIChjLT5jb3JydXB0ZWQgPSBmZl9tc3MxMl9kZWNvZGVfcmVjdCgmY3R4LT5zY1sxXSwgJmFjb2RlciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5zcGxpdF9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0IC0gY3R4LT5zcGxpdF9wb3NpdGlvbikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgYnVmICAgICAgKz0gYXJpdGgyX2dldF9jb25zdW1lZF9ieXRlcygmYWNvZGVyKTsKKyAgICAgICAgICAgICAgICBidWZfc2l6ZSAtPSBhcml0aDJfZ2V0X2NvbnN1bWVkX2J5dGVzKCZhY29kZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1lbXNldChjLT5wYWxfcGljLCAwLCBjLT5wYWxfc3RyaWRlICogYXZjdHgtPmhlaWdodCk7CisgICAgfQorCisgICAgaWYgKGhhc193bXY5KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1c2VkX3JlY3RzOyBpKyspIHsKKyAgICAgICAgICAgIGludCB4ID0gd212OXJlY3RzW2ldLng7CisgICAgICAgICAgICBpbnQgeSA9IHdtdjlyZWN0c1tpXS55OworICAgICAgICAgICAgaW50IHcgPSB3bXY5cmVjdHNbaV0udzsKKyAgICAgICAgICAgIGludCBoID0gd212OXJlY3RzW2ldLmg7CisgICAgICAgICAgICBpZiAod212OXJlY3RzW2ldLmNvZGVkKSB7CisgICAgICAgICAgICAgICAgaW50IFdNVjljb2RlZEZyYW1lU2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmX3NpemUgPCA0IHx8ICEoV01WOWNvZGVkRnJhbWVTaXplID0gQVZfUkwyNChidWYpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9IGRlY29kZV93bXY5KGF2Y3R4LCBidWYgKyAzLCBidWZfc2l6ZSAtIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIHcsIGgsIHdtdjlfbWFzaykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgYnVmICAgICAgKz0gV01WOWNvZGVkRnJhbWVTaXplICsgMzsKKyAgICAgICAgICAgICAgICBidWZfc2l6ZSAtPSBXTVY5Y29kZWRGcmFtZVNpemUgKyAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBjLT5yZ2JfcGljICsgeSAqIGMtPnJnYl9zdHJpZGUgKyB4ICogMzsKKyAgICAgICAgICAgICAgICBpZiAod212OV9tYXNrICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+ZHNwLm1zczJfZ3JheV9maWxsX21hc2tlZChkc3QsIGMtPnJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bXY5X21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5wYWxfcGljICsgeSAqIGMtPnBhbF9zdHJpZGUgKyB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGFsX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIGgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChkc3QsIDB4ODAsIHcgKiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBjLT5yZ2Jfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChidWZfc2l6ZSkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImJ1ZmZlciBub3QgZnVsbHkgY29uc3VtZWRcbiIpOworCisgICAgaWYgKGMtPm12WCA8IDAgfHwgYy0+bXZZIDwgMCkgeworICAgICAgICBhdl9mcmFtZV91bnJlZihjdHgtPmxhc3RfcGljKTsKKyAgICAgICAgcmV0ID0gYXZfZnJhbWVfcmVmKGN0eC0+bGFzdF9waWMsIGZyYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgICpnb3RfZnJhbWUgICAgICAgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgd212OV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWQzFDb250ZXh0ICp2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgdi0+cy5hdmN0eCAgICA9IGF2Y3R4OworCisgICAgaWYgKChyZXQgPSBmZl92YzFfaW5pdF9jb21tb24odikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBmZl92YzFkc3BfaW5pdCgmdi0+dmMxZHNwKTsKKworICAgIHYtPnByb2ZpbGUgPSBQUk9GSUxFX01BSU47CisKKyAgICB2LT56el84eDQgICAgID0gZmZfd212Ml9zY2FudGFibGVBOworICAgIHYtPnp6XzR4OCAgICAgPSBmZl93bXYyX3NjYW50YWJsZUI7CisgICAgdi0+cmVzX3k0MTEgICA9IDA7CisgICAgdi0+cmVzX3Nwcml0ZSA9IDA7CisKKyAgICB2LT5mcm1ydHFfcG9zdHByb2MgPSA3OworICAgIHYtPmJpdHJ0cV9wb3N0cHJvYyA9IDMxOworCisgICAgdi0+cmVzX3g4ICAgICAgICAgID0gMDsKKyAgICB2LT5tdWx0aXJlcyAgICAgICAgPSAwOworICAgIHYtPnJlc19mYXN0dHggICAgICA9IDE7CisKKyAgICB2LT5mYXN0dXZtYyAgICAgICAgPSAwOworCisgICAgdi0+ZXh0ZW5kZWRfbXYgICAgID0gMDsKKworICAgIHYtPmRxdWFudCAgICAgICAgICA9IDE7CisgICAgdi0+dnN0cmFuc2Zvcm0gICAgID0gMTsKKworICAgIHYtPnJlc190cmFuc3RhYiAgICA9IDA7CisKKyAgICB2LT5vdmVybGFwICAgICAgICAgPSAwOworCisgICAgdi0+cmVzeW5jX21hcmtlciAgID0gMDsKKyAgICB2LT5yYW5nZXJlZCAgICAgICAgPSAwOworCisgICAgdi0+cy5tYXhfYl9mcmFtZXMgPSBhdmN0eC0+bWF4X2JfZnJhbWVzID0gMDsKKyAgICB2LT5xdWFudGl6ZXJfbW9kZSA9IDA7CisKKyAgICB2LT5maW50ZXJwZmxhZyA9IDA7CisKKyAgICB2LT5yZXNfcnRtX2ZsYWcgPSAxOworCisgICAgZmZfdmMxX2luaXRfdHJhbnNwb3NlZF9zY2FudGFibGVzKHYpOworCisgICAgaWYgKChyZXQgPSBmZl9tc21wZWc0X2RlY29kZV9pbml0KGF2Y3R4KSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl92YzFfZGVjb2RlX2luaXRfYWxsb2NfdGFibGVzKHYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBlcnJvciBjb25jZWFsbWVudCAqLworICAgIHYtPnMubWUucXBlbF9wdXQgPSB2LT5zLnFkc3AucHV0X3FwZWxfcGl4ZWxzX3RhYjsKKyAgICB2LT5zLm1lLnFwZWxfYXZnID0gdi0+cy5xZHNwLmF2Z19xcGVsX3BpeGVsc190YWI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG1zczJfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTVNTMkNvbnRleHQgKmNvbnN0IGN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZjdHgtPmxhc3RfcGljKTsKKworICAgIGZmX21zczEyX2RlY29kZV9lbmQoJmN0eC0+Yyk7CisgICAgYXZfZnJlZXAoJmN0eC0+Yy5wYWxfcGljKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5jLmxhc3RfcGFsX3BpYyk7CisgICAgZmZfdmMxX2RlY29kZV9lbmQoYXZjdHgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtc3MyX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNU1MyQ29udGV4dCAqIGNvbnN0IGN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTVNTMTJDb250ZXh0ICpjID0gJmN0eC0+YzsKKyAgICBpbnQgcmV0OworICAgIGMtPmF2Y3R4ID0gYXZjdHg7CisgICAgaWYgKHJldCA9IGZmX21zczEyX2RlY29kZV9pbml0KGMsIDEsICZjdHgtPnNjWzBdLCAmY3R4LT5zY1sxXSkpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgY3R4LT5sYXN0X3BpYyAgID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBjLT5wYWxfc3RyaWRlICAgPSBjLT5tYXNrX3N0cmlkZTsKKyAgICBjLT5wYWxfcGljICAgICAgPSBhdl9tYWxsb2N6KGMtPnBhbF9zdHJpZGUgKiBhdmN0eC0+aGVpZ2h0KTsKKyAgICBjLT5sYXN0X3BhbF9waWMgPSBhdl9tYWxsb2N6KGMtPnBhbF9zdHJpZGUgKiBhdmN0eC0+aGVpZ2h0KTsKKyAgICBpZiAoIWMtPnBhbF9waWMgfHwgIWMtPmxhc3RfcGFsX3BpYyB8fCAhY3R4LT5sYXN0X3BpYykgeworICAgICAgICBtc3MyX2RlY29kZV9lbmQoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBpZiAocmV0ID0gd212OV9pbml0KGF2Y3R4KSkgeworICAgICAgICBtc3MyX2RlY29kZV9lbmQoYXZjdHgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBmZl9tc3MyZHNwX2luaXQoJmN0eC0+ZHNwKTsKKyAgICBmZl9xcGVsZHNwX2luaXQoJmN0eC0+cWRzcCk7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IGMtPmZyZWVfY29sb3VycyA9PSAxMjcgPyBBVl9QSVhfRk1UX1JHQjU1NQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX1BJWF9GTVRfUkdCMjQ7CisKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX21zczJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXNzMiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1TIFdpbmRvd3MgTWVkaWEgVmlkZW8gVjkgU2NyZWVuIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01TUzIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1TUzJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBtc3MyX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IG1zczJfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBtc3MyX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21zczJkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL21zczJkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWZjMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNzMmRzcC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTWljcm9zb2Z0IFNjcmVlbiAyIChha2EgV2luZG93cyBNZWRpYSBWaWRlbyBWOSBTY3JlZW4pIGRlY29kZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTWljcm9zb2Z0IFNjcmVlbiAyIChha2EgV2luZG93cyBNZWRpYSBWaWRlbyBWOSBTY3JlZW4pIGRlY29kZXIgRFNQIHJvdXRpbmVzCisgKi8KKworI2luY2x1ZGUgIm1zczJkc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgbXNzMl9ibGl0X3dtdjlfdGVtcGxhdGUodWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmN1dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgaSwgaiwgaywgciA9IC0xOworICAgIHdoaWxlICgrK3IgPCBoKSB7CisgICAgICAgIGZvciAoaSA9IDAsIGogPSAwLCBrID0gMDsgaSA8IHc7IGogKz0gKGkgJiAxKSwgaSsrLCBrICs9IDMpIHsKKyAgICAgICAgICAgIGlmICghdXNlX21hc2sgfHwgbWFza1tpXSA9PSBtYXNrY29sb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ3JheSkgeworICAgICAgICAgICAgICAgICAgICBkc3Rba10gPSBkc3RbayArIDFdID0gZHN0W2sgKyAyXSA9IDB4ODA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHkgPSBzcmN5W2ldOworICAgICAgICAgICAgICAgICAgICBpbnQgdSA9IHNyY3Vbal0gLSAxMjg7CisgICAgICAgICAgICAgICAgICAgIGludCB2ID0gc3JjdltqXSAtIDEyODsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2tdICAgICA9IGF2X2NsaXBfdWludDgoeSArICggICAgICAgICAgICAgOTE4ODEgKiB2ICsgMzI3NjggPj4gMTYpKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2sgKyAxXSA9IGF2X2NsaXBfdWludDgoeSArICgtMjI1NTQgKiB1IC0gNDY4MDIgKiB2ICsgMzI3NjggPj4gMTYpKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2sgKyAyXSA9IGF2X2NsaXBfdWludDgoeSArICgxMTYxMzAgKiB1ICAgICAgICAgICAgICsgMzI3NjggPj4gMTYpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWFzayArPSAgbWFza19zdHJpZGU7CisgICAgICAgIGRzdCAgKz0gICBkc3Rfc3RyaWRlOworICAgICAgICBzcmN5ICs9ICBzcmN5X3N0cmlkZTsKKyAgICAgICAgc3JjdSArPSBzcmN1dl9zdHJpZGUgKiAociAmIDEpOworICAgICAgICBzcmN2ICs9IHNyY3V2X3N0cmlkZSAqIChyICYgMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtc3MyX2JsaXRfd212OV9jKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3ksIGludCBzcmN5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjdSwgY29uc3QgdWludDhfdCAqc3JjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY3V2X3N0cmlkZSwgaW50IHcsIGludCBoKQoreworICAgIG1zczJfYmxpdF93bXY5X3RlbXBsYXRlKGRzdCwgZHN0X3N0cmlkZSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3ksIHNyY3lfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3UsIHNyY3YsIHNyY3V2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoKTsKK30KKworc3RhdGljIHZvaWQgbXNzMl9ibGl0X3dtdjlfbWFza2VkX2ModWludDhfdCAqZHN0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrY29sb3IsIGNvbnN0IHVpbnQ4X3QgKm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmN5LCBpbnQgc3JjeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmN1LCBjb25zdCB1aW50OF90ICpzcmN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY3V2X3N0cmlkZSwgaW50IHcsIGludCBoKQoreworICAgIG1zczJfYmxpdF93bXY5X3RlbXBsYXRlKGRzdCwgZHN0X3N0cmlkZSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrY29sb3IsIG1hc2ssIG1hc2tfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3ksIHNyY3lfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3UsIHNyY3YsIHNyY3V2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoKTsKK30KKworc3RhdGljIHZvaWQgbXNzMl9ncmF5X2ZpbGxfbWFza2VkX2ModWludDhfdCAqZHN0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrY29sb3IsIGNvbnN0IHVpbnQ4X3QgKm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19zdHJpZGUsIGludCB3LCBpbnQgaCkKK3sKKyAgICBtc3MyX2JsaXRfd212OV90ZW1wbGF0ZShkc3QsIGRzdF9zdHJpZGUsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2NvbG9yLCBtYXNrLCBtYXNrX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgaCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwc2FtcGxlX3BsYW5lX2ModWludDhfdCAqcGxhbmUsIGludCBwbGFuZV9zdHJpZGUsIGludCB3LCBpbnQgaCkKK3sKKyAgICB1aW50OF90ICpzcmMxLCAqc3JjMiwgKmRzdDEsICpkc3QyLCAqcCwgYSwgYjsKKyAgICBpbnQgaSwgajsKKworICAgIGlmKCF3IHx8ICFoKQorICAgICAgICByZXR1cm47CisKKyAgICB3ICs9ICh3ICYgMSk7CisgICAgaCArPSAoaCAmIDEpOworCisgICAgaiA9IGggLSAxOworCisgICAgbWVtY3B5KHBsYW5lICsgcGxhbmVfc3RyaWRlICogIGosCisgICAgICAgICAgIHBsYW5lICsgcGxhbmVfc3RyaWRlICogKGogPj4gMSksCisgICAgICAgICAgIHcpOworCisgICAgd2hpbGUgKChqIC09IDIpID4gMCkgeworICAgICAgICBkc3QxID0gcGxhbmUgKyBwbGFuZV9zdHJpZGUgKiAgKGogKyAxKTsKKyAgICAgICAgZHN0MiA9IHBsYW5lICsgcGxhbmVfc3RyaWRlICogICBqOworICAgICAgICBzcmMxID0gcGxhbmUgKyBwbGFuZV9zdHJpZGUgKiAoKGogKyAxKSA+PiAxKTsKKyAgICAgICAgc3JjMiA9IHBsYW5lICsgcGxhbmVfc3RyaWRlICogKCBqICAgICAgPj4gMSk7CisKKyAgICAgICAgZm9yIChpID0gKHcgLSAxKSA+PiAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYSA9IHNyYzFbaV07CisgICAgICAgICAgICBiID0gc3JjMltpXTsKKyAgICAgICAgICAgIGRzdDFbaV0gPSAoMyAqIGEgKyBiICsgMikgPj4gMjsKKyAgICAgICAgICAgIGRzdDJbaV0gPSAoYSArIDMgKiBiICsgMikgPj4gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaiA9IGggLSAxOyBqID49IDA7IGotLSkgeworICAgICAgICBwID0gcGxhbmUgKyBwbGFuZV9zdHJpZGUgKiBqOworICAgICAgICBpID0gdyAtIDE7CisKKyAgICAgICAgcFtpXSA9IHBbaSA+PiAxXTsKKworICAgICAgICB3aGlsZSAoKGkgLT0gMikgPiAwKSB7CisgICAgICAgICAgICBhID0gcFsgaSAgICAgID4+IDFdOworICAgICAgICAgICAgYiA9IHBbKGkgKyAxKSA+PiAxXTsKKyAgICAgICAgICAgIHBbaV0gICAgID0gKDMgKiBhICsgYiArIDEpID4+IDI7CisgICAgICAgICAgICBwW2kgKyAxXSA9IChhICsgMyAqIGIgKyAxKSA+PiAyOworICAgICAgICB9CisgICAgfQorfQorCithdl9jb2xkIHZvaWQgZmZfbXNzMmRzcF9pbml0KE1TUzJEU1BDb250ZXh0KiBkc3ApCit7CisgICAgZHNwLT5tc3MyX2JsaXRfd212OSAgICAgICAgPSBtc3MyX2JsaXRfd212OV9jOworICAgIGRzcC0+bXNzMl9ibGl0X3dtdjlfbWFza2VkID0gbXNzMl9ibGl0X3dtdjlfbWFza2VkX2M7CisgICAgZHNwLT5tc3MyX2dyYXlfZmlsbF9tYXNrZWQgPSBtc3MyX2dyYXlfZmlsbF9tYXNrZWRfYzsKKyAgICBkc3AtPnVwc2FtcGxlX3BsYW5lICAgICAgICA9IHVwc2FtcGxlX3BsYW5lX2M7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tc3MyZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy9tc3MyZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2OGFiYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21zczJkc3AuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogTWljcm9zb2Z0IFNjcmVlbiAyIChha2EgV2luZG93cyBNZWRpYSBWaWRlbyBWOSBTY3JlZW4pIGRlY29kZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTWljcm9zb2Z0IFNjcmVlbiAyIChha2EgV2luZG93cyBNZWRpYSBWaWRlbyBWOSBTY3JlZW4pIGRlY29kZXIgRFNQIHJvdXRpbmVzCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01TUzJEU1BfSAorI2RlZmluZSBBVkNPREVDX01TUzJEU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IE1TUzJEU1BDb250ZXh0IHsKKyAgICB2b2lkICgqbXNzMl9ibGl0X3dtdjkpKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmN5LCBpbnQgc3JjeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmN1LCBjb25zdCB1aW50OF90ICpzcmN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY3V2X3N0cmlkZSwgaW50IHcsIGludCBoKTsKKyAgICB2b2lkICgqbXNzMl9ibGl0X3dtdjlfbWFza2VkKSh1aW50OF90ICpkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrY29sb3IsIGNvbnN0IHVpbnQ4X3QgKm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3ksIGludCBzcmN5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmN1LCBjb25zdCB1aW50OF90ICpzcmN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmN1dl9zdHJpZGUsIGludCB3LCBpbnQgaCk7CisgICAgdm9pZCAoKm1zczJfZ3JheV9maWxsX21hc2tlZCkodWludDhfdCAqZHN0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza2NvbG9yLCBjb25zdCB1aW50OF90ICptYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX3N0cmlkZSwgaW50IHcsIGludCBoKTsKKyAgICB2b2lkICgqdXBzYW1wbGVfcGxhbmUpKHVpbnQ4X3QgKnBsYW5lLCBpbnQgcGxhbmVfc3RyaWRlLCBpbnQgdywgaW50IGgpOworfSBNU1MyRFNQQ29udGV4dDsKKwordm9pZCBmZl9tc3MyZHNwX2luaXQoTVNTMkRTUENvbnRleHQgKmRzcCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX01TUzJEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXNzMy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNzMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTY4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tc3MzLmMKQEAgLTAsMCArMSw4NzMgQEAKKy8qCisgKiBNaWNyb3NvZnQgU2NyZWVuIDMgKGFrYSBNaWNyb3NvZnQgQVRDIFNjcmVlbikgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTWljcm9zb2Z0IFNjcmVlbiAzIChha2EgTWljcm9zb2Z0IEFUQyBTY3JlZW4pIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtc3MzNGRzcC5oIgorCisjZGVmaW5lIEhFQURFUl9TSVpFIDI3CisKKyNkZWZpbmUgTU9ERUwyX1NDQUxFICAgICAgIDEzCisjZGVmaW5lIE1PREVMX1NDQUxFICAgICAgICAxNQorI2RlZmluZSBNT0RFTDI1Nl9TRUNfU0NBTEUgIDkKKwordHlwZWRlZiBzdHJ1Y3QgTW9kZWwyIHsKKyAgICBpbnQgICAgICB1cGRfdmFsLCB0aWxsX3Jlc2NhbGU7CisgICAgdW5zaWduZWQgemVyb19mcmVxLCAgemVyb193ZWlnaHQ7CisgICAgdW5zaWduZWQgdG90YWxfZnJlcSwgdG90YWxfd2VpZ2h0OworfSBNb2RlbDI7CisKK3R5cGVkZWYgc3RydWN0IE1vZGVsIHsKKyAgICBpbnQgd2VpZ2h0c1sxNl0sIGZyZXFzWzE2XTsKKyAgICBpbnQgbnVtX3N5bXM7CisgICAgaW50IHRvdF93ZWlnaHQ7CisgICAgaW50IHVwZF92YWwsIG1heF91cGRfdmFsLCB0aWxsX3Jlc2NhbGU7Cit9IE1vZGVsOworCit0eXBlZGVmIHN0cnVjdCBNb2RlbDI1NiB7CisgICAgaW50IHdlaWdodHNbMjU2XSwgZnJlcXNbMjU2XTsKKyAgICBpbnQgdG90X3dlaWdodDsKKyAgICBpbnQgc2Vjb25kYXJ5WzY4XTsKKyAgICBpbnQgc2VjX3NpemU7CisgICAgaW50IHVwZF92YWwsIG1heF91cGRfdmFsLCB0aWxsX3Jlc2NhbGU7Cit9IE1vZGVsMjU2OworCisjZGVmaW5lIFJBQ19CT1RUT00gMHgwMTAwMDAwMAordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VDb2RlciB7CisgICAgY29uc3QgdWludDhfdCAqc3JjLCAqc3JjX2VuZDsKKworICAgIHVpbnQzMl90IHJhbmdlLCBsb3c7CisgICAgaW50IGdvdF9lcnJvcjsKK30gUmFuZ2VDb2RlcjsKKworZW51bSBCbG9ja1R5cGUgeworICAgIEZJTExfQkxPQ0sgPSAwLAorICAgIElNQUdFX0JMT0NLLAorICAgIERDVF9CTE9DSywKKyAgICBIQUFSX0JMT0NLLAorICAgIFNLSVBfQkxPQ0sKK307CisKK3R5cGVkZWYgc3RydWN0IEJsb2NrVHlwZUNvbnRleHQgeworICAgIGludCAgICAgIGxhc3RfdHlwZTsKKyAgICBNb2RlbCAgICBidF9tb2RlbFs1XTsKK30gQmxvY2tUeXBlQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgRmlsbEJsb2NrQ29kZXIgeworICAgIGludCAgICAgIGZpbGxfdmFsOworICAgIE1vZGVsICAgIGNvZWZfbW9kZWw7Cit9IEZpbGxCbG9ja0NvZGVyOworCit0eXBlZGVmIHN0cnVjdCBJbWFnZUJsb2NrQ29kZXIgeworICAgIE1vZGVsMjU2IGVzY19tb2RlbCwgdmVjX2VudHJ5X21vZGVsOworICAgIE1vZGVsICAgIHZlY19zaXplX21vZGVsOworICAgIE1vZGVsICAgIHZxX21vZGVsWzEyNV07Cit9IEltYWdlQmxvY2tDb2RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgRENUQmxvY2tDb2RlciB7CisgICAgaW50ICAgICAgKnByZXZfZGM7CisgICAgaW50ICAgICAgcHJldl9kY19zdHJpZGU7CisgICAgaW50ICAgICAgcHJldl9kY19oZWlnaHQ7CisgICAgaW50ICAgICAgcXVhbGl0eTsKKyAgICB1aW50MTZfdCBxbWF0WzY0XTsKKyAgICBNb2RlbCAgICBkY19tb2RlbDsKKyAgICBNb2RlbDIgICBzaWduX21vZGVsOworICAgIE1vZGVsMjU2IGFjX21vZGVsOworfSBEQ1RCbG9ja0NvZGVyOworCit0eXBlZGVmIHN0cnVjdCBIYWFyQmxvY2tDb2RlciB7CisgICAgaW50ICAgICAgcXVhbGl0eSwgc2NhbGU7CisgICAgTW9kZWwyNTYgY29lZl9tb2RlbDsKKyAgICBNb2RlbCAgICBjb2VmX2hpX21vZGVsOworfSBIYWFyQmxvY2tDb2RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgTVNTM0NvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICAgKmF2Y3R4OworICAgIEFWRnJhbWUgICAgICAgICAgKnBpYzsKKworICAgIGludCAgICAgICAgICAgICAgZ290X2Vycm9yOworICAgIFJhbmdlQ29kZXIgICAgICAgY29kZXI7CisgICAgQmxvY2tUeXBlQ29udGV4dCBidHlwZVszXTsKKyAgICBGaWxsQmxvY2tDb2RlciAgIGZpbGxfY29kZXJbM107CisgICAgSW1hZ2VCbG9ja0NvZGVyICBpbWFnZV9jb2RlclszXTsKKyAgICBEQ1RCbG9ja0NvZGVyICAgIGRjdF9jb2RlclszXTsKKyAgICBIYWFyQmxvY2tDb2RlciAgIGhhYXJfY29kZXJbM107CisKKyAgICBpbnQgICAgICAgICAgICAgIGRjdGJsb2NrWzY0XTsKKyAgICBpbnQgICAgICAgICAgICAgIGhibG9ja1sxNiAqIDE2XTsKK30gTVNTM0NvbnRleHQ7CisKKworc3RhdGljIHZvaWQgbW9kZWwyX3Jlc2V0KE1vZGVsMiAqbSkKK3sKKyAgICBtLT56ZXJvX3dlaWdodCAgPSAxOworICAgIG0tPnRvdGFsX3dlaWdodCA9IDI7CisgICAgbS0+emVyb19mcmVxICAgID0gMHgxMDAwOworICAgIG0tPnRvdGFsX2ZyZXEgICA9IDB4MjAwMDsKKyAgICBtLT51cGRfdmFsICAgICAgPSA0OworICAgIG0tPnRpbGxfcmVzY2FsZSA9IDQ7Cit9CisKK3N0YXRpYyB2b2lkIG1vZGVsMl91cGRhdGUoTW9kZWwyICptLCBpbnQgYml0KQoreworICAgIHVuc2lnbmVkIHNjYWxlOworCisgICAgaWYgKCFiaXQpCisgICAgICAgIG0tPnplcm9fd2VpZ2h0Kys7CisgICAgbS0+dGlsbF9yZXNjYWxlLS07CisgICAgaWYgKG0tPnRpbGxfcmVzY2FsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbS0+dG90YWxfd2VpZ2h0ICs9IG0tPnVwZF92YWw7CisgICAgaWYgKG0tPnRvdGFsX3dlaWdodCA+IDB4MjAwMCkgeworICAgICAgICBtLT50b3RhbF93ZWlnaHQgPSAobS0+dG90YWxfd2VpZ2h0ICsgMSkgPj4gMTsKKyAgICAgICAgbS0+emVyb193ZWlnaHQgID0gKG0tPnplcm9fd2VpZ2h0ICArIDEpID4+IDE7CisgICAgICAgIGlmIChtLT50b3RhbF93ZWlnaHQgPT0gbS0+emVyb193ZWlnaHQpCisgICAgICAgICAgICBtLT50b3RhbF93ZWlnaHQgPSBtLT56ZXJvX3dlaWdodCArIDE7CisgICAgfQorICAgIG0tPnVwZF92YWwgPSBtLT51cGRfdmFsICogNSA+PiAyOworICAgIGlmIChtLT51cGRfdmFsID4gNjQpCisgICAgICAgIG0tPnVwZF92YWwgPSA2NDsKKyAgICBzY2FsZSA9IDB4ODAwMDAwMDB1IC8gbS0+dG90YWxfd2VpZ2h0OworICAgIG0tPnplcm9fZnJlcSAgICA9IG0tPnplcm9fd2VpZ2h0ICAqIHNjYWxlID4+IDE4OworICAgIG0tPnRvdGFsX2ZyZXEgICA9IG0tPnRvdGFsX3dlaWdodCAqIHNjYWxlID4+IDE4OworICAgIG0tPnRpbGxfcmVzY2FsZSA9IG0tPnVwZF92YWw7Cit9CisKK3N0YXRpYyB2b2lkIG1vZGVsX3VwZGF0ZShNb2RlbCAqbSwgaW50IHZhbCkKK3sKKyAgICBpbnQgaSwgc3VtID0gMDsKKyAgICB1bnNpZ25lZCBzY2FsZTsKKworICAgIG0tPndlaWdodHNbdmFsXSsrOworICAgIG0tPnRpbGxfcmVzY2FsZS0tOworICAgIGlmIChtLT50aWxsX3Jlc2NhbGUpCisgICAgICAgIHJldHVybjsKKyAgICBtLT50b3Rfd2VpZ2h0ICs9IG0tPnVwZF92YWw7CisKKyAgICBpZiAobS0+dG90X3dlaWdodCA+IDB4ODAwMCkgeworICAgICAgICBtLT50b3Rfd2VpZ2h0ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG0tPm51bV9zeW1zOyBpKyspIHsKKyAgICAgICAgICAgIG0tPndlaWdodHNbaV0gID0gKG0tPndlaWdodHNbaV0gKyAxKSA+PiAxOworICAgICAgICAgICAgbS0+dG90X3dlaWdodCArPSAgbS0+d2VpZ2h0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzY2FsZSA9IDB4ODAwMDAwMDB1IC8gbS0+dG90X3dlaWdodDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbS0+bnVtX3N5bXM7IGkrKykgeworICAgICAgICBtLT5mcmVxc1tpXSA9IHN1bSAqIHNjYWxlID4+IDE2OworICAgICAgICBzdW0gKz0gbS0+d2VpZ2h0c1tpXTsKKyAgICB9CisKKyAgICBtLT51cGRfdmFsID0gbS0+dXBkX3ZhbCAqIDUgPj4gMjsKKyAgICBpZiAobS0+dXBkX3ZhbCA+IG0tPm1heF91cGRfdmFsKQorICAgICAgICBtLT51cGRfdmFsID0gbS0+bWF4X3VwZF92YWw7CisgICAgbS0+dGlsbF9yZXNjYWxlID0gbS0+dXBkX3ZhbDsKK30KKworc3RhdGljIHZvaWQgbW9kZWxfcmVzZXQoTW9kZWwgKm0pCit7CisgICAgaW50IGk7CisKKyAgICBtLT50b3Rfd2VpZ2h0ICAgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBtLT5udW1fc3ltcyAtIDE7IGkrKykKKyAgICAgICAgbS0+d2VpZ2h0c1tpXSA9IDE7CisgICAgbS0+d2VpZ2h0c1ttLT5udW1fc3ltcyAtIDFdID0gMDsKKworICAgIG0tPnVwZF92YWwgICAgICA9IG0tPm51bV9zeW1zOworICAgIG0tPnRpbGxfcmVzY2FsZSA9IDE7CisgICAgbW9kZWxfdXBkYXRlKG0sIG0tPm51bV9zeW1zIC0gMSk7CisgICAgbS0+dGlsbF9yZXNjYWxlID0KKyAgICBtLT51cGRfdmFsICAgICAgPSAobS0+bnVtX3N5bXMgKyA2KSA+PiAxOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIG1vZGVsX2luaXQoTW9kZWwgKm0sIGludCBudW1fc3ltcykKK3sKKyAgICBtLT5udW1fc3ltcyAgICA9IG51bV9zeW1zOworICAgIG0tPm1heF91cGRfdmFsID0gOCAqIG51bV9zeW1zICsgNDg7CisKKyAgICBtb2RlbF9yZXNldChtKTsKK30KKworc3RhdGljIHZvaWQgbW9kZWwyNTZfdXBkYXRlKE1vZGVsMjU2ICptLCBpbnQgdmFsKQoreworICAgIGludCBpLCBzdW0gPSAwOworICAgIHVuc2lnbmVkIHNjYWxlOworICAgIGludCBzZW5kLCBzaWR4ID0gMTsKKworICAgIG0tPndlaWdodHNbdmFsXSsrOworICAgIG0tPnRpbGxfcmVzY2FsZS0tOworICAgIGlmIChtLT50aWxsX3Jlc2NhbGUpCisgICAgICAgIHJldHVybjsKKyAgICBtLT50b3Rfd2VpZ2h0ICs9IG0tPnVwZF92YWw7CisKKyAgICBpZiAobS0+dG90X3dlaWdodCA+IDB4ODAwMCkgeworICAgICAgICBtLT50b3Rfd2VpZ2h0ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICBtLT53ZWlnaHRzW2ldICA9IChtLT53ZWlnaHRzW2ldICsgMSkgPj4gMTsKKyAgICAgICAgICAgIG0tPnRvdF93ZWlnaHQgKz0gIG0tPndlaWdodHNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgc2NhbGUgPSAweDgwMDAwMDAwdSAvIG0tPnRvdF93ZWlnaHQ7CisgICAgbS0+c2Vjb25kYXJ5WzBdID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgbS0+ZnJlcXNbaV0gPSBzdW0gKiBzY2FsZSA+PiAxNjsKKyAgICAgICAgc3VtICs9IG0tPndlaWdodHNbaV07CisgICAgICAgIHNlbmQgPSBtLT5mcmVxc1tpXSA+PiBNT0RFTDI1Nl9TRUNfU0NBTEU7CisgICAgICAgIHdoaWxlIChzaWR4IDw9IHNlbmQpCisgICAgICAgICAgICBtLT5zZWNvbmRhcnlbc2lkeCsrXSA9IGkgLSAxOworICAgIH0KKyAgICB3aGlsZSAoc2lkeCA8IG0tPnNlY19zaXplKQorICAgICAgICBtLT5zZWNvbmRhcnlbc2lkeCsrXSA9IDI1NTsKKworICAgIG0tPnVwZF92YWwgPSBtLT51cGRfdmFsICogNSA+PiAyOworICAgIGlmIChtLT51cGRfdmFsID4gbS0+bWF4X3VwZF92YWwpCisgICAgICAgIG0tPnVwZF92YWwgPSBtLT5tYXhfdXBkX3ZhbDsKKyAgICBtLT50aWxsX3Jlc2NhbGUgPSBtLT51cGRfdmFsOworfQorCitzdGF0aWMgdm9pZCBtb2RlbDI1Nl9yZXNldChNb2RlbDI1NiAqbSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTU7IGkrKykKKyAgICAgICAgbS0+d2VpZ2h0c1tpXSA9IDE7CisgICAgbS0+d2VpZ2h0c1syNTVdID0gMDsKKworICAgIG0tPnRvdF93ZWlnaHQgICA9IDA7CisgICAgbS0+dXBkX3ZhbCAgICAgID0gMjU2OworICAgIG0tPnRpbGxfcmVzY2FsZSA9IDE7CisgICAgbW9kZWwyNTZfdXBkYXRlKG0sIDI1NSk7CisgICAgbS0+dGlsbF9yZXNjYWxlID0KKyAgICBtLT51cGRfdmFsICAgICAgPSAoMjU2ICsgNikgPj4gMTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBtb2RlbDI1Nl9pbml0KE1vZGVsMjU2ICptKQoreworICAgIG0tPm1heF91cGRfdmFsID0gOCAqIDI1NiArIDQ4OworICAgIG0tPnNlY19zaXplICAgID0gKDEgPDwgNikgKyAyOworCisgICAgbW9kZWwyNTZfcmVzZXQobSk7Cit9CisKK3N0YXRpYyB2b2lkIHJhY19pbml0KFJhbmdlQ29kZXIgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNpemUpCit7CisgICAgaW50IGk7CisKKyAgICBjLT5zcmMgICAgICAgPSBzcmM7CisgICAgYy0+c3JjX2VuZCAgID0gc3JjICsgc2l6ZTsKKyAgICBjLT5sb3cgICAgICAgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBGRk1JTihzaXplLCA0KTsgaSsrKQorICAgICAgICBjLT5sb3cgPSAoYy0+bG93IDw8IDgpIHwgKmMtPnNyYysrOworICAgIGMtPnJhbmdlICAgICA9IDB4RkZGRkZGRkY7CisgICAgYy0+Z290X2Vycm9yID0gMDsKK30KKworc3RhdGljIHZvaWQgcmFjX25vcm1hbGlzZShSYW5nZUNvZGVyICpjKQoreworICAgIGZvciAoOzspIHsKKyAgICAgICAgYy0+cmFuZ2UgPDw9IDg7CisgICAgICAgIGMtPmxvdyAgIDw8PSA4OworICAgICAgICBpZiAoYy0+c3JjIDwgYy0+c3JjX2VuZCkgeworICAgICAgICAgICAgYy0+bG93IHw9ICpjLT5zcmMrKzsKKyAgICAgICAgfSBlbHNlIGlmICghYy0+bG93KSB7CisgICAgICAgICAgICBjLT5nb3RfZXJyb3IgPSAxOworICAgICAgICAgICAgYy0+bG93ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYy0+cmFuZ2UgPj0gUkFDX0JPVFRPTSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcmFjX2dldF9iaXQoUmFuZ2VDb2RlciAqYykKK3sKKyAgICBpbnQgYml0OworCisgICAgYy0+cmFuZ2UgPj49IDE7CisKKyAgICBiaXQgPSAoYy0+cmFuZ2UgPD0gYy0+bG93KTsKKyAgICBpZiAoYml0KQorICAgICAgICBjLT5sb3cgLT0gYy0+cmFuZ2U7CisKKyAgICBpZiAoYy0+cmFuZ2UgPCBSQUNfQk9UVE9NKQorICAgICAgICByYWNfbm9ybWFsaXNlKGMpOworCisgICAgcmV0dXJuIGJpdDsKK30KKworc3RhdGljIGludCByYWNfZ2V0X2JpdHMoUmFuZ2VDb2RlciAqYywgaW50IG5iaXRzKQoreworICAgIGludCB2YWw7CisKKyAgICBjLT5yYW5nZSA+Pj0gbmJpdHM7CisgICAgdmFsID0gYy0+bG93IC8gYy0+cmFuZ2U7CisgICAgYy0+bG93IC09IGMtPnJhbmdlICogdmFsOworCisgICAgaWYgKGMtPnJhbmdlIDwgUkFDX0JPVFRPTSkKKyAgICAgICAgcmFjX25vcm1hbGlzZShjKTsKKworICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgcmFjX2dldF9tb2RlbDJfc3ltKFJhbmdlQ29kZXIgKmMsIE1vZGVsMiAqbSkKK3sKKyAgICBpbnQgYml0LCBoZWxwZXI7CisKKyAgICBoZWxwZXIgPSBtLT56ZXJvX2ZyZXEgKiAoYy0+cmFuZ2UgPj4gTU9ERUwyX1NDQUxFKTsKKyAgICBiaXQgICAgPSAoYy0+bG93ID49IGhlbHBlcik7CisgICAgaWYgKGJpdCkgeworICAgICAgICBjLT5sb3cgICAtPSBoZWxwZXI7CisgICAgICAgIGMtPnJhbmdlIC09IGhlbHBlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBjLT5yYW5nZSAgPSBoZWxwZXI7CisgICAgfQorCisgICAgaWYgKGMtPnJhbmdlIDwgUkFDX0JPVFRPTSkKKyAgICAgICAgcmFjX25vcm1hbGlzZShjKTsKKworICAgIG1vZGVsMl91cGRhdGUobSwgYml0KTsKKworICAgIHJldHVybiBiaXQ7Cit9CisKK3N0YXRpYyBpbnQgcmFjX2dldF9tb2RlbF9zeW0oUmFuZ2VDb2RlciAqYywgTW9kZWwgKm0pCit7CisgICAgaW50IHByb2IsIHByb2IyLCBoZWxwZXIsIHZhbDsKKyAgICBpbnQgZW5kLCBlbmQyOworCisgICAgcHJvYiAgICAgICA9IDA7CisgICAgcHJvYjIgICAgICA9IGMtPnJhbmdlOworICAgIGMtPnJhbmdlID4+PSBNT0RFTF9TQ0FMRTsKKyAgICB2YWwgICAgICAgID0gMDsKKyAgICBlbmQgICAgICAgID0gbS0+bnVtX3N5bXMgPj4gMTsKKyAgICBlbmQyICAgICAgID0gbS0+bnVtX3N5bXM7CisgICAgZG8geworICAgICAgICBoZWxwZXIgPSBtLT5mcmVxc1tlbmRdICogYy0+cmFuZ2U7CisgICAgICAgIGlmIChoZWxwZXIgPD0gYy0+bG93KSB7CisgICAgICAgICAgICB2YWwgICA9IGVuZDsKKyAgICAgICAgICAgIHByb2IgID0gaGVscGVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW5kMiAgPSBlbmQ7CisgICAgICAgICAgICBwcm9iMiA9IGhlbHBlcjsKKyAgICAgICAgfQorICAgICAgICBlbmQgPSAoZW5kMiArIHZhbCkgPj4gMTsKKyAgICB9IHdoaWxlIChlbmQgIT0gdmFsKTsKKyAgICBjLT5sb3cgIC09IHByb2I7CisgICAgYy0+cmFuZ2UgPSBwcm9iMiAtIHByb2I7CisgICAgaWYgKGMtPnJhbmdlIDwgUkFDX0JPVFRPTSkKKyAgICAgICAgcmFjX25vcm1hbGlzZShjKTsKKworICAgIG1vZGVsX3VwZGF0ZShtLCB2YWwpOworCisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCByYWNfZ2V0X21vZGVsMjU2X3N5bShSYW5nZUNvZGVyICpjLCBNb2RlbDI1NiAqbSkKK3sKKyAgICBpbnQgcHJvYiwgcHJvYjIsIGhlbHBlciwgdmFsOworICAgIGludCBzdGFydCwgZW5kOworICAgIGludCBzc3ltOworCisgICAgcHJvYjIgICAgICA9IGMtPnJhbmdlOworICAgIGMtPnJhbmdlID4+PSBNT0RFTF9TQ0FMRTsKKworICAgIGhlbHBlciAgICAgPSBjLT5sb3cgLyBjLT5yYW5nZTsKKyAgICBzc3ltICAgICAgID0gaGVscGVyID4+IE1PREVMMjU2X1NFQ19TQ0FMRTsKKyAgICB2YWwgICAgICAgID0gbS0+c2Vjb25kYXJ5W3NzeW1dOworCisgICAgZW5kID0gc3RhcnQgPSBtLT5zZWNvbmRhcnlbc3N5bSArIDFdICsgMTsKKyAgICB3aGlsZSAoZW5kID4gdmFsICsgMSkgeworICAgICAgICBzc3ltID0gKGVuZCArIHZhbCkgPj4gMTsKKyAgICAgICAgaWYgKG0tPmZyZXFzW3NzeW1dIDw9IGhlbHBlcikgeworICAgICAgICAgICAgZW5kID0gc3RhcnQ7CisgICAgICAgICAgICB2YWwgPSBzc3ltOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW5kICAgPSAoZW5kICsgdmFsKSA+PiAxOworICAgICAgICAgICAgc3RhcnQgPSBzc3ltOworICAgICAgICB9CisgICAgfQorICAgIHByb2IgPSBtLT5mcmVxc1t2YWxdICogYy0+cmFuZ2U7CisgICAgaWYgKHZhbCAhPSAyNTUpCisgICAgICAgIHByb2IyID0gbS0+ZnJlcXNbdmFsICsgMV0gKiBjLT5yYW5nZTsKKworICAgIGMtPmxvdyAgLT0gcHJvYjsKKyAgICBjLT5yYW5nZSA9IHByb2IyIC0gcHJvYjsKKyAgICBpZiAoYy0+cmFuZ2UgPCBSQUNfQk9UVE9NKQorICAgICAgICByYWNfbm9ybWFsaXNlKGMpOworCisgICAgbW9kZWwyNTZfdXBkYXRlKG0sIHZhbCk7CisKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IGRlY29kZV9ibG9ja190eXBlKFJhbmdlQ29kZXIgKmMsIEJsb2NrVHlwZUNvbnRleHQgKmJ0KQoreworICAgIGJ0LT5sYXN0X3R5cGUgPSByYWNfZ2V0X21vZGVsX3N5bShjLCAmYnQtPmJ0X21vZGVsW2J0LT5sYXN0X3R5cGVdKTsKKworICAgIHJldHVybiBidC0+bGFzdF90eXBlOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jb2VmZihSYW5nZUNvZGVyICpjLCBNb2RlbCAqbSkKK3sKKyAgICBpbnQgdmFsLCBzaWduOworCisgICAgdmFsID0gcmFjX2dldF9tb2RlbF9zeW0oYywgbSk7CisgICAgaWYgKHZhbCkgeworICAgICAgICBzaWduID0gcmFjX2dldF9iaXQoYyk7CisgICAgICAgIGlmICh2YWwgPiAxKSB7CisgICAgICAgICAgICB2YWwtLTsKKyAgICAgICAgICAgIHZhbCA9ICgxIDw8IHZhbCkgKyByYWNfZ2V0X2JpdHMoYywgdmFsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNpZ24pCisgICAgICAgICAgICB2YWwgPSAtdmFsOworICAgIH0KKworICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9maWxsX2Jsb2NrKFJhbmdlQ29kZXIgKmMsIEZpbGxCbG9ja0NvZGVyICpmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGJsb2NrX3NpemUpCit7CisgICAgaW50IGk7CisKKyAgICBmYy0+ZmlsbF92YWwgKz0gZGVjb2RlX2NvZWZmKGMsICZmYy0+Y29lZl9tb2RlbCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrLCBkc3QgKz0gc3RyaWRlKQorICAgICAgICBtZW1zZXQoZHN0LCBmYy0+ZmlsbF92YWwsIGJsb2NrX3NpemUpOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfaW1hZ2VfYmxvY2soUmFuZ2VDb2RlciAqYywgSW1hZ2VCbG9ja0NvZGVyICppYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludCBibG9ja19zaXplKQoreworICAgIGludCBpLCBqOworICAgIGludCB2ZWNfc2l6ZTsKKyAgICBpbnQgdmVjWzRdOworICAgIGludCBwcmV2X2xpbmVbMTZdOworICAgIGludCBBLCBCLCBDOworCisgICAgdmVjX3NpemUgPSByYWNfZ2V0X21vZGVsX3N5bShjLCAmaWMtPnZlY19zaXplX21vZGVsKSArIDI7CisgICAgZm9yIChpID0gMDsgaSA8IHZlY19zaXplOyBpKyspCisgICAgICAgIHZlY1tpXSA9IHJhY19nZXRfbW9kZWwyNTZfc3ltKGMsICZpYy0+dmVjX2VudHJ5X21vZGVsKTsKKyAgICBmb3IgKDsgaSA8IDQ7IGkrKykKKyAgICAgICAgdmVjW2ldID0gMDsKKyAgICBtZW1zZXQocHJldl9saW5lLCAwLCBzaXplb2YocHJldl9saW5lKSk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgYmxvY2tfc2l6ZTsgaisrKSB7CisgICAgICAgIEEgPSAwOworICAgICAgICBCID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykgeworICAgICAgICAgICAgQyA9IEI7CisgICAgICAgICAgICBCID0gcHJldl9saW5lW2ldOworICAgICAgICAgICAgQSA9IHJhY19nZXRfbW9kZWxfc3ltKGMsICZpYy0+dnFfbW9kZWxbQSArIEIgKiA1ICsgQyAqIDI1XSk7CisKKyAgICAgICAgICAgIHByZXZfbGluZVtpXSA9IEE7CisgICAgICAgICAgICBpZiAoQSA8IDQpCisgICAgICAgICAgICAgICBkc3RbaV0gPSB2ZWNbQV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBkc3RbaV0gPSByYWNfZ2V0X21vZGVsMjU2X3N5bShjLCAmaWMtPmVzY19tb2RlbCk7CisgICAgICAgIH0KKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2RjdChSYW5nZUNvZGVyICpjLCBEQ1RCbG9ja0NvZGVyICpiYywgaW50ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYngsIGludCBieSkKK3sKKyAgICBpbnQgc2tpcCwgdmFsLCBzaWduLCBwb3MgPSAxLCB6el9wb3MsIGRjOworICAgIGludCBibGtfcG9zID0gYnggKyBieSAqIGJjLT5wcmV2X2RjX3N0cmlkZTsKKworICAgIG1lbXNldChibG9jaywgMCwgc2l6ZW9mKCpibG9jaykgKiA2NCk7CisKKyAgICBkYyA9IGRlY29kZV9jb2VmZihjLCAmYmMtPmRjX21vZGVsKTsKKyAgICBpZiAoYnkpIHsKKyAgICAgICAgaWYgKGJ4KSB7CisgICAgICAgICAgICBpbnQgbCwgdGwsIHQ7CisKKyAgICAgICAgICAgIGwgID0gYmMtPnByZXZfZGNbYmxrX3BvcyAtIDFdOworICAgICAgICAgICAgdGwgPSBiYy0+cHJldl9kY1tibGtfcG9zIC0gMSAtIGJjLT5wcmV2X2RjX3N0cmlkZV07CisgICAgICAgICAgICB0ICA9IGJjLT5wcmV2X2RjW2Jsa19wb3MgICAgIC0gYmMtPnByZXZfZGNfc3RyaWRlXTsKKworICAgICAgICAgICAgaWYgKEZGQUJTKHQgLSB0bCkgPD0gRkZBQlMobCAtIHRsKSkKKyAgICAgICAgICAgICAgICBkYyArPSBsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRjICs9IHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYyArPSBiYy0+cHJldl9kY1tibGtfcG9zIC0gYmMtPnByZXZfZGNfc3RyaWRlXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYngpIHsKKyAgICAgICAgZGMgKz0gYmMtPnByZXZfZGNbYnggLSAxXTsKKyAgICB9CisgICAgYmMtPnByZXZfZGNbYmxrX3Bvc10gPSBkYzsKKyAgICBibG9ja1swXSAgICAgICAgICAgICA9IGRjICogYmMtPnFtYXRbMF07CisKKyAgICB3aGlsZSAocG9zIDwgNjQpIHsKKyAgICAgICAgdmFsID0gcmFjX2dldF9tb2RlbDI1Nl9zeW0oYywgJmJjLT5hY19tb2RlbCk7CisgICAgICAgIGlmICghdmFsKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICh2YWwgPT0gMHhGMCkgeworICAgICAgICAgICAgcG9zICs9IDE2OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc2tpcCA9IHZhbCA+PiA0OworICAgICAgICB2YWwgID0gdmFsICYgMHhGOworICAgICAgICBpZiAoIXZhbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcG9zICs9IHNraXA7CisgICAgICAgIGlmIChwb3MgPj0gNjQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgc2lnbiA9IHJhY19nZXRfbW9kZWwyX3N5bShjLCAmYmMtPnNpZ25fbW9kZWwpOworICAgICAgICBpZiAodmFsID4gMSkgeworICAgICAgICAgICAgdmFsLS07CisgICAgICAgICAgICB2YWwgPSAoMSA8PCB2YWwpICsgcmFjX2dldF9iaXRzKGMsIHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzaWduKQorICAgICAgICAgICAgdmFsID0gLXZhbDsKKworICAgICAgICB6el9wb3MgPSBmZl96aWd6YWdfZGlyZWN0W3Bvc107CisgICAgICAgIGJsb2NrW3p6X3Bvc10gPSB2YWwgKiBiYy0+cW1hdFt6el9wb3NdOworICAgICAgICBwb3MrKzsKKyAgICB9CisKKyAgICByZXR1cm4gcG9zID09IDY0ID8gMCA6IC0xOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfZGN0X2Jsb2NrKFJhbmdlQ29kZXIgKmMsIERDVEJsb2NrQ29kZXIgKmJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludCBibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJsb2NrLCBpbnQgbWJfeCwgaW50IG1iX3kpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IGJ4LCBieTsKKyAgICBpbnQgbmJsb2NrcyA9IGJsb2NrX3NpemUgPj4gMzsKKworICAgIGJ4ID0gbWJfeCAqIG5ibG9ja3M7CisgICAgYnkgPSBtYl95ICogbmJsb2NrczsKKworICAgIGZvciAoaiA9IDA7IGogPCBuYmxvY2tzOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5ibG9ja3M7IGkrKykgeworICAgICAgICAgICAgaWYgKGRlY29kZV9kY3QoYywgYmMsIGJsb2NrLCBieCArIGksIGJ5ICsgaikpIHsKKyAgICAgICAgICAgICAgICBjLT5nb3RfZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZmX21zczM0X2RjdF9wdXQoZHN0ICsgaSAqIDgsIHN0cmlkZSwgYmxvY2spOworICAgICAgICB9CisgICAgICAgIGRzdCArPSA4ICogc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2hhYXJfYmxvY2soUmFuZ2VDb2RlciAqYywgSGFhckJsb2NrQ29kZXIgKmhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLCBpbnQgYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYmxvY2spCit7CisgICAgY29uc3QgaW50IGhzaXplID0gYmxvY2tfc2l6ZSA+PiAxOworICAgIGludCBBLCBCLCBDLCBELCB0MSwgdDIsIHQzLCB0NDsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaiA9IDA7IGogPCBibG9ja19zaXplOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPCBoc2l6ZSAmJiBqIDwgaHNpemUpCisgICAgICAgICAgICAgICAgYmxvY2tbaV0gPSByYWNfZ2V0X21vZGVsMjU2X3N5bShjLCAmaGMtPmNvZWZfbW9kZWwpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJsb2NrW2ldID0gZGVjb2RlX2NvZWZmKGMsICZoYy0+Y29lZl9oaV9tb2RlbCk7CisgICAgICAgICAgICBibG9ja1tpXSAqPSBoYy0+c2NhbGU7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2sgKz0gYmxvY2tfc2l6ZTsKKyAgICB9CisgICAgYmxvY2sgLT0gYmxvY2tfc2l6ZSAqIGJsb2NrX3NpemU7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaHNpemU7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaHNpemU7IGkrKykgeworICAgICAgICAgICAgQSA9IGJsb2NrW2ldOworICAgICAgICAgICAgQiA9IGJsb2NrW2kgKyBoc2l6ZV07CisgICAgICAgICAgICBDID0gYmxvY2tbaSArIGhzaXplICogYmxvY2tfc2l6ZV07CisgICAgICAgICAgICBEID0gYmxvY2tbaSArIGhzaXplICogYmxvY2tfc2l6ZSArIGhzaXplXTsKKworICAgICAgICAgICAgdDEgPSBBIC0gQjsKKyAgICAgICAgICAgIHQyID0gQyAtIEQ7CisgICAgICAgICAgICB0MyA9IEEgKyBCOworICAgICAgICAgICAgdDQgPSBDICsgRDsKKyAgICAgICAgICAgIGRzdFtpICogMl0gICAgICAgICAgICAgID0gYXZfY2xpcF91aW50OCh0MSAtIHQyKTsKKyAgICAgICAgICAgIGRzdFtpICogMiArIHN0cmlkZV0gICAgID0gYXZfY2xpcF91aW50OCh0MSArIHQyKTsKKyAgICAgICAgICAgIGRzdFtpICogMiArIDFdICAgICAgICAgID0gYXZfY2xpcF91aW50OCh0MyAtIHQ0KTsKKyAgICAgICAgICAgIGRzdFtpICogMiArIDEgKyBzdHJpZGVdID0gYXZfY2xpcF91aW50OCh0MyArIHQ0KTsKKyAgICAgICAgfQorICAgICAgICBibG9jayArPSBibG9ja19zaXplOworICAgICAgICBkc3QgICArPSBzdHJpZGUgKiAyOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVzZXRfY29kZXJzKE1TUzNDb250ZXh0ICpjdHgsIGludCBxdWFsaXR5KQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBjdHgtPmJ0eXBlW2ldLmxhc3RfdHlwZSA9IFNLSVBfQkxPQ0s7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA1OyBqKyspCisgICAgICAgICAgICBtb2RlbF9yZXNldCgmY3R4LT5idHlwZVtpXS5idF9tb2RlbFtqXSk7CisgICAgICAgIGN0eC0+ZmlsbF9jb2RlcltpXS5maWxsX3ZhbCA9IDA7CisgICAgICAgIG1vZGVsX3Jlc2V0KCZjdHgtPmZpbGxfY29kZXJbaV0uY29lZl9tb2RlbCk7CisgICAgICAgIG1vZGVsMjU2X3Jlc2V0KCZjdHgtPmltYWdlX2NvZGVyW2ldLmVzY19tb2RlbCk7CisgICAgICAgIG1vZGVsMjU2X3Jlc2V0KCZjdHgtPmltYWdlX2NvZGVyW2ldLnZlY19lbnRyeV9tb2RlbCk7CisgICAgICAgIG1vZGVsX3Jlc2V0KCZjdHgtPmltYWdlX2NvZGVyW2ldLnZlY19zaXplX21vZGVsKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDEyNTsgaisrKQorICAgICAgICAgICAgbW9kZWxfcmVzZXQoJmN0eC0+aW1hZ2VfY29kZXJbaV0udnFfbW9kZWxbal0pOworICAgICAgICBpZiAoY3R4LT5kY3RfY29kZXJbaV0ucXVhbGl0eSAhPSBxdWFsaXR5KSB7CisgICAgICAgICAgICBjdHgtPmRjdF9jb2RlcltpXS5xdWFsaXR5ID0gcXVhbGl0eTsKKyAgICAgICAgICAgIGZmX21zczM0X2dlbl9xdWFudF9tYXQoY3R4LT5kY3RfY29kZXJbaV0ucW1hdCwgcXVhbGl0eSwgIWkpOworICAgICAgICB9CisgICAgICAgIG1lbXNldChjdHgtPmRjdF9jb2RlcltpXS5wcmV2X2RjLCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKCpjdHgtPmRjdF9jb2RlcltpXS5wcmV2X2RjKSAqCisgICAgICAgICAgICAgICBjdHgtPmRjdF9jb2RlcltpXS5wcmV2X2RjX3N0cmlkZSAqCisgICAgICAgICAgICAgICBjdHgtPmRjdF9jb2RlcltpXS5wcmV2X2RjX2hlaWdodCk7CisgICAgICAgIG1vZGVsX3Jlc2V0KCZjdHgtPmRjdF9jb2RlcltpXS5kY19tb2RlbCk7CisgICAgICAgIG1vZGVsMl9yZXNldCgmY3R4LT5kY3RfY29kZXJbaV0uc2lnbl9tb2RlbCk7CisgICAgICAgIG1vZGVsMjU2X3Jlc2V0KCZjdHgtPmRjdF9jb2RlcltpXS5hY19tb2RlbCk7CisgICAgICAgIGlmIChjdHgtPmhhYXJfY29kZXJbaV0ucXVhbGl0eSAhPSBxdWFsaXR5KSB7CisgICAgICAgICAgICBjdHgtPmhhYXJfY29kZXJbaV0ucXVhbGl0eSA9IHF1YWxpdHk7CisgICAgICAgICAgICBjdHgtPmhhYXJfY29kZXJbaV0uc2NhbGUgICA9IDE3IC0gNyAqIHF1YWxpdHkgLyA1MDsKKyAgICAgICAgfQorICAgICAgICBtb2RlbF9yZXNldCgmY3R4LT5oYWFyX2NvZGVyW2ldLmNvZWZfaGlfbW9kZWwpOworICAgICAgICBtb2RlbDI1Nl9yZXNldCgmY3R4LT5oYWFyX2NvZGVyW2ldLmNvZWZfbW9kZWwpOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X2NvZGVycyhNU1MzQ29udGV4dCAqY3R4KQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgbW9kZWxfaW5pdCgmY3R4LT5idHlwZVtpXS5idF9tb2RlbFtqXSwgNSk7CisgICAgICAgIG1vZGVsX2luaXQoJmN0eC0+ZmlsbF9jb2RlcltpXS5jb2VmX21vZGVsLCAxMik7CisgICAgICAgIG1vZGVsMjU2X2luaXQoJmN0eC0+aW1hZ2VfY29kZXJbaV0uZXNjX21vZGVsKTsKKyAgICAgICAgbW9kZWwyNTZfaW5pdCgmY3R4LT5pbWFnZV9jb2RlcltpXS52ZWNfZW50cnlfbW9kZWwpOworICAgICAgICBtb2RlbF9pbml0KCZjdHgtPmltYWdlX2NvZGVyW2ldLnZlY19zaXplX21vZGVsLCAzKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDEyNTsgaisrKQorICAgICAgICAgICAgbW9kZWxfaW5pdCgmY3R4LT5pbWFnZV9jb2RlcltpXS52cV9tb2RlbFtqXSwgNSk7CisgICAgICAgIG1vZGVsX2luaXQoJmN0eC0+ZGN0X2NvZGVyW2ldLmRjX21vZGVsLCAxMik7CisgICAgICAgIG1vZGVsMjU2X2luaXQoJmN0eC0+ZGN0X2NvZGVyW2ldLmFjX21vZGVsKTsKKyAgICAgICAgbW9kZWxfaW5pdCgmY3R4LT5oYWFyX2NvZGVyW2ldLmNvZWZfaGlfbW9kZWwsIDEyKTsKKyAgICAgICAgbW9kZWwyNTZfaW5pdCgmY3R4LT5oYWFyX2NvZGVyW2ldLmNvZWZfbW9kZWwpOworICAgIH0KK30KKworc3RhdGljIGludCBtc3MzX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgTVNTM0NvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFJhbmdlQ29kZXIgKmFjb2RlciA9ICZjLT5jb2RlcjsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICB1aW50OF90ICpkc3RbM107CisgICAgaW50IGRlY193aWR0aCwgZGVjX2hlaWdodCwgZGVjX3gsIGRlY195LCBxdWFsaXR5LCBrZXlmcmFtZTsKKyAgICBpbnQgeCwgeSwgaSwgbWJfd2lkdGgsIG1iX2hlaWdodCwgYmxrX3NpemUsIGJ0eXBlOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYnVmX3NpemUgPCBIRUFERVJfU0laRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGcmFtZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCAlZCBieXRlcywgZ290ICVkIGluc3RlYWRcbiIsCisgICAgICAgICAgICAgICBIRUFERVJfU0laRSwgYnVmX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmLCBidWZfc2l6ZSk7CisgICAga2V5ZnJhbWUgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgaWYgKGtleWZyYW1lICYgfjB4MzAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZSB0eXBlICVYXG4iLCBrZXlmcmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBrZXlmcmFtZSAgID0gIShrZXlmcmFtZSAmIDEpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCA2KTsKKyAgICBkZWNfeCAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKyAgICBkZWNfeSAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKyAgICBkZWNfd2lkdGggID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKyAgICBkZWNfaGVpZ2h0ID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKworICAgIGlmIChkZWNfeCArIGRlY193aWR0aCA+IGF2Y3R4LT53aWR0aCB8fAorICAgICAgICBkZWNfeSArIGRlY19oZWlnaHQgPiBhdmN0eC0+aGVpZ2h0IHx8CisgICAgICAgIChkZWNfd2lkdGggfCBkZWNfaGVpZ2h0KSAmIDB4RikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgZGltZW5zaW9ucyAlZHglZCArJWQsJWRcbiIsCisgICAgICAgICAgICAgICBkZWNfd2lkdGgsIGRlY19oZWlnaHQsIGRlY194LCBkZWNfeSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgNCk7CisgICAgcXVhbGl0eSAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgaWYgKHF1YWxpdHkgPCAxIHx8IHF1YWxpdHkgPiAxMDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHF1YWxpdHkgc2V0dGluZyAlZFxuIiwgcXVhbGl0eSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgNCk7CisKKyAgICBpZiAoa2V5ZnJhbWUgJiYgIWJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJLZXlmcmFtZSB3aXRob3V0IGRhdGEgZm91bmRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKCFrZXlmcmFtZSAmJiBjLT5nb3RfZXJyb3IpCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICBjLT5nb3RfZXJyb3IgPSAwOworCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIGMtPnBpYykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBjLT5waWMtPmtleV9mcmFtZSA9IGtleWZyYW1lOworICAgIGMtPnBpYy0+cGljdF90eXBlID0ga2V5ZnJhbWUgPyBBVl9QSUNUVVJFX1RZUEVfSSA6IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgIGlmICghYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSkgeworICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBjLT5waWMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAqZ290X2ZyYW1lICAgICAgPSAxOworCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisKKyAgICByZXNldF9jb2RlcnMoYywgcXVhbGl0eSk7CisKKyAgICByYWNfaW5pdChhY29kZXIsIGJ1ZiArIEhFQURFUl9TSVpFLCBidWZfc2l6ZSAtIEhFQURFUl9TSVpFKTsKKworICAgIG1iX3dpZHRoICA9IGRlY193aWR0aCAgPj4gNDsKKyAgICBtYl9oZWlnaHQgPSBkZWNfaGVpZ2h0ID4+IDQ7CisgICAgZHN0WzBdID0gYy0+cGljLT5kYXRhWzBdICsgZGVjX3ggICAgICsgIGRlY195ICAgICAgKiBjLT5waWMtPmxpbmVzaXplWzBdOworICAgIGRzdFsxXSA9IGMtPnBpYy0+ZGF0YVsxXSArIGRlY194IC8gMiArIChkZWNfeSAvIDIpICogYy0+cGljLT5saW5lc2l6ZVsxXTsKKyAgICBkc3RbMl0gPSBjLT5waWMtPmRhdGFbMl0gKyBkZWNfeCAvIDIgKyAoZGVjX3kgLyAyKSAqIGMtPnBpYy0+bGluZXNpemVbMl07CisgICAgZm9yICh5ID0gMDsgeSA8IG1iX2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBtYl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgYmxrX3NpemUgPSA4IDw8ICFpOworCisgICAgICAgICAgICAgICAgYnR5cGUgPSBkZWNvZGVfYmxvY2tfdHlwZShhY29kZXIsIGMtPmJ0eXBlICsgaSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChidHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRklMTF9CTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2ZpbGxfYmxvY2soYWNvZGVyLCBjLT5maWxsX2NvZGVyICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0W2ldICsgeCAqIGJsa19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5waWMtPmxpbmVzaXplW2ldLCBibGtfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU1BR0VfQkxPQ0s6CisgICAgICAgICAgICAgICAgICAgIGRlY29kZV9pbWFnZV9ibG9jayhhY29kZXIsIGMtPmltYWdlX2NvZGVyICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtpXSArIHggKiBibGtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnBpYy0+bGluZXNpemVbaV0sIGJsa19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEQ1RfQkxPQ0s6CisgICAgICAgICAgICAgICAgICAgIGRlY29kZV9kY3RfYmxvY2soYWNvZGVyLCBjLT5kY3RfY29kZXIgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtpXSArIHggKiBibGtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5waWMtPmxpbmVzaXplW2ldLCBibGtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5kY3RibG9jaywgeCwgeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSEFBUl9CTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2hhYXJfYmxvY2soYWNvZGVyLCBjLT5oYWFyX2NvZGVyICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0W2ldICsgeCAqIGJsa19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5waWMtPmxpbmVzaXplW2ldLCBibGtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+aGJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjLT5nb3RfZXJyb3IgfHwgYWNvZGVyLT5nb3RfZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBkZWNvZGluZyBibG9jayAlZCwlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHkpOworICAgICAgICAgICAgICAgICAgICBjLT5nb3RfZXJyb3IgPSAxOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZHN0WzBdICs9IGMtPnBpYy0+bGluZXNpemVbMF0gKiAxNjsKKyAgICAgICAgZHN0WzFdICs9IGMtPnBpYy0+bGluZXNpemVbMV0gKiA4OworICAgICAgICBkc3RbMl0gKz0gYy0+cGljLT5saW5lc2l6ZVsyXSAqIDg7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgYy0+cGljKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9mcmFtZSAgICAgID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG1zczNfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTVNTM0NvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmMtPnBpYyk7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmMtPmRjdF9jb2RlcltpXS5wcmV2X2RjKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbXNzM19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTVNTM0NvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICBpZiAoKGF2Y3R4LT53aWR0aCAmIDB4RikgfHwgKGF2Y3R4LT5oZWlnaHQgJiAweEYpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkltYWdlIGRpbWVuc2lvbnMgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMTYuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYy0+Z290X2Vycm9yID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGludCBiX3dpZHRoICA9IGF2Y3R4LT53aWR0aCAgPj4gKDIgKyAhIWkpOworICAgICAgICBpbnQgYl9oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0ID4+ICgyICsgISFpKTsKKyAgICAgICAgYy0+ZGN0X2NvZGVyW2ldLnByZXZfZGNfc3RyaWRlID0gYl93aWR0aDsKKyAgICAgICAgYy0+ZGN0X2NvZGVyW2ldLnByZXZfZGNfaGVpZ2h0ID0gYl9oZWlnaHQ7CisgICAgICAgIGMtPmRjdF9jb2RlcltpXS5wcmV2X2RjID0gYXZfbWFsbG9jKHNpemVvZigqYy0+ZGN0X2NvZGVyW2ldLnByZXZfZGMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYl93aWR0aCAqIGJfaGVpZ2h0KTsKKyAgICAgICAgaWYgKCFjLT5kY3RfY29kZXJbaV0ucHJldl9kYykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmMtPnBpYyk7CisgICAgICAgICAgICB3aGlsZSAoaSA+PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmMtPmRjdF9jb2RlcltpXS5wcmV2X2RjKTsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgYy0+cGljID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWMtPnBpYykgeworICAgICAgICBtc3MzX2RlY29kZV9lbmQoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF2Y3R4LT5waXhfZm10ICAgICA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKworICAgIGluaXRfY29kZXJzKGMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbXNhMV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtc2ExIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVMgQVRDIFNjcmVlbiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NU0ExLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNU1MzQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbXNzM19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBtc3MzX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gbXNzM19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tc3MzNGRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNzMzRkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzk3YWRkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNzMzRkc3AuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvbW1vbiBzdHVmZiBmb3Igc29tZSBNaWNyb3NvZnQgU2NyZWVuIGNvZGVjcworICogQ29weXJpZ2h0IChDKSAyMDEyIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJtc3MzNGRzcC5oIgorCitzdGF0aWMgY29uc3QgdWludDhfdCBsdW1hX3F1YW50WzY0XSA9IHsKKyAgICAxNiwgIDExLCAgMTAsICAxNiwgIDI0LCAgNDAsICA1MSwgIDYxLAorICAgIDEyLCAgMTIsICAxNCwgIDE5LCAgMjYsICA1OCwgIDYwLCAgNTUsCisgICAgMTQsICAxMywgIDE2LCAgMjQsICA0MCwgIDU3LCAgNjksICA1NiwKKyAgICAxNCwgIDE3LCAgMjIsICAyOSwgIDUxLCAgODcsICA4MCwgIDYyLAorICAgIDE4LCAgMjIsICAzNywgIDU2LCAgNjgsIDEwOSwgMTAzLCAgNzcsCisgICAgMjQsICAzNSwgIDU1LCAgNjQsICA4MSwgMTA0LCAxMTMsICA5MiwKKyAgICA0OSwgIDY0LCAgNzgsICA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAorICAgIDcyLCAgOTIsICA5NSwgIDk4LCAxMTIsIDEwMCwgMTAzLCAgOTkKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNocm9tYV9xdWFudFs2NF0gPSB7CisgICAgMTcsIDE4LCAyNCwgNDcsIDk5LCA5OSwgOTksIDk5LAorICAgIDE4LCAyMSwgMjYsIDY2LCA5OSwgOTksIDk5LCA5OSwKKyAgICAyNCwgMjYsIDU2LCA5OSwgOTksIDk5LCA5OSwgOTksCisgICAgNDcsIDY2LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksCisgICAgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OQorfTsKKwordm9pZCBmZl9tc3MzNF9nZW5fcXVhbnRfbWF0KHVpbnQxNl90ICpxbWF0LCBpbnQgcXVhbGl0eSwgaW50IGx1bWEpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgdWludDhfdCAqcXNyYyA9IGx1bWEgPyBsdW1hX3F1YW50IDogY2hyb21hX3F1YW50OworCisgICAgaWYgKHF1YWxpdHkgPj0gNTApIHsKKyAgICAgICAgaW50IHNjYWxlID0gMjAwIC0gMiAqIHF1YWxpdHk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICBxbWF0W2ldID0gKHFzcmNbaV0gKiBzY2FsZSArIDUwKSAvIDEwMDsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIHFtYXRbaV0gPSAoNTAwMCAqIHFzcmNbaV0gLyBxdWFsaXR5ICsgNTApIC8gMTAwOworICAgIH0KK30KKworI2RlZmluZSBEQ1RfVEVNUExBVEUoYmxrLCBzdGVwLCBTT1AsIHNoaWZ0KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHQwID0gLTM5NDA5ICogYmxrWzcgKiBzdGVwXSAtICA1ODk4MCAqIGJsa1sxICogc3RlcF07IFwKKyAgICBjb25zdCBpbnQgdDEgPSAgMzk0MTAgKiBibGtbMSAqIHN0ZXBdIC0gIDU4OTgwICogYmxrWzcgKiBzdGVwXTsgXAorICAgIGNvbnN0IGludCB0MiA9IC0zMzQxMCAqIGJsa1s1ICogc3RlcF0gLSAxNjc5NjMgKiBibGtbMyAqIHN0ZXBdOyBcCisgICAgY29uc3QgaW50IHQzID0gIDMzNDEwICogYmxrWzMgKiBzdGVwXSAtIDE2Nzk2MyAqIGJsa1s1ICogc3RlcF07IFwKKyAgICBjb25zdCBpbnQgdDQgPSAgICAgICAgICBibGtbMyAqIHN0ZXBdICsgICAgICAgICAgYmxrWzcgKiBzdGVwXTsgXAorICAgIGNvbnN0IGludCB0NSA9ICAgICAgICAgIGJsa1sxICogc3RlcF0gKyAgICAgICAgICBibGtbNSAqIHN0ZXBdOyBcCisgICAgY29uc3QgaW50IHQ2ID0gIDc3MDYyICogdDQgICAgICAgICAgICArICA1MTQ5MSAqIHQ1OyAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdDcgPSAgNzcwNjIgKiB0NSAgICAgICAgICAgIC0gIDUxNDkxICogdDQ7ICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB0OCA9ICAzNTQ3MCAqIGJsa1syICogc3RlcF0gLSAgODU2MjMgKiBibGtbNiAqIHN0ZXBdOyBcCisgICAgY29uc3QgaW50IHQ5ID0gIDM1NDcwICogYmxrWzYgKiBzdGVwXSArICA4NTYyMyAqIGJsa1syICogc3RlcF07IFwKKyAgICBjb25zdCBpbnQgdEEgPSBTT1AoYmxrWzAgKiBzdGVwXSAtIGJsa1s0ICogc3RlcF0pOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB0QiA9IFNPUChibGtbMCAqIHN0ZXBdICsgYmxrWzQgKiBzdGVwXSk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBibGtbMCAqIHN0ZXBdID0gKCAgdDEgKyB0NiAgKyB0OSArIHRCKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgXAorICAgIGJsa1sxICogc3RlcF0gPSAoICB0MyArIHQ3ICArIHQ4ICsgdEEpID4+IHNoaWZ0OyAgICAgICAgICAgICAgICBcCisgICAgYmxrWzIgKiBzdGVwXSA9ICggIHQyICsgdDYgIC0gdDggKyB0QSkgPj4gc2hpZnQ7ICAgICAgICAgICAgICAgIFwKKyAgICBibGtbMyAqIHN0ZXBdID0gKCAgdDAgKyB0NyAgLSB0OSArIHRCKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgXAorICAgIGJsa1s0ICogc3RlcF0gPSAoLSh0MCArIHQ3KSAtIHQ5ICsgdEIpID4+IHNoaWZ0OyAgICAgICAgICAgICAgICBcCisgICAgYmxrWzUgKiBzdGVwXSA9ICgtKHQyICsgdDYpIC0gdDggKyB0QSkgPj4gc2hpZnQ7ICAgICAgICAgICAgICAgIFwKKyAgICBibGtbNiAqIHN0ZXBdID0gKC0odDMgKyB0NykgKyB0OCArIHRBKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgXAorICAgIGJsa1s3ICogc3RlcF0gPSAoLSh0MSArIHQ2KSArIHQ5ICsgdEIpID4+IHNoaWZ0OyAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgU09QX1JPVyhhKSAoKChhKSA8PCAxNikgKyAweDIwMDApCisjZGVmaW5lIFNPUF9DT0woYSkgKCgoYSkgKyAzMikgPDwgMTYpCisKK3ZvaWQgZmZfbXNzMzRfZGN0X3B1dCh1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludCAqYmxvY2spCit7CisgICAgaW50IGksIGo7CisgICAgaW50ICpwdHI7CisKKyAgICBwdHIgPSBibG9jazsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIERDVF9URU1QTEFURShwdHIsIDEsIFNPUF9ST1csIDEzKTsKKyAgICAgICAgcHRyICs9IDg7CisgICAgfQorCisgICAgcHRyID0gYmxvY2s7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBEQ1RfVEVNUExBVEUocHRyLCA4LCBTT1BfQ09MLCAyMik7CisgICAgICAgIHB0cisrOworICAgIH0KKworICAgIHB0ciA9IGJsb2NrOworICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIGRzdFtpXSA9IGF2X2NsaXBfdWludDgocHRyW2ldICsgMTI4KTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgcHRyICs9IDg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXNzMzRkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL21zczM0ZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5ODI3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL21zczM0ZHNwLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvbW1vbiBzdHVmZiBmb3Igc29tZSBNaWNyb3NvZnQgU2NyZWVuIGNvZGVjcworICogQ29weXJpZ2h0IChDKSAyMDEyIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01TUzM0RFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19NU1MzNERTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBHZW5lcmF0ZSBxdWFudGlzYXRpb24gbWF0cml4IGZvciBnaXZlbiBxdWFsaXR5LgorICoKKyAqIEBwYXJhbSBxbWF0ICAgIGRlc3RpbmF0aW9uIG1hdHJpeAorICogQHBhcmFtIHF1YWxpdHkgcXVhbGl0eSBzZXR0aW5nICgxLTEwMCkKKyAqIEBwYXJhbSBsdW1hICAgIGdlbmVyYXRlIHF1YW50aXNhdGlvbiBtYXRyaXggZm9yIGx1bWEgb3IgY2hyb21hCisgKi8KK3ZvaWQgZmZfbXNzMzRfZ2VuX3F1YW50X21hdCh1aW50MTZfdCAqcW1hdCwgaW50IHF1YWxpdHksIGludCBsdW1hKTsKKworLyoqCisgKiBUcmFuc2Zvcm0gYW5kIG91dHB1dCBEQ1QgYmxvY2suCisgKgorICogQHBhcmFtIGRzdCAgICAgb3V0cHV0IHBsYW5lCisgKiBAcGFyYW0gc3RyaWRlICBvdXRwdXQgcGxhbmUgc3RyaWRlCisgKiBAcGFyYW0gYmxvY2sgICBibG9jayB0byB0cmFuc2Zvcm0gYW5kIG91dHB1dAorICovCit2b2lkIGZmX21zczM0X2RjdF9wdXQodWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLCBpbnQgKmJsb2NrKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTVNTMzREU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXNzNC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXNzNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjhlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tc3M0LmMKQEAgLTAsMCArMSw2ODIgQEAKKy8qCisgKiBNaWNyb3NvZnQgU2NyZWVuIDQgKGFrYSBNaWNyb3NvZnQgRXhwcmVzc2lvbiBFbmNvZGVyIFNjcmVlbikgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTWljcm9zb2Z0IFNjcmVlbiA0IChha2EgTWljcm9zb2Z0IFRpdGFuaXVtIFNjcmVlbiAyLAorICogYWthIE1pY3Jvc29mdCBFeHByZXNzaW9uIEVuY29kZXIgU2NyZWVuKSBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1zczM0ZHNwLmgiCisjaW5jbHVkZSAidW5hcnkuaCIKKworI2RlZmluZSBIRUFERVJfU0laRSA4CisKK2VudW0gRnJhbWVUeXBlIHsKKyAgICBJTlRSQV9GUkFNRSA9IDAsCisgICAgSU5URVJfRlJBTUUsCisgICAgU0tJUF9GUkFNRQorfTsKKworZW51bSBCbG9ja1R5cGUgeworICAgIFNLSVBfQkxPQ0sgPSAwLAorICAgIERDVF9CTE9DSywKKyAgICBJTUFHRV9CTE9DSywKK307CisKK2VudW0gQ2FjaGVQb3MgeworICAgIExFRlQgPSAwLAorICAgIFRPUF9MRUZULAorICAgIFRPUCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1zczRfZGNfdmxjX2xlbnNbMl1bMTZdID0geworICAgIHsgMCwgMSwgNSwgMSwgMSwgMSwgMSwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMCwgMCwgMCwgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtc3M0X2FjX3ZsY19sZW5zWzJdWzE2XSA9IHsKKyAgICB7IDAsIDIsIDEsIDMsIDMsIDIsIDQsIDMsIDUsIDUsIDQsIDQsIDAsIDAsIDEsIDEyNSB9LAorICAgIHsgMCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMTE5IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1zczRfYWNfdmxjX3N5bXNbMl1bMTYyXSA9IHsKKyAgeyAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAorICAgIDB4MjEsIDB4MzEsIDB4NDEsIDB4MDYsIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsCisgICAgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhBMSwgMHgwOCwKKyAgICAweDIzLCAweDQyLCAweEIxLCAweEMxLCAweDE1LCAweDUyLCAweEQxLCAweEYwLAorICAgIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MEEsIDB4MTYsCisgICAgMHgxNywgMHgxOCwgMHgxOSwgMHgxQSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwKKyAgICAweDI5LCAweDJBLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAgIDB4M0EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksCisgICAgMHg0QSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwKKyAgICAweDVBLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAgIDB4NkEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksCisgICAgMHg3QSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwKKyAgICAweDhBLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAgIDB4OTksIDB4OUEsIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUsIDB4QTYsIDB4QTcsCisgICAgMHhBOCwgMHhBOSwgMHhBQSwgMHhCMiwgMHhCMywgMHhCNCwgMHhCNSwgMHhCNiwKKyAgICAweEI3LCAweEI4LCAweEI5LCAweEJBLCAweEMyLCAweEMzLCAweEM0LCAweEM1LAorICAgIDB4QzYsIDB4QzcsIDB4QzgsIDB4QzksIDB4Q0EsIDB4RDIsIDB4RDMsIDB4RDQsCisgICAgMHhENSwgMHhENiwgMHhENywgMHhEOCwgMHhEOSwgMHhEQSwgMHhFMSwgMHhFMiwKKyAgICAweEUzLCAweEU0LCAweEU1LCAweEU2LCAweEU3LCAweEU4LCAweEU5LCAweEVBLAorICAgIDB4RjEsIDB4RjIsIDB4RjMsIDB4RjQsIDB4RjUsIDB4RjYsIDB4RjcsIDB4RjgsCisgICAgMHhGOSwgMHhGQSAgfSwKKyAgeyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLAorICAgIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsCisgICAgMHgxMywgMHgyMiwgMHgzMiwgMHg4MSwgMHgwOCwgMHgxNCwgMHg0MiwgMHg5MSwKKyAgICAweEExLCAweEIxLCAweEMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweEYwLAorICAgIDB4MTUsIDB4NjIsIDB4NzIsIDB4RDEsIDB4MEEsIDB4MTYsIDB4MjQsIDB4MzQsCisgICAgMHhFMSwgMHgyNSwgMHhGMSwgMHgxNywgMHgxOCwgMHgxOSwgMHgxQSwgMHgyNiwKKyAgICAweDI3LCAweDI4LCAweDI5LCAweDJBLCAweDM1LCAweDM2LCAweDM3LCAweDM4LAorICAgIDB4MzksIDB4M0EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsCisgICAgMHg0OSwgMHg0QSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwKKyAgICAweDU5LCAweDVBLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LAorICAgIDB4NjksIDB4NkEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCisgICAgMHg3OSwgMHg3QSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKKyAgICAweDg4LCAweDg5LCAweDhBLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LAorICAgIDB4OTcsIDB4OTgsIDB4OTksIDB4OUEsIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUsCisgICAgMHhBNiwgMHhBNywgMHhBOCwgMHhBOSwgMHhBQSwgMHhCMiwgMHhCMywgMHhCNCwKKyAgICAweEI1LCAweEI2LCAweEI3LCAweEI4LCAweEI5LCAweEJBLCAweEMyLCAweEMzLAorICAgIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzcsIDB4QzgsIDB4QzksIDB4Q0EsIDB4RDIsCisgICAgMHhEMywgMHhENCwgMHhENSwgMHhENiwgMHhENywgMHhEOCwgMHhEOSwgMHhEQSwKKyAgICAweEUyLCAweEUzLCAweEU0LCAweEU1LCAweEU2LCAweEU3LCAweEU4LCAweEU5LAorICAgIDB4RUEsIDB4RjIsIDB4RjMsIDB4RjQsIDB4RjUsIDB4RjYsIDB4RjcsIDB4RjgsCisgICAgMHhGOSwgMHhGQSAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdmVjX2xlbl9zeW1zWzJdWzRdID0geworICAgIHsgNCwgMiwgMywgMSB9LAorICAgIHsgNCwgMSwgMiwgMyB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtc3M0X3ZlY19lbnRyeV92bGNfbGVuc1syXVsxNl0gPSB7CisgICAgeyAwLCAyLCAyLCAzLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgeyAwLCAxLCA1LCAxLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1zczRfdmVjX2VudHJ5X3ZsY19zeW1zWzJdWzldID0geworICAgIHsgMCwgNywgNiwgNSwgOCwgNCwgMywgMSwgMiB9LAorICAgIHsgMCwgMiwgMywgNCwgNSwgNiwgNywgMSwgOCB9Cit9OworCisjZGVmaW5lIE1BWF9FTlRSSUVTICAxNjIKKwordHlwZWRlZiBzdHJ1Y3QgTVNTNENvbnRleHQgeworICAgIEFWRnJhbWUgICAgKnBpYzsKKworICAgIFZMQyAgICAgICAgZGNfdmxjWzJdLCBhY192bGNbMl07CisgICAgVkxDICAgICAgICB2ZWNfZW50cnlfdmxjWzJdOworICAgIGludCAgICAgICAgYmxvY2tbNjRdOworICAgIHVpbnQ4X3QgICAgaW1nYnVmWzNdWzE2ICogMTZdOworCisgICAgaW50ICAgICAgICBxdWFsaXR5OworICAgIHVpbnQxNl90ICAgcXVhbnRfbWF0WzJdWzY0XTsKKworICAgIGludCAgICAgICAgKnByZXZfZGNbM107CisgICAgaW50ICAgICAgICBkY19zdHJpZGVbM107CisgICAgaW50ICAgICAgICBkY19jYWNoZVs0XVs0XTsKKworICAgIGludCAgICAgICAgcHJldl92ZWNbM11bNF07Cit9IE1TUzRDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgbXNzNF9pbml0X3ZsYyhWTEMgKnZsYywgY29uc3QgdWludDhfdCAqbGVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnN5bXMsIGludCBudW1fc3ltcykKK3sKKyAgICB1aW50OF90ICBiaXRzW01BWF9FTlRSSUVTXTsKKyAgICB1aW50MTZfdCBjb2Rlc1tNQVhfRU5UUklFU107CisgICAgaW50IGksIGo7CisgICAgaW50IHByZWZpeCA9IDAsIG1heF9iaXRzID0gMCwgaWR4ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5zW2ldOyBqKyspIHsKKyAgICAgICAgICAgIGJpdHNbaWR4XSAgPSBpICsgMTsKKyAgICAgICAgICAgIGNvZGVzW2lkeF0gPSBwcmVmaXgrKzsKKyAgICAgICAgICAgIG1heF9iaXRzICAgPSBpICsgMTsKKyAgICAgICAgICAgIGlkeCsrOworICAgICAgICB9CisgICAgICAgIHByZWZpeCA8PD0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfaW5pdF92bGNfc3BhcnNlKHZsYywgRkZNSU4obWF4X2JpdHMsIDkpLCBudW1fc3ltcywgYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzLCAyLCAyLCBzeW1zLCAxLCAxLCAwKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG1zczRfaW5pdF92bGNzKE1TUzRDb250ZXh0ICpjdHgpCit7CisgICAgaW50IHJldCwgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgcmV0ID0gbXNzNF9pbml0X3ZsYygmY3R4LT5kY192bGNbaV0sIG1zczRfZGNfdmxjX2xlbnNbaV0sIE5VTEwsIDEyKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IG1zczRfaW5pdF92bGMoJmN0eC0+YWNfdmxjW2ldLCBtc3M0X2FjX3ZsY19sZW5zW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zczRfYWNfdmxjX3N5bXNbaV0sIDE2Mik7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSBtc3M0X2luaXRfdmxjKCZjdHgtPnZlY19lbnRyeV92bGNbaV0sIG1zczRfdmVjX2VudHJ5X3ZsY19sZW5zW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zczRfdmVjX2VudHJ5X3ZsY19zeW1zW2ldLCA5KTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIG1zczRfZnJlZV92bGNzKE1TUzRDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPmRjX3ZsY1tpXSk7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPmFjX3ZsY1tpXSk7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPnZlY19lbnRyeV92bGNbaV0pOworICAgIH0KK30KKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZhbHVlcyBpbiB0aGUgcmFuZ2UKKyAqICgtcmFuZ2UgKyAxOyAtcmFuZ2UvMl0gVSBbcmFuZ2UvMjsgcmFuZ2UgLSAxKQorICogaS5lLgorICogbmJpdHMgPSAwIC0+IDAKKyAqIG5iaXRzID0gMSAtPiAtMSwgMQorICogbmJpdHMgPSAyIC0+IC0zLCAtMiwgMiwgMworICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X2NvZWZmX2JpdHMoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBuYml0cykKK3sKKyAgICBpbnQgdmFsOworCisgICAgaWYgKCFuYml0cykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB2YWwgPSBnZXRfYml0cyhnYiwgbmJpdHMpOworICAgIGlmICh2YWwgPCAoMSA8PCAobmJpdHMgLSAxKSkpCisgICAgICAgIHZhbCAtPSAoMSA8PCBuYml0cykgLSAxOworCisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2NvZWZmKEdldEJpdENvbnRleHQgKmdiLCBWTEMgKnZsYykKK3sKKyAgICBpbnQgdmFsID0gZ2V0X3ZsYzIoZ2IsIHZsYy0+dGFibGUsIHZsYy0+Yml0cywgMik7CisKKyAgICByZXR1cm4gZ2V0X2NvZWZmX2JpdHMoZ2IsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbXNzNF9kZWNvZGVfZGN0KEdldEJpdENvbnRleHQgKmdiLCBWTEMgKmRjX3ZsYywgVkxDICphY192bGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJsb2NrLCBpbnQgKmRjX2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ4LCBpbnQgYnksIHVpbnQxNl90ICpxdWFudF9tYXQpCit7CisgICAgaW50IHNraXAsIHZhbCwgcG9zID0gMSwgenpfcG9zLCBkYzsKKworICAgIG1lbXNldChibG9jaywgMCwgc2l6ZW9mKCpibG9jaykgKiA2NCk7CisKKyAgICBkYyA9IGdldF9jb2VmZihnYiwgZGNfdmxjKTsKKyAgICAvLyBEQyBwcmVkaWN0aW9uIGlzIHRoZSBzYW1lIGFzIGluIE1TUzMKKyAgICBpZiAoYnkpIHsKKyAgICAgICAgaWYgKGJ4KSB7CisgICAgICAgICAgICBpbnQgbCwgdGwsIHQ7CisKKyAgICAgICAgICAgIGwgID0gZGNfY2FjaGVbTEVGVF07CisgICAgICAgICAgICB0bCA9IGRjX2NhY2hlW1RPUF9MRUZUXTsKKyAgICAgICAgICAgIHQgID0gZGNfY2FjaGVbVE9QXTsKKworICAgICAgICAgICAgaWYgKEZGQUJTKHQgLSB0bCkgPD0gRkZBQlMobCAtIHRsKSkKKyAgICAgICAgICAgICAgICBkYyArPSBsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRjICs9IHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYyArPSBkY19jYWNoZVtUT1BdOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChieCkgeworICAgICAgICBkYyArPSBkY19jYWNoZVtMRUZUXTsKKyAgICB9CisgICAgZGNfY2FjaGVbTEVGVF0gPSBkYzsKKyAgICBibG9ja1swXSAgICAgICA9IGRjICogcXVhbnRfbWF0WzBdOworCisgICAgd2hpbGUgKHBvcyA8IDY0KSB7CisgICAgICAgIHZhbCA9IGdldF92bGMyKGdiLCBhY192bGMtPnRhYmxlLCA5LCAyKTsKKyAgICAgICAgaWYgKCF2YWwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHZhbCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHZhbCA9PSAweEYwKSB7CisgICAgICAgICAgICBwb3MgKz0gMTY7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBza2lwID0gdmFsID4+IDQ7CisgICAgICAgIHZhbCAgPSBnZXRfY29lZmZfYml0cyhnYiwgdmFsICYgMHhGKTsKKyAgICAgICAgcG9zICs9IHNraXA7CisgICAgICAgIGlmIChwb3MgPj0gNjQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgenpfcG9zID0gZmZfemlnemFnX2RpcmVjdFtwb3NdOworICAgICAgICBibG9ja1t6el9wb3NdID0gdmFsICogcXVhbnRfbWF0W3p6X3Bvc107CisgICAgICAgIHBvcysrOworICAgIH0KKworICAgIHJldHVybiBwb3MgPT0gNjQgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgbXNzNF9kZWNvZGVfZGN0X2Jsb2NrKE1TUzRDb250ZXh0ICpjLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFszXSwgaW50IG1iX3gsIGludCBtYl95KQoreworICAgIGludCBpLCBqLCBrLCByZXQ7CisgICAgdWludDhfdCAqb3V0ID0gZHN0WzBdOworCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgeHBvcyA9IG1iX3ggKiAyICsgaTsKKyAgICAgICAgICAgIGMtPmRjX2NhY2hlW2pdW1RPUF9MRUZUXSA9IGMtPmRjX2NhY2hlW2pdW1RPUF07CisgICAgICAgICAgICBjLT5kY19jYWNoZVtqXVtUT1BdICAgICAgPSBjLT5wcmV2X2RjWzBdW21iX3ggKiAyICsgaV07CisgICAgICAgICAgICByZXQgPSBtc3M0X2RlY29kZV9kY3QoZ2IsIGMtPmRjX3ZsYywgYy0+YWNfdmxjLCBjLT5ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5kY19jYWNoZVtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cG9zLCBtYl95ICogMiArIGosIGMtPnF1YW50X21hdFswXSk7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBjLT5wcmV2X2RjWzBdW21iX3ggKiAyICsgaV0gPSBjLT5kY19jYWNoZVtqXVtMRUZUXTsKKworICAgICAgICAgICAgZmZfbXNzMzRfZGN0X3B1dChvdXQgKyB4cG9zICogOCwgYy0+cGljLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YmxvY2spOworICAgICAgICB9CisgICAgICAgIG91dCArPSA4ICogYy0+cGljLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGMtPmRjX2NhY2hlW2kgKyAxXVtUT1BfTEVGVF0gPSBjLT5kY19jYWNoZVtpICsgMV1bVE9QXTsKKyAgICAgICAgYy0+ZGNfY2FjaGVbaSArIDFdW1RPUF0gICAgICA9IGMtPnByZXZfZGNbaV1bbWJfeF07CisgICAgICAgIHJldCA9IG1zczRfZGVjb2RlX2RjdChnYiwgYy0+ZGNfdmxjICsgMSwgYy0+YWNfdmxjICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmJsb2NrLCBjLT5kY19jYWNoZVtpICsgMV0sIG1iX3gsIG1iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5xdWFudF9tYXRbMV0pOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYy0+cHJldl9kY1tpXVttYl94XSA9IGMtPmRjX2NhY2hlW2kgKyAxXVtMRUZUXTsKKworICAgICAgICBmZl9tc3MzNF9kY3RfcHV0KGMtPmltZ2J1ZltpXSwgOCwgYy0+YmxvY2spOworICAgICAgICBvdXQgPSBkc3RbaV0gKyBtYl94ICogMTY7CisgICAgICAgIC8vIFNpbmNlIHRoZSBEQ1QgYmxvY2sgaXMgY29kZWQgYXMgWVVWNDIwIGFuZCB0aGUgd2hvbGUgZnJhbWUgYXMgWVVWNDQ0LAorICAgICAgICAvLyB3ZSBuZWVkIHRvIHNjYWxlIGNocm9tYS4KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgQVZfV04xNkEob3V0ICsgayAqIDIsIGMtPmltZ2J1ZltpXVtrICsgKGogJiB+MSkgKiA0XSAqIDB4MTAxKTsKKyAgICAgICAgICAgIG91dCArPSBjLT5waWMtPmxpbmVzaXplW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfdmVjX3BvcyhHZXRCaXRDb250ZXh0ICpnYiwgaW50ICp2ZWNfcG9zLCBpbnQgKnNlbF9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2VsX2xlbiwgaW50ICpwcmV2KQoreworICAgIGludCBpLCB5X2ZsYWcgPSAwOworCisgICAgZm9yIChpID0gMjsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaWYgKCFzZWxfZmxhZ1tpXSkgeworICAgICAgICAgICAgdmVjX3Bvc1tpXSA9IDA7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCFpICYmICF5X2ZsYWcpIHx8IGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIGlmIChzZWxfbGVuW2ldID4gMCkgeworICAgICAgICAgICAgICAgIGludCBwdmFsID0gcHJldltpXTsKKyAgICAgICAgICAgICAgICB2ZWNfcG9zW2ldID0gZ2V0X2JpdHMoZ2IsIHNlbF9sZW5baV0pOworICAgICAgICAgICAgICAgIGlmICh2ZWNfcG9zW2ldID49IHB2YWwpCisgICAgICAgICAgICAgICAgICAgIHZlY19wb3NbaV0rKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmVjX3Bvc1tpXSA9ICFwcmV2W2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeV9mbGFnID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZlY19wb3NbaV0gPSBwcmV2W2ldOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGdldF92YWx1ZV9jYWNoZWQoR2V0Qml0Q29udGV4dCAqZ2IsIGludCB2ZWNfcG9zLCB1aW50OF90ICp2ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlY19zaXplLCBpbnQgY29tcG9uZW50LCBpbnQgc2hpZnQsIGludCAqcHJldikKK3sKKyAgICBpZiAodmVjX3BvcyA8IHZlY19zaXplKQorICAgICAgICByZXR1cm4gdmVjW3ZlY19wb3NdOworICAgIGlmICghZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgcmV0dXJuIHByZXZbY29tcG9uZW50XTsKKyAgICBwcmV2W2NvbXBvbmVudF0gPSBnZXRfYml0cyhnYiwgOCAtIHNoaWZ0KSA8PCBzaGlmdDsKKyAgICByZXR1cm4gcHJldltjb21wb25lbnRdOworfQorCisjZGVmaW5lIE1LVkFMKHZhbHMpICAoKHZhbHMpWzBdIHwgKCh2YWxzKVsxXSA8PCAzKSB8ICgodmFscylbMl0gPDwgNikpCisKKy8qIEltYWdlIG1vZGUgLSB0aGUgaGFyZGVzdCB0byBjb21wcmVoZW5kIE1TUzQgY29kaW5nIG1vZGUuCisgKgorICogSW4gdGhpcyBtb2RlIGFsbCB0aHJlZSAxNngxNiBibG9ja3MgYXJlIGNvZGVkIHRvZ2V0aGVyIHdpdGggYSBtZXRob2QKKyAqIHJlbW90ZWx5IHNpbWlsYXIgdG8gdGhlIG1ldGhvZHMgZW1wbG95ZWQgaW4gTVNTMS1NU1MzLgorICogVGhlIGlkZWEgaXMgdGhhdCBldmVyeSBjb21wb25lbnQgaGFzIGEgdmVjdG9yIG9mIDEtNCBtb3N0IGNvbW1vbiBzeW1ib2xzCisgKiBhbmQgYW4gZXNjYXBlIG1vZGUgZm9yIHJlYWRpbmcgbmV3IHZhbHVlIGZyb20gdGhlIGJpdHN0cmVhbS4gRGVjb2RpbmcKKyAqIGNvbnNpc3RzIG9mIHJldHJpZXZpbmcgcGl4ZWwgdmFsdWVzIGZyb20gdGhlIHZlY3RvciBvciByZWFkaW5nIG5ldyBvbmVzCisgKiBmcm9tIHRoZSBiaXRzdHJlYW07IGRlcGVuZGluZyBvbiBmbGFncyByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSwgdGhlc2UgdmVjdG9yCisgKiBwb3NpdGlvbnMgY2FuIGJlIHVwZGF0ZWQgb3IgcmV1c2VkIGZyb20gdGhlIHN0YXRlIG9mIHRoZSBwcmV2aW91cyBsaW5lCisgKiBvciBwcmV2aW91cyBwaXhlbC4KKyAqLworc3RhdGljIGludCBtc3M0X2RlY29kZV9pbWFnZV9ibG9jayhNU1M0Q29udGV4dCAqY3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGljZHN0WzNdLCBpbnQgbWJfeCwgaW50IG1iX3kpCit7CisgICAgdWludDhfdCB2ZWNbM11bNF07CisgICAgaW50ICAgICB2ZWNfbGVuWzNdOworICAgIGludCAgICAgc2VsX2xlblszXSwgc2VsX2ZsYWdbM107CisgICAgaW50ICAgICBpLCBqLCBrLCBtb2RlLCBzcGxpdDsKKyAgICBpbnQgICAgIHByZXZfdmVjMSA9IDAsIHByZXZfc3BsaXQgPSAwOworICAgIGludCAgICAgdmFsc1szXSA9IHsgMCB9OworICAgIGludCAgICAgcHJldl9waXhbM10gPSB7IDAgfTsKKyAgICBpbnQgICAgIHByZXZfbW9kZVsxNl0gPSB7IDAgfTsKKyAgICB1aW50OF90ICpkc3RbM107CisKKyAgICBjb25zdCBpbnQgdmFsX3NoaWZ0ID0gY3R4LT5xdWFsaXR5ID09IDEwMCA/IDAgOiAyOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgZHN0W2ldID0gY3R4LT5pbWdidWZbaV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIHZlY19sZW5baV0gPSB2ZWNfbGVuX3N5bXNbISFpXVtnZXRfdW5hcnkoZ2IsIDAsIDMpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHZlY19sZW5baV07IGorKykgeworICAgICAgICAgICAgdmVjW2ldW2pdICA9IGdldF9jb2VmZihnYiwgJmN0eC0+dmVjX2VudHJ5X3ZsY1shIWldKTsKKyAgICAgICAgICAgIHZlY1tpXVtqXSArPSBjdHgtPnByZXZfdmVjW2ldW2pdOworICAgICAgICAgICAgY3R4LT5wcmV2X3ZlY1tpXVtqXSA9IHZlY1tpXVtqXTsKKyAgICAgICAgfQorICAgICAgICBzZWxfZmxhZ1tpXSA9IHZlY19sZW5baV0gPiAxOworICAgICAgICBzZWxfbGVuW2ldICA9IHZlY19sZW5baV0gPiAyID8gdmVjX2xlbltpXSAtIDIgOiAwOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBzcGxpdCA9IDA7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgICAgIHByZXZfbW9kZVswXSA9IDA7CisgICAgICAgICAgICAgICAgdmFsc1swXSA9IHZhbHNbMV0gPSB2YWxzWzJdID0gMDsKKyAgICAgICAgICAgICAgICBtb2RlID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgaWYgKG1vZGUpCisgICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobW9kZSA8PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHNbMF0gPSAgcHJldl9tb2RlW2ldICAgICAgICYgNzsKKyAgICAgICAgICAgICAgICAgICAgdmFsc1sxXSA9IChwcmV2X21vZGVbaV0gPj4gMykgJiA3OworICAgICAgICAgICAgICAgICAgICB2YWxzWzJdID0gIHByZXZfbW9kZVtpXSA+PiA2OworICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PSAxICYmIGkgPT0gc3BsaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdmVjX3BvcyhnYiwgdmFscywgc2VsX2ZsYWcsIHNlbF9sZW4sIHZhbHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3ZlY19wb3MoZ2IsIHZhbHMsIHNlbF9mbGFnLCBzZWxfbGVuLCB2YWxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgKmRzdFtrXSsrID0gZ2V0X3ZhbHVlX2NhY2hlZChnYiwgdmFsc1trXSwgdmVjW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY19sZW5ba10sIGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsX3NoaWZ0LCBwcmV2X3BpeCk7CisgICAgICAgICAgICAgICAgcHJldl9tb2RlW2ldID0gTUtWQUwodmFscyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgICAgIHNwbGl0ID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICAgICAgICAgIGlmIChzcGxpdCA+PSBwcmV2X3NwbGl0KQorICAgICAgICAgICAgICAgICAgICBzcGxpdCsrOworICAgICAgICAgICAgICAgIHByZXZfc3BsaXQgPSBzcGxpdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3BsaXQgPSBwcmV2X3NwbGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNwbGl0KSB7CisgICAgICAgICAgICAgICAgdmFsc1swXSA9ICBwcmV2X21vZGVbMF0gICAgICAgJiA3OworICAgICAgICAgICAgICAgIHZhbHNbMV0gPSAocHJldl9tb2RlWzBdID4+IDMpICYgNzsKKyAgICAgICAgICAgICAgICB2YWxzWzJdID0gIHByZXZfbW9kZVswXSA+PiA2OworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNwbGl0OyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkc3RbaV0rKyA9IGdldF92YWx1ZV9jYWNoZWQoZ2IsIHZhbHNbaV0sIHZlY1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjX2xlbltpXSwgaSwgdmFsX3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3BpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X21vZGVba10gPSBNS1ZBTCh2YWxzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNwbGl0ICE9IDE2KSB7CisgICAgICAgICAgICAgICAgdmFsc1swXSA9ICBwcmV2X3ZlYzEgICAgICAgJiA3OworICAgICAgICAgICAgICAgIHZhbHNbMV0gPSAocHJldl92ZWMxID4+IDMpICYgNzsKKyAgICAgICAgICAgICAgICB2YWxzWzJdID0gIHByZXZfdmVjMSA+PiA2OworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRfdmVjX3BvcyhnYiwgdmFscywgc2VsX2ZsYWcsIHNlbF9sZW4sIHZhbHMpOworICAgICAgICAgICAgICAgICAgICBwcmV2X3ZlYzEgPSBNS1ZBTCh2YWxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMTYgLSBzcGxpdDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZHN0W2ldKysgPSBnZXRfdmFsdWVfY2FjaGVkKGdiLCB2YWxzW2ldLCB2ZWNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY19sZW5baV0sIGksIHZhbF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9waXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9tb2RlW3NwbGl0ICsga10gPSBNS1ZBTCh2YWxzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgbWVtY3B5KHBpY2RzdFtpXSArIG1iX3ggKiAxNiArIGogKiBjdHgtPnBpYy0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgY3R4LT5pbWdidWZbaV0gKyBqICogMTYsIDE2KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNzNF91cGRhdGVfZGNfY2FjaGUoTVNTNENvbnRleHQgKmMsIGludCBtYl94KQoreworICAgIGludCBpOworCisgICAgYy0+ZGNfY2FjaGVbMF1bVE9QXSAgPSBjLT5wcmV2X2RjWzBdW21iX3ggKiAyICsgMV07CisgICAgYy0+ZGNfY2FjaGVbMF1bTEVGVF0gPSAwOworICAgIGMtPmRjX2NhY2hlWzFdW1RPUF0gID0gMDsKKyAgICBjLT5kY19jYWNoZVsxXVtMRUZUXSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICBjLT5wcmV2X2RjWzBdW21iX3ggKiAyICsgaV0gPSAwOworCisgICAgZm9yIChpID0gMTsgaSA8IDM7IGkrKykgeworICAgICAgICBjLT5kY19jYWNoZVtpICsgMV1bVE9QXSAgPSBjLT5wcmV2X2RjW2ldW21iX3hdOworICAgICAgICBjLT5kY19jYWNoZVtpICsgMV1bTEVGVF0gPSAwOworICAgICAgICBjLT5wcmV2X2RjW2ldW21iX3hdICAgICAgPSAwOworICAgIH0KK30KKworc3RhdGljIGludCBtc3M0X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgTVNTNENvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgR2V0Qnl0ZUNvbnRleHQgYmM7CisgICAgdWludDhfdCAqZHN0WzNdOworICAgIGludCB3aWR0aCwgaGVpZ2h0LCBxdWFsaXR5LCBmcmFtZV90eXBlOworICAgIGludCB4LCB5LCBpLCBtYl93aWR0aCwgbWJfaGVpZ2h0LCBibGtfdHlwZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGJ1Zl9zaXplIDwgSEVBREVSX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRnJhbWUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgJWQgYnl0ZXMsIGdvdCAlZCBpbnN0ZWFkXG4iLAorICAgICAgICAgICAgICAgSEVBREVSX1NJWkUsIGJ1Zl9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmYmMsIGJ1ZiwgYnVmX3NpemUpOworICAgIHdpZHRoICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmYmMpOworICAgIGhlaWdodCAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmYmMpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmJjLCAyKTsKKyAgICBxdWFsaXR5ICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmJjKTsKKyAgICBmcmFtZV90eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmJjKTsKKworICAgIGlmICh3aWR0aCA+IGF2Y3R4LT53aWR0aCB8fAorICAgICAgICBoZWlnaHQgIT0gYXZjdHgtPmhlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgZGltZW5zaW9ucyAlZHglZFxuIiwKKyAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKHF1YWxpdHkgPCAxIHx8IHF1YWxpdHkgPiAxMDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHF1YWxpdHkgc2V0dGluZyAlZFxuIiwgcXVhbGl0eSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoKGZyYW1lX3R5cGUgJiB+MykgfHwgZnJhbWVfdHlwZSA9PSAzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZSB0eXBlICVkXG4iLCBmcmFtZV90eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGZyYW1lX3R5cGUgIT0gU0tJUF9GUkFNRSAmJiAhYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmJjKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJFbXB0eSBmcmFtZSBmb3VuZCBidXQgaXQgaXMgbm90IGEgc2tpcCBmcmFtZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgYy0+cGljKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGMtPnBpYy0+a2V5X2ZyYW1lID0gKGZyYW1lX3R5cGUgPT0gSU5UUkFfRlJBTUUpOworICAgIGMtPnBpYy0+cGljdF90eXBlID0gKGZyYW1lX3R5cGUgPT0gSU5UUkFfRlJBTUUpID8gQVZfUElDVFVSRV9UWVBFX0kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZfUElDVFVSRV9UWVBFX1A7CisgICAgaWYgKGZyYW1lX3R5cGUgPT0gU0tJUF9GUkFNRSkgeworICAgICAgICAqZ290X2ZyYW1lICAgICAgPSAxOworICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBjLT5waWMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoYy0+cXVhbGl0eSAhPSBxdWFsaXR5KSB7CisgICAgICAgIGMtPnF1YWxpdHkgPSBxdWFsaXR5OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgZmZfbXNzMzRfZ2VuX3F1YW50X21hdChjLT5xdWFudF9tYXRbaV0sIHF1YWxpdHksICFpKTsKKyAgICB9CisKKyAgICBpbml0X2dldF9iaXRzOCgmZ2IsIGJ1ZiArIEhFQURFUl9TSVpFLCAoYnVmX3NpemUgLSBIRUFERVJfU0laRSkpOworCisgICAgbWJfd2lkdGggID0gRkZBTElHTih3aWR0aCwgIDE2KSA+PiA0OworICAgIG1iX2hlaWdodCA9IEZGQUxJR04oaGVpZ2h0LCAxNikgPj4gNDsKKyAgICBkc3RbMF0gPSBjLT5waWMtPmRhdGFbMF07CisgICAgZHN0WzFdID0gYy0+cGljLT5kYXRhWzFdOworICAgIGRzdFsyXSA9IGMtPnBpYy0+ZGF0YVsyXTsKKworICAgIG1lbXNldChjLT5wcmV2X3ZlYywgMCwgc2l6ZW9mKGMtPnByZXZfdmVjKSk7CisgICAgZm9yICh5ID0gMDsgeSA8IG1iX2hlaWdodDsgeSsrKSB7CisgICAgICAgIG1lbXNldChjLT5kY19jYWNoZSwgMCwgc2l6ZW9mKGMtPmRjX2NhY2hlKSk7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBtYl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBibGtfdHlwZSA9IGRlY29kZTAxMigmZ2IpOworICAgICAgICAgICAgc3dpdGNoIChibGtfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBEQ1RfQkxPQ0s6CisgICAgICAgICAgICAgICAgaWYgKG1zczRfZGVjb2RlX2RjdF9ibG9jayhjLCAmZ2IsIGRzdCwgeCwgeSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGRlY29kaW5nIERDVCBibG9jayAlZCwlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElNQUdFX0JMT0NLOgorICAgICAgICAgICAgICAgIGlmIChtc3M0X2RlY29kZV9pbWFnZV9ibG9jayhjLCAmZ2IsIGRzdCwgeCwgeSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGRlY29kaW5nIFZRIGJsb2NrICVkLCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0tJUF9CTE9DSzoKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVfdHlwZSA9PSBJTlRSQV9GUkFNRSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNraXAgYmxvY2sgaW4gaW50cmEgZnJhbWVcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYmxrX3R5cGUgIT0gRENUX0JMT0NLKQorICAgICAgICAgICAgICAgIG1zczRfdXBkYXRlX2RjX2NhY2hlKGMsIHgpOworICAgICAgICB9CisgICAgICAgIGRzdFswXSArPSBjLT5waWMtPmxpbmVzaXplWzBdICogMTY7CisgICAgICAgIGRzdFsxXSArPSBjLT5waWMtPmxpbmVzaXplWzFdICogMTY7CisgICAgICAgIGRzdFsyXSArPSBjLT5waWMtPmxpbmVzaXplWzJdICogMTY7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgYy0+cGljKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9mcmFtZSAgICAgID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG1zczRfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTVNTNENvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmMtPnBpYyk7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmMtPnByZXZfZGNbaV0pOworICAgIG1zczRfZnJlZV92bGNzKGMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtc3M0X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNU1M0Q29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgaWYgKG1zczRfaW5pdF92bGNzKGMpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGluaXRpYWxpc2UgVkxDc1xuIik7CisgICAgICAgIG1zczRfZnJlZV92bGNzKGMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGMtPmRjX3N0cmlkZVtpXSA9IEZGQUxJR04oYXZjdHgtPndpZHRoLCAxNikgPj4gKDIgKyAhIWkpOworICAgICAgICBjLT5wcmV2X2RjW2ldICAgPSBhdl9tYWxsb2Moc2l6ZW9mKCoqYy0+cHJldl9kYykgKiBjLT5kY19zdHJpZGVbaV0pOworICAgICAgICBpZiAoIWMtPnByZXZfZGNbaV0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIGJ1ZmZlclxuIik7CisgICAgICAgICAgICBtc3M0X2ZyZWVfdmxjcyhjKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjLT5waWMgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYy0+cGljKSB7CisgICAgICAgIG1zczRfZGVjb2RlX2VuZChhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgYXZjdHgtPnBpeF9mbXQgICAgID0gQVZfUElYX0ZNVF9ZVVY0NDRQOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbXRzMl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtdHMyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVMgRXhwcmVzc2lvbiBFbmNvZGVyIFNjcmVlbiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NVFMyLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNU1M0Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbXNzNF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBtc3M0X2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gbXNzNF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9tc3ZpZGVvMS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXN2aWRlbzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODM5N2JlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXN2aWRlbzEuYwpAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIE1pY3Jvc29mdCBWaWRlby0xIERlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTWljcm9zb2Z0IFZpZGVvLTEgRGVjb2RlciBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE1TIFZpZGVvLTEgZm9ybWF0LCB2aXNpdDoKKyAqICAgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFBBTEVUVEVfQ09VTlQgMjU2CisjZGVmaW5lIENIRUNLX1NUUkVBTV9QVFIobikgXAorICBpZiAoKHN0cmVhbV9wdHIgKyBuKSA+IHMtPnNpemUgKSB7IFwKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIiBNUyBWaWRlby0xIHdhcm5pbmc6IHN0cmVhbV9wdHIgb3V0IG9mIGJvdW5kcyAoJWQgPj0gJWQpXG4iLCBcCisgICAgICBzdHJlYW1fcHRyICsgbiwgcy0+c2l6ZSk7IFwKKyAgICByZXR1cm47IFwKKyAgfQorCit0eXBlZGVmIHN0cnVjdCBNc3ZpZGVvMUNvbnRleHQgeworCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRnJhbWUgKmZyYW1lOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmOworICAgIGludCBzaXplOworCisgICAgaW50IG1vZGVfOGJpdDsgIC8qIGlmIGl0J3Mgbm90IDgtYml0LCBpdCdzIDE2LWJpdCAqLworCisgICAgdWludDMyX3QgcGFsWzI1Nl07Cit9IE1zdmlkZW8xQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IG1zdmlkZW8xX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNc3ZpZGVvMUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIC8qIGZpZ3VyZSBvdXQgdGhlIGNvbG9yc3BhY2UgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgcGFsZXR0ZSAqLworICAgIGlmIChzLT5hdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDgpIHsKKyAgICAgICAgcy0+bW9kZV84Yml0ID0gMTsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPj0gQVZQQUxFVFRFX1NJWkUpCisgICAgICAgICAgICBtZW1jcHkocy0+cGFsLCBhdmN0eC0+ZXh0cmFkYXRhLCBBVlBBTEVUVEVfU0laRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bW9kZV84Yml0ID0gMDsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU1NTsKKyAgICB9CisKKyAgICBzLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtc3ZpZGVvMV9kZWNvZGVfOGJpdChNc3ZpZGVvMUNvbnRleHQgKnMpCit7CisgICAgaW50IGJsb2NrX3B0ciwgcGl4ZWxfcHRyOworICAgIGludCB0b3RhbF9ibG9ja3M7CisgICAgaW50IHBpeGVsX3gsIHBpeGVsX3k7ICAvKiBwaXhlbCB3aWR0aCBhbmQgaGVpZ2h0IGl0ZXJhdG9ycyAqLworICAgIGludCBibG9ja194LCBibG9ja195OyAgLyogYmxvY2sgd2lkdGggYW5kIGhlaWdodCBpdGVyYXRvcnMgKi8KKyAgICBpbnQgYmxvY2tzX3dpZGUsIGJsb2Nrc19oaWdoOyAgLyogd2lkdGggYW5kIGhlaWdodCBpbiA0eDQgYmxvY2tzICovCisgICAgaW50IGJsb2NrX2luYzsKKyAgICBpbnQgcm93X2RlYzsKKworICAgIC8qIGRlY29kaW5nIHBhcmFtZXRlcnMgKi8KKyAgICBpbnQgc3RyZWFtX3B0cjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5dGVfYSwgYnl0ZV9iOworICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzOworICAgIGludCBza2lwX2Jsb2NrczsKKyAgICB1bnNpZ25lZCBjaGFyIGNvbG9yc1s4XTsKKyAgICB1bnNpZ25lZCBjaGFyICpwaXhlbHMgPSBzLT5mcmFtZS0+ZGF0YVswXTsKKyAgICBpbnQgc3RyaWRlID0gcy0+ZnJhbWUtPmxpbmVzaXplWzBdOworCisgICAgc3RyZWFtX3B0ciA9IDA7CisgICAgc2tpcF9ibG9ja3MgPSAwOworICAgIGJsb2Nrc193aWRlID0gcy0+YXZjdHgtPndpZHRoIC8gNDsKKyAgICBibG9ja3NfaGlnaCA9IHMtPmF2Y3R4LT5oZWlnaHQgLyA0OworICAgIHRvdGFsX2Jsb2NrcyA9IGJsb2Nrc193aWRlICogYmxvY2tzX2hpZ2g7CisgICAgYmxvY2tfaW5jID0gNDsKKyAgICByb3dfZGVjID0gc3RyaWRlICsgNDsKKworICAgIGZvciAoYmxvY2tfeSA9IGJsb2Nrc19oaWdoOyBibG9ja195ID4gMDsgYmxvY2tfeS0tKSB7CisgICAgICAgIGJsb2NrX3B0ciA9ICgoYmxvY2tfeSAqIDQpIC0gMSkgKiBzdHJpZGU7CisgICAgICAgIGZvciAoYmxvY2tfeCA9IGJsb2Nrc193aWRlOyBibG9ja194ID4gMDsgYmxvY2tfeC0tKSB7CisgICAgICAgICAgICAvKiBjaGVjayBpZiB0aGlzIGJsb2NrIHNob3VsZCBiZSBza2lwcGVkICovCisgICAgICAgICAgICBpZiAoc2tpcF9ibG9ja3MpIHsKKyAgICAgICAgICAgICAgICBibG9ja19wdHIgKz0gYmxvY2tfaW5jOworICAgICAgICAgICAgICAgIHNraXBfYmxvY2tzLS07CisgICAgICAgICAgICAgICAgdG90YWxfYmxvY2tzLS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBpeGVsX3B0ciA9IGJsb2NrX3B0cjsKKworICAgICAgICAgICAgLyogZ2V0IHRoZSBuZXh0IHR3byBieXRlcyBpbiB0aGUgZW5jb2RlZCBkYXRhIHN0cmVhbSAqLworICAgICAgICAgICAgQ0hFQ0tfU1RSRUFNX1BUUigyKTsKKyAgICAgICAgICAgIGJ5dGVfYSA9IHMtPmJ1ZltzdHJlYW1fcHRyKytdOworICAgICAgICAgICAgYnl0ZV9iID0gcy0+YnVmW3N0cmVhbV9wdHIrK107CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBkZWNvZGUgaXMgZmluaXNoZWQgKi8KKyAgICAgICAgICAgIGlmICgoYnl0ZV9hID09IDApICYmIChieXRlX2IgPT0gMCkgJiYgKHRvdGFsX2Jsb2NrcyA9PSAwKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBlbHNlIGlmICgoYnl0ZV9iICYgMHhGQykgPT0gMHg4NCkgeworICAgICAgICAgICAgICAgIC8qIHNraXAgY29kZSwgYnV0IGRvbid0IGNvdW50IHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgICAgICAgICAgc2tpcF9ibG9ja3MgPSAoKGJ5dGVfYiAtIDB4ODQpIDw8IDgpICsgYnl0ZV9hIC0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZV9iIDwgMHg4MCkgeworICAgICAgICAgICAgICAgIC8qIDItY29sb3IgZW5jb2RpbmcgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IChieXRlX2IgPDwgOCkgfCBieXRlX2E7CisKKyAgICAgICAgICAgICAgICBDSEVDS19TVFJFQU1fUFRSKDIpOworICAgICAgICAgICAgICAgIGNvbG9yc1swXSA9IHMtPmJ1ZltzdHJlYW1fcHRyKytdOworICAgICAgICAgICAgICAgIGNvbG9yc1sxXSA9IHMtPmJ1ZltzdHJlYW1fcHRyKytdOworCisgICAgICAgICAgICAgICAgZm9yIChwaXhlbF95ID0gMDsgcGl4ZWxfeSA8IDQ7IHBpeGVsX3krKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHBpeGVsX3ggPSAwOyBwaXhlbF94IDwgNDsgcGl4ZWxfeCsrLCBmbGFncyA+Pj0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1twaXhlbF9wdHIrK10gPSBjb2xvcnNbKGZsYWdzICYgMHgxKSBeIDFdOworICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgLT0gcm93X2RlYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGVfYiA+PSAweDkwKSB7CisgICAgICAgICAgICAgICAgLyogOC1jb2xvciBlbmNvZGluZyAqLworICAgICAgICAgICAgICAgIGZsYWdzID0gKGJ5dGVfYiA8PCA4KSB8IGJ5dGVfYTsKKworICAgICAgICAgICAgICAgIENIRUNLX1NUUkVBTV9QVFIoOCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGNvbG9ycywgJnMtPmJ1ZltzdHJlYW1fcHRyXSwgOCk7CisgICAgICAgICAgICAgICAgc3RyZWFtX3B0ciArPSA4OworCisgICAgICAgICAgICAgICAgZm9yIChwaXhlbF95ID0gMDsgcGl4ZWxfeSA8IDQ7IHBpeGVsX3krKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHBpeGVsX3ggPSAwOyBwaXhlbF94IDwgNDsgcGl4ZWxfeCsrLCBmbGFncyA+Pj0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1twaXhlbF9wdHIrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc1soKHBpeGVsX3kgJiAweDIpIDw8IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBpeGVsX3ggJiAweDIpICsgKChmbGFncyAmIDB4MSkgXiAxKV07CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciAtPSByb3dfZGVjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogMS1jb2xvciBlbmNvZGluZyAqLworICAgICAgICAgICAgICAgIGNvbG9yc1swXSA9IGJ5dGVfYTsKKworICAgICAgICAgICAgICAgIGZvciAocGl4ZWxfeSA9IDA7IHBpeGVsX3kgPCA0OyBwaXhlbF95KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwaXhlbF94ID0gMDsgcGl4ZWxfeCA8IDQ7IHBpeGVsX3grKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1twaXhlbF9wdHIrK10gPSBjb2xvcnNbMF07CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciAtPSByb3dfZGVjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmxvY2tfcHRyICs9IGJsb2NrX2luYzsKKyAgICAgICAgICAgIHRvdGFsX2Jsb2Nrcy0tOworICAgICAgICB9CisgICAgfQorCisgICAgLyogbWFrZSB0aGUgcGFsZXR0ZSBhdmFpbGFibGUgb24gdGhlIHdheSBvdXQgKi8KKyAgICBpZiAocy0+YXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KQorICAgICAgICBtZW1jcHkocy0+ZnJhbWUtPmRhdGFbMV0sIHMtPnBhbCwgQVZQQUxFVFRFX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBtc3ZpZGVvMV9kZWNvZGVfMTZiaXQoTXN2aWRlbzFDb250ZXh0ICpzKQoreworICAgIGludCBibG9ja19wdHIsIHBpeGVsX3B0cjsKKyAgICBpbnQgdG90YWxfYmxvY2tzOworICAgIGludCBwaXhlbF94LCBwaXhlbF95OyAgLyogcGl4ZWwgd2lkdGggYW5kIGhlaWdodCBpdGVyYXRvcnMgKi8KKyAgICBpbnQgYmxvY2tfeCwgYmxvY2tfeTsgIC8qIGJsb2NrIHdpZHRoIGFuZCBoZWlnaHQgaXRlcmF0b3JzICovCisgICAgaW50IGJsb2Nrc193aWRlLCBibG9ja3NfaGlnaDsgIC8qIHdpZHRoIGFuZCBoZWlnaHQgaW4gNHg0IGJsb2NrcyAqLworICAgIGludCBibG9ja19pbmM7CisgICAgaW50IHJvd19kZWM7CisKKyAgICAvKiBkZWNvZGluZyBwYXJhbWV0ZXJzICovCisgICAgaW50IHN0cmVhbV9wdHI7CisgICAgdW5zaWduZWQgY2hhciBieXRlX2EsIGJ5dGVfYjsKKyAgICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKKyAgICBpbnQgc2tpcF9ibG9ja3M7CisgICAgdW5zaWduZWQgc2hvcnQgY29sb3JzWzhdOworICAgIHVuc2lnbmVkIHNob3J0ICpwaXhlbHMgPSAodW5zaWduZWQgc2hvcnQgKilzLT5mcmFtZS0+ZGF0YVswXTsKKyAgICBpbnQgc3RyaWRlID0gcy0+ZnJhbWUtPmxpbmVzaXplWzBdIC8gMjsKKworICAgIHN0cmVhbV9wdHIgPSAwOworICAgIHNraXBfYmxvY2tzID0gMDsKKyAgICBibG9ja3Nfd2lkZSA9IHMtPmF2Y3R4LT53aWR0aCAvIDQ7CisgICAgYmxvY2tzX2hpZ2ggPSBzLT5hdmN0eC0+aGVpZ2h0IC8gNDsKKyAgICB0b3RhbF9ibG9ja3MgPSBibG9ja3Nfd2lkZSAqIGJsb2Nrc19oaWdoOworICAgIGJsb2NrX2luYyA9IDQ7CisgICAgcm93X2RlYyA9IHN0cmlkZSArIDQ7CisKKyAgICBmb3IgKGJsb2NrX3kgPSBibG9ja3NfaGlnaDsgYmxvY2tfeSA+IDA7IGJsb2NrX3ktLSkgeworICAgICAgICBibG9ja19wdHIgPSAoKGJsb2NrX3kgKiA0KSAtIDEpICogc3RyaWRlOworICAgICAgICBmb3IgKGJsb2NrX3ggPSBibG9ja3Nfd2lkZTsgYmxvY2tfeCA+IDA7IGJsb2NrX3gtLSkgeworICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhpcyBibG9jayBzaG91bGQgYmUgc2tpcHBlZCAqLworICAgICAgICAgICAgaWYgKHNraXBfYmxvY2tzKSB7CisgICAgICAgICAgICAgICAgYmxvY2tfcHRyICs9IGJsb2NrX2luYzsKKyAgICAgICAgICAgICAgICBza2lwX2Jsb2Nrcy0tOworICAgICAgICAgICAgICAgIHRvdGFsX2Jsb2Nrcy0tOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwaXhlbF9wdHIgPSBibG9ja19wdHI7CisKKyAgICAgICAgICAgIC8qIGdldCB0aGUgbmV4dCB0d28gYnl0ZXMgaW4gdGhlIGVuY29kZWQgZGF0YSBzdHJlYW0gKi8KKyAgICAgICAgICAgIENIRUNLX1NUUkVBTV9QVFIoMik7CisgICAgICAgICAgICBieXRlX2EgPSBzLT5idWZbc3RyZWFtX3B0cisrXTsKKyAgICAgICAgICAgIGJ5dGVfYiA9IHMtPmJ1ZltzdHJlYW1fcHRyKytdOworCisgICAgICAgICAgICAvKiBjaGVjayBpZiB0aGUgZGVjb2RlIGlzIGZpbmlzaGVkICovCisgICAgICAgICAgICBpZiAoKGJ5dGVfYSA9PSAwKSAmJiAoYnl0ZV9iID09IDApICYmICh0b3RhbF9ibG9ja3MgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgaWYgKChieXRlX2IgJiAweEZDKSA9PSAweDg0KSB7CisgICAgICAgICAgICAgICAgLyogc2tpcCBjb2RlLCBidXQgZG9uJ3QgY291bnQgdGhlIGN1cnJlbnQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBza2lwX2Jsb2NrcyA9ICgoYnl0ZV9iIC0gMHg4NCkgPDwgOCkgKyBieXRlX2EgLSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlX2IgPCAweDgwKSB7CisgICAgICAgICAgICAgICAgLyogMi0gb3IgOC1jb2xvciBlbmNvZGluZyBtb2RlcyAqLworICAgICAgICAgICAgICAgIGZsYWdzID0gKGJ5dGVfYiA8PCA4KSB8IGJ5dGVfYTsKKworICAgICAgICAgICAgICAgIENIRUNLX1NUUkVBTV9QVFIoNCk7CisgICAgICAgICAgICAgICAgY29sb3JzWzBdID0gQVZfUkwxNigmcy0+YnVmW3N0cmVhbV9wdHJdKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1fcHRyICs9IDI7CisgICAgICAgICAgICAgICAgY29sb3JzWzFdID0gQVZfUkwxNigmcy0+YnVmW3N0cmVhbV9wdHJdKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1fcHRyICs9IDI7CisKKyAgICAgICAgICAgICAgICBpZiAoY29sb3JzWzBdICYgMHg4MDAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIDgtY29sb3IgZW5jb2RpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfU1RSRUFNX1BUUigxMik7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yc1syXSA9IEFWX1JMMTYoJnMtPmJ1ZltzdHJlYW1fcHRyXSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9wdHIgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgY29sb3JzWzNdID0gQVZfUkwxNigmcy0+YnVmW3N0cmVhbV9wdHJdKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3B0ciArPSAyOworICAgICAgICAgICAgICAgICAgICBjb2xvcnNbNF0gPSBBVl9STDE2KCZzLT5idWZbc3RyZWFtX3B0cl0pOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1fcHRyICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yc1s1XSA9IEFWX1JMMTYoJnMtPmJ1ZltzdHJlYW1fcHRyXSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9wdHIgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgY29sb3JzWzZdID0gQVZfUkwxNigmcy0+YnVmW3N0cmVhbV9wdHJdKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3B0ciArPSAyOworICAgICAgICAgICAgICAgICAgICBjb2xvcnNbN10gPSBBVl9STDE2KCZzLT5idWZbc3RyZWFtX3B0cl0pOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1fcHRyICs9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwaXhlbF95ID0gMDsgcGl4ZWxfeSA8IDQ7IHBpeGVsX3krKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwaXhlbF94ID0gMDsgcGl4ZWxfeCA8IDQ7IHBpeGVsX3grKywgZmxhZ3MgPj49IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3BpeGVsX3B0cisrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc1soKHBpeGVsX3kgJiAweDIpIDw8IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwaXhlbF94ICYgMHgyKSArICgoZmxhZ3MgJiAweDEpIF4gMSldOworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyIC09IHJvd19kZWM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiAyLWNvbG9yIGVuY29kaW5nICovCisgICAgICAgICAgICAgICAgICAgIGZvciAocGl4ZWxfeSA9IDA7IHBpeGVsX3kgPCA0OyBwaXhlbF95KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocGl4ZWxfeCA9IDA7IHBpeGVsX3ggPCA0OyBwaXhlbF94KyssIGZsYWdzID4+PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1twaXhlbF9wdHIrK10gPSBjb2xvcnNbKGZsYWdzICYgMHgxKSBeIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyIC09IHJvd19kZWM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSwgaXQncyBhIDEtY29sb3IgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBjb2xvcnNbMF0gPSAoYnl0ZV9iIDw8IDgpIHwgYnl0ZV9hOworCisgICAgICAgICAgICAgICAgZm9yIChwaXhlbF95ID0gMDsgcGl4ZWxfeSA8IDQ7IHBpeGVsX3krKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHBpeGVsX3ggPSAwOyBwaXhlbF94IDwgNDsgcGl4ZWxfeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3BpeGVsX3B0cisrXSA9IGNvbG9yc1swXTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyIC09IHJvd19kZWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBibG9ja19wdHIgKz0gYmxvY2tfaW5jOworICAgICAgICAgICAgdG90YWxfYmxvY2tzLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbXN2aWRlbzFfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBNc3ZpZGVvMUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBzLT5idWYgPSBidWY7CisgICAgcy0+c2l6ZSA9IGJ1Zl9zaXplOworCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHMtPm1vZGVfOGJpdCkgeworICAgICAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgTlVMTCk7CisKKyAgICAgICAgaWYgKHBhbCkgeworICAgICAgICAgICAgbWVtY3B5KHMtPnBhbCwgcGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgICAgICBzLT5mcmFtZS0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+bW9kZV84Yml0KQorICAgICAgICBtc3ZpZGVvMV9kZWNvZGVfOGJpdChzKTsKKyAgICBlbHNlCisgICAgICAgIG1zdmlkZW8xX2RlY29kZV8xNmJpdChzKTsKKworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9mcmFtZSAgICAgID0gMTsKKworICAgIC8qIHJlcG9ydCB0aGF0IHRoZSBidWZmZXIgd2FzIGNvbXBsZXRlbHkgY29uc3VtZWQgKi8KKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtc3ZpZGVvMV9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNc3ZpZGVvMUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbXN2aWRlbzFfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXN2aWRlbzEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNaWNyb3NvZnQgVmlkZW8gMSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NU1ZJREVPMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXN2aWRlbzFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBtc3ZpZGVvMV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBtc3ZpZGVvMV9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IG1zdmlkZW8xX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL21zdmlkZW8xZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9tc3ZpZGVvMWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNmNkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9tc3ZpZGVvMWVuYy5jCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogTWljcm9zb2Z0IFZpZGVvLTEgRW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTWljcm9zb2Z0IFZpZGVvLTEgZW5jb2RlcgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImVsYmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKy8qKgorICogRW5jb2RlciBjb250ZXh0CisgKi8KK3R5cGVkZWYgc3RydWN0IE1zdmlkZW8xRW5jQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWTEZHIHJuZDsKKyAgICB1aW50OF90ICpwcmV2OworCisgICAgaW50IGJsb2NrWzE2KjNdOworICAgIGludCBibG9jazJbMTYqM107CisgICAgaW50IGNvZGVib29rWzgqM107CisgICAgaW50IGNvZGVib29rMls4KjNdOworICAgIGludCBvdXRwdXRbMTYqM107CisgICAgaW50IG91dHB1dDJbMTYqM107CisgICAgaW50IGF2Z1szXTsKKyAgICBpbnQgYmVzdHBvczsKKyAgICBpbnQga2V5aW50OworfSBNc3ZpZGVvMUVuY0NvbnRleHQ7CisKK2VudW0gTVNWMU1vZGV7CisgICAgTU9ERV9TS0lQID0gMCwKKyAgICBNT0RFX0ZJTEwsCisgICAgTU9ERV8yQ09MLAorICAgIE1PREVfOENPTCwKK307CisKKyNkZWZpbmUgU0tJUF9QUkVGSVggMHg4NDAwCisjZGVmaW5lIFNLSVBTX01BWCAweDAzRkYKKyNkZWZpbmUgTUtSR0I1NTUoaW4sIG9mZikgKCgoaW4pW29mZl0gPDwgMTApIHwgKChpbilbKG9mZikgKyAxXSA8PCA1KSB8ICgoaW4pWyhvZmYpICsgMl0pKQorCitzdGF0aWMgY29uc3QgaW50IHJlbWFwWzE2XSA9IHsgMCwgMSwgNCwgNSwgMiwgMywgNiwgNywgOCwgOSwgMTIsIDEzLCAxMCwgMTEsIDE0LCAxNSB9OworCitzdGF0aWMgaW50IGVuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljdCwgaW50ICpnb3RfcGFja2V0KQoreworICAgIE1zdmlkZW8xRW5jQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEFWRnJhbWUgKnAgPSBwaWN0OworICAgIHVpbnQxNl90ICpzcmM7CisgICAgdWludDhfdCAqcHJldnB0cjsKKyAgICB1aW50OF90ICpkc3QsICpidWY7CisgICAgaW50IGtleWZyYW1lID0gMDsKKyAgICBpbnQgbm9fc2tpcHMgPSAxOworICAgIGludCBpLCBqLCBrLCB4LCB5LCByZXQ7CisgICAgaW50IHNraXBzID0gMDsKKyAgICBpbnQgcXVhbGl0eSA9IDI0OworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIGF2Y3R4LT53aWR0aCphdmN0eC0+aGVpZ2h0KjkgKyBGRl9NSU5fQlVGRkVSX1NJWkUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZHN0PSBidWY9IHBrdC0+ZGF0YTsKKworICAgIGlmKCFjLT5wcmV2KQorICAgICAgICBjLT5wcmV2ID0gYXZfbWFsbG9jKGF2Y3R4LT53aWR0aCAqIDMgKiAoYXZjdHgtPmhlaWdodCArIDMpKTsKKyAgICBwcmV2cHRyID0gYy0+cHJldiArIGF2Y3R4LT53aWR0aCAqIDMgKiAoRkZBTElHTihhdmN0eC0+aGVpZ2h0LCA0KSAtIDEpOworICAgIHNyYyA9ICh1aW50MTZfdCopKHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSooRkZBTElHTihhdmN0eC0+aGVpZ2h0LCA0KSAtIDEpKTsKKyAgICBpZihjLT5rZXlpbnQgPj0gYXZjdHgtPmtleWludF9taW4pCisgICAgICAgIGtleWZyYW1lID0gMTsKKworCisgICAgZm9yKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSArPSA0KXsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDQpeworICAgICAgICAgICAgaW50IGJlc3Rtb2RlID0gTU9ERV9TS0lQOworICAgICAgICAgICAgaW50IGJlc3RzY29yZSA9IElOVF9NQVg7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSAwOworICAgICAgICAgICAgaW50IHNjb3JlOworCisgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCA0OyBqKyspeworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHZhbCA9IHNyY1t4ICsgaSAtIGoqcC0+bGluZXNpemVbMF0vMl07CisgICAgICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IDM7IGsrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBjLT5ibG9ja1soaSArIGoqNCkqMyArIGtdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmJsb2NrMltyZW1hcFtpICsgaio0XSozICsga10gPSAodmFsID4+ICgxMC1rKjUpKSAmIDB4MUY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZigha2V5ZnJhbWUpeworICAgICAgICAgICAgICAgIGJlc3RzY29yZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgNDsgaisrKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNCozOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHQgPSBwcmV2cHRyW3gqMyArIGkgLSBqKjMqYXZjdHgtPndpZHRoXSAtIGMtPmJsb2NrW2kgKyBqKjQqM107CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0c2NvcmUgKz0gdCp0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJlc3RzY29yZSAvPSBxdWFsaXR5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgb3B0aW1hbCB2YWx1ZSB0byBmaWxsIHdob2xlIDR4NCBibG9jaworICAgICAgICAgICAgc2NvcmUgPSAwOworICAgICAgICAgICAgYXZwcml2X2luaXRfZWxiZyhjLT5ibG9jaywgMywgMTYsIGMtPmF2ZywgMSwgMSwgYy0+b3V0cHV0LCAmYy0+cm5kKTsKKyAgICAgICAgICAgIGF2cHJpdl9kb19lbGJnICAoYy0+YmxvY2ssIDMsIDE2LCBjLT5hdmcsIDEsIDEsIGMtPm91dHB1dCwgJmMtPnJuZCk7CisgICAgICAgICAgICBpZihjLT5hdmdbMF0gPT0gMSkgLy8gcmVkIGNvbXBvbmVudCA9IDEgd2lsbCBiZSB3cml0dGVuIGFzIHNraXAgY29kZQorICAgICAgICAgICAgICAgIGMtPmF2Z1swXSA9IDA7CisgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCA0OyBqKyspeworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IDM7IGsrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdCA9IGMtPmF2Z1trXSAtIGMtPmJsb2NrWyhpK2oqNCkqMytrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlICs9IHQqdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjb3JlIC89IHF1YWxpdHk7CisgICAgICAgICAgICBzY29yZSArPSAyOworICAgICAgICAgICAgaWYoc2NvcmUgPCBiZXN0c2NvcmUpeworICAgICAgICAgICAgICAgIGJlc3RzY29yZSA9IHNjb3JlOworICAgICAgICAgICAgICAgIGJlc3Rtb2RlID0gTU9ERV9GSUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2VhcmNoIGZvciBvcHRpbWFsIGZpbGxpbmcgb2YgMi1jb2xvciBibG9jaworICAgICAgICAgICAgc2NvcmUgPSAwOworICAgICAgICAgICAgYXZwcml2X2luaXRfZWxiZyhjLT5ibG9jaywgMywgMTYsIGMtPmNvZGVib29rLCAyLCAxLCBjLT5vdXRwdXQsICZjLT5ybmQpOworICAgICAgICAgICAgYXZwcml2X2RvX2VsYmcgIChjLT5ibG9jaywgMywgMTYsIGMtPmNvZGVib29rLCAyLCAxLCBjLT5vdXRwdXQsICZjLT5ybmQpOworICAgICAgICAgICAgLy8gbGFzdCBvdXRwdXQgdmFsdWUgc2hvdWxkIGJlIGFsd2F5cyAxLCBzd2FwIGNvZGVib29rcyBpZiBuZWVkZWQKKyAgICAgICAgICAgIGlmKCFjLT5vdXRwdXRbMTVdKXsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIEZGU1dBUCh1aW50OF90LCBjLT5jb2RlYm9va1tpXSwgYy0+Y29kZWJvb2tbaSszXSk7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYy0+b3V0cHV0W2ldIF49IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCA0OyBqKyspeworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IDM7IGsrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdCA9IGMtPmNvZGVib29rW2MtPm91dHB1dFtpK2oqNF0qMyArIGtdIC0gYy0+YmxvY2tbaSozK2sraio0KjNdOworICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gdCp0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NvcmUgLz0gcXVhbGl0eTsKKyAgICAgICAgICAgIHNjb3JlICs9IDY7CisgICAgICAgICAgICBpZihzY29yZSA8IGJlc3RzY29yZSl7CisgICAgICAgICAgICAgICAgYmVzdHNjb3JlID0gc2NvcmU7CisgICAgICAgICAgICAgICAgYmVzdG1vZGUgPSBNT0RFXzJDT0w7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzZWFyY2ggZm9yIG9wdGltYWwgZmlsbGluZyBvZiAyLWNvbG9yIDJ4MiBzdWJibG9ja3MKKyAgICAgICAgICAgIHNjb3JlID0gMDsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKyl7CisgICAgICAgICAgICAgICAgYXZwcml2X2luaXRfZWxiZyhjLT5ibG9jazIgKyBpKjQqMywgMywgNCwgYy0+Y29kZWJvb2syICsgaSoyKjMsIDIsIDEsIGMtPm91dHB1dDIgKyBpKjQsICZjLT5ybmQpOworICAgICAgICAgICAgICAgIGF2cHJpdl9kb19lbGJnICAoYy0+YmxvY2syICsgaSo0KjMsIDMsIDQsIGMtPmNvZGVib29rMiArIGkqMiozLCAyLCAxLCBjLT5vdXRwdXQyICsgaSo0LCAmYy0+cm5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGxhc3QgdmFsdWUgc2hvdWxkIGJlIGFsd2F5cyAxLCBzd2FwIGNvZGVib29rcyBpZiBuZWVkZWQKKyAgICAgICAgICAgIGlmKCFjLT5vdXRwdXQyWzE1XSl7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgICAgICBGRlNXQVAodWludDhfdCwgYy0+Y29kZWJvb2syW2krMThdLCBjLT5jb2RlYm9vazJbaSsyMV0pOworICAgICAgICAgICAgICAgIGZvcihpID0gMTI7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjLT5vdXRwdXQyW2ldIF49IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCA0OyBqKyspeworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IDM7IGsrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdCA9IGMtPmNvZGVib29rMlsoYy0+b3V0cHV0MltyZW1hcFtpK2oqNF1dICsgKGkmMikgKyAoaiYyKSoyKSozK2tdIC0gYy0+YmxvY2tbaSozK2sgKyBqKjQqM107CisgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSArPSB0KnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY29yZSAvPSBxdWFsaXR5OworICAgICAgICAgICAgc2NvcmUgKz0gMTg7CisgICAgICAgICAgICBpZihzY29yZSA8IGJlc3RzY29yZSl7CisgICAgICAgICAgICAgICAgYmVzdHNjb3JlID0gc2NvcmU7CisgICAgICAgICAgICAgICAgYmVzdG1vZGUgPSBNT0RFXzhDT0w7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGJlc3Rtb2RlID09IE1PREVfU0tJUCl7CisgICAgICAgICAgICAgICAgc2tpcHMrKzsKKyAgICAgICAgICAgICAgICBub19za2lwcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZigoYmVzdG1vZGUgIT0gTU9ERV9TS0lQICYmIHNraXBzKSB8fCBza2lwcyA9PSBTS0lQU19NQVgpeworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmRzdCwgc2tpcHMgfCBTS0lQX1BSRUZJWCk7CisgICAgICAgICAgICAgICAgc2tpcHMgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2goYmVzdG1vZGUpeworICAgICAgICAgICAgY2FzZSBNT0RFX0ZJTEw6CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmZHN0LCBNS1JHQjU1NShjLT5hdmcsMCkgfCAweDgwMDApOworICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgMzsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZwdHJbeCozICsgaSozICsgayAtIGoqMyphdmN0eC0+d2lkdGhdID0gYy0+YXZnW2tdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNT0RFXzJDT0w6CisgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgNDsgaisrKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IChjLT5vdXRwdXRbaSArIGoqNF1eMSkgPDwgKGkgKyBqKjQpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgMzsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZwdHJbeCozICsgaSozICsgayAtIGoqMyphdmN0eC0+d2lkdGhdID0gYy0+Y29kZWJvb2tbYy0+b3V0cHV0W2kgKyBqKjRdKjMgKyBrXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZkc3QsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZkc3QsIE1LUkdCNTU1KGMtPmNvZGVib29rLCAwKSk7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmZHN0LCBNS1JHQjU1NShjLT5jb2RlYm9vaywgMykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNT0RFXzhDT0w6CisgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgNDsgaisrKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IChjLT5vdXRwdXQyW3JlbWFwW2kgKyBqKjRdXV4xKSA8PCAoaSArIGoqNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCAzOyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldnB0clt4KjMgKyBpKjMgKyBrIC0gaiozKmF2Y3R4LT53aWR0aF0gPSBjLT5jb2RlYm9vazJbKGMtPm91dHB1dDJbcmVtYXBbaStqKjRdXSArIChpJjIpICsgKGomMikqMikqMyArIGtdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmRzdCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmRzdCwgTUtSR0I1NTUoYy0+Y29kZWJvb2syLCAwKSB8IDB4ODAwMCk7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAzOyBpIDwgMjQ7IGkgKz0gMykKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmZHN0LCBNS1JHQjU1NShjLT5jb2RlYm9vazIsIGkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcmMgICAgIC09IHAtPmxpbmVzaXplWzBdIDw8IDE7CisgICAgICAgIHByZXZwdHIgLT0gYXZjdHgtPndpZHRoICogMyAqIDQ7CisgICAgfQorICAgIGlmKHNraXBzKQorICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZkc3QsIHNraXBzIHwgU0tJUF9QUkVGSVgpOworICAgIC8vRU9GCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmZHN0LCAwKTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZkc3QsIDApOworCisgICAgaWYobm9fc2tpcHMpCisgICAgICAgIGtleWZyYW1lID0gMTsKKyAgICBpZihrZXlmcmFtZSkKKyAgICAgICAgYy0+a2V5aW50ID0gMDsKKyAgICBlbHNlCisgICAgICAgIGMtPmtleWludCsrOworICAgIGlmIChrZXlmcmFtZSkgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgcGt0LT5zaXplID0gZHN0IC0gYnVmOworICAgICpnb3RfcGFja2V0ID0gMTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogaW5pdCBlbmNvZGVyCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTXN2aWRlbzFFbmNDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBjLT5hdmN0eCA9IGF2Y3R4OworICAgIGlmIChhdl9pbWFnZV9jaGVja19zaXplKGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgMCwgYXZjdHgpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmKChhdmN0eC0+d2lkdGgmMykgfHwgKGF2Y3R4LT5oZWlnaHQmMykpeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIndpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTY7CisKKyAgICBjLT5rZXlpbnQgPSBhdmN0eC0+a2V5aW50X21pbjsKKyAgICBhdl9sZmdfaW5pdCgmYy0+cm5kLCAxKTsKKworICAgIHJldHVybiAwOworfQorCisKKworLyoqCisgKiBVbmluaXQgZW5jb2RlcgorICovCitzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTXN2aWRlbzFFbmNDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmYy0+cHJldik7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9tc3ZpZGVvMV9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtc3ZpZGVvMSIsCisgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNaWNyb3NvZnQgVmlkZW8tMSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NU1ZJREVPMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXN2aWRlbzFFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBlbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBlbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZW5jb2RlX2VuZCwKKyAgICAucGl4X2ZtdHMgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pe0FWX1BJWF9GTVRfUkdCNTU1LCBBVl9QSVhfRk1UX05PTkV9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL212Y2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbXZjZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmMGVlMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL212Y2RlYy5jCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogU2lsaWNvbiBHcmFwaGljcyBNb3Rpb24gVmlkZW8gQ29tcHJlc3NvciAxICYgMiBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGV0ZXIgUm9zcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTaWxpY29uIEdyYXBoaWNzIE1vdGlvbiBWaWRlbyBDb21wcmVzc29yIDEgJiAyIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBNdmNDb250ZXh0IHsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBpbnQgdmZsaXA7Cit9IE12Y0NvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBtdmNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE12Y0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCB3aWR0aCAgICAgPSBhdmN0eC0+d2lkdGg7CisgICAgaW50IGhlaWdodCAgICA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVZDMSkgeworICAgICAgICB3aWR0aCAgKz0gMzsKKyAgICAgICAgaGVpZ2h0ICs9IDM7CisgICAgfQorICAgIHdpZHRoICAmPSB+MzsKKyAgICBoZWlnaHQgJj0gfjM7CisgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgd2lkdGgsIGhlaWdodCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NVkMxKSA/IEFWX1BJWF9GTVRfUkdCNTU1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZfUElYX0ZNVF9SR0IzMjsKKyAgICBzLT5mcmFtZSAgICAgICA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPnZmbGlwID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDkgJiYKKyAgICAgICAgICAgICAgICFtZW1jbXAoYXZjdHgtPmV4dHJhZGF0YSArIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAtIDksICJCb3R0b21VcCIsIDkpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9tdmMxKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgR2V0Qnl0ZUNvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3Rfc3RhcnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxpbmVzaXplKQoreworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICB1aW50MTZfdCB2WzhdOworICAgIGludCBtYXNrLCB4LCB5LCBpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSA0KSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCArPSA0KSB7CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIDwgNikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgbWFzayA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dShnYik7CisgICAgICAgICAgICB2WzBdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KGdiKTsKKyAgICAgICAgICAgIHZbMV0gPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoZ2IpOworICAgICAgICAgICAgaWYgKCh2WzBdICYgMHg4MDAwKSkgeworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCAxMikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiYnVmZmVyIG92ZXJmbG93XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDI7IGkgPCA4OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHZbaV0gPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoZ2IpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2WzJdID0gdls0XSA9IHZbNl0gPSB2WzBdOworICAgICAgICAgICAgICAgIHZbM10gPSB2WzVdID0gdls3XSA9IHZbMV07CisgICAgICAgICAgICB9CisKKyNkZWZpbmUgUElYMTYodGFyZ2V0LCB0cnVlLCBmYWxzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpID0gKG1hc2sgJiB0YXJnZXQpID8gdHJ1ZSA6IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBVl9XTjE2QShkc3QsIHZbaV0gJiAweDdGRkYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gMjsKKworI2RlZmluZSBST1cxNihyb3csIGExLCBhMCwgYjEsIGIwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdCA9IGRzdF9zdGFydCArICh5ICsgcm93KSAqIGxpbmVzaXplICsgeCAqIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBJWDE2KDEgPDwgKHJvdyAqIDQpLCBhMSwgYTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBJWDE2KDEgPDwgKHJvdyAqIDQgKyAxKSwgYTEsIGEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBJWDE2KDEgPDwgKHJvdyAqIDQgKyAyKSwgYjEsIGIwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBJWDE2KDEgPDwgKHJvdyAqIDQgKyAzKSwgYjEsIGIwKQorCisgICAgICAgICAgICBST1cxNigwLCAwLCAxLCAyLCAzKTsKKyAgICAgICAgICAgIFJPVzE2KDEsIDAsIDEsIDIsIDMpOworICAgICAgICAgICAgUk9XMTYoMiwgNCwgNSwgNiwgNyk7CisgICAgICAgICAgICBST1cxNigzLCA0LCA1LCA2LCA3KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0XzR4NF9ibG9jayh1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSwgdWludDMyX3QgcGl4ZWwpCit7CisgICAgaW50IGksIGo7CisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIEFWX1dOMzJBKGRzdCArIGogKiBsaW5lc2l6ZSArIGkgKiA0LCBwaXhlbCk7Cit9CisKKyNkZWZpbmUgUElYMzIodGFyZ2V0LCB0cnVlLCBmYWxzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBVl9XTjMyQShkc3QsIChtYXNrICYgdGFyZ2V0KSA/IHZbdHJ1ZV0gOiB2W2ZhbHNlXSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gNDsKKworI2RlZmluZSBST1czMihyb3csIGExLCBhMCwgYjEsIGIwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdCA9IGRzdF9zdGFydCArICh5ICsgcm93KSAqIGxpbmVzaXplICsgeCAqIDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBJWDMyKDEgPDwgKHJvdyAqIDQpLCBhMSwgYTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBJWDMyKDEgPDwgKHJvdyAqIDQgKyAxKSwgYTEsIGEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBJWDMyKDEgPDwgKHJvdyAqIDQgKyAyKSwgYjEsIGIwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBJWDMyKDEgPDwgKHJvdyAqIDQgKyAzKSwgYjEsIGIwKQorCisjZGVmaW5lIE1WQzJfQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUk9XMzIoMCwgMSwgMCwgMywgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUk9XMzIoMSwgMSwgMCwgMywgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUk9XMzIoMiwgNSwgNCwgNywgNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUk9XMzIoMywgNSwgNCwgNywgNik7CisKK3N0YXRpYyBpbnQgZGVjb2RlX212YzIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCeXRlQ29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdF9zdGFydCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZXNpemUsIGludCB2ZmxpcCkKK3sKKyAgICB1aW50OF90ICpkc3Q7CisgICAgdWludDMyX3QgY29sb3JbMTI4XSwgdls4XTsKKyAgICBpbnQgdywgaCwgbmJfY29sb3JzLCBpLCB4LCB5LCBwMCwgcDEsIG1hc2s7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIDwgNikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB3ID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KGdiKTsKKyAgICBoID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KGdiKTsKKyAgICBpZiAoKHcgJiB+MykgIT0gd2lkdGggfHwgKGggJiB+MykgIT0gaGVpZ2h0KQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZGltZW5zaW9uIG1pc21hdGNoXG4iKTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXUoZ2IpKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgImJpdG1hcCBmZWF0dXJlIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBuYl9jb2xvcnMgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoZ2IpOworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCBuYl9jb2xvcnMgKiAzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZNSU4obmJfY29sb3JzLCAxMjgpOyBpKyspCisgICAgICAgIGNvbG9yW2ldID0gMHhGRjAwMDAwMCB8IGJ5dGVzdHJlYW0yX2dldF9iZTI0dShnYik7CisgICAgaWYgKG5iX2NvbG9ycyA+IDEyOCkKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgKG5iX2NvbG9ycyAtIDEyOCkgKiAzKTsKKworICAgIGlmICh2ZmxpcCkgeworICAgICAgICBkc3Rfc3RhcnQgKz0gKGhlaWdodCAtIDEpICogbGluZXNpemU7CisgICAgICAgIGxpbmVzaXplICAgPSAtbGluZXNpemU7CisgICAgfQorICAgIHggPSB5ID0gMDsKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID49IDEpIHsKKyAgICAgICAgcDAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoZ2IpOworICAgICAgICBpZiAoKHAwICYgMHg4MCkpIHsKKyAgICAgICAgICAgIGlmICgocDAgJiAweDQwKSkgeworICAgICAgICAgICAgICAgIHAwICY9IDB4M0Y7CisgICAgICAgICAgICAgICAgcDAgID0gKHAwIDw8IDIpIHwgKHAwID4+IDQpOworICAgICAgICAgICAgICAgIHNldF80eDRfYmxvY2soZHN0X3N0YXJ0ICsgeSAqIGxpbmVzaXplICsgeCAqIDQsIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRjAwMDAwMCB8IChwMCA8PCAxNikgfCAocDAgPDwgOCkgfCBwMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBnLCByOworICAgICAgICAgICAgICAgIHAwICY9IDB4M0Y7CisgICAgICAgICAgICAgICAgcDAgID0gKHAwIDw8IDIpIHwgKHAwID4+IDQpOworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCAyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KGdiKTsKKyAgICAgICAgICAgICAgICByID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KGdiKTsKKyAgICAgICAgICAgICAgICBzZXRfNHg0X2Jsb2NrKGRzdF9zdGFydCArIHkgKiBsaW5lc2l6ZSArIHggKiA0LCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYwMDAwMDAgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IHAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCAxKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgcDEgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoZ2IpOworICAgICAgICAgICAgaWYgKChwMSAmIDB4ODApKSB7CisgICAgICAgICAgICAgICAgaWYgKChwMCAmIDB4N0YpID09IChwMSAmIDB4N0YpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldF80eDRfYmxvY2soZHN0X3N0YXJ0ICsgeSAqIGxpbmVzaXplICsgeCAqIDQsIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yW3AwICYgMHg3Rl0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCAyKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIHZbMF0gPSB2WzJdID0gdls0XSA9IHZbNl0gPSBjb2xvcltwMCAmIDB4N0ZdOworICAgICAgICAgICAgICAgICAgICB2WzFdID0gdlszXSA9IHZbNV0gPSB2WzddID0gY29sb3JbcDEgJiAweDdGXTsKKyAgICAgICAgICAgICAgICAgICAgbWFzayA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dShnYik7CisgICAgICAgICAgICAgICAgICAgIE1WQzJfQkxPQ0sKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCA4KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB2WzBdID0gY29sb3JbcDAgJiAweDdGXTsKKyAgICAgICAgICAgICAgICB2WzFdID0gY29sb3JbcDEgJiAweDdGXTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgICAgICAgICB2W2ldID0gY29sb3JbYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KGdiKSAmIDB4N0ZdOworICAgICAgICAgICAgICAgIG1hc2sgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoZ2IpOworICAgICAgICAgICAgICAgIE1WQzJfQkxPQ0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHggKz0gNDsKKyAgICAgICAgaWYgKHggPj0gd2lkdGgpIHsKKyAgICAgICAgICAgIHkgKz0gNDsKKyAgICAgICAgICAgIGlmICh5ID49IGhlaWdodCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHggPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12Y19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgTXZjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVZDMSkKKyAgICAgICAgcmV0ID0gZGVjb2RlX212YzEoYXZjdHgsICZnYiwgcy0+ZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IGRlY29kZV9tdmMyKGF2Y3R4LCAmZ2IsIHMtPmZyYW1lLT5kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIHMtPmZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dmZsaXApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtdmNfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTXZjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19NVkMxX0RFQ09ERVIKK0FWQ29kZWMgZmZfbXZjMV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtdmMxIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2lsaWNvbiBHcmFwaGljcyBNb3Rpb24gVmlkZW8gQ29tcHJlc3NvciAxIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01WQzEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE12Y0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IG12Y19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBtdmNfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBtdmNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfTVZDMl9ERUNPREVSCitBVkNvZGVjIGZmX212YzJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXZjMiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNpbGljb24gR3JhcGhpY3MgTW90aW9uIFZpZGVvIENvbXByZXNzb3IgMiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NVkMyLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNdmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBtdmNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gbXZjX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gbXZjX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbXhwZWdkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL214cGVnZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkNDc2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL214cGVnZGVjLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBNeFBFRyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQW5hdG9seSBOZW5hc2hldgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisKKy8qKgorICogQGZpbGUKKyAqIE14UEVHIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtanBlZy5oIgorI2luY2x1ZGUgIm1qcGVnZGVjLmgiCisKK3R5cGVkZWYgc3RydWN0IE1YcGVnRGVjb2RlQ29udGV4dCB7CisgICAgTUpwZWdEZWNvZGVDb250ZXh0IGpwZzsKKyAgICBBVkZyYW1lICpwaWN0dXJlWzJdOyAvKiBwaWN0dXJlcyBhcnJheSAqLworICAgIGludCBwaWN0dXJlX2luZGV4OyAvKiBpbmRleCBvZiBjdXJyZW50IHBpY3R1cmUgKi8KKyAgICBpbnQgZ290X3NvZl9kYXRhOyAvKiB0cnVlIGlmIFNPRiBkYXRhIHN1Y2Nlc3NmdWxseSBwYXJzZWQgKi8KKyAgICBpbnQgZ290X214bV9iaXRtYXNrOyAvKiB0cnVlIGlmIE1YTSBiaXRtYXNrIGF2YWlsYWJsZSAqLworICAgIHVpbnQ4X3QgKm14bV9iaXRtYXNrOyAvKiBiaXRtYXNrIGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGJpdG1hc2tfc2l6ZTsgLyogc2l6ZSBvZiBiaXRtYXNrICovCisgICAgaW50IGhhc19jb21wbGV0ZV9mcmFtZTsgLyogdHJ1ZSBpZiBoYXMgY29tcGxldGUgZnJhbWUgKi8KKyAgICB1aW50OF90ICpjb21wbGV0aW9uX2JpdG1hc2s7IC8qIGNvbXBsZXRpb24gYml0bWFzayBvZiBtYWNyb2Jsb2NrcyAqLworICAgIHVuc2lnbmVkIG1iX3dpZHRoLCBtYl9oZWlnaHQ7IC8qIHNpemUgb2YgcGljdHVyZSBpbiBNQidzIGZyb20gTVhNIGhlYWRlciAqLworfSBNWHBlZ0RlY29kZUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBteHBlZ19kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNWHBlZ0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1KcGVnRGVjb2RlQ29udGV4dCAqanBnID0gJnMtPmpwZzsKKyAgICBpbnQgaTsKKworICAgIGpwZy0+cGljdHVyZV9wdHIgPSBOVUxMOworICAgIGZmX21qcGVnX2RlY29kZV9lbmQoYXZjdHgpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+cGljdHVyZVtpXSk7CisKKyAgICBzLT5iaXRtYXNrX3NpemUgPSAwOworICAgIGF2X2ZyZWVwKCZzLT5teG1fYml0bWFzayk7CisgICAgYXZfZnJlZXAoJnMtPmNvbXBsZXRpb25fYml0bWFzayk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG14cGVnX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNWHBlZ0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+cGljdHVyZVswXSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgcy0+cGljdHVyZVsxXSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5waWN0dXJlWzBdIHx8ICFzLT5waWN0dXJlWzFdKSB7CisgICAgICAgIG14cGVnX2RlY29kZV9lbmQoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHMtPmpwZy5waWN0dXJlX3B0ciAgICAgID0gcy0+cGljdHVyZVswXTsKKyAgICByZXR1cm4gZmZfbWpwZWdfZGVjb2RlX2luaXQoYXZjdHgpOworfQorCitzdGF0aWMgaW50IG14cGVnX2RlY29kZV9hcHAoTVhwZWdEZWNvZGVDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9wdHIsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgbGVuOworICAgIGlmIChidWZfc2l6ZSA8IDIpCisgICAgICAgIHJldHVybiAwOworICAgIGxlbiA9IEFWX1JCMTYoYnVmX3B0cik7CisgICAgc2tpcF9iaXRzKCZzLT5qcGcuZ2IsIDgqRkZNSU4obGVuLGJ1Zl9zaXplKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteHBlZ19kZWNvZGVfbXhtKE1YcGVnRGVjb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZfcHRyLCBpbnQgYnVmX3NpemUpCit7CisgICAgdW5zaWduZWQgYml0bWFza19zaXplLCBtYl9jb3VudDsKKyAgICBpbnQgaTsKKworICAgIHMtPm1iX3dpZHRoICA9IEFWX1JMMTYoYnVmX3B0cis0KTsKKyAgICBzLT5tYl9oZWlnaHQgPSBBVl9STDE2KGJ1Zl9wdHIrNik7CisgICAgbWJfY291bnQgPSBzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodDsKKworICAgIGJpdG1hc2tfc2l6ZSA9IChtYl9jb3VudCArIDcpID4+IDM7CisgICAgaWYgKGJpdG1hc2tfc2l6ZSA+IGJ1Zl9zaXplIC0gMTIpIHsKKyAgICAgICAgYXZfbG9nKHMtPmpwZy5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk1YTSBiaXRtYXNrIGlzIG5vdCBjb21wbGV0ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKHMtPmJpdG1hc2tfc2l6ZSAhPSBiaXRtYXNrX3NpemUpIHsKKyAgICAgICAgcy0+Yml0bWFza19zaXplID0gMDsKKyAgICAgICAgYXZfZnJlZXAoJnMtPm14bV9iaXRtYXNrKTsKKyAgICAgICAgcy0+bXhtX2JpdG1hc2sgPSBhdl9tYWxsb2MoYml0bWFza19zaXplKTsKKyAgICAgICAgaWYgKCFzLT5teG1fYml0bWFzaykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmpwZy5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJNWE0gYml0bWFzayBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgYXZfZnJlZXAoJnMtPmNvbXBsZXRpb25fYml0bWFzayk7CisgICAgICAgIHMtPmNvbXBsZXRpb25fYml0bWFzayA9IGF2X21hbGxvY3ooYml0bWFza19zaXplKTsKKyAgICAgICAgaWYgKCFzLT5jb21wbGV0aW9uX2JpdG1hc2spIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5qcGcuYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ29tcGxldGlvbiBiaXRtYXNrIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBzLT5iaXRtYXNrX3NpemUgPSBiaXRtYXNrX3NpemU7CisgICAgfQorCisgICAgbWVtY3B5KHMtPm14bV9iaXRtYXNrLCBidWZfcHRyICsgMTIsIGJpdG1hc2tfc2l6ZSk7CisgICAgcy0+Z290X214bV9iaXRtYXNrID0gMTsKKworICAgIGlmICghcy0+aGFzX2NvbXBsZXRlX2ZyYW1lKSB7CisgICAgICAgIHVpbnQ4X3QgY29tcGxldGlvbl9jaGVjayA9IDB4RkY7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiaXRtYXNrX3NpemU7ICsraSkgeworICAgICAgICAgICAgcy0+Y29tcGxldGlvbl9iaXRtYXNrW2ldIHw9IHMtPm14bV9iaXRtYXNrW2ldOworICAgICAgICAgICAgY29tcGxldGlvbl9jaGVjayAmPSBzLT5jb21wbGV0aW9uX2JpdG1hc2tbaV07CisgICAgICAgIH0KKyAgICAgICAgcy0+aGFzX2NvbXBsZXRlX2ZyYW1lID0gIShjb21wbGV0aW9uX2NoZWNrIF4gMHhGRik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhwZWdfZGVjb2RlX2NvbShNWHBlZ0RlY29kZUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmX3B0ciwgaW50IGJ1Zl9zaXplKQoreworICAgIGludCBsZW4sIHJldCA9IDA7CisgICAgaWYgKGJ1Zl9zaXplIDwgMikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbGVuID0gQVZfUkIxNihidWZfcHRyKTsKKyAgICBpZiAobGVuID4gMTQgJiYgbGVuIDw9IGJ1Zl9zaXplICYmICFzdHJuY21wKGJ1Zl9wdHIgKyAyLCAiTVhNIiwgMykpIHsKKyAgICAgICAgcmV0ID0gbXhwZWdfZGVjb2RlX214bShzLCBidWZfcHRyICsgMiwgbGVuIC0gMik7CisgICAgfQorICAgIHNraXBfYml0cygmcy0+anBnLmdiLCA4KkZGTUlOKGxlbixidWZfc2l6ZSkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteHBlZ19jaGVja19kaW1lbnNpb25zKE1YcGVnRGVjb2RlQ29udGV4dCAqcywgTUpwZWdEZWNvZGVDb250ZXh0ICpqcGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqcmVmZXJlbmNlX3B0cikKK3sKKyAgICBpZiAoKGpwZy0+d2lkdGggKyAweDBGKT4+NCAhPSBzLT5tYl93aWR0aCB8fAorICAgICAgICAoanBnLT5oZWlnaHQgKyAweDBGKT4+NCAhPSBzLT5tYl9oZWlnaHQpIHsKKyAgICAgICAgYXZfbG9nKGpwZy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJQaWN0dXJlIGRpbWVuc2lvbnMgc3RvcmVkIGluIFNPRiBhbmQgTVhNIG1pc21hdGNoXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAocmVmZXJlbmNlX3B0ci0+ZGF0YVswXSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9DT01QT05FTlRTOyArK2kpIHsKKyAgICAgICAgICAgIGlmICggKCFyZWZlcmVuY2VfcHRyLT5kYXRhW2ldIF4gIWpwZy0+cGljdHVyZV9wdHItPmRhdGFbaV0pIHx8CisgICAgICAgICAgICAgICAgIHJlZmVyZW5jZV9wdHItPmxpbmVzaXplW2ldICE9IGpwZy0+cGljdHVyZV9wdHItPmxpbmVzaXplW2ldKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGpwZy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkRpbWVuc2lvbnMgb2YgY3VycmVudCBhbmQgcmVmZXJlbmNlIHBpY3R1cmUgbWlzbWF0Y2hcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteHBlZ19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIE1YcGVnRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTUpwZWdEZWNvZGVDb250ZXh0ICpqcGcgPSAmcy0+anBnOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQsICpidWZfcHRyOworICAgIGNvbnN0IHVpbnQ4X3QgKnVuZXNjYXBlZF9idWZfcHRyOworICAgIGludCB1bmVzY2FwZWRfYnVmX3NpemU7CisgICAgaW50IHN0YXJ0X2NvZGU7CisgICAgaW50IHJldDsKKworICAgIGJ1Zl9wdHIgPSBidWY7CisgICAgYnVmX2VuZCA9IGJ1ZiArIGJ1Zl9zaXplOworICAgIGpwZy0+Z290X3BpY3R1cmUgPSAwOworICAgIHMtPmdvdF9teG1fYml0bWFzayA9IDA7CisgICAgd2hpbGUgKGJ1Zl9wdHIgPCBidWZfZW5kKSB7CisgICAgICAgIHN0YXJ0X2NvZGUgPSBmZl9tanBlZ19maW5kX21hcmtlcihqcGcsICZidWZfcHRyLCBidWZfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVuZXNjYXBlZF9idWZfcHRyLCAmdW5lc2NhcGVkX2J1Zl9zaXplKTsKKyAgICAgICAgaWYgKHN0YXJ0X2NvZGUgPCAwKQorICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgICAgICB7CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZqcGctPmdiLCB1bmVzY2FwZWRfYnVmX3B0ciwgdW5lc2NhcGVkX2J1Zl9zaXplKjgpOworCisgICAgICAgICAgICBpZiAoc3RhcnRfY29kZSA+PSBBUFAwICYmIHN0YXJ0X2NvZGUgPD0gQVBQMTUpIHsKKyAgICAgICAgICAgICAgICBteHBlZ19kZWNvZGVfYXBwKHMsIHVuZXNjYXBlZF9idWZfcHRyLCB1bmVzY2FwZWRfYnVmX3NpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHN0YXJ0X2NvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgU09JOgorICAgICAgICAgICAgICAgIGlmIChqcGctPmdvdF9waWN0dXJlKSAvL2VtdWxhdGluZyBFT0kKKyAgICAgICAgICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFT0k6CisgICAgICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgICAgICAgICAgY2FzZSBEUVQ6CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfbWpwZWdfZGVjb2RlX2RxdChqcGcpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInF1YW50aXphdGlvbiB0YWJsZSBkZWNvZGUgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREhUOgorICAgICAgICAgICAgICAgIHJldCA9IGZmX21qcGVnX2RlY29kZV9kaHQoanBnKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJodWZmbWFuIHRhYmxlIGRlY29kZSBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT006CisgICAgICAgICAgICAgICAgcmV0ID0gbXhwZWdfZGVjb2RlX2NvbShzLCB1bmVzY2FwZWRfYnVmX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlZF9idWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNPRjA6CisgICAgICAgICAgICAgICAgcy0+Z290X3NvZl9kYXRhID0gMDsKKyAgICAgICAgICAgICAgICByZXQgPSBmZl9tanBlZ19kZWNvZGVfc29mKGpwZyk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU09GIGRhdGEgZGVjb2RlIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGpwZy0+aW50ZXJsYWNlZCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcmxhY2VkIG1vZGUgbm90IHN1cHBvcnRlZCBpbiBNeFBFR1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPmdvdF9zb2ZfZGF0YSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNPUzoKKyAgICAgICAgICAgICAgICBpZiAoIXMtPmdvdF9zb2ZfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbiBub3QgcHJvY2VzcyBTT1Mgd2l0aG91dCBTT0YgZGF0YSwgc2tpcHBpbmdcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFqcGctPmdvdF9waWN0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChqcGctPmZpcnN0X3BpY3R1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpcnN0IHBpY3R1cmUgaGFzIG5vIFNPRiwgc2tpcHBpbmdcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzLT5nb3RfbXhtX2JpdG1hc2speworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLWtleSBmcmFtZSBoYXMgbm8gTVhNLCBza2lwcGluZ1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiB1c2Ugc3RvcmVkIFNPRiBkYXRhIHRvIGFsbG9jYXRlIGN1cnJlbnQgcGljdHVyZSAqLworICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihqcGctPnBpY3R1cmVfcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBqcGctPnBpY3R1cmVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRikpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIGpwZy0+cGljdHVyZV9wdHItPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICAgICAgICAgICAgICBqcGctPnBpY3R1cmVfcHRyLT5rZXlfZnJhbWUgPSAwOworICAgICAgICAgICAgICAgICAgICBqcGctPmdvdF9waWN0dXJlID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBqcGctPnBpY3R1cmVfcHRyLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgICAgICAgICAgICAganBnLT5waWN0dXJlX3B0ci0+a2V5X2ZyYW1lID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocy0+Z290X214bV9iaXRtYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKnJlZmVyZW5jZV9wdHIgPSBzLT5waWN0dXJlW3MtPnBpY3R1cmVfaW5kZXggXiAxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG14cGVnX2NoZWNrX2RpbWVuc2lvbnMocywganBnLCByZWZlcmVuY2VfcHRyKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBkdW1teSByZWZlcmVuY2UgcGljdHVyZSBpZiBuZWVkZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWZlcmVuY2VfcHRyLT5kYXRhWzBdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcmVmZXJlbmNlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAgICAgICAgIHJldCA9IGZmX21qcGVnX2RlY29kZV9zb3MoanBnLCBzLT5teG1fYml0bWFzaywgcy0+Yml0bWFza19zaXplLCByZWZlcmVuY2VfcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmZfbWpwZWdfZGVjb2RlX3NvcyhqcGcsIE5VTEwsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCAmJiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmX3B0ciArPSAoZ2V0X2JpdHNfY291bnQoJmpwZy0+Z2IpKzcpID4+IDM7CisgICAgICAgIH0KKworICAgIH0KKwordGhlX2VuZDoKKyAgICBpZiAoanBnLT5nb3RfcGljdHVyZSkgeworICAgICAgICBpbnQgcmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIGpwZy0+cGljdHVyZV9wdHIpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgICAgIHMtPnBpY3R1cmVfaW5kZXggXj0gMTsKKyAgICAgICAganBnLT5waWN0dXJlX3B0ciA9IHMtPnBpY3R1cmVbcy0+cGljdHVyZV9pbmRleF07CisKKyAgICAgICAgaWYgKCFzLT5oYXNfY29tcGxldGVfZnJhbWUpIHsKKyAgICAgICAgICAgIGlmICghcy0+Z290X214bV9iaXRtYXNrKQorICAgICAgICAgICAgICAgIHMtPmhhc19jb21wbGV0ZV9mcmFtZSA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKmdvdF9mcmFtZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYnVmX3B0ciAtIGJ1ZjsKK30KKworQVZDb2RlYyBmZl9teHBlZ19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJteHBlZyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1vYm90aXggTXhQRUcgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVhQRUcsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1YcGVnRGVjb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbXhwZWdfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gbXhwZWdfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBteHBlZ19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAubWF4X2xvd3JlcyAgICAgPSAzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL25lbGx5bW9zZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL25lbGx5bW9zZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQwYzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbmVsbHltb3Nlci5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29tbW9uIGNvZGUgYmV0d2VlbiBOZWxseW1vc2VyIGVuY29kZXIgYW5kIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBhODQwYmRhNTg3MGJhMTFmMTk2OThmZjZlYjk1ODFkZmIwZjk1ZmE1LAorICogICAgICAgICAgICAgICAgICAgIDUzOTQ1OWFlYjdkNDI1MTQwYjYyYTNlYzdkYmY2ZGM4ZTQwOGEzMDYsIGFuZAorICogICAgICAgICAgICAgICAgICAgIDUyMGUxN2NkNTU4OTY0NDEwNDJiMTRkZjI1NjZhNmViNjEwZWQ0NDQKKyAqIENvcHlyaWdodCAoYykgMjAwNyBMb2ljIE1pbmllciA8bG9vbCBhdCBkb296Lm9yZz4KKyAqICAgICAgICAgICAgICAgICAgICBCZW5qYW1pbiBMYXJzc29uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIFRoZSAzIGFscGhhbnVtZXJpYyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgbWQ1c3VtbWVkIHRoZXkgYXJlIGZyb20gdGhlIG9yaWdpbmFsCisgKiBpbXBsZW1lbnRvcnMuIFRoZSBvcmlnaW5hbCBjb2RlIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9uZWxseTJwY20vCisgKi8KKworI2luY2x1ZGUgIm5lbGx5bW9zZXIuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImdldF9iaXRzLmgiCisKK2NvbnN0IGZsb2F0IGZmX25lbGx5X2RlcXVhbnRpemF0aW9uX3RhYmxlWzEyN10gPSB7CisgMC4wMDAwMDAwMDAwLAorCistMC44NDcyNTYwMDQ4LCAwLjcyMjQ3MDk5ODgsCisKKy0xLjUyNDc0Nzk2NzcsLTAuNDUzMTQ4MDA3NCwgMC4zNzUzNjA5OTU1LCAxLjQ3MTc4OTk1NjEsCisKKy0xLjk4MjI1Nzk2MjIsLTEuMTkyOTM3OTcwMiwtMC41ODI5MzcwMDIyLC0wLjA2OTM3ODAwMzUsIDAuMzkwOTU2OTk3OSwgMC45MDY5MjAwMTU4LCAxLjQ4NjI3NDAwNDAsIDIuMjIxNTQwOTI3OSwKKworLTIuMzg4Nzg3MDMxMiwtMS44MDY3NTM5OTMwLC0xLjQxMDU0MjAxMTMsLTEuMDc3MzYwOTg3NywtMC43OTk1MDEwMDE4LC0wLjU1NTgxMDk4NzksLTAuMzMzNDAyMDA3OCwtMC4xMzI0NDkwMDExLAorIDAuMDU2ODAyMDAwOSwgMC4yNTQ4NzcwMDEwLCAwLjQ3NzM1NTAwMzQsIDAuNzM4Njg1MDExOSwgMS4wNDQzMDYwMzk4LCAxLjM5NTQ0NTk0MjksIDEuODA5ODc1MDExNCwgMi4zOTE4NzU5ODIzLAorCistMi4zODkzODMwNzc2LC0xLjk4ODQ2ODA1MTAsLTEuNzUxNDA0MDQ3MCwtMS41NjQzMTE5ODEyLC0xLjM5MjIxMjk4NjksLTEuMjE2NDY0OTk2MywtMS4wNDY5NDk5ODI2LC0wLjg5MDUxMDAyMjYsCistMC43NjQ1NTgwMTczLC0wLjY0NTQ1Nzk4MzAsLTAuNTI1OTI4MDIwNSwtMC40MDU5NTQ5ODY4LC0wLjMwMjk3MTk4ODksLTAuMjA5NjkwMDA0NiwtMC4xMjM5ODY5OTY3LC0wLjA0NzkyMjk5ODcsCisgMC4wMjU3NzMwMDAwLCAwLjEwMDEzNDAwMDIsIDAuMTczNzE4MDA1NCwgMC4yNTg1NTQwMTE2LCAwLjM1MjI5MDAwNDUsIDAuNDU2OTg4MDA2OCwgMC41NzY3NzUwMTQ0LCAwLjcwMDMxNjAxMTksCisgMC44NDI1NTIwMDYyLCAxLjAwOTM4Nzk3MDAsIDEuMTgyMTM0OTg1OSwgMS4zNTM0NTYwMjA0LCAxLjUzMjA4MTk2MTYsIDEuNzMzMjYxOTQyOSwgMS45NzIyMzQ5NjQ0LCAyLjM5NzgxNDAzNTQsCisKKy0yLjU3NTYzMDkwMzIsLTIuMDU3MzMyMDM4OSwtMS44OTg0OTE5Nzg2LC0xLjc3Mjc4MTAxNDQsLTEuNjY2MjYwMDA0MCwtMS41NzQyMTgwMzQ3LC0xLjQ5OTMzMTk1MTEsLTEuNDMxNjYzOTkwMCwKKy0xLjM2NTIyODA1NjksLTEuMzAwMDk5MDE1MiwtMS4yMjgwOTMwMjgxLC0xLjE1ODg1Nzk0MTYsLTEuMDkyMTI1MDU4MiwtMS4wMTM1NzQwMDQyLC0wLjkyMDI4NDk4NjUsLTAuODI4NzA1MDEyOCwKKy0wLjczNzQ4ODk4NTEsLTAuNjQ0Nzc1OTg2NywtMC41NTkwOTQwMTE4LC0wLjQ4NTcxMzk4ODUsLTAuNDExMDMxOTkxMiwtMC4zNDU5NzAwMDQ4LC0wLjI4NTExNTk4NzEsLTAuMjM0MTYyMDAyOCwKKy0wLjE4NzA1ODAwMTgsLTAuMTQ0MjUwMDA1NSwtMC4xMTA3MTY5OTg2LC0wLjA3Mzk2ODAwMDcsLTAuMDM2NTYxMDAxMSwtMC4wMDczMjkwMDAyLCAwLjAyMDM2MTAwMDcsIDAuMDQ3OTAzOTk5NywKKyAwLjA3NTE5Njk5NjMsIDAuMDk4MDk5OTk5MSwgMC4xMjIwMzg5OTc3LCAwLjE0NTg5OTk5NjIsIDAuMTY5NDM0OTk0NSwgMC4xOTcwNDU5OTY4LCAwLjIyNTI0MzAwMjIsIDAuMjU1Njg2OTk4NCwKKyAwLjI4NzAxMDAxNDEsIDAuMzE5NzA5OTg2NCwgMC4zNTI1ODI5OTExLCAwLjM4ODkwNjk4NTUsIDAuNDMzNDkyMDA0OSwgMC40NzY5NDU5OTYzLCAwLjUyMDQ4MjAwMzcsIDAuNTY0NDUzMDA1OCwKKyAwLjYxMjIwNDAxNTMsIDAuNjY4NTkyOTg5NCwgMC43MzQxNjUwMTI4LCAwLjgwMzIxNTk4MDUsIDAuODc4NDA0MDIxMywgMC45NTY2MjA5OTEyLCAxLjAzOTcwNjk0NTQsIDEuMTI5Mzc3MDA3NSwKKyAxLjIyMTExNTk0NjgsIDEuMzA4MDI3OTgyNywgMS40MDI0ODAwMDYyLCAxLjUwNTY4MTk5MTYsIDEuNjIyNzczMDUxMywgMS43NzI0OTU5ODUwLCAxLjk0MzA4ODA1NDcsIDIuMjkwMzkzMTE0MQorfTsKKworY29uc3QgdWludDhfdCBmZl9uZWxseV9iYW5kX3NpemVzX3RhYmxlW05FTExZX0JBTkRTXSA9IHsKKzIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDYsIDYsIDcsIDgsIDksIDEwLCAxMiwgMTQsIDE1Cit9OworCitjb25zdCB1aW50MTZfdCBmZl9uZWxseV9pbml0X3RhYmxlWzY0XSA9IHsKKzMxMzQsIDUzNDIsIDY4NzAsIDc3OTIsIDg1NjksIDkxODUsIDk3NDQsIDEwMTkxLCAxMDYzMSwgMTEwNjEsIDExNDM0LCAxMTc3MCwKKzEyMTE2LCAxMjUxMywgMTI5MjUsIDEzMzAwLCAxMzY3NCwgMTQwMjcsIDE0MzUyLCAxNDcxNiwgMTUxMTcsIDE1NDc3LCAxNTgyNCwKKzE2MTU3LCAxNjUxMywgMTY4MDQsIDE3MDkwLCAxNzQwMSwgMTc2NzksIDE3OTQ4LCAxODIzOCwgMTg1MjAsIDE4NzY0LCAxOTA3OCwKKzE5MzgxLCAxOTY0MCwgMTk5MjEsIDIwMjA1LCAyMDUwMCwgMjA4MTMsIDIxMTYyLCAyMTQ2NSwgMjE3OTQsIDIyMTM3LCAyMjQ1MywKKzIyNzU2LCAyMzA2NywgMjMzNTAsIDIzNjM2LCAyMzkyNiwgMjQyMjcsIDI0NTIxLCAyNDgxOSwgMjUxMDcsIDI1NDE0LCAyNTczMCwKKzI2MTIwLCAyNjQ5NywgMjY4OTUsIDI3MzQ0LCAyNzg3NywgMjg0NjMsIDI5NDI2LCAzMTM1NQorfTsKKworY29uc3QgaW50MTZfdCBmZl9uZWxseV9kZWx0YV90YWJsZVszMl0gPSB7CistMTE3MjUsIC05NDIwLCAtNzkxMCwgLTY4MDEsIC01OTQ4LCAtNTIzMywgLTQ1OTksIC00MDM5LCAtMzUwNywgLTMwMzAsIC0yNTk2LAorLTIxNzAsIC0xNzc0LCAtMTM4MywgLTEwMTYsIC02NjAsIC0zMjksIC0xLCAzMzcsIDY5NiwgMTA4NSwgMTUxMiwgMTk2MiwgMjQzMywKKzI5NjgsIDM1NjksIDQzMTQsIDUyNzksIDY2MjIsIDgxNTQsIDEwMDc2LCAxMjk3NQorfTsKKworc3RhdGljIGlubGluZSBpbnQgc2lnbmVkX3NoaWZ0KGludCBpLCBpbnQgc2hpZnQpIHsKKyAgICBpZiAoc2hpZnQgPiAwKQorICAgICAgICByZXR1cm4gaSA8PCBzaGlmdDsKKyAgICByZXR1cm4gaSA+PiAtc2hpZnQ7Cit9CisKK3N0YXRpYyBpbnQgc3VtX2JpdHMoc2hvcnQgKmJ1Ziwgc2hvcnQgc2hpZnQsIHNob3J0IG9mZikKK3sKKyAgICBpbnQgaSwgcmV0ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBORUxMWV9GSUxMX0xFTjsgaSsrKSB7CisgICAgICAgIGludCBiID0gYnVmW2ldLW9mZjsKKyAgICAgICAgYiA9ICgoYj4+KHNoaWZ0LTEpKSsxKT4+MTsKKyAgICAgICAgcmV0ICs9IGF2X2NsaXAoYiwgMCwgTkVMTFlfQklUX0NBUCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoZWFkcm9vbShpbnQgKmxhKQoreworICAgIGludCBsOworICAgIGlmICgqbGEgPT0gMCkgeworICAgICAgICByZXR1cm4gMzE7CisgICAgfQorICAgIGwgPSAzMCAtIGF2X2xvZzIoRkZBQlMoKmxhKSk7CisgICAgKmxhIDw8PSBsOworICAgIHJldHVybiBsOworfQorCisKK3ZvaWQgZmZfbmVsbHlfZ2V0X3NhbXBsZV9iaXRzKGNvbnN0IGZsb2F0ICpidWYsIGludCAqYml0cykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBzaG9ydCBzYnVmWzEyOF07CisgICAgaW50IGJpdHN1bSA9IDAsIGxhc3RfYml0c3VtLCBzbWFsbF9iaXRzdW0sIGJpZ19iaXRzdW07CisgICAgc2hvcnQgc2hpZnQsIHNoaWZ0X3NhdmVkOworICAgIGludCBtYXgsIHN1bSwgbGFzdF9vZmYsIHRtcDsKKyAgICBpbnQgYmlnX29mZiwgc21hbGxfb2ZmOworICAgIGludCBvZmY7CisKKyAgICBtYXggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBORUxMWV9GSUxMX0xFTjsgaSsrKSB7CisgICAgICAgIG1heCA9IEZGTUFYKG1heCwgYnVmW2ldKTsKKyAgICB9CisgICAgc2hpZnQgPSAtMTY7CisgICAgc2hpZnQgKz0gaGVhZHJvb20oJm1heCk7CisKKyAgICBzdW0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBORUxMWV9GSUxMX0xFTjsgaSsrKSB7CisgICAgICAgIHNidWZbaV0gPSBzaWduZWRfc2hpZnQoYnVmW2ldLCBzaGlmdCk7CisgICAgICAgIHNidWZbaV0gPSAoMypzYnVmW2ldKT4+MjsKKyAgICAgICAgc3VtICs9IHNidWZbaV07CisgICAgfQorCisgICAgc2hpZnQgKz0gMTE7CisgICAgc2hpZnRfc2F2ZWQgPSBzaGlmdDsKKyAgICBzdW0gLT0gTkVMTFlfREVUQUlMX0JJVFMgPDwgc2hpZnQ7CisgICAgc2hpZnQgKz0gaGVhZHJvb20oJnN1bSk7CisgICAgc21hbGxfb2ZmID0gKE5FTExZX0JBU0VfT0ZGICogKHN1bT4+MTYpKSA+PiAxNTsKKyAgICBzaGlmdCA9IHNoaWZ0X3NhdmVkIC0gKE5FTExZX0JBU0VfU0hJRlQrc2hpZnQtMzEpOworCisgICAgc21hbGxfb2ZmID0gc2lnbmVkX3NoaWZ0KHNtYWxsX29mZiwgc2hpZnQpOworCisgICAgYml0c3VtID0gc3VtX2JpdHMoc2J1Ziwgc2hpZnRfc2F2ZWQsIHNtYWxsX29mZik7CisKKyAgICBpZiAoYml0c3VtICE9IE5FTExZX0RFVEFJTF9CSVRTKSB7CisgICAgICAgIG9mZiA9IGJpdHN1bSAtIE5FTExZX0RFVEFJTF9CSVRTOworCisgICAgICAgIGZvcihzaGlmdD0wOyBGRkFCUyhvZmYpIDw9IDE2MzgzOyBzaGlmdCsrKQorICAgICAgICAgICAgb2ZmICo9IDI7CisKKyAgICAgICAgb2ZmID0gKG9mZiAqIE5FTExZX0JBU0VfT0ZGKSA+PiAxNTsKKyAgICAgICAgc2hpZnQgPSBzaGlmdF9zYXZlZC0oTkVMTFlfQkFTRV9TSElGVCtzaGlmdC0xNSk7CisKKyAgICAgICAgb2ZmID0gc2lnbmVkX3NoaWZ0KG9mZiwgc2hpZnQpOworCisgICAgICAgIGZvciAoaiA9IDE7IGogPCAyMDsgaisrKSB7CisgICAgICAgICAgICBsYXN0X29mZiA9IHNtYWxsX29mZjsKKyAgICAgICAgICAgIHNtYWxsX29mZiArPSBvZmY7CisgICAgICAgICAgICBsYXN0X2JpdHN1bSA9IGJpdHN1bTsKKworICAgICAgICAgICAgYml0c3VtID0gc3VtX2JpdHMoc2J1Ziwgc2hpZnRfc2F2ZWQsIHNtYWxsX29mZik7CisKKyAgICAgICAgICAgIGlmICgoYml0c3VtLU5FTExZX0RFVEFJTF9CSVRTKSAqIChsYXN0X2JpdHN1bS1ORUxMWV9ERVRBSUxfQklUUykgPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiaXRzdW0gPiBORUxMWV9ERVRBSUxfQklUUykgeworICAgICAgICAgICAgYmlnX29mZiA9IHNtYWxsX29mZjsKKyAgICAgICAgICAgIHNtYWxsX29mZiA9IGxhc3Rfb2ZmOworICAgICAgICAgICAgYmlnX2JpdHN1bT1iaXRzdW07CisgICAgICAgICAgICBzbWFsbF9iaXRzdW09bGFzdF9iaXRzdW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiaWdfb2ZmID0gbGFzdF9vZmY7CisgICAgICAgICAgICBiaWdfYml0c3VtPWxhc3RfYml0c3VtOworICAgICAgICAgICAgc21hbGxfYml0c3VtPWJpdHN1bTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChiaXRzdW0gIT0gTkVMTFlfREVUQUlMX0JJVFMgJiYgaiA8PSAxOSkgeworICAgICAgICAgICAgb2ZmID0gKGJpZ19vZmYrc21hbGxfb2ZmKT4+MTsKKyAgICAgICAgICAgIGJpdHN1bSA9IHN1bV9iaXRzKHNidWYsIHNoaWZ0X3NhdmVkLCBvZmYpOworICAgICAgICAgICAgaWYgKGJpdHN1bSA+IE5FTExZX0RFVEFJTF9CSVRTKSB7CisgICAgICAgICAgICAgICAgYmlnX29mZj1vZmY7CisgICAgICAgICAgICAgICAgYmlnX2JpdHN1bT1iaXRzdW07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNtYWxsX29mZiA9IG9mZjsKKyAgICAgICAgICAgICAgICBzbWFsbF9iaXRzdW09Yml0c3VtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaisrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFicyhiaWdfYml0c3VtLU5FTExZX0RFVEFJTF9CSVRTKSA+PQorICAgICAgICAgICAgYWJzKHNtYWxsX2JpdHN1bS1ORUxMWV9ERVRBSUxfQklUUykpIHsKKyAgICAgICAgICAgIGJpdHN1bSA9IHNtYWxsX2JpdHN1bTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNtYWxsX29mZiA9IGJpZ19vZmY7CisgICAgICAgICAgICBiaXRzdW0gPSBiaWdfYml0c3VtOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE5FTExZX0ZJTExfTEVOOyBpKyspIHsKKyAgICAgICAgdG1wID0gc2J1ZltpXS1zbWFsbF9vZmY7CisgICAgICAgIHRtcCA9ICgodG1wPj4oc2hpZnRfc2F2ZWQtMSkpKzEpPj4xOworICAgICAgICBiaXRzW2ldID0gYXZfY2xpcCh0bXAsIDAsIE5FTExZX0JJVF9DQVApOworICAgIH0KKworICAgIGlmIChiaXRzdW0gPiBORUxMWV9ERVRBSUxfQklUUykgeworICAgICAgICB0bXAgPSBpID0gMDsKKyAgICAgICAgd2hpbGUgKHRtcCA8IE5FTExZX0RFVEFJTF9CSVRTKSB7CisgICAgICAgICAgICB0bXAgKz0gYml0c1tpXTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIGJpdHNbaS0xXSAtPSB0bXAgLSBORUxMWV9ERVRBSUxfQklUUzsKKyAgICAgICAgZm9yKDsgaSA8IE5FTExZX0ZJTExfTEVOOyBpKyspCisgICAgICAgICAgICBiaXRzW2ldID0gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9uZWxseW1vc2VyLmggYi9mZm1wZWcvbGliYXZjb2RlYy9uZWxseW1vc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3ZmM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL25lbGx5bW9zZXIuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29tbW9uIGNvZGUgYmV0d2VlbiBOZWxseW1vc2VyIGVuY29kZXIgYW5kIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBhODQwYmRhNTg3MGJhMTFmMTk2OThmZjZlYjk1ODFkZmIwZjk1ZmE1LAorICogICAgICAgICAgICAgICAgICAgIDUzOTQ1OWFlYjdkNDI1MTQwYjYyYTNlYzdkYmY2ZGM4ZTQwOGEzMDYsIGFuZAorICogICAgICAgICAgICAgICAgICAgIDUyMGUxN2NkNTU4OTY0NDEwNDJiMTRkZjI1NjZhNmViNjEwZWQ0NDQKKyAqIENvcHlyaWdodCAoYykgMjAwNyBMb2ljIE1pbmllciA8bG9vbCBhdCBkb296Lm9yZz4KKyAqICAgICAgICAgICAgICAgICAgICBCZW5qYW1pbiBMYXJzc29uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIFRoZSAzIGFscGhhbnVtZXJpYyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgbWQ1c3VtbWVkIHRoZXkgYXJlIGZyb20gdGhlIG9yaWdpbmFsCisgKiBpbXBsZW1lbnRvcnMuIFRoZSBvcmlnaW5hbCBjb2RlIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9uZWxseTJwY20vCisgKi8KKworI2lmbmRlZiBBVkNPREVDX05FTExZTU9TRVJfSAorI2RlZmluZSBBVkNPREVDX05FTExZTU9TRVJfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCisjZGVmaW5lIE5FTExZX0JBTkRTICAgICAgIDIzCisjZGVmaW5lIE5FTExZX0JMT0NLX0xFTiAgIDY0CisjZGVmaW5lIE5FTExZX0hFQURFUl9CSVRTIDExNgorI2RlZmluZSBORUxMWV9ERVRBSUxfQklUUyAxOTgKKyNkZWZpbmUgTkVMTFlfQlVGX0xFTiAgICAgMTI4CisjZGVmaW5lIE5FTExZX0ZJTExfTEVOICAgIDEyNAorI2RlZmluZSBORUxMWV9CSVRfQ0FQICAgICA2CisjZGVmaW5lIE5FTExZX0JBU0VfT0ZGICAgIDQyMjgKKyNkZWZpbmUgTkVMTFlfQkFTRV9TSElGVCAgMTkKKyNkZWZpbmUgTkVMTFlfU0FNUExFUyAgICAgKDIgKiBORUxMWV9CVUZfTEVOKQorCitleHRlcm4gY29uc3QgZmxvYXQgICAgZmZfbmVsbHlfZGVxdWFudGl6YXRpb25fdGFibGVbMTI3XTsKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl9uZWxseV9iYW5kX3NpemVzX3RhYmxlW05FTExZX0JBTkRTXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9uZWxseV9pbml0X3RhYmxlWzY0XTsKK2V4dGVybiBjb25zdCBpbnQxNl90ICBmZl9uZWxseV9kZWx0YV90YWJsZVszMl07CisKK3ZvaWQgZmZfbmVsbHlfZ2V0X3NhbXBsZV9iaXRzKGNvbnN0IGZsb2F0ICpidWYsIGludCAqYml0cyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX05FTExZTU9TRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbmVsbHltb3NlcmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbmVsbHltb3NlcmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOGE1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9uZWxseW1vc2VyZGVjLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBOZWxseU1vc2VyIGF1ZGlvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBhODQwYmRhNTg3MGJhMTFmMTk2OThmZjZlYjk1ODFkZmIwZjk1ZmE1LAorICogICAgICAgICAgICAgICAgICAgIDUzOTQ1OWFlYjdkNDI1MTQwYjYyYTNlYzdkYmY2ZGM4ZTQwOGEzMDYsIGFuZAorICogICAgICAgICAgICAgICAgICAgIDUyMGUxN2NkNTU4OTY0NDEwNDJiMTRkZjI1NjZhNmViNjEwZWQ0NDQKKyAqIENvcHlyaWdodCAoYykgMjAwNyBMb2ljIE1pbmllciA8bG9vbCBhdCBkb296Lm9yZz4KKyAqICAgICAgICAgICAgICAgICAgICBCZW5qYW1pbiBMYXJzc29uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIFRoZSAzIGFscGhhbnVtZXJpYyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgbWQ1c3VtbWVkIHRoZXkgYXJlIGZyb20gdGhlIG9yaWdpbmFsCisgKiBpbXBsZW1lbnRvcnMuIFRoZSBvcmlnaW5hbCBjb2RlIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9uZWxseTJwY20vCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhbmRvbV9zZWVkLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgImZtdGNvbnZlcnQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm5lbGx5bW9zZXIuaCIKKyNpbmNsdWRlICJzaW5ld2luLmgiCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImdldF9iaXRzLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgTmVsbHlNb3NlckRlY29kZUNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0KiBhdmN0eDsKKyAgICBBVkxGRyAgICAgICAgICAgcmFuZG9tX3N0YXRlOworICAgIEdldEJpdENvbnRleHQgICBnYjsKKyAgICBmbG9hdCAgICAgICAgICAgc2NhbGVfYmlhczsKKyAgICBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcDsKKyAgICBGRlRDb250ZXh0ICAgICAgaW1kY3RfY3R4OworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGltZGN0X2J1ZilbMl1bTkVMTFlfQlVGX0xFTl07CisgICAgZmxvYXQgICAgICAgICAgKmltZGN0X291dDsKKyAgICBmbG9hdCAgICAgICAgICAqaW1kY3RfcHJldjsKK30gTmVsbHlNb3NlckRlY29kZUNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIG5lbGx5X2RlY29kZV9ibG9jayhOZWxseU1vc2VyRGVjb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGJsb2NrW05FTExZX0JMT0NLX0xFTl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXVkaW9bTkVMTFlfU0FNUExFU10pCit7CisgICAgaW50IGksajsKKyAgICBmbG9hdCBidWZbTkVMTFlfRklMTF9MRU5dLCBwb3dzW05FTExZX0ZJTExfTEVOXTsKKyAgICBmbG9hdCAqYXB0ciwgKmJwdHIsICpwcHRyLCB2YWwsIHB2YWw7CisgICAgaW50IGJpdHNbTkVMTFlfQlVGX0xFTl07CisgICAgdW5zaWduZWQgY2hhciB2OworCisgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJsb2NrLCBORUxMWV9CTE9DS19MRU4gKiA4KTsKKworICAgIGJwdHIgPSBidWY7CisgICAgcHB0ciA9IHBvd3M7CisgICAgdmFsID0gZmZfbmVsbHlfaW5pdF90YWJsZVtnZXRfYml0cygmcy0+Z2IsIDYpXTsKKyAgICBmb3IgKGk9MCA7IGk8TkVMTFlfQkFORFMgOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgdmFsICs9IGZmX25lbGx5X2RlbHRhX3RhYmxlW2dldF9iaXRzKCZzLT5nYiwgNSldOworICAgICAgICBwdmFsID0gLXBvdygyLCB2YWwvMjA0OCkgKiBzLT5zY2FsZV9iaWFzOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmZfbmVsbHlfYmFuZF9zaXplc190YWJsZVtpXTsgaisrKSB7CisgICAgICAgICAgICAqYnB0cisrID0gdmFsOworICAgICAgICAgICAgKnBwdHIrKyA9IHB2YWw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGZmX25lbGx5X2dldF9zYW1wbGVfYml0cyhidWYsIGJpdHMpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBhcHRyID0gYXVkaW8gKyBpICogTkVMTFlfQlVGX0xFTjsKKworICAgICAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgYmxvY2ssIE5FTExZX0JMT0NLX0xFTiAqIDgpOworICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIE5FTExZX0hFQURFUl9CSVRTICsgaSpORUxMWV9ERVRBSUxfQklUUyk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IE5FTExZX0ZJTExfTEVOOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChiaXRzW2pdIDw9IDApIHsKKyAgICAgICAgICAgICAgICBhcHRyW2pdID0gTV9TUVJUMV8yKnBvd3Nbal07CisgICAgICAgICAgICAgICAgaWYgKGF2X2xmZ19nZXQoJnMtPnJhbmRvbV9zdGF0ZSkgJiAxKQorICAgICAgICAgICAgICAgICAgICBhcHRyW2pdICo9IC0xLjA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHYgPSBnZXRfYml0cygmcy0+Z2IsIGJpdHNbal0pOworICAgICAgICAgICAgICAgIGFwdHJbal0gPSBmZl9uZWxseV9kZXF1YW50aXphdGlvbl90YWJsZVsoMTw8Yml0c1tqXSktMSt2XSpwb3dzW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1lbXNldCgmYXB0cltORUxMWV9GSUxMX0xFTl0sIDAsCisgICAgICAgICAgICAgICAoTkVMTFlfQlVGX0xFTiAtIE5FTExZX0ZJTExfTEVOKSAqIHNpemVvZihmbG9hdCkpOworCisgICAgICAgIHMtPmltZGN0X2N0eC5pbWRjdF9oYWxmKCZzLT5pbWRjdF9jdHgsIHMtPmltZGN0X291dCwgYXB0cik7CisgICAgICAgIHMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhhcHRyLCBzLT5pbWRjdF9wcmV2ICsgTkVMTFlfQlVGX0xFTiAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmltZGN0X291dCwgZmZfc2luZV8xMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FTExZX0JVRl9MRU4gLyAyKTsKKyAgICAgICAgRkZTV0FQKGZsb2F0ICosIHMtPmltZGN0X291dCwgcy0+aW1kY3RfcHJldik7CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCkgeworICAgIE5lbGx5TW9zZXJEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgcy0+aW1kY3Rfb3V0ID0gcy0+aW1kY3RfYnVmWzBdOworICAgIHMtPmltZGN0X3ByZXYgPSBzLT5pbWRjdF9idWZbMV07CisgICAgYXZfbGZnX2luaXQoJnMtPnJhbmRvbV9zdGF0ZSwgMCk7CisgICAgZmZfbWRjdF9pbml0KCZzLT5pbWRjdF9jdHgsIDgsIDEsIDEuMCk7CisKKyAgICBzLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBpZiAoIXMtPmZkc3ApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5zY2FsZV9iaWFzID0gMS4wLygzMjc2OCo4KTsKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfRkxUOworCisgICAgLyogR2VuZXJhdGUgb3ZlcmxhcCB3aW5kb3cgKi8KKyAgICBpZiAoIWZmX3NpbmVfMTI4WzEyN10pCisgICAgICAgIGZmX2luaXRfZmZfc2luZV93aW5kb3dzKDcpOworCisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV90YWcoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lICAgICA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgY29uc3QgdWludDhfdCAqc2lkZT1hdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgJ0YnLCBOVUxMKTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBOZWxseU1vc2VyRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGJsb2NrcywgaSwgcmV0OworICAgIGZsb2F0ICAgKnNhbXBsZXNfZmx0OworCisgICAgYmxvY2tzICAgICA9IGJ1Zl9zaXplIC8gTkVMTFlfQkxPQ0tfTEVOOworCisgICAgaWYgKGJsb2NrcyA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGlzIHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChidWZfc2l6ZSAlIE5FTExZX0JMT0NLX0xFTikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiTGVmdG92ZXIgYnl0ZXM6ICVkLlxuIiwKKyAgICAgICAgICAgICAgIGJ1Zl9zaXplICUgTkVMTFlfQkxPQ0tfTEVOKTsKKyAgICB9CisgICAgLyogTm9ybWFsIG51bWJlcnMgb2YgYmxvY2tzIGZvciBzYW1wbGUgcmF0ZXM6CisgICAgICogIDgwMDAgSHogLSAxCisgICAgICogMTEwMjUgSHogLSAyCisgICAgICogMTYwMDAgSHogLSAzCisgICAgICogMjIwNTAgSHogLSA0CisgICAgICogNDQxMDAgSHogLSA4CisgICAgICovCisgICAgaWYoc2lkZSAmJiBibG9ja3M+MSAmJiBhdmN0eC0+c2FtcGxlX3JhdGUlMTEwMjU9PTAgJiYgKDE8PCgoc2lkZVswXT4+MikmMykpID09IGJsb2NrcykKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlPSAxMTAyNSooYmxvY2tzLzIpOworCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IE5FTExZX1NBTVBMRVMgKiBibG9ja3M7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzYW1wbGVzX2ZsdCA9IChmbG9hdCAqKWZyYW1lLT5kYXRhWzBdOworCisgICAgZm9yIChpPTAgOyBpPGJsb2NrcyA7IGkrKykgeworICAgICAgICBuZWxseV9kZWNvZGVfYmxvY2socywgYnVmLCBzYW1wbGVzX2ZsdCk7CisgICAgICAgIHNhbXBsZXNfZmx0ICs9IE5FTExZX1NBTVBMRVM7CisgICAgICAgIGJ1ZiArPSBORUxMWV9CTE9DS19MRU47CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqIGF2Y3R4KSB7CisgICAgTmVsbHlNb3NlckRlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmZfbWRjdF9lbmQoJnMtPmltZGN0X2N0eCk7CisgICAgYXZfZnJlZXAoJnMtPmZkc3ApOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbmVsbHltb3Nlcl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJuZWxseW1vc2VyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTmVsbHltb3NlciBBc2FvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX05FTExZTU9TRVIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE5lbGx5TW9zZXJEZWNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV90YWcsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9QQVJBTV9DSEFOR0UsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL25lbGx5bW9zZXJlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL25lbGx5bW9zZXJlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGNhYmEyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbmVsbHltb3NlcmVuYy5jCkBAIC0wLDAgKzEsNDI0IEBACisvKgorICogTmVsbHltb3NlciBlbmNvZGVyCisgKiBUaGlzIGNvZGUgaXMgZGV2ZWxvcGVkIGFzIHBhcnQgb2YgR29vZ2xlIFN1bW1lciBvZiBDb2RlIDIwMDggUHJvZ3JhbS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQmFydGxvbWllaiBXb2xvd2llYworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBOZWxseW1vc2VyIGVuY29kZXIKKyAqIGJ5IEJhcnRsb21pZWogV29sb3dpZWMKKyAqCisgKiBHZW5lcmljIGNvZGVjIGluZm9ybWF0aW9uOiBsaWJhdmNvZGVjL25lbGx5bW9zZXJkZWMuYworICoKKyAqIFNvbWUgaW5mb3JtYXRpb24gYWxzbyBmcm9tOiBodHRwOi8vc2FtcGxlcy5tcGxheWVyaHEuaHUvQS1jb2RlY3MvTmVsbHlfTW9zZXIvQVNBTy9BU0FPLnppcAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb3B5cmlnaHQgSm9zZXBoIEFydHNpbW92aWNoIGFuZCBVQUIgIkRLRCIpCisgKgorICogZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbmVsbHltb3NlciBmb3JtYXQsIHZpc2l0OgorICogaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9TmVsbHltb3NlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorCisjaW5jbHVkZSAiYXVkaW9fZnJhbWVfcXVldWUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZmZ0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJuZWxseW1vc2VyLmgiCisjaW5jbHVkZSAic2luZXdpbi5oIgorCisjZGVmaW5lIEJJVFNUUkVBTV9XUklURVJfTEUKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCisjZGVmaW5lIFBPV19UQUJMRV9TSVpFICgxPDwxMSkKKyNkZWZpbmUgUE9XX1RBQkxFX09GRlNFVCAzCisjZGVmaW5lIE9QVF9TSVpFICgoMTw8MTUpICsgMzAwMCkKKwordHlwZWRlZiBzdHJ1Y3QgTmVsbHlNb3NlckVuY29kZUNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICAqYXZjdHg7CisgICAgaW50ICAgICAgICAgICAgIGxhc3RfZnJhbWU7CisgICAgQVZGbG9hdERTUENvbnRleHQgKmZkc3A7CisgICAgRkZUQ29udGV4dCAgICAgIG1kY3RfY3R4OworICAgIEF1ZGlvRnJhbWVRdWV1ZSBhZnE7CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgbWRjdF9vdXQpW05FTExZX1NBTVBMRVNdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGluX2J1ZmYpW05FTExZX1NBTVBMRVNdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGJ1ZilbMyAqIE5FTExZX0JVRl9MRU5dOyAgICAgLy8vPCBzYW1wbGUgYnVmZmVyCisgICAgZmxvYXQgICAgICAgICAgICgqb3B0IClbT1BUX1NJWkVdOworICAgIHVpbnQ4X3QgICAgICAgICAoKnBhdGgpW09QVF9TSVpFXTsKK30gTmVsbHlNb3NlckVuY29kZUNvbnRleHQ7CisKK3N0YXRpYyBmbG9hdCBwb3dfdGFibGVbUE9XX1RBQkxFX1NJWkVdOyAgICAgLy8vPCBwb3coMiwgLWkgLyAyMDQ4LjAgLSAzLjApOworCitzdGF0aWMgY29uc3QgdWludDhfdCBzZl9sdXRbOTZdID0geworICAgICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDMsICAzLCAgMywgIDQsICA0LAorICAgICA1LCAgNSwgIDUsICA2LCAgNywgIDcsICA4LCAgOCwgIDksIDEwLCAxMSwgMTEsIDEyLCAxMywgMTMsIDE0LAorICAgIDE1LCAxNSwgMTYsIDE3LCAxNywgMTgsIDE5LCAxOSwgMjAsIDIxLCAyMiwgMjIsIDIzLCAyNCwgMjUsIDI2LAorICAgIDI3LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM3LCAzOCwgMzksIDQwLAorICAgIDQxLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTIsIDUzLAorICAgIDU0LCA1NSwgNTUsIDU2LCA1NywgNTcsIDU4LCA1OSwgNTksIDYwLCA2MCwgNjAsIDYxLCA2MSwgNjEsIDYyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2ZfZGVsdGFfbHV0Wzc4XSA9IHsKKyAgICAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAzLCAgMywgIDMsICA0LCAgNCwKKyAgICAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwKKyAgICAxMywgMTMsIDE0LCAxNSwgMTYsIDE3LCAxNywgMTgsIDE5LCAxOSwgMjAsIDIxLCAyMSwgMjIsIDIyLCAyMywKKyAgICAyMywgMjQsIDI0LCAyNSwgMjUsIDI1LCAyNiwgMjYsIDI2LCAyNiwgMjcsIDI3LCAyNywgMjcsIDI3LCAyOCwKKyAgICAyOCwgMjgsIDI4LCAyOCwgMjgsIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMzAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBxdWFudF9sdXRbMjMwXSA9IHsKKyAgICAgMCwKKworICAgICAwLCAgMSwgIDIsCisKKyAgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwKKworICAgICAwLCAgMSwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDExLAorICAgIDEyLCAxMywgMTMsIDEzLCAxNCwKKworICAgICAwLCAgMSwgIDEsICAyLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA4LAorICAgICA4LCAgOSwgMTAsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLAorICAgIDIyLCAyMywgMjMsIDI0LCAyNCwgMjUsIDI1LCAyNiwgMjYsIDI3LCAyNywgMjgsIDI4LCAyOSwgMjksIDI5LAorICAgIDMwLAorCisgICAgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMiwgIDMsICAzLCAgMywgIDMsCisgICAgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgIDksCisgICAgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjAsCisgICAgMjEsIDIxLCAyMiwgMjIsIDIzLCAyMywgMjQsIDI1LCAyNiwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsCisgICAgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQyLCA0MywgNDQsIDQ0LCA0NSwgNDUsCisgICAgNDYsIDQ3LCA0NywgNDgsIDQ4LCA0OSwgNDksIDUwLCA1MCwgNTAsIDUxLCA1MSwgNTEsIDUyLCA1MiwgNTIsCisgICAgNTMsIDUzLCA1MywgNTQsIDU0LCA1NCwgNTUsIDU1LCA1NSwgNTYsIDU2LCA1NiwgNTcsIDU3LCA1NywgNTcsCisgICAgNTgsIDU4LCA1OCwgNTgsIDU5LCA1OSwgNTksIDU5LCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYxLCA2MSwgNjEsCisgICAgNjEsIDYxLCA2MSwgNjEsIDYyLAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHF1YW50X2x1dF9tdWxbN10gPSB7IDAuMCwgIDAuMCwgIDIuMCwgIDIuMCwgIDUuMCwgMTIuMCwgIDM2LjYgfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBxdWFudF9sdXRfYWRkWzddID0geyAwLjAsICAwLjAsICAyLjAsICA3LjAsIDIxLjAsIDU2LjAsIDE1Ny4wIH07CitzdGF0aWMgY29uc3QgdWludDhfdCBxdWFudF9sdXRfb2Zmc2V0WzhdID0geyAwLCAwLCAxLCA0LCAxMSwgMzIsIDgxLCAyMzAgfTsKKworc3RhdGljIHZvaWQgYXBwbHlfbWRjdChOZWxseU1vc2VyRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBmbG9hdCAqaW4wID0gcy0+YnVmOworICAgIGZsb2F0ICppbjEgPSBzLT5idWYgKyBORUxMWV9CVUZfTEVOOworICAgIGZsb2F0ICppbjIgPSBzLT5idWYgKyAyICogTkVMTFlfQlVGX0xFTjsKKworICAgIHMtPmZkc3AtPnZlY3Rvcl9mbXVsICAgICAgICAocy0+aW5fYnVmZiwgICAgICAgICAgICAgICAgIGluMCwgZmZfc2luZV8xMjgsIE5FTExZX0JVRl9MRU4pOworICAgIHMtPmZkc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2Uocy0+aW5fYnVmZiArIE5FTExZX0JVRl9MRU4sIGluMSwgZmZfc2luZV8xMjgsIE5FTExZX0JVRl9MRU4pOworICAgIHMtPm1kY3RfY3R4Lm1kY3RfY2FsYygmcy0+bWRjdF9jdHgsIHMtPm1kY3Rfb3V0LCBzLT5pbl9idWZmKTsKKworICAgIHMtPmZkc3AtPnZlY3Rvcl9mbXVsICAgICAgICAocy0+aW5fYnVmZiwgICAgICAgICAgICAgICAgIGluMSwgZmZfc2luZV8xMjgsIE5FTExZX0JVRl9MRU4pOworICAgIHMtPmZkc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2Uocy0+aW5fYnVmZiArIE5FTExZX0JVRl9MRU4sIGluMiwgZmZfc2luZV8xMjgsIE5FTExZX0JVRl9MRU4pOworICAgIHMtPm1kY3RfY3R4Lm1kY3RfY2FsYygmcy0+bWRjdF9jdHgsIHMtPm1kY3Rfb3V0ICsgTkVMTFlfQlVGX0xFTiwgcy0+aW5fYnVmZik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBOZWxseU1vc2VyRW5jb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmZl9tZGN0X2VuZCgmcy0+bWRjdF9jdHgpOworCisgICAgaWYgKHMtPmF2Y3R4LT50cmVsbGlzKSB7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5vcHQpOworICAgICAgICBhdl9mcmVlcCgmcy0+cGF0aCk7CisgICAgfQorICAgIGZmX2FmX3F1ZXVlX2Nsb3NlKCZzLT5hZnEpOworICAgIGF2X2ZyZWVwKCZzLT5mZHNwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE5lbGx5TW9zZXJFbmNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTmVsbHltb3NlciBzdXBwb3J0cyBvbmx5IDEgY2hhbm5lbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5zYW1wbGVfcmF0ZSAhPSA4MDAwICYmIGF2Y3R4LT5zYW1wbGVfcmF0ZSAhPSAxNjAwMCAmJgorICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgIT0gMTEwMjUgJiYKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlICE9IDIyMDUwICYmIGF2Y3R4LT5zYW1wbGVfcmF0ZSAhPSA0NDEwMCAmJgorICAgICAgICBhdmN0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID49IEZGX0NPTVBMSUFOQ0VfTk9STUFMKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTmVsbHltb3NlciB3b3JrcyBvbmx5IHdpdGggODAwMCwgMTYwMDAsIDExMDI1LCAyMjA1MCBhbmQgNDQxMDAgc2FtcGxlIHJhdGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gTkVMTFlfU0FNUExFUzsKKyAgICBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nID0gTkVMTFlfQlVGX0xFTjsKKyAgICBmZl9hZl9xdWV1ZV9pbml0KGF2Y3R4LCAmcy0+YWZxKTsKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIGlmICgocmV0ID0gZmZfbWRjdF9pbml0KCZzLT5tZGN0X2N0eCwgOCwgMCwgMzI3NjguMCkpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBzLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBpZiAoIXMtPmZkc3ApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIEdlbmVyYXRlIG92ZXJsYXAgd2luZG93ICovCisgICAgZmZfaW5pdF9mZl9zaW5lX3dpbmRvd3MoNyk7CisgICAgZm9yIChpID0gMDsgaSA8IFBPV19UQUJMRV9TSVpFOyBpKyspCisgICAgICAgIHBvd190YWJsZVtpXSA9IHBvdygyLCAtaSAvIDIwNDguMCAtIDMuMCArIFBPV19UQUJMRV9PRkZTRVQpOworCisgICAgaWYgKHMtPmF2Y3R4LT50cmVsbGlzKSB7CisgICAgICAgIHMtPm9wdCAgPSBhdl9tYWxsb2MoTkVMTFlfQkFORFMgKiBPUFRfU0laRSAqIHNpemVvZihmbG9hdCAgKSk7CisgICAgICAgIHMtPnBhdGggPSBhdl9tYWxsb2MoTkVMTFlfQkFORFMgKiBPUFRfU0laRSAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIGlmICghcy0+b3B0IHx8ICFzLT5wYXRoKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7CitlcnJvcjoKKyAgICBlbmNvZGVfZW5kKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIGZpbmRfYmVzdCh2YWwsIHRhYmxlLCBMVVQsIExVVF9hZGQsIExVVF9zaXplKSBcCisgICAgYmVzdF9pZHggPSBcCisgICAgICAgIExVVFthdl9jbGlwICgobHJpbnRmKHZhbCkgPj4gOCkgKyBMVVRfYWRkLCAwLCBMVVRfc2l6ZSAtIDEpXTsgXAorICAgIGlmIChmYWJzKHZhbCAtIHRhYmxlW2Jlc3RfaWR4XSkgPiBmYWJzKHZhbCAtIHRhYmxlW2Jlc3RfaWR4ICsgMV0pKSBcCisgICAgICAgIGJlc3RfaWR4Kys7CisKK3N0YXRpYyB2b2lkIGdldF9leHBvbmVudF9ncmVlZHkoTmVsbHlNb3NlckVuY29kZUNvbnRleHQgKnMsIGZsb2F0ICpjYW5kLCBpbnQgKmlkeF90YWJsZSkKK3sKKyAgICBpbnQgYmFuZCwgYmVzdF9pZHgsIHBvd2VyX2lkeCA9IDA7CisgICAgZmxvYXQgcG93ZXJfY2FuZGlkYXRlOworCisgICAgLy9iYXNlIGV4cG9uZW50CisgICAgZmluZF9iZXN0KGNhbmRbMF0sIGZmX25lbGx5X2luaXRfdGFibGUsIHNmX2x1dCwgLTIwLCA5Nik7CisgICAgaWR4X3RhYmxlWzBdID0gYmVzdF9pZHg7CisgICAgcG93ZXJfaWR4ID0gZmZfbmVsbHlfaW5pdF90YWJsZVtiZXN0X2lkeF07CisKKyAgICBmb3IgKGJhbmQgPSAxOyBiYW5kIDwgTkVMTFlfQkFORFM7IGJhbmQrKykgeworICAgICAgICBwb3dlcl9jYW5kaWRhdGUgPSBjYW5kW2JhbmRdIC0gcG93ZXJfaWR4OworICAgICAgICBmaW5kX2Jlc3QocG93ZXJfY2FuZGlkYXRlLCBmZl9uZWxseV9kZWx0YV90YWJsZSwgc2ZfZGVsdGFfbHV0LCAzNywgNzgpOworICAgICAgICBpZHhfdGFibGVbYmFuZF0gPSBiZXN0X2lkeDsKKyAgICAgICAgcG93ZXJfaWR4ICs9IGZmX25lbGx5X2RlbHRhX3RhYmxlW2Jlc3RfaWR4XTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgZmxvYXQgZGlzdGFuY2UoZmxvYXQgeCwgZmxvYXQgeSwgaW50IGJhbmQpCit7CisgICAgLy9yZXR1cm4gcG93KGZhYnMoeC15KSwgMi4wKTsKKyAgICBmbG9hdCB0bXAgPSB4IC0geTsKKyAgICByZXR1cm4gdG1wICogdG1wOworfQorCitzdGF0aWMgdm9pZCBnZXRfZXhwb25lbnRfZHluYW1pYyhOZWxseU1vc2VyRW5jb2RlQ29udGV4dCAqcywgZmxvYXQgKmNhbmQsIGludCAqaWR4X3RhYmxlKQoreworICAgIGludCBpLCBqLCBiYW5kLCBiZXN0X2lkeDsKKyAgICBmbG9hdCBwb3dlcl9jYW5kaWRhdGUsIGJlc3RfdmFsOworCisgICAgZmxvYXQgICgqb3B0IClbT1BUX1NJWkVdID0gcy0+b3B0IDsKKyAgICB1aW50OF90KCpwYXRoKVtPUFRfU0laRV0gPSBzLT5wYXRoOworCisgICAgZm9yIChpID0gMDsgaSA8IE5FTExZX0JBTkRTICogT1BUX1NJWkU7IGkrKykgeworICAgICAgICBvcHRbMF1baV0gPSBJTkZJTklUWTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBvcHRbMF1bZmZfbmVsbHlfaW5pdF90YWJsZVtpXV0gPSBkaXN0YW5jZShjYW5kWzBdLCBmZl9uZWxseV9pbml0X3RhYmxlW2ldLCAwKTsKKyAgICAgICAgcGF0aFswXVtmZl9uZWxseV9pbml0X3RhYmxlW2ldXSA9IGk7CisgICAgfQorCisgICAgZm9yIChiYW5kID0gMTsgYmFuZCA8IE5FTExZX0JBTkRTOyBiYW5kKyspIHsKKyAgICAgICAgaW50IHEsIGMgPSAwOworICAgICAgICBmbG9hdCB0bXA7CisgICAgICAgIGludCBpZHhfbWluLCBpZHhfbWF4LCBpZHg7CisgICAgICAgIHBvd2VyX2NhbmRpZGF0ZSA9IGNhbmRbYmFuZF07CisgICAgICAgIGZvciAocSA9IDEwMDA7ICFjICYmIHEgPCBPUFRfU0laRTsgcSA8PD0gMikgeworICAgICAgICAgICAgaWR4X21pbiA9IEZGTUFYKDAsIGNhbmRbYmFuZF0gLSBxKTsKKyAgICAgICAgICAgIGlkeF9tYXggPSBGRk1JTihPUFRfU0laRSwgY2FuZFtiYW5kIC0gMV0gKyBxKTsKKyAgICAgICAgICAgIGZvciAoaSA9IEZGTUFYKDAsIGNhbmRbYmFuZCAtIDFdIC0gcSk7IGkgPCBGRk1JTihPUFRfU0laRSwgY2FuZFtiYW5kIC0gMV0gKyBxKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpc2luZihvcHRbYmFuZCAtIDFdW2ldKSApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlkeCA9IGkgKyBmZl9uZWxseV9kZWx0YV90YWJsZVtqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+IGlkeF9tYXgpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+PSBpZHhfbWluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBvcHRbYmFuZCAtIDFdW2ldICsgZGlzdGFuY2UoaWR4LCBwb3dlcl9jYW5kaWRhdGUsIGJhbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdFtiYW5kXVtpZHhdID4gdG1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0W2JhbmRdW2lkeF0gPSB0bXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFtiYW5kXVtpZHhdID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoYyk7IC8vRklYTUUKKyAgICB9CisKKyAgICBiZXN0X3ZhbCA9IElORklOSVRZOworICAgIGJlc3RfaWR4ID0gLTE7CisgICAgYmFuZCA9IE5FTExZX0JBTkRTIC0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgT1BUX1NJWkU7IGkrKykgeworICAgICAgICBpZiAoYmVzdF92YWwgPiBvcHRbYmFuZF1baV0pIHsKKyAgICAgICAgICAgIGJlc3RfdmFsID0gb3B0W2JhbmRdW2ldOworICAgICAgICAgICAgYmVzdF9pZHggPSBpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoYmFuZCA9IE5FTExZX0JBTkRTIC0gMTsgYmFuZCA+PSAwOyBiYW5kLS0pIHsKKyAgICAgICAgaWR4X3RhYmxlW2JhbmRdID0gcGF0aFtiYW5kXVtiZXN0X2lkeF07CisgICAgICAgIGlmIChiYW5kKSB7CisgICAgICAgICAgICBiZXN0X2lkeCAtPSBmZl9uZWxseV9kZWx0YV90YWJsZVtwYXRoW2JhbmRdW2Jlc3RfaWR4XV07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRW5jb2RlIE5FTExZX1NBTVBMRVMgc2FtcGxlcy4gSXQgYXNzdW1lcywgdGhhdCBzYW1wbGVzIGNvbnRhaW5zIDMgKiBORUxMWV9CVUZfTEVOIHZhbHVlcworICogIEBwYXJhbSBzICAgICAgICAgICAgICAgZW5jb2RlciBjb250ZXh0CisgKiAgQHBhcmFtIG91dHB1dCAgICAgICAgICBvdXRwdXQgYnVmZmVyCisgKiAgQHBhcmFtIG91dHB1dF9zaXplICAgICBzaXplIG9mIG91dHB1dCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2Jsb2NrKE5lbGx5TW9zZXJFbmNvZGVDb250ZXh0ICpzLCB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIGludCBvdXRwdXRfc2l6ZSkKK3sKKyAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIGludCBpLCBqLCBiYW5kLCBibG9jaywgYmVzdF9pZHgsIHBvd2VyX2lkeCA9IDA7CisgICAgZmxvYXQgcG93ZXJfdmFsLCBjb2VmZiwgY29lZmZfc3VtOworICAgIGZsb2F0IHBvd3NbTkVMTFlfRklMTF9MRU5dOworICAgIGludCBiaXRzW05FTExZX0JVRl9MRU5dLCBpZHhfdGFibGVbTkVMTFlfQkFORFNdOworICAgIGZsb2F0IGNhbmRbTkVMTFlfQkFORFNdOworCisgICAgYXBwbHlfbWRjdChzKTsKKworICAgIGluaXRfcHV0X2JpdHMoJnBiLCBvdXRwdXQsIG91dHB1dF9zaXplICogOCk7CisKKyAgICBpID0gMDsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgTkVMTFlfQkFORFM7IGJhbmQrKykgeworICAgICAgICBjb2VmZl9zdW0gPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmZfbmVsbHlfYmFuZF9zaXplc190YWJsZVtiYW5kXTsgaSsrLCBqKyspIHsKKyAgICAgICAgICAgIGNvZWZmX3N1bSArPSBzLT5tZGN0X291dFtpICAgICAgICAgICAgICAgIF0gKiBzLT5tZGN0X291dFtpICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgICAgKyBzLT5tZGN0X291dFtpICsgTkVMTFlfQlVGX0xFTl0gKiBzLT5tZGN0X291dFtpICsgTkVMTFlfQlVGX0xFTl07CisgICAgICAgIH0KKyAgICAgICAgY2FuZFtiYW5kXSA9CisgICAgICAgICAgICBsb2coRkZNQVgoMS4wLCBjb2VmZl9zdW0gLyAoZmZfbmVsbHlfYmFuZF9zaXplc190YWJsZVtiYW5kXSA8PCA3KSkpICogMTAyNC4wIC8gTV9MTjI7CisgICAgfQorCisgICAgaWYgKHMtPmF2Y3R4LT50cmVsbGlzKSB7CisgICAgICAgIGdldF9leHBvbmVudF9keW5hbWljKHMsIGNhbmQsIGlkeF90YWJsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2V0X2V4cG9uZW50X2dyZWVkeShzLCBjYW5kLCBpZHhfdGFibGUpOworICAgIH0KKworICAgIGkgPSAwOworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBORUxMWV9CQU5EUzsgYmFuZCsrKSB7CisgICAgICAgIGlmIChiYW5kKSB7CisgICAgICAgICAgICBwb3dlcl9pZHggKz0gZmZfbmVsbHlfZGVsdGFfdGFibGVbaWR4X3RhYmxlW2JhbmRdXTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgNSwgaWR4X3RhYmxlW2JhbmRdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBvd2VyX2lkeCA9IGZmX25lbGx5X2luaXRfdGFibGVbaWR4X3RhYmxlWzBdXTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgNiwgaWR4X3RhYmxlWzBdKTsKKyAgICAgICAgfQorICAgICAgICBwb3dlcl92YWwgPSBwb3dfdGFibGVbcG93ZXJfaWR4ICYgMHg3RkZdIC8gKDEgPDwgKChwb3dlcl9pZHggPj4gMTEpICsgUE9XX1RBQkxFX09GRlNFVCkpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmZfbmVsbHlfYmFuZF9zaXplc190YWJsZVtiYW5kXTsgaSsrLCBqKyspIHsKKyAgICAgICAgICAgIHMtPm1kY3Rfb3V0W2ldICo9IHBvd2VyX3ZhbDsKKyAgICAgICAgICAgIHMtPm1kY3Rfb3V0W2kgKyBORUxMWV9CVUZfTEVOXSAqPSBwb3dlcl92YWw7CisgICAgICAgICAgICBwb3dzW2ldID0gcG93ZXJfaWR4OworICAgICAgICB9CisgICAgfQorCisgICAgZmZfbmVsbHlfZ2V0X3NhbXBsZV9iaXRzKHBvd3MsIGJpdHMpOworCisgICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgMjsgYmxvY2srKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkVMTFlfRklMTF9MRU47IGkrKykgeworICAgICAgICAgICAgaWYgKGJpdHNbaV0gPiAwKSB7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnRhYmxlID0gZmZfbmVsbHlfZGVxdWFudGl6YXRpb25fdGFibGUgKyAoMSA8PCBiaXRzW2ldKSAtIDE7CisgICAgICAgICAgICAgICAgY29lZmYgPSBzLT5tZGN0X291dFtibG9jayAqIE5FTExZX0JVRl9MRU4gKyBpXTsKKyAgICAgICAgICAgICAgICBiZXN0X2lkeCA9CisgICAgICAgICAgICAgICAgICAgIHF1YW50X2x1dFthdl9jbGlwICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZiAqIHF1YW50X2x1dF9tdWxbYml0c1tpXV0gKyBxdWFudF9sdXRfYWRkW2JpdHNbaV1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50X2x1dF9vZmZzZXRbYml0c1tpXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRfbHV0X29mZnNldFtiaXRzW2ldKzFdIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICldOworICAgICAgICAgICAgICAgIGlmIChmYWJzKGNvZWZmIC0gdGFibGVbYmVzdF9pZHhdKSA+IGZhYnMoY29lZmYgLSB0YWJsZVtiZXN0X2lkeCArIDFdKSkKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9pZHgrKzsKKworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgYml0c1tpXSwgYmVzdF9pZHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghYmxvY2spCisgICAgICAgICAgICBwdXRfYml0cygmcGIsIE5FTExZX0hFQURFUl9CSVRTICsgTkVMTFlfREVUQUlMX0JJVFMgLSBwdXRfYml0c19jb3VudCgmcGIpLCAwKTsKKyAgICB9CisKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworICAgIG1lbXNldChwdXRfYml0c19wdHIoJnBiKSwgMCwgb3V0cHV0ICsgb3V0cHV0X3NpemUgLSBwdXRfYml0c19wdHIoJnBiKSk7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCit7CisgICAgTmVsbHlNb3NlckVuY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAocy0+bGFzdF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtZW1jcHkocy0+YnVmLCBzLT5idWYgKyBORUxMWV9TQU1QTEVTLCBORUxMWV9CVUZfTEVOICogc2l6ZW9mKCpzLT5idWYpKTsKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgbWVtY3B5KHMtPmJ1ZiArIE5FTExZX0JVRl9MRU4sIGZyYW1lLT5kYXRhWzBdLAorICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgKiBzaXplb2YoKnMtPmJ1ZikpOworICAgICAgICBpZiAoZnJhbWUtPm5iX3NhbXBsZXMgPCBORUxMWV9TQU1QTEVTKSB7CisgICAgICAgICAgICBtZW1zZXQocy0+YnVmICsgTkVMTFlfQlVGX0xFTiArIGZyYW1lLT5uYl9zYW1wbGVzLCAwLAorICAgICAgICAgICAgICAgICAgIChORUxMWV9TQU1QTEVTIC0gZnJhbWUtPm5iX3NhbXBsZXMpICogc2l6ZW9mKCpzLT5idWYpKTsKKyAgICAgICAgICAgIGlmIChmcmFtZS0+bmJfc2FtcGxlcyA+PSBORUxMWV9CVUZfTEVOKQorICAgICAgICAgICAgICAgIHMtPmxhc3RfZnJhbWUgPSAxOworICAgICAgICB9CisgICAgICAgIGlmICgocmV0ID0gZmZfYWZfcXVldWVfYWRkKCZzLT5hZnEsIGZyYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1zZXQocy0+YnVmICsgTkVMTFlfQlVGX0xFTiwgMCwgTkVMTFlfU0FNUExFUyAqIHNpemVvZigqcy0+YnVmKSk7CisgICAgICAgIHMtPmxhc3RfZnJhbWUgPSAxOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIE5FTExZX0JMT0NLX0xFTikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBlbmNvZGVfYmxvY2socywgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIC8qIEdldCB0aGUgbmV4dCBmcmFtZSBwdHMvZHVyYXRpb24gKi8KKyAgICBmZl9hZl9xdWV1ZV9yZW1vdmUoJnMtPmFmcSwgYXZjdHgtPmZyYW1lX3NpemUsICZhdnBrdC0+cHRzLAorICAgICAgICAgICAgICAgICAgICAgICAmYXZwa3QtPmR1cmF0aW9uKTsKKworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfbmVsbHltb3Nlcl9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJuZWxseW1vc2VyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTmVsbHltb3NlciBBc2FvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX05FTExZTU9TRVIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE5lbGx5TW9zZXJFbmNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBlbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBlbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZW5jb2RlX2VuZCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSB8IENPREVDX0NBUF9ERUxBWSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL25lb24vTWFrZWZpbGUgYi9mZm1wZWcvbGliYXZjb2RlYy9uZW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwN2YxMTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9uZW9uL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK09CSlMtJChDT05GSUdfTVBFR1ZJREVPKSAgICAgICAgICArPSBuZW9uL21wZWd2aWRlby5vCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9uZW9uL21wZWd2aWRlby5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvbmVvbi9tcGVndmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTZhZTUxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbmVvbi9tcGVndmlkZW8uYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYW5zIFJ1bGxnYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSmFtZXMgWXUgPGphbWVzLnl1QGxpbmFyby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaWYgICBBUkNIX0FBUkNINjQKKyMgICBpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9jcHUuaCIKKyNlbGlmIEFSQ0hfQVJNCisjICAgaW5jbHVkZSAibGliYXZ1dGlsL2FybS9jcHUuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW8uaCIKKworc3RhdGljIHZvaWQgaW5saW5lIGZmX2RjdF91bnF1YW50aXplX2gyNjNfbmVvbihpbnQgcXNjYWxlLCBpbnQgcWFkZCwgaW50IG5Db2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrKQoreworICAgIGludDE2eDhfdCBxMHMxNiwgcTJzMTYsIHEzczE2LCBxOHMxNiwgcTEwczE2LCBxMTFzMTYsIHExM3MxNjsKKyAgICBpbnQxNng4X3QgcTE0czE2LCBxMTVzMTYsIHF6czE2OworICAgIGludDE2eDRfdCBkMHMxNiwgZDJzMTYsIGQzczE2LCBkenMxNjsKKyAgICB1aW50MTZ4OF90IHExdTE2LCBxOXUxNjsKKyAgICB1aW50MTZ4NF90IGQxdTE2OworCisgICAgZHpzMTYgPSB2ZHVwX25fczE2KDApOworICAgIHF6czE2ID0gdmR1cHFfbl9zMTYoMCk7CisKKyAgICBxMTVzMTYgPSB2ZHVwcV9uX3MxNihxc2NhbGUgPDwgMSk7CisgICAgcTE0czE2ID0gdmR1cHFfbl9zMTYocWFkZCk7CisgICAgcTEzczE2ID0gdm5lZ3FfczE2KHExNHMxNik7CisKKyAgICBpZiAobkNvZWZmcyA+IDQpIHsKKyAgICAgICAgZm9yICg7IG5Db2VmZnMgPiA4OyBuQ29lZmZzIC09IDE2LCBibG9jayArPSAxNikgeworICAgICAgICAgICAgcTBzMTYgPSB2bGQxcV9zMTYoYmxvY2spOworICAgICAgICAgICAgcTNzMTYgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodmNsdHFfczE2KHEwczE2LCBxenMxNikpOworICAgICAgICAgICAgcThzMTYgPSB2bGQxcV9zMTYoYmxvY2sgKyA4KTsKKyAgICAgICAgICAgIHExdTE2ID0gdmNlcXFfczE2KHEwczE2LCBxenMxNik7CisgICAgICAgICAgICBxMnMxNiA9IHZtdWxxX3MxNihxMHMxNiwgcTE1czE2KTsKKyAgICAgICAgICAgIHExMXMxNiA9IHZyZWludGVycHJldHFfczE2X3UxNih2Y2x0cV9zMTYocThzMTYsIHF6czE2KSk7CisgICAgICAgICAgICBxMTBzMTYgPSB2bXVscV9zMTYocThzMTYsIHExNXMxNik7CisgICAgICAgICAgICBxM3MxNiA9IHZic2xxX3MxNih2cmVpbnRlcnByZXRxX3UxNl9zMTYocTNzMTYpLCBxMTNzMTYsIHExNHMxNik7CisgICAgICAgICAgICBxMTFzMTYgPSB2YnNscV9zMTYodnJlaW50ZXJwcmV0cV91MTZfczE2KHExMXMxNiksIHExM3MxNiwgcTE0czE2KTsKKyAgICAgICAgICAgIHEyczE2ID0gdmFkZHFfczE2KHEyczE2LCBxM3MxNik7CisgICAgICAgICAgICBxOXUxNiA9IHZjZXFxX3MxNihxOHMxNiwgcXpzMTYpOworICAgICAgICAgICAgcTEwczE2ID0gdmFkZHFfczE2KHExMHMxNiwgcTExczE2KTsKKyAgICAgICAgICAgIHEwczE2ID0gdmJzbHFfczE2KHExdTE2LCBxMHMxNiwgcTJzMTYpOworICAgICAgICAgICAgcThzMTYgPSB2YnNscV9zMTYocTl1MTYsIHE4czE2LCBxMTBzMTYpOworICAgICAgICAgICAgdnN0MXFfczE2KGJsb2NrLCBxMHMxNik7CisgICAgICAgICAgICB2c3QxcV9zMTYoYmxvY2sgKyA4LCBxOHMxNik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5Db2VmZnMgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZDBzMTYgPSB2bGQxX3MxNihibG9jayk7CisgICAgZDNzMTYgPSB2cmVpbnRlcnByZXRfczE2X3UxNih2Y2x0X3MxNihkMHMxNiwgZHpzMTYpKTsKKyAgICBkMXUxNiA9IHZjZXFfczE2KGQwczE2LCBkenMxNik7CisgICAgZDJzMTYgPSB2bXVsX3MxNihkMHMxNiwgdmdldF9oaWdoX3MxNihxMTVzMTYpKTsKKyAgICBkM3MxNiA9IHZic2xfczE2KHZyZWludGVycHJldF91MTZfczE2KGQzczE2KSwKKyAgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF9zMTYocTEzczE2KSwgdmdldF9oaWdoX3MxNihxMTRzMTYpKTsKKyAgICBkMnMxNiA9IHZhZGRfczE2KGQyczE2LCBkM3MxNik7CisgICAgZDBzMTYgPSB2YnNsX3MxNihkMXUxNiwgZDBzMTYsIGQyczE2KTsKKyAgICB2c3QxX3MxNihibG9jaywgZDBzMTYpOworfQorCitzdGF0aWMgdm9pZCBkY3RfdW5xdWFudGl6ZV9oMjYzX2ludGVyX25lb24oTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgcXNjYWxlKQoreworICAgIGludCBuQ29lZmZzID0gcy0+aW50ZXJfc2NhbnRhYmxlLnJhc3Rlcl9lbmRbcy0+YmxvY2tfbGFzdF9pbmRleFtuXV07CisgICAgaW50IHFhZGQgICAgPSAocXNjYWxlIC0gMSkgfCAxOworCisgICAgZmZfZGN0X3VucXVhbnRpemVfaDI2M19uZW9uKHFzY2FsZSwgcWFkZCwgbkNvZWZmcyArIDEsIGJsb2NrKTsKK30KKworc3RhdGljIHZvaWQgZGN0X3VucXVhbnRpemVfaDI2M19pbnRyYV9uZW9uKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IHFzY2FsZSkKK3sKKyAgICBpbnQgcWFkZDsKKyAgICBpbnQgbkNvZWZmcywgYmxrMDsKKworICAgIGlmICghcy0+aDI2M19haWMpIHsKKyAgICAgICAgaWYgKG4gPCA0KQorICAgICAgICAgICAgYmxvY2tbMF0gKj0gcy0+eV9kY19zY2FsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmxvY2tbMF0gKj0gcy0+Y19kY19zY2FsZTsKKyAgICAgICAgcWFkZCA9IChxc2NhbGUgLSAxKSB8IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcWFkZCA9IDA7CisgICAgfQorCisgICAgaWYgKHMtPmFjX3ByZWQpIHsKKyAgICAgICAgbkNvZWZmcyA9IDYzOworICAgIH0gZWxzZSB7CisgICAgICAgIG5Db2VmZnMgPSBzLT5pbnRlcl9zY2FudGFibGUucmFzdGVyX2VuZFtzLT5ibG9ja19sYXN0X2luZGV4W25dXTsKKyAgICAgICAgaWYgKG5Db2VmZnMgPD0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBibGswID0gYmxvY2tbMF07CisKKyAgICBmZl9kY3RfdW5xdWFudGl6ZV9oMjYzX25lb24ocXNjYWxlLCBxYWRkLCBuQ29lZmZzICsgMSwgYmxvY2spOworCisgICAgYmxvY2tbMF0gPSBibGswOworfQorCisKK2F2X2NvbGQgdm9pZCBmZl9tcHZfY29tbW9uX2luaXRfbmVvbihNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2gyNjNfaW50cmEgPSBkY3RfdW5xdWFudGl6ZV9oMjYzX2ludHJhX25lb247CisgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2gyNjNfaW50ZXIgPSBkY3RfdW5xdWFudGl6ZV9oMjYzX2ludGVyX25lb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvbm9pc2VfYnNmLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9ub2lzZV9ic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjYwOWRlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvbm9pc2VfYnNmLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisKK3N0YXRpYyBpbnQgbm9pc2UoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50IGtleWZyYW1lKXsKKyAgICB1bnNpZ25lZCBpbnQgKnN0YXRlPSBic2ZjLT5wcml2X2RhdGE7CisgICAgaW50IGFtb3VudD0gYXJncyA/IGF0b2koYXJncykgOiAoKnN0YXRlICUgMTAwMDErMSk7CisgICAgaW50IGk7CisKKyAgICBpZihhbW91bnQgPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICpwb3V0YnVmPSBhdl9tYWxsb2MoYnVmX3NpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoISpwb3V0YnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgbWVtY3B5KCpwb3V0YnVmLCBidWYsIGJ1Zl9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgZm9yKGk9MDsgaTxidWZfc2l6ZTsgaSsrKXsKKyAgICAgICAgKCpzdGF0ZSkgKz0gKCpwb3V0YnVmKVtpXSArIDE7CisgICAgICAgIGlmKCpzdGF0ZSAlIGFtb3VudCA9PSAwKQorICAgICAgICAgICAgKCpwb3V0YnVmKVtpXSA9ICpzdGF0ZTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK0FWQml0U3RyZWFtRmlsdGVyIGZmX25vaXNlX2JzZj17CisgICAgLm5hbWUgICAgICAgICAgID0gIm5vaXNlIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoaW50KSwKKyAgICAuZmlsdGVyICAgICAgICAgPSBub2lzZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9udXYuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL251di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OGFkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9udXYuYwpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIE51cHBlbFZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBSZWltYXIgRG9lZmZpbmdlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2x6by5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJydGpwZWcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWRnJhbWUgKnBpYzsKKyAgICBpbnQgY29kZWNfZnJhbWVoZWFkZXI7CisgICAgaW50IHF1YWxpdHk7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgdW5zaWduZWQgaW50IGRlY29tcF9zaXplOworICAgIHVuc2lnbmVkIGNoYXIgKmRlY29tcF9idWY7CisgICAgdWludDMyX3QgbHFbNjRdLCBjcVs2NF07CisgICAgUlRKcGVnQ29udGV4dCBydGo7Cit9IE51dkNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGZhbGxiYWNrX2xxdWFudFtdID0geworICAgIDE2LCAgMTEsICAxMCwgIDE2LCAgMjQsICA0MCwgIDUxLCAgNjEsCisgICAgMTIsICAxMiwgIDE0LCAgMTksICAyNiwgIDU4LCAgNjAsICA1NSwKKyAgICAxNCwgIDEzLCAgMTYsICAyNCwgIDQwLCAgNTcsICA2OSwgIDU2LAorICAgIDE0LCAgMTcsICAyMiwgIDI5LCAgNTEsICA4NywgIDgwLCAgNjIsCisgICAgMTgsICAyMiwgIDM3LCAgNTYsICA2OCwgMTA5LCAxMDMsICA3NywKKyAgICAyNCwgIDM1LCAgNTUsICA2NCwgIDgxLCAxMDQsIDExMywgIDkyLAorICAgIDQ5LCAgNjQsICA3OCwgIDg3LCAxMDMsIDEyMSwgMTIwLCAxMDEsCisgICAgNzIsICA5MiwgIDk1LCAgOTgsIDExMiwgMTAwLCAxMDMsICA5OQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZmFsbGJhY2tfY3F1YW50W10gPSB7CisgICAgMTcsIDE4LCAyNCwgNDcsIDk5LCA5OSwgOTksIDk5LAorICAgIDE4LCAyMSwgMjYsIDY2LCA5OSwgOTksIDk5LCA5OSwKKyAgICAyNCwgMjYsIDU2LCA5OSwgOTksIDk5LCA5OSwgOTksCisgICAgNDcsIDY2LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksCisgICAgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OQorfTsKKworLyoqCisgKiBAYnJpZWYgY29weSBmcmFtZSBkYXRhIGZyb20gYnVmZmVyIHRvIEFWRnJhbWUsIGhhbmRsaW5nIHN0cmlkZS4KKyAqIEBwYXJhbSBmIGRlc3RpbmF0aW9uIEFWRnJhbWUKKyAqIEBwYXJhbSBzcmMgc291cmNlIGJ1ZmZlciwgZG9lcyBub3QgdXNlIGFueSBsaW5lLXN0cmlkZQorICogQHBhcmFtIHdpZHRoIHdpZHRoIG9mIHRoZSB2aWRlbyBmcmFtZQorICogQHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgdGhlIHZpZGVvIGZyYW1lCisgKi8KK3N0YXRpYyB2b2lkIGNvcHlfZnJhbWUoQVZGcmFtZSAqZiwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgQVZQaWN0dXJlIHBpYzsKKyAgICBhdnBpY3R1cmVfZmlsbCgmcGljLCBzcmMsIEFWX1BJWF9GTVRfWVVWNDIwUCwgd2lkdGgsIGhlaWdodCk7CisgICAgYXZfcGljdHVyZV9jb3B5KChBVlBpY3R1cmUgKilmLCAmcGljLCBBVl9QSVhfRk1UX1lVVjQyMFAsIHdpZHRoLCBoZWlnaHQpOworfQorCisvKioKKyAqIEBicmllZiBleHRyYWN0IHF1YW50aXphdGlvbiB0YWJsZXMgZnJvbSBjb2RlYyBkYXRhIGludG8gb3VyIGNvbnRleHQKKyAqLworc3RhdGljIGludCBnZXRfcXVhbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBOdXZDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAoc2l6ZSA8IDIgKiA2NCAqIDQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnN1ZmZpY2llbnQgcnRqcGVnIHF1YW50IGRhdGFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyssIGJ1ZiArPSA0KQorICAgICAgICBjLT5scVtpXSA9IEFWX1JMMzIoYnVmKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKywgYnVmICs9IDQpCisgICAgICAgIGMtPmNxW2ldID0gQVZfUkwzMihidWYpOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEBicmllZiBzZXQgcXVhbnRpemF0aW9uIHRhYmxlcyBmcm9tIGEgcXVhbGl0eSB2YWx1ZQorICovCitzdGF0aWMgdm9pZCBnZXRfcXVhbnRfcXVhbGl0eShOdXZDb250ZXh0ICpjLCBpbnQgcXVhbGl0eSkKK3sKKyAgICBpbnQgaTsKKyAgICBxdWFsaXR5ID0gRkZNQVgocXVhbGl0eSwgMSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgYy0+bHFbaV0gPSAoZmFsbGJhY2tfbHF1YW50W2ldIDw8IDcpIC8gcXVhbGl0eTsKKyAgICAgICAgYy0+Y3FbaV0gPSAoZmFsbGJhY2tfY3F1YW50W2ldIDw8IDcpIC8gcXVhbGl0eTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29kZWNfcmVpbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHkpCit7CisgICAgTnV2Q29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIHdpZHRoICA9IEZGQUxJR04od2lkdGgsICAyKTsKKyAgICBoZWlnaHQgPSBGRkFMSUdOKGhlaWdodCwgMik7CisgICAgaWYgKHF1YWxpdHkgPj0gMCkKKyAgICAgICAgZ2V0X3F1YW50X3F1YWxpdHkoYywgcXVhbGl0eSk7CisgICAgaWYgKHdpZHRoICE9IGMtPndpZHRoIHx8IGhlaWdodCAhPSBjLT5oZWlnaHQpIHsKKyAgICAgICAgLy8gYWxzbyByZXNlcnZlIHNwYWNlIGZvciBhIHBvc3NpYmxlIGFkZGl0aW9uYWwgaGVhZGVyCisgICAgICAgIGludCBidWZfc2l6ZSA9IGhlaWdodCAqIHdpZHRoICogMyAvIDIKKyAgICAgICAgICAgICAgICAgICAgICsgRkZNQVgoQVZfTFpPX09VVFBVVF9QQURESU5HLCBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKQorICAgICAgICAgICAgICAgICAgICAgKyBSVEpQRUdfSEVBREVSX1NJWkU7CisgICAgICAgIGlmIChidWZfc2l6ZSA+IElOVF9NQVgvOCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKGhlaWdodCwgd2lkdGgsIDAsIGF2Y3R4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYXZjdHgtPndpZHRoICA9IGMtPndpZHRoICA9IHdpZHRoOworICAgICAgICBhdmN0eC0+aGVpZ2h0ID0gYy0+aGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBhdl9mYXN0X21hbGxvYygmYy0+ZGVjb21wX2J1ZiwgJmMtPmRlY29tcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSk7CisgICAgICAgIGlmICghYy0+ZGVjb21wX2J1ZikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNhbid0IGFsbG9jYXRlIGRlY29tcHJlc3Npb24gYnVmZmVyLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGZmX3J0anBlZ19kZWNvZGVfaW5pdCgmYy0+cnRqLCBjLT53aWR0aCwgYy0+aGVpZ2h0LCBjLT5scSwgYy0+Y3EpOworICAgICAgICBhdl9mcmFtZV91bnJlZihjLT5waWMpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKHF1YWxpdHkgIT0gYy0+cXVhbGl0eSkKKyAgICAgICAgZmZfcnRqcGVnX2RlY29kZV9pbml0KCZjLT5ydGosIGMtPndpZHRoLCBjLT5oZWlnaHQsIGMtPmxxLCBjLT5jcSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBOdXZDb250ZXh0ICpjICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKnBpY3R1cmUgICA9IGRhdGE7CisgICAgaW50IG9yaWdfc2l6ZSAgICAgID0gYnVmX3NpemU7CisgICAgaW50IGtleWZyYW1lLCByZXQ7CisgICAgaW50IHNpemVfY2hhbmdlID0gMDsKKyAgICBpbnQgcmVzdWx0LCBpbml0X2ZyYW1lID0gIWF2Y3R4LT5mcmFtZV9udW1iZXI7CisgICAgZW51bSB7CisgICAgICAgIE5VVl9VTkNPTVBSRVNTRUQgID0gJzAnLAorICAgICAgICBOVVZfUlRKUEVHICAgICAgICA9ICcxJywKKyAgICAgICAgTlVWX1JUSlBFR19JTl9MWk8gPSAnMicsCisgICAgICAgIE5VVl9MWk8gICAgICAgICAgID0gJzMnLAorICAgICAgICBOVVZfQkxBQ0sgICAgICAgICA9ICdOJywKKyAgICAgICAgTlVWX0NPUFlfTEFTVCAgICAgPSAnTCcKKyAgICB9IGNvbXB0eXBlOworCisgICAgaWYgKGJ1Zl9zaXplIDwgMTIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJjb2RlZCBmcmFtZSB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvLyBjb2RlYyBkYXRhIChydGpwZWcgcXVhbnQgdGFibGVzKQorICAgIGlmIChidWZbMF0gPT0gJ0QnICYmIGJ1ZlsxXSA9PSAnUicpIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgLy8gc2tpcCByZXN0IG9mIHRoZSBmcmFtZWhlYWRlci4KKyAgICAgICAgYnVmICAgICAgID0gJmJ1ZlsxMl07CisgICAgICAgIGJ1Zl9zaXplIC09IDEyOworICAgICAgICByZXQgICAgICAgPSBnZXRfcXVhbnQoYXZjdHgsIGMsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGZmX3J0anBlZ19kZWNvZGVfaW5pdCgmYy0+cnRqLCBjLT53aWR0aCwgYy0+aGVpZ2h0LCBjLT5scSwgYy0+Y3EpOworICAgICAgICByZXR1cm4gb3JpZ19zaXplOworICAgIH0KKworICAgIGlmIChidWZfc2l6ZSA8IDEyIHx8IGJ1ZlswXSAhPSAnVicpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJub3QgYSBudXYgdmlkZW8gZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgY29tcHR5cGUgPSBidWZbMV07CisgICAgc3dpdGNoIChjb21wdHlwZSkgeworICAgIGNhc2UgTlVWX1JUSlBFR19JTl9MWk86CisgICAgY2FzZSBOVVZfUlRKUEVHOgorICAgICAgICBrZXlmcmFtZSA9ICFidWZbMl07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTlVWX0NPUFlfTEFTVDoKKyAgICAgICAga2V5ZnJhbWUgPSAwOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBrZXlmcmFtZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KK3JldHJ5OgorICAgIC8vIHNraXAgcmVzdCBvZiB0aGUgZnJhbWVoZWFkZXIuCisgICAgYnVmICAgICAgID0gJmJ1ZlsxMl07CisgICAgYnVmX3NpemUgLT0gMTI7CisgICAgaWYgKGNvbXB0eXBlID09IE5VVl9SVEpQRUdfSU5fTFpPIHx8IGNvbXB0eXBlID09IE5VVl9MWk8pIHsKKyAgICAgICAgaW50IG91dGxlbiA9IGMtPmRlY29tcF9zaXplIC0gRkZNQVgoRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSwgQVZfTFpPX09VVFBVVF9QQURESU5HKTsKKyAgICAgICAgaW50IGlubGVuICA9IGJ1Zl9zaXplOworICAgICAgICBpZiAoYXZfbHpvMXhfZGVjb2RlKGMtPmRlY29tcF9idWYsICZvdXRsZW4sIGJ1ZiwgJmlubGVuKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBkdXJpbmcgbHpvIGRlY29tcHJlc3Npb25cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnVmICAgICAgPSBjLT5kZWNvbXBfYnVmOworICAgICAgICBidWZfc2l6ZSA9IGMtPmRlY29tcF9zaXplIC0gRkZNQVgoRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSwgQVZfTFpPX09VVFBVVF9QQURESU5HKSAtIG91dGxlbjsKKyAgICAgICAgbWVtc2V0KGMtPmRlY29tcF9idWYgKyBidWZfc2l6ZSwgMCwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgfQorICAgIGlmIChjLT5jb2RlY19mcmFtZWhlYWRlcikgeworICAgICAgICBpbnQgdywgaCwgcTsKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgUlRKUEVHX0hFQURFUl9TSVpFKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBzbWFsbCBOVVYgdmlkZW8gZnJhbWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlcmUgc2VlbSB0byBleGlzdCB0d28gdmFyaWFudHMgb2YgdGhpcyBoZWFkZXI6IG9uZSBzdGFydHMgd2l0aCAnVicKKyAgICAgICAgLy8gYW5kIDUgYnl0ZXMgdW5rbm93biwgdGhlIG90aGVyIG1hdGNoZXMgY3VycmVudCBNeXRoVFYgYW5kIGlzIDQgYnl0ZXMgc2l6ZSwKKyAgICAgICAgLy8gMSBieXRlIGhlYWRlciBzaXplICg9PSAxMiksIDEgYnl0ZSB2ZXJzaW9uICg9PSAwKQorICAgICAgICBpZiAoYnVmWzBdICE9ICdWJyAmJiBBVl9STDE2KCZidWZbNF0pICE9IDB4MDAwYykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIHNlY29uZGFyeSBmcmFtZSBoZWFkZXIgKHdyb25nIGNvZGVjX3RhZz8pXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHcgPSBBVl9STDE2KCZidWZbNl0pOworICAgICAgICBoID0gQVZfUkwxNigmYnVmWzhdKTsKKyAgICAgICAgcSA9IGJ1ZlsxMF07CisgICAgICAgIGlmICgocmVzdWx0ID0gY29kZWNfcmVpbml0KGF2Y3R4LCB3LCBoLCBxKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgYnVmID0gYXZwa3QtPmRhdGE7CisgICAgICAgICAgICBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgICAgICAgICAgc2l6ZV9jaGFuZ2UgPSAxOworICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgfQorICAgICAgICBidWYgICAgICAgPSAmYnVmW1JUSlBFR19IRUFERVJfU0laRV07CisgICAgICAgIGJ1Zl9zaXplIC09IFJUSlBFR19IRUFERVJfU0laRTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZV9jaGFuZ2UgfHwga2V5ZnJhbWUpIHsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoYy0+cGljKTsKKyAgICAgICAgaW5pdF9mcmFtZSA9IDE7CisgICAgfQorCisgICAgaWYgKChyZXN1bHQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIGMtPnBpYykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoaW5pdF9mcmFtZSkgeworICAgICAgICBtZW1zZXQoYy0+cGljLT5kYXRhWzBdLCAwLCAgICBhdmN0eC0+aGVpZ2h0ICogYy0+cGljLT5saW5lc2l6ZVswXSk7CisgICAgICAgIG1lbXNldChjLT5waWMtPmRhdGFbMV0sIDB4ODAsIGF2Y3R4LT5oZWlnaHQgKiBjLT5waWMtPmxpbmVzaXplWzFdIC8gMik7CisgICAgICAgIG1lbXNldChjLT5waWMtPmRhdGFbMl0sIDB4ODAsIGF2Y3R4LT5oZWlnaHQgKiBjLT5waWMtPmxpbmVzaXplWzJdIC8gMik7CisgICAgfQorCisgICAgYy0+cGljLT5waWN0X3R5cGUgPSBrZXlmcmFtZSA/IEFWX1BJQ1RVUkVfVFlQRV9JIDogQVZfUElDVFVSRV9UWVBFX1A7CisgICAgYy0+cGljLT5rZXlfZnJhbWUgPSBrZXlmcmFtZTsKKyAgICAvLyBkZWNvbXByZXNzL2NvcHkvd2hhdGV2ZXIgZGF0YQorICAgIHN3aXRjaCAoY29tcHR5cGUpIHsKKyAgICBjYXNlIE5VVl9MWk86CisgICAgY2FzZSBOVVZfVU5DT01QUkVTU0VEOiB7CisgICAgICAgIGludCBoZWlnaHQgPSBjLT5oZWlnaHQ7CisgICAgICAgIGlmIChidWZfc2l6ZSA8IGMtPndpZHRoICogaGVpZ2h0ICogMyAvIDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5jb21wcmVzc2VkIGZyYW1lIHRvbyBzaG9ydFxuIik7CisgICAgICAgICAgICBoZWlnaHQgPSBidWZfc2l6ZSAvIGMtPndpZHRoIC8gMyAqIDI7CisgICAgICAgIH0KKyAgICAgICAgaWYoaGVpZ2h0ID4gMCkKKyAgICAgICAgICAgIGNvcHlfZnJhbWUoYy0+cGljLCBidWYsIGMtPndpZHRoLCBoZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBOVVZfUlRKUEVHX0lOX0xaTzoKKyAgICBjYXNlIE5VVl9SVEpQRUc6CisgICAgICAgIHJldCA9IGZmX3J0anBlZ19kZWNvZGVfZnJhbWVfeXV2NDIwKCZjLT5ydGosIGMtPnBpYywgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOVVZfQkxBQ0s6CisgICAgICAgIG1lbXNldChjLT5waWMtPmRhdGFbMF0sIDAsIGMtPndpZHRoICogYy0+aGVpZ2h0KTsKKyAgICAgICAgbWVtc2V0KGMtPnBpYy0+ZGF0YVsxXSwgMTI4LCBjLT53aWR0aCAqIGMtPmhlaWdodCAvIDQpOworICAgICAgICBtZW1zZXQoYy0+cGljLT5kYXRhWzJdLCAxMjgsIGMtPndpZHRoICogYy0+aGVpZ2h0IC8gNCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTlVWX0NPUFlfTEFTVDoKKyAgICAgICAgLyogbm90aGluZyBtb3JlIHRvIGRvIGhlcmUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bmtub3duIGNvbXByZXNzaW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXN1bHQgPSBhdl9mcmFtZV9yZWYocGljdHVyZSwgYy0+cGljKSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgcmV0dXJuIG9yaWdfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBOdXZDb250ZXh0ICpjICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGMtPnBpYyA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFjLT5waWMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICBjLT5kZWNvbXBfYnVmICA9IE5VTEw7CisgICAgYy0+cXVhbGl0eSAgICAgPSAtMTsKKyAgICBjLT53aWR0aCAgICAgICA9IDA7CisgICAgYy0+aGVpZ2h0ICAgICAgPSAwOworCisgICAgYy0+Y29kZWNfZnJhbWVoZWFkZXIgPSBhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdSJywgJ0onLCAnUCcsICdHJyk7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplKQorICAgICAgICBnZXRfcXVhbnQoYXZjdHgsIGMsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisKKyAgICBmZl9ydGpwZWdfaW5pdCgmYy0+cnRqLCBhdmN0eCk7CisKKyAgICBpZiAoKHJldCA9IGNvZGVjX3JlaW5pdChhdmN0eCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCAtMSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTnV2Q29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmYy0+ZGVjb21wX2J1Zik7CisgICAgYXZfZnJhbWVfZnJlZSgmYy0+cGljKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX251dl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJudXYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJOdXBwZWxWaWRlby9SVEpQRUciKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTlVWLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihOdXZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL29sZF9jb2RlY19pZHMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL29sZF9jb2RlY19pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2FhMGUwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvb2xkX2NvZGVjX2lkcy5oCkBAIC0wLDAgKzEsMzk3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19PTERfQ09ERUNfSURTX0gKKyNkZWZpbmUgQVZDT0RFQ19PTERfQ09ERUNfSURTX0gKKworLyoKKyAqIFRoaXMgaGVhZGVyIGV4aXN0cyB0byBwcmV2ZW50IG5ldyBjb2RlYyBJRHMgZnJvbSBiZWluZyBhY2NpZGVudGFsbHkgYWRkZWQgdG8KKyAqIHRoZSBkZXByZWNhdGVkIGxpc3QuCisgKiBEbyBub3QgaW5jbHVkZSBpdCBkaXJlY3RseS4gSXQgd2lsbCBiZSByZW1vdmVkIG9uIG5leHQgbWFqb3IgYnVtcAorICoKKyAqIERvIG5vdCBhZGQgbmV3IGl0ZW1zIHRvIHRoaXMgbGlzdC4gVXNlIHRoZSBBVkNvZGVjSUQgZW51bSBpbnN0ZWFkLgorICovCisKKyAgICBDT0RFQ19JRF9OT05FID0gQVZfQ09ERUNfSURfTk9ORSwKKworICAgIC8qIHZpZGVvIGNvZGVjcyAqLworICAgIENPREVDX0lEX01QRUcxVklERU8sCisgICAgQ09ERUNfSURfTVBFRzJWSURFTywgLy8vPCBwcmVmZXJyZWQgSUQgZm9yIE1QRUctMS8yIHZpZGVvIGRlY29kaW5nCisjaWYgRkZfQVBJX1hWTUMKKyAgICBDT0RFQ19JRF9NUEVHMlZJREVPX1hWTUMsCisjZW5kaWYKKyAgICBDT0RFQ19JRF9IMjYxLAorICAgIENPREVDX0lEX0gyNjMsCisgICAgQ09ERUNfSURfUlYxMCwKKyAgICBDT0RFQ19JRF9SVjIwLAorICAgIENPREVDX0lEX01KUEVHLAorICAgIENPREVDX0lEX01KUEVHQiwKKyAgICBDT0RFQ19JRF9MSlBFRywKKyAgICBDT0RFQ19JRF9TUDVYLAorICAgIENPREVDX0lEX0pQRUdMUywKKyAgICBDT0RFQ19JRF9NUEVHNCwKKyAgICBDT0RFQ19JRF9SQVdWSURFTywKKyAgICBDT0RFQ19JRF9NU01QRUc0VjEsCisgICAgQ09ERUNfSURfTVNNUEVHNFYyLAorICAgIENPREVDX0lEX01TTVBFRzRWMywKKyAgICBDT0RFQ19JRF9XTVYxLAorICAgIENPREVDX0lEX1dNVjIsCisgICAgQ09ERUNfSURfSDI2M1AsCisgICAgQ09ERUNfSURfSDI2M0ksCisgICAgQ09ERUNfSURfRkxWMSwKKyAgICBDT0RFQ19JRF9TVlExLAorICAgIENPREVDX0lEX1NWUTMsCisgICAgQ09ERUNfSURfRFZWSURFTywKKyAgICBDT0RFQ19JRF9IVUZGWVVWLAorICAgIENPREVDX0lEX0NZVVYsCisgICAgQ09ERUNfSURfSDI2NCwKKyAgICBDT0RFQ19JRF9JTkRFTzMsCisgICAgQ09ERUNfSURfVlAzLAorICAgIENPREVDX0lEX1RIRU9SQSwKKyAgICBDT0RFQ19JRF9BU1YxLAorICAgIENPREVDX0lEX0FTVjIsCisgICAgQ09ERUNfSURfRkZWMSwKKyAgICBDT0RFQ19JRF80WE0sCisgICAgQ09ERUNfSURfVkNSMSwKKyAgICBDT0RFQ19JRF9DTEpSLAorICAgIENPREVDX0lEX01ERUMsCisgICAgQ09ERUNfSURfUk9RLAorICAgIENPREVDX0lEX0lOVEVSUExBWV9WSURFTywKKyAgICBDT0RFQ19JRF9YQU5fV0MzLAorICAgIENPREVDX0lEX1hBTl9XQzQsCisgICAgQ09ERUNfSURfUlBaQSwKKyAgICBDT0RFQ19JRF9DSU5FUEFLLAorICAgIENPREVDX0lEX1dTX1ZRQSwKKyAgICBDT0RFQ19JRF9NU1JMRSwKKyAgICBDT0RFQ19JRF9NU1ZJREVPMSwKKyAgICBDT0RFQ19JRF9JRENJTiwKKyAgICBDT0RFQ19JRF84QlBTLAorICAgIENPREVDX0lEX1NNQywKKyAgICBDT0RFQ19JRF9GTElDLAorICAgIENPREVDX0lEX1RSVUVNT1RJT04xLAorICAgIENPREVDX0lEX1ZNRFZJREVPLAorICAgIENPREVDX0lEX01TWkgsCisgICAgQ09ERUNfSURfWkxJQiwKKyAgICBDT0RFQ19JRF9RVFJMRSwKKyAgICBDT0RFQ19JRF9UU0NDLAorICAgIENPREVDX0lEX1VMVEksCisgICAgQ09ERUNfSURfUURSQVcsCisgICAgQ09ERUNfSURfVklYTCwKKyAgICBDT0RFQ19JRF9RUEVHLAorICAgIENPREVDX0lEX1BORywKKyAgICBDT0RFQ19JRF9QUE0sCisgICAgQ09ERUNfSURfUEJNLAorICAgIENPREVDX0lEX1BHTSwKKyAgICBDT0RFQ19JRF9QR01ZVVYsCisgICAgQ09ERUNfSURfUEFNLAorICAgIENPREVDX0lEX0ZGVkhVRkYsCisgICAgQ09ERUNfSURfUlYzMCwKKyAgICBDT0RFQ19JRF9SVjQwLAorICAgIENPREVDX0lEX1ZDMSwKKyAgICBDT0RFQ19JRF9XTVYzLAorICAgIENPREVDX0lEX0xPQ08sCisgICAgQ09ERUNfSURfV05WMSwKKyAgICBDT0RFQ19JRF9BQVNDLAorICAgIENPREVDX0lEX0lOREVPMiwKKyAgICBDT0RFQ19JRF9GUkFQUywKKyAgICBDT0RFQ19JRF9UUlVFTU9USU9OMiwKKyAgICBDT0RFQ19JRF9CTVAsCisgICAgQ09ERUNfSURfQ1NDRCwKKyAgICBDT0RFQ19JRF9NTVZJREVPLAorICAgIENPREVDX0lEX1pNQlYsCisgICAgQ09ERUNfSURfQVZTLAorICAgIENPREVDX0lEX1NNQUNLVklERU8sCisgICAgQ09ERUNfSURfTlVWLAorICAgIENPREVDX0lEX0tNVkMsCisgICAgQ09ERUNfSURfRkxBU0hTViwKKyAgICBDT0RFQ19JRF9DQVZTLAorICAgIENPREVDX0lEX0pQRUcyMDAwLAorICAgIENPREVDX0lEX1ZNTkMsCisgICAgQ09ERUNfSURfVlA1LAorICAgIENPREVDX0lEX1ZQNiwKKyAgICBDT0RFQ19JRF9WUDZGLAorICAgIENPREVDX0lEX1RBUkdBLAorICAgIENPREVDX0lEX0RTSUNJTlZJREVPLAorICAgIENPREVDX0lEX1RJRVJURVhTRVFWSURFTywKKyAgICBDT0RFQ19JRF9USUZGLAorICAgIENPREVDX0lEX0dJRiwKKyAgICBDT0RFQ19JRF9EWEEsCisgICAgQ09ERUNfSURfRE5YSEQsCisgICAgQ09ERUNfSURfVEhQLAorICAgIENPREVDX0lEX1NHSSwKKyAgICBDT0RFQ19JRF9DOTMsCisgICAgQ09ERUNfSURfQkVUSFNPRlRWSUQsCisgICAgQ09ERUNfSURfUFRYLAorICAgIENPREVDX0lEX1RYRCwKKyAgICBDT0RFQ19JRF9WUDZBLAorICAgIENPREVDX0lEX0FNViwKKyAgICBDT0RFQ19JRF9WQiwKKyAgICBDT0RFQ19JRF9QQ1gsCisgICAgQ09ERUNfSURfU1VOUkFTVCwKKyAgICBDT0RFQ19JRF9JTkRFTzQsCisgICAgQ09ERUNfSURfSU5ERU81LAorICAgIENPREVDX0lEX01JTUlDLAorICAgIENPREVDX0lEX1JMMiwKKyAgICBDT0RFQ19JRF9FU0NBUEUxMjQsCisgICAgQ09ERUNfSURfRElSQUMsCisgICAgQ09ERUNfSURfQkZJLAorICAgIENPREVDX0lEX0NNViwKKyAgICBDT0RFQ19JRF9NT1RJT05QSVhFTFMsCisgICAgQ09ERUNfSURfVEdWLAorICAgIENPREVDX0lEX1RHUSwKKyAgICBDT0RFQ19JRF9UUUksCisgICAgQ09ERUNfSURfQVVSQSwKKyAgICBDT0RFQ19JRF9BVVJBMiwKKyAgICBDT0RFQ19JRF9WMjEwWCwKKyAgICBDT0RFQ19JRF9UTVYsCisgICAgQ09ERUNfSURfVjIxMCwKKyAgICBDT0RFQ19JRF9EUFgsCisgICAgQ09ERUNfSURfTUFELAorICAgIENPREVDX0lEX0ZSV1UsCisgICAgQ09ERUNfSURfRkxBU0hTVjIsCisgICAgQ09ERUNfSURfQ0RHUkFQSElDUywKKyAgICBDT0RFQ19JRF9SMjEwLAorICAgIENPREVDX0lEX0FOTSwKKyAgICBDT0RFQ19JRF9CSU5LVklERU8sCisgICAgQ09ERUNfSURfSUZGX0lMQk0sCisgICAgQ09ERUNfSURfSUZGX0JZVEVSVU4xLAorICAgIENPREVDX0lEX0tHVjEsCisgICAgQ09ERUNfSURfWU9QLAorICAgIENPREVDX0lEX1ZQOCwKKyAgICBDT0RFQ19JRF9QSUNUT1IsCisgICAgQ09ERUNfSURfQU5TSSwKKyAgICBDT0RFQ19JRF9BNjRfTVVMVEksCisgICAgQ09ERUNfSURfQTY0X01VTFRJNSwKKyAgICBDT0RFQ19JRF9SMTBLLAorICAgIENPREVDX0lEX01YUEVHLAorICAgIENPREVDX0lEX0xBR0FSSVRILAorICAgIENPREVDX0lEX1BST1JFUywKKyAgICBDT0RFQ19JRF9KViwKKyAgICBDT0RFQ19JRF9ERkEsCisgICAgQ09ERUNfSURfV01WM0lNQUdFLAorICAgIENPREVDX0lEX1ZDMUlNQUdFLAorICAgIENPREVDX0lEX1VUVklERU8sCisgICAgQ09ERUNfSURfQk1WX1ZJREVPLAorICAgIENPREVDX0lEX1ZCTEUsCisgICAgQ09ERUNfSURfRFhUT1JZLAorICAgIENPREVDX0lEX1Y0MTAsCisgICAgQ09ERUNfSURfWFdELAorICAgIENPREVDX0lEX0NEWEwsCisgICAgQ09ERUNfSURfWEJNLAorICAgIENPREVDX0lEX1pFUk9DT0RFQywKKyAgICBDT0RFQ19JRF9NU1MxLAorICAgIENPREVDX0lEX01TQTEsCisgICAgQ09ERUNfSURfVFNDQzIsCisgICAgQ09ERUNfSURfTVRTMiwKKyAgICBDT0RFQ19JRF9DTExDLAorICAgIENPREVDX0lEX1k0MVAgICAgICAgPSBNS0JFVEFHKCdZJywnNCcsJzEnLCdQJyksCisgICAgQ09ERUNfSURfRVNDQVBFMTMwICA9IE1LQkVUQUcoJ0UnLCcxJywnMycsJzAnKSwKKyAgICBDT0RFQ19JRF9FWFIgICAgICAgID0gTUtCRVRBRygnMCcsJ0UnLCdYJywnUicpLAorICAgIENPREVDX0lEX0FWUlAgICAgICAgPSBNS0JFVEFHKCdBJywnVicsJ1InLCdQJyksCisKKyAgICBDT0RFQ19JRF9HMk0gICAgICAgID0gTUtCRVRBRyggMCAsJ0cnLCcyJywnTScpLAorICAgIENPREVDX0lEX0FWVUkgICAgICAgPSBNS0JFVEFHKCdBJywnVicsJ1UnLCdJJyksCisgICAgQ09ERUNfSURfQVlVViAgICAgICA9IE1LQkVUQUcoJ0EnLCdZJywnVScsJ1YnKSwKKyAgICBDT0RFQ19JRF9WMzA4ICAgICAgID0gTUtCRVRBRygnVicsJzMnLCcwJywnOCcpLAorICAgIENPREVDX0lEX1Y0MDggICAgICAgPSBNS0JFVEFHKCdWJywnNCcsJzAnLCc4JyksCisgICAgQ09ERUNfSURfWVVWNCAgICAgICA9IE1LQkVUQUcoJ1knLCdVJywnVicsJzQnKSwKKyAgICBDT0RFQ19JRF9TQU5NICAgICAgID0gTUtCRVRBRygnUycsJ0EnLCdOJywnTScpLAorICAgIENPREVDX0lEX1BBRl9WSURFTyAgPSBNS0JFVEFHKCdQJywnQScsJ0YnLCdWJyksCisgICAgQ09ERUNfSURfU05PVyAgICAgICA9IEFWX0NPREVDX0lEX1NOT1csCisKKyAgICAvKiB2YXJpb3VzIFBDTSAiY29kZWNzIiAqLworICAgIENPREVDX0lEX0ZJUlNUX0FVRElPID0gMHgxMDAwMCwgICAgIC8vLzwgQSBkdW1teSBpZCBwb2ludGluZyBhdCB0aGUgc3RhcnQgb2YgYXVkaW8gY29kZWNzCisgICAgQ09ERUNfSURfUENNX1MxNkxFID0gMHgxMDAwMCwKKyAgICBDT0RFQ19JRF9QQ01fUzE2QkUsCisgICAgQ09ERUNfSURfUENNX1UxNkxFLAorICAgIENPREVDX0lEX1BDTV9VMTZCRSwKKyAgICBDT0RFQ19JRF9QQ01fUzgsCisgICAgQ09ERUNfSURfUENNX1U4LAorICAgIENPREVDX0lEX1BDTV9NVUxBVywKKyAgICBDT0RFQ19JRF9QQ01fQUxBVywKKyAgICBDT0RFQ19JRF9QQ01fUzMyTEUsCisgICAgQ09ERUNfSURfUENNX1MzMkJFLAorICAgIENPREVDX0lEX1BDTV9VMzJMRSwKKyAgICBDT0RFQ19JRF9QQ01fVTMyQkUsCisgICAgQ09ERUNfSURfUENNX1MyNExFLAorICAgIENPREVDX0lEX1BDTV9TMjRCRSwKKyAgICBDT0RFQ19JRF9QQ01fVTI0TEUsCisgICAgQ09ERUNfSURfUENNX1UyNEJFLAorICAgIENPREVDX0lEX1BDTV9TMjREQVVELAorICAgIENPREVDX0lEX1BDTV9aT1JLLAorICAgIENPREVDX0lEX1BDTV9TMTZMRV9QTEFOQVIsCisgICAgQ09ERUNfSURfUENNX0RWRCwKKyAgICBDT0RFQ19JRF9QQ01fRjMyQkUsCisgICAgQ09ERUNfSURfUENNX0YzMkxFLAorICAgIENPREVDX0lEX1BDTV9GNjRCRSwKKyAgICBDT0RFQ19JRF9QQ01fRjY0TEUsCisgICAgQ09ERUNfSURfUENNX0JMVVJBWSwKKyAgICBDT0RFQ19JRF9QQ01fTFhGLAorICAgIENPREVDX0lEX1MzMDJNLAorICAgIENPREVDX0lEX1BDTV9TOF9QTEFOQVIsCisKKyAgICAvKiB2YXJpb3VzIEFEUENNIGNvZGVjcyAqLworICAgIENPREVDX0lEX0FEUENNX0lNQV9RVCA9IDB4MTEwMDAsCisgICAgQ09ERUNfSURfQURQQ01fSU1BX1dBViwKKyAgICBDT0RFQ19JRF9BRFBDTV9JTUFfREszLAorICAgIENPREVDX0lEX0FEUENNX0lNQV9ESzQsCisgICAgQ09ERUNfSURfQURQQ01fSU1BX1dTLAorICAgIENPREVDX0lEX0FEUENNX0lNQV9TTUpQRUcsCisgICAgQ09ERUNfSURfQURQQ01fTVMsCisgICAgQ09ERUNfSURfQURQQ01fNFhNLAorICAgIENPREVDX0lEX0FEUENNX1hBLAorICAgIENPREVDX0lEX0FEUENNX0FEWCwKKyAgICBDT0RFQ19JRF9BRFBDTV9FQSwKKyAgICBDT0RFQ19JRF9BRFBDTV9HNzI2LAorICAgIENPREVDX0lEX0FEUENNX0NULAorICAgIENPREVDX0lEX0FEUENNX1NXRiwKKyAgICBDT0RFQ19JRF9BRFBDTV9ZQU1BSEEsCisgICAgQ09ERUNfSURfQURQQ01fU0JQUk9fNCwKKyAgICBDT0RFQ19JRF9BRFBDTV9TQlBST18zLAorICAgIENPREVDX0lEX0FEUENNX1NCUFJPXzIsCisgICAgQ09ERUNfSURfQURQQ01fVEhQLAorICAgIENPREVDX0lEX0FEUENNX0lNQV9BTVYsCisgICAgQ09ERUNfSURfQURQQ01fRUFfUjEsCisgICAgQ09ERUNfSURfQURQQ01fRUFfUjMsCisgICAgQ09ERUNfSURfQURQQ01fRUFfUjIsCisgICAgQ09ERUNfSURfQURQQ01fSU1BX0VBX1NFQUQsCisgICAgQ09ERUNfSURfQURQQ01fSU1BX0VBX0VBQ1MsCisgICAgQ09ERUNfSURfQURQQ01fRUFfWEFTLAorICAgIENPREVDX0lEX0FEUENNX0VBX01BWElTX1hBLAorICAgIENPREVDX0lEX0FEUENNX0lNQV9JU1MsCisgICAgQ09ERUNfSURfQURQQ01fRzcyMiwKKyAgICBDT0RFQ19JRF9BRFBDTV9JTUFfQVBDLAorICAgIENPREVDX0lEX1ZJTUEgICAgICAgPSBNS0JFVEFHKCdWJywnSScsJ00nLCdBJyksCisKKyAgICAvKiBBTVIgKi8KKyAgICBDT0RFQ19JRF9BTVJfTkIgPSAweDEyMDAwLAorICAgIENPREVDX0lEX0FNUl9XQiwKKworICAgIC8qIFJlYWxBdWRpbyBjb2RlY3MqLworICAgIENPREVDX0lEX1JBXzE0NCA9IDB4MTMwMDAsCisgICAgQ09ERUNfSURfUkFfMjg4LAorCisgICAgLyogdmFyaW91cyBEUENNIGNvZGVjcyAqLworICAgIENPREVDX0lEX1JPUV9EUENNID0gMHgxNDAwMCwKKyAgICBDT0RFQ19JRF9JTlRFUlBMQVlfRFBDTSwKKyAgICBDT0RFQ19JRF9YQU5fRFBDTSwKKyAgICBDT0RFQ19JRF9TT0xfRFBDTSwKKworICAgIC8qIGF1ZGlvIGNvZGVjcyAqLworICAgIENPREVDX0lEX01QMiA9IDB4MTUwMDAsCisgICAgQ09ERUNfSURfTVAzLCAvLy88IHByZWZlcnJlZCBJRCBmb3IgZGVjb2RpbmcgTVBFRyBhdWRpbyBsYXllciAxLCAyIG9yIDMKKyAgICBDT0RFQ19JRF9BQUMsCisgICAgQ09ERUNfSURfQUMzLAorICAgIENPREVDX0lEX0RUUywKKyAgICBDT0RFQ19JRF9WT1JCSVMsCisgICAgQ09ERUNfSURfRFZBVURJTywKKyAgICBDT0RFQ19JRF9XTUFWMSwKKyAgICBDT0RFQ19JRF9XTUFWMiwKKyAgICBDT0RFQ19JRF9NQUNFMywKKyAgICBDT0RFQ19JRF9NQUNFNiwKKyAgICBDT0RFQ19JRF9WTURBVURJTywKKyAgICBDT0RFQ19JRF9GTEFDLAorICAgIENPREVDX0lEX01QM0FEVSwKKyAgICBDT0RFQ19JRF9NUDNPTjQsCisgICAgQ09ERUNfSURfU0hPUlRFTiwKKyAgICBDT0RFQ19JRF9BTEFDLAorICAgIENPREVDX0lEX1dFU1RXT09EX1NORDEsCisgICAgQ09ERUNfSURfR1NNLCAvLy88IGFzIGluIEJlcmxpbiB0b2FzdCBmb3JtYXQKKyAgICBDT0RFQ19JRF9RRE0yLAorICAgIENPREVDX0lEX0NPT0ssCisgICAgQ09ERUNfSURfVFJVRVNQRUVDSCwKKyAgICBDT0RFQ19JRF9UVEEsCisgICAgQ09ERUNfSURfU01BQ0tBVURJTywKKyAgICBDT0RFQ19JRF9RQ0VMUCwKKyAgICBDT0RFQ19JRF9XQVZQQUNLLAorICAgIENPREVDX0lEX0RTSUNJTkFVRElPLAorICAgIENPREVDX0lEX0lNQywKKyAgICBDT0RFQ19JRF9NVVNFUEFDSzcsCisgICAgQ09ERUNfSURfTUxQLAorICAgIENPREVDX0lEX0dTTV9NUywgLyogYXMgZm91bmQgaW4gV0FWICovCisgICAgQ09ERUNfSURfQVRSQUMzLAorICAgIENPREVDX0lEX1ZPWFdBUkUsCisgICAgQ09ERUNfSURfQVBFLAorICAgIENPREVDX0lEX05FTExZTU9TRVIsCisgICAgQ09ERUNfSURfTVVTRVBBQ0s4LAorICAgIENPREVDX0lEX1NQRUVYLAorICAgIENPREVDX0lEX1dNQVZPSUNFLAorICAgIENPREVDX0lEX1dNQVBSTywKKyAgICBDT0RFQ19JRF9XTUFMT1NTTEVTUywKKyAgICBDT0RFQ19JRF9BVFJBQzNQLAorICAgIENPREVDX0lEX0VBQzMsCisgICAgQ09ERUNfSURfU0lQUiwKKyAgICBDT0RFQ19JRF9NUDEsCisgICAgQ09ERUNfSURfVFdJTlZRLAorICAgIENPREVDX0lEX1RSVUVIRCwKKyAgICBDT0RFQ19JRF9NUDRBTFMsCisgICAgQ09ERUNfSURfQVRSQUMxLAorICAgIENPREVDX0lEX0JJTktBVURJT19SREZULAorICAgIENPREVDX0lEX0JJTktBVURJT19EQ1QsCisgICAgQ09ERUNfSURfQUFDX0xBVE0sCisgICAgQ09ERUNfSURfUURNQywKKyAgICBDT0RFQ19JRF9DRUxULAorICAgIENPREVDX0lEX0c3MjNfMSwKKyAgICBDT0RFQ19JRF9HNzI5LAorICAgIENPREVDX0lEXzhTVlhfRVhQLAorICAgIENPREVDX0lEXzhTVlhfRklCLAorICAgIENPREVDX0lEX0JNVl9BVURJTywKKyAgICBDT0RFQ19JRF9SQUxGLAorICAgIENPREVDX0lEX0lBQywKKyAgICBDT0RFQ19JRF9JTEJDLAorICAgIENPREVDX0lEX0ZGV0FWRVNZTlRIID0gTUtCRVRBRygnRicsJ0YnLCdXJywnUycpLAorICAgIENPREVDX0lEX1NPTklDICAgICAgID0gTUtCRVRBRygnUycsJ08nLCdOJywnQycpLAorICAgIENPREVDX0lEX1NPTklDX0xTICAgID0gTUtCRVRBRygnUycsJ08nLCdOJywnTCcpLAorICAgIENPREVDX0lEX1BBRl9BVURJTyAgID0gTUtCRVRBRygnUCcsJ0EnLCdGJywnQScpLAorICAgIENPREVDX0lEX09QVVMgICAgICAgID0gTUtCRVRBRygnTycsJ1AnLCdVJywnUycpLAorCisgICAgLyogc3VidGl0bGUgY29kZWNzICovCisgICAgQ09ERUNfSURfRklSU1RfU1VCVElUTEUgPSAweDE3MDAwLCAgICAgICAgICAvLy88IEEgZHVtbXkgSUQgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mIHN1YnRpdGxlIGNvZGVjcy4KKyAgICBDT0RFQ19JRF9EVkRfU1VCVElUTEUgPSAweDE3MDAwLAorICAgIENPREVDX0lEX0RWQl9TVUJUSVRMRSwKKyAgICBDT0RFQ19JRF9URVhULCAgLy8vPCByYXcgVVRGLTggdGV4dAorICAgIENPREVDX0lEX1hTVUIsCisgICAgQ09ERUNfSURfU1NBLAorICAgIENPREVDX0lEX01PVl9URVhULAorICAgIENPREVDX0lEX0hETVZfUEdTX1NVQlRJVExFLAorICAgIENPREVDX0lEX0RWQl9URUxFVEVYVCwKKyAgICBDT0RFQ19JRF9TUlQsCisgICAgQ09ERUNfSURfTUlDUk9EVkQgICA9IE1LQkVUQUcoJ20nLCdEJywnVicsJ0QnKSwKKyAgICBDT0RFQ19JRF9FSUFfNjA4ICAgID0gTUtCRVRBRygnYycsJzYnLCcwJywnOCcpLAorICAgIENPREVDX0lEX0pBQ09TVUIgICAgPSBNS0JFVEFHKCdKJywnUycsJ1UnLCdCJyksCisgICAgQ09ERUNfSURfU0FNSSAgICAgICA9IE1LQkVUQUcoJ1MnLCdBJywnTScsJ0knKSwKKyAgICBDT0RFQ19JRF9SRUFMVEVYVCAgID0gTUtCRVRBRygnUicsJ1QnLCdYJywnVCcpLAorICAgIENPREVDX0lEX1NVQlZJRVdFUiAgPSBNS0JFVEFHKCdTJywndScsJ2InLCdWJyksCisKKyAgICAvKiBvdGhlciBzcGVjaWZpYyBraW5kIG9mIGNvZGVjcyAoZ2VuZXJhbGx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzKSAqLworICAgIENPREVDX0lEX0ZJUlNUX1VOS05PV04gPSAweDE4MDAwLCAgICAgICAgICAgLy8vPCBBIGR1bW15IElEIHBvaW50aW5nIGF0IHRoZSBzdGFydCBvZiB2YXJpb3VzIGZha2UgY29kZWNzLgorICAgIENPREVDX0lEX1RURiA9IDB4MTgwMDAsCisgICAgQ09ERUNfSURfQklOVEVYVCAgICA9IE1LQkVUQUcoJ0InLCdUJywnWCcsJ1QnKSwKKyAgICBDT0RFQ19JRF9YQklOICAgICAgID0gTUtCRVRBRygnWCcsJ0InLCdJJywnTicpLAorICAgIENPREVDX0lEX0lERiAgICAgICAgPSBNS0JFVEFHKCAwICwnSScsJ0QnLCdGJyksCisgICAgQ09ERUNfSURfT1RGICAgICAgICA9IE1LQkVUQUcoIDAgLCdPJywnVCcsJ0YnKSwKKworICAgIENPREVDX0lEX1BST0JFID0gMHgxOTAwMCwgLy8vPCBjb2RlY19pZCBpcyBub3Qga25vd24gKGxpa2UgQ09ERUNfSURfTk9ORSkgYnV0IGxhdmYgc2hvdWxkIGF0dGVtcHQgdG8gaWRlbnRpZnkgaXQKKworICAgIENPREVDX0lEX01QRUcyVFMgPSAweDIwMDAwLCAvKio8IF9GQUtFXyBjb2RlYyB0byBpbmRpY2F0ZSBhIHJhdyBNUEVHLTIgVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdHJlYW0gKG9ubHkgdXNlZCBieSBsaWJhdmZvcm1hdCkgKi8KKyAgICBDT0RFQ19JRF9NUEVHNFNZU1RFTVMgPSAweDIwMDAxLCAvKio8IF9GQUtFXyBjb2RlYyB0byBpbmRpY2F0ZSBhIE1QRUctNCBTeXN0ZW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RyZWFtIChvbmx5IHVzZWQgYnkgbGliYXZmb3JtYXQpICovCisgICAgQ09ERUNfSURfRkZNRVRBREFUQSA9IDB4MjEwMDAsICAgLy8vPCBEdW1teSBjb2RlYyBmb3Igc3RyZWFtcyBjb250YWluaW5nIG9ubHkgbWV0YWRhdGEgaW5mb3JtYXRpb24uCisKKyNlbmRpZiAvKiBBVkNPREVDX09MRF9DT0RFQ19JRFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvb24yYXZjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9vbjJhdmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTk3N2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvb24yYXZjLmMKQEAgLTAsMCArMSwxMDIzIEBACisvKgorICogT24yIEF1ZGlvIGZvciBWaWRlbyBDb2RlYyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorCisjaW5jbHVkZSAib24yYXZjZGF0YS5oIgorCisjZGVmaW5lIE9OMkFWQ19TVUJGUkFNRV9TSVpFICAgMTAyNAorCitlbnVtIFdpbmRvd1R5cGVzIHsKKyAgICBXSU5ET1dfVFlQRV9MT05HICAgICAgID0gMCwKKyAgICBXSU5ET1dfVFlQRV9MT05HX1NUT1AsCisgICAgV0lORE9XX1RZUEVfTE9OR19TVEFSVCwKKyAgICBXSU5ET1dfVFlQRV84U0hPUlQgICAgID0gMywKKyAgICBXSU5ET1dfVFlQRV9FWFQ0LAorICAgIFdJTkRPV19UWVBFX0VYVDUsCisgICAgV0lORE9XX1RZUEVfRVhUNiwKKyAgICBXSU5ET1dfVFlQRV9FWFQ3LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgT24yQVZDQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOworICAgIEZGVENvbnRleHQgbWRjdCwgbWRjdF9oYWxmLCBtZGN0X3NtYWxsOworICAgIEZGVENvbnRleHQgZmZ0MTI4LCBmZnQyNTYsIGZmdDUxMiwgZmZ0MTAyNDsKKyAgICB2b2lkICgqd3RmKShzdHJ1Y3QgT24yQVZDQ29udGV4dCAqY3R4LCBmbG9hdCAqb3V0LCBmbG9hdCAqaW4sIGludCBzaXplKTsKKworICAgIGludCBpc19hdjUwMDsKKworICAgIGNvbnN0IE9uMkFWQ01vZGUgKm1vZGVzOworICAgIGludCB3aW5kb3dfdHlwZSwgcHJldl93aW5kb3dfdHlwZTsKKyAgICBpbnQgbnVtX3dpbmRvd3MsIG51bV9iYW5kczsKKyAgICBpbnQgYml0c19wZXJfc2VjdGlvbjsKKyAgICBjb25zdCBpbnQgKmJhbmRfc3RhcnQ7CisKKyAgICBpbnQgZ3JvdXBpbmdbOF07CisgICAgaW50IG1zX3ByZXNlbnQ7CisgICAgaW50IG1zX2luZm9bT04yQVZDX01BWF9CQU5EU107CisKKyAgICBpbnQgaXNfbG9uZzsKKworICAgIHVpbnQ4X3QgYmFuZF90eXBlW09OMkFWQ19NQVhfQkFORFNdOworICAgIHVpbnQ4X3QgYmFuZF9ydW5fZW5kW09OMkFWQ19NQVhfQkFORFNdOworICAgIGludCAgICAgbnVtX3NlY3Rpb25zOworCisgICAgZmxvYXQgYmFuZF9zY2FsZXNbT04yQVZDX01BWF9CQU5EU107CisKKyAgICBWTEMgc2NhbGVfZGlmZjsKKyAgICBWTEMgY2JfdmxjWzE2XTsKKworICAgIGZsb2F0IHNjYWxlX3RhYlsxMjhdOworCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgY29lZmZzKVsyXVtPTjJBVkNfU1VCRlJBTUVfU0laRV07CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgZGVsYXkpIFsyXVtPTjJBVkNfU1VCRlJBTUVfU0laRV07CisKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCB0ZW1wKSAgICAgW09OMkFWQ19TVUJGUkFNRV9TSVpFICogMl07CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgbWRjdF9idWYpIFtPTjJBVkNfU1VCRlJBTUVfU0laRV07CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgbG9uZ193aW4pIFtPTjJBVkNfU1VCRlJBTUVfU0laRV07CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgc2hvcnRfd2luKVtPTjJBVkNfU1VCRlJBTUVfU0laRSAvIDhdOworfSBPbjJBVkNDb250ZXh0OworCitzdGF0aWMgdm9pZCBvbjJhdmNfcmVhZF9tc19pbmZvKE9uMkFWQ0NvbnRleHQgKmMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCB3LCBiLCBiYW5kX29mZiA9IDA7CisKKyAgICBjLT5tc19wcmVzZW50ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAoIWMtPm1zX3ByZXNlbnQpCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKHcgPSAwOyB3IDwgYy0+bnVtX3dpbmRvd3M7IHcrKykgeworICAgICAgICBpZiAoIWMtPmdyb3VwaW5nW3ddKSB7CisgICAgICAgICAgICBtZW1jcHkoYy0+bXNfaW5mbyArIGJhbmRfb2ZmLAorICAgICAgICAgICAgICAgICAgIGMtPm1zX2luZm8gKyBiYW5kX29mZiAtIGMtPm51bV9iYW5kcywKKyAgICAgICAgICAgICAgICAgICBjLT5udW1fYmFuZHMgKiBzaXplb2YoKmMtPm1zX2luZm8pKTsKKyAgICAgICAgICAgIGJhbmRfb2ZmICs9IGMtPm51bV9iYW5kczsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoYiA9IDA7IGIgPCBjLT5udW1fYmFuZHM7IGIrKykKKyAgICAgICAgICAgIGMtPm1zX2luZm9bYmFuZF9vZmYrK10gPSBnZXRfYml0czEoZ2IpOworICAgIH0KK30KKworLy8gZG8gbm90IHNlZSBUYWJsZSAxNyBpbiBJU08vSUVDIDEzODE4LTcKK3N0YXRpYyBpbnQgb24yYXZjX2RlY29kZV9iYW5kX3R5cGVzKE9uMkFWQ0NvbnRleHQgKmMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBiaXRzX3Blcl9zZWN0ID0gYy0+aXNfbG9uZyA/IDUgOiAzOworICAgIGludCBlc2NfdmFsID0gKDEgPDwgYml0c19wZXJfc2VjdCkgLSAxOworICAgIGludCBudW1fYmFuZHMgPSBjLT5udW1fYmFuZHMgKiBjLT5udW1fd2luZG93czsKKyAgICBpbnQgYmFuZCA9IDAsIGksIGJhbmRfdHlwZSwgcnVuX2xlbiwgcnVuOworCisgICAgd2hpbGUgKGJhbmQgPCBudW1fYmFuZHMpIHsKKyAgICAgICAgYmFuZF90eXBlID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBydW5fbGVuICAgPSAxOworICAgICAgICBkbyB7CisgICAgICAgICAgICBydW4gPSBnZXRfYml0cyhnYiwgYml0c19wZXJfc2VjdCk7CisgICAgICAgICAgICBydW5fbGVuICs9IHJ1bjsKKyAgICAgICAgfSB3aGlsZSAocnVuID09IGVzY192YWwpOworICAgICAgICBpZiAoYmFuZCArIHJ1bl9sZW4gPiBudW1fYmFuZHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBiYW5kIHR5cGUgcnVuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IGJhbmQ7IGkgPCBiYW5kICsgcnVuX2xlbjsgaSsrKSB7CisgICAgICAgICAgICBjLT5iYW5kX3R5cGVbaV0gICAgPSBiYW5kX3R5cGU7CisgICAgICAgICAgICBjLT5iYW5kX3J1bl9lbmRbaV0gPSBiYW5kICsgcnVuX2xlbjsKKyAgICAgICAgfQorICAgICAgICBiYW5kICs9IHJ1bl9sZW47CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGNvbXBsZXRlbHkgbm90IGxpa2UgVGFibGUgMTggaW4gSVNPL0lFQyAxMzgxOC03CisvLyAobm8gaW50ZW5zaXR5IHN0ZXJlbywgZGlmZmVyZW50IGNvZGluZyBmb3IgdGhlIGZpcnN0IGNvZWZmaWNpZW50KQorc3RhdGljIGludCBvbjJhdmNfZGVjb2RlX2JhbmRfc2NhbGVzKE9uMkFWQ0NvbnRleHQgKmMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCB3LCB3MiwgYiwgc2NhbGUsIGZpcnN0ID0gMTsKKyAgICBpbnQgYmFuZF9vZmYgPSAwOworCisgICAgZm9yICh3ID0gMDsgdyA8IGMtPm51bV93aW5kb3dzOyB3KyspIHsKKyAgICAgICAgaWYgKCFjLT5ncm91cGluZ1t3XSkgeworICAgICAgICAgICAgbWVtY3B5KGMtPmJhbmRfc2NhbGVzICsgYmFuZF9vZmYsCisgICAgICAgICAgICAgICAgICAgYy0+YmFuZF9zY2FsZXMgKyBiYW5kX29mZiAtIGMtPm51bV9iYW5kcywKKyAgICAgICAgICAgICAgICAgICBjLT5udW1fYmFuZHMgKiBzaXplb2YoKmMtPmJhbmRfc2NhbGVzKSk7CisgICAgICAgICAgICBiYW5kX29mZiArPSBjLT5udW1fYmFuZHM7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGIgPSAwOyBiIDwgYy0+bnVtX2JhbmRzOyBiKyspIHsKKyAgICAgICAgICAgIGlmICghYy0+YmFuZF90eXBlW2JhbmRfb2ZmXSkgeworICAgICAgICAgICAgICAgIGludCBhbGxfemVybyA9IDE7CisgICAgICAgICAgICAgICAgZm9yICh3MiA9IHcgKyAxOyB3MiA8IGMtPm51bV93aW5kb3dzOyB3MisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjLT5ncm91cGluZ1t3Ml0pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMtPmJhbmRfdHlwZVt3MiAqIGMtPm51bV9iYW5kcyArIGJdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxfemVybyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYWxsX3plcm8pIHsKKyAgICAgICAgICAgICAgICAgICAgYy0+YmFuZF9zY2FsZXNbYmFuZF9vZmYrK10gPSAwOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBzY2FsZSA9IGdldF9iaXRzKGdiLCA3KTsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNjYWxlICs9IGdldF92bGMyKGdiLCBjLT5zY2FsZV9kaWZmLnRhYmxlLCA5LCAzKSAtIDYwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNjYWxlIDwgMCB8fCBzY2FsZSA+IDEyNykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzY2FsZSB2YWx1ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+YmFuZF9zY2FsZXNbYmFuZF9vZmYrK10gPSBjLT5zY2FsZV90YWJbc2NhbGVdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgZmxvYXQgb24yYXZjX3NjYWxlKGludCB2LCBmbG9hdCBzY2FsZSkKK3sKKyAgICByZXR1cm4gdiAqIHNxcnRmKGZhYnNmKHYpKSAqIHNjYWxlOworfQorCisvLyBzcGVjdHJhbCBkYXRhIGlzIGNvZGVkIGNvbXBsZXRlbHkgZGlmZmVyZW50bHkgLSB0aGVyZSBhcmUgbm8gdW5zaWduZWQgY29kZWJvb2tzCitzdGF0aWMgaW50IG9uMmF2Y19kZWNvZGVfcXVhZHMoT24yQVZDQ29udGV4dCAqYywgR2V0Qml0Q29udGV4dCAqZ2IsIGZsb2F0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zaXplLCBpbnQgdHlwZSwgZmxvYXQgYmFuZF9zY2FsZSkKK3sKKyAgICBpbnQgaSwgaiwgdmFsLCB2YWwxOworCisgICAgZm9yIChpID0gMDsgaSA8IGRzdF9zaXplOyBpICs9IDQpIHsKKyAgICAgICAgdmFsID0gZ2V0X3ZsYzIoZ2IsIGMtPmNiX3ZsY1t0eXBlXS50YWJsZSwgOSwgMyk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgdmFsMSA9IHNpZ25fZXh0ZW5kKCh2YWwgPj4gKDEyIC0gaiAqIDQpKSAmIDB4RiwgNCk7CisgICAgICAgICAgICAqZHN0KysgPSBvbjJhdmNfc2NhbGUodmFsMSwgYmFuZF9zY2FsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2Vnb2xvbWIoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IHYgPSA0OworCisgICAgd2hpbGUgKGdldF9iaXRzMShnYikpIHYrKzsKKworICAgIHJldHVybiAoMSA8PCB2KSArIGdldF9iaXRzKGdiLCB2KTsKK30KKworc3RhdGljIGludCBvbjJhdmNfZGVjb2RlX3BhaXJzKE9uMkFWQ0NvbnRleHQgKmMsIEdldEJpdENvbnRleHQgKmdiLCBmbG9hdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc2l6ZSwgaW50IHR5cGUsIGZsb2F0IGJhbmRfc2NhbGUpCit7CisgICAgaW50IGksIHZhbCwgdmFsMSwgdmFsMiwgc2lnbjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkc3Rfc2l6ZTsgaSArPSAyKSB7CisgICAgICAgIHZhbCA9IGdldF92bGMyKGdiLCBjLT5jYl92bGNbdHlwZV0udGFibGUsIDksIDMpOworCisgICAgICAgIHZhbDEgPSBzaWduX2V4dGVuZCh2YWwgPj4gOCwgICA4KTsKKyAgICAgICAgdmFsMiA9IHNpZ25fZXh0ZW5kKHZhbCAmIDB4RkYsIDgpOworICAgICAgICBpZiAodHlwZSA9PSBPTjJBVkNfRVNDX0NCKSB7CisgICAgICAgICAgICBpZiAodmFsMSA8PSAtMTYgfHwgdmFsMSA+PSAxNikgeworICAgICAgICAgICAgICAgIHNpZ24gPSAxIC0gKHZhbDEgPCAwKSAqIDI7CisgICAgICAgICAgICAgICAgdmFsMSA9IHNpZ24gKiBnZXRfZWdvbG9tYihnYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsMiA8PSAtMTYgfHwgdmFsMiA+PSAxNikgeworICAgICAgICAgICAgICAgIHNpZ24gPSAxIC0gKHZhbDIgPCAwKSAqIDI7CisgICAgICAgICAgICAgICAgdmFsMiA9IHNpZ24gKiBnZXRfZWdvbG9tYihnYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqZHN0KysgPSBvbjJhdmNfc2NhbGUodmFsMSwgYmFuZF9zY2FsZSk7CisgICAgICAgICpkc3QrKyA9IG9uMmF2Y19zY2FsZSh2YWwyLCBiYW5kX3NjYWxlKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbjJhdmNfcmVhZF9jaGFubmVsX2RhdGEoT24yQVZDQ29udGV4dCAqYywgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBjaCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCB3LCBiLCBiYW5kX2lkeDsKKyAgICBmbG9hdCAqY29lZmZfcHRyOworCisgICAgaWYgKChyZXQgPSBvbjJhdmNfZGVjb2RlX2JhbmRfdHlwZXMoYywgZ2IpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBvbjJhdmNfZGVjb2RlX2JhbmRfc2NhbGVzKGMsIGdiKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgY29lZmZfcHRyID0gYy0+Y29lZmZzW2NoXTsKKyAgICBiYW5kX2lkeCAgPSAwOworICAgIG1lbXNldChjb2VmZl9wdHIsIDAsIE9OMkFWQ19TVUJGUkFNRV9TSVpFICogc2l6ZW9mKCpjb2VmZl9wdHIpKTsKKyAgICBmb3IgKHcgPSAwOyB3IDwgYy0+bnVtX3dpbmRvd3M7IHcrKykgeworICAgICAgICBmb3IgKGIgPSAwOyBiIDwgYy0+bnVtX2JhbmRzOyBiKyspIHsKKyAgICAgICAgICAgIGludCBiYW5kX3NpemUgPSBjLT5iYW5kX3N0YXJ0W2IgKyAxXSAtIGMtPmJhbmRfc3RhcnRbYl07CisgICAgICAgICAgICBpbnQgYmFuZF90eXBlID0gYy0+YmFuZF90eXBlW2JhbmRfaWR4ICsgYl07CisKKyAgICAgICAgICAgIGlmICghYmFuZF90eXBlKSB7CisgICAgICAgICAgICAgICAgY29lZmZfcHRyICs9IGJhbmRfc2l6ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiYW5kX3R5cGUgPCA5KQorICAgICAgICAgICAgICAgIG9uMmF2Y19kZWNvZGVfcXVhZHMoYywgZ2IsIGNvZWZmX3B0ciwgYmFuZF9zaXplLCBiYW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5iYW5kX3NjYWxlc1tiYW5kX2lkeCArIGJdKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvbjJhdmNfZGVjb2RlX3BhaXJzKGMsIGdiLCBjb2VmZl9wdHIsIGJhbmRfc2l6ZSwgYmFuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YmFuZF9zY2FsZXNbYmFuZF9pZHggKyBiXSk7CisgICAgICAgICAgICBjb2VmZl9wdHIgKz0gYmFuZF9zaXplOworICAgICAgICB9CisgICAgICAgIGJhbmRfaWR4ICs9IGMtPm51bV9iYW5kczsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbjJhdmNfYXBwbHlfbXMoT24yQVZDQ29udGV4dCAqYykKK3sKKyAgICBpbnQgdywgYiwgaTsKKyAgICBpbnQgYmFuZF9vZmYgPSAwOworICAgIGZsb2F0ICpjaDAgPSBjLT5jb2VmZnNbMF07CisgICAgZmxvYXQgKmNoMSA9IGMtPmNvZWZmc1sxXTsKKworICAgIGZvciAodyA9IDA7IHcgPCBjLT5udW1fd2luZG93czsgdysrKSB7CisgICAgICAgIGZvciAoYiA9IDA7IGIgPCBjLT5udW1fYmFuZHM7IGIrKykgeworICAgICAgICAgICAgaWYgKGMtPm1zX2luZm9bYmFuZF9vZmYgKyBiXSkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IGMtPmJhbmRfc3RhcnRbYl07IGkgPCBjLT5iYW5kX3N0YXJ0W2IgKyAxXTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGwgPSAqY2gwLCByID0gKmNoMTsKKyAgICAgICAgICAgICAgICAgICAgKmNoMCsrID0gbCArIHI7CisgICAgICAgICAgICAgICAgICAgICpjaDErKyA9IGwgLSByOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2gwICs9IGMtPmJhbmRfc3RhcnRbYiArIDFdIC0gYy0+YmFuZF9zdGFydFtiXTsKKyAgICAgICAgICAgICAgICBjaDEgKz0gYy0+YmFuZF9zdGFydFtiICsgMV0gLSBjLT5iYW5kX3N0YXJ0W2JdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJhbmRfb2ZmICs9IGMtPm51bV9iYW5kczsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHplcm9faGVhZF9hbmRfdGFpbChmbG9hdCAqc3JjLCBpbnQgbGVuLCBpbnQgb3JkZXIwLCBpbnQgb3JkZXIxKQoreworICAgIG1lbXNldChzcmMsICAgICAgICAgICAgICAgIDAsIHNpemVvZigqc3JjKSAqIG9yZGVyMCk7CisgICAgbWVtc2V0KHNyYyArIGxlbiAtIG9yZGVyMSwgMCwgc2l6ZW9mKCpzcmMpICogb3JkZXIxKTsKK30KKworc3RhdGljIHZvaWQgcHJldHdpZGRsZShmbG9hdCAqc3JjLCBmbG9hdCAqZHN0LCBpbnQgZHN0X2xlbiwgaW50IHRhYl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IG9yZGVyMCwgaW50IG9yZGVyMSwgY29uc3QgZG91YmxlICogY29uc3QgKnRhYnMpCit7CisgICAgZmxvYXQgKnNyYzIsICpvdXQ7CisgICAgY29uc3QgZG91YmxlICp0YWI7CisgICAgaW50IGksIGo7CisKKyAgICBvdXQgPSBkc3Q7CisgICAgdGFiID0gdGFic1swXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGFiX3N0ZXA7IGkrKykgeworICAgICAgICBkb3VibGUgc3VtID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG9yZGVyMDsgaisrKQorICAgICAgICAgICAgc3VtICs9IHNyY1tqXSAqIHRhYltqICogdGFiX3N0ZXAgKyBpXTsKKyAgICAgICAgb3V0W2ldICs9IHN1bTsKKyAgICB9CisKKyAgICBvdXQgPSBkc3QgKyBkc3RfbGVuIC0gdGFiX3N0ZXA7CisgICAgdGFiID0gdGFic1tvcmRlcjBdOworICAgIHNyYzIgPSBzcmMgKyAoZHN0X2xlbiAtIHRhYl9zdGVwKSAvIHN0ZXAgKyAxICsgb3JkZXIwOworICAgIGZvciAoaSA9IDA7IGkgPCB0YWJfc3RlcDsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBzdW0gPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3JkZXIxOyBqKyspCisgICAgICAgICAgICBzdW0gKz0gc3JjMltqXSAqIHRhYltqICogdGFiX3N0ZXAgKyBpXTsKKyAgICAgICAgb3V0W2ldICs9IHN1bTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHR3aWRkbGUoZmxvYXQgKnNyYzEsIGZsb2F0ICpzcmMyLCBpbnQgc3JjMl9sZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqdGFiLCBpbnQgdGFiX2xlbiwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgIGludCBvcmRlcjAsIGludCBvcmRlcjEsIGNvbnN0IGRvdWJsZSAqIGNvbnN0ICp0YWJzKQoreworICAgIGludCBzdGVwczsKKyAgICBpbnQgbWFzazsKKyAgICBpbnQgaSwgajsKKworICAgIHN0ZXBzID0gKHNyYzJfbGVuIC0gdGFiX2xlbikgLyBzdGVwICsgMTsKKyAgICBwcmV0d2lkZGxlKHNyYzEsIHNyYzIsIHNyYzJfbGVuLCB0YWJfbGVuLCBzdGVwLCBvcmRlcjAsIG9yZGVyMSwgdGFicyk7CisgICAgbWFzayA9IHRhYl9sZW4gLSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IHN0ZXBzOyBpKyspIHsKKyAgICAgICAgZmxvYXQgaW4wID0gc3JjMVtvcmRlcjAgKyBpXTsKKyAgICAgICAgaW50ICAgcG9zID0gKHNyYzJfbGVuIC0gMSkgJiBtYXNrOworCisgICAgICAgIGlmIChwb3MgPCB0YWJfbGVuKSB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgKnQgPSB0YWI7CisgICAgICAgICAgICBmb3IgKGogPSBwb3M7IGogPj0gMDsgai0tKQorICAgICAgICAgICAgICAgIHNyYzJbal0gKz0gaW4wICogKnQrKzsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0YWJfbGVuIC0gcG9zIC0gMTsgaisrKQorICAgICAgICAgICAgICAgIHNyYzJbc3JjMl9sZW4gLSBqIC0gMV0gKz0gaW4wICogdGFiW3BvcyArIDEgKyBqXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0YWJfbGVuOyBqKyspCisgICAgICAgICAgICAgICAgc3JjMltwb3MgLSBqXSArPSBpbjAgKiB0YWJbal07CisgICAgICAgIH0KKyAgICAgICAgbWFzayA9IHBvcyArIHN0ZXA7CisgICAgfQorfQorCisjZGVmaW5lIENNVUwxX1IocywgdCwgaXMsIGl0KSBcCisgICAgc1tpcyArIDBdICogdFtpdCArIDBdIC0gc1tpcyArIDFdICogdFtpdCArIDFdCisjZGVmaW5lIENNVUwxX0kocywgdCwgaXMsIGl0KSBcCisgICAgc1tpcyArIDBdICogdFtpdCArIDFdICsgc1tpcyArIDFdICogdFtpdCArIDBdCisjZGVmaW5lIENNVUwyX1IocywgdCwgaXMsIGl0KSBcCisgICAgc1tpcyArIDBdICogdFtpdCArIDBdICsgc1tpcyArIDFdICogdFtpdCArIDFdCisjZGVmaW5lIENNVUwyX0kocywgdCwgaXMsIGl0KSBcCisgICAgc1tpcyArIDBdICogdFtpdCArIDFdIC0gc1tpcyArIDFdICogdFtpdCArIDBdCisKKyNkZWZpbmUgQ01VTDAoZHN0LCBpZCwgczAsIHMxLCBzMiwgczMsIHQwLCB0MSwgdDIsIHQzLCBpcywgaXQpICAgICAgICAgXAorICAgIGRzdFtpZF0gICAgID0gczBbaXNdICogdDBbaXRdICAgICArIHMxW2lzXSAqIHQxW2l0XSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKyBzMltpc10gKiB0MltpdF0gICAgICsgczNbaXNdICogdDNbaXRdOyAgICAgICAgICAgICAgIFwKKyAgICBkc3RbaWQgKyAxXSA9IHMwW2lzXSAqIHQwW2l0ICsgMV0gKyBzMVtpc10gKiB0MVtpdCArIDFdICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICsgczJbaXNdICogdDJbaXQgKyAxXSArIHMzW2lzXSAqIHQzW2l0ICsgMV07CisKKyNkZWZpbmUgQ01VTDEoZHN0LCBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDMsIGlzLCBpdCkgICAgICAgICAgICAgXAorICAgICpkc3QrKyA9IENNVUwxX1IoczAsIHQwLCBpcywgaXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICsgQ01VTDFfUihzMSwgdDEsIGlzLCBpdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKyBDTVVMMV9SKHMyLCB0MiwgaXMsIGl0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICArIENNVUwxX1IoczMsIHQzLCBpcywgaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmRzdCsrID0gQ01VTDFfSShzMCwgdDAsIGlzLCBpdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKyBDTVVMMV9JKHMxLCB0MSwgaXMsIGl0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICArIENNVUwxX0koczIsIHQyLCBpcywgaXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICsgQ01VTDFfSShzMywgdDMsIGlzLCBpdCk7CisKKyNkZWZpbmUgQ01VTDIoZHN0LCBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDMsIGlzLCBpdCkgICAgICAgICAgICAgXAorICAgICpkc3QrKyA9IENNVUwyX1IoczAsIHQwLCBpcywgaXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICsgQ01VTDJfUihzMSwgdDEsIGlzLCBpdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKyBDTVVMMl9SKHMyLCB0MiwgaXMsIGl0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICArIENNVUwyX1IoczMsIHQzLCBpcywgaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmRzdCsrID0gQ01VTDJfSShzMCwgdDAsIGlzLCBpdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKyBDTVVMMl9JKHMxLCB0MSwgaXMsIGl0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICArIENNVUwyX0koczIsIHQyLCBpcywgaXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICsgQ01VTDJfSShzMywgdDMsIGlzLCBpdCk7CisKK3N0YXRpYyB2b2lkIGNvbWJpbmVfZmZ0KGZsb2F0ICpzMCwgZmxvYXQgKnMxLCBmbG9hdCAqczIsIGZsb2F0ICpzMywgZmxvYXQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICp0MCwgY29uc3QgZmxvYXQgKnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnQyLCBjb25zdCBmbG9hdCAqdDMsIGludCBsZW4sIGludCBzdGVwKQoreworICAgIGNvbnN0IGZsb2F0ICpoMCwgKmgxLCAqaDIsICpoMzsKKyAgICBmbG9hdCAqZDEsICpkMjsKKyAgICBpbnQgdG1wLCBoYWxmOworICAgIGludCBsZW4yID0gbGVuID4+IDEsIGxlbjQgPSBsZW4gPj4gMjsKKyAgICBpbnQgaG9mZjsKKyAgICBpbnQgaSwgaiwgazsKKworICAgIHRtcCA9IHN0ZXA7CisgICAgZm9yIChoYWxmID0gbGVuMjsgdG1wID4gMTsgaGFsZiA8PD0gMSwgdG1wID4+PSAxKTsKKworICAgIGgwID0gdDAgKyBoYWxmOworICAgIGgxID0gdDEgKyBoYWxmOworICAgIGgyID0gdDIgKyBoYWxmOworICAgIGgzID0gdDMgKyBoYWxmOworCisgICAgQ01VTDAoZHN0LCAwLCBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDMsIDAsIDApOworCisgICAgaG9mZiA9IDIgKiBzdGVwICogKGxlbjQgPj4gMSk7CisKKyAgICBqID0gMjsKKyAgICBrID0gMiAqIHN0ZXA7CisgICAgZDEgPSBkc3QgKyAyOworICAgIGQyID0gZHN0ICsgMiArIChsZW4gPj4gMSk7CisgICAgZm9yIChpID0gMDsgaSA8IChsZW40IC0gMSkgPj4gMTsgaSsrKSB7CisgICAgICAgIENNVUwxKGQxLCBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDMsIGosIGspOworICAgICAgICBDTVVMMShkMiwgczAsIHMxLCBzMiwgczMsIGgwLCBoMSwgaDIsIGgzLCBqLCBrKTsKKyAgICAgICAgaiArPSAyOworICAgICAgICBrICs9IDIgKiBzdGVwOworICAgIH0KKyAgICBDTVVMMChkc3QsIGxlbjQsICAgICAgICBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDMsIDEsIGhvZmYpOworICAgIENNVUwwKGRzdCwgbGVuNCArIGxlbjIsIHMwLCBzMSwgczIsIHMzLCBoMCwgaDEsIGgyLCBoMywgMSwgaG9mZik7CisKKyAgICBqID0gbGVuNDsKKyAgICBrID0gaG9mZiArIDIgKiBzdGVwICogbGVuNDsKKyAgICBkMSA9IGRzdCArIGxlbjQgKyAyOworICAgIGQyID0gZHN0ICsgbGVuNCArIDIgKyBsZW4yOworICAgIGZvciAoaSA9IDA7IGkgPCAobGVuNCAtIDIpID4+IDE7IGkrKykgeworICAgICAgICBDTVVMMihkMSwgczAsIHMxLCBzMiwgczMsIHQwLCB0MSwgdDIsIHQzLCBqLCBrKTsKKyAgICAgICAgQ01VTDIoZDIsIHMwLCBzMSwgczIsIHMzLCBoMCwgaDEsIGgyLCBoMywgaiwgayk7CisgICAgICAgIGogLT0gMjsKKyAgICAgICAgayArPSAyICogc3RlcDsKKyAgICB9CisgICAgQ01VTDAoZHN0LCBsZW4yICsgNCwgczAsIHMxLCBzMiwgczMsIHQwLCB0MSwgdDIsIHQzLCAwLCBrKTsKK30KKworc3RhdGljIHZvaWQgd3RmX2VuZF81MTIoT24yQVZDQ29udGV4dCAqYywgZmxvYXQgKm91dCwgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICp0bXAwLCBmbG9hdCAqdG1wMSkKK3sKKyAgICBtZW1jcHkoc3JjLCAgICAgICAgdG1wMCwgICAgICAzODQgKiBzaXplb2YoKnRtcDApKTsKKyAgICBtZW1jcHkodG1wMCArIDM4NCwgc3JjICsgMzg0LCAxMjggKiBzaXplb2YoKnRtcDApKTsKKworICAgIHplcm9faGVhZF9hbmRfdGFpbChzcmMsICAgICAgIDEyOCwgMTYsIDQpOworICAgIHplcm9faGVhZF9hbmRfdGFpbChzcmMgKyAxMjgsIDEyOCwgMTYsIDQpOworICAgIHplcm9faGVhZF9hbmRfdGFpbChzcmMgKyAyNTYsIDEyOCwgMTMsIDcpOworICAgIHplcm9faGVhZF9hbmRfdGFpbChzcmMgKyAzODQsIDEyOCwgMTUsIDUpOworCisgICAgYy0+ZmZ0MTI4LmZmdF9wZXJtdXRlKCZjLT5mZnQxMjgsIChGRlRDb21wbGV4KilzcmMpOworICAgIGMtPmZmdDEyOC5mZnRfcGVybXV0ZSgmYy0+ZmZ0MTI4LCAoRkZUQ29tcGxleCopKHNyYyArIDEyOCkpOworICAgIGMtPmZmdDEyOC5mZnRfcGVybXV0ZSgmYy0+ZmZ0MTI4LCAoRkZUQ29tcGxleCopKHNyYyArIDI1NikpOworICAgIGMtPmZmdDEyOC5mZnRfcGVybXV0ZSgmYy0+ZmZ0MTI4LCAoRkZUQ29tcGxleCopKHNyYyArIDM4NCkpOworICAgIGMtPmZmdDEyOC5mZnRfY2FsYygmYy0+ZmZ0MTI4LCAoRkZUQ29tcGxleCopc3JjKTsKKyAgICBjLT5mZnQxMjguZmZ0X2NhbGMoJmMtPmZmdDEyOCwgKEZGVENvbXBsZXgqKShzcmMgKyAxMjgpKTsKKyAgICBjLT5mZnQxMjguZmZ0X2NhbGMoJmMtPmZmdDEyOCwgKEZGVENvbXBsZXgqKShzcmMgKyAyNTYpKTsKKyAgICBjLT5mZnQxMjguZmZ0X2NhbGMoJmMtPmZmdDEyOCwgKEZGVENvbXBsZXgqKShzcmMgKyAzODQpKTsKKyAgICBjb21iaW5lX2ZmdChzcmMsIHNyYyArIDEyOCwgc3JjICsgMjU2LCBzcmMgKyAzODQsIHRtcDEsCisgICAgICAgICAgICAgICAgZmZfb24yYXZjX2N0YWJfMSwgZmZfb24yYXZjX2N0YWJfMiwKKyAgICAgICAgICAgICAgICBmZl9vbjJhdmNfY3RhYl8zLCBmZl9vbjJhdmNfY3RhYl80LCA1MTIsIDIpOworICAgIGMtPmZmdDUxMi5mZnRfcGVybXV0ZSgmYy0+ZmZ0NTEyLCAoRkZUQ29tcGxleCopdG1wMSk7CisgICAgYy0+ZmZ0NTEyLmZmdF9jYWxjKCZjLT5mZnQ1MTIsIChGRlRDb21wbGV4Kil0bXAxKTsKKworICAgIHByZXR3aWRkbGUoJnRtcDBbICAwXSwgdG1wMSwgNTEyLCA4NCwgNCwgMTYsIDQsIGZmX29uMmF2Y190YWJzXzIwXzg0XzEpOworICAgIHByZXR3aWRkbGUoJnRtcDBbMTI4XSwgdG1wMSwgNTEyLCA4NCwgNCwgMTYsIDQsIGZmX29uMmF2Y190YWJzXzIwXzg0XzIpOworICAgIHByZXR3aWRkbGUoJnRtcDBbMjU2XSwgdG1wMSwgNTEyLCA4NCwgNCwgMTMsIDcsIGZmX29uMmF2Y190YWJzXzIwXzg0XzMpOworICAgIHByZXR3aWRkbGUoJnRtcDBbMzg0XSwgdG1wMSwgNTEyLCA4NCwgNCwgMTUsIDUsIGZmX29uMmF2Y190YWJzXzIwXzg0XzQpOworCisgICAgbWVtY3B5KHNyYywgdG1wMSwgNTEyICogc2l6ZW9mKGZsb2F0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHd0Zl9lbmRfMTAyNChPbjJBVkNDb250ZXh0ICpjLCBmbG9hdCAqb3V0LCBmbG9hdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICp0bXAwLCBmbG9hdCAqdG1wMSkKK3sKKyAgICBtZW1jcHkoc3JjLCAgICAgICAgdG1wMCwgICAgICA3NjggKiBzaXplb2YoKnRtcDApKTsKKyAgICBtZW1jcHkodG1wMCArIDc2OCwgc3JjICsgNzY4LCAyNTYgKiBzaXplb2YoKnRtcDApKTsKKworICAgIHplcm9faGVhZF9hbmRfdGFpbChzcmMsICAgICAgIDI1NiwgMTYsIDQpOworICAgIHplcm9faGVhZF9hbmRfdGFpbChzcmMgKyAyNTYsIDI1NiwgMTYsIDQpOworICAgIHplcm9faGVhZF9hbmRfdGFpbChzcmMgKyA1MTIsIDI1NiwgMTMsIDcpOworICAgIHplcm9faGVhZF9hbmRfdGFpbChzcmMgKyA3NjgsIDI1NiwgMTUsIDUpOworCisgICAgYy0+ZmZ0MjU2LmZmdF9wZXJtdXRlKCZjLT5mZnQyNTYsIChGRlRDb21wbGV4KilzcmMpOworICAgIGMtPmZmdDI1Ni5mZnRfcGVybXV0ZSgmYy0+ZmZ0MjU2LCAoRkZUQ29tcGxleCopKHNyYyArIDI1NikpOworICAgIGMtPmZmdDI1Ni5mZnRfcGVybXV0ZSgmYy0+ZmZ0MjU2LCAoRkZUQ29tcGxleCopKHNyYyArIDUxMikpOworICAgIGMtPmZmdDI1Ni5mZnRfcGVybXV0ZSgmYy0+ZmZ0MjU2LCAoRkZUQ29tcGxleCopKHNyYyArIDc2OCkpOworICAgIGMtPmZmdDI1Ni5mZnRfY2FsYygmYy0+ZmZ0MjU2LCAoRkZUQ29tcGxleCopc3JjKTsKKyAgICBjLT5mZnQyNTYuZmZ0X2NhbGMoJmMtPmZmdDI1NiwgKEZGVENvbXBsZXgqKShzcmMgKyAyNTYpKTsKKyAgICBjLT5mZnQyNTYuZmZ0X2NhbGMoJmMtPmZmdDI1NiwgKEZGVENvbXBsZXgqKShzcmMgKyA1MTIpKTsKKyAgICBjLT5mZnQyNTYuZmZ0X2NhbGMoJmMtPmZmdDI1NiwgKEZGVENvbXBsZXgqKShzcmMgKyA3NjgpKTsKKyAgICBjb21iaW5lX2ZmdChzcmMsIHNyYyArIDI1Niwgc3JjICsgNTEyLCBzcmMgKyA3NjgsIHRtcDEsCisgICAgICAgICAgICAgICAgZmZfb24yYXZjX2N0YWJfMSwgZmZfb24yYXZjX2N0YWJfMiwKKyAgICAgICAgICAgICAgICBmZl9vbjJhdmNfY3RhYl8zLCBmZl9vbjJhdmNfY3RhYl80LCAxMDI0LCAxKTsKKyAgICBjLT5mZnQxMDI0LmZmdF9wZXJtdXRlKCZjLT5mZnQxMDI0LCAoRkZUQ29tcGxleCopdG1wMSk7CisgICAgYy0+ZmZ0MTAyNC5mZnRfY2FsYygmYy0+ZmZ0MTAyNCwgKEZGVENvbXBsZXgqKXRtcDEpOworCisgICAgcHJldHdpZGRsZSgmdG1wMFsgIDBdLCB0bXAxLCAxMDI0LCA4NCwgNCwgMTYsIDQsIGZmX29uMmF2Y190YWJzXzIwXzg0XzEpOworICAgIHByZXR3aWRkbGUoJnRtcDBbMjU2XSwgdG1wMSwgMTAyNCwgODQsIDQsIDE2LCA0LCBmZl9vbjJhdmNfdGFic18yMF84NF8yKTsKKyAgICBwcmV0d2lkZGxlKCZ0bXAwWzUxMl0sIHRtcDEsIDEwMjQsIDg0LCA0LCAxMywgNywgZmZfb24yYXZjX3RhYnNfMjBfODRfMyk7CisgICAgcHJldHdpZGRsZSgmdG1wMFs3NjhdLCB0bXAxLCAxMDI0LCA4NCwgNCwgMTUsIDUsIGZmX29uMmF2Y190YWJzXzIwXzg0XzQpOworCisgICAgbWVtY3B5KHNyYywgdG1wMSwgMTAyNCAqIHNpemVvZihmbG9hdCkpOworfQorCitzdGF0aWMgdm9pZCB3dGZfNDAoT24yQVZDQ29udGV4dCAqYywgZmxvYXQgKm91dCwgZmxvYXQgKnNyYywgaW50IHNpemUpCit7CisgICAgZmxvYXQgKnRtcDAgPSBjLT50ZW1wLCAqdG1wMSA9IGMtPnRlbXAgKyAxMDI0OworCisgICAgbWVtc2V0KHRtcDAsIDAsIHNpemVvZigqdG1wMCkgKiAxMDI0KTsKKyAgICBtZW1zZXQodG1wMSwgMCwgc2l6ZW9mKCp0bXAxKSAqIDEwMjQpOworCisgICAgaWYgKHNpemUgPT0gNTEyKSB7CisgICAgICAgIHR3aWRkbGUoc3JjLCAgICAgICAmdG1wMFsgIDBdLCAxNiwgZmZfb24yYXZjX3RhYl8xMF8xLCAxMCwgMiwgMSwgMywgZmZfb24yYXZjX3RhYnNfNF8xMF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgIDgsICZ0bXAwWyAgMF0sIDE2LCBmZl9vbjJhdmNfdGFiXzEwXzIsIDEwLCAyLCAzLCAxLCBmZl9vbjJhdmNfdGFic180XzEwXzIpOworICAgICAgICB0d2lkZGxlKHNyYyArICAxNiwgJnRtcDBbIDE2XSwgMTYsIGZmX29uMmF2Y190YWJfMTBfMiwgMTAsIDIsIDMsIDEsIGZmX29uMmF2Y190YWJzXzRfMTBfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgIDI0LCAmdG1wMFsgMTZdLCAxNiwgZmZfb24yYXZjX3RhYl8xMF8xLCAxMCwgMiwgMSwgMywgZmZfb24yYXZjX3RhYnNfNF8xMF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgMzIsICZ0bXAwWyAzMl0sIDE2LCBmZl9vbjJhdmNfdGFiXzEwXzEsIDEwLCAyLCAxLCAzLCBmZl9vbjJhdmNfdGFic180XzEwXzEpOworICAgICAgICB0d2lkZGxlKHNyYyArICA0MCwgJnRtcDBbIDMyXSwgMTYsIGZmX29uMmF2Y190YWJfMTBfMiwgMTAsIDIsIDMsIDEsIGZmX29uMmF2Y190YWJzXzRfMTBfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgIDQ4LCAmdG1wMFsgNDhdLCAxNiwgZmZfb24yYXZjX3RhYl8xMF8yLCAxMCwgMiwgMywgMSwgZmZfb24yYXZjX3RhYnNfNF8xMF8yKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgNTYsICZ0bXAwWyA0OF0sIDE2LCBmZl9vbjJhdmNfdGFiXzEwXzEsIDEwLCAyLCAxLCAzLCBmZl9vbjJhdmNfdGFic180XzEwXzEpOworICAgICAgICB0d2lkZGxlKCZ0bXAwWyAwXSwgJnRtcDFbICAwXSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMSwgMjAsIDIsIDUsIDQsIGZmX29uMmF2Y190YWJzXzlfMjBfMSk7CisgICAgICAgIHR3aWRkbGUoJnRtcDBbMTZdLCAmdG1wMVsgIDBdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8yLCAyMCwgMiwgNCwgNSwgZmZfb24yYXZjX3RhYnNfOV8yMF8yKTsKKyAgICAgICAgdHdpZGRsZSgmdG1wMFszMl0sICZ0bXAxWyAzMl0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzIsIDIwLCAyLCA0LCA1LCBmZl9vbjJhdmNfdGFic185XzIwXzIpOworICAgICAgICB0d2lkZGxlKCZ0bXAwWzQ4XSwgJnRtcDFbIDMyXSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMSwgMjAsIDIsIDUsIDQsIGZmX29uMmF2Y190YWJzXzlfMjBfMSk7CisgICAgICAgIHR3aWRkbGUoc3JjICsgIDY0LCAmdG1wMVsgNjRdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8xLCAyMCwgMiwgNSwgNCwgZmZfb24yYXZjX3RhYnNfOV8yMF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgODAsICZ0bXAxWyA2NF0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzIsIDIwLCAyLCA0LCA1LCBmZl9vbjJhdmNfdGFic185XzIwXzIpOworICAgICAgICB0d2lkZGxlKHNyYyArICA5NiwgJnRtcDFbIDk2XSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMiwgMjAsIDIsIDQsIDUsIGZmX29uMmF2Y190YWJzXzlfMjBfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMTEyLCAmdG1wMVsgOTZdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8xLCAyMCwgMiwgNSwgNCwgZmZfb24yYXZjX3RhYnNfOV8yMF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAxMjgsICZ0bXAxWzEyOF0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzEsIDIwLCAyLCA1LCA0LCBmZl9vbjJhdmNfdGFic185XzIwXzEpOworICAgICAgICB0d2lkZGxlKHNyYyArIDE0NCwgJnRtcDFbMTI4XSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMiwgMjAsIDIsIDQsIDUsIGZmX29uMmF2Y190YWJzXzlfMjBfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMTYwLCAmdG1wMVsxNjBdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8yLCAyMCwgMiwgNCwgNSwgZmZfb24yYXZjX3RhYnNfOV8yMF8yKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAxNzYsICZ0bXAxWzE2MF0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzEsIDIwLCAyLCA1LCA0LCBmZl9vbjJhdmNfdGFic185XzIwXzEpOworCisgICAgICAgIG1lbXNldCh0bXAwLCAwLCA2NCAqIHNpemVvZigqdG1wMCkpOworCisgICAgICAgIHR3aWRkbGUoJnRtcDFbICAwXSwgJnRtcDBbICAwXSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzEsIDg0LCA0LCAxNiwgNCwgZmZfb24yYXZjX3RhYnNfMjBfODRfMSk7CisgICAgICAgIHR3aWRkbGUoJnRtcDFbIDMyXSwgJnRtcDBbICAwXSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzIsIDg0LCA0LCAxNiwgNCwgZmZfb24yYXZjX3RhYnNfMjBfODRfMik7CisgICAgICAgIHR3aWRkbGUoJnRtcDFbIDY0XSwgJnRtcDBbICAwXSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzMsIDg0LCA0LCAxMywgNywgZmZfb24yYXZjX3RhYnNfMjBfODRfMyk7CisgICAgICAgIHR3aWRkbGUoJnRtcDFbIDk2XSwgJnRtcDBbICAwXSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzQsIDg0LCA0LCAxNSwgNSwgZmZfb24yYXZjX3RhYnNfMjBfODRfNCk7CisgICAgICAgIHR3aWRkbGUoJnRtcDFbMTI4XSwgJnRtcDBbMTI4XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzQsIDg0LCA0LCAxNSwgNSwgZmZfb24yYXZjX3RhYnNfMjBfODRfNCk7CisgICAgICAgIHR3aWRkbGUoJnRtcDFbMTYwXSwgJnRtcDBbMTI4XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzMsIDg0LCA0LCAxMywgNywgZmZfb24yYXZjX3RhYnNfMjBfODRfMyk7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMTkyLCAgJnRtcDBbMTI4XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzIsIDg0LCA0LCAxNiwgNCwgZmZfb24yYXZjX3RhYnNfMjBfODRfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMjI0LCAgJnRtcDBbMTI4XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzEsIDg0LCA0LCAxNiwgNCwgZmZfb24yYXZjX3RhYnNfMjBfODRfMSk7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMjU2LCAgJnRtcDBbMjU2XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzEsIDg0LCA0LCAxNiwgNCwgZmZfb24yYXZjX3RhYnNfMjBfODRfMSk7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMjg4LCAgJnRtcDBbMjU2XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzIsIDg0LCA0LCAxNiwgNCwgZmZfb24yYXZjX3RhYnNfMjBfODRfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMzIwLCAgJnRtcDBbMjU2XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzMsIDg0LCA0LCAxMywgNywgZmZfb24yYXZjX3RhYnNfMjBfODRfMyk7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMzUyLCAgJnRtcDBbMjU2XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzQsIDg0LCA0LCAxNSwgNSwgZmZfb24yYXZjX3RhYnNfMjBfODRfNCk7CisKKyAgICAgICAgd3RmX2VuZF81MTIoYywgb3V0LCBzcmMsIHRtcDAsIHRtcDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHR3aWRkbGUoc3JjLCAgICAgICAmdG1wMFsgIDBdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8xLCAyMCwgMiwgIDUsICA0LCBmZl9vbjJhdmNfdGFic185XzIwXzEpOworICAgICAgICB0d2lkZGxlKHNyYyArICAxNiwgJnRtcDBbICAwXSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMiwgMjAsIDIsICA0LCAgNSwgZmZfb24yYXZjX3RhYnNfOV8yMF8yKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgMzIsICZ0bXAwWyAzMl0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzIsIDIwLCAyLCAgNCwgIDUsIGZmX29uMmF2Y190YWJzXzlfMjBfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgIDQ4LCAmdG1wMFsgMzJdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8xLCAyMCwgMiwgIDUsICA0LCBmZl9vbjJhdmNfdGFic185XzIwXzEpOworICAgICAgICB0d2lkZGxlKHNyYyArICA2NCwgJnRtcDBbIDY0XSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMSwgMjAsIDIsICA1LCAgNCwgZmZfb24yYXZjX3RhYnNfOV8yMF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgODAsICZ0bXAwWyA2NF0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzIsIDIwLCAyLCAgNCwgIDUsIGZmX29uMmF2Y190YWJzXzlfMjBfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgIDk2LCAmdG1wMFsgOTZdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8yLCAyMCwgMiwgIDQsICA1LCBmZl9vbjJhdmNfdGFic185XzIwXzIpOworICAgICAgICB0d2lkZGxlKHNyYyArIDExMiwgJnRtcDBbIDk2XSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMSwgMjAsIDIsICA1LCAgNCwgZmZfb24yYXZjX3RhYnNfOV8yMF8xKTsKKyAgICAgICAgdHdpZGRsZSgmdG1wMFsgMF0sICZ0bXAxWyAgMF0sIDY0LCBmZl9vbjJhdmNfdGFiXzQwXzEsIDQwLCAyLCAxMSwgIDgsIGZmX29uMmF2Y190YWJzXzE5XzQwXzEpOworICAgICAgICB0d2lkZGxlKCZ0bXAwWzMyXSwgJnRtcDFbICAwXSwgNjQsIGZmX29uMmF2Y190YWJfNDBfMiwgNDAsIDIsICA4LCAxMSwgZmZfb24yYXZjX3RhYnNfMTlfNDBfMik7CisgICAgICAgIHR3aWRkbGUoJnRtcDBbNjRdLCAmdG1wMVsgNjRdLCA2NCwgZmZfb24yYXZjX3RhYl80MF8yLCA0MCwgMiwgIDgsIDExLCBmZl9vbjJhdmNfdGFic18xOV80MF8yKTsKKyAgICAgICAgdHdpZGRsZSgmdG1wMFs5Nl0sICZ0bXAxWyA2NF0sIDY0LCBmZl9vbjJhdmNfdGFiXzQwXzEsIDQwLCAyLCAxMSwgIDgsIGZmX29uMmF2Y190YWJzXzE5XzQwXzEpOworICAgICAgICB0d2lkZGxlKHNyYyArIDEyOCwgJnRtcDFbMTI4XSwgNjQsIGZmX29uMmF2Y190YWJfNDBfMSwgNDAsIDIsIDExLCAgOCwgZmZfb24yYXZjX3RhYnNfMTlfNDBfMSk7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMTYwLCAmdG1wMVsxMjhdLCA2NCwgZmZfb24yYXZjX3RhYl80MF8yLCA0MCwgMiwgIDgsIDExLCBmZl9vbjJhdmNfdGFic18xOV80MF8yKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAxOTIsICZ0bXAxWzE5Ml0sIDY0LCBmZl9vbjJhdmNfdGFiXzQwXzIsIDQwLCAyLCAgOCwgMTEsIGZmX29uMmF2Y190YWJzXzE5XzQwXzIpOworICAgICAgICB0d2lkZGxlKHNyYyArIDIyNCwgJnRtcDFbMTkyXSwgNjQsIGZmX29uMmF2Y190YWJfNDBfMSwgNDAsIDIsIDExLCAgOCwgZmZfb24yYXZjX3RhYnNfMTlfNDBfMSk7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMjU2LCAmdG1wMVsyNTZdLCA2NCwgZmZfb24yYXZjX3RhYl80MF8xLCA0MCwgMiwgMTEsICA4LCBmZl9vbjJhdmNfdGFic18xOV80MF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAyODgsICZ0bXAxWzI1Nl0sIDY0LCBmZl9vbjJhdmNfdGFiXzQwXzIsIDQwLCAyLCAgOCwgMTEsIGZmX29uMmF2Y190YWJzXzE5XzQwXzIpOworICAgICAgICB0d2lkZGxlKHNyYyArIDMyMCwgJnRtcDFbMzIwXSwgNjQsIGZmX29uMmF2Y190YWJfNDBfMiwgNDAsIDIsICA4LCAxMSwgZmZfb24yYXZjX3RhYnNfMTlfNDBfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMzUyLCAmdG1wMVszMjBdLCA2NCwgZmZfb24yYXZjX3RhYl80MF8xLCA0MCwgMiwgMTEsICA4LCBmZl9vbjJhdmNfdGFic18xOV80MF8xKTsKKworICAgICAgICBtZW1zZXQodG1wMCwgMCwgMTI4ICogc2l6ZW9mKCp0bXAwKSk7CisKKyAgICAgICAgdHdpZGRsZSgmdG1wMVsgIDBdLCAmdG1wMFsgIDBdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfMSwgODQsIDQsIDE2LCA0LCBmZl9vbjJhdmNfdGFic18yMF84NF8xKTsKKyAgICAgICAgdHdpZGRsZSgmdG1wMVsgNjRdLCAmdG1wMFsgIDBdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfMiwgODQsIDQsIDE2LCA0LCBmZl9vbjJhdmNfdGFic18yMF84NF8yKTsKKyAgICAgICAgdHdpZGRsZSgmdG1wMVsxMjhdLCAmdG1wMFsgIDBdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfMywgODQsIDQsIDEzLCA3LCBmZl9vbjJhdmNfdGFic18yMF84NF8zKTsKKyAgICAgICAgdHdpZGRsZSgmdG1wMVsxOTJdLCAmdG1wMFsgIDBdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfNCwgODQsIDQsIDE1LCA1LCBmZl9vbjJhdmNfdGFic18yMF84NF80KTsKKyAgICAgICAgdHdpZGRsZSgmdG1wMVsyNTZdLCAmdG1wMFsyNTZdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfNCwgODQsIDQsIDE1LCA1LCBmZl9vbjJhdmNfdGFic18yMF84NF80KTsKKyAgICAgICAgdHdpZGRsZSgmdG1wMVszMjBdLCAmdG1wMFsyNTZdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfMywgODQsIDQsIDEzLCA3LCBmZl9vbjJhdmNfdGFic18yMF84NF8zKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAzODQsICAmdG1wMFsyNTZdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfMiwgODQsIDQsIDE2LCA0LCBmZl9vbjJhdmNfdGFic18yMF84NF8yKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyA0NDgsICAmdG1wMFsyNTZdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfMSwgODQsIDQsIDE2LCA0LCBmZl9vbjJhdmNfdGFic18yMF84NF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyA1MTIsICAmdG1wMFs1MTJdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfMSwgODQsIDQsIDE2LCA0LCBmZl9vbjJhdmNfdGFic18yMF84NF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyA1NzYsICAmdG1wMFs1MTJdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfMiwgODQsIDQsIDE2LCA0LCBmZl9vbjJhdmNfdGFic18yMF84NF8yKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyA2NDAsICAmdG1wMFs1MTJdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfMywgODQsIDQsIDEzLCA3LCBmZl9vbjJhdmNfdGFic18yMF84NF8zKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyA3MDQsICAmdG1wMFs1MTJdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfNCwgODQsIDQsIDE1LCA1LCBmZl9vbjJhdmNfdGFic18yMF84NF80KTsKKworICAgICAgICB3dGZfZW5kXzEwMjQoYywgb3V0LCBzcmMsIHRtcDAsIHRtcDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgd3RmXzQ0KE9uMkFWQ0NvbnRleHQgKmMsIGZsb2F0ICpvdXQsIGZsb2F0ICpzcmMsIGludCBzaXplKQoreworICAgIGZsb2F0ICp0bXAwID0gYy0+dGVtcCwgKnRtcDEgPSBjLT50ZW1wICsgMTAyNDsKKworICAgIG1lbXNldCh0bXAwLCAwLCBzaXplb2YoKnRtcDApICogMTAyNCk7CisgICAgbWVtc2V0KHRtcDEsIDAsIHNpemVvZigqdG1wMSkgKiAxMDI0KTsKKworICAgIGlmIChzaXplID09IDUxMikgeworICAgICAgICB0d2lkZGxlKHNyYywgICAgICAgJnRtcDBbIDBdLCAxNiwgZmZfb24yYXZjX3RhYl8xMF8xLCAxMCwgMiwgMSwgMywgZmZfb24yYXZjX3RhYnNfNF8xMF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgIDgsICZ0bXAwWyAwXSwgMTYsIGZmX29uMmF2Y190YWJfMTBfMiwgMTAsIDIsIDMsIDEsIGZmX29uMmF2Y190YWJzXzRfMTBfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgIDE2LCAmdG1wMFsxNl0sIDE2LCBmZl9vbjJhdmNfdGFiXzEwXzIsIDEwLCAyLCAzLCAxLCBmZl9vbjJhdmNfdGFic180XzEwXzIpOworICAgICAgICB0d2lkZGxlKHNyYyArICAyNCwgJnRtcDBbMTZdLCAxNiwgZmZfb24yYXZjX3RhYl8xMF8xLCAxMCwgMiwgMSwgMywgZmZfb24yYXZjX3RhYnNfNF8xMF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgMzIsICZ0bXAwWzMyXSwgMTYsIGZmX29uMmF2Y190YWJfMTBfMSwgMTAsIDIsIDEsIDMsIGZmX29uMmF2Y190YWJzXzRfMTBfMSk7CisgICAgICAgIHR3aWRkbGUoc3JjICsgIDQwLCAmdG1wMFszMl0sIDE2LCBmZl9vbjJhdmNfdGFiXzEwXzIsIDEwLCAyLCAzLCAxLCBmZl9vbjJhdmNfdGFic180XzEwXzIpOworICAgICAgICB0d2lkZGxlKHNyYyArICA0OCwgJnRtcDBbNDhdLCAxNiwgZmZfb24yYXZjX3RhYl8xMF8yLCAxMCwgMiwgMywgMSwgZmZfb24yYXZjX3RhYnNfNF8xMF8yKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgNTYsICZ0bXAwWzQ4XSwgMTYsIGZmX29uMmF2Y190YWJfMTBfMSwgMTAsIDIsIDEsIDMsIGZmX29uMmF2Y190YWJzXzRfMTBfMSk7CisgICAgICAgIHR3aWRkbGUoJnRtcDBbIDBdLCAmdG1wMVsgMF0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzEsIDIwLCAyLCA1LCA0LCBmZl9vbjJhdmNfdGFic185XzIwXzEpOworICAgICAgICB0d2lkZGxlKCZ0bXAwWzE2XSwgJnRtcDFbIDBdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8yLCAyMCwgMiwgNCwgNSwgZmZfb24yYXZjX3RhYnNfOV8yMF8yKTsKKyAgICAgICAgdHdpZGRsZSgmdG1wMFszMl0sICZ0bXAxWzMyXSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMiwgMjAsIDIsIDQsIDUsIGZmX29uMmF2Y190YWJzXzlfMjBfMik7CisgICAgICAgIHR3aWRkbGUoJnRtcDBbNDhdLCAmdG1wMVszMl0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzEsIDIwLCAyLCA1LCA0LCBmZl9vbjJhdmNfdGFic185XzIwXzEpOworICAgICAgICB0d2lkZGxlKHNyYyArICA2NCwgJnRtcDFbNjRdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8xLCAyMCwgMiwgNSwgNCwgZmZfb24yYXZjX3RhYnNfOV8yMF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgODAsICZ0bXAxWzY0XSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMiwgMjAsIDIsIDQsIDUsIGZmX29uMmF2Y190YWJzXzlfMjBfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgIDk2LCAmdG1wMVs5Nl0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzIsIDIwLCAyLCA0LCA1LCBmZl9vbjJhdmNfdGFic185XzIwXzIpOworICAgICAgICB0d2lkZGxlKHNyYyArIDExMiwgJnRtcDFbOTZdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8xLCAyMCwgMiwgNSwgNCwgZmZfb24yYXZjX3RhYnNfOV8yMF8xKTsKKworICAgICAgICBtZW1zZXQodG1wMCwgMCwgNjQgKiBzaXplb2YoKnRtcDApKTsKKworICAgICAgICB0d2lkZGxlKCZ0bXAxWyAwXSwgJnRtcDBbICAwXSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzEsIDg0LCA0LCAxNiwgIDQsIGZmX29uMmF2Y190YWJzXzIwXzg0XzEpOworICAgICAgICB0d2lkZGxlKCZ0bXAxWzMyXSwgJnRtcDBbICAwXSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzIsIDg0LCA0LCAxNiwgIDQsIGZmX29uMmF2Y190YWJzXzIwXzg0XzIpOworICAgICAgICB0d2lkZGxlKCZ0bXAxWzY0XSwgJnRtcDBbICAwXSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzMsIDg0LCA0LCAxMywgIDcsIGZmX29uMmF2Y190YWJzXzIwXzg0XzMpOworICAgICAgICB0d2lkZGxlKCZ0bXAxWzk2XSwgJnRtcDBbICAwXSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzQsIDg0LCA0LCAxNSwgIDUsIGZmX29uMmF2Y190YWJzXzIwXzg0XzQpOworICAgICAgICB0d2lkZGxlKHNyYyArIDEyOCwgJnRtcDBbMTI4XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzQsIDg0LCA0LCAxNSwgIDUsIGZmX29uMmF2Y190YWJzXzIwXzg0XzQpOworICAgICAgICB0d2lkZGxlKHNyYyArIDE2MCwgJnRtcDBbMTI4XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzMsIDg0LCA0LCAxMywgIDcsIGZmX29uMmF2Y190YWJzXzIwXzg0XzMpOworICAgICAgICB0d2lkZGxlKHNyYyArIDE5MiwgJnRtcDBbMTI4XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzIsIDg0LCA0LCAxNiwgIDQsIGZmX29uMmF2Y190YWJzXzIwXzg0XzIpOworICAgICAgICB0d2lkZGxlKHNyYyArIDIyNCwgJnRtcDBbMTI4XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzg0XzEsIDg0LCA0LCAxNiwgIDQsIGZmX29uMmF2Y190YWJzXzIwXzg0XzEpOworICAgICAgICB0d2lkZGxlKHNyYyArIDI1NiwgJnRtcDBbMjU2XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzQwXzEsIDQwLCAyLCAxMSwgIDgsIGZmX29uMmF2Y190YWJzXzE5XzQwXzEpOworICAgICAgICB0d2lkZGxlKHNyYyArIDMyMCwgJnRtcDBbMjU2XSwgMTI4LCBmZl9vbjJhdmNfdGFiXzQwXzIsIDQwLCAyLCAgOCwgMTEsIGZmX29uMmF2Y190YWJzXzE5XzQwXzIpOworCisgICAgICAgIHd0Zl9lbmRfNTEyKGMsIG91dCwgc3JjLCB0bXAwLCB0bXAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0d2lkZGxlKHNyYywgICAgICAgJnRtcDBbICAwXSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMSwgMjAsIDIsICA1LCAgNCwgZmZfb24yYXZjX3RhYnNfOV8yMF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgMTYsICZ0bXAwWyAgMF0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzIsIDIwLCAyLCAgNCwgIDUsIGZmX29uMmF2Y190YWJzXzlfMjBfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgIDMyLCAmdG1wMFsgMzJdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8yLCAyMCwgMiwgIDQsICA1LCBmZl9vbjJhdmNfdGFic185XzIwXzIpOworICAgICAgICB0d2lkZGxlKHNyYyArICA0OCwgJnRtcDBbIDMyXSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMSwgMjAsIDIsICA1LCAgNCwgZmZfb24yYXZjX3RhYnNfOV8yMF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAgNjQsICZ0bXAwWyA2NF0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzEsIDIwLCAyLCAgNSwgIDQsIGZmX29uMmF2Y190YWJzXzlfMjBfMSk7CisgICAgICAgIHR3aWRkbGUoc3JjICsgIDgwLCAmdG1wMFsgNjRdLCAzMiwgZmZfb24yYXZjX3RhYl8yMF8yLCAyMCwgMiwgIDQsICA1LCBmZl9vbjJhdmNfdGFic185XzIwXzIpOworICAgICAgICB0d2lkZGxlKHNyYyArICA5NiwgJnRtcDBbIDk2XSwgMzIsIGZmX29uMmF2Y190YWJfMjBfMiwgMjAsIDIsICA0LCAgNSwgZmZfb24yYXZjX3RhYnNfOV8yMF8yKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAxMTIsICZ0bXAwWyA5Nl0sIDMyLCBmZl9vbjJhdmNfdGFiXzIwXzEsIDIwLCAyLCAgNSwgIDQsIGZmX29uMmF2Y190YWJzXzlfMjBfMSk7CisgICAgICAgIHR3aWRkbGUoJnRtcDBbIDBdLCAmdG1wMVsgIDBdLCA2NCwgZmZfb24yYXZjX3RhYl80MF8xLCA0MCwgMiwgMTEsICA4LCBmZl9vbjJhdmNfdGFic18xOV80MF8xKTsKKyAgICAgICAgdHdpZGRsZSgmdG1wMFszMl0sICZ0bXAxWyAgMF0sIDY0LCBmZl9vbjJhdmNfdGFiXzQwXzIsIDQwLCAyLCAgOCwgMTEsIGZmX29uMmF2Y190YWJzXzE5XzQwXzIpOworICAgICAgICB0d2lkZGxlKCZ0bXAwWzY0XSwgJnRtcDFbIDY0XSwgNjQsIGZmX29uMmF2Y190YWJfNDBfMiwgNDAsIDIsICA4LCAxMSwgZmZfb24yYXZjX3RhYnNfMTlfNDBfMik7CisgICAgICAgIHR3aWRkbGUoJnRtcDBbOTZdLCAmdG1wMVsgNjRdLCA2NCwgZmZfb24yYXZjX3RhYl80MF8xLCA0MCwgMiwgMTEsICA4LCBmZl9vbjJhdmNfdGFic18xOV80MF8xKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAxMjgsICZ0bXAxWzEyOF0sIDY0LCBmZl9vbjJhdmNfdGFiXzQwXzEsIDQwLCAyLCAxMSwgIDgsIGZmX29uMmF2Y190YWJzXzE5XzQwXzEpOworICAgICAgICB0d2lkZGxlKHNyYyArIDE2MCwgJnRtcDFbMTI4XSwgNjQsIGZmX29uMmF2Y190YWJfNDBfMiwgNDAsIDIsICA4LCAxMSwgZmZfb24yYXZjX3RhYnNfMTlfNDBfMik7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMTkyLCAmdG1wMVsxOTJdLCA2NCwgZmZfb24yYXZjX3RhYl80MF8yLCA0MCwgMiwgIDgsIDExLCBmZl9vbjJhdmNfdGFic18xOV80MF8yKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAyMjQsICZ0bXAxWzE5Ml0sIDY0LCBmZl9vbjJhdmNfdGFiXzQwXzEsIDQwLCAyLCAxMSwgIDgsIGZmX29uMmF2Y190YWJzXzE5XzQwXzEpOworCisgICAgICAgIG1lbXNldCh0bXAwLCAwLCAxMjggKiBzaXplb2YoKnRtcDApKTsKKworICAgICAgICB0d2lkZGxlKCZ0bXAxWyAgMF0sICZ0bXAwWyAgMF0sIDI1NiwgZmZfb24yYXZjX3RhYl84NF8xLCA4NCwgNCwgMTYsICA0LCBmZl9vbjJhdmNfdGFic18yMF84NF8xKTsKKyAgICAgICAgdHdpZGRsZSgmdG1wMVsgNjRdLCAmdG1wMFsgIDBdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfMiwgODQsIDQsIDE2LCAgNCwgZmZfb24yYXZjX3RhYnNfMjBfODRfMik7CisgICAgICAgIHR3aWRkbGUoJnRtcDFbMTI4XSwgJnRtcDBbICAwXSwgMjU2LCBmZl9vbjJhdmNfdGFiXzg0XzMsIDg0LCA0LCAxMywgIDcsIGZmX29uMmF2Y190YWJzXzIwXzg0XzMpOworICAgICAgICB0d2lkZGxlKCZ0bXAxWzE5Ml0sICZ0bXAwWyAgMF0sIDI1NiwgZmZfb24yYXZjX3RhYl84NF80LCA4NCwgNCwgMTUsICA1LCBmZl9vbjJhdmNfdGFic18yMF84NF80KTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyAyNTYsICAmdG1wMFsyNTZdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfNCwgODQsIDQsIDE1LCAgNSwgZmZfb24yYXZjX3RhYnNfMjBfODRfNCk7CisgICAgICAgIHR3aWRkbGUoc3JjICsgMzIwLCAgJnRtcDBbMjU2XSwgMjU2LCBmZl9vbjJhdmNfdGFiXzg0XzMsIDg0LCA0LCAxMywgIDcsIGZmX29uMmF2Y190YWJzXzIwXzg0XzMpOworICAgICAgICB0d2lkZGxlKHNyYyArIDM4NCwgICZ0bXAwWzI1Nl0sIDI1NiwgZmZfb24yYXZjX3RhYl84NF8yLCA4NCwgNCwgMTYsICA0LCBmZl9vbjJhdmNfdGFic18yMF84NF8yKTsKKyAgICAgICAgdHdpZGRsZShzcmMgKyA0NDgsICAmdG1wMFsyNTZdLCAyNTYsIGZmX29uMmF2Y190YWJfODRfMSwgODQsIDQsIDE2LCAgNCwgZmZfb24yYXZjX3RhYnNfMjBfODRfMSk7CisgICAgICAgIHR3aWRkbGUoc3JjICsgNTEyLCAgJnRtcDBbNTEyXSwgMjU2LCBmZl9vbjJhdmNfdGFiXzQwXzEsIDQwLCAyLCAxMSwgIDgsIGZmX29uMmF2Y190YWJzXzE5XzQwXzEpOworICAgICAgICB0d2lkZGxlKHNyYyArIDY0MCwgICZ0bXAwWzUxMl0sIDI1NiwgZmZfb24yYXZjX3RhYl80MF8yLCA0MCwgMiwgIDgsIDExLCBmZl9vbjJhdmNfdGFic18xOV80MF8yKTsKKworICAgICAgICB3dGZfZW5kXzEwMjQoYywgb3V0LCBzcmMsIHRtcDAsIHRtcDEpOworICAgIH0KK30KKworc3RhdGljIGludCBvbjJhdmNfcmVjb25zdHJ1Y3Rfc3RlcmVvKE9uMkFWQ0NvbnRleHQgKmMsIEFWRnJhbWUgKmRzdCwgaW50IG9mZnNldCkKK3sKKyAgICBpbnQgY2gsIGk7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCAyOyBjaCsrKSB7CisgICAgICAgIGZsb2F0ICpvdXQgICA9IChmbG9hdCopZHN0LT5leHRlbmRlZF9kYXRhW2NoXSArIG9mZnNldDsKKyAgICAgICAgZmxvYXQgKmluICAgID0gYy0+Y29lZmZzW2NoXTsKKyAgICAgICAgZmxvYXQgKnNhdmVkID0gYy0+ZGVsYXlbY2hdOworICAgICAgICBmbG9hdCAqYnVmICAgPSBjLT5tZGN0X2J1ZjsKKyAgICAgICAgZmxvYXQgKndvdXQgID0gb3V0ICsgNDQ4OworCisgICAgICAgIHN3aXRjaCAoYy0+d2luZG93X3R5cGUpIHsKKyAgICAgICAgY2FzZSBXSU5ET1dfVFlQRV9FWFQ3OgorICAgICAgICAgICAgYy0+bWRjdC5pbWRjdF9oYWxmKCZjLT5tZGN0LCBidWYsIGluKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdJTkRPV19UWVBFX0VYVDQ6CisgICAgICAgICAgICBjLT53dGYoYywgYnVmLCBpbiwgMTAyNCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXSU5ET1dfVFlQRV9FWFQ1OgorICAgICAgICAgICAgYy0+d3RmKGMsIGJ1ZiwgaW4sIDUxMik7CisgICAgICAgICAgICBjLT5tZGN0LmltZGN0X2hhbGYoJmMtPm1kY3RfaGFsZiwgYnVmICsgNTEyLCBpbiArIDUxMik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICAgICAgICBGRlNXQVAoZmxvYXQsIGJ1ZltpICsgNTEyXSwgYnVmWzEwMjMgLSBpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXSU5ET1dfVFlQRV9FWFQ2OgorICAgICAgICAgICAgYy0+bWRjdC5pbWRjdF9oYWxmKCZjLT5tZGN0X2hhbGYsIGJ1ZiwgaW4pOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICAgICAgRkZTV0FQKGZsb2F0LCBidWZbaV0sIGJ1Zls1MTEgLSBpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLT53dGYoYywgYnVmICsgNTEyLCBpbiArIDUxMiwgNTEyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KG91dCwgc2F2ZWQsIDQ0OCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBjLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3cod291dCwgc2F2ZWQgKyA0NDgsIGJ1ZiwgYy0+c2hvcnRfd2luLCA2NCk7CisgICAgICAgIG1lbWNweSh3b3V0ICsgMTI4LCAgYnVmICsgNjQsICAgICAgICAgNDQ4ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweShzYXZlZCwgICAgICAgYnVmICsgNTEyLCAgICAgICAgNDQ4ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweShzYXZlZCArIDQ0OCwgYnVmICsgNyoxMjggKyA2NCwgIDY0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIG5vdCBib3Jyb3dlZCBmcm9tIGFhY2RlYy5jIC0gdGhlIGNvZGVjIGhhcyBvcmlnaW5hbCBkZXNpZ24gYWZ0ZXIgYWxsCitzdGF0aWMgaW50IG9uMmF2Y19yZWNvbnN0cnVjdF9jaGFubmVsKE9uMkFWQ0NvbnRleHQgKmMsIGludCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsIGludCBvZmZzZXQpCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgKm91dCAgID0gKGZsb2F0Kilkc3QtPmV4dGVuZGVkX2RhdGFbY2hhbm5lbF0gKyBvZmZzZXQ7CisgICAgZmxvYXQgKmluICAgID0gYy0+Y29lZmZzW2NoYW5uZWxdOworICAgIGZsb2F0ICpzYXZlZCA9IGMtPmRlbGF5W2NoYW5uZWxdOworICAgIGZsb2F0ICpidWYgICA9IGMtPm1kY3RfYnVmOworICAgIGZsb2F0ICp0ZW1wICA9IGMtPnRlbXA7CisKKyAgICBzd2l0Y2ggKGMtPndpbmRvd190eXBlKSB7CisgICAgY2FzZSBXSU5ET1dfVFlQRV9MT05HX1NUQVJUOgorICAgIGNhc2UgV0lORE9XX1RZUEVfTE9OR19TVE9QOgorICAgIGNhc2UgV0lORE9XX1RZUEVfTE9ORzoKKyAgICAgICAgYy0+bWRjdC5pbWRjdF9oYWxmKCZjLT5tZGN0LCBidWYsIGluKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXSU5ET1dfVFlQRV84U0hPUlQ6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBPTjJBVkNfU1VCRlJBTUVfU0laRTsgaSArPSBPTjJBVkNfU1VCRlJBTUVfU0laRSAvIDgpCisgICAgICAgICAgICBjLT5tZGN0X3NtYWxsLmltZGN0X2hhbGYoJmMtPm1kY3Rfc21hbGwsIGJ1ZiArIGksIGluICsgaSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICgoYy0+cHJldl93aW5kb3dfdHlwZSA9PSBXSU5ET1dfVFlQRV9MT05HIHx8CisgICAgICAgICBjLT5wcmV2X3dpbmRvd190eXBlID09IFdJTkRPV19UWVBFX0xPTkdfU1RPUCkgJiYKKyAgICAgICAgKGMtPndpbmRvd190eXBlID09IFdJTkRPV19UWVBFX0xPTkcgfHwKKyAgICAgICAgIGMtPndpbmRvd190eXBlID09IFdJTkRPV19UWVBFX0xPTkdfU1RBUlQpKSB7CisgICAgICAgIGMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQsIHNhdmVkLCBidWYsIGMtPmxvbmdfd2luLCA1MTIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0ICp3b3V0ID0gb3V0ICsgNDQ4OworICAgICAgICBtZW1jcHkob3V0LCBzYXZlZCwgNDQ4ICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICAgICAgaWYgKGMtPndpbmRvd190eXBlID09IFdJTkRPV19UWVBFXzhTSE9SVCkgeworICAgICAgICAgICAgYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KHdvdXQgKyAwKjEyOCwgc2F2ZWQgKyA0NDgsICAgICAgYnVmICsgMCoxMjgsIGMtPnNob3J0X3dpbiwgNjQpOworICAgICAgICAgICAgYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KHdvdXQgKyAxKjEyOCwgYnVmICsgMCoxMjggKyA2NCwgYnVmICsgMSoxMjgsIGMtPnNob3J0X3dpbiwgNjQpOworICAgICAgICAgICAgYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KHdvdXQgKyAyKjEyOCwgYnVmICsgMSoxMjggKyA2NCwgYnVmICsgMioxMjgsIGMtPnNob3J0X3dpbiwgNjQpOworICAgICAgICAgICAgYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KHdvdXQgKyAzKjEyOCwgYnVmICsgMioxMjggKyA2NCwgYnVmICsgMyoxMjgsIGMtPnNob3J0X3dpbiwgNjQpOworICAgICAgICAgICAgYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KHRlbXAsICAgICAgICAgYnVmICsgMyoxMjggKyA2NCwgYnVmICsgNCoxMjgsIGMtPnNob3J0X3dpbiwgNjQpOworICAgICAgICAgICAgbWVtY3B5KHdvdXQgKyA0KjEyOCwgdGVtcCwgNjQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyh3b3V0LCBzYXZlZCArIDQ0OCwgYnVmLCBjLT5zaG9ydF93aW4sIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh3b3V0ICsgMTI4LCBidWYgKyA2NCwgNDQ4ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBidWZmZXIgdXBkYXRlCisgICAgc3dpdGNoIChjLT53aW5kb3dfdHlwZSkgeworICAgIGNhc2UgV0lORE9XX1RZUEVfOFNIT1JUOgorICAgICAgICBtZW1jcHkoc2F2ZWQsICAgICAgIHRlbXAgKyA2NCwgICAgICAgICA2NCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBjLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3coc2F2ZWQgKyA2NCwgIGJ1ZiArIDQqMTI4ICsgNjQsIGJ1ZiArIDUqMTI4LCBjLT5zaG9ydF93aW4sIDY0KTsKKyAgICAgICAgYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KHNhdmVkICsgMTkyLCBidWYgKyA1KjEyOCArIDY0LCBidWYgKyA2KjEyOCwgYy0+c2hvcnRfd2luLCA2NCk7CisgICAgICAgIGMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhzYXZlZCArIDMyMCwgYnVmICsgNioxMjggKyA2NCwgYnVmICsgNyoxMjgsIGMtPnNob3J0X3dpbiwgNjQpOworICAgICAgICBtZW1jcHkoc2F2ZWQgKyA0NDgsIGJ1ZiArIDcqMTI4ICsgNjQsICA2NCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdJTkRPV19UWVBFX0xPTkdfU1RBUlQ6CisgICAgICAgIG1lbWNweShzYXZlZCwgICAgICAgYnVmICsgNTEyLCAgICAgICAgNDQ4ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweShzYXZlZCArIDQ0OCwgYnVmICsgNyoxMjggKyA2NCwgIDY0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0lORE9XX1RZUEVfTE9OR19TVE9QOgorICAgIGNhc2UgV0lORE9XX1RZUEVfTE9ORzoKKyAgICAgICAgbWVtY3B5KHNhdmVkLCAgICAgICBidWYgKyA1MTIsICAgICAgICA1MTIgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9uMmF2Y19kZWNvZGVfc3ViZnJhbWUoT24yQVZDQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSwgQVZGcmFtZSAqZHN0LCBpbnQgb2Zmc2V0KQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGksIHJldDsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJ1Zl9zaXplICogOCk7CisgICAgaWYgKGdldF9iaXRzMSgmZ2IpKSB7CisgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5oIGJpdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYy0+cHJldl93aW5kb3dfdHlwZSA9IGMtPndpbmRvd190eXBlOworICAgIGMtPndpbmRvd190eXBlICAgICAgPSBnZXRfYml0cygmZ2IsIDMpOworICAgIGlmIChjLT53aW5kb3dfdHlwZSA+PSBXSU5ET1dfVFlQRV9FWFQ0ICYmIGMtPmF2Y3R4LT5jaGFubmVscyA9PSAxKSB7CisgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic3RlcmVvIG1vZGUgd2luZG93IGZvciBtb25vIGF1ZGlvXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYy0+YmFuZF9zdGFydCAgPSBjLT5tb2Rlc1tjLT53aW5kb3dfdHlwZV0uYmFuZF9zdGFydDsKKyAgICBjLT5udW1fd2luZG93cyA9IGMtPm1vZGVzW2MtPndpbmRvd190eXBlXS5udW1fd2luZG93czsKKyAgICBjLT5udW1fYmFuZHMgICA9IGMtPm1vZGVzW2MtPndpbmRvd190eXBlXS5udW1fYmFuZHM7CisgICAgYy0+aXNfbG9uZyAgICAgPSAoYy0+d2luZG93X3R5cGUgIT0gV0lORE9XX1RZUEVfOFNIT1JUKTsKKworICAgIGMtPmdyb3VwaW5nWzBdID0gMTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgYy0+bnVtX3dpbmRvd3M7IGkrKykKKyAgICAgICAgYy0+Z3JvdXBpbmdbaV0gPSAhZ2V0X2JpdHMxKCZnYik7CisKKyAgICBvbjJhdmNfcmVhZF9tc19pbmZvKGMsICZnYik7CisgICAgZm9yIChpID0gMDsgaSA8IGMtPmF2Y3R4LT5jaGFubmVsczsgaSsrKQorICAgICAgICBpZiAoKHJldCA9IG9uMmF2Y19yZWFkX2NoYW5uZWxfZGF0YShjLCAmZ2IsIGkpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoYy0+YXZjdHgtPmNoYW5uZWxzID09IDIgJiYgYy0+bXNfcHJlc2VudCkKKyAgICAgICAgb24yYXZjX2FwcGx5X21zKGMpOworICAgIGlmIChjLT53aW5kb3dfdHlwZSA8IFdJTkRPV19UWVBFX0VYVDQpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPmF2Y3R4LT5jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgb24yYXZjX3JlY29uc3RydWN0X2NoYW5uZWwoYywgaSwgZHN0LCBvZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9uMmF2Y19yZWNvbnN0cnVjdF9zdGVyZW8oYywgZHN0LCBvZmZzZXQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9uMmF2Y19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIE9uMkFWQ0NvbnRleHQgKmMgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgaW50IG51bV9mcmFtZXMgPSAwLCBmcmFtZV9zaXplLCBhdWRpb19vZmY7CisgICAgaW50IHJldDsKKworICAgIGlmIChjLT5pc19hdjUwMCkgeworICAgICAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IE9OMkFWQ19TVUJGUkFNRV9TSVpFOworICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImdldF9idWZmZXIoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gb24yYXZjX2RlY29kZV9zdWJmcmFtZShjLCBidWYsIGJ1Zl9zaXplLCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA+IDIpIHsKKyAgICAgICAgICAgIGZyYW1lX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpOworICAgICAgICAgICAgaWYgKCFmcmFtZV9zaXplIHx8IGZyYW1lX3NpemUgPiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHN1YmZyYW1lIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3NpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtX2ZyYW1lcysrOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIGZyYW1lX3NpemUpOworICAgICAgICB9CisgICAgICAgIGlmICghbnVtX2ZyYW1lcykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyBzdWJmcmFtZXMgcHJlc2VudFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gT04yQVZDX1NVQkZSQU1FX1NJWkUgKiBudW1fZnJhbWVzOworICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImdldF9idWZmZXIoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvX29mZiA9IDA7CisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPiAyKSB7CisgICAgICAgICAgICBmcmFtZV9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gb24yYXZjX2RlY29kZV9zdWJmcmFtZShjLCBnYi5idWZmZXIsIGZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsIGF1ZGlvX29mZikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgYXVkaW9fb2ZmICs9IE9OMkFWQ19TVUJGUkFNRV9TSVpFOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIGZyYW1lX3NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIG9uMmF2Y19mcmVlX3ZsY3MoT24yQVZDQ29udGV4dCAqYykKK3sKKyAgICBpbnQgaTsKKworICAgIGZmX2ZyZWVfdmxjKCZjLT5zY2FsZV9kaWZmKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTY7IGkrKykKKyAgICAgICAgZmZfZnJlZV92bGMoJmMtPmNiX3ZsY1tpXSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBvbjJhdmNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE9uMkFWQ0NvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IDJVKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkRlY29kaW5nIG1vcmUgdGhhbiAyIGNoYW5uZWxzIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBjLT5hdmN0eCA9IGF2Y3R4OworICAgIGF2Y3R4LT5zYW1wbGVfZm10ICAgICA9IEFWX1NBTVBMRV9GTVRfRkxUUDsKKyAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSAoYXZjdHgtPmNoYW5uZWxzID09IDIpID8gQVZfQ0hfTEFZT1VUX1NURVJFTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVl9DSF9MQVlPVVRfTU9OTzsKKworICAgIGMtPmlzX2F2NTAwID0gKGF2Y3R4LT5jb2RlY190YWcgPT0gMHg1MDApOworICAgIGlmIChjLT5pc19hdjUwMCAmJiBhdmN0eC0+Y2hhbm5lbHMgPT0gMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIjB4NTAwIHZlcnNpb24gc2hvdWxkIGJlIG1vbm9cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA9PSAyKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlN0ZXJlbyBtb2RlIHN1cHBvcnQgaXMgbm90IGdvb2QsIHBhdGNoIGlzIHdlbGNvbWVcbiIpOworCisgICAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisgICAgICAgIGMtPnNjYWxlX3RhYltpXSA9IGNlaWwocG93KDEwLjAsIGkgKiAwLjEpICogMTYpIC8gMzI7CisgICAgZm9yICg7IGkgPCAxMjg7IGkrKykKKyAgICAgICAgYy0+c2NhbGVfdGFiW2ldID0gY2VpbChwb3coMTAuMCwgaSAqIDAuMSkgKiAwLjUpOworCisgICAgaWYgKGF2Y3R4LT5zYW1wbGVfcmF0ZSA8IDMyMDAwIHx8IGF2Y3R4LT5jaGFubmVscyA9PSAxKQorICAgICAgICBtZW1jcHkoYy0+bG9uZ193aW4sIGZmX29uMmF2Y193aW5kb3dfbG9uZ18yNDAwMCwKKyAgICAgICAgICAgICAgIDEwMjQgKiBzaXplb2YoKmMtPmxvbmdfd2luKSk7CisgICAgZWxzZQorICAgICAgICBtZW1jcHkoYy0+bG9uZ193aW4sIGZmX29uMmF2Y193aW5kb3dfbG9uZ18zMjAwMCwKKyAgICAgICAgICAgICAgIDEwMjQgKiBzaXplb2YoKmMtPmxvbmdfd2luKSk7CisgICAgbWVtY3B5KGMtPnNob3J0X3dpbiwgZmZfb24yYXZjX3dpbmRvd19zaG9ydCwgMTI4ICogc2l6ZW9mKCpjLT5zaG9ydF93aW4pKTsKKworICAgIGMtPm1vZGVzID0gKGF2Y3R4LT5zYW1wbGVfcmF0ZSA8PSA0MDAwMCkgPyBmZl9vbjJhdmNfbW9kZXNfNDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmZfb24yYXZjX21vZGVzXzQ0OworICAgIGMtPnd0ZiAgID0gKGF2Y3R4LT5zYW1wbGVfcmF0ZSA8PSA0MDAwMCkgPyB3dGZfNDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogd3RmXzQ0OworCisgICAgZmZfbWRjdF9pbml0KCZjLT5tZGN0LCAgICAgICAxMSwgMSwgMS4wIC8gKDMyNzY4LjAgKiAxMDI0LjApKTsKKyAgICBmZl9tZGN0X2luaXQoJmMtPm1kY3RfaGFsZiwgIDEwLCAxLCAxLjAgLyAoMzI3NjguMCAqIDUxMi4wKSk7CisgICAgZmZfbWRjdF9pbml0KCZjLT5tZGN0X3NtYWxsLCAgOCwgMSwgMS4wIC8gKDMyNzY4LjAgKiAxMjguMCkpOworICAgIGZmX2ZmdF9pbml0KCZjLT5mZnQxMjgsICA2LCAwKTsKKyAgICBmZl9mZnRfaW5pdCgmYy0+ZmZ0MjU2LCAgNywgMCk7CisgICAgZmZfZmZ0X2luaXQoJmMtPmZmdDUxMiwgIDgsIDEpOworICAgIGZmX2ZmdF9pbml0KCZjLT5mZnQxMDI0LCA5LCAxKTsKKyAgICBjLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBpZiAoIWMtPmZkc3ApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoaW5pdF92bGMoJmMtPnNjYWxlX2RpZmYsIDksIE9OMkFWQ19TQ0FMRV9ESUZGUywKKyAgICAgICAgICAgICAgICAgZmZfb24yYXZjX3NjYWxlX2RpZmZfYml0cywgIDEsIDEsCisgICAgICAgICAgICAgICAgIGZmX29uMmF2Y19zY2FsZV9kaWZmX2NvZGVzLCA0LCA0LCAwKSkgeworICAgICAgICBnb3RvIHZsY19mYWlsOworICAgIH0KKyAgICBmb3IgKGkgPSAxOyBpIDwgOTsgaSsrKSB7CisgICAgICAgIGludCBpZHggPSBpIC0gMTsKKyAgICAgICAgaWYgKGZmX2luaXRfdmxjX3NwYXJzZSgmYy0+Y2JfdmxjW2ldLCA5LCBmZl9vbjJhdmNfcXVhZF9jYl9lbGVtc1tpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX29uMmF2Y19xdWFkX2NiX2JpdHNbaWR4XSwgIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfb24yYXZjX3F1YWRfY2JfY29kZXNbaWR4XSwgNCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9vbjJhdmNfcXVhZF9jYl9zeW1zW2lkeF0sICAyLCAyLCAwKSkgeworICAgICAgICAgICAgZ290byB2bGNfZmFpbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSA5OyBpIDwgMTY7IGkrKykgeworICAgICAgICBpbnQgaWR4ID0gaSAtIDk7CisgICAgICAgIGlmIChmZl9pbml0X3ZsY19zcGFyc2UoJmMtPmNiX3ZsY1tpXSwgOSwgZmZfb24yYXZjX3BhaXJfY2JfZWxlbXNbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9vbjJhdmNfcGFpcl9jYl9iaXRzW2lkeF0sICAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX29uMmF2Y19wYWlyX2NiX2NvZGVzW2lkeF0sIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfb24yYXZjX3BhaXJfY2Jfc3ltc1tpZHhdLCAgMiwgMiwgMCkpIHsKKyAgICAgICAgICAgIGdvdG8gdmxjX2ZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK3ZsY19mYWlsOgorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGluaXQgVkxDXG4iKTsKKyAgICBvbjJhdmNfZnJlZV92bGNzKGMpOworICAgIGF2X2ZyZWVwKCZjLT5mZHNwKTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgb24yYXZjX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgT24yQVZDQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmZl9tZGN0X2VuZCgmYy0+bWRjdCk7CisgICAgZmZfbWRjdF9lbmQoJmMtPm1kY3RfaGFsZik7CisgICAgZmZfbWRjdF9lbmQoJmMtPm1kY3Rfc21hbGwpOworICAgIGZmX2ZmdF9lbmQoJmMtPmZmdDEyOCk7CisgICAgZmZfZmZ0X2VuZCgmYy0+ZmZ0MjU2KTsKKyAgICBmZl9mZnRfZW5kKCZjLT5mZnQ1MTIpOworICAgIGZmX2ZmdF9lbmQoJmMtPmZmdDEwMjQpOworCisgICAgYXZfZnJlZXAoJmMtPmZkc3ApOworCisgICAgb24yYXZjX2ZyZWVfdmxjcyhjKTsKKworICAgIHJldHVybiAwOworfQorCisKK0FWQ29kZWMgZmZfb24yYXZjX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm9uMmF2YyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9uMiBBdWRpbyBmb3IgVmlkZW8gQ29kZWMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfT04yQVZDLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihPbjJBVkNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBvbjJhdmNfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gb24yYXZjX2RlY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBvbjJhdmNfZGVjb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9vbjJhdmNkYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9vbjJhdmNkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlNTk4MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL29uMmF2Y2RhdGEuYwpAQCAtMCwwICsxLDkzODMgQEAKKy8qCisgKiBPbjIgQXVkaW8gZm9yIFZpZGVvIENvZGVjIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAib24yYXZjZGF0YS5oIgorCitzdGF0aWMgY29uc3QgaW50IG9uMmF2Y19zd2Jfc3RhcnRfbG9uZ1tdID0geworICAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDgsICA1NiwgIDY0LAorICAgICA3MiwgIDgwLCAgODgsICA5NiwgMTA4LCAxMjAsIDEzMiwgMTQ0LCAxNTYsIDE3MiwgMTg4LCAyMDQsIDIyNCwgMjQ0LAorICAgIDI2NCwgMjg4LCAzMTIsIDM0MCwgMzY4LCA0MDAsIDQzMiwgNDY0LCA0OTYsIDUyOCwgNTYwLCA1OTIsIDYyNCwgNjU2LAorICAgIDY4OCwgNzIwLCA3NTIsIDc4NCwgODE2LCA4NDgsIDg4MCwgMTAyNAorfTsKKworc3RhdGljIGNvbnN0IGludCBvbjJhdmNfc3diX3N0YXJ0X3Nob3J0W10gPSB7CisgICAgMCwgNCwgOCwgMTIsIDE2LCAyMCwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2OCwgODAsIDEwOCwgMTI4Cit9OworCitzdGF0aWMgY29uc3QgaW50IG9uMmF2Y19zd2Jfc3RhcnRfbW9kZV80XzQwW10gPSB7CisgICAgICAwLCAgIDgsICAxNiwgIDI0LCAgMzIsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgIDk2LCAxMDQsCisgICAgMTEyLCAxMjAsIDEyOCwgMTQ0LCAxNjAsIDE3NiwgMTkyLCAyMDgsIDIyNCwgMjQwLCAyNTYsIDI2NCwgMjcyLCAyODAsCisgICAgMjg4LCAyOTYsIDMwNCwgMzEyLCAzMjAsIDMyOCwgMzM2LCAzNDQsIDM1MiwgMzYwLCAzNjgsIDM3NiwgMzg0LCA0MDAsCisgICAgNDE2LCA0MzIsIDQ0OCwgNDY0LCA0ODAsIDQ5NiwgNTEyLCA1MjAsIDUyOCwgNTM2LCA1NDQsIDU1MiwgNTYwLCA1NjgsCisgICAgNTc2LCA1ODQsIDU5MiwgNjAwLCA2MDgsIDYxNiwgNjI0LCA2MzIsIDY0MCwgNjQ4LCA2NTYsIDY2NCwgNjcyLCA2ODAsCisgICAgNjg4LCA2OTYsIDcwNCwgNzEyLCA3MjAsIDcyOCwgNzM2LCA3NDQsIDc1MiwgNzYwLCA3NjgsIDgwMCwgODMyLCA4NjQsCisgICAgODk2LCA5MjgsIDk2MCwgOTkyLCAxMDI0Cit9OworCitzdGF0aWMgY29uc3QgaW50IG9uMmF2Y19zd2Jfc3RhcnRfbW9kZV81XzQwW10gPSB7CisgICAgICAwLCAgIDgsICAxNiwgIDI0LCAgMzIsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsIDExMiwgMTI4LCAxMzYsCisgICAgMTQ0LCAxNTIsIDE2MCwgMTY4LCAxNzYsIDE4NCwgMTkyLCAyMDgsIDIyNCwgMjQwLCAyNTYsIDI2NCwgMjcyLCAyODAsCisgICAgMjg4LCAyOTYsIDMwNCwgMzEyLCAzMjAsIDMyOCwgMzM2LCAzNDQsIDM1MiwgMzYwLCAzNjgsIDM3NiwgMzg0LCA0MTYsCisgICAgNDQ4LCA0ODAsIDUxMiwgNTE2LCA1MjAsIDUyNCwgNTI4LCA1MzIsIDUzNiwgNTQwLCA1NDgsIDU1NiwgNTY4LCA1ODAsCisgICAgNTkyLCA2MDgsIDYyNCwgNjQwLCA2NTYsIDY3MiwgNjg4LCA3MDQsIDcyMCwgNzM2LCA3NTIsIDc2OCwgNzg0LCA4MDAsCisgICAgODE2LCA4MzIsIDg0OCwgODY0LCA4ODAsIDg5NiwgOTEyLCA5MjgsIDk0NCwgMTAyNAorfTsKKworc3RhdGljIGNvbnN0IGludCBvbjJhdmNfc3diX3N0YXJ0X21vZGVfNl80MFtdID0geworICAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzYsICA0NCwgIDU2LCAgNjgsICA4MCwgIDk2LAorICAgIDExMiwgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIwOCwgMjI0LCAyNDAsIDI1NiwgMjcyLCAyODgsIDMwNCwgMzIwLAorICAgIDMzNiwgMzUyLCAzNjgsIDM4NCwgNDAwLCA0MTYsIDQzMiwgNTEyLCA1MjAsIDUyOCwgNTM2LCA1NDQsIDU1MiwgNTYwLAorICAgIDU2OCwgNTc2LCA1OTIsIDYwOCwgNjI0LCA2NDAsIDY0OCwgNjU2LCA2NjQsIDY3MiwgNjgwLCA2ODgsIDY5NiwgNzA0LAorICAgIDcyMCwgNzM2LCA3NTIsIDc2OCwgNzc2LCA3ODQsIDc5MiwgODAwLCA4MDgsIDgxNiwgODI0LCA4MzIsIDg0MCwgODQ4LAorICAgIDg1NiwgODY0LCA4NzIsIDg4MCwgODg4LCA4OTYsIDkyOCwgOTYwLCA5OTIsIDEwMjQKK307CisKK3N0YXRpYyBjb25zdCBpbnQgb24yYXZjX3N3Yl9zdGFydF9tb2RlXzRfNDRbXSA9IHsKKyAgICAgIDAsICAgOCwgIDE2LCAgMjQsICAzMiwgIDQwLCAgNDgsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgOTYsIDEwNCwKKyAgICAxMTIsIDEyMCwgMTI4LCAxMzYsIDE0NCwgMTUyLCAxNjAsIDE2OCwgMTc2LCAxODQsIDE5MiwgMjAwLCAyMDgsIDIxNiwKKyAgICAyMjQsIDIzMiwgMjQwLCAyNDgsIDI1NiwgMjY0LCAyNzIsIDI4MCwgMjg4LCAyOTYsIDMwNCwgMzEyLCAzMjAsIDMyOCwKKyAgICAzMzYsIDM0NCwgMzUyLCAzNjAsIDM2OCwgMzc2LCAzODQsIDM5MiwgNDAwLCA0MDgsIDQxNiwgNDI0LCA0MzIsIDQ0MCwKKyAgICA0NDgsIDQ1NiwgNDY0LCA0NzIsIDQ4MCwgNDg4LCA0OTYsIDUwNCwgNTEyLCA1MjgsIDU0NCwgNTYwLCA1NzYsIDU5MiwKKyAgICA2MDgsIDYyNCwgNjQwLCA2NzIsIDcwNCwgNzM2LCA3NjgsIDgzMiwgODk2LCA5NjAsIDEwMjQKK307CisKK3N0YXRpYyBjb25zdCBpbnQgb24yYXZjX3N3Yl9zdGFydF9tb2RlXzVfNDRbXSA9IHsKKyAgICAgIDAsICAgOCwgIDE2LCAgMjQsICAzMiwgIDQwLCAgNDgsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgOTYsIDEwNCwKKyAgICAxMTIsIDEyMCwgMTI4LCAxMzYsIDE0NCwgMTUyLCAxNjAsIDE2OCwgMTc2LCAxODQsIDE5MiwgMjAwLCAyMDgsIDIxNiwKKyAgICAyMjQsIDIzMiwgMjQwLCAyNDgsIDI1NiwgMjcyLCAyODgsIDMwNCwgMzIwLCAzNTIsIDM4NCwgNDQ4LCA1MTIsIDUxNiwKKyAgICA1MjAsIDUyNCwgNTI4LCA1MzIsIDUzNiwgNTQwLCA1NDgsIDU1NiwgNTY4LCA1ODAsIDU5MiwgNjA4LCA2MjQsIDY0MCwKKyAgICA2NTYsIDY3MiwgNjg4LCA3MDQsIDcyMCwgNzM2LCA3NTIsIDc2OCwgNzg0LCA4MDAsIDgxNiwgODMyLCA4NDgsIDg2NCwKKyAgICA4ODAsIDg5NiwgOTEyLCA5MjgsIDk0NCwgMTAyNAorfTsKKworc3RhdGljIGNvbnN0IGludCBvbjJhdmNfc3diX3N0YXJ0X21vZGVfNl80NFtdID0geworICAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzYsICA0NCwgIDU2LCAgNjgsICA4MCwgIDk2LAorICAgIDExMiwgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIwOCwgMjI0LCAyNDAsIDI1NiwgMjcyLCAyODgsIDMwNCwgMzIwLAorICAgIDMzNiwgMzUyLCAzNjgsIDM4NCwgNDAwLCA0MTYsIDQzMiwgNTEyLCA1MjAsIDUyOCwgNTM2LCA1NDQsIDU1MiwgNTYwLAorICAgIDU2OCwgNTc2LCA1ODQsIDU5MiwgNjAwLCA2MDgsIDYxNiwgNjI0LCA2MzIsIDY0MCwgNjQ4LCA2NTYsIDY2NCwgNjcyLAorICAgIDY4MCwgNjg4LCA2OTYsIDcwNCwgNzEyLCA3MjAsIDcyOCwgNzM2LCA3NDQsIDc1MiwgNzYwLCA3NjgsIDc4NCwgODAwLAorICAgIDgxNiwgODMyLCA4NjQsIDg5NiwgOTYwLCAxMDI0Cit9OworCitjb25zdCBPbjJBVkNNb2RlIGZmX29uMmF2Y19tb2Rlc180MFs4XSA9IHsKKyAgICB7IDEsIDQ5LCBvbjJhdmNfc3diX3N0YXJ0X2xvbmcgfSwKKyAgICB7IDEsIDQ5LCBvbjJhdmNfc3diX3N0YXJ0X2xvbmcgfSwKKyAgICB7IDEsIDQ5LCBvbjJhdmNfc3diX3N0YXJ0X2xvbmcgfSwKKyAgICB7IDgsIDE0LCBvbjJhdmNfc3diX3N0YXJ0X3Nob3J0IH0sCisgICAgeyAxLCA4OCwgb24yYXZjX3N3Yl9zdGFydF9tb2RlXzRfNDAgfSwKKyAgICB7IDEsIDc5LCBvbjJhdmNfc3diX3N0YXJ0X21vZGVfNV80MCB9LAorICAgIHsgMSwgNzksIG9uMmF2Y19zd2Jfc3RhcnRfbW9kZV82XzQwIH0sCisgICAgeyAxLCA0OSwgb24yYXZjX3N3Yl9zdGFydF9sb25nIH0sCit9OworCitjb25zdCBPbjJBVkNNb2RlIGZmX29uMmF2Y19tb2Rlc180NFs4XSA9IHsKKyAgICB7IDEsIDQ5LCBvbjJhdmNfc3diX3N0YXJ0X2xvbmcgfSwKKyAgICB7IDEsIDQ5LCBvbjJhdmNfc3diX3N0YXJ0X2xvbmcgfSwKKyAgICB7IDEsIDQ5LCBvbjJhdmNfc3diX3N0YXJ0X2xvbmcgfSwKKyAgICB7IDgsIDE0LCBvbjJhdmNfc3diX3N0YXJ0X3Nob3J0IH0sCisgICAgeyAxLCA4MCwgb24yYXZjX3N3Yl9zdGFydF9tb2RlXzRfNDQgfSwKKyAgICB7IDEsIDc1LCBvbjJhdmNfc3diX3N0YXJ0X21vZGVfNV80NCB9LAorICAgIHsgMSwgNzUsIG9uMmF2Y19zd2Jfc3RhcnRfbW9kZV82XzQ0IH0sCisgICAgeyAxLCA0OSwgb24yYXZjX3N3Yl9zdGFydF9sb25nIH0sCit9OworCitjb25zdCB1aW50MzJfdCBmZl9vbjJhdmNfc2NhbGVfZGlmZl9jb2Rlc1tPTjJBVkNfU0NBTEVfRElGRlNdID0geworICAgIDB4NkZGRkYsIDB4QkZGRjIsIDB4QkZGRjMsIDB4QkZGRjQsIDB4QkZGRjUsIDB4QkZGRjYsCisgICAgMHhCRkZGNywgMHhCRkZGOCwgMHhCRkZGOSwgMHhCRkZGQSwgMHhCRkZGQiwgMHhCRkZGQywKKyAgICAweEJGRkZELCAweEJGRkZFLCAweEJGRkZGLCAweERGOUEwLCAweERGOUExLCAweERGOUEyLAorICAgIDB4REY5QTMsIDB4REY5QTQsIDB4REY5QTUsIDB4REY5QTYsIDB4REY5QTcsIDB4REY5QTgsCisgICAgMHhERjlBOSwgMHgzN0ZGRSwgMHg2RkNERSwgMHg2RkZGQSwgMHgwQkZGNywgMHgwQjdGRiwKKyAgICAweDBERjlGLCAweDA1RkY4LCAweDBCN0ZFLCAweDA1RkY5LCAweDA2RkNFLCAweDA1QkZFLAorICAgIDB4MDM3RkUsIDB4MDJERkUsIDB4MDBERkEsIDB4MDBERkUsIDB4MDE3RkMsIDB4MDBEQkUsCisgICAgMHgwMEI3RSwgMHgwMDVGRSwgMHgwMDM3RCwgMHgwMDJERSwgMHgwMDE3RSwgMHgwMDE2QywKKyAgICAweDAwMERFLCAweDAwMEJFLCAweDAwMDZDLCAweDAwMDVBLCAweDAwMDNFLCAweDAwMDM0LAorICAgIDB4MDAwMkMsIDB4MDAwMUYsIDB4MDAwMEUsIDB4MDAwMEUsIDB4MDAwMDYsIDB4MDAwMDIsCisgICAgMHgwMDAwMCwgMHgwMDAwNCwgMHgwMDAwQSwgMHgwMDAwQywgMHgwMDAxRSwgMHgwMDAxRSwKKyAgICAweDAwMDJFLCAweDAwMDM1LCAweDAwMDNGLCAweDAwMDVFLCAweDAwMDZFLCAweDAwMERBLAorICAgIDB4MDAxNkQsIDB4MDAxNkUsIDB4MDAxQjYsIDB4MDAyRkUsIDB4MDAzNkUsIDB4MDAzN0MsCisgICAgMHgwMDVCRSwgMHgwMDZERSwgMHgwMDZGRSwgMHgwMERCRiwgMHgwMERGQiwgMHgwMTZGRSwKKyAgICAweDAxN0ZELCAweDAxQkZFLCAweDAxQkYyLCAweDAyRkZFLCAweDA2RkNDLCAweDA1RkZFLAorICAgIDB4MDVGRkEsIDB4MDZGRkUsIDB4MEJGRjYsIDB4MEJGRkUsIDB4MERGOUUsIDB4MDBERjgsCisgICAgMHgwREZGRSwgMHgzN0ZGQywgMHg2RkZGQiwgMHg1RkZGOCwgMHhERjlBQSwgMHhERjlBQiwKKyAgICAweERGOUFDLCAweERGOUFELCAweERGOUFFLCAweERGOUFGLCAweERGOUIwLCAweERGOUIxLAorICAgIDB4REY5QjIsIDB4REY5QjMsIDB4NkZGRkUsIDB4REY5QjQsIDB4REY5QjUsIDB4REY5QjYsCisgICAgMHhERjlCNywgMHhERjlCOCwgMHhERjlCOSwgMHhERjlCQSwgMHhERjlCQiwgMHhERjlCRSwKKyAgICAweERGOUJGLAorfTsKKworY29uc3QgdWludDhfdCBmZl9vbjJhdmNfc2NhbGVfZGlmZl9iaXRzW09OMkFWQ19TQ0FMRV9ESUZGU10gPSB7CisgICAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwKKyAgICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLAorICAgIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsCisgICAgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwKKyAgICAyMSwgMTksIDIwLCAyMCwgMTYsIDE2LAorICAgIDE3LCAxNSwgMTYsIDE1LCAxNiwgMTUsCisgICAgMTUsIDE0LCAxMywgMTMsIDEzLCAxMywKKyAgICAxMiwgMTEsIDExLCAxMCwgIDksICA5LAorICAgICA5LCAgOCwgIDgsICA3LCAgNywgIDcsCisgICAgIDYsICA1LCAgNSwgIDQsICAzLCAgMywKKyAgICAgMiwgIDMsICA0LCAgNSwgIDUsICA2LAorICAgICA2LCAgNywgIDcsICA3LCAgOCwgIDksCisgICAgIDksICA5LCAxMCwgMTAsIDExLCAxMSwKKyAgICAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDEzLCAxNCwgMTQsIDE0LCAxNiwgMTUsCisgICAgMTUsIDE2LCAxNiwgMTYsIDE3LCAxMywKKyAgICAxNywgMTksIDIwLCAxOSwgMjEsIDIxLAorICAgIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsCisgICAgMjEsIDIxLCAyMCwgMjEsIDIxLCAyMSwKKyAgICAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLAorICAgIDIxLAorfTsKKworI2RlZmluZSBPTjJBVkNfQ0IxX0NPREVTIDQxCitzdGF0aWMgY29uc3QgdWludDMyX3Qgb24yYXZjX2NiMV9jb2Rlc1tPTjJBVkNfQ0IxX0NPREVTXSA9IHsKKyAgICAweDAwMDAsIDB4MDAyMiwgMHgwMDFDLCAweDAwMUIsIDB4MDAyNCwgMHgwMDMwLAorICAgIDB4MDAyOSwgMHgwMDI3LCAweDAwMjEsIDB4MDAyQiwgMHgwMDJFLCAweDAwMjAsCisgICAgMHgwMDI2LCAweDAwMzMsIDB4MDAzMSwgMHgwMDJDLCAweDAwMkEsIDB4MDAxRSwKKyAgICAweDAwOTQsIDB4MDFGRiwgMHgwMUY3LCAweDAxMkUsIDB4MDAxQSwgMHgwMUY1LAorICAgIDB4MDA3RSwgMHgwMTJDLCAweDAxRkMsIDB4MDAyRCwgMHgwMDMyLCAweDAwMjgsCisgICAgMHgwMDJGLCAweDAwMUQsIDB4MDFGRCwgMHgwMTJELCAweDAwN0MsIDB4MDFGNCwKKyAgICAweDAwMjMsIDB4MDEyRiwgMHgwMUY2LCAweDAxRkUsIDB4MDA5NSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9uMmF2Y19jYjFfYml0c1tPTjJBVkNfQ0IxX0NPREVTXSA9IHsKKyAgICAxLCAgNiwgIDUsICA1LCAgNiwgIDYsCisgICAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAorICAgIDYsICA2LCAgNiwgIDYsICA2LCAgNSwKKyAgICA4LCAgOSwgIDksICA5LCAgNSwgIDksCisgICAgNywgIDksICA5LCAgNiwgIDYsICA2LAorICAgIDYsICA1LCAgOSwgIDksICA3LCAgOSwKKyAgICA2LCAgOSwgIDksICA5LCAgOCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBvbjJhdmNfY2IxX3N5bXNbT04yQVZDX0NCMV9DT0RFU10gPSB7CisgICAgMHgwMDAwLCAweDAwMTEsIDB4MDAxRiwgMHgwMEYxLCAweDAwRkYsIDB4MDEwMSwKKyAgICAweDAxMEYsIDB4MDExMCwgMHgwMUYwLCAweDBGMDEsIDB4MEYwRiwgMHgwRjEwLAorICAgIDB4MEZGMCwgMHgxMDAxLCAweDEwMEYsIDB4MTAxMCwgMHgxMEYwLCAweDExMDAsCisgICAgMHgxMTExLCAweDExMUYsIDB4MTFGMSwgMHgxMUZGLCAweDFGMDAsIDB4MUYxMSwKKyAgICAweDFGMUYsIDB4MUZGMSwgMHgxRkZGLCAweEYwMDEsIDB4RjAwRiwgMHhGMDEwLAorICAgIDB4RjBGMCwgMHhGMTAwLCAweEYxMTEsIDB4RjExRiwgMHhGMUYxLCAweEYxRkYsCisgICAgMHhGRjAwLCAweEZGMTEsIDB4RkYxRiwgMHhGRkYxLCAweEZGRkYsCit9OworCisjZGVmaW5lIE9OMkFWQ19DQjJfQ09ERVMgNDEKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBvbjJhdmNfY2IyX2NvZGVzW09OMkFWQ19DQjJfQ09ERVNdID0geworICAgIDB4MDAwNiwgMHgwMDAzLCAweDAwMUYsIDB4MDAxRSwgMHgwMDAwLCAweDAwMTQsCisgICAgMHgwMDA5LCAweDAwMEUsIDB4MDAwRCwgMHgwMDBDLCAweDAwMTUsIDB4MDAwOCwKKyAgICAweDAwMTAsIDB4MDAwRiwgMHgwMDA0LCAweDAwMTIsIDB4MDAwNywgMHgwMDE2LAorICAgIDB4MDAwNSwgMHgwMDJGLCAweDAwMTcsIDB4MDAwNiwgMHgwMDFELCAweDAwMkMsCisgICAgMHgwMDVFLCAweDAwMTQsIDB4MDAxNiwgMHgwMDA2LCAweDAwMTEsIDB4MDAwQSwKKyAgICAweDAwMTMsIDB4MDAxQywgMHgwMDJELCAweDAwMTUsIDB4MDA1RiwgMHgwMDJFLAorICAgIDB4MDAwMiwgMHgwMDA3LCAweDAwNUQsIDB4MDA1QywgMHgwMDA0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb24yYXZjX2NiMl9iaXRzW09OMkFWQ19DQjJfQ09ERVNdID0geworICAgIDMsICA1LCAgNSwgIDUsICA1LCAgNSwKKyAgICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsCisgICAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAorICAgIDcsICA3LCAgNywgIDcsICA1LCAgNywKKyAgICA3LCAgNywgIDcsICA1LCAgNSwgIDUsCisgICAgNSwgIDUsICA3LCAgNywgIDcsICA3LAorICAgIDUsICA3LCAgNywgIDcsICA3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG9uMmF2Y19jYjJfc3ltc1tPTjJBVkNfQ0IyX0NPREVTXSA9IHsKKyAgICAweDAwMDAsIDB4MDAxMSwgMHgwMDFGLCAweDAwRjEsIDB4MDBGRiwgMHgwMTAxLAorICAgIDB4MDEwRiwgMHgwMTEwLCAweDAxRjAsIDB4MEYwMSwgMHgwRjBGLCAweDBGMTAsCisgICAgMHgwRkYwLCAweDEwMDEsIDB4MTAwRiwgMHgxMDEwLCAweDEwRjAsIDB4MTEwMCwKKyAgICAweDExMTEsIDB4MTExRiwgMHgxMUYxLCAweDExRkYsIDB4MUYwMCwgMHgxRjExLAorICAgIDB4MUYxRiwgMHgxRkYxLCAweDFGRkYsIDB4RjAwMSwgMHhGMDBGLCAweEYwMTAsCisgICAgMHhGMEYwLCAweEYxMDAsIDB4RjExMSwgMHhGMTFGLCAweEYxRjEsIDB4RjFGRiwKKyAgICAweEZGMDAsIDB4RkYxMSwgMHhGRjFGLCAweEZGRjEsIDB4RkZGRiwKK307CisKKyNkZWZpbmUgT04yQVZDX0NCM19DT0RFUyAzMTMKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBvbjJhdmNfY2IzX2NvZGVzW09OMkFWQ19DQjNfQ09ERVNdID0geworICAgIDB4MDAwMDAsIDB4MDAwNDQsIDB4MDAwNDIsIDB4MDAwMzQsIDB4MDAwMkUsIDB4MDAwQ0QsCisgICAgMHgwMDJERiwgMHgwMDI0QSwgMHgwMDBDQywgMHgwMDIyRSwgMHgwMDJENiwgMHgwMDAzMSwKKyAgICAweDAwMDNCLCAweDAwMDQ4LCAweDAwMDUyLCAweDAwMDU2LCAweDAwMUI4LCAweDAwMTYwLAorICAgIDB4MDAxRkEsIDB4MDAxNUUsIDB4MDAxNUMsIDB4MDAxNEUsIDB4MDAwM0MsIDB4MDAxMEMsCisgICAgMHgwMDE2NiwgMHgwMDBDQSwgMHgwMzI0QywgMHgwMEZEQSwgMHgwMDNERSwgMHgwMDJEQiwKKyAgICAweDAwNTdGLCAweDAyQzlFLCAweDAwOEJGLCAweDAwMzdGLCAweDAyMURDLCAweDAwQjFFLAorICAgIDB4MDAyREUsIDB4MDAyRDIsIDB4MDAwQzgsIDB4MDE0RDYsIDB4MDM1NzYsIDB4MDAyQ0EsCisgICAgMHgwMDJDRiwgMHgwMDNEQiwgMHgwMDdGRSwgMHgwMUY3RSwgMHgwMDVBMywgMHgwMDhCRSwKKyAgICAweDAyRDdFLCAweDAwMkQzLCAweDAwMzdFLCAweDAwMDRELCAweDAwMDRDLCAweDAwMDQxLAorICAgIDB4MDAxNkEsIDB4MDAxMEQsIDB4MDAxNUQsIDB4MDAxMUYsIDB4MDAxNjIsIDB4MDAyMUUsCisgICAgMHgwMDA1NSwgMHgwMDE2MSwgMHgwMDFCRSwgMHgwMDA0RSwgMHgwMDA0QSwgMHgwMDA0QiwKKyAgICAweDAwM0VFLCAweDAwMzUyLCAweDAwNDNBLCAweDAwMzNFLCAweDAwMzVDLCAweDAwMzZDLAorICAgIDB4MDAwNTAsIDB4MDAzMkYsIDB4MDAzRDYsIDB4MDAwMzksIDB4MDA2N0UsIDB4MDA1MzYsCisgICAgMHgwMDBGRSwgMHgwMDFGNCwgMHgwMDM2RCwgMHgwMDdFRiwgMHgwMENGRSwgMHgwMDJEMCwKKyAgICAweDAwRjhDLCAweDAwRDk2LCAweDAwMUU5LCAweDAwMUY2LCAweDAwNDc2LCAweDAwMzY3LAorICAgIDB4MDAxRjIsIDB4MDFGRjYsIDB4MDE2QkIsIDB4MDA3RkMsIDB4MDBENUMsIDB4MDBCMjQsCisgICAgMHgwMEM5MiwgMHgwMDE0RiwgMHgwMUVBNiwgMHgwMTkzNiwgMHgwMDM2NiwgMHgwMDM1RSwKKyAgICAweDAwMTE2LCAweDAwRkJFLCAweDAxQjVFLCAweDAwOTJGLCAweDAwN0VFLCAweDAwQ0VFLAorICAgIDB4MDBCMjYsIDB4MDAxMUUsIDB4MDE0REYsIDB4MDM1REUsIDB4MDAwMzAsIDB4MDA0NzMsCisgICAgMHgwMDVBMiwgMHgwMDFCQywgMHgwMDBENiwgMHgwMDJEQSwgMHgwMEI1RSwgMHgwMDdBQSwKKyAgICAweDAwMkM4LCAweDAwRDk0LCAweDAwRDk3LCAweDAwMUFBLCAweDAwMUVFLCAweDAwMDNBLAorICAgIDB4MDM1REYsIDB4MDNENEYsIDB4MDA2NEYsIDB4MDA2NEEsIDB4MDJENzMsIDB4MUFCQkUsCisgICAgMHgwQjFDRiwgMHgwMEY4RSwgMHgwNkFGRiwgMHgwNDc1RSwgMHgwMDQ3MiwgMHgwMDU5NiwKKyAgICAweDAwM0U3LCAweDAwMzZFLCAweDAwMTk2LCAweDAzNTdFLCAweDAzRjZFLCAweDAzMjRFLAorICAgIDB4MDMyNEYsIDB4MDE2M0IsIDB4MDE5MkYsIDB4MDAxQjQsIDB4MDMyNkEsIDB4MDJDOUYsCisgICAgMHgwMDIxRiwgMHgwRjhGRiwgMHgwNjRENiwgMHgwMDdCRSwgMHgwMERERiwgMHgwMzNCQywKKyAgICAweDAzM0JELCAweDA2QUVFLCAweDAwODc2LCAweDA3QzdFLCAweDBCMUNFLCAweDAwRDc2LAorICAgIDB4MDBEREMsIDB4MDAxRUMsIDB4MDY0OUIsIDB4MEIxQ0QsIDB4MDBGOEQsIDB4MDA3RDYsCisgICAgMHgwMUFFRSwgMHgwMTYzRiwgMHgwM0UzRSwgMHgwMEE2QSwgMHgwNkQ3RSwgMHgwRERERiwKKyAgICAweDAwRjdFLCAweDAwREFFLCAweDAwMzZGLCAweDAwMzM4LCAweDAwMTZDLCAweDAzM0JGLAorICAgIDB4MDM2QkUsIDB4MDFGRjcsIDB4MDE5MzcsIDB4MDFBQkEsIDB4MDE0RDcsIDB4MDAxNEMsCisgICAgMHgwMUY3RiwgMHgwNDc1RiwgMHgwMDA0MCwgMHgwN0ZGQywgMHgwM0Y2RiwgMHgwMDQ3NywKKyAgICAweDAwNDk2LCAweDAxNERFLCAweDA2NDlBLCAweDA2NEQ3LCAweDAyQzlDLCAweDBCMUNDLAorICAgIDB4MUFCQkYsIDB4MDA2NDgsIDB4MDA2QkEsIDB4MDAzNjQsIDB4MDAzMkUsIDB4MDAxMjYsCisgICAgMHgwM0Q0RSwgMHgwMkM3MiwgMHgwMTFENiwgMHgwMTYzOCwgMHgwMTkzNCwgMHgwMkM5RCwKKyAgICAweDAwMTZFLCAweDAyMURELCAweDAzREZGLCAweDAwMUYwLCAweDA3RkZFLCAweDA0M0JGLAorICAgIDB4MDBENUUsIDB4MDBGQUUsIDB4MDA5MkUsIDB4MDdGRkYsIDB4MEY4RkUsIDB4MDJEN0YsCisgICAgMHgwNDNCRSwgMHgwNkQ3RiwgMHgwMDhFOSwgMHgwMEZGQSwgMHgwMDIxQywgMHgwNkVFRSwKKyAgICAweDBENURFLCAweDAwRjU3LCAweDAwQ0ZGLCAweDAxNkJBLCAweDA3RkZELCAweDA2QUZFLAorICAgIDB4MDIxREUsIDB4MEREREUsIDB4MDIzQUUsIDB4MDBGQUYsIDB4MDA2RDYsIDB4MDAzN0IsCisgICAgMHgwMDNFNiwgMHgwMDFCOSwgMHgwMUYxRSwgMHgwMzNCRSwgMHgwMTkyRSwgMHgwMTZCRSwKKyAgICAweDAxRkI2LCAweDAxQkJBLCAweDAwMTlFLCAweDAzNzc2LCAweDAzREZFLCAweDAwMDQ2LAorICAgIDB4MDAwNTEsIDB4MDAwNEYsIDB4MDAzRDcsIDB4MDAzM0EsIDB4MDAzNzYsIDB4MDAzNTMsCisgICAgMHgwMDM1NiwgMHgwMDNFQSwgMHgwMDA1NCwgMHgwMDMzOSwgMHgwMDNFMiwgMHgwMDAyRiwKKyAgICAweDAwNjRDLCAweDAwNTM0LCAweDAwMjM4LCAweDAwMUE4LCAweDAwMkM2LCAweDAwRDk1LAorICAgIDB4MDBGNTIsIDB4MDAyQ0UsIDB4MDA3REUsIDB4MDBCMkYsIDB4MDAwRDgsIDB4MDAxQkEsCisgICAgMHgwMDM2QSwgMHgwMDM1RiwgMHgwMDEyNywgMHgwMUVGRSwgMHgwMTZCOCwgMHgwMDhFQSwKKyAgICAweDAwQ0VDLCAweDAwN0VDLCAweDAwQTZFLCAweDAwMTE0LCAweDAxQUJFLCAweDAwRkZFLAorICAgIDB4MDAzN0EsIDB4MDA0NUUsIDB4MDAxMjQsIDB4MDE2M0UsIDB4MDJENzIsIDB4MDBDRUQsCisgICAgMHgwMEIyRSwgMHgwMEM5NiwgMHgwMDdBOCwgMHgwMDFGRSwgMHgwMTYzQSwgMHgwMUZGRSwKKyAgICAweDAwMDM4LCAweDAwNTdFLCAweDAwNjRFLCAweDAwMUY4LCAweDAwMUU4LCAweDAwMkJFLAorICAgIDB4MDBEREUsIDB4MDBGNTYsIDB4MDAzREEsIDB4MDBCMjUsIDB4MDA4RTgsIDB4MDAxRjksCisgICAgMHgwMDExNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9uMmF2Y19jYjNfYml0c1tPTjJBVkNfQ0IzX0NPREVTXSA9IHsKKyAgICAgMSwgIDcsICA3LCAgNiwgIDYsICA4LAorICAgIDEwLCAxMCwgIDgsIDEwLCAxMCwgIDYsCisgICAgIDYsICA3LCAgNywgIDcsICA5LCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgIDYsICA5LAorICAgICA5LCAgOCwgMTQsIDEyLCAxMCwgMTAsCisgICAgMTEsIDE0LCAxMiwgMTAsIDE0LCAxMiwKKyAgICAxMCwgMTAsICA4LCAxMywgMTQsIDEwLAorICAgIDEwLCAxMCwgMTEsIDEzLCAxMSwgMTIsCisgICAgMTQsIDEwLCAxMCwgIDcsICA3LCAgNywKKyAgICAgOSwgIDksICA5LCAgOSwgIDksIDEwLAorICAgICA3LCAgOSwgIDksICA3LCAgNywgIDcsCisgICAgMTAsIDEwLCAxMSwgMTAsIDEwLCAxMCwKKyAgICAgNywgMTAsIDEwLCAgNiwgMTEsIDExLAorICAgICA4LCAgOSwgMTAsIDExLCAxMiwgMTAsCisgICAgMTIsIDEyLCAgOSwgIDksIDExLCAxMCwKKyAgICAgOSwgMTMsIDEzLCAxMSwgMTIsIDEyLAorICAgIDEyLCAgOSwgMTMsIDEzLCAxMCwgMTAsCisgICAgIDksIDEyLCAxMywgMTIsIDExLCAxMiwKKyAgICAxMiwgIDksIDEzLCAxNCwgIDYsIDExLAorICAgIDExLCAgOSwgIDgsIDEwLCAxMiwgMTEsCisgICAgMTAsIDEyLCAxMiwgIDksICA5LCAgNiwKKyAgICAxNCwgMTQsIDExLCAxMSwgMTQsIDE3LAorICAgIDE2LCAxMiwgMTUsIDE1LCAxMSwgMTEsCisgICAgMTAsIDEwLCAgOSwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTMsIDEzLCAgOSwgMTQsIDE0LAorICAgIDEwLCAxNiwgMTUsIDExLCAxMiwgMTQsCisgICAgMTQsIDE1LCAxMiwgMTUsIDE2LCAxMiwKKyAgICAxMiwgIDksIDE1LCAxNiwgMTIsIDExLAorICAgIDEzLCAxMywgMTQsIDEyLCAxNSwgMTYsCisgICAgMTIsIDEyLCAxMCwgMTAsICA5LCAxNCwKKyAgICAxNCwgMTMsIDEzLCAxMywgMTMsICA5LAorICAgIDEzLCAxNSwgIDcsIDE1LCAxNCwgMTEsCisgICAgMTEsIDEzLCAxNSwgMTUsIDE0LCAxNiwKKyAgICAxNywgMTEsIDExLCAxMCwgMTAsICA5LAorICAgIDE0LCAxNCwgMTMsIDEzLCAxMywgMTQsCisgICAgIDksIDE0LCAxNCwgIDksIDE1LCAxNSwKKyAgICAxMiwgMTIsIDEyLCAxNSwgMTYsIDE0LAorICAgIDE1LCAxNSwgMTIsIDEyLCAxMCwgMTUsCisgICAgMTYsIDEyLCAxMiwgMTMsIDE1LCAxNSwKKyAgICAxNCwgMTYsIDE0LCAxMiwgMTEsIDEwLAorICAgIDEwLCAgOSwgMTMsIDE0LCAxMywgMTMsCisgICAgMTMsIDEzLCAgOSwgMTQsIDE0LCAgNywKKyAgICAgNywgIDcsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgIDcsIDEwLCAxMCwgIDYsCisgICAgMTEsIDExLCAxMCwgIDksIDEwLCAxMiwKKyAgICAxMiwgMTAsIDExLCAxMiwgIDgsICA5LAorICAgIDEwLCAxMCwgIDksIDEzLCAxMywgMTIsCisgICAgMTIsIDExLCAxMiwgIDksIDEzLCAxMiwKKyAgICAxMCwgMTEsICA5LCAxMywgMTQsIDEyLAorICAgIDEyLCAxMiwgMTEsICA5LCAxMywgMTMsCisgICAgIDYsIDExLCAxMSwgIDksICA5LCAxMCwKKyAgICAxMiwgMTIsIDEwLCAxMiwgMTIsICA5LAorICAgICA5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG9uMmF2Y19jYjNfc3ltc1tPTjJBVkNfQ0IzX0NPREVTXSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMiwgMHgwMDBFLCAweDAwMTEsIDB4MDAxRiwgMHgwMDIwLAorICAgIDB4MDAyMiwgMHgwMDJFLCAweDAwRTAsIDB4MDBFMiwgMHgwMEVFLCAweDAwRjEsCisgICAgMHgwMEZGLCAweDAxMDEsIDB4MDEwRiwgMHgwMTEwLCAweDAxMTIsIDB4MDExRSwKKyAgICAweDAxMjEsIDB4MDEyRiwgMHgwMUUxLCAweDAxRUYsIDB4MDFGMCwgMHgwMUYyLAorICAgIDB4MDFGRSwgMHgwMjAwLCAweDAyMDIsIDB4MDIwRSwgMHgwMjExLCAweDAyMUYsCisgICAgMHgwMjIwLCAweDAyMjIsIDB4MDIyRSwgMHgwMkUwLCAweDAyRTIsIDB4MDJFRSwKKyAgICAweDAyRjEsIDB4MDJGRiwgMHgwRTAwLCAweDBFMDIsIDB4MEUwRSwgMHgwRTExLAorICAgIDB4MEUxRiwgMHgwRTIwLCAweDBFMjIsIDB4MEUyRSwgMHgwRUUwLCAweDBFRTIsCisgICAgMHgwRUVFLCAweDBFRjEsIDB4MEVGRiwgMHgwRjAxLCAweDBGMEYsIDB4MEYxMCwKKyAgICAweDBGMTIsIDB4MEYxRSwgMHgwRjIxLCAweDBGMkYsIDB4MEZFMSwgMHgwRkVGLAorICAgIDB4MEZGMCwgMHgwRkYyLCAweDBGRkUsIDB4MTAwMSwgMHgxMDBGLCAweDEwMTAsCisgICAgMHgxMDEyLCAweDEwMUUsIDB4MTAyMSwgMHgxMDJGLCAweDEwRTEsIDB4MTBFRiwKKyAgICAweDEwRjAsIDB4MTBGMiwgMHgxMEZFLCAweDExMDAsIDB4MTEwMiwgMHgxMTBFLAorICAgIDB4MTExMSwgMHgxMTFGLCAweDExMjAsIDB4MTEyMiwgMHgxMTJFLCAweDExRTAsCisgICAgMHgxMUUyLCAweDExRUUsIDB4MTFGMSwgMHgxMUZGLCAweDEyMDEsIDB4MTIwRiwKKyAgICAweDEyMTAsIDB4MTIxMiwgMHgxMjFFLCAweDEyMjEsIDB4MTIyRiwgMHgxMkUxLAorICAgIDB4MTJFRiwgMHgxMkYwLCAweDEyRjIsIDB4MTJGRSwgMHgxRTAxLCAweDFFMEYsCisgICAgMHgxRTEwLCAweDFFMTIsIDB4MUUxRSwgMHgxRTIxLCAweDFFMkYsIDB4MUVFMSwKKyAgICAweDFFRUYsIDB4MUVGMCwgMHgxRUYyLCAweDFFRkUsIDB4MUYwMCwgMHgxRjAyLAorICAgIDB4MUYwRSwgMHgxRjExLCAweDFGMUYsIDB4MUYyMCwgMHgxRjIyLCAweDFGMkUsCisgICAgMHgxRkUwLCAweDFGRTIsIDB4MUZFRSwgMHgxRkYxLCAweDFGRkYsIDB4MjAwMCwKKyAgICAweDIwMDIsIDB4MjAwRSwgMHgyMDExLCAweDIwMUYsIDB4MjAyMCwgMHgyMDIyLAorICAgIDB4MjAyRSwgMHgyMEUwLCAweDIwRTIsIDB4MjBFRSwgMHgyMEYxLCAweDIwRkYsCisgICAgMHgyMTAxLCAweDIxMEYsIDB4MjExMCwgMHgyMTEyLCAweDIxMUUsIDB4MjEyMSwKKyAgICAweDIxMkYsIDB4MjFFMSwgMHgyMUVGLCAweDIxRjAsIDB4MjFGMiwgMHgyMUZFLAorICAgIDB4MjIwMCwgMHgyMjAyLCAweDIyMEUsIDB4MjIxMSwgMHgyMjFGLCAweDIyMjAsCisgICAgMHgyMjIyLCAweDIyMkUsIDB4MjJFMCwgMHgyMkUyLCAweDIyRUUsIDB4MjJGMSwKKyAgICAweDIyRkYsIDB4MkUwMCwgMHgyRTAyLCAweDJFMEUsIDB4MkUxMSwgMHgyRTFGLAorICAgIDB4MkUyMCwgMHgyRTIyLCAweDJFMkUsIDB4MkVFMCwgMHgyRUUyLCAweDJFRUUsCisgICAgMHgyRUYxLCAweDJFRkYsIDB4MkYwMSwgMHgyRjBGLCAweDJGMTAsIDB4MkYxMiwKKyAgICAweDJGMUUsIDB4MkYyMSwgMHgyRjJGLCAweDJGRTEsIDB4MkZFRiwgMHgyRkYwLAorICAgIDB4MkZGMiwgMHgyRkZFLCAweEUwMDAsIDB4RTAwMiwgMHhFMDBFLCAweEUwMTEsCisgICAgMHhFMDFGLCAweEUwMjAsIDB4RTAyMiwgMHhFMDJFLCAweEUwRTAsIDB4RTBFMiwKKyAgICAweEUwRUUsIDB4RTBGMSwgMHhFMEZGLCAweEUxMDEsIDB4RTEwRiwgMHhFMTEwLAorICAgIDB4RTExMiwgMHhFMTFFLCAweEUxMjEsIDB4RTEyRiwgMHhFMUUxLCAweEUxRUYsCisgICAgMHhFMUYwLCAweEUxRjIsIDB4RTFGRSwgMHhFMjAwLCAweEUyMDIsIDB4RTIwRSwKKyAgICAweEUyMTEsIDB4RTIxRiwgMHhFMjIwLCAweEUyMjIsIDB4RTIyRSwgMHhFMkUwLAorICAgIDB4RTJFMiwgMHhFMkVFLCAweEUyRjEsIDB4RTJGRiwgMHhFRTAwLCAweEVFMDIsCisgICAgMHhFRTBFLCAweEVFMTEsIDB4RUUxRiwgMHhFRTIwLCAweEVFMjIsIDB4RUUyRSwKKyAgICAweEVFRTAsIDB4RUVFMiwgMHhFRUVFLCAweEVFRjEsIDB4RUVGRiwgMHhFRjAxLAorICAgIDB4RUYwRiwgMHhFRjEwLCAweEVGMTIsIDB4RUYxRSwgMHhFRjIxLCAweEVGMkYsCisgICAgMHhFRkUxLCAweEVGRUYsIDB4RUZGMCwgMHhFRkYyLCAweEVGRkUsIDB4RjAwMSwKKyAgICAweEYwMEYsIDB4RjAxMCwgMHhGMDEyLCAweEYwMUUsIDB4RjAyMSwgMHhGMDJGLAorICAgIDB4RjBFMSwgMHhGMEVGLCAweEYwRjAsIDB4RjBGMiwgMHhGMEZFLCAweEYxMDAsCisgICAgMHhGMTAyLCAweEYxMEUsIDB4RjExMSwgMHhGMTFGLCAweEYxMjAsIDB4RjEyMiwKKyAgICAweEYxMkUsIDB4RjFFMCwgMHhGMUUyLCAweEYxRUUsIDB4RjFGMSwgMHhGMUZGLAorICAgIDB4RjIwMSwgMHhGMjBGLCAweEYyMTAsIDB4RjIxMiwgMHhGMjFFLCAweEYyMjEsCisgICAgMHhGMjJGLCAweEYyRTEsIDB4RjJFRiwgMHhGMkYwLCAweEYyRjIsIDB4RjJGRSwKKyAgICAweEZFMDEsIDB4RkUwRiwgMHhGRTEwLCAweEZFMTIsIDB4RkUxRSwgMHhGRTIxLAorICAgIDB4RkUyRiwgMHhGRUUxLCAweEZFRUYsIDB4RkVGMCwgMHhGRUYyLCAweEZFRkUsCisgICAgMHhGRjAwLCAweEZGMDIsIDB4RkYwRSwgMHhGRjExLCAweEZGMUYsIDB4RkYyMCwKKyAgICAweEZGMjIsIDB4RkYyRSwgMHhGRkUwLCAweEZGRTIsIDB4RkZFRSwgMHhGRkYxLAorICAgIDB4RkZGRiwKK307CisKKyNkZWZpbmUgT04yQVZDX0NCNF9DT0RFUyAzMTMKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBvbjJhdmNfY2I0X2NvZGVzW09OMkFWQ19DQjRfQ09ERVNdID0geworICAgIDB4MDAwQSwgMHgwMTNCLCAweDAxMjcsIDB4MDAwNCwgMHgwMDE1LCAweDAxMkMsCisgICAgMHgwNjVGLCAweDA4Q0QsIDB4MDE2QSwgMHgwOEU3LCAweDA2QkEsIDB4MDAxQiwKKyAgICAweDAwMUQsIDB4MDAxOCwgMHgwMDBBLCAweDAwMDIsIDB4MDBDMCwgMHgwMTJCLAorICAgIDB4MDBDRSwgMHgwMTNDLCAweDAxMkEsIDB4MDEyRCwgMHgwMDIwLCAweDAxMjgsCisgICAgMHgwMTIxLCAweDAwRkMsIDB4MDY2QiwgMHgwNDcyLCAweDAxMEEsIDB4MDA0RSwKKyAgICAweDA2QUUsIDB4MDYzRiwgMHgxQUJGLCAweDBCNEUsIDB4MDg0RSwgMHgxQUJFLAorICAgIDB4MDEwRSwgMHgwMDk0LCAweDAwQzgsIDB4MDQ2NCwgMHgwNjlBLCAweDAwQzksCisgICAgMHgwMEZBLCAweDA0MUIsIDB4MkZERSwgMHgwOENCLCAweDA1QjcsIDB4MUFCRCwKKyAgICAweDA2NkEsIDB4MDA4RCwgMHgwMEY4LCAweDAwMDMsIDB4MDAxQSwgMHgwMDFFLAorICAgIDB4MDEyMCwgMHgwMTFFLCAweDAxMzgsIDB4MDEyNSwgMHgwMTcwLCAweDAwQzQsCisgICAgMHgwMDBCLCAweDAxM0UsIDB4MDBDNSwgMHgwMDBDLCAweDAwMEUsIDB4MDAxQywKKyAgICAweDAwRkUsIDB4MDA5QywgMHgwMTBGLCAweDAxMTUsIDB4MDA5RiwgMHgwMDhDLAorICAgIDB4MDAwOCwgMHgwMDJFLCAweDAwQ0YsIDB4MDAxQywgMHgwMTEwLCAweDAwMkYsCisgICAgMHgwMDJDLCAweDAwMDIsIDB4MDExNiwgMHgwMUZFLCAweDAzMkQsIDB4MDBDQiwKKyAgICAweDAzMEQsIDB4MDJFQywgMHgwMDJFLCAweDAwMzcsIDB4MDBDRiwgMHgwMDg2LAorICAgIDB4MDBDOCwgMHgwMzJDLCAweDAzMUUsIDB4MDFBQywgMHgwMzBDLCAweDAyRUQsCisgICAgMHgwMzVDLCAweDAxM0EsIDB4MDJGRiwgMHgwMkUyLCAweDAwQkUsIDB4MDBDRSwKKyAgICAweDAxMjYsIDB4MDM1NiwgMHgwMzRFLCAweDAzNDcsIDB4MDI1RiwgMHgwMzA2LAorICAgIDB4MDJEQSwgMHgwMTY4LCAweDAyRTcsIDB4MDIwRiwgMHgwMDE2LCAweDAwODEsCisgICAgMHgwMTE0LCAweDAwMjQsIDB4MDAxQiwgMHgwMTBDLCAweDAzRkUsIDB4MDI3RiwKKyAgICAweDAwODQsIDB4MDJGOSwgMHgwMjM3LCAweDAwMDAsIDB4MDAxQSwgMHgwMTFBLAorICAgIDB4MDVBNiwgMHgwNEE2LCAweDAwRjksIDB4MDBDQywgMHgwNUI2LCAweDBCRjYsCisgICAgMHgwQjk2LCAweDA0NDYsIDB4MDhDRSwgMHgwMDdGLCAweDAwMkMsIDB4MDAwRSwKKyAgICAweDAwODAsIDB4MDBDOSwgMHgwMEJBLCAweDAzNUUsIDB4MDNFRiwgMHgwMzQ1LAorICAgIDB4MDJGRSwgMHgwMkZCLCAweDAyRTYsIDB4MDBEMiwgMHgwMjFDLCAweDAyMzgsCisgICAgMHgwNkJCLCAweDBCOTcsIDB4MDA3RSwgMHgwMUFBLCAweDAyM0EsIDB4MDVCRSwKKyAgICAweDAzMUQsIDB4MDk0RSwgMHgxQUJDLCAweDA5NDgsIDB4MDg4RSwgMHgwMkU0LAorICAgIDB4MDI3MywgMHgwODRDLCAweDA4Q0MsIDB4MDk0QiwgMHgwMkQyLCAweDAyM0IsCisgICAgMHgwNDNFLCAweDJGREYsIDB4MDYzRSwgMHgxMDlCLCAweDA4Q0EsIDB4MDhFNiwKKyAgICAweDAyREUsIDB4MDJGNCwgMHgwMEQ0LCAweDAwMkQsIDB4MDBDQSwgMHgwMjBFLAorICAgIDB4MDM0NCwgMHgwMkZELCAweDAzMEYsIDB4MDJFRSwgMHgwMkQ2LCAweDAxMjMsCisgICAgMHgwMkY3LCAweDAzRUQsIDB4MDA5RSwgMHgwNUNBLCAweDA2MEUsIDB4MDAwRCwKKyAgICAweDAwNEQsIDB4MDQ0NCwgMHgwNDNGLCAweDA5NEEsIDB4MDVGQSwgMHgxMDlBLAorICAgIDB4MEI0RiwgMHgwMEZELCAweDAxMTcsIDB4MDA5NiwgMHgwMDgyLCAweDAxMjIsCisgICAgMHgwMjVELCAweDAzMDQsIDB4MDM0QywgMHgwMjdCLCAweDAzNUIsIDB4MDJGQywKKyAgICAweDAwRkMsIDB4MDM1RiwgMHgwM0VFLCAweDA4OEIsIDB4MEMxRSwgMHgwODhBLAorICAgIDB4MDJGNSwgMHgwMjcyLCAweDE3RUUsIDB4MEMxRiwgMHgwODRGLCAweDA4OEYsCisgICAgMHgwNjlCLCAweDA5NDksIDB4MDIzRiwgMHgwMkUzLCAweDA3RkUsIDB4MDQxQSwKKyAgICAweDBCN0UsIDB4MDI3QSwgMHgwMzM2LCAweDA3RkYsIDB4MDhDRiwgMHgwOTRGLAorICAgIDB4MDY1RSwgMHgwQjdGLCAweDAyREQsIDB4MDIxMiwgMHgwMUZCLCAweDAwQzYsCisgICAgMHgwMDk1LCAweDAwRDAsIDB4MDIzRSwgMHgwMjVDLCAweDAyRkMsIDB4MDMyRSwKKyAgICAweDAyNUUsIDB4MDIxRSwgMHgwMEJDLCAweDAyMUQsIDB4MDM1QSwgMHgwMDA3LAorICAgIDB4MDAwRiwgMHgwMDA2LCAweDAwQzIsIDB4MDAwQywgMHgwMEJELCAweDAwQ0QsCisgICAgMHgwMTEzLCAweDAxMTgsIDB4MDAxRCwgMHgwMENBLCAweDAwOEUsIDB4MDAxNCwKKyAgICAweDAxMEQsIDB4MDA4NSwgMHgwMDAxLCAweDAwM0UsIDB4MDA4RiwgMHgwMjM2LAorICAgIDB4MDMwRSwgMHgwMEZGLCAweDAyNUUsIDB4MDMzNywgMHgwMDBBLCAweDAwMjYsCisgICAgMHgwMTBCLCAweDAwOUQsIDB4MDEyRSwgMHgwMjVGLCAweDAyRUYsIDB4MDMwNSwKKyAgICAweDAyREMsIDB4MDI3RSwgMHgwMkZFLCAweDAxMjQsIDB4MDM0RiwgMHgwMDNFLAorICAgIDB4MDA0RiwgMHgwMEJDLCAweDAxNkMsIDB4MDJENywgMHgwM0VDLCAweDAyRkEsCisgICAgMHgwMkY4LCAweDAyRjYsIDB4MDFGQSwgMHgwMENDLCAweDAyRkYsIDB4MDMzNCwKKyAgICAweDAwMUUsIDB4MDA0QywgMHgwMTEyLCAweDAwMzYsIDB4MDAyMiwgMHgwMEZFLAorICAgIDB4MDMxQywgMHgwMzQ2LCAweDAxMDgsIDB4MDIwQywgMHgwMDFFLCAweDAwMTIsCisgICAgMHgwMDI2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb24yYXZjX2NiNF9iaXRzW09OMkFWQ19DQjRfQ09ERVNdID0geworICAgICA0LCAgOSwgIDksICA2LCAgNiwgIDksCisgICAgMTEsIDEyLCAgOSwgMTIsIDExLCAgNiwKKyAgICAgNSwgIDYsICA2LCAgNiwgIDgsICA5LAorICAgICA4LCAgOSwgIDksICA5LCAgNiwgIDksCisgICAgIDksICA5LCAxMSwgMTEsICA5LCAgOSwKKyAgICAxMSwgMTEsIDEzLCAxMiwgMTIsIDEzLAorICAgICA5LCAgOSwgIDksIDExLCAxMSwgIDksCisgICAgIDksIDEyLCAxNCwgMTIsIDExLCAxMywKKyAgICAxMSwgIDksICA5LCAgNiwgIDYsICA2LAorICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDgsCisgICAgIDYsICA5LCAgOCwgIDYsICA2LCAgNiwKKyAgICAgOCwgIDksICA5LCAgOSwgIDksICA5LAorICAgICA2LCAgOSwgIDgsICA1LCAgOSwgIDksCisgICAgIDYsICA3LCAgOSwgIDksIDEwLCAgOSwKKyAgICAxMCwgMTAsICA3LCAgNiwgIDksICA5LAorICAgICA4LCAxMCwgMTAsICA5LCAxMCwgMTAsCisgICAgMTAsICA5LCAxMSwgMTAsICA5LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAgOSwgMTAsIDExLCAgNiwgIDksCisgICAgIDksICA3LCAgNywgIDksIDEwLCAxMCwKKyAgICAgOSwgMTAsIDEwLCAgNywgIDcsICA5LAorICAgIDExLCAxMSwgIDksICA5LCAxMSwgMTIsCisgICAgMTIsIDExLCAxMiwgMTIsICA5LCAgOSwKKyAgICAgOSwgIDgsICA4LCAxMCwgMTEsIDEwLAorICAgIDExLCAxMCwgMTAsICA4LCAxMSwgMTAsCisgICAgMTEsIDEyLCAxMiwgIDksIDEwLCAxMSwKKyAgICAxMCwgMTIsIDEzLCAxMiwgMTIsIDEwLAorICAgIDEwLCAxMiwgMTIsIDEyLCAxMCwgMTAsCisgICAgMTIsIDE0LCAxMSwgMTMsIDEyLCAxMiwKKyAgICAxMCwgMTAsICA4LCAgOSwgIDgsIDExLAorICAgIDEwLCAxMSwgMTAsIDEwLCAxMCwgIDksCisgICAgMTAsIDExLCAgOSwgMTEsIDExLCAgOSwKKyAgICAgOSwgMTEsIDEyLCAxMiwgMTEsIDEzLAorICAgIDEyLCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMSwKKyAgICAgOCwgMTAsIDExLCAxMiwgMTIsIDEyLAorICAgIDEwLCAxMCwgMTMsIDEyLCAxMiwgMTIsCisgICAgMTEsIDEyLCAxMCwgMTAsIDExLCAxMiwKKyAgICAxMiwgMTAsIDEwLCAxMSwgMTIsIDEyLAorICAgIDExLCAxMiwgMTAsIDEwLCAgOSwgIDgsCisgICAgIDksICA4LCAxMCwgMTEsIDEwLCAxMCwKKyAgICAxMSwgMTEsICA4LCAxMSwgMTAsICA2LAorICAgICA2LCAgNiwgIDgsICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgNiwgIDksICA5LCAgNiwKKyAgICAgOSwgIDksICA3LCAgNiwgIDksIDEwLAorICAgIDEwLCAgOSwgMTAsIDEwLCAgNywgIDcsCisgICAgIDksICA5LCAgOSwgMTEsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAgOSwgMTAsIDExLAorICAgICA5LCAgOSwgIDksIDEwLCAxMSwgMTAsCisgICAgMTAsIDEwLCAgOSwgIDgsIDEwLCAxMCwKKyAgICAgNSwgIDksICA5LCAgNiwgIDcsICA5LAorICAgIDEwLCAxMCwgIDksIDExLCAxMCwgIDcsCisgICAgIDYsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgb24yYXZjX2NiNF9zeW1zW09OMkFWQ19DQjRfQ09ERVNdID0geworICAgIDB4MDAwMCwgMHgwMDAyLCAweDAwMEUsIDB4MDAxMSwgMHgwMDFGLCAweDAwMjAsCisgICAgMHgwMDIyLCAweDAwMkUsIDB4MDBFMCwgMHgwMEUyLCAweDAwRUUsIDB4MDBGMSwKKyAgICAweDAwRkYsIDB4MDEwMSwgMHgwMTBGLCAweDAxMTAsIDB4MDExMiwgMHgwMTFFLAorICAgIDB4MDEyMSwgMHgwMTJGLCAweDAxRTEsIDB4MDFFRiwgMHgwMUYwLCAweDAxRjIsCisgICAgMHgwMUZFLCAweDAyMDAsIDB4MDIwMiwgMHgwMjBFLCAweDAyMTEsIDB4MDIxRiwKKyAgICAweDAyMjAsIDB4MDIyMiwgMHgwMjJFLCAweDAyRTAsIDB4MDJFMiwgMHgwMkVFLAorICAgIDB4MDJGMSwgMHgwMkZGLCAweDBFMDAsIDB4MEUwMiwgMHgwRTBFLCAweDBFMTEsCisgICAgMHgwRTFGLCAweDBFMjAsIDB4MEUyMiwgMHgwRTJFLCAweDBFRTAsIDB4MEVFMiwKKyAgICAweDBFRUUsIDB4MEVGMSwgMHgwRUZGLCAweDBGMDEsIDB4MEYwRiwgMHgwRjEwLAorICAgIDB4MEYxMiwgMHgwRjFFLCAweDBGMjEsIDB4MEYyRiwgMHgwRkUxLCAweDBGRUYsCisgICAgMHgwRkYwLCAweDBGRjIsIDB4MEZGRSwgMHgxMDAxLCAweDEwMEYsIDB4MTAxMCwKKyAgICAweDEwMTIsIDB4MTAxRSwgMHgxMDIxLCAweDEwMkYsIDB4MTBFMSwgMHgxMEVGLAorICAgIDB4MTBGMCwgMHgxMEYyLCAweDEwRkUsIDB4MTEwMCwgMHgxMTAyLCAweDExMEUsCisgICAgMHgxMTExLCAweDExMUYsIDB4MTEyMCwgMHgxMTIyLCAweDExMkUsIDB4MTFFMCwKKyAgICAweDExRTIsIDB4MTFFRSwgMHgxMUYxLCAweDExRkYsIDB4MTIwMSwgMHgxMjBGLAorICAgIDB4MTIxMCwgMHgxMjEyLCAweDEyMUUsIDB4MTIyMSwgMHgxMjJGLCAweDEyRTEsCisgICAgMHgxMkVGLCAweDEyRjAsIDB4MTJGMiwgMHgxMkZFLCAweDFFMDEsIDB4MUUwRiwKKyAgICAweDFFMTAsIDB4MUUxMiwgMHgxRTFFLCAweDFFMjEsIDB4MUUyRiwgMHgxRUUxLAorICAgIDB4MUVFRiwgMHgxRUYwLCAweDFFRjIsIDB4MUVGRSwgMHgxRjAwLCAweDFGMDIsCisgICAgMHgxRjBFLCAweDFGMTEsIDB4MUYxRiwgMHgxRjIwLCAweDFGMjIsIDB4MUYyRSwKKyAgICAweDFGRTAsIDB4MUZFMiwgMHgxRkVFLCAweDFGRjEsIDB4MUZGRiwgMHgyMDAwLAorICAgIDB4MjAwMiwgMHgyMDBFLCAweDIwMTEsIDB4MjAxRiwgMHgyMDIwLCAweDIwMjIsCisgICAgMHgyMDJFLCAweDIwRTAsIDB4MjBFMiwgMHgyMEVFLCAweDIwRjEsIDB4MjBGRiwKKyAgICAweDIxMDEsIDB4MjEwRiwgMHgyMTEwLCAweDIxMTIsIDB4MjExRSwgMHgyMTIxLAorICAgIDB4MjEyRiwgMHgyMUUxLCAweDIxRUYsIDB4MjFGMCwgMHgyMUYyLCAweDIxRkUsCisgICAgMHgyMjAwLCAweDIyMDIsIDB4MjIwRSwgMHgyMjExLCAweDIyMUYsIDB4MjIyMCwKKyAgICAweDIyMjIsIDB4MjIyRSwgMHgyMkUwLCAweDIyRTIsIDB4MjJFRSwgMHgyMkYxLAorICAgIDB4MjJGRiwgMHgyRTAwLCAweDJFMDIsIDB4MkUwRSwgMHgyRTExLCAweDJFMUYsCisgICAgMHgyRTIwLCAweDJFMjIsIDB4MkUyRSwgMHgyRUUwLCAweDJFRTIsIDB4MkVFRSwKKyAgICAweDJFRjEsIDB4MkVGRiwgMHgyRjAxLCAweDJGMEYsIDB4MkYxMCwgMHgyRjEyLAorICAgIDB4MkYxRSwgMHgyRjIxLCAweDJGMkYsIDB4MkZFMSwgMHgyRkVGLCAweDJGRjAsCisgICAgMHgyRkYyLCAweDJGRkUsIDB4RTAwMCwgMHhFMDAyLCAweEUwMEUsIDB4RTAxMSwKKyAgICAweEUwMUYsIDB4RTAyMCwgMHhFMDIyLCAweEUwMkUsIDB4RTBFMCwgMHhFMEUyLAorICAgIDB4RTBFRSwgMHhFMEYxLCAweEUwRkYsIDB4RTEwMSwgMHhFMTBGLCAweEUxMTAsCisgICAgMHhFMTEyLCAweEUxMUUsIDB4RTEyMSwgMHhFMTJGLCAweEUxRTEsIDB4RTFFRiwKKyAgICAweEUxRjAsIDB4RTFGMiwgMHhFMUZFLCAweEUyMDAsIDB4RTIwMiwgMHhFMjBFLAorICAgIDB4RTIxMSwgMHhFMjFGLCAweEUyMjAsIDB4RTIyMiwgMHhFMjJFLCAweEUyRTAsCisgICAgMHhFMkUyLCAweEUyRUUsIDB4RTJGMSwgMHhFMkZGLCAweEVFMDAsIDB4RUUwMiwKKyAgICAweEVFMEUsIDB4RUUxMSwgMHhFRTFGLCAweEVFMjAsIDB4RUUyMiwgMHhFRTJFLAorICAgIDB4RUVFMCwgMHhFRUUyLCAweEVFRUUsIDB4RUVGMSwgMHhFRUZGLCAweEVGMDEsCisgICAgMHhFRjBGLCAweEVGMTAsIDB4RUYxMiwgMHhFRjFFLCAweEVGMjEsIDB4RUYyRiwKKyAgICAweEVGRTEsIDB4RUZFRiwgMHhFRkYwLCAweEVGRjIsIDB4RUZGRSwgMHhGMDAxLAorICAgIDB4RjAwRiwgMHhGMDEwLCAweEYwMTIsIDB4RjAxRSwgMHhGMDIxLCAweEYwMkYsCisgICAgMHhGMEUxLCAweEYwRUYsIDB4RjBGMCwgMHhGMEYyLCAweEYwRkUsIDB4RjEwMCwKKyAgICAweEYxMDIsIDB4RjEwRSwgMHhGMTExLCAweEYxMUYsIDB4RjEyMCwgMHhGMTIyLAorICAgIDB4RjEyRSwgMHhGMUUwLCAweEYxRTIsIDB4RjFFRSwgMHhGMUYxLCAweEYxRkYsCisgICAgMHhGMjAxLCAweEYyMEYsIDB4RjIxMCwgMHhGMjEyLCAweEYyMUUsIDB4RjIyMSwKKyAgICAweEYyMkYsIDB4RjJFMSwgMHhGMkVGLCAweEYyRjAsIDB4RjJGMiwgMHhGMkZFLAorICAgIDB4RkUwMSwgMHhGRTBGLCAweEZFMTAsIDB4RkUxMiwgMHhGRTFFLCAweEZFMjEsCisgICAgMHhGRTJGLCAweEZFRTEsIDB4RkVFRiwgMHhGRUYwLCAweEZFRjIsIDB4RkVGRSwKKyAgICAweEZGMDAsIDB4RkYwMiwgMHhGRjBFLCAweEZGMTEsIDB4RkYxRiwgMHhGRjIwLAorICAgIDB4RkYyMiwgMHhGRjJFLCAweEZGRTAsIDB4RkZFMiwgMHhGRkVFLCAweEZGRjEsCisgICAgMHhGRkZGLAorfTsKKworI2RlZmluZSBPTjJBVkNfQ0I1X0NPREVTIDEyMDEKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBvbjJhdmNfY2I1X2NvZGVzW09OMkFWQ19DQjVfQ09ERVNdID0geworICAgIDB4MDAwMDAsIDB4MDAwRDYsIDB4MDAwRTIsIDB4MDAwNDQsIDB4MDAwOUUsIDB4MDAwOUEsCisgICAgMHgwMDAzQSwgMHgwMDRFNiwgMHgwMEEyOSwgMHgwMDdGRSwgMHgwMDI0QSwgMHgwMDRFRSwKKyAgICAweDAwNDk2LCAweDAwMUVFLCAweDAwMUM4LCAweDAwOEZBLCAweDAwNTBGLCAweDAwMUVGLAorICAgIDB4MDA0ODYsIDB4MDA5MDYsIDB4MDA5MDQsIDB4MDAwM0UsIDB4MDAwOTQsIDB4MDAwQTYsCisgICAgMHgwMDA0NiwgMHgwMDA2MSwgMHgwMDEyQSwgMHgwMDIwRCwgMHgwMDA2MCwgMHgwMDA2NiwKKyAgICAweDAwNDUyLCAweDAwNjkyLCAweDAwODdFLCAweDAwMjQyLCAweDAwNTBDLCAweDAwOEJFLAorICAgIDB4MDAyNEMsIDB4MDA0NUEsIDB4MDAyNUEsIDB4MDAxQzYsIDB4MDAyRUUsIDB4MDAyOTQsCisgICAgMHgwMDZDRSwgMHgwMDFFQywgMHgwMDQ5MiwgMHgwMDY5MCwgMHgwMDA1NSwgMHgwMDQ3NCwKKyAgICAweDAwNjNFLCAweDAwNTI0LCAweDA0ODAyLCAweDA0REM1LCAweDAwREVGLCAweDAxQTYyLAorICAgIDB4MDBFNkEsIDB4MDBBN0YsIDB4MDI3RkIsIDB4MDM0QjUsIDB4MDM2QzUsIDB4MDBBM0EsCisgICAgMHgwMzZDNiwgMHgwMjE5QiwgMHgwMDI5NiwgMHgwMDkwRiwgMHgwMjdGQSwgMHgwMjhDOCwKKyAgICAweDAwNTJBLCAweDAxMjdFLCAweDA1OThFLCAweDAzNEI0LCAweDAwQzc4LCAweDAxNDZFLAorICAgIDB4MDBGNUYsIDB4MDBCQUEsIDB4MDA0MzIsIDB4MEZGNjMsIDB4MDU5OEYsIDB4MDA5MUMsCisgICAgMHgwMDI1NywgMHgwMjQwQiwgMHgwMTRFNiwgMHgwMEU2QiwgMHgwNTE3MywgMHgwMTY0NywKKyAgICAweDAwN0Y5LCAweDAyMkYzLCAweDA0REM2LCAweDAyMkYyLCAweDAwODdGLCAweDAzNkM3LAorICAgIDB4MDFBQjksIDB4MDBDNzksIDB4MDY5NDQsIDB4MDQzQzYsIDB4MDA0M0UsIDB4MDAyMTgsCisgICAgMHgwMzFDNCwgMHgwMTRFNSwgMHgwMDkzRSwgMHgwRkY2MiwgMHgzRkFFMCwgMHgwMDMyOCwKKyAgICAweDAwMjI4LCAweDAxNDI4LCAweDAzRkVBLCAweDAwN0EzLCAweDAzNEIzLCAweDBEMjNCLAorICAgIDB4MDBCMjksIDB4MDFBQjgsIDB4MDI4QzcsIDB4MDU5OEQsIDB4MDBCMjgsIDB4MDE0OUIsCisgICAgMHgwMTQ5QSwgMHgwMDhFRSwgMHgwMjdGOSwgMHgwN0ZDMCwgMHgwMENGRSwgMHgwMDI1RSwKKyAgICAweDAxQ0JCLCAweDAyNkVGLCAweDAwNTEyLCAweDAyOTdCLCAweDA1MTcyLCAweDAwRDM2LAorICAgIDB4MDBGQ0EsIDB4MDFFQTUsIDB4MDBEODYsIDB4MDFGQzUsIDB4MDMxQzMsIDB4MDJDRDYsCisgICAgMHgwMDI3NiwgMHgwMUY4QSwgMHgwNDgwMSwgMHgwMEIyQSwgMHgwMDMyOSwgMHgwMEZDOSwKKyAgICAweDAzRjBDLCAweDAwRDM1LCAweDAxOTcxLCAweDA0REM0LCAweDAzNkM0LCAweDAwQTRGLAorICAgIDB4MDBGRUEsIDB4MDFGQzQsIDB4MDEyMkEsIDB4MDAwNTgsIDB4MDAxQ0EsIDB4MDAxM0EsCisgICAgMHgwMDA1RSwgMHgwMDA1NCwgMHgwMDUzRSwgMHgwMDM5RSwgMHgwMDZDNiwgMHgwMDI4NCwKKyAgICAweDAwMUMyLCAweDAwODdBLCAweDAwMjBFLCAweDAwNTBFLCAweDAwNkYyLCAweDAwMjg4LAorICAgIDB4MDAyOUUsIDB4MDA0NTcsIDB4MDA2RjksIDB4MDA1RDMsIDB4MDAyNDgsIDB4MDA4RjcsCisgICAgMHgwMDA2OCwgMHgwMDY5RCwgMHgwMDQ5NywgMHgwMDA1RiwgMHgwMDkxRCwgMHgwMDczOCwKKyAgICAweDAwMDU3LCAweDAwMDVBLCAweDAwQTNFLCAweDAwOUNGLCAweDAwRDNFLCAweDAwRDg3LAorICAgIDB4MDBDNkIsIDB4MDBDQkQsIDB4MDAzRjYsIDB4MDBBNzQsIDB4MDBDNkUsIDB4MDA0OUMsCisgICAgMHgwMTJGRSwgMHgwMTM3RiwgMHgwMERCQiwgMHgwMTBEQSwgMHgwMENBQiwgMHgwMTI3RiwKKyAgICAweDAwMDU2LCAweDAwQTJBLCAweDAwODNFLCAweDAwMDQwLCAweDAwQkFFLCAweDAwQkEyLAorICAgIDB4MDAxMkUsIDB4MDA2RjAsIDB4MDA5NkUsIDB4MDAyMkMsIDB4MDBGREUsIDB4MDExRUIsCisgICAgMHgwMUFCRSwgMHgwMDdFQSwgMHgwMTRFNywgMHgwMTFGMiwgMHgwMDI1NiwgMHgwMDlGQywKKyAgICAweDAyOTdDLCAweDAxQzEzLCAweDAwNkY0LCAweDAwQjI2LCAweDAxNDRFLCAweDAyMUVFLAorICAgIDB4MDAxQzAsIDB4MDA3MDcsIDB4MDBCM0YsIDB4MDAyNDQsIDB4MDBFMEIsIDB4MDJDRDgsCisgICAgMHgwMzRCNiwgMHgwMEIyQiwgMHgwMDkxNCwgMHgwMjdGRCwgMHgwMjhDQSwgMHgwMTM5NiwKKyAgICAweDAxNEVCLCAweDAxOTcyLCAweDAxQjcxLCAweDAxM0JFLCAweDAwRDlBLCAweDAwRDNGLAorICAgIDB4MDA5QzksIDB4MDE0RUEsIDB4MDMxQzYsIDB4MDIyRjUsIDB4MDI3RkMsIDB4MDI0MEQsCisgICAgMHgwMjk3RCwgMHgwMDZGNSwgMHgwMkNENywgMHgwMzk2QSwgMHgwMDE4QywgMHgwNERDNywKKyAgICAweDAyOENCLCAweDAwN0U3LCAweDBEMjNDLCAweDA0M0M4LCAweDAwOEZDLCAweDAwQzdBLAorICAgIDB4MDMxQzcsIDB4MDE4RUIsIDB4MDM5NkIsIDB4MEQyM0QsIDB4MDM2QzksIDB4MDE5NzMsCisgICAgMHgwMThFQSwgMHgwN0ZDMSwgMHgwOEZEOCwgMHgwMTY3MywgMHgwMDY3QywgMHgwMjdGRSwKKyAgICAweDAzNkM4LCAweDAwNEJFLCAweDA4RkQ5LCAweDA3RkMyLCAweDAwOUI2LCAweDAwMTQ4LAorICAgIDB4MDI2RjAsIDB4MDUxNzQsIDB4MDA3MUMsIDB4MDcyNzksIDB4MDhGRDcsIDB4MDA1RDQsCisgICAgMHgwMEUwQSwgMHgwMUE2MywgMHgwMUY4QiwgMHgwMTE0RSwgMHgwMUFCQSwgMHgwNTk5MCwKKyAgICAweDA0M0M3LCAweDAxQkVFLCAweDNGQUUxLCAweDFGRTk0LCAweDAxQ0JFLCAweDAwNkYzLAorICAgIDB4MDE4RTcsIDB4MDI0MEMsIDB4MDA2RkEsIDB4MDM5NjcsIDB4MDhGRDYsIDB4MDA0NUIsCisgICAgMHgwMERCQSwgMHgwMUE2NSwgMHgwMzk2OSwgMHgwMENGRiwgMHgwMDY3RSwgMHgwMjZGMSwKKyAgICAweDAyOEM5LCAweDAyMkY0LCAweDAxOEQyLCAweDAxQjcwLCAweDAxMUVBLCAweDAwQkJGLAorICAgIDB4MDBCM0UsIDB4MDE0NEQsIDB4MDBEM0QsIDB4MDE0NkYsIDB4MDFBNjQsIDB4MDFGRkYsCisgICAgMHgwMUI2RiwgMHgwMzk2OCwgMHgwMjRFQiwgMHgwMDY1NiwgMHgwMzFDNSwgMHgwNzI3QSwKKyAgICAweDAwMDNDLCAweDAwRDIyLCAweDAwRDk5LCAweDAwMjFBLCAweDAwNzA2LCAweDAwN0VFLAorICAgIDB4MDAxM0UsIDB4MDBDQkMsIDB4MDFDMTIsIDB4MDFBNjYsIDB4MDAyMkUsIDB4MDBFNzcsCisgICAgMHgwMTY3MiwgMHgwMDREOCwgMHgwMDZEMywgMHgwMUNCRiwgMHgwMUFCQiwgMHgwMDhCRiwKKyAgICAweDAwRTc2LCAweDAxQkVGLCAweDAxRkM2LCAweDAwMUIyLCAweDAwNzM2LCAweDAwOEZCLAorICAgIDB4MDAyMUQsIDB4MDAwRDcsIDB4MDQ4MDQsIDB4MDY5NDgsIDB4MDBEMzcsIDB4MDM5NkUsCisgICAgMHgwNjk0OSwgMHgwMTIwQSwgMHgwM0YwRiwgMHgxNDM3RSwgMHgwNDNDQiwgMHgwMjhEMCwKKyAgICAweDBBMkJFLCAweDA4RkRELCAweDA1OTk2LCAweDAyMkY2LCAweDFGRTk2LCAweDBGRjY0LAorICAgIDB4MDI2RjIsIDB4MDI4Q0YsIDB4MDREQ0IsIDB4MDNGMEUsIDB4MDBBM0YsIDB4MDUxNzgsCisgICAgMHgwNTk5NSwgMHgwMEJBMywgMHgwMEE0QSwgMHgwN0ZDOCwgMHgwNzI3RSwgMHgwMDdBQSwKKyAgICAweDAwM0QwLCAweDA1OTlBLCAweDAyQ0RCLCAweDAzNEJCLCAweDA3RkM5LCAweDBEMjYxLAorICAgIDB4MDQ4MDUsIDB4MDQ4MDYsIDB4MDcyN0YsIDB4MDIyRjcsIDB4MDE4RkUsIDB4MDI0MEYsCisgICAgMHgwMkNEQSwgMHgwMzFDQiwgMHgwNERDQywgMHgwMzRCQSwgMHgwMzZDQiwgMHgwMDUyQiwKKyAgICAweDA1OTk3LCAweDAzNkNFLCAweDAwOTA3LCAweDA4RkRGLCAweDA0M0NELCAweDAwRTdFLAorICAgIDB4MDUxN0EsIDB4MDREQ0QsIDB4MDE5N0UsIDB4MEEyQkYsIDB4MDI4RDEsIDB4MDQ4MDcsCisgICAgMHgwMjhEMiwgMHgwNDgwOCwgMHgwRDI2MiwgMHgwMjRFRCwgMHgwMUFCRiwgMHgwNzJDMCwKKyAgICAweDE0MzdGLCAweDAzNEJFLCAweDA1MTc5LCAweDE0NEYwLCAweDA3MkMxLCAweDAyOUMxLAorICAgIDB4MDhGREUsIDB4MDQzQ0MsIDB4MDIzQUUsIDB4MDBBM0IsIDB4MUZFOTcsIDB4MDhGRTEsCisgICAgMHgwMTQyQSwgMHgwMDZBQywgMHgwNDgwOSwgMHgwMjRFRSwgMHgwMEM3QiwgMHgzRkFFMywKKyAgICAweDA4RkUyLCAweDAxRjhGLCAweDBBMkMwLCAweDAyM0FGLCAweDA4RkUzLCAweDAyNDE2LAorICAgIDB4MDcyQzIsIDB4MEZGNjUsIDB4MDBGQ0IsIDB4MDhGRTAsIDB4MTQ0RjEsIDB4MDFFQTYsCisgICAgMHgwMDU5MCwgMHgwNERDRSwgMHgwMzk2RiwgMHgwMUZDNywgMHgwNTk5MSwgMHgzRkFFMiwKKyAgICAweDAwOTZDLCAweDAwNjU3LCAweDAzNEI4LCAweDA1OTkyLCAweDAyNDBFLCAweDBBMkJDLAorICAgIDB4MDhGREEsIDB4MDExNEYsIDB4MDcyN0MsIDB4MDY5NDUsIDB4MDUxNzUsIDB4MDFCNzIsCisgICAgMHgwNzI3QiwgMHgwN0ZDMywgMHgwMTQ3MiwgMHgwQTJCQiwgMHgwRDIzRSwgMHgwMENCRSwKKyAgICAweDAwNjM2LCAweDAzNEI3LCAweDA0M0M5LCAweDAwOEFBLCAweDA4RkRCLCAweDBEMjNGLAorICAgIDB4MDI4NTIsIDB4MDcyN0QsIDB4MDU5OTQsIDB4MDBFM0UsIDB4MDMxQ0EsIDB4MDY5NDcsCisgICAgMHgwNERDOCwgMHgwMkNEOSwgMHgxRkU5NSwgMHgwRDI2MCwgMHgwMjhDRCwgMHgwMjRFQywKKyAgICAweDA0ODAzLCAweDA3RkM0LCAweDAxOTc2LCAweDAyOENDLCAweDA1OTkzLCAweDA3RkM1LAorICAgIDB4MDI3RkYsIDB4MDY5NDYsIDB4MDNGRUIsIDB4MDNGMEQsIDB4MDA5NkQsIDB4MDhGREMsCisgICAgMHgwNERDOSwgMHgwMDk3RSwgMHgwMDNEMywgMHgwQTJCRCwgMHgwMjg2RSwgMHgwN0ZDNiwKKyAgICAweDA3RkM3LCAweDAzNEI5LCAweDAyOUMwLCAweDAxRjhFLCAweDA0RENBLCAweDA1MTc3LAorICAgIDB4MDE5NzcsIDB4MDNGRUUsIDB4MDI5N0UsIDB4MDI4Q0UsIDB4MDM2Q0EsIDB4MDUxNzYsCisgICAgMHgwMjk3RiwgMHgwMDU5NiwgMHgwMjg1MywgMHgwNDNDQSwgMHgwMDkwRSwgMHgxNDRGQSwKKyAgICAweDBEMjZBLCAweDAwOEFCLCAweDAwMENFLCAweDA3MkMzLCAweDAzNEJGLCAweDAyNDE3LAorICAgIDB4M0ZBRjAsIDB4M0ZBRUYsIDB4MDI2RjMsIDB4MUZFQTAsIDB4M0ZBRjEsIDB4MUZFOUYsCisgICAgMHgwRDI2OSwgMHgwRkY2QSwgMHgxRkU5RCwgMHgwMjlDNiwgMHgzRkFFRSwgMHgxRkU5RSwKKyAgICAweDAzNkNGLCAweDAwMUFBLCAweDA0ODBFLCAweDBBMkM3LCAweDAwMEEwLCAweDA3RkNFLAorICAgIDB4M0ZBRjQsIDB4MDA4RjgsIDB4M0ZBRjUsIDB4MTQ0RkIsIDB4MDBBMTYsIDB4MDI0RUYsCisgICAgMHgwNEREMywgMHgwNjk0RSwgMHgxRkVBMiwgMHgzRkFGNywgMHgzRkFGNiwgMHgwRDI2QiwKKyAgICAweDA0REQyLCAweDNGQUYyLCAweDFGRUExLCAweDA4RkU2LCAweDAxMjJCLCAweDA4RkU3LAorICAgIDB4MDQ4MEYsIDB4MDBDNkYsIDB4MEZGNkIsIDB4M0ZBRjMsIDB4MDA4RUYsIDB4MDBDN0UsCisgICAgMHgzRkFGOCwgMHgxRkVBNCwgMHgwMERGNiwgMHgwMDM2MiwgMHgwNjk0RiwgMHgwNTk5QiwKKyAgICAweDAxNDJCLCAweDFGRUE2LCAweDFGRUE1LCAweDAzRkVGLCAweDA3RkNGLCAweDFGRUE3LAorICAgIDB4M0ZBRjksIDB4MDI5QzcsIDB4MEQyNkUsIDB4MTQ0RkUsIDB4MDFDM0UsIDB4MUZFQTMsCisgICAgMHgwQTJDQSwgMHgwMUNFNiwgMHgwMDQ5RSwgMHgwNDNDRiwgMHgwNEVGRSwgMHgwMDM2QiwKKyAgICAweDNGQUZFLCAweDExRjMyLCAweDAxRUFFLCAweDFGRUFBLCAweDBEMjZGLCAweDA0OUQyLAorICAgIDB4MDJFQUUsIDB4MDM1NkEsIDB4MDhGRUEsIDB4MDdBQkUsIDB4MDhGRUIsIDB4M0ZBRkYsCisgICAgMHgxRkVBQiwgMHgwMjkyRSwgMHgxNDRGRiwgMHgzRkFGQSwgMHgwOEZFOCwgMHgwMUVBNywKKyAgICAweDBCMjdBLCAweDBBMkNCLCAweDAxNjRFLCAweDNGQUZCLCAweDA4RkU5LCAweDAyMUVGLAorICAgIDB4MDBBNzYsIDB4MUZFOUEsIDB4MTQ0RjIsIDB4MDI5QzMsIDB4M0ZBRTgsIDB4M0ZBRTcsCisgICAgMHgwMTRFRSwgMHgwM0YxMiwgMHgwRDI2NCwgMHgwOEZFNCwgMHgwRkY2NywgMHgxRkU5QiwKKyAgICAweDE0NEYzLCAweDBGRjY2LCAweDBEMjYzLCAweDNGQUU1LCAweDNGQUU0LCAweDAyOUMyLAorICAgIDB4MDMxRkUsIDB4MEEyQzEsIDB4MUZFOTgsIDB4MDFGRDYsIDB4M0ZBRTYsIDB4MUZFOTksCisgICAgMHgwMTQ3MywgMHgwMEQ5QiwgMHgxNDRGNSwgMHgxNDRGNCwgMHgwMEZEMiwgMHgwMDM2QSwKKyAgICAweDA0M0NFLCAweDAzRjEzLCAweDA1MTdCLCAweDBEMjY3LCAweDE0NEY2LCAweDAxNzU2LAorICAgIDB4MEEyQzIsIDB4MTQ0RjgsIDB4MTQ0RjcsIDB4MDQ4MEEsIDB4MEZGNjgsIDB4MEQyNjUsCisgICAgMHgwMUI3MywgMHgwRDI2NiwgMHgzRkFFOSwgMHgwMUE2NywgMHgwMDQ5MywgMHgwNjk0QiwKKyAgICAweDA2OTRBLCAweDAwMDgyLCAweDAzRjdFLCAweDA0RENGLCAweDAwOUI3LCAweDNGQUVCLAorICAgIDB4MUZFOUMsIDB4MDA3MUQsIDB4MDI4RDMsIDB4MEQyNjgsIDB4MEEyQzUsIDB4MEEyQzYsCisgICAgMHgzRkFFRCwgMHgzRkFFQywgMHgwOEZFNSwgMHgwN0ZDQSwgMHgzRkFFQSwgMHgxNDRGOSwKKyAgICAweDBBMkMzLCAweDAwRDNDLCAweDA3RkNCLCAweDA0ODBCLCAweDAwOUNBLCAweDBGRjY5LAorICAgIDB4MEEyQzQsIDB4MDA5MUUsIDB4MDA3RUIsIDB4MUZFODUsIDB4MEZGNTYsIDB4MDA5MUYsCisgICAgMHgwMDE5RSwgMHgwNjkzQSwgMHgwNTkzRSwgMHgwMjBGQywgMHgxRkU4NiwgMHgwRkY1NywKKyAgICAweDAyN0Y0LCAweDAxNDZBLCAweDA0QkZDLCAweDBDQkY5LCAweDBDQkY4LCAweDFGRTgzLAorICAgIDB4M0Y3RjUsIDB4MDhGOUUsIDB4M0Y3RjYsIDB4MUZFODQsIDB4MDM2QzAsIDB4MDAwOTgsCisgICAgMHgwNTkzQywgMHgwNzFGOSwgMHgwMDA2RSwgMHgwNTkzRiwgMHgwMzk2MywgMHgwMEEzQywKKyAgICAweDEzQkZELCAweDFGRTg5LCAweDAwN0YyLCAweDAwRkQzLCAweDAzRjA4LCAweDAzRDVFLAorICAgIDB4MDM0QTksIDB4MTNCRkYsIDB4MTNCRkUsIDB4MDcxRkEsIDB4MDExRTgsIDB4MUZFODcsCisgICAgMHgzRjdGNywgMHgwRkY1OCwgMHgwMUI2NiwgMHgwN0ZCOCwgMHgwNTE2OCwgMHgwMDcwRSwKKyAgICAweDBGRjU5LCAweDFGRTg4LCAweDAwOUIzLCAweDAwQkJDLCAweDFGRThCLCAweDNGN0Y4LAorICAgIDB4MDBGRTYsIDB4MDA0RkMsIDB4MENCRkMsIDB4MDNGRTYsIDB4MDIyRjAsIDB4MUZFOEMsCisgICAgMHgwQ0JGRCwgMHgwMUNFNywgMHgwOEY5RiwgMHgwRkY1QSwgMHgwNzFGRCwgMHgxRkU4QSwKKyAgICAweDA3MUZCLCAweDE0Mzc4LCAweDAxQUI0LCAweDBDQkZCLCAweDBDQkZBLCAweDAzNkMxLAorICAgIDB4MDAzN0UsIDB4MDU5ODAsIDB4MDcxRkMsIDB4MDBENUUsIDB4M0Y3RkMsIDB4MDhGRDAsCisgICAgMHgwMTRFRiwgMHgzRjdGRSwgMHgzRjdGRCwgMHgwMUNGRSwgMHgwMUZCRSwgMHgwNTk4MiwKKyAgICAweDE0MzdBLCAweDA0QkZELCAweDFGRThFLCAweDNGN0ZGLCAweDA3MUZGLCAweDBGRjVCLAorICAgIDB4MUZFOEQsIDB4M0Y3RjksIDB4MTQzNzksIDB4MDQ3RjcsIDB4MDU5ODEsIDB4MDcxRkUsCisgICAgMHgwMTRFMiwgMHgzRjdGQiwgMHgzRjdGQSwgMHgwMkNDRSwgMHgwMDM3RiwgMHgwQTI3RSwKKyAgICAweDNENUZBLCAweDAyQ0NDLCAweDFGRTgwLCAweDFGRDdFLCAweDAxNDk2LCAweDAxOEU0LAorICAgIDB4M0Q1RkIsIDB4MDUxNjQsIDB4MDcwRkQsIDB4M0Q1RkMsIDB4MTFGMzMsIDB4MDI3N0UsCisgICAgMHgwRkY1NCwgMHgwOEY5OCwgMHgwN0ZCNiwgMHgwNzBGQywgMHgwMjZFOCwgMHgwN0ZCNywKKyAgICAweDAzNEE2LCAweDAzNTZCLCAweDNENUY5LCAweDNENUY4LCAweDAzNEE4LCAweDAxMTRDLAorICAgIDB4M0Y3RjAsIDB4M0Q1RkYsIDB4MDBDNzQsIDB4MDAyNEQsIDB4MDUxNjcsIDB4MDQ5RDMsCisgICAgMHgwMjkyRiwgMHgwOEY5QywgMHgzRjdGMSwgMHgwMUNCNiwgMHgwMzk2MiwgMHgwNzBGRiwKKyAgICAweDA4RjlELCAweDA4RjlBLCAweDNENUZELCAweDBBMkIwLCAweDAyNEU4LCAweDA3MEZFLAorICAgIDB4M0Q1RkUsIDB4MDFBNUUsIDB4MDAzOTIsIDB4MDhGOUIsIDB4MDUxNjYsIDB4MDAwOTksCisgICAgMHgwNjkzOSwgMHgwNjkzOCwgMHgwMDlCMiwgMHgwQzdGRSwgMHgzRjdGNCwgMHgwMDdGNywKKyAgICAweDAxMUQ2LCAweDAyRUFGLCAweDAyOEJFLCAweDA3MUY4LCAweDBDN0ZGLCAweDFGRTgyLAorICAgIDB4MDQ3RjYsIDB4MDY5MzYsIDB4M0Y3RjMsIDB4M0Y3RjIsIDB4MUZFODEsIDB4MDI2RUEsCisgICAgMHgwQzdGQywgMHgwQjI3QiwgMHgwMDlGQSwgMHgwQzdGRCwgMHgxM0JGQywgMHgwMDdBOCwKKyAgICAweDAwMEQ0LCAweDA4RkQxLCAweDBEMjM0LCAweDAwRDM0LCAweDA3Mjc0LCAweDA1OTg4LAorICAgIDB4MDBGNUMsIDB4MDUxNkQsIDB4MDUxNkUsIDB4MDUxNkMsIDB4MDM2QzMsIDB4MEEyQjQsCisgICAgMHgwRDIzNSwgMHgwMzZDMiwgMHgwMzRBQywgMHgwRDIzMywgMHgwN0ZCQSwgMHgwMzRBQiwKKyAgICAweDBBMkIzLCAweDE0MzdELCAweDE0MzdDLCAweDAwQjNCLCAweDA3MjczLCAweDA1MTZCLAorICAgIDB4MDBEODQsIDB4MDA5RkIsIDB4MDY5M0YsIDB4MDU5OEEsIDB4MDA3RjgsIDB4MDA1RDYsCisgICAgMHgwNDdGQiwgMHgwMjRFQSwgMHgwMjZFQywgMHgwNTE2RiwgMHgwNDdGQywgMHgwMzFBNywKKyAgICAweDAxMzk3LCAweDAyNkVELCAweDAyOTc1LCAweDAyQ0QxLCAweDAzNEFELCAweDA3Mjc1LAorICAgIDB4MDI3RjYsIDB4MDU5ODksIDB4MDQzQzEsIDB4MDY5M0UsIDB4MDA0NTQsIDB4MDM0QUUsCisgICAgMHgwNDNDMiwgMHgwMDdGNiwgMHgwQTJCNywgMHgwN0ZCQiwgMHgwMjQwOCwgMHgwNTk4QiwKKyAgICAweDA0N0ZELCAweDAxQjZBLCAweDA0REMxLCAweDBGRjVGLCAweDA3RkJDLCAweDAxQjZCLAorICAgIDB4MDcyNzcsIDB4MEQyMzYsIDB4MDIwRkQsIDB4MDFCNjgsIDB4MEEyQjUsIDB4MEZGNUUsCisgICAgMHgwMjk3NiwgMHgwNDNDMywgMHgwMjk3NywgMHgwQTJCNiwgMHgwMTJERSwgMHgwNzI3NiwKKyAgICAweDAzRkU5LCAweDAxQjY5LCAweDAwQTRDLCAweDBGRjYwLCAweDFGRTkzLCAweDAxM0JDLAorICAgIDB4MDA1OTIsIDB4MDI5NzgsIDB4MDJDRDMsIDB4MDBEOEUsIDB4MEQyMzcsIDB4MDUxNzAsCisgICAgMHgwMUZDMSwgMHgwMjhDMiwgMHgwNjk0MSwgMHgwRDIzOCwgMHgwNzI3OCwgMHgwMzRBRiwKKyAgICAweDA2OTQwLCAweDAwRTVFLCAweDA4RkQyLCAweDA3RkJELCAweDAyMEZFLCAweDAwN0U2LAorICAgIDB4MDQzQzQsIDB4MDJDRDIsIDB4MDE2NkUsIDB4MENCRkYsIDB4MENCRkUsIDB4MDBBNUMsCisgICAgMHgwMDVEMCwgMHgwMjZFQiwgMHgwNDdGOCwgMHgwMUY4OCwgMHgxRkU5MCwgMHgxRkU4RiwKKyAgICAweDAwQzY4LCAweDAyMUVDLCAweDBBMkIxLCAweDBEMjMwLCAweDA0QkZFLCAweDA2OTNCLAorICAgIDB4MDI4QkYsIDB4MDI4QzAsIDB4MDcyNzAsIDB4MEZGNUMsIDB4MDBFMDgsIDB4MDAzNjAsCisgICAgMHgwNDM2QywgMHgwNTk4MywgMHgwMDlCRSwgMHgwRkY1RCwgMHgxRkU5MSwgMHgwMUE2MCwKKyAgICAweDA0QkZGLCAweDBBMkIyLCAweDA0MzZFLCAweDAzRjBBLCAweDA3RkI5LCAweDA1OTg0LAorICAgIDB4MDFGQzAsIDB4MUZFOTIsIDB4MTQzN0IsIDB4MDE2NDYsIDB4MDNGMDksIDB4MDY5M0MsCisgICAgMHgwMjdGNSwgMHgwNDdGOSwgMHgwMzRBQSwgMHgwRDIzMSwgMHgwNDM2RCwgMHgwMUFCNiwKKyAgICAweDA0N0ZBLCAweDA3MjcxLCAweDAwQ0ZBLCAweDAwNkNGLCAweDA3MjcyLCAweDA1OTg2LAorICAgIDB4MDBCM0EsIDB4MDA2NTQsIDB4MDI4QzEsIDB4MDQzNkYsIDB4MDJDRDAsIDB4MDNGRTgsCisgICAgMHgwNTk4NywgMHgwNDNDMCwgMHgwMTQ2QiwgMHgwMjk3NCwgMHgwMzFBNiwgMHgwMkNDRiwKKyAgICAweDAzOTY0LCAweDA0REMwLCAweDA1MTZBLCAweDA1OTg1LCAweDA1MTY5LCAweDAyNDA2LAorICAgIDB4MDAzRDYsIDB4MEQyMzIsIDB4MDY5M0QsIDB4MDAwNUMsIDB4MDA2RjYsIDB4MDA4NkUsCisgICAgMHgwMDA2MiwgMHgwMDA1QiwgMHgwMDZGMSwgMHgwMDdFMCwgMHgwMEQ5OCwgMHgwMEJCRSwKKyAgICAweDAwRTcyLCAweDAwRDhGLCAweDAwNERBLCAweDAxMzdCLCAweDAxMzdBLCAweDAwMzg2LAorICAgIDB4MDBBN0UsIDB4MDBDNkEsIDB4MDBDQkEsIDB4MDBGNUUsIDB4MDBGNUQsIDB4MDEzQkQsCisgICAgMHgwMDA2NCwgMHgwMDlDRSwgMHgwMDhFQywgMHgwMDAzQiwgMHgwMEY1NiwgMHgwMENBQSwKKyAgICAweDAwMjQ2LCAweDAwOEVELCAweDAwODZDLCAweDAwMUVELCAweDAwQzc3LCAweDAyNDBBLAorICAgIDB4MDFCNkQsIDB4MDA4NkYsIDB4MDJDRDUsIDB4MDFGQzMsIDB4MDA3M0UsIDB4MDA1RDIsCisgICAgMHgwMTk3MCwgMHgwMTRFNCwgMHgwMDQ1NiwgMHgwMEIyMiwgMHgwMTE0RCwgMHgwMjE5OCwKKyAgICAweDAwMTM4LCAweDAwNjlDLCAweDAwNzM3LCAweDAwMjBDLCAweDAwQTRFLCAweDA0REMyLAorICAgIDB4MDE4RTYsIDB4MDBFMUUsIDB4MDA2RDIsIDB4MDQ3RkYsIDB4MDI5NzksIDB4MDFGRkUsCisgICAgMHgwNDgwMCwgMHgwMjFFRCwgMHgwMjhDNiwgMHgwMDkxNywgMHgwMTY3MSwgMHgwMUNGRiwKKyAgICAweDAwQ0ZCLCAweDAwRkU3LCAweDAwQTFBLCAweDAxNDZELCAweDAxNjcwLCAweDAxQjZFLAorICAgIDB4MDEzN0UsIDB4MDA2RDEsIDB4MDFGRkQsIDB4MDI4QzUsIDB4MDAxNzYsIDB4MDUxNzEsCisgICAgMHgwMjE5QSwgMHgwMDIzQywgMHgwQTJCQSwgMHgwNDNDNSwgMHgwMDZGOCwgMHgwMDZERiwKKyAgICAweDAxRUE0LCAweDAxQ0JBLCAweDAyN0Y4LCAweDBGRjYxLCAweDA4RkQ1LCAweDAxNzdCLAorICAgIDB4MDIxOTksIDB4MEQyM0EsIDB4MDM5NjYsIDB4MDI5N0EsIDB4MDBBMzgsIDB4MDE3N0EsCisgICAgMHgwMUE2MSwgMHgwMDU5NywgMHgwN0ZCRiwgMHgwNERDMywgMHgwMDdGNCwgMHgwMDE5NiwKKyAgICAweDAzNEIwLCAweDAzRjBCLCAweDAwOEY2LCAweDA1OThDLCAweDA4RkQzLCAweDAwM0QyLAorICAgIDB4MDA2RDAsIDB4MDFGQzIsIDB4MDMxQzEsIDB4MDI2RUUsIDB4MEEyQjksIDB4MEQyMzksCisgICAgMHgwMTc1RiwgMHgwMTc1RSwgMHgwMzFDMCwgMHgwNjk0MiwgMHgwMUZGNiwgMHgwMEEzRCwKKyAgICAweDAxNjZGLCAweDAyN0Y3LCAweDAwOUM4LCAweDBBMkI4LCAweDA3RkJFLCAweDAwNzM0LAorICAgIDB4MDBGQzYsIDB4MDM5NjUsIDB4MDY5NDMsIDB4MDEwQ0YsIDB4MDA2REUsIDB4MDJDRDQsCisgICAgMHgwOEZENCwgMHgwMzRCMiwgMHgwMUNCOCwgMHgwMjhDMywgMHgwMUZGQywgMHgwMDQxRSwKKyAgICAweDAxNDZDLCAweDAxQjZDLCAweDAwQzc2LCAweDAwQjNDLCAweDAxMENFLCAweDAyMkYxLAorICAgIDB4MDE0NEMsIDB4MDEyREYsIDB4MDE0MzYsIDB4MDA3M0EsIDB4MDM0QjEsIDB4MDMxQzIsCisgICAgMHgwMDA0MiwgMHgwMERFRSwgMHgwMEIzRCwgMHgwMDFDQywgMHgwMEExNywgMHgwMDdFOCwKKyAgICAweDAwMjFDLCAweDAwQTI4LCAweDAxQ0I5LCAweDAyNDA5LCAweDAwOTE2LCAweDAyMEZGLAorICAgIDB4MDQ3RkUsIDB4MDA3MjYsIDB4MDAyMzgsIDB4MDExRTksIDB4MDFBQjcsIDB4MDA3MUUsCisgICAgMHgwMEZDOCwgMHgwMjhDNCwgMHgwMEQ4NSwgMHgwMDIzOSwgMHgwMDhFQSwgMHgwMDdBMiwKKyAgICAweDAwMTJDLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb24yYXZjX2NiNV9iaXRzW09OMkFWQ19DQjVfQ09ERVNdID0geworICAgICAxLCAgOCwgIDgsICA3LCAgOCwgIDgsCisgICAgIDYsIDExLCAxMiwgMTEsIDEwLCAxMSwKKyAgICAxMSwgIDksICA5LCAxMiwgMTEsICA5LAorICAgIDExLCAxMiwgMTIsICA2LCAgOCwgIDgsCisgICAgIDcsICA3LCAgOSwgMTAsICA3LCAgNywKKyAgICAxMSwgMTEsIDEyLCAxMCwgMTEsIDEyLAorICAgIDEwLCAxMSwgMTAsICA5LCAxMCwgMTAsCisgICAgMTEsICA5LCAxMSwgMTEsICA3LCAxMSwKKyAgICAxMSwgMTEsIDE1LCAxNSwgMTIsIDEzLAorICAgIDEyLCAxMiwgMTQsIDE0LCAxNCwgMTIsCisgICAgMTQsIDE0LCAxMCwgMTIsIDE0LCAxNCwKKyAgICAxMSwgMTMsIDE1LCAxNCwgMTIsIDEzLAorICAgIDEyLCAxMiwgMTEsIDE2LCAxNSwgMTIsCisgICAgMTAsIDE0LCAxMywgMTIsIDE1LCAxMywKKyAgICAxMSwgMTQsIDE1LCAxNCwgMTIsIDE0LAorICAgIDEzLCAxMiwgMTUsIDE1LCAxMSwgMTAsCisgICAgMTQsIDEzLCAxMiwgMTYsIDE4LCAxMCwKKyAgICAxMCwgMTMsIDE0LCAxMSwgMTQsIDE2LAorICAgIDEyLCAxMywgMTQsIDE1LCAxMiwgMTMsCisgICAgMTMsIDEyLCAxNCwgMTUsIDEyLCAxMCwKKyAgICAxMywgMTQsIDExLCAxNCwgMTUsIDEyLAorICAgIDEyLCAxMywgMTIsIDEzLCAxNCwgMTQsCisgICAgMTAsIDEzLCAxNSwgMTIsIDEwLCAxMiwKKyAgICAxNCwgMTIsIDEzLCAxNSwgMTQsIDEyLAorICAgIDEyLCAxMywgMTMsICA3LCAgOSwgIDksCisgICAgIDcsICA3LCAxMSwgMTAsIDExLCAxMCwKKyAgICAgOSwgMTIsIDEwLCAxMSwgMTEsIDEwLAorICAgIDEwLCAxMSwgMTEsIDExLCAxMCwgMTIsCisgICAgIDcsIDExLCAxMSwgIDcsIDEyLCAxMSwKKyAgICAgNywgIDcsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTAsIDEyLCAxMiwgMTEsCisgICAgMTMsIDEzLCAxMiwgMTMsIDEyLCAxMywKKyAgICAgNywgMTIsIDEyLCAgNywgMTIsIDEyLAorICAgICA5LCAxMSwgMTIsIDEwLCAxMiwgMTMsCisgICAgMTMsIDExLCAxMywgMTMsIDEwLCAxMiwKKyAgICAxNCwgMTMsIDExLCAxMiwgMTMsIDE0LAorICAgICA5LCAxMSwgMTIsIDEwLCAxMiwgMTQsCisgICAgMTQsIDEyLCAxMiwgMTQsIDE0LCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTIsIDEyLAorICAgIDEyLCAxMywgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDExLCAxNCwgMTQsICA5LCAxNSwKKyAgICAxNCwgMTEsIDE2LCAxNSwgMTIsIDEyLAorICAgIDE0LCAxMywgMTQsIDE2LCAxNCwgMTMsCisgICAgMTMsIDE1LCAxNiwgMTMsIDExLCAxNCwKKyAgICAxNCwgMTEsIDE2LCAxNSwgMTIsICA5LAorICAgIDE0LCAxNSwgMTEsIDE1LCAxNiwgMTEsCisgICAgMTIsIDEzLCAxMywgMTMsIDEzLCAxNSwKKyAgICAxNSwgMTMsIDE4LCAxNywgMTMsIDExLAorICAgIDEzLCAxNCwgMTEsIDE0LCAxNiwgMTEsCisgICAgMTIsIDEzLCAxNCwgMTIsIDExLCAxNCwKKyAgICAxNCwgMTQsIDEzLCAxMywgMTMsIDEyLAorICAgIDEyLCAxMywgMTIsIDEzLCAxMywgMTMsCisgICAgMTMsIDE0LCAxNCwgMTEsIDE0LCAxNSwKKyAgICAgNiwgMTIsIDEyLCAxMCwgMTEsIDExLAorICAgICA5LCAxMiwgMTMsIDEzLCAxMCwgMTIsCisgICAgMTMsIDExLCAxMSwgMTMsIDEzLCAxMiwKKyAgICAxMiwgMTMsIDEzLCAgOSwgMTEsIDEyLAorICAgIDEwLCAgOCwgMTUsIDE1LCAxMiwgMTQsCisgICAgMTUsIDEzLCAxNCwgMTcsIDE1LCAxNCwKKyAgICAxNiwgMTYsIDE1LCAxNCwgMTcsIDE2LAorICAgIDE0LCAxNCwgMTUsIDE0LCAxMiwgMTUsCisgICAgMTUsIDEyLCAxMiwgMTUsIDE1LCAxMSwKKyAgICAxMCwgMTUsIDE0LCAxNCwgMTUsIDE2LAorICAgIDE1LCAxNSwgMTUsIDE0LCAxMywgMTQsCisgICAgMTQsIDE0LCAxNSwgMTQsIDE0LCAxMSwKKyAgICAxNSwgMTQsIDEyLCAxNiwgMTUsIDEyLAorICAgIDE1LCAxNSwgMTMsIDE2LCAxNCwgMTUsCisgICAgMTQsIDE1LCAxNiwgMTQsIDEzLCAxNSwKKyAgICAxNywgMTQsIDE1LCAxNywgMTUsIDE0LAorICAgIDE2LCAxNSwgMTQsIDEyLCAxNywgMTYsCisgICAgMTMsIDExLCAxNSwgMTQsIDEyLCAxOCwKKyAgICAxNiwgMTMsIDE2LCAxNCwgMTYsIDE0LAorICAgIDE1LCAxNiwgMTIsIDE2LCAxNywgMTMsCisgICAgMTEsIDE1LCAxNCwgMTMsIDE1LCAxOCwKKyAgICAxMiwgMTEsIDE0LCAxNSwgMTQsIDE2LAorICAgIDE2LCAxMywgMTUsIDE1LCAxNSwgMTMsCisgICAgMTUsIDE1LCAxMywgMTYsIDE2LCAxMiwKKyAgICAxMSwgMTQsIDE1LCAxMiwgMTYsIDE2LAorICAgIDE0LCAxNSwgMTUsIDEyLCAxNCwgMTUsCisgICAgMTUsIDE0LCAxNywgMTYsIDE0LCAxNCwKKyAgICAxNSwgMTUsIDEzLCAxNCwgMTUsIDE1LAorICAgIDE0LCAxNSwgMTQsIDE0LCAxMiwgMTYsCisgICAgMTUsIDEyLCAxMCwgMTYsIDE0LCAxNSwKKyAgICAxNSwgMTQsIDE0LCAxMywgMTUsIDE1LAorICAgIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsCisgICAgMTQsIDExLCAxNCwgMTUsIDEyLCAxNywKKyAgICAxNiwgMTIsICA4LCAxNSwgMTQsIDE0LAorICAgIDE4LCAxOCwgMTQsIDE3LCAxOCwgMTcsCisgICAgMTYsIDE2LCAxNywgMTQsIDE4LCAxNywKKyAgICAxNCwgIDksIDE1LCAxNiwgIDgsIDE1LAorICAgIDE4LCAxMiwgMTgsIDE3LCAxMiwgMTQsCisgICAgMTUsIDE1LCAxNywgMTgsIDE4LCAxNiwKKyAgICAxNSwgMTgsIDE3LCAxNiwgMTMsIDE2LAorICAgIDE1LCAxMiwgMTYsIDE4LCAxMiwgMTIsCisgICAgMTgsIDE3LCAxMiwgMTAsIDE1LCAxNSwKKyAgICAxMywgMTcsIDE3LCAxNCwgMTUsIDE3LAorICAgIDE4LCAxNCwgMTYsIDE3LCAxMywgMTcsCisgICAgMTYsIDEzLCAxMSwgMTUsIDE1LCAxMCwKKyAgICAxOCwgMTcsIDEzLCAxNywgMTYsIDE1LAorICAgIDE0LCAxNCwgMTYsIDE1LCAxNiwgMTgsCisgICAgMTcsIDE0LCAxNywgMTgsIDE2LCAxMywKKyAgICAxNiwgMTYsIDEzLCAxOCwgMTYsIDE0LAorICAgIDEyLCAxNywgMTcsIDE0LCAxOCwgMTgsCisgICAgMTMsIDE0LCAxNiwgMTYsIDE2LCAxNywKKyAgICAxNywgMTYsIDE2LCAxOCwgMTgsIDE0LAorICAgIDE0LCAxNiwgMTcsIDEzLCAxOCwgMTcsCisgICAgMTMsIDEyLCAxNywgMTcsIDEyLCAxMCwKKyAgICAxNSwgMTQsIDE1LCAxNiwgMTcsIDEzLAorICAgIDE2LCAxNywgMTcsIDE1LCAxNiwgMTYsCisgICAgMTMsIDE2LCAxOCwgMTMsIDExLCAxNSwKKyAgICAxNSwgIDgsIDE0LCAxNSwgMTIsIDE4LAorICAgIDE3LCAxMSwgMTQsIDE2LCAxNiwgMTYsCisgICAgMTgsIDE4LCAxNiwgMTUsIDE4LCAxNywKKyAgICAxNiwgMTIsIDE1LCAxNSwgMTIsIDE2LAorICAgIDE2LCAxMiwgMTEsIDE3LCAxNiwgMTIsCisgICAgIDksIDE1LCAxNSwgMTQsIDE3LCAxNiwKKyAgICAxNCwgMTMsIDE1LCAxNiwgMTYsIDE3LAorICAgIDE4LCAxNiwgMTgsIDE3LCAxNCwgIDgsCisgICAgMTUsIDE1LCAgNywgMTUsIDE0LCAxMiwKKyAgICAxNywgMTcsIDExLCAxMiwgMTQsIDE0LAorICAgIDE0LCAxNywgMTcsIDE1LCAxMywgMTcsCisgICAgMTgsIDE2LCAxMywgMTUsIDE1LCAxMSwKKyAgICAxNiwgMTcsIDEyLCAxMiwgMTcsIDE4LAorICAgIDEyLCAxMSwgMTYsIDE0LCAxNCwgMTcsCisgICAgMTYsIDEzLCAxNiwgMTYsIDE1LCAxNywKKyAgICAxNSwgMTcsIDEzLCAxNiwgMTYsIDE0LAorICAgIDEwLCAxNSwgMTUsIDEyLCAxOCwgMTYsCisgICAgMTMsIDE4LCAxOCwgMTMsIDEzLCAxNSwKKyAgICAxNywgMTUsIDE3LCAxOCwgMTUsIDE2LAorICAgIDE3LCAxOCwgMTcsIDE1LCAxNSwgMTUsCisgICAgMTMsIDE4LCAxOCwgMTQsIDEwLCAxNiwKKyAgICAxOCwgMTQsIDE3LCAxNywgMTMsIDEzLAorICAgIDE4LCAxNSwgMTUsIDE4LCAxNywgMTQsCisgICAgMTYsIDE2LCAxNSwgMTUsIDE0LCAxNSwKKyAgICAxNCwgMTQsIDE4LCAxOCwgMTQsIDEzLAorICAgIDE4LCAxOCwgMTIsIDEwLCAxNSwgMTUsCisgICAgMTQsIDE2LCAxOCwgMTMsIDE0LCAxNSwKKyAgICAxNiwgMTYsIDE4LCAxNiwgMTQsIDE1LAorICAgIDE4LCAxMywgMTAsIDE2LCAxNSwgIDgsCisgICAgMTUsIDE1LCAxMiwgMTYsIDE4LCAxMSwKKyAgICAxMywgMTQsIDE0LCAxNSwgMTYsIDE3LAorICAgIDE1LCAxNSwgMTgsIDE4LCAxNywgMTQsCisgICAgMTYsIDE2LCAxMiwgMTYsIDE3LCAxMSwKKyAgICAgOCwgMTYsIDE2LCAxMiwgMTUsIDE1LAorICAgIDEyLCAxNSwgMTUsIDE1LCAxNCwgMTYsCisgICAgMTYsIDE0LCAxNCwgMTYsIDE1LCAxNCwKKyAgICAxNiwgMTcsIDE3LCAxMiwgMTUsIDE1LAorICAgIDEyLCAxMiwgMTUsIDE1LCAxMSwgMTEsCisgICAgMTUsIDE0LCAxNCwgMTUsIDE1LCAxNCwKKyAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LAorICAgIDE0LCAxNSwgMTUsIDE1LCAxMSwgMTQsCisgICAgMTUsIDExLCAxNiwgMTUsIDE0LCAxNSwKKyAgICAxNSwgMTMsIDE1LCAxNiwgMTUsIDEzLAorICAgIDE1LCAxNiwgMTQsIDEzLCAxNiwgMTYsCisgICAgMTQsIDE1LCAxNCwgMTYsIDEzLCAxNSwKKyAgICAxNCwgMTMsIDEyLCAxNiwgMTcsIDEzLAorICAgIDExLCAxNCwgMTQsIDEyLCAxNiwgMTUsCisgICAgMTMsIDE0LCAxNSwgMTYsIDE1LCAxNCwKKyAgICAxNSwgMTIsIDE2LCAxNSwgMTQsIDExLAorICAgIDE1LCAxNCwgMTMsIDE2LCAxNiwgMTIsCisgICAgMTEsIDE0LCAxNSwgMTMsIDE3LCAxNywKKyAgICAxMiwgMTQsIDE2LCAxNiwgMTUsIDE1LAorICAgIDE0LCAxNCwgMTUsIDE2LCAxMiwgMTAsCisgICAgMTUsIDE1LCAxMiwgMTYsIDE3LCAxMywKKyAgICAxNSwgMTYsIDE1LCAxNCwgMTUsIDE1LAorICAgIDEzLCAxNywgMTcsIDEzLCAxNCwgMTUsCisgICAgMTQsIDE1LCAxNCwgMTYsIDE1LCAxMywKKyAgICAxNSwgMTUsIDEyLCAxMSwgMTUsIDE1LAorICAgIDEyLCAxMSwgMTQsIDE1LCAxNCwgMTQsCisgICAgMTUsIDE1LCAxMywgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTUsIDE1LCAxNSwgMTUsIDE0LAorICAgIDEwLCAxNiwgMTUsICA3LCAxMSwgMTIsCisgICAgIDcsICA3LCAxMSwgMTEsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDExLCAxMywgMTMsIDEwLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsCisgICAgIDcsIDEyLCAxMiwgIDYsIDEyLCAxMiwKKyAgICAxMCwgMTIsIDEyLCAgOSwgMTIsIDE0LAorICAgIDEzLCAxMiwgMTQsIDEzLCAxMSwgMTEsCisgICAgMTMsIDEzLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAgOSwgMTEsIDExLCAxMCwgMTIsIDE1LAorICAgIDEzLCAxMiwgMTEsIDE1LCAxNCwgMTMsCisgICAgMTUsIDE0LCAxNCwgMTIsIDEzLCAxMywKKyAgICAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMSwgMTMsIDE0LCAgOSwgMTUsCisgICAgMTQsIDEwLCAxNiwgMTUsIDExLCAxMSwKKyAgICAxMywgMTMsIDE0LCAxNiwgMTYsIDEzLAorICAgIDE0LCAxNiwgMTQsIDE0LCAxMiwgMTMsCisgICAgMTMsIDExLCAxNSwgMTUsIDExLCAgOSwKKyAgICAxNCwgMTQsIDEyLCAxNSwgMTYsIDEwLAorICAgIDExLCAxMywgMTQsIDE0LCAxNiwgMTYsCisgICAgMTMsIDEzLCAxNCwgMTUsIDEzLCAxMiwKKyAgICAxMywgMTQsIDEyLCAxNiwgMTUsIDExLAorICAgIDEyLCAxNCwgMTUsIDEzLCAxMSwgMTQsCisgICAgMTYsIDE0LCAxMywgMTQsIDEzLCAxMSwKKyAgICAxMywgMTMsIDEyLCAxMiwgMTMsIDE0LAorICAgIDEzLCAxMywgMTMsIDExLCAxNCwgMTQsCisgICAgIDcsIDEyLCAxMiwgIDksIDEyLCAxMSwKKyAgICAxMCwgMTIsIDEzLCAxNCwgMTIsIDE0LAorICAgIDE1LCAxMSwgMTAsIDEzLCAxMywgMTEsCisgICAgMTIsIDE0LCAxMiwgMTAsIDEyLCAxMSwKKyAgICAgOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBvbjJhdmNfY2I1X3N5bXNbT04yQVZDX0NCNV9DT0RFU10gPSB7CisgICAgMHgwMDAwLCAweDAwMDIsIDB4MDAwRSwgMHgwMDExLCAweDAwMTMsIDB4MDAxRCwKKyAgICAweDAwMUYsIDB4MDAyMCwgMHgwMDIyLCAweDAwMkUsIDB4MDAzMSwgMHgwMDMzLAorICAgIDB4MDAzRCwgMHgwMDNGLCAweDAwRDEsIDB4MDBEMywgMHgwMERELCAweDAwREYsCisgICAgMHgwMEUwLCAweDAwRTIsIDB4MDBFRSwgMHgwMEYxLCAweDAwRjMsIDB4MDBGRCwKKyAgICAweDAwRkYsIDB4MDEwMSwgMHgwMTAzLCAweDAxMEQsIDB4MDEwRiwgMHgwMTEwLAorICAgIDB4MDExMiwgMHgwMTFFLCAweDAxMjEsIDB4MDEyMywgMHgwMTJELCAweDAxMkYsCisgICAgMHgwMTMwLCAweDAxMzIsIDB4MDEzRSwgMHgwMUQwLCAweDAxRDIsIDB4MDFERSwKKyAgICAweDAxRTEsIDB4MDFFMywgMHgwMUVELCAweDAxRUYsIDB4MDFGMCwgMHgwMUYyLAorICAgIDB4MDFGRSwgMHgwMjAwLCAweDAyMDIsIDB4MDIwRSwgMHgwMjExLCAweDAyMTMsCisgICAgMHgwMjFELCAweDAyMUYsIDB4MDIyMCwgMHgwMjIyLCAweDAyMkUsIDB4MDIzMSwKKyAgICAweDAyMzMsIDB4MDIzRCwgMHgwMjNGLCAweDAyRDEsIDB4MDJEMywgMHgwMkRELAorICAgIDB4MDJERiwgMHgwMkUwLCAweDAyRTIsIDB4MDJFRSwgMHgwMkYxLCAweDAyRjMsCisgICAgMHgwMkZELCAweDAyRkYsIDB4MDMwMSwgMHgwMzAzLCAweDAzMEQsIDB4MDMwRiwKKyAgICAweDAzMTAsIDB4MDMxMiwgMHgwMzFFLCAweDAzMjEsIDB4MDMyMywgMHgwMzJELAorICAgIDB4MDMyRiwgMHgwMzMwLCAweDAzMzIsIDB4MDMzRSwgMHgwM0QwLCAweDAzRDIsCisgICAgMHgwM0RFLCAweDAzRTEsIDB4MDNFMywgMHgwM0VELCAweDAzRUYsIDB4MDNGMCwKKyAgICAweDAzRjIsIDB4MDNGRSwgMHgwRDAxLCAweDBEMDMsIDB4MEQwRCwgMHgwRDBGLAorICAgIDB4MEQxMCwgMHgwRDEyLCAweDBEMUUsIDB4MEQyMSwgMHgwRDIzLCAweDBEMkQsCisgICAgMHgwRDJGLCAweDBEMzAsIDB4MEQzMiwgMHgwRDNFLCAweDBERDAsIDB4MEREMiwKKyAgICAweDBEREUsIDB4MERFMSwgMHgwREUzLCAweDBERUQsIDB4MERFRiwgMHgwREYwLAorICAgIDB4MERGMiwgMHgwREZFLCAweDBFMDAsIDB4MEUwMiwgMHgwRTBFLCAweDBFMTEsCisgICAgMHgwRTEzLCAweDBFMUQsIDB4MEUxRiwgMHgwRTIwLCAweDBFMjIsIDB4MEUyRSwKKyAgICAweDBFMzEsIDB4MEUzMywgMHgwRTNELCAweDBFM0YsIDB4MEVEMSwgMHgwRUQzLAorICAgIDB4MEVERCwgMHgwRURGLCAweDBFRTAsIDB4MEVFMiwgMHgwRUVFLCAweDBFRjEsCisgICAgMHgwRUYzLCAweDBFRkQsIDB4MEVGRiwgMHgwRjAxLCAweDBGMDMsIDB4MEYwRCwKKyAgICAweDBGMEYsIDB4MEYxMCwgMHgwRjEyLCAweDBGMUUsIDB4MEYyMSwgMHgwRjIzLAorICAgIDB4MEYyRCwgMHgwRjJGLCAweDBGMzAsIDB4MEYzMiwgMHgwRjNFLCAweDBGRDAsCisgICAgMHgwRkQyLCAweDBGREUsIDB4MEZFMSwgMHgwRkUzLCAweDBGRUQsIDB4MEZFRiwKKyAgICAweDBGRjAsIDB4MEZGMiwgMHgwRkZFLCAweDEwMDEsIDB4MTAwMywgMHgxMDBELAorICAgIDB4MTAwRiwgMHgxMDEwLCAweDEwMTIsIDB4MTAxRSwgMHgxMDIxLCAweDEwMjMsCisgICAgMHgxMDJELCAweDEwMkYsIDB4MTAzMCwgMHgxMDMyLCAweDEwM0UsIDB4MTBEMCwKKyAgICAweDEwRDIsIDB4MTBERSwgMHgxMEUxLCAweDEwRTMsIDB4MTBFRCwgMHgxMEVGLAorICAgIDB4MTBGMCwgMHgxMEYyLCAweDEwRkUsIDB4MTEwMCwgMHgxMTAyLCAweDExMEUsCisgICAgMHgxMTExLCAweDExMTMsIDB4MTExRCwgMHgxMTFGLCAweDExMjAsIDB4MTEyMiwKKyAgICAweDExMkUsIDB4MTEzMSwgMHgxMTMzLCAweDExM0QsIDB4MTEzRiwgMHgxMUQxLAorICAgIDB4MTFEMywgMHgxMURELCAweDExREYsIDB4MTFFMCwgMHgxMUUyLCAweDExRUUsCisgICAgMHgxMUYxLCAweDExRjMsIDB4MTFGRCwgMHgxMUZGLCAweDEyMDEsIDB4MTIwMywKKyAgICAweDEyMEQsIDB4MTIwRiwgMHgxMjEwLCAweDEyMTIsIDB4MTIxRSwgMHgxMjIxLAorICAgIDB4MTIyMywgMHgxMjJELCAweDEyMkYsIDB4MTIzMCwgMHgxMjMyLCAweDEyM0UsCisgICAgMHgxMkQwLCAweDEyRDIsIDB4MTJERSwgMHgxMkUxLCAweDEyRTMsIDB4MTJFRCwKKyAgICAweDEyRUYsIDB4MTJGMCwgMHgxMkYyLCAweDEyRkUsIDB4MTMwMCwgMHgxMzAyLAorICAgIDB4MTMwRSwgMHgxMzExLCAweDEzMTMsIDB4MTMxRCwgMHgxMzFGLCAweDEzMjAsCisgICAgMHgxMzIyLCAweDEzMkUsIDB4MTMzMSwgMHgxMzMzLCAweDEzM0QsIDB4MTMzRiwKKyAgICAweDEzRDEsIDB4MTNEMywgMHgxM0RELCAweDEzREYsIDB4MTNFMCwgMHgxM0UyLAorICAgIDB4MTNFRSwgMHgxM0YxLCAweDEzRjMsIDB4MTNGRCwgMHgxM0ZGLCAweDFEMDAsCisgICAgMHgxRDAyLCAweDFEMEUsIDB4MUQxMSwgMHgxRDEzLCAweDFEMUQsIDB4MUQxRiwKKyAgICAweDFEMjAsIDB4MUQyMiwgMHgxRDJFLCAweDFEMzEsIDB4MUQzMywgMHgxRDNELAorICAgIDB4MUQzRiwgMHgxREQxLCAweDFERDMsIDB4MURERCwgMHgxRERGLCAweDFERTAsCisgICAgMHgxREUyLCAweDFERUUsIDB4MURGMSwgMHgxREYzLCAweDFERkQsIDB4MURGRiwKKyAgICAweDFFMDEsIDB4MUUwMywgMHgxRTBELCAweDFFMEYsIDB4MUUxMCwgMHgxRTEyLAorICAgIDB4MUUxRSwgMHgxRTIxLCAweDFFMjMsIDB4MUUyRCwgMHgxRTJGLCAweDFFMzAsCisgICAgMHgxRTMyLCAweDFFM0UsIDB4MUVEMCwgMHgxRUQyLCAweDFFREUsIDB4MUVFMSwKKyAgICAweDFFRTMsIDB4MUVFRCwgMHgxRUVGLCAweDFFRjAsIDB4MUVGMiwgMHgxRUZFLAorICAgIDB4MUYwMCwgMHgxRjAyLCAweDFGMEUsIDB4MUYxMSwgMHgxRjEzLCAweDFGMUQsCisgICAgMHgxRjFGLCAweDFGMjAsIDB4MUYyMiwgMHgxRjJFLCAweDFGMzEsIDB4MUYzMywKKyAgICAweDFGM0QsIDB4MUYzRiwgMHgxRkQxLCAweDFGRDMsIDB4MUZERCwgMHgxRkRGLAorICAgIDB4MUZFMCwgMHgxRkUyLCAweDFGRUUsIDB4MUZGMSwgMHgxRkYzLCAweDFGRkQsCisgICAgMHgxRkZGLCAweDIwMDAsIDB4MjAwMiwgMHgyMDBFLCAweDIwMTEsIDB4MjAxMywKKyAgICAweDIwMUQsIDB4MjAxRiwgMHgyMDIwLCAweDIwMjIsIDB4MjAyRSwgMHgyMDMxLAorICAgIDB4MjAzMywgMHgyMDNELCAweDIwM0YsIDB4MjBEMSwgMHgyMEQzLCAweDIwREQsCisgICAgMHgyMERGLCAweDIwRTAsIDB4MjBFMiwgMHgyMEVFLCAweDIwRjEsIDB4MjBGMywKKyAgICAweDIwRkQsIDB4MjBGRiwgMHgyMTAxLCAweDIxMDMsIDB4MjEwRCwgMHgyMTBGLAorICAgIDB4MjExMCwgMHgyMTEyLCAweDIxMUUsIDB4MjEyMSwgMHgyMTIzLCAweDIxMkQsCisgICAgMHgyMTJGLCAweDIxMzAsIDB4MjEzMiwgMHgyMTNFLCAweDIxRDAsIDB4MjFEMiwKKyAgICAweDIxREUsIDB4MjFFMSwgMHgyMUUzLCAweDIxRUQsIDB4MjFFRiwgMHgyMUYwLAorICAgIDB4MjFGMiwgMHgyMUZFLCAweDIyMDAsIDB4MjIwMiwgMHgyMjBFLCAweDIyMTEsCisgICAgMHgyMjEzLCAweDIyMUQsIDB4MjIxRiwgMHgyMjIwLCAweDIyMjIsIDB4MjIyRSwKKyAgICAweDIyMzEsIDB4MjIzMywgMHgyMjNELCAweDIyM0YsIDB4MjJEMSwgMHgyMkQzLAorICAgIDB4MjJERCwgMHgyMkRGLCAweDIyRTAsIDB4MjJFMiwgMHgyMkVFLCAweDIyRjEsCisgICAgMHgyMkYzLCAweDIyRkQsIDB4MjJGRiwgMHgyMzAxLCAweDIzMDMsIDB4MjMwRCwKKyAgICAweDIzMEYsIDB4MjMxMCwgMHgyMzEyLCAweDIzMUUsIDB4MjMyMSwgMHgyMzIzLAorICAgIDB4MjMyRCwgMHgyMzJGLCAweDIzMzAsIDB4MjMzMiwgMHgyMzNFLCAweDIzRDAsCisgICAgMHgyM0QyLCAweDIzREUsIDB4MjNFMSwgMHgyM0UzLCAweDIzRUQsIDB4MjNFRiwKKyAgICAweDIzRjAsIDB4MjNGMiwgMHgyM0ZFLCAweDJEMDEsIDB4MkQwMywgMHgyRDBELAorICAgIDB4MkQwRiwgMHgyRDEwLCAweDJEMTIsIDB4MkQxRSwgMHgyRDIxLCAweDJEMjMsCisgICAgMHgyRDJELCAweDJEMkYsIDB4MkQzMCwgMHgyRDMyLCAweDJEM0UsIDB4MkREMCwKKyAgICAweDJERDIsIDB4MkRERSwgMHgyREUxLCAweDJERTMsIDB4MkRFRCwgMHgyREVGLAorICAgIDB4MkRGMCwgMHgyREYyLCAweDJERkUsIDB4MkUwMCwgMHgyRTAyLCAweDJFMEUsCisgICAgMHgyRTExLCAweDJFMTMsIDB4MkUxRCwgMHgyRTFGLCAweDJFMjAsIDB4MkUyMiwKKyAgICAweDJFMkUsIDB4MkUzMSwgMHgyRTMzLCAweDJFM0QsIDB4MkUzRiwgMHgyRUQxLAorICAgIDB4MkVEMywgMHgyRURELCAweDJFREYsIDB4MkVFMCwgMHgyRUUyLCAweDJFRUUsCisgICAgMHgyRUYxLCAweDJFRjMsIDB4MkVGRCwgMHgyRUZGLCAweDJGMDEsIDB4MkYwMywKKyAgICAweDJGMEQsIDB4MkYwRiwgMHgyRjEwLCAweDJGMTIsIDB4MkYxRSwgMHgyRjIxLAorICAgIDB4MkYyMywgMHgyRjJELCAweDJGMkYsIDB4MkYzMCwgMHgyRjMyLCAweDJGM0UsCisgICAgMHgyRkQwLCAweDJGRDIsIDB4MkZERSwgMHgyRkUxLCAweDJGRTMsIDB4MkZFRCwKKyAgICAweDJGRUYsIDB4MkZGMCwgMHgyRkYyLCAweDJGRkUsIDB4MzAwMSwgMHgzMDAzLAorICAgIDB4MzAwRCwgMHgzMDBGLCAweDMwMTAsIDB4MzAxMiwgMHgzMDFFLCAweDMwMjEsCisgICAgMHgzMDIzLCAweDMwMkQsIDB4MzAyRiwgMHgzMDMwLCAweDMwMzIsIDB4MzAzRSwKKyAgICAweDMwRDAsIDB4MzBEMiwgMHgzMERFLCAweDMwRTEsIDB4MzBFMywgMHgzMEVELAorICAgIDB4MzBFRiwgMHgzMEYwLCAweDMwRjIsIDB4MzBGRSwgMHgzMTAwLCAweDMxMDIsCisgICAgMHgzMTBFLCAweDMxMTEsIDB4MzExMywgMHgzMTFELCAweDMxMUYsIDB4MzEyMCwKKyAgICAweDMxMjIsIDB4MzEyRSwgMHgzMTMxLCAweDMxMzMsIDB4MzEzRCwgMHgzMTNGLAorICAgIDB4MzFEMSwgMHgzMUQzLCAweDMxREQsIDB4MzFERiwgMHgzMUUwLCAweDMxRTIsCisgICAgMHgzMUVFLCAweDMxRjEsIDB4MzFGMywgMHgzMUZELCAweDMxRkYsIDB4MzIwMSwKKyAgICAweDMyMDMsIDB4MzIwRCwgMHgzMjBGLCAweDMyMTAsIDB4MzIxMiwgMHgzMjFFLAorICAgIDB4MzIyMSwgMHgzMjIzLCAweDMyMkQsIDB4MzIyRiwgMHgzMjMwLCAweDMyMzIsCisgICAgMHgzMjNFLCAweDMyRDAsIDB4MzJEMiwgMHgzMkRFLCAweDMyRTEsIDB4MzJFMywKKyAgICAweDMyRUQsIDB4MzJFRiwgMHgzMkYwLCAweDMyRjIsIDB4MzJGRSwgMHgzMzAwLAorICAgIDB4MzMwMiwgMHgzMzBFLCAweDMzMTEsIDB4MzMxMywgMHgzMzFELCAweDMzMUYsCisgICAgMHgzMzIwLCAweDMzMjIsIDB4MzMyRSwgMHgzMzMxLCAweDMzMzMsIDB4MzMzRCwKKyAgICAweDMzM0YsIDB4MzNEMSwgMHgzM0QzLCAweDMzREQsIDB4MzNERiwgMHgzM0UwLAorICAgIDB4MzNFMiwgMHgzM0VFLCAweDMzRjEsIDB4MzNGMywgMHgzM0ZELCAweDMzRkYsCisgICAgMHgzRDAwLCAweDNEMDIsIDB4M0QwRSwgMHgzRDExLCAweDNEMTMsIDB4M0QxRCwKKyAgICAweDNEMUYsIDB4M0QyMCwgMHgzRDIyLCAweDNEMkUsIDB4M0QzMSwgMHgzRDMzLAorICAgIDB4M0QzRCwgMHgzRDNGLCAweDNERDEsIDB4M0REMywgMHgzRERELCAweDNEREYsCisgICAgMHgzREUwLCAweDNERTIsIDB4M0RFRSwgMHgzREYxLCAweDNERjMsIDB4M0RGRCwKKyAgICAweDNERkYsIDB4M0UwMSwgMHgzRTAzLCAweDNFMEQsIDB4M0UwRiwgMHgzRTEwLAorICAgIDB4M0UxMiwgMHgzRTFFLCAweDNFMjEsIDB4M0UyMywgMHgzRTJELCAweDNFMkYsCisgICAgMHgzRTMwLCAweDNFMzIsIDB4M0UzRSwgMHgzRUQwLCAweDNFRDIsIDB4M0VERSwKKyAgICAweDNFRTEsIDB4M0VFMywgMHgzRUVELCAweDNFRUYsIDB4M0VGMCwgMHgzRUYyLAorICAgIDB4M0VGRSwgMHgzRjAwLCAweDNGMDIsIDB4M0YwRSwgMHgzRjExLCAweDNGMTMsCisgICAgMHgzRjFELCAweDNGMUYsIDB4M0YyMCwgMHgzRjIyLCAweDNGMkUsIDB4M0YzMSwKKyAgICAweDNGMzMsIDB4M0YzRCwgMHgzRjNGLCAweDNGRDEsIDB4M0ZEMywgMHgzRkRELAorICAgIDB4M0ZERiwgMHgzRkUwLCAweDNGRTIsIDB4M0ZFRSwgMHgzRkYxLCAweDNGRjMsCisgICAgMHgzRkZELCAweDNGRkYsIDB4RDAwMSwgMHhEMDAzLCAweEQwMEQsIDB4RDAwRiwKKyAgICAweEQwMTAsIDB4RDAxMiwgMHhEMDFFLCAweEQwMjEsIDB4RDAyMywgMHhEMDJELAorICAgIDB4RDAyRiwgMHhEMDMwLCAweEQwMzIsIDB4RDAzRSwgMHhEMEQwLCAweEQwRDIsCisgICAgMHhEMERFLCAweEQwRTEsIDB4RDBFMywgMHhEMEVELCAweEQwRUYsIDB4RDBGMCwKKyAgICAweEQwRjIsIDB4RDBGRSwgMHhEMTAwLCAweEQxMDIsIDB4RDEwRSwgMHhEMTExLAorICAgIDB4RDExMywgMHhEMTFELCAweEQxMUYsIDB4RDEyMCwgMHhEMTIyLCAweEQxMkUsCisgICAgMHhEMTMxLCAweEQxMzMsIDB4RDEzRCwgMHhEMTNGLCAweEQxRDEsIDB4RDFEMywKKyAgICAweEQxREQsIDB4RDFERiwgMHhEMUUwLCAweEQxRTIsIDB4RDFFRSwgMHhEMUYxLAorICAgIDB4RDFGMywgMHhEMUZELCAweEQxRkYsIDB4RDIwMSwgMHhEMjAzLCAweEQyMEQsCisgICAgMHhEMjBGLCAweEQyMTAsIDB4RDIxMiwgMHhEMjFFLCAweEQyMjEsIDB4RDIyMywKKyAgICAweEQyMkQsIDB4RDIyRiwgMHhEMjMwLCAweEQyMzIsIDB4RDIzRSwgMHhEMkQwLAorICAgIDB4RDJEMiwgMHhEMkRFLCAweEQyRTEsIDB4RDJFMywgMHhEMkVELCAweEQyRUYsCisgICAgMHhEMkYwLCAweEQyRjIsIDB4RDJGRSwgMHhEMzAwLCAweEQzMDIsIDB4RDMwRSwKKyAgICAweEQzMTEsIDB4RDMxMywgMHhEMzFELCAweEQzMUYsIDB4RDMyMCwgMHhEMzIyLAorICAgIDB4RDMyRSwgMHhEMzMxLCAweEQzMzMsIDB4RDMzRCwgMHhEMzNGLCAweEQzRDEsCisgICAgMHhEM0QzLCAweEQzREQsIDB4RDNERiwgMHhEM0UwLCAweEQzRTIsIDB4RDNFRSwKKyAgICAweEQzRjEsIDB4RDNGMywgMHhEM0ZELCAweEQzRkYsIDB4REQwMCwgMHhERDAyLAorICAgIDB4REQwRSwgMHhERDExLCAweEREMTMsIDB4REQxRCwgMHhERDFGLCAweEREMjAsCisgICAgMHhERDIyLCAweEREMkUsIDB4REQzMSwgMHhERDMzLCAweEREM0QsIDB4REQzRiwKKyAgICAweERERDEsIDB4REREMywgMHhERERELCAweEREREYsIDB4RERFMCwgMHhEREUyLAorICAgIDB4RERFRSwgMHhEREYxLCAweERERjMsIDB4RERGRCwgMHhEREZGLCAweERFMDEsCisgICAgMHhERTAzLCAweERFMEQsIDB4REUwRiwgMHhERTEwLCAweERFMTIsIDB4REUxRSwKKyAgICAweERFMjEsIDB4REUyMywgMHhERTJELCAweERFMkYsIDB4REUzMCwgMHhERTMyLAorICAgIDB4REUzRSwgMHhERUQwLCAweERFRDIsIDB4REVERSwgMHhERUUxLCAweERFRTMsCisgICAgMHhERUVELCAweERFRUYsIDB4REVGMCwgMHhERUYyLCAweERFRkUsIDB4REYwMCwKKyAgICAweERGMDIsIDB4REYwRSwgMHhERjExLCAweERGMTMsIDB4REYxRCwgMHhERjFGLAorICAgIDB4REYyMCwgMHhERjIyLCAweERGMkUsIDB4REYzMSwgMHhERjMzLCAweERGM0QsCisgICAgMHhERjNGLCAweERGRDEsIDB4REZEMywgMHhERkRELCAweERGREYsIDB4REZFMCwKKyAgICAweERGRTIsIDB4REZFRSwgMHhERkYxLCAweERGRjMsIDB4REZGRCwgMHhERkZGLAorICAgIDB4RTAwMCwgMHhFMDAyLCAweEUwMEUsIDB4RTAxMSwgMHhFMDEzLCAweEUwMUQsCisgICAgMHhFMDFGLCAweEUwMjAsIDB4RTAyMiwgMHhFMDJFLCAweEUwMzEsIDB4RTAzMywKKyAgICAweEUwM0QsIDB4RTAzRiwgMHhFMEQxLCAweEUwRDMsIDB4RTBERCwgMHhFMERGLAorICAgIDB4RTBFMCwgMHhFMEUyLCAweEUwRUUsIDB4RTBGMSwgMHhFMEYzLCAweEUwRkQsCisgICAgMHhFMEZGLCAweEUxMDEsIDB4RTEwMywgMHhFMTBELCAweEUxMEYsIDB4RTExMCwKKyAgICAweEUxMTIsIDB4RTExRSwgMHhFMTIxLCAweEUxMjMsIDB4RTEyRCwgMHhFMTJGLAorICAgIDB4RTEzMCwgMHhFMTMyLCAweEUxM0UsIDB4RTFEMCwgMHhFMUQyLCAweEUxREUsCisgICAgMHhFMUUxLCAweEUxRTMsIDB4RTFFRCwgMHhFMUVGLCAweEUxRjAsIDB4RTFGMiwKKyAgICAweEUxRkUsIDB4RTIwMCwgMHhFMjAyLCAweEUyMEUsIDB4RTIxMSwgMHhFMjEzLAorICAgIDB4RTIxRCwgMHhFMjFGLCAweEUyMjAsIDB4RTIyMiwgMHhFMjJFLCAweEUyMzEsCisgICAgMHhFMjMzLCAweEUyM0QsIDB4RTIzRiwgMHhFMkQxLCAweEUyRDMsIDB4RTJERCwKKyAgICAweEUyREYsIDB4RTJFMCwgMHhFMkUyLCAweEUyRUUsIDB4RTJGMSwgMHhFMkYzLAorICAgIDB4RTJGRCwgMHhFMkZGLCAweEUzMDEsIDB4RTMwMywgMHhFMzBELCAweEUzMEYsCisgICAgMHhFMzEwLCAweEUzMTIsIDB4RTMxRSwgMHhFMzIxLCAweEUzMjMsIDB4RTMyRCwKKyAgICAweEUzMkYsIDB4RTMzMCwgMHhFMzMyLCAweEUzM0UsIDB4RTNEMCwgMHhFM0QyLAorICAgIDB4RTNERSwgMHhFM0UxLCAweEUzRTMsIDB4RTNFRCwgMHhFM0VGLCAweEUzRjAsCisgICAgMHhFM0YyLCAweEUzRkUsIDB4RUQwMSwgMHhFRDAzLCAweEVEMEQsIDB4RUQwRiwKKyAgICAweEVEMTAsIDB4RUQxMiwgMHhFRDFFLCAweEVEMjEsIDB4RUQyMywgMHhFRDJELAorICAgIDB4RUQyRiwgMHhFRDMwLCAweEVEMzIsIDB4RUQzRSwgMHhFREQwLCAweEVERDIsCisgICAgMHhFRERFLCAweEVERTEsIDB4RURFMywgMHhFREVELCAweEVERUYsIDB4RURGMCwKKyAgICAweEVERjIsIDB4RURGRSwgMHhFRTAwLCAweEVFMDIsIDB4RUUwRSwgMHhFRTExLAorICAgIDB4RUUxMywgMHhFRTFELCAweEVFMUYsIDB4RUUyMCwgMHhFRTIyLCAweEVFMkUsCisgICAgMHhFRTMxLCAweEVFMzMsIDB4RUUzRCwgMHhFRTNGLCAweEVFRDEsIDB4RUVEMywKKyAgICAweEVFREQsIDB4RUVERiwgMHhFRUUwLCAweEVFRTIsIDB4RUVFRSwgMHhFRUYxLAorICAgIDB4RUVGMywgMHhFRUZELCAweEVFRkYsIDB4RUYwMSwgMHhFRjAzLCAweEVGMEQsCisgICAgMHhFRjBGLCAweEVGMTAsIDB4RUYxMiwgMHhFRjFFLCAweEVGMjEsIDB4RUYyMywKKyAgICAweEVGMkQsIDB4RUYyRiwgMHhFRjMwLCAweEVGMzIsIDB4RUYzRSwgMHhFRkQwLAorICAgIDB4RUZEMiwgMHhFRkRFLCAweEVGRTEsIDB4RUZFMywgMHhFRkVELCAweEVGRUYsCisgICAgMHhFRkYwLCAweEVGRjIsIDB4RUZGRSwgMHhGMDAxLCAweEYwMDMsIDB4RjAwRCwKKyAgICAweEYwMEYsIDB4RjAxMCwgMHhGMDEyLCAweEYwMUUsIDB4RjAyMSwgMHhGMDIzLAorICAgIDB4RjAyRCwgMHhGMDJGLCAweEYwMzAsIDB4RjAzMiwgMHhGMDNFLCAweEYwRDAsCisgICAgMHhGMEQyLCAweEYwREUsIDB4RjBFMSwgMHhGMEUzLCAweEYwRUQsIDB4RjBFRiwKKyAgICAweEYwRjAsIDB4RjBGMiwgMHhGMEZFLCAweEYxMDAsIDB4RjEwMiwgMHhGMTBFLAorICAgIDB4RjExMSwgMHhGMTEzLCAweEYxMUQsIDB4RjExRiwgMHhGMTIwLCAweEYxMjIsCisgICAgMHhGMTJFLCAweEYxMzEsIDB4RjEzMywgMHhGMTNELCAweEYxM0YsIDB4RjFEMSwKKyAgICAweEYxRDMsIDB4RjFERCwgMHhGMURGLCAweEYxRTAsIDB4RjFFMiwgMHhGMUVFLAorICAgIDB4RjFGMSwgMHhGMUYzLCAweEYxRkQsIDB4RjFGRiwgMHhGMjAxLCAweEYyMDMsCisgICAgMHhGMjBELCAweEYyMEYsIDB4RjIxMCwgMHhGMjEyLCAweEYyMUUsIDB4RjIyMSwKKyAgICAweEYyMjMsIDB4RjIyRCwgMHhGMjJGLCAweEYyMzAsIDB4RjIzMiwgMHhGMjNFLAorICAgIDB4RjJEMCwgMHhGMkQyLCAweEYyREUsIDB4RjJFMSwgMHhGMkUzLCAweEYyRUQsCisgICAgMHhGMkVGLCAweEYyRjAsIDB4RjJGMiwgMHhGMkZFLCAweEYzMDAsIDB4RjMwMiwKKyAgICAweEYzMEUsIDB4RjMxMSwgMHhGMzEzLCAweEYzMUQsIDB4RjMxRiwgMHhGMzIwLAorICAgIDB4RjMyMiwgMHhGMzJFLCAweEYzMzEsIDB4RjMzMywgMHhGMzNELCAweEYzM0YsCisgICAgMHhGM0QxLCAweEYzRDMsIDB4RjNERCwgMHhGM0RGLCAweEYzRTAsIDB4RjNFMiwKKyAgICAweEYzRUUsIDB4RjNGMSwgMHhGM0YzLCAweEYzRkQsIDB4RjNGRiwgMHhGRDAwLAorICAgIDB4RkQwMiwgMHhGRDBFLCAweEZEMTEsIDB4RkQxMywgMHhGRDFELCAweEZEMUYsCisgICAgMHhGRDIwLCAweEZEMjIsIDB4RkQyRSwgMHhGRDMxLCAweEZEMzMsIDB4RkQzRCwKKyAgICAweEZEM0YsIDB4RkREMSwgMHhGREQzLCAweEZEREQsIDB4RkRERiwgMHhGREUwLAorICAgIDB4RkRFMiwgMHhGREVFLCAweEZERjEsIDB4RkRGMywgMHhGREZELCAweEZERkYsCisgICAgMHhGRTAxLCAweEZFMDMsIDB4RkUwRCwgMHhGRTBGLCAweEZFMTAsIDB4RkUxMiwKKyAgICAweEZFMUUsIDB4RkUyMSwgMHhGRTIzLCAweEZFMkQsIDB4RkUyRiwgMHhGRTMwLAorICAgIDB4RkUzMiwgMHhGRTNFLCAweEZFRDAsIDB4RkVEMiwgMHhGRURFLCAweEZFRTEsCisgICAgMHhGRUUzLCAweEZFRUQsIDB4RkVFRiwgMHhGRUYwLCAweEZFRjIsIDB4RkVGRSwKKyAgICAweEZGMDAsIDB4RkYwMiwgMHhGRjBFLCAweEZGMTEsIDB4RkYxMywgMHhGRjFELAorICAgIDB4RkYxRiwgMHhGRjIwLCAweEZGMjIsIDB4RkYyRSwgMHhGRjMxLCAweEZGMzMsCisgICAgMHhGRjNELCAweEZGM0YsIDB4RkZEMSwgMHhGRkQzLCAweEZGREQsIDB4RkZERiwKKyAgICAweEZGRTAsIDB4RkZFMiwgMHhGRkVFLCAweEZGRjEsIDB4RkZGMywgMHhGRkZELAorICAgIDB4RkZGRiwKK307CisKKyNkZWZpbmUgT04yQVZDX0NCNl9DT0RFUyAxMjAxCitzdGF0aWMgY29uc3QgdWludDMyX3Qgb24yYXZjX2NiNl9jb2Rlc1tPTjJBVkNfQ0I2X0NPREVTXSA9IHsKKyAgICAweDAwMTgsIDB4MDA4OCwgMHgwMDgyLCAweDAwMjQsIDB4MDVCNCwgMHgwOERGLAorICAgIDB4MDA0NCwgMHgwMTk3LCAweDAxREUsIDB4MDIxRiwgMHgwRDc3LCAweDBBNzIsCisgICAgMHg3RTc3LCAweDBCOEIsIDB4MDNGMSwgMHgwNDMzLCAweDA3M0YsIDB4MUU1QywKKyAgICAweDAxNkEsIDB4MDFDNSwgMHgwMEQyLCAweDAwNjIsIDB4MENFNCwgMHgwMDk2LAorICAgIDB4MDAyMCwgMHgwMDUyLCAweDAwQjcsIDB4MDEyNywgMHgwMDNBLCAweDAwNDEsCisgICAgMHgwMENDLCAweDAxQjYsIDB4MDEyNCwgMHgwN0QzLCAweDAxQUUsIDB4MDFDNCwKKyAgICAweDAwREEsIDB4MDNEOCwgMHgwM0YzLCAweDE2MzgsIDB4MDNGMiwgMHgxMkZDLAorICAgIDB4MDFFMiwgMHgwREJDLCAweDAyNkMsIDB4MDA4QSwgMHgwMDU0LCAweDAxQTYsCisgICAgMHgwMTk1LCAweDAxNjQsIDB4MDFFMiwgMHgwMjZELCAweDAwNTEsIDB4MDQ5RiwKKyAgICAweDAxQjMsIDB4MDFFMCwgMHgwMUI0LCAweDAyNkUsIDB4MDdERSwgMHgwMTI5LAorICAgIDB4MDI5MiwgMHgwREJELCAweDAxM0UsIDB4MDBGMywgMHgwNUI1LCAweDA5QTYsCisgICAgMHgwMUZCLCAweDAyQ0YsIDB4MDFGRiwgMHgwMzdDLCAweDAwNEEsIDB4MDY3RSwKKyAgICAweDAxNkIsIDB4MDAyQSwgMHgwOUE3LCAweDEwRUUsIDB4MTYzOSwgMHgwMTM1LAorICAgIDB4MENDQSwgMHgwMTZBLCAweDAxMUIsIDB4MDNFRSwgMHgwN0EyLCAweDBEN0UsCisgICAgMHgwMjhGLCAweDBGRTIsIDB4MDdEQSwgMHgwMzU3LCAweDkyRjYsIDB4MEYzMSwKKyAgICAweDAyMTcsIDB4MDM2QSwgMHgwQ0U1LCAweDA3QTEsIDB4MDIyOSwgMHgwM0Q5LAorICAgIDB4MDM3NywgMHgwMEI3LCAweDAxQTYsIDB4MDY1NSwgMHgwMTJFLCAweDAwMkIsCisgICAgMHgwMDJFLCAweDAwRjIsIDB4MDZGMiwgMHgwMkQwLCAweDBGOTgsIDB4MDdBMCwKKyAgICAweDAwOUMsIDB4MDMzMiwgMHgwMDE0LCAweDAxQkQsIDB4MDE3RSwgMHgwMzMxLAorICAgIDB4MDM3MSwgMHgwMjVCLCAweDA0OTgsIDB4MTYxRiwgMHgwMzlFLCAweDA2NTQsCisgICAgMHgwMEMyLCAweDA2QkEsIDB4MDE0MCwgMHgwMjFFLCAweDAyRjgsIDB4MDFCNCwKKyAgICAweDAxMzQsIDB4MDNGRiwgMHgwMDY2LCAweDA0NzcsIDB4MDFERiwgMHgwMUZFLAorICAgIDB4MEExNCwgMHgwMjlFLCAweDAzNTYsIDB4MDM4RiwgMHgwMzVBLCAweDNDQjMsCisgICAgMHgwMUIyLCAweDAxNkEsIDB4MDExQSwgMHgwMEI2LCAweDAyREUsIDB4MDFERCwKKyAgICAweDAxN0MsIDB4MDM3NiwgMHgwMDJGLCAweDAwMzksIDB4MDNENywgMHgwMUJFLAorICAgIDB4MDA1NiwgMHgwMDUwLCAweDAxN0MsIDB4MDFDQywgMHgwMDM0LCAweDBCM0UsCisgICAgMHgwNDk5LCAweDAwMTQsIDB4MDhERSwgMHgwMzdCLCAweDAzRUIsIDB4MDhCRiwKKyAgICAweDE4NkUsIDB4MDUwRiwgMHgwMDMwLCAweDAxNjksIDB4MDdGMiwgMHgwMEY2LAorICAgIDB4MDA0MiwgMHgwMTk4LCAweDAwQkMsIDB4MDAyRSwgMHgwMjNBLCAweDAxRTMsCisgICAgMHgwMDM2LCAweDAwNEMsIDB4MDEyRSwgMHgwMUExLCAweDAwN0QsIDB4MDBDMywKKyAgICAweDAzOTIsIDB4MDA2MywgMHgwRjMzLCAweDAxNkMsIDB4MDFBNywgMHgwRTc3LAorICAgIDB4MDFERiwgMHgwMTc3LCAweDAwMzIsIDB4MDNGRSwgMHgwMzIyLCAweDAxQUMsCisgICAgMHgwMDMwLCAweDAxN0UsIDB4MDExRSwgMHgwMDIyLCAweDAxRkIsIDB4MDEyQSwKKyAgICAweDAwMkIsIDB4MDA2OCwgMHgwMEQ0LCAweDAwNkUsIDB4MDAxNSwgMHgwMDFDLAorICAgIDB4MDBFNSwgMHgwMUE5LCAweDA0MzYsIDB4MDUzRiwgMHgwNUFFLCAweDAwQjIsCisgICAgMHgwNzJBLCAweDAyRUEsIDB4MDA4RSwgMHgwMTc1LCAweDAyQkUsIDB4MDE4RSwKKyAgICAweDAwMDIsIDB4MDA1RSwgMHgwMUQ2LCAweDAwNTUsIDB4MDA2QSwgMHgwN0YzLAorICAgIDB4MDJGOSwgMHgwMUQ0LCAweDAxNkUsIDB4MDNBQiwgMHgwMEZGLCAweDAwM0MsCisgICAgMHgwMTkyLCAweDAxRDYsIDB4MDI1NiwgMHgwMTM3LCAweDAxNDgsIDB4MDIyQSwKKyAgICAweDAzOUMsIDB4MDE2RCwgMHgwMTE2LCAweDAzOEEsIDB4MDMzRSwgMHgwMTU2LAorICAgIDB4MDNDRiwgMHgwMDRCLCAweDAwRTYsIDB4MDE4RiwgMHgxRTVELCAweDAzREEsCisgICAgMHgwMjkyLCAweDAxMDgsIDB4MDZGNSwgMHgwM0RCLCAweDAwOTIsIDB4MDE3OCwKKyAgICAweDAxNEEsIDB4MDNGRiwgMHgwM0VFLCAweDBBNzksIDB4MEExNiwgMHgwMEY3LAorICAgIDB4MDFCNSwgMHgwQTE1LCAweDBEN0YsIDB4MDJGQSwgMHgwMUU0LCAweDAxNTcsCisgICAgMHgwMUUyLCAweDAxODUsIDB4MDU3RSwgMHgwN0RCLCAweDAwOTgsIDB4MERCRSwKKyAgICAweDAxOUEsIDB4MDVGRSwgMHgwMDNCLCAweDAzRjUsIDB4MDFCRiwgMHgwMUU0LAorICAgIDB4MDExRSwgMHgwMDFCLCAweDAzQUEsIDB4MDMzNywgMHgxRjlDLCAweDA5NDIsCisgICAgMHgwNUFCLCAweDA0MzAsIDB4MjRCRiwgMHgxNjNBLCAweDAzN0UsIDB4MDE0RSwKKyAgICAweDAwRjQsIDB4MDIxNywgMHgwMDU5LCAweDBGMzIsIDB4MDNGNCwgMHgwMUYyLAorICAgIDB4MDAzMSwgMHgwMTM2LCAweDA1QzYsIDB4MDA3NiwgMHgwMDA2LCAweDAyRkUsCisgICAgMHgwM0ZCLCAweDAwOUQsIDB4MDEzRiwgMHgwMDJFLCAweDAyRTYsIDB4MDBBRCwKKyAgICAweDAyMzQsIDB4MDIxRSwgMHgwMjUzLCAweDAxMkEsIDB4MDM0NiwgMHgwMjlBLAorICAgIDB4MDEyQiwgMHgwMjFDLCAweDAyREEsIDB4MDAwNCwgMHgwMTNDLCAweDAwRjUsCisgICAgMHgwMDRFLCAweDAxN0QsIDB4MDFGOCwgMHgwMDA2LCAweDAxRkEsIDB4MDFGOSwKKyAgICAweDAwN0EsIDB4MDA2NywgMHgwMzNCLCAweDAzM0EsIDB4MDU4NiwgMHgwNUM3LAorICAgIDB4MDVGRiwgMHgwMEM4LCAweDAxNEIsIDB4MDI0RiwgMHgwMkM1LCAweDAwRTcsCisgICAgMHgwMTRDLCAweDAzNUMsIDB4MDBBMiwgMHgwMDZBLCAweDAxRjMsIDB4MDA3MSwKKyAgICAweDAwNUUsIDB4MDA4NCwgMHgwNjNBLCAweDAzRUYsIDB4MDA2NCwgMHgwMkZFLAorICAgIDB4MDI1NSwgMHgwMDNBLCAweDA2MUEsIDB4MDMzMywgMHgwMzdGLCAweDAwRkUsCisgICAgMHgxMTVCLCAweDBGOUEsIDB4MDBBNiwgMHgwMjdELCAweDBCNUYsIDB4MDEzRiwKKyAgICAweDAyOUUsIDB4MDI5MywgMHgwN0I2LCAweDAwMEYsIDB4MDE5NiwgMHgwMkZCLAorICAgIDB4MDMzRiwgMHgwMUZFLCAweDAxOUUsIDB4MDFCMywgMHgwMzdGLCAweDAwQzQsCisgICAgMHgwMERFLCAweDAyRDIsIDB4MDA3QSwgMHgwM0NBLCAweDAxRTMsIDB4MDJGNywKKyAgICAweDAwQUUsIDB4MDVBRiwgMHgwMkZGLCAweDAyNkYsIDB4MDBDQSwgMHgwMzU2LAorICAgIDB4MDJDNywgMHgwMkQxLCAweDAyNTYsIDB4MDA2QiwgMHgwMTQxLCAweDAxMkMsCisgICAgMHgwM0JFLCAweDAwMjYsIDB4MDBGMCwgMHgwM0EzLCAweDAyRDYsIDB4MDA1RiwKKyAgICAweDAwRkYsIDB4MDNGMiwgMHgwMEFFLCAweDAyNTcsIDB4MDFGRSwgMHgwMzVFLAorICAgIDB4MDFCNiwgMHgwMEVFLCAweDA2NTgsIDB4MDA4RiwgMHgwMjMyLCAweDA2NTcsCisgICAgMHgxMkZELCAweDAwQUYsIDB4MDBFNiwgMHgwNDI2LCAweDA2NjYsIDB4MDA5RSwKKyAgICAweDA0NjcsIDB4MDAzRiwgMHgwMTRBLCAweDAyRDMsIDB4MTJGRSwgMHgwOTlBLAorICAgIDB4MDNCRiwgMHgwMERELCAweDA0REYsIDB4MDA5RiwgMHgwMEI4LCAweDA4NjMsCisgICAgMHgwNkY3LCAweDAxQjgsIDB4MDM0NiwgMHgwMTc5LCAweDBGRTMsIDB4MDY2NywKKyAgICAweDA2NTksIDB4MDFDRSwgMHgwMEIzLCAweDAzNzIsIDB4MDY1QSwgMHgwMjVFLAorICAgIDB4MDFBQSwgMHgwMjc2LCAweDAyN0UsIDB4MDJEQiwgMHgwQ0U2LCAweDExNUEsCisgICAgMHgwMkU3LCAweDAxMzksIDB4MDNEQSwgMHgwMUZBLCAweDAyMUMsIDB4MDk0MywKKyAgICAweDA4NjIsIDB4MDExRiwgMHgwOEI2LCAweDA3RTYsIDB4MDI5RiwgMHgwMEU1LAorICAgIDB4MDY1NiwgMHgwNDlBLCAweDAwMEUsIDB4MEY5OSwgMHgwNkY2LCAweDAwREMsCisgICAgMHgwMEVDLCAweDAxNEIsIDB4MDIzMCwgMHgwNEEyLCAweDAwMTYsIDB4MDJFQiwKKyAgICAweDAzQUUsIDB4MDJERiwgMHgwMUFBLCAweDAzM0UsIDB4MDE5NiwgMHgwOTJFLAorICAgIDB4MDZGMywgMHgwMEU3LCAweDBCNUUsIDB4MDNGMiwgMHgwMDg2LCAweDAzNDcsCisgICAgMHgwMjJBLCAweDBBMTcsIDB4MDFFRiwgMHgwNjdGLCAweDAwNEEsIDB4MDM3RSwKKyAgICAweDAyRUUsIDB4MDE1RSwgMHgwNjk2LCAweDAwNkEsIDB4MDFDRCwgMHgwMDc3LAorICAgIDB4MDczRiwgMHgwMDE2LCAweDAxRTMsIDB4MDEyRSwgMHgwMERCLCAweDAzQkQsCisgICAgMHgwNDk2LCAweDAxQzYsIDB4MDMyMywgMHgwMDVFLCAweDAyRjYsIDB4MDI3QywKKyAgICAweDAyMzUsIDB4MDIzMSwgMHgwMERBLCAweDAxRUIsIDB4MDIzMiwgMHgwMkM2LAorICAgIDB4MDFGMiwgMHgwMTZGLCAweDAyQzYsIDB4MDM2QiwgMHgwMDUwLCAweDBBRkUsCisgICAgMHgwRjlCLCAweDAwQzYsIDB4MDE0RSwgMHgwMkJDLCAweDAxQ0EsIDB4MDI3RiwKKyAgICAweDA3QTUsIDB4MERFMSwgMHgwMUYxLCAweDAzOUUsIDB4MERFMiwgMHgxRTVFLAorICAgIDB4MDY1RSwgMHgwREUwLCAweDExNUYsIDB4MDBGNywgMHgwMkFCLCAweDExNkUsCisgICAgMHgwMTlCLCAweDA0Q0UsIDB4MDBEMywgMHgwMUM3LCAweDAyRDYsIDB4MDFGMywKKyAgICAweDAxNkYsIDB4MDE0RSwgMHgwNUI3LCAweDBGQTMsIDB4MDExOCwgMHgwMjVGLAorICAgIDB4MDE3RSwgMHgwNDM3LCAweDA0OUIsIDB4MDVBRSwgMHg0OTdBLCAweDBEMkUsCisgICAgMHgwNUI2LCAweDFFNUYsIDB4MERFMywgMHgwNTEyLCAweDAzMUEsIDB4MDFGMiwKKyAgICAweDAwN0UsIDB4MDE1QywgMHgwMzVFLCAweDA0Q0YsIDB4MDFDOCwgMHgwMTk0LAorICAgIDB4MTJGRiwgMHgxRjdGLCAweDAwRTAsIDB4MDFBMiwgMHgwMTJGLCAweDAwODcsCisgICAgMHgwMTRDLCAweDA2NDMsIDB4MEQ1RSwgMHgwMTdGLCAweDA3QTYsIDB4MDUxMywKKyAgICAweDBENUYsIDB4MDIyQiwgMHgwNjVGLCAweDAzRjYsIDB4MDIyRSwgMHgwM0Y3LAorICAgIDB4MDY0MiwgMHgwMzZFLCAweDAwRDAsIDB4MDFDQiwgMHgwMzc4LCAweDEyNUVFLAorICAgIDB4MDM1RiwgMHgwMTRGLCAweDAzNUYsIDB4MTE2RiwgMHgwQTRGLCAweDAxMDIsCisgICAgMHgwMzJBLCAweDAxNzMsIDB4MDUzNiwgMHgwM0E3LCAweDA3NUUsIDB4MUY5RiwKKyAgICAweDE2M0IsIDB4MTREQSwgMHg1MjZFLCAweDE2NUYsIDB4MEE2RSwgMHgwNTk2LAorICAgIDB4MDdBNywgMHgwNDJBLCAweDAxNzIsIDB4MTlDMiwgMHgwN0U2LCAweDA0QTMsCisgICAgMHgwMzI3LCAweDAyQTgsIDB4MDdBMywgMHgwNDZFLCAweDAxMkYsIDB4MkVGRiwKKyAgICAweDAxRDcsIDB4MDI2NiwgMHgwQkJFLCAweDA2NkUsIDB4MTg2RiwgMHgwQTczLAorICAgIDB4MTMzNiwgMHgwMkE5LCAweDAzNzMsIDB4MDE3RiwgMHgxRjlFLCAweDBCNjIsCisgICAgMHgwM0E2LCAweDBEQkYsIDB4MDM1QiwgMHgwNjNCLCAweDA1M0IsIDB4MTBFRiwKKyAgICAweDAxNkUsIDB4MDExQiwgMHgxMTVELCAweDExNUMsIDB4MDBGMiwgMHgwMTc2LAorICAgIDB4MDM5MywgMHgwMzRBLCAweDAxMDcsIDB4MTE1RSwgMHgwQjYzLCAweDAyM0YsCisgICAgMHgwMDJBLCAweDBDRTcsIDB4MEE3QSwgMHgwNkZBLCAweDA2RkIsIDB4MDJBQSwKKyAgICAweDAyQzIsIDB4MDY1QiwgMHgwN0E0LCAweDAyRDQsIDB4MDEzMCwgMHgwMTA2LAorICAgIDB4MDFGQiwgMHgwQjNGLCAweDAxQjcsIDB4MDBGNiwgMHgwMDU2LCAweDA1M0YsCisgICAgMHgwMTI2LCAweDAwNDgsIDB4MDIzMywgMHgwMTdELCAweDAwQTQsIDB4MDhCRSwKKyAgICAweDE2NUUsIDB4MTY1RCwgMHgwQTdCLCAweDA0MjcsIDB4MDc4RiwgMHgxRjdFLAorICAgIDB4MDY0MSwgMHgwMkU0LCAweDAxRTYsIDB4MDFEQSwgMHgwMEY4LCAweDA0M0EsCisgICAgMHgwMkJFLCAweDAxMUMsIDB4MDA2RiwgMHgwMzZELCAweDE5QzMsIDB4MDAyMCwKKyAgICAweDA2QUUsIDB4MDM3MiwgMHgwMjg4LCAweDAwQzAsIDB4MDc5RCwgMHgwMzZFLAorICAgIDB4MDExNywgMHgwMkZCLCAweDA1MzgsIDB4MDZGMiwgMHgxMkY5LCAweDEzMzcsCisgICAgMHgxRTU4LCAweDAyMTQsIDB4MDA1RSwgMHgwQ0UwLCAweDAxRUUsIDB4MEE2RSwKKyAgICAweDAyMTUsIDB4MDFDMiwgMHgxMkZBLCAweDAzM0EsIDB4MDA5QSwgMHgwMTc0LAorICAgIDB4MENFMiwgMHgwOUExLCAweDAwRkUsIDB4MDI1MCwgMHgwMkNBLCAweDAzNUUsCisgICAgMHgwM0EyLCAweDBEN0QsIDB4MkVGRSwgMHgwMkU4LCAweDI0QkUsIDB4MUY3QywKKyAgICAweDEwRUMsIDB4MDRBMiwgMHgwMDUyLCAweDAxMEQsIDB4MDI3NywgMHgwMDNBLAorICAgIDB4MENERSwgMHgwQTZGLCAweDAwODYsIDB4MDBFNCwgMHgxMkZCLCAweDE0REUsCisgICAgMHgwMDlFLCAweDAwNjIsIDB4MDNDQSwgMHgwM0JDLCAweDAyQ0EsIDB4MTRERiwKKyAgICAweDBGRTAsIDB4MDMwQywgMHgwM0YwLCAweDA2RjMsIDB4MDc5NiwgMHgwQjFFLAorICAgIDB4MDVCMCwgMHgxNUZFLCAweDAxM0EsIDB4MENERiwgMHgwNzlFLCAweDAxRTIsCisgICAgMHgwMTY2LCAweDAyQkQsIDB4MDE1MSwgMHgwMTUzLCAweDA2NTAsIDB4MDk0MCwKKyAgICAweDAxMEYsIDB4M0NCMiwgMHgxMEVELCAweDA1N0UsIDB4MDNENCwgMHgwMjlFLAorICAgIDB4MDM1OCwgMHgwNkY0LCAweDdFNzYsIDB4MDE3QywgMHgxNUZGLCAweDA0N0QsCisgICAgMHgxMTU4LCAweDNGM0EsIDB4MENFMywgMHgwMDVGLCAweDA0M0EsIDB4MDMyRiwKKyAgICAweDAxMEUsIDB4MUU1QSwgMHgwQTRDLCAweDAxNTIsIDB4MTI1RUYsIDB4MEI4OCwKKyAgICAweDA1N0YsIDB4MDU5RSwgMHgwNDJCLCAweDI5MzYsIDB4MDEzOCwgMHgwM0ExLAorICAgIDB4MDNDNiwgMHgwRTU2LCAweDEyRjgsIDB4MTQ5QSwgMHg1MjZGLCAweDBGMkUsCisgICAgMHgwNzlDLCAweDAyRkEsIDB4MDQ3NiwgMHgwMjY3LCAweDA2MzYsIDB4MDNBMCwKKyAgICAweDAxNEUsIDB4MDA5MiwgMHgwRDdDLCAweDA1QUYsIDB4MDEwQywgMHgwMTFDLAorICAgIDB4MEExMCwgMHgxNzdFLCAweDAxMzEsIDB4MDlBMCwgMHgwM0VBLCAweDAyQzIsCisgICAgMHgwMkQ2LCAweDBCODksIDB4MDMyRSwgMHgwMUU4LCAweDBGMzAsIDB4MDFCQSwKKyAgICAweDA1MzIsIDB4MEE2QywgMHgwRjZFLCAweDA0Q0MsIDB4MDA4RSwgMHgwMzZDLAorICAgIDB4MEU1NywgMHgwMEQ2LCAweDAxNjIsIDB4MDAyNCwgMHgwMjUyLCAweDBGNkYsCisgICAgMHgwMUFFLCAweDAxNTAsIDB4MDAzOCwgMHgwN0NFLCAweDAxQkIsIDB4MDFGNiwKKyAgICAweDAyNkEsIDB4MDM4QiwgMHgwMURCLCAweDA3Q0YsIDB4MTREQiwgMHgyNEJDLAorICAgIDB4MDI3MiwgMHgwNTNFLCAweDA3M0UsIDB4MDc4RSwgMHgwQzM2LCAweDAxNzYsCisgICAgMHgwMzJCLCAweDAxN0EsIDB4MDE5MCwgMHgwQ0NCLCAweDA0N0MsIDB4MDE3MCwKKyAgICAweDAwNTQsIDB4MDNFQywgMHgwNDlELCAweDAxOTcsIDB4MDQzQiwgMHgwNDMyLAorICAgIDB4MDE5MiwgMHgwMjZBLCAweDAxRjAsIDB4MDA3NiwgMHgwMjE2LCAweDBBMTEsCisgICAgMHgxRjdELCAweDAyQzQsIDB4MDI5OCwgMHgxMTU5LCAweDBBNEUsIDB4MDExNiwKKyAgICAweDAwRTQsIDB4MDIxNiwgMHgwMjlBLCAweDAwMEYsIDB4MDREQSwgMHgwNEQyLAorICAgIDB4MDAyQiwgMHgwMDExLCAweDA0OUUsIDB4MDQ1QSwgMHgwMUJGLCAweDAxRUYsCisgICAgMHgwM0NFLCAweDAxRjgsIDB4MDI2RSwgMHgwNDY2LCAweDAyREMsIDB4MDE2OCwKKyAgICAweDAzMEUsIDB4MDBCNCwgMHgwMUMzLCAweDAzQ0MsIDB4MDI4RCwgMHgwMUFFLAorICAgIDB4MDM4RSwgMHgwMUIwLCAweDA2NjQsIDB4MDExOSwgMHgwMUJFLCAweDAzNUIsCisgICAgMHgwMzVGLCAweDAyOEUsIDB4MEE3OCwgMHgwMURFLCAweDAzOTcsIDB4MDNGRSwKKyAgICAweDAxQjEsIDB4MDI4RSwgMHgwN0QyLCAweDA5QTIsIDB4MDMzQywgMHgwMkMxLAorICAgIDB4MEZBMCwgMHgwMzU5LCAweDAzMUUsIDB4MDBDMSwgMHgwM0Q2LCAweDBBMTIsCisgICAgMHgwMUM0LCAweDAzMzAsIDB4MDc1RiwgMHgwQjFGLCAweDAyNUEsIDB4MDI3QiwKKyAgICAweDA0REIsIDB4MDJFNSwgMHgwMUZBLCAweDAzNkYsIDB4MEExMywgMHgwMkJCLAorICAgIDB4MDBGQSwgMHgwMUQ0LCAweDAxRjgsIDB4MDE4QSwgMHgxNjFFLCAweDBFNzUsCisgICAgMHgwMjZCLCAweDA1QjMsIDB4MDFCQywgMHgwNUIyLCAweDA5QTMsIDB4MDQyNCwKKyAgICAweDA0N0UsIDB4MDFFRSwgMHgwRkUxLCAweDE2MUQsIDB4MDI0QywgMHgwMTdFLAorICAgIDB4MDI2QiwgMHgwMURDLCAweDAwQTUsIDB4MEYyRiwgMHgxNjFDLCAweDAyOEIsCisgICAgMHgwMTk2LCAweDAxNjgsIDB4MDFFRiwgMHgwMzk0LCAweDBFNzQsIDB4MDEzQywKKyAgICAweDAwQzksIDB4MDMyRSwgMHgwOTQxLCAweDBENzYsIDB4MDUwQywgMHgwMjI4LAorICAgIDB4MDA2QywgMHgwMjM2LCAweDBEMkYsIDB4MDE1NiwgMHgwMEQyLCAweDBCOEEsCisgICAgMHgwMTQ4LCAweDAyOEEsIDB4MDI4QiwgMHgwMzNCLCAweDAyMTQsIDB4MDFFOSwKKyAgICAweDAzQzIsIDB4MDQ5QywgMHgwMkJBLCAweDAyRTksIDB4MDI4QywgMHgwMUZDLAorICAgIDB4MDEwMywgMHgwQjVDLCAweDA1MEQsIDB4MDMxQywgMHgwMjY4LCAweDA2NTEsCisgICAgMHgwMTNBLCAweDAxM0IsIDB4MDExOCwgMHgwM0Q1LCAweDAyNTIsIDB4MDA0NCwKKyAgICAweDA2MzcsIDB4MDFEMiwgMHgwMDBFLCAweDAwRjAsIDB4MDMyMywgMHgwMkMzLAorICAgIDB4MDE5QSwgMHgwMTZDLCAweDAwNDYsIDB4MDNFMywgMHgwMjRBLCAweDAwQUMsCisgICAgMHgwMjY5LCAweDAyQzAsIDB4MDM5NiwgMHgwMjdBLCAweDAyNTMsIDB4MDI3MywKKyAgICAweDA3M0UsIDB4MDMyMiwgMHgwMDNBLCAweDAyNUUsIDB4MDMzNiwgMHgwMjU3LAorICAgIDB4MDBENiwgMHgwMDI2LCAweDAzQzMsIDB4MDAzNCwgMHgwMTlBLCAweDAwRkIsCisgICAgMHgwMDM4LCAweDAwNDAsIDB4MDA5NiwgMHgwMUYwLCAweDAxODQsIDB4MDIxQSwKKyAgICAweDAwM0UsIDB4MDA0MiwgMHgwNTBFLCAweDAzQ0UsIDB4MDM1RSwgMHgwRkExLAorICAgIDB4MDE3QiwgMHgwMkNELCAweDAwNTgsIDB4MDMyNiwgMHgwMEU0LCAweDAwMkUsCisgICAgMHgwMDRGLCAweDAwMEMsIDB4MDE2NCwgMHgwMDQ4LCAweDAwNDgsIDB4MDE5NCwKKyAgICAweDAwNzQsIDB4MDA2RSwgMHgwMDcwLCAweDAwNkMsIDB4MDFBNCwgMHgwMEEzLAorICAgIDB4MDM0RiwgMHgwMTFFLCAweDAzNzQsIDB4MDE1NywgMHgwMTM4LCAweDAxMUQsCisgICAgMHgwM0NGLCAweDAzM0QsIDB4MDEzMiwgMHgwMDUwLCAweDAyM0UsIDB4MDA1QSwKKyAgICAweDAwNzYsIDB4MDFFQywgMHgwMDVELCAweDAwMDgsIDB4MDA0QywgMHgwMjRFLAorICAgIDB4MDE1NCwgMHgwMDFFLCAweDAxQzYsIDB4MDAyNywgMHgwMEZFLCAweDAxRUEsCisgICAgMHgwMkNFLCAweDAxREQsIDB4MDJDQiwgMHgwMzVBLCAweDAzMTgsIDB4MDEzRSwKKyAgICAweDAwOUIsIDB4MDI4OCwgMHgwMzM5LCAweDAyNEQsIDB4MDMxRiwgMHgwMTI4LAorICAgIDB4MDBCNiwgMHgwMDI4LCAweDAyOEEsIDB4MDI4OSwgMHgwMjlGLCAweDAxRkQsCisgICAgMHgwMjlBLCAweDAwRjYsIDB4MEZBMiwgMHgwMzQ3LCAweDAwODAsIDB4MDFBOCwKKyAgICAweDAyOEYsIDB4MDMyNiwgMHgwMzI3LCAweDAzNzAsIDB4MTY1QywgMHgwNDNGLAorICAgIDB4MDM3NSwgMHgwMTNELCAweDFFNUIsIDB4MDRERSwgMHgwMTU1LCAweDAwRDgsCisgICAgMHgwMzE5LCAweDAwOTYsIDB4MDY0MCwgMHgwN0U3LCAweDAwN0MsIDB4MDY1MiwKKyAgICAweDAzNzMsIDB4MDVERSwgMHgwMENGLCAweDBFNzYsIDB4MDY1MywgMHgwMUEwLAorICAgIDB4MDE2MCwgMHgwMTY5LCAweDAxRDUsIDB4MDVBQSwgMHgwNTNBLCAweDBCNUQsCisgICAgMHgwMjU0LCAweDA3OUEsIDB4MDUzMywgMHgwNDI1LCAweDA1M0UsIDB4MDBBNiwKKyAgICAweDAzMEYsIDB4MDFBMiwgMHgwMEIwLCAweDA0QTMsIDB4MDc5RiwgMHgwMTFBLAorICAgIDB4MDFFRSwgMHgwMkNDLCAweDA0NUUsIDB4MDA1QywgMHgwMDI0LCAweDAyMkMsCisgICAgMHgwMDFBLCAweDAzMzgsIDB4MDEzMiwgMHgwMjZDLCAweDAwNEUsIDB4MDQ3RiwKKyAgICAweDAxQjIsIDB4MDExMywgMHgwNDNFLCAweDAzMzYsIDB4MDBGMCwgMHgwMkNFLAorICAgIDB4MDExMiwgMHgwMThCLCAweDAwMTAsIDB4MDExNCwgMHgwMUJFLCAweDAzRkEsCisgICAgMHgwMDJBLCAweDAwRkEsIDB4MDAzMywgMHgwMDYwLCAweDAxNDYsIDB4MDFEQywKKyAgICAweDAwMDAsIDB4MDAyNSwgMHgwMzdBLCAweDAzNEUsIDB4MDEyRSwgMHgwMjlCLAorICAgIDB4MDc5QiwgMHgwMEU2LCAweDAzQ0QsIDB4MDJERCwgMHgwMTE3LCAweDAxN0EsCisgICAgMHgwMDJDLCAweDAzRTIsIDB4MDAzRSwgMHgwMDcwLCAweDAwQ0UsIDB4MDBCMSwKKyAgICAweDAwM0IsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBvbjJhdmNfY2I2X2JpdHNbT04yQVZDX0NCNl9DT0RFU10gPSB7CisgICAgIDcsIDEwLCAxMCwgIDcsIDEyLCAxMiwKKyAgICAgNywgMTAsIDExLCAxMSwgMTIsIDE1LAorICAgIDE3LCAxMiwgMTMsIDExLCAxNSwgMTMsCisgICAgMTAsIDExLCAxMSwgIDcsIDEzLCAxMywKKyAgICAgNywgIDcsIDEyLCAxMiwgIDcsICA3LAorICAgICA5LCAgOSwgIDksIDExLCAxMCwgIDksCisgICAgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywKKyAgICAgOSwgMTIsIDEwLCAxMCwgIDcsICA5LAorICAgICA5LCAxMCwgMTIsIDExLCAxMCwgMTEsCisgICAgMTEsICA5LCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMiwgMTIsIDEzLCAxMSwgMTIsIDEyLAorICAgIDEwLCAxMSwgMTIsIDEyLCAxMCwgMTEsCisgICAgMTEsIDEwLCAxMiwgMTQsIDEzLCAxMSwKKyAgICAxMiwgMTIsIDExLCAxMCwgMTMsIDE0LAorICAgIDEwLCAxMiwgMTIsIDEyLCAxNiwgMTIsCisgICAgMTIsIDEwLCAxMywgMTMsIDEzLCAxMiwKKyAgICAxMSwgMTEsIDExLCAxMywgMTQsIDEzLAorICAgIDEzLCAxMSwgMTEsIDEwLCAxMywgMTMsCisgICAgMTEsIDEyLCAxMiwgMTMsIDE2LCAxMiwKKyAgICAxNCwgMTAsIDEzLCAxMywgMTAsIDEzLAorICAgIDExLCAxMSwgMTAsIDExLCAxMSwgIDksCisgICAgMTEsIDExLCAxMCwgMTEsIDEyLCAxMiwKKyAgICAxMywgMTIsIDEyLCAxMCwgMTMsIDE0LAorICAgIDEyLCAxMSwgMTEsIDEyLCAxMSwgIDksCisgICAgMTEsIDExLCAxMCwgIDcsIDEyLCAxMywKKyAgICAgNywgIDcsICA5LCAgOSwgMTAsIDEyLAorICAgIDEzLCAxMCwgMTIsIDEwLCAxMCwgMTIsCisgICAgMTMsIDEyLCAxMCwgMTAsIDExLCAgOSwKKyAgICAgNywgIDksICA5LCAgNywgMTAsIDEwLAorICAgICA3LCAgNywgIDksICA5LCAxMCwgMTEsCisgICAgMTAsIDEwLCAxMiwgMTEsIDExLCAxMiwKKyAgICAxMSwgMTEsIDEwLCAxMCwgMTAsICA5LAorICAgICA3LCAgOSwgIDksICA3LCAgOSwgIDksCisgICAgIDcsIDEwLCAxMCwgIDcsIDEwLCAxMCwKKyAgICAxMSwgMTAsIDExLCAxMSwgMTEsIDEwLAorICAgIDExLCAxMiwgMTAsICA5LCAxMCwgMTAsCisgICAgIDgsIDEwLCAgOSwgIDcsIDEwLCAxMSwKKyAgICAxMSwgIDksICA5LCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMSwgMTAsIDExLCAxMCwgMTAsCisgICAgMTAsIDExLCAxMSwgMTAsIDExLCAxMSwKKyAgICAxMCwgMTAsIDExLCAxMCwgMTMsIDEyLAorICAgIDExLCAxMCwgMTMsIDEyLCAxMCwgMTEsCisgICAgMTEsIDEwLCAxMSwgMTIsIDEzLCAxMiwKKyAgICAxMSwgMTMsIDE0LCAxMSwgMTAsIDExLAorICAgIDExLCAgOSwgMTMsIDEyLCAxMCwgMTIsCisgICAgMTEsIDExLCAxMCwgMTMsIDEzLCAgOSwKKyAgICAxMSwgMTEsIDEwLCAxMSwgMTUsIDEzLAorICAgIDExLCAxMSwgMTQsIDEzLCAxMSwgMTAsCisgICAgMTEsIDExLCAxMCwgMTIsIDEzLCAgOSwKKyAgICAxMCwgMTEsIDExLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMSwgMTEsIDExLCAxMCwgMTEsCisgICAgMTAsIDEwLCAxMCwgMTEsIDEwLCAxMCwKKyAgICAxMSwgMTEsIDEwLCAxMCwgMTAsIDExLAorICAgICA3LCAgOSwgIDksICA4LCAgOSwgIDksCisgICAgIDcsIDEwLCAxMCwgMTAsIDExLCAxMSwKKyAgICAxMSwgMTAsIDEwLCAxMiwgMTEsIDEwLAorICAgICA5LCAxMCwgMTAsICA3LCAgOSwgMTAsCisgICAgIDcsIDEwLCAxMSwgMTEsIDEwLCAxMSwKKyAgICAxMSwgMTAsIDExLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxMywgMTIsIDExLCAxMywgMTMsCisgICAgMTEsIDExLCAxMSwgMTEsICA5LCAxMSwKKyAgICAxMSwgIDksICA5LCAxMiwgMTEsICA5LAorICAgICA5LCAxMCwgMTEsIDEwLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTAsIDExLCAxMSwgMTAsICA5LAorICAgIDEwLCAxMCwgMTEsIDEyLCAxMSwgMTAsCisgICAgMTIsIDExLCAxMCwgMTEsIDEwLCAxMiwKKyAgICAxMSwgMTEsIDEzLCAxMSwgMTAsIDEzLAorICAgIDEzLCAxMSwgMTIsIDEyLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMCwgMTAsIDEzLCAxMywKKyAgICAxMCwgMTAsIDExLCAxMSwgMTAsIDEyLAorICAgIDEzLCAxMCwgMTIsIDExLCAxMiwgMTEsCisgICAgMTMsIDEzLCAxMCwgMTQsIDEzLCAxMCwKKyAgICAxMCwgMTEsIDExLCAxMCwgMTMsIDEzLAorICAgIDEwLCAxMCwgMTAsIDExLCAxMCwgMTMsCisgICAgMTIsIDEwLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMywgMTMsIDExLCAxMywgMTMsIDEwLAorICAgIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsCisgICAgMTAsIDExLCAxMSwgMTAsIDEyLCAxMiwKKyAgICAxMSwgMTEsIDEzLCAxMiwgMTEsIDEwLAorICAgIDEzLCAxMywgMTAsIDExLCAxMiwgMTIsCisgICAgMTAsIDExLCAxMSwgMTEsICA5LCAxMiwKKyAgICAxMSwgMTAsICA5LCAxMSwgMTEsIDEwLAorICAgIDExLCAxMSwgMTAsIDEyLCAxMSwgMTEsCisgICAgMTAsIDExLCAxMSwgMTAsIDExLCAxMSwKKyAgICAxMCwgIDksIDEwLCAxMCwgIDksIDEyLAorICAgIDEzLCAgOSwgMTMsIDEwLCAxMSwgMTEsCisgICAgMTMsIDE0LCAxMSwgMTQsIDE0LCAxMywKKyAgICAxMywgMTQsIDEzLCAxMSwgMTMsIDEzLAorICAgIDExLCAxMiwgMTEsIDExLCAxMywgMTEsCisgICAgMTEsICA5LCAxMiwgMTIsICA5LCAxMSwKKyAgICAxMSwgMTEsIDEzLCAxNCwgMTUsIDEyLAorICAgIDEyLCAxMywgMTQsIDEyLCAxMCwgMTEsCisgICAgMTEsICA5LCAxMywgMTIsICA5LCAxMCwKKyAgICAxMywgMTMsIDEwLCAgOSwgMTEsIDExLAorICAgIDEwLCAxMiwgMTMsIDExLCAxMywgMTIsCisgICAgMTMsIDEzLCAxMywgMTMsIDEwLCAxMywKKyAgICAxMiwgMTAsIDEwLCAxMSwgMTAsIDE3LAorICAgIDEzLCAxMywgMTEsIDEzLCAxNCwgMTEsCisgICAgMTEsIDExLCAxMiwgMTIsIDExLCAxNSwKKyAgICAxMywgMTMsIDE3LCAxNCwgMTMsIDEyLAorICAgIDEzLCAxMywgMTEsIDE0LCAxMywgMTEsCisgICAgMTAsIDEzLCAxMywgMTEsIDE0LCAxNCwKKyAgICAxMSwgMTIsIDEyLCAxMSwgMTMsIDE1LAorICAgIDE0LCAxMywgMTQsIDE2LCAxNSwgMTMsCisgICAgMTIsIDEyLCAxMywgMTEsIDE0LCAxNCwKKyAgICAxMSwgMTAsIDEzLCAxMywgMTAsICA5LAorICAgIDEwLCAxMCwgMTEsIDEzLCAxMywgMTAsCisgICAgMTMsIDEzLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxMCwgMTMsIDEzLCAxMCwgMTAsIDExLAorICAgIDExLCAxMiwgMTEsIDExLCAgOSwgMTIsCisgICAgMTIsICA5LCAxMSwgMTEsIDExLCAxMiwKKyAgICAxNCwgMTQsIDEyLCAxMiwgMTQsIDEzLAorICAgIDEyLCAxMCwgMTEsIDExLCAgOSwgMTIsCisgICAgMTIsICA5LCAxMCwgMTQsIDE0LCAgOSwKKyAgICAxMiwgMTEsIDExLCAxMSwgMTMsIDE0LAorICAgIDExLCAxNywgMTQsIDEzLCAxMywgMTQsCisgICAgMTMsIDExLCAxNCwgMTMsIDExLCAxMiwKKyAgICAxMSwgMTEsIDEzLCAxMSwgMTEsICA5LAorICAgIDEzLCAxMiwgIDksIDEwLCAxMSwgMTAsCisgICAgMTIsIDE0LCAxNCwgMTIsIDE0LCAxMywKKyAgICAxNCwgMTIsIDExLCAxMSwgMTEsICA5LAorICAgIDEyLCAxMiwgIDksIDEwLCAxMywgMTQsCisgICAgMTAsIDEwLCAxMSwgMTAsIDEwLCAxNCwKKyAgICAxMiwgMTAsIDEzLCAxMywgMTIsIDEyLAorICAgIDEyLCAxMywgMTAsIDEyLCAxMywgMTAsCisgICAgIDksIDEwLCAxMSwgMTEsIDEzLCAxMywKKyAgICAxMSwgMTQsIDE0LCAxMSwgMTIsIDEzLAorICAgIDEzLCAxMywgMTcsIDE2LCAxMywgMTMsCisgICAgMTMsIDE2LCAxMywgMTIsIDExLCAxMywKKyAgICAxMSwgMTMsIDE0LCAxMSwgMTcsIDEyLAorICAgIDEzLCAxMSwgMTMsIDE2LCAxMSwgMTIsCisgICAgMTMsIDEyLCAxMywgMTUsIDE3LCAxMywKKyAgICAxMywgMTcsIDExLCAxMiwgMTEsIDEyLAorICAgIDExLCAxMSwgMTQsIDE0LCAxMSwgMTAsCisgICAgMTMsIDEzLCAxMCwgMTIsIDEwLCAxMSwKKyAgICAxMCwgMTIsIDEzLCAxMCwgMTIsIDEzLAorICAgIDEzLCAxMiwgMTIsIDEyLCAxMSwgMTQsCisgICAgMTIsIDEwLCAgOSwgMTEsIDExLCAxMiwKKyAgICAxMSwgMTEsIDEwLCAxMiwgMTMsICA5LAorICAgIDEwLCAxMCwgMTEsIDEyLCAxMywgMTQsCisgICAgMTIsIDEyLCAxNSwgMTQsIDEyLCAxMSwKKyAgICAxMSwgMTEsICA5LCAxMiwgMTMsICA5LAorICAgIDEwLCAxMSwgMTEsICA5LCAxMSwgMTEsCisgICAgIDksIDExLCAxMSwgMTIsIDExLCAxMywKKyAgICAxMywgMTEsIDEyLCAxMywgMTQsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEwLCAxMSwgMTEsCisgICAgMTAsIDEwLCAxMSwgMTEsICA5LCAgOSwKKyAgICAxMCwgMTAsIDEwLCAxMSwgMTEsIDEwLAorICAgIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsCisgICAgMTAsIDExLCAxMSwgMTEsICA5LCAxMCwKKyAgICAxMCwgMTEsIDEyLCAxMiwgMTAsIDExLAorICAgIDExLCAxMCwgMTEsIDEyLCAxMSwgMTAsCisgICAgMTIsIDEzLCAxMCwgMTEsIDEyLCAxMywKKyAgICAxMSwgMTIsIDExLCAxMiwgMTAsIDExLAorICAgIDExLCAxMCwgMTAsIDE0LCAxMywgMTAsCisgICAgMTAsIDExLCAxMSwgMTAsIDEzLCAxMiwKKyAgICAxMCwgMTIsIDEzLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxMCwgMTIsIDEzLCAxMCwgMTAsCisgICAgMTEsIDExLCAxMSwgMTMsIDEzLCAxMCwKKyAgICAxMCwgMTEsIDExLCAxMCwgMTIsIDEzLAorICAgIDEwLCAxMiwgMTMsIDEyLCAxMiwgMTMsCisgICAgMTEsIDEwLCAxMiwgMTIsIDEwLCAxMiwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTIsIDEwLAorICAgIDEwLCAxMSwgMTAsIDEyLCAxMSwgMTIsCisgICAgMTEsIDEzLCAxMiwgMTAsIDExLCAxMywKKyAgICAxMSwgMTEsIDExLCAxMiwgMTAsIDEwLAorICAgIDExLCAxMSwgMTAsICA5LCAxMSwgMTEsCisgICAgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwKKyAgICAxMSwgMTAsIDEwLCAxMSwgMTEsIDEyLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTAsCisgICAgIDksIDExLCAxMCwgIDcsIDEwLCAxMCwKKyAgICAgNywgIDcsICA5LCAgOSwgIDksIDEwLAorICAgIDExLCAxMCwgMTIsIDExLCAxMSwgMTIsCisgICAgMTEsIDExLCAxMCwgMTAsIDExLCAxMCwKKyAgICAgNywgMTAsICA5LCAgNywgMTAsICA5LAorICAgICA3LCAxMCwgMTAsICA3LCAgOSwgMTAsCisgICAgMTAsIDEwLCAxMSwgMTIsIDEwLCAxMCwKKyAgICAxMSwgMTEsIDEwLCAxMCwgMTAsIDExLAorICAgICA3LCAgOSwgMTAsICA4LCAxMCwgMTIsCisgICAgMTEsIDEwLCAgOSwgMTEsIDEwLCAxMCwKKyAgICAxMSwgMTEsIDEwLCAxMCwgMTAsIDExLAorICAgIDExLCAxMCwgMTAsIDEwLCAxMCwgMTEsCisgICAgMTEsIDEwLCAxMCwgMTAsIDEzLCAxMiwKKyAgICAxMSwgMTIsIDEyLCAxMiwgMTAsIDEwLAorICAgIDExLCAxMSwgMTEsIDE0LCAxNCwgMTEsCisgICAgMTEsIDEzLCAxMywgMTEsIDExLCAxMSwKKyAgICAxMCwgMTAsIDEyLCAxMiwgMTAsIDEzLAorICAgIDExLCAxMSwgMTAsIDEyLCAxMywgIDksCisgICAgMTAsIDExLCAxMSwgMTEsIDE0LCAxMywKKyAgICAxMSwgMTEsIDEzLCAxMiwgMTEsIDExLAorICAgIDEwLCAxMSwgMTAsIDEyLCAxMywgMTAsCisgICAgIDksIDExLCAxMSwgMTAsIDEwLCAxMCwKKyAgICAxMSwgMTAsIDExLCAxMSwgMTEsIDEzLAorICAgIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsCisgICAgMTEsIDEwLCAxMCwgIDksIDEwLCAxMCwKKyAgICAgNywgIDksIDEwLCAgNywgIDksICA5LAorICAgICA4LCAxMCwgMTAsIDEwLCAxMCwgMTIsCisgICAgMTEsIDEwLCAxMSwgMTEsIDEyLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAgNywgMTAsIDEwLAorICAgICA3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG9uMmF2Y19jYjZfc3ltc1tPTjJBVkNfQ0I2X0NPREVTXSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMiwgMHgwMDBFLCAweDAwMTEsIDB4MDAxMywgMHgwMDFELAorICAgIDB4MDAxRiwgMHgwMDIwLCAweDAwMjIsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzMsCisgICAgMHgwMDNELCAweDAwM0YsIDB4MDBEMSwgMHgwMEQzLCAweDAwREQsIDB4MDBERiwKKyAgICAweDAwRTAsIDB4MDBFMiwgMHgwMEVFLCAweDAwRjEsIDB4MDBGMywgMHgwMEZELAorICAgIDB4MDBGRiwgMHgwMTAxLCAweDAxMDMsIDB4MDEwRCwgMHgwMTBGLCAweDAxMTAsCisgICAgMHgwMTEyLCAweDAxMUUsIDB4MDEyMSwgMHgwMTIzLCAweDAxMkQsIDB4MDEyRiwKKyAgICAweDAxMzAsIDB4MDEzMiwgMHgwMTNFLCAweDAxRDAsIDB4MDFEMiwgMHgwMURFLAorICAgIDB4MDFFMSwgMHgwMUUzLCAweDAxRUQsIDB4MDFFRiwgMHgwMUYwLCAweDAxRjIsCisgICAgMHgwMUZFLCAweDAyMDAsIDB4MDIwMiwgMHgwMjBFLCAweDAyMTEsIDB4MDIxMywKKyAgICAweDAyMUQsIDB4MDIxRiwgMHgwMjIwLCAweDAyMjIsIDB4MDIyRSwgMHgwMjMxLAorICAgIDB4MDIzMywgMHgwMjNELCAweDAyM0YsIDB4MDJEMSwgMHgwMkQzLCAweDAyREQsCisgICAgMHgwMkRGLCAweDAyRTAsIDB4MDJFMiwgMHgwMkVFLCAweDAyRjEsIDB4MDJGMywKKyAgICAweDAyRkQsIDB4MDJGRiwgMHgwMzAxLCAweDAzMDMsIDB4MDMwRCwgMHgwMzBGLAorICAgIDB4MDMxMCwgMHgwMzEyLCAweDAzMUUsIDB4MDMyMSwgMHgwMzIzLCAweDAzMkQsCisgICAgMHgwMzJGLCAweDAzMzAsIDB4MDMzMiwgMHgwMzNFLCAweDAzRDAsIDB4MDNEMiwKKyAgICAweDAzREUsIDB4MDNFMSwgMHgwM0UzLCAweDAzRUQsIDB4MDNFRiwgMHgwM0YwLAorICAgIDB4MDNGMiwgMHgwM0ZFLCAweDBEMDEsIDB4MEQwMywgMHgwRDBELCAweDBEMEYsCisgICAgMHgwRDEwLCAweDBEMTIsIDB4MEQxRSwgMHgwRDIxLCAweDBEMjMsIDB4MEQyRCwKKyAgICAweDBEMkYsIDB4MEQzMCwgMHgwRDMyLCAweDBEM0UsIDB4MEREMCwgMHgwREQyLAorICAgIDB4MERERSwgMHgwREUxLCAweDBERTMsIDB4MERFRCwgMHgwREVGLCAweDBERjAsCisgICAgMHgwREYyLCAweDBERkUsIDB4MEUwMCwgMHgwRTAyLCAweDBFMEUsIDB4MEUxMSwKKyAgICAweDBFMTMsIDB4MEUxRCwgMHgwRTFGLCAweDBFMjAsIDB4MEUyMiwgMHgwRTJFLAorICAgIDB4MEUzMSwgMHgwRTMzLCAweDBFM0QsIDB4MEUzRiwgMHgwRUQxLCAweDBFRDMsCisgICAgMHgwRURELCAweDBFREYsIDB4MEVFMCwgMHgwRUUyLCAweDBFRUUsIDB4MEVGMSwKKyAgICAweDBFRjMsIDB4MEVGRCwgMHgwRUZGLCAweDBGMDEsIDB4MEYwMywgMHgwRjBELAorICAgIDB4MEYwRiwgMHgwRjEwLCAweDBGMTIsIDB4MEYxRSwgMHgwRjIxLCAweDBGMjMsCisgICAgMHgwRjJELCAweDBGMkYsIDB4MEYzMCwgMHgwRjMyLCAweDBGM0UsIDB4MEZEMCwKKyAgICAweDBGRDIsIDB4MEZERSwgMHgwRkUxLCAweDBGRTMsIDB4MEZFRCwgMHgwRkVGLAorICAgIDB4MEZGMCwgMHgwRkYyLCAweDBGRkUsIDB4MTAwMSwgMHgxMDAzLCAweDEwMEQsCisgICAgMHgxMDBGLCAweDEwMTAsIDB4MTAxMiwgMHgxMDFFLCAweDEwMjEsIDB4MTAyMywKKyAgICAweDEwMkQsIDB4MTAyRiwgMHgxMDMwLCAweDEwMzIsIDB4MTAzRSwgMHgxMEQwLAorICAgIDB4MTBEMiwgMHgxMERFLCAweDEwRTEsIDB4MTBFMywgMHgxMEVELCAweDEwRUYsCisgICAgMHgxMEYwLCAweDEwRjIsIDB4MTBGRSwgMHgxMTAwLCAweDExMDIsIDB4MTEwRSwKKyAgICAweDExMTEsIDB4MTExMywgMHgxMTFELCAweDExMUYsIDB4MTEyMCwgMHgxMTIyLAorICAgIDB4MTEyRSwgMHgxMTMxLCAweDExMzMsIDB4MTEzRCwgMHgxMTNGLCAweDExRDEsCisgICAgMHgxMUQzLCAweDExREQsIDB4MTFERiwgMHgxMUUwLCAweDExRTIsIDB4MTFFRSwKKyAgICAweDExRjEsIDB4MTFGMywgMHgxMUZELCAweDExRkYsIDB4MTIwMSwgMHgxMjAzLAorICAgIDB4MTIwRCwgMHgxMjBGLCAweDEyMTAsIDB4MTIxMiwgMHgxMjFFLCAweDEyMjEsCisgICAgMHgxMjIzLCAweDEyMkQsIDB4MTIyRiwgMHgxMjMwLCAweDEyMzIsIDB4MTIzRSwKKyAgICAweDEyRDAsIDB4MTJEMiwgMHgxMkRFLCAweDEyRTEsIDB4MTJFMywgMHgxMkVELAorICAgIDB4MTJFRiwgMHgxMkYwLCAweDEyRjIsIDB4MTJGRSwgMHgxMzAwLCAweDEzMDIsCisgICAgMHgxMzBFLCAweDEzMTEsIDB4MTMxMywgMHgxMzFELCAweDEzMUYsIDB4MTMyMCwKKyAgICAweDEzMjIsIDB4MTMyRSwgMHgxMzMxLCAweDEzMzMsIDB4MTMzRCwgMHgxMzNGLAorICAgIDB4MTNEMSwgMHgxM0QzLCAweDEzREQsIDB4MTNERiwgMHgxM0UwLCAweDEzRTIsCisgICAgMHgxM0VFLCAweDEzRjEsIDB4MTNGMywgMHgxM0ZELCAweDEzRkYsIDB4MUQwMCwKKyAgICAweDFEMDIsIDB4MUQwRSwgMHgxRDExLCAweDFEMTMsIDB4MUQxRCwgMHgxRDFGLAorICAgIDB4MUQyMCwgMHgxRDIyLCAweDFEMkUsIDB4MUQzMSwgMHgxRDMzLCAweDFEM0QsCisgICAgMHgxRDNGLCAweDFERDEsIDB4MUREMywgMHgxRERELCAweDFEREYsIDB4MURFMCwKKyAgICAweDFERTIsIDB4MURFRSwgMHgxREYxLCAweDFERjMsIDB4MURGRCwgMHgxREZGLAorICAgIDB4MUUwMSwgMHgxRTAzLCAweDFFMEQsIDB4MUUwRiwgMHgxRTEwLCAweDFFMTIsCisgICAgMHgxRTFFLCAweDFFMjEsIDB4MUUyMywgMHgxRTJELCAweDFFMkYsIDB4MUUzMCwKKyAgICAweDFFMzIsIDB4MUUzRSwgMHgxRUQwLCAweDFFRDIsIDB4MUVERSwgMHgxRUUxLAorICAgIDB4MUVFMywgMHgxRUVELCAweDFFRUYsIDB4MUVGMCwgMHgxRUYyLCAweDFFRkUsCisgICAgMHgxRjAwLCAweDFGMDIsIDB4MUYwRSwgMHgxRjExLCAweDFGMTMsIDB4MUYxRCwKKyAgICAweDFGMUYsIDB4MUYyMCwgMHgxRjIyLCAweDFGMkUsIDB4MUYzMSwgMHgxRjMzLAorICAgIDB4MUYzRCwgMHgxRjNGLCAweDFGRDEsIDB4MUZEMywgMHgxRkRELCAweDFGREYsCisgICAgMHgxRkUwLCAweDFGRTIsIDB4MUZFRSwgMHgxRkYxLCAweDFGRjMsIDB4MUZGRCwKKyAgICAweDFGRkYsIDB4MjAwMCwgMHgyMDAyLCAweDIwMEUsIDB4MjAxMSwgMHgyMDEzLAorICAgIDB4MjAxRCwgMHgyMDFGLCAweDIwMjAsIDB4MjAyMiwgMHgyMDJFLCAweDIwMzEsCisgICAgMHgyMDMzLCAweDIwM0QsIDB4MjAzRiwgMHgyMEQxLCAweDIwRDMsIDB4MjBERCwKKyAgICAweDIwREYsIDB4MjBFMCwgMHgyMEUyLCAweDIwRUUsIDB4MjBGMSwgMHgyMEYzLAorICAgIDB4MjBGRCwgMHgyMEZGLCAweDIxMDEsIDB4MjEwMywgMHgyMTBELCAweDIxMEYsCisgICAgMHgyMTEwLCAweDIxMTIsIDB4MjExRSwgMHgyMTIxLCAweDIxMjMsIDB4MjEyRCwKKyAgICAweDIxMkYsIDB4MjEzMCwgMHgyMTMyLCAweDIxM0UsIDB4MjFEMCwgMHgyMUQyLAorICAgIDB4MjFERSwgMHgyMUUxLCAweDIxRTMsIDB4MjFFRCwgMHgyMUVGLCAweDIxRjAsCisgICAgMHgyMUYyLCAweDIxRkUsIDB4MjIwMCwgMHgyMjAyLCAweDIyMEUsIDB4MjIxMSwKKyAgICAweDIyMTMsIDB4MjIxRCwgMHgyMjFGLCAweDIyMjAsIDB4MjIyMiwgMHgyMjJFLAorICAgIDB4MjIzMSwgMHgyMjMzLCAweDIyM0QsIDB4MjIzRiwgMHgyMkQxLCAweDIyRDMsCisgICAgMHgyMkRELCAweDIyREYsIDB4MjJFMCwgMHgyMkUyLCAweDIyRUUsIDB4MjJGMSwKKyAgICAweDIyRjMsIDB4MjJGRCwgMHgyMkZGLCAweDIzMDEsIDB4MjMwMywgMHgyMzBELAorICAgIDB4MjMwRiwgMHgyMzEwLCAweDIzMTIsIDB4MjMxRSwgMHgyMzIxLCAweDIzMjMsCisgICAgMHgyMzJELCAweDIzMkYsIDB4MjMzMCwgMHgyMzMyLCAweDIzM0UsIDB4MjNEMCwKKyAgICAweDIzRDIsIDB4MjNERSwgMHgyM0UxLCAweDIzRTMsIDB4MjNFRCwgMHgyM0VGLAorICAgIDB4MjNGMCwgMHgyM0YyLCAweDIzRkUsIDB4MkQwMSwgMHgyRDAzLCAweDJEMEQsCisgICAgMHgyRDBGLCAweDJEMTAsIDB4MkQxMiwgMHgyRDFFLCAweDJEMjEsIDB4MkQyMywKKyAgICAweDJEMkQsIDB4MkQyRiwgMHgyRDMwLCAweDJEMzIsIDB4MkQzRSwgMHgyREQwLAorICAgIDB4MkREMiwgMHgyRERFLCAweDJERTEsIDB4MkRFMywgMHgyREVELCAweDJERUYsCisgICAgMHgyREYwLCAweDJERjIsIDB4MkRGRSwgMHgyRTAwLCAweDJFMDIsIDB4MkUwRSwKKyAgICAweDJFMTEsIDB4MkUxMywgMHgyRTFELCAweDJFMUYsIDB4MkUyMCwgMHgyRTIyLAorICAgIDB4MkUyRSwgMHgyRTMxLCAweDJFMzMsIDB4MkUzRCwgMHgyRTNGLCAweDJFRDEsCisgICAgMHgyRUQzLCAweDJFREQsIDB4MkVERiwgMHgyRUUwLCAweDJFRTIsIDB4MkVFRSwKKyAgICAweDJFRjEsIDB4MkVGMywgMHgyRUZELCAweDJFRkYsIDB4MkYwMSwgMHgyRjAzLAorICAgIDB4MkYwRCwgMHgyRjBGLCAweDJGMTAsIDB4MkYxMiwgMHgyRjFFLCAweDJGMjEsCisgICAgMHgyRjIzLCAweDJGMkQsIDB4MkYyRiwgMHgyRjMwLCAweDJGMzIsIDB4MkYzRSwKKyAgICAweDJGRDAsIDB4MkZEMiwgMHgyRkRFLCAweDJGRTEsIDB4MkZFMywgMHgyRkVELAorICAgIDB4MkZFRiwgMHgyRkYwLCAweDJGRjIsIDB4MkZGRSwgMHgzMDAxLCAweDMwMDMsCisgICAgMHgzMDBELCAweDMwMEYsIDB4MzAxMCwgMHgzMDEyLCAweDMwMUUsIDB4MzAyMSwKKyAgICAweDMwMjMsIDB4MzAyRCwgMHgzMDJGLCAweDMwMzAsIDB4MzAzMiwgMHgzMDNFLAorICAgIDB4MzBEMCwgMHgzMEQyLCAweDMwREUsIDB4MzBFMSwgMHgzMEUzLCAweDMwRUQsCisgICAgMHgzMEVGLCAweDMwRjAsIDB4MzBGMiwgMHgzMEZFLCAweDMxMDAsIDB4MzEwMiwKKyAgICAweDMxMEUsIDB4MzExMSwgMHgzMTEzLCAweDMxMUQsIDB4MzExRiwgMHgzMTIwLAorICAgIDB4MzEyMiwgMHgzMTJFLCAweDMxMzEsIDB4MzEzMywgMHgzMTNELCAweDMxM0YsCisgICAgMHgzMUQxLCAweDMxRDMsIDB4MzFERCwgMHgzMURGLCAweDMxRTAsIDB4MzFFMiwKKyAgICAweDMxRUUsIDB4MzFGMSwgMHgzMUYzLCAweDMxRkQsIDB4MzFGRiwgMHgzMjAxLAorICAgIDB4MzIwMywgMHgzMjBELCAweDMyMEYsIDB4MzIxMCwgMHgzMjEyLCAweDMyMUUsCisgICAgMHgzMjIxLCAweDMyMjMsIDB4MzIyRCwgMHgzMjJGLCAweDMyMzAsIDB4MzIzMiwKKyAgICAweDMyM0UsIDB4MzJEMCwgMHgzMkQyLCAweDMyREUsIDB4MzJFMSwgMHgzMkUzLAorICAgIDB4MzJFRCwgMHgzMkVGLCAweDMyRjAsIDB4MzJGMiwgMHgzMkZFLCAweDMzMDAsCisgICAgMHgzMzAyLCAweDMzMEUsIDB4MzMxMSwgMHgzMzEzLCAweDMzMUQsIDB4MzMxRiwKKyAgICAweDMzMjAsIDB4MzMyMiwgMHgzMzJFLCAweDMzMzEsIDB4MzMzMywgMHgzMzNELAorICAgIDB4MzMzRiwgMHgzM0QxLCAweDMzRDMsIDB4MzNERCwgMHgzM0RGLCAweDMzRTAsCisgICAgMHgzM0UyLCAweDMzRUUsIDB4MzNGMSwgMHgzM0YzLCAweDMzRkQsIDB4MzNGRiwKKyAgICAweDNEMDAsIDB4M0QwMiwgMHgzRDBFLCAweDNEMTEsIDB4M0QxMywgMHgzRDFELAorICAgIDB4M0QxRiwgMHgzRDIwLCAweDNEMjIsIDB4M0QyRSwgMHgzRDMxLCAweDNEMzMsCisgICAgMHgzRDNELCAweDNEM0YsIDB4M0REMSwgMHgzREQzLCAweDNEREQsIDB4M0RERiwKKyAgICAweDNERTAsIDB4M0RFMiwgMHgzREVFLCAweDNERjEsIDB4M0RGMywgMHgzREZELAorICAgIDB4M0RGRiwgMHgzRTAxLCAweDNFMDMsIDB4M0UwRCwgMHgzRTBGLCAweDNFMTAsCisgICAgMHgzRTEyLCAweDNFMUUsIDB4M0UyMSwgMHgzRTIzLCAweDNFMkQsIDB4M0UyRiwKKyAgICAweDNFMzAsIDB4M0UzMiwgMHgzRTNFLCAweDNFRDAsIDB4M0VEMiwgMHgzRURFLAorICAgIDB4M0VFMSwgMHgzRUUzLCAweDNFRUQsIDB4M0VFRiwgMHgzRUYwLCAweDNFRjIsCisgICAgMHgzRUZFLCAweDNGMDAsIDB4M0YwMiwgMHgzRjBFLCAweDNGMTEsIDB4M0YxMywKKyAgICAweDNGMUQsIDB4M0YxRiwgMHgzRjIwLCAweDNGMjIsIDB4M0YyRSwgMHgzRjMxLAorICAgIDB4M0YzMywgMHgzRjNELCAweDNGM0YsIDB4M0ZEMSwgMHgzRkQzLCAweDNGREQsCisgICAgMHgzRkRGLCAweDNGRTAsIDB4M0ZFMiwgMHgzRkVFLCAweDNGRjEsIDB4M0ZGMywKKyAgICAweDNGRkQsIDB4M0ZGRiwgMHhEMDAxLCAweEQwMDMsIDB4RDAwRCwgMHhEMDBGLAorICAgIDB4RDAxMCwgMHhEMDEyLCAweEQwMUUsIDB4RDAyMSwgMHhEMDIzLCAweEQwMkQsCisgICAgMHhEMDJGLCAweEQwMzAsIDB4RDAzMiwgMHhEMDNFLCAweEQwRDAsIDB4RDBEMiwKKyAgICAweEQwREUsIDB4RDBFMSwgMHhEMEUzLCAweEQwRUQsIDB4RDBFRiwgMHhEMEYwLAorICAgIDB4RDBGMiwgMHhEMEZFLCAweEQxMDAsIDB4RDEwMiwgMHhEMTBFLCAweEQxMTEsCisgICAgMHhEMTEzLCAweEQxMUQsIDB4RDExRiwgMHhEMTIwLCAweEQxMjIsIDB4RDEyRSwKKyAgICAweEQxMzEsIDB4RDEzMywgMHhEMTNELCAweEQxM0YsIDB4RDFEMSwgMHhEMUQzLAorICAgIDB4RDFERCwgMHhEMURGLCAweEQxRTAsIDB4RDFFMiwgMHhEMUVFLCAweEQxRjEsCisgICAgMHhEMUYzLCAweEQxRkQsIDB4RDFGRiwgMHhEMjAxLCAweEQyMDMsIDB4RDIwRCwKKyAgICAweEQyMEYsIDB4RDIxMCwgMHhEMjEyLCAweEQyMUUsIDB4RDIyMSwgMHhEMjIzLAorICAgIDB4RDIyRCwgMHhEMjJGLCAweEQyMzAsIDB4RDIzMiwgMHhEMjNFLCAweEQyRDAsCisgICAgMHhEMkQyLCAweEQyREUsIDB4RDJFMSwgMHhEMkUzLCAweEQyRUQsIDB4RDJFRiwKKyAgICAweEQyRjAsIDB4RDJGMiwgMHhEMkZFLCAweEQzMDAsIDB4RDMwMiwgMHhEMzBFLAorICAgIDB4RDMxMSwgMHhEMzEzLCAweEQzMUQsIDB4RDMxRiwgMHhEMzIwLCAweEQzMjIsCisgICAgMHhEMzJFLCAweEQzMzEsIDB4RDMzMywgMHhEMzNELCAweEQzM0YsIDB4RDNEMSwKKyAgICAweEQzRDMsIDB4RDNERCwgMHhEM0RGLCAweEQzRTAsIDB4RDNFMiwgMHhEM0VFLAorICAgIDB4RDNGMSwgMHhEM0YzLCAweEQzRkQsIDB4RDNGRiwgMHhERDAwLCAweEREMDIsCisgICAgMHhERDBFLCAweEREMTEsIDB4REQxMywgMHhERDFELCAweEREMUYsIDB4REQyMCwKKyAgICAweEREMjIsIDB4REQyRSwgMHhERDMxLCAweEREMzMsIDB4REQzRCwgMHhERDNGLAorICAgIDB4REREMSwgMHhEREQzLCAweEREREQsIDB4RERERiwgMHhEREUwLCAweERERTIsCisgICAgMHhEREVFLCAweERERjEsIDB4RERGMywgMHhEREZELCAweERERkYsIDB4REUwMSwKKyAgICAweERFMDMsIDB4REUwRCwgMHhERTBGLCAweERFMTAsIDB4REUxMiwgMHhERTFFLAorICAgIDB4REUyMSwgMHhERTIzLCAweERFMkQsIDB4REUyRiwgMHhERTMwLCAweERFMzIsCisgICAgMHhERTNFLCAweERFRDAsIDB4REVEMiwgMHhERURFLCAweERFRTEsIDB4REVFMywKKyAgICAweERFRUQsIDB4REVFRiwgMHhERUYwLCAweERFRjIsIDB4REVGRSwgMHhERjAwLAorICAgIDB4REYwMiwgMHhERjBFLCAweERGMTEsIDB4REYxMywgMHhERjFELCAweERGMUYsCisgICAgMHhERjIwLCAweERGMjIsIDB4REYyRSwgMHhERjMxLCAweERGMzMsIDB4REYzRCwKKyAgICAweERGM0YsIDB4REZEMSwgMHhERkQzLCAweERGREQsIDB4REZERiwgMHhERkUwLAorICAgIDB4REZFMiwgMHhERkVFLCAweERGRjEsIDB4REZGMywgMHhERkZELCAweERGRkYsCisgICAgMHhFMDAwLCAweEUwMDIsIDB4RTAwRSwgMHhFMDExLCAweEUwMTMsIDB4RTAxRCwKKyAgICAweEUwMUYsIDB4RTAyMCwgMHhFMDIyLCAweEUwMkUsIDB4RTAzMSwgMHhFMDMzLAorICAgIDB4RTAzRCwgMHhFMDNGLCAweEUwRDEsIDB4RTBEMywgMHhFMERELCAweEUwREYsCisgICAgMHhFMEUwLCAweEUwRTIsIDB4RTBFRSwgMHhFMEYxLCAweEUwRjMsIDB4RTBGRCwKKyAgICAweEUwRkYsIDB4RTEwMSwgMHhFMTAzLCAweEUxMEQsIDB4RTEwRiwgMHhFMTEwLAorICAgIDB4RTExMiwgMHhFMTFFLCAweEUxMjEsIDB4RTEyMywgMHhFMTJELCAweEUxMkYsCisgICAgMHhFMTMwLCAweEUxMzIsIDB4RTEzRSwgMHhFMUQwLCAweEUxRDIsIDB4RTFERSwKKyAgICAweEUxRTEsIDB4RTFFMywgMHhFMUVELCAweEUxRUYsIDB4RTFGMCwgMHhFMUYyLAorICAgIDB4RTFGRSwgMHhFMjAwLCAweEUyMDIsIDB4RTIwRSwgMHhFMjExLCAweEUyMTMsCisgICAgMHhFMjFELCAweEUyMUYsIDB4RTIyMCwgMHhFMjIyLCAweEUyMkUsIDB4RTIzMSwKKyAgICAweEUyMzMsIDB4RTIzRCwgMHhFMjNGLCAweEUyRDEsIDB4RTJEMywgMHhFMkRELAorICAgIDB4RTJERiwgMHhFMkUwLCAweEUyRTIsIDB4RTJFRSwgMHhFMkYxLCAweEUyRjMsCisgICAgMHhFMkZELCAweEUyRkYsIDB4RTMwMSwgMHhFMzAzLCAweEUzMEQsIDB4RTMwRiwKKyAgICAweEUzMTAsIDB4RTMxMiwgMHhFMzFFLCAweEUzMjEsIDB4RTMyMywgMHhFMzJELAorICAgIDB4RTMyRiwgMHhFMzMwLCAweEUzMzIsIDB4RTMzRSwgMHhFM0QwLCAweEUzRDIsCisgICAgMHhFM0RFLCAweEUzRTEsIDB4RTNFMywgMHhFM0VELCAweEUzRUYsIDB4RTNGMCwKKyAgICAweEUzRjIsIDB4RTNGRSwgMHhFRDAxLCAweEVEMDMsIDB4RUQwRCwgMHhFRDBGLAorICAgIDB4RUQxMCwgMHhFRDEyLCAweEVEMUUsIDB4RUQyMSwgMHhFRDIzLCAweEVEMkQsCisgICAgMHhFRDJGLCAweEVEMzAsIDB4RUQzMiwgMHhFRDNFLCAweEVERDAsIDB4RUREMiwKKyAgICAweEVEREUsIDB4RURFMSwgMHhFREUzLCAweEVERUQsIDB4RURFRiwgMHhFREYwLAorICAgIDB4RURGMiwgMHhFREZFLCAweEVFMDAsIDB4RUUwMiwgMHhFRTBFLCAweEVFMTEsCisgICAgMHhFRTEzLCAweEVFMUQsIDB4RUUxRiwgMHhFRTIwLCAweEVFMjIsIDB4RUUyRSwKKyAgICAweEVFMzEsIDB4RUUzMywgMHhFRTNELCAweEVFM0YsIDB4RUVEMSwgMHhFRUQzLAorICAgIDB4RUVERCwgMHhFRURGLCAweEVFRTAsIDB4RUVFMiwgMHhFRUVFLCAweEVFRjEsCisgICAgMHhFRUYzLCAweEVFRkQsIDB4RUVGRiwgMHhFRjAxLCAweEVGMDMsIDB4RUYwRCwKKyAgICAweEVGMEYsIDB4RUYxMCwgMHhFRjEyLCAweEVGMUUsIDB4RUYyMSwgMHhFRjIzLAorICAgIDB4RUYyRCwgMHhFRjJGLCAweEVGMzAsIDB4RUYzMiwgMHhFRjNFLCAweEVGRDAsCisgICAgMHhFRkQyLCAweEVGREUsIDB4RUZFMSwgMHhFRkUzLCAweEVGRUQsIDB4RUZFRiwKKyAgICAweEVGRjAsIDB4RUZGMiwgMHhFRkZFLCAweEYwMDEsIDB4RjAwMywgMHhGMDBELAorICAgIDB4RjAwRiwgMHhGMDEwLCAweEYwMTIsIDB4RjAxRSwgMHhGMDIxLCAweEYwMjMsCisgICAgMHhGMDJELCAweEYwMkYsIDB4RjAzMCwgMHhGMDMyLCAweEYwM0UsIDB4RjBEMCwKKyAgICAweEYwRDIsIDB4RjBERSwgMHhGMEUxLCAweEYwRTMsIDB4RjBFRCwgMHhGMEVGLAorICAgIDB4RjBGMCwgMHhGMEYyLCAweEYwRkUsIDB4RjEwMCwgMHhGMTAyLCAweEYxMEUsCisgICAgMHhGMTExLCAweEYxMTMsIDB4RjExRCwgMHhGMTFGLCAweEYxMjAsIDB4RjEyMiwKKyAgICAweEYxMkUsIDB4RjEzMSwgMHhGMTMzLCAweEYxM0QsIDB4RjEzRiwgMHhGMUQxLAorICAgIDB4RjFEMywgMHhGMURELCAweEYxREYsIDB4RjFFMCwgMHhGMUUyLCAweEYxRUUsCisgICAgMHhGMUYxLCAweEYxRjMsIDB4RjFGRCwgMHhGMUZGLCAweEYyMDEsIDB4RjIwMywKKyAgICAweEYyMEQsIDB4RjIwRiwgMHhGMjEwLCAweEYyMTIsIDB4RjIxRSwgMHhGMjIxLAorICAgIDB4RjIyMywgMHhGMjJELCAweEYyMkYsIDB4RjIzMCwgMHhGMjMyLCAweEYyM0UsCisgICAgMHhGMkQwLCAweEYyRDIsIDB4RjJERSwgMHhGMkUxLCAweEYyRTMsIDB4RjJFRCwKKyAgICAweEYyRUYsIDB4RjJGMCwgMHhGMkYyLCAweEYyRkUsIDB4RjMwMCwgMHhGMzAyLAorICAgIDB4RjMwRSwgMHhGMzExLCAweEYzMTMsIDB4RjMxRCwgMHhGMzFGLCAweEYzMjAsCisgICAgMHhGMzIyLCAweEYzMkUsIDB4RjMzMSwgMHhGMzMzLCAweEYzM0QsIDB4RjMzRiwKKyAgICAweEYzRDEsIDB4RjNEMywgMHhGM0RELCAweEYzREYsIDB4RjNFMCwgMHhGM0UyLAorICAgIDB4RjNFRSwgMHhGM0YxLCAweEYzRjMsIDB4RjNGRCwgMHhGM0ZGLCAweEZEMDAsCisgICAgMHhGRDAyLCAweEZEMEUsIDB4RkQxMSwgMHhGRDEzLCAweEZEMUQsIDB4RkQxRiwKKyAgICAweEZEMjAsIDB4RkQyMiwgMHhGRDJFLCAweEZEMzEsIDB4RkQzMywgMHhGRDNELAorICAgIDB4RkQzRiwgMHhGREQxLCAweEZERDMsIDB4RkRERCwgMHhGRERGLCAweEZERTAsCisgICAgMHhGREUyLCAweEZERUUsIDB4RkRGMSwgMHhGREYzLCAweEZERkQsIDB4RkRGRiwKKyAgICAweEZFMDEsIDB4RkUwMywgMHhGRTBELCAweEZFMEYsIDB4RkUxMCwgMHhGRTEyLAorICAgIDB4RkUxRSwgMHhGRTIxLCAweEZFMjMsIDB4RkUyRCwgMHhGRTJGLCAweEZFMzAsCisgICAgMHhGRTMyLCAweEZFM0UsIDB4RkVEMCwgMHhGRUQyLCAweEZFREUsIDB4RkVFMSwKKyAgICAweEZFRTMsIDB4RkVFRCwgMHhGRUVGLCAweEZFRjAsIDB4RkVGMiwgMHhGRUZFLAorICAgIDB4RkYwMCwgMHhGRjAyLCAweEZGMEUsIDB4RkYxMSwgMHhGRjEzLCAweEZGMUQsCisgICAgMHhGRjFGLCAweEZGMjAsIDB4RkYyMiwgMHhGRjJFLCAweEZGMzEsIDB4RkYzMywKKyAgICAweEZGM0QsIDB4RkYzRiwgMHhGRkQxLCAweEZGRDMsIDB4RkZERCwgMHhGRkRGLAorICAgIDB4RkZFMCwgMHhGRkUyLCAweEZGRUUsIDB4RkZGMSwgMHhGRkYzLCAweEZGRkQsCisgICAgMHhGRkZGLAorfTsKKworI2RlZmluZSBPTjJBVkNfQ0I3X0NPREVTIDMyODEKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBvbjJhdmNfY2I3X2NvZGVzW09OMkFWQ19DQjdfQ09ERVNdID0geworICAgIDB4MDAwMDAsIDB4MDAwRUEsIDB4MDAwRTYsIDB4MDAwRjQsIDB4MDAwRjYsIDB4MDAwNDcsCisgICAgMHgwMDNFMiwgMHgwMDRBNywgMHgwMDA0NCwgMHgwMDREMywgMHgwMDgyQSwgMHgwMDI2RSwKKyAgICAweDAwMjBFLCAweDAwOEE1LCAweDAyNjAzLCAweDAyODk1LCAweDA0OUIwLCAweDAyODk0LAorICAgIDB4MDA3QkUsIDB4MDA2OUUsIDB4MDExNTQsIDB4MDExNTMsIDB4MDA5NUYsIDB4MDAzOEUsCisgICAgMHgwMDRBQywgMHgwMTI4RSwgMHgwMEU1RSwgMHgwMDk5MiwgMHgwMkE4NCwgMHgwMzg2QSwKKyAgICAweDAzRjZGLCAweDAxQzU0LCAweDAwNUQ0LCAweDAwQUZCLCAweDAwMUJFLCAweDAwMjU4LAorICAgIDB4MDBBNTksIDB4MDAwNDMsIDB4MDA0QTYsIDB4MDA0RDcsIDB4MDAwNDAsIDB4MDAwNkMsCisgICAgMHgwMDdGRiwgMHgwMEQzOSwgMHgwMDA1QiwgMHgwMDA2NiwgMHgwMDM0QSwgMHgwMDEyNCwKKyAgICAweDAwNEI2LCAweDAwNjI2LCAweDAwNzFGLCAweDAxNEEzLCAweDAxNEEyLCAweDAwODNFLAorICAgIDB4MDMyRDQsIDB4MDQ5QjMsIDB4MDA0NUUsIDB4MDBFRDUsIDB4MDI4OTYsIDB4MDBBQkEsCisgICAgMHgwMTA3QiwgMHgwMDlFQywgMHgwMDgyQywgMHgwMDgyQiwgMHgwMEQzOCwgMHgwMDcyQiwKKyAgICAweDAwNEZDLCAweDA0OUIyLCAweDA1MEIxLCAweDAwM0ZFLCAweDAwOUVCLCAweDA0OUIxLAorICAgIDB4MDA5NjYsIDB4MDBGNzUsIDB4MDNGNzAsIDB4MDA3QkMsIDB4MDAwNTQsIDB4MDAzOTQsCisgICAgMHgwMDBFOCwgMHgwMDUyRiwgMHgwMDU3QSwgMHgwMDQ1OCwgMHgwRkI0QiwgMHgwMUM1NSwKKyAgICAweDAwOTQ4LCAweDAzMkQ2LCAweDAwRUQ2LCAweDBBMDVGLCAweDA1MEIzLCAweDAwQkJELAorICAgIDB4MDE5N0UsIDB4MDI0RkMsIDB4MDIwQzYsIDB4MDA5NEEsIDB4MDM4NkIsIDB4MUYyRkYsCisgICAgMHgwNTBCNCwgMHgwQTA2MCwgMHgwRkI0QywgMHgwMDlFRCwgMHgwMkE4NSwgMHgwRkI0RCwKKyAgICAweDAyNjA1LCAweDAwQUJCLCAweDAwOUEyLCAweDAxNDVCLCAweDBBMDVELCAweDAzRjcxLAorICAgIDB4MDBCRkYsIDB4MUYyRkUsIDB4MEZCNDksIDB4MEZCNDgsIDB4MDUwQjIsIDB4MDExNTUsCisgICAgMHgwMUZENiwgMHgwMzJENSwgMHgwMDk3NiwgMHgwMjYwNCwgMHgwMEE1QSwgMHgwQTA1RSwKKyAgICAweDBGQjRBLCAweDAwREI5LCAweDBBMDYzLCAweDFGMzA3LCAweDBGQjRGLCAweDFGMzA2LAorICAgIDB4MDQ5QjQsIDB4MEZCNTAsIDB4MEZCNTEsIDB4MDUwQjYsIDB4MUYzMDgsIDB4MDUwQjcsCisgICAgMHgxRjMwQSwgMHgxRjMwOSwgMHgwQTA2NCwgMHgxRjMwQiwgMHgwQTA2NiwgMHgwNjUzNSwKKyAgICAweDAyMEM3LCAweDBBMDY1LCAweDAzMkQ3LCAweDBGQjUyLCAweDAyODk3LCAweDAwNzdBLAorICAgIDB4MDNGNzIsIDB4MEZCNEUsIDB4MDUwQjUsIDB4MDA3NkUsIDB4MUYzMDEsIDB4MUYzMDIsCisgICAgMHgwNjUzMywgMHgwMUZENywgMHgxRjMwMCwgMHgwQTA2MSwgMHgxRjMwNCwgMHgxRjMwMywKKyAgICAweDA3RTU0LCAweDAyNEZELCAweDFGMzA1LCAweDA2NTM0LCAweDAyNjA2LCAweDBBMDYyLAorICAgIDB4MDA3QzAsIDB4MEEwNkEsIDB4MUYzMEYsIDB4MEZCNTQsIDB4MDM4NkQsIDB4MDA5RTYsCisgICAgMHgxRjMxMCwgMHgwNjUzOCwgMHgwMERCQSwgMHgwMTRBNCwgMHgwNTBCOSwgMHgxRjMxMSwKKyAgICAweDBBMDZCLCAweDAxMjhGLCAweDA3RTU1LCAweDFGMzEyLCAweDBGQjU1LCAweDAxQzU2LAorICAgIDB4MDdFNTYsIDB4MEZCNTYsIDB4MUYzMTMsIDB4MDUwQkEsIDB4MDFDNTcsIDB4MDI2MDgsCisgICAgMHgwQTA2NywgMHgxRjMwRCwgMHgxRjMwQywgMHgwMjYwNywgMHgwMzg2QywgMHgwQTA2OSwKKyAgICAweDBBMDY4LCAweDAxNTU3LCAweDAwRUQ3LCAweDA2NTM2LCAweDFGMzBFLCAweDBGQjUzLAorICAgIDB4MDI2MDksIDB4MDA3QkYsIDB4MDUwQjgsIDB4MDY1MzcsIDB4MDBERTUsIDB4MDAzOTIsCisgICAgMHgwM0Y2OSwgMHgwQTA1NSwgMHgwRkIzQywgMHgwQTA1NCwgMHgwMEFCNywgMHgwNTBBQiwKKyAgICAweDBGQjNELCAweDAwQ0U2LCAweDAwOUU4LCAweDAxNEExLCAweDA0OUE4LCAweDFGMkVELAorICAgIDB4MDI4OTAsIDB4MDA5RTksIDB4MDQ5QTksIDB4MUYyRUUsIDB4MDMyRDEsIDB4MDIwQzQsCisgICAgMHgwNDlBQSwgMHgwQTA1NiwgMHgwRkIzRSwgMHgwRkIzRiwgMHgwQTA1MSwgMHgwQTA1MiwKKyAgICAweDBBMDUzLCAweDBGQjM5LCAweDBBMDUwLCAweDAwOTZFLCAweDBGQjNBLCAweDFGMkVCLAorICAgIDB4MDI5RkUsIDB4MDA3RkUsIDB4MDEyOEQsIDB4MDQ5QTcsIDB4MUYyRUMsIDB4MDdFNTAsCisgICAgMHgwMEUzNiwgMHgwMzg2NywgMHgwRkIzQiwgMHgwMDZFQSwgMHgwM0Y2QiwgMHgxRjJGNCwKKyAgICAweDFGMkYzLCAweDAzODY4LCAweDA0OUFCLCAweDFGMkY2LCAweDAyOUZGLCAweDFGMkY1LAorICAgIDB4MEEwNUEsIDB4MDdFNTIsIDB4MUYyRjcsIDB4MDdFNTEsIDB4MDNGNkMsIDB4MUYyRkEsCisgICAgMHgwN0U1MywgMHgwMjVGRiwgMHgxRjJGOCwgMHgxRjJGOSwgMHgwMDlBMCwgMHgwNjUzMiwKKyAgICAweDBGQjQ1LCAweDAyNEZCLCAweDAwOEI5LCAweDAxRDdELCAweDBGQjQwLCAweDAxRkQzLAorICAgIDB4MEZCNDIsIDB4MEEwNTgsIDB4MDUwQUMsIDB4MEEwNTcsIDB4MEZCNDEsIDB4MEEwNTksCisgICAgMHgxRjJGMCwgMHgxRjJFRiwgMHgwRkI0MywgMHgwM0Y2QSwgMHgwRkI0NCwgMHgwMjBDNSwKKyAgICAweDFGMkYxLCAweDFGMkYyLCAweDAwNEZFLCAweDAyNjAxLCAweDAwQTU4LCAweDAxRkQ1LAorICAgIDB4MDQ5QUQsIDB4MDBBNDYsIDB4MDJBODAsIDB4MDUwQUQsIDB4MDA5RTUsIDB4MDFCNTYsCisgICAgMHgwMkE4MSwgMHgwMEEzNiwgMHgwMTU1NiwgMHgwMzJEMywgMHgwMkE4MiwgMHgwRkI0NywKKyAgICAweDFGMkZELCAweDA1MEFFLCAweDAwNEJBLCAweDAwQTZCLCAweDAzRjZELCAweDA0OUFFLAorICAgIDB4MDEzMTcsIDB4MDA5QTEsIDB4MDBBQjgsIDB4MDI4OTEsIDB4MDM4NjksIDB4MDFGRDQsCisgICAgMHgwNDlBQywgMHgxRjJGQiwgMHgwRkI0NiwgMHgwQTA1QiwgMHgwMjYwMCwgMHgwMzJEMiwKKyAgICAweDAxMzdFLCAweDAxQzUzLCAweDAyODkyLCAweDAwQkZFLCAweDBBMDVDLCAweDFGMkZDLAorICAgIDB4MDBDRTcsIDB4MDAwNTgsIDB4MDBGRjcsIDB4MDA5RUEsIDB4MDAwNjgsIDB4MDAwNjAsCisgICAgMHgwMDREMiwgMHgwMDRCRCwgMHgwMDBFRSwgMHgwMDNBNCwgMHgwMDZFMiwgMHgwMTM3RiwKKyAgICAweDAxOTdELCAweDAwNkVCLCAweDA1MEIwLCAweDAzRjZFLCAweDAwRTM3LCAweDAwMzE2LAorICAgIDB4MDI4OTMsIDB4MDA0Q0IsIDB4MDA2RUUsIDB4MDExNTIsIDB4MDA4QUUsIDB4MDA2N0UsCisgICAgMHgwMDk5MSwgMHgwMTQ1QSwgMHgwMEFCOSwgMHgwNDlBRiwgMHgwMkE4MywgMHgwMEE2QywKKyAgICAweDAwNDVGLCAweDAyNjAyLCAweDAwNkUxLCAweDA1MEFGLCAweDAxMkQyLCAweDAwNzNGLAorICAgIDB4MDAwNjEsIDB4MDA1MjYsIDB4MDA0RDYsIDB4MDAxM0UsIDB4MDAzQUUsIDB4MDAwNUUsCisgICAgMHgwMUQ3RSwgMHgwMjg5RiwgMHgwMDA1OSwgMHgwMDA2QSwgMHgwMDgyRCwgMHgwMEY3NywKKyAgICAweDAwOUVFLCAweDAwNkUzLCAweDAwRDNGLCAweDFGMzJCLCAweDAyQThCLCAweDAwRDNFLAorICAgIDB4MDMyREUsIDB4MEZCNjAsIDB4MDJBOEMsIDB4MDIwQ0MsIDB4MDM4NzQsIDB4MDA0NUIsCisgICAgMHgwMERFOCwgMHgwMDgyRSwgMHgwMDYzNiwgMHgwMTJENiwgMHgwNDlCOSwgMHgwMjYwQywKKyAgICAweDAxMTU3LCAweDA2NTQwLCAweDBBMDczLCAweDAyNTA0LCAweDAyODlELCAweDA1MEMyLAorICAgIDB4MDBBRkUsIDB4MDI2MEQsIDB4MDI4OUUsIDB4MDBBNkYsIDB4MDAwNEUsIDB4MDA2RUYsCisgICAgMHgwMDk5QywgMHgwMEVEQSwgMHgwMDYyRSwgMHgwMDA0OCwgMHgwMEEzQSwgMHgwMTI5MiwKKyAgICAweDAxM0MyLCAweDAwQTcyLCAweDAwMTJBLCAweDAyOEEwLCAweDAyNTA3LCAweDAwMTc0LAorICAgIDB4MDBERTksIDB4MDBBQkYsIDB4MDBFREUsIDB4MDExNDYsIDB4MDEzQzMsIDB4MDMyRTEsCisgICAgMHgwNDlCQSwgMHgwMzg3NSwgMHgwMzg3NiwgMHgwMDgyNCwgMHgwMDc3QiwgMHgwMzJFMiwKKyAgICAweDAxMDUwLCAweDAwNjc3LCAweDAwRURCLCAweDAxNDVDLCAweDAyNTA1LCAweDAzMkRGLAorICAgIDB4MDE5QzAsIDB4MDUwQzMsIDB4MDY1NDEsIDB4MEEwNzQsIDB4MDMyRTAsIDB4MDBBMzcsCisgICAgMHgwMjUwNiwgMHgwMEFCRSwgMHgwMEU3OCwgMHgwMkE4RCwgMHgwMDFCNCwgMHgwMkE4RSwKKyAgICAweDAxRDdGLCAweDAwMUE0LCAweDAwREVBLCAweDFGMzJGLCAweDA1MEM1LCAweDAwOUVGLAorICAgIDB4MDA5NzcsIDB4MDIwQ0QsIDB4MDFCNjAsIDB4MDE5QzMsIDB4MDE3REUsIDB4MDEzMUEsCisgICAgMHgwMjYwRiwgMHgwQTA3NSwgMHgwMUM1QywgMHgwRkI2MSwgMHgwN0U2MiwgMHgwMEU3OSwKKyAgICAweDAyNjEwLCAweDBBMDc2LCAweDAxNEE3LCAweDAyNjExLCAweDAwOUZBLCAweDAwN0MxLAorICAgIDB4MDE0NUQsIDB4MUYzMkMsIDB4MDQ5QkIsIDB4MDE5QzEsIDB4MDY1NDMsIDB4MUYzMkQsCisgICAgMHgwNjU0NCwgMHgwMUZEOCwgMHgwNjU0MiwgMHgwMUI1RSwgMHgwNjU0NSwgMHgxRjMyRSwKKyAgICAweDAxOUMyLCAweDAwNUY0LCAweDAyNjBFLCAweDA1MEM0LCAweDAxQjVGLCAweDAxQzVCLAorICAgIDB4MDMyRTMsIDB4MUYzMzksIDB4MUYzM0EsIDB4MUYzMzgsIDB4MEZCNjMsIDB4MDI4QTEsCisgICAgMHgxRjMzQiwgMHgwRkI2NCwgMHgwNDlCQywgMHgwQTA3QSwgMHgxRjMzQywgMHgwQTA3QiwKKyAgICAweDAzMkU0LCAweDA3RTYzLCAweDFGMzNFLCAweDA3RTY0LCAweDFGMzNELCAweDBGQjY1LAorICAgIDB4MDI4QTIsIDB4MDI2MTIsIDB4MDI2MTMsIDB4MDUwQzYsIDB4MDA5NjcsIDB4MDE1NUEsCisgICAgMHgwM0Y3OCwgMHgxRjMzMCwgMHgwQTA3NywgMHgwMzg3NywgMHgwQTA3OCwgMHgxRjMzMywKKyAgICAweDFGMzMxLCAweDFGMzMyLCAweDAzODc4LCAweDFGMzM1LCAweDFGMzM2LCAweDA2NTQ2LAorICAgIDB4MUYzMzQsIDB4MDY1NDcsIDB4MUYzMzcsIDB4MEEwNzksIDB4MEZCNjIsIDB4MDA2RkUsCisgICAgMHgxRjM0MiwgMHgwRkI2OSwgMHgwMDhBNywgMHgwMDlGQiwgMHgxRjM0MywgMHgxRjM0NCwKKyAgICAweDA1MEM3LCAweDA2NTRBLCAweDAyMENGLCAweDFGMzQ1LCAweDAyMENFLCAweDAxRkQ5LAorICAgIDB4MDI4QTUsIDB4MEEwN0MsIDB4MEEwN0QsIDB4MDUwQzgsIDB4MDEzQzYsIDB4MDNGN0EsCisgICAgMHgwQTA3RSwgMHgwMzg3QiwgMHgwMUM1RCwgMHgwMzg3OSwgMHgwNjU0OCwgMHgxRjMzRiwKKyAgICAweDAyOEEzLCAweDAwREJFLCAweDAzRjc5LCAweDFGMzQwLCAweDBGQjY2LCAweDAyOEE0LAorICAgIDB4MDA4QjIsIDB4MEZCNjcsIDB4MDM4N0EsIDB4MDEzMUIsIDB4MDA1RDUsIDB4MDY1NDksCisgICAgMHgxRjM0MSwgMHgwRkI2OCwgMHgwMTU1QiwgMHgwMERFNiwgMHgwN0U1OSwgMHgxRjMxOCwKKyAgICAweDAwMjY2LCAweDAwODIzLCAweDAxQjU3LCAweDBGQjU4LCAweDFGMzE5LCAweDAzODZGLAorICAgIDB4MDFCNTgsIDB4MDI4OTksIDB4MDUwQkIsIDB4MDBEQkIsIDB4MDFCNTksIDB4MDMyRDksCisgICAgMHgwNTBCQywgMHgxRjMxQSwgMHgwM0Y3NCwgMHgwMzJEQSwgMHgwQTA2RCwgMHgwNjUzOSwKKyAgICAweDAzODcwLCAweDAzODZFLCAweDFGMzE1LCAweDFGMzE0LCAweDAyNEZFLCAweDAxNzZBLAorICAgIDB4MDMyRDgsIDB4MEEwNkMsIDB4MUYzMTYsIDB4MDdFNTcsIDB4MDE0QTUsIDB4MDQ5QjUsCisgICAgMHgwN0U1OCwgMHgwMEQzQSwgMHgwMDc1QiwgMHgwMjg5OCwgMHgxRjMxNywgMHgwRkI1NywKKyAgICAweDAzRjczLCAweDAxQjVBLCAweDBGQjVCLCAweDA1MEJFLCAweDFGMzFGLCAweDBGQjVBLAorICAgIDB4MDY1M0IsIDB4MUYzMjAsIDB4MEZCNUMsIDB4MDdFNUMsIDB4MDdFNUQsIDB4MUYzMjIsCisgICAgMHgwNTBCRiwgMHgwQTA2RiwgMHgxRjMyMSwgMHgwRkI1RCwgMHgxRjMyNSwgMHgxRjMyMywKKyAgICAweDFGMzI0LCAweDAxQzU4LCAweDAwRUQ4LCAweDAyODlBLCAweDFGMzI2LCAweDAzRjc3LAorICAgIDB4MDEzQzAsIDB4MDY1M0EsIDB4MDNGNzUsIDB4MUYzMUIsIDB4MDI0RkYsIDB4MDNGNzYsCisgICAgMHgwRkI1OSwgMHgwN0U1QSwgMHgwQTA2RSwgMHgwMjUwMCwgMHgwN0U1QiwgMHgwMkE4NiwKKyAgICAweDA1MEJELCAweDFGMzFDLCAweDAzMkRCLCAweDFGMzFFLCAweDFGMzFELCAweDA0OUI2LAorICAgIDB4MDBDNDksIDB4MUYzMjksIDB4MUYzMjgsIDB4MDBCQkUsIDB4MDA4QTYsIDB4MDM4NzEsCisgICAgMHgwMUI1QiwgMHgwMkE4OCwgMHgwMTU1OCwgMHgwMjBDOSwgMHgwRkI1RiwgMHgwNDlCNywKKyAgICAweDAxNEE2LCAweDA3RTVGLCAweDFGMzJBLCAweDAxOTdGLCAweDAxQjVDLCAweDAzODcyLAorICAgIDB4MDA3MjYsIDB4MDExNTYsIDB4MDI1MDEsIDB4MDEwNEYsIDB4MDBDNDgsIDB4MDMyREMsCisgICAgMHgwNjUzQywgMHgwMTc2QiwgMHgxRjMyNywgMHgwNjUzRCwgMHgwMjg5QiwgMHgwN0U1RSwKKyAgICAweDBGQjVFLCAweDAxNzZFLCAweDBBMDcxLCAweDBBMDcwLCAweDAyNjBBLCAweDAwOTkzLAorICAgIDB4MDIwQzgsIDB4MDE3NkYsIDB4MDJBODcsIDB4MDI4OUMsIDB4MDAwNDIsIDB4MDBDRTgsCisgICAgMHgwMUM1QSwgMHgwMEY3NiwgMHgwMDhCQSwgMHgwMDFDOCwgMHgwMkE4QSwgMHgwMjUwMywKKyAgICAweDAwMTM2LCAweDAwQTZFLCAweDAyMENCLCAweDAwQTVCLCAweDAwOEFGLCAweDAwRUQ5LAorICAgIDB4MDM4NzMsIDB4MDY1M0YsIDB4MDdFNjEsIDB4MDUwQzEsIDB4MDA3QTksIDB4MDA2N0YsCisgICAgMHgwMTNDMSwgMHgwMTU1OSwgMHgwMEQzQiwgMHgwMERFNywgMHgwMUI1RCwgMHgwNTBDMCwKKyAgICAweDAyNjBCLCAweDAyQTg5LCAweDA2NTNFLCAweDBBMDcyLCAweDA3RTYwLCAweDA0OUI4LAorICAgIDB4MDBBNkQsIDB4MDI1MDIsIDB4MDBFNUYsIDB4MDEyRDMsIDB4MDIwQ0EsIDB4MDAxNUQsCisgICAgMHgwMzJERCwgMHgwMUM1OSwgMHgwMDE4RSwgMHgwMDBFMCwgMHgwN0U3NywgMHgwN0U3OCwKKyAgICAweDA3RTc2LCAweDA0OUM1LCAweDAwQkVBLCAweDBBMDkwLCAweDBBMDhGLCAweDAwQTNCLAorICAgIDB4MDNGODAsIDB4MDY1NUEsIDB4MDY1NUIsIDB4MDUwRDEsIDB4MEEwOTEsIDB4MUYzN0UsCisgICAgMHgxRjM3RiwgMHgxRjM3QywgMHgxRjM3RCwgMHgwRkI3NywgMHgwNjU1RCwgMHgwNTBEMiwKKyAgICAweDFGMzgwLCAweDA2NTVDLCAweDAyNjE4LCAweDA0OUMzLCAweDFGMzc5LCAweDBBMDhELAorICAgIDB4MDdFNzIsIDB4MDdFNzMsIDB4MUYzN0IsIDB4MUYzN0EsIDB4MEEwOEUsIDB4MDE0NUUsCisgICAgMHgwNjU1OCwgMHgwNjU1OSwgMHgwN0U3NCwgMHgwNDlDNCwgMHgwMDgzRiwgMHgwN0U3NSwKKyAgICAweDBGQjc2LCAweDAwN0FBLCAweDAwOEE4LCAweDFGMzgyLCAweDBGQjdCLCAweDAwN0FCLAorICAgIDB4MDA0QjIsIDB4MDUwRDUsIDB4MDdFN0MsIDB4MDdFN0IsIDB4MDMyRTgsIDB4MDI2MUEsCisgICAgMHgwN0U3RCwgMHgxRjM4MywgMHgwM0Y4MSwgMHgxRjM4NCwgMHgwNjU1RiwgMHgwRkI3QywKKyAgICAweDBBMDk0LCAweDBBMDk1LCAweDAyMEQzLCAweDFGMzg1LCAweDA1MEQ2LCAweDA1MEQ3LAorICAgIDB4MDFCNjEsIDB4MEZCNzgsIDB4MDdFNzksIDB4MDI4QTcsIDB4MDdFN0EsIDB4MEEwOTIsCisgICAgMHgxRjM4MSwgMHgwNTBEMywgMHgwRkI3OSwgMHgwMzJFNywgMHgwNjU1RSwgMHgwQTA5MywKKyAgICAweDAxREEyLCAweDAwNTNCLCAweDAyNjE5LCAweDA1MEQ0LCAweDBGQjdBLCAweDAyMEQyLAorICAgIDB4MDA5NEIsIDB4MEEwOUEsIDB4MEZCN0YsIDB4MEZCN0UsIDB4MDM4ODQsIDB4MDBDNEEsCisgICAgMHgwRkI4MCwgMHgxRjM4QiwgMHgwMTlDNiwgMHgwMzJFOSwgMHgwMUM1RiwgMHgwRkI4MiwKKyAgICAweDFGMzhDLCAweDBGQjgxLCAweDA1MEQ5LCAweDA3RTdFLCAweDFGMzhELCAweDFGMzhFLAorICAgIDB4MDM4ODUsIDB4MDUwREIsIDB4MDdFN0YsIDB4MDY1NjIsIDB4MDUwREEsIDB4MDBFN0EsCisgICAgMHgwMkE5MiwgMHgxRjM4NiwgMHgwQTA5NiwgMHgwNjU2MCwgMHgwNjU2MSwgMHgxRjM4OSwKKyAgICAweDFGMzg3LCAweDFGMzg4LCAweDA1MEQ4LCAweDBBMDk4LCAweDBGQjdELCAweDAyQTkzLAorICAgIDB4MEEwOTcsIDB4MDFGREMsIDB4MUYzOEEsIDB4MEEwOTksIDB4MDIwRDQsIDB4MDdFODIsCisgICAgMHgwRkI4OSwgMHgxRjM5NCwgMHgwN0U4MSwgMHgwQTA5RSwgMHgwRkI4QiwgMHgxRjM5NSwKKyAgICAweDA3RTgzLCAweDBGQjhBLCAweDAyOEE4LCAweDFGMzk3LCAweDFGMzk2LCAweDBBMDlGLAorICAgIDB4MEZCOEMsIDB4MDNGODIsIDB4MDQ5QzYsIDB4MUYzOTgsIDB4MUYzOTksIDB4MDY1NjMsCisgICAgMHgwMjUwOCwgMHgwMzg4NiwgMHgwN0U4NCwgMHgwMTJFNiwgMHgwQTA5QiwgMHgxRjM4RiwKKyAgICAweDAzMkVBLCAweDBGQjg1LCAweDFGMzkwLCAweDBGQjg2LCAweDBGQjgzLCAweDBGQjg0LAorICAgIDB4MEEwOUMsIDB4MUYzOTIsIDB4MUYzOTEsIDB4MEZCODcsIDB4MDJBOTQsIDB4MUYzOTMsCisgICAgMHgwQTA5RCwgMHgwN0U4MCwgMHgwRkI4OCwgMHgwMDZCNiwgMHgxRjM5RCwgMHgxRjM5RSwKKyAgICAweDBBMEExLCAweDBBMEEyLCAweDAxNTVFLCAweDFGMzlGLCAweDBBMEEzLCAweDAyNTA5LAorICAgIDB4MDIwRDUsIDB4MEEwQTQsIDB4MUYzQTAsIDB4MDdFODYsIDB4MDY1NjQsIDB4MDFGREUsCisgICAgMHgwRkI5MCwgMHgwNDlDOCwgMHgwNjU2NSwgMHgwNTBERSwgMHgwQTBBNiwgMHgwN0U4NywKKyAgICAweDBBMEE1LCAweDA2NTY2LCAweDAwRTdCLCAweDA0OUM3LCAweDFGMzlBLCAweDBBMEEwLAorICAgIDB4MDUwREMsIDB4MDBERUMsIDB4MDdFODUsIDB4MEZCOEQsIDB4MDFGREQsIDB4MDBDRTksCisgICAgMHgwNTBERCwgMHgwRkI4RSwgMHgxRjM5QiwgMHgwM0Y4MywgMHgwMDUxRiwgMHgxRjM5QywKKyAgICAweDBGQjhGLCAweDAxMjkzLCAweDAwOUEzLCAweDA0OUJFLCAweDFGMzRFLCAweDFGMzRELAorICAgIDB4MDY1NEIsIDB4MDExNUEsIDB4MEEwN0YsIDB4MDY1NEMsIDB4MDBBNDcsIDB4MDFDNUUsCisgICAgMHgwNDlCRiwgMHgxRjM1MCwgMHgxRjM0RiwgMHgwMzg3QywgMHgwN0U2NywgMHgxRjM1MSwKKyAgICAweDA3RTY2LCAweDAyQThGLCAweDFGMzUzLCAweDA3RTY4LCAweDFGMzU0LCAweDFGMzUyLAorICAgIDB4MEEwODAsIDB4MDBCQkYsIDB4MUYzNDcsIDB4MUYzNDgsIDB4MUYzNDYsIDB4MEZCNkEsCisgICAgMHgwMzJFNSwgMHgwN0U2NSwgMHgxRjM0OSwgMHgwMDZFNCwgMHgwMTJENywgMHgwNDlCRCwKKyAgICAweDFGMzRBLCAweDBGQjZCLCAweDA1MEM5LCAweDAwREVCLCAweDFGMzRDLCAweDFGMzRCLAorICAgIDB4MDA1MkUsIDB4MDdFNkEsIDB4MUYzNUYsIDB4MUYzNUUsIDB4MEEwODEsIDB4MDM4N0QsCisgICAgMHgxRjM2MSwgMHgwNjU0RiwgMHgxRjM2MCwgMHgwQTA4MiwgMHgwMzg3RSwgMHgxRjM2MywKKyAgICAweDFGMzYyLCAweDA1MENBLCAweDBBMDg0LCAweDFGMzY1LCAweDAzRjdELCAweDBBMDgzLAorICAgIDB4MUYzNjQsIDB4MDMyRTYsIDB4MUYzNjYsIDB4MEEwODUsIDB4MDY1NTAsIDB4MDIwRDAsCisgICAgMHgxRjM1NiwgMHgxRjM1NSwgMHgwMEE3MywgMHgxRjM1NywgMHgxRjM1OCwgMHgxRjM1OSwKKyAgICAweDA3RTY5LCAweDA2NTRELCAweDFGMzVCLCAweDBGQjZDLCAweDFGMzVBLCAweDA2NTRFLAorICAgIDB4MDNGN0IsIDB4MUYzNUQsIDB4MDNGN0MsIDB4MEZCNkQsIDB4MUYzNUMsIDB4MDA5QUEsCisgICAgMHgwMzg4MCwgMHgxRjM2QiwgMHgwQTA4NiwgMHgxRjM2QSwgMHgwMUZEQSwgMHgxRjM2QywKKyAgICAweDBBMDg3LCAweDAxMDUxLCAweDA0OUMyLCAweDBGQjcxLCAweDA3RTZFLCAweDBBMDg4LAorICAgIDB4MDNGN0UsIDB4MDY1NTMsIDB4MUYzNkUsIDB4MUYzNkQsIDB4MDY1NTIsIDB4MDI4QTYsCisgICAgMHgwMkE5MCwgMHgwQTA4OSwgMHgxRjM2RiwgMHgwMzg4MSwgMHgwMDc0QSwgMHgwNDlDMCwKKyAgICAweDBGQjZGLCAweDBGQjZFLCAweDAyNjE0LCAweDBGQjcwLCAweDFGMzY4LCAweDFGMzY3LAorICAgIDB4MDdFNkIsIDB4MDM4N0YsIDB4MDQ5QzEsIDB4MDdFNkMsIDB4MDY1NTEsIDB4MDUwQ0IsCisgICAgMHgwMTRBQSwgMHgwN0U2RCwgMHgxRjM2OSwgMHgwMjYxNSwgMHgwMDcyQywgMHgxRjM3MywKKyAgICAweDFGMzcyLCAweDAwOEJCLCAweDAwNDUwLCAweDA3RTcwLCAweDFGMzc1LCAweDFGMzc0LAorICAgIDB4MDUwQ0UsIDB4MDM4ODIsIDB4MUYzNzYsIDB4MEZCNzQsIDB4MDI2MTcsIDB4MUYzNzcsCisgICAgMHgxRjM3OCwgMHgwN0U3MSwgMHgwNjU1NywgMHgwRkI3NSwgMHgwNTBDRiwgMHgwNTBEMCwKKyAgICAweDBBMDhDLCAweDAzODgzLCAweDAyQTkxLCAweDA2NTU1LCAweDA1MENDLCAweDA2NTU0LAorICAgIDB4MEEwOEEsIDB4MUYzNzAsIDB4MDUwQ0QsIDB4MDY1NTYsIDB4MEZCNzIsIDB4MDI2MTYsCisgICAgMHgwN0U2RiwgMHgwQTA4QiwgMHgwMUZEQiwgMHgwMDUzQSwgMHgwM0Y3RiwgMHgwRkI3MywKKyAgICAweDFGMzcxLCAweDAyMEQxLCAweDAxRkUwLCAweDFGM0Y5LCAweDFGM0Y4LCAweDAyQTk4LAorICAgIDB4MDBDNEUsIDB4MEEwQjYsIDB4MEZCQjEsIDB4MUYzRkEsIDB4MEZCQjAsIDB4MUYzRkMsCisgICAgMHgxRjNGRCwgMHgxRjNGQiwgMHgwQTBCNywgMHgxRjQwMCwgMHgxRjQwMSwgMHgxRjQwMiwKKyAgICAweDFGM0ZFLCAweDFGM0ZGLCAweDFGNDA0LCAweDFGNDA1LCAweDBGQkIyLCAweDFGNDAzLAorICAgIDB4MUYzRUYsIDB4MUYzRjAsIDB4MUYzRUQsIDB4MUYzRUUsIDB4MUYzRjMsIDB4MUYzRjQsCisgICAgMHgwRkJBQiwgMHgxRjNGMSwgMHgxRjNGMiwgMHgwQTBCNSwgMHgxRjNGNiwgMHgxRjNGNSwKKyAgICAweDBGQkFDLCAweDAxMDUyLCAweDBGQkFGLCAweDFGM0Y3LCAweDBGQkFELCAweDBGQkFFLAorICAgIDB4MDA0QkMsIDB4MUY0MEQsIDB4MUY0MEUsIDB4MUY0MEMsIDB4MEZCQjgsIDB4MDQ5Q0MsCisgICAgMHgxRjQxMCwgMHgxRjQwRiwgMHgwM0Y4NywgMHgwQTBCOSwgMHgwQTBCQSwgMHgxRjQxMiwKKyAgICAweDBGQkI5LCAweDFGNDExLCAweDFGNDE1LCAweDFGNDE2LCAweDFGNDEzLCAweDFGNDE0LAorICAgIDB4MUY0MTgsIDB4MEEwQkIsIDB4MEZCQkEsIDB4MUY0MTcsIDB4MDdFOTUsIDB4MDdFOTMsCisgICAgMHgxRjQwNiwgMHgxRjQwNywgMHgwQTBCOCwgMHgwN0U5MiwgMHgwRkJCNSwgMHgxRjQwOCwKKyAgICAweDBGQkIzLCAweDBGQkI0LCAweDA3RTk0LCAweDBGQkI3LCAweDFGNDA5LCAweDBGQkI2LAorICAgIDB4MDNGODYsIDB4MDFEQTMsIDB4MUY0MEIsIDB4MUY0MEEsIDB4MDE5QzcsIDB4MDY1NzIsCisgICAgMHgxRjQyMSwgMHgxRjQyMCwgMHgwMjUwRiwgMHgwMERCRiwgMHgxRjQyMiwgMHgxRjQyMywKKyAgICAweDBGQkJFLCAweDA1MEUyLCAweDA0OUNELCAweDFGNDI1LCAweDFGNDI0LCAweDA3RTk3LAorICAgIDB4MUY0MjcsIDB4MEZCQzAsIDB4MUY0MjgsIDB4MEZCQkYsIDB4MUY0MjYsIDB4MUY0MkEsCisgICAgMHgxRjQyQiwgMHgxRjQyOSwgMHgwQTBDMCwgMHgwMTNDNywgMHgwQTBCRCwgMHgxRjQxOSwKKyAgICAweDBBMEJDLCAweDFGNDFDLCAweDFGNDFELCAweDFGNDFFLCAweDFGNDFBLCAweDFGNDFCLAorICAgIDB4MEZCQkMsIDB4MUY0MUYsIDB4MDY1NzEsIDB4MEZCQkIsIDB4MDFGRTEsIDB4MEZCQkQsCisgICAgMHgwQTBCRiwgMHgwQTBCRSwgMHgwN0U5NiwgMHgwRkJDNiwgMHgxRjQzNywgMHgxRjQzOCwKKyAgICAweDFGNDM1LCAweDFGNDM2LCAweDBBMEMzLCAweDFGNDNBLCAweDFGNDM5LCAweDBGQkM3LAorICAgIDB4MUY0M0IsIDB4MEZCQzksIDB4MEZCQ0EsIDB4MEZCQzgsIDB4MDdFOTksIDB4MEEwQzQsCisgICAgMHgwN0U5QSwgMHgxRjQzQywgMHgxRjQzRCwgMHgxRjQzRSwgMHgwQTBDNSwgMHgwNTBFNCwKKyAgICAweDBGQkNCLCAweDBGQkNDLCAweDA1MEUzLCAweDA3RTk4LCAweDBGQkMyLCAweDFGNDJDLAorICAgIDB4MEZCQzEsIDB4MUY0MkYsIDB4MUY0MzAsIDB4MUY0MkQsIDB4MUY0MkUsIDB4MEEwQzEsCisgICAgMHgxRjQzMiwgMHgxRjQzMywgMHgwRkJDMywgMHgxRjQzMSwgMHgwRkJDNSwgMHgxRjQzNCwKKyAgICAweDBGQkM0LCAweDBBMEMyLCAweDAwQUY2LCAweDFGNDQ0LCAweDBGQkNGLCAweDAyNjFDLAorICAgIDB4MDE0QUIsIDB4MEEwQzgsIDB4MUY0NDYsIDB4MUY0NDUsIDB4MDY1NzMsIDB4MDI2MUQsCisgICAgMHgxRjQ0OCwgMHgxRjQ0NywgMHgwMkE5OSwgMHgwRkJEMSwgMHgwQTBDOSwgMHgxRjQ0OSwKKyAgICAweDBGQkQwLCAweDA2NTc0LCAweDFGNDRDLCAweDA0OUNGLCAweDFGNDRBLCAweDFGNDRCLAorICAgIDB4MDMyRUMsIDB4MUY0NDAsIDB4MUY0M0YsIDB4MDdFOUIsIDB4MDFCNjIsIDB4MDM4OEEsCisgICAgMHgxRjQ0MSwgMHgwN0U5QywgMHgwQTBDNiwgMHgwMEQ2QSwgMHgwQTBDNywgMHgwRkJDRCwKKyAgICAweDA0OUNFLCAweDAwRURGLCAweDBGQkNFLCAweDFGNDQzLCAweDFGNDQyLCAweDA3RTlELAorICAgIDB4MDM4ODgsIDB4MEZCOTEsIDB4MUYzQTgsIDB4MDBFOTYsIDB4MDBDRUEsIDB4MEZCOTMsCisgICAgMHgwRkI5NCwgMHgwRkI5MiwgMHgxRjNBOSwgMHgwMzg4OSwgMHgwRkI5NSwgMHgwQTBBNywKKyAgICAweDAxNTVGLCAweDA1MEUwLCAweDBBMEE4LCAweDFGM0FCLCAweDFGM0FBLCAweDA3RTg5LAorICAgIDB4MDdFOEEsIDB4MEEwQUEsIDB4MEZCOTYsIDB4MEEwQTksIDB4MDY1NjcsIDB4MUYzQTIsCisgICAgMHgxRjNBMSwgMHgwMkE5NSwgMHgwMjUwQSwgMHgwNjU2OCwgMHgxRjNBNCwgMHgxRjNBMywKKyAgICAweDA1MERGLCAweDAyQTk2LCAweDFGM0E1LCAweDA2NTY5LCAweDAwQzRCLCAweDAwQUZGLAorICAgIDB4MDM4ODcsIDB4MUYzQTcsIDB4MUYzQTYsIDB4MDdFODgsIDB4MDI2MUIsIDB4MUYzQkMsCisgICAgMHgxRjNCRCwgMHgxRjNCQSwgMHgxRjNCQiwgMHgwNjU2QywgMHgwRkI5NywgMHgxRjNCRSwKKyAgICAweDA2NTZCLCAweDFGM0MwLCAweDBGQjk4LCAweDFGM0MxLCAweDA3RThDLCAweDFGM0JGLAorICAgIDB4MUYzQzIsIDB4MEZCOUEsIDB4MEZCOTksIDB4MEEwQUMsIDB4MDY1NkQsIDB4MEZCOUIsCisgICAgMHgxRjNDNCwgMHgxRjNDMywgMHgwN0U4RCwgMHgwNDlDOSwgMHgwQTBBQiwgMHgxRjNBRSwKKyAgICAweDFGM0FDLCAweDFGM0FELCAweDFGM0IxLCAweDFGM0IyLCAweDFGM0FGLCAweDFGM0IwLAorICAgIDB4MUYzQjUsIDB4MUYzQjYsIDB4MUYzQjcsIDB4MUYzQjMsIDB4MUYzQjQsIDB4MDY1NkEsCisgICAgMHgxRjNCOSwgMHgxRjNCOCwgMHgwN0U4QiwgMHgwM0Y4NCwgMHgxRjNDRiwgMHgxRjNDRSwKKyAgICAweDAzMkVCLCAweDAyNTBCLCAweDBGQjlFLCAweDBBMEFGLCAweDFGM0QwLCAweDBBMEFFLAorICAgIDB4MEEwQjEsIDB4MUYzRDEsIDB4MEEwQjAsIDB4MDQ5Q0EsIDB4MUYzRDMsIDB4MUYzRDQsCisgICAgMHgwRkJBMCwgMHgwRkI5RiwgMHgxRjNEMiwgMHgwRkJBMSwgMHgwQTBCMiwgMHgxRjNENSwKKyAgICAweDA3RTkwLCAweDA3RThFLCAweDFGM0M2LCAweDFGM0M1LCAweDA2NTZFLCAweDFGM0M3LAorICAgIDB4MUYzQzgsIDB4MDY1NkYsIDB4MDdFOEYsIDB4MEZCOUMsIDB4MEEwQUQsIDB4MEZCOUQsCisgICAgMHgxRjNDOSwgMHgwNTBFMSwgMHgwMUZERiwgMHgxRjNDQywgMHgxRjNDRCwgMHgxRjNDQSwKKyAgICAweDFGM0NCLCAweDAwNDEwLCAweDBGQkE5LCAweDFGM0RGLCAweDFGM0RFLCAweDBGQkE4LAorICAgIDB4MDJBOTcsIDB4MUYzRTEsIDB4MUYzRTAsIDB4MDI1MEUsIDB4MEZCQUEsIDB4MUYzRTMsCisgICAgMHgxRjNFNCwgMHgwN0U5MSwgMHgxRjNFMiwgMHgxRjNFNywgMHgxRjNFOCwgMHgxRjNFNSwKKyAgICAweDFGM0U2LCAweDFGM0VBLCAweDFGM0VCLCAweDFGM0VDLCAweDFGM0U5LCAweDBBMEI0LAorICAgIDB4MDNGODUsIDB4MEZCQTQsIDB4MUYzRDYsIDB4MEZCQTIsIDB4MEZCQTMsIDB4MUYzRDgsCisgICAgMHgwRkJBNiwgMHgxRjNENywgMHgwRkJBNSwgMHgxRjNEQiwgMHgwQTBCMywgMHgxRjNEQywKKyAgICAweDFGM0Q5LCAweDFGM0RBLCAweDA0OUNCLCAweDBGQkE3LCAweDFGM0RELCAweDA2NTcwLAorICAgIDB4MDAxNEMsIDB4MUY0QTYsIDB4MUY0QTcsIDB4MUY0QTUsIDB4MEZCRTcsIDB4MDBERUYsCisgICAgMHgxRjRBOSwgMHgxRjRBOCwgMHgwMTE2NiwgMHgwNTBFQiwgMHgwNTBFQywgMHgxRjRBQiwKKyAgICAweDFGNEFBLCAweDBBMEQ3LCAweDBGQkU4LCAweDFGNEFELCAweDFGNEFDLCAweDBBMEQ4LAorICAgIDB4MEEwRDksIDB4MUY0QjAsIDB4MUY0QjEsIDB4MUY0QUUsIDB4MUY0QUYsIDB4MEZCRTYsCisgICAgMHgxRjQ5QywgMHgxRjQ5RCwgMHgxRjQ5QiwgMHgwRkJFNSwgMHgwN0VBMiwgMHgxRjQ5RiwKKyAgICAweDFGNDlFLCAweDBBMEQ2LCAweDAxOUY2LCAweDFGNEExLCAweDFGNEEyLCAweDFGNEEwLAorICAgIDB4MDUwRUEsIDB4MDFDOUUsIDB4MUY0QTQsIDB4MUY0QTMsIDB4MDEzM0EsIDB4MDBFNEUsCisgICAgMHgxRjRCRSwgMHgxRjRCRCwgMHgwMEJFRSwgMHgwMDFBRSwgMHgwNTBFRSwgMHgxRjRDMCwKKyAgICAweDFGNEJGLCAweDA1MEVELCAweDAyMERBLCAweDFGNEMyLCAweDFGNEMxLCAweDA1MEVGLAorICAgIDB4MEZCRUIsIDB4MUY0QzMsIDB4MUY0QzQsIDB4MEZCRTksIDB4MEZCRUEsIDB4MUY0QzYsCisgICAgMHgxRjRDNywgMHgxRjRDNSwgMHgwQTBEQywgMHgxRjRCNCwgMHgxRjRCNSwgMHgxRjRCMiwKKyAgICAweDFGNEIzLCAweDAzRjhBLCAweDFGNEI3LCAweDFGNEI4LCAweDFGNEI2LCAweDBBMERBLAorICAgIDB4MDJBOUIsIDB4MUY0QkEsIDB4MUY0QjksIDB4MDE0NUYsIDB4MDA0QUQsIDB4MEEwREIsCisgICAgMHgxRjRCQywgMHgxRjRCQiwgMHgwM0Y4QiwgMHgwMDNBNiwgMHgwQTBERSwgMHgxRjREMSwKKyAgICAweDFGNEQwLCAweDBGQkVELCAweDAwRENBLCAweDBGQkVFLCAweDFGNEQyLCAweDAwRUZFLAorICAgIDB4MDIwOTYsIDB4MEEwREYsIDB4MUY0RDQsIDB4MUY0RDMsIDB4MDdFQTYsIDB4MEZCRUYsCisgICAgMHgxRjRENiwgMHgxRjRENSwgMHgwQTBFMCwgMHgxRjREOSwgMHgxRjREQSwgMHgxRjREQiwKKyAgICAweDFGNEQ3LCAweDFGNEQ4LCAweDA3RUEzLCAweDFGNENBLCAweDFGNENCLCAweDFGNEM4LAorICAgIDB4MUY0QzksIDB4MDM4OEUsIDB4MEZCRUMsIDB4MUY0Q0MsIDB4MDQ5RDgsIDB4MDBDRUIsCisgICAgMHgwNjU3QSwgMHgwQTBERCwgMHgxRjRDRCwgMHgwNDlEOSwgMHgwMDUyMSwgMHgxRjRDRiwKKyAgICAweDFGNENFLCAweDAwQ0ZBLCAweDAxQjY3LCAweDFGNEU0LCAweDFGNEUzLCAweDAzMkVGLAorICAgIDB4MDAyOTIsIDB4MEZCRjIsIDB4MUY0RTYsIDB4MUY0RTUsIDB4MEZCRjEsIDB4MDE0RDIsCisgICAgMHgwQTBFNSwgMHgwQTBFNCwgMHgwMjhBQSwgMHgxRjRFOSwgMHgwNjU3RiwgMHgxRjRFQSwKKyAgICAweDFGNEU3LCAweDFGNEU4LCAweDFGNEVELCAweDFGNEVFLCAweDFGNEVCLCAweDFGNEVDLAorICAgIDB4MDQxMkUsIDB4MUY0REMsIDB4MEEwRTEsIDB4MEEwRTIsIDB4MDQ5REEsIDB4MUY0REUsCisgICAgMHgxRjRERiwgMHgxRjRERCwgMHgwNjU3QiwgMHgwMUI2NiwgMHgxRjRFMCwgMHgwRkJGMCwKKyAgICAweDAzODhGLCAweDAwNTIyLCAweDBBMEUzLCAweDFGNEUyLCAweDFGNEUxLCAweDA2NTdFLAorICAgIDB4MDA3QzIsIDB4MEEwRUIsIDB4MUY0RjgsIDB4MUY0RjcsIDB4MEZCRjUsIDB4MDBGN0EsCisgICAgMHgxRjRGOSwgMHgwRkJGNiwgMHgwMjBEQiwgMHgwMjhBQiwgMHgxRjRGQiwgMHgxRjRGQywKKyAgICAweDFGNEZBLCAweDBGQkY3LCAweDAxREZFLCAweDBCRUZBLCAweDFGNEZELCAweDA3RUE3LAorICAgIDB4MUY1MDIsIDB4MTNGQzIsIDB4MUY1MDMsIDB4MUY0RkUsIDB4MUY0RkYsIDB4MUY0RjEsCisgICAgMHgwRkJGMywgMHgxRjRGMiwgMHgxRjRFRiwgMHgxRjRGMCwgMHgwMjU3NiwgMHgwQTBFNywKKyAgICAweDFGNEYzLCAweDBBMEU2LCAweDA3MDkyLCAweDBGQkY0LCAweDFGNEY1LCAweDFGNEY0LAorICAgIDB4MDQ5REIsIDB4MDA5NkYsIDB4MUY0RjYsIDB4MEEwRUEsIDB4MDI2MjMsIDB4MDA2RkYsCisgICAgMHgxRjQ1QywgMHgxRjQ1RCwgMHgxRjQ1QiwgMHgwN0U5RSwgMHgwM0Y4OCwgMHgxRjQ1RiwKKyAgICAweDFGNDVFLCAweDAyMEQ3LCAweDA2NTc1LCAweDFGNDYyLCAweDBGQkQyLCAweDFGNDYwLAorICAgIDB4MUY0NjEsIDB4MUY0NjQsIDB4MEZCRDQsIDB4MEZCRDMsIDB4MUY0NjMsIDB4MUY0NjcsCisgICAgMHgxRjQ2OCwgMHgxRjQ2OSwgMHgxRjQ2NSwgMHgxRjQ2NiwgMHgxRjQ0RiwgMHgxRjQ1MCwKKyAgICAweDFGNDUxLCAweDFGNDRELCAweDFGNDRFLCAweDFGNDUzLCAweDFGNDU0LCAweDFGNDUyLAorICAgIDB4MDIwRDYsIDB4MDM4OEIsIDB4MUY0NTcsIDB4MUY0NTgsIDB4MUY0NTUsIDB4MUY0NTYsCisgICAgMHgwMjhBOSwgMHgxRjQ1QSwgMHgxRjQ1OSwgMHgwMERFRCwgMHgwMjBEOCwgMHgxRjQ3MiwKKyAgICAweDFGNDcxLCAweDAyNjFGLCAweDAwNkYwLCAweDBGQkQ2LCAweDFGNDc0LCAweDFGNDczLAorICAgIDB4MDUwRTUsIDB4MDQ5RDMsIDB4MEZCRDcsIDB4MUY0NzUsIDB4MDE1RUUsIDB4MUY0NzcsCisgICAgMHgwQTBDRCwgMHgxRjQ3OCwgMHgxRjQ3NiwgMHgwNTBFNiwgMHgxRjQ3QSwgMHgxRjQ3QiwKKyAgICAweDFGNDc5LCAweDBBMENFLCAweDBBMENCLCAweDFGNDZBLCAweDBBMENBLCAweDAyNjFFLAorICAgIDB4MDQ5RDAsIDB4MEEwQ0MsIDB4MUY0NkMsIDB4MUY0NkIsIDB4MDY1NzYsIDB4MDQ5RDEsCisgICAgMHgxRjQ2RSwgMHgxRjQ2RCwgMHgwMUZFMiwgMHgwMDRERSwgMHgwNDlEMiwgMHgxRjQ3MCwKKyAgICAweDFGNDZGLCAweDBGQkQ1LCAweDAwMzc2LCAweDBGQkRCLCAweDBGQkRDLCAweDFGNDgyLAorICAgIDB4MEEwRDAsIDB4MDBDNUUsIDB4MUY0ODQsIDB4MUY0ODMsIDB4MDBCRUIsIDB4MDIwRDksCisgICAgMHgwNjU3OCwgMHgxRjQ4NiwgMHgxRjQ4NSwgMHgwN0U5RiwgMHgwQTBEMSwgMHgxRjQ4NywKKyAgICAweDA3RUEwLCAweDA1MEU4LCAweDFGNDg4LCAweDBGQkRGLCAweDFGNDg5LCAweDBGQkRELAorICAgIDB4MEZCREUsIDB4MDUwRTcsIDB4MEEwQ0YsIDB4MUY0N0QsIDB4MUY0N0MsIDB4MEZCRDgsCisgICAgMHgwNjU3NywgMHgxRjQ3RiwgMHgxRjQ3RSwgMHgwMzJFRCwgMHgwMTJCQSwgMHgwM0Y4OSwKKyAgICAweDBGQkQ5LCAweDFGNDgwLCAweDAzMkVFLCAweDAwQzRGLCAweDFGNDgxLCAweDBGQkRBLAorICAgIDB4MDFCNjMsIDB4MDBERUUsIDB4MEZCRTEsIDB4MUY0OTEsIDB4MDExNUIsIDB4MDAxQ0UsCisgICAgMHgwNDlENiwgMHgxRjQ5MywgMHgxRjQ5MiwgMHgwQTBENCwgMHgwNDlENywgMHgxRjQ5NSwKKyAgICAweDFGNDk0LCAweDAyQTlBLCAweDBBMEQ1LCAweDBGQkUzLCAweDFGNDk3LCAweDFGNDk2LAorICAgIDB4MEZCRTIsIDB4MEZCRTQsIDB4MUY0OUEsIDB4MUY0OTgsIDB4MUY0OTksIDB4MDQ5RDQsCisgICAgMHgxRjQ4QSwgMHgwQTBEMiwgMHgwRkJFMCwgMHgwNDlENSwgMHgwQTBEMywgMHgxRjQ4QywKKyAgICAweDFGNDhCLCAweDA3RUExLCAweDAxRkUzLCAweDFGNDhFLCAweDFGNDhELCAweDAyNjIyLAorICAgIDB4MDA1MjAsIDB4MDUwRTksIDB4MUY0OTAsIDB4MUY0OEYsIDB4MDY1NzksIDB4MDAxOEEsCisgICAgMHgwOUZFNiwgMHgxRjBFNiwgMHgxRjBFNSwgMHgwNDU5QywgMHgwMERDQiwgMHgxRjBFNywKKyAgICAweDBGQTk2LCAweDAxMkQwLCAweDAyMEE2LCAweDFGMEU5LCAweDFGMEVBLCAweDFGMEU4LAorICAgIDB4MEZBOTcsIDB4MDlGRTcsIDB4MUYwRUMsIDB4MUYwRUIsIDB4MDYzNzAsIDB4MDlGRTgsCisgICAgMHgxRjBFRSwgMHgxRjBFRiwgMHgwRkE5OCwgMHgxRjBFRCwgMHgxRjBEQywgMHgxRjBERCwKKyAgICAweDFGMERFLCAweDFGMERBLCAweDFGMERCLCAweDFGMERGLCAweDFGMEUwLCAweDBGQTkzLAorICAgIDB4MEZBOTQsIDB4MDUwN0MsIDB4MUYwRTIsIDB4MUYwRTMsIDB4MUYwRTEsIDB4MDUwN0IsCisgICAgMHgwMEFBRSwgMHgxRjBFNCwgMHgwRkE5NSwgMHgwMEY1RCwgMHgwMERCNCwgMHgwRkE5QywKKyAgICAweDFGMEY5LCAweDAwRkYyLCAweDAwM0FDLCAweDFGMEZCLCAweDFGMEZDLCAweDFGMEZBLAorICAgIDB4MDI5RTAsIDB4MDI1Q0YsIDB4MUYwRkUsIDB4MUYwRkQsIDB4MDI5RTEsIDB4MDI5RTIsCisgICAgMHgwOUZFOSwgMHgxRjE4MCwgMHgxRjBGRiwgMHgwN0UwNCwgMHgwRkE5RCwgMHgxRjE4MywKKyAgICAweDFGMTgxLCAweDFGMTgyLCAweDBGQTlBLCAweDFGMEYxLCAweDBGQTk5LCAweDFGMEYwLAorICAgIDB4MDM4NEMsIDB4MUYwRjMsIDB4MUYwRjQsIDB4MUYwRjIsIDB4MEZBOUIsIDB4MDE5RjcsCisgICAgMHgxRjBGNiwgMHgxRjBGNSwgMHgwMjg3OCwgMHgwMDE4QywgMHgwNjM3MSwgMHgxRjBGOCwKKyAgICAweDFGMEY3LCAweDA3RTAzLCAweDAwMkZDLCAweDA1MDdFLCAweDFGMThFLCAweDFGMThELAorICAgIDB4MDYzNzMsIDB4MDBEMkMsIDB4MUYxOTAsIDB4MUYxOEYsIDB4MDEzNTYsIDB4MDEzNTcsCisgICAgMHgwRkFBMCwgMHgxRjE5MiwgMHgxRjE5MSwgMHgwNTA3RiwgMHgwMjg3OSwgMHgxRjE5NCwKKyAgICAweDFGMTkzLCAweDAzODRELCAweDFGMTk3LCAweDBGQUExLCAweDBGQUEyLCAweDFGMTk1LAorICAgIDB4MUYxOTYsIDB4MUYxODYsIDB4MUYxODcsIDB4MUYxODgsIDB4MUYxODQsIDB4MUYxODUsCisgICAgMHgwNTA3RCwgMHgxRjE4OSwgMHgwRkE5RSwgMHgwNjM3MiwgMHgwMjBBNywgMHgwN0UwNSwKKyAgICAweDFGMThCLCAweDFGMThBLCAweDA5RkVBLCAweDAwQUY4LCAweDBGQTlGLCAweDFGMThDLAorICAgIDB4MDBBMzAsIDB4MDEwNkYsIDB4MUYxOUYsIDB4MUYxOUUsIDB4MDFBRDYsIDB4MDA1RjYsCisgICAgMHgxRjFBMSwgMHgxRjFBMiwgMHgxRjFBMCwgMHgwRkFBOCwgMHgwMDk5RSwgMHgwRkFBOSwKKyAgICAweDFGMUEzLCAweDA2Mzc1LCAweDA0NTlFLCAweDA3RTA3LCAweDFGMUE2LCAweDFGMUE0LAorICAgIDB4MUYxQTUsIDB4MDlGRUMsIDB4MEZBQUEsIDB4MUYxQTcsIDB4MDlGRUIsIDB4MEZBQTQsCisgICAgMHgxRjE5OSwgMHgxRjE5OCwgMHgwRkFBMywgMHgwRkFBNiwgMHgwNDU5RCwgMHgxRjE5QiwKKyAgICAweDFGMTlBLCAweDBGQUE1LCAweDAxQzQ5LCAweDA3RTA2LCAweDFGMTlDLCAweDAzRjU2LAorICAgIDB4MDA3N0UsIDB4MDUwODAsIDB4MUYxOUQsIDB4MEZBQTcsIDB4MDYzNzQsIDB4MDA4QTIsCisgICAgMHgxRjFCMywgMHgxRjFCNCwgMHgwRkFBRSwgMHgxRjFCMiwgMHgwMEFCMCwgMHgxRjFCNiwKKyAgICAweDFGMUI1LCAweDA0OTgwLCAweDAzODRFLCAweDBGQUFGLCAweDFGMUI4LCAweDFGMUI3LAorICAgIDB4MDYzNzcsIDB4MDQ5ODEsIDB4MUYxQkEsIDB4MUYxQjksIDB4MDdFMDksIDB4MDdFMEEsCisgICAgMHgxRjFCQywgMHgxRjFCRCwgMHgxRjFCQiwgMHgwRkFCMCwgMHgxRjFBQSwgMHgxRjFBQiwKKyAgICAweDFGMUFDLCAweDFGMUE4LCAweDFGMUE5LCAweDBGQUFDLCAweDA3RTA4LCAweDBGQUFCLAorICAgIDB4MUYxQUQsIDB4MDI5RTMsIDB4MDYzNzYsIDB4MEZBQUQsIDB4MUYxQUUsIDB4MUYxQUYsCisgICAgMHgwNDU5RiwgMHgxRjFCMSwgMHgxRjFCMCwgMHgwMUFENywgMHgwMDgyMiwgMHgxREZGMiwKKyAgICAweDFERkYzLCAweDFERkYxLCAweDBGQTgyLCAweDAzRjUyLCAweDFERkY1LCAweDFERkY0LAorICAgIDB4MDBCRjYsIDB4MDYyRjgsIDB4MDdERkQsIDB4MURGRjcsIDB4MURGRjYsIDB4MDlGRTAsCisgICAgMHgwNjJGOSwgMHgxREZGOSwgMHgxREZGOCwgMHgwMjlBNiwgMHgwRkE4MywgMHgxREZGQywKKyAgICAweDFERkZELCAweDFERkZBLCAweDFERkZCLCAweDEzRkMzLCAweDE3REY2LCAweDE3REY3LAorICAgIDB4MEZBODAsIDB4MDQxMkYsIDB4MDUwNzQsIDB4MUMyNEMsIDB4MDVGN0MsIDB4MDVGN0UsCisgICAgMHgwMzg0OCwgMHgwNUY3RiwgMHgxQzI0RSwgMHgxQzI0RCwgMHgwN0RGQywgMHgwMUZDNiwKKyAgICAweDFERkYwLCAweDFDMjRGLCAweDAyNTc3LCAweDAyOUE3LCAweDFFRjY3LCAweDFFRjY2LAorICAgIDB4MDI0RUUsIDB4MDAzQkUsIDB4MEZBODgsIDB4MUVGNjksIDB4MUVGNjgsIDB4MDYyRkEsCisgICAgMHgwMzg0QiwgMHgxRUY2QiwgMHgxRUY2QSwgMHgwMTVFRiwgMHgwNTA3NiwgMHgwRkE4OSwKKyAgICAweDFFRjZELCAweDFFRjZDLCAweDA3RTAwLCAweDFFRjZGLCAweDBGQThBLCAweDFFRjZFLAorICAgIDB4MDYyRkIsIDB4MUVGNjAsIDB4MEZBODQsIDB4MURGRkUsIDB4MURGRkYsIDB4MDdERkUsCisgICAgMHgwRkE4NSwgMHgxRUY2MiwgMHgxRUY2MSwgMHgwM0Y1NCwgMHgwMzg0QSwgMHgxRUY2MywKKyAgICAweDBGQTg2LCAweDAwRTMwLCAweDAwMkVDLCAweDBGQTg3LCAweDFFRjY1LCAweDFFRjY0LAorICAgIDB4MDdERkYsIDB4MDAyRkUsIDB4MDlGRTMsIDB4MUVGN0MsIDB4MUVGN0IsIDB4MDdFMDEsCisgICAgMHgwMDk1QywgMHgxRUY3RSwgMHgxRUY3RCwgMHgwMTQ1NiwgMHgwMTMzQiwgMHgwNTA3NywKKyAgICAweDFGMEMwLCAweDFFRjdGLCAweDA2MkZELCAweDA1MDc4LCAweDFGMEMyLCAweDFGMEMxLAorICAgIDB4MDFDNDYsIDB4MDNGNTUsIDB4MUYwQzQsIDB4MUYwQzUsIDB4MUYwQzMsIDB4MEZBOEQsCisgICAgMHgxRUY3MiwgMHgxRUY3MywgMHgxRUY3NCwgMHgxRUY3MCwgMHgxRUY3MSwgMHgwNjJGQywKKyAgICAweDFFRjc1LCAweDBGQThCLCAweDA5RkUyLCAweDAxNTRFLCAweDFFRjc4LCAweDBGQThDLAorICAgIDB4MUVGNzYsIDB4MUVGNzcsIDB4MDBGNUMsIDB4MUVGN0EsIDB4MUVGNzksIDB4MDBEQjIsCisgICAgMHgwMTA2RSwgMHgxRjBEMywgMHgxRjBEMiwgMHgwMEVEMCwgMHgwMDQ1QSwgMHgwN0UwMiwKKyAgICAweDBGQThGLCAweDFGMEQ0LCAweDFGMEQ1LCAweDAxQzQ4LCAweDBGQTkxLCAweDBGQTkwLAorICAgIDB4MDI1Q0UsIDB4MDMyQkUsIDB4MDYyRkYsIDB4MUYwRDcsIDB4MUYwRDYsIDB4MEZBOTIsCisgICAgMHgwOUZFNSwgMHgxRjBEOSwgMHgxRjBEOCwgMHgwOUZFNCwgMHgxRjBDOCwgMHgxRjBDOSwKKyAgICAweDFGMEM2LCAweDFGMEM3LCAweDA1MDc5LCAweDFGMENCLCAweDFGMENDLCAweDFGMENBLAorICAgIDB4MEZBOEUsIDB4MDUwN0EsIDB4MUYwQ0UsIDB4MUYwQ0QsIDB4MDI0RUYsIDB4MDAxOEYsCisgICAgMHgxRjBEMCwgMHgxRjBEMSwgMHgxRjBDRiwgMHgwNjJGRSwgMHgwNDk4NiwgMHgxRjIxMSwKKyAgICAweDFGMjEwLCAweDAyOUU1LCAweDAxNDlDLCAweDA5RkZGLCAweDFGMjEyLCAweDBGQUQ1LAorICAgIDB4MEZBRDYsIDB4MEZBRDgsIDB4MUYyMTQsIDB4MUYyMTMsIDB4MEZBRDcsIDB4MEEwMDAsCisgICAgMHgwQTAwMSwgMHgxRjIxNiwgMHgxRjIxNSwgMHgwRkFEOSwgMHgwQTAwMywgMHgwRkFEQSwKKyAgICAweDFGMjE3LCAweDBBMDAyLCAweDBGQUQxLCAweDFGMjA1LCAweDFGMjAzLCAweDFGMjA0LAorICAgIDB4MUYyMDcsIDB4MUYyMDgsIDB4MUYyMDksIDB4MUYyMDYsIDB4MEZBRDIsIDB4MUYyMEMsCisgICAgMHgwRkFEMywgMHgxRjIwQSwgMHgxRjIwQiwgMHgwMEUzMSwgMHgwRkFENCwgMHgxRjIwRiwKKyAgICAweDFGMjBELCAweDFGMjBFLCAweDAwM0JDLCAweDFGMjIxLCAweDBGQURELCAweDFGMjFGLAorICAgIDB4MUYyMjAsIDB4MDFEMkUsIDB4MUYyMjMsIDB4MUYyMjIsIDB4MDM4NEYsIDB4MEEwMDcsCisgICAgMHgxRjIyNSwgMHgxRjIyNiwgMHgwN0UxOCwgMHgxRjIyNCwgMHgxRjIyOSwgMHgxRjIyQSwKKyAgICAweDFGMjI3LCAweDFGMjI4LCAweDAxQURELCAweDBBMDA5LCAweDFGMjJCLCAweDBBMDA4LAorICAgIDB4MDQ5ODcsIDB4MEZBREMsIDB4MDdFMTYsIDB4MUYyMTgsIDB4MEZBREIsIDB4MDdFMTUsCisgICAgMHgxRjIxQiwgMHgxRjIxQywgMHgxRjIxOSwgMHgxRjIxQSwgMHgwNjM3QSwgMHgwQTAwNSwKKyAgICAweDBBMDA2LCAweDA3RTE3LCAweDBBMDA0LCAweDAyNUYwLCAweDFGMjFFLCAweDFGMjFELAorICAgIDB4MDFBREMsIDB4MDUwODgsIDB4MUYyMzUsIDB4MUYyMzQsIDB4MDUwODcsIDB4MDE5NzgsCisgICAgMHgxRjIzOCwgMHgwN0UxQSwgMHgxRjIzNiwgMHgxRjIzNywgMHgwN0UxQywgMHgxRjIzOSwKKyAgICAweDBGQUUyLCAweDA3RTFCLCAweDFGMjNCLCAweDBBMDBELCAweDFGMjNDLCAweDFGMjNBLAorICAgIDB4MEZBRTMsIDB4MDE5NzksIDB4MEEwMEUsIDB4MUYyM0QsIDB4MDQ5ODksIDB4MUYyMkUsCisgICAgMHgxRjIyRiwgMHgxRjIyQywgMHgxRjIyRCwgMHgxRjIzMSwgMHgwQTAwQSwgMHgxRjIzMiwKKyAgICAweDBGQURFLCAweDFGMjMwLCAweDA0OTg4LCAweDBGQURGLCAweDFGMjMzLCAweDA3RTE5LAorICAgIDB4MDFBREUsIDB4MEEwMEMsIDB4MEZBRTEsIDB4MEZBRTAsIDB4MEEwMEIsIDB4MDMyQzIsCisgICAgMHgxRjI0OSwgMHgxRjI0QSwgMHgxRjI0OCwgMHgwQTAxMCwgMHgwNTA4OSwgMHgxRjI0QywKKyAgICAweDBBMDExLCAweDFGMjRCLCAweDBBMDEyLCAweDBGQUVBLCAweDFGMjRFLCAweDA1MDhBLAorICAgIDB4MUYyNEQsIDB4MEEwMTQsIDB4MUYyNTAsIDB4MEEwMTMsIDB4MUYyNEYsIDB4MDI5RTYsCisgICAgMHgwN0UxRCwgMHgxRjI1MywgMHgxRjI1MSwgMHgxRjI1MiwgMHgwRkFFNCwgMHgwRkFFNSwKKyAgICAweDBGQUU2LCAweDFGMjNFLCAweDFGMjNGLCAweDFGMjQyLCAweDBBMDBGLCAweDFGMjQwLAorICAgIDB4MUYyNDEsIDB4MEZBRTgsIDB4MUYyNDQsIDB4MUYyNDUsIDB4MEZBRTcsIDB4MUYyNDMsCisgICAgMHgwRkFFOSwgMHgxRjI0NywgMHgxRjI0NiwgMHgwMzg1MCwgMHgwMTI4NiwgMHgxRjI1RSwKKyAgICAweDFGMjVELCAweDAzODUxLCAweDAwRDJELCAweDFGMjYwLCAweDFGMjYxLCAweDFGMjVGLAorICAgIDB4MDdFMUUsIDB4MDBBNjgsIDB4MUYyNjIsIDB4MEEwMTUsIDB4MDYzN0MsIDB4MDUwOEMsCisgICAgMHgwNDk4QSwgMHgxRjI2NSwgMHgxRjI2MywgMHgxRjI2NCwgMHgwMzg1MiwgMHgwRkFFRSwKKyAgICAweDFGMjY2LCAweDBBMDE2LCAweDBGQUVCLCAweDBGQUVDLCAweDFGMjU0LCAweDFGMjU1LAorICAgIDB4MUYyNTgsIDB4MDYzN0IsIDB4MUYyNTksIDB4MUYyNTYsIDB4MUYyNTcsIDB4MDMyQzMsCisgICAgMHgwRkFFRCwgMHgwNTA4QiwgMHgwM0Y1OSwgMHgwMTMxMCwgMHgwMzJDNCwgMHgxRjI1QywKKyAgICAweDFGMjVBLCAweDFGMjVCLCAweDA0OTgyLCAweDA5RkVFLCAweDFGMUM0LCAweDAwRkYzLAorICAgIDB4MDE0NTcsIDB4MDYzNzgsIDB4MUYxQzYsIDB4MUYxQzUsIDB4MEZBQjQsIDB4MDI4N0IsCisgICAgMHgwRkFCNiwgMHgwRkFCNSwgMHgwMEZGNiwgMHgwM0Y1NywgMHgwRkFCNywgMHgwOUZFRiwKKyAgICAweDFGMUM3LCAweDA1MDgzLCAweDA5RkYwLCAweDFGMUM4LCAweDBGQUI4LCAweDAxRkM4LAorICAgIDB4MDlGRUQsIDB4MEZBQjIsIDB4MEZBQjEsIDB4MUYxQkUsIDB4MDdFMEIsIDB4MDUwODEsCisgICAgMHgwRkFCMywgMHgxRjFCRiwgMHgwMjRGMCwgMHgwMjg3QSwgMHgxRjFDMSwgMHgxRjFDMCwKKyAgICAweDAxRkM3LCAweDAwRTVBLCAweDA1MDgyLCAweDFGMUMzLCAweDFGMUMyLCAweDA3RTBDLAorICAgIDB4MDMyQzAsIDB4MEZBQkUsIDB4MEZBQkYsIDB4MUYxRDEsIDB4MUYxRDIsIDB4MDdFMTAsCisgICAgMHgxRjFENSwgMHgxRjFEMywgMHgxRjFENCwgMHgwRkFDMiwgMHgwRkFDMywgMHgxRjFENiwKKyAgICAweDBGQUMwLCAweDBGQUMxLCAweDFGMUQ5LCAweDFGMURBLCAweDFGMUQ3LCAweDFGMUQ4LAorICAgIDB4MDUwODUsIDB4MDlGRjIsIDB4MUYxREMsIDB4MUYxREIsIDB4MEZBQzQsIDB4MEZBQjksCisgICAgMHgwRkFCQSwgMHgxRjFDQSwgMHgwN0UwRCwgMHgxRjFDOSwgMHgxRjFDQiwgMHgxRjFDQywKKyAgICAweDA3RTBFLCAweDBGQUJCLCAweDBGQUJELCAweDFGMUNELCAweDFGMUNFLCAweDBGQUJDLAorICAgIDB4MDlGRjEsIDB4MDdFMEYsIDB4MUYxRDAsIDB4MUYxQ0YsIDB4MDUwODQsIDB4MDI4N0MsCisgICAgMHgxRjFFNiwgMHgxRjFFNSwgMHgwM0Y1OCwgMHgwMjg3RCwgMHgwOUZGNiwgMHgxRjFFOSwKKyAgICAweDFGMUU3LCAweDFGMUU4LCAweDA3RTEzLCAweDA5RkY4LCAweDFGMUVBLCAweDA5RkY3LAorICAgIDB4MUYxRUQsIDB4MDlGRjksIDB4MEZBQzgsIDB4MUYxRUIsIDB4MUYxRUMsIDB4MDlGRkIsCisgICAgMHgwNDk4NCwgMHgwOUZGQSwgMHgwNDk4MywgMHgwOUZGMywgMHgxRjFERSwgMHgxRjFERCwKKyAgICAweDA3RTExLCAweDFGMURGLCAweDFGMUUwLCAweDBGQUM2LCAweDA5RkY0LCAweDBGQUM1LAorICAgIDB4MDdFMTIsIDB4MUYxRTIsIDB4MUYxRTEsIDB4MDUwODYsIDB4MDBFRDIsIDB4MDlGRjUsCisgICAgMHgxRjFFNCwgMHgxRjFFMywgMHgwRkFDNywgMHgwMDRENCwgMHgxRjFGOSwgMHgxRjFGQSwKKyAgICAweDA5RkZDLCAweDBGQUNELCAweDAyOUU0LCAweDBGQUNFLCAweDFGMUZCLCAweDAyODdFLAorICAgIDB4MDlGRkQsIDB4MEZBRDAsIDB4MUYxRkMsIDB4MEZBQ0YsIDB4MDYzNzksIDB4MUYxRkUsCisgICAgMHgxRjFGRiwgMHgxRjFGRCwgMHgwOUZGRSwgMHgwNDk4NSwgMHgwN0UxNCwgMHgxRjIwMiwKKyAgICAweDFGMjAwLCAweDFGMjAxLCAweDFGMUVGLCAweDFGMUYwLCAweDFGMUYxLCAweDFGMUVFLAorICAgIDB4MEZBQzksIDB4MUYxRjMsIDB4MUYxRjQsIDB4MUYxRjIsIDB4MEZBQ0EsIDB4MDMyQzEsCisgICAgMHgxRjFGNiwgMHgwRkFDQywgMHgxRjFGNSwgMHgwRkFDQiwgMHgwMUM5RiwgMHgxRjFGOCwKKyAgICAweDFGMUY3LCAweDAxRkM5LCAweDAwMEVDLCAweDA2NTBCLCAweDA2NTBDLCAweDA3RTJCLAorICAgIDB4MDI5RUMsIDB4MDBEQjYsIDB4MEZCMDQsIDB4MUYyOTgsIDB4MDA5OEMsIDB4MDFGQ0MsCisgICAgMHgwNjUwRCwgMHgwN0UyQywgMHgwRkIwNSwgMHgwRkIwNiwgMHgwRkIwOCwgMHgxRjI5QSwKKyAgICAweDFGMjk5LCAweDBGQjA3LCAweDAwRUQzLCAweDA1MDk0LCAweDFGMjlCLCAweDA3RTJELAorICAgIDB4MEZCMDksIDB4MDM4NTUsIDB4MDY1MDgsIDB4MEZCMDIsIDB4MUYyOTIsIDB4MEZCMDEsCisgICAgMHgxRjI5NSwgMHgxRjI5NiwgMHgxRjI5MywgMHgxRjI5NCwgMHgwNTA5MywgMHgwRkIwMywKKyAgICAweDA2NTBBLCAweDA3RTJBLCAweDA2NTA5LCAweDAwQkI2LCAweDBBMDJCLCAweDFGMjk3LAorICAgIDB4MDBBNTQsIDB4MDA3MDgsIDB4MUYyQTIsIDB4MUYyQTEsIDB4MDA3QTgsIDB4MDA0Q0EsCisgICAgMHgwMjlFRSwgMHgwN0UyRiwgMHgwNTA5NSwgMHgwMTk3QiwgMHgwMUM0QSwgMHgwQTAyRCwKKyAgICAweDA3RTMwLCAweDAxRkNELCAweDBGQjBDLCAweDA2NTBGLCAweDBGQjBELCAweDFGMkEzLAorICAgIDB4MDY1MEUsIDB4MDFENzgsIDB4MDY1MTAsIDB4MDdFMzEsIDB4MDdFMzIsIDB4MDQ5OTMsCisgICAgMHgwN0UyRSwgMHgwQTAyQywgMHgwM0Y1RCwgMHgxRjI5RSwgMHgxRjI5RiwgMHgwMzg1NiwKKyAgICAweDFGMjlDLCAweDFGMjlELCAweDAzODU3LCAweDBGQjBBLCAweDFGMkEwLCAweDAyOUVELAorICAgIDB4MDA0QjgsIDB4MDI0RjUsIDB4MDNGNUUsIDB4MEZCMEIsIDB4MDM4NTgsIDB4MDA4QUMsCisgICAgMHgwRkIxMywgMHgwN0UzNSwgMHgwRkIxMiwgMHgwNjUxMiwgMHgwMUM0QywgMHgwN0UzNiwKKyAgICAweDBGQjE0LCAweDAxNTUwLCAweDAyODgyLCAweDA3RTM3LCAweDA3RTM4LCAweDA2NTEzLAorICAgIDB4MDUwOTYsIDB4MDY1MTQsIDB4MEEwMzIsIDB4MUYyQTcsIDB4MUYyQTgsIDB4MDA2RTcsCisgICAgMHgwMzJDQSwgMHgxRjJBOSwgMHgwRkIxNSwgMHgwMjlFRiwgMHgwN0UzNCwgMHgwQTAyRSwKKyAgICAweDBBMDJGLCAweDBGQjBFLCAweDA3RTMzLCAweDBGQjEwLCAweDA2NTExLCAweDFGMkE0LAorICAgIDB4MEZCMEYsIDB4MDQ5OTQsIDB4MDI4ODEsIDB4MEEwMzEsIDB4MEEwMzAsIDB4MEZCMTEsCisgICAgMHgwMTI4OSwgMHgxRjJBNiwgMHgxRjJBNSwgMHgwMUM0QiwgMHgwNTA5OCwgMHgxRjJBRSwKKyAgICAweDFGMkFELCAweDA3RTNBLCAweDA2NTE5LCAweDFGMkFGLCAweDFGMkIwLCAweDBGQjE5LAorICAgIDB4MEEwMzgsIDB4MDUwOTksIDB4MUYyQjIsIDB4MUYyQjEsIDB4MDdFM0IsIDB4MEZCMUEsCisgICAgMHgxRjJCNCwgMHgxRjJCNSwgMHgwNDk5NSwgMHgxRjJCMywgMHgwMTQ5RCwgMHgwM0Y2MCwKKyAgICAweDBGQjFCLCAweDAyNUYyLCAweDBBMDMzLCAweDA2NTE2LCAweDA2NTE1LCAweDAzRjVGLAorICAgIDB4MEEwMzUsIDB4MUYyQUEsIDB4MDdFMzksIDB4MEEwMzQsIDB4MEZCMTYsIDB4MDY1MTcsCisgICAgMHgxRjJBQywgMHgxRjJBQiwgMHgwRkIxNywgMHgwNTA5NywgMHgwQTAzNiwgMHgwQTAzNywKKyAgICAweDBGQjE4LCAweDA2NTE4LCAweDAwMzFBLCAweDBBMDNDLCAweDFGMkJBLCAweDFGMkI5LAorICAgIDB4MDdFM0YsIDB4MDA1N0UsIDB4MEZCMUMsIDB4MUYyQkIsIDB4MDBGNUUsIDB4MDE1NTEsCisgICAgMHgwMjVGMywgMHgxRjJCQywgMHgwN0U0MCwgMHgwNDk5NiwgMHgwMEJCOCwgMHgxRjJCRCwKKyAgICAweDA0OTk3LCAweDAzODVBLCAweDAwRTMyLCAweDA2NTFELCAweDFGMkJGLCAweDFGMkJFLAorICAgIDB4MDdFNDEsIDB4MDY1MUEsIDB4MEEwM0EsIDB4MUYyQjcsIDB4MUYyQjYsIDB4MEEwMzksCisgICAgMHgwMzg1OSwgMHgwN0UzRCwgMHgwN0UzQywgMHgwNTA5QSwgMHgwMjlGMCwgMHgwNjUxQywKKyAgICAweDBBMDNCLCAweDA2NTFCLCAweDA3RTNFLCAweDAwOTZBLCAweDFGMkI4LCAweDA1MDlCLAorICAgIDB4MDFENzksIDB4MDA3M0UsIDB4MEEwMUMsIDB4MUYyNkIsIDB4MUYyNkEsIDB4MEZBRjAsCisgICAgMHgwMTMxMiwgMHgwRkFGMSwgMHgxRjI2QywgMHgwMDc0RSwgMHgwMERFMiwgMHgwNjM3RCwKKyAgICAweDBGQUYyLCAweDFGMjZELCAweDAyOUU5LCAweDAyNUYxLCAweDA1MDhELCAweDFGMjZFLAorICAgIDB4MDA3MkEsIDB4MDEyODgsIDB4MUYyNzAsIDB4MUYyNzEsIDB4MUYyNkYsIDB4MDYzN0UsCisgICAgMHgxRjI2NywgMHgwQTAxOCwgMHgwNDk4QiwgMHgwQTAxNywgMHgwMjlFNywgMHgwQTAxOSwKKyAgICAweDBBMDFBLCAweDFGMjY4LCAweDAyOUU4LCAweDAxNzVDLCAweDAyODdGLCAweDBBMDFCLAorICAgIDB4MUYyNjksIDB4MDNGNUEsIDB4MDI4ODAsIDB4MDQ5OEMsIDB4MEZBRUYsIDB4MDBEQjUsCisgICAgMHgwN0UxRiwgMHgxRjI3QiwgMHgxRjI3QSwgMHgwRkFGNCwgMHgwMjRGMSwgMHgxRjI3RSwKKyAgICAweDBBMDFGLCAweDFGMjdDLCAweDFGMjdELCAweDBGQUY1LCAweDFGMjgwLCAweDFGMjdGLAorICAgIDB4MDY1MDIsIDB4MEZBRjYsIDB4MUYyODIsIDB4MDdFMjEsIDB4MDdFMjAsIDB4MUYyODEsCisgICAgMHgwMjlFQSwgMHgwN0UyMywgMHgwN0UyMiwgMHgwMTU0RiwgMHgwNjM3RiwgMHgwNjUwMCwKKyAgICAweDA0OThELCAweDBGQUYzLCAweDFGMjcyLCAweDFGMjczLCAweDBBMDFELCAweDA1MDhFLAorICAgIDB4MDMyQzUsIDB4MUYyNzUsIDB4MUYyNzYsIDB4MUYyNzQsIDB4MDY1MDEsIDB4MDM4NTMsCisgICAgMHgwQTAxRSwgMHgxRjI3OSwgMHgxRjI3NywgMHgxRjI3OCwgMHgwMDc0RiwgMHgwMzg1NCwKKyAgICAweDAzMkM3LCAweDBGQUZBLCAweDFGMjg2LCAweDAyOUVCLCAweDA3RTI1LCAweDBBMDI0LAorICAgIDB4MDI0RjMsIDB4MDFGQ0EsIDB4MDUwOEYsIDB4MDMyQzgsIDB4MUYyODcsIDB4MEEwMjUsCisgICAgMHgwN0UyNiwgMHgwQTAyNiwgMHgxRjI4OCwgMHgxRjI4OSwgMHgwMDZFNiwgMHgwNDk4RSwKKyAgICAweDFGMjhCLCAweDFGMjhBLCAweDAzMkM5LCAweDAzMkM2LCAweDBBMDIxLCAweDBBMDIyLAorICAgIDB4MEEwMjAsIDB4MDNGNUIsIDB4MUYyODMsIDB4MUYyODQsIDB4MDY1MDMsIDB4MEZBRjcsCisgICAgMHgwMjRGMiwgMHgwN0UyNCwgMHgxRjI4NSwgMHgwRkFGOCwgMHgwMTMxMywgMHgwMUFERiwKKyAgICAweDBGQUY5LCAweDBBMDIzLCAweDAwQUIxLCAweDAwNTVFLCAweDFGMjhGLCAweDFGMjhFLAorICAgIDB4MDA5NzIsIDB4MDA1RkEsIDB4MDI0RjQsIDB4MEZBRkUsIDB4MUYyOTAsIDB4MDQ5OTAsCisgICAgMHgwMjBCQywgMHgwRkFGRiwgMHgxRjI5MSwgMHgwMUQyRiwgMHgwNDk5MSwgMHgwQTAyQSwKKyAgICAweDA1MDkyLCAweDBBMDI5LCAweDBGQjAwLCAweDA0OTkyLCAweDA2NTA3LCAweDA2NTA2LAorICAgIDB4MDFGQ0IsIDB4MDNGNUMsIDB4MDUwOTAsIDB4MDY1MDQsIDB4MEEwMjcsIDB4MUYyOEMsCisgICAgMHgxRjI4RCwgMHgwN0UyOCwgMHgwN0UyNywgMHgwQTAyOCwgMHgwNTA5MSwgMHgwRkFGQywKKyAgICAweDBGQUZCLCAweDAxOTdBLCAweDAwM0Q2LCAweDBGQUZELCAweDA3RTI5LCAweDA0OThGLAorICAgIDB4MDY1MDUsIDB4MDAwNTYsIDB4MDIwQzAsIDB4MDI4ODgsIDB4MDAwNUMsIDB4MDAwNUEsCisgICAgMHgwMDcxRSwgMHgwMENFNCwgMHgwMEEzMiwgMHgwMDVENiwgMHgwMEEzNCwgMHgwMjg4QSwKKyAgICAweDAyODg5LCAweDAwQTMzLCAweDA0OUEyLCAweDBBMDQ2LCAweDAxRDdBLCAweDAyNUY5LAorICAgIDB4MEEwNDUsIDB4MDEzMTUsIDB4MDEzMTYsIDB4MDdFNEIsIDB4MDE0NTgsIDB4MDA2NzYsCisgICAgMHgwMEY3MSwgMHgwMUI1MSwgMHgwMDZGRCwgMHgwN0U0QSwgMHgwNjUyOSwgMHgwMTc2OCwKKyAgICAweDAwQUIzLCAweDA3RTQ5LCAweDAwOUU0LCAweDAzRjY0LCAweDA1MEExLCAweDAwREUzLAorICAgIDB4MDAwNjQsIDB4MDA4QjgsIDB4MDBBQjQsIDB4MDBCQkIsIDB4MDA3RkEsIDB4MDAwM0MsCisgICAgMHgwMDlFNywgMHgwMEFGQSwgMHgwMTQ1OSwgMHgwMEFCNSwgMHgwMDFBRiwgMHgwMzg2MiwKKyAgICAweDAyODhDLCAweDAwMTlFLCAweDAwQkZELCAweDAxQzUxLCAweDAxNDlGLCAweDAwRjczLAorICAgIDB4MDI5RkEsIDB4MDdFNEMsIDB4MEEwNDcsIDB4MUYyRDQsIDB4MDM4NjMsIDB4MDBGNzQsCisgICAgMHgwMUI1MiwgMHgwMUI1MywgMHgwNTBBMiwgMHgwMTM3RCwgMHgwMDZFOCwgMHgwMDhBNCwKKyAgICAweDAyOUY5LCAweDAwRTMzLCAweDAwNkUwLCAweDAzRjY1LCAweDA0OUEzLCAweDFGMkQzLAorICAgIDB4MDM4NjEsIDB4MDBBMzUsIDB4MDE5N0MsIDB4MDBGNzIsIDB4MDEyRDEsIDB4MDI4OEIsCisgICAgMHgwMDE1QywgMHgwMUZDRiwgMHgwNDlBNCwgMHgwMDFBNiwgMHgwMEJCQywgMHgxRjJENSwKKyAgICAweDBBMDQ4LCAweDAwQUI2LCAweDAwNzVBLCAweDAyMEMyLCAweDAzODY0LCAweDAxMDRFLAorICAgIDB4MDUwQTUsIDB4MDFEN0IsIDB4MEEwNDksIDB4MUYyRDYsIDB4MDI0RjgsIDB4MDY1MkIsCisgICAgMHgxRjJENywgMHgwMzg2NSwgMHgwMjVGQSwgMHgwN0U0RSwgMHgwMTRBMCwgMHgwNjUyQywKKyAgICAweDAyOUZDLCAweDAwRTVELCAweDAwQ0U1LCAweDAyODhELCAweDAwOThGLCAweDAwNkU5LAorICAgIDB4MEZCMkMsIDB4MDY1MkEsIDB4MDFDNTIsIDB4MDEwNEQsIDB4MEZCMkIsIDB4MDEyOEIsCisgICAgMHgwNTBBMywgMHgwN0U0RCwgMHgwMjlGQiwgMHgwMDk5MCwgMHgwMUZEMCwgMHgwMjRGNywKKyAgICAweDA1MEE0LCAweDAyMEMxLCAweDAxQjU0LCAweDFGMkRELCAweDBGQjMwLCAweDBGQjJFLAorICAgIDB4MEZCMkYsIDB4MDQ5QTYsIDB4MUYyREYsIDB4MUYyREUsIDB4MDI4OEUsIDB4MDI5RkQsCisgICAgMHgwRkIzMSwgMHgwMjVGRCwgMHgwN0U0RiwgMHgxRjJFMCwgMHgwNjUyRSwgMHgxRjJFMiwKKyAgICAweDFGMkUxLCAweDBBMDRELCAweDAxMjhDLCAweDAzRjY3LCAweDBGQjMzLCAweDBGQjMyLAorICAgIDB4MDFCNTUsIDB4MDI1RkMsIDB4MDNGNjYsIDB4MDY1MkQsIDB4MDI1RkIsIDB4MDA4M0MsCisgICAgMHgxRjJEQSwgMHgwRkIyRCwgMHgxRjJEOCwgMHgxRjJEOSwgMHgwQTA0QiwgMHgwNTBBNiwKKyAgICAweDA1MEE3LCAweDAyNEY5LCAweDBBMDRBLCAweDBBMDRDLCAweDFGMkRDLCAweDFGMkRCLAorICAgIDB4MDQ5QTUsIDB4MDA1MzgsIDB4MEZCMzUsIDB4MEZCMzQsIDB4MDExNDcsIDB4MDA1MUUsCisgICAgMHgwMzg2NiwgMHgwQTA0RiwgMHgxRjJFNywgMHgwMjRGQSwgMHgwMDJCQywgMHgxRjJFOCwKKyAgICAweDBGQjM2LCAweDAwREU0LCAweDAxNTU1LCAweDA1MEFBLCAweDFGMkU5LCAweDBGQjM3LAorICAgIDB4MDI4OEYsIDB4MDFGRDIsIDB4MUYyRUEsIDB4MEZCMzgsIDB4MDMyRDAsIDB4MDY1MkYsCisgICAgMHgxRjJFMywgMHgwMjBDMywgMHgwMUZEMSwgMHgwMjVGRSwgMHgwM0Y2OCwgMHgwQTA0RSwKKyAgICAweDA2NTMwLCAweDAxNzY5LCAweDAxRDdDLCAweDFGMkU0LCAweDA1MEE4LCAweDAwRUQ0LAorICAgIDB4MDA5OUYsIDB4MDUwQTksIDB4MUYyRTYsIDB4MUYyRTUsIDB4MDY1MzEsIDB4MDBGNUYsCisgICAgMHgwRkIyMCwgMHgwRkIxRiwgMHgwMDZCNCwgMHgwMDY3QywgMHgwMjlGMSwgMHgxRjJDMiwKKyAgICAweDFGMkMxLCAweDAzMkNCLCAweDAxNDlFLCAweDA1MDlFLCAweDFGMkMzLCAweDAwQTZBLAorICAgIDB4MDBFNUIsIDB4MDI1RjQsIDB4MEZCMjEsIDB4MUYyQzQsIDB4MUYyQzUsIDB4MDI4ODMsCisgICAgMHgwNjUxRiwgMHgwRkIyMiwgMHgwM0Y2MSwgMHgwNTA5QywgMHgwNDk5OCwgMHgwRkIxRCwKKyAgICAweDA3RTQyLCAweDAxNzVELCAweDAxMDdBLCAweDBBMDNELCAweDA3RTQzLCAweDA0OTk5LAorICAgIDB4MDFCNTAsIDB4MDUwOUQsIDB4MDY1MUUsIDB4MDEwNEEsIDB4MDEzN0MsIDB4MDQ5OUEsCisgICAgMHgwRkIxRSwgMHgxRjJDMCwgMHgwN0U0NCwgMHgwMzg1QywgMHgwN0U0NSwgMHgwQTA0MCwKKyAgICAweDFGMkNBLCAweDFGMkNCLCAweDAzMkNDLCAweDFGMkNELCAweDFGMkNDLCAweDAzODVELAorICAgIDB4MDI4ODQsIDB4MDY1MjMsIDB4MDNGNjMsIDB4MUYyQ0UsIDB4MEZCMjQsIDB4MEZCMjUsCisgICAgMHgxRjJEMSwgMHgxRjJDRiwgMHgxRjJEMCwgMHgwMEY3MCwgMHgwN0U0NiwgMHgwRkIyNiwKKyAgICAweDFGMkQyLCAweDA0OTlDLCAweDAzRjYyLCAweDAwOTVFLCAweDAxQzRELCAweDA0OTlCLAorICAgIDB4MDBCRjcsIDB4MDY1MjAsIDB4MUYyQzYsIDB4MEZCMjMsIDB4MEEwM0UsIDB4MEEwM0YsCisgICAgMHgxRjJDNywgMHgwMjVGNSwgMHgwMzg1QiwgMHgwNjUyMSwgMHgwNTA5RiwgMHgxRjJDOSwKKyAgICAweDFGMkM4LCAweDA2NTIyLCAweDAwQUY5LCAweDBBMDQyLCAweDBGQjI3LCAweDAwQTU2LAorICAgIDB4MDA2REUsIDB4MDI5RjIsIDB4MDI5RjMsIDB4MDMyQ0QsIDB4MDMyQ0UsIDB4MDI4ODYsCisgICAgMHgwMzg1RSwgMHgwN0U0OCwgMHgwMTc1RiwgMHgwNTBBMCwgMHgwRkIyOSwgMHgwMUM0RiwKKyAgICAweDAyOUY0LCAweDBGQjI4LCAweDAxNTUzLCAweDBBMDQzLCAweDAyNUY2LCAweDAxMzE0LAorICAgIDB4MDA2RkMsIDB4MDA5OEUsIDB4MDI4ODUsIDB4MDE1NTIsIDB4MEEwNDEsIDB4MDY1MjUsCisgICAgMHgwMTI4QSwgMHgwMjBCRCwgMHgwNjUyNCwgMHgwMUM0RSwgMHgwN0U0NywgMHgwNDk5RCwKKyAgICAweDAwQ0UyLCAweDAwNzFBLCAweDA2NTI2LCAweDAxRkNFLCAweDAxNzVFLCAweDAyNEY2LAorICAgIDB4MDAwNDYsIDB4MDA5RTIsIDB4MDFDNTAsIDB4MDBEQjcsIDB4MDBCQjksIDB4MDAxODgsCisgICAgMHgwNjUyNywgMHgwNDk5RSwgMHgwMDE3QywgMHgwMEQyRiwgMHgwMjVGNywgMHgwMEJCQSwKKyAgICAweDAwREI4LCAweDAyODg3LCAweDA0OUExLCAweDA2NTI4LCAweDA0OTlGLCAweDA0OUEwLAorICAgIDB4MDEwNEMsIDB4MDIwQkYsIDB4MEZCMkEsIDB4MDI5RjgsIDB4MDI1RjgsIDB4MDBBMzEsCisgICAgMHgwMDUxQywgMHgwMTU1NCwgMHgwMjlGNSwgMHgwMEJGQywgMHgwMzJDRiwgMHgwQTA0NCwKKyAgICAweDAzODVGLCAweDAyOUY2LCAweDAwQUIyLCAweDAyMEJFLCAweDAwRTVDLCAweDAwQTU3LAorICAgIDB4MDBEMkUsIDB4MDAxQUMsIDB4MDI5RjcsIDB4MDM4NjAsIDB4MDAxMjUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBvbjJhdmNfY2I3X2JpdHNbT04yQVZDX0NCN19DT0RFU10gPSB7CisgICAgIDEsICA4LCAgOCwgIDgsICA4LCAgNywKKyAgICAxMCwgMTEsICA3LCAxMSwgMTIsIDEwLAorICAgIDEwLCAxMiwgMTQsIDE0LCAxNSwgMTQsCisgICAgMTEsIDExLCAxMywgMTMsIDEyLCAxMCwKKyAgICAxMSwgMTMsIDEyLCAxMiwgMTQsIDE0LAorICAgIDE0LCAxMywgMTEsIDEyLCAgOSwgMTAsCisgICAgMTIsICA3LCAxMSwgMTEsICA3LCAgNywKKyAgICAxMSwgMTIsICA3LCAgNywgMTAsICA5LAorICAgIDExLCAxMSwgMTEsIDEzLCAxMywgMTIsCisgICAgMTQsIDE1LCAxMSwgMTIsIDE0LCAxMiwKKyAgICAxMywgMTIsIDEyLCAxMiwgMTIsIDExLAorICAgIDExLCAxNSwgMTUsIDEwLCAxMiwgMTUsCisgICAgMTIsIDEyLCAxNCwgMTEsICA3LCAxMCwKKyAgICAgOCwgMTEsIDExLCAxMSwgMTYsIDEzLAorICAgIDEyLCAxNCwgMTIsIDE2LCAxNSwgMTIsCisgICAgMTMsIDE0LCAxNCwgMTIsIDE0LCAxNywKKyAgICAxNSwgMTYsIDE2LCAxMiwgMTQsIDE2LAorICAgIDE0LCAxMiwgMTIsIDEzLCAxNiwgMTQsCisgICAgMTIsIDE3LCAxNiwgMTYsIDE1LCAxMywKKyAgICAxMywgMTQsIDEyLCAxNCwgMTIsIDE2LAorICAgIDE2LCAxMiwgMTYsIDE3LCAxNiwgMTcsCisgICAgMTUsIDE2LCAxNiwgMTUsIDE3LCAxNSwKKyAgICAxNywgMTcsIDE2LCAxNywgMTYsIDE1LAorICAgIDE0LCAxNiwgMTQsIDE2LCAxNCwgMTEsCisgICAgMTQsIDE2LCAxNSwgMTEsIDE3LCAxNywKKyAgICAxNSwgMTMsIDE3LCAxNiwgMTcsIDE3LAorICAgIDE1LCAxNCwgMTcsIDE1LCAxNCwgMTYsCisgICAgMTEsIDE2LCAxNywgMTYsIDE0LCAxMiwKKyAgICAxNywgMTUsIDEyLCAxMywgMTUsIDE3LAorICAgIDE2LCAxMywgMTUsIDE3LCAxNiwgMTMsCisgICAgMTUsIDE2LCAxNywgMTUsIDEzLCAxNCwKKyAgICAxNiwgMTcsIDE3LCAxNCwgMTQsIDE2LAorICAgIDE2LCAxMywgMTIsIDE1LCAxNywgMTYsCisgICAgMTQsIDExLCAxNSwgMTUsIDEyLCAxMCwKKyAgICAxNCwgMTYsIDE2LCAxNiwgMTIsIDE1LAorICAgIDE2LCAxMiwgMTIsIDEzLCAxNSwgMTcsCisgICAgMTQsIDEyLCAxNSwgMTcsIDE0LCAxNCwKKyAgICAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTcsCisgICAgMTQsIDExLCAxMywgMTUsIDE3LCAxNSwKKyAgICAxMiwgMTQsIDE2LCAxMSwgMTQsIDE3LAorICAgIDE3LCAxNCwgMTUsIDE3LCAxNCwgMTcsCisgICAgMTYsIDE1LCAxNywgMTUsIDE0LCAxNywKKyAgICAxNSwgMTQsIDE3LCAxNywgMTIsIDE1LAorICAgIDE2LCAxNCwgMTIsIDEzLCAxNiwgMTMsCisgICAgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwKKyAgICAxNywgMTcsIDE2LCAxNCwgMTYsIDE0LAorICAgIDE3LCAxNywgMTEsIDE0LCAxMiwgMTMsCisgICAgMTUsIDEyLCAxNCwgMTUsIDEyLCAxMywKKyAgICAxNCwgMTIsIDEzLCAxNCwgMTQsIDE2LAorICAgIDE3LCAxNSwgMTEsIDEyLCAxNCwgMTUsCisgICAgMTMsIDEyLCAxMiwgMTQsIDE0LCAxMywKKyAgICAxNSwgMTcsIDE2LCAxNiwgMTQsIDE0LAorICAgIDEzLCAxMywgMTQsIDEyLCAxNiwgMTcsCisgICAgMTIsICA3LCAxMiwgMTIsICA3LCAgNywKKyAgICAxMSwgMTEsICA4LCAxMCwgMTEsIDEzLAorICAgIDEzLCAxMSwgMTUsIDE0LCAxMiwgMTAsCisgICAgMTQsIDExLCAxMSwgMTMsIDEyLCAxMSwKKyAgICAxMiwgMTMsIDEyLCAxNSwgMTQsIDEyLAorICAgIDExLCAxNCwgMTEsIDE1LCAxMywgMTEsCisgICAgIDcsIDExLCAxMSwgIDksIDEwLCAgNywKKyAgICAxMywgMTQsICA3LCAgNywgMTIsIDEyLAorICAgIDEyLCAxMSwgMTIsIDE3LCAxNCwgMTIsCisgICAgMTQsIDE2LCAxNCwgMTQsIDE0LCAxMSwKKyAgICAxMiwgMTIsIDExLCAxMywgMTUsIDE0LAorICAgIDEzLCAxNSwgMTYsIDE0LCAxNCwgMTUsCisgICAgMTIsIDE0LCAxNCwgMTIsICA3LCAxMSwKKyAgICAxMiwgMTIsIDExLCAgNywgMTIsIDEzLAorICAgIDEzLCAxMiwgIDksIDE0LCAxNCwgIDksCisgICAgMTIsIDEyLCAxMiwgMTMsIDEzLCAxNCwKKyAgICAxNSwgMTQsIDE0LCAxMiwgMTEsIDE0LAorICAgIDEzLCAxMSwgMTIsIDEzLCAxNCwgMTQsCisgICAgMTMsIDE1LCAxNSwgMTYsIDE0LCAxMiwKKyAgICAxNCwgMTIsIDEyLCAxNCwgIDksIDE0LAorICAgIDEzLCAgOSwgMTIsIDE3LCAxNSwgMTIsCisgICAgMTIsIDE0LCAxMywgMTMsIDEzLCAxMywKKyAgICAxNCwgMTYsIDEzLCAxNiwgMTUsIDEyLAorICAgIDE0LCAxNiwgMTMsIDE0LCAxMiwgMTEsCisgICAgMTMsIDE3LCAxNSwgMTMsIDE1LCAxNywKKyAgICAxNSwgMTMsIDE1LCAxMywgMTUsIDE3LAorICAgIDEzLCAxMSwgMTQsIDE1LCAxMywgMTMsCisgICAgMTQsIDE3LCAxNywgMTcsIDE2LCAxNCwKKyAgICAxNywgMTYsIDE1LCAxNiwgMTcsIDE2LAorICAgIDE0LCAxNSwgMTcsIDE1LCAxNywgMTYsCisgICAgMTQsIDE0LCAxNCwgMTUsIDEyLCAxMywKKyAgICAxNCwgMTcsIDE2LCAxNCwgMTYsIDE3LAorICAgIDE3LCAxNywgMTQsIDE3LCAxNywgMTUsCisgICAgMTcsIDE1LCAxNywgMTYsIDE2LCAxMSwKKyAgICAxNywgMTYsIDEyLCAxMiwgMTcsIDE3LAorICAgIDE1LCAxNSwgMTQsIDE3LCAxNCwgMTMsCisgICAgMTQsIDE2LCAxNiwgMTUsIDEzLCAxNCwKKyAgICAxNiwgMTQsIDEzLCAxNCwgMTUsIDE3LAorICAgIDE0LCAxMiwgMTQsIDE3LCAxNiwgMTQsCisgICAgMTIsIDE2LCAxNCwgMTMsIDExLCAxNSwKKyAgICAxNywgMTYsIDEzLCAxMiwgMTUsIDE3LAorICAgIDEwLCAxMiwgMTMsIDE2LCAxNywgMTQsCisgICAgMTMsIDE0LCAxNSwgMTIsIDEzLCAxNCwKKyAgICAxNSwgMTcsIDE0LCAxNCwgMTYsIDE1LAorICAgIDE0LCAxNCwgMTcsIDE3LCAxNCwgMTMsCisgICAgMTQsIDE2LCAxNywgMTUsIDEzLCAxNSwKKyAgICAxNSwgMTIsIDExLCAxNCwgMTcsIDE2LAorICAgIDE0LCAxMywgMTYsIDE1LCAxNywgMTYsCisgICAgMTUsIDE3LCAxNiwgMTUsIDE1LCAxNywKKyAgICAxNSwgMTYsIDE3LCAxNiwgMTcsIDE3LAorICAgIDE3LCAxMywgMTIsIDE0LCAxNywgMTQsCisgICAgMTMsIDE1LCAxNCwgMTcsIDE0LCAxNCwKKyAgICAxNiwgMTUsIDE2LCAxNCwgMTUsIDE0LAorICAgIDE1LCAxNywgMTQsIDE3LCAxNywgMTUsCisgICAgMTIsIDE3LCAxNywgMTIsIDEyLCAxNCwKKyAgICAxMywgMTQsIDEzLCAxNCwgMTYsIDE1LAorICAgIDEzLCAxNSwgMTcsIDEzLCAxMywgMTQsCisgICAgMTEsIDEzLCAxNCwgMTMsIDEyLCAxNCwKKyAgICAxNSwgMTMsIDE3LCAxNSwgMTQsIDE1LAorICAgIDE2LCAxMywgMTYsIDE2LCAxNCwgMTIsCisgICAgMTQsIDEzLCAxNCwgMTQsICA3LCAxMiwKKyAgICAxMywgMTIsIDEyLCAgOSwgMTQsIDE0LAorICAgICA5LCAxMiwgMTQsIDEyLCAxMiwgMTIsCisgICAgMTQsIDE1LCAxNSwgMTUsIDExLCAxMSwKKyAgICAxMywgMTMsIDEyLCAxMiwgMTMsIDE1LAorICAgIDE0LCAxNCwgMTUsIDE2LCAxNSwgMTUsCisgICAgMTIsIDE0LCAxMiwgMTMsIDE0LCAgOSwKKyAgICAxNCwgMTMsICA5LCAgOCwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTIsIDE2LCAxNiwgMTIsCisgICAgMTQsIDE1LCAxNSwgMTUsIDE2LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNiwgMTUsIDE1LAorICAgIDE3LCAxNSwgMTQsIDE1LCAxNywgMTYsCisgICAgMTUsIDE1LCAxNywgMTcsIDE2LCAxMywKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTIsIDE1LAorICAgIDE2LCAxMSwgMTIsIDE3LCAxNiwgMTEsCisgICAgMTEsIDE1LCAxNSwgMTUsIDE0LCAxNCwKKyAgICAxNSwgMTcsIDE0LCAxNywgMTUsIDE2LAorICAgIDE2LCAxNiwgMTQsIDE3LCAxNSwgMTUsCisgICAgMTMsIDE2LCAxNSwgMTQsIDE1LCAxNiwKKyAgICAxNywgMTUsIDE2LCAxNCwgMTUsIDE2LAorICAgIDEzLCAxMSwgMTQsIDE1LCAxNiwgMTQsCisgICAgMTIsIDE2LCAxNiwgMTYsIDE0LCAxMiwKKyAgICAxNiwgMTcsIDEzLCAxNCwgMTMsIDE2LAorICAgIDE3LCAxNiwgMTUsIDE1LCAxNywgMTcsCisgICAgMTQsIDE1LCAxNSwgMTUsIDE1LCAxMiwKKyAgICAxNCwgMTcsIDE2LCAxNSwgMTUsIDE3LAorICAgIDE3LCAxNywgMTUsIDE2LCAxNiwgMTQsCisgICAgMTYsIDEzLCAxNywgMTYsIDE0LCAxNSwKKyAgICAxNiwgMTcsIDE1LCAxNiwgMTYsIDE3LAorICAgIDE1LCAxNiwgMTQsIDE3LCAxNywgMTYsCisgICAgMTYsIDE0LCAxNSwgMTcsIDE3LCAxNSwKKyAgICAxNCwgMTQsIDE1LCAxMywgMTYsIDE3LAorICAgIDE0LCAxNiwgMTcsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE3LCAxNywgMTYsIDE0LCAxNywKKyAgICAxNiwgMTUsIDE2LCAxMSwgMTcsIDE3LAorICAgIDE2LCAxNiwgMTMsIDE3LCAxNiwgMTQsCisgICAgMTQsIDE2LCAxNywgMTUsIDE1LCAxMywKKyAgICAxNiwgMTUsIDE1LCAxNSwgMTYsIDE1LAorICAgIDE2LCAxNSwgMTIsIDE1LCAxNywgMTYsCisgICAgMTUsIDEyLCAxNSwgMTYsIDEzLCAxMiwKKyAgICAxNSwgMTYsIDE3LCAxNCwgMTEsIDE3LAorICAgIDE2LCAxMywgMTIsIDE1LCAxNywgMTcsCisgICAgMTUsIDEzLCAxNiwgMTUsIDEyLCAxMywKKyAgICAxNSwgMTcsIDE3LCAxNCwgMTUsIDE3LAorICAgIDE1LCAxNCwgMTcsIDE1LCAxNywgMTcsCisgICAgMTYsIDEyLCAxNywgMTcsIDE3LCAxNiwKKyAgICAxNCwgMTUsIDE3LCAxMSwgMTMsIDE1LAorICAgIDE3LCAxNiwgMTUsIDEyLCAxNywgMTcsCisgICAgMTEsIDE1LCAxNywgMTcsIDE2LCAxNCwKKyAgICAxNywgMTUsIDE3LCAxNiwgMTQsIDE3LAorICAgIDE3LCAxNSwgMTYsIDE3LCAxNCwgMTYsCisgICAgMTcsIDE0LCAxNywgMTYsIDE1LCAxNCwKKyAgICAxNywgMTcsIDEyLCAxNywgMTcsIDE3LAorICAgIDE1LCAxNSwgMTcsIDE2LCAxNywgMTUsCisgICAgMTQsIDE3LCAxNCwgMTYsIDE3LCAxMiwKKyAgICAxNCwgMTcsIDE2LCAxNywgMTMsIDE3LAorICAgIDE2LCAxMywgMTUsIDE2LCAxNSwgMTYsCisgICAgMTQsIDE1LCAxNywgMTcsIDE1LCAxNCwKKyAgICAxNCwgMTYsIDE3LCAxNCwgMTEsIDE1LAorICAgIDE2LCAxNiwgMTQsIDE2LCAxNywgMTcsCisgICAgMTUsIDE0LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxMywgMTUsIDE3LCAxNCwgMTEsIDE3LAorICAgIDE3LCAxMiwgMTEsIDE1LCAxNywgMTcsCisgICAgMTUsIDE0LCAxNywgMTYsIDE0LCAxNywKKyAgICAxNywgMTUsIDE1LCAxNiwgMTUsIDE1LAorICAgIDE2LCAxNCwgMTQsIDE1LCAxNSwgMTUsCisgICAgMTYsIDE3LCAxNSwgMTUsIDE2LCAxNCwKKyAgICAxNSwgMTYsIDEzLCAxMSwgMTQsIDE2LAorICAgIDE3LCAxNCwgMTMsIDE3LCAxNywgMTQsCisgICAgMTIsIDE2LCAxNiwgMTcsIDE2LCAxNywKKyAgICAxNywgMTcsIDE2LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNiwgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNiwgMTcsIDE3LCAxNiwgMTcsIDE3LAorICAgIDE2LCAxMywgMTYsIDE3LCAxNiwgMTYsCisgICAgMTEsIDE3LCAxNywgMTcsIDE2LCAxNSwKKyAgICAxNywgMTcsIDE0LCAxNiwgMTYsIDE3LAorICAgIDE2LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE2LCAxNiwgMTcsIDE1LCAxNSwKKyAgICAxNywgMTcsIDE2LCAxNSwgMTYsIDE3LAorICAgIDE2LCAxNiwgMTUsIDE2LCAxNywgMTYsCisgICAgMTQsIDEzLCAxNywgMTcsIDEzLCAxNSwKKyAgICAxNywgMTcsIDE0LCAxMiwgMTcsIDE3LAorICAgIDE2LCAxNSwgMTUsIDE3LCAxNywgMTUsCisgICAgMTcsIDE2LCAxNywgMTYsIDE3LCAxNywKKyAgICAxNywgMTcsIDE2LCAxMywgMTYsIDE3LAorICAgIDE2LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTYsIDE3LCAxNSwgMTYsIDEzLCAxNiwKKyAgICAxNiwgMTYsIDE1LCAxNiwgMTcsIDE3LAorICAgIDE3LCAxNywgMTYsIDE3LCAxNywgMTYsCisgICAgMTcsIDE2LCAxNiwgMTYsIDE1LCAxNiwKKyAgICAxNSwgMTcsIDE3LCAxNywgMTYsIDE1LAorICAgIDE2LCAxNiwgMTUsIDE1LCAxNiwgMTcsCisgICAgMTYsIDE3LCAxNywgMTcsIDE3LCAxNiwKKyAgICAxNywgMTcsIDE2LCAxNywgMTYsIDE3LAorICAgIDE2LCAxNiwgMTIsIDE3LCAxNiwgMTQsCisgICAgMTMsIDE2LCAxNywgMTcsIDE1LCAxNCwKKyAgICAxNywgMTcsIDE0LCAxNiwgMTYsIDE3LAorICAgIDE2LCAxNSwgMTcsIDE1LCAxNywgMTcsCisgICAgMTQsIDE3LCAxNywgMTUsIDEzLCAxNCwKKyAgICAxNywgMTUsIDE2LCAxMiwgMTYsIDE2LAorICAgIDE1LCAxMiwgMTYsIDE3LCAxNywgMTUsCisgICAgMTQsIDE2LCAxNywgMTIsIDEyLCAxNiwKKyAgICAxNiwgMTYsIDE3LCAxNCwgMTYsIDE2LAorICAgIDEzLCAxNSwgMTYsIDE3LCAxNywgMTUsCisgICAgMTUsIDE2LCAxNiwgMTYsIDE1LCAxNywKKyAgICAxNywgMTQsIDE0LCAxNSwgMTcsIDE3LAorICAgIDE1LCAxNCwgMTcsIDE1LCAxMiwgMTIsCisgICAgMTQsIDE3LCAxNywgMTUsIDE0LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNSwgMTYsIDE3LAorICAgIDE1LCAxNywgMTYsIDE3LCAxNSwgMTcsCisgICAgMTcsIDE2LCAxNiwgMTYsIDE1LCAxNiwKKyAgICAxNywgMTcsIDE1LCAxNSwgMTYsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNSwKKyAgICAxNywgMTcsIDE1LCAxNCwgMTcsIDE3LAorICAgIDE0LCAxNCwgMTYsIDE2LCAxNywgMTYsCisgICAgMTYsIDE3LCAxNiwgMTUsIDE3LCAxNywKKyAgICAxNiwgMTYsIDE3LCAxNiwgMTYsIDE3LAorICAgIDE1LCAxNSwgMTcsIDE3LCAxNSwgMTcsCisgICAgMTcsIDE1LCAxNSwgMTYsIDE2LCAxNiwKKyAgICAxNywgMTUsIDEzLCAxNywgMTcsIDE3LAorICAgIDE3LCAxMSwgMTYsIDE3LCAxNywgMTYsCisgICAgMTQsIDE3LCAxNywgMTQsIDE2LCAxNywKKyAgICAxNywgMTUsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTYsCisgICAgMTQsIDE2LCAxNywgMTYsIDE2LCAxNywKKyAgICAxNiwgMTcsIDE2LCAxNywgMTYsIDE3LAorICAgIDE3LCAxNywgMTUsIDE2LCAxNywgMTUsCisgICAgIDksIDE3LCAxNywgMTcsIDE2LCAxMiwKKyAgICAxNywgMTcsIDEzLCAxNSwgMTUsIDE3LAorICAgIDE3LCAxNiwgMTYsIDE3LCAxNywgMTYsCisgICAgMTYsIDE3LCAxNywgMTcsIDE3LCAxNiwKKyAgICAxNywgMTcsIDE3LCAxNiwgMTUsIDE3LAorICAgIDE3LCAxNiwgMTMsIDE3LCAxNywgMTcsCisgICAgMTUsIDEzLCAxNywgMTcsIDEzLCAxMiwKKyAgICAxNywgMTcsIDEyLCAgOSwgMTUsIDE3LAorICAgIDE3LCAxNSwgMTQsIDE3LCAxNywgMTUsCisgICAgMTYsIDE3LCAxNywgMTYsIDE2LCAxNywKKyAgICAxNywgMTcsIDE2LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNCwgMTcsIDE3LCAxNywgMTYsCisgICAgMTQsIDE3LCAxNywgMTMsIDExLCAxNiwKKyAgICAxNywgMTcsIDE0LCAxMCwgMTYsIDE3LAorICAgIDE3LCAxNiwgMTIsIDE2LCAxNywgMTIsCisgICAgMTQsIDE2LCAxNywgMTcsIDE1LCAxNiwKKyAgICAxNywgMTcsIDE2LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTUsIDE3LCAxNywgMTcsCisgICAgMTcsIDE0LCAxNiwgMTcsIDE1LCAxMiwKKyAgICAxNSwgMTYsIDE3LCAxNSwgMTEsIDE3LAorICAgIDE3LCAxMiwgMTMsIDE3LCAxNywgMTQsCisgICAgMTAsIDE2LCAxNywgMTcsIDE2LCAxMywKKyAgICAxNiwgMTYsIDE0LCAxNywgMTUsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTUsIDE3LCAxNiwgMTYsIDE1LCAxNywKKyAgICAxNywgMTcsIDE1LCAxMywgMTcsIDE2LAorICAgIDE0LCAxMSwgMTYsIDE3LCAxNywgMTUsCisgICAgMTEsIDE2LCAxNywgMTcsIDE2LCAxMiwKKyAgICAxNywgMTYsIDE0LCAxNCwgMTcsIDE3LAorICAgIDE3LCAxNiwgMTMsIDE2LCAxNywgMTUsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNiwgMTcsIDE3LCAxNywgMTQsIDE2LAorICAgIDE3LCAxNiwgMTUsIDE2LCAxNywgMTcsCisgICAgMTUsIDEyLCAxNywgMTYsIDE0LCAxMSwKKyAgICAxNywgMTcsIDE3LCAxNSwgMTQsIDE3LAorICAgIDE3LCAxNCwgMTUsIDE3LCAxNiwgMTcsCisgICAgMTcsIDE3LCAxNiwgMTYsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTQsIDE0LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNCwgMTcsIDE3LCAxMiwgMTQsIDE3LAorICAgIDE3LCAxNCwgMTEsIDE2LCAxNywgMTcsCisgICAgMTUsIDE1LCAxNiwgMTcsIDEzLCAxNywKKyAgICAxNiwgMTcsIDE3LCAxNSwgMTcsIDE3LAorICAgIDE3LCAxNiwgMTYsIDE3LCAxNiwgMTQsCisgICAgMTUsIDE2LCAxNywgMTcsIDE1LCAxNSwKKyAgICAxNywgMTcsIDEzLCAxMSwgMTUsIDE3LAorICAgIDE3LCAxNiwgMTAsIDE2LCAxNiwgMTcsCisgICAgMTYsIDEyLCAxNywgMTcsIDEyLCAxNCwKKyAgICAxNSwgMTcsIDE3LCAxNSwgMTYsIDE3LAorICAgIDE1LCAxNSwgMTcsIDE2LCAxNywgMTYsCisgICAgMTYsIDE1LCAxNiwgMTcsIDE3LCAxNiwKKyAgICAxNSwgMTcsIDE3LCAxNCwgMTMsIDE0LAorICAgIDE2LCAxNywgMTQsIDEyLCAxNywgMTYsCisgICAgMTMsIDEyLCAxNiwgMTcsIDEzLCAgOSwKKyAgICAxNSwgMTcsIDE3LCAxNiwgMTUsIDE3LAorICAgIDE3LCAxNCwgMTYsIDE2LCAxNywgMTcsCisgICAgMTYsIDE2LCAxNywgMTcsIDE3LCAxNSwKKyAgICAxNywgMTYsIDE2LCAxNSwgMTYsIDE3LAorICAgIDE3LCAxNSwgMTMsIDE3LCAxNywgMTQsCisgICAgMTEsIDE1LCAxNywgMTcsIDE1LCAgOSwKKyAgICAxNiwgMTcsIDE3LCAxNSwgMTIsIDE3LAorICAgIDE2LCAxMywgMTQsIDE3LCAxNywgMTcsCisgICAgMTYsIDE2LCAxNywgMTcsIDE1LCAxNiwKKyAgICAxNywgMTcsIDE2LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTYsCisgICAgMTYsIDE1LCAxNywgMTcsIDE3LCAxNSwKKyAgICAxMiwgMTcsIDE2LCAxMiwgMTIsIDE2LAorICAgIDE3LCAxMiwgMTAsIDE3LCAxNywgMTcsCisgICAgMTQsIDE0LCAxNywgMTcsIDE0LCAxNCwKKyAgICAxNiwgMTcsIDE3LCAxNSwgMTYsIDE3LAorICAgIDE3LCAxNywgMTYsIDE3LCAxNiwgMTcsCisgICAgMTQsIDE3LCAxNywgMTcsIDE2LCAxMywKKyAgICAxNywgMTcsIDE0LCAgOSwgMTUsIDE3LAorICAgIDE3LCAxNSwgMTAsIDE1LCAxNywgMTcsCisgICAgMTUsIDEyLCAxNywgMTcsIDEzLCAxMywKKyAgICAxNiwgMTcsIDE3LCAxNSwgMTQsIDE3LAorICAgIDE3LCAxNCwgMTcsIDE2LCAxNiwgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNSwgMTcsIDE2LCAxNSwgMTQsIDE1LAorICAgIDE3LCAxNywgMTYsIDEyLCAxNiwgMTcsCisgICAgMTIsIDEzLCAxNywgMTcsIDEzLCAxMSwKKyAgICAxNywgMTcsIDE3LCAxNiwgMTIsIDE2LAorICAgIDE3LCAxNSwgMTUsIDE1LCAxNywgMTcsCisgICAgMTcsIDE2LCAxNiwgMTcsIDE2LCAxNiwKKyAgICAxNywgMTcsIDE2LCAxNiwgMTUsIDE3LAorICAgIDE3LCAxNiwgMTMsIDE1LCAxNywgMTQsCisgICAgMTEsIDE1LCAxNywgMTYsIDE1LCAxMiwKKyAgICAxNywgMTcsIDE2LCAxNywgMTIsIDE3LAorICAgIDE3LCAxNSwgMTQsIDE2LCAxNywgMTcsCisgICAgMTUsIDE1LCAxNywgMTcsIDE1LCAxNSwKKyAgICAxNywgMTcsIDE3LCAxNiwgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE2LCAxNSwgMTYsCisgICAgMTcsIDE0LCAxNSwgMTYsIDE3LCAxNywKKyAgICAxNSwgMTcsIDE3LCAxMywgMTIsIDE3LAorICAgIDE3LCAxNywgMTYsIDE0LCAxNywgMTcsCisgICAgMTIsIDE1LCAxNSwgMTcsIDE3LCAxNiwKKyAgICAxNSwgMTcsIDE3LCAxNCwgMTYsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTYsIDE1LCAxNSwgMTcsIDE1LCAxNSwKKyAgICAxNCwgMTUsIDE3LCAxNywgMTUsIDEzLAorICAgIDE3LCAxNywgMTQsIDE0LCAxNywgMTcsCisgICAgMTQsIDEwLCAxNiwgMTcsIDE3LCAxNSwKKyAgICAxNCwgMTcsIDE3LCAxMywgMTUsIDE2LAorICAgIDE3LCAxNywgMTUsIDE3LCAxNiwgMTcsCisgICAgMTUsIDE3LCAxNiwgMTcsIDE3LCAxNSwKKyAgICAxNiwgMTcsIDE3LCAxNCwgMTQsIDE3LAorICAgIDE2LCAxMiwgMTAsIDE2LCAxNywgMTcsCisgICAgMTUsIDEwLCAxNiwgMTcsIDE3LCAxNSwKKyAgICAxMiwgMTcsIDE3LCAxMywgMTMsIDE1LAorICAgIDE3LCAxNywgMTUsIDE1LCAxNywgMTcsCisgICAgMTMsIDE0LCAxNywgMTcsIDE3LCAxNiwKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE1LAorICAgIDE3LCAxNiwgMTYsIDEzLCAxNywgMTYsCisgICAgMTcsIDE3LCAxMiwgMTcsIDE3LCAxMiwKKyAgICAxMywgMTcsIDE3LCAxMiwgMTEsIDE1LAorICAgIDE2LCAxNywgMTcsIDEzLCAxNiwgMTYsCisgICAgMTQsIDE0LCAxNSwgMTcsIDE3LCAxNiwKKyAgICAxNiwgMTcsIDE3LCAxNiwgMTcsIDE3LAorICAgIDE3LCAxNywgMTUsIDE3LCAxNywgMTcsCisgICAgMTYsIDE1LCAxNywgMTcsIDE0LCAgOSwKKyAgICAxNywgMTcsIDE3LCAxNSwgMTUsIDE3LAorICAgIDE3LCAxNCwgMTMsIDE2LCAxNywgMTYsCisgICAgMTYsIDE2LCAxNywgMTcsIDE2LCAxNiwKKyAgICAxNiwgMTcsIDE3LCAxNiwgMTYsIDE2LAorICAgIDE3LCAxNiwgMTYsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE2LCAxNywKKyAgICAxNiwgMTcsIDE3LCAxMiwgMTYsIDE3LAorICAgIDE3LCAxNywgMTAsIDE3LCAxNiwgMTcsCisgICAgMTcsIDEzLCAxNywgMTcsIDE0LCAxNiwKKyAgICAxNywgMTcsIDE1LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTMsIDE2LCAxNywgMTYsCisgICAgMTUsIDE2LCAxNSwgMTcsIDE2LCAxNSwKKyAgICAxNywgMTcsIDE3LCAxNywgMTUsIDE2LAorICAgIDE2LCAxNSwgMTYsIDE0LCAxNywgMTcsCisgICAgMTMsIDE1LCAxNywgMTcsIDE1LCAxMywKKyAgICAxNywgMTUsIDE3LCAxNywgMTUsIDE3LAorICAgIDE2LCAxNSwgMTcsIDE2LCAxNywgMTcsCisgICAgMTYsIDEzLCAxNiwgMTcsIDE1LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTYsIDE3LAorICAgIDE2LCAxNywgMTUsIDE2LCAxNywgMTUsCisgICAgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAxNywgMTcsIDE3LCAxNiwgMTUsIDE3LAorICAgIDE2LCAxNywgMTYsIDE2LCAxNywgMTUsCisgICAgMTcsIDE2LCAxNywgMTYsIDE3LCAxNCwKKyAgICAxNSwgMTcsIDE3LCAxNywgMTYsIDE2LAorICAgIDE2LCAxNywgMTcsIDE3LCAxNiwgMTcsCisgICAgMTcsIDE2LCAxNywgMTcsIDE2LCAxNywKKyAgICAxNiwgMTcsIDE3LCAxNCwgMTMsIDE3LAorICAgIDE3LCAxNCwgMTIsIDE3LCAxNywgMTcsCisgICAgMTUsIDEyLCAxNywgMTYsIDE1LCAxNSwKKyAgICAxNSwgMTcsIDE3LCAxNywgMTQsIDE2LAorICAgIDE3LCAxNiwgMTYsIDE2LCAxNywgMTcsCisgICAgMTcsIDE1LCAxNywgMTcsIDE3LCAxNCwKKyAgICAxNiwgMTUsIDE0LCAxMywgMTQsIDE3LAorICAgIDE3LCAxNywgMTUsIDE2LCAxNywgMTIsCisgICAgMTMsIDE1LCAxNywgMTcsIDE2LCAxNCwKKyAgICAxNiwgMTYsIDEyLCAxNCwgMTYsIDE2LAorICAgIDE3LCAxNSwgMTYsIDE3LCAxNiwgMTMsCisgICAgMTYsIDE2LCAxNiwgMTcsIDE1LCAxNSwKKyAgICAxNiwgMTcsIDE0LCAxNCwgMTcsIDE3LAorICAgIDEzLCAxMiwgMTUsIDE3LCAxNywgMTUsCisgICAgMTQsIDE2LCAxNiwgMTcsIDE3LCAxNSwKKyAgICAxNywgMTcsIDE3LCAxNiwgMTYsIDE3LAorICAgIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsCisgICAgMTUsIDE2LCAxNywgMTcsIDE2LCAxNiwKKyAgICAxNiwgMTcsIDE1LCAxNywgMTcsIDE3LAorICAgIDE1LCAxNiwgMTYsIDE3LCAxNywgMTYsCisgICAgMTYsIDE1LCAxNywgMTcsIDE1LCAxNCwKKyAgICAxNywgMTcsIDE0LCAxNCwgMTYsIDE3LAorICAgIDE3LCAxNywgMTUsIDE2LCAxNywgMTYsCisgICAgMTcsIDE2LCAxNiwgMTcsIDE3LCAxNiwKKyAgICAxNSwgMTYsIDE1LCAxNiwgMTcsIDE3LAorICAgIDE1LCAxNywgMTcsIDE2LCAxNiwgMTYsCisgICAgMTUsIDE3LCAxNywgMTUsIDEyLCAxNiwKKyAgICAxNywgMTcsIDE2LCAxMSwgMTcsIDE3LAorICAgIDE2LCAxNiwgMTQsIDE2LCAxNywgMTQsCisgICAgMTYsIDE2LCAxNywgMTYsIDE1LCAxNywKKyAgICAxNywgMTcsIDE2LCAxNSwgMTUsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTYsIDE3LCAxNywgMTcsIDE2LCAxNCwKKyAgICAxNywgMTYsIDE3LCAxNiwgMTMsIDE3LAorICAgIDE3LCAxMywgIDgsIDE1LCAxNSwgMTUsCisgICAgMTQsIDEyLCAxNiwgMTcsIDEyLCAxMywKKyAgICAxNSwgMTUsIDE2LCAxNiwgMTYsIDE3LAorICAgIDE3LCAxNiwgMTIsIDE1LCAxNywgMTUsCisgICAgMTYsIDE0LCAxNSwgMTYsIDE3LCAxNiwKKyAgICAxNywgMTcsIDE3LCAxNywgMTUsIDE2LAorICAgIDE1LCAxNSwgMTUsIDEyLCAxNiwgMTcsCisgICAgMTIsIDExLCAxNywgMTcsIDExLCAxMSwKKyAgICAxNCwgMTUsIDE1LCAxMywgMTMsIDE2LAorICAgIDE1LCAxMywgMTYsIDE1LCAxNiwgMTcsCisgICAgMTUsIDEzLCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTYsIDE0LCAxNywgMTcsIDE0LAorICAgIDE3LCAxNywgMTQsIDE2LCAxNywgMTQsCisgICAgMTEsIDE0LCAxNCwgMTYsIDE0LCAxMiwKKyAgICAxNiwgMTUsIDE2LCAxNSwgMTMsIDE1LAorICAgIDE2LCAxMywgMTQsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNiwgMTcsIDE3LCAxMSwKKyAgICAxNCwgMTcsIDE2LCAxNCwgMTUsIDE2LAorICAgIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTcsCisgICAgMTYsIDE1LCAxNCwgMTYsIDE2LCAxNiwKKyAgICAxMywgMTcsIDE3LCAxMywgMTUsIDE3LAorICAgIDE3LCAxNSwgMTUsIDE3LCAxNywgMTYsCisgICAgMTYsIDE1LCAxNywgMTcsIDE1LCAxNiwKKyAgICAxNywgMTcsIDE1LCAxNywgMTMsIDE0LAorICAgIDE2LCAxNCwgMTYsIDE1LCAxNSwgMTQsCisgICAgMTYsIDE3LCAxNSwgMTYsIDE2LCAxNSwKKyAgICAxNywgMTcsIDE2LCAxNSwgMTYsIDE2LAorICAgIDE2LCAxNSwgMTAsIDE2LCAxNywgMTcsCisgICAgMTUsIDExLCAxNiwgMTcsIDEyLCAxMywKKyAgICAxNCwgMTcsIDE1LCAxNSwgMTIsIDE3LAorICAgIDE1LCAxNCwgMTIsIDE1LCAxNywgMTcsCisgICAgMTUsIDE1LCAxNiwgMTcsIDE3LCAxNiwKKyAgICAxNCwgMTUsIDE1LCAxNSwgMTQsIDE1LAorICAgIDE2LCAxNSwgMTUsIDEyLCAxNywgMTUsCisgICAgMTMsIDExLCAxNiwgMTcsIDE3LCAxNiwKKyAgICAxMywgMTYsIDE3LCAxMSwgMTIsIDE1LAorICAgIDE2LCAxNywgMTQsIDE0LCAxNSwgMTcsCisgICAgMTEsIDEzLCAxNywgMTcsIDE3LCAxNSwKKyAgICAxNywgMTYsIDE1LCAxNiwgMTQsIDE2LAorICAgIDE2LCAxNywgMTQsIDEzLCAxNCwgMTYsCisgICAgMTcsIDE0LCAxNCwgMTUsIDE2LCAxMiwKKyAgICAxNSwgMTcsIDE3LCAxNiwgMTQsIDE3LAorICAgIDE2LCAxNywgMTcsIDE2LCAxNywgMTcsCisgICAgMTUsIDE2LCAxNywgMTUsIDE1LCAxNywKKyAgICAxNCwgMTUsIDE1LCAxMywgMTUsIDE1LAorICAgIDE1LCAxNiwgMTcsIDE3LCAxNiwgMTUsCisgICAgMTQsIDE3LCAxNywgMTcsIDE1LCAxNCwKKyAgICAxNiwgMTcsIDE3LCAxNywgMTEsIDE0LAorICAgIDE0LCAxNiwgMTcsIDE0LCAxNSwgMTYsCisgICAgMTQsIDEzLCAxNSwgMTQsIDE3LCAxNiwKKyAgICAxNSwgMTYsIDE3LCAxNywgMTEsIDE1LAorICAgIDE3LCAxNywgMTQsIDE0LCAxNiwgMTYsCisgICAgMTYsIDE0LCAxNywgMTcsIDE1LCAxNiwKKyAgICAxNCwgMTUsIDE3LCAxNiwgMTMsIDEzLAorICAgIDE2LCAxNiwgMTIsIDExLCAxNywgMTcsCisgICAgMTIsIDExLCAxNCwgMTYsIDE3LCAxNSwKKyAgICAxNCwgMTYsIDE3LCAxMywgMTUsIDE2LAorICAgIDE1LCAxNiwgMTYsIDE1LCAxNSwgMTUsCisgICAgMTMsIDE0LCAxNSwgMTUsIDE2LCAxNywKKyAgICAxNywgMTUsIDE1LCAxNiwgMTUsIDE2LAorICAgIDE2LCAxMywgMTAsIDE2LCAxNSwgMTUsCisgICAgMTUsICA3LCAxNCwgMTQsICA3LCAgNywKKyAgICAxMSwgMTIsIDEyLCAxMSwgMTIsIDE0LAorICAgIDE0LCAxMiwgMTUsIDE2LCAxMywgMTQsCisgICAgMTYsIDEzLCAxMywgMTUsIDEzLCAxMSwKKyAgICAxMiwgMTMsIDExLCAxNSwgMTUsIDEzLAorICAgIDEyLCAxNSwgMTIsIDE0LCAxNSwgMTIsCisgICAgIDcsIDEyLCAxMiwgMTIsIDExLCAgNiwKKyAgICAxMiwgMTIsIDEzLCAxMiwgIDksIDE0LAorICAgIDE0LCAgOSwgMTIsIDEzLCAxMywgMTIsCisgICAgMTQsIDE1LCAxNiwgMTcsIDE0LCAxMiwKKyAgICAxMywgMTMsIDE1LCAxMywgMTEsIDEyLAorICAgIDE0LCAxMiwgMTEsIDE0LCAxNSwgMTcsCisgICAgMTQsIDEyLCAxMywgMTIsIDEzLCAxNCwKKyAgICAgOSwgMTMsIDE1LCAgOSwgMTIsIDE3LAorICAgIDE2LCAxMiwgMTEsIDE0LCAxNCwgMTMsCisgICAgMTUsIDEzLCAxNiwgMTcsIDE0LCAxNSwKKyAgICAxNywgMTQsIDE0LCAxNSwgMTMsIDE1LAorICAgIDE0LCAxMiwgMTIsIDE0LCAxMiwgMTEsCisgICAgMTYsIDE1LCAxMywgMTMsIDE2LCAxMywKKyAgICAxNSwgMTUsIDE0LCAxMiwgMTMsIDE0LAorICAgIDE1LCAxNCwgMTMsIDE3LCAxNiwgMTYsCisgICAgMTYsIDE1LCAxNywgMTcsIDE0LCAxNCwKKyAgICAxNiwgMTQsIDE1LCAxNywgMTUsIDE3LAorICAgIDE3LCAxNiwgMTMsIDE0LCAxNiwgMTYsCisgICAgMTMsIDE0LCAxNCwgMTUsIDE0LCAxMiwKKyAgICAxNywgMTYsIDE3LCAxNywgMTYsIDE1LAorICAgIDE1LCAxNCwgMTYsIDE2LCAxNywgMTcsCisgICAgMTUsIDExLCAxNiwgMTYsIDEzLCAxMSwKKyAgICAxNCwgMTYsIDE3LCAxNCwgMTAsIDE3LAorICAgIDE2LCAxMiwgMTMsIDE1LCAxNywgMTYsCisgICAgMTQsIDEzLCAxNywgMTYsIDE0LCAxNSwKKyAgICAxNywgMTQsIDEzLCAxNCwgMTQsIDE2LAorICAgIDE1LCAxMywgMTMsIDE3LCAxNSwgMTIsCisgICAgMTIsIDE1LCAxNywgMTcsIDE1LCAxMiwKKyAgICAxNiwgMTYsIDExLCAxMSwgMTQsIDE3LAorICAgIDE3LCAxNCwgMTMsIDE1LCAxNywgMTIsCisgICAgMTIsIDE0LCAxNiwgMTcsIDE3LCAxNCwKKyAgICAxNSwgMTYsIDE0LCAxNSwgMTUsIDE2LAorICAgIDE1LCAxMywgMTMsIDE2LCAxNSwgMTUsCisgICAgMTMsIDE1LCAxNSwgMTMsIDEzLCAxNSwKKyAgICAxNiwgMTcsIDE1LCAxNCwgMTUsIDE2LAorICAgIDE3LCAxNywgMTQsIDE3LCAxNywgMTQsCisgICAgMTQsIDE1LCAxNCwgMTcsIDE2LCAxNiwKKyAgICAxNywgMTcsIDE3LCAxMiwgMTUsIDE2LAorICAgIDE3LCAxNSwgMTQsIDEyLCAxMywgMTUsCisgICAgMTIsIDE1LCAxNywgMTYsIDE2LCAxNiwKKyAgICAxNywgMTQsIDE0LCAxNSwgMTUsIDE3LAorICAgIDE3LCAxNSwgMTIsIDE2LCAxNiwgMTIsCisgICAgMTEsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTUsIDEzLCAxNSwgMTYsIDEzLAorICAgIDE0LCAxNiwgMTMsIDE2LCAxNCwgMTMsCisgICAgMTEsIDEyLCAxNCwgMTMsIDE2LCAxNSwKKyAgICAxMywgMTQsIDE1LCAxMywgMTUsIDE1LAorICAgIDEyLCAxMSwgMTUsIDEzLCAxMywgMTQsCisgICAgIDcsIDEyLCAxMywgMTIsIDEyLCAgOSwKKyAgICAxNSwgMTUsICA5LCAxMiwgMTQsIDEyLAorICAgIDEyLCAxNCwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTMsIDE0LCAxNiwgMTQsIDE0LCAxMiwKKyAgICAxMSwgMTMsIDE0LCAxMiwgMTQsIDE2LAorICAgIDE0LCAxNCwgMTIsIDE0LCAxMiwgMTIsCisgICAgMTIsICA5LCAxNCwgMTQsICA5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG9uMmF2Y19jYjdfc3ltc1tPTjJBVkNfQ0I3X0NPREVTXSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMiwgMHgwMDA0LCAweDAwMEMsIDB4MDAwRSwgMHgwMDExLAorICAgIDB4MDAxMywgMHgwMDFELCAweDAwMUYsIDB4MDAyMCwgMHgwMDIyLCAweDAwMjQsCisgICAgMHgwMDJDLCAweDAwMkUsIDB4MDAzMSwgMHgwMDMzLCAweDAwM0QsIDB4MDAzRiwKKyAgICAweDAwNDAsIDB4MDA0MiwgMHgwMDQ0LCAweDAwNEMsIDB4MDA0RSwgMHgwMEMwLAorICAgIDB4MDBDMiwgMHgwMEM0LCAweDAwQ0MsIDB4MDBDRSwgMHgwMEQxLCAweDAwRDMsCisgICAgMHgwMERELCAweDAwREYsIDB4MDBFMCwgMHgwMEUyLCAweDAwRTQsIDB4MDBFQywKKyAgICAweDAwRUUsIDB4MDBGMSwgMHgwMEYzLCAweDAwRkQsIDB4MDBGRiwgMHgwMTAxLAorICAgIDB4MDEwMywgMHgwMTBELCAweDAxMEYsIDB4MDExMCwgMHgwMTEyLCAweDAxMTQsCisgICAgMHgwMTFDLCAweDAxMUUsIDB4MDEyMSwgMHgwMTIzLCAweDAxMkQsIDB4MDEyRiwKKyAgICAweDAxMzAsIDB4MDEzMiwgMHgwMTM0LCAweDAxM0MsIDB4MDEzRSwgMHgwMTQxLAorICAgIDB4MDE0MywgMHgwMTRELCAweDAxNEYsIDB4MDFDMSwgMHgwMUMzLCAweDAxQ0QsCisgICAgMHgwMUNGLCAweDAxRDAsIDB4MDFEMiwgMHgwMUQ0LCAweDAxREMsIDB4MDFERSwKKyAgICAweDAxRTEsIDB4MDFFMywgMHgwMUVELCAweDAxRUYsIDB4MDFGMCwgMHgwMUYyLAorICAgIDB4MDFGNCwgMHgwMUZDLCAweDAxRkUsIDB4MDIwMCwgMHgwMjAyLCAweDAyMDQsCisgICAgMHgwMjBDLCAweDAyMEUsIDB4MDIxMSwgMHgwMjEzLCAweDAyMUQsIDB4MDIxRiwKKyAgICAweDAyMjAsIDB4MDIyMiwgMHgwMjI0LCAweDAyMkMsIDB4MDIyRSwgMHgwMjMxLAorICAgIDB4MDIzMywgMHgwMjNELCAweDAyM0YsIDB4MDI0MCwgMHgwMjQyLCAweDAyNDQsCisgICAgMHgwMjRDLCAweDAyNEUsIDB4MDJDMCwgMHgwMkMyLCAweDAyQzQsIDB4MDJDQywKKyAgICAweDAyQ0UsIDB4MDJEMSwgMHgwMkQzLCAweDAyREQsIDB4MDJERiwgMHgwMkUwLAorICAgIDB4MDJFMiwgMHgwMkU0LCAweDAyRUMsIDB4MDJFRSwgMHgwMkYxLCAweDAyRjMsCisgICAgMHgwMkZELCAweDAyRkYsIDB4MDMwMSwgMHgwMzAzLCAweDAzMEQsIDB4MDMwRiwKKyAgICAweDAzMTAsIDB4MDMxMiwgMHgwMzE0LCAweDAzMUMsIDB4MDMxRSwgMHgwMzIxLAorICAgIDB4MDMyMywgMHgwMzJELCAweDAzMkYsIDB4MDMzMCwgMHgwMzMyLCAweDAzMzQsCisgICAgMHgwMzNDLCAweDAzM0UsIDB4MDM0MSwgMHgwMzQzLCAweDAzNEQsIDB4MDM0RiwKKyAgICAweDAzQzEsIDB4MDNDMywgMHgwM0NELCAweDAzQ0YsIDB4MDNEMCwgMHgwM0QyLAorICAgIDB4MDNENCwgMHgwM0RDLCAweDAzREUsIDB4MDNFMSwgMHgwM0UzLCAweDAzRUQsCisgICAgMHgwM0VGLCAweDAzRjAsIDB4MDNGMiwgMHgwM0Y0LCAweDAzRkMsIDB4MDNGRSwKKyAgICAweDA0MDAsIDB4MDQwMiwgMHgwNDA0LCAweDA0MEMsIDB4MDQwRSwgMHgwNDExLAorICAgIDB4MDQxMywgMHgwNDFELCAweDA0MUYsIDB4MDQyMCwgMHgwNDIyLCAweDA0MjQsCisgICAgMHgwNDJDLCAweDA0MkUsIDB4MDQzMSwgMHgwNDMzLCAweDA0M0QsIDB4MDQzRiwKKyAgICAweDA0NDAsIDB4MDQ0MiwgMHgwNDQ0LCAweDA0NEMsIDB4MDQ0RSwgMHgwNEMwLAorICAgIDB4MDRDMiwgMHgwNEM0LCAweDA0Q0MsIDB4MDRDRSwgMHgwNEQxLCAweDA0RDMsCisgICAgMHgwNERELCAweDA0REYsIDB4MDRFMCwgMHgwNEUyLCAweDA0RTQsIDB4MDRFQywKKyAgICAweDA0RUUsIDB4MDRGMSwgMHgwNEYzLCAweDA0RkQsIDB4MDRGRiwgMHgwQzAwLAorICAgIDB4MEMwMiwgMHgwQzA0LCAweDBDMEMsIDB4MEMwRSwgMHgwQzExLCAweDBDMTMsCisgICAgMHgwQzFELCAweDBDMUYsIDB4MEMyMCwgMHgwQzIyLCAweDBDMjQsIDB4MEMyQywKKyAgICAweDBDMkUsIDB4MEMzMSwgMHgwQzMzLCAweDBDM0QsIDB4MEMzRiwgMHgwQzQwLAorICAgIDB4MEM0MiwgMHgwQzQ0LCAweDBDNEMsIDB4MEM0RSwgMHgwQ0MwLCAweDBDQzIsCisgICAgMHgwQ0M0LCAweDBDQ0MsIDB4MENDRSwgMHgwQ0QxLCAweDBDRDMsIDB4MENERCwKKyAgICAweDBDREYsIDB4MENFMCwgMHgwQ0UyLCAweDBDRTQsIDB4MENFQywgMHgwQ0VFLAorICAgIDB4MENGMSwgMHgwQ0YzLCAweDBDRkQsIDB4MENGRiwgMHgwRDAxLCAweDBEMDMsCisgICAgMHgwRDBELCAweDBEMEYsIDB4MEQxMCwgMHgwRDEyLCAweDBEMTQsIDB4MEQxQywKKyAgICAweDBEMUUsIDB4MEQyMSwgMHgwRDIzLCAweDBEMkQsIDB4MEQyRiwgMHgwRDMwLAorICAgIDB4MEQzMiwgMHgwRDM0LCAweDBEM0MsIDB4MEQzRSwgMHgwRDQxLCAweDBENDMsCisgICAgMHgwRDRELCAweDBENEYsIDB4MERDMSwgMHgwREMzLCAweDBEQ0QsIDB4MERDRiwKKyAgICAweDBERDAsIDB4MEREMiwgMHgwREQ0LCAweDBEREMsIDB4MERERSwgMHgwREUxLAorICAgIDB4MERFMywgMHgwREVELCAweDBERUYsIDB4MERGMCwgMHgwREYyLCAweDBERjQsCisgICAgMHgwREZDLCAweDBERkUsIDB4MEUwMCwgMHgwRTAyLCAweDBFMDQsIDB4MEUwQywKKyAgICAweDBFMEUsIDB4MEUxMSwgMHgwRTEzLCAweDBFMUQsIDB4MEUxRiwgMHgwRTIwLAorICAgIDB4MEUyMiwgMHgwRTI0LCAweDBFMkMsIDB4MEUyRSwgMHgwRTMxLCAweDBFMzMsCisgICAgMHgwRTNELCAweDBFM0YsIDB4MEU0MCwgMHgwRTQyLCAweDBFNDQsIDB4MEU0QywKKyAgICAweDBFNEUsIDB4MEVDMCwgMHgwRUMyLCAweDBFQzQsIDB4MEVDQywgMHgwRUNFLAorICAgIDB4MEVEMSwgMHgwRUQzLCAweDBFREQsIDB4MEVERiwgMHgwRUUwLCAweDBFRTIsCisgICAgMHgwRUU0LCAweDBFRUMsIDB4MEVFRSwgMHgwRUYxLCAweDBFRjMsIDB4MEVGRCwKKyAgICAweDBFRkYsIDB4MEYwMSwgMHgwRjAzLCAweDBGMEQsIDB4MEYwRiwgMHgwRjEwLAorICAgIDB4MEYxMiwgMHgwRjE0LCAweDBGMUMsIDB4MEYxRSwgMHgwRjIxLCAweDBGMjMsCisgICAgMHgwRjJELCAweDBGMkYsIDB4MEYzMCwgMHgwRjMyLCAweDBGMzQsIDB4MEYzQywKKyAgICAweDBGM0UsIDB4MEY0MSwgMHgwRjQzLCAweDBGNEQsIDB4MEY0RiwgMHgwRkMxLAorICAgIDB4MEZDMywgMHgwRkNELCAweDBGQ0YsIDB4MEZEMCwgMHgwRkQyLCAweDBGRDQsCisgICAgMHgwRkRDLCAweDBGREUsIDB4MEZFMSwgMHgwRkUzLCAweDBGRUQsIDB4MEZFRiwKKyAgICAweDBGRjAsIDB4MEZGMiwgMHgwRkY0LCAweDBGRkMsIDB4MEZGRSwgMHgxMDAxLAorICAgIDB4MTAwMywgMHgxMDBELCAweDEwMEYsIDB4MTAxMCwgMHgxMDEyLCAweDEwMTQsCisgICAgMHgxMDFDLCAweDEwMUUsIDB4MTAyMSwgMHgxMDIzLCAweDEwMkQsIDB4MTAyRiwKKyAgICAweDEwMzAsIDB4MTAzMiwgMHgxMDM0LCAweDEwM0MsIDB4MTAzRSwgMHgxMDQxLAorICAgIDB4MTA0MywgMHgxMDRELCAweDEwNEYsIDB4MTBDMSwgMHgxMEMzLCAweDEwQ0QsCisgICAgMHgxMENGLCAweDEwRDAsIDB4MTBEMiwgMHgxMEQ0LCAweDEwREMsIDB4MTBERSwKKyAgICAweDEwRTEsIDB4MTBFMywgMHgxMEVELCAweDEwRUYsIDB4MTBGMCwgMHgxMEYyLAorICAgIDB4MTBGNCwgMHgxMEZDLCAweDEwRkUsIDB4MTEwMCwgMHgxMTAyLCAweDExMDQsCisgICAgMHgxMTBDLCAweDExMEUsIDB4MTExMSwgMHgxMTEzLCAweDExMUQsIDB4MTExRiwKKyAgICAweDExMjAsIDB4MTEyMiwgMHgxMTI0LCAweDExMkMsIDB4MTEyRSwgMHgxMTMxLAorICAgIDB4MTEzMywgMHgxMTNELCAweDExM0YsIDB4MTE0MCwgMHgxMTQyLCAweDExNDQsCisgICAgMHgxMTRDLCAweDExNEUsIDB4MTFDMCwgMHgxMUMyLCAweDExQzQsIDB4MTFDQywKKyAgICAweDExQ0UsIDB4MTFEMSwgMHgxMUQzLCAweDExREQsIDB4MTFERiwgMHgxMUUwLAorICAgIDB4MTFFMiwgMHgxMUU0LCAweDExRUMsIDB4MTFFRSwgMHgxMUYxLCAweDExRjMsCisgICAgMHgxMUZELCAweDExRkYsIDB4MTIwMSwgMHgxMjAzLCAweDEyMEQsIDB4MTIwRiwKKyAgICAweDEyMTAsIDB4MTIxMiwgMHgxMjE0LCAweDEyMUMsIDB4MTIxRSwgMHgxMjIxLAorICAgIDB4MTIyMywgMHgxMjJELCAweDEyMkYsIDB4MTIzMCwgMHgxMjMyLCAweDEyMzQsCisgICAgMHgxMjNDLCAweDEyM0UsIDB4MTI0MSwgMHgxMjQzLCAweDEyNEQsIDB4MTI0RiwKKyAgICAweDEyQzEsIDB4MTJDMywgMHgxMkNELCAweDEyQ0YsIDB4MTJEMCwgMHgxMkQyLAorICAgIDB4MTJENCwgMHgxMkRDLCAweDEyREUsIDB4MTJFMSwgMHgxMkUzLCAweDEyRUQsCisgICAgMHgxMkVGLCAweDEyRjAsIDB4MTJGMiwgMHgxMkY0LCAweDEyRkMsIDB4MTJGRSwKKyAgICAweDEzMDAsIDB4MTMwMiwgMHgxMzA0LCAweDEzMEMsIDB4MTMwRSwgMHgxMzExLAorICAgIDB4MTMxMywgMHgxMzFELCAweDEzMUYsIDB4MTMyMCwgMHgxMzIyLCAweDEzMjQsCisgICAgMHgxMzJDLCAweDEzMkUsIDB4MTMzMSwgMHgxMzMzLCAweDEzM0QsIDB4MTMzRiwKKyAgICAweDEzNDAsIDB4MTM0MiwgMHgxMzQ0LCAweDEzNEMsIDB4MTM0RSwgMHgxM0MwLAorICAgIDB4MTNDMiwgMHgxM0M0LCAweDEzQ0MsIDB4MTNDRSwgMHgxM0QxLCAweDEzRDMsCisgICAgMHgxM0RELCAweDEzREYsIDB4MTNFMCwgMHgxM0UyLCAweDEzRTQsIDB4MTNFQywKKyAgICAweDEzRUUsIDB4MTNGMSwgMHgxM0YzLCAweDEzRkQsIDB4MTNGRiwgMHgxNDAxLAorICAgIDB4MTQwMywgMHgxNDBELCAweDE0MEYsIDB4MTQxMCwgMHgxNDEyLCAweDE0MTQsCisgICAgMHgxNDFDLCAweDE0MUUsIDB4MTQyMSwgMHgxNDIzLCAweDE0MkQsIDB4MTQyRiwKKyAgICAweDE0MzAsIDB4MTQzMiwgMHgxNDM0LCAweDE0M0MsIDB4MTQzRSwgMHgxNDQxLAorICAgIDB4MTQ0MywgMHgxNDRELCAweDE0NEYsIDB4MTRDMSwgMHgxNEMzLCAweDE0Q0QsCisgICAgMHgxNENGLCAweDE0RDAsIDB4MTREMiwgMHgxNEQ0LCAweDE0REMsIDB4MTRERSwKKyAgICAweDE0RTEsIDB4MTRFMywgMHgxNEVELCAweDE0RUYsIDB4MTRGMCwgMHgxNEYyLAorICAgIDB4MTRGNCwgMHgxNEZDLCAweDE0RkUsIDB4MUMwMSwgMHgxQzAzLCAweDFDMEQsCisgICAgMHgxQzBGLCAweDFDMTAsIDB4MUMxMiwgMHgxQzE0LCAweDFDMUMsIDB4MUMxRSwKKyAgICAweDFDMjEsIDB4MUMyMywgMHgxQzJELCAweDFDMkYsIDB4MUMzMCwgMHgxQzMyLAorICAgIDB4MUMzNCwgMHgxQzNDLCAweDFDM0UsIDB4MUM0MSwgMHgxQzQzLCAweDFDNEQsCisgICAgMHgxQzRGLCAweDFDQzEsIDB4MUNDMywgMHgxQ0NELCAweDFDQ0YsIDB4MUNEMCwKKyAgICAweDFDRDIsIDB4MUNENCwgMHgxQ0RDLCAweDFDREUsIDB4MUNFMSwgMHgxQ0UzLAorICAgIDB4MUNFRCwgMHgxQ0VGLCAweDFDRjAsIDB4MUNGMiwgMHgxQ0Y0LCAweDFDRkMsCisgICAgMHgxQ0ZFLCAweDFEMDAsIDB4MUQwMiwgMHgxRDA0LCAweDFEMEMsIDB4MUQwRSwKKyAgICAweDFEMTEsIDB4MUQxMywgMHgxRDFELCAweDFEMUYsIDB4MUQyMCwgMHgxRDIyLAorICAgIDB4MUQyNCwgMHgxRDJDLCAweDFEMkUsIDB4MUQzMSwgMHgxRDMzLCAweDFEM0QsCisgICAgMHgxRDNGLCAweDFENDAsIDB4MUQ0MiwgMHgxRDQ0LCAweDFENEMsIDB4MUQ0RSwKKyAgICAweDFEQzAsIDB4MURDMiwgMHgxREM0LCAweDFEQ0MsIDB4MURDRSwgMHgxREQxLAorICAgIDB4MUREMywgMHgxRERELCAweDFEREYsIDB4MURFMCwgMHgxREUyLCAweDFERTQsCisgICAgMHgxREVDLCAweDFERUUsIDB4MURGMSwgMHgxREYzLCAweDFERkQsIDB4MURGRiwKKyAgICAweDFFMDEsIDB4MUUwMywgMHgxRTBELCAweDFFMEYsIDB4MUUxMCwgMHgxRTEyLAorICAgIDB4MUUxNCwgMHgxRTFDLCAweDFFMUUsIDB4MUUyMSwgMHgxRTIzLCAweDFFMkQsCisgICAgMHgxRTJGLCAweDFFMzAsIDB4MUUzMiwgMHgxRTM0LCAweDFFM0MsIDB4MUUzRSwKKyAgICAweDFFNDEsIDB4MUU0MywgMHgxRTRELCAweDFFNEYsIDB4MUVDMSwgMHgxRUMzLAorICAgIDB4MUVDRCwgMHgxRUNGLCAweDFFRDAsIDB4MUVEMiwgMHgxRUQ0LCAweDFFREMsCisgICAgMHgxRURFLCAweDFFRTEsIDB4MUVFMywgMHgxRUVELCAweDFFRUYsIDB4MUVGMCwKKyAgICAweDFFRjIsIDB4MUVGNCwgMHgxRUZDLCAweDFFRkUsIDB4MUYwMCwgMHgxRjAyLAorICAgIDB4MUYwNCwgMHgxRjBDLCAweDFGMEUsIDB4MUYxMSwgMHgxRjEzLCAweDFGMUQsCisgICAgMHgxRjFGLCAweDFGMjAsIDB4MUYyMiwgMHgxRjI0LCAweDFGMkMsIDB4MUYyRSwKKyAgICAweDFGMzEsIDB4MUYzMywgMHgxRjNELCAweDFGM0YsIDB4MUY0MCwgMHgxRjQyLAorICAgIDB4MUY0NCwgMHgxRjRDLCAweDFGNEUsIDB4MUZDMCwgMHgxRkMyLCAweDFGQzQsCisgICAgMHgxRkNDLCAweDFGQ0UsIDB4MUZEMSwgMHgxRkQzLCAweDFGREQsIDB4MUZERiwKKyAgICAweDFGRTAsIDB4MUZFMiwgMHgxRkU0LCAweDFGRUMsIDB4MUZFRSwgMHgxRkYxLAorICAgIDB4MUZGMywgMHgxRkZELCAweDFGRkYsIDB4MjAwMCwgMHgyMDAyLCAweDIwMDQsCisgICAgMHgyMDBDLCAweDIwMEUsIDB4MjAxMSwgMHgyMDEzLCAweDIwMUQsIDB4MjAxRiwKKyAgICAweDIwMjAsIDB4MjAyMiwgMHgyMDI0LCAweDIwMkMsIDB4MjAyRSwgMHgyMDMxLAorICAgIDB4MjAzMywgMHgyMDNELCAweDIwM0YsIDB4MjA0MCwgMHgyMDQyLCAweDIwNDQsCisgICAgMHgyMDRDLCAweDIwNEUsIDB4MjBDMCwgMHgyMEMyLCAweDIwQzQsIDB4MjBDQywKKyAgICAweDIwQ0UsIDB4MjBEMSwgMHgyMEQzLCAweDIwREQsIDB4MjBERiwgMHgyMEUwLAorICAgIDB4MjBFMiwgMHgyMEU0LCAweDIwRUMsIDB4MjBFRSwgMHgyMEYxLCAweDIwRjMsCisgICAgMHgyMEZELCAweDIwRkYsIDB4MjEwMSwgMHgyMTAzLCAweDIxMEQsIDB4MjEwRiwKKyAgICAweDIxMTAsIDB4MjExMiwgMHgyMTE0LCAweDIxMUMsIDB4MjExRSwgMHgyMTIxLAorICAgIDB4MjEyMywgMHgyMTJELCAweDIxMkYsIDB4MjEzMCwgMHgyMTMyLCAweDIxMzQsCisgICAgMHgyMTNDLCAweDIxM0UsIDB4MjE0MSwgMHgyMTQzLCAweDIxNEQsIDB4MjE0RiwKKyAgICAweDIxQzEsIDB4MjFDMywgMHgyMUNELCAweDIxQ0YsIDB4MjFEMCwgMHgyMUQyLAorICAgIDB4MjFENCwgMHgyMURDLCAweDIxREUsIDB4MjFFMSwgMHgyMUUzLCAweDIxRUQsCisgICAgMHgyMUVGLCAweDIxRjAsIDB4MjFGMiwgMHgyMUY0LCAweDIxRkMsIDB4MjFGRSwKKyAgICAweDIyMDAsIDB4MjIwMiwgMHgyMjA0LCAweDIyMEMsIDB4MjIwRSwgMHgyMjExLAorICAgIDB4MjIxMywgMHgyMjFELCAweDIyMUYsIDB4MjIyMCwgMHgyMjIyLCAweDIyMjQsCisgICAgMHgyMjJDLCAweDIyMkUsIDB4MjIzMSwgMHgyMjMzLCAweDIyM0QsIDB4MjIzRiwKKyAgICAweDIyNDAsIDB4MjI0MiwgMHgyMjQ0LCAweDIyNEMsIDB4MjI0RSwgMHgyMkMwLAorICAgIDB4MjJDMiwgMHgyMkM0LCAweDIyQ0MsIDB4MjJDRSwgMHgyMkQxLCAweDIyRDMsCisgICAgMHgyMkRELCAweDIyREYsIDB4MjJFMCwgMHgyMkUyLCAweDIyRTQsIDB4MjJFQywKKyAgICAweDIyRUUsIDB4MjJGMSwgMHgyMkYzLCAweDIyRkQsIDB4MjJGRiwgMHgyMzAxLAorICAgIDB4MjMwMywgMHgyMzBELCAweDIzMEYsIDB4MjMxMCwgMHgyMzEyLCAweDIzMTQsCisgICAgMHgyMzFDLCAweDIzMUUsIDB4MjMyMSwgMHgyMzIzLCAweDIzMkQsIDB4MjMyRiwKKyAgICAweDIzMzAsIDB4MjMzMiwgMHgyMzM0LCAweDIzM0MsIDB4MjMzRSwgMHgyMzQxLAorICAgIDB4MjM0MywgMHgyMzRELCAweDIzNEYsIDB4MjNDMSwgMHgyM0MzLCAweDIzQ0QsCisgICAgMHgyM0NGLCAweDIzRDAsIDB4MjNEMiwgMHgyM0Q0LCAweDIzREMsIDB4MjNERSwKKyAgICAweDIzRTEsIDB4MjNFMywgMHgyM0VELCAweDIzRUYsIDB4MjNGMCwgMHgyM0YyLAorICAgIDB4MjNGNCwgMHgyM0ZDLCAweDIzRkUsIDB4MjQwMCwgMHgyNDAyLCAweDI0MDQsCisgICAgMHgyNDBDLCAweDI0MEUsIDB4MjQxMSwgMHgyNDEzLCAweDI0MUQsIDB4MjQxRiwKKyAgICAweDI0MjAsIDB4MjQyMiwgMHgyNDI0LCAweDI0MkMsIDB4MjQyRSwgMHgyNDMxLAorICAgIDB4MjQzMywgMHgyNDNELCAweDI0M0YsIDB4MjQ0MCwgMHgyNDQyLCAweDI0NDQsCisgICAgMHgyNDRDLCAweDI0NEUsIDB4MjRDMCwgMHgyNEMyLCAweDI0QzQsIDB4MjRDQywKKyAgICAweDI0Q0UsIDB4MjREMSwgMHgyNEQzLCAweDI0REQsIDB4MjRERiwgMHgyNEUwLAorICAgIDB4MjRFMiwgMHgyNEU0LCAweDI0RUMsIDB4MjRFRSwgMHgyNEYxLCAweDI0RjMsCisgICAgMHgyNEZELCAweDI0RkYsIDB4MkMwMCwgMHgyQzAyLCAweDJDMDQsIDB4MkMwQywKKyAgICAweDJDMEUsIDB4MkMxMSwgMHgyQzEzLCAweDJDMUQsIDB4MkMxRiwgMHgyQzIwLAorICAgIDB4MkMyMiwgMHgyQzI0LCAweDJDMkMsIDB4MkMyRSwgMHgyQzMxLCAweDJDMzMsCisgICAgMHgyQzNELCAweDJDM0YsIDB4MkM0MCwgMHgyQzQyLCAweDJDNDQsIDB4MkM0QywKKyAgICAweDJDNEUsIDB4MkNDMCwgMHgyQ0MyLCAweDJDQzQsIDB4MkNDQywgMHgyQ0NFLAorICAgIDB4MkNEMSwgMHgyQ0QzLCAweDJDREQsIDB4MkNERiwgMHgyQ0UwLCAweDJDRTIsCisgICAgMHgyQ0U0LCAweDJDRUMsIDB4MkNFRSwgMHgyQ0YxLCAweDJDRjMsIDB4MkNGRCwKKyAgICAweDJDRkYsIDB4MkQwMSwgMHgyRDAzLCAweDJEMEQsIDB4MkQwRiwgMHgyRDEwLAorICAgIDB4MkQxMiwgMHgyRDE0LCAweDJEMUMsIDB4MkQxRSwgMHgyRDIxLCAweDJEMjMsCisgICAgMHgyRDJELCAweDJEMkYsIDB4MkQzMCwgMHgyRDMyLCAweDJEMzQsIDB4MkQzQywKKyAgICAweDJEM0UsIDB4MkQ0MSwgMHgyRDQzLCAweDJENEQsIDB4MkQ0RiwgMHgyREMxLAorICAgIDB4MkRDMywgMHgyRENELCAweDJEQ0YsIDB4MkREMCwgMHgyREQyLCAweDJERDQsCisgICAgMHgyRERDLCAweDJEREUsIDB4MkRFMSwgMHgyREUzLCAweDJERUQsIDB4MkRFRiwKKyAgICAweDJERjAsIDB4MkRGMiwgMHgyREY0LCAweDJERkMsIDB4MkRGRSwgMHgyRTAwLAorICAgIDB4MkUwMiwgMHgyRTA0LCAweDJFMEMsIDB4MkUwRSwgMHgyRTExLCAweDJFMTMsCisgICAgMHgyRTFELCAweDJFMUYsIDB4MkUyMCwgMHgyRTIyLCAweDJFMjQsIDB4MkUyQywKKyAgICAweDJFMkUsIDB4MkUzMSwgMHgyRTMzLCAweDJFM0QsIDB4MkUzRiwgMHgyRTQwLAorICAgIDB4MkU0MiwgMHgyRTQ0LCAweDJFNEMsIDB4MkU0RSwgMHgyRUMwLCAweDJFQzIsCisgICAgMHgyRUM0LCAweDJFQ0MsIDB4MkVDRSwgMHgyRUQxLCAweDJFRDMsIDB4MkVERCwKKyAgICAweDJFREYsIDB4MkVFMCwgMHgyRUUyLCAweDJFRTQsIDB4MkVFQywgMHgyRUVFLAorICAgIDB4MkVGMSwgMHgyRUYzLCAweDJFRkQsIDB4MkVGRiwgMHgyRjAxLCAweDJGMDMsCisgICAgMHgyRjBELCAweDJGMEYsIDB4MkYxMCwgMHgyRjEyLCAweDJGMTQsIDB4MkYxQywKKyAgICAweDJGMUUsIDB4MkYyMSwgMHgyRjIzLCAweDJGMkQsIDB4MkYyRiwgMHgyRjMwLAorICAgIDB4MkYzMiwgMHgyRjM0LCAweDJGM0MsIDB4MkYzRSwgMHgyRjQxLCAweDJGNDMsCisgICAgMHgyRjRELCAweDJGNEYsIDB4MkZDMSwgMHgyRkMzLCAweDJGQ0QsIDB4MkZDRiwKKyAgICAweDJGRDAsIDB4MkZEMiwgMHgyRkQ0LCAweDJGREMsIDB4MkZERSwgMHgyRkUxLAorICAgIDB4MkZFMywgMHgyRkVELCAweDJGRUYsIDB4MkZGMCwgMHgyRkYyLCAweDJGRjQsCisgICAgMHgyRkZDLCAweDJGRkUsIDB4MzAwMSwgMHgzMDAzLCAweDMwMEQsIDB4MzAwRiwKKyAgICAweDMwMTAsIDB4MzAxMiwgMHgzMDE0LCAweDMwMUMsIDB4MzAxRSwgMHgzMDIxLAorICAgIDB4MzAyMywgMHgzMDJELCAweDMwMkYsIDB4MzAzMCwgMHgzMDMyLCAweDMwMzQsCisgICAgMHgzMDNDLCAweDMwM0UsIDB4MzA0MSwgMHgzMDQzLCAweDMwNEQsIDB4MzA0RiwKKyAgICAweDMwQzEsIDB4MzBDMywgMHgzMENELCAweDMwQ0YsIDB4MzBEMCwgMHgzMEQyLAorICAgIDB4MzBENCwgMHgzMERDLCAweDMwREUsIDB4MzBFMSwgMHgzMEUzLCAweDMwRUQsCisgICAgMHgzMEVGLCAweDMwRjAsIDB4MzBGMiwgMHgzMEY0LCAweDMwRkMsIDB4MzBGRSwKKyAgICAweDMxMDAsIDB4MzEwMiwgMHgzMTA0LCAweDMxMEMsIDB4MzEwRSwgMHgzMTExLAorICAgIDB4MzExMywgMHgzMTFELCAweDMxMUYsIDB4MzEyMCwgMHgzMTIyLCAweDMxMjQsCisgICAgMHgzMTJDLCAweDMxMkUsIDB4MzEzMSwgMHgzMTMzLCAweDMxM0QsIDB4MzEzRiwKKyAgICAweDMxNDAsIDB4MzE0MiwgMHgzMTQ0LCAweDMxNEMsIDB4MzE0RSwgMHgzMUMwLAorICAgIDB4MzFDMiwgMHgzMUM0LCAweDMxQ0MsIDB4MzFDRSwgMHgzMUQxLCAweDMxRDMsCisgICAgMHgzMURELCAweDMxREYsIDB4MzFFMCwgMHgzMUUyLCAweDMxRTQsIDB4MzFFQywKKyAgICAweDMxRUUsIDB4MzFGMSwgMHgzMUYzLCAweDMxRkQsIDB4MzFGRiwgMHgzMjAxLAorICAgIDB4MzIwMywgMHgzMjBELCAweDMyMEYsIDB4MzIxMCwgMHgzMjEyLCAweDMyMTQsCisgICAgMHgzMjFDLCAweDMyMUUsIDB4MzIyMSwgMHgzMjIzLCAweDMyMkQsIDB4MzIyRiwKKyAgICAweDMyMzAsIDB4MzIzMiwgMHgzMjM0LCAweDMyM0MsIDB4MzIzRSwgMHgzMjQxLAorICAgIDB4MzI0MywgMHgzMjRELCAweDMyNEYsIDB4MzJDMSwgMHgzMkMzLCAweDMyQ0QsCisgICAgMHgzMkNGLCAweDMyRDAsIDB4MzJEMiwgMHgzMkQ0LCAweDMyREMsIDB4MzJERSwKKyAgICAweDMyRTEsIDB4MzJFMywgMHgzMkVELCAweDMyRUYsIDB4MzJGMCwgMHgzMkYyLAorICAgIDB4MzJGNCwgMHgzMkZDLCAweDMyRkUsIDB4MzMwMCwgMHgzMzAyLCAweDMzMDQsCisgICAgMHgzMzBDLCAweDMzMEUsIDB4MzMxMSwgMHgzMzEzLCAweDMzMUQsIDB4MzMxRiwKKyAgICAweDMzMjAsIDB4MzMyMiwgMHgzMzI0LCAweDMzMkMsIDB4MzMyRSwgMHgzMzMxLAorICAgIDB4MzMzMywgMHgzMzNELCAweDMzM0YsIDB4MzM0MCwgMHgzMzQyLCAweDMzNDQsCisgICAgMHgzMzRDLCAweDMzNEUsIDB4MzNDMCwgMHgzM0MyLCAweDMzQzQsIDB4MzNDQywKKyAgICAweDMzQ0UsIDB4MzNEMSwgMHgzM0QzLCAweDMzREQsIDB4MzNERiwgMHgzM0UwLAorICAgIDB4MzNFMiwgMHgzM0U0LCAweDMzRUMsIDB4MzNFRSwgMHgzM0YxLCAweDMzRjMsCisgICAgMHgzM0ZELCAweDMzRkYsIDB4MzQwMSwgMHgzNDAzLCAweDM0MEQsIDB4MzQwRiwKKyAgICAweDM0MTAsIDB4MzQxMiwgMHgzNDE0LCAweDM0MUMsIDB4MzQxRSwgMHgzNDIxLAorICAgIDB4MzQyMywgMHgzNDJELCAweDM0MkYsIDB4MzQzMCwgMHgzNDMyLCAweDM0MzQsCisgICAgMHgzNDNDLCAweDM0M0UsIDB4MzQ0MSwgMHgzNDQzLCAweDM0NEQsIDB4MzQ0RiwKKyAgICAweDM0QzEsIDB4MzRDMywgMHgzNENELCAweDM0Q0YsIDB4MzREMCwgMHgzNEQyLAorICAgIDB4MzRENCwgMHgzNERDLCAweDM0REUsIDB4MzRFMSwgMHgzNEUzLCAweDM0RUQsCisgICAgMHgzNEVGLCAweDM0RjAsIDB4MzRGMiwgMHgzNEY0LCAweDM0RkMsIDB4MzRGRSwKKyAgICAweDNDMDEsIDB4M0MwMywgMHgzQzBELCAweDNDMEYsIDB4M0MxMCwgMHgzQzEyLAorICAgIDB4M0MxNCwgMHgzQzFDLCAweDNDMUUsIDB4M0MyMSwgMHgzQzIzLCAweDNDMkQsCisgICAgMHgzQzJGLCAweDNDMzAsIDB4M0MzMiwgMHgzQzM0LCAweDNDM0MsIDB4M0MzRSwKKyAgICAweDNDNDEsIDB4M0M0MywgMHgzQzRELCAweDNDNEYsIDB4M0NDMSwgMHgzQ0MzLAorICAgIDB4M0NDRCwgMHgzQ0NGLCAweDNDRDAsIDB4M0NEMiwgMHgzQ0Q0LCAweDNDREMsCisgICAgMHgzQ0RFLCAweDNDRTEsIDB4M0NFMywgMHgzQ0VELCAweDNDRUYsIDB4M0NGMCwKKyAgICAweDNDRjIsIDB4M0NGNCwgMHgzQ0ZDLCAweDNDRkUsIDB4M0QwMCwgMHgzRDAyLAorICAgIDB4M0QwNCwgMHgzRDBDLCAweDNEMEUsIDB4M0QxMSwgMHgzRDEzLCAweDNEMUQsCisgICAgMHgzRDFGLCAweDNEMjAsIDB4M0QyMiwgMHgzRDI0LCAweDNEMkMsIDB4M0QyRSwKKyAgICAweDNEMzEsIDB4M0QzMywgMHgzRDNELCAweDNEM0YsIDB4M0Q0MCwgMHgzRDQyLAorICAgIDB4M0Q0NCwgMHgzRDRDLCAweDNENEUsIDB4M0RDMCwgMHgzREMyLCAweDNEQzQsCisgICAgMHgzRENDLCAweDNEQ0UsIDB4M0REMSwgMHgzREQzLCAweDNEREQsIDB4M0RERiwKKyAgICAweDNERTAsIDB4M0RFMiwgMHgzREU0LCAweDNERUMsIDB4M0RFRSwgMHgzREYxLAorICAgIDB4M0RGMywgMHgzREZELCAweDNERkYsIDB4M0UwMSwgMHgzRTAzLCAweDNFMEQsCisgICAgMHgzRTBGLCAweDNFMTAsIDB4M0UxMiwgMHgzRTE0LCAweDNFMUMsIDB4M0UxRSwKKyAgICAweDNFMjEsIDB4M0UyMywgMHgzRTJELCAweDNFMkYsIDB4M0UzMCwgMHgzRTMyLAorICAgIDB4M0UzNCwgMHgzRTNDLCAweDNFM0UsIDB4M0U0MSwgMHgzRTQzLCAweDNFNEQsCisgICAgMHgzRTRGLCAweDNFQzEsIDB4M0VDMywgMHgzRUNELCAweDNFQ0YsIDB4M0VEMCwKKyAgICAweDNFRDIsIDB4M0VENCwgMHgzRURDLCAweDNFREUsIDB4M0VFMSwgMHgzRUUzLAorICAgIDB4M0VFRCwgMHgzRUVGLCAweDNFRjAsIDB4M0VGMiwgMHgzRUY0LCAweDNFRkMsCisgICAgMHgzRUZFLCAweDNGMDAsIDB4M0YwMiwgMHgzRjA0LCAweDNGMEMsIDB4M0YwRSwKKyAgICAweDNGMTEsIDB4M0YxMywgMHgzRjFELCAweDNGMUYsIDB4M0YyMCwgMHgzRjIyLAorICAgIDB4M0YyNCwgMHgzRjJDLCAweDNGMkUsIDB4M0YzMSwgMHgzRjMzLCAweDNGM0QsCisgICAgMHgzRjNGLCAweDNGNDAsIDB4M0Y0MiwgMHgzRjQ0LCAweDNGNEMsIDB4M0Y0RSwKKyAgICAweDNGQzAsIDB4M0ZDMiwgMHgzRkM0LCAweDNGQ0MsIDB4M0ZDRSwgMHgzRkQxLAorICAgIDB4M0ZEMywgMHgzRkRELCAweDNGREYsIDB4M0ZFMCwgMHgzRkUyLCAweDNGRTQsCisgICAgMHgzRkVDLCAweDNGRUUsIDB4M0ZGMSwgMHgzRkYzLCAweDNGRkQsIDB4M0ZGRiwKKyAgICAweDQwMDAsIDB4NDAwMiwgMHg0MDA0LCAweDQwMEMsIDB4NDAwRSwgMHg0MDExLAorICAgIDB4NDAxMywgMHg0MDFELCAweDQwMUYsIDB4NDAyMCwgMHg0MDIyLCAweDQwMjQsCisgICAgMHg0MDJDLCAweDQwMkUsIDB4NDAzMSwgMHg0MDMzLCAweDQwM0QsIDB4NDAzRiwKKyAgICAweDQwNDAsIDB4NDA0MiwgMHg0MDQ0LCAweDQwNEMsIDB4NDA0RSwgMHg0MEMwLAorICAgIDB4NDBDMiwgMHg0MEM0LCAweDQwQ0MsIDB4NDBDRSwgMHg0MEQxLCAweDQwRDMsCisgICAgMHg0MERELCAweDQwREYsIDB4NDBFMCwgMHg0MEUyLCAweDQwRTQsIDB4NDBFQywKKyAgICAweDQwRUUsIDB4NDBGMSwgMHg0MEYzLCAweDQwRkQsIDB4NDBGRiwgMHg0MTAxLAorICAgIDB4NDEwMywgMHg0MTBELCAweDQxMEYsIDB4NDExMCwgMHg0MTEyLCAweDQxMTQsCisgICAgMHg0MTFDLCAweDQxMUUsIDB4NDEyMSwgMHg0MTIzLCAweDQxMkQsIDB4NDEyRiwKKyAgICAweDQxMzAsIDB4NDEzMiwgMHg0MTM0LCAweDQxM0MsIDB4NDEzRSwgMHg0MTQxLAorICAgIDB4NDE0MywgMHg0MTRELCAweDQxNEYsIDB4NDFDMSwgMHg0MUMzLCAweDQxQ0QsCisgICAgMHg0MUNGLCAweDQxRDAsIDB4NDFEMiwgMHg0MUQ0LCAweDQxREMsIDB4NDFERSwKKyAgICAweDQxRTEsIDB4NDFFMywgMHg0MUVELCAweDQxRUYsIDB4NDFGMCwgMHg0MUYyLAorICAgIDB4NDFGNCwgMHg0MUZDLCAweDQxRkUsIDB4NDIwMCwgMHg0MjAyLCAweDQyMDQsCisgICAgMHg0MjBDLCAweDQyMEUsIDB4NDIxMSwgMHg0MjEzLCAweDQyMUQsIDB4NDIxRiwKKyAgICAweDQyMjAsIDB4NDIyMiwgMHg0MjI0LCAweDQyMkMsIDB4NDIyRSwgMHg0MjMxLAorICAgIDB4NDIzMywgMHg0MjNELCAweDQyM0YsIDB4NDI0MCwgMHg0MjQyLCAweDQyNDQsCisgICAgMHg0MjRDLCAweDQyNEUsIDB4NDJDMCwgMHg0MkMyLCAweDQyQzQsIDB4NDJDQywKKyAgICAweDQyQ0UsIDB4NDJEMSwgMHg0MkQzLCAweDQyREQsIDB4NDJERiwgMHg0MkUwLAorICAgIDB4NDJFMiwgMHg0MkU0LCAweDQyRUMsIDB4NDJFRSwgMHg0MkYxLCAweDQyRjMsCisgICAgMHg0MkZELCAweDQyRkYsIDB4NDMwMSwgMHg0MzAzLCAweDQzMEQsIDB4NDMwRiwKKyAgICAweDQzMTAsIDB4NDMxMiwgMHg0MzE0LCAweDQzMUMsIDB4NDMxRSwgMHg0MzIxLAorICAgIDB4NDMyMywgMHg0MzJELCAweDQzMkYsIDB4NDMzMCwgMHg0MzMyLCAweDQzMzQsCisgICAgMHg0MzNDLCAweDQzM0UsIDB4NDM0MSwgMHg0MzQzLCAweDQzNEQsIDB4NDM0RiwKKyAgICAweDQzQzEsIDB4NDNDMywgMHg0M0NELCAweDQzQ0YsIDB4NDNEMCwgMHg0M0QyLAorICAgIDB4NDNENCwgMHg0M0RDLCAweDQzREUsIDB4NDNFMSwgMHg0M0UzLCAweDQzRUQsCisgICAgMHg0M0VGLCAweDQzRjAsIDB4NDNGMiwgMHg0M0Y0LCAweDQzRkMsIDB4NDNGRSwKKyAgICAweDQ0MDAsIDB4NDQwMiwgMHg0NDA0LCAweDQ0MEMsIDB4NDQwRSwgMHg0NDExLAorICAgIDB4NDQxMywgMHg0NDFELCAweDQ0MUYsIDB4NDQyMCwgMHg0NDIyLCAweDQ0MjQsCisgICAgMHg0NDJDLCAweDQ0MkUsIDB4NDQzMSwgMHg0NDMzLCAweDQ0M0QsIDB4NDQzRiwKKyAgICAweDQ0NDAsIDB4NDQ0MiwgMHg0NDQ0LCAweDQ0NEMsIDB4NDQ0RSwgMHg0NEMwLAorICAgIDB4NDRDMiwgMHg0NEM0LCAweDQ0Q0MsIDB4NDRDRSwgMHg0NEQxLCAweDQ0RDMsCisgICAgMHg0NERELCAweDQ0REYsIDB4NDRFMCwgMHg0NEUyLCAweDQ0RTQsIDB4NDRFQywKKyAgICAweDQ0RUUsIDB4NDRGMSwgMHg0NEYzLCAweDQ0RkQsIDB4NDRGRiwgMHg0QzAwLAorICAgIDB4NEMwMiwgMHg0QzA0LCAweDRDMEMsIDB4NEMwRSwgMHg0QzExLCAweDRDMTMsCisgICAgMHg0QzFELCAweDRDMUYsIDB4NEMyMCwgMHg0QzIyLCAweDRDMjQsIDB4NEMyQywKKyAgICAweDRDMkUsIDB4NEMzMSwgMHg0QzMzLCAweDRDM0QsIDB4NEMzRiwgMHg0QzQwLAorICAgIDB4NEM0MiwgMHg0QzQ0LCAweDRDNEMsIDB4NEM0RSwgMHg0Q0MwLCAweDRDQzIsCisgICAgMHg0Q0M0LCAweDRDQ0MsIDB4NENDRSwgMHg0Q0QxLCAweDRDRDMsIDB4NENERCwKKyAgICAweDRDREYsIDB4NENFMCwgMHg0Q0UyLCAweDRDRTQsIDB4NENFQywgMHg0Q0VFLAorICAgIDB4NENGMSwgMHg0Q0YzLCAweDRDRkQsIDB4NENGRiwgMHg0RDAxLCAweDREMDMsCisgICAgMHg0RDBELCAweDREMEYsIDB4NEQxMCwgMHg0RDEyLCAweDREMTQsIDB4NEQxQywKKyAgICAweDREMUUsIDB4NEQyMSwgMHg0RDIzLCAweDREMkQsIDB4NEQyRiwgMHg0RDMwLAorICAgIDB4NEQzMiwgMHg0RDM0LCAweDREM0MsIDB4NEQzRSwgMHg0RDQxLCAweDRENDMsCisgICAgMHg0RDRELCAweDRENEYsIDB4NERDMSwgMHg0REMzLCAweDREQ0QsIDB4NERDRiwKKyAgICAweDRERDAsIDB4NEREMiwgMHg0REQ0LCAweDREREMsIDB4NERERSwgMHg0REUxLAorICAgIDB4NERFMywgMHg0REVELCAweDRERUYsIDB4NERGMCwgMHg0REYyLCAweDRERjQsCisgICAgMHg0REZDLCAweDRERkUsIDB4NEUwMCwgMHg0RTAyLCAweDRFMDQsIDB4NEUwQywKKyAgICAweDRFMEUsIDB4NEUxMSwgMHg0RTEzLCAweDRFMUQsIDB4NEUxRiwgMHg0RTIwLAorICAgIDB4NEUyMiwgMHg0RTI0LCAweDRFMkMsIDB4NEUyRSwgMHg0RTMxLCAweDRFMzMsCisgICAgMHg0RTNELCAweDRFM0YsIDB4NEU0MCwgMHg0RTQyLCAweDRFNDQsIDB4NEU0QywKKyAgICAweDRFNEUsIDB4NEVDMCwgMHg0RUMyLCAweDRFQzQsIDB4NEVDQywgMHg0RUNFLAorICAgIDB4NEVEMSwgMHg0RUQzLCAweDRFREQsIDB4NEVERiwgMHg0RUUwLCAweDRFRTIsCisgICAgMHg0RUU0LCAweDRFRUMsIDB4NEVFRSwgMHg0RUYxLCAweDRFRjMsIDB4NEVGRCwKKyAgICAweDRFRkYsIDB4NEYwMSwgMHg0RjAzLCAweDRGMEQsIDB4NEYwRiwgMHg0RjEwLAorICAgIDB4NEYxMiwgMHg0RjE0LCAweDRGMUMsIDB4NEYxRSwgMHg0RjIxLCAweDRGMjMsCisgICAgMHg0RjJELCAweDRGMkYsIDB4NEYzMCwgMHg0RjMyLCAweDRGMzQsIDB4NEYzQywKKyAgICAweDRGM0UsIDB4NEY0MSwgMHg0RjQzLCAweDRGNEQsIDB4NEY0RiwgMHg0RkMxLAorICAgIDB4NEZDMywgMHg0RkNELCAweDRGQ0YsIDB4NEZEMCwgMHg0RkQyLCAweDRGRDQsCisgICAgMHg0RkRDLCAweDRGREUsIDB4NEZFMSwgMHg0RkUzLCAweDRGRUQsIDB4NEZFRiwKKyAgICAweDRGRjAsIDB4NEZGMiwgMHg0RkY0LCAweDRGRkMsIDB4NEZGRSwgMHhDMDAwLAorICAgIDB4QzAwMiwgMHhDMDA0LCAweEMwMEMsIDB4QzAwRSwgMHhDMDExLCAweEMwMTMsCisgICAgMHhDMDFELCAweEMwMUYsIDB4QzAyMCwgMHhDMDIyLCAweEMwMjQsIDB4QzAyQywKKyAgICAweEMwMkUsIDB4QzAzMSwgMHhDMDMzLCAweEMwM0QsIDB4QzAzRiwgMHhDMDQwLAorICAgIDB4QzA0MiwgMHhDMDQ0LCAweEMwNEMsIDB4QzA0RSwgMHhDMEMwLCAweEMwQzIsCisgICAgMHhDMEM0LCAweEMwQ0MsIDB4QzBDRSwgMHhDMEQxLCAweEMwRDMsIDB4QzBERCwKKyAgICAweEMwREYsIDB4QzBFMCwgMHhDMEUyLCAweEMwRTQsIDB4QzBFQywgMHhDMEVFLAorICAgIDB4QzBGMSwgMHhDMEYzLCAweEMwRkQsIDB4QzBGRiwgMHhDMTAxLCAweEMxMDMsCisgICAgMHhDMTBELCAweEMxMEYsIDB4QzExMCwgMHhDMTEyLCAweEMxMTQsIDB4QzExQywKKyAgICAweEMxMUUsIDB4QzEyMSwgMHhDMTIzLCAweEMxMkQsIDB4QzEyRiwgMHhDMTMwLAorICAgIDB4QzEzMiwgMHhDMTM0LCAweEMxM0MsIDB4QzEzRSwgMHhDMTQxLCAweEMxNDMsCisgICAgMHhDMTRELCAweEMxNEYsIDB4QzFDMSwgMHhDMUMzLCAweEMxQ0QsIDB4QzFDRiwKKyAgICAweEMxRDAsIDB4QzFEMiwgMHhDMUQ0LCAweEMxREMsIDB4QzFERSwgMHhDMUUxLAorICAgIDB4QzFFMywgMHhDMUVELCAweEMxRUYsIDB4QzFGMCwgMHhDMUYyLCAweEMxRjQsCisgICAgMHhDMUZDLCAweEMxRkUsIDB4QzIwMCwgMHhDMjAyLCAweEMyMDQsIDB4QzIwQywKKyAgICAweEMyMEUsIDB4QzIxMSwgMHhDMjEzLCAweEMyMUQsIDB4QzIxRiwgMHhDMjIwLAorICAgIDB4QzIyMiwgMHhDMjI0LCAweEMyMkMsIDB4QzIyRSwgMHhDMjMxLCAweEMyMzMsCisgICAgMHhDMjNELCAweEMyM0YsIDB4QzI0MCwgMHhDMjQyLCAweEMyNDQsIDB4QzI0QywKKyAgICAweEMyNEUsIDB4QzJDMCwgMHhDMkMyLCAweEMyQzQsIDB4QzJDQywgMHhDMkNFLAorICAgIDB4QzJEMSwgMHhDMkQzLCAweEMyREQsIDB4QzJERiwgMHhDMkUwLCAweEMyRTIsCisgICAgMHhDMkU0LCAweEMyRUMsIDB4QzJFRSwgMHhDMkYxLCAweEMyRjMsIDB4QzJGRCwKKyAgICAweEMyRkYsIDB4QzMwMSwgMHhDMzAzLCAweEMzMEQsIDB4QzMwRiwgMHhDMzEwLAorICAgIDB4QzMxMiwgMHhDMzE0LCAweEMzMUMsIDB4QzMxRSwgMHhDMzIxLCAweEMzMjMsCisgICAgMHhDMzJELCAweEMzMkYsIDB4QzMzMCwgMHhDMzMyLCAweEMzMzQsIDB4QzMzQywKKyAgICAweEMzM0UsIDB4QzM0MSwgMHhDMzQzLCAweEMzNEQsIDB4QzM0RiwgMHhDM0MxLAorICAgIDB4QzNDMywgMHhDM0NELCAweEMzQ0YsIDB4QzNEMCwgMHhDM0QyLCAweEMzRDQsCisgICAgMHhDM0RDLCAweEMzREUsIDB4QzNFMSwgMHhDM0UzLCAweEMzRUQsIDB4QzNFRiwKKyAgICAweEMzRjAsIDB4QzNGMiwgMHhDM0Y0LCAweEMzRkMsIDB4QzNGRSwgMHhDNDAwLAorICAgIDB4QzQwMiwgMHhDNDA0LCAweEM0MEMsIDB4QzQwRSwgMHhDNDExLCAweEM0MTMsCisgICAgMHhDNDFELCAweEM0MUYsIDB4QzQyMCwgMHhDNDIyLCAweEM0MjQsIDB4QzQyQywKKyAgICAweEM0MkUsIDB4QzQzMSwgMHhDNDMzLCAweEM0M0QsIDB4QzQzRiwgMHhDNDQwLAorICAgIDB4QzQ0MiwgMHhDNDQ0LCAweEM0NEMsIDB4QzQ0RSwgMHhDNEMwLCAweEM0QzIsCisgICAgMHhDNEM0LCAweEM0Q0MsIDB4QzRDRSwgMHhDNEQxLCAweEM0RDMsIDB4QzRERCwKKyAgICAweEM0REYsIDB4QzRFMCwgMHhDNEUyLCAweEM0RTQsIDB4QzRFQywgMHhDNEVFLAorICAgIDB4QzRGMSwgMHhDNEYzLCAweEM0RkQsIDB4QzRGRiwgMHhDQzAwLCAweENDMDIsCisgICAgMHhDQzA0LCAweENDMEMsIDB4Q0MwRSwgMHhDQzExLCAweENDMTMsIDB4Q0MxRCwKKyAgICAweENDMUYsIDB4Q0MyMCwgMHhDQzIyLCAweENDMjQsIDB4Q0MyQywgMHhDQzJFLAorICAgIDB4Q0MzMSwgMHhDQzMzLCAweENDM0QsIDB4Q0MzRiwgMHhDQzQwLCAweENDNDIsCisgICAgMHhDQzQ0LCAweENDNEMsIDB4Q0M0RSwgMHhDQ0MwLCAweENDQzIsIDB4Q0NDNCwKKyAgICAweENDQ0MsIDB4Q0NDRSwgMHhDQ0QxLCAweENDRDMsIDB4Q0NERCwgMHhDQ0RGLAorICAgIDB4Q0NFMCwgMHhDQ0UyLCAweENDRTQsIDB4Q0NFQywgMHhDQ0VFLCAweENDRjEsCisgICAgMHhDQ0YzLCAweENDRkQsIDB4Q0NGRiwgMHhDRDAxLCAweENEMDMsIDB4Q0QwRCwKKyAgICAweENEMEYsIDB4Q0QxMCwgMHhDRDEyLCAweENEMTQsIDB4Q0QxQywgMHhDRDFFLAorICAgIDB4Q0QyMSwgMHhDRDIzLCAweENEMkQsIDB4Q0QyRiwgMHhDRDMwLCAweENEMzIsCisgICAgMHhDRDM0LCAweENEM0MsIDB4Q0QzRSwgMHhDRDQxLCAweENENDMsIDB4Q0Q0RCwKKyAgICAweENENEYsIDB4Q0RDMSwgMHhDREMzLCAweENEQ0QsIDB4Q0RDRiwgMHhDREQwLAorICAgIDB4Q0REMiwgMHhDREQ0LCAweENEREMsIDB4Q0RERSwgMHhDREUxLCAweENERTMsCisgICAgMHhDREVELCAweENERUYsIDB4Q0RGMCwgMHhDREYyLCAweENERjQsIDB4Q0RGQywKKyAgICAweENERkUsIDB4Q0UwMCwgMHhDRTAyLCAweENFMDQsIDB4Q0UwQywgMHhDRTBFLAorICAgIDB4Q0UxMSwgMHhDRTEzLCAweENFMUQsIDB4Q0UxRiwgMHhDRTIwLCAweENFMjIsCisgICAgMHhDRTI0LCAweENFMkMsIDB4Q0UyRSwgMHhDRTMxLCAweENFMzMsIDB4Q0UzRCwKKyAgICAweENFM0YsIDB4Q0U0MCwgMHhDRTQyLCAweENFNDQsIDB4Q0U0QywgMHhDRTRFLAorICAgIDB4Q0VDMCwgMHhDRUMyLCAweENFQzQsIDB4Q0VDQywgMHhDRUNFLCAweENFRDEsCisgICAgMHhDRUQzLCAweENFREQsIDB4Q0VERiwgMHhDRUUwLCAweENFRTIsIDB4Q0VFNCwKKyAgICAweENFRUMsIDB4Q0VFRSwgMHhDRUYxLCAweENFRjMsIDB4Q0VGRCwgMHhDRUZGLAorICAgIDB4Q0YwMSwgMHhDRjAzLCAweENGMEQsIDB4Q0YwRiwgMHhDRjEwLCAweENGMTIsCisgICAgMHhDRjE0LCAweENGMUMsIDB4Q0YxRSwgMHhDRjIxLCAweENGMjMsIDB4Q0YyRCwKKyAgICAweENGMkYsIDB4Q0YzMCwgMHhDRjMyLCAweENGMzQsIDB4Q0YzQywgMHhDRjNFLAorICAgIDB4Q0Y0MSwgMHhDRjQzLCAweENGNEQsIDB4Q0Y0RiwgMHhDRkMxLCAweENGQzMsCisgICAgMHhDRkNELCAweENGQ0YsIDB4Q0ZEMCwgMHhDRkQyLCAweENGRDQsIDB4Q0ZEQywKKyAgICAweENGREUsIDB4Q0ZFMSwgMHhDRkUzLCAweENGRUQsIDB4Q0ZFRiwgMHhDRkYwLAorICAgIDB4Q0ZGMiwgMHhDRkY0LCAweENGRkMsIDB4Q0ZGRSwgMHhEMDAxLCAweEQwMDMsCisgICAgMHhEMDBELCAweEQwMEYsIDB4RDAxMCwgMHhEMDEyLCAweEQwMTQsIDB4RDAxQywKKyAgICAweEQwMUUsIDB4RDAyMSwgMHhEMDIzLCAweEQwMkQsIDB4RDAyRiwgMHhEMDMwLAorICAgIDB4RDAzMiwgMHhEMDM0LCAweEQwM0MsIDB4RDAzRSwgMHhEMDQxLCAweEQwNDMsCisgICAgMHhEMDRELCAweEQwNEYsIDB4RDBDMSwgMHhEMEMzLCAweEQwQ0QsIDB4RDBDRiwKKyAgICAweEQwRDAsIDB4RDBEMiwgMHhEMEQ0LCAweEQwREMsIDB4RDBERSwgMHhEMEUxLAorICAgIDB4RDBFMywgMHhEMEVELCAweEQwRUYsIDB4RDBGMCwgMHhEMEYyLCAweEQwRjQsCisgICAgMHhEMEZDLCAweEQwRkUsIDB4RDEwMCwgMHhEMTAyLCAweEQxMDQsIDB4RDEwQywKKyAgICAweEQxMEUsIDB4RDExMSwgMHhEMTEzLCAweEQxMUQsIDB4RDExRiwgMHhEMTIwLAorICAgIDB4RDEyMiwgMHhEMTI0LCAweEQxMkMsIDB4RDEyRSwgMHhEMTMxLCAweEQxMzMsCisgICAgMHhEMTNELCAweEQxM0YsIDB4RDE0MCwgMHhEMTQyLCAweEQxNDQsIDB4RDE0QywKKyAgICAweEQxNEUsIDB4RDFDMCwgMHhEMUMyLCAweEQxQzQsIDB4RDFDQywgMHhEMUNFLAorICAgIDB4RDFEMSwgMHhEMUQzLCAweEQxREQsIDB4RDFERiwgMHhEMUUwLCAweEQxRTIsCisgICAgMHhEMUU0LCAweEQxRUMsIDB4RDFFRSwgMHhEMUYxLCAweEQxRjMsIDB4RDFGRCwKKyAgICAweEQxRkYsIDB4RDIwMSwgMHhEMjAzLCAweEQyMEQsIDB4RDIwRiwgMHhEMjEwLAorICAgIDB4RDIxMiwgMHhEMjE0LCAweEQyMUMsIDB4RDIxRSwgMHhEMjIxLCAweEQyMjMsCisgICAgMHhEMjJELCAweEQyMkYsIDB4RDIzMCwgMHhEMjMyLCAweEQyMzQsIDB4RDIzQywKKyAgICAweEQyM0UsIDB4RDI0MSwgMHhEMjQzLCAweEQyNEQsIDB4RDI0RiwgMHhEMkMxLAorICAgIDB4RDJDMywgMHhEMkNELCAweEQyQ0YsIDB4RDJEMCwgMHhEMkQyLCAweEQyRDQsCisgICAgMHhEMkRDLCAweEQyREUsIDB4RDJFMSwgMHhEMkUzLCAweEQyRUQsIDB4RDJFRiwKKyAgICAweEQyRjAsIDB4RDJGMiwgMHhEMkY0LCAweEQyRkMsIDB4RDJGRSwgMHhEMzAwLAorICAgIDB4RDMwMiwgMHhEMzA0LCAweEQzMEMsIDB4RDMwRSwgMHhEMzExLCAweEQzMTMsCisgICAgMHhEMzFELCAweEQzMUYsIDB4RDMyMCwgMHhEMzIyLCAweEQzMjQsIDB4RDMyQywKKyAgICAweEQzMkUsIDB4RDMzMSwgMHhEMzMzLCAweEQzM0QsIDB4RDMzRiwgMHhEMzQwLAorICAgIDB4RDM0MiwgMHhEMzQ0LCAweEQzNEMsIDB4RDM0RSwgMHhEM0MwLCAweEQzQzIsCisgICAgMHhEM0M0LCAweEQzQ0MsIDB4RDNDRSwgMHhEM0QxLCAweEQzRDMsIDB4RDNERCwKKyAgICAweEQzREYsIDB4RDNFMCwgMHhEM0UyLCAweEQzRTQsIDB4RDNFQywgMHhEM0VFLAorICAgIDB4RDNGMSwgMHhEM0YzLCAweEQzRkQsIDB4RDNGRiwgMHhENDAxLCAweEQ0MDMsCisgICAgMHhENDBELCAweEQ0MEYsIDB4RDQxMCwgMHhENDEyLCAweEQ0MTQsIDB4RDQxQywKKyAgICAweEQ0MUUsIDB4RDQyMSwgMHhENDIzLCAweEQ0MkQsIDB4RDQyRiwgMHhENDMwLAorICAgIDB4RDQzMiwgMHhENDM0LCAweEQ0M0MsIDB4RDQzRSwgMHhENDQxLCAweEQ0NDMsCisgICAgMHhENDRELCAweEQ0NEYsIDB4RDRDMSwgMHhENEMzLCAweEQ0Q0QsIDB4RDRDRiwKKyAgICAweEQ0RDAsIDB4RDREMiwgMHhENEQ0LCAweEQ0REMsIDB4RDRERSwgMHhENEUxLAorICAgIDB4RDRFMywgMHhENEVELCAweEQ0RUYsIDB4RDRGMCwgMHhENEYyLCAweEQ0RjQsCisgICAgMHhENEZDLCAweEQ0RkUsIDB4REMwMSwgMHhEQzAzLCAweERDMEQsIDB4REMwRiwKKyAgICAweERDMTAsIDB4REMxMiwgMHhEQzE0LCAweERDMUMsIDB4REMxRSwgMHhEQzIxLAorICAgIDB4REMyMywgMHhEQzJELCAweERDMkYsIDB4REMzMCwgMHhEQzMyLCAweERDMzQsCisgICAgMHhEQzNDLCAweERDM0UsIDB4REM0MSwgMHhEQzQzLCAweERDNEQsIDB4REM0RiwKKyAgICAweERDQzEsIDB4RENDMywgMHhEQ0NELCAweERDQ0YsIDB4RENEMCwgMHhEQ0QyLAorICAgIDB4RENENCwgMHhEQ0RDLCAweERDREUsIDB4RENFMSwgMHhEQ0UzLCAweERDRUQsCisgICAgMHhEQ0VGLCAweERDRjAsIDB4RENGMiwgMHhEQ0Y0LCAweERDRkMsIDB4RENGRSwKKyAgICAweEREMDAsIDB4REQwMiwgMHhERDA0LCAweEREMEMsIDB4REQwRSwgMHhERDExLAorICAgIDB4REQxMywgMHhERDFELCAweEREMUYsIDB4REQyMCwgMHhERDIyLCAweEREMjQsCisgICAgMHhERDJDLCAweEREMkUsIDB4REQzMSwgMHhERDMzLCAweEREM0QsIDB4REQzRiwKKyAgICAweERENDAsIDB4REQ0MiwgMHhERDQ0LCAweERENEMsIDB4REQ0RSwgMHhEREMwLAorICAgIDB4RERDMiwgMHhEREM0LCAweEREQ0MsIDB4RERDRSwgMHhEREQxLCAweERERDMsCisgICAgMHhERERELCAweEREREYsIDB4RERFMCwgMHhEREUyLCAweERERTQsIDB4RERFQywKKyAgICAweERERUUsIDB4RERGMSwgMHhEREYzLCAweERERkQsIDB4RERGRiwgMHhERTAxLAorICAgIDB4REUwMywgMHhERTBELCAweERFMEYsIDB4REUxMCwgMHhERTEyLCAweERFMTQsCisgICAgMHhERTFDLCAweERFMUUsIDB4REUyMSwgMHhERTIzLCAweERFMkQsIDB4REUyRiwKKyAgICAweERFMzAsIDB4REUzMiwgMHhERTM0LCAweERFM0MsIDB4REUzRSwgMHhERTQxLAorICAgIDB4REU0MywgMHhERTRELCAweERFNEYsIDB4REVDMSwgMHhERUMzLCAweERFQ0QsCisgICAgMHhERUNGLCAweERFRDAsIDB4REVEMiwgMHhERUQ0LCAweERFREMsIDB4REVERSwKKyAgICAweERFRTEsIDB4REVFMywgMHhERUVELCAweERFRUYsIDB4REVGMCwgMHhERUYyLAorICAgIDB4REVGNCwgMHhERUZDLCAweERFRkUsIDB4REYwMCwgMHhERjAyLCAweERGMDQsCisgICAgMHhERjBDLCAweERGMEUsIDB4REYxMSwgMHhERjEzLCAweERGMUQsIDB4REYxRiwKKyAgICAweERGMjAsIDB4REYyMiwgMHhERjI0LCAweERGMkMsIDB4REYyRSwgMHhERjMxLAorICAgIDB4REYzMywgMHhERjNELCAweERGM0YsIDB4REY0MCwgMHhERjQyLCAweERGNDQsCisgICAgMHhERjRDLCAweERGNEUsIDB4REZDMCwgMHhERkMyLCAweERGQzQsIDB4REZDQywKKyAgICAweERGQ0UsIDB4REZEMSwgMHhERkQzLCAweERGREQsIDB4REZERiwgMHhERkUwLAorICAgIDB4REZFMiwgMHhERkU0LCAweERGRUMsIDB4REZFRSwgMHhERkYxLCAweERGRjMsCisgICAgMHhERkZELCAweERGRkYsIDB4RTAwMCwgMHhFMDAyLCAweEUwMDQsIDB4RTAwQywKKyAgICAweEUwMEUsIDB4RTAxMSwgMHhFMDEzLCAweEUwMUQsIDB4RTAxRiwgMHhFMDIwLAorICAgIDB4RTAyMiwgMHhFMDI0LCAweEUwMkMsIDB4RTAyRSwgMHhFMDMxLCAweEUwMzMsCisgICAgMHhFMDNELCAweEUwM0YsIDB4RTA0MCwgMHhFMDQyLCAweEUwNDQsIDB4RTA0QywKKyAgICAweEUwNEUsIDB4RTBDMCwgMHhFMEMyLCAweEUwQzQsIDB4RTBDQywgMHhFMENFLAorICAgIDB4RTBEMSwgMHhFMEQzLCAweEUwREQsIDB4RTBERiwgMHhFMEUwLCAweEUwRTIsCisgICAgMHhFMEU0LCAweEUwRUMsIDB4RTBFRSwgMHhFMEYxLCAweEUwRjMsIDB4RTBGRCwKKyAgICAweEUwRkYsIDB4RTEwMSwgMHhFMTAzLCAweEUxMEQsIDB4RTEwRiwgMHhFMTEwLAorICAgIDB4RTExMiwgMHhFMTE0LCAweEUxMUMsIDB4RTExRSwgMHhFMTIxLCAweEUxMjMsCisgICAgMHhFMTJELCAweEUxMkYsIDB4RTEzMCwgMHhFMTMyLCAweEUxMzQsIDB4RTEzQywKKyAgICAweEUxM0UsIDB4RTE0MSwgMHhFMTQzLCAweEUxNEQsIDB4RTE0RiwgMHhFMUMxLAorICAgIDB4RTFDMywgMHhFMUNELCAweEUxQ0YsIDB4RTFEMCwgMHhFMUQyLCAweEUxRDQsCisgICAgMHhFMURDLCAweEUxREUsIDB4RTFFMSwgMHhFMUUzLCAweEUxRUQsIDB4RTFFRiwKKyAgICAweEUxRjAsIDB4RTFGMiwgMHhFMUY0LCAweEUxRkMsIDB4RTFGRSwgMHhFMjAwLAorICAgIDB4RTIwMiwgMHhFMjA0LCAweEUyMEMsIDB4RTIwRSwgMHhFMjExLCAweEUyMTMsCisgICAgMHhFMjFELCAweEUyMUYsIDB4RTIyMCwgMHhFMjIyLCAweEUyMjQsIDB4RTIyQywKKyAgICAweEUyMkUsIDB4RTIzMSwgMHhFMjMzLCAweEUyM0QsIDB4RTIzRiwgMHhFMjQwLAorICAgIDB4RTI0MiwgMHhFMjQ0LCAweEUyNEMsIDB4RTI0RSwgMHhFMkMwLCAweEUyQzIsCisgICAgMHhFMkM0LCAweEUyQ0MsIDB4RTJDRSwgMHhFMkQxLCAweEUyRDMsIDB4RTJERCwKKyAgICAweEUyREYsIDB4RTJFMCwgMHhFMkUyLCAweEUyRTQsIDB4RTJFQywgMHhFMkVFLAorICAgIDB4RTJGMSwgMHhFMkYzLCAweEUyRkQsIDB4RTJGRiwgMHhFMzAxLCAweEUzMDMsCisgICAgMHhFMzBELCAweEUzMEYsIDB4RTMxMCwgMHhFMzEyLCAweEUzMTQsIDB4RTMxQywKKyAgICAweEUzMUUsIDB4RTMyMSwgMHhFMzIzLCAweEUzMkQsIDB4RTMyRiwgMHhFMzMwLAorICAgIDB4RTMzMiwgMHhFMzM0LCAweEUzM0MsIDB4RTMzRSwgMHhFMzQxLCAweEUzNDMsCisgICAgMHhFMzRELCAweEUzNEYsIDB4RTNDMSwgMHhFM0MzLCAweEUzQ0QsIDB4RTNDRiwKKyAgICAweEUzRDAsIDB4RTNEMiwgMHhFM0Q0LCAweEUzREMsIDB4RTNERSwgMHhFM0UxLAorICAgIDB4RTNFMywgMHhFM0VELCAweEUzRUYsIDB4RTNGMCwgMHhFM0YyLCAweEUzRjQsCisgICAgMHhFM0ZDLCAweEUzRkUsIDB4RTQwMCwgMHhFNDAyLCAweEU0MDQsIDB4RTQwQywKKyAgICAweEU0MEUsIDB4RTQxMSwgMHhFNDEzLCAweEU0MUQsIDB4RTQxRiwgMHhFNDIwLAorICAgIDB4RTQyMiwgMHhFNDI0LCAweEU0MkMsIDB4RTQyRSwgMHhFNDMxLCAweEU0MzMsCisgICAgMHhFNDNELCAweEU0M0YsIDB4RTQ0MCwgMHhFNDQyLCAweEU0NDQsIDB4RTQ0QywKKyAgICAweEU0NEUsIDB4RTRDMCwgMHhFNEMyLCAweEU0QzQsIDB4RTRDQywgMHhFNENFLAorICAgIDB4RTREMSwgMHhFNEQzLCAweEU0REQsIDB4RTRERiwgMHhFNEUwLCAweEU0RTIsCisgICAgMHhFNEU0LCAweEU0RUMsIDB4RTRFRSwgMHhFNEYxLCAweEU0RjMsIDB4RTRGRCwKKyAgICAweEU0RkYsIDB4RUMwMCwgMHhFQzAyLCAweEVDMDQsIDB4RUMwQywgMHhFQzBFLAorICAgIDB4RUMxMSwgMHhFQzEzLCAweEVDMUQsIDB4RUMxRiwgMHhFQzIwLCAweEVDMjIsCisgICAgMHhFQzI0LCAweEVDMkMsIDB4RUMyRSwgMHhFQzMxLCAweEVDMzMsIDB4RUMzRCwKKyAgICAweEVDM0YsIDB4RUM0MCwgMHhFQzQyLCAweEVDNDQsIDB4RUM0QywgMHhFQzRFLAorICAgIDB4RUNDMCwgMHhFQ0MyLCAweEVDQzQsIDB4RUNDQywgMHhFQ0NFLCAweEVDRDEsCisgICAgMHhFQ0QzLCAweEVDREQsIDB4RUNERiwgMHhFQ0UwLCAweEVDRTIsIDB4RUNFNCwKKyAgICAweEVDRUMsIDB4RUNFRSwgMHhFQ0YxLCAweEVDRjMsIDB4RUNGRCwgMHhFQ0ZGLAorICAgIDB4RUQwMSwgMHhFRDAzLCAweEVEMEQsIDB4RUQwRiwgMHhFRDEwLCAweEVEMTIsCisgICAgMHhFRDE0LCAweEVEMUMsIDB4RUQxRSwgMHhFRDIxLCAweEVEMjMsIDB4RUQyRCwKKyAgICAweEVEMkYsIDB4RUQzMCwgMHhFRDMyLCAweEVEMzQsIDB4RUQzQywgMHhFRDNFLAorICAgIDB4RUQ0MSwgMHhFRDQzLCAweEVENEQsIDB4RUQ0RiwgMHhFREMxLCAweEVEQzMsCisgICAgMHhFRENELCAweEVEQ0YsIDB4RUREMCwgMHhFREQyLCAweEVERDQsIDB4RUREQywKKyAgICAweEVEREUsIDB4RURFMSwgMHhFREUzLCAweEVERUQsIDB4RURFRiwgMHhFREYwLAorICAgIDB4RURGMiwgMHhFREY0LCAweEVERkMsIDB4RURGRSwgMHhFRTAwLCAweEVFMDIsCisgICAgMHhFRTA0LCAweEVFMEMsIDB4RUUwRSwgMHhFRTExLCAweEVFMTMsIDB4RUUxRCwKKyAgICAweEVFMUYsIDB4RUUyMCwgMHhFRTIyLCAweEVFMjQsIDB4RUUyQywgMHhFRTJFLAorICAgIDB4RUUzMSwgMHhFRTMzLCAweEVFM0QsIDB4RUUzRiwgMHhFRTQwLCAweEVFNDIsCisgICAgMHhFRTQ0LCAweEVFNEMsIDB4RUU0RSwgMHhFRUMwLCAweEVFQzIsIDB4RUVDNCwKKyAgICAweEVFQ0MsIDB4RUVDRSwgMHhFRUQxLCAweEVFRDMsIDB4RUVERCwgMHhFRURGLAorICAgIDB4RUVFMCwgMHhFRUUyLCAweEVFRTQsIDB4RUVFQywgMHhFRUVFLCAweEVFRjEsCisgICAgMHhFRUYzLCAweEVFRkQsIDB4RUVGRiwgMHhFRjAxLCAweEVGMDMsIDB4RUYwRCwKKyAgICAweEVGMEYsIDB4RUYxMCwgMHhFRjEyLCAweEVGMTQsIDB4RUYxQywgMHhFRjFFLAorICAgIDB4RUYyMSwgMHhFRjIzLCAweEVGMkQsIDB4RUYyRiwgMHhFRjMwLCAweEVGMzIsCisgICAgMHhFRjM0LCAweEVGM0MsIDB4RUYzRSwgMHhFRjQxLCAweEVGNDMsIDB4RUY0RCwKKyAgICAweEVGNEYsIDB4RUZDMSwgMHhFRkMzLCAweEVGQ0QsIDB4RUZDRiwgMHhFRkQwLAorICAgIDB4RUZEMiwgMHhFRkQ0LCAweEVGREMsIDB4RUZERSwgMHhFRkUxLCAweEVGRTMsCisgICAgMHhFRkVELCAweEVGRUYsIDB4RUZGMCwgMHhFRkYyLCAweEVGRjQsIDB4RUZGQywKKyAgICAweEVGRkUsIDB4RjAwMSwgMHhGMDAzLCAweEYwMEQsIDB4RjAwRiwgMHhGMDEwLAorICAgIDB4RjAxMiwgMHhGMDE0LCAweEYwMUMsIDB4RjAxRSwgMHhGMDIxLCAweEYwMjMsCisgICAgMHhGMDJELCAweEYwMkYsIDB4RjAzMCwgMHhGMDMyLCAweEYwMzQsIDB4RjAzQywKKyAgICAweEYwM0UsIDB4RjA0MSwgMHhGMDQzLCAweEYwNEQsIDB4RjA0RiwgMHhGMEMxLAorICAgIDB4RjBDMywgMHhGMENELCAweEYwQ0YsIDB4RjBEMCwgMHhGMEQyLCAweEYwRDQsCisgICAgMHhGMERDLCAweEYwREUsIDB4RjBFMSwgMHhGMEUzLCAweEYwRUQsIDB4RjBFRiwKKyAgICAweEYwRjAsIDB4RjBGMiwgMHhGMEY0LCAweEYwRkMsIDB4RjBGRSwgMHhGMTAwLAorICAgIDB4RjEwMiwgMHhGMTA0LCAweEYxMEMsIDB4RjEwRSwgMHhGMTExLCAweEYxMTMsCisgICAgMHhGMTFELCAweEYxMUYsIDB4RjEyMCwgMHhGMTIyLCAweEYxMjQsIDB4RjEyQywKKyAgICAweEYxMkUsIDB4RjEzMSwgMHhGMTMzLCAweEYxM0QsIDB4RjEzRiwgMHhGMTQwLAorICAgIDB4RjE0MiwgMHhGMTQ0LCAweEYxNEMsIDB4RjE0RSwgMHhGMUMwLCAweEYxQzIsCisgICAgMHhGMUM0LCAweEYxQ0MsIDB4RjFDRSwgMHhGMUQxLCAweEYxRDMsIDB4RjFERCwKKyAgICAweEYxREYsIDB4RjFFMCwgMHhGMUUyLCAweEYxRTQsIDB4RjFFQywgMHhGMUVFLAorICAgIDB4RjFGMSwgMHhGMUYzLCAweEYxRkQsIDB4RjFGRiwgMHhGMjAxLCAweEYyMDMsCisgICAgMHhGMjBELCAweEYyMEYsIDB4RjIxMCwgMHhGMjEyLCAweEYyMTQsIDB4RjIxQywKKyAgICAweEYyMUUsIDB4RjIyMSwgMHhGMjIzLCAweEYyMkQsIDB4RjIyRiwgMHhGMjMwLAorICAgIDB4RjIzMiwgMHhGMjM0LCAweEYyM0MsIDB4RjIzRSwgMHhGMjQxLCAweEYyNDMsCisgICAgMHhGMjRELCAweEYyNEYsIDB4RjJDMSwgMHhGMkMzLCAweEYyQ0QsIDB4RjJDRiwKKyAgICAweEYyRDAsIDB4RjJEMiwgMHhGMkQ0LCAweEYyREMsIDB4RjJERSwgMHhGMkUxLAorICAgIDB4RjJFMywgMHhGMkVELCAweEYyRUYsIDB4RjJGMCwgMHhGMkYyLCAweEYyRjQsCisgICAgMHhGMkZDLCAweEYyRkUsIDB4RjMwMCwgMHhGMzAyLCAweEYzMDQsIDB4RjMwQywKKyAgICAweEYzMEUsIDB4RjMxMSwgMHhGMzEzLCAweEYzMUQsIDB4RjMxRiwgMHhGMzIwLAorICAgIDB4RjMyMiwgMHhGMzI0LCAweEYzMkMsIDB4RjMyRSwgMHhGMzMxLCAweEYzMzMsCisgICAgMHhGMzNELCAweEYzM0YsIDB4RjM0MCwgMHhGMzQyLCAweEYzNDQsIDB4RjM0QywKKyAgICAweEYzNEUsIDB4RjNDMCwgMHhGM0MyLCAweEYzQzQsIDB4RjNDQywgMHhGM0NFLAorICAgIDB4RjNEMSwgMHhGM0QzLCAweEYzREQsIDB4RjNERiwgMHhGM0UwLCAweEYzRTIsCisgICAgMHhGM0U0LCAweEYzRUMsIDB4RjNFRSwgMHhGM0YxLCAweEYzRjMsIDB4RjNGRCwKKyAgICAweEYzRkYsIDB4RjQwMSwgMHhGNDAzLCAweEY0MEQsIDB4RjQwRiwgMHhGNDEwLAorICAgIDB4RjQxMiwgMHhGNDE0LCAweEY0MUMsIDB4RjQxRSwgMHhGNDIxLCAweEY0MjMsCisgICAgMHhGNDJELCAweEY0MkYsIDB4RjQzMCwgMHhGNDMyLCAweEY0MzQsIDB4RjQzQywKKyAgICAweEY0M0UsIDB4RjQ0MSwgMHhGNDQzLCAweEY0NEQsIDB4RjQ0RiwgMHhGNEMxLAorICAgIDB4RjRDMywgMHhGNENELCAweEY0Q0YsIDB4RjREMCwgMHhGNEQyLCAweEY0RDQsCisgICAgMHhGNERDLCAweEY0REUsIDB4RjRFMSwgMHhGNEUzLCAweEY0RUQsIDB4RjRFRiwKKyAgICAweEY0RjAsIDB4RjRGMiwgMHhGNEY0LCAweEY0RkMsIDB4RjRGRSwgMHhGQzAxLAorICAgIDB4RkMwMywgMHhGQzBELCAweEZDMEYsIDB4RkMxMCwgMHhGQzEyLCAweEZDMTQsCisgICAgMHhGQzFDLCAweEZDMUUsIDB4RkMyMSwgMHhGQzIzLCAweEZDMkQsIDB4RkMyRiwKKyAgICAweEZDMzAsIDB4RkMzMiwgMHhGQzM0LCAweEZDM0MsIDB4RkMzRSwgMHhGQzQxLAorICAgIDB4RkM0MywgMHhGQzRELCAweEZDNEYsIDB4RkNDMSwgMHhGQ0MzLCAweEZDQ0QsCisgICAgMHhGQ0NGLCAweEZDRDAsIDB4RkNEMiwgMHhGQ0Q0LCAweEZDREMsIDB4RkNERSwKKyAgICAweEZDRTEsIDB4RkNFMywgMHhGQ0VELCAweEZDRUYsIDB4RkNGMCwgMHhGQ0YyLAorICAgIDB4RkNGNCwgMHhGQ0ZDLCAweEZDRkUsIDB4RkQwMCwgMHhGRDAyLCAweEZEMDQsCisgICAgMHhGRDBDLCAweEZEMEUsIDB4RkQxMSwgMHhGRDEzLCAweEZEMUQsIDB4RkQxRiwKKyAgICAweEZEMjAsIDB4RkQyMiwgMHhGRDI0LCAweEZEMkMsIDB4RkQyRSwgMHhGRDMxLAorICAgIDB4RkQzMywgMHhGRDNELCAweEZEM0YsIDB4RkQ0MCwgMHhGRDQyLCAweEZENDQsCisgICAgMHhGRDRDLCAweEZENEUsIDB4RkRDMCwgMHhGREMyLCAweEZEQzQsIDB4RkRDQywKKyAgICAweEZEQ0UsIDB4RkREMSwgMHhGREQzLCAweEZEREQsIDB4RkRERiwgMHhGREUwLAorICAgIDB4RkRFMiwgMHhGREU0LCAweEZERUMsIDB4RkRFRSwgMHhGREYxLCAweEZERjMsCisgICAgMHhGREZELCAweEZERkYsIDB4RkUwMSwgMHhGRTAzLCAweEZFMEQsIDB4RkUwRiwKKyAgICAweEZFMTAsIDB4RkUxMiwgMHhGRTE0LCAweEZFMUMsIDB4RkUxRSwgMHhGRTIxLAorICAgIDB4RkUyMywgMHhGRTJELCAweEZFMkYsIDB4RkUzMCwgMHhGRTMyLCAweEZFMzQsCisgICAgMHhGRTNDLCAweEZFM0UsIDB4RkU0MSwgMHhGRTQzLCAweEZFNEQsIDB4RkU0RiwKKyAgICAweEZFQzEsIDB4RkVDMywgMHhGRUNELCAweEZFQ0YsIDB4RkVEMCwgMHhGRUQyLAorICAgIDB4RkVENCwgMHhGRURDLCAweEZFREUsIDB4RkVFMSwgMHhGRUUzLCAweEZFRUQsCisgICAgMHhGRUVGLCAweEZFRjAsIDB4RkVGMiwgMHhGRUY0LCAweEZFRkMsIDB4RkVGRSwKKyAgICAweEZGMDAsIDB4RkYwMiwgMHhGRjA0LCAweEZGMEMsIDB4RkYwRSwgMHhGRjExLAorICAgIDB4RkYxMywgMHhGRjFELCAweEZGMUYsIDB4RkYyMCwgMHhGRjIyLCAweEZGMjQsCisgICAgMHhGRjJDLCAweEZGMkUsIDB4RkYzMSwgMHhGRjMzLCAweEZGM0QsIDB4RkYzRiwKKyAgICAweEZGNDAsIDB4RkY0MiwgMHhGRjQ0LCAweEZGNEMsIDB4RkY0RSwgMHhGRkMwLAorICAgIDB4RkZDMiwgMHhGRkM0LCAweEZGQ0MsIDB4RkZDRSwgMHhGRkQxLCAweEZGRDMsCisgICAgMHhGRkRELCAweEZGREYsIDB4RkZFMCwgMHhGRkUyLCAweEZGRTQsIDB4RkZFQywKKyAgICAweEZGRUUsIDB4RkZGMSwgMHhGRkYzLCAweEZGRkQsIDB4RkZGRiwKK307CisKKyNkZWZpbmUgT04yQVZDX0NCOF9DT0RFUyAzMjgxCitzdGF0aWMgY29uc3QgdWludDMyX3Qgb24yYXZjX2NiOF9jb2Rlc1tPTjJBVkNfQ0I4X0NPREVTXSA9IHsKKyAgICAweDAyOEMsIDB4MDVFNiwgMHhGQUQ5LCAweDdERUYsIDB4MDZDRSwgMHgwMDRDLAorICAgIDB4MDE3OCwgMHgwQTFELCAweDAwQUUsIDB4MDQ2RSwgMHgwM0Q1LCAweDNGNTgsCisgICAgMHgwRUFBLCAweDAyMzMsIDB4MUE2QSwgMHgyNzFGLCAweDA1Q0UsIDB4MDE3OSwKKyAgICAweDAyRkIsIDB4MDAyOSwgMHgyMzdELCAweDdERjAsIDB4MDNCQSwgMHhGQUQ2LAorICAgIDB4RkFENywgMHg3REVFLCAweEZBRDUsIDB4MDA4MSwgMHgwMzNDLCAweDFBNjksCisgICAgMHhGQUQ4LCAweDA1QTEsIDB4MDFGMSwgMHgwNjNELCAweDIzN0MsIDB4MDAzRSwKKyAgICAweDAzMjMsIDB4MDEwQywgMHgwNUEzLCAweDA1QTIsIDB4MDA1MSwgMHgwMTlELAorICAgIDB4RkFEQiwgMHgwRUFCLCAweDAwQUEsIDB4MDAzRSwgMHgwMUE2LCAweDdERjIsCisgICAgMHgwMDU4LCAweDAxRjEsIDB4MDI5QiwgMHgwM0MwLCAweDEyMkQsIDB4MDA3NSwKKyAgICAweDNGNUEsIDB4MEI5OCwgMHgwMDA1LCAweDA1OEIsIDB4MEQ2OCwgMHgwMTNGLAorICAgIDB4MDBEMCwgMHgwNUNGLCAweDAxQzAsIDB4MDNCQiwgMHgwNDZGLCAweEZBREEsCisgICAgMHgwMUEwLCAweDA5NzIsIDB4MTIyQywgMHgzRjU5LCAweDA3NjYsIDB4MDVBNCwKKyAgICAweDAwRUQsIDB4MDVBNSwgMHgwRDY3LCAweDAzRDAsIDB4MDA0NiwgMHgwMUZGLAorICAgIDB4N0RGMSwgMHgwMEQ2LCAweDAxN0MsIDB4MDAzNCwgMHgwOEI1LCAweDAyMzQsCisgICAgMHgyMzdFLCAweDAwMzMsIDB4MDA4MywgMHgwQjk5LCAweDBFQUMsIDB4MDIwMiwKKyAgICAweDA3MTQsIDB4MDcxNSwgMHgwMUMzLCAweDA1QTYsIDB4MDMyNCwgMHgxM0VDLAorICAgIDB4MDJGOCwgMHg3REYzLCAweDEzRUIsIDB4MDE0MCwgMHgwNDcwLCAweDA0RjgsCisgICAgMHgwMDA3LCAweDAzNzcsIDB4MDIwOCwgMHgwNEEzLCAweDEzRUEsIDB4MDAwNiwKKyAgICAweDAxODgsIDB4MDMzRCwgMHgxMjJFLCAweDFBNkIsIDB4MEExRSwgMHgwMTI2LAorICAgIDB4MDNDMSwgMHgwNUU3LCAweDA1RDAsIDB4MDRGNywgMHgwM0RCLCAweDAzM0UsCisgICAgMHgxMjJGLCAweDAwODIsIDB4MUE2RiwgMHgyMzgwLCAweDA1RDIsIDB4MDAwOSwKKyAgICAweDA1QTksIDB4MUE3MCwgMHgxMjMzLCAweDA1QTcsIDB4MDVBOCwgMHgwOTc1LAorICAgIDB4MjM4MSwgMHgxMjM0LCAweDA3ODgsIDB4MjcyMCwgMHgxMjM1LCAweDA1RDMsCisgICAgMHhGQURELCAweDNGNUIsIDB4MDc4OSwgMHgwRDY5LCAweEZBREUsIDB4RkFERiwKKyAgICAweDAxQzQsIDB4MEVBRCwgMHgwRUExLCAweDEyMzAsIDB4MDAwOCwgMHgxM0VELAorICAgIDB4MUE2QywgMHhGQURDLCAweDEyMzEsIDB4MDk3MywgMHgxMjMyLCAweDFBNkQsCisgICAgMHgxM0VFLCAweDFBNkUsIDB4MDk3NCwgMHgyMzdGLCAweDA1RDEsIDB4MDMzRiwKKyAgICAweDAyNjcsIDB4MDc4QSwgMHhGQUUzLCAweEZBRTIsIDB4MEI5QSwgMHgwMEZDLAorICAgIDB4MEVBRSwgMHgwNUQ2LCAweDAzMjUsIDB4MDMyNiwgMHgwQjlCLCAweDNGNUYsCisgICAgMHgzRjVFLCAweDA0NzEsIDB4MDJGOSwgMHhGQUU0LCAweDFBNzIsIDB4MDNDMiwKKyAgICAweDA1RDcsIDB4MjcyMSwgMHgzRjYwLCAweEZBRTUsIDB4MjM4MiwgMHhGQUUwLAorICAgIDB4N0RGNSwgMHhGQUUxLCAweDdERjQsIDB4MDAwQSwgMHgwMjM1LCAweDNGNUMsCisgICAgMHgxQTcxLCAweDA3MTYsIDB4MDM2QywgMHgwNzY3LCAweDA1RDQsIDB4M0Y1RCwKKyAgICAweDA3MTcsIDB4MDFCRiwgMHgwMDBCLCAweDA1RDUsIDB4MDI0MywgMHhGQUQwLAorICAgIDB4MDRGNiwgMHg3REU1LCAweEZBQ0YsIDB4MEU5RSwgMHgwMDc0LCAweDI3MUEsCisgICAgMHgxQTYxLCAweDAxNUIsIDB4MDA0NiwgMHgwNkNBLCAweDIzN0EsIDB4N0RFNiwKKyAgICAweDAwNzAsIDB4MUE2MiwgMHgxMjI3LCAweDdERTcsIDB4MDAzMiwgMHhGQUQxLAorICAgIDB4MDVDQSwgMHg3REU4LCAweDIzN0IsIDB4MTNFNiwgMHgwNUM4LCAweDEyMjYsCisgICAgMHgyMzc3LCAweDI3MTksIDB4M0Y1NCwgMHgzRjU1LCAweDEzRTUsIDB4MjM3OCwKKyAgICAweDAzQkYsIDB4MDVDOSwgMHgwMUMwLCAweDdERTQsIDB4N0RFMywgMHgwQTE5LAorICAgIDB4MDA0NSwgMHgxQTYwLCAweDIzNzksIDB4MDIxQiwgMHgyNzFDLCAweDEzRTcsCisgICAgMHgyNzFCLCAweDFBNjcsIDB4MDU5RCwgMHgwRUE2LCAweDBFQTcsIDB4MDE3NCwKKyAgICAweDBFQTUsIDB4MEExQSwgMHgxRkZELCAweDAzM0EsIDB4MEU5RiwgMHgzRjU3LAorICAgIDB4MTIyQiwgMHhGQUQyLCAweDBENjQsIDB4MDVDQywgMHgwNkNCLCAweDFGRkUsCisgICAgMHgwNTlFLCAweDAyRjcsIDB4MTIyOCwgMHg3REU5LCAweDA1OUIsIDB4MDk2QywKKyAgICAweDFBNjMsIDB4MUE2NCwgMHgxQTY1LCAweDEyMjksIDB4MEVBMywgMHgwNTlDLAorICAgIDB4MDk2RCwgMHgwNUNCLCAweDAwM0MsIDB4MUE2NiwgMHgwRDYzLCAweDNGNTYsCisgICAgMHgxMjJBLCAweDBFQTQsIDB4MDcxMiwgMHgwMjMyLCAweDEzRTgsIDB4MDYxRSwKKyAgICAweDA4QjQsIDB4MDE2RSwgMHgwMTc2LCAweDAzM0IsIDB4MDAyOCwgMHgwNUU1LAorICAgIDB4MDYxRiwgMHgwMDAwLCAweDAzNzYsIDB4MDA3MSwgMHgwOTZGLCAweDdERUIsCisgICAgMHgwMDAxLCAweDA1Q0QsIDB4RkFEMywgMHgwMTg2LCAweDBFQTksIDB4MTNFOSwKKyAgICAweDA2Q0QsIDB4N0RFQSwgMHgwMzQwLCAweDI3MUQsIDB4MDE3NSwgMHgwMUMxLAorICAgIDB4MEQ2NSwgMHgxRkZGLCAweDBCOTcsIDB4MEVBOCwgMHgwNkNDLCAweDAzNzUsCisgICAgMHgwNUU0LCAweDA4QjMsIDB4MDVFMywgMHgwMzQxLCAweDBFQTAsIDB4MDk2RSwKKyAgICAweDAzQ0YsIDB4MDA1NiwgMHgwOTcwLCAweDFBNjgsIDB4MDI5QSwgMHgwMTBBLAorICAgIDB4MDBBOCwgMHgwMUNBLCAweDdERUQsIDB4MDBBNSwgMHgwMDFFLCAweDA1QTAsCisgICAgMHgwRDY2LCAweDAwNDcsIDB4MDk3MSwgMHgwQTFDLCAweDAyQ0UsIDB4RkFENCwKKyAgICAweDAwMDQsIDB4MDEwRiwgMHgyNzFFLCAweDA0MTUsIDB4MDIxMiwgMHgwMTlGLAorICAgIDB4N0RFQywgMHgwMUMyLCAweDAxODcsIDB4MDU5RiwgMHgwQTFCLCAweDA1MjcsCisgICAgMHgwMDAyLCAweDAwM0QsIDB4MDA0MSwgMHgwMTc3LCAweDA3MTMsIDB4MDEwRSwKKyAgICAweDAxMDIsIDB4MDJDRiwgMHgwMENBLCAweDAwMDMsIDB4MDFCRiwgMHgwMTIwLAorICAgIDB4MDVERSwgMHgwMDQzLCAweDAxRDAsIDB4MDE4QywgMHgwMEFCLCAweDAyOUYsCisgICAgMHgwM0RGLCAweDAzQzUsIDB4MDI0NywgMHgwOEJCLCAweDAwMTMsIDB4MDNEMiwKKyAgICAweDAwMTUsIDB4MEVCMCwgMHgwMkZBLCAweDA1RTgsIDB4MDAxNCwgMHgwRUIxLAorICAgIDB4MDQ3NiwgMHgxQTc4LCAweDAxRjQsIDB4MDZEMSwgMHgwMTdDLCAweDAwNDIsCisgICAgMHgwNjNGLCAweDAwMTEsIDB4MDAxMiwgMHgwMUM3LCAweDA0RkIsIDB4MUE3NywKKyAgICAweDAxQUEsIDB4MDRGQywgMHgwQTIxLCAweDAyMUQsIDB4MDFFRSwgMHgwMkJDLAorICAgIDB4MDFDMiwgMHgwMjFFLCAweDAwQUEsIDB4MDBENiwgMHgwMjFGLCAweDAxNkYsCisgICAgMHgwMDc3LCAweDAxQUIsIDB4MDBBQywgMHgwMDczLCAweDA3OEQsIDB4MDBBRiwKKyAgICAweDAwMkUsIDB4MDIyMCwgMHgwMDg2LCAweDAxMDMsIDB4MDA4NiwgMHgwMTI3LAorICAgIDB4MEJBMCwgMHgwNURGLCAweDBFQTUsIDB4MDNEMywgMHgwNUUwLCAweDAxN0QsCisgICAgMHhGQUU3LCAweDAxNUEsIDB4MDNDNiwgMHgwNzY4LCAweEZBRTYsIDB4M0Y2NSwKKyAgICAweDAxRjMsIDB4MEI5RiwgMHgwMDE2LCAweDBFQTQsIDB4MDc4QywgMHgwMkJELAorICAgIDB4MDA0RCwgMHgwMTE2LCAweDAzN0EsIDB4MDA3NiwgMHgwMDU2LCAweDA1OEUsCisgICAgMHgwNkQyLCAweDAwMTQsIDB4MDA5RiwgMHgwQTIzLCAweDAzNDYsIDB4MDE0RSwKKyAgICAweDAyQkYsIDB4MDBBNywgMHgwNTI4LCAweDAzNzgsIDB4MDEwNiwgMHgwMUMzLAorICAgIDB4MDE3RSwgMHgwMDQ0LCAweDAzQzcsIDB4MDk3RiwgMHgwNEE1LCAweDAyMEIsCisgICAgMHgwNUU5LCAweDBBMjQsIDB4MDNEOSwgMHgwNjYxLCAweDA2NjAsIDB4MDE0RiwKKyAgICAweDAyQkUsIDB4MDIzQiwgMHgwNEZELCAweDAzMTMsIDB4MDAxNywgMHgwOEJDLAorICAgIDB4MDc2OSwgMHgwNjIyLCAweDBENkMsIDB4MDNENywgMHgwMUM4LCAweDBBMjIsCisgICAgMHgwMUFCLCAweDAyMDMsIDB4MDc2QSwgMHgwM0Q4LCAweDAyRDEsIDB4MDBBNiwKKyAgICAweDA1RTMsIDB4MUE3OSwgMHgxQTdBLCAweDA5ODEsIDB4MDVCMSwgMHgwNEZGLAorICAgIDB4MDk4MiwgMHgwMzQ4LCAweDAxMjgsIDB4MDhCRCwgMHgwRDZELCAweDEzRjQsCisgICAgMHgwNUIyLCAweDA2MjQsIDB4MDVCMywgMHgwRUIyLCAweDI3MjksIDB4MTIzNywKKyAgICAweDA1QjQsIDB4MDEyOSwgMHgwMzQ5LCAweDIzODYsIDB4MDAxOSwgMHgwNEZFLAorICAgIDB4MDVCMCwgMHhGQUU4LCAweDNGNjYsIDB4MDYyMywgMHgwNUUxLCAweDA1RTIsCisgICAgMHgzRjY3LCAweDA5ODAsIDB4MDM0NywgMHgwQkExLCAweDAwNDYsIDB4MDA0NSwKKyAgICAweDBFQTYsIDB4MDFDOSwgMHgwMDE4LCAweDEzRjMsIDB4MDc4RSwgMHgwMTUyLAorICAgIDB4MDk4MywgMHgxMjM4LCAweDI3MkIsIDB4MDFGMiwgMHgwMjhGLCAweDA1RTUsCisgICAgMHgzRjY5LCAweDA0MTgsIDB4MDJGQywgMHgwMTdGLCAweDBFQjMsIDB4MDBFRiwKKyAgICAweDA3OTAsIDB4MDc5MSwgMHgxMjM5LCAweDA1RTYsIDB4MDVFNywgMHgxQTdDLAorICAgIDB4MDM0QSwgMHgwMDFBLCAweDA5ODQsIDB4MDVCNSwgMHgyNzJBLCAweDFBN0IsCisgICAgMHgwRUE3LCAweDA1MjksIDB4MDJGQiwgMHgyMzg3LCAweDNGNjgsIDB4MDc4RiwKKyAgICAweDAwNkQsIDB4MEQ2RSwgMHgwNUI2LCAweDAzOUYsIDB4MDE0RSwgMHgwNThGLAorICAgIDB4MTNGNSwgMHgwNUU0LCAweDAyMEMsIDB4MDM0MiwgMHgxQTczLCAweDdERjcsCisgICAgMHgyNzI0LCAweDAwODIsIDB4MDIwOSwgMHgxQTc0LCAweDA1REIsIDB4MDNENiwKKyAgICAweDAwMUYsIDB4MEI5QywgMHgwNEY5LCAweDAwOTYsIDB4MDNDMywgMHgwNjIwLAorICAgIDB4N0RGOSwgMHg3REY4LCAweDBFQTIsIDB4MDAwQywgMHgyNzI1LCAweDNGNjEsCisgICAgMHgwOTc3LCAweDA5NzYsIDB4MjcyMywgMHgwNUQ4LCAweDI3MjIsIDB4MDU4QywKKyAgICAweDA4QjYsIDB4MDVEOSwgMHgyMzgzLCAweDAyMzYsIDB4MDM2RCwgMHgwQTFGLAorICAgIDB4MDVBQSwgMHgwMTlDLCAweDAxQzAsIDB4MDMyNywgMHgwNURBLCAweDdERjYsCisgICAgMHgwMkNGLCAweDA1REQsIDB4MDM0MSwgMHgwNUFFLCAweDBFQUYsIDB4MjM4NCwKKyAgICAweDAzNDIsIDB4MTNGMCwgMHgwMDBELCAweDA4QjcsIDB4MDAwRSwgMHgwMDNGLAorICAgIDB4MDk3QiwgMHgwMzQzLCAweDBENkEsIDB4MUE3NSwgMHgwMDBGLCAweDNGNjMsCisgICAgMHgwNUFGLCAweDA2Q0YsIDB4MDZEMCwgMHgyMzg1LCAweDEzRjEsIDB4MDU4RCwKKyAgICAweDAyMzcsIDB4MDVBQiwgMHg3REZBLCAweDBFQTMsIDB4MDNDNCwgMHgxM0VGLAorICAgIDB4MDVEQywgMHgyNzI2LCAweDEyMzYsIDB4MDE3QSwgMHgwOTc4LCAweDA1QUQsCisgICAgMHgwNUFDLCAweDAzNDAsIDB4MDIzOCwgMHgwOTdBLCAweDNGNjIsIDB4MDk3OSwKKyAgICAweDAzREUsIDB4MDAxMCwgMHgwMzQ1LCAweDAwMkEsIDB4MDNEMSwgMHgwMUE3LAorICAgIDB4MDFGMiwgMHgwMDlFLCAweDAyMEEsIDB4MDE4OSwgMHgwRDZCLCAweDAzQzYsCisgICAgMHgwMEVFLCAweDBBMjAsIDB4MDE3QiwgMHgwNEZBLCAweDA0NzIsIDB4MDA0MCwKKyAgICAweDAwQ0IsIDB4MDhCOSwgMHgwMkQwLCAweDAyOUUsIDB4MDAyMCwgMHgwMzQ0LAorICAgIDB4MDIzOSwgMHgwMkQwLCAweDBCOUQsIDB4MDIzQSwgMHgwQjlFLCAweDAyOEQsCisgICAgMHgwM0M1LCAweDAzQkUsIDB4MDhCOCwgMHgwNzhCLCAweDAzMzcsIDB4MDI0NiwKKyAgICAweDAwNEMsIDB4MDQxNiwgMHgwMTQxLCAweDA0QTQsIDB4MDBFMiwgMHgwMjEzLAorICAgIDB4MDI4RSwgMHgwMUE3LCAweDAyMUMsIDB4MDBENCwgMHgwMUM2LCAweDAwNzIsCisgICAgMHgwMDY3LCAweDAwMkIsIDB4MDQ3MywgMHgwMzZGLCAweDAxRTAsIDB4MDM2RSwKKyAgICAweDAwNDEsIDB4M0Y2NCwgMHgwOTdFLCAweDA2MjEsIDB4MDJCQiwgMHgwMEQ3LAorICAgIDB4MjcyOCwgMHgyNzI3LCAweDAxQzEsIDB4MDEyOSwgMHgwNDE3LCAweDEzRjIsCisgICAgMHgwOTdDLCAweDAxNDIsIDB4MDk3RCwgMHgxQTc2LCAweDA4QkEsIDB4MDYzRSwKKyAgICAweDAxMDAsIDB4MDFBQSwgMHgwMThBLCAweDAwRUEsIDB4MDE0RCwgMHgwMDFFLAorICAgIDB4MDFDNSwgMHgwM0M3LCAweDAwNTMsIDB4MDVFQywgMHgwMTJELCAweDAwNEMsCisgICAgMHgwRDcxLCAweDAxRDAsIDB4MDAyMywgMHgwRDcyLCAweDAxODUsIDB4MDJEMiwKKyAgICAweDA3MTksIDB4MDEyRiwgMHgwNTAyLCAweDAxMkUsIDB4MEEyOCwgMHgwOThFLAorICAgIDB4MjM4QiwgMHgyNzJELCAweDA1RUUsIDB4MDVCRSwgMHgwMTMwLCAweEZBRUUsCisgICAgMHgyNzJFLCAweDBCQTIsIDB4MDVFQiwgMHgwMUNGLCAweEZBRUQsIDB4MjM4QSwKKyAgICAweDAxQ0UsIDB4MDk4QywgMHg3REZELCAweDA1QkQsIDB4MDA0QSwgMHgwMDM2LAorICAgIDB4MDAzNywgMHgwNjI4LCAweDAyRkQsIDB4MDQ4QSwgMHgwMTdFLCAweDAwNEIsCisgICAgMHgwOThELCAweDAxNTMsIDB4MDIxNiwgMHgwRDczLCAweDFBODIsIDB4MDA0MiwKKyAgICAweDAxN0YsIDB4MDI2QywgMHgwMjBELCAweDA3OTQsIDB4MDE0MywgMHgwMDdFLAorICAgIDB4MDYyQSwgMHgwNzk4LCAweDAwNEYsIDB4MEVCQSwgMHgwQkE0LCAweDAyM0UsCisgICAgMHgwNUJGLCAweDBFQjksIDB4MDU5MiwgMHgwM0NDLCAweDAwNEUsIDB4MDE4RSwKKyAgICAweDAzMkMsIDB4MDYyOSwgMHgwQkEzLCAweDAxRjcsIDB4MEVCOCwgMHgwMDRELAorICAgIDB4MDk5MCwgMHgwMzUwLCAweDA5OEYsIDB4MDM0MywgMHgwMDIzLCAweDA1MkIsCisgICAgMHgwMDRFLCAweDAxNzgsIDB4MDRBNiwgMHgwMjkxLCAweDA1RUQsIDB4MDBEQywKKyAgICAweDAzMkQsIDB4MDUwNCwgMHgwOTkxLCAweDBBMjksIDB4MDU5MywgMHgwMUYzLAorICAgIDB4MEEyQSwgMHgwNTA1LCAweDAxNUIsIDB4MDY2NiwgMHgwMDg3LCAweDAzREEsCisgICAgMHgwQkE1LCAweDA3NkQsIDB4MDVDMSwgMHgwM0NELCAweDAwMjQsIDB4MDk5MiwKKyAgICAweDA0QTcsIDB4MDEzMSwgMHgwNUMyLCAweDI3MkYsIDB4MDFEMSwgMHgwNzZCLAorICAgIDB4MDc2QywgMHgxMjQyLCAweDA1RUYsIDB4MDYyQiwgMHgwRUFFLCAweDEzRkQsCisgICAgMHgwNUMwLCAweDBFQkIsIDB4MDIzRiwgMHgwRDc0LCAweDA1MDMsIDB4MDJGRSwKKyAgICAweDA0MUEsIDB4MDM3QiwgMHgwOEJFLCAweDAyNDAsIDB4MDMxNiwgMHgwRUJELAorICAgIDB4M0Y3MCwgMHgwRUJDLCAweDBBMkIsIDB4MEJBNywgMHgwMDUzLCAweDA1QzUsCisgICAgMHgxM0ZFLCAweDA1MDYsIDB4MDNDRSwgMHgwMDI2LCAweDA5OTQsIDB4MDAzOCwKKyAgICAweDAwMjcsIDB4MDEzMiwgMHgwMjBFLCAweDI3MzEsIDB4MEVCRSwgMHgwNzk2LAorICAgIDB4MDE4RiwgMHgwNUM2LCAweDAyRkYsIDB4MDc5NSwgMHgxQTgzLCAweDNGNkUsCisgICAgMHgwQkE2LCAweDAwMjUsIDB4MTI0MywgMHgzRjZGLCAweDAwNEYsIDB4MjczMCwKKyAgICAweDA2MkMsIDB4MDk5MywgMHgwNUMzLCAweDA1QzQsIDB4MDA1MSwgMHgwMDUyLAorICAgIDB4MDM1MSwgMHgwNjJELCAweDAwNTAsIDB4MDFGNiwgMHgwOEJGLCAweDNGNzEsCisgICAgMHgyMzhFLCAweDA1QzcsIDB4MDFGNywgMHgwNUM4LCAweDA2MkUsIDB4MDEyQSwKKyAgICAweDAzMkYsIDB4MDA3NywgMHgxQTg2LCAweDBFQkYsIDB4MDNEQiwgMHgwNEFBLAorICAgIDB4MEJBOCwgMHgxM0ZGLCAweDA2MkYsIDB4RkFGMiwgMHgwNzFBLCAweDAwNTQsCisgICAgMHhGQUYxLCAweDI3MzIsIDB4RkFGMCwgMHgyMzhDLCAweDIzOEQsIDB4RkFFRiwKKyAgICAweDFBODQsIDB4MDM5MiwgMHgxMjQ0LCAweDA5OTUsIDB4MDc5OSwgMHgwMDdGLAorICAgIDB4MDMyRSwgMHg3REZFLCAweDFBODUsIDB4MDVFRSwgMHgwMThBLCAweDA5OTYsCisgICAgMHgwMDI4LCAweDAxNTIsIDB4MDI1QSwgMHgwQTI1LCAweDdERkMsIDB4M0Y2QiwKKyAgICAweDAyM0MsIDB4MDE4QiwgMHgwNUI3LCAweDAxODAsIDB4MDBGRCwgMHgwMUJBLAorICAgIDB4MDVFQSwgMHgxMjNELCAweDA1RTgsIDB4MDAyRiwgMHgwNjI1LCAweDA1QjksCisgICAgMHgwNUI4LCAweDA0NzcsIDB4MTNGNywgMHgwRDZGLCAweDNGNkMsIDB4RkFFQSwKKyAgICAweDAxQ0IsIDB4RkFFOSwgMHgwOTg1LCAweDIzODgsIDB4N0RGQiwgMHgwMzRCLAorICAgIDB4MDFDQSwgMHgwMDQ3LCAweDEyM0EsIDB4M0Y2QSwgMHgwMTdELCAweDA2NjIsCisgICAgMHgxMjNDLCAweDEyM0IsIDB4MDM3OSwgMHgwMjRBLCAweDEzRjYsIDB4MUE3RCwKKyAgICAweDAxNkEsIDB4MEVBQSwgMHgxMjNGLCAweEZBRUMsIDB4MEVBOSwgMHgxM0ZCLAorICAgIDB4MDE4MiwgMHgwNzkyLCAweDA1QkEsIDB4MDE4MSwgMHgwRDcwLCAweDAwMUYsCisgICAgMHgwMDFFLCAweDA1QkIsIDB4M0Y2RCwgMHgwMDIwLCAweDIzODksIDB4MTI0MCwKKyAgICAweDAxODMsIDB4MDUwMSwgMHgxQTdGLCAweDA2RDYsIDB4MDY2MywgMHgwNkQzLAorICAgIDB4MTNGOCwgMHgwMzRDLCAweDBFQjQsIDB4MTIzRSwgMHgxQTdFLCAweDEzRjksCisgICAgMHgwMDFCLCAweDA1RTksIDB4MEVBOCwgMHgwMDFDLCAweEZBRUIsIDB4MDVFQSwKKyAgICAweDAzNEQsIDB4MDUwMCwgMHgxM0ZBLCAweDAwMUQsIDB4MDA0OCwgMHgwNzk0LAorICAgIDB4MDA3NSwgMHgwNzk1LCAweDA3OTMsIDB4MDA3NCwgMHgwMDhBLCAweDAzQzksCisgICAgMHgwNUVCLCAweDAwODcsIDB4MDA3NiwgMHgwMTJCLCAweDAxMkMsIDB4MDM3QSwKKyAgICAweDA3MTgsIDB4MDAyMiwgMHgyNzJDLCAweDA5ODgsIDB4MEVCNSwgMHgwMzI4LAorICAgIDB4MDNDQSwgMHgwNUVDLCAweDBFQUIsIDB4MDZENywgMHgwMDIxLCAweDA2NjQsCisgICAgMHgxQTgwLCAweDA5ODYsIDB4MDQxOSwgMHgwM0M4LCAweDAzNEUsIDB4MDk4NywKKyAgICAweDA2MjYsIDB4MDJGQywgMHgwMEFFLCAweDAxQ0MsIDB4MDIzRCwgMHgwMTJBLAorICAgIDB4MDAyMSwgMHgwQTI2LCAweDA1QkMsIDB4MDFGNiwgMHgwMjIxLCAweDAwNDksCisgICAgMHgwRUI2LCAweDAwNDIsIDB4MDJEMiwgMHgwMEYyLCAweDAwQUYsIDB4MDI5MCwKKyAgICAweDAwNDMsIDB4MDUyQSwgMHgxM0ZDLCAweDBBMjcsIDB4MDMyQSwgMHgxMjQxLAorICAgIDB4MEVCNywgMHgwRUFELCAweDAzNEYsIDB4MEVBQywgMHgwMDIyLCAweDA1RUQsCisgICAgMHgwNzk3LCAweDAzMkIsIDB4MDAzNSwgMHgwOTg5LCAweDAxODQsIDB4MDM3QiwKKyAgICAweDA5OEEsIDB4MUE4MSwgMHgwOThCLCAweDA3OTYsIDB4MDFDRCwgMHgwMjVCLAorICAgIDB4MDNDQiwgMHgwNjI3LCAweDAyREEsIDB4MDEwQywgMHgwMkQxLCAweDA2RUEsCisgICAgMHgwNjY1LCAweDAzMjksIDB4MEQ3OCwgMHg3RTA1LCAweDdFMDQsIDB4MTQwQSwKKyAgICAweDBFQjMsIDB4MEVDRiwgMHgzRjdDLCAweDEyNTYsIDB4MDVGQiwgMHgwNUNGLAorICAgIDB4RkFGRiwgMHgzRjdELCAweDBFRDAsIDB4N0UwNiwgMHgzRjdFLCAweDNGN0YsCisgICAgMHhGQjAwLCAweDIzOUIsIDB4MEVEMiwgMHgxMjU3LCAweDdFMDcsIDB4MEVEMSwKKyAgICAweDAwMkQsIDB4MTI1NSwgMHgyNzNBLCAweDA5QTQsIDB4MjM5QSwgMHgwRUNELAorICAgIDB4MjczQiwgMHgxQThDLCAweDAwMkUsIDB4MDlBNSwgMHhGQUZFLCAweDI3M0MsCisgICAgMHgwQkFGLCAweDBCQjAsIDB4MDVDRSwgMHgwOUE2LCAweDAwRDEsIDB4MEVDRSwKKyAgICAweDA5QTgsIDB4MDAzMCwgMHgxQThFLCAweDBFRDMsIDB4MDlBNywgMHgwNjY3LAorICAgIDB4MTI1OCwgMHgyNzQwLCAweDBENzksIDB4M0Y4MCwgMHgwMTg5LCAweDA5QTksCisgICAgMHgwRUI1LCAweDAzNTksIDB4MEVENCwgMHgxMjVBLCAweDIzOUQsIDB4MTI1OSwKKyAgICAweDA1RDEsIDB4MEQ3QSwgMHg3RTBBLCAweDdFMDksIDB4MDlBQSwgMHgyNzNELAorICAgIDB4MEVCNCwgMHgyNzNFLCAweDAwMkYsIDB4MDM1NCwgMHgwNUZDLCAweDIzOUMsCisgICAgMHgxQThELCAweDAzNTUsIDB4MDM1NywgMHgwNUQwLCAweDAzNTgsIDB4MDM1NiwKKyAgICAweDAxRDIsIDB4MDUwOCwgMHg3RTA4LCAweDI3M0YsIDB4MDMwMiwgMHgwRUQ3LAorICAgIDB4MjM5RSwgMHgzRjg0LCAweDA4QzQsIDB4MDFEMywgMHgwQkIxLCAweDA1MDksCisgICAgMHgyMzlGLCAweDAzMDMsIDB4MDEzMywgMHgwMzVDLCAweDEyNUIsIDB4MDNEMSwKKyAgICAweDBFRDgsIDB4MDM1RCwgMHgwMzVFLCAweDI3NDMsIDB4Mjc0NCwgMHgwOUFELAorICAgIDB4MDE4QSwgMHgwMDMxLCAweDA5QUMsIDB4M0Y4MiwgMHgyNzQxLCAweDNGODEsCisgICAgMHgwMzVBLCAweDNGODMsIDB4MDVGRCwgMHgwOUFCLCAweDBFRDUsIDB4MEVENiwKKyAgICAweDA2MzMsIDB4Mjc0MiwgMHgwMDU1LCAweDA4QzMsIDB4MDYzNiwgMHgwMzVCLAorICAgIDB4MDVGRSwgMHgwRDdCLCAweDAwMzksIDB4RkIwNSwgMHg3RTBCLCAweDdFMEMsCisgICAgMHgxNDBELCAweDAxOEIsIDB4MDlBRiwgMHgyNzQ2LCAweDAwMzIsIDB4MDA1NiwKKyAgICAweDA5QjAsIDB4MDNEMiwgMHgwQTMwLCAweDI3NDcsIDB4MDA1NywgMHgwRURBLAorICAgIDB4MDUwQSwgMHgxMjVFLCAweDAwMzMsIDB4Mjc0OCwgMHgwRDdDLCAweDAzRDMsCisgICAgMHgzRjg1LCAweDAwMzQsIDB4RkIwMSwgMHgxNDBCLCAweEZCMDIsIDB4MDVGRiwKKyAgICAweDEyNUMsIDB4RkIwMywgMHgxMjVELCAweDFBOEYsIDB4MDYwMCwgMHgwNUQyLAorICAgIDB4MDYwMiwgMHgyNzQ1LCAweDA2MDEsIDB4MEVEOSwgMHgxQTkwLCAweEZCMDQsCisgICAgMHgxNDBDLCAweDA5QUUsIDB4MDMzQSwgMHg3RTBGLCAweDIzQTIsIDB4MEEzMSwKKyAgICAweDBFQjYsIDB4MDA1OCwgMHgzRjhBLCAweDIzQTMsIDB4MDFENiwgMHgwNEFCLAorICAgIDB4MDA1OSwgMHgwRURCLCAweDAyRDMsIDB4MDE4QywgMHgwNEM2LCAweDEyNjAsCisgICAgMHgzRjhCLCAweDEyNUYsIDB4MTI2MSwgMHgwNzFFLCAweDdFMTAsIDB4Mjc0OSwKKyAgICAweDE0MEUsIDB4M0Y4NywgMHgzRjg2LCAweDAwMzUsIDB4M0Y4OCwgMHgzRjg5LAorICAgIDB4N0UwRCwgMHgyM0EwLCAweDFBOTEsIDB4MDc5NywgMHgwNjAzLCAweDFBOTIsCisgICAgMHgwNTBCLCAweDA2NkEsIDB4MDMwNiwgMHg3RTBFLCAweDIzQTEsIDB4MDc5QiwKKyAgICAweDBCQUEsIDB4M0Y3MywgMHg3RTAxLCAweDAyOTIsIDB4MDIxNiwgMHgwOTk4LAorICAgIDB4MTI0NywgMHgyMzkwLCAweDAzMDEsIDB4MDk5OSwgMHgxNDAwLCAweDFBODcsCisgICAgMHgwNDFFLCAweDE0MDEsIDB4MEVDMSwgMHgyMzkxLCAweDNGNzQsIDB4MEEyQywKKyAgICAweDEyNDgsIDB4M0Y3NSwgMHgwNUM5LCAweDBFQzIsIDB4MjczMywgMHgyMzhGLAorICAgIDB4RkFGMywgMHhGQUY0LCAweDBFQzAsIDB4MDk5NywgMHgzRjcyLCAweEZBRjUsCisgICAgMHgxMjQ1LCAweDA4QzAsIDB4MEJBOSwgMHgxMjQ2LCAweDAyMEYsIDB4MDQxQiwKKyAgICAweDAxODYsIDB4N0UwMCwgMHg3REZGLCAweDAzMDAsIDB4RkFGQSwgMHgyNzM0LAorICAgIDB4MDVGMiwgMHgxMjRELCAweDIzOTUsIDB4MDk5QSwgMHgyNzM1LCAweDNGNzcsCisgICAgMHgwRUM0LCAweDBFQzUsIDB4MTQwMywgMHgwRUM2LCAweDE0MDIsIDB4MUE4OSwKKyAgICAweDNGNzgsIDB4MDVGNSwgMHgwNUYzLCAweDA1RjQsIDB4MjczNiwgMHgxNDA0LAorICAgIDB4N0UwMiwgMHgxMjRFLCAweDBENzUsIDB4MDAyOSwgMHgyMzkyLCAweEZBRjcsCisgICAgMHhGQUY2LCAweDBFQzMsIDB4MTI0OSwgMHgyMzk0LCAweDIzOTMsIDB4MDVGMCwKKyAgICAweEZBRjgsIDB4MTI0QiwgMHgxMjRDLCAweDEyNEEsIDB4M0Y3NiwgMHgwNUNBLAorICAgIDB4MDVGMSwgMHhGQUY5LCAweDFBODgsIDB4MDE4NywgMHgwNUY3LCAweDEyNEYsCisgICAgMHgwNjMxLCAweDBENzYsIDB4MEVBRiwgMHgyNzM3LCAweDBCQUMsIDB4MDk5RCwKKyAgICAweDBBMkQsIDB4MTI1MCwgMHgxNDA3LCAweDBCQUQsIDB4M0Y3QSwgMHgyMzk2LAorICAgIDB4MjM5NywgMHgwMzUzLCAweDFBOEIsIDB4MDhDMiwgMHgwNUNELCAweDA5OUUsCisgICAgMHgwNUNDLCAweDAzNTIsIDB4MDAyQSwgMHgwNUNCLCAweDAzQ0YsIDB4MUE4QSwKKyAgICAweDE0MDUsIDB4MTQwNiwgMHgwOTlCLCAweDBFQzcsIDB4MDYzMCwgMHgwMDJCLAorICAgIDB4M0Y3OSwgMHgwOEMxLCAweDBCQUIsIDB4MDUwNywgMHgwNUY2LCAweDBFQzgsCisgICAgMHgwOTlDLCAweDBFQjAsIDB4MEEyRiwgMHgwRUIxLCAweDI3MzksIDB4MDlBMSwKKyAgICAweDAzRDAsIDB4MTI1MiwgMHg3RTAzLCAweDAyNDEsIDB4MDE4OCwgMHgwRUIyLAorICAgIDB4MEJBRSwgMHgwNUZBLCAweDA5QTIsIDB4MTI1NCwgMHgyMzk4LCAweEZBRkIsCisgICAgMHgxMjUzLCAweDIzOTksIDB4MEVDQywgMHhGQUZELCAweEZBRkMsIDB4MDlBMywKKyAgICAweDE0MDgsIDB4MDlBMCwgMHgwNUY4LCAweDNGN0IsIDB4MDk5RiwgMHgwRDc3LAorICAgIDB4MTQwOSwgMHgwMDJDLCAweDBFQzksIDB4MEVDQiwgMHgwQTJFLCAweDEyNTEsCisgICAgMHgwRUNBLCAweDA3OUEsIDB4MDcxQiwgMHgwNUY5LCAweDI3MzgsIDB4MDYzMiwKKyAgICAweDAwMkUsIDB4MDAxMiwgMHg3RTI1LCAweEZCMUMsIDB4MDI2MiwgMHgwMDFDLAorICAgIDB4MDNENiwgMHgwMThFLCAweDAwN0MsIDB4MDM0MiwgMHgwNTJFLCAweDdFMjYsCisgICAgMHhGQjFELCAweDAxRDcsIDB4MEQ3RiwgMHgxMjZBLCAweDI3NTYsIDB4MDlCNiwKKyAgICAweEZCMjAsIDB4M0Y5NywgMHhGQjIxLCAweEZCMUUsIDB4RkIxRiwgMHgyM0FGLAorICAgIDB4RkIxOSwgMHhGQjFBLCAweDIzQUUsIDB4N0UyNCwgMHgxQTk1LCAweDI3NTUsCisgICAgMHgyNzU0LCAweDA1RDcsIDB4MDUwRCwgMHgwRUUzLCAweEZCMUIsIDB4MEVFMiwKKyAgICAweDBCQjUsIDB4MDBFMywgMHgwOENCLCAweDA1RDgsIDB4MDFCOSwgMHgwMEU3LAorICAgIDB4MTQxMiwgMHgxQTk2LCAweDAxNUEsIDB4MDA5QSwgMHgwMDdCLCAweEZCMjQsCisgICAgMHgzRjk5LCAweDAyNkQsIDB4MDAyNiwgMHgwRUU1LCAweDBFRTQsIDB4MDIyMiwKKyAgICAweDA1RDksIDB4MEQ4MiwgMHg3RTI4LCAweDNGOUEsIDB4MEEzNiwgMHhGQjI1LAorICAgIDB4RkIyNiwgMHgyM0IxLCAweDdFMjksIDB4MTI2QiwgMHg3RTI3LCAweDIzQjAsCisgICAgMHhGQjIyLCAweDE0MTEsIDB4MEJCNiwgMHgzRjk4LCAweDEyNkMsIDB4MDlCNywKKyAgICAweDAyQzIsIDB4MDQ0MiwgMHgwQTMzLCAweDAxMkIsIDB4MDFDMSwgMHgwMDM0LAorICAgIDB4RkIyMywgMHgxMjZELCAweDAzREYsIDB4MDA4NCwgMHgwRUI3LCAweDIzQjIsCisgICAgMHg3RTJBLCAweDA1MkYsIDB4MDE4RCwgMHgwQjE2LCAweDdFMkIsIDB4MDFBMiwKKyAgICAweDA3MzYsIDB4MDBGMywgMHgwNjBGLCAweDAwM0IsIDB4MDAzQiwgMHgwODFBLAorICAgIDB4MDAzRiwgMHgxNDE2LCAweDAwM0UsIDB4M0Y5RCwgMHgxMjZFLCAweDdFMkUsCisgICAgMHg3RTJDLCAweDdFMkQsIDB4Mjc1NywgMHgwNjBFLCAweEZCMjgsIDB4RkIyNywKKyAgICAweDNGOUIsIDB4MDUwRSwgMHgwRUU2LCAweDAxOEYsIDB4MDVEQSwgMHgwMTM2LAorICAgIDB4MDcxRiwgMHhGQjI5LCAweDE0MTMsIDB4MDEzNywgMHgzRjlDLCAweDBFRTcsCisgICAgMHgwNURCLCAweDAyREIsIDB4MDVFRiwgMHgyM0I1LCAweDBFQkIsIDB4MDI0MywKKyAgICAweEZCMkQsIDB4MDMwNywgMHhGQjJFLCAweDI3NUEsIDB4MDI5MywgMHgwNDFGLAorICAgIDB4MDY4NiwgMHgzRjlFLCAweDAyMTcsIDB4MDYxMiwgMHgwNUZBLCAweDIzQjYsCisgICAgMHg3RTJGLCAweDFBOTcsIDB4Mjc1QiwgMHgwNjEzLCAweEZCMkYsIDB4N0UzMCwKKyAgICAweEZCMkEsIDB4MjNCNCwgMHgxMjZGLCAweDIzQjMsIDB4MTI3MCwgMHgyNzU4LAorICAgIDB4RkIyQiwgMHgwNjEwLCAweDBCQjcsIDB4MDNENywgMHgyNzU5LCAweDA5MTYsCisgICAgMHgwNTBGLCAweDBFQkEsIDB4MEJGNiwgMHhGQjJDLCAweDA2MTEsIDB4MDBEMywKKyAgICAweDJDNUUsIDB4N0UzNiwgMHhGQjM0LCAweEZCMzMsIDB4M0ZBMiwgMHhGQjM1LAorICAgIDB4MkZERSwgMHgxNDE3LCAweDBBMzcsIDB4M0ZBMywgMHgwMkEyLCAweDdFMzcsCisgICAgMHhGQjM2LCAweDAwNUUsIDB4MDU4QSwgMHgwNzZGLCAweDA4ODYsIDB4MDA1RiwKKyAgICAweEZCM0IsIDB4MDY4NiwgMHgwMzQyLCAweEZCMzcsIDB4RkIzQSwgMHgzRjlGLAorICAgIDB4M0ZBMCwgMHhGQjMxLCAweEZCMzAsIDB4MjNCNywgMHgzRkExLCAweDIzQkIsCisgICAgMHgyM0JBLCAweDEyNzEsIDB4MEQ4MywgMHgxMDM2LCAweDdFMzIsIDB4MTI3MiwKKyAgICAweDdFMzEsIDB4N0UzMywgMHgxNjJFLCAweDEyNzMsIDB4RkIzMiwgMHhGQjBDLAorICAgIDB4MTI2MiwgMHhGQjBELCAweEZCMEIsIDB4M0Y4RiwgMHgwMDM3LCAweDEyNjMsCisgICAgMHgzRjkwLCAweDBFREQsIDB4MDAzOCwgMHgwNUQzLCAweEZCMEUsIDB4MjNBNywKKyAgICAweDA2MDYsIDB4MTI2NSwgMHgzRjkxLCAweDEyNjQsIDB4MDAzOSwgMHhGQjBGLAorICAgIDB4N0UxNCwgMHhGQjEwLCAweDI3NEEsIDB4Mjc0QiwgMHhGQjA3LCAweEZCMDgsCisgICAgMHgyM0E1LCAweEZCMDYsIDB4MjNBNCwgMHgwRURDLCAweEZCMEEsIDB4RkIwOSwKKyAgICAweDdFMTEsIDB4MDAzNiwgMHgwNjA1LCAweDNGOEMsIDB4N0UxMiwgMHgwNjA0LAorICAgIDB4M0Y4RSwgMHgyM0E2LCAweDdFMTMsIDB4M0Y4RCwgMHgwM0RFLCAweDdFMTksCisgICAgMHg3RTE4LCAweDAyNDIsIDB4MDA5NywgMHgwOEM1LCAweEZCMTMsIDB4N0UxQSwKKyAgICAweDAwNUEsIDB4MDc5QiwgMHgwNjA3LCAweDA5QjIsIDB4MDMzQiwgMHgwNUQ0LAorICAgIDB4MDlCMywgMHhGQjE0LCAweDIzQTgsIDB4MDYzNywgMHg3RTFCLCAweDIzQUEsCisgICAgMHgyM0E5LCAweDA2MDgsIDB4Mjc0QywgMHhGQjEyLCAweEZCMTEsIDB4N0UxNSwKKyAgICAweDEyNjYsIDB4MTQwRiwgMHgxMjY3LCAweDdFMTYsIDB4Mjc0RCwgMHgwNzlFLAorICAgIDB4Mjc0RSwgMHgwRURFLCAweDA2NkIsIDB4MDlCMSwgMHgwRDdELCAweDNGOTIsCisgICAgMHg3RTE3LCAweDA3OUEsIDB4MDAyQSwgMHgwMEQyLCAweDIzQUMsIDB4MjNBQiwKKyAgICAweDAyRjIsIDB4MDBCNiwgMHgwQkIyLCAweDA1RDUsIDB4MDA2NiwgMHgwM0EyLAorICAgIDB4MDAzQSwgMHgwNjBCLCAweDA2MEEsIDB4MDMxNywgMHgwNzlGLCAweDAzNjIsCisgICAgMHgyNzUwLCAweDA1MEMsIDB4M0Y5NSwgMHg3RTFELCAweDdFMUUsIDB4RkIxNSwKKyAgICAweDIzQUQsIDB4Mjc0RiwgMHgzRjkzLCAweDNGOTQsIDB4N0UxQywgMHgwNjA5LAorICAgIDB4MDhDNiwgMHgwRUUwLCAweDBFREYsIDB4MDM1RiwgMHgwMTM2LCAweDA3NkUsCisgICAgMHgxQTkzLCAweDEyNjgsIDB4MEEzMiwgMHgwMjRCLCAweDA4QzcsIDB4MTQxMCwKKyAgICAweDAxRUMsIDB4MDAzNiwgMHgwRUUxLCAweDAzNjMsIDB4MDA3MiwgMHgwMDMwLAorICAgIDB4MDAzRSwgMHgyNzUzLCAweDdFMjEsIDB4MDBENywgMHgwMTE3LCAweDAwM0EsCisgICAgMHgwQkI0LCAweDAxMjYsIDB4MDE4RCwgMHgwNUQ2LCAweDdFMjIsIDB4RkIxNiwKKyAgICAweDBEN0UsIDB4MDYwRCwgMHhGQjE4LCAweEZCMTcsIDB4N0UyMywgMHg3RTFGLAorICAgIDB4Mjc1MiwgMHgxMjY5LCAweDI3NTEsIDB4MDlCNCwgMHgwOENBLCAweDFBOTQsCisgICAgMHgzRjk2LCAweDBCQjMsIDB4MDEwNywgMHgwOUI1LCAweDAwNUIsIDB4MDNENiwKKyAgICAweDAwQjAsIDB4MDEwMSwgMHg3RTIwLCAweDA2MEMsIDB4MDNENywgMHgwMDMyLAorICAgIDB4MDRERSwgMHhGQTkxLCAweDdEQTgsIDB4MDg4RSwgMHgwMzc0LCAweDdEQTksCisgICAgMHgwNTRFLCAweDAwN0EsIDB4MDIyMywgMHgwMTUyLCAweDNGMjYsIDB4N0RBQSwKKyAgICAweDA2MTAsIDB4MUEzNiwgMHgxM0IzLCAweDBFNTgsIDB4MUEzNSwgMHg3REFELAorICAgIDB4M0YyNywgMHg3REFFLCAweDdEQUIsIDB4N0RBQywgMHhGQThELCAweDIzNDcsCisgICAgMHhGQThFLCAweEZBOEMsIDB4N0RBNiwgMHgzRjI0LCAweDIzNDgsIDB4N0RBNywKKyAgICAweDBFNEYsIDB4MDJDOCwgMHgwMzc2LCAweEZBOTAsIDB4RkE4RiwgMHgwMTE2LAorICAgIDB4MDA4QSwgMHgwNTlBLCAweDNGMjUsIDB4MDA0NCwgMHgwMEFDLCAweDFBMzcsCisgICAgMHgwMTUzLCAweDAwNjYsIDB4MDFERSwgMHgwNDlDLCAweEZBOTYsIDB4M0YyOCwKKyAgICAweDAzNzAsIDB4MDBFQSwgMHgwNTRGLCAweDNGMjksIDB4MDA2QiwgMHgwOTNDLAorICAgIDB4MDU3MCwgMHgxMUUyLCAweDI2RTAsIDB4MUEzOCwgMHgyNkUxLCAweDIzNEEsCisgICAgMHg3REIxLCAweDA5M0QsIDB4MUZENywgMHgyMzQ5LCAweDdEQUYsIDB4N0RCMCwKKyAgICAweDAzMTAsIDB4MDc3NSwgMHhGQTkzLCAweEZBOTIsIDB4MTNCNCwgMHgwMDlBLAorICAgIDB4MDAyMiwgMHgwOTNCLCAweDAyMEUsIDB4MDAyQSwgMHgwMDNDLCAweEZBOTUsCisgICAgMHhGQTk0LCAweDAzM0MsIDB4MDBBOCwgMHgwMEM5LCAweDI2RTMsIDB4RkE5OSwKKyAgICAweDA1MUQsIDB4MDBGQSwgMHgwMTU0LCAweDA5M0UsIDB4MDBERSwgMHgwMzcxLAorICAgIDB4MDAyRSwgMHhGQTlBLCAweDExRTMsIDB4MDM3NywgMHgwNzc2LCAweDdEQjIsCisgICAgMHgxMUU0LCAweDExRTUsIDB4N0RCMywgMHgzRjJCLCAweEZBOUIsIDB4MjM0RSwKKyAgICAweDExRTYsIDB4MjZFMiwgMHgwNTlCLCAweEZBOTgsIDB4RkE5NywgMHgyMzRCLAorICAgIDB4MEEwRCwgMHgwNTlDLCAweDIzNEMsIDB4MDU3MSwgMHgwMDZDLCAweDA3NUMsCisgICAgMHgyMzRELCAweDNGMkEsIDB4MDZDMiwgMHgwMEZFLCAweDAzMTEsIDB4MDU5RCwKKyAgICAweDAxMEEsIDB4MDMxQywgMHgwNTlFLCAweDExRTgsIDB4MDU4NywgMHgyMzUyLAorICAgIDB4MDMxMiwgMHg3REI2LCAweEZBOUUsIDB4MDRERiwgMHgxRkQ4LCAweDExRTksCisgICAgMHgwOTNGLCAweDBBMEUsIDB4MEU1QSwgMHgxMUVBLCAweDIzNTMsIDB4MUZEOSwKKyAgICAweDA1NzMsIDB4MTFFQiwgMHg3REI3LCAweEZBOUYsIDB4MEU1QiwgMHhGQTlDLAorICAgIDB4RkE5RCwgMHg3REI0LCAweDIzNEYsIDB4MEU1OSwgMHgwNTcyLCAweDIzNTEsCisgICAgMHgyMzUwLCAweDExRTcsIDB4MDQ5RCwgMHgzRjJELCAweDNGMkMsIDB4MDAyMywKKyAgICAweDAxMEQsIDB4MDg4RiwgMHg3REI1LCAweDI2RTQsIDB4MDYxMSwgMHhGQUE0LAorICAgIDB4MUEzOSwgMHhGQUE1LCAweEZBQTMsIDB4MjZFNywgMHhGQUE2LCAweDNGMkYsCisgICAgMHgyMzU2LCAweDIzNTcsIDB4MDk0MCwgMHgxM0I4LCAweEZBQTcsIDB4N0RCQywKKyAgICAweDFGREEsIDB4MjM1OCwgMHhGQUE4LCAweDNGMzAsIDB4MjZFOCwgMHhGQUE5LAorICAgIDB4RkFBQSwgMHhGQUFCLCAweDIzNTksIDB4N0RCRCwgMHg3REI5LCAweDIzNTQsCisgICAgMHgxMUVDLCAweEZBQTAsIDB4N0RCOCwgMHgxM0I1LCAweDExRUQsIDB4MjM1NSwKKyAgICAweDdEQkEsIDB4MTNCNiwgMHgxM0I3LCAweDdEQkIsIDB4RkFBMSwgMHgyNkU1LAorICAgIDB4MDYxMiwgMHgzRjJFLCAweDI2RTYsIDB4RkFBMiwgMHg3RDlFLCAweDA1OTAsCisgICAgMHg3RDlGLCAweEJGN0QsIDB4MEQwRiwgMHgxM0FGLCAweDA1OTEsIDB4MUExQywKKyAgICAweDFGRDMsIDB4MTdFRSwgMHgwNTkyLCAweDNGMUEsIDB4QkY3RSwgMHgxMURDLAorICAgIDB4MDU5MywgMHgyMDZGLCAweDdEQTAsIDB4M0YxQywgMHhCRjdGLCAweDFBMUUsCisgICAgMHgzRjFELCAweDFBMUQsIDB4MjQ1QywgMHgxMTBFLCAweDExMEYsIDB4NThCRSwKKyAgICAweDAyMjAsIDB4MDE1MCwgMHgxRkQyLCAweDdEOUMsIDB4MDREQywgMHgwNUU2LAorICAgIDB4MEQwRSwgMHgwMDFFLCAweEJGN0MsIDB4NThCRiwgMHgwQjgwLCAweDA1NEMsCisgICAgMHgxM0FFLCAweDIwNkUsIDB4MDJBMywgMHgwNTFDLCAweDFBMzAsIDB4MjQ1RiwKKyAgICAweDA0NjYsIDB4N0RBMSwgMHgwMzBBLCAweDNGMUYsIDB4RkE4MiwgMHgwODhDLAorICAgIDB4MDVFNywgMHgwNERELCAweDEzQjAsIDB4MDc5MCwgMHgxQTMxLCAweDFGRDQsCisgICAgMHgxM0IxLCAweDdEQTIsIDB4MjYzOCwgMHgxQTMyLCAweDIzNDEsIDB4MjM0MCwKKyAgICAweDI2MzksIDB4M0YxRSwgMHhGQTgwLCAweDA1OTQsIDB4MTFERSwgMHgxMURGLAorICAgIDB4MDU5NiwgMHgxQTFGLCAweDA1OTUsIDB4MDJDNCwgMHgwNTFBLCAweDBFNEQsCisgICAgMHgwRTRDLCAweDA0MEMsIDB4MjQ1RSwgMHgwNDY0LCAweEZBODEsIDB4MjQ1RCwKKyAgICAweDAyMjIsIDB4MDA3NCwgMHgwMzFBLCAweDNGMjEsIDB4MjYzQiwgMHgwNkVCLAorICAgIDB4MDI1NCwgMHgwNzc0LCAweDAwMjAsIDB4MDA3OCwgMHgwNDEwLCAweDAyRUUsCisgICAgMHgxM0IyLCAweEZBODQsIDB4MDZDMCwgMHgwQTBBLCAweDBFNEUsIDB4MDU5NywKKyAgICAweEZBODUsIDB4RkE4NywgMHgwNTk4LCAweDExRTAsIDB4RkE4NiwgMHgyNjNDLAorICAgIDB4MUZENSwgMHgyMzQzLCAweEZBODMsIDB4M0YyMCwgMHgyMzQyLCAweDAzMEIsCisgICAgMHgyNjNBLCAweDBCODEsIDB4MDU4NiwgMHgwNDBFLCAweDA0MEYsIDB4MjM0NSwKKyAgICAweDIzNDQsIDB4MDJDNiwgMHgwMTMwLCAweDAzMEMsIDB4MDU0RCwgMHgwMUJFLAorICAgIDB4MDEzMiwgMHgwNTk5LCAweDNGMjMsIDB4MDBGQSwgMHgwMTJFLCAweDAzQ0UsCisgICAgMHhGQThCLCAweDI2M0UsIDB4MDJDNywgMHgwMDZBLCAweDA5M0EsIDB4MEU2RSwKKyAgICAweDAxODIsIDB4MDAyMSwgMHgwMEM4LCAweDFBMzMsIDB4N0RBNSwgMHgwRTZGLAorICAgIDB4MUZENiwgMHgxQTM0LCAweDIzNDYsIDB4MjYzRiwgMHgzRjIyLCAweDdEQTQsCisgICAgMHhGQTg4LCAweDdEQTMsIDB4MDMwRCwgMHgwQTBDLCAweEZBODksIDB4MTFFMSwKKyAgICAweDA4OEQsIDB4MDI1NiwgMHgwMzBGLCAweDAzMEUsIDB4MDJGOCwgMHgwMDYwLAorICAgIDB4MDJCOCwgMHhGQThBLCAweDI2M0QsIDB4MDI1NywgMHgxM0JFLCAweDdEQ0QsCisgICAgMHhGQUI0LCAweDBFODMsIDB4MTNCRiwgMHgwMTVCLCAweDI2RjgsIDB4MjZGNywKKyAgICAweDBCODksIDB4MDk0NywgMHgzRjM5LCAweDExRjksIDB4MTNDMCwgMHgyNkY5LAorICAgIDB4MDVBRiwgMHgxMUZDLCAweDExRkEsIDB4MTFGQiwgMHgwRTg0LCAweDExRkUsCisgICAgMHhGQUI1LCAweDExRkQsIDB4MjZGNSwgMHhGQUIyLCAweDIzNUYsIDB4MDVBQywKKyAgICAweDI2RjYsIDB4MDVBRCwgMHg3RENCLCAweDdEQ0EsIDB4MjM2MCwgMHgwOTQ2LAorICAgIDB4N0RDQywgMHhGQUIzLCAweDA1N0EsIDB4MDMxOCwgMHgxMUY4LCAweDA1QUUsCisgICAgMHgyMzYxLCAweDBCODgsIDB4MjZGQiwgMHgxMjAzLCAweDEyMDQsIDB4MEU4NSwKKyAgICAweDBFODYsIDB4MEQ0RiwgMHgwRTg3LCAweDA5NDgsIDB4MEExMCwgMHgxRkUyLAorICAgIDB4MDU3QywgMHgxQTNGLCAweDBENTAsIDB4MDE1RCwgMHgwNTdELCAweDEyMDUsCisgICAgMHgxQTQwLCAweDEzQzIsIDB4MjZGQywgMHgyNkZELCAweDEyMDYsIDB4M0YzQSwKKyAgICAweDFBNDEsIDB4MUZFMSwgMHgwRThFLCAweDI2RkEsIDB4RkFCNiwgMHgxMUZGLAorICAgIDB4MTIwMSwgMHg3RENFLCAweDEyMDAsIDB4MDVCMCwgMHgxM0MxLCAweDA4OUUsCisgICAgMHgwMzE5LCAweDAxNUMsIDB4MDU3QiwgMHgwNzBBLCAweDFBM0UsIDB4MTIwMiwKKyAgICAweDAxMUQsIDB4MDMxQSwgMHg3RENGLCAweDEyMDksIDB4MEU5MCwgMHgwMTVGLAorICAgIDB4MDAyQiwgMHgwNUIxLCAweDBENTQsIDB4MDRFNSwgMHgwMTYwLCAweDA1QjIsCisgICAgMHgxM0M0LCAweDBFODgsIDB4MUZFNSwgMHgxRkU2LCAweDIzNjIsIDB4M0YzQiwKKyAgICAweDEzQzUsIDB4MjZGRiwgMHgwMTYxLCAweDA1N0UsIDB4MDc3OSwgMHgwRDUxLAorICAgIDB4MTNDMywgMHgxQTQyLCAweDA0RTQsIDB4MTIwOCwgMHgxQTQ0LCAweDFGRTMsCisgICAgMHgxMjA3LCAweDFBNDMsIDB4MDIyNSwgMHgyNkZFLCAweDFGRTQsIDB4MDE1RSwKKyAgICAweDBENTMsIDB4MDAyQSwgMHgwRThGLCAweDBENTIsIDB4MDc3OCwgMHgyNzAxLAorICAgIDB4MjM2MywgMHgzRjNFLCAweDFGRTgsIDB4RkFCOCwgMHgxM0M5LCAweDIzNjUsCisgICAgMHgyMzY0LCAweDAzMUIsIDB4MTIwQSwgMHgwRThCLCAweDA1QjgsIDB4MEU4QSwKKyAgICAweDEzQ0EsIDB4M0YzRiwgMHgyNzAyLCAweDFGRTksIDB4MTIwQiwgMHg3REQwLAorICAgIDB4MDk0QSwgMHgyMzY2LCAweEZBQjksIDB4MTNDQiwgMHgxQTQ1LCAweDEzQzcsCisgICAgMHgwNUIzLCAweEZBQjcsIDB4MTNDNiwgMHgzRjNELCAweDA1QjQsIDB4M0YzQywKKyAgICAweDFGRTcsIDB4MDVCNSwgMHgxM0M4LCAweDBFODksIDB4MUE0NiwgMHgxQTQ3LAorICAgIDB4MDVCNiwgMHgwNUI3LCAweDI3MDAsIDB4MDk0OSwgMHgwMTIyLCAweDA1QjksCisgICAgMHgyNzA0LCAweDAzMUQsIDB4MDQ2OSwgMHgwOTRDLCAweEZBQkEsIDB4MTIwRiwKKyAgICAweDFBNDgsIDB4MDYzOCwgMHgxMjEwLCAweDEzQ0MsIDB4MDFCMywgMHgzRjQyLAorICAgIDB4MUE0OSwgMHhGQUJCLCAweDNGNDEsIDB4MEU4QywgMHgxQTRBLCAweDIzNjcsCisgICAgMHgzRjQzLCAweDA5NEQsIDB4MjcwMywgMHgwOTRCLCAweDdERDEsIDB4M0Y0MCwKKyAgICAweDAzMUMsIDB4MDIyNiwgMHgxRkVBLCAweDdERDIsIDB4MTIwQywgMHgwM0RBLAorICAgIDB4MEI4QSwgMHgxMjBELCAweDAwMkMsIDB4MDNDQywgMHgwNEU2LCAweDdERDMsCisgICAgMHgxMjBFLCAweDA4OUYsIDB4MDRFMiwgMHgwNTlGLCAweEZBQUQsIDB4MDExNywKKyAgICAweDAxMzcsIDB4MDYxMywgMHgyMzVDLCAweDNGMzEsIDB4MDg5OSwgMHgwMkVGLAorICAgIDB4MDAyNSwgMHgwOTQyLCAweDA0NjgsIDB4MEU4QywgMHgwQTBGLCAweDEzQkEsCisgICAgMHg3REJFLCAweDEzQjksIDB4MDVBMCwgMHg3REMwLCAweDI2RUIsIDB4N0RCRiwKKyAgICAweDIzNUEsIDB4MjM1QiwgMHgwMzcyLCAweDAzMTMsIDB4MDk0MSwgMHgwODk4LAorICAgIDB4MjZFOSwgMHgwNTc0LCAweDAyQzksIDB4MDUxRSwgMHgwMDI0LCAweDFGREIsCisgICAgMHgwNDY3LCAweDA3OTEsIDB4MDRFMSwgMHgyNkVBLCAweEZBQUMsIDB4MDRFMCwKKyAgICAweDNGMzQsIDB4MEU1RCwgMHgyNkVELCAweEZBQUUsIDB4MUZEQywgMHgwNTc1LAorICAgIDB4MDMxNCwgMHg3REM0LCAweDFGREQsIDB4MUZERSwgMHgwNUExLCAweDBFNUUsCisgICAgMHgyNkVFLCAweDI2RUYsIDB4N0RDNSwgMHgxMUVFLCAweEZBQUYsIDB4M0YzNSwKKyAgICAweDExRUYsIDB4MjZGMCwgMHg3REM2LCAweEZBQjAsIDB4MDVBMiwgMHg3REMxLAorICAgIDB4MEU1QywgMHg3REMyLCAweDAwQ0EsIDB4MDFCMCwgMHgyMzVELCAweDNGMzIsCisgICAgMHgwNzVFLCAweDBCODIsIDB4MDE1NSwgMHgwMTU2LCAweDNGMzMsIDB4MjZFQywKKyAgICAweDA3MDgsIDB4MEI4MywgMHgxQTNCLCAweDdEQzMsIDB4MUEzQSwgMHgwODlCLAorICAgIDB4MTFGMiwgMHgwNUE1LCAweDBFNUYsIDB4MDAyNywgMHgwMUIyLCAweDA4OUMsCisgICAgMHgyNkYzLCAweDBCODUsIDB4MDE1NywgMHgwMTFDLCAweDA5NDQsIDB4MDU3NywKKyAgICAweDdEQzgsIDB4MTNCQiwgMHgwODlELCAweDA1QTYsIDB4MDMxNSwgMHgwRThELAorICAgIDB4RkFCMSwgMHgxQTNDLCAweDAzQUMsIDB4MDU3NiwgMHg3REM3LCAweDBCODQsCisgICAgMHgwNUEzLCAweDI2RjEsIDB4MjZGMiwgMHgwNUE0LCAweDAyMjQsIDB4MDk0MywKKyAgICAweDBENEMsIDB4MTFGMCwgMHgxRkRGLCAweDA4OUEsIDB4MDJGMCwgMHgwRDRELAorICAgIDB4MDAyNiwgMHgxMUYxLCAweDA3NzcsIDB4MEU4MiwgMHgwMDI5LCAweDA1QTgsCisgICAgMHgxQTNELCAweDAwMjgsIDB4MDBDQiwgMHgwMTU5LCAweDExRjYsIDB4MDcwOSwKKyAgICAweDA2MTQsIDB4MDRFMywgMHgwMTVBLCAweDA1NzgsIDB4MEI4NywgMHgxRkUwLAorICAgIDB4MDVBQSwgMHg3REM5LCAweDA1QTksIDB4MDVBQiwgMHgwNTc5LCAweDExRjcsCisgICAgMHgzRjM4LCAweDA5NDUsIDB4MTNCQywgMHgyNkY0LCAweDIzNUUsIDB4M0YzNiwKKyAgICAweDAxNTgsIDB4MDVBNywgMHgzRjM3LCAweDBFODAsIDB4MTFGMywgMHgxM0JELAorICAgIDB4MEI4NiwgMHgwRTgxLCAweDAzMTYsIDB4MDMxNywgMHgwRDRFLCAweDExRjUsCisgICAgMHgxMUY0LCAweDA3NUYsIDB4MDZDMywgMHgwOEE2LCAweDBCOEQsIDB4MDU4NCwKKyAgICAweDAyMkEsIDB4MDJDQSwgMHgxM0Q1LCAweDBFOTMsIDB4MDIxNywgMHgwMTFGLAorICAgIDB4MDEyNCwgMHgwMTIwLCAweDBCOEUsIDB4MDZDNCwgMHgwMzI2LCAweDAzMjcsCisgICAgMHgwNUJDLCAweDBCOEYsIDB4RkFDMSwgMHgwOTU1LCAweDEyMTcsIDB4N0REOSwKKyAgICAweDAzMjgsIDB4MDMyMywgMHgwMzI0LCAweDIzNjksIDB4N0REOCwgMHgwMDMxLAorICAgIDB4MUZGMywgMHgxMjE2LCAweEZBQzAsIDB4MTIxNSwgMHgwMDMyLCAweDAwQ0QsCisgICAgMHgwM0FGLCAweDBBMTIsIDB4MDFCQywgMHgwMDcwLCAweDAzMjUsIDB4MEU5MiwKKyAgICAweDAzOEUsIDB4MDJENywgMHgyNzA4LCAweDEzRDcsIDB4MDI5NiwgMHgwMzlBLAorICAgIDB4MDBGRSwgMHgwNzBELCAweDAxRUQsIDB4MDJEOCwgMHgwMzk4LCAweDA3N0UsCisgICAgMHgwMTY3LCAweDAyNDQsIDB4MDMyOSwgMHgwMUJELCAweDA1MjEsIDB4MDIyQiwKKyAgICAweDFBNTAsIDB4MDEyMiwgMHgwOEE5LCAweDBBMTMsIDB4MDVERCwgMHgwNzBDLAorICAgIDB4MDRFOSwgMHgwMDMzLCAweDAxMjEsIDB4MTNENiwgMHgwOTU2LCAweDA4QTcsCisgICAgMHgwNTg1LCAweDAxNjYsIDB4MDIwNCwgMHgwOEE4LCAweDA1ODYsIDB4MDRBMCwKKyAgICAweDAyQ0IsIDB4MDAzRCwgMHgwNTg4LCAweDAyODksIDB4MDNDMiwgMHgwM0I4LAorICAgIDB4MDc3RiwgMHgwNTg3LCAweDA0RUIsIDB4MDBDRiwgMHgwMUEzLCAweDEzRDksCisgICAgMHgwNjE3LCAweDAxQTIsIDB4MDZDNSwgMHgwNTIyLCAweDAzQjksIDB4MDcwRSwKKyAgICAweDA3NjIsIDB4MDhBQSwgMHgxQTUxLCAweDAxNjksIDB4MDNCQSwgMHgxMjE4LAorICAgIDB4MDUyMywgMHgwNEVDLCAweDNGNDksIDB4MEU5NiwgMHgwNEVBLCAweDAyQ0EsCisgICAgMHgwRDU5LCAweDEzRDgsIDB4MDNEMiwgMHgwRTk1LCAweDA5NTcsIDB4MEU5NCwKKyAgICAweDAxNjgsIDB4MDEyMywgMHgwMzFFLCAweDA0MTIsIDB4MDMyQSwgMHgwMENFLAorICAgIDB4MDM5QywgMHgwRTk1LCAweDBENUEsIDB4MDA3MSwgMHgxM0RDLCAweDdEREEsCisgICAgMHgyMzZDLCAweDBFOTYsIDB4MTNERCwgMHgwMzJDLCAweDFBNTIsIDB4MEI5MCwKKyAgICAweDA1ODksIDB4MDMyRCwgMHgyNzA5LCAweDFGRjYsIDB4MDU4QSwgMHgxMjE5LAorICAgIDB4MDVCRCwgMHgwNThCLCAweDAwMzUsIDB4MjcwQSwgMHgwNURFLCAweDA5NUEsCisgICAgMHgxQTUzLCAweDAxNkIsIDB4MDIyQywgMHgwNzBGLCAweDEzREEsIDB4MDk1OCwKKyAgICAweDNGNEEsIDB4MDU4OCwgMHgwRDVCLCAweDEzREIsIDB4MjM2QSwgMHgwNzgwLAorICAgIDB4M0Y0QiwgMHgxRkY0LCAweDA5NTksIDB4MDAzNCwgMHgwMTZBLCAweDIzNkIsCisgICAgMHgxRkY1LCAweDAzMkIsIDB4MjcwQiwgMHgwMkYzLCAweEZBQzQsIDB4N0REQywKKyAgICAweDFGRjcsIDB4MDEyNCwgMHgwOTVDLCAweDAxNkMsIDB4MDA3MiwgMHgwMTZBLAorICAgIDB4MDRFRSwgMHgyNzBELCAweDI3MEMsIDB4MDIyRCwgMHgwNEExLCAweDI3MEUsCisgICAgMHgwRTk3LCAweDA2MTgsIDB4RkFDNSwgMHgwRTk4LCAweDNGNEMsIDB4MjM2RSwKKyAgICAweDFBNTQsIDB4MDVCRiwgMHgwMzJFLCAweDEyMUEsIDB4RkFDMiwgMHgwNUJFLAorICAgIDB4MDFFRSwgMHgwNEVELCAweDIzNkQsIDB4MDNCQiwgMHgwMTI1LCAweDAwRUMsCisgICAgMHg3RERCLCAweEZBQzMsIDB4MDVERiwgMHgwMEM5LCAweDA4QUIsIDB4MDk1QiwKKyAgICAweDAxM0MsIDB4MDFGRSwgMHgwQjhCLCAweEZBQkQsIDB4N0RENCwgMHgwNjE1LAorICAgIDB4MDFFQSwgMHgwRTkxLCAweDA1N0YsIDB4MDE2RSwgMHgwMTU2LCAweDA4QTEsCisgICAgMHgwOTRFLCAweDdERDUsIDB4MDNEMSwgMHgwMUI2LCAweDFGRUMsIDB4MUZFQiwKKyAgICAweEZBQkUsIDB4N0RENiwgMHgxMjEyLCAweDdERDcsIDB4RkFCRiwgMHgxQTRDLAorICAgIDB4MEU4RCwgMHgzRjQ0LCAweEZBQkMsIDB4MDAyRCwgMHgwMDZBLCAweDAxQjUsCisgICAgMHgxM0NELCAweDA4QTAsIDB4MDFCNCwgMHgwM0QwLCAweDAwNkIsIDB4MTIxMSwKKyAgICAweDNGNDUsIDB4MDIyNywgMHgwMkZFLCAweDA3N0EsIDB4MUE0QiwgMHgwMTRBLAorICAgIDB4MEU5MSwgMHgxRkVELCAweDI3MDUsIDB4MDE2MiwgMHgwOTRGLCAweDAwMkUsCisgICAgMHgwNEU4LCAweDFGRUUsIDB4MEExMSwgMHgwOTUwLCAweDA1ODEsIDB4MUZFRiwKKyAgICAweDFGRjAsIDB4MjcwNiwgMHgzRjQ3LCAweDFBNEYsIDB4MDU4MiwgMHgwNUJBLAorICAgIDB4MDAyRiwgMHgwMzFFLCAweDEzQ0YsIDB4MDc2MCwgMHgwNTgwLCAweDBFOTIsCisgICAgMHgwMzFELCAweDA0RTcsIDB4MUE0RCwgMHgxQTRFLCAweDBFOEUsIDB4MDFCNywKKyAgICAweDAyRjEsIDB4MDJGMiwgMHgzRjQ2LCAweDBFOEYsIDB4MDYxNiwgMHgwRDU1LAorICAgIDB4MDA2QywgMHgwRTkzLCAweDBFOTAsIDB4MTNDRSwgMHgwNDlFLCAweDA0MTEsCisgICAgMHgxM0QwLCAweDA4QTIsIDB4MDNBRCwgMHgwMkQzLCAweDAyMjgsIDB4MTNEMSwKKyAgICAweDAwNkQsIDB4MDA2RCwgMHgwNzkyLCAweDAxQjgsIDB4MDc3QywgMHgwMjI5LAorICAgIDB4MDMyMCwgMHgxRkYxLCAweDNGNDgsIDB4MEQ1NiwgMHgxM0QyLCAweDAxQjksCisgICAgMHgyNzA3LCAweDIzNjgsIDB4MEQ1NywgMHgwMENDLCAweDA1MjAsIDB4MTIxMywKKyAgICAweDAxNjMsIDB4MDUxRiwgMHgwOTUxLCAweDEyMTQsIDB4MEU5NCwgMHgwMTY0LAorICAgIDB4MDBGQywgMHgwNzBCLCAweDA3N0IsIDB4MDc2MSwgMHgwMEM2LCAweDAxN0EsCisgICAgMHgwMzFGLCAweDA1ODMsIDB4MDFFRSwgMHgwMEQ0LCAweDAxNjUsIDB4MDk1MiwKKyAgICAweDAyQzgsIDB4MDBDOCwgMHgwMjNBLCAweDAwMzAsIDB4MDFFQywgMHgwMEZELAorICAgIDB4MDJGOSwgMHgwMUJCLCAweDA5NTMsIDB4MDFBMCwgMHgxM0Q0LCAweDA4QTUsCisgICAgMHgwMDMwLCAweDA4QTQsIDB4MDc3RCwgMHgwMDZFLCAweDBENTgsIDB4MDk1NCwKKyAgICAweDA1REMsIDB4MDEyMywgMHgwMzIxLCAweDAxQkEsIDB4MDI4OCwgMHgwNUJCLAorICAgIDB4MTNEMywgMHgwMzIyLCAweDAzQUUsIDB4MEI4QywgMHgwNDlGLCAweDFGRjIsCisgICAgMHgwOEEzLCAweDAwNkUsIDB4MDJENiwgMHgwMDZGLCAweDAxMUUsIDB4MDM3MywKKyAgICAweDAzQkYsIDB4MDFFQSwgMHgwOEFGLCAweDA1OTUsIDB4MDEwMCwgMHgwMTEyLAorICAgIDB4MDA1MCwgMHgwMkI5LCAweDAxNEMsIDB4MDFBNCwgMHgwMjU4LCAweDA0RjIsCisgICAgMHgwNTk2LCAweDAwQTQsIDB4MTNFMSwgMHgwMTI0LCAweDA4QjAsIDB4MDRGMywKKyAgICAweDAxNzEsIDB4MDQxMywgMHgyNzEzLCAweDBFOUIsIDB4MDQ2QywgMHgwMEEyLAorICAgIDB4MDc2NSwgMHgwNUUwLCAweDAxOUMsIDB4MDk2NCwgMHgwMzM1LCAweDA2MUMsCisgICAgMHgzRjRGLCAweDBFOUEsIDB4MDA5QSwgMHgwMTcwLCAweDA3ODQsIDB4MDAzRSwKKyAgICAweDAxMkYsIDB4MDFBMywgMHgwMjNELCAweDAxRjAsIDB4MDE2QiwgMHgwMEEzLAorICAgIDB4MDIzRiwgMHgwM0M0LCAweDAzRDQsIDB4MDM3NywgMHgwMDUyLCAweDAxQkUsCisgICAgMHgwMDMxLCAweDAwMTIsIDB4MDE1NywgMHgwMjFBLCAweDAyNDIsIDB4MDM5RSwKKyAgICAweDA0QTIsIDB4MDVFMSwgMHgwMkY2LCAweDFBNUQsIDB4MDMzNiwgMHgwMTI2LAorICAgIDB4MDVFMiwgMHgyMzc0LCAweDA1QzQsIDB4MDQ2RCwgMHgwMzExLCAweDAxQTUsCisgICAgMHgwNEY0LCAweEZBQzgsIDB4MDIzRSwgMHgwQTE3LCAweDBENUYsIDB4MDVDMywKKyAgICAweDA4QjEsIDB4MDA5QywgMHgwMkNELCAweDAyOTksIDB4MDM2QSwgMHgwMzc2LAorICAgIDB4MDA2QywgMHgwMDM3LCAweDA3ODUsIDB4MDA3NiwgMHgwMDQwLCAweDA5NjUsCisgICAgMHgxM0UyLCAweDAyQ0MsIDB4MDI1OSwgMHgwNDE0LCAweDA2QzYsIDB4MDFBNiwKKyAgICAweDAzM0YsIDB4MDMzNCwgMHgwRTlDLCAweDA3ODYsIDB4MDEyNywgMHgwOTY2LAorICAgIDB4MDZDNywgMHgwNjNCLCAweDAwMzksIDB4MDE3MiwgMHgwMzc0LCAweDAwM0EsCisgICAgMHgwNTk3LCAweDAxMjgsIDB4MDBGRiwgMHgwNTI2LCAweDIzNzUsIDB4MDA0NCwKKyAgICAweDAzMzcsIDB4MEI5NSwgMHgwMjMwLCAweDdEREUsIDB4MEQ2MCwgMHgwMTg1LAorICAgIDB4MEQ2MSwgMHgwMDM4LCAweDAzMjEsIDB4MDAzRiwgMHgwMDlELCAweDAxMDEsCisgICAgMHgwM0I5LCAweDAzMTIsIDB4MDk2OSwgMHgxQTVFLCAweDEyMjAsIDB4MjcxNCwKKyAgICAweDAwM0IsIDB4MDU5OCwgMHgyNzE1LCAweDFGRkIsIDB4MDhCMiwgMHgwOTZBLAorICAgIDB4MEVBMSwgMHg3RERGLCAweDFGRkMsIDB4MEExOCwgMHgxQTVGLCAweDEyMjIsCisgICAgMHgxMjIxLCAweDAxNzMsIDB4MDc5MywgMHgwNjFELCAweDA5NkIsIDB4N0RFMCwKKyAgICAweDA3ODcsIDB4MDIzMSwgMHgwNzExLCAweDBFQTAsIDB4RkFDOSwgMHgxMjFELAorICAgIDB4MDVDNSwgMHgxMjFGLCAweDEyMUUsIDB4M0Y1MCwgMHgwRTlELCAweDAzMzgsCisgICAgMHgwOTY4LCAweDA5NjcsIDB4MDRGNSwgMHgwQjk2LCAweDA1QzcsIDB4MDVDNiwKKyAgICAweDAzQkUsIDB4MDFCOCwgMHgxMjI1LCAweDEyMjQsIDB4MDJDRSwgMHgwMTYwLAorICAgIDB4MDEwMiwgMHhGQUNELCAweDNGNTEsIDB4MDMyMiwgMHhGQUNFLCAweDAzMzksCisgICAgMHgwNTlBLCAweDAxOUUsIDB4MDYzQywgMHgwMUJGLCAweDdERTIsIDB4M0Y1MiwKKyAgICAweDBENjIsIDB4MjcxOCwgMHgzRjUzLCAweDI3MTcsIDB4MEVBMiwgMHgwNTk5LAorICAgIDB4MTNFMywgMHhGQUNBLCAweEZBQ0IsIDB4MDZDOCwgMHgwNkM5LCAweEZBQ0MsCisgICAgMHg3REUxLCAweDAxMjUsIDB4MDFCQywgMHgxM0U0LCAweDEyMjMsIDB4MDMzNiwKKyAgICAweDAyQkEsIDB4MDI4QiwgMHgyNzE2LCAweDIzNzYsIDB4MDJDRCwgMHgwMTNELAorICAgIDB4MDk1RSwgMHgwNUMwLCAweDAwMTYsIDB4MDE2RiwgMHgwNTI1LCAweDIzNzEsCisgICAgMHgyMzcwLCAweDAyMDUsIDB4MDFDOCwgMHgwNThDLCAweDBCOTEsIDB4MDBFNiwKKyAgICAweDA2MzksIDB4MDMzMCwgMHgyMzcyLCAweDNGNEQsIDB4MDc2MywgMHgwMTZFLAorICAgIDB4MTIxQiwgMHgxRkY5LCAweDA1OEQsIDB4MDE2RCwgMHgxQTU1LCAweDI3MEYsCisgICAgMHgxM0RFLCAweEZBQzYsIDB4MUZGOCwgMHgyMzZGLCAweDFBNTYsIDB4MDRFRiwKKyAgICAweDAyOTgsIDB4MEU5OSwgMHgwOTVELCAweDAxQkUsIDB4MDJDQywgMHgwNTI0LAorICAgIDB4MDMyRiwgMHg3RERELCAweDA1ODksIDB4MDk1RiwgMHgwM0JDLCAweDFBNTksCisgICAgMHgwRTlBLCAweDBFOUIsIDB4MDYxQSwgMHgxM0UwLCAweDBFOUMsIDB4MDhBRCwKKyAgICAweDAzMzIsIDB4MEExNSwgMHgwNTkxLCAweDBENUQsIDB4MDU5MCwgMHgwOTYwLAorICAgIDB4MjM3MywgMHgyNzExLCAweDFBNUEsIDB4MDU4QSwgMHgwMDZGLCAweDNGNEUsCisgICAgMHgyNzEyLCAweDA3NjQsIDB4MDhBQywgMHgwNUMxLCAweEZBQzcsIDB4MDMzMSwKKyAgICAweDFGRkEsIDB4MTNERiwgMHgyNzEwLCAweDFBNTcsIDB4MEU5NywgMHgwNThFLAorICAgIDB4MDYxOSwgMHgwQTE0LCAweDFBNTgsIDB4MEQ1QywgMHgwNzgyLCAweDA1OEYsCisgICAgMHgxMjFDLCAweDA3ODEsIDB4MDIxMCwgMHgwNTk0LCAweDA5NjIsIDB4MDA4MCwKKyAgICAweDAzOTksIDB4MDNDMywgMHgwMkY1LCAweDAxODQsIDB4MDI4QSwgMHgwNDZCLAorICAgIDB4MDk2MywgMHgwQjkyLCAweDAxMDAsIDB4MUE1QiwgMHgwQTE2LCAweDBFOUQsCisgICAgMHgwM0JELCAweDBCOTMsIDB4MDFBNCwgMHgwMzMzLCAweDA3ODMsIDB4MDMzRSwKKyAgICAweDAwRkUsIDB4MDU5MiwgMHgwMzFGLCAweDA0NkEsIDB4MDU5MywgMHgwOTYxLAorICAgIDB4MDRGMCwgMHgwMEZGLCAweDAyRjQsIDB4MDA3MywgMHgwRTk4LCAweDA0RjEsCisgICAgMHgwMzNELCAweDAyNjYsIDB4MDJGRiwgMHgwM0QzLCAweDAzMjAsIDB4MDIwNiwKKyAgICAweDAwNEUsIDB4MDIzQywgMHgwMUVGLCAweDAyMTEsIDB4MDAyNywgMHgwMDBDLAorICAgIDB4MDYzQSwgMHgwOEFFLCAweDAwOEMsIDB4MDNDRSwgMHgwMkQ5LCAweDAyRkEsCisgICAgMHgwMUEyLCAweDAxQTUsIDB4MDYxQiwgMHgwRTlFLCAweDA1QzIsIDB4MDIyRiwKKyAgICAweDAzOUQsIDB4MDFGMCwgMHgxQTVDLCAweDBFOUYsIDB4MDJDQiwgMHgwM0I4LAorICAgIDB4MDE0QiwgMHgwQjk0LCAweDBFOTksIDB4MDEzRSwgMHgwMTZGLCAweDAwMzYsCisgICAgMHgwMzM0LCAweDBENUUsIDB4MDMxMCwgMHgwMjA3LCAweDAwNDQsIDB4MDE3QiwKKyAgICAweDAwREYsIDB4MDA0MiwgMHgwMjJFLCAweDA3MTAsIDB4MDA3RSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9uMmF2Y19jYjhfYml0c1tPTjJBVkNfQ0I4X0NPREVTXSA9IHsKKyAgICAxMSwgMTEsIDE2LCAxNSwgMTEsICA5LAorICAgIDEzLCAxMiwgIDksIDExLCAxMSwgMTQsCisgICAgMTMsIDEyLCAxMywgMTQsIDE0LCAxMywKKyAgICAxMCwgMTEsIDE1LCAxNSwgMTAsIDE2LAorICAgIDE2LCAxNSwgMTYsIDExLCAxMywgMTMsCisgICAgMTYsIDEzLCAxMSwgMTEsIDE1LCAxMywKKyAgICAxMSwgIDksIDEzLCAxMywgMTAsICA5LAorICAgIDE2LCAxMywgIDksIDEwLCAxMCwgMTUsCisgICAgMTAsIDEwLCAxMCwgMTIsIDE0LCAxMSwKKyAgICAxNCwgMTIsIDE0LCAxMSwgMTIsIDExLAorICAgIDEyLCAxNCwgMTAsIDEwLCAxMSwgMTYsCisgICAgMTAsIDEzLCAxNCwgMTQsIDExLCAxMywKKyAgICAxMSwgMTMsIDEyLCAxMCwgMTAsIDEwLAorICAgIDE1LCAxMCwgMTAsIDEyLCAxMiwgMTIsCisgICAgMTUsIDEyLCAxMSwgMTIsIDEzLCAxMCwKKyAgICAxMSwgMTEsIDEyLCAxMywgMTEsIDEzLAorICAgIDEyLCAxNSwgMTMsIDExLCAxMSwgMTIsCisgICAgMTQsIDExLCAxMSwgMTEsIDEzLCAxNCwKKyAgICAxMSwgMTMsIDE0LCAxMywgMTIsIDEyLAorICAgIDEyLCAxMSwgMTQsIDEyLCAxMCwgMTMsCisgICAgMTQsIDExLCAxMywgMTUsIDE0LCAxNCwKKyAgICAxMywgMTMsIDE0LCAxMywgMTMsIDEzLAorICAgIDE1LCAxNCwgMTIsIDE0LCAxNCwgMTQsCisgICAgMTYsIDE0LCAxMiwgMTIsIDE2LCAxNiwKKyAgICAxMiwgMTMsIDEyLCAxNCwgMTQsIDEzLAorICAgIDEzLCAxNiwgMTQsIDEzLCAxNCwgMTMsCisgICAgMTMsIDEzLCAxMywgMTUsIDE0LCAxMywKKyAgICAxMCwgMTIsIDE2LCAxNiwgMTIsIDEwLAorICAgIDEzLCAxNCwgMTEsIDExLCAxMiwgMTQsCisgICAgMTQsIDExLCAxMiwgMTYsIDEzLCAxMiwKKyAgICAxNCwgMTQsIDE0LCAxNiwgMTUsIDE2LAorICAgIDE1LCAxNiwgMTUsIDE0LCAxMiwgMTQsCisgICAgMTMsIDExLCAxMCwgMTEsIDE0LCAxNCwKKyAgICAxMSwgIDksIDE0LCAxNCwgMTAsIDE2LAorICAgIDEyLCAxNSwgMTYsIDEyLCAxMSwgMTQsCisgICAgMTMsICA5LCAxMSwgMTEsIDE1LCAxNSwKKyAgICAxMiwgMTMsIDE0LCAxNSwgMTIsIDE2LAorICAgIDE0LCAxNSwgMTUsIDEzLCAxNCwgMTQsCisgICAgMTUsIDE0LCAxNCwgMTQsIDEzLCAxNSwKKyAgICAxMiwgMTQsIDEyLCAxNSwgMTUsIDEyLAorICAgIDExLCAxMywgMTUsIDEwLCAxNCwgMTMsCisgICAgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTIsIDEzLCAxMywgMTIsIDE0LAorICAgIDE0LCAxNiwgMTIsIDE0LCAxMSwgMTMsCisgICAgMTMsIDEyLCAxNCwgMTUsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxNCwgMTMsIDEzLAorICAgIDEzLCAxNCwgMTMsIDEzLCAxMiwgMTQsCisgICAgMTQsIDEzLCAxMSwgMTIsIDEzLCAxMiwKKyAgICAxMiwgMTAsIDEzLCAxMywgMTEsIDExLAorICAgIDEyLCAxNCwgMTEsIDEyLCAxMywgMTUsCisgICAgMTQsIDE0LCAxNiwgMTEsIDEzLCAxMywKKyAgICAxMSwgMTUsIDEwLCAxNCwgMTMsIDEyLAorICAgIDEyLCAxMywgMTIsIDEzLCAxMSwgMTEsCisgICAgMTEsIDEyLCAxMSwgMTAsIDEyLCAxMywKKyAgICAxMCwgMTAsIDEzLCAxMywgMTAsIDEwLAorICAgIDEwLCAxMCwgMTUsIDExLCAxMSwgMTMsCisgICAgMTIsIDExLCAxMywgMTIsIDExLCAxNiwKKyAgICAxNCwgMTAsIDE0LCAxMSwgMTAsIDEwLAorICAgIDE1LCAxMiwgMTEsIDEzLCAxMiwgMTEsCisgICAgMTQsIDEzLCAxMSwgMTMsIDExLCAxMCwKKyAgICAgOSwgMTAsIDEwLCAxNCwgMTAsICA5LAorICAgIDE0LCAxMywgIDksICA5LCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTIsIDE0LCAxMCwKKyAgICAxNCwgMTMsIDEyLCAxMSwgMTQsIDEzLAorICAgIDExLCAxMywgIDksIDExLCAxMywgMTMsCisgICAgMTEsIDE0LCAxNCwgMTIsIDEyLCAxMywKKyAgICAxMCwgMTIsIDEyLCAxMCwgIDksIDEwLAorICAgIDEwLCAxMCwgMTAsICA5LCAxMCwgMTAsCisgICAgMTEsIDEwLCAgOCwgMTIsIDEyLCAgOSwKKyAgICAxMSwgMTAsIDEwLCAxMSwgMTEsIDEyLAorICAgIDEyLCAxNCwgMTIsIDEwLCAxNCwgMTMsCisgICAgMTYsIDEwLCAxMCwgMTEsIDE2LCAxNCwKKyAgICAxMSwgMTIsIDE0LCAxMiwgMTIsIDEwLAorICAgIDExLCAxMCwgMTAsIDExLCAgOSwgMTEsCisgICAgMTEsICA5LCAxMSwgMTIsIDEzLCAxMCwKKyAgICAxMCwgMTEsIDExLCAxMSwgMTEsIDEwLAorICAgIDEzLCAxMywgMTAsIDEzLCAxMSwgMTEsCisgICAgMTEsIDEyLCAxMSwgMTEsIDExLCAxMCwKKyAgICAxMCwgMTIsIDEyLCAxMCwgMTQsIDEyLAorICAgIDExLCAxMiwgMTIsIDExLCAxMiwgMTIsCisgICAgMTEsIDEwLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxNCwgMTMsIDEzLCAxMywgMTMsIDEyLAorICAgIDEzLCAxMywgMTIsIDEyLCAxMiwgMTMsCisgICAgMTMsIDEyLCAxMywgMTMsIDE0LCAxNCwKKyAgICAxMywgMTIsIDEzLCAxNSwgMTQsIDEyLAorICAgIDEzLCAxNiwgMTQsIDEyLCAxNCwgMTQsCisgICAgMTQsIDEzLCAxMywgMTIsIDEzLCAxMywKKyAgICAxMiwgMTIsIDE0LCAxMywgMTIsIDEwLAorICAgIDEzLCAxNCwgMTQsIDEwLCAxMSwgMTQsCisgICAgMTQsIDExLCAxMCwgMTMsIDEzLCAxMSwKKyAgICAxMiwgMTIsIDE0LCAxNCwgMTQsIDEzLAorICAgIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTMsCisgICAgMTIsIDExLCAxMiwgMTUsIDE0LCAxMiwKKyAgICAgOSwgMTIsIDEzLCAxMCwgIDksIDExLAorICAgIDEzLCAxNCwgMTEsIDEwLCAxMywgMTUsCisgICAgMTQsIDEwLCAxMSwgMTMsIDE0LCAxMSwKKyAgICAxMSwgMTIsIDEyLCAxMCwgMTIsIDEyLAorICAgIDE1LCAxNSwgMTIsIDE0LCAxNCwgMTQsCisgICAgMTMsIDEzLCAxNCwgMTQsIDE0LCAxMSwKKyAgICAxMiwgMTQsIDE1LCAxMiwgMTAsIDEyLAorICAgIDEzLCAgOSwgIDksIDExLCAxNCwgMTUsCisgICAgMTEsIDE0LCAxMywgMTMsIDEzLCAxNSwKKyAgICAxMywgMTMsIDE0LCAxMiwgMTQsIDEzLAorICAgIDEzLCAxMywgMTIsIDEzLCAxNCwgMTQsCisgICAgMTMsIDExLCAxMSwgMTUsIDEzLCAxMSwKKyAgICAxMiwgMTMsIDE1LCAxMiwgMTIsIDEzLAorICAgIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMiwgMTMsIDE0LCAxMywKKyAgICAxMCwgMTQsIDEzLCAxMSwgMTAsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsCisgICAgMTEsIDEyLCAxMywgMTIsIDExLCAxMywKKyAgICAxMCwgMTIsIDExLCAxMCwgMTEsIDEzLAorICAgIDEyLCAxMCwgMTIsIDEyLCAxMiwgMTEsCisgICAgMTIsIDEwLCAxMiwgMTIsIDEwLCAxMCwKKyAgICAxMSwgMTEsIDExLCAxMSwgIDksIDEwLAorICAgIDExLCAxMCwgMTAsICA5LCAxMiwgMTIsCisgICAgIDksIDExLCAxMSwgMTAsICA5LCAxMCwKKyAgICAxMywgMTQsIDEzLCAxMiwgMTAsIDEwLAorICAgIDE0LCAxNCwgMTAsIDExLCAxMSwgMTMsCisgICAgMTMsIDExLCAxMywgMTMsIDEyLCAxMSwKKyAgICAxMCwgMTEsIDExLCAxMCwgMTAsICA5LAorICAgIDEyLCAxMiwgIDksIDExLCAxMiwgMTMsCisgICAgMTIsIDEyLCAxMSwgMTIsIDEzLCAxMSwKKyAgICAxMSwgMTIsIDEyLCAxMiwgMTIsIDEzLAorICAgIDE1LCAxNCwgMTQsIDEzLCAxMiwgMTYsCisgICAgMTQsIDEyLCAxMSwgMTIsIDE2LCAxNSwKKyAgICAxMiwgMTMsIDE1LCAxMywgMTMsIDEyLAorICAgIDEyLCAxMiwgMTIsIDExLCAxMCwgMTMsCisgICAgMTMsIDEwLCAxMCwgMTIsIDEzLCAxMCwKKyAgICAxMCwgMTAsIDExLCAxMSwgMTEsIDExLAorICAgIDEyLCAxMiwgMTEsIDEzLCAxMiwgMTIsCisgICAgMTMsIDEzLCAxMSwgMTIsIDEzLCAxMSwKKyAgICAxMSwgMTIsIDEyLCAxMSwgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEwLCAxNCwgMTEsCisgICAgMTEsIDEwLCAxMSwgMTEsIDExLCAxMCwKKyAgICAxMSwgMTIsIDEzLCAxMiwgMTEsIDEwLAorICAgIDEyLCAxMiwgMTAsIDExLCAxMCwgMTEsCisgICAgMTIsIDExLCAxMywgMTIsIDE0LCAxMywKKyAgICAxMSwgMTIsIDEzLCAxNCwgMTIsIDExLAorICAgIDExLCAxNCwgMTQsIDEyLCAxMiwgMTMsCisgICAgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMSwgMTAsIDEyLCAxMiwgMTAsIDEzLAorICAgIDE0LCAxMywgMTIsIDEyLCAxMywgMTMsCisgICAgMTMsIDEyLCAxMiwgMTQsIDEzLCAxMiwKKyAgICAxNCwgMTIsIDExLCAxNCwgMTMsIDExLAorICAgIDExLCAxMywgMTIsIDExLCAxMywgMTQsCisgICAgMTIsIDE0LCAxNCwgMTQsIDEzLCAxNCwKKyAgICAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMiwgMTMsIDEwLCAxMiwgMTQsCisgICAgMTUsIDEzLCAxMCwgMTMsIDEyLCAxMSwKKyAgICAxMSwgMTIsIDEzLCAxMywgMTEsIDExLAorICAgIDEyLCAxMywgMTIsIDE2LCAxMSwgMTMsCisgICAgMTYsIDE0LCAxNiwgMTUsIDE1LCAxNiwKKyAgICAxMywgMTEsIDE0LCAxMywgMTIsIDExLAorICAgIDExLCAxNSwgMTMsIDExLCAgOSwgMTMsCisgICAgMTQsIDExLCAxMCwgMTIsIDE1LCAxNCwKKyAgICAxMiwgMTEsIDEzLCAxMywgMTAsIDExLAorICAgIDExLCAxNCwgMTQsIDExLCAxMiwgMTMsCisgICAgMTMsIDExLCAxMywgMTIsIDE0LCAxNiwKKyAgICAxMiwgMTYsIDEzLCAxNSwgMTUsIDEzLAorICAgIDEyLCAxMywgMTQsIDE0LCAxMCwgMTEsCisgICAgMTQsIDE0LCAxMSwgMTAsIDEzLCAxMywKKyAgICAgOSwgMTIsIDE0LCAxNiwgMTIsIDEzLAorICAgIDEzLCAxMiwgMTMsIDEzLCAxMiwgMTQsCisgICAgMTQsIDEzLCAxNCwgMTQsIDE1LCAxNCwKKyAgICAxMywgMTIsIDEzLCAxMSwgMTEsIDExLAorICAgIDEzLCAxMywgMTMsIDE0LCAxMywgMTMsCisgICAgMTQsIDE0LCAxMiwgMTQsIDE2LCAxNCwKKyAgICAxMywgMTIsIDEzLCAxNCwgMTMsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTIsCisgICAgMTQsIDExLCAxMiwgMTIsIDEyLCAxMSwKKyAgICAxMSwgMTQsIDE0LCAxMywgMTMsIDExLAorICAgIDEyLCAxNCwgMTIsIDExLCAxNCwgMTEsCisgICAgMTMsIDEzLCAxMSwgMTIsIDEzLCAxMywKKyAgICAxMiwgMTIsIDExLCAxMiwgMTIsIDEyLAorICAgIDExLCAxMiwgMTMsIDExLCAxMCwgMTMsCisgICAgMTMsIDExLCAxMCwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDEzLCAxMiwgMTEsIDE0LAorICAgIDEzLCAxMiwgMTMsIDEyLCAxMSwgMTQsCisgICAgMTIsIDExLCAxMiwgMTMsIDEzLCAxMSwKKyAgICAxMywgMTMsIDEzLCAxMiwgMTIsIDEwLAorICAgIDEyLCAxMiwgMTAsIDEwLCAxMCwgMTEsCisgICAgMTEsIDExLCAxMiwgMTUsIDE1LCAxMywKKyAgICAxMiwgMTMsIDE0LCAxNCwgMTQsIDEzLAorICAgIDE2LCAxNCwgMTMsIDE1LCAxNCwgMTQsCisgICAgMTYsIDE1LCAxMywgMTQsIDE1LCAxMywKKyAgICAxNCwgMTQsIDE0LCAxMywgMTUsIDEzLAorICAgIDE0LCAxMywgMTQsIDEzLCAxNiwgMTQsCisgICAgMTIsIDEyLCAxMywgMTMsIDEyLCAxMywKKyAgICAxMywgMTQsIDEzLCAxMywgMTMsIDExLAorICAgIDE0LCAxNCwgMTIsIDE0LCAxMywgMTMsCisgICAgMTIsIDEzLCAxMywgMTQsIDE1LCAxNCwKKyAgICAxMywgMTIsIDE1LCAxNSwgMTMsIDE0LAorICAgIDEyLCAxNCwgMTQsIDEzLCAxNCwgMTUsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMiwgMTIsIDE1LCAxNCwgMTIsIDEzLAorICAgIDE1LCAxNCwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTUsIDEyLCAxMiwgMTMsIDE0LCAxMiwKKyAgICAxMywgMTMsIDEzLCAxNCwgMTQsIDEzLAorICAgIDEzLCAxNCwgMTMsIDE0LCAxNCwgMTQsCisgICAgMTMsIDE0LCAxNCwgMTMsIDEzLCAxMywKKyAgICAxMiwgMTQsIDEzLCAxMiwgMTIsIDEzLAorICAgIDE0LCAxMiwgMTIsIDE2LCAxNSwgMTUsCisgICAgMTMsIDEzLCAxMywgMTQsIDE0LCAxMywKKyAgICAxMywgMTIsIDEyLCAxNCwgMTMsIDEzLAorICAgIDEyLCAxNCwgMTQsIDE0LCAxMiwgMTIsCisgICAgMTQsIDE0LCAxNiwgMTMsIDE2LCAxNCwKKyAgICAxNCwgMTYsIDE0LCAxMywgMTQsIDEzLAorICAgIDE0LCAxNCwgMTQsIDEzLCAxMywgMTYsCisgICAgMTMsIDEzLCAxMSwgMTUsIDE1LCAxMiwKKyAgICAxMiwgMTMsIDE0LCAxNSwgMTIsIDExLAorICAgIDEzLCAxMywgMTEsIDEzLCAxMSwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTEsIDE1LCAxNCwKKyAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE1LCAxNSwgMTMsIDExLCAxNCwgMTMsCisgICAgMTIsIDExLCAxMiwgMTUsIDE1LCAxMiwKKyAgICAxMiwgMTQsIDE1LCAxMSwgMTEsIDEzLAorICAgIDE0LCAxNSwgMTIsIDEzLCAxMywgMTMsCisgICAgMTEsIDEzLCAxMywgMTUsIDE0LCAxMiwKKyAgICAxNCwgMTQsIDEzLCAxMywgMTQsIDE1LAorICAgIDE2LCAxNiwgMTMsIDEzLCAxNCwgMTYsCisgICAgMTQsIDEyLCAxMiwgMTQsIDExLCAxMSwKKyAgICAxMywgMTUsIDE1LCAxMiwgMTYsIDE0LAorICAgIDE0LCAxNCwgMTUsIDEzLCAxNCwgMTQsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLAorICAgIDE1LCAxNCwgMTIsIDE0LCAxNSwgMTYsCisgICAgMTYsIDEzLCAxNCwgMTUsIDE1LCAxNCwKKyAgICAxNiwgMTQsIDE0LCAxNCwgMTQsIDEzLAorICAgIDE0LCAxNiwgMTMsIDEzLCAxNCwgMTQsCisgICAgMTIsIDEyLCAxMiwgMTQsIDEyLCAxMywKKyAgICAxMiwgMTQsIDEzLCAxMiwgMTQsIDE1LAorICAgIDE1LCAxMywgMTMsIDEyLCAxMywgMTMsCisgICAgMTMsIDEzLCAxNCwgMTMsIDEyLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTIsIDE0LAorICAgIDE0LCAxMiwgMTIsIDEyLCAxNCwgMTMsCisgICAgMTMsIDEyLCAxMiwgMTIsIDE0LCAxMywKKyAgICAxMiwgMTQsIDE1LCAxMiwgMTMsIDEyLAorICAgIDEyLCAxNCwgMTMsIDE0LCAxNSwgMTYsCisgICAgMTQsIDE1LCAxMywgMTYsIDE2LCAxMywKKyAgICAxMywgMTMsIDE0LCAxNCwgMTMsIDEyLAorICAgIDEzLCAxNCwgMTMsIDEzLCAxMiwgMTQsCisgICAgMTMsIDEyLCAxMSwgMTQsIDE0LCAxMiwKKyAgICAgNywgMTAsIDE1LCAxNiwgMTAsICA3LAorICAgIDEyLCAxMywgIDcsIDExLCAxMSwgMTUsCisgICAgMTYsIDEyLCAxMiwgMTQsIDE0LCAxMywKKyAgICAxNiwgMTQsIDE2LCAxNiwgMTYsIDE1LAorICAgIDE2LCAxNiwgMTUsIDE1LCAxMywgMTQsCisgICAgMTQsIDEzLCAxMiwgMTMsIDE2LCAxMywKKyAgICAxMiwgIDksIDEyLCAxMywgIDksICA5LAorICAgIDEzLCAxMywgIDksICA4LCAxMCwgMTYsCisgICAgMTQsIDEwLCAxMSwgMTMsIDEzLCAxMCwKKyAgICAxMywgMTIsIDE1LCAxNCwgMTIsIDE2LAorICAgIDE2LCAxNSwgMTUsIDE0LCAxNSwgMTUsCisgICAgMTYsIDEzLCAxMiwgMTQsIDE0LCAxMywKKyAgICAxMCwgMTMsIDEyLCAxMSwgIDksIDExLAorICAgIDE2LCAxNCwgMTEsICA5LCAxMiwgMTUsCisgICAgMTUsIDExLCAgOSwgMTMsIDE1LCAgOSwKKyAgICAxMSwgMTEsIDE0LCAxNCwgMTIsIDEyLAorICAgIDE0LCAxMywgMTQsIDE0LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNCwgMTQsIDE2LCAxNiwKKyAgICAxNCwgMTIsIDEzLCAxMywgMTMsIDExLAorICAgIDExLCAxNiwgMTMsIDEyLCAxNCwgMTMsCisgICAgMTMsIDEwLCAxMSwgMTUsIDEyLCAxMiwKKyAgICAxNiwgMTIsIDE2LCAxNCwgMTEsIDExLAorICAgIDEzLCAxNCwgMTEsIDE0LCAxMSwgMTUsCisgICAgMTUsIDEzLCAxNCwgMTQsIDE2LCAxNSwKKyAgICAxNiwgMTUsIDE0LCAxNSwgMTQsIDE0LAorICAgIDE2LCAxNCwgMTIsIDEyLCAxNCwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTYsIDE0LCAxMiwKKyAgICAxNSwgMTUsIDE2LCAxNiwgMTQsIDE2LAorICAgIDE0LCAxMywgMTIsIDE0LCAxNCwgMTUsCisgICAgMTYsIDEzLCAxMiwgMTEsIDE0LCAxMywKKyAgICAxNiwgMTIsIDEyLCAxNiwgMTYsIDE0LAorICAgIDE0LCAxNiwgMTYsIDE1LCAxNCwgMTUsCisgICAgMTUsIDE0LCAxMiwgMTMsIDE1LCAxNCwKKyAgICAxNSwgMTUsIDE0LCAxNCwgMTYsIDE2LAorICAgIDE0LCAxNiwgMTYsIDE0LCAxNCwgMTQsCisgICAgMTQsIDEzLCAxNCwgMTMsIDE2LCAxNSwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE2LAorICAgIDE1LCAxNiwgMTQsIDE0LCAxNiwgMTYsCisgICAgMTUsIDE2LCAxNSwgMTMsIDE2LCAxNiwKKyAgICAxNSwgMTQsIDE0LCAxNCwgMTUsIDE0LAorICAgIDE0LCAxNSwgMTUsIDE0LCAxMSwgMTUsCisgICAgMTUsIDEyLCAxMCwgMTIsIDE2LCAxNSwKKyAgICAxMywgMTEsIDE0LCAxMywgMTEsIDEzLAorICAgIDEzLCAxNiwgMTUsIDEyLCAxNSwgMTUsCisgICAgMTUsIDE0LCAxNCwgMTYsIDE2LCAxNSwKKyAgICAxNCwgMTMsIDE0LCAxNSwgMTQsIDEyLAorICAgIDE0LCAxMywgMTEsIDEzLCAxMiwgMTQsCisgICAgMTUsIDExLCAgOSwgMTIsIDE1LCAxNSwKKyAgICAxMSwgIDksIDEyLCAxMywgIDksIDEwLAorICAgIDEyLCAxNCwgMTQsIDEwLCAxMiwgMTMsCisgICAgMTQsIDEyLCAxNCwgMTUsIDE1LCAxNiwKKyAgICAxNSwgMTQsIDE0LCAxNCwgMTUsIDE0LAorICAgIDEyLCAxMywgMTMsIDEzLCAxMiwgMTEsCisgICAgMTMsIDE0LCAxMiwgMTAsIDEyLCAxMywKKyAgICAgOSwgIDcsIDEzLCAxMywgIDcsICA2LAorICAgICA5LCAxNCwgMTUsICA5LCAxMCwgMTQsCisgICAgMTIsICA5LCAxMywgMTMsIDE1LCAxNiwKKyAgICAxMiwgMTQsIDE2LCAxNiwgMTUsIDE1LAorICAgIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTMsCisgICAgMTQsIDEyLCAxMSwgMTMsIDEzLCAxMCwKKyAgICAgOSwgMTAsIDE1LCAxNCwgMTAsICA2LAorICAgIDEyLCAxNiwgMTUsIDEyLCAxMCwgMTUsCisgICAgMTMsIDEwLCAxMiwgMTMsIDE0LCAxNSwKKyAgICAxMiwgMTMsIDEzLCAxMywgMTMsIDE1LAorICAgIDE0LCAxNSwgMTUsIDE1LCAxNiwgMTUsCisgICAgMTYsIDE2LCAxNSwgMTQsIDE1LCAxNSwKKyAgICAxMywgMTEsIDEyLCAxNiwgMTYsIDEyLAorICAgICA5LCAxNCwgMTQsICA4LCAgOSwgMTMsCisgICAgMTMsICA4LCAgOSwgMTEsIDE2LCAxNCwKKyAgICAxMSwgMTEsIDEzLCAxNCwgMTEsIDEzLAorICAgIDEzLCAxNCwgMTQsIDEzLCAxNCwgMTUsCisgICAgMTUsIDEzLCAxMywgMTUsIDE1LCAxNSwKKyAgICAxMywgMTIsIDE2LCAxNiwgMTMsIDEwLAorICAgIDEzLCAxMywgMTAsICA2LCAxMSwgMTYsCisgICAgMTYsIDEwLCAgOSwgMTIsIDE0LCAxNiwKKyAgICAxMSwgMTAsIDEzLCAxMywgMTAsIDExLAorICAgIDEyLCAxNiwgMTQsIDEyLCAxMiwgMTUsCisgICAgMTQsIDE0LCAxNSwgMTQsIDE2LCAxNSwKKyAgICAxNCwgMTQsIDE0LCAxNiwgMTYsIDE1LAorICAgIDEyLCAxNCwgMTUsIDEzLCAxMSwgMTEsCisgICAgMTUsIDE0LCAxMSwgIDksIDEzLCAxNCwKKyAgICAgOSwgMTEsIDE0LCAxNCwgMTEsIDE1LAorICAgIDEzLCAxNSwgMTYsIDEyLCAxMywgMTQsCisgICAgMTMsIDEyLCAxMywgMTQsIDE1LCAxMywKKyAgICAxMywgMTQsIDE1LCAxNiwgMTMsIDE2LAorICAgIDE2LCAxNSwgMTUsIDEzLCAxMywgMTUsCisgICAgMTUsIDE0LCAxMSwgMTQsIDE0LCAxMywKKyAgICAxMCwgMTIsIDE1LCAxNCwgMTIsIDE2LAorICAgIDEzLCAxNiwgMTYsIDE0LCAxNiwgMTQsCisgICAgMTUsIDE1LCAxMywgMTMsIDE2LCAxNSwKKyAgICAxMywgMTUsIDE2LCAxNCwgMTQsIDE2LAorICAgIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTQsIDE2LCAxNSwgMTMsIDE0LCAxNSwKKyAgICAxNSwgMTMsIDEzLCAxNSwgMTYsIDE0LAorICAgIDEyLCAxNCwgMTQsIDE2LCAxNSwgMTQsCisgICAgMTUsIDE2LCAxMywgMTMsIDE0LCAxNSwKKyAgICAxMywgMTMsIDE0LCAxNCwgMTYsIDE0LAorICAgIDE0LCAxNCwgMTUsIDE0LCAxNiwgMTUsCisgICAgMTQsIDE1LCAxNCwgMTUsIDE1LCAxNiwKKyAgICAxMiwgMTMsIDEzLCAxNSwgMTIsIDEyLAorICAgIDEzLCAxMywgMTYsIDE2LCAxMiwgMTMsCisgICAgMTMsIDE0LCAxNCwgMTEsIDEzLCAxNCwKKyAgICAxMSwgMTUsIDEzLCAxNCwgMTYsIDEyLAorICAgIDEyLCAxMiwgMTMsIDExLCAxMywgMTMsCisgICAgMTMsIDE1LCAxNCwgMTMsIDE1LCAxNSwKKyAgICAxNCwgMTQsIDE2LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNSwgMTQsIDExLCAxMSwgMTMsCisgICAgMTMsIDExLCAxNCwgMTEsIDE2LCAxNCwKKyAgICAxMiwgIDksIDExLCAxNCwgMTQsIDExLAorICAgIDEwLCAxMiwgMTMsIDEwLCAxMSwgMTIsCisgICAgMTMsIDE2LCAxMSwgMTIsIDEzLCAxNCwKKyAgICAxNiwgMTYsIDE0LCAxNCwgMTYsIDE0LAorICAgIDEzLCAxNSwgMTYsIDE0LCAxNSwgMTMsCisgICAgMTQsIDEyLCAxMSwgMTEsIDExLCAxNSwKKyAgICAxNSwgMTEsICA5LCAxMywgMTMsICA5LAorICAgICA5LCAxNCwgMTQsICA5LCAgOSwgMTEsCisgICAgMTYsIDE0LCAxMSwgMTEsIDEzLCAxMiwKKyAgICAxMSwgMTMsIDEyLCAxMywgMTUsIDEyLAorICAgIDEzLCAxMywgMTUsIDE0LCAxNCwgMTUsCisgICAgMTYsIDE1LCAxMywgMTIsIDE2LCAxNCwKKyAgICAxMiwgMTAsIDEzLCAxMywgMTAsICA4LAorICAgIDEwLCAxNiwgMTQsIDEwLCAxMywgMTUsCisgICAgMTYsIDEzLCAxMywgMTMsIDE0LCAxNCwKKyAgICAxMiwgMTMsIDE0LCAxNCwgMTMsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxMywgMTQsCisgICAgMTYsIDE0LCAxNCwgMTYsIDE1LCAxNCwKKyAgICAxNCwgMTQsIDE1LCAxNSwgMTUsIDEzLAorICAgIDE1LCAxNiwgMTMsIDEzLCAxNCwgMTQsCisgICAgMTUsIDEyLCAxNCwgMTQsIDE0LCAxMywKKyAgICAxMywgMTIsIDEzLCAxMywgMTIsIDEzLAorICAgIDEzLCAxMywgMTIsIDEzLCAxMywgMTQsCisgICAgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxMywgMTMsIDEyLCAxNCwgMTYsIDE0LAorICAgIDE0LCAxNSwgMTQsIDE0LCAxMywgMTIsCisgICAgMTMsIDEzLCAxMywgMTEsIDEzLCAxNCwKKyAgICAxMiwgMTMsIDE1LCAxNCwgMTIsIDEzLAorICAgIDEzLCAxNCwgMTIsIDEyLCAxMywgMTQsCisgICAgMTMsIDEzLCAxMywgMTMsIDE1LCAxNCwKKyAgICAxMywgMTQsIDEzLCAxMywgMTIsIDEyLAorICAgIDEzLCAxMywgMTIsIDE0LCAxMywgMTMsCisgICAgMTQsIDEzLCAxMiwgMTQsIDEzLCAxMywKKyAgICAxMiwgMTMsIDEyLCAxMiwgMTIsIDE0LAorICAgIDE1LCAxNCwgMTMsIDE2LCAxMywgMTUsCisgICAgMTUsIDEzLCAxNCwgMTMsIDE0LCAxMywKKyAgICAxMywgMTQsIDE0LCAxMywgMTQsIDE1LAorICAgIDEzLCAxNSwgMTYsIDEzLCAxMywgMTMsCisgICAgMTQsIDE2LCAxMywgMTQsIDE0LCAxNCwKKyAgICAxMywgMTQsIDEzLCAxMywgMTMsIDEzLAorICAgIDE0LCAxNCwgMTQsIDEzLCAxMSwgMTQsCisgICAgMTQsIDEzLCAxMSwgMTMsIDE2LCAxNCwKKyAgICAxMywgMTEsIDE0LCAxMywgMTIsIDE0LAorICAgIDEzLCAxNiwgMTQsIDEzLCAxMywgMTUsCisgICAgMTQsIDEzLCAxNCwgMTMsIDE1LCAxNCwKKyAgICAxMywgMTIsIDEzLCAxNSwgMTQsIDEwLAorICAgIDEyLCAxNCwgMTMsIDEwLCAxMiwgMTUsCisgICAgMTQsIDEyLCAxMiwgMTQsIDE2LCAxMiwKKyAgICAxMSwgMTIsIDE1LCAxNCwgMTIsIDEyLAorICAgIDEzLCAxMywgMTEsIDEyLCAxMiwgMTMsCisgICAgMTUsIDEzLCAxNCwgMTUsIDE0LCAxNSwKKyAgICAxNSwgMTUsIDExLCAxMywgMTMsIDEyLAorICAgIDE0LCAxMywgMTEsIDExLCAxMywgMTMsCisgICAgMTEsIDExLCAxMiwgMTQsIDE2LCAxMiwKKyAgICAxNCwgMTMsIDE0LCAxNiwgMTMsIDEzLAorICAgIDEzLCAxNSwgMTMsIDEzLCAxNCwgMTMsCisgICAgMTQsIDE0LCAxNSwgMTQsIDE2LCAxNCwKKyAgICAxNCwgMTQsIDE1LCAxNiwgMTQsIDE1LAorICAgIDEzLCAxNSwgMTIsIDEyLCAxNSwgMTQsCisgICAgMTEsIDEyLCAxMywgMTMsIDE0LCAxNCwKKyAgICAxMSwgMTIsIDEzLCAxNSwgMTMsIDEyLAorICAgIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsCisgICAgMTQsIDEyLCAxMywgMTIsIDEzLCAxMywKKyAgICAxNSwgMTMsIDEyLCAxNCwgMTMsIDEyLAorICAgIDE2LCAxMywgMTIsIDEzLCAxNSwgMTIsCisgICAgMTQsIDE0LCAxNCwgMTQsIDEyLCAxMywKKyAgICAxMiwgMTQsIDEzLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxNCwgMTIsIDEzLCAxMywgMTQsCisgICAgMTMsIDEzLCAxMiwgMTMsIDE0LCAxMSwKKyAgICAxMiwgMTIsIDEzLCAxMywgMTIsIDEzLAorICAgIDE0LCAxNSwgMTQsIDE0LCAxMywgMTQsCisgICAgMTQsIDEzLCAxMywgMTQsIDE1LCAxNCwKKyAgICAxMywgMTQsIDE0LCAxMywgMTQsIDEzLAorICAgIDEyLCAxMywgMTMsIDEzLCAxMiwgMTQsCisgICAgMTQsIDExLCAxMSwgMTIsIDEyLCAxMywKKyAgICAxMiwgMTAsIDEzLCAxMywgMTAsIDEyLAorICAgIDExLCAxMiwgMTIsIDExLCAxMywgMTMsCisgICAgMTQsIDEyLCAxNiwgMTMsIDE0LCAxNSwKKyAgICAxMywgMTMsIDEzLCAxNSwgMTUsIDEzLAorICAgIDEzLCAxNCwgMTYsIDE0LCAxMywgMTIsCisgICAgMTIsIDEyLCAxMiwgMTEsIDEzLCAxMywKKyAgICAxMCwgMTAsIDE0LCAxMywgMTAsIDEwLAorICAgIDExLCAxMSwgMTEsIDEwLCAxMCwgMTIsCisgICAgMTMsIDEwLCAxMywgMTIsIDExLCAxMiwKKyAgICAxMywgMTIsIDEyLCAxMiwgMTEsIDExLAorICAgIDEyLCAxMywgMTIsIDEzLCAxMywgMTIsCisgICAgMTMsIDEzLCAxMSwgMTIsIDEzLCAxMSwKKyAgICAxMCwgMTEsIDExLCAxMSwgMTAsIDEyLAorICAgIDEyLCAxMywgMTIsIDEyLCAxMSwgMTMsCisgICAgMTIsIDExLCAxMSwgMTEsIDEyLCAxMSwKKyAgICAxMSwgMTIsIDEzLCAxMywgMTIsIDE0LAorICAgIDExLCAxMiwgMTQsIDEyLCAxMiwgMTEsCisgICAgMTIsIDEzLCAxMSwgMTIsIDEzLCAxMywKKyAgICAxMywgMTIsIDExLCAxMSwgMTMsIDEyLAorICAgIDEwLCAxMywgMTIsIDExLCAxMywgMTUsCisgICAgMTUsIDEzLCAxMywgMTMsIDEzLCAxMiwKKyAgICAxMywgMTMsIDE0LCAxMywgMTMsIDE0LAorICAgIDE0LCAxMywgMTMsIDE0LCAxMSwgMTMsCisgICAgMTMsIDEzLCAxMiwgMTEsIDEzLCAxMywKKyAgICAxNCwgMTMsIDEyLCAxMywgMTUsIDEyLAorICAgIDE0LCAxMywgMTMsIDEzLCAxMywgMTUsCisgICAgMTMsIDEzLCAxNCwgMTIsIDE2LCAxNSwKKyAgICAxMywgIDksIDEzLCAxMywgMTEsIDEwLAorICAgIDEyLCAxNCwgMTQsIDEyLCAxMSwgMTQsCisgICAgMTMsIDEyLCAxNiwgMTMsIDE0LCAxNSwKKyAgICAxMywgMTQsIDEzLCAxNCwgMTYsIDE0LAorICAgIDExLCAxMiwgMTUsIDEyLCAxMSwgMTEsCisgICAgMTUsIDE2LCAxMSwgMTAsIDEyLCAxMywKKyAgICAxMSwgMTAsIDEyLCAxNiwgMTUsIDEyLAorICAgIDExLCAxMiwgMTMsICA5LCAxMCwgMTIsCisgICAgMTMsIDE1LCAxMSwgMTIsIDEzLCAxMywKKyAgICAxNiwgMTUsIDE0LCAxNSwgMTYsIDEzLAorICAgIDEzLCAxNCwgMTYsIDEzLCAxMiwgMTIsCisgICAgMTMsIDEyLCAxMiwgMTEsIDEyLCAxNCwKKyAgICAxNCwgMTIsIDEwLCAxMiwgMTMsIDEwLAorICAgIDEzLCAxMywgMTQsIDEzLCAxMywgMTMsCisgICAgMTIsIDEzLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxMywgMTQsIDE0LCAxMywgMTMsIDE0LAorICAgIDEzLCAxMywgMTMsIDExLCAxMywgMTIsCisgICAgMTEsIDEyLCAxMywgMTMsIDEzLCAxMiwKKyAgICAxMiwgMTIsIDE0LCAxMywgMTIsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMSwgMTEsCisgICAgMTMsIDEyLCAxMiwgMTAsIDEyLCAxMywKKyAgICAxMSwgMTIsIDExLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxMywgMTQsIDEyLCAxMywgMTIsCisgICAgMTQsIDE1LCAxMiwgMTIsIDExLCAxNCwKKyAgICAxMywgMTEsIDEzLCAxNCwgMTIsIDEzLAorICAgIDExLCAxMSwgMTIsIDExLCAxMCwgMTAsCisgICAgMTMsIDEzLCAxMCwgMTAsIDEzLCAxMywKKyAgICAxMCwgMTAsIDEwLCAxMiwgMTEsIDExLAorICAgIDEwLCAxMiwgMTMsIDExLCAxMywgMTIsCisgICAgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMywKKyAgICAxMSwgMTEsIDEzLCAxMiwgMTEsIDE0LAorICAgIDEzLCAxMywgMTIsIDEyLCAxMSwgMTMsCisgICAgMTIsIDExLCAxMCwgMTEsIDEyLCAxMSwKKyAgICAxMCwgIDksIDEyLCAxMywgIDksICA5LAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTIsCisgICAgMTMsIDExLCAxMywgMTIsIDEyLCAxMiwKKyAgICAxMywgMTEsIDE0LCAxMiwgMTEsIDEwLAorICAgIDExLCAxMSwgMTAsIDEzLCAxMywgMTIsCisgICAgMTQsIDEyLCAxMSwgMTMsIDEyLCAxMSwKKyAgICAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTEsIDEwLCAgOSwgMTIsCisgICAgMTIsICA5LCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMSwgMTEsIDEyLCAxMywgMTMsIDExLAorICAgIDExLCAxNSwgMTQsIDExLCAxMCwgMTAsCisgICAgMTIsIDE2LCAxMCwgMTIsIDEyLCAxNCwKKyAgICAxMiwgMTEsIDEwLCAxMCwgMTAsIDEwLAorICAgICA5LCAxMywgMTIsICA5LCAxMSwgMTMsCisgICAgMTMsIDExLCAxMCwgMTEsIDExLCAxMSwKKyAgICAxMCwgMTAsIDEyLCAxMiwgMTEsIDEzLAorICAgIDExLCAxMSwgMTMsIDEzLCAxMSwgMTMsCisgICAgMTMsIDExLCAxMCwgMTEsIDE1LCAxMCwKKyAgICAxMywgMTIsIDEyLCAxNSwgMTIsIDExLAorICAgIDEyLCAxMywgMTEsIDExLCAxMSwgMTEsCisgICAgMTAsIDEwLCAxMywgMTMsIDE0LCAxNCwKKyAgICAxMywgMTMsIDE0LCAxMywgMTIsIDEzLAorICAgIDEzLCAxNSwgMTMsIDEyLCAxMywgMTQsCisgICAgMTQsIDEzLCAxMSwgMTIsIDEzLCAxNSwKKyAgICAxMiwgMTIsIDExLCAxMywgMTYsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxMiwgMTMsCisgICAgMTMsIDEzLCAxMiwgMTIsIDE0LCAxNCwKKyAgICAxMiwgIDksIDE0LCAxNCwgMTAsICA5LAorICAgIDExLCAxNiwgMTQsIDExLCAxNiwgMTMsCisgICAgMTMsIDEwLCAxMSwgMTIsIDE1LCAxNCwKKyAgICAxMiwgMTQsIDE0LCAxNCwgMTMsIDEzLAorICAgIDEzLCAxNiwgMTYsIDExLCAxMSwgMTYsCisgICAgMTUsIDEyLCAgOSwgMTMsIDE0LCAxMCwKKyAgICAxMCwgMTEsIDE0LCAxNSwgMTEsIDExLAorICAgIDEzLCAxNCwgMTAsICA5LCAxMSwgMTUsCisgICAgMTUsIDExLCAxMCwgMTMsIDEyLCAgOSwKKyAgICAxMSwgMTMsIDE1LCAxNCwgMTEsIDEzLAorICAgIDE0LCAxMywgMTMsIDEzLCAxMywgMTQsCisgICAgMTMsIDE2LCAxMywgMTUsIDEzLCAxMiwKKyAgICAxMCwgMTMsIDEzLCAxMCwgMTAsIDExLAorICAgIDEzLCAxNSwgMTEsIDEzLCAxMiwgMTMsCisgICAgMTMsIDEzLCAxMiwgMTMsIDEzLCAxMiwKKyAgICAxMywgMTIsIDEzLCAxMiwgMTMsIDEzLAorICAgIDE1LCAxNCwgMTMsIDExLCAxMiwgMTQsCisgICAgMTQsIDExLCAxMiwgMTQsIDE2LCAxMywKKyAgICAxMywgMTMsIDE0LCAxMywgMTIsIDEzLAorICAgIDEyLCAxMiwgMTMsIDEyLCAxMiwgMTMsCisgICAgMTQsIDEyLCAxMCwgMTMsIDEzLCAxMSwKKyAgICAxMCwgMTAsIDEyLCAxMSwgMTEsIDExLAorICAgIDEzLCAxMiwgMTEsIDEzLCAxMiwgMTMsCisgICAgMTIsIDEyLCAxMSwgMTMsIDEyLCAxMCwKKyAgICAxMCwgMTMsIDExLCAxMSwgMTMsIDEzLAorICAgIDEyLCAxMSwgMTIsIDExLCAxMiwgMTIsCisgICAgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwKKyAgICAgOSwgMTAsIDExLCAxMCwgMTEsICA5LAorICAgIDExLCAxMiwgIDksIDEwLCAxMCwgMTAsCisgICAgMTAsIDExLCAxMiwgMTMsIDE0LCAxMiwKKyAgICAxMCwgMTEsIDEzLCAxMywgMTEsIDEwLAorICAgIDEwLCAxMiwgMTIsIDExLCAxMywgMTMsCisgICAgMTMsIDEyLCAxMCwgMTEsIDExLCAxMCwKKyAgICAxMCwgIDksIDEyLCAxMSwgIDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgb24yYXZjX2NiOF9zeW1zW09OMkFWQ19DQjhfQ09ERVNdID0geworICAgIDB4MDAwMCwgMHgwMDAyLCAweDAwMDQsIDB4MDAwQywgMHgwMDBFLCAweDAwMTEsCisgICAgMHgwMDEzLCAweDAwMUQsIDB4MDAxRiwgMHgwMDIwLCAweDAwMjIsIDB4MDAyNCwKKyAgICAweDAwMkMsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzMsIDB4MDAzRCwgMHgwMDNGLAorICAgIDB4MDA0MCwgMHgwMDQyLCAweDAwNDQsIDB4MDA0QywgMHgwMDRFLCAweDAwQzAsCisgICAgMHgwMEMyLCAweDAwQzQsIDB4MDBDQywgMHgwMENFLCAweDAwRDEsIDB4MDBEMywKKyAgICAweDAwREQsIDB4MDBERiwgMHgwMEUwLCAweDAwRTIsIDB4MDBFNCwgMHgwMEVDLAorICAgIDB4MDBFRSwgMHgwMEYxLCAweDAwRjMsIDB4MDBGRCwgMHgwMEZGLCAweDAxMDEsCisgICAgMHgwMTAzLCAweDAxMEQsIDB4MDEwRiwgMHgwMTEwLCAweDAxMTIsIDB4MDExNCwKKyAgICAweDAxMUMsIDB4MDExRSwgMHgwMTIxLCAweDAxMjMsIDB4MDEyRCwgMHgwMTJGLAorICAgIDB4MDEzMCwgMHgwMTMyLCAweDAxMzQsIDB4MDEzQywgMHgwMTNFLCAweDAxNDEsCisgICAgMHgwMTQzLCAweDAxNEQsIDB4MDE0RiwgMHgwMUMxLCAweDAxQzMsIDB4MDFDRCwKKyAgICAweDAxQ0YsIDB4MDFEMCwgMHgwMUQyLCAweDAxRDQsIDB4MDFEQywgMHgwMURFLAorICAgIDB4MDFFMSwgMHgwMUUzLCAweDAxRUQsIDB4MDFFRiwgMHgwMUYwLCAweDAxRjIsCisgICAgMHgwMUY0LCAweDAxRkMsIDB4MDFGRSwgMHgwMjAwLCAweDAyMDIsIDB4MDIwNCwKKyAgICAweDAyMEMsIDB4MDIwRSwgMHgwMjExLCAweDAyMTMsIDB4MDIxRCwgMHgwMjFGLAorICAgIDB4MDIyMCwgMHgwMjIyLCAweDAyMjQsIDB4MDIyQywgMHgwMjJFLCAweDAyMzEsCisgICAgMHgwMjMzLCAweDAyM0QsIDB4MDIzRiwgMHgwMjQwLCAweDAyNDIsIDB4MDI0NCwKKyAgICAweDAyNEMsIDB4MDI0RSwgMHgwMkMwLCAweDAyQzIsIDB4MDJDNCwgMHgwMkNDLAorICAgIDB4MDJDRSwgMHgwMkQxLCAweDAyRDMsIDB4MDJERCwgMHgwMkRGLCAweDAyRTAsCisgICAgMHgwMkUyLCAweDAyRTQsIDB4MDJFQywgMHgwMkVFLCAweDAyRjEsIDB4MDJGMywKKyAgICAweDAyRkQsIDB4MDJGRiwgMHgwMzAxLCAweDAzMDMsIDB4MDMwRCwgMHgwMzBGLAorICAgIDB4MDMxMCwgMHgwMzEyLCAweDAzMTQsIDB4MDMxQywgMHgwMzFFLCAweDAzMjEsCisgICAgMHgwMzIzLCAweDAzMkQsIDB4MDMyRiwgMHgwMzMwLCAweDAzMzIsIDB4MDMzNCwKKyAgICAweDAzM0MsIDB4MDMzRSwgMHgwMzQxLCAweDAzNDMsIDB4MDM0RCwgMHgwMzRGLAorICAgIDB4MDNDMSwgMHgwM0MzLCAweDAzQ0QsIDB4MDNDRiwgMHgwM0QwLCAweDAzRDIsCisgICAgMHgwM0Q0LCAweDAzREMsIDB4MDNERSwgMHgwM0UxLCAweDAzRTMsIDB4MDNFRCwKKyAgICAweDAzRUYsIDB4MDNGMCwgMHgwM0YyLCAweDAzRjQsIDB4MDNGQywgMHgwM0ZFLAorICAgIDB4MDQwMCwgMHgwNDAyLCAweDA0MDQsIDB4MDQwQywgMHgwNDBFLCAweDA0MTEsCisgICAgMHgwNDEzLCAweDA0MUQsIDB4MDQxRiwgMHgwNDIwLCAweDA0MjIsIDB4MDQyNCwKKyAgICAweDA0MkMsIDB4MDQyRSwgMHgwNDMxLCAweDA0MzMsIDB4MDQzRCwgMHgwNDNGLAorICAgIDB4MDQ0MCwgMHgwNDQyLCAweDA0NDQsIDB4MDQ0QywgMHgwNDRFLCAweDA0QzAsCisgICAgMHgwNEMyLCAweDA0QzQsIDB4MDRDQywgMHgwNENFLCAweDA0RDEsIDB4MDREMywKKyAgICAweDA0REQsIDB4MDRERiwgMHgwNEUwLCAweDA0RTIsIDB4MDRFNCwgMHgwNEVDLAorICAgIDB4MDRFRSwgMHgwNEYxLCAweDA0RjMsIDB4MDRGRCwgMHgwNEZGLCAweDBDMDAsCisgICAgMHgwQzAyLCAweDBDMDQsIDB4MEMwQywgMHgwQzBFLCAweDBDMTEsIDB4MEMxMywKKyAgICAweDBDMUQsIDB4MEMxRiwgMHgwQzIwLCAweDBDMjIsIDB4MEMyNCwgMHgwQzJDLAorICAgIDB4MEMyRSwgMHgwQzMxLCAweDBDMzMsIDB4MEMzRCwgMHgwQzNGLCAweDBDNDAsCisgICAgMHgwQzQyLCAweDBDNDQsIDB4MEM0QywgMHgwQzRFLCAweDBDQzAsIDB4MENDMiwKKyAgICAweDBDQzQsIDB4MENDQywgMHgwQ0NFLCAweDBDRDEsIDB4MENEMywgMHgwQ0RELAorICAgIDB4MENERiwgMHgwQ0UwLCAweDBDRTIsIDB4MENFNCwgMHgwQ0VDLCAweDBDRUUsCisgICAgMHgwQ0YxLCAweDBDRjMsIDB4MENGRCwgMHgwQ0ZGLCAweDBEMDEsIDB4MEQwMywKKyAgICAweDBEMEQsIDB4MEQwRiwgMHgwRDEwLCAweDBEMTIsIDB4MEQxNCwgMHgwRDFDLAorICAgIDB4MEQxRSwgMHgwRDIxLCAweDBEMjMsIDB4MEQyRCwgMHgwRDJGLCAweDBEMzAsCisgICAgMHgwRDMyLCAweDBEMzQsIDB4MEQzQywgMHgwRDNFLCAweDBENDEsIDB4MEQ0MywKKyAgICAweDBENEQsIDB4MEQ0RiwgMHgwREMxLCAweDBEQzMsIDB4MERDRCwgMHgwRENGLAorICAgIDB4MEREMCwgMHgwREQyLCAweDBERDQsIDB4MEREQywgMHgwRERFLCAweDBERTEsCisgICAgMHgwREUzLCAweDBERUQsIDB4MERFRiwgMHgwREYwLCAweDBERjIsIDB4MERGNCwKKyAgICAweDBERkMsIDB4MERGRSwgMHgwRTAwLCAweDBFMDIsIDB4MEUwNCwgMHgwRTBDLAorICAgIDB4MEUwRSwgMHgwRTExLCAweDBFMTMsIDB4MEUxRCwgMHgwRTFGLCAweDBFMjAsCisgICAgMHgwRTIyLCAweDBFMjQsIDB4MEUyQywgMHgwRTJFLCAweDBFMzEsIDB4MEUzMywKKyAgICAweDBFM0QsIDB4MEUzRiwgMHgwRTQwLCAweDBFNDIsIDB4MEU0NCwgMHgwRTRDLAorICAgIDB4MEU0RSwgMHgwRUMwLCAweDBFQzIsIDB4MEVDNCwgMHgwRUNDLCAweDBFQ0UsCisgICAgMHgwRUQxLCAweDBFRDMsIDB4MEVERCwgMHgwRURGLCAweDBFRTAsIDB4MEVFMiwKKyAgICAweDBFRTQsIDB4MEVFQywgMHgwRUVFLCAweDBFRjEsIDB4MEVGMywgMHgwRUZELAorICAgIDB4MEVGRiwgMHgwRjAxLCAweDBGMDMsIDB4MEYwRCwgMHgwRjBGLCAweDBGMTAsCisgICAgMHgwRjEyLCAweDBGMTQsIDB4MEYxQywgMHgwRjFFLCAweDBGMjEsIDB4MEYyMywKKyAgICAweDBGMkQsIDB4MEYyRiwgMHgwRjMwLCAweDBGMzIsIDB4MEYzNCwgMHgwRjNDLAorICAgIDB4MEYzRSwgMHgwRjQxLCAweDBGNDMsIDB4MEY0RCwgMHgwRjRGLCAweDBGQzEsCisgICAgMHgwRkMzLCAweDBGQ0QsIDB4MEZDRiwgMHgwRkQwLCAweDBGRDIsIDB4MEZENCwKKyAgICAweDBGREMsIDB4MEZERSwgMHgwRkUxLCAweDBGRTMsIDB4MEZFRCwgMHgwRkVGLAorICAgIDB4MEZGMCwgMHgwRkYyLCAweDBGRjQsIDB4MEZGQywgMHgwRkZFLCAweDEwMDEsCisgICAgMHgxMDAzLCAweDEwMEQsIDB4MTAwRiwgMHgxMDEwLCAweDEwMTIsIDB4MTAxNCwKKyAgICAweDEwMUMsIDB4MTAxRSwgMHgxMDIxLCAweDEwMjMsIDB4MTAyRCwgMHgxMDJGLAorICAgIDB4MTAzMCwgMHgxMDMyLCAweDEwMzQsIDB4MTAzQywgMHgxMDNFLCAweDEwNDEsCisgICAgMHgxMDQzLCAweDEwNEQsIDB4MTA0RiwgMHgxMEMxLCAweDEwQzMsIDB4MTBDRCwKKyAgICAweDEwQ0YsIDB4MTBEMCwgMHgxMEQyLCAweDEwRDQsIDB4MTBEQywgMHgxMERFLAorICAgIDB4MTBFMSwgMHgxMEUzLCAweDEwRUQsIDB4MTBFRiwgMHgxMEYwLCAweDEwRjIsCisgICAgMHgxMEY0LCAweDEwRkMsIDB4MTBGRSwgMHgxMTAwLCAweDExMDIsIDB4MTEwNCwKKyAgICAweDExMEMsIDB4MTEwRSwgMHgxMTExLCAweDExMTMsIDB4MTExRCwgMHgxMTFGLAorICAgIDB4MTEyMCwgMHgxMTIyLCAweDExMjQsIDB4MTEyQywgMHgxMTJFLCAweDExMzEsCisgICAgMHgxMTMzLCAweDExM0QsIDB4MTEzRiwgMHgxMTQwLCAweDExNDIsIDB4MTE0NCwKKyAgICAweDExNEMsIDB4MTE0RSwgMHgxMUMwLCAweDExQzIsIDB4MTFDNCwgMHgxMUNDLAorICAgIDB4MTFDRSwgMHgxMUQxLCAweDExRDMsIDB4MTFERCwgMHgxMURGLCAweDExRTAsCisgICAgMHgxMUUyLCAweDExRTQsIDB4MTFFQywgMHgxMUVFLCAweDExRjEsIDB4MTFGMywKKyAgICAweDExRkQsIDB4MTFGRiwgMHgxMjAxLCAweDEyMDMsIDB4MTIwRCwgMHgxMjBGLAorICAgIDB4MTIxMCwgMHgxMjEyLCAweDEyMTQsIDB4MTIxQywgMHgxMjFFLCAweDEyMjEsCisgICAgMHgxMjIzLCAweDEyMkQsIDB4MTIyRiwgMHgxMjMwLCAweDEyMzIsIDB4MTIzNCwKKyAgICAweDEyM0MsIDB4MTIzRSwgMHgxMjQxLCAweDEyNDMsIDB4MTI0RCwgMHgxMjRGLAorICAgIDB4MTJDMSwgMHgxMkMzLCAweDEyQ0QsIDB4MTJDRiwgMHgxMkQwLCAweDEyRDIsCisgICAgMHgxMkQ0LCAweDEyREMsIDB4MTJERSwgMHgxMkUxLCAweDEyRTMsIDB4MTJFRCwKKyAgICAweDEyRUYsIDB4MTJGMCwgMHgxMkYyLCAweDEyRjQsIDB4MTJGQywgMHgxMkZFLAorICAgIDB4MTMwMCwgMHgxMzAyLCAweDEzMDQsIDB4MTMwQywgMHgxMzBFLCAweDEzMTEsCisgICAgMHgxMzEzLCAweDEzMUQsIDB4MTMxRiwgMHgxMzIwLCAweDEzMjIsIDB4MTMyNCwKKyAgICAweDEzMkMsIDB4MTMyRSwgMHgxMzMxLCAweDEzMzMsIDB4MTMzRCwgMHgxMzNGLAorICAgIDB4MTM0MCwgMHgxMzQyLCAweDEzNDQsIDB4MTM0QywgMHgxMzRFLCAweDEzQzAsCisgICAgMHgxM0MyLCAweDEzQzQsIDB4MTNDQywgMHgxM0NFLCAweDEzRDEsIDB4MTNEMywKKyAgICAweDEzREQsIDB4MTNERiwgMHgxM0UwLCAweDEzRTIsIDB4MTNFNCwgMHgxM0VDLAorICAgIDB4MTNFRSwgMHgxM0YxLCAweDEzRjMsIDB4MTNGRCwgMHgxM0ZGLCAweDE0MDEsCisgICAgMHgxNDAzLCAweDE0MEQsIDB4MTQwRiwgMHgxNDEwLCAweDE0MTIsIDB4MTQxNCwKKyAgICAweDE0MUMsIDB4MTQxRSwgMHgxNDIxLCAweDE0MjMsIDB4MTQyRCwgMHgxNDJGLAorICAgIDB4MTQzMCwgMHgxNDMyLCAweDE0MzQsIDB4MTQzQywgMHgxNDNFLCAweDE0NDEsCisgICAgMHgxNDQzLCAweDE0NEQsIDB4MTQ0RiwgMHgxNEMxLCAweDE0QzMsIDB4MTRDRCwKKyAgICAweDE0Q0YsIDB4MTREMCwgMHgxNEQyLCAweDE0RDQsIDB4MTREQywgMHgxNERFLAorICAgIDB4MTRFMSwgMHgxNEUzLCAweDE0RUQsIDB4MTRFRiwgMHgxNEYwLCAweDE0RjIsCisgICAgMHgxNEY0LCAweDE0RkMsIDB4MTRGRSwgMHgxQzAxLCAweDFDMDMsIDB4MUMwRCwKKyAgICAweDFDMEYsIDB4MUMxMCwgMHgxQzEyLCAweDFDMTQsIDB4MUMxQywgMHgxQzFFLAorICAgIDB4MUMyMSwgMHgxQzIzLCAweDFDMkQsIDB4MUMyRiwgMHgxQzMwLCAweDFDMzIsCisgICAgMHgxQzM0LCAweDFDM0MsIDB4MUMzRSwgMHgxQzQxLCAweDFDNDMsIDB4MUM0RCwKKyAgICAweDFDNEYsIDB4MUNDMSwgMHgxQ0MzLCAweDFDQ0QsIDB4MUNDRiwgMHgxQ0QwLAorICAgIDB4MUNEMiwgMHgxQ0Q0LCAweDFDREMsIDB4MUNERSwgMHgxQ0UxLCAweDFDRTMsCisgICAgMHgxQ0VELCAweDFDRUYsIDB4MUNGMCwgMHgxQ0YyLCAweDFDRjQsIDB4MUNGQywKKyAgICAweDFDRkUsIDB4MUQwMCwgMHgxRDAyLCAweDFEMDQsIDB4MUQwQywgMHgxRDBFLAorICAgIDB4MUQxMSwgMHgxRDEzLCAweDFEMUQsIDB4MUQxRiwgMHgxRDIwLCAweDFEMjIsCisgICAgMHgxRDI0LCAweDFEMkMsIDB4MUQyRSwgMHgxRDMxLCAweDFEMzMsIDB4MUQzRCwKKyAgICAweDFEM0YsIDB4MUQ0MCwgMHgxRDQyLCAweDFENDQsIDB4MUQ0QywgMHgxRDRFLAorICAgIDB4MURDMCwgMHgxREMyLCAweDFEQzQsIDB4MURDQywgMHgxRENFLCAweDFERDEsCisgICAgMHgxREQzLCAweDFEREQsIDB4MURERiwgMHgxREUwLCAweDFERTIsIDB4MURFNCwKKyAgICAweDFERUMsIDB4MURFRSwgMHgxREYxLCAweDFERjMsIDB4MURGRCwgMHgxREZGLAorICAgIDB4MUUwMSwgMHgxRTAzLCAweDFFMEQsIDB4MUUwRiwgMHgxRTEwLCAweDFFMTIsCisgICAgMHgxRTE0LCAweDFFMUMsIDB4MUUxRSwgMHgxRTIxLCAweDFFMjMsIDB4MUUyRCwKKyAgICAweDFFMkYsIDB4MUUzMCwgMHgxRTMyLCAweDFFMzQsIDB4MUUzQywgMHgxRTNFLAorICAgIDB4MUU0MSwgMHgxRTQzLCAweDFFNEQsIDB4MUU0RiwgMHgxRUMxLCAweDFFQzMsCisgICAgMHgxRUNELCAweDFFQ0YsIDB4MUVEMCwgMHgxRUQyLCAweDFFRDQsIDB4MUVEQywKKyAgICAweDFFREUsIDB4MUVFMSwgMHgxRUUzLCAweDFFRUQsIDB4MUVFRiwgMHgxRUYwLAorICAgIDB4MUVGMiwgMHgxRUY0LCAweDFFRkMsIDB4MUVGRSwgMHgxRjAwLCAweDFGMDIsCisgICAgMHgxRjA0LCAweDFGMEMsIDB4MUYwRSwgMHgxRjExLCAweDFGMTMsIDB4MUYxRCwKKyAgICAweDFGMUYsIDB4MUYyMCwgMHgxRjIyLCAweDFGMjQsIDB4MUYyQywgMHgxRjJFLAorICAgIDB4MUYzMSwgMHgxRjMzLCAweDFGM0QsIDB4MUYzRiwgMHgxRjQwLCAweDFGNDIsCisgICAgMHgxRjQ0LCAweDFGNEMsIDB4MUY0RSwgMHgxRkMwLCAweDFGQzIsIDB4MUZDNCwKKyAgICAweDFGQ0MsIDB4MUZDRSwgMHgxRkQxLCAweDFGRDMsIDB4MUZERCwgMHgxRkRGLAorICAgIDB4MUZFMCwgMHgxRkUyLCAweDFGRTQsIDB4MUZFQywgMHgxRkVFLCAweDFGRjEsCisgICAgMHgxRkYzLCAweDFGRkQsIDB4MUZGRiwgMHgyMDAwLCAweDIwMDIsIDB4MjAwNCwKKyAgICAweDIwMEMsIDB4MjAwRSwgMHgyMDExLCAweDIwMTMsIDB4MjAxRCwgMHgyMDFGLAorICAgIDB4MjAyMCwgMHgyMDIyLCAweDIwMjQsIDB4MjAyQywgMHgyMDJFLCAweDIwMzEsCisgICAgMHgyMDMzLCAweDIwM0QsIDB4MjAzRiwgMHgyMDQwLCAweDIwNDIsIDB4MjA0NCwKKyAgICAweDIwNEMsIDB4MjA0RSwgMHgyMEMwLCAweDIwQzIsIDB4MjBDNCwgMHgyMENDLAorICAgIDB4MjBDRSwgMHgyMEQxLCAweDIwRDMsIDB4MjBERCwgMHgyMERGLCAweDIwRTAsCisgICAgMHgyMEUyLCAweDIwRTQsIDB4MjBFQywgMHgyMEVFLCAweDIwRjEsIDB4MjBGMywKKyAgICAweDIwRkQsIDB4MjBGRiwgMHgyMTAxLCAweDIxMDMsIDB4MjEwRCwgMHgyMTBGLAorICAgIDB4MjExMCwgMHgyMTEyLCAweDIxMTQsIDB4MjExQywgMHgyMTFFLCAweDIxMjEsCisgICAgMHgyMTIzLCAweDIxMkQsIDB4MjEyRiwgMHgyMTMwLCAweDIxMzIsIDB4MjEzNCwKKyAgICAweDIxM0MsIDB4MjEzRSwgMHgyMTQxLCAweDIxNDMsIDB4MjE0RCwgMHgyMTRGLAorICAgIDB4MjFDMSwgMHgyMUMzLCAweDIxQ0QsIDB4MjFDRiwgMHgyMUQwLCAweDIxRDIsCisgICAgMHgyMUQ0LCAweDIxREMsIDB4MjFERSwgMHgyMUUxLCAweDIxRTMsIDB4MjFFRCwKKyAgICAweDIxRUYsIDB4MjFGMCwgMHgyMUYyLCAweDIxRjQsIDB4MjFGQywgMHgyMUZFLAorICAgIDB4MjIwMCwgMHgyMjAyLCAweDIyMDQsIDB4MjIwQywgMHgyMjBFLCAweDIyMTEsCisgICAgMHgyMjEzLCAweDIyMUQsIDB4MjIxRiwgMHgyMjIwLCAweDIyMjIsIDB4MjIyNCwKKyAgICAweDIyMkMsIDB4MjIyRSwgMHgyMjMxLCAweDIyMzMsIDB4MjIzRCwgMHgyMjNGLAorICAgIDB4MjI0MCwgMHgyMjQyLCAweDIyNDQsIDB4MjI0QywgMHgyMjRFLCAweDIyQzAsCisgICAgMHgyMkMyLCAweDIyQzQsIDB4MjJDQywgMHgyMkNFLCAweDIyRDEsIDB4MjJEMywKKyAgICAweDIyREQsIDB4MjJERiwgMHgyMkUwLCAweDIyRTIsIDB4MjJFNCwgMHgyMkVDLAorICAgIDB4MjJFRSwgMHgyMkYxLCAweDIyRjMsIDB4MjJGRCwgMHgyMkZGLCAweDIzMDEsCisgICAgMHgyMzAzLCAweDIzMEQsIDB4MjMwRiwgMHgyMzEwLCAweDIzMTIsIDB4MjMxNCwKKyAgICAweDIzMUMsIDB4MjMxRSwgMHgyMzIxLCAweDIzMjMsIDB4MjMyRCwgMHgyMzJGLAorICAgIDB4MjMzMCwgMHgyMzMyLCAweDIzMzQsIDB4MjMzQywgMHgyMzNFLCAweDIzNDEsCisgICAgMHgyMzQzLCAweDIzNEQsIDB4MjM0RiwgMHgyM0MxLCAweDIzQzMsIDB4MjNDRCwKKyAgICAweDIzQ0YsIDB4MjNEMCwgMHgyM0QyLCAweDIzRDQsIDB4MjNEQywgMHgyM0RFLAorICAgIDB4MjNFMSwgMHgyM0UzLCAweDIzRUQsIDB4MjNFRiwgMHgyM0YwLCAweDIzRjIsCisgICAgMHgyM0Y0LCAweDIzRkMsIDB4MjNGRSwgMHgyNDAwLCAweDI0MDIsIDB4MjQwNCwKKyAgICAweDI0MEMsIDB4MjQwRSwgMHgyNDExLCAweDI0MTMsIDB4MjQxRCwgMHgyNDFGLAorICAgIDB4MjQyMCwgMHgyNDIyLCAweDI0MjQsIDB4MjQyQywgMHgyNDJFLCAweDI0MzEsCisgICAgMHgyNDMzLCAweDI0M0QsIDB4MjQzRiwgMHgyNDQwLCAweDI0NDIsIDB4MjQ0NCwKKyAgICAweDI0NEMsIDB4MjQ0RSwgMHgyNEMwLCAweDI0QzIsIDB4MjRDNCwgMHgyNENDLAorICAgIDB4MjRDRSwgMHgyNEQxLCAweDI0RDMsIDB4MjRERCwgMHgyNERGLCAweDI0RTAsCisgICAgMHgyNEUyLCAweDI0RTQsIDB4MjRFQywgMHgyNEVFLCAweDI0RjEsIDB4MjRGMywKKyAgICAweDI0RkQsIDB4MjRGRiwgMHgyQzAwLCAweDJDMDIsIDB4MkMwNCwgMHgyQzBDLAorICAgIDB4MkMwRSwgMHgyQzExLCAweDJDMTMsIDB4MkMxRCwgMHgyQzFGLCAweDJDMjAsCisgICAgMHgyQzIyLCAweDJDMjQsIDB4MkMyQywgMHgyQzJFLCAweDJDMzEsIDB4MkMzMywKKyAgICAweDJDM0QsIDB4MkMzRiwgMHgyQzQwLCAweDJDNDIsIDB4MkM0NCwgMHgyQzRDLAorICAgIDB4MkM0RSwgMHgyQ0MwLCAweDJDQzIsIDB4MkNDNCwgMHgyQ0NDLCAweDJDQ0UsCisgICAgMHgyQ0QxLCAweDJDRDMsIDB4MkNERCwgMHgyQ0RGLCAweDJDRTAsIDB4MkNFMiwKKyAgICAweDJDRTQsIDB4MkNFQywgMHgyQ0VFLCAweDJDRjEsIDB4MkNGMywgMHgyQ0ZELAorICAgIDB4MkNGRiwgMHgyRDAxLCAweDJEMDMsIDB4MkQwRCwgMHgyRDBGLCAweDJEMTAsCisgICAgMHgyRDEyLCAweDJEMTQsIDB4MkQxQywgMHgyRDFFLCAweDJEMjEsIDB4MkQyMywKKyAgICAweDJEMkQsIDB4MkQyRiwgMHgyRDMwLCAweDJEMzIsIDB4MkQzNCwgMHgyRDNDLAorICAgIDB4MkQzRSwgMHgyRDQxLCAweDJENDMsIDB4MkQ0RCwgMHgyRDRGLCAweDJEQzEsCisgICAgMHgyREMzLCAweDJEQ0QsIDB4MkRDRiwgMHgyREQwLCAweDJERDIsIDB4MkRENCwKKyAgICAweDJEREMsIDB4MkRERSwgMHgyREUxLCAweDJERTMsIDB4MkRFRCwgMHgyREVGLAorICAgIDB4MkRGMCwgMHgyREYyLCAweDJERjQsIDB4MkRGQywgMHgyREZFLCAweDJFMDAsCisgICAgMHgyRTAyLCAweDJFMDQsIDB4MkUwQywgMHgyRTBFLCAweDJFMTEsIDB4MkUxMywKKyAgICAweDJFMUQsIDB4MkUxRiwgMHgyRTIwLCAweDJFMjIsIDB4MkUyNCwgMHgyRTJDLAorICAgIDB4MkUyRSwgMHgyRTMxLCAweDJFMzMsIDB4MkUzRCwgMHgyRTNGLCAweDJFNDAsCisgICAgMHgyRTQyLCAweDJFNDQsIDB4MkU0QywgMHgyRTRFLCAweDJFQzAsIDB4MkVDMiwKKyAgICAweDJFQzQsIDB4MkVDQywgMHgyRUNFLCAweDJFRDEsIDB4MkVEMywgMHgyRURELAorICAgIDB4MkVERiwgMHgyRUUwLCAweDJFRTIsIDB4MkVFNCwgMHgyRUVDLCAweDJFRUUsCisgICAgMHgyRUYxLCAweDJFRjMsIDB4MkVGRCwgMHgyRUZGLCAweDJGMDEsIDB4MkYwMywKKyAgICAweDJGMEQsIDB4MkYwRiwgMHgyRjEwLCAweDJGMTIsIDB4MkYxNCwgMHgyRjFDLAorICAgIDB4MkYxRSwgMHgyRjIxLCAweDJGMjMsIDB4MkYyRCwgMHgyRjJGLCAweDJGMzAsCisgICAgMHgyRjMyLCAweDJGMzQsIDB4MkYzQywgMHgyRjNFLCAweDJGNDEsIDB4MkY0MywKKyAgICAweDJGNEQsIDB4MkY0RiwgMHgyRkMxLCAweDJGQzMsIDB4MkZDRCwgMHgyRkNGLAorICAgIDB4MkZEMCwgMHgyRkQyLCAweDJGRDQsIDB4MkZEQywgMHgyRkRFLCAweDJGRTEsCisgICAgMHgyRkUzLCAweDJGRUQsIDB4MkZFRiwgMHgyRkYwLCAweDJGRjIsIDB4MkZGNCwKKyAgICAweDJGRkMsIDB4MkZGRSwgMHgzMDAxLCAweDMwMDMsIDB4MzAwRCwgMHgzMDBGLAorICAgIDB4MzAxMCwgMHgzMDEyLCAweDMwMTQsIDB4MzAxQywgMHgzMDFFLCAweDMwMjEsCisgICAgMHgzMDIzLCAweDMwMkQsIDB4MzAyRiwgMHgzMDMwLCAweDMwMzIsIDB4MzAzNCwKKyAgICAweDMwM0MsIDB4MzAzRSwgMHgzMDQxLCAweDMwNDMsIDB4MzA0RCwgMHgzMDRGLAorICAgIDB4MzBDMSwgMHgzMEMzLCAweDMwQ0QsIDB4MzBDRiwgMHgzMEQwLCAweDMwRDIsCisgICAgMHgzMEQ0LCAweDMwREMsIDB4MzBERSwgMHgzMEUxLCAweDMwRTMsIDB4MzBFRCwKKyAgICAweDMwRUYsIDB4MzBGMCwgMHgzMEYyLCAweDMwRjQsIDB4MzBGQywgMHgzMEZFLAorICAgIDB4MzEwMCwgMHgzMTAyLCAweDMxMDQsIDB4MzEwQywgMHgzMTBFLCAweDMxMTEsCisgICAgMHgzMTEzLCAweDMxMUQsIDB4MzExRiwgMHgzMTIwLCAweDMxMjIsIDB4MzEyNCwKKyAgICAweDMxMkMsIDB4MzEyRSwgMHgzMTMxLCAweDMxMzMsIDB4MzEzRCwgMHgzMTNGLAorICAgIDB4MzE0MCwgMHgzMTQyLCAweDMxNDQsIDB4MzE0QywgMHgzMTRFLCAweDMxQzAsCisgICAgMHgzMUMyLCAweDMxQzQsIDB4MzFDQywgMHgzMUNFLCAweDMxRDEsIDB4MzFEMywKKyAgICAweDMxREQsIDB4MzFERiwgMHgzMUUwLCAweDMxRTIsIDB4MzFFNCwgMHgzMUVDLAorICAgIDB4MzFFRSwgMHgzMUYxLCAweDMxRjMsIDB4MzFGRCwgMHgzMUZGLCAweDMyMDEsCisgICAgMHgzMjAzLCAweDMyMEQsIDB4MzIwRiwgMHgzMjEwLCAweDMyMTIsIDB4MzIxNCwKKyAgICAweDMyMUMsIDB4MzIxRSwgMHgzMjIxLCAweDMyMjMsIDB4MzIyRCwgMHgzMjJGLAorICAgIDB4MzIzMCwgMHgzMjMyLCAweDMyMzQsIDB4MzIzQywgMHgzMjNFLCAweDMyNDEsCisgICAgMHgzMjQzLCAweDMyNEQsIDB4MzI0RiwgMHgzMkMxLCAweDMyQzMsIDB4MzJDRCwKKyAgICAweDMyQ0YsIDB4MzJEMCwgMHgzMkQyLCAweDMyRDQsIDB4MzJEQywgMHgzMkRFLAorICAgIDB4MzJFMSwgMHgzMkUzLCAweDMyRUQsIDB4MzJFRiwgMHgzMkYwLCAweDMyRjIsCisgICAgMHgzMkY0LCAweDMyRkMsIDB4MzJGRSwgMHgzMzAwLCAweDMzMDIsIDB4MzMwNCwKKyAgICAweDMzMEMsIDB4MzMwRSwgMHgzMzExLCAweDMzMTMsIDB4MzMxRCwgMHgzMzFGLAorICAgIDB4MzMyMCwgMHgzMzIyLCAweDMzMjQsIDB4MzMyQywgMHgzMzJFLCAweDMzMzEsCisgICAgMHgzMzMzLCAweDMzM0QsIDB4MzMzRiwgMHgzMzQwLCAweDMzNDIsIDB4MzM0NCwKKyAgICAweDMzNEMsIDB4MzM0RSwgMHgzM0MwLCAweDMzQzIsIDB4MzNDNCwgMHgzM0NDLAorICAgIDB4MzNDRSwgMHgzM0QxLCAweDMzRDMsIDB4MzNERCwgMHgzM0RGLCAweDMzRTAsCisgICAgMHgzM0UyLCAweDMzRTQsIDB4MzNFQywgMHgzM0VFLCAweDMzRjEsIDB4MzNGMywKKyAgICAweDMzRkQsIDB4MzNGRiwgMHgzNDAxLCAweDM0MDMsIDB4MzQwRCwgMHgzNDBGLAorICAgIDB4MzQxMCwgMHgzNDEyLCAweDM0MTQsIDB4MzQxQywgMHgzNDFFLCAweDM0MjEsCisgICAgMHgzNDIzLCAweDM0MkQsIDB4MzQyRiwgMHgzNDMwLCAweDM0MzIsIDB4MzQzNCwKKyAgICAweDM0M0MsIDB4MzQzRSwgMHgzNDQxLCAweDM0NDMsIDB4MzQ0RCwgMHgzNDRGLAorICAgIDB4MzRDMSwgMHgzNEMzLCAweDM0Q0QsIDB4MzRDRiwgMHgzNEQwLCAweDM0RDIsCisgICAgMHgzNEQ0LCAweDM0REMsIDB4MzRERSwgMHgzNEUxLCAweDM0RTMsIDB4MzRFRCwKKyAgICAweDM0RUYsIDB4MzRGMCwgMHgzNEYyLCAweDM0RjQsIDB4MzRGQywgMHgzNEZFLAorICAgIDB4M0MwMSwgMHgzQzAzLCAweDNDMEQsIDB4M0MwRiwgMHgzQzEwLCAweDNDMTIsCisgICAgMHgzQzE0LCAweDNDMUMsIDB4M0MxRSwgMHgzQzIxLCAweDNDMjMsIDB4M0MyRCwKKyAgICAweDNDMkYsIDB4M0MzMCwgMHgzQzMyLCAweDNDMzQsIDB4M0MzQywgMHgzQzNFLAorICAgIDB4M0M0MSwgMHgzQzQzLCAweDNDNEQsIDB4M0M0RiwgMHgzQ0MxLCAweDNDQzMsCisgICAgMHgzQ0NELCAweDNDQ0YsIDB4M0NEMCwgMHgzQ0QyLCAweDNDRDQsIDB4M0NEQywKKyAgICAweDNDREUsIDB4M0NFMSwgMHgzQ0UzLCAweDNDRUQsIDB4M0NFRiwgMHgzQ0YwLAorICAgIDB4M0NGMiwgMHgzQ0Y0LCAweDNDRkMsIDB4M0NGRSwgMHgzRDAwLCAweDNEMDIsCisgICAgMHgzRDA0LCAweDNEMEMsIDB4M0QwRSwgMHgzRDExLCAweDNEMTMsIDB4M0QxRCwKKyAgICAweDNEMUYsIDB4M0QyMCwgMHgzRDIyLCAweDNEMjQsIDB4M0QyQywgMHgzRDJFLAorICAgIDB4M0QzMSwgMHgzRDMzLCAweDNEM0QsIDB4M0QzRiwgMHgzRDQwLCAweDNENDIsCisgICAgMHgzRDQ0LCAweDNENEMsIDB4M0Q0RSwgMHgzREMwLCAweDNEQzIsIDB4M0RDNCwKKyAgICAweDNEQ0MsIDB4M0RDRSwgMHgzREQxLCAweDNERDMsIDB4M0RERCwgMHgzRERGLAorICAgIDB4M0RFMCwgMHgzREUyLCAweDNERTQsIDB4M0RFQywgMHgzREVFLCAweDNERjEsCisgICAgMHgzREYzLCAweDNERkQsIDB4M0RGRiwgMHgzRTAxLCAweDNFMDMsIDB4M0UwRCwKKyAgICAweDNFMEYsIDB4M0UxMCwgMHgzRTEyLCAweDNFMTQsIDB4M0UxQywgMHgzRTFFLAorICAgIDB4M0UyMSwgMHgzRTIzLCAweDNFMkQsIDB4M0UyRiwgMHgzRTMwLCAweDNFMzIsCisgICAgMHgzRTM0LCAweDNFM0MsIDB4M0UzRSwgMHgzRTQxLCAweDNFNDMsIDB4M0U0RCwKKyAgICAweDNFNEYsIDB4M0VDMSwgMHgzRUMzLCAweDNFQ0QsIDB4M0VDRiwgMHgzRUQwLAorICAgIDB4M0VEMiwgMHgzRUQ0LCAweDNFREMsIDB4M0VERSwgMHgzRUUxLCAweDNFRTMsCisgICAgMHgzRUVELCAweDNFRUYsIDB4M0VGMCwgMHgzRUYyLCAweDNFRjQsIDB4M0VGQywKKyAgICAweDNFRkUsIDB4M0YwMCwgMHgzRjAyLCAweDNGMDQsIDB4M0YwQywgMHgzRjBFLAorICAgIDB4M0YxMSwgMHgzRjEzLCAweDNGMUQsIDB4M0YxRiwgMHgzRjIwLCAweDNGMjIsCisgICAgMHgzRjI0LCAweDNGMkMsIDB4M0YyRSwgMHgzRjMxLCAweDNGMzMsIDB4M0YzRCwKKyAgICAweDNGM0YsIDB4M0Y0MCwgMHgzRjQyLCAweDNGNDQsIDB4M0Y0QywgMHgzRjRFLAorICAgIDB4M0ZDMCwgMHgzRkMyLCAweDNGQzQsIDB4M0ZDQywgMHgzRkNFLCAweDNGRDEsCisgICAgMHgzRkQzLCAweDNGREQsIDB4M0ZERiwgMHgzRkUwLCAweDNGRTIsIDB4M0ZFNCwKKyAgICAweDNGRUMsIDB4M0ZFRSwgMHgzRkYxLCAweDNGRjMsIDB4M0ZGRCwgMHgzRkZGLAorICAgIDB4NDAwMCwgMHg0MDAyLCAweDQwMDQsIDB4NDAwQywgMHg0MDBFLCAweDQwMTEsCisgICAgMHg0MDEzLCAweDQwMUQsIDB4NDAxRiwgMHg0MDIwLCAweDQwMjIsIDB4NDAyNCwKKyAgICAweDQwMkMsIDB4NDAyRSwgMHg0MDMxLCAweDQwMzMsIDB4NDAzRCwgMHg0MDNGLAorICAgIDB4NDA0MCwgMHg0MDQyLCAweDQwNDQsIDB4NDA0QywgMHg0MDRFLCAweDQwQzAsCisgICAgMHg0MEMyLCAweDQwQzQsIDB4NDBDQywgMHg0MENFLCAweDQwRDEsIDB4NDBEMywKKyAgICAweDQwREQsIDB4NDBERiwgMHg0MEUwLCAweDQwRTIsIDB4NDBFNCwgMHg0MEVDLAorICAgIDB4NDBFRSwgMHg0MEYxLCAweDQwRjMsIDB4NDBGRCwgMHg0MEZGLCAweDQxMDEsCisgICAgMHg0MTAzLCAweDQxMEQsIDB4NDEwRiwgMHg0MTEwLCAweDQxMTIsIDB4NDExNCwKKyAgICAweDQxMUMsIDB4NDExRSwgMHg0MTIxLCAweDQxMjMsIDB4NDEyRCwgMHg0MTJGLAorICAgIDB4NDEzMCwgMHg0MTMyLCAweDQxMzQsIDB4NDEzQywgMHg0MTNFLCAweDQxNDEsCisgICAgMHg0MTQzLCAweDQxNEQsIDB4NDE0RiwgMHg0MUMxLCAweDQxQzMsIDB4NDFDRCwKKyAgICAweDQxQ0YsIDB4NDFEMCwgMHg0MUQyLCAweDQxRDQsIDB4NDFEQywgMHg0MURFLAorICAgIDB4NDFFMSwgMHg0MUUzLCAweDQxRUQsIDB4NDFFRiwgMHg0MUYwLCAweDQxRjIsCisgICAgMHg0MUY0LCAweDQxRkMsIDB4NDFGRSwgMHg0MjAwLCAweDQyMDIsIDB4NDIwNCwKKyAgICAweDQyMEMsIDB4NDIwRSwgMHg0MjExLCAweDQyMTMsIDB4NDIxRCwgMHg0MjFGLAorICAgIDB4NDIyMCwgMHg0MjIyLCAweDQyMjQsIDB4NDIyQywgMHg0MjJFLCAweDQyMzEsCisgICAgMHg0MjMzLCAweDQyM0QsIDB4NDIzRiwgMHg0MjQwLCAweDQyNDIsIDB4NDI0NCwKKyAgICAweDQyNEMsIDB4NDI0RSwgMHg0MkMwLCAweDQyQzIsIDB4NDJDNCwgMHg0MkNDLAorICAgIDB4NDJDRSwgMHg0MkQxLCAweDQyRDMsIDB4NDJERCwgMHg0MkRGLCAweDQyRTAsCisgICAgMHg0MkUyLCAweDQyRTQsIDB4NDJFQywgMHg0MkVFLCAweDQyRjEsIDB4NDJGMywKKyAgICAweDQyRkQsIDB4NDJGRiwgMHg0MzAxLCAweDQzMDMsIDB4NDMwRCwgMHg0MzBGLAorICAgIDB4NDMxMCwgMHg0MzEyLCAweDQzMTQsIDB4NDMxQywgMHg0MzFFLCAweDQzMjEsCisgICAgMHg0MzIzLCAweDQzMkQsIDB4NDMyRiwgMHg0MzMwLCAweDQzMzIsIDB4NDMzNCwKKyAgICAweDQzM0MsIDB4NDMzRSwgMHg0MzQxLCAweDQzNDMsIDB4NDM0RCwgMHg0MzRGLAorICAgIDB4NDNDMSwgMHg0M0MzLCAweDQzQ0QsIDB4NDNDRiwgMHg0M0QwLCAweDQzRDIsCisgICAgMHg0M0Q0LCAweDQzREMsIDB4NDNERSwgMHg0M0UxLCAweDQzRTMsIDB4NDNFRCwKKyAgICAweDQzRUYsIDB4NDNGMCwgMHg0M0YyLCAweDQzRjQsIDB4NDNGQywgMHg0M0ZFLAorICAgIDB4NDQwMCwgMHg0NDAyLCAweDQ0MDQsIDB4NDQwQywgMHg0NDBFLCAweDQ0MTEsCisgICAgMHg0NDEzLCAweDQ0MUQsIDB4NDQxRiwgMHg0NDIwLCAweDQ0MjIsIDB4NDQyNCwKKyAgICAweDQ0MkMsIDB4NDQyRSwgMHg0NDMxLCAweDQ0MzMsIDB4NDQzRCwgMHg0NDNGLAorICAgIDB4NDQ0MCwgMHg0NDQyLCAweDQ0NDQsIDB4NDQ0QywgMHg0NDRFLCAweDQ0QzAsCisgICAgMHg0NEMyLCAweDQ0QzQsIDB4NDRDQywgMHg0NENFLCAweDQ0RDEsIDB4NDREMywKKyAgICAweDQ0REQsIDB4NDRERiwgMHg0NEUwLCAweDQ0RTIsIDB4NDRFNCwgMHg0NEVDLAorICAgIDB4NDRFRSwgMHg0NEYxLCAweDQ0RjMsIDB4NDRGRCwgMHg0NEZGLCAweDRDMDAsCisgICAgMHg0QzAyLCAweDRDMDQsIDB4NEMwQywgMHg0QzBFLCAweDRDMTEsIDB4NEMxMywKKyAgICAweDRDMUQsIDB4NEMxRiwgMHg0QzIwLCAweDRDMjIsIDB4NEMyNCwgMHg0QzJDLAorICAgIDB4NEMyRSwgMHg0QzMxLCAweDRDMzMsIDB4NEMzRCwgMHg0QzNGLCAweDRDNDAsCisgICAgMHg0QzQyLCAweDRDNDQsIDB4NEM0QywgMHg0QzRFLCAweDRDQzAsIDB4NENDMiwKKyAgICAweDRDQzQsIDB4NENDQywgMHg0Q0NFLCAweDRDRDEsIDB4NENEMywgMHg0Q0RELAorICAgIDB4NENERiwgMHg0Q0UwLCAweDRDRTIsIDB4NENFNCwgMHg0Q0VDLCAweDRDRUUsCisgICAgMHg0Q0YxLCAweDRDRjMsIDB4NENGRCwgMHg0Q0ZGLCAweDREMDEsIDB4NEQwMywKKyAgICAweDREMEQsIDB4NEQwRiwgMHg0RDEwLCAweDREMTIsIDB4NEQxNCwgMHg0RDFDLAorICAgIDB4NEQxRSwgMHg0RDIxLCAweDREMjMsIDB4NEQyRCwgMHg0RDJGLCAweDREMzAsCisgICAgMHg0RDMyLCAweDREMzQsIDB4NEQzQywgMHg0RDNFLCAweDRENDEsIDB4NEQ0MywKKyAgICAweDRENEQsIDB4NEQ0RiwgMHg0REMxLCAweDREQzMsIDB4NERDRCwgMHg0RENGLAorICAgIDB4NEREMCwgMHg0REQyLCAweDRERDQsIDB4NEREQywgMHg0RERFLCAweDRERTEsCisgICAgMHg0REUzLCAweDRERUQsIDB4NERFRiwgMHg0REYwLCAweDRERjIsIDB4NERGNCwKKyAgICAweDRERkMsIDB4NERGRSwgMHg0RTAwLCAweDRFMDIsIDB4NEUwNCwgMHg0RTBDLAorICAgIDB4NEUwRSwgMHg0RTExLCAweDRFMTMsIDB4NEUxRCwgMHg0RTFGLCAweDRFMjAsCisgICAgMHg0RTIyLCAweDRFMjQsIDB4NEUyQywgMHg0RTJFLCAweDRFMzEsIDB4NEUzMywKKyAgICAweDRFM0QsIDB4NEUzRiwgMHg0RTQwLCAweDRFNDIsIDB4NEU0NCwgMHg0RTRDLAorICAgIDB4NEU0RSwgMHg0RUMwLCAweDRFQzIsIDB4NEVDNCwgMHg0RUNDLCAweDRFQ0UsCisgICAgMHg0RUQxLCAweDRFRDMsIDB4NEVERCwgMHg0RURGLCAweDRFRTAsIDB4NEVFMiwKKyAgICAweDRFRTQsIDB4NEVFQywgMHg0RUVFLCAweDRFRjEsIDB4NEVGMywgMHg0RUZELAorICAgIDB4NEVGRiwgMHg0RjAxLCAweDRGMDMsIDB4NEYwRCwgMHg0RjBGLCAweDRGMTAsCisgICAgMHg0RjEyLCAweDRGMTQsIDB4NEYxQywgMHg0RjFFLCAweDRGMjEsIDB4NEYyMywKKyAgICAweDRGMkQsIDB4NEYyRiwgMHg0RjMwLCAweDRGMzIsIDB4NEYzNCwgMHg0RjNDLAorICAgIDB4NEYzRSwgMHg0RjQxLCAweDRGNDMsIDB4NEY0RCwgMHg0RjRGLCAweDRGQzEsCisgICAgMHg0RkMzLCAweDRGQ0QsIDB4NEZDRiwgMHg0RkQwLCAweDRGRDIsIDB4NEZENCwKKyAgICAweDRGREMsIDB4NEZERSwgMHg0RkUxLCAweDRGRTMsIDB4NEZFRCwgMHg0RkVGLAorICAgIDB4NEZGMCwgMHg0RkYyLCAweDRGRjQsIDB4NEZGQywgMHg0RkZFLCAweEMwMDAsCisgICAgMHhDMDAyLCAweEMwMDQsIDB4QzAwQywgMHhDMDBFLCAweEMwMTEsIDB4QzAxMywKKyAgICAweEMwMUQsIDB4QzAxRiwgMHhDMDIwLCAweEMwMjIsIDB4QzAyNCwgMHhDMDJDLAorICAgIDB4QzAyRSwgMHhDMDMxLCAweEMwMzMsIDB4QzAzRCwgMHhDMDNGLCAweEMwNDAsCisgICAgMHhDMDQyLCAweEMwNDQsIDB4QzA0QywgMHhDMDRFLCAweEMwQzAsIDB4QzBDMiwKKyAgICAweEMwQzQsIDB4QzBDQywgMHhDMENFLCAweEMwRDEsIDB4QzBEMywgMHhDMERELAorICAgIDB4QzBERiwgMHhDMEUwLCAweEMwRTIsIDB4QzBFNCwgMHhDMEVDLCAweEMwRUUsCisgICAgMHhDMEYxLCAweEMwRjMsIDB4QzBGRCwgMHhDMEZGLCAweEMxMDEsIDB4QzEwMywKKyAgICAweEMxMEQsIDB4QzEwRiwgMHhDMTEwLCAweEMxMTIsIDB4QzExNCwgMHhDMTFDLAorICAgIDB4QzExRSwgMHhDMTIxLCAweEMxMjMsIDB4QzEyRCwgMHhDMTJGLCAweEMxMzAsCisgICAgMHhDMTMyLCAweEMxMzQsIDB4QzEzQywgMHhDMTNFLCAweEMxNDEsIDB4QzE0MywKKyAgICAweEMxNEQsIDB4QzE0RiwgMHhDMUMxLCAweEMxQzMsIDB4QzFDRCwgMHhDMUNGLAorICAgIDB4QzFEMCwgMHhDMUQyLCAweEMxRDQsIDB4QzFEQywgMHhDMURFLCAweEMxRTEsCisgICAgMHhDMUUzLCAweEMxRUQsIDB4QzFFRiwgMHhDMUYwLCAweEMxRjIsIDB4QzFGNCwKKyAgICAweEMxRkMsIDB4QzFGRSwgMHhDMjAwLCAweEMyMDIsIDB4QzIwNCwgMHhDMjBDLAorICAgIDB4QzIwRSwgMHhDMjExLCAweEMyMTMsIDB4QzIxRCwgMHhDMjFGLCAweEMyMjAsCisgICAgMHhDMjIyLCAweEMyMjQsIDB4QzIyQywgMHhDMjJFLCAweEMyMzEsIDB4QzIzMywKKyAgICAweEMyM0QsIDB4QzIzRiwgMHhDMjQwLCAweEMyNDIsIDB4QzI0NCwgMHhDMjRDLAorICAgIDB4QzI0RSwgMHhDMkMwLCAweEMyQzIsIDB4QzJDNCwgMHhDMkNDLCAweEMyQ0UsCisgICAgMHhDMkQxLCAweEMyRDMsIDB4QzJERCwgMHhDMkRGLCAweEMyRTAsIDB4QzJFMiwKKyAgICAweEMyRTQsIDB4QzJFQywgMHhDMkVFLCAweEMyRjEsIDB4QzJGMywgMHhDMkZELAorICAgIDB4QzJGRiwgMHhDMzAxLCAweEMzMDMsIDB4QzMwRCwgMHhDMzBGLCAweEMzMTAsCisgICAgMHhDMzEyLCAweEMzMTQsIDB4QzMxQywgMHhDMzFFLCAweEMzMjEsIDB4QzMyMywKKyAgICAweEMzMkQsIDB4QzMyRiwgMHhDMzMwLCAweEMzMzIsIDB4QzMzNCwgMHhDMzNDLAorICAgIDB4QzMzRSwgMHhDMzQxLCAweEMzNDMsIDB4QzM0RCwgMHhDMzRGLCAweEMzQzEsCisgICAgMHhDM0MzLCAweEMzQ0QsIDB4QzNDRiwgMHhDM0QwLCAweEMzRDIsIDB4QzNENCwKKyAgICAweEMzREMsIDB4QzNERSwgMHhDM0UxLCAweEMzRTMsIDB4QzNFRCwgMHhDM0VGLAorICAgIDB4QzNGMCwgMHhDM0YyLCAweEMzRjQsIDB4QzNGQywgMHhDM0ZFLCAweEM0MDAsCisgICAgMHhDNDAyLCAweEM0MDQsIDB4QzQwQywgMHhDNDBFLCAweEM0MTEsIDB4QzQxMywKKyAgICAweEM0MUQsIDB4QzQxRiwgMHhDNDIwLCAweEM0MjIsIDB4QzQyNCwgMHhDNDJDLAorICAgIDB4QzQyRSwgMHhDNDMxLCAweEM0MzMsIDB4QzQzRCwgMHhDNDNGLCAweEM0NDAsCisgICAgMHhDNDQyLCAweEM0NDQsIDB4QzQ0QywgMHhDNDRFLCAweEM0QzAsIDB4QzRDMiwKKyAgICAweEM0QzQsIDB4QzRDQywgMHhDNENFLCAweEM0RDEsIDB4QzREMywgMHhDNERELAorICAgIDB4QzRERiwgMHhDNEUwLCAweEM0RTIsIDB4QzRFNCwgMHhDNEVDLCAweEM0RUUsCisgICAgMHhDNEYxLCAweEM0RjMsIDB4QzRGRCwgMHhDNEZGLCAweENDMDAsIDB4Q0MwMiwKKyAgICAweENDMDQsIDB4Q0MwQywgMHhDQzBFLCAweENDMTEsIDB4Q0MxMywgMHhDQzFELAorICAgIDB4Q0MxRiwgMHhDQzIwLCAweENDMjIsIDB4Q0MyNCwgMHhDQzJDLCAweENDMkUsCisgICAgMHhDQzMxLCAweENDMzMsIDB4Q0MzRCwgMHhDQzNGLCAweENDNDAsIDB4Q0M0MiwKKyAgICAweENDNDQsIDB4Q0M0QywgMHhDQzRFLCAweENDQzAsIDB4Q0NDMiwgMHhDQ0M0LAorICAgIDB4Q0NDQywgMHhDQ0NFLCAweENDRDEsIDB4Q0NEMywgMHhDQ0RELCAweENDREYsCisgICAgMHhDQ0UwLCAweENDRTIsIDB4Q0NFNCwgMHhDQ0VDLCAweENDRUUsIDB4Q0NGMSwKKyAgICAweENDRjMsIDB4Q0NGRCwgMHhDQ0ZGLCAweENEMDEsIDB4Q0QwMywgMHhDRDBELAorICAgIDB4Q0QwRiwgMHhDRDEwLCAweENEMTIsIDB4Q0QxNCwgMHhDRDFDLCAweENEMUUsCisgICAgMHhDRDIxLCAweENEMjMsIDB4Q0QyRCwgMHhDRDJGLCAweENEMzAsIDB4Q0QzMiwKKyAgICAweENEMzQsIDB4Q0QzQywgMHhDRDNFLCAweENENDEsIDB4Q0Q0MywgMHhDRDRELAorICAgIDB4Q0Q0RiwgMHhDREMxLCAweENEQzMsIDB4Q0RDRCwgMHhDRENGLCAweENERDAsCisgICAgMHhDREQyLCAweENERDQsIDB4Q0REQywgMHhDRERFLCAweENERTEsIDB4Q0RFMywKKyAgICAweENERUQsIDB4Q0RFRiwgMHhDREYwLCAweENERjIsIDB4Q0RGNCwgMHhDREZDLAorICAgIDB4Q0RGRSwgMHhDRTAwLCAweENFMDIsIDB4Q0UwNCwgMHhDRTBDLCAweENFMEUsCisgICAgMHhDRTExLCAweENFMTMsIDB4Q0UxRCwgMHhDRTFGLCAweENFMjAsIDB4Q0UyMiwKKyAgICAweENFMjQsIDB4Q0UyQywgMHhDRTJFLCAweENFMzEsIDB4Q0UzMywgMHhDRTNELAorICAgIDB4Q0UzRiwgMHhDRTQwLCAweENFNDIsIDB4Q0U0NCwgMHhDRTRDLCAweENFNEUsCisgICAgMHhDRUMwLCAweENFQzIsIDB4Q0VDNCwgMHhDRUNDLCAweENFQ0UsIDB4Q0VEMSwKKyAgICAweENFRDMsIDB4Q0VERCwgMHhDRURGLCAweENFRTAsIDB4Q0VFMiwgMHhDRUU0LAorICAgIDB4Q0VFQywgMHhDRUVFLCAweENFRjEsIDB4Q0VGMywgMHhDRUZELCAweENFRkYsCisgICAgMHhDRjAxLCAweENGMDMsIDB4Q0YwRCwgMHhDRjBGLCAweENGMTAsIDB4Q0YxMiwKKyAgICAweENGMTQsIDB4Q0YxQywgMHhDRjFFLCAweENGMjEsIDB4Q0YyMywgMHhDRjJELAorICAgIDB4Q0YyRiwgMHhDRjMwLCAweENGMzIsIDB4Q0YzNCwgMHhDRjNDLCAweENGM0UsCisgICAgMHhDRjQxLCAweENGNDMsIDB4Q0Y0RCwgMHhDRjRGLCAweENGQzEsIDB4Q0ZDMywKKyAgICAweENGQ0QsIDB4Q0ZDRiwgMHhDRkQwLCAweENGRDIsIDB4Q0ZENCwgMHhDRkRDLAorICAgIDB4Q0ZERSwgMHhDRkUxLCAweENGRTMsIDB4Q0ZFRCwgMHhDRkVGLCAweENGRjAsCisgICAgMHhDRkYyLCAweENGRjQsIDB4Q0ZGQywgMHhDRkZFLCAweEQwMDEsIDB4RDAwMywKKyAgICAweEQwMEQsIDB4RDAwRiwgMHhEMDEwLCAweEQwMTIsIDB4RDAxNCwgMHhEMDFDLAorICAgIDB4RDAxRSwgMHhEMDIxLCAweEQwMjMsIDB4RDAyRCwgMHhEMDJGLCAweEQwMzAsCisgICAgMHhEMDMyLCAweEQwMzQsIDB4RDAzQywgMHhEMDNFLCAweEQwNDEsIDB4RDA0MywKKyAgICAweEQwNEQsIDB4RDA0RiwgMHhEMEMxLCAweEQwQzMsIDB4RDBDRCwgMHhEMENGLAorICAgIDB4RDBEMCwgMHhEMEQyLCAweEQwRDQsIDB4RDBEQywgMHhEMERFLCAweEQwRTEsCisgICAgMHhEMEUzLCAweEQwRUQsIDB4RDBFRiwgMHhEMEYwLCAweEQwRjIsIDB4RDBGNCwKKyAgICAweEQwRkMsIDB4RDBGRSwgMHhEMTAwLCAweEQxMDIsIDB4RDEwNCwgMHhEMTBDLAorICAgIDB4RDEwRSwgMHhEMTExLCAweEQxMTMsIDB4RDExRCwgMHhEMTFGLCAweEQxMjAsCisgICAgMHhEMTIyLCAweEQxMjQsIDB4RDEyQywgMHhEMTJFLCAweEQxMzEsIDB4RDEzMywKKyAgICAweEQxM0QsIDB4RDEzRiwgMHhEMTQwLCAweEQxNDIsIDB4RDE0NCwgMHhEMTRDLAorICAgIDB4RDE0RSwgMHhEMUMwLCAweEQxQzIsIDB4RDFDNCwgMHhEMUNDLCAweEQxQ0UsCisgICAgMHhEMUQxLCAweEQxRDMsIDB4RDFERCwgMHhEMURGLCAweEQxRTAsIDB4RDFFMiwKKyAgICAweEQxRTQsIDB4RDFFQywgMHhEMUVFLCAweEQxRjEsIDB4RDFGMywgMHhEMUZELAorICAgIDB4RDFGRiwgMHhEMjAxLCAweEQyMDMsIDB4RDIwRCwgMHhEMjBGLCAweEQyMTAsCisgICAgMHhEMjEyLCAweEQyMTQsIDB4RDIxQywgMHhEMjFFLCAweEQyMjEsIDB4RDIyMywKKyAgICAweEQyMkQsIDB4RDIyRiwgMHhEMjMwLCAweEQyMzIsIDB4RDIzNCwgMHhEMjNDLAorICAgIDB4RDIzRSwgMHhEMjQxLCAweEQyNDMsIDB4RDI0RCwgMHhEMjRGLCAweEQyQzEsCisgICAgMHhEMkMzLCAweEQyQ0QsIDB4RDJDRiwgMHhEMkQwLCAweEQyRDIsIDB4RDJENCwKKyAgICAweEQyREMsIDB4RDJERSwgMHhEMkUxLCAweEQyRTMsIDB4RDJFRCwgMHhEMkVGLAorICAgIDB4RDJGMCwgMHhEMkYyLCAweEQyRjQsIDB4RDJGQywgMHhEMkZFLCAweEQzMDAsCisgICAgMHhEMzAyLCAweEQzMDQsIDB4RDMwQywgMHhEMzBFLCAweEQzMTEsIDB4RDMxMywKKyAgICAweEQzMUQsIDB4RDMxRiwgMHhEMzIwLCAweEQzMjIsIDB4RDMyNCwgMHhEMzJDLAorICAgIDB4RDMyRSwgMHhEMzMxLCAweEQzMzMsIDB4RDMzRCwgMHhEMzNGLCAweEQzNDAsCisgICAgMHhEMzQyLCAweEQzNDQsIDB4RDM0QywgMHhEMzRFLCAweEQzQzAsIDB4RDNDMiwKKyAgICAweEQzQzQsIDB4RDNDQywgMHhEM0NFLCAweEQzRDEsIDB4RDNEMywgMHhEM0RELAorICAgIDB4RDNERiwgMHhEM0UwLCAweEQzRTIsIDB4RDNFNCwgMHhEM0VDLCAweEQzRUUsCisgICAgMHhEM0YxLCAweEQzRjMsIDB4RDNGRCwgMHhEM0ZGLCAweEQ0MDEsIDB4RDQwMywKKyAgICAweEQ0MEQsIDB4RDQwRiwgMHhENDEwLCAweEQ0MTIsIDB4RDQxNCwgMHhENDFDLAorICAgIDB4RDQxRSwgMHhENDIxLCAweEQ0MjMsIDB4RDQyRCwgMHhENDJGLCAweEQ0MzAsCisgICAgMHhENDMyLCAweEQ0MzQsIDB4RDQzQywgMHhENDNFLCAweEQ0NDEsIDB4RDQ0MywKKyAgICAweEQ0NEQsIDB4RDQ0RiwgMHhENEMxLCAweEQ0QzMsIDB4RDRDRCwgMHhENENGLAorICAgIDB4RDREMCwgMHhENEQyLCAweEQ0RDQsIDB4RDREQywgMHhENERFLCAweEQ0RTEsCisgICAgMHhENEUzLCAweEQ0RUQsIDB4RDRFRiwgMHhENEYwLCAweEQ0RjIsIDB4RDRGNCwKKyAgICAweEQ0RkMsIDB4RDRGRSwgMHhEQzAxLCAweERDMDMsIDB4REMwRCwgMHhEQzBGLAorICAgIDB4REMxMCwgMHhEQzEyLCAweERDMTQsIDB4REMxQywgMHhEQzFFLCAweERDMjEsCisgICAgMHhEQzIzLCAweERDMkQsIDB4REMyRiwgMHhEQzMwLCAweERDMzIsIDB4REMzNCwKKyAgICAweERDM0MsIDB4REMzRSwgMHhEQzQxLCAweERDNDMsIDB4REM0RCwgMHhEQzRGLAorICAgIDB4RENDMSwgMHhEQ0MzLCAweERDQ0QsIDB4RENDRiwgMHhEQ0QwLCAweERDRDIsCisgICAgMHhEQ0Q0LCAweERDREMsIDB4RENERSwgMHhEQ0UxLCAweERDRTMsIDB4RENFRCwKKyAgICAweERDRUYsIDB4RENGMCwgMHhEQ0YyLCAweERDRjQsIDB4RENGQywgMHhEQ0ZFLAorICAgIDB4REQwMCwgMHhERDAyLCAweEREMDQsIDB4REQwQywgMHhERDBFLCAweEREMTEsCisgICAgMHhERDEzLCAweEREMUQsIDB4REQxRiwgMHhERDIwLCAweEREMjIsIDB4REQyNCwKKyAgICAweEREMkMsIDB4REQyRSwgMHhERDMxLCAweEREMzMsIDB4REQzRCwgMHhERDNGLAorICAgIDB4REQ0MCwgMHhERDQyLCAweERENDQsIDB4REQ0QywgMHhERDRFLCAweEREQzAsCisgICAgMHhEREMyLCAweEREQzQsIDB4RERDQywgMHhERENFLCAweERERDEsIDB4REREMywKKyAgICAweEREREQsIDB4RERERiwgMHhEREUwLCAweERERTIsIDB4RERFNCwgMHhEREVDLAorICAgIDB4RERFRSwgMHhEREYxLCAweERERjMsIDB4RERGRCwgMHhEREZGLCAweERFMDEsCisgICAgMHhERTAzLCAweERFMEQsIDB4REUwRiwgMHhERTEwLCAweERFMTIsIDB4REUxNCwKKyAgICAweERFMUMsIDB4REUxRSwgMHhERTIxLCAweERFMjMsIDB4REUyRCwgMHhERTJGLAorICAgIDB4REUzMCwgMHhERTMyLCAweERFMzQsIDB4REUzQywgMHhERTNFLCAweERFNDEsCisgICAgMHhERTQzLCAweERFNEQsIDB4REU0RiwgMHhERUMxLCAweERFQzMsIDB4REVDRCwKKyAgICAweERFQ0YsIDB4REVEMCwgMHhERUQyLCAweERFRDQsIDB4REVEQywgMHhERURFLAorICAgIDB4REVFMSwgMHhERUUzLCAweERFRUQsIDB4REVFRiwgMHhERUYwLCAweERFRjIsCisgICAgMHhERUY0LCAweERFRkMsIDB4REVGRSwgMHhERjAwLCAweERGMDIsIDB4REYwNCwKKyAgICAweERGMEMsIDB4REYwRSwgMHhERjExLCAweERGMTMsIDB4REYxRCwgMHhERjFGLAorICAgIDB4REYyMCwgMHhERjIyLCAweERGMjQsIDB4REYyQywgMHhERjJFLCAweERGMzEsCisgICAgMHhERjMzLCAweERGM0QsIDB4REYzRiwgMHhERjQwLCAweERGNDIsIDB4REY0NCwKKyAgICAweERGNEMsIDB4REY0RSwgMHhERkMwLCAweERGQzIsIDB4REZDNCwgMHhERkNDLAorICAgIDB4REZDRSwgMHhERkQxLCAweERGRDMsIDB4REZERCwgMHhERkRGLCAweERGRTAsCisgICAgMHhERkUyLCAweERGRTQsIDB4REZFQywgMHhERkVFLCAweERGRjEsIDB4REZGMywKKyAgICAweERGRkQsIDB4REZGRiwgMHhFMDAwLCAweEUwMDIsIDB4RTAwNCwgMHhFMDBDLAorICAgIDB4RTAwRSwgMHhFMDExLCAweEUwMTMsIDB4RTAxRCwgMHhFMDFGLCAweEUwMjAsCisgICAgMHhFMDIyLCAweEUwMjQsIDB4RTAyQywgMHhFMDJFLCAweEUwMzEsIDB4RTAzMywKKyAgICAweEUwM0QsIDB4RTAzRiwgMHhFMDQwLCAweEUwNDIsIDB4RTA0NCwgMHhFMDRDLAorICAgIDB4RTA0RSwgMHhFMEMwLCAweEUwQzIsIDB4RTBDNCwgMHhFMENDLCAweEUwQ0UsCisgICAgMHhFMEQxLCAweEUwRDMsIDB4RTBERCwgMHhFMERGLCAweEUwRTAsIDB4RTBFMiwKKyAgICAweEUwRTQsIDB4RTBFQywgMHhFMEVFLCAweEUwRjEsIDB4RTBGMywgMHhFMEZELAorICAgIDB4RTBGRiwgMHhFMTAxLCAweEUxMDMsIDB4RTEwRCwgMHhFMTBGLCAweEUxMTAsCisgICAgMHhFMTEyLCAweEUxMTQsIDB4RTExQywgMHhFMTFFLCAweEUxMjEsIDB4RTEyMywKKyAgICAweEUxMkQsIDB4RTEyRiwgMHhFMTMwLCAweEUxMzIsIDB4RTEzNCwgMHhFMTNDLAorICAgIDB4RTEzRSwgMHhFMTQxLCAweEUxNDMsIDB4RTE0RCwgMHhFMTRGLCAweEUxQzEsCisgICAgMHhFMUMzLCAweEUxQ0QsIDB4RTFDRiwgMHhFMUQwLCAweEUxRDIsIDB4RTFENCwKKyAgICAweEUxREMsIDB4RTFERSwgMHhFMUUxLCAweEUxRTMsIDB4RTFFRCwgMHhFMUVGLAorICAgIDB4RTFGMCwgMHhFMUYyLCAweEUxRjQsIDB4RTFGQywgMHhFMUZFLCAweEUyMDAsCisgICAgMHhFMjAyLCAweEUyMDQsIDB4RTIwQywgMHhFMjBFLCAweEUyMTEsIDB4RTIxMywKKyAgICAweEUyMUQsIDB4RTIxRiwgMHhFMjIwLCAweEUyMjIsIDB4RTIyNCwgMHhFMjJDLAorICAgIDB4RTIyRSwgMHhFMjMxLCAweEUyMzMsIDB4RTIzRCwgMHhFMjNGLCAweEUyNDAsCisgICAgMHhFMjQyLCAweEUyNDQsIDB4RTI0QywgMHhFMjRFLCAweEUyQzAsIDB4RTJDMiwKKyAgICAweEUyQzQsIDB4RTJDQywgMHhFMkNFLCAweEUyRDEsIDB4RTJEMywgMHhFMkRELAorICAgIDB4RTJERiwgMHhFMkUwLCAweEUyRTIsIDB4RTJFNCwgMHhFMkVDLCAweEUyRUUsCisgICAgMHhFMkYxLCAweEUyRjMsIDB4RTJGRCwgMHhFMkZGLCAweEUzMDEsIDB4RTMwMywKKyAgICAweEUzMEQsIDB4RTMwRiwgMHhFMzEwLCAweEUzMTIsIDB4RTMxNCwgMHhFMzFDLAorICAgIDB4RTMxRSwgMHhFMzIxLCAweEUzMjMsIDB4RTMyRCwgMHhFMzJGLCAweEUzMzAsCisgICAgMHhFMzMyLCAweEUzMzQsIDB4RTMzQywgMHhFMzNFLCAweEUzNDEsIDB4RTM0MywKKyAgICAweEUzNEQsIDB4RTM0RiwgMHhFM0MxLCAweEUzQzMsIDB4RTNDRCwgMHhFM0NGLAorICAgIDB4RTNEMCwgMHhFM0QyLCAweEUzRDQsIDB4RTNEQywgMHhFM0RFLCAweEUzRTEsCisgICAgMHhFM0UzLCAweEUzRUQsIDB4RTNFRiwgMHhFM0YwLCAweEUzRjIsIDB4RTNGNCwKKyAgICAweEUzRkMsIDB4RTNGRSwgMHhFNDAwLCAweEU0MDIsIDB4RTQwNCwgMHhFNDBDLAorICAgIDB4RTQwRSwgMHhFNDExLCAweEU0MTMsIDB4RTQxRCwgMHhFNDFGLCAweEU0MjAsCisgICAgMHhFNDIyLCAweEU0MjQsIDB4RTQyQywgMHhFNDJFLCAweEU0MzEsIDB4RTQzMywKKyAgICAweEU0M0QsIDB4RTQzRiwgMHhFNDQwLCAweEU0NDIsIDB4RTQ0NCwgMHhFNDRDLAorICAgIDB4RTQ0RSwgMHhFNEMwLCAweEU0QzIsIDB4RTRDNCwgMHhFNENDLCAweEU0Q0UsCisgICAgMHhFNEQxLCAweEU0RDMsIDB4RTRERCwgMHhFNERGLCAweEU0RTAsIDB4RTRFMiwKKyAgICAweEU0RTQsIDB4RTRFQywgMHhFNEVFLCAweEU0RjEsIDB4RTRGMywgMHhFNEZELAorICAgIDB4RTRGRiwgMHhFQzAwLCAweEVDMDIsIDB4RUMwNCwgMHhFQzBDLCAweEVDMEUsCisgICAgMHhFQzExLCAweEVDMTMsIDB4RUMxRCwgMHhFQzFGLCAweEVDMjAsIDB4RUMyMiwKKyAgICAweEVDMjQsIDB4RUMyQywgMHhFQzJFLCAweEVDMzEsIDB4RUMzMywgMHhFQzNELAorICAgIDB4RUMzRiwgMHhFQzQwLCAweEVDNDIsIDB4RUM0NCwgMHhFQzRDLCAweEVDNEUsCisgICAgMHhFQ0MwLCAweEVDQzIsIDB4RUNDNCwgMHhFQ0NDLCAweEVDQ0UsIDB4RUNEMSwKKyAgICAweEVDRDMsIDB4RUNERCwgMHhFQ0RGLCAweEVDRTAsIDB4RUNFMiwgMHhFQ0U0LAorICAgIDB4RUNFQywgMHhFQ0VFLCAweEVDRjEsIDB4RUNGMywgMHhFQ0ZELCAweEVDRkYsCisgICAgMHhFRDAxLCAweEVEMDMsIDB4RUQwRCwgMHhFRDBGLCAweEVEMTAsIDB4RUQxMiwKKyAgICAweEVEMTQsIDB4RUQxQywgMHhFRDFFLCAweEVEMjEsIDB4RUQyMywgMHhFRDJELAorICAgIDB4RUQyRiwgMHhFRDMwLCAweEVEMzIsIDB4RUQzNCwgMHhFRDNDLCAweEVEM0UsCisgICAgMHhFRDQxLCAweEVENDMsIDB4RUQ0RCwgMHhFRDRGLCAweEVEQzEsIDB4RURDMywKKyAgICAweEVEQ0QsIDB4RURDRiwgMHhFREQwLCAweEVERDIsIDB4RURENCwgMHhFRERDLAorICAgIDB4RURERSwgMHhFREUxLCAweEVERTMsIDB4RURFRCwgMHhFREVGLCAweEVERjAsCisgICAgMHhFREYyLCAweEVERjQsIDB4RURGQywgMHhFREZFLCAweEVFMDAsIDB4RUUwMiwKKyAgICAweEVFMDQsIDB4RUUwQywgMHhFRTBFLCAweEVFMTEsIDB4RUUxMywgMHhFRTFELAorICAgIDB4RUUxRiwgMHhFRTIwLCAweEVFMjIsIDB4RUUyNCwgMHhFRTJDLCAweEVFMkUsCisgICAgMHhFRTMxLCAweEVFMzMsIDB4RUUzRCwgMHhFRTNGLCAweEVFNDAsIDB4RUU0MiwKKyAgICAweEVFNDQsIDB4RUU0QywgMHhFRTRFLCAweEVFQzAsIDB4RUVDMiwgMHhFRUM0LAorICAgIDB4RUVDQywgMHhFRUNFLCAweEVFRDEsIDB4RUVEMywgMHhFRURELCAweEVFREYsCisgICAgMHhFRUUwLCAweEVFRTIsIDB4RUVFNCwgMHhFRUVDLCAweEVFRUUsIDB4RUVGMSwKKyAgICAweEVFRjMsIDB4RUVGRCwgMHhFRUZGLCAweEVGMDEsIDB4RUYwMywgMHhFRjBELAorICAgIDB4RUYwRiwgMHhFRjEwLCAweEVGMTIsIDB4RUYxNCwgMHhFRjFDLCAweEVGMUUsCisgICAgMHhFRjIxLCAweEVGMjMsIDB4RUYyRCwgMHhFRjJGLCAweEVGMzAsIDB4RUYzMiwKKyAgICAweEVGMzQsIDB4RUYzQywgMHhFRjNFLCAweEVGNDEsIDB4RUY0MywgMHhFRjRELAorICAgIDB4RUY0RiwgMHhFRkMxLCAweEVGQzMsIDB4RUZDRCwgMHhFRkNGLCAweEVGRDAsCisgICAgMHhFRkQyLCAweEVGRDQsIDB4RUZEQywgMHhFRkRFLCAweEVGRTEsIDB4RUZFMywKKyAgICAweEVGRUQsIDB4RUZFRiwgMHhFRkYwLCAweEVGRjIsIDB4RUZGNCwgMHhFRkZDLAorICAgIDB4RUZGRSwgMHhGMDAxLCAweEYwMDMsIDB4RjAwRCwgMHhGMDBGLCAweEYwMTAsCisgICAgMHhGMDEyLCAweEYwMTQsIDB4RjAxQywgMHhGMDFFLCAweEYwMjEsIDB4RjAyMywKKyAgICAweEYwMkQsIDB4RjAyRiwgMHhGMDMwLCAweEYwMzIsIDB4RjAzNCwgMHhGMDNDLAorICAgIDB4RjAzRSwgMHhGMDQxLCAweEYwNDMsIDB4RjA0RCwgMHhGMDRGLCAweEYwQzEsCisgICAgMHhGMEMzLCAweEYwQ0QsIDB4RjBDRiwgMHhGMEQwLCAweEYwRDIsIDB4RjBENCwKKyAgICAweEYwREMsIDB4RjBERSwgMHhGMEUxLCAweEYwRTMsIDB4RjBFRCwgMHhGMEVGLAorICAgIDB4RjBGMCwgMHhGMEYyLCAweEYwRjQsIDB4RjBGQywgMHhGMEZFLCAweEYxMDAsCisgICAgMHhGMTAyLCAweEYxMDQsIDB4RjEwQywgMHhGMTBFLCAweEYxMTEsIDB4RjExMywKKyAgICAweEYxMUQsIDB4RjExRiwgMHhGMTIwLCAweEYxMjIsIDB4RjEyNCwgMHhGMTJDLAorICAgIDB4RjEyRSwgMHhGMTMxLCAweEYxMzMsIDB4RjEzRCwgMHhGMTNGLCAweEYxNDAsCisgICAgMHhGMTQyLCAweEYxNDQsIDB4RjE0QywgMHhGMTRFLCAweEYxQzAsIDB4RjFDMiwKKyAgICAweEYxQzQsIDB4RjFDQywgMHhGMUNFLCAweEYxRDEsIDB4RjFEMywgMHhGMURELAorICAgIDB4RjFERiwgMHhGMUUwLCAweEYxRTIsIDB4RjFFNCwgMHhGMUVDLCAweEYxRUUsCisgICAgMHhGMUYxLCAweEYxRjMsIDB4RjFGRCwgMHhGMUZGLCAweEYyMDEsIDB4RjIwMywKKyAgICAweEYyMEQsIDB4RjIwRiwgMHhGMjEwLCAweEYyMTIsIDB4RjIxNCwgMHhGMjFDLAorICAgIDB4RjIxRSwgMHhGMjIxLCAweEYyMjMsIDB4RjIyRCwgMHhGMjJGLCAweEYyMzAsCisgICAgMHhGMjMyLCAweEYyMzQsIDB4RjIzQywgMHhGMjNFLCAweEYyNDEsIDB4RjI0MywKKyAgICAweEYyNEQsIDB4RjI0RiwgMHhGMkMxLCAweEYyQzMsIDB4RjJDRCwgMHhGMkNGLAorICAgIDB4RjJEMCwgMHhGMkQyLCAweEYyRDQsIDB4RjJEQywgMHhGMkRFLCAweEYyRTEsCisgICAgMHhGMkUzLCAweEYyRUQsIDB4RjJFRiwgMHhGMkYwLCAweEYyRjIsIDB4RjJGNCwKKyAgICAweEYyRkMsIDB4RjJGRSwgMHhGMzAwLCAweEYzMDIsIDB4RjMwNCwgMHhGMzBDLAorICAgIDB4RjMwRSwgMHhGMzExLCAweEYzMTMsIDB4RjMxRCwgMHhGMzFGLCAweEYzMjAsCisgICAgMHhGMzIyLCAweEYzMjQsIDB4RjMyQywgMHhGMzJFLCAweEYzMzEsIDB4RjMzMywKKyAgICAweEYzM0QsIDB4RjMzRiwgMHhGMzQwLCAweEYzNDIsIDB4RjM0NCwgMHhGMzRDLAorICAgIDB4RjM0RSwgMHhGM0MwLCAweEYzQzIsIDB4RjNDNCwgMHhGM0NDLCAweEYzQ0UsCisgICAgMHhGM0QxLCAweEYzRDMsIDB4RjNERCwgMHhGM0RGLCAweEYzRTAsIDB4RjNFMiwKKyAgICAweEYzRTQsIDB4RjNFQywgMHhGM0VFLCAweEYzRjEsIDB4RjNGMywgMHhGM0ZELAorICAgIDB4RjNGRiwgMHhGNDAxLCAweEY0MDMsIDB4RjQwRCwgMHhGNDBGLCAweEY0MTAsCisgICAgMHhGNDEyLCAweEY0MTQsIDB4RjQxQywgMHhGNDFFLCAweEY0MjEsIDB4RjQyMywKKyAgICAweEY0MkQsIDB4RjQyRiwgMHhGNDMwLCAweEY0MzIsIDB4RjQzNCwgMHhGNDNDLAorICAgIDB4RjQzRSwgMHhGNDQxLCAweEY0NDMsIDB4RjQ0RCwgMHhGNDRGLCAweEY0QzEsCisgICAgMHhGNEMzLCAweEY0Q0QsIDB4RjRDRiwgMHhGNEQwLCAweEY0RDIsIDB4RjRENCwKKyAgICAweEY0REMsIDB4RjRERSwgMHhGNEUxLCAweEY0RTMsIDB4RjRFRCwgMHhGNEVGLAorICAgIDB4RjRGMCwgMHhGNEYyLCAweEY0RjQsIDB4RjRGQywgMHhGNEZFLCAweEZDMDEsCisgICAgMHhGQzAzLCAweEZDMEQsIDB4RkMwRiwgMHhGQzEwLCAweEZDMTIsIDB4RkMxNCwKKyAgICAweEZDMUMsIDB4RkMxRSwgMHhGQzIxLCAweEZDMjMsIDB4RkMyRCwgMHhGQzJGLAorICAgIDB4RkMzMCwgMHhGQzMyLCAweEZDMzQsIDB4RkMzQywgMHhGQzNFLCAweEZDNDEsCisgICAgMHhGQzQzLCAweEZDNEQsIDB4RkM0RiwgMHhGQ0MxLCAweEZDQzMsIDB4RkNDRCwKKyAgICAweEZDQ0YsIDB4RkNEMCwgMHhGQ0QyLCAweEZDRDQsIDB4RkNEQywgMHhGQ0RFLAorICAgIDB4RkNFMSwgMHhGQ0UzLCAweEZDRUQsIDB4RkNFRiwgMHhGQ0YwLCAweEZDRjIsCisgICAgMHhGQ0Y0LCAweEZDRkMsIDB4RkNGRSwgMHhGRDAwLCAweEZEMDIsIDB4RkQwNCwKKyAgICAweEZEMEMsIDB4RkQwRSwgMHhGRDExLCAweEZEMTMsIDB4RkQxRCwgMHhGRDFGLAorICAgIDB4RkQyMCwgMHhGRDIyLCAweEZEMjQsIDB4RkQyQywgMHhGRDJFLCAweEZEMzEsCisgICAgMHhGRDMzLCAweEZEM0QsIDB4RkQzRiwgMHhGRDQwLCAweEZENDIsIDB4RkQ0NCwKKyAgICAweEZENEMsIDB4RkQ0RSwgMHhGREMwLCAweEZEQzIsIDB4RkRDNCwgMHhGRENDLAorICAgIDB4RkRDRSwgMHhGREQxLCAweEZERDMsIDB4RkRERCwgMHhGRERGLCAweEZERTAsCisgICAgMHhGREUyLCAweEZERTQsIDB4RkRFQywgMHhGREVFLCAweEZERjEsIDB4RkRGMywKKyAgICAweEZERkQsIDB4RkRGRiwgMHhGRTAxLCAweEZFMDMsIDB4RkUwRCwgMHhGRTBGLAorICAgIDB4RkUxMCwgMHhGRTEyLCAweEZFMTQsIDB4RkUxQywgMHhGRTFFLCAweEZFMjEsCisgICAgMHhGRTIzLCAweEZFMkQsIDB4RkUyRiwgMHhGRTMwLCAweEZFMzIsIDB4RkUzNCwKKyAgICAweEZFM0MsIDB4RkUzRSwgMHhGRTQxLCAweEZFNDMsIDB4RkU0RCwgMHhGRTRGLAorICAgIDB4RkVDMSwgMHhGRUMzLCAweEZFQ0QsIDB4RkVDRiwgMHhGRUQwLCAweEZFRDIsCisgICAgMHhGRUQ0LCAweEZFREMsIDB4RkVERSwgMHhGRUUxLCAweEZFRTMsIDB4RkVFRCwKKyAgICAweEZFRUYsIDB4RkVGMCwgMHhGRUYyLCAweEZFRjQsIDB4RkVGQywgMHhGRUZFLAorICAgIDB4RkYwMCwgMHhGRjAyLCAweEZGMDQsIDB4RkYwQywgMHhGRjBFLCAweEZGMTEsCisgICAgMHhGRjEzLCAweEZGMUQsIDB4RkYxRiwgMHhGRjIwLCAweEZGMjIsIDB4RkYyNCwKKyAgICAweEZGMkMsIDB4RkYyRSwgMHhGRjMxLCAweEZGMzMsIDB4RkYzRCwgMHhGRjNGLAorICAgIDB4RkY0MCwgMHhGRjQyLCAweEZGNDQsIDB4RkY0QywgMHhGRjRFLCAweEZGQzAsCisgICAgMHhGRkMyLCAweEZGQzQsIDB4RkZDQywgMHhGRkNFLCAweEZGRDEsIDB4RkZEMywKKyAgICAweEZGREQsIDB4RkZERiwgMHhGRkUwLCAweEZGRTIsIDB4RkZFNCwgMHhGRkVDLAorICAgIDB4RkZFRSwgMHhGRkYxLCAweEZGRjMsIDB4RkZGRCwgMHhGRkZGLAorfTsKKworI2RlZmluZSBPTjJBVkNfQ0I5X0NPREVTIDEyMQorc3RhdGljIGNvbnN0IHVpbnQxNl90IG9uMmF2Y19jYjlfY29kZXNbT04yQVZDX0NCOV9DT0RFU10gPSB7CisgICAgMHgwMDAwLCAweDAwMEYsIDB4MDA5OCwgMHgwMjZFLCAweDA0NUMsIDB4MDBBNiwKKyAgICAweDAwQUMsIDB4MDQ1RCwgMHgwMjdFLCAweDAwOUEsIDB4MDAxMiwgMHgwMDBFLAorICAgIDB4MDAxQSwgMHgwMERFLCAweDAyMkMsIDB4MDUzRSwgMHgwMEEyLCAweDAwOUUsCisgICAgMHgwNTM4LCAweDAxQjIsIDB4MDBCQSwgMHgwMDE4LCAweDAwQUQsIDB4MDBCRiwKKyAgICAweDAxQkUsIDB4MDM3RSwgMHgwNUM2LCAweDAxMzIsIDB4MDExMiwgMHgwOEI1LAorICAgIDB4MDQ1NywgMHgwMUI2LCAweDAwQkMsIDB4MDJBRSwgMHgwMjJBLCAweDA0NUUsCisgICAgMHgwOEI2LCAweDA4RkEsIDB4MDE0NywgMHgwMTNFLCAweDExOUYsIDB4MDVDNywKKyAgICAweDA0NEYsIDB4MDE3MCwgMHgwNDU2LCAweDA0N0YsIDB4MDZDNywgMHgwQTcyLAorICAgIDB4MEQ4QiwgMHgwMjY3LCAweDAyNjYsIDB4MEQ4QSwgMHgwOEI3LCAweDA1Q0YsCisgICAgMHgwNDVGLCAweDAwNTQsIDB4MDBBNCwgMHgwMTE4LCAweDAxNDIsIDB4MDIzNCwKKyAgICAweDAzNkYsIDB4MDM2RSwgMHgwMjlFLCAweDAxNTYsIDB4MDExNCwgMHgwMDg4LAorICAgIDB4MDBBMCwgMHgwMEE1LCAweDAwREEsIDB4MDE1RiwgMHgwMjZGLCAweDAyRTIsCisgICAgMHgwMkU2LCAweDAyMzYsIDB4MDE1RSwgMHgwMTQzLCAweDAwQUEsIDB4MDUzQSwKKyAgICAweDA0NjYsIDB4MDRGRSwgMHgwOUZFLCAweDExOUUsIDB4MDIzMiwgMHgwMjM3LAorICAgIDB4MEE3MywgMHgwOUZGLCAweDA4QjQsIDB4MDQ2QiwgMHgwMkFGLCAweDAxQjAsCisgICAgMHgwMzdGLCAweDA1M0YsIDB4MDhGQiwgMHgwMTM2LCAweDAxNDYsIDB4MDhDRSwKKyAgICAweDA1Q0UsIDB4MDQ0RSwgMHgwMUIzLCAweDAwOEUsIDB4MDBERCwgMHgwMjI2LAorICAgIDB4MDQ3RSwgMHgwNkM2LCAweDAwQUUsIDB4MDExRSwgMHgwNkM0LCAweDA0N0MsCisgICAgMHgwMTcyLCAweDAwQkUsIDB4MDAxMCwgMHgwMDE2LCAweDAwQkQsIDB4MDE3NiwKKyAgICAweDA1M0IsIDB4MDA5RCwgMHgwMDlDLCAweDA0NkEsIDB4MDE3NywgMHgwMERDLAorICAgIDB4MDAxOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9uMmF2Y19jYjlfYml0c1tPTjJBVkNfQ0I5X0NPREVTXSA9IHsKKyAgICAgMSwgIDQsICA4LCAxMCwgMTEsICA4LAorICAgICA4LCAxMSwgMTAsICA4LCAgNSwgIDQsCisgICAgIDUsICA4LCAxMCwgMTEsICA4LCAgOCwKKyAgICAxMSwgIDksICA4LCAgNSwgIDgsICA4LAorICAgICA5LCAxMCwgMTEsICA5LCAgOSwgMTIsCisgICAgMTEsICA5LCAgOCwgMTAsIDEwLCAxMSwKKyAgICAxMiwgMTIsICA5LCAgOSwgMTMsIDExLAorICAgIDExLCAgOSwgMTEsIDExLCAxMSwgMTIsCisgICAgMTIsIDEwLCAxMCwgMTIsIDEyLCAxMSwKKyAgICAxMSwgIDcsICA4LCAgOSwgIDksIDEwLAorICAgIDEwLCAxMCwgMTAsICA5LCAgOSwgIDgsCisgICAgIDgsICA4LCAgOCwgIDksIDEwLCAxMCwKKyAgICAxMCwgMTAsICA5LCAgOSwgIDgsIDExLAorICAgIDExLCAxMSwgMTIsIDEzLCAxMCwgMTAsCisgICAgMTIsIDEyLCAxMiwgMTEsIDEwLCAgOSwKKyAgICAxMCwgMTEsIDEyLCAgOSwgIDksIDEyLAorICAgIDExLCAxMSwgIDksICA4LCAgOCwgMTAsCisgICAgMTEsIDExLCAgOCwgIDksIDExLCAxMSwKKyAgICAgOSwgIDgsICA1LCAgNSwgIDgsICA5LAorICAgIDExLCAgOCwgIDgsIDExLCAgOSwgIDgsCisgICAgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgb24yYXZjX2NiOV9zeW1zW09OMkFWQ19DQjlfQ09ERVNdID0geworICAgIDB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgMHgwMDA0LCAweDAwMDUsCisgICAgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsIDB4MDEwMCwKKyAgICAweDAxMDEsIDB4MDEwMiwgMHgwMTAzLCAweDAxMDQsIDB4MDEwNSwgMHgwMUZCLAorICAgIDB4MDFGQywgMHgwMUZELCAweDAxRkUsIDB4MDFGRiwgMHgwMjAwLCAweDAyMDEsCisgICAgMHgwMjAyLCAweDAyMDMsIDB4MDIwNCwgMHgwMjA1LCAweDAyRkIsIDB4MDJGQywKKyAgICAweDAyRkQsIDB4MDJGRSwgMHgwMkZGLCAweDAzMDAsIDB4MDMwMSwgMHgwMzAyLAorICAgIDB4MDMwMywgMHgwMzA0LCAweDAzMDUsIDB4MDNGQiwgMHgwM0ZDLCAweDAzRkQsCisgICAgMHgwM0ZFLCAweDAzRkYsIDB4MDQwMCwgMHgwNDAxLCAweDA0MDIsIDB4MDQwMywKKyAgICAweDA0MDQsIDB4MDQwNSwgMHgwNEZCLCAweDA0RkMsIDB4MDRGRCwgMHgwNEZFLAorICAgIDB4MDRGRiwgMHgwNTAwLCAweDA1MDEsIDB4MDUwMiwgMHgwNTAzLCAweDA1MDQsCisgICAgMHgwNTA1LCAweDA1RkIsIDB4MDVGQywgMHgwNUZELCAweDA1RkUsIDB4MDVGRiwKKyAgICAweEZCMDAsIDB4RkIwMSwgMHhGQjAyLCAweEZCMDMsIDB4RkIwNCwgMHhGQjA1LAorICAgIDB4RkJGQiwgMHhGQkZDLCAweEZCRkQsIDB4RkJGRSwgMHhGQkZGLCAweEZDMDAsCisgICAgMHhGQzAxLCAweEZDMDIsIDB4RkMwMywgMHhGQzA0LCAweEZDMDUsIDB4RkNGQiwKKyAgICAweEZDRkMsIDB4RkNGRCwgMHhGQ0ZFLCAweEZDRkYsIDB4RkQwMCwgMHhGRDAxLAorICAgIDB4RkQwMiwgMHhGRDAzLCAweEZEMDQsIDB4RkQwNSwgMHhGREZCLCAweEZERkMsCisgICAgMHhGREZELCAweEZERkUsIDB4RkRGRiwgMHhGRTAwLCAweEZFMDEsIDB4RkUwMiwKKyAgICAweEZFMDMsIDB4RkUwNCwgMHhGRTA1LCAweEZFRkIsIDB4RkVGQywgMHhGRUZELAorICAgIDB4RkVGRSwgMHhGRUZGLCAweEZGMDAsIDB4RkYwMSwgMHhGRjAyLCAweEZGMDMsCisgICAgMHhGRjA0LCAweEZGMDUsIDB4RkZGQiwgMHhGRkZDLCAweEZGRkQsIDB4RkZGRSwKKyAgICAweEZGRkYsCit9OworCisjZGVmaW5lIE9OMkFWQ19DQjEwX0NPREVTIDEyMQorc3RhdGljIGNvbnN0IHVpbnQxNl90IG9uMmF2Y19jYjEwX2NvZGVzW09OMkFWQ19DQjEwX0NPREVTXSA9IHsKKyAgICAweDAwMkUsIDB4MDAxQSwgMHgwMDNDLCAweDAwMUYsIDB4MDA2RSwgMHgwMDJFLAorICAgIDB4MDBBRSwgMHgwMDZGLCAweDAwMkEsIDB4MDAzRSwgMHgwMDE0LCAweDAwMTYsCisgICAgMHgwMDAyLCAweDAwMEUsIDB4MDA0RSwgMHgwMEY3LCAweDAwNDIsIDB4MDAyNywKKyAgICAweDAwRjYsIDB4MDA0NiwgMHgwMDE0LCAweDAwMDgsIDB4MDAzMiwgMHgwMDE2LAorICAgIDB4MDAzMCwgMHgwMDEyLCAweDAwNTYsIDB4MDAxOCwgMHgwMDVGLCAweDAwREUsCisgICAgMHgwMDZFLCAweDAwMzYsIDB4MDAxQSwgMHgwMDIzLCAweDAwM0QsIDB4MDAzRiwKKyAgICAweDAwN0EsIDB4MDA4RSwgMHgwMDcxLCAweDAwMDYsIDB4MDAxMiwgMHgwMDBGLAorICAgIDB4MDA0MywgMHgwMDNFLCAweDAwQUUsIDB4MDAwMSwgMHgwMEFCLCAweDAwQzcsCisgICAgMHgwMDEzLCAweDAwMEEsIDB4MDAwMiwgMHgwMUNBLCAweDAwMDMsIDB4MDAwMCwKKyAgICAweDAwMEYsIDB4MDAyMiwgMHgwMDE2LCAweDAwMkEsIDB4MDA3RiwgMHgwMDFDLAorICAgIDB4MDAzNiwgMHgwMEFGLCAweDAwQzYsIDB4MDAwRSwgMHgwMDEwLCAweDAwMDYsCisgICAgMHgwMDhGLCAweDAwMUUsIDB4MDA1NCwgMHgwMDBELCAweDAwQUEsIDB4MDA1NiwKKyAgICAweDAwQUMsIDB4MDAxRCwgMHgwMDc2LCAweDAwMTMsIDB4MDA0RiwgMHgwMDU3LAorICAgIDB4MDBFNiwgMHgwMEVFLCAweDAwMEUsIDB4MDFDQiwgMHgwMEFGLCAweDAwMEIsCisgICAgMHgwMDA3LCAweDAwRUYsIDB4MDBBRCwgMHgwMEU0LCAweDAwMDgsIDB4MDA1RSwKKyAgICAweDAwNzAsIDB4MDAxRSwgMHgwMERGLCAweDAwMEMsIDB4MDA3RSwgMHgwMENFLAorICAgIDB4MDAwMiwgMHgwMDFBLCAweDAwM0MsIDB4MDAwMiwgMHgwMDIwLCAweDAwM0EsCisgICAgMHgwMDRELCAweDAwQ0YsIDB4MDA2NiwgMHgwMDI2LCAweDAwMkYsIDB4MDAxRiwKKyAgICAweDAwMjIsIDB4MDAxQiwgMHgwMDEyLCAweDAwMEUsIDB4MDAxNywgMHgwMDYyLAorICAgIDB4MDBFNywgMHgwMDE5LCAweDAwMTQsIDB4MDAwNiwgMHgwMDRDLCAweDAwMTIsCisgICAgMHgwMDBDLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb24yYXZjX2NiMTBfYml0c1tPTjJBVkNfQ0IxMF9DT0RFU10gPSB7CisgICAgNiwgIDUsICA2LCAgOCwgIDksICA4LAorICAgIDgsICA5LCAgOCwgIDYsICA1LCAgNSwKKyAgICA1LCAgNiwgIDcsICA4LCAgNywgIDcsCisgICAgOCwgIDcsICA2LCAgNSwgIDYsICA2LAorICAgIDYsICA3LCAgOCwgIDcsICA3LCAgOCwKKyAgICA3LCAgNiwgIDYsICA4LCAgNywgIDcsCisgICAgNywgIDgsICA3LCAgOCwgIDksICA4LAorICAgIDcsICA3LCAgOSwgIDksICA4LCAgOCwKKyAgICA5LCAgOCwgIDksICA5LCAgOSwgIDksCisgICAgOSwgIDgsICA3LCAgNywgIDcsICA4LAorICAgIDgsICA5LCAgOCwgIDgsICA3LCAgNiwKKyAgICA4LCAgNywgIDcsICA4LCAgOCwgIDksCisgICAgOCwgIDgsICA3LCAgNywgIDcsICA5LAorICAgIDgsICA4LCAgOSwgIDksICA4LCAgOCwKKyAgICA5LCAgOCwgIDgsICA4LCAgOCwgIDcsCisgICAgNywgIDgsICA4LCAgOCwgIDcsICA4LAorICAgIDgsICA3LCAgNywgIDcsICA2LCAgNiwKKyAgICA3LCAgOCwgIDcsICA3LCAgOCwgIDcsCisgICAgNiwgIDYsICA1LCAgNSwgIDYsICA3LAorICAgIDgsICA3LCAgNywgIDksICA3LCAgNiwKKyAgICA1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG9uMmF2Y19jYjEwX3N5bXNbT04yQVZDX0NCMTBfQ09ERVNdID0geworICAgIDB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgMHgwMDA0LCAweDAwMDUsCisgICAgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsIDB4MDEwMCwKKyAgICAweDAxMDEsIDB4MDEwMiwgMHgwMTAzLCAweDAxMDQsIDB4MDEwNSwgMHgwMUZCLAorICAgIDB4MDFGQywgMHgwMUZELCAweDAxRkUsIDB4MDFGRiwgMHgwMjAwLCAweDAyMDEsCisgICAgMHgwMjAyLCAweDAyMDMsIDB4MDIwNCwgMHgwMjA1LCAweDAyRkIsIDB4MDJGQywKKyAgICAweDAyRkQsIDB4MDJGRSwgMHgwMkZGLCAweDAzMDAsIDB4MDMwMSwgMHgwMzAyLAorICAgIDB4MDMwMywgMHgwMzA0LCAweDAzMDUsIDB4MDNGQiwgMHgwM0ZDLCAweDAzRkQsCisgICAgMHgwM0ZFLCAweDAzRkYsIDB4MDQwMCwgMHgwNDAxLCAweDA0MDIsIDB4MDQwMywKKyAgICAweDA0MDQsIDB4MDQwNSwgMHgwNEZCLCAweDA0RkMsIDB4MDRGRCwgMHgwNEZFLAorICAgIDB4MDRGRiwgMHgwNTAwLCAweDA1MDEsIDB4MDUwMiwgMHgwNTAzLCAweDA1MDQsCisgICAgMHgwNTA1LCAweDA1RkIsIDB4MDVGQywgMHgwNUZELCAweDA1RkUsIDB4MDVGRiwKKyAgICAweEZCMDAsIDB4RkIwMSwgMHhGQjAyLCAweEZCMDMsIDB4RkIwNCwgMHhGQjA1LAorICAgIDB4RkJGQiwgMHhGQkZDLCAweEZCRkQsIDB4RkJGRSwgMHhGQkZGLCAweEZDMDAsCisgICAgMHhGQzAxLCAweEZDMDIsIDB4RkMwMywgMHhGQzA0LCAweEZDMDUsIDB4RkNGQiwKKyAgICAweEZDRkMsIDB4RkNGRCwgMHhGQ0ZFLCAweEZDRkYsIDB4RkQwMCwgMHhGRDAxLAorICAgIDB4RkQwMiwgMHhGRDAzLCAweEZEMDQsIDB4RkQwNSwgMHhGREZCLCAweEZERkMsCisgICAgMHhGREZELCAweEZERkUsIDB4RkRGRiwgMHhGRTAwLCAweEZFMDEsIDB4RkUwMiwKKyAgICAweEZFMDMsIDB4RkUwNCwgMHhGRTA1LCAweEZFRkIsIDB4RkVGQywgMHhGRUZELAorICAgIDB4RkVGRSwgMHhGRUZGLCAweEZGMDAsIDB4RkYwMSwgMHhGRjAyLCAweEZGMDMsCisgICAgMHhGRjA0LCAweEZGMDUsIDB4RkZGQiwgMHhGRkZDLCAweEZGRkQsIDB4RkZGRSwKKyAgICAweEZGRkYsCit9OworCisjZGVmaW5lIE9OMkFWQ19DQjExX0NPREVTIDIyNQorc3RhdGljIGNvbnN0IHVpbnQxNl90IG9uMmF2Y19jYjExX2NvZGVzW09OMkFWQ19DQjExX0NPREVTXSA9IHsKKyAgICAweDAwMDAsIDB4MDAwRSwgMHgwMDU2LCAweDAwQ0QsIDB4MDE3MywgMHgwMjMyLAorICAgIDB4MDBDNywgMHgwMTRGLCAweDAxQUEsIDB4MDBCRSwgMHgwMjZGLCAweDAxOTIsCisgICAgMHgwMEJDLCAweDAwNTgsIDB4MDAwRiwgMHgwMDBDLCAweDAwMTAsIDB4MDA0RSwKKyAgICAweDAwODIsIDB4MDE0MiwgMHgwMUJGLCAweDAwOTgsIDB4MDE1RSwgMHgwMTM2LAorICAgIDB4MDA4NiwgMHgwMUJCLCAweDAxNEUsIDB4MDBCQSwgMHgwMDNFLCAweDAwMTIsCisgICAgMHgwMDU0LCAweDAwMzYsIDB4MDA1MCwgMHgwMDhGLCAweDAxNEIsIDB4MDI2MiwKKyAgICAweDAwQUEsIDB4MDE1QywgMHgwMTNFLCAweDAwQjcsIDB4MDJCRSwgMHgwMTc2LAorICAgIDB4MDBBMiwgMHgwMDU4LCAweDAwM0MsIDB4MDBDMiwgMHgwMEE2LCAweDAwOEEsCisgICAgMHgwMEIyLCAweDAxMjIsIDB4MDJBQywgMHgwMENBLCAweDAxMkYsIDB4MDE0QSwKKyAgICAweDAwREMsIDB4MDJERSwgMHgwMTdBLCAweDAxMzQsIDB4MDA5MiwgMHgwMEI0LAorICAgIDB4MDE2NiwgMHgwMTQ4LCAweDAxNkUsIDB4MDEzRiwgMHgwMTM0LCAweDAyRkYsCisgICAgMHgwMTRGLCAweDAxOUUsIDB4MDI2NywgMHgwMTZDLCAweDAyQTYsIDB4MDJDRSwKKyAgICAweDAxM0EsIDB4MDEwQSwgMHgwMTA4LCAweDAyNkUsIDB4MDJDQiwgMHgwMjhFLAorICAgIDB4MDJDRiwgMHgwMjBGLCAweDAyREYsIDB4MDEwQiwgMHgwMkFELCAweDAyMjcsCisgICAgMHgwMThBLCAweDA0REIsIDB4MDJBNywgMHgwMkZFLCAweDAyMzYsIDB4MDI2QywKKyAgICAweDAwQzYsIDB4MDA5QywgMHgwMEM0LCAweDAwQ0UsIDB4MDBENiwgMHgwMTM1LAorICAgIDB4MDE1NiwgMHgwMjVBLCAweDAyRkYsIDB4MDI4NiwgMHgwMTVGLCAweDAxMzIsCisgICAgMHgwMEQ3LCAweDAwQUMsIDB4MDBBMiwgMHgwMTc2LCAweDAxMTgsIDB4MDEyMywKKyAgICAweDAxNTcsIDB4MDFCQywgMHgwMkFFLCAweDAyRUUsIDB4MDREQSwgMHgwNDY3LAorICAgIDB4MDMzRiwgMHgwMjg3LCAweDAxOTMsIDB4MDE4MiwgMHgwMTNCLCAweDAxMTIsCisgICAgMHgwMTMzLCAweDAxN0QsIDB4MDExNywgMHgwMTg2LCAweDAyNkUsIDB4MDI1QiwKKyAgICAweDAyRUYsIDB4MDQ2NiwgMHgwMzE2LCAweDAyMzcsIDB4MDJGNiwgMHgwMUJBLAorICAgIDB4MDE1RCwgMHgwMTJFLCAweDAxNUEsIDB4MDE0QSwgMHgwMDhFLCAweDAwQjYsCisgICAgMHgwMTM1LCAweDAxMDAsIDB4MDE3QiwgMHgwMjhDLCAweDAzM0UsIDB4MDI5NywKKyAgICAweDAxNUIsIDB4MDEwMiwgMHgwMTQwLCAweDAwRDQsIDB4MDBCQSwgMHgwMDg4LAorICAgIDB4MDJFRSwgMHgwMjgzLCAweDAyQkYsIDB4MDIwRSwgMHgwMkNFLCAweDAzMTcsCisgICAgMHgwMTcyLCAweDAyOTYsIDB4MDI2RiwgMHgwMTAxLCAweDAyQ0YsIDB4MDJGNywKKyAgICAweDAxQkQsIDB4MDJFRiwgMHgwMjhGLCAweDAyNjMsIDB4MDE2NCwgMHgwMTFBLAorICAgIDB4MDE0NywgMHgwMjkyLCAweDAyRkUsIDB4MDE1RSwgMHgwMkFGLCAweDAxQUIsCisgICAgMHgwMTMwLCAweDAyQ0EsIDB4MDE4MywgMHgwMTRFLCAweDAxN0MsIDB4MDE3RSwKKyAgICAweDAwQzgsIDB4MDBBQSwgMHgwMDlFLCAweDAxMzIsIDB4MDE1MiwgMHgwMjI2LAorICAgIDB4MDBDQywgMHgwMTdFLCAweDAxODcsIDB4MDBDQiwgMHgwMjkzLCAweDAxMDYsCisgICAgMHgwMEMwLCAweDAwODcsIDB4MDBCQywgMHgwMDVDLCAweDAwM0QsIDB4MDA1QSwKKyAgICAweDAwQTgsIDB4MDEwMywgMHgwMjhELCAweDAwQTQsIDB4MDExNiwgMHgwMTQ2LAorICAgIDB4MDBCOCwgMHgwMUJFLCAweDAxNkQsIDB4MDA5MywgMHgwMDRBLCAweDAwM0YsCisgICAgMHgwMDBELCAweDAwMTEsIDB4MDA0RiwgMHgwMEFFLCAweDAxNjYsIDB4MDI2NiwKKyAgICAweDAwOTAsIDB4MDEwOSwgMHgwMTJDLCAweDAwQTYsIDB4MDI4MiwgMHgwMTdBLAorICAgIDB4MDBCNSwgMHgwMDM0LCAweDAwMEUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBvbjJhdmNfY2IxMV9iaXRzW09OMkFWQ19DQjExX0NPREVTXSA9IHsKKyAgICAgMiwgIDQsICA3LCAgOSwgMTAsIDExLAorICAgICA5LCAxMCwgMTAsICA5LCAxMSwgMTAsCisgICAgIDksICA3LCAgNCwgIDQsICA1LCAgNywKKyAgICAgOSwgIDksIDEwLCAgOSwgMTAsIDEwLAorICAgICA5LCAxMCwgIDksICA4LCAgNywgIDUsCisgICAgIDcsICA3LCAgOCwgIDksICA5LCAxMCwKKyAgICAgOSwgMTAsIDEwLCAgOSwgMTAsICA5LAorICAgICA5LCAgOCwgIDcsICA5LCAgOCwgIDksCisgICAgIDksIDEwLCAxMCwgIDksIDEwLCAxMCwKKyAgICAgOSwgMTAsIDEwLCAgOSwgIDksICA4LAorICAgIDEwLCAgOSwgIDksIDEwLCAxMCwgMTAsCisgICAgIDksIDEwLCAxMCwgIDksIDExLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMSwgMTAsIDEwLAorICAgIDEwLCAxMSwgMTAsIDEwLCAxMCwgMTEsCisgICAgMTAsIDExLCAxMSwgMTAsIDExLCAxMCwKKyAgICAgOSwgIDksICA5LCAgOSwgIDksIDEwLAorICAgIDEwLCAxMSwgMTEsIDEwLCAxMCwgMTAsCisgICAgIDksICA5LCAgOCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTEsIDEyLAorICAgIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsICA5LCAxMCwgMTAsIDEwLCAxMSwKKyAgICAxMSwgMTIsIDExLCAxMSwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksCisgICAgIDksIDEwLCAxMCwgMTAsIDExLCAxMSwKKyAgICAxMCwgMTAsICA5LCAgOSwgIDksICA5LAorICAgIDExLCAxMCwgMTAsIDExLCAxMSwgMTEsCisgICAgMTAsIDExLCAxMCwgMTAsIDExLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgIDksIDEwLAorICAgIDEwLCAxMCwgMTEsICA5LCAxMCwgMTAsCisgICAgIDksIDEwLCAxMCwgMTAsICA5LCAgOSwKKyAgICAgOSwgIDgsICA5LCAgOSwgMTAsIDExLAorICAgICA5LCAxMCwgMTAsICA5LCAxMCwgMTAsCisgICAgIDksICA5LCAgOCwgIDcsICA3LCAgOCwKKyAgICAgOSwgMTAsIDEwLCAgOSwgMTAsIDEwLAorICAgICA5LCAxMCwgIDksICA5LCAgOCwgIDcsCisgICAgIDQsICA1LCAgNywgIDgsICA5LCAxMCwKKyAgICAgOSwgMTAsIDEwLCAgOSwgMTAsICA5LAorICAgICA4LCAgNywgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgb24yYXZjX2NiMTFfc3ltc1tPTjJBVkNfQ0IxMV9DT0RFU10gPSB7CisgICAgMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDQsIDB4MDAwNSwKKyAgICAweDAwMDYsIDB4MDAwNywgMHgwMEY5LCAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLAorICAgIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsIDB4MDEwMCwgMHgwMTAxLCAweDAxMDIsCisgICAgMHgwMTAzLCAweDAxMDQsIDB4MDEwNSwgMHgwMTA2LCAweDAxMDcsIDB4MDFGOSwKKyAgICAweDAxRkEsIDB4MDFGQiwgMHgwMUZDLCAweDAxRkQsIDB4MDFGRSwgMHgwMUZGLAorICAgIDB4MDIwMCwgMHgwMjAxLCAweDAyMDIsIDB4MDIwMywgMHgwMjA0LCAweDAyMDUsCisgICAgMHgwMjA2LCAweDAyMDcsIDB4MDJGOSwgMHgwMkZBLCAweDAyRkIsIDB4MDJGQywKKyAgICAweDAyRkQsIDB4MDJGRSwgMHgwMkZGLCAweDAzMDAsIDB4MDMwMSwgMHgwMzAyLAorICAgIDB4MDMwMywgMHgwMzA0LCAweDAzMDUsIDB4MDMwNiwgMHgwMzA3LCAweDAzRjksCisgICAgMHgwM0ZBLCAweDAzRkIsIDB4MDNGQywgMHgwM0ZELCAweDAzRkUsIDB4MDNGRiwKKyAgICAweDA0MDAsIDB4MDQwMSwgMHgwNDAyLCAweDA0MDMsIDB4MDQwNCwgMHgwNDA1LAorICAgIDB4MDQwNiwgMHgwNDA3LCAweDA0RjksIDB4MDRGQSwgMHgwNEZCLCAweDA0RkMsCisgICAgMHgwNEZELCAweDA0RkUsIDB4MDRGRiwgMHgwNTAwLCAweDA1MDEsIDB4MDUwMiwKKyAgICAweDA1MDMsIDB4MDUwNCwgMHgwNTA1LCAweDA1MDYsIDB4MDUwNywgMHgwNUY5LAorICAgIDB4MDVGQSwgMHgwNUZCLCAweDA1RkMsIDB4MDVGRCwgMHgwNUZFLCAweDA1RkYsCisgICAgMHgwNjAwLCAweDA2MDEsIDB4MDYwMiwgMHgwNjAzLCAweDA2MDQsIDB4MDYwNSwKKyAgICAweDA2MDYsIDB4MDYwNywgMHgwNkY5LCAweDA2RkEsIDB4MDZGQiwgMHgwNkZDLAorICAgIDB4MDZGRCwgMHgwNkZFLCAweDA2RkYsIDB4MDcwMCwgMHgwNzAxLCAweDA3MDIsCisgICAgMHgwNzAzLCAweDA3MDQsIDB4MDcwNSwgMHgwNzA2LCAweDA3MDcsIDB4MDdGOSwKKyAgICAweDA3RkEsIDB4MDdGQiwgMHgwN0ZDLCAweDA3RkQsIDB4MDdGRSwgMHgwN0ZGLAorICAgIDB4RjkwMCwgMHhGOTAxLCAweEY5MDIsIDB4RjkwMywgMHhGOTA0LCAweEY5MDUsCisgICAgMHhGOTA2LCAweEY5MDcsIDB4RjlGOSwgMHhGOUZBLCAweEY5RkIsIDB4RjlGQywKKyAgICAweEY5RkQsIDB4RjlGRSwgMHhGOUZGLCAweEZBMDAsIDB4RkEwMSwgMHhGQTAyLAorICAgIDB4RkEwMywgMHhGQTA0LCAweEZBMDUsIDB4RkEwNiwgMHhGQTA3LCAweEZBRjksCisgICAgMHhGQUZBLCAweEZBRkIsIDB4RkFGQywgMHhGQUZELCAweEZBRkUsIDB4RkFGRiwKKyAgICAweEZCMDAsIDB4RkIwMSwgMHhGQjAyLCAweEZCMDMsIDB4RkIwNCwgMHhGQjA1LAorICAgIDB4RkIwNiwgMHhGQjA3LCAweEZCRjksIDB4RkJGQSwgMHhGQkZCLCAweEZCRkMsCisgICAgMHhGQkZELCAweEZCRkUsIDB4RkJGRiwgMHhGQzAwLCAweEZDMDEsIDB4RkMwMiwKKyAgICAweEZDMDMsIDB4RkMwNCwgMHhGQzA1LCAweEZDMDYsIDB4RkMwNywgMHhGQ0Y5LAorICAgIDB4RkNGQSwgMHhGQ0ZCLCAweEZDRkMsIDB4RkNGRCwgMHhGQ0ZFLCAweEZDRkYsCisgICAgMHhGRDAwLCAweEZEMDEsIDB4RkQwMiwgMHhGRDAzLCAweEZEMDQsIDB4RkQwNSwKKyAgICAweEZEMDYsIDB4RkQwNywgMHhGREY5LCAweEZERkEsIDB4RkRGQiwgMHhGREZDLAorICAgIDB4RkRGRCwgMHhGREZFLCAweEZERkYsIDB4RkUwMCwgMHhGRTAxLCAweEZFMDIsCisgICAgMHhGRTAzLCAweEZFMDQsIDB4RkUwNSwgMHhGRTA2LCAweEZFMDcsIDB4RkVGOSwKKyAgICAweEZFRkEsIDB4RkVGQiwgMHhGRUZDLCAweEZFRkQsIDB4RkVGRSwgMHhGRUZGLAorICAgIDB4RkYwMCwgMHhGRjAxLCAweEZGMDIsIDB4RkYwMywgMHhGRjA0LCAweEZGMDUsCisgICAgMHhGRjA2LCAweEZGMDcsIDB4RkZGOSwgMHhGRkZBLCAweEZGRkIsIDB4RkZGQywKKyAgICAweEZGRkQsIDB4RkZGRSwgMHhGRkZGLAorfTsKKworI2RlZmluZSBPTjJBVkNfQ0IxMl9DT0RFUyA0NDEKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBvbjJhdmNfY2IxMl9jb2Rlc1tPTjJBVkNfQ0IxMl9DT0RFU10gPSB7CisgICAgMHgwMDAwLCAweDAwMEMsIDB4MDA0RiwgMHgwMTU2LCAweDAyRTYsIDB4MDQ2MiwKKyAgICAweDA0NEMsIDB4MDg2QSwgMHgwMjIyLCAweDAyMjgsIDB4MDQ3RiwgMHgwMzdBLAorICAgIDB4MDI4RiwgMHgwMkI4LCAweDBCQjcsIDB4MDRCNywgMHgwMkRBLCAweDAyNjIsCisgICAgMHgwMTI0LCAweDAwNTIsIDB4MDAwRiwgMHgwMDBELCAweDAwMEUsIDB4MDA1OCwKKyAgICAweDAwQTIsIDB4MDEyOSwgMHgwMkM4LCAweDAyNTYsIDB4MDQ0RCwgMHgwMTZFLAorICAgIDB4MDJBQSwgMHgwMkJFLCAweDAyN0YsIDB4MDJBOSwgMHgwMTZFLCAweDA1OTcsCisgICAgMHgwMkVFLCAweDAyRUUsIDB4MDEzQSwgMHgwMEE0LCAweDAwNEUsIDB4MDAwQywKKyAgICAweDAwNTYsIDB4MDA0QiwgMHgwMDU4LCAweDAxMjUsIDB4MDEwRSwgMHgwMUE3LAorICAgIDB4MDI2QSwgMHgwNDE1LCAweDAxMEMsIDB4MDIyOCwgMHgwNDQ2LCAweDAyMzIsCisgICAgMHgwMTdFLCAweDAxMjgsIDB4MDQ3MywgMHgwMzVFLCAweDAyNkEsIDB4MDE1RSwKKyAgICAweDAwREIsIDB4MDA1RSwgMHgwMDQ4LCAweDAxN0EsIDB4MDBBRSwgMHgwMEJBLAorICAgIDB4MDE3MiwgMHgwMjI5LCAweDAyRkIsIDB4MDQ1OCwgMHgwNUE0LCAweDAxNUEsCisgICAgMHgwMjk2LCAweDA1QkUsIDB4MDQ0RSwgMHgwMjE2LCAweDAxMkEsIDB4MDQyMywKKyAgICAweDA1M0UsIDB4MDJGMCwgMHgwMkYxLCAweDAxMUUsIDB4MDExMCwgMHgwMDlDLAorICAgIDB4MDI2QiwgMHgwMTEyLCAweDAxMUIsIDB4MDFCMywgMHgwMUJGLCAweDAyNjMsCisgICAgMHgwNTdFLCAweDA0QjgsIDB4MDE2QiwgMHgwMkRFLCAweDA0REUsIDB4MDQxNiwKKyAgICAweDAyREIsIDB4MDJBQiwgMHgwNkVFLCAweDA0Q0YsIDB4MDI1RiwgMHgwMkVCLAorICAgIDB4MDIyQSwgMHgwMTFBLCAweDAxMEEsIDB4MDVBNSwgMHgwMjM4LCAweDAyMTcsCisgICAgMHgwMkQ2LCAweDAyNUEsIDB4MDI4MiwgMHgwNDRGLCAweDA0M0QsIDB4MDFBRSwKKyAgICAweDAyNkIsIDB4MDVDMiwgMHgwNDNDLCAweDA0NEYsIDB4MDJEQiwgMHgwNUE3LAorICAgIDB4MDQ0RSwgMHgwNUJGLCAweDAyOTcsIDB4MDIyQSwgMHgwMjZDLCAweDAyQkQsCisgICAgMHgwODk3LCAweDAyODMsIDB4MDJCNiwgMHgwMkI3LCAweDAyNjQsIDB4MDQ1OSwKKyAgICAweDA0MEIsIDB4MDRERiwgMHgwMjk4LCAweDA0NTYsIDB4MEFGRiwgMHgwNkI3LAorICAgIDB4MDQ0OCwgMHgwNDQ5LCAweDA4QkUsIDB4MDZFRiwgMHgwNEI5LCAweDA1OTcsCisgICAgMHgwNDlBLCAweDAyRDIsIDB4MDJGOCwgMHgwOEY3LCAweDA0NzYsIDB4MDQ1MiwKKyAgICAweDA0NTMsIDB4MDQ1QSwgMHgwNUJFLCAweDA0M0UsIDB4MDREMiwgMHgwMkYyLAorICAgIDB4MDJFNCwgMHgwNDc3LCAweDBBRkUsIDB4MDVBNiwgMHgwMkUzLCAweDBCQjYsCisgICAgMHgwQTdFLCAweDA1QTYsIDB4MEE2NiwgMHgwOEJGLCAweDA1RkYsIDB4MDQ5MiwKKyAgICAweDAxNzAsIDB4MDEwNiwgMHgwMTQwLCAweDAxNDIsIDB4MDIyRSwgMHgwMkNGLAorICAgIDB4MDJCOSwgMHgwMkUyLCAweDAyRjMsIDB4MDVBMCwgMHgwODhFLCAweDBERDcsCisgICAgMHgwNEY2LCAweDA0N0UsIDB4MDQ1QiwgMHgwMzQ3LCAweDAyOUUsIDB4MDI2RCwKKyAgICAweDAxQUMsIDB4MDEzQiwgMHgwMTA0LCAweDAzNUYsIDB4MDJFQywgMHgwMjZFLAorICAgIDB4MDIzMywgMHgwMjA3LCAweDAyM0UsIDB4MDI2RSwgMHgwNTNGLCAweDA1QTcsCisgICAgMHgwNDU2LCAweDA0QUUsIDB4MERENiwgMHgwQTY3LCAweDA0OTMsIDB4MDRCQSwKKyAgICAweDA1RDMsIDB4MDVDMywgMHgwMjQ2LCAweDAyNDcsIDB4MDIwMiwgMHgwMkU4LAorICAgIDB4MDVBRSwgMHgwMzc0LCAweDA1MzcsIDB4MDVDNiwgMHgwNEJCLCAweDA2ODYsCisgICAgMHgwNEQzLCAweDA0REUsIDB4MDhDMywgMHgwNUJGLCAweDA0RjcsIDB4MTRGQiwKKyAgICAweDA5OTcsIDB4MEE3RiwgMHgwOEMyLCAweDA0MTcsIDB4MDQzNCwgMHgwNDc3LAorICAgIDB4MDM3QiwgMHgwNDYzLCAweDAyRUYsIDB4MDU5MiwgMHgwMkU1LCAweDA0OUIsCisgICAgMHgwMzVBLCAweDA0MzYsIDB4MDVBRiwgMHgwNjg3LCAweDA4OTYsIDB4MDk1RiwKKyAgICAweDA5QkUsIDB4MDk5NiwgMHgwNTU4LCAweDA4OEYsIDB4MEI4RSwgMHgwNTdFLAorICAgIDB4MDRDQSwgMHgwNUNFLCAweDA1RjMsIDB4MDQ3QSwgMHgwNUExLCAweDAyRTIsCisgICAgMHgwMkZBLCAweDAyMDQsIDB4MDIyQywgMHgwMjBFLCAweDAzNjAsIDB4MDJBRSwKKyAgICAweDA1RkMsIDB4MDQ1NywgMHgwNURBLCAweDA4NkIsIDB4MTRGQSwgMHgwNEI2LAorICAgIDB4MDJGRSwgMHgwNDBBLCAweDAyRTYsIDB4MDU3NiwgMHgwNDRBLCAweDAyOEMsCisgICAgMHgwMjEyLCAweDAyNDgsIDB4MDJFMCwgMHgwMjlBLCAweDAxMjYsIDB4MDE3RSwKKyAgICAweDAxMzAsIDB4MDI0QywgMHgwMjMyLCAweDA1OTYsIDB4MDM3OCwgMHgwNTNBLAorICAgIDB4MDRDQywgMHgwQTdDLCAweDA0NzAsIDB4MDU5MywgMHgwMkQ4LCAweDAyOUMsCisgICAgMHgwMkQ5LCAweDAyQkUsIDB4MDFBMCwgMHgwMTRFLCAweDAxMjAsIDB4MDEzQywKKyAgICAweDA2RUMsIDB4MDRDRCwgMHgwNTU5LCAweDA2QjYsIDB4MDQyMCwgMHgwNTdGLAorICAgIDB4MDU5NiwgMHgwOUJGLCAweDA1MzIsIDB4MDU1QSwgMHgwOTVFLCAweDA4QkMsCisgICAgMHgwNDcyLCAweDAyQ0EsIDB4MDVGMiwgMHgwNUZELCAweDA0N0UsIDB4MDVBMiwKKyAgICAweDA2RUEsIDB4MDVDRiwgMHgwNEQyLCAweDA0M0YsIDB4MDI4RSwgMHgwNDIyLAorICAgIDB4MDQ2MCwgMHgwNURFLCAweDA1M0IsIDB4MDhGNiwgMHgwQjhGLCAweDAyQ0UsCisgICAgMHgwNDczLCAweDA2RUQsIDB4MDQyMSwgMHgwMjhELCAweDAyM0MsIDB4MDQ3RiwKKyAgICAweDA1QTMsIDB4MDQ0QywgMHgwNDRELCAweDA0NTcsIDB4MDJDQSwgMHgwMkQ4LAorICAgIDB4MDI3QywgMHgwMjlFLCAweDAyM0UsIDB4MDI3RCwgMHgwMzYxLCAweDA0MTQsCisgICAgMHgwNUJDLCAweDA4QkQsIDB4MDJEQSwgMHgwMjRBLCAweDA0MzcsIDB4MDU1QiwKKyAgICAweDAzNzksIDB4MDFCRSwgMHgwNURGLCAweDA0RDMsIDB4MDI2OCwgMHgwMjA2LAorICAgIDB4MDIxMywgMHgwMkJBLCAweDAyMDMsIDB4MDIzNiwgMHgwMTI3LCAweDAxMzYsCisgICAgMHgwMjY4LCAweDAyNDIsIDB4MDJDRiwgMHgwNUZFLCAweDA1RDIsIDB4MDIzNywKKyAgICAweDAyNDMsIDB4MDQ3MiwgMHgwMzYyLCAweDAyN0EsIDB4MDJBRSwgMHgwNDcxLAorICAgIDB4MDQ3NCwgMHgwMjRCLCAweDAyQUYsIDB4MDFBNiwgMHgwMTJDLCAweDAxNjYsCisgICAgMHgwMTY2LCAweDAwQTYsIDB4MDBBQywgMHgwMTAwLCAweDAxQjIsIDB4MDIwRiwKKyAgICAweDAzNjMsIDB4MDQ0NiwgMHgwMTZBLCAweDAyMkUsIDB4MDU3NywgMHgwMkZGLAorICAgIDB4MDIyRCwgMHgwMTY4LCAweDA0NzUsIDB4MDI3RSwgMHgwMjIyLCAweDAxQTIsCisgICAgMHgwMTdCLCAweDAwRDIsIDB4MDBCRSwgMHgwMDUwLCAweDAwNTQsIDB4MDA2QSwKKyAgICAweDAxMUEsIDB4MDE0MywgMHgwMjRGLCAweDAyRTcsIDB4MDQ0NywgMHgwMTEwLAorICAgIDB4MDIzMywgMHgwMkQ5LCAweDAyQUYsIDB4MDI0RSwgMHgwMTZBLCAweDA1MzYsCisgICAgMHgwMzQyLCAweDAyQkMsIDB4MDE3NiwgMHgwMERBLCAweDAwNTQsIDB4MDA0QSwKKyAgICAweDAwMEUsIDB4MDAxMCwgMHgwMDRDLCAweDAwREMsIDB4MDE2NCwgMHgwMjNBLAorICAgIDB4MDQ3NiwgMHgwNENFLCAweDAxMTgsIDB4MDJDRSwgMHgwMjVFLCAweDAzNDYsCisgICAgMHgwMkE4LCAweDAxMjIsIDB4MDVCRCwgMHgwMjJGLCAweDAyRUEsIDB4MDE0QSwKKyAgICAweDAwQUEsIDB4MDA1MSwgMHgwMDBGLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb24yYXZjX2NiMTJfYml0c1tPTjJBVkNfQ0IxMl9DT0RFU10gPSB7CisgICAgIDIsICA0LCAgNywgIDksIDEwLCAxMSwKKyAgICAxMiwgMTMsIDEwLCAxMSwgMTEsIDExLAorICAgIDExLCAxMCwgMTIsIDEyLCAxMSwgMTEsCisgICAgIDksICA3LCAgNCwgIDQsICA1LCAgNywKKyAgICAgOSwgMTAsIDEwLCAxMSwgMTIsIDEwLAorICAgIDEwLCAxMSwgMTEsIDEwLCAgOSwgMTIsCisgICAgMTEsIDEwLCAxMCwgIDksICA3LCAgNSwKKyAgICAgNywgIDcsICA4LCAgOSwgMTAsIDEwLAorICAgIDExLCAxMiwgMTAsIDEwLCAxMSwgMTEsCisgICAgMTAsIDEwLCAxMiwgMTEsIDEwLCAxMCwKKyAgICAgOSwgIDgsICA3LCAgOSwgIDksICA5LAorICAgICA5LCAxMCwgMTAsIDExLCAxMSwgMTAsCisgICAgMTEsIDExLCAxMSwgMTEsIDEwLCAxMiwKKyAgICAxMSwgMTAsIDEwLCAxMCwgIDksICA5LAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsCisgICAgMTEsIDEyLCAxMCwgMTEsIDExLCAxMiwKKyAgICAxMSwgMTAsIDEyLCAxMiwgMTEsIDEwLAorICAgIDEwLCAxMCwgMTAsIDExLCAxMCwgMTEsCisgICAgMTAsIDExLCAxMSwgMTIsIDEyLCAxMCwKKyAgICAxMSwgMTEsIDEyLCAxMSwgMTAsIDEyLAorICAgIDEyLCAxMSwgMTEsIDExLCAxMCwgMTAsCisgICAgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMiwgMTIsIDEwLCAxMSwgMTIsIDEyLAorICAgIDExLCAxMSwgMTIsIDEyLCAxMiwgMTEsCisgICAgMTEsIDExLCAxMCwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTEsIDEyLCAxMiwgMTIsIDEwLAorICAgIDExLCAxMiwgMTIsIDExLCAxMSwgMTIsCisgICAgMTMsIDEyLCAxMiwgMTIsIDExLCAxMiwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDExLCAxMiwgMTMsCisgICAgMTIsIDEyLCAxMSwgMTEsIDExLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMSwgMTAsIDEwLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTIsIDEyLCAxMywgMTIsIDEyLCAxMiwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLAorICAgIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxNCwKKyAgICAxMywgMTMsIDEyLCAxMiwgMTIsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDEyLCAxMSwgMTIsIDEyLCAxMywKKyAgICAxMiwgMTMsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTIsIDExLCAxMywgMTQsIDEyLAorICAgIDExLCAxMiwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMCwgMTAsIDEwLCAgOSwKKyAgICAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLAorICAgIDEyLCAxMywgMTIsIDExLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTEsIDEyLCAxMywgMTIsCisgICAgMTEsIDEwLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMiwgMTEsIDExLCAxMiwgMTEsIDEyLAorICAgIDExLCAxMSwgMTEsIDEyLCAxMiwgMTEsCisgICAgMTEsIDEyLCAxMiwgMTEsIDEwLCAxMiwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMCwgMTAsIDExLCAxMSwgMTIsCisgICAgMTEsIDEyLCAxMCwgMTEsIDEyLCAxMiwKKyAgICAxMSwgMTAsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMCwgMTEsIDEwLCAxMCwgMTAsCisgICAgMTAsIDExLCAxMSwgMTEsIDExLCAxMCwKKyAgICAxMSwgMTIsIDExLCAxMSwgMTAsIDEyLAorICAgIDExLCAxMSwgMTAsIDEwLCAxMCwgMTAsCisgICAgIDksICA5LCAgOSwgMTAsIDEwLCAxMSwKKyAgICAxMSwgMTIsIDEwLCAxMSwgMTEsIDExLAorICAgIDExLCAxMCwgMTEsIDExLCAxMSwgMTAsCisgICAgIDksICA5LCAgOSwgIDcsICA3LCAgOCwKKyAgICAgOSwgMTAsIDEwLCAxMSwgMTIsIDEwLAorICAgIDEwLCAxMSwgMTEsIDEwLCAgOSwgMTEsCisgICAgMTEsIDEwLCAxMCwgIDksICA4LCAgNywKKyAgICAgNCwgIDUsICA3LCAgOSwgMTAsIDExLAorICAgIDExLCAxMiwgMTAsIDEwLCAxMSwgMTEsCisgICAgMTAsIDEwLCAxMSwgMTEsIDEwLCAxMCwKKyAgICAgOSwgIDcsICA1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG9uMmF2Y19jYjEyX3N5bXNbT04yQVZDX0NCMTJfQ09ERVNdID0geworICAgIDB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgMHgwMDA0LCAweDAwMDUsCisgICAgMHgwMDA2LCAweDAwMDcsIDB4MDAwOCwgMHgwMDA5LCAweDAwMEEsIDB4MDBGNiwKKyAgICAweDAwRjcsIDB4MDBGOCwgMHgwMEY5LCAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLAorICAgIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsIDB4MDEwMCwgMHgwMTAxLCAweDAxMDIsCisgICAgMHgwMTAzLCAweDAxMDQsIDB4MDEwNSwgMHgwMTA2LCAweDAxMDcsIDB4MDEwOCwKKyAgICAweDAxMDksIDB4MDEwQSwgMHgwMUY2LCAweDAxRjcsIDB4MDFGOCwgMHgwMUY5LAorICAgIDB4MDFGQSwgMHgwMUZCLCAweDAxRkMsIDB4MDFGRCwgMHgwMUZFLCAweDAxRkYsCisgICAgMHgwMjAwLCAweDAyMDEsIDB4MDIwMiwgMHgwMjAzLCAweDAyMDQsIDB4MDIwNSwKKyAgICAweDAyMDYsIDB4MDIwNywgMHgwMjA4LCAweDAyMDksIDB4MDIwQSwgMHgwMkY2LAorICAgIDB4MDJGNywgMHgwMkY4LCAweDAyRjksIDB4MDJGQSwgMHgwMkZCLCAweDAyRkMsCisgICAgMHgwMkZELCAweDAyRkUsIDB4MDJGRiwgMHgwMzAwLCAweDAzMDEsIDB4MDMwMiwKKyAgICAweDAzMDMsIDB4MDMwNCwgMHgwMzA1LCAweDAzMDYsIDB4MDMwNywgMHgwMzA4LAorICAgIDB4MDMwOSwgMHgwMzBBLCAweDAzRjYsIDB4MDNGNywgMHgwM0Y4LCAweDAzRjksCisgICAgMHgwM0ZBLCAweDAzRkIsIDB4MDNGQywgMHgwM0ZELCAweDAzRkUsIDB4MDNGRiwKKyAgICAweDA0MDAsIDB4MDQwMSwgMHgwNDAyLCAweDA0MDMsIDB4MDQwNCwgMHgwNDA1LAorICAgIDB4MDQwNiwgMHgwNDA3LCAweDA0MDgsIDB4MDQwOSwgMHgwNDBBLCAweDA0RjYsCisgICAgMHgwNEY3LCAweDA0RjgsIDB4MDRGOSwgMHgwNEZBLCAweDA0RkIsIDB4MDRGQywKKyAgICAweDA0RkQsIDB4MDRGRSwgMHgwNEZGLCAweDA1MDAsIDB4MDUwMSwgMHgwNTAyLAorICAgIDB4MDUwMywgMHgwNTA0LCAweDA1MDUsIDB4MDUwNiwgMHgwNTA3LCAweDA1MDgsCisgICAgMHgwNTA5LCAweDA1MEEsIDB4MDVGNiwgMHgwNUY3LCAweDA1RjgsIDB4MDVGOSwKKyAgICAweDA1RkEsIDB4MDVGQiwgMHgwNUZDLCAweDA1RkQsIDB4MDVGRSwgMHgwNUZGLAorICAgIDB4MDYwMCwgMHgwNjAxLCAweDA2MDIsIDB4MDYwMywgMHgwNjA0LCAweDA2MDUsCisgICAgMHgwNjA2LCAweDA2MDcsIDB4MDYwOCwgMHgwNjA5LCAweDA2MEEsIDB4MDZGNiwKKyAgICAweDA2RjcsIDB4MDZGOCwgMHgwNkY5LCAweDA2RkEsIDB4MDZGQiwgMHgwNkZDLAorICAgIDB4MDZGRCwgMHgwNkZFLCAweDA2RkYsIDB4MDcwMCwgMHgwNzAxLCAweDA3MDIsCisgICAgMHgwNzAzLCAweDA3MDQsIDB4MDcwNSwgMHgwNzA2LCAweDA3MDcsIDB4MDcwOCwKKyAgICAweDA3MDksIDB4MDcwQSwgMHgwN0Y2LCAweDA3RjcsIDB4MDdGOCwgMHgwN0Y5LAorICAgIDB4MDdGQSwgMHgwN0ZCLCAweDA3RkMsIDB4MDdGRCwgMHgwN0ZFLCAweDA3RkYsCisgICAgMHgwODAwLCAweDA4MDEsIDB4MDgwMiwgMHgwODAzLCAweDA4MDQsIDB4MDgwNSwKKyAgICAweDA4MDYsIDB4MDgwNywgMHgwODA4LCAweDA4MDksIDB4MDgwQSwgMHgwOEY2LAorICAgIDB4MDhGNywgMHgwOEY4LCAweDA4RjksIDB4MDhGQSwgMHgwOEZCLCAweDA4RkMsCisgICAgMHgwOEZELCAweDA4RkUsIDB4MDhGRiwgMHgwOTAwLCAweDA5MDEsIDB4MDkwMiwKKyAgICAweDA5MDMsIDB4MDkwNCwgMHgwOTA1LCAweDA5MDYsIDB4MDkwNywgMHgwOTA4LAorICAgIDB4MDkwOSwgMHgwOTBBLCAweDA5RjYsIDB4MDlGNywgMHgwOUY4LCAweDA5RjksCisgICAgMHgwOUZBLCAweDA5RkIsIDB4MDlGQywgMHgwOUZELCAweDA5RkUsIDB4MDlGRiwKKyAgICAweDBBMDAsIDB4MEEwMSwgMHgwQTAyLCAweDBBMDMsIDB4MEEwNCwgMHgwQTA1LAorICAgIDB4MEEwNiwgMHgwQTA3LCAweDBBMDgsIDB4MEEwOSwgMHgwQTBBLCAweDBBRjYsCisgICAgMHgwQUY3LCAweDBBRjgsIDB4MEFGOSwgMHgwQUZBLCAweDBBRkIsIDB4MEFGQywKKyAgICAweDBBRkQsIDB4MEFGRSwgMHgwQUZGLCAweEY2MDAsIDB4RjYwMSwgMHhGNjAyLAorICAgIDB4RjYwMywgMHhGNjA0LCAweEY2MDUsIDB4RjYwNiwgMHhGNjA3LCAweEY2MDgsCisgICAgMHhGNjA5LCAweEY2MEEsIDB4RjZGNiwgMHhGNkY3LCAweEY2RjgsIDB4RjZGOSwKKyAgICAweEY2RkEsIDB4RjZGQiwgMHhGNkZDLCAweEY2RkQsIDB4RjZGRSwgMHhGNkZGLAorICAgIDB4RjcwMCwgMHhGNzAxLCAweEY3MDIsIDB4RjcwMywgMHhGNzA0LCAweEY3MDUsCisgICAgMHhGNzA2LCAweEY3MDcsIDB4RjcwOCwgMHhGNzA5LCAweEY3MEEsIDB4RjdGNiwKKyAgICAweEY3RjcsIDB4RjdGOCwgMHhGN0Y5LCAweEY3RkEsIDB4RjdGQiwgMHhGN0ZDLAorICAgIDB4RjdGRCwgMHhGN0ZFLCAweEY3RkYsIDB4RjgwMCwgMHhGODAxLCAweEY4MDIsCisgICAgMHhGODAzLCAweEY4MDQsIDB4RjgwNSwgMHhGODA2LCAweEY4MDcsIDB4RjgwOCwKKyAgICAweEY4MDksIDB4RjgwQSwgMHhGOEY2LCAweEY4RjcsIDB4RjhGOCwgMHhGOEY5LAorICAgIDB4RjhGQSwgMHhGOEZCLCAweEY4RkMsIDB4RjhGRCwgMHhGOEZFLCAweEY4RkYsCisgICAgMHhGOTAwLCAweEY5MDEsIDB4RjkwMiwgMHhGOTAzLCAweEY5MDQsIDB4RjkwNSwKKyAgICAweEY5MDYsIDB4RjkwNywgMHhGOTA4LCAweEY5MDksIDB4RjkwQSwgMHhGOUY2LAorICAgIDB4RjlGNywgMHhGOUY4LCAweEY5RjksIDB4RjlGQSwgMHhGOUZCLCAweEY5RkMsCisgICAgMHhGOUZELCAweEY5RkUsIDB4RjlGRiwgMHhGQTAwLCAweEZBMDEsIDB4RkEwMiwKKyAgICAweEZBMDMsIDB4RkEwNCwgMHhGQTA1LCAweEZBMDYsIDB4RkEwNywgMHhGQTA4LAorICAgIDB4RkEwOSwgMHhGQTBBLCAweEZBRjYsIDB4RkFGNywgMHhGQUY4LCAweEZBRjksCisgICAgMHhGQUZBLCAweEZBRkIsIDB4RkFGQywgMHhGQUZELCAweEZBRkUsIDB4RkFGRiwKKyAgICAweEZCMDAsIDB4RkIwMSwgMHhGQjAyLCAweEZCMDMsIDB4RkIwNCwgMHhGQjA1LAorICAgIDB4RkIwNiwgMHhGQjA3LCAweEZCMDgsIDB4RkIwOSwgMHhGQjBBLCAweEZCRjYsCisgICAgMHhGQkY3LCAweEZCRjgsIDB4RkJGOSwgMHhGQkZBLCAweEZCRkIsIDB4RkJGQywKKyAgICAweEZCRkQsIDB4RkJGRSwgMHhGQkZGLCAweEZDMDAsIDB4RkMwMSwgMHhGQzAyLAorICAgIDB4RkMwMywgMHhGQzA0LCAweEZDMDUsIDB4RkMwNiwgMHhGQzA3LCAweEZDMDgsCisgICAgMHhGQzA5LCAweEZDMEEsIDB4RkNGNiwgMHhGQ0Y3LCAweEZDRjgsIDB4RkNGOSwKKyAgICAweEZDRkEsIDB4RkNGQiwgMHhGQ0ZDLCAweEZDRkQsIDB4RkNGRSwgMHhGQ0ZGLAorICAgIDB4RkQwMCwgMHhGRDAxLCAweEZEMDIsIDB4RkQwMywgMHhGRDA0LCAweEZEMDUsCisgICAgMHhGRDA2LCAweEZEMDcsIDB4RkQwOCwgMHhGRDA5LCAweEZEMEEsIDB4RkRGNiwKKyAgICAweEZERjcsIDB4RkRGOCwgMHhGREY5LCAweEZERkEsIDB4RkRGQiwgMHhGREZDLAorICAgIDB4RkRGRCwgMHhGREZFLCAweEZERkYsIDB4RkUwMCwgMHhGRTAxLCAweEZFMDIsCisgICAgMHhGRTAzLCAweEZFMDQsIDB4RkUwNSwgMHhGRTA2LCAweEZFMDcsIDB4RkUwOCwKKyAgICAweEZFMDksIDB4RkUwQSwgMHhGRUY2LCAweEZFRjcsIDB4RkVGOCwgMHhGRUY5LAorICAgIDB4RkVGQSwgMHhGRUZCLCAweEZFRkMsIDB4RkVGRCwgMHhGRUZFLCAweEZFRkYsCisgICAgMHhGRjAwLCAweEZGMDEsIDB4RkYwMiwgMHhGRjAzLCAweEZGMDQsIDB4RkYwNSwKKyAgICAweEZGMDYsIDB4RkYwNywgMHhGRjA4LCAweEZGMDksIDB4RkYwQSwgMHhGRkY2LAorICAgIDB4RkZGNywgMHhGRkY4LCAweEZGRjksIDB4RkZGQSwgMHhGRkZCLCAweEZGRkMsCisgICAgMHhGRkZELCAweEZGRkUsIDB4RkZGRiwKK307CisKKyNkZWZpbmUgT04yQVZDX0NCMTNfQ09ERVMgNjI1CitzdGF0aWMgY29uc3QgdWludDE2X3Qgb24yYXZjX2NiMTNfY29kZXNbT04yQVZDX0NCMTNfQ09ERVNdID0geworICAgIDB4MDAwMCwgMHgwMDE1LCAweDAwOEUsIDB4MDMzOCwgMHgwOUZCLCAweDBCRUMsCisgICAgMHgwQzYxLCAweDEzRTEsIDB4MThBNywgMHgzMTNCLCAweDYxQkIsIDB4MDVEOSwKKyAgICAweDA4OTYsIDB4MDY2QiwgMHgwNUM2LCAweDE4QTYsIDB4NDBFNCwgMHgyMDgxLAorICAgIDB4MTA0RiwgMHgxM0UwLCAweDBDMjIsIDB4MDdFNCwgMHgwM0Y3LCAweDAwODcsCisgICAgMHgwMDE0LCAweDAwMTYsIDB4MDAxRCwgMHgwMDlDLCAweDAyRTIsIDB4MDM3RSwKKyAgICAweDA4OTcsIDB4MDg5OCwgMHgwQzYzLCAweDExN0QsIDB4MjA4MiwgMHgyN0FBLAorICAgIDB4MDMzQiwgMHgwNkM1LCAweDA0RjIsIDB4MDMzMSwgMHgxOUVCLCAweDE4QTgsCisgICAgMHgxM0UyLCAweDBERTcsIDB4MEM2MiwgMHgwNkRGLCAweDA1QzcsIDB4MDJGNCwKKyAgICAweDAwOTgsIDB4MDAxQSwgMHgwMDdDLCAweDAwODAsIDB4MDEwNiwgMHgwMkY1LAorICAgIDB4MDNFQywgMHgwNjE3LCAweDA2MjEsIDB4MDhGOSwgMHgxMDUwLCAweDExN0YsCisgICAgMHgxMUUwLCAweDAzNkEsIDB4MDQ1QSwgMHgwNkM2LCAweDAzN0YsIDB4MTE3RSwKKyAgICAweDIwODMsIDB4MEJFRCwgMHgwQzlFLCAweDA2NTgsIDB4MDRGMywgMHgwMzY4LAorICAgIDB4MDJFRSwgMHgwMEZBLCAweDAwOEQsIDB4MDMxQywgMHgwMUZGLCAweDAyMDYsCisgICAgMHgwMzFFLCAweDA2QzgsIDB4MDY1OSwgMHgwOUI1LCAweDBDMjMsIDB4MEJFRiwKKyAgICAweDBDOUYsIDB4MTlFQywgMHgwNENDLCAweDA2MjMsIDB4MDZDNywgMHgwNjIyLAorICAgIDB4MzEzQywgMHgxN0JCLCAweDExRTEsIDB4MEM2NCwgMHgwQkVFLCAweDA3REMsCisgICAgMHgwNENCLCAweDAzNzUsIDB4MDIwNSwgMHgwMjZFLCAweDBDMjQsIDB4MDZDOSwKKyAgICAweDAzMjQsIDB4MDRERiwgMHgwNjQyLCAweDA5QjYsIDB4MDY0MywgMHgwQkYyLAorICAgIDB4MDgzQiwgMHgxMDUxLCAweDI3QUIsIDB4MDM2QywgMHgwNjA3LCAweDA2RTIsCisgICAgMHgwNDVCLCAweDMxM0QsIDB4MjA4NCwgMHgxOEE5LCAweDEzRTMsIDB4MENBMCwKKyAgICAweDA4OTksIDB4MDY2RSwgMHgwNkUzLCAweDAzNjksIDB4MDYwNiwgMHgwREU4LAorICAgIDB4MDYxQSwgMHgwNDUzLCAweDA2NUEsIDB4MDY1QiwgMHgwODlCLCAweDA4OUMsCisgICAgMHgwOUZELCAweDBCQTUsIDB4MThBQSwgMHgxMUUyLCAweDA1QzgsIDB4MDlCNywKKyAgICAweDA2NkYsIDB4MDZDQSwgMHgxOUVELCAweDIwODUsIDB4MjA4NiwgMHgwRDgzLAorICAgIDB4MTA1MiwgMHgxMDUzLCAweDA5RkMsIDB4MDg5QSwgMHgwNjQ0LCAweDA4M0UsCisgICAgMHgxM0U0LCAweDA4RkMsIDB4MDYyNCwgMHgxMDU1LCAweDBDNjUsIDB4MDg5RCwKKyAgICAweDA2NDUsIDB4MDhGRCwgMHgwQzY2LCAweDBDQTEsIDB4MTA1NiwgMHgwNUUxLAorICAgIDB4MDg5RSwgMHgwOEZBLCAweDA3RTUsIDB4MzEzRSwgMHgyMDg3LCAweDExRTMsCisgICAgMHgxOUVFLCAweDE4QUIsIDB4MTA1NCwgMHgxOUVGLCAweDE3QkMsIDB4MDhGQiwKKyAgICAweDA3RTYsIDB4MThBRCwgMHgwQkYzLCAweDA3RTcsIDB4MEM2NywgMHgxMDU3LAorICAgIDB4MDdFQSwgMHgwOEZGLCAweDEwNTgsIDB4MERFOSwgMHgxOEFFLCAweDE5RjAsCisgICAgMHgwNjA4LCAweDA4OUYsIDB4MDhGRSwgMHgwNkNCLCAweDMxM0YsIDB4MjA4OCwKKyAgICAweDEzRTUsIDB4MzE0MiwgMHgxMUU0LCAweDE4QUMsIDB4MTFFNSwgMHgwQ0EyLAorICAgIDB4MDY1RSwgMHgxM0U2LCAweDI3QUQsIDB4MTlGMSwgMHgwRDg2LCAweDBERUEsCisgICAgMHgwQ0EzLCAweDBERUIsIDB4MTdCRSwgMHgwQzJBLCAweDEzRTgsIDB4MENBNiwKKyAgICAweDBERUUsIDB4MDVGRCwgMHgwOTkyLCAweDBDMjUsIDB4MDYzRSwgMHg0MEU1LAorICAgIDB4MTFFNiwgMHgzMTQzLCAweDE4QUYsIDB4MjdBQywgMHgwQzI2LCAweDE3QkQsCisgICAgMHgxM0U3LCAweDBDMjcsIDB4MTFFNywgMHgyN0IyLCAweDQwRTgsIDB4MThCMywKKyAgICAweDE3QzAsIDB4MThGRSwgMHgxOUYyLCAweDE5RjMsIDB4MzFGRSwgMHgxN0MxLAorICAgIDB4MTlGNiwgMHgwQkE2LCAweDA5RkUsIDB4MERFRiwgMHgxN0JGLCAweDBDMkIsCisgICAgMHg0MEU2LCAweDE4QjAsIDB4NDBFNywgMHgxM0U5LCAweDIwODksIDB4MjdBRSwKKyAgICAweDI3QUYsIDB4MjA4QSwgMHgxOEIxLCAweDE4QjIsIDB4MjdCMywgMHhCQ0VGLAorICAgIDB4MkYzQSwgMHg0MEVBLCAweDE3QzUsIDB4MTdDNiwgMHgxN0M3LCAweDE5RjcsCisgICAgMHgxMzNFLCAweDEwNUEsIDB4MTdDQSwgMHgwNjVGLCAweDBDQTcsIDB4MEM3RSwKKyAgICAweDEwNTksIDB4QkNFRCwgMHg0MEU5LCAweEJDRUUsIDB4MTdDMiwgMHg2M0ZFLAorICAgIDB4MjA4QiwgMHgyMDhFLCAweDIwOEYsIDB4MTdDMywgMHgxN0M0LCAweDA2MjUsCisgICAgMHgwM0VELCAweDA0NUMsIDB4MDRDRCwgMHgwNURBLCAweDA1Q0UsIDB4MDVGRiwKKyAgICAweDA2MjYsIDB4MDYwQSwgMHgwNUUzLCAweDA4M0YsIDB4MEJBOCwgMHgwQkE5LAorICAgIDB4NDBFQiwgMHgxM0VBLCAweDBDQ0EsIDB4MEJBNywgMHgwOEEyLCAweDA2NDYsCisgICAgMHgwNjA5LCAweDA1RTIsIDB4MDQxRSwgMHgwNUZFLCAweDAzNzMsIDB4MDM3NiwKKyAgICAweDA5OUUsIDB4MDVERSwgMHgwNjQ3LCAweDA1RTYsIDB4MDZENiwgMHgwN0VCLAorICAgIDB4MDlGRiwgMHgxQjVFLCAweDBCQUIsIDB4MDhBRSwgMHgwQzM2LCAweDBGQkEsCisgICAgMHgxN0NCLCAweDRDRkUsIDB4MTA1QiwgMHgwRDg3LCAweDBEQUUsIDB4MTNFQiwKKyAgICAweDBCQUEsIDB4MDk5MywgMHgwOEEzLCAweDA4NUUsIDB4MDYwMCwgMHgwNjAxLAorICAgIDB4MDVEQiwgMHgwNjY0LCAweDA0RjAsIDB4MDVGOCwgMHgwNjM0LCAweDA4NUYsCisgICAgMHgwNkY2LCAweDA4RjQsIDB4MEM1QSwgMHgwQ0ZDLCAweDBEREMsIDB4MDlGNiwKKyAgICAweDBDMTYsIDB4MTE1RSwgMHgxM0Q4LCAweDEzREEsIDB4MEM5NCwgMHgwQ0ZBLAorICAgIDB4MDgyRSwgMHgwQjlFLCAweDA2QzIsIDB4MEJFNCwgMHgwNkRBLCAweDA1QzAsCisgICAgMHgwNjE0LCAweDA1QzksIDB4MDVERiwgMHgwMzNBLCAweDAzMzYsIDB4MDVGQSwKKyAgICAweDA0Q0UsIDB4MDVDMSwgMHgwODkwLCAweDA4OTEsIDB4MDgzOCwgMHgwODM5LAorICAgIDB4MENGRCwgMHgwQkEwLCAweDYxQjgsIDB4MDdERSwgMHgwNjM1LCAweDBCOUYsCisgICAgMHgwNjQwLCAweDA2REIsIDB4MDgyRiwgMHgwOUFDLCAweDA0QzgsIDB4MDY2NiwKKyAgICAweDA0REUsIDB4MDNGNCwgMHgwMzM5LCAweDIwNzksIDB4MjY3RSwgMHgxNzlFLAorICAgIDB4MzBERSwgMHg2M0ZGLCAweDI3QTAsIDB4MTk5NywgMHgzNkJGLCAweDNFRUMsCisgICAgMHg5OUZFLCAweDk5RkYsIDB4MEM5NSwgMHgxMDQ4LCAweDBDNUIsIDB4MDYzNiwKKyAgICAweDBDNUMsIDB4MjA3NiwgMHgxM0RCLCAweDExNUYsIDB4MTc5QywgMHgyMDc3LAorICAgIDB4MTA0NiwgMHgzNkJFLCAweDE5OTYsIDB4MjA3OCwgMHg2MUI5LCAweDExNzUsCisgICAgMHgxN0IwLCAweDNFRUQsIDB4MTlFMSwgMHgxOUUyLCAweDIwN0EsIDB4M0VFRSwKKyAgICAweEJDRUMsIDB4MzEzOCwgMHgzMTM5LCAweDA3REYsIDB4MTE3NiwgMHgwODkyLAorICAgIDB4MDY2NywgMHgxOEEwLCAweDE4QTIsIDB4MTNEQywgMHgxMTc0LCAweDEzREQsCisgICAgMHgxNzlGLCAweDMwREYsIDB4MTlFMCwgMHgxOEEzLCAweDEwNDksIDB4MTdCMiwKKyAgICAweDIwN0IsIDB4MTdCMywgMHgwQzE3LCAweDE5RTMsIDB4MTdCNCwgMHgyMDdDLAorICAgIDB4M0VFRiwgMHgyMDdELCAweDE5RTQsIDB4MjdBMSwgMHgwQzVGLCAweDA4RjUsCisgICAgMHgwRERELCAweDA2NTIsIDB4MThBNCwgMHgwQzk2LCAweDBDNUQsIDB4MTA0QSwKKyAgICAweDExNzcsIDB4MENGRSwgMHgwQzVFLCAweDBEREUsIDB4MDlGNywgMHgxN0IxLAorICAgIDB4MTlFNiwgMHgwQzFFLCAweDA5QUUsIDB4MTE3OSwgMHgwREUwLCAweDE3QjUsCisgICAgMHgwQkEyLCAweDE3QjYsIDB4MjdBMywgMHg0MEUwLCAweDQwRTEsIDB4MDZEQywKKyAgICAweDA5QUYsIDB4MDlBRCwgMHgwNUMyLCAweDE5RTUsIDB4MjdBMiwgMHgwRERGLAorICAgIDB4MEMxQywgMHgwQzFELCAweDBCRTYsIDB4MEJBMSwgMHgxMTc4LCAweDA2NTQsCisgICAgMHgxM0RFLCAweDQwRTIsIDB4MDg5MywgMHgwNjY4LCAweDA3RTEsIDB4MEJFNywKKyAgICAweDA4RjYsIDB4MERFMSwgMHgyN0E0LCAweDEwNEIsIDB4MTlFNywgMHg0MEUzLAorICAgIDB4MDVENiwgMHgwOUY5LCAweDA2REQsIDB4MDRDQSwgMHgxN0I3LCAweDE3QjgsCisgICAgMHgwQzk3LCAweDBDOTgsIDB4MDdFMCwgMHgwQzk5LCAweDA2NTUsIDB4MDlGOCwKKyAgICAweDA2NTYsIDB4MEM5QSwgMHgwREUyLCAweDA2NjksIDB4MDREMywgMHgwNjFDLAorICAgIDB4MDg5NCwgMHgxM0RGLCAweDBDMUYsIDB4MTA0QywgMHgyN0E2LCAweDYxQkEsCisgICAgMHgyN0E3LCAweDA2NkEsIDB4MDYxRCwgMHgwNjM3LCAweDA0RDIsIDB4MjdBNSwKKyAgICAweDExN0EsIDB4MEM5QiwgMHgwOUIwLCAweDA5QjEsIDB4MDVFMCwgMHgwNjAyLAorICAgIDB4MDVGQiwgMHgwNEYxLCAweDA4RjcsIDB4MDZGQSwgMHgwNjAzLCAweDAzN0MsCisgICAgMHgwNUMzLCAweDBCRTgsIDB4MDg5NSwgMHgwQzYwLCAweDExN0IsIDB4MTlFOCwKKyAgICAweDI3QTgsIDB4MTlFOSwgMHgwNjU3LCAweDA4M0EsIDB4MDZDNCwgMHgwNUQ3LAorICAgIDB4MTdCOSwgMHgwQ0ZGLCAweDBERTMsIDB4MTA0RCwgMHgwN0UyLCAweDA2NDEsCisgICAgMHgwNjFFLCAweDA1RDgsIDB4MDM2NiwgMHgwNjE2LCAweDAzMkUsIDB4MDI2OCwKKyAgICAweDAyRTYsIDB4MDQ1NiwgMHgwQkEzLCAweDA2RkIsIDB4MEQ4MCwgMHgwREU1LAorICAgIDB4MTA0RSwgMHgxN0JBLCAweDI3QTksIDB4MDMzMCwgMHgwN0UzLCAweDA2MUYsCisgICAgMHgwMzY3LCAweDIwN0UsIDB4MEM5QywgMHgxMTdDLCAweDBERTQsIDB4MDZERSwKKyAgICAweDA2MjAsIDB4MDQ1MCwgMHgwNDJFLCAweDAyRjIsIDB4MDIwNCwgMHgwMDg2LAorICAgIDB4MDA4QywgMHgwMEZFLCAweDAyMkEsIDB4MDM3MiwgMHgwNUNBLCAweDA0NTIsCisgICAgMHgwOEY4LCAweDBCQTQsIDB4MTlFQSwgMHgxOEE1LCAweDAzMDYsIDB4MDVGQywKKyAgICAweDAzRjYsIDB4MDQ1OCwgMHgwRDgxLCAweDBCRTksIDB4MDlCMiwgMHgwQzIwLAorICAgIDB4MDlGQSwgMHgwNjA0LCAweDAzNzAsIDB4MDFGRSwgMHgwMTBBLCAweDAwODQsCisgICAgMHgwMDEyLCAweDAwMUMsIDB4MDA4OCwgMHgwMjZBLCAweDA1Q0IsIDB4MDYzQiwKKyAgICAweDA5QjQsIDB4MEQ4MiwgMHgwREU2LCAweDIwN0YsIDB4MjA4MCwgMHgwMzBDLAorICAgIDB4MDYwNSwgMHgwNDU5LCAweDAzNzQsIDB4MzEzQSwgMHgwQzlELCAweDBCRUEsCisgICAgMHgwQkVCLCAweDBDMjEsIDB4MDlCMywgMHgwNjNBLCAweDAyMTYsIDB4MDA5RCwKKyAgICAweDAwMUUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBvbjJhdmNfY2IxM19iaXRzW09OMkFWQ19DQjEzX0NPREVTXSA9IHsKKyAgICAgMSwgIDUsICA4LCAxMCwgMTIsIDEyLAorICAgIDEyLCAxMywgMTMsIDE0LCAxNSwgMTEsCisgICAgMTIsIDExLCAxMSwgMTMsIDE1LCAxNCwKKyAgICAxMywgMTMsIDEyLCAxMSwgMTAsICA4LAorICAgICA1LCAgNSwgIDUsICA4LCAxMCwgMTAsCisgICAgMTIsIDEyLCAxMiwgMTMsIDE0LCAxNCwKKyAgICAxMCwgMTEsIDExLCAxMCwgMTMsIDEzLAorICAgIDEzLCAxMiwgMTIsIDExLCAxMSwgMTAsCisgICAgIDgsICA1LCAgNywgIDgsICA5LCAxMCwKKyAgICAxMCwgMTEsIDExLCAxMiwgMTMsIDEzLAorICAgIDEzLCAxMCwgMTEsIDExLCAxMCwgMTMsCisgICAgMTQsIDEyLCAxMiwgMTEsIDExLCAxMCwKKyAgICAxMCwgIDgsICA4LCAxMCwgIDksIDEwLAorICAgIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEzLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxNCwgMTMsIDEzLCAxMiwgMTIsIDExLAorICAgIDExLCAxMCwgMTAsIDEwLCAxMiwgMTEsCisgICAgMTAsIDExLCAxMSwgMTIsIDExLCAxMiwKKyAgICAxMiwgMTMsIDE0LCAxMCwgMTEsIDExLAorICAgIDExLCAxNCwgMTQsIDEzLCAxMywgMTIsCisgICAgMTIsIDExLCAxMSwgMTAsIDExLCAxMiwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMSwgMTIsCisgICAgMTEsIDExLCAxMywgMTQsIDE0LCAxMiwKKyAgICAxMywgMTMsIDEyLCAxMiwgMTEsIDEyLAorICAgIDEzLCAxMiwgMTEsIDEzLCAxMiwgMTIsCisgICAgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMSwKKyAgICAxMiwgMTIsIDExLCAxNCwgMTQsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsCisgICAgMTEsIDEzLCAxMiwgMTEsIDEyLCAxMywKKyAgICAxMSwgMTIsIDEzLCAxMiwgMTMsIDEzLAorICAgIDExLCAxMiwgMTIsIDExLCAxNCwgMTQsCisgICAgMTMsIDE0LCAxMywgMTMsIDEzLCAxMiwKKyAgICAxMSwgMTMsIDE0LCAxMywgMTIsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEyLCAxMywgMTIsCisgICAgMTIsIDExLCAxMiwgMTIsIDExLCAxNSwKKyAgICAxMywgMTQsIDEzLCAxNCwgMTIsIDEzLAorICAgIDEzLCAxMiwgMTMsIDE0LCAxNSwgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDE0LCAxMywKKyAgICAxMywgMTIsIDEyLCAxMiwgMTMsIDEyLAorICAgIDE1LCAxMywgMTUsIDEzLCAxNCwgMTQsCisgICAgMTQsIDE0LCAxMywgMTMsIDE0LCAxNiwKKyAgICAxNCwgMTUsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDExLCAxMiwgMTIsCisgICAgMTMsIDE2LCAxNSwgMTYsIDEzLCAxNSwKKyAgICAxNCwgMTQsIDE0LCAxMywgMTMsIDExLAorICAgIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwKKyAgICAxNSwgMTMsIDEyLCAxMiwgMTIsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsCisgICAgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMiwgMTMsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxNSwgMTMsIDEyLCAxMiwgMTMsCisgICAgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLAorICAgIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEzLCAxMywgMTMsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDExLCAxMiwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDEwLCAxMCwgMTEsCisgICAgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDE1LCAxMSwgMTEsIDEyLAorICAgIDExLCAxMSwgMTIsIDEyLCAxMSwgMTEsCisgICAgMTEsIDEwLCAxMCwgMTQsIDE0LCAxMywKKyAgICAxNCwgMTUsIDE0LCAxMywgMTQsIDE0LAorICAgIDE2LCAxNiwgMTIsIDEzLCAxMiwgMTEsCisgICAgMTIsIDE0LCAxMywgMTMsIDEzLCAxNCwKKyAgICAxMywgMTQsIDEzLCAxNCwgMTUsIDEzLAorICAgIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTQsCisgICAgMTYsIDE0LCAxNCwgMTEsIDEzLCAxMiwKKyAgICAxMSwgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxNCwgMTMsIDEzLCAxMywgMTMsCisgICAgMTQsIDEzLCAxMiwgMTMsIDEzLCAxNCwKKyAgICAxNCwgMTQsIDEzLCAxNCwgMTIsIDEyLAorICAgIDEyLCAxMSwgMTMsIDEyLCAxMiwgMTMsCisgICAgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMywKKyAgICAxMywgMTIsIDEyLCAxMywgMTIsIDEzLAorICAgIDEyLCAxMywgMTQsIDE1LCAxNSwgMTEsCisgICAgMTIsIDEyLCAxMSwgMTMsIDE0LCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTMsIDExLAorICAgIDEzLCAxNSwgMTIsIDExLCAxMSwgMTIsCisgICAgMTIsIDEyLCAxNCwgMTMsIDEzLCAxNSwKKyAgICAxMSwgMTIsIDExLCAxMSwgMTMsIDEzLAorICAgIDEyLCAxMiwgMTEsIDEyLCAxMSwgMTIsCisgICAgMTEsIDEyLCAxMiwgMTEsIDExLCAxMSwKKyAgICAxMiwgMTMsIDEyLCAxMywgMTQsIDE1LAorICAgIDE0LCAxMSwgMTEsIDExLCAxMSwgMTQsCisgICAgMTMsIDEyLCAxMiwgMTIsIDExLCAxMSwKKyAgICAxMSwgMTEsIDEyLCAxMSwgMTEsIDEwLAorICAgIDExLCAxMiwgMTIsIDEyLCAxMywgMTMsCisgICAgMTQsIDEzLCAxMSwgMTIsIDExLCAxMSwKKyAgICAxMywgMTIsIDEyLCAxMywgMTEsIDExLAorICAgIDExLCAxMSwgMTAsIDExLCAxMCwgMTAsCisgICAgMTAsIDExLCAxMiwgMTEsIDEyLCAxMiwKKyAgICAxMywgMTMsIDE0LCAxMCwgMTEsIDExLAorICAgIDEwLCAxNCwgMTIsIDEzLCAxMiwgMTEsCisgICAgMTEsIDExLCAxMSwgMTAsIDEwLCAgOCwKKyAgICAgOCwgIDgsIDEwLCAxMCwgMTEsIDExLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMCwgMTEsCisgICAgMTAsIDExLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTEsIDEwLCAgOSwgIDksICA4LAorICAgICA1LCAgNSwgIDgsIDEwLCAxMSwgMTEsCisgICAgMTIsIDEyLCAxMiwgMTQsIDE0LCAxMCwKKyAgICAxMSwgMTEsIDEwLCAxNCwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDExLCAxMCwgIDgsCisgICAgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgb24yYXZjX2NiMTNfc3ltc1tPTjJBVkNfQ0IxM19DT0RFU10gPSB7CisgICAgMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDQsIDB4MDAwNSwKKyAgICAweDAwMDYsIDB4MDAwNywgMHgwMDA4LCAweDAwMDksIDB4MDAwQSwgMHgwMDBCLAorICAgIDB4MDAwQywgMHgwMEY0LCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LCAweDAwRjgsCisgICAgMHgwMEY5LCAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLCAweDAwRkQsIDB4MDBGRSwKKyAgICAweDAwRkYsIDB4MDEwMCwgMHgwMTAxLCAweDAxMDIsIDB4MDEwMywgMHgwMTA0LAorICAgIDB4MDEwNSwgMHgwMTA2LCAweDAxMDcsIDB4MDEwOCwgMHgwMTA5LCAweDAxMEEsCisgICAgMHgwMTBCLCAweDAxMEMsIDB4MDFGNCwgMHgwMUY1LCAweDAxRjYsIDB4MDFGNywKKyAgICAweDAxRjgsIDB4MDFGOSwgMHgwMUZBLCAweDAxRkIsIDB4MDFGQywgMHgwMUZELAorICAgIDB4MDFGRSwgMHgwMUZGLCAweDAyMDAsIDB4MDIwMSwgMHgwMjAyLCAweDAyMDMsCisgICAgMHgwMjA0LCAweDAyMDUsIDB4MDIwNiwgMHgwMjA3LCAweDAyMDgsIDB4MDIwOSwKKyAgICAweDAyMEEsIDB4MDIwQiwgMHgwMjBDLCAweDAyRjQsIDB4MDJGNSwgMHgwMkY2LAorICAgIDB4MDJGNywgMHgwMkY4LCAweDAyRjksIDB4MDJGQSwgMHgwMkZCLCAweDAyRkMsCisgICAgMHgwMkZELCAweDAyRkUsIDB4MDJGRiwgMHgwMzAwLCAweDAzMDEsIDB4MDMwMiwKKyAgICAweDAzMDMsIDB4MDMwNCwgMHgwMzA1LCAweDAzMDYsIDB4MDMwNywgMHgwMzA4LAorICAgIDB4MDMwOSwgMHgwMzBBLCAweDAzMEIsIDB4MDMwQywgMHgwM0Y0LCAweDAzRjUsCisgICAgMHgwM0Y2LCAweDAzRjcsIDB4MDNGOCwgMHgwM0Y5LCAweDAzRkEsIDB4MDNGQiwKKyAgICAweDAzRkMsIDB4MDNGRCwgMHgwM0ZFLCAweDAzRkYsIDB4MDQwMCwgMHgwNDAxLAorICAgIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwgMHgwNDA2LCAweDA0MDcsCisgICAgMHgwNDA4LCAweDA0MDksIDB4MDQwQSwgMHgwNDBCLCAweDA0MEMsIDB4MDRGNCwKKyAgICAweDA0RjUsIDB4MDRGNiwgMHgwNEY3LCAweDA0RjgsIDB4MDRGOSwgMHgwNEZBLAorICAgIDB4MDRGQiwgMHgwNEZDLCAweDA0RkQsIDB4MDRGRSwgMHgwNEZGLCAweDA1MDAsCisgICAgMHgwNTAxLCAweDA1MDIsIDB4MDUwMywgMHgwNTA0LCAweDA1MDUsIDB4MDUwNiwKKyAgICAweDA1MDcsIDB4MDUwOCwgMHgwNTA5LCAweDA1MEEsIDB4MDUwQiwgMHgwNTBDLAorICAgIDB4MDVGNCwgMHgwNUY1LCAweDA1RjYsIDB4MDVGNywgMHgwNUY4LCAweDA1RjksCisgICAgMHgwNUZBLCAweDA1RkIsIDB4MDVGQywgMHgwNUZELCAweDA1RkUsIDB4MDVGRiwKKyAgICAweDA2MDAsIDB4MDYwMSwgMHgwNjAyLCAweDA2MDMsIDB4MDYwNCwgMHgwNjA1LAorICAgIDB4MDYwNiwgMHgwNjA3LCAweDA2MDgsIDB4MDYwOSwgMHgwNjBBLCAweDA2MEIsCisgICAgMHgwNjBDLCAweDA2RjQsIDB4MDZGNSwgMHgwNkY2LCAweDA2RjcsIDB4MDZGOCwKKyAgICAweDA2RjksIDB4MDZGQSwgMHgwNkZCLCAweDA2RkMsIDB4MDZGRCwgMHgwNkZFLAorICAgIDB4MDZGRiwgMHgwNzAwLCAweDA3MDEsIDB4MDcwMiwgMHgwNzAzLCAweDA3MDQsCisgICAgMHgwNzA1LCAweDA3MDYsIDB4MDcwNywgMHgwNzA4LCAweDA3MDksIDB4MDcwQSwKKyAgICAweDA3MEIsIDB4MDcwQywgMHgwN0Y0LCAweDA3RjUsIDB4MDdGNiwgMHgwN0Y3LAorICAgIDB4MDdGOCwgMHgwN0Y5LCAweDA3RkEsIDB4MDdGQiwgMHgwN0ZDLCAweDA3RkQsCisgICAgMHgwN0ZFLCAweDA3RkYsIDB4MDgwMCwgMHgwODAxLCAweDA4MDIsIDB4MDgwMywKKyAgICAweDA4MDQsIDB4MDgwNSwgMHgwODA2LCAweDA4MDcsIDB4MDgwOCwgMHgwODA5LAorICAgIDB4MDgwQSwgMHgwODBCLCAweDA4MEMsIDB4MDhGNCwgMHgwOEY1LCAweDA4RjYsCisgICAgMHgwOEY3LCAweDA4RjgsIDB4MDhGOSwgMHgwOEZBLCAweDA4RkIsIDB4MDhGQywKKyAgICAweDA4RkQsIDB4MDhGRSwgMHgwOEZGLCAweDA5MDAsIDB4MDkwMSwgMHgwOTAyLAorICAgIDB4MDkwMywgMHgwOTA0LCAweDA5MDUsIDB4MDkwNiwgMHgwOTA3LCAweDA5MDgsCisgICAgMHgwOTA5LCAweDA5MEEsIDB4MDkwQiwgMHgwOTBDLCAweDA5RjQsIDB4MDlGNSwKKyAgICAweDA5RjYsIDB4MDlGNywgMHgwOUY4LCAweDA5RjksIDB4MDlGQSwgMHgwOUZCLAorICAgIDB4MDlGQywgMHgwOUZELCAweDA5RkUsIDB4MDlGRiwgMHgwQTAwLCAweDBBMDEsCisgICAgMHgwQTAyLCAweDBBMDMsIDB4MEEwNCwgMHgwQTA1LCAweDBBMDYsIDB4MEEwNywKKyAgICAweDBBMDgsIDB4MEEwOSwgMHgwQTBBLCAweDBBMEIsIDB4MEEwQywgMHgwQUY0LAorICAgIDB4MEFGNSwgMHgwQUY2LCAweDBBRjcsIDB4MEFGOCwgMHgwQUY5LCAweDBBRkEsCisgICAgMHgwQUZCLCAweDBBRkMsIDB4MEFGRCwgMHgwQUZFLCAweDBBRkYsIDB4MEIwMCwKKyAgICAweDBCMDEsIDB4MEIwMiwgMHgwQjAzLCAweDBCMDQsIDB4MEIwNSwgMHgwQjA2LAorICAgIDB4MEIwNywgMHgwQjA4LCAweDBCMDksIDB4MEIwQSwgMHgwQjBCLCAweDBCMEMsCisgICAgMHgwQkY0LCAweDBCRjUsIDB4MEJGNiwgMHgwQkY3LCAweDBCRjgsIDB4MEJGOSwKKyAgICAweDBCRkEsIDB4MEJGQiwgMHgwQkZDLCAweDBCRkQsIDB4MEJGRSwgMHgwQkZGLAorICAgIDB4MEMwMCwgMHgwQzAxLCAweDBDMDIsIDB4MEMwMywgMHgwQzA0LCAweDBDMDUsCisgICAgMHgwQzA2LCAweDBDMDcsIDB4MEMwOCwgMHgwQzA5LCAweDBDMEEsIDB4MEMwQiwKKyAgICAweDBDMEMsIDB4MENGNCwgMHgwQ0Y1LCAweDBDRjYsIDB4MENGNywgMHgwQ0Y4LAorICAgIDB4MENGOSwgMHgwQ0ZBLCAweDBDRkIsIDB4MENGQywgMHgwQ0ZELCAweDBDRkUsCisgICAgMHgwQ0ZGLCAweEY0MDAsIDB4RjQwMSwgMHhGNDAyLCAweEY0MDMsIDB4RjQwNCwKKyAgICAweEY0MDUsIDB4RjQwNiwgMHhGNDA3LCAweEY0MDgsIDB4RjQwOSwgMHhGNDBBLAorICAgIDB4RjQwQiwgMHhGNDBDLCAweEY0RjQsIDB4RjRGNSwgMHhGNEY2LCAweEY0RjcsCisgICAgMHhGNEY4LCAweEY0RjksIDB4RjRGQSwgMHhGNEZCLCAweEY0RkMsIDB4RjRGRCwKKyAgICAweEY0RkUsIDB4RjRGRiwgMHhGNTAwLCAweEY1MDEsIDB4RjUwMiwgMHhGNTAzLAorICAgIDB4RjUwNCwgMHhGNTA1LCAweEY1MDYsIDB4RjUwNywgMHhGNTA4LCAweEY1MDksCisgICAgMHhGNTBBLCAweEY1MEIsIDB4RjUwQywgMHhGNUY0LCAweEY1RjUsIDB4RjVGNiwKKyAgICAweEY1RjcsIDB4RjVGOCwgMHhGNUY5LCAweEY1RkEsIDB4RjVGQiwgMHhGNUZDLAorICAgIDB4RjVGRCwgMHhGNUZFLCAweEY1RkYsIDB4RjYwMCwgMHhGNjAxLCAweEY2MDIsCisgICAgMHhGNjAzLCAweEY2MDQsIDB4RjYwNSwgMHhGNjA2LCAweEY2MDcsIDB4RjYwOCwKKyAgICAweEY2MDksIDB4RjYwQSwgMHhGNjBCLCAweEY2MEMsIDB4RjZGNCwgMHhGNkY1LAorICAgIDB4RjZGNiwgMHhGNkY3LCAweEY2RjgsIDB4RjZGOSwgMHhGNkZBLCAweEY2RkIsCisgICAgMHhGNkZDLCAweEY2RkQsIDB4RjZGRSwgMHhGNkZGLCAweEY3MDAsIDB4RjcwMSwKKyAgICAweEY3MDIsIDB4RjcwMywgMHhGNzA0LCAweEY3MDUsIDB4RjcwNiwgMHhGNzA3LAorICAgIDB4RjcwOCwgMHhGNzA5LCAweEY3MEEsIDB4RjcwQiwgMHhGNzBDLCAweEY3RjQsCisgICAgMHhGN0Y1LCAweEY3RjYsIDB4RjdGNywgMHhGN0Y4LCAweEY3RjksIDB4RjdGQSwKKyAgICAweEY3RkIsIDB4RjdGQywgMHhGN0ZELCAweEY3RkUsIDB4RjdGRiwgMHhGODAwLAorICAgIDB4RjgwMSwgMHhGODAyLCAweEY4MDMsIDB4RjgwNCwgMHhGODA1LCAweEY4MDYsCisgICAgMHhGODA3LCAweEY4MDgsIDB4RjgwOSwgMHhGODBBLCAweEY4MEIsIDB4RjgwQywKKyAgICAweEY4RjQsIDB4RjhGNSwgMHhGOEY2LCAweEY4RjcsIDB4RjhGOCwgMHhGOEY5LAorICAgIDB4RjhGQSwgMHhGOEZCLCAweEY4RkMsIDB4RjhGRCwgMHhGOEZFLCAweEY4RkYsCisgICAgMHhGOTAwLCAweEY5MDEsIDB4RjkwMiwgMHhGOTAzLCAweEY5MDQsIDB4RjkwNSwKKyAgICAweEY5MDYsIDB4RjkwNywgMHhGOTA4LCAweEY5MDksIDB4RjkwQSwgMHhGOTBCLAorICAgIDB4RjkwQywgMHhGOUY0LCAweEY5RjUsIDB4RjlGNiwgMHhGOUY3LCAweEY5RjgsCisgICAgMHhGOUY5LCAweEY5RkEsIDB4RjlGQiwgMHhGOUZDLCAweEY5RkQsIDB4RjlGRSwKKyAgICAweEY5RkYsIDB4RkEwMCwgMHhGQTAxLCAweEZBMDIsIDB4RkEwMywgMHhGQTA0LAorICAgIDB4RkEwNSwgMHhGQTA2LCAweEZBMDcsIDB4RkEwOCwgMHhGQTA5LCAweEZBMEEsCisgICAgMHhGQTBCLCAweEZBMEMsIDB4RkFGNCwgMHhGQUY1LCAweEZBRjYsIDB4RkFGNywKKyAgICAweEZBRjgsIDB4RkFGOSwgMHhGQUZBLCAweEZBRkIsIDB4RkFGQywgMHhGQUZELAorICAgIDB4RkFGRSwgMHhGQUZGLCAweEZCMDAsIDB4RkIwMSwgMHhGQjAyLCAweEZCMDMsCisgICAgMHhGQjA0LCAweEZCMDUsIDB4RkIwNiwgMHhGQjA3LCAweEZCMDgsIDB4RkIwOSwKKyAgICAweEZCMEEsIDB4RkIwQiwgMHhGQjBDLCAweEZCRjQsIDB4RkJGNSwgMHhGQkY2LAorICAgIDB4RkJGNywgMHhGQkY4LCAweEZCRjksIDB4RkJGQSwgMHhGQkZCLCAweEZCRkMsCisgICAgMHhGQkZELCAweEZCRkUsIDB4RkJGRiwgMHhGQzAwLCAweEZDMDEsIDB4RkMwMiwKKyAgICAweEZDMDMsIDB4RkMwNCwgMHhGQzA1LCAweEZDMDYsIDB4RkMwNywgMHhGQzA4LAorICAgIDB4RkMwOSwgMHhGQzBBLCAweEZDMEIsIDB4RkMwQywgMHhGQ0Y0LCAweEZDRjUsCisgICAgMHhGQ0Y2LCAweEZDRjcsIDB4RkNGOCwgMHhGQ0Y5LCAweEZDRkEsIDB4RkNGQiwKKyAgICAweEZDRkMsIDB4RkNGRCwgMHhGQ0ZFLCAweEZDRkYsIDB4RkQwMCwgMHhGRDAxLAorICAgIDB4RkQwMiwgMHhGRDAzLCAweEZEMDQsIDB4RkQwNSwgMHhGRDA2LCAweEZEMDcsCisgICAgMHhGRDA4LCAweEZEMDksIDB4RkQwQSwgMHhGRDBCLCAweEZEMEMsIDB4RkRGNCwKKyAgICAweEZERjUsIDB4RkRGNiwgMHhGREY3LCAweEZERjgsIDB4RkRGOSwgMHhGREZBLAorICAgIDB4RkRGQiwgMHhGREZDLCAweEZERkQsIDB4RkRGRSwgMHhGREZGLCAweEZFMDAsCisgICAgMHhGRTAxLCAweEZFMDIsIDB4RkUwMywgMHhGRTA0LCAweEZFMDUsIDB4RkUwNiwKKyAgICAweEZFMDcsIDB4RkUwOCwgMHhGRTA5LCAweEZFMEEsIDB4RkUwQiwgMHhGRTBDLAorICAgIDB4RkVGNCwgMHhGRUY1LCAweEZFRjYsIDB4RkVGNywgMHhGRUY4LCAweEZFRjksCisgICAgMHhGRUZBLCAweEZFRkIsIDB4RkVGQywgMHhGRUZELCAweEZFRkUsIDB4RkVGRiwKKyAgICAweEZGMDAsIDB4RkYwMSwgMHhGRjAyLCAweEZGMDMsIDB4RkYwNCwgMHhGRjA1LAorICAgIDB4RkYwNiwgMHhGRjA3LCAweEZGMDgsIDB4RkYwOSwgMHhGRjBBLCAweEZGMEIsCisgICAgMHhGRjBDLCAweEZGRjQsIDB4RkZGNSwgMHhGRkY2LCAweEZGRjcsIDB4RkZGOCwKKyAgICAweEZGRjksIDB4RkZGQSwgMHhGRkZCLCAweEZGRkMsIDB4RkZGRCwgMHhGRkZFLAorICAgIDB4RkZGRiwKK307CisKKyNkZWZpbmUgT04yQVZDX0NCMTRfQ09ERVMgNzI5CitzdGF0aWMgY29uc3QgdWludDE2X3Qgb24yYXZjX2NiMTRfY29kZXNbT04yQVZDX0NCMTRfQ09ERVNdID0geworICAgIDB4MDAwMCwgMHgwMDE4LCAweDAwOUMsIDB4MDMzRiwgMHgwNkNGLCAweDA4NjAsCisgICAgMHgzRUQyLCAweDE1RjgsIDB4MENBMywgMHgxNUY5LCAweDNFRDMsIDB4M0VENCwKKyAgICAweDNFRDUsIDB4MDNCMywgMHgwMzM2LCAweDNFQ0YsIDB4M0VEMCwgMHgxNUY1LAorICAgIDB4MTVGNiwgMHgzRUQxLCAweDFGQjYsIDB4MTVGNywgMHgwRDZELCAweDA3NEUsCisgICAgMHgwMkE0LCAweDAwOEMsIDB4MDAxNywgMHgwMDE2LCAweDAwMjQsIDB4MDBBOCwKKyAgICAweDAyQUIsIDB4MDQzQywgMHgwMzhELCAweDE1RkEsIDB4MENBNCwgMHgxRkI4LAorICAgIDB4MTVGQiwgMHgzRUQ5LCAweDFGQjksIDB4MTVGQywgMHgwMUQ4LCAweDAxRjEsCisgICAgMHgzRUQ2LCAweDEwOTAsIDB4MUZCNywgMHgwRDZFLCAweDNFRDcsIDB4M0VEOCwKKyAgICAweDA3NEYsIDB4MEQ2RiwgMHgwNzUwLCAweDAxRjIsIDB4MDA5OCwgMHgwMDIwLAorICAgIDB4MDA3MCwgMHgwMDlELCAweDAwRTQsIDB4MDI2RiwgMHgwM0FFLCAweDA1NUQsCisgICAgMHgwNkQwLCAweDA4NjIsIDB4MDY2NywgMHgwOUVELCAweDE5MDAsIDB4M0VEQSwKKyAgICAweDE5MDEsIDB4MDFERSwgMHgwMjZCLCAweDE1RkQsIDB4MTVGRSwgMHgxMDkxLAorICAgIDB4MTVGRiwgMHgwRDcwLCAweDA2NjYsIDB4MDY4OSwgMHgwODYxLCAweDAzNEUsCisgICAgMHgwMjZFLCAweDAwRTgsIDB4MDA4RSwgMHgwMTlFLCAweDAxQkYsIDB4MDFGMywKKyAgICAweDAyQjUsIDB4MDU0RSwgMHgwNjY5LCAweDA5RUUsIDB4MDlFRiwgMHgwRDcxLAorICAgIDB4MENBNSwgMHgxRkJCLCAweDFGQkMsIDB4M0VERiwgMHgwMkE2LCAweDAxQ0EsCisgICAgMHgzRURCLCAweDNFREMsIDB4M0VERCwgMHgzRURFLCAweDFGQkEsIDB4MTA5MiwKKyAgICAweDA4NjMsIDB4MDc1MSwgMHgwNjY4LCAweDAzOEUsIDB4MDJCNCwgMHgwMUM0LAorICAgIDB4MDY4QSwgMHgwQ0E3LCAweDA2RDEsIDB4MDU1RiwgMHgwNDNFLCAweDA5RjAsCisgICAgMHgwODY1LCAweDA4NjYsIDB4MDg2NywgMHgwNzUyLCAweDE5MDIsIDB4M0VFMiwKKyAgICAweDEwOTYsIDB4MDI3OCwgMHgwMkI2LCAweDNFRTAsIDB4MUZCRCwgMHgzRUUxLAorICAgIDB4MDg2NCwgMHgxRkJFLCAweDBDQTYsIDB4MTA5MywgMHgxMDk0LCAweDEwOTUsCisgICAgMHgwNDc4LCAweDA0M0QsIDB4MDU1RSwgMHgzRUU1LCAweDBDQTksIDB4MDY2QSwKKyAgICAweDBENzUsIDB4MDU2MCwgMHgwNTYxLCAweDA4NjgsIDB4MEQ3NiwgMHgwQ0FBLAorICAgIDB4MENBQiwgMHgzRUU2LCAweDNFRTcsIDB4M0VFOCwgMHgwMkFDLCAweDAzOEYsCisgICAgMHgzRUUzLCAweDFGQkYsIDB4M0VFNCwgMHgwRDcyLCAweDBENzMsIDB4MEQ3NCwKKyAgICAweDA5RjEsIDB4MDY4QiwgMHgwQ0E4LCAweDA0NzksIDB4MDZEMiwgMHgxMDk3LAorICAgIDB4MTA5OSwgMHgwOUYzLCAweDA2NkIsIDB4MDZEMywgMHgwQ0FELCAweDEwOUEsCisgICAgMHgwNkQ0LCAweDA2OEMsIDB4MDZENSwgMHgwRDc5LCAweDBEN0EsIDB4MTA5QiwKKyAgICAweDFGQzEsIDB4MDJCMiwgMHgwMzk2LCAweDNFRTksIDB4MTkwMywgMHgzRUVBLAorICAgIDB4MTkwNCwgMHgxOTA1LCAweDFGQzAsIDB4MDlGMiwgMHgwRDc3LCAweDBENzgsCisgICAgMHgxMDk4LCAweDA1NjIsIDB4MENBQywgMHgxOTBDLCAweDEwOUMsIDB4MDZENiwKKyAgICAweDBEN0MsIDB4MUZDNCwgMHgwRDdELCAweDA5RjQsIDB4MDZENywgMHgwOUY1LAorICAgIDB4M0VFRSwgMHgwQ0FFLCAweDBEN0UsIDB4M0VFRiwgMHgwM0FGLCAweDA0M0YsCisgICAgMHgzRUVCLCAweDE5MDYsIDB4MUZDMiwgMHgxOTA3LCAweDNFRUMsIDB4MTkwOCwKKyAgICAweDE5MDksIDB4MTkwQSwgMHgxRkMzLCAweDNFRUQsIDB4MEQ3QiwgMHgxOTBCLAorICAgIDB4MUZDNiwgMHgxMEExLCAweDEwQTIsIDB4MEQ3RiwgMHgwQ0IwLCAweDE5MEUsCisgICAgMHgwRDgwLCAweDEwQTMsIDB4MDg2OSwgMHgxOTBGLCAweDE5MTAsIDB4MTBBNCwKKyAgICAweDEwQTUsIDB4MDc1MywgMHgwNjhELCAweDNFRjAsIDB4M0VGMSwgMHgxOTBELAorICAgIDB4MUZDNSwgMHgzRUYyLCAweDNFRjMsIDB4MTA5RCwgMHgxMDlFLCAweDBDQUYsCisgICAgMHgxMDlGLCAweDNFRjQsIDB4MTBBMCwgMHgxMEE3LCAweDNFRkMsIDB4MENCMSwKKyAgICAweDA5RjcsIDB4MTkxMSwgMHgxMEE4LCAweDA5RjgsIDB4MTBBOSwgMHgxOTEyLAorICAgIDB4MDZEOSwgMHgwOUY5LCAweDNFRkQsIDB4MTkxMywgMHgwNjhFLCAweDA2RDgsCisgICAgMHgzRUY1LCAweDNFRjYsIDB4M0VGNywgMHgzRUY4LCAweDNFRjksIDB4MEQ4MSwKKyAgICAweDNFRkEsIDB4MUZDNywgMHgxRkM4LCAweDEwQTYsIDB4MDlGNiwgMHgzRUZCLAorICAgIDB4MUZDRSwgMHgwQ0IyLCAweDNGMDIsIDB4MTBBQSwgMHgzRjAzLCAweDFGQ0YsCisgICAgMHgxMEFCLCAweDEwQUMsIDB4MTkxNiwgMHgzRjA0LCAweDA5RkEsIDB4MEQ4MywKKyAgICAweDNGMDUsIDB4MDY4RiwgMHgwODZBLCAweDE5MTQsIDB4M0VGRSwgMHgxRkM5LAorICAgIDB4MUZDQSwgMHgzRUZGLCAweDBEODIsIDB4MUZDQiwgMHgxRkNDLCAweDNGMDAsCisgICAgMHgxRkNELCAweDNGMDEsIDB4MTkxNSwgMHgzRjBGLCAweDE5MTgsIDB4MTBBRCwKKyAgICAweDBDQjMsIDB4M0YxMCwgMHgxOTE5LCAweDNGMTEsIDB4MTkxQSwgMHgxRkQyLAorICAgIDB4MENCNCwgMHgwQ0I1LCAweDEwQUUsIDB4MTkxQiwgMHgwNDdBLCAweDA2REEsCisgICAgMHgzRjA2LCAweDNGMDcsIDB4MTkxNywgMHgzRjA4LCAweDNGMDksIDB4M0YwQSwKKyAgICAweDNGMEIsIDB4M0YwQywgMHgzRjBELCAweDNGMEUsIDB4MUZEMCwgMHgxRkQxLAorICAgIDB4M0YxOCwgMHgxOTFGLCAweDFGREEsIDB4M0YxOSwgMHgzRjFBLCAweDEwQUYsCisgICAgMHgzRjFCLCAweDEwQjIsIDB4MUZEQiwgMHgwRDg2LCAweDBEODcsIDB4MTBCMywKKyAgICAweDBDQjYsIDB4MDg2QiwgMHgwOUZCLCAweDNGMTIsIDB4MUZEMywgMHgxRkQ0LAorICAgIDB4M0YxMywgMHgxRkQ1LCAweDE5MUUsIDB4MUZENiwgMHgzRjE0LCAweDNGMTUsCisgICAgMHgzRjE2LCAweDFGRDcsIDB4M0YxNywgMHgwMzNBLCAweDAxQUEsIDB4MDJCOCwKKyAgICAweDAxREYsIDB4MDJCOSwgMHgwMkJBLCAweDA4NkYsIDB4MDNCQiwgMHgwM0IyLAorICAgIDB4MDQ2QSwgMHgwNjZGLCAweDA4REUsIDB4MDU2MywgMHgwNDZCLCAweDBDQjcsCisgICAgMHgxMUJFLCAweDA4NkUsIDB4MDY2RSwgMHgwNkRCLCAweDA0N0IsIDB4MDNCQSwKKyAgICAweDBBOUUsIDB4MDJCNywgMHgwMzQwLCAweDAyNjQsIDB4MDFDRSwgMHgwMUE5LAorICAgIDB4MDI2NSwgMHgwMUE4LCAweDAyNjYsIDB4MDJBOCwgMHgwMzZGLCAweDAzQUIsCisgICAgMHgwMzdBLCAweDA0RkUsIDB4MDY4MywgMHgwNkM0LCAweDBDOTAsIDB4MDY1RCwKKyAgICAweDBEM0MsIDB4MEZFQywgMHgwNDM2LCAweDA2QzIsIDB4MDY4MiwgMHgwQzhFLAorICAgIDB4MDU1QSwgMHgwMzNCLCAweDA2NUMsIDB4MDM0OCwgMHgwM0FBLCAweDAyMzQsCisgICAgMHgwMzZFLCAweDAxRjAsIDB4MDFBNiwgMHgzRTg2LCAweDNFODcsIDB4MTUzRSwKKyAgICAweDNFODgsIDB4M0U4OSwgMHgwRkVGLCAweDNFOEEsIDB4M0U4QiwgMHgzRThDLAorICAgIDB4M0U4RCwgMHgzRThFLCAweDNFOEYsIDB4M0U5MCwgMHgwOUU0LCAweDAzQUMsCisgICAgMHgxMUJGLCAweDFGOEUsIDB4MUY4RiwgMHgwRkVFLCAweDNFODAsIDB4M0U4MSwKKyAgICAweDNFODIsIDB4M0U4MywgMHgzRTg0LCAweDNFODUsIDB4MUY5MCwgMHgxRjkxLAorICAgIDB4M0U5NSwgMHgzRTk2LCAweDBDOTEsIDB4M0U5NywgMHgzRTk4LCAweDNFOTksCisgICAgMHgzRTlBLCAweDNFOUIsIDB4M0U5QywgMHgzRTlELCAweDNFOUUsIDB4M0U5RiwKKyAgICAweDNFQTAsIDB4MDg1OCwgMHgwNEZGLCAweDBGRjAsIDB4MEZGMSwgMHgxNTNGLAorICAgIDB4MEZGMiwgMHgzRTkxLCAweDFGOTIsIDB4M0U5MiwgMHgxRjkzLCAweDNFOTMsCisgICAgMHgxRjk0LCAweDNFOTQsIDB4MEQzRCwgMHgzRUEzLCAweDFGOTksIDB4MEZGNywKKyAgICAweDBEM0UsIDB4M0VBNCwgMHgxRjlBLCAweDE1RDksIDB4MEQzRiwgMHgzRUE1LAorICAgIDB4M0VBNiwgMHgzRUE3LCAweDBENTgsIDB4M0VBOCwgMHgwNkM1LCAweDA3MkUsCisgICAgMHgzRUExLCAweDFGOTUsIDB4MUY5NiwgMHgwQzkyLCAweDBGRjMsIDB4MEZGNCwKKyAgICAweDBGRjUsIDB4MTVEOCwgMHgxRjk3LCAweDBGRjYsIDB4MUY5OCwgMHgzRUEyLAorICAgIDB4M0VBQywgMHgwRkY5LCAweDFGOUMsIDB4MTVEQiwgMHgxRjlELCAweDE1REMsCisgICAgMHgwRkZBLCAweDFGOUUsIDB4M0VBRCwgMHgzRUFFLCAweDNFQUYsIDB4M0VCMCwKKyAgICAweDNFQjEsIDB4MDY1RSwgMHgwNTVCLCAweDNFQTksIDB4MEQ1OSwgMHgxNURBLAorICAgIDB4MEZGOCwgMHgzRUFBLCAweDBENUEsIDB4M0VBQiwgMHgwRDVCLCAweDBENUMsCisgICAgMHgwRDVELCAweDA3MkYsIDB4MUY5QiwgMHgzRUI0LCAweDFGQTAsIDB4MDczQywKKyAgICAweDBENUYsIDB4MUZBMSwgMHgxRkEyLCAweDBGRkUsIDB4MUZBMywgMHgxRkE0LAorICAgIDB4M0VCNSwgMHgzRUI2LCAweDNFQjcsIDB4M0VCOCwgMHgwNjVGLCAweDA2QzYsCisgICAgMHgzRUIyLCAweDE1REQsIDB4MEZGQiwgMHgzRUIzLCAweDFGOUYsIDB4MEQ1RSwKKyAgICAweDBDOTMsIDB4MEM5NCwgMHgwRkZDLCAweDBGRkQsIDB4MTVERSwgMHgxNURGLAorICAgIDB4MUZBNywgMHgxNUUxLCAweDA2QzcsIDB4MEQ2MiwgMHgxNUUyLCAweDBDOTYsCisgICAgMHgxNUUzLCAweDEwODIsIDB4MTVFNCwgMHgxRkE4LCAweDNFQkEsIDB4M0VCQiwKKyAgICAweDNFQkMsIDB4MDY2MCwgMHgwNDZFLCAweDNFQjksIDB4MUZBNSwgMHgwRkZGLAorICAgIDB4MUZBNiwgMHgxMDgwLCAweDEwODEsIDB4MEQ2MCwgMHgwQzk1LCAweDE1RTAsCisgICAgMHgwRDYxLCAweDA3M0QsIDB4MDg1QSwgMHgxNUU2LCAweDA5RTksIDB4MDg1QiwKKyAgICAweDBDOTcsIDB4MTA4MywgMHgwQzk4LCAweDBENjMsIDB4MEQ2NCwgMHgwQzk5LAorICAgIDB4MTVFNywgMHgxNUU4LCAweDFGQUMsIDB4M0VCRSwgMHgwNjg0LCAweDAzN0IsCisgICAgMHgxRkE5LCAweDFGQUEsIDB4M0VCRCwgMHgwNzNFLCAweDFGQUIsIDB4MTVFNSwKKyAgICAweDA2QzgsIDB4MDlFNSwgMHgwOUU2LCAweDA5RTcsIDB4MDY2MSwgMHgwOUU4LAorICAgIDB4MUZBRSwgMHgwQzlBLCAweDA2Q0EsIDB4MDU1QywgMHgwQzlCLCAweDNFQzAsCisgICAgMHgxNUVCLCAweDEwODUsIDB4MTA4NiwgMHgxNUVDLCAweDEwODcsIDB4M0VDMSwKKyAgICAweDNFQzIsIDB4MDJBOSwgMHgwMkIzLCAweDFGQUQsIDB4MTVFOSwgMHgzRUJGLAorICAgIDB4MTVFQSwgMHgxMDg0LCAweDBENjUsIDB4MDY2MiwgMHgwRDY2LCAweDA2QzksCisgICAgMHgwNDM4LCAweDA1NEEsIDB4MDczRiwgMHgwODVELCAweDA2NjMsIDB4MDQzOSwKKyAgICAweDA2ODYsIDB4MDZDQiwgMHgwQzlFLCAweDBDOUYsIDB4MTA4OCwgMHgxNUVGLAorICAgIDB4M0VDNiwgMHgxMDg5LCAweDFGQUYsIDB4M0VDNywgMHgwMzQ5LCAweDAyNjcsCisgICAgMHgzRUMzLCAweDNFQzQsIDB4MTVFRCwgMHgxNUVFLCAweDNFQzUsIDB4MDlFQSwKKyAgICAweDBDOUMsIDB4MEM5RCwgMHgwNTRCLCAweDA2ODUsIDB4MDg1QywgMHgwOUVCLAorICAgIDB4MDFCQywgMHgwMURDLCAweDAxQkUsIDB4MDNBRCwgMHgwMzhBLCAweDA3NDksCisgICAgMHgwNjg4LCAweDA2NjUsIDB4MDc0QSwgMHgwQ0ExLCAweDBENjgsIDB4M0VDOCwKKyAgICAweDFGQjEsIDB4MDIzNiwgMHgwMzRBLCAweDFGQjAsIDB4MTA4QSwgMHgxMDhCLAorICAgIDB4MENBMCwgMHgwRDY3LCAweDA2ODcsIDB4MDc0OCwgMHgwNjY0LCAweDAzOEIsCisgICAgMHgwMjNFLCAweDAxREEsIDB4MDFEQiwgMHgwMDZFLCAweDAwOTQsIDB4MDBFNiwKKyAgICAweDAzM0UsIDB4MDQzQSwgMHgwNkNELCAweDA4NUUsIDB4MDg1RiwgMHgwRDY5LAorICAgIDB4MEQ2QSwgMHgxRkIzLCAweDFGQjQsIDB4M0VDQSwgMHgwMzRCLCAweDAyM0YsCisgICAgMHgzRUM5LCAweDEwOEMsIDB4MUZCMiwgMHgxNUYwLCAweDE1RjEsIDB4MDc0QiwKKyAgICAweDA2Q0MsIDB4MDc0QywgMHgwMzhDLCAweDAyNjgsIDB4MDEzNiwgMHgwMDk1LAorICAgIDB4MDAxNCwgMHgwMDFFLCAweDAwOTcsIDB4MDE5QywgMHgwNzRELCAweDBENkMsCisgICAgMHgwNkNFLCAweDBDQTIsIDB4MTA4RSwgMHgwOUVDLCAweDNFQ0QsIDB4MTA4RiwKKyAgICAweDNFQ0UsIDB4MDI2QSwgMHgwMkFBLCAweDNFQ0IsIDB4MUZCNSwgMHgxNUYyLAorICAgIDB4M0VDQywgMHgxNUYzLCAweDE1RjQsIDB4MEQ2QiwgMHgxMDhELCAweDA0M0IsCisgICAgMHgwMjY5LCAweDAwOTYsIDB4MDAyMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9uMmF2Y19jYjE0X2JpdHNbT04yQVZDX0NCMTRfQ09ERVNdID0geworICAgICAxLCAgNSwgIDgsIDEwLCAxMSwgMTIsCisgICAgMTQsIDEzLCAxMiwgMTMsIDE0LCAxNCwKKyAgICAxNCwgMTAsIDEwLCAxNCwgMTQsIDEzLAorICAgIDEzLCAxNCwgMTMsIDEzLCAxMiwgMTEsCisgICAgMTAsICA4LCAgNSwgIDUsICA2LCAgOCwKKyAgICAxMCwgMTEsIDEwLCAxMywgMTIsIDEzLAorICAgIDEzLCAxNCwgMTMsIDEzLCAgOSwgIDksCisgICAgMTQsIDEzLCAxMywgMTIsIDE0LCAxNCwKKyAgICAxMSwgMTIsIDExLCAgOSwgIDgsICA2LAorICAgICA3LCAgOCwgIDgsIDEwLCAxMCwgMTEsCisgICAgMTEsIDEyLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAxMywgIDksIDEwLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMiwgMTEsIDExLCAxMiwgMTAsCisgICAgMTAsICA4LCAgOCwgIDksICA5LCAgOSwKKyAgICAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMywgMTMsIDE0LCAxMCwgIDksCisgICAgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywKKyAgICAxMiwgMTEsIDExLCAxMCwgMTAsICA5LAorICAgIDExLCAxMiwgMTEsIDExLCAxMSwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTEsIDEzLCAxNCwKKyAgICAxMywgMTAsIDEwLCAxNCwgMTMsIDE0LAorICAgIDEyLCAxMywgMTIsIDEzLCAxMywgMTMsCisgICAgMTEsIDExLCAxMSwgMTQsIDEyLCAxMSwKKyAgICAxMiwgMTEsIDExLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxNCwgMTQsIDE0LCAxMCwgMTAsCisgICAgMTQsIDEzLCAxNCwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTEsIDEyLCAxMSwgMTEsIDEzLAorICAgIDEzLCAxMiwgMTEsIDExLCAxMiwgMTMsCisgICAgMTEsIDExLCAxMSwgMTIsIDEyLCAxMywKKyAgICAxMywgMTAsIDEwLCAxNCwgMTMsIDE0LAorICAgIDEzLCAxMywgMTMsIDEyLCAxMiwgMTIsCisgICAgMTMsIDExLCAxMiwgMTMsIDEzLCAxMSwKKyAgICAxMiwgMTMsIDEyLCAxMiwgMTEsIDEyLAorICAgIDE0LCAxMiwgMTIsIDE0LCAxMCwgMTEsCisgICAgMTQsIDEzLCAxMywgMTMsIDE0LCAxMywKKyAgICAxMywgMTMsIDEzLCAxNCwgMTIsIDEzLAorICAgIDEzLCAxMywgMTMsIDEyLCAxMiwgMTMsCisgICAgMTIsIDEzLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxMywgMTEsIDExLCAxNCwgMTQsIDEzLAorICAgIDEzLCAxNCwgMTQsIDEzLCAxMywgMTIsCisgICAgMTMsIDE0LCAxMywgMTMsIDE0LCAxMiwKKyAgICAxMiwgMTMsIDEzLCAxMiwgMTMsIDEzLAorICAgIDExLCAxMiwgMTQsIDEzLCAxMSwgMTEsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMiwKKyAgICAxNCwgMTMsIDEzLCAxMywgMTIsIDE0LAorICAgIDEzLCAxMiwgMTQsIDEzLCAxNCwgMTMsCisgICAgMTMsIDEzLCAxMywgMTQsIDEyLCAxMiwKKyAgICAxNCwgMTEsIDEyLCAxMywgMTQsIDEzLAorICAgIDEzLCAxNCwgMTIsIDEzLCAxMywgMTQsCisgICAgMTMsIDE0LCAxMywgMTQsIDEzLCAxMywKKyAgICAxMiwgMTQsIDEzLCAxNCwgMTMsIDEzLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMSwgMTEsCisgICAgMTQsIDE0LCAxMywgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLAorICAgIDE0LCAxMywgMTMsIDE0LCAxNCwgMTMsCisgICAgMTQsIDEzLCAxMywgMTIsIDEyLCAxMywKKyAgICAxMiwgMTIsIDEyLCAxNCwgMTMsIDEzLAorICAgIDE0LCAxMywgMTMsIDEzLCAxNCwgMTQsCisgICAgMTQsIDEzLCAxNCwgMTAsICA5LCAxMCwKKyAgICAgOSwgMTAsIDEwLCAxMiwgMTAsIDEwLAorICAgIDExLCAxMSwgMTIsIDExLCAxMSwgMTIsCisgICAgMTMsIDEyLCAxMSwgMTEsIDExLCAxMCwKKyAgICAxMiwgMTAsIDEwLCAxMCwgIDksICA5LAorICAgIDEwLCAgOSwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDExLCAxMSwgMTEsIDEyLCAxMSwKKyAgICAxMiwgMTIsIDExLCAxMSwgMTEsIDEyLAorICAgIDExLCAxMCwgMTEsIDEwLCAxMCwgMTAsCisgICAgMTAsICA5LCAgOSwgMTQsIDE0LCAxMywKKyAgICAxNCwgMTQsIDEyLCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxMiwgMTAsCisgICAgMTMsIDEzLCAxMywgMTIsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLAorICAgIDE0LCAxNCwgMTIsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTIsIDExLCAxMiwgMTIsIDEzLAorICAgIDEyLCAxNCwgMTMsIDE0LCAxMywgMTQsCisgICAgMTMsIDE0LCAxMiwgMTQsIDEzLCAxMiwKKyAgICAxMiwgMTQsIDEzLCAxMywgMTIsIDE0LAorICAgIDE0LCAxNCwgMTIsIDE0LCAxMSwgMTEsCisgICAgMTQsIDEzLCAxMywgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTMsIDEzLCAxMiwgMTMsIDE0LAorICAgIDE0LCAxMiwgMTMsIDEzLCAxMywgMTMsCisgICAgMTIsIDEzLCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTEsIDExLCAxNCwgMTIsIDEzLAorICAgIDEyLCAxNCwgMTIsIDE0LCAxMiwgMTIsCisgICAgMTIsIDExLCAxMywgMTQsIDEzLCAxMSwKKyAgICAxMiwgMTMsIDEzLCAxMiwgMTMsIDEzLAorICAgIDE0LCAxNCwgMTQsIDE0LCAxMSwgMTEsCisgICAgMTQsIDEzLCAxMiwgMTQsIDEzLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLAorICAgIDEzLCAxMywgMTEsIDEyLCAxMywgMTIsCisgICAgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwKKyAgICAxNCwgMTEsIDExLCAxNCwgMTMsIDEyLAorICAgIDEzLCAxMywgMTMsIDEyLCAxMiwgMTMsCisgICAgMTIsIDExLCAxMiwgMTMsIDEyLCAxMiwKKyAgICAxMiwgMTMsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxMywgMTMsIDE0LCAxMSwgMTAsCisgICAgMTMsIDEzLCAxNCwgMTEsIDEzLCAxMywKKyAgICAxMSwgMTIsIDEyLCAxMiwgMTEsIDEyLAorICAgIDEzLCAxMiwgMTEsIDExLCAxMiwgMTQsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwKKyAgICAxNCwgMTAsIDEwLCAxMywgMTMsIDE0LAorICAgIDEzLCAxMywgMTIsIDExLCAxMiwgMTEsCisgICAgMTEsIDExLCAxMSwgMTIsIDExLCAxMSwKKyAgICAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLAorICAgIDE0LCAxMywgMTMsIDE0LCAxMCwgMTAsCisgICAgMTQsIDE0LCAxMywgMTMsIDE0LCAxMiwKKyAgICAxMiwgMTIsIDExLCAxMSwgMTIsIDEyLAorICAgICA5LCAgOSwgIDksIDEwLCAxMCwgMTEsCisgICAgMTEsIDExLCAxMSwgMTIsIDEyLCAxNCwKKyAgICAxMywgMTAsIDEwLCAxMywgMTMsIDEzLAorICAgIDEyLCAxMiwgMTEsIDExLCAxMSwgMTAsCisgICAgMTAsICA5LCAgOSwgIDcsICA4LCAgOCwKKyAgICAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMywgMTMsIDE0LCAxMCwgMTAsCisgICAgMTQsIDEzLCAxMywgMTMsIDEzLCAxMSwKKyAgICAxMSwgMTEsIDEwLCAxMCwgIDksICA4LAorICAgICA1LCAgNSwgIDgsICA5LCAxMSwgMTIsCisgICAgMTEsIDEyLCAxMywgMTIsIDE0LCAxMywKKyAgICAxNCwgMTAsIDEwLCAxNCwgMTMsIDEzLAorICAgIDE0LCAxMywgMTMsIDEyLCAxMywgMTEsCisgICAgMTAsICA4LCAgNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBvbjJhdmNfY2IxNF9zeW1zW09OMkFWQ19DQjE0X0NPREVTXSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LAorICAgIDB4MDAwNiwgMHgwMDA3LCAweDAwMDgsIDB4MDAwOSwgMHgwMDBBLCAweDAwMEIsCisgICAgMHgwMDBDLCAweDAwMEQsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsIDB4MDBGNiwKKyAgICAweDAwRjcsIDB4MDBGOCwgMHgwMEY5LCAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLAorICAgIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsIDB4MDEwMCwgMHgwMTAxLCAweDAxMDIsCisgICAgMHgwMTAzLCAweDAxMDQsIDB4MDEwNSwgMHgwMTA2LCAweDAxMDcsIDB4MDEwOCwKKyAgICAweDAxMDksIDB4MDEwQSwgMHgwMTBCLCAweDAxMEMsIDB4MDEwRCwgMHgwMUYzLAorICAgIDB4MDFGNCwgMHgwMUY1LCAweDAxRjYsIDB4MDFGNywgMHgwMUY4LCAweDAxRjksCisgICAgMHgwMUZBLCAweDAxRkIsIDB4MDFGQywgMHgwMUZELCAweDAxRkUsIDB4MDFGRiwKKyAgICAweDAyMDAsIDB4MDIwMSwgMHgwMjAyLCAweDAyMDMsIDB4MDIwNCwgMHgwMjA1LAorICAgIDB4MDIwNiwgMHgwMjA3LCAweDAyMDgsIDB4MDIwOSwgMHgwMjBBLCAweDAyMEIsCisgICAgMHgwMjBDLCAweDAyMEQsIDB4MDJGMywgMHgwMkY0LCAweDAyRjUsIDB4MDJGNiwKKyAgICAweDAyRjcsIDB4MDJGOCwgMHgwMkY5LCAweDAyRkEsIDB4MDJGQiwgMHgwMkZDLAorICAgIDB4MDJGRCwgMHgwMkZFLCAweDAyRkYsIDB4MDMwMCwgMHgwMzAxLCAweDAzMDIsCisgICAgMHgwMzAzLCAweDAzMDQsIDB4MDMwNSwgMHgwMzA2LCAweDAzMDcsIDB4MDMwOCwKKyAgICAweDAzMDksIDB4MDMwQSwgMHgwMzBCLCAweDAzMEMsIDB4MDMwRCwgMHgwM0YzLAorICAgIDB4MDNGNCwgMHgwM0Y1LCAweDAzRjYsIDB4MDNGNywgMHgwM0Y4LCAweDAzRjksCisgICAgMHgwM0ZBLCAweDAzRkIsIDB4MDNGQywgMHgwM0ZELCAweDAzRkUsIDB4MDNGRiwKKyAgICAweDA0MDAsIDB4MDQwMSwgMHgwNDAyLCAweDA0MDMsIDB4MDQwNCwgMHgwNDA1LAorICAgIDB4MDQwNiwgMHgwNDA3LCAweDA0MDgsIDB4MDQwOSwgMHgwNDBBLCAweDA0MEIsCisgICAgMHgwNDBDLCAweDA0MEQsIDB4MDRGMywgMHgwNEY0LCAweDA0RjUsIDB4MDRGNiwKKyAgICAweDA0RjcsIDB4MDRGOCwgMHgwNEY5LCAweDA0RkEsIDB4MDRGQiwgMHgwNEZDLAorICAgIDB4MDRGRCwgMHgwNEZFLCAweDA0RkYsIDB4MDUwMCwgMHgwNTAxLCAweDA1MDIsCisgICAgMHgwNTAzLCAweDA1MDQsIDB4MDUwNSwgMHgwNTA2LCAweDA1MDcsIDB4MDUwOCwKKyAgICAweDA1MDksIDB4MDUwQSwgMHgwNTBCLCAweDA1MEMsIDB4MDUwRCwgMHgwNUYzLAorICAgIDB4MDVGNCwgMHgwNUY1LCAweDA1RjYsIDB4MDVGNywgMHgwNUY4LCAweDA1RjksCisgICAgMHgwNUZBLCAweDA1RkIsIDB4MDVGQywgMHgwNUZELCAweDA1RkUsIDB4MDVGRiwKKyAgICAweDA2MDAsIDB4MDYwMSwgMHgwNjAyLCAweDA2MDMsIDB4MDYwNCwgMHgwNjA1LAorICAgIDB4MDYwNiwgMHgwNjA3LCAweDA2MDgsIDB4MDYwOSwgMHgwNjBBLCAweDA2MEIsCisgICAgMHgwNjBDLCAweDA2MEQsIDB4MDZGMywgMHgwNkY0LCAweDA2RjUsIDB4MDZGNiwKKyAgICAweDA2RjcsIDB4MDZGOCwgMHgwNkY5LCAweDA2RkEsIDB4MDZGQiwgMHgwNkZDLAorICAgIDB4MDZGRCwgMHgwNkZFLCAweDA2RkYsIDB4MDcwMCwgMHgwNzAxLCAweDA3MDIsCisgICAgMHgwNzAzLCAweDA3MDQsIDB4MDcwNSwgMHgwNzA2LCAweDA3MDcsIDB4MDcwOCwKKyAgICAweDA3MDksIDB4MDcwQSwgMHgwNzBCLCAweDA3MEMsIDB4MDcwRCwgMHgwN0YzLAorICAgIDB4MDdGNCwgMHgwN0Y1LCAweDA3RjYsIDB4MDdGNywgMHgwN0Y4LCAweDA3RjksCisgICAgMHgwN0ZBLCAweDA3RkIsIDB4MDdGQywgMHgwN0ZELCAweDA3RkUsIDB4MDdGRiwKKyAgICAweDA4MDAsIDB4MDgwMSwgMHgwODAyLCAweDA4MDMsIDB4MDgwNCwgMHgwODA1LAorICAgIDB4MDgwNiwgMHgwODA3LCAweDA4MDgsIDB4MDgwOSwgMHgwODBBLCAweDA4MEIsCisgICAgMHgwODBDLCAweDA4MEQsIDB4MDhGMywgMHgwOEY0LCAweDA4RjUsIDB4MDhGNiwKKyAgICAweDA4RjcsIDB4MDhGOCwgMHgwOEY5LCAweDA4RkEsIDB4MDhGQiwgMHgwOEZDLAorICAgIDB4MDhGRCwgMHgwOEZFLCAweDA4RkYsIDB4MDkwMCwgMHgwOTAxLCAweDA5MDIsCisgICAgMHgwOTAzLCAweDA5MDQsIDB4MDkwNSwgMHgwOTA2LCAweDA5MDcsIDB4MDkwOCwKKyAgICAweDA5MDksIDB4MDkwQSwgMHgwOTBCLCAweDA5MEMsIDB4MDkwRCwgMHgwOUYzLAorICAgIDB4MDlGNCwgMHgwOUY1LCAweDA5RjYsIDB4MDlGNywgMHgwOUY4LCAweDA5RjksCisgICAgMHgwOUZBLCAweDA5RkIsIDB4MDlGQywgMHgwOUZELCAweDA5RkUsIDB4MDlGRiwKKyAgICAweDBBMDAsIDB4MEEwMSwgMHgwQTAyLCAweDBBMDMsIDB4MEEwNCwgMHgwQTA1LAorICAgIDB4MEEwNiwgMHgwQTA3LCAweDBBMDgsIDB4MEEwOSwgMHgwQTBBLCAweDBBMEIsCisgICAgMHgwQTBDLCAweDBBMEQsIDB4MEFGMywgMHgwQUY0LCAweDBBRjUsIDB4MEFGNiwKKyAgICAweDBBRjcsIDB4MEFGOCwgMHgwQUY5LCAweDBBRkEsIDB4MEFGQiwgMHgwQUZDLAorICAgIDB4MEFGRCwgMHgwQUZFLCAweDBBRkYsIDB4MEIwMCwgMHgwQjAxLCAweDBCMDIsCisgICAgMHgwQjAzLCAweDBCMDQsIDB4MEIwNSwgMHgwQjA2LCAweDBCMDcsIDB4MEIwOCwKKyAgICAweDBCMDksIDB4MEIwQSwgMHgwQjBCLCAweDBCMEMsIDB4MEIwRCwgMHgwQkYzLAorICAgIDB4MEJGNCwgMHgwQkY1LCAweDBCRjYsIDB4MEJGNywgMHgwQkY4LCAweDBCRjksCisgICAgMHgwQkZBLCAweDBCRkIsIDB4MEJGQywgMHgwQkZELCAweDBCRkUsIDB4MEJGRiwKKyAgICAweDBDMDAsIDB4MEMwMSwgMHgwQzAyLCAweDBDMDMsIDB4MEMwNCwgMHgwQzA1LAorICAgIDB4MEMwNiwgMHgwQzA3LCAweDBDMDgsIDB4MEMwOSwgMHgwQzBBLCAweDBDMEIsCisgICAgMHgwQzBDLCAweDBDMEQsIDB4MENGMywgMHgwQ0Y0LCAweDBDRjUsIDB4MENGNiwKKyAgICAweDBDRjcsIDB4MENGOCwgMHgwQ0Y5LCAweDBDRkEsIDB4MENGQiwgMHgwQ0ZDLAorICAgIDB4MENGRCwgMHgwQ0ZFLCAweDBDRkYsIDB4MEQwMCwgMHgwRDAxLCAweDBEMDIsCisgICAgMHgwRDAzLCAweDBEMDQsIDB4MEQwNSwgMHgwRDA2LCAweDBEMDcsIDB4MEQwOCwKKyAgICAweDBEMDksIDB4MEQwQSwgMHgwRDBCLCAweDBEMEMsIDB4MEQwRCwgMHgwREYzLAorICAgIDB4MERGNCwgMHgwREY1LCAweDBERjYsIDB4MERGNywgMHgwREY4LCAweDBERjksCisgICAgMHgwREZBLCAweDBERkIsIDB4MERGQywgMHgwREZELCAweDBERkUsIDB4MERGRiwKKyAgICAweEYzMDAsIDB4RjMwMSwgMHhGMzAyLCAweEYzMDMsIDB4RjMwNCwgMHhGMzA1LAorICAgIDB4RjMwNiwgMHhGMzA3LCAweEYzMDgsIDB4RjMwOSwgMHhGMzBBLCAweEYzMEIsCisgICAgMHhGMzBDLCAweEYzMEQsIDB4RjNGMywgMHhGM0Y0LCAweEYzRjUsIDB4RjNGNiwKKyAgICAweEYzRjcsIDB4RjNGOCwgMHhGM0Y5LCAweEYzRkEsIDB4RjNGQiwgMHhGM0ZDLAorICAgIDB4RjNGRCwgMHhGM0ZFLCAweEYzRkYsIDB4RjQwMCwgMHhGNDAxLCAweEY0MDIsCisgICAgMHhGNDAzLCAweEY0MDQsIDB4RjQwNSwgMHhGNDA2LCAweEY0MDcsIDB4RjQwOCwKKyAgICAweEY0MDksIDB4RjQwQSwgMHhGNDBCLCAweEY0MEMsIDB4RjQwRCwgMHhGNEYzLAorICAgIDB4RjRGNCwgMHhGNEY1LCAweEY0RjYsIDB4RjRGNywgMHhGNEY4LCAweEY0RjksCisgICAgMHhGNEZBLCAweEY0RkIsIDB4RjRGQywgMHhGNEZELCAweEY0RkUsIDB4RjRGRiwKKyAgICAweEY1MDAsIDB4RjUwMSwgMHhGNTAyLCAweEY1MDMsIDB4RjUwNCwgMHhGNTA1LAorICAgIDB4RjUwNiwgMHhGNTA3LCAweEY1MDgsIDB4RjUwOSwgMHhGNTBBLCAweEY1MEIsCisgICAgMHhGNTBDLCAweEY1MEQsIDB4RjVGMywgMHhGNUY0LCAweEY1RjUsIDB4RjVGNiwKKyAgICAweEY1RjcsIDB4RjVGOCwgMHhGNUY5LCAweEY1RkEsIDB4RjVGQiwgMHhGNUZDLAorICAgIDB4RjVGRCwgMHhGNUZFLCAweEY1RkYsIDB4RjYwMCwgMHhGNjAxLCAweEY2MDIsCisgICAgMHhGNjAzLCAweEY2MDQsIDB4RjYwNSwgMHhGNjA2LCAweEY2MDcsIDB4RjYwOCwKKyAgICAweEY2MDksIDB4RjYwQSwgMHhGNjBCLCAweEY2MEMsIDB4RjYwRCwgMHhGNkYzLAorICAgIDB4RjZGNCwgMHhGNkY1LCAweEY2RjYsIDB4RjZGNywgMHhGNkY4LCAweEY2RjksCisgICAgMHhGNkZBLCAweEY2RkIsIDB4RjZGQywgMHhGNkZELCAweEY2RkUsIDB4RjZGRiwKKyAgICAweEY3MDAsIDB4RjcwMSwgMHhGNzAyLCAweEY3MDMsIDB4RjcwNCwgMHhGNzA1LAorICAgIDB4RjcwNiwgMHhGNzA3LCAweEY3MDgsIDB4RjcwOSwgMHhGNzBBLCAweEY3MEIsCisgICAgMHhGNzBDLCAweEY3MEQsIDB4RjdGMywgMHhGN0Y0LCAweEY3RjUsIDB4RjdGNiwKKyAgICAweEY3RjcsIDB4RjdGOCwgMHhGN0Y5LCAweEY3RkEsIDB4RjdGQiwgMHhGN0ZDLAorICAgIDB4RjdGRCwgMHhGN0ZFLCAweEY3RkYsIDB4RjgwMCwgMHhGODAxLCAweEY4MDIsCisgICAgMHhGODAzLCAweEY4MDQsIDB4RjgwNSwgMHhGODA2LCAweEY4MDcsIDB4RjgwOCwKKyAgICAweEY4MDksIDB4RjgwQSwgMHhGODBCLCAweEY4MEMsIDB4RjgwRCwgMHhGOEYzLAorICAgIDB4RjhGNCwgMHhGOEY1LCAweEY4RjYsIDB4RjhGNywgMHhGOEY4LCAweEY4RjksCisgICAgMHhGOEZBLCAweEY4RkIsIDB4RjhGQywgMHhGOEZELCAweEY4RkUsIDB4RjhGRiwKKyAgICAweEY5MDAsIDB4RjkwMSwgMHhGOTAyLCAweEY5MDMsIDB4RjkwNCwgMHhGOTA1LAorICAgIDB4RjkwNiwgMHhGOTA3LCAweEY5MDgsIDB4RjkwOSwgMHhGOTBBLCAweEY5MEIsCisgICAgMHhGOTBDLCAweEY5MEQsIDB4RjlGMywgMHhGOUY0LCAweEY5RjUsIDB4RjlGNiwKKyAgICAweEY5RjcsIDB4RjlGOCwgMHhGOUY5LCAweEY5RkEsIDB4RjlGQiwgMHhGOUZDLAorICAgIDB4RjlGRCwgMHhGOUZFLCAweEY5RkYsIDB4RkEwMCwgMHhGQTAxLCAweEZBMDIsCisgICAgMHhGQTAzLCAweEZBMDQsIDB4RkEwNSwgMHhGQTA2LCAweEZBMDcsIDB4RkEwOCwKKyAgICAweEZBMDksIDB4RkEwQSwgMHhGQTBCLCAweEZBMEMsIDB4RkEwRCwgMHhGQUYzLAorICAgIDB4RkFGNCwgMHhGQUY1LCAweEZBRjYsIDB4RkFGNywgMHhGQUY4LCAweEZBRjksCisgICAgMHhGQUZBLCAweEZBRkIsIDB4RkFGQywgMHhGQUZELCAweEZBRkUsIDB4RkFGRiwKKyAgICAweEZCMDAsIDB4RkIwMSwgMHhGQjAyLCAweEZCMDMsIDB4RkIwNCwgMHhGQjA1LAorICAgIDB4RkIwNiwgMHhGQjA3LCAweEZCMDgsIDB4RkIwOSwgMHhGQjBBLCAweEZCMEIsCisgICAgMHhGQjBDLCAweEZCMEQsIDB4RkJGMywgMHhGQkY0LCAweEZCRjUsIDB4RkJGNiwKKyAgICAweEZCRjcsIDB4RkJGOCwgMHhGQkY5LCAweEZCRkEsIDB4RkJGQiwgMHhGQkZDLAorICAgIDB4RkJGRCwgMHhGQkZFLCAweEZCRkYsIDB4RkMwMCwgMHhGQzAxLCAweEZDMDIsCisgICAgMHhGQzAzLCAweEZDMDQsIDB4RkMwNSwgMHhGQzA2LCAweEZDMDcsIDB4RkMwOCwKKyAgICAweEZDMDksIDB4RkMwQSwgMHhGQzBCLCAweEZDMEMsIDB4RkMwRCwgMHhGQ0YzLAorICAgIDB4RkNGNCwgMHhGQ0Y1LCAweEZDRjYsIDB4RkNGNywgMHhGQ0Y4LCAweEZDRjksCisgICAgMHhGQ0ZBLCAweEZDRkIsIDB4RkNGQywgMHhGQ0ZELCAweEZDRkUsIDB4RkNGRiwKKyAgICAweEZEMDAsIDB4RkQwMSwgMHhGRDAyLCAweEZEMDMsIDB4RkQwNCwgMHhGRDA1LAorICAgIDB4RkQwNiwgMHhGRDA3LCAweEZEMDgsIDB4RkQwOSwgMHhGRDBBLCAweEZEMEIsCisgICAgMHhGRDBDLCAweEZEMEQsIDB4RkRGMywgMHhGREY0LCAweEZERjUsIDB4RkRGNiwKKyAgICAweEZERjcsIDB4RkRGOCwgMHhGREY5LCAweEZERkEsIDB4RkRGQiwgMHhGREZDLAorICAgIDB4RkRGRCwgMHhGREZFLCAweEZERkYsIDB4RkUwMCwgMHhGRTAxLCAweEZFMDIsCisgICAgMHhGRTAzLCAweEZFMDQsIDB4RkUwNSwgMHhGRTA2LCAweEZFMDcsIDB4RkUwOCwKKyAgICAweEZFMDksIDB4RkUwQSwgMHhGRTBCLCAweEZFMEMsIDB4RkUwRCwgMHhGRUYzLAorICAgIDB4RkVGNCwgMHhGRUY1LCAweEZFRjYsIDB4RkVGNywgMHhGRUY4LCAweEZFRjksCisgICAgMHhGRUZBLCAweEZFRkIsIDB4RkVGQywgMHhGRUZELCAweEZFRkUsIDB4RkVGRiwKKyAgICAweEZGMDAsIDB4RkYwMSwgMHhGRjAyLCAweEZGMDMsIDB4RkYwNCwgMHhGRjA1LAorICAgIDB4RkYwNiwgMHhGRjA3LCAweEZGMDgsIDB4RkYwOSwgMHhGRjBBLCAweEZGMEIsCisgICAgMHhGRjBDLCAweEZGMEQsIDB4RkZGMywgMHhGRkY0LCAweEZGRjUsIDB4RkZGNiwKKyAgICAweEZGRjcsIDB4RkZGOCwgMHhGRkY5LCAweEZGRkEsIDB4RkZGQiwgMHhGRkZDLAorICAgIDB4RkZGRCwgMHhGRkZFLCAweEZGRkYsCit9OworCisjZGVmaW5lIE9OMkFWQ19DQjE1X0NPREVTIDEwODkKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBvbjJhdmNfY2IxNV9jb2Rlc1tPTjJBVkNfQ0IxNV9DT0RFU10gPSB7CisgICAgMHgwMDAwMCwgMHgwMDAwQSwgMHgwMDA2NCwgMHgwMDEwNCwgMHgwMDM0QiwgMHgwMDQ3QiwKKyAgICAweDAwN0Q3LCAweDAwRTE0LCAweDAwOTU3LCAweDAyMUZELCAweDAxM0IwLCAweDAzRjA4LAorICAgIDB4MDdBMDEsIDB4MEU1NzksIDB4MDBFMTUsIDB4MDEzQTEsIDB4MDAzQTIsIDB4MDAzOTcsCisgICAgMHgwMTM3RiwgMHgwMUY5NiwgMHgwMjFGQywgMHgwMzRDRCwgMHgwMUU5NywgMHgwMUE4MiwKKyAgICAweDAxM0EwLCAweDAxQTgzLCAweDAwODlELCAweDAwRjZCLCAweDAwNzZDLCAweDAwMjZBLAorICAgIDB4MDAxMTgsIDB4MDAwNkUsIDB4MDAwMDgsIDB4MDAwMEIsIDB4MDAwMTUsIDB4MDAwNzYsCisgICAgMHgwMDBFQywgMHgwMDFEMiwgMHgwMDNBNiwgMHgwMDcxNiwgMHgwMDcyNiwgMHgwMUY5OCwKKyAgICAweDAwRTc3LCAweDAxQkYwLCAweDAxQTg0LCAweDAyMUZFLCAweDAyMUZGLCAweDAwRDkzLAorICAgIDB4MDFBODUsIDB4MDAzNkUsIDB4MDAzQjQsIDB4MDBGRkUsIDB4MDBGREYsIDB4MDdBMDIsCisgICAgMHgwNjVBRiwgMHgwMUU5OCwgMHgwMUY5NywgMHgwMEUxNiwgMHgwMEYzMCwgMHgwMENGMCwKKyAgICAweDAwODQ2LCAweDAwMzk4LCAweDAwMjBGLCAweDAwMEVCLCAweDAwMDc0LCAweDAwMDEyLAorICAgIDB4MDAwN0MsIDB4MDAwNDksIDB4MDAwOUMsIDB4MDAxMzYsIDB4MDAzNDQsIDB4MDAyNkQsCisgICAgMHgwMDc2RSwgMHgwMDg0NywgMHgwMEY2QywgMHgwMDk1OCwgMHgwMUE4NiwgMHgwMEY2RCwKKyAgICAweDAxM0EzLCAweDAxM0IxLCAweDAwOUY4LCAweDAwRjMxLCAweDAwMzJGLCAweDAwMjY4LAorICAgIDB4MDBGRTAsIDB4MDA3NkQsIDB4MDFGOTksIDB4MDEzQTIsIDB4MDNEMDUsIDB4MDExMUEsCisgICAgMHgwMEZGRiwgMHgwMENGMSwgMHgwMDgwRCwgMHgwMDRGQSwgMHgwMDQwQiwgMHgwMDIzRSwKKyAgICAweDAwMTFCLCAweDAwMDhFLCAweDAwMDc3LCAweDAwMTBBLCAweDAwMEY4LCAweDAwMUIwLAorICAgIDB4MDAxRDQsIDB4MDAzRDksIDB4MDA0QzYsIDB4MDA2QUUsIDB4MDA3REUsIDB4MDA4MEUsCisgICAgMHgwMEYzMywgMHgwMEU3OCwgMHgwMUJGMSwgMHgwMTExQiwgMHgwMzRDRSwgMHgwMDk1OSwKKyAgICAweDAxMTFDLCAweDAwMjYyLCAweDAwMUZBLCAweDAwRjMyLCAweDAwRkUxLCAweDAyMjAwLAorICAgIDB4MDFGOUEsIDB4MDEzQTQsIDB4MDBFMTcsIDB4MDBGRTIsIDB4MDA0QjcsIDB4MDBGRTMsCisgICAgMHgwMDcxNywgMHgwMDQ1MywgMHgwMDM2NiwgMHgwMDFDNiwgMHgwMDExQSwgMHgwMDEwRSwKKyAgICAweDAwMzJCLCAweDAwMjNGLCAweDAwMzQ1LCAweDAwMzVBLCAweDAwMzZGLCAweDAwN0I2LAorICAgIDB4MDBFMTksIDB4MDA3MDUsIDB4MDA3NkYsIDB4MDExMUQsIDB4MDBFNzksIDB4MDBENTcsCisgICAgMHgwMUJGNCwgMHgwMUE4NywgMHgwMDk1QiwgMHgwMDk1QywgMHgwMDIxNiwgMHgwMDM5QSwKKyAgICAweDAwRjM0LCAweDAwOTVBLCAweDAxQkYyLCAweDAxQkYzLCAweDAxMDAwLCAweDAwRjZFLAorICAgIDB4MDBGNkYsIDB4MDBFMTgsIDB4MDA3REYsIDB4MDA4RjEsIDB4MDA3QkUsIDB4MDAzQkQsCisgICAgMHgwMDNFQiwgMHgwMDM0MiwgMHgwMDIyRCwgMHgwMDc3MiwgMHgwMDdCRiwgMHgwMDQ1NCwKKyAgICAweDAwNDU1LCAweDAwNzFFLCAweDAwNEZCLCAweDAwNzI3LCAweDAwODBGLCAweDAwOUU3LAorICAgIDB4MDBFN0MsIDB4MDFCRjYsIDB4MDFBODksIDB4MDEwMDEsIDB4MDFCRjcsIDB4MDA4OUUsCisgICAgMHgwMEUxQSwgMHgwMDI3RiwgMHgwMDMzNCwgMHgwMEYzNSwgMHgwMEYzNiwgMHgwMUJGNSwKKyAgICAweDAxRjlCLCAweDAxM0E1LCAweDAwRTdBLCAweDAwOTVELCAweDAwRDU4LCAweDAwRTdCLAorICAgIDB4MDFBODgsIDB4MDBGRTQsIDB4MDA2Q0UsIDB4MDA0MEUsIDB4MDA2ODcsIDB4MDA2RDIsCisgICAgMHgwMEUxQywgMHgwMDcwNiwgMHgwMDc0NywgMHgwMDZCNiwgMHgwMDg0RSwgMHgwMENGMiwKKyAgICAweDAwNkYyLCAweDAwRDU5LCAweDAwQ0YzLCAweDAxMDA0LCAweDAxM0E2LCAweDAwRjcxLAorICAgIDB4MDFBOEIsIDB4MDFFOTksIDB4MDBENUEsIDB4MDBEOTQsIDB4MDAzMzUsIDB4MDAyMkUsCisgICAgMHgwMDk1RSwgMHgwMEUxQiwgMHgwMUE4QSwgMHgwMUJGOCwgMHgwMUJGOSwgMHgwMTAwMiwKKyAgICAweDAwOUY5LCAweDAwRjcwLCAweDAxMDAzLCAweDAwNzczLCAweDAwRjM3LCAweDAwODEyLAorICAgIDB4MDA0RDIsIDB4MDA0QTMsIDB4MDA4OUYsIDB4MDEzQTksIDB4MDEzQUEsIDB4MDA4MTMsCisgICAgMHgwMDgxRSwgMHgwMDcwNywgMHgwMDhBMCwgMHgwMEUxRSwgMHgwMEQ5NSwgMHgwMDhGMiwKKyAgICAweDAwOUZCLCAweDAwRTdELCAweDAwRTdFLCAweDAwRjM5LCAweDAxRjlDLCAweDAwQ0Y0LAorICAgIDB4MDBGNzUsIDB4MDAzNDYsIDB4MDAyNkUsIDB4MDEwMDUsIDB4MDBGNzIsIDB4MDEzQTcsCisgICAgMHgwMTExRSwgMHgwMUJGQSwgMHgwMEY3MywgMHgwMTNBOCwgMHgwMEYzOCwgMHgwMEY3NCwKKyAgICAweDAwOUZBLCAweDAwRkU1LCAweDAwODRGLCAweDAwOTVGLCAweDAwRTFELCAweDAwOUVBLAorICAgIDB4MDFBOEQsIDB4MDBFMjAsIDB4MDBFMjEsIDB4MDA3Q0UsIDB4MDBEOTYsIDB4MDEwMDgsCisgICAgMHgwMEUyMiwgMHgwMDk2MCwgMHgwMTEyMSwgMHgwMEU3RiwgMHgwMTEyMiwgMHgwMUE4RSwKKyAgICAweDAxQkZCLCAweDAxQThGLCAweDAwOEExLCAweDAxMDA5LCAweDAwMzVGLCAweDAwMzY4LAorICAgIDB4MDEzQjIsIDB4MDFBOEMsIDB4MDFGOUQsIDB4MDIyMDEsIDB4MDEwMDYsIDB4MDExMUYsCisgICAgMHgwMTNBQiwgMHgwMTNBQywgMHgwMTEyMCwgMHgwMEY3NiwgMHgwMTAwNywgMHgwMDlGQywKKyAgICAweDAwOEYzLCAweDAwRTFGLCAweDAxRTlBLCAweDAxRjlGLCAweDAxM0IzLCAweDAwRjNCLAorICAgIDB4MDBGNzcsIDB4MDBGNzgsIDB4MDBGRTcsIDB4MDA5RkQsIDB4MDBGRTgsIDB4MDExMjMsCisgICAgMHgwMEQ5NywgMHgwMUJGRiwgMHgwMEU4MCwgMHgwMUE5MywgMHgwMTEyNCwgMHgwMEQ5RSwKKyAgICAweDAwRDVCLCAweDAwM0RBLCAweDAwM0E3LCAweDAwOTYxLCAweDAxQkZDLCAweDAxRjlFLAorICAgIDB4MDFCRkQsIDB4MDFCRkUsIDB4MDFBOTAsIDB4MDFBOTEsIDB4MDEzQUQsIDB4MDBGM0EsCisgICAgMHgwMUE5MiwgMHgwMEZFNiwgMHgwMDk2MiwgMHgwMDg1RSwgMHgwMDk2MywgMHgwMTNBRSwKKyAgICAweDAzRDA2LCAweDAxQzAxLCAweDAxM0I1LCAweDAwOTY1LCAweDAxRkEyLCAweDAyMjAyLAorICAgIDB4MDA5RkUsIDB4MDBGNzksIDB4MDBGN0EsIDB4MDBFMjMsIDB4MDBFMjYsIDB4MDA5NjYsCisgICAgMHgwMTNCMSwgMHgwMUU5QywgMHgwMEY3QiwgMHgwMDhBMiwgMHgwMDNGRSwgMHgwMDNBQiwKKyAgICAweDAwOTY0LCAweDAxM0I0LCAweDAxQzAwLCAweDAxRTlCLCAweDAxRkEwLCAweDAxRkExLAorICAgIDB4MDEwMEEsIDB4MDEzQUYsIDB4MDNGMDksIDB4MDBFODEsIDB4MDFBOTQsIDB4MDExMjUsCisgICAgMHgwMTEyNiwgMHgwMUE5NSwgMHgwMTNCMCwgMHgwM0QwOCwgMHgwMUU5RSwgMHgwMUZBMywKKyAgICAweDAxM0I0LCAweDAxQTk5LCAweDAxMDBCLCAweDAxM0I5LCAweDAwRjNFLCAweDAwOTY3LAorICAgIDB4MDBFMjcsIDB4MDEwMEMsIDB4MDFFOUYsIDB4MDA5NjgsIDB4MDFDMDUsIDB4MDBGM0YsCisgICAgMHgwMEU4MiwgMHgwMDM5QiwgMHgwMDM4NiwgMHgwMUE5NiwgMHgwMUMwMiwgMHgwM0QwNywKKyAgICAweDAxM0I2LCAweDAxQzAzLCAweDAxRTlELCAweDAxMTI3LCAweDAxQTk3LCAweDAxQzA0LAorICAgIDB4MDEzQjIsIDB4MDEzQjMsIDB4MDEzQjcsIDB4MDFBOTgsIDB4MDEzQjgsIDB4MDNGMEEsCisgICAgMHgwRTU3QSwgMHgwN0EwMywgMHgwMTNCQiwgMHgwMUZBNCwgMHgwMUE5QywgMHgwMUZBNSwKKyAgICAweDAxRkE2LCAweDAxM0JDLCAweDAxMDBELCAweDAxRkE3LCAweDAxM0I1LCAweDAxMDBFLAorICAgIDB4MDFBOUQsIDB4MDEwMEYsIDB4MDA5NkEsIDB4MDExMjgsIDB4MDAzMjgsIDB4MDAzRkYsCisgICAgMHgwMDk2OSwgMHgwMUVBMCwgMHgwMUMwNiwgMHgwMTNCQSwgMHgwMUE5QSwgMHgwMzRDRiwKKyAgICAweDAwRjdDLCAweDAyMjAzLCAweDAzNEQyLCAweDAxRUExLCAweDAxQzA3LCAweDAyMjA0LAorICAgIDB4MDFBOUIsIDB4MDFFQTIsIDB4MDY5ODIsIDB4MDNEMDksIDB4MEU1N0IsIDB4MDFGQTgsCisgICAgMHgwMTNDMiwgMHgwMTNDMywgMHgwMTEyOSwgMHgwMUZBOSwgMHgwMTEyQSwgMHgwMTAxMCwKKyAgICAweDAxRkFBLCAweDAxRUE2LCAweDAzRjBGLCAweDAxM0I2LCAweDAwQ0Y1LCAweDAwNzJBLAorICAgIDB4MDBGN0QsIDB4MDAzNDAsIDB4MDAyNUYsIDB4MDIyMDUsIDB4MDIyMDYsIDB4MDY5ODMsCisgICAgMHgwMUMwOCwgMHgwMTNCRCwgMHgwMTNCRSwgMHgwMUVBMywgMHgwMTNCRiwgMHgwMzREMywKKyAgICAweDAxRUE0LCAweDAyMjA3LCAweDAxQTlFLCAweDAxRUE1LCAweDAzRjBCLCAweDAzRjBFLAorICAgIDB4MDFBQTIsIDB4MDBFMDAsIDB4MDBFM0UsIDB4MDBEOUYsIDB4MDBENUYsIDB4MDBDRjcsCisgICAgMHgwMENGRSwgMHgwMTAxMSwgMHgwMEU4NSwgMHgwMEUwMSwgMHgwMEUwMiwgMHgwMDk2QiwKKyAgICAweDAwQ0ZGLCAweDAwRjkyLCAweDAwRDZFLCAweDAwOENBLCAweDAwMzU5LCAweDAwNDU2LAorICAgIDB4MDFDQUUsIDB4MDNEMEEsIDB4MDFBOUYsIDB4MDExMkIsIDB4MDBFODMsIDB4MDEzQjcsCisgICAgMHgwMEY3RSwgMHgwMDlGRiwgMHgwMEU4NCwgMHgwMEZFOSwgMHgwMDlFQiwgMHgwMEY3RiwKKyAgICAweDAwOEEzLCAweDAwRDVFLCAweDAwQ0Y2LCAweDAxMTJFLCAweDAxMTJGLCAweDAxMDE2LAorICAgIDB4MDBGOTMsIDB4MDFGQUUsIDB4MDBGRUEsIDB4MDBGRUIsIDB4MDA5QTYsIDB4MDBFMDMsCisgICAgMHgwMUMwQSwgMHgwMTAxNywgMHgwMUMwQiwgMHgwMUZBRiwgMHgwMEY5RSwgMHgwMTNCQiwKKyAgICAweDAxOTZBLCAweDAwMzlDLCAweDAwM0Y2LCAweDAzNzlBLCAweDAzRDBCLCAweDAxRkFCLAorICAgIDB4MDFFQTcsIDB4MDEzQjgsIDB4MDEwMTIsIDB4MDFBQTMsIDB4MDFDMDksIDB4MDEzQjksCisgICAgMHgwMTAxMywgMHgwMENCNCwgMHgwMEU4NiwgMHgwMUYzRSwgMHgwMTNCQSwgMHgwMEU4NywKKyAgICAweDAwN0ZCLCAweDAwM0NGLCAweDAwMzdBLCAweDAwM0FELCAweDAwMzg3LCAweDAwMzhBLAorICAgIDB4MDAzQjUsIDB4MDAzOUUsIDB4MDAyNkYsIDB4MDAzOEIsIDB4MDAyNzIsIDB4MDAzOUYsCisgICAgMHgwMDM5OSwgMHgwMDM4RSwgMHgwMDI1MiwgMHgwMDM5QSwgMHgwMDAxOCwgMHgwMDAxQiwKKyAgICAweDAwM0NFLCAweDAwNDU3LCAweDAwM0U4LCAweDAwNjdFLCAweDAwNDFBLCAweDAwM0JFLAorICAgIDB4MDAzQkYsIDB4MDAzRUUsIDB4MDA0MzcsIDB4MDAzOUQsIDB4MDAzQUMsIDB4MDA0NjQsCisgICAgMHgwMDNDNiwgMHgwMDNDNywgMHgwMDQxQiwgMHgwMDdGNiwgMHgwMDQyRSwgMHgwMDI1QywKKyAgICAweDAwMzhDLCAweDAwM0JBLCAweDAwM0U5LCAweDAwM0VBLCAweDAwMjcxLCAweDAwM0JCLAorICAgIDB4MDAyNkEsIDB4MDAyNUQsIDB4MDAyNUUsIDB4MDAzODksIDB4MDAzRUUsIDB4MDA0RjQsCisgICAgMHgwMDQxNSwgMHgwMDAxQSwgMHgwMDAxNywgMHgwMDM4OCwgMHgwMDM4RSwgMHgwMDNGQywKKyAgICAweDAwMjcwLCAweDAwMzc4LCAweDAwMzhBLCAweDAwM0FFLCAweDAwM0FBLCAweDAwMzk4LAorICAgIDB4MDAzRTgsIDB4MDAzNTgsIDB4MDA0MTQsIDB4MDAzODQsIDB4MDAzQjgsIDB4MDA2RDMsCisgICAgMHgwMUE2QiwgMHgwMEZFQSwgMHgwMUJDRSwgMHgwMDlFNCwgMHgwMEU1NiwgMHgwMUJDRiwKKyAgICAweDAxMzFELCAweDAwOUU1LCAweDAxQkQ4LCAweDAxQkQ5LCAweDAzNEMwLCAweDAxRjg2LAorICAgIDB4MDFBNkMsIDB4MDFGM0YsIDB4MDY1QUMsIDB4MDcyQkUsIDB4MDA0MzYsIDB4MDAyMkMsCisgICAgMHgwMDlFMCwgMHgwMEY1NCwgMHgwMDlFMiwgMHgwMTEwNCwgMHgwMTEwNSwgMHgwMEZFOCwKKyAgICAweDAwOUUzLCAweDAwRkU5LCAweDAwRjU1LCAweDAxMzFDLCAweDAxQTY4LCAweDAxQTZBLAorICAgIDB4MDBFMDYsIDB4MDExMDYsIDB4MDFCQ0MsIDB4MDBFNkUsIDB4MDBFM0YsIDB4MDBDQjcsCisgICAgMHgwMEYyOCwgMHgwMDcwMiwgMHgwMDk0RSwgMHgwMEYyOSwgMHgwMEZFQywgMHgwMEYyQSwKKyAgICAweDAxMzFFLCAweDAwRjU2LCAweDAxMzFGLCAweDAwRjU3LCAweDAxMTBBLCAweDAxMzRFLAorICAgIDB4MDFFODYsIDB4MDA3MTIsIDB4MDAxRjYsIDB4MDA4MUYsIDB4MDBENkYsIDB4MDBGRUIsCisgICAgMHgwMTEwNywgMHgwMENCNiwgMHgwMDk0QywgMHgwMUJEQSwgMHgwMTEwOCwgMHgwMTEwOSwKKyAgICAweDAwOUU2LCAweDAwRTZDLCAweDAxRjg4LCAweDAwRTZELCAweDAwODk2LCAweDAwOTRELAorICAgIDB4MDNGMDAsIDB4MDFFODgsIDB4MDIxN0MsIDB4MDNGMDEsIDB4MDNGMDIsIDB4MDEzOTksCisgICAgMHgwMUU4OSwgMHgwRTU3OCwgMHgwMTM5QSwgMHgwMUU4QSwgMHgwMUY4QSwgMHgwMUY4QiwKKyAgICAweDAxRThCLCAweDAzRDAyLCAweDAxRjhDLCAweDAxMzlCLCAweDAwMzkyLCAweDAwMzVFLAorICAgIDB4MDBGNTgsIDB4MDA5REUsIDB4MDA5NEYsIDB4MDEzNTgsIDB4MDEzNTksIDB4MDEzNUEsCisgICAgMHgwMTM0RiwgMHgwMUJEQiwgMHgwMTM1QiwgMHgwMzc5QiwgMHgwMUY4OSwgMHgwMTM5OCwKKyAgICAweDAzNEMyLCAweDA2NUFELCAweDAxRTg3LCAweDAzRjA0LCAweDA3QTAwLCAweDAyMTdELAorICAgIDB4MDFBNkQsIDB4MDY1QUUsIDB4MDFFOEMsIDB4MDIxN0UsIDB4MDFCREQsIDB4MDEzNUMsCisgICAgMHgwMUE2RSwgMHgwMzRDNCwgMHgwMUU4RCwgMHgwM0YwNSwgMHgwMUU4RSwgMHgwMjE3RiwKKyAgICAweDAxMzlELCAweDAwM0Y3LCAweDAwMzJDLCAweDAzNEMzLCAweDAwRTA3LCAweDAxMTBCLAorICAgIDB4MDA5RTcsIDB4MDBGNTksIDB4MDNEMDMsIDB4MDBEOEEsIDB4MDFGOEQsIDB4MDBFNkYsCisgICAgMHgwMEZFRCwgMHgwM0YwMywgMHgwMEZFRSwgMHgwMUJEQywgMHgwMTM5QywgMHgwNzJCRiwKKyAgICAweDAzRjA2LCAweDAyMUYyLCAweDAxQTcwLCAweDAyMUYzLCAweDAxMzVFLCAweDAxMzlFLAorICAgIDB4MDFGOEUsIDB4MDFGOEYsIDB4MDEzOUYsIDB4MDFFOTEsIDB4MDEzQTAsIDB4MDEzNUYsCisgICAgMHgwMzRDNiwgMHgwMTEwRSwgMHgwMUE3MSwgMHgwMjFGNCwgMHgwMDI2QywgMHgwMDIwNiwKKyAgICAweDAxMTBDLCAweDAwOUU4LCAweDAxQkRFLCAweDAwRjVBLCAweDAwRkVGLCAweDAxMzVELAorICAgIDB4MDBGRjAsIDB4MDFFOEYsIDB4MDIxRjAsIDB4MDA5RTksIDB4MDFFOTAsIDB4MDIxRjEsCisgICAgMHgwMUE2RiwgMHgwMTEwRCwgMHgwMzRDNSwgMHgwMjFGNSwgMHgwMUE3MywgMHgwMUJFMiwKKyAgICAweDAxQkUzLCAweDAxRjkxLCAweDAxQTc0LCAweDAwRTcwLCAweDAyMUY2LCAweDAzNEM4LAorICAgIDB4MDBGRjMsIDB4MDFGOTIsIDB4MDEzQTEsIDB4MDEzQTIsIDB4MDEzQTMsIDB4MDFBNzUsCisgICAgMHgwMTM3MiwgMHgwMDNCQywgMHgwMDM0MSwgMHgwMzRDNywgMHgwMDk1MCwgMHgwMEZGMSwKKyAgICAweDAwRkYyLCAweDAwOUVBLCAweDAwRjVCLCAweDAxMzcwLCAweDAxQkRGLCAweDAxMzcxLAorICAgIDB4MDFBNzIsIDB4MDFCRTAsIDB4MDA5RUIsIDB4MDFGOTAsIDB4MDExMEYsIDB4MDFCRTEsCisgICAgMHgwMUU5MiwgMHgwMTNBNiwgMHgwMEQ4QiwgMHgwMEZEOCwgMHgwMUJFNSwgMHgwMEZGNCwKKyAgICAweDAwRkY1LCAweDAxQkU2LCAweDAxM0E3LCAweDAwRjVGLCAweDAxQkU3LCAweDAyMUY3LAorICAgIDB4MDIxRjgsIDB4MDM0QzksIDB4MDA5RUMsIDB4MDEzQTgsIDB4MDAzRUYsIDB4MDAyNjksCisgICAgMHgwMENEOCwgMHgwMEZENiwgMHgwMEY1QywgMHgwMTNBNCwgMHgwMEY1RCwgMHgwMEYyQiwKKyAgICAweDAwRTA4LCAweDAxMTEwLCAweDAxQkU0LCAweDAwRTA5LCAweDAxM0E1LCAweDAwRjJDLAorICAgIDB4MDA4OTgsIDB4MDBGNUUsIDB4MDFBNzYsIDB4MDEzQTksIDB4MDBEOEMsIDB4MDA5REYsCisgICAgMHgwMDlFMCwgMHgwMEZGOCwgMHgwMEQ4RCwgMHgwMTM3NCwgMHgwMUE3OCwgMHgwMTExMiwKKyAgICAweDAxQkU4LCAweDAxQTc5LCAweDAxRjkzLCAweDAxMTEzLCAweDAxMzc1LCAweDAwRjYxLAorICAgIDB4MDEzNzYsIDB4MDAzOTksIDB4MDAyN0MsIDB4MDA5RUQsIDB4MDBGNjAsIDB4MDEzNzMsCisgICAgMHgwMUE3NywgMHgwMDk1MSwgMHgwMDlFRSwgMHgwMEQ1MCwgMHgwMENEOSwgMHgwMEZGNiwKKyAgICAweDAwRkQ5LCAweDAwRkY3LCAweDAwODk5LCAweDAwN0M4LCAweDAwRDUyLCAweDAxMTExLAorICAgIDB4MDA5RUYsIDB4MDA3RDMsIDB4MDA3RDQsIDB4MDA3MUUsIDB4MDBDREIsIDB4MDA3NDYsCisgICAgMHgwMEUwQSwgMHgwMEUwQiwgMHgwMjFGOSwgMHgwMEZGOSwgMHgwMUE3QSwgMHgwMDk1MiwKKyAgICAweDAxM0FCLCAweDAxMzc3LCAweDAwOUYwLCAweDAxRTkzLCAweDAwM0FGLCAweDAwMzJFLAorICAgIDB4MDA5RTEsIDB4MDA3Q0EsIDB4MDEzQUEsIDB4MDExMTQsIDB4MDBGNjIsIDB4MDBFNzEsCisgICAgMHgwMDhDQiwgMHgwMDhDQywgMHgwMDg5QSwgMHgwMDhDRCwgMHgwMDg0MCwgMHgwMENEQSwKKyAgICAweDAwN0QyLCAweDAwOUUyLCAweDAwRTcyLCAweDAwRjYzLCAweDAwNkQ2LCAweDAwODQxLAorICAgIDB4MDA3OUUsIDB4MDBENTMsIDB4MDA4Q0UsIDB4MDA5NTUsIDB4MDBFMEMsIDB4MDEzN0EsCisgICAgMHgwMEU3NCwgMHgwMTExNSwgMHgwMUY5NCwgMHgwMTExNiwgMHgwMUJFQSwgMHgwMEUwRCwKKyAgICAweDAxQTdCLCAweDAwMzhELCAweDAwMzNFLCAweDAwQ0RDLCAweDAwRDhFLCAweDAxQkU5LAorICAgIDB4MDEzNzgsIDB4MDEzNzksIDB4MDBGREEsIDB4MDBFNzMsIDB4MDA5NTMsIDB4MDA5NTQsCisgICAgMHgwMDlFMywgMHgwMDRENiwgMHgwMDdCNywgMHgwMDdCQSwgMHgwMDdCQiwgMHgwMDRBMCwKKyAgICAweDAwODlCLCAweDAwNkQ3LCAweDAwNDdBLCAweDAwNDA4LCAweDAwN0Y3LCAweDAwRTBFLAorICAgIDB4MDA5RTQsIDB4MDA3RDUsIDB4MDA4NDIsIDB4MDBEOTAsIDB4MDA5RjEsIDB4MDM0Q0EsCisgICAgMHgwMUE3QywgMHgwMUE3RCwgMHgwMEUwRiwgMHgwMUE3RSwgMHgwMDMyOSwgMHgwMDIxRSwKKyAgICAweDAwRjY0LCAweDAxMTE3LCAweDAyMUZBLCAweDAxMTE4LCAweDAxM0FDLCAweDAxM0FELAorICAgIDB4MDBEOEYsIDB4MDA4Q0YsIDB4MDA4RjAsIDB4MDA3MUYsIDB4MDA0QTEsIDB4MDA2ODYsCisgICAgMHgwMDQyNiwgMHgwMDQxNiwgMHgwMDdDQiwgMHgwMDNEOCwgMHgwMDI2NCwgMHgwMDM0NywKKyAgICAweDAwM0RDLCAweDAwNEY2LCAweDAwNEQ3LCAweDAwRjJELCAweDAwRjY1LCAweDAwOUYzLAorICAgIDB4MDBGREIsIDB4MDBFNzUsIDB4MDA5RjQsIDB4MDEzN0IsIDB4MDEzQUUsIDB4MDA5RTUsCisgICAgMHgwMEUxMCwgMHgwMDI3RSwgMHgwMDIwQywgMHgwMEZGQSwgMHgwMDk1NiwgMHgwMUJFQiwKKyAgICAweDAxRTk0LCAweDAxRTk1LCAweDAwRDkxLCAweDAwOUYyLCAweDAwRDU0LCAweDAwN0JDLAorICAgIDB4MDA3QkQsIDB4MDA0MEEsIDB4MDAzODUsIDB4MDAzNkEsIDB4MDAyMkYsIDB4MDAyMEUsCisgICAgMHgwMDBGQywgMHgwMDBGMiwgMHgwMDFBRSwgMHgwMDFDOCwgMHgwMDM0QSwgMHgwMDRGNywKKyAgICAweDAwNDUyLCAweDAwQ0RFLCAweDAwODQzLCAweDAwRTc2LCAweDAwRjJFLCAweDAwRjY3LAorICAgIDB4MDEzN0MsIDB4MDFBN0YsIDB4MDA4MEMsIDB4MDBGREMsIDB4MDAyMUEsIDB4MDAxRkMsCisgICAgMHgwMEUxMSwgMHgwMDlGNSwgMHgwMUJFQywgMHgwMEY2NiwgMHgwMTNBRiwgMHgwMENERCwKKyAgICAweDAwRTEyLCAweDAwRDU1LCAweDAwNzAzLCAweDAwODBBLCAweDAwMzk0LCAweDAwMjY1LAorICAgIDB4MDAxRjYsIDB4MDAxQjYsIDB4MDAxMEMsIDB4MDAwNzgsIDB4MDAwNEMsIDB4MDAwQ0MsCisgICAgMHgwMDFBNCwgMHgwMDIxMiwgMHgwMDM5NiwgMHgwMDZDNCwgMHgwMDg5QywgMHgwMENERiwKKyAgICAweDAxQTgwLCAweDAwRjY4LCAweDAwRkZELCAweDAxMzdELCAweDAxRjk1LCAweDAwODQ1LAorICAgIDB4MDBFMTMsIDB4MDAyNjcsIDB4MDAyNjYsIDB4MDBGRkIsIDB4MDA5RjYsIDB4MDNEMDQsCisgICAgMHgwMUJFRCwgMHgwMUJFRSwgMHgwMzRDQiwgMHgwMEZGQywgMHgwMDg0NCwgMHgwMDdENiwKKyAgICAweDAwNzA0LCAweDAwM0M4LCAweDAwMzJBLCAweDAwMTMwLCAweDAwMENFLCAweDAwMDQ4LAorICAgIDB4MDAwMEMsIDB4MDAwMTQsIDB4MDAwN0EsIDB4MDAwRjAsIDB4MDAxRTYsIDB4MDA0MTcsCisgICAgMHgwMDRBMiwgMHgwMDRCNiwgMHgwMEQ5MiwgMHgwMUE4MSwgMHgwMDlGNywgMHgwMTM3RSwKKyAgICAweDAxRTk2LCAweDAzRjA3LCAweDAwOUU2LCAweDAwRkRFLCAweDAwM0M5LCAweDAwMjY4LAorICAgIDB4MDBGMkYsIDB4MDBENTYsIDB4MDIxRkIsIDB4MDM0Q0MsIDB4MDFCRUYsIDB4MDBGNjksCisgICAgMHgwMTExOSwgMHgwMEY2QSwgMHgwMEZERCwgMHgwMDdGQSwgMHgwMDNFNiwgMHgwMDFFMiwKKyAgICAweDAwMEVBLCAweDAwMDcyLCAweDAwMDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb24yYXZjX2NiMTVfYml0c1tPTjJBVkNfQ0IxNV9DT0RFU10gPSB7CisgICAgIDIsICA1LCAgNywgIDksIDEwLCAxMSwKKyAgICAxMiwgMTIsIDEzLCAxNCwgMTQsIDE0LAorICAgIDE2LCAxNywgMTIsIDEzLCAxMSwgMTEsCisgICAgMTMsIDEzLCAxNCwgMTQsIDE0LCAxMywKKyAgICAxMywgMTMsIDEyLCAxMywgMTIsIDEwLAorICAgICA5LCAgNywgIDUsICA1LCAgNSwgIDcsCisgICAgIDksIDEwLCAxMSwgMTEsIDEyLCAxMywKKyAgICAxMywgMTMsIDEzLCAxNCwgMTQsIDEyLAorICAgIDEzLCAxMCwgMTEsIDEzLCAxMiwgMTYsCisgICAgMTUsIDE0LCAxMywgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTEsIDEwLCAgOSwgIDcsICA1LAorICAgICA3LCAgOCwgIDgsICA5LCAxMCwgMTEsCisgICAgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTQsIDEzLCAxMiwgMTAsIDEwLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxNSwgMTMsCisgICAgMTMsIDEyLCAxMiwgMTEsIDExLCAxMCwKKyAgICAgOSwgIDgsICA3LCAgOSwgIDksICA5LAorICAgICA5LCAxMCwgMTEsIDExLCAxMiwgMTIsCisgICAgMTIsIDEzLCAxMywgMTMsIDE0LCAxMywKKyAgICAxMywgMTAsIDEwLCAxMiwgMTIsIDE0LAorICAgIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsCisgICAgMTEsIDExLCAxMCwgMTAsICA5LCAgOSwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLAorICAgIDEyLCAxMiwgMTIsIDEzLCAxMywgMTIsCisgICAgMTMsIDEzLCAxMywgMTMsIDEwLCAxMCwKKyAgICAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMiwgMTIsIDEyLCAxMSwgMTEsCisgICAgMTAsIDEwLCAxMCwgMTIsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsCisgICAgMTIsIDEwLCAxMCwgMTIsIDEyLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTIsIDEzLAorICAgIDEzLCAxMiwgMTEsIDExLCAxMSwgMTEsCisgICAgMTIsIDEyLCAxMiwgMTEsIDEyLCAxMiwKKyAgICAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDEzLCAxNCwgMTIsIDEyLCAxMCwgMTAsCisgICAgMTMsIDEyLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEzLCAxMywgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMywgMTMsIDEzLCAxMiwgMTMsIDEyLAorICAgIDEzLCAxMCwgMTEsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEyLCAxMywKKyAgICAxMywgMTIsIDEyLCAxMywgMTIsIDEyLAorICAgIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTMsCisgICAgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEyLCAxMywgMTAsIDEwLAorICAgIDE0LCAxMywgMTMsIDE0LCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMiwgMTIsIDE0LCAxMywgMTQsIDEyLAorICAgIDEzLCAxMywgMTIsIDEzLCAxMiwgMTMsCisgICAgMTIsIDEzLCAxMywgMTMsIDEzLCAxMiwKKyAgICAxMiwgMTAsIDExLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsCisgICAgMTMsIDEyLCAxMywgMTIsIDEzLCAxMywKKyAgICAxNSwgMTMsIDE0LCAxMywgMTMsIDE0LAorICAgIDEzLCAxMywgMTMsIDEyLCAxMiwgMTMsCisgICAgMTMsIDE0LCAxMywgMTIsIDEwLCAxMCwKKyAgICAxMywgMTQsIDEzLCAxNCwgMTMsIDEzLAorICAgIDEzLCAxMywgMTQsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTUsIDE0LCAxMywKKyAgICAxMywgMTMsIDEzLCAxNCwgMTIsIDEzLAorICAgIDEyLCAxMywgMTQsIDEzLCAxMywgMTIsCisgICAgMTMsIDEwLCAxMSwgMTMsIDEzLCAxNSwKKyAgICAxNCwgMTMsIDE0LCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTQsIDEzLCAxNCwgMTQsCisgICAgMTcsIDE2LCAxNCwgMTMsIDEzLCAxMywKKyAgICAxMywgMTQsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMCwgMTAsCisgICAgMTMsIDE0LCAxMywgMTQsIDEzLCAxNCwKKyAgICAxMywgMTQsIDE0LCAxNCwgMTMsIDE0LAorICAgIDEzLCAxNCwgMTUsIDE1LCAxNywgMTMsCisgICAgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTQsIDE0LCAxMywgMTIsIDEyLAorICAgIDEzLCAxMCwgMTEsIDE0LCAxNCwgMTUsCisgICAgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDEzLCAxNCwgMTQsIDE0LAorICAgIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMiwgMTMsIDEyLCAxMiwgMTAsIDExLAorICAgIDE0LCAxNSwgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTIsIDEyLCAxMywKKyAgICAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTIsIDEyLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTAsIDExLCAxNCwgMTUsIDEzLAorICAgIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEyLCAxMywgMTQsIDEzLCAxMywKKyAgICAxMSwgMTEsIDEwLCAxMCwgMTEsIDExLAorICAgIDExLCAxMCwgMTEsIDExLCAxMSwgMTAsCisgICAgMTEsIDExLCAxMSwgMTEsICA1LCAgNiwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMCwgMTEsIDEwLCAxMCwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMCwgMTEsIDEwLCAxMCwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsICA2LCAgNSwgMTEsIDEwLCAxMCwKKyAgICAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTQsIDEzLAorICAgIDEzLCAxNCwgMTUsIDE2LCAxMSwgMTAsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEyLCAxMywgMTMsIDEzLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMywgMTIsIDEzLCAxMiwKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDE0LAorICAgIDE0LCAxMSwgMTAsIDEyLCAxMiwgMTMsCisgICAgMTMsIDEyLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTIsIDEzLAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE3LCAxNCwgMTQsIDEzLCAxMywKKyAgICAxNCwgMTUsIDEzLCAxNCwgMTEsIDEwLAorICAgIDEzLCAxMiwgMTMsIDEzLCAxMywgMTMsCisgICAgMTQsIDEzLCAxMywgMTQsIDEzLCAxNCwKKyAgICAxNCwgMTUsIDE0LCAxNCwgMTYsIDE0LAorICAgIDEzLCAxNSwgMTQsIDE0LCAxMywgMTMsCisgICAgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTEsIDEwLCAxNCwgMTIsIDEzLAorICAgIDEzLCAxMywgMTUsIDEyLCAxMywgMTMsCisgICAgMTMsIDE0LCAxMywgMTMsIDE0LCAxNiwKKyAgICAxNCwgMTQsIDEzLCAxNCwgMTMsIDE0LAorICAgIDEzLCAxMywgMTQsIDE0LCAxNCwgMTMsCisgICAgMTQsIDEzLCAxMywgMTQsIDExLCAxMCwKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxNCwgMTQsIDEzLCAxNCwgMTQsCisgICAgMTMsIDEzLCAxNCwgMTQsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTQsIDE0LAorICAgIDEzLCAxMywgMTQsIDE0LCAxNCwgMTMsCisgICAgMTMsIDExLCAxMCwgMTQsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTQsIDE0LCAxMiwgMTIsIDEzLCAxMywKKyAgICAxMywgMTMsIDE0LCAxMywgMTMsIDE0LAorICAgIDE0LCAxNCwgMTMsIDE0LCAxMCwgMTAsCisgICAgMTIsIDEyLCAxMywgMTQsIDEzLCAxMiwKKyAgICAxMiwgMTMsIDEzLCAxMiwgMTQsIDEyLAorICAgIDEyLCAxMywgMTMsIDE0LCAxMiwgMTIsCisgICAgMTIsIDEzLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMCwgMTAsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTIsIDEyLCAxMywKKyAgICAxMiwgMTMsIDEyLCAxMiwgMTIsIDEzLAorICAgIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxNCwgMTMsIDEzLCAxMywKKyAgICAxNCwgMTMsIDEzLCAxNCwgMTAsIDEwLAorICAgIDEyLCAxMiwgMTQsIDEzLCAxMywgMTMsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEzLCAxMywgMTEsIDEyLAorICAgIDExLCAxMiwgMTIsIDEzLCAxMiwgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMiwKKyAgICAxMywgMTAsIDEwLCAxMiwgMTIsIDEzLAorICAgIDEzLCAxMywgMTIsIDEzLCAxMywgMTMsCisgICAgMTIsIDEyLCAxMSwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTEsIDExLCAxMSwgMTEsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMywgMTQsCisgICAgMTMsIDEzLCAxMiwgMTMsIDEwLCAxMCwKKyAgICAxMywgMTMsIDE0LCAxMywgMTQsIDE0LAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsCisgICAgMTEsIDExLCAxMiwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTEsIDEyLCAxMiwgMTMsIDEzLAorICAgIDEyLCAxMywgMTMsIDEzLCAxNCwgMTIsCisgICAgMTIsIDEwLCAxMCwgMTMsIDEzLCAxMywKKyAgICAxNCwgMTQsIDEyLCAxMywgMTIsIDExLAorICAgIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsCisgICAgIDksICA5LCAgOSwgMTAsIDEwLCAxMSwKKyAgICAxMSwgMTIsIDEyLCAxMywgMTIsIDEzLAorICAgIDEzLCAxMywgMTIsIDEyLCAxMCwgMTAsCisgICAgMTIsIDEzLCAxMywgMTMsIDE0LCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTEsIDEwLAorICAgICA5LCAgOSwgIDksICA3LCAgOCwgIDgsCisgICAgIDksIDEwLCAxMSwgMTEsIDEyLCAxMiwKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEyLAorICAgIDEyLCAxMCwgMTAsIDEzLCAxMywgMTUsCisgICAgMTMsIDEzLCAxNCwgMTMsIDEyLCAxMiwKKyAgICAxMiwgMTAsIDEwLCAgOSwgIDgsICA4LAorICAgICA1LCAgNSwgIDcsICA5LCAxMCwgMTEsCisgICAgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxNCwgMTQsIDEyLCAxMiwgMTAsIDExLAorICAgIDEyLCAxMiwgMTQsIDE0LCAxMywgMTMsCisgICAgMTMsIDEzLCAxMiwgMTEsIDExLCAxMCwKKyAgICAgOSwgIDcsICA1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG9uMmF2Y19jYjE1X3N5bXNbT04yQVZDX0NCMTVfQ09ERVNdID0geworICAgIDB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgMHgwMDA0LCAweDAwMDUsCisgICAgMHgwMDA2LCAweDAwMDcsIDB4MDAwOCwgMHgwMDA5LCAweDAwMEEsIDB4MDAwQiwKKyAgICAweDAwMEMsIDB4MDAwRCwgMHgwMDBFLCAweDAwMEYsIDB4MDAxMCwgMHgwMEYwLAorICAgIDB4MDBGMSwgMHgwMEYyLCAweDAwRjMsIDB4MDBGNCwgMHgwMEY1LCAweDAwRjYsCisgICAgMHgwMEY3LCAweDAwRjgsIDB4MDBGOSwgMHgwMEZBLCAweDAwRkIsIDB4MDBGQywKKyAgICAweDAwRkQsIDB4MDBGRSwgMHgwMEZGLCAweDAxMDAsIDB4MDEwMSwgMHgwMTAyLAorICAgIDB4MDEwMywgMHgwMTA0LCAweDAxMDUsIDB4MDEwNiwgMHgwMTA3LCAweDAxMDgsCisgICAgMHgwMTA5LCAweDAxMEEsIDB4MDEwQiwgMHgwMTBDLCAweDAxMEQsIDB4MDEwRSwKKyAgICAweDAxMEYsIDB4MDExMCwgMHgwMUYwLCAweDAxRjEsIDB4MDFGMiwgMHgwMUYzLAorICAgIDB4MDFGNCwgMHgwMUY1LCAweDAxRjYsIDB4MDFGNywgMHgwMUY4LCAweDAxRjksCisgICAgMHgwMUZBLCAweDAxRkIsIDB4MDFGQywgMHgwMUZELCAweDAxRkUsIDB4MDFGRiwKKyAgICAweDAyMDAsIDB4MDIwMSwgMHgwMjAyLCAweDAyMDMsIDB4MDIwNCwgMHgwMjA1LAorICAgIDB4MDIwNiwgMHgwMjA3LCAweDAyMDgsIDB4MDIwOSwgMHgwMjBBLCAweDAyMEIsCisgICAgMHgwMjBDLCAweDAyMEQsIDB4MDIwRSwgMHgwMjBGLCAweDAyMTAsIDB4MDJGMCwKKyAgICAweDAyRjEsIDB4MDJGMiwgMHgwMkYzLCAweDAyRjQsIDB4MDJGNSwgMHgwMkY2LAorICAgIDB4MDJGNywgMHgwMkY4LCAweDAyRjksIDB4MDJGQSwgMHgwMkZCLCAweDAyRkMsCisgICAgMHgwMkZELCAweDAyRkUsIDB4MDJGRiwgMHgwMzAwLCAweDAzMDEsIDB4MDMwMiwKKyAgICAweDAzMDMsIDB4MDMwNCwgMHgwMzA1LCAweDAzMDYsIDB4MDMwNywgMHgwMzA4LAorICAgIDB4MDMwOSwgMHgwMzBBLCAweDAzMEIsIDB4MDMwQywgMHgwMzBELCAweDAzMEUsCisgICAgMHgwMzBGLCAweDAzMTAsIDB4MDNGMCwgMHgwM0YxLCAweDAzRjIsIDB4MDNGMywKKyAgICAweDAzRjQsIDB4MDNGNSwgMHgwM0Y2LCAweDAzRjcsIDB4MDNGOCwgMHgwM0Y5LAorICAgIDB4MDNGQSwgMHgwM0ZCLCAweDAzRkMsIDB4MDNGRCwgMHgwM0ZFLCAweDAzRkYsCisgICAgMHgwNDAwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwKKyAgICAweDA0MDYsIDB4MDQwNywgMHgwNDA4LCAweDA0MDksIDB4MDQwQSwgMHgwNDBCLAorICAgIDB4MDQwQywgMHgwNDBELCAweDA0MEUsIDB4MDQwRiwgMHgwNDEwLCAweDA0RjAsCisgICAgMHgwNEYxLCAweDA0RjIsIDB4MDRGMywgMHgwNEY0LCAweDA0RjUsIDB4MDRGNiwKKyAgICAweDA0RjcsIDB4MDRGOCwgMHgwNEY5LCAweDA0RkEsIDB4MDRGQiwgMHgwNEZDLAorICAgIDB4MDRGRCwgMHgwNEZFLCAweDA0RkYsIDB4MDUwMCwgMHgwNTAxLCAweDA1MDIsCisgICAgMHgwNTAzLCAweDA1MDQsIDB4MDUwNSwgMHgwNTA2LCAweDA1MDcsIDB4MDUwOCwKKyAgICAweDA1MDksIDB4MDUwQSwgMHgwNTBCLCAweDA1MEMsIDB4MDUwRCwgMHgwNTBFLAorICAgIDB4MDUwRiwgMHgwNTEwLCAweDA1RjAsIDB4MDVGMSwgMHgwNUYyLCAweDA1RjMsCisgICAgMHgwNUY0LCAweDA1RjUsIDB4MDVGNiwgMHgwNUY3LCAweDA1RjgsIDB4MDVGOSwKKyAgICAweDA1RkEsIDB4MDVGQiwgMHgwNUZDLCAweDA1RkQsIDB4MDVGRSwgMHgwNUZGLAorICAgIDB4MDYwMCwgMHgwNjAxLCAweDA2MDIsIDB4MDYwMywgMHgwNjA0LCAweDA2MDUsCisgICAgMHgwNjA2LCAweDA2MDcsIDB4MDYwOCwgMHgwNjA5LCAweDA2MEEsIDB4MDYwQiwKKyAgICAweDA2MEMsIDB4MDYwRCwgMHgwNjBFLCAweDA2MEYsIDB4MDYxMCwgMHgwNkYwLAorICAgIDB4MDZGMSwgMHgwNkYyLCAweDA2RjMsIDB4MDZGNCwgMHgwNkY1LCAweDA2RjYsCisgICAgMHgwNkY3LCAweDA2RjgsIDB4MDZGOSwgMHgwNkZBLCAweDA2RkIsIDB4MDZGQywKKyAgICAweDA2RkQsIDB4MDZGRSwgMHgwNkZGLCAweDA3MDAsIDB4MDcwMSwgMHgwNzAyLAorICAgIDB4MDcwMywgMHgwNzA0LCAweDA3MDUsIDB4MDcwNiwgMHgwNzA3LCAweDA3MDgsCisgICAgMHgwNzA5LCAweDA3MEEsIDB4MDcwQiwgMHgwNzBDLCAweDA3MEQsIDB4MDcwRSwKKyAgICAweDA3MEYsIDB4MDcxMCwgMHgwN0YwLCAweDA3RjEsIDB4MDdGMiwgMHgwN0YzLAorICAgIDB4MDdGNCwgMHgwN0Y1LCAweDA3RjYsIDB4MDdGNywgMHgwN0Y4LCAweDA3RjksCisgICAgMHgwN0ZBLCAweDA3RkIsIDB4MDdGQywgMHgwN0ZELCAweDA3RkUsIDB4MDdGRiwKKyAgICAweDA4MDAsIDB4MDgwMSwgMHgwODAyLCAweDA4MDMsIDB4MDgwNCwgMHgwODA1LAorICAgIDB4MDgwNiwgMHgwODA3LCAweDA4MDgsIDB4MDgwOSwgMHgwODBBLCAweDA4MEIsCisgICAgMHgwODBDLCAweDA4MEQsIDB4MDgwRSwgMHgwODBGLCAweDA4MTAsIDB4MDhGMCwKKyAgICAweDA4RjEsIDB4MDhGMiwgMHgwOEYzLCAweDA4RjQsIDB4MDhGNSwgMHgwOEY2LAorICAgIDB4MDhGNywgMHgwOEY4LCAweDA4RjksIDB4MDhGQSwgMHgwOEZCLCAweDA4RkMsCisgICAgMHgwOEZELCAweDA4RkUsIDB4MDhGRiwgMHgwOTAwLCAweDA5MDEsIDB4MDkwMiwKKyAgICAweDA5MDMsIDB4MDkwNCwgMHgwOTA1LCAweDA5MDYsIDB4MDkwNywgMHgwOTA4LAorICAgIDB4MDkwOSwgMHgwOTBBLCAweDA5MEIsIDB4MDkwQywgMHgwOTBELCAweDA5MEUsCisgICAgMHgwOTBGLCAweDA5MTAsIDB4MDlGMCwgMHgwOUYxLCAweDA5RjIsIDB4MDlGMywKKyAgICAweDA5RjQsIDB4MDlGNSwgMHgwOUY2LCAweDA5RjcsIDB4MDlGOCwgMHgwOUY5LAorICAgIDB4MDlGQSwgMHgwOUZCLCAweDA5RkMsIDB4MDlGRCwgMHgwOUZFLCAweDA5RkYsCisgICAgMHgwQTAwLCAweDBBMDEsIDB4MEEwMiwgMHgwQTAzLCAweDBBMDQsIDB4MEEwNSwKKyAgICAweDBBMDYsIDB4MEEwNywgMHgwQTA4LCAweDBBMDksIDB4MEEwQSwgMHgwQTBCLAorICAgIDB4MEEwQywgMHgwQTBELCAweDBBMEUsIDB4MEEwRiwgMHgwQTEwLCAweDBBRjAsCisgICAgMHgwQUYxLCAweDBBRjIsIDB4MEFGMywgMHgwQUY0LCAweDBBRjUsIDB4MEFGNiwKKyAgICAweDBBRjcsIDB4MEFGOCwgMHgwQUY5LCAweDBBRkEsIDB4MEFGQiwgMHgwQUZDLAorICAgIDB4MEFGRCwgMHgwQUZFLCAweDBBRkYsIDB4MEIwMCwgMHgwQjAxLCAweDBCMDIsCisgICAgMHgwQjAzLCAweDBCMDQsIDB4MEIwNSwgMHgwQjA2LCAweDBCMDcsIDB4MEIwOCwKKyAgICAweDBCMDksIDB4MEIwQSwgMHgwQjBCLCAweDBCMEMsIDB4MEIwRCwgMHgwQjBFLAorICAgIDB4MEIwRiwgMHgwQjEwLCAweDBCRjAsIDB4MEJGMSwgMHgwQkYyLCAweDBCRjMsCisgICAgMHgwQkY0LCAweDBCRjUsIDB4MEJGNiwgMHgwQkY3LCAweDBCRjgsIDB4MEJGOSwKKyAgICAweDBCRkEsIDB4MEJGQiwgMHgwQkZDLCAweDBCRkQsIDB4MEJGRSwgMHgwQkZGLAorICAgIDB4MEMwMCwgMHgwQzAxLCAweDBDMDIsIDB4MEMwMywgMHgwQzA0LCAweDBDMDUsCisgICAgMHgwQzA2LCAweDBDMDcsIDB4MEMwOCwgMHgwQzA5LCAweDBDMEEsIDB4MEMwQiwKKyAgICAweDBDMEMsIDB4MEMwRCwgMHgwQzBFLCAweDBDMEYsIDB4MEMxMCwgMHgwQ0YwLAorICAgIDB4MENGMSwgMHgwQ0YyLCAweDBDRjMsIDB4MENGNCwgMHgwQ0Y1LCAweDBDRjYsCisgICAgMHgwQ0Y3LCAweDBDRjgsIDB4MENGOSwgMHgwQ0ZBLCAweDBDRkIsIDB4MENGQywKKyAgICAweDBDRkQsIDB4MENGRSwgMHgwQ0ZGLCAweDBEMDAsIDB4MEQwMSwgMHgwRDAyLAorICAgIDB4MEQwMywgMHgwRDA0LCAweDBEMDUsIDB4MEQwNiwgMHgwRDA3LCAweDBEMDgsCisgICAgMHgwRDA5LCAweDBEMEEsIDB4MEQwQiwgMHgwRDBDLCAweDBEMEQsIDB4MEQwRSwKKyAgICAweDBEMEYsIDB4MEQxMCwgMHgwREYwLCAweDBERjEsIDB4MERGMiwgMHgwREYzLAorICAgIDB4MERGNCwgMHgwREY1LCAweDBERjYsIDB4MERGNywgMHgwREY4LCAweDBERjksCisgICAgMHgwREZBLCAweDBERkIsIDB4MERGQywgMHgwREZELCAweDBERkUsIDB4MERGRiwKKyAgICAweDBFMDAsIDB4MEUwMSwgMHgwRTAyLCAweDBFMDMsIDB4MEUwNCwgMHgwRTA1LAorICAgIDB4MEUwNiwgMHgwRTA3LCAweDBFMDgsIDB4MEUwOSwgMHgwRTBBLCAweDBFMEIsCisgICAgMHgwRTBDLCAweDBFMEQsIDB4MEUwRSwgMHgwRTBGLCAweDBFMTAsIDB4MEVGMCwKKyAgICAweDBFRjEsIDB4MEVGMiwgMHgwRUYzLCAweDBFRjQsIDB4MEVGNSwgMHgwRUY2LAorICAgIDB4MEVGNywgMHgwRUY4LCAweDBFRjksIDB4MEVGQSwgMHgwRUZCLCAweDBFRkMsCisgICAgMHgwRUZELCAweDBFRkUsIDB4MEVGRiwgMHgwRjAwLCAweDBGMDEsIDB4MEYwMiwKKyAgICAweDBGMDMsIDB4MEYwNCwgMHgwRjA1LCAweDBGMDYsIDB4MEYwNywgMHgwRjA4LAorICAgIDB4MEYwOSwgMHgwRjBBLCAweDBGMEIsIDB4MEYwQywgMHgwRjBELCAweDBGMEUsCisgICAgMHgwRjBGLCAweDBGMTAsIDB4MEZGMCwgMHgwRkYxLCAweDBGRjIsIDB4MEZGMywKKyAgICAweDBGRjQsIDB4MEZGNSwgMHgwRkY2LCAweDBGRjcsIDB4MEZGOCwgMHgwRkY5LAorICAgIDB4MEZGQSwgMHgwRkZCLCAweDBGRkMsIDB4MEZGRCwgMHgwRkZFLCAweDBGRkYsCisgICAgMHgxMDAwLCAweDEwMDEsIDB4MTAwMiwgMHgxMDAzLCAweDEwMDQsIDB4MTAwNSwKKyAgICAweDEwMDYsIDB4MTAwNywgMHgxMDA4LCAweDEwMDksIDB4MTAwQSwgMHgxMDBCLAorICAgIDB4MTAwQywgMHgxMDBELCAweDEwMEUsIDB4MTAwRiwgMHgxMDEwLCAweDEwRjAsCisgICAgMHgxMEYxLCAweDEwRjIsIDB4MTBGMywgMHgxMEY0LCAweDEwRjUsIDB4MTBGNiwKKyAgICAweDEwRjcsIDB4MTBGOCwgMHgxMEY5LCAweDEwRkEsIDB4MTBGQiwgMHgxMEZDLAorICAgIDB4MTBGRCwgMHgxMEZFLCAweDEwRkYsIDB4RjAwMCwgMHhGMDAxLCAweEYwMDIsCisgICAgMHhGMDAzLCAweEYwMDQsIDB4RjAwNSwgMHhGMDA2LCAweEYwMDcsIDB4RjAwOCwKKyAgICAweEYwMDksIDB4RjAwQSwgMHhGMDBCLCAweEYwMEMsIDB4RjAwRCwgMHhGMDBFLAorICAgIDB4RjAwRiwgMHhGMDEwLCAweEYwRjAsIDB4RjBGMSwgMHhGMEYyLCAweEYwRjMsCisgICAgMHhGMEY0LCAweEYwRjUsIDB4RjBGNiwgMHhGMEY3LCAweEYwRjgsIDB4RjBGOSwKKyAgICAweEYwRkEsIDB4RjBGQiwgMHhGMEZDLCAweEYwRkQsIDB4RjBGRSwgMHhGMEZGLAorICAgIDB4RjEwMCwgMHhGMTAxLCAweEYxMDIsIDB4RjEwMywgMHhGMTA0LCAweEYxMDUsCisgICAgMHhGMTA2LCAweEYxMDcsIDB4RjEwOCwgMHhGMTA5LCAweEYxMEEsIDB4RjEwQiwKKyAgICAweEYxMEMsIDB4RjEwRCwgMHhGMTBFLCAweEYxMEYsIDB4RjExMCwgMHhGMUYwLAorICAgIDB4RjFGMSwgMHhGMUYyLCAweEYxRjMsIDB4RjFGNCwgMHhGMUY1LCAweEYxRjYsCisgICAgMHhGMUY3LCAweEYxRjgsIDB4RjFGOSwgMHhGMUZBLCAweEYxRkIsIDB4RjFGQywKKyAgICAweEYxRkQsIDB4RjFGRSwgMHhGMUZGLCAweEYyMDAsIDB4RjIwMSwgMHhGMjAyLAorICAgIDB4RjIwMywgMHhGMjA0LCAweEYyMDUsIDB4RjIwNiwgMHhGMjA3LCAweEYyMDgsCisgICAgMHhGMjA5LCAweEYyMEEsIDB4RjIwQiwgMHhGMjBDLCAweEYyMEQsIDB4RjIwRSwKKyAgICAweEYyMEYsIDB4RjIxMCwgMHhGMkYwLCAweEYyRjEsIDB4RjJGMiwgMHhGMkYzLAorICAgIDB4RjJGNCwgMHhGMkY1LCAweEYyRjYsIDB4RjJGNywgMHhGMkY4LCAweEYyRjksCisgICAgMHhGMkZBLCAweEYyRkIsIDB4RjJGQywgMHhGMkZELCAweEYyRkUsIDB4RjJGRiwKKyAgICAweEYzMDAsIDB4RjMwMSwgMHhGMzAyLCAweEYzMDMsIDB4RjMwNCwgMHhGMzA1LAorICAgIDB4RjMwNiwgMHhGMzA3LCAweEYzMDgsIDB4RjMwOSwgMHhGMzBBLCAweEYzMEIsCisgICAgMHhGMzBDLCAweEYzMEQsIDB4RjMwRSwgMHhGMzBGLCAweEYzMTAsIDB4RjNGMCwKKyAgICAweEYzRjEsIDB4RjNGMiwgMHhGM0YzLCAweEYzRjQsIDB4RjNGNSwgMHhGM0Y2LAorICAgIDB4RjNGNywgMHhGM0Y4LCAweEYzRjksIDB4RjNGQSwgMHhGM0ZCLCAweEYzRkMsCisgICAgMHhGM0ZELCAweEYzRkUsIDB4RjNGRiwgMHhGNDAwLCAweEY0MDEsIDB4RjQwMiwKKyAgICAweEY0MDMsIDB4RjQwNCwgMHhGNDA1LCAweEY0MDYsIDB4RjQwNywgMHhGNDA4LAorICAgIDB4RjQwOSwgMHhGNDBBLCAweEY0MEIsIDB4RjQwQywgMHhGNDBELCAweEY0MEUsCisgICAgMHhGNDBGLCAweEY0MTAsIDB4RjRGMCwgMHhGNEYxLCAweEY0RjIsIDB4RjRGMywKKyAgICAweEY0RjQsIDB4RjRGNSwgMHhGNEY2LCAweEY0RjcsIDB4RjRGOCwgMHhGNEY5LAorICAgIDB4RjRGQSwgMHhGNEZCLCAweEY0RkMsIDB4RjRGRCwgMHhGNEZFLCAweEY0RkYsCisgICAgMHhGNTAwLCAweEY1MDEsIDB4RjUwMiwgMHhGNTAzLCAweEY1MDQsIDB4RjUwNSwKKyAgICAweEY1MDYsIDB4RjUwNywgMHhGNTA4LCAweEY1MDksIDB4RjUwQSwgMHhGNTBCLAorICAgIDB4RjUwQywgMHhGNTBELCAweEY1MEUsIDB4RjUwRiwgMHhGNTEwLCAweEY1RjAsCisgICAgMHhGNUYxLCAweEY1RjIsIDB4RjVGMywgMHhGNUY0LCAweEY1RjUsIDB4RjVGNiwKKyAgICAweEY1RjcsIDB4RjVGOCwgMHhGNUY5LCAweEY1RkEsIDB4RjVGQiwgMHhGNUZDLAorICAgIDB4RjVGRCwgMHhGNUZFLCAweEY1RkYsIDB4RjYwMCwgMHhGNjAxLCAweEY2MDIsCisgICAgMHhGNjAzLCAweEY2MDQsIDB4RjYwNSwgMHhGNjA2LCAweEY2MDcsIDB4RjYwOCwKKyAgICAweEY2MDksIDB4RjYwQSwgMHhGNjBCLCAweEY2MEMsIDB4RjYwRCwgMHhGNjBFLAorICAgIDB4RjYwRiwgMHhGNjEwLCAweEY2RjAsIDB4RjZGMSwgMHhGNkYyLCAweEY2RjMsCisgICAgMHhGNkY0LCAweEY2RjUsIDB4RjZGNiwgMHhGNkY3LCAweEY2RjgsIDB4RjZGOSwKKyAgICAweEY2RkEsIDB4RjZGQiwgMHhGNkZDLCAweEY2RkQsIDB4RjZGRSwgMHhGNkZGLAorICAgIDB4RjcwMCwgMHhGNzAxLCAweEY3MDIsIDB4RjcwMywgMHhGNzA0LCAweEY3MDUsCisgICAgMHhGNzA2LCAweEY3MDcsIDB4RjcwOCwgMHhGNzA5LCAweEY3MEEsIDB4RjcwQiwKKyAgICAweEY3MEMsIDB4RjcwRCwgMHhGNzBFLCAweEY3MEYsIDB4RjcxMCwgMHhGN0YwLAorICAgIDB4RjdGMSwgMHhGN0YyLCAweEY3RjMsIDB4RjdGNCwgMHhGN0Y1LCAweEY3RjYsCisgICAgMHhGN0Y3LCAweEY3RjgsIDB4RjdGOSwgMHhGN0ZBLCAweEY3RkIsIDB4RjdGQywKKyAgICAweEY3RkQsIDB4RjdGRSwgMHhGN0ZGLCAweEY4MDAsIDB4RjgwMSwgMHhGODAyLAorICAgIDB4RjgwMywgMHhGODA0LCAweEY4MDUsIDB4RjgwNiwgMHhGODA3LCAweEY4MDgsCisgICAgMHhGODA5LCAweEY4MEEsIDB4RjgwQiwgMHhGODBDLCAweEY4MEQsIDB4RjgwRSwKKyAgICAweEY4MEYsIDB4RjgxMCwgMHhGOEYwLCAweEY4RjEsIDB4RjhGMiwgMHhGOEYzLAorICAgIDB4RjhGNCwgMHhGOEY1LCAweEY4RjYsIDB4RjhGNywgMHhGOEY4LCAweEY4RjksCisgICAgMHhGOEZBLCAweEY4RkIsIDB4RjhGQywgMHhGOEZELCAweEY4RkUsIDB4RjhGRiwKKyAgICAweEY5MDAsIDB4RjkwMSwgMHhGOTAyLCAweEY5MDMsIDB4RjkwNCwgMHhGOTA1LAorICAgIDB4RjkwNiwgMHhGOTA3LCAweEY5MDgsIDB4RjkwOSwgMHhGOTBBLCAweEY5MEIsCisgICAgMHhGOTBDLCAweEY5MEQsIDB4RjkwRSwgMHhGOTBGLCAweEY5MTAsIDB4RjlGMCwKKyAgICAweEY5RjEsIDB4RjlGMiwgMHhGOUYzLCAweEY5RjQsIDB4RjlGNSwgMHhGOUY2LAorICAgIDB4RjlGNywgMHhGOUY4LCAweEY5RjksIDB4RjlGQSwgMHhGOUZCLCAweEY5RkMsCisgICAgMHhGOUZELCAweEY5RkUsIDB4RjlGRiwgMHhGQTAwLCAweEZBMDEsIDB4RkEwMiwKKyAgICAweEZBMDMsIDB4RkEwNCwgMHhGQTA1LCAweEZBMDYsIDB4RkEwNywgMHhGQTA4LAorICAgIDB4RkEwOSwgMHhGQTBBLCAweEZBMEIsIDB4RkEwQywgMHhGQTBELCAweEZBMEUsCisgICAgMHhGQTBGLCAweEZBMTAsIDB4RkFGMCwgMHhGQUYxLCAweEZBRjIsIDB4RkFGMywKKyAgICAweEZBRjQsIDB4RkFGNSwgMHhGQUY2LCAweEZBRjcsIDB4RkFGOCwgMHhGQUY5LAorICAgIDB4RkFGQSwgMHhGQUZCLCAweEZBRkMsIDB4RkFGRCwgMHhGQUZFLCAweEZBRkYsCisgICAgMHhGQjAwLCAweEZCMDEsIDB4RkIwMiwgMHhGQjAzLCAweEZCMDQsIDB4RkIwNSwKKyAgICAweEZCMDYsIDB4RkIwNywgMHhGQjA4LCAweEZCMDksIDB4RkIwQSwgMHhGQjBCLAorICAgIDB4RkIwQywgMHhGQjBELCAweEZCMEUsIDB4RkIwRiwgMHhGQjEwLCAweEZCRjAsCisgICAgMHhGQkYxLCAweEZCRjIsIDB4RkJGMywgMHhGQkY0LCAweEZCRjUsIDB4RkJGNiwKKyAgICAweEZCRjcsIDB4RkJGOCwgMHhGQkY5LCAweEZCRkEsIDB4RkJGQiwgMHhGQkZDLAorICAgIDB4RkJGRCwgMHhGQkZFLCAweEZCRkYsIDB4RkMwMCwgMHhGQzAxLCAweEZDMDIsCisgICAgMHhGQzAzLCAweEZDMDQsIDB4RkMwNSwgMHhGQzA2LCAweEZDMDcsIDB4RkMwOCwKKyAgICAweEZDMDksIDB4RkMwQSwgMHhGQzBCLCAweEZDMEMsIDB4RkMwRCwgMHhGQzBFLAorICAgIDB4RkMwRiwgMHhGQzEwLCAweEZDRjAsIDB4RkNGMSwgMHhGQ0YyLCAweEZDRjMsCisgICAgMHhGQ0Y0LCAweEZDRjUsIDB4RkNGNiwgMHhGQ0Y3LCAweEZDRjgsIDB4RkNGOSwKKyAgICAweEZDRkEsIDB4RkNGQiwgMHhGQ0ZDLCAweEZDRkQsIDB4RkNGRSwgMHhGQ0ZGLAorICAgIDB4RkQwMCwgMHhGRDAxLCAweEZEMDIsIDB4RkQwMywgMHhGRDA0LCAweEZEMDUsCisgICAgMHhGRDA2LCAweEZEMDcsIDB4RkQwOCwgMHhGRDA5LCAweEZEMEEsIDB4RkQwQiwKKyAgICAweEZEMEMsIDB4RkQwRCwgMHhGRDBFLCAweEZEMEYsIDB4RkQxMCwgMHhGREYwLAorICAgIDB4RkRGMSwgMHhGREYyLCAweEZERjMsIDB4RkRGNCwgMHhGREY1LCAweEZERjYsCisgICAgMHhGREY3LCAweEZERjgsIDB4RkRGOSwgMHhGREZBLCAweEZERkIsIDB4RkRGQywKKyAgICAweEZERkQsIDB4RkRGRSwgMHhGREZGLCAweEZFMDAsIDB4RkUwMSwgMHhGRTAyLAorICAgIDB4RkUwMywgMHhGRTA0LCAweEZFMDUsIDB4RkUwNiwgMHhGRTA3LCAweEZFMDgsCisgICAgMHhGRTA5LCAweEZFMEEsIDB4RkUwQiwgMHhGRTBDLCAweEZFMEQsIDB4RkUwRSwKKyAgICAweEZFMEYsIDB4RkUxMCwgMHhGRUYwLCAweEZFRjEsIDB4RkVGMiwgMHhGRUYzLAorICAgIDB4RkVGNCwgMHhGRUY1LCAweEZFRjYsIDB4RkVGNywgMHhGRUY4LCAweEZFRjksCisgICAgMHhGRUZBLCAweEZFRkIsIDB4RkVGQywgMHhGRUZELCAweEZFRkUsIDB4RkVGRiwKKyAgICAweEZGMDAsIDB4RkYwMSwgMHhGRjAyLCAweEZGMDMsIDB4RkYwNCwgMHhGRjA1LAorICAgIDB4RkYwNiwgMHhGRjA3LCAweEZGMDgsIDB4RkYwOSwgMHhGRjBBLCAweEZGMEIsCisgICAgMHhGRjBDLCAweEZGMEQsIDB4RkYwRSwgMHhGRjBGLCAweEZGMTAsIDB4RkZGMCwKKyAgICAweEZGRjEsIDB4RkZGMiwgMHhGRkYzLCAweEZGRjQsIDB4RkZGNSwgMHhGRkY2LAorICAgIDB4RkZGNywgMHhGRkY4LCAweEZGRjksIDB4RkZGQSwgMHhGRkZCLCAweEZGRkMsCisgICAgMHhGRkZELCAweEZGRkUsIDB4RkZGRiwKK307CisKK2NvbnN0IHVpbnQzMl90ICogY29uc3QgZmZfb24yYXZjX3F1YWRfY2JfY29kZXNbXSA9IHsKKyAgICBvbjJhdmNfY2IxX2NvZGVzLCBvbjJhdmNfY2IyX2NvZGVzLCBvbjJhdmNfY2IzX2NvZGVzLCBvbjJhdmNfY2I0X2NvZGVzLAorICAgIG9uMmF2Y19jYjVfY29kZXMsIG9uMmF2Y19jYjZfY29kZXMsIG9uMmF2Y19jYjdfY29kZXMsIG9uMmF2Y19jYjhfY29kZXMKK307CisKK2NvbnN0IHVpbnQ4X3QgKiBjb25zdCBmZl9vbjJhdmNfcXVhZF9jYl9iaXRzW10gPSB7CisgICAgb24yYXZjX2NiMV9iaXRzLCBvbjJhdmNfY2IyX2JpdHMsIG9uMmF2Y19jYjNfYml0cywgb24yYXZjX2NiNF9iaXRzLAorICAgIG9uMmF2Y19jYjVfYml0cywgb24yYXZjX2NiNl9iaXRzLCBvbjJhdmNfY2I3X2JpdHMsIG9uMmF2Y19jYjhfYml0cworfTsKKworY29uc3QgdWludDE2X3QgKiBjb25zdCBmZl9vbjJhdmNfcXVhZF9jYl9zeW1zW10gPSB7CisgICAgb24yYXZjX2NiMV9zeW1zLCBvbjJhdmNfY2IyX3N5bXMsIG9uMmF2Y19jYjNfc3ltcywgb24yYXZjX2NiNF9zeW1zLAorICAgIG9uMmF2Y19jYjVfc3ltcywgb24yYXZjX2NiNl9zeW1zLCBvbjJhdmNfY2I3X3N5bXMsIG9uMmF2Y19jYjhfc3ltcworfTsKKworY29uc3QgaW50IGZmX29uMmF2Y19xdWFkX2NiX2VsZW1zW10gPSB7CisgICAgT04yQVZDX0NCMV9DT0RFUywgT04yQVZDX0NCMl9DT0RFUywgT04yQVZDX0NCM19DT0RFUywgT04yQVZDX0NCNF9DT0RFUywKKyAgICBPTjJBVkNfQ0I1X0NPREVTLCBPTjJBVkNfQ0I2X0NPREVTLCBPTjJBVkNfQ0I3X0NPREVTLCBPTjJBVkNfQ0I4X0NPREVTLAorfTsKKworY29uc3QgdWludDE2X3QgKiBjb25zdCBmZl9vbjJhdmNfcGFpcl9jYl9jb2Rlc1tdID0geworICAgIG9uMmF2Y19jYjlfY29kZXMsICBvbjJhdmNfY2IxMF9jb2Rlcywgb24yYXZjX2NiMTFfY29kZXMsIG9uMmF2Y19jYjEyX2NvZGVzLAorICAgIG9uMmF2Y19jYjEzX2NvZGVzLCBvbjJhdmNfY2IxNF9jb2Rlcywgb24yYXZjX2NiMTVfY29kZXMKK307CisKK2NvbnN0IHVpbnQ4X3QgKiBjb25zdCBmZl9vbjJhdmNfcGFpcl9jYl9iaXRzW10gPSB7CisgICAgb24yYXZjX2NiOV9iaXRzLCAgb24yYXZjX2NiMTBfYml0cywgb24yYXZjX2NiMTFfYml0cywgb24yYXZjX2NiMTJfYml0cywKKyAgICBvbjJhdmNfY2IxM19iaXRzLCBvbjJhdmNfY2IxNF9iaXRzLCBvbjJhdmNfY2IxNV9iaXRzCit9OworCitjb25zdCB1aW50MTZfdCAqIGNvbnN0IGZmX29uMmF2Y19wYWlyX2NiX3N5bXNbXSA9IHsKKyAgICBvbjJhdmNfY2I5X3N5bXMsICBvbjJhdmNfY2IxMF9zeW1zLCBvbjJhdmNfY2IxMV9zeW1zLCBvbjJhdmNfY2IxMl9zeW1zLAorICAgIG9uMmF2Y19jYjEzX3N5bXMsIG9uMmF2Y19jYjE0X3N5bXMsIG9uMmF2Y19jYjE1X3N5bXMKK307CisKK2NvbnN0IGludCBmZl9vbjJhdmNfcGFpcl9jYl9lbGVtc1tdID0geworICAgIE9OMkFWQ19DQjlfQ09ERVMsICBPTjJBVkNfQ0IxMF9DT0RFUywgT04yQVZDX0NCMTFfQ09ERVMsIE9OMkFWQ19DQjEyX0NPREVTLAorICAgIE9OMkFWQ19DQjEzX0NPREVTLCBPTjJBVkNfQ0IxNF9DT0RFUywgT04yQVZDX0NCMTVfQ09ERVMsCit9OworCitjb25zdCBmbG9hdCBmZl9vbjJhdmNfd2luZG93X2xvbmdfMzIwMDBbMTAyNF0gPSB7CisgICAgMC4wMDA3NjY5OTAzLCAwLjAwMjMwMDk2OTEsIDAuMDAzODM0OTQyNiwgMC4wMDUzNjg5MDcsCisgICAgMC4wMDY5MDI4NTg2LCAwLjAwODQzNjc5NDQsIDAuMDA5OTcwNzA5NywgMC4wMTE1MDQ2MDIsCisgICAgMC4wMTMwMzg0NjcsICAwLjAxNDU3MjMwMiwgIDAuMDE2MTA2MTAzLCAgMC4wMTc2Mzk4NjQsCisgICAgMC4wMTkxNzM1ODUsICAwLjAyMDcwNzI2MSwgIDAuMDIyMjQwODg2LCAgMC4wMjM3NzQ0NjIsCisgICAgMC4wMjUzMDc5ODEsICAwLjAyNjg0MTQzOSwgIDAuMDI4Mzc0ODM2LCAgMC4wMjk5MDgxNjUsCisgICAgMC4wMzE0NDE0MjQsICAwLjAzMjk3NDYwOCwgIDAuMDM0NTA3NzE0LCAgMC4wMzYwNDA3NDIsCisgICAgMC4wMzc1NzM2ODQsICAwLjAzOTEwNjUzNywgIDAuMDQwNjM5Mjk2LCAgMC4wNDIxNzE5NjMsCisgICAgMC4wNDM3MDQ1MjgsICAwLjA0NTIzNjk5LCAgIDAuMDQ2NzY5MzQ3LCAgMC4wNDgzMDE1OTIsCisgICAgMC4wNDk4MzM3MjYsICAwLjA1MTM2NTc0MSwgIDAuMDUyODk3NjM2LCAgMC4wNTQ0Mjk0MDgsCisgICAgMC4wNTU5NjEwNSwgICAwLjA1NzQ5MjU2MiwgIDAuMDU5MDIzOTM1LCAgMC4wNjA1NTUxNzEsCisgICAgMC4wNjIwODYyNjYsICAwLjA2MzYxNzIxNSwgIDAuMDY1MTQ4MDExLCAgMC4wNjY2Nzg2NTgsCisgICAgMC4wNjgyMDkxNDEsICAwLjA2OTczOTQ2OCwgIDAuMDcxMjY5NjMxLCAgMC4wNzI3OTk2MywKKyAgICAwLjA3NDMyOTQ1MSwgIDAuMDc1ODU5MSwgICAgMC4wNzczODg1NzcsICAwLjA3ODkxNzg2MSwKKyAgICAwLjA4MDQ0Njk2NiwgIDAuMDgxOTc1ODc3LCAgMC4wODM1MDQ2MDIsICAwLjA4NTAzMzEyNiwKKyAgICAwLjA4NjU2MTQ0OSwgIDAuMDg4MDg5NTcsICAgMC4wODk2MTc0ODMsICAwLjA5MTE0NTE4OCwKKyAgICAwLjA5MjY3MjY3NiwgIDAuMDk0MTk5OTQxLCAgMC4wOTU3MjY5ODksICAwLjA5NzI1MzgxNCwKKyAgICAwLjA5ODc4MDQwOSwgIDAuMTAwMzA2NzcsICAgMC4xMDE4MzI5LCAgICAwLjEwMzM1ODc4LAorICAgIDAuMTA0ODg0NDIsICAgMC4xMDY0MDk4MiwgICAwLjEwNzkzNDk3LCAgIDAuMTA5NDU5ODYsCisgICAgMC4xMTA5ODQ0OSwgICAwLjExMjUwODg2LCAgIDAuMTE0MDMyOTcsICAgMC4xMTU1NTY4MSwKKyAgICAwLjExNzA4MDM4LCAgIDAuMTE4NjAzNjcsICAgMC4xMjAxMjY2OSwgICAwLjEyMTY0OTQyLAorICAgIDAuMTIzMTcxODYsICAgMC4xMjQ2OTQwMiwgICAwLjEyNjIxNTg4LCAgIDAuMTI3NzM3NDMsCisgICAgMC4xMjkyNTg3MSwgICAwLjEzMDc3OTY1LCAgIDAuMTMyMzAwMzIsICAgMC4xMzM4MjA2NSwKKyAgICAwLjEzNTM0MDY4LCAgIDAuMTM2ODYwMzksICAgMC4xMzgzNzk3NywgICAwLjEzOTg5ODg0LAorICAgIDAuMTQxNDE3NTYsICAgMC4xNDI5MzU5NiwgICAwLjE0NDQ1NDAyLCAgIDAuMTQ1OTcxNzUsCisgICAgMC4xNDc0ODkxMiwgICAwLjE0OTAwNjE0LCAgIDAuMTUwNTIyODMsICAgMC4xNTIwMzkxNiwKKyAgICAwLjE1MzU1NTEyLCAgIDAuMTU1MDcwNzQsICAgMC4xNTY1ODU5OCwgICAwLjE1ODEwMDg0LAorICAgIDAuMTU5NjE1MzUsICAgMC4xNjExMjk0NywgICAwLjE2MjY0MzIyLCAgIDAuMTY0MTU2NTksCisgICAgMC4xNjU2Njk1NiwgICAwLjE2NzE4MjE1LCAgIDAuMTY4Njk0MzUsICAgMC4xNzAyMDYxNCwKKyAgICAwLjE3MTcxNzU0LCAgIDAuMTczMjI4NTMsICAgMC4xNzQ3MzkxMSwgICAwLjE3NjI0OTMsCisgICAgMC4xNzc3NTkwNSwgICAwLjE3OTI2ODM5LCAgIDAuMTgwNzc3MzEsICAgMC4xODIyODU4LAorICAgIDAuMTgzNzkzODcsICAgMC4xODUzMDE1LCAgICAwLjE4NjgwODcxLCAgIDAuMTg4MzE1NDUsCisgICAgMC4xODk4MjE3NiwgICAwLjE5MTMyNzYzLCAgIDAuMTkyODMzMDUsICAgMC4xOTQzMzgwMSwKKyAgICAwLjE5NTg0MjUyLCAgIDAuMTk3MzQ2NTUsICAgMC4xOTg4NTAxNCwgICAwLjIwMDM1MzI2LAorICAgIDAuMjAxODU1OSwgICAgMC4yMDMzNTgwNSwgICAwLjIwNDg1OTc1LCAgIDAuMjA2MzYwOTcsCisgICAgMC4yMDc4NjE2OCwgICAwLjIwOTM2MTkxLCAgIDAuMjEwODYxNjQsICAgMC4yMTIzNjA4OSwKKyAgICAwLjIxMzg1OTYzLCAgIDAuMjE1MzU3ODcsICAgMC4yMTY4NTU2LCAgICAwLjIxODM1MjgyLAorICAgIDAuMjE5ODQ5NTMsICAgMC4yMjEzNDU3MiwgICAwLjIyMjg0MTQsICAgIDAuMjI0MzM2NTMsCisgICAgMC4yMjU4MzExNSwgICAwLjIyNzMyNTI1LCAgIDAuMjI4ODE4NzksICAgMC4yMzAzMTE4LAorICAgIDAuMjMxODA0MjgsICAgMC4yMzMyOTYyLCAgICAwLjIzNDc4NzU4LCAgIDAuMjM2Mjc4NCwKKyAgICAwLjIzNzc2ODY2LCAgIDAuMjM5MjU4MzgsICAgMC4yNDA3NDc1MywgICAwLjI0MjIzNjA5LAorICAgIDAuMjQzNzI0MTEsICAgMC4yNDUyMTE1NiwgICAwLjI0NjY5ODQxLCAgIDAuMjQ4MTg0NywKKyAgICAwLjI0OTY3MDM5LCAgIDAuMjUxMTU1NSwgICAgMC4yNTI2NDAwMSwgICAwLjI1NDEyMzkzLAorICAgIDAuMjU1NjA3MjUsICAgMC4yNTcwODk5NywgICAwLjI1ODU3MjA3LCAgIDAuMjYwMDUzNiwKKyAgICAwLjI2MTUzNDQ4LCAgIDAuMjYzMDE0NzYsICAgMC4yNjQ0OTQ0MiwgICAwLjI2NTk3MzQ4LAorICAgIDAuMjY3NDUxODgsICAgMC4yNjg5Mjk2NiwgICAwLjI3MDQwNjgxLCAgIDAuMjcxODgzMzQsCisgICAgMC4yNzMzNTkyMSwgICAwLjI3NDgzNDQ1LCAgIDAuMjc2MzA5MDQsICAgMC4yNzc3ODI5OCwKKyAgICAwLjI3OTI1NjI1LCAgIDAuMjgwNzI4ODgsICAgMC4yODIyMDA4NCwgICAwLjI4MzY3MjE1LAorICAgIDAuMjg1MTQyNzgsICAgMC4yODY2MTI3MiwgICAwLjI4ODA4MjAzLCAgIDAuMjg5NTUwNjMsCisgICAgMC4yOTEwMTg1NSwgICAwLjI5MjQ4NTgsICAgIDAuMjkzOTUyMzUsICAgMC4yOTU0MTgyMywKKyAgICAwLjI5Njg4MzQsICAgIDAuMjk4MzQ3ODYsICAgMC4yOTk4MTE2MywgICAwLjMwMTI3NDY5LAorICAgIDAuMzAyNzM3MDMsICAgMC4zMDQxOTg2OCwgICAwLjMwNTY1OTU5LCAgIDAuMzA3MTE5ODIsCisgICAgMC4zMDg1NzkzLCAgICAwLjMxMDAzODA2LCAgIDAuMzExNDk2MDgsICAgMC4zMTI5NTMzOCwKKyAgICAwLjMxNDQwOTk0LCAgIDAuMzE1ODY1NzYsICAgMC4zMTczMjA4MiwgICAwLjMxODc3NTE1LAorICAgIDAuMzIwMjI4NzMsICAgMC4zMjE2ODE1NiwgICAwLjMyMzEzMzYyLCAgIDAuMzI0NTg0OTMsCisgICAgMC4zMjYwMzU0NywgICAwLjMyNzQ4NTIzLCAgIDAuMzI4OTM0MjUsICAgMC4zMzAzODI0NywKKyAgICAwLjMzMTgyOTk0LCAgIDAuMzMzMjc2NiwgICAgMC4zMzQ3MjI0OSwgICAwLjMzNjE2NzYsCisgICAgMC4zMzc2MTE5MSwgICAwLjMzOTA1NTQyLCAgIDAuMzQwNDk4MTUsICAgMC4zNDE5NDAwNSwKKyAgICAwLjM0MzM4MTE3LCAgIDAuMzQ0ODIxNDgsICAgMC4zNDYyNjA5NiwgICAwLjM0NzY5OTY0LAorICAgIDAuMzQ5MTM3NTEsICAgMC4zNTA1NzQ1NSwgICAwLjM1MjAxMDc2LCAgIDAuMzUzNDQ2MTMsCisgICAgMC4zNTQ4ODA2OSwgICAwLjM1NjMxNDQyLCAgIDAuMzU3NzQ3MjksICAgMC4zNTkxNzkzMiwKKyAgICAwLjM2MDYxMDU0LCAgIDAuMzYyMDQwODgsICAgMC4zNjM0NzAzNSwgICAwLjM2NDg5OTAxLAorICAgIDAuMzY2MzI2NzgsICAgMC4zNjc3NTM3MSwgICAwLjM2OTE3OTc2LCAgIDAuMzcwNjA0OTMsCisgICAgMC4zNzIwMjkyNCwgICAwLjM3MzQ1MjY2LCAgIDAuMzc0ODc1MjIsICAgMC4zNzYyOTY5MSwKKyAgICAwLjM3NzcxNzcsICAgIDAuMzc5MTM3NTgsICAgMC4zODA1NTY2MSwgICAwLjM4MTk3NDcsCisgICAgMC4zODMzOTE5MiwgICAwLjM4NDgwODI0LCAgIDAuMzg2MjIzNjQsICAgMC4zODc2MzgxNSwKKyAgICAwLjM4OTA1MTcxLCAgIDAuMzkwNDY0NCwgICAgMC4zOTE4NzYxMywgICAwLjM5MzI4Njk3LAorICAgIDAuMzk0Njk2ODksICAgMC4zOTYxMDU4NiwgICAwLjM5NzUxMzksICAgIDAuMzk4OTIxMDEsCisgICAgMC40MDAzMjcxOCwgICAwLjQwMTczMjM5LCAgIDAuNDAzMTM2NjcsICAgMC40MDQ1NCwKKyAgICAwLjQwNTk0MjM4LCAgIDAuNDA3MzQzOCwgICAgMC40MDg3NDQyOCwgICAwLjQxMDE0Mzc5LAorICAgIDAuNDExNTQyMzMsICAgMC40MTI5Mzk4OCwgICAwLjQxNDMzNjUsICAgIDAuNDE1NzMyMTIsCisgICAgMC40MTcxMjY3NywgICAwLjQxODUyMDQyLCAgIDAuNDE5OTEzMTEsICAgMC40MjEzMDQ3OSwKKyAgICAwLjQyMjY5NTQ5LCAgIDAuNDI0MDg1MiwgICAgMC40MjU0NzM5LCAgICAwLjQyNjg2MTYxLAorICAgIDAuNDI4MjQ4MzIsICAgMC40Mjk2MzQsICAgICAwLjQzMTAxODcxLCAgIDAuNDMyNDAyMzcsCisgICAgMC40MzM3ODUwMiwgICAwLjQzNTE2NjY2LCAgIDAuNDM2NTQ3MjUsICAgMC40Mzc5MjY4MywKKyAgICAwLjQzOTMwNTM5LCAgIDAuNDQwNjgyODksICAgMC40NDIwNTkzNywgICAwLjQ0MzQzNDgzLAorICAgIDAuNDQ0ODA5MiwgICAgMC40NDYxODI1NSwgICAwLjQ0NzU1NDg2LCAgIDAuNDQ4OTI2MDksCisgICAgMC40NTAyOTYyOCwgICAwLjQ1MTY2NTQzLCAgIDAuNDUzMDMzNDgsICAgMC40NTQ0MDA0OCwKKyAgICAwLjQ1NTc2NjQxLCAgIDAuNDU3MTMxMjcsICAgMC40NTg0OTUwNSwgICAwLjQ1OTg1Nzc2LAorICAgIDAuNDYxMjE5NCwgICAgMC40NjI1Nzk5MSwgICAwLjQ2MzkzOTM3LCAgIDAuNDY1Mjk3NzMsCisgICAgMC40NjY2NTQ5OSwgICAwLjQ2ODAxMTE0LCAgIDAuNDY5MzY2MjIsICAgMC40NzA3MjAxNywKKyAgICAwLjQ3MjA3MzAyLCAgIDAuNDczNDI0NzYsICAgMC40NzQ3NzU0LCAgICAwLjQ3NjEyNDkxLAorICAgIDAuNDc3NDczMjksICAgMC40Nzg4MjA1NiwgICAwLjQ4MDE2NjcsICAgIDAuNDgxNTExNjgsCisgICAgMC40ODI4NTU1NiwgICAwLjQ4NDE5ODMsICAgIDAuNDg1NTM5OTEsICAgMC40ODY4ODAzNiwKKyAgICAwLjQ4ODIxOTY4LCAgIDAuNDg5NTU3ODMsICAgMC40OTA4OTQ4NSwgICAwLjQ5MjIzMDcxLAorICAgIDAuNDkzNTY1NDEsICAgMC40OTQ4OTg5MiwgICAwLjQ5NjIzMTI5LCAgIDAuNDk3NTYyNSwKKyAgICAwLjQ5ODg5MjU1LCAgIDAuNTAwMjIxMzcsICAgMC41MDE1NDkwNywgICAwLjUwMjg3NTU3LAorICAgIDAuNTA0MjAwODgsICAgMC41MDU1MjUwNSwgICAwLjUwNjg0Nzk4LCAgIDAuNTA4MTY5NzEsCisgICAgMC41MDk0OTAyNSwgICAwLjUxMDgwOTYsICAgIDAuNTEyMTI3NzYsICAgMC41MTM0NDQ3MiwKKyAgICAwLjUxNDc2MDQzLCAgIDAuNTE2MDc1MDIsICAgMC41MTczODgyOCwgICAwLjUxODcwMDQyLAorICAgIDAuNTIwMDExMzEsICAgMC41MjEzMjA5NCwgICAwLjUyMjYyOTMyLCAgIDAuNTIzOTM2NTcsCisgICAgMC41MjUyNDI1MSwgICAwLjUyNjU0NzI1LCAgIDAuNTI3ODUwNzUsICAgMC41MjkxNTI5OSwKKyAgICAwLjUzMDQ1Mzk4LCAgIDAuNTMxNzUzNzIsICAgMC41MzMwNTIyMSwgICAwLjUzNDM0OTQ0LAorICAgIDAuNTM1NjQ1NDgsICAgMC41MzY5NDAyMiwgICAwLjUzODIzMzY0LCAgIDAuNTM5NTI1ODcsCisgICAgMC41NDA4MTY3OCwgICAwLjU0MjEwNjQ1LCAgIDAuNTQzMzk0OCwgICAgMC41NDQ2ODE5MSwKKyAgICAwLjU0NTk2Nzc2LCAgIDAuNTQ3MjUyMywgICAgMC41NDg1MzU1MywgICAwLjU0OTgxNzUsCisgICAgMC41NTEwOTgxNywgICAwLjU1MjM3NzUyLCAgIDAuNTUzNjU1NTYsICAgMC41NTQ5MzIzNiwKKyAgICAwLjU1NjIwNzc4LCAgIDAuNTU3NDgxOTQsICAgMC41NTg3NTQ4LCAgICAwLjU2MDAyNjI5LAorICAgIDAuNTYxMjk2NTIsICAgMC41NjI1NjUzOSwgICAwLjU2MzgzMjk0LCAgIDAuNTY1MDk5MTgsCisgICAgMC41NjYzNjQxMSwgICAwLjU2NzYyNzY3LCAgIDAuNTY4ODg5OTIsICAgMC41NzAxNTA3OSwKKyAgICAwLjU3MTQxMDM2LCAgIDAuNTcyNjY4NTUsICAgMC41NzM5MjU0NCwgICAwLjU3NTE4MDk1LAorICAgIDAuNTc2NDM1MDksICAgMC41Nzc2ODc5MiwgICAwLjU3ODkzOTM4LCAgIDAuNTgwMTg5NDEsCisgICAgMC41ODE0MzgxMiwgICAwLjU4MjY4NTQ3LCAgIDAuNTgzOTMxNDUsICAgMC41ODUxNzYwNSwKKyAgICAwLjU4NjQxOTI4LCAgIDAuNTg3NjYxMTUsICAgMC41ODg5MDE2NCwgICAwLjU5MDE0MDcsCisgICAgMC41OTEzNzgzOSwgICAwLjU5MjYxNDY1LCAgIDAuNTkzODQ5NiwgICAgMC41OTUwODMwNiwKKyAgICAwLjU5NjMxNTIxLCAgIDAuNTk3NTQ1ODYsICAgMC41OTg3NzUyMSwgICAwLjYwMDAwMzA2LAorICAgIDAuNjAxMjI5NTUsICAgMC42MDI0NTQ2LCAgICAwLjYwMzY3ODIzLCAgIDAuNjA0OTAwNDgsCisgICAgMC42MDYxMjEyNCwgICAwLjYwNzM0MDYzLCAgIDAuNjA4NTU4NiwgICAgMC42MDk3NzUwNywKKyAgICAwLjYxMDk5MDE3LCAgIDAuNjEyMjAzNzgsICAgMC42MTM0MTYwMiwgICAwLjYxNDYyNjc3LAorICAgIDAuNjE1ODM2MDgsICAgMC42MTcwNDM5MSwgICAwLjYxODI1MDMxLCAgIDAuNjE5NDU1MjgsCisgICAgMC42MjA2NTg3NiwgICAwLjYyMTg2MDgsICAgIDAuNjIzMDYxMzYsICAgMC42MjQyNjA0OSwKKyAgICAwLjYyNTQ1ODEyLCAgIDAuNjI2NjU0MjcsICAgMC42Mjc4NDg5OCwgICAwLjYyOTA0MjIxLAorICAgIDAuNjMwMjMzOTQsICAgMC42MzE0MjQxOSwgICAwLjYzMjYxMjk0LCAgIDAuNjMzODAwMjEsCisgICAgMC42MzQ5ODU5OCwgICAwLjYzNjE3MDI3LCAgIDAuNjM3MzUzMDYsICAgMC42Mzg1MzQzNywKKyAgICAwLjYzOTcxNDEyLCAgIDAuNjQwODkyNDUsICAgMC42NDIwNjkyMiwgICAwLjY0MzI0NDUsCisgICAgMC42NDQ0MTgyNCwgICAwLjY0NTU5MDQ4LCAgIDAuNjQ2NzYxMTgsICAgMC42NDc5MzAzOCwKKyAgICAwLjY0OTA5ODA0LCAgIDAuNjUwMjY0MiwgICAgMC42NTE0Mjg4MiwgICAwLjY1MjU5MTg4LAorICAgIDAuNjUzNzUzNCwgICAgMC42NTQ5MTM0MywgICAwLjY1NjA3MTksICAgIDAuNjU3MjI4ODMsCisgICAgMC42NTgzODQyLCAgICAwLjY1OTUzODAzLCAgIDAuNjYwNjkwMzEsICAgMC42NjE4NDA5OCwKKyAgICAwLjY2Mjk5MDE1LCAgIDAuNjY0MTM3NzgsICAgMC42NjUyODM4LCAgICAwLjY2NjQyODI3LAorICAgIDAuNjY3NTcxMTksICAgMC42Njg3MTI1LCAgICAwLjY2OTg1MjI2LCAgIDAuNjcwOTkwNDcsCisgICAgMC42NzIxMjcwNywgICAwLjY3MzI2MjA2LCAgIDAuNjc0Mzk1NSwgICAgMC42NzU1MjczOSwKKyAgICAwLjY3NjY1NzYyLCAgIDAuNjc3Nzg2MjksICAgMC42Nzg5MTMzNSwgICAwLjY4MDAzODg3LAorICAgIDAuNjgxMTYyNzEsICAgMC42ODIyODUwMSwgICAwLjY4MzQwNTcsICAgIDAuNjg0NTI0NzEsCisgICAgMC42ODU2NDIxOCwgICAwLjY4Njc1ODA0LCAgIDAuNjg3ODcyMjMsICAgMC42ODg5ODQ4NywKKyAgICAwLjY5MDA5NTg0LCAgIDAuNjkxMjA1MiwgICAgMC42OTIzMTI5LCAgICAwLjY5MzQxOTA0LAorICAgIDAuNjk0NTIzNTEsICAgMC42OTU2MjYzMiwgICAwLjY5NjcyNzUxLCAgIDAuNjk3ODI3MSwKKyAgICAwLjY5ODkyNTAyLCAgIDAuNzAwMDIxMjcsICAgMC43MDExMTU5MSwgICAwLjcwMjIwODg4LAorICAgIDAuNzAzMzAwMTgsICAgMC43MDQzODk4NywgICAwLjcwNTQ3Nzg5LCAgIDAuNzA2NTY0MjUsCisgICAgMC43MDc2NDg5MywgICAwLjcwODczMTk1LCAgIDAuNzA5ODEzMywgICAgMC43MTA4OTI5OCwKKyAgICAwLjcxMTk3MDk4LCAgIDAuNzEzMDQ3MzMsICAgMC43MTQxMjIsICAgICAwLjcxNTE5NDk0LAorICAgIDAuNzE2MjY2MjcsICAgMC43MTczMzU4OCwgICAwLjcxODQwMzgyLCAgIDAuNzE5NDcwMDIsCisgICAgMC43MjA1MzQ1NiwgICAwLjcyMTU5NzQzLCAgIDAuNzIyNjU4NTcsICAgMC43MjM3MTc5OSwKKyAgICAwLjcyNDc3NTczLCAgIDAuNzI1ODMxODEsICAgMC43MjY4ODYwOSwgICAwLjcyNzkzODcxLAorICAgIDAuNzI4OTg5NiwgICAgMC43MzAwMzg4MiwgICAwLjczMTA4NjMxLCAgIDAuNzMyMTMyMDIsCisgICAgMC43MzMxNzYwNSwgICAwLjczNDIxODM2LCAgIDAuNzM1MjU4OTQsICAgMC43MzYyOTc3OSwKKyAgICAwLjczNzMzNDkxLCAgIDAuNzM4MzcwMywgICAgMC43Mzk0MDM5LCAgICAwLjc0MDQzNTg0LAorICAgIDAuNzQxNDY1OTksICAgMC43NDI0OTQ0LCAgICAwLjc0MzUyMTA5LCAgIDAuNzQ0NTQ2LAorICAgIDAuNzQ1NTY5MTcsICAgMC43NDY1OTA1NSwgICAwLjc0NzYxMDIxLCAgIDAuNzQ4NjI4MTQsCisgICAgMC43NDk2NDQyMiwgICAwLjc1MDY1ODYzLCAgIDAuNzUxNjcxMiwgICAgMC43NTI2ODIwMywKKyAgICAwLjc1MzY5MTE0LCAgIDAuNzU0Njk4NCwgICAgMC43NTU3MDM5MywgICAwLjc1NjcwNzY3LAorICAgIDAuNzU3NzA5NjIsICAgMC43NTg3MDk3OSwgICAwLjc1OTcwODE3LCAgIDAuNzYwNzA0NzYsCisgICAgMC43NjE2OTk1NiwgICAwLjc2MjY5MjU3LCAgIDAuNzYzNjgzOCwgICAgMC43NjQ2NzMyMywKKyAgICAwLjc2NTY2MDgyLCAgIDAuNzY2NjQ2NjgsICAgMC43Njc2MzA3LCAgICAwLjc2ODYxMjkyLAorICAgIDAuNzY5NTkzMywgICAgMC43NzA1NzE4OSwgICAwLjc3MTU0ODY5LCAgIDAuNzcyNTIzNjQsCisgICAgMC43NzM0OTY4MSwgICAwLjc3NDQ2ODEyLCAgIDAuNzc1NDM3NjUsICAgMC43NzY0MDUzMywKKyAgICAwLjc3NzM3MTE3LCAgIDAuNzc4MzM1MjEsICAgMC43NzkyOTczNSwgICAwLjc4MDI1Nzc2LAorICAgIDAuNzgxMjE2MjYsICAgMC43ODIxNzI5MiwgICAwLjc4MzEyNzc4LCAgIDAuNzg0MDgwOCwKKyAgICAwLjc4NTAzMTkxLCAgIDAuNzg1OTgxMjQsICAgMC43ODY5Mjg3MSwgICAwLjc4Nzg3NDM0LAorICAgIDAuNzg4ODE4MDYsICAgMC43ODk3NTk5OSwgICAwLjc5MDcwMDAyLCAgIDAuNzkxNjM4MiwKKyAgICAwLjc5MjU3NDUyLCAgIDAuNzkzNTA4OTUsICAgMC43OTQ0NDE1MiwgICAwLjc5NTM3MjI1LAorICAgIDAuNzk2MzAxMDcsICAgMC43OTcyMjgwNCwgICAwLjc5ODE1MzE2LCAgIDAuNzk5MDc2MzgsCisgICAgMC43OTk5OTc2OSwgICAwLjgwMDkxNzE1LCAgIDAuODAxODM0NywgICAgMC44MDI3NTA0MSwKKyAgICAwLjgwMzY2NDIxLCAgIDAuODA0NTc2MSwgICAgMC44MDU0ODYwOCwgICAwLjgwNjM5NDIyLAorICAgIDAuODA3MzAwNDUsICAgMC44MDgyMDQ3MSwgICAwLjgwOTEwNzEyLCAgIDAuODEwMDA3NjMsCisgICAgMC44MTA5MDYyMywgICAwLjgxMTgwMjk4LCAgIDAuODEyNjk3NzcsICAgMC44MTM1OTA1OSwKKyAgICAwLjgxNDQ4MTU2LCAgIDAuODE1MzcwNjIsICAgMC44MTYyNTc3MiwgICAwLjgxNzE0MjksCisgICAgMC44MTgwMjYxOSwgICAwLjgxODkwNzU2LCAgIDAuODE5Nzg2OTcsICAgMC44MjA2NjQ0NywKKyAgICAwLjgyMTU0MDA2LCAgIDAuODIyNDEzNjgsICAgMC44MjMyODU0LCAgICAwLjgyNDE1NTE1LAorICAgIDAuODI1MDIzLCAgICAgMC44MjU4ODg4NywgICAwLjgyNjc1Mjc4LCAgIDAuODI3NjE0NzgsCisgICAgMC44Mjg0NzQ4MiwgICAwLjgyOTMzMjk1LCAgIDAuODMwMTg5MDUsICAgMC44MzEwNDMyNCwKKyAgICAwLjgzMTg5NTQ3LCAgIDAuODMyNzQ1NzMsICAgMC44MzM1OTQwOCwgICAwLjgzNDQ0MDQxLAorICAgIDAuODM1Mjg0ODMsICAgMC44MzYxMjcyMiwgICAwLjgzNjk2NzcxLCAgIDAuODM3ODA2MjIsCisgICAgMC44Mzg2NDI3MiwgICAwLjgzOTQ3NzI0LCAgIDAuODQwMzA5ODYsICAgMC44NDExNDA0NSwKKyAgICAwLjg0MTk2OTAxLCAgIDAuODQyNzk1NjcsICAgMC44NDM2MjAzLCAgICAwLjg0NDQ0Mjk2LAorICAgIDAuODQ1MjYzNjYsICAgMC44NDYwODIzMywgICAwLjg0Njg5OTAzLCAgIDAuODQ3NzEzNzcsCisgICAgMC44NDg1MjY0OCwgICAwLjg0OTMzNzE2LCAgIDAuODUwMTQ1ODgsICAgMC44NTA5NTI1NywKKyAgICAwLjg1MTc1NzI5LCAgIDAuODUyNTU5OTgsICAgMC44NTMzNjA3MSwgICAwLjg1NDE1OTQxLAorICAgIDAuODU0OTU2MDksICAgMC44NTU3NTA3NCwgICAwLjg1NjU0MzQyLCAgIDAuODU3MzM0MDgsCisgICAgMC44NTgxMjI2NSwgICAwLjg1ODkwOTI1LCAgIDAuODU5NjkzODgsICAgMC44NjA0NzY0MywKKyAgICAwLjg2MTI1Njk2LCAgIDAuODYyMDM1NDUsICAgMC44NjI4MTE5MiwgICAwLjg2MzU4NjM3LAorICAgIDAuODY0MzU4NzgsICAgMC44NjUxMjkxNywgICAwLjg2NTg5NzU0LCAgIDAuODY2NjYzODcsCisgICAgMC44Njc0MjgxMiwgICAwLjg2ODE5MDM1LCAgIDAuODY4OTUwNTUsICAgMC44Njk3MDg3MiwKKyAgICAwLjg3MDQ2NDgsICAgIDAuODcxMjE4OCwgICAgMC44NzE5NzA4MywgICAwLjg3MjcyMDc4LAorICAgIDAuODczNDY4NywgICAgMC44NzQyMTQ1MywgICAwLjg3NDk1ODI4LCAgIDAuODc1NywKKyAgICAwLjg3NjQzOTY5LCAgIDAuODc3MTc3MywgICAgMC44Nzc5MTI4MiwgICAwLjg3ODY0NjI1LAorICAgIDAuODc5Mzc3NjYsICAgMC44ODAxMDY5OSwgICAwLjg4MDgzNDI4LCAgIDAuODgxNTU5NDMsCisgICAgMC44ODIyODI1NiwgICAwLjg4MzAwMzU5LCAgIDAuODgzNzIyNTQsICAgMC44ODQ0Mzk0NywKKyAgICAwLjg4NTE1NDI1LCAgIDAuODg1ODY2OTQsICAgMC44ODY1Nzc2MSwgICAwLjg4NzI4NjEzLAorICAgIDAuODg3OTkyNTYsICAgMC44ODg2OTY5NywgICAwLjg4OTM5OTIzLCAgIDAuODkwMDk5NDEsCisgICAgMC44OTA3OTc1LCAgICAwLjg5MTQ5MzUsICAgIDAuODkyMTg3NDIsICAgMC44OTI4NzkxOSwKKyAgICAwLjg5MzU2ODg3LCAgIDAuODk0MjU2NDcsICAgMC44OTQ5NDE5OSwgICAwLjg5NTYyNTM1LAorICAgIDAuODk2MzA2NjMsICAgMC44OTY5ODU3NywgICAwLjg5NzY2MjgyLCAgIDAuODk4MzM3NzgsCisgICAgMC44OTkwMTA2LCAgICAwLjg5OTY4MTMzLCAgIDAuOTAwMzQ5OTIsICAgMC45MDEwMTY0MSwKKyAgICAwLjkwMTY4MDc3LCAgIDAuOTAyMzQyOTgsICAgMC45MDMwMDMxLCAgICAwLjkwMzY2MTA3LAorICAgIDAuOTA0MzE2OTYsICAgMC45MDQ5NzA3MSwgICAwLjkwNTYyMjMsICAgIDAuOTA2MjcxNzYsCisgICAgMC45MDY5MTkxMiwgICAwLjkwNzU2NDI4LCAgIDAuOTA4MjA3MzYsICAgMC45MDg4NDgzNSwKKyAgICAwLjkwOTQ4NzEzLCAgIDAuOTEwMTIzNzcsICAgMC45MTA3NTgyNiwgICAwLjkxMTM5MDY2LAorICAgIDAuOTEyMDIwODYsICAgMC45MTI2NDg5OCwgICAwLjkxMzI3NDg4LCAgIDAuOTEzODk4NjUsCisgICAgMC45MTQ1MjAzMiwgICAwLjkxNTEzOTc5LCAgIDAuOTE1NzU3MTIsICAgMC45MTYzNzIzLAorICAgIDAuOTE2OTg1MjcsICAgMC45MTc1OTYxNiwgICAwLjkxODIwNDg0LCAgIDAuOTE4ODExMzgsCisgICAgMC45MTk0MTU3NywgICAwLjkyMDAxNzk2LCAgIDAuOTIwNjE4MDYsICAgMC45MjEyMTU4OSwKKyAgICAwLjkyMTgxMTY0LCAgIDAuOTIyNDA1MTgsICAgMC45MjI5OTY1MiwgICAwLjkyMzU4NTc3LAorICAgIDAuOTI0MTcyNzYsICAgMC45MjQ3NTc2NiwgICAwLjkyNTM0MDI5LCAgIDAuOTI1OTIwNzgsCisgICAgMC45MjY0OTkxMywgICAwLjkyNzA3NTI3LCAgIDAuOTI3NjQ5MjYsICAgMC45MjgyMjA5OSwKKyAgICAwLjkyODc5MDYzLCAgIDAuOTI5MzU4MDEsICAgMC45Mjk5MjMyNCwgICAwLjkzMDQ4NjI2LAorICAgIDAuOTMxMDQ3MDgsICAgMC45MzE2MDU3NiwgICAwLjkzMjE2MjIzLCAgIDAuOTMyNzE2NDksCisgICAgMC45MzMyNjg1NSwgICAwLjkzMzgxODQ2LCAgIDAuOTM0MzY2MTEsICAgMC45MzQ5MTE2MSwKKyAgICAwLjkzNTQ1NDg1LCAgIDAuOTM1OTk1OTQsICAgMC45MzY1MzQ4MiwgICAwLjkzNzA3MTUsCisgICAgMC45Mzc2MDU5OCwgICAwLjkzODEzODI1LCAgIDAuOTM4NjY4MjUsICAgMC45MzkxOTYxMSwKKyAgICAwLjkzOTcyMTc2LCAgIDAuOTQwMjQ1MjEsICAgMC45NDA3NjYzOSwgICAwLjk0MTI4NTM3LAorICAgIDAuOTQxODAyMiwgICAgMC45NDIzMTY3NywgICAwLjk0MjgyOTA3LCAgIDAuOTQzMzM5MjMsCisgICAgMC45NDM4NDcxMiwgICAwLjk0NDM1MjgxLCAgIDAuOTQ0ODU2MjksICAgMC45NDUzNTc1NiwKKyAgICAwLjk0NTg1NjU3LCAgIDAuOTQ2MzUzMzgsICAgMC45NDY4NDc5MiwgICAwLjk0NzM0MDI1LAorICAgIDAuOTQ3ODMwMzgsICAgMC45NDgzMTgyNCwgICAwLjk0ODgwMzksICAgIDAuOTQ5Mjg3MywKKyAgICAwLjk0OTc2ODQ4LCAgIDAuOTUwMjQ3NDcsICAgMC45NTA3MjQxMiwgICAwLjk1MTE5ODY0LAorICAgIDAuOTUxNjcwODksICAgMC45NTIxNDA4NywgICAwLjk1MjYwODU5LCAgIDAuOTUzMDc0MSwKKyAgICAwLjk1MzUzNzQsICAgIDAuOTUzOTk4NDUsICAgMC45NTQ0NTcyMiwgICAwLjk1NDkxMzc0LAorICAgIDAuOTU1MzY4MDQsICAgMC45NTU4MjAwOCwgICAwLjk1NjI2OTg2LCAgIDAuOTU2NzE3NDMsCisgICAgMC45NTcxNjI2OCwgICAwLjk1NzYwNTcyLCAgIDAuOTU4MDQ2NSwgICAgMC45NTg0ODUwNywKKyAgICAwLjk1ODkyMTMxLCAgIDAuOTU5MzU1MzUsICAgMC45NTk3ODcxMywgICAwLjk2MDIxNjY0LAorICAgIDAuOTYwNjQzODksICAgMC45NjEwNjg4NywgICAwLjk2MTQ5MTU4LCAgIDAuOTYxOTEyMDQsCisgICAgMC45NjIzMzAyMiwgICAwLjk2Mjc0NjE0LCAgIDAuOTYzMTU5OCwgICAgMC45NjM1NzExOSwKKyAgICAwLjk2Mzk4MDM4LCAgIDAuOTY0Mzg3MjQsICAgMC45NjQ3OTE4MywgICAwLjk2NTE5NDExLAorICAgIDAuOTY1NTk0MTcsICAgMC45NjU5OTE5NywgICAwLjk2NjM4NzQ1LCAgIDAuOTY2NzgwNzIsCisgICAgMC45NjcxNzE2NywgICAwLjk2NzU2MDM1LCAgIDAuOTY3OTQ2NzcsICAgMC45NjgzMzA4NiwKKyAgICAwLjk2ODcxMjc1LCAgIDAuOTY5MDkyMzEsICAgMC45Njk0Njk2MSwgICAwLjk2OTg0NDU4LAorICAgIDAuOTcwMjE3MzUsICAgMC45NzA1ODc3OSwgICAwLjk3MDk1NTk3LCAgIDAuOTcxMzIxODIsCisgICAgMC45NzE2ODU0MSwgICAwLjk3MjA0NjY3LCAgIDAuOTcyNDA1NzMsICAgMC45NzI3NjI0NywKKyAgICAwLjk3MzExNjg3LCAgIDAuOTczNDY5MDIsICAgMC45NzM4MTg5LCAgICAwLjk3NDE2NjQ1LAorICAgIDAuOTc0NTExNzQsICAgMC45NzQ4NTQ3MSwgICAwLjk3NTE5NTQxLCAgIDAuOTc1NTMzNzgsCisgICAgMC45NzU4Njk4OSwgICAwLjk3NjIwMzY4LCAgIDAuOTc2NTM1MiwgICAgMC45NzY4NjQ0LAorICAgIDAuOTc3MTkxMzMsICAgMC45Nzc1MTU5NCwgICAwLjk3NzgzODIyLCAgIDAuOTc4MTU4MjQsCisgICAgMC45Nzg0NzU5MywgICAwLjk3ODc5MTM2LCAgIDAuOTc5MTA0NDYsICAgMC45Nzk0MTUyNCwKKyAgICAwLjk3OTcyMzY5LCAgIDAuOTgwMDI5ODgsICAgMC45ODAzMzM4MSwgICAwLjk4MDYzNTM0LAorICAgIDAuOTgwOTM0NjIsICAgMC45ODEyMzE1NywgICAwLjk4MTUyNjI2LCAgIDAuOTgxODE4NTYsCisgICAgMC45ODIxMDg1OSwgICAwLjk4MjM5NjMsICAgIDAuOTgyNjgxNjksICAgMC45ODI5NjQ4MSwKKyAgICAwLjk4MzI0NTYxLCAgIDAuOTgzNTI0MDIsICAgMC45ODM4MDAyMywgICAwLjk4NDA3NDA2LAorICAgIDAuOTg0MzQ1NTYsICAgMC45ODQ2MTQ3OSwgICAwLjk4NDg4MTY0LCAgIDAuOTg1MTQ2MjIsCisgICAgMC45ODU0MDg0OCwgICAwLjk4NTY2ODQyLCAgIDAuOTg1OTI2MDMsICAgMC45ODYxODEzMiwKKyAgICAwLjk4NjQzNDI4LCAgIDAuOTg2Njg0OTgsICAgMC45ODY5MzMyOSwgICAwLjk4NzE3OTI4LAorICAgIDAuOTg3NDIyOTQsICAgMC45ODc2NjQzNCwgICAwLjk4NzkwMzM2LCAgIDAuOTg4MTQwMTEsCisgICAgMC45ODgzNzQ0NywgICAwLjk4ODYwNjUxLCAgIDAuOTg4ODM2MjksICAgMC45ODkwNjM2OCwKKyAgICAwLjk4OTI4ODc1LCAgIDAuOTg5NTExNDksICAgMC45ODk3MzE5NywgICAwLjk4OTk1MDA2LAorICAgIDAuOTkwMTY1ODMsICAgMC45OTAzNzkyMSwgICAwLjk5MDU5MDMzLCAgIDAuOTkwNzk5MTMsCisgICAgMC45OTEwMDU2LCAgICAwLjk5MTIwOTY5LCAgIDAuOTkxNDExNDUsICAgMC45OTE2MTA4OCwKKyAgICAwLjk5MTgwOCwgICAgIDAuOTkyMDAyNzksICAgMC45OTIxOTUyNSwgICAwLjk5MjM4NTMzLAorICAgIDAuOTkyNTczMTQsICAgMC45OTI3NTg1NywgICAwLjk5Mjk0MTY4LCAgIDAuOTkzMTIyNDYsCisgICAgMC45OTMzMDA4NiwgICAwLjk5MzQ3Njk5LCAgIDAuOTkzNjUwNzMsICAgMC45OTM4MjIxNiwKKyAgICAwLjk5Mzk5MTIsICAgIDAuOTk0MTU3OTcsICAgMC45OTQzMjIzNiwgICAwLjk5NDQ4NDQyLAorICAgIDAuOTk0NjQ0MTcsICAgMC45OTQ4MDE1MiwgICAwLjk5NDk1NjU1LCAgIDAuOTk1MTA5MjYsCisgICAgMC45OTUyNTk1OCwgICAwLjk5NTQwNzY0LCAgIDAuOTk1NTUzMzEsICAgMC45OTU2OTY2LAorICAgIDAuOTk1ODM3NjMsICAgMC45OTU5NzYyNywgICAwLjk5NjExMjU5LCAgIDAuOTk2MjQ2NTIsCisgICAgMC45OTYzNzgxMiwgICAwLjk5NjUwNzQxLCAgIDAuOTk2NjM0MywgICAgMC45OTY3NTg4OCwKKyAgICAwLjk5Njg4MTEzLCAgIDAuOTk3MDAwOTksICAgMC45OTcxMTg1MywgICAwLjk5NzIzMzc1LAorICAgIDAuOTk3MzQ2NTgsICAgMC45OTc0NTcwOSwgICAwLjk5NzU2NTI3LCAgIDAuOTk3NjcxMDcsCisgICAgMC45OTc3NzQ0OCwgICAwLjk5Nzg3NTYzLCAgIDAuOTk3OTc0NCwgICAgMC45OTgwNzA3OCwKKyAgICAwLjk5ODE2NDgzLCAgIDAuOTk4MjU2NTYsICAgMC45OTgzNDU5MSwgICAwLjk5ODQzMjkzLAorICAgIDAuOTk4NTE3NjMsICAgMC45OTg1OTk5NSwgICAwLjk5ODY3OTk0LCAgIDAuOTk4NzU3NTQsCisgICAgMC45OTg4MzI4MiwgICAwLjk5ODkwNTcyLCAgIDAuOTk4OTc2MjksICAgMC45OTkwNDQ0OCwKKyAgICAwLjk5OTExMDM0LCAgIDAuOTk5MTczODgsICAgMC45OTkyMzUwMywgICAwLjk5OTI5Mzg2LAorICAgIDAuOTk5MzUwMzEsICAgMC45OTk0MDQ0MywgICAwLjk5OTQ1NjE3LCAgIDAuOTk5NTA1NTgsCisgICAgMC45OTk1NTI2NywgICAwLjk5OTU5NzM3LCAgIDAuOTk5NjM5NjksICAgMC45OTk2Nzk2OCwKKyAgICAwLjk5OTcxNzM1LCAgIDAuOTk5NzUyNjQsICAgMC45OTk3ODU2LCAgICAwLjk5OTgxNjE4LAorICAgIDAuOTk5ODQ0NDMsICAgMC45OTk4NzAzLCAgICAwLjk5OTg5Mzg0LCAgIDAuOTk5OTE1LAorICAgIDAuOTk5OTMzODQsICAgMC45OTk5NTAyOSwgICAwLjk5OTk2NDQyLCAgIDAuOTk5OTc2MTYsCisgICAgMC45OTk5ODU1OCwgICAwLjk5OTk5MjY3LCAgIDAuOTk5OTk3MzgsICAgMC45OTk5OTk3LAorfTsKKworY29uc3QgZmxvYXQgZmZfb24yYXZjX3dpbmRvd19sb25nXzI0MDAwWzEwMjRdID0geworICAgIDAuMDAwMDAxMDIsICAgICAwLjAwMDAwOTE3MDAwMDMsIDAuMDAwMDI1NDcwMDAxLCAwLjAwMDA0OTkzLAorICAgIDAuMDAwMDgyNTMwMDAxLCAwLjAwMDEyMzI4LCAgICAgIDAuMDAwMTcyMTksICAgICAwLjAwMDIyOTI0LAorICAgIDAuMDAwMjk0NDMwMDEsICAwLjAwMDM2Nzc4MDAxLCAgIDAuMDAwNDQ5MjcwMDEsICAwLjAwMDUzODkwMDAzLAorICAgIDAuMDAwNjM2NjY5OTgsICAwLjAwMDc0MjU3OTk4LCAgIDAuMDAwODU2NjI5OTgsICAwLjAwMDk3ODgxMDAxLAorICAgIDAuMDAxMTA5MTMsICAgICAwLjAwMTI0NzU4LCAgICAgIDAuMDAxMzk0MTUsICAgICAwLjAwMTU0ODg1LAorICAgIDAuMDAxNzExNjgsICAgICAwLjAwMTg4MjYyLCAgICAgIDAuMDAyMDYxNjgsICAgICAwLjAwMjI0ODg1LAorICAgIDAuMDAyNDQ0MTI5OSwgICAwLjAwMjY0NzUxLCAgICAgIDAuMDAyODU4OTk5OSwgICAwLjAwMzA3ODU3OTksCisgICAgMC4wMDMzMDYyNjAxLCAgIDAuMDAzNTQyMDIsICAgICAgMC4wMDM3ODU4OCwgICAgIDAuMDA0MDM3ODEsCisgICAgMC4wMDQyOTc4MTAxLCAgIDAuMDA0NTY1ODg5OSwgICAgMC4wMDQ4NDIwMjk5LCAgIDAuMDA1MTI2MjQwMiwKKyAgICAwLjAwNTQxODQ5MDIsICAgMC4wMDU3MTg3OTk4LCAgICAwLjAwNjAyNzE1LCAgICAgMC4wMDYzNDM1Mzk4LAorICAgIDAuMDA2NjY3OTYsICAgICAwLjAwNzAwMDQxLCAgICAgIDAuMDA3MzQwODY5OSwgICAwLjAwNzY4OTM0OTgsCisgICAgMC4wMDgwNDU4NDAxLCAgIDAuMDA4NDEwMzE5NywgICAgMC4wMDg3ODI4MDAzLCAgIDAuMDA5MTYzMjY5OCwKKyAgICAwLjAwOTU1MTcxMDQsICAgMC4wMDk5NDgxMjk4LCAgICAwLjAxMDM1MjUxLCAgICAgMC4wMTA3NjQ4NSwKKyAgICAwLjAxMTE4NTEzLCAgICAgMC4wMTE2MTMzNiwgICAgICAwLjAxMjA0OTUyLCAgICAgMC4wMTI0OTM2LAorICAgIDAuMDEyOTQ1NiwgICAgICAwLjAxMzQwNTUxLCAgICAgIDAuMDEzODczMzIsICAgICAwLjAxNDM0OTAyLAorICAgIDAuMDE0ODMyNiwgICAgICAwLjAxNTMyNDA1LCAgICAgIDAuMDE1ODIzMzYxLCAgICAwLjAxNjMzMDUzMSwKKyAgICAwLjAxNjg0NTU1LCAgICAgMC4wMTczNjgzODksICAgICAwLjAxNzg5OTA3LCAgICAgMC4wMTg0Mzc1NjEsCisgICAgMC4wMTg5ODM4NSwgICAgIDAuMDE5NTM3OTI5LCAgICAgMC4wMjAwOTk4MDksICAgIDAuMDIwNjY5NDQ5LAorICAgIDAuMDIxMjQ2ODYsICAgICAwLjAyMTgzMjAxOSwgICAgIDAuMDIyNDI0OTIsICAgICAwLjAyMzAyNTU1LAorICAgIDAuMDIzNjMzODk5LCAgICAwLjAyNDI0OTk1LCAgICAgIDAuMDI0ODczNzA5LCAgICAwLjAyNTUwNTE0LAorICAgIDAuMDI2MTQ0MjQ5LCAgICAwLjAyNjc5MTAxOSwgICAgIDAuMDI3NDQ1NDMsICAgICAwLjAyODEwNzQ5LAorICAgIDAuMDI4Nzc3MTYsICAgICAwLjAyOTQ1NDQ0OSwgICAgIDAuMDMwMTM5MzMxLCAgICAwLjAzMDgzMTgwMSwKKyAgICAwLjAzMTUzMTg0MSwgICAgMC4wMzIyMzk0NDEsICAgICAwLjAzMjk1NDU4OSwgICAgMC4wMzM2NzcyNjksCisgICAgMC4wMzQ0MDc0NywgICAgIDAuMDM1MTQ1MTcxLCAgICAgMC4wMzU4OTAzNzEsICAgIDAuMDM2NjQzMDM5LAorICAgIDAuMDM3NDAzMTcsICAgICAwLjAzODE3MDc1OSwgICAgIDAuMDM4OTQ1Nzc5LCAgICAwLjAzOTcyODIyMSwKKyAgICAwLjA0MDUxODA3MiwgICAgMC4wNDEzMTUyOTksICAgICAwLjA0MjExOTkyLCAgICAgMC4wNDI5MzE4ODgsCisgICAgMC4wNDM3NTEyMSwgICAgIDAuMDQ0NTc3ODU5LCAgICAgMC4wNDU0MTE4MjEsICAgIDAuMDQ2MjUzMDg5LAorICAgIDAuMDQ3MTAxNjM5LCAgICAwLjA0Nzk1NzQ1LCAgICAgIDAuMDQ4ODIwNTIyLCAgICAwLjA0OTY5MDgyLAorICAgIDAuMDUwNTY4MzUsICAgICAwLjA1MTQ1MzA2OSwgICAgIDAuMDUyMzQ0OTgyLCAgICAwLjA1MzI0NDA2OSwKKyAgICAwLjA1NDE1MDI5OCwgICAgMC4wNTUwNjM2NjksICAgICAwLjA1NTk4NDE2MiwgICAgMC4wNTY5MTE3NTIsCisgICAgMC4wNTc4NDY0MzEsICAgIDAuMDU4Nzg4MTY5LCAgICAgMC4wNTk3MzY5NzEsICAgIDAuMDYwNjkyNzkxLAorICAgIDAuMDYxNjU1NjI5LCAgICAwLjA2MjYyNTQ2OCwgICAgIDAuMDYzNjAyMjg0LCAgICAwLjA2NDU4NjA1OCwKKyAgICAwLjA2NTU3Njc2OSwgICAgMC4wNjY1NzQ0MSwgICAgICAwLjA2NzU3ODk0OSwgICAgMC4wNjg1OTAzOCwKKyAgICAwLjA2OTYwODY3MywgICAgMC4wNzA2MzM4MjEsICAgICAwLjA3MTY2NTc5NCwgICAgMC4wNzI3MDQ1NjksCisgICAgMC4wNzM3NTAxMzgsICAgIDAuMDc0ODAyNDgxLCAgICAgMC4wNzU4NjE1NzMsICAgIDAuMDc2OTI3NDAxLAorICAgIDAuMDc3OTk5OTQyLCAgICAwLjA3OTA3OTE1OSwgICAgIDAuMDgwMTY1MDU4LCAgICAwLjA4MTI1NzYxOSwKKyAgICAwLjA4MjM1NjgwMywgICAgMC4wODM0NjI1ODgsICAgICAwLjA4NDU3NDk4MywgICAgMC4wODU2OTM5MzMsCisgICAgMC4wODY4MTk0MzMsICAgIDAuMDg3OTUxNDU5LCAgICAgMC4wODkwODk5OTcsICAgIDAuMDkwMjM1MDE3LAorICAgIDAuMDkxMzg2NTEyLCAgICAwLjA5MjU0NDQzNiwgICAgIDAuMDkzNzA4NzkxLCAgICAwLjA5NDg3OTUzOCwKKyAgICAwLjA5NjA1NjY3LCAgICAgMC4wOTcyNDAxNTcsICAgICAwLjA5ODQyOTk3OCwgICAgMC4wOTk2MjYxMTYsCisgICAgMC4xMDA4Mjg1NCwgICAgIDAuMTAyMDM3MjMsICAgICAgMC4xMDMyNTIxNywgICAgIDAuMTA0NDczMzMsCisgICAgMC4xMDU3MDA3LCAgICAgIDAuMTA2OTM0MjQsICAgICAgMC4xMDgxNzM5MywgICAgIDAuMTA5NDE5NzYsCisgICAgMC4xMTA2NzE3LCAgICAgIDAuMTExOTI5NzIsICAgICAgMC4xMTMxOTM4LCAgICAgIDAuMTE0NDYzOTMsCisgICAgMC4xMTU3NDAwNywgICAgIDAuMTE3MDIyMiwgICAgICAgMC4xMTgzMTAzLCAgICAgIDAuMTE5NjA0MzUsCisgICAgMC4xMjA5MDQzMiwgICAgIDAuMTIyMjEwMTgsICAgICAgMC4xMjM1MjE5MiwgICAgIDAuMTI0ODM5NTEsCisgICAgMC4xMjYxNjI5MiwgICAgIDAuMTI3NDkyMTMsICAgICAgMC4xMjg4MjcxMSwgICAgIDAuMTMwMTY3ODYsCisgICAgMC4xMzE1MTQzMywgICAgIDAuMTMyODY2NDksICAgICAgMC4xMzQyMjQzMywgICAgIDAuMTM1NTg3ODMsCisgICAgMC4xMzY5NTY5NSwgICAgIDAuMTM4MzMxNjcsICAgICAgMC4xMzk3MTE5NSwgICAgIDAuMTQxMDk3OCwKKyAgICAwLjE0MjQ4OTE3LCAgICAgMC4xNDM4ODYwNCwgICAgICAwLjE0NTI4ODM5LCAgICAgMC4xNDY2OTYyLAorICAgIDAuMTQ4MTA5NDEsICAgICAwLjE0OTUyODAzLCAgICAgIDAuMTUwOTUyLCAgICAgICAwLjE1MjM4MTMzLAorICAgIDAuMTUzODE1OTgsICAgICAwLjE1NTI1NTkxLCAgICAgIDAuMTU2NzAxMTIsICAgICAwLjE1ODE1MTU3LAorICAgIDAuMTU5NjA3MjIsICAgICAwLjE2MTA2ODA3LCAgICAgIDAuMTYyNTM0MDYsICAgICAwLjE2NDAwNTE5LAorICAgIDAuMTY1NDgxNDMsICAgICAwLjE2Njk2Mjc0LCAgICAgIDAuMTY4NDQ5MSwgICAgICAwLjE2OTk0MDUsCisgICAgMC4xNzE0MzY4OCwgICAgIDAuMTcyOTM4MjQsICAgICAgMC4xNzQ0NDQ1NCwgICAgIDAuMTc1OTU1NzQsCisgICAgMC4xNzc0NzE4NSwgICAgIDAuMTc4OTkyODEsICAgICAgMC4xODA1MTg2LCAgICAgIDAuMTgyMDQ5MiwKKyAgICAwLjE4MzU4NDU3LCAgICAgMC4xODUxMjQ2OCwgICAgICAwLjE4NjY2OTUxLCAgICAgMC4xODgyMTkwNiwKKyAgICAwLjE4OTc3MzI1LCAgICAgMC4xOTEzMzIwNywgICAgICAwLjE5Mjg5NTUyLCAgICAgMC4xOTQ0NjM1MiwKKyAgICAwLjE5NjAzNjA5LCAgICAgMC4xOTc2MTMxNiwgICAgICAwLjE5OTE5NDc0LCAgICAgMC4yMDA3ODA3OSwKKyAgICAwLjIwMjM3MTI3LCAgICAgMC4yMDM5NjYxNiwgICAgICAwLjIwNTU2NTQxLCAgICAgMC4yMDcxNjkwMywKKyAgICAwLjIwODc3Njk1LCAgICAgMC4yMTAzODkxNywgICAgICAwLjIxMjAwNTY1LCAgICAgMC4yMTM2MjYzNywKKyAgICAwLjIxNTI1MTI4LCAgICAgMC4yMTY4ODAzNywgICAgICAwLjIxODUxMzYxLCAgICAgMC4yMjAxNTA5NSwKKyAgICAwLjIyMTc5MjM4LCAgICAgMC4yMjM0Mzc4OCwgICAgICAwLjIyNTA4NzM5LCAgICAgMC4yMjY3NDA5LAorICAgIDAuMjI4Mzk4MzcsICAgICAwLjIzMDA1OTc3LCAgICAgIDAuMjMxNzI1MSwgICAgICAwLjIzMzM5NDI5LAorICAgIDAuMjM1MDY3MzIsICAgICAwLjIzNjc0NDIsICAgICAgIDAuMjM4NDI0ODIsICAgICAwLjI0MDEwOTIyLAorICAgIDAuMjQxNzk3MzQsICAgICAwLjI0MzQ4OTE2LCAgICAgIDAuMjQ1MTg0NjUsICAgICAwLjI0Njg4Mzc2LAorICAgIDAuMjQ4NTg2NDgsICAgICAwLjI1MDI5Mjc4LCAgICAgIDAuMjUyMDAyNiwgICAgICAwLjI1MzcxNTk2LAorICAgIDAuMjU1NDMyNzgsICAgICAwLjI1NzE1MzA2LCAgICAgIDAuMjU4ODc2NzcsICAgICAwLjI2MDYwMzg1LAorICAgIDAuMjYyMzM0MzIsICAgICAwLjI2NDA2ODA3LCAgICAgIDAuMjY1ODA1MTYsICAgICAwLjI2NzU0NTQ5LAorICAgIDAuMjY5Mjg5MDUsICAgICAwLjI3MTAzNTgyLCAgICAgIDAuMjcyNzg1NzgsICAgICAwLjI3NDUzODg3LAorICAgIDAuMjc2Mjk1MDcsICAgICAwLjI3ODA1NDMzLCAgICAgIDAuMjc5ODE2NjYsICAgICAwLjI4MTU4MiwKKyAgICAwLjI4MzM1MDMyLCAgICAgMC4yODUxMjE2MiwgICAgICAwLjI4Njg5NTgxLCAgICAgMC4yODg2NzI4OSwKKyAgICAwLjI5MDQ1Mjg0LCAgICAgMC4yOTIyMzU2NCwgICAgICAwLjI5NDAyMTE5LCAgICAgMC4yOTU4MDk1NCwKKyAgICAwLjI5NzYwMDYsICAgICAgMC4yOTkzOTQzNywgICAgICAwLjMwMTE5MDgyLCAgICAgMC4zMDI5ODk5LAorICAgIDAuMzA0NzkxNTcsICAgICAwLjMwNjU5NTgzLCAgICAgIDAuMzA4NDAyNjMsICAgICAwLjMxMDIxMTk2LAorICAgIDAuMzEyMDIzNzMsICAgICAwLjMxMzgzNzk4LCAgICAgIDAuMzE1NjU0NjEsICAgICAwLjMxNzQ3MzY1LAorICAgIDAuMzE5Mjk1MDUsICAgICAwLjMyMTExODc0LCAgICAgIDAuMzIyOTQ0NzMsICAgICAwLjMyNDc3Mjk4LAorICAgIDAuMzI2NjAzNDcsICAgICAwLjMyODQzNjExLCAgICAgIDAuMzMwMjcwOTUsICAgICAwLjMzMjEwNzg3LAorICAgIDAuMzMzOTQ2OTEsICAgICAwLjMzNTc4ODA0LCAgICAgIDAuMzM3NjMxMTcsICAgICAwLjMzOTQ3NjI5LAorICAgIDAuMzQxMzIzMzgsICAgICAwLjM0MzE3MjQzLCAgICAgIDAuMzQ1MDIzMzYsICAgICAwLjM0Njg3NjE3LAorICAgIDAuMzQ4NzMwOCwgICAgICAwLjM1MDU4NzI1LCAgICAgIDAuMzUyNDQ1NDgsICAgICAwLjM1NDMwNTQ1LAorICAgIDAuMzU2MTY3MTEsICAgICAwLjM1ODAzMDQ3LCAgICAgIDAuMzU5ODk1NDQsICAgICAwLjM2MTc2MjA1LAorICAgIDAuMzYzNjMwMjQsICAgICAwLjM2NTQ5OTk3LCAgICAgIDAuMzY3MzcxMjMsICAgICAwLjM2OTI0Mzk1LAorICAgIDAuMzcxMTE4MTMsICAgICAwLjM3Mjk5Mzc0LCAgICAgIDAuMzc0ODcwNzIsICAgICAwLjM3Njc0OTA0LAorICAgIDAuMzc4NjI4NywgICAgICAwLjM4MDUwOTY3LCAgICAgIDAuMzgyMzkxODcsICAgICAwLjM4NDI3NTI5LAorICAgIDAuMzg2MTU5OTMsICAgICAwLjM4ODA0NTcsICAgICAgIDAuMzg5OTMyNiwgICAgICAwLjM5MTgyMDYxLAorICAgIDAuMzkzNzA5NjksICAgICAwLjM5NTU5OTc4LCAgICAgIDAuMzk3NDkwODksICAgICAwLjM5OTM4Mjk4LAorICAgIDAuNDAxMjc1OTYsICAgICAwLjQwMzE2OTg3LCAgICAgIDAuNDA1MDY0NjQsICAgICAwLjQwNjk2MDI4LAorICAgIDAuNDA4ODU2NjksICAgICAwLjQxMDc1Mzg4LCAgICAgIDAuNDEyNjUxODEsICAgICAwLjQxNDU1MDQ4LAorICAgIDAuNDE2NDQ5NzksICAgICAwLjQxODM0OTc3LCAgICAgIDAuNDIwMjUwMzYsICAgICAwLjQyMjE1MTUxLAorICAgIDAuNDI0MDUzMjIsICAgICAwLjQyNTk1NTQ3LCAgICAgIDAuNDI3ODU4MTcsICAgICAwLjQyOTc2MTM1LAorICAgIDAuNDMxNjY0OTQsICAgICAwLjQzMzU2ODkyLCAgICAgIDAuNDM1NDczMjYsICAgICAwLjQzNzM3NzkzLAorICAgIDAuNDM5MjgyOTIsICAgICAwLjQ0MTE4ODEzLCAgICAgIDAuNDQzMDkzNiwgICAgICAwLjQ0NDk5OTI1LAorICAgIDAuNDQ2OTA1MDgsICAgICAwLjQ0ODgxMTAyLCAgICAgIDAuNDUwNzE3MDksICAgICAwLjQ1MjYyMzIyLAorICAgIDAuNDU0NTI5NCwgICAgICAwLjQ1NjQzNTU5LCAgICAgIDAuNDU4MzQxNzUsICAgICAwLjQ2MDI0Nzg0LAorICAgIDAuNDYyMTUzODgsICAgICAwLjQ2NDA1OTc3LCAgICAgIDAuNDY1OTY1NTQsICAgICAwLjQ2Nzg3MTEzLAorICAgIDAuNDY5Nzc2NDgsICAgICAwLjQ3MTY4MTYyLCAgICAgIDAuNDczNTg2NDcsICAgICAwLjQ3NTQ5MTAyLAorICAgIDAuNDc3Mzk1MjQsICAgICAwLjQ3OTI5OTEsICAgICAgIDAuNDgxMjAyNTQsICAgICAwLjQ4MzEwNTU3LAorICAgIDAuNDg1MDA4MTIsICAgICAwLjQ4NjkxMDE5LCAgICAgIDAuNDg4ODExNzMsICAgICAwLjQ5MDcxMjczLAorICAgIDAuNDkyNjEzMTQsICAgICAwLjQ5NDUxMjk1LCAgICAgIDAuNDk2NDEyMSwgICAgICAwLjQ5ODMxMDYsCisgICAgMC41MDAyMDgzOCwgICAgIDAuNTAyMTA1NDEsICAgICAgMC41MDQwMDE2OCwgICAgIDAuNTA1ODk3MTYsCisgICAgMC41MDc3OTE4MiwgICAgIDAuNTA5Njg1NTgsICAgICAgMC41MTE1Nzg1LCAgICAgIDAuNTEzNDcwNDcsCisgICAgMC41MTUzNjE0OSwgICAgIDAuNTE3MjUxNTUsICAgICAgMC41MTkxNDA2LCAgICAgIDAuNTIxMDI4NTgsCisgICAgMC41MjI5MTU1NCwgICAgIDAuNTI0ODAxMzcsICAgICAgMC41MjY2ODYwNywgICAgIDAuNTI4NTY5NjQsCisgICAgMC41MzA0NTE5NSwgICAgIDAuNTMyMzMzMTQsICAgICAgMC41MzQyMTMwMSwgICAgIDAuNTM2MDkxNjMsCisgICAgMC41Mzc5Njg5MywgICAgIDAuNTM5ODQ0OTMsICAgICAgMC41NDE3MTk1NiwgICAgIDAuNTQzNTkyNzUsCisgICAgMC41NDU0NjQ1OCwgICAgIDAuNTQ3MzM0OTEsICAgICAgMC41NDkyMDM3NSwgICAgIDAuNTUxMDcxMTEsCisgICAgMC41NTI5MzY5MSwgICAgIDAuNTU0ODAxMTcsICAgICAgMC41NTY2NjM4MSwgICAgIDAuNTU4NTI0NzksCisgICAgMC41NjAzODQxNSwgICAgIDAuNTYyMjQxODUsICAgICAgMC41NjQwOTc4MiwgICAgIDAuNTY1OTUyLAorICAgIDAuNTY3ODA0NTIsICAgICAwLjU2OTY1NTEyLCAgICAgIDAuNTcxNTA0LCAgICAgICAwLjU3MzM1MDk3LAorICAgIDAuNTc1MTk2MDksICAgICAwLjU3NzAzOTI0LCAgICAgIDAuNTc4ODgwNDksICAgICAwLjU4MDcxOTgzLAorICAgIDAuNTgyNTU3MDgsICAgICAwLjU4NDM5MjM3LCAgICAgIDAuNTg2MjI1NjMsICAgICAwLjU4ODA1Njc0LAorICAgIDAuNTg5ODg1ODMsICAgICAwLjU5MTcxMjcxLCAgICAgIDAuNTkzNTM3NTEsICAgICAwLjU5NTM2MDEsCisgICAgMC41OTcxODA0MywgICAgIDAuNTk4OTk4NTUsICAgICAgMC42MDA4MTQ0NiwgICAgIDAuNjAyNjI3OTksCisgICAgMC42MDQ0MzkyNiwgICAgIDAuNjA2MjQ4MiwgICAgICAgMC42MDgwNTQ3LCAgICAgIDAuNjA5ODU4ODcsCisgICAgMC42MTE2NjA2LCAgICAgIDAuNjEzNDU5ODMsICAgICAgMC42MTUyNTY2MSwgICAgIDAuNjE3MDUwODksCisgICAgMC42MTg4NDI2NiwgICAgIDAuNjIwNjMxODcsICAgICAgMC42MjI0MTg0NiwgICAgIDAuNjI0MjAyNDksCisgICAgMC42MjU5ODM4OSwgICAgIDAuNjI3NzYyNjIsICAgICAgMC42Mjk1Mzg2NiwgICAgIDAuNjMxMzEyMDEsCisgICAgMC42MzMwODI1NywgICAgIDAuNjM0ODUwNDQsICAgICAgMC42MzY2MTU1MSwgICAgIDAuNjM4Mzc3NzMsCisgICAgMC42NDAxMzcyLCAgICAgIDAuNjQxODkzNzQsICAgICAgMC42NDM2NDc0MywgICAgIDAuNjQ1Mzk4MiwKKyAgICAwLjY0NzE0NjA1LCAgICAgMC42NDg4OTA5MSwgICAgICAwLjY1MDYzMjg2LCAgICAgMC42NTIzNzE3LAorICAgIDAuNjU0MTA3NjMsICAgICAwLjY1NTg0MDQ2LCAgICAgIDAuNjU3NTcwMTgsICAgICAwLjY1OTI5NjgxLAorICAgIDAuNjYxMDIwNCwgICAgICAwLjY2Mjc0MDc3LCAgICAgIDAuNjY0NDU3OTgsICAgICAwLjY2NjE3MjAzLAorICAgIDAuNjY3ODgyOCwgICAgICAwLjY2OTU5MDQxLCAgICAgIDAuNjcxMjk0NjksICAgICAwLjY3Mjk5NTc1LAorICAgIDAuNjc0NjkzNDcsICAgICAwLjY3NjM4Nzg1LCAgICAgIDAuNjc4MDc4ODksICAgICAwLjY3OTc2NjU0LAorICAgIDAuNjgxNDUwODQsICAgICAwLjY4MzEzMTY5LCAgICAgIDAuNjg0ODA5MDksICAgICAwLjY4NjQ4MzA5LAorICAgIDAuNjg4MTUzNTYsICAgICAwLjY4OTgyMDUzLCAgICAgIDAuNjkxNDgzOTcsICAgICAwLjY5MzE0Mzg0LAorICAgIDAuNjk0ODAwMiwgICAgICAwLjY5NjQ1MjkyLCAgICAgIDAuNjk4MTAyMDYsICAgICAwLjY5OTc0NzU2LAorICAgIDAuNzAxMzg5MzcsICAgICAwLjcwMzAyNzU1LCAgICAgIDAuNzA0NjYyMDIsICAgICAwLjcwNjI5MjgxLAorICAgIDAuNzA3OTE5ODQsICAgICAwLjcwOTU0MzExLCAgICAgIDAuNzExMTYyNjMsICAgICAwLjcxMjc3ODMzLAorICAgIDAuNzE0MzkwMjIsICAgICAwLjcxNTk5ODI5LCAgICAgIDAuNzE3NjAyNDksICAgICAwLjcxOTIwMjgyLAorICAgIDAuNzIwNzk5MjcsICAgICAwLjcyMjM5MTg0LCAgICAgIDAuNzIzOTgwNDMsICAgICAwLjcyNTU2NTA4LAorICAgIDAuNzI3MTQ1NzksICAgICAwLjcyODcyMjUxLCAgICAgIDAuNzMwMjk1MTgsICAgICAwLjczMTg2MzkyLAorICAgIDAuNzMzNDI4NTQsICAgICAwLjczNDk4OTExLCAgICAgIDAuNzM2NTQ1NjIsICAgICAwLjczODA5ODA4LAorICAgIDAuNzM5NjQ2MzgsICAgICAwLjc0MTE5MDU1LCAgICAgIDAuNzQyNzMwNTYsICAgICAwLjc0NDI2NjQ1LAorICAgIDAuNzQ1Nzk4MTEsICAgICAwLjc0NzMyNTY2LCAgICAgIDAuNzQ4ODQ4OTIsICAgICAwLjc1MDM2Nzk0LAorICAgIDAuNzUxODgyNzMsICAgICAwLjc1MzM5MzI5LCAgICAgIDAuNzU0ODk5NTYsICAgICAwLjc1NjQwMTQ4LAorICAgIDAuNzU3ODk5MTcsICAgICAwLjc1OTM5MjQ0LCAgICAgIDAuNzYwODgxNDIsICAgICAwLjc2MjM2NjA2LAorICAgIDAuNzYzODQ2MzQsICAgICAwLjc2NTMyMjE1LCAgICAgIDAuNzY2NzkzNjEsICAgICAwLjc2ODI2MDY2LAorICAgIDAuNzY5NzIzMjQsICAgICAwLjc3MTE4MTM0LCAgICAgIDAuNzcyNjM1MDQsICAgICAwLjc3NDA4NDI3LAorICAgIDAuNzc1NTI4OTcsICAgICAwLjc3Njk2OTEzLCAgICAgIDAuNzc4NDA0ODMsICAgICAwLjc3OTgzNiwKKyAgICAwLjc4MTI2MjU4LCAgICAgMC43ODI2ODQ2MiwgICAgICAwLjc4NDEwMjA4LCAgICAgMC43ODU1MTQ5NSwKKyAgICAwLjc4NjkyMzIzLCAgICAgMC43ODgzMjY5MiwgICAgICAwLjc4OTcyNTksICAgICAgMC43OTExMjAyOSwKKyAgICAwLjc5MjUxMDAzLCAgICAgMC43OTM4OTUxMywgICAgICAwLjc5NTI3NTUxLCAgICAgMC43OTY2NTEyNCwKKyAgICAwLjc5ODAyMjIxLCAgICAgMC43OTkzODg1MywgICAgICAwLjgwMDc1MDA4LCAgICAgMC44MDIxMDY5MiwKKyAgICAwLjgwMzQ1ODk5LCAgICAgMC44MDQ4MDYzNSwgICAgICAwLjgwNjE0ODg5LCAgICAgMC44MDc0ODY2NSwKKyAgICAwLjgwODgxOTY1LCAgICAgMC44MTAxNDc4MiwgICAgICAwLjgxMTQ3MTIyLCAgICAgMC44MTI3ODk4LAorICAgIDAuODE0MTAzNDgsICAgICAwLjgxNTQxMjQsICAgICAgIDAuODE2NzE2NDMsICAgICAwLjgxODAxNTU4LAorICAgIDAuODE5MzA5ODksICAgICAwLjgyMDU5OTMyLCAgICAgIDAuODIxODgzOCwgICAgICAwLjgyMzE2MzQ1LAorICAgIDAuODI0NDM4MTUsICAgICAwLjgyNTcwNzk3LCAgICAgIDAuODI2OTcyODQsICAgICAwLjgyODIzMjgyLAorICAgIDAuODI5NDg3OCwgICAgICAwLjgzMDczNzg5LCAgICAgIDAuODMxOTgyOTcsICAgICAwLjgzMzIyMzEsCisgICAgMC44MzQ0NTgyOSwgICAgIDAuODM1Njg4NDcsICAgICAgMC44MzY5MTM3LCAgICAgIDAuODM4MTMzODcsCisgICAgMC44MzkzNDkwOSwgICAgIDAuODQwNTU5MywgICAgICAgMC44NDE3NjQ1MSwgICAgIDAuODQyOTY0NjUsCisgICAgMC44NDQxNTk3OCwgICAgIDAuODQ1MzQ5OTEsICAgICAgMC44NDY1MzQ5NywgICAgIDAuODQ3NzE0OTYsCisgICAgMC44NDg4ODk5NSwgICAgIDAuODUwMDU5ODcsICAgICAgMC44NTEyMjQ3MiwgICAgIDAuODUyMzg0NTEsCisgICAgMC44NTM1MzkyMywgICAgIDAuODU0Njg4ODgsICAgICAgMC44NTU4MzM0MSwgICAgIDAuODU2OTcyODcsCisgICAgMC44NTgxMDcyNywgICAgIDAuODU5MjM2NTQsICAgICAgMC44NjAzNjA3NCwgICAgIDAuODYxNDc5ODIsCisgICAgMC44NjI1OTM4MywgICAgIDAuODYzNzAyNjUsICAgICAgMC44NjQ4MDY0MSwgICAgIDAuODY1OTA1MDUsCisgICAgMC44NjY5OTg2MSwgICAgIDAuODY4MDg2OTksICAgICAgMC44NjkxNzAyNSwgICAgIDAuODcwMjQ4MzgsCisgICAgMC44NzEzMjE0NCwgICAgIDAuODcyMzg5MzIsICAgICAgMC44NzM0NTIwNywgICAgIDAuODc0NTA5NjMsCisgICAgMC44NzU1NjIxMywgICAgIDAuODc2NjA5NDQsICAgICAgMC44Nzc2NTE2MywgICAgIDAuODc4Njg4NjksCisgICAgMC44Nzk3MjA1NywgICAgIDAuODgwNzQ3MzIsICAgICAgMC44ODE3Njg5NCwgICAgIDAuODgyNzg1MzgsCisgICAgMC44ODM3OTY2OSwgICAgIDAuODg0ODAyODgsICAgICAgMC44ODU4MDM4OCwgICAgIDAuODg2Nzk5NzUsCisgICAgMC44ODc3OTA0NCwgICAgIDAuODg4Nzc2MDYsICAgICAgMC44ODk3NTY0NCwgICAgIDAuODkwNzMxNzUsCisgICAgMC44OTE3MDE4OCwgICAgIDAuODkyNjY2ODgsICAgICAgMC44OTM2MjY2OSwgICAgIDAuODk0NTgxMzgsCisgICAgMC44OTU1MzA5NCwgICAgIDAuODk2NDc1MzcsICAgICAgMC44OTc0MTQ2MiwgICAgIDAuODk4MzQ4ODEsCisgICAgMC44OTkyNzc4MSwgICAgIDAuOTAwMjAxNjgsICAgICAgMC45MDExMjA0MiwgICAgIDAuOTAyMDM0MDQsCisgICAgMC45MDI5NDI1NCwgICAgIDAuOTAzODQ1OTEsICAgICAgMC45MDQ3NDQxNSwgICAgIDAuOTA1NjM3MjYsCisgICAgMC45MDY1MjUzMSwgICAgIDAuOTA3NDA4MTgsICAgICAgMC45MDgyODYwNCwgICAgIDAuOTA5MTU4NzEsCisgICAgMC45MTAwMjYzMSwgICAgIDAuOTEwODg4ODUsICAgICAgMC45MTE3NDYyNiwgICAgIDAuOTEyNTk4NjEsCisgICAgMC45MTM0NDU4MywgICAgIDAuOTE0Mjg4MDQsICAgICAgMC45MTUxMjUxMywgICAgIDAuOTE1OTU3MjEsCisgICAgMC45MTY3ODQxNywgICAgIDAuOTE3NjA2MTIsICAgICAgMC45MTg0MjMsICAgICAgIDAuOTE5MjM0ODEsCisgICAgMC45MjAwNDE2MiwgICAgIDAuOTIwODQzMzYsICAgICAgMC45MjE2NDAxNiwgICAgIDAuOTIyNDMxODMsCisgICAgMC45MjMyMTg1NSwgICAgIDAuOTI0MDAwMjYsICAgICAgMC45MjQ3NzY5NywgICAgIDAuOTI1NTQ4NjcsCisgICAgMC45MjYzMTUzNywgICAgIDAuOTI3MDc3MTEsICAgICAgMC45Mjc4MzM4NiwgICAgIDAuOTI4NTg1NjUsCisgICAgMC45MjkzMzI0OSwgICAgIDAuOTMwMDc0MzksICAgICAgMC45MzA4MTEzNSwgICAgIDAuOTMxNTQzMzUsCisgICAgMC45MzIyNzA0NywgICAgIDAuOTMyOTkyNjQsICAgICAgMC45MzM3MDk5MiwgICAgIDAuOTM0NDIyMjUsCisgICAgMC45MzUxMjk3NiwgICAgIDAuOTM1ODMyMzIsICAgICAgMC45MzY1MzAwNSwgICAgIDAuOTM3MjIyOTYsCisgICAgMC45Mzc5MTA5MSwgICAgIDAuOTM4NTk0MSwgICAgICAgMC45MzkyNzI0LCAgICAgIDAuOTM5OTQ1OTQsCisgICAgMC45NDA2MTQ1OCwgICAgIDAuOTQxMjc4NTIsICAgICAgMC45NDE5Mzc1NywgICAgIDAuOTQyNTkxOTEsCisgICAgMC45NDMyNDE0MiwgICAgIDAuOTQzODg2MTYsICAgICAgMC45NDQ1MjYyLCAgICAgIDAuOTQ1MTYxNDYsCisgICAgMC45NDU3OTIwMiwgICAgIDAuOTQ2NDE3ODEsICAgICAgMC45NDcwMzg5NSwgICAgIDAuOTQ3NjU1MzgsCisgICAgMC45NDgyNjcxLCAgICAgIDAuOTQ4ODc0MTgsICAgICAgMC45NDk0NzY1NCwgICAgIDAuOTUwMDc0MzIsCisgICAgMC45NTA2Njc0NCwgICAgIDAuOTUxMjU1OTIsICAgICAgMC45NTE4Mzk4LCAgICAgIDAuOTUyNDE5MDQsCisgICAgMC45NTI5OTM3NSwgICAgIDAuOTUzNTYzODcsICAgICAgMC45NTQxMjk0NiwgICAgIDAuOTU0NjkwNDYsCisgICAgMC45NTUyNDY5MywgICAgIDAuOTU1Nzk4OTIsICAgICAgMC45NTYzNDYzMywgICAgIDAuOTU2ODg5MjcsCisgICAgMC45NTc0Mjc4LCAgICAgIDAuOTU3OTYxOCwgICAgICAgMC45NTg0OTEzMywgICAgIDAuOTU5MDE2NDQsCisgICAgMC45NTk1MzcxNSwgICAgIDAuOTYwMDUzNDQsICAgICAgMC45NjA1NjUzMywgICAgIDAuOTYxMDcyODYsCisgICAgMC45NjE1NzU5OCwgICAgIDAuOTYyMDc0ODIsICAgICAgMC45NjI1NjkyNCwgICAgIDAuOTYzMDU5NDMsCisgICAgMC45NjM1NDUyLCAgICAgIDAuOTY0MDI2NzUsICAgICAgMC45NjQ1MDQwNiwgICAgIDAuOTY0OTc3MDMsCisgICAgMC45NjU0NDU4MiwgICAgIDAuOTY1OTEwMzgsICAgICAgMC45NjYzNzA3LCAgICAgIDAuOTY2ODI2OCwKKyAgICAwLjk2NzI3ODc4LCAgICAgMC45Njc3MjY1MywgICAgICAwLjk2ODE3MDIzLCAgICAgMC45Njg2MDk2OSwKKyAgICAwLjk2OTA0NTEsICAgICAgMC45Njk0NzY0LCAgICAgICAwLjk2OTkwMzY1LCAgICAgMC45NzAzMjY3OCwKKyAgICAwLjk3MDc0NTg2LCAgICAgMC45NzExNjA5NSwgICAgICAwLjk3MTU3MjA0LCAgICAgMC45NzE5NzkwOCwKKyAgICAwLjk3MjM4MjE5LCAgICAgMC45NzI3ODEzLCAgICAgICAwLjk3MzE3NjQ4LCAgICAgMC45NzM1Njc3OCwKKyAgICAwLjk3Mzk1NTA5LCAgICAgMC45NzQzMzg1OSwgICAgICAwLjk3NDcxODE1LCAgICAgMC45NzUwOTM5LAorICAgIDAuOTc1NDY1ODMsICAgICAwLjk3NTgzMzg5LCAgICAgIDAuOTc2MTk4MiwgICAgICAwLjk3NjU1ODY5LAorICAgIDAuOTc2OTE1NDIsICAgICAwLjk3NzI2ODQ2LCAgICAgIDAuOTc3NjE3NjgsICAgICAwLjk3Nzk2MzI3LAorICAgIDAuOTc4MzA1MTYsICAgICAwLjk3ODY0MzM2LCAgICAgIDAuOTc4OTc3OTIsICAgICAwLjk3OTMwODg0LAorICAgIDAuOTc5NjM2MTksICAgICAwLjk3OTk1OTkxLCAgICAgIDAuOTgwMjgwMSwgICAgICAwLjk4MDU5NjY2LAorICAgIDAuOTgwOTA5NzYsICAgICAwLjk4MTIxOTI5LCAgICAgIDAuOTgxNTI1MzYsICAgICAwLjk4MTgyNzk3LAorICAgIDAuOTgyMTI3MDcsICAgICAwLjk4MjQyMjc3LCAgICAgIDAuOTgyNzE1MDEsICAgICAwLjk4MzAwMzkxLAorICAgIDAuOTgzMjg5NDIsICAgICAwLjk4MzU3MTU5LCAgICAgIDAuOTgzODUwMzYsICAgICAwLjk4NDEyNTg1LAorICAgIDAuOTg0Mzk4MDcsICAgICAwLjk4NDY2NywgICAgICAgIDAuOTg0OTMyNjYsICAgICAwLjk4NTE5NTEsCisgICAgMC45ODU0NTQzMiwgICAgIDAuOTg1NzEwMzIsICAgICAgMC45ODU5NjMyMywgICAgIDAuOTg2MjEyOTEsCisgICAgMC45ODY0NTk0OSwgICAgIDAuOTg2NzAyOTIsICAgICAgMC45ODY5NDMzLCAgICAgIDAuOTg3MTgwNTksCisgICAgMC45ODc0MTQ4NCwgICAgIDAuOTg3NjQ2MDQsICAgICAgMC45ODc4NzQyNywgICAgIDAuOTg4MDk5NTIsCisgICAgMC45ODgzMjE3OCwgICAgIDAuOTg4NTQxMDcsICAgICAgMC45ODg3NTc0OSwgICAgIDAuOTg4OTcwOTksCisgICAgMC45ODkxODE1OCwgICAgIDAuOTg5Mzg5MzYsICAgICAgMC45ODk1OTQyOCwgICAgIDAuOTg5Nzk2MzQsCisgICAgMC45ODk5OTU2NiwgICAgIDAuOTkwMTkyMTcsICAgICAgMC45OTAzODU5NSwgICAgIDAuOTkwNTc2OTgsCisgICAgMC45OTA3NjUzMywgICAgIDAuOTkwOTUwOTQsICAgICAgMC45OTExMzM5MywgICAgIDAuOTkxMzE0MjksCisgICAgMC45OTE0OTE5NywgICAgIDAuOTkxNjY3MDksICAgICAgMC45OTE4Mzk1OSwgICAgIDAuOTkyMDA5NTIsCisgICAgMC45OTIxNzY5NSwgICAgIDAuOTkyMzQxODIsICAgICAgMC45OTI1MDQyNCwgICAgIDAuOTkyNjY0MTYsCisgICAgMC45OTI4MjE2MywgICAgIDAuOTkyOTc2NjcsICAgICAgMC45OTMxMjkzMSwgICAgIDAuOTkzMjc5NTIsCisgICAgMC45OTM0Mjc0LCAgICAgIDAuOTkzNTcyOTUsICAgICAgMC45OTM3MTYxMiwgICAgIDAuOTkzODU3MDMsCisgICAgMC45OTM5OTU2MSwgICAgIDAuOTk0MTMxOTgsICAgICAgMC45OTQyNjYwOSwgICAgIDAuOTk0Mzk4LAorICAgIDAuOTk0NTI3NywgICAgICAwLjk5NDY1NTE5LCAgICAgIDAuOTk0NzgwNiwgICAgICAwLjk5NDkwMzgsCisgICAgMC45OTUwMjQ5MiwgICAgIDAuOTk1MTQ0MDEsICAgICAgMC45OTUyNjA5NSwgICAgIDAuOTk1Mzc1ODcsCisgICAgMC45OTU0ODg3NiwgICAgIDAuOTk1NTk5NjMsICAgICAgMC45OTU3MDg1OCwgICAgIDAuOTk1ODE1NTIsCisgICAgMC45OTU5MjA0OCwgICAgIDAuOTk2MDIzNiwgICAgICAgMC45OTYxMjQ3NCwgICAgIDAuOTk2MjI0MDUsCisgICAgMC45OTYzMjE1LCAgICAgIDAuOTk2NDE3MTEsICAgICAgMC45OTY1MTA5MiwgICAgIDAuOTk2NjAyODksCisgICAgMC45OTY2OTMxMywgICAgIDAuOTk2NzgxNTksICAgICAgMC45OTY4NjgzMSwgICAgIDAuOTk2OTUzMzcsCisgICAgMC45OTcwMzY3LCAgICAgIDAuOTk3MTE4MzUsICAgICAgMC45OTcxOTgzNCwgICAgIDAuOTk3Mjc2NzIsCisgICAgMC45OTczNTM0OSwgICAgIDAuOTk3NDI4NzIsICAgICAgMC45OTc1MDIzMywgICAgIDAuOTk3NTc0MzksCisgICAgMC45OTc2NDQ5LCAgICAgIDAuOTk3NzEzOTIsICAgICAgMC45OTc3ODE0NiwgICAgIDAuOTk3ODQ3NTYsCisgICAgMC45OTc5MTIxNywgICAgIDAuOTk3OTc1MzUsICAgICAgMC45OTgwMzcxLCAgICAgIDAuOTk4MDk3NDgsCisgICAgMC45OTgxNTY0OSwgICAgIDAuOTk4MjE0MTMsICAgICAgMC45OTgyNzA0NSwgICAgIDAuOTk4MzI1NDcsCisgICAgMC45OTgzNzkyMywgICAgIDAuOTk4NDMxNjgsICAgICAgMC45OTg0ODI4MiwgICAgIDAuOTk4NTMyNzcsCisgICAgMC45OTg1ODE1MywgICAgIDAuOTk4NjI5MDMsICAgICAgMC45OTg2NzU0MSwgICAgIDAuOTk4NzIwNTksCisgICAgMC45OTg3NjQ2MywgICAgIDAuOTk4ODA3NTUsICAgICAgMC45OTg4NDkzOSwgICAgIDAuOTk4ODkwMSwKKyAgICAwLjk5ODkyOTc0LCAgICAgMC45OTg5NjgzNiwgICAgICAwLjk5OTAwNTkxLCAgICAgMC45OTkwNDI0NSwKKyAgICAwLjk5OTA3Nzk4LCAgICAgMC45OTkxMTI1NSwgICAgICAwLjk5OTE0NjE2LCAgICAgMC45OTkxNzg4MywKKyAgICAwLjk5OTIxMDU0LCAgICAgMC45OTkyNDEzNSwgICAgICAwLjk5OTI3MTIxLCAgICAgMC45OTkzMDAyNCwKKyAgICAwLjk5OTMyODQzLCAgICAgMC45OTkzNTU3MywgICAgICAwLjk5OTM4MjIsICAgICAgMC45OTk0MDc4OSwKKyAgICAwLjk5OTQzMjc0LCAgICAgMC45OTk0NTY4MiwgICAgICAwLjk5OTQ4MDE5LCAgICAgMC45OTk1MDI3OCwKKyAgICAwLjk5OTUyNDU5LCAgICAgMC45OTk1NDU2OSwgICAgICAwLjk5OTU2NjE0LCAgICAgMC45OTk1ODU4NywKKyAgICAwLjk5OTYwNDg4LCAgICAgMC45OTk2MjMzLCAgICAgICAwLjk5OTY0MTA2LCAgICAgMC45OTk2NTgxNywKKyAgICAwLjk5OTY3NDY4LCAgICAgMC45OTk2OTA1OSwgICAgICAwLjk5OTcwNTkxLCAgICAgMC45OTk3MjA2OSwKKyAgICAwLjk5OTczNDg4LCAgICAgMC45OTk3NDg1MywgICAgICAwLjk5OTc2MTY0LCAgICAgMC45OTk3NzQyOCwKKyAgICAwLjk5OTc4NjM4LCAgICAgMC45OTk3OTgsICAgICAgICAwLjk5OTgwOTE1LCAgICAgMC45OTk4MTk4MiwKKyAgICAwLjk5OTgzMDAxLCAgICAgMC45OTk4Mzk3OCwgICAgICAwLjk5OTg0OTE0LCAgICAgMC45OTk4NTgwOCwKKyAgICAwLjk5OTg2NjY2LCAgICAgMC45OTk4NzQ3NywgICAgICAwLjk5OTg4MjU4LCAgICAgMC45OTk4ODk5NywKKyAgICAwLjk5OTg5NzA2LCAgICAgMC45OTk5MDM3NCwgICAgICAwLjk5OTkxMDEyLCAgICAgMC45OTk5MTYyLAorICAgIDAuOTk5OTIxOTgsICAgICAwLjk5OTkyNzQsICAgICAgIDAuOTk5OTMyNTksICAgICAwLjk5OTkzNzQyLAorICAgIDAuOTk5OTQyMDYsICAgICAwLjk5OTk0NjQyLCAgICAgIDAuOTk5OTUwNTMsICAgICAwLjk5OTk1NDQsCisgICAgMC45OTk5NTgwNCwgICAgIDAuOTk5OTYxNDQsICAgICAgMC45OTk5NjQ2NSwgICAgIDAuOTk5OTY3NjMsCisgICAgMC45OTk5NzA0NCwgICAgIDAuOTk5OTczMDYsICAgICAgMC45OTk5NzU1LCAgICAgIDAuOTk5OTc3NzcsCisgICAgMC45OTk5Nzk4NSwgICAgIDAuOTk5OTgxODIsICAgICAgMC45OTk5ODM2NywgICAgIDAuOTk5OTg1MzQsCisgICAgMC45OTk5ODY4OSwgICAgIDAuOTk5OTg4MjYsICAgICAgMC45OTk5ODk1NywgICAgIDAuOTk5OTkwNzYsCisgICAgMC45OTk5OTE4MywgICAgIDAuOTk5OTkyODUsICAgICAgMC45OTk5OTM3NCwgICAgIDAuOTk5OTk0NTIsCisgICAgMC45OTk5OTUyMywgICAgIDAuOTk5OTk1ODksICAgICAgMC45OTk5OTY0OCwgICAgIDAuOTk5OTk3MDIsCisgICAgMC45OTk5OTc1LCAgICAgIDAuOTk5OTk3ODUsICAgICAgMC45OTk5OTgyMSwgICAgIDAuOTk5OTk4NTcsCisgICAgMC45OTk5OTg4MSwgICAgIDAuOTk5OTk5MDUsICAgICAgMC45OTk5OTkyMywgICAgIDAuOTk5OTk5NCwKKyAgICAwLjk5OTk5OTUyLCAgICAgMC45OTk5OTk2NCwgICAgICAwLjk5OTk5OTcsICAgICAgMC45OTk5OTk4MiwKKyAgICAwLjk5OTk5OTgyLCAgICAgMC45OTk5OTk4OCwgICAgICAwLjk5OTk5OTk0LCAgICAgMC45OTk5OTk5NCwKKyAgICAwLjk5OTk5OTk0LCAgICAgMS4wLCAgICAgICAgICAgICAxLjAsICAgICAgICAgICAgMS4wLAorICAgIDEuMCwgICAgICAgICAgICAxLjAsICAgICAgICAgICAgIDEuMCwgICAgICAgICAgICAxLjAsCit9OworCitjb25zdCBmbG9hdCBmZl9vbjJhdmNfd2luZG93X3Nob3J0WzEyOF0gPSB7CisgICAgMS4zMjA2ODRlLTEyLCAgICAxLjMyMTg4NTllLTEyLCAgIDEuMzI0MTE5ZS0xMiwgICAxLjMyNjkxNzJlLTEyLAorICAgIDEuMzI5NzkwN2UtMTIsICAgMS4zMzE2OTkzZS0xMiwgICAxLjMzMjE2MThlLTEyLCAgMS4zMzAzNDA5ZS0xMiwKKyAgICAxLjMyOTcxNjNlLTEyLCAgIDEuMzU5ODA1MmUtMTIsICAgMS42MjI0NDg5ZS0xMiwgIDMuMjM4NDU3ZS0xMiwKKyAgICAxLjEzNzY4NzRlLTExLCAgIDQuNjQzNDQ1NGUtMTEsICAgMS44MDU1N2UtMTAsICAgIDYuNDQ4OTc1OGUtMTAsCisgICAgMi4xMTc5NTY5ZS05LCAgICA2LjQ0Mjk2MzVlLTksICAgIDEuODI5Mjg4NWUtOCwgICA0Ljg4MDA0M2UtOCwKKyAgICAxLjIzMDM0NjdlLTcsICAgIDIuOTQ2MTk1ZS03LCAgICAgNi43Mjk3NjRlLTcsICAgIDAuMDAwMDAxNDcxODc5MiwKKyAgICAwLjAwMDAwMzA5MjQ1NjYsIDAuMDAwMDA2MjU5NjEwOSwgMC4wMDAwMTIyMzgwMTIsIDAuMDAwMDIzMTYyMDg1LAorICAgIDAuMDAwMDQyNTIzMDg2LCAgMC4wMDAwNzU4NjQzMjksICAwLjAwMDEzMTc0MTMzLCAgMC4wMDAyMjMwMDUwNiwKKyAgICAwLjAwMDM2ODQ2MTIyLCAgIDAuMDAwNTk0OTQ0MTEsICAgMC4wMDA5Mzk4MTgzMywgIDAuMDAxNDUzODgzLAorICAgIDAuMDAyMjA0NjAzNywgICAgMC4wMDMyNzk1MzI4LCAgICAwLjAwNDc4OTcxMSwgICAgMC4wMDY4NzI3NzMyLAorICAgIDAuMDA5Njk1NDA0MiwgICAgMC4wMTM0NTQ3NiwgICAgICAwLjAxODM3ODQxNiwgICAgMC4wMjQ3MjI0NCwKKyAgICAwLjAzMjc2NzIxOCwgICAgIDAuMDQyODEwNzU3LCAgICAgMC4wNTUxNTkzODMsICAgIDAuMDcwMTE1ODcyLAorICAgIDAuMDg3OTY1Mjg3LCAgICAgMC4xMDg5NTkxNywgICAgICAwLjEzMzI5ODcsICAgICAgMC4xNjExMTc4NywKKyAgICAwLjE5MjQ2Nzk3LCAgICAgIDAuMjI3MzA0MjEsICAgICAgMC4yNjU0NzU5OSwgICAgIDAuMzA2NzIxODcsCisgICAgMC4zNTA2Njk3NCwgICAgICAwLjM5Njg0MzM0LCAgICAgIDAuNDQ0Njc0MzcsICAgICAwLjQ5MzUyMDg2LAorICAgIDAuNTQyNjkwMDQsICAgICAgMC41OTE0NjUzNSwgICAgICAwLjYzOTEzNTYsICAgICAgMC42ODUwMjQ0NCwKKyAgICAwLjcyODUxODYxLCAgICAgIDAuNzY5MDkyNzQsICAgICAgMC44MDYzMjkxMywgICAgIDAuODM5OTMxODUsCisgICAgMC44Njk3MzI4LCAgICAgICAwLjg5NTY5MTE2LCAgICAgIDAuOTE3ODg1MjQsICAgICAwLjkzNjQ5ODExLAorICAgIDAuOTUxNzk4MTQsICAgICAgMC45NjQxMTYzOSwgICAgICAwLjk3MzgyMjc3LCAgICAgMC45ODEzMDIyLAorICAgIDAuOTg2OTM0MTMsICAgICAgMC45OTEwNzQ5MiwgICAgICAwLjk5NDA0NTIsICAgICAgMC45OTYxMjI1NCwKKyAgICAwLjk5NzUzNzg1LCAgICAgIDAuOTk4NDc2NTYsICAgICAgMC45OTkwODIyMSwgICAgIDAuOTk5NDYyMDcsCisgICAgMC45OTk2OTMzOSwgICAgICAwLjk5OTgzMDE5LCAgICAgIDAuOTk5OTA4NTcsICAgICAwLjk5OTk1MjA4LAorICAgIDAuOTk5OTc1NSwgICAgICAgMC45OTk5ODc2NiwgICAgICAwLjk5OTk5MzgsICAgICAgMC45OTk5OTY3OCwKKyAgICAwLjk5OTk5ODIxLCAgICAgIDAuOTk5OTk4OTMsICAgICAgMC45OTk5OTkyMywgICAgIDAuOTk5OTk5NDYsCisgICAgMC45OTk5OTk1OCwgICAgICAwLjk5OTk5OTcsICAgICAgIDAuOTk5OTk5ODIsICAgICAwLjk5OTk5OTk0LAorICAgIDEuMDAwMDAwMSwgICAgICAgMS4wMDAwMDAyLCAgICAgICAxLjAwMDAwMDQsICAgICAgMS4wMDAwMDA1LAorICAgIDEuMDAwMDAwNiwgICAgICAgMS4wMDAwMDA4LCAgICAgICAxLjAwMDAwMSwgICAgICAgMS4wMDAwMDEsCisgICAgMS4wMDAwMDExLCAgICAgICAxLjAwMDAwMTIsICAgICAgIDEuMDAwMDAxMywgICAgICAxLjAwMDAwMTQsCisgICAgMS4wMDAwMDE0LCAgICAgICAxLjAwMDAwMTUsICAgICAgIDEuMDAwMDAxNSwgICAgICAxLjAwMDAwMTUsCisgICAgMS4wMDAwMDE1LCAgICAgICAxLjAwMDAwMTQsICAgICAgIDEuMDAwMDAxNCwgICAgICAxLjAwMDAwMTQsCisgICAgMS4wMDAwMDEzLCAgICAgICAxLjAwMDAwMTMsICAgICAgIDEuMDAwMDAxMiwgICAgICAxLjAwMDAwMTIsCisgICAgMS4wMDAwMDExLCAgICAgICAxLjAwMDAwMTEsICAgICAgIDEuMDAwMDAxMSwgICAgICAxLjAwMDAwMTEsCit9OworCitjb25zdCBkb3VibGUgZmZfb24yYXZjX3RhYl8xMF8xW10gPSB7CisgICAgMC4wMDMzMzU3MjUzLCAtMC4wMTI1ODA3NTIsIC0wLjAwNjI0MTQ5MDIsIDAuMDc3NTcxNDk0LCAtMC4wMzIyNDQ4NywKKyAgICAtMC4yNDIyOTQ4OSwgICAwLjEzODQyODE1LCAgIDAuNzI0MzA4NTMsICAgMC42MDM4MjkyNywgICAwLjE2MDEwMjQKK307CisKK2NvbnN0IGRvdWJsZSBmZl9vbjJhdmNfdGFiXzEwXzJbXSA9IHsKKyAgICAtMC4xNjAxMDI0LCAgICAwLjYwMzgyOTI3LCAgLTAuNzI0MzA4NTMsICAgMC4xMzg0MjgxNSwgIDAuMjQyMjk0ODksCisgICAgLTAuMDMyMjQ0ODcsICAtMC4wNzc1NzE0OTQsIC0wLjAwNjI0MTQ5MDIsIDAuMDEyNTgwNzUyLCAwLjAwMzMzNTcyNTMsCisgICAgIDAuMzMyNjY2OTksICAgMC44MDY4OTAxNSwgICAwLjQ1OTg4MjQ0LCAgLTAuMTM1MDA5OTQsIC0wLjA4NTQ0MjY1NCwKKyAgICAgMC4wMzUyMjY1NDIsIC0wLjAzNTIyNjU0MywgLTAuMDg1NDQyNjU2LCAgMC4xMzUwMDk5NCwgIDAuNDU5ODgyNDYsCisgICAgLTAuODA2ODkwMTcsICAgMC4zMzI2NjcKK307CisKK2NvbnN0IGRvdWJsZSBmZl9vbjJhdmNfdGFiXzIwXzFbXSA9IHsKKyAgICAtMC4wMDE0NDE2OTYxLCAtMC4wMDA1NjIxNDk3NCwgMC4wMjA5NDg5MTEsICAgMC4wMjUzNjMzMzUsICAgLTAuMTA0Mjc4NDUsCisgICAgLTAuMjMxODUwMywgICAgIDAuMDY4OTI2MTMsICAgIDAuNjM4MTA1MTMsICAgIDAuNjg0MzI1MSwgICAgICAwLjIwMTYyMTg1LAorICAgIC0wLjAzMzU4MiwgICAgICAwLjA3MzEzNjYzLCAgICAwLjA4MTQzOTY0LCAgIC0wLjAwNjMxMzc2OTgsICAtMC4wMTI2ODg2NjEsCisgICAgIDAuMDA4OTY4NTEyNywgIDAuMDAzNTUzNDg0MywgLTAuMDAxNjA3ODI3MywgLTAuMDAwMDk1Njc3NDY0LCAwLjAwMDI0NTM3NTYKK307CisKK2NvbnN0IGRvdWJsZSBmZl9vbjJhdmNfdGFiXzIwXzJbXSA9IHsKKyAgICAtMC4wMDAyNDUzNzU1OTk3MzI1MDg5LCAtMC4wMDAwOTU2Nzc0NjM4OTU2OTkyNCwgIDAuMDAxNjA3ODI3Mjk4MjQ3MjYxLAorICAgICAwLjAwMzU1MzQ4NDI5NjEyNjI0NCwgIC0wLjAwODk2ODUxMjY5MDIyMzE2NiwgICAtMC4wMTI2ODg2NjA5ODYxNjc3MiwKKyAgICAgMC4wMDYzMTM3Njk3OTMxMTcxNzcsICAgMC4wODE0Mzk2Mzk5MTEyMjAyOSwgICAgLTAuMDczMTM2NjI5OTIwMjcxNjUsCisgICAgLTAuMDMzNTgxOTk5OTYzMzkxMjksICAgLTAuMjAxNjIxODQ5NzgwMjA2MiwgICAgICAwLjY4NDMyNTA5OTI1Mzk5NzQsCisgICAgLTAuNjM4MTA1MTI5MzA0MzgzMiwgICAgIDAuMDY4OTI2MTI5OTI0ODYxNjMsICAgICAwLjIzMTg1MDI5OTc0NzI1MzMsCisgICAgLTAuMTA0Mjc4NDQ5ODg2MzIzMSwgICAgLTAuMDI1MzYzMzM0OTcyMzUwNywgICAgICAwLjAyMDk0ODkxMDk3NzE2Mjk5LAorICAgICAwLjAwMDU2MjE0OTczOTM4NzE4NDQsIC0wLjAwMTQ0MTY5NjA5ODQyODM2NQorfTsKKworY29uc3QgZG91YmxlIGZmX29uMmF2Y190YWJfNDBfMVtdID0geworICAgIC0wLjAwMDAwMTc0NDU0NTcsIC0wLjAwMDAwMTgxNDQ0MSwgICAwLjAwMDAzODY3NjAwOCwgIDAuMDAwMDQ1NzE2MTY5LAorICAgIC0wLjAwMDQxNzg5NDkyLCAgIC0wLjAwMDYyMzE1MTQ5LCAgICAwLjAwMjcwNTI0NTcsICAgIDAuMDA1Mzc1MzMwOCwKKyAgICAtMC4wMTA1NzIzOTYsICAgICAtMC4wMzA3MjYzOTQsICAgICAgMC4wMTg3MTc4NSwgICAgICAwLjExNTg1MzE1LAorICAgICAwLjAzOTU4MDY4LCAgICAgIC0wLjI1MDAwMjQyLCAgICAgIC0wLjI5ODg2Mjc0LCAgICAgIDAuMTgyODcxNzYsCisgICAgIDAuNjU3ODE4ODUsICAgICAgIDAuNTQ4Njg2LCAgICAgICAgIDAuMTc2OTY4MzksICAgICAgMC4wODMzMDM3MiwKKyAgICAgMC4xNDIzNDU4MiwgICAgICAgMC4wNjQxODc3NzgsICAgICAtMC4wMzM5NjAxNSwgICAgIC0wLjAxMzMwMjg3MSwKKyAgICAgMC4wMjA2MTg4NTksICAgICAgMC4wMDE4OTg0MDkzLCAgICAtMC4wMTA1NjEyNDYsICAgIC0wLjAwMDEwOTE4MDM2LAorICAgICAwLjAwMzUxOTAyNTMsICAgIC0wLjAwMDU3Njc0MDI0LCAgIC0wLjAwMTAyNjM0NDEsICAgIDAuMDAwMzAxMzE2MTgsCisgICAgIDAuMDAwMjI2MTM2ODcsICAgLTAuMDAwMDg5NjM3OTY5LCAgLTAuMDAwMDMyMjQ4NDQ0LCAgMC4wMDAwMTg4MjY0MSwKKyAgICAgMC4wMDAwMDI5MTE5Njg3LCAtMC4wMDAwMDIzOTQwODQ0LCAtMS4zOTQ0MzY5ZS03LCAgICAxLjM0MDcyMDVlLTcsCit9OworCitjb25zdCBkb3VibGUgZmZfb24yYXZjX3RhYl80MF8yW10gPSB7CisgICAgLTEuMzQwNzIwNTAyMTU1ODY3ZS03LCAgICAtMS4zOTQ0MzY5MDIyNDIyNDNlLTcsICAgIDAuMDAwMDAyMzk0MDg0NDAzODQ5NjY3LAorICAgICAwLjAwMDAwMjkxMTk2ODcwNDY4MjQyMSwgLTAuMDAwMDE4ODI2NDEwMDMwMjcyNzEsIC0wLjAwMDAzMjI0ODQ0NDA1MTg1NTIyLAorICAgICAwLjAwMDA4OTYzNzk2OTE0NDEzNzA5LCAgIDAuMDAwMjI2MTM2ODcwMzYzNjI2MiwgIC0wLjAwMDMwMTMxNjE4MDQ4NDUxMzksCisgICAgLTAuMDAxMDI2MzQ0MTAxNjUwMzUzLCAgICAgMC4wMDA1NzY3NDAyNDA5MjczOTMzLCAgIDAuMDAzNTE5MDI1MzA1NjU4NTYzLAorICAgICAwLjAwMDEwOTE4MDM2MDE3NTU2MTEsICAgLTAuMDEwNTYxMjQ2MDE2OTgyMzksICAgIC0wLjAwMTg5ODQwOTMwMzA1MjYyNiwKKyAgICAgMC4wMjA2MTg4NTkwMzMxNTQ5NSwgICAgICAwLjAxMzMwMjg3MTAyMTM5MDksICAgICAtMC4wMzM5NjAxNTAwNTQ2MDc2MywKKyAgICAtMC4wNjQxODc3NzgxMDMyMTM0LCAgICAgICAwLjE0MjM0NTgyMDIyODg5MDksICAgICAtMC4wODMzMDM3MjAxMzM5NTE2NywKKyAgICAgMC4xNzY5NjgzOTAyODQ1NjM3LCAgICAgIC0wLjU0ODY4NjAwMDg4MjI4MjQsICAgICAgMC42NTc4MTg4NTEwNTc3NjcxLAorICAgIC0wLjE4Mjg3MTc2MDI5NDA1NjIsICAgICAgLTAuMjk4ODYyNzQwNDgwNTY4NywgICAgICAwLjI1MDAwMjQyMDQwMjAwMTgsCisgICAgIDAuMDM5NTgwNjgwMDYzNjQ1MzksICAgICAtMC4xMTU4NTMxNTAxODYyOTA5LCAgICAgIDAuMDE4NzE3ODUwMDMwMDk4MTQsCisgICAgIDAuMDMwNzI2Mzk0MDQ5NDA3NzgsICAgICAtMC4wMTA1NzIzOTYwMTcwMDAzMiwgICAgLTAuMDA1Mzc1MzMwODA4NjQzNDg2LAorICAgICAwLjAwMjcwNTI0NTcwNDM1MDAxMiwgICAgIDAuMDAwNjIzMTUxNDkxMDAyMDIyMiwgIC0wLjAwMDQxNzg5NDkyMDY3MTk3MTQsCisgICAgLTAuMDAwMDQ1NzE2MTY5MDczNTExMjEsICAgMC4wMDAwMzg2NzYwMDgwNjIxOTA2OSwgIDAuMDAwMDAxODE0NDQxMDAyOTE3NjA2LAorICAgIC0wLjAwMDAwMTc0NDU0NTcwMjgwNTIxNAorfTsKKworY29uc3QgZG91YmxlIGZmX29uMmF2Y190YWJfODRfMVtdID0geworICAgIC0wLjAwMzgzNDYwNTU2OTM0MDIxNCwgICAgLTAuMDEzOTk2NjY0OTM4ODA2NzUsICAgICAtMC4wMjQyMzUyMjM1NDIwMjUzMiwKKyAgICAtMC4wMjA5ODY2MDcyNTkwOTQ1MywgICAgIC0wLjAwMzAzMzgxMTk5MTE0OTk2OCwgICAgIDAuMDI1ODA5Njg3OTQ4NDU0MDksCisgICAgIDAuMDUwMjIyMDAxMDY2OTg2MjcsICAgICAgMC4wNTQ4MDEwNjI3OTA1OTY1MiwgICAgICAwLjAzNzA1MjcxOTQ1NTQ3NDUsCisgICAgIDAuMDEyOTM5NDM0MzE4OTMzNjMsICAgICAgMC4wMTI4NzQwOTg2MDgwMjMsICAgICAgICAwLjA2MjQyMDA3NjY5NzUyMjI4LAorICAgICAwLjE3MTE2NzQ3MjAwNjcwMDgsICAgICAgIDAuMzE2ODk4NTMzOTMzMjUwMywgICAgICAgMC40NDYzMjI0NjQ1NDQwMzEyLAorICAgICAwLjQ5OTczMDc4NDMyOTA2MzYsICAgICAgIDAuNDQyNjgwMTk5MzI3OTA1LCAgICAgICAgMC4yODYyOTc0NDMyNTIzMTYyLAorICAgICAwLjA4MTkyOTIyOTk1NDgyMzI3LCAgICAgLTAuMTAwNjg3ODQ4NjMwMzg4LCAgICAgICAtMC4yMDEwNzQ5ODkwMDczNjY4LAorICAgIC0wLjE5NzA1NjQ3MDU3OTcxMjUsICAgICAgLTAuMTEzNjM2MzU0MTM1NzE5OCwgICAgICAtMC4wMDY0ODI1NTQxNzYwOTg4MDQsCisgICAgIDAuMDY5ODM4NTMxNTMyNTM0MjksICAgICAgMC4wODk1ODczNDY5NzQ0NzM4MiwgICAgICAwLjA1OTgzODQzNjQ4NDIwMTYsCisgICAgIDAuMDA5NjI3OTUzNjg0NTM4NjkxLCAgICAtMC4wMjc3NjUzMDI5MTkzNTIwOSwgICAgIC0wLjAzNDg1Mzg0MzU4ODI0NjA5LAorICAgIC0wLjAxNjM4NDMwOTg3OTYyNjI5LCAgICAgIDAuMDExMzI3ODc5NzA4Nzc4ODUsICAgICAgMC4wMjc0NDY5NzYwNzQzMzAzOCwKKyAgICAgMC4wMjI4MDA4MjU2NDI3NzcwNSwgICAgICAwLjAwMzgxNzYwMTY1Njg2MjU1OSwgICAgLTAuMDE1MzYxMjQxMDYxNzM4MzUsCisgICAgLTAuMDIwNzA5NDM0NjkyMjI1NDksICAgICAtMC4wMTI4NjY1MTcxODQxNjI4MiwgICAgICAwLjAwMDU2MzI1NzQ0ODQ0MzUxMzgsCisgICAgIDAuMDA3NTc3NDk2NTk5NjkwMTQzLCAgICAgMC4wMTAxNDAyMjk3OTU5NDAwNywgICAgICAwLjAwNjQwMDMxNjQ1NDM0OTg1NSwKKyAgICAtMC4wMDEzMTczMDkwNjcwMzkyMzksICAgIC0wLjAwMzE3OTQwMzM2NzgxNzc3LCAgICAgLTAuMDAyNDA1ODQyOTAxMTY0NDY2LAorICAgIC0wLjAwMTY2MTc0NTg1NjUyOTUwMywgICAgLTAuMDAwMDUzODAxNjExMDExMzMwMjYsICAgMC4wMDA5ODk4MzE2NDcyNTk1NTk0LAorICAgICAwLjAwMDcwMzk3NjU3ODcyNjg5MjUsICAgLTAuMDAwMTg5NjYxNzAzMjQwMTA5LCAgICAtMC4wMDAxMTgyNjc0OTYwNTcwMjY2LAorICAgICAwLjAwMDIxMTUwNTEyNzAwMzcyMjUsICAgLTAuMDAwMDg1NjU2NDk0MzQ2MDQwNTksICAtMC4wMDAxMjUyODA2MjIwMTk3MzIzLAorICAgICAwLjAwMDE1MDAwMTI5NzQ1NTc2NzEsICAgIDAuMDAwMDI5NTcyMDg1NjE0NDU3MzcsICAtMC4wMDAxMTg4ODI0NTczNTcwOTIsCisgICAgLTAuMDAwMDA3NDIxOTk2Mjg0MTQ0ODMyLCAgMC4wMDAwNDM1MTAxNTA2MTU0NzM4OCwgIC0wLjAwMDAwNTczNzA5OTM3NzU0NTI0OCwKKyAgICAtMC4wMDAwMTY0NzQ3MDU3MjU0MDUzLCAgICAwLjAwMDAxOTIzNDgyNjYwMDAyNTE4LCAgLTAuMDAwMDEwOTMwMzE1OTM5MzgxMzcsCisgICAgLTAuMDAwMDEwMDI3OTIwOTUwNTE2MjEsICAgMC4wMDAwMTI1MDU3MzQyMzg4MDM3NiwgICAwLjAwMDAwNDEyNzA2MTU3MDYwOTg3MSwKKyAgICAtMC4wMDAwMDM0NTgyNDQzNDE3MjA2ODMsIC0wLjAwMDAwMzA1ODk5MzMzNDU5NzgxNSwgIDAuMDAwMDAyMTYwNTIwOTQzNDE4MzI5LAorICAgICA4LjkwNzQxNDkwNDE5NzE2NGUtNywgICAgLTAuMDAwMDAxMzE2MjUyOTIzMDg1MzM2LCAgMy42ODEyNTU0MTU5OTgzOTRlLTcsCisgICAgIDYuMjQ1ODY3NTMzMjU4MTA4ZS03LCAgICAtMS4xMjk5MjUyMTMwNjk5MjFlLTcsICAgICAzLjMxNTgzOTQ0NjkyMjM2NGUtNywKKyAgICAtMS4zNTY1NzIwNzE4OTY5NjNlLTcsICAgIC00LjMxODMwOTk3NzM2NTk2MWUtNywgICAgLTEuMzY3NTAzNTUzMzY1NTIzZS03LAorICAgICA0LjQ3MDgyODk2NTk2ODMwM2UtOCwgICAgIDkuMjEyOTAyODU3MzU0MTk2ZS04LCAgICAgMy42OTU1NDc3NTUwMzYyMjRlLTgsCisgICAgIDEuNTA1NzY2MTk3OTc5MTQ5ZS04LCAgICAtNi45NTg5OTQwNDcxNTI5NzRlLTksICAgIC04Ljc1ODYzMTIwMjA1Njk5N2UtOQorfTsKKworY29uc3QgZG91YmxlIGZmX29uMmF2Y190YWJfODRfMltdID0geworICAgICAwLjAwMjcxNTM0OTY1MDkyMjIzMiwgICAtMC4wMTAzMzA1MDc1MDE1MjUyNCwgICAgIC0wLjAxNTI4MTcyOTQyNzkxMzcxLAorICAgICAwLjAwNTgzODcyMjUwODk5NDA0NywgICAgMC4wMTU5OTA4NjAyNDM3MTE4MiwgICAgIC0wLjAxNzM3NTM1MTgzNTIyMTQ3LAorICAgIC0wLjAxNDE4NTk2NDUyMTM1NDMxLCAgICAgMC4wNTk2OTY3NzI1MjE1MTQ1NCwgICAgICAwLjA3MTM5NzM1OTY2MDQ2MzQ4LAorICAgIC0wLjA2Mzc5OTI3OTkwMjA1MTcxLCAgICAtMC4xNTE2MTc0NDcxODAxMTkxLCAgICAgICAwLjAwODM2NTc5Mjg3Mzc2OTA5NiwKKyAgICAgMC4xODY2NzE0OTE1OTU4MDIxLCAgICAgIDAuMDQ0MzI0MDUzNTEwOTk4OTMsICAgICAtMC4yMTc5ODc1MTg0Mjg1NzAzLAorICAgIC0wLjEwODk1ODU1Nzc2OTA1MjksICAgICAgMC4yNzYxMzIxMDcwNzcyODQ3LCAgICAgICAwLjI5NDk0OTQxNjY1NTM3NywKKyAgICAtMC4xODExMDY4NTMzMjkxMzczLCAgICAgLTAuNDcxMDY2MjAzMTI5OTYwMSwgICAgICAtMC4xMzk3Njc5MjYzNzk5MzU5LAorICAgICAwLjMzODY2MzM0MzI5NTY5ODUsICAgICAgMC4zNTg4OTUwODYxMjkyOTE2LCAgICAgICAwLjAzMTk4MzM4MzkyOTEwMDMzLAorICAgIC0wLjE4MDExMzAwMjYzOTQ0MDQsICAgICAtMC4xNzg2MjIyNjYyMjY3NjEsICAgICAgIC0wLjEyNzA4NjM1NzAyOTQyMjQsCisgICAgLTAuMDMzMjc4NjExMDkyNjA5NSwgICAgICAwLjEzMjY2MTk3NDg2NDE3NDEsICAgICAgIDAuMjA3NzQyMTAxNTE4NTIyNiwKKyAgICAgMC4wNzAyNzYyNDg4NDAzMzAzMywgICAgLTAuMTA2NTQ4NjA0NDUyMjk5MywgICAgICAtMC4xMjU4ODQ3MzE3NTAxOTQsCisgICAgLTAuMDM5OTg5NzI2NDU0MDQ2OCwgICAgICAwLjAwMzY4NzE0NDI0MTU2MDQwMywgICAgIDAuMDE2MDkwMDQ2ODE1OTU0ODEsCisgICAgIDAuMDQ5NTAyMTI0OTMxMzU2MDYsICAgICAwLjA1NzQ4NjgxNTI0NjgyNzgxLCAgICAgIDAuMDA0MDQxODQ0NzcxNTc0MDc0LAorICAgIC0wLjA0MTQyMTIyMzQ1NjM5NzcyLCAgICAtMC4wMjU1OTMxMDA3MTMwMjI2OSwgICAgICAwLjAwMjc1NTMxNjY0MTQ4NjE0NCwKKyAgICAgMC4wMDMxODQ5OTc0MjE5NTE4NTMsICAgLTAuMDA1NTMxMTE2ODEwOTcxNTA2LCAgICAgMC4wMDgzMzgxOTExMDM2MjE5MTEsCisgICAgIDAuMDEyNTI2MTYxNTI0NDYxMTQsICAgIC0wLjAwMzMxMjMwODUzNjI5ODM3MiwgICAgLTAuMDA3MTYxNDk4ODE0NTE5ODQ4LAorICAgICAwLjAwMTMzNzc0NTIwOTEyMjQ2NSwgICAgMC4wMDIzNDMzMzI2MTc5MzMwNzMsICAgIC0wLjAwMTYyMTA5ODc5MDIzODEyNiwKKyAgICAtMC4wMDEyOTY4MjU2OTQwMjAzMywgICAgIDAuMDAxNDkxMDI4MjY4MjUxNzczLCAgICAgMC4wMDAzMDQ0MTUzNDQ2Mjc4MTg4LAorICAgIC0wLjAwMDcwNDg4MzQ5MjY3ODg0NjMsICAgMC4wMDAwNDQ0NTEzMTI1MDEyNDA1OCwgICAwLjAwMDM2MzU3OTA4NDg2MjI0NzYsCisgICAgLTAuMDAwMTQzNTMzNzMyODg3MjExLCAgIC0wLjAwMDAyOTcyMzkwNzczOTk3OTA1LCAgIDAuMDAwMTE3NjA5NDk3MTczNzUwOSwKKyAgICAtMC4wMDAwNjE3MTkwODkwODIxNzAxOSwgLTAuMDAwMTA4NDIzMTkwMjk2MDEwOSwgICAgMC4wMDAwNzg5Njk3MzQ0NDg0MDc1MiwKKyAgICAgMC4wMDAwNDk5OTk1OTk1ODQzODkxLCAgLTAuMDAwMDY0NDQ5MDY3NTk4NjQwMzgsICAtMC4wMDAwMTgzMjEwMTEwNjE5NDIsCisgICAgIDAuMDAwMDE0ODI0ODExMzAzNTQ0OTcsICAwLjAwMDAxMDU4OTM0MjYyODUxMjM1LCAgLTAuMDAwMDA0Nzk4NDI0NDMzMzQyNjExLAorICAgIC00Ljc2MTI3Njg2OTQ3Mzk0MmUtNywgICAgMC4wMDAwMDE4ODYxNzc1NTA3MDU3OCwgIC0wLjAwMDAwMTY3NDYzNDQxODAxNTEwNywKKyAgICAtMS41Mzk0NDMzMDY0NTQ2NWUtNywgICAgIDkuMjQwMTIzNjMzNTkyMzcxZS03LCAgICAtMC4wMDAwMDEyMzU2MzAyMzUwMTQ3NzksCisgICAgIDQuOTI1ODkxNjA2ODIzMjM2ZS04LCAgICAwLjAwMDAwMTIwNjYxNTM1NTE4OTc0MywgIDMuNjQ3NjIzODE3NjE3ODcxZS03LAorICAgIC0xLjA4NzI2NzUzMzg2Mjc5N2UtNywgICAtMi41MjkwNTI0NDMxNjk2OTNlLTcsICAgIC0xLjE5NjEwMjYzMDI0NzdlLTcsCisgICAgLTQuODczNTY5NTc0MzI0OTQzZS04LCAgICAyLjI1MjM1MTEwODc5OTYxMmUtOCwgICAgIDIuODM0ODIyNDcwODcwMDIxZS04Cit9OworCitjb25zdCBkb3VibGUgZmZfb24yYXZjX3RhYl84NF8zW10gPSB7CisgICAgLTAuMDA0MzQ2NzYyMzE2NjQxNTksICAgICAgMC4wMDY3MTQxMjMwMDUyNjc5NTMsICAgICAwLjAwODY5ODA1NDQwNzQzNzUzMiwKKyAgICAtMC4wMTM3MDg0NjUyMzYwMTk0MSwgICAgICAwLjAxMDEyODI4OTQxNzI1NzQ5LCAgICAgLTAuMDA3MDY4MDc4OTM1NjU4NjI1LAorICAgIC0wLjAwODEzODM0NjAwOTU1ODQzNywgICAgIDAuMDQ2NzM1MzAyODc4MzQwNiwgICAgICAtMC4wNjU4MzgxNDk3MTc2MzU4LAorICAgICAwLjAxMzEwMDY3ODI4NTk1OTQzLCAgICAgIDAuMDcyNjkyNzk2MTc0ODAyMzIsICAgICAtMC4xMDY5NTY0OTA5MDIxMTA0LAorICAgICAwLjA2NzYyNjkxMjgyNDI2MjY0LCAgICAgIDAuMDEwMzQwMzUwNjUzMTA5OTMsICAgICAtMC4xMTc1Njk5NjA2MDk3Nzg1LAorICAgICAwLjE5MjgxMjE1NzU2OTEzNSwgICAgICAgLTAuMTA4NDQwOTQzMjg0OTM4NCwgICAgICAtMC4xMzUzMzk0MDgyNDQ5NzI1LAorICAgICAwLjI5MDU4Nzk5OTM5MTc2OSwgICAgICAgLTAuMTY2NTkzNTIwMjc3OTMzNiwgICAgICAtMC4wOTkyNzk4NjIyMjgyNzc5MSwKKyAgICAgMC4yMzk0MzE2MzQ5MzY0NzcxLCAgICAgIC0wLjE5NjkzNzY4MDI5NDk5MSwgICAgICAgIDAuMDQ2NzUwMzU2MzI3NTc0NjcsCisgICAgIDAuMTYwNzM3NjAzMTI0NzExLCAgICAgICAtMC4yODY2OTUzNDc1NTE3Mjk5LCAgICAgICAwLjExNTMzNTMwNDUwMjU3LAorICAgICAwLjIzMTM4MDgzNDc0ODUxNzQsICAgICAgLTAuMjg1OTU1MjA1OTAwODE3LCAgICAgICAtMC4wNzAzMzA0Njg5OTY0NDE0MiwKKyAgICAgMC4zMDEwODA5MzQxMTUzNjA0LCAgICAgIC0wLjAzNzExNTU2MzE5MjA0ODE0LCAgICAgLTAuMjg1NDI2MTAyMTg5MjE3MiwKKyAgICAgMC4xMzI2MjY2MTkwNzI2ODQxLCAgICAgICAwLjIzMzQ0NDIwMDA2OTYxNDIsICAgICAgLTAuMjE2MDQxMDU1NDY3MDQyOCwKKyAgICAtMC4xMjI1NzUzMDk2MTIzMDgsICAgICAgICAwLjIxODY4MDg5OTU4NTk2NjQsICAgICAgIDAuMDI1NDQwNzU1MDEzNzQ5NjEsCisgICAgLTAuMTY2MDM1ODk5MzY2NzIzNiwgICAgICAgMC4wMjAwOTE5NjE5NjYxNDUyMywgICAgICAwLjExNjI1ODM5OTQxNTM4MTIsCisgICAgLTAuMDM5OTE5NTg2MDgxMzg2ODIsICAgICAtMC4wNzExNTk3NTYzNzc0OTIwMywgICAgICAwLjA0MjcwNDQ0MDQ2NTEzODYzLAorICAgICAwLjAzNTM2NjUxODc5MTU3NzY0LCAgICAgLTAuMDI2NTU5NDAxMzY5NjEyMTksICAgICAtMC4wMTY2NTQxOTg4ODAwMDA5LAorICAgICAwLjAxODExNzU4NjUzNjYzNzkxLCAgICAgIDAuMDAzMTYxMDY2ODc5Mjk5MTE0LCAgICAtMC4wMDY1OTAyNDkxMzUxMjI2MzYsCisgICAgIDAuMDAwMDIyNDY2MDM3MzM0NzQ0MywgICAgMC4wMDI3NjQ4MzcyOTcwMTcwODIsICAgIC0wLjAwMTgxNjA1MDA5ODA4OTg4NCwKKyAgICAgMC4wMDAyMjEzODU4MjQ3ODI3NTgsICAgICAwLjAwMTMyNTEyOTE2OTkxNjQ4MSwgICAgLTAuMDAwOTMxMzA0ODQ4NTA1NjQ2NywKKyAgICAtMC4wMDEwMDI5OTc2NDQ2MTQ2NTEsICAgICAwLjAwMDY0NjEzOTA5NjA4MTMyMjMsICAgIDAuMDAwNTA5MTg0MzgwODc1NzEwMiwKKyAgICAtMC4wMDA0OTgxODMxMDI3NzQ5MTg1LCAgIC0wLjAwMDIxMzIxMTgzMTgzNzAzMzgsICAgIDAuMDAwMTY5MjA0MTMyOTEyMTk5OSwKKyAgICAgMC4wMDAwOTIwMzI4MDk4OTUxOTAwNiwgIC0wLjAwMDA3MjY2MzQzMDEwNjE0ODUsICAgLTAuMDAwMDAzNzc2MTczOTU0MTgwNDc2LAorICAgICAwLjAwMDAwNTY1MDI4NjU1OTA1NzQwOSwgIDEuMDE1ODcxMjM1MTg4Njc4ZS04LCAgICAgMC4wMDAwMDkyOTc2OTU2Njg0Njg2MjYsCisgICAgIDAuMDAwMDA4MjE3MTcyNjkxMDM3MjYzLCAtMC4wMDAwMDUzNTI3OTM1OTc2NzQyMjEsIC0wLjAwMDAwNDI5MzA0MzgzMDkxNDIwNiwKKyAgICAgMC4wMDAwMDQwNjg0MDU1NzQ5ODk0MywgICAwLjAwMDAwMTk1NzUzOTg0NDg4MTc2NywgLTAuMDAwMDAxMzU3OTg1MDE0MTM4MTYxLAorICAgIC03Ljk3MDQzMDM2MzU1MjM5OWUtNywgICAgIDUuMzM4Nzc2MDA5MTE5NTUzZS03LCAgICAgMS4wMjIxOTA5ODQ5MzY2MTZlLTcsCisgICAgIDcuMTUzMTgxOTkzNDkzMTAzZS05LCAgICAtOS42NDc3NjcxOTM3MTM5OTFlLTgsICAgIC0xLjA4NzA2MzE1NzI0NTMwNGUtNywKKyAgICAtNC40MjkyODM3Mzc0ODU5NjFlLTgsICAgICAyLjA0NzAyMTU4OTY1MjA2OWUtOCwgICAgIDIuNTc2MzkzNTE5NjU2MTg5ZS04Cit9OworCitjb25zdCBkb3VibGUgZmZfb24yYXZjX3RhYl84NF80W10gPSB7CisgICAgLTAuMDAwODgwNDgxNDI1ODk3NDMxNywgICAgMC4wMDE2Nzc5ODQ3OTU4NjEzNDQsICAgICAwLjAwMTk0MzgyMjkyMDA0NzQsCisgICAgLTAuMDAyMzc0NzAxNjM0ODE2OTQxLCAgICAgMC4wMDI4NDI3Njk4MzAxNDM4MDMsICAgIC0wLjAwMzEzMDIwNTQ2NzM4MzE3LAorICAgIC0wLjAwMjI0Njk5MjM5NDU4MjcwOCwgICAgIDAuMDEwNTU0MDg1OTM5NzIzOTUsICAgICAtMC4wMTIxODUyMDM4MjIwMzgxNywKKyAgICAtMC4wMDA2NzM1NjE3Nzg0ODU3MDYxLCAgICAwLjAyMDU3MjY4MjcxMTU2MzAzLCAgICAgLTAuMDM0NzIzMzgxOTkwMDc5MDQsCisgICAgIDAuMDI5NjA3OTkwMDczMTY2ODQsICAgICAtMC4wMDMyNjkzMzU5ODgyMjQ2MDMsICAgIC0wLjAyOTcyOTY5MzA1MTY3NTQyLAorICAgICAwLjA1MDA4NTEyMTYwOTk5Mjk0LCAgICAgLTAuMDQ0MDA0ODc0ODA4ODM1NTMsICAgICAgMC4wMTcxMzc5MDEyMzA0NzIwNiwKKyAgICAgMC4wMDE3OTQ3OTY5ODUwOTUwNDgsICAgICAwLjAyNDY1MTA4NTY5Njk2ODg1LCAgICAgLTAuMTE4NTA0NjIzODc5MTI5NSwKKyAgICAgMC4yNjYxNTMzOTA5MDQyNjkzLCAgICAgIC0wLjQxNzA0MzQwOTYyOTAzMzcsICAgICAgIDAuNTA1Njk3MTIwOTk2NjE5NywKKyAgICAtMC40ODM5MjA1MTQ2NDgwMzM4LCAgICAgICAwLjM0ODQ3NTEyMDA4ODgwMywgICAgICAgLTAuMTQ1NzI4NzAyMDY2MzczMywKKyAgICAtMC4wNDk2Mzg2MTIzOTU1MDMzOCwgICAgICAwLjE3MTAwMzI0NDA1MjI4MTYsICAgICAgLTAuMTg5MjEzNTc2MjgyOTY4NCwKKyAgICAgMC4xMjMxMzQ1OTk1ODEzMjUxLCAgICAgIC0wLjAyMzg5MDgwMzA2Mzg4ODExLCAgICAgLTAuMDU0Nzg1MDU3MzE4NzAzLAorICAgICAwLjA4NDE2MjIyMjA0NzgxODcyLCAgICAgLTAuMDY2NjAyNzgwNDQwOTEwNSwgICAgICAgMC4wMjM3NzIwNzExMzc0NDE4MywKKyAgICAgMC4wMTIwMzgyOTA0MDgyMDYxOSwgICAgIC0wLjAyNTE2NTMwMDMzMDIyMDY4LCAgICAgIDAuMDE4NDA0MzIxOTgyODU0MzEsCisgICAgLTAuMDA2Mjg2MDEwNDA2MDE2MDk5LCAgICAtMC4wMDQwMzU2MDMyNDM4NTQ4NjEsICAgICAwLjAwNjk0OTE1NjY2Nzc0NDAxOCwKKyAgICAtMC4wMDE2MTIxNTA0ODUxNjI5MywgICAgIC0wLjAwMTgyODcwMTk5MTgyNDcyNywgICAgIDAuMDAwOTA5MDU4OTQ5OTU5NTI1NiwKKyAgICAgMC4wMDA5NzYxMzYzMTM1ODgyNzQ3LCAgIC0wLjAwMjE0MjQyOTEyMTI4MzQxNCwgICAgIDAuMDAwNDE4ODQ4NTAxNTA2MjcxNywKKyAgICAgMC4wMDE4MDkyNzkxMjkyMDMzODEsICAgIC0wLjAwMDkzMjY4NzUyNTAzMjM5NiwgICAgLTAuMDAwOTQ4NjAyODQ4NzkyMjMxNywKKyAgICAgMC4wMDA5Mzk3OTQwMDYyMjAxMzkzLCAgICAwLjAwMDI4MTE4MzM3MTEzNzE1MywgICAgLTAuMDAwOTI0ODU4Njg0ODU2MTg0NCwKKyAgICAgMC4wMDAyMTUyNjE1NDA5NDUxMjgzLCAgICAwLjAwMDU0Nzc4MDE0NDQ1OTQ5ODcsICAgLTAuMDAwMjY1OTc0ODc1NjAxMDc2OCwKKyAgICAtMC4wMDAyNzczNzQyMDM1MDk1MTczLCAgICAwLjAwMDIyNjA2MjI4NTI2MjA5OTIsICAgIDAuMDAwMTUxMjc5Mjk3MDA2OTA3NiwKKyAgICAtMC4wMDAxNzY4NzI4NTY2Mjc3NzExLCAgIC0wLjAwMDAyOTg2ODc2OTU4NDYxMzk5LCAgIDAuMDAwMDUxMzA1NjU3NDM3MzMyNzUsCisgICAgIDAuMDAwMDA0Mzc0NzU3Mjc3NDY4ODA2LCAtMC4wMDAwMjE5NTUzOTAzNjE4MDI0NCwgICAwLjAwMDAwMjkxMzI4Mjk4MDA4NzQyMiwKKyAgICAgMy44MTgwODQ0MTY5NDM0ODRlLTcsICAgIC0wLjAwMDAwNjI4ODA3NTc5Njk0Mzk3NywgIDAuMDAwMDA2OTg0ODI5NDE4MTIyNjk5LAorICAgICAwLjAwMDAwNjE0Njk0MDA2OTE5NDQxLCAgLTAuMDAwMDA1OTQ2OTE5MDU1MDg5MjkyLCAtMC4wMDAwMDEyNjQ3MzM1OTk0MjEzNTgsCisgICAgIDAuMDAwMDA0MzM5MjE0OTc1MjUwODI4LCAgMC4wMDAwMDExODg4MzAwMzEyMjkyMDIsIC0yLjU2NTY5MDk5NDg1MzcwMWUtNywKKyAgICAtOC45MjkwNTg3MzU5ODMwNzZlLTcsICAgIC01LjYxODQxODU2MDM4NjAyM2UtNywgICAgLTIuMjE2NjM1NjEwMTk5NTU3ZS03LAorICAgICA5LjkwMTc5ODAyMzM3MjI3MWUtOCwgICAgIDEuMzEyNjY3ODk1NjYyMDMzZS03LCAgICAgNi44NDUyOTAxMDEyNzk5NzJlLTksCisgICAgIDIuNzg5MTQxNzI3NTg4OGUtOSwgICAgICAtMS4yODkwMTk1NTA2NDUwODZlLTksICAgIC0xLjYyMjM2NzY1NTQxNzE2ZS05Cit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHRhYnNfNF8xMFs0ICogMl1bMTBdID0geworICAgIHsgIDAuOTI3NTY2NDgsICAgICAgMC4xNzcyNzQzMywgICAgLTAuMzEwMjg4NTEsICAgIC0wLjA0MTI5MzUzNiwgICAgMC4wOTkzMzk4NzMsCisgICAgICAtMC4wMDc5OTI5OTg2LCAgIC0wLjAxNjExMTIwNiwgICAgMC4wMDQyNzE4MDgsICAgIDAuMCwgICAgICAgICAgICAwLjAgfSwKKyAgICB7IDAuMCwgICAgICAgICAgICAgIDAuMCwgICAgICAgICAgICAwLjE2MDA4MDE2LCAgICAgMC42MDM3NDUzOCwgICAgIDAuNzI0NDkyNCwKKyAgICAgIDAuMTM5NDgxODksICAgICAgLTAuMjQxODk4NTMsICAgIC0wLjAzNTQ4MDYzLCAgICAgMC4wNzU3MzYxNzQsICAgIDAuMDAzNDE3MTI2MSB9LAorICAgIHsgMC4wLCAgICAgICAgICAgICAgMC4wLCAgICAgICAgICAgLTIuMDQ5NTQ0N2UtMTAsIC03LjY1MDE2MjJlLTEwLCAgMC4xNTkyMjQ5MywKKyAgICAgIDAuNjAwNTE5ODgsICAgICAgIDAuNzI1ODA1NjQsICAgICAwLjE1ODI4NzY0LCAgICAtMC4yMzI3MjI1NiwgICAgLTAuMDg5NTI0ODMyIH0sCisgICAgeyAwLjAsICAgICAgICAgICAgICAwLjAsICAgICAgICAgICAgMS43NjczNDQ4ZS0xMCwgIDYuNDE2MzA3MWUtMTAsICAwLjAwMDAzMjYwODExMiwKKyAgICAgIDAuMDAwMTIyOTc5NjUsICAgIDAuMTUxNzgzOTQsICAgICAwLjU3MTkyNzg2LCAgICAgMC43Mzc1MDI1NCwgICAgIDAuMzI1NDk5ODQgfSwKKyAgICB7IDAuMzI1NDk5ODQsICAgICAgLTAuNzM3NTAyNTQsICAgICAwLjU3MTkyNzg2LCAgICAtMC4xNTE3ODM5NCwgICAgIDAuMDAwMTIyOTc5NjUsCisgICAgICAtMC4wMDAwMzI2MDgxMTIsICA2LjQxNjMwNzFlLTEwLCAtMS43NjczNDQ4ZS0xMCwgIDAuMCwgICAgICAgICAgICAwLjAgfSwKKyAgICB7IC0wLjA4OTUyNDgzMiwgICAgIDAuMjMyNzIyNTYsICAgICAwLjE1ODI4NzY0LCAgICAtMC43MjU4MDU2NCwgICAgIDAuNjAwNTE5ODgsCisgICAgICAtMC4xNTkyMjQ5MywgICAgIC03LjY1MDE2MjFlLTEwLCAgMi4wNDk1NDQ2ZS0xMCwgIDAuMCwgICAgICAgICAgICAwLjAgfSwKKyAgICB7IDAuMDAzNDE3MTI2MSwgICAgLTAuMDc1NzM2MTc0LCAgIC0wLjAzNTQ4MDYzLCAgICAgMC4yNDE4OTg1MywgICAgIDAuMTM5NDgxODksCisgICAgIC0wLjcyNDQ5MjQsICAgICAgICAwLjYwMzc0NTM4LCAgICAtMC4xNjAwODAxNiwgICAgIDAuMCwgICAgICAgICAgICAwLjAgfSwKKyAgICB7IDAuMCwgICAgICAgICAgICAgIDAuMCwgICAgICAgICAgICAwLjAwNDI3MTgwOCwgICAgMC4wMTYxMTEyMDYsICAgLTAuMDA3OTkyOTk4NiwKKyAgICAgLTAuMDk5MzM5ODczLCAgICAgLTAuMDQxMjkzNTM2LCAgICAwLjMxMDI4ODUxLCAgICAgMC4xNzcyNzQzMywgICAgLTAuOTI3NTY2NDggfQorfTsKKworY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfNF8xMF8xWzRdID0geworICAgIHRhYnNfNF8xMFswXSwgdGFic180XzEwWzFdLCB0YWJzXzRfMTBbMl0sIHRhYnNfNF8xMFszXQorfTsKKworY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfNF8xMF8yWzRdID0geworICAgIHRhYnNfNF8xMFs0XSwgdGFic180XzEwWzVdLCB0YWJzXzRfMTBbNl0sIHRhYnNfNF8xMFs3XQorfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSB0YWJzXzlfMjBbOSAqIDJdWzIwXSA9IHsKKyAgICB7IDAuMjAyNjU1NjYsIDAuNjg5MjMxMywgICAwLjY0MTY0Nzg2LCAgMC4wNjYzMDkwNTUsICAtMC4yMzU5NzE5NCwKKyAgICAgLTAuMTA0MzIxNDUsIDAuMDI3NDAyMDA3LCAwLjAyMTQ3NTgzLCAtMC4wMDExNTcxNDQzLCAtMC4wMDE2OTIzNzk1LAorICAgICAgMC4wMDAxMDk0MTk0NCwgMC4wMDAwNjMxNTUxNjQsIC0wLjAwMDAxMjA2MTE3NiwgLTAuMDAwMDA5NDY4MTM5MSwgNi44MTY0ODM3ZS03LAorICAgICAgOC4wNjcyOTg2ZS03LCAtMS4yMDAxMDk2ZS04LCAtMy4wNzc4MTU3ZS04LCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDczNDAxNDIsIC0wLjAzMzc5Njg5NSwgMC4yMDIyMzc3MiwgMC42ODY3NzI0OCwgMC42NDAxMTczNywKKyAgICAgIDAuMDY4MzY1MTU5LCAtMC4yMzMzMzQwMSwgLTAuMTA0NTEyODUsIDAuMDI1OTExNTE2LCAwLjAyMTE1NjgxOSwKKyAgICAgLTAuMDAwNjY5ODc4MTcsIC0wLjAwMTUwMzI2MDgsIDAuMDAwMDEwNTM2MDEyLCAwLjAwMDAwOTAxMjc0OCwgLTQuMDg4MDEwMWUtNywKKyAgICAgLTYuMzQ4NjE4NmUtNywgNS4yNzE4NTU3ZS05LCAxLjM1MjAyNjZlLTgsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMDA2MzE1MTI2MiwgMC4wODE0NTA4NzIsIDAuMDczMTQ2NDMxLCAtMC4wMzM1OTEyNjIsIDAuMjAxNjQzMzEsCisgICAgICAwLjY4NDQxNTI2LCAwLjYzODE3NTE1LCAwLjA2ODg5MzYzMywgLTAuMjMxOTE3ODIsIC0wLjEwNDI5MzY2LAorICAgICAgMC4wMjUzODI3MzksIDAuMDIwOTU4MTE5LCAtMC4wMDA1NjQ1NDE0LCAtMC4wMDE0NDM0OTkzLCAxLjIwNDM1MDZlLTcsCisgICAgICAxLjU4MzYzMDVlLTcsIC0xLjkxODYwNDFlLTksIC00LjkyMDQ3NTVlLTksIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wMDg5Njg1ODI0LCAtMC4wMTI2ODg3NjEsIC0wLjAwNjMxMzgyNDYsIDAuMDgxNDQwMjcyLCAwLjA3MzEzNzE5MywKKyAgICAgLTAuMDMzNTgyMzE2LCAwLjIwMTYyMzM0LCAwLjY4NDMzMDM1LCAwLjYzODEwOTg2LCAwLjA2ODkyNjE1NCwKKyAgICAgLTAuMjMxODUyNTQsIC0wLjEwNDI3OTMsIDAuMDI1MzYzNjk5LCAwLjAyMDk0OTE0OCwgLTAuMDAwNTYyMTcyNjYsCisgICAgIC0wLjAwMTQ0MTcyMjUsIDQuMTI4NzI3NmUtMTAsIDEuMDU4ODU4NWUtOSwgMC4wLCAwLjAsIH0sCisgICAgeyAtMC4wMDE2MDc4Mjc0LCAwLjAwMzU1MzQ4NDQsIDAuMDA4OTY4NTEzLCAtMC4wMTI2ODg2NjEsIC0wLjAwNjMxMzc3LAorICAgICAgMC4wODE0Mzk2NDMsIDAuMDczMTM2NjMyLCAtMC4wMzM1ODIwMDEsIDAuMjAxNjIxODYsIDAuNjg0MzI1MTIsCisgICAgICAwLjYzODEwNTE1LCAwLjA2ODkyNjEzMiwgLTAuMjMxODUwMzEsIC0wLjEwNDI3ODQ1LCAwLjAyNTM2MzMzNiwKKyAgICAgIDAuMDIwOTQ4OTEyLCAtMC4wMDA1NjIxNDk3NiwgLTAuMDAxNDQxNjk2MSwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAsIDAuMCwgMC4wMDAyNDUzNzU4OSwgLTAuMDAwMDk1Njc3NTc4LCAtMC4wMDE2MDc4MjkyLAorICAgICAgMC4wMDM1NTM0ODg2LCAwLjAwODk2ODUyMzQsIC0wLjAxMjY4ODY3NiwgLTAuMDA2MzEzNzc3NCwgMC4wODE0Mzk3MzcsCisgICAgICAwLjA3MzEzNjcxNywgLTAuMDMzNTgyMDQsIDAuMjAxNjIyMDksIDAuNjg0MzI1OTIsIDAuNjM4MTA1ODksCisgICAgICAwLjA2ODkyNjIxMiwgLTAuMjMxODUwNTgsIC0wLjEwNDI3ODU3LCAwLjAyNTM2MzM2NSwgMC4wMjA5NDg5MzYsIH0sCisgICAgeyAwLjAsIDAuMCwgLTEuMDkxNTMyZS04LCA0LjI1NjEyODZlLTksIDAuMDAwMjQ1NTgwMjksCisgICAgICAtMC4wMDAwOTU4ODc0NjMsIC0wLjAwMTYwOTA5ODksIDAuMDAzNTU1OTc3MywgMC4wMDg5NzM2NjA5LCAtMC4wMTI2OTkxNywKKyAgICAgIC0wLjAwNjMyMDQ0OTgsIDAuMDgxNDg1MzMyLCAwLjA3MzE2NzM1MywgLTAuMDMzNjMwNjY3LCAwLjIwMTcwMjg5LAorICAgICAgMC42ODQ2OTM0MywgMC42Mzg0NjE3NSwgMC4wNjg5NjgxNzYsIC0wLjIzMTk3NzI2LCAtMC4xMDQzMzU5OCwgfSwKKyAgICB7IDAuMCwgMC4wLCA3LjEzNDQ3NjVlLTgsIC0yLjc4MTg5MjhlLTgsIC0wLjAwMDAwMjUyODQ1NiwKKyAgICAgIDAuMDAwMDAxODM2ODE5NywgMC4wMDAyNjk5NzkzNywgLTAuMDAwMTMyNTI0NDEsIC0wLjAwMTc0MDYzMywgMC4wMDM4MDY3MTIxLAorICAgICAgMC4wMDkzNTMxNzcyLCAtMC4wMTM4MjE1NjYsIC0wLjAwNzA4NzkzNjEsIDAuMDg0NzM5MDE1LCAwLjA3NDE1OTY5NCwKKyAgICAgIC0wLjA0MDQ3MTkyNCwgMC4yMDMxNzIyNiwgMC43MDczOTc5MywgMC42NjIxNDI0NCwgMC4wNzIxOTMzNzEsIH0sCisgICAgeyAwLjAsIDAuMCwgLTEuNzc0NTcyNGUtNywgNi45MTk0NTdlLTgsIDAuMDAwMDA3OTIxMjY3OSwKKyAgICAgIC0wLjAwMDAwNTIwNTE4NTIsIC0wLjAwMDExMTg2MTU5LCAwLjAwMDEzMDg3MjA5LCAwLjAwMTAwMTE5MDcsIC0wLjAwMTQyOTI4OTUsCisgICAgICAtMC4wMDQ3NDg0ODcyLCAwLjAxMDQ4NTA0MSwgMC4wMTYyMDc2ODMsIC0wLjAzOTc1ODY0MiwgLTAuMDIyMTA0NzM3LAorICAgICAgMC4xNDMwOTMxNywgMC4wNzE2NTk4MTYsIC0wLjIxNjIwNjM4LCAwLjEyMTc0NzYzLCAwLjk1NDEyNDY5LCB9LAorICAgIHsgMC45NjgxMTk3NCwgLTAuMDY2NDYwODM5LCAtMC4xODk5MDU4OSwgLTAuMTI2OTk3MjQsIDAuMDc0OTAwMjI5LAorICAgICAgMC4wMTkzNjUxMDIsIC0wLjAwOTQwMjg3NTIsIC0wLjAwNzMyMjU2ODcsIDAuMDAyNDg0NjE3MywgMC4wMDExMzMzMTQsCisgICAgICAtMC4wMDAwNjY3ODIwOTQsIC0wLjAwMDE3MTI3MDE4LCAtNS4xNzAxODQ5ZS0xMiwgLTIuNjg4Mzk2N2UtMTIsIDguNDQzNDAwNGUtMTMsCisgICAgICA0LjU3MTQ0MzNlLTEzLCAtMi4wMzM2MjMzZS0xNCwgLTQuODE0MjgyMWUtMTQsIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wNzAwNTEwMTUsIC0wLjY3NjIyNzM1LCAwLjY5OTcxNDk2LCAtMC4xODk4NzI2OCwgLTAuMDIzNjAxMDIyLAorICAgICAgLTAuMDczNjk0NTM0LCAwLjA3Njk2NDkyNiwgMC4wMDQ5NDQ4NTE3LCAtMC4wMTE2NjA5NTcsIC0wLjAwODQxNTM2NjQsCisgICAgICAwLjAwMzQxNjg3OSwgMC4wMDE1MTE0MjA0LCAtMC4wMDAwOTI0NDAzOTMsIC0wLjAwMDIzNzA3MzgxLCAtNy44Mjc4NTk0ZS0xMiwKKyAgICAgIC0zLjQwNDE4NDllLTEyLCAyLjEyMTMxMjNlLTEzLCA1LjQyNDQ0NGUtMTMsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMTA0MDA0NDYsIDAuMjMzNzk3ODMsIDAuMDcwMTM5Njc3LCAtMC42Mzk4NTkxNSwgMC42ODI3ODM4MiwKKyAgICAgIC0wLjIwMTc1NjU3LCAtMC4wMzI3NDAwNDcsIC0wLjA3MjkzMTc2MywgMC4wODEyMjgxNiwgMC4wMDYyMTIxODQsCisgICAgICAtMC4wMTI2NTA4MTIsIC0wLjAwODk0NTk0NzQsIDAuMDAzNTUwNzUxNywgMC4wMDE2MDQ5MzI4LCAtMC4wMDAwOTU2MjUwMjQsCisgICAgICAtMC4wMDAyNDUyNDExMSwgLTUuNDk0NzY0OWUtMTUsIC0xLjM4NDkzMjllLTE0LCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDIwOTI3NzI3LCAtMC4wMjU0NTMzNzEsIC0wLjEwNDM0OTQyLCAwLjIzMTg4MTEzLCAwLjA2ODk4NzM1NCwKKyAgICAgIC0wLjYzODEwMjk2LCAwLjY4NDI5NzY3LCAtMC4yMDE2Mjg5NiwgLTAuMDMzNTczMTQyLCAtMC4wNzMxMzMyMjksCisgICAgICAwLjA4MTQzNzkxOCwgMC4wMDYzMTI3ODgsIC0wLjAxMjY4ODQ1OSwgLTAuMDA4OTY4MzYsIDAuMDAzNTUzNDc1NywKKyAgICAgIDAuMDAxNjA3ODE0MywgLTAuMDAwMDk1Njc3MzQ4LCAtMC4wMDAyNDUzNzUzLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMCwgMC4wLCAtMC4wMDE0NDE2OTYsIDAuMDAwNTYyMTQ5NzEsIDAuMDIwOTQ4OTA4LAorICAgICAgLTAuMDI1MzYzMzMzLCAtMC4xMDQyNzg0MSwgMC4yMzE4NTAyNiwgMC4wNjg5MjU4NTMsIC0wLjYzODEwNDY2LAorICAgICAgMC42ODQzMjYyNSwgLTAuMjAxNjI0NDYsIC0wLjAzMzU4NDgxOSwgLTAuMDczMTI3MDEyLCAwLjA4MTQ0NDc2NywKKyAgICAgIDAuMDA2Mjg4OTk4MiwgLTAuMDEyNjkyMzU2LCAtMC4wMDg5MDc0NTgsIDAuMDAzNTczMDMyOCwgMC4wMDE0OTQ3NTYsIH0sCisgICAgeyAwLjAsIDAuMCwgLTguODkxNTUzZS0xNCwgMy40NjU0NzllLTE0LCAtMC4wMDE0NDE2NzQ0LAorICAgICAgMC4wMDA1NjIxNDEyOCwgMC4wMjA5NDg0MjMsIC0wLjAyNTM2Mjg4NiwgLTAuMTA0MjczNDUsIDAuMjMxODQzNDIsCisgICAgICAwLjA2ODg5Nzk0LCAtMC42MzgwNTEwNSwgMC42ODQ0MTEwNiwgLTAuMjAxODY2OTUsIC0wLjAzMzcxODk0NSwKKyAgICAgIC0wLjA3MjQ4MDc3MiwgMC4wODE1NzY1NjcsIDAuMDA0Nzg5Njg3OCwgLTAuMDEyOTUxNzYxLCAtMC4wMDU1MjA1MzA0LCB9LAorICAgIHsgMC4wLCAwLjAsIDMuMTM4NDY2MWUtMTIsIC0xLjIyMzY5MTFlLTEyLCAtNC41NzEyNzM3ZS0xMSwKKyAgICAgIDUuNTI1Mjk5MWUtMTEsIC0wLjAwMTQ0MTMzOTUsIDAuMDAwNTYyMDEwMjYsIDAuMDIwOTQwMTIxLCAtMC4wMjUzNTU2NTYsCisgICAgICAtMC4xMDQxOTQ3OCwgMC4yMzE3MjczNCwgMC4wNjg1NTc1ODksIC0wLjYzNzI2Njc3LCAwLjY4NTA0MzMyLAorICAgICAgLTAuMjA0MzA1NDUsIC0wLjAzNDE1NDY1NCwgLTAuMDY3MDUxNjM1LCAwLjA4MjUxODgzMywgLTAuMDA3NDkyMTM0OCwgfSwKKyAgICB7IDAuMCwgMC4wLCAyLjE1OTEwODNlLTEzLCAtOC40NDQ5MDM2ZS0xNCwgMS4yMjQ3NTExZS0xMywKKyAgICAgIDIuNTQyODkzMWUtMTIsIC0zLjA0ODEwNjllLTExLCAyLjIwMjEwMDNlLTExLCAtMC4wMDE0MzEwOTIxLCAwLjAwMDU1ODAxNDY4LAorICAgICAgMC4wMjA3NzQ5OTcsIC0wLjAyNTE2OTA1MSwgLTAuMTAzMDg3MTcsIDAuMjI5NzQzMDQsIDAuMDY0NjQ4NTA0LAorICAgICAgLTAuNjI3Njg3OTgsIDAuNjkyODg1NjksIC0wLjIzNjE3MjAzLCAtMC4wMzc5NTIxNTYsIDAuMDA2NjI3NDEyMywgfSwKKyAgICB7IDAuMCwgMC4wLCA2LjAyMjYxNzVlLTE0LCAtMi4zMDk2MDQ2ZS0xNCwgLTcuODY5MjA0OGUtMTMsCisgICAgICAxLjAwNzI4MTNlLTEyLCA1LjEzNDQ0NjllLTEyLCAtOC45MzcyNjM3ZS0xMiwgLTMuNDE2NzkwOGUtMTEsIDUuNDMyNzEwOWUtMTEsCisgICAgICAtMC4wMDE0MjY2MzY5LCAwLjAwMDU1NjI3NzQ4LCAwLjAyMDY0NDc3OCwgLTAuMDI1MDY1MTM5LCAtMC4xMDE2OTkxNywKKyAgICAgIDAuMjI3ODMsIDAuMDU4ODk0Nzk1LCAtMC42MTM1MDkwMiwgMC42OTU1OTg3MywgLTAuMjcwMTM3ODMsIH0KK307CisKK2NvbnN0IGRvdWJsZSogY29uc3QgZmZfb24yYXZjX3RhYnNfOV8yMF8xWzldID0geworICAgIHRhYnNfOV8yMFswXSwgdGFic185XzIwWzFdLCB0YWJzXzlfMjBbMl0sIHRhYnNfOV8yMFszXSwgdGFic185XzIwWzRdLAorICAgIHRhYnNfOV8yMFs1XSwgdGFic185XzIwWzZdLCB0YWJzXzlfMjBbN10sIHRhYnNfOV8yMFs4XQorfTsKKworY29uc3QgZG91YmxlKiBjb25zdCBmZl9vbjJhdmNfdGFic185XzIwXzJbOV0gPSB7CisgICAgdGFic185XzIwWyA5XSwgdGFic185XzIwWzEwXSwgdGFic185XzIwWzExXSwgdGFic185XzIwWzEyXSwgdGFic185XzIwWzEzXSwKKyAgICB0YWJzXzlfMjBbMTRdLCB0YWJzXzlfMjBbMTVdLCB0YWJzXzlfMjBbMTZdLCB0YWJzXzlfMjBbMTddCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHRhYnNfMTlfNDBbMTkgKiAyXVs0MF0gPSB7CisgICAgeyAwLjU2OTMwNjM4LCAwLjY4NDE2Njc1LCAwLjIwMjkwNjM2LCAtMC4yOTI3MDA1NywgLTAuMjU1OTgwODMsIDAuMDMwOTUzODIxLCAwLjExMzk0NTY0LCAwLjAyMjg4MDgzOSwKKyAgICAgIC0wLjAyODIwNzcwNCwgLTAuMDEyMjE1NTEyLCAwLjAwMzcyMTgzOSwgMC4wMDMyNzY2NzYsIDAuMDAwMjYyNzY2MjUsIC0wLjAwMDU2MjMzNjc3LCAtMC4wMDAzNTczNzE1NiwgMC4wMDAwNDU4MjUxNDYsCisgICAgICAwLjAwMDE1MTUyMzM2LCAwLjAwMDAxNDE1ODM1NywgLTAuMDAwMDQ4MTgzMDM2LCAtMC4wMDAwMTAwMjIyNjEsIDAuMDAwMDEyNDE3ODA4LCAwLjAwMDAwMzc0MTA0MzUsIC0wLjAwMDAwMjYwNzI1NjEsIC0wLjAwMDAwMTAxNDAzOSwKKyAgICAgIDQuNDIyODM1N2UtNywgMi4xMDMwMDk3ZS03LCAtNS45OTM2NDUwMDAwMDAwMDFlLTgsIC0zLjM3NzkxMDZlLTgsIDYuMzg0NTE1NWUtOSwgNC4xNjgxNjY5ZS05LCAtNS4yMDkzNDg0ZS0xMCwgLTMuODU2NTAyNmUtMTAsCisgICAgICAzLjEwNjk1MzVlLTExLCAyLjU1ODE1NzhlLTExLCAtMS4yMzc3NDI2ZS0xMiwgLTEuMTE0NTY1ZS0xMiwgMi41OTQ4NzU4ZS0xNCwgMi40OTQ5MTY5ZS0xNCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjA4MzkzNjczNSwgMC4xNzgyMTg2MywgMC41NTU3NDA5ODAwMDAwMDAxLCAwLjY2NjAyNzc5LCAwLjE4MTc4OTA2LCAtMC4zMDY5NjU2MSwgLTAuMjUyNzUzMzUsIDAuMDQ0MjU5Njg3LAorICAgICAgMC4xMTg4NzA2MywgMC4wMTY2MDgxNTUsIC0wLjAzMjg1MDEwOCwgLTAuMDA5ODg3MDA3MjAwMDAwMDAxLCAwLjAwNjUwNTk5NDksIDAuMDAyNTc2ODU4NywgLTAuMDAxMTA3NzEzLCAtMC4wMDA0MzIzMDE0MiwKKyAgICAgIDAuMDAwMjE3MDIzNDEsIDAuMDAwMDYyODc0NDg5MDAwMDAwMDEsIC0wLjAwMDA1MjE0NzA0OCwgLTAuMDAwMDEzNjI5MjM2LCAwLjAwMDAxMjI2MjY1NSwgMC4wMDAwMDM5NTI3NDExLCAtMC4wMDAwMDI0NTk0MTUxLCAtOS45NjI4MDc2ZS03LAorICAgICAgNC4wMjAxOTA2ZS03LCAxLjk2MTgxOTRlLTcsIC01LjI4NzM4NTJlLTgsIC0zLjAyOTEyMjJlLTgsIDUuNDk4Mjg1N2UtOSwgMy42MjQxODUxZS05LCAtNC40MDE0NjkyZS0xMCwgLTMuMjc0MTA4ZS0xMCwKKyAgICAgIDIuNTg3NzgzM2UtMTEsIDIuMTM0MjI3NGUtMTEsIC0xLjAyMTA2MWUtMTIsIC05LjE5NTc3OTdlLTEzLCAyLjEzNjExNjNlLTE0LCAyLjA1MzgyOTVlLTE0LCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDY0MjYyMzUzOTk5OTk5OTksIDAuMTQyNTI0NDcsIDAuMDgzMzEyODIyOTk5OTk5OTksIDAuMTc2OTc2NjQsIDAuNTQ5MTUyMTMsIDAuNjU4MzMzNzQsIDAuMTgyNTMwMzcsIC0wLjI5OTczNjYxLAorICAgICAgLTAuMjUwMTg0NCwgMC4wNDAxODY2MzksIDAuMTE2MjE5MSwgMC4wMTg0ODAzOSwgLTAuMDMwOTg2MjMyLCAtMC4wMTA1MjA0NTEsIDAuMDA1NDk4NjM3MSwgMC4wMDI3MDU5MzQyLAorICAgICAgLTAuMDAwNjY4MTE1MjUsIC0wLjAwMDQyNDA1MTkxLCAwLjAwMDA1ODk3MDg5NywgMC4wMDAwNDE4MjQ2NTcsIC0wLjAwMDAwNTAyOTc0NzYsIC0wLjAwMDAwMjc4ODgzMjEsIDYuNDE0MTM3MmUtNywgMi42MTE5NTU4ZS03LAorICAgICAgLTEuMDQzNjExMWUtNywgLTUuMTE1Mzc0M2UtOCwgMS4zNjI1Mjk5ZS04LCA3Ljg1OTI2MjZlLTksIC0xLjM5MzcyOTFlLTksIC05LjMxNTUwN2UtMTAsIDEuMDcyMTM1M2UtMTAsIDguMTk0ODQwN2UtMTEsCisgICAgICAtNS43Njc2NzE0ZS0xMiwgLTQuOTU2MjQwN2UtMTIsIDEuODU1NDc2OGUtMTMsIDEuNzI5OTQwMWUtMTMsIC0xLjg1ODA4MTRlLTE1LCAtMS43ODY1MDVlLTE1LCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjAxMzMwNzA0OCwgLTAuMDMzOTc1OTAxLCAwLjA2NDIwOTE5ODk5OTk5OTk5LCAwLjE0MjM5NjExLCAwLjA4MzMwODk0MiwgMC4xNzY5NzcwMiwgMC41NDg4MjIwNiwgMC42NTc5Njc4MSwKKyAgICAgIDAuMTgyNzg0ODUsIC0wLjI5OTEwNTc5LCAtMC4yNTAwNzU0NCwgMC4wMzk3MjA4MTgsIDAuMTE1OTUzNDUsIDAuMDE4NjczNzEzLCAtMC4wMzA3ODcyOTQsIC0wLjAxMDU2Njg2NiwKKyAgICAgIDAuMDA1NDAwNzQ3NywgMC4wMDI3MDc0OTgsIC0wLjAwMDYzMTI2NzAxOTk5OTk5OTksIC0wLjAwMDQxOTYwNTMyLCAwLjAwMDA0Nzc4MTI3MSwgMC4wMDAwMzkzMTAwMDIsIC0wLjAwMDAwMjI0MjE0NjQsIC0wLjAwMDAwMTkxMTQ2NjEsCisgICAgICA3LjI4ODg3MTQwMDAwMDAwMWUtOCwgMy4zOTQwMTczZS04LCAtMS4wMzQxMjA2ZS04LCAtNS41MjYyNTE3ZS05LCAxLjIyNjQzMDNlLTksIDcuMzMxODExNWUtMTAsIC0xLjIwNTIzMWUtMTAsIC03Ljk5OTU0OTc5OTk5OTk5OWUtMTEsCisgICAgICA5LjM2MDk4N2UtMTIsIDcuMDMxNjE3ZS0xMiwgLTUuMjI3NTYwMWUtMTMsIC00LjUzNjEzM2UtMTMsIDEuNjg0MzI1MmUtMTQsIDEuNjE5NDQyMmUtMTQsIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wMDE4OTg1MjU3LCAwLjAyMDYyMDY0NSwgLTAuMDEzMzAzNzg2LCAtMC4wMzM5NjMyODcsIDAuMDY0MTkyMzkzLCAwLjE0MjM1NjQ2LCAwLjA4MzMwNjA2LCAwLjE3Njk3MywKKyAgICAgIDAuNTQ4NzE3NjQ5OTk5OTk5OSwgMC42NTc4NTQzMiwgMC4xODI4NjA3LCAtMC4yOTg5MDc3OCwgLTAuMjUwMDE5NzQsIDAuMDM5NjAzMTA0LCAwLjExNTg3MTk3LCAwLjAxODcxMjU0NCwKKyAgICAgIC0wLjAzMDczNjIxNCwgLTAuMDEwNTcyMzU2LCAwLjAwNTM3ODk4MDIsIDAuMDAyNzA1ODM4LCAtMC4wMDA2MjQxNjg2NSwgLTAuMDAwNDE4MTg1MTYsIDAuMDAwMDQ1OTM1MTUzLCAwLjAwMDAzODc2Mjg1MywKKyAgICAgIC0wLjAwMDAwMTg0OTg5NjcsIC0wLjAwMDAwMTc2MjcyMjksIDQuMTMzMzgxNWUtOSwgMi43MDAxNTZlLTksIC0zLjAzOTE1MzhlLTEwLCAtMi42MjkxODk1ZS0xMCwgNy42NTQyMzY3ZS0xMiwgMS4yMDE5Nzg1ZS0xMSwKKyAgICAgIDkuMDQ2OTgzM2UtMTMsIDUuMDQ4NTIxM2UtMTMsIC0xLjAzOTEyNjdlLTEzLCAtOS4zMDUyNDhlLTE0LCAyLjM1Njg3NWUtMTUsIDIuMjY2MDg0M2UtMTUsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMDAwMTA5MTc3OCwgLTAuMDEwNTYxMzM5LCAwLjAwMTg5ODQyMjgsIDAuMDIwNjE5MDYyLCAtMC4wMTMzMDI5NzQsIC0wLjAzMzk2MDUwNSwgMC4wNjQxODgyOTgsIDAuMTQyMzQ3MDEsCisgICAgICAwLjA4MzMwMzk0MzAwMDAwMDAxLCAwLjE3Njk2ODgzLCAwLjU0ODY4OTQxLCAwLjY1NzgyMjU1OTk5OTk5OTksIDAuMTgyODcwMTEsIC0wLjI5ODg2ODI2LCAtMC4yNTAwMDQ3NiwgMC4wMzk1ODMwNjksCisgICAgICAwLjExNTg1NTUzLCAwLjAxODcxNzcwOCwgLTAuMDMwNzI3MjQ3LCAtMC4wMTA1NzI0MjgsIDAuMDA1Mzc1NjQ4NCwgMC4wMDI3MDUzMDgyLCAtMC4wMDA2MjMyMzU4NTAwMDAwMDAxLCAtMC4wMDA0MTc5MjQzNCwKKyAgICAgIDAuMDAwMDQ1NzMxNjg4LCAwLjAwMDAzODY4NTI4NSwgLTAuMDAwMDAxODE0OTY3MSwgLTAuMDAwMDAxNzQ2MDM3NSwgLTUuMTY3NTAyZS0xMCwgOS4zOTA2OTQyOTk5OTk5OTllLTEyLCAxLjU5NDMxOWUtMTAsIDUuODE4NDUyOWUtMTEsCisgICAgICAtMi40MTYxMzQ3ZS0xMSwgLTEuNDQ1NDYyOWUtMTEsIDIuMTAzNzU2NmUtMTIsIDEuNzMyMTYxNWUtMTIsIC05Ljk4NjQ1NjY5OTk5OTk5OWUtMTQsIC05LjYwMTc2MTdlLTE0LCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjAwMDU3Njc0MTA1OTk5OTk5OTksIDAuMDAzNTE5MDI5MSwgLTAuMDAwMTA5MTc5NTUsIC0wLjAxMDU2MTI1OCwgMC4wMDE4OTg0MTA4LCAwLjAyMDYxODg4OCwgLTAuMDEzMzAyODgyLCAtMC4wMzM5NjAyMDIsCisgICAgICAwLjA2NDE4NzgzOCwgMC4xNDIzNDU5NiwgMC4wODMzMDM2NjgsIDAuMTc2OTY4MjcsIDAuNTQ4Njg2MTgsIDAuNjU3ODE4OTMsIDAuMTgyODcwOTcsIC0wLjI5ODg2NCwKKyAgICAgIC0wLjI1MDAwMjk0LCAwLjAzOTU4MTE1MSwgMC4xMTU4NTM3NiwgMC4wMTg3MTgwNjQsIC0wLjAzMDcyNjM5LCAtMC4wMTA1NzIzNzgsIDAuMDA1Mzc1MzM2MywgMC4wMDI3MDUyMDczLAorICAgICAgLTAuMDAwNjIzMTc4MjUsIC0wLjAwMDQxNzg4NDE3LCAwLjAwMDA0NTczMzA3NCwgMC4wMDAwMzg2Nzc0NTQsIC0wLjAwMDAwMTgxOTYwNTEsIC0wLjAwMDAwMTc0NjA5NjcsIDkuODg3ODk3MzAwMDAwMDAxZS0xMCwgNC42ODQ4MTQyZS0xMCwKKyAgICAgIC0xLjIxOTUxMjNlLTEwLCAtNy45NTYxODY4ZS0xMSwgOS4zNzg5MTY3MDAwMDAwMDFlLTEyLCA3Ljg3OTEyNjhlLTEyLCAtMy45MTMwNTE0ZS0xMywgLTMuNzYyMzE0MWUtMTMsIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wMDAzMDEzMTYzMSwgLTAuMDAxMDI2MzQ0NCwgLTAuMDAwNTc2NzQwNjUsIDAuMDAzNTE5MDI2OCwgLTAuMDAwMTA5MTc5NjYsIC0wLjAxMDU2MTI1MSwgMC4wMDE4OTg0MDk3LCAwLjAyMDYxODg3MywKKyAgICAgIC0wLjAxMzMwMjg3NCwgLTAuMDMzOTYwMTc2LCAwLjA2NDE4Nzc5OCwgMC4xNDIzNDU4NiwgMC4wODMzMDM2MzcsIDAuMTc2OTY4MjEsIDAuNTQ4Njg1ODgsIDAuNjU3ODE4NTgsCisgICAgICAwLjE4Mjg3MSwgLTAuMjk4ODYzNjYsIC0wLjI1MDAwMjc4LCAwLjAzOTU4MDk5NSwgMC4xMTU4NTM2MSwgMC4wMTg3MTgwMzksIC0wLjAzMDcyNjQ1LCAtMC4wMTA1NzI1MTEsCisgICAgICAwLjAwNTM3NTI4MDQsIDAuMDAyNzA1MjY2OSwgLTAuMDAwNjIzMTIwOTYsIC0wLjAwMDQxNzg5MTI4LCAwLjAwMDA0NTcwNzU3OSwgMC4wMDAwMzg2NzMxNDMsIC0wLjAwMDAwMTgxMjkyMTYsIC0wLjAwMDAwMTc0Mzc3OTQsCisgICAgICAtMS43NTAxNjk5ZS0xMCwgLTEuMTg0MzgwMmUtMTAsIDEuMjY3ODU0N2UtMTEsIDEuMDc3MzEyNmUtMTEsIC00Ljg3MDM0NTZlLTEzLCAtNC42ODI3MzE4ZS0xMywgMC4wLCAwLjAsIH0sCisgICAgeyAtMC4wMDAwODk2Mzc5OTUsIDAuMDAwMjI2MTM2OTEsIDAuMDAwMzAxMzE2MywgLTAuMDAxMDI2MzQ0NCwgLTAuMDAwNTc2NzQwNjQsIDAuMDAzNTE5MDI2NywgLTAuMDAwMTA5MTc5NjMsIC0wLjAxMDU2MTI1MSwKKyAgICAgIDAuMDAxODk4NDA5NiwgMC4wMjA2MTg4NzMsIC0wLjAxMzMwMjg3NCwgLTAuMDMzOTYwMTc2LCAwLjA2NDE4Nzc5NjAwMDAwMDAxLCAwLjE0MjM0NTg2LCAwLjA4MzMwMzYzNSwgMC4xNzY5NjgyLAorICAgICAgMC41NDg2ODU4NywgMC42NTc4MTg1OCwgMC4xODI4NzA5OSwgLTAuMjk4ODYzNjksIC0wLjI1MDAwMjgsIDAuMDM5NTgwOTQzLCAwLjExNTg1MzQ1LCAwLjAxODcxNzg2MywKKyAgICAgIC0wLjAzMDcyNjQ5NywgLTAuMDEwNTcyNDMxLCAwLjAwNTM3NTM0NywgMC4wMDI3MDUyNTYsIC0wLjAwMDYyMzE1MTk3LCAtMC4wMDA0MTc4OTYyNiwgMC4wMDAwNDU3MTU4MTUsIDAuMDAwMDM4Njc1OTc0LAorICAgICAgLTAuMDAwMDAxODE0MzYzNSwgLTAuMDAwMDAxNzQ0NTA0OCwgLTcuODA2MDYyZS0xMiwgLTYuMzE1NTU2N2UtMTIsIDQuMDg5Mzg1OGUtMTMsIDMuOTMxODU1OWUtMTMsIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wMDAwMTg4MjY0MTMsIC0wLjAwMDAzMjI0ODQ0OCwgLTAuMDAwMDg5NjM3OTk1LCAwLjAwMDIyNjEzNjkxLCAwLjAwMDMwMTMxNjMsIC0wLjAwMTAyNjM0NDQsIC0wLjAwMDU3Njc0MDY2LCAwLjAwMzUxOTAyNjcsCisgICAgICAtMC4wMDAxMDkxNzk1NywgLTAuMDEwNTYxMjUxLCAwLjAwMTg5ODQwOTUsIDAuMDIwNjE4ODc0LCAtMC4wMTMzMDI4NzQsIC0wLjAzMzk2MDE3OCwgMC4wNjQxODc3OTYwMDAwMDAwMSwgMC4xNDIzNDU4NywKKyAgICAgIDAuMDgzMzAzNjMyLCAwLjE3Njk2ODE5LCAwLjU0ODY4NTg5LCAwLjY1NzgxODYxLCAwLjE4Mjg3MTAxLCAtMC4yOTg4NjM2NSwgLTAuMjUwMDAyNjcsIDAuMDM5NTgxMDkxLAorICAgICAgMC4xMTU4NTM0OSwgMC4wMTg3MTc3OTYsIC0wLjAzMDcyNjU1MywgLTAuMDEwNTcyNDIyLCAwLjAwNTM3NTM3MzEsIDAuMDAyNzA1MjYwMywgLTAuMDAwNjIzMTU4ODksIC0wLjAwMDQxNzg5ODY0LAorICAgICAgMC4wMDAwNDU3MTcwMjcsIDAuMDAwMDM4Njc2NTgzLCAtMC4wMDAwMDE4MTQ1MDM5LCAtMC4wMDAwMDE3NDQ1OTg5LCAyLjQ5NzE5MzRlLTEyLCAyLjQwMDk5NzNlLTEyLCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjAwMDAwMjM5NDA4NDQsIDAuMDAwMDAyOTExOTY4NywgMC4wMDAwMTg4MjY0MSwgLTAuMDAwMDMyMjQ4NDQ0LCAtMC4wMDAwODk2Mzc5NjksIDAuMDAwMjI2MTM2ODcsIDAuMDAwMzAxMzE2MTgsIC0wLjAwMTAyNjM0NDEsCisgICAgICAtMC4wMDA1NzY3NDAyNCwgMC4wMDM1MTkwMjUzLCAtMC4wMDAxMDkxODAzNiwgLTAuMDEwNTYxMjQ2LCAwLjAwMTg5ODQwOTMsIDAuMDIwNjE4ODU5LCAtMC4wMTMzMDI4NzEsIC0wLjAzMzk2MDE1LAorICAgICAgMC4wNjQxODc3NzgsIDAuMTQyMzQ1ODIsIDAuMDgzMzAzNzIsIDAuMTc2OTY4MzksIDAuNTQ4Njg2LCAwLjY1NzgxODg1LCAwLjE4Mjg3MTc2LCAtMC4yOTg4NjI3NCwKKyAgICAgIC0wLjI1MDAwMjQyLCAwLjAzOTU4MDY4LCAwLjExNTg1MzE1LCAwLjAxODcxNzg1LCAtMC4wMzA3MjYzOTQsIC0wLjAxMDU3MjM5NiwgMC4wMDUzNzUzMzA4LCAwLjAwMjcwNTI0NTcsCisgICAgICAtMC4wMDA2MjMxNTE0OSwgLTAuMDAwNDE3ODk0OTIsIDAuMDAwMDQ1NzE2MTY5LCAwLjAwMDAzODY3NjAwOCwgLTAuMDAwMDAxODE0NDQxLCAtMC4wMDAwMDE3NDQ1NDU3LCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMCwgMC4wLCAxLjM0MDcyMDVlLTcsIC0xLjM5NDQzNjllLTcsIC0wLjAwMDAwMjM5NDA4NDQsIDAuMDAwMDAyOTExOTY4NywgMC4wMDAwMTg4MjY0MSwgLTAuMDAwMDMyMjQ4NDQ0LAorICAgICAgLTAuMDAwMDg5NjM3OTY5LCAwLjAwMDIyNjEzNjg3LCAwLjAwMDMwMTMxNjE4LCAtMC4wMDEwMjYzNDQxLCAtMC4wMDA1NzY3NDAyNCwgMC4wMDM1MTkwMjUzLCAtMC4wMDAxMDkxODAzNiwgLTAuMDEwNTYxMjQ2LAorICAgICAgMC4wMDE4OTg0MDkzLCAwLjAyMDYxODg1OSwgLTAuMDEzMzAyODcxLCAtMC4wMzM5NjAxNSwgMC4wNjQxODc3NzgsIDAuMTQyMzQ1ODIsIDAuMDgzMzAzNzIsIDAuMTc2OTY4MzksCisgICAgICAwLjU0ODY4NiwgMC42NTc4MTg4NSwgMC4xODI4NzE3NiwgLTAuMjk4ODYyNzQsIC0wLjI1MDAwMjQyLCAwLjAzOTU4MDY4LCAwLjExNTg1MzE1LCAwLjAxODcxNzg1LAorICAgICAgLTAuMDMwNzI2Mzk0LCAtMC4wMTA1NzIzOTYsIDAuMDA1Mzc1MzMwOCwgMC4wMDI3MDUyNDU3LCAtMC4wMDA2MjMxNTE0OSwgLTAuMDAwNDE3ODk0OTIsIDAuMDAwMDQ1NzE2MTY5LCAwLjAwMDAzODY3NjAwOCwgfSwKKyAgICB7IDAuMCwgMC4wLCAtMS44NDU0MTgyZS0xMywgMS45MTkzNTU1ZS0xMywgMS4zNDA3NTM1ZS03LCAtMS4zOTQ0NzdlLTcsIC0wLjAwMDAwMjM5NDExMDMsIDAuMDAwMDAyOTEyMDEzMSwKKyAgICAgIDAuMDAwMDE4ODI2NTMzLCAtMC4wMDAwMzIyNDg3NTUsIC0wLjAwMDA4OTYzODM4NCwgMC4wMDAyMjYxMzgyOCwgMC4wMDAzMDEzMTY5NywgLTAuMDAxMDI2MzQ4OSwgLTAuMDAwNTc2NzQwMDksIDAuMDAzNTE5MDM5OCwKKyAgICAgIC0wLjAwMDEwOTE4Mjk3LCAtMC4wMTA1NjEyNzQsIDAuMDAxODk4NDI3NiwgMC4wMjA2MTg5MDYsIC0wLjAxMzMwMjk1OSwgLTAuMDMzOTYwMzQ2LCAwLjA2NDE4NzY2NDAwMDAwMDAxLCAwLjE0MjM0NTU4LAorICAgICAgMC4wODMzMDI5NjUwMDAwMDAwMSwgMC4xNzY5Njc0OSwgMC41NDg2ODU3NSwgMC42NTc4MTkyNiwgMC4xODI4NzIxLCAtMC4yOTg4NjI4LCAtMC4yNTAwMDI1OCwgMC4wMzk1ODA2NTQsCisgICAgICAwLjExNTg1MzE5LCAwLjAxODcxNzg2NSwgLTAuMDMwNzI2NDAyLCAtMC4wMTA1NzI0LCAwLjAwNTM3NTMzMTcsIDAuMDAyNzA1MjQ2MywgLTAuMDAwNjIzMTUxNTYsIC0wLjAwMDQxNzg5NDk3LCB9LAorICAgIHsgMC4wLCAwLjAsIC0yLjk5Njg3NTZlLTE0LCAzLjExNjk0NjRlLTE0LCAzLjQ0NjE0ODVlLTEzLCAtNC41Mjc0MjUzZS0xMywgMS4zNDA3MTI4ZS03LCAtMS4zOTQ0MDY2ZS03LAorICAgICAgLTAuMDAwMDAyMzk0MDkxOCwgMC4wMDAwMDI5MTE5NjQ4LCAwLjAwMDAxODgyNjQ3NSwgLTAuMDAwMDMyMjQ4NTQ1LCAtMC4wMDAwODk2MzgyOTQsIDAuMDAwMjI2MTM3NjEsIDAuMDAwMzAxMzE3MTEsIC0wLjAwMTAyNjM0NywKKyAgICAgIC0wLjAwMDU3Njc0MDY3LCAwLjAwMzUxOTAzNjcsIC0wLjAwMDEwOTE4MDEyLCAtMC4wMTA1NjEyNzEsIDAuMDAxODk4NDE0NCwgMC4wMjA2MTg4ODEsIC0wLjAxMzMwMjk4NSwgLTAuMDMzOTYwNDAyLAorICAgICAgMC4wNjQxODc1NTQ5OTk5OTk5OSwgMC4xNDIzNDU0NiwgMC4wODMzMDI5MjMsIDAuMTc2OTY3NTcsIDAuNTQ4Njg1OTUsIDAuNjU3ODE5NDUsIDAuMTgyODcyMTQsIC0wLjI5ODg2Mjg5LAorICAgICAgLTAuMjUwMDAyNjUsIDAuMDM5NTgwNjY3LCAwLjExNTg1MzIzLCAwLjAxODcxNzg3LCAtMC4wMzA3MjY0MSwgLTAuMDEwNTcyNDAzLCAwLjAwNTM3NTMzMzIsIDAuMDAyNzA1MjQ3MSwgfSwKKyAgICB7IDAuMCwgMC4wLCAzLjQwNTM5NDdlLTE0LCAtMy41NDE4MzNlLTE0LCAtNS45MTA4NDI0ZS0xMywgNy4yMTk0NDFlLTEzLCAzLjY4Njk2NWUtMTIsIC02Ljk5ODczMzJlLTEyLAorICAgICAgMS4zNDA2ODI2ZS03LCAtMS4zOTQxMDA5ZS03LCAtMC4wMDAwMDIzOTQxNzQ0LCAwLjAwMDAwMjkxMTk4MDYsIDAuMDAwMDE4ODI3MTc3LCAtMC4wMDAwMzIyNDk2MDgsIC0wLjAwMDA4OTY0MTQ5NywgMC4wMDAyMjYxNDQ4NSwKKyAgICAgIDAuMDAwMzAxMzI1NTksIC0wLjAwMTAyNjM3OTgsIC0wLjAwMDU3Njc1MzM0LCAwLjAwMzUxOTE0NjMsIC0wLjAwMDEwOTE3ODk2LCAtMC4wMTA1NjE1MywgMC4wMDE4OTg1NTIsIDAuMDIwNjE5NTAyLAorICAgICAgLTAuMDEzMzAzMzQ1LCAtMC4wMzM5NjE0MjUsIDAuMDY0MTg4NTgyOTk5OTk5OTksIDAuMTQyMzQ3NCwgMC4wODMzMDE5NzQsIDAuMTc2OTY3NzMsIDAuNTQ4Njk1MDEsIDAuNjU3ODMyNzIsCisgICAgICAwLjE4Mjg3NjYxLCAtMC4yOTg4Njg0NywgLTAuMjUwMDA3NywgMC4wMzk1ODEyOTcsIDAuMTE1ODU1NDYsIDAuMDE4NzE4MjU3LCAtMC4wMzA3MjY5OTEsIC0wLjAxMDU3MjYwNiwgfSwKKyAgICB7IDAuMCwgMC4wLCAzLjg4NTExODZlLTE0LCAtNC4wNDA3NzcxZS0xNCwgLTkuMDI5NzQ5OWUtMTMsIDEuMDYxNDI5MmUtMTIsIDEuMjM2OTg0MWUtMTEsIC0xLjcxOTQ3NjNlLTExLAorICAgICAgLTEuMzg4OTQzMmUtMTAsIDIuMTI3NDQzZS0xMCwgMS4zNTI5NzE2ZS03LCAtMS40MTUxNjVlLTcsIC0wLjAwMDAwMjQwMTkxNywgMC4wMDAwMDI5Mjc5ODU5LCAwLjAwMDAxODg2MjYyNCwgLTAuMDAwMDMyMzQ0MTM5LAorICAgICAgLTAuMDAwMDg5NzYwMTMzMDAwMDAwMDEsIDAuMDAwMjI2NTcxNDUsIDAuMDAwMzAxNTg2NzYsIC0wLjAwMTAyNzkwMDcsIC0wLjAwMDU3Njk0OTQzLCAwLjAwMzUyMzY0MjUsIC0wLjAwMDExMDAxMDcyLCAtMC4wMTA1NzIxMTYsCisgICAgICAwLjAwMTkwMzY1NTcsIDAuMDIwNjQwMjA3LCAtMC4wMTMzMjE3OTcsIC0wLjAzNDAwNDA3NiwgMC4wNjQyMTg4ODMsIDAuMTQyNDA0MzcsIDAuMDgzMjQ0NDExLCAwLjE3NjkyNjU5LAorICAgICAgMC41NDg5NDMzNywgMC42NTgyMzkxNiwgMC4xODMwMjQ1LCAtMC4yOTkwMzM2MSwgLTAuMjUwMTYzLCAwLjAzOTU5ODMyOCwgMC4xMTU5MjI3NywgMC4wMTg3MzAyNjIsIH0sCisgICAgeyAwLjAsIDAuMCwgLTIuNTQyNDM3NWUtMTQsIDIuNjQ0MzAxMWUtMTQsIDEuMzA3MjEzOWUtMTIsIC0xLjQzOTYwNTllLTEyLCAtMi45ODM4MzI4ZS0xMSwgMy42MTIxMzU1ZS0xMSwKKyAgICAgIDQuMjgwODQ3OWUtMTAsIC01Ljg1Nzc4NDhlLTEwLCAtNC4zOTUzMzA5ZS05LCA2Ljg5MTU0OTFlLTksIDEuNjcyNzc4OWUtNywgLTIuMDA1OTllLTcsIC0wLjAwMDAwMjU3ODcxOTQsIDAuMDAwMDAzMzMwNDYzNywKKyAgICAgIDAuMDAwMDE5NTg0MTQ0LCAtMC4wMDAwMzQ0NzYxMTQsIC0wLjAwMDA5MTg5NzE0LCAwLjAwMDIzNTQxNjMzLCAwLjAwMDMwNTU1NTc4LCAtMC4wMDEwNTc0Nzk0LCAtMC4wMDA1Nzc4MjIsIDAuMDAzNjA1ODI1OCwKKyAgICAgIC0wLjAwMDEzMTc4OTI2LCAtMC4wMTA3NTc2MDksIDAuMDAyMDA3NTI5NCwgMC4wMjA5OTkzMzQsIC0wLjAxMzY0NDU0NiwgLTAuMDM0NzE1NDgsIDAuMDY0NzA3NCwgMC4xNDMxOTc5MiwKKyAgICAgIDAuMDgxODkwMzI0LCAwLjE3NTQ2MDk5LCAwLjU1MTg5OTIxLCAwLjY2Mzk4Nzg3LCAwLjE4NTMyOTc0LCAtMC4zMDEyNTU1MiwgLTAuMjUyMzY4MDksIDAuMDM5Nzk2MTM4LCB9LAorICAgIHsgMC4wLCAwLjAsIDUuNDUwNDA0ZS0xNCwgLTUuNjY4Nzc2MmUtMTQsIC0yLjQxMzcyM2UtMTIsIDIuNjgxOTdlLTEyLCA1LjQxMjI4ODllLTExLCAtNi41OTc0NjkxMDAwMDAwMDFlLTExLAorICAgICAgLTcuOTY4OTUyOWUtMTAsIDEuMDg0MjUzOWUtOSwgOC40ODI3NTk0ZS05LCAtMS4zMDkxNDllLTgsIC02Ljg0ODY0Mjk5OTk5OTk5OWUtOCwgMS4yMTk0MjM3ZS03LCA1LjU4NjQ0NzllLTcsIC0wLjAwMDAwMTAzNDQ4MTYsCisgICAgICAtMC4wMDAwMDQ0MDM5NDYzLCAwLjAwMDAwODE0ODIxMjIsIDAuMDAwMDI1OTkzMzg5LCAtMC4wMDAwNTY3OTQzNzUsIC0wLjAwMDEwNzk4MzQsIDAuMDAwMzE4ODc0MTksIDAuMDAwMzI3NTIwODEsIC0wLjAwMTMxNDc5NTIsCisgICAgICAtMC4wMDA1NTM2NzI3NywgMC4wMDQyNzEwMzU2LCAtMC4wMDAzNzM2NzI2NywgLTAuMDEyMTc5OTUsIDAuMDAyOTQxMDEzMiwgMC4wMjM3MTQyMjksIC0wLjAxNjA5MTYxNywgLTAuMDM5NzMzMDksCisgICAgICAwLjA2ODQxOTI5NiwgMC4xNDgzNTU1MywgMC4wNzAwNTkxMDIsIDAuMTU5NTA1MDgsIDAuNTYzNTQ4MTksIDAuNjk2MzM3OSwgMC4yMDAyMDc1MiwgLTAuMzEyNzcwNzUsIH0sCisgICAgeyAwLjAsIDAuMCwgMi4wOTg2NjQzZS0xNCwgLTIuMTgyNzQ3OWUtMTQsIC02LjIzMTc5MjhlLTEzLCA3LjE0MTk4MzVlLTEzLCA0Ljk5NzgzMzVlLTEyLCAtNy45NjI4NjIzZS0xMiwKKyAgICAgIDYuNDU3NDQ5OWUtMTEsIC0zLjAzOTE3MzRlLTExLCAtMi4wOTMxODJlLTksIDIuMjY3Njc4MmUtOSwgMi43NTk2Nzc0ZS04LCAtMy44MjA4MTM3ZS04LCAtMi4zODc5Mzk1ZS03LCA0LjAzODAxNzZlLTcsCisgICAgICAwLjAwMDAwMTYzMzMyNTQsIC0wLjAwMDAwMzIzNzY0NjYsIC0wLjAwMDAwOTQxNTAwMDEsIDAuMDAwMDIxMTY4MzcxLCAwLjAwMDA0MzMxNTA4NiwgLTAuMDAwMTE3MTEzNjMsIC0wLjAwMDE1MDIyNzEsIDAuMDAwNTQyNzE3MTQwMDAwMDAwMSwKKyAgICAgIDAuMDAwMzgxNTkxNTgsIC0wLjAwMTk5NzQ1NDQsIC0wLjAwMDQ3Nzc4MzMsIDAuMDA2MDEyMDA3OCwgLTAuMDAxMDQzNjUwOCwgLTAuMDE1ODgwMTY1LCAwLjAwNTQyMTk3NTUsIDAuMDMwNzQ5OTk2LAorICAgICAgLTAuMDIyMzMwNjI2LCAtMC4wNTIyMjA3MTUsIDAuMDc4NzExOTk4MDAwMDAwMDEsIDAuMTYyMzU5MzUsIDAuMDM5OTY2MjkzLCAwLjExNzAzNzI5LCAwLjU4OTI1Mzk2LCAwLjc3NDg3NjY4LCB9LAorICAgIHsgMC43NjA4MjkwMSwgLTAuNjE1MDEwNDUsIDAuMDcwNzMyMzE4LCAtMC4wNzYyMzM4ODQsIDAuMTY3MjE1NjUsIC0wLjA0NjA0Nzg2LCAtMC4wMzg4NzIyMTYsIDAuMDA3MzkwODUwNCwKKyAgICAgIDAuMDE4NjQyMjE0LCAtMC4wMDA1OTk2MDE2NiwgLTAuMDA5MDQxODAxLCAwLjAwMDAxNzE4MTgxNiwgMC4wMDI5NjcyNTg2LCAwLjAwMDQ3OTE4NTYsIC0wLjAwMDg3MDUxNjI2LCAtMC4wMDAyNTI4OTk5LAorICAgICAgMC4wMDAxOTQ0MzM0NywgMC4wMDAwNzYwOTAzMTI5OTk5OTk5OSwgLTAuMDAwMDI4MDEzNDE3LCAtMC4wMDAwMTYyMjY1NDQsIDAuMDAwMDAyNTUxNTM1NSwgMC4wMDAwMDIwOTM5MzA4LCAtMS4yMzUyNzU4ZS03LCAtMS4xODcxMzk5ZS03LAorICAgICAgMy43NjUzNTczZS0xMSwgLTUuMTU1MzQ2N2UtMTIsIC0xLjIxODk3OTRlLTExLCAtMS4wNjk0Nzk1ZS0xMiwgNC4zOTE1NDRlLTEyLCAxLjAyNTg1NzVlLTEyLCAtMS4xNTQ2MzgyZS0xMiwgLTMuODY0NzI2NWUtMTMsCisgICAgICAxLjgxMjc4OTZlLTEzLCAxLjAwMjMxNjJlLTEzLCAtMS43NTM3OTM0ZS0xNCwgLTEuNDM0MTRlLTE0LCA4LjY2NDkwOTdlLTE2LCA4LjMzMTE3MjllLTE2LCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjI5MDIwMTQ4LCAtMC4xNzA1ODU3OSwgMC43MzAwOTA1MSwgLTAuNTQ1MjI1OTksIDAuMTUxNDg3MjQsIC0wLjA4OTg2MzczMSwgMC4xNDI0NjkwMywgLTAuMDU3ODgwMTM2LAorICAgICAgLTAuMDMyOTA4NzI5LCAwLjAxMTkzMzE0NSwgMC4wMTkyNDg3MTYsIC0wLjAwMTY0Mjg0NCwgLTAuMDA5ODkxNTQxLCAwLjAwMDExNzU4OTM4LCAwLjAwMzI5MzMzNTcsIDAuMDAwNTMzMDI0MjUsCisgICAgICAtMC4wMDA5NjM4NDAwNywgLTAuMDAwMjgxNzA5MTQsIDAuMDAwMjEzNjQzOTYsIDAuMDAwMDg0MjIxMzk2LCAtMC4wMDAwMzA2MDQwNTQsIC0wLjAwMDAxNzgwMzQ3OSwgMC4wMDAwMDI3NzQxNjU3LCAwLjAwMDAwMjI3OTA4NDgsCisgICAgICAtMS4zMzQzNjkyZS03LCAtMS4yODM3MzU4ZS03LCAtMi44MjkxMTY2ZS0xMSwgLTQuNTExMzkzMmUtMTIsIDkuNjUzODU5ODAwMDAwMDAxZS0xMiwgMi41MTg4MzczZS0xMiwgLTEuOTQxMTA5N2UtMTIsIC04LjQ4NjAzNzllLTEzLAorICAgICAgMi40MDU1NjUzZS0xMywgMS42NjA4ODg1ZS0xMywgLTEuNzgzNDA5M2UtMTQsIC0xLjU2ODk2MDNlLTE0LCA1LjAxMTM4NzJlLTE2LCA0LjgxODQ5MmUtMTYsIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wMjk1MDc1ODUsIDAuMjM5MTU2NjQsIC0wLjMxMzc0NTM3LCAtMC4xOTE0Nzc4MiwgMC42Njc2MTA1NCwgLTAuNTQ0NzY3NDIsIDAuMTc3MTgyMTQsIC0wLjA4NTg5MzkzNywKKyAgICAgIDAuMTQwODE0MjMsIC0wLjA2Mjk4NDcsIC0wLjAzMzA1NjMzNiwgMC4wMTMwNTUwMDEsIDAuMDIwMDk2NjI1LCAtMC4wMDE4NjgyMjkyLCAtMC4wMTAzNTE5OTYsIDAuMDAwMTI4Mjc3NTIsCisgICAgICAwLjAwMzQ1Mzg2ODEsIDAuMDAwNTYxMjU1NzUsIC0wLjAwMTAxMDE1MTQsIC0wLjAwMDI5NTY2MDg2LCAwLjAwMDIyMzIzMTY4LCAwLjAwMDA4ODI1NzQwOTk5OTk5OTk5LCAtMC4wMDAwMzE4OTY4MTQsIC0wLjAwMDAxODU5NjE3NiwKKyAgICAgIDAuMDAwMDAyODg0NTczNiwgMC4wMDAwMDIzNzEwNTAxLCAtMS4zODMyNDc0ZS03LCAtMS4zMzA0MDY3ZS03LCAtMS43Mjk0ODY5ZS0xMSwgLTIuODExOTdlLTEyLCA2LjM5NzQ4NjZlLTEyLCAxLjU4NTUwNTdlLTEyLAorICAgICAgLTEuMTk3MjIxMWUtMTIsIC01LjYzMzg0NjVlLTEzLCAxLjMxMzQ2MDJlLTEzLCAxLjAzNzkwMzllLTEzLCAtNy43MzIwMzM0MDAwMDAwMDFlLTE1LCAtNy40MzQxODk1OTk5OTk5OTllLTE1LCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDIxMzcwMjYsIC0wLjExMjUzNjAxLCAwLjA0MjU4OTk5NCwgMC4yNTE0ODE0NSwgLTAuMjk5OTI1OTcsIC0wLjE4NDcwNzA1LCAwLjY1NzkwMjU4LCAtMC41NDc5NzY4NiwKKyAgICAgIDAuMTc3NDY5MzgsIC0wLjA4MzY4MjE2NywgMC4xNDIwMDcyNywgLTAuMDY0MDU5NTgzLCAtMC4wMzM3ODAxNzYsIDAuMDEzMjgxMDQyLCAwLjAyMDUzNjI1NiwgLTAuMDAxOTAwODYxOCwKKyAgICAgIC0wLjAxMDUzMjE1NiwgMC4wMDAxMTM4NTkwOCwgMC4wMDM1MTA5MzAzLCAwLjAwMDU3NDQwNzYxLCAtMC4wMDEwMjQ1NjcyLCAtMC4wMDAzMDA2MTQ4LCAwLjAwMDIyNTg1NDc2LCAwLjAwMDA4OTQ4OTgwMDk5OTk5OTk5LAorICAgICAgLTAuMDAwMDMyMjE4NTg3LCAtMC4wMDAwMTg4MDQ3NTIsIDAuMDAwMDAyOTEwMjMxOCwgMC4wMDAwMDIzOTIyMzQ0LCAtMS4zOTUyMjI2ZS03LCAtMS4zNDAzNjM3ZS03LCAzLjk2MDgzMDJlLTExLCAxLjM5MDU0NjFlLTExLAorICAgICAgLTYuMTM2Mzc2NWUtMTIsIC0zLjM4NDAxNzRlLTEyLCA1LjkwMTIyODFlLTEzLCA0Ljc5OTUyMjZlLTEzLCAtMy4wMDUyNjQzZS0xNCwgLTIuODg5NDk1NWUtMTQsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMDExMDEyMzIsIDAuMDMwMTY0NTY0LCAwLjAxODIzNzcyMSwgLTAuMTE2MDUxNzksIDAuMDM5NzMwOTc0LCAwLjI1MDI3MDAzLCAtMC4yOTg4MjE2NCwgLTAuMTgzMDM0NzQsCisgICAgICAwLjY1Nzc1MDAxLCAtMC41NDg2MjA4NiwgMC4xNzcwMzE2NSwgLTAuMDgzMzMwMzUyLCAwLjE0MjMxMDEsIC0wLjA2NDE4MDgzOSwgLTAuMDMzOTQzNjM5LCAwLjAxMzMwMjU4NiwKKyAgICAgIDAuMDIwNjEyNTA4LCAtMC4wMDE4OTkxNDkyLCAtMC4wMTA1NTkyNjUsIDAuMDAwMTA5NjEzNjYsIDAuMDAzNTE4NTQzLCAwLjAwMDU3NjU4MTE4LCAtMC4wMDEwMjYyNDgzLCAtMC4wMDAzMDEyNzY2NiwKKyAgICAgIDAuMDAwMjI2MTIxNTMsIDAuMDAwMDg5NjMwODQ3LCAtMC4wMDAwMzIyNDYyNzcsIC0wLjAwMDAxODgyNTM3MSwgMC4wMDAwMDI5MTE2MDMzLCAwLjAwMDAwMjM5MzkzNjgsIC0xLjM5Mzc3MDllLTcsIC0xLjM0MDQ0NTFlLTcsCisgICAgICAtOS4xMjIzMDA4ZS0xMiwgLTUuNDA5NDk1N2UtMTIsIDguMTMyMTgwNmUtMTMsIDYuNzI5Njg2NmUtMTMsIC0zLjc0MzcwNzFlLTE0LCAtMy41OTk0OTI0ZS0xNCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAwMjc1MjM4NjYsIC0wLjAwNTMxNTE5MjksIC0wLjAxMDUyMjAwMSwgMC4wMzA3NDYwNTEsIDAuMDE4NzAxNjY0LCAtMC4xMTU4ODAyNCwgMC4wMzk1NzY1ODksIDAuMjUwMDE5NjEsCisgICAgICAtMC4yOTg4NTQ1MiwgLTAuMTgyODgwNTIsIDAuNjU3ODEyNjYsIC0wLjU0ODY4MjYxLCAwLjE3Njk3MTcsIC0wLjA4MzMwMzg4OTAwMDAwMDAxLCAwLjE0MjM0MzQ0LCAtMC4wNjQxODc0MzcsCisgICAgICAtMC4wMzM5NTk1OSwgMC4wMTMzMDMwNDYsIDAuMDIwNjE4NjE0LCAtMC4wMDE4OTg0NjM3LCAtMC4wMTA1NjExOTgsIDAuMDAwMTA5MjAwMzEsIDAuMDAzNTE5MDIwNywgMC4wMDA1NzY3MzQ4MSwKKyAgICAgIC0wLjAwMTAyNjM0NDIsIC0wLjAwMDMwMTMxNTgxLCAwLjAwMDIyNjEzNzE5LCAwLjAwMDA4OTYzODA3MSwgLTAuMDAwMDMyMjQ4NDk4LCAtMC4wMDAwMTg4MjY0NDYsIDAuMDAwMDAyOTExOTYwNiwgMC4wMDAwMDIzOTQwODg4LAorICAgICAgLTEuMzk0NDAzOWUtNywgLTEuMzQwNzEwNmUtNywgLTQuNjQ0MDY1NWUtMTMsIC0zLjU1MDc0ODdlLTEzLCAzLjE0Mjg4NTNlLTE0LCAzLjAyMTgxNTNlLTE0LCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjAwMDQyMTAwMywgMC4wMDA2MTkxOTQzMywgMC4wMDI3MDE5NjM4LCAtMC4wMDUzNzY1Nzc1LCAtMC4wMTA1NzEzMjIsIDAuMDMwNzI4MTQxLCAwLjAxODcxODA3NSwgLTAuMTE1ODU0MzQsCisgICAgICAwLjAzOTU4MDEyOCwgMC4yNTAwMDMxOCwgLTAuMjk4ODYyMzQsIC0wLjE4Mjg3MjM1LCAwLjY1NzgxODk4MDAwMDAwMDEsIC0wLjU0ODY4NTY3LCAwLjE3Njk2NzYzLCAtMC4wODMzMDI5NzYsCisgICAgICAwLjE0MjM0NTUyLCAtMC4wNjQxODc2NjcsIC0wLjAzMzk2MDMyNiwgMC4wMTMzMDI5NjMsIDAuMDIwNjE4OSwgLTAuMDAxODk4NDI5MSwgLTAuMDEwNTYxMjczLCAwLjAwMDEwOTE4MzQyLAorICAgICAgMC4wMDM1MTkwMzk2LCAwLjAwMDU3NjczOTk5LCAtMC4wMDEwMjYzNDg5LCAtMC4wMDAzMDEzMTY5NiwgMC4wMDAyMjYxMzgyOCwgMC4wMDAwODk2MzgzODIsIC0wLjAwMDAzMjI0ODc1NSwgLTAuMDAwMDE4ODI2NTMzLAorICAgICAgMC4wMDAwMDI5MTIwMTMxLCAwLjAwMDAwMjM5NDExMDMsIC0xLjM5NDQ3N2UtNywgLTEuMzQwNzUzNGUtNywgMS45MTkxNDU3ZS0xMywgMS44NDUyMTY1ZS0xMywgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAwMDAzODc5MTI4MywgLTAuMDAwMDQ1NTY5Njk5LCAtMC4wMDA0MTc3NzUzNSwgMC4wMDA2MjMxOTUwMSwgMC4wMDI3MDUyMDU2LCAtMC4wMDUzNzUzOTMsIC0wLjAxMDU3MjQwMiwgMC4wMzA3MjY0MzcsCisgICAgICAwLjAxODcxNzg2OCwgLTAuMTE1ODUzMTcsIDAuMDM5NTgwNjYzLCAwLjI1MDAwMjQzLCAtMC4yOTg4NjI3MywgLTAuMTgyODcxNzYsIDAuNjU3ODE4ODUsIC0wLjU0ODY4NiwKKyAgICAgIDAuMTc2OTY4MzksIC0wLjA4MzMwMzcyLCAwLjE0MjM0NTgyLCAtMC4wNjQxODc3NzgsIC0wLjAzMzk2MDE1LCAwLjAxMzMwMjg3MSwgMC4wMjA2MTg4NTksIC0wLjAwMTg5ODQwOTMsCisgICAgICAtMC4wMTA1NjEyNDYsIDAuMDAwMTA5MTgwMzYsIDAuMDAzNTE5MDI1MywgMC4wMDA1NzY3NDAyNCwgLTAuMDAxMDI2MzQ0MSwgLTAuMDAwMzAxMzE2MTgsIDAuMDAwMjI2MTM2ODcsIDAuMDAwMDg5NjM3OTY5LAorICAgICAgLTAuMDAwMDMyMjQ4NDQ0LCAtMC4wMDAwMTg4MjY0MSwgMC4wMDAwMDI5MTE5Njg3LCAwLjAwMDAwMjM5NDA4NDQsIC0xLjM5NDQzNjllLTcsIC0xLjM0MDcyMDVlLTcsIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wLCAwLjAsIC0wLjAwMDAwMTc0NDU0NTcsIDAuMDAwMDAxODE0NDQxLCAwLjAwMDAzODY3NjAwOCwgLTAuMDAwMDQ1NzE2MTY5LCAtMC4wMDA0MTc4OTQ5MiwgMC4wMDA2MjMxNTE0OSwKKyAgICAgIDAuMDAyNzA1MjQ1NywgLTAuMDA1Mzc1MzMwOCwgLTAuMDEwNTcyMzk2LCAwLjAzMDcyNjM5NCwgMC4wMTg3MTc4NSwgLTAuMTE1ODUzMTUsIDAuMDM5NTgwNjgsIDAuMjUwMDAyNDIsCisgICAgICAtMC4yOTg4NjI3NCwgLTAuMTgyODcxNzYsIDAuNjU3ODE4ODUsIC0wLjU0ODY4NiwgMC4xNzY5NjgzOSwgLTAuMDgzMzAzNzIsIDAuMTQyMzQ1ODIsIC0wLjA2NDE4Nzc3OCwKKyAgICAgIC0wLjAzMzk2MDE1LCAwLjAxMzMwMjg3MiwgMC4wMjA2MTg4NTksIC0wLjAwMTg5ODQxMDMsIC0wLjAxMDU2MTI0NSwgMC4wMDAxMDkxODIyNywgMC4wMDM1MTkwMjM1LCAwLjAwMDU3NjczNjkxMDAwMDAwMDEsCisgICAgICAtMC4wMDEwMjYzNDA5LCAtMC4wMDAzMDEzMTEzNywgMC4wMDAyMjYxMzEwMSwgMC4wMDAwODk2MzA3NzgsIC0wLjAwMDAzMjIzNTI0MiwgLTAuMDAwMDE4Nzk3MTM0LCAwLjAwMDAwMjkzMTEwNTQsIDAuMDAwMDAyMzkzMzA5NSwgfSwKKyAgICB7IDAuMCwgMC4wLCAyLjQwMDk5NmUtMTIsIC0yLjQ5NzE5MmUtMTIsIC0wLjAwMDAwMTc0NDU5ODksIDAuMDAwMDAxODE0NTAzOSwgMC4wMDAwMzg2NzY1ODMsIC0wLjAwMDA0NTcxNzAyNywKKyAgICAgIC0wLjAwMDQxNzg5ODY0LCAwLjAwMDYyMzE1ODg5LCAwLjAwMjcwNTI2MDMsIC0wLjAwNTM3NTM3MzEsIC0wLjAxMDU3MjQyMiwgMC4wMzA3MjY1NTMsIDAuMDE4NzE3Nzk2LCAtMC4xMTU4NTM0OSwKKyAgICAgIDAuMDM5NTgxMDkxLCAwLjI1MDAwMjY3LCAtMC4yOTg4NjM2NSwgLTAuMTgyODcxLCAwLjY1NzgxODYxLCAtMC41NDg2ODU4OSwgMC4xNzY5NjgxOSwgLTAuMDgzMzAzNjI4LAorICAgICAgMC4xNDIzNDU4NywgLTAuMDY0MTg3ODA3LCAtMC4wMzM5NjAxNzQsIDAuMDEzMzAyODk3LCAwLjAyMDYxODg1OSwgLTAuMDAxODk4NDUyNiwgLTAuMDEwNTYxMjEzLCAwLjAwMDEwOTI1NTQ1LAorICAgICAgMC4wMDM1MTg5NTQ0LCAwLjAwMDU3NjYyNzg2MDAwMDAwMDEsIC0wLjAwMTAyNjIxMTEsIC0wLjAwMDMwMTE0NTk4LCAwLjAwMDIyNTg0NjU0LCAwLjAwMDA4OTAyMjQ3Njk5OTk5OTk5LCAtMC4wMDAwMzI1NTIxNDQsIC0wLjAwMDAxODY2NDQ0OSwgfSwKKyAgICB7IDAuMCwgMC4wLCAzLjkzMTk3ODNlLTEzLCAtNC4wODk1MTMyZS0xMywgLTYuMzE2MDcxOWUtMTIsIDcuODA2NjM2M2UtMTIsIC0wLjAwMDAwMTc0NDUwNDcsIDAuMDAwMDAxODE0MzYzNSwKKyAgICAgIDAuMDAwMDM4Njc1OTczLCAtMC4wMDAwNDU3MTU4MTUsIC0wLjAwMDQxNzg5NjI2LCAwLjAwMDYyMzE1MTk2LCAwLjAwMjcwNTI1NiwgLTAuMDA1Mzc1MzQ3LCAtMC4wMTA1NzI0MzEsIDAuMDMwNzI2NDk3LAorICAgICAgMC4wMTg3MTc4NjMsIC0wLjExNTg1MzQ1LCAwLjAzOTU4MDk0NCwgMC4yNTAwMDI3OSwgLTAuMjk4ODYzNjksIC0wLjE4Mjg3MDk3LCAwLjY1NzgxODU4LCAtMC41NDg2ODU5MiwKKyAgICAgIDAuMTc2OTY4MiwgLTAuMDgzMzAzNTE0LCAwLjE0MjM0NTgyLCAtMC4wNjQxODgwNjcsIC0wLjAzMzk2MDAxOCwgMC4wMTMzMDMzOTksIDAuMDIwNjE4NDM4LCAtMC4wMDE4OTkzNDc4LAorICAgICAgLTAuMDEwNTYwMzc2LCAwLjAwMDExMDYyMzMsIDAuMDAzNTE3MzgyMSwgMC4wMDA1NzQ1MzAyLCAtMC4wMDEwMjI5MjgzLCAtMC4wMDAyOTQ1MzE1NiwgMC4wMDAyMjc3OTkyOCwgMC4wMDAwODUzNjI2MTUsIH0sCisgICAgeyAwLjAsIDAuMCwgLTQuNjgzNDkxMmUtMTMsIDQuODcxMTM1NWUtMTMsIDEuMDc3NjM0NmUtMTEsIC0xLjI2ODIxMzVlLTExLCAtMS4xODUwNjE3ZS0xMCwgMS43NTEwMDllLTEwLAorICAgICAgLTAuMDAwMDAxNzQzNzc4NCwgMC4wMDAwMDE4MTI5MjAzLCAwLjAwMDAzODY3MzEzMywgLTAuMDAwMDQ1NzA3NTY0LCAtMC4wMDA0MTc4OTEyMSwgMC4wMDA2MjMxMjA4Mjk5OTk5OTk5LCAwLjAwMjcwNTI2NjQsIC0wLjAwNTM3NTI3OTUsCisgICAgICAtMC4wMTA1NzI1MDksIDAuMDMwNzI2NDQ1LCAwLjAxODcxODAzMiwgLTAuMTE1ODUzNTgsIDAuMDM5NTgxMDE2LCAwLjI1MDAwMjY4LCAtMC4yOTg4NjM3LCAtMC4xODI4NzA2OCwKKyAgICAgIDAuNjU3ODE4NTgsIC0wLjU0ODY4Njc3LCAwLjE3Njk2ODQ3LCAtMC4wODMzMDE2MjIwMDAwMDAwMSwgMC4xNDIzNDQ3NiwgLTAuMDY0MTkxNzg3LCAtMC4wMzM5NTcwMjQsIDAuMDEzMzEwMDc2LAorICAgICAgMC4wMjA2MTIyNTgsIC0wLjAwMTkwOTc1NTQsIC0wLjAxMDU0ODY0NCwgMC4wMDAxMjY3MTg0MiwgMC4wMDM0OTM3NjY2LCAwLjAwMDUyOTEzMzk5LCAtMC4wMDEwMjc4MzA0LCAtMC4wMDAyNTYyNzMxNCwgfSwKKyAgICB7IDAuMCwgMC4wLCAtMy43NTkxMTQxZS0xMywgMy45MDk3MjMyZS0xMywgNy44NjU0ODMzZS0xMiwgLTkuMzYzNzE5NGUtMTIsIC03LjkyNzA4NDVlLTExLCAxLjIxNTkzMzVlLTEwLAorICAgICAgNC42NDQxNDkxZS0xMCwgLTkuODMxNjQ5OGUtMTAsIC0wLjAwMDAwMTc0NjA1NTQsIDAuMDAwMDAxODE5NTQsIDAuMDAwMDM4Njc3MTM0LCAtMC4wMDAwNDU3MzI0OTEsIC0wLjAwMDQxNzg4MjIyLCAwLjAwMDYyMzE3NDA3LAorICAgICAgMC4wMDI3MDUxOTc5LCAtMC4wMDUzNzUzMTIxLCAtMC4wMTA1NzIzNDMsIDAuMDMwNzI2Mjc0LCAwLjAxODcxNzk2NCwgLTAuMTE1ODUzMywgMC4wMzk1ODEzMzgsIDAuMjUwMDAxNDMsCisgICAgICAtMC4yOTg4NjQwNywgLTAuMTgyODY2OCwgMC42NTc4MTc4MiwgLTAuNTQ4Njk1ODgsIDAuMTc2OTczMzgsIC0wLjA4MzI4NDI4OSwgMC4xNDIzMzExMSwgLTAuMDY0MjIzMDcyMDAwMDAwMDEsCisgICAgICAtMC4wMzM5MjgxNDUsIDAuMDEzMzU5MTk3LCAwLjAyMDU1NzI3OSwgLTAuMDAxOTg1OTYwNSwgLTAuMDEwNDQwNjc5LCAwLjAwMDMyODQ1OTgyLCAwLjAwMzQ5MjIxNjQsIDAuMDAwMzE5NTA3MjMsIH0sCisgICAgeyAwLjAsIDAuMCwgLTkuNzAwODE3NmUtMTQsIDEuMDA4OTQ4MWUtMTMsIDEuNzc0NzNlLTEyLCAtMi4xNTExNDgzZS0xMiwgLTEuNTM3MjI2MmUtMTEsIDIuNTI4NzY0NWUtMTEsCisgICAgICA3LjExNTkwMzEwMDAwMDAwMWUtMTEsIC0xLjc3MzExZS0xMCwgLTEuMjM0ODIxM2UtMTAsIDcuMjU0Mjk3MmUtMTAsIC0wLjAwMDAwMTc0NTAwMTYsIDAuMDAwMDAxODEzMDg0NCwgMC4wMDAwMzg2Nzg5NzEsIC0wLjAwMDA0NTcxODE3LAorICAgICAgLTAuMDAwNDE3ODkzODgsIDAuMDAwNjIzMTU3MTEsIDAuMDAyNzA1MTkyMSwgLTAuMDA1Mzc1MjcwNywgLTAuMDEwNTcyMDg3LCAwLjAzMDcyNTczNiwgMC4wMTg3MTcwMTEsIC0wLjExNTg1MDQ0LAorICAgICAgMC4wMzk1ODM1OCwgMC4yNDk5OTAyMiwgLTAuMjk4ODY1MjQsIC0wLjE4MjgzNTAxLCAwLjY1NzgwNTU1LCAtMC41NDg3NjExOTk5OTk5OTk5LCAwLjE3NzAyMTgxLCAtMC4wODMxNzM3MDIsCisgICAgICAwLjE0MjIyOTczLCAtMC4wNjQzOTk2ODcsIC0wLjAzMzczMjgxNywgMC4wMTM2MzM1NSwgMC4wMjAxODQ1NTIsIC0wLjAwMjY1ODIzNTYsIC0wLjAxMDMzNDI0MywgMC4wMDExOTg5NjM4LCB9LAorICAgIHsgMC4wLCAwLjAsIDQuODA5NjQxN2UtMTUsIC01LjAwMjM0MDllLTE1LCAtMi4wMzYzNjA1ZS0xMywgMi4yNjkzMjE0ZS0xMywgMi45MjY4NTQ1ZS0xMiwgLTMuODY5MTU2NmUtMTIsCisgICAgICAtMi4yODMwNDk5ZS0xMSwgNC4wMTA3MjFlLTExLCAxLjAwMzA1MzllLTEwLCAtMi42MjAyMTM1ZS0xMCwgLTEuNzUwNzY5ZS0xMCwgMS4wNDQ4MTc0ZS05LCAtMC4wMDAwMDE3NDQ5OTIzLCAwLjAwMDAwMTgxMjI3MiwKKyAgICAgIDAuMDAwMDM4Njc2Njk2LCAtMC4wMDAwNDU3MTQwNywgLTAuMDAwNDE3ODU1NCwgMC4wMDA2MjMxMDI0MiwgMC4wMDI3MDQ4NjIxLCAtMC4wMDUzNzQ2OTgyLCAtMC4wMTA1NzAyODQsIDAuMDMwNzIxNjcsCisgICAgICAwLjAxODcxMDQ3MSwgLTAuMTE1ODI5NTksIDAuMDM5NTk2ODc2LCAwLjI0OTkxMzQ3LCAtMC4yOTg4NjM2OCwgLTAuMTgyNjMyMDYsIDAuNjU3Njk5MTQsIC0wLjU0OTE0MjU5LAorICAgICAgMC4xNzczNDc0MiwgLTAuMDgyNjE4ODA1LCAwLjE0MTYyNzcyLCAtMC4wNjUyNzcwOTE5OTk5OTk5OSwgLTAuMDMyNjA3ODEzLCAwLjAxNTU3NDE2NSwgMC4wMTk0NzM4OSwgLTAuMDA1ODQ3ODAyNywgfSwKKyAgICB7IDAuMCwgMC4wLCAxLjE2MjA3NzNlLTE0LCAtMS4yMDg2MzU5ZS0xNCwgLTIuNTI4MTIyNWUtMTMsIDIuOTk1MTUxNmUtMTMsIDIuNTc5ODg2OGUtMTIsIC0zLjkyMzgxNzJlLTEyLAorICAgICAgLTEuNTA5MTcwOGUtMTEsIDMuMTkzNDUzN2UtMTEsIDQuNzU4NjI5M2UtMTEsIC0xLjY0NTQ4NjNlLTEwLCAtMi40MzYzMzE1ZS0xMSwgNS4wOTYxNTQ0ZS0xMCwgLTQuMzg2OTE5OGUtMTAsIC02LjIwMzMwODllLTEwLAorICAgICAgLTAuMDAwMDAxNzQyNTI4MSwgMC4wMDAwMDE4MTI5OTc2LCAwLjAwMDAzODY1OTMyOCwgLTAuMDAwMDQ1Njk1NDE3LCAtMC4wMDA0MTc2ODQ2MSwgMC4wMDA2MjI4NjUxMSwgMC4wMDI3MDM0Njc1LCAtMC4wMDUzNzIyNzM0LAorICAgICAgLTAuMDEwNTYyNzc4LCAwLjAzMDcwNDUyNSwgMC4wMTg2ODM5NzMsIC0wLjExNTc0MzMsIDAuMDM5NjQ0ODg2LCAwLjI0OTYwNTAyLCAtMC4yOTg4MjMzOCwgLTAuMTgxODU4MDIsCisgICAgICAwLjY1NzIwMjE2LCAtMC41NTAzNjc5OCwgMC4xNzg1NjYxNiwgLTAuMDgwOTE0MTYzLCAwLjEzOTU0MzcxLCAtMC4wNjg4MjUyMjAwMDAwMDAwMSwgLTAuMDMwNzIzNzAxLCAwLjAyMjcwMDYxMiwgfSwKKyAgICB7IDAuMCwgMC4wLCAzLjM3NjAyOThlLTE1LCAtMy41MTEyOTIyZS0xNSwgLTYuMzIwNjk4OWUtMTQsIDcuNjM2NDgxODAwMDAwMDAxZS0xNCwgNS41NTU4OTAzZS0xMywgLTkuMDYwMzAzNWUtMTMsCisgICAgICAtMi42NTMzOTg1ZS0xMiwgNi40NzQ5MDExZS0xMiwgNS4zNjM0MDIyZS0xMiwgLTIuNzUwNzIzOWUtMTEsIDEuMTM2MzQ3NGUtMTEsIDUuOTYwMjIyZS0xMSwgLTEuMDA5MTM3M2UtMTAsIDIuNTgwODQ5N2UtMTEsCisgICAgICAxLjM5NTMwNzJlLTEwLCAtMi42NjUxNjg1ZS0xMCwgLTAuMDAwMDAxNzQyMjU2LCAwLjAwMDAwMTgxMjQ1MTYsIDAuMDAwMDM4NjExMTA3LCAtMC4wMDAwNDU2NDA1OTQsIC0wLjAwMDQxNzAzMTEzLCAwLjAwMDYyMTk3NTQ0LAorICAgICAgMC4wMDI2OTgxNTAxLCAtMC4wMDUzNjMwNTk5LCAtMC4wMTA1MzUwODUsIDAuMDMwNjQwMDI0LCAwLjAxODU5NTAyOSwgLTAuMTE1NDMwNzcsIDAuMDM5NzY1NDE2LCAwLjI0ODU2NjY2LAorICAgICAgLTAuMjk4NTI5MDksIC0wLjE3OTU4NzczLCAwLjY1NTU1OTk2MDAwMDAwMDEsIC0wLjU1Mzg1ODc2OTk5OTk5OTksIDAuMTgyMDY2MjgsIC0wLjA3NTcwMTY1NjAwMDAwMDAxLCAwLjEzNDMwNzY0LCAtMC4wODQwODE1MTg5OTk5OTk5OSwgfSwKKyAgICB7IDAuMCwgMC4wLCA1Ljk5MTgwMTdlLTE2LCAtNi4yMzE4MDMyZS0xNiwgLTkuOTM3OTc1OWUtMTUsIDEuMjIyMTY4M2UtMTQsIDguMDg0NTcyN2UtMTQsIC0xLjM4Mjk1ODVlLTEzLAorICAgICAgLTMuNzY1MDAzOGUtMTMsIDkuNDU5NjI2Nzk5OTk5OTk5ZS0xMywgOS44NjkyMDU0OTk5OTk5OTllLTEzLCAtNC4xMTIxMDU1ZS0xMiwgLTEuMTEyMDU1MmUtMTIsIDEuMjQwMjQxOGUtMTEsIC0yLjA1NzY1MjRlLTEyLCAtMi42NzI0MzUzZS0xMSwKKyAgICAgIDEuNDk1Nzk3OWUtMTIsIDkuMTM3NzM0ODAwMDAwMDAxZS0xMSwgLTEuNTg0NTkxNWUtOSwgMS40Nzg0MzI2ZS05LCAtMC4wMDAwMDE2ODYxODQ4LCAwLjAwMDAwMTc0OTM4NTIsIDAuMDAwMDM3ODIxODU2LCAtMC4wMDAwNDQ1ODU3ODQsCisgICAgICAtMC4wMDA0MTAzMTg5NCwgMC4wMDA2MTA1NjI3NSwgMC4wMDI2NTk4NDgyLCAtMC4wMDUyNzkwNjY5LCAtMC4wMTAzODY4MDMsIDAuMDMwMTk1NDIzLCAwLjAxODIxNzk4NCwgLTAuMTEzNjU1NjYsCisgICAgICAwLjA0MDI4ODU0NiwgMC4yNDMyMTI0NSwgLTAuMjk4NjIwMDQsIC0wLjE2NDg0Nzk5LCAwLjY0OTQ2MjI5LCAtMC41ODY1MDQxMywgMC4yMDYzNDA0NSwgLTAuMDE0MzY1NDc2LCB9LAorICAgIHsgMC4wLCAwLjAsIDYuNjQ2NzU2OGUtMTcsIC02LjkxMjMwNWUtMTcsIC02LjI0NzU2MDNlLTE2LCA4LjU4NjcwNzFlLTE2LCA4LjczNTcwMzllLTE2LCAtNS40MTI2Mzk2ZS0xNSwKKyAgICAgIDIuMjIwMjY2NGUtMTQsIC01LjQ0OTI1OThlLTE1LCAtMS43MDU5MmUtMTMsIDIuODMxOTQ4MWUtMTMsIDYuMzMxNTQ4ZS0xMywgLTEuNzc0ODQwOWUtMTIsIC0xLjcxOTY2MDNlLTEyLCA2Ljg1MzA0NzllLTEyLAorICAgICAgMi4wOTE5NTg5ZS0xMiwgLTEuOTE5NDU4M2UtMTEsIC0xLjM4NjgxMDdlLTgsIDEuNDUwNzU0OGUtOCwgMi40NTQ4NDI3ZS03LCAtMi45OTA1NjI4ZS03LCAtMC4wMDAwMDM1OTcxNDk0LCAwLjAwMDAwNTA0NTExMDksCisgICAgICAwLjAwMDA0NjcyNDI0LCAtMC4wMDAwNjc0NTY4MTgsIC0wLjAwMDQ0MTUzODIyLCAwLjAwMDcxNDMwMDYyLCAwLjAwMjc1MzIyODYsIC0wLjAwNTY2ODg0NjIsIC0wLjAxMDcyNzA3NCwgMC4wMzE4MDA5MTYsCisgICAgICAwLjAxOTg3MTg0OCwgLTAuMTE5ODk1NTksIDAuMDM2NjU5MTM1LCAwLjI2NjMyMjAxLCAtMC4zMDU3Mzk3LCAtMC4yMzIyMDMzNSwgMC42ODc0MTM1MiwgLTAuNTQwMjQwMjcsIH0KK307CisKK2NvbnN0IGRvdWJsZSogY29uc3QgZmZfb24yYXZjX3RhYnNfMTlfNDBfMVsxOV0gPSB7CisgICAgdGFic18xOV80MFsgMF0sIHRhYnNfMTlfNDBbIDFdLCB0YWJzXzE5XzQwWyAyXSwgdGFic18xOV80MFsgM10sCisgICAgdGFic18xOV80MFsgNF0sIHRhYnNfMTlfNDBbIDVdLCB0YWJzXzE5XzQwWyA2XSwgdGFic18xOV80MFsgN10sCisgICAgdGFic18xOV80MFsgOF0sIHRhYnNfMTlfNDBbIDldLCB0YWJzXzE5XzQwWzEwXSwgdGFic18xOV80MFsxMV0sCisgICAgdGFic18xOV80MFsxMl0sIHRhYnNfMTlfNDBbMTNdLCB0YWJzXzE5XzQwWzE0XSwgdGFic18xOV80MFsxNV0sCisgICAgdGFic18xOV80MFsxNl0sIHRhYnNfMTlfNDBbMTddLCB0YWJzXzE5XzQwWzE4XSwKK307CisKK2NvbnN0IGRvdWJsZSogY29uc3QgZmZfb24yYXZjX3RhYnNfMTlfNDBfMlsxOV0gPSB7CisgICAgdGFic18xOV80MFsxOV0sIHRhYnNfMTlfNDBbMjBdLCB0YWJzXzE5XzQwWzIxXSwgdGFic18xOV80MFsyMl0sCisgICAgdGFic18xOV80MFsyM10sIHRhYnNfMTlfNDBbMjRdLCB0YWJzXzE5XzQwWzI1XSwgdGFic18xOV80MFsyNl0sCisgICAgdGFic18xOV80MFsyN10sIHRhYnNfMTlfNDBbMjhdLCB0YWJzXzE5XzQwWzI5XSwgdGFic18xOV80MFszMF0sCisgICAgdGFic18xOV80MFszMV0sIHRhYnNfMTlfNDBbMzJdLCB0YWJzXzE5XzQwWzMzXSwgdGFic18xOV80MFszNF0sCisgICAgdGFic18xOV80MFszNV0sIHRhYnNfMTlfNDBbMzZdLCB0YWJzXzE5XzQwWzM3XSwKK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgdGFic18yMF84NFsyMCAqIDRdWzg0XSA9IHsKKyAgICB7IC0wLjEwNjkwNTgyLCAwLjA5NDY2MjE4MywgMC4zMTc1Nzk2MywgMC40ODM3MDIzNSwgMC41MzY3ODkxNiwgMC40NjcwNTU5OCwgMC4zMTYyMTEyMywgMC4xNTMyNjIyNywKKyAgICAgIDAuMDM4MzAyNzY1LCAtMC4wMDU0OTk4ODExLCAwLjAwNzM1MjAzNTIsIDAuMDQzODc5NjU3LCAwLjA2NzM3NDQwOCwgMC4wNjAwNzc2ODcsIDAuMDI3NDA1Mzg5LCAtMC4wMDk5ODM4NzMwMDAwMDAwMDEsCisgICAgICAtMC4wMzIwMzQ5ODUsIC0wLjAzMzUxNTMzNCwgLTAuMDE3MzI4ODgxLCAtMC4wMDA5ODkwMjUyMzAwMDAwMDAxLCAwLjAwNjA1OTc0MzQsIDAuMDA1NjA3MjQ2OCwgMC4wMDI1NzE3MjUsIC0wLjAwMDc5MzYwOTk3MDAwMDAwMDEsCisgICAgICAtMC4wMDI3MDE4MzIyLCAtMC4wMDI3NTMwNzAzLCAtMC4wMDE0ODQ1MTc3LCAwLjAwMDA2NDIwMzIxNywgMC4wMDEwMTY5NjY2LCAwLjAwMTE0MjU3NDYsIDAuMDAwNjM4ODU4NywgLTAuMDAwMDAxODYyNDM5OSwKKyAgICAgIC0wLjAwMDM4NTY3NDUsIC0wLjAwMDQzNDcxMDUzLCAtMC4wMDAyMzgwODk0OCwgLTAuMDAwMDAxMDk5Njg0MywgMC4wMDAxMzA0OTI5OSwgMC4wMDAxNDYyODkzNCwgMC4wMDAwODY5MDMwNzM5OTk5OTk5OSwgMC4wMDAwMjAxMzY3NzksCisgICAgICAtMC4wMDAwMTMxNzIxNiwgLTAuMDAwMDE3MTQyMDM1LCAtMC4wMDAwMDczMjMxMDc4LCAwLjAwMDAwMjcwNDMzODksIDAuMDAwMDA1OTU1NzMyOSwgMC4wMDAwMDQ1MDk2MjM4LCAwLjAwMDAwMjA4ODc5NTYsIDEuOTk0MDY5N2UtNywKKyAgICAgIC01LjkzNTgyNTZlLTcsIC03LjQyMjA2Njc5OTk5OTk5OWUtNywgLTcuMzU3MDY0NWUtNywgLTcuMzExNTU1M2UtNywgLTcuMjkzMzk5OWUtNywgLTYuODQzNTkwOWUtNywgLTUuMDcwNzk3NGUtNywgLTMuODY3OTMyOGUtNywKKyAgICAgIC0zLjQ1MjIyMDhlLTcsIC0yLjgyNzE2OTRlLTcsIC0xLjM3MTM0MjRlLTcsIDguMTE4NDI0OWUtOSwgOS4wMDc1NzdlLTgsIDEuMDMyOTM2NmUtNywgNi40NjMwMjcwOTk5OTk5OTllLTgsIDIuMTg2MDkxMmUtOCwKKyAgICAgIDUuMTA2Njg5NmUtMTAsIC0yLjY3MDc2MWUtOSwgLTguNTg3NjE5NmUtMTAsIDQuOTUyMDUxOWUtOSwgMS4wMTQ5MDk4ZS04LCAxLjA3NDg1OTRlLTgsIDUuNzYyMDM5OGUtOSwgMS43NDcyNjZlLTEyLAorICAgICAgLTMuMTIxMDU2NWUtOSwgLTMuNDY4MjYzM2UtOSwgLTEuOTY5NzkyZS05LCAtNC4zNDUxMDEzZS0xMCwgMi4xODM3NjAzZS0xMCwgMi41MjE3OTQ5ZS0xMCwgMS40NTY0MjIyZS0xMCwgMy45OTAwOTY3ZS0xMSwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjAwNjUxNTc1MTgsIC0wLjExNTUzMTkxLCAtMC4yMDAzMjM1LCAtMC4yMDQxODkxNywgLTAuMTAxNzI4MTgsIDAuMDg0Mjc0MzExLCAwLjI5MTg5OTUyLCAwLjQ0OTg5MzksCisgICAgICAwLjUwNjA1MzQ4MDAwMDAwMDEsIDAuNDQ5NTUyNDgsIDAuMzE2MjIzLCAwLjE2NzUxMDA3LCAwLjA1NzkzNDk3MSwgMC4wMDk4MjIzMjUsIDAuMDEyNTgyMDYsIDAuMDM5MTkzNzc1LAorICAgICAgMC4wNTgwMzI0NiwgMC4wNTI4MDQwMTIsIDAuMDI2NTk2OTM1LCAtMC4wMDQxMjgzMDkyLCAtMC4wMjMwOTI1OTYsIC0wLjAyNjE2Nzk5OSwgLTAuMDE0ODc0MTQ1LCAtMC4wMDM1MTcxNzY5LAorICAgICAgMC4wMDEwMTc3NzM3LCAwLjAwMTA0NDgwMTIsIDAuMDAwNTY0NTgyMzQsIC0wLjAwMDAyMTQ3MjcyLCAtMC4wMDAzNzk5NzY5OSwgLTAuMDAwNDI3NzY1NzIsIC0wLjAwMDI0MTM2NjU2LCAtMC4wMDAwMDUwMjM4NTM1LAorICAgICAgMC4wMDAxMzU4NTU3LCAwLjAwMDE1NDM4MDUyLCAwLjAwMDA4NDIzOTQ2NywgLTEuNjc4NzA0M2UtNywgLTAuMDAwMDQ2NTA2ODIyLCAtMC4wMDAwNTE1NzMxOTUsIC0wLjAwMDAzMDI2MzQxLCAtMC4wMDAwMDY2MDU2MzI5LAorICAgICAgMC4wMDAwMDUwNzA3ODI4LCAwLjAwMDAwNjM5MzMxOTIsIDAuMDAwMDAyOTI3MjA1OCwgLTUuNjg5OTExNmUtNywgLTAuMDAwMDAxNzA5MTI0OCwgLTAuMDAwMDAxMjYzOTY5LCAtNS41NzA5MDhlLTcsIC0xLjE0NjU2NjJlLTgsCisgICAgICAyLjE1NDQxNjllLTcsIDIuNTExNjEyMmUtNywgMi4zNzA4MTU2ZS03LCAyLjIyNTEwOTNlLTcsIDIuMTI4NzkxOGUtNywgMS45ODI4ODA2ZS03LCAxLjUxNzgzNDNlLTcsIDEuMjMzOTM5NGUtNywKKyAgICAgIDEuMTQ1MDgyM2UtNywgOS40Mjc4MzkwOTk5OTk5OTllLTgsIDQuNTkwOTg1MmUtOCwgLTIuODMzMzYxN2UtOSwgLTMuMDYxMjU0NGUtOCwgLTMuNTEwNDI2ZS04LCAtMi4xODU5MjA0ZS04LCAtNi45ODg0OTE4ZS05LAorICAgICAgNi4wMTgyOTc0ZS0xMCwgMS43MzQ2MTk2ZS05LCA3LjUyMTA3NzhlLTEwLCAtMS42MDQ1OTAxZS05LCAtMy41NDU5MDQyZS05LCAtMy43NjQyNDA0ZS05LCAtMi4wMjMyOTYzZS05LCAtMi4xNTQ4NzY2ZS0xMSwKKyAgICAgIDEuMDU0ODMwNmUtOSwgMS4xNzI0ODQ5ZS05LCA2LjY1OTg4MzRlLTEwLCAxLjQ3MTYwMDRlLTEwLCAtNy4zMzEwMTYzZS0xMSwgLTguNDY1ODE5MWUtMTEsIC00Ljg4OTI5ODFlLTExLCAtMS4zMzk0OTk4ZS0xMSwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDA5NTg0MjQ2MTAwMDAwMDAxLCAwLjA2MDAzNzk1MywgMC4wODk5NTcxNjYwMDAwMDAwMSwgMC4wNzAxNTI1NiwgLTAuMDA2NDk4MTU0MSwgLTAuMTE0MTI0MTksIC0wLjE5Nzg4MTM2LCAtMC4yMDE4Mzk4NSwKKyAgICAgIC0wLjEwMDkwMDY0LCAwLjA4MjU5MTkyOCwgMC4yODc3NzI3MiwgMC40NDQ1MDMxNiwgMC41MDEyMTk5NywgMC40NDY4OTUyOCwgMC4zMTYzNjAxNywgMC4xNjk3OTg0MiwKKyAgICAgIDAuMDYwODM1ODgyLCAwLjAxMTcyMTY0NiwgMC4wMTI1OTI5ODcsIDAuMDM3NDgxMTU1LCAwLjA1NTYzMDYyMywgMC4wNTA5NzEyODQsIDAuMDI2MTM4ODQ3LCAtMC4wMDMxOTM5OTgzLAorICAgICAgLTAuMDIxNDQ3Mjg1LCAtMC4wMjQ3MDc3MzgsIC0wLjAxNDI1MTM2NCwgLTAuMDAzODE1Mjc4MSwgMC4wMDAxOTMwNDE5OCwgMC4wMDAyMTc4Njc3MSwgMC4wMDAxMjMwODI5NywgMC4wMDAwMDM1MTU2NDM1LAorICAgICAgLTAuMDAwMDY3MTI5NjcyLCAtMC4wMDAwNzYzODcxOTQsIC0wLjAwMDA0MTc4MTc5MSwgLTQuNzM0NzYxOGUtNywgMC4wMDAwMjE4ODU0OTgsIDAuMDAwMDI0MjEyNjQ0LCAwLjAwMDAxNDA5MzM4NCwgMC4wMDAwMDI5NzM0Nzc4LAorICAgICAgLTAuMDAwMDAyNDI2NzczNCwgLTAuMDAwMDAyOTkwOTE4NywgLTAuMDAwMDAxNDA3OTQzNCwgMS42NDI1NTMyZS03LCA2LjY5NTE3MWUtNywgNC43OTk4MjcxZS03LCAyLjA0MTU3NjVlLTcsIC01LjU2MzEzMzJlLTEwLAorICAgICAgLTguMTQ0NjExMmUtOCwgLTkuMTQwNTAwODAwMDAwMDAxZS04LCAtOC42OTUxNjQ4ZS04LCAtOC4yNzk1MjAzZS04LCAtNy45NjE1NzUyOTk5OTk5OTllLTgsIC03LjU1MTI2MjVlLTgsIC02LjA1MTI3NzZlLTgsIC01LjMxMTM5MjZlLTgsCisgICAgICAtNS4xOTI0OTI1ZS04LCAtNC4zNTMzNjY5ZS04LCAtMi4xNTY5NDExZS04LCA5Ljc4MTE2NDEwMDAwMDAwMWUtMTAsIDEuMzk5MzQ4NGUtOCwgMS42MTIxMzM1ZS04LCA5Ljk1MDI1OTdlLTksIDIuODMwMTEyMmUtOSwKKyAgICAgIC05LjMwNzEwNjNlLTEwLCAtMS40ODI4ODYzZS05LCAtNy4yNDI4NjJlLTEwLCA2Ljc4NTM5NjllLTEwLCAxLjcxOTgyNTRlLTksIDEuODMzOTM1ZS05LCA5LjkxMDQxMTA5OTk5OTk5OWUtMTAsIDMuMTE4OTc5MmUtMTEsCisgICAgICAtNC43NjI1MDA1ZS0xMCwgLTUuMjk3NzE3OWUtMTAsIC0zLjAxMDIwMDZlLTEwLCAtNi42ODQyOTYxZS0xMSwgMy4yNDU0MDM1ZS0xMSwgMy43NDc3NzQ5ZS0xMSwgMi4xNjQ0NjczZS0xMSwgNS45Mjk4OTczZS0xMiwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDExMzY2MzIsIC0wLjAxNjQwODE1OCwgLTAuMDM0OTMzMiwgLTAuMDI3ODQ3MzksIDAuMDA5NjE0NTc3NiwgMC4wNTk5MzI1ODcsIDAuMDg5NzUzNDc5LCAwLjA2OTk3NTY3MSwKKyAgICAgIC0wLjAwNjQ5NDYxMzQsIC0wLjExMzg1OTIzLCAtMC4xOTc0Mjk5NCwgLTAuMjAxNDIzNjEsIC0wLjEwMDc5Mzc4LCAwLjA4MjIxMjUxLCAwLjI4Njk1MTIzLCAwLjQ0MzUxMTE0LAorICAgICAgMC41MDA0NDcyMywgMC40NDY2NjU5OCwgMC4zMTY3NjY4MiwgMC4xNzA2NTYzMywgMC4wNjE3NzEyNzgsIDAuMDEyMzU0NDEzLCAwLjAxMjcxNzIyNSwgMC4wMzcxNDAyNDQsCisgICAgICAwLjA1NTA3MTg5LCAwLjA1MDQ5ODQyNiwgMC4wMjU5NTc1NjYsIC0wLjAwMzA1MzM0NzMsIC0wLjAyMTExNzE5LCAtMC4wMjQzODEyNDQsIC0wLjAxNDA3ODAxLCAtMC4wMDM4MzA3MDg2LAorICAgICAgMC4wMDAwNTcyODQyNjQsIDAuMDAwMDY0NzE2MzczLCAwLjAwMDAzNTQ0NzIyNSwgMy4zNjQyNjc1ZS03LCAtMC4wMDAwMTg5NzkyNjcsIC0wLjAwMDAyMTIyMjk4MiwgLTAuMDAwMDEyNTgyMjI3LCAtMC4wMDAwMDI5MTkxNDYzLAorICAgICAgMC4wMDAwMDE4NzQwMDA2LCAwLjAwMDAwMjQ0NjA0NjMsIDAuMDAwMDAxMDcxMzg3NywgLTMuMjQ4Nzg3OGUtNywgLTcuNjc4MTkzM2UtNywgLTUuNjU4MzE5NWUtNywgLTIuNTA2ODE2NWUtNywgLTEuMjM0NzYxOWUtOCwKKyAgICAgIDguMjk3MzM5NjAwMDAwMDAxZS04LCA5LjgyMzExNDAwMDAwMDAwMWUtOCwgOS43NTg4MjAzZS04LCA5LjkyNjk4ODQ5OTk5OTk5OWUtOCwgMS4wMDcwNDI4ZS03LCA5LjUwNzE5MjNlLTgsIDcuMDQ0MzU0Nzk5OTk5OTk5ZS04LCA1LjM0OTQ3MDNlLTgsCisgICAgICA0Ljc2MTM4NzllLTgsIDMuODkxOTQyOWUtOCwgMS44ODQ1NTA3ZS04LCAtMS40MTAxNzg1ZS05LCAtMS4zMDQwNzk1ZS04LCAtMS40OTQ1Njg0ZS04LCAtOS4zMDA5NzEwMDAwMDAwMDFlLTksIC0yLjk4NDExNjFlLTksCisgICAgICAyLjIzODYwMDllLTEwLCA2Ljk5MDM4NmUtMTAsIDIuOTk4Njk3N2UtMTAsIC02Ljc1MzUyMzJlLTEwLCAtMS40ODMyNjQ2ZS05LCAtMS41NzQwODE4ZS05LCAtOC40NTc3NDA0ZS0xMCwgLTcuODM5NjI5MmUtMTIsCisgICAgICA0LjQzMjM0MDRlLTEwLCA0LjkyNjU2MTJlLTEwLCAyLjc5ODMxODJlLTEwLCA2LjE4MjAyNTdlLTExLCAtMy4wODI5NTk5ZS0xMSwgLTMuNTYwMTg1OWUtMTEsIC0yLjA1NjEyODNlLTExLCAtNS42MzMwODU1ZS0xMiwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjAxNTM3MDUxMiwgMC4wMDM4MTg4NTI4LCAwLjAyMjgxNTMwOCwgMC4wMjc0NjY0ODUsIDAuMDExMzM4Njc4LCAtMC4wMTYzOTIzMTQsIC0wLjAzNDg3NzQxMywgLTAuMDI3Nzg4MzM2LAorICAgICAgMC4wMDk2MjY0NTc5OTk5OTk5OTksIDAuMDU5ODY5MDg1LCAwLjA4OTYzODU0NCwgMC4wNjk4Nzk2MTI5OTk5OTk5OSwgLTAuMDA2NDg3NDg1NSwgLTAuMTEzNzA1NjQsIC0wLjE5NzE3MjMyLCAtMC4yMDExODQ5MSwKKyAgICAgIC0wLjEwMDcyNjA5LCAwLjA4MjAwODU2NDAwMDAwMDAxLCAwLjI4NjQ5Mjk0LCAwLjQ0MjkzOTM3LCAwLjQ5OTk3MDU3LCAwLjQ0NjQ2NTU2LCAwLjMxNjkwODM0LCAwLjE3MTA2MTc4LAorICAgICAgMC4wNjIyNTg5OTgsIDAuMDEyNzI4NTkyLCAwLjAxMjg1ODQ0MSwgMC4wMzcwNDY4MSwgMC4wNTQ4NDQ2OTcsIDAuMDUwMjc0NTMyLCAwLjAyNTgzODYyMiwgLTAuMDAzMDM5NTc4MSwKKyAgICAgIC0wLjAyMTAxNTg3OCwgLTAuMDI0MjY3NTMxLCAtMC4wMTQwMTQxODMsIC0wLjAwMzgzMzQ4NTMsIDAuMDAwMDEyMjk0OTA4LCAwLjAwMDAxMzk3MTU3NywgMC4wMDAwMDg0MzMxNDkyLCAwLjAwMDAwMjEyMDcxNTQsCisgICAgICAtMC4wMDAwMDEwNjEzNDAzLCAtMC4wMDAwMDE0NjkyMjQzLCAtNS42NzQ2NDU2MDAwMDAwMDFlLTcsIDMuNjgxMzI1OWUtNywgNi42NDcxOTUyZS03LCA1LjA3MzI0NjFlLTcsIDIuMzk5MDMwOWUtNywgMy4yNTI3NzEzZS04LAorICAgICAgLTUuMjk0MDAzMmUtOCwgLTcuMDI3MjA5N2UtOCwgLTcuNDI0Mzg0N2UtOCwgLTguMDA0MzExZS04LCAtOC40MzIzNDVlLTgsIC03Ljk5NTM2MDllLTgsIC01LjcxNzQ4MTJlLTgsIC00LjAxOTgzOTFlLTgsCisgICAgICAtMy4zODQ2ODU1ZS04LCAtMi43MzkxNzg3ZS04LCAtMS4zMTY0ODIyZS04LCA5LjMxNDM2MTNlLTEwLCA4Ljg4MzAwMTNlLTksIDEuMDE3ODM0NmUtOCwgNi4zODk3MDg2ZS05LCAyLjI1NDQxMjNlLTksCisgICAgICAyLjMxNTU1NTFlLTEwLCAtNi45MDE2NDMzZS0xMSwgMi4yNjY4NzQ2ZS0xMSwgNS4wMTk0NDc0ZS0xMCwgOS42OTExMTRlLTEwLCAxLjAyNDEzNTFlLTksIDUuNDc2NDk2OGUtMTAsIC01LjEzNTI4MzRlLTEyLAorICAgICAgLTMuMDcwNDMxNWUtMTAsIC0zLjQxMTE4MzllLTEwLCAtMS45MzcxNjQ4ZS0xMCwgLTQuMjY2NDA2M2UtMTEsIDIuMTYxNTUzNmUtMTEsIDIuNDk2MTUwN2UtMTEsIDEuNDQxNjExOWUtMTEsIDMuOTQ5NTIxNWUtMTIsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAwNzU3ODI1NTIsIDAuMDAwNTYzMzU1NjIsIC0wLjAxMjg2Nzg0NSwgLTAuMDIwNzExNTY1LCAtMC4wMTUzNjI4MzMsIDAuMDAzODE3ODg4NywgMC4wMjI4MDMyNjIsIDAuMDI3NDUwMTI3LAorICAgICAgMC4wMTEzMjk0NywgLTAuMDE2Mzg1ODEzLCAtMC4wMzQ4NTc3MTMsIC0wLjAyNzc2ODgxNywgMC4wMDk2MjgyMDk4MDAwMDAwMDEsIDAuMDU5ODQ0MDY1LCAwLjA4OTU5NjI5LCAwLjA2OTg0NTU5NCwKKyAgICAgIC0wLjAwNjQ4MzM4ODUsIC0wLjExMzY0ODIzLCAtMC4xOTcwNzY1NSwgLTAuMjAxMDk0NTksIC0wLjEwMDY5NTg5LCAwLjA4MTk0MDg1NjAwMDAwMDAxLCAwLjI4NjMyOTQ3LCAwLjQ0MjcyNTIyLAorICAgICAgMC40OTk3NzYxMSwgMC40NDYzNTU1MiwgMC4zMTY5MTIzMiwgMC4xNzExNjMwMiwgMC4wNjI0MDUwMjgsIDAuMDEyODU4MjEyLCAwLjAxMjkyOTkyMSwgMC4wMzcwNTE4NjUsCisgICAgICAwLjA1NDgwNjIwNywgMC4wNTAyMjgyMjksIDAuMDI1ODEyOTAzLCAtMC4wMDMwMzUwMzE2LCAtMC4wMjA5OTA4NTYsIC0wLjAyNDIzOTk4LCAtMC4wMTM5OTk2NDksIC0wLjAwMzgzNTQzMjEsCisgICAgICAzLjk0NDkwMTZlLTcsIDYuMjU0NjE1M2UtNywgMi4yODgwNDM2ZS03LCAtMS45NjQ4NTA0ZS03LCAtMy4yNzk5NDkyZS03LCAtMi40NjA1NTc3ZS03LCAtMS4xMDE4NzQ2ZS03LCAtMy43ODU1MjQ5ZS05LAorICAgICAgNC4wNzk5NTQyZS04LCA0LjkwOTczNDdlLTgsIDQuNjkwNTA5M2UtOCwgNC42NjI3MTUyZS04LCA0Ljc2ODUxOTllLTgsIDQuNDUxODI2ZS04LCAzLjA3MjgzMTZlLTgsIDEuOTgzODU3OWUtOCwKKyAgICAgIDEuNTMyNzczM2UtOCwgMS4xOTIwMDcyZS04LCA1LjQ5MDA1OTNlLTksIC04LjE2NzE3OTVlLTEwLCAtNC40MjM0NzQ2ZS05LCAtNS4wMTcxMzIzZS05LCAtMy4xNjA5MTJlLTksIC0xLjE5NzI2NjllLTksCisgICAgICAtMi43NTgyODMzZS0xMCwgLTEuMzY5OTU5MWUtMTAsIC0xLjAyOTEyOTZlLTEwLCAtMi40Nzg0MzA2ZS0xMCwgLTQuMjg3NTY1OGUtMTAsIC00LjUwMzg1OThlLTEwLCAtMi4zOTAxMTcxZS0xMCwgOS40MzM3NDYwOTk5OTk5OTllLTEyLAorICAgICAgMS40ODA3MzllLTEwLCAxLjY0MzU3MjJlLTEwLCA5LjMyOTgxNTcwMDAwMDAwMWUtMTEsIDIuMDQyNTUyMmUtMTEsIC0xLjA2NjQ4MTJlLTExLCAtMS4yMzE1NjY5ZS0xMSwgLTcuMTEyNzE3MmUtMTIsIC0xLjk0ODY0MDNlLTEyLAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMDAzMTc5NDIwNywgLTAuMDAxMzE3MzE1NywgMC4wMDY0MDAzNTA5LCAwLjAxMDE0MDI4NSwgMC4wMDc1Nzc1Mzk0LCAwLjAwMDU2MzI2MTg0LCAtMC4wMTI4NjY1OTEsIC0wLjAyMDcwOTU1MywKKyAgICAgIC0wLjAxNTM2MTMyOSwgMC4wMDM4MTc2MiwgMC4wMjI4MDA5NTksIDAuMDI3NDQ3MTQzLCAwLjAxMTMyNzk1NywgLTAuMDE2Mzg0Mzk4LCAtMC4wMzQ4NTQwNTEsIC0wLjAyNzc2NTQ4MSwKKyAgICAgIDAuMDA5NjI3OTg2LCAwLjA1OTgzODc2MiwgMC4wODk1ODc4NDksIDAuMDY5ODM4OTI0LCAtMC4wMDY0ODI1OTg4LCAtMC4xMTM2MzcwMSwgLTAuMTk3MDU3NTksIC0wLjIwMTA3NjEsCisgICAgICAtMC4xMDA2ODgzNSwgMC4wODE5Mjk3OTksIDAuMjg2Mjk5MTYsIDAuNDQyNjgyNzEsIDAuNDk5NzMzNDUsIDAuNDQ2MzI0NjIsIDAuMzE2ODk5NzYsIDAuMTcxMTY3NzcsCisgICAgICAwLjA2MjQxOTc2MiwgMC4wMTI4NzM2MywgMC4wMTI5MzkxNjksIDAuMDM3MDUyODAyLCAwLjA1NDgwMTQxMSwgMC4wNTAyMjI0MTQsIDAuMDI1ODA5OTg2LCAtMC4wMDMwMzM2OTY0LAorICAgICAgLTAuMDIwOTg2NjIzLCAtMC4wMjQyMzUyNzcsIC0wLjAxMzk5NjY2OCwgLTAuMDAzODM0NTUyNSwgNi43Mzk3MjA0OTk5OTk5OTllLTgsIDQuOTQ2OTU2ZS04LCAyLjA4MTUyNjRlLTgsIC0xLjMyNzg0NjNlLTksCisgICAgICAtMS4wMzk4MTg1ZS04LCAtMS4xNzkyMzY1ZS04LCAtMS4wOTgwMDUyZS04LCAtMS4wNTczMTIxZS04LCAtMS4wNTA2NDEzZS04LCAtOS42ODY1NjE0ZS05LCAtNi43NjczOTEzZS05LCAtNC41MTc3NjdlLTksCisgICAgICAtMy41NzQ3NzA1ZS05LCAtMi43NzM5Njk4ZS05LCAtMS4yNjk2MzEzZS05LCAyLjE2NTc3NjJlLTEwLCAxLjA3NTE1MzllLTksIDEuMjE1NzgyMmUtOSwgNy42MzMxNjgzMDAwMDAwMDFlLTEwLCAyLjgxMDYxNDRlLTEwLAorICAgICAgNS4xMjA1NzI1ZS0xMSwgMS42MjcxODMzZS0xMSwgMS41MzAwNjMxZS0xMSwgNS43NTc5NzM1ZS0xMSwgMS4wNDI5NTE0ZS0xMCwgMS4wOTY4ODg1ZS0xMCwgNS44Mjc2MTc3ZS0xMSwgLTIuMDQ1MDM1ZS0xMiwKKyAgICAgIC0zLjU1OTg1MzllLTExLCAtMy45NTEyNDhlLTExLCAtMi4yNDI5MjU3ZS0xMSwgLTQuOTA5NzcwM2UtMTIsIDIuNTY1MTI3OWUtMTIsIDIuOTYyMTk2MmUtMTIsIDEuNzEwNzY4OWUtMTIsIDQuNjg2OTE5NWUtMTMsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAwMDk4OTgzMTk1OTk5OTk5OTksIC0wLjAwMDA1MzgwMTY0LCAtMC4wMDE2NjE3NDY0LCAtMC4wMDI0MDU4NDM3LCAtMC4wMDMxNzk0MDQ1LCAtMC4wMDEzMTczMDk1LCAwLjAwNjQwMDMxODYsIDAuMDEwMTQwMjMzLAorICAgICAgMC4wMDc1Nzc0OTkxLCAwLjAwMDU2MzI1NzY4MDAwMDAwMDEsIC0wLjAxMjg2NjUyMSwgLTAuMDIwNzA5NDQyLCAtMC4wMTUzNjEyNDYsIDAuMDAzODE3NjAzLCAwLjAyMjgwMDgzMywgMC4wMjc0NDY5ODUsCisgICAgICAwLjAxMTMyNzg4MywgLTAuMDE2Mzg0MzE1LCAtMC4wMzQ4NTM4NTUsIC0wLjAyNzc2NTMxMSwgMC4wMDk2Mjc5NTc4LCAwLjA1OTgzODQ1NiwgMC4wODk1ODczNzUsIDAuMDY5ODM4NTUzLAorICAgICAgLTAuMDA2NDgyNTU3MywgLTAuMTEzNjM2MzksIC0wLjE5NzA1NjUzLCAtMC4yMDEwNzUwNSwgLTAuMTAwNjg3ODgsIDAuMDgxOTI5MjU1MDAwMDAwMDEsIDAuMjg2Mjk3NTQsIDAuNDQyNjgwMzQsCisgICAgICAwLjQ5OTczMDk1LCAwLjQ0NjMyMjYyLCAwLjMxNjg5ODY1LCAwLjE3MTE2NzUzLCAwLjA2MjQyMDA5MiwgMC4wMTI4NzQwODUsIDAuMDEyOTM5NDA3LCAwLjAzNzA1MjY5LAorICAgICAgMC4wNTQ4MDEwMzQsIDAuMDUwMjIxOTczLCAwLjAyNTgwOTY2LCAtMC4wMDMwMzM4Mzk2LCAtMC4wMjA5ODY2MzIsIC0wLjAyNDIzNTI0MiwgLTAuMDEzOTk2Njc2LCAtMC4wMDM4MzQ2MTA1LAorICAgICAgLTIuMjA4OTM1MmUtOSwgLTkuMTM5Nzk5OWUtMTAsIDQuMTQ0MTEwNGUtMTAsIDEuNTYzMjA2NGUtOSwgMi4xNjc0NDY4ZS05LCAyLjIyMTMwNzZlLTksIDEuNjI0Mjk5MWUtOSwgMS4yMjAwNjllLTksCisgICAgICAxLjE0MzM4NTllLTksIDEuMDEzMjk0OWUtOSwgNS4zMDM2MjJlLTEwLCA2LjM2NzMzMDllLTExLCAtMS43MDkyNTk1ZS0xMCwgLTIuMDU5MTk5OGUtMTAsIC0xLjMyMzg1NTllLTEwLCAtNS4yNDgyNjYxZS0xMSwKKyAgICAgIC0xLjU1NzE0OWUtMTEsIC0xLjA3ODA2OTFlLTExLCAtNy44NDkyMTM4OTk5OTk5OTllLTEyLCAtMS4zOTA1NjdlLTExLCAtMi4yOTEzMTA2ZS0xMSwgLTIuNDI0MDY0M2UtMTEsIC0xLjMwMTQ1NzNlLTExLCAtOS4zNDk3NjY5ZS0xNCwKKyAgICAgIDYuODgzNzU4M2UtMTIsIDcuNjYwMjYwMTk5OTk5OTk5ZS0xMiwgNC4zNTMzNDg3ZS0xMiwgOS42OTA0NDU3OTk5OTk5OTllLTEzLCAtNC42NDQ0MzM3ZS0xMywgLTUuMzYzMzY3NmUtMTMsIC0zLjA5NzUyN2UtMTMsIC04LjQ4NjE2MDQwMDAwMDAwMWUtMTQsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAwMDIxMTUwNTEzLCAtMC4wMDAxMTgyNjc1LCAtMC4wMDAxODk2NjE3MSwgMC4wMDA3MDM5NzY2LCAwLjAwMDk4OTgzMTY3OTk5OTk5OTksIC0wLjAwMDA1MzgwMTYxNiwgLTAuMDAxNjYxNzQ1OSwgLTAuMDAyNDA1ODQzLAorICAgICAgLTAuMDAzMTc5NDAzNSwgLTAuMDAxMzE3MzA5MSwgMC4wMDY0MDAzMTY2LCAwLjAxMDE0MDIzLCAwLjAwNzU3NzQ5NjgsIDAuMDAwNTYzMjU3NDQsIC0wLjAxMjg2NjUxNywgLTAuMDIwNzA5NDM1LAorICAgICAgLTAuMDE1MzYxMjQxLCAwLjAwMzgxNzYwMTgsIDAuMDIyODAwODI2LCAwLjAyNzQ0Njk3NywgMC4wMTEzMjc4OCwgLTAuMDE2Mzg0MzEsIC0wLjAzNDg1Mzg0NCwgLTAuMDI3NzY1MzAzLAorICAgICAgMC4wMDk2Mjc5NTQzLCAwLjA1OTgzODQzOCwgMC4wODk1ODczNDksIDAuMDY5ODM4NTMyOTk5OTk5OTksIC0wLjAwNjQ4MjU1NDIsIC0wLjExMzYzNjM2LCAtMC4xOTcwNTY0OCwgLTAuMjAxMDc0OTksCisgICAgICAtMC4xMDA2ODc4NSwgMC4wODE5MjkyMzAwMDAwMDAwMSwgMC4yODYyOTc0NSwgMC40NDI2ODAyMSwgMC40OTk3MzA4LCAwLjQ0NjMyMjQ4LCAwLjMxNjg5ODU1LCAwLjE3MTE2NzQ5LAorICAgICAgMC4wNjI0MjAwODksIDAuMDEyODc0MTA3LCAwLjAxMjkzOTQ0LCAwLjAzNzA1MjcyMiwgMC4wNTQ4MDEwNjQsIDAuMDUwMjIyMDAxLCAwLjAyNTgwOTY4NywgLTAuMDAzMDMzODEzMiwKKyAgICAgIC0wLjAyMDk4NjYwOCwgLTAuMDI0MjM1MjI1LCAtMC4wMTM5OTY2NjYsIC0wLjAwMzgzNDYwNjYsIC0xLjA4MDcwNTZlLTksIC05LjYxOTQ3MzVlLTEwLCAtNS44MDQyNjc1ZS0xMCwgLTIuMzAyNjA5M2UtMTAsCisgICAgICAtNS4yNDYyMDgzZS0xMSwgOC45MzQ1NzQ2OTk5OTk5OTllLTEyLCAyLjg3NTM2NjRlLTExLCA0LjI5NDgyMDFlLTExLCA1Ljc2MjkyNTVlLTExLCA2LjEwNzQzMzRlLTExLCAzLjkyNzg5OTllLTExLCAyLjA4NDk5NzdlLTExLAorICAgICAgMS41MDY4MDhlLTExLCAxLjM5NjY3MzllLTExLCA3LjgyMjQxMDc5OTk5OTk5OWUtMTIsIDIuOTcwODgyM2UtMTIsIDEuNTY2MjIxOWUtMTIsIDEuNDE2OTQ5M2UtMTIsIDUuOTU0OTcxMWUtMTMsIC02LjQzODkzMDNlLTEzLAorICAgICAgLTEuNTgyMTQzNGUtMTIsIC0xLjc0NDA0NDllLTEyLCAtOS44Njk0MDIzZS0xMywgLTIuMDYxNzQwOWUtMTMsIDEuMzMzNjUyNmUtMTMsIDEuNTQwMDk1ZS0xMywgOC44OTQ1NzE3ZS0xNCwgMi40MzY4MDcyZS0xNCwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDAwMDI5NTcyMDg2LCAwLjAwMDE1MDAwMTMsIC0wLjAwMDEyNTI4MDYyLCAtMC4wMDAwODU2NTY0OTUsIDAuMDAwMjExNTA1MTMsIC0wLjAwMDExODI2NzUsIC0wLjAwMDE4OTY2MTcxLCAwLjAwMDcwMzk3NjU4LAorICAgICAgMC4wMDA5ODk4MzE2NiwgLTAuMDAwMDUzODAxNjEyLCAtMC4wMDE2NjE3NDU5LCAtMC4wMDI0MDU4NDI5LCAtMC4wMDMxNzk0MDM0LCAtMC4wMDEzMTczMDkxLCAwLjAwNjQwMDMxNjUsIDAuMDEwMTQwMjMsCisgICAgICAwLjAwNzU3NzQ5NjcsIDAuMDAwNTYzMjU3NDUsIC0wLjAxMjg2NjUxNywgLTAuMDIwNzA5NDM1LCAtMC4wMTUzNjEyNDEsIDAuMDAzODE3NjAxNywgMC4wMjI4MDA4MjYsIDAuMDI3NDQ2OTc2LAorICAgICAgMC4wMTEzMjc4OCwgLTAuMDE2Mzg0MzEsIC0wLjAzNDg1Mzg0NCwgLTAuMDI3NzY1MzAzLCAwLjAwOTYyNzk1MzgsIDAuMDU5ODM4NDM3LCAwLjA4OTU4NzM0OCwgMC4wNjk4Mzg1MzE5OTk5OTk5OSwKKyAgICAgIC0wLjAwNjQ4MjU1NDIsIC0wLjExMzYzNjM2LCAtMC4xOTcwNTY0NywgLTAuMjAxMDc0OTksIC0wLjEwMDY4Nzg1LCAwLjA4MTkyOTIzMDAwMDAwMDAxLCAwLjI4NjI5NzQ1LCAwLjQ0MjY4MDIsCisgICAgICAwLjQ5OTczMDc5LCAwLjQ0NjMyMjQ3LCAwLjMxNjg5ODU0LCAwLjE3MTE2NzQ3LCAwLjA2MjQyMDA3OCwgMC4wMTI4NzQwOTksIDAuMDEyOTM5NDM0LCAwLjAzNzA1MjcxOSwKKyAgICAgIDAuMDU0ODAxMDYzLCAwLjA1MDIyMjAwMSwgMC4wMjU4MDk2ODgsIC0wLjAwMzAzMzgxMjQsIC0wLjAyMDk4NjYwOCwgLTAuMDI0MjM1MjI0LCAtMC4wMTM5OTY2NjUsIC0wLjAwMzgzNDYwNTgsCisgICAgICAtMS43MzQ5NDg1ZS0xMCwgLTEuNDAxNDAyN2UtMTAsIC02LjczMzY5NDk5OTk5OTk5OWUtMTEsIDIuMzUzNTkwNmUtMTIsIDMuOTcwMDk3MWUtMTEsIDQuNTYxNDkwNWUtMTEsIDIuOTE3NTg3N2UtMTEsIDEuMjQyODkzNGUtMTEsCisgICAgICA1LjE5NTY0NjhlLTEyLCA0LjE2MDM1NmUtMTIsIDIuNTkwODUzZS0xMiwgMi42NTYzMDg0ZS0xMiwgMy43ODYxNzA4ZS0xMiwgMy45NTM2NDQ0ZS0xMiwgMi4wODU4Njk2ZS0xMiwgLTEuMjk3MTQ5OGUtMTMsCisgICAgICAtMS4zODU4OTEyZS0xMiwgLTEuNTM4Mjc1M2UtMTIsIC04LjczMjA0NDdlLTEzLCAtMS45MTE1MjllLTEzLCA5Ljk4NDcyMTJlLTE0LCAxLjE1MzAzMDNlLTEzLCA2LjY1OTE0MTllLTE0LCAxLjgyNDM3NjJlLTE0LAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMDAwMDA1NzM3MDk5NCwgMC4wMDAwNDM1MTAxNTEsIC0wLjAwMDAwNzQyMTk5NjMsIC0wLjAwMDExODg4MjQ2LCAwLjAwMDAyOTU3MjA4NiwgMC4wMDAxNTAwMDEzLCAtMC4wMDAxMjUyODA2MiwgLTAuMDAwMDg1NjU2NDk0LAorICAgICAgMC4wMDAyMTE1MDUxMywgLTAuMDAwMTE4MjY3NSwgLTAuMDAwMTg5NjYxNywgMC4wMDA3MDM5NzY1OCwgMC4wMDA5ODk4MzE2NSwgLTAuMDAwMDUzODAxNjExLCAtMC4wMDE2NjE3NDU5LCAtMC4wMDI0MDU4NDI5LAorICAgICAgLTAuMDAzMTc5NDAzNCwgLTAuMDAxMzE3MzA5MSwgMC4wMDY0MDAzMTY1LCAwLjAxMDE0MDIzLCAwLjAwNzU3NzQ5NjYsIDAuMDAwNTYzMjU3NDUsIC0wLjAxMjg2NjUxNywgLTAuMDIwNzA5NDM1LAorICAgICAgLTAuMDE1MzYxMjQxLCAwLjAwMzgxNzYwMTcsIDAuMDIyODAwODI2LCAwLjAyNzQ0Njk3NiwgMC4wMTEzMjc4OCwgLTAuMDE2Mzg0MzEsIC0wLjAzNDg1Mzg0NCwgLTAuMDI3NzY1MzAzLAorICAgICAgMC4wMDk2Mjc5NTM3MDAwMDAwMDEsIDAuMDU5ODM4NDM3LCAwLjA4OTU4NzM0NywgMC4wNjk4Mzg1MzE5OTk5OTk5OSwgLTAuMDA2NDgyNTU0MiwgLTAuMTEzNjM2MzUsIC0wLjE5NzA1NjQ3LCAtMC4yMDEwNzQ5OSwKKyAgICAgIC0wLjEwMDY4Nzg1LCAwLjA4MTkyOTIzMDAwMDAwMDAxLCAwLjI4NjI5NzQ0LCAwLjQ0MjY4MDIsIDAuNDk5NzMwNzgsIDAuNDQ2MzIyNDYsIDAuMzE2ODk4NTMsIDAuMTcxMTY3NDcsCisgICAgICAwLjA2MjQyMDA3NywgMC4wMTI4NzQwOTksIDAuMDEyOTM5NDM0LCAwLjAzNzA1MjcxOSwgMC4wNTQ4MDEwNjMsIDAuMDUwMjIyMDAxLCAwLjAyNTgwOTY4OCwgLTAuMDAzMDMzODEyLAorICAgICAgLTAuMDIwOTg2NjA3LCAtMC4wMjQyMzUyMjQsIC0wLjAxMzk5NjY2NSwgLTAuMDAzODM0NjA1NiwgOC45ODQ0MTE1ZS0xMywgMS44MDM5MDM1ZS0xMiwgMS4xMTE2NTE1ZS0xMiwgLTEuMjY3MjAyNGUtMTMsCisgICAgICAtOS41NTk4NTdlLTEzLCAtMS4wMjQ4ODI3ZS0xMiwgLTUuMTM4MjE4OGUtMTMsIDEuODA4MTQ2ZS0xMywgNi4zMTQ3MDM4ZS0xMywgNi45MDc4MTU1ZS0xMywgMy44NjQ0Mzg5ZS0xMywgNi4zODIyODkzZS0xNCwKKyAgICAgIC04LjUwMzU5MTRlLTE0LCAtOS42MTcwOTM4ZS0xNCwgLTUuNTA0NTg3M2UtMTQsIC0xLjM1MTE3NDZlLTE0LCAzLjI1ODUxNTdlLTE1LCAzLjc2MjkxNjhlLTE1LCAyLjE3MzIxMjNlLTE1LCA1Ljk1Mzg1NTRlLTE2LAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMDAwMDEwMDI3OTIxLCAtMC4wMDAwMTA5MzAzMTYsIDAuMDAwMDE5MjM0ODI3LCAtMC4wMDAwMTY0NzQ3MDYsIC0wLjAwMDAwNTczNzA5OTQsIDAuMDAwMDQzNTEwMTUxLCAtMC4wMDAwMDc0MjE5OTYzLCAtMC4wMDAxMTg4ODI0NiwKKyAgICAgIDAuMDAwMDI5NTcyMDg2LCAwLjAwMDE1MDAwMTMsIC0wLjAwMDEyNTI4MDYyLCAtMC4wMDAwODU2NTY0OTQsIDAuMDAwMjExNTA1MTMsIC0wLjAwMDExODI2NzUsIC0wLjAwMDE4OTY2MTcsIDAuMDAwNzAzOTc2NTgsCisgICAgICAwLjAwMDk4OTgzMTY1LCAtMC4wMDAwNTM4MDE2MTEsIC0wLjAwMTY2MTc0NTksIC0wLjAwMjQwNTg0MjksIC0wLjAwMzE3OTQwMzQsIC0wLjAwMTMxNzMwOTEsIDAuMDA2NDAwMzE2NSwgMC4wMTAxNDAyMywKKyAgICAgIDAuMDA3NTc3NDk2NiwgMC4wMDA1NjMyNTc0NSwgLTAuMDEyODY2NTE3LCAtMC4wMjA3MDk0MzUsIC0wLjAxNTM2MTI0MSwgMC4wMDM4MTc2MDE3LCAwLjAyMjgwMDgyNiwgMC4wMjc0NDY5NzYsCisgICAgICAwLjAxMTMyNzg4LCAtMC4wMTYzODQzMSwgLTAuMDM0ODUzODQ0LCAtMC4wMjc3NjUzMDMsIDAuMDA5NjI3OTUzNzAwMDAwMDAxLCAwLjA1OTgzODQzNiwgMC4wODk1ODczNDcsIDAuMDY5ODM4NTMxOTk5OTk5OTksCisgICAgICAtMC4wMDY0ODI1NTQyLCAtMC4xMTM2MzYzNSwgLTAuMTk3MDU2NDcsIC0wLjIwMTA3NDk5LCAtMC4xMDA2ODc4NSwgMC4wODE5MjkyMzAwMDAwMDAwMSwgMC4yODYyOTc0NCwgMC40NDI2ODAyLAorICAgICAgMC40OTk3MzA3OCwgMC40NDYzMjI0NiwgMC4zMTY4OTg1MywgMC4xNzExNjc0NywgMC4wNjI0MjAwNzcsIDAuMDEyODc0MDk5LCAwLjAxMjkzOTQzNCwgMC4wMzcwNTI3MTksCisgICAgICAwLjA1NDgwMTA2MywgMC4wNTAyMjIwMDEsIDAuMDI1ODA5Njg4LCAtMC4wMDMwMzM4MTIsIC0wLjAyMDk4NjYwNywgLTAuMDI0MjM1MjI0LCAtMC4wMTM5OTY2NjUsIC0wLjAwMzgzNDYwNTYsCisgICAgICAtNS4yODAyMjc5ZS0xMywgLTMuODQzNzM5OWUtMTMsIC0yLjQwNDEzODhlLTEzLCAtMi44NDYzNzY4ZS0xMywgLTQuMjYwMDU2M2UtMTMsIC00LjQzNjg0MTZlLTEzLCAtMi4zMjk0MTA0ZS0xMywgMS45MTMyNDQ5ZS0xNCwKKyAgICAgIDEuNjM3NzI5ZS0xMywgMS44MTYxMjA3ZS0xMywgMS4wMzA0OTU1ZS0xMywgMi4yNDIwNzIzZS0xNCwgLTEuMjA2OTUxM2UtMTQsIC0xLjM5Mzc4MWUtMTQsIC04LjA0OTU1ODhlLTE1LCAtMi4yMDUzMDI3ZS0xNSwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjAwMDAwMzA1ODk5MzMsIC0wLjAwMDAwMzQ1ODI0NDMsIDAuMDAwMDA0MTI3MDYxNiwgMC4wMDAwMTI1MDU3MzQsIC0wLjAwMDAxMDAyNzkyMSwgLTAuMDAwMDEwOTMwMzE2LCAwLjAwMDAxOTIzNDgyNywgLTAuMDAwMDE2NDc0NzA2LAorICAgICAgLTAuMDAwMDA1NzM3MDk5NCwgMC4wMDAwNDM1MTAxNTEsIC0wLjAwMDAwNzQyMTk5NjMsIC0wLjAwMDExODg4MjQ2LCAwLjAwMDAyOTU3MjA4NiwgMC4wMDAxNTAwMDEzLCAtMC4wMDAxMjUyODA2MiwgLTAuMDAwMDg1NjU2NDk0LAorICAgICAgMC4wMDAyMTE1MDUxMywgLTAuMDAwMTE4MjY3NSwgLTAuMDAwMTg5NjYxNywgMC4wMDA3MDM5NzY1OCwgMC4wMDA5ODk4MzE2NSwgLTAuMDAwMDUzODAxNjExLCAtMC4wMDE2NjE3NDU5LCAtMC4wMDI0MDU4NDI5LAorICAgICAgLTAuMDAzMTc5NDAzNCwgLTAuMDAxMzE3MzA5MSwgMC4wMDY0MDAzMTY1LCAwLjAxMDE0MDIzLCAwLjAwNzU3NzQ5NjYsIDAuMDAwNTYzMjU3NDUsIC0wLjAxMjg2NjUxNywgLTAuMDIwNzA5NDM1LAorICAgICAgLTAuMDE1MzYxMjQxLCAwLjAwMzgxNzYwMTcsIDAuMDIyODAwODI2LCAwLjAyNzQ0Njk3NiwgMC4wMTEzMjc4OCwgLTAuMDE2Mzg0MzEsIC0wLjAzNDg1Mzg0NCwgLTAuMDI3NzY1MzAzLAorICAgICAgMC4wMDk2Mjc5NTM3MDAwMDAwMDEsIDAuMDU5ODM4NDM2LCAwLjA4OTU4NzM0NywgMC4wNjk4Mzg1MzE5OTk5OTk5OSwgLTAuMDA2NDgyNTU0MiwgLTAuMTEzNjM2MzUsIC0wLjE5NzA1NjQ3LCAtMC4yMDEwNzQ5OSwKKyAgICAgIC0wLjEwMDY4Nzg1LCAwLjA4MTkyOTIzMDAwMDAwMDAxLCAwLjI4NjI5NzQ0LCAwLjQ0MjY4MDIsIDAuNDk5NzMwNzgsIDAuNDQ2MzIyNDYsIDAuMzE2ODk4NTMsIDAuMTcxMTY3NDcsCisgICAgICAwLjA2MjQyMDA3NywgMC4wMTI4NzQwOTksIDAuMDEyOTM5NDM0LCAwLjAzNzA1MjcxOSwgMC4wNTQ4MDEwNjMsIDAuMDUwMjIyMDAxLCAwLjAyNTgwOTY4OCwgLTAuMDAzMDMzODEyLAorICAgICAgLTAuMDIwOTg2NjA3LCAtMC4wMjQyMzUyMjQsIC0wLjAxMzk5NjY2NSwgLTAuMDAzODM0NjA1NiwgLTYuMjE3MDQ3OGUtMTQsIC02LjM4MzIyMjk5OTk5OTk5OWUtMTQsIC0zLjI5MzQzNzJlLTE0LCA1LjAwNjA3MDdlLTE1LAorICAgICAgMi43NjY5MDg4ZS0xNCwgMy4wNjU2MDU0ZS0xNCwgMS43Mzg3ODdlLTE0LCAzLjc2MTA0MTllLTE1LCAtMi4wODIzNzY0ZS0xNSwgLTIuNDA0NzE3M2UtMTUsIC0xLjM4ODgwNmUtMTUsIC0zLjgwNDg1MTRlLTE2LAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgMy42ODEyNTU0ZS03LCAtMC4wMDAwMDEzMTYyNTI5LCA4LjkwNzQxNDkwMDAwMDAwMWUtNywgMC4wMDAwMDIxNjA1MjA5LCAtMC4wMDAwMDMwNTg5OTMzLCAtMC4wMDAwMDM0NTgyNDQzLCAwLjAwMDAwNDEyNzA2MTYsIDAuMDAwMDEyNTA1NzM0LAorICAgICAgLTAuMDAwMDEwMDI3OTIxLCAtMC4wMDAwMTA5MzAzMTYsIDAuMDAwMDE5MjM0ODI3LCAtMC4wMDAwMTY0NzQ3MDYsIC0wLjAwMDAwNTczNzA5OTQsIDAuMDAwMDQzNTEwMTUxLCAtMC4wMDAwMDc0MjE5OTYzLCAtMC4wMDAxMTg4ODI0NiwKKyAgICAgIDAuMDAwMDI5NTcyMDg2LCAwLjAwMDE1MDAwMTMsIC0wLjAwMDEyNTI4MDYyLCAtMC4wMDAwODU2NTY0OTQsIDAuMDAwMjExNTA1MTMsIC0wLjAwMDExODI2NzUsIC0wLjAwMDE4OTY2MTcsIDAuMDAwNzAzOTc2NTgsCisgICAgICAwLjAwMDk4OTgzMTY1LCAtMC4wMDAwNTM4MDE2MTEsIC0wLjAwMTY2MTc0NTksIC0wLjAwMjQwNTg0MjksIC0wLjAwMzE3OTQwMzQsIC0wLjAwMTMxNzMwOTEsIDAuMDA2NDAwMzE2NSwgMC4wMTAxNDAyMywKKyAgICAgIDAuMDA3NTc3NDk2NiwgMC4wMDA1NjMyNTc0NSwgLTAuMDEyODY2NTE3LCAtMC4wMjA3MDk0MzUsIC0wLjAxNTM2MTI0MSwgMC4wMDM4MTc2MDE3LCAwLjAyMjgwMDgyNiwgMC4wMjc0NDY5NzYsCisgICAgICAwLjAxMTMyNzg4LCAtMC4wMTYzODQzMSwgLTAuMDM0ODUzODQ0LCAtMC4wMjc3NjUzMDMsIDAuMDA5NjI3OTUzNzAwMDAwMDAxLCAwLjA1OTgzODQzNiwgMC4wODk1ODczNDcsIDAuMDY5ODM4NTMxOTk5OTk5OTksCisgICAgICAtMC4wMDY0ODI1NTQyLCAtMC4xMTM2MzYzNSwgLTAuMTk3MDU2NDcsIC0wLjIwMTA3NDk5LCAtMC4xMDA2ODc4NSwgMC4wODE5MjkyMzAwMDAwMDAwMSwgMC4yODYyOTc0NCwgMC40NDI2ODAyLAorICAgICAgMC40OTk3MzA3OCwgMC40NDYzMjI0NiwgMC4zMTY4OTg1MywgMC4xNzExNjc0NywgMC4wNjI0MjAwNzcsIDAuMDEyODc0MDk5LCAwLjAxMjkzOTQzNCwgMC4wMzcwNTI3MTksCisgICAgICAwLjA1NDgwMTA2MywgMC4wNTAyMjIwMDEsIDAuMDI1ODA5Njg4LCAtMC4wMDMwMzM4MTIsIC0wLjAyMDk4NjYwNywgLTAuMDI0MjM1MjI0LCAtMC4wMTM5OTY2NjUsIC0wLjAwMzgzNDYwNTYsCisgICAgICA2LjgwNzAyNTZlLTE1LCA3LjU5MzkyNzdlLTE1LCA0LjMyMDQ4OTFlLTE1LCA5Ljc3Mjc2NDllLTE2LCAtNC4yODY0OTQ0ZS0xNiwgLTQuOTUwMDIxMWUtMTYsIC0yLjg1ODgwNTRlLTE2LCAtNy44MzIxNDQ5OTk5OTk5OTllLTE3LAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTEuMzU2NTcyMWUtNywgMy4zMTU4Mzk0ZS03LCAtMS4xMjk5MjUyZS03LCA2LjI0NTg2NzVlLTcsIDMuNjgxMjU1NGUtNywgLTAuMDAwMDAxMzE2MjUyOSwgOC45MDc0MTQ5MDAwMDAwMDFlLTcsIDAuMDAwMDAyMTYwNTIwOSwKKyAgICAgIC0wLjAwMDAwMzA1ODk5MzMsIC0wLjAwMDAwMzQ1ODI0NDMsIDAuMDAwMDA0MTI3MDYxNiwgMC4wMDAwMTI1MDU3MzQsIC0wLjAwMDAxMDAyNzkyMSwgLTAuMDAwMDEwOTMwMzE2LCAwLjAwMDAxOTIzNDgyNywgLTAuMDAwMDE2NDc0NzA2LAorICAgICAgLTAuMDAwMDA1NzM3MDk5NCwgMC4wMDAwNDM1MTAxNTEsIC0wLjAwMDAwNzQyMTk5NjMsIC0wLjAwMDExODg4MjQ2LCAwLjAwMDAyOTU3MjA4NiwgMC4wMDAxNTAwMDEzLCAtMC4wMDAxMjUyODA2MiwgLTAuMDAwMDg1NjU2NDk0LAorICAgICAgMC4wMDAyMTE1MDUxMywgLTAuMDAwMTE4MjY3NSwgLTAuMDAwMTg5NjYxNywgMC4wMDA3MDM5NzY1OCwgMC4wMDA5ODk4MzE2NSwgLTAuMDAwMDUzODAxNjExLCAtMC4wMDE2NjE3NDU5LCAtMC4wMDI0MDU4NDI5LAorICAgICAgLTAuMDAzMTc5NDAzNCwgLTAuMDAxMzE3MzA5MSwgMC4wMDY0MDAzMTY1LCAwLjAxMDE0MDIzLCAwLjAwNzU3NzQ5NjYsIDAuMDAwNTYzMjU3NDUsIC0wLjAxMjg2NjUxNywgLTAuMDIwNzA5NDM1LAorICAgICAgLTAuMDE1MzYxMjQxLCAwLjAwMzgxNzYwMTcsIDAuMDIyODAwODI2LCAwLjAyNzQ0Njk3NiwgMC4wMTEzMjc4OCwgLTAuMDE2Mzg0MzEsIC0wLjAzNDg1Mzg0NCwgLTAuMDI3NzY1MzAzLAorICAgICAgMC4wMDk2Mjc5NTM3MDAwMDAwMDEsIDAuMDU5ODM4NDM2LCAwLjA4OTU4NzM0NywgMC4wNjk4Mzg1MzE5OTk5OTk5OSwgLTAuMDA2NDgyNTU0MiwgLTAuMTEzNjM2MzUsIC0wLjE5NzA1NjQ3LCAtMC4yMDEwNzQ5OSwKKyAgICAgIC0wLjEwMDY4Nzg1LCAwLjA4MTkyOTIzMDAwMDAwMDAxLCAwLjI4NjI5NzQ0LCAwLjQ0MjY4MDIsIDAuNDk5NzMwNzgsIDAuNDQ2MzIyNDYsIDAuMzE2ODk4NTMsIDAuMTcxMTY3NDcsCisgICAgICAwLjA2MjQyMDA3NywgMC4wMTI4NzQwOTksIDAuMDEyOTM5NDM0LCAwLjAzNzA1MjcxOSwgMC4wNTQ4MDEwNjMsIDAuMDUwMjIyMDAxLCAwLjAyNTgwOTY4OCwgLTAuMDAzMDMzODEyLAorICAgICAgLTAuMDIwOTg2NjA3LCAtMC4wMjQyMzUyMjQsIC0wLjAxMzk5NjY2NSwgLTAuMDAzODM0NjA1NiwgNC4wMDc1NzU4ZS0xNiwgNC42Mjc5Mjc0ZS0xNiwgMi42NzI3ODUzZS0xNiwgNy4zMjI1MTM5ZS0xNywKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDkuMjEyOTAyOWUtOCwgNC40NzA4MjllLTgsIC0xLjM2NzUwMzZlLTcsIC00LjMxODMxZS03LCAtMS4zNTY1NzIxZS03LCAzLjMxNTgzOTRlLTcsIC0xLjEyOTkyNTJlLTcsIDYuMjQ1ODY3NWUtNywKKyAgICAgIDMuNjgxMjU1NGUtNywgLTAuMDAwMDAxMzE2MjUyOSwgOC45MDc0MTQ5MDAwMDAwMDFlLTcsIDAuMDAwMDAyMTYwNTIwOSwgLTAuMDAwMDAzMDU4OTkzMywgLTAuMDAwMDAzNDU4MjQ0MywgMC4wMDAwMDQxMjcwNjE2LCAwLjAwMDAxMjUwNTczNCwKKyAgICAgIC0wLjAwMDAxMDAyNzkyMSwgLTAuMDAwMDEwOTMwMzE2LCAwLjAwMDAxOTIzNDgyNywgLTAuMDAwMDE2NDc0NzA2LCAtMC4wMDAwMDU3MzcwOTk0LCAwLjAwMDA0MzUxMDE1MSwgLTAuMDAwMDA3NDIxOTk2MywgLTAuMDAwMTE4ODgyNDYsCisgICAgICAwLjAwMDAyOTU3MjA4NiwgMC4wMDAxNTAwMDEzLCAtMC4wMDAxMjUyODA2MiwgLTAuMDAwMDg1NjU2NDk0LCAwLjAwMDIxMTUwNTEzLCAtMC4wMDAxMTgyNjc1LCAtMC4wMDAxODk2NjE3LCAwLjAwMDcwMzk3NjU4LAorICAgICAgMC4wMDA5ODk4MzE2NSwgLTAuMDAwMDUzODAxNjExLCAtMC4wMDE2NjE3NDU5LCAtMC4wMDI0MDU4NDI5LCAtMC4wMDMxNzk0MDM0LCAtMC4wMDEzMTczMDkxLCAwLjAwNjQwMDMxNjUsIDAuMDEwMTQwMjMsCisgICAgICAwLjAwNzU3NzQ5NjYsIDAuMDAwNTYzMjU3NDUsIC0wLjAxMjg2NjUxNywgLTAuMDIwNzA5NDM1LCAtMC4wMTUzNjEyNDEsIDAuMDAzODE3NjAxNywgMC4wMjI4MDA4MjYsIDAuMDI3NDQ2OTc2LAorICAgICAgMC4wMTEzMjc4OCwgLTAuMDE2Mzg0MzEsIC0wLjAzNDg1Mzg0NCwgLTAuMDI3NzY1MzAzLCAwLjAwOTYyNzk1MzcwMDAwMDAwMSwgMC4wNTk4Mzg0MzYsIDAuMDg5NTg3MzQ3LCAwLjA2OTgzODUzMTk5OTk5OTk5LAorICAgICAgLTAuMDA2NDgyNTU0MiwgLTAuMTEzNjM2MzUsIC0wLjE5NzA1NjQ3LCAtMC4yMDEwNzQ5OSwgLTAuMTAwNjg3ODUsIDAuMDgxOTI5MjMwMDAwMDAwMDEsIDAuMjg2Mjk3NDQsIDAuNDQyNjgwMiwKKyAgICAgIDAuNDk5NzMwNzgsIDAuNDQ2MzIyNDYsIDAuMzE2ODk4NTMsIDAuMTcxMTY3NDcsIDAuMDYyNDIwMDc3LCAwLjAxMjg3NDA5OSwgMC4wMTI5Mzk0MzQsIDAuMDM3MDUyNzE5LAorICAgICAgMC4wNTQ4MDEwNjMsIDAuMDUwMjIyMDAxLCAwLjAyNTgwOTY4OCwgLTAuMDAzMDMzODEyLCAtMC4wMjA5ODY2MDcsIC0wLjAyNDIzNTIyNCwgLTAuMDEzOTk2NjY1LCAtMC4wMDM4MzQ2MDU2LAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wLCAwLjAsIDAuMCwgMC4wLCAtOC43NjQwNTk2MDAwMDAwMDFlLTksIC02Ljk2MzMwN2UtOSwgMS41MDY2OTk0ZS04LCAzLjY5NzgzODJlLTgsCisgICAgICA5LjIxODYxMjhlLTgsIDQuNDczNTk5OWUtOCwgLTEuMzY4MzUxMWUtNywgLTQuMzIwOTg2M2UtNywgLTEuMzU3NDEyOGUtNywgMy4zMTc4OTQ1ZS03LCAtMS4xMzA2MjU1ZS03LCA2LjI0OTczODZlLTcsCisgICAgICAzLjY4MzUzN2UtNywgLTAuMDAwMDAxMzE3MDY4NywgOC45MTI5MzU1ZS03LCAwLjAwMDAwMjE2MTg2LCAtMC4wMDAwMDMwNjA4ODkyLCAtMC4wMDAwMDM0NjAzODc3LCAwLjAwMDAwNDEyOTYxOTQsIDAuMDAwMDEyNTEzNDg1LAorICAgICAgLTAuMDAwMDEwMDM0MTM2LCAtMC4wMDAwMTA5MzcwOSwgMC4wMDAwMTkyNDY3NDgsIC0wLjAwMDAxNjQ4NDkxNiwgLTAuMDAwMDA1NzQwNjU1MSwgMC4wMDAwNDM1MzcxMTcsIC0wLjAwMDAwNzQyNjU5NjIsIC0wLjAwMDExODk1NjE0LAorICAgICAgMC4wMDAwMjk1OTA0MTQsIDAuMDAwMTUwMDk0MjYsIC0wLjAwMDEyNTM1ODI3LCAtMC4wMDAwODU3MDk1ODE5OTk5OTk5OSwgMC4wMDAyMTE2MzYyMSwgLTAuMDAwMTE4MzQwOCwgLTAuMDAwMTg5Nzc5MjUsIDAuMDAwNzA0NDEyODgsCisgICAgICAwLjAwMDk5MDQ0NTExOTk5OTk5OTksIC0wLjAwMDA1MzgzNDk1NiwgLTAuMDAxNjYyNzc1OCwgLTAuMDAyNDA3MzM0LCAtMC4wMDMxODEzNzM5LCAtMC4wMDEzMTgxMjU1LCAwLjAwNjQwNDI4MzIsIDAuMDEwMTQ2NTE0LAorICAgICAgMC4wMDc1ODIxOTI5LCAwLjAwMDU2MzYwNjU0LCAtMC4wMTI4NzQ0OTIsIC0wLjAyMDcyMjI3LCAtMC4wMTUzNzA3NjIsIDAuMDAzODE5OTY3NywgMC4wMjI4MTQ5NTcsIDAuMDI3NDYzOTg3LAorICAgICAgMC4wMTEzMzQ5LCAtMC4wMTYzOTQ0NjQsIC0wLjAzNDg3NTQ0NSwgLTAuMDI3NzgyNTExLCAwLjAwOTYzMzkyMDc5OTk5OTk5OSwgMC4wNTk4NzU1MjMsIDAuMDg5NjQyODcxLCAwLjA2OTg4MTgxNiwKKyAgICAgIC0wLjAwNjQ4NjU3MTksIC0wLjExMzcwNjc4LCAtMC4xOTcxNzg2LCAtMC4yMDExOTk2MSwgLTAuMTAwNzUwMjUsIDAuMDgxOTgwMDA2OTk5OTk5OTksIDAuMjg2NDc0ODgsIDAuNDQyOTU0NTYsCisgICAgICAwLjUwMDA0MDUsIDAuNDQ2NTk5MDgsIDAuMzE3MDk0OTQsIDAuMTcxMjczNTYsIDAuMDYyNDU4NzYzLCAwLjAxMjg4MjA3OCwgMC4wMTI5NDc0NTQsIDAuMDM3MDc1Njg0LAorICAgICAgMC4wNTQ4MzUwMjcsIDAuMDUwMjUzMTI3LCAwLjAyNTgyNTY4NCwgLTAuMDAzMDM1NjkyMywgfSwKKyAgICB7IDAuMCwgMC4wLCAwLjAsIDAuMCwgMi4zOTE0NTYzZS0xMSwgMS45MDAwODM0ZS0xMSwgLTQuMTExMzQzNGUtMTEsIC0xLjAwOTAzMjJlLTEwLAorICAgICAgLTkuMDQyOTc0M2UtOSwgLTcuMTA3MTIxM2UtOSwgMS41NDg3NDI0ZS04LCAzLjgyNzI5MTdlLTgsIDkuMjg0NDM3NTk5OTk5OTk5ZS04LCA0LjM5NzAzMjllLTgsIC0xLjM2OTUzODZlLTcsIC00LjM1MTUzMjNlLTcsCisgICAgICAtMS4zNzE3MDI2ZS03LCAzLjM2NDE5MzVlLTcsIC0xLjE1ODQ3NjdlLTcsIDYuMjEwMjYyNGUtNywgMy43Nzg1NjE1ZS03LCAtMC4wMDAwMDEzMTE3Mzg4LCA4LjgyODA4MDdlLTcsIDAuMDAwMDAyMTM0NDY0NywKKyAgICAgIC0wLjAwMDAwMzA0MzA2NjYsIC0wLjAwMDAwMzQ0MTM0ODUsIDAuMDAwMDA0MDg5OTk1MywgMC4wMDAwMTI1OTc1NDEsIC0wLjAwMDAxMDA0OTgwMywgLTAuMDAwMDExMDkwMDQxLCAwLjAwMDAxOTMyNzExLCAtMC4wMDAwMTYyMTE3OTQsCisgICAgICAtMC4wMDAwMDU4MzkzMjM4LCAwLjAwMDA0MzI2MzQ5NywgLTAuMDAwMDA3MTA3NzE5NSwgLTAuMDAwMTE5MDkzNywgMC4wMDAwMjkxMDUzMTYsIDAuMDAwMTUwODg1ODUsIC0wLjAwMDEyNTIzMTg0LCAtMC4wMDAwODc4OTkzNDYwMDAwMDAwMSwKKyAgICAgIDAuMDAwMjA5NTk0NDEsIC0wLjAwMDExODU2MzQxLCAtMC4wMDAxODU4MzQ2LCAwLjAwMDcxMzE4MTMxLCAwLjAwMTAwMjIxODgsIC0wLjAwMDA1MDQwNjI3NCwgLTAuMDAxNjg1NDQzMiwgLTAuMDAyNDQyNTM3NywKKyAgICAgIC0wLjAwMzIxMTk5NzMsIC0wLjAwMTMyMzc3OTIsIDAuMDA2NDU5NDExMiwgMC4wMTAyMzQ3NDIsIDAuMDA3NjQ3ODEwNSwgMC4wMDA1NTQ5NDI4MSwgLTAuMDEyOTc2OTQ3LCAtMC4wMjA4NjE5MTYsCisgICAgICAtMC4wMTU0NDk2ODYsIDAuMDAzODc2NjMxMiwgMC4wMjI5ODEzNjEsIDAuMDI3NjI1NTUzLCAwLjAxMTM0NDAwNSwgLTAuMDE2NjA5MDM5LCAtMC4wMzUyMjg5NTIsIC0wLjAyODA1OTk0OSwKKyAgICAgIDAuMDA5NjgxNzAyNSwgMC4wNjAzNzI3NTYsIDAuMDkwNDYwODIyLCAwLjA3MDY0OTAzNSwgLTAuMDA2MjMxOTA4LCAtMC4xMTQyODU1MywgLTAuMTk4NTc1OTksIC0wLjIwMzAzNjU1LAorICAgICAgLTAuMTAyNDI5MzEsIDAuMDgxMDE3MzUsIDAuMjg2NTA0MTQsIDAuNDQzODcwMzIsIDAuNTAxNDMxNDQsIDAuNDQ3OTU4NDMsIDAuMzE4MDQ5NzMsIDAuMTcxNzA3MTksCisgICAgICAwLjA2MjUwNDE2MSwgMC4wMTI3ODUxNzYsIDAuMDEyOTE3NDExLCAwLjAzNzE5OTczNSwgfSwKKyAgICB7IDAuMCwgMC4wLCAwLjAsIDAuMCwgMS43MjA4NzY5ZS0xMSwgMS4zNjcyODgxZS0xMSwgLTIuOTU4NDk2OWUtMTEsIC03LjI2MDkzMjQwMDAwMDAwMWUtMTEsCisgICAgICAtMS45NTAyMjk5ZS0xMCwgLTkuODk3MzEzN2UtMTEsIDIuOTI3Njk2MmUtMTAsIDkuMDc1NjQzM2UtMTAsIC04LjQwMjQzNTZlLTksIC03LjU4NDgxODhlLTksIDEuNTE2MDEzNWUtOCwgMy41MjgxMDQ3ZS04LAorICAgICAgOS4xNzk1NzM5ZS04LCA0LjgxMTkzNzhlLTgsIC0xLjM5NTgyMTdlLTcsIC00LjM3OTIxOThlLTcsIC0xLjI5OTUxOWUtNywgMy4zODQ1Nzg0ZS03LCAtMS4yMDQyMDk0ZS03LCA2LjA3NTg2NjdlLTcsCisgICAgICAzLjg1MzYwNTRlLTcsIC0wLjAwMDAwMTMwODk4MSwgOC42NTQxOTM1ZS03LCAwLjAwMDAwMjIyNzEyODEsIC0wLjAwMDAwMzA4MzkxNTMsIC0wLjAwMDAwMzU4NDAwMDEsIDAuMDAwMDA0MTk5NjAyMSwgMC4wMDAwMTI3OTUzNTMsCisgICAgICAtMC4wMDAwMTAxNjEyNjksIC0wLjAwMDAxMTIyNzQ1MiwgMC4wMDAwMTk1OTU4MzEsIC0wLjAwMDAxNjYwNTExMSwgLTAuMDAwMDA2MTQzMTU2NiwgMC4wMDAwNDQyNjkxMTgsIC0wLjAwMDAwNzI5ODY0NDksIC0wLjAwMDEyMTE4NTg4LAorICAgICAgMC4wMDAwMjgxNjA0MzIsIDAuMDAwMTUwOTA2MSwgLTAuMDAwMTIzMTQ0NDQsIC0wLjAwMDA4MDM2Nzg0MywgMC4wMDAyMjA3Mjg3MiwgLTAuMDAwMTE2NTQ0NTMsIC0wLjAwMDIwNjE0NDUzLCAwLjAwMDY4NDg0MzExLAorICAgICAgMC4wMDA5NzYzNzkzNywgLTAuMDAwMDU3MzY5ODU2LCAtMC4wMDE2MzcxNzY3LCAtMC4wMDIzNjQ3ODQ0LCAtMC4wMDMxNTgwNDg2LCAtMC4wMDEzMzI1ODc5LCAwLjAwNjM3NzEwNTMsIDAuMDEwMTE5OTg1LAorICAgICAgMC4wMDc1ODA1OTI2LCAwLjAwMDYwNTI2NjQxLCAtMC4wMTI4NDYzMzYsIC0wLjAyMDc0NzQyMiwgLTAuMDE1NDYzMjQ1LCAwLjAwMzY5ODk3NjksIDAuMDIyNzE5Mjc4LCAwLjAyNzQ0NjE3OSwKKyAgICAgIDAuMDExNDMwNjUsIC0wLjAxNjE3MzI3MiwgLTAuMDM0NTUzMDA0LCAtMC4wMjc0NDE0NTUsIDAuMDA5ODc4ODQ3LCAwLjA1OTg4OTkzOCwgMC4wODkyOTk4NzUsIDAuMDY5MTA3MjYsCisgICAgICAtMC4wMDc2NjgxNzk1LCAtMC4xMTUxMzA5MSwgLTAuMTk4NTE5NDUsIC0wLjIwMjAyNzk4LCAtMC4xMDA2NzQ1MiwgMC4wODMxNTc2MzQ5OTk5OTk5OSwgMC4yODg2NjUxNywgMC40NDU3OTc3NiwKKyAgICAgIDAuNTAzMDE1NCwgMC40NDkxODQ5NSwgMC4zMTg5NTYzOSwgMC4xNzIzNjA0MywgfSwKKyAgICB7IDAuMCwgMC4wLCAwLjAsIDAuMCwgMy42ODUxNjk0ZS0xMCwgMi45Mjc5NzcxZS0xMCwgLTYuMzM1NDY4ODk5OTk5OTk5ZS0xMCwgLTEuNTU0ODkxM2UtOSwKKyAgICAgIC00LjY1MTAwMDFlLTksIC0yLjQ5NjYwODdlLTksIDcuMDg1NTc2NGUtOSwgMi4xNDM3ODY0ZS04LCAxLjMxNjk0MDFlLTgsIC0xLjA1NDI4MDJlLTgsIC02LjE2MDExNTVlLTksIC02LjE1NzU0MzllLTgsCisgICAgICAtMy40MDczNDE4ZS04LCA3LjcyNDE2OTU5OTk5OTk5OWUtOCwgLTMuNDQ1MjI5N2UtOCwgLTEuMTI1MzA4MWUtOCwgMi45NTkyMTg3ZS03LCAxLjI1NjA0OTdlLTcsIC0zLjE5MzkzMzFlLTcsIC05LjY3MTIzMDEwMDAwMDAwMWUtNywKKyAgICAgIC0zLjM3MTEyNzVlLTgsIDUuNzM2OTM1NGUtNywgLTUuNTI1ODYxMmUtNywgMC4wMDAwMDI5NTM4MjY5LCAtMy4wNDk4MTc0ZS03LCAtMC4wMDAwMDUxNDQ2Mjc0LCAwLjAwMDAwMzc0MjE1MDQsIDAuMDAwMDA3OTMzMjA0OTk5OTk5OTk5LAorICAgICAgLTAuMDAwMDA3MzYyNzI0MiwgLTAuMDAwMDA4Nzc0MzA1MSwgMC4wMDAwMTI2MzI0NTIsIDAuMDAwMDExNTE5MzEyLCAtMC4wMDAwMjI1NDg1NTEsIDAuMDAwMDA0NDE4Njk5NSwgMC4wMDAwMjY2NTIwNjEsIC0wLjAwMDA3MjUwNDUyNTk5OTk5OTk5LAorICAgICAgLTAuMDAwMDI5NjY3NDUyLCAwLjAwMDA3MjE5MDYzOCwgMC4wMDAwMzE2MDg1MTYsIC0wLjAwMDAzMDcxODQwMSwgMC4wMDAyODQ1NTM0NywgMC4wMDAyNzc5NTY2NiwgLTAuMDAwNjI4NzMxOTQsIC0wLjAwMDcxOTMwNTg4LAorICAgICAgLTAuMDAwMTg4ODIwMDMsIC0wLjAwMDMzMDk1NTQ0LCAwLjAwMDY3Nzk4MDUzLCAwLjAwMjY4OTc1MTQsIDAuMDAyNjI4MTkzNCwgLTAuMDAwMjk4OTk3NzEsIC0wLjAwNDIxNjAyNDcsIC0wLjAwNTk4NTMzODcsCisgICAgICAtMC4wMDYyNTUxMTkxLCAtMC4wMDEwMDYzMTg4LCAwLjAxMjU2Nzc5NywgMC4wMTc5NjM0NjcsIDAuMDExMzQyMjg5LCAtMC4wMDI3NzkwNjQ3LCAtMC4wMjUzNTUzMjMsIC0wLjAzNTkwMjA0NiwKKyAgICAgIC0wLjAyMjIxMzMwNSwgMC4wMTQ4MDkzMjUsIDAuMDQ5NDQwMTE5LCAwLjA1NTc0NTk4OCwgMC4wMjIyODM2MTMsIC0wLjAzNDY0Mzc0MSwgLTAuMDc3NDE1NTgxLCAtMC4wNzQ3MjA2OCwKKyAgICAgIC0wLjAxNTI1NjA3NSwgMC4wNzM5MjQ1NzksIDAuMTM3ODE5MjcsIDAuMTI2MzIxNjEsIDAuMDIzNDUyMDc4LCAtMC4xMzM4NTM5NiwgLTAuMjYwODM0MDEsIC0wLjI2ODgwNzkxLAorICAgICAgLTAuMTE2Mzc2NTQsIDAuMTYzMjUwNTEsIDAuNDc2NDQwNiwgMC43MTQ5ODY3LCB9LAorICAgIHsgLTAuODUzNTQzOSwgLTAuMzU5NjgxMTksIDAuMDY1MzUxNDA3LCAwLjA1OTMzMzAyOSwgLTAuMTI2OTUyMSwgLTAuMDc2ODc3ODk4LCAtMC4xMDkzMzE4OCwgMC4xNTQ5NTM1NSwKKyAgICAgIDAuMDU0NTIyMzU3LCAtMC4yMzg3NzEwNiwgLTAuMDAwNDY2NDcxMTEsIDAuMDg5MTIyNjUzLCAtMC4wMjY0NjI4MTMsIDAuMDQ4MzM1MTMzLCAtMC4wMDc5NzgyMDUxLCAtMC4wMTY2NTk1MTgsCisgICAgICAwLjA0NzE1OTU0OSwgLTAuMDM3OTYzMDU0LCAtMC4wMTEyOTIzMTIsIDAuMDI3NjcyOTk2LCAtMC4wMTg5MjkzNDMsIDAuMDAzNDcwOTcxNSwgMC4wMDI5Mzk0MjI3LCAtMC4wMDQxMzE3NDczLAorICAgICAgMC4wMDUzNjY0OTA1LCAtMC4wMDM0MDUwNTEyLCAtMC4wMDI2MjgzOTYyLCAwLjAwMTcwMTYzOSwgLTEuNDYyMTYzM2UtMTgsIC03LjM4NjU4NDAwMDAwMDAwMWUtMTgsIC04LjUxODc2MDJlLTE5LCA4Ljk3NzExNjI5OTk5OTk5OWUtMTgsCisgICAgICAxLjc4OTcyNzdlLTE4LCAtOS4wNzU5OTg1ZS0xOCwgMS43NjUwODUyZS0xOCwgMS4zMDUwOTUzZS0xOCwgLTEuMTg4ODM5M2UtMTgsIDMuNjI2NzE1MmUtMTgsIC0xLjU5NjU4NjhlLTE4LCAtMi45ODM0MDEyZS0xOSwKKyAgICAgIDIuNjMyMjgxN2UtMTgsIC0yLjM3MTgxNDFlLTE4LCA2Ljk5NjgzMTZlLTE5LCAyLjE4MzE1MTFlLTE4LCAtMS44ODUzNTYyZS0xOCwgMS45Nzk1NDU0ZS0xOSwgMi4wMDE4ODEzZS0xOSwgLTQuOTg0NTYxNmUtMTksCisgICAgICA3LjQ1MzM5MjVlLTE5LCAtMy43NzUyMTcyZS0xOSwgLTMuNjIzMDg1N2UtMTksIDMuNjA0MDg1M2UtMTksIC02LjE5NjU0ODU5OTk5OTk5OWUtMjAsIC0xLjE1MDU4NjdlLTE5LCA5LjUyNDgxMjNlLTIwLCAzLjE1MzUzMzNlLTIwLAorICAgICAgLTcuMjk3NjYwMmUtMjAsIDMuMzU1MjMyNmUtMjAsIC0zLjYyOTg1NzdlLTIwLCAtMi42MjMyMDAzZS0yMCwgMy43NDI0NTQ5ZS0yMCwgLTQuOTI0MDQ3M2UtMjAsIC01LjYwNzM1NDZlLTIxLCAzLjgzNDY1NTZlLTIwLAorICAgICAgLTIuNjc5NjA5NWUtMjAsIDIuMzE1ODkxMWUtMjEsIDQuNzU4MjM3NGUtMjEsIC0yLjg5NjcyNTNlLTIxLCA2LjU4NTU4MjNlLTIxLCAtOS45NjYzNTYyZS0yMSwgLTUuNjAyMDY5OGUtMjEsIDQuMTgzMzg4M2UtMjEsCisgICAgICAxLjA0Mzk4NTllLTIxLCAxLjcxMzI3ODdlLTIyLCAtNS44MTIzNTM0MDAwMDAwMDFlLTIzLCAzLjAzMzQwMThlLTIyLCAyLjk3NzMwNTFlLTIyLCAtMy41Njk0NDk4ZS0yMiwgLTIuNTYwOTcxNWUtMjIsIDEuMDc3OTgyNWUtMjIsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAwOTc0OTEzMjYsIDAuNDk3OTk3ODQsIDAuNDk2Njc1NTUsIC0wLjAyODU1OTk5OCwgLTAuNDIyMjI3OTcsIC0wLjE4NTE0Njg3LCAwLjI1MDAxODcsIDAuMzE2MDkyOTksCisgICAgICAtMC4wNjg4OTQ3ODgsIC0wLjIzNjMwODY5LCAwLjA1MTM1NzQyOSwgMC4xODY0OTkyNCwgLTAuMDAyNzU3MjEyNCwgLTAuMTMyOTUzNDMsIC0wLjA2NjI3NTE1OCwgMC4wNTkwMjA5LAorICAgICAgMC4wNjQ2NjczMTUsIC0wLjAyNDM2OTM0NiwgLTAuMDE4ODUzMzExLCAwLjAyMjAxODc0NSwgLTAuMDAwMDg1ODI2OTMsIC0wLjAxMjY1MDk3MywgLTAuMDA4NDA1MDc2Nzk5OTk5OTk5LCAwLjAwMTI5MzY0MjMsCisgICAgICAwLjAwMTYyMTcyNTcsIC0wLjAwMTAyODk4ODksIC0wLjAwMDc5NDI4NzczLCAwLjAwMDUxNDIyNjUsIDMuODM3MjA0ZS0xOCwgLTUuMTQxNzc3NWUtMTgsIDEuNjE4MDg3NmUtMTgsIDEuMzMyOTMwN2UtMTgsCisgICAgICAtMy40MjA3MjE4ZS0xOCwgNC4yMzUzNzExZS0xOCwgMS4xMDE2NTY1ZS0xOCwgLTYuOTA3MTk5NGUtMTgsIDQuODAwMjUyZS0xOCwgNC42OTE2MTk3ZS0xOCwgLTMuNjc1ODQzNmUtMTgsIC0yLjE1ODMyODRlLTE4LAorICAgICAgNy4yMTA0MDU3ZS0xOSwgMi4yNjUwOTI0ZS0xOSwgMS40ODg3MTEzZS0xOCwgLTkuMDM1OTY4OWUtMTksIC0xLjkzNDE5MjRlLTE4LCAyLjA0OTc2ODZlLTE4LCAzLjQyNjUyMjFlLTE5LCAtMS4wODUzMTU3ZS0xOCwKKyAgICAgIDYuODUzNDcwN2UtMTksIC0zLjM5ODEyOTJlLTE5LCAtNS44MTUzMjI1ZS0yMSwgMy40Njk0MzcyZS0xOSwgLTMuNjg4NDU2N2UtMTksIDIuMzI1NzQ3ZS0xOSwgMS4xODQ3NDg1ZS0xOSwgLTEuOTI3MTAwMmUtMTksCisgICAgICAxLjAzODc4NTRlLTE5LCAtNC4yNTE1MjQxZS0yMSwgLTQuNDU0NTAwNGUtMjAsIDQuNDI5MjY3ZS0yMSwgLTQuMjMyNjgzN2UtMjEsIDQuMDk0OTUzOGUtMjEsIDEuNzA3Njk4NGUtMjAsIC0zLjcxMDc0NTFlLTIxLAorICAgICAgLTEuNjc1MDIwNGUtMjAsIDkuMzAzODQ2OWUtMjEsIDMuNDk0Mzg3NWUtMjEsIC00LjUxNTk0MThlLTIxLCA0LjA2MzQ5NjNlLTIxLCAtMi44MzUwMjJlLTIxLCAxLjQxNDc3MjZlLTIyLCAyLjg1Mjg4MDVlLTIxLAorICAgICAgLTIuNTAzMjkzOGUtMjEsIC00LjE5NDc0OTllLTIyLCAtMS40ODE5ODM1ZS0yMiwgLTQuMjcwMTQ2ZS0yMiwgOC4yOTQ5NDIxZS0yMiwgLTMuOTUyMjE2MmUtMjIsIC0zLjI1MzQyMjNlLTIyLCAyLjU0NDg4OTllLTIyLAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMDQzODY4MDk5LCAtMC4xMTM1OTc3OSwgLTAuMjM4ODQzNzEsIC0wLjMxMTI2OTcxLCAtMC4wMzA4MDE0MywgMC4zODg4NDE3OSwgMC4zNDI4MjE1LCAtMC4xNDgyNzEwOSwKKyAgICAgIC0wLjQ2NzAzMjQzLCAtMC4xOTE3NzI2MiwgMC4yOTQ4MTkwOCwgMC4yNzI2MTA5NCwgLTAuMTE3MjczMzIsIC0wLjIwNzAzMzc0LCAwLjA0MTE1OTU2NywgMC4xNzcyMzMwOSwKKyAgICAgIDAuMDE5MjI1NDI2LCAtMC4xNDM1MTI1OCwgLTAuMDYwNjIyMzgyLCAwLjA3MDgzMDUyMDk5OTk5OTk5LCAwLjA1NDYxOTAxMiwgLTAuMDE0NzI4NzE0LCAtMC4wMTcxNjIzOTUsIDAuMDE0ODQ0NSwKKyAgICAgIDAuMDA1OTMzMDM3OCwgLTAuMDE0NTg5Mjc0LCAtMC4wMDk4OTEyMzMxMDAwMDAwMDEsIDAuMDAyNjg5MTEzMSwgLTEuNDg3MTAyOWUtMTcsIDQuNTYwOTgwMmUtMTgsIC02LjU5OTM2ODZlLTE4LCAtMi4wMTA0NTI2ZS0xNywKKyAgICAgIDguNDY5MDEzM2UtMTgsIC00Ljg0NjA2NjhlLTE4LCAtMy41NTQyNDE0ZS0xOCwgLTIuNzAyMzkwM2UtMTgsIDEuMjAxMTc1N2UtMTgsIDIuODU1NDYwMWUtMTgsIC0xLjQ2NDEzOTdlLTE5LCAtNS4yMjU4MDE0ZS0xOCwKKyAgICAgIDIuMTczMzY4NWUtMTgsIDMuMzc3OTMxMmUtMTgsIC0xLjM2NDkxMDllLTE5LCAtMi4xODgwMDgzZS0xOCwgLTEuNTc3MjM0MWUtMTksIDEuNTA2OTE0OGUtMTgsIDEuMzQ5MjI4OGUtMTgsIC04LjgwMjM3OTUwMDAwMDAwMWUtMTksCisgICAgICAtMS4wNjk3ODA4ZS0xOCwgNi45MDcwODMxZS0xOSwgMi4zMzc0MDY1ZS0xOSwgLTEuMTA3Nzc2OWUtMTksIDEuMzA3NzYzMWUtMTksIC0yLjg1NzQxNzFlLTE5LCAxLjQxNTkwMWUtMTksIDEuNzgyODU3N2UtMTksCisgICAgICAtMS41Mzk2MDUzZS0xOSwgNy41ODkzMzU3ZS0yMCwgLTQuMzA1MDYwM2UtMjAsIC04LjM2NzkwMDVlLTIwLCAxLjMzNDc5NDZlLTE5LCAtNS40OTc0NDAxZS0yMCwgLTEuNzQ5MzIxNmUtMjEsIDMuMzM2NTgwNWUtMjAsCisgICAgICAtNS44OTg1OTU5ZS0yMCwgMS45MjExNTk0ZS0yMCwgOC4zMzEzNDY2MDAwMDAwMDFlLTIxLCAtMS4wMTQ4ODU3ZS0yMCwgNi40MTIyMzUyZS0yMSwgLTEuODAxMTcyOGUtMjAsIC0yLjI5NDg5NTVlLTIxLCAxLjEwNDYwODJlLTIwLAorICAgICAgLTYuNTM4NDUzNWUtMjEsIC0xLjk2ODg3MzllLTIxLCAtMS4xMDI3NDE4ZS0yMSwgLTcuMzEwOTAzMWUtMjIsIDMuNDc1NDkzZS0yMSwgLTEuNzQ3NzkzNmUtMjEsIC0xLjQyNDUyM2UtMjEsIDEuMDc1MjYyZS0yMSwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjExMzUwNDg1LCAwLjA3ODQ1NzE5MSwgMC4yMzEyMzk4NSwgMC4xNjM3NzgxNiwgLTAuMDA1MzI1NzQyNSwgLTAuMTEwODE2ODgsIC0wLjE3NjkwNzIzLCAtMC4xODgyNDgyLAorICAgICAgMC4wMjQzODYxNjEsIDAuMzU5NzgwNzcsIDAuMzQ2MTk1MzQsIC0wLjEzMzgwMzEyLCAtMC40NzA5MjkyNywgLTAuMTgzMjEzMjgsIDAuMjk0OTU0MjIsIDAuMjc3MDA4OTcsCisgICAgICAtMC4xMTA3MDEzLCAtMC4yMjIwODkzLCAwLjA0MTY0NTQ1OCwgMC4xODcyOTYsIDAuMDEwNjA5OTg1LCAtMC4xNDk5MDM4NSwgLTAuMDYzMTI3MDM0LCAwLjA3MTM5NjIzNiwKKyAgICAgIDAuMDU5MzEyMTY5LCAtMC4wMTQ4OTkyNDksIC0wLjAxODAzNTA1MiwgMC4wMTU5MDQzMjYsIDAuMDA2MDk5NzQ3MiwgLTAuMDE1MTE3NzcsIC0wLjAxMDQ3MjA4LCAwLjAwMjUzNDg1MjEsCisgICAgICAwLjAwMDA5NDc3Mjc0MSwgMC4wMDAxODY5OTcyOCwgLTAuMDAwMDkwMjM3OTczOTk5OTk5OTksIC0wLjAwMDE4NjEzNTUyLCAwLjAwMDAzOTY0Njk5NywgMC4wMDAxMjcwNDU0MSwgMC4wMDAwMjE0NzY5OTcsIC0wLjAwMDA3NzQxOTQxLAorICAgICAgLTAuMDAwMDMxMjk4MTUyLCAwLjAwMDA2Nzk1NjQ1NCwgMC4wMDAwMzc2OTA0NTUsIC0wLjAwMDAyOTE1MTg1NywgLTAuMDAwMDE1NTQ1ODU1LCAwLjAwMDAxNDg1NjEyNSwgMC4wMDAwMTUyMzczODgsIC0wLjAwMDAwMjc2MDQ2NzUsCisgICAgICAtMC4wMDAwMDU3NTU2MDQ0LCAtMS4zNDc2OTY1ZS04LCAwLjAwMDAwMjgyODUwMTEsIDkuNDQwMzg1NGUtNywgLTIuMjQ5ODQyM2UtNywgLTAuMDAwMDAxNTg5NzEzMSwgLTYuNTMyODA3M2UtNywgNi40NTIwMTQxZS03LAorICAgICAgNS4xMzAxMmUtNywgLTUuNzA1MDYxOGUtNywgLTQuNzAyNDg4MmUtNywgMS45MDAyMjg1ZS03LCAxLjY0NzUyNDFlLTcsIC03LjE4MTQ0MWUtOCwgLTguNDQwMDMxODk5OTk5OTk5ZS04LCAyLjQzMTY5OTNlLTgsCisgICAgICA1Ljc1ODU3MDhlLTksIDEuNDM2MDU2M2UtOCwgNS41MTA4NDg2ZS05LCAtNC42MDU3MDUyZS05LCAtNS4zNjA0MjU1ZS05LCA1LjE5NzM3OTdlLTksIDQuOTU2OTQ2NGUtOSwgLTEuNjA0MTc5NmUtOSwKKyAgICAgIC0xLjg2ODMzNmUtOSwgNy42MjE0MDgyMDAwMDAwMDFlLTEwLCA1Ljg0MzEzNTRlLTEwLCAtNC45NjU5NDc5ZS0xMCwgMi40NDI1MzhlLTEwLCAtMS41NDQ4MzgzZS0xMCwgLTEuMTkwNDYzN2UtMTAsIDcuNzMwNDgzMWUtMTEsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAxODk0MzQyNSwgLTAuMDAwMjMxMzQxNDgsIC0wLjA1MTAzMjk5MywgLTAuMTQxNTg3NjYsIC0wLjEyMTk1NjEsIDAuMDYwMjA3NTQxLCAwLjIwNDk2MTc1LCAwLjEzNTI4NjgsCisgICAgICAtMC4wMjg4OTc0MjYsIC0wLjEyNDI1MDgzLCAtMC4xNzkyOTk3NCwgLTAuMTgzOTY0NzcsIDAuMDI4MDEyOCwgMC4zNTc4NjQ1NiwgMC4zNDAzNjAxMSwgLTAuMTM3ODk1MTMsCisgICAgICAtMC40NzAwNjA1LCAtMC4xNzk3NzM5NSwgMC4yOTY3MDYzMywgMC4yNzY1MzIzNCwgLTAuMTEwNTg1NSwgLTAuMjE5ODA2MzksIDAuMDQ0MDA5MjIzLCAwLjE4NzI1MTUzLAorICAgICAgMC4wMDg2MjIzMzQyOTk5OTk5OTksIC0wLjE1MTQ2NTMxLCAtMC4wNjMxOTY3NDUsIDAuMDcxODY1NzksIDAuMDU5Mzc2MDQ5LCAtMC4wMTQ3ODU3MDMsIC0wLjAxNzQzMDMxOCwgMC4wMTYzMDk5NjEsCisgICAgICAwLjAwNTg1ODUzMTUsIC0wLjAxNTUwMzE3NywgLTAuMDEwMzUxNzk3LCAwLjAwMjg3OTY3ODksIDAuMDAwMDMwMTYxMTI3LCAtMC4wMDAxMDg3MTUzNSwgLTAuMDAwMDU0NzYyMzY3LCAwLjAwMDA0OTk5MTg5MywKKyAgICAgIDAuMDAwMDMwOTMxNTgzLCAtMC4wMDAwMzQ5NDkyNjcsIC0wLjAwMDAyNjY1ODExMywgMC4wMDAwMTI1NDgyMDQsIDAuMDAwMDA4NTIyNjI1OCwgLTAuMDAwMDAzMzQ4NDgwMSwgLTAuMDAwMDA2MzU0NDg5LCAtNi4wMTY2MjhlLTcsCisgICAgICAwLjAwMDAwMTgxNTYzMTIsIDAuMDAwMDAxNjc5OTkxOSwgLTIuOTI2OTExM2UtNywgLTAuMDAwMDAxMTE0ODg2MiwgLTMuMjE0MTIyNWUtNywgMC4wMDAwMDExMTU5MjgxLCA2LjIxNjEyODllLTcsIC00LjM3MjgzMTdlLTcsCisgICAgICAtMy4yMzU3Njc0ZS03LCAyLjk0Nzk4NDNlLTcsIDIuNTg1NTMzNWUtNywgLTkuODYxOTM5MDk5OTk5OTk5ZS04LCAtNy43MTc0NDcxZS04LCAyLjM1NzE0M2UtOCwgMy40ODY2NTEzZS04LCAtNy4yODQ4NzkzZS05LAorICAgICAgNC4xNzI1MjMzZS0xMCwgLTEuMDIzMjkxM2UtOCwgLTUuMTg1ODk0MmUtOSwgMy40OTM4MjJlLTksIDMuMjk2NjA5MmUtOSwgLTIuOTIwNTA1NmUtOSwgLTIuNzcyNDA1ZS05LCA5LjU3MDczMDRlLTEwLAorICAgICAgOS4zNDkxNjAwMDAwMDAwMDFlLTEwLCAtMy42MDc5OTVlLTEwLCAtMi43NjM4NzY0ZS0xMCwgMi40Mzg1MDUzZS0xMCwgLTEuMzQyMDQyMWUtMTAsIDguNDg4MDQ4MWUtMTEsIDYuNTQwOTUyMWUtMTEsIC00LjI0NzQ4MDllLTExLAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMDQyMDk5MzQxLCAwLjAwNDk0NjY5MTgsIDAuMDYwMDMyNjc2LCAwLjA1MzA1NjE2NywgMC4wMTk2MTY0OTYsIDAuMDA2MjAzNjAxMywgLTAuMDM4OTk1ODc0LCAtMC4xMjYyNDgzOSwKKyAgICAgIC0wLjEwNzUxNTc1LCAwLjA2OTU4MzU5MSwgMC4yMDc4MDA5NiwgMC4xMzMzODIwMSwgLTAuMDMyMzY2MzI0LCAtMC4xMjY0OTk1OSwgLTAuMTc4Njc1MDUsIC0wLjE4MDczNjA4LAorICAgICAgMC4wMzEyMzgxMjgsIDAuMzU4NDc4NTcsIDAuMzM4NjY5OTksIC0wLjEzOTU4NTQ2LCAtMC40NzA4Nzc0NiwgLTAuMTgwODU4ODEsIDAuMjk1MjMyMzgsIDAuMjc2MjMyMzcsCisgICAgICAtMC4xMDkxNTIzOSwgLTAuMjE4Mjc5NjksIDAuMDQ0MjA0NzA1LCAwLjE4Njc0Nzg5LCAwLjAwODQ2MDQ3NTY5OTk5OTk5OSwgLTAuMTUxNjAyMDcsIC0wLjA2MzgxMjgxMSwgMC4wNzE0MDc4MjMsCisgICAgICAwLjA1OTcwNzcyMywgLTAuMDE0MjEyNjk4LCAtMC4wMTc0MTg5NzQsIDAuMDE1OTc1MjU4LCAwLjAwNTg1Mzg1NjgsIC0wLjAxNTI2NDAxOCwgLTAuMDEwMzMyMzgsIDAuMDAyNzAzODc3MSwKKyAgICAgIC0wLjAwMDAwMTIwNTE5ODcsIDAuMDAwMDEwODM0ODg1LCAwLjAwMDAwNDE1NDk1MzEsIC0wLjAwMDAwNTI2MzQwNjEsIC0wLjAwMDAwMjM0MjkxMzEsIDAuMDAwMDAzNDQwMDM5NywgMC4wMDAwMDI4Mjg5Nzg1LCAtOS4xODYzOTExZS03LAorICAgICAgLTAuMDAwMDAxMjI3MDQ4MiwgNC4wMzUxOTk3ZS03LCA3LjUxMDE4NThlLTcsIDQuNzQ3NDA1NWUtOSwgLTEuNDUxMDY4NWUtNywgLTEuODk4OTM1M2UtNywgLTMuODI4MTk0M2UtOCwgOC4wNzI3NjM4OTk5OTk5OTllLTgsCisgICAgICA3LjA2Njk2NzQwMDAwMDAwMWUtOCwgLTkuNDIxMDc2M2UtOCwgLTcuMzk1NjI1MWUtOCwgMy4xMTU5ODRlLTgsIDIuOTEzMzgxMWUtOCwgLTEuNTAxNDM4NGUtOCwgLTEuNjA2MDAxZS04LCA1LjIzMjEwMTRlLTksCisgICAgICAxLjc5MjQ4OTllLTksIDEuNzAyNDY4MWUtOSwgMy43ODE0OTg4ZS0xMCwgLTQuNzc4MjMzZS0xMCwgLTcuOTM5MDA4OGUtMTAsIDguMTQzMDYzN2UtMTAsIDcuNzU5NDk2NGUtMTAsIC0yLjQzODMyMTRlLTEwLAorICAgICAgLTMuMDg4NjcxNmUtMTAsIDEuMzAwMTkwN2UtMTAsIDkuOTcyNjgyMmUtMTEsIC04LjMwMDQwNjJlLTExLCAzLjgwMzYxNjZlLTExLCAtMi40MDU2ODMyZS0xMSwgLTEuODUzODM3MWUtMTEsIDEuMjAzODIxM2UtMTEsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAtMC4wMDUxMTg2MzE3LCAwLjAwMjYwODIxMzksIDAuMDAxMTU2MTAyOSwgLTAuMDI3ODM1MDU2LCAtMC4wNDM2NTQxNzUsIDAuMDAyNDU2NzgwOSwgMC4wNTY4NjY0MzYsIDAuMDQ5NzIyMjYxLAorICAgICAgMC4wMTY3MDU3MDYsIDAuMDA0MTk1NzM1OSwgLTAuMDM5OTExNDE4LCAtMC4xMjYyNjI5NiwgLTAuMTA3MTE0MDcsIDAuMDY5ODg2NjIxLCAwLjIwNzczNywgMC4xMzI5OTkxNiwKKyAgICAgIC0wLjAzMjgwNzE3OCwgLTAuMTI2NzA4MTksIC0wLjE3ODUwODA1LCAtMC4xODAyNjUyOCwgMC4wMzE3MzA3NiwgMC4zNTg3MjMzLCAwLjMzODYxOTI5LCAtMC4xMzk3NDc5MSwKKyAgICAgIC0wLjQ3MTAwOTU2LCAtMC4xODA5ODY2MiwgMC4yOTUwODQxMiwgMC4yNzYxNjE3NSwgLTAuMTA5MDUyODcsIC0wLjIxODA4MjM5LCAwLjA0NDMyMzU1LCAwLjE4NjcxNDM5LAorICAgICAgMC4wMDgzNjg5ODE4OTk5OTk5OTksIC0wLjE1MTYzODU4LCAtMC4wNjM3OTA3MDIsIDAuMDcxNDI0MTg1LCAwLjA1OTY5NjE2NSwgLTAuMDE0MjExODA1LCAtMC4wMTczODc1NDMsIDAuMDE2MDAwMzU1LAorICAgICAgMC4wMDU4NDUxMzA0LCAtMC4wMTUyODcwOTIsIC0wLjAxMDMzNTIyOCwgMC4wMDI3MTc0ODQ1LCAwLjAwMDAwMjA3Njg5NDgsIC01Ljc0ODM1MTFlLTcsIC0wLjAwMDAwMTM5ODY5MjMsIC0yLjA4NDY5MjVlLTcsCisgICAgICAzLjM5ODk0MzFlLTcsIDQuNjIzNDY3MWUtNywgMS41MTI0NzI3ZS04LCAtMi42NjQ0NDc3ZS03LCAtMS4wNzg1ODk1ZS03LCAyLjU3MDM3MDllLTcsIDEuNTcyMjAwOWUtNywgLTkuNzk4NDE2MWUtOCwKKyAgICAgIC03LjM4OTg3MDJlLTgsIDYuMDM1MTc0MDAwMDAwMDAxZS04LCA1LjQ3ODE3MzJlLTgsIC0yLjAyODI4MzNlLTgsIC0xLjQ1OTI0MjRlLTgsIDMuMDU0NDAzM2UtOSwgNS44OTI1NjMxZS05LCAtOS4wOTM3NDU4ZS0xMCwKKyAgICAgIDUuNDA5NTIzNWUtMTAsIC0yLjMzOTYyMDhlLTksIC0xLjM3MjIxMTVlLTksIDcuOTA4NDk5OWUtMTAsIDcuNTc2NDI1N2UtMTAsIC02LjAyNjEzNTllLTEwLCAtNS42MTg3OTE2ZS0xMCwgMi4xNjE2NTdlLTEwLAorICAgICAgMS41NTg1NzMyZS0xMCwgLTUuNTQwMjkxMWUtMTEsIC00LjIzODUzOTllLTExLCAzLjk1ODAzMzFlLTExLCAtMi41MTM1Mzk1ZS0xMSwgMS41ODk3NDQ4ZS0xMSwgMS4yMjUwNjllLTExLCAtNy45NTUxOTg2ZS0xMiwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjAwNzEwODQ2NzQsIC0wLjAwMzM4MzY3OTgsIDAuMDEyMzI1NzQ2LCAwLjAwODA1NjE4Mzk5OTk5OTk5OSwgLTAuMDA1ODEzNzQ5OSwgMC4wMDI5ODA2MjkyLCAwLjAwMjY2OTM2MzcsIC0wLjAyNTU3Mzk2NywKKyAgICAgIC0wLjA0MTM1MTA1NCwgMC4wMDQxMDA4MjY0LCAwLjA1NzQ5NTUwNiwgMC4wNDk0NTgyMTksIDAuMDE2MDI0NzQzLCAwLjAwMzY0MTg3MjQsIC0wLjAzOTk4OTM0MywgLTAuMTI1ODQxMTgsCisgICAgICAtMC4xMDY0ODcyMSwgMC4wNzAzMjUxOTM5OTk5OTk5OSwgMC4yMDc3NTY4MiwgMC4xMzI2NDIzOSwgLTAuMDMzMzE0MjQ3LCAtMC4xMjcxMTYyMSwgLTAuMTc4NjMzMTgsIC0wLjE4MDEwNDU1LAorICAgICAgMC4wMzIwMDM1MzEsIDAuMzU4OTE2NjYsIDAuMzM4Njc1NzksIC0wLjEzOTc2OTU1LCAtMC40NzEwNzYwOCwgLTAuMTgxMTE0MzQsIDAuMjk0OTQ4NjIsIDAuMjc2MTMzNSwKKyAgICAgIC0wLjEwODk1ODc0LCAtMC4yMTc5ODY5NiwgMC4wNDQzMjcxMzYsIDAuMTg2NjczNzMsIDAuMDA4MzYzODU5MywgLTAuMTUxNjIxMzgsIC0wLjA2MzgwMDgyNiwgMC4wNzEzOTg0MzQsCisgICAgICAwLjA1OTY5NzU0NiwgLTAuMDE0MTg2NiwgLTAuMDE3Mzc1OTk0LCAwLjAxNTk5MTA5OSwgMC4wMDU4MzkxNTQsIC0wLjAxNTI4MTczMiwgLTAuMDEwMzMwNzM2LCAwLjAwMjcxNTI4MjcsCisgICAgICA2Ljc1NzEyNjhlLTgsIDEuMDU3NDIxMWUtNywgMS4xMjI1MDU1ZS04LCAtNS42OTM5OTQ2ZS04LCAtMi43MTg0NTgyZS04LCA1LjQ5ODk0MThlLTgsIDMuNTQ5MTY5M2UtOCwgLTIuMDUzMjMzOGUtOCwKKyAgICAgIC0xLjU4NTEwMTFlLTgsIDEuMTk5MTQ2ZS04LCAxLjExNTMzNDFlLTgsIC00LjA1Mjc2NjFlLTksIC0yLjcwMzk2ZS05LCAzLjM5NzYyNzFlLTEwLCA5Ljc1NzcxNTk5OTk5OTk5OWUtMTAsIC05LjcwOTIxODllLTExLAorICAgICAgMS43NzA4NDIzZS0xMCwgLTQuOTY0MjUwNWUtMTAsIC0zLjE4NDM2NTZlLTEwLCAxLjY2MTVlLTEwLCAxLjYyMzcxMDNlLTEwLCAtMS4xOTAwMzkxZS0xMCwgLTEuMDkyMDMyZS0xMCwgNC41ODA4NjM2ZS0xMSwKKyAgICAgIDIuNDYwNjAwM2UtMTEsIC03Ljc5NjAyNmUtMTIsIC01Ljk1MjE3ODVlLTEyLCA2LjAzNDA5NzVlLTEyLCAtNC41MjE3NzA2ZS0xMiwgMi44NTk4OTU5ZS0xMiwgMi4yMDM4NTY4ZS0xMiwgLTEuNDMxMTEyN2UtMTIsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAtMC4wMDEyNjU3ODYsIC0wLjAwMTY2MDk0NzcsIDAuMDAyMjI5NDEsIDAuMDAxMTc2MjAwNywgLTAuMDA3MzI1MDczMSwgLTAuMDAzNDMzMjE1OSwgMC4wMTI0NzEzMjgsIDAuMDA4MzQzMDI5NCwKKyAgICAgIC0wLjAwNTQ5NjE1NzcsIDAuMDAzMjE1NDM0LCAwLjAwMjc1OTM1ODgsIC0wLjAyNTYxNjg4OCwgLTAuMDQxNDU1OTc1LCAwLjAwNDAxODQ1MDQsIDAuMDU3NDg4NjMyLCAwLjA0OTUyNzU5NywKKyAgICAgIDAuMDE2MTI0NTE3LCAwLjAwMzcxMzIyMjEsIC0wLjAzOTk4Mzc0MywgLTAuMTI1ODk3NjUsIC0wLjEwNjU2OTcsIDAuMDcwMjU4ODczLCAwLjIwNzczNTYyLCAwLjEzMjY2NjU2LAorICAgICAgLTAuMDMzMjY4MDExLCAtMC4xMjcwNzU5OSwgLTAuMTc4NjE2NjksIC0wLjE4MDExMzI4LCAwLjAzMTk3OTY3NSwgMC4zNTg4OTEzNCwgMC4zMzg2NjE1NywgLTAuMTM5NzY3NzYsCisgICAgICAtMC40NzEwNjQ4LCAtMC4xODExMDQ2OSwgMC4yOTQ5NTEyOSwgMC4yNzYxMzI1MSwgLTAuMTA4OTU5NjYsIC0wLjIxNzk4ODgxLCAwLjA0NDMyMzcyMSwgMC4xODY2NzE4MSwKKyAgICAgIDAuMDA4MzY1ODQ5OSwgLTAuMTUxNjE3NzYsIC0wLjA2Mzc5OTQ1MzAwMDAwMDAxLCAwLjA3MTM5NzQ4NiwgMC4wNTk2OTY4ODUsIC0wLjAxNDE4NjA1NSwgLTAuMDE3Mzc1NDg1LCAwLjAxNTk5MDg1MSwKKyAgICAgIDAuMDA1ODM4Nzg1LCAtMC4wMTUyODE2OTUsIC0wLjAxMDMzMDUyMSwgMC4wMDI3MTUzMzAzLCAtMS4zNzI1MDgyZS05LCAyLjI4ODM1NWUtOCwgMS4xMzU1Njc2ZS04LCAtOC44ODkzMzY2MDAwMDAwMDFlLTksCisgICAgICAtNy4zMjc3NzY2ZS05LCA3LjE3NDMxNjVlLTksIDYuMTMwODI0NmUtOSwgLTIuMzkwMTk4MmUtOSwgLTEuOTM3MzA3OWUtOSwgNi45NTU0NjQ3ZS0xMCwgOS4xODE0NDYzZS0xMCwgLTIuNDAyODRlLTEwLAorICAgICAgLTEuOTQ4MTYxNmUtMTEsIC0yLjA3MTYwMDNlLTEwLCAtMS4wNzcxMzczZS0xMCwgNi40NTQ0MDg5MDAwMDAwMDFlLTExLCA3LjkyOTc5OTNlLTExLCAtNi41OTYxNTI2OTk5OTk5OTllLTExLCAtNi4xMzE0OTRlLTExLCAyLjMxMzkxNDRlLTExLAorICAgICAgMS44MjIwMTU3ZS0xMSwgLTYuODg5Mzg3ZS0xMiwgLTUuMjc1ODk3MWUtMTIsIDQuNzIwMjE1OGUtMTIsIC0yLjY5ODE2MWUtMTIsIDEuNzA2NTEzZS0xMiwgMS4zMTUwNTE0ZS0xMiwgLTguNTM5NTE0M2UtMTMsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAwMDA1MDE1OTUwMywgLTAuMDAwNzEyMTIxODQsIDAuMDAwMjgzNjMyMDcsIDAuMDAxNDYxNTA2NiwgLTAuMDAxMzI2NzgzNywgLTAuMDAxNjQzMzUxMSwgMC4wMDIzMzMwNTQ4LCAwLjAwMTMzODI5MTEsCisgICAgICAtMC4wMDcxNTU0OTYyLCAtMC4wMDMzMDcxNDI3LCAwLjAxMjUyNjUzOCwgMC4wMDgzMzM1NTQ1LCAtMC4wMDU1Mzc2NzM3LCAwLjAwMzE4MDU4NjQsIDAuMDAyNzU1NTczNSwgLTAuMDI1NTg4NDY1LAorICAgICAgLTAuMDQxNDE0OTA4LCAwLjAwNDA0NjYzMDQsIDAuMDU3NDg3OTE0LCAwLjA0OTQ5OTc0MywgMC4wMTYwODYwOTksIDAuMDAzNjgzNzYzOSwgLTAuMDM5OTkxMiwgLTAuMTI1ODg0MTgsCisgICAgICAtMC4xMDY1NDY4OCwgMC4wNzAyNzgwMDUsIDAuMjA3NzQzMDYsIDAuMTMyNjYxOTMsIC0wLjAzMzI3OTI5MywgLTAuMTI3MDg3MSwgLTAuMTc4NjIyNjIsIC0wLjE4MDExMjg2LAorICAgICAgMC4wMzE5ODM4MzgsIDAuMzU4ODk1NTksIDAuMzM4NjYzNjYsIC0wLjEzOTc2Nzg4LCAtMC40NzEwNjYzMiwgLTAuMTgxMTA2OTcsIDAuMjk0OTQ5MzksIDAuMjc2MTMyMTIsCisgICAgICAtMC4xMDg5NTg1NiwgLTAuMjE3OTg3NTQsIDAuMDQ0MzI0MDUsIDAuMTg2NjcxNSwgMC4wMDgzNjU3ODYsIC0wLjE1MTYxNzQ3LCAtMC4wNjM3OTkzMDEsIDAuMDcxMzk3MzU3OTk5OTk5OTksCisgICAgICAwLjA1OTY5Njc4LCAtMC4wMTQxODU5NjMsIC0wLjAxNzM3NTM1NiwgMC4wMTU5OTA4NTgsIDAuMDA1ODM4NzI0NSwgLTAuMDE1MjgxNzI2LCAtMC4wMTAzMzA1MDcsIDAuMDAyNzE1MzQ4NiwKKyAgICAgIC03LjQ3NTE5MjVlLTEwLCAxLjEzNjM5MzdlLTksIDguNjcxMTIyOWUtMTAsIC0zLjcyNjg4MzNlLTEwLCAtMy42ODExMzc3ZS0xMCwgMi4wNDgyNzI5ZS0xMCwgMi4wOTgwOTI0ZS0xMCwgLTcuMjU4MjA5ODAwMDAwMDAxZS0xMSwKKyAgICAgIC0yLjcyNjYyODJlLTExLCAtMS41OTc5NDE5ZS0xMSwgLTkuNTcxOTIxNmUtMTMsIDMuODQ2MDQwNmUtMTIsIDguOTM5NjU3NGUtMTIsIC05LjUwODUzODQ5OTk5OTk5OWUtMTIsIC05LjA1NDAxODVlLTEyLCAyLjc5NDA5OThlLTEyLAorICAgICAgMy43MjEyNzA3ZS0xMiwgLTEuNTk0Mzc0M2UtMTIsIC0xLjIyMzIxMTRlLTEyLCAxLjAwNjM0MDFlLTEyLCAtNC40MjAyODEyZS0xMywgMi43OTU3MDk3ZS0xMywgMi4xNTQzOTRlLTEzLCAtMS4zOTg5OTIxZS0xMywKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDAwMTE1MzM5OTYsIC0wLjAwMDAyNjczNDMzMiwgLTAuMDAwMTM1MDY4MjMsIDAuMDAwMzc1NTI4MDUsIDAuMDAwMDU2NDczNzM2LCAtMC4wMDA2OTYxMSwgMC4wMDAzMDgyMjQ4NCwgMC4wMDE0OTAzODk4LAorICAgICAgLTAuMDAxMjk5NjY3LCAtMC4wMDE2MjM1MjQsIDAuMDAyMzQyOTYxOSwgMC4wMDEzMzk1MTIyLCAtMC4wMDcxNTg4ODc5LCAtMC4wMDMzMTA1NDcyLCAwLjAxMjUyNjAxOCwgMC4wMDgzMzYyNDQ4OTk5OTk5OTksCisgICAgICAtMC4wMDU1MzM3NjE4LCAwLjAwMzE4Mjk3NjcsIDAuMDAyNzU0ODA0MiwgLTAuMDI1NTkyMTk4LCAtMC4wNDE0MTk3MDQsIDAuMDA0MDQzMTAwNywgMC4wNTc0ODcyNTcsIDAuMDQ5NTAxNzE4LAorICAgICAgMC4wMTYwODkxNzQsIDAuMDAzNjg2MzAwNiwgLTAuMDM5OTkwMTg4LCAtMC4xMjU4ODQ3MywgLTAuMTA2NTQ4MzEsIDAuMDcwMjc2NTkyLCAwLjIwNzc0MjMsIDAuMTMyNjYxOTcsCisgICAgICAtMC4wMzMyNzg3MzUsIC0wLjEyNzA4NjQ5LCAtMC4xNzg2MjIzMywgLTAuMTgwMTEyOTgsIDAuMDMxOTgzNDUzLCAwLjM1ODg5NTE2LCAwLjMzODY2MzM5LCAtMC4xMzk3Njc5MSwKKyAgICAgIC0wLjQ3MTA2NjIxLCAtMC4xODExMDY4NiwgMC4yOTQ5NDk0MiwgMC4yNzYxMzIxMSwgLTAuMTA4OTU4NTYsIC0wLjIxNzk4NzUyLCAwLjA0NDMyNDA1NywgMC4xODY2NzE1LAorICAgICAgMC4wMDgzNjU3OTA2MDAwMDAwMDEsIC0wLjE1MTYxNzQ1LCAtMC4wNjM3OTkyODEsIDAuMDcxMzk3MzYyMDAwMDAwMDEsIDAuMDU5Njk2NzczLCAtMC4wMTQxODU5NjcsIC0wLjAxNzM3NTM1MywgMC4wMTU5OTA4NjEsCisgICAgICAwLjAwNTgzODcyMzEsIC0wLjAxNTI4MTczLCAtMC4wMTAzMzA1MDgsIDAuMDAyNzE1MzQ5OCwgMS4yNDIxNDczZS0xMCwgLTEuNjQ3MjQwNWUtMTEsIC00LjU0OTk1MTFlLTExLCA0LjY5NTI5MjFlLTEyLAorICAgICAgLTcuNjIyNzU0NzAwMDAwMDAxZS0xMiwgMi4yNDQwNzgyZS0xMSwgMS40Mzk0OTM4ZS0xMSwgLTcuNDQxOTA3N2UtMTIsIC03LjQ3ODM5NjA5OTk5OTk5OWUtMTIsIDUuNDY0MTY3NmUtMTIsIDUuMDA2NDA2N2UtMTIsIC0yLjExMTQxMjhlLTEyLAorICAgICAgLTEuMTE0NjkxNWUtMTIsIDMuNTE4MTg4NWUtMTMsIDIuNjg1OTA1N2UtMTMsIC0yLjczMDQ4NjFlLTEzLCAyLjA1NjMxNDNlLTEzLCAtMS4zMDA1NTc2ZS0xMywgLTEuMDAyMjE5OWUtMTMsIDYuNTA4MTA1M2UtMTQsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAwMDA0ODMwMTM3OSwgMC4wMDAwODEyNDQwMDksIC0wLjAwMDEwMjAyMjcxLCAtMC4wMDAwNTI3MDcyLCAwLjAwMDEyNjY1MDg3LCAtMC4wMDAwMjMxNjE5OTEsIC0wLjAwMDE0MDczODYyLCAwLjAwMDM2MzAxMjE4LAorICAgICAgMC4wMDAwNDIyMzY0NTEsIC0wLjAwMDcwNjc1MDU4LCAwLjAwMDMwNDE0NzgxLCAwLjAwMTQ5MjQyOTMsIC0wLjAwMTI5NDczNzksIC0wLjAwMTYxOTYyMTMsIDAuMDAyMzQzMzc0LCAwLjAwMTMzNjM5NjYsCisgICAgICAtMC4wMDcxNjM0MzAxLCAtMC4wMDMzMTM4MzQzLCAwLjAxMjUyNTcyLCAwLjAwODMzODc5NTgsIC0wLjAwNTUzMDAyODIsIDAuMDAzMTg1OTM1OCwgMC4wMDI3NTU3MDAzLCAtMC4wMjU1OTMzMSwKKyAgICAgIC0wLjA0MTQyMTc2NiwgMC4wMDQwNDEzMDc4LCAwLjA1NzQ4NjUyNiwgMC4wNDk1MDIxMzgsIDAuMDE2MDkwMjQ5LCAwLjAwMzY4NzM3MDQsIC0wLjAzOTk4OTYwNSwgLTAuMTI1ODg0NzUsCisgICAgICAtMC4xMDY1NDg3LCAwLjA3MDI3NjE0NSwgMC4yMDc3NDIwNSwgMC4xMzI2NjE5NywgLTAuMDMzMjc4NTc5LCAtMC4xMjcwODYzMiwgLTAuMTc4NjIyMjQsIC0wLjE4MDExMywKKyAgICAgIDAuMDMxOTgzMzgyLCAwLjM1ODg5NTA4LCAwLjMzODY2MzM0LCAtMC4xMzk3Njc5MywgLTAuNDcxMDY2MiwgLTAuMTgxMTA2ODUsIDAuMjk0OTQ5NDIsIDAuMjc2MTMyMTEsCisgICAgICAtMC4xMDg5NTg1NiwgLTAuMjE3OTg3NTIsIDAuMDQ0MzI0MDUzLCAwLjE4NjY3MTQ5LCAwLjAwODM2NTc5MjYsIC0wLjE1MTYxNzQ1LCAtMC4wNjM3OTkyOCwgMC4wNzEzOTczNjAwMDAwMDAwMSwKKyAgICAgIDAuMDU5Njk2NzczLCAtMC4wMTQxODU5NjUsIC0wLjAxNzM3NTM1MiwgMC4wMTU5OTA4NiwgMC4wMDU4Mzg3MjI2LCAtMC4wMTUyODE3MjksIC0wLjAxMDMzMDUwOCwgMC4wMDI3MTUzNDk3LAorICAgICAgOC40ODk1OTQ1ZS0xMywgOC45ODczOTAyZS0xMiwgNC40OTM5NjcyZS0xMiwgLTIuODgyOTM5OGUtMTIsIC0zLjI4MjczMThlLTEyLCAyLjgyODgyMzhlLTEyLCAyLjY1MjE5ODVlLTEyLCAtOS42MDA1NzVlLTEzLAorICAgICAgLTguNDQwODQwNmUtMTMsIDMuMjUyMjY0NGUtMTMsIDIuNDkxMzE1NmUtMTMsIC0yLjIwMDQxNzVlLTEzLCAxLjIxNDY3MjJlLTEzLCAtNy42ODIzMTc0ZS0xNCwgLTUuOTIwMDY5ZS0xNCwgMy44NDQzNTE4ZS0xNCwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDAwMDEwNDk1NjYsIDAuMDAwMDE0OTQyMDk1LCAtMC4wMDAwMTc5ODIzMiwgLTAuMDAwMDYzOTY2Mzc0LCAwLjAwMDA1MDQ5MTcxMiwgMC4wMDAwNzkzMzg0MzUsIC0wLjAwMDEwODI0ODkzLCAtMC4wMDAwNjE3MjMwNDUsCisgICAgICAwLjAwMDExNzUxMjEyLCAtMC4wMDAwMjk4MTM2NjcsIC0wLjAwMDE0MzU1MDk3LCAwLjAwMDM2MzY0MDUyLCAwLjAwMDA0NDU0NDY4NiwgLTAuMDAwNzA0ODIwOTcsIDAuMDAwMzA0NDA3NjcsIDAuMDAxNDkwOTU0NSwKKyAgICAgIC0wLjAwMTI5NjkyMzgsIC0wLjAwMTYyMTE3MTgsIDAuMDAyMzQzMzE3NywgMC4wMDEzMzc3ODM5LCAtMC4wMDcxNjE0MzcxLCAtMC4wMDMzMTIyNTcyLCAwLjAxMjUyNjE4MiwgMC4wMDgzMzgxNzk1MDAwMDAwMDEsCisgICAgICAtMC4wMDU1MzExNDY0LCAwLjAwMzE4NDk2ODMsIDAuMDAyNzU1MzAwOSwgLTAuMDI1NTkzMSwgLTAuMDQxNDIxMjEzLCAwLjAwNDA0MTg1NjgsIDAuMDU3NDg2ODIxLCAwLjA0OTUwMjEyMywKKyAgICAgIDAuMDE2MDkwMDQsIDAuMDAzNjg3MTM3MiwgLTAuMDM5OTg5NzMsIC0wLjEyNTg4NDczLCAtMC4xMDY1NDg2LCAwLjA3MDI3NjI1MSwgMC4yMDc3NDIxLCAwLjEzMjY2MTk4LAorICAgICAgLTAuMDMzMjc4NjExLCAtMC4xMjcwODYzNiwgLTAuMTc4NjIyMjcsIC0wLjE4MDExMywgMC4wMzE5ODMzODQsIDAuMzU4ODk1MDksIDAuMzM4NjYzMzQsIC0wLjEzOTc2NzkzLAorICAgICAgLTAuNDcxMDY2MiwgLTAuMTgxMTA2ODUsIDAuMjk0OTQ5NDIsIDAuMjc2MTMyMTEsIC0wLjEwODk1ODU2LCAtMC4yMTc5ODc1MiwgMC4wNDQzMjQwNTMsIDAuMTg2NjcxNDksCisgICAgICAwLjAwODM2NTc5MjksIC0wLjE1MTYxNzQ1LCAtMC4wNjM3OTkyOCwgMC4wNzEzOTczNjAwMDAwMDAwMSwgMC4wNTk2OTY3NzMsIC0wLjAxNDE4NTk2NSwgLTAuMDE3Mzc1MzUyLCAwLjAxNTk5MDg2LAorICAgICAgMC4wMDU4Mzg3MjI1LCAtMC4wMTUyODE3MjksIC0wLjAxMDMzMDUwOCwgMC4wMDI3MTUzNDk3LCAtMi4xNDExMzdlLTEzLCAxLjg2MjEyOTFlLTEzLCAxLjczNDg1MDJlLTEzLCAtNi4zNDQ2NjAyZS0xNCwKKyAgICAgIC01LjUzMjk5ODZlLTE0LCAyLjE3NTIwNjhlLTE0LCAxLjY2Njg0MThlLTE0LCAtMS40NTIxODNlLTE0LCA3LjcwNzk2NDNlLTE1LCAtNC44NzM1NDA5ZS0xNSwgLTMuNzU1Nzc3OWUtMTUsIDIuNDM5NDA4NmUtMTUsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAtMC4wMDAwMDE2ODYyNTE2LCAwLjAwMDAwMTkwNjAwMTksIC00LjI0ODQ4N2UtNywgLTAuMDAwMDA0NzI5MjAxMywgMC4wMDAwMTA2NTQ4NTksIDAuMDAwMDE0ODY2NjI5LCAtMC4wMDAwMTgzMTE2OTksIC0wLjAwMDA2NDQ2NjM4NCwKKyAgICAgIDAuMDAwMDQ5OTcyMzU1LCAwLjAwMDA3ODk1MDg2NywgLTAuMDAwMTA4NDIyODYsIC0wLjAwMDA2MTcwMDEsIDAuMDAwMTE3NjM2OCwgLTAuMDAwMDI5NzAxNzAxLCAtMC4wMDAxNDM1MjU3NSwgMC4wMDAzNjM1NzE4NSwKKyAgICAgIDAuMDAwMDQ0NDM1MzUxLCAtMC4wMDA3MDQ4OTkxNSwgMC4wMDAzMDQ0MDcwNiwgMC4wMDE0OTEwMjg4LCAtMC4wMDEyOTY4MTk2LCAtMC4wMDE2MjEwOTE2LCAwLjAwMjM0MzMzNzMsIDAuMDAxMzM3NzQ2NSwKKyAgICAgIC0wLjAwNzE2MTQ5OTgsIC0wLjAwMzMxMjMxMDEsIDAuMDEyNTI2MTYxLCAwLjAwODMzODE5MTUsIC0wLjAwNTUzMTExNTgsIDAuMDAzMTg0OTk4NCwgMC4wMDI3NTUzMTcyLCAtMC4wMjU1OTMxMDEsCisgICAgICAtMC4wNDE0MjEyMjQsIDAuMDA0MDQxODQ0NSwgMC4wNTc0ODY4MTUsIDAuMDQ5NTAyMTI1LCAwLjAxNjA5MDA0NywgMC4wMDM2ODcxNDQsIC0wLjAzOTk4OTcyNywgLTAuMTI1ODg0NzMsCisgICAgICAtMC4xMDY1NDg2LCAwLjA3MDI3NjI0OSwgMC4yMDc3NDIxLCAwLjEzMjY2MTk3LCAtMC4wMzMyNzg2MTEsIC0wLjEyNzA4NjM2LCAtMC4xNzg2MjIyNywgLTAuMTgwMTEzLAorICAgICAgMC4wMzE5ODMzODQsIDAuMzU4ODk1MDksIDAuMzM4NjYzMzQsIC0wLjEzOTc2NzkzLCAtMC40NzEwNjYyLCAtMC4xODExMDY4NSwgMC4yOTQ5NDk0MiwgMC4yNzYxMzIxMSwKKyAgICAgIC0wLjEwODk1ODU2LCAtMC4yMTc5ODc1MiwgMC4wNDQzMjQwNTQsIDAuMTg2NjcxNDksIDAuMDA4MzY1NzkyOSwgLTAuMTUxNjE3NDUsIC0wLjA2Mzc5OTI4LCAwLjA3MTM5NzM2MDAwMDAwMDAxLAorICAgICAgMC4wNTk2OTY3NzMsIC0wLjAxNDE4NTk2NSwgLTAuMDE3Mzc1MzUyLCAwLjAxNTk5MDg2LCAwLjAwNTgzODcyMjUsIC0wLjAxNTI4MTcyOSwgLTAuMDEwMzMwNTA4LCAwLjAwMjcxNTM0OTcsCisgICAgICAtOS4wOTM4OTIyOTk5OTk5OTllLTE2LCAxLjU5MjM0NDdlLTE1LCAxLjIzNTAwNDdlLTE1LCAtNS4xNzc1MzI0ZS0xNiwgLTUuOTQyMzc4N2UtMTYsIDMuNzY5MjY1M2UtMTYsIDIuOTAzMjY3ZS0xNiwgLTEuODgxNTQwM2UtMTYsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyA4LjU1MDczNjZlLTgsIC0wLjAwMDAwMTI4NTEyNjUsIDcuODU3MTM2MzAwMDAwMDAxZS03LCAtMy40ODAxODEzZS03LCAtMC4wMDAwMDE4Njg0ODU1LCAwLjAwMDAwMTc0Njc0NDYsIC01LjMzNjMxOGUtNywgLTAuMDAwMDA0NzgzMjg0NywKKyAgICAgIDAuMDAwMDEwNjM5NDc2LCAwLjAwMDAxNDg2NjMyLCAtMC4wMDAwMTgzMTUzNzEsIC0wLjAwMDA2NDQ4MDYwNSwgMC4wMDAwNDk5NTI1NzIsIDAuMDAwMDc4OTM1ODM0LCAtMC4wMDAxMDg0MjU2LCAtMC4wMDAwNjE2OTA2OTUsCisgICAgICAwLjAwMDExNzY1MTI5LCAtMC4wMDAwMjk2OTAyNTEsIC0wLjAwMDE0MzUyMzE5LCAwLjAwMDM2MzU2Njk4LCAwLjAwMDA0NDQyODQzOCwgLTAuMDAwNzA0OTAzNTcsIDAuMDAwMzA0NDA2ODMsIDAuMDAxNDkxMDMyMywKKyAgICAgIC0wLjAwMTI5NjgxNDYsIC0wLjAwMTYyMTA4NzcsIDAuMDAyMzQzMzM4NSwgMC4wMDEzMzc3NDQ5LCAtMC4wMDcxNjE1MDMxLCAtMC4wMDMzMTIzMTMzLCAwLjAxMjUyNjE1OSwgMC4wMDgzMzgxOTEzMDAwMDAwMDEsCisgICAgICAtMC4wMDU1MzExMTQ5LCAwLjAwMzE4NDk5OTUsIDAuMDAyNzU1MzE3OCwgLTAuMDI1NTkzMTAxLCAtMC4wNDE0MjEyMjQsIDAuMDA0MDQxODQ0MSwgMC4wNTc0ODY4MTUsIDAuMDQ5NTAyMTI1LAorICAgICAgMC4wMTYwOTAwNDcsIDAuMDAzNjg3MTQ0MywgLTAuMDM5OTg5NzI2LCAtMC4xMjU4ODQ3MywgLTAuMTA2NTQ4NiwgMC4wNzAyNzYyNDksIDAuMjA3NzQyMSwgMC4xMzI2NjE5NywKKyAgICAgIC0wLjAzMzI3ODYxMSwgLTAuMTI3MDg2MzYsIC0wLjE3ODYyMjI3LCAtMC4xODAxMTMsIDAuMDMxOTgzMzg0LCAwLjM1ODg5NTA5LCAwLjMzODY2MzM0LCAtMC4xMzk3Njc5MywKKyAgICAgIC0wLjQ3MTA2NjIsIC0wLjE4MTEwNjg1LCAwLjI5NDk0OTQyLCAwLjI3NjEzMjExLCAtMC4xMDg5NTg1NiwgLTAuMjE3OTg3NTIsIDAuMDQ0MzI0MDU0LCAwLjE4NjY3MTQ5LAorICAgICAgMC4wMDgzNjU3OTI5LCAtMC4xNTE2MTc0NSwgLTAuMDYzNzk5MjgsIDAuMDcxMzk3MzYwMDAwMDAwMDEsIDAuMDU5Njk2NzczLCAtMC4wMTQxODU5NjUsIC0wLjAxNzM3NTM1MiwgMC4wMTU5OTA4NiwKKyAgICAgIDAuMDA1ODM4NzIyNSwgLTAuMDE1MjgxNzI5LCAtMC4wMTAzMzA1MDgsIDAuMDAyNzE1MzQ5NywgLTIuMjg0OTgyZS0xNSwgMS40NDIwNDU5ZS0xNSwgMS4xMTE2NDMyZS0xNSwgLTcuMjI5NDc1OWUtMTYsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAtMi41NjUwMzFlLTcsIC0xLjAzODQyNjZlLTcsIDMuNzg0MzkwNmUtNywgMC4wMDAwMDEyMjU4Mjc2LCA2Ljg0NzUzNzdlLTgsIC0wLjAwMDAwMTIyMTc3MDEsIDkuMjk3ODUxMWUtNywgLTEuNTUzNTg5MWUtNywKKyAgICAgIC0wLjAwMDAwMTY3OTUzMzMsIDAuMDAwMDAxODgyMDkyNCwgLTQuNzY3MTAwOGUtNywgLTAuMDAwMDA0Nzk1MzY2OSwgMC4wMDAwMTA1OTM5MTMsIDAuMDAwMDE0ODI4MDg1LCAtMC4wMDAwMTgzMjA4MzIsIC0wLjAwMDA2NDQ1MTkwNSwKKyAgICAgIDAuMDAwMDQ5OTk1NDY3LCAwLjAwMDA3ODk2NjQyOSwgLTAuMDAwMTA4NDI0MiwgLTAuMDAwMDYxNzE3ODYyLCAwLjAwMDExNzYxMTc4LCAtMC4wMDAwMjk3MjE5MjMsIC0wLjAwMDE0MzUzMjkxLCAwLjAwMDM2MzU3ODY2LAorICAgICAgMC4wMDAwNDQ0NTAxODcsIC0wLjAwMDcwNDg4NDYxLCAwLjAwMDMwNDQxNDc0LCAwLjAwMTQ5MTAyODMsIC0wLjAwMTI5NjgyNTMsIC0wLjAwMTYyMTA5ODMsIDAuMDAyMzQzMzMyOSwgMC4wMDEzMzc3NDUyLAorICAgICAgLTAuMDA3MTYxNDk5LCAtMC4wMDMzMTIzMDg3LCAwLjAxMjUyNjE2MSwgMC4wMDgzMzgxOTExLCAtMC4wMDU1MzExMTY3LCAwLjAwMzE4NDk5NzUsIDAuMDAyNzU1MzE2NywgLTAuMDI1NTkzMTAxLAorICAgICAgLTAuMDQxNDIxMjIzLCAwLjAwNDA0MTg0NDgsIDAuMDU3NDg2ODE1LCAwLjA0OTUwMjEyNSwgMC4wMTYwOTAwNDcsIDAuMDAzNjg3MTQ0MiwgLTAuMDM5OTg5NzI2LCAtMC4xMjU4ODQ3MywKKyAgICAgIC0wLjEwNjU0ODYsIDAuMDcwMjc2MjQ5LCAwLjIwNzc0MjEsIDAuMTMyNjYxOTcsIC0wLjAzMzI3ODYxMSwgLTAuMTI3MDg2MzYsIC0wLjE3ODYyMjI3LCAtMC4xODAxMTMsCisgICAgICAwLjAzMTk4MzM4NCwgMC4zNTg4OTUwOSwgMC4zMzg2NjMzNCwgLTAuMTM5NzY3OTMsIC0wLjQ3MTA2NjIsIC0wLjE4MTEwNjg1LCAwLjI5NDk0OTQyLCAwLjI3NjEzMjExLAorICAgICAgLTAuMTA4OTU4NTYsIC0wLjIxNzk4NzUyLCAwLjA0NDMyNDA1NCwgMC4xODY2NzE0OSwgMC4wMDgzNjU3OTI5LCAtMC4xNTE2MTc0NSwgLTAuMDYzNzk5MjgsIDAuMDcxMzk3MzYwMDAwMDAwMDEsCisgICAgICAwLjA1OTY5Njc3MywgLTAuMDE0MTg1OTY1LCAtMC4wMTczNzUzNTIsIDAuMDE1OTkwODYsIDAuMDA1ODM4NzIyNSwgLTAuMDE1MjgxNzI5LCAtMC4wMTAzMzA1MDgsIDAuMDAyNzE1MzQ5NywKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMCwgMC4wLCAwLjAsIDAuMCwgMi44MzQ3OTYzZS04LCAyLjI1MjMzMDNlLTgsIC00Ljg3MzUyNDdlLTgsIC0xLjE5NjA5MTZlLTcsCisgICAgICAtMi41Mjg3NjYyZS03LCAtMS4wODcwNDg2ZS03LCAzLjY0NzEzODJlLTcsIDAuMDAwMDAxMjA2NDkzMywgNC45MDEwMzMyZS04LCAtMC4wMDAwMDEyMzU3MzA1LCA5LjI0MzY1NDllLTcsIC0xLjUyNzY2NThlLTcsCisgICAgICAtMC4wMDAwMDE2NzQ0MzQsIDAuMDAwMDAxODg1MDgwOCwgLTQuNzU0NzIzOGUtNywgLTAuMDAwMDA0Nzk5MTc3OCwgMC4wMDAwMTA1ODczNTQsIDAuMDAwMDE0ODI2ODI1LCAtMC4wMDAwMTgzMjEyMywgLTAuMDAwMDY0NDUxNDMyMDAwMDAwMDEsCisgICAgICAwLjAwMDA1MDAxMDc4NywgMC4wMDAwNzg5ODEzNTIsIC0wLjAwMDEwODQzOTY5LCAtMC4wMDAwNjE3ODEwMzMsIDAuMDAwMTE3NjQ2NjEsIC0wLjAwMDAyOTY1MjIzMiwgLTAuMDAwMTQzNjI1NTMsIDAuMDAwMzYzNTUyNzMsCisgICAgICAwLjAwMDA0NDU1NTAwMSwgLTAuMDAwNzA0OTQwMzcsIDAuMDAwMzA0MzE2MDgsIDAuMDAxNDkxMzI2OSwgLTAuMDAxMjk2ODQ4MSwgLTAuMDAxNjIxNjk2OSwgMC4wMDIzNDM2NDczLCAwLjAwMTMzOTE2NjcsCisgICAgICAtMC4wMDcxNjI3Mjg5LCAtMC4wMDMzMTM4MTM4LCAwLjAxMjUyODQxNSwgMC4wMDgzMzkxMzc3MDAwMDAwMDEsIC0wLjAwNTUzNzQzNjEsIDAuMDAzMTgyMzQyMywgMC4wMDI3NjYzNDU4LCAtMC4wMjU1ODYwMzksCisgICAgICAtMC4wNDE0MjQxMjQsIDAuMDA0MDQ3NTQzNywgMC4wNTc0ODQwMTcsIDAuMDQ5NDcwMDY3LCAwLjAxNjA1NDE3NSwgMC4wMDM2OTIxMjQ2LCAtMC4wMzk5MzU3MTUsIC0wLjEyNTgyNTE3LAorICAgICAgLTAuMTA2NDkxOCwgMC4wNzAyOTU0MDMwMDAwMDAwMSwgMC4yMDc2Mjc5NSwgMC4xMzI0Njk5OCwgLTAuMDMzNDE0MzY1LCAtMC4xMjcwNTI4MSwgLTAuMTc4MzMzNDYsIC0wLjE3OTcyNDMsCisgICAgICAwLjAzMjIyMDA2NCwgMC4zNTg3MzY4LCAwLjMzODA3NDc1LCAtMC4xNDA1Mjg2LCAtMC40NzE0NTMyMSwgLTAuMTgwNjYwMjIsIDAuMjk2MTEzMywgMC4yNzczMjI5NywKKyAgICAgIC0wLjEwODU1ODQ1LCAtMC4yMTg3MzI5LCAwLjA0Mjc1Mjg5NywgMC4xODUwODc2NiwgMC4wMDc3NjQxNjY5LCAtMC4xNTA1Mzc4NywgLTAuMDYxMjIyODIsIDAuMDc0MjI4ODUzLAorICAgICAgMC4wNjA5OTQ2MywgLTAuMDE1ODU5MzAxLCAtMC4wMjI0MTQwNCwgMC4wMDgzNjk5NTc5MDAwMDAwMDEsIH0sCisgICAgeyAwLjAsIDAuMCwgMC4wLCAwLjAsIDMuMTEwNDg2NWUtMTEsIDIuNDcxMzc0NGUtMTEsIC01LjM0NzQ4NTZlLTExLCAtMS4zMTI0MTQxZS0xMCwKKyAgICAgIDIuODA3NjA3M2UtOCwgMi4yNDA4NDZlLTgsIC00LjgzNDQ2NTVlLTgsIC0xLjE4MzA4ODdlLTcsIC0yLjUyODgzNjZlLTcsIC0xLjEwMDkwOTRlLTcsIDMuNjU4MTg4NWUtNywgMC4wMDAwMDEyMDY2MDk3LAorICAgICAgNC43MjI3NzEyZS04LCAtMC4wMDAwMDEyMzM5MDU0LCA5LjIzOTc1NTllLTcsIC0xLjU4MzA2ODFlLTcsIC0wLjAwMDAwMTY2MjMwOTcsIDAuMDAwMDAxOTAyNzA4LCAtNC45NzM2ODQxZS03LCAtMC4wMDAwMDQ4NzQ2NTcxLAorICAgICAgMC4wMDAwMTA2NDE5MzYsIDAuMDAwMDE0OTE2OTAzLCAtMC4wMDAwMTg0NDEyNywgLTAuMDAwMDY0NTE1NDk4LCAwLjAwMDA1MDE1NjI4NSwgMC4wMDAwNzg5NDU0MjIwMDAwMDAwMSwgLTAuMDAwMTA4NjExMTYsIC0wLjAwMDA2MTM4ODk5NywKKyAgICAgIDAuMDAwMTE3NjU4MSwgLTAuMDAwMDMwNDQ4ODAzLCAtMC4wMDAxNDMyNjI2MSwgMC4wMDAzNjUzOTA5NiwgMC4wMDAwNDMxNjMyNTEsIC0wLjAwMDcwNjkwMTg1LCAwLjAwMDMwNzAxOTg4LCAwLjAwMTQ5MjQyNzQsCisgICAgICAtMC4wMDEzMDQ4MzIsIC0wLjAwMTYyNDYzMDIsIDAuMDAyMzU3MDMzLCAwLjAwMTM0NzQ5NDQsIC0wLjAwNzE2OTg1MDUsIC0wLjAwMzMxMDg2OTEsIDAuMDEyNTMzNTI0LCAwLjAwODMxNjI2OTgsCisgICAgICAtMC4wMDU1ODE4NDkyLCAwLjAwMzE4MTEzOSwgMC4wMDI4MzA5NjY5LCAtMC4wMjU1MjM5MzgsIC0wLjA0MTQyNzc5NCwgMC4wMDQwMzk1NTI5LCAwLjA1NzQ2ODc5MiwgMC4wNDkzNTM1NjcsCisgICAgICAwLjAxNTg1OTc2NiwgMC4wMDM3MTgwNzIxLCAtMC4wMzk1NTU1NjksIC0wLjEyNTU3MzI5LCAtMC4xMDY1MjQzNCwgMC4wNzAyNjE1OTUsIDAuMjA3MzQ1NjUsIDAuMTMxNzM4OCwKKyAgICAgIC0wLjAzNDA0MTAzLCAtMC4xMjY2MjgyNiwgLTAuMTc3MDg4MiwgLTAuMTc4NjAxNzUsIDAuMDMyNzEwMDQ2LCAwLjM1ODU2MDMzLCAwLjMzNjc4MDM0LCAtMC4xNDMxNjE1NiwKKyAgICAgIC0wLjQ3MzY0NywgLTAuMTc5NzUzMjMsIDAuMzAwMjgzODQsIDAuMjgxNTcwMjUsIC0wLjEwNzYyNDQxLCAtMC4yMjE4MTQzNCwgMC4wMzczOTMzMDMsIDAuMTgwMDc4MTYsCisgICAgICAwLjAwNjI1MzY0OSwgLTAuMTQ1MTU2MDIsIC0wLjA0Njk5MjE0NCwgMC4wOTYyMTQzMywgfSwKKyAgICB7IDAuMCwgMC4wLCAwLjAsIDAuMCwgNC45MzAyMjA5ZS0xMSwgMy45MTcyMDc4ZS0xMSwgLTguNDc1OTM2M2UtMTEsIC0yLjA4MDIxODVlLTEwLAorICAgICAgLTguMDYyMzY2NWUtMTEsIDkuNjMxNzM3OWUtMTEsIDEuNjgxNzc4MmUtMTEsIDUuODI4MzczMWUtMTAsIDIuNTc1OTI5M2UtOCwgMS45NDE4MDA1ZS04LCAtNC4zNDE3OTI5ZS04LCAtMS4wNjgyNDk1ZS03LAorICAgICAgLTIuNTk3NTY0MWUtNywgLTEuMjMwMDQ3OGUtNywgMy44MjE3Nzk5ZS03LCAwLjAwMDAwMTIxODE4MSwgNC40NTc5NDU5ZS04LCAtMC4wMDAwMDEyMTA3MzM4LCA5LjA3NzkyMTJlLTcsIC0zLjE3MDk0MDllLTcsCisgICAgICAtMC4wMDAwMDE0NzY3OTI5LCAwLjAwMDAwMjI0MTI2MTIsIC05LjEwMzcwOTVlLTcsIC0wLjAwMDAwNTg1MjEzMTUsIDAuMDAwMDExNTk0MTI5LCAwLjAwMDAxNjA5MTA1LCAtMC4wMDAwMjAyODk3OTYsIC0wLjAwMDA2NTc2MzQ3NSwKKyAgICAgIDAuMDAwMDUyNjg5MDk5LCAwLjAwMDA3ODg4MjAzMzk5OTk5OTk5LCAtMC4wMDAxMTE5MTMxNSwgLTAuMDAwMDU2MzA1NDQ2LCAwLjAwMDExNzk0NDkxLCAtMC4wMDAwNDE2MzY0MDIsIC0wLjAwMDEzODUyMDM1LCAwLjAwMDM5MzUzODM1LAorICAgICAgMC4wMDAwMTYwODc2NjcsIC0wLjAwMDc0NzcxMTc2LCAwLjAwMDM2NDM5Njc3LCAwLjAwMTU1NTAyNDMsIC0wLjAwMTQyNDIzNywgLTAuMDAxNjkxMjAxNiwgMC4wMDI1NTQ5MzU2LCAwLjAwMTQyMzU2MjUsCisgICAgICAtMC4wMDc0NTI5ODM4LCAtMC4wMDMzMTkwNzE3LCAwLjAxMjkwODc4NywgMC4wMDgyMjE4MzE5LCAtMC4wMDYxMjk3ODY0LCAwLjAwMzMzMDg0NTQsIDAuMDAzNDgwOTg2LCAtMC4wMjU2ODMwMzEsCisgICAgICAtMC4wNDE5OTU5NzYsIDAuMDA0NDczNzg0MSwgMC4wNTc5ODEwMDEsIDAuMDQ4NjM0NzcxLCAwLjAxNDc0MzMzMSwgMC4wMDQwOTcwNTQ3LCAtMC4wMzc3NDkyMDUsIC0wLjEyNDk1NjAzLAorICAgICAgLTAuMTA2Nzk3MDEsIDAuMDcwNjIzMjIzLCAwLjIwNjgxNDE0LCAwLjEyNzE3NTc2LCAtMC4wMzg5ODc2MjQsIC0wLjEyNDg0MzY0LCAtMC4xNjkwMzMxNSwgLTAuMTcxMzA5MTcsCisgICAgICAwLjAzNjEyNTkyOSwgMC4zNTkxNDc1NSwgMC4zMzA2MjY0MiwgLTAuMTYwMjY0MDgsIC0wLjQ5MDg3NzIzLCAtMC4xNzYxNTE0OCwgMC4zMjg5NTU2MywgMC4zMTM0ODUzNSwKKyAgICAgIC0wLjA5NzQyMDg4NywgLTAuMjQwNjcxNTcsIC0wLjAwNjg2NDIzNzgsIDAuMTEyMTk2OTcsIH0sCisgICAgeyAwLjAsIDAuMCwgMC4wLCAwLjAsIDEuNjY2OTk1OGUtMTEsIDEuMzI0NDc3OWUtMTEsIC0yLjg2NTg2NTVlLTExLCAtNy4wMzM1OTA0ZS0xMSwKKyAgICAgIDIuMjgxNDA0MWUtMTAsIDIuMzU0OTAxMWUtMTAsIC00LjMzMzkzMzVlLTEwLCAtOC44MDU0OTg4OTk5OTk5OTllLTEwLCAtMS4yOTM1ODYyZS05LCAtNS41MTUyMzQyOTk5OTk5OTllLTEwLCAxLjg4NjEyNjllLTksIDcuMzQ0NjA5NGUtOSwKKyAgICAgIDEuMjU0MzM1MmUtOCwgMS41NDU0MjZlLTksIC0xLjUxNjU4ODZlLTgsIC00LjkxNDYxNzVlLTgsIC0yLjkyMzQ1ODZlLTcsIC0xLjc2Mzk1NDFlLTcsIDQuNTM3NDgyOWUtNywgMC4wMDAwMDEyMjA5NDg3LAorICAgICAgMS4yMjc4MTcxZS03LCAtOS42ODUyNjA5OTk5OTk5OTllLTcsIDYuNDQ4OTIxNmUtNywgLTAuMDAwMDAxNTAwODAyNSwgLTMuOTM1NDI4M2UtNywgMC4wMDAwMDQyMjgxMzY1LCAtMC4wMDAwMDMzNTY1MDU3LCAtMC4wMDAwMTAzMDM2ODYsCisgICAgICAwLjAwMDAxNzAxMjU2MiwgMC4wMDAwMjA5MDY1NzQsIC0wLjAwMDAyOTYxMzU3LCAtMC4wMDAwNjk2MzM5NzcsIDAuMDAwMDYyMTI5NTg3LCAwLjAwMDA3Mzg3MDU3NSwgLTAuMDAwMTIyOTI0MTgsIC0wLjAwMDAxNjgyODY5LAorICAgICAgMC4wMDAxMDg1NzQ5OCwgLTAuMDAwMTExOTU1ODgsIC0wLjAwMDA5MDI2ODc1NDAwMDAwMDAxLCAwLjAwMDUzMDExOTE5LCAtMC4wMDAxNDYwODYwOCwgLTAuMDAwOTI1NjA4MjksIDAuMDAwNjcwNDk0OTQsIDAuMDAxODAxOTE4MywKKyAgICAgIC0wLjAwMjA0MDQ5OTgsIC0wLjAwMTkzMTY3NTUsIDAuMDAzNTIyNjE0OCwgMC4wMDE2ODY5MDk0LCAtMC4wMDg2OTM1ODUsIC0wLjAwMzI4NDk3MjEsIDAuMDE0NTU0MDA5LCAwLjAwNzgxNTE3MzksCisgICAgICAtMC4wMDg0NTM3ODAyLCAwLjAwNDE2MDUzNDcsIDAuMDA1ODY2NTY4MiwgLTAuMDI2Nzc0MTk4LCAtMC4wNDU5MTQ5ODYsIDAuMDA0OTEyMzE5NSwgMC4wNjM3NzY5NTEsIDAuMDUwNDQxOTY2LAorICAgICAgMC4wMTM2MzA5OTcsIDAuMDA3NTEwODM5OCwgLTAuMDM3MDM0NTE0LCAtMC4xNDAzMTc4LCAtMC4xMjY3MTgzMywgMC4wNzI4ODk2NzcsIDAuMjMyMzQxMiwgMC4xNTI2ODEyNCwKKyAgICAgIC0wLjAyNDc4NjQwMiwgLTAuMTIyNTkzNTIsIC0wLjE5NTc2MzcyLCAtMC4yMzQxNDYzOSwgLTAuMDEwMjg5MTA4LCAwLjM5NjkwMjQ5LCAwLjQzMzcwNjQ4LCAtMC4wODk0NTg4NDQsCisgICAgICAtMC41MDg2NDQ3OCwgLTAuMjUwNzYzNDYsIDAuMjMyMzgzNjgsIDAuMTc4NjcyNzgsIH0sCisgICAgeyAtMC4xMDMzNjA5OCwgMC40MzY5ODM1NSwgLTAuMDUyMDUwNTQsIC0wLjM4MDk0MjczLCAwLjI1NjQ0NTUxLCAwLjIzNDY4OTYsIC0wLjM3OTc4NDY4LCAwLjEyMjg1NzU4LAorICAgICAgMC4xMTQwNjU3NCwgLTAuMTkzNDYyODcsIDAuMjUwNzY3MjEsIC0wLjEwMDAzMDYsIC0wLjIxMzYxMDUyLCAwLjMwODYzNzkyLCAtMC4xMDc3ODk2LCAtMC4xMzY0MjI2MywKKyAgICAgIDAuMTkxMzE0OTgsIC0wLjEwODE2MjM2LCAwLjAxMTg1NjA0NiwgMC4wNzM2NDUzMjUsIC0wLjEwOTM5MTAzLCAwLjA2NDM3Mjg5MSwgMC4wMTU0NTY4OTUsIC0wLjA1ODU2NjM5NywKKyAgICAgIDAuMDQyNzAyOTU4LCAtMC4wMDkwMDI4Njk3MDAwMDAwMDEsIC0wLjAwNzY3MjcxNjIsIDAuMDA5Njk1MjY2MiwgLTAuMDExMDg2MzYsIDAuMDA3MDM0MzIyMiwgMC4wMDU0Mjk4Njk5LCAtMC4wMDM1MTUzMjk0LAorICAgICAgLTIuODIxMjEyNmUtMTcsIDIuOTM2NDYxMmUtMTcsIC0yLjg0OTc1OThlLTE4LCAtNi41NTk4MzY3ZS0xOCwgMi4yMTk2OTE3ZS0xNywgLTEuNTk2NjMxMmUtMTcsIC02Ljg0MTU0NjZlLTE5LCAxLjAyNTY0MjJlLTE3LAorICAgICAgLTEuMDkwMzA5MmUtMTcsIDYuMTM2MTEzZS0xOCwgMS41NTAzOTQ2ZS0xOCwgLTMuNDQwMzk5NGUtMTgsIDQuNzI5MjEwN2UtMTgsIC0zLjE0MjczMmUtMTgsIC0xLjA3NDc1NTRlLTE4LCAyLjQ0MDg4NTNlLTE4LAorICAgICAgLTEuMjg4NDUwNGUtMTgsIDcuOTk3MTA1ZS0yMCwgNC40ODA4NzUzZS0xOSwgLTUuMjc2MjA0OWUtMTksIDEuODU5NDY4NmUtMTksIDEuMDg0NzkyM2UtMTksIC0zLjMzMDE3NTRlLTE5LCAxLjQyNzMxNDFlLTE5LAorICAgICAgMi4wNTM1NDE0ZS0xOSwgLTEuODkyOTI5NmUtMTksIDEuMjE3NzM3OGUtMjAsIDcuNTY2OTkyNzk5OTk5OTk5ZS0yMCwgLTEuNzYxMjM0OWUtMTksIDUuOTUzNjgzOWUtMjAsIC0xLjE3MjQ3NTJlLTIwLCAtOC4zNzE4MDYzZS0yMCwKKyAgICAgIDguMTk0NTE5OGUtMjAsIDEuMzU5MzMyM2UtMjEsIC0xLjA5MzkyMDZlLTIxLCAyLjcyOTY2NjRlLTIwLCAtMi45OTc1MDc5ZS0yMCwgLTUuMTY0NjE3NmUtMjIsIDcuMDIzODExOWUtMjEsIC0xLjkwODM3MTJlLTIxLAorICAgICAgMS41NDE3NzM4ZS0yMSwgLTQuODQ3MDkyZS0yMiwgLTYuOTAwMTE2ZS0yMiwgNy43NzgwMzQzZS0yMiwgMS42MDM1NjExZS0yMSwgLTEuMTY3MTAyNGUtMjEsIC04LjgwOTM4NjcwMDAwMDAwMWUtMjIsIDUuMTkwNzU0OWUtMjIsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAtMC4yMzgxNTc0LCAwLjI0Nzg3ODIxLCAwLjE0NzM4NTUzLCAtMC4zMTk3NzU5NiwgLTAuMDYyMzcyNzYyLCAwLjMyNTEzODU3LCAtMC4wNjgxNzE0ODYsIC0wLjMxNzM2MDI2LAorICAgICAgMC4yNDcxMTk3NCwgMC4xNDUxODQxNCwgLTAuMzA0MzM3MzUsIDAuMTUwMzAxNjksIDAuMDUxNTgwMzE2LCAtMC4yMDI1NDcxLCAwLjI0OTAzNzE2LCAtMC4wOTc3MDQyNTYsCisgICAgICAtMC4xODAzOTA2NiwgMC4yOTg2MjkyMiwgLTAuMTI2MzM4NSwgLTAuMTEyNjQxMDYsIDAuMTkxNjg2MjksIC0wLjEyMDE5ODkyLCAwLjAwOTk1NTA2NDIwMDAwMDAwMSwgMC4wNzIyMDcxODM5OTk5OTk5OSwKKyAgICAgIC0wLjEwNzU2ODcxLCAwLjA2OTczMDUwNCwgMC4wMTQwNzc2NTMsIC0wLjA2Mzg0NzcxNiwgMC4wNDY0ODU2MDcsIC0wLjAwOTMxOTQwMTQ5OTk5OTk5OSwgLTAuMDA3NTkzNjU2NCwgMC4wMTAxNDUxMywKKyAgICAgIC0wLjAxMjgyNzY4MywgMC4wMDgxMzQwNDAyOTk5OTk5OTksIDAuMDA2MzM2ODAzNCwgLTAuMDA0MDg4OTQ2NSwgLTAuMDAwMDA2MzUwNTE5MSwgMC4wMDAwMDY5NTAzODMsIC0wLjAwMDAxMjQxMzQ4LCAwLjAwMDAwNzExMTg0NiwKKyAgICAgIC0wLjAwMDAwNjQ2MzExNzMsIDAuMDAwMDA3OTQ4NjIyMiwgLTAuMDAwMDA1MTgwNDMxNSwgOS43ODgzNzY3OTk5OTk5OTllLTcsIC0wLjAwMDAwMTI4Njg2MzcsIDAuMDAwMDAyOTE2MTQ3NywgLTIuMTExOTExNmUtNywgLTUuMjQ3OTM1OGUtNywKKyAgICAgIDEuMjkyNDE1OGUtOCwgNC41MTUyNDY2ZS03LCA1LjY4ODExNDRlLTcsIC0xLjQ0MDkxNjFlLTcsIC0xLjYyODc1ODRlLTcsIDYuNjY1MjU1NWUtOCwgMS43NDMzOTg3ZS03LCAtNi42NjMyNDkxMDAwMDAwMDFlLTgsCisgICAgICAxLjYyOTExNGUtOCwgLTQuMzM2NTgwNmUtOCwgLTguNzgzODU3MWUtOSwgMS4zNTU4MjUxZS04LCAtOC4xNDE0ODkzZS0xMCwgLTYuNjk0ODIxNGUtOSwgLTcuNDU2MTUwNzAwMDAwMDAxZS05LCA4LjgwNjQxMDZlLTEwLAorICAgICAgMy44MjcxNzQ5ZS05LCAtMi4xNTQ2OTc3ZS05LCAtMi4xMTI1Mzg3ZS05LCAxLjI1MjEzMDFlLTksIC0zLjM0NzgzOTRlLTEwLCAyLjk2NjQzMzJlLTEwLCAyLjUzMzMwNjRlLTEwLCAtMS4yNzg2ODk4ZS0xMCwKKyAgICAgIC04Ljk2MDYxMjJlLTEyLCA2Ljg2MzYwMDZlLTEyLCA2LjAxMjY4MThlLTEyLCAtMy4yNDM0NzcyZS0xMiwgMS43NTAzNDY5ZS0xMywgLTEuNDMyNzU0NWUtMTMsIC0xLjIzNjgxMDNlLTEzLCA2LjQ4OTg1OTNlLTE0LAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMTY1OTQ1NDYsIDAuMDIxOTcyMzc1LCAwLjIxMjU3MDczLCAtMC4xMzc5NTcxOSwgLTAuMjMzMjU4OTIsIDAuMjI5Nzk3ODgsIDAuMTM2NDY3MzIsIC0wLjI4NjYyMDMxLAorICAgICAgLTAuMDM2OTYwNTE1LCAwLjMwNjU3NDcsIC0wLjA3MzEwMjQwNCwgLTAuMjk1NTI4LCAwLjIzMzgxMjIxLCAwLjEyMjYzNzEyLCAtMC4yODg5MDU5OSwgMC4xNTg4MjQ5NSwKKyAgICAgIDAuMDQ3NTc4NTc2LCAtMC4xOTY3NzkxOCwgMC4yNDMzODE2NCwgLTAuMDk4NzE2ODk3LCAtMC4xNzA5NTQyMSwgMC4yOTA3NDI0NCwgLTAuMTMzODI1NTcsIC0wLjEwODY1ODkxLAorICAgICAgMC4xOTMwMjU0MSwgLTAuMTE4MTc2NTMsIDAuMDEwNDg4NjYsIDAuMDY4OTQyNzAxOTk5OTk5OTksIC0wLjEwNzEyODI2LCAwLjA3MTc5MzcwOSwgMC4wMTMxNDc2OCwgLTAuMDY1MzcwNzI5LAorICAgICAgMC4wNDY3NTk1NDQsIC0wLjAwODQ0MDgyMzgsIC0wLjAwNzIzMjEzNzQsIDAuMDEwMTY0MDgzLCAtMC4wMTM1MTkwMjcsIDAuMDA4NTc2NjE4ODk5OTk5OTk5LCAwLjAwNjYyOTU4NTUsIC0wLjAwNDI5MDY0NDksCisgICAgICAtOS45OTg3Nzg1MDAwMDAwMDFlLTcsIDAuMDAwMDAxNTQ3ODIwNCwgLTAuMDAwMDAxNzUxNzAzNiwgNy4zMzIyNzNlLTcsIC0wLjAwMDAwMTAzMTc1MTgsIDAuMDAwMDAxNjYwMjc1MywgLTkuNjgyODQ0MDAwMDAwMDAxZS03LCAyLjUxOTAzNzdlLTcsCisgICAgICAtMy4yODIzNjc0ZS03LCA1LjgzMTU1NDdlLTcsIDUuNTE0NDIzOTk5OTk5OTk5ZS0xMCwgLTUuNDIxMzMyM2UtOCwgLTcuMDgxODk0M2UtOCwgMS4xNDE1MjY4ZS03LCA5Ljk0MDUwNmUtOCwgLTUuNjAxNTI5N2UtOCwKKyAgICAgIDUuNzIyNTYzNWUtMTAsIDIuODEyOTk0NGUtOSwgMi40NzY5MjgyZS04LCAtNS44ODk4Nzg3ZS05LCAtOS40NTU0NzAyZS0xMSwgLTYuNDc5MDc3MmUtOSwgMy4wNTUxMjgzZS05LCAyLjAwODM2NjllLTksCisgICAgICAtMS42Mzg2OTNlLTksIC0xLjA1NjEzNjFlLTksIC0xLjU5MDQ0MTRlLTksIC0yLjQ5OTY5NmUtMTAsIDEuMzM3NDY0NWUtOSwgLTcuMzMyNTc0NmUtMTAsIC02Ljg2MzkwMWUtMTAsIDQuMzU3OTQ1ZS0xMCwKKyAgICAgIC0xLjM5NjU0NzFlLTEwLCAxLjA5ODQyMzJlLTEwLCA5LjU2NTMyNjJlLTExLCAtNS4xMDMxNTYxZS0xMSwgMS42NjE2MjczZS0xMiwgLTEuMzYwMTMyNmUtMTIsIC0xLjE3NDEyMDJlLTEyLCA2LjE2MDkwODVlLTEzLAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMDY5MTA0MzIzLCAtMC4wNDIzNzIxNCwgMC4xMDk2NzM1MywgMC4wMTEyODI0MDEsIC0wLjE3NDE1MDUxLCAwLjAyMTQwMzA1MywgMC4yMTk0NTcyNCwgLTAuMTIwMjg2MTEsCisgICAgICAtMC4yMTUyMzA4NSwgMC4yMzIzMDQ5OSwgMC4xMjk5MTQ4NywgLTAuMjg3NDg3ODMsIC0wLjAzNTY4OTgwMSwgMC4zMDQwOTkwOCwgLTAuMDcwNDc0Mzg0LCAtMC4yODgyMTY0NiwKKyAgICAgIDAuMjMxOTMyMzEsIDAuMTE3NDUyMSwgLTAuMjg2NTE1MzgsIDAuMTYwMjAzMTksIDAuMDQ2MTQzNzg3LCAtMC4xOTc0NTIxNiwgMC4yNDAwOTYzOSwgLTAuMDk5MTU2OTg5LAorICAgICAgLTAuMTY3MjYyMDQsIDAuMjkwOTEyNTcsIC0wLjEzNDk0MDc5LCAtMC4xMDg0NTcwNCwgMC4xOTI4NzYzNywgLTAuMTE3Nzk2MzIsIDAuMDEwMzQzNzYsIDAuMDY3OTExMjUwMDAwMDAwMDEsCisgICAgICAtMC4xMDcwMTUyOCwgMC4wNzI1MjYzNjg5OTk5OTk5OSwgMC4wMTMxMDg2MjcsIC0wLjA2NTc1ODUyMywgMC4wNDY3NTQxNzEsIC0wLjAwODIwMjMwMjQsIC0wLjAwNzEwNTkwNjQsIDAuMDEwMTQwNzMyLAorICAgICAgLTAuMDEzNjc1NTM5LCAwLjAwODY3NzA4NDIwMDAwMDAwMSwgMC4wMDY2OTgyLCAtMC4wMDQzMzYyNzIyLCAtNC4yOTI4NjM0ZS03LCA1LjU3NjIzMjVlLTcsIC02LjAyNTExOTdlLTcsIDIuODU0NTE3OGUtNywKKyAgICAgIC0yLjQ4NDc5NTJlLTcsIDMuMjIxNjA0M2UtNywgLTEuMTQ1NDQ2NWUtNywgLTkuNzYxMzk4NGUtOSwgLTEuNDE4MDUzN2UtOCwgNi4zMzY3ODU1MDAwMDAwMDFlLTgsIDMuMTg0MDQxOWUtOCwgLTIuMzc4ODM4ZS04LAorICAgICAgLTQuMDcxODczMmUtOSwgMS4xNzQ2MTQxZS04LCAxLjg3ODgwNzZlLTgsIC03LjYyNjI0MDgwMDAwMDAwMWUtOSwgOS45ODk5NjM4ZS0xMCwgLTMuNTE0NTQ3OWUtOSwgMy42NjQ1NjNlLTksIDEuNTI1MTYzOWUtOSwKKyAgICAgIC0yLjI1MDM5MzhlLTksIC0xLjU2NjI5MzZlLTEwLCAtNS42NjgyODc4ZS0xMCwgLTUuMzA5MzQ5NmUtMTAsIDEuMDYxNTQxOGUtOSwgLTYuMTA2NTkwOGUtMTAsIC01LjY1NDUyMDdlLTEwLCAzLjUwNjUxMzVlLTEwLAorICAgICAgLTkuOTcwOTQ1NWUtMTEsIDcuODQ3MDQ2MmUtMTEsIDYuODMyNDk1OGUtMTEsIC0zLjY0NDI4MDVlLTExLCAxLjE2OTE5MDllLTEyLCAtOS41NzA0NjU5OTk5OTk5OTllLTEzLCAtOC4yNjE2MDQ2ZS0xMywgNC4zMzUwNzQ3ZS0xMywKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjAxNTkxMTYwOCwgLTAuMDI3Mjk5OTY5LCAwLjAzMzE4NjA0NCwgMC4wMzk5OTU0MTcsIC0wLjA3MzQyNDExLCAtMC4wNDExMjEzMzEsIDAuMTE2MzIyNiwgMC4wMjA5MTA0OTUsCisgICAgICAtMC4xNjU2MzkzMywgMC4wMjQ3MTQ2MTgsIDAuMjE3NTQ3MTUsIC0wLjEyMjg0ODc2LCAtMC4yMTUyNjU0LCAwLjIzNDEzMTY1LCAwLjEzMjM3NjQ5LCAtMC4yODU5NDI1OSwKKyAgICAgIC0wLjAzNjkwNzM2OSwgMC4zMDE2OTcxNywgLTAuMDcwMjY0NTI0OTk5OTk5OTksIC0wLjI4NjM2MDYsIDAuMjMxMjcwNTcsIDAuMTE1NDg0MzUsIC0wLjI4NjcxNzI1LCAwLjE2MDY0NjcsCisgICAgICAwLjA0NjcwNzgyLCAtMC4xOTY4ODc1NywgMC4yMzk1NzY0NSwgLTAuMDk5Mjk3ODkyLCAtMC4xNjY2ODM5MywgMC4yOTA2MzczNSwgLTAuMTM1Mjk4ODMsIC0wLjEwODQ0MTI0LAorICAgICAgMC4xOTI4MjIxMSwgLTAuMTE3NjA4MDQsIDAuMDEwMzQ3NjEsIDAuMDY3NjY3MDc0OTk5OTk5OTksIC0wLjEwNjk3MDk3LCAwLjA3MjY3NTA4NywgMC4wMTMxMDA0NTMsIC0wLjA2NTgzMjE2MSwKKyAgICAgIDAuMDQ2NzQyMDYyLCAtMC4wMDgxNDczMDM5LCAtMC4wMDcwNzQzNjQzLCAwLjAxMDEzMTMxNSwgLTAuMDEzNzA1NjUzLCAwLjAwODY5NjI4OTgsIDAuMDA2NzEyNTM5NiwgLTAuMDA0MzQ1NzM5OCwKKyAgICAgIC04LjE2Mjc2MDhlLTgsIDguNTQzNzgwMTAwMDAwMDAxZS04LCAtNS4zNzEyNTg5ZS04LCAxLjMyNzMzNmUtOSwgMS45MTA3MzM1ZS05LCAxLjYxOTY3NTJlLTgsIDMuMjIxNTU4OGUtOSwgLTQuNDQ2NjM3M2UtOSwKKyAgICAgIC0yLjE3NDY1MzllLTksIDUuMzQyMDI2N2UtOSwgNS45NTIxODFlLTksIC0zLjAyMDU1NzZlLTksIDYuMDk5OTY2NWUtMTAsIC05LjU5MDM3MTMwMDAwMDAwMWUtMTAsIDEuMzY4MjU2ZS05LCA1LjI5Mjg3OTNlLTEwLAorICAgICAgLTkuMTQwMzYyN2UtMTAsIDYuNzYzMjcwNDk5OTk5OTk5ZS0xMSwgLTYuNzYwODE5MWUtMTEsIC0yLjM0NzQzODVlLTEwLCAzLjUzMTAxNjhlLTEwLCAtMi4wNzgzMDgzZS0xMCwgLTEuOTE0Nzg4N2UtMTAsIDEuMTc0MTkyM2UtMTAsCisgICAgICAtMy4xMzM4OTYxZS0xMSwgMi40NjcxODU5ZS0xMSwgMi4xNDgwMzk0ZS0xMSwgLTEuMTQ1NTQ3OGUtMTEsIDMuNjQzNjk0M2UtMTMsIC0yLjk4MjU2MjJlLTEzLCAtMi41NzQ2NjU1ZS0xMywgMS4zNTA5OTI4ZS0xMywKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDAwMTA5NTMzNzYsIC0wLjAwNjY2OTUyOTQsIDAuMDAyOTI1OTM4LCAwLjAxNzg1MTY0NiwgLTAuMDE2ODUzNzI4LCAtMC4wMjY2NjU5MzgsIDAuMDM1MzcwMjMxLCAwLjA0Mjc5NDYxMywKKyAgICAgIC0wLjA3MTExODU0NTAwMDAwMDAxLCAtMC4wNDAwMzM5MjIsIDAuMTE2MTAzNzksIDAuMDIwMDk5NTI1LCAtMC4xNjU4OTMwNywgMC4wMjU0OTU2MzksIDAuMjE4NTg2MTgsIC0wLjEyMjYzNTg0LAorICAgICAgLTAuMjE1OTYyMjQsIDAuMjMzNTI0NTEsIDAuMTMyNTgyNTcsIC0wLjI4NTQ5OTA2LCAtMC4wMzcwOTM1MzIsIDAuMzAxMTM1MDgsIC0wLjA3MDM1MzYzMSwgLTAuMjg2MDEwNTEsCisgICAgICAwLjIzMTM4ODcxLCAwLjExNTM3NzU3LCAtMC4yODY2OTY0OSwgMC4xNjA3MDc0NywgMC4wNDY3NDczNjksIC0wLjE5NjkxNTgsIDAuMjM5NDQxNywgLTAuMDk5MjkyNjk2LAorICAgICAgLTAuMTY2NTk5OCwgMC4yOTA1OTc5OCwgLTAuMTM1MzMzNywgLTAuMTA4NDQ0MjYsIDAuMTkyODEwNDksIC0wLjExNzU2OTQsIDAuMDEwMzQyMzU4LCAwLjA2NzYyNzY1MywKKyAgICAgIC0wLjEwNjk1NzYsIDAuMDcyNjkyNDIyMDAwMDAwMDEsIDAuMDEzMTAwOTExLCAtMC4wNjU4MzgwNzMsIDAuMDQ2NzM1NTc4LCAtMC4wMDgxMzg3MDkxMDAwMDAwMDEsIC0wLjAwNzA2ODM0MDgsIDAuMDEwMTI4NDI0LAorICAgICAgLTAuMDEzNzA4MzY0LCAwLjAwODY5Nzk4Nzc5OTk5OTk5OSwgMC4wMDY3MTQwNjA0LCAtMC4wMDQzNDY3MjY0LCAxLjk2MjIxODhlLTksIDEuNzQwNjIwMWUtMTAsIC0xLjY3MjQ0N2UtOSwgNS40NjUxMTA5ZS0xMCwKKyAgICAgIC00Ljc1OTU4NjllLTEwLCA5LjI0Mzc1MjZlLTEwLCA0LjczODMxNTFlLTEwLCAtNC40NzIwNDI4ZS0xMCwgMS43MTQwMjczZS0xMCwgLTUuMjQwNDg1NmUtMTEsIDEuNjg1MzI4ZS0xMCwgNi45Njc1NjY5OTk5OTk5OTllLTExLAorICAgICAgLTEuNDQ0MDIxZS0xMCwgNC40MDU1NDQzZS0xMSwgMy4wMjkwNDQ3ZS0xMSwgLTQuMTk1NTQ1OGUtMTEsIDMuNjA4NTk4ZS0xMSwgLTIuMjYxNDg4MWUtMTEsIC0yLjA1NTk1ODdlLTExLCAxLjIyMjgzMDhlLTExLAorICAgICAgLTIuNjY4ODI4MWUtMTIsIDIuMTAzNjMxNmUtMTIsIDEuODMxMDE0OWUtMTIsIC05Ljc1OTgwNDllLTEzLCAzLjAwNzMxOTZlLTE0LCAtMi40NjE2NjkxZS0xNCwgLTIuMTI1MDExNmUtMTQsIDEuMTE1MDQzNmUtMTQsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAwMTI3NDI0NzIsIDAuMDAwMjc0OTMxMTUsIC0wLjAwMTY1Njk5MDYsIDAuMDAyOTczNDk1NywgMC4wMDAyMDQxNDQ4OCwgLTAuMDA2NDkzMzk2NiwgMC4wMDMxNTkxMzA2LCAwLjAxODA1OTYxMSwKKyAgICAgIC0wLjAxNjY4OTgwNSwgLTAuMDI2NTI0NjY0LCAwLjAzNTQzODAxMywgMC4wNDI3MzY3NTMsIC0wLjA3MTE5MzczMywgLTAuMDM5OTY3ODg2LCAwLjExNjI1MzE1LCAwLjAyMDExODc5LAorICAgICAgLTAuMTY2MDMwMDksIDAuMDI1NDA5NDU3LCAwLjIxODY1Mjg1LCAtMC4xMjI1NjY1OSwgLTAuMjE2MDEzNzUsIDAuMjMzNDUzMTksIDAuMTMyNjEzNzcsIC0wLjI4NTQzNDMxLAorICAgICAgLTAuMDM3MTA2ODQ3LCAwLjMwMTA4NzA5LCAtMC4wNzAzNDEwNSwgLTAuMjg1OTY2MTQsIDAuMjMxMzg0OTksIDAuMTE1MzQ0MjQsIC0wLjI4NjY5NzY3LCAwLjE2MDczMDA5LAorICAgICAgMC4wNDY3NTA3MzQsIC0wLjE5NjkzMTc4LCAwLjIzOTQzMjYxLCAtMC4wOTkyODM4MDcsIC0wLjE2NjU5NDMzLCAwLjI5MDU5MDkyLCAtMC4xMzUzMzgxNSwgLTAuMTA4NDQyNDMsCisgICAgICAwLjE5MjgxMTU4LCAtMC4xMTc1NjkwMywgMC4wMTAzNDA5MzIsIDAuMDY3NjI2NjE0LCAtMC4xMDY5NTY3MiwgMC4wNzI2OTI5MSwgMC4wMTMxMDA4NTksIC0wLjA2NTgzODE4MSwKKyAgICAgIDAuMDQ2NzM1MjQ5LCAtMC4wMDgxMzgzNDgzMDAwMDAwMDEsIC0wLjAwNzA2ODA3MSwgMC4wMTAxMjgyNzgsIC0wLjAxMzcwODQ0NCwgMC4wMDg2OTgwMzk3LCAwLjAwNjcxNDExMiwgLTAuMDA0MzQ2NzU1MSwKKyAgICAgIDcuNjI1MDU4MmUtMTEsIC0yLjQyNjkyOTNlLTEwLCAtNC40NTAwMzA1ZS0xMCwgMS42NzM4Nzk4ZS0xMCwgLTEuNzI1NDUzNmUtMTEsIDguNjY2NTExMjAwMDAwMDAxZS0xMSwgLTguMjQ3MTI5OGUtMTEsIC0zLjUxNTI3MjZlLTExLAorICAgICAgNC45MDE1NDkyZS0xMSwgNi4yNjAwODI1ZS0xMiwgMS41ODc3ODA0ZS0xMSwgMS4xMTQ5ODc4ZS0xMSwgLTIuNDgxNjQ0NWUtMTEsIDEuNDE3MzEzMWUtMTEsIDEuMzE0NDk4MmUtMTEsIC04LjE4MDM3NzEwMDAwMDAwMWUtMTIsCisgICAgICAyLjM3MDg1NDJlLTEyLCAtMS44NjU2NTk2ZS0xMiwgLTEuNjI0NDgyNmUtMTIsIDguNjY0OTMxZS0xMywgLTIuNzg2Nzg1N2UtMTQsIDIuMjgxMTQzN2UtMTQsIDEuOTY5MTc4NGUtMTQsIC0xLjAzMzI3NTRlLTE0LAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wMDA0ODU0MzI1MSwgMC4wMDA2NzA1MDA0MSwgLTAuMDAwOTMwODQ2MDQ5OTk5OTk5OSwgLTAuMDAwODM5NDgyNTEsIDAuMDAxNDAyOTgxLCAwLjAwMDI2Mjk2Nzg2LCAtMC4wMDE4MTY4ODc3LCAwLjAwMjczODE0NjUsCisgICAgICAwLjAwMDAwNjU4ODI3NDYsIC0wLjAwNjU3MTAxNTUsIDAuMDAzMTk2Mjc2NiwgMC4wMTgxMjg2NjksIC0wLjAxNjY3NTA2NSwgLTAuMDI2NTc5MzI1LCAwLjAzNTM3MTM1OCwgMC4wNDI3MTc3LAorICAgICAgLTAuMDcxMTYzMzA1LCAtMC4wMzk5MzYwOTIsIDAuMTE2MjUxMjIsIDAuMDIwMDk5NjE5LCAtMC4xNjYwMjc2NywgMC4wMjU0NDA1OTQsIDAuMjE4Njc4MDUsIC0wLjEyMjU3NDUyLAorICAgICAgLTAuMjE2MDM4NTQsIDAuMjMzNDQzNCwgMC4xMzI2MjMwNywgLTAuMjg1NDI3NTMsIC0wLjAzNzExNDExNiwgMC4zMDEwODIyNywgLTAuMDcwMzMxNTY3LCAtMC4yODU5NTY5MSwKKyAgICAgIDAuMjMxMzgxMTksIDAuMTE1MzM2ODEsIC0wLjI4NjY5NTUyLCAwLjE2MDczNjQ5LCAwLjA0Njc1MDM2OSwgLTAuMTk2OTM2OTIsIDAuMjM5NDMxOTMsIC0wLjA5OTI4MDI5MzAwMDAwMDAxLAorICAgICAgLTAuMTY2NTkzNzUsIDAuMjkwNTg4MzcsIC0wLjEzNTMzOTIxLCAtMC4xMDg0NDEwOSwgMC4xOTI4MTIxLCAtMC4xMTc1Njk5MSwgMC4wMTAzNDA0MTUsIDAuMDY3NjI2OTE2LAorICAgICAgLTAuMTA2OTU2NTIsIDAuMDcyNjkyNzk1LCAwLjAxMzEwMDY5LCAtMC4wNjU4MzgxNTEsIDAuMDQ2NzM1MzA3LCAtMC4wMDgxMzgzNTMyLCAtMC4wMDcwNjgwODQxLCAwLjAxMDEyODI5MiwKKyAgICAgIC0wLjAxMzcwODQ2MywgMC4wMDg2OTgwNTI3LCAwLjAwNjcxNDEyMTYsIC0wLjAwNDM0Njc2MTQsIC0yLjEwMjcxMWUtMTEsIDMuMzQxNzIyNGUtMTEsIC0zLjg0MDkwODVlLTExLCAtMS43NDkwOTM1ZS0xMSwKKyAgICAgIDIuNzE2Njg1MmUtMTEsIC0xLjUyMTY4MzhlLTEyLCAyLjY3NTM5NTVlLTEyLCA2LjkwODM2NzFlLTEyLCAtMS4wODA5NTU4ZS0xMSwgNi4zMjcwMTgzZS0xMiwgNS44MzYyOTRlLTEyLCAtMy41ODg3MDU0ZS0xMiwKKyAgICAgIDkuNzMxMDk4NjAwMDAwMDAxZS0xMywgLTcuNjYwMTc1M2UtMTMsIC02LjY2OTQxNjllLTEzLCAzLjU1NjkzNDFlLTEzLCAtMS4xMzQwMzE4ZS0xNCwgOS4yODI0ODE1MDAwMDAwMDFlLTE1LCA4LjAxMjk4NDU5OTk5OTk5OWUtMTUsIC00LjIwNDY3NDJlLTE1LAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wMDAwODg3NDE2MzIwMDAwMDAwMSwgMC4wMDAxNzI1NTI2MSwgLTAuMDAwMjAzMzQ2ODgsIC0wLjAwMDQ4NTg5MDg0LCAwLjAwMDUxOTQxNDA3OTk5OTk5OTksIDAuMDAwNjUxNjIxODQsIC0wLjAwMTAwMzA5NTUsIC0wLjAwMDkzNTAwNDY2LAorICAgICAgMC4wMDEzMjI5MTM1LCAwLjAwMDIyNDIyNDg5LCAtMC4wMDE4MTEwNjI1LCAwLjAwMjc2NjAzNiwgMC4wMDAwMTkyMTYzMDYsIC0wLjAwNjU5MjY2MDUsIDAuMDAzMTYyNDY0MiwgMC4wMTgxMTk0NzcsCisgICAgICAtMC4wMTY2NTUzMTgsIC0wLjAyNjU2MTg5OSwgMC4wMzUzNjYwNDgsIDAuMDQyNzA1Nzk5LCAtMC4wNzExNTkwNDEwMDAwMDAwMSwgLTAuMDM5OTE5OTYyLCAwLjExNjI1ODMzLCAwLjAyMDA5MjQ3MSwKKyAgICAgIC0wLjE2NjAzNTcyLCAwLjAyNTQ0MDMyOCwgMC4yMTg2ODA1NiwgLTAuMTIyNTc1MTgsIC0wLjIxNjA0MDksIDAuMjMzNDQ0MTIsIDAuMTMyNjI2NDYsIC0wLjI4NTQyNjE0LAorICAgICAgLTAuMDM3MTE1NSwgMC4zMDEwODEsIC0wLjA3MDMzMDUzMiwgLTAuMjg1OTU1MjksIDAuMjMxMzgwODYsIDAuMTE1MzM1MzYsIC0wLjI4NjY5NTM0LCAwLjE2MDczNzU2LAorICAgICAgMC4wNDY3NTAzNDMsIC0wLjE5NjkzNzY1LCAwLjIzOTQzMTY1LCAtMC4wOTkyNzk4NzgsIC0wLjE2NjU5MzUzLCAwLjI5MDU4ODAxLCAtMC4xMzUzMzk0LCAtMC4xMDg0NDA5NSwKKyAgICAgIDAuMTkyODEyMTYsIC0wLjExNzU2OTk2LCAwLjAxMDM0MDM1MiwgMC4wNjc2MjY5MTQsIC0wLjEwNjk1NjQ5LCAwLjA3MjY5Mjc5NiwgMC4wMTMxMDA2NzgsIC0wLjA2NTgzODE1LAorICAgICAgMC4wNDY3MzUzMDMsIC0wLjAwODEzODM0NjQsIC0wLjAwNzA2ODA3OTIsIDAuMDEwMTI4MjksIC0wLjAxMzcwODQ2NSwgMC4wMDg2OTgwNTQ0LCAwLjAwNjcxNDEyMywgLTAuMDA0MzQ2NzYyMywKKyAgICAgIDQuMTY5MjUxNmUtMTIsIC03LjEyMTQ1NmUtMTMsIC0xLjczMDQwNDRlLTEzLCAxLjEzMDIxNzFlLTEyLCAtMS4zNzc5OGUtMTIsIDguMjQ0NjI2N2UtMTMsIDcuNTY5MDA2ZS0xMywgLTQuNjA0NTcwOGUtMTMsCisgICAgICAxLjE3MTA0ODhlLTEzLCAtOS4yMjE3ODczZS0xNCwgLTguMDI4Mzk5NzAwMDAwMDAxZS0xNCwgNC4yODA5OTA2ZS0xNCwgLTEuMzUzNTQ3MmUtMTUsIDEuMTA3NDA3NmUtMTUsIDkuNTU5NzQ4NDk5OTk5OTk5ZS0xNiwgLTUuMDE3ODAxMmUtMTYsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyA0LjkxODY0NzFlLTcsIDAuMDAwMDA1MTQ2MTU4NiwgLTAuMDAwMDA1MjczNTg4OSwgLTAuMDAwMDc0NjE3NzE1LCAwLjAwMDA5MDMzODIzNSwgMC4wMDAxNjgyOTkxNCwgLTAuMDAwMjEzMTk1ODcsIC0wLjAwMDQ5NzYzNzI1LAorICAgICAgMC4wMDA1MDk1MTc5MSwgMC4wMDA2NDU3OTk1NywgLTAuMDAxMDAzNjc5MSwgLTAuMDAwOTMxNTkzNCwgMC4wMDEzMjU0Njk5LCAwLjAwMDIyMTgzMzc1LCAtMC4wMDE4MTYwMjQ4LCAwLjAwMjc2NDU4MTcsCisgICAgICAwLjAwMDAyMjQzMTA5OCwgLTAuMDA2NTg5OTQ3NCwgMC4wMDMxNjEzMTMxLCAwLjAxODExNzQ5LCAtMC4wMTY2NTQ0NDMsIC0wLjAyNjU1OTQ2NywgMC4wMzUzNjY2MzEsIDAuMDQyNzA0NDk3LAorICAgICAgLTAuMDcxMTU5ODM0MDAwMDAwMDEsIC0wLjAzOTkxOTYyNSwgMC4xMTYyNTg0OSwgMC4wMjAwOTIwNDUsIC0wLjE2NjAzNTkzLCAwLjAyNTQ0MDY4NiwgMC4yMTg2ODA5MiwgLTAuMTIyNTc1MjUsCisgICAgICAtMC4yMTYwNDEwNiwgMC4yMzM0NDQxNSwgMC4xMzI2MjY2MSwgLTAuMjg1NDI2MDcsIC0wLjAzNzExNTU1OSwgMC4zMDEwODA5MSwgLTAuMDcwMzMwNDgsIC0wLjI4NTk1NTE5LAorICAgICAgMC4yMzEzODA4NCwgMC4xMTUzMzUzLCAtMC4yODY2OTUzNSwgMC4xNjA3Mzc2MSwgMC4wNDY3NTAzNTgsIC0wLjE5NjkzNzY4LCAwLjIzOTQzMTYzLCAtMC4wOTkyNzk4NjIsCisgICAgICAtMC4xNjY1OTM1MiwgMC4yOTA1ODgsIC0wLjEzNTMzOTQxLCAtMC4xMDg0NDA5NCwgMC4xOTI4MTIxNiwgLTAuMTE3NTY5OTYsIDAuMDEwMzQwMzUxLCAwLjA2NzYyNjkxMywKKyAgICAgIC0wLjEwNjk1NjQ5LCAwLjA3MjY5Mjc5NiwgMC4wMTMxMDA2NzgsIC0wLjA2NTgzODE1LCAwLjA0NjczNTMwMywgLTAuMDA4MTM4MzQ1OTk5OTk5OTk5LCAtMC4wMDcwNjgwNzg5LCAwLjAxMDEyODI4OSwKKyAgICAgIC0wLjAxMzcwODQ2NSwgMC4wMDg2OTgwNTQ0LCAwLjAwNjcxNDEyMywgLTAuMDA0MzQ2NzYyMywgMi4zMzc2OTQ2ZS0xMywgLTEuMzQzMjAyMWUtMTMsIC0xLjI0NDA0MTZlLTEzLCA3LjcxOTkzMzVlLTE0LAorICAgICAgLTIuMjAyODM0NGUtMTQsIDEuNzM0MzQ0OGUtMTQsIDEuNTEwMDQ5NmUtMTQsIC04LjA1MTc4NGUtMTUsIDIuNjAyMzUwOWUtMTYsIC0yLjEyNzQzMDFlLTE2LCAtMS44MzU0NzgyZS0xNiwgOS42NDAzMjE1OTk5OTk5OTllLTE3LAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMDAwMDA0MDkzNzM1OCwgLTAuMDAwMDA1NTU4NTMxNywgMC4wMDAwMDc2MDgyODExLCAwLjAwMDAwODUxOTcyNjMsIC02LjUyNDQyNjNlLTcsIDAuMDAwMDA1Mjk1MDAxNiwgLTAuMDAwMDAzNzcxMzEwOCwgLTAuMDAwMDcyNDM5Mzc0OTk5OTk5OTksCisgICAgICAwLjAwMDA5MjE2OTAzMSwgMC4wMDAxNjkwNDk0NiwgLTAuMDAwMjEzNTAyMzUsIC0wLjAwMDQ5ODI3OTUzLCAwLjAwMDUwOTM1MTg4LCAwLjAwMDY0NjMwNTExLCAtMC4wMDEwMDMwMzI2LCAtMC4wMDA5MzE0MTM5MywKKyAgICAgIDAuMDAxMzI1MTU0NiwgMC4wMDAyMjE1MjI2NSwgLTAuMDAxODE1OTg0NCwgMC4wMDI3NjQ3NzcyLCAwLjAwMDAyMjM5MzQ4MiwgLTAuMDA2NTkwMjUyNCwgMC4wMDMxNjEwOTIyLCAwLjAxODExNzU4MywKKyAgICAgIC0wLjAxNjY1NDIyMSwgLTAuMDI2NTU5Mzk3LCAwLjAzNTM2NjU0OSwgMC4wNDI3MDQ0NTQsIC0wLjA3MTE1OTc2OCwgLTAuMDM5OTE5NTk4LCAwLjExNjI1ODQxLCAwLjAyMDA5MTk3NiwKKyAgICAgIC0wLjE2NjAzNTksIDAuMDI1NDQwNzQyLCAwLjIxODY4MDksIC0wLjEyMjU3NTMsIC0wLjIxNjA0MTA2LCAwLjIzMzQ0NDE5LCAwLjEzMjYyNjYyLCAtMC4yODU0MjYxLAorICAgICAgLTAuMDM3MTE1NTYyLCAwLjMwMTA4MDkzLCAtMC4wNzAzMzA0NzEwMDAwMDAwMSwgLTAuMjg1OTU1MiwgMC4yMzEzODA4NCwgMC4xMTUzMzUzLCAtMC4yODY2OTUzNSwgMC4xNjA3Mzc2LAorICAgICAgMC4wNDY3NTAzNTcsIC0wLjE5NjkzNzY4LCAwLjIzOTQzMTYzLCAtMC4wOTkyNzk4NjIsIC0wLjE2NjU5MzUyLCAwLjI5MDU4OCwgLTAuMTM1MzM5NDEsIC0wLjEwODQ0MDk0LAorICAgICAgMC4xOTI4MTIxNiwgLTAuMTE3NTY5OTYsIDAuMDEwMzQwMzUxLCAwLjA2NzYyNjkxMywgLTAuMTA2OTU2NDksIDAuMDcyNjkyNzk2LCAwLjAxMzEwMDY3OCwgLTAuMDY1ODM4MTUsCisgICAgICAwLjA0NjczNTMwMywgLTAuMDA4MTM4MzQ1OTk5OTk5OTk5LCAtMC4wMDcwNjgwNzg5LCAwLjAxMDEyODI4OSwgLTAuMDEzNzA4NDY1LCAwLjAwODY5ODA1NDQsIDAuMDA2NzE0MTIzLCAtMC4wMDQzNDY3NjIzLAorICAgICAgLTguMTMxMzU1ZS0xNSwgNi4zNzg5MzllLTE1LCA1LjU1NjQzZS0xNSwgLTIuOTY4NzkwNWUtMTUsIDkuNDc3NzYyMmUtMTcsIC03LjQ5MTc1NGUtMTcsIC02LjUyMTc4MTJlLTE3LCAzLjQ5Mjg0OTdlLTE3LAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTcuNjkxNDkwNGUtNywgLTAuMDAwMDAxMzg3Mjc2NiwgMC4wMDAwMDE4NzE3OTA2LCAwLjAwMDAwMzk2MDE1NzEsIC0wLjAwMDAwNDM4NDI3MzUsIC0wLjAwMDAwNTQwMTU2NzcsIDAuMDAwMDA4MjE4MzA1MDk5OTk5OTk5LCAwLjAwMDAwOTMzMDMxNDA5OTk5OTk5OSwKKyAgICAgIDMuMDkxNjY1NWUtOCwgMC4wMDAwMDU2MjkyMzMzLCAtMC4wMDAwMDM4MTY5MTE0LCAtMC4wMDAwNzI2NzYzNjksIDAuMDAwMDkyMDU1ODQzLCAwLjAwMDE2OTIyMzY4LCAtMC4wMDAyMTMyMjExOSwgLTAuMDAwNDk4MTk4NSwKKyAgICAgIDAuMDAwNTA5MTkxNzMsIDAuMDAwNjQ2MTYwMjksIC0wLjAwMTAwMjk5LCAtMC4wMDA5MzEzMTQyLCAwLjAwMTMyNTEyMDgsIDAuMDAwMjIxMzg2MjcsIC0wLjAwMTgxNjA0ODYsIDAuMDAyNzY0ODM1MiwKKyAgICAgIDAuMDAwMDIyNDY0MjM2LCAtMC4wMDY1OTAyNDcyLCAwLjAwMzE2MTA2OTksIDAuMDE4MTE3NTg3LCAtMC4wMTY2NTQyLCAtMC4wMjY1NTk0MDIsIDAuMDM1MzY2NTIsIDAuMDQyNzA0NDQxLAorICAgICAgLTAuMDcxMTU5NzU3LCAtMC4wMzk5MTk1ODcsIDAuMTE2MjU4NCwgMC4wMjAwOTE5NjMsIC0wLjE2NjAzNTksIDAuMDI1NDQwNzU0LCAwLjIxODY4MDksIC0wLjEyMjU3NTMxLAorICAgICAgLTAuMjE2MDQxMDYsIDAuMjMzNDQ0MiwgMC4xMzI2MjY2MiwgLTAuMjg1NDI2MSwgLTAuMDM3MTE1NTYzLCAwLjMwMTA4MDkzLCAtMC4wNzAzMzA0NjkwMDAwMDAwMSwgLTAuMjg1OTU1MjEsCisgICAgICAwLjIzMTM4MDgzLCAwLjExNTMzNTMsIC0wLjI4NjY5NTM1LCAwLjE2MDczNzYsIDAuMDQ2NzUwMzU2LCAtMC4xOTY5Mzc2OCwgMC4yMzk0MzE2MywgLTAuMDk5Mjc5ODYyLAorICAgICAgLTAuMTY2NTkzNTIsIDAuMjkwNTg4LCAtMC4xMzUzMzk0MSwgLTAuMTA4NDQwOTQsIDAuMTkyODEyMTYsIC0wLjExNzU2OTk2LCAwLjAxMDM0MDM1MSwgMC4wNjc2MjY5MTMsCisgICAgICAtMC4xMDY5NTY0OSwgMC4wNzI2OTI3OTYsIDAuMDEzMTAwNjc4LCAtMC4wNjU4MzgxNSwgMC4wNDY3MzUzMDMsIC0wLjAwODEzODM0NTk5OTk5OTk5OSwgLTAuMDA3MDY4MDc4OSwgMC4wMTAxMjgyODksCisgICAgICAtMC4wMTM3MDg0NjUsIDAuMDA4Njk4MDU0NCwgMC4wMDY3MTQxMjMsIC0wLjAwNDM0Njc2MjMsIDkuNzY0ODcwODk5OTk5OTk5ZS0xOCwgLTEuNDcxODAxOWUtMTcsIC0xLjEzNDYyNDRlLTE3LCA0LjE2NTg4MzNlLTE4LAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTEuMDIwODU3M2UtNywgMS4zMDE4MTg2ZS04LCAxLjE5NDgxNGUtNywgNS41NTg4NzY3ZS03LCAtNy43ODMyNzgzZS03LCAtMC4wMDAwMDEzNDc5NjgsIDAuMDAwMDAxOTU3MzUyNiwgMC4wMDAwMDQwNjE5NTAzLAorICAgICAgLTAuMDAwMDA0Mjk3MDg4MywgLTAuMDAwMDA1MzQ4NjA5OSwgMC4wMDAwMDgyMjUyOTEyOTk5OTk5OTksIDAuMDAwMDA5MzAwNDgxNTk5OTk5OTk5LCA1LjY2MjMwODZlLTksIDAuMDAwMDA1NjQ1OTMyOSwgLTAuMDAwMDAzNzc0OTUwNSwgLTAuMDAwMDcyNjYwMzc0LAorICAgICAgMC4wMDAwOTIwMzE4OTUsIDAuMDAwMTY5MjAwMTIsIC0wLjAwMDIxMzIxMzcyLCAtMC4wMDA0OTgxODE0MywgMC4wMDA1MDkxODYzOSwgMC4wMDA2NDYxMzkyMjk5OTk5OTk5LCAtMC4wMDEwMDI5OTgyLCAtMC4wMDA5MzEzMDQ3MywKKyAgICAgIDAuMDAxMzI1MTI5NywgMC4wMDAyMjEzODU2NywgLTAuMDAxODE2MDUwOSwgMC4wMDI3NjQ4MzcsIDAuMDAwMDIyNDY2MzIyLCAtMC4wMDY1OTAyNDg5LCAwLjAwMzE2MTA2NjcsIDAuMDE4MTE3NTg2LAorICAgICAgLTAuMDE2NjU0MTk5LCAtMC4wMjY1NTk0MDEsIDAuMDM1MzY2NTE5LCAwLjA0MjcwNDQ0LCAtMC4wNzExNTk3NTYsIC0wLjAzOTkxOTU4NiwgMC4xMTYyNTg0LCAwLjAyMDA5MTk2MiwKKyAgICAgIC0wLjE2NjAzNTksIDAuMDI1NDQwNzU1LCAwLjIxODY4MDksIC0wLjEyMjU3NTMxLCAtMC4yMTYwNDEwNiwgMC4yMzM0NDQyLCAwLjEzMjYyNjYyLCAtMC4yODU0MjYxLAorICAgICAgLTAuMDM3MTE1NTYzLCAwLjMwMTA4MDkzLCAtMC4wNzAzMzA0NjkwMDAwMDAwMSwgLTAuMjg1OTU1MjEsIDAuMjMxMzgwODMsIDAuMTE1MzM1MywgLTAuMjg2Njk1MzUsIDAuMTYwNzM3NiwKKyAgICAgIDAuMDQ2NzUwMzU2LCAtMC4xOTY5Mzc2OCwgMC4yMzk0MzE2MywgLTAuMDk5Mjc5ODYyLCAtMC4xNjY1OTM1MiwgMC4yOTA1ODgsIC0wLjEzNTMzOTQxLCAtMC4xMDg0NDA5NCwKKyAgICAgIDAuMTkyODEyMTYsIC0wLjExNzU2OTk2LCAwLjAxMDM0MDM1MSwgMC4wNjc2MjY5MTMsIC0wLjEwNjk1NjQ5LCAwLjA3MjY5Mjc5NiwgMC4wMTMxMDA2NzgsIC0wLjA2NTgzODE1LAorICAgICAgMC4wNDY3MzUzMDMsIC0wLjAwODEzODM0NTk5OTk5OTk5OSwgLTAuMDA3MDY4MDc4OSwgMC4wMTAxMjgyODksIC0wLjAxMzcwODQ2NSwgMC4wMDg2OTgwNTQ0LCAwLjAwNjcxNDEyMywgLTAuMDA0MzQ2NzYyMywKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMCwgMC4wLCAwLjAsIDAuMCwgMi41NzU5NjUzZS04LCAyLjA0NjY4MTRlLTgsIC00LjQyODU0NzZlLTgsIC0xLjA4Njg4MjVlLTcsCisgICAgICAtOS42NDQ3NjQ2ZS04LCA3LjE2MzExMDFlLTksIDEuMDIxNzgwNmUtNywgNS4zMzcyOTg0ZS03LCAtNy45Njk3MTMyZS03LCAtMC4wMDAwMDEzNTc3NjIxLCAwLjAwMDAwMTk1NzI4NDQsIDAuMDAwMDA0MDY4MDU0NiwKKyAgICAgIC0wLjAwMDAwNDI5Mjg1OTUsIC0wLjAwMDAwNTM1Mjc0NTEsIDAuMDAwMDA4MjE3MDU2MTk5OTk5OTk5LCAwLjAwMDAwOTI5ODcyNDksIDguNzcxMDY5NmUtOSwgMC4wMDAwMDU2NDcwMTE5LCAtMC4wMDAwMDM3NzI1ODQ3LCAtMC4wMDAwNzI2NTExNSwKKyAgICAgIDAuMDAwMDkyMDI1MTExLCAwLjAwMDE2OTE5MDAxLCAtMC4wMDAyMTMxOTUxOSwgLTAuMDAwNDk4MTcxNCwgMC4wMDA1MDkxNjA4MywgMC4wMDA2NDYxNDQxOSwgLTAuMDAxMDAyOTcxNSwgLTAuMDAwOTMxMzc5NTcsCisgICAgICAwLjAwMTMyNTExMzYsIDAuMDAwMjIxNTA3NTcsIC0wLjAwMTgxNjA3NiwgMC4wMDI3NjQ2MTk4LCAwLjAwMDAyMjU1MTQ4NSwgLTAuMDA2NTkwMTExOCwgMC4wMDMxNjA5MTA1LCAwLjAxODExODAzNywKKyAgICAgIC0wLjAxNjY1MzYxLCAtMC4wMjY1NTk4MjQsIDAuMDM1MzY1NzIsIDAuMDQyNzA0NTIxLCAtMC4wNzExNTk4MjMsIC0wLjAzOTkxOTg5OCwgMC4xMTYyNTg3NSwgMC4wMjAwODk2ODQsCisgICAgICAtMC4xNjYwMzAzNiwgMC4wMjU0NDg5NDQsIDAuMjE4NjcwNjcsIC0wLjEyMjYwMTY1LCAtMC4yMTYwMTg5OCwgMC4yMzM0NzU1NiwgMC4xMzI1ODA0OCwgLTAuMjg1NDQ2OTEsCisgICAgICAtMC4wMzcwMTM2MjEsIDAuMzAxMDk5MDUsIC0wLjA3MDQ5MTAzLCAtMC4yODU5OTU0NCwgMC4yMzE1NDMyNiwgMC4xMTUyOTgwNSwgLTAuMjg2ODY3ODEsIDAuMTYwOTM1MDEsCisgICAgICAwLjA0NzAzNjU0NCwgLTAuMTk3MDg3MzQsIDAuMjM5MTEwMywgLTAuMDk5MzI0OTQxLCAtMC4xNjY0NDAyMSwgMC4yOTA0OTY3NywgLTAuMTM1NTI3NjgsIC0wLjEwNzk2NTg4LAorICAgICAgMC4xOTM0NTcsIC0wLjExODAzNTMxLCAwLjAwOTIyMzE4MjEsIDAuMDY3NDk3NiwgLTAuMTA1OTI1MjEsIDAuMDczMzEyNDYzOTk5OTk5OTksIDAuMDEyNTM2ODU5LCAtMC4wNjYzMzYyNzYsCisgICAgICAwLjA0NzEyNjA0NSwgLTAuMDA4MTE0NDgzNSwgLTAuMDA4NjM5MTAwNiwgMC4wMDc2ODQ2ODM5LCB9LAorICAgIHsgMC4wLCAwLjAsIDAuMCwgMC4wLCAtMi4zMTA5NjdlLTEzLCAtMS44MzYxMzIzZS0xMywgMy45NzI5Njc4ZS0xMywgOS43NTA3MTE3OTk5OTk5OTllLTEzLAorICAgICAgMi41NzM1OTM1ZS04LCAyLjA0NDcyMTdlLTgsIC00LjQyNDQxM2UtOCwgLTEuMDg1ODkzMWUtNywgLTkuNjMyMzIxN2UtOCwgNy4xODg1MDU5ZS05LCAxLjAyMDE5NmUtNywgNS4zMzA3NzUxZS03LAorICAgICAgLTcuOTU4NjIxNmUtNywgLTAuMDAwMDAxMzU2MDg5OCwgMC4wMDAwMDE5NTQ3NDc0LCAwLjAwMDAwNDA2MjkwNDgsIC0wLjAwMDAwNDI5MTU0MTcsIC0wLjAwMDAwNTM0OTI4OTMsIDAuMDAwMDA4MjEzNjAxNzk5OTk5OTk5LCAwLjAwMDAwOTMwNDkxMDQsCisgICAgICAtMS43MjQ2NTM2ZS04LCAwLjAwMDAwNTYwNTI0MTMsIC0wLjAwMDAwMzcxMjU0MSwgLTAuMDAwMDcyNDcxMDI3MDAwMDAwMDEsIDAuMDAwMDkxOTI3MiwgMC4wMDAxNjg5NzM1OCwgLTAuMDAwMjEyOTQ5NDMsIC0wLjAwMDQ5NzkzNzcsCisgICAgICAwLjAwMDUwODkwOTgyLCAwLjAwMDY0NjI1NzI3LCAtMC4wMDEwMDI4MDU5LCAtMC4wMDA5MzI4Nzg5NiwgMC4wMDEzMjU5NDExLCAwLjAwMDIyNDUwOTc0LCAtMC4wMDE4MTg1MDc3LCAwLjAwMjc1NjUzMjcsCisgICAgICAwLjAwMDAyODUyOTk0NSwgLTAuMDA2NTgxNTI4NCwgMC4wMDMxNDkxNDA0LCAwLjAxODExNTA2MiwgLTAuMDE2NjM0ODc2LCAtMC4wMjY1NjU4NzQsIDAuMDM1MzQyMzEyLCAwLjA0Mjc0MzIxOSwKKyAgICAgIC0wLjA3MTE1ODk0LCAtMC4wMzk5OTIwOSwgMC4xMTYyODcyNywgMC4wMjAyMjQxNzgsIC0wLjE2NjEyNjQyLCAwLjAyNTMxMjEzMiwgMC4yMTg4OTUxNiwgLTAuMTIyNjI2NTgsCisgICAgICAtMC4yMTY0MjA4MywgMC4yMzM1ODY5MiwgMC4xMzMwNzMzLCAtMC4yODU0NDcxNywgLTAuMDM3MDgwNzIzLCAwLjMwMTU5MjQxLCAtMC4wNzA4MTA5NjUsIC0wLjI4NzUyODg5LAorICAgICAgMC4yMzEwODEwMSwgMC4xMTU2OTgxMSwgLTAuMjg2MzU5MTcsIDAuMTYzNDIzMDgsIDAuMDQ5MDc3NjgxLCAtMC4xOTc4MzQzOCwgMC4yMzY3NDUzNCwgLTAuMTAzODIzMjEsCisgICAgICAtMC4xNjk3OTc2MywgMC4yOTI3OTkxMiwgLTAuMTI5MjE2NDYsIC0wLjEwMTE1NTA0LCAwLjE5NTA0MTU0LCAtMC4xMjUyMDA2LCAtMC4wMDA1MDYxOTQwNiwgMC4wNjI2Mjc2OTQsCisgICAgICAtMC4xMDM4NjQxLCAwLjA4MTI1NDM5MSwgMC4wMjU2OTcyMzIsIC0wLjA0NTgzMDIwNywgfSwKKyAgICB7IDAuMCwgMC4wLCAwLjAsIDAuMCwgNy45NTkzMzc3ZS0xMywgNi4zMjM5MzE1ZS0xMywgLTEuMzY4MzUzM2UtMTIsIC0zLjM1ODMwMDJlLTEyLAorICAgICAgLTYuNzUzNTA2NDk5OTk5OTk5ZS0xMSwgLTUuMTA2OTUzMWUtMTEsIDEuMTQxMzg3NmUtMTAsIDIuODg4Njk2M2UtMTAsIDIuNjEzMDcwNGUtOCwgMi4wNTI5MjQ2ZS04LCAtNC40NzQ1NzdlLTgsIC0xLjEwNTQ5NzdlLTcsCisgICAgICAtOS42MTYwMTk4ZS04LCA5LjY0ODA5NzA5OTk5OTk5OWUtOSwgOS45ODU3OTY2ZS04LCA1LjMxMjM0Nzc5OTk5OTk5OWUtNywgLTcuODQzNzEzNmUtNywgLTAuMDAwMDAxMzUwMjk2LCAwLjAwMDAwMTkzOTM5MDksIDAuMDAwMDA0MDM0MDI3NywKKyAgICAgIC0wLjAwMDAwNDI3NTY2MzMsIC0wLjAwMDAwNTMyNDQxMDgsIDAuMDAwMDA4MTcwMzQyNSwgMC4wMDAwMDkzMzg3MzE4LCAtMS41OTU1NTU0ZS03LCAwLjAwMDAwNTM3MzA1MTksIC0wLjAwMDAwMzM4ODAxMDYsIC0wLjAwMDA3MTU0Mzk1MSwKKyAgICAgIDAuMDAwMDkwOTQ4Mjg2MDAwMDAwMDEsIDAuMDAwMTY3NDI0MDUsIC0wLjAwMDIxMDc1MzE5LCAtMC4wMDA0OTQ0ODQxNDk5OTk5OTk5LCAwLjAwMDUwNTcyMzY5LCAwLjAwMDY0MzczMjM0LCAtMC4wMDA5OTc2NzE4MywgLTAuMDAwOTM1MTcyNTcsCisgICAgICAwLjAwMTMyMjYwMTcsIDAuMDAwMjM1Nzk2MTYsIC0wLjAwMTgyMDI3NDksIDAuMDAyNzEyODUwMSwgMC4wMDAwNTE5OTA4NSwgLTAuMDA2NTE3NzI3MSwgMC4wMDMwODg5NTM5LCAwLjAxODAxNzM4MSwKKyAgICAgIC0wLjAxNjQ4MjgxNiwgLTAuMDI2NDc0MzkyLCAwLjAzNTEwNTExMywgMC4wNDI3MDc0NTcsIC0wLjA3MDg3MTU5NiwgLTAuMDQwMDcxNjkzLCAwLjExNTgyMjA4LCAwLjAyMDgwOTQ5NSwKKyAgICAgIC0wLjE2NTcxNjg0LCAwLjAyNDM5MTM5NSwgMC4yMTkxMzgyOCwgLTAuMTIyNTExNiwgLTAuMjE3MDE3NCwgMC4yMzM5MDUwOCwgMC4xMzMzNDk5NCwgLTAuMjg1MDczMzMsCisgICAgICAtMC4wMzczMzMzMTksIDAuMzAyNjg1MTIsIC0wLjA3MTA0MDU2MSwgLTAuMjkxODkxMTUsIDAuMjM0NTkzMDksIDAuMTE4MTQzNjIsIC0wLjI5MzY2NzcxLCAwLjE2ODE5OSwKKyAgICAgIDAuMDU1MTQ0NTc5LCAtMC4yMDUxNzQwOCwgMC4yMzQwNjc5OCwgLTAuMTAzNjk0MTcsIC0wLjE2NTkyNDc1LCAwLjMwMDI0NDIyLCAtMC4xMzY2NTMyMiwgLTAuMTA3MTI3ODcsCisgICAgICAwLjIwMzM2NjI4LCAtMC4xMjMwNDQ3OCwgLTAuMDEyNzg3NjkxLCAwLjAzNDc1ODI3MSwgfSwKKyAgICB7IDAuMCwgMC4wLCAwLjAsIDAuMCwgLTEuMjc0ODIyMWUtMTIsIC0xLjAxMjg4NDJlLTEyLCAyLjE5MTY0ODRlLTEyLCA1LjM3ODg4MzdlLTEyLAorICAgICAgMS4wOTIxOTg1ZS0xMCwgOC4yNjMxNTU2ZS0xMSwgLTEuODQ2MTk0MmUtMTAsIC00LjY3MTA4MTRlLTEwLCAtMS4yMTU3OTQ3ZS05LCAtNS45MDM3MzA5ZS0xMCwgMS44MDMxMDI4ZS05LCA1LjYwODk5NTZlLTksCisgICAgICAyLjg4MTYwNzZlLTgsIDEuNzI0MjQ4MWUtOCwgLTQuNTA2NjAyMmUtOCwgLTEuMjI1NDEzN2UtNywgLTEuMDIxMjczNmUtNywgMi44MDQxNzk0ZS04LCA4Ljg4MDkxNzNlLTgsIDUuMTU4NjNlLTcsCisgICAgICAtNy42NzAzNTc0ZS03LCAtMC4wMDAwMDEzNDQ4MzAyLCAwLjAwMDAwMTk0MDc3MjMsIDAuMDAwMDA0MDA0Njc1OCwgLTAuMDAwMDA0MTYzMTI0MywgLTAuMDAwMDA1Mjc2MTU5OSwgMC4wMDAwMDc5OTAwMTQsIDAuMDAwMDA5NDAyNTQ3NywKKyAgICAgIC0zLjcyMzY0NjFlLTcsIDAuMDAwMDA1MDkxMjIxMiwgLTAuMDAwMDAzMTgxNjA4MSwgLTAuMDAwMDcwNDk3ODk2LCAwLjAwMDA5MDA1NjE3LCAwLjAwMDE2NTQzNDA0LCAtMC4wMDAyMDc4MTMxNCwgLTAuMDAwNDkxNDA2OTIsCisgICAgICAwLjAwMDUwMzg4NzUzLCAwLjAwMDY0MzY2NTg2LCAtMC4wMDA5OTU2ODk2NDk5OTk5OTk5LCAtMC4wMDA5NDE4ODk5NywgMC4wMDEzMjY0ODQ1LCAwLjAwMDI1MzM3MTA4LCAtMC4wMDE4MzU3Njg2LCAwLjAwMjY0MzQ0NTQsCisgICAgICAwLjAwMDEwNDMxMjE5LCAtMC4wMDY0MDk0MzU3LCAwLjAwMjk0NTk0MjYsIDAuMDE3ODg4NjY1LCAtMC4wMTYyMDgzNDgsIC0wLjAyNjQ1MzQ1MiwgMC4wMzQ5MDAxMzUsIDAuMDQyNjM5NzQ5LAorICAgICAgLTAuMDcwOTI1MjYzLCAtMC4wNDAyNzI2NywgMC4xMTUzMzIwMSwgMC4wMjM4ODIzMzEsIC0wLjE2NTYxNzM0LCAwLjAyMDUxODcwNSwgMC4yMjI0Nzc0NywgLTAuMTIzNDA0ODcsCisgICAgICAtMC4yMjQxNjM5LCAwLjIzNDAwODI3LCAwLjE0MTE5OTk3LCAtMC4yNzc0NTI5LCAtMC4wNDU0NTM5NDQsIDAuMzA1Nzg5MzEsIC0wLjA2MDgxMTU4NywgLTAuMzIxMjA1NjYsCisgICAgICAwLjIyNjI5NDU4LCAwLjE0MTQzOTA5LCAtMC4yOTMyOTI2LCAwLjE4OTAxODc2LCAwLjA1OTI2ODEyMSwgLTAuMjQxMTcyMjksIDAuMjM2NjcxMDIsIC0wLjEwOTMyOTYyLAorICAgICAgLTAuMTg0NjkxNTgsIDAuMzMwMzgxNjksIC0wLjA5ODYxMTQ5MiwgLTAuMDUwNTI3NjE3LCB9LAorICAgIHsgMC4wLCAwLjAsIDAuMCwgMC4wLCAtMS4xOTU3ODk1ZS0yMywgLTkuNDIyMjMxM2UtMjQsIDIuMDYwODE3MmUtMjMsIDUuMDIyMDEwOWUtMjMsCisgICAgICAxLjA0OTE5NTNlLTIyLCA0LjMxNDAyMWUtMjMsIC0xLjUwMTY3ODNlLTIyLCAtNC45ODI0NjQxZS0yMiwgMS40NDIyMzRlLTIyLCA2LjQ0MzkzNDFlLTIyLCAtNi42MDQ5MTE2ZS0yMiwgLTYuMjg1MjcxNGUtMjIsCisgICAgICA3LjczMDY0MzNlLTIyLCAtMS43MTUzNDMyZS0yMiwgLTMuNjcwMzAzMWUtMjIsIDIuMzk5ODcyNmUtMjEsIDIuMzc4NzUxOGUtOCwgMS44ODk5ODkzZS04LCAtNC4wODk1MDJlLTgsIC0xLjAwMzY3MThlLTcsCisgICAgICAtOS4xMzgxMDI4ZS04LCA0Ljc3MzUyNGUtOSwgOS44MzM5Mjk3ZS04LCA1LjAyNjQ1NTFlLTcsIC02LjY3ODcyMDllLTcsIC0wLjAwMDAwMTIwNzI1NjQsIDAuMDAwMDAxNjk2MTEyNSwgMC4wMDAwMDM0NTc5MzQ5LAorICAgICAgLTAuMDAwMDA0MzAxMTA3NiwgLTAuMDAwMDA0OTUyMTk5MSwgMC4wMDAwMDc5Njc1OTY0LCAwLjAwMDAxMDIzNzI3OCwgLTYuMTg2NjY5OWUtNywgMC4wMDAwMDI2MTQ4MzY1LCAtNi42NzUzNzA5ZS03LCAtMC4wMDAwNjI5NDExNTEsCisgICAgICAwLjAwMDA4MDkxMzg5ODAwMDAwMDAxLCAwLjAwMDE1MzY3MzQyLCAtMC4wMDAxOTIxNzQ4NSwgLTAuMDAwNDYxMTM5ODksIDAuMDAwNDcyMzgyODgsIDAuMDAwNjE1MDI5NDMsIC0wLjAwMDkzODE5MTc5LCAtMC4wMDA5NTcwMTEwMSwKKyAgICAgIDAuMDAxMzExMjUzMSwgMC4wMDAzNjA3MDYzNywgLTAuMDAxODYzMTA5MywgMC4wMDIyNDUxODAxLCAwLjAwMDM1NDYzODMzLCAtMC4wMDU3OTU4Njg3LCAwLjAwMjMwODYxNTYsIDAuMDE2NzU3MTE1LAorICAgICAgLTAuMDE0ODA3MTM0LCAtMC4wMjUyODE1MDUsIDAuMDMyMjg4MTA3LCAwLjA0MjM1MDgzMiwgLTAuMDY2MjMyODA0MDAwMDAwMDEsIC0wLjA0MDgzODIwNCwgMC4xMDk5MDM2NSwgMC4wMjQwMTIwNDksCisgICAgICAtMC4xNjI0NjM1MSwgMC4wMTYzMjk4MywgMC4yMTg4OTY5MywgLTAuMTA4MDQzMjYsIC0wLjIxNzEwOTA2LCAwLjIyNDk1ODY4LCAwLjEzNjcxNTY0LCAtMC4yOTMxNDU2NiwKKyAgICAgIC0wLjA0OTQ0ODQ5NywgMC4zMDU2ODg4MywgLTAuMDM2MDM0NDgzLCAtMC4zMjExMDA0NiwgMC4yNDI1ODM5NywgMC4xODc0OTA0MywgLTAuNDE5OTAwMjksIDAuMTc0Mjk5NzQsCisgICAgICAwLjE0NzE1OTAxLCAtMC4yNzMwNzkyNiwgMC4yNzI2MjA0OSwgLTAuMTMwNzc4NDQsIH0sCisgICAgeyAwLjAsIDAuMCwgMC4wLCAwLjAsIC0xLjE1NzMyNDFlLTIzLCAtOS4yMzgxNjc4ZS0yNCwgMS45ODY1MTM3ZS0yMywgNC44OTMwMjI0ZS0yMywKKyAgICAgIDEuMTcwNjMzOWUtMjIsIDUuNjI4Njk1NmUtMjMsIC0xLjczMjQ1NDZlLTIyLCAtNS41MzExNzc1ZS0yMiwgLTEuNjg0ODI3OWUtMjIsIDQuMzE2OTk2ZS0yMiwgLTEuNTkyMjIyMWUtMjIsIDcuNTY4NTMzNGUtMjIsCisgICAgICAzLjQzMTY5MTNlLTIyLCAtMS43NTA5MTA1ZS0yMSwgMS4zNDcyMTM5ZS0yMSwgMy4zMzUxOTI0ZS0yMSwgLTQuNTkyOTEyNmUtMTAsIC0zLjY0OTIwNjJlLTEwLCA3Ljg5NjA0MjdlLTEwLCAxLjkzNzg5NzNlLTksCisgICAgICAyLjU4MjAxNzVlLTgsIDEuOTAyMDg3ZS04LCAtNC4zMjU0OTU5ZS04LCAtMS4xMTIwNDE5ZS03LCAtMS4yNTY1MzEzZS03LCAtOC41MTk5NjI5OTk5OTk5OTllLTksIDEuNDYwMTcyM2UtNywgNi4zNjIxNDMyZS03LAorICAgICAgLTIuNjMzMTA4M2UtNywgLTAuMDAwMDAxMDEzODk0OSwgMC4wMDAwMDExMDk2OCwgMC4wMDAwMDE2ODM4MzM3LCAtMC4wMDAwMDM1NzQ0NjQ2LCAtMC4wMDAwMDI2NDYwMDczLCAwLjAwMDAwNTMyMDUzMzUsIDAuMDAwMDA3ODUzNzQ3MjAwMDAwMDAxLAorICAgICAgOC45MjE1MTU1ZS04LCAzLjExMjM1NjNlLTcsIDAuMDAwMDAxMzc5NTg0NSwgLTAuMDAwMDQ0Njc3MjMxLCAwLjAwMDA2ODY1MzA2MDk5OTk5OTk5LCAwLjAwMDExNzgxMzU5LCAtMC4wMDAxNTcxMDAyNywgLTAuMDAwMzYwNjQyODYsCisgICAgICAwLjAwMDM4MDMxNDg0LCAwLjAwMDUwMzM4NzUxLCAtMC4wMDA3NzU5MDU1OSwgLTAuMDAwODY3NDE0MiwgMC4wMDEwNzc3MjI2LCAwLjAwMDM5NDQyODY4LCAtMC4wMDE1NDQ0MjM1LCAwLjAwMTY0NTkzODIsCisgICAgICAwLjAwMDM1MTAxMjEyLCAtMC4wMDQ2NDQ2NDI5LCAwLjAwMTgxMzgzNjYsIDAuMDE0NTI0NDksIC0wLjAxMzE4MDcyNCwgLTAuMDIyOTU3MzgzLCAwLjAyODgyODkxMiwgMC4wNDE1OTcxNTcsCisgICAgICAtMC4wNjEwOTM3MDgsIC0wLjA0MTg1NzE5MSwgMC4xMDE4ODgzNiwgMC4wMzMwODU0NDcsIC0wLjE1ODU1NDk4LCAtMC4wMDM0ODI5NDQyLCAwLjIzMTgyMDYyLCAtMC4wOTAzMjY3NjQsCisgICAgICAtMC4yNDI0NjgyMywgMC4yMjM1ODc0MSwgMC4xNDc4MTk2OCwgLTAuMjY1OTQ0MjYsIC0wLjA5NzgxODIyMSwgMC4yODcyMzMyOSwgMC4wNzk1MjAyMTIwMDAwMDAwMSwgLTAuNDE3NTc5MTQsCisgICAgICAwLjIxMDczMjM5LCAwLjI4OTc3NzQsIC0wLjQ4ODg5Nzg5LCAwLjIyNTczMjI1LCB9LAorICAgIHsgMC4wLCAwLjAsIDAuMCwgMC4wLCAtMS4wNzMzMzgzZS0yMywgLTguNjA3OTI1N2UtMjQsIDEuODcyNzA1ZS0yMywgNC41NTUwODY3ZS0yMywKKyAgICAgIDQuNTQxNzM2M2UtMjMsIC0xLjIxODk1OTFlLTI1LCAtNC43OTM3NzczZS0yMywgLTIuNDAzODgzOGUtMjIsIDIuNzc1NTYwNmUtMjIsIDUuNDIyNDY2NWUtMjIsIC03LjUxNTI5N2UtMjIsIC0xLjQ3OTcwMDJlLTIxLAorICAgICAgMS4wNTAyNDgxZS0yMSwgMS40MDY1NDIzZS0yMSwgLTEuOTQwMTQxZS0yMSwgLTYuOTY3NTE1N2UtMjIsIDEuNDgwNjI1OWUtOCwgMS4xNzY0MDE1ZS04LCAtMi41NDU0NjIxZS04LCAtNi4yNDcyMzZlLTgsCisgICAgICAtMS4zNDg2MzQyZS03LCAtNS44OTg5Njk4ZS04LCAxLjk1Mjc5MzFlLTcsIDYuNDE5MDY5ZS03LCAxLjEyMzQ2MzhlLTcsIC01Ljg1NTYyMjU5OTk5OTk5OWUtNywgMy40MDU0MzgxZS03LCAtNC41OTUxNTY3ZS03LAorICAgICAgLTAuMDAwMDAxMzAwNTQ0MywgOS43MjcyNzU0ZS03LCAyLjMxOTg2NjhlLTcsIC00LjA5ODk3MzZlLTcsIDAuMDAwMDA0NzkwOTMsIDAuMDAwMDA0NDgzODg4NCwgLTAuMDAwMDA2MDkwNjA5LCAtMC4wMDAwMjg2MTcwNzMsCisgICAgICAwLjAwMDAyMDIxMjU2NSwgMC4wMDAwMzc1NzI3NjIsIC0wLjAwMDA0OTUyMjkxOSwgLTAuMDAwMDMwMjc0MTQ3LCAwLjAwMDA1OTAzMjc3NywgNC4wMzg4Nzc0ZS03LCAtMC4wMDAwNzg3MjQ2NDksIDAuMDAwMDg3NTU4MTM0OTk5OTk5OTksCisgICAgICAwLjAwMDEyNjE4MjMxLCAtMC4wMDAxODM0MDA2OCwgLTAuMDAwMDU5OTI4NTcxLCAwLjAwMDM2MjQ3MTk1LCAtMC4wMDAxNTYyMTc1OSwgLTAuMDAwMzEyODE5NzgsIDAuMDAwMjIwNzE5ODYsIDAuMDAwMDIxNjMxNTY3LAorICAgICAgLTAuMDAyMzY3ODkzOCwgLTAuMDAxNjIxNjc1NSwgMC4wMDQ2NTE0NTc4LCAwLjAwNjAyMjMwOTEsIC0wLjAwMTY1Nzk3NDksIC0wLjAwMjI0MTk3MjcsIDAuMDAxNzk5OTEsIC0wLjAwMzA5ODcwMywKKyAgICAgIC0wLjAzMTIyMzMyMSwgLTAuMDE1ODQxNzU3LCAwLjA1MzQyNTc3NCwgMC4wNTg1MTczOTcsIC0wLjAzNzAwNDY2LCAtMC4wMjYwNTU3NjcsIDAuMDQ0MDA5NTg2LCAtMC4wMzA0MjcxMjIsCisgICAgICAtMC4xNzU1OTQ0MSwgLTAuMDAzMzM4MzQyMiwgMC4zMzAyMTA5NywgMC4wMTQzNDMxNTYsIC0wLjIzMzc5Mjk3LCAwLjEwOTEyNzkyLCAwLjAxMDY0Mjc5NCwgLTAuMjQyODk5OTcsCisgICAgICAtMC4xNzM1MTUzNCwgMC40MDI0NDI4LCAwLjQ2MDQyNDk2LCAtMC41NjM2MTk4MiwgfSwKKyAgICB7IDAuMzczODI4NzQsIC0wLjUxODY3ODUzLCAwLjQ3OTQzNzQ5LCAtMC4wOTM3ODM5MTg5OTk5OTk5OSwgLTAuMTg5MDUxMzIsIDAuMjkxMzUzNTMsIC0wLjE2NDQ3MTg4LCAtMC4wNzQxNDM0MTIwMDAwMDAwMSwKKyAgICAgIDAuMjYwOTQyNDIsIC0wLjIzMDQ4ODQzLCAwLjA1Mzg0MDE4NSwgMC4xMjc4NjIzNiwgLTAuMTc5OTczNywgMC4xMDEyMDk2NywgMC4wMDQ1ODQ2ODYxLCAtMC4wNzQ2NzY4MywKKyAgICAgIDAuMDgwOTYyNTc5MDAwMDAwMDEsIC0wLjAzOTgxNzYwMSwgLTAuMDEzNzQ2NTY2LCAwLjAzNjQ4MjQ5MywgLTAuMDI4MTc2MDAxLCAwLjAwOTAyNjA3MiwgMC4wMDc0MDE4MjU4LCAtMC4wMDcwMjI4NTA2LAorICAgICAgMC4wMDU3OTk3NzQ5LCAtMC4wMDM2Nzk5NzEyLCAtMC4wMDI4NDA2MDk5LCAwLjAwMTgzOTAyNzQsIDEuMDY0MjA0OGUtMTcsIC0yLjM4Nzk3MThlLTE3LCAxLjI5NTQ1MTFlLTE3LCAxLjQwMjgxNTRlLTE3LAorICAgICAgLTEuNDA4Mzk2MmUtMTcsIDcuNjQ2MTExM2UtMTgsIDIuMDUzNDcyOGUtMTgsIC02LjE4NDc1NmUtMTgsIDguNjQ3Njg2Mjk5OTk5OTk5ZS0xOCwgLTIuNDAzMTE3MWUtMTgsIC0zLjIwMDE3MzZlLTE4LCA0LjY2NTYyOTJlLTE4LAorICAgICAgLTIuMzk3MTUyM2UtMTksIDMuNzQyNTE0M2UtMjAsIDEuNzE2NjU5OGUtMTgsIC0yLjEyNzkyMDRlLTE5LCAtNi42NzQwMTE4ZS0xOSwgMS41NzI5NzMxZS0xOSwgLTQuNDUyMDY0MmUtMTksIC00LjQwMTA1NjFlLTE5LAorICAgICAgOC44NjE4MTkzMDAwMDAwMDFlLTE5LCAtMS41NTc0NDM1ZS0yMCwgLTEuNTUyNTQ1NmUtMTksIDMuMTIzMzEyMmUtMTksIC0zLjIxMjc4NjllLTE5LCAtOS40NjUwNzkxMDAwMDAwMDFlLTIwLCA4LjIxMTI0NjhlLTIwLCAtNi43NDIyN2UtMjAsCisgICAgICAtMi42MTg0MDZlLTIwLCA5LjkzMjI2MTllLTIwLCAtMS41OTYzMzA2ZS0yMCwgLTQuODUyODg4NmUtMjAsIDEuMjM2NjYwMmUtMjAsIC01LjE5NTI4ZS0yMCwgLTEuMDA2Nzc5NWUtMjAsIDMuNzIzMjA2N2UtMjAsCisgICAgICAtMi45NzkzMzQ5ZS0yMCwgMi44NjI0MDA3ZS0yMSwgOS44NTg0NDg1ZS0yMSwgLTEuMzQ2MTQ4NmUtMjEsIDQuNDE5MDUxOGUtMjEsIC05LjYyMjM4MjdlLTIxLCAtNi4zODAxOTU3ZS0yMSwgMi45OTEyNTE0ZS0yMSwKKyAgICAgIDMuMTYzNjE0NWUtMjEsIC0yLjM4NTUxNzdlLTIyLCAtNC40Njg5MDA3ZS0yMiwgOC4yODY5NjY0ZS0yMiwgLTcuMDc1ODgxOGUtMjMsIC0xLjI2NjM3MDFlLTIyLCAtNy43MjMxMzFlLTIzLCAtOS4xOTk3NDA4ZS0yNCwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjAzMTM0MTk2LCAtMC4xNzYyODAxMiwgMC4zNTU5MDUwNSwgLTAuNTA3NTkxMzEsIDAuNTM3MjUxMTcsIC0wLjQ1ODY5MTU0LCAwLjI2NDEyNjkxLCAtMC4wNzYxMzQzMjYsCisgICAgICAtMC4wMDc2NTE3NjEsIC0wLjAwMjE0MTMyNzMsIDAuMDIyOTk4MDg3LCAtMC4wNDc4NDY4NzcsIDAuMDU1NTM5MDE0LCAtMC4wMjUxNzA3NTEsIC0wLjAxMjE0MDgyMiwgMC4wMzIzNzA1MzUsCisgICAgICAtMC4wMjkwMjA2ODYsIDAuMDE1MzIyNzY1LCAtMC4wMDAzNTE4OTQzNSwgLTAuMDA5NDU3NjcyNSwgMC4wMDczMzQ5NDQ3LCAtMC4wMDAyNTkxMzI2MywgLTAuMDAyOTcyODExNSwgMC4wMDA3MjIwNjcxNywKKyAgICAgIC0wLjAwMDU5NTk2ODIyLCAwLjAwMTQ5MzE2MzEsIDAuMDAxMjk5MDYsIC0wLjAwMDQ2ODcyODUyLCAtMC4wMDA0NzM4MzA4MiwgMC4wMDAzMDA2NDY4MSwgMC4wMDAyMzIwNzI1NSwgLTAuMDAwMTUwMjQ1MTIsCisgICAgICA4Ljc5MTc1NTNlLTE4LCAzLjk0MTk2MzVlLTE4LCA1LjQ3MzU0ODFlLTE5LCAyLjQ2MjUxNzllLTE4LCAtMy44NTQyNTg5ZS0xOCwgMi4zMTY3NzU1ZS0xOSwgMS45NjYxNzRlLTE4LCAtMS4xMzQ3OTMzZS0xOCwKKyAgICAgIC02Ljc5NDQ4NzFlLTE5LCA0LjAyMDM0NjNlLTE5LCAtMS45NTE4Mjg1ZS0xOSwgLTIuMjY2OTExOWUtMTksIDUuNjk1NzI4NWUtMTksIC0zLjEyNDk0NzVlLTE5LCA3LjQ0NTE1MjJlLTIwLCAyLjgxMDg3NTFlLTE5LAorICAgICAgLTQuMDQyMzI5OGUtMTksIC05LjI3NTQxNTEwMDAwMDAwMWUtMjEsIDUuMzAxMDk0OWUtMjAsIC0yLjI1NDU1ODZlLTIwLCAxLjE4Njk3ODdlLTE5LCAtNS45MzI4MzA4ZS0yMCwgLTMuMzk3NzM0MWUtMjAsIDUuOTY2ODU2N2UtMjAsCisgICAgICAtNC4xMjQ1OGUtMjEsIC0zLjEwNzIzOWUtMjAsIC0xLjQ5Mjc3MzJlLTIwLCAzLjc0MjU2NDNlLTIxLCAxLjc5Mzc0ODJlLTIwLCAxLjQwNDMzMjZlLTIwLCAtNy40MTkzODM2ZS0yMiwgLTMuNjcwOTE1OWUtMjEsCisgICAgICAyLjQzNDMzMTFlLTIxLCAtMi44ODEzMzU4ZS0yMiwgLTcuNzc3ODAwNmUtMjIsIC00Ljk1MzQyMjllLTIyLCAtMS44NjQ4MzAzZS0yMSwgMi4yNDc1NDc3ZS0yMSwgMS4zNDMwNzQ4ZS0yMSwgLTkuODQwODkyMWUtMjIsCisgICAgICAtMi4wOTk3NzA5ZS0yMiwgNS42NTI4Mjk3ZS0yMywgNi44MDc4OTQ0MDAwMDAwMDFlLTIzLCAtNy4wMDg1MjEzZS0yMywgLTYuMjg4MzE2NWUtMjMsIDYuODY4ODMwMWUtMjMsIDUuMDIwOTQwNWUtMjMsIC0yLjIzODQ0MWUtMjMsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAtMC4wMzA4MjIyNDgsIDAuMTI5NTc5MTQsIC0wLjE4NTEyNTczLCAwLjE2Njc1Njk1LCAtMC4wNTI4NTc3NzEsIC0wLjEzOTA4OTY5LCAwLjM1Mjc2ODc2LCAtMC40OTc5MTIzNSwKKyAgICAgIDAuNTE0MTcyNDIsIC0wLjQxMjU4ODA5LCAwLjI2MTk1NTg1LCAtMC4xMTgwNDMxMSwgMC4wMjM5NjQyMTksIDAuMDAxMDIzMjg2MSwgMC4wMTkxNTI3NDgsIC0wLjA0NDQ3NDUzMiwKKyAgICAgIDAuMDQ3NjQyMzUyLCAtMC4wMjcyMDMzOTUsIC0wLjAwMzE3OTYwNzcsIDAuMDI3OTc4MTA2LCAtMC4wMzM1NDc2NjQsIDAuMDIwMDgyNTU5LCAtMC4wMDA3NTEwNTA0MDk5OTk5OTk5LCAtMC4wMTE2ODQ2MDksCisgICAgICAwLjAwOTk4OTcxODU5OTk5OTk5OSwgLTAuMDAxOTc0NzY5OCwgLTAuMDAyOTAyNjM3OSwgMC4wMDI2ODM0MjExLCAtMC4wMDIyODU2MjQsIDAuMDAxODgzNjIwMiwgMC4wMDE2MzAwMTc5LCAtMC4wMDA4NTExNjE4OCwKKyAgICAgIC0yLjcxNzQ3ODZlLTE3LCAyLjQ2MDg2NzdlLTE3LCAtNS40Mjc3ODE2ZS0xOCwgLTEuNTE3ODgyNGUtMTcsIDEuNTAxNTc5NGUtMTcsIC00LjUzMjk5NDJlLTE4LCA1LjA2Njg4MTdlLTE4LCA2LjI0MDQwNzhlLTE4LAorICAgICAgLTkuOTk4NDI0NGUtMTgsIDQuOTU1NDEyNmUtMTgsIDEuNjM3OTA1ZS0xOCwgLTIuODAxMDU1NWUtMTgsIDMuMzQzNDM2N2UtMTgsIC0yLjE0NzI4MzZlLTE4LCAtNi43MDA1NjI4ZS0xOSwgMS43MzQyMTU3ZS0xOCwKKyAgICAgIC03LjM1MzUxNDNlLTE5LCAzLjgwNDMyMjVlLTE5LCAyLjEwMDU1NDhlLTE5LCAtNC42NjQ4NTQ5ZS0xOSwgMi4zODA0MzUyZS0xOSwgLTYuNjg0NTIxNmUtMjAsIC0xLjkzMjM4MDJlLTE5LCA2LjU2OTI4NDdlLTIwLAorICAgICAgMi44ODc2Nzg3ZS0yMCwgLTguMTA4OTY5NTk5OTk5OTk5ZS0yMSwgNC44OTI1MTA0ZS0yMCwgMS42MjgyMzc5ZS0yMCwgLTcuODcwMjI5ODAwMDAwMDAxZS0yMCwgMS4yMDA1NTE4ZS0yMCwgLTMuNDQ4OTc0NWUtMjEsIC0yLjE1MTY5NTllLTIwLAorICAgICAgMi41NTQ0ODgyZS0yMCwgLTIuNjcyMDE5N2UtMjEsIC02LjI4MzM2NTNlLTIyLCAxLjE1MTcyMjNlLTIwLCAtOS40MDY4MzkyOTk5OTk5OTllLTIxLCAtMi41NjQ3NjVlLTIxLCA0LjcyMDYyMjllLTIyLCAtMi4zMTQ2MTgxZS0yMiwKKyAgICAgIDEuMzI1ODUxM2UtMjEsIC04LjQwNTIzMDNlLTIyLCAtNy4xMzEwMDkyZS0yMiwgNS42MzI0ODUyZS0yMiwgNS42ODYzNjE3ZS0yMiwgLTIuODk0ODE0ZS0yMiwgLTIuMzIwMzIzNmUtMjIsIDEuNzQ3OTU1OWUtMjIsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAyNTQyMTc3NywgLTAuMDY3NzUxNjY0LCAwLjA4MzEzNDQ3OCwgLTAuMDUyMzc5NTI2LCAtMC4wMjIyNzQzNDQsIDAuMTIxMjc5NzgsIC0wLjE4OTU4LCAwLjE3MzQzNDQ3LAorICAgICAgLTAuMDUwODAwODIsIC0wLjE0Nzg3MjI3LCAwLjM1MDE5NzkxLCAtMC40ODM3MzY3MSwgMC41MDU0MjA1NCwgLTAuNDE2ODU5NjQsIDAuMjY1Nzc0NjgsIC0wLjExODI2MjA2LAorICAgICAgMC4wMjUyMTAyOCwgMC4wMDA5NDQ5NTQ1MywgMC4wMTcwMjcxNDQsIC0wLjA0MzM2Mjc3MywgMC4wNDk3NjU5MjcsIC0wLjAyOTY0MzkyMSwgLTAuMDAzMjU2ODgwNSwgMC4wMjk1MzQ5NDIsCisgICAgICAtMC4wMzQ1NjM3NzEsIDAuMDIwNDUzMjk4LCAtMC4wMDA3NjAwMjMzMSwgLTAuMDEyMTMwNDQxLCAwLjAxMDU0NDU1MiwgLTAuMDAyMjQxODExMywgLTAuMDAzMTI0NTE3MiwgMC4wMDI4Mzk0OTM3LAorICAgICAgLTAuMDAyMzczMTg3OSwgMC4wMDE5NDI1ODM5LCAwLjAwMTY3NjkxNTIsIC0wLjAwMDg3OTkyMDE5LCAtNS4yOTU4NDkzZS0xOCwgLTQuMDg3NzM5NmUtMTgsIDIuNzcyMjUzZS0xOCwgLTIuMDMxMTI5N2UtMTgsCisgICAgICAtMi4yODg3NjVlLTE4LCA3LjkyODkwMzZlLTE4LCAyLjUyODQzNjRlLTE4LCAtMi41NDAyNjk2ZS0xOCwgOS45NjgyMDUxOTk5OTk5OTllLTE5LCAtNS4wOTQ0NjE2ZS0xOSwgMy45MTQwOTc3ZS0xOSwgMS40MjMwNDEyZS0xOCwKKyAgICAgIC0xLjI3MDUxNzFlLTE4LCAtNi4xODczMzk2ZS0yMCwgMy44MTM5MTAzZS0xOSwgMS43MDg0NDM5ZS0xOSwgMi41NDMyNjQzZS0xOSwgLTMuMzMwMzgzM2UtMTksIC0xLjQxNzExMDVlLTE5LCA0LjI3ODQ3NzFlLTIwLAorICAgICAgNS41NzU3MTIyZS0yMCwgLTIuNTM5MDAyNWUtMjAsIC0xLjAyMzI4NzhlLTE5LCAzLjQzNjE3ODRlLTIwLCA3LjUwMjAxMDRlLTIwLCAtMS4zNjQ2Mzc1ZS0yMCwgMi40NjE4ODAxZS0yMCwgMS44ODQ3Mjc1ZS0yMCwKKyAgICAgIC01LjkzNTQwNjNlLTIwLCAxLjM4NjY3MDJlLTIwLCAtNC42ODk1ODExZS0yMSwgLTEuMjc4MDcxZS0yMCwgMS43MDc3MjUyZS0yMCwgLTguNzcxOTU5NDk5OTk5OTk5ZS0yMSwgNC40ODk5MTU4ZS0yMiwgMS4wMzY0M2UtMjAsCisgICAgICAtMS4wMDI1NTc1ZS0yMCwgLTIuNDQ1ODk1NmUtMjEsIC05LjIwOTI3MTMwMDAwMDAwMWUtMjIsIC0xLjU0MTAyNDJlLTIxLCAzLjMyMjI2MTVlLTIxLCAtOS41NjYzMDMzMDAwMDAwMDFlLTIyLCAtOC45NTIxNTQyZS0yMiwgOS43MjAxMDZlLTIyLAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgLTAuMDA3MTIyODQ3NSwgMC4wMTkwNDk3NjEsIC0wLjAyNDY0NDg4MywgMC4wMTA3NjU2MjEsIDAuMDIzMDU0Njg2LCAtMC4wNjU1OTIxMDQsIDAuMDg0MTYxMzQyLCAtMC4wNTU5NDgyNTQsCisgICAgICAtMC4wMjMxOTI0MzksIDAuMTI0MDU2NjYsIC0wLjE5MDA1Nzc5LCAwLjE3MDk0MzM5LCAtMC4wNDkzOTYxOCwgLTAuMTQ2MTI2NTcsIDAuMzQ4OTI1MDEsIC0wLjQ4NDA2MDkxLAorICAgICAgMC41MDUyMzkyOTk5OTk5OTk5LCAtMC40MTY0NTMzNywgMC4yNjYxODEzOSwgLTAuMTE4ODE3NDIsIDAuMDI0ODkwOTQ5LCAwLjAwMTYzNTE5MTEsIDAuMDE3MTM4NDc2LCAtMC4wNDM4NDgxNTQsCisgICAgICAwLjA0OTkyNjMwNCwgLTAuMDI5NjcxNzksIC0wLjAwMzIyNzcyMTQsIDAuMDI5NTY3MTg3LCAtMC4wMzQ2ODQzMDgsIDAuMDIwNTQ4Njg2LCAtMC4wMDA2OTE4MDg0MiwgLTAuMDEyMTcyNzc0LAorICAgICAgMC4wMTA1NTMwMDMsIC0wLjAwMjI0NjQwNTMsIC0wLjAwMzEyOTY0MjgsIDAuMDAyODQyNDE4NCwgLTAuMDAyMzc0NTkwNCwgMC4wMDE5NDM3MzE4LCAwLjAwMTY3NzkwNjIsIC0wLjAwMDg4MDQ0MDE3LAorICAgICAgLTEuODQ3NTI0M2UtMTcsIDEuNDU2ODA1OGUtMTcsIC0yLjAwMTA1NjllLTE4LCAtMS40ODQyNzU5ZS0xNywgOS4zMDgwMTczMDAwMDAwMDFlLTE4LCAyLjc4ODUxNzVlLTE4LCAxLjQwOTgyMTNlLTE4LCA3Ljg3MTE2MzJlLTE5LAorICAgICAgLTQuMTA2MDA2MWUtMTgsIDMuMzg0NDY0MWUtMTgsIDEuNjM5OTg5NmUtMTgsIC0yLjQ0OTg0OTNlLTE4LCA0Ljc0Mjg5NjNlLTE5LCA4LjQ2MzA5NDNlLTE5LCAtNC42MzU0MDc0ZS0xOSwgLTEuMjk0NzA2MWUtMTksCisgICAgICAyLjgyNzI3MzFlLTE5LCAxLjU1NDIwMThlLTE5LCAyLjM5MTg3MjFlLTE5LCAtMi4wMTMwNDc1ZS0xOSwgLTIuOTU1NTk5OGUtMTksIDIuNzE4MDIxMWUtMTksIDkuNTAyNjk4NWUtMjAsIC0yLjM3Mzg5NThlLTE5LAorICAgICAgNS4xMzk1NTU5ZS0yMCwgMS4yMTU0NDY1ZS0yMCwgMi43NTczNzYyZS0yMCwgNS4wNTI5MzU2ZS0yMCwgLTcuODQyOTM2ZS0yMCwgLTIuMjE2MDY0OGUtMjAsIDEuOTYzMzUxOWUtMjAsIDguNzc4NzYwOWUtMjEsCisgICAgICAtMi4zODAzMTE0ZS0yMSwgLTEuMDA2NzkyM2UtMjAsIC03LjY2MDgyNzE5OTk5OTk5OWUtMjEsIDIuNDkyNTcyOWUtMjEsIDkuNjg5NjMwN2UtMjEsIC01LjU1ODEzMjFlLTIxLCAtNC4zOTE0MDYxZS0yMSwgMy4wMzkxNDg4ZS0yMSwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IC0wLjAwMTgwNTc0MjQsIC0wLjAwMTY4NjY2NDYsIDAuMDA2OTAzNTI3MywgLTAuMDA0MTE4ODI0MSwgLTAuMDA2NDQyMjY4OSwgMC4wMTgzNzI5MzUsIC0wLjAyNTA3MjkzOCwgMC4wMTIwMzQwNDUsCisgICAgICAwLjAyMzY4NDY4OSwgLTAuMDY2NTczNTcyLCAwLjA4NDE1MTk3OCwgLTAuMDU0OTI4MTQ4LCAtMC4wMjM3NzcyOTMsIDAuMTIzMjk4MzYsIC0wLjE4OTM3NDQxLCAwLjE3MDk2NDU4LAorICAgICAgLTAuMDQ5NTMyMjQyLCAtMC4xNDU3NjE1NCwgMC4zNDg0ODM5LCAtMC40ODM5NTcwOCwgMC41MDU2NDcwMSwgLTAuNDE2OTQ5MzcsIDAuMjY2MTU3MTgsIC0wLjExODU3Nzg1LAorICAgICAgMC4wMjQ2ODM1NTEsIDAuMDAxODA1NDg1NSwgMC4wMTcxNDM4OTYsIC0wLjA0NDAwMTU2MywgMC4wNTAwNjUxOTYsIC0wLjAyOTcxNjgxOSwgLTAuMDAzMjU5NDkwOCwgMC4wMjk2MDE1NzcsCisgICAgICAtMC4wMzQ3MjM0MTksIDAuMDIwNTcyNjk5LCAtMC4wMDA2NzM0MDM3OCwgLTAuMDEyMTg1MjExLCAwLjAxMDU1NDAzNywgLTAuMDAyMjQ2OTk3NywgLTAuMDAzMTMwMjAxNiwgMC4wMDI4NDI3NTkzLAorICAgICAgLTAuMDAyMzc0Njg0OCwgMC4wMDE5NDM4MDkxLCAwLjAwMTY3Nzk3MjksIC0wLjAwMDg4MDQ3NTE4LCAtMi4wNjkzNzM5ZS0xNywgOC41NjAzODkxMDAwMDAwMDFlLTE4LCAtNC43MzU0Nzg4ZS0xOCwgLTEuMDI2MzgxM2UtMTcsCisgICAgICAxLjAyODY5MDllLTE3LCAyLjg0MTAzMDVlLTE4LCAyLjg5NzM5NTllLTE4LCAzLjAwODQyMzhlLTE4LCAtNS4wNDgzNDA4ZS0xOCwgNi43NDg2ODZlLTE5LCAxLjA1Nzk3OTNlLTE4LCAtMS4wNjY4Mjk0ZS0xOCwKKyAgICAgIDcuNTE3MjUwOGUtMTksIC04Ljc5NDE1MjhlLTIwLCAtMy41MzY4MDA2ZS0xOSwgMy43MjY5MDVlLTE5LCAzLjkxMjc0MDdlLTE5LCAtMi4yMDg2MTU4ZS0xOSwgLTIuNTk0NzA0OGUtMjAsIC04LjkwOTE2NzhlLTIwLAorICAgICAgLTIuNDU0ODk2NmUtMjAsIDEuOTY0NTQ5N2UtMTksIC00Ljg1NjI0OTllLTIwLCAtMS42NDAxMTI0ZS0xOSwgMS4xOTA1NTc1ZS0xOSwgNi4wMDAyMjIwOTk5OTk5OTllLTIwLCAzLjYwMDI1NzFlLTIwLCAxLjE0NDMzNDdlLTIwLAorICAgICAgLTcuMDY1NjI1MmUtMjAsIDIuNzMzODAyMWUtMjAsIDIuNDE2NTAxN2UtMjAsIC0yLjEwOTA1MzJlLTIwLCAxLjE1Nzk5MDRlLTIxLCAtNC4zNjY4ODEyZS0yMiwgLTQuMzkyODk1N2UtMjIsIDMuNzEyMDg2OGUtMjIsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAwLjAwMDY4MzkzMTcyLCAtMC4wMDIzOTI2OTgxLCAwLjAwMDcyNjEwOTY2LCAwLjAwMTA5OTAzMDgsIC0wLjAwMTgxOTg5NjcsIC0wLjAwMTk1MDA3OTcsIDAuMDA3MDE1MjU4NCwgLTAuMDAzNjg5NjUwNCwKKyAgICAgIC0wLjAwNjUwNjczNDksIDAuMDE4MTYzMjk2LCAtMC4wMjQ5NzkyOCwgMC4wMTE5NDgxNDcsIDAuMDIzNzg5MzQ4LCAtMC4wNjYzNzk0OTUsIDAuMDgzOTMzMjcxLCAtMC4wNTQ3OTMwMjcsCisgICAgICAtMC4wMjM2ODM3NTcsIDAuMTIyOTcyMTUsIC0wLjE4OTIwMzM1LCAwLjE3MTA1NjM3LCAtMC4wNDk3NDM3MzQsIC0wLjE0NTYyODAxLCAwLjM0ODQ3NjIzLCAtMC40ODQwMDg2MywKKyAgICAgIDAuNTA1NzU4MDgsIC0wLjQxNzA0ODc3LCAwLjI2NjE0NjE0LCAtMC4xMTg0OTEsIDAuMDI0NjI3NjkxLCAwLjAwMTgwOTQ5NzEsIDAuMDE3MTQ4ODIyLCAtMC4wNDQwMTIxNzYsCisgICAgICAwLjA1MDA4NTMyNiwgLTAuMDI5NzI5NzUyLCAtMC4wMDMyNjk0MDExLCAwLjAyOTYwNzk5OCwgLTAuMDM0NzIzMzM3LCAwLjAyMDU3MjY0NCwgLTAuMDAwNjczNTEyNDQsIC0wLjAxMjE4NTE4NCwKKyAgICAgIDAuMDEwNTU0MDU1LCAtMC4wMDIyNDY5OTM2LCAtMC4wMDMxMzAyMDE2LCAwLjAwMjg0Mjc2MjgsIC0wLjAwMjM3NDY5MTgsIDAuMDAxOTQzODE0OSwgMC4wMDE2Nzc5Nzc4LCAtMC4wMDA4ODA0Nzc3OCwKKyAgICAgIC0yLjMwNjc5MTRlLTE3LCA1LjQwMDMwNThlLTE4LCAtMS4yNTE4MDllLTE4LCAtNS4yMDY2NDEzZS0xOCwgNy43OTI2NDQyMDAwMDAwMDFlLTE4LCAtMy43OTM1NDIzZS0xOSwgMy43Nzc3NDg3ZS0xOSwgMy40OTMxMjQ2ZS0xOCwKKyAgICAgIC0yLjc1MjkxMjZlLTE4LCA1LjAzMjkxNzJlLTE5LCAxLjY0NTcyODhlLTE5LCAtNi42OTIyNTJlLTE5LCA5LjQ5MzIzOTVlLTE5LCAtNi40OTQ1MzA5ZS0xOSwgMS4wMzk4ODE3ZS0xOSwgMS45MDAyNjM2ZS0xOSwKKyAgICAgIC0xLjc1NDExMjhlLTE5LCAtMy41NzUzNjE5ZS0yMCwgLTEuMDc2OTI0OGUtMjAsIC0xLjI2NDY0MzVlLTE5LCA5LjI4MTI4OTVlLTIwLCAtMS4xMzU0ODc2ZS0xOSwgLTMuODY2ODQ0MWUtMjAsIDUuNzEwMjczZS0yMCwKKyAgICAgIC0zLjQzNzM0MzllLTIwLCAxLjk0NzkwMDhlLTIwLCA5LjkzNDM0MzdlLTIxLCAtOS4xMjIxNDc5OTk5OTk5OTllLTIxLCA2Ljg1MzI5MjNlLTIxLCAtOS41NDY0NjNlLTIxLCAtNi41NjczOTg4ZS0yMSwgMi41MDI1MDc5ZS0yMSwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDAxMDY4NzE4MywgLTAuMDAxMDQ1MDc0NCwgLTAuMDAxMDA3MDA2NiwgMC4wMDIwMjUzMDQ0LCAwLjAwMDU1MTc4MjQ0OTk5OTk5OTksIC0wLjAwMjI5NTkxNTUsIDAuMDAwOTcwNTc2NzEsIDAuMDAxMDkyNDUwOCwKKyAgICAgIC0wLjAwMTkzMTI1MDEsIC0wLjAwMTc1NDY0MDcsIDAuMDA3MDg3NDA5MywgLTAuMDA0MDExMzg1NCwgLTAuMDA2MzMxNjk5LCAwLjAxODQ0NjUzMSwgLTAuMDI1MjM1NTkyLCAwLjAxMjA2MjE0NywKKyAgICAgIDAuMDIzODQ4MjQsIC0wLjA2NjY5NzkxMywgMC4wODQxNTc1NzYsIC0wLjA1NDczOTE4MywgLTAuMDIzOTIzMDg3LCAwLjEyMzE1OTI3LCAtMC4xODkyMTQ2OSwgMC4xNzA5Nzk2OSwKKyAgICAgIC0wLjA0OTYxNTUwMSwgLTAuMTQ1NzM2MjYsIDAuMzQ4NDY3OTUsIC0wLjQ4MzkxMzY4LCAwLjUwNTY5MDI1OTk5OTk5OTksIC0wLjQxNzAzOTExLCAwLjI2NjE1NjA0LCAtMC4xMTg1MDY0MiwKKyAgICAgIDAuMDI0NjUxMDksIDAuMDAxNzk0ODExNiwgMC4wMTcxMzc4MSwgLTAuMDQ0MDA0ODY1LCAwLjA1MDA4NTE0NywgLTAuMDI5NzI5Njk3LCAtMC4wMDMyNjkzMTU2LCAwLjAyOTYwNzk4NywKKyAgICAgIC0wLjAzNDcyMzM4LCAwLjAyMDU3MjY3MiwgLTAuMDAwNjczNTUxNTUsIC0wLjAxMjE4NTIwMSwgMC4wMTA1NTQwODIsIC0wLjAwMjI0Njk5NTIsIC0wLjAwMzEzMDIwNjgsIDAuMDAyODQyNzY5NSwKKyAgICAgIC0wLjAwMjM3NDY5OTUsIDAuMDAxOTQzODIxMiwgMC4wMDE2Nzc5ODMzLCAtMC4wMDA4ODA0ODA2NSwgLTIuMTAwMDA0N2UtMTcsIDcuNTY1NzIzNzAwMDAwMDAxZS0xOCwgMi41MTkwMjM0ZS0xOCwgLTcuNzM4ODc0MTk5OTk5OTk5ZS0xOCwKKyAgICAgIDUuMTYxMzI1OGUtMTgsIDEuODYzMDM4MmUtMTgsIDQuNzUwMDcxNmUtMTgsIDEuNTY4MzY1NmUtMTgsIC0zLjUzMzI2NzNlLTE4LCAyLjA3NjgxNDNlLTE4LCAtMS40OTg3MzEyZS0xOCwgLTMuNTQxMzg5M2UtMjEsCisgICAgICAyLjQ0MjA5NzllLTE4LCAtMS4zNDU1MjRlLTE4LCA0LjM1MDA4MjVlLTIwLCA2Ljk0MzY2MmUtMTksIC02LjEzNzQ5NzdlLTE5LCAxLjAyNDIxOTdlLTE4LCAyLjcxODU0M2UtMjAsIC04LjMwNzIyNDllLTE5LAorICAgICAgNS45MjUxNjE1ZS0xOSwgLTQuOTg4NTAzMWUtMjAsIC00LjA2MDc4MDllLTIwLCAxLjAxMTc2NDRlLTE5LCAtMi40MDk3Njc2ZS0xOSwgMS4zMDE3MDZlLTE5LCAxLjAyNTAzMTZlLTE5LCAtNy40MzY1OTE5ZS0yMCwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDAwNTY0MDIxMzYsIDAuMDAwMjEzMzM0NjcsIC0wLjAwMDkxMTI1MDk3LCAwLjAwMDM2Njg1ODA5LCAwLjAwMTAxNDk0NDgsIC0wLjAwMDk2MjAwNzAzLCAtMC4wMDA5NDc5MzIyNywgMC4wMDE4Mzg3OTk0LAorICAgICAgMC4wMDA0MDUxNjA3MSwgLTAuMDAyMTcxMDQ4NywgMC4wMDEwMTYxMDA5LCAwLjAwMDkzOTkxMzk0MDAwMDAwMDEsIC0wLjAwMTg1NjYwNTksIC0wLjAwMTYzNDEwNTIsIDAuMDA2OTUzODgzOSwgLTAuMDA0MDIwMjkwNywKKyAgICAgIC0wLjAwNjI4NDE2MzEsIDAuMDE4MzgzNDQxLCAtMC4wMjUxNzA2NCwgMC4wMTIwNTI0MDEsIDAuMDIzNzc1MjgsIC0wLjA2NjYwNzY2NiwgMC4wODQxNjE0NDUsIC0wLjA1NDc4MTkyMSwKKyAgICAgIC0wLjAyMzg4OTQyLCAwLjEyMzEzMTQxLCAtMC4xODkyMTU3MSwgMC4xNzEwMDQxNSwgLTAuMDQ5NjM4MDQyLCAtMC4xNDU3MjkwMiwgMC4zNDg0NzQ1NiwgLTAuNDgzOTIwMTQsCisgICAgICAwLjUwNTY5NzA1LCAtMC40MTcwNDMzNSwgMC4yNjYxNTMzMiwgLTAuMTE4NTA0NTgsIDAuMDI0NjUxMDYsIDAuMDAxNzk0ODE2MiwgMC4wMTcxMzc5LCAtMC4wNDQwMDQ4ODMsCisgICAgICAwLjA1MDA4NTEyOSwgLTAuMDI5NzI5Njk2LCAtMC4wMDMyNjkzMzM4LCAwLjAyOTYwNzk5MSwgLTAuMDM0NzIzMzgyLCAwLjAyMDU3MjY4MSwgLTAuMDAwNjczNTU5ODksIC0wLjAxMjE4NTIwNCwKKyAgICAgIDAuMDEwNTU0MDg2LCAtMC4wMDIyNDY5OTI5LCAtMC4wMDMxMzAyMDU4LCAwLjAwMjg0Mjc2OTgsIC0wLjAwMjM3NDcwMTMsIDAuMDAxOTQzODIyNywgMC4wMDE2Nzc5ODQ2LCAtMC4wMDA4ODA0ODEzLAorICAgICAgLTkuMzc5Njg4NzAwMDAwMDAxZS0xOCwgMi42MTQ2NDAzZS0xOCwgMS41NzQ2NjM0ZS0xOCwgLTEuMDcyODM2OWUtMTcsIDQuNTgwNDY1NmUtMTgsIDcuMTA3OTY0NTAwMDAwMDAxZS0xOCwgMi4zMjYwNzY0ZS0xOCwgLTEuOTE2OTI1MmUtMTksCisgICAgICAtNy4wMjI2NTY2ZS0xOSwgLTEuODczNzEzZS0xOCwgOS40MjM2MzA0ZS0xOSwgNC4xNTcyOTY3ZS0xOSwgLTEuMjA3NjIxMmUtMTgsIDcuNDA4OTI1NWUtMTksIC0yLjY1MjczMDZlLTIwLCAtNi41Nzg3MThlLTE5LAorICAgICAgOC43MjkxNDA4ZS0xOSwgLTQuNzcwNDc0NmUtMjEsIC04LjA1NzAwNzc5OTk5OTk5OWUtMjAsIDEuNzc1MzI1NGUtMTksIC0yLjIwNTgxMjJlLTE5LCA3LjEzMjQ1MDllLTIwLCA2LjY4ODk2OTllLTIwLCAtNi42MTAyMzg1ZS0yMCwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDAuMDAwMTQyNzEyNTMsIDAuMDAwMjM3ODA5MTcsIC0wLjAwMDI1NzE0MTg2LCAtMC4wMDAyNDMxNzA1OCwgMC4wMDA1NzQwOTEyOCwgMC4wMDAyMzAxMDU1NCwgLTAuMDAwOTMwNjkxMTIsIDAuMDAwMjcyNDMxNDUsCisgICAgICAwLjAwMDk0MzA2NjcxLCAtMC4wMDA5NDU2Mzc1NywgLTAuMDAwOTI4MTY5OTQsIDAuMDAxODIxNDM3LCAwLjAwMDQxMDc2NjExLCAtMC4wMDIxNTc3MjQ0LCAwLjAwMDk4NjIzNTgzLCAwLjAwMDkxNDMxMjQ0LAorICAgICAgLTAuMDAxODM2NTc2MSwgLTAuMDAxNjEyNjgyOSwgMC4wMDY5NDY2NzQzLCAtMC4wMDQwMzM5NjI2LCAtMC4wMDYyODA1NjU5LCAwLjAxODM5OTg0MiwgLTAuMDI1MTY1NjE3LCAwLjAxMjA0MjE5NywKKyAgICAgIDAuMDIzNzcwMjg0LCAtMC4wNjY2MDM0ODUsIDAuMDg0MTYyMDIsIC0wLjA1NDc4NTQyOSwgLTAuMDIzODg5ODEzLCAwLjEyMzEzMzk5LCAtMC4xODkyMTQwNSwgMC4xNzEwMDM1NywKKyAgICAgIC0wLjA0OTYzODY0OSwgLTAuMTQ1NzI4NjcsIDAuMzQ4NDc1MDksIC0wLjQ4MzkyMDQ5LCAwLjUwNTY5NzEsIC0wLjQxNzA0MzQsIDAuMjY2MTUzMzgsIC0wLjExODUwNDYyLAorICAgICAgMC4wMjQ2NTEwODQsIDAuMDAxNzk0Nzk5MiwgMC4wMTcxMzc5MDEsIC0wLjA0NDAwNDg3NiwgMC4wNTAwODUxMjIsIC0wLjAyOTcyOTY5MywgLTAuMDAzMjY5MzM1MywgMC4wMjk2MDc5OSwKKyAgICAgIC0wLjAzNDcyMzM4MiwgMC4wMjA1NzI2ODMsIC0wLjAwMDY3MzU2MTUyLCAtMC4wMTIxODUyMDQsIDAuMDEwNTU0MDg2LCAtMC4wMDIyNDY5OTI1LCAtMC4wMDMxMzAyMDU1LCAwLjAwMjg0Mjc2OTgsCisgICAgICAtMC4wMDIzNzQ3MDE2LCAwLjAwMTk0MzgyMjksIDAuMDAxNjc3OTg0OCwgLTAuMDAwODgwNDgxNDEsIC0yLjg5NzgxODFlLTE3LCA4LjQ3MzYyZS0xOCwgLTQuMjc2MzAwNGUtMTgsIC02LjgyNzg4MTllLTE4LAorICAgICAgMS4wODE5NzA2ZS0xNywgMS4yMDg3NzAxZS0xOCwgMS4xMTYyMjgzZS0xOCwgMi4xNTExNDc4ZS0xOCwgLTMuMTk5NDYxOGUtMTgsIDUuOTE3ODQ2OGUtMTksIDIuMTY5ODExOWUtMTksIC0xLjM2OTc5MzhlLTE4LAorICAgICAgOS41NzA0MjYyOTk5OTk5OTllLTE5LCAxLjc5MzIzODllLTE5LCA5LjYyNDIwOTcwMDAwMDAwMWUtMjAsIDEuNjM3NjQzMWUtMTksIC0yLjUzMzI3MzVlLTE5LCA5LjQwNTAwNzVlLTIwLCA3LjYxMTg1OGUtMjAsIC03LjMzNDQzMzFlLTIwLAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wMDAwMDE4NDQ3NTQ5LCAwLjAwMDA1Mzg0MDg1MSwgLTAuMDAwMDI2MDUxNDk2LCAtMC4wMDAxNzU2MDQwMiwgMC4wMDAxNTM1OTY5OSwgMC4wMDAyMjk4MTMxLCAtMC4wMDAyNzc4NTA5OSwgLTAuMDAwMjY5MTc5MjcsCisgICAgICAwLjAwMDU0ODg3NDkyOTk5OTk5OTksIDAuMDAwMjE3MTg2MDIsIC0wLjAwMDkyNTUyODU4LCAwLjAwMDI4MjI4OTYsIDAuMDAwOTM5Mzk5MjUsIC0wLjAwMDk1MDY3MDkyLCAtMC4wMDA5MzA4OTMzNywgMC4wMDE4MDk2OTk3LAorICAgICAgMC4wMDA0MTcxODc4OCwgLTAuMDAyMTQxNzQ5OCwgMC4wMDA5NzU4MzU3OCwgMC4wMDA5MDg3OTE4MSwgLTAuMDAxODI3NzM3MywgLTAuMDAxNjEyNzc0MSwgMC4wMDY5NDkxMzQsIC0wLjAwNDAzNDk4MDIsCisgICAgICAtMC4wMDYyODY0MTM3LCAwLjAxODQwNDMxMiwgLTAuMDI1MTY1MjU0LCAwLjAxMjAzODE4MiwgMC4wMjM3NzIyMzUsIC0wLjA2NjYwMjg4NCwgMC4wODQxNjIxNTcsIC0wLjA1NDc4NTAxNCwKKyAgICAgIC0wLjAyMzg5MDgwMywgMC4xMjMxMzQ2LCAtMC4xODkyMTM1OCwgMC4xNzEwMDMyNSwgLTAuMDQ5NjM4NjE1LCAtMC4xNDU3Mjg3LCAwLjM0ODQ3NTEyLCAtMC40ODM5MjA1MSwKKyAgICAgIDAuNTA1Njk3MTIsIC0wLjQxNzA0MzQxLCAwLjI2NjE1MzM5LCAtMC4xMTg1MDQ2MiwgMC4wMjQ2NTEwODYsIDAuMDAxNzk0Nzk3MSwgMC4wMTcxMzc5MDEsIC0wLjA0NDAwNDg3NSwKKyAgICAgIDAuMDUwMDg1MTIyLCAtMC4wMjk3Mjk2OTMsIC0wLjAwMzI2OTMzNTksIDAuMDI5NjA3OTksIC0wLjAzNDcyMzM4MiwgMC4wMjA1NzI2ODMsIC0wLjAwMDY3MzU2MTc3LCAtMC4wMTIxODUyMDQsCisgICAgICAwLjAxMDU1NDA4NiwgLTAuMDAyMjQ2OTkyNCwgLTAuMDAzMTMwMjA1NSwgMC4wMDI4NDI3Njk4LCAtMC4wMDIzNzQ3MDE2LCAwLjAwMTk0MzgyMjksIDAuMDAxNjc3OTg0OCwgLTAuMDAwODgwNDgxNDMsCisgICAgICAtMy42NzkxMzk0ZS0xNywgNC4wNTIyNjJlLTE4LCAtMS45Njk3NzhlLTE4LCAtNy4wMjk2NTU2ZS0xOCwgOS43NzU5NDU4ZS0xOCwgLTMuMzIyMjg3M2UtMTgsIDQuNjI3MzIyNGUtMTksIDUuMjExMTg1NWUtMTgsCisgICAgICAtNC40NDAxNTc0ZS0xOCwgLTEuMjI1NjU0NWUtMTgsIC01LjQ0Nzc3NThlLTE5LCAtNi43MzUzMTI3ZS0xOSwgMS40Njk1NDFlLTE4LCAtNC43NDAyMjgzZS0xOSwgLTQuMjUwOTgzN2UtMTksIDQuMzIyMzQ1MmUtMTksCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAtMC4wMDAwMDY1MjMyMDU1LCAzLjEyNzczNzhlLTcsIDAuMDAwMDAyNTYwMTUyNywgLTAuMDAwMDIzNjM3MzMzLCAwLjAwMDAwMjc4MzQwODMsIDAuMDAwMDUxNDE5MDc2LCAtMC4wMDAwMjk1MzAyNjcsIC0wLjAwMDE3NzM4ODU5LAorICAgICAgMC4wMDAxNTE0MjQxMiwgMC4wMDAyMjY2MDQyNiwgLTAuMDAwMjc4MDY5MjQsIC0wLjAwMDI2NjY4MzY0LCAwLjAwMDU0ODM3ODQ3LCAwLjAwMDIxNTg2OTgsIC0wLjAwMDkyNTA1NjIyLCAwLjAwMDI4MDg2OTE2LAorICAgICAgMC4wMDA5Mzk4NDY2OCwgLTAuMDAwOTQ4MjgzODcsIC0wLjAwMDkzMjU3NTg2LCAwLjAwMTgwOTAxOTIsIDAuMDAwNDE4NzI5NTEsIC0wLjAwMjE0MjI2ODMsIDAuMDAwOTc2MTUyNTcsIDAuMDAwOTA4OTQ2MjksCisgICAgICAtMC4wMDE4Mjg2OTY0LCAtMC4wMDE2MTIwODcyLCAwLjAwNjk0OTE5MzgsIC0wLjAwNDAzNTYxMjcsIC0wLjAwNjI4NjAzNjMsIDAuMDE4NDA0MzM3LCAtMC4wMjUxNjUyODIsIDAuMDEyMDM4Mjc3LAorICAgICAgMC4wMjM3NzIwNzQsIC0wLjA2NjYwMjc4MywgMC4wODQxNjIyMjQ5OTk5OTk5OSwgLTAuMDU0Nzg1MDYsIC0wLjAyMzg5MDgwMSwgMC4xMjMxMzQ2LCAtMC4xODkyMTM1OCwgMC4xNzEwMDMyNCwKKyAgICAgIC0wLjA0OTYzODYxMiwgLTAuMTQ1NzI4NywgMC4zNDg0NzUxMiwgLTAuNDgzOTIwNTEsIDAuNTA1Njk3MTIsIC0wLjQxNzA0MzQxLCAwLjI2NjE1MzM5LCAtMC4xMTg1MDQ2MiwKKyAgICAgIDAuMDI0NjUxMDg2LCAwLjAwMTc5NDc5NywgMC4wMTcxMzc5MDEsIC0wLjA0NDAwNDg3NSwgMC4wNTAwODUxMjIsIC0wLjAyOTcyOTY5MywgLTAuMDAzMjY5MzM2LCAwLjAyOTYwNzk5LAorICAgICAgLTAuMDM0NzIzMzgyLCAwLjAyMDU3MjY4MywgLTAuMDAwNjczNTYxNzgsIC0wLjAxMjE4NTIwNCwgMC4wMTA1NTQwODYsIC0wLjAwMjI0Njk5MjQsIC0wLjAwMzEzMDIwNTUsIDAuMDAyODQyNzY5OCwKKyAgICAgIC0wLjAwMjM3NDcwMTYsIDAuMDAxOTQzODIyOSwgMC4wMDE2Nzc5ODQ4LCAtMC4wMDA4ODA0ODE0MywgLTEuNjcxMzAzMWUtMTcsIDUuNTQyNTM2OGUtMTksIDEuNDI0NTAyMWUtMTgsIC0xLjAwNzI1OTFlLTE4LAorICAgICAgNS4zMjg2NTY5ZS0xOCwgMS40OTQ2MDk3ZS0xOCwgMi44NzM2NDg0ZS0xOSwgOS4zODc1Mjc3MDAwMDAwMDFlLTE5LCAtNC4yMTc5NDI2ZS0xOSwgLTkuOTc1NTc4MzAwMDAwMDAxZS0xOSwgLTUuODA5ODU3ZS0xOSwgLTUuMTA4OTkzOWUtMjAsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAtMC4wMDAwMDEwNzEzMzEzLCAtMC4wMDAwMDYyMzAyNTcyLCAwLjAwMDAwNTUyNDQ1MTYsIDAuMDAwMDA2MTE3NTg1NiwgLTAuMDAwMDA3MTQ4MjUxOCwgMy40NTEzNDkxZS05LCAwLjAwMDAwMzA0Mjk1NDYsIC0wLjAwMDAyMTc1OTE2OSwKKyAgICAgIDAuMDAwMDA0NDE5MDU2MywgMC4wMDAwNTEyNjk5NjEsIC0wLjAwMDAzMDExNzQzMSwgLTAuMDAwMTc3MTgxNzEsIDAuMDAwMTUxNDk2NTgsIDAuMDAwMjI2Mzk4MSwgLTAuMDAwMjc3NTcyNDksIC0wLjAwMDI2NjEzODQ0LAorICAgICAgMC4wMDA1NDc5MzA2NCwgMC4wMDAyMTUzODMyNywgLTAuMDAwOTI0Nzc4NjgsIDAuMDAwMjgxMTEyMzQsIDAuMDAwOTM5NjcyODcsIC0wLjAwMDk0ODUzNTA2LCAtMC4wMDA5MzI2NzgxLCAwLjAwMTgwOTIxMDEsCisgICAgICAwLjAwMDQxODg3MDgxLCAtMC4wMDIxNDI0MDY2LCAwLjAwMDk3NjE0NzA5LCAwLjAwMDkwOTA2MjYxLCAtMC4wMDE4Mjg3MTcyLCAtMC4wMDE2MTIxNDEzLCAwLjAwNjk0OTE2NDIsIC0wLjAwNDAzNTYwODUsCisgICAgICAtMC4wMDYyODYwMDk2LCAwLjAxODQwNDMyMSwgLTAuMDI1MTY1MywgMC4wMTIwMzgyOSwgMC4wMjM3NzIwNzIsIC0wLjA2NjYwMjc4MSwgMC4wODQxNjIyMjE5OTk5OTk5OSwgLTAuMDU0Nzg1MDU3LAorICAgICAgLTAuMDIzODkwODAzLCAwLjEyMzEzNDYsIC0wLjE4OTIxMzU4LCAwLjE3MTAwMzI0LCAtMC4wNDk2Mzg2MTIsIC0wLjE0NTcyODcsIDAuMzQ4NDc1MTIsIC0wLjQ4MzkyMDUxLAorICAgICAgMC41MDU2OTcxMiwgLTAuNDE3MDQzNDEsIDAuMjY2MTUzMzksIC0wLjExODUwNDYyLCAwLjAyNDY1MTA4NiwgMC4wMDE3OTQ3OTcsIDAuMDE3MTM3OTAxLCAtMC4wNDQwMDQ4NzUsCisgICAgICAwLjA1MDA4NTEyMiwgLTAuMDI5NzI5NjkzLCAtMC4wMDMyNjkzMzYsIDAuMDI5NjA3OTksIC0wLjAzNDcyMzM4MiwgMC4wMjA1NzI2ODMsIC0wLjAwMDY3MzU2MTc4LCAtMC4wMTIxODUyMDQsCisgICAgICAwLjAxMDU1NDA4NiwgLTAuMDAyMjQ2OTkyNCwgLTAuMDAzMTMwMjA1NSwgMC4wMDI4NDI3Njk4LCAtMC4wMDIzNzQ3MDE2LCAwLjAwMTk0MzgyMjksIDAuMDAxNjc3OTg0OCwgLTAuMDAwODgwNDgxNDMsCisgICAgICAtMS44OTQxMzY3ZS0xNywgMS41NzExMjkxZS0xOCwgMi4zNDUyODM2ZS0xOCwgLTMuODk5NTQ1ZS0xOCwgMy42Mjk2MDYxZS0xOCwgLTEuOTE1MTkwN2UtMTksIC00LjEwNjg1OTVlLTE5LCA5LjkxNTA1ODE5OTk5OTk5OWUtMTksCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIH0sCisgICAgeyAtOS4wODg5ODQzZS03LCAtMi4yNjI2Nzc2ZS03LCAwLjAwMDAwMTI2MDk3NywgMC4wMDAwMDQ0NjA4MDIxLCAtMC4wMDAwMDExNDY5NzIxLCAtMC4wMDAwMDU5MDk0MDgxLCAwLjAwMDAwNjEyODM2NjcsIDAuMDAwMDA2OTcyOTY0MywKKyAgICAgIC0wLjAwMDAwNjI5NzEyOSwgMy43NjM0NzI5ZS03LCAwLjAwMDAwMjk1MjQzNjIsIC0wLjAwMDAyMTkxMjA5LCAwLjAwMDAwNDM0MjQ3NDksIDAuMDAwMDUxMjYyMDI5LCAtMC4wMDAwMjk4NDU5NjMsIC0wLjAwMDE3Njg1MDMzLAorICAgICAgMC4wMDAxNTEyNjM2MywgMC4wMDAyMjYwNDI3MSwgLTAuMDAwMjc3Mzg0NTgsIC0wLjAwMDI2NTk2Mjg2LCAwLjAwMDU0Nzc5NDMzLCAwLjAwMDIxNTI1MjcxLCAtMC4wMDA5MjQ4NTk5NTk5OTk5OTk5LCAwLjAwMDI4MTE5MTgyLAorICAgICAgMC4wMDA5Mzk3OTE5OTk5OTk5OTk5LCAtMC4wMDA5NDg2MDYyNiwgLTAuMDAwOTMyNjg5MzMsIDAuMDAxODA5Mjc5LCAwLjAwMDQxODg1MDMyLCAtMC4wMDIxNDI0MzAyLCAwLjAwMDk3NjEzNTMxLCAwLjAwMDkwOTA1OTY1LAorICAgICAgLTAuMDAxODI4NzAyMSwgLTAuMDAxNjEyMTUwNCwgMC4wMDY5NDkxNTY1LCAtMC4wMDQwMzU2MDMxLCAtMC4wMDYyODYwMTA1LCAwLjAxODQwNDMyMiwgLTAuMDI1MTY1MywgMC4wMTIwMzgyOSwKKyAgICAgIDAuMDIzNzcyMDcxLCAtMC4wNjY2MDI3OCwgMC4wODQxNjIyMjE5OTk5OTk5OSwgLTAuMDU0Nzg1MDU3LCAtMC4wMjM4OTA4MDMsIDAuMTIzMTM0NiwgLTAuMTg5MjEzNTgsIDAuMTcxMDAzMjQsCisgICAgICAtMC4wNDk2Mzg2MTIsIC0wLjE0NTcyODcsIDAuMzQ4NDc1MTIsIC0wLjQ4MzkyMDUxLCAwLjUwNTY5NzEyLCAtMC40MTcwNDM0MSwgMC4yNjYxNTMzOSwgLTAuMTE4NTA0NjIsCisgICAgICAwLjAyNDY1MTA4NiwgMC4wMDE3OTQ3OTcsIDAuMDE3MTM3OTAxLCAtMC4wNDQwMDQ4NzUsIDAuMDUwMDg1MTIyLCAtMC4wMjk3Mjk2OTMsIC0wLjAwMzI2OTMzNiwgMC4wMjk2MDc5OSwKKyAgICAgIC0wLjAzNDcyMzM4MiwgMC4wMjA1NzI2ODMsIC0wLjAwMDY3MzU2MTc4LCAtMC4wMTIxODUyMDQsIDAuMDEwNTU0MDg2LCAtMC4wMDIyNDY5OTI0LCAtMC4wMDMxMzAyMDU1LCAwLjAwMjg0Mjc2OTgsCisgICAgICAtMC4wMDIzNzQ3MDE2LCAwLjAwMTk0MzgyMjksIDAuMDAxNjc3OTg0OCwgLTAuMDAwODgwNDgxNDMsIDYuMTg3ODc1NGUtMTgsIC0zLjY2NTU4NjZlLTE4LCAtMi45ODQxNzY4ZS0xOCwgMS45OTIyMTQ4ZS0xOCwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgfSwKKyAgICB7IDEuMzE0NDk3OGUtNywgOS44NjU3MTYxZS04LCAtMi4yMjUzMTgyZS03LCAtNS42MzMzNjA2ZS03LCAtOC45NDM0OTQyZS03LCAtMi41NzAxMTE1ZS03LCAwLjAwMDAwMTE4OTA1ODYsIDAuMDAwMDA0MzM5MzQxOCwKKyAgICAgIC0wLjAwMDAwMTI2NDYxODcsIC0wLjAwMDAwNTk0NjgzOTMsIDAuMDAwMDA2MTQ2NDUzNiwgMC4wMDAwMDY5ODQyOTc1LCAtMC4wMDAwMDYyODc2NzcsIDMuODIzNDAwNWUtNywgMC4wMDAwMDI5MTMwMDksIC0wLjAwMDAyMTk1NTY2NywKKyAgICAgIDAuMDAwMDA0Mzc0OTQzLCAwLjAwMDA1MTMwNTkwMSwgLTAuMDAwMDI5ODY4NjQzLCAtMC4wMDAxNzY4NzMwMSwgMC4wMDAxNTEyNzkxMywgMC4wMDAyMjYwNjIzOSwgLTAuMDAwMjc3Mzc0MTksIC0wLjAwMDI2NTk3NDk4LAorICAgICAgMC4wMDA1NDc3ODAxNywgMC4wMDAyMTUyNjE1OCwgLTAuMDAwOTI0ODU4NjYsIDAuMDAwMjgxMTgzMzcsIDAuMDAwOTM5NzkzOTgsIC0wLjAwMDk0ODYwMjg0LCAtMC4wMDA5MzI2ODc1MSwgMC4wMDE4MDkyNzkxLAorICAgICAgMC4wMDA0MTg4NDg1LCAtMC4wMDIxNDI0MjkxLCAwLjAwMDk3NjEzNjMyLCAwLjAwMDkwOTA1ODk1LCAtMC4wMDE4Mjg3MDIsIC0wLjAwMTYxMjE1MDUsIDAuMDA2OTQ5MTU2NywgLTAuMDA0MDM1NjAzMiwKKyAgICAgIC0wLjAwNjI4NjAxMDQsIDAuMDE4NDA0MzIyLCAtMC4wMjUxNjUzLCAwLjAxMjAzODI5LCAwLjAyMzc3MjA3MSwgLTAuMDY2NjAyNzgsIDAuMDg0MTYyMjIxOTk5OTk5OTksIC0wLjA1NDc4NTA1NywKKyAgICAgIC0wLjAyMzg5MDgwMywgMC4xMjMxMzQ2LCAtMC4xODkyMTM1OCwgMC4xNzEwMDMyNCwgLTAuMDQ5NjM4NjEyLCAtMC4xNDU3Mjg3LCAwLjM0ODQ3NTEyLCAtMC40ODM5MjA1MSwKKyAgICAgIDAuNTA1Njk3MTIsIC0wLjQxNzA0MzQxLCAwLjI2NjE1MzM5LCAtMC4xMTg1MDQ2MiwgMC4wMjQ2NTEwODYsIDAuMDAxNzk0Nzk3LCAwLjAxNzEzNzkwMSwgLTAuMDQ0MDA0ODc1LAorICAgICAgMC4wNTAwODUxMjIsIC0wLjAyOTcyOTY5MywgLTAuMDAzMjY5MzM2LCAwLjAyOTYwNzk5LCAtMC4wMzQ3MjMzODIsIDAuMDIwNTcyNjgzLCAtMC4wMDA2NzM1NjE3OCwgLTAuMDEyMTg1MjA0LAorICAgICAgMC4wMTA1NTQwODYsIC0wLjAwMjI0Njk5MjQsIC0wLjAwMzEzMDIwNTUsIDAuMDAyODQyNzY5OCwgLTAuMDAyMzc0NzAxNiwgMC4wMDE5NDM4MjI5LCAwLjAwMTY3Nzk4NDgsIC0wLjAwMDg4MDQ4MTQzLAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCB9LAorICAgIHsgMC4wLCAwLjAsIDAuMCwgMC4wLCAtMS42MjIzNTZlLTksIC0xLjI4OTAxMDNlLTksIDIuNzg5MTIxN2UtOSwgNi44NDUyNDFlLTksCisgICAgICAxLjMxMjY1NzhlLTcsIDkuOTAxNzIxOTAwMDAwMDAxZS04LCAtMi4yMTY2MTg2ZS03LCAtNS42MTgzNzU1ZS03LCAtOC45Mjg5Mzk0ZS03LCAtMi41NjU2MzA4ZS03LCAwLjAwMDAwMTE4ODgxMjIsIDAuMDAwMDA0MzM5MTYwMiwKKyAgICAgIC0wLjAwMDAwMTI2NDc4MDMsIC0wLjAwMDAwNTk0NjkwMTcsIDAuMDAwMDA2MTQ2OTc3MywgMC4wMDAwMDY5ODUwMzg5LCAtMC4wMDAwMDYyODc5Njc4LCAzLjgxNTg4MjhlLTcsIDAuMDAwMDAyOTEzMzY2MiwgLTAuMDAwMDIxOTU1NTE4LAorICAgICAgMC4wMDAwMDQzNzQ2OTQzLCAwLjAwMDA1MTMwNjE1OSwgLTAuMDAwMDI5ODY5MzY3LCAtMC4wMDAxNzY4NzM3NiwgMC4wMDAxNTEyODA1MSwgMC4wMDAyMjYwNjQwNCwgLTAuMDAwMjc3Mzc2MjQsIC0wLjAwMDI2NTk4MjU0LAorICAgICAgMC4wMDA1NDc3ODM5MywgMC4wMDAyMTUyNjcyMiwgLTAuMDAwOTI0ODY1MjcsIDAuMDAwMjgxMTk1MjksIDAuMDAwOTM5NzgwMDQsIC0wLjAwMDk0ODY0MTksIC0wLjAwMDkzMjY1MjI4LCAwLjAwMTgwOTQyMjksCisgICAgICAwLjAwMDQxODY3MjgzLCAtMC4wMDIxNDI2OTA2LCAwLjAwMDk3NjUwNDM2LCAwLjAwMDkwOTY0NTg2LCAtMC4wMDE4MjkzNTEzLCAtMC4wMDE2MTI2ODU1LCAwLjAwNjk1MDI5NDksIC0wLjAwNDAzNTQyNjIsCisgICAgICAtMC4wMDYyODcwNTc0LCAwLjAxODQwNTIyMiwgLTAuMDI1MTY0MTQ0LCAwLjAxMjAzMjgyNywgMC4wMjM3NzQzNDYsIC0wLjA2NjU5MTk0MiwgMC4wODQxNTE4NTQsIC0wLjA1NDgwNDYwMSwKKyAgICAgIC0wLjAyMzg2MjUwMywgMC4xMjMxNTY4OSwgLTAuMTg5MjU0MywgMC4xNzA5NTQ3NSwgLTAuMDQ5NTU5Mzc3LCAtMC4xNDU2Nzg4MiwgMC4zNDgzMTc5LCAtMC40ODM4OTMyLAorICAgICAgMC41MDU4ODAzMywgLTAuNDE3MTM5NzEsIDAuMjY2MDAyNTIsIC0wLjExODQxODg4LCAwLjAyNDg3MTU5MSwgMC4wMDE2MjEwNzIzLCAwLjAxNjg5MTQ2NiwgLTAuMDQzNjQwMjExLAorICAgICAgMC4wNTAwNTc4NDIsIC0wLjAzMDA2NTcxLCAtMC4wMDMwMzY3OTc0LCAwLjAyOTU1NjkxMSwgLTAuMDM0NTkwMDI3LCAwLjAyMDkyOTU2MywgLTAuMDAxMjk4MzU4OCwgLTAuMDEyNDE5OTk3LAorICAgICAgMC4wMTA5NTEyMDEsIC0wLjAwMjM4OTAyNSwgLTAuMDAzMTI2MjIxOCwgMC4wMDI4MTA1OTk3LCB9LAorICAgIHsgMC4wLCAwLjAsIDAuMCwgMC4wLCAtMy42NDM5MTMzZS0yNCwgLTIuODk4Njk3OWUtMjQsIDYuMjY2MDE0NmUtMjQsIDEuNTM3OTY5MmUtMjMsCisgICAgICAtMS42MjIyMDE2ZS05LCAtMS4yODg4ODc2ZS05LCAyLjc4ODg1NjJlLTksIDYuODQ0NTg5M2UtOSwgMS4zMTI1MjNlLTcsIDkuOTAwNzAwOWUtOCwgLTIuMjE2MzkwNmUtNywgLTUuNjE3Nzk5MWUtNywKKyAgICAgIC04LjkyNzI3NzFlLTcsIC0yLjU2NDc3MzJlLTcsIDAuMDAwMDAxMTg4NTYxOCwgMC4wMDAwMDQzMzgzOTk1LCAtMC4wMDAwMDEyNjUwMDI1LCAtMC4wMDAwMDU5NDYzMjc4LCAwLjAwMDAwNjE0Njc2NzIsIDAuMDAwMDA2OTg2MTc0MywKKyAgICAgIC0wLjAwMDAwNjI4OTc1NTUsIDMuNzcyNzk4OGUtNywgMC4wMDAwMDI5MTkxMzE0LCAtMC4wMDAwMjE5NDEzMDYsIDAuMDAwMDA0MzY4NzE5MiwgMC4wMDAwNTEyOTE2MjQsIC0wLjAwMDAyOTg1NTA1MSwgLTAuMDAwMTc2ODYxNzYsCisgICAgICAwLjAwMDE1MTI1MzA5LCAwLjAwMDIyNjA3NDcsIC0wLjAwMDI3NzM1NzQ1LCAtMC4wMDAyNjYwODU4MywgMC4wMDA1NDc5MTc4NCwgMC4wMDAyMTU1MTk4MiwgLTAuMDAwOTI1MTI2MTEsIDAuMDAwMjgwMzUzMjEsCisgICAgICAwLjAwMDk0MDY1ODYyLCAtMC4wMDA5NDc0MjIwNSwgLTAuMDAwOTM0NTA3NTcsIDAuMDAxODA3NjU0NSwgMC4wMDA0MjEzMTA1MiwgLTAuMDAyMTQxNzI3OCwgMC4wMDA5NzIzOTg1NCwgMC4wMDA5MTE1OTcyMiwKKyAgICAgIC0wLjAwMTgyNjQyMzksIC0wLjAwMTYxOTk3MjgsIDAuMDA2OTUwMjE1NCwgLTAuMDA0MDExNDEyMSwgLTAuMDA2MzA0MDMxNiwgMC4wMTgzNjU1MTYsIC0wLjAyNTExODY5MywgMC4wMTIxMDI1NzgsCisgICAgICAwLjAyMzY0NDM3NywgLTAuMDY2Njg1MTEzLCAwLjA4NDM1NjQwMSwgLTAuMDU0NTk1NTk2LCAtMC4wMjQxMjU1MjcsIDAuMTIzMDE4OTgsIC0wLjE4ODc3MjIsIDAuMTcwNjYwMTYsCisgICAgICAtMC4wNTA0MTk5MjEsIC0wLjE0NTI4OTA3LCAwLjM0OTEzNDEyLCAtMC40ODM4MzM1LCAwLjUwNTU4MzExLCAtMC40MTY0MzMzMSwgMC4yNjYxMzQ0NywgLTAuMTIxMDE4NDUsCisgICAgICAwLjAyNDYyNTE1NywgMC4wMDMzNTYwNzI2LCAwLjAxNjg0MTIxMiwgLTAuMDQxNzYwNDA4LCAwLjA1MDk4NDQwNywgLTAuMDMyODU0OTQsIC0wLjAwNDExNzU0NiwgMC4wMjg2MTc5NTEsCisgICAgICAtMC4wMzUyMzczNjksIDAuMDIzNzMyOTc3LCAwLjAwMTUyNDAxODQsIC0wLjAwODQzNTcwMTgwMDAwMDAwMSwgfSwKKyAgICB7IDAuMCwgMC4wLCAwLjAsIDAuMCwgLTEuMDQzMTgxMmUtMjMsIC04LjI4MDM3MzdlLTI0LCAxLjc5Mzk1MjJlLTIzLCA0LjQwMDc5MDRlLTIzLAorICAgICAgNi40ODg0MTAzZS0yMywgMS43NTI0NjM0ZS0yMywgLTguNTgwMzEwM2UtMjMsIC0zLjI0OTY5NDhlLTIyLCAtMS42MjAzODA2ZS05LCAtMS4yODc0NDA4ZS05LCAyLjc4NTcyNTZlLTksIDYuODM2OTA2ZS05LAorICAgICAgMS4zMTA5OTQ3ZS03LCA5Ljg4OTE1MDI5OTk5OTk5OWUtOCwgLTIuMjEzODA4MmUtNywgLTUuNjExMjYxZS03LCAtOC45MjE5ODg5ZS03LCAtMi41NjU4MzM1ZS03LCAwLjAwMDAwMTE4ODA1NDgsIDAuMDAwMDA0MzM1NDk5NSwKKyAgICAgIC0wLjAwMDAwMTI2MDgzMDEsIC0wLjAwMDAwNTkzODkxOCwgMC4wMDAwMDYxMzYyMzAxLCAwLjAwMDAwNjk2NDEzNzUsIC0wLjAwMDAwNjI2ODc5MDcsIDQuMDQ1OTQ2OGUtNywgMC4wMDAwMDI4Nzg3MDM0LCAtMC4wMDAwMjE5ODMzNzgsCisgICAgICAwLjAwMDAwNDQxMjkxMTUsIDAuMDAwMDUxMjg5OTM4LCAtMC4wMDAwMjk5MDU1OTUsIC0wLjAwMDE3NjY2MzU5LCAwLjAwMDE1MDg3MjExLCAwLjAwMDIyNTQyNzc1LCAtMC4wMDAyNzY1NDMzLCAtMC4wMDAyNjM3NjIyOCwKKyAgICAgIDAuMDAwNTQ1MDcxNDcsIDAuMDAwMjExNjk5MTIsIC0wLjAwMDkxOTI0NTU1LCAwLjAwMDI4ODQwMjQ5LCAwLjAwMDkzMDc5NjYyLCAtMC4wMDA5NTQ3MTI2NywgLTAuMDAwOTE3NzEwMTMsIDAuMDAxODA5NTAxOSwKKyAgICAgIDAuMDAwNDA3MDA0MzEsIC0wLjAwMjEyMzY5ODcsIDAuMDAwOTgxMTQ5ODE5OTk5OTk5OSwgMC4wMDA4MjQ1NDc1LCAtMC4wMDE3NzU0NDQ0LCAtMC4wMDE0NjQ0MDA4LCAwLjAwNjgwNDA0MTIsIC0wLjAwNDM0NTE0NDMsCisgICAgICAtMC4wMDU4NDQyOTkzLCAwLjAxODgxODAwMywgLTAuMDI1OTM5MTA5LCAwLjAxMTM0MDg5NSwgMC4wMjQ5MzAzODksIC0wLjA2NjEyMzQsIDAuMDgyMjE3Nzg1LCAtMC4wNTQwODE3NjQsCisgICAgICAtMC4wMjA4OTc1NDUsIDAuMTIxNjUwNDgsIC0wLjE5MjA3NDcsIDAuMTcyMTEzNTksIC0wLjA0ODE0MDgzMywgLTAuMTQ4NTEyNTYsIDAuMzQ3MjMzMywgLTAuNDc2NDYzOTcsCisgICAgICAwLjUwNTk5MzU0LCAtMC40MjI4ODU3NywgMC4yNjkxNzYwMSwgLTAuMTI0MzIzNjcsIDAuMDIyNTg3MTY5LCAwLjAxMDQxMjUxMSwgMC4wMTUzNTk5MDYsIC0wLjA0MTU2NTI1NywKKyAgICAgIDAuMDU1NDMxOTg4LCAtMC4wMzgxNjUxMzgsIC0wLjAwOTk4NTIwMzA5OTk5OTk5OSwgMC4wMTg2NzU1NzUsIH0sCisgICAgeyAwLjAsIDAuMCwgMC4wLCAwLjAsIDMuMjgxMjcyNWUtMjQsIDIuNTg0ODM2OGUtMjQsIC01LjYyNzUxOTNlLTI0LCAtMS4zNzgyMTUxZS0yMywKKyAgICAgIC0yLjM5MDI1NThlLTIzLCAtOC4xMzY1MjUxZS0yNCwgMy4zMDA4MjQxZS0yMywgMS4xNjQwODE1ZS0yMiwgLTcuMzI1MDI3N2UtMjMsIC0xLjg3NjI0MDFlLTIyLCAyLjI3MzAwODdlLTIyLCAzLjM3ODA2NzRlLTIyLAorICAgICAgLTEuNjE2MjA1ZS05LCAtMS4yODQxMjMxZS05LCAyLjc3ODU0N2UtOSwgNi44MTkyODc5ZS05LCAxLjMyMzc0ODJlLTcsIDkuOTkxODM4OGUtOCwgLTIuMjM1ODM2OGUtNywgLTUuNjY0ODY2NWUtNywKKyAgICAgIC04Ljk5MzI2OTZlLTcsIC0yLjU4MTY0ODJlLTcsIDAuMDAwMDAxMTk3MjE1NCwgMC4wMDAwMDQzNzIwNDM1LCAtMC4wMDAwMDEyOTI5NTIsIC0wLjAwMDAwNjAwODEwOTYsIDAuMDAwMDA2MjI2MzYzNiwgMC4wMDAwMDcxMjI5MzUsCisgICAgICAtMC4wMDAwMDYzOTg2NDg1LCAyLjY3MjQwNzZlLTcsIDAuMDAwMDAzMDkyOTIxNCwgLTAuMDAwMDIxOTQ2MjU3LCAwLjAwMDAwNDcyMDc1MzUsIDAuMDAwMDUyMDQ4OTg2LCAtMC4wMDAwMzA3NDIwNTksIC0wLjAwMDE4MDc2OTgxLAorICAgICAgMC4wMDAxNTU0NDMxOCwgMC4wMDAyMzI5MTEzOCwgLTAuMDAwMjg2NDQzMDMsIC0wLjAwMDI4MTc2MTI3LCAwLjAwMDU2NDQ3MDE1LCAwLjAwMDIzMTEyNzEsIC0wLjAwMDk1NDgzOTk4LCAwLjAwMDI3Mzc5NTkzLAorICAgICAgMC4wMDA5NjcyNTM4NiwgLTAuMDAwOTc3MTY3MSwgLTAuMDAwOTUzNjc4NTMsIDAuMDAxOTY1ODg3MywgMC4wMDAzMzkxMDgyNCwgLTAuMDAyNDE4MDUyNiwgMC4wMDEyMTM0NjY3LCAwLjAwMTUwMDk2OTcsCisgICAgICAtMC4wMDI2MDU3NDQyLCAtMC4wMDI0Mjc2MzM1LCAwLjAwODQxMjgyNTUsIC0wLjAwMjgxODgzNzUsIC0wLjAwODQ5NDQ4OTc5OTk5OTk5OSwgMC4wMTc3MjE4NzMsIC0wLjAyMTgyNTA5MywgMC4wMTA5NzA3NDUsCisgICAgICAwLjAxODU5NzY1NSwgLTAuMDY0MjgyODc2LCAwLjA4OTgxODczOTk5OTk5OTk5LCAtMC4wNTc4MTI5OTUsIC0wLjAyNjYyNzA0LCAwLjEyOTExNzcyLCAtMC4xODg1MTY4LCAwLjE1OTg1NDM2LAorICAgICAgLTAuMDUwMzYxOTE5LCAtMC4xMzU1NDQ1MiwgMC4zNDI2NDY4NSwgLTAuNDc1ODE3NDYsIDAuNTExNDQyNDgsIC0wLjQzMzI2NDc0LCAwLjI3MTAwODMsIC0wLjEyMjY1NzA0LAorICAgICAgMC4wMTU3MjkzNDIsIDAuMDE2MjYxMzA3LCAwLjAyNjA4OTY1MiwgLTAuMDI5MjQyNjU0LCB9LAorICAgIHsgMC4wLCAwLjAsIDAuMCwgMC4wLCAtMi4yNzc4OTU2ZS0yNCwgLTEuODA3NjQyNGUtMjQsIDMuOTI1MDg3OWUtMjQsIDkuNjEzNjMyNmUtMjQsCisgICAgICAyLjUyODI2OTJlLTIzLCAxLjI1NTA3NjdlLTIzLCAtMy43NjYwMzkyZS0yMywgLTEuMTc0MDc0N2UtMjIsIC0yLjk0Mzc5MjFlLTIzLCA5LjUxNDUwNDdlLTIzLCAtNC4yNzcwODA4ZS0yMywgMS40MjM5Mzk5ZS0yMiwKKyAgICAgIDEuOTI4NjcwOGUtMjMsIC00LjAzNDIxN2UtMjIsIDMuNjU1MzU4NGUtMjIsIDkuNzMwNTUzOGUtMjIsIC0xLjQ0MzE5MzRlLTksIC0xLjE0NjY2MDNlLTksIDIuNDgxMTA5ZS05LCA2LjA4OTI5NjVlLTksCisgICAgICAxLjI2MzM0NThlLTcsIDkuNTY4MjAyNDk5OTk5OTk5ZS04LCAtMi4xMzYyNjhlLTcsIC01LjQwMTQ5MzllLTcsIC04LjcwOTUwODRlLTcsIC0yLjU4MDI2NjFlLTcsIDAuMDAwMDAxMTY1Njk2LCAwLjAwMDAwNDIzMDUxMiwKKyAgICAgIC0wLjAwMDAwMTIxNDY2MzYsIC0wLjAwMDAwNTc2MzIzNTIsIDAuMDAwMDA1OTQxMDM2MiwgMC4wMDAwMDY2NTIzODYsIC0wLjAwMDAwNTk1NDkwNjQsIDYuNTQwNDc0NmUtNywgMC4wMDAwMDI0NjA1MTE0LCAtMC4wMDAwMjIxMzQ3ODYsCisgICAgICAwLjAwMDAwMzcwMjY3OTgsIDAuMDAwMDQ5NzEwNTI1LCAtMC4wMDAwMjgxNjc3NDgsIC0wLjAwMDE2NzIzNTA5LCAwLjAwMDE0NDAxNTg0LCAwLjAwMDIxMTIxNjk5LCAtMC4wMDAyNjAyMDQ5NCwgLTAuMDAwMjM4OTYwMTYsCisgICAgICAwLjAwMDUyMTY4MTk1LCAwLjAwMDE5NTg5MzYsIC0wLjAwMDg4MjA1ODU0LCAwLjAwMDI1NDY4ODIsIDAuMDAwOTAwODk5NTA5OTk5OTk5OSwgLTAuMDAwODUzNTQ1NTcsIC0wLjAwMDkyOTE2OTExLCAwLjAwMTUwMTY3MjEsCisgICAgICAwLjAwMDU0NDA3Njk3LCAtMC4wMDE3NTYxMzI3LCAwLjAwMDY2MDI5MzYsIDAuMDAwNDgwNzY3MTEsIC0wLjAwMDcxOTc0NDcxLCAtMC4wMDA5Nzk4ODczNDk5OTk5OTk5LCAwLjAwNDk5Njk0ODksIC0wLjAwNDc2NTE2OSwKKyAgICAgIC0wLjAwNDg3MjQ2OTIsIDAuMDE3NTk0OTU1LCAtMC4wMjY2NjE5NTcsIDAuMDE1ODg1ODk1LCAwLjAyNzQ3NjY1NSwgLTAuMDcwMDU0NzM5LCAwLjA4MTQzNzkyMywgLTAuMDU2MDQ0NDk4LAorICAgICAgLTAuMDI3MDg3OTYzLCAwLjEyMzMwNzYxLCAtMC4xODMzMTQ1NCwgMC4xNzc5NjEwOSwgLTAuMDQ5ODA3NzQ5LCAtMC4xNDgxNDM4OCwgMC4zMzY0MjA5OSwgLTAuNDkwMTY5ODYsCisgICAgICAwLjUxNDM0NDA4LCAtMC40MTQ4NjQ0MywgMC4yNzY3MjYzNSwgLTAuMTA0MzIwNTQsIH0sCit9OworCitjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzIwXzg0XzFbMjBdID0geworICAgIHRhYnNfMjBfODRbIDBdLCB0YWJzXzIwXzg0WyAxXSwgdGFic18yMF84NFsgMl0sIHRhYnNfMjBfODRbIDNdLAorICAgIHRhYnNfMjBfODRbIDRdLCB0YWJzXzIwXzg0WyA1XSwgdGFic18yMF84NFsgNl0sIHRhYnNfMjBfODRbIDddLAorICAgIHRhYnNfMjBfODRbIDhdLCB0YWJzXzIwXzg0WyA5XSwgdGFic18yMF84NFsxMF0sIHRhYnNfMjBfODRbMTFdLAorICAgIHRhYnNfMjBfODRbMTJdLCB0YWJzXzIwXzg0WzEzXSwgdGFic18yMF84NFsxNF0sIHRhYnNfMjBfODRbMTVdLAorICAgIHRhYnNfMjBfODRbMTZdLCB0YWJzXzIwXzg0WzE3XSwgdGFic18yMF84NFsxOF0sIHRhYnNfMjBfODRbMTldCit9OworCitjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzIwXzg0XzJbMjBdID0geworICAgIHRhYnNfMjBfODRbMjBdLCB0YWJzXzIwXzg0WzIxXSwgdGFic18yMF84NFsyMl0sIHRhYnNfMjBfODRbMjNdLAorICAgIHRhYnNfMjBfODRbMjRdLCB0YWJzXzIwXzg0WzI1XSwgdGFic18yMF84NFsyNl0sIHRhYnNfMjBfODRbMjddLAorICAgIHRhYnNfMjBfODRbMjhdLCB0YWJzXzIwXzg0WzI5XSwgdGFic18yMF84NFszMF0sIHRhYnNfMjBfODRbMzFdLAorICAgIHRhYnNfMjBfODRbMzJdLCB0YWJzXzIwXzg0WzMzXSwgdGFic18yMF84NFszNF0sIHRhYnNfMjBfODRbMzVdLAorICAgIHRhYnNfMjBfODRbMzZdLCB0YWJzXzIwXzg0WzM3XSwgdGFic18yMF84NFszOF0sIHRhYnNfMjBfODRbMzldCit9OworCitjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzIwXzg0XzNbMjBdID0geworICAgIHRhYnNfMjBfODRbNDBdLCB0YWJzXzIwXzg0WzQxXSwgdGFic18yMF84NFs0Ml0sIHRhYnNfMjBfODRbNDNdLAorICAgIHRhYnNfMjBfODRbNDRdLCB0YWJzXzIwXzg0WzQ1XSwgdGFic18yMF84NFs0Nl0sIHRhYnNfMjBfODRbNDddLAorICAgIHRhYnNfMjBfODRbNDhdLCB0YWJzXzIwXzg0WzQ5XSwgdGFic18yMF84NFs1MF0sIHRhYnNfMjBfODRbNTFdLAorICAgIHRhYnNfMjBfODRbNTJdLCB0YWJzXzIwXzg0WzUzXSwgdGFic18yMF84NFs1NF0sIHRhYnNfMjBfODRbNTVdLAorICAgIHRhYnNfMjBfODRbNTZdLCB0YWJzXzIwXzg0WzU3XSwgdGFic18yMF84NFs1OF0sIHRhYnNfMjBfODRbNTldCit9OworCitjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzIwXzg0XzRbMjBdID0geworICAgIHRhYnNfMjBfODRbNjBdLCB0YWJzXzIwXzg0WzYxXSwgdGFic18yMF84NFs2Ml0sIHRhYnNfMjBfODRbNjNdLAorICAgIHRhYnNfMjBfODRbNjRdLCB0YWJzXzIwXzg0WzY1XSwgdGFic18yMF84NFs2Nl0sIHRhYnNfMjBfODRbNjddLAorICAgIHRhYnNfMjBfODRbNjhdLCB0YWJzXzIwXzg0WzY5XSwgdGFic18yMF84NFs3MF0sIHRhYnNfMjBfODRbNzFdLAorICAgIHRhYnNfMjBfODRbNzJdLCB0YWJzXzIwXzg0WzczXSwgdGFic18yMF84NFs3NF0sIHRhYnNfMjBfODRbNzVdLAorICAgIHRhYnNfMjBfODRbNzZdLCB0YWJzXzIwXzg0Wzc3XSwgdGFic18yMF84NFs3OF0sIHRhYnNfMjBfODRbNzldCit9OworCitjb25zdCBmbG9hdCBmZl9vbjJhdmNfY3RhYl8xWzIwNDhdID0geworICAgIDIuMCwgLTQuNDQwODkyMWUtMTYsIDEuOTk4ODYzLCAtMC4wNjc0Mjk0MDgsIDEuOTk1NDUyMiwgLTAuMTM0Nzk2OTksIDEuOTg5NzY4NCwgLTAuMjAyMDQwNjQsCisgICAgMS45ODE4MTMzLCAtMC4yNjkwOTc3MiwgMS45NzE1ODkyLCAtMC4zMzU5MDQ4MSwgMS45NTkwOTkyLCAtMC40MDIzOTc0OCwgMS45NDQzNDc2LCAtMC40Njg1MTAwMywKKyAgICAxLjkyNzM0MDQsIC0wLjUzNDE3NTQsIDEuOTA4MDg0OCwgLTAuNTk5MzI0ODgsIDEuODg2NTg5OSwgLTAuNjYzODg4MjgsIDEuODYyODY3NSwgLTAuNzI3NzkzNTEsCisgICAgMS44MzY5MzE3LCAtMC43OTA5NjY3NSwgMS44MDg3OTk1LCAtMC44NTMzMzI1OCwgMS43Nzg0OTE0LCAtMC45MTQ4MTM4MiwgMS43NDYwMzE0LCAtMC45NzUzMzE5LAorICAgIDEuNzExNDQ3NiwgLTEuMDM0ODA2OCwgMS42NzQ3NzI3LCAtMS4wOTMxNTc4LCAxLjYzNjA0MzksIC0xLjE1MDMwMjksIDEuNTk1MzAzNCwgLTEuMjA2MTU5OSwKKyAgICAxLjU1MjU5ODgsIC0xLjI2MDY0NjcsIDEuNTA3OTgzMywgLTEuMzEzNjgxMiwgMS40NjE1MTU4LCAtMS4zNjUxODI4LCAxLjQxMzI2MDgsIC0xLjQxNTA3MTYsCisgICAgMS4zNjMyODk1LCAtMS40NjMyNjk5LCAxLjMxMTY3ODUsIC0xLjUwOTcwMjYsIDEuMjU4NTEwNywgLTEuNTU0Mjk3NCwgMS4yMDM4NzUxLCAtMS41OTY5ODYxLAorICAgIDEuMTQ3ODY2MiwgLTEuNjM3NzA0LCAxLjA5MDU4NDYsIC0xLjY3NjM5MjEsIDEuMDMyMTM2MiwgLTEuNzEyOTk2MiwgMC45NzI2MzE2OSwgLTEuNzQ3NDY4NywKKyAgICAwLjkxMjE4NjgsIC0xLjc3OTc2NzksIDAuODUwOTIxNTcsIC0xLjgwOTg1OTYsIDAuNzg4OTU5NzQsIC0xLjgzNzcxNzEsIDAuNzI2NDI4NDUsIC0xLjg2MzMyMTQsCisgICAgMC42NjM0NTczOSwgLTEuODg2NjYyMSwgMC42MDAxNzg1NCwgLTEuOTA3NzM3NCwgMC41MzY3MjUxLCAtMS45MjY1NTQxLCAwLjQ3MzIzMTE0LCAtMS45NDMxMjgyLAorICAgIDAuNDA5ODMwNiwgLTEuOTU3NDg0NiwgMC4zNDY2NTY4MywgLTEuOTY5NjU3NywgMC4yODM4NDE1NSwgLTEuOTc5NjkwMywgMC4yMjE1MTQyOCwgLTEuOTg3NjM0NSwKKyAgICAwLjE1OTgwMTU2LCAtMS45OTM1NTEsIDAuMDk4ODI2MTEsIC0xLjk5NzUwODQsIDAuMDM4NzA2MjA2LCAtMS45OTk1ODM1LCAtMC4wMjA0NDUwOSwgLTEuOTk5ODYsCisgICAgLTAuMDc4NTIwNTk2LCAtMS45OTg0Mjg4LCAtMC4xMzU0MTk2NCwgLTEuOTk1Mzg2NiwgLTAuMTkxMDQ4NjUsIC0xLjk5MDgzNTQsIC0wLjI0NTMyMTcxLCAtMS45ODQ4ODIsCisgICAgLTAuMjk4MTYxMDMsIC0xLjk3NzYzNjcsIC0wLjM0OTQ5NzQ0LCAtMS45NjkyMTI1LCAtMC4zOTkyNzA2MiwgLTEuOTU5NzI0MywgLTAuNDQ3NDI5NTcsIC0xLjk0OTI4OCwKKyAgICAtMC40OTM5MzI3NSwgLTEuOTM4MDE5LCAtMC41Mzg3NDgyLCAtMS45MjYwMzE3LCAtMC41ODE4NTM3NSwgLTEuOTEzNDM4MiwgLTAuNjIzMjM3MDcsIC0xLjkwMDM0NywKKyAgICAtMC42NjI4OTUzOCwgLTEuODg2ODYyOSwgLTAuNzAwODM1NzYsIC0xLjg3MzA4NDgsIC0wLjczNzA3NDU1LCAtMS44NTkxMDU3LCAtMC43NzE2Mzc2MiwgLTEuODQ1MDExNSwKKyAgICAtMC44MDQ1NTk1OSwgLTEuODMwODgsIC0wLjgzNTg4Mzg2LCAtMS44MTY3ODA4LCAtMC44NjU2NjIxLCAtMS44MDI3NzM3LCAtMC44OTM5NTM3NCwgLTEuNzg4OTA5MywKKyAgICAtMC45MjA4MjU2LCAtMS43NzUyMjc4LCAtMC45NDYzNTEzNSwgLTEuNzYxNzU5LCAtMC45NzA2MTA5MiwgLTEuNzQ4NTIyOCwgLTAuOTkzNjg5NjYsIC0xLjczNTUyNzgsCisgICAgLTEuMDE1Njc3OSwgLTEuNzIyNzcyOCwgLTEuMDM2NjcwMywgLTEuNzEwMjQ3LCAtMS4wNTY3NjQ3LCAtMS42OTc5Mjk1LCAtMS4wNzYwNjE1LCAtMS42ODU3OTExLAorICAgIC0xLjA5NDY2MjcsIC0xLjY3Mzc5NCwgLTEuMTEyNjcxLCAtMS42NjE4OTM3LCAtMS4xMzAxODkyLCAtMS42NTAwMzksIC0xLjE0NzMxODIsIC0xLjYzODE3MzYsCisgICAgLTEuMTY0MTU3LCAtMS42MjYyMzczLCAtMS4xODA4MDA5LCAtMS42MTQxNjY5LCAtMS4xOTczNDA1LCAtMS42MDE4OTc2LCAtMS4yMTM4NjExLCAtMS41ODkzNjQ1LAorICAgIC0xLjIzMDQ0MDYsIC0xLjU3NjUwMzIsIC0xLjI0NzE0OTMsIC0xLjU2MzI1MTcsIC0xLjI2NDA0ODEsIC0xLjU0OTU1MTIsIC0xLjI4MTE4NzgsIC0xLjUzNTM0NzUsCisgICAgLTEuMjk4NjA3NywgLTEuNTIwNTkxNCwgLTEuMzE2MzM1MiwgLTEuNTA1MjQwMywgLTEuMzM0Mzg0MiwgLTEuNDg5MjU4OCwgLTEuMzUyNzU1MSwgLTEuNDcyNjE4OCwKKyAgICAtMS4zNzE0MzMxLCAtMS40NTUzMDA3LCAtMS4zOTAzODksIC0xLjQzNzI5MzMsIC0xLjQwOTU3NzQsIC0xLjQxODU5MzgsIC0xLjQyODkzNzYsIC0xLjM5OTIwODEsCisgICAgLTEuNDQ4MzkzMSwgLTEuMzc5MTUwNCwgLTEuNDY3ODUxOCwgLTEuMzU4NDQyOSwgLTEuNDg3MjA2NiwgLTEuMzM3MTE1MywgLTEuNTA2MzM1OSwgLTEuMzE1MjAzOSwKKyAgICAtMS41MjUxMDQsIC0xLjI5Mjc1MDgsIC0xLjU0MzM2MzMsIC0xLjI2OTgwMzYsIC0xLjU2MDk1NDIsIC0xLjI0NjQxMzYsIC0xLjU3NzcwNzQsIC0xLjIyMjYzNSwKKyAgICAtMS41OTM0NDU4LCAtMS4xOTg1MjQsIC0xLjYwNzk4NTMsIC0xLjE3NDEzNzYsIC0xLjYyMTEzODEsIC0xLjE0OTUzMjEsIC0xLjYzMjcxMzksIC0xLjEyNDc2MjcsCisgICAgLTEuNjQyNTIyOSwgLTEuMDk5ODgxNSwgLTEuNjUwMzc3OCwgLTEuMDc0OTM3OSwgLTEuNjU2MDk2LCAtMS4wNDk5NzY1LCAtMS42NTk1MDI3LCAtMS4wMjUwMzY2LAorICAgIC0xLjY2MDQzMjgsIC0xLjAwMDE1MjEsIC0xLjY1ODczMzcsIC0wLjk3NTM1MDk4LCAtMS42NTQyNjc0LCAtMC45NTA2NTQyNywgLTEuNjQ2OTEyOCwgLTAuOTI2MDc2NzcsCisgICAgLTEuNjM2NTY3NCwgLTAuOTAxNjI2NTksIC0xLjYyMzE0OTksIC0wLjg3NzMwNTQ1LCAtMS42MDY2MDExLCAtMC44NTMxMDkxOCwgLTEuNTg2ODg1OSwgLTAuODI5MDI4MDcsCisgICAgLTEuNTYzOTk0MiwgLTAuODA1MDQ3NTcsIC0xLjUzNzk0MTIsIC0wLjc4MTE0OTA5LCAtMS41MDg3NjkyLCAtMC43NTczMTA5OSwgLTEuNDc2NTQ2MywgLTAuNzMzNTA5NDIsCisgICAgLTEuNDQxMzY3MywgLTAuNzA5NzE5NDgsIC0xLjQwMzM1MjksIC0wLjY4NTkxNjQyLCAtMS4zNjI2NDg3LCAtMC42NjIwNzY0NywgLTEuMzE5NDI0MywgLTAuNjM4MTc4MjksCisgICAgLTEuMjczODcxNCwgLTAuNjE0MjAzODcsIC0xLjIyNjIwMjYsIC0wLjU5MDEzOTYzLCAtMS4xNzY2NDg5LCAtMC41NjU5NzcyMiwgLTEuMTI1NDU3NCwgLTAuNTQxNzE0NjEsCisgICAgLTEuMDcyODg5MiwgLTAuNTE3MzU2MzQsIC0xLjAxOTIxNTgsIC0wLjQ5MjkxNDUzLCAtMC45NjQ3MTczOSwgLTAuNDY4NDA5LCAtMC45MDk2Nzg4OCwgLTAuNDQzODY3NDcsCisgICAgLTAuODU0Mzg3NTIsIC0wLjQxOTMyNTcxLCAtMC43OTkxMjk2NiwgLTAuMzk0ODI3MjIsIC0wLjc0NDE4NzY1LCAtMC4zNzA0MjMwNSwgLTAuNjg5ODM3MjgsIC0wLjM0NjE3MTE3LAorICAgIC0wLjYzNjM0NDU1LCAtMC4zMjIxMzU4NywgLTAuNTgzOTYzNDUsIC0wLjI5ODM4Njg0LCAtMC41MzI5MzMwNiwgLTAuMjc0OTk4MjgsIC0wLjQ4MzQ3NTcxLCAtMC4yNTIwNDc3OCwKKyAgICAtMC40MzU3OTQ4OSwgLTAuMjI5NjE1MDksIC0wLjM5MDA3MzQyLCAtMC4yMDc3ODA5NCwgLTAuMzQ2NDcyMTcsIC0wLjE4NjYyNTY5LCAtMC4zMDUxMjg5NiwgLTAuMTY2MjI3OTUsCisgICAgLTAuMjY2MTU3NzUsIC0wLjE0NjY2MzMyLCAtMC4yMjk2NDgyMywgLTAuMTI4MDAzMDMsIC0wLjE5NTY2NTY2LCAtMC4xMTAzMTI3MywgLTAuMTY0MjUxMSwgLTAuMDkzNjUxMjk1LAorICAgIC0wLjEzNTQyMTk4LCAtMC4wNzgwNjk3ODQsIC0wLjEwOTE3Mjc0LCAtMC4wNjM2MTA0NzksIC0wLjA4NTQ3NjA5MywgLTAuMDUwMzA2MTM4LCAtMC4wNjQyODQyMzUsIC0wLjAzODE3OTMzOCwKKyAgICAtMC4wNDU1MzA0MiwgLTAuMDI3MjQyMDUsIC0wLjAyOTEzMDcwMywgLTAuMDE3NDk1Mzg0LCAtMC4wMTQ5ODU4MDgsIC0wLjAwODkyOTUzODUsIC0wLjAwMjk4MzE0MjksIC0wLjAwMTUyMzkyNTIsCisgICAgMC4wMDcwMDExMzM2LCAwLjAwNDc1MjQ4OTMsIDAuMDE1MDk5OTg3LCAwLjAwOTk0MDY2NjEsIDAuMDIxNDUzMzkyLCAwLjAxNDA5MDgwMywgMC4wMjYyMDYyMzYsIDAuMDE3MjYxNDg1LAorICAgIDAuMDI5NTA2MzAyLCAwLjAxOTUxODY4OCwgMC4wMzE1MDIzNCwgMC4wMjA5MzQ2NzcsIDAuMDMyMzQyMjc0LCAwLjAyMTU4NjgwOSwgMC4wMzIxNzE1MjUsIDAuMDIxNTU2MjY0LAorICAgIDAuMDMxMTMxNTU0LCAwLjAyMDkyNjc1NSwgMC4wMjkzNTg1MTQsIDAuMDE5NzgzMjA4LCAwLjAyNjk4MjE0NSwgMC4wMTgyMTA0ODYsIDAuMDI0MTI0ODQ2LCAwLjAxNjI5MjEzOCwKKyAgICAwLjAyMDkwMDkxMywgMC4wMTQxMDkyMzMsIDAuMDE3NDE1OTk5LCAwLjAxMTczOTI4MSwgMC4wMTM3NjY3MzcsIDAuMDA5MjU1MjY1OCwgMC4wMTAwNDA1MjQsIDAuMDA2NzI0ODA5MywKKyAgICAwLjAwNjMxNTQ3MywgMC4wMDQyMDk0NzI4LCAwLjAwMjY2MDQ4NTksIDAuMDAxNzY0MjEwMSwgLTAuMDAwODY0NTM5ODgsIC0wLjAwMDU2MzAzMDQyLCAtMC4wMDQyMDg0MTMsIC0wLjAwMjczMTU0NzcsCisgICAgLTAuMDA3MzI4MjY0NCwgLTAuMDA0NzA3OTg0MiwgLTAuMDEwMTg5MTAzLCAtMC4wMDY0NjYyNzY1LCAtMC4wMTI3NjMzMiwgLTAuMDA3OTg3NDc2OSwgLTAuMDE1MDMwMTY4LCAtMC4wMDkyNTk0NTQsCisgICAgLTAuMDE2OTc1MjIyLCAtMC4wMTAyNzY0OSwgLTAuMDE4NTg5ODM2LCAtMC4wMTEwMzg3OSwgLTAuMDE5ODcwNjA1LCAtMC4wMTE1NTE5MjUsIC0wLjAyMDgxODg1MiwgLTAuMDExODI2MjEyLAorICAgIC0wLjAyMTQ0MDEwNywgLTAuMDExODc2MDcxLCAtMC4wMjE3NDM2NSwgLTAuMDExNzE5MzYyLCAtMC4wMjE3NDIwMzgsIC0wLjAxMTM3NjcxMywgLTAuMDIxNDUwNjg3LCAtMC4wMTA4NzA4NjYsCisgICAgLTAuMDIwODg3NDU3LCAtMC4wMTAyMjYwNDEsIC0wLjAyMDA3MjI3NiwgLTAuMDA5NDY3MzQzOCwgLTAuMDE5MDI2NzY0LCAtMC4wMDg2MjAyMDA3LCAtMC4wMTc3NzM4OTgsIC0wLjAwNzcwOTg1MzQsCisgICAgLTAuMDE2MzM3NjY5LCAtMC4wMDY3NjA4OTQ4LCAtMC4wMTQ3NDI3NjksIC0wLjAwNTc5Njg2MjgsIC0wLjAxMzAxNDI4NSwgLTAuMDA0ODM5ODg1NSwgLTAuMDExMTc3NDAzLCAtMC4wMDM5MTAzNzcyLAorICAgIC0wLjAwOTI1NzEzMzEsIC0wLjAwMzAyNjc4ODQsIC0wLjAwNzI3ODA0OTQsIC0wLjAwMjIwNTQwNCwgLTAuMDA1MjY0MDQzMywgLTAuMDAxNDYwMTg3MSwgLTAuMDAzMjM4MTAzOCwgLTAuMDAwODAyNjcwNDksCisgICAgLTAuMDAxMjIyMTE0OSwgLTAuMDAwMjQxODkwOTMsIDAuMDAwNzYzMzE0ODksIDAuMDAwMjE1NjM0MTgsIDAuMDAyNjk4OTk5OCwgMC4wMDA1NjU4ODk0NywgMC4wMDQ1NjcyOTQ0LCAwLjAwMDgwNzMwNDI4LAorICAgIDAuMDA2MzUyMTgyOSwgMC4wMDA5NDA2NTY5MywgMC4wMDgwMzkzMzk0LCAwLjAwMDk2ODk0MTg5LCAwLjAwOTYxNjE2MzYsIDAuMDAwODk3MjAyMDYsIDAuMDExMDcxNzk0LCAwLjAwMDczMjMyODI4LAorICAgIDAuMDEyMzk3MDk2LCAwLjAwMDQ4MjgzMDA0LCAwLjAxMzU4NDY0NSwgMC4wMDAxNTg1ODExMSwgMC4wMTQ2Mjg2NzksIC0wLjAwMDIyOTQ1NDEyLCAwLjAxNTUyNTA2MywgLTAuMDAwNjY5NTA4MDcsCisgICAgMC4wMTYyNzEyMzksIC0wLjAwMTE0OTMwNDEsIDAuMDE2ODY2MTY0LCAtMC4wMDE2NTYzNDk5LCAwLjAxNzMxMDI3MSwgLTAuMDAyMTc4MjIyOSwgMC4wMTc2MDU0MDcsIC0wLjAwMjcwMjg0MTEsCisgICAgMC4wMTc3NTQ3OTEsIC0wLjAwMzIxODcwODgsIDAuMDE3NzYyOTUzLCAtMC4wMDM3MTUxMzg0LCAwLjAxNzYzNTY5MiwgLTAuMDA0MTgyNDMzMiwgMC4wMTczODAwMDEsIC0wLjAwNDYxMjAzNzksCisgICAgMC4wMTcwMDQwMTcsIC0wLjAwNDk5NjY0NDMsIDAuMDE2NTE2OTMxLCAtMC4wMDUzMzAyNjMyLCAwLjAxNTkyODkwNSwgLTAuMDA1NjA4MjUwNCwgMC4wMTUyNTA5NTQsIC0wLjAwNTgyNzMwMTIsCisgICAgMC4wMTQ0OTQ4MjksIC0wLjAwNTk4NTQwOTUsIDAuMDEzNjcyODY3LCAtMC4wMDYwODE4MDA5LCAwLjAxMjc5NzgzMSwgLTAuMDA2MTE2ODQwNSwgMC4wMTE4ODI3MzIsIC0wLjAwNjA5MTkyNzYsCisgICAgMC4wMTA5NDA2MzcsIC0wLjAwNjAwOTM4MDMsIDAuMDA5OTg0NDcxOCwgLTAuMDA1ODcyMzEzOSwgMC4wMDkwMjY4MTA1LCAtMC4wMDU2ODQ1MjQzLCAwLjAwODA3OTY3ODgsIC0wLjAwNTQ1MDM3MzUsCisgICAgMC4wMDcxNTQzNTQ0LCAtMC4wMDUxNzQ2ODksIDAuMDA2MjYxMTg5LCAtMC4wMDQ4NjI2NzEzLCAwLjAwNTQwOTQ0MTQsIC0wLjAwNDUxOTgxOTMsIDAuMDA0NjA3MTQzMywgLTAuMDA0MTUxODY0OSwKKyAgICAwLjAwMzg2MDk4OTEsIC0wLjAwMzc2NDcyMzksIDAuMDAzMTc2MjU5NiwgLTAuMDAzMzY0NDU3NSwgMC4wMDI1NTY3ODM4LCAtMC4wMDI5NTcyNDExLCAwLjAwMjAwNDkzNDcsIC0wLjAwMjU0OTM0LAorICAgIDAuMDAxNTIxNjYzMywgLTAuMDAyMTQ3MDg4MSwgMC4wMDExMDY1Njg2LCAtMC4wMDE3NTY4NjQ0LCAwLjAwMDc1ODAwMDY1LCAtMC4wMDEzODUwNjYxLCAwLjAwMDQ3MzE5MzUsIC0wLjAwMTAzODA3NTUsCisgICAgMC4wMDAyNDg0MjQzMywgLTAuMDAwNzIyMjE1ODYsIDAuMDAwMDc5MTkyODQsIC0wLjAwMDQ0MzY5NjcxLCAtMC4wMDAwMzk1ODQ1MzUsIC0wLjAwMDIwODU0NjEyLCAtMC4wMDAxMTMzNzE1LCAtMC4wMDAwMjI1Mjk2NzIsCisgICAgLTAuMDAwMTQ3ODA2NywgMC4wMDAxMDg5NDQsIC0wLjAwMDE0ODUwMjQ3LCAwLjAwMDE4MDkzMDA0LCAtMC4wMDAxMjA4NTQyLCAwLjAwMDE4OTA2NTE1LCAtMC4wMDAwNjk4NjYyMjYsIDAuMDAwMTI5NjkzNzQsCisgICAgLTIuMjIwNDQ2ZS0xNiwgLTUuNTUxMTE1MWUtMTcsIDAuMDAwMDg0OTUwMzQxLCAtMC4wMDAyMDE4NTgxNywgMC4wMDAxODE5NTA1NywgLTAuMDAwNDc2NjE3MjIsIDAuMDAwMjg4NzgzNTQsIC0wLjAwMDgyMzc4MjcsCisgICAgMC4wMDA0MDQwNjgzMywgLTAuMDAxMjQxNTE1NywgMC4wMDA1MjcyMzk2NCwgLTAuMDAxNzI2NTM2OSwgMC4wMDA2NTg0ODc1NSwgLTAuMDAyMjc0MDUyMiwgMC4wMDA3OTg2NTgwNiwgLTAuMDAyODc3NzA4MSwKKyAgICAwLjAwMDk0OTExNzY1LCAtMC4wMDM1Mjk1Nzg5LCAwLjAwMTExMTU4NDcsIC0wLjAwNDIyMDE5NTEsIDAuMDAxMjg3OTM0MywgLTAuMDA0OTM4NjEyNywgMC4wMDE0Nzk5ODIzLCAtMC4wMDU2NzI1Mjg5LAorICAgIDAuMDAxNjg5MjU3OSwgLTAuMDA2NDA4NDUwMiwgMC4wMDE5MTY3NzIxLCAtMC4wMDcxMzE5MDY3LCAwLjAwMjE2Mjc5NSwgLTAuMDA3ODI3NzE1OSwgMC4wMDI0MjY2NTA0LCAtMC4wMDg0ODAyOTU1LAorICAgIDAuMDAyNzA2NTM4NywgLTAuMDA5MDc0MDE0NiwgMC4wMDI5OTk0MDE0LCAtMC4wMDk1OTM1ODI3LCAwLjAwMzMwMDgzNDQsIC0wLjAxMDAyNDQ1OSwgMC4wMDM2MDUwNTc3LCAtMC4wMTAzNTMyOCwKKyAgICAwLjAwMzkwNDk1MiwgLTAuMDEwNTY4Mjg1LCAwLjAwNDE5MjE2NDYsIC0wLjAxMDY1OTczMywgMC4wMDQ0NTcyODI0LCAtMC4wMTA2MjAyNzksIDAuMDA0NjkwMDc4NiwgLTAuMDEwNDQ1MzIsCisgICAgMC4wMDQ4Nzk4MjAyLCAtMC4wMTAxMzMyNjYsIDAuMDA1MDE1NjMwNywgLTAuMDA5Njg1NzQzNiwgMC4wMDUwODY4OTkzLCAtMC4wMDkxMDc3MTE3LCAwLjAwNTA4MzcxODMsIC0wLjAwODQwNzQ3MDgsCisgICAgMC4wMDQ5OTczMzE2LCAtMC4wMDc1OTY1NzMzLCAwLjAwNDgyMDU4MTEsIC0wLjAwNjY4OTYyMjEsIDAuMDA0NTQ4MzE4NywgLTAuMDA1NzAzOTYzMywgMC4wMDQxNzc3ODEzLCAtMC4wMDQ2NTkyNzM3LAorICAgIDAuMDAzNzA4ODkzNCwgLTAuMDAzNTc3MDU2NiwgMC4wMDMxNDQ0ODk0LCAtMC4wMDI0ODAwNjEsIDAuMDAyNDkwNDM2NywgLTAuMDAxMzkxNjQxNCwgMC4wMDE3NTU2NTI4LCAtMC4wMDAzMzUwNzc3LAorICAgIDAuMDAwOTUyMDAzNywgMC4wMDA2NjcxMTU0NCwgMC4wMDAwOTQwODg3MTgsIDAuMDAxNTkzODY4OCwgLTAuMDAwODAxMDg5MzksIDAuMDAyNDI2MjAwOCwgLTAuMDAxNzE0NTU4MywgMC4wMDMxNDc3OTUxLAorICAgIC0wLjAwMjYyNTkwMDYsIDAuMDAzNzQ1NDk0NiwgLTAuMDAzNTEzODUsIDAuMDA0MjA5Njg3NSwgLTAuMDA0MzU2OTM4NCwgMC4wMDQ1MzQ1NzM4LCAtMC4wMDUxMzQxNjg1LCAwLjAwNDcxODI5ODYsCisgICAgLTAuMDA1ODI1Njg0OSwgMC4wMDQ3NjI5NDk0LCAtMC4wMDY0MTM0MTgzLCAwLjAwNDY3NDQyMDIsIC0wLjAwNjg4MTY3NzUsIDAuMDA0NDYyMTM5NywgLTAuMDA3MjE3NjYyNCwgMC4wMDQxMzg2ODg2LAorICAgIC0wLjAwNzQxMTg4MjMsIDAuMDAzNzE5MzEzMywgLTAuMDA3NDU4NDU5NiwgMC4wMDMyMjEzNjAzLCAtMC4wMDczNTUzMSwgMC4wMDI2NjM2NTU5LCAtMC4wMDcxMDQxOTQzLCAwLjAwMjA2NTg1NTMsCisgICAgLTAuMDA2NzEwNjM2LCAwLjAwMTQ0Nzc4NzIsIC0wLjAwNjE4MzcxOTMsIDAuMDAwODI4ODIxNjIsIC0wLjAwNTUzNTc3MTEsIDAuMDAwMjI3MjgxNzIsIC0wLjAwNDc4MTk0NDcsIC0wLjAwMDM0MDA3NzIxLAorICAgIC0wLjAwMzkzOTcyMTMsIC0wLjAwMDg1ODUwNjM2LCAtMC4wMDMwMjgzNTc5LCAtMC4wMDEzMTU2MDU5LCAtMC4wMDIwNjgyOTUxLCAtMC4wMDE3MDE1NjQ5LCAtMC4wMDEwODA1NTQxLCAtMC4wMDIwMDkyOTM1LAorICAgIC0wLjAwMDA4NjE0MjYyMywgLTAuMDAyMjM0NDUzMSwgMC4wMDA4OTQ1MDUxMiwgLTAuMDAyMzc1Mzg1NSwgMC4wMDE4NDIwNDE4LCAtMC4wMDI0MzI5NTczLCAwLjAwMjczODY1NTEsIC0wLjAwMjQxMDMyNzMsCisgICAgMC4wMDM1Njg0Mzc0LCAtMC4wMDIzMTI2NTU4LCAwLjAwNDMxNzY3NjYsIC0wLjAwMjE0Njc2OTgsIDAuMDA0OTc1MDU0NCwgLTAuMDAxOTIwODA1NCwgMC4wMDU1MzE3NjIzLCAtMC4wMDE2NDM4Mzc4LAorICAgIDAuMDA1OTgxNTMyOSwgLTAuMDAxMzI1NTIwOCwgMC4wMDYzMjA1OTM5LCAtMC4wMDA5NzU3NDU2NywgMC4wMDY1NDc1NjA5LCAtMC4wMDA2MDQzMzE1NSwgMC4wMDY2NjMyNjY2LCAtMC4wMDAyMjA3NTY1NywKKyAgICAwLjAwNjY3MDU1NDIsIDAuMDAwMTY2MDY0ODEsIDAuMDA2NTc0MDM0NywgMC4wMDA1NDc5NTQ3LCAwLjAwNjM3OTgyODgsIDAuMDAwOTE3NTk1LCAwLjAwNjA5NTMwMTQsIDAuMDAxMjY4NjAyMiwKKyAgICAwLjAwNTcyODc5NzEsIDAuMDAxNTk1NTU4NiwgMC4wMDUyODkzOTAyLCAwLjAwMTg5NDAwNDEsIDAuMDA0Nzg2NjUzNCwgMC4wMDIxNjAzOTcxLCAwLjAwNDIzMDQ1MDQsIDAuMDAyMzkyMDUwOCwKKyAgICAwLjAwMzYzMDc1NDgsIDAuMDAyNTg3MDUyOCwgMC4wMDI5OTc0OTkyLCAwLjAwMjc0NDE3NDYsIDAuMDAyMzQwNDUxMSwgMC4wMDI4NjI3Nzk3LCAwLjAwMTY2OTExNTcsIDAuMDAyOTQyNzM2MywKKyAgICAwLjAwMDk5MjY2MjUxLCAwLjAwMjk4NDMzNTksIDAuMDAwMzE5ODcwNzEsIDAuMDAyOTg4MjI3NCwgLTAuMDAwMzQwOTA5NywgMC4wMDI5NTUzNjM0LCAtMC4wMDA5ODE3ODU5NCwgMC4wMDI4ODY5NjMzLAorICAgIC0wLjAwMTU5NTM0NDYsIDAuMDAyNzg0NDkyOSwgLTAuMDAyMTc0NjcwOCwgMC4wMDI2NDk2NTUxLCAtMC4wMDI3MTMzNjk0LCAwLjAwMjQ4NDM5NTQsIC0wLjAwMzIwNTU4OTcsIDAuMDAyMjkwOTE0MywKKyAgICAtMC4wMDM2NDYwNTU3LCAwLjAwMjA3MTY4NDUsIC0wLjAwNDAzMDEwMjksIDAuMDAxODI5NDY5LCAtMC4wMDQzNTM3MjIxLCAwLjAwMTU2NzMzNTksIC0wLjAwNDYxMzYwNzcsIDAuMDAxMjg4NjY3NCwKKyAgICAtMC4wMDQ4MDcyMDk2LCAwLjAwMDk5NzE1NjQ5LCAtMC4wMDQ5MzI3ODU5LCAwLjAwMDY5Njc5MjYyLCAtMC4wMDQ5ODk0NTMxLCAwLjAwMDM5MTgzMiwgLTAuMDA0OTc3MjMwOSwgMC4wMDAwODY3NTIwNzIsCisgICAgLTAuMDA0ODk3MDc1NywgLTAuMDAwMjEzODA5MTIsIC0wLjAwNDc1MDkwNDYsIC0wLjAwMDUwNTEyODI0LCAtMC4wMDQ1NDE2MDE1LCAtMC4wMDA3ODI0ODQ1NCwgLTAuMDA0MjczMDAzOSwgLTAuMDAxMDQxMjU3OSwKKyAgICAtMC4wMDM5NDk4NzMxLCAtMC4wMDEyNzcwMzMxLCAtMC4wMDM1Nzc4Mzg5LCAtMC4wMDE0ODU3MDc2LCAtMC4wMDMxNjMzMjc5LCAtMC4wMDE2NjM1OTcxLCAtMC4wMDI3MTM0NjgyLCAtMC4wMDE4MDc1MzcsCisgICAgLTAuMDAyMjM1OTc1OCwgLTAuMDAxOTE0OTc0OCwgLTAuMDAxNzM5MDI3OSwgLTAuMDAxOTg0MDQ4NCwgLTAuMDAxMjMxMTE4MSwgLTAuMDAyMDEzNjUxMiwgLTAuMDAwNzIwOTA2ODMsIC0wLjAwMjAwMzQ3NzIsCisgICAgLTAuMDAwMjE3MDYyNywgLTAuMDAxOTU0MDQ4NCwgMC4wMDAyNzE4OTU4NCwgLTAuMDAxODY2NzIwOCwgMC4wMDA3Mzc3NTc2NSwgLTAuMDAxNzQzNjcsIDAuMDAxMTcyNzY5NiwgLTAuMDAxNTg3ODU3MSwKKyAgICAwLjAwMTU2OTc3ODMsIC0wLjAwMTQwMjk3NjYsIDAuMDAxOTIyMzU5LCAtMC4wMDExOTMzODUyLCAwLjAwMjIyNDkzMDMsIC0wLjAwMDk2NDAxNzg4LCAwLjAwMjQ3Mjg1MTcsIC0wLjAwMDcyMDI4ODg0LAorICAgIDAuMDAyNjYyNTAyNSwgLTAuMDAwNDY3OTgzNTcsIDAuMDAyNzkxMzQyOCwgLTAuMDAwMjEzMTQxNjUsIDAuMDAyODU3OTUzMSwgMC4wMDAwMzgwNjU5MjIsIDAuMDAyODYyMDU0OSwgMC4wMDAyNzk0NjI5OCwKKyAgICAwLjAwMjgwNDUxMDMsIDAuMDAwNTA0OTk1OTMsIDAuMDAyNjg3MzAxNSwgMC4wMDA3MDg4NjA4NywgMC4wMDI1MTM0OTE1LCAwLjAwMDg4NTYyNzkzLCAwLjAwMjI4NzE2NDgsIDAuMDAxMDMwMzYwOCwKKyAgICAwLjAwMjAxMzM0OTQsIDAuMDAxMTM4NzI5NiwgMC4wMDE2OTc5MjEzLCAwLjAwMTIwNzExNDUsIDAuMDAxMzQ3NDkxMywgMC4wMDEyMzI2OTg3LCAwLjAwMDk2OTI3Nzg3LCAwLjAwMTIxMzU0NjUsCisgICAgMC4wMDA1NzA5NjQ5NCwgMC4wMDExNDg2NjgsIDAuMDAwMTYwNTQ4NDYsIDAuMDAxMDM4MDYyNSwgLTAuMDAwMjUzODI1OTEsIDAuMDAwODgyNzQ0OTEsIC0wLjAwMDY2NDAzMTAyLCAwLjAwMDY4NDc0NzE4LAorICAgIC0wLjAwMTA2MjEyODUsIDAuMDAwNDQ3MDk4NCwgLTAuMDAxNDQwNTM3LCAwLjAwMDE3Mzc3OTE4LCAtMC4wMDE3OTIxOTU3LCAtMC4wMDAxMzAzNDc5NSwgLTAuMDAyMTEwNzE0MSwgLTAuMDAwNDU5NjMyMjUsCisgICAgLTAuMDAyMzkwNTEwMiwgLTAuMDAwODA3NzUwOTcsIC0wLjAwMjYyNjkyNjQsIC0wLjAwMTE2Nzg0NTMsIC0wLjAwMjgxNjMyMzQsIC0wLjAwMTUzMjY3MzcsIC0wLjAwMjk1NjE0OCwgLTAuMDAxODk0Nzc2NiwKKyAgICAtMC4wMDMwNDQ5NzEsIC0wLjAwMjI0NjY1MDYsIC0wLjAwMzA4MjQ5NTYsIC0wLjAwMjU4MDkyNDIsIC0wLjAwMzA2OTUzNTEsIC0wLjAwMjg5MDUzMDcsIC0wLjAwMzAwNzk2MSwgLTAuMDAzMTY4ODczNywKKyAgICAtMC4wMDI5MDA2MjM5LCAtMC4wMDM0MDk5NzgyLCAtMC4wMDI3NTEyNTAxLCAtMC4wMDM2MDg2MjI4LCAtMC4wMDI1NjQzMTU3LCAtMC4wMDM3NjA0NTE3LCAtMC4wMDIzNDQ5MDg0LCAtMC4wMDM4NjIwNTkyLAorICAgIC0wLjAwMjA5ODU3NTksIC0wLjAwMzkxMTA0NzcsIC0wLjAwMTgzMTE2OTgsIC0wLjAwMzkwNjA1NywgLTAuMDAxNTQ4NjkxMSwgLTAuMDAzODQ2NzY2OSwgLTAuMDAxMjU3MTM5NywgLTAuMDAzNzMzODcwMywKKyAgICAtMC4wMDA5NjIzNzU0MywgLTAuMDAzNTY5MDI0OCwgLTAuMDAwNjY5OTkxMzEsIC0wLjAwMzM1NDc4MiwgLTAuMDAwMzg1MjA1NzksIC0wLjAwMzA5NDQ5OSwgLTAuMDAwMTEyNzczMTQsIC0wLjAwMjc5MjIzNzEsCisgICAgMC4wMDAxNDMwODU3OCwgLTAuMDAyNDUyNjUxNSwgMC4wMDAzNzg3MzI0MiwgLTAuMDAyMDgwODc3NSwgMC4wMDA1OTExMzk3MiwgLTAuMDAxNjgyNDE0MSwgMC4wMDA3Nzc5MDMzLCAtMC4wMDEyNjMwMTA4LAorICAgIDAuMDAwOTM3MjM2OTQsIC0wLjAwMDgyODU2MjQyLCAwLjAwMTA2Nzk1NDMsIC0wLjAwMDM4NTAwODQzLCAwLjAwMTE2OTQ0MDUsIDAuMDAwMDYxNzU1OTY0LCAwLjAwMTI0MTYxNDksIDAuMDAwNTA1OTU5NzMsCisgICAgMC4wMDEyODQ4ODk5LCAwLjAwMDk0MjAyNTI4LCAwLjAwMTMwMDEyNTcsIDAuMDAxMzY0NjI4MywgMC4wMDEyODg1ODQyLCAwLjAwMTc2ODc0ODUsIDAuMDAxMjUxODgzNSwgMC4wMDIxNDk3MTI4LAorICAgIDAuMDAxMTkxOTUzOSwgMC4wMDI1MDMyMzE0LCAwLjAwMTExMDk5NDgsIDAuMDAyODI1NDMwOCwgMC4wMDEwMTE0MzQ1LCAwLjAwMzExMjg3OTgsIDAuMDAwODk1ODkwNDEsIDAuMDAzMzYyNjE0NCwKKyAgICAwLjAwMDc2NzEzMDkzLCAwLjAwMzU3MjE2MDEsIDAuMDAwNjI4MDM2ODUsIDAuMDAzNzM5NTUxMiwgMC4wMDA0ODE1NjI2NiwgMC4wMDM4NjMzNDc5LCAwLjAwMDMzMDY5NjMyLCAwLjAwMzk0MjY1MDMsCisgICAgMC4wMDAxNzg0MTczMiwgMC4wMDM5NzcxMDg3LCAwLjAwMDAyNzY1MzAwMSwgMC4wMDM5NjY5MzAzLCAtMC4wMDAxMTg3NjY5OCwgMC4wMDM5MTI4NzY4LCAtMC4wMDAyNTgxNTczNSwgMC4wMDM4MTYyNTkzLAorICAgIC0wLjAwMDM4ODAyNDI2LCAwLjAwMzY3ODkyMDksIC0wLjAwMDUwNjExMTgzLCAwLjAwMzUwMzIxNDYsIC0wLjAwMDYxMDQ0NTkyLCAwLjAwMzI5MTk2OCwgLTAuMDAwNjk5Mzc0ODIsIDAuMDAzMDQ4NDQxOCwKKyAgICAtMC4wMDA3NzE2MDM5NSwgMC4wMDI3NzYyNzYzLCAtMC4wMDA4MjYyMjM0NiwgMC4wMDI0Nzk0MzE3LCAtMC4wMDA4NjI3MjczNSwgMC4wMDIxNjIxMTk0LCAtMC4wMDA4ODEwMjI2LCAwLjAwMTgyODcyODYsCisgICAgLTAuMDAwODgxNDI3NDMsIDAuMDAxNDgzNzQ5MSwgLTAuMDAwODY0NjU4MTYsIDAuMDAxMTMxNjkxNiwgLTAuMDAwODMxODA0NjUsIDAuMDAwNzc3MDA5MjksIC0wLjAwMDc4NDI5NDkxLCAwLjAwMDQyNDAyMjksCisgICAgLTAuMDAwNzIzODQ5NzUsIDAuMDAwMDc2ODUwNTkyLCAtMC4wMDA2NTI0Mjg2NiwgLTAuMDAwMjYwNjU0NDMsIC0wLjAwMDU3MjE2OTM3LCAtMC4wMDA1ODQ5NTY4NCwgLTAuMDAwNDg1MzIyOTYsIC0wLjAwMDg5Mjg4MTYsCisgICAgLTAuMDAwMzk0MTg2NDQsIC0wLjAwMTE4MTY0NDcsIC0wLjAwMDMwMTAzNjQzLCAtMC4wMDE0NDg4NzE4LCAtMC4wMDAyMDgwNjU0OCwgLTAuMDAxNjkyNjA0NywgLTAuMDAwMTE3MzIzOCwgLTAuMDAxOTExMjk3MSwKKyAgICAtMC4wMDAwMzA2Njg0MDksIC0wLjAwMjEwMzgsIDAuMDAwMDUwMjc4NTA0LCAtMC4wMDIyNjkzMzg2LCAwLjAwMDEyNDE2MDk2LCAtMC4wMDI0MDc0ODE5LCAwLjAwMDE4OTkwOTMzLCAtMC4wMDI1MTgxMDg4LAorICAgIDAuMDAwMjQ2NzQ5MjMsIC0wLjAwMjYwMTM3MTQsIDAuMDAwMjk0MTk5MzMsIC0wLjAwMjY1NzY1NjEsIDAuMDAwMzMyMDU5MDIsIC0wLjAwMjY4NzU0OTUsIDAuMDAwMzYwMzg3MiwgLTAuMDAyNjkxODAzNywKKyAgICAwLjAwMDM3OTQ3MzczLCAtMC4wMDI2NzEzMDk3LCAwLjAwMDM4OTgwNTQ0LCAtMC4wMDI2MjcwNzI5LCAwLjAwMDM5MjAyODYzLCAtMC4wMDI1NjAxOTYyLCAwLjAwMDM4NjkxMDE5LCAtMC4wMDI0NzE4NjkzLAorICAgIDAuMDAwMzc1Mjk5MDIsIC0wLjAwMjM2MzM2MTIsIDAuMDAwMzU4MDg5NzIsIC0wLjAwMjIzNjAxOTgsIDAuMDAwMzM2MTg5NzMsIC0wLjAwMjA5MTI3NDQsIDAuMDAwMzEwNDkxMTYsIC0wLjAwMTkzMDYzOCwKKyAgICAwLjAwMDI4MTg0Nzg3LCAtMC4wMDE3NTU3MTUzLCAwLjAwMDI1MTA1ODQsIC0wLjAwMTU2ODIwNTksIDAuMDAwMjE4ODU0NCwgLTAuMDAxMzY5OTA4LCAwLjAwMDE4NTg5NDM3LCAtMC4wMDExNjI3MTg3LAorICAgIDAuMDAwMTUyNzYyMDIsIC0wLjAwMDk0ODYzMDc0LCAwLjAwMDExOTk2ODQ4LCAtMC4wMDA3Mjk3MjQxMiwgMC4wMDAwODc5NTczMzQsIC0wLjAwMDUwODE1NDMzLCAwLjAwMDA1NzExMTM3NCwgLTAuMDAwMjg2MTM0ODYsCisgICAgMC4wMDAwMjc3NjAyNzQsIC0wLjAwMDA2NTkxNTU3LCAxLjg4MTUwNDllLTcsIDAuMDAwMTUwMjQyMjcsIC0wLjAwMDAyNTM1OTczNywgMC4wMDAzNjAwOTQ0NSwgLTAuMDAwMDQ4NjcxNjUzLCAwLjAwMDU2MTQ0NDA5LAorICAgIC0wLjAwMDA2OTU2NTg1MywgMC4wMDA3NTIxNzI5LCAtMC4wMDAwODc4ODg5NzcsIDAuMDAwOTMwMjcyNTcsIC0wLjAwMDEwMzUxNjI5LCAwLjAwMTA5Mzg3NDYsIC0wLjAwMDExNjM1MzY3LCAwLjAwMTI0MTI3ODUsCisgICAgLTAuMDAwMTI2MzQwNywgMC4wMDEzNzA5NzY5LCAtMC4wMDAxMzM0NTQ4LCAwLjAwMTQ4MTY3NjcsIC0wLjAwMDEzNzcxNTQsIDAuMDAxNTcyMzE3LCAtMC4wMDAxMzkxODgwNCwgMC4wMDE2NDIwODE1LAorICAgIC0wLjAwMDEzNzk4NzQyLCAwLjAwMTY5MDQwNzYsIC0wLjAwMDEzNDI3OTQzLCAwLjAwMTcxNjk4OTksIC0wLjAwMDEyODI4MTMsIDAuMDAxNzIxNzc5OSwgLTAuMDAwMTIwMjYwMDMsIDAuMDAxNzA0OTgyNywKKyAgICAtMC4wMDAxMTA1Mjg1NSwgMC4wMDE2NjcwNDgyLCAtMC4wMDAwOTk0NDAwOTgsIDAuMDAxNjA4NjYxMSwgLTAuMDAwMDg3MzgwNDMxLCAwLjAwMTUzMDcyNzcsIC0wLjAwMDA3NDc1ODQyNywgMC4wMDE0MzQzNjAyLAorICAgIC0wLjAwMDA2MTk5NTMwNiwgMC4wMDEzMjA4NTk4LCAtMC4wMDAwNDk1MTI4NjYsIDAuMDAxMTkxNjk5NCwgLTAuMDAwMDM3NzIxMTU4LCAwLjAwMTA0ODUwNDMsIC0wLjAwMDAyNzAwNjE3OSwgMC4wMDA4OTMwMzMxMSwKKyAgICAtMC4wMDAwMTc3MTc5NTUsIDAuMDAwNzI3MTU4NzQsIC0wLjAwMDAxMDE1OTU2NiwgMC4wMDA1NTI4NDg4LCAtMC4wMDAwMDQ1Nzc1MDg3LCAwLjAwMDM3MjE0NjQzLCAtMC4wMDAwMDExNTM3ODAyLCAwLjAwMDE4NzE1MTEyLAorfTsKKworY29uc3QgZmxvYXQgZmZfb24yYXZjX2N0YWJfMlsyMDQ4XSA9IHsKKyAgICA2LjEwNjIyNjZlLTE2LCAtMC4wMDQ3MTc2MjQ3LCAwLjAwMDAyNTgwMTA4NiwgMC4wMDAxNzE3MTc5NSwgMC4wMDAxMDI3ODY4NiwgMC4wMDAzMzIzNzA0OSwgMC4wMDAyMjk3MTEwOCwgMC4wMDA0NzEwODE3MywKKyAgICAwLjAwMDQwNDUxNzM3LCAwLjAwMDU3NzM1MjgyLCAwLjAwMDYyNDM2OTY2LCAwLjAwMDY0MTI0NDE3LCAwLjAwMDg4NTY5Mzk0LCAwLjAwMDY1MzU1MDQ5LCAwLjAwMTE4NDIzMDQsIDAuMDAwNjA1OTY2NiwKKyAgICAwLjAwMTUxNTA5NTEsIDAuMDAwNDkxMjQwNDEsIDAuMDAxODcyODQ5MiwgMC4wMDAzMDMzMTE4OCwgMC4wMDIyNTE1NzU3LCAwLjAwMDAzNzQzNDUyMiwgMC4wMDI2NDQ5NjE5LCAtMC4wMDAzMDk3MjE4MywKKyAgICAwLjAwMzA0NjM4NjIsIC0wLjAwMDczOTk5MDA0LCAwLjAwMzQ0OTAwOSwgLTAuMDAxMjUzNjQ3NywgMC4wMDM4NDU4NjU0LCAtMC4wMDE4NDkzODQyLCAwLjAwNDIyOTk2MDUsIC0wLjAwMjUyNDI5MzcsCisgICAgMC4wMDQ1OTQzNjYxLCAtMC4wMDMyNzM4OTU1LCAwLjAwNDkzMjMxOTMsIC0wLjAwNDA5MjE4MDIsIDAuMDA1MjM3MzE3NiwgLTAuMDA0OTcxNjg0NCwgMC4wMDU1MDMyMjE5LCAtMC4wMDU5MDM1ODk1LAorICAgIDAuMDA1NzI0MzUwOSwgLTAuMDA2ODc3ODQ2MSwgMC4wMDU4OTU1ODIsIC0wLjAwNzg4MzMxNzgsIDAuMDA2MDEyNDQ5LCAtMC4wMDg5MDc5NDY4LCAwLjAwNjA3MTIzNDYsIC0wLjAwOTkzODkzNDgsCisgICAgMC4wMDYwNjkwNjc0LCAtMC4wMTA5NjI5MzIsIDAuMDA2MDA0MDA2NiwgLTAuMDExOTY2MjQsIDAuMDA1ODc1MTI2OSwgLTAuMDEyOTM1MDEsIDAuMDA1NjgyNTg5NSwgLTAuMDEzODU1NDQ5LAorICAgIDAuMDA1NDI3NzA2NSwgLTAuMDE0NzE0MDE2LCAwLjAwNTExMjk4NywgLTAuMDE1NDk3NjA2LCAwLjAwNDc0MjE2OTgsIC0wLjAxNjE5MzczMywgMC4wMDQzMjAyMzMxLCAtMC4wMTY3OTA2ODYsCisgICAgMC4wMDM4NTMzODM3LCAtMC4wMTcyNzc2NzcsIDAuMDAzMzQ5MDE3NiwgLTAuMDE3NjQ0OTY4LCAwLjAwMjgxNTY1NjYsIC0wLjAxNzg4Mzk4MSwgMC4wMDIyNjI4NTI5LCAtMC4wMTc5ODczODUsCisgICAgMC4wMDE3MDEwNjYzLCAtMC4wMTc5NDkxNzcsIDAuMDAxMTQxNTExOCwgLTAuMDE3NzY0NzM0LCAwLjAwMDU5NTk3ODc1LCAtMC4wMTc0MzA4NjIsIDAuMDAwMDc2NjI1NTY5LCAtMC4wMTY5NDU4MzEsCisgICAgLTAuMDAwNDA0MjQ3NjYsIC0wLjAxNjMwOTM4OCwgLTAuMDAwODM0NDQ0ODMsIC0wLjAxNTUyMjc3NiwgLTAuMDAxMjAyMTMxNywgLTAuMDE0NTg4NzQ3LCAtMC4wMDE0OTYxMDIxLCAtMC4wMTM1MTE1NTIsCisgICAgLTAuMDAxNzA2MDQ0MywgLTAuMDEyMjk2OTQ3LCAtMC4wMDE4MjI4MDQ2LCAtMC4wMTA5NTIxNzQsIC0wLjAwMTgzODYzOSwgLTAuMDA5NDg1OTUwNywgLTAuMDAxNzQ3NDUwNywgLTAuMDA3OTA4NDQ4NiwKKyAgICAtMC4wMDE1NDUwMDQ0LCAtMC4wMDYyMzEyNjE5LCAtMC4wMDEyMjkxMTY1LCAtMC4wMDQ0NjczNjkxLCAtMC4wMDA3OTk4MTQzLCAtMC4wMDI2MzEwODQzLCAtMC4wMDAyNTk0NjI0NSwgLTAuMDAwNzM3OTk4NjksCisgICAgMC4wMDAzODcxNDc2MiwgMC4wMDExOTUwOTA3LCAwLjAwMTEzMjc0NjcsIDAuMDAzMTUwMjY0LCAwLjAwMTk2NzU3NzcsIDAuMDA1MTA4NTczNSwgMC4wMDI4Nzk0MjgsIDAuMDA3MDUwMTUxLAorICAgIDAuMDAzODUzNzA2NCwgMC4wMDg5NTQzMjQ4LCAwLjAwNDg3MzU2NjgsIDAuMDEwNzk5NzQ2LCAwLjAwNTkyMDA3NjcsIDAuMDEyNTY0NTMyLCAwLjAwNjk3MjQzNzMsIDAuMDE0MjI2NDA4LAorICAgIDAuMDA4MDA4MjUyOCwgMC4wMTU3NjI4NjIsIDAuMDA5MDAzODUwNiwgMC4wMTcxNTEzMTgsIDAuMDA5OTM0NjU0NSwgMC4wMTgzNjkzMTEsIDAuMDEwNzc1NjA5LCAwLjAxOTM5NDY3NywKKyAgICAwLjAxMTUwMTY1MywgMC4wMjAyMDU3NjYsIDAuMDEyMDg4MjQzLCAwLjAyMDc4MTY4MSwgMC4wMTI1MTE5MTksIDAuMDIxMTAyNTMxLCAwLjAxMjc1MDkwOCwgMC4wMjExNDk3MzYsCisgICAgMC4wMTI3ODU3NTUsIDAuMDIwOTA2MzYxLCAwLjAxMjU5OTk2OCwgMC4wMjAzNTc1MDQsIDAuMDEyMTgwNjc3LCAwLjAxOTQ5MDczMiwgMC4wMTE1MTkyNjUsIDAuMDE4Mjk2NTczLAorICAgIDAuMDEwNjExOTg2LCAwLjAxNjc2OTA3NiwgMC4wMDk0NjA1MTcyLCAwLjAxNDkwNjQxOCwgMC4wMDgwNzI0NTI2LCAwLjAxMjcxMTU4MiwgMC4wMDY0NjE2OTIsIDAuMDEwMTkzMDc4LAorICAgIDAuMDA0NjQ4NzI0MSwgMC4wMDczNjU3MDc4LCAwLjAwMjY2MDc2MzcsIDAuMDA0MjUxMzY3OSwgMC4wMDA1MzE3MzQ5LCAwLjAwMDg3OTg1NzA1LCAtMC4wMDE2OTc5MjA4LCAtMC4wMDI3MTAzMTE3LAorICAgIC0wLjAwMzk4MTYzMTIsIC0wLjAwNjQ3MTEzMTUsIC0wLjAwNjI2NzI4MDgsIC0wLjAxMDM0NDM3MiwgLTAuMDA4NDk4MDA3NCwgLTAuMDE0MjYwOTM2LCAtMC4wMTA2MTMyMTQsIC0wLjAxODE0MDMxNiwKKyAgICAtMC4wMTI1NDk3ODUsIC0wLjAyMTg5MDIxLCAtMC4wMTQyNDM1LCAtMC4wMjU0MDYyOSwgLTAuMDE1NjMwNjM4LCAtMC4wMjg1NzIxNzksIC0wLjAxNjY0OTcyOSwgLTAuMDMxMjU5Njc1LAorICAgIC0wLjAxNzI0MzQ0OSwgLTAuMDMzMzI5MTkzLCAtMC4wMTczNjA2MTMsIC0wLjAzNDYzMDUyMiwgLTAuMDE2OTU4MjE2LCAtMC4wMzUwMDM4NDgsIC0wLjAxNjAwMzUwNiwgLTAuMDM0MjgxMDksCisgICAgLTAuMDE0NDc2MDA2LCAtMC4wMzIyODc1MjMsIC0wLjAxMjM2OTQ3OCwgLTAuMDI4ODQzNzQ2LCAtMC4wMDk2OTM3MzM0LCAtMC4wMjM3Njc4NzYsIC0wLjAwNjQ3NjI3NDIsIC0wLjAxNjg3ODA3OCwKKyAgICAtMC4wMDI3NjM2OTMyLCAtMC4wMDc5OTUyOTM1LCAwLjAwMTM3NzE5ODUsIDAuMDAzMDUzNzk4NiwgMC4wMDU4NTg1NzQxLCAwLjAxNjQzMzY2NCwgMC4wMTA1NzExNDksIDAuMDMyMjk2NjY5LAorICAgIDAuMDE1Mzg0MTM0LCAwLjA1MDc3OTc3OSwgMC4wMjAxNDU2MDQsIDAuMDcyMDAxMjQxLCAwLjAyNDY4MzI5OSwgMC4wOTYwNTczMzMsIDAuMDI4ODA1ODYxLCAwLjEyMzAxOTIxLAorICAgIDAuMDMyMzA0NTE4LCAwLjE1MjkyOTk4LCAwLjAzNDk1NTE4NSwgMC4xODU4MDE5NCwgMC4wMzY1MjA5NzMsIDAuMjIxNjE0MjcsIDAuMDM2NzU1MDg1LCAwLjI2MDMxMDkyLAorICAgIDAuMDM1NDA0MDM0LCAwLjMwMTc5OTAzLCAwLjAzMjIxMTE4OCwgMC4zNDU5NDc3NywgMC4wMjY5MjA1MDksIDAuMzkyNTg3NzgsIDAuMDE5MjgwNTIzLCAwLjQ0MTUxMTA2LAorICAgIDAuMDA5MDQ4Mzg5MywgMC40OTI0NzEzNCwgLTAuMDA0MDA1OTgzLCAwLjU0NTE4NTMzLCAtMC4wMjAwOTU4MjUsIDAuNTk5MzM0MjQsIC0wLjAzOTQxMzQ5MywgMC42NTQ1NjYxMSwKKyAgICAtMC4wNjIxMjY2MjksIDAuNzEwNDk4NjMsIC0wLjA4ODM3NDUzMywgMC43NjY3MjIzOCwgLTAuMTE4MjY0ODksIDAuODIyODA0OTMsIC0wLjE1MTg3MDgsIDAuODc4Mjk0ODksCisgICAgLTAuMTg5MjI4MzcsIDAuOTMyNzI3MDQsIC0wLjIzMDMzNDYyLCAwLjk4NTYyNzExLCAtMC4yNzUxNDYxMywgMS4wMzY1MTczLCAtMC4zMjM1NzgxMiwgMS4wODQ5MjIsCisgICAgLTAuMzc1NTA0MjMsIDEuMTMwMzcyOSwgLTAuNDMwNzU2ODcsIDEuMTcyNDE1NywgLTAuNDg5MTI4MjksIDEuMjEwNjE1LCAtMC41NTAzNzIyNCwgMS4yNDQ1NTk5LAorICAgIC0wLjYxNDIwNjA4LCAxLjI3Mzg2OTIsIC0wLjY4MDMxMzk0LCAxLjI5ODE5NjcsIC0wLjc0ODM0OTg1LCAxLjMxNzIzNTQsIC0wLjgxNzk0MTY3LCAxLjMzMDcyMSwKKyAgICAtMC44ODg2OTU2LCAxLjMzODQzNjUsIC0wLjk2MDIwMDU1LCAxLjM0MDIxMzgsIC0xLjAzMjAzMzQsIDEuMzM1OTM2MywgLTEuMTAzNzY0MSwgMS4zMjU1NDA1LAorICAgIC0xLjE3NDk2MDUsIDEuMzA5MDE2NywgLTEuMjQ1MTk0NCwgMS4yODY0MDg3LCAtMS4zMTQwNDY0LCAxLjI1NzgxMywgLTEuMzgxMTEwNSwgMS4yMjMzNzc5LAorICAgIC0xLjQ0NjAwMDEsIDEuMTgzMzAxMywgLTEuNTA4MzUxNiwgMS4xMzc4MjczLCAtMS41Njc4Mjg1LCAxLjA4NzI0MzcsIC0xLjYyNDEyNjYsIDEuMDMxODc3NSwKKyAgICAtMS42NzY5NzUxLCAwLjk3MjA5MTM4LCAtMS43MjYxNDEzLCAwLjkwODI3ODE3LCAtMS43NzE0MzE2LCAwLjg0MDg1NjM3LCAtMS44MTI2OTM0LCAwLjc3MDI2NDg2LAorICAgIC0xLjg0OTgxNjMsIDAuNjk2OTU3NTMsIC0xLjg4MjczMiwgMC42MjEzOTc4NSwgLTEuOTExNDE0NiwgMC41NDQwNTM0NCwgLTEuOTM1ODc5MiwgMC40NjUzOTA5OCwKKyAgICAtMS45NTYxODA4LCAwLjM4NTg3MDk2LCAtMS45NzI0MTIzLCAwLjMwNTk0MzEsIC0xLjk4NDcwMjEsIDAuMjI2MDQxNjcsIC0xLjk5MzIxMDksIDAuMTQ2NTgxNjksCisgICAgLTEuOTk4MTI5MiwgMC4wNjc5NTUxODEsIC0xLjk5OTY3MzEsIC0wLjAwOTQ3MTgzLCAtMS45OTgwODA3LCAtMC4wODUzNjE4NjEsIC0xLjk5MzYwODIsIC0wLjE1OTQwNzk0LAorICAgIC0xLjk4NjUyNjQsIC0wLjIzMTMzNTA0LCAtMS45NzcxMTU2LCAtMC4zMDA5MDA4OCwgLTEuOTY1NjYyNywgLTAuMzY3ODk2MjYsIC0xLjk1MjQ1NywgLTAuNDMyMTQ0NzksCisgICAgLTEuOTM3Nzg2NSwgLTAuNDkzNTAyMTQsIC0xLjkyMTkzNDcsIC0wLjU1MTg1NDk3LCAtMS45MDUxNzgsIC0wLjYwNzExOTE0LCAtMS44ODc3ODE5LCAtMC42NTkyMzgxNiwKKyAgICAtMS44Njk5OTk4LCAtMC43MDgxODA2NywgLTEuODUyMDcwNiwgLTAuNzUzOTM4MTQsIC0xLjgzNDIxNjcsIC0wLjc5NjUyMjYyLCAtMS44MTY2NDM4LCAtMC44MzU5NjM3MywKKyAgICAtMS43OTk1MzkzLCAtMC44NzIzMDYyMywgLTEuNzgzMDcyMSwgLTAuOTA1NjA3NCwgLTEuNzY3MzkyMywgLTAuOTM1OTM0NjYsIC0xLjc1MjYzMTcsIC0wLjk2MzM2MjkzLAorICAgIC0xLjczODkwMzgsIC0wLjk4Nzk3MjY4LCAtMS43MjYzMDQ0LCAtMS4wMDk4NDc1LCAtMS43MTQ5MTI4LCAtMS4wMjkwNzI5LCAtMS43MDQ3OTIxLCAtMS4wNDU3MzQyLAorICAgIC0xLjY5NTk5MDYsIC0xLjA1OTkxNTEsIC0xLjY4ODU0MjIsIC0xLjA3MTY5NjksIC0xLjY4MjQ2ODcsIC0xLjA4MTE1NzQsIC0xLjY3Nzc3OSwgLTEuMDg4MzcwMiwKKyAgICAtMS42NzQ0NzE3LCAtMS4wOTM0MDM5LCAtMS42NzI1MzU3LCAtMS4wOTYzMjIyLCAtMS42NzE5NSwgLTEuMDk3MTgzMSwgLTEuNjcyNjg2MiwgLTEuMDk2MDM5NSwKKyAgICAtMS42NzQ3MDgyLCAtMS4wOTI5Mzg5LCAtMS42Nzc5NzM0LCAtMS4wODc5MjMzLCAtMS42ODI0MzI1LCAtMS4wODEwMywgLTEuNjg4MDMxNywgLTEuMDcyMjkxNiwKKyAgICAtMS42OTQ3MTE2LCAtMS4wNjE3MzY3LCAtMS43MDI0MDg2LCAtMS4wNDkzOSwgLTEuNzExMDU0OSwgLTEuMDM1MjczMiwgLTEuNzIwNTc5NiwgLTEuMDE5NDA1NCwKKyAgICAtMS43MzA5MDgsIC0xLjAwMTgwMzYsIC0xLjc0MTk2MjksIC0wLjk4MjQ4MzgsIC0xLjc1MzY2NDEsIC0wLjk2MTQ2MTMxLCAtMS43NjU5Mjk1LCAtMC45Mzg3NTEzNCwKKyAgICAtMS43Nzg2NzQ0LCAtMC45MTQzNzAwNiwgLTEuNzkxODEyMiwgLTAuODg4MzM0ODcsIC0xLjgwNTI1NDgsIC0wLjg2MDY2NTQ0LCAtMS44MTg5MTI0LCAtMC44MzEzODM4MiwKKyAgICAtMS44MzI2OTM3LCAtMC44MDA1MTU0MSwgLTEuODQ2NTA2NCwgLTAuNzY4MDg5MTIsIC0xLjg2MDI1NywgLTAuNzM0MTM3ODksIC0xLjg3Mzg1MTUsIC0wLjY5ODY5ODk0LAorICAgIC0xLjg4NzE5NTcsIC0wLjY2MTgxNDE1LCAtMS45MDAxOTUyLCAtMC42MjM1MzAwMywgLTEuOTEyNzU2NCwgLTAuNTgzODk3ODksIC0xLjkyNDc4NywgLTAuNTQyOTc0MTEsCisgICAgLTEuOTM2MTk2OCwgLTAuNTAwODE5OTgsIC0xLjk0Njg5OCwgLTAuNDU3NTAxODksIC0xLjk1NjgwNzEsIC0wLjQxMzA5MTM5LCAtMS45NjU4NDQ5LCAtMC4zNjc2NjU0NywKKyAgICAtMS45NzM5Mzc5LCAtMC4zMjEzMDY3MSwgLTEuOTgxMDE5NiwgLTAuMjc0MTAzNTgsIC0xLjk4NzAzMDksIC0wLjIyNjE1MTA5LCAtMS45OTE5MjEyLCAtMC4xNzc1NTEyMSwKKyAgICAtMS45OTU2NDk1LCAtMC4xMjg0MTM1NCwgLTEuOTk4MTg0MSwgLTAuMDc4ODU2MTMzLCAtMS45OTk1MDM3LCAtMC4wMjkwMDYxODUsIC0xLjk5OTU5NzIsIDAuMDIwOTk5MDUzLAorICAgIC0xLjk5ODQ2MjksIDAuMDcxMDExNTgxLCAtMS45OTYxMDg4LCAwLjEyMDg3MTk1LCAtMS45OTI1NTA2LCAwLjE3MDQwODc3LCAtMS45ODc4MTE3LCAwLjIxOTQzODM2LAorICAgIC0xLjk4MTkyMDIsIDAuMjY3NzY0ODEsIC0xLjk3NDkwODQsIDAuMzE1MTgwMjEsIC0xLjk2NjgwOTQsIDAuMzYxNDY1NDUsIC0xLjk1NzY1NjMsIDAuNDA2MzkxMzUsCisgICAgLTEuOTQ3NDc4NSwgMC40NDk3MjAxMSwgLTEuOTM2MzAwNiwgMC40OTEyMDc1MSwgLTEuOTI0MTM5MywgMC41MzA2MDUzOCwgLTEuOTExMDAxNiwgMC41Njc2NjQ1LAorICAgIC0xLjg5Njg4MzQsIDAuNjAyMTM3OTgsIC0xLjg4MTc2NzUsIDAuNjMzNzg0ODksIC0xLjg2NTYyMjksIDAuNjYyMzc0MiwgLTEuODQ4NDA0MiwgMC42ODc2ODkwMSwKKyAgICAtMS44MzAwNTEyLCAwLjcwOTUzMDU5LCAtMS44MTA0ODk4LCAwLjcyNzcyMjcsIC0xLjc4OTYzMzIsIDAuNzQyMTE1NTYsIC0xLjc2NzM4MjUsIDAuNzUyNTg5ODIsCisgICAgLTEuNzQzNjMwMiwgMC43NTkwNTk5MSwgLTEuNzE4MjYyLCAwLjc2MTQ3NzI5LCAtMS42OTExNTk4LCAwLjc1OTgzMjg2LCAtMS42NjIyMDU3LCAwLjc1NDE1ODg1LAorICAgIC0xLjYzMTI4NTMsIDAuNzQ0NTMwMiwgLTEuNTk4MjkyLCAwLjczMTA2NTAzLCAtMS41NjMxMzA1LCAwLjcxMzkyNDE3LCAtMS41MjU3MjE4LCAwLjY5MzMxMDM4LAorICAgIC0xLjQ4NjAwNjMsIDAuNjY5NDY2MzIsIC0xLjQ0Mzk0NzcsIDAuNjQyNjcxOTQsIC0xLjM5OTUzNzEsIDAuNjEzMjQwOSwgLTEuMzUyNzk1MiwgMC41ODE1MTY1NiwKKyAgICAtMS4zMDM3NzU0LCAwLjU0Nzg2NzI0LCAtMS4yNTI1NjU1LCAwLjUxMjY4MDcxLCAtMS4xOTkyODksIDAuNDc2MzU4MzgsIC0xLjE0NDEwNTQsIDAuNDM5MzA5MjQsCisgICAgLTEuMDg3MjEwNSwgMC40MDE5NDMyNCwgLTEuMDI4ODM0NywgMC4zNjQ2NjQ3MywgLTAuOTY5MjQxNDQsIDAuMzI3ODY2MDIsIC0wLjkwODcyNDczLCAwLjI5MTkyMDksCisgICAgLTAuODQ3NjA1MDUsIDAuMjU3MTc4NTQsIC0wLjc4NjIyNTUsIDAuMjIzOTU3ODUsIC0wLjcyNDk0NjgsIDAuMTkyNTQyMzYsIC0wLjY2NDE0MTc3LCAwLjE2MzE3NTgyLAorICAgIC0wLjYwNDE4OTE2LCAwLjEzNjA1ODY0LCAtMC41NDU0Njc0NCwgMC4xMTEzNDUxOSwgLTAuNDg4MzQ4MSwgMC4wODkxNDIwOTIsIC0wLjQzMzE4OTA5LCAwLjA2OTUwNzU1NCwKKyAgICAtMC4zODAzMjgwMywgMC4wNTI0NTE4MTIsIC0wLjMzMDA3NjE2LCAwLjAzNzkzODU4NywgLTAuMjgyNzEyMTYsIDAuMDI1ODg3NjE2LCAtMC4yMzg0NzcwNSwgMC4wMTYxNzgxNTMsCisgICAgLTAuMTk3NTY5NjIsIDAuMDA4NjUzNDAyMywgLTAuMTYwMTQyNjIsIDAuMDAzMTI1Njk0MSwgLTAuMTI2MzAwMTYsIC0wLjAwMDYxNzY2MjM5LCAtMC4wOTYwOTYxMTMsIC0wLjAwMjgwODA1OTYsCisgICAgLTAuMDY5NTMzNjMxLCAtMC4wMDM2ODg5NjEsIC0wLjA0NjU2NTg0NiwgLTAuMDAzNTA5MTU5NywgLTAuMDI3MDk3NzEzLCAtMC4wMDI1MTYxMTg4LCAtMC4wMTA5ODkwNDYsIC0wLjAwMDk0OTU4OTc3LAorICAgIDAuMDAxOTQxNTE0MiwgMC4wMDA5NjQzMDYxMiwgMC4wMTE5MTE1NDEsIDAuMDAzMDE4MzYxMSwgMC4wMTkxNjkxMTgsIDAuMDA1MDI4NzgwMSwgMC4wMjM5ODY1MTcsIDAuMDA2ODM4NzcyLAorICAgIDAuMDI2NjUzNDU5LCAwLjAwODMyMTE0ODMsIDAuMDI3NDcwMTY2LCAwLjAwOTM3OTg2NTYsIDAuMDI2NzQwNDAyLCAwLjAwOTk1MDUwNDYsIDAuMDI0NzY0NywgMC4wMDk5OTk3MDI3LAorICAgIDAuMDIxODM0MDA4LCAwLjAwOTUyMzU5NzUsIDAuMDE4MjIzODg0LCAwLjAwODU0NTM4MTksIDAuMDE0MTg5NDIxLCAwLjAwNzExMjA3ODgsIDAuMDA5OTYxMDMzMiwgMC4wMDUyOTA3MDcxLAorICAgIDAuMDA1NzQxMTcyOSwgMC4wMDMxNjM5Nzk0LCAwLjAwMTcwMjA0NzgsIDAuMDAwODI1NzI4MjMsIC0wLjAwMjAxNTY0NzUsIC0wLjAwMTYyMzc2NzMsIC0wLjAwNTMwMzAwNjYsIC0wLjAwNDA4MjM3NTcsCisgICAgLTAuMDA4MDgyMjQ3MywgLTAuMDA2NDUwNDYzNiwgLTAuMDEwMzA1MTksIC0wLjAwODYzNDg1MjIsIC0wLjAxMTk1MDk5NiwgLTAuMDEwNTUyMjU3LCAtMC4wMTMwMjMyOTgsIC0wLjAxMjEzMjExOCwKKyAgICAtMC4wMTM1NDY4NTYsIC0wLjAxMzMxODc0MiwgLTAuMDEzNTYzOTExLCAtMC4wMTQwNzI3MjQsIC0wLjAxMzEzMDM3MSwgLTAuMDE0MzcxNjYzLCAtMC4wMTIzMTE5OTIsIC0wLjAxNDIxMDE2NCwKKyAgICAtMC4wMTExODA2NzcsIC0wLjAxMzU5OTE5MywgLTAuMDA5ODExMDE2NywgLTAuMDEyNTY0ODY4LCAtMC4wMDgyNzcxNzA0LCAtMC4wMTExNDY3NTgsIC0wLjAwNjY1MDE2MTksIC0wLjAwOTM5NTgwNDMsCisgICAgLTAuMDA0OTk1NjQwOCwgLTAuMDA3MzcxOTcwOSwgLTAuMDAzMzcyMTM2NSwgLTAuMDA1MTQxNzM2OSwgLTAuMDAxODI5ODExNiwgLTAuMDAyNzc1NTM0OCwgLTAuMDAwNDA5Njk4MTQsIC0wLjAwMDM0NTIzOTE1LAorICAgIDAuMDAwODU2NjE4MjIsIDAuMDAyMDc4MjA0OSwgMC4wMDE5NDY5MTI2LCAwLjAwNDQyNjk0NSwgMC4wMDI4NDc4OTIsIDAuMDA2NjM4MTEyNSwgMC4wMDM1NTQ0ODg4LCAwLjAwODY1NTQwMTksCisgICAgMC4wMDQwNjg5NDI3LCAwLjAxMDQzMDMxMywgMC4wMDQzOTk3NDExLCAwLjAxMTkyMzA0NywgMC4wMDQ1NjA0NzUyLCAwLjAxMzEwMzA2MywgMC4wMDQ1Njg2Nzg4LCAwLjAxMzk0OTMxMiwKKyAgICAwLjAwNDQ0NDY4NTgsIDAuMDE0NDUwMTc1LCAwLjAwNDIxMDU2MjQsIDAuMDE0NjAzMTM0LCAwLjAwMzg4OTEzMTEsIDAuMDE0NDE0MjQyLCAwLjAwMzUwMzExNjEsIDAuMDEzODk3MzksCisgICAgMC4wMDMwNzQ0MTg4LCAwLjAxMzA3MzQ2LCAwLjAwMjYyMzUzMTcsIDAuMDExOTY5Mzc0LCAwLjAwMjE2OTA4MzYsIDAuMDEwNjE3MDgyLCAwLjAwMTcyNzUxMDcsIDAuMDA5MDUyNTQyLAorICAgIDAuMDAxMzEyODQzMywgMC4wMDczMTQ2OTE4LCAwLjAwMDkzNjU5MDc4LCAwLjAwNTQ0NDQ1OTIsIDAuMDAwNjA3NzExNSwgMC4wMDM0ODM4MTQ0LCAwLjAwMDMzMjY1MDM1LCAwLjAwMTQ3NDg5MTEsCisgICAgMC4wMDAxMTU0MzA3NSwgLTAuMDAwNTQwODMwMDgsIC0wLjAwMDA0MjIxMzQwNywgLTAuMDAyNTIzMjU1OCwgLTAuMDAwMTQwNjc2MzYsIC0wLjAwNDQzNDMzODgsIC0wLjAwMDE4MjI5ODgzLCAtMC4wMDYyMzg2NTg5LAorICAgIC0wLjAwMDE3MTE3MjM3LCAtMC4wMDc5MDM5MjMzLCAtMC4wMDAxMTI5MzQ1MSwgLTAuMDA5NDAxMzk3OCwgLTAuMDAwMDE0NTU2Nzg4LCAtMC4wMTA3MDYyNTcsIDAuMDAwMTE1ODczMDIsIC0wLjAxMTc5Nzg3MiwKKyAgICAwLjAwMDI2OTM3NDM3LCAtMC4wMTI2NjAwMjMsIDAuMDAwNDM2MzAzNjQsIC0wLjAxMzI4MTA0NiwgMC4wMDA2MDY1OTAzLCAtMC4wMTM2NTM5MTQsIDAuMDAwNzY5OTc5NzMsIC0wLjAxMzc3NjI0NiwKKyAgICAwLjAwMDkxNjI4MTEzLCAtMC4wMTM2NTAyNDQsIDAuMDAxMDM1NjE5OSwgLTAuMDEzMjgyNTc5LCAwLjAwMTExODY4OTksIC0wLjAxMjY4NDE4NCwgMC4wMDExNTcwMDIzLCAtMC4wMTE4Njk5OTYsCisgICAgMC4wMDExNDMxMjU1LCAtMC4wMTA4NTg2MjMsIDAuMDAxMDcwOTA4OSwgLTAuMDA5NjcxOTU3MiwgMC4wMDA5MzU2ODQ3NywgLTAuMDA4MzM0NzE2OCwgMC4wMDA3MzQ0NDEwNCwgLTAuMDA2ODczOTQ2NiwKKyAgICAwLjAwMDQ2NTk1NjUyLCAtMC4wMDUzMTg0NzQ1LCAwLjAwMDEzMDg5NDYxLCAtMC4wMDM2OTgzMjkyLCAtMC4wMDAyNjgxNTE0NiwgLTAuMDAyMDQ0MTQyLCAtMC4wMDA3MjY2NjQ0NCwgLTAuMDAwMzg2NTM2NjUsCisgICAgLTAuMDAxMjM4MjYzLCAwLjAwMTI0NDQ3MzYsIC0wLjAwMTc5NDgxNDEsIDAuMDAyODIwMDcyOSwgLTAuMDAyMzg2NTk4NiwgMC4wMDQzMTMxOTY1LCAtMC4wMDMwMDI1MjMyLCAwLjAwNTY5OTAzOTksCisgICAgLTAuMDAzNjMwMzc0MywgMC4wMDY5NTU1MTIzLCAtMC4wMDQyNTcxMDY3LCAwLjAwODA2MzYyMTgsIC0wLjAwNDg2OTE1ODgsIDAuMDA5MDA3NzkwMSwgLTAuMDA1NDUyNzgzMywgMC4wMDk3NzYwODc1LAorICAgIC0wLjAwNTk5NDM4NTEsIDAuMDEwMzYwMzc5LCAtMC4wMDY0ODA4NTQ5LCAwLjAxMDc1NjM5NSwgLTAuMDA2ODk5ODk0MiwgMC4wMTA5NjM3MTMsIC0wLjAwNzI0MDMxNDUsIDAuMDEwOTg1NjY2LAorICAgIC0wLjAwNzQ5MjMxMzYsIDAuMDEwODI5MTc0LCAtMC4wMDc2NDc3MTQxLCAwLjAxMDUwNDUwNiwgLTAuMDA3NzAwMTY0MywgMC4wMTAwMjQ5ODUsIC0wLjAwNzY0NTMwMTEsIDAuMDA5NDA2NjQ1OCwKKyAgICAtMC4wMDc0ODA4NjE2LCAwLjAwODY2NzgzNzgsIC0wLjAwNzIwNjc1OTQsIDAuMDA3ODI4ODA1NiwgLTAuMDA2ODI1MTA3NiwgMC4wMDY5MTEyMzc3LCAtMC4wMDYzNDAyMDQzLCAwLjAwNTkzNzc5NzUsCisgICAgLTAuMDA1NzU4NDcxMywgMC4wMDQ5MzE2NDQ1LCAtMC4wMDUwODgzNTU5LCAwLjAwMzkxNTk1NjIsIC0wLjAwNDM0MDE4OSwgMC4wMDI5MTM0NDk3LCAtMC4wMDM1MjYwMDY2LCAwLjAwMTk0NTkyMTcsCisgICAgLTAuMDAyNjU5MzM2LCAwLjAwMTAzMzgwNCwgLTAuMDAxNzU0OTQ2NywgMC4wMDAxOTU3NDg3MSwgLTAuMDAwODI4NTcxMDksIC0wLjAwMDU1MTc1MTc2LCAwLjAwMDEwMzQwNTE3LCAtMC4wMDExOTQ3MDIxLAorICAgIDAuMDAxMDI0Mjc2NCwgLTAuMDAxNzIxODkwOCwgMC4wMDE5MTczNzAxLCAtMC4wMDIxMjUxMTc3LCAwLjAwMjc2NjQxMzgsIC0wLjAwMjM5OTM1NzUsIDAuMDAzNTU1OTA5MywgLTAuMDAyNTQyODUxNywKKyAgICAwLjAwNDI3MTUwMTcsIC0wLjAwMjU1NzEyMzMsIDAuMDA0OTAwMzQxNCwgLTAuMDAyNDQ2OTEyOSwgMC4wMDU0MzE0MTg4LCAtMC4wMDIyMjAwMzUxLCAwLjAwNTg1NTg2OTUsIC0wLjAwMTg4NzE1MzQsCisgICAgMC4wMDYxNjcyMzE2LCAtMC4wMDE0NjE0ODI4LCAwLjAwNjM2MTY1MTcsIC0wLjAwMDk1ODQyMTczLCAwLjAwNjQzODAyNDgsIC0wLjAwMDM5NTEyNTA0LCAwLjAwNjM5ODA2MDgsIDAuMDAwMjA5OTcwMzMsCisgICAgMC4wMDYyNDYyNzg1LCAwLjAwMDgzNzY1MzQ3LCAwLjAwNTk4OTkxMjksIDAuMDAxNDY4NDY2NiwgMC4wMDU2Mzg3NDcsIDAuMDAyMDgzMjMzMywgMC4wMDUyMDQ4NjM4LCAwLjAwMjY2MzU3MjYsCisgICAgMC4wMDQ3MDIzMjkyLCAwLjAwMzE5MjM4MjIsIDAuMDA0MTQ2ODEwMiwgMC4wMDM2NTQyNzQ2LCAwLjAwMzU1NTE0NTEsIDAuMDA0MDM1OTUzOSwgMC4wMDI5NDQ4Nzc2LCAwLjAwNDMyNjUyMjgsCisgICAgMC4wMDIzMzM3Njc5LCAwLjAwNDUxNzcxMTIsIDAuMDAxNzM5MzAxNiwgMC4wMDQ2MDQwMTc0LCAwLjAwMTE3ODIwNywgMC4wMDQ1ODI3NzE2LCAwLjAwMDY2NjAwMjg2LCAwLjAwNDQ1NDEwNzUsCisgICAgMC4wMDAyMTY1ODU0MiwgMC4wMDQyMjA4NjEsIC0wLjAwMDE1ODEyOTMsIDAuMDAzODg4MzkzMywgLTAuMDAwNDQ4NDk5NiwgMC4wMDM0NjQzNTU4LCAtMC4wMDA2NDczODAxOSwgMC4wMDI5NTg0MDAyLAorICAgIC0wLjAwMDc1MDI2ODExLCAwLjAwMjM4MTg1MjEsIC0wLjAwMDc1NTM3MSwgMC4wMDE3NDczNTkzLCAtMC4wMDA2NjM1OTgyNCwgMC4wMDEwNjg1MjQ3LCAtMC4wMDA0Nzg0Nzk1NywgMC4wMDAzNTk1Mzk5NiwKKyAgICAtMC4wMDAyMDYwMTU5NywgLTAuMDAwMzY1MTcyNzIsIDAuMDAwMTQ1NTI4MjgsIC0wLjAwMTA5MTMwMDIsIDAuMDAwNTY1ODg0NTIsIC0wLjAwMTgwNDk1MDYsIDAuMDAxMDQzMDc5LCAtMC4wMDI0OTI5MzQ5LAorICAgIDAuMDAxNTYzNzYyNSwgLTAuMDAzMTQzMDEwNCwgMC4wMDIxMTM1NjExLCAtMC4wMDM3NDQwODYsIDAuMDAyNjc3NDM2MiwgLTAuMDA0Mjg2Mzg4OSwgMC4wMDMyNDAwNDY2LCAtMC4wMDQ3NjE1ODc0LAorICAgIDAuMDAzNzg2MTA1MiwgLTAuMDA1MTYyODgyNiwgMC4wMDQzMDA3MTkxLCAtMC4wMDU0ODUwNTYsIDAuMDA0NzY5NzEzMiwgLTAuMDA1NzI0NDg2OSwgMC4wMDUxNzk5MjQ0LCAtMC4wMDU4NzkxNCwKKyAgICAwLjAwNTUxOTQ3MDIsIC0wLjAwNTk0ODUyMTIsIDAuMDA1Nzc3OTgxMSwgLTAuMDA1OTMzNjA5MywgMC4wMDU5NDY4MDIsIC0wLjAwNTgzNjc2NzYsIDAuMDA2MDE5MTQ5LCAtMC4wMDU2NjE2MzAxLAorICAgIDAuMDA1OTkwMjM0MiwgLTAuMDA1NDEyOTc0OSwgMC4wMDU4NTczNDU2LCAtMC4wMDUwOTY1ODEzLCAwLjAwNTYxOTg4NjgsIC0wLjAwNDcxOTA3MzksIDAuMDA1Mjc5Mzc0MywgLTAuMDA0Mjg3NzU5MywKKyAgICAwLjAwNDgzOTM5NzUsIC0wLjAwMzgxMDQ1MzIsIDAuMDA0MzA1NTI5OSwgLTAuMDAzMjk1MzExMiwgMC4wMDM2ODUyMDk3LCAtMC4wMDI3NTA2NTI2LCAwLjAwMjk4NzU3NjYsIC0wLjAwMjE4NDc5NSwKKyAgICAwLjAwMjIyMzI3NDcsIC0wLjAwMTYwNTg5NTgsIDAuMDAxNDA0MjI2NSwgLTAuMDAxMDIxODA1MiwgMC4wMDA1NDMzNzc0OCwgLTAuMDAwNDM5OTM5MTIsIC0wLjAwMDM0NTU3ODY4LCAwLjAwMDEzMjgyOTU2LAorICAgIC0wLjAwMTI0ODQ5MDQsIDAuMDAwNjkwMjU0NjcsIC0wLjAwMjE1MTA0NjIsIDAuMDAxMjI2Nzc0OCwgLTAuMDAzMDM5MDcxOCwgMC4wMDE3Mzc1NDMzLCAtMC4wMDM4OTg4MjA2LCAwLjAwMjIxODQzMDksCisgICAgLTAuMDA0NzE3MjQ2MiwgMC4wMDI2NjYwMDAzLCAtMC4wMDU0ODIyNTIyLCAwLjAwMzA3NzQ1ODQsIC0wLjAwNjE4MjkwOTUsIDAuMDAzNDUwNTgzNywgLTAuMDA2ODA5NjM5NywgMC4wMDM3ODM2NDE0LAorICAgIC0wLjAwNzM1NDM1MTIsIDAuMDA0MDc1Mjg1LCAtMC4wMDc4MTA1MzU0LCAwLjAwNDMyNDQ1NTMsIC0wLjAwODE3MzMxMywgMC4wMDQ1MzAyNzk5LCAtMC4wMDg0Mzk0MzU2LCAwLjAwNDY5MTk4NzgsCisgICAgLTAuMDA4NjA3MjQzMiwgMC4wMDQ4MDg4MzEsIC0wLjAwODY3NjU4MjksIDAuMDA0ODgwMDQsIC0wLjAwODY0ODY5MjYsIDAuMDA0OTA0NzkyMiwgLTAuMDA4NTI2MDY2MywgMC4wMDQ4ODIyMjIsCisgICAgLTAuMDA4MzEyMjg3NywgMC4wMDQ4MTE0NTMyLCAtMC4wMDgwMTE4NzE5LCAwLjAwNDY5MTY2NDEsIC0wLjAwNzYzMDA5NDksIDAuMDA0NTIyMTc5NywgLTAuMDA3MTcyODM2OSwgMC4wMDQzMDI1ODQ2LAorICAgIC0wLjAwNjY0NjQ0MzIsIDAuMDA0MDMyODUzMSwgLTAuMDA2MDU3NjAyNCwgMC4wMDM3MTM0ODYzLCAtMC4wMDU0MTMyNTQzLCAwLjAwMzM0NTY0ODMsIC0wLjAwNDcyMDUyNTQsIDAuMDAyOTMxMjkxMiwKKyAgICAtMC4wMDM5ODY2OTM1LCAwLjAwMjQ3MzI2MjEsIC0wLjAwMzIxOTE3NDIsIDAuMDAxOTc1Mzc5NCwgLTAuMDAyNDI1NTM1MSwgMC4wMDE0NDI0NzYzLCAtMC4wMDE2MTM1MjEsIDAuMDAwODgwMzk5MiwKKyAgICAtMC4wMDA3OTEwOTA1NCwgMC4wMDAyOTU5NjM1NywgMC4wMDAwMzM1NDgwOCwgLTAuMDAwMzAzMTM4ODMsIDAuMDAwODUxOTA4ODcsIC0wLjAwMDkwODQ3NzgxLCAwLjAwMTY1NTIxNiwgLTAuMDAxNTExMDY1MiwKKyAgICAwLjAwMjQzNDQxNTMsIC0wLjAwMjEwMTU3MTUsIDAuMDAzMTgwMjE1MSwgLTAuMDAyNjcwNTcxLCAwLjAwMzg4MzE2MTgsIC0wLjAwMzIwODgwNDksIDAuMDA0NTMzNzUsIC0wLjAwMzcwNzQ1MzQsCisgICAgMC4wMDUxMjI1Njk5LCAtMC4wMDQxNTg0MDIzLCAwLjAwNTY0MDQ4ODEsIC0wLjAwNDU1NDQ5MzgsIDAuMDA2MDc4ODU1NiwgLTAuMDA0ODg5NzUyMywgMC4wMDY0Mjk3NDIxLCAtMC4wMDUxNTk1NzIyLAorICAgIDAuMDA2Njg2MTc4NSwgLTAuMDA1MzYwODU4LCAwLjAwNjg0MjQwNiwgLTAuMDA1NDkyMTE3MywgMC4wMDY4OTQxMTkxLCAtMC4wMDU1NTM0OTE0LCAwLjAwNjgzODY4NjMsIC0wLjAwNTU0NjczNDcsCisgICAgMC4wMDY2NzUzNDc3LCAtMC4wMDU0NzUxMzA5LCAwLjAwNjQwNTM2NDcsIC0wLjAwNTM0MzM1OSwgMC4wMDYwMzIxMzA3LCAtMC4wMDUxNTczMTA1LCAwLjAwNTU2MTIxOTUsIC0wLjAwNDkyMzg2NDMsCisgICAgMC4wMDUwMDAzNzU3LCAtMC4wMDQ2NTA2MzE5LCAwLjAwNDM1OTQ0MTMsIC0wLjAwNDM0NTY3ODMsIDAuMDAzNjUwMjE2MiwgLTAuMDA0MDE3MjM3MSwgMC4wMDI4ODYyNTksIC0wLjAwMzY3MzQyMjYsCisgICAgMC4wMDIwODI2MjU2LCAtMC4wMDMzMjE5NTQ3LCAwLjAwMTI1NTU1OTMsIC0wLjAwMjk2OTkwOSwgMC4wMDA0MjIxMzQ1OSwgLTAuMDAyNjIzNDkzNiwgLTAuMDAwNDAwMTMyMywgLTAuMDAyMjg3ODcwNywKKyAgICAtMC4wMDExOTM2OTU0LCAtMC4wMDE5NjcwMTk5LCAtMC4wMDE5NDE0MDIyLCAtMC4wMDE2NjM2NTM5LCAtMC4wMDI2MjY5MTUyLCAtMC4wMDEzNzkxODU1LCAtMC4wMDMyMzUxMTk0LCAtMC4wMDExMTM3NDgyLAorICAgIC0wLjAwMzc1MjUwMzgsIC0wLjAwMDg2NjI2ODEyLCAtMC4wMDQxNjc1MDUxLCAtMC4wMDA2MzQ1ODI3NywgLTAuMDA0NDcwODA1MiwgLTAuMDAwNDE1NjAzOTIsIC0wLjAwNDY1NTU2ODksIC0wLjAwMDIwNTUxNTQ2LAorfTsKKworY29uc3QgZmxvYXQgZmZfb24yYXZjX2N0YWJfM1syMDQ4XSA9IHsKKyAgICAtMS42NjUzMzQ1ZS0xNiwgLTAuMDAyODQyOTA1MiwgLTAuMDAwMDQyNTM3NDU2LCAwLjAwMDE5NDg3NTU0LCAtMC4wMDAxNjg2MjI1MywgMC4wMDA0MDMwNjI3NiwgLTAuMDAwMzczNzI0NDcsIDAuMDAwNjM3Mjk4MTYsCisgICAgLTAuMDAwNjUwNDYwNiwgMC4wMDA5MDkxODczMSwgLTAuMDAwOTg4ODQzODUsIDAuMDAxMjI4Njg2NSwgLTAuMDAxMzc2NjE3NywgMC4wMDE2MDM2NDEyLCAtMC4wMDE3OTk2NjgyLCAwLjAwMjAzOTM5MzksCisgICAgLTAuMDAyMjQyNSwgMC4wMDI1Mzg0NzgyLCAtMC4wMDI2ODg3NTk5LCAwLjAwMzEwMDQwODcsIC0wLjAwMzEyMTc5NDIsIDAuMDAzNzIxNTc0MywgLTAuMDAzNTI1MjE1NywgMC4wMDQzOTUyMzkxLAorICAgIC0wLjAwMzg4MzQ2ODcsIDAuMDA1MTExNjUzOCwgLTAuMDA0MTgyMzY5OSwgMC4wMDU4NTgyNzcsIC0wLjAwNDQwOTYwNjEsIDAuMDA2NjIwMDkxNCwgLTAuMDA0NTU1MTc3NCwgMC4wMDczODAwMjIyLAorICAgIC0wLjAwNDYxMTc2MjcsIDAuMDA4MTE5NDI3NiwgLTAuMDA0NTc1MDA0MywgMC4wMDg4MTg2NjI3LCAtMC4wMDQ0NDM2OTYyLCAwLjAwOTQ1NzY4NjksIC0wLjAwNDIxOTg2NTksIDAuMDEwMDE2NzA0LAorICAgIC0wLjAwMzkwODc1NTMsIDAuMDEwNDc2ODE1LCAtMC4wMDM1MTg2OTI3LCAwLjAxMDgyMDY1NCwgLTAuMDAzMDYwODYwNiwgMC4wMTEwMzMwMDIsIC0wLjAwMjU0ODk2NywgMC4wMTExMDEzNDUsCisgICAgLTAuMDAxOTk4ODI5LCAwLjAxMTAxNjM1NiwgLTAuMDAxNDI3ODc5MywgMC4wMTA3NzIzMDgsIC0wLjAwMDg1NDYxNjExLCAwLjAxMDM2NzM3LCAtMC4wMDAyOTgwMDU1MywgMC4wMDk4MDM3OTYyLAorICAgIDAuMDAwMjIzMTM4MzEsIDAuMDA5MDg3OTk2NiwgMC4wMDA2OTA3Nzg1NCwgMC4wMDgyMzA0ODMyLCAwLjAwMTA4ODI2NiwgMC4wMDcyNDU2ODc4LCAwLjAwMTQwMDkxNDUsIDAuMDA2MTUxNjU1MiwKKyAgICAwLjAwMTYxNjUyMjMsIDAuMDA0OTY5NjI5OSwgMC4wMDE3MjU4MjIyLCAwLjAwMzcyMzUyNzUsIDAuMDAxNzIyODQzOSwgMC4wMDI0MzkzMjIsIDAuMDAxNjA1MTc2OSwgMC4wMDExNDQzNTc1LAorICAgIDAuMDAxMzc0MTI0NCwgLTAuMDAwMTMzMzkzMSwgMC4wMDEwMzQ3Mzg1LCAtMC4wMDEzNjYxMDIsIDAuMDAwNTk1NzM3MzEsIC0wLjAwMjUyNjg2ODEsIDAuMDAwMDY5MzAzNDYsIC0wLjAwMzU5MDQ4NTEsCisgICAgLTAuMDAwNTI5MjMzMDgsIC0wLjAwNDUzNDE2ODYsIC0wLjAwMTE4MTgxNywgLTAuMDA1MzM4MjI0MSwgLTAuMDAxODY4MTg1MiwgLTAuMDA1OTg2NjI5MSwgLTAuMDAyNTY2NDYyNCwgLTAuMDA2NDY3NTE3NSwKKyAgICAtMC4wMDMyNTM4MjExLCAtMC4wMDY3NzM1Mzk4LCAtMC4wMDM5MDcxODA0LCAtMC4wMDY5MDIwOTg3LCAtMC4wMDQ1MDM5Mjk1LCAtMC4wMDY4NTU0Mzk5LCAtMC4wMDUwMjI2NDQ1LCAtMC4wMDY2NDA2MDA1LAorICAgIC0wLjAwNTQ0Mzc4NTgsIC0wLjAwNjI2OTIxNDIsIC0wLjAwNTc1MDM0MjMsIC0wLjAwNTc1NzE3MjYsIC0wLjAwNTkyODQxNDksIC0wLjAwNTEyNDE1OTYsIC0wLjAwNTk2NzcwMzYsIC0wLjAwNDM5MzA2NDQsCisgICAgLTAuMDA1ODYxODk2NiwgLTAuMDAzNTg5MjkzLCAtMC4wMDU2MDg5Mzc3LCAtMC4wMDI3NDAwMDE4LCAtMC4wMDUyMTExNjUyLCAtMC4wMDE4NzMyNzA4LCAtMC4wMDQ2NzUzMTQ4LCAtMC4wMDEwMTcyNDU5LAorICAgIC0wLjAwNDAxMjM4NDUsIC0wLjAwMDE5OTI3NDEyLCAtMC4wMDMyMzczNjU3LCAwLjAwMDU1NDkzODM5LCAtMC4wMDIzNjg4NDEzLCAwLjAwMTIyMjEyMDQsIC0wLjAwMTQyODQ2ODYsIDAuMDAxNzgyMTU2NCwKKyAgICAtMC4wMDA0NDAzNTU4MywgMC4wMDIyMTg3MSwgMC4wMDA1Njk2NDYwNywgMC4wMDI1MTk3Mjg4LCAwLjAwMTU3NDcxNzIsIDAuMDAyNjc3ODE2LCAwLjAwMjU0Nzg4MzIsIDAuMDAyNjkwNDUxOSwKKyAgICAwLjAwMzQ2Mjg0NSwgMC4wMDI1NjAwNjIzLCAwLjAwNDI5NDc5OTYsIDAuMDAyMjkzOTI0MywgMC4wMDUwMjEyMjI5LCAwLjAwMTkwMzkxNzgsIDAuMDA1NjIyNTg4MSwgMC4wMDE0MDYxMjQxLAorICAgIDAuMDA2MDgzMDA0NiwgMC4wMDA4MjAyODc2MiwgMC4wMDYzOTA3Mzg4LCAwLjAwMDE2OTE1Mzc1LCAwLjAwNjUzODYxOTMsIC0wLjAwMDUyMjI5Mjk4LCAwLjAwNjUyNDI5MTQsIC0wLjAwMTIyNzY2ODgsCisgICAgMC4wMDYzNTAzMjgyLCAtMC4wMDE5MjAwODEsIDAuMDA2MDI0MTgsIC0wLjAwMjU3MzAzODUsIDAuMDA1NTU3OTY4MywgLTAuMDAzMTYxMzU0NywgMC4wMDQ5NjgxMjc3LCAtMC4wMDM2NjIwMTE4LAorICAgIDAuMDA0Mjc0OTA0NywgLTAuMDA0MDU0OTU3NSwgMC4wMDM1MDE3MjYxLCAtMC4wMDQzMjM4MDc1LCAwLjAwMjY3NDQ2MDYsIC0wLjAwNDQ1NjQyODgsIDAuMDAxODIwNTk0NywgLTAuMDA0NDQ1MzgzOCwKKyAgICAwLjAwMDk2ODM0MzM1LCAtMC4wMDQyODgyMjMxLCAwLjAwMDE0NTczNDU2LCAtMC4wMDM5ODc2MDQ4LCAtMC4wMDA2MjAzMTI3LCAtMC4wMDM1NTEyNTEsIC0wLjAwMTMwNDg3OTksIC0wLjAwMjk5MTcyNTcsCisgICAgLTAuMDAxODg1ODgyOSwgLTAuMDAyMzI2MDUwMSwgLTAuMDAyMzQ0ODE5MywgLTAuMDAxNTc1MTYyNSwgLTAuMDAyNjY3NDAyNiwgLTAuMDAwNzYzMjQyNDgsIC0wLjAwMjg0NDA2MTksIDAuMDAwMDgzMDg0NDUxLAorICAgIC0wLjAwMjg3MDI4NzcsIDAuMDAwOTM1NjI5NDgsIC0wLjAwMjc0NjgxLCAwLjAwMTc2NTU4NjMsIC0wLjAwMjQ3OTYwMTksIDAuMDAyNTQ0NTA2LCAtMC4wMDIwNzk3MDU5LCAwLjAwMzI0NTI3MDMsCisgICAgLTAuMDAxNTYyODg1LCAwLjAwMzg0MzAyNzIsIC0wLjAwMDk0OTExMDQzLCAwLjAwNDMxNjA1OTksIC0wLjAwMDI2MTg5OTU1LCAwLjAwNDY0NjU1NjksIDAuMDAwNDcyNDc0NjQsIDAuMDA0ODIxMjU2NywKKyAgICAwLjAwMTIyNTg3OCwgMC4wMDQ4MzE5NDIzLCAwLjAwMTk2OTI4NDYsIDAuMDA0Njc1NzY5MiwgMC4wMDI2NzM3ODc4LCAwLjAwNDM1NTQxMzQsIDAuMDAzMzExNjIxMywgMC4wMDM4NzkwMjg4LAorICAgIDAuMDAzODU3MTUzNSwgMC4wMDMyNjAwMjAyLCAwLjAwNDI4NzgyMjYsIDAuMDAyNTE2NjMxMywgMC4wMDQ1ODQ5NzY1LCAwLjAwMTY3MTM2MTksIDAuMDA0NzM0NTkyLCAwLjAwMDc1MDIzNDk5LAorICAgIDAuMDA0NzI3ODQyMywgLTAuMDAwMjE4MDY2NjMsIDAuMDA0NTYxNDk0NiwgLTAuMDAxMjAzMTY0MSwgMC4wMDQyMzgxMTkzLCAtMC4wMDIxNzQwMTMzLCAwLjAwMzc2NjEwMiwgLTAuMDAzMDk5OTY5NiwKKyAgICAwLjAwMzE1OTQ1MzQsIC0wLjAwMzk1MTg1MDMsIDAuMDAyNDM3NDIzNywgLTAuMDA0NzAyOTU0NiwgMC4wMDE2MjM5MjcxLCAtMC4wMDUzMzAwMTAzLCAwLjAwMDc0Njc5NzgzLCAtMC4wMDU4MTQwMDc1LAorICAgIC0wLjAwMDE2MzEwMzYxLCAtMC4wMDYxNDA4OTQ3LCAtMC4wMDEwNzI5MDE0LCAtMC4wMDYzMDIxMDcxLCAtMC4wMDE5NDg4MDM5LCAtMC4wMDYyOTQ5MDcxLCAtMC4wMDI3NTcyNTEzLCAtMC4wMDYxMjI1MjQ5LAorICAgIC0wLjAwMzQ2NjA3NjksIC0wLjAwNTc5NDA5MDIsIC0wLjAwNDA0NTYzNzMsIC0wLjAwNTMyNDM1MzksIC0wLjAwNDQ2OTg3ODUsIC0wLjAwNDczMzIwNjcsIC0wLjAwNDcxNzI5MjMsIC0wLjAwNDA0NTAxMjQsCisgICAgLTAuMDA0NzcxNzM3OCwgLTAuMDAzMjg3NzcwNiwgLTAuMDA0NjIzMDg3NiwgLTAuMDAyNDkyMTQxOSwgLTAuMDA0MjY3NjgyOCwgLTAuMDAxNjkwMzYyNSwgLTAuMDAzNzA4NTcyNCwgLTAuMDAwOTE1MDg5NjIsCisgICAgLTAuMDAyOTU1NTI3MywgLTAuMDAwMTk4MjE0NSwgLTAuMDAyMDI0ODI1NCwgMC4wMDA0MzAzMTU0NCwgLTAuMDAwOTM4ODExMzQsIDAuMDAwOTQzNjIyMzgsIDAuMDAwMjc0NzU3NDgsIDAuMDAxMzE4OTMyMiwKKyAgICAwLjAwMTU4MzU1ODQsIDAuMDAxNTM4NDc4NywgMC4wMDI5NTE3MTkzLCAwLjAwMTU5MDI0NCwgMC4wMDQzNDA5Njk1LCAwLjAwMTQ2ODUwNjEsIDAuMDA1NzExODg4LCAwLjAwMTE3NDE3MSwKKyAgICAwLjAwNzAyNTIwNjksIDAuMDAwNzE0ODc0MywgMC4wMDgyNDMxMjU5LCAwLjAwMDEwNDg0NDk1LCAwLjAwOTMzMDU5NDksIC0wLjAwMDYzNTQ2OTU3LCAwLjAxMDI1NjUxMiwgLTAuMDAxNDgwMDA1NCwKKyAgICAwLjAxMDk5NDgwOCwgLTAuMDAyMzk3ODk2NywgMC4wMTE1MjUzNjMsIC0wLjAwMzM1NDQ3NTYsIDAuMDExODM0NzMsIC0wLjAwNDMxMjQyNzcsIDAuMDExOTE2NjM3LCAtMC4wMDUyMzMwNjI5LAorICAgIDAuMDExNzcyMjQzLCAtMC4wMDYwNzc2NjEyLCAwLjAxMTQxMDEzOSwgLTAuMDA2ODA4ODQ3MiwgMC4wMTA4NDYwOTEsIC0wLjAwNzM5MTk0MTcsIDAuMDEwMTAyNTI5LCAtMC4wMDc3OTYyNTA3LAorICAgIDAuMDA5MjA3Nzk0NCwgLTAuMDA3OTk2MjM0MSwgMC4wMDgxOTUxNzExLCAtMC4wMDc5NzI1MjI2LCAwLjAwNzEwMTczNTYsIC0wLjAwNzcxMjczNjcsIDAuMDA1OTY3MDU1OSwgLTAuMDA3MjEyMDczMSwKKyAgICAwLjAwNDgzMTc4ODYsIC0wLjAwNjQ3MzY0NzQsIDAuMDAzNzM2MjE5NiwgLTAuMDA1NTA4NTU3OSwgMC4wMDI3MTg4MDM1LCAtMC4wMDQzMzU2Nzg2LCAwLjAwMTgxNDc0NjUsIC0wLjAwMjk4MTE3NjQsCisgICAgMC4wMDEwNTQ2OTIsIC0wLjAwMTQ3Nzc2MzEsIDAuMDAwNDYzNTQ5NDMsIDAuMDAwMTM2Mjg3NjQsIDAuMDAwMDU5NTE3MjMxLCAwLjAwMTgxODMzODMsIC0wLjAwMDE0NjY2NzMzLCAwLjAwMzUyMjc1NTEsCisgICAgLTAuMDAwMTUyMjE3ODYsIDAuMDA1MjAyNDAyNCwgMC4wMDAwMzc0OTI2NTMsIDAuMDA2ODEwMjEzOSwgMC4wMDA0MDkwMTcyMywgMC4wMDgzMDA3ODQsIDAuMDAwOTQxMjE2MDcsIDAuMDA5NjMxOTI4MSwKKyAgICAwLjAwMTYwNTkyNTcsIDAuMDEwNzY2MTQ3LCAwLjAwMjM2ODg5NywgMC4wMTE2NzE5NTcsIDAuMDAzMTkwOTczNSwgMC4wMTIzMjUwMTgsIDAuMDA0MDI5NDc0MiwgMC4wMTI3MDkwMzEsCisgICAgMC4wMDQ4Mzk3MzA5LCAwLjAxMjgxNjM1OCwgMC4wMDU1NzY3MzU4LCAwLjAxMjY0ODM1MSwgMC4wMDYxOTY4MzM3LCAwLjAxMjIxNTM1LCAwLjAwNjY1OTQwNzIsIDAuMDExNTM2MzczLAorICAgIDAuMDA2OTI4NDg3MiwgMC4wMTA2Mzg0ODIsIDAuMDA2OTc0MjM5NCwgMC4wMDk1NTU4NTM5LCAwLjAwNjc3NDI1NzksIDAuMDA4MzI4NTc0NywgMC4wMDYzMTQ2MjgzLCAwLjAwNzAwMTIwNjMsCisgICAgMC4wMDU1OTA3MDk5LCAwLjAwNTYyMTE2NjksIDAuMDA0NjA3NjAzOSwgMC4wMDQyMzY5ODM2LCAwLjAwMzM4MDI4NTMsIDAuMDAyODk2NDc3NSwgMC4wMDE5MzMzODc0LCAwLjAwMTY0NDk0NzgsCisgICAgMC4wMDAzMDA2MzA4MSwgMC4wMDA1MjM0MjExNiwgLTAuMDAxNDc2MDc5MywgLTAuMDAwNDMyOTY1NCwgLTAuMDAzMzQ3ODc1MSwgLTAuMDAxMTk2Mzg2NSwgLTAuMDA1MjYwNDIzOCwgLTAuMDAxNzQ3NDk2MiwKKyAgICAtMC4wMDcxNTU2NTk2LCAtMC4wMDIwNzYyOTE3LCAtMC4wMDg5NzM2OTI1LCAtMC4wMDIxODI2MzE4LCAtMC4wMTA2NTQ4MzMsIC0wLjAwMjA3NjM4MTYsIC0wLjAxMjE0MTY2MiwgLTAuMDAxNzc3MTY3MiwKKyAgICAtMC4wMTMzODEwNzUsIC0wLjAwMTMxMzczNTQsIC0wLjAxNDMyNjIzOCwgLTAuMDAwNzIyOTMzOTcsIC0wLjAxNDkzODM2MSwgLTAuMDAwMDQ4MzM1MjMxLCAtMC4wMTUxODgyNTYsIDAuMDAwNjYxNDU1NzksCisgICAgLTAuMDE1MDU3NTkyLCAwLjAwMTM1NDc1NjEsIC0wLjAxNDUzOTgwMiwgMC4wMDE5Nzg5NTczLCAtMC4wMTM2NDA2MjUsIDAuMDAyNDgyODA0NywgLTAuMDEyMzc4MjE0LCAwLjAwMjgxODcxNiwKKyAgICAtMC4wMTA3ODI4MywgMC4wMDI5NDUwNjAxLCAtMC4wMDg4OTYxMTUyLCAwLjAwMjgyODMwMzcsIC0wLjAwNjc2OTk0MzUsIDAuMDAyNDQ0OTM3OCwgLTAuMDA0NDY0ODk1NSwgMC4wMDE3ODMxMDM5LAorICAgIC0wLjAwMjA0ODM5NywgMC4wMDA4NDM4NDE4NywgMC4wMDA0MDc0Mjk1NiwgLTAuMDAwMzU4MTA2ODMsIDAuMDAyODI4MTIzNSwgLTAuMDAxNzkzOTk0MSwgMC4wMDUxMzkzODc3LCAtMC4wMDM0MjEyOTczLAorICAgIDAuMDA3MjY5NjQxOSwgLTAuMDA1MTg0NTExMiwgMC4wMDkxNTI1NDg0LCAtMC4wMDcwMTY1MDI4LCAwLjAxMDcyOTQxMSwgLTAuMDA4ODQwNDE5NCwgMC4wMTE5NTEzNzEsIC0wLjAxMDU3MjEwNiwKKyAgICAwLjAxMjc4MTMxLCAtMC4wMTIxMjI5OTQsIDAuMDEzMTk1Mzg1LCAtMC4wMTM0MDMzODEsIDAuMDEzMTg0MTMxLCAtMC4wMTQzMjYwMiwgMC4wMTI3NTMwOCwgLTAuMDE0ODA5OTE1LAorICAgIDAuMDExOTIyODUzLCAtMC4wMTQ3ODQyMiwgMC4wMTA3Mjg3MDgsIC0wLjAxNDE5MjEyLCAwLjAwOTIxOTUyNzIsIC0wLjAxMjk5NDU2NCwgMC4wMDc0NTYyNzg5LCAtMC4wMTExNzM3MzgsCisgICAgMC4wMDU1MDk5NTQ0LCAtMC4wMDg3MzYxNTMxLCAwLjAwMzQ1OTA1MzMsIC0wLjAwNTcxNTIzMTksIDAuMDAxMzg2NjY5NSwgLTAuMDAyMTczMjk5NywgLTAuMDAwNjIyNzQwMTMsIDAuMDAxNzk3MTE3OCwKKyAgICAtMC4wMDI0ODY4MTE1LCAwLjAwNjA3Mjc1MTIsIC0wLjAwNDEyODg1MTUsIDAuMDEwNDk5ODU2LCAtMC4wMDU0ODE0Mjc1LCAwLjAxNDg5NTMyMSwgLTAuMDA2NDg5ODU0MywgMC4wMTkwNDg2MTQsCisgICAgLTAuMDA3MTE1NDY4NCwgMC4wMjI3MjQ1NjEsIC0wLjAwNzMzODU2NTgsIDAuMDI1NjY2ODk4LCAtMC4wMDcxNjA5MTE4LCAwLjAyNzYwMjUzNywgLTAuMDA2NjA3NzE2NCwgMC4wMjgyNDY0NjgsCisgICAgLTAuMDA1NzI4OTk2NCwgMC4wMjczMDcxNjgsIC0wLjAwNDYwMDI1MywgMC4wMjQ0OTI0LCAtMC4wMDMzMjI0MjA2LCAwLjAxOTUxNTI2OSwgLTAuMDAyMDIxMDQ5NiwgMC4wMTIxMDAzODIsCisgICAgLTAuMDAwODQ0NzIxNDUsIDAuMDAxOTg5OTQzNywgMC4wMDAwMzcyOTYyOTMsIC0wLjAxMTA1MDM0LCAwLjAwMDQzODExNTY1LCAtMC4wMjcyMjU3MzUsIDAuMDAwMTU2OTYwMTQsIC0wLjA0NjcwNzQ1NSwKKyAgICAtMC4wMDEwMTY1MTU0LCAtMC4wNjk2MjgyNzYsIC0wLjAwMzI5NzQxMjMsIC0wLjA5NjA3ODkxNywgLTAuMDA2OTAwMzk0OCwgLTAuMTI2MTA1MjgsIC0wLjAxMjAzNDI0LCAtMC4xNTk3MDY1OSwKKyAgICAtMC4wMTg4OTYyNjksIC0wLjE5NjgzNDY0LCAtMC4wMjc2NjY3OTIsIC0wLjIzNzM5Mzg0LCAtMC4wMzg1MDM3MjUsIC0wLjI4MTI0MjU1LCAtMC4wNTE1Mzc1MDMsIC0wLjMyODE5NTE1LAorICAgIC0wLjA2Njg2NjQyLCAtMC4zNzgwMjUyLCAtMC4wODQ1NTI1ODYsIC0wLjQzMDQ2OTM2LCAtMC4xMDQ2MTg0OSwgLTAuNDg1MjMyMjYsIC0wLjEyNzA0NDM4LCAtMC41NDE5OTE1OSwKKyAgICAtMC4xNTE3NjY1MSwgLTAuNjAwNDA0MjYsIC0wLjE3ODY3NjI4LCAtMC42NjAxMTI0NCwgLTAuMjA3NjIwMjgsIC0wLjcyMDc0OTk3LCAtMC4yMzg0MDEzNSwgLTAuNzgxOTQ4OCwKKyAgICAtMC4yNzA3ODA1NiwgLTAuODQzMzQ1NCwgLTAuMzA0NDgwMTEsIC0wLjkwNDU4NjY3LCAtMC4zMzkxODY4OCwgLTAuOTY1MzM1NjcsIC0wLjM3NDU1NzE3LCAtMS4wMjUyNzY1LAorICAgIC0wLjQxMDIyMTU1LCAtMS4wODQxMTkyLCAtMC40NDU3OTA2OCwgLTEuMTQxNjAyNiwgLTAuNDgwODYxNDMsIC0xLjE5NzQ5NzgsIC0wLjUxNTAyMzA1LCAtMS4yNTE2MTAyLAorICAgIC0wLjU0Nzg2Mzg0LCAtMS4zMDM3Nzk2LCAtMC41Nzg5Nzc1MywgLTEuMzUzODgxNiwgLTAuNjA3OTY5NTgsIC0xLjQwMTgyNjMsIC0wLjYzNDQ2MzQ5LCAtMS40NDc1NTY3LAorICAgIC0wLjY1ODEwNjAzLCAtMS40OTEwNDY5LCAtMC42Nzg1NzI2NSwgLTEuNTMyMjk4OCwgLTAuNjk1NTcxOSwgLTEuNTcxMzM5LCAtMC43MDg4NDkzMSwgLTEuNjA4MjE0OSwKKyAgICAtMC43MTgxOTAzNywgLTEuNjQyOTkwNiwgLTAuNzIzNDIyOTQsIC0xLjY3NTc0MjksIC0wLjcyNDQxODU4LCAtMS43MDY1NTY2LCAtMC43MjEwOTMzNiwgLTEuNzM1NTIwNywKKyAgICAtMC43MTM0MDc3NSwgLTEuNzYyNzI0NCwgLTAuNzAxMzY1ODMsIC0xLjc4ODI1MzUsIC0wLjY4NTAxMzUzLCAtMS44MTIxODczLCAtMC42NjQ0MzcsIC0xLjgzNDU5NTksCisgICAgLTAuNjM5NzU5MzYsIC0xLjg1NTUzODQsIC0wLjYxMTEzODIyLCAtMS44NzUwNjA5LCAtMC41Nzg3NjE3LCAtMS44OTMxOTY1LCAtMC41NDI4NDUxMywgLTEuOTA5OTY0NiwKKyAgICAtMC41MDM2MjcwNiwgLTEuOTI1MzcxMiwgLTAuNDYxMzY1MzEsIC0xLjkzOTQxMDQsIC0wLjQxNjMzMzIzLCAtMS45NTIwNjU5LCAtMC4zNjg4MTU3NSwgLTEuOTYzMzEyMywKKyAgICAtMC4zMTkxMDU5OCwgLTEuOTczMTE4MywgLTAuMjY3NTAxNjgsIC0xLjk4MTQ0ODcsIC0wLjIxNDMwMjE3LCAtMS45ODgyNjc1LCAtMC4xNTk4MDU2NCwgLTEuOTkzNTQwOSwKKyAgICAtMC4xMDQzMDY2LCAtMS45OTcyMzk0LCAtMC4wNDgwOTM3MjUsIC0xLjk5OTM0MTIsIDAuMDA4NTUxODM4OCwgLTEuOTk5ODM1MSwgMC4wNjUzNTgwMiwgLTEuOTk4NzIxNywKKyAgICAwLjEyMjA2Mjk0LCAtMS45OTYwMTU4LCAwLjE3ODQxNTc4LCAtMS45OTE3NDg1LCAwLjIzNDE3NzQxLCAtMS45ODU5Njc0LCAwLjI4OTEyMDc5LCAtMS45Nzg3MzgsCisgICAgMC4zNDMwMzExNCwgLTEuOTcwMTQzNywgMC4zOTU3MDU5MSwgLTEuOTYwMjg1MywgMC40NDY5NTQ4NSwgLTEuOTQ5MjgxMiwgMC40OTY1OTk2MSwgLTEuOTM3MjY1NCwKKyAgICAwLjU0NDQ3MzQ3LCAtMS45MjQzODcsIDAuNTkwNDIxMDgsIC0xLjkxMDgwODIsIDAuNjM0Mjk3NzksIC0xLjg5NjcwMjMsIDAuNjc1OTY5MywgLTEuODgyMjUxOSwKKyAgICAwLjcxNTMxMDkzLCAtMS44Njc2NDY2LCAwLjc1MjIwNzEsIC0xLjg1MzA4MDksIDAuNzg2NTUwNDYsIC0xLjgzODc1MTIsIDAuODE4MjQxMTgsIC0xLjgyNDg1NDYsCisgICAgMC44NDcxODU5MSwgLTEuODExNTg1NSwgMC44NzMyOTY5MiwgLTEuNzk5MTM0LCAwLjg5NjQ5MDg3LCAtMS43ODc2ODM0LCAwLjkxNjY4NzYxLCAtMS43Nzc0MDgyLAorICAgIDAuOTMzODA5MDQsIC0xLjc2ODQ3MjMsIDAuOTQ3Nzc3NTEsIC0xLjc2MTAyNjQsIDAuOTU4NTE0NzUsIC0xLjc1NTIwNjUsIDAuOTY1OTQwMTgsIC0xLjc1MTEzMTgsCisgICAgMC45Njk5Njk3NSwgLTEuNzQ4OTAyNywgMC45NzA1MTQ2LCAtMS43NDg1OTg4LCAwLjk2NzQ4LCAtMS43NTAyNzY5LCAwLjk2MDc2NDUzLCAtMS43NTM5Njg4LAorICAgIDAuOTUwMjU5MjEsIC0xLjc1OTY3OTQsIDAuOTM1ODQ3NjQsIC0xLjc2NzM4NDEsIDAuOTE3NDA2MDIsIC0xLjc3NzAyNjUsIDAuODk0ODAzNywgLTEuNzg4NTE3LAorICAgIDAuODY3OTA0NzIsIC0xLjgwMTcyOTQsIDAuODM2NTY5MzEsIC0xLjgxNjQ5OTcsIDAuODAwNjU2NjIsIC0xLjgzMjYyMzYsIDAuNzYwMDI3NzcsIC0xLjg0OTg1NTQsCisgICAgMC43MTQ1NDk2NiwgLTEuODY3OTA2NSwgMC42NjQwOTkzNCwgLTEuODg2NDQ0MSwgMC42MDg1NjkwOSwgLTEuOTA1MDkxOCwgMC41NDc4NzE5NSwgLTEuOTIzNDI5NSwKKyAgICAwLjQ4MTk0Nzg0LCAtMS45NDA5OTQ3LCAwLjQxMDc2OTc2LCAtMS45NTcyODQ2LCAwLjMzNDM1MDQ0LCAtMS45NzE3NTg4LCAwLjI1Mjc0ODg4LCAtMS45ODM4NDQzLAorICAgIDAuMTY2MDc2ODgsIC0xLjk5MjkzOTEsIDAuMDc0NTA1MjEsIC0xLjk5ODQxOTgsIC0wLjAyMTczMDY4OSwgLTEuOTk5NjQ4LCAtMC4xMjIzMjU3MiwgLTEuOTk1OTc4NSwKKyAgICAtMC4yMjY5MDA5OCwgLTEuOTg2NzY5MSwgLTAuMzM1MDAwNzIsIC0xLjk3MTM5MDQsIC0wLjQ0NjA5MDYxLCAtMS45NDkyMzYzLCAtMC41NTk1NTcxNCwgLTEuOTE5NzM1NiwKKyAgICAtMC42NzQ3MDkwOCwgLTEuODgyMzYzOSwgLTAuNzkwNzc5OTUsIC0xLjgzNjY1NTMsIC0wLjkwNjkzMjc3LCAtMS43ODIyMTM5LCAtMS4wMjIyNjY0LCAtMS43MTg3MjYsCisgICAgLTEuMTM1ODIzMiwgLTEuNjQ1OTcsIC0xLjI0NjU5OTQsIC0xLjU2MzgyNjksIC0xLjM1MzU1NTgsIC0xLjQ3MjI4OTIsIC0xLjQ1NTYzMDksIC0xLjM3MTQ2NzYsCisgICAgLTEuNTUxNzU1NSwgLTEuMjYxNTk3NiwgLTEuNjQwODY3MSwgLTEuMTQzMDQyNiwgLTEuNzIxOTI2OCwgLTEuMDE2Mjk2LCAtMS43OTM5MzUyLCAtMC44ODE5ODEzNywKKyAgICAtMS44NTU5NDk4LCAtMC43NDA4NDg2LCAtMS45MDcxMDE0LCAtMC41OTM3Njk2NywgLTEuOTQ2NjEwOCwgLTAuNDQxNzMwOTIsIC0xLjk3MzgwMzgsIC0wLjI4NTgyMzM3LAorICAgIC0xLjk4ODEyNTksIC0wLjEyNzIzMDUxLCAtMS45ODkxNTUyLCAwLjAzMjc4NTcwMiwgLTEuOTc2NjEzLCAwLjE5MjkwMDg4LCAtMS45NTAzNzM2LCAwLjM1MTc0NTkzLAorICAgIC0xLjkxMDQ3MDEsIDAuNTA3OTI1OTksIC0xLjg1NzA5OTEsIDAuNjYwMDQwNSwgLTEuNzkwNjIxOSwgMC44MDY3MDM5MywgLTEuNzExNTYzMiwgMC45NDY1NjY3NiwKKyAgICAtMS42MjA2MDY5LCAxLjA3ODMzNjEsIC0xLjUxODU4OSwgMS4yMDA3OTY0LCAtMS40MDY0ODgxLCAxLjMxMjgyODMsIC0xLjI4NTQxMjMsIDEuNDEzNDI3MiwKKyAgICAtMS4xNTY1ODU2LCAxLjUwMTcxOTQsIC0xLjAyMTMyOTUsIDEuNTc2OTc1NiwgLTAuODgxMDQ1NywgMS42Mzg2MjQ0LCAtMC43MzcxOTQ0OCwgMS42ODYyNjA1LAorICAgIC0wLjU5MTI3MzksIDEuNzE5NjUxMSwgLTAuNDQ0Nzk3NDYsIDEuNzM4NzQwNiwgLTAuMjk5MjcxNCwgMS43NDM2NSwgLTAuMTU2MTcyNTMsIDEuNzM0Njc1LAorICAgIC0wLjAxNjkyNjA5OSwgMS43MTIyODA5LCAwLjExNzExNDkyLCAxLjY3NzA5MywgMC4yNDQ2ODk0OCwgMS42Mjk4ODcsIDAuMzY0NjQ2MjMsIDEuNTcxNTc0MiwKKyAgICAwLjQ3NTk1OTI0LCAxLjUwMzE4NjMsIDAuNTc3NzQxNDQsIDEuNDI1ODU3NywgMC42NjkyNTUzMiwgMS4zNDA4MDU5LCAwLjc0OTkyMDk2LCAxLjI0OTMxMTIsCisgICAgMC44MTkzMjE0NSwgMS4xNTI2OTU4LCAwLjg3NzIwNDQ4LCAxLjA1MjMwMTksIDAuOTIzNDgyMTgsIDAuOTQ5NDcwODIsIDAuOTU4MjI3MjIsIDAuODQ1NTIxNjksCisgICAgMC45ODE2NjYzOSwgMC43NDE3MzE4MiwgMC45OTQxNzE5OCwgMC42MzkzMTc4NywgMC45OTYyNTAwOSwgMC41Mzk0MTg4OCwgMC45ODg1Mjc3NywgMC40NDMwODExNCwKKyAgICAwLjk3MTczNzc0LCAwLjM1MTI0NTI1LCAwLjk0NjcwMjEyLCAwLjI2NDczNTQsIDAuOTE0MzE0OTMsIDAuMTg0MjUxMzQsIDAuODc1NTI0MDQsIDAuMTEwMzYyNzksCisgICAgMC44MzEzMTI5NSwgMC4wNDM1MDY0NywgMC43ODI2ODI0OCwgLTAuMDE2MDE0MjgyLCAwLjczMDYzMzIsIC0wLjA2ODAyNzQyMiwgMC42NzYxNDgzNiwgLTAuMTEyNDg3NzYsCisgICAgMC42MjAxNzgzNCwgLTAuMTQ5NDcwNCwgMC41NjM2MjU5OSwgLTAuMTc5MTYyMjMsIDAuNTA3MzM0MjMsIC0wLjIwMTg1MTY3LCAwLjQ1MjA3NDk0LCAtMC4yMTc5MTcxNiwKKyAgICAwLjM5ODU0MDA4LCAtMC4yMjc4MTQ0MiwgMC4zNDczMzQ3MSwgLTAuMjMyMDYzMSwgMC4yOTg5NzIzNywgLTAuMjMxMjMyODEsIDAuMjUzODcyMTYsIC0wLjIyNTkyOTA4LAorICAgIDAuMjEyMzU4MjUsIC0wLjIxNjc3OTU2LCAwLjE3NDY2MTA2LCAtMC4yMDQ0MjA1NSwgMC4xNDA5MjAyNSwgLTAuMTg5NDg0MywgMC4xMTExODk1NCwgLTAuMTcyNTg3MjYsCisgICAgMC4wODU0NDI3ODEsIC0wLjE1NDMxOTQ0LCAwLjA2MzU4MTI4LCAtMC4xMzUyMzUwNiwgMC4wNDU0NDIxMywgLTAuMTE1ODQ0NzQsIDAuMDMwODA3Mjc5LCAtMC4wOTY2MDkwMDQsCisgICAgMC4wMTk0MTMwMiwgLTAuMDc3OTMzNDc1LCAwLjAxMDk1OTc4NSwgLTAuMDYwMTY1NjAzLCAwLjAwNTEyMTkwNCwgLTAuMDQzNTkyODc4LCAwLjAwMTU1NzE1NDMsIC0wLjAyODQ0MjUwOSwKKyAgICAtMC4wMDAwODQxMTU0OTgsIC0wLjAxNDg4MjQ5MSwgLTAuMDAwMTUwNDYyODksIC0wLjAwMzAyMzg1NywgMC4wMDEwMTg0MTg2LCAwLjAwNzA3NTk0MDMsIDAuMDAzMDk4NTg4OSwgMC4wMTU0MDg3NCwKKyAgICAwLjAwNTc4Nzc3NzIsIDAuMDIyMDEwNjI2LCAwLjAwODgxMDI2MjIsIDAuMDI2OTU2Mjk3LCAwLjAxMTkyMDY3OSwgMC4wMzAzNTMwNjIsIDAuMDE0OTA2NzUxLCAwLjAzMjMzNDU5NiwKKyAgICAwLjAxNzU5MDk2NiwgMC4wMzMwNTQ2NjgsIDAuMDE5ODMxMjUxLCAwLjAzMjY4MDk3NywgMC4wMjE1MjA2OTUsIDAuMDMxMzg5MjQ0LCAwLjAyMjU4NjQ0MywgMC4wMjkzNTc2NzUsCisgICAgMC4wMjI5ODc4MTUsIDAuMDI2NzYxOTM4LCAwLjAyMjcxMzgxLCAwLjAyMzc3MDY4OCwgMC4wMjE3ODAwODksIDAuMDIwNTQxNzUyLCAwLjAyMDIyNTU1NSwgMC4wMTcyMTg5NjgsCisgICAgMC4wMTgxMDg2NzksIDAuMDEzOTI5NzQxLCAwLjAxNTUwMzY3MSwgMC4wMTA3ODMyOTcsIDAuMDEyNDk2NjE5LCAwLjAwNzg2OTYwMzEsIDAuMDA5MTgxNjkwNCwgMC4wMDUyNTg5NDk5LAorICAgIDAuMDA1NjU3NTA0OCwgMC4wMDMwMDIxMTIzLCAwLjAwMjAyMzc0NTYsIDAuMDAxMTMxMDU1MSwgLTAuMDAxNjIxOTIwNSwgLTAuMDAwMzM5OTA0MTksIC0wLjAwNTE4NjU2MDEsIC0wLjAwMTQxMjU0NTEsCisgICAgLTAuMDA4NTg0MjkzNSwgLTAuMDAyMTAyODg5OCwgLTAuMDExNzM4MTkyLCAtMC4wMDI0MzkxMjI5LCAtMC4wMTQ1ODE3NSwgLTAuMDAyNDU5MzcwMSwgLTAuMDE3MDU5OTI2LCAtMC4wMDIyMDk0MDgsCisgICAgLTAuMDE5MTI5Nzc1LCAtMC4wMDE3NDAzNzgsIC0wLjAyMDc2MDcwMiwgLTAuMDAxMTA2NTcwNSwgLTAuMDIxOTM0MzQyLCAtMC4wMDAzNjMzMzE0MywgLTAuMDIyNjQ0MTU3LCAwLjAwMDQzNDg1ODIzLAorICAgIC0wLjAyMjg5NDczOCwgMC4wMDEyMzYwOTQ2LCAtMC4wMjI3MDA4OTUsIDAuMDAxOTkyNTI1MSwgLTAuMDIyMDg2NTY4LCAwLjAwMjY2MTU2NzQsIC0wLjAyMTA4MzYxMiwgMC4wMDMyMDY4NjM4LAorICAgIC0wLjAxOTczMDQ5MiwgMC4wMDM1OTg5Njk0LCAtMC4wMTgwNzA5NDIsIDAuMDAzODE1NzgwMiwgLTAuMDE2MTUyNjIsIDAuMDAzODQyNzE2MSwgLTAuMDE0MDI1NzgzLCAwLjAwMzY3MjY3NjYsCisgICAgLTAuMDExNzQyMDM4LCAwLjAwMzMwNTc5MDIsIC0wLjAwOTM1MzE1MzQsIDAuMDAyNzQ4OTg2NSwgLTAuMDA2OTA5OTg5OCwgMC4wMDIwMTU0MTY1LCAtMC4wMDQ0NjE1MzA2LCAwLjAwMTEyMzc1MjYsCisgICAgLTAuMDAyMDU0MDM3MywgMC4wMDAwOTczOTM5NDYsIDAuMDAwMjY5NjY0OTUsIC0wLjAwMTAzNjM5MTUsIDAuMDAyNDcwNzgxMSwgLTAuMDAyMjQ3MzY0LCAwLjAwNDUxNTAxMjcsIC0wLjAwMzUwMzIyMzQsCisgICAgMC4wMDYzNzI5MDU4LCAtMC4wMDQ3NzA1MDk5LCAwLjAwODAyMDA4NDQsIC0wLjAwNjAxNTQ4MTksIDAuMDA5NDM3MzgxMywgLTAuMDA3MjA0OTQ0MywgMC4wMTA2MTA4NzIsIC0wLjAwODMwNzAyNTgsCisgICAgMC4wMTE1MzE4MTQsIC0wLjAwOTI5MTg4NDUsIDAuMDEyMTk2NTE4LCAtMC4wMTAxMzIzMzksIDAuMDEyNjA2MTQsIC0wLjAxMDgwNDQxNSwgMC4wMTI3NjY0MDksIC0wLjAxMTI4NzgxMSwKKyAgICAwLjAxMjY4NzMwNCwgLTAuMDExNTY2Mjc2LCAwLjAxMjM4MjY4LCAtMC4wMTE2Mjc4ODksIDAuMDExODY5ODQ5LCAtMC4wMTE0NjUyNjgsIDAuMDExMTY5MTIzLCAtMC4wMTEwNzU2NzQsCisgICAgMC4wMTAzMDMzMzYsIC0wLjAxMDQ2MTA0NSwgMC4wMDkyOTczMjQzLCAtMC4wMDk2Mjc5NDIsIDAuMDA4MTc3NDAyNCwgLTAuMDA4NTg3NDA5NywgMC4wMDY5NzA4MiwgLTAuMDA3MzU0Nzc4NywKKyAgICAwLjAwNTcwNTIxNTUsIC0wLjAwNTk0OTM3NDgsIDAuMDA0NDA4MDY5NCwgLTAuMDA0Mzk0MTc5MiwgMC4wMDMxMDYxNzMxLCAtMC4wMDI3MTU0MTI4LCAwLjAwMTgyNTExMTIsIC0wLjAwMDk0MjA3MDk3LAorICAgIDAuMDAwNTg4Nzc2NzgsIDAuMDAwODk0NTk2NTcsIC0wLjAwMDU4MTA3Nzk0LCAwLjAwMjc2MTY0OTksIC0wLjAwMTY2NTI0MzIsIDAuMDA0NjI1MDU4MywgLTAuMDAyNjQ3Mzk3OCwgMC4wMDY0NTAzMjk0LAorICAgIC0wLjAwMzUxNDM5MDIsIDAuMDA4MjAzMTUzNSwgLTAuMDA0MjU2NDQ4NywgMC4wMDk4NTAwNTg3LCAtMC4wMDQ4NjczMTIsIDAuMDExMzU5MDU5LCAtMC4wMDUzNDQyODA1LCAwLjAxMjcwMDI4OSwKKyAgICAtMC4wMDU2ODgxNzg0LCAwLjAxMzg0NjYwNiwgLTAuMDA1OTAzMjMxLCAwLjAxNDc3NDE1NywgLTAuMDA1OTk2ODYxLCAwLjAxNTQ2Mjg4OCwgLTAuMDA1OTc5NDAwMSwgMC4wMTU4OTY5ODksCisgICAgLTAuMDA1ODYzNzI5OSwgMC4wMTYwNjUyNiwgLTAuMDA1NjY0ODUzOCwgMC4wMTU5NjEzOTksIC0wLjAwNTM5OTQxODUsIDAuMDE1NTg0MTgsIC0wLjAwNTA4NTE5MDMsIDAuMDE0OTM3NTUxLAorICAgIC0wLjAwNDc0MDUwMzYsIDAuMDE0MDMwNjA2LCAtMC4wMDQzODM2OTk1LCAwLjAxMjg3NzQ2MywgLTAuMDA0MDMyNTYwMiwgMC4wMTE0OTcwMzIsIC0wLjAwMzcwMzc3MjgsIDAuMDA5OTEyNjc2MiwKKyAgICAtMC4wMDM0MTI0MTYyLCAwLjAwODE1MTc4MTcsIC0wLjAwMzE3MTUwNjgsIDAuMDA2MjQ1MjM1OSwgLTAuMDAyOTkxNjAyMSwgMC4wMDQyMjY4MjMzLCAtMC4wMDI4ODA0ODA0LCAwLjAwMjEzMjU2NSwKK307CisKK2NvbnN0IGZsb2F0IGZmX29uMmF2Y19jdGFiXzRbMjA0OF0gPSB7CisgICAgMC4wLCAxLjk5OTk5MjQsIC0wLjAwMDAwNTg5MzI3MjQsIC0wLjAwMDE4NjMyOTA1LCAtMC4wMDAwMjM0MzA1MjYsIC0wLjAwMDM2OTY3MjYzLCAtMC4wMDAwNTIxODY0MTMsIC0wLjAwMDU0NzEwMTQzLAorICAgIC0wLjAwMDA5MTQ1OTgyOCwgLTAuMDAwNzE1Nzk3NDIsIC0wLjAwMDE0MDI4NTUxLCAtMC4wMDA4NzMxMDY0NywgLTAuMDAwMTk3NDUwMDYsIC0wLjAwMTAxNjU4ODMsIC0wLjAwMDI2MTUxMjIxLCAtMC4wMDExNDQwNjEzLAorICAgIC0wLjAwMDMzMDgyNzA4LCAtMC4wMDEyNTM2NDM0LCAtMC4wMDA0MDM1NzM5NywgLTAuMDAxMzQzNzg1MywgLTAuMDAwNDc3Nzg3NzUsIC0wLjAwMTQxMzI5ODgsIC0wLjAwMDU1MTM5MjkxLCAtMC4wMDE0NjEzNzYzLAorICAgIC0wLjAwMDYyMjI0MDMsIC0wLjAwMTQ4NzYwNDIsIC0wLjAwMDY4ODE0NTkzLCAtMC4wMDE0OTE5Njc0LCAtMC4wMDA3NDY5MzE0NywgLTAuMDAxNDc0ODQ1MywgLTAuMDAwNzk2NDY1NTUsIC0wLjAwMTQzNzAwMjIsCisgICAgLTAuMDAwODM0NzA2MDEsIC0wLjAwMTM3OTU2ODEsIC0wLjAwMDg1OTc0MTU5LCAtMC4wMDEzMDQwMTMsIC0wLjAwMDg2OTgzMzQ2LCAtMC4wMDEyMTIxMTU2LCAtMC4wMDA4NjM0NTUwNiwgLTAuMDAxMTA1OTI1NywKKyAgICAtMC4wMDA4MzkzMjk2NywgLTAuMDAwOTg3NzIxOTYsIC0wLjAwMDc5NjQ2NTY3LCAtMC4wMDA4NTk5NjY1NiwgLTAuMDAwNzM0MTg3NDMsIC0wLjAwMDcyNTI1NjQsIC0wLjAwMDY1MjE2MjM2LCAtMC4wMDA1ODYyNzM1NiwKKyAgICAtMC4wMDA1NTA0MjIxOCwgLTAuMDAwNDQ1NzM1MTgsIC0wLjAwMDQyOTM3ODUsIC0wLjAwMDMwNjM0MzQzLCAtMC4wMDAyODk4MzE1MSwgLTAuMDAwMTcwNzM3NTIsIC0wLjAwMDEzMjk3MTA5LCAtMC4wMDAwNDE0NDc4MTYsCisgICAgMC4wMDAwMzk2Mjk3MjIsIDAuMDAwMDc5MTQ3MDQ1LCAwLjAwMDIyNjAyOTU3LCAwLjAwMDE4ODg1OTQ3LCAwLjAwMDQyMzk0MjA4LCAwLjAwMDI4NTcyODMxLCAwLjAwMDYzMDc2NzE0LCAwLjAwMDM2ODA1MDEsCisgICAgMC4wMDA4NDM2MzA1MiwgMC4wMDA0MzQ0MDYwMSwgMC4wMDEwNTk0MzAzLCAwLjAwMDQ4MzY4NDQ3LCAwLjAwMTI3NDg4OTksIDAuMDAwNTE1MDk5NSwgMC4wMDE0ODY2MTY0LCAwLjAwMDUyODIwNDksCisgICAgMC4wMDE2OTExNjMyLCAwLjAwMDUyMjkwNDI3LCAwLjAwMTg4NTA5MzUsIDAuMDAwNDk5NDU2ODMsIDAuMDAyMDY1MDQ2NywgMC4wMDA0NTg0NzkxOSwgMC4wMDIyMjc4MDI1LCAwLjAwMDQwMDk0MjY2LAorICAgIDAuMDAyMzcwMzQxOSwgMC4wMDAzMjgxNjYwOSwgMC4wMDI0ODk5MDQ2LCAwLjAwMDI0MTgwMzgxLCAwLjAwMjU4NDA0MTMsIDAuMDAwMTQzODI4MSwgMC4wMDI2NTA2NTcyLCAwLjAwMDAzNjUwNjI3LAorICAgIDAuMDAyNjg4MDQ4NiwgLTAuMDAwMDc3NjI4ODQzLCAwLjAwMjY5NDkzMiwgLTAuMDAwMTk1ODE0NTEsIDAuMDAyNjcwNDYxOCwgLTAuMDAwMzE1MTAwNTksIDAuMDAyNjE0MjQyLCAtMC4wMDA0MzIzOTg2NCwKKyAgICAwLjAwMjUyNjMyODIsIC0wLjAwMDU0NDUzNzUsIDAuMDAyNDA3MjIyMywgLTAuMDAwNjQ4MzI0NjcsIDAuMDAyMjU3ODYwNSwgLTAuMDAwNzQwNjEyMzksIDAuMDAyMDc5NTk2MywgLTAuMDAwODE4MzY3ODEsCisgICAgMC4wMDE4NzQxNzgzLCAtMC4wMDA4Nzg3NDQ1OCwgMC4wMDE2NDM3MjU3LCAtMC4wMDA5MTkxNTQ5LCAwLjAwMTM5MDY5OTgsIC0wLjAwMDkzNzMzOTQ0LCAwLjAwMTExNzg3NTcsIC0wLjAwMDkzMTQzMjcsCisgICAgMC4wMDA4MjgzMTE2LCAtMC4wMDA5MDAwMjE1OCwgMC4wMDA1MjUzMTc4LCAtMC4wMDA4NDIxOTUyNCwgMC4wMDAyMTI0MjQyLCAtMC4wMDA3NTc1ODM1MywgLTAuMDAwMTA2NjUyNzcsIC0wLjAwMDY0NjM4Mjc0LAorICAgIC0wLjAwMDQyODA0NTksIC0wLjAwMDUwOTM2NzIxLCAtMC4wMDA3NDc3NzUwOCwgLTAuMDAwMzQ3ODg2MDMsIC0wLjAwMTA2MTc4ODYsIC0wLjAwMDE2Mzg0NDQ1LCAtMC4wMDEzNjYwMDg5LCAwLjAwMDA0MDMyOTAzMiwKKyAgICAtMC4wMDE2NTYzODIzLCAwLjAwMDI2MTcyOTUyLCAtMC4wMDE5Mjg5MzQsIDAuMDAwNDk3MDM0NCwgLTAuMDAyMTc5ODI3OCwgMC4wMDA3NDI1NzIwNywgLTAuMDAyNDA1NDI5NSwgMC4wMDA5OTQzOTgwMywKKyAgICAtMC4wMDI2MDIzNzM5LCAwLjAwMTI0ODM3NjIsIC0wLjAwMjc2NzYzMzksIDAuMDAxNTAwMjYxMiwgLTAuMDAyODk4NTg3NiwgMC4wMDE3NDU3ODE2LCAtMC4wMDI5OTMwODQ1LCAwLjAwMTk4MDcxODUsCisgICAgLTAuMDAzMDQ5NTA2MSwgMC4wMDIyMDA5Nzk1LCAtMC4wMDMwNjY4MTc1LCAwLjAwMjQwMjY2NjMsIC0wLjAwMzA0NDYxMDgsIDAuMDAyNTgyMTMzLCAtMC4wMDI5ODMxMzM4LCAwLjAwMjczNjAzNjksCisgICAgLTAuMDAyODgzMzA0OCwgMC4wMDI4NjEzODAxLCAtMC4wMDI3NDY3MTAzLCAwLjAwMjk1NTU0MjYsIC0wLjAwMjU3NTU4NywgMC4wMDMwMTYzMDkzLCAtMC4wMDIzNzI3ODM0LCAwLjAwMzA0MTg4ODQsCisgICAgLTAuMDAyMTQxNzA4MywgMC4wMDMwMzA5MjY3LCAtMC4wMDE4ODYyNiwgMC4wMDI5ODI1MjE5LCAtMC4wMDE2MTA3NDUsIDAuMDAyODk2MjI5NSwgLTAuMDAxMzE5NzgyMywgMC4wMDI3NzIwNzAyLAorICAgIC0wLjAwMTAxODIwMzIsIDAuMDAyNjEwNTM3LCAtMC4wMDA3MTA5NDMxMywgMC4wMDI0MTI1OTkzLCAtMC4wMDA0MDI5MzM5OCwgMC4wMDIxNzk3MDc2LCAtMC4wMDAwOTg5OTg1MjcsIDAuMDAxOTEzNzk2MSwKKyAgICAwLjAwMDE5NjI1MDQyLCAwLjAwMTYxNzI4MjYsIDAuMDAwNDc4NTAyMSwgMC4wMDEyOTMwNjQ3LCAwLjAwMDc0MzgyOTE4LCAwLjAwMDk0NDUxMDE2LCAwLjAwMDk4ODc1NjU0LCAwLjAwMDU3NTQ0MTQ2LAorICAgIDAuMDAxMjEwMzE1OSwgMC4wMDAxOTAxMTA1OSwgMC4wMDE0MDYwODU2LCAtMC4wMDAyMDY4MzQwNywgMC4wMDE1NzQyMTYzLCAtMC4wMDA2MTAzOTE5NiwgMC4wMDE3MTM0NDA4LCAtMC4wMDEwMTUyNjUsCisgICAgMC4wMDE4MjMwNzA5LCAtMC4wMDE0MTU5MjI5LCAwLjAwMTkwMjk4MjEsIC0wLjAwMTgwNjY3ODksIDAuMDAxOTUzNTg1NSwgLTAuMDAyMTgxNzc0NSwgMC4wMDE5NzU3OTEzLCAtMC4wMDI1MzU0NzEyLAorICAgIDAuMDAxOTcwOTYzNiwgLTAuMDAyODYyMTUxLCAwLjAwMTk0MDg2ODMsIC0wLjAwMzE1NjQxNTksIDAuMDAxODg3NjE2MiwgLTAuMDAzNDEzMTk0MywgMC4wMDE4MTM2MDIzLCAtMC4wMDM2Mjc4NDMsCisgICAgMC4wMDE3MjE0NDI3LCAtMC4wMDM3OTYyNDYxLCAwLjAwMTYxMzkxMDcsIC0wLjAwMzkxNDkxMDgsIDAuMDAxNDkzODcyNSwgLTAuMDAzOTgxMDUyNCwgMC4wMDEzNjQyMjUxLCAtMC4wMDM5OTI2NzAyLAorICAgIDAuMDAxMjI3ODM1NywgLTAuMDAzOTQ4NjEzNSwgMC4wMDEwODc0ODUsIC0wLjAwMzg0ODYzMDUsIDAuMDAwOTQ1ODE1NywgLTAuMDAzNjkzNDA1OCwgMC4wMDA4MDUyODU1MywgLTAuMDAzNDg0NTgwNywKKyAgICAwLjAwMDY2ODEyNzI2LCAtMC4wMDMyMjQ3NTYxLCAwLjAwMDUzNjMxNjYsIC0wLjAwMjkxNzQ3ODEsIDAuMDAwNDExNTQ2OTEsIC0wLjAwMjU2NzIwNzIsIDAuMDAwMjk1MjEzMzEsIC0wLjAwMjE3OTI2NjIsCisgICAgMC4wMDAxODg0MDQ3NSwgLTAuMDAxNzU5NzcyMiwgMC4wMDAwOTE5MDQ0OTEsIC0wLjAwMTMxNTU1MTMsIDAuMDAwMDA2MTk4NjY1NywgLTAuMDAwODU0MDMzOTIsIC0wLjAwMDA2ODUwODE1NCwgLTAuMDAwMzgzMTM2MzYsCisgICAgLTAuMDAwMTMyMjcxMjIsIDAuMDAwMDg4ODcyNzE1LCAtMC4wMDAxODUzNzkwMywgMC4wMDA1NTM1MTc3OCwgLTAuMDAwMjI4MzIzMTMsIDAuMDAxMDAyMjcxOCwgLTAuMDAwMjYxNzY2MDUsIDAuMDAxNDI2NzE4MiwKKyAgICAtMC4wMDAyODY1MDg1LCAwLjAwMTgxODcxNjIsIC0wLjAwMDMwMzQ1NzI5LCAwLjAwMjE3MDU2NiwgLTAuMDAwMzEzNTk0OTcsIDAuMDAyNDc1MTY5NSwgLTAuMDAwMzE3OTUyMDcsIDAuMDAyNzI2MTgzNywKKyAgICAtMC4wMDAzMTc1ODI2LCAwLjAwMjkxODE2MTcsIC0wLjAwMDMxMzU0MjQ2LCAwLjAwMzA0NjY3NzIsIC0wLjAwMDMwNjg3MTQzLCAwLjAwMzEwODQzMjUsIC0wLjAwMDI5ODU3NzQyLCAwLjAwMzEwMTM0MzEsCisgICAgLTAuMDAwMjg5NjIzNDgsIDAuMDAzMDI0NTk3NCwgLTAuMDAwMjgwOTE1NjEsIDAuMDAyODc4Njk1NSwgLTAuMDAwMjczMjkxNzgsIDAuMDAyNjY1NDU1MiwgLTAuMDAwMjY3NTEwODYsIDAuMDAyMzg3OTk4OSwKKyAgICAtMC4wMDAyNjQyNDEwNywgMC4wMDIwNTA3MDg3LCAtMC4wMDAyNjQwNDgyLCAwLjAwMTY1OTE2MTUsIC0wLjAwMDI2NzM4MjgsIDAuMDAxMjIwMDM5MiwgLTAuMDAwMjc0NTY3NTcsIDAuMDAwNzQxMDE5MDksCisgICAgLTAuMDAwMjg1Nzg1MDYsIDAuMDAwMjMwNjQ2ODIsIC0wLjAwMDMwMTA2NjYxLCAtMC4wMDAzMDE4MDY5MywgLTAuMDAwMzIwMjgzNTUsIC0wLjAwMDg0NjUwMTU2LCAtMC4wMDAzNDMxNDE5OSwgLTAuMDAxMzkzMTkxOSwKKyAgICAtMC4wMDAzNjkxODE1NCwgLTAuMDAxOTMxNDAwMywgLTAuMDAwMzk3Nzc5NDgsIC0wLjAwMjQ1MDU5NCwgLTAuMDAwNDI4MTYwNzEsIC0wLjAwMjk0MDM2NDksIC0wLjAwMDQ1OTQxMzUxLCAtMC4wMDMzOTA2MDc5LAorICAgIC0wLjAwMDQ5MDUxMTM2LCAtMC4wMDM3OTE2OTc4LCAtMC4wMDA1MjAzNDAxNywgLTAuMDA0MTM0NjYyNCwgLTAuMDAwNTQ3NzMwMTMsIC0wLjAwNDQxMTM0NjMsIC0wLjAwMDU3MTQ5MDc5LCAtMC4wMDQ2MTQ1NjgzLAorICAgIC0wLjAwMDU5MDQ0ODMzLCAtMC4wMDQ3MzgyNjMzLCAtMC4wMDA2MDM0ODMyMywgLTAuMDA0Nzc3NjEzNiwgLTAuMDAwNjA5NTY2NjksIC0wLjAwNDcyOTE2MDEsIC0wLjAwMDYwNzc5NDczLCAtMC4wMDQ1OTA4OTY0LAorICAgIC0wLjAwMDU5NzQxODE3LCAtMC4wMDQzNjIzMzc4LCAtMC4wMDA1Nzc4Njc4NSwgLTAuMDA0MDQ0NTY5NiwgLTAuMDAwNTQ4NzczOTEsIC0wLjAwMzY0MDI2NTcsIC0wLjAwMDUwOTk3OTQ5LCAtMC4wMDMxNTM2ODI1LAorICAgIC0wLjAwMDQ2MTU0Nzg3LCAtMC4wMDI1OTA2MjA3LCAtMC4wMDA0MDM3NjM3LCAtMC4wMDE5NTgzNjA0LCAtMC4wMDAzMzcxMjkyOCwgLTAuMDAxMjY1NTY2OSwgLTAuMDAwMjYyMzU1NDYsIC0wLjAwMDUyMjE2NzYsCisgICAgLTAuMDAwMTgwMzQ4OSwgMC4wMDAyNjA3OTU2MSwgLTAuMDAwMDkyMTk1NjQ1LCAwLjAwMTA3MTMzODEsIDguNTc3MzgxNGUtNywgMC4wMDE4OTY3MjUsIDAuMDAwMDk3NDI1MzA1LCAwLjAwMjcyMzY4MDYsCisgICAgMC4wMDAxOTYwMDQ0OCwgMC4wMDM1Mzg2MTAyLCAwLjAwMDI5NTAwMDA5LCAwLjAwNDMyNzgzMjcsIDAuMDAwMzkyNzQ5NjEsIDAuMDA1MDc3ODE2NSwgMC4wMDA0ODc1NDkxNCwgMC4wMDU3NzU0MTYzLAorICAgIDAuMDAwNTc3NjgwMTgsIDAuMDA2NDA4MTA3OSwgMC4wMDA2NjE0MzY2NCwgMC4wMDY5NjQyMTI3LCAwLjAwMDczNzE1MjI0LCAwLjAwNzQzMzExNDEsIDAuMDAwODAzMjI2NzIsIDAuMDA3ODA1NDU1OSwKKyAgICAwLjAwMDg1ODE1MTQxLCAwLjAwODA3MzMyNDMsIDAuMDAwOTAwNTMyNDcsIDAuMDA4MjMwNDA4NywgMC4wMDA5MjkxMTExNSwgMC4wMDgyNzIxMzI4LCAwLjAwMDk0Mjc4MDI5LCAwLjAwODE5NTc2ODEsCisgICAgMC4wMDA5NDA1OTYxLCAwLjAwODAwMDUwMTQsIDAuMDAwOTIxNzg0NjEsIDAuMDA3Njg3NDg3NiwgMC4wMDA4ODU3NDI2NiwgMC4wMDcyNTk4NTA5LCAwLjAwMDgzMjAzMzgxLCAwLjAwNjcyMjY2MDMsCisgICAgMC4wMDA3NjAzNzkxOSwgMC4wMDYwODI4NjA4LCAwLjAwMDY3MDY0NTI3LCAwLjAwNTM0OTE2ODYsIDAuMDAwNTYyODI5OSwgMC4wMDQ1MzE5MzAyLCAwLjAwMDQzNzA0ODE4LCAwLjAwMzY0MjkzOTMsCisgICAgMC4wMDAyOTM1MjE5NCwgMC4wMDI2OTUyMjc1LCAwLjAwMDEzMjU3Mzc4LCAwLjAwMTcwMjgxOTYsIC0wLjAwMDA0NTM3MDk2MiwgMC4wMDA2ODA0Njc2NCwgLTAuMDAwMjM5NzcyNzksIC0wLjAwMDM1NjYzNTI1LAorICAgIC0wLjAwMDQ0OTk1NTU4LCAtMC4wMDEzOTMxNTAzLCAtMC4wMDA2NzUwNzI2NiwgLTAuMDAyNDEzODkyMiwgLTAuMDAwOTE0MDYxOTEsIC0wLjAwMzQwNDEyMTgsIC0wLjAwMTE2NTU5MTUsIC0wLjAwNDM0OTgyNTQsCisgICAgLTAuMDAxNDI3OTk5MywgLTAuMDA1MjM3OTY5MSwgLTAuMDAxNjk5MjI4OSwgLTAuMDA2MDU2NzI2NCwgLTAuMDAxOTc2NzY4NSwgLTAuMDA2Nzk1NjY1MiwgLTAuMDAyMjU3NTk3MiwgLTAuMDA3NDQ1ODk2NSwKKyAgICAtMC4wMDI1MzgxNDU1LCAtMC4wMDgwMDAxNzU1LCAtMC4wMDI4MTQyNzM2LCAtMC4wMDg0NTI5NTg0LCAtMC4wMDMwODEyNzYxLCAtMC4wMDg4MDA0MTQ0LCAtMC4wMDMzMzM5MTU1LCAtMC4wMDkwNDAzOTY3LAorICAgIC0wLjAwMzU2NjQ4NzUsIC0wLjAwOTE3MjM3MzUsIC0wLjAwMzc3MjkyMDIsIC0wLjAwOTE5NzMyODIsIC0wLjAwMzk0NjkwNzgsIC0wLjAwOTExNzY0NTIsIC0wLjAwNDA4MjA3MTYsIC0wLjAwODkzNjk2NzcsCisgICAgLTAuMDA0MTcyMTUxLCAtMC4wMDg2NjAwNTU3LCAtMC4wMDQyMTEyMTAyLCAtMC4wMDgyOTI2NDcxLCAtMC4wMDQxOTM4NTY0LCAtMC4wMDc4NDEzMjQ0LCAtMC4wMDQxMTU0NTk1LCAtMC4wMDczMTMzOTE3LAorICAgIC0wLjAwMzk3MjM2MTMsIC0wLjAwNjcxNjc3NDMsIC0wLjAwMzc2MjA2MzYsIC0wLjAwNjA1OTkzNDksIC0wLjAwMzQ4MzM4NjcsIC0wLjAwNTM1MTgwNjUsIC0wLjAwMzEzNjU4NjYsIC0wLjAwNDYwMTc0MzEsCisgICAgLTAuMDAyNzIzNDI1NiwgLTAuMDAzODE5NDc4OSwgLTAuMDAyMjQ3MTg4LCAtMC4wMDMwMTUwOTc3LCAtMC4wMDE3MTI2NDIsIC0wLjAwMjE5ODk5MzIsIC0wLjAwMTEyNTk0NTEsIC0wLjAwMTM4MTgyNzQsCisgICAgLTAuMDAwNDk0NDk2NzgsIC0wLjAwMDU3NDQ2NjQ4LCAwLjAwMDE3MzI1NTc5LCAwLjAwMDIxMjEwMTQ4LCAwLjAwMDg2ODA0OTEsIDAuMDAwOTY2ODc5ODksIDAuMDAxNTgwMDYzMywgMC4wMDE2NzkwMDY2LAorICAgIDAuMDAyMjk5MTk2NiwgMC4wMDIzMzc5MjkzLCAwLjAwMzAxNTM0MjIsIDAuMDAyOTMzNjEwNywgMC4wMDM3MTg2NTM1LCAwLjAwMzQ1Njc1OTUsIDAuMDA0Mzk5Nzg0OCwgMC4wMDM4OTkwODA0LAorICAgIDAuMDA1MDUwMDk3MSwgMC4wMDQyNTM1MzI3LCAwLjAwNTY2MTgxODIsIDAuMDA0NTE0NTg2NiwgMC4wMDYyMjgxNTA4LCAwLjAwNDY3ODQ2NjQsIDAuMDA2NzQzMzI0LCAwLjAwNDc0MzM2MjMsCisgICAgMC4wMDcyMDI1ODk0LCAwLjAwNDcwOTYwNDcsIDAuMDA3NjAyMTYwMywgMC4wMDQ1Nzk3ODAyLCAwLjAwNzkzOTEwNjgsIDAuMDA0MzU4Nzg3MSwgMC4wMDgyMTEyMDQ4LCAwLjAwNDA1MzgxMiwKKyAgICAwLjAwODQxNjc2NDQsIDAuMDAzNjc0MjMwMywgMC4wMDg1NTQ0MzI1LCAwLjAwMzIzMTQyMzksIDAuMDA4NjIzMDA0OSwgMC4wMDI3Mzg1MTY4LCAwLjAwODYyMTI0MSwgMC4wMDIyMTAwMzU1LAorICAgIDAuMDA4NTQ3NzEyMSwgMC4wMDE2NjE1MDIyLCAwLjAwODQwMDY4NywgMC4wMDExMDg5NzIxLCAwLjAwODE3ODA3MTEsIDAuMDAwNTY4NTMwNzYsIDAuMDA3ODc3Mzk3NCwgMC4wMDAwNTU3NzAzMjQsCisgICAgMC4wMDc0OTU4OTEzLCAtMC4wMDA0MTQ3Mzc0MSwgMC4wMDcwMzA1OTYsIC0wLjAwMDgyOTk0OTY4LCAwLjAwNjQ3ODU2MiwgLTAuMDAxMTc4ODIxOSwgMC4wMDU4MzcxMDA2LCAtMC4wMDE0NTI3MTc4LAorICAgIDAuMDA1MTA0MDgwMywgLTAuMDAxNjQ1NzQyMiwgMC4wMDQyNzgyNjczLCAtMC4wMDE3NTQ5NzksIDAuMDAzMzU5NjgxOSwgLTAuMDAxNzgwNjIzNiwgMC4wMDIzNDk5NjU3LCAtMC4wMDE3MjU5OTg0LAorICAgIDAuMDAxMjUyNzMwMywgLTAuMDAxNTk3NDQ5LCAwLjAwMDA3Mzg3MzQ1MiwgLTAuMDAxNDA0MTE4NSwgLTAuMDAxMTc4MTU2OSwgLTAuMDAxMTU3NjA3LCAtMC4wMDI0OTIxNzE5LCAtMC4wMDA4NzE1MjM2MywKKyAgICAtMC4wMDM4NTQxMzg4LCAtMC4wMDA1NjA5NDcxMSwgLTAuMDA1MjQ3MTc5LCAtMC4wMDAyNDE4MTExOCwgLTAuMDA2NjUxNjgyMywgMC4wMDAwNjk3NjEzMTQsIC0wLjAwODA0NTUzNTUsIDAuMDAwMzU4MTUyOTksCisgICAgLTAuMDA5NDA0NDc2NywgMC4wMDA2MDg5NDY3OCwgLTAuMDEwNzAyNTY1LCAwLjAwMDgwOTU5Mzk0LCAtMC4wMTE5MTI3NTksIDAuMDAwOTUwMDI3ODQsIC0wLjAxMzAwNzU5NSwgMC4wMDEwMjMxOTU1LAorICAgIC0wLjAxMzk1OTk0NSwgMC4wMDEwMjU0ODMyLCAtMC4wMTQ3NDM4MjUsIDAuMDAwOTU3MDE1MjYsIC0wLjAxNTMzNTI0MSwgMC4wMDA4MjE4MDYyLCAtMC4wMTU3MTMwMzQsIDAuMDAwNjI3NzU2OTMsCisgICAgLTAuMDE1ODU5Njk3LCAwLjAwMDM4NjQ4NjcsIC0wLjAxNTc2MjEyOCwgMC4wMDAxMTMwMDA1NiwgLTAuMDE1NDEyMjk0LCAtMC4wMDAxNzQ4MDEyNCwgLTAuMDE0ODA3Nzc3LCAtMC4wMDA0NTY3NTkxOCwKKyAgICAtMC4wMTM5NTIxNiwgLTAuMDAwNzExMjE2OTQsIC0wLjAxMjg1NTI1NSwgLTAuMDAwOTE1ODg1MzIsIC0wLjAxMTUzMzEzLCAtMC4wMDEwNDg3Nzc3LCAtMC4wMTAwMDc5NDcsIC0wLjAwMTA4OTE4MjksCisgICAgLTAuMDA4MzA3NTgzNiwgLTAuMDAxMDE4NjM3NiwgLTAuMDA2NDY1MDYyNSwgLTAuMDAwODIxODYxMjEsIC0wLjAwNDUxNzc4NTcsIC0wLjAwMDQ4NzYxMjI3LCAtMC4wMDI1MDY1OTQyLCAtMC4wMDAwMDk0MzA5MzYyLAorICAgIC0wLjAwMDQ3NDY4NjU5LCAwLjAwMDYxMzc2NzgzLCAwLjAwMTUzMzU4MTYsIDAuMDAxMzc3Mjc5NSwgMC4wMDM0NzM5NzI3LCAwLjAwMjI3MDM5NzcsIDAuMDA1MzAzNjc0OCwgMC4wMDMyNzY0MjAzLAorICAgIDAuMDA2OTgyNjAxNywgMC4wMDQzNzI4ODMxLCAwLjAwODQ3NDYzMjIsIDAuMDA1NTMyMDIxMiwgMC4wMDk3NDg3NDY2LCAwLjAwNjcyMTQ0NjgsIDAuMDEwNzgwMDI1LCAwLjAwNzkwNTAyODgsCisgICAgMC4wMTE1NTA0NDgsIDAuMDA5MDQzOTQ1LCAwLjAxMjA0OTQ5MiwgMC4wMTAwOTc4NzcsIDAuMDEyMjc0NDgzLCAwLjAxMTAyNjMwMSwgMC4wMTIyMzA2ODEsIDAuMDExNzg5ODM5LAorICAgIDAuMDExOTMxMTEyLCAwLjAxMjM1MTYxNCwgMC4wMTEzOTYxMywgMC4wMTI2Nzg1NzIsIDAuMDEwNjUyNzMzLCAwLjAxMjc0MjcwNCwgMC4wMDk3MzM2NTA4LCAwLjAxMjUyMjE0NCwKKyAgICAwLjAwODY3NjIzMjgsIDAuMDEyMDAyMDkzLCAwLjAwNzUyMTE4NTYsIDAuMDExMTc1NTI3LCAwLjAwNjMxMTE4NjEsIDAuMDEwMDQzNjgxLCAwLjAwNTA4OTQ0MjcsIDAuMDA4NjE2MjY4NiwKKyAgICAwLjAwMzg5ODIzMDYsIDAuMDA2OTExNDUxLCAwLjAwMjc3NzQ3MDUsIDAuMDA0OTU1NTQwNCwgMC4wMDE3NjMzOTQ4LCAwLjAwMjc4MjQ1MDMsIDAuMDAwODg3MzQyNzMsIDAuMDAwNDMyOTIyMzYsCisgICAgMC4wMDAxNzQ3MzIyNSwgLTAuMDAyMDQ2NDU3NSwgLTAuMDAwMzU1NzYyMjgsIC0wLjAwNDYwNDQxMDQsIC0wLjAwMDY5Mjc5OTU3LCAtMC4wMDcxODYyNDg0LCAtMC4wMDA4MzI3MTA3MSwgLTAuMDA5NzM1MjQ5LAorICAgIC0wLjAwMDc3OTU4MDczLCAtMC4wMTIxOTQwNzEsIC0wLjAwMDU0NTA3Mzg4LCAtMC4wMTQ1MDYxOCwgLTAuMDAwMTQ4MDEyNTYsIC0wLjAxNjYxNzIyNSwgMC4wMDAzODYyNzIwMywgLTAuMDE4NDc2MzQ1LAorICAgIDAuMDAxMDI2NzkxOSwgLTAuMDIwMDM3MzUzLCAwLjAwMTczNzkyNjIsIC0wLjAyMTI1OTc5NCwgMC4wMDI0ODA1ODIxLCAtMC4wMjIxMDk4MTQsIDAuMDAzMjEzNDU0LCAtMC4wMjI1NjA4ODMsCisgICAgMC4wMDM4OTQzNDE2LCAtMC4wMjI1OTQzMDcsIDAuMDA0NDgxNDg3LCAtMC4wMjIxOTk1NjIsIDAuMDA0OTM0ODk1OCwgLTAuMDIxMzc0NDQ3LCAwLjAwNTIxNzYwNDMsIC0wLjAyMDEyNTA1OCwKKyAgICAwLjAwNTI5Njg2MTMsIC0wLjAxODQ2NTYwOCwgMC4wMDUxNDUyMDI5LCAtMC4wMTY0MTgxMTQsIDAuMDA0NzQxMzkyMSwgLTAuMDE0MDExOTU0LCAwLjAwNDA3MTIxMzMsIC0wLjAxMTI4MzM0MSwKKyAgICAwLjAwMzEyODEwMjMsIC0wLjAwODI3NDcxNzMsIDAuMDAxOTEzNjE4NSwgLTAuMDA1MDM0MTA1OSwgMC4wMDA0Mzc3NDQ5NSwgLTAuMDAxNjE0NDI1LCAtMC4wMDEyODA5NzE2LCAwLjAwMTkyNzE5ODgsCisgICAgLTAuMDAzMjE1NDM3MSwgMC4wMDU1MzAxMTU3LCAtMC4wMDUzMzAxNzMzLCAwLjAwOTEzMDgxNSwgLTAuMDA3NTgxNjE0NCwgMC4wMTI2NjM1NTksIC0wLjAwOTkxODUyNTgsIDAuMDE2MDYwOTc2LAorICAgIC0wLjAxMjI4MjUyMywgMC4wMTkyNTQ2MTcsIC0wLjAxNDYwODY5MSwgMC4wMjIxNzU0NjEsIC0wLjAxNjgyNjI2NSwgMC4wMjQ3NTQzNzcsIC0wLjAxODg1OTM4NSwgMC4wMjY5MjI1NTksCisgICAgLTAuMDIwNjI3ODgsIDAuMDI4NjExOTA4LCAtMC4wMjIwNDgxMTIsIDAuMDI5NzU1Mzg5LCAtMC4wMjMwMzM3OTgsIDAuMDMwMjg3MzcsIC0wLjAyMzQ5Njg4NywgMC4wMzAxNDM5MzIsCisgICAgLTAuMDIzMzQ4NDAyLCAwLjAyOTI2MzE2OSwgLTAuMDIyNDk5Mjg0LCAwLjAyNzU4NTQ5MiwgLTAuMDIwODYxMjI1LCAwLjAyNTA1MzkyMiwgLTAuMDE4MzQ3NDU5LCAwLjAyMTYxNDM4OCwKKyAgICAtMC4wMTQ4NzM1MzksIDAuMDE3MjE2MDMyLCAtMC4wMTAzNTgwNjIsIDAuMDExODExNTQyLCAtMC4wMDQ3MjMzNjYzLCAwLjAwNTM1NzQ2NjYsIDAuMDAyMTAzODI0NiwgLTAuMDAyMTg1NDMwNiwKKyAgICAwLjAxMDE5MTgwMywgLTAuMDEwODUxODE3LCAwLjAxOTYwMzMyOSwgLTAuMDIwNjcxNDI1LCAwLjAzMDM5NTEzMiwgLTAuMDMxNjY4Njc0LCAwLjA0MjYxNzQ3LCAtMC4wNDM4NjIyOTEsCisgICAgMC4wNTYzMTM3NDksIC0wLjA1NzI2NDkzNSwgMC4wNzE1MjAxOCwgLTAuMDcxODgyODI5LCAwLjA4ODI2NTUwMSwgLTAuMDg3NzE1Mzk1LCAwLjEwNjU3MDc5LCAtMC4xMDQ3NTQ5MSwKKyAgICAwLjEyNjQ0OTI0LCAtMC4xMjI5ODYyLCAwLjE0NzkwNjEyLCAtMC4xNDIzODYzOCwgMC4xNzA5Mzg2OSwgLTAuMTYyOTI0NTcsIDAuMTk1NTM2MTUsIC0wLjE4NDU2MTc3LAorICAgIDAuMjIxNjc5ODQsIC0wLjIwNzI1MDY3LCAwLjI0OTM0MzE5LCAtMC4yMzA5MzU1OSwgMC4yNzg0OTE5NywgLTAuMjU1NTUyNTYsIDAuMzA5MDg0NSwgLTAuMjgxMDI5MjUsCisgICAgMC4zNDEwNzE4NywgLTAuMzA3Mjg1MjIsIDAuMzc0Mzk4MzIsIC0wLjMzNDIzMjEyLCAwLjQwOTAwMTUzLCAtMC4zNjE3NzQsIDAuNDQ0ODEzMDQsIC0wLjM4OTgwNzU4LAorICAgIDAuNDgxNzU4NjgsIC0wLjQxODIyMjk2LCAwLjUxOTc1OTEyLCAtMC40NDY5MDM4NSwgMC41NTg3MzAxOSwgLTAuNDc1NzI4MzksIDAuNTk4NTgzNjQsIC0wLjUwNDU2OTcxLAorICAgIDAuNjM5MjI3NTcsIC0wLjUzMzI5Njc2LCAwLjY4MDU2NjkxLCAtMC41NjE3NzQ5NywgMC43MjI1MDQzMiwgLTAuNTg5ODY3MTIsIDAuNzY0OTQwMzIsIC0wLjYxNzQzNDM4LAorICAgIDAuODA3Nzc0MjUsIC0wLjY0NDMzNjg4LCAwLjg1MDkwNDcsIC0wLjY3MDQzNTAxLCAwLjg5NDIzMDAxLCAtMC42OTU1OTAxNCwgMC45Mzc2NDg5NSwgLTAuNzE5NjY1NTMsCisgICAgMC45ODEwNjExNiwgLTAuNzQyNTI3NDgsIDEuMDI0MzY3NiwgLTAuNzY0MDQ2MjUsIDEuMDY3NDcxMSwgLTAuNzg0MDk2NzgsIDEuMTEwMjc3MSwgLTAuODAyNTU5OTEsCisgICAgMS4xNTI2OTMsIC0wLjgxOTMyMjk0LCAxLjE5NDYzMDEsIC0wLjgzNDI4MDc5LCAxLjIzNjAwMjYsIC0wLjg0NzMzNjUzLCAxLjI3NjcyODQsIC0wLjg1ODQwMjI1LAorICAgIDEuMzE2NzI5OCwgLTAuODY3Mzk5NjMsIDEuMzU1OTMyOCwgLTAuODc0MjYwNjYsIDEuMzk0MjY4NCwgLTAuODc4OTI4MDcsIDEuNDMxNjcxNywgLTAuODgxMzU1ODIsCisgICAgMS40NjgwODMsIC0wLjg4MTUwOTM2LCAxLjUwMzQ0NzIsIC0wLjg3OTM2NTk4LCAxLjUzNzcxNDUsIC0wLjg3NDkxNDg4LCAxLjU3MDgzOTksIC0wLjg2ODE1NzMzLAorICAgIDEuNjAyNzgzNywgLTAuODU5MTA2MzYsIDEuNjMzNTExMywgLTAuODQ3Nzg3MDgsIDEuNjYyOTkzMSwgLTAuODM0MjM1OTEsIDEuNjkxMjA0NywgLTAuODE4NTAwNjQsCisgICAgMS43MTgxMjY3LCAtMC44MDA2Mzk3NSwgMS43NDM3NDQ3LCAtMC43ODA3MjIwOCwgMS43NjgwNDg5LCAtMC43NTg4MjYwMiwgMS43OTEwMzQ1LCAtMC43MzUwMzkxMSwKKyAgICAxLjgxMjcwMDksIC0wLjcwOTQ1NzE2LCAxLjgzMzA1MiwgLTAuNjgyMTgzNTYsIDEuODUyMDk1OCwgLTAuNjUzMzI4NDgsIDEuODY5ODQ0NCwgLTAuNjIzMDA3OTUsCisgICAgMS44ODYzMTMzLCAtMC41OTEzNDMyOCwgMS45MDE1MjE5LCAtMC41NTg0NTk4MiwgMS45MTU0OTI1LCAtMC41MjQ0ODY0MiwgMS45MjgyNTA4LCAtMC40ODk1NTQ0NiwKKyAgICAxLjkzOTgyNTIsIC0wLjQ1Mzc5NzA0LCAxLjk1MDI0NjgsIC0wLjQxNzM0ODE1LCAxLjk1OTU0OTIsIC0wLjM4MDM0MTg5LCAxLjk2Nzc2ODMsIC0wLjM0MjkxMTY5LAorICAgIDEuOTc0OTQyMiwgLTAuMzA1MTg5NjQsIDEuOTgxMTEwNywgLTAuMjY3MzA1NzMsIDEuOTg2MzE1NywgLTAuMjI5Mzg3MTgsIDEuOTkwNjAwOCwgLTAuMTkxNTU3OSwKKyAgICAxLjk5NDAxMSwgLTAuMTUzOTM3ODIsIDEuOTk2NTkyOCwgLTAuMTE2NjQyNDQsIDEuOTk4Mzk0LCAtMC4wNzk3ODIyNDgsIDEuOTk5NDYzNywgLTAuMDQzNDYyMzU1LAorICAgIDEuOTk5ODUxNywgLTAuMDA3NzgyMDI1NywgMS45OTk2MDg5LCAwLjAyNzE2NTYzMywgMS45OTg3ODY5LCAwLjA2MTI5Mzk4MiwgMS45OTc0MzgsIDAuMDk0NTIzMTE3LAorICAgIDEuOTk1NjE0MiwgMC4xMjY3ODAwMywgMS45OTMzNjgzLCAwLjE1Nzk5ODc5LCAxLjk5MDc1MjYsIDAuMTg4MTIwNTksIDEuOTg3ODE5MSwgMC4yMTcwOTM4MSwKKyAgICAxLjk4NDYxOTEsIDAuMjQ0ODczOTQsIDEuOTgxMjAzLCAwLjI3MTQyMzU4LCAxLjk3NzYyLCAwLjI5NjcxMjE2LCAxLjk3MzkxNzgsIDAuMzIwNzE1OSwKKyAgICAxLjk3MDE0MjUsIDAuMzQzNDE3NSwgMS45NjYzMzc3LCAwLjM2NDgwNTgyLCAxLjk2MjU0NTIsIDAuMzg0ODc1NTQsIDEuOTU4ODAzOSwgMC40MDM2MjY5MiwKKyAgICAxLjk1NTE1LCAwLjQyMTA2NTI3LCAxLjk1MTYxNjksIDAuNDM3MjAwNTgsIDEuOTQ4MjM0NywgMC40NTIwNDcwOCwgMS45NDUwMzAzLCAwLjQ2NTYyMjc1LAorICAgIDEuOTQyMDI3NiwgMC40Nzc5NDg5NiwgMS45MzkyNDY0LCAwLjQ4OTA0OTk0LCAxLjkzNjcwMzksIDAuNDk4OTUyNDIsIDEuOTM0NDEzNiwgMC41MDc2ODUwNywKKyAgICAxLjkzMjM4NTcsIDAuNTE1Mjc4MzQsIDEuOTMwNjI3MywgMC41MjE3NjM4NiwgMS45MjkxNDMsIDAuNTI3MTc0MTcsIDEuOTI3OTMzNywgMC41MzE1NDI2NiwKKyAgICAxLjkyNjk5ODUsIDAuNTM0OTAyOTMsIDEuOTI2MzMzNywgMC41MzcyODg5LCAxLjkyNTkzMzQsIDAuNTM4NzM0NSwgMS45MjU3OTAyLCAwLjUzOTI3MzQ0LAorICAgIDEuOTI1ODk0NSwgMC41Mzg5MzkzNiwgMS45MjYyMzU5LCAwLjUzNzc2NTc0LCAxLjkyNjgwMjUsIDAuNTM1Nzg1NTYsIDEuOTI3NTgxNCwgMC41MzMwMzE2NCwKKyAgICAxLjkyODU1OTIsIDAuNTI5NTM2NiwgMS45Mjk3MjE4LCAwLjUyNTMzMjgxLCAxLjkzMTA1NDgsIDAuNTIwNDUyMzgsIDEuOTMyNTQzOSwgMC41MTQ5Mjc0NSwKKyAgICAxLjkzNDE3NDEsIDAuNTA4NzkwMDIsIDEuOTM1OTMxMSwgMC41MDIwNzE5OCwgMS45Mzc4MDA0LCAwLjQ5NDgwNTQsIDEuOTM5NzY3OCwgMC40ODcwMjIxNiwKKyAgICAxLjk0MTgxOTUsIDAuNDc4NzU0MzQsIDEuOTQzOTQyLCAwLjQ3MDAzMzg1LCAxLjk0NjEyMTcsIDAuNDYwODkyNjUsIDEuOTQ4MzQ2MywgMC40NTEzNjI1MiwKKyAgICAxLjk1MDYwMzEsIDAuNDQxNDc1MDksIDEuOTUyODgwNiwgMC40MzEyNjE3NSwgMS45NTUxNjcyLCAwLjQyMDc1MzM5LCAxLjk1NzQ1MjEsIDAuNDA5OTgwNTQsCisgICAgMS45NTk3MjQ5LCAwLjM5ODk3MzAyLCAxLjk2MTk3NjMsIDAuMzg3NzU5OTUsIDEuOTY0MTk3LCAwLjM3NjM2OTYzLCAxLjk2NjM3ODgsIDAuMzY0ODI5MywKKyAgICAxLjk2ODUxNCwgMC4zNTMxNjUyNCwgMS45NzA1OTU3LCAwLjM0MTQwMjUsIDEuOTcyNjE3NywgMC4zMjk1NjQ5MywgMS45NzQ1NzQ4LCAwLjMxNzY3NDk2LAorICAgIDEuOTc2NDYyMiwgMC4zMDU3NTM3NywgMS45NzgyNzY1LCAwLjI5MzgyMTA0LCAxLjk4MDAxNDQsIDAuMjgxODk0OTgsIDEuOTgxNjc0LCAwLjI2OTk5MjQxLAorICAgIDEuOTgzMjUzNSwgMC4yNTgxMjg2MSwgMS45ODQ3NTI0LCAwLjI0NjMxNzM3LCAxLjk4NjE3MDQsIDAuMjM0NTcxMDIsIDEuOTg3NTA3OSwgMC4yMjI5MDA0MSwKKyAgICAxLjk4ODc2NiwgMC4yMTEzMTQ5MiwgMS45ODk5NDU4LCAwLjE5OTgyMjUsIDEuOTkxMDQ4OSwgMC4xODg0Mjk3MSwgMS45OTIwNzc2LCAwLjE3NzE0MTY1LAorICAgIDEuOTkzMDMzNiwgMC4xNjU5NjIwNiwgMS45OTM5MTkzLCAwLjE1NDg5MzI5LCAxLjk5NDczNjgsIDAuMTQzOTM2NDEsIDEuOTk1NDg4MywgMC4xMzMwOTExMSwKKyAgICAxLjk5NjE3NiwgMC4xMjIzNTU4LCAxLjk5NjgwMTcsIDAuMTExNzI3NjgsIDEuOTk3MzY3NCwgMC4xMDEyMDI3LCAxLjk5Nzg3NDcsIDAuMDkwNzc1NjU0LAorICAgIDEuOTk4MzI1LCAwLjA4MDQ0MDI0NiwgMS45OTg3MTk3LCAwLjA3MDE4OTE0OCwgMS45OTkwNTk4LCAwLjA2MDAxNDA1OCwgMS45OTkzNDYxLCAwLjA0OTkwNTgzMywKKyAgICAxLjk5OTU3OTUsIDAuMDM5ODU0NTQxLCAxLjk5OTc2MDUsIDAuMDI5ODQ5NjE3LCAxLjk5OTg4OTQsIDAuMDE5ODc5OTQ1LCAxLjk5OTk2NjYsIDAuMDA5OTM0MDA0NCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9vbjJhdmNkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9vbjJhdmNkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0OThlNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL29uMmF2Y2RhdGEuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogT24yIEF1ZGlvIGZvciBWaWRlbyBDb2RlYyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX09OMkFWQ19EQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19PTjJBVkNfREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBPTjJBVkNfTUFYX0JBTkRTIDExMgorI2RlZmluZSBPTjJBVkNfRVNDX0NCICAgICAxNQorCit0eXBlZGVmIHN0cnVjdCBPbjJBVkNNb2RlIHsKKyAgICBpbnQgbnVtX3dpbmRvd3M7CisgICAgaW50IG51bV9iYW5kczsKKyAgICBjb25zdCBpbnQgKmJhbmRfc3RhcnQ7Cit9IE9uMkFWQ01vZGU7CisKK2V4dGVybiBjb25zdCBPbjJBVkNNb2RlIGZmX29uMmF2Y19tb2Rlc180MFs4XTsKK2V4dGVybiBjb25zdCBPbjJBVkNNb2RlIGZmX29uMmF2Y19tb2Rlc180NFs4XTsKKworI2RlZmluZSBPTjJBVkNfU0NBTEVfRElGRlMgMTIxCitleHRlcm4gY29uc3QgdWludDMyX3QgZmZfb24yYXZjX3NjYWxlX2RpZmZfY29kZXNbXTsKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl9vbjJhdmNfc2NhbGVfZGlmZl9iaXRzW107CisKK2V4dGVybiBjb25zdCB1aW50MzJfdCAqIGNvbnN0IGZmX29uMmF2Y19xdWFkX2NiX2NvZGVzW107CitleHRlcm4gY29uc3QgdWludDhfdCAgKiBjb25zdCBmZl9vbjJhdmNfcXVhZF9jYl9iaXRzW107CitleHRlcm4gY29uc3QgdWludDE2X3QgKiBjb25zdCBmZl9vbjJhdmNfcXVhZF9jYl9zeW1zW107CitleHRlcm4gY29uc3QgaW50ICAgICAgICAgICAgICBmZl9vbjJhdmNfcXVhZF9jYl9lbGVtc1tdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90ICogY29uc3QgZmZfb24yYXZjX3BhaXJfY2JfY29kZXNbXTsKK2V4dGVybiBjb25zdCB1aW50OF90ICAqIGNvbnN0IGZmX29uMmF2Y19wYWlyX2NiX2JpdHNbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCAqIGNvbnN0IGZmX29uMmF2Y19wYWlyX2NiX3N5bXNbXTsKK2V4dGVybiBjb25zdCBpbnQgICAgICAgICAgICAgIGZmX29uMmF2Y19wYWlyX2NiX2VsZW1zW107CisKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9vbjJhdmNfd2luZG93X2xvbmdfMzIwMDBbMTAyNF07CitleHRlcm4gY29uc3QgZmxvYXQgZmZfb24yYXZjX3dpbmRvd19sb25nXzI0MDAwWzEwMjRdOworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX29uMmF2Y193aW5kb3dfc2hvcnRbMTI4XTsKKworZXh0ZXJuIGNvbnN0IGRvdWJsZSBmZl9vbjJhdmNfdGFiXzEwXzFbXTsKK2V4dGVybiBjb25zdCBkb3VibGUgZmZfb24yYXZjX3RhYl8xMF8yW107CitleHRlcm4gY29uc3QgZG91YmxlIGZmX29uMmF2Y190YWJfMjBfMVtdOworZXh0ZXJuIGNvbnN0IGRvdWJsZSBmZl9vbjJhdmNfdGFiXzIwXzJbXTsKK2V4dGVybiBjb25zdCBkb3VibGUgZmZfb24yYXZjX3RhYl80MF8xW107CitleHRlcm4gY29uc3QgZG91YmxlIGZmX29uMmF2Y190YWJfNDBfMltdOworZXh0ZXJuIGNvbnN0IGRvdWJsZSBmZl9vbjJhdmNfdGFiXzg0XzFbXTsKK2V4dGVybiBjb25zdCBkb3VibGUgZmZfb24yYXZjX3RhYl84NF8yW107CitleHRlcm4gY29uc3QgZG91YmxlIGZmX29uMmF2Y190YWJfODRfM1tdOworZXh0ZXJuIGNvbnN0IGRvdWJsZSBmZl9vbjJhdmNfdGFiXzg0XzRbXTsKK2V4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzRfMTBfMVs0XTsKK2V4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzRfMTBfMls0XTsKK2V4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzlfMjBfMVs5XTsKK2V4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzlfMjBfMls5XTsKK2V4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzE5XzQwXzFbMTldOworZXh0ZXJuIGNvbnN0IGRvdWJsZSogY29uc3QgZmZfb24yYXZjX3RhYnNfMTlfNDBfMlsxOV07CitleHRlcm4gY29uc3QgZG91YmxlKiBjb25zdCBmZl9vbjJhdmNfdGFic18yMF84NF8xWzIwXTsKK2V4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzIwXzg0XzJbMjBdOworZXh0ZXJuIGNvbnN0IGRvdWJsZSogY29uc3QgZmZfb24yYXZjX3RhYnNfMjBfODRfM1syMF07CitleHRlcm4gY29uc3QgZG91YmxlKiBjb25zdCBmZl9vbjJhdmNfdGFic18yMF84NF80WzIwXTsKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9vbjJhdmNfY3RhYl8xWzIwNDhdOworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX29uMmF2Y19jdGFiXzJbMjA0OF07CitleHRlcm4gY29uc3QgZmxvYXQgZmZfb24yYXZjX2N0YWJfM1syMDQ4XTsKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9vbjJhdmNfY3RhYl80WzIwNDhdOworCisjZW5kaWYgLyogQVZDT0RFQ19PTjJBVkNfREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9vcHRpb25zLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9vcHRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5ZmIwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL29wdGlvbnMuYwpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE9wdGlvbnMgZGVmaW5pdGlvbiBmb3IgQVZDb2RlY0NvbnRleHQuCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4gICAgICAgICAgICAgIC8qIEZMVF9NSU4sIEZMVF9NQVggKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIm9wdGlvbnNfdGFibGUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnRleHRfdG9fbmFtZSh2b2lkKiBwdHIpIHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjPSBwdHI7CisKKyAgICBpZihhdmMgJiYgYXZjLT5jb2RlYyAmJiBhdmMtPmNvZGVjLT5uYW1lKQorICAgICAgICByZXR1cm4gYXZjLT5jb2RlYy0+bmFtZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAiTlVMTCI7Cit9CisKK3N0YXRpYyB2b2lkICpjb2RlY19jaGlsZF9uZXh0KHZvaWQgKm9iaiwgdm9pZCAqcHJldikKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqcyA9IG9iajsKKyAgICBpZiAoIXByZXYgJiYgcy0+Y29kZWMgJiYgcy0+Y29kZWMtPnByaXZfY2xhc3MgJiYgcy0+cHJpdl9kYXRhKQorICAgICAgICByZXR1cm4gcy0+cHJpdl9kYXRhOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyAqY29kZWNfY2hpbGRfY2xhc3NfbmV4dChjb25zdCBBVkNsYXNzICpwcmV2KQoreworICAgIEFWQ29kZWMgKmMgPSBOVUxMOworCisgICAgLyogZmluZCB0aGUgY29kZWMgdGhhdCBjb3JyZXNwb25kcyB0byBwcmV2ICovCisgICAgd2hpbGUgKHByZXYgJiYgKGMgPSBhdl9jb2RlY19uZXh0KGMpKSkKKyAgICAgICAgaWYgKGMtPnByaXZfY2xhc3MgPT0gcHJldikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgLyogZmluZCBuZXh0IGNvZGVjIHdpdGggcHJpdiBvcHRpb25zICovCisgICAgd2hpbGUgKGMgPSBhdl9jb2RlY19uZXh0KGMpKQorICAgICAgICBpZiAoYy0+cHJpdl9jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBjLT5wcml2X2NsYXNzOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgQVZDbGFzc0NhdGVnb3J5IGdldF9jYXRlZ29yeSh2b2lkICpwdHIpCit7CisgICAgQVZDb2RlY0NvbnRleHQqIGF2Y3R4ID0gcHRyOworICAgIGlmKGF2Y3R4LT5jb2RlYyAmJiBhdmN0eC0+Y29kZWMtPmRlY29kZSkgcmV0dXJuIEFWX0NMQVNTX0NBVEVHT1JZX0RFQ09ERVI7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZfQ0xBU1NfQ0FURUdPUllfRU5DT0RFUjsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYXZfY29kZWNfY29udGV4dF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgICAgICAgICAgPSAiQVZDb2RlY0NvbnRleHQiLAorICAgIC5pdGVtX25hbWUgICAgICAgICAgICAgICA9IGNvbnRleHRfdG9fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgICAgICAgICAgPSBhdmNvZGVjX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgICAgICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5sb2dfbGV2ZWxfb2Zmc2V0X29mZnNldCA9IG9mZnNldG9mKEFWQ29kZWNDb250ZXh0LCBsb2dfbGV2ZWxfb2Zmc2V0KSwKKyAgICAuY2hpbGRfbmV4dCAgICAgICAgICAgICAgPSBjb2RlY19jaGlsZF9uZXh0LAorICAgIC5jaGlsZF9jbGFzc19uZXh0ICAgICAgICA9IGNvZGVjX2NoaWxkX2NsYXNzX25leHQsCisgICAgLmNhdGVnb3J5ICAgICAgICAgICAgICAgID0gQVZfQ0xBU1NfQ0FURUdPUllfRU5DT0RFUiwKKyAgICAuZ2V0X2NhdGVnb3J5ICAgICAgICAgICAgPSBnZXRfY2F0ZWdvcnksCit9OworCitpbnQgYXZjb2RlY19nZXRfY29udGV4dF9kZWZhdWx0czMoQVZDb2RlY0NvbnRleHQgKnMsIGNvbnN0IEFWQ29kZWMgKmNvZGVjKQoreworICAgIGludCBmbGFncz0wOworICAgIG1lbXNldChzLCAwLCBzaXplb2YoQVZDb2RlY0NvbnRleHQpKTsKKworICAgIHMtPmF2X2NsYXNzID0gJmF2X2NvZGVjX2NvbnRleHRfY2xhc3M7CisKKyAgICBzLT5jb2RlY190eXBlID0gY29kZWMgPyBjb2RlYy0+dHlwZSA6IEFWTUVESUFfVFlQRV9VTktOT1dOOworICAgIGlmIChjb2RlYykgeworICAgICAgICBzLT5jb2RlYyA9IGNvZGVjOworICAgICAgICBzLT5jb2RlY19pZCA9IGNvZGVjLT5pZDsKKyAgICB9CisKKyAgICBpZihzLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgZmxhZ3M9IEFWX09QVF9GTEFHX0FVRElPX1BBUkFNOworICAgIGVsc2UgaWYocy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIGZsYWdzPSBBVl9PUFRfRkxBR19WSURFT19QQVJBTTsKKyAgICBlbHNlIGlmKHMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKQorICAgICAgICBmbGFncz0gQVZfT1BUX0ZMQUdfU1VCVElUTEVfUEFSQU07CisgICAgYXZfb3B0X3NldF9kZWZhdWx0czIocywgZmxhZ3MsIGZsYWdzKTsKKworICAgIHMtPnRpbWVfYmFzZSAgICAgICAgICAgPSAoQVZSYXRpb25hbCl7MCwxfTsKKyAgICBzLT5mcmFtZXJhdGUgICAgICAgICAgID0gKEFWUmF0aW9uYWwpeyAwLCAxIH07CisgICAgcy0+cGt0X3RpbWViYXNlICAgICAgICA9IChBVlJhdGlvbmFsKXsgMCwgMSB9OworICAgIHMtPmdldF9idWZmZXIyICAgICAgICAgPSBhdmNvZGVjX2RlZmF1bHRfZ2V0X2J1ZmZlcjI7CisgICAgcy0+Z2V0X2Zvcm1hdCAgICAgICAgICA9IGF2Y29kZWNfZGVmYXVsdF9nZXRfZm9ybWF0OworICAgIHMtPmV4ZWN1dGUgICAgICAgICAgICAgPSBhdmNvZGVjX2RlZmF1bHRfZXhlY3V0ZTsKKyAgICBzLT5leGVjdXRlMiAgICAgICAgICAgID0gYXZjb2RlY19kZWZhdWx0X2V4ZWN1dGUyOworICAgIHMtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7MCwxfTsKKyAgICBzLT5waXhfZm10ICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9OT05FOworICAgIHMtPnNhbXBsZV9mbXQgICAgICAgICAgPSBBVl9TQU1QTEVfRk1UX05PTkU7CisKKyAgICBzLT5yZW9yZGVyZWRfb3BhcXVlICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgaWYoY29kZWMgJiYgY29kZWMtPnByaXZfZGF0YV9zaXplKXsKKyAgICAgICAgaWYoIXMtPnByaXZfZGF0YSl7CisgICAgICAgICAgICBzLT5wcml2X2RhdGE9IGF2X21hbGxvY3ooY29kZWMtPnByaXZfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmICghcy0+cHJpdl9kYXRhKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihjb2RlYy0+cHJpdl9jbGFzcyl7CisgICAgICAgICAgICAqKGNvbnN0IEFWQ2xhc3MqKilzLT5wcml2X2RhdGEgPSBjb2RlYy0+cHJpdl9jbGFzczsKKyAgICAgICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHMocy0+cHJpdl9kYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29kZWMgJiYgY29kZWMtPmRlZmF1bHRzKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIGNvbnN0IEFWQ29kZWNEZWZhdWx0ICpkID0gY29kZWMtPmRlZmF1bHRzOworICAgICAgICB3aGlsZSAoZC0+a2V5KSB7CisgICAgICAgICAgICByZXQgPSBhdl9vcHRfc2V0KHMsIGQtPmtleSwgZC0+dmFsdWUsIDApOworICAgICAgICAgICAgYXZfYXNzZXJ0MChyZXQgPj0gMCk7CisgICAgICAgICAgICBkKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWNDb250ZXh0ICphdmNvZGVjX2FsbG9jX2NvbnRleHQzKGNvbnN0IEFWQ29kZWMgKmNvZGVjKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eD0gYXZfbWFsbG9jKHNpemVvZihBVkNvZGVjQ29udGV4dCkpOworCisgICAgaWYgKCFhdmN0eCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZihhdmNvZGVjX2dldF9jb250ZXh0X2RlZmF1bHRzMyhhdmN0eCwgY29kZWMpIDwgMCl7CisgICAgICAgIGF2X2ZyZWUoYXZjdHgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYXZjdHg7Cit9CisKK3ZvaWQgYXZjb2RlY19mcmVlX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKipwYXZjdHgpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gKnBhdmN0eDsKKworICAgIGlmICghYXZjdHgpCisgICAgICAgIHJldHVybjsKKworICAgIGF2Y29kZWNfY2xvc2UoYXZjdHgpOworCisgICAgYXZfZnJlZXAoJmF2Y3R4LT5leHRyYWRhdGEpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+c3VidGl0bGVfaGVhZGVyKTsKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmludHJhX21hdHJpeCk7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5pbnRlcl9tYXRyaXgpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+cmNfb3ZlcnJpZGUpOworCisgICAgYXZfZnJlZXAocGF2Y3R4KTsKK30KKworaW50IGF2Y29kZWNfY29weV9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICpkZXN0LCBjb25zdCBBVkNvZGVjQ29udGV4dCAqc3JjKQoreworICAgIGNvbnN0IEFWQ29kZWMgKm9yaWdfY29kZWMgPSBkZXN0LT5jb2RlYzsKKyAgICB1aW50OF90ICpvcmlnX3ByaXZfZGF0YSA9IGRlc3QtPnByaXZfZGF0YTsKKworICAgIGlmIChhdmNvZGVjX2lzX29wZW4oZGVzdCkpIHsgLy8gY2hlY2sgdGhhdCB0aGUgZGVzdCBjb250ZXh0IGlzIHVuaW5pdGlhbGl6ZWQKKyAgICAgICAgYXZfbG9nKGRlc3QsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUcmllZCB0byBjb3B5IEFWQ29kZWNDb250ZXh0ICVwIGludG8gYWxyZWFkeS1pbml0aWFsaXplZCAlcFxuIiwKKyAgICAgICAgICAgICAgIHNyYywgZGVzdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZfb3B0X2ZyZWUoZGVzdCk7CisKKyAgICBtZW1jcHkoZGVzdCwgc3JjLCBzaXplb2YoKmRlc3QpKTsKKyAgICBhdl9vcHRfY29weShkZXN0LCBzcmMpOworCisgICAgZGVzdC0+cHJpdl9kYXRhICAgICAgID0gb3JpZ19wcml2X2RhdGE7CisKKyAgICBpZiAob3JpZ19wcml2X2RhdGEpCisgICAgICAgIGF2X29wdF9jb3B5KG9yaWdfcHJpdl9kYXRhLCBzcmMtPnByaXZfZGF0YSk7CisKKyAgICBkZXN0LT5jb2RlYyAgICAgICAgICAgPSBvcmlnX2NvZGVjOworCisgICAgLyogc2V0IHZhbHVlcyBzcGVjaWZpYyB0byBvcGVuZWQgY29kZWNzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCBzdGF0ZSAqLworICAgIGRlc3QtPnNsaWNlX29mZnNldCAgICA9IE5VTEw7CisgICAgZGVzdC0+aHdhY2NlbCAgICAgICAgID0gTlVMTDsKKyAgICBkZXN0LT5pbnRlcm5hbCAgICAgICAgPSBOVUxMOworCisgICAgLyogcmVhbGxvY2F0ZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgYWxsb2NhdGVkIHNlcGFyYXRlbHkgKi8KKyAgICBkZXN0LT5leHRyYWRhdGEgICAgICAgPSBOVUxMOworICAgIGRlc3QtPmludHJhX21hdHJpeCAgICA9IE5VTEw7CisgICAgZGVzdC0+aW50ZXJfbWF0cml4ICAgID0gTlVMTDsKKyAgICBkZXN0LT5yY19vdmVycmlkZSAgICAgPSBOVUxMOworICAgIGRlc3QtPnN1YnRpdGxlX2hlYWRlciA9IE5VTEw7CisKKyNkZWZpbmUgYWxsb2NfYW5kX2NvcHlfb3JfZmFpbChvYmosIHNpemUsIHBhZCkgXAorICAgIGlmIChzcmMtPm9iaiAmJiBzaXplID4gMCkgeyBcCisgICAgICAgIGRlc3QtPm9iaiA9IGF2X21hbGxvYyhzaXplICsgcGFkKTsgXAorICAgICAgICBpZiAoIWRlc3QtPm9iaikgXAorICAgICAgICAgICAgZ290byBmYWlsOyBcCisgICAgICAgIG1lbWNweShkZXN0LT5vYmosIHNyYy0+b2JqLCBzaXplKTsgXAorICAgICAgICBpZiAocGFkKSBcCisgICAgICAgICAgICBtZW1zZXQoKCh1aW50OF90ICopIGRlc3QtPm9iaikgKyBzaXplLCAwLCBwYWQpOyBcCisgICAgfQorICAgIGFsbG9jX2FuZF9jb3B5X29yX2ZhaWwoZXh0cmFkYXRhLCAgICBzcmMtPmV4dHJhZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgYWxsb2NfYW5kX2NvcHlfb3JfZmFpbChpbnRyYV9tYXRyaXgsIDY0ICogc2l6ZW9mKGludDE2X3QpLCAwKTsKKyAgICBhbGxvY19hbmRfY29weV9vcl9mYWlsKGludGVyX21hdHJpeCwgNjQgKiBzaXplb2YoaW50MTZfdCksIDApOworICAgIGFsbG9jX2FuZF9jb3B5X29yX2ZhaWwocmNfb3ZlcnJpZGUsICBzcmMtPnJjX292ZXJyaWRlX2NvdW50ICogc2l6ZW9mKCpzcmMtPnJjX292ZXJyaWRlKSwgMCk7CisgICAgYWxsb2NfYW5kX2NvcHlfb3JfZmFpbChzdWJ0aXRsZV9oZWFkZXIsIHNyYy0+c3VidGl0bGVfaGVhZGVyX3NpemUsIDEpOworICAgIGF2X2Fzc2VydDAoZGVzdC0+c3VidGl0bGVfaGVhZGVyX3NpemUgPT0gc3JjLT5zdWJ0aXRsZV9oZWFkZXJfc2l6ZSk7CisjdW5kZWYgYWxsb2NfYW5kX2NvcHlfb3JfZmFpbAorCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfZnJlZXAoJmRlc3QtPnJjX292ZXJyaWRlKTsKKyAgICBhdl9mcmVlcCgmZGVzdC0+aW50cmFfbWF0cml4KTsKKyAgICBhdl9mcmVlcCgmZGVzdC0+aW50ZXJfbWF0cml4KTsKKyAgICBhdl9mcmVlcCgmZGVzdC0+ZXh0cmFkYXRhKTsKKyNpZiBGRl9BUElfTVBWX09QVAorICAgIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBhdl9mcmVlcCgmZGVzdC0+cmNfZXEpOworICAgIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworY29uc3QgQVZDbGFzcyAqYXZjb2RlY19nZXRfY2xhc3Modm9pZCkKK3sKKyAgICByZXR1cm4gJmF2X2NvZGVjX2NvbnRleHRfY2xhc3M7Cit9CisKKyNkZWZpbmUgRk9GRlNFVCh4KSBvZmZzZXRvZihBVkZyYW1lLHgpCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBmcmFtZV9vcHRpb25zW109eworeyJiZXN0X2VmZm9ydF90aW1lc3RhbXAiLCAiIiwgRk9GRlNFVChiZXN0X2VmZm9ydF90aW1lc3RhbXApLCBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSBBVl9OT1BUU19WQUxVRSB9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgMH0sCit7InBrdF9wb3MiLCAiIiwgRk9GRlNFVChwa3RfcG9zKSwgQVZfT1BUX1RZUEVfSU5UNjQsIHsuaTY0ID0gLTEgfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIDB9LAoreyJwa3Rfc2l6ZSIsICIiLCBGT0ZGU0VUKHBrdF9zaXplKSwgQVZfT1BUX1RZUEVfSU5UNjQsIHsuaTY0ID0gLTEgfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIDB9LAoreyJzYW1wbGVfYXNwZWN0X3JhdGlvIiwgIiIsIEZPRkZTRVQoc2FtcGxlX2FzcGVjdF9yYXRpbyksIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7LmRibCA9IDAgfSwgMCwgSU5UX01BWCwgMH0sCit7IndpZHRoIiwgIiIsIEZPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCAwfSwKK3siaGVpZ2h0IiwgIiIsIEZPRkZTRVQoaGVpZ2h0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgMH0sCit7ImZvcm1hdCIsICIiLCBGT0ZGU0VUKGZvcm1hdCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMSB9LCAwLCBJTlRfTUFYLCAwfSwKK3siY2hhbm5lbF9sYXlvdXQiLCAiIiwgRk9GRlNFVChjaGFubmVsX2xheW91dCksIEFWX09QVF9UWVBFX0lOVDY0LCB7Lmk2NCA9IDAgfSwgMCwgSU5UNjRfTUFYLCAwfSwKK3sic2FtcGxlX3JhdGUiLCAiIiwgRk9GRlNFVChzYW1wbGVfcmF0ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIDB9LAore05VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYXZfZnJhbWVfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgICAgICAgICAgICAgID0gIkFWRnJhbWUiLAorICAgIC5pdGVtX25hbWUgICAgICAgICAgICAgICA9IE5VTEwsCisgICAgLm9wdGlvbiAgICAgICAgICAgICAgICAgID0gZnJhbWVfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgICAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitjb25zdCBBVkNsYXNzICphdmNvZGVjX2dldF9mcmFtZV9jbGFzcyh2b2lkKQoreworICAgIHJldHVybiAmYXZfZnJhbWVfY2xhc3M7Cit9CisKKyNkZWZpbmUgU1JPRkZTRVQoeCkgb2Zmc2V0b2YoQVZTdWJ0aXRsZVJlY3QseCkKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHN1YnRpdGxlX3JlY3Rfb3B0aW9uc1tdPXsKK3sieCIsICIiLCBTUk9GRlNFVCh4KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgMH0sCit7InkiLCAiIiwgU1JPRkZTRVQoeSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIDB9LAoreyJ3IiwgIiIsIFNST0ZGU0VUKHcpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCAwfSwKK3siaCIsICIiLCBTUk9GRlNFVChoKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgMH0sCit7InR5cGUiLCAiIiwgU1JPRkZTRVQodHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIDB9LAoreyJmbGFncyIsICIiLCBTUk9GRlNFVChmbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IDB9LCAwLCAxLCAwLCAiZmxhZ3MifSwKK3siZm9yY2VkIiwgIiIsIFNST0ZGU0VUKGZsYWdzKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gMH0sIDAsIDEsIDB9LAore05VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYXZfc3VidGl0bGVfcmVjdF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgICAgICAgICA9ICJBVlN1YnRpdGxlUmVjdCIsCisgICAgLml0ZW1fbmFtZSAgICAgICAgICAgICAgPSBOVUxMLAorICAgIC5vcHRpb24gICAgICAgICAgICAgICAgID0gc3VidGl0bGVfcmVjdF9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICAgICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworY29uc3QgQVZDbGFzcyAqYXZjb2RlY19nZXRfc3VidGl0bGVfcmVjdF9jbGFzcyh2b2lkKQoreworICAgIHJldHVybiAmYXZfc3VidGl0bGVfcmVjdF9jbGFzczsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL29wdGlvbnNfdGFibGUuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL29wdGlvbnNfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDViMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvb3B0aW9uc190YWJsZS5oCkBAIC0wLDAgKzEsNTA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX09QVElPTlNfVEFCTEVfSAorI2RlZmluZSBBVkNPREVDX09QVElPTlNfVEFCTEVfSAorCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBVkNvZGVjQ29udGV4dCx4KQorI2RlZmluZSBERUZBVUxUIDAgLy9zaG91bGQgYmUgTkFOIGJ1dCBpdCBkb2VzIG5vdCB3b3JrIGFzIGl0IGlzIG5vdCBhIGNvbnN0YW50IGluIGdsaWJjIGFzIHJlcXVpcmVkIGJ5IEFOU0kvSVNPIEMKKy8vdGhlc2UgbmFtZXMgYXJlIHRvbyBsb25nIHRvIGJlIHJlYWRhYmxlCisjZGVmaW5lIFYgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKyNkZWZpbmUgQSBBVl9PUFRfRkxBR19BVURJT19QQVJBTQorI2RlZmluZSBTIEFWX09QVF9GTEFHX1NVQlRJVExFX1BBUkFNCisjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KKyNkZWZpbmUgRCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorCisjZGVmaW5lIEFWX0NPREVDX0RFRkFVTFRfQklUUkFURSAyMDAqMTAwMAorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYXZjb2RlY19vcHRpb25zW10gPSB7Cit7ImIiLCAic2V0IGJpdHJhdGUgKGluIGJpdHMvcykiLCBPRkZTRVQoYml0X3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQVZfQ09ERUNfREVGQVVMVF9CSVRSQVRFIH0sIDAsIElOVF9NQVgsIEF8VnxFfSwKK3siYWIiLCAic2V0IGJpdHJhdGUgKGluIGJpdHMvcykiLCBPRkZTRVQoYml0X3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMTI4KjEwMDAgfSwgMCwgSU5UX01BWCwgQXxFfSwKK3siYnQiLCAiU2V0IHZpZGVvIGJpdHJhdGUgdG9sZXJhbmNlIChpbiBiaXRzL3MpLiBJbiAxLXBhc3MgbW9kZSwgYml0cmF0ZSB0b2xlcmFuY2Ugc3BlY2lmaWVzIGhvdyBmYXIgIgorICAgICAgICJyYXRlY29udHJvbCBpcyB3aWxsaW5nIHRvIGRldmlhdGUgZnJvbSB0aGUgdGFyZ2V0IGF2ZXJhZ2UgYml0cmF0ZSB2YWx1ZS4gVGhpcyBpcyBub3QgcmVsYXRlZCAiCisgICAgICAgInRvIG1pbmltdW0vbWF4aW11bSBiaXRyYXRlLiBMb3dlcmluZyB0b2xlcmFuY2UgdG9vIG11Y2ggaGFzIGFuIGFkdmVyc2UgZWZmZWN0IG9uIHF1YWxpdHkuIiwKKyAgICAgICBPRkZTRVQoYml0X3JhdGVfdG9sZXJhbmNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFWX0NPREVDX0RFRkFVTFRfQklUUkFURSoyMCB9LCAxLCBJTlRfTUFYLCBWfEV9LAoreyJmbGFncyIsIE5VTEwsIE9GRlNFVChmbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgVUlOVF9NQVgsIFZ8QXxTfEV8RCwgImZsYWdzIn0sCit7InVuYWxpZ25lZCIsICJhbGxvdyBkZWNvZGVycyB0byBwcm9kdWNlIHVuYWxpZ25lZCBvdXRwdXQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ09ERUNfRkxBR19VTkFMSUdORUQgfSwgSU5UX01JTiwgSU5UX01BWCwgViB8IEQsICJmbGFncyIgfSwKK3sibXY0IiwgInVzZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIHBlciBtYWNyb2Jsb2NrIChNUEVHLTQpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBR180TVYgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiZmxhZ3MifSwKK3sicXBlbCIsICJ1c2UgMS80LXBlbCBtb3Rpb24gY29tcGVuc2F0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBR19RUEVMIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImZsYWdzIn0sCit7Imxvb3AiLCAidXNlIGxvb3AgZmlsdGVyIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBR19MT09QX0ZJTFRFUiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJmbGFncyJ9LAoreyJxc2NhbGUiLCAidXNlIGZpeGVkIHFzY2FsZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUdfUVNDQUxFIH0sIElOVF9NSU4sIElOVF9NQVgsIDAsICJmbGFncyJ9LAorI2lmIEZGX0FQSV9HTUMKK3siZ21jIiwgInVzZSBnbWMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBDT0RFQ19GTEFHX0dNQyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJmbGFncyJ9LAorI2VuZGlmCisjaWYgRkZfQVBJX01WMAoreyJtdjAiLCAiYWx3YXlzIHRyeSBhIG1iIHdpdGggbXY9PDAsMD4iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBDT0RFQ19GTEFHX01WMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJmbGFncyJ9LAorI2VuZGlmCisjaWYgRkZfQVBJX0lOUFVUX1BSRVNFUlZFRAoreyJpbnB1dF9wcmVzZXJ2ZWQiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBDT0RFQ19GTEFHX0lOUFVUX1BSRVNFUlZFRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCAwLCAiZmxhZ3MifSwKKyNlbmRpZgoreyJwYXNzMSIsICJ1c2UgaW50ZXJuYWwgMi1wYXNzIHJhdGVjb250cm9sIGluIGZpcnN0ICBwYXNzIG1vZGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBDT0RFQ19GTEFHX1BBU1MxIH0sIElOVF9NSU4sIElOVF9NQVgsIDAsICJmbGFncyJ9LAoreyJwYXNzMiIsICJ1c2UgaW50ZXJuYWwgMi1wYXNzIHJhdGVjb250cm9sIGluIHNlY29uZCBwYXNzIG1vZGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBDT0RFQ19GTEFHX1BBU1MyIH0sIElOVF9NSU4sIElOVF9NQVgsIDAsICJmbGFncyJ9LAoreyJncmF5IiwgIm9ubHkgZGVjb2RlL2VuY29kZSBncmF5c2NhbGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBDT0RFQ19GTEFHX0dSQVkgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJmbGFncyJ9LAorI2lmIEZGX0FQSV9FTVVfRURHRQoreyJlbXVfZWRnZSIsICJkbyBub3QgZHJhdyBlZGdlcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUdfRU1VX0VER0UgfSwgSU5UX01JTiwgSU5UX01BWCwgMCwgImZsYWdzIn0sCisjZW5kaWYKK3sicHNuciIsICJlcnJvcls/XSB2YXJpYWJsZXMgd2lsbCBiZSBzZXQgZHVyaW5nIGVuY29kaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBR19QU05SIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImZsYWdzIn0sCit7InRydW5jYXRlZCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUdfVFJVTkNBVEVEIH0sIElOVF9NSU4sIElOVF9NQVgsIDAsICJmbGFncyJ9LAorI2lmIEZGX0FQSV9OT1JNQUxJWkVfQVFQCit7Im5hcSIsICJub3JtYWxpemUgYWRhcHRpdmUgcXVhbnRpemF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBR19OT1JNQUxJWkVfQVFQIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImZsYWdzIn0sCisjZW5kaWYKK3siaWxkY3QiLCAidXNlIGludGVybGFjZWQgRENUIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJmbGFncyJ9LAoreyJsb3dfZGVsYXkiLCAiZm9yY2UgbG93IGRlbGF5IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBR19MT1dfREVMQVkgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxEfEUsICJmbGFncyJ9LAoreyJnbG9iYWxfaGVhZGVyIiwgInBsYWNlIGdsb2JhbCBoZWFkZXJzIGluIGV4dHJhZGF0YSBpbnN0ZWFkIG9mIGV2ZXJ5IGtleWZyYW1lIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxFLCAiZmxhZ3MifSwKK3siYml0ZXhhY3QiLCAidXNlIG9ubHkgYml0ZXhhY3QgZnVuY3Rpb25zIChleGNlcHQgKEkpRENUKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUdfQklURVhBQ1QgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfFN8RHxFLCAiZmxhZ3MifSwKK3siYWljIiwgIkguMjYzIGFkdmFuY2VkIGludHJhIGNvZGluZyAvIE1QRUctNCBBQyBwcmVkaWN0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBR19BQ19QUkVEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImZsYWdzIn0sCit7ImlsbWUiLCAiaW50ZXJsYWNlZCBtb3Rpb24gZXN0aW1hdGlvbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUdfSU5URVJMQUNFRF9NRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJmbGFncyJ9LAoreyJjZ29wIiwgImNsb3NlZCBHT1AiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBDT0RFQ19GTEFHX0NMT1NFRF9HT1AgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiZmxhZ3MifSwKK3sib3V0cHV0X2NvcnJ1cHQiLCAiT3V0cHV0IGV2ZW4gcG90ZW50aWFsbHkgY29ycnVwdGVkIGZyYW1lcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUdfT1VUUFVUX0NPUlJVUFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiZmxhZ3MifSwKK3siZmFzdCIsICJhbGxvdyBub24tc3BlYy1jb21wbGlhbnQgc3BlZWR1cCB0cmlja3MiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBDT0RFQ19GTEFHMl9GQVNUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImZsYWdzMiJ9LAoreyJub291dCIsICJza2lwIGJpdHN0cmVhbSBlbmNvZGluZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUcyX05PX09VVFBVVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJmbGFnczIifSwKK3siaWdub3JlY3JvcCIsICJpZ25vcmUgY3JvcHBpbmcgaW5mb3JtYXRpb24gZnJvbSBzcHMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBDT0RFQ19GTEFHMl9JR05PUkVfQ1JPUCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJmbGFnczIifSwKK3sibG9jYWxfaGVhZGVyIiwgInBsYWNlIGdsb2JhbCBoZWFkZXJzIGF0IGV2ZXJ5IGtleWZyYW1lIGluc3RlYWQgb2YgaW4gZXh0cmFkYXRhIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBRzJfTE9DQUxfSEVBREVSIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImZsYWdzMiJ9LAoreyJjaHVua3MiLCAiRnJhbWUgZGF0YSBtaWdodCBiZSBzcGxpdCBpbnRvIG11bHRpcGxlIGNodW5rcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUcyX0NIVU5LUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJmbGFnczIifSwKK3sic2hvd2FsbCIsICJTaG93IGFsbCBmcmFtZXMgYmVmb3JlIHRoZSBmaXJzdCBrZXlmcmFtZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUcyX1NIT1dfQUxMIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImZsYWdzMiJ9LAoreyJleHBvcnRfbXZzIiwgImV4cG9ydCBtb3Rpb24gdmVjdG9ycyB0aHJvdWdoIGZyYW1lIHNpZGUgZGF0YSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUcyX0VYUE9SVF9NVlN9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJmbGFnczIifSwKK3sic2tpcF9tYW51YWwiLCAiZG8gbm90IHNraXAgc2FtcGxlcyBhbmQgZXhwb3J0IHNraXAgaW5mb3JtYXRpb24gYXMgZnJhbWUgc2lkZSBkYXRhIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBRzJfU0tJUF9NQU5VQUx9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJmbGFnczIifSwKK3sibWVfbWV0aG9kIiwgInNldCBtb3Rpb24gZXN0aW1hdGlvbiBtZXRob2QiLCBPRkZTRVQobWVfbWV0aG9kKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IE1FX0VQWlMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWVfbWV0aG9kIn0sCit7Inplcm8iLCAiemVybyBtb3Rpb24gZXN0aW1hdGlvbiAoZmFzdGVzdCkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNRV9aRVJPIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgIm1lX21ldGhvZCIgfSwKK3siZnVsbCIsICJmdWxsIG1vdGlvbiBlc3RpbWF0aW9uIChzbG93ZXN0KSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1FX0ZVTEwgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWVfbWV0aG9kIiB9LAoreyJlcHpzIiwgIkVQWlMgbW90aW9uIGVzdGltYXRpb24gKGRlZmF1bHQpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTUVfRVBaUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJtZV9tZXRob2QiIH0sCit7ImVzYSIsICJlc2EgbW90aW9uIGVzdGltYXRpb24gKGFsaWFzIGZvciBmdWxsKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1FX0ZVTEwgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWVfbWV0aG9kIiB9LAoreyJ0ZXNhIiwgInRlc2EgbW90aW9uIGVzdGltYXRpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNRV9URVNBIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgIm1lX21ldGhvZCIgfSwKK3siZGlhIiwgImRpYW1vbmQgbW90aW9uIGVzdGltYXRpb24gKGFsaWFzIGZvciBFUFpTKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1FX0VQWlMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWVfbWV0aG9kIiB9LAoreyJsb2ciLCAibG9nIG1vdGlvbiBlc3RpbWF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTUVfTE9HIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgIm1lX21ldGhvZCIgfSwKK3sicGhvZHMiLCAicGhvZHMgbW90aW9uIGVzdGltYXRpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNRV9QSE9EUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJtZV9tZXRob2QiIH0sCit7IngxIiwgIlgxIG1vdGlvbiBlc3RpbWF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTUVfWDEgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWVfbWV0aG9kIiB9LAoreyJoZXgiLCAiaGV4IG1vdGlvbiBlc3RpbWF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTUVfSEVYIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgIm1lX21ldGhvZCIgfSwKK3sidW1oIiwgInVtaCBtb3Rpb24gZXN0aW1hdGlvbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1FX1VNSCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJtZV9tZXRob2QiIH0sCit7Iml0ZXIiLCAiaXRlciBtb3Rpb24gZXN0aW1hdGlvbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1FX0lURVIgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWVfbWV0aG9kIiB9LAoreyJleHRyYWRhdGFfc2l6ZSIsIE5VTEwsIE9GRlNFVChleHRyYWRhdGFfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAoreyJ0aW1lX2Jhc2UiLCBOVUxMLCBPRkZTRVQodGltZV9iYXNlKSwgQVZfT1BUX1RZUEVfUkFUSU9OQUwsIHsuZGJsID0gMH0sIElOVF9NSU4sIElOVF9NQVh9LAoreyJnIiwgInNldCB0aGUgZ3JvdXAgb2YgcGljdHVyZSAoR09QKSBzaXplIiwgT0ZGU0VUKGdvcF9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDEyIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCit7ImFyIiwgInNldCBhdWRpbyBzYW1wbGluZyByYXRlIChpbiBIeikiLCBPRkZTRVQoc2FtcGxlX3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBBfER8RX0sCit7ImFjIiwgInNldCBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMiLCBPRkZTRVQoY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBBfER8RX0sCit7ImN1dG9mZiIsICJzZXQgY3V0b2ZmIGJhbmR3aWR0aCIsIE9GRlNFVChjdXRvZmYpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEV9LAoreyJmcmFtZV9zaXplIiwgTlVMTCwgT0ZGU0VUKGZyYW1lX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEV9LAoreyJmcmFtZV9udW1iZXIiLCBOVUxMLCBPRkZTRVQoZnJhbWVfbnVtYmVyKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCit7ImRlbGF5IiwgTlVMTCwgT0ZGU0VUKGRlbGF5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCit7InFjb21wIiwgInZpZGVvIHF1YW50aXplciBzY2FsZSBjb21wcmVzc2lvbiAoVkJSKS4gQ29uc3RhbnQgb2YgcmF0ZWNvbnRyb2wgZXF1YXRpb24uICIKKyAgICAgICAgICAiUmVjb21tZW5kZWQgcmFuZ2UgZm9yIGRlZmF1bHQgcmNfZXE6IDAuMC0xLjAiLAorICAgICAgICAgIE9GRlNFVChxY29tcHJlc3MpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAwLjUgfSwgLUZMVF9NQVgsIEZMVF9NQVgsIFZ8RX0sCit7InFibHVyIiwgInZpZGVvIHF1YW50aXplciBzY2FsZSBibHVyIChWQlIpIiwgT0ZGU0VUKHFibHVyKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMC41IH0sIC0xLCBGTFRfTUFYLCBWfEV9LAoreyJxbWluIiwgIm1pbmltdW0gdmlkZW8gcXVhbnRpemVyIHNjYWxlIChWQlIpIiwgT0ZGU0VUKHFtaW4pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMiB9LCAtMSwgNjksIFZ8RX0sCit7InFtYXgiLCAibWF4aW11bSB2aWRlbyBxdWFudGl6ZXIgc2NhbGUgKFZCUikiLCBPRkZTRVQocW1heCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAzMSB9LCAtMSwgMTAyNCwgVnxFfSwKK3sicWRpZmYiLCAibWF4aW11bSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHF1YW50aXplciBzY2FsZXMgKFZCUikiLCBPRkZTRVQobWF4X3FkaWZmKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKK3siYmYiLCAic2V0IG1heGltdW0gbnVtYmVyIG9mIEIgZnJhbWVzIGJldHdlZW4gbm9uLUItZnJhbWVzIiwgT0ZGU0VUKG1heF9iX2ZyYW1lcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIC0xLCBJTlRfTUFYLCBWfEV9LAoreyJiX3FmYWN0b3IiLCAiUVAgZmFjdG9yIGJldHdlZW4gUC0gYW5kIEItZnJhbWVzIiwgT0ZGU0VUKGJfcXVhbnRfZmFjdG9yKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMS4yNSB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKK3sicmNfc3RyYXRlZ3kiLCAicmF0ZWNvbnRyb2wgbWV0aG9kIiwgT0ZGU0VUKHJjX3N0cmF0ZWd5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKK3siYl9zdHJhdGVneSIsICJzdHJhdGVneSB0byBjaG9vc2UgYmV0d2VlbiBJL1AvQi1mcmFtZXMiLCBPRkZTRVQoYl9mcmFtZV9zdHJhdGVneSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCit7InBzIiwgIlJUUCBwYXlsb2FkIHNpemUgaW4gYnl0ZXMiLCBPRkZTRVQocnRwX3BheWxvYWRfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCit7Im12X2JpdHMiLCBOVUxMLCBPRkZTRVQobXZfYml0cyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAoreyJoZWFkZXJfYml0cyIsIE5VTEwsIE9GRlNFVChoZWFkZXJfYml0cyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAoreyJpX3RleF9iaXRzIiwgTlVMTCwgT0ZGU0VUKGlfdGV4X2JpdHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYfSwKK3sicF90ZXhfYml0cyIsIE5VTEwsIE9GRlNFVChwX3RleF9iaXRzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCit7ImlfY291bnQiLCBOVUxMLCBPRkZTRVQoaV9jb3VudCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAoreyJwX2NvdW50IiwgTlVMTCwgT0ZGU0VUKHBfY291bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYfSwKK3sic2tpcF9jb3VudCIsIE5VTEwsIE9GRlNFVChza2lwX2NvdW50KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCit7Im1pc2NfYml0cyIsIE5VTEwsIE9GRlNFVChtaXNjX2JpdHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYfSwKK3siZnJhbWVfYml0cyIsIE5VTEwsIE9GRlNFVChmcmFtZV9iaXRzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCit7ImNvZGVjX3RhZyIsIE5VTEwsIE9GRlNFVChjb2RlY190YWcpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYfSwKK3siYnVnIiwgIndvcmsgYXJvdW5kIG5vdCBhdXRvZGV0ZWN0ZWQgZW5jb2RlciBidWdzIiwgT0ZGU0VUKHdvcmthcm91bmRfYnVncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IEZGX0JVR19BVVRPREVURUNUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImJ1ZyJ9LAoreyJhdXRvZGV0ZWN0IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX0FVVE9ERVRFQ1QgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYnVnIn0sCisjaWYgRkZfQVBJX09MRF9NU01QRUc0Cit7Im9sZF9tc21wZWc0IiwgInNvbWUgb2xkIGxhdmMtZ2VuZXJhdGVkIE1TTVBFRzR2MyBmaWxlcyAobm8gYXV0b2RldGVjdGlvbikiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9CVUdfT0xEX01TTVBFRzQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYnVnIn0sCisjZW5kaWYKK3sieHZpZF9pbGFjZSIsICJYdmlkIGludGVybGFjaW5nIGJ1ZyAoYXV0b2RldGVjdGVkIGlmIEZPVVJDQyA9PSBYVklYKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0JVR19YVklEX0lMQUNFIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImJ1ZyJ9LAoreyJ1bXA0IiwgIihhdXRvZGV0ZWN0ZWQgaWYgRk9VUkNDID09IFVNUDQpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX1VNUDQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYnVnIn0sCit7Im5vX3BhZGRpbmciLCAicGFkZGluZyBidWcgKGF1dG9kZXRlY3RlZCkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9CVUdfTk9fUEFERElORyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJidWcifSwKK3siYW12IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX0FNViB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJidWcifSwKKyNpZiBGRl9BUElfQUNfVkxDCit7ImFjX3ZsYyIsICJpbGxlZ2FsIFZMQyBidWcgKGF1dG9kZXRlY3RlZCBwZXIgRk9VUkNDKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0JVR19BQ19WTEMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYnVnIn0sCisjZW5kaWYKK3sicXBlbF9jaHJvbWEiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9CVUdfUVBFTF9DSFJPTUEgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYnVnIn0sCit7InN0ZF9xcGVsIiwgIm9sZCBzdGFuZGFyZCBxcGVsIChhdXRvZGV0ZWN0ZWQgcGVyIEZPVVJDQy92ZXJzaW9uKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0JVR19TVERfUVBFTCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJidWcifSwKK3sicXBlbF9jaHJvbWEyIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX1FQRUxfQ0hST01BMiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJidWcifSwKK3siZGlyZWN0X2Jsb2Nrc2l6ZSIsICJkaXJlY3QtcXBlbC1ibG9ja3NpemUgYnVnIChhdXRvZGV0ZWN0ZWQgcGVyIEZPVVJDQy92ZXJzaW9uKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0JVR19ESVJFQ1RfQkxPQ0tTSVpFIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImJ1ZyJ9LAoreyJlZGdlIiwgImVkZ2UgcGFkZGluZyBidWcgKGF1dG9kZXRlY3RlZCBwZXIgRk9VUkNDL3ZlcnNpb24pIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX0VER0UgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYnVnIn0sCit7ImhwZWxfY2hyb21hIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX0hQRUxfQ0hST01BIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImJ1ZyJ9LAoreyJkY19jbGlwIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX0RDX0NMSVAgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYnVnIn0sCit7Im1zIiwgIndvcmsgYXJvdW5kIHZhcmlvdXMgYnVncyBpbiBNaWNyb3NvZnQncyBicm9rZW4gZGVjb2RlcnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9CVUdfTVMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYnVnIn0sCit7InRydW5jIiwgInRydW5jYXRlZCBmcmFtZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9CVUdfVFJVTkNBVEVEfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYnVnIn0sCit7InN0cmljdCIsICJob3cgc3RyaWN0bHkgdG8gZm9sbG93IHRoZSBzdGFuZGFyZHMiLCBPRkZTRVQoc3RyaWN0X3N0ZF9jb21wbGlhbmNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfER8RSwgInN0cmljdCJ9LAoreyJ2ZXJ5IiwgInN0cmljdGx5IGNvbmZvcm0gdG8gYSBvbGRlciBtb3JlIHN0cmljdCB2ZXJzaW9uIG9mIHRoZSBzcGVjIG9yIHJlZmVyZW5jZSBzb2Z0d2FyZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NPTVBMSUFOQ0VfVkVSWV9TVFJJQ1QgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxEfEUsICJzdHJpY3QifSwKK3sic3RyaWN0IiwgInN0cmljdGx5IGNvbmZvcm0gdG8gYWxsIHRoZSB0aGluZ3MgaW4gdGhlIHNwZWMgbm8gbWF0dGVyIHdoYXQgdGhlIGNvbnNlcXVlbmNlcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NPTVBMSUFOQ0VfU1RSSUNUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RHxFLCAic3RyaWN0In0sCit7Im5vcm1hbCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NPTVBMSUFOQ0VfTk9STUFMIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RHxFLCAic3RyaWN0In0sCit7InVub2ZmaWNpYWwiLCAiYWxsb3cgdW5vZmZpY2lhbCBleHRlbnNpb25zIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09NUExJQU5DRV9VTk9GRklDSUFMIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RHxFLCAic3RyaWN0In0sCit7ImV4cGVyaW1lbnRhbCIsICJhbGxvdyBub24tc3RhbmRhcmRpemVkIGV4cGVyaW1lbnRhbCB0aGluZ3MiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfER8RSwgInN0cmljdCJ9LAoreyJiX3FvZmZzZXQiLCAiUVAgb2Zmc2V0IGJldHdlZW4gUC0gYW5kIEItZnJhbWVzIiwgT0ZGU0VUKGJfcXVhbnRfb2Zmc2V0KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMS4yNSB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKK3siZXJyX2RldGVjdCIsICJzZXQgZXJyb3IgZGV0ZWN0aW9uIGZsYWdzIiwgT0ZGU0VUKGVycl9yZWNvZ25pdGlvbiksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IDAgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfEQsICJlcnJfZGV0ZWN0In0sCit7ImNyY2NoZWNrIiwgInZlcmlmeSBlbWJlZGRlZCBDUkNzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfRUZfQ1JDQ0hFQ0sgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfEQsICJlcnJfZGV0ZWN0In0sCit7ImJpdHN0cmVhbSIsICJkZXRlY3QgYml0c3RyZWFtIHNwZWNpZmljYXRpb24gZGV2aWF0aW9ucyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0VGX0JJVFNUUkVBTSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfFZ8RCwgImVycl9kZXRlY3QifSwKK3siYnVmZmVyIiwgImRldGVjdCBpbXByb3BlciBiaXRzdHJlYW0gbGVuZ3RoIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfRUZfQlVGRkVSIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8VnxELCAiZXJyX2RldGVjdCJ9LAoreyJleHBsb2RlIiwgImFib3J0IGRlY29kaW5nIG9uIG1pbm9yIGVycm9yIGRldGVjdGlvbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0VGX0VYUExPREUgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfEQsICJlcnJfZGV0ZWN0In0sCit7Imlnbm9yZV9lcnIiLCAiaWdub3JlIGVycm9ycyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0VGX0lHTk9SRV9FUlIgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfEQsICJlcnJfZGV0ZWN0In0sCit7ImNhcmVmdWwiLCAgICAiY29uc2lkZXIgdGhpbmdzIHRoYXQgdmlvbGF0ZSB0aGUgc3BlYywgYXJlIGZhc3QgdG8gY2hlY2sgYW5kIGhhdmUgbm90IGJlZW4gc2VlbiBpbiB0aGUgd2lsZCBhcyBlcnJvcnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9FRl9DQVJFRlVMIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8VnxELCAiZXJyX2RldGVjdCJ9LAoreyJjb21wbGlhbnQiLCAgImNvbnNpZGVyIGFsbCBzcGVjIG5vbiBjb21wbGlhbmNpZXMgYXMgZXJyb3JzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfRUZfQ09NUExJQU5UIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8VnxELCAiZXJyX2RldGVjdCJ9LAoreyJhZ2dyZXNzaXZlIiwgImNvbnNpZGVyIHRoaW5ncyB0aGF0IGEgc2FuZSBlbmNvZGVyIHNob3VsZCBub3QgZG8gYXMgYW4gZXJyb3IiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9FRl9BR0dSRVNTSVZFIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8VnxELCAiZXJyX2RldGVjdCJ9LAoreyJoYXNfYl9mcmFtZXMiLCBOVUxMLCBPRkZTRVQoaGFzX2JfZnJhbWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCit7ImJsb2NrX2FsaWduIiwgTlVMTCwgT0ZGU0VUKGJsb2NrX2FsaWduKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCit7Im1wZWdfcXVhbnQiLCAidXNlIE1QRUcgcXVhbnRpemVycyBpbnN0ZWFkIG9mIEguMjYzIiwgT0ZGU0VUKG1wZWdfcXVhbnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAorI2lmIEZGX0FQSV9NUFZfT1BUCit7InFzcXVpc2giLCAiZGVwcmVjYXRlZCwgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQiLCBPRkZTRVQocmNfcXNxdWlzaCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IERFRkFVTFQgfSwgMCwgOTksIFZ8RX0sCit7InJjX3Ftb2RfYW1wIiwgICJkZXByZWNhdGVkLCB1c2UgZW5jb2RlciBwcml2YXRlIG9wdGlvbnMgaW5zdGVhZCIsIE9GRlNFVChyY19xbW9kX2FtcCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IERFRkFVTFQgfSwgLUZMVF9NQVgsIEZMVF9NQVgsIFZ8RX0sCit7InJjX3Ftb2RfZnJlcSIsICJkZXByZWNhdGVkLCB1c2UgZW5jb2RlciBwcml2YXRlIG9wdGlvbnMgaW5zdGVhZCIsIE9GRlNFVChyY19xbW9kX2ZyZXEpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAorI2VuZGlmCit7InJjX292ZXJyaWRlX2NvdW50IiwgTlVMTCwgT0ZGU0VUKHJjX292ZXJyaWRlX2NvdW50KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCisjaWYgRkZfQVBJX01QVl9PUFQKK3sicmNfZXEiLCAiZGVwcmVjYXRlZCwgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQiLCBPRkZTRVQocmNfZXEpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgVnxFfSwKKyNlbmRpZgoreyJtYXhyYXRlIiwgIm1heGltdW0gYml0cmF0ZSAoaW4gYml0cy9zKS4gVXNlZCBmb3IgVkJWIHRvZ2V0aGVyIHdpdGggYnVmc2l6ZS4iLCBPRkZTRVQocmNfbWF4X3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBWfEF8RX0sCit7Im1pbnJhdGUiLCAibWluaW11bSBiaXRyYXRlIChpbiBiaXRzL3MpLiBNb3N0IHVzZWZ1bCBpbiBzZXR0aW5nIHVwIGEgQ0JSIGVuY29kZS4gSXQgaXMgb2YgbGl0dGxlIHVzZSBvdGhlcndpc2UuIiwKKyAgICAgICAgICAgIE9GRlNFVChyY19taW5fcmF0ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxFfSwKK3siYnVmc2l6ZSIsICJzZXQgcmF0ZWNvbnRyb2wgYnVmZmVyIHNpemUgKGluIGJpdHMpIiwgT0ZGU0VUKHJjX2J1ZmZlcl9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfEV9LAorI2lmIEZGX0FQSV9NUFZfT1BUCit7InJjX2J1Zl9hZ2dyZXNzaXZpdHkiLCAiZGVwcmVjYXRlZCwgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQiLCBPRkZTRVQocmNfYnVmZmVyX2FnZ3Jlc3Npdml0eSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IDEuMCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKKyNlbmRpZgoreyJpX3FmYWN0b3IiLCAiUVAgZmFjdG9yIGJldHdlZW4gUC0gYW5kIEktZnJhbWVzIiwgT0ZGU0VUKGlfcXVhbnRfZmFjdG9yKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gLTAuOCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKK3siaV9xb2Zmc2V0IiwgIlFQIG9mZnNldCBiZXR3ZWVuIFAtIGFuZCBJLWZyYW1lcyIsIE9GRlNFVChpX3F1YW50X29mZnNldCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IDAuMCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKKyNpZiBGRl9BUElfTVBWX09QVAoreyJyY19pbml0X2NwbHgiLCAiZGVwcmVjYXRlZCwgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQiLCBPRkZTRVQocmNfaW5pdGlhbF9jcGx4KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gREVGQVVMVCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKKyNlbmRpZgoreyJkY3QiLCAiRENUIGFsZ29yaXRobSIsIE9GRlNFVChkY3RfYWxnbyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIDAsIElOVF9NQVgsIFZ8RSwgImRjdCJ9LAoreyJhdXRvIiwgImF1dG9zZWxlY3QgYSBnb29kIG9uZSAoZGVmYXVsdCkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9EQ1RfQVVUTyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJkY3QifSwKK3siZmFzdGludCIsICJmYXN0IGludGVnZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9EQ1RfRkFTVElOVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJkY3QifSwKKyNpZiBGRl9BUElfVU5VU0VEX01FTUJFUlMKK3siaW50IiwgImFjY3VyYXRlIGludGVnZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9EQ1RfSU5UIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImRjdCJ9LAorI2VuZGlmIC8qIEZGX0FQSV9VTlVTRURfTUVNQkVSUyAqLworeyJtbXgiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9EQ1RfTU1YIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImRjdCJ9LAoreyJhbHRpdmVjIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfRENUX0FMVElWRUMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiZGN0In0sCit7ImZhYW4iLCAiZmxvYXRpbmcgcG9pbnQgQUFOIERDVCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RDVF9GQUFOIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImRjdCJ9LAoreyJsdW1pX21hc2siLCAiY29tcHJlc3NlcyBicmlnaHQgYXJlYXMgc3Ryb25nZXIgdGhhbiBtZWRpdW0gb25lcyIsIE9GRlNFVChsdW1pX21hc2tpbmcpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAwIH0sIC1GTFRfTUFYLCBGTFRfTUFYLCBWfEV9LAoreyJ0Y3BseF9tYXNrIiwgInRlbXBvcmFsIGNvbXBsZXhpdHkgbWFza2luZyIsIE9GRlNFVCh0ZW1wb3JhbF9jcGx4X21hc2tpbmcpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAwIH0sIC1GTFRfTUFYLCBGTFRfTUFYLCBWfEV9LAoreyJzY3BseF9tYXNrIiwgInNwYXRpYWwgY29tcGxleGl0eSBtYXNraW5nIiwgT0ZGU0VUKHNwYXRpYWxfY3BseF9tYXNraW5nKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKK3sicF9tYXNrIiwgImludGVyIG1hc2tpbmciLCBPRkZTRVQocF9tYXNraW5nKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKK3siZGFya19tYXNrIiwgImNvbXByZXNzZXMgZGFyayBhcmVhcyBzdHJvbmdlciB0aGFuIG1lZGl1bSBvbmVzIiwgT0ZGU0VUKGRhcmtfbWFza2luZyksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IDAgfSwgLUZMVF9NQVgsIEZMVF9NQVgsIFZ8RX0sCit7ImlkY3QiLCAic2VsZWN0IElEQ1QgaW1wbGVtZW50YXRpb24iLCBPRkZTRVQoaWRjdF9hbGdvKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgSU5UX01BWCwgVnxFfEQsICJpZGN0In0sCit7ImF1dG8iLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX0FVVE8gfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJpZGN0In0sCit7ImludCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfSU5UIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAoreyJzaW1wbGUiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX1NJTVBMRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKK3sic2ltcGxlbW14IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSU1QTEVNTVggfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJpZGN0In0sCit7ImFybSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfQVJNIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAoreyJhbHRpdmVjIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9BTFRJVkVDIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAorI2lmIEZGX0FQSV9BUkNIX1NINAoreyJzaDQiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX1NINCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKKyNlbmRpZgoreyJzaW1wbGVhcm0iLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX1NJTVBMRUFSTSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKK3sic2ltcGxlYXJtdjV0ZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfU0lNUExFQVJNVjVURSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKK3sic2ltcGxlYXJtdjYiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX1NJTVBMRUFSTVY2IH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAoreyJzaW1wbGVuZW9uIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSU1QTEVORU9OIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAorI2lmIEZGX0FQSV9BUkNIX0FMUEhBCit7InNpbXBsZWFscGhhIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSU1QTEVBTFBIQSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKKyNlbmRpZgorI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUworeyJpcHAiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX0lQUCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKKyNlbmRpZiAvKiBGRl9BUElfVU5VU0VEX01FTUJFUlMgKi8KK3sieHZpZCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfWFZJRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKK3sieHZpZG1teCIsICJkZXByZWNhdGVkLCBmb3IgY29tcGF0aWJpbGl0eSBvbmx5IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9YVklEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAoreyJmYWFuaSIsICJmbG9hdGluZyBwb2ludCBBQU4gSURDVCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfRkFBTiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfER8RSwgImlkY3QifSwKK3sic2ltcGxlYXV0byIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfU0lNUExFQVVUTyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKK3sic2xpY2VfY291bnQiLCBOVUxMLCBPRkZTRVQoc2xpY2VfY291bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYfSwKK3siZWMiLCAic2V0IGVycm9yIGNvbmNlYWxtZW50IHN0cmF0ZWd5IiwgT0ZGU0VUKGVycm9yX2NvbmNlYWxtZW50KSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gMyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJlYyJ9LAoreyJndWVzc19tdnMiLCAiaXRlcmF0aXZlIG1vdGlvbiB2ZWN0b3IgKE1WKSBzZWFyY2ggKHNsb3cpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfRUNfR1VFU1NfTVZTIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImVjIn0sCit7ImRlYmxvY2siLCAidXNlIHN0cm9uZyBkZWJsb2NrIGZpbHRlciBmb3IgZGFtYWdlZCBNQnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9FQ19ERUJMT0NLIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImVjIn0sCit7ImZhdm9yX2ludGVyIiwgImZhdm9yIHByZWRpY3RpbmcgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9FQ19GQVZPUl9JTlRFUiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJlYyJ9LAoreyJiaXRzX3Blcl9jb2RlZF9zYW1wbGUiLCBOVUxMLCBPRkZTRVQoYml0c19wZXJfY29kZWRfc2FtcGxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCit7InByZWQiLCAicHJlZGljdGlvbiBtZXRob2QiLCBPRkZTRVQocHJlZGljdGlvbl9tZXRob2QpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJwcmVkIn0sCit7ImxlZnQiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9QUkVEX0xFRlQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAicHJlZCJ9LAoreyJwbGFuZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1BSRURfUExBTkUgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAicHJlZCJ9LAoreyJtZWRpYW4iLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9QUkVEX01FRElBTiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJwcmVkIn0sCit7ImFzcGVjdCIsICJzYW1wbGUgYXNwZWN0IHJhdGlvIiwgT0ZGU0VUKHNhbXBsZV9hc3BlY3RfcmF0aW8pLCBBVl9PUFRfVFlQRV9SQVRJT05BTCwgey5kYmwgPSAwfSwgMCwgMTAsIFZ8RX0sCit7ImRlYnVnIiwgInByaW50IHNwZWNpZmljIGRlYnVnIGluZm8iLCBPRkZTRVQoZGVidWcpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSBERUZBVUxUIH0sIDAsIElOVF9NQVgsIFZ8QXxTfEV8RCwgImRlYnVnIn0sCit7InBpY3QiLCAicGljdHVyZSBpbmZvIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfUElDVF9JTkZPIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCit7InJjIiwgInJhdGUgY29udHJvbCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX1JDIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImRlYnVnIn0sCit7ImJpdHN0cmVhbSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX0JJVFNUUkVBTSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1ZyJ9LAoreyJtYl90eXBlIiwgIm1hY3JvYmxvY2sgKE1CKSB0eXBlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfTUJfVFlQRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1ZyJ9LAoreyJxcCIsICJwZXItYmxvY2sgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAoUVApIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfUVAgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiZGVidWcifSwKKyNpZiBGRl9BUElfREVCVUdfTVYKK3sibXYiLCAibW90aW9uIHZlY3RvciIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX01WIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCisjZW5kaWYKK3siZGN0X2NvZWZmIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfRENUX0NPRUZGIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCit7InNraXAiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9ERUJVR19TS0lQIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCit7InN0YXJ0Y29kZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX1NUQVJUQ09ERSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1ZyJ9LAorI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUworeyJwdHMiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9ERUJVR19QVFMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiZGVidWcifSwKKyNlbmRpZiAvKiBGRl9BUElfVU5VU0VEX01FTUJFUlMgKi8KK3siZXIiLCAiZXJyb3IgcmVjb2duaXRpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9ERUJVR19FUiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1ZyJ9LAoreyJtbWNvIiwgIm1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9ucyAoSC4yNjQpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfTU1DTyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1ZyJ9LAoreyJidWdzIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfQlVHUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1ZyJ9LAoreyJ2aXNfcXAiLCAidmlzdWFsaXplIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKFFQKSwgbG93ZXIgUVAgYXJlIHRpbnRlZCBncmVlbmVyIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfVklTX1FQIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCit7InZpc19tYl90eXBlIiwgInZpc3VhbGl6ZSBibG9jayB0eXBlcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX1ZJU19NQl9UWVBFIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCit7ImJ1ZmZlcnMiLCAicGljdHVyZSBidWZmZXIgYWxsb2NhdGlvbnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9ERUJVR19CVUZGRVJTIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCit7InRocmVhZF9vcHMiLCAidGhyZWFkaW5nIG9wZXJhdGlvbnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9ERUJVR19USFJFQURTIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxELCAiZGVidWcifSwKK3sibm9tYyIsICJza2lwIG1vdGlvbiBjb21wZW5zYXRpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9ERUJVR19OT01DIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxELCAiZGVidWcifSwKKyNpZiBGRl9BUElfVklTTVYKK3sidmlzbXYiLCAidmlzdWFsaXplIG1vdGlvbiB2ZWN0b3JzIChNVnMpIChkZXByZWNhdGVkKSIsIE9GRlNFVChkZWJ1Z19tdiksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgSU5UX01BWCwgVnxELCAiZGVidWdfbXYifSwKK3sicGYiLCAiZm9yd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIFAtZnJhbWVzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfVklTX01WX1BfRk9SIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnX212In0sCit7ImJmIiwgImZvcndhcmQgcHJlZGljdGVkIE1WcyBvZiBCLWZyYW1lcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX1ZJU19NVl9CX0ZPUiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1Z19tdiJ9LAoreyJiYiIsICJiYWNrd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIEItZnJhbWVzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfVklTX01WX0JfQkFDSyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1Z19tdiJ9LAorI2VuZGlmCit7ImNtcCIsICJmdWxsLXBlbCBNRSBjb21wYXJlIGZ1bmN0aW9uIiwgT0ZGU0VUKG1lX2NtcCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImNtcF9mdW5jIn0sCit7InN1YmNtcCIsICJzdWItcGVsIE1FIGNvbXBhcmUgZnVuY3Rpb24iLCBPRkZTRVQobWVfc3ViX2NtcCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImNtcF9mdW5jIn0sCit7Im1iY21wIiwgIm1hY3JvYmxvY2sgY29tcGFyZSBmdW5jdGlvbiIsIE9GRlNFVChtYl9jbXApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjbXBfZnVuYyJ9LAoreyJpbGRjdGNtcCIsICJpbnRlcmxhY2VkIERDVCBjb21wYXJlIGZ1bmN0aW9uIiwgT0ZGU0VUKGlsZGN0X2NtcCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBGRl9DTVBfVlNBRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjbXBfZnVuYyJ9LAoreyJkaWFfc2l6ZSIsICJkaWFtb25kIHR5cGUgJiBzaXplIGZvciBtb3Rpb24gZXN0aW1hdGlvbiIsIE9GRlNFVChkaWFfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCit7Imxhc3RfcHJlZCIsICJhbW91bnQgb2YgbW90aW9uIHByZWRpY3RvcnMgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUiLCBPRkZTRVQobGFzdF9wcmVkaWN0b3JfY291bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAoreyJwcmVtZSIsICJwcmUgbW90aW9uIGVzdGltYXRpb24iLCBPRkZTRVQocHJlX21lKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKK3sicHJlY21wIiwgInByZSBtb3Rpb24gZXN0aW1hdGlvbiBjb21wYXJlIGZ1bmN0aW9uIiwgT0ZGU0VUKG1lX3ByZV9jbXApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjbXBfZnVuYyJ9LAoreyJzYWQiLCAic3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzLCBmYXN0IChkZWZhdWx0KSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9TQUQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY21wX2Z1bmMifSwKK3sic3NlIiwgInN1bSBvZiBzcXVhcmVkIGVycm9ycyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9TU0UgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY21wX2Z1bmMifSwKK3sic2F0ZCIsICJzdW0gb2YgYWJzb2x1dGUgSGFkYW1hcmQgdHJhbnNmb3JtZWQgZGlmZmVyZW5jZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DTVBfU0FURCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjbXBfZnVuYyJ9LAoreyJkY3QiLCAic3VtIG9mIGFic29sdXRlIERDVCB0cmFuc2Zvcm1lZCBkaWZmZXJlbmNlcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9EQ1QgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY21wX2Z1bmMifSwKK3sicHNuciIsICJzdW0gb2Ygc3F1YXJlZCBxdWFudGl6YXRpb24gZXJyb3JzIChhdm9pZCwgbG93IHF1YWxpdHkpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ01QX1BTTlIgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY21wX2Z1bmMifSwKK3siYml0IiwgIm51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIGJsb2NrIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ01QX0JJVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjbXBfZnVuYyJ9LAoreyJyZCIsICJyYXRlIGRpc3RvcnRpb24gb3B0aW1hbCwgc2xvdyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9SRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjbXBfZnVuYyJ9LAoreyJ6ZXJvIiwgIjAiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DTVBfWkVSTyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjbXBfZnVuYyJ9LAoreyJ2c2FkIiwgInN1bSBvZiBhYnNvbHV0ZSB2ZXJ0aWNhbCBkaWZmZXJlbmNlcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9WU0FEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImNtcF9mdW5jIn0sCit7InZzc2UiLCAic3VtIG9mIHNxdWFyZWQgdmVydGljYWwgZGlmZmVyZW5jZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DTVBfVlNTRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjbXBfZnVuYyJ9LAoreyJuc3NlIiwgIm5vaXNlIHByZXNlcnZpbmcgc3VtIG9mIHNxdWFyZWQgZGlmZmVyZW5jZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DTVBfTlNTRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjbXBfZnVuYyJ9LAorI2lmIENPTkZJR19TTk9XX0VOQ09ERVIKK3sidzUzIiwgIjUvMyB3YXZlbGV0LCBvbmx5IHVzZWQgaW4gc25vdyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9XNTMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY21wX2Z1bmMifSwKK3sidzk3IiwgIjkvNyB3YXZlbGV0LCBvbmx5IHVzZWQgaW4gc25vdyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9XOTcgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY21wX2Z1bmMifSwKKyNlbmRpZgoreyJkY3RtYXgiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DTVBfRENUTUFYIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImNtcF9mdW5jIn0sCit7ImNocm9tYSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9DSFJPTUEgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY21wX2Z1bmMifSwKK3sicHJlX2RpYV9zaXplIiwgImRpYW1vbmQgdHlwZSAmIHNpemUgZm9yIG1vdGlvbiBlc3RpbWF0aW9uIHByZS1wYXNzIiwgT0ZGU0VUKHByZV9kaWFfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCit7InN1YnEiLCAic3ViLXBlbCBtb3Rpb24gZXN0aW1hdGlvbiBxdWFsaXR5IiwgT0ZGU0VUKG1lX3N1YnBlbF9xdWFsaXR5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDggfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKK3siZHRnX2FjdGl2ZV9mb3JtYXQiLCBOVUxMLCBPRkZTRVQoZHRnX2FjdGl2ZV9mb3JtYXQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYfSwKK3sibWVfcmFuZ2UiLCAibGltaXQgbW90aW9uIHZlY3RvcnMgcmFuZ2UgKDEwMjMgZm9yIERpdlggcGxheWVyKSIsIE9GRlNFVChtZV9yYW5nZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCit7ImliaWFzIiwgImludHJhIHF1YW50IGJpYXMiLCBPRkZTRVQoaW50cmFfcXVhbnRfYmlhcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBGRl9ERUZBVUxUX1FVQU5UX0JJQVMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKK3sicGJpYXMiLCAiaW50ZXIgcXVhbnQgYmlhcyIsIE9GRlNFVChpbnRlcl9xdWFudF9iaWFzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEZGX0RFRkFVTFRfUVVBTlRfQklBUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAoreyJnbG9iYWxfcXVhbGl0eSIsIE5VTEwsIE9GRlNFVChnbG9iYWxfcXVhbGl0eSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxFfSwKK3siY29kZXIiLCBOVUxMLCBPRkZTRVQoY29kZXJfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImNvZGVyIn0sCit7InZsYyIsICJ2YXJpYWJsZSBsZW5ndGggY29kZXIgLyBIdWZmbWFuIGNvZGVyIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09ERVJfVFlQRV9WTEMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY29kZXIifSwKK3siYWMiLCAiYXJpdGhtZXRpYyBjb2RlciIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NPREVSX1RZUEVfQUMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY29kZXIifSwKK3sicmF3IiwgInJhdyAobm8gZW5jb2RpbmcpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09ERVJfVFlQRV9SQVcgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY29kZXIifSwKK3sicmxlIiwgInJ1bi1sZW5ndGggY29kZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DT0RFUl9UWVBFX1JMRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjb2RlciJ9LAorI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUworeyJkZWZsYXRlIiwgImRlZmxhdGUtYmFzZWQgY29kZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DT0RFUl9UWVBFX0RFRkxBVEUgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY29kZXIifSwKKyNlbmRpZiAvKiBGRl9BUElfVU5VU0VEX01FTUJFUlMgKi8KK3siY29udGV4dCIsICJjb250ZXh0IG1vZGVsIiwgT0ZGU0VUKGNvbnRleHRfbW9kZWwpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAoreyJzbGljZV9mbGFncyIsIE5VTEwsIE9GRlNFVChzbGljZV9mbGFncyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAorI2lmIEZGX0FQSV9YVk1DCit7Inh2bWNfYWNjZWxlcmF0aW9uIiwgTlVMTCwgT0ZGU0VUKHh2bWNfYWNjZWxlcmF0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCisjZW5kaWYgLyogRkZfQVBJX1hWTUMgKi8KK3sibWJkIiwgIm1hY3JvYmxvY2sgZGVjaXNpb24gYWxnb3JpdGhtIChoaWdoIHF1YWxpdHkgbW9kZSkiLCBPRkZTRVQobWJfZGVjaXNpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCAwLCAyLCBWfEUsICJtYmQifSwKK3sic2ltcGxlIiwgInVzZSBtYmNtcCAoZGVmYXVsdCkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NQl9ERUNJU0lPTl9TSU1QTEUgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWJkIn0sCit7ImJpdHMiLCAidXNlIGZld2VzdCBiaXRzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfTUJfREVDSVNJT05fQklUUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJtYmQifSwKK3sicmQiLCAidXNlIGJlc3QgcmF0ZSBkaXN0b3J0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfTUJfREVDSVNJT05fUkQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWJkIn0sCit7InN0cmVhbV9jb2RlY190YWciLCBOVUxMLCBPRkZTRVQoc3RyZWFtX2NvZGVjX3RhZyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAoreyJzY190aHJlc2hvbGQiLCAic2NlbmUgY2hhbmdlIHRocmVzaG9sZCIsIE9GRlNFVChzY2VuZWNoYW5nZV90aHJlc2hvbGQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAorI2lmIEZGX0FQSV9NUFZfT1BUCit7ImxtaW4iLCAiZGVwcmVjYXRlZCwgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQiLCBPRkZTRVQobG1pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAgMCB9LCAwLCBJTlRfTUFYLCBWfEV9LAoreyJsbWF4IiwgImRlcHJlY2F0ZWQsIHVzZSBlbmNvZGVyIHByaXZhdGUgb3B0aW9ucyBpbnN0ZWFkIiwgT0ZGU0VUKGxtYXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gIDAgfSwgMCwgSU5UX01BWCwgVnxFfSwKKyNlbmRpZgoreyJuciIsICJub2lzZSByZWR1Y3Rpb24iLCBPRkZTRVQobm9pc2VfcmVkdWN0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKK3sicmNfaW5pdF9vY2N1cGFuY3kiLCAibnVtYmVyIG9mIGJpdHMgd2hpY2ggc2hvdWxkIGJlIGxvYWRlZCBpbnRvIHRoZSByYyBidWZmZXIgYmVmb3JlIGRlY29kaW5nIHN0YXJ0cyIsIE9GRlNFVChyY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3kpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAoreyJmbGFnczIiLCBOVUxMLCBPRkZTRVQoZmxhZ3MyKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gREVGQVVMVH0sIDAsIFVJTlRfTUFYLCBWfEF8RXxELCAiZmxhZ3MyIn0sCisjaWYgRkZfQVBJX0VSUk9SX1JBVEUKK3siZXJyb3IiLCBOVUxMLCBPRkZTRVQoZXJyb3JfcmF0ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCisjZW5kaWYKK3sidGhyZWFkcyIsIE5VTEwsIE9GRlNFVCh0aHJlYWRfY291bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMSB9LCAwLCBJTlRfTUFYLCBWfEF8RXxELCAidGhyZWFkcyJ9LAoreyJhdXRvIiwgImF1dG9kZXRlY3QgYSBzdWl0YWJsZSBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAwIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAidGhyZWFkcyJ9LAorI2lmIEZGX0FQSV9NUFZfT1BUCit7Im1lX3RocmVzaG9sZCIsICJtb3Rpb24gZXN0aW1hdGlvbiB0aHJlc2hvbGQiLCBPRkZTRVQobWVfdGhyZXNob2xkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKK3sibWJfdGhyZXNob2xkIiwgIm1hY3JvYmxvY2sgdGhyZXNob2xkIiwgT0ZGU0VUKG1iX3RocmVzaG9sZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCisjZW5kaWYKK3siZGMiLCAiaW50cmFfZGNfcHJlY2lzaW9uIiwgT0ZGU0VUKGludHJhX2RjX3ByZWNpc2lvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwIH0sIC04LCAxNiwgVnxFfSwKK3sibnNzZXciLCAibnNzZSB3ZWlnaHQiLCBPRkZTRVQobnNzZV93ZWlnaHQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gOCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAoreyJza2lwX3RvcCIsICJudW1iZXIgb2YgbWFjcm9ibG9jayByb3dzIGF0IHRoZSB0b3Agd2hpY2ggYXJlIHNraXBwZWQiLCBPRkZTRVQoc2tpcF90b3ApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfER9LAoreyJza2lwX2JvdHRvbSIsICJudW1iZXIgb2YgbWFjcm9ibG9jayByb3dzIGF0IHRoZSBib3R0b20gd2hpY2ggYXJlIHNraXBwZWQiLCBPRkZTRVQoc2tpcF9ib3R0b20pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfER9LAoreyJwcm9maWxlIiwgTlVMTCwgT0ZGU0VUKHByb2ZpbGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gRkZfUFJPRklMRV9VTktOT1dOIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxFLCAicHJvZmlsZSJ9LAoreyJ1bmtub3duIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUFJPRklMRV9VTktOT1dOIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxFLCAicHJvZmlsZSJ9LAoreyJhYWNfbWFpbiIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1BST0ZJTEVfQUFDX01BSU4gfSwgSU5UX01JTiwgSU5UX01BWCwgQXxFLCAicHJvZmlsZSJ9LAoreyJhYWNfbG93IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUFJPRklMRV9BQUNfTE9XIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8RSwgInByb2ZpbGUifSwKK3siYWFjX3NzciIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1BST0ZJTEVfQUFDX1NTUiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEUsICJwcm9maWxlIn0sCit7ImFhY19sdHAiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9QUk9GSUxFX0FBQ19MVFAgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxFLCAicHJvZmlsZSJ9LAoreyJhYWNfaGUiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9QUk9GSUxFX0FBQ19IRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEUsICJwcm9maWxlIn0sCit7ImFhY19oZV92MiIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1BST0ZJTEVfQUFDX0hFX1YyIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8RSwgInByb2ZpbGUifSwKK3siYWFjX2xkIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUFJPRklMRV9BQUNfTEQgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxFLCAicHJvZmlsZSJ9LAoreyJhYWNfZWxkIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUFJPRklMRV9BQUNfRUxEIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8RSwgInByb2ZpbGUifSwKK3sibXBlZzJfYWFjX2xvdyIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1BST0ZJTEVfTVBFRzJfQUFDX0xPVyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEUsICJwcm9maWxlIn0sCit7Im1wZWcyX2FhY19oZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1BST0ZJTEVfTVBFRzJfQUFDX0hFIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8RSwgInByb2ZpbGUifSwKK3siZHRzIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUFJPRklMRV9EVFMgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxFLCAicHJvZmlsZSJ9LAoreyJkdHNfZXMiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9QUk9GSUxFX0RUU19FUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEUsICJwcm9maWxlIn0sCit7ImR0c185Nl8yNCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1BST0ZJTEVfRFRTXzk2XzI0IH0sIElOVF9NSU4sIElOVF9NQVgsIEF8RSwgInByb2ZpbGUifSwKK3siZHRzX2hkX2hyYSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1BST0ZJTEVfRFRTX0hEX0hSQSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEUsICJwcm9maWxlIn0sCit7ImR0c19oZF9tYSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1BST0ZJTEVfRFRTX0hEX01BIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8RSwgInByb2ZpbGUifSwKK3sibGV2ZWwiLCBOVUxMLCBPRkZTRVQobGV2ZWwpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gRkZfTEVWRUxfVU5LTk9XTiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEF8RSwgImxldmVsIn0sCit7InVua25vd24iLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9MRVZFTF9VTktOT1dOIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxFLCAibGV2ZWwifSwKK3sibG93cmVzIiwgImRlY29kZSBhdCAxPSAxLzIsIDI9MS80LCAzPTEvOCByZXNvbHV0aW9ucyIsIE9GRlNFVChsb3dyZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWfEF8RH0sCit7InNraXBfdGhyZXNob2xkIiwgImZyYW1lIHNraXAgdGhyZXNob2xkIiwgT0ZGU0VUKGZyYW1lX3NraXBfdGhyZXNob2xkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKK3sic2tpcF9mYWN0b3IiLCAiZnJhbWUgc2tpcCBmYWN0b3IiLCBPRkZTRVQoZnJhbWVfc2tpcF9mYWN0b3IpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAoreyJza2lwX2V4cCIsICJmcmFtZSBza2lwIGV4cG9uZW50IiwgT0ZGU0VUKGZyYW1lX3NraXBfZXhwKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKK3sic2tpcGNtcCIsICJmcmFtZSBza2lwIGNvbXBhcmUgZnVuY3Rpb24iLCBPRkZTRVQoZnJhbWVfc2tpcF9jbXApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gRkZfQ01QX0RDVE1BWCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjbXBfZnVuYyJ9LAorI2lmIEZGX0FQSV9NUFZfT1BUCit7ImJvcmRlcl9tYXNrIiwgImRlcHJlY2F0ZWQsIHVzZSBlbmNvZGVyIHByaXZhdGUgb3B0aW9ucyBpbnN0ZWFkIiwgT0ZGU0VUKGJvcmRlcl9tYXNraW5nKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gREVGQVVMVCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKKyNlbmRpZgoreyJtYmxtaW4iLCAibWluaW11bSBtYWNyb2Jsb2NrIExhZ3JhbmdlIGZhY3RvciAoVkJSKSIsIE9GRlNFVChtYl9sbWluKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEZGX1FQMkxBTUJEQSAqIDIgfSwgMSwgRkZfTEFNQkRBX01BWCwgVnxFfSwKK3sibWJsbWF4IiwgIm1heGltdW0gbWFjcm9ibG9jayBMYWdyYW5nZSBmYWN0b3IgKFZCUikiLCBPRkZTRVQobWJfbG1heCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBGRl9RUDJMQU1CREEgKiAzMSB9LCAxLCBGRl9MQU1CREFfTUFYLCBWfEV9LAoreyJtZXBjIiwgIm1vdGlvbiBlc3RpbWF0aW9uIGJpdHJhdGUgcGVuYWx0eSBjb21wZW5zYXRpb24gKDEuMCA9IDI1NikiLCBPRkZTRVQobWVfcGVuYWx0eV9jb21wZW5zYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMjU2IH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCit7InNraXBfbG9vcF9maWx0ZXIiLCAic2tpcCBsb29wIGZpbHRlcmluZyBwcm9jZXNzIGZvciB0aGUgc2VsZWN0ZWQgZnJhbWVzIiwgT0ZGU0VUKHNraXBfbG9vcF9maWx0ZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQVZESVNDQVJEX0RFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYXZkaXNjYXJkIn0sCit7InNraXBfaWRjdCIgICAgICAgLCAic2tpcCBJRENUL2RlcXVhbnRpemF0aW9uIGZvciB0aGUgc2VsZWN0ZWQgZnJhbWVzIiwgICAgT0ZGU0VUKHNraXBfaWRjdCksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQVZESVNDQVJEX0RFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYXZkaXNjYXJkIn0sCit7InNraXBfZnJhbWUiICAgICAgLCAic2tpcCBkZWNvZGluZyBmb3IgdGhlIHNlbGVjdGVkIGZyYW1lcyIsICAgICAgICAgICAgICAgT0ZGU0VUKHNraXBfZnJhbWUpLCAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQVZESVNDQVJEX0RFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYXZkaXNjYXJkIn0sCit7Im5vbmUiICAgICAgICAgICAgLCAiZGlzY2FyZCBubyBmcmFtZSIsICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkRJU0NBUkRfTk9ORSAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJhdmRpc2NhcmQifSwKK3siZGVmYXVsdCIgICAgICAgICAsICJkaXNjYXJkIHVzZWxlc3MgZnJhbWVzIiwgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWRElTQ0FSRF9ERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImF2ZGlzY2FyZCJ9LAoreyJub3JlZiIgICAgICAgICAgICwgImRpc2NhcmQgYWxsIG5vbi1yZWZlcmVuY2UgZnJhbWVzIiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZESVNDQVJEX05PTlJFRiAgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYXZkaXNjYXJkIn0sCit7ImJpZGlyIiAgICAgICAgICAgLCAiZGlzY2FyZCBhbGwgYmlkaXJlY3Rpb25hbCBmcmFtZXMiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkRJU0NBUkRfQklESVIgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJhdmRpc2NhcmQifSwKK3sibm9rZXkiICAgICAgICAgICAsICJkaXNjYXJkIGFsbCBmcmFtZXMgZXhjZXB0IGtleWZyYW1lcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWRElTQ0FSRF9OT05LRVkgIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImF2ZGlzY2FyZCJ9LAoreyJub2ludHJhIiAgICAgICAgICwgImRpc2NhcmQgYWxsIGZyYW1lcyBleGNlcHQgSSBmcmFtZXMiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZESVNDQVJEX05PTklOVFJBfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYXZkaXNjYXJkIn0sCit7ImFsbCIgICAgICAgICAgICAgLCAiZGlzY2FyZCBhbGwgZnJhbWVzIiwgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkRJU0NBUkRfQUxMICAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJhdmRpc2NhcmQifSwKK3siYmlkaXJfcmVmaW5lIiwgInJlZmluZSB0aGUgdHdvIG1vdGlvbiB2ZWN0b3JzIHVzZWQgaW4gYmlkaXJlY3Rpb25hbCBtYWNyb2Jsb2NrcyIsIE9GRlNFVChiaWRpcl9yZWZpbmUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMSB9LCAwLCA0LCBWfEV9LAoreyJicmRfc2NhbGUiLCAiZG93bnNjYWxlIGZyYW1lcyBmb3IgZHluYW1pYyBCLWZyYW1lIGRlY2lzaW9uIiwgT0ZGU0VUKGJyZF9zY2FsZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIDAsIDEwLCBWfEV9LAoreyJrZXlpbnRfbWluIiwgIm1pbmltdW0gaW50ZXJ2YWwgYmV0d2VlbiBJRFItZnJhbWVzIiwgT0ZGU0VUKGtleWludF9taW4pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMjUgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKK3sicmVmcyIsICJyZWZlcmVuY2UgZnJhbWVzIHRvIGNvbnNpZGVyIGZvciBtb3Rpb24gY29tcGVuc2F0aW9uIiwgT0ZGU0VUKHJlZnMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAoreyJjaHJvbWFvZmZzZXQiLCAiY2hyb21hIFFQIG9mZnNldCBmcm9tIGx1bWEiLCBPRkZTRVQoY2hyb21hb2Zmc2V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKK3sidHJlbGxpcyIsICJyYXRlLWRpc3RvcnRpb24gb3B0aW1hbCBxdWFudGl6YXRpb24iLCBPRkZTRVQodHJlbGxpcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxFfSwKKyNpZiBGRl9BUElfVU5VU0VEX01FTUJFUlMKK3sic2NfZmFjdG9yIiwgIm11bHRpcGxpZWQgYnkgcXNjYWxlIGZvciBlYWNoIGZyYW1lIGFuZCBhZGRlZCB0byBzY2VuZV9jaGFuZ2Vfc2NvcmUiLCBPRkZTRVQoc2NlbmVjaGFuZ2VfZmFjdG9yKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDYgfSwgMCwgSU5UX01BWCwgVnxFfSwKKyNlbmRpZiAvKiBGRl9BUElfVU5VU0VEX01FTUJFUlMgKi8KK3sibXYwX3RocmVzaG9sZCIsIE5VTEwsIE9GRlNFVChtdjBfdGhyZXNob2xkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDI1NiB9LCAwLCBJTlRfTUFYLCBWfEV9LAoreyJiX3NlbnNpdGl2aXR5IiwgImFkanVzdCBzZW5zaXRpdml0eSBvZiBiX2ZyYW1lX3N0cmF0ZWd5IDEiLCBPRkZTRVQoYl9zZW5zaXRpdml0eSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA0MCB9LCAxLCBJTlRfTUFYLCBWfEV9LAoreyJjb21wcmVzc2lvbl9sZXZlbCIsIE5VTEwsIE9GRlNFVChjb21wcmVzc2lvbl9sZXZlbCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBGRl9DT01QUkVTU0lPTl9ERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxFfSwKK3sibWluX3ByZWRpY3Rpb25fb3JkZXIiLCBOVUxMLCBPRkZTRVQobWluX3ByZWRpY3Rpb25fb3JkZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTEgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxFfSwKK3sibWF4X3ByZWRpY3Rpb25fb3JkZXIiLCBOVUxMLCBPRkZTRVQobWF4X3ByZWRpY3Rpb25fb3JkZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTEgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxFfSwKK3sidGltZWNvZGVfZnJhbWVfc3RhcnQiLCAiR09QIHRpbWVjb2RlIGZyYW1lIHN0YXJ0IG51bWJlciwgaW4gbm9uLWRyb3AtZnJhbWUgZm9ybWF0IiwgT0ZGU0VUKHRpbWVjb2RlX2ZyYW1lX3N0YXJ0KSwgQVZfT1BUX1RZUEVfSU5UNjQsIHsuaTY0ID0gLTEgfSwgLTEsIElOVDY0X01BWCwgVnxFfSwKKyNpZiBGRl9BUElfUkVRVUVTVF9DSEFOTkVMUworeyJyZXF1ZXN0X2NoYW5uZWxzIiwgInNldCBkZXNpcmVkIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyIsIE9GRlNFVChyZXF1ZXN0X2NoYW5uZWxzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgSU5UX01BWCwgQXxEfSwKKyNlbmRpZgoreyJiaXRzX3Blcl9yYXdfc2FtcGxlIiwgTlVMTCwgT0ZGU0VUKGJpdHNfcGVyX3Jhd19zYW1wbGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYfSwKK3siY2hhbm5lbF9sYXlvdXQiLCBOVUxMLCBPRkZTRVQoY2hhbm5lbF9sYXlvdXQpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSBERUZBVUxUIH0sIDAsIElOVDY0X01BWCwgQXxFfEQsICJjaGFubmVsX2xheW91dCJ9LAoreyJyZXF1ZXN0X2NoYW5uZWxfbGF5b3V0IiwgTlVMTCwgT0ZGU0VUKHJlcXVlc3RfY2hhbm5lbF9sYXlvdXQpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSBERUZBVUxUIH0sIDAsIElOVDY0X01BWCwgQXxELCAicmVxdWVzdF9jaGFubmVsX2xheW91dCJ9LAoreyJyY19tYXhfdmJ2X3VzZSIsIE5VTEwsIE9GRlNFVChyY19tYXhfYXZhaWxhYmxlX3Zidl91c2UpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAwIH0sIDAuMCwgRkxUX01BWCwgVnxFfSwKK3sicmNfbWluX3Zidl91c2UiLCBOVUxMLCBPRkZTRVQocmNfbWluX3Zidl9vdmVyZmxvd191c2UpLCAgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMyB9LCAgICAgMC4wLCBGTFRfTUFYLCBWfEV9LAoreyJ0aWNrc19wZXJfZnJhbWUiLCBOVUxMLCBPRkZTRVQodGlja3NfcGVyX2ZyYW1lKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDEgfSwgMSwgSU5UX01BWCwgQXxWfEV8RH0sCit7ImNvbG9yX3ByaW1hcmllcyIsICJjb2xvciBwcmltYXJpZXMiLCBPRkZTRVQoY29sb3JfcHJpbWFyaWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFWQ09MX1BSSV9VTlNQRUNJRklFRCB9LCAxLCBBVkNPTF9QUklfTkItMSwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAoreyJidDcwOSIsICAgICAgICJCVC43MDkiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9CVDcwOSB9LCAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3ByaW1hcmllc190eXBlIn0sCit7InVuc3BlY2lmaWVkIiwgIlVuc3BlY2lmaWVkIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcHJpbWFyaWVzX3R5cGUifSwKK3siYnQ0NzBtIiwgICAgICAiQlQuNDcwIE0iLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9QUklfQlQ0NzBNIH0sICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAoreyJidDQ3MGJnIiwgICAgICJCVC40NzAgQkciLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9CVDQ3MEJHIH0sICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3ByaW1hcmllc190eXBlIn0sCit7InNtcHRlMTcwbSIsICAgIlNNUFRFIDE3MCBNIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfUFJJX1NNUFRFMTcwTSB9LCAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcHJpbWFyaWVzX3R5cGUifSwKK3sic21wdGUyNDBtIiwgICAiU01QVEUgMjQwIE0iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9QUklfU01QVEUyNDBNIH0sICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAoreyJmaWxtIiwgICAgICAgICJGaWxtIiwgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9GSUxNIH0sICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3ByaW1hcmllc190eXBlIn0sCit7ImJ0MjAyMCIsICAgICAgIkJULjIwMjAiLCAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfUFJJX0JUMjAyMCB9LCAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcHJpbWFyaWVzX3R5cGUifSwKK3siY29sb3JfdHJjIiwgImNvbG9yIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcyIsIE9GRlNFVChjb2xvcl90cmMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEIH0sIDEsIEFWQ09MX1RSQ19OQi0xLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImJ0NzA5IiwgICAgICAgICJCVC43MDkiLCAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0JUNzA5IH0sICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7InVuc3BlY2lmaWVkIiwgICJVbnNwZWNpZmllZCIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEIH0sICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImdhbW1hMjIiLCAgICAgICJCVC40NzAgTSIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0dBTU1BMjIgfSwgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImdhbW1hMjgiLCAgICAgICJCVC40NzAgQkciLCAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0dBTU1BMjggfSwgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7InNtcHRlMTcwbSIsICAgICJTTVBURSAxNzAgTSIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX1NNUFRFMTcwTSB9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7InNtcHRlMjQwbSIsICAgICJTTVBURSAyNDAgTSIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX1NNUFRFMjQwTSB9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImxpbmVhciIsICAgICAgICJMaW5lYXIiLCAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0xJTkVBUiB9LCAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImxvZyIsICAgICAgICAgICJMb2ciLCAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0xPRyB9LCAgICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImxvZ19zcXJ0IiwgICAgICJMb2cgc3F1YXJlIHJvb3QiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0xPR19TUVJUIH0sICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImllYzYxOTY2XzJfNCIsICJJRUMgNjE5NjYtMi00IiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0lFQzYxOTY2XzJfNCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImJ0MTM2MSIsICAgICAgICJCVC4xMzYxIiwgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0JUMTM2MV9FQ0cgfSwgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImllYzYxOTY2XzJfMSIsICJJRUMgNjE5NjYtMi0xIiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0lFQzYxOTY2XzJfMSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImJ0MjAyMF8xMGJpdCIsICJCVC4yMDIwIC0gMTAgYml0IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0JUMjAyMF8xMCB9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImJ0MjAyMF8xMmJpdCIsICJCVC4yMDIwIC0gMTIgYml0IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0JUMjAyMF8xMiB9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImNvbG9yc3BhY2UiLCAiY29sb3Igc3BhY2UiLCBPRkZTRVQoY29sb3JzcGFjZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQgfSwgMCwgQVZDT0xfU1BDX05CLTEsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7InJnYiIsICAgICAgICAgIlJHQiIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfU1BDX1JHQiB9LCAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7ImJ0NzA5IiwgICAgICAgIkJULjcwOSIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfU1BDX0JUNzA5IH0sICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7InVuc3BlY2lmaWVkIiwgIlVuc3BlY2lmaWVkIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7ImZjYyIsICAgICAgICAgIkZDQyIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfU1BDX0ZDQyB9LCAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7ImJ0NDcwYmciLCAgICAgIkJULjQ3MCBCRyIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfU1BDX0JUNDcwQkcgfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7InNtcHRlMTcwbSIsICAgIlNNUFRFIDE3MCBNIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfU1BDX1NNUFRFMTcwTSB9LCAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7InNtcHRlMjQwbSIsICAgIlNNUFRFIDI0MCBNIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfU1BDX1NNUFRFMjQwTSB9LCAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7Inljb2NnIiwgICAgICAgIllDT0NHIiwgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfU1BDX1lDT0NHIH0sICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7ImJ0MjAyMF9uY2wiLCAgIkJULjIwMjAgTkNMIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfU1BDX0JUMjAyMF9OQ0wgfSwgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7ImJ0MjAyMF9jbCIsICAgIkJULjIwMjAgQ0wiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfU1BDX0JUMjAyMF9DTCB9LCAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7ImNvbG9yX3JhbmdlIiwgImNvbG9yIHJhbmdlIiwgT0ZGU0VUKGNvbG9yX3JhbmdlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEIH0sIDAsIEFWQ09MX1JBTkdFX05CLTEsIFZ8RXxELCAiY29sb3JfcmFuZ2VfdHlwZSJ9LAoreyJ1bnNwZWNpZmllZCIsICJVbnNwZWNpZmllZCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcmFuZ2VfdHlwZSJ9LAoreyJtcGVnIiwgIk1QRUcgKDIxOSoyXihuLTgpKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX01QRUcgfSwgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcmFuZ2VfdHlwZSJ9LAoreyJqcGVnIiwgIkpQRUcgKDJebi0xKSIsICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX0pQRUcgfSwgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcmFuZ2VfdHlwZSJ9LAoreyJjaHJvbWFfc2FtcGxlX2xvY2F0aW9uIiwgImNocm9tYSBzYW1wbGUgbG9jYXRpb24iLCBPRkZTRVQoY2hyb21hX3NhbXBsZV9sb2NhdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBVkNIUk9NQV9MT0NfVU5TUEVDSUZJRUQgfSwgMCwgQVZDSFJPTUFfTE9DX05CLTEsIFZ8RXxELCAiY2hyb21hX3NhbXBsZV9sb2NhdGlvbl90eXBlIn0sCit7InVuc3BlY2lmaWVkIiwgIlVuc3BlY2lmaWVkIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY2hyb21hX3NhbXBsZV9sb2NhdGlvbl90eXBlIn0sCit7ImxlZnQiLCAgICAgICAgIkxlZnQiLCAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDSFJPTUFfTE9DX0xFRlQgfSwgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY2hyb21hX3NhbXBsZV9sb2NhdGlvbl90eXBlIn0sCit7ImNlbnRlciIsICAgICAgIkNlbnRlciIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDSFJPTUFfTE9DX0NFTlRFUiB9LCAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY2hyb21hX3NhbXBsZV9sb2NhdGlvbl90eXBlIn0sCit7InRvcGxlZnQiLCAgICAgIlRvcC1sZWZ0IiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDSFJPTUFfTE9DX1RPUExFRlQgfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY2hyb21hX3NhbXBsZV9sb2NhdGlvbl90eXBlIn0sCit7InRvcCIsICAgICAgICAgIlRvcCIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDSFJPTUFfTE9DX1RPUCB9LCAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY2hyb21hX3NhbXBsZV9sb2NhdGlvbl90eXBlIn0sCit7ImJvdHRvbWxlZnQiLCAgIkJvdHRvbS1sZWZ0IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDSFJPTUFfTE9DX0JPVFRPTUxFRlQgfSwgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY2hyb21hX3NhbXBsZV9sb2NhdGlvbl90eXBlIn0sCit7ImJvdHRvbSIsICAgICAgIkJvdHRvbSIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDSFJPTUFfTE9DX0JPVFRPTSB9LCAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY2hyb21hX3NhbXBsZV9sb2NhdGlvbl90eXBlIn0sCit7ImxvZ19sZXZlbF9vZmZzZXQiLCAic2V0IHRoZSBsb2cgbGV2ZWwgb2Zmc2V0IiwgT0ZGU0VUKGxvZ19sZXZlbF9vZmZzZXQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCBJTlRfTUlOLCBJTlRfTUFYIH0sCit7InNsaWNlcyIsICJudW1iZXIgb2Ygc2xpY2VzLCB1c2VkIGluIHBhcmFsbGVsaXplZCBlbmNvZGluZyIsIE9GRlNFVChzbGljZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWfEV9LAoreyJ0aHJlYWRfdHlwZSIsICJzZWxlY3QgbXVsdGl0aHJlYWRpbmcgdHlwZSIsIE9GRlNFVCh0aHJlYWRfdHlwZSksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IEZGX1RIUkVBRF9TTElDRXxGRl9USFJFQURfRlJBTUUgfSwgMCwgSU5UX01BWCwgVnxBfEV8RCwgInRocmVhZF90eXBlIn0sCit7InNsaWNlIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfVEhSRUFEX1NMSUNFIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAidGhyZWFkX3R5cGUifSwKK3siZnJhbWUiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9USFJFQURfRlJBTUUgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJ0aHJlYWRfdHlwZSJ9LAoreyJhdWRpb19zZXJ2aWNlX3R5cGUiLCAiYXVkaW8gc2VydmljZSB0eXBlIiwgT0ZGU0VUKGF1ZGlvX3NlcnZpY2VfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBVl9BVURJT19TRVJWSUNFX1RZUEVfTUFJTiB9LCAwLCBBVl9BVURJT19TRVJWSUNFX1RZUEVfTkItMSwgQXxFLCAiYXVkaW9fc2VydmljZV90eXBlIn0sCit7Im1hIiwgIk1haW4gQXVkaW8gU2VydmljZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9NQUlOIH0sICAgICAgICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBBfEUsICJhdWRpb19zZXJ2aWNlX3R5cGUifSwKK3siZWYiLCAiRWZmZWN0cyIsICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfQVVESU9fU0VSVklDRV9UWVBFX0VGRkVDVFMgfSwgICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEF8RSwgImF1ZGlvX3NlcnZpY2VfdHlwZSJ9LAoreyJ2aSIsICJWaXN1YWxseSBJbXBhaXJlZCIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9BVURJT19TRVJWSUNFX1RZUEVfVklTVUFMTFlfSU1QQUlSRUQgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxFLCAiYXVkaW9fc2VydmljZV90eXBlIn0sCit7ImhpIiwgIkhlYXJpbmcgSW1wYWlyZWQiLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9IRUFSSU5HX0lNUEFJUkVEIH0sICBJTlRfTUlOLCBJTlRfTUFYLCBBfEUsICJhdWRpb19zZXJ2aWNlX3R5cGUifSwKK3siZGkiLCAiRGlhbG9ndWUiLCAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfQVVESU9fU0VSVklDRV9UWVBFX0RJQUxPR1VFIH0sICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEF8RSwgImF1ZGlvX3NlcnZpY2VfdHlwZSJ9LAoreyJjbyIsICJDb21tZW50YXJ5IiwgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9BVURJT19TRVJWSUNFX1RZUEVfQ09NTUVOVEFSWSB9LCAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgQXxFLCAiYXVkaW9fc2VydmljZV90eXBlIn0sCit7ImVtIiwgIkVtZXJnZW5jeSIsICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9FTUVSR0VOQ1kgfSwgICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBBfEUsICJhdWRpb19zZXJ2aWNlX3R5cGUifSwKK3sidm8iLCAiVm9pY2UgT3ZlciIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfQVVESU9fU0VSVklDRV9UWVBFX1ZPSUNFX09WRVIgfSwgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEF8RSwgImF1ZGlvX3NlcnZpY2VfdHlwZSJ9LAoreyJrYSIsICJLYXJhb2tlIiwgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9BVURJT19TRVJWSUNFX1RZUEVfS0FSQU9LRSB9LCAgICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgQXxFLCAiYXVkaW9fc2VydmljZV90eXBlIn0sCit7InJlcXVlc3Rfc2FtcGxlX2ZtdCIsICJzYW1wbGUgZm9ybWF0IGF1ZGlvIGRlY29kZXJzIHNob3VsZCBwcmVmZXIiLCBPRkZTRVQocmVxdWVzdF9zYW1wbGVfZm10KSwgQVZfT1BUX1RZUEVfU0FNUExFX0ZNVCwgey5pNjQ9QVZfU0FNUExFX0ZNVF9OT05FfSwgLTEsIElOVF9NQVgsIEF8RCwgInJlcXVlc3Rfc2FtcGxlX2ZtdCJ9LAoreyJwa3RfdGltZWJhc2UiLCBOVUxMLCBPRkZTRVQocGt0X3RpbWViYXNlKSwgQVZfT1BUX1RZUEVfUkFUSU9OQUwsIHsuZGJsID0gMCB9LCAwLCBJTlRfTUFYLCAwfSwKK3sic3ViX2NoYXJlbmMiLCAic2V0IGlucHV0IHRleHQgc3VidGl0bGVzIGNoYXJhY3RlciBlbmNvZGluZyIsIE9GRlNFVChzdWJfY2hhcmVuYyksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBTfER9LAoreyJzdWJfY2hhcmVuY19tb2RlIiwgInNldCBpbnB1dCB0ZXh0IHN1YnRpdGxlcyBjaGFyYWN0ZXIgZW5jb2RpbmcgbW9kZSIsIE9GRlNFVChzdWJfY2hhcmVuY19tb2RlKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gRkZfU1VCX0NIQVJFTkNfTU9ERV9BVVRPTUFUSUN9LCAtMSwgSU5UX01BWCwgU3xELCAic3ViX2NoYXJlbmNfbW9kZSJ9LAoreyJkb19ub3RoaW5nIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1NVQl9DSEFSRU5DX01PREVfRE9fTk9USElOR30sICBJTlRfTUlOLCBJTlRfTUFYLCBTfEQsICJzdWJfY2hhcmVuY19tb2RlIn0sCit7ImF1dG8iLCAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfU1VCX0NIQVJFTkNfTU9ERV9BVVRPTUFUSUN9LCAgIElOVF9NSU4sIElOVF9NQVgsIFN8RCwgInN1Yl9jaGFyZW5jX21vZGUifSwKK3sicHJlX2RlY29kZXIiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9TVUJfQ0hBUkVOQ19NT0RFX1BSRV9ERUNPREVSfSwgSU5UX01JTiwgSU5UX01BWCwgU3xELCAic3ViX2NoYXJlbmNfbW9kZSJ9LAoreyJyZWZjb3VudGVkX2ZyYW1lcyIsIE5VTEwsIE9GRlNFVChyZWZjb3VudGVkX2ZyYW1lcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMSwgQXxWfEQgfSwKK3sic2lkZV9kYXRhX29ubHlfcGFja2V0cyIsIE5VTEwsIE9GRlNFVChzaWRlX2RhdGFfb25seV9wYWNrZXRzKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEF8VnxFIH0sCit7InNraXBfYWxwaGEiLCAiU2tpcCBwcm9jZXNzaW5nIGFscGhhIiwgT0ZGU0VUKHNraXBfYWxwaGEpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAwLCAxLCBWfEQgfSwKK3siZmllbGRfb3JkZXIiLCAiRmllbGQgb3JkZXIiLCBPRkZTRVQoZmllbGRfb3JkZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQVZfRklFTERfVU5LTk9XTiB9LCAwLCA1LCBWfER8RSwgImZpZWxkX29yZGVyIiB9LAoreyJwcm9ncmVzc2l2ZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0ZJRUxEX1BST0dSRVNTSVZFIH0sIDAsIDAsIFZ8RHxFLCAiZmllbGRfb3JkZXIiIH0sCit7InR0IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfRklFTERfVFQgfSwgMCwgMCwgVnxEfEUsICJmaWVsZF9vcmRlciIgfSwKK3siYmIiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9GSUVMRF9CQiB9LCAwLCAwLCBWfER8RSwgImZpZWxkX29yZGVyIiB9LAoreyJ0YiIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0ZJRUxEX1RCIH0sIDAsIDAsIFZ8RHxFLCAiZmllbGRfb3JkZXIiIH0sCit7ImJ0IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfRklFTERfQlQgfSwgMCwgMCwgVnxEfEUsICJmaWVsZF9vcmRlciIgfSwKK3siZHVtcF9zZXBhcmF0b3IiLCAic2V0IGluZm9ybWF0aW9uIGR1bXAgZmllbGQgc2VwYXJhdG9yIiwgT0ZGU0VUKGR1bXBfc2VwYXJhdG9yKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEF8VnxTfER8RX0sCit7ImNvZGVjX3doaXRlbGlzdCIsICJMaXN0IG9mIGRlY29kZXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCIsIE9GRlNFVChjb2RlY193aGl0ZWxpc3QpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgIENIQVJfTUlOLCBDSEFSX01BWCwgQXxWfFN8RCB9LAoreyJwaXhlbF9mb3JtYXQiLCAic2V0IHBpeGVsIGZvcm1hdCIsIE9GRlNFVChwaXhfZm10KSwgQVZfT1BUX1RZUEVfUElYRUxfRk1ULCB7Lmk2ND1BVl9QSVhfRk1UX05PTkV9LCAtMSwgSU5UX01BWCwgMCB9LAoreyJ2aWRlb19zaXplIiwgInNldCB2aWRlbyBzaXplIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHI9TlVMTH0sIDAsIElOVF9NQVgsIDAgfSwKK3tOVUxMfSwKK307CisKKyN1bmRlZiBBCisjdW5kZWYgVgorI3VuZGVmIFMKKyN1bmRlZiBFCisjdW5kZWYgRAorI3VuZGVmIERFRkFVTFQKKyN1bmRlZiBPRkZTRVQKKworI2VuZGlmIC8qIEFWQ09ERUNfT1BUSU9OU19UQUJMRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9vcHVzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9vcHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzZDNjMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL29wdXMuYwpAQCAtMCwwICsxLDQyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBBbmRyZXcgRCdBZGRlc2lvCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBNb3ppbGxhIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE9wdXMgZGVjb2Rlci9wYXJzZXIgc2hhcmVkIGNvZGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXJyb3IuaCIKKworI2luY2x1ZGUgIm9wdXMuaCIKKyNpbmNsdWRlICJ2b3JiaXMuaCIKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG9wdXNfZnJhbWVfZHVyYXRpb25bMzJdID0geworICAgIDQ4MCwgOTYwLCAxOTIwLCAyODgwLAorICAgIDQ4MCwgOTYwLCAxOTIwLCAyODgwLAorICAgIDQ4MCwgOTYwLCAxOTIwLCAyODgwLAorICAgIDQ4MCwgOTYwLAorICAgIDQ4MCwgOTYwLAorICAgIDEyMCwgMjQwLCAgNDgwLCAgOTYwLAorICAgIDEyMCwgMjQwLCAgNDgwLCAgOTYwLAorICAgIDEyMCwgMjQwLCAgNDgwLCAgOTYwLAorICAgIDEyMCwgMjQwLCAgNDgwLCAgOTYwLAorfTsKKworLyoqCisgKiBSZWFkIGEgMS0gb3IgMi1ieXRlIGZyYW1lIGxlbmd0aAorICovCitzdGF0aWMgaW5saW5lIGludCB4aXBoX2xhY2luZ18xNmJpdChjb25zdCB1aW50OF90ICoqcHRyLCBjb25zdCB1aW50OF90ICplbmQpCit7CisgICAgaW50IHZhbDsKKworICAgIGlmICgqcHRyID49IGVuZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgdmFsID0gKigqcHRyKSsrOworICAgIGlmICh2YWwgPj0gMjUyKSB7CisgICAgICAgIGlmICgqcHRyID49IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB2YWwgKz0gNCAqICooKnB0cikrKzsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworLyoqCisgKiBSZWFkIGEgbXVsdGktYnl0ZSBsZW5ndGggKHVzZWQgZm9yIGNvZGUgMyBwYWNrZXQgcGFkZGluZyBzaXplKQorICovCitzdGF0aWMgaW5saW5lIGludCB4aXBoX2xhY2luZ19mdWxsKGNvbnN0IHVpbnQ4X3QgKipwdHIsIGNvbnN0IHVpbnQ4X3QgKmVuZCkKK3sKKyAgICBpbnQgdmFsID0gMDsKKyAgICBpbnQgbmV4dDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICgqcHRyID49IGVuZCB8fCB2YWwgPiBJTlRfTUFYIC0gMjU0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIG5leHQgPSAqKCpwdHIpKys7CisgICAgICAgIHZhbCArPSBuZXh0OworICAgICAgICBpZiAobmV4dCA8IDI1NSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWwtLTsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworLyoqCisgKiBQYXJzZSBPcHVzIHBhY2tldCBpbmZvIGZyb20gcmF3IHBhY2tldCBkYXRhCisgKi8KK2ludCBmZl9vcHVzX3BhcnNlX3BhY2tldChPcHVzUGFja2V0ICpwa3QsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWxmX2RlbGltaXRpbmcpCit7CisgICAgY29uc3QgdWludDhfdCAqcHRyID0gYnVmOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IGJ1ZiArIGJ1Zl9zaXplOworICAgIGludCBwYWRkaW5nID0gMDsKKyAgICBpbnQgZnJhbWVfYnl0ZXMsIGk7CisKKyAgICBpZiAoYnVmX3NpemUgPCAxKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiBUT0MgYnl0ZSAqLworICAgIGkgPSAqcHRyKys7CisgICAgcGt0LT5jb2RlICAgPSAoaSAgICAgKSAmIDB4MzsKKyAgICBwa3QtPnN0ZXJlbyA9IChpID4+IDIpICYgMHgxOworICAgIHBrdC0+Y29uZmlnID0gKGkgPj4gMykgJiAweDFGOworCisgICAgLyogY29kZSAyIGFuZCBjb2RlIDMgcGFja2V0cyBoYXZlIGF0IGxlYXN0IDEgYnl0ZSBhZnRlciB0aGUgVE9DICovCisgICAgaWYgKHBrdC0+Y29kZSA+PSAyICYmIGJ1Zl9zaXplIDwgMikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgc3dpdGNoIChwa3QtPmNvZGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIC8qIDEgZnJhbWUgKi8KKyAgICAgICAgcGt0LT5mcmFtZV9jb3VudCA9IDE7CisgICAgICAgIHBrdC0+dmJyICAgICAgICAgPSAwOworCisgICAgICAgIGlmIChzZWxmX2RlbGltaXRpbmcpIHsKKyAgICAgICAgICAgIGludCBsZW4gPSB4aXBoX2xhY2luZ18xNmJpdCgmcHRyLCBlbmQpOworICAgICAgICAgICAgaWYgKGxlbiA8IDAgfHwgbGVuID4gZW5kIC0gcHRyKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGVuZCAgICAgID0gcHRyICsgbGVuOworICAgICAgICAgICAgYnVmX3NpemUgPSBlbmQgLSBidWY7CisgICAgICAgIH0KKworICAgICAgICBmcmFtZV9ieXRlcyA9IGVuZCAtIHB0cjsKKyAgICAgICAgaWYgKGZyYW1lX2J5dGVzID4gTUFYX0ZSQU1FX1NJWkUpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHBrdC0+ZnJhbWVfb2Zmc2V0WzBdID0gcHRyIC0gYnVmOworICAgICAgICBwa3QtPmZyYW1lX3NpemVbMF0gICA9IGZyYW1lX2J5dGVzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIC8qIDIgZnJhbWVzLCBlcXVhbCBzaXplICovCisgICAgICAgIHBrdC0+ZnJhbWVfY291bnQgPSAyOworICAgICAgICBwa3QtPnZiciAgICAgICAgID0gMDsKKworICAgICAgICBpZiAoc2VsZl9kZWxpbWl0aW5nKSB7CisgICAgICAgICAgICBpbnQgbGVuID0geGlwaF9sYWNpbmdfMTZiaXQoJnB0ciwgZW5kKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCAwIHx8IDIgKiBsZW4gPiBlbmQgLSBwdHIpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgZW5kICAgICAgPSBwdHIgKyAyICogbGVuOworICAgICAgICAgICAgYnVmX3NpemUgPSBlbmQgLSBidWY7CisgICAgICAgIH0KKworICAgICAgICBmcmFtZV9ieXRlcyA9IGVuZCAtIHB0cjsKKyAgICAgICAgaWYgKGZyYW1lX2J5dGVzICYgMSB8fCBmcmFtZV9ieXRlcyA+PiAxID4gTUFYX0ZSQU1FX1NJWkUpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHBrdC0+ZnJhbWVfb2Zmc2V0WzBdID0gcHRyIC0gYnVmOworICAgICAgICBwa3QtPmZyYW1lX3NpemVbMF0gICA9IGZyYW1lX2J5dGVzID4+IDE7CisgICAgICAgIHBrdC0+ZnJhbWVfb2Zmc2V0WzFdID0gcGt0LT5mcmFtZV9vZmZzZXRbMF0gKyBwa3QtPmZyYW1lX3NpemVbMF07CisgICAgICAgIHBrdC0+ZnJhbWVfc2l6ZVsxXSAgID0gZnJhbWVfYnl0ZXMgPj4gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICAvKiAyIGZyYW1lcywgZGlmZmVyZW50IHNpemVzICovCisgICAgICAgIHBrdC0+ZnJhbWVfY291bnQgPSAyOworICAgICAgICBwa3QtPnZiciAgICAgICAgID0gMTsKKworICAgICAgICAvKiByZWFkIDFzdCBmcmFtZSBzaXplICovCisgICAgICAgIGZyYW1lX2J5dGVzID0geGlwaF9sYWNpbmdfMTZiaXQoJnB0ciwgZW5kKTsKKyAgICAgICAgaWYgKGZyYW1lX2J5dGVzIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBpZiAoc2VsZl9kZWxpbWl0aW5nKSB7CisgICAgICAgICAgICBpbnQgbGVuID0geGlwaF9sYWNpbmdfMTZiaXQoJnB0ciwgZW5kKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCAwIHx8IGxlbiArIGZyYW1lX2J5dGVzID4gZW5kIC0gcHRyKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGVuZCAgICAgID0gcHRyICsgZnJhbWVfYnl0ZXMgKyBsZW47CisgICAgICAgICAgICBidWZfc2l6ZSA9IGVuZCAtIGJ1ZjsKKyAgICAgICAgfQorCisgICAgICAgIHBrdC0+ZnJhbWVfb2Zmc2V0WzBdID0gcHRyIC0gYnVmOworICAgICAgICBwa3QtPmZyYW1lX3NpemVbMF0gICA9IGZyYW1lX2J5dGVzOworCisgICAgICAgIC8qIGNhbGN1bGF0ZSAybmQgZnJhbWUgc2l6ZSAqLworICAgICAgICBmcmFtZV9ieXRlcyA9IGVuZCAtIHB0ciAtIHBrdC0+ZnJhbWVfc2l6ZVswXTsKKyAgICAgICAgaWYgKGZyYW1lX2J5dGVzIDwgMCB8fCBmcmFtZV9ieXRlcyA+IE1BWF9GUkFNRV9TSVpFKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBwa3QtPmZyYW1lX29mZnNldFsxXSA9IHBrdC0+ZnJhbWVfb2Zmc2V0WzBdICsgcGt0LT5mcmFtZV9zaXplWzBdOworICAgICAgICBwa3QtPmZyYW1lX3NpemVbMV0gICA9IGZyYW1lX2J5dGVzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIC8qIDEgdG8gNDggZnJhbWVzLCBjYW4gYmUgZGlmZmVyZW50IHNpemVzICovCisgICAgICAgIGkgPSAqcHRyKys7CisgICAgICAgIHBrdC0+ZnJhbWVfY291bnQgPSAoaSAgICAgKSAmIDB4M0Y7CisgICAgICAgIHBhZGRpbmcgICAgICAgICAgPSAoaSA+PiA2KSAmIDB4MDE7CisgICAgICAgIHBrdC0+dmJyICAgICAgICAgPSAoaSA+PiA3KSAmIDB4MDE7CisKKyAgICAgICAgaWYgKHBrdC0+ZnJhbWVfY291bnQgPT0gMCB8fCBwa3QtPmZyYW1lX2NvdW50ID4gTUFYX0ZSQU1FUykKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICAvKiByZWFkIHBhZGRpbmcgc2l6ZSAqLworICAgICAgICBpZiAocGFkZGluZykgeworICAgICAgICAgICAgcGFkZGluZyA9IHhpcGhfbGFjaW5nX2Z1bGwoJnB0ciwgZW5kKTsKKyAgICAgICAgICAgIGlmIChwYWRkaW5nIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICAvKiByZWFkIGZyYW1lIHNpemVzICovCisgICAgICAgIGlmIChwa3QtPnZicikgeworICAgICAgICAgICAgLyogZm9yIFZCUiwgYWxsIGZyYW1lcyBleGNlcHQgdGhlIGZpbmFsIG9uZSBoYXZlIHRoZWlyIHNpemUgY29kZWQKKyAgICAgICAgICAgICAgIGluIHRoZSBiaXRzdHJlYW0uIHRoZSBsYXN0IGZyYW1lIHNpemUgaXMgaW1wbGljaXQuICovCisgICAgICAgICAgICBpbnQgdG90YWxfYnl0ZXMgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBrdC0+ZnJhbWVfY291bnQgLSAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmcmFtZV9ieXRlcyA9IHhpcGhfbGFjaW5nXzE2Yml0KCZwdHIsIGVuZCk7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lX2J5dGVzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIHBrdC0+ZnJhbWVfc2l6ZVtpXSA9IGZyYW1lX2J5dGVzOworICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzICs9IGZyYW1lX2J5dGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2VsZl9kZWxpbWl0aW5nKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IHhpcGhfbGFjaW5nXzE2Yml0KCZwdHIsIGVuZCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDAgfHwgbGVuICsgdG90YWxfYnl0ZXMgKyBwYWRkaW5nID4gZW5kIC0gcHRyKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgZW5kICAgICAgPSBwdHIgKyB0b3RhbF9ieXRlcyArIGxlbiArIHBhZGRpbmc7CisgICAgICAgICAgICAgICAgYnVmX3NpemUgPSBlbmQgLSBidWY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyYW1lX2J5dGVzID0gZW5kIC0gcHRyIC0gcGFkZGluZzsKKyAgICAgICAgICAgIGlmICh0b3RhbF9ieXRlcyA+IGZyYW1lX2J5dGVzKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIHBrdC0+ZnJhbWVfb2Zmc2V0WzBdID0gcHRyIC0gYnVmOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHBrdC0+ZnJhbWVfY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICBwa3QtPmZyYW1lX29mZnNldFtpXSA9IHBrdC0+ZnJhbWVfb2Zmc2V0W2ktMV0gKyBwa3QtPmZyYW1lX3NpemVbaS0xXTsKKyAgICAgICAgICAgIHBrdC0+ZnJhbWVfc2l6ZVtwa3QtPmZyYW1lX2NvdW50LTFdID0gZnJhbWVfYnl0ZXMgLSB0b3RhbF9ieXRlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGZvciBDQlIsIHRoZSByZW1haW5pbmcgcGFja2V0IGJ5dGVzIGFyZSBkaXZpZGVkIGV2ZW5seSBiZXR3ZWVuCisgICAgICAgICAgICAgICB0aGUgZnJhbWVzICovCisgICAgICAgICAgICBpZiAoc2VsZl9kZWxpbWl0aW5nKSB7CisgICAgICAgICAgICAgICAgZnJhbWVfYnl0ZXMgPSB4aXBoX2xhY2luZ18xNmJpdCgmcHRyLCBlbmQpOworICAgICAgICAgICAgICAgIGlmIChmcmFtZV9ieXRlcyA8IDAgfHwgcGt0LT5mcmFtZV9jb3VudCAqIGZyYW1lX2J5dGVzICsgcGFkZGluZyA+IGVuZCAtIHB0cikKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIGVuZCAgICAgID0gcHRyICsgcGt0LT5mcmFtZV9jb3VudCAqIGZyYW1lX2J5dGVzICsgcGFkZGluZzsKKyAgICAgICAgICAgICAgICBidWZfc2l6ZSA9IGVuZCAtIGJ1ZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnJhbWVfYnl0ZXMgPSBlbmQgLSBwdHIgLSBwYWRkaW5nOworICAgICAgICAgICAgICAgIGlmIChmcmFtZV9ieXRlcyAlIHBrdC0+ZnJhbWVfY291bnQgfHwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVfYnl0ZXMgLyBwa3QtPmZyYW1lX2NvdW50ID4gTUFYX0ZSQU1FX1NJWkUpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICBmcmFtZV9ieXRlcyAvPSBwa3QtPmZyYW1lX2NvdW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwa3QtPmZyYW1lX29mZnNldFswXSA9IHB0ciAtIGJ1ZjsKKyAgICAgICAgICAgIHBrdC0+ZnJhbWVfc2l6ZVswXSAgID0gZnJhbWVfYnl0ZXM7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcGt0LT5mcmFtZV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcGt0LT5mcmFtZV9vZmZzZXRbaV0gPSBwa3QtPmZyYW1lX29mZnNldFtpLTFdICsgcGt0LT5mcmFtZV9zaXplW2ktMV07CisgICAgICAgICAgICAgICAgcGt0LT5mcmFtZV9zaXplW2ldICAgPSBmcmFtZV9ieXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBrdC0+cGFja2V0X3NpemUgPSBidWZfc2l6ZTsKKyAgICBwa3QtPmRhdGFfc2l6ZSAgID0gcGt0LT5wYWNrZXRfc2l6ZSAtIHBhZGRpbmc7CisKKyAgICAvKiB0b3RhbCBwYWNrZXQgZHVyYXRpb24gY2Fubm90IGJlIGxhcmdlciB0aGFuIDEyMG1zICovCisgICAgcGt0LT5mcmFtZV9kdXJhdGlvbiA9IG9wdXNfZnJhbWVfZHVyYXRpb25bcGt0LT5jb25maWddOworICAgIGlmIChwa3QtPmZyYW1lX2R1cmF0aW9uICogcGt0LT5mcmFtZV9jb3VudCA+IE1BWF9QQUNLRVRfRFVSKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiBzZXQgbW9kZSBhbmQgYmFuZHdpZHRoICovCisgICAgaWYgKHBrdC0+Y29uZmlnIDwgMTIpIHsKKyAgICAgICAgcGt0LT5tb2RlID0gT1BVU19NT0RFX1NJTEs7CisgICAgICAgIHBrdC0+YmFuZHdpZHRoID0gcGt0LT5jb25maWcgPj4gMjsKKyAgICB9IGVsc2UgaWYgKHBrdC0+Y29uZmlnIDwgMTYpIHsKKyAgICAgICAgcGt0LT5tb2RlID0gT1BVU19NT0RFX0hZQlJJRDsKKyAgICAgICAgcGt0LT5iYW5kd2lkdGggPSBPUFVTX0JBTkRXSURUSF9TVVBFUldJREVCQU5EICsgKHBrdC0+Y29uZmlnID49IDE0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBwa3QtPm1vZGUgPSBPUFVTX01PREVfQ0VMVDsKKyAgICAgICAgcGt0LT5iYW5kd2lkdGggPSAocGt0LT5jb25maWcgLSAxNikgPj4gMjsKKyAgICAgICAgLyogc2tpcCBtZWRpdW1iYW5kICovCisgICAgICAgIGlmIChwa3QtPmJhbmR3aWR0aCkKKyAgICAgICAgICAgIHBrdC0+YmFuZHdpZHRoKys7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgbWVtc2V0KHBrdCwgMCwgc2l6ZW9mKCpwa3QpKTsKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworc3RhdGljIGludCBjaGFubmVsX3Jlb3JkZXJfdm9yYmlzKGludCBuYl9jaGFubmVscywgaW50IGNoYW5uZWxfaWR4KQoreworICAgIHJldHVybiBmZl92b3JiaXNfY2hhbm5lbF9sYXlvdXRfb2Zmc2V0c1tuYl9jaGFubmVscyAtIDFdW2NoYW5uZWxfaWR4XTsKK30KKworc3RhdGljIGludCBjaGFubmVsX3Jlb3JkZXJfdW5rbm93bihpbnQgbmJfY2hhbm5lbHMsIGludCBjaGFubmVsX2lkeCkKK3sKKyAgICByZXR1cm4gY2hhbm5lbF9pZHg7Cit9CisKK2F2X2NvbGQgaW50IGZmX29wdXNfcGFyc2VfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdXNDb250ZXh0ICpzKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRlZmF1bHRfY2hhbm5lbF9tYXBbMl0gPSB7IDAsIDEgfTsKKworICAgIGludCAoKmNoYW5uZWxfcmVvcmRlcikoaW50LCBpbnQpID0gY2hhbm5lbF9yZW9yZGVyX3Vua25vd247CisKKyAgICBjb25zdCB1aW50OF90ICpleHRyYWRhdGEsICpjaGFubmVsX21hcDsKKyAgICBpbnQgZXh0cmFkYXRhX3NpemU7CisgICAgaW50IHZlcnNpb24sIGNoYW5uZWxzLCBtYXBfdHlwZSwgc3RyZWFtcywgc3RlcmVvX3N0cmVhbXMsIGksIGo7CisgICAgdWludDY0X3QgbGF5b3V0OworCisgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKSB7CisgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gd2l0aG91dCBleHRyYWRhdGEuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgZXh0cmFkYXRhICAgICAgPSBvcHVzX2RlZmF1bHRfZXh0cmFkYXRhOworICAgICAgICBleHRyYWRhdGFfc2l6ZSA9IHNpemVvZihvcHVzX2RlZmF1bHRfZXh0cmFkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBleHRyYWRhdGEgPSBhdmN0eC0+ZXh0cmFkYXRhOworICAgICAgICBleHRyYWRhdGFfc2l6ZSA9IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoZXh0cmFkYXRhX3NpemUgPCAxOSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZXh0cmFkYXRhIHNpemU6ICVkXG4iLAorICAgICAgICAgICAgICAgZXh0cmFkYXRhX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB2ZXJzaW9uID0gZXh0cmFkYXRhWzhdOworICAgIGlmICh2ZXJzaW9uID4gMTUpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiRXh0cmFkYXRhIHZlcnNpb24gJWQiLCB2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGF2Y3R4LT5kZWxheSA9IEFWX1JMMTYoZXh0cmFkYXRhICsgMTApOworCisgICAgY2hhbm5lbHMgPSBhdmN0eC0+ZXh0cmFkYXRhID8gZXh0cmFkYXRhWzldIDogKGF2Y3R4LT5jaGFubmVscyA9PSAxKSA/IDEgOiAyOworICAgIGlmICghY2hhbm5lbHMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJaZXJvIGNoYW5uZWwgY291bnQgc3BlY2lmaWVkIGluIHRoZSBleHRhZGF0YVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPmdhaW5faSA9IEFWX1JMMTYoZXh0cmFkYXRhICsgMTYpOworICAgIGlmIChzLT5nYWluX2kpCisgICAgICAgIHMtPmdhaW4gPSBwb3coMTAsIHMtPmdhaW5faSAvICgyMC4wICogMjU2KSk7CisKKyAgICBtYXBfdHlwZSA9IGV4dHJhZGF0YVsxOF07CisgICAgaWYgKCFtYXBfdHlwZSkgeworICAgICAgICBpZiAoY2hhbm5lbHMgPiAyKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ2hhbm5lbCBtYXBwaW5nIDAgaXMgb25seSBzcGVjaWZpZWQgZm9yIHVwIHRvIDIgY2hhbm5lbHNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgbGF5b3V0ICAgICAgICAgPSAoY2hhbm5lbHMgPT0gMSkgPyBBVl9DSF9MQVlPVVRfTU9OTyA6IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgIHN0cmVhbXMgICAgICAgID0gMTsKKyAgICAgICAgc3RlcmVvX3N0cmVhbXMgPSBjaGFubmVscyAtIDE7CisgICAgICAgIGNoYW5uZWxfbWFwICAgID0gZGVmYXVsdF9jaGFubmVsX21hcDsKKyAgICB9IGVsc2UgaWYgKG1hcF90eXBlID09IDEgfHwgbWFwX3R5cGUgPT0gMjU1KSB7CisgICAgICAgIGlmIChleHRyYWRhdGFfc2l6ZSA8IDIxICsgY2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBleHRyYWRhdGEgc2l6ZTogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW1zICAgICAgICA9IGV4dHJhZGF0YVsxOV07CisgICAgICAgIHN0ZXJlb19zdHJlYW1zID0gZXh0cmFkYXRhWzIwXTsKKyAgICAgICAgaWYgKCFzdHJlYW1zIHx8IHN0ZXJlb19zdHJlYW1zID4gc3RyZWFtcyB8fAorICAgICAgICAgICAgc3RyZWFtcyArIHN0ZXJlb19zdHJlYW1zID4gMjU1KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBzdHJlYW0vc3RlcmVvIHN0cmVhbSBjb3VudDogJWQvJWRcbiIsIHN0cmVhbXMsIHN0ZXJlb19zdHJlYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hcF90eXBlID09IDEpIHsKKyAgICAgICAgICAgIGlmIChjaGFubmVscyA+IDgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNoYW5uZWwgbWFwcGluZyAxIGlzIG9ubHkgc3BlY2lmaWVkIGZvciB1cCB0byA4IGNoYW5uZWxzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxheW91dCA9IGZmX3ZvcmJpc19jaGFubmVsX2xheW91dHNbY2hhbm5lbHMgLSAxXTsKKyAgICAgICAgICAgIGNoYW5uZWxfcmVvcmRlciA9IGNoYW5uZWxfcmVvcmRlcl92b3JiaXM7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbGF5b3V0ID0gMDsKKworICAgICAgICBjaGFubmVsX21hcCA9IGV4dHJhZGF0YSArIDIxOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIk1hcHBpbmcgdHlwZSAlZCIsIG1hcF90eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHMtPmNoYW5uZWxfbWFwcyA9IGF2X21hbGxvY3pfYXJyYXkoY2hhbm5lbHMsIHNpemVvZigqcy0+Y2hhbm5lbF9tYXBzKSk7CisgICAgaWYgKCFzLT5jaGFubmVsX21hcHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgICAgICBDaGFubmVsTWFwICptYXAgPSAmcy0+Y2hhbm5lbF9tYXBzW2ldOworICAgICAgICB1aW50OF90ICAgICBpZHggPSBjaGFubmVsX21hcFtjaGFubmVsX3Jlb3JkZXIoY2hhbm5lbHMsIGkpXTsKKworICAgICAgICBpZiAoaWR4ID09IDI1NSkgeworICAgICAgICAgICAgbWFwLT5zaWxlbmNlID0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGlkeCA+PSBzdHJlYW1zICsgc3RlcmVvX3N0cmVhbXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNoYW5uZWwgbWFwIGZvciBvdXRwdXQgY2hhbm5lbCAlZDogJWRcbiIsIGksIGlkeCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIHRoYXQgd2UgZGluJ3Qgc2VlIHRoaXMgaW5kZXggeWV0ICovCisgICAgICAgIG1hcC0+Y29weSA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgICAgICAgICBpZiAoY2hhbm5lbF9tYXBbY2hhbm5lbF9yZW9yZGVyKGNoYW5uZWxzLCBqKV0gPT0gaWR4KSB7CisgICAgICAgICAgICAgICAgbWFwLT5jb3B5ICAgICA9IDE7CisgICAgICAgICAgICAgICAgbWFwLT5jb3B5X2lkeCA9IGo7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKGlkeCA8IDIgKiBzdGVyZW9fc3RyZWFtcykgeworICAgICAgICAgICAgbWFwLT5zdHJlYW1faWR4ICA9IGlkeCAvIDI7CisgICAgICAgICAgICBtYXAtPmNoYW5uZWxfaWR4ID0gaWR4ICYgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hcC0+c3RyZWFtX2lkeCAgPSBpZHggLSBzdGVyZW9fc3RyZWFtczsKKyAgICAgICAgICAgIG1hcC0+Y2hhbm5lbF9pZHggPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gY2hhbm5lbHM7CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gbGF5b3V0OworICAgIHMtPm5iX3N0cmVhbXMgICAgICAgICA9IHN0cmVhbXM7CisgICAgcy0+bmJfc3RlcmVvX3N0cmVhbXMgID0gc3RlcmVvX3N0cmVhbXM7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL29wdXMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL29wdXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmFhN2QzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvb3B1cy5oCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogT3B1cyBkZWNvZGVyL2RlbXV4ZXIgY29tbW9uIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDEyIEFuZHJldyBEJ0FkZGVzaW8KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IE1vemlsbGEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX09QVVNfSAorI2RlZmluZSBBVkNPREVDX09QVVNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXVkaW9fZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKworI2luY2x1ZGUgImxpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisKKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgICAgICAgICAgICAgICAxMjc1CisjZGVmaW5lIE1BWF9GUkFNRVMgICAgICAgICAgICAgICAgICAgNDgKKyNkZWZpbmUgTUFYX1BBQ0tFVF9EVVIgICAgICAgICAgICAgICA1NzYwCisKKyNkZWZpbmUgQ0VMVF9TSE9SVF9CTE9DS1NJWkUgICAgICAgICAxMjAKKyNkZWZpbmUgQ0VMVF9PVkVSTEFQICAgICAgICAgICAgICAgICBDRUxUX1NIT1JUX0JMT0NLU0laRQorI2RlZmluZSBDRUxUX01BWF9MT0dfQkxPQ0tTICAgICAgICAgIDMKKyNkZWZpbmUgQ0VMVF9NQVhfRlJBTUVfU0laRSAgICAgICAgICAoQ0VMVF9TSE9SVF9CTE9DS1NJWkUgKiAoMSA8PCBDRUxUX01BWF9MT0dfQkxPQ0tTKSkKKyNkZWZpbmUgQ0VMVF9NQVhfQkFORFMgICAgICAgICAgICAgICAyMQorI2RlZmluZSBDRUxUX1ZFQ1RPUlMgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIENFTFRfQUxMT0NfU1RFUFMgICAgICAgICAgICAgNgorI2RlZmluZSBDRUxUX0ZJTkVfT0ZGU0VUICAgICAgICAgICAgIDIxCisjZGVmaW5lIENFTFRfTUFYX0ZJTkVfQklUUyAgICAgICAgICAgOAorI2RlZmluZSBDRUxUX05PUk1fU0NBTEUgICAgICAgICAgICAgIDE2Mzg0CisjZGVmaW5lIENFTFRfUVRIRVRBX09GRlNFVCAgICAgICAgICAgNAorI2RlZmluZSBDRUxUX1FUSEVUQV9PRkZTRVRfVFdPUEhBU0UgIDE2CisjZGVmaW5lIENFTFRfREVFTVBIX0NPRUZGICAgICAgICAgICAgMC44NTAwMDYxMGYKKyNkZWZpbmUgQ0VMVF9QT1NURklMVEVSX01JTlBFUklPRCAgICAxNQorI2RlZmluZSBDRUxUX0VORVJHWV9TSUxFTkNFICAgICAgICAgICgtMjguMGYpCisKKyNkZWZpbmUgU0lMS19ISVNUT1JZICAgICAgICAgICAgICAgICAzMjIKKyNkZWZpbmUgU0lMS19NQVhfTFBDICAgICAgICAgICAgICAgICAxNgorCisjZGVmaW5lIFJPVU5EX01VTEwoYSxiLHMpICgoKE1VTDY0KGEsIGIpID4+ICgocykgLSAxKSkgKyAxKSA+PiAxKQorI2RlZmluZSBST1VORF9NVUwxNihhLGIpICAoKE1VTDE2KGEsIGIpICsgMTYzODQpID4+IDE1KQorI2RlZmluZSBvcHVzX2lsb2coaSkgKGF2X2xvZzIoaSkgKyAhIShpKSkKKworI2RlZmluZSBPUFVTX1RTX0hFQURFUiAgICAgMHg3RkUwICAgICAgICAvLyAweDNmZiAoMTEgYml0cykKKyNkZWZpbmUgT1BVU19UU19NQVNLICAgICAgIDB4RkZFMCAgICAgICAgLy8gdG9wIDExIGJpdHMKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb3B1c19kZWZhdWx0X2V4dHJhZGF0YVszMF0gPSB7CisgICAgJ08nLCAncCcsICd1JywgJ3MnLCAnSCcsICdlJywgJ2EnLCAnZCcsCisgICAgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorfTsKKworZW51bSBPcHVzTW9kZSB7CisgICAgT1BVU19NT0RFX1NJTEssCisgICAgT1BVU19NT0RFX0hZQlJJRCwKKyAgICBPUFVTX01PREVfQ0VMVAorfTsKKworZW51bSBPcHVzQmFuZHdpZHRoIHsKKyAgICBPUFVTX0JBTkRXSURUSF9OQVJST1dCQU5ELAorICAgIE9QVVNfQkFORFdJRFRIX01FRElVTUJBTkQsCisgICAgT1BVU19CQU5EV0lEVEhfV0lERUJBTkQsCisgICAgT1BVU19CQU5EV0lEVEhfU1VQRVJXSURFQkFORCwKKyAgICBPUFVTX0JBTkRXSURUSF9GVUxMQkFORAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgUmF3Qml0c0NvbnRleHQgeworICAgIGNvbnN0IHVpbnQ4X3QgKnBvc2l0aW9uOworICAgIHVuc2lnbmVkIGludCBieXRlczsKKyAgICB1bnNpZ25lZCBpbnQgY2FjaGVsZW47CisgICAgdW5zaWduZWQgaW50IGNhY2hldmFsOworfSBSYXdCaXRzQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgT3B1c1JhbmdlQ29kZXIgeworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgUmF3Qml0c0NvbnRleHQgcmI7CisgICAgdW5zaWduZWQgaW50IHJhbmdlOworICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKKyAgICB1bnNpZ25lZCBpbnQgdG90YWxfcmVhZF9iaXRzOworfSBPcHVzUmFuZ2VDb2RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgU2lsa0NvbnRleHQgU2lsa0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IENlbHRDb250ZXh0IENlbHRDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBPcHVzUGFja2V0IHsKKyAgICBpbnQgcGFja2V0X3NpemU7ICAgICAgICAgICAgICAgIC8qKjwgcGFja2V0IHNpemUgKi8KKyAgICBpbnQgZGF0YV9zaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgdXNlZnVsIGRhdGEgLS0gcGFja2V0IHNpemUgLSBwYWRkaW5nICovCisgICAgaW50IGNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IHBhY2tldCBjb2RlOiBzcGVjaWZpZXMgdGhlIGZyYW1lIGxheW91dCAqLworICAgIGludCBzdGVyZW87ICAgICAgICAgICAgICAgICAgICAgLyoqPCB3aGV0aGVyIHRoaXMgcGFja2V0IGlzIG1vbm8gb3Igc3RlcmVvICovCisgICAgaW50IHZicjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHZiciBmbGFnICovCisgICAgaW50IGNvbmZpZzsgICAgICAgICAgICAgICAgICAgICAvKio8IGNvbmZpZ3VyYXRpb246IHRlbGxzIHRoZSBhdWRpbyBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqICAgICAgICAgICAgICAgIGJhbmR3aWR0aCwgYW5kIGZyYW1lIGR1cmF0aW9uICovCisgICAgaW50IGZyYW1lX2NvdW50OyAgICAgICAgICAgICAgICAvKio8IGZyYW1lIGNvdW50ICovCisgICAgaW50IGZyYW1lX29mZnNldFtNQVhfRlJBTUVTXTsgICAvKio8IGZyYW1lIG9mZnNldHMgKi8KKyAgICBpbnQgZnJhbWVfc2l6ZVtNQVhfRlJBTUVTXTsgICAgIC8qKjwgZnJhbWUgc2l6ZXMgKi8KKyAgICBpbnQgZnJhbWVfZHVyYXRpb247ICAgICAgICAgICAgIC8qKjwgZnJhbWUgZHVyYXRpb24sIGluIHNhbXBsZXMgQCA0OGtIeiAqLworICAgIGVudW0gT3B1c01vZGUgbW9kZTsgICAgICAgICAgICAgLyoqPCBtb2RlICovCisgICAgZW51bSBPcHVzQmFuZHdpZHRoIGJhbmR3aWR0aDsgICAvKio8IGJhbmR3aWR0aCAqLworfSBPcHVzUGFja2V0OworCit0eXBlZGVmIHN0cnVjdCBPcHVzU3RyZWFtQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGludCBvdXRwdXRfY2hhbm5lbHM7CisKKyAgICBPcHVzUmFuZ2VDb2RlciByYzsKKyAgICBPcHVzUmFuZ2VDb2RlciByZWR1bmRhbmN5X3JjOworICAgIFNpbGtDb250ZXh0ICpzaWxrOworICAgIENlbHRDb250ZXh0ICpjZWx0OworICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOworCisgICAgZmxvYXQgc2lsa19idWZbMl1bOTYwXTsKKyAgICBmbG9hdCAqc2lsa19vdXRwdXRbMl07CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgY2VsdF9idWYpWzJdWzk2MF07CisgICAgZmxvYXQgKmNlbHRfb3V0cHV0WzJdOworCisgICAgZmxvYXQgcmVkdW5kYW5jeV9idWZbMl1bOTYwXTsKKyAgICBmbG9hdCAqcmVkdW5kYW5jeV9vdXRwdXRbMl07CisKKyAgICAvKiBkYXRhIGJ1ZmZlcnMgZm9yIHRoZSBmaW5hbCBvdXRwdXQgZGF0YSAqLworICAgIGZsb2F0ICpvdXRbMl07CisgICAgaW50IG91dF9zaXplOworCisgICAgZmxvYXQgKm91dF9kdW1teTsKKyAgICBpbnQgICAgb3V0X2R1bW15X2FsbG9jYXRlZF9zaXplOworCisgICAgU3dyQ29udGV4dCAqc3dyOworICAgIEFWQXVkaW9GaWZvICpjZWx0X2RlbGF5OworICAgIGludCBzaWxrX3NhbXBsZXJhdGU7CisgICAgLyogbnVtYmVyIG9mIHNhbXBsZXMgd2Ugc3RpbGwgd2FudCB0byBnZXQgZnJvbSB0aGUgcmVzYW1wbGVyICovCisgICAgaW50IGRlbGF5ZWRfc2FtcGxlczsKKworICAgIE9wdXNQYWNrZXQgcGFja2V0OworCisgICAgaW50IHJlZHVuZGFuY3lfaWR4OworfSBPcHVzU3RyZWFtQ29udGV4dDsKKworLy8gYSBtYXBwaW5nIGJldHdlZW4gYW4gb3B1cyBzdHJlYW0gYW5kIGFuIG91dHB1dCBjaGFubmVsCit0eXBlZGVmIHN0cnVjdCBDaGFubmVsTWFwIHsKKyAgICBpbnQgc3RyZWFtX2lkeDsKKyAgICBpbnQgY2hhbm5lbF9pZHg7CisKKyAgICAvLyB3aGVuIGEgc2luZ2xlIGRlY29kZWQgY2hhbm5lbCBpcyBtYXBwZWQgdG8gbXVsdGlwbGUgb3V0cHV0IGNoYW5uZWxzLCB3ZQorICAgIC8vIHdyaXRlIHRvIHRoZSBmaXJzdCBvdXRwdXQgZGlyZWN0bHkgYW5kIGNvcHkgZnJvbSBpdCB0byB0aGUgb3RoZXJzCisgICAgLy8gdGhpcyBmaWVsZCBpcyBzZXQgdG8gMSBmb3IgdGhvc2UgY29waWVkIG91dHB1dCBjaGFubmVscworICAgIGludCBjb3B5OworICAgIC8vIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBvdXRwdXQgY2hhbm5lbCB0byBjb3B5IGZyb20KKyAgICBpbnQgY29weV9pZHg7CisKKyAgICAvLyB0aGlzIGNoYW5uZWwgaXMgc2lsZW50CisgICAgaW50IHNpbGVuY2U7Cit9IENoYW5uZWxNYXA7CisKK3R5cGVkZWYgc3RydWN0IE9wdXNDb250ZXh0IHsKKyAgICBPcHVzU3RyZWFtQ29udGV4dCAqc3RyZWFtczsKKyAgICBpbnQgICAgICAgICAgICAgbmJfc3RyZWFtczsKKyAgICBpbnQgICAgICBuYl9zdGVyZW9fc3RyZWFtczsKKworICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOworICAgIGludDE2X3QgZ2Fpbl9pOworICAgIGZsb2F0ICAgZ2FpbjsKKworICAgIENoYW5uZWxNYXAgKmNoYW5uZWxfbWFwczsKK30gT3B1c0NvbnRleHQ7CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgb3B1c19yY19ub3JtYWxpemUoT3B1c1JhbmdlQ29kZXIgKnJjKQoreworICAgIHdoaWxlIChyYy0+cmFuZ2UgPD0gMTw8MjMpIHsKKyAgICAgICAgcmMtPnZhbHVlID0gKChyYy0+dmFsdWUgPDwgOCkgfCAoZ2V0X2JpdHMoJnJjLT5nYiwgOCkgXiAweEZGKSkgJiAoKDF1IDw8IDMxKSAtIDEpOworICAgICAgICByYy0+cmFuZ2UgICAgICAgICAgPDw9IDg7CisgICAgICAgIHJjLT50b3RhbF9yZWFkX2JpdHMgKz0gODsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgb3B1c19yY191cGRhdGUoT3B1c1JhbmdlQ29kZXIgKnJjLCB1bnNpZ25lZCBpbnQgc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbG93LCB1bnNpZ25lZCBpbnQgaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0b3RhbCkKK3sKKyAgICByYy0+dmFsdWUgLT0gc2NhbGUgKiAodG90YWwgLSBoaWdoKTsKKyAgICByYy0+cmFuZ2UgID0gbG93ID8gc2NhbGUgKiAoaGlnaCAtIGxvdykKKyAgICAgICAgICAgICAgICAgICAgICA6IHJjLT5yYW5nZSAtIHNjYWxlICogKHRvdGFsIC0gaGlnaCk7CisgICAgb3B1c19yY19ub3JtYWxpemUocmMpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQgb3B1c19yY19nZXRzeW1ib2woT3B1c1JhbmdlQ29kZXIgKnJjLCBjb25zdCB1aW50MTZfdCAqY2RmKQoreworICAgIHVuc2lnbmVkIGludCBrLCBzY2FsZSwgdG90YWwsIHN5bWJvbCwgbG93LCBoaWdoOworCisgICAgdG90YWwgPSAqY2RmKys7CisKKyAgICBzY2FsZSAgID0gcmMtPnJhbmdlIC8gdG90YWw7CisgICAgc3ltYm9sID0gcmMtPnZhbHVlIC8gc2NhbGUgKyAxOworICAgIHN5bWJvbCA9IHRvdGFsIC0gRkZNSU4oc3ltYm9sLCB0b3RhbCk7CisKKyAgICBmb3IgKGsgPSAwOyBjZGZba10gPD0gc3ltYm9sOyBrKyspOworICAgIGhpZ2ggPSBjZGZba107CisgICAgbG93ICA9IGsgPyBjZGZbay0xXSA6IDA7CisKKyAgICBvcHVzX3JjX3VwZGF0ZShyYywgc2NhbGUsIGxvdywgaGlnaCwgdG90YWwpOworCisgICAgcmV0dXJuIGs7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCBvcHVzX3JjX3AybW9kZWwoT3B1c1JhbmdlQ29kZXIgKnJjLCB1bnNpZ25lZCBpbnQgYml0cykKK3sKKyAgICB1bnNpZ25lZCBpbnQgaywgc2NhbGU7CisgICAgc2NhbGUgPSByYy0+cmFuZ2UgPj4gYml0czsgLy8gaW4gdGhpcyBjYXNlLCBzY2FsZSA9IHN5bWJvbAorCisgICAgaWYgKHJjLT52YWx1ZSA+PSBzY2FsZSkgeworICAgICAgICByYy0+dmFsdWUgLT0gc2NhbGU7CisgICAgICAgIHJjLT5yYW5nZSAtPSBzY2FsZTsKKyAgICAgICAgayA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMtPnJhbmdlID0gc2NhbGU7CisgICAgICAgIGsgPSAxOworICAgIH0KKyAgICBvcHVzX3JjX25vcm1hbGl6ZShyYyk7CisgICAgcmV0dXJuIGs7Cit9CisKKy8qKgorICogQ0VMVDogZXN0aW1hdGUgYml0cyBvZiBlbnRyb3B5IHRoYXQgaGF2ZSB0aHVzIGZhciBiZWVuIGNvbnN1bWVkIGZvciB0aGUKKyAqICAgICAgIGN1cnJlbnQgQ0VMVCBmcmFtZSwgdG8gaW50ZWdlciBhbmQgZnJhY3Rpb25hbCAoMS84dGggYml0KSBwcmVjaXNpb24KKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IG9wdXNfcmNfdGVsbChjb25zdCBPcHVzUmFuZ2VDb2RlciAqcmMpCit7CisgICAgcmV0dXJuIHJjLT50b3RhbF9yZWFkX2JpdHMgLSBhdl9sb2cyKHJjLT5yYW5nZSkgLSAxOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQgb3B1c19yY190ZWxsX2ZyYWMoY29uc3QgT3B1c1JhbmdlQ29kZXIgKnJjKQoreworICAgIHVuc2lnbmVkIGludCBpLCB0b3RhbF9iaXRzLCByY2J1ZmZlciwgcmFuZ2U7CisKKyAgICB0b3RhbF9iaXRzID0gcmMtPnRvdGFsX3JlYWRfYml0cyA8PCAzOworICAgIHJjYnVmZmVyICAgPSBhdl9sb2cyKHJjLT5yYW5nZSkgKyAxOworICAgIHJhbmdlICAgICAgPSByYy0+cmFuZ2UgPj4gKHJjYnVmZmVyLTE2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaW50IGJpdDsKKyAgICAgICAgcmFuZ2UgPSByYW5nZSAqIHJhbmdlID4+IDE1OworICAgICAgICBiaXQgPSByYW5nZSA+PiAxNjsKKyAgICAgICAgcmNidWZmZXIgPSByY2J1ZmZlciA8PCAxIHwgYml0OworICAgICAgICByYW5nZSA+Pj0gYml0OworICAgIH0KKworICAgIHJldHVybiB0b3RhbF9iaXRzIC0gcmNidWZmZXI7Cit9CisKKy8qKgorICogQ0VMVDogcmVhZCAxLTI1IHJhdyBiaXRzIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lLCBiYWNrd2FyZHMgYnl0ZS13aXNlCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCBvcHVzX2dldHJhd2JpdHMoT3B1c1JhbmdlQ29kZXIgKnJjLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisgICAgdW5zaWduZWQgaW50IHZhbHVlID0gMDsKKworICAgIHdoaWxlIChyYy0+cmIuYnl0ZXMgJiYgcmMtPnJiLmNhY2hlbGVuIDwgY291bnQpIHsKKyAgICAgICAgcmMtPnJiLmNhY2hldmFsIHw9ICotLXJjLT5yYi5wb3NpdGlvbiA8PCByYy0+cmIuY2FjaGVsZW47CisgICAgICAgIHJjLT5yYi5jYWNoZWxlbiArPSA4OworICAgICAgICByYy0+cmIuYnl0ZXMtLTsKKyAgICB9CisKKyAgICB2YWx1ZSA9IHJjLT5yYi5jYWNoZXZhbCAmICgoMTw8Y291bnQpLTEpOworICAgIHJjLT5yYi5jYWNoZXZhbCAgICA+Pj0gY291bnQ7CisgICAgcmMtPnJiLmNhY2hlbGVuICAgICAtPSBjb3VudDsKKyAgICByYy0+dG90YWxfcmVhZF9iaXRzICs9IGNvdW50OworCisgICAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIENFTFQ6IHJlYWQgYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQgb3B1c19yY191bmltb2RlbChPcHVzUmFuZ2VDb2RlciAqcmMsIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIHVuc2lnbmVkIGludCBiaXRzLCBrLCBzY2FsZSwgdG90YWw7CisKKyAgICBiaXRzICA9IG9wdXNfaWxvZyhzaXplIC0gMSk7CisgICAgdG90YWwgPSAoYml0cyA+IDgpID8gKChzaXplIC0gMSkgPj4gKGJpdHMgLSA4KSkgKyAxIDogc2l6ZTsKKworICAgIHNjYWxlICA9IHJjLT5yYW5nZSAvIHRvdGFsOworICAgIGsgICAgICA9IHJjLT52YWx1ZSAvIHNjYWxlICsgMTsKKyAgICBrICAgICAgPSB0b3RhbCAtIEZGTUlOKGssIHRvdGFsKTsKKyAgICBvcHVzX3JjX3VwZGF0ZShyYywgc2NhbGUsIGssIGsgKyAxLCB0b3RhbCk7CisKKyAgICBpZiAoYml0cyA+IDgpIHsKKyAgICAgICAgayA9IGsgPDwgKGJpdHMgLSA4KSB8IG9wdXNfZ2V0cmF3Yml0cyhyYywgYml0cyAtIDgpOworICAgICAgICByZXR1cm4gRkZNSU4oaywgc2l6ZSAtIDEpOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gazsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IG9wdXNfcmNfbGFwbGFjZShPcHVzUmFuZ2VDb2RlciAqcmMsIHVuc2lnbmVkIGludCBzeW1ib2wsIGludCBkZWNheSkKK3sKKyAgICAvKiBleHRlbmRzIHRoZSByYW5nZSBjb2RlciB0byBtb2RlbCBhIExhcGxhY2UgZGlzdHJpYnV0aW9uICovCisgICAgaW50IHZhbHVlID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgc2NhbGUsIGxvdyA9IDAsIGNlbnRlcjsKKworICAgIHNjYWxlICA9IHJjLT5yYW5nZSA+PiAxNTsKKyAgICBjZW50ZXIgPSByYy0+dmFsdWUgLyBzY2FsZSArIDE7CisgICAgY2VudGVyID0gKDEgPDwgMTUpIC0gRkZNSU4oY2VudGVyLCAxIDw8IDE1KTsKKworICAgIGlmIChjZW50ZXIgPj0gc3ltYm9sKSB7CisgICAgICAgIHZhbHVlKys7CisgICAgICAgIGxvdyA9IHN5bWJvbDsKKyAgICAgICAgc3ltYm9sID0gMSArICgoMzI3NjggLSAzMiAtIHN5bWJvbCkgKiAoMTYzODQtZGVjYXkpID4+IDE1KTsKKworICAgICAgICB3aGlsZSAoc3ltYm9sID4gMSAmJiBjZW50ZXIgPj0gbG93ICsgMiAqIHN5bWJvbCkgeworICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIHN5bWJvbCAqPSAyOworICAgICAgICAgICAgbG93ICAgICs9IHN5bWJvbDsKKyAgICAgICAgICAgIHN5bWJvbCAgPSAoKChzeW1ib2wgLSAyKSAqIGRlY2F5KSA+PiAxNSkgKyAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN5bWJvbCA8PSAxKSB7CisgICAgICAgICAgICBpbnQgZGlzdGFuY2UgPSAoY2VudGVyIC0gbG93KSA+PiAxOworICAgICAgICAgICAgdmFsdWUgKz0gZGlzdGFuY2U7CisgICAgICAgICAgICBsb3cgICArPSAyICogZGlzdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2VudGVyIDwgbG93ICsgc3ltYm9sKQorICAgICAgICAgICAgdmFsdWUgKj0gLTE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvdyArPSBzeW1ib2w7CisgICAgfQorCisgICAgb3B1c19yY191cGRhdGUocmMsIHNjYWxlLCBsb3csIEZGTUlOKGxvdyArIHN5bWJvbCwgMzI3NjgpLCAzMjc2OCk7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCBvcHVzX3JjX3N0ZXBtb2RlbChPcHVzUmFuZ2VDb2RlciAqcmMsIGludCBrMCkKK3sKKyAgICAvKiBVc2UgYSBwcm9iYWJpbGl0eSBvZiAzIHVwIHRvIGl0aGV0YT04MTkyIGFuZCB0aGVuIHVzZSAxIGFmdGVyICovCisgICAgdW5zaWduZWQgaW50IGssIHNjYWxlLCBzeW1ib2wsIHRvdGFsID0gKGswKzEpKjMgKyBrMDsKKyAgICBzY2FsZSAgPSByYy0+cmFuZ2UgLyB0b3RhbDsKKyAgICBzeW1ib2wgPSByYy0+dmFsdWUgLyBzY2FsZSArIDE7CisgICAgc3ltYm9sID0gdG90YWwgLSBGRk1JTihzeW1ib2wsIHRvdGFsKTsKKworICAgIGsgPSAoc3ltYm9sIDwgKGswKzEpKjMpID8gc3ltYm9sLzMgOiBzeW1ib2wgLSAoazArMSkqMjsKKworICAgIG9wdXNfcmNfdXBkYXRlKHJjLCBzY2FsZSwgKGsgPD0gazApID8gMyooayswKSA6IChrLTEtazApICsgMyooazArMSksCisgICAgICAgICAgICAgICAgICAgKGsgPD0gazApID8gMyooaysxKSA6IChrLTAtazApICsgMyooazArMSksIHRvdGFsKTsKKyAgICByZXR1cm4gazsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IG9wdXNfcmNfdHJpbW9kZWwoT3B1c1JhbmdlQ29kZXIgKnJjLCBpbnQgcW4pCit7CisgICAgdW5zaWduZWQgaW50IGssIHNjYWxlLCBzeW1ib2wsIHRvdGFsLCBsb3csIGNlbnRlcjsKKworICAgIHRvdGFsID0gKChxbj4+MSkgKyAxKSAqICgocW4+PjEpICsgMSk7CisgICAgc2NhbGUgICA9IHJjLT5yYW5nZSAvIHRvdGFsOworICAgIGNlbnRlciA9IHJjLT52YWx1ZSAvIHNjYWxlICsgMTsKKyAgICBjZW50ZXIgPSB0b3RhbCAtIEZGTUlOKGNlbnRlciwgdG90YWwpOworCisgICAgaWYgKGNlbnRlciA8IHRvdGFsID4+IDEpIHsKKyAgICAgICAgayAgICAgID0gKGZmX3NxcnQoOCAqIGNlbnRlciArIDEpIC0gMSkgPj4gMTsKKyAgICAgICAgbG93ICAgID0gayAqIChrICsgMSkgPj4gMTsKKyAgICAgICAgc3ltYm9sID0gayArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgayAgICAgID0gKDIqKHFuICsgMSkgLSBmZl9zcXJ0KDgqKHRvdGFsIC0gY2VudGVyIC0gMSkgKyAxKSkgPj4gMTsKKyAgICAgICAgbG93ICAgID0gdG90YWwgLSAoKHFuICsgMSAtIGspICogKHFuICsgMiAtIGspID4+IDEpOworICAgICAgICBzeW1ib2wgPSBxbiArIDEgLSBrOworICAgIH0KKworICAgIG9wdXNfcmNfdXBkYXRlKHJjLCBzY2FsZSwgbG93LCBsb3cgKyBzeW1ib2wsIHRvdGFsKTsKKworICAgIHJldHVybiBrOworfQorCitpbnQgZmZfb3B1c19wYXJzZV9wYWNrZXQoT3B1c1BhY2tldCAqcGt0LCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VsZl9kZWxpbWl0ZWQpOworCitpbnQgZmZfb3B1c19wYXJzZV9leHRyYWRhdGEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBPcHVzQ29udGV4dCAqcyk7CisKK2ludCBmZl9zaWxrX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBTaWxrQ29udGV4dCAqKnBzLCBpbnQgb3V0cHV0X2NoYW5uZWxzKTsKK3ZvaWQgZmZfc2lsa19mcmVlKFNpbGtDb250ZXh0ICoqcHMpOwordm9pZCBmZl9zaWxrX2ZsdXNoKFNpbGtDb250ZXh0ICpzKTsKKworLyoqCisgKiBEZWNvZGUgdGhlIExQIGxheWVyIG9mIG9uZSBPcHVzIGZyYW1lICh3aGljaCBtYXkgY29ycmVzcG9uZCB0byBzZXZlcmFsIFNJTEsKKyAqIGZyYW1lcykuCisgKi8KK2ludCBmZl9zaWxrX2RlY29kZV9zdXBlcmZyYW1lKFNpbGtDb250ZXh0ICpzLCBPcHVzUmFuZ2VDb2RlciAqcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBPcHVzQmFuZHdpZHRoIGJhbmR3aWR0aCwgaW50IGNvZGVkX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR1cmF0aW9uX21zKTsKKworaW50IGZmX2NlbHRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIENlbHRDb250ZXh0ICoqcywgaW50IG91dHB1dF9jaGFubmVscyk7CisKK3ZvaWQgZmZfY2VsdF9mcmVlKENlbHRDb250ZXh0ICoqcyk7CisKK3ZvaWQgZmZfY2VsdF9mbHVzaChDZWx0Q29udGV4dCAqcyk7CisKK2ludCBmZl9jZWx0X2RlY29kZV9mcmFtZShDZWx0Q29udGV4dCAqcywgT3B1c1JhbmdlQ29kZXIgKnJjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqb3V0cHV0LCBpbnQgY29kZWRfY2hhbm5lbHMsIGludCBmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGJhbmQsICBpbnQgZW5kYmFuZCk7CisKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9jZWx0X3dpbmRvdzJbMTIwXTsKKworI2VuZGlmIC8qIEFWQ09ERUNfT1BVU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9vcHVzX2NlbHQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL29wdXNfY2VsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzIxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9vcHVzX2NlbHQuYwpAQCAtMCwwICsxLDIyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQW5kcmV3IEQnQWRkZXNpbworICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgTW96aWxsYSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBPcHVzIENFTFQgZGVjb2RlcgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKworI2luY2x1ZGUgIm9wdXMuaCIKKyNpbmNsdWRlICJvcHVzX2ltZGN0LmgiCisKK2VudW0gQ2VsdFNwcmVhZCB7CisgICAgQ0VMVF9TUFJFQURfTk9ORSwKKyAgICBDRUxUX1NQUkVBRF9MSUdIVCwKKyAgICBDRUxUX1NQUkVBRF9OT1JNQUwsCisgICAgQ0VMVF9TUFJFQURfQUdHUkVTU0lWRQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2VsdEZyYW1lIHsKKyAgICBmbG9hdCBlbmVyZ3lbQ0VMVF9NQVhfQkFORFNdOworICAgIGZsb2F0IHByZXZfZW5lcmd5WzJdW0NFTFRfTUFYX0JBTkRTXTsKKworICAgIHVpbnQ4X3QgY29sbGFwc2VfbWFza3NbQ0VMVF9NQVhfQkFORFNdOworCisgICAgLyogYnVmZmVyIGZvciBtZGN0IG91dHB1dCArIHBvc3RmaWx0ZXIgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBidWYpWzIwNDhdOworCisgICAgLyogcG9zdGZpbHRlciBwYXJhbWV0ZXJzICovCisgICAgaW50IHBmX3BlcmlvZF9uZXc7CisgICAgZmxvYXQgcGZfZ2FpbnNfbmV3WzNdOworICAgIGludCBwZl9wZXJpb2Q7CisgICAgZmxvYXQgcGZfZ2FpbnNbM107CisgICAgaW50IHBmX3BlcmlvZF9vbGQ7CisgICAgZmxvYXQgcGZfZ2FpbnNfb2xkWzNdOworCisgICAgZmxvYXQgZGVlbXBoX2NvZWZmOworfSBDZWx0RnJhbWU7CisKK3N0cnVjdCBDZWx0Q29udGV4dCB7CisgICAgLy8gY29uc3RhbnQgdmFsdWVzIHRoYXQgZG8gbm90IGNoYW5nZSBkdXJpbmcgY29udGV4dCBsaWZldGltZQorICAgIEFWQ29kZWNDb250ZXh0ICAgICphdmN0eDsKKyAgICBDZWx0SU1EQ1RDb250ZXh0ICAqaW1kY3RbNF07CisgICAgQVZGbG9hdERTUENvbnRleHQgICpkc3A7CisgICAgaW50IG91dHB1dF9jaGFubmVsczsKKworICAgIC8vIHZhbHVlcyB0aGF0IGhhdmUgaW50ZXItZnJhbWUgZWZmZWN0IGFuZCBtdXN0IGJlIHJlc2V0IG9uIGZsdXNoCisgICAgQ2VsdEZyYW1lIGZyYW1lWzJdOworICAgIHVpbnQzMl90IHNlZWQ7CisgICAgaW50IGZsdXNoZWQ7CisKKyAgICAvLyB2YWx1ZXMgdGhhdCBvbmx5IGFmZmVjdCBhIHNpbmdsZSBmcmFtZQorICAgIGludCBjb2RlZF9jaGFubmVsczsKKyAgICBpbnQgZnJhbWViaXRzOworICAgIGludCBkdXJhdGlvbjsKKworICAgIC8qIG51bWJlciBvZiBpTURDVCBibG9ja3MgaW4gdGhlIGZyYW1lICovCisgICAgaW50IGJsb2NrczsKKyAgICAvKiBzaXplIG9mIGVhY2ggYmxvY2sgKi8KKyAgICBpbnQgYmxvY2tzaXplOworCisgICAgaW50IHN0YXJ0YmFuZDsKKyAgICBpbnQgZW5kYmFuZDsKKyAgICBpbnQgY29kZWRiYW5kczsKKworICAgIGludCBhbnRpY29sbGFwc2VfYml0OworCisgICAgaW50IGludGVuc2l0eXN0ZXJlbzsKKyAgICBpbnQgZHVhbHN0ZXJlbzsKKyAgICBlbnVtIENlbHRTcHJlYWQgc3ByZWFkOworCisgICAgaW50IHJlbWFpbmluZzsKKyAgICBpbnQgcmVtYWluaW5nMjsKKyAgICBpbnQgZmluZV9iaXRzICAgIFtDRUxUX01BWF9CQU5EU107CisgICAgaW50IGZpbmVfcHJpb3JpdHlbQ0VMVF9NQVhfQkFORFNdOworICAgIGludCBwdWxzZXMgICAgICAgW0NFTFRfTUFYX0JBTkRTXTsKKyAgICBpbnQgdGZfY2hhbmdlICAgIFtDRUxUX01BWF9CQU5EU107CisKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBjb2VmZnMpWzJdW0NFTFRfTUFYX0ZSQU1FX1NJWkVdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHNjcmF0Y2gpWzIyICogOF07IC8vIE1BWChjZWx0X2ZyZXFfcmFuZ2UpICogMTw8Q0VMVF9NQVhfTE9HX0JMT0NLUworfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNlbHRfbW9kZWxfdGFwc2V0W10gPSB7IDQsIDIsIDMsIDQgfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNlbHRfbW9kZWxfc3ByZWFkW10gPSB7IDMyLCA3LCA5LCAzMCwgMzIgfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNlbHRfbW9kZWxfYWxsb2NfdHJpbVtdID0geworICAgIDEyOCwgICAyLCAgIDQsICAgOSwgIDE5LCAgNDEsICA4NywgMTA5LCAxMTksIDEyNCwgMTI2LCAxMjgKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjZWx0X21vZGVsX2VuZXJneV9zbWFsbFtdID0geyA0LCAyLCAzLCA0IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNlbHRfZnJlcV9iYW5kc1tdID0geyAvKiBpbiBzdGVwcyBvZiAyMDBIeiAqLworICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgMTAsIDEyLCAxNCwgMTYsIDIwLCAyNCwgMjgsIDM0LCA0MCwgNDgsIDYwLCA3OCwgMTAwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjZWx0X2ZyZXFfcmFuZ2VbXSA9IHsKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICA0LCAgNCwgIDQsICA2LCAgNiwgIDgsIDEyLCAxOCwgMjIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNlbHRfbG9nX2ZyZXFfcmFuZ2VbXSA9IHsKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDgsICA4LCAgOCwgIDgsIDE2LCAxNiwgMTYsIDIxLCAyMSwgMjQsIDI5LCAzNCwgMzYKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgY2VsdF90Zl9zZWxlY3RbNF1bMl1bMl1bMl0gPSB7CisgICAgeyB7IHsgMCwgLTEgfSwgeyAwLCAtMSB9IH0sIHsgeyAwLCAtMSB9LCB7IDAsIC0xIH0gfSB9LAorICAgIHsgeyB7IDAsIC0xIH0sIHsgMCwgLTIgfSB9LCB7IHsgMSwgIDAgfSwgeyAxLCAtMSB9IH0gfSwKKyAgICB7IHsgeyAwLCAtMiB9LCB7IDAsIC0zIH0gfSwgeyB7IDIsICAwIH0sIHsgMSwgLTEgfSB9IH0sCisgICAgeyB7IHsgMCwgLTIgfSwgeyAwLCAtMyB9IH0sIHsgeyAzLCAgMCB9LCB7IDEsIC0xIH0gfSB9Cit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgY2VsdF9tZWFuX2VuZXJneVtdID0geworICAgIDYuNDM3NTAwZiwgNi4yNTAwMDBmLCA1Ljc1MDAwMGYsIDUuMzEyNTAwZiwgNS4wNjI1MDBmLAorICAgIDQuODEyNTAwZiwgNC41MDAwMDBmLCA0LjM3NTAwMGYsIDQuODc1MDAwZiwgNC42ODc1MDBmLAorICAgIDQuNTYyNTAwZiwgNC40Mzc1MDBmLCA0Ljg3NTAwMGYsIDQuNjI1MDAwZiwgNC4zMTI1MDBmLAorICAgIDQuNTAwMDAwZiwgNC4zNzUwMDBmLCA0LjYyNTAwMGYsIDQuNzUwMDAwZiwgNC40Mzc1MDBmLAorICAgIDMuNzUwMDAwZiwgMy43NTAwMDBmLCAzLjc1MDAwMGYsIDMuNzUwMDAwZiwgMy43NTAwMDBmCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgY2VsdF9hbHBoYV9jb2VmW10gPSB7CisgICAgMjk0NDAuMGYvMzI3NjguMGYsICAgIDI2MTEyLjBmLzMyNzY4LjBmLCAgICAyMTI0OC4wZi8zMjc2OC4wZiwgICAgMTYzODQuMGYvMzI3NjguMGYKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBjZWx0X2JldGFfY29lZltdID0geyAvKiBUT0RPOiBwcmVjb21wdXRlIDEgbWludXMgdGhpcyBpZiB0aGUgY29kZSBlbmRzIHVwIG5lYXRlciAqLworICAgIDMwMTQ3LjBmLzMyNzY4LjBmLCAgICAyMjI4Mi4wZi8zMjc2OC4wZiwgICAgMTIxMjQuMGYvMzI3NjguMGYsICAgICA2NTU0LjBmLzMyNzY4LjBmCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjZWx0X2NvYXJzZV9lbmVyZ3lfZGlzdFs0XVsyXVs0Ml0gPSB7CisgICAgeworICAgICAgICB7ICAgICAgIC8vIDEyMC1zYW1wbGUgaW50ZXIKKyAgICAgICAgICAgICA3MiwgMTI3LCAgNjUsIDEyOSwgIDY2LCAxMjgsICA2NSwgMTI4LCAgNjQsIDEyOCwgIDYyLCAxMjgsICA2NCwgMTI4LAorICAgICAgICAgICAgIDY0LCAxMjgsICA5MiwgIDc4LCAgOTIsICA3OSwgIDkyLCAgNzgsICA5MCwgIDc5LCAxMTYsICA0MSwgMTE1LCAgNDAsCisgICAgICAgICAgICAxMTQsICA0MCwgMTMyLCAgMjYsIDEzMiwgIDI2LCAxNDUsICAxNywgMTYxLCAgMTIsIDE3NiwgIDEwLCAxNzcsICAxMQorICAgICAgICB9LCB7ICAgIC8vIDEyMC1zYW1wbGUgaW50cmEKKyAgICAgICAgICAgICAyNCwgMTc5LCAgNDgsIDEzOCwgIDU0LCAxMzUsICA1NCwgMTMyLCAgNTMsIDEzNCwgIDU2LCAxMzMsICA1NSwgMTMyLAorICAgICAgICAgICAgIDU1LCAxMzIsICA2MSwgMTE0LCAgNzAsICA5NiwgIDc0LCAgODgsICA3NSwgIDg4LCAgODcsICA3NCwgIDg5LCAgNjYsCisgICAgICAgICAgICAgOTEsICA2NywgMTAwLCAgNTksIDEwOCwgIDUwLCAxMjAsICA0MCwgMTIyLCAgMzcsICA5NywgIDQzLCAgNzgsICA1MAorICAgICAgICB9CisgICAgfSwgeworICAgICAgICB7ICAgICAgIC8vIDI0MC1zYW1wbGUgaW50ZXIKKyAgICAgICAgICAgICA4MywgIDc4LCAgODQsICA4MSwgIDg4LCAgNzUsICA4NiwgIDc0LCAgODcsICA3MSwgIDkwLCAgNzMsICA5MywgIDc0LAorICAgICAgICAgICAgIDkzLCAgNzQsIDEwOSwgIDQwLCAxMTQsICAzNiwgMTE3LCAgMzQsIDExNywgIDM0LCAxNDMsICAxNywgMTQ1LCAgMTgsCisgICAgICAgICAgICAxNDYsICAxOSwgMTYyLCAgMTIsIDE2NSwgIDEwLCAxNzgsICAgNywgMTg5LCAgIDYsIDE5MCwgICA4LCAxNzcsICAgOQorICAgICAgICB9LCB7ICAgIC8vIDI0MC1zYW1wbGUgaW50cmEKKyAgICAgICAgICAgICAyMywgMTc4LCAgNTQsIDExNSwgIDYzLCAxMDIsICA2NiwgIDk4LCAgNjksICA5OSwgIDc0LCAgODksICA3MSwgIDkxLAorICAgICAgICAgICAgIDczLCAgOTEsICA3OCwgIDg5LCAgODYsICA4MCwgIDkyLCAgNjYsICA5MywgIDY0LCAxMDIsICA1OSwgMTAzLCAgNjAsCisgICAgICAgICAgICAxMDQsICA2MCwgMTE3LCAgNTIsIDEyMywgIDQ0LCAxMzgsICAzNSwgMTMzLCAgMzEsICA5NywgIDM4LCAgNzcsICA0NQorICAgICAgICB9CisgICAgfSwgeworICAgICAgICB7ICAgICAgIC8vIDQ4MC1zYW1wbGUgaW50ZXIKKyAgICAgICAgICAgICA2MSwgIDkwLCAgOTMsICA2MCwgMTA1LCAgNDIsIDEwNywgIDQxLCAxMTAsICA0NSwgMTE2LCAgMzgsIDExMywgIDM4LAorICAgICAgICAgICAgMTEyLCAgMzgsIDEyNCwgIDI2LCAxMzIsICAyNywgMTM2LCAgMTksIDE0MCwgIDIwLCAxNTUsICAxNCwgMTU5LCAgMTYsCisgICAgICAgICAgICAxNTgsICAxOCwgMTcwLCAgMTMsIDE3NywgIDEwLCAxODcsICAgOCwgMTkyLCAgIDYsIDE3NSwgICA5LCAxNTksICAxMAorICAgICAgICB9LCB7ICAgIC8vIDQ4MC1zYW1wbGUgaW50cmEKKyAgICAgICAgICAgICAyMSwgMTc4LCAgNTksIDExMCwgIDcxLCAgODYsICA3NSwgIDg1LCAgODQsICA4MywgIDkxLCAgNjYsICA4OCwgIDczLAorICAgICAgICAgICAgIDg3LCAgNzIsICA5MiwgIDc1LCAgOTgsICA3MiwgMTA1LCAgNTgsIDEwNywgIDU0LCAxMTUsICA1MiwgMTE0LCAgNTUsCisgICAgICAgICAgICAxMTIsICA1NiwgMTI5LCAgNTEsIDEzMiwgIDQwLCAxNTAsICAzMywgMTQwLCAgMjksICA5OCwgIDM1LCAgNzcsICA0MgorICAgICAgICB9CisgICAgfSwgeworICAgICAgICB7ICAgICAgIC8vIDk2MC1zYW1wbGUgaW50ZXIKKyAgICAgICAgICAgICA0MiwgMTIxLCAgOTYsICA2NiwgMTA4LCAgNDMsIDExMSwgIDQwLCAxMTcsICA0NCwgMTIzLCAgMzIsIDEyMCwgIDM2LAorICAgICAgICAgICAgMTE5LCAgMzMsIDEyNywgIDMzLCAxMzQsICAzNCwgMTM5LCAgMjEsIDE0NywgIDIzLCAxNTIsICAyMCwgMTU4LCAgMjUsCisgICAgICAgICAgICAxNTQsICAyNiwgMTY2LCAgMjEsIDE3MywgIDE2LCAxODQsICAxMywgMTg0LCAgMTAsIDE1MCwgIDEzLCAxMzksICAxNQorICAgICAgICB9LCB7ICAgIC8vIDk2MC1zYW1wbGUgaW50cmEKKyAgICAgICAgICAgICAyMiwgMTc4LCAgNjMsIDExNCwgIDc0LCAgODIsICA4NCwgIDgzLCAgOTIsICA4MiwgMTAzLCAgNjIsICA5NiwgIDcyLAorICAgICAgICAgICAgIDk2LCAgNjcsIDEwMSwgIDczLCAxMDcsICA3MiwgMTEzLCAgNTUsIDExOCwgIDUyLCAxMjUsICA1MiwgMTE4LCAgNTIsCisgICAgICAgICAgICAxMTcsICA1NSwgMTM1LCAgNDksIDEzNywgIDM5LCAxNTcsICAzMiwgMTQ1LCAgMjksICA5NywgIDMzLCAgNzcsICA0MAorICAgICAgICB9CisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2VsdF9zdGF0aWNfYWxsb2NbMTFdWzIxXSA9IHsgIC8qIDEvMzIgYml0L3NhbXBsZSAqLworICAgIHsgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LAorICAgIHsgIDkwLCAgODAsICA3NSwgIDY5LCAgNjMsICA1NiwgIDQ5LCAgNDAsICAzNCwgIDI5LCAgMjAsICAxOCwgIDEwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LAorICAgIHsgMTEwLCAxMDAsICA5MCwgIDg0LCAgNzgsICA3MSwgIDY1LCAgNTgsICA1MSwgIDQ1LCAgMzksICAzMiwgIDI2LCAgMjAsICAxMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LAorICAgIHsgMTE4LCAxMTAsIDEwMywgIDkzLCAgODYsICA4MCwgIDc1LCAgNzAsICA2NSwgIDU5LCAgNTMsICA0NywgIDQwLCAgMzEsICAyMywgIDE1LCAgIDQsICAgMCwgICAwLCAgIDAsICAgMCB9LAorICAgIHsgMTI2LCAxMTksIDExMiwgMTA0LCAgOTUsICA4OSwgIDgzLCAgNzgsICA3MiwgIDY2LCAgNjAsICA1NCwgIDQ3LCAgMzksICAzMiwgIDI1LCAgMTcsICAxMiwgICAxLCAgIDAsICAgMCB9LAorICAgIHsgMTM0LCAxMjcsIDEyMCwgMTE0LCAxMDMsICA5NywgIDkxLCAgODUsICA3OCwgIDcyLCAgNjYsICA2MCwgIDU0LCAgNDcsICA0MSwgIDM1LCAgMjksICAyMywgIDE2LCAgMTAsICAgMSB9LAorICAgIHsgMTQ0LCAxMzcsIDEzMCwgMTI0LCAxMTMsIDEwNywgMTAxLCAgOTUsICA4OCwgIDgyLCAgNzYsICA3MCwgIDY0LCAgNTcsICA1MSwgIDQ1LCAgMzksICAzMywgIDI2LCAgMTUsICAgMSB9LAorICAgIHsgMTUyLCAxNDUsIDEzOCwgMTMyLCAxMjMsIDExNywgMTExLCAxMDUsICA5OCwgIDkyLCAgODYsICA4MCwgIDc0LCAgNjcsICA2MSwgIDU1LCAgNDksICA0MywgIDM2LCAgMjAsICAgMSB9LAorICAgIHsgMTYyLCAxNTUsIDE0OCwgMTQyLCAxMzMsIDEyNywgMTIxLCAxMTUsIDEwOCwgMTAyLCAgOTYsICA5MCwgIDg0LCAgNzcsICA3MSwgIDY1LCAgNTksICA1MywgIDQ2LCAgMzAsICAgMSB9LAorICAgIHsgMTcyLCAxNjUsIDE1OCwgMTUyLCAxNDMsIDEzNywgMTMxLCAxMjUsIDExOCwgMTEyLCAxMDYsIDEwMCwgIDk0LCAgODcsICA4MSwgIDc1LCAgNjksICA2MywgIDU2LCAgNDUsICAyMCB9LAorICAgIHsgMjAwLCAyMDAsIDIwMCwgMjAwLCAyMDAsIDIwMCwgMjAwLCAyMDAsIDE5OCwgMTkzLCAxODgsIDE4MywgMTc4LCAxNzMsIDE2OCwgMTYzLCAxNTgsIDE1MywgMTQ4LCAxMjksIDEwNCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjZWx0X3N0YXRpY19jYXBzWzRdWzJdWzIxXSA9IHsKKyAgICB7ICAgICAgIC8vIDEyMC1zYW1wbGUKKyAgICAgICAgezIyNCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAxNjAsIDE2MCwKKyAgICAgICAgIDE2MCwgMTYwLCAxODUsIDE4NSwgMTg1LCAxNzgsIDE3OCwgMTY4LCAxMzQsICA2MSwgIDM3fSwKKyAgICAgICAgezIyNCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyNDAsIDI0MCwKKyAgICAgICAgIDI0MCwgMjQwLCAyMDcsIDIwNywgMjA3LCAxOTgsIDE5OCwgMTgzLCAxNDQsICA2NiwgIDQwfSwKKyAgICB9LCB7ICAgIC8vIDI0MC1zYW1wbGUKKyAgICAgICAgezE2MCwgMTYwLCAxNjAsIDE2MCwgMTYwLCAxNjAsIDE2MCwgMTYwLCAxODUsIDE4NSwKKyAgICAgICAgIDE4NSwgMTg1LCAxOTMsIDE5MywgMTkzLCAxODMsIDE4MywgMTcyLCAxMzgsICA2NCwgIDM4fSwKKyAgICAgICAgezI0MCwgMjQwLCAyNDAsIDI0MCwgMjQwLCAyNDAsIDI0MCwgMjQwLCAyMDcsIDIwNywKKyAgICAgICAgIDIwNywgMjA3LCAyMDQsIDIwNCwgMjA0LCAxOTMsIDE5MywgMTgwLCAxNDMsICA2NiwgIDQwfSwKKyAgICB9LCB7ICAgIC8vIDQ4MC1zYW1wbGUKKyAgICAgICAgezE4NSwgMTg1LCAxODUsIDE4NSwgMTg1LCAxODUsIDE4NSwgMTg1LCAxOTMsIDE5MywKKyAgICAgICAgIDE5MywgMTkzLCAxOTMsIDE5MywgMTkzLCAxODMsIDE4MywgMTcyLCAxMzgsICA2NSwgIDM5fSwKKyAgICAgICAgezIwNywgMjA3LCAyMDcsIDIwNywgMjA3LCAyMDcsIDIwNywgMjA3LCAyMDQsIDIwNCwKKyAgICAgICAgIDIwNCwgMjA0LCAyMDEsIDIwMSwgMjAxLCAxODgsIDE4OCwgMTc2LCAxNDEsICA2NiwgIDQwfSwKKyAgICB9LCB7ICAgIC8vIDk2MC1zYW1wbGUKKyAgICAgICAgezE5MywgMTkzLCAxOTMsIDE5MywgMTkzLCAxOTMsIDE5MywgMTkzLCAxOTMsIDE5MywKKyAgICAgICAgIDE5MywgMTkzLCAxOTQsIDE5NCwgMTk0LCAxODQsIDE4NCwgMTczLCAxMzksICA2NSwgIDM5fSwKKyAgICAgICAgezIwNCwgMjA0LCAyMDQsIDIwNCwgMjA0LCAyMDQsIDIwNCwgMjA0LCAyMDEsIDIwMSwKKyAgICAgICAgIDIwMSwgMjAxLCAxOTgsIDE5OCwgMTk4LCAxODcsIDE4NywgMTc1LCAxNDAsICA2NiwgIDQwfQorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNlbHRfY2FjaGVfYml0c1szOTJdID0geworICAgIDQwLCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNDAsIDE1LCAyMywgMjgsCisgICAgMzEsIDM0LCAzNiwgMzgsIDM5LCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDcsIDQ5LCA1MCwKKyAgICA1MSwgNTIsIDUzLCA1NCwgNTUsIDU1LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjMsIDY1LAorICAgIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcxLCA0MCwgMjAsIDMzLCA0MSwgNDgsIDUzLCA1NywgNjEsCisgICAgNjQsIDY2LCA2OSwgNzEsIDczLCA3NSwgNzYsIDc4LCA4MCwgODIsIDg1LCA4NywgODksIDkxLCA5MiwKKyAgICA5NCwgOTYsIDk4LCAxMDEsIDEwMywgMTA1LCAxMDcsIDEwOCwgMTEwLCAxMTIsIDExNCwgMTE3LCAxMTksIDEyMSwgMTIzLAorICAgIDEyNCwgMTI2LCAxMjgsIDQwLCAyMywgMzksIDUxLCA2MCwgNjcsIDczLCA3OSwgODMsIDg3LCA5MSwgOTQsCisgICAgOTcsIDEwMCwgMTAyLCAxMDUsIDEwNywgMTExLCAxMTUsIDExOCwgMTIxLCAxMjQsIDEyNiwgMTI5LCAxMzEsIDEzNSwgMTM5LAorICAgIDE0MiwgMTQ1LCAxNDgsIDE1MCwgMTUzLCAxNTUsIDE1OSwgMTYzLCAxNjYsIDE2OSwgMTcyLCAxNzQsIDE3NywgMTc5LCAzNSwKKyAgICAyOCwgNDksIDY1LCA3OCwgODksIDk5LCAxMDcsIDExNCwgMTIwLCAxMjYsIDEzMiwgMTM2LCAxNDEsIDE0NSwgMTQ5LAorICAgIDE1MywgMTU5LCAxNjUsIDE3MSwgMTc2LCAxODAsIDE4NSwgMTg5LCAxOTIsIDE5OSwgMjA1LCAyMTEsIDIxNiwgMjIwLCAyMjUsCisgICAgMjI5LCAyMzIsIDIzOSwgMjQ1LCAyNTEsIDIxLCAzMywgNTgsIDc5LCA5NywgMTEyLCAxMjUsIDEzNywgMTQ4LCAxNTcsCisgICAgMTY2LCAxNzQsIDE4MiwgMTg5LCAxOTUsIDIwMSwgMjA3LCAyMTcsIDIyNywgMjM1LCAyNDMsIDI1MSwgMTcsIDM1LCA2MywKKyAgICA4NiwgMTA2LCAxMjMsIDEzOSwgMTUyLCAxNjUsIDE3NywgMTg3LCAxOTcsIDIwNiwgMjE0LCAyMjIsIDIzMCwgMjM3LCAyNTAsCisgICAgMjUsIDMxLCA1NSwgNzUsIDkxLCAxMDUsIDExNywgMTI4LCAxMzgsIDE0NiwgMTU0LCAxNjEsIDE2OCwgMTc0LCAxODAsCisgICAgMTg1LCAxOTAsIDIwMCwgMjA4LCAyMTUsIDIyMiwgMjI5LCAyMzUsIDI0MCwgMjQ1LCAyNTUsIDE2LCAzNiwgNjUsIDg5LAorICAgIDExMCwgMTI4LCAxNDQsIDE1OSwgMTczLCAxODUsIDE5NiwgMjA3LCAyMTcsIDIyNiwgMjM0LCAyNDIsIDI1MCwgMTEsIDQxLAorICAgIDc0LCAxMDMsIDEyOCwgMTUxLCAxNzIsIDE5MSwgMjA5LCAyMjUsIDI0MSwgMjU1LCA5LCA0MywgNzksIDExMCwgMTM4LAorICAgIDE2MywgMTg2LCAyMDcsIDIyNywgMjQ2LCAxMiwgMzksIDcxLCA5OSwgMTIzLCAxNDQsIDE2NCwgMTgyLCAxOTgsIDIxNCwKKyAgICAyMjgsIDI0MSwgMjUzLCA5LCA0NCwgODEsIDExMywgMTQyLCAxNjgsIDE5MiwgMjE0LCAyMzUsIDI1NSwgNywgNDksCisgICAgOTAsIDEyNywgMTYwLCAxOTEsIDIyMCwgMjQ3LCA2LCA1MSwgOTUsIDEzNCwgMTcwLCAyMDMsIDIzNCwgNywgNDcsCisgICAgODcsIDEyMywgMTU1LCAxODQsIDIxMiwgMjM3LCA2LCA1MiwgOTcsIDEzNywgMTc0LCAyMDgsIDI0MCwgNSwgNTcsCisgICAgMTA2LCAxNTEsIDE5MiwgMjMxLCA1LCA1OSwgMTExLCAxNTgsIDIwMiwgMjQzLCA1LCA1NSwgMTAzLCAxNDcsIDE4NywKKyAgICAyMjQsIDUsIDYwLCAxMTMsIDE2MSwgMjA2LCAyNDgsIDQsIDY1LCAxMjIsIDE3NSwgMjI0LCA0LCA2NywgMTI3LAorICAgIDE4MiwgMjM0Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjZWx0X2NhY2hlX2luZGV4WzEwNV0gPSB7CisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAwLCAwLCA0MSwgNDEsIDQxLAorICAgIDgyLCA4MiwgMTIzLCAxNjQsIDIwMCwgMjIyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA0MSwKKyAgICA0MSwgNDEsIDQxLCAxMjMsIDEyMywgMTIzLCAxNjQsIDE2NCwgMjQwLCAyNjYsIDI4MywgMjk1LCA0MSwgNDEsIDQxLAorICAgIDQxLCA0MSwgNDEsIDQxLCA0MSwgMTIzLCAxMjMsIDEyMywgMTIzLCAyNDAsIDI0MCwgMjQwLCAyNjYsIDI2NiwgMzA1LAorICAgIDMxOCwgMzI4LCAzMzYsIDEyMywgMTIzLCAxMjMsIDEyMywgMTIzLCAxMjMsIDEyMywgMTIzLCAyNDAsIDI0MCwgMjQwLCAyNDAsCisgICAgMzA1LCAzMDUsIDMwNSwgMzE4LCAzMTgsIDM0MywgMzUxLCAzNTgsIDM2NCwgMjQwLCAyNDAsIDI0MCwgMjQwLCAyNDAsIDI0MCwKKyAgICAyNDAsIDI0MCwgMzA1LCAzMDUsIDMwNSwgMzA1LCAzNDMsIDM0MywgMzQzLCAzNTEsIDM1MSwgMzcwLCAzNzYsIDM4MiwgMzg3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2VsdF9sb2cyX2ZyYWNbXSA9IHsKKyAgICAwLCA4LCAxMywgMTYsIDE5LCAyMSwgMjMsIDI0LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzIsIDMzLCAzNCwgMzQsIDM1LCAzNiwgMzYsIDM3LCAzNworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2VsdF9iaXRfaW50ZXJsZWF2ZVtdID0geworICAgIDAsIDEsIDEsIDEsIDIsIDMsIDMsIDMsIDIsIDMsIDMsIDMsIDIsIDMsIDMsIDMKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNlbHRfYml0X2RlaW50ZXJsZWF2ZVtdID0geworICAgIDB4MDAsIDB4MDMsIDB4MEMsIDB4MEYsIDB4MzAsIDB4MzMsIDB4M0MsIDB4M0YsCisgICAgMHhDMCwgMHhDMywgMHhDQywgMHhDRiwgMHhGMCwgMHhGMywgMHhGQywgMHhGRgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2VsdF9oYWRhbWFyZF9vcmRlcnlbXSA9IHsKKyAgICAxLCAgIDAsCisgICAgMywgICAwLCAgMiwgIDEsCisgICAgNywgICAwLCAgNCwgIDMsICA2LCAgMSwgIDUsICAyLAorICAgIDE1LCAgMCwgIDgsICA3LCAxMiwgIDMsIDExLCAgNCwgMTQsICAxLCAgOSwgIDYsIDEzLCAgMiwgMTAsICA1Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2VsdF9xbl9leHAyW10gPSB7CisgICAgMTYzODQsIDE3ODY2LCAxOTQ4MywgMjEyNDcsIDIzMTcwLCAyNTI2NywgMjc1NTQsIDMwMDQ4Cit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgY2VsdF9wdnFfdVsxMjcyXSA9IHsKKyAgICAvKiBOID0gMCwgSyA9IDAuLi4xNzYgKi8KKyAgICAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIC8qIE4gPSAxLCBLID0gMS4uLjE3NiAqLworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgLyogTiA9IDIsIEsgPSAyLi4uMTc2ICovCisgICAgMywgNSwgNywgOSwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMSwgMjMsIDI1LCAyNywgMjksIDMxLCAzMywgMzUsIDM3LCAzOSwgNDEsCisgICAgNDMsIDQ1LCA0NywgNDksIDUxLCA1MywgNTUsIDU3LCA1OSwgNjEsIDYzLCA2NSwgNjcsIDY5LCA3MSwgNzMsIDc1LCA3NywgNzksCisgICAgODEsIDgzLCA4NSwgODcsIDg5LCA5MSwgOTMsIDk1LCA5NywgOTksIDEwMSwgMTAzLCAxMDUsIDEwNywgMTA5LCAxMTEsIDExMywKKyAgICAxMTUsIDExNywgMTE5LCAxMjEsIDEyMywgMTI1LCAxMjcsIDEyOSwgMTMxLCAxMzMsIDEzNSwgMTM3LCAxMzksIDE0MSwgMTQzLAorICAgIDE0NSwgMTQ3LCAxNDksIDE1MSwgMTUzLCAxNTUsIDE1NywgMTU5LCAxNjEsIDE2MywgMTY1LCAxNjcsIDE2OSwgMTcxLCAxNzMsCisgICAgMTc1LCAxNzcsIDE3OSwgMTgxLCAxODMsIDE4NSwgMTg3LCAxODksIDE5MSwgMTkzLCAxOTUsIDE5NywgMTk5LCAyMDEsIDIwMywKKyAgICAyMDUsIDIwNywgMjA5LCAyMTEsIDIxMywgMjE1LCAyMTcsIDIxOSwgMjIxLCAyMjMsIDIyNSwgMjI3LCAyMjksIDIzMSwgMjMzLAorICAgIDIzNSwgMjM3LCAyMzksIDI0MSwgMjQzLCAyNDUsIDI0NywgMjQ5LCAyNTEsIDI1MywgMjU1LCAyNTcsIDI1OSwgMjYxLCAyNjMsCisgICAgMjY1LCAyNjcsIDI2OSwgMjcxLCAyNzMsIDI3NSwgMjc3LCAyNzksIDI4MSwgMjgzLCAyODUsIDI4NywgMjg5LCAyOTEsIDI5MywKKyAgICAyOTUsIDI5NywgMjk5LCAzMDEsIDMwMywgMzA1LCAzMDcsIDMwOSwgMzExLCAzMTMsIDMxNSwgMzE3LCAzMTksIDMyMSwgMzIzLAorICAgIDMyNSwgMzI3LCAzMjksIDMzMSwgMzMzLCAzMzUsIDMzNywgMzM5LCAzNDEsIDM0MywgMzQ1LCAzNDcsIDM0OSwgMzUxLAorICAgIC8qIE4gPSAzLCBLID0gMy4uLjE3NiAqLworICAgIDEzLCAyNSwgNDEsIDYxLCA4NSwgMTEzLCAxNDUsIDE4MSwgMjIxLCAyNjUsIDMxMywgMzY1LCA0MjEsIDQ4MSwgNTQ1LCA2MTMsCisgICAgNjg1LCA3NjEsIDg0MSwgOTI1LCAxMDEzLCAxMTA1LCAxMjAxLCAxMzAxLCAxNDA1LCAxNTEzLCAxNjI1LCAxNzQxLCAxODYxLAorICAgIDE5ODUsIDIxMTMsIDIyNDUsIDIzODEsIDI1MjEsIDI2NjUsIDI4MTMsIDI5NjUsIDMxMjEsIDMyODEsIDM0NDUsIDM2MTMsIDM3ODUsCisgICAgMzk2MSwgNDE0MSwgNDMyNSwgNDUxMywgNDcwNSwgNDkwMSwgNTEwMSwgNTMwNSwgNTUxMywgNTcyNSwgNTk0MSwgNjE2MSwgNjM4NSwKKyAgICA2NjEzLCA2ODQ1LCA3MDgxLCA3MzIxLCA3NTY1LCA3ODEzLCA4MDY1LCA4MzIxLCA4NTgxLCA4ODQ1LCA5MTEzLCA5Mzg1LCA5NjYxLAorICAgIDk5NDEsIDEwMjI1LCAxMDUxMywgMTA4MDUsIDExMTAxLCAxMTQwMSwgMTE3MDUsIDEyMDEzLCAxMjMyNSwgMTI2NDEsIDEyOTYxLAorICAgIDEzMjg1LCAxMzYxMywgMTM5NDUsIDE0MjgxLCAxNDYyMSwgMTQ5NjUsIDE1MzEzLCAxNTY2NSwgMTYwMjEsIDE2MzgxLCAxNjc0NSwKKyAgICAxNzExMywgMTc0ODUsIDE3ODYxLCAxODI0MSwgMTg2MjUsIDE5MDEzLCAxOTQwNSwgMTk4MDEsIDIwMjAxLCAyMDYwNSwgMjEwMTMsCisgICAgMjE0MjUsIDIxODQxLCAyMjI2MSwgMjI2ODUsIDIzMTEzLCAyMzU0NSwgMjM5ODEsIDI0NDIxLCAyNDg2NSwgMjUzMTMsIDI1NzY1LAorICAgIDI2MjIxLCAyNjY4MSwgMjcxNDUsIDI3NjEzLCAyODA4NSwgMjg1NjEsIDI5MDQxLCAyOTUyNSwgMzAwMTMsIDMwNTA1LCAzMTAwMSwKKyAgICAzMTUwMSwgMzIwMDUsIDMyNTEzLCAzMzAyNSwgMzM1NDEsIDM0MDYxLCAzNDU4NSwgMzUxMTMsIDM1NjQ1LCAzNjE4MSwgMzY3MjEsCisgICAgMzcyNjUsIDM3ODEzLCAzODM2NSwgMzg5MjEsIDM5NDgxLCA0MDA0NSwgNDA2MTMsIDQxMTg1LCA0MTc2MSwgNDIzNDEsIDQyOTI1LAorICAgIDQzNTEzLCA0NDEwNSwgNDQ3MDEsIDQ1MzAxLCA0NTkwNSwgNDY1MTMsIDQ3MTI1LCA0Nzc0MSwgNDgzNjEsIDQ4OTg1LCA0OTYxMywKKyAgICA1MDI0NSwgNTA4ODEsIDUxNTIxLCA1MjE2NSwgNTI4MTMsIDUzNDY1LCA1NDEyMSwgNTQ3ODEsIDU1NDQ1LCA1NjExMywgNTY3ODUsCisgICAgNTc0NjEsIDU4MTQxLCA1ODgyNSwgNTk1MTMsIDYwMjA1LCA2MDkwMSwgNjE2MDEsCisgICAgLyogTiA9IDQsIEsgPSA0Li4uMTc2ICovCisgICAgNjMsIDEyOSwgMjMxLCAzNzcsIDU3NSwgODMzLCAxMTU5LCAxNTYxLCAyMDQ3LCAyNjI1LCAzMzAzLCA0MDg5LCA0OTkxLCA2MDE3LAorICAgIDcxNzUsIDg0NzMsIDk5MTksIDExNTIxLCAxMzI4NywgMTUyMjUsIDE3MzQzLCAxOTY0OSwgMjIxNTEsIDI0ODU3LCAyNzc3NSwKKyAgICAzMDkxMywgMzQyNzksIDM3ODgxLCA0MTcyNywgNDU4MjUsIDUwMTgzLCA1NDgwOSwgNTk3MTEsIDY0ODk3LCA3MDM3NSwgNzYxNTMsCisgICAgODIyMzksIDg4NjQxLCA5NTM2NywgMTAyNDI1LCAxMDk4MjMsIDExNzU2OSwgMTI1NjcxLCAxMzQxMzcsIDE0Mjk3NSwgMTUyMTkzLAorICAgIDE2MTc5OSwgMTcxODAxLCAxODIyMDcsIDE5MzAyNSwgMjA0MjYzLCAyMTU5MjksIDIyODAzMSwgMjQwNTc3LCAyNTM1NzUsCisgICAgMjY3MDMzLCAyODA5NTksIDI5NTM2MSwgMzEwMjQ3LCAzMjU2MjUsIDM0MTUwMywgMzU3ODg5LCAzNzQ3OTEsIDM5MjIxNywKKyAgICA0MTAxNzUsIDQyODY3MywgNDQ3NzE5LCA0NjczMjEsIDQ4NzQ4NywgNTA4MjI1LCA1Mjk1NDMsIDU1MTQ0OSwgNTczOTUxLAorICAgIDU5NzA1NywgNjIwNzc1LCA2NDUxMTMsIDY3MDA3OSwgNjk1NjgxLCA3MjE5MjcsIDc0ODgyNSwgNzc2MzgzLCA4MDQ2MDksCisgICAgODMzNTExLCA4NjMwOTcsIDg5MzM3NSwgOTI0MzUzLCA5NTYwMzksIDk4ODQ0MSwgMTAyMTU2NywgMTA1NTQyNSwgMTA5MDAyMywKKyAgICAxMTI1MzY5LCAxMTYxNDcxLCAxMTk4MzM3LCAxMjM1OTc1LCAxMjc0MzkzLCAxMzEzNTk5LCAxMzUzNjAxLCAxMzk0NDA3LAorICAgIDE0MzYwMjUsIDE0Nzg0NjMsIDE1MjE3MjksIDE1NjU4MzEsIDE2MTA3NzcsIDE2NTY1NzUsIDE3MDMyMzMsIDE3NTA3NTksCisgICAgMTc5OTE2MSwgMTg0ODQ0NywgMTg5ODYyNSwgMTk0OTcwMywgMjAwMTY4OSwgMjA1NDU5MSwgMjEwODQxNywgMjE2MzE3NSwKKyAgICAyMjE4ODczLCAyMjc1NTE5LCAyMzMzMTIxLCAyMzkxNjg3LCAyNDUxMjI1LCAyNTExNzQzLCAyNTczMjQ5LCAyNjM1NzUxLAorICAgIDI2OTkyNTcsIDI3NjM3NzUsIDI4MjkzMTMsIDI4OTU4NzksIDI5NjM0ODEsIDMwMzIxMjcsIDMxMDE4MjUsIDMxNzI1ODMsCisgICAgMzI0NDQwOSwgMzMxNzMxMSwgMzM5MTI5NywgMzQ2NjM3NSwgMzU0MjU1MywgMzYxOTgzOSwgMzY5ODI0MSwgMzc3Nzc2NywKKyAgICAzODU4NDI1LCAzOTQwMjIzLCA0MDIzMTY5LCA0MTA3MjcxLCA0MTkyNTM3LCA0Mjc4OTc1LCA0MzY2NTkzLCA0NDU1Mzk5LAorICAgIDQ1NDU0MDEsIDQ2MzY2MDcsIDQ3MjkwMjUsIDQ4MjI2NjMsIDQ5MTc1MjksIDUwMTM2MzEsIDUxMTA5NzcsIDUyMDk1NzUsCisgICAgNTMwOTQzMywgNTQxMDU1OSwgNTUxMjk2MSwgNTYxNjY0NywgNTcyMTYyNSwgNTgyNzkwMywgNTkzNTQ4OSwgNjA0NDM5MSwKKyAgICA2MTU0NjE3LCA2MjY2MTc1LCA2Mzc5MDczLCA2NDkzMzE5LCA2NjA4OTIxLCA2NzI1ODg3LCA2ODQ0MjI1LCA2OTYzOTQzLAorICAgIDcwODUwNDksIDcyMDc1NTEsCisgICAgLyogTiA9IDUsIEsgPSA1Li4uMTc2ICovCisgICAgMzIxLCA2ODEsIDEyODksIDIyNDEsIDM2NDksIDU2NDEsIDgzNjEsIDExOTY5LCAxNjY0MSwgMjI1NjksIDI5OTYxLCAzOTA0MSwKKyAgICA1MDA0OSwgNjMyNDEsIDc4ODg5LCA5NzI4MSwgMTE4NzIxLCAxNDM1MjksIDE3MjA0MSwgMjA0NjA5LCAyNDE2MDEsIDI4MzQwMSwKKyAgICAzMzA0MDksIDM4MzA0MSwgNDQxNzI5LCA1MDY5MjEsIDU3OTA4MSwgNjU4Njg5LCA3NDYyNDEsIDg0MjI0OSwgOTQ3MjQxLAorICAgIDEwNjE3NjEsIDExODYzNjksIDEzMjE2NDEsIDE0NjgxNjksIDE2MjY1NjEsIDE3OTc0NDEsIDE5ODE0NDksIDIxNzkyNDEsCisgICAgMjM5MTQ4OSwgMjYxODg4MSwgMjg2MjEyMSwgMzEyMTkyOSwgMzM5OTA0MSwgMzY5NDIwOSwgNDAwODIwMSwgNDM0MTgwMSwKKyAgICA0Njk1ODA5LCA1MDcxMDQxLCA1NDY4MzI5LCA1ODg4NTIxLCA2MzMyNDgxLCA2ODAxMDg5LCA3Mjk1MjQxLCA3ODE1ODQ5LAorICAgIDgzNjM4NDEsIDg5NDAxNjEsIDk1NDU3NjksIDEwMTgxNjQxLCAxMDg0ODc2OSwgMTE1NDgxNjEsIDEyMjgwODQxLCAxMzA0Nzg0OSwKKyAgICAxMzg1MDI0MSwgMTQ2ODkwODksIDE1NTY1NDgxLCAxNjQ4MDUyMSwgMTc0MzUzMjksIDE4NDMxMDQxLCAxOTQ2ODgwOSwKKyAgICAyMDU0OTgwMSwgMjE2NzUyMDEsIDIyODQ2MjA5LCAyNDA2NDA0MSwgMjUzMjk5MjksIDI2NjQ1MTIxLCAyODAxMDg4MSwKKyAgICAyOTQyODQ4OSwgMzA4OTkyNDEsIDMyNDI0NDQ5LCAzNDAwNTQ0MSwgMzU2NDM1NjEsIDM3MzQwMTY5LCAzOTA5NjY0MSwKKyAgICA0MDkxNDM2OSwgNDI3OTQ3NjEsIDQ0NzM5MjQxLCA0Njc0OTI0OSwgNDg4MjYyNDEsIDUwOTcxNjg5LCA1MzE4NzA4MSwKKyAgICA1NTQ3MzkyMSwgNTc4MzM3MjksIDYwMjY4MDQxLCA2Mjc3ODQwOSwgNjUzNjY0MDEsIDY4MDMzNjAxLCA3MDc4MTYwOSwKKyAgICA3MzYxMjA0MSwgNzY1MjY1MjksIDc5NTI2NzIxLCA4MjYxNDI4MSwgODU3OTA4ODksIDg5MDU4MjQxLCA5MjQxODA0OSwKKyAgICA5NTg3MjA0MSwgOTk0MjE5NjEsIDEwMzA2OTU2OSwgMTA2ODE2NjQxLCAxMTA2NjQ5NjksIDExNDYxNjM2MSwgMTE4NjcyNjQxLAorICAgIDEyMjgzNTY0OSwgMTI3MTA3MjQxLCAxMzE0ODkyODksIDEzNTk4MzY4MSwgMTQwNTkyMzIxLCAxNDUzMTcxMjksIDE1MDE2MDA0MSwKKyAgICAxNTUxMjMwMDksIDE2MDIwODAwMSwgMTY1NDE3MDAxLCAxNzA3NTIwMDksIDE3NjIxNTA0MSwgMTgxODA4MTI5LCAxODc1MzMzMjEsCisgICAgMTkzMzkyNjgxLCAxOTkzODgyODksIDIwNTUyMjI0MSwgMjExNzk2NjQ5LCAyMTgyMTM2NDEsIDIyNDc3NTM2MSwgMjMxNDgzOTY5LAorICAgIDIzODM0MTY0MSwgMjQ1MzUwNTY5LCAyNTI1MTI5NjEsIDI1OTgzMTA0MSwgMjY3MzA3MDQ5LCAyNzQ5NDMyNDEsIDI4Mjc0MTg4OSwKKyAgICAyOTA3MDUyODEsIDI5ODgzNTcyMSwgMzA3MTM1NTI5LCAzMTU2MDcwNDEsIDMyNDI1MjYwOSwgMzMzMDc0NjAxLCAzNDIwNzU0MDEsCisgICAgMzUxMjU3NDA5LCAzNjA2MjMwNDEsIDM3MDE3NDcyOSwgMzc5OTE0OTIxLCAzODk4NDYwODEsIDM5OTk3MDY4OSwgNDEwMjkxMjQxLAorICAgIDQyMDgxMDI0OSwgNDMxNTMwMjQxLCA0NDI0NTM3NjEsIDQ1MzU4MzM2OSwgNDY0OTIxNjQxLCA0NzY0NzExNjksIDQ4ODIzNDU2MSwKKyAgICA1MDAyMTQ0NDEsIDUxMjQxMzQ0OSwgNTI0ODM0MjQxLCA1Mzc0Nzk0ODksIDU1MDM1MTg4MSwgNTYzNDU0MTIxLCA1NzY3ODg5MjksCisgICAgNTkwMzU5MDQxLCA2MDQxNjcyMDksIDYxODIxNjIwMSwgNjMyNTA4ODAxLAorICAgIC8qIE4gPSA2LCBLID0gNi4uLjk2ICh0ZWNobmljYWxseSBWKDEwOSw1KSBmaXRzIGluIDMyIGJpdHMsIGJ1dCB0aGF0IGNhbid0IGJlCisgICAgIGFjaGlldmVkIGJ5IHNwbGl0dGluZyBhbiBPcHVzIGJhbmQpICovCisgICAgMTY4MywgMzY1MywgNzE4MywgMTMwNzMsIDIyMzYzLCAzNjM2NSwgNTY2OTUsIDg1MzA1LCAxMjQ1MTUsIDE3NzA0NSwgMjQ2MDQ3LAorICAgIDMzNTEzNywgNDQ4NDI3LCA1OTA1NTcsIDc2NjcyNywgOTgyNzI5LCAxMjQ0OTc5LCAxNTYwNTQ5LCAxOTM3MTk5LCAyMzgzNDA5LAorICAgIDI5MDg0MTEsIDM1MjIyMjEsIDQyMzU2NzEsIDUwNjA0NDEsIDYwMDkwOTEsIDcwOTUwOTMsIDgzMzI4NjMsIDk3Mzc3OTMsCisgICAgMTEzMjYyODMsIDEzMTE1NzczLCAxNTEyNDc3NSwgMTczNzI5MDUsIDE5ODgwOTE1LCAyMjY3MDcyNSwgMjU3NjU0NTUsCisgICAgMjkxODk0NTcsIDMyOTY4MzQ3LCAzNzEyOTAzNywgNDE2OTk3NjcsIDQ2NzEwMTM3LCA1MjE5MTEzOSwgNTgxNzUxODksCisgICAgNjQ2OTYxNTksIDcxNzg5NDA5LCA3OTQ5MTgxOSwgODc4NDE4MjEsIDk2ODc5NDMxLCAxMDY2NDYyODEsIDExNzE4NTY1MSwKKyAgICAxMjg1NDI1MDEsIDE0MDc2MzUwMywgMTUzODk3MDczLCAxNjc5OTM0MDMsIDE4MzEwNDQ5MywgMTk5Mjg0MTgzLCAyMTY1ODgxODUsCisgICAgMjM1MDc0MTE1LCAyNTQ4MDE1MjUsIDI3NTgzMTkzNSwgMjk4MjI4ODY1LCAzMjIwNTc4NjcsIDM0NzM4NjU1NywgMzc0Mjg0NjQ3LAorICAgIDQwMjgyMzk3NywgNDMzMDc4NTQ3LCA0NjUxMjQ1NDksIDQ5OTA0MDM5OSwgNTM0OTA2NzY5LCA1NzI4MDY2MTksIDYxMjgyNTIyOSwKKyAgICA2NTUwNTAyMzEsIDY5OTU3MTY0MSwgNzQ2NDgxODkxLCA3OTU4NzU4NjEsIDg0Nzg1MDkxMSwgOTAyNTA2OTEzLCA5NTk5NDYyODMsCisgICAgMTAyMDI3NDAxMywgMTA4MzU5NzcwMywgMTE1MDAyNzU5MywgMTIxOTY3NjU5NSwgMTI5MjY2MDMyNSwgMTM2OTA5NzEzNSwKKyAgICAxNDQ5MTA4MTQ1LCAxNTMyODE3Mjc1LCAxNjIwMzUxMjc3LCAxNzExODM5NzY3LCAxODA3NDE1MjU3LCAxOTA3MjEzMTg3LAorICAgIDIwMTEzNzE5NTcsIDIxMjAwMzI5NTksCisgICAgLyogTiA9IDcsIEsgPSA3Li4uNTQgKHRlY2huaWNhbGx5IFYoNjAsNikgZml0cyBpbiAzMiBiaXRzLCBidXQgdGhhdCBjYW4ndCBiZQorICAgICBhY2hpZXZlZCBieSBzcGxpdHRpbmcgYW4gT3B1cyBiYW5kKSAqLworICAgIDg5ODksIDE5ODI1LCA0MDA4MSwgNzU1MTcsIDEzNDI0NSwgMjI3MzA1LCAzNjkzMDUsIDU3OTEyNSwgODgwNjg1LCAxMzAzNzc3LAorICAgIDE4ODQ5NjEsIDI2Njg1MjUsIDM3MDc1MDksIDUwNjQ3OTMsIDY4MTQyNDksIDkwNDE5NTcsIDExODQ3NDg1LCAxNTM0NTIzMywKKyAgICAxOTY2NTg0MSwgMjQ5NTc2NjEsIDMxMzg4MjkzLCAzOTE0NjE4NSwgNDg0NDIyOTcsIDU5NTExODI5LCA3MjYxNjAxMywKKyAgICA4ODA0Mzk2OSwgMTA2MTE0NjI1LCAxMjcxNzg3MDEsIDE1MTYyMDc1NywgMTc5ODYxMzA1LCAyMTIzNTg5ODUsIDI0OTYxMjgwNSwKKyAgICAyOTIxNjQ0NDUsIDM0MDYwMDYyNSwgMzk1NTU1NTM3LCA0NTc3MTMzNDEsIDUyNzgxMDcyNSwgNjA2NjM5NTI5LCA2OTUwNDk0MzMsCisgICAgNzkzOTUwNzA5LCA5MDQzMTcwMzcsIDEwMjcxODgzODUsIDExNjM2NzM5NTMsIDEzMTQ5NTUxODEsIDE0ODIyODg4MjEsCisgICAgMTY2NzAxMDA3MywgMTg3MDUzNTc4NSwgMjA5NDM2NzcxNywKKyAgICAvKiBOID0gOCwgSyA9IDguLi4zNyAodGVjaG5pY2FsbHkgVig0MCw3KSBmaXRzIGluIDMyIGJpdHMsIGJ1dCB0aGF0IGNhbid0IGJlCisgICAgIGFjaGlldmVkIGJ5IHNwbGl0dGluZyBhbiBPcHVzIGJhbmQpICovCisgICAgNDg2MzksIDEwODU0NSwgMjI0MTQzLCA0MzM5MDUsIDc5NTQ1NSwgMTM5MjA2NSwgMjM0MDQ5NSwgMzgwMDMwNSwgNTk4NDc2NywKKyAgICA5MTczNTA1LCAxMzcyNjk5MSwgMjAxMDMwMjUsIDI4ODc1MzI3LCA0MDc1NDM2OSwgNTY2MTA1NzUsIDc3NTAwMDE3LAorICAgIDEwNDY5MjczNSwgMTM5NzAzODA5LCAxODQzMjczMTEsIDI0MDY3MzI2NSwgMzExMjA3NzQzLCAzOTg3OTYyMjUsIDUwNjc1MDM1MSwKKyAgICA2Mzg4NzgxOTMsIDc5OTUzODE3NSwgOTkzNjk2NzY5LCAxMjI2OTkwMDk1LCAxNTA1Nzg5NTUzLCAxODM3MjcxNjE1LAorICAgIDIyMjk0OTE5MDUsCisgICAgLyogTiA9IDksIEsgPSA5Li4uMjggKHRlY2huaWNhbGx5IFYoMjksOCkgZml0cyBpbiAzMiBiaXRzLCBidXQgdGhhdCBjYW4ndCBiZQorICAgICBhY2hpZXZlZCBieSBzcGxpdHRpbmcgYW4gT3B1cyBiYW5kKSAqLworICAgIDI2NTcyOSwgNTk4NDE3LCAxMjU2NDY1LCAyNDg1ODI1LCA0NjczMzQ1LCA4NDA1OTA1LCAxNDU0NjcwNSwgMjQzMzE3NzcsCisgICAgMzk0OTAwNDksIDYyMzkwNTQ1LCA5NjIyMDU2MSwgMTQ1MTk4OTEzLCAyMTQ4Mjg2MDksIDMxMjE5MzU1MywgNDQ2MzA0MTQ1LAorICAgIDYyODQ5Njg5NywgODcyODkzNDQxLCAxMTk2OTI0NTYxLCAxNjIxOTI1MTM3LCAyMTczODA2MTQ1LAorICAgIC8qIE4gPSAxMCwgSyA9IDEwLi4uMjQgKi8KKyAgICAxNDYyNTYzLCAzMzE3NDQ1LCA3MDU5NzM1LCAxNDIxODkwNSwgMjcyOTgxNTUsIDUwMjUwNzY1LCA4OTEyOTI0NywgMTUyOTUxMDczLAorICAgIDI1NDgzMTY2NywgNDEzNDQyNzczLCA2NTQ4NjIyNDcsIDEwMTQ4ODk3NjksIDE1NDE5MTE5MzEsIDIzMDA0MDk2MjksCisgICAgMzM3NTIxMDY3MSwKKyAgICAvKiBOID0gMTEsIEsgPSAxMS4uLjE5ICh0ZWNobmljYWxseSBWKDIwLDEwKSBmaXRzIGluIDMyIGJpdHMsIGJ1dCB0aGF0IGNhbid0IGJlCisgICAgIGFjaGlldmVkIGJ5IHNwbGl0dGluZyBhbiBPcHVzIGJhbmQpICovCisgICAgODA5NzQ1MywgMTg0NzQ2MzMsIDM5NzUzMjczLCA4MTI3MDMzMywgMTU4ODE5MjUzLCAyOTgxOTkyNjUsIDU0MDI3OTU4NSwKKyAgICA5NDgwNjIzMjUsIDE2MTYzMzY3NjUsCisgICAgLyogTiA9IDEyLCBLID0gMTIuLi4xOCAqLworICAgIDQ1MDQ2NzE5LCAxMDMyNzQ2MjUsIDIyNDI5ODIzMSwgNDY0Mzg3ODE3LCA5MjE0MDYzMzUsIDE3NTk4ODUxODUsCisgICAgMzI0ODIyNzA5NSwKKyAgICAvKiBOID0gMTMsIEsgPSAxMy4uLjE2ICovCisgICAgMjUxNTk1OTY5LCA1NzkxNjg4MjUsIDEyNjc4NTQ4NzMsIDI2NTM2NDkwMjUsCisgICAgLyogTiA9IDE0LCBLID0gMTQgKi8KKyAgICAxNDA5OTMzNjE5Cit9OworCitERUNMQVJFX0FMSUdORUQoMzIsIHN0YXRpYyBjb25zdCBmbG9hdCwgY2VsdF93aW5kb3cpWzEyMF0gPSB7CisgICAgNi43Mjg2OTY2ZS0wNWYsIDAuMDAwNjA1NTEzNDhmLCAwLjAwMTY4MTU5NzBmLCAwLjAwMzI5NDc5NjJmLCAwLjAwNTQ0Mzk5NDNmLAorICAgIDAuMDA4MTI3NjkyM2YsIDAuMDExMzQ0MDAxZiwgMC4wMTUwOTA2MzNmLCAwLjAxOTM2NDg4NmYsIDAuMDI0MTYzNjM1ZiwKKyAgICAwLjAyOTQ4MzMxNWYsIDAuMDM1MzE5OTA1ZiwgMC4wNDE2Njg5MTFmLCAwLjA0ODUyNTM0N2YsIDAuMDU1ODgzNzE4ZiwKKyAgICAwLjA2MzczNzk5OWYsIDAuMDcyMDgxNjE2ZiwgMC4wODA5MDc0MjhmLCAwLjA5MDIwNzcwNWYsIDAuMDk5OTc0MTExZiwKKyAgICAwLjExMDE5NzY5ZiwgMC4xMjA4Njg4M2YsIDAuMTMxOTc3MjlmLCAwLjE0MzUxMjE0ZiwgMC4xNTU0NjE3N2YsCisgICAgMC4xNjc4MTM4OWYsIDAuMTgwNTU1NTBmLCAwLjE5MzY3MjkwZiwgMC4yMDcxNTE3MWYsIDAuMjIwOTc2ODJmLAorICAgIDAuMjM1MTMyNDNmLCAwLjI0OTYwMjA4ZiwgMC4yNjQzNjg2MGYsIDAuMjc5NDE0MTlmLCAwLjI5NDcyMDQwZiwKKyAgICAwLjMxMDI2ODE4ZiwgMC4zMjYwMzc4OGYsIDAuMzQyMDA5MzFmLCAwLjM1ODE2MTc3ZiwgMC4zNzQ0NzQwN2YsCisgICAgMC4zOTA5MjQ2MmYsIDAuNDA3NDkxNDJmLCAwLjQyNDE1MjE1ZiwgMC40NDA4ODQyM2YsIDAuNDU3NjY0ODRmLAorICAgIDAuNDc0NDcxMDRmLCAwLjQ5MTI3OTc4ZiwgMC41MDgwNjc5OGYsIDAuNTI0ODEyNjFmLCAwLjU0MTQ5MDc3ZiwKKyAgICAwLjU1ODA3OTczZiwgMC41NzQ1NTcwMWYsIDAuNTkwOTAwNDlmLCAwLjYwNzA4ODQxZiwgMC42MjMwOTk1MWYsCisgICAgMC42Mzg5MTMwNmYsIDAuNjU0NTA4OTZmLCAwLjY2OTg2Nzc2ZiwgMC42ODQ5NzA3N2YsIDAuNjk5ODAwMTBmLAorICAgIDAuNzE0MzM4NzNmLCAwLjcyODU3MDU1ZiwgMC43NDI0ODA0M2YsIDAuNzU2MDU0MjRmLCAwLjc2OTI3ODk1ZiwKKyAgICAwLjc4MjE0MjU3ZiwgMC43OTQ2MzQzMGYsIDAuODA2NzQ0NDVmLCAwLjgxODQ2NDU2ZiwgMC44Mjk3ODczM2YsCisgICAgMC44NDA3MDY2OWYsIDAuODUxMjE3NzlmLCAwLjg2MTMxNjk4ZiwgMC44NzEwMDE4M2YsIDAuODgwMjcxMTFmLAorICAgIDAuODg5MTI0NzlmLCAwLjg5NzU2Mzk4ZiwgMC45MDU1OTA5NGYsIDAuOTEzMjA5MDRmLCAwLjkyMDQyMjcwZiwKKyAgICAwLjkyNzIzNzM4ZiwgMC45MzM2NTk1NWYsIDAuOTM5Njk2NTZmLCAwLjk0NTM1NjcxZiwgMC45NTA2NDkwN2YsCisgICAgMC45NTU1ODM1M2YsIDAuOTYwMTcwNjdmLCAwLjk2NDQyMTcxZiwgMC45NjgzNDg0OWYsIDAuOTcxOTYzMzRmLAorICAgIDAuOTc1Mjc5MDZmLCAwLjk3ODMwODgzZiwgMC45ODEwNjYxNmYsIDAuOTgzNTY0ODBmLCAwLjk4NTgxODY5ZiwKKyAgICAwLjk4Nzg0MTkxZiwgMC45ODk2NDg1NmYsIDAuOTkxMjUyNzRmLCAwLjk5MjY2ODQ5ZiwgMC45OTM5MDk2OWYsCisgICAgMC45OTQ5OTAwNGYsIDAuOTk1OTIyOTdmLCAwLjk5NjcyMTYyZiwgMC45OTczOTg3NGYsIDAuOTk3OTY2NjdmLAorICAgIDAuOTk4NDM3MjhmLCAwLjk5ODgyMTk1ZiwgMC45OTkxMzE0N2YsIDAuOTk5Mzc2MDZmLCAwLjk5OTU2NTI3ZiwKKyAgICAwLjk5OTcwODAyZiwgMC45OTk4MTI0OGYsIDAuOTk5ODg2MTNmLCAwLjk5OTkzNTY1ZiwgMC45OTk5NjY5N2YsCisgICAgMC45OTk5ODUxOGYsIDAuOTk5OTk0NTdmLCAwLjk5OTk5ODU5ZiwgMC45OTk5OTk4MmYsIDEuMDAwMDAwMGYsCit9OworCisvKiBzcXVhcmUgb2YgdGhlIHdpbmRvdywgdXNlZCBmb3IgdGhlIHBvc3RmaWx0ZXIgKi8KK2NvbnN0IGZsb2F0IGZmX2NlbHRfd2luZG93MlsxMjBdID0geworICAgIDQuNTI3NTM1N2UtMDlmLCAzLjY2NjQ3ZS0wN2YsIDIuODI3NzdlLTA2ZiwgMS4wODU1N2UtMDVmLCAyLjk2MzcxZS0wNWYsIDYuNjA1OTRlLTA1ZiwKKyAgICAwLjAwMDEyODY4NmYsIDAuMDAwMjI3NzI3ZiwgMC4wMDAzNzQ5OTlmLCAwLjAwMDU4Mzg4MWYsIDAuMDAwODY5MjY2ZiwgMC4wMDEyNDc1ZiwKKyAgICAwLjAwMTczNjNmLCAwLjAwMjM1NDcxZiwgMC4wMDMxMjI5OWYsIDAuMDA0MDYyNTNmLCAwLjAwNTE5NTc2ZiwgMC4wMDY1NDYwMWYsCisgICAgMC4wMDgxMzc0M2YsIDAuMDA5OTk0ODJmLCAwLjAxMjE0MzVmLCAwLjAxNDYwOTNmLCAwLjAxNzQxOGYsIDAuMDIwNTk1N2YsIDAuMDI0MTY4NGYsCisgICAgMC4wMjgxNjE1ZiwgMC4wMzI2MDAzZiwgMC4wMzc1MDkyZiwgMC4wNDI5MTE4ZiwgMC4wNDg4MzA4ZiwgMC4wNTUyODczZiwgMC4wNjIzMDEyZiwKKyAgICAwLjA2OTg5MDhmLCAwLjA3ODA3MjNmLCAwLjA4Njg2MDFmLCAwLjA5NjI2NjRmLCAwLjEwNjMwMWYsIDAuMTE2OTdmLCAwLjEyODI4ZiwKKyAgICAwLjE0MDIzMWYsIDAuMTUyODIyZiwgMC4xNjYwNDlmLCAwLjE3OTkwNWYsIDAuMTk0Mzc5ZiwgMC4yMDk0NTdmLCAwLjIyNTEyM2YsIDAuMjQxMzU2ZiwKKyAgICAwLjI1ODEzM2YsIDAuMjc1NDI4ZiwgMC4yOTMyMTJmLCAwLjMxMTQ1M2YsIDAuMzMwMTE2ZiwgMC4zNDkxNjNmLCAwLjM2ODU1NmYsIDAuMzg4MjUzZiwKKyAgICAwLjQwODIxZiwgMC40MjgzODJmLCAwLjQ0ODcyM2YsIDAuNDY5MTg1ZiwgMC40ODk3MmYsIDAuNTEwMjhmLCAwLjUzMDgxNWYsIDAuNTUxMjc3ZiwKKyAgICAwLjU3MTYxOGYsIDAuNTkxNzlmLCAwLjYxMTc0N2YsIDAuNjMxNDQ0ZiwgMC42NTA4MzdmLCAwLjY2OTg4NGYsIDAuNjg4NTQ3ZiwgMC43MDY3ODhmLAorICAgIDAuNzI0NTcyZiwgMC43NDE4NjdmLCAwLjc1ODY0NGYsIDAuNzc0ODc3ZiwgMC43OTA1NDNmLCAwLjgwNTYyMWYsIDAuODIwMDk1ZiwgMC44MzM5NTFmLAorICAgIDAuODQ3MTc4ZiwgMC44NTk3NjlmLCAwLjg3MTcyZiwgMC44ODMwM2YsIDAuODkzNjk5ZiwgMC45MDM3MzRmLCAwLjkxMzE0ZiwgMC45MjE5MjhmLAorICAgIDAuOTMwMTA5ZiwgMC45Mzc2OTlmLCAwLjk0NDcxM2YsIDAuOTUxMTY5ZiwgMC45NTcwODhmLCAwLjk2MjQ5MWYsIDAuOTY3NGYsIDAuOTcxODM4ZiwKKyAgICAwLjk3NTgzMmYsIDAuOTc5NDA0ZiwgMC45ODI1ODJmLCAwLjk4NTM5MWYsIDAuOTg3ODU3ZiwgMC45OTAwMDVmLCAwLjk5MTg2M2YsIDAuOTkzNDU0ZiwKKyAgICAwLjk5NDgwNGYsIDAuOTk1OTM3ZiwgMC45OTY4NzdmLCAwLjk5NzY0NWYsIDAuOTk4MjY0ZiwgMC45OTg3NTNmLCAwLjk5OTEzMWYsIDAuOTk5NDE2ZiwKKyAgICAwLjk5OTYyNWYsIDAuOTk5NzcyZiwgMC45OTk4NzFmLCAwLjk5OTkzNGYsIDAuOTk5OTdmLCAwLjk5OTk4OWYsIDAuOTk5OTk3ZiwgMC45OTk5OTk2NGYsIDEuMGYsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgKiBjb25zdCBjZWx0X3B2cV91X3Jvd1sxNV0gPSB7CisgICAgY2VsdF9wdnFfdSArICAgIDAsIGNlbHRfcHZxX3UgKyAgMTc2LCBjZWx0X3B2cV91ICsgIDM1MSwKKyAgICBjZWx0X3B2cV91ICsgIDUyNSwgY2VsdF9wdnFfdSArICA2OTgsIGNlbHRfcHZxX3UgKyAgODcwLAorICAgIGNlbHRfcHZxX3UgKyAxMDQxLCBjZWx0X3B2cV91ICsgMTEzMSwgY2VsdF9wdnFfdSArIDExNzgsCisgICAgY2VsdF9wdnFfdSArIDEyMDcsIGNlbHRfcHZxX3UgKyAxMjI2LCBjZWx0X3B2cV91ICsgMTI0MCwKKyAgICBjZWx0X3B2cV91ICsgMTI0OCwgY2VsdF9wdnFfdSArIDEyNTQsIGNlbHRfcHZxX3UgKyAxMjU3Cit9OworCitzdGF0aWMgaW5saW5lIGludDE2X3QgY2VsdF9jb3MoaW50MTZfdCB4KQoreworICAgIHggPSAoTVVMMTYoeCwgeCkgKyA0MDk2KSA+PiAxMzsKKyAgICB4ID0gKDMyNzY3LXgpICsgUk9VTkRfTVVMMTYoeCwgKC03NjUxICsgUk9VTkRfTVVMMTYoeCwgKDgyNzcgKyBST1VORF9NVUwxNigtNjI2LCB4KSkpKSk7CisgICAgcmV0dXJuIDEreDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2VsdF9sb2cydGFuKGludCBpc2luLCBpbnQgaWNvcykKK3sKKyAgICBpbnQgbGMsIGxzOworICAgIGxjID0gb3B1c19pbG9nKGljb3MpOworICAgIGxzID0gb3B1c19pbG9nKGlzaW4pOworICAgIGljb3MgPDw9IDE1IC0gbGM7CisgICAgaXNpbiA8PD0gMTUgLSBsczsKKyAgICByZXR1cm4gKGxzIDw8IDExKSAtIChsYyA8PCAxMSkgKworICAgICAgICAgICBST1VORF9NVUwxNihpc2luLCBST1VORF9NVUwxNihpc2luLCAtMjU5NykgKyA3OTMyKSAtCisgICAgICAgICAgIFJPVU5EX01VTDE2KGljb3MsIFJPVU5EX01VTDE2KGljb3MsIC0yNTk3KSArIDc5MzIpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNlbHRfcm5nKENlbHRDb250ZXh0ICpzKQoreworICAgIHMtPnNlZWQgPSAxNjY0NTI1ICogcy0+c2VlZCArIDEwMTM5MDQyMjM7CisgICAgcmV0dXJuIHMtPnNlZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGNlbHRfZGVjb2RlX2NvYXJzZV9lbmVyZ3koQ2VsdENvbnRleHQgKnMsIE9wdXNSYW5nZUNvZGVyICpyYykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBmbG9hdCBwcmV2WzJdID0gezB9OworICAgIGZsb2F0IGFscGhhLCBiZXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKm1vZGVsOworCisgICAgLyogdXNlIHRoZSAyRCB6LXRyYW5zZm9ybSB0byBhcHBseSBwcmVkaWN0aW9uIGluIGJvdGggKi8KKyAgICAvKiB0aGUgdGltZSBkb21haW4gKGFscGhhKSBhbmQgdGhlIGZyZXF1ZW5jeSBkb21haW4gKGJldGEpICovCisKKyAgICBpZiAob3B1c19yY190ZWxsKHJjKSszIDw9IHMtPmZyYW1lYml0cyAmJiBvcHVzX3JjX3AybW9kZWwocmMsIDMpKSB7CisgICAgICAgIC8qIGludHJhIGZyYW1lICovCisgICAgICAgIGFscGhhID0gMDsKKyAgICAgICAgYmV0YSAgPSAxLjBmIC0gNDkxNS4wZi8zMjc2OC4wZjsKKyAgICAgICAgbW9kZWwgPSBjZWx0X2NvYXJzZV9lbmVyZ3lfZGlzdFtzLT5kdXJhdGlvbl1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWxwaGEgPSBjZWx0X2FscGhhX2NvZWZbcy0+ZHVyYXRpb25dOworICAgICAgICBiZXRhICA9IDEuMGYgLSBjZWx0X2JldGFfY29lZltzLT5kdXJhdGlvbl07CisgICAgICAgIG1vZGVsID0gY2VsdF9jb2Fyc2VfZW5lcmd5X2Rpc3Rbcy0+ZHVyYXRpb25dWzBdOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBDRUxUX01BWF9CQU5EUzsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5jb2RlZF9jaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICBDZWx0RnJhbWUgKmZyYW1lID0gJnMtPmZyYW1lW2pdOworICAgICAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgICAgICBpbnQgYXZhaWxhYmxlOworCisgICAgICAgICAgICBpZiAoaSA8IHMtPnN0YXJ0YmFuZCB8fCBpID49IHMtPmVuZGJhbmQpIHsKKyAgICAgICAgICAgICAgICBmcmFtZS0+ZW5lcmd5W2ldID0gMC4wOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdmFpbGFibGUgPSBzLT5mcmFtZWJpdHMgLSBvcHVzX3JjX3RlbGwocmMpOworICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSA+PSAxNSkgeworICAgICAgICAgICAgICAgIC8qIGRlY29kZSB1c2luZyBhIExhcGxhY2UgZGlzdHJpYnV0aW9uICovCisgICAgICAgICAgICAgICAgaW50IGsgPSBGRk1JTihpLCAyMCkgPDwgMTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG9wdXNfcmNfbGFwbGFjZShyYywgbW9kZWxba10gPDwgNywgbW9kZWxbaysxXSA8PCA2KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlID49IDIpIHsKKyAgICAgICAgICAgICAgICBpbnQgeCA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBjZWx0X21vZGVsX2VuZXJneV9zbWFsbCk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAoeD4+MSkgXiAtKHgmMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZSA+PSAxKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAtKGZsb2F0KW9wdXNfcmNfcDJtb2RlbChyYywgMSk7CisgICAgICAgICAgICB9IGVsc2UgdmFsdWUgPSAtMTsKKworICAgICAgICAgICAgZnJhbWUtPmVuZXJneVtpXSA9IEZGTUFYKC05LjBmLCBmcmFtZS0+ZW5lcmd5W2ldKSAqIGFscGhhICsgcHJldltqXSArIHZhbHVlOworICAgICAgICAgICAgcHJldltqXSArPSBiZXRhICogdmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNlbHRfZGVjb2RlX2ZpbmVfZW5lcmd5KENlbHRDb250ZXh0ICpzLCBPcHVzUmFuZ2VDb2RlciAqcmMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gcy0+c3RhcnRiYW5kOyBpIDwgcy0+ZW5kYmFuZDsgaSsrKSB7CisgICAgICAgIGludCBqOworICAgICAgICBpZiAoIXMtPmZpbmVfYml0c1tpXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5jb2RlZF9jaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICBDZWx0RnJhbWUgKmZyYW1lID0gJnMtPmZyYW1lW2pdOworICAgICAgICAgICAgaW50IHEyOworICAgICAgICAgICAgZmxvYXQgb2Zmc2V0OworICAgICAgICAgICAgcTIgPSBvcHVzX2dldHJhd2JpdHMocmMsIHMtPmZpbmVfYml0c1tpXSk7CisgICAgICAgICAgICBvZmZzZXQgPSAocTIgKyAwLjVmKSAqICgxIDw8ICgxNCAtIHMtPmZpbmVfYml0c1tpXSkpIC8gMTYzODQuMGYgLSAwLjVmOworICAgICAgICAgICAgZnJhbWUtPmVuZXJneVtpXSArPSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNlbHRfZGVjb2RlX2ZpbmFsX2VuZXJneShDZWx0Q29udGV4dCAqcywgT3B1c1JhbmdlQ29kZXIgKnJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzX2xlZnQpCit7CisgICAgaW50IHByaW9yaXR5LCBpLCBqOworCisgICAgZm9yIChwcmlvcml0eSA9IDA7IHByaW9yaXR5IDwgMjsgcHJpb3JpdHkrKykgeworICAgICAgICBmb3IgKGkgPSBzLT5zdGFydGJhbmQ7IGkgPCBzLT5lbmRiYW5kICYmIGJpdHNfbGVmdCA+PSBzLT5jb2RlZF9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+ZmluZV9wcmlvcml0eVtpXSAhPSBwcmlvcml0eSB8fCBzLT5maW5lX2JpdHNbaV0gPj0gQ0VMVF9NQVhfRklORV9CSVRTKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+Y29kZWRfY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgICAgIGludCBxMjsKKyAgICAgICAgICAgICAgICBmbG9hdCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgcTIgPSBvcHVzX2dldHJhd2JpdHMocmMsIDEpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IChxMiAtIDAuNWYpICogKDEgPDwgKDE0IC0gcy0+ZmluZV9iaXRzW2ldIC0gMSkpIC8gMTYzODQuMGY7CisgICAgICAgICAgICAgICAgcy0+ZnJhbWVbal0uZW5lcmd5W2ldICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICBiaXRzX2xlZnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgY2VsdF9kZWNvZGVfdGZfY2hhbmdlcyhDZWx0Q29udGV4dCAqcywgT3B1c1JhbmdlQ29kZXIgKnJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNpZW50KQoreworICAgIGludCBpLCBkaWZmID0gMCwgdGZfc2VsZWN0ID0gMCwgdGZfY2hhbmdlZCA9IDAsIHRmX3NlbGVjdF9iaXQ7CisgICAgaW50IGNvbnN1bWVkLCBiaXRzID0gdHJhbnNpZW50ID8gMiA6IDQ7CisKKyAgICBjb25zdW1lZCA9IG9wdXNfcmNfdGVsbChyYyk7CisgICAgdGZfc2VsZWN0X2JpdCA9IChzLT5kdXJhdGlvbiAhPSAwICYmIGNvbnN1bWVkK2JpdHMrMSA8PSBzLT5mcmFtZWJpdHMpOworCisgICAgZm9yIChpID0gcy0+c3RhcnRiYW5kOyBpIDwgcy0+ZW5kYmFuZDsgaSsrKSB7CisgICAgICAgIGlmIChjb25zdW1lZCtiaXRzK3RmX3NlbGVjdF9iaXQgPD0gcy0+ZnJhbWViaXRzKSB7CisgICAgICAgICAgICBkaWZmIF49IG9wdXNfcmNfcDJtb2RlbChyYywgYml0cyk7CisgICAgICAgICAgICBjb25zdW1lZCA9IG9wdXNfcmNfdGVsbChyYyk7CisgICAgICAgICAgICB0Zl9jaGFuZ2VkIHw9IGRpZmY7CisgICAgICAgIH0KKyAgICAgICAgcy0+dGZfY2hhbmdlW2ldID0gZGlmZjsKKyAgICAgICAgYml0cyA9IHRyYW5zaWVudCA/IDQgOiA1OworICAgIH0KKworICAgIGlmICh0Zl9zZWxlY3RfYml0ICYmIGNlbHRfdGZfc2VsZWN0W3MtPmR1cmF0aW9uXVt0cmFuc2llbnRdWzBdW3RmX2NoYW5nZWRdICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgY2VsdF90Zl9zZWxlY3Rbcy0+ZHVyYXRpb25dW3RyYW5zaWVudF1bMV1bdGZfY2hhbmdlZF0pCisgICAgICAgIHRmX3NlbGVjdCA9IG9wdXNfcmNfcDJtb2RlbChyYywgMSk7CisKKyAgICBmb3IgKGkgPSBzLT5zdGFydGJhbmQ7IGkgPCBzLT5lbmRiYW5kOyBpKyspIHsKKyAgICAgICAgcy0+dGZfY2hhbmdlW2ldID0gY2VsdF90Zl9zZWxlY3Rbcy0+ZHVyYXRpb25dW3RyYW5zaWVudF1bdGZfc2VsZWN0XVtzLT50Zl9jaGFuZ2VbaV1dOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2VsdF9kZWNvZGVfYWxsb2NhdGlvbihDZWx0Q29udGV4dCAqcywgT3B1c1JhbmdlQ29kZXIgKnJjKQoreworICAgIC8vIGFwcHJveC4gbWF4aW11bSBiaXQgYWxsb2NhdGlvbiBmb3IgZWFjaCBiYW5kIGJlZm9yZSBib29zdC90cmltCisgICAgaW50IGNhcFtDRUxUX01BWF9CQU5EU107CisgICAgaW50IGJvb3N0W0NFTFRfTUFYX0JBTkRTXTsKKyAgICBpbnQgdGhyZXNob2xkW0NFTFRfTUFYX0JBTkRTXTsKKyAgICBpbnQgYml0czFbQ0VMVF9NQVhfQkFORFNdOworICAgIGludCBiaXRzMltDRUxUX01BWF9CQU5EU107CisgICAgaW50IHRyaW1fb2Zmc2V0W0NFTFRfTUFYX0JBTkRTXTsKKworICAgIGludCBza2lwX3N0YXJ0YmFuZCA9IHMtPnN0YXJ0YmFuZDsKKyAgICBpbnQgZHluYWxsb2MgICAgICAgPSA2OworICAgIGludCBhbGxvY3RyaW0gICAgICA9IDU7CisgICAgaW50IGV4dHJhYml0cyAgICAgID0gMDsKKworICAgIGludCBza2lwX2JpdCAgICAgICAgICAgID0gMDsKKyAgICBpbnQgaW50ZW5zaXR5c3RlcmVvX2JpdCA9IDA7CisgICAgaW50IGR1YWxzdGVyZW9fYml0ICAgICAgPSAwOworCisgICAgaW50IHJlbWFpbmluZywgYmFuZGJpdHM7CisgICAgaW50IGxvdywgaGlnaCwgdG90YWwsIGRvbmU7CisgICAgaW50IHRvdGFsYml0czsKKyAgICBpbnQgY29uc3VtZWQ7CisgICAgaW50IGksIGo7CisKKyAgICBjb25zdW1lZCA9IG9wdXNfcmNfdGVsbChyYyk7CisKKyAgICAvKiBvYnRhaW4gc3ByZWFkIGZsYWcgKi8KKyAgICBzLT5zcHJlYWQgPSBDRUxUX1NQUkVBRF9OT1JNQUw7CisgICAgaWYgKGNvbnN1bWVkICsgNCA8PSBzLT5mcmFtZWJpdHMpCisgICAgICAgIHMtPnNwcmVhZCA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBjZWx0X21vZGVsX3NwcmVhZCk7CisKKyAgICAvKiBnZW5lcmF0ZSBzdGF0aWMgYWxsb2NhdGlvbiBjYXBzICovCisgICAgZm9yIChpID0gMDsgaSA8IENFTFRfTUFYX0JBTkRTOyBpKyspIHsKKyAgICAgICAgY2FwW2ldID0gKGNlbHRfc3RhdGljX2NhcHNbcy0+ZHVyYXRpb25dW3MtPmNvZGVkX2NoYW5uZWxzIC0gMV1baV0gKyA2NCkKKyAgICAgICAgICAgICAgICAgKiBjZWx0X2ZyZXFfcmFuZ2VbaV0gPDwgKHMtPmNvZGVkX2NoYW5uZWxzIC0gMSkgPDwgcy0+ZHVyYXRpb24gPj4gMjsKKyAgICB9CisKKyAgICAvKiBvYnRhaW4gYmFuZCBib29zdCAqLworICAgIHRvdGFsYml0cyA9IHMtPmZyYW1lYml0cyA8PCAzOyAvLyBjb252ZXJ0IHRvIDEvOCBiaXRzCisgICAgY29uc3VtZWQgPSBvcHVzX3JjX3RlbGxfZnJhYyhyYyk7CisgICAgZm9yIChpID0gcy0+c3RhcnRiYW5kOyBpIDwgcy0+ZW5kYmFuZDsgaSsrKSB7CisgICAgICAgIGludCBxdWFudGEsIGJhbmRfZHluYWxsb2M7CisKKyAgICAgICAgYm9vc3RbaV0gPSAwOworCisgICAgICAgIHF1YW50YSA9IGNlbHRfZnJlcV9yYW5nZVtpXSA8PCAocy0+Y29kZWRfY2hhbm5lbHMgLSAxKSA8PCBzLT5kdXJhdGlvbjsKKyAgICAgICAgcXVhbnRhID0gRkZNSU4ocXVhbnRhIDw8IDMsIEZGTUFYKDYgPDwgMywgcXVhbnRhKSk7CisgICAgICAgIGJhbmRfZHluYWxsb2MgPSBkeW5hbGxvYzsKKyAgICAgICAgd2hpbGUgKGNvbnN1bWVkICsgKGJhbmRfZHluYWxsb2M8PDMpIDwgdG90YWxiaXRzICYmIGJvb3N0W2ldIDwgY2FwW2ldKSB7CisgICAgICAgICAgICBpbnQgYWRkID0gb3B1c19yY19wMm1vZGVsKHJjLCBiYW5kX2R5bmFsbG9jKTsKKyAgICAgICAgICAgIGNvbnN1bWVkID0gb3B1c19yY190ZWxsX2ZyYWMocmMpOworICAgICAgICAgICAgaWYgKCFhZGQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGJvb3N0W2ldICAgICArPSBxdWFudGE7CisgICAgICAgICAgICB0b3RhbGJpdHMgICAgLT0gcXVhbnRhOworICAgICAgICAgICAgYmFuZF9keW5hbGxvYyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgLyogZHluYWxsb2MgaXMgbW9yZSBsaWtlbHkgdG8gb2NjdXIgaWYgaXQncyBhbHJlYWR5IGJlZW4gdXNlZCBmb3IgZWFybGllciBiYW5kcyAqLworICAgICAgICBpZiAoYm9vc3RbaV0pCisgICAgICAgICAgICBkeW5hbGxvYyA9IEZGTUFYKDIsIGR5bmFsbG9jIC0gMSk7CisgICAgfQorCisgICAgLyogb2J0YWluIGFsbG9jYXRpb24gdHJpbSAqLworICAgIGlmIChjb25zdW1lZCArICg2IDw8IDMpIDw9IHRvdGFsYml0cykKKyAgICAgICAgYWxsb2N0cmltID0gb3B1c19yY19nZXRzeW1ib2wocmMsIGNlbHRfbW9kZWxfYWxsb2NfdHJpbSk7CisKKyAgICAvKiBhbnRpLWNvbGxhcHNlIGJpdCByZXNlcnZhdGlvbiAqLworICAgIHRvdGFsYml0cyA9IChzLT5mcmFtZWJpdHMgPDwgMykgLSBvcHVzX3JjX3RlbGxfZnJhYyhyYykgLSAxOworICAgIHMtPmFudGljb2xsYXBzZV9iaXQgPSAwOworICAgIGlmIChzLT5ibG9ja3MgPiAxICYmIHMtPmR1cmF0aW9uID49IDIgJiYKKyAgICAgICAgdG90YWxiaXRzID49ICgocy0+ZHVyYXRpb24gKyAyKSA8PCAzKSkKKyAgICAgICAgcy0+YW50aWNvbGxhcHNlX2JpdCA9IDEgPDwgMzsKKyAgICB0b3RhbGJpdHMgLT0gcy0+YW50aWNvbGxhcHNlX2JpdDsKKworICAgIC8qIGJhbmQgc2tpcCBiaXQgcmVzZXJ2YXRpb24gKi8KKyAgICBpZiAodG90YWxiaXRzID49IDEgPDwgMykKKyAgICAgICAgc2tpcF9iaXQgPSAxIDw8IDM7CisgICAgdG90YWxiaXRzIC09IHNraXBfYml0OworCisgICAgLyogaW50ZW5zaXR5L2R1YWwgc3RlcmVvIGJpdCByZXNlcnZhdGlvbiAqLworICAgIGlmIChzLT5jb2RlZF9jaGFubmVscyA9PSAyKSB7CisgICAgICAgIGludGVuc2l0eXN0ZXJlb19iaXQgPSBjZWx0X2xvZzJfZnJhY1tzLT5lbmRiYW5kIC0gcy0+c3RhcnRiYW5kXTsKKyAgICAgICAgaWYgKGludGVuc2l0eXN0ZXJlb19iaXQgPD0gdG90YWxiaXRzKSB7CisgICAgICAgICAgICB0b3RhbGJpdHMgLT0gaW50ZW5zaXR5c3RlcmVvX2JpdDsKKyAgICAgICAgICAgIGlmICh0b3RhbGJpdHMgPj0gMSA8PCAzKSB7CisgICAgICAgICAgICAgICAgZHVhbHN0ZXJlb19iaXQgPSAxIDw8IDM7CisgICAgICAgICAgICAgICAgdG90YWxiaXRzIC09IDEgPDwgMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpbnRlbnNpdHlzdGVyZW9fYml0ID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBzLT5zdGFydGJhbmQ7IGkgPCBzLT5lbmRiYW5kOyBpKyspIHsKKyAgICAgICAgaW50IHRyaW0gICAgID0gYWxsb2N0cmltIC0gNSAtIHMtPmR1cmF0aW9uOworICAgICAgICBpbnQgYmFuZCAgICAgPSBjZWx0X2ZyZXFfcmFuZ2VbaV0gKiAocy0+ZW5kYmFuZCAtIGkgLSAxKTsKKyAgICAgICAgaW50IGR1cmF0aW9uID0gcy0+ZHVyYXRpb24gKyAzOworICAgICAgICBpbnQgc2NhbGUgICAgPSBkdXJhdGlvbiArIHMtPmNvZGVkX2NoYW5uZWxzIC0gMTsKKworICAgICAgICAvKiBQVlEgbWluaW11bSBhbGxvY2F0aW9uIHRocmVzaG9sZCwgYmVsb3cgdGhpcyB2YWx1ZSB0aGUgYmFuZCBpcworICAgICAgICAgKiBza2lwcGVkICovCisgICAgICAgIHRocmVzaG9sZFtpXSA9IEZGTUFYKDMgKiBjZWx0X2ZyZXFfcmFuZ2VbaV0gPDwgZHVyYXRpb24gPj4gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29kZWRfY2hhbm5lbHMgPDwgMyk7CisKKyAgICAgICAgdHJpbV9vZmZzZXRbaV0gPSB0cmltICogKGJhbmQgPDwgc2NhbGUpID4+IDY7CisKKyAgICAgICAgaWYgKGNlbHRfZnJlcV9yYW5nZVtpXSA8PCBzLT5kdXJhdGlvbiA9PSAxKQorICAgICAgICAgICAgdHJpbV9vZmZzZXRbaV0gLT0gcy0+Y29kZWRfY2hhbm5lbHMgPDwgMzsKKyAgICB9CisKKyAgICAvKiBiaXNlY3Rpb24gKi8KKyAgICBsb3cgID0gMTsKKyAgICBoaWdoID0gQ0VMVF9WRUNUT1JTIC0gMTsKKyAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKKyAgICAgICAgaW50IGNlbnRlciA9IChsb3cgKyBoaWdoKSA+PiAxOworICAgICAgICBkb25lID0gdG90YWwgPSAwOworCisgICAgICAgIGZvciAoaSA9IHMtPmVuZGJhbmQgLSAxOyBpID49IHMtPnN0YXJ0YmFuZDsgaS0tKSB7CisgICAgICAgICAgICBiYW5kYml0cyA9IGNlbHRfZnJlcV9yYW5nZVtpXSAqIGNlbHRfc3RhdGljX2FsbG9jW2NlbnRlcl1baV0KKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKHMtPmNvZGVkX2NoYW5uZWxzIC0gMSkgPDwgcy0+ZHVyYXRpb24gPj4gMjsKKworICAgICAgICAgICAgaWYgKGJhbmRiaXRzKQorICAgICAgICAgICAgICAgIGJhbmRiaXRzID0gRkZNQVgoMCwgYmFuZGJpdHMgKyB0cmltX29mZnNldFtpXSk7CisgICAgICAgICAgICBiYW5kYml0cyArPSBib29zdFtpXTsKKworICAgICAgICAgICAgaWYgKGJhbmRiaXRzID49IHRocmVzaG9sZFtpXSB8fCBkb25lKSB7CisgICAgICAgICAgICAgICAgZG9uZSA9IDE7CisgICAgICAgICAgICAgICAgdG90YWwgKz0gRkZNSU4oYmFuZGJpdHMsIGNhcFtpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJhbmRiaXRzID49IHMtPmNvZGVkX2NoYW5uZWxzIDw8IDMpCisgICAgICAgICAgICAgICAgdG90YWwgKz0gcy0+Y29kZWRfY2hhbm5lbHMgPDwgMzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0b3RhbCA+IHRvdGFsYml0cykKKyAgICAgICAgICAgIGhpZ2ggPSBjZW50ZXIgLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsb3cgPSBjZW50ZXIgKyAxOworICAgIH0KKyAgICBoaWdoID0gbG93LS07CisKKyAgICBmb3IgKGkgPSBzLT5zdGFydGJhbmQ7IGkgPCBzLT5lbmRiYW5kOyBpKyspIHsKKyAgICAgICAgYml0czFbaV0gPSBjZWx0X2ZyZXFfcmFuZ2VbaV0gKiBjZWx0X3N0YXRpY19hbGxvY1tsb3ddW2ldCisgICAgICAgICAgICAgICAgICAgPDwgKHMtPmNvZGVkX2NoYW5uZWxzIC0gMSkgPDwgcy0+ZHVyYXRpb24gPj4gMjsKKyAgICAgICAgYml0czJbaV0gPSBoaWdoID49IENFTFRfVkVDVE9SUyA/IGNhcFtpXSA6CisgICAgICAgICAgICAgICAgICAgY2VsdF9mcmVxX3JhbmdlW2ldICogY2VsdF9zdGF0aWNfYWxsb2NbaGlnaF1baV0KKyAgICAgICAgICAgICAgICAgICA8PCAocy0+Y29kZWRfY2hhbm5lbHMgLSAxKSA8PCBzLT5kdXJhdGlvbiA+PiAyOworCisgICAgICAgIGlmIChiaXRzMVtpXSkKKyAgICAgICAgICAgIGJpdHMxW2ldID0gRkZNQVgoMCwgYml0czFbaV0gKyB0cmltX29mZnNldFtpXSk7CisgICAgICAgIGlmIChiaXRzMltpXSkKKyAgICAgICAgICAgIGJpdHMyW2ldID0gRkZNQVgoMCwgYml0czJbaV0gKyB0cmltX29mZnNldFtpXSk7CisgICAgICAgIGlmIChsb3cpCisgICAgICAgICAgICBiaXRzMVtpXSArPSBib29zdFtpXTsKKyAgICAgICAgYml0czJbaV0gKz0gYm9vc3RbaV07CisKKyAgICAgICAgaWYgKGJvb3N0W2ldKQorICAgICAgICAgICAgc2tpcF9zdGFydGJhbmQgPSBpOworICAgICAgICBiaXRzMltpXSA9IEZGTUFYKDAsIGJpdHMyW2ldIC0gYml0czFbaV0pOworICAgIH0KKworICAgIC8qIGJpc2VjdGlvbiAqLworICAgIGxvdyAgPSAwOworICAgIGhpZ2ggPSAxIDw8IENFTFRfQUxMT0NfU1RFUFM7CisgICAgZm9yIChpID0gMDsgaSA8IENFTFRfQUxMT0NfU1RFUFM7IGkrKykgeworICAgICAgICBpbnQgY2VudGVyID0gKGxvdyArIGhpZ2gpID4+IDE7CisgICAgICAgIGRvbmUgPSB0b3RhbCA9IDA7CisKKyAgICAgICAgZm9yIChqID0gcy0+ZW5kYmFuZCAtIDE7IGogPj0gcy0+c3RhcnRiYW5kOyBqLS0pIHsKKyAgICAgICAgICAgIGJhbmRiaXRzID0gYml0czFbal0gKyAoY2VudGVyICogYml0czJbal0gPj4gQ0VMVF9BTExPQ19TVEVQUyk7CisKKyAgICAgICAgICAgIGlmIChiYW5kYml0cyA+PSB0aHJlc2hvbGRbal0gfHwgZG9uZSkgeworICAgICAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICAgICAgICAgIHRvdGFsICs9IEZGTUlOKGJhbmRiaXRzLCBjYXBbal0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChiYW5kYml0cyA+PSBzLT5jb2RlZF9jaGFubmVscyA8PCAzKQorICAgICAgICAgICAgICAgIHRvdGFsICs9IHMtPmNvZGVkX2NoYW5uZWxzIDw8IDM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvdGFsID4gdG90YWxiaXRzKQorICAgICAgICAgICAgaGlnaCA9IGNlbnRlcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG93ID0gY2VudGVyOworICAgIH0KKworICAgIGRvbmUgPSB0b3RhbCA9IDA7CisgICAgZm9yIChpID0gcy0+ZW5kYmFuZCAtIDE7IGkgPj0gcy0+c3RhcnRiYW5kOyBpLS0pIHsKKyAgICAgICAgYmFuZGJpdHMgPSBiaXRzMVtpXSArIChsb3cgKiBiaXRzMltpXSA+PiBDRUxUX0FMTE9DX1NURVBTKTsKKworICAgICAgICBpZiAoYmFuZGJpdHMgPj0gdGhyZXNob2xkW2ldIHx8IGRvbmUpCisgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmFuZGJpdHMgPSAoYmFuZGJpdHMgPj0gcy0+Y29kZWRfY2hhbm5lbHMgPDwgMykgPworICAgICAgICAgICAgICAgICAgICAgICBzLT5jb2RlZF9jaGFubmVscyA8PCAzIDogMDsKKworICAgICAgICBiYW5kYml0cyAgICAgPSBGRk1JTihiYW5kYml0cywgY2FwW2ldKTsKKyAgICAgICAgcy0+cHVsc2VzW2ldID0gYmFuZGJpdHM7CisgICAgICAgIHRvdGFsICAgICAgKz0gYmFuZGJpdHM7CisgICAgfQorCisgICAgLyogYmFuZCBza2lwcGluZyAqLworICAgIGZvciAocy0+Y29kZWRiYW5kcyA9IHMtPmVuZGJhbmQ7IDsgcy0+Y29kZWRiYW5kcy0tKSB7CisgICAgICAgIGludCBhbGxvY2F0aW9uOworICAgICAgICBqID0gcy0+Y29kZWRiYW5kcyAtIDE7CisKKyAgICAgICAgaWYgKGogPT0gc2tpcF9zdGFydGJhbmQpIHsKKyAgICAgICAgICAgIC8qIGFsbCByZW1haW5pbmcgYmFuZHMgYXJlIG5vdCBza2lwcGVkICovCisgICAgICAgICAgICB0b3RhbGJpdHMgKz0gc2tpcF9iaXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdHMgYXZhaWxhYmxlIGZvciBjb2RpbmcgImRvIG5vdCBza2lwIiBtYXJrZXJzICovCisgICAgICAgIHJlbWFpbmluZyAgID0gdG90YWxiaXRzIC0gdG90YWw7CisgICAgICAgIGJhbmRiaXRzICAgID0gcmVtYWluaW5nIC8gKGNlbHRfZnJlcV9iYW5kc1tqKzFdIC0gY2VsdF9mcmVxX2JhbmRzW3MtPnN0YXJ0YmFuZF0pOworICAgICAgICByZW1haW5pbmcgIC09IGJhbmRiaXRzICAqIChjZWx0X2ZyZXFfYmFuZHNbaisxXSAtIGNlbHRfZnJlcV9iYW5kc1tzLT5zdGFydGJhbmRdKTsKKyAgICAgICAgYWxsb2NhdGlvbiAgPSBzLT5wdWxzZXNbal0gKyBiYW5kYml0cyAqIGNlbHRfZnJlcV9yYW5nZVtqXQorICAgICAgICAgICAgICAgICAgICAgICsgRkZNQVgoMCwgcmVtYWluaW5nIC0gKGNlbHRfZnJlcV9iYW5kc1tqXSAtIGNlbHRfZnJlcV9iYW5kc1tzLT5zdGFydGJhbmRdKSk7CisKKyAgICAgICAgLyogYSAiZG8gbm90IHNraXAiIG1hcmtlciBpcyBvbmx5IGNvZGVkIGlmIHRoZSBhbGxvY2F0aW9uIGlzCisgICAgICAgICAgIGFib3ZlIHRoZSBjaG9zZW4gdGhyZXNob2xkICovCisgICAgICAgIGlmIChhbGxvY2F0aW9uID49IEZGTUFYKHRocmVzaG9sZFtqXSwgKHMtPmNvZGVkX2NoYW5uZWxzICsgMSkgPDwzICkpIHsKKyAgICAgICAgICAgIGlmIChvcHVzX3JjX3AybW9kZWwocmMsIDEpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB0b3RhbCAgICAgICs9IDEgPDwgMzsKKyAgICAgICAgICAgIGFsbG9jYXRpb24gLT0gMSA8PCAzOworICAgICAgICB9CisKKyAgICAgICAgLyogdGhlIGJhbmQgaXMgc2tpcHBlZCwgc28gcmVjbGFpbSBpdHMgYml0cyAqLworICAgICAgICB0b3RhbCAtPSBzLT5wdWxzZXNbal07CisgICAgICAgIGlmIChpbnRlbnNpdHlzdGVyZW9fYml0KSB7CisgICAgICAgICAgICB0b3RhbCAtPSBpbnRlbnNpdHlzdGVyZW9fYml0OworICAgICAgICAgICAgaW50ZW5zaXR5c3RlcmVvX2JpdCA9IGNlbHRfbG9nMl9mcmFjW2ogLSBzLT5zdGFydGJhbmRdOworICAgICAgICAgICAgdG90YWwgKz0gaW50ZW5zaXR5c3RlcmVvX2JpdDsKKyAgICAgICAgfQorCisgICAgICAgIHRvdGFsICs9IHMtPnB1bHNlc1tqXSA9IChhbGxvY2F0aW9uID49IHMtPmNvZGVkX2NoYW5uZWxzIDw8IDMpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvZGVkX2NoYW5uZWxzIDw8IDMgOiAwOworICAgIH0KKworICAgIC8qIG9idGFpbiBzdGVyZW8gZmxhZ3MgKi8KKyAgICBzLT5pbnRlbnNpdHlzdGVyZW8gPSAwOworICAgIHMtPmR1YWxzdGVyZW8gICAgICA9IDA7CisgICAgaWYgKGludGVuc2l0eXN0ZXJlb19iaXQpCisgICAgICAgIHMtPmludGVuc2l0eXN0ZXJlbyA9IHMtPnN0YXJ0YmFuZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdXNfcmNfdW5pbW9kZWwocmMsIHMtPmNvZGVkYmFuZHMgKyAxIC0gcy0+c3RhcnRiYW5kKTsKKyAgICBpZiAocy0+aW50ZW5zaXR5c3RlcmVvIDw9IHMtPnN0YXJ0YmFuZCkKKyAgICAgICAgdG90YWxiaXRzICs9IGR1YWxzdGVyZW9fYml0OyAvKiBubyBpbnRlbnNpdHkgc3RlcmVvIG1lYW5zIG5vIGR1YWwgc3RlcmVvICovCisgICAgZWxzZSBpZiAoZHVhbHN0ZXJlb19iaXQpCisgICAgICAgIHMtPmR1YWxzdGVyZW8gPSBvcHVzX3JjX3AybW9kZWwocmMsIDEpOworCisgICAgLyogc3VwcGx5IHRoZSByZW1haW5pbmcgYml0cyBpbiB0aGlzIGZyYW1lIHRvIGxvd2VyIGJhbmRzICovCisgICAgcmVtYWluaW5nID0gdG90YWxiaXRzIC0gdG90YWw7CisgICAgYmFuZGJpdHMgID0gcmVtYWluaW5nIC8gKGNlbHRfZnJlcV9iYW5kc1tzLT5jb2RlZGJhbmRzXSAtIGNlbHRfZnJlcV9iYW5kc1tzLT5zdGFydGJhbmRdKTsKKyAgICByZW1haW5pbmcgLT0gYmFuZGJpdHMgKiAoY2VsdF9mcmVxX2JhbmRzW3MtPmNvZGVkYmFuZHNdIC0gY2VsdF9mcmVxX2JhbmRzW3MtPnN0YXJ0YmFuZF0pOworICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmNvZGVkYmFuZHM7IGkrKykgeworICAgICAgICBpbnQgYml0cyA9IEZGTUlOKHJlbWFpbmluZywgY2VsdF9mcmVxX3JhbmdlW2ldKTsKKworICAgICAgICBzLT5wdWxzZXNbaV0gKz0gYml0cyArIGJhbmRiaXRzICogY2VsdF9mcmVxX3JhbmdlW2ldOworICAgICAgICByZW1haW5pbmcgICAgLT0gYml0czsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBzLT5zdGFydGJhbmQ7IGkgPCBzLT5jb2RlZGJhbmRzOyBpKyspIHsKKyAgICAgICAgaW50IE4gPSBjZWx0X2ZyZXFfcmFuZ2VbaV0gPDwgcy0+ZHVyYXRpb247CisgICAgICAgIGludCBwcmV2X2V4dHJhID0gZXh0cmFiaXRzOworICAgICAgICBzLT5wdWxzZXNbaV0gKz0gZXh0cmFiaXRzOworCisgICAgICAgIGlmIChOID4gMSkgeworICAgICAgICAgICAgaW50IGRvZjsgICAgICAgIC8vIGRlZ3JlZXMgb2YgZnJlZWRvbQorICAgICAgICAgICAgaW50IHRlbXA7ICAgICAgIC8vIGRvZiAqIGNoYW5uZWxzICogbG9nKGRvZikKKyAgICAgICAgICAgIGludCBvZmZzZXQ7ICAgICAvLyBmaW5lIGVuZXJneSBxdWFudGl6YXRpb24gb2Zmc2V0LCBpLmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmEgYml0cyBhc3NpZ25lZCBvdmVyIHRoZSBzdGFuZGFyZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvdGFsYml0cy9kb2YKKyAgICAgICAgICAgIGludCBmaW5lX2JpdHMsIG1heF9iaXRzOworCisgICAgICAgICAgICBleHRyYWJpdHMgPSBGRk1BWCgwLCBzLT5wdWxzZXNbaV0gLSBjYXBbaV0pOworICAgICAgICAgICAgcy0+cHVsc2VzW2ldIC09IGV4dHJhYml0czsKKworICAgICAgICAgICAgLyogaW50ZW5zaXR5IHN0ZXJlbyBtYWtlcyB1c2Ugb2YgYW4gZXh0cmEgZGVncmVlIG9mIGZyZWVkb20gKi8KKyAgICAgICAgICAgIGRvZiA9IE4gKiBzLT5jb2RlZF9jaGFubmVscworICAgICAgICAgICAgICAgICAgKyAocy0+Y29kZWRfY2hhbm5lbHMgPT0gMiAmJiBOID4gMiAmJiAhcy0+ZHVhbHN0ZXJlbyAmJiBpIDwgcy0+aW50ZW5zaXR5c3RlcmVvKTsKKyAgICAgICAgICAgIHRlbXAgPSBkb2YgKiAoY2VsdF9sb2dfZnJlcV9yYW5nZVtpXSArIChzLT5kdXJhdGlvbjw8MykpOworICAgICAgICAgICAgb2Zmc2V0ID0gKHRlbXAgPj4gMSkgLSBkb2YgKiBDRUxUX0ZJTkVfT0ZGU0VUOworICAgICAgICAgICAgaWYgKE4gPT0gMikgLyogZG9mPTIgaXMgdGhlIG9ubHkgY2FzZSB0aGF0IGRvZXNuJ3QgZml0IHRoZSBtb2RlbCAqLworICAgICAgICAgICAgICAgIG9mZnNldCArPSBkb2Y8PDE7CisKKyAgICAgICAgICAgIC8qIGdyYW50IGFuIGFkZGl0aW9uYWwgYmlhcyBmb3IgdGhlIGZpcnN0IGFuZCBzZWNvbmQgcHVsc2VzICovCisgICAgICAgICAgICBpZiAocy0+cHVsc2VzW2ldICsgb2Zmc2V0IDwgMiAqIChkb2YgPDwgMykpCisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHRlbXAgPj4gMjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHMtPnB1bHNlc1tpXSArIG9mZnNldCA8IDMgKiAoZG9mIDw8IDMpKQorICAgICAgICAgICAgICAgIG9mZnNldCArPSB0ZW1wID4+IDM7CisKKyAgICAgICAgICAgIGZpbmVfYml0cyA9IChzLT5wdWxzZXNbaV0gKyBvZmZzZXQgKyAoZG9mIDw8IDIpKSAvIChkb2YgPDwgMyk7CisgICAgICAgICAgICBtYXhfYml0cyAgPSBGRk1JTigocy0+cHVsc2VzW2ldPj4zKSA+PiAocy0+Y29kZWRfY2hhbm5lbHMgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTFRfTUFYX0ZJTkVfQklUUyk7CisKKyAgICAgICAgICAgIG1heF9iaXRzICA9IEZGTUFYKG1heF9iaXRzLCAwKTsKKworICAgICAgICAgICAgcy0+ZmluZV9iaXRzW2ldID0gYXZfY2xpcChmaW5lX2JpdHMsIDAsIG1heF9iaXRzKTsKKworICAgICAgICAgICAgLyogaWYgZmluZV9iaXRzIHdhcyByb3VuZGVkIGRvd24gb3IgY2FwcGVkLAorICAgICAgICAgICAgICAgZ2l2ZSBwcmlvcml0eSBmb3IgdGhlIGZpbmFsIGZpbmUgZW5lcmd5IHBhc3MgKi8KKyAgICAgICAgICAgIHMtPmZpbmVfcHJpb3JpdHlbaV0gPSAocy0+ZmluZV9iaXRzW2ldICogKGRvZjw8MykgPj0gcy0+cHVsc2VzW2ldICsgb2Zmc2V0KTsKKworICAgICAgICAgICAgLyogdGhlIHJlbWFpbmluZyBiaXRzIGFyZSBhc3NpZ25lZCB0byBQVlEgKi8KKyAgICAgICAgICAgIHMtPnB1bHNlc1tpXSAtPSBzLT5maW5lX2JpdHNbaV0gPDwgKHMtPmNvZGVkX2NoYW5uZWxzIC0gMSkgPDwgMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGFsbCBiaXRzIGdvIHRvIGZpbmUgZW5lcmd5IGV4Y2VwdCBmb3IgdGhlIHNpZ24gYml0ICovCisgICAgICAgICAgICBleHRyYWJpdHMgPSBGRk1BWCgwLCBzLT5wdWxzZXNbaV0gLSAocy0+Y29kZWRfY2hhbm5lbHMgPDwgMykpOworICAgICAgICAgICAgcy0+cHVsc2VzW2ldIC09IGV4dHJhYml0czsKKyAgICAgICAgICAgIHMtPmZpbmVfYml0c1tpXSA9IDA7CisgICAgICAgICAgICBzLT5maW5lX3ByaW9yaXR5W2ldID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGhhbmQgYmFjayBhIGxpbWl0ZWQgbnVtYmVyIG9mIGV4dHJhIGZpbmUgZW5lcmd5IGJpdHMgdG8gdGhpcyBiYW5kICovCisgICAgICAgIGlmIChleHRyYWJpdHMgPiAwKSB7CisgICAgICAgICAgICBpbnQgZmluZWV4dHJhID0gRkZNSU4oZXh0cmFiaXRzID4+IChzLT5jb2RlZF9jaGFubmVscyArIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTFRfTUFYX0ZJTkVfQklUUyAtIHMtPmZpbmVfYml0c1tpXSk7CisgICAgICAgICAgICBzLT5maW5lX2JpdHNbaV0gKz0gZmluZWV4dHJhOworCisgICAgICAgICAgICBmaW5lZXh0cmEgPDw9IHMtPmNvZGVkX2NoYW5uZWxzICsgMjsKKyAgICAgICAgICAgIHMtPmZpbmVfcHJpb3JpdHlbaV0gPSAoZmluZWV4dHJhID49IGV4dHJhYml0cyAtIHByZXZfZXh0cmEpOworICAgICAgICAgICAgZXh0cmFiaXRzIC09IGZpbmVleHRyYTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5yZW1haW5pbmcgPSBleHRyYWJpdHM7CisKKyAgICAvKiBza2lwcGVkIGJhbmRzIGRlZGljYXRlIGFsbCBvZiB0aGVpciBiaXRzIGZvciBmaW5lIGVuZXJneSAqLworICAgIGZvciAoOyBpIDwgcy0+ZW5kYmFuZDsgaSsrKSB7CisgICAgICAgIHMtPmZpbmVfYml0c1tpXSAgICAgPSBzLT5wdWxzZXNbaV0gPj4gKHMtPmNvZGVkX2NoYW5uZWxzIC0gMSkgPj4gMzsKKyAgICAgICAgcy0+cHVsc2VzW2ldICAgICAgICA9IDA7CisgICAgICAgIHMtPmZpbmVfcHJpb3JpdHlbaV0gPSBzLT5maW5lX2JpdHNbaV0gPCAxOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgY2VsdF9iaXRzMnB1bHNlcyhjb25zdCB1aW50OF90ICpjYWNoZSwgaW50IGJpdHMpCit7CisgICAgLy8gVE9ETzogRmluZCB0aGUgc2l6ZSBvZiBjYWNoZSBhbmQgbWFrZSBpdCBpbnRvIGFuIGFycmF5IGluIHRoZSBwYXJhbWV0ZXJzIGxpc3QKKyAgICBpbnQgaSwgbG93ID0gMCwgaGlnaDsKKworICAgIGhpZ2ggPSBjYWNoZVswXTsKKyAgICBiaXRzLS07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIGludCBjZW50ZXIgPSAobG93ICsgaGlnaCArIDEpID4+IDE7CisgICAgICAgIGlmIChjYWNoZVtjZW50ZXJdID49IGJpdHMpCisgICAgICAgICAgICBoaWdoID0gY2VudGVyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsb3cgPSBjZW50ZXI7CisgICAgfQorCisgICAgcmV0dXJuIChiaXRzIC0gKGxvdyA9PSAwID8gLTEgOiBjYWNoZVtsb3ddKSA8PSBjYWNoZVtoaWdoXSAtIGJpdHMpID8gbG93IDogaGlnaDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2VsdF9wdWxzZXMyYml0cyhjb25zdCB1aW50OF90ICpjYWNoZSwgaW50IHB1bHNlcykKK3sKKyAgICAvLyBUT0RPOiBGaW5kIHRoZSBzaXplIG9mIGNhY2hlIGFuZCBtYWtlIGl0IGludG8gYW4gYXJyYXkgaW4gdGhlIHBhcmFtZXRlcnMgbGlzdAorICAgcmV0dXJuIChwdWxzZXMgPT0gMCkgPyAwIDogY2FjaGVbcHVsc2VzXSArIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZWx0X25vcm1hbGl6ZV9yZXNpZHVhbChjb25zdCBpbnQgKiBhdl9yZXN0cmljdCBpeSwgZmxvYXQgKiBhdl9yZXN0cmljdCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBOLCBmbG9hdCBnKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgICAgIFhbaV0gPSBnICogaXlbaV07Cit9CisKK3N0YXRpYyB2b2lkIGNlbHRfZXhwX3JvdGF0aW9uMShmbG9hdCAqWCwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjLCBmbG9hdCBzKQoreworICAgIGZsb2F0ICpYcHRyOworICAgIGludCBpOworCisgICAgWHB0ciA9IFg7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbiAtIHN0cmlkZTsgaSsrKSB7CisgICAgICAgIGZsb2F0IHgxLCB4MjsKKyAgICAgICAgeDEgICAgICAgICAgID0gWHB0clswXTsKKyAgICAgICAgeDIgICAgICAgICAgID0gWHB0cltzdHJpZGVdOworICAgICAgICBYcHRyW3N0cmlkZV0gPSBjICogeDIgKyBzICogeDE7CisgICAgICAgICpYcHRyKysgICAgICA9IGMgKiB4MSAtIHMgKiB4MjsKKyAgICB9CisKKyAgICBYcHRyID0gJlhbbGVuIC0gMiAqIHN0cmlkZSAtIDFdOworICAgIGZvciAoaSA9IGxlbiAtIDIgKiBzdHJpZGUgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBmbG9hdCB4MSwgeDI7CisgICAgICAgIHgxICAgICAgICAgICA9IFhwdHJbMF07CisgICAgICAgIHgyICAgICAgICAgICA9IFhwdHJbc3RyaWRlXTsKKyAgICAgICAgWHB0cltzdHJpZGVdID0gYyAqIHgyICsgcyAqIHgxOworICAgICAgICAqWHB0ci0tICAgICAgPSBjICogeDEgLSBzICogeDI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2VsdF9leHBfcm90YXRpb24oZmxvYXQgKlgsIHVuc2lnbmVkIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN0cmlkZSwgdW5zaWduZWQgaW50IEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBDZWx0U3ByZWFkIHNwcmVhZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3RyaWRlMiA9IDA7CisgICAgZmxvYXQgYywgczsKKyAgICBmbG9hdCBnYWluLCB0aGV0YTsKKyAgICBpbnQgaTsKKworICAgIGlmICgyKksgPj0gbGVuIHx8IHNwcmVhZCA9PSBDRUxUX1NQUkVBRF9OT05FKQorICAgICAgICByZXR1cm47CisKKyAgICBnYWluID0gKGZsb2F0KWxlbiAvIChsZW4gKyAoMjAgLSA1KnNwcmVhZCkgKiBLKTsKKyAgICB0aGV0YSA9IE1fUEkgKiBnYWluICogZ2FpbiAvIDQ7CisKKyAgICBjID0gY29zKHRoZXRhKTsKKyAgICBzID0gc2luKHRoZXRhKTsKKworICAgIGlmIChsZW4gPj0gc3RyaWRlIDw8IDMpIHsKKyAgICAgICAgc3RyaWRlMiA9IDE7CisgICAgICAgIC8qIFRoaXMgaXMganVzdCBhIHNpbXBsZSAoZXF1aXZhbGVudCkgd2F5IG9mIGNvbXB1dGluZyBzcXJ0KGxlbi9zdHJpZGUpIHdpdGggcm91bmRpbmcuCisgICAgICAgIEl0J3MgYmFzaWNhbGx5IGluY3JlbWVudGluZyBsb25nIGFzIChzdHJpZGUyKzAuNSleMiA8IGxlbi9zdHJpZGUuICovCisgICAgICAgIHdoaWxlICgoc3RyaWRlMiAqIHN0cmlkZTIgKyBzdHJpZGUyKSAqIHN0cmlkZSArIChzdHJpZGUgPj4gMikgPCBsZW4pCisgICAgICAgICAgICBzdHJpZGUyKys7CisgICAgfQorCisgICAgLypOT1RFOiBBcyBhIG1pbm9yIG9wdGltaXphdGlvbiwgd2UgY291bGQgYmUgcGFzc2luZyBhcm91bmQgbG9nMihCKSwgbm90IEIsIGZvciBib3RoIHRoaXMgYW5kIGZvcgorICAgIGV4dHJhY3RfY29sbGFwc2VfbWFzaygpLiovCisgICAgbGVuIC89IHN0cmlkZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaWRlOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmlkZTIpCisgICAgICAgICAgICBjZWx0X2V4cF9yb3RhdGlvbjEoWCArIGkgKiBsZW4sIGxlbiwgc3RyaWRlMiwgcywgYyk7CisgICAgICAgIGNlbHRfZXhwX3JvdGF0aW9uMShYICsgaSAqIGxlbiwgbGVuLCAxLCBjLCBzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNlbHRfZXh0cmFjdF9jb2xsYXBzZV9tYXNrKGNvbnN0IGludCAqaXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBCKQoreworICAgIHVuc2lnbmVkIGludCBjb2xsYXBzZV9tYXNrOworICAgIGludCBOMDsKKyAgICBpbnQgaSwgajsKKworICAgIGlmIChCIDw9IDEpCisgICAgICAgIHJldHVybiAxOworCisgICAgLypOT1RFOiBBcyBhIG1pbm9yIG9wdGltaXphdGlvbiwgd2UgY291bGQgYmUgcGFzc2luZyBhcm91bmQgbG9nMihCKSwgbm90IEIsIGZvciBib3RoIHRoaXMgYW5kIGZvcgorICAgIGV4cF9yb3RhdGlvbigpLiovCisgICAgTjAgPSBOL0I7CisgICAgY29sbGFwc2VfbWFzayA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IEI7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IE4wOyBqKyspCisgICAgICAgICAgICBjb2xsYXBzZV9tYXNrIHw9IChpeVtpKk4wK2pdIT0wKTw8aTsKKyAgICByZXR1cm4gY29sbGFwc2VfbWFzazsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNlbHRfcmVub3JtYWxpemVfdmVjdG9yKGZsb2F0ICpYLCBpbnQgTiwgZmxvYXQgZ2FpbikKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCBnID0gMWUtMTVmOworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgICAgIGcgKz0gWFtpXSAqIFhbaV07CisgICAgZyA9IGdhaW4gLyBzcXJ0ZihnKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgICAgIFhbaV0gKj0gZzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNlbHRfc3RlcmVvX21lcmdlKGZsb2F0ICpYLCBmbG9hdCAqWSwgZmxvYXQgbWlkLCBpbnQgTikKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCB4cCA9IDAsIHNpZGUgPSAwOworICAgIGZsb2F0IEVbMl07CisgICAgZmxvYXQgbWlkMjsKKyAgICBmbG9hdCB0LCBnYWluWzJdOworCisgICAgLyogQ29tcHV0ZSB0aGUgbm9ybSBvZiBYK1kgYW5kIFgtWSBhcyB8WHxeMiArIHxZfF4yICsvLSBzdW0oeHkpICovCisgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICB4cCAgICs9IFhbaV0gKiBZW2ldOworICAgICAgICBzaWRlICs9IFlbaV0gKiBZW2ldOworICAgIH0KKworICAgIC8qIENvbXBlbnNhdGluZyBmb3IgdGhlIG1pZCBub3JtYWxpemF0aW9uICovCisgICAgeHAgKj0gbWlkOworICAgIG1pZDIgPSBtaWQ7CisgICAgRVswXSA9IG1pZDIgKiBtaWQyICsgc2lkZSAtIDIgKiB4cDsKKyAgICBFWzFdID0gbWlkMiAqIG1pZDIgKyBzaWRlICsgMiAqIHhwOworICAgIGlmIChFWzBdIDwgNmUtNGYgfHwgRVsxXSA8IDZlLTRmKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgICAgICAgICBZW2ldID0gWFtpXTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHQgPSBFWzBdOworICAgIGdhaW5bMF0gPSAxLjBmIC8gc3FydGYodCk7CisgICAgdCA9IEVbMV07CisgICAgZ2FpblsxXSA9IDEuMGYgLyBzcXJ0Zih0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgZmxvYXQgdmFsdWVbMl07CisgICAgICAgIC8qIEFwcGx5IG1pZCBzY2FsaW5nIChzaWRlIGlzIGFscmVhZHkgc2NhbGVkKSAqLworICAgICAgICB2YWx1ZVswXSA9IG1pZCAqIFhbaV07CisgICAgICAgIHZhbHVlWzFdID0gWVtpXTsKKyAgICAgICAgWFtpXSA9IGdhaW5bMF0gKiAodmFsdWVbMF0gLSB2YWx1ZVsxXSk7CisgICAgICAgIFlbaV0gPSBnYWluWzFdICogKHZhbHVlWzBdICsgdmFsdWVbMV0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2VsdF9pbnRlcmxlYXZlX2hhZGFtYXJkKGZsb2F0ICp0bXAsIGZsb2F0ICpYLCBpbnQgTjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGhhZGFtYXJkKQoreworICAgIGludCBpLCBqOworICAgIGludCBOID0gTjAqc3RyaWRlOworCisgICAgaWYgKGhhZGFtYXJkKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm9yZGVyeSA9IGNlbHRfaGFkYW1hcmRfb3JkZXJ5ICsgc3RyaWRlIC0gMjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmlkZTsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE4wOyBqKyspCisgICAgICAgICAgICAgICAgdG1wW2oqc3RyaWRlK2ldID0gWFtvcmRlcnlbaV0qTjAral07CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmlkZTsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE4wOyBqKyspCisgICAgICAgICAgICAgICAgdG1wW2oqc3RyaWRlK2ldID0gWFtpKk4wK2pdOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgICAgIFhbaV0gPSB0bXBbaV07Cit9CisKK3N0YXRpYyB2b2lkIGNlbHRfZGVpbnRlcmxlYXZlX2hhZGFtYXJkKGZsb2F0ICp0bXAsIGZsb2F0ICpYLCBpbnQgTjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaGFkYW1hcmQpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IE4gPSBOMCpzdHJpZGU7CisKKyAgICBpZiAoaGFkYW1hcmQpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqb3JkZXJ5ID0gY2VsdF9oYWRhbWFyZF9vcmRlcnkgKyBzdHJpZGUgLSAyOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaWRlOyBpKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjA7IGorKykKKyAgICAgICAgICAgICAgICB0bXBbb3JkZXJ5W2ldKk4wK2pdID0gWFtqKnN0cmlkZStpXTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaWRlOyBpKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjA7IGorKykKKyAgICAgICAgICAgICAgICB0bXBbaSpOMCtqXSA9IFhbaipzdHJpZGUraV07CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykKKyAgICAgICAgWFtpXSA9IHRtcFtpXTsKK30KKworc3RhdGljIHZvaWQgY2VsdF9oYWFyMShmbG9hdCAqWCwgaW50IE4wLCBpbnQgc3RyaWRlKQoreworICAgIGludCBpLCBqOworICAgIE4wID4+PSAxOworICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpZGU7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjA7IGorKykgeworICAgICAgICAgICAgZmxvYXQgeDAgPSBYW3N0cmlkZSAqICgyICogaiArIDApICsgaV07CisgICAgICAgICAgICBmbG9hdCB4MSA9IFhbc3RyaWRlICogKDIgKiBqICsgMSkgKyBpXTsKKyAgICAgICAgICAgIFhbc3RyaWRlICogKDIgKiBqICsgMCkgKyBpXSA9ICh4MCArIHgxKSAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgIFhbc3RyaWRlICogKDIgKiBqICsgMSkgKyBpXSA9ICh4MCAtIHgxKSAqIE1fU1FSVDFfMjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgY2VsdF9jb21wdXRlX3FuKGludCBOLCBpbnQgYiwgaW50IG9mZnNldCwgaW50IHB1bHNlX2NhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVhbHN0ZXJlbykKK3sKKyAgICBpbnQgcW4sIHFiOworICAgIGludCBOMiA9IDIgKiBOIC0gMTsKKyAgICBpZiAoZHVhbHN0ZXJlbyAmJiBOID09IDIpCisgICAgICAgIE4yLS07CisKKyAgICAvKiBUaGUgdXBwZXIgbGltaXQgZW5zdXJlcyB0aGF0IGluIGEgc3RlcmVvIHNwbGl0IHdpdGggaXRoZXRhPT0xNjM4NCwgd2UnbGwKKyAgICAgKiBhbHdheXMgaGF2ZSBlbm91Z2ggYml0cyBsZWZ0IG92ZXIgdG8gY29kZSBhdCBsZWFzdCBvbmUgcHVsc2UgaW4gdGhlCisgICAgICogc2lkZTsgb3RoZXJ3aXNlIGl0IHdvdWxkIGNvbGxhcHNlLCBzaW5jZSBpdCBkb2Vzbid0IGdldCBmb2xkZWQuICovCisgICAgcWIgPSBGRk1JTjMoYiAtIHB1bHNlX2NhcCAtICg0IDw8IDMpLCAoYiArIE4yICogb2Zmc2V0KSAvIE4yLCA4IDw8IDMpOworICAgIHFuID0gKHFiIDwgKDEgPDwgMyA+PiAxKSkgPyAxIDogKChjZWx0X3FuX2V4cDJbcWIgJiAweDddID4+ICgxNCAtIChxYiA+PiAzKSkpICsgMSkgPj4gMSA8PCAxOworICAgIHJldHVybiBxbjsKK30KKworLy8gdGhpcyBjb2RlIHdhcyBhZGFwdGVkIGZyb20gbGlib3B1cworc3RhdGljIGlubGluZSB1aW50NjRfdCBjZWx0X2N3cnNpKHVuc2lnbmVkIGludCBOLCB1bnNpZ25lZCBpbnQgSywgdW5zaWduZWQgaW50IGksIGludCAqeSkKK3sKKyAgICB1aW50NjRfdCBub3JtID0gMDsKKyAgICB1aW50MzJfdCBwOworICAgIGludCBzLCB2YWw7CisgICAgaW50IGswOworCisgICAgd2hpbGUgKE4gPiAyKSB7CisgICAgICAgIHVpbnQzMl90IHE7CisKKyAgICAgICAgLypMb3RzIG9mIHB1bHNlcyBjYXNlOiovCisgICAgICAgIGlmIChLID49IE4pIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpyb3cgPSBjZWx0X3B2cV91X3Jvd1tOXTsKKworICAgICAgICAgICAgLyogQXJlIHRoZSBwdWxzZXMgaW4gdGhpcyBkaW1lbnNpb24gbmVnYXRpdmU/ICovCisgICAgICAgICAgICBwICA9IHJvd1tLICsgMV07CisgICAgICAgICAgICBzICA9IC0oaSA+PSBwKTsKKyAgICAgICAgICAgIGkgLT0gcCAmIHM7CisKKyAgICAgICAgICAgIC8qQ291bnQgaG93IG1hbnkgcHVsc2VzIHdlcmUgcGxhY2VkIGluIHRoaXMgZGltZW5zaW9uLiovCisgICAgICAgICAgICBrMCA9IEs7CisgICAgICAgICAgICBxID0gcm93W05dOworICAgICAgICAgICAgaWYgKHEgPiBpKSB7CisgICAgICAgICAgICAgICAgSyA9IE47CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBwID0gY2VsdF9wdnFfdV9yb3dbLS1LXVtOXTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChwID4gaSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSByb3dbS107IHAgPiBpOyBwID0gcm93W0tdKQorICAgICAgICAgICAgICAgICAgICBLLS07CisKKyAgICAgICAgICAgIGkgICAgLT0gcDsKKyAgICAgICAgICAgIHZhbCAgID0gKGswIC0gSyArIHMpIF4gczsKKyAgICAgICAgICAgIG5vcm0gKz0gdmFsICogdmFsOworICAgICAgICAgICAgKnkrKyAgPSB2YWw7CisgICAgICAgIH0gZWxzZSB7IC8qTG90cyBvZiBkaW1lbnNpb25zIGNhc2U6Ki8KKyAgICAgICAgICAgIC8qQXJlIHRoZXJlIGFueSBwdWxzZXMgaW4gdGhpcyBkaW1lbnNpb24gYXQgYWxsPyovCisgICAgICAgICAgICBwID0gY2VsdF9wdnFfdV9yb3dbSyAgICBdW05dOworICAgICAgICAgICAgcSA9IGNlbHRfcHZxX3Vfcm93W0sgKyAxXVtOXTsKKworICAgICAgICAgICAgaWYgKHAgPD0gaSAmJiBpIDwgcSkgeworICAgICAgICAgICAgICAgIGkgLT0gcDsKKyAgICAgICAgICAgICAgICAqeSsrID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLypBcmUgdGhlIHB1bHNlcyBpbiB0aGlzIGRpbWVuc2lvbiBuZWdhdGl2ZT8qLworICAgICAgICAgICAgICAgIHMgID0gLShpID49IHEpOworICAgICAgICAgICAgICAgIGkgLT0gcSAmIHM7CisKKyAgICAgICAgICAgICAgICAvKkNvdW50IGhvdyBtYW55IHB1bHNlcyB3ZXJlIHBsYWNlZCBpbiB0aGlzIGRpbWVuc2lvbi4qLworICAgICAgICAgICAgICAgIGswID0gSzsKKyAgICAgICAgICAgICAgICBkbyBwID0gY2VsdF9wdnFfdV9yb3dbLS1LXVtOXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAocCA+IGkpOworCisgICAgICAgICAgICAgICAgaSAgICAtPSBwOworICAgICAgICAgICAgICAgIHZhbCAgID0gKGswIC0gSyArIHMpIF4gczsKKyAgICAgICAgICAgICAgICBub3JtICs9IHZhbCAqIHZhbDsKKyAgICAgICAgICAgICAgICAqeSsrICA9IHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBOLS07CisgICAgfQorCisgICAgLyogTiA9PSAyICovCisgICAgcCAgPSAyICogSyArIDE7CisgICAgcyAgPSAtKGkgPj0gcCk7CisgICAgaSAtPSBwICYgczsKKyAgICBrMCA9IEs7CisgICAgSyAgPSAoaSArIDEpIC8gMjsKKworICAgIGlmIChLKQorICAgICAgICBpIC09IDIgKiBLIC0gMTsKKworICAgIHZhbCAgID0gKGswIC0gSyArIHMpIF4gczsKKyAgICBub3JtICs9IHZhbCAqIHZhbDsKKyAgICAqeSsrICA9IHZhbDsKKworICAgIC8qIE49PTEgKi8KKyAgICBzICAgICA9IC1pOworICAgIHZhbCAgID0gKEsgKyBzKSBeIHM7CisgICAgbm9ybSArPSB2YWwgKiB2YWw7CisgICAgKnkgICAgPSB2YWw7CisKKyAgICByZXR1cm4gbm9ybTsKK30KKworc3RhdGljIGlubGluZSBmbG9hdCBjZWx0X2RlY29kZV9wdWxzZXMoT3B1c1JhbmdlQ29kZXIgKnJjLCBpbnQgKnksIHVuc2lnbmVkIGludCBOLCB1bnNpZ25lZCBpbnQgSykKK3sKKyAgICB1bnNpZ25lZCBpbnQgaWR4OworI2RlZmluZSBDRUxUX1BWUV9VKG4sIGspIChjZWx0X3B2cV91X3Jvd1tGRk1JTihuLCBrKV1bRkZNQVgobiwgayldKQorI2RlZmluZSBDRUxUX1BWUV9WKG4sIGspIChDRUxUX1BWUV9VKG4sIGspICsgQ0VMVF9QVlFfVShuLCAoaykgKyAxKSkKKyAgICBpZHggPSBvcHVzX3JjX3VuaW1vZGVsKHJjLCBDRUxUX1BWUV9WKE4sIEspKTsKKyAgICByZXR1cm4gY2VsdF9jd3JzaShOLCBLLCBpZHgsIHkpOworfQorCisvKiogRGVjb2RlIHB1bHNlIHZlY3RvciBhbmQgY29tYmluZSB0aGUgcmVzdWx0IHdpdGggdGhlIHBpdGNoIHZlY3RvciB0byBwcm9kdWNlCisgICAgdGhlIGZpbmFsIG5vcm1hbGlzZWQgc2lnbmFsIGluIHRoZSBjdXJyZW50IGJhbmQuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjZWx0X2FsZ191bnF1YW50KE9wdXNSYW5nZUNvZGVyICpyYywgZmxvYXQgKlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBOLCB1bnNpZ25lZCBpbnQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBDZWx0U3ByZWFkIHNwcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJsb2NrcywgZmxvYXQgZ2FpbikKK3sKKyAgICBpbnQgeVsxNzZdOworCisgICAgZ2FpbiAvPSBzcXJ0ZihjZWx0X2RlY29kZV9wdWxzZXMocmMsIHksIE4sIEspKTsKKyAgICBjZWx0X25vcm1hbGl6ZV9yZXNpZHVhbCh5LCBYLCBOLCBnYWluKTsKKyAgICBjZWx0X2V4cF9yb3RhdGlvbihYLCBOLCBibG9ja3MsIEssIHNwcmVhZCk7CisgICAgcmV0dXJuIGNlbHRfZXh0cmFjdF9jb2xsYXBzZV9tYXNrKHksIE4sIGJsb2Nrcyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2VsdF9kZWNvZGVfYmFuZChDZWx0Q29udGV4dCAqcywgT3B1c1JhbmdlQ29kZXIgKnJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYW5kLCBmbG9hdCAqWCwgZmxvYXQgKlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE4sIGludCBiLCB1bnNpZ25lZCBpbnQgYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpsb3diYW5kLCBpbnQgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmxvd2JhbmRfb3V0LCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ2FpbiwgZmxvYXQgKmxvd2JhbmRfc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpjYWNoZTsKKyAgICBpbnQgZHVhbHN0ZXJlbywgc3BsaXQ7CisgICAgaW50IGltaWQgPSAwLCBpc2lkZSA9IDA7CisgICAgdW5zaWduZWQgaW50IE4wID0gTjsKKyAgICBpbnQgTl9COworICAgIGludCBOX0IwOworICAgIGludCBCMCA9IGJsb2NrczsKKyAgICBpbnQgdGltZV9kaXZpZGUgPSAwOworICAgIGludCByZWNvbWJpbmUgPSAwOworICAgIGludCBpbnYgPSAwOworICAgIGZsb2F0IG1pZCA9IDAsIHNpZGUgPSAwOworICAgIGludCBsb25nYmxvY2tzID0gKEIwID09IDEpOworICAgIHVuc2lnbmVkIGludCBjbSA9IDA7CisKKyAgICBOX0IwID0gTl9CID0gTiAvIGJsb2NrczsKKyAgICBzcGxpdCA9IGR1YWxzdGVyZW8gPSAoWSAhPSBOVUxMKTsKKworICAgIGlmIChOID09IDEpIHsKKyAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciBvbmUgc2FtcGxlICovCisgICAgICAgIGludCBpOworICAgICAgICBmbG9hdCAqeCA9IFg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gZHVhbHN0ZXJlbzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgc2lnbiA9IDA7CisgICAgICAgICAgICBpZiAocy0+cmVtYWluaW5nMiA+PSAxPDwzKSB7CisgICAgICAgICAgICAgICAgc2lnbiAgICAgICAgICAgPSBvcHVzX2dldHJhd2JpdHMocmMsIDEpOworICAgICAgICAgICAgICAgIHMtPnJlbWFpbmluZzIgLT0gMSA8PCAzOworICAgICAgICAgICAgICAgIGIgICAgICAgICAgICAgLT0gMSA8PCAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeFswXSA9IHNpZ24gPyAtMS4wZiA6IDEuMGY7CisgICAgICAgICAgICB4ID0gWTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG93YmFuZF9vdXQpCisgICAgICAgICAgICBsb3diYW5kX291dFswXSA9IFhbMF07CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICghZHVhbHN0ZXJlbyAmJiBsZXZlbCA9PSAwKSB7CisgICAgICAgIGludCB0Zl9jaGFuZ2UgPSBzLT50Zl9jaGFuZ2VbYmFuZF07CisgICAgICAgIGludCBrOworICAgICAgICBpZiAodGZfY2hhbmdlID4gMCkKKyAgICAgICAgICAgIHJlY29tYmluZSA9IHRmX2NoYW5nZTsKKyAgICAgICAgLyogQmFuZCByZWNvbWJpbmluZyB0byBpbmNyZWFzZSBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLworCisgICAgICAgIGlmIChsb3diYW5kICYmCisgICAgICAgICAgICAocmVjb21iaW5lIHx8ICgoTl9CICYgMSkgPT0gMCAmJiB0Zl9jaGFuZ2UgPCAwKSB8fCBCMCA+IDEpKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKyspCisgICAgICAgICAgICAgICAgbG93YmFuZF9zY3JhdGNoW2pdID0gbG93YmFuZFtqXTsKKyAgICAgICAgICAgIGxvd2JhbmQgPSBsb3diYW5kX3NjcmF0Y2g7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmVjb21iaW5lOyBrKyspIHsKKyAgICAgICAgICAgIGlmIChsb3diYW5kKQorICAgICAgICAgICAgICAgIGNlbHRfaGFhcjEobG93YmFuZCwgTiA+PiBrLCAxIDw8IGspOworICAgICAgICAgICAgZmlsbCA9IGNlbHRfYml0X2ludGVybGVhdmVbZmlsbCAmIDB4Rl0gfCBjZWx0X2JpdF9pbnRlcmxlYXZlW2ZpbGwgPj4gNF0gPDwgMjsKKyAgICAgICAgfQorICAgICAgICBibG9ja3MgPj49IHJlY29tYmluZTsKKyAgICAgICAgTl9CIDw8PSByZWNvbWJpbmU7CisKKyAgICAgICAgLyogSW5jcmVhc2luZyB0aGUgdGltZSByZXNvbHV0aW9uICovCisgICAgICAgIHdoaWxlICgoTl9CICYgMSkgPT0gMCAmJiB0Zl9jaGFuZ2UgPCAwKSB7CisgICAgICAgICAgICBpZiAobG93YmFuZCkKKyAgICAgICAgICAgICAgICBjZWx0X2hhYXIxKGxvd2JhbmQsIE5fQiwgYmxvY2tzKTsKKyAgICAgICAgICAgIGZpbGwgfD0gZmlsbCA8PCBibG9ja3M7CisgICAgICAgICAgICBibG9ja3MgPDw9IDE7CisgICAgICAgICAgICBOX0IgPj49IDE7CisgICAgICAgICAgICB0aW1lX2RpdmlkZSsrOworICAgICAgICAgICAgdGZfY2hhbmdlKys7CisgICAgICAgIH0KKyAgICAgICAgQjAgPSBibG9ja3M7CisgICAgICAgIE5fQjAgPSBOX0I7CisKKyAgICAgICAgLyogUmVvcmdhbml6ZSB0aGUgc2FtcGxlcyBpbiB0aW1lIG9yZGVyIGluc3RlYWQgb2YgZnJlcXVlbmN5IG9yZGVyICovCisgICAgICAgIGlmIChCMCA+IDEgJiYgbG93YmFuZCkKKyAgICAgICAgICAgIGNlbHRfZGVpbnRlcmxlYXZlX2hhZGFtYXJkKHMtPnNjcmF0Y2gsIGxvd2JhbmQsIE5fQiA+PiByZWNvbWJpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCMCA8PCByZWNvbWJpbmUsIGxvbmdibG9ja3MpOworICAgIH0KKworICAgIC8qIElmIHdlIG5lZWQgMS41IG1vcmUgYml0IHRoYW4gd2UgY2FuIHByb2R1Y2UsIHNwbGl0IHRoZSBiYW5kIGluIHR3by4gKi8KKyAgICBjYWNoZSA9IGNlbHRfY2FjaGVfYml0cyArCisgICAgICAgICAgICBjZWx0X2NhY2hlX2luZGV4WyhkdXJhdGlvbiArIDEpICogQ0VMVF9NQVhfQkFORFMgKyBiYW5kXTsKKyAgICBpZiAoIWR1YWxzdGVyZW8gJiYgZHVyYXRpb24gPj0gMCAmJiBiID4gY2FjaGVbY2FjaGVbMF1dICsgMTIgJiYgTiA+IDIpIHsKKyAgICAgICAgTiA+Pj0gMTsKKyAgICAgICAgWSA9IFggKyBOOworICAgICAgICBzcGxpdCA9IDE7CisgICAgICAgIGR1cmF0aW9uIC09IDE7CisgICAgICAgIGlmIChibG9ja3MgPT0gMSkKKyAgICAgICAgICAgIGZpbGwgPSAoZmlsbCAmIDEpIHwgKGZpbGwgPDwgMSk7CisgICAgICAgIGJsb2NrcyA9IChibG9ja3MgKyAxKSA+PiAxOworICAgIH0KKworICAgIGlmIChzcGxpdCkgeworICAgICAgICBpbnQgcW47CisgICAgICAgIGludCBpdGhldGEgPSAwOworICAgICAgICBpbnQgbWJpdHMsIHNiaXRzLCBkZWx0YTsKKyAgICAgICAgaW50IHFhbGxvYzsKKyAgICAgICAgaW50IHB1bHNlX2NhcDsKKyAgICAgICAgaW50IG9mZnNldDsKKyAgICAgICAgaW50IG9yaWdfZmlsbDsKKyAgICAgICAgaW50IHRlbGw7CisKKyAgICAgICAgLyogRGVjaWRlIG9uIHRoZSByZXNvbHV0aW9uIHRvIGdpdmUgdG8gdGhlIHNwbGl0IHBhcmFtZXRlciB0aGV0YSAqLworICAgICAgICBwdWxzZV9jYXAgPSBjZWx0X2xvZ19mcmVxX3JhbmdlW2JhbmRdICsgZHVyYXRpb24gKiA4OworICAgICAgICBvZmZzZXQgPSAocHVsc2VfY2FwID4+IDEpIC0gKGR1YWxzdGVyZW8gJiYgTiA9PSAyID8gQ0VMVF9RVEhFVEFfT0ZGU0VUX1RXT1BIQVNFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxUX1FUSEVUQV9PRkZTRVQpOworICAgICAgICBxbiA9IChkdWFsc3RlcmVvICYmIGJhbmQgPj0gcy0+aW50ZW5zaXR5c3RlcmVvKSA/IDEgOgorICAgICAgICAgICAgIGNlbHRfY29tcHV0ZV9xbihOLCBiLCBvZmZzZXQsIHB1bHNlX2NhcCwgZHVhbHN0ZXJlbyk7CisgICAgICAgIHRlbGwgPSBvcHVzX3JjX3RlbGxfZnJhYyhyYyk7CisgICAgICAgIGlmIChxbiAhPSAxKSB7CisgICAgICAgICAgICAvKiBFbnRyb3B5IGNvZGluZyBvZiB0aGUgYW5nbGUuIFdlIHVzZSBhIHVuaWZvcm0gcGRmIGZvciB0aGUKKyAgICAgICAgICAgIHRpbWUgc3BsaXQsIGEgc3RlcCBmb3Igc3RlcmVvLCBhbmQgYSB0cmlhbmd1bGFyIG9uZSBmb3IgdGhlIHJlc3QuICovCisgICAgICAgICAgICBpZiAoZHVhbHN0ZXJlbyAmJiBOID4gMikKKyAgICAgICAgICAgICAgICBpdGhldGEgPSBvcHVzX3JjX3N0ZXBtb2RlbChyYywgcW4vMik7CisgICAgICAgICAgICBlbHNlIGlmIChkdWFsc3RlcmVvIHx8IEIwID4gMSkKKyAgICAgICAgICAgICAgICBpdGhldGEgPSBvcHVzX3JjX3VuaW1vZGVsKHJjLCBxbisxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpdGhldGEgPSBvcHVzX3JjX3RyaW1vZGVsKHJjLCBxbik7CisgICAgICAgICAgICBpdGhldGEgPSBpdGhldGEgKiAxNjM4NCAvIHFuOworICAgICAgICAgICAgLyogTk9URTogUmVub3JtYWxpc2luZyBYIGFuZCBZICptYXkqIGhlbHAgZml4ZWQtcG9pbnQgYSBiaXQgYXQgdmVyeSBoaWdoIHJhdGUuCisgICAgICAgICAgICBMZXQncyBkbyB0aGF0IGF0IGhpZ2hlciBjb21wbGV4aXR5ICovCisgICAgICAgIH0gZWxzZSBpZiAoZHVhbHN0ZXJlbykgeworICAgICAgICAgICAgaW52ID0gKGIgPiAyIDw8IDMgJiYgcy0+cmVtYWluaW5nMiA+IDIgPDwgMykgPyBvcHVzX3JjX3AybW9kZWwocmMsIDIpIDogMDsKKyAgICAgICAgICAgIGl0aGV0YSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcWFsbG9jID0gb3B1c19yY190ZWxsX2ZyYWMocmMpIC0gdGVsbDsKKyAgICAgICAgYiAtPSBxYWxsb2M7CisKKyAgICAgICAgb3JpZ19maWxsID0gZmlsbDsKKyAgICAgICAgaWYgKGl0aGV0YSA9PSAwKSB7CisgICAgICAgICAgICBpbWlkID0gMzI3Njc7CisgICAgICAgICAgICBpc2lkZSA9IDA7CisgICAgICAgICAgICBmaWxsICY9ICgxIDw8IGJsb2NrcykgLSAxOworICAgICAgICAgICAgZGVsdGEgPSAtMTYzODQ7CisgICAgICAgIH0gZWxzZSBpZiAoaXRoZXRhID09IDE2Mzg0KSB7CisgICAgICAgICAgICBpbWlkID0gMDsKKyAgICAgICAgICAgIGlzaWRlID0gMzI3Njc7CisgICAgICAgICAgICBmaWxsICY9ICgoMSA8PCBibG9ja3MpIC0gMSkgPDwgYmxvY2tzOworICAgICAgICAgICAgZGVsdGEgPSAxNjM4NDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGltaWQgPSBjZWx0X2NvcyhpdGhldGEpOworICAgICAgICAgICAgaXNpZGUgPSBjZWx0X2NvcygxNjM4NC1pdGhldGEpOworICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgbWlkIHZzIHNpZGUgYWxsb2NhdGlvbiB0aGF0IG1pbmltaXplcyBzcXVhcmVkIGVycm9yCisgICAgICAgICAgICBpbiB0aGF0IGJhbmQuICovCisgICAgICAgICAgICBkZWx0YSA9IFJPVU5EX01VTDE2KChOIC0gMSkgPDwgNywgY2VsdF9sb2cydGFuKGlzaWRlLCBpbWlkKSk7CisgICAgICAgIH0KKworICAgICAgICBtaWQgID0gaW1pZCAgLyAzMjc2OC4wZjsKKyAgICAgICAgc2lkZSA9IGlzaWRlIC8gMzI3NjguMGY7CisKKyAgICAgICAgLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgTj0yIHRoYXQgb25seSB3b3JrcyBmb3Igc3RlcmVvIGFuZCB0YWtlcworICAgICAgICBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCBtaWQgYW5kIHNpZGUgYXJlIG9ydGhvZ29uYWwgdG8gZW5jb2RlCisgICAgICAgIHRoZSBzaWRlIHdpdGgganVzdCBvbmUgYml0LiAqLworICAgICAgICBpZiAoTiA9PSAyICYmIGR1YWxzdGVyZW8pIHsKKyAgICAgICAgICAgIGludCBjOworICAgICAgICAgICAgaW50IHNpZ24gPSAwOworICAgICAgICAgICAgZmxvYXQgdG1wOworICAgICAgICAgICAgZmxvYXQgKngyLCAqeTI7CisgICAgICAgICAgICBtYml0cyA9IGI7CisgICAgICAgICAgICAvKiBPbmx5IG5lZWQgb25lIGJpdCBmb3IgdGhlIHNpZGUgKi8KKyAgICAgICAgICAgIHNiaXRzID0gKGl0aGV0YSAhPSAwICYmIGl0aGV0YSAhPSAxNjM4NCkgPyAxIDw8IDMgOiAwOworICAgICAgICAgICAgbWJpdHMgLT0gc2JpdHM7CisgICAgICAgICAgICBjID0gKGl0aGV0YSA+IDgxOTIpOworICAgICAgICAgICAgcy0+cmVtYWluaW5nMiAtPSBxYWxsb2Mrc2JpdHM7CisKKyAgICAgICAgICAgIHgyID0gYyA/IFkgOiBYOworICAgICAgICAgICAgeTIgPSBjID8gWCA6IFk7CisgICAgICAgICAgICBpZiAoc2JpdHMpCisgICAgICAgICAgICAgICAgc2lnbiA9IG9wdXNfZ2V0cmF3Yml0cyhyYywgMSk7CisgICAgICAgICAgICBzaWduID0gMSAtIDIgKiBzaWduOworICAgICAgICAgICAgLyogV2UgdXNlIG9yaWdfZmlsbCBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0byBmb2xkIHRoZSBzaWRlLCBidXQgaWYKKyAgICAgICAgICAgIGl0aGV0YT09MTYzODQsIHdlJ2xsIGhhdmUgY2xlYXJlZCB0aGUgbG93IGJpdHMgb2YgZmlsbC4gKi8KKyAgICAgICAgICAgIGNtID0gY2VsdF9kZWNvZGVfYmFuZChzLCByYywgYmFuZCwgeDIsIE5VTEwsIE4sIG1iaXRzLCBibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93YmFuZCwgZHVyYXRpb24sIGxvd2JhbmRfb3V0LCBsZXZlbCwgZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3diYW5kX3NjcmF0Y2gsIG9yaWdfZmlsbCk7CisgICAgICAgICAgICAvKiBXZSBkb24ndCBzcGxpdCBOPTIgYmFuZHMsIHNvIGNtIGlzIGVpdGhlciAxIG9yIDAgKGZvciBhIGZvbGQtY29sbGFwc2UpLAorICAgICAgICAgICAgYW5kIHRoZXJlJ3Mgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBtaXhpbmcgd2l0aCB0aGUgb3RoZXIgY2hhbm5lbC4gKi8KKyAgICAgICAgICAgIHkyWzBdID0gLXNpZ24gKiB4MlsxXTsKKyAgICAgICAgICAgIHkyWzFdID0gIHNpZ24gKiB4MlswXTsKKyAgICAgICAgICAgIFhbMF0gKj0gbWlkOworICAgICAgICAgICAgWFsxXSAqPSBtaWQ7CisgICAgICAgICAgICBZWzBdICo9IHNpZGU7CisgICAgICAgICAgICBZWzFdICo9IHNpZGU7CisgICAgICAgICAgICB0bXAgPSBYWzBdOworICAgICAgICAgICAgWFswXSA9IHRtcCAtIFlbMF07CisgICAgICAgICAgICBZWzBdID0gdG1wICsgWVswXTsKKyAgICAgICAgICAgIHRtcCA9IFhbMV07CisgICAgICAgICAgICBYWzFdID0gdG1wIC0gWVsxXTsKKyAgICAgICAgICAgIFlbMV0gPSB0bXAgKyBZWzFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogIk5vcm1hbCIgc3BsaXQgY29kZSAqLworICAgICAgICAgICAgZmxvYXQgKm5leHRfbG93YmFuZDIgICAgID0gTlVMTDsKKyAgICAgICAgICAgIGZsb2F0ICpuZXh0X2xvd2JhbmRfb3V0MSA9IE5VTEw7CisgICAgICAgICAgICBpbnQgbmV4dF9sZXZlbCA9IDA7CisgICAgICAgICAgICBpbnQgcmViYWxhbmNlOworCisgICAgICAgICAgICAvKiBHaXZlIG1vcmUgYml0cyB0byBsb3ctZW5lcmd5IE1EQ1RzIHRoYW4gdGhleSB3b3VsZAorICAgICAgICAgICAgICogb3RoZXJ3aXNlIGRlc2VydmUgKi8KKyAgICAgICAgICAgIGlmIChCMCA+IDEgJiYgIWR1YWxzdGVyZW8gJiYgKGl0aGV0YSAmIDB4M2ZmZikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXRoZXRhID4gODE5MikKKyAgICAgICAgICAgICAgICAgICAgLyogUm91Z2ggYXBwcm94aW1hdGlvbiBmb3IgcHJlLWVjaG8gbWFza2luZyAqLworICAgICAgICAgICAgICAgICAgICBkZWx0YSAtPSBkZWx0YSA+PiAoNCAtIGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8qIENvcnJlc3BvbmRzIHRvIGEgZm9yd2FyZC1tYXNraW5nIHNsb3BlIG9mCisgICAgICAgICAgICAgICAgICAgICAqIDEuNSBkQiBwZXIgMTAgbXMgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBGRk1JTigwLCBkZWx0YSArIChOIDw8IDMgPj4gKDUgLSBkdXJhdGlvbikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1iaXRzID0gYXZfY2xpcCgoYiAtIGRlbHRhKSAvIDIsIDAsIGIpOworICAgICAgICAgICAgc2JpdHMgPSBiIC0gbWJpdHM7CisgICAgICAgICAgICBzLT5yZW1haW5pbmcyIC09IHFhbGxvYzsKKworICAgICAgICAgICAgaWYgKGxvd2JhbmQgJiYgIWR1YWxzdGVyZW8pCisgICAgICAgICAgICAgICAgbmV4dF9sb3diYW5kMiA9IGxvd2JhbmQgKyBOOyAvKiA+MzItYml0IHNwbGl0IGNhc2UgKi8KKworICAgICAgICAgICAgLyogT25seSBzdGVyZW8gbmVlZHMgdG8gcGFzcyBvbiBsb3diYW5kX291dC4KKyAgICAgICAgICAgICAqIE90aGVyd2lzZSwgaXQncyBoYW5kbGVkIGF0IHRoZSBlbmQgKi8KKyAgICAgICAgICAgIGlmIChkdWFsc3RlcmVvKQorICAgICAgICAgICAgICAgIG5leHRfbG93YmFuZF9vdXQxID0gbG93YmFuZF9vdXQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmV4dF9sZXZlbCA9IGxldmVsICsgMTsKKworICAgICAgICAgICAgcmViYWxhbmNlID0gcy0+cmVtYWluaW5nMjsKKyAgICAgICAgICAgIGlmIChtYml0cyA+PSBzYml0cykgeworICAgICAgICAgICAgICAgIC8qIEluIHN0ZXJlbyBtb2RlLCB3ZSBkbyBub3QgYXBwbHkgYSBzY2FsaW5nIHRvIHRoZSBtaWQKKyAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIHdlIG5lZWQgdGhlIG5vcm1hbGl6ZWQgbWlkIGZvciBmb2xkaW5nIGxhdGVyICovCisgICAgICAgICAgICAgICAgY20gPSBjZWx0X2RlY29kZV9iYW5kKHMsIHJjLCBiYW5kLCBYLCBOVUxMLCBOLCBtYml0cywgYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3diYW5kLCBkdXJhdGlvbiwgbmV4dF9sb3diYW5kX291dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfbGV2ZWwsIGR1YWxzdGVyZW8gPyAxLjBmIDogKGdhaW4gKiBtaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3diYW5kX3NjcmF0Y2gsIGZpbGwpOworCisgICAgICAgICAgICAgICAgcmViYWxhbmNlID0gbWJpdHMgLSAocmViYWxhbmNlIC0gcy0+cmVtYWluaW5nMik7CisgICAgICAgICAgICAgICAgaWYgKHJlYmFsYW5jZSA+IDMgPDwgMyAmJiBpdGhldGEgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgc2JpdHMgKz0gcmViYWxhbmNlIC0gKDMgPDwgMyk7CisKKyAgICAgICAgICAgICAgICAvKiBGb3IgYSBzdGVyZW8gc3BsaXQsIHRoZSBoaWdoIGJpdHMgb2YgZmlsbCBhcmUgYWx3YXlzIHplcm8sCisgICAgICAgICAgICAgICAgICogc28gbm8gZm9sZGluZyB3aWxsIGJlIGRvbmUgdG8gdGhlIHNpZGUuICovCisgICAgICAgICAgICAgICAgY20gfD0gY2VsdF9kZWNvZGVfYmFuZChzLCByYywgYmFuZCwgWSwgTlVMTCwgTiwgc2JpdHMsIGJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfbG93YmFuZDIsIGR1cmF0aW9uLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9sZXZlbCwgZ2FpbiAqIHNpZGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID4+IGJsb2NrcykgPDwgKChCMCA+PiAxKSAmIChkdWFsc3RlcmVvIC0gMSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBGb3IgYSBzdGVyZW8gc3BsaXQsIHRoZSBoaWdoIGJpdHMgb2YgZmlsbCBhcmUgYWx3YXlzIHplcm8sCisgICAgICAgICAgICAgICAgICogc28gbm8gZm9sZGluZyB3aWxsIGJlIGRvbmUgdG8gdGhlIHNpZGUuICovCisgICAgICAgICAgICAgICAgY20gPSBjZWx0X2RlY29kZV9iYW5kKHMsIHJjLCBiYW5kLCBZLCBOVUxMLCBOLCBzYml0cywgYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2xvd2JhbmQyLCBkdXJhdGlvbiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9sZXZlbCwgZ2FpbiAqIHNpZGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPj4gYmxvY2tzKSA8PCAoKEIwID4+IDEpICYgKGR1YWxzdGVyZW8gLSAxKSk7CisKKyAgICAgICAgICAgICAgICByZWJhbGFuY2UgPSBzYml0cyAtIChyZWJhbGFuY2UgLSBzLT5yZW1haW5pbmcyKTsKKyAgICAgICAgICAgICAgICBpZiAocmViYWxhbmNlID4gMyA8PCAzICYmIGl0aGV0YSAhPSAxNjM4NCkKKyAgICAgICAgICAgICAgICAgICAgbWJpdHMgKz0gcmViYWxhbmNlIC0gKDMgPDwgMyk7CisKKyAgICAgICAgICAgICAgICAvKiBJbiBzdGVyZW8gbW9kZSwgd2UgZG8gbm90IGFwcGx5IGEgc2NhbGluZyB0byB0aGUgbWlkIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgKiB3ZSBuZWVkIHRoZSBub3JtYWxpemVkIG1pZCBmb3IgZm9sZGluZyBsYXRlciAqLworICAgICAgICAgICAgICAgIGNtIHw9IGNlbHRfZGVjb2RlX2JhbmQocywgcmMsIGJhbmQsIFgsIE5VTEwsIE4sIG1iaXRzLCBibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3diYW5kLCBkdXJhdGlvbiwgbmV4dF9sb3diYW5kX291dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2xldmVsLCBkdWFsc3RlcmVvID8gMS4wZiA6IChnYWluICogbWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2JhbmRfc2NyYXRjaCwgZmlsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGlzIGlzIHRoZSBiYXNpYyBuby1zcGxpdCBjYXNlICovCisgICAgICAgIHVuc2lnbmVkIGludCBxICAgICAgICAgPSBjZWx0X2JpdHMycHVsc2VzKGNhY2hlLCBiKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGN1cnJfYml0cyA9IGNlbHRfcHVsc2VzMmJpdHMoY2FjaGUsIHEpOworICAgICAgICBzLT5yZW1haW5pbmcyIC09IGN1cnJfYml0czsKKworICAgICAgICAvKiBFbnN1cmVzIHdlIGNhbiBuZXZlciBidXN0IHRoZSBidWRnZXQgKi8KKyAgICAgICAgd2hpbGUgKHMtPnJlbWFpbmluZzIgPCAwICYmIHEgPiAwKSB7CisgICAgICAgICAgICBzLT5yZW1haW5pbmcyICs9IGN1cnJfYml0czsKKyAgICAgICAgICAgIGN1cnJfYml0cyAgICAgID0gY2VsdF9wdWxzZXMyYml0cyhjYWNoZSwgLS1xKTsKKyAgICAgICAgICAgIHMtPnJlbWFpbmluZzIgLT0gY3Vycl9iaXRzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHEgIT0gMCkgeworICAgICAgICAgICAgLyogRmluYWxseSBkbyB0aGUgYWN0dWFsIHF1YW50aXphdGlvbiAqLworICAgICAgICAgICAgY20gPSBjZWx0X2FsZ191bnF1YW50KHJjLCBYLCBOLCAocSA8IDgpID8gcSA6ICg4ICsgKHEgJiA3KSkgPDwgKChxID4+IDMpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3ByZWFkLCBibG9ja3MsIGdhaW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogSWYgdGhlcmUncyBubyBwdWxzZSwgZmlsbCB0aGUgYmFuZCBhbnl3YXkgKi8KKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtX21hc2sgPSAoMSA8PCBibG9ja3MpIC0gMTsKKyAgICAgICAgICAgIGZpbGwgJj0gY21fbWFzazsKKyAgICAgICAgICAgIGlmICghZmlsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKyspCisgICAgICAgICAgICAgICAgICAgIFhbal0gPSAwLjBmOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIWxvd2JhbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTm9pc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIFhbal0gPSAoKChpbnQzMl90KWNlbHRfcm5nKHMpKSA+PiAyMCk7CisgICAgICAgICAgICAgICAgICAgIGNtID0gY21fbWFzazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBGb2xkZWQgc3BlY3RydW0gKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJvdXQgNDggZEIgYmVsb3cgdGhlICJub3JtYWwiIGZvbGRpbmcgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFhbal0gPSBsb3diYW5kW2pdICsgKCgoY2VsdF9ybmcocykpICYgMHg4MDAwKSA/IDEuMGYgLyAyNTYgOiAtMS4wZiAvIDI1Nik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY20gPSBmaWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjZWx0X3Jlbm9ybWFsaXplX3ZlY3RvcihYLCBOLCBnYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRoaXMgY29kZSBpcyB1c2VkIGJ5IHRoZSBkZWNvZGVyIGFuZCBieSB0aGUgcmVzeW50aGVzaXMtZW5hYmxlZCBlbmNvZGVyICovCisgICAgaWYgKGR1YWxzdGVyZW8pIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGlmIChOICE9IDIpCisgICAgICAgICAgICBjZWx0X3N0ZXJlb19tZXJnZShYLCBZLCBtaWQsIE4pOworICAgICAgICBpZiAoaW52KSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKQorICAgICAgICAgICAgICAgIFlbal0gKj0gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgaW50IGs7CisKKyAgICAgICAgLyogVW5kbyB0aGUgc2FtcGxlIHJlb3JnYW5pemF0aW9uIGdvaW5nIGZyb20gdGltZSBvcmRlciB0byBmcmVxdWVuY3kgb3JkZXIgKi8KKyAgICAgICAgaWYgKEIwID4gMSkKKyAgICAgICAgICAgIGNlbHRfaW50ZXJsZWF2ZV9oYWRhbWFyZChzLT5zY3JhdGNoLCBYLCBOX0I+PnJlY29tYmluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCMDw8cmVjb21iaW5lLCBsb25nYmxvY2tzKTsKKworICAgICAgICAvKiBVbmRvIHRpbWUtZnJlcSBjaGFuZ2VzIHRoYXQgd2UgZGlkIGVhcmxpZXIgKi8KKyAgICAgICAgTl9CID0gTl9CMDsKKyAgICAgICAgYmxvY2tzID0gQjA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCB0aW1lX2RpdmlkZTsgaysrKSB7CisgICAgICAgICAgICBibG9ja3MgPj49IDE7CisgICAgICAgICAgICBOX0IgPDw9IDE7CisgICAgICAgICAgICBjbSB8PSBjbSA+PiBibG9ja3M7CisgICAgICAgICAgICBjZWx0X2hhYXIxKFgsIE5fQiwgYmxvY2tzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoayA9IDA7IGsgPCByZWNvbWJpbmU7IGsrKykgeworICAgICAgICAgICAgY20gPSBjZWx0X2JpdF9kZWludGVybGVhdmVbY21dOworICAgICAgICAgICAgY2VsdF9oYWFyMShYLCBOMD4+aywgMTw8ayk7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2tzIDw8PSByZWNvbWJpbmU7CisKKyAgICAgICAgLyogU2NhbGUgb3V0cHV0IGZvciBsYXRlciBmb2xkaW5nICovCisgICAgICAgIGlmIChsb3diYW5kX291dCkgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBmbG9hdCBuID0gc3FydGYoTjApOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE4wOyBqKyspCisgICAgICAgICAgICAgICAgbG93YmFuZF9vdXRbal0gPSBuICogWFtqXTsKKyAgICAgICAgfQorICAgICAgICBjbSAmPSAoMSA8PCBibG9ja3MpIC0gMTsKKyAgICB9CisgICAgcmV0dXJuIGNtOworfQorCitzdGF0aWMgdm9pZCBjZWx0X2Rlbm9ybWFsaXplKENlbHRDb250ZXh0ICpzLCBDZWx0RnJhbWUgKmZyYW1lLCBmbG9hdCAqZGF0YSkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmVuZGJhbmQ7IGkrKykgeworICAgICAgICBmbG9hdCAqZHN0ID0gZGF0YSArIChjZWx0X2ZyZXFfYmFuZHNbaV0gPDwgcy0+ZHVyYXRpb24pOworICAgICAgICBmbG9hdCBub3JtID0gcG93KDIsIGZyYW1lLT5lbmVyZ3lbaV0gKyBjZWx0X21lYW5fZW5lcmd5W2ldKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2VsdF9mcmVxX3JhbmdlW2ldIDw8IHMtPmR1cmF0aW9uOyBqKyspCisgICAgICAgICAgICBkc3Rbal0gKj0gbm9ybTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNlbHRfcG9zdGZpbHRlcl9hcHBseV90cmFuc2l0aW9uKENlbHRGcmFtZSAqZnJhbWUsIGZsb2F0ICpkYXRhKQoreworICAgIGNvbnN0IGludCBUMCA9IGZyYW1lLT5wZl9wZXJpb2Rfb2xkOworICAgIGNvbnN0IGludCBUMSA9IGZyYW1lLT5wZl9wZXJpb2Q7CisKKyAgICBmbG9hdCBnMDAsIGcwMSwgZzAyOworICAgIGZsb2F0IGcxMCwgZzExLCBnMTI7CisKKyAgICBmbG9hdCB4MCwgeDEsIHgyLCB4MywgeDQ7CisKKyAgICBpbnQgaTsKKworICAgIGlmIChmcmFtZS0+cGZfZ2FpbnNbMF0gICAgID09IDAuMCAmJgorICAgICAgICBmcmFtZS0+cGZfZ2FpbnNfb2xkWzBdID09IDAuMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZzAwID0gZnJhbWUtPnBmX2dhaW5zX29sZFswXTsKKyAgICBnMDEgPSBmcmFtZS0+cGZfZ2FpbnNfb2xkWzFdOworICAgIGcwMiA9IGZyYW1lLT5wZl9nYWluc19vbGRbMl07CisgICAgZzEwID0gZnJhbWUtPnBmX2dhaW5zWzBdOworICAgIGcxMSA9IGZyYW1lLT5wZl9nYWluc1sxXTsKKyAgICBnMTIgPSBmcmFtZS0+cGZfZ2FpbnNbMl07CisKKyAgICB4MSA9IGRhdGFbLVQxICsgMV07CisgICAgeDIgPSBkYXRhWy1UMV07CisgICAgeDMgPSBkYXRhWy1UMSAtIDFdOworICAgIHg0ID0gZGF0YVstVDEgLSAyXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRUxUX09WRVJMQVA7IGkrKykgeworICAgICAgICBmbG9hdCB3ID0gZmZfY2VsdF93aW5kb3cyW2ldOworICAgICAgICB4MCA9IGRhdGFbaSAtIFQxICsgMl07CisKKyAgICAgICAgZGF0YVtpXSArPSAgKDEuMCAtIHcpICogZzAwICogZGF0YVtpIC0gVDBdICAgICAgICAgICAgICAgICAgICAgICAgICArCisgICAgICAgICAgICAgICAgICAgICgxLjAgLSB3KSAqIGcwMSAqIChkYXRhW2kgLSBUMCAtIDFdICsgZGF0YVtpIC0gVDAgKyAxXSkgKworICAgICAgICAgICAgICAgICAgICAoMS4wIC0gdykgKiBnMDIgKiAoZGF0YVtpIC0gVDAgLSAyXSArIGRhdGFbaSAtIFQwICsgMl0pICsKKyAgICAgICAgICAgICAgICAgICAgdyAgICAgICAgICogZzEwICogeDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCisgICAgICAgICAgICAgICAgICAgIHcgICAgICAgICAqIGcxMSAqICh4MSArIHgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgICAgICAgICAgICAgICAgICB3ICAgICAgICAgKiBnMTIgKiAoeDAgKyB4NCk7CisgICAgICAgIHg0ID0geDM7CisgICAgICAgIHgzID0geDI7CisgICAgICAgIHgyID0geDE7CisgICAgICAgIHgxID0geDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjZWx0X3Bvc3RmaWx0ZXJfYXBwbHkoQ2VsdEZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGF0YSwgaW50IGxlbikKK3sKKyAgICBjb25zdCBpbnQgVCA9IGZyYW1lLT5wZl9wZXJpb2Q7CisgICAgZmxvYXQgZzAsIGcxLCBnMjsKKyAgICBmbG9hdCB4MCwgeDEsIHgyLCB4MywgeDQ7CisgICAgaW50IGk7CisKKyAgICBpZiAoZnJhbWUtPnBmX2dhaW5zWzBdID09IDAuMCB8fCBsZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZzAgPSBmcmFtZS0+cGZfZ2FpbnNbMF07CisgICAgZzEgPSBmcmFtZS0+cGZfZ2FpbnNbMV07CisgICAgZzIgPSBmcmFtZS0+cGZfZ2FpbnNbMl07CisKKyAgICB4NCA9IGRhdGFbLVQgLSAyXTsKKyAgICB4MyA9IGRhdGFbLVQgLSAxXTsKKyAgICB4MiA9IGRhdGFbLVRdOworICAgIHgxID0gZGF0YVstVCArIDFdOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIHgwID0gZGF0YVtpIC0gVCArIDJdOworICAgICAgICBkYXRhW2ldICs9IGcwICogeDIgICAgICAgICsKKyAgICAgICAgICAgICAgICAgICBnMSAqICh4MSArIHgzKSArCisgICAgICAgICAgICAgICAgICAgZzIgKiAoeDAgKyB4NCk7CisgICAgICAgIHg0ID0geDM7CisgICAgICAgIHgzID0geDI7CisgICAgICAgIHgyID0geDE7CisgICAgICAgIHgxID0geDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjZWx0X3Bvc3RmaWx0ZXIoQ2VsdENvbnRleHQgKnMsIENlbHRGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IGxlbiA9IHMtPmJsb2Nrc2l6ZSAqIHMtPmJsb2NrczsKKworICAgIGNlbHRfcG9zdGZpbHRlcl9hcHBseV90cmFuc2l0aW9uKGZyYW1lLCBmcmFtZS0+YnVmICsgMTAyNCk7CisKKyAgICBmcmFtZS0+cGZfcGVyaW9kX29sZCA9IGZyYW1lLT5wZl9wZXJpb2Q7CisgICAgbWVtY3B5KGZyYW1lLT5wZl9nYWluc19vbGQsIGZyYW1lLT5wZl9nYWlucywgc2l6ZW9mKGZyYW1lLT5wZl9nYWlucykpOworCisgICAgZnJhbWUtPnBmX3BlcmlvZCA9IGZyYW1lLT5wZl9wZXJpb2RfbmV3OworICAgIG1lbWNweShmcmFtZS0+cGZfZ2FpbnMsIGZyYW1lLT5wZl9nYWluc19uZXcsIHNpemVvZihmcmFtZS0+cGZfZ2FpbnMpKTsKKworICAgIGlmIChsZW4gPiBDRUxUX09WRVJMQVApIHsKKyAgICAgICAgY2VsdF9wb3N0ZmlsdGVyX2FwcGx5X3RyYW5zaXRpb24oZnJhbWUsIGZyYW1lLT5idWYgKyAxMDI0ICsgQ0VMVF9PVkVSTEFQKTsKKyAgICAgICAgY2VsdF9wb3N0ZmlsdGVyX2FwcGx5KGZyYW1lLCBmcmFtZS0+YnVmICsgMTAyNCArIDIgKiBDRUxUX09WRVJMQVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSAyICogQ0VMVF9PVkVSTEFQKTsKKworICAgICAgICBmcmFtZS0+cGZfcGVyaW9kX29sZCA9IGZyYW1lLT5wZl9wZXJpb2Q7CisgICAgICAgIG1lbWNweShmcmFtZS0+cGZfZ2FpbnNfb2xkLCBmcmFtZS0+cGZfZ2FpbnMsIHNpemVvZihmcmFtZS0+cGZfZ2FpbnMpKTsKKyAgICB9CisKKyAgICBtZW1tb3ZlKGZyYW1lLT5idWYsIGZyYW1lLT5idWYgKyBsZW4sICgxMDI0ICsgQ0VMVF9PVkVSTEFQIC8gMikgKiBzaXplb2YoZmxvYXQpKTsKK30KKworc3RhdGljIGludCBwYXJzZV9wb3N0ZmlsdGVyKENlbHRDb250ZXh0ICpzLCBPcHVzUmFuZ2VDb2RlciAqcmMsIGludCBjb25zdW1lZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgcG9zdGZpbHRlcl90YXBzWzNdWzNdID0geworICAgICAgICB7IDAuMzA2NjQwNjI1MGYsIDAuMjE3MDQxMDE1NmYsIDAuMTI5NjM4NjcxOWYgfSwKKyAgICAgICAgeyAwLjQ2Mzg2NzE4NzVmLCAwLjI2ODA2NjQwNjJmLCAwLjAgICAgICAgICAgIH0sCisgICAgICAgIHsgMC43OTk4MDQ2ODc1ZiwgMC4xMDAwOTc2NTYyZiwgMC4wICAgICAgICAgICB9CisgICAgfTsKKyAgICBpbnQgaTsKKworICAgIG1lbXNldChzLT5mcmFtZVswXS5wZl9nYWluc19uZXcsIDAsIHNpemVvZihzLT5mcmFtZVswXS5wZl9nYWluc19uZXcpKTsKKyAgICBtZW1zZXQocy0+ZnJhbWVbMV0ucGZfZ2FpbnNfbmV3LCAwLCBzaXplb2Yocy0+ZnJhbWVbMV0ucGZfZ2FpbnNfbmV3KSk7CisKKyAgICBpZiAocy0+c3RhcnRiYW5kID09IDAgJiYgY29uc3VtZWQgKyAxNiA8PSBzLT5mcmFtZWJpdHMpIHsKKyAgICAgICAgaW50IGhhc19wb3N0ZmlsdGVyID0gb3B1c19yY19wMm1vZGVsKHJjLCAxKTsKKyAgICAgICAgaWYgKGhhc19wb3N0ZmlsdGVyKSB7CisgICAgICAgICAgICBmbG9hdCBnYWluOworICAgICAgICAgICAgaW50IHRhcHNldCwgb2N0YXZlLCBwZXJpb2Q7CisKKyAgICAgICAgICAgIG9jdGF2ZSA9IG9wdXNfcmNfdW5pbW9kZWwocmMsIDYpOworICAgICAgICAgICAgcGVyaW9kID0gKDE2IDw8IG9jdGF2ZSkgKyBvcHVzX2dldHJhd2JpdHMocmMsIDQgKyBvY3RhdmUpIC0gMTsKKyAgICAgICAgICAgIGdhaW4gICA9IDAuMDkzNzVmICogKG9wdXNfZ2V0cmF3Yml0cyhyYywgMykgKyAxKTsKKyAgICAgICAgICAgIHRhcHNldCA9IChvcHVzX3JjX3RlbGwocmMpICsgMiA8PSBzLT5mcmFtZWJpdHMpID8KKyAgICAgICAgICAgICAgICAgICAgIG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBjZWx0X21vZGVsX3RhcHNldCkgOiAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ2VsdEZyYW1lICpmcmFtZSA9ICZzLT5mcmFtZVtpXTsKKworICAgICAgICAgICAgICAgIGZyYW1lLT5wZl9wZXJpb2RfbmV3ID0gRkZNQVgocGVyaW9kLCBDRUxUX1BPU1RGSUxURVJfTUlOUEVSSU9EKTsKKyAgICAgICAgICAgICAgICBmcmFtZS0+cGZfZ2FpbnNfbmV3WzBdID0gZ2FpbiAqIHBvc3RmaWx0ZXJfdGFwc1t0YXBzZXRdWzBdOworICAgICAgICAgICAgICAgIGZyYW1lLT5wZl9nYWluc19uZXdbMV0gPSBnYWluICogcG9zdGZpbHRlcl90YXBzW3RhcHNldF1bMV07CisgICAgICAgICAgICAgICAgZnJhbWUtPnBmX2dhaW5zX25ld1syXSA9IGdhaW4gKiBwb3N0ZmlsdGVyX3RhcHNbdGFwc2V0XVsyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnN1bWVkID0gb3B1c19yY190ZWxsKHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29uc3VtZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYW50aWNvbGxhcHNlKENlbHRDb250ZXh0ICpzLCBDZWx0RnJhbWUgKmZyYW1lLCBmbG9hdCAqWCkKK3sKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmVuZGJhbmQ7IGkrKykgeworICAgICAgICBpbnQgcmVub3JtYWxpemUgPSAwOworICAgICAgICBmbG9hdCAqeHB0cjsKKyAgICAgICAgZmxvYXQgcHJldlsyXTsKKyAgICAgICAgZmxvYXQgRWRpZmYsIHI7CisgICAgICAgIGZsb2F0IHRocmVzaCwgc3FydF8xOworICAgICAgICBpbnQgZGVwdGg7CisKKyAgICAgICAgLyogZGVwdGggaW4gMS84IGJpdHMgKi8KKyAgICAgICAgZGVwdGggPSAoMSArIHMtPnB1bHNlc1tpXSkgLyAoY2VsdF9mcmVxX3JhbmdlW2ldIDw8IHMtPmR1cmF0aW9uKTsKKyAgICAgICAgdGhyZXNoID0gcG93KDIsIC0xLjAgLSAwLjEyNWYgKiBkZXB0aCk7CisgICAgICAgIHNxcnRfMSA9IDEuMGYgLyBzcXJ0ZihjZWx0X2ZyZXFfcmFuZ2VbaV0gPDwgcy0+ZHVyYXRpb24pOworCisgICAgICAgIHhwdHIgPSBYICsgKGNlbHRfZnJlcV9iYW5kc1tpXSA8PCBzLT5kdXJhdGlvbik7CisKKyAgICAgICAgcHJldlswXSA9IGZyYW1lLT5wcmV2X2VuZXJneVswXVtpXTsKKyAgICAgICAgcHJldlsxXSA9IGZyYW1lLT5wcmV2X2VuZXJneVsxXVtpXTsKKyAgICAgICAgaWYgKHMtPmNvZGVkX2NoYW5uZWxzID09IDEpIHsKKyAgICAgICAgICAgIENlbHRGcmFtZSAqZnJhbWUxID0gJnMtPmZyYW1lWzFdOworCisgICAgICAgICAgICBwcmV2WzBdID0gRkZNQVgocHJldlswXSwgZnJhbWUxLT5wcmV2X2VuZXJneVswXVtpXSk7CisgICAgICAgICAgICBwcmV2WzFdID0gRkZNQVgocHJldlsxXSwgZnJhbWUxLT5wcmV2X2VuZXJneVsxXVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgRWRpZmYgPSBmcmFtZS0+ZW5lcmd5W2ldIC0gRkZNSU4ocHJldlswXSwgcHJldlsxXSk7CisgICAgICAgIEVkaWZmID0gRkZNQVgoMCwgRWRpZmYpOworCisgICAgICAgIC8qIHIgbmVlZHMgdG8gYmUgbXVsdGlwbGllZCBieSAyIG9yIDIqc3FydCgyKSBkZXBlbmRpbmcgb24gTE0gYmVjYXVzZQorICAgICAgICBzaG9ydCBibG9ja3MgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBlbmVyZ3kgYXMgbG9uZyAqLworICAgICAgICByID0gcG93KDIsIDEgLSBFZGlmZik7CisgICAgICAgIGlmIChzLT5kdXJhdGlvbiA9PSAzKQorICAgICAgICAgICAgciAqPSBNX1NRUlQyOworICAgICAgICByID0gRkZNSU4odGhyZXNoLCByKSAqIHNxcnRfMTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IDEgPDwgcy0+ZHVyYXRpb247IGsrKykgeworICAgICAgICAgICAgLyogRGV0ZWN0IGNvbGxhcHNlICovCisgICAgICAgICAgICBpZiAoIShmcmFtZS0+Y29sbGFwc2VfbWFza3NbaV0gJiAxIDw8IGspKSB7CisgICAgICAgICAgICAgICAgLyogRmlsbCB3aXRoIG5vaXNlICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNlbHRfZnJlcV9yYW5nZVtpXTsgaisrKQorICAgICAgICAgICAgICAgICAgICB4cHRyWyhqIDw8IHMtPmR1cmF0aW9uKSArIGtdID0gKGNlbHRfcm5nKHMpICYgMHg4MDAwKSA/IHIgOiAtcjsKKyAgICAgICAgICAgICAgICByZW5vcm1hbGl6ZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBqdXN0IGFkZGVkIHNvbWUgZW5lcmd5LCBzbyB3ZSBuZWVkIHRvIHJlbm9ybWFsaXplICovCisgICAgICAgIGlmIChyZW5vcm1hbGl6ZSkKKyAgICAgICAgICAgIGNlbHRfcmVub3JtYWxpemVfdmVjdG9yKHhwdHIsIGNlbHRfZnJlcV9yYW5nZVtpXSA8PCBzLT5kdXJhdGlvbiwgMS4wZik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjZWx0X2RlY29kZV9iYW5kcyhDZWx0Q29udGV4dCAqcywgT3B1c1JhbmdlQ29kZXIgKnJjKQoreworICAgIGZsb2F0IGxvd2JhbmRfc2NyYXRjaFs4ICogMjJdOworICAgIGZsb2F0IG5vcm1bMiAqIDggKiAxMDBdOworCisgICAgaW50IHRvdGFsYml0cyA9IChzLT5mcmFtZWJpdHMgPDwgMykgLSBzLT5hbnRpY29sbGFwc2VfYml0OworCisgICAgaW50IHVwZGF0ZV9sb3diYW5kID0gMTsKKyAgICBpbnQgbG93YmFuZF9vZmZzZXQgPSAwOworCisgICAgaW50IGksIGo7CisKKyAgICBtZW1zZXQocy0+Y29lZmZzLCAwLCBzaXplb2Yocy0+Y29lZmZzKSk7CisKKyAgICBmb3IgKGkgPSBzLT5zdGFydGJhbmQ7IGkgPCBzLT5lbmRiYW5kOyBpKyspIHsKKyAgICAgICAgaW50IGJhbmRfb2Zmc2V0ID0gY2VsdF9mcmVxX2JhbmRzW2ldIDw8IHMtPmR1cmF0aW9uOworICAgICAgICBpbnQgYmFuZF9zaXplICAgPSBjZWx0X2ZyZXFfcmFuZ2VbaV0gPDwgcy0+ZHVyYXRpb247CisgICAgICAgIGZsb2F0ICpYID0gcy0+Y29lZmZzWzBdICsgYmFuZF9vZmZzZXQ7CisgICAgICAgIGZsb2F0ICpZID0gKHMtPmNvZGVkX2NoYW5uZWxzID09IDIpID8gcy0+Y29lZmZzWzFdICsgYmFuZF9vZmZzZXQgOiBOVUxMOworCisgICAgICAgIGludCBjb25zdW1lZCA9IG9wdXNfcmNfdGVsbF9mcmFjKHJjKTsKKyAgICAgICAgZmxvYXQgKm5vcm0yID0gbm9ybSArIDggKiAxMDA7CisgICAgICAgIGludCBlZmZlY3RpdmVfbG93YmFuZCA9IC0xOworICAgICAgICB1bnNpZ25lZCBpbnQgY21bMl07CisgICAgICAgIGludCBiOworCisgICAgICAgIC8qIENvbXB1dGUgaG93IG1hbnkgYml0cyB3ZSB3YW50IHRvIGFsbG9jYXRlIHRvIHRoaXMgYmFuZCAqLworICAgICAgICBpZiAoaSAhPSBzLT5zdGFydGJhbmQpCisgICAgICAgICAgICBzLT5yZW1haW5pbmcgLT0gY29uc3VtZWQ7CisgICAgICAgIHMtPnJlbWFpbmluZzIgPSB0b3RhbGJpdHMgLSBjb25zdW1lZCAtIDE7CisgICAgICAgIGlmIChpIDw9IHMtPmNvZGVkYmFuZHMgLSAxKSB7CisgICAgICAgICAgICBpbnQgY3Vycl9iYWxhbmNlID0gcy0+cmVtYWluaW5nIC8gRkZNSU4oMywgcy0+Y29kZWRiYW5kcy1pKTsKKyAgICAgICAgICAgIGIgPSBhdl9jbGlwKEZGTUlOKHMtPnJlbWFpbmluZzIgKyAxLCBzLT5wdWxzZXNbaV0gKyBjdXJyX2JhbGFuY2UpLCAwLCAxNjM4Myk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYiA9IDA7CisKKyAgICAgICAgaWYgKGNlbHRfZnJlcV9iYW5kc1tpXSAtIGNlbHRfZnJlcV9yYW5nZVtpXSA+PSBjZWx0X2ZyZXFfYmFuZHNbcy0+c3RhcnRiYW5kXSAmJgorICAgICAgICAgICAgKHVwZGF0ZV9sb3diYW5kIHx8IGxvd2JhbmRfb2Zmc2V0ID09IDApKQorICAgICAgICAgICAgbG93YmFuZF9vZmZzZXQgPSBpOworCisgICAgICAgIC8qIEdldCBhIGNvbnNlcnZhdGl2ZSBlc3RpbWF0ZSBvZiB0aGUgY29sbGFwc2VfbWFzaydzIGZvciB0aGUgYmFuZHMgd2UncmUKKyAgICAgICAgZ29pbmcgdG8gYmUgZm9sZGluZyBmcm9tLiAqLworICAgICAgICBpZiAobG93YmFuZF9vZmZzZXQgIT0gMCAmJiAocy0+c3ByZWFkICE9IENFTFRfU1BSRUFEX0FHR1JFU1NJVkUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrcyA+IDEgfHwgcy0+dGZfY2hhbmdlW2ldIDwgMCkpIHsKKyAgICAgICAgICAgIGludCBmb2xkc3RhcnQsIGZvbGRlbmQ7CisKKyAgICAgICAgICAgIC8qIFRoaXMgZW5zdXJlcyB3ZSBuZXZlciByZXBlYXQgc3BlY3RyYWwgY29udGVudCB3aXRoaW4gb25lIGJhbmQgKi8KKyAgICAgICAgICAgIGVmZmVjdGl2ZV9sb3diYW5kID0gRkZNQVgoY2VsdF9mcmVxX2JhbmRzW3MtPnN0YXJ0YmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbHRfZnJlcV9iYW5kc1tsb3diYW5kX29mZnNldF0gLSBjZWx0X2ZyZXFfcmFuZ2VbaV0pOworICAgICAgICAgICAgZm9sZHN0YXJ0ID0gbG93YmFuZF9vZmZzZXQ7CisgICAgICAgICAgICB3aGlsZSAoY2VsdF9mcmVxX2JhbmRzWy0tZm9sZHN0YXJ0XSA+IGVmZmVjdGl2ZV9sb3diYW5kKTsKKyAgICAgICAgICAgIGZvbGRlbmQgPSBsb3diYW5kX29mZnNldCAtIDE7CisgICAgICAgICAgICB3aGlsZSAoY2VsdF9mcmVxX2JhbmRzWysrZm9sZGVuZF0gPCBlZmZlY3RpdmVfbG93YmFuZCArIGNlbHRfZnJlcV9yYW5nZVtpXSk7CisKKyAgICAgICAgICAgIGNtWzBdID0gY21bMV0gPSAwOworICAgICAgICAgICAgZm9yIChqID0gZm9sZHN0YXJ0OyBqIDwgZm9sZGVuZDsgaisrKSB7CisgICAgICAgICAgICAgICAgY21bMF0gfD0gcy0+ZnJhbWVbMF0uY29sbGFwc2VfbWFza3Nbal07CisgICAgICAgICAgICAgICAgY21bMV0gfD0gcy0+ZnJhbWVbcy0+Y29kZWRfY2hhbm5lbHMgLSAxXS5jb2xsYXBzZV9tYXNrc1tqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAvKiBPdGhlcndpc2UsIHdlJ2xsIGJlIHVzaW5nIHRoZSBMQ0cgdG8gZm9sZCwgc28gYWxsIGJsb2NrcyB3aWxsIChhbG1vc3QKKyAgICAgICAgICAgIGFsd2F5cykgYmUgbm9uLXplcm8uKi8KKyAgICAgICAgICAgIGNtWzBdID0gY21bMV0gPSAoMSA8PCBzLT5ibG9ja3MpIC0gMTsKKworICAgICAgICBpZiAocy0+ZHVhbHN0ZXJlbyAmJiBpID09IHMtPmludGVuc2l0eXN0ZXJlbykgeworICAgICAgICAgICAgLyogU3dpdGNoIG9mZiBkdWFsIHN0ZXJlbyB0byBkbyBpbnRlbnNpdHkgKi8KKyAgICAgICAgICAgIHMtPmR1YWxzdGVyZW8gPSAwOworICAgICAgICAgICAgZm9yIChqID0gY2VsdF9mcmVxX2JhbmRzW3MtPnN0YXJ0YmFuZF0gPDwgcy0+ZHVyYXRpb247IGogPCBiYW5kX29mZnNldDsgaisrKQorICAgICAgICAgICAgICAgIG5vcm1bal0gPSAobm9ybVtqXSArIG5vcm0yW2pdKSAvIDI7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+ZHVhbHN0ZXJlbykgeworICAgICAgICAgICAgY21bMF0gPSBjZWx0X2RlY29kZV9iYW5kKHMsIHJjLCBpLCBYLCBOVUxMLCBiYW5kX3NpemUsIGIgLyAyLCBzLT5ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlX2xvd2JhbmQgIT0gLTEgPyBub3JtICsgKGVmZmVjdGl2ZV9sb3diYW5kIDw8IHMtPmR1cmF0aW9uKSA6IE5VTEwsIHMtPmR1cmF0aW9uLAorICAgICAgICAgICAgbm9ybSArIGJhbmRfb2Zmc2V0LCAwLCAxLjBmLCBsb3diYW5kX3NjcmF0Y2gsIGNtWzBdKTsKKworICAgICAgICAgICAgY21bMV0gPSBjZWx0X2RlY29kZV9iYW5kKHMsIHJjLCBpLCBZLCBOVUxMLCBiYW5kX3NpemUsIGIvMiwgcy0+YmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZV9sb3diYW5kICE9IC0xID8gbm9ybTIgKyAoZWZmZWN0aXZlX2xvd2JhbmQgPDwgcy0+ZHVyYXRpb24pIDogTlVMTCwgcy0+ZHVyYXRpb24sCisgICAgICAgICAgICBub3JtMiArIGJhbmRfb2Zmc2V0LCAwLCAxLjBmLCBsb3diYW5kX3NjcmF0Y2gsIGNtWzFdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtWzBdID0gY2VsdF9kZWNvZGVfYmFuZChzLCByYywgaSwgWCwgWSwgYmFuZF9zaXplLCBiLCBzLT5ibG9ja3MsCisgICAgICAgICAgICBlZmZlY3RpdmVfbG93YmFuZCAhPSAtMSA/IG5vcm0gKyAoZWZmZWN0aXZlX2xvd2JhbmQgPDwgcy0+ZHVyYXRpb24pIDogTlVMTCwgcy0+ZHVyYXRpb24sCisgICAgICAgICAgICBub3JtICsgYmFuZF9vZmZzZXQsIDAsIDEuMGYsIGxvd2JhbmRfc2NyYXRjaCwgY21bMF18Y21bMV0pOworCisgICAgICAgICAgICBjbVsxXSA9IGNtWzBdOworICAgICAgICB9CisKKyAgICAgICAgcy0+ZnJhbWVbMF0uY29sbGFwc2VfbWFza3NbaV0gICAgICAgICAgICAgICAgICAgICA9ICh1aW50OF90KWNtWzBdOworICAgICAgICBzLT5mcmFtZVtzLT5jb2RlZF9jaGFubmVscyAtIDFdLmNvbGxhcHNlX21hc2tzW2ldID0gKHVpbnQ4X3QpY21bMV07CisgICAgICAgIHMtPnJlbWFpbmluZyArPSBzLT5wdWxzZXNbaV0gKyBjb25zdW1lZDsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIGZvbGRpbmcgcG9zaXRpb24gb25seSBhcyBsb25nIGFzIHdlIGhhdmUgMSBiaXQvc2FtcGxlIGRlcHRoICovCisgICAgICAgIHVwZGF0ZV9sb3diYW5kID0gKGIgPiBiYW5kX3NpemUgPDwgMyk7CisgICAgfQorfQorCitpbnQgZmZfY2VsdF9kZWNvZGVfZnJhbWUoQ2VsdENvbnRleHQgKnMsIE9wdXNSYW5nZUNvZGVyICpyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKm91dHB1dCwgaW50IGNvZGVkX2NoYW5uZWxzLCBpbnQgZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRiYW5kLCAgaW50IGVuZGJhbmQpCit7CisgICAgaW50IGksIGo7CisKKyAgICBpbnQgY29uc3VtZWQ7ICAgICAgICAgICAvLyBiaXRzIG9mIGVudHJvcHkgY29uc3VtZWQgdGh1cyBmYXIgZm9yIHRoaXMgZnJhbWUKKyAgICBpbnQgc2lsZW5jZSA9IDA7CisgICAgaW50IHRyYW5zaWVudCA9IDA7CisgICAgaW50IGFudGljb2xsYXBzZSA9IDA7CisgICAgQ2VsdElNRENUQ29udGV4dCAqaW1kY3Q7CisgICAgZmxvYXQgaW1kY3Rfc2NhbGUgPSAxLjA7CisKKyAgICBpZiAoY29kZWRfY2hhbm5lbHMgIT0gMSAmJiBjb2RlZF9jaGFubmVscyAhPSAyKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgY29kZWQgY2hhbm5lbHM6ICVkXG4iLAorICAgICAgICAgICAgICAgY29kZWRfY2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKHN0YXJ0YmFuZCA8IDAgfHwgc3RhcnRiYW5kID4gZW5kYmFuZCB8fCBlbmRiYW5kID4gQ0VMVF9NQVhfQkFORFMpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHN0YXJ0L2VuZCBiYW5kOiAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgIHN0YXJ0YmFuZCwgZW5kYmFuZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPmZsdXNoZWQgICAgICAgID0gMDsKKyAgICBzLT5jb2RlZF9jaGFubmVscyA9IGNvZGVkX2NoYW5uZWxzOworICAgIHMtPnN0YXJ0YmFuZCAgICAgID0gc3RhcnRiYW5kOworICAgIHMtPmVuZGJhbmQgICAgICAgID0gZW5kYmFuZDsKKyAgICBzLT5mcmFtZWJpdHMgICAgICA9IHJjLT5yYi5ieXRlcyAqIDg7CisKKyAgICBzLT5kdXJhdGlvbiA9IGF2X2xvZzIoZnJhbWVfc2l6ZSAvIENFTFRfU0hPUlRfQkxPQ0tTSVpFKTsKKyAgICBpZiAocy0+ZHVyYXRpb24gPiBDRUxUX01BWF9MT0dfQkxPQ0tTIHx8CisgICAgICAgIGZyYW1lX3NpemUgIT0gQ0VMVF9TSE9SVF9CTE9DS1NJWkUgKiAoMSA8PCBzLT5kdXJhdGlvbikpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIENFTFQgZnJhbWUgc2l6ZTogJWRcbiIsCisgICAgICAgICAgICAgICBmcmFtZV9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCFzLT5vdXRwdXRfY2hhbm5lbHMpCisgICAgICAgIHMtPm91dHB1dF9jaGFubmVscyA9IGNvZGVkX2NoYW5uZWxzOworCisgICAgbWVtc2V0KHMtPmZyYW1lWzBdLmNvbGxhcHNlX21hc2tzLCAwLCBzaXplb2Yocy0+ZnJhbWVbMF0uY29sbGFwc2VfbWFza3MpKTsKKyAgICBtZW1zZXQocy0+ZnJhbWVbMV0uY29sbGFwc2VfbWFza3MsIDAsIHNpemVvZihzLT5mcmFtZVsxXS5jb2xsYXBzZV9tYXNrcykpOworCisgICAgY29uc3VtZWQgPSBvcHVzX3JjX3RlbGwocmMpOworCisgICAgLyogb2J0YWluIHNpbGVuY2UgZmxhZyAqLworICAgIGlmIChjb25zdW1lZCA+PSBzLT5mcmFtZWJpdHMpCisgICAgICAgIHNpbGVuY2UgPSAxOworICAgIGVsc2UgaWYgKGNvbnN1bWVkID09IDEpCisgICAgICAgIHNpbGVuY2UgPSBvcHVzX3JjX3AybW9kZWwocmMsIDE1KTsKKworCisgICAgaWYgKHNpbGVuY2UpIHsKKyAgICAgICAgY29uc3VtZWQgPSBzLT5mcmFtZWJpdHM7CisgICAgICAgIHJjLT50b3RhbF9yZWFkX2JpdHMgKz0gcy0+ZnJhbWViaXRzIC0gb3B1c19yY190ZWxsKHJjKTsKKyAgICB9CisKKyAgICAvKiBvYnRhaW4gcG9zdC1maWx0ZXIgb3B0aW9ucyAqLworICAgIGNvbnN1bWVkID0gcGFyc2VfcG9zdGZpbHRlcihzLCByYywgY29uc3VtZWQpOworCisgICAgLyogb2J0YWluIHRyYW5zaWVudCBmbGFnICovCisgICAgaWYgKHMtPmR1cmF0aW9uICE9IDAgJiYgY29uc3VtZWQrMyA8PSBzLT5mcmFtZWJpdHMpCisgICAgICAgIHRyYW5zaWVudCA9IG9wdXNfcmNfcDJtb2RlbChyYywgMyk7CisKKyAgICBzLT5ibG9ja3MgICAgPSB0cmFuc2llbnQgPyAxIDw8IHMtPmR1cmF0aW9uIDogMTsKKyAgICBzLT5ibG9ja3NpemUgPSBmcmFtZV9zaXplIC8gcy0+YmxvY2tzOworCisgICAgaW1kY3QgPSBzLT5pbWRjdFt0cmFuc2llbnQgPyAwIDogcy0+ZHVyYXRpb25dOworCisgICAgaWYgKGNvZGVkX2NoYW5uZWxzID09IDEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IENFTFRfTUFYX0JBTkRTOyBpKyspCisgICAgICAgICAgICBzLT5mcmFtZVswXS5lbmVyZ3lbaV0gPSBGRk1BWChzLT5mcmFtZVswXS5lbmVyZ3lbaV0sIHMtPmZyYW1lWzFdLmVuZXJneVtpXSk7CisgICAgfQorCisgICAgY2VsdF9kZWNvZGVfY29hcnNlX2VuZXJneShzLCByYyk7CisgICAgY2VsdF9kZWNvZGVfdGZfY2hhbmdlcyAgIChzLCByYywgdHJhbnNpZW50KTsKKyAgICBjZWx0X2RlY29kZV9hbGxvY2F0aW9uICAgKHMsIHJjKTsKKyAgICBjZWx0X2RlY29kZV9maW5lX2VuZXJneSAgKHMsIHJjKTsKKyAgICBjZWx0X2RlY29kZV9iYW5kcyAgICAgICAgKHMsIHJjKTsKKworICAgIGlmIChzLT5hbnRpY29sbGFwc2VfYml0KQorICAgICAgICBhbnRpY29sbGFwc2UgPSBvcHVzX2dldHJhd2JpdHMocmMsIDEpOworCisgICAgY2VsdF9kZWNvZGVfZmluYWxfZW5lcmd5KHMsIHJjLCBzLT5mcmFtZWJpdHMgLSBvcHVzX3JjX3RlbGwocmMpKTsKKworICAgIC8qIGFwcGx5IGFudGktY29sbGFwc2UgcHJvY2Vzc2luZyBhbmQgZGVub3JtYWxpemF0aW9uIHRvCisgICAgICogZWFjaCBjb2RlZCBjaGFubmVsICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmNvZGVkX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgQ2VsdEZyYW1lICpmcmFtZSA9ICZzLT5mcmFtZVtpXTsKKworICAgICAgICBpZiAoYW50aWNvbGxhcHNlKQorICAgICAgICAgICAgcHJvY2Vzc19hbnRpY29sbGFwc2UocywgZnJhbWUsIHMtPmNvZWZmc1tpXSk7CisKKyAgICAgICAgY2VsdF9kZW5vcm1hbGl6ZShzLCBmcmFtZSwgcy0+Y29lZmZzW2ldKTsKKyAgICB9CisKKyAgICAvKiBzdGVyZW8gLT4gbW9ubyBkb3dubWl4ICovCisgICAgaWYgKHMtPm91dHB1dF9jaGFubmVscyA8IHMtPmNvZGVkX2NoYW5uZWxzKSB7CisgICAgICAgIHMtPmRzcC0+dmVjdG9yX2ZtYWNfc2NhbGFyKHMtPmNvZWZmc1swXSwgcy0+Y29lZmZzWzFdLCAxLjAsIEZGQUxJR04oZnJhbWVfc2l6ZSwgMTYpKTsKKyAgICAgICAgaW1kY3Rfc2NhbGUgPSAwLjU7CisgICAgfSBlbHNlIGlmIChzLT5vdXRwdXRfY2hhbm5lbHMgPiBzLT5jb2RlZF9jaGFubmVscykKKyAgICAgICAgbWVtY3B5KHMtPmNvZWZmc1sxXSwgcy0+Y29lZmZzWzBdLCBmcmFtZV9zaXplICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICBpZiAoc2lsZW5jZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBDZWx0RnJhbWUgKmZyYW1lID0gJnMtPmZyYW1lW2ldOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgRkZfQVJSQVlfRUxFTVMoZnJhbWUtPmVuZXJneSk7IGorKykKKyAgICAgICAgICAgICAgICBmcmFtZS0+ZW5lcmd5W2pdID0gQ0VMVF9FTkVSR1lfU0lMRU5DRTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQocy0+Y29lZmZzLCAwLCBzaXplb2Yocy0+Y29lZmZzKSk7CisgICAgfQorCisgICAgLyogdHJhbnNmb3JtIGFuZCBvdXRwdXQgZm9yIGVhY2ggb3V0cHV0IGNoYW5uZWwgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+b3V0cHV0X2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgQ2VsdEZyYW1lICpmcmFtZSA9ICZzLT5mcmFtZVtpXTsKKyAgICAgICAgZmxvYXQgbSA9IGZyYW1lLT5kZWVtcGhfY29lZmY7CisKKyAgICAgICAgLyogaU1EQ1QgYW5kIG92ZXJsYXAtYWRkICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5ibG9ja3M7IGorKykgeworICAgICAgICAgICAgZmxvYXQgKmRzdCAgPSBmcmFtZS0+YnVmICsgMTAyNCArIGogKiBzLT5ibG9ja3NpemU7CisKKyAgICAgICAgICAgIGltZGN0LT5pbWRjdF9oYWxmKGltZGN0LCBkc3QgKyBDRUxUX09WRVJMQVAgLyAyLCBzLT5jb2VmZnNbaV0gKyBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tzLCBpbWRjdF9zY2FsZSk7CisgICAgICAgICAgICBzLT5kc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhkc3QsIGRzdCwgZHN0ICsgQ0VMVF9PVkVSTEFQIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsdF93aW5kb3csIENFTFRfT1ZFUkxBUCAvIDIpOworICAgICAgICB9CisKKyAgICAgICAgLyogcG9zdGZpbHRlciAqLworICAgICAgICBjZWx0X3Bvc3RmaWx0ZXIocywgZnJhbWUpOworCisgICAgICAgIC8qIGRlZW1waGFzaXMgYW5kIG91dHB1dCBzY2FsaW5nICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmcmFtZV9zaXplOyBqKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHRtcCA9IGZyYW1lLT5idWZbMTAyNCAtIGZyYW1lX3NpemUgKyBqXSArIG07CisgICAgICAgICAgICBtID0gdG1wICogQ0VMVF9ERUVNUEhfQ09FRkY7CisgICAgICAgICAgICBvdXRwdXRbaV1bal0gPSB0bXAgLyAzMjc2OC47CisgICAgICAgIH0KKyAgICAgICAgZnJhbWUtPmRlZW1waF9jb2VmZiA9IG07CisgICAgfQorCisgICAgaWYgKGNvZGVkX2NoYW5uZWxzID09IDEpCisgICAgICAgIG1lbWNweShzLT5mcmFtZVsxXS5lbmVyZ3ksIHMtPmZyYW1lWzBdLmVuZXJneSwgc2l6ZW9mKHMtPmZyYW1lWzBdLmVuZXJneSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKyApIHsKKyAgICAgICAgQ2VsdEZyYW1lICpmcmFtZSA9ICZzLT5mcmFtZVtpXTsKKworICAgICAgICBpZiAoIXRyYW5zaWVudCkgeworICAgICAgICAgICAgbWVtY3B5KGZyYW1lLT5wcmV2X2VuZXJneVsxXSwgZnJhbWUtPnByZXZfZW5lcmd5WzBdLCBzaXplb2YoZnJhbWUtPnByZXZfZW5lcmd5WzBdKSk7CisgICAgICAgICAgICBtZW1jcHkoZnJhbWUtPnByZXZfZW5lcmd5WzBdLCBmcmFtZS0+ZW5lcmd5LCAgICAgICAgIHNpemVvZihmcmFtZS0+cHJldl9lbmVyZ3lbMF0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBDRUxUX01BWF9CQU5EUzsgaisrKQorICAgICAgICAgICAgICAgIGZyYW1lLT5wcmV2X2VuZXJneVswXVtqXSA9IEZGTUlOKGZyYW1lLT5wcmV2X2VuZXJneVswXVtqXSwgZnJhbWUtPmVuZXJneVtqXSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+c3RhcnRiYW5kOyBqKyspIHsKKyAgICAgICAgICAgIGZyYW1lLT5wcmV2X2VuZXJneVswXVtqXSA9IENFTFRfRU5FUkdZX1NJTEVOQ0U7CisgICAgICAgICAgICBmcmFtZS0+ZW5lcmd5W2pdICAgICAgICAgPSAwLjA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gcy0+ZW5kYmFuZDsgaiA8IENFTFRfTUFYX0JBTkRTOyBqKyspIHsKKyAgICAgICAgICAgIGZyYW1lLT5wcmV2X2VuZXJneVswXVtqXSA9IENFTFRfRU5FUkdZX1NJTEVOQ0U7CisgICAgICAgICAgICBmcmFtZS0+ZW5lcmd5W2pdICAgICAgICAgPSAwLjA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5zZWVkID0gcmMtPnJhbmdlOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfY2VsdF9mbHVzaChDZWx0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGlmIChzLT5mbHVzaGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIENlbHRGcmFtZSAqZnJhbWUgPSAmcy0+ZnJhbWVbaV07CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IENFTFRfTUFYX0JBTkRTOyBqKyspCisgICAgICAgICAgICBmcmFtZS0+cHJldl9lbmVyZ3lbMF1bal0gPSBmcmFtZS0+cHJldl9lbmVyZ3lbMV1bal0gPSBDRUxUX0VORVJHWV9TSUxFTkNFOworCisgICAgICAgIG1lbXNldChmcmFtZS0+ZW5lcmd5LCAwLCBzaXplb2YoZnJhbWUtPmVuZXJneSkpOworICAgICAgICBtZW1zZXQoZnJhbWUtPmJ1ZiwgICAgMCwgc2l6ZW9mKGZyYW1lLT5idWYpKTsKKworICAgICAgICBtZW1zZXQoZnJhbWUtPnBmX2dhaW5zLCAgICAgMCwgc2l6ZW9mKGZyYW1lLT5wZl9nYWlucykpOworICAgICAgICBtZW1zZXQoZnJhbWUtPnBmX2dhaW5zX29sZCwgMCwgc2l6ZW9mKGZyYW1lLT5wZl9nYWluc19vbGQpKTsKKyAgICAgICAgbWVtc2V0KGZyYW1lLT5wZl9nYWluc19uZXcsIDAsIHNpemVvZihmcmFtZS0+cGZfZ2FpbnNfbmV3KSk7CisKKyAgICAgICAgZnJhbWUtPmRlZW1waF9jb2VmZiA9IDAuMDsKKyAgICB9CisgICAgcy0+c2VlZCA9IDA7CisKKyAgICBzLT5mbHVzaGVkID0gMTsKK30KKwordm9pZCBmZl9jZWx0X2ZyZWUoQ2VsdENvbnRleHQgKipwcykKK3sKKyAgICBDZWx0Q29udGV4dCAqcyA9ICpwczsKKyAgICBpbnQgaTsKKworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPmltZGN0KTsgaSsrKQorICAgICAgICBmZl9jZWx0X2ltZGN0X3VuaW5pdCgmcy0+aW1kY3RbaV0pOworCisgICAgYXZfZnJlZXAoJnMtPmRzcCk7CisgICAgYXZfZnJlZXAocHMpOworfQorCitpbnQgZmZfY2VsdF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQ2VsdENvbnRleHQgKipwcywgaW50IG91dHB1dF9jaGFubmVscykKK3sKKyAgICBDZWx0Q29udGV4dCAqczsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKG91dHB1dF9jaGFubmVscyAhPSAxICYmIG91dHB1dF9jaGFubmVscyAhPSAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzOiAlZFxuIiwKKyAgICAgICAgICAgICAgIG91dHB1dF9jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzKSk7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+YXZjdHggICAgICAgICAgID0gYXZjdHg7CisgICAgcy0+b3V0cHV0X2NoYW5uZWxzID0gb3V0cHV0X2NoYW5uZWxzOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPmltZGN0KTsgaSsrKSB7CisgICAgICAgIHJldCA9IGZmX2NlbHRfaW1kY3RfaW5pdCgmcy0+aW1kY3RbaV0sIGkgKyAzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcy0+ZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBpZiAoIXMtPmRzcCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmZl9jZWx0X2ZsdXNoKHMpOworCisgICAgKnBzID0gczsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBmZl9jZWx0X2ZyZWUoJnMpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9vcHVzX2ltZGN0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9vcHVzX2ltZGN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2ZmNhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL29wdXNfaW1kY3QuYwpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IE1vemlsbGEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ2VsdCBub24tcG93ZXIgb2YgMiBpTURDVAorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKyNpbmNsdWRlICJhdmZmdC5oIgorI2luY2x1ZGUgIm9wdXMuaCIKKyNpbmNsdWRlICJvcHVzX2ltZGN0LmgiCisKKy8vIG1pbmltYWwgaU1EQ1Qgc2l6ZSB0byBtYWtlIFNJTUQgb3B0cyBlYXNpZXIKKyNkZWZpbmUgQ0VMVF9NSU5fSU1EQ1RfU0laRSAxMjAKKworLy8gY29tcGxleCBjID0gYSAqIGIKKyNkZWZpbmUgQ01VTDMoY3JlLCBjaW0sIGFyZSwgYWltLCBicmUsIGJpbSkgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY3JlID0gYXJlICogYnJlIC0gYWltICogYmltOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaW0gPSBhcmUgKiBiaW0gKyBhaW0gKiBicmU7ICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDTVVMKGMsIGEsIGIpIENNVUwzKChjKS5yZSwgKGMpLmltLCAoYSkucmUsIChhKS5pbSwgKGIpLnJlLCAoYikuaW0pCisKKy8vIGNvbXBsZXggYyA9IGEgKiBiCisvLyAgICAgICAgIGQgPSBhICogY29uanVnYXRlKGIpCisjZGVmaW5lIENNVUwyKGMsIGQsIGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0IGFyZSA9IChhKS5yZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmxvYXQgYWltID0gKGEpLmltOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmbG9hdCBicmUgPSAoYikucmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0IGJpbSA9IChiKS5pbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmxvYXQgcnIgID0gYXJlICogYnJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmbG9hdCByaSAgPSBhcmUgKiBiaW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0IGlyICA9IGFpbSAqIGJyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmxvYXQgaWkgID0gYWltICogYmltOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYykucmUgPSAgcnIgLSBpaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjKS5pbSA9ICByaSArIGlyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGQpLnJlID0gIHJyICsgaWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZCkuaW0gPSAtcmkgKyBpcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworYXZfY29sZCB2b2lkIGZmX2NlbHRfaW1kY3RfdW5pbml0KENlbHRJTURDVENvbnRleHQgKipwcykKK3sKKyAgICBDZWx0SU1EQ1RDb250ZXh0ICpzID0gKnBzOworICAgIGludCBpOworCisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+ZXhwdGFiKTsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmcy0+ZXhwdGFiW2ldKTsKKworICAgIGF2X2ZyZWVwKCZzLT50d2lkZGxlX2V4cHRhYik7CisKKyAgICBhdl9mcmVlcCgmcy0+dG1wKTsKKworICAgIGF2X2ZyZWVwKHBzKTsKK30KKworc3RhdGljIHZvaWQgY2VsdF9pbWRjdF9oYWxmKENlbHRJTURDVENvbnRleHQgKnMsIGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgZmxvYXQgc2NhbGUpOworCithdl9jb2xkIGludCBmZl9jZWx0X2ltZGN0X2luaXQoQ2VsdElNRENUQ29udGV4dCAqKnBzLCBpbnQgTikKK3sKKyAgICBDZWx0SU1EQ1RDb250ZXh0ICpzOworICAgIGludCBsZW4yID0gMTUgKiAoMSA8PCBOKTsKKyAgICBpbnQgbGVuICA9IDIgKiBsZW4yOworICAgIGludCBpLCBqOworCisgICAgaWYgKGxlbjIgPiBDRUxUX01BWF9GUkFNRV9TSVpFIHx8IGxlbjIgPCBDRUxUX01JTl9JTURDVF9TSVpFKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzKSk7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+ZmZ0X24gPSBOIC0gMTsKKyAgICBzLT5sZW40ID0gbGVuMiAvIDI7CisgICAgcy0+bGVuMiA9IGxlbjI7CisKKyAgICBzLT50bXAgID0gYXZfbWFsbG9jKGxlbiAqIDIgKiBzaXplb2YoKnMtPnRtcCkpOworICAgIGlmICghcy0+dG1wKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzLT50d2lkZGxlX2V4cHRhYiAgPSBhdl9tYWxsb2Mocy0+bGVuNCAqIHNpemVvZigqcy0+dHdpZGRsZV9leHB0YWIpKTsKKyAgICBpZiAoIXMtPnR3aWRkbGVfZXhwdGFiKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bGVuNDsgaSsrKSB7CisgICAgICAgIHMtPnR3aWRkbGVfZXhwdGFiW2ldLnJlID0gY29zKDIgKiBNX1BJICogKGkgKyAwLjEyNSArIHMtPmxlbjQpIC8gbGVuKTsKKyAgICAgICAgcy0+dHdpZGRsZV9leHB0YWJbaV0uaW0gPSBzaW4oMiAqIE1fUEkgKiAoaSArIDAuMTI1ICsgcy0+bGVuNCkgLyBsZW4pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5leHB0YWIpOyBpKyspIHsKKyAgICAgICAgaW50IE4gPSAxNSAqICgxIDw8IGkpOworICAgICAgICBzLT5leHB0YWJbaV0gPSBhdl9tYWxsb2Moc2l6ZW9mKCpzLT5leHB0YWJbaV0pICogRkZNQVgoTiwgMTkpKTsKKyAgICAgICAgaWYgKCFzLT5leHB0YWJbaV0pCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykgeworICAgICAgICAgICAgcy0+ZXhwdGFiW2ldW2pdLnJlID0gY29zKDIgKiBNX1BJICogaiAvIE4pOworICAgICAgICAgICAgcy0+ZXhwdGFiW2ldW2pdLmltID0gc2luKDIgKiBNX1BJICogaiAvIE4pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gd3JhcCBhcm91bmQgdG8gc2ltcGxpZnkgZmZ0MTUKKyAgICBmb3IgKGogPSAxNTsgaiA8IDE5OyBqKyspCisgICAgICAgIHMtPmV4cHRhYlswXVtqXSA9IHMtPmV4cHRhYlswXVtqIC0gMTVdOworCisgICAgcy0+aW1kY3RfaGFsZiA9IGNlbHRfaW1kY3RfaGFsZjsKKworICAgIGlmIChBUkNIX0FBUkNINjQpCisgICAgICAgIGZmX2NlbHRfaW1kY3RfaW5pdF9hYXJjaDY0KHMpOworCisgICAgKnBzID0gczsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBmZl9jZWx0X2ltZGN0X3VuaW5pdCgmcyk7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworc3RhdGljIHZvaWQgZmZ0NShGRlRDb21wbGV4ICpvdXQsIGNvbnN0IEZGVENvbXBsZXggKmluLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIC8vIFswXSA9IGV4cCgyICogaSAqIHBpIC8gNSksIFsxXSA9IGV4cCgyICogaSAqIHBpICogMiAvIDUpCisgICAgc3RhdGljIGNvbnN0IEZGVENvbXBsZXggZmFjdFtdID0geyB7IDAuMzA5MDE2OTk0Mzc0OTQ3NDUsICAwLjk1MTA1NjUxNjI5NTE1MzUzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC0wLjgwOTAxNjk5NDM3NDk0NzM0LCAwLjU4Nzc4NTI1MjI5MjQ3MzI1IH0gfTsKKworICAgIEZGVENvbXBsZXggels0XVs0XTsKKworICAgIENNVUwyKHpbMF1bMF0sIHpbMF1bM10sIGluWzEgKiBzdHJpZGVdLCBmYWN0WzBdKTsKKyAgICBDTVVMMih6WzBdWzFdLCB6WzBdWzJdLCBpblsxICogc3RyaWRlXSwgZmFjdFsxXSk7CisgICAgQ01VTDIoelsxXVswXSwgelsxXVszXSwgaW5bMiAqIHN0cmlkZV0sIGZhY3RbMF0pOworICAgIENNVUwyKHpbMV1bMV0sIHpbMV1bMl0sIGluWzIgKiBzdHJpZGVdLCBmYWN0WzFdKTsKKyAgICBDTVVMMih6WzJdWzBdLCB6WzJdWzNdLCBpblszICogc3RyaWRlXSwgZmFjdFswXSk7CisgICAgQ01VTDIoelsyXVsxXSwgelsyXVsyXSwgaW5bMyAqIHN0cmlkZV0sIGZhY3RbMV0pOworICAgIENNVUwyKHpbM11bMF0sIHpbM11bM10sIGluWzQgKiBzdHJpZGVdLCBmYWN0WzBdKTsKKyAgICBDTVVMMih6WzNdWzFdLCB6WzNdWzJdLCBpbls0ICogc3RyaWRlXSwgZmFjdFsxXSk7CisKKyAgICBvdXRbMF0ucmUgPSBpblswXS5yZSArIGluW3N0cmlkZV0ucmUgKyBpblsyICogc3RyaWRlXS5yZSArIGluWzMgKiBzdHJpZGVdLnJlICsgaW5bNCAqIHN0cmlkZV0ucmU7CisgICAgb3V0WzBdLmltID0gaW5bMF0uaW0gKyBpbltzdHJpZGVdLmltICsgaW5bMiAqIHN0cmlkZV0uaW0gKyBpblszICogc3RyaWRlXS5pbSArIGluWzQgKiBzdHJpZGVdLmltOworCisgICAgb3V0WzFdLnJlID0gaW5bMF0ucmUgKyB6WzBdWzBdLnJlICsgelsxXVsxXS5yZSArIHpbMl1bMl0ucmUgKyB6WzNdWzNdLnJlOworICAgIG91dFsxXS5pbSA9IGluWzBdLmltICsgelswXVswXS5pbSArIHpbMV1bMV0uaW0gKyB6WzJdWzJdLmltICsgelszXVszXS5pbTsKKworICAgIG91dFsyXS5yZSA9IGluWzBdLnJlICsgelswXVsxXS5yZSArIHpbMV1bM10ucmUgKyB6WzJdWzBdLnJlICsgelszXVsyXS5yZTsKKyAgICBvdXRbMl0uaW0gPSBpblswXS5pbSArIHpbMF1bMV0uaW0gKyB6WzFdWzNdLmltICsgelsyXVswXS5pbSArIHpbM11bMl0uaW07CisKKyAgICBvdXRbM10ucmUgPSBpblswXS5yZSArIHpbMF1bMl0ucmUgKyB6WzFdWzBdLnJlICsgelsyXVszXS5yZSArIHpbM11bMV0ucmU7CisgICAgb3V0WzNdLmltID0gaW5bMF0uaW0gKyB6WzBdWzJdLmltICsgelsxXVswXS5pbSArIHpbMl1bM10uaW0gKyB6WzNdWzFdLmltOworCisgICAgb3V0WzRdLnJlID0gaW5bMF0ucmUgKyB6WzBdWzNdLnJlICsgelsxXVsyXS5yZSArIHpbMl1bMV0ucmUgKyB6WzNdWzBdLnJlOworICAgIG91dFs0XS5pbSA9IGluWzBdLmltICsgelswXVszXS5pbSArIHpbMV1bMl0uaW0gKyB6WzJdWzFdLmltICsgelszXVswXS5pbTsKK30KKworc3RhdGljIHZvaWQgZmZ0MTUoQ2VsdElNRENUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqb3V0LCBjb25zdCBGRlRDb21wbGV4ICppbiwgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCBGRlRDb21wbGV4ICpleHB0YWIgPSBzLT5leHB0YWJbMF07CisgICAgRkZUQ29tcGxleCB0bXBbNV07CisgICAgRkZUQ29tcGxleCB0bXAxWzVdOworICAgIEZGVENvbXBsZXggdG1wMls1XTsKKyAgICBpbnQgazsKKworICAgIGZmdDUodG1wLCAgaW4sICAgICAgICAgICAgICBzdHJpZGUgKiAzKTsKKyAgICBmZnQ1KHRtcDEsIGluICsgICAgIHN0cmlkZSwgc3RyaWRlICogMyk7CisgICAgZmZ0NSh0bXAyLCBpbiArIDIgKiBzdHJpZGUsIHN0cmlkZSAqIDMpOworCisgICAgZm9yIChrID0gMDsgayA8IDU7IGsrKykgeworICAgICAgICBGRlRDb21wbGV4IHQxLCB0MjsKKworICAgICAgICBDTVVMKHQxLCB0bXAxW2tdLCBleHB0YWJba10pOworICAgICAgICBDTVVMKHQyLCB0bXAyW2tdLCBleHB0YWJbMiAqIGtdKTsKKyAgICAgICAgb3V0W2tdLnJlID0gdG1wW2tdLnJlICsgdDEucmUgKyB0Mi5yZTsKKyAgICAgICAgb3V0W2tdLmltID0gdG1wW2tdLmltICsgdDEuaW0gKyB0Mi5pbTsKKworICAgICAgICBDTVVMKHQxLCB0bXAxW2tdLCBleHB0YWJbayArIDVdKTsKKyAgICAgICAgQ01VTCh0MiwgdG1wMltrXSwgZXhwdGFiWzIgKiAoayArIDUpXSk7CisgICAgICAgIG91dFtrICsgNV0ucmUgPSB0bXBba10ucmUgKyB0MS5yZSArIHQyLnJlOworICAgICAgICBvdXRbayArIDVdLmltID0gdG1wW2tdLmltICsgdDEuaW0gKyB0Mi5pbTsKKworICAgICAgICBDTVVMKHQxLCB0bXAxW2tdLCBleHB0YWJbayArIDEwXSk7CisgICAgICAgIENNVUwodDIsIHRtcDJba10sIGV4cHRhYlsyICogayArIDVdKTsKKyAgICAgICAgb3V0W2sgKyAxMF0ucmUgPSB0bXBba10ucmUgKyB0MS5yZSArIHQyLnJlOworICAgICAgICBvdXRbayArIDEwXS5pbSA9IHRtcFtrXS5pbSArIHQxLmltICsgdDIuaW07CisgICAgfQorfQorCisvKgorICogRkZUIG9mIHRoZSBsZW5ndGggMTUgKiAoMl5OKQorICovCitzdGF0aWMgdm9pZCBmZnRfY2FsYyhDZWx0SU1EQ1RDb250ZXh0ICpzLCBGRlRDb21wbGV4ICpvdXQsIGNvbnN0IEZGVENvbXBsZXggKmluLAorICAgICAgICAgICAgICAgICAgICAgaW50IE4sIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaWYgKE4pIHsKKyAgICAgICAgY29uc3QgRkZUQ29tcGxleCAqZXhwdGFiID0gcy0+ZXhwdGFiW05dOworICAgICAgICBjb25zdCBpbnQgbGVuMiA9IDE1ICogKDEgPDwgKE4gLSAxKSk7CisgICAgICAgIGludCBrOworCisgICAgICAgIGZmdF9jYWxjKHMsIG91dCwgICAgICAgIGluLCAgICAgICAgICBOIC0gMSwgc3RyaWRlICogMik7CisgICAgICAgIGZmdF9jYWxjKHMsIG91dCArIGxlbjIsIGluICsgc3RyaWRlLCBOIC0gMSwgc3RyaWRlICogMik7CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IGxlbjI7IGsrKykgeworICAgICAgICAgICAgRkZUQ29tcGxleCB0OworCisgICAgICAgICAgICBDTVVMKHQsIG91dFtsZW4yICsga10sIGV4cHRhYltrXSk7CisKKyAgICAgICAgICAgIG91dFtsZW4yICsga10ucmUgPSBvdXRba10ucmUgLSB0LnJlOworICAgICAgICAgICAgb3V0W2xlbjIgKyBrXS5pbSA9IG91dFtrXS5pbSAtIHQuaW07CisKKyAgICAgICAgICAgIG91dFtrXS5yZSArPSB0LnJlOworICAgICAgICAgICAgb3V0W2tdLmltICs9IHQuaW07CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgZmZ0MTUocywgb3V0LCBpbiwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgY2VsdF9pbWRjdF9oYWxmKENlbHRJTURDVENvbnRleHQgKnMsIGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgZmxvYXQgc2NhbGUpCit7CisgICAgRkZUQ29tcGxleCAqeiA9IChGRlRDb21wbGV4ICopZHN0OworICAgIGNvbnN0IGludCBsZW44ID0gcy0+bGVuNCAvIDI7CisgICAgY29uc3QgZmxvYXQgKmluMSA9IHNyYzsKKyAgICBjb25zdCBmbG9hdCAqaW4yID0gc3JjICsgKHMtPmxlbjIgLSAxKSAqIHN0cmlkZTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5sZW40OyBpKyspIHsKKyAgICAgICAgRkZUQ29tcGxleCB0bXAgPSB7ICppbjIsICppbjEgfTsKKyAgICAgICAgQ01VTChzLT50bXBbaV0sIHRtcCwgcy0+dHdpZGRsZV9leHB0YWJbaV0pOworICAgICAgICBpbjEgKz0gMiAqIHN0cmlkZTsKKyAgICAgICAgaW4yIC09IDIgKiBzdHJpZGU7CisgICAgfQorCisgICAgZmZ0X2NhbGMocywgeiwgcy0+dG1wLCBzLT5mZnRfbiwgMSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuODsgaSsrKSB7CisgICAgICAgIGZsb2F0IHIwLCBpMCwgcjEsIGkxOworCisgICAgICAgIENNVUwzKHIwLCBpMSwgeltsZW44IC0gaSAtIDFdLmltLCB6W2xlbjggLSBpIC0gMV0ucmUsICBzLT50d2lkZGxlX2V4cHRhYltsZW44IC0gaSAtIDFdLmltLCBzLT50d2lkZGxlX2V4cHRhYltsZW44IC0gaSAtIDFdLnJlKTsKKyAgICAgICAgQ01VTDMocjEsIGkwLCB6W2xlbjggKyBpXS5pbSwgICAgIHpbbGVuOCArIGldLnJlLCAgICAgIHMtPnR3aWRkbGVfZXhwdGFiW2xlbjggKyBpXS5pbSwgICAgIHMtPnR3aWRkbGVfZXhwdGFiW2xlbjggKyBpXS5yZSk7CisgICAgICAgIHpbbGVuOCAtIGkgLSAxXS5yZSA9IHNjYWxlICogcjA7CisgICAgICAgIHpbbGVuOCAtIGkgLSAxXS5pbSA9IHNjYWxlICogaTA7CisgICAgICAgIHpbbGVuOCArIGldLnJlICAgICA9IHNjYWxlICogcjE7CisgICAgICAgIHpbbGVuOCArIGldLmltICAgICA9IHNjYWxlICogaTE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvb3B1c19pbWRjdC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvb3B1c19pbWRjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTRkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9vcHVzX2ltZGN0LmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfT1BVU19JTURDVF9ICisjZGVmaW5lIEFWQ09ERUNfT1BVU19JTURDVF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImF2ZmZ0LmgiCisKK3R5cGVkZWYgc3RydWN0IENlbHRJTURDVENvbnRleHQgeworICAgIGludCBmZnRfbjsKKyAgICBpbnQgbGVuMjsKKyAgICBpbnQgbGVuNDsKKworICAgIEZGVENvbXBsZXggKnRtcDsKKworICAgIEZGVENvbXBsZXggKnR3aWRkbGVfZXhwdGFiOworCisgICAgRkZUQ29tcGxleCAqZXhwdGFiWzZdOworCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBtaWRkbGUgaGFsZiBvZiB0aGUgaU1EQ1QKKyAgICAgKi8KKyAgICB2b2lkICgqaW1kY3RfaGFsZikoc3RydWN0IENlbHRJTURDVENvbnRleHQgKnMsIGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCBmbG9hdCBzY2FsZSk7Cit9IENlbHRJTURDVENvbnRleHQ7CisKKy8qKgorICogSW5pdCBhbiBpTURDVCBvZiB0aGUgbGVuZ3RoIDIgKiAxNSAqICgyXk4pCisgKi8KK2ludCBmZl9jZWx0X2ltZGN0X2luaXQoQ2VsdElNRENUQ29udGV4dCAqKnMsIGludCBOKTsKKworLyoqCisgKiBGcmVlIGFuIGlNRENULgorICovCit2b2lkIGZmX2NlbHRfaW1kY3RfdW5pbml0KENlbHRJTURDVENvbnRleHQgKipzKTsKKworCit2b2lkIGZmX2NlbHRfaW1kY3RfaW5pdF9hYXJjaDY0KENlbHRJTURDVENvbnRleHQgKnMpOworCisjZW5kaWYgLyogQVZDT0RFQ19PUFVTX0lNRENUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL29wdXNfcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9vcHVzX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjhhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9vcHVzX3BhcnNlci5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgTW96aWxsYSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBPcHVzIHBhcnNlcgorICoKKyAqIERldGVybWluZXMgdGhlIGR1cmF0aW9uIGZvciBlYWNoIHBhY2tldC4KKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm9wdXMuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisKK3R5cGVkZWYgc3RydWN0IE9wdXNQYXJzZUNvbnRleHQgeworICAgIE9wdXNDb250ZXh0IGN0eDsKKyAgICBPcHVzUGFja2V0IHBrdDsKKyAgICBpbnQgZXh0cmFkYXRhX3BhcnNlZDsKKyAgICBQYXJzZUNvbnRleHQgcGM7CisgICAgaW50IHRzX2ZyYW1pbmc7Cit9IE9wdXNQYXJzZUNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCB1aW50OF90ICpwYXJzZV9vcHVzX3RzX2hlYWRlcihjb25zdCB1aW50OF90ICpzdGFydCwgaW50ICpwYXlsb2FkX2xlbiwgaW50IGJ1Zl9sZW4pCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gc3RhcnQgKyAxOworICAgIGludCBzdGFydF90cmltX2ZsYWcsIGVuZF90cmltX2ZsYWcsIGNvbnRyb2xfZXh0ZW5zaW9uX2ZsYWcsIGNvbnRyb2xfZXh0ZW5zaW9uX2xlbmd0aDsKKyAgICB1aW50OF90IGZsYWdzOworCisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGJ1ZiwgYnVmX2xlbik7CisKKyAgICBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgc3RhcnRfdHJpbV9mbGFnICAgICAgICA9IChmbGFncyA+PiA0KSAmIDE7CisgICAgZW5kX3RyaW1fZmxhZyAgICAgICAgICA9IChmbGFncyA+PiAzKSAmIDE7CisgICAgY29udHJvbF9leHRlbnNpb25fZmxhZyA9IChmbGFncyA+PiAyKSAmIDE7CisKKyAgICAqcGF5bG9hZF9sZW4gPSAwOworICAgIHdoaWxlIChieXRlc3RyZWFtMl9wZWVrX2J5dGUoJmdiKSA9PSAweGZmKQorICAgICAgICAqcGF5bG9hZF9sZW4gKz0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKworICAgICpwYXlsb2FkX2xlbiArPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworCisgICAgaWYgKHN0YXJ0X3RyaW1fZmxhZykKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDIpOworICAgIGlmIChlbmRfdHJpbV9mbGFnKQorICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgMik7CisgICAgaWYgKGNvbnRyb2xfZXh0ZW5zaW9uX2ZsYWcpIHsKKyAgICAgICAgY29udHJvbF9leHRlbnNpb25fbGVuZ3RoID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIGNvbnRyb2xfZXh0ZW5zaW9uX2xlbmd0aCk7CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZiArIGJ5dGVzdHJlYW0yX3RlbGwoJmdiKTsKK30KKworLyoqCisgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWUgaW4gdGhlIGJpdHN0cmVhbS4KKyAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBuZXh0IGZyYW1lLCBvciAtMQorICovCitzdGF0aWMgaW50IG9wdXNfZmluZF9mcmFtZV9lbmQoQVZDb2RlY1BhcnNlckNvbnRleHQgKmN0eCwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQgKmhlYWRlcl9sZW4pCit7CisgICAgT3B1c1BhcnNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIFBhcnNlQ29udGV4dCAqcGMgICAgPSAmcy0+cGM7CisgICAgaW50IHJldCwgc3RhcnRfZm91bmQsIGkgPSAwLCBwYXlsb2FkX2xlbiA9IDA7CisgICAgY29uc3QgdWludDhfdCAqcGF5bG9hZDsKKyAgICB1aW50MzJfdCBzdGF0ZTsKKyAgICB1aW50MTZfdCBoZHI7CisgICAgKmhlYWRlcl9sZW4gPSAwOworCisgICAgaWYgKCFidWZfc2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdGFydF9mb3VuZCA9IHBjLT5mcmFtZV9zdGFydF9mb3VuZDsKKyAgICBzdGF0ZSA9IHBjLT5zdGF0ZTsKKyAgICBwYXlsb2FkID0gYnVmOworCisgICAgLyogQ2hlY2sgaWYgd2UncmUgdXNpbmcgT3B1cyBpbiBNUEVHLVRTIGZyYW1pbmcgKi8KKyAgICBpZiAoIXMtPnRzX2ZyYW1pbmcgJiYgYnVmX3NpemUgPiAyKSB7CisgICAgICAgIGhkciA9IEFWX1JCMTYoYnVmKTsKKyAgICAgICAgaWYgKChoZHIgJiBPUFVTX1RTX01BU0spID09IE9QVVNfVFNfSEVBREVSKQorICAgICAgICAgICAgcy0+dHNfZnJhbWluZyA9IDE7CisgICAgfQorCisgICAgaWYgKHMtPnRzX2ZyYW1pbmcgJiYgIXN0YXJ0X2ZvdW5kKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWZfc2l6ZS0yOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgcGF5bG9hZFtpXTsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBPUFVTX1RTX01BU0spID09IE9QVVNfVFNfSEVBREVSKSB7CisgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHBhcnNlX29wdXNfdHNfaGVhZGVyKHBheWxvYWQsICZwYXlsb2FkX2xlbiwgYnVmX3NpemUgLSBpKTsKKyAgICAgICAgICAgICAgICAqaGVhZGVyX2xlbiA9IHBheWxvYWQgLSBidWY7CisgICAgICAgICAgICAgICAgc3RhcnRfZm91bmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzLT50c19mcmFtaW5nKQorICAgICAgICBwYXlsb2FkX2xlbiA9IGJ1Zl9zaXplOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGEgJiYgIXMtPmV4dHJhZGF0YV9wYXJzZWQpIHsKKyAgICAgICAgcmV0ID0gZmZfb3B1c19wYXJzZV9leHRyYWRhdGEoYXZjdHgsICZzLT5jdHgpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIE9nZyBleHRyYWRhdGEuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVwKCZzLT5jdHguY2hhbm5lbF9tYXBzKTsKKyAgICAgICAgcy0+ZXh0cmFkYXRhX3BhcnNlZCA9IDE7CisgICAgfQorCisgICAgaWYgKHBheWxvYWRfbGVuIDw9IGJ1Zl9zaXplICYmICghcy0+dHNfZnJhbWluZyB8fCBzdGFydF9mb3VuZCkpIHsKKyAgICAgICAgcmV0ID0gZmZfb3B1c19wYXJzZV9wYWNrZXQoJnMtPnBrdCwgcGF5bG9hZCwgcGF5bG9hZF9sZW4sIHMtPmN0eC5uYl9zdHJlYW1zID4gMSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgT3B1cyBwYWNrZXQgaGVhZGVyLlxuIik7CisgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPSAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPmR1cmF0aW9uID0gcy0+cGt0LmZyYW1lX2NvdW50ICogcy0+cGt0LmZyYW1lX2R1cmF0aW9uOworICAgIH0KKworICAgIGlmIChzLT50c19mcmFtaW5nKSB7CisgICAgICAgIGlmIChzdGFydF9mb3VuZCkgeworICAgICAgICAgICAgaWYgKHBheWxvYWRfbGVuICsgKmhlYWRlcl9sZW4gPD0gYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPSAwOworICAgICAgICAgICAgICAgIHBjLT5zdGF0ZSAgICAgICAgICAgICA9IC0xOworICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkX2xlbiArICpoZWFkZXJfbGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gc3RhcnRfZm91bmQ7CisgICAgICAgIHBjLT5zdGF0ZSA9IHN0YXRlOworICAgICAgICByZXR1cm4gRU5EX05PVF9GT1VORDsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgb3B1c19wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqY3R4LCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgT3B1c1BhcnNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIFBhcnNlQ29udGV4dCAqcGMgICAgPSAmcy0+cGM7CisgICAgaW50IG5leHQsIGhlYWRlcl9sZW47CisKKyAgICBuZXh0ID0gb3B1c19maW5kX2ZyYW1lX2VuZChjdHgsIGF2Y3R4LCBidWYsIGJ1Zl9zaXplLCAmaGVhZGVyX2xlbik7CisKKyAgICBpZiAocy0+dHNfZnJhbWluZyAmJiBuZXh0ICE9IEFWRVJST1JfSU5WQUxJRERBVEEgJiYKKyAgICAgICAgZmZfY29tYmluZV9mcmFtZShwYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgKnBvdXRidWYgICAgICA9IE5VTEw7CisgICAgICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgaWYgKG5leHQgPT0gQVZFUlJPUl9JTlZBTElEREFUQSl7CisgICAgICAgICpwb3V0YnVmICAgICAgPSBOVUxMOworICAgICAgICAqcG91dGJ1Zl9zaXplID0gMDsKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKworICAgICpwb3V0YnVmICAgICAgPSBidWYgKyBoZWFkZXJfbGVuOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZSAtIGhlYWRlcl9sZW47CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK0FWQ29kZWNQYXJzZXIgZmZfb3B1c19wYXJzZXIgPSB7CisgICAgLmNvZGVjX2lkcyAgICAgID0geyBBVl9DT0RFQ19JRF9PUFVTIH0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE9wdXNQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfcGFyc2UgICA9IG9wdXNfcGFyc2UsCisgICAgLnBhcnNlcl9jbG9zZSAgID0gZmZfcGFyc2VfY2xvc2UKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9vcHVzX3NpbGsuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL29wdXNfc2lsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhODk0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9vcHVzX3NpbGsuYwpAQCAtMCwwICsxLDE1OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQW5kcmV3IEQnQWRkZXNpbworICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgTW96aWxsYSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBPcHVzIFNJTEsgZGVjb2RlcgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgIm9wdXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgU2lsa0ZyYW1lIHsKKyAgICBpbnQgY29kZWQ7CisgICAgaW50IGxvZ19nYWluOworICAgIGludDE2X3QgbmxzZlsxNl07CisgICAgZmxvYXQgICAgbHBjWzE2XTsKKworICAgIGZsb2F0IG91dHB1dCAgICAgWzIgKiBTSUxLX0hJU1RPUlldOworICAgIGZsb2F0IGxwY19oaXN0b3J5WzIgKiBTSUxLX0hJU1RPUlldOworICAgIGludCBwcmltYXJ5bGFnOworCisgICAgaW50IHByZXZfdm9pY2VkOworfSBTaWxrRnJhbWU7CisKK3N0cnVjdCBTaWxrQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGludCBvdXRwdXRfY2hhbm5lbHM7CisKKyAgICBpbnQgbWlkb25seTsKKyAgICBpbnQgc3ViZnJhbWVzOworICAgIGludCBzZmxlbmd0aDsKKyAgICBpbnQgZmxlbmd0aDsKKyAgICBpbnQgbmxzZl9pbnRlcnBfZmFjdG9yOworCisgICAgZW51bSBPcHVzQmFuZHdpZHRoIGJhbmR3aWR0aDsKKyAgICBpbnQgd2I7CisKKyAgICBTaWxrRnJhbWUgZnJhbWVbMl07CisgICAgZmxvYXQgcHJldl9zdGVyZW9fd2VpZ2h0c1syXTsKKyAgICBmbG9hdCBzdGVyZW9fd2VpZ2h0c1syXTsKKworICAgIGludCBwcmV2X2NvZGVkX2NoYW5uZWxzOworfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfc3RlcmVvX3MxW10gPSB7CisgICAgMjU2LCAgIDcsICAgOSwgIDEwLCAgMTEsICAxMiwgIDIyLCAgNDYsICA1NCwgIDU1LCAgNTYsICA1OSwgIDgyLCAxNzQsIDE5NywgMjAwLAorICAgIDIwMSwgMjAyLCAyMTAsIDIzNCwgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDksIDI1NgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfc3RlcmVvX3MyW10gPSB7MjU2LCA4NSwgMTcxLCAyNTZ9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9zdGVyZW9fczNbXSA9IHsyNTYsIDUxLCAxMDIsIDE1NCwgMjA1LCAyNTZ9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9taWRfb25seVtdID0gezI1NiwgMTkyLCAyNTZ9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9mcmFtZV90eXBlX2luYWN0aXZlW10gPSB7MjU2LCAyNiwgMjU2fTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfZnJhbWVfdHlwZV9hY3RpdmVbXSA9IHsyNTYsIDI0LCA5OCwgMjQ2LCAyNTZ9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9nYWluX2hpZ2hiaXRzWzNdWzldID0geworICAgIHsyNTYsICAzMiwgMTQ0LCAyMTIsIDI0MSwgMjUzLCAyNTQsIDI1NSwgMjU2fSwKKyAgICB7MjU2LCAgIDIsICAxOSwgIDY0LCAxMjQsIDE4NiwgMjMzLCAyNTIsIDI1Nn0sCisgICAgezI1NiwgICAxLCAgIDQsICAzMCwgMTAxLCAxOTUsIDI0NSwgMjU0LCAyNTZ9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9nYWluX2xvd2JpdHNbXSA9IHsyNTYsIDMyLCA2NCwgOTYsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2fTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfZ2Fpbl9kZWx0YVtdID0geworICAgIDI1NiwgICA2LCAgMTEsICAyMiwgIDUzLCAxODUsIDIwNiwgMjE0LCAyMTgsIDIyMSwgMjIzLCAyMjUsIDIyNywgMjI4LCAyMjksIDIzMCwKKyAgICAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsCisgICAgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2Cit9Oworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfbHNmX3MxWzJdWzJdWzMzXSA9IHsKKyAgICB7CisgICAgICAgIHsgICAgLy8gTkIgb3IgTUIsIHVudm9pY2VkCisgICAgICAgICAgICAyNTYsICA0NCwgIDc4LCAxMDgsIDEyNywgMTQ4LCAxNjAsIDE3MSwgMTc0LCAxNzcsIDE3OSwgMTk1LCAxOTcsIDE5OSwgMjAwLCAyMDUsCisgICAgICAgICAgICAyMDcsIDIwOCwgMjExLCAyMTQsIDIxNSwgMjE2LCAyMTgsIDIyMCwgMjIyLCAyMjUsIDIyNiwgMjM1LCAyNDQsIDI0NiwgMjUzLCAyNTUsIDI1NgorICAgICAgICB9LCB7IC8vIE5CIG9yIE1CLCB2b2ljZWQKKyAgICAgICAgICAgIDI1NiwgICAxLCAgMTEsICAxMiwgIDIwLCAgMjMsICAzMSwgIDM5LCAgNTMsICA2NiwgIDgwLCAgODEsICA5NSwgMTA3LCAxMjAsIDEzMSwKKyAgICAgICAgICAgIDE0MiwgMTU0LCAxNjUsIDE3NSwgMTg1LCAxOTYsIDIwNCwgMjEzLCAyMjEsIDIyOCwgMjM2LCAyMzcsIDIzOCwgMjQ0LCAyNDUsIDI1MSwgMjU2CisgICAgICAgIH0KKyAgICB9LCB7CisgICAgICAgIHsgICAgLy8gV0IsIHVudm9pY2VkCisgICAgICAgICAgICAyNTYsICAzMSwgIDUyLCAgNTUsICA3MiwgIDczLCAgODEsICA5OCwgMTAyLCAxMDMsIDEyMSwgMTM3LCAxNDEsIDE0MywgMTQ2LCAxNDcsCisgICAgICAgICAgICAxNTcsIDE1OCwgMTYxLCAxNzcsIDE4OCwgMjA0LCAyMDYsIDIwOCwgMjExLCAyMTMsIDIyNCwgMjI1LCAyMjksIDIzOCwgMjQ2LCAyNTMsIDI1NgorICAgICAgICB9LCB7IC8vIFdCLCB2b2ljZWQKKyAgICAgICAgICAgIDI1NiwgICAxLCAgIDUsICAyMSwgIDI2LCAgNDQsICA1NSwgIDYwLCAgNzQsICA4OSwgIDkwLCAgOTMsIDEwNSwgMTE4LCAxMzIsIDE0NiwKKyAgICAgICAgICAgIDE1MiwgMTY2LCAxNzgsIDE4MCwgMTg2LCAxODcsIDE5OSwgMjExLCAyMjIsIDIzMiwgMjM1LCAyNDUsIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU2CisgICAgICAgIH0KKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9sc2ZfczJbMzJdWzEwXSA9IHsKKyAgICAvLyBOQiwgTUIKKyAgICB7IDI1NiwgICAxLCAgIDIsICAgMywgIDE4LCAyNDIsIDI1MywgMjU0LCAyNTUsIDI1NiB9LAorICAgIHsgMjU2LCAgIDEsICAgMiwgICA0LCAgMzgsIDIyMSwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICAyLCAgIDYsICA0OCwgMTk3LCAyNTIsIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgICAxLCAgIDIsICAxMCwgIDYyLCAxODUsIDI0NiwgMjU0LCAyNTUsIDI1NiB9LAorICAgIHsgMjU2LCAgIDEsICAgNCwgIDIwLCAgNzMsIDE3NCwgMjQ4LCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICA0LCAgMjEsICA3NiwgMTY2LCAyMzksIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgICAxLCAgIDgsICAzMiwgIDg1LCAxNTksIDIyNiwgMjUyLCAyNTUsIDI1NiB9LAorICAgIHsgMjU2LCAgIDEsICAgMiwgIDIwLCAgODMsIDE2MSwgMjE5LCAyNDksIDI1NSwgMjU2IH0sCisKKyAgICAvLyBXQgorICAgIHsgMjU2LCAgIDEsICAgMiwgICAzLCAgMTIsIDI0NCwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICAyLCAgIDQsICAzMiwgMjE4LCAyNTMsIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgICAxLCAgIDIsICAgNSwgIDQ3LCAxOTksIDI1MiwgMjU0LCAyNTUsIDI1NiB9LAorICAgIHsgMjU2LCAgIDEsICAgMiwgIDEyLCAgNjEsIDE4NywgMjUyLCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICA1LCAgMjQsICA3MiwgMTcyLCAyNDksIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgICAxLCAgIDIsICAxNiwgIDcwLCAxNzAsIDI0MiwgMjU0LCAyNTUsIDI1NiB9LAorICAgIHsgMjU2LCAgIDEsICAgMiwgIDE3LCAgNzgsIDE2NSwgMjI2LCAyNTEsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICA4LCAgMjksICA3OSwgMTU2LCAyMzcsIDI1NCwgMjU1LCAyNTYgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfbHNmX3MyX2V4dFtdID0geyAyNTYsIDE1NiwgMjE2LCAyNDAsIDI0OSwgMjUzLCAyNTUsIDI1NiB9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9sc2ZfaW50ZXJwb2xhdGlvbl9vZmZzZXRbXSA9IHsgMjU2LCAxMywgMzUsIDY0LCA3NSwgMjU2IH07CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX3BpdGNoX2hpZ2hiaXRzW10gPSB7CisgICAgMjU2LCAgIDMsICAgNiwgIDEyLCAgMjMsICA0NCwgIDc0LCAxMDYsIDEyNSwgMTM2LCAxNDYsIDE1OCwgMTcxLCAxODQsIDE5NiwgMjA3LAorICAgIDIxNiwgMjI0LCAyMzEsIDIzNywgMjQxLCAyNDMsIDI0NSwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9sb3diaXRzX25iW109IHsgMjU2LCA2NCwgMTI4LCAxOTIsIDI1NiB9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9sb3diaXRzX21iW109IHsgMjU2LCA0MywgODUsIDEyOCwgMTcxLCAyMTMsIDI1NiB9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9sb3diaXRzX3diW109IHsgMjU2LCAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiB9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9kZWx0YVtdID0geworICAgIDI1NiwgIDQ2LCAgNDgsICA1MCwgIDUzLCAgNTcsICA2MywgIDczLCAgODgsIDExNCwgMTUyLCAxODIsIDIwNCwgMjE5LCAyMjksIDIzNiwKKyAgICAyNDIsIDI0NiwgMjUwLCAyNTIsIDI1NCwgMjU2Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9jb250b3VyX25iMTBtc1tdID0geyAyNTYsIDE0MywgMTkzLCAyNTYgfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfcGl0Y2hfY29udG91cl9uYjIwbXNbXSA9IHsKKyAgICAyNTYsICA2OCwgIDgwLCAxMDEsIDExOCwgMTM3LCAxNTksIDE4OSwgMjEzLCAyMzAsIDI0NiwgMjU2Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9jb250b3VyX21id2IxMG1zW10gPSB7CisgICAgMjU2LCAgOTEsIDEzNywgMTc2LCAxOTUsIDIwOSwgMjIxLCAyMjksIDIzNiwgMjQyLCAyNDcsIDI1MiwgMjU2Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9jb250b3VyX21id2IyMG1zW10gPSB7CisgICAgMjU2LCAgMzMsICA1NSwgIDczLCAgODksIDEwNCwgMTE4LCAxMzIsIDE0NSwgMTU4LCAxNjgsIDE3NywgMTg2LCAxOTQsIDIwMCwgMjA2LAorICAgIDIxMiwgMjE3LCAyMjEsIDIyNSwgMjI5LCAyMzIsIDIzNSwgMjM4LCAyNDAsIDI0MiwgMjQ0LCAyNDYsIDI0OCwgMjUwLCAyNTIsIDI1MywKKyAgICAyNTQsIDI1NSwgMjU2Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9sdHBfZmlsdGVyW10gPSB7IDI1NiwgNzcsIDE1NywgMjU2IH07CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX2x0cF9maWx0ZXIwX3NlbFtdID0geworICAgIDI1NiwgMTg1LCAyMDAsIDIxMywgMjI2LCAyMzUsIDI0NCwgMjUwLCAyNTYKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX2x0cF9maWx0ZXIxX3NlbFtdID0geworICAgIDI1NiwgIDU3LCAgOTEsIDExMiwgMTMyLCAxNDcsIDE2MCwgMTcyLCAxODUsIDE5NSwgMjA1LCAyMTQsIDIyNCwgMjMzLCAyNDEsIDI0OCwgMjU2Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9sdHBfZmlsdGVyMl9zZWxbXSA9IHsKKyAgICAyNTYsICAxNSwgIDMxLCAgNDUsICA1NywgIDY5LCAgODEsICA5MiwgMTAzLCAxMTQsIDEyNCwgMTMzLCAxNDIsIDE1MSwgMTYwLCAxNjgsCisgICAgMTc2LCAxODQsIDE5MiwgMTk5LCAyMDYsIDIxMiwgMjE4LCAyMjMsIDIyNywgMjMyLCAyMzYsIDI0MCwgMjQ0LCAyNDcsIDI1MSwgMjU0LCAyNTYKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX2x0cF9zY2FsZV9pbmRleFtdID0geyAyNTYsIDEyOCwgMTkyLCAyNTYgfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfbGNnX3NlZWRbXSA9IHsgMjU2LCA2NCwgMTI4LCAxOTIsIDI1NiB9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9leGNfcmF0ZVsyXVsxMF0gPSB7CisgICAgeyAyNTYsICAxNSwgIDY2LCAgNzgsIDEyNCwgMTY5LCAxODIsIDIxNSwgMjQyLCAyNTYgfSwgLy8gdW52b2ljZWQKKyAgICB7IDI1NiwgIDMzLCAgNjMsICA5OSwgMTE2LCAxNTAsIDE5OSwgMjE3LCAyMzgsIDI1NiB9ICAvLyB2b2ljZWQKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX3B1bHNlX2NvdW50WzExXVsxOV0gPSB7CisgICAgeyAyNTYsIDEzMSwgMjA1LCAyMzAsIDIzOCwgMjQxLCAyNDQsIDI0NSwgMjQ2LAorICAgICAgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICA1OCwgMTUxLCAyMTEsIDIzNCwgMjQxLCAyNDQsIDI0NSwgMjQ2LAorICAgICAgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICA0MywgIDk0LCAxNDAsIDE3MywgMTk3LCAyMTMsIDIyNCwgMjMyLAorICAgICAgMjM4LCAyNDEsIDI0NCwgMjQ3LCAyNDksIDI1MCwgMjUxLCAyNTMsIDI1NCwgMjU2IH0sCisgICAgeyAyNTYsICAxNywgIDY5LCAxNDAsIDE5NywgMjI4LCAyNDAsIDI0NSwgMjQ2LAorICAgICAgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgNiwgIDI3LCAgNjgsIDEyMSwgMTcwLCAyMDUsIDIyNiwgMjM3LAorICAgICAgMjQzLCAyNDYsIDI0OCwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgNywgIDIxLCAgNDMsICA3MSwgMTAwLCAxMjgsIDE1MywgMTczLAorICAgICAgMTkwLCAyMDMsIDIxNCwgMjIzLCAyMzAsIDIzNSwgMjM5LCAyNDMsIDI0NiwgMjU2IH0sCisgICAgeyAyNTYsICAgMiwgICA3LCAgMjEsICA1MCwgIDkyLCAxMzgsIDE3OSwgMjEwLAorICAgICAgMjI5LCAyNDAsIDI0NiwgMjQ5LCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICAzLCAgIDcsICAxNywgIDM2LCAgNjUsIDEwMCwgMTM3LAorICAgICAgMTcxLCAxOTksIDIxOSwgMjMzLCAyNDEsIDI0NiwgMjUwLCAyNTIsIDI1NCwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICAzLCAgIDUsICAxMCwgIDE5LCAgMzMsICA1MywgIDc3LAorICAgICAgMTA0LCAxMzIsIDE1OCwgMTgxLCAyMDEsIDIxNiwgMjI3LCAyMzUsIDI0MSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICAyLCAgIDMsICAgOSwgIDM2LCAgOTQsIDE1MCwgMTg5LAorICAgICAgMjE0LCAyMjgsIDIzOCwgMjQ0LCAyNDcsIDI1MCwgMjUyLCAyNTMsIDI1NCwgMjU2IH0sCisgICAgeyAyNTYsICAgMiwgICAzLCAgIDksICAzNiwgIDk0LCAxNTAsIDE4OSwgMjE0LAorICAgICAgMjI4LCAyMzgsIDI0NCwgMjQ3LCAyNTAsIDI1MiwgMjUzLCAyNTQsIDI1NiwgMjU2IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX3B1bHNlX2xvY2F0aW9uWzRdWzE2OF0gPSB7CisgICAgeworICAgICAgICAyNTYsIDEyNiwgMjU2LAorICAgICAgICAyNTYsIDU2LCAxOTgsIDI1NiwKKyAgICAgICAgMjU2LCAyNSwgMTI2LCAyMzAsIDI1NiwKKyAgICAgICAgMjU2LCAxMiwgNzIsIDE4MCwgMjQ0LCAyNTYsCisgICAgICAgIDI1NiwgNywgNDIsIDEyNiwgMjEzLCAyNTAsIDI1NiwKKyAgICAgICAgMjU2LCA0LCAyNCwgODMsIDE2OSwgMjMyLCAyNTMsIDI1NiwKKyAgICAgICAgMjU2LCAzLCAxNSwgNTMsIDEyNSwgMjAwLCAyNDIsIDI1NCwgMjU2LAorICAgICAgICAyNTYsIDIsIDEwLCAzNSwgODksIDE2MiwgMjIxLCAyNDgsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDIsIDcsIDI0LCA2MywgMTI2LCAxOTEsIDIzMywgMjUxLCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCA1LCAxNywgNDUsIDk0LCAxNTcsIDIxMSwgMjQxLCAyNTIsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDEsIDUsIDEzLCAzMywgNzAsIDEyNSwgMTgyLCAyMjMsIDI0NSwgMjUzLCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCA0LCAxMSwgMjYsIDU0LCA5OCwgMTUxLCAxOTksIDIzMiwgMjQ4LCAyNTQsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDEsIDMsIDksIDIxLCA0MiwgNzcsIDEyNCwgMTcyLCAyMTIsIDIzNywgMjQ5LCAyNTQsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDEsIDIsIDYsIDE2LCAzMywgNjAsIDk3LCAxNDQsIDE4NywgMjIwLCAyNDEsIDI1MCwgMjU0LCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCAyLCAzLCAxMSwgMjUsIDQ3LCA4MCwgMTIwLCAxNjMsIDIwMSwgMjI5LCAyNDUsIDI1MywgMjU0LCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCAyLCAzLCA0LCAxNywgMzUsIDYyLCA5OCwgMTM5LCAxODAsIDIxNCwgMjM4LCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NgorICAgIH0seworICAgICAgICAyNTYsIDEyNywgMjU2LAorICAgICAgICAyNTYsIDUzLCAyMDIsIDI1NiwKKyAgICAgICAgMjU2LCAyMiwgMTI3LCAyMzMsIDI1NiwKKyAgICAgICAgMjU2LCAxMSwgNzIsIDE4MywgMjQ2LCAyNTYsCisgICAgICAgIDI1NiwgNiwgNDEsIDEyNywgMjE1LCAyNTEsIDI1NiwKKyAgICAgICAgMjU2LCA0LCAyNCwgODMsIDE3MCwgMjMyLCAyNTMsIDI1NiwKKyAgICAgICAgMjU2LCAzLCAxNiwgNTYsIDEyNywgMjAwLCAyNDEsIDI1NCwgMjU2LAorICAgICAgICAyNTYsIDMsIDEyLCAzOSwgOTIsIDE2MiwgMjE4LCAyNDYsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDMsIDExLCAzMCwgNjcsIDEyNCwgMTg1LCAyMjksIDI0OSwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMywgMTAsIDI1LCA1MywgOTcsIDE1MSwgMjAwLCAyMzMsIDI1MCwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgOCwgMjEsIDQzLCA3NywgMTIzLCAxNzEsIDIwOSwgMjM3LCAyNTEsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDEsIDIsIDEzLCAzNSwgNjIsIDk3LCAxMzksIDE4NiwgMjE5LCAyNDQsIDI1NCwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgMiwgOCwgMjIsIDQ4LCA4NSwgMTI4LCAxNzEsIDIwOCwgMjM0LCAyNDgsIDI1NCwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgMiwgNiwgMTYsIDM2LCA2NywgMTA3LCAxNDksIDE4OSwgMjIwLCAyNDAsIDI1MCwgMjU0LCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCAyLCA1LCAxMywgMjksIDU1LCA5MCwgMTI4LCAxNjYsIDIwMSwgMjI3LCAyNDMsIDI1MSwgMjU0LCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCAyLCA0LCAxMCwgMjIsIDQzLCA3MywgMTA5LCAxNDcsIDE4MywgMjEzLCAyMzQsIDI0NiwgMjUyLCAyNTQsIDI1NSwgMjU2CisgICAgfSx7CisgICAgICAgIDI1NiwgMTI3LCAyNTYsCisgICAgICAgIDI1NiwgNDksIDIwNiwgMjU2LAorICAgICAgICAyNTYsIDIwLCAxMjcsIDIzNiwgMjU2LAorICAgICAgICAyNTYsIDExLCA3MSwgMTg0LCAyNDYsIDI1NiwKKyAgICAgICAgMjU2LCA3LCA0MywgMTI3LCAyMTQsIDI1MCwgMjU2LAorICAgICAgICAyNTYsIDYsIDMwLCA4NywgMTY5LCAyMjksIDI1MiwgMjU2LAorICAgICAgICAyNTYsIDUsIDIzLCA2MiwgMTI2LCAxOTQsIDIzNiwgMjUyLCAyNTYsCisgICAgICAgIDI1NiwgNiwgMjAsIDQ5LCA5NiwgMTU3LCAyMDksIDIzOSwgMjUzLCAyNTYsCisgICAgICAgIDI1NiwgMSwgMTYsIDM5LCA3NCwgMTI1LCAxNzUsIDIxNSwgMjQ1LCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCAyLCAyMywgNTUsIDk3LCAxNDksIDE5NSwgMjM2LCAyNTQsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDEsIDcsIDIzLCA1MCwgODYsIDEyOCwgMTcwLCAyMDYsIDIzMywgMjQ5LCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCA2LCAxOCwgMzksIDcwLCAxMDgsIDE0OCwgMTg2LCAyMTcsIDIzOCwgMjUwLCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCA0LCAxMywgMzAsIDU2LCA5MCwgMTI4LCAxNjYsIDIwMCwgMjI2LCAyNDMsIDI1MiwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgNCwgMTEsIDI1LCA0NywgNzYsIDExMCwgMTQ2LCAxODAsIDIwOSwgMjMxLCAyNDUsIDI1MiwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgMywgOCwgMTksIDM3LCA2MiwgOTMsIDEyOCwgMTYzLCAxOTQsIDIxOSwgMjM3LCAyNDgsIDI1MywgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgMiwgNiwgMTUsIDMwLCA1MSwgNzksIDExMSwgMTQ1LCAxNzcsIDIwNSwgMjI2LCAyNDEsIDI1MCwgMjU0LCAyNTUsIDI1NgorICAgIH0seworICAgICAgICAyNTYsIDEyOCwgMjU2LAorICAgICAgICAyNTYsIDQyLCAyMTQsIDI1NiwKKyAgICAgICAgMjU2LCAyMSwgMTI4LCAyMzUsIDI1NiwKKyAgICAgICAgMjU2LCAxMiwgNzIsIDE4NCwgMjQ1LCAyNTYsCisgICAgICAgIDI1NiwgOCwgNDIsIDEyOCwgMjE0LCAyNDksIDI1NiwKKyAgICAgICAgMjU2LCA4LCAzMSwgODYsIDE3NiwgMjMxLCAyNTEsIDI1NiwKKyAgICAgICAgMjU2LCA1LCAyMCwgNTgsIDEzMCwgMjAyLCAyMzgsIDI1MywgMjU2LAorICAgICAgICAyNTYsIDYsIDE4LCA0NSwgOTcsIDE3NCwgMjIxLCAyNDEsIDI1MSwgMjU2LAorICAgICAgICAyNTYsIDYsIDI1LCA1MywgODgsIDEyOCwgMTY4LCAyMDMsIDIzMSwgMjUwLCAyNTYsCisgICAgICAgIDI1NiwgNCwgMTgsIDQwLCA3MSwgMTA4LCAxNDgsIDE4NSwgMjE2LCAyMzgsIDI1MiwgMjU2LAorICAgICAgICAyNTYsIDMsIDEzLCAzMSwgNTcsIDkwLCAxMjgsIDE2NiwgMTk5LCAyMjUsIDI0MywgMjUzLCAyNTYsCisgICAgICAgIDI1NiwgMiwgMTAsIDIzLCA0NCwgNzMsIDEwOSwgMTQ3LCAxODMsIDIxMiwgMjMzLCAyNDYsIDI1NCwgMjU2LAorICAgICAgICAyNTYsIDEsIDYsIDE2LCAzMywgNTgsIDkwLCAxMjgsIDE2NiwgMTk4LCAyMjMsIDI0MCwgMjUwLCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCA1LCAxMiwgMjUsIDQ2LCA3NSwgMTEwLCAxNDYsIDE4MSwgMjEwLCAyMzEsIDI0NCwgMjUxLCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCAzLCA4LCAxOCwgMzUsIDYwLCA5MiwgMTI4LCAxNjQsIDE5NiwgMjIxLCAyMzgsIDI0OCwgMjUzLCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCAzLCA3LCAxNCwgMjcsIDQ4LCA3NiwgMTEwLCAxNDYsIDE4MCwgMjA4LCAyMjksIDI0MiwgMjQ5LCAyNTMsIDI1NSwgMjU2CisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfZXhjaXRhdGlvbl9sc2JbXSA9IHsyNTYsIDEzNiwgMjU2fTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfZXhjaXRhdGlvbl9zaWduWzNdWzJdWzddWzNdID0geworICAgIHsgICAgLy8gSW5hY3RpdmUKKyAgICAgICAgeyAgICAvLyBMb3cgb2Zmc2V0CisgICAgICAgICAgICB7MjU2LCAgIDIsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAyMDcsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxODksIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNzksIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNzQsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNjMsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNTcsIDI1Nn0KKyAgICAgICAgfSwgeyAvLyBIaWdoIG9mZnNldAorICAgICAgICAgICAgezI1NiwgIDU4LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjQ1LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjM4LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjMyLCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjI1LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjIwLCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjExLCAyNTZ9CisgICAgICAgIH0KKyAgICB9LCB7IC8vIFVudm9pY2VkCisgICAgICAgIHsgICAgLy8gTG93IG9mZnNldAorICAgICAgICAgICAgezI1NiwgICAxLCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjEwLCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMTkwLCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMTc4LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMTY5LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMTYyLCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMTUyLCAyNTZ9CisgICAgICAgIH0sIHsgLy8gSGlnaCBvZmZzZXQKKyAgICAgICAgICAgIHsyNTYsICA0OCwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDI0MiwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDIzNSwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDIyNCwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDIxNCwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDIwNSwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDE5MCwgMjU2fQorICAgICAgICB9CisgICAgfSwgeyAvLyBWb2ljZWQKKyAgICAgICAgeyAgICAvLyBMb3cgb2Zmc2V0CisgICAgICAgICAgICB7MjU2LCAgIDEsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNjIsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNTIsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNDcsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNDQsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNDEsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxMzgsIDI1Nn0KKyAgICAgICAgfSwgeyAvLyBIaWdoIG9mZnNldAorICAgICAgICAgICAgezI1NiwgICA4LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjAzLCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMTg3LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMTc2LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMTY4LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMTYxLCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMTU0LCAyNTZ9CisgICAgICAgIH0KKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBzaWxrX3N0ZXJlb193ZWlnaHRzW10gPSB7CisgICAgLTEzNzMyLCAtMTAwNTAsICAtODI2NiwgIC03NTI2LCAgLTY1MDAsICAtNTAwMCwgIC0yOTUwLCAgIC04MjAsCisgICAgICAgODIwLCAgIDI5NTAsICAgNTAwMCwgICA2NTAwLCAgIDc1MjYsICAgODI2NiwgIDEwMDUwLCAgMTM3MzIKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHNpbGtfbHNmX3MyX21vZGVsX3NlbF9uYm1iWzMyXVsxMF0gPSB7CisgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgeyAxLCAzLCAxLCAyLCAyLCAxLCAyLCAxLCAxLCAxIH0sCisgICAgeyAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH0sCisgICAgeyAxLCAyLCAyLCAyLCAyLCAxLCAyLCAxLCAxLCAxIH0sCisgICAgeyAyLCAzLCAzLCAzLCAzLCAyLCAyLCAyLCAyLCAyIH0sCisgICAgeyAwLCA1LCAzLCAzLCAyLCAyLCAyLCAyLCAxLCAxIH0sCisgICAgeyAwLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxIH0sCisgICAgeyAyLCAzLCA2LCA0LCA0LCA0LCA1LCA0LCA1LCA1IH0sCisgICAgeyAyLCA0LCA1LCA1LCA0LCA1LCA0LCA2LCA0LCA0IH0sCisgICAgeyAyLCA0LCA0LCA3LCA0LCA1LCA0LCA1LCA1LCA0IH0sCisgICAgeyA0LCAzLCAzLCAzLCAyLCAzLCAyLCAyLCAyLCAyIH0sCisgICAgeyAxLCA1LCA1LCA2LCA0LCA1LCA0LCA1LCA1LCA1IH0sCisgICAgeyAyLCA3LCA0LCA2LCA1LCA1LCA1LCA1LCA1LCA1IH0sCisgICAgeyAyLCA3LCA1LCA1LCA1LCA1LCA1LCA2LCA1LCA0IH0sCisgICAgeyAzLCAzLCA1LCA0LCA0LCA1LCA0LCA1LCA0LCA0IH0sCisgICAgeyAyLCAzLCAzLCA1LCA1LCA0LCA0LCA0LCA0LCA0IH0sCisgICAgeyAyLCA0LCA0LCA2LCA0LCA1LCA0LCA1LCA1LCA1IH0sCisgICAgeyAyLCA1LCA0LCA2LCA1LCA1LCA1LCA0LCA1LCA0IH0sCisgICAgeyAyLCA3LCA0LCA1LCA0LCA1LCA0LCA1LCA1LCA1IH0sCisgICAgeyAyLCA1LCA0LCA2LCA3LCA2LCA1LCA2LCA1LCA0IH0sCisgICAgeyAzLCA2LCA3LCA0LCA2LCA1LCA1LCA2LCA0LCA1IH0sCisgICAgeyAyLCA3LCA2LCA0LCA0LCA0LCA1LCA0LCA1LCA1IH0sCisgICAgeyA0LCA1LCA1LCA0LCA2LCA2LCA1LCA2LCA1LCA0IH0sCisgICAgeyAyLCA1LCA1LCA2LCA1LCA2LCA0LCA2LCA0LCA0IH0sCisgICAgeyA0LCA1LCA1LCA1LCAzLCA3LCA0LCA1LCA1LCA0IH0sCisgICAgeyAyLCAzLCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA0IH0sCisgICAgeyAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCAzIH0sCisgICAgeyAxLCAxLCAyLCAyLCAyLCAyLCAyLCAzLCAyLCAyIH0sCisgICAgeyA0LCA1LCA1LCA2LCA2LCA2LCA1LCA2LCA0LCA1IH0sCisgICAgeyAzLCA1LCA1LCA0LCA0LCA0LCA0LCAzLCAzLCAyIH0sCisgICAgeyAyLCA1LCAzLCA3LCA1LCA1LCA0LCA0LCA1LCA0IH0sCisgICAgeyA0LCA0LCA1LCA0LCA1LCA2LCA1LCA2LCA1LCA0IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHNpbGtfbHNmX3MyX21vZGVsX3NlbF93YlszMl1bMTZdID0geworICAgIHsgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDggfSwKKyAgICB7IDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDgsIDExIH0sCisgICAgeyAxMCwgMTMsIDEzLCAxMSwgMTUsIDEyLCAxMiwgMTMsIDEwLCAxMywgMTIsIDEzLCAxMywgMTIsIDExLCAxMSB9LAorICAgIHsgIDgsIDEwLCAgOSwgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDkgfSwKKyAgICB7ICA4LCAxNCwgMTMsIDEyLCAxNCwgMTIsIDE1LCAxMywgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMiwgMTIsIDExIH0sCisgICAgeyAgOCwgMTEsIDEzLCAxMywgMTIsIDExLCAxMSwgMTMsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMiB9LAorICAgIHsgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDggfSwKKyAgICB7ICA4LCAxMCwgMTQsIDExLCAxNSwgMTAsIDEzLCAxMSwgMTIsIDEzLCAxMywgMTIsIDExLCAxMSwgMTAsIDExIH0sCisgICAgeyAgOCwgMTQsIDEwLCAxNCwgMTQsIDEyLCAxMywgMTIsIDE0LCAxMywgMTIsIDEyLCAxMywgMTEsIDExLCAxMSB9LAorICAgIHsgMTAsICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDggfSwKKyAgICB7ICA4LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5IH0sCisgICAgeyAxMCwgMTAsIDExLCAxMiwgMTMsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsICA5LCAxMSB9LAorICAgIHsgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAgOSwgMTEgfSwKKyAgICB7IDExLCAxMiwgMTIsIDEyLCAxNCwgMTIsIDEyLCAxMywgMTEsIDEzLCAxMiwgMTIsIDEzLCAxMiwgMTEsIDEyIH0sCisgICAgeyAgOCwgMTQsIDEyLCAxMywgMTIsIDE1LCAxMywgMTAsIDE0LCAxMywgMTUsIDEyLCAxMiwgMTEsIDEzLCAxMSB9LAorICAgIHsgIDgsICA5LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOSwgIDggfSwKKyAgICB7ICA5LCAxNCwgMTMsIDE1LCAxMywgMTIsIDEzLCAxMSwgMTIsIDEzLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDEyIH0sCisgICAgeyAgOSwgMTEsIDExLCAxMiwgMTIsIDExLCAxMSwgMTMsIDEwLCAxMSwgMTEsIDEzLCAxMywgMTMsIDExLCAxMiB9LAorICAgIHsgMTAsIDExLCAxMSwgMTAsIDEwLCAxMCwgMTEsIDEwLCAgOSwgMTAsICA5LCAxMCwgIDksICA5LCAgOSwgMTIgfSwKKyAgICB7ICA4LCAxMCwgMTEsIDEzLCAxMSwgMTEsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4IH0sCisgICAgeyAxMSwgMTIsIDExLCAxMywgMTEsIDExLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMiB9LAorICAgIHsgMTAsIDE0LCAxMSwgMTUsIDE1LCAxMiwgMTMsIDEyLCAxMywgMTEsIDEzLCAxMSwgMTEsIDEwLCAxMSwgMTEgfSwKKyAgICB7IDEwLCAxMSwgMTMsIDE0LCAxNCwgMTEsIDEzLCAxMSwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEyIH0sCisgICAgeyAgOSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDEzLCAxMywgMTMsIDExLCAgOSwgIDksICA5LCAgOSB9LAorICAgIHsgMTAsIDEzLCAxMSwgMTQsIDE0LCAxMiwgMTUsIDEyLCAxMiwgMTMsIDExLCAxMiwgMTIsIDExLCAxMSwgMTEgfSwKKyAgICB7ICA4LCAxNCwgIDksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4IH0sCisgICAgeyAgOCwgMTQsIDE0LCAxMSwgMTMsIDEwLCAxMywgMTMsIDExLCAxMiwgMTIsIDE1LCAxNSwgMTIsIDEyLCAxMiB9LAorICAgIHsgMTEsIDExLCAxNSwgMTEsIDEzLCAxMiwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMCwgMTEgfSwKKyAgICB7ICA4LCAgOCwgIDksICA4LCAgOCwgIDgsIDEwLCAgOSwgMTAsICA5LCAgOSwgMTAsIDEwLCAxMCwgIDksICA5IH0sCisgICAgeyAgOCwgMTEsIDEwLCAxMywgMTEsIDExLCAxMCwgMTEsIDEwLCAgOSwgIDgsICA4LCAgOSwgIDgsICA4LCAgOSB9LAorICAgIHsgMTEsIDEzLCAxMywgMTIsIDE1LCAxMywgMTEsIDExLCAxMCwgMTEsIDEwLCAxMCwgIDksICA4LCAgOSwgIDggfSwKKyAgICB7IDEwLCAxMSwgMTMsIDExLCAxMiwgMTEsIDExLCAxMSwgMTAsICA5LCAxMCwgMTQsIDEyLCAgOCwgIDgsICA4IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHNpbGtfbHNmX3ByZWRfd2VpZ2h0c19uYm1iWzJdWzldID0geworICAgIHsxNzksIDEzOCwgMTQwLCAxNDgsIDE1MSwgMTQ5LCAxNTMsIDE1MSwgMTYzfSwKKyAgICB7MTE2LCAgNjcsICA4MiwgIDU5LCAgOTIsICA3MiwgMTAwLCAgODksICA5Mn0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHNpbGtfbHNmX3ByZWRfd2VpZ2h0c193YlsyXVsxNV0gPSB7CisgICAgezE3NSwgMTQ4LCAxNjAsIDE3NiwgMTc4LCAxNzMsIDE3NCwgMTY0LCAxNzcsIDE3NCwgMTk2LCAxODIsIDE5OCwgMTkyLCAxODJ9LAorICAgIHsgNjgsICA2MiwgIDY2LCAgNjAsICA3MiwgMTE3LCAgODUsICA5MCwgMTE4LCAxMzYsIDE1MSwgMTQyLCAxNjAsIDE0MiwgMTU1fQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2lsa19sc2Zfd2VpZ2h0X3NlbF9uYm1iWzMyXVs5XSA9IHsKKyAgICB7IDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDAgfSwKKyAgICB7IDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDEsIDAsIDEsIDEsIDAsIDAsIDAsIDEsIDAgfSwKKyAgICB7IDAsIDEsIDEsIDAsIDAsIDEsIDEsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDEsIDAsIDEsIDAsIDEsIDEgfSwKKyAgICB7IDAsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDEgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDAgfSwKKyAgICB7IDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDAgfSwKKyAgICB7IDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAgfSwKKyAgICB7IDEsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDEgfSwKKyAgICB7IDAsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDEsIDAsIDEsIDAsIDEsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDEgfSwKKyAgICB7IDAsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDEsIDEsIDEsIDAsIDEsIDAgfSwKKyAgICB7IDAsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAgfSwKKyAgICB7IDAsIDEsIDEsIDAsIDAsIDAsIDEsIDEsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEgfSwKKyAgICB7IDAsIDAsIDEsIDEsIDAsIDAsIDAsIDEsIDEgfSwKKyAgICB7IDAsIDAsIDAsIDEsIDAsIDEsIDEsIDEsIDEgfSwKKyAgICB7IDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDAsIDEsIDEsIDAsIDEsIDAgfSwKKyAgICB7IDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDEsIDEsIDAsIDEsIDAsIDEgfSwKKyAgICB7IDEsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDEgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2lsa19sc2Zfd2VpZ2h0X3NlbF93YlszMl1bMTVdID0geworICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMSwgMCwgMCwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCB9LAorICAgIHsgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMCB9LAorICAgIHsgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMSwgMCB9LAorICAgIHsgMCwgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMSwgMSwgMSwgMCwgMSwgMCwgMSB9LAorICAgIHsgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMSB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAorICAgIHsgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMCwgMCB9LAorICAgIHsgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMCwgMSwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMCwgMCB9LAorICAgIHsgMCwgMSwgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMCwgMSwgMSwgMSB9LAorICAgIHsgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCB9LAorICAgIHsgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMCwgMCB9LAorICAgIHsgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMSwgMSwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMSwgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMSwgMCB9LAorICAgIHsgMCwgMCwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMCB9LAorICAgIHsgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCB9LAorICAgIHsgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAorICAgIHsgMCwgMSwgMSwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMSwgMSwgMSB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAorICAgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMSwgMCwgMCwgMSwgMSwgMSwgMCwgMCwgMSwgMCwgMCwgMSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzaWxrX2xzZl9jb2RlYm9va19uYm1iWzMyXVsxMF0gPSB7CisgICAgeyAxMiwgIDM1LCAgNjAsICA4MywgMTA4LCAxMzIsIDE1NywgMTgwLCAyMDYsIDIyOCB9LAorICAgIHsgMTUsICAzMiwgIDU1LCAgNzcsIDEwMSwgMTI1LCAxNTEsIDE3NSwgMjAxLCAyMjUgfSwKKyAgICB7IDE5LCAgNDIsICA2NiwgIDg5LCAxMTQsIDEzNywgMTYyLCAxODQsIDIwOSwgMjMwIH0sCisgICAgeyAxMiwgIDI1LCAgNTAsICA3MiwgIDk3LCAxMjAsIDE0NywgMTcyLCAyMDAsIDIyMyB9LAorICAgIHsgMjYsICA0NCwgIDY5LCAgOTAsIDExNCwgMTM1LCAxNTksIDE4MCwgMjA1LCAyMjUgfSwKKyAgICB7IDEzLCAgMjIsICA1MywgIDgwLCAxMDYsIDEzMCwgMTU2LCAxODAsIDIwNSwgMjI4IH0sCisgICAgeyAxNSwgIDI1LCAgNDQsICA2NCwgIDkwLCAxMTUsIDE0MiwgMTY4LCAxOTYsIDIyMiB9LAorICAgIHsgMTksICAyNCwgIDYyLCAgODIsIDEwMCwgMTIwLCAxNDUsIDE2OCwgMTkwLCAyMTQgfSwKKyAgICB7IDIyLCAgMzEsICA1MCwgIDc5LCAxMDMsIDEyMCwgMTUxLCAxNzAsIDIwMywgMjI3IH0sCisgICAgeyAyMSwgIDI5LCAgNDUsICA2NSwgMTA2LCAxMjQsIDE1MCwgMTcxLCAxOTYsIDIyNCB9LAorICAgIHsgMzAsICA0OSwgIDc1LCAgOTcsIDEyMSwgMTQyLCAxNjUsIDE4NiwgMjA5LCAyMjkgfSwKKyAgICB7IDE5LCAgMjUsICA1MiwgIDcwLCAgOTMsIDExNiwgMTQzLCAxNjYsIDE5MiwgMjE5IH0sCisgICAgeyAyNiwgIDM0LCAgNjIsICA3NSwgIDk3LCAxMTgsIDE0NSwgMTY3LCAxOTQsIDIxNyB9LAorICAgIHsgMjUsICAzMywgIDU2LCAgNzAsICA5MSwgMTEzLCAxNDMsIDE2NSwgMTk2LCAyMjMgfSwKKyAgICB7IDIxLCAgMzQsICA1MSwgIDcyLCAgOTcsIDExNywgMTQ1LCAxNzEsIDE5NiwgMjIyIH0sCisgICAgeyAyMCwgIDI5LCAgNTAsICA2NywgIDkwLCAxMTcsIDE0NCwgMTY4LCAxOTcsIDIyMSB9LAorICAgIHsgMjIsICAzMSwgIDQ4LCAgNjYsICA5NSwgMTE3LCAxNDYsIDE2OCwgMTk2LCAyMjIgfSwKKyAgICB7IDI0LCAgMzMsICA1MSwgIDc3LCAxMTYsIDEzNCwgMTU4LCAxODAsIDIwMCwgMjI0IH0sCisgICAgeyAyMSwgIDI4LCAgNzAsICA4NywgMTA2LCAxMjQsIDE0OSwgMTcwLCAxOTQsIDIxNyB9LAorICAgIHsgMjYsICAzMywgIDUzLCAgNjQsICA4MywgMTE3LCAxNTIsIDE3MywgMjA0LCAyMjUgfSwKKyAgICB7IDI3LCAgMzQsICA2NSwgIDk1LCAxMDgsIDEyOSwgMTU1LCAxNzQsIDIxMCwgMjI1IH0sCisgICAgeyAyMCwgIDI2LCAgNzIsICA5OSwgMTEzLCAxMzEsIDE1NCwgMTc2LCAyMDAsIDIxOSB9LAorICAgIHsgMzQsICA0MywgIDYxLCAgNzgsICA5MywgMTE0LCAxNTUsIDE3NywgMjA1LCAyMjkgfSwKKyAgICB7IDIzLCAgMjksICA1NCwgIDk3LCAxMjQsIDEzOCwgMTYzLCAxNzksIDIwOSwgMjI5IH0sCisgICAgeyAzMCwgIDM4LCAgNTYsICA4OSwgMTE4LCAxMjksIDE1OCwgMTc4LCAyMDAsIDIzMSB9LAorICAgIHsgMjEsICAyOSwgIDQ5LCAgNjMsICA4NSwgMTExLCAxNDIsIDE2MywgMTkzLCAyMjIgfSwKKyAgICB7IDI3LCAgNDgsICA3NywgMTAzLCAxMzMsIDE1OCwgMTc5LCAxOTYsIDIxNSwgMjMyIH0sCisgICAgeyAyOSwgIDQ3LCAgNzQsICA5OSwgMTI0LCAxNTEsIDE3NiwgMTk4LCAyMjAsIDIzNyB9LAorICAgIHsgMzMsICA0MiwgIDYxLCAgNzYsICA5MywgMTIxLCAxNTUsIDE3NCwgMjA3LCAyMjUgfSwKKyAgICB7IDI5LCAgNTMsICA4NywgMTEyLCAxMzYsIDE1NCwgMTcwLCAxODgsIDIwOCwgMjI3IH0sCisgICAgeyAyNCwgIDMwLCAgNTIsICA4NCwgMTMxLCAxNTAsIDE2NiwgMTg2LCAyMDMsIDIyOSB9LAorICAgIHsgMzcsICA0OCwgIDY0LCAgODQsIDEwNCwgMTE4LCAxNTYsIDE3NywgMjAxLCAyMzAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2lsa19sc2ZfY29kZWJvb2tfd2JbMzJdWzE2XSA9IHsKKyAgICB7ICA3LCAgMjMsICAzOCwgIDU0LCAgNjksICA4NSwgMTAwLCAxMTYsIDEzMSwgMTQ3LCAxNjIsIDE3OCwgMTkzLCAyMDgsIDIyMywgMjM5IH0sCisgICAgeyAxMywgIDI1LCAgNDEsICA1NSwgIDY5LCAgODMsICA5OCwgMTEyLCAxMjcsIDE0MiwgMTU3LCAxNzEsIDE4NywgMjAzLCAyMjAsIDIzNiB9LAorICAgIHsgMTUsICAyMSwgIDM0LCAgNTEsICA2MSwgIDc4LCAgOTIsIDEwNiwgMTI2LCAxMzYsIDE1MiwgMTY3LCAxODUsIDIwNSwgMjI1LCAyNDAgfSwKKyAgICB7IDEwLCAgMjEsICAzNiwgIDUwLCAgNjMsICA3OSwgIDk1LCAxMTAsIDEyNiwgMTQxLCAxNTcsIDE3MywgMTg5LCAyMDUsIDIyMSwgMjM3IH0sCisgICAgeyAxNywgIDIwLCAgMzcsICA1MSwgIDU5LCAgNzgsICA4OSwgMTA3LCAxMjMsIDEzNCwgMTUwLCAxNjQsIDE4NCwgMjA1LCAyMjQsIDI0MCB9LAorICAgIHsgMTAsICAxNSwgIDMyLCAgNTEsICA2NywgIDgxLCAgOTYsIDExMiwgMTI5LCAxNDIsIDE1OCwgMTczLCAxODksIDIwNCwgMjIwLCAyMzYgfSwKKyAgICB7ICA4LCAgMjEsICAzNywgIDUxLCAgNjUsICA3OSwgIDk4LCAxMTMsIDEyNiwgMTM4LCAxNTUsIDE2OCwgMTc5LCAxOTIsIDIwOSwgMjE4IH0sCisgICAgeyAxMiwgIDE1LCAgMzQsICA1NSwgIDYzLCAgNzgsICA4NywgMTA4LCAxMTgsIDEzMSwgMTQ4LCAxNjcsIDE4NSwgMjAzLCAyMTksIDIzNiB9LAorICAgIHsgMTYsICAxOSwgIDMyLCAgMzYsICA1NiwgIDc5LCAgOTEsIDEwOCwgMTE4LCAxMzYsIDE1NCwgMTcxLCAxODYsIDIwNCwgMjIwLCAyMzcgfSwKKyAgICB7IDExLCAgMjgsICA0MywgIDU4LCAgNzQsICA4OSwgMTA1LCAxMjAsIDEzNSwgMTUwLCAxNjUsIDE4MCwgMTk2LCAyMTEsIDIyNiwgMjQxIH0sCisgICAgeyAgNiwgIDE2LCAgMzMsICA0NiwgIDYwLCAgNzUsICA5MiwgMTA3LCAxMjMsIDEzNywgMTU2LCAxNjksIDE4NSwgMTk5LCAyMTQsIDIyNSB9LAorICAgIHsgMTEsICAxOSwgIDMwLCAgNDQsICA1NywgIDc0LCAgODksIDEwNSwgMTIxLCAxMzUsIDE1MiwgMTY5LCAxODYsIDIwMiwgMjE4LCAyMzQgfSwKKyAgICB7IDEyLCAgMTksICAyOSwgIDQ2LCAgNTcsICA3MSwgIDg4LCAxMDAsIDEyMCwgMTMyLCAxNDgsIDE2NSwgMTgyLCAxOTksIDIxNiwgMjMzIH0sCisgICAgeyAxNywgIDIzLCAgMzUsICA0NiwgIDU2LCAgNzcsICA5MiwgMTA2LCAxMjMsIDEzNCwgMTUyLCAxNjcsIDE4NSwgMjA0LCAyMjIsIDIzNyB9LAorICAgIHsgMTQsICAxNywgIDQ1LCAgNTMsICA2MywgIDc1LCAgODksIDEwNywgMTE1LCAxMzIsIDE1MSwgMTcxLCAxODgsIDIwNiwgMjIxLCAyNDAgfSwKKyAgICB7ICA5LCAgMTYsICAyOSwgIDQwLCAgNTYsICA3MSwgIDg4LCAxMDMsIDExOSwgMTM3LCAxNTQsIDE3MSwgMTg5LCAyMDUsIDIyMiwgMjM3IH0sCisgICAgeyAxNiwgIDE5LCAgMzYsICA0OCwgIDU3LCAgNzYsICA4NywgMTA1LCAxMTgsIDEzMiwgMTUwLCAxNjcsIDE4NSwgMjAyLCAyMTgsIDIzNiB9LAorICAgIHsgMTIsICAxNywgIDI5LCAgNTQsICA3MSwgIDgxLCAgOTQsIDEwNCwgMTI2LCAxMzYsIDE0OSwgMTY0LCAxODIsIDIwMSwgMjIxLCAyMzcgfSwKKyAgICB7IDE1LCAgMjgsICA0NywgIDYyLCAgNzksICA5NywgMTE1LCAxMjksIDE0MiwgMTU1LCAxNjgsIDE4MCwgMTk0LCAyMDgsIDIyMywgMjM4IH0sCisgICAgeyAgOCwgIDE0LCAgMzAsICA0NSwgIDYyLCAgNzgsICA5NCwgMTExLCAxMjcsIDE0MywgMTU5LCAxNzUsIDE5MiwgMjA3LCAyMjMsIDIzOSB9LAorICAgIHsgMTcsICAzMCwgIDQ5LCAgNjIsICA3OSwgIDkyLCAxMDcsIDExOSwgMTMyLCAxNDUsIDE2MCwgMTc0LCAxOTAsIDIwNCwgMjIwLCAyMzUgfSwKKyAgICB7IDE0LCAgMTksICAzNiwgIDQ1LCAgNjEsICA3NiwgIDkxLCAxMDgsIDEyMSwgMTM4LCAxNTQsIDE3MiwgMTg5LCAyMDUsIDIyMiwgMjM4IH0sCisgICAgeyAxMiwgIDE4LCAgMzEsICA0NSwgIDYwLCAgNzYsICA5MSwgMTA3LCAxMjMsIDEzOCwgMTU0LCAxNzEsIDE4NywgMjA0LCAyMjEsIDIzNiB9LAorICAgIHsgMTMsICAxNywgIDMxLCAgNDMsICA1MywgIDcwLCAgODMsIDEwMywgMTE0LCAxMzEsIDE0OSwgMTY3LCAxODUsIDIwMywgMjIwLCAyMzcgfSwKKyAgICB7IDE3LCAgMjIsICAzNSwgIDQyLCAgNTgsICA3OCwgIDkzLCAxMTAsIDEyNSwgMTM5LCAxNTUsIDE3MCwgMTg4LCAyMDYsIDIyNCwgMjQwIH0sCisgICAgeyAgOCwgIDE1LCAgMzQsICA1MCwgIDY3LCAgODMsICA5OSwgMTE1LCAxMzEsIDE0NiwgMTYyLCAxNzgsIDE5MywgMjA5LCAyMjQsIDIzOSB9LAorICAgIHsgMTMsICAxNiwgIDQxLCAgNjYsICA3MywgIDg2LCAgOTUsIDExMSwgMTI4LCAxMzcsIDE1MCwgMTYzLCAxODMsIDIwNiwgMjI1LCAyNDEgfSwKKyAgICB7IDE3LCAgMjUsICAzNywgIDUyLCAgNjMsICA3NSwgIDkyLCAxMDIsIDExOSwgMTMyLCAxNDQsIDE2MCwgMTc1LCAxOTEsIDIxMiwgMjMxIH0sCisgICAgeyAxOSwgIDMxLCAgNDksICA2NSwgIDgzLCAxMDAsIDExNywgMTMzLCAxNDcsIDE2MSwgMTc0LCAxODcsIDIwMCwgMjEzLCAyMjcsIDI0MiB9LAorICAgIHsgMTgsICAzMSwgIDUyLCAgNjgsICA4OCwgMTAzLCAxMTcsIDEyNiwgMTM4LCAxNDksIDE2MywgMTc3LCAxOTIsIDIwNywgMjIzLCAyMzkgfSwKKyAgICB7IDE2LCAgMjksICA0NywgIDYxLCAgNzYsICA5MCwgMTA2LCAxMTksIDEzMywgMTQ3LCAxNjEsIDE3NiwgMTkzLCAyMDksIDIyNCwgMjQwIH0sCisgICAgeyAxNSwgIDIxLCAgMzUsICA1MCwgIDYxLCAgNzMsICA4NiwgIDk3LCAxMTAsIDExOSwgMTI5LCAxNDEsIDE3NSwgMTk4LCAyMTgsIDIzNyB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19sc2ZfbWluX3NwYWNpbmdfbmJtYltdID0geworICAgIDI1MCwgMywgNiwgMywgMywgMywgNCwgMywgMywgMywgNDYxCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19sc2ZfbWluX3NwYWNpbmdfd2JbXSA9IHsKKyAgICAxMDAsIDMsIDQwLCAzLCAzLCAzLCA1LCAxNCwgMTQsIDEwLCAxMSwgMywgOCwgOSwgNywgMywgMzQ3Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzaWxrX2xzZl9vcmRlcmluZ19uYm1iW10gPSB7CisgICAgMCwgOSwgNiwgMywgNCwgNSwgOCwgMSwgMiwgNworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2lsa19sc2Zfb3JkZXJpbmdfd2JbXSA9IHsKKyAgICAwLCAxNSwgOCwgNywgNCwgMTEsIDEyLCAzLCAyLCAxMywgMTAsIDUsIDYsIDksIDE0LCAxCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBzaWxrX2Nvc2luZVtdID0geyAvKiAoMC4xMikgKi8KKyAgICAgNDA5NiwgIDQwOTUsICA0MDkxLCAgNDA4NSwKKyAgICAgNDA3NiwgIDQwNjUsICA0MDUyLCAgNDAzNiwKKyAgICAgNDAxNywgIDM5OTcsICAzOTczLCAgMzk0OCwKKyAgICAgMzkyMCwgIDM4ODksICAzODU3LCAgMzgyMiwKKyAgICAgMzc4NCwgIDM3NDUsICAzNzAzLCAgMzY1OSwKKyAgICAgMzYxMywgIDM1NjQsICAzNTEzLCAgMzQ2MSwKKyAgICAgMzQwNiwgIDMzNDksICAzMjkwLCAgMzIyOSwKKyAgICAgMzE2NiwgIDMxMDIsICAzMDM1LCAgMjk2NywKKyAgICAgMjg5NiwgIDI4MjQsICAyNzUxLCAgMjY3NiwKKyAgICAgMjU5OSwgIDI1MjAsICAyNDQwLCAgMjM1OSwKKyAgICAgMjI3NiwgIDIxOTEsICAyMTA2LCAgMjAxOSwKKyAgICAgMTkzMSwgIDE4NDIsICAxNzUxLCAgMTY2MCwKKyAgICAgMTU2OCwgIDE0NzQsICAxMzgwLCAgMTI4NSwKKyAgICAgMTE4OSwgIDEwOTMsICAgOTk1LCAgIDg5NywKKyAgICAgIDc5OSwgICA3MDAsICAgNjAxLCAgIDUwMSwKKyAgICAgIDQwMSwgICAzMDEsICAgMjAxLCAgIDEwMSwKKyAgICAgICAgMCwgIC0xMDEsICAtMjAxLCAgLTMwMSwKKyAgICAgLTQwMSwgIC01MDEsICAtNjAxLCAgLTcwMCwKKyAgICAgLTc5OSwgIC04OTcsICAtOTk1LCAtMTA5MywKKyAgICAtMTE4OSwgLTEyODUsIC0xMzgwLCAtMTQ3NCwKKyAgICAtMTU2OCwgLTE2NjAsIC0xNzUxLCAtMTg0MiwKKyAgICAtMTkzMSwgLTIwMTksIC0yMTA2LCAtMjE5MSwKKyAgICAtMjI3NiwgLTIzNTksIC0yNDQwLCAtMjUyMCwKKyAgICAtMjU5OSwgLTI2NzYsIC0yNzUxLCAtMjgyNCwKKyAgICAtMjg5NiwgLTI5NjcsIC0zMDM1LCAtMzEwMiwKKyAgICAtMzE2NiwgLTMyMjksIC0zMjkwLCAtMzM0OSwKKyAgICAtMzQwNiwgLTM0NjEsIC0zNTEzLCAtMzU2NCwKKyAgICAtMzYxMywgLTM2NTksIC0zNzAzLCAtMzc0NSwKKyAgICAtMzc4NCwgLTM4MjIsIC0zODU3LCAtMzg4OSwKKyAgICAtMzkyMCwgLTM5NDgsIC0zOTczLCAtMzk5NywKKyAgICAtNDAxNywgLTQwMzYsIC00MDUyLCAtNDA2NSwKKyAgICAtNDA3NiwgLTQwODUsIC00MDkxLCAtNDA5NSwKKyAgICAtNDA5NgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfcGl0Y2hfc2NhbGVbXSAgID0geyAgNCwgICA2LCAgIDh9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19waXRjaF9taW5fbGFnW10gPSB7IDE2LCAgMjQsICAzMn07CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX3BpdGNoX21heF9sYWdbXSA9IHsxNDQsIDIxNiwgMjg4fTsKKworc3RhdGljIGNvbnN0IGludDhfdCBzaWxrX3BpdGNoX29mZnNldF9uYjEwbXNbM11bMl0gPSB7CisgICAgeyAwLCAgMH0sCisgICAgeyAxLCAgMH0sCisgICAgeyAwLCAgMX0KK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3Qgc2lsa19waXRjaF9vZmZzZXRfbmIyMG1zWzExXVs0XSA9IHsKKyAgICB7IDAsICAwLCAgMCwgIDB9LAorICAgIHsgMiwgIDEsICAwLCAtMX0sCisgICAgey0xLCAgMCwgIDEsICAyfSwKKyAgICB7LTEsICAwLCAgMCwgIDF9LAorICAgIHstMSwgIDAsICAwLCAgMH0sCisgICAgeyAwLCAgMCwgIDAsICAxfSwKKyAgICB7IDAsICAwLCAgMSwgIDF9LAorICAgIHsgMSwgIDEsICAwLCAgMH0sCisgICAgeyAxLCAgMCwgIDAsICAwfSwKKyAgICB7IDAsICAwLCAgMCwgLTF9LAorICAgIHsgMSwgIDAsICAwLCAtMX0KK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3Qgc2lsa19waXRjaF9vZmZzZXRfbWJ3YjEwbXNbMTJdWzJdID0geworICAgIHsgMCwgIDB9LAorICAgIHsgMCwgIDF9LAorICAgIHsgMSwgIDB9LAorICAgIHstMSwgIDF9LAorICAgIHsgMSwgLTF9LAorICAgIHstMSwgIDJ9LAorICAgIHsgMiwgLTF9LAorICAgIHstMiwgIDJ9LAorICAgIHsgMiwgLTJ9LAorICAgIHstMiwgIDN9LAorICAgIHsgMywgLTJ9LAorICAgIHstMywgIDN9Cit9OworCitzdGF0aWMgY29uc3QgaW50OF90IHNpbGtfcGl0Y2hfb2Zmc2V0X21id2IyMG1zWzM0XVs0XSA9IHsKKyAgICB7IDAsICAwLCAgMCwgIDB9LAorICAgIHsgMCwgIDAsICAxLCAgMX0sCisgICAgeyAxLCAgMSwgIDAsICAwfSwKKyAgICB7LTEsICAwLCAgMCwgIDB9LAorICAgIHsgMCwgIDAsICAwLCAgMX0sCisgICAgeyAxLCAgMCwgIDAsICAwfSwKKyAgICB7LTEsICAwLCAgMCwgIDF9LAorICAgIHsgMCwgIDAsICAwLCAtMX0sCisgICAgey0xLCAgMCwgIDEsICAyfSwKKyAgICB7IDEsICAwLCAgMCwgLTF9LAorICAgIHstMiwgLTEsICAxLCAgMn0sCisgICAgeyAyLCAgMSwgIDAsIC0xfSwKKyAgICB7LTIsICAwLCAgMCwgIDJ9LAorICAgIHstMiwgIDAsICAxLCAgM30sCisgICAgeyAyLCAgMSwgLTEsIC0yfSwKKyAgICB7LTMsIC0xLCAgMSwgIDN9LAorICAgIHsgMiwgIDAsICAwLCAtMn0sCisgICAgeyAzLCAgMSwgIDAsIC0yfSwKKyAgICB7LTMsIC0xLCAgMiwgIDR9LAorICAgIHstNCwgLTEsICAxLCAgNH0sCisgICAgeyAzLCAgMSwgLTEsIC0zfSwKKyAgICB7LTQsIC0xLCAgMiwgIDV9LAorICAgIHsgNCwgIDIsIC0xLCAtM30sCisgICAgeyA0LCAgMSwgLTEsIC00fSwKKyAgICB7LTUsIC0xLCAgMiwgIDZ9LAorICAgIHsgNSwgIDIsIC0xLCAtNH0sCisgICAgey02LCAtMiwgIDIsICA2fSwKKyAgICB7LTUsIC0yLCAgMiwgIDV9LAorICAgIHsgNiwgIDIsIC0xLCAtNX0sCisgICAgey03LCAtMiwgIDMsICA4fSwKKyAgICB7IDYsICAyLCAtMiwgLTZ9LAorICAgIHsgNSwgIDIsIC0yLCAtNX0sCisgICAgeyA4LCAgMywgLTIsIC03fSwKKyAgICB7LTksIC0zLCAgMywgIDl9Cit9OworCitzdGF0aWMgY29uc3QgaW50OF90IHNpbGtfbHRwX2ZpbHRlcjBfdGFwc1s4XVs1XSA9IHsKKyAgICB7ICA0LCAgIDYsICAyNCwgICA3LCAgIDV9LAorICAgIHsgIDAsICAgMCwgICAyLCAgIDAsICAgMH0sCisgICAgeyAxMiwgIDI4LCAgNDEsICAxMywgIC00fSwKKyAgICB7IC05LCAgMTUsICA0MiwgIDI1LCAgMTR9LAorICAgIHsgIDEsICAtMiwgIDYyLCAgNDEsICAtOX0sCisgICAgey0xMCwgIDM3LCAgNjUsICAtNCwgICAzfSwKKyAgICB7IC02LCAgIDQsICA2NiwgICA3LCAgLTh9LAorICAgIHsgMTYsICAxNCwgIDM4LCAgLTMsICAzM30KK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3Qgc2lsa19sdHBfZmlsdGVyMV90YXBzWzE2XVs1XSA9IHsKKyAgICB7IDEzLCAgMjIsICAzOSwgIDIzLCAgMTJ9LAorICAgIHsgLTEsICAzNiwgIDY0LCAgMjcsICAtNn0sCisgICAgeyAtNywgIDEwLCAgNTUsICA0MywgIDE3fSwKKyAgICB7ICAxLCAgIDEsICAgOCwgICAxLCAgIDF9LAorICAgIHsgIDYsIC0xMSwgIDc0LCAgNTMsICAtOX0sCisgICAgey0xMiwgIDU1LCAgNzYsIC0xMiwgICA4fSwKKyAgICB7IC0zLCAgIDMsICA5MywgIDI3LCAgLTR9LAorICAgIHsgMjYsICAzOSwgIDU5LCAgIDMsICAtOH0sCisgICAgeyAgMiwgICAwLCAgNzcsICAxMSwgICA5fSwKKyAgICB7IC04LCAgMjIsICA0NCwgIC02LCAgIDd9LAorICAgIHsgNDAsICAgOSwgIDI2LCAgIDMsICAgOX0sCisgICAgeyAtNywgIDIwLCAxMDEsICAtNywgICA0fSwKKyAgICB7ICAzLCAgLTgsICA0MiwgIDI2LCAgIDB9LAorICAgIHstMTUsICAzMywgIDY4LCAgIDIsICAyM30sCisgICAgeyAtMiwgIDU1LCAgNDYsICAtMiwgIDE1fSwKKyAgICB7ICAzLCAgLTEsICAyMSwgIDE2LCAgNDF9Cit9OworCitzdGF0aWMgY29uc3QgaW50OF90IHNpbGtfbHRwX2ZpbHRlcjJfdGFwc1szMl1bNV0gPSB7CisgICAgeyAtNiwgIDI3LCAgNjEsICAzOSwgICA1fSwKKyAgICB7LTExLCAgNDIsICA4OCwgICA0LCAgIDF9LAorICAgIHsgLTIsICA2MCwgIDY1LCAgIDYsICAtNH0sCisgICAgeyAtMSwgIC01LCAgNzMsICA1NiwgICAxfSwKKyAgICB7IC05LCAgMTksICA5NCwgIDI5LCAgLTl9LAorICAgIHsgIDAsICAxMiwgIDk5LCAgIDYsICAgNH0sCisgICAgeyAgOCwgLTE5LCAxMDIsICA0NiwgLTEzfSwKKyAgICB7ICAzLCAgIDIsICAxMywgICAzLCAgIDJ9LAorICAgIHsgIDksIC0yMSwgIDg0LCAgNzIsIC0xOH0sCisgICAgey0xMSwgIDQ2LCAxMDQsIC0yMiwgICA4fSwKKyAgICB7IDE4LCAgMzgsICA0OCwgIDIzLCAgIDB9LAorICAgIHstMTYsICA3MCwgIDgzLCAtMjEsICAxMX0sCisgICAgeyAgNSwgLTExLCAxMTcsICAyMiwgIC04fSwKKyAgICB7IC02LCAgMjMsIDExNywgLTEyLCAgIDN9LAorICAgIHsgIDMsICAtOCwgIDk1LCAgMjgsICAgNH0sCisgICAgey0xMCwgIDE1LCAgNzcsICA2MCwgLTE1fSwKKyAgICB7IC0xLCAgIDQsIDEyNCwgICAyLCAgLTR9LAorICAgIHsgIDMsICAzOCwgIDg0LCAgMjQsIC0yNX0sCisgICAgeyAgMiwgIDEzLCAgNDIsICAxMywgIDMxfSwKKyAgICB7IDIxLCAgLTQsICA1NiwgIDQ2LCAgLTF9LAorICAgIHsgLTEsICAzNSwgIDc5LCAtMTMsICAxOX0sCisgICAgeyAtNywgIDY1LCAgODgsICAtOSwgLTE0fSwKKyAgICB7IDIwLCAgIDQsICA4MSwgIDQ5LCAtMjl9LAorICAgIHsgMjAsICAgMCwgIDc1LCAgIDMsIC0xN30sCisgICAgeyAgNSwgIC05LCAgNDQsICA5MiwgIC04fSwKKyAgICB7ICAxLCAgLTMsICAyMiwgIDY5LCAgMzF9LAorICAgIHsgLTYsICA5NSwgIDQxLCAtMTIsICAgNX0sCisgICAgeyAzOSwgIDY3LCAgMTYsICAtNCwgICAxfSwKKyAgICB7ICAwLCAgLTYsIDEyMCwgIDU1LCAtMzZ9LAorICAgIHstMTMsICA0NCwgMTIyLCAgIDQsIC0yNH0sCisgICAgeyA4MSwgICA1LCAgMTEsICAgMywgICA3fSwKKyAgICB7ICAyLCAgIDAsICAgOSwgIDEwLCAgODh9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19sdHBfc2NhbGVfZmFjdG9yW10gPSB7MTU1NjUsIDEyMjg4LCA4MTkyfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2lsa19zaGVsbF9ibG9ja3NbM11bMl0gPSB7CisgICAgeyA1LCAxMH0sIC8vIE5CCisgICAgeyA4LCAxNX0sIC8vIE1CCisgICAgezEwLCAyMH0gIC8vIFdCCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzaWxrX3F1YW50X29mZnNldFsyXVsyXSA9IHsgLyogKDAuMjMpICovCisgICAgezI1LCA2MH0sIC8vIEluYWN0aXZlIG9yIFVudm9pY2VkCisgICAgeyA4LCAyNX0gIC8vIFZvaWNlZAorfTsKKworc3RhdGljIGNvbnN0IGludCBzaWxrX3N0ZXJlb19pbnRlcnBfbGVuWzNdID0geworICAgIDY0LCA5NiwgMTI4Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc2lsa19zdGFiaWxpemVfbHNmKGludDE2X3QgbmxzZlsxNl0sIGludCBvcmRlciwgY29uc3QgdWludDE2X3QgbWluX2RlbHRhWzE3XSkKK3sKKyAgICBpbnQgcGFzcywgaTsKKyAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjA7IHBhc3MrKykgeworICAgICAgICBpbnQgaywgbWluX2RpZmYgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXIrMTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbG93ICA9IGkgIT0gMCAgICAgPyBubHNmW2ktMV0gOiAwOworICAgICAgICAgICAgaW50IGhpZ2ggPSBpICE9IG9yZGVyID8gbmxzZltpXSAgIDogMzI3Njg7CisgICAgICAgICAgICBpbnQgZGlmZiA9IChoaWdoIC0gbG93KSAtIChtaW5fZGVsdGFbaV0pOworCisgICAgICAgICAgICBpZiAoZGlmZiA8IG1pbl9kaWZmKSB7CisgICAgICAgICAgICAgICAgbWluX2RpZmYgPSBkaWZmOworICAgICAgICAgICAgICAgIGsgPSBpOworCisgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gMjApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtaW5fZGlmZiA9PSAwKSAvKiBubyBpc3N1ZXM7IHN0YWJpbGl6ZWQgKi8KKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvKiB3aWdnbGUgb25lIG9yIHR3byBMU0ZzICovCisgICAgICAgIGlmIChrID09IDApIHsKKyAgICAgICAgICAgIC8qIHJlcGVsIGF3YXkgZnJvbSBsb3dlciBib3VuZCAqLworICAgICAgICAgICAgbmxzZlswXSA9IG1pbl9kZWx0YVswXTsKKyAgICAgICAgfSBlbHNlIGlmIChrID09IG9yZGVyKSB7CisgICAgICAgICAgICAvKiByZXBlbCBhd2F5IGZyb20gaGlnaGVyIGJvdW5kICovCisgICAgICAgICAgICBubHNmW29yZGVyLTFdID0gMzI3NjggLSBtaW5fZGVsdGFbb3JkZXJdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogcmVwZWwgYXdheSBmcm9tIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICAgICAgICAgIGludCBtaW5fY2VudGVyID0gMCwgbWF4X2NlbnRlciA9IDMyNzY4LCBjZW50ZXJfdmFsOworCisgICAgICAgICAgICAvKiBsb3dlciBleHRlbnQgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgICAgICAgICAgICAgbWluX2NlbnRlciArPSBtaW5fZGVsdGFbaV07CisgICAgICAgICAgICBtaW5fY2VudGVyICs9IG1pbl9kZWx0YVtrXSA+PiAxOworCisgICAgICAgICAgICAvKiB1cHBlciBleHRlbnQgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IG9yZGVyOyBpID4gazsgaS0tKQorICAgICAgICAgICAgICAgIG1heF9jZW50ZXIgLT0gbWluX2RlbHRhW2tdOworICAgICAgICAgICAgbWF4X2NlbnRlciAtPSBtaW5fZGVsdGFba10gPj4gMTsKKworICAgICAgICAgICAgLyogbW92ZSBhcGFydCAqLworICAgICAgICAgICAgY2VudGVyX3ZhbCA9IG5sc2ZbayAtIDFdICsgbmxzZltrXTsKKyAgICAgICAgICAgIGNlbnRlcl92YWwgPSAoY2VudGVyX3ZhbCA+PiAxKSArIChjZW50ZXJfdmFsICYgMSk7IC8vIHJvdW5kZWQgZGl2aWRlIGJ5IDIKKyAgICAgICAgICAgIGNlbnRlcl92YWwgPSBGRk1JTihtYXhfY2VudGVyLCBGRk1BWChtaW5fY2VudGVyLCBjZW50ZXJfdmFsKSk7CisKKyAgICAgICAgICAgIG5sc2ZbayAtIDFdID0gY2VudGVyX3ZhbCAtIChtaW5fZGVsdGFba10gPj4gMSk7CisgICAgICAgICAgICBubHNmW2tdICAgICA9IG5sc2ZbayAtIDFdICsgbWluX2RlbHRhW2tdOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcmVzb3J0IHRvIHRoZSBmYWxsLWJhY2sgbWV0aG9kLCB0aGUgc3RhbmRhcmQgbWV0aG9kIGZvciBMU0Ygc3RhYmlsaXphdGlvbiAqLworCisgICAgLyogc29ydDsgYXMgdGhlIExTRnMgc2hvdWxkIGJlIG5lYXJseSBzb3J0ZWQsIHVzZSBpbnNlcnRpb24gc29ydCAqLworICAgIGZvciAoaSA9IDE7IGkgPCBvcmRlcjsgaSsrKSB7CisgICAgICAgIGludCBqLCB2YWx1ZSA9IG5sc2ZbaV07CisgICAgICAgIGZvciAoaiA9IGkgLSAxOyBqID49IDAgJiYgbmxzZltqXSA+IHZhbHVlOyBqLS0pCisgICAgICAgICAgICBubHNmW2ogKyAxXSA9IG5sc2Zbal07CisgICAgICAgIG5sc2ZbaiArIDFdID0gdmFsdWU7CisgICAgfQorCisgICAgLyogcHVzaCBmb3J3YXJkcyB0byBpbmNyZWFzZSBkaXN0YW5jZSAqLworICAgIGlmIChubHNmWzBdIDwgbWluX2RlbHRhWzBdKQorICAgICAgICBubHNmWzBdID0gbWluX2RlbHRhWzBdOworICAgIGZvciAoaSA9IDE7IGkgPCBvcmRlcjsgaSsrKQorICAgICAgICBpZiAobmxzZltpXSA8IG5sc2ZbaSAtIDFdICsgbWluX2RlbHRhW2ldKQorICAgICAgICAgICAgbmxzZltpXSA9IG5sc2ZbaSAtIDFdICsgbWluX2RlbHRhW2ldOworCisgICAgLyogcHVzaCBiYWNrd2FyZHMgdG8gaW5jcmVhc2UgZGlzdGFuY2UgKi8KKyAgICBpZiAobmxzZltvcmRlci0xXSA+IDMyNzY4IC0gbWluX2RlbHRhW29yZGVyXSkKKyAgICAgICAgbmxzZltvcmRlci0xXSA9IDMyNzY4IC0gbWluX2RlbHRhW29yZGVyXTsKKyAgICBmb3IgKGkgPSBvcmRlci0yOyBpID49IDA7IGktLSkKKyAgICAgICAgaWYgKG5sc2ZbaV0gPiBubHNmW2kgKyAxXSAtIG1pbl9kZWx0YVtpKzFdKQorICAgICAgICAgICAgbmxzZltpXSA9IG5sc2ZbaSArIDFdIC0gbWluX2RlbHRhW2krMV07CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNpbGtfaXNfbHBjX3N0YWJsZShjb25zdCBpbnQxNl90IGxwY1sxNl0sIGludCBvcmRlcikKK3sKKyAgICBpbnQgaywgaiwgRENfcmVzcCA9IDA7CisgICAgaW50MzJfdCBscGMzMlsyXVsxNl07ICAgICAgIC8vIFEyNAorICAgIGludCB0b3RhbGludmdhaW4gPSAxIDw8IDMwOyAvLyAxLjAgaW4gUTMwCisgICAgaW50MzJfdCAqcm93ID0gbHBjMzJbMF0sICpwcmV2cm93OworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgZmlyc3Qgcm93IGZvciB0aGUgTGV2aW5zb24gcmVjdXJzaW9uICovCisgICAgZm9yIChrID0gMDsgayA8IG9yZGVyOyBrKyspIHsKKyAgICAgICAgRENfcmVzcCArPSBscGNba107CisgICAgICAgIHJvd1trXSA9IGxwY1trXSAqIDQwOTY7CisgICAgfQorCisgICAgaWYgKERDX3Jlc3AgPj0gNDA5NikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayBpZiBwcmVkaWN0aW9uIGdhaW4gcHVzaGVzIGFueSBjb2VmZmljaWVudHMgdG9vIGZhciAqLworICAgIGZvciAoayA9IG9yZGVyIC0gMTsgMTsgay0tKSB7CisgICAgICAgIGludCByYzsgICAgICAvLyBRMzE7IHJlZmxlY3Rpb24gY29lZmZpY2llbnQKKyAgICAgICAgaW50IGdhaW5kaXY7IC8vIFEzMDsgaW52ZXJzZSBvZiB0aGUgZ2FpbiAodGhlIGRpdmlzb3IpCisgICAgICAgIGludCBnYWluOyAgICAvLyBnYWluIGZvciB0aGlzIHJlZmxlY3Rpb24gY29lZmZpY2llbnQKKyAgICAgICAgaW50IGZiaXRzOyAgIC8vIGZyYWN0aW9uYWwgYml0cyB1c2VkIGZvciB0aGUgZ2FpbgorICAgICAgICBpbnQgZXJyb3I7ICAgLy8gUTI5OyBlc3RpbWF0ZSBvZiB0aGUgZXJyb3Igb2Ygb3VyIHBhcnRpYWwgZXN0aW1hdGUgb2YgMS9nYWluZGl2CisKKyAgICAgICAgaWYgKEZGQUJTKHJvd1trXSkgPiAxNjc3MzAyMikKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHJjICAgICAgPSAtKHJvd1trXSAqIDEyOCk7CisgICAgICAgIGdhaW5kaXYgPSAoMSA8PCAzMCkgLSBNVUxIKHJjLCByYyk7CisKKyAgICAgICAgdG90YWxpbnZnYWluID0gTVVMSCh0b3RhbGludmdhaW4sIGdhaW5kaXYpIDw8IDI7CisgICAgICAgIGlmIChrID09IDApCisgICAgICAgICAgICByZXR1cm4gKHRvdGFsaW52Z2FpbiA+PSAxMDczNzQpOworCisgICAgICAgIC8qIGFwcHJveGltYXRlIDEuMC9nYWluZGl2ICovCisgICAgICAgIGZiaXRzID0gb3B1c19pbG9nKGdhaW5kaXYpOworICAgICAgICBnYWluICA9ICgoMSA8PCAyOSkgLSAxKSAvIChnYWluZGl2ID4+IChmYml0cyArIDEgLSAxNikpOyAvLyBRPGZiaXRzLTE2PgorICAgICAgICBlcnJvciA9ICgxIDw8IDI5KSAtIE1VTEwoZ2FpbmRpdiA8PCAoMTUgKyAxNiAtIGZiaXRzKSwgZ2FpbiwgMTYpOworICAgICAgICBnYWluICA9ICgoZ2FpbiA8PCAxNikgKyAoZXJyb3IgKiBnYWluID4+IDEzKSk7CisKKyAgICAgICAgLyogc3dpdGNoIHRvIHRoZSBuZXh0IHJvdyBvZiB0aGUgTFBDIGNvZWZmaWNpZW50cyAqLworICAgICAgICBwcmV2cm93ID0gcm93OworICAgICAgICByb3cgPSBscGMzMltrICYgMV07CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGs7IGorKykgeworICAgICAgICAgICAgaW50IHggPSBwcmV2cm93W2pdIC0gUk9VTkRfTVVMTChwcmV2cm93W2sgLSBqIC0gMV0sIHJjLCAzMSk7CisgICAgICAgICAgICByb3dbal0gPSBST1VORF9NVUxMKHgsIGdhaW4sIGZiaXRzKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc2lsa19sc3AycG9seShjb25zdCBpbnQzMl90IGxzcFsxNl0sIGludDMyX3QgcG9sWzE2XSwgaW50IGhhbGZfb3JkZXIpCit7CisgICAgaW50IGksIGo7CisKKyAgICBwb2xbMF0gPSA2NTUzNjsgLy8gMS4wIGluIFExNgorICAgIHBvbFsxXSA9IC1sc3BbMF07CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgaGFsZl9vcmRlcjsgaSsrKSB7CisgICAgICAgIHBvbFtpICsgMV0gPSBwb2xbaSAtIDFdICogMiAtIFJPVU5EX01VTEwobHNwWzIgKiBpXSwgcG9sW2ldLCAxNik7CisgICAgICAgIGZvciAoaiA9IGk7IGogPiAxOyBqLS0pCisgICAgICAgICAgICBwb2xbal0gKz0gcG9sW2ogLSAyXSAtIFJPVU5EX01VTEwobHNwWzIgKiBpXSwgcG9sW2ogLSAxXSwgMTYpOworCisgICAgICAgIHBvbFsxXSAtPSBsc3BbMiAqIGldOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2lsa19sc2YybHBjKGNvbnN0IGludDE2X3QgbmxzZlsxNl0sIGZsb2F0IGxwY2ZbMTZdLCBpbnQgb3JkZXIpCit7CisgICAgaW50IGksIGs7CisgICAgaW50MzJfdCBsc3BbMTZdOyAgICAgLy8gUTE3OyAyKmNvcyhMU0YpCisgICAgaW50MzJfdCBwWzldLCBxWzldOyAgLy8gUTE2CisgICAgaW50MzJfdCBscGMzMlsxNl07ICAgLy8gUTE3CisgICAgaW50MTZfdCBscGNbMTZdOyAgICAgLy8gUTEyCisKKyAgICAvKiBjb252ZXJ0IHRoZSBMU0ZzIHRvIExTUHMsIGkuZS4gMipjb3MoTFNGKSAqLworICAgIGZvciAoayA9IDA7IGsgPCBvcmRlcjsgaysrKSB7CisgICAgICAgIGludCBpbmRleCA9IG5sc2Zba10gPj4gODsKKyAgICAgICAgaW50IG9mZnNldCA9IG5sc2Zba10gJiAyNTU7CisgICAgICAgIGludCBrMiA9IChvcmRlciA9PSAxMCkgPyBzaWxrX2xzZl9vcmRlcmluZ19uYm1iW2tdIDogc2lsa19sc2Zfb3JkZXJpbmdfd2Jba107CisKKyAgICAgICAgLyogaW50ZXJwb2xhdGUgYW5kIHJvdW5kICovCisgICAgICAgIGxzcFtrMl0gID0gc2lsa19jb3NpbmVbaW5kZXhdICogMjU2OworICAgICAgICBsc3BbazJdICs9IChzaWxrX2Nvc2luZVtpbmRleCArIDFdIC0gc2lsa19jb3NpbmVbaW5kZXhdKSAqIG9mZnNldDsKKyAgICAgICAgbHNwW2syXSAgPSAobHNwW2syXSArIDQpID4+IDM7CisgICAgfQorCisgICAgc2lsa19sc3AycG9seShsc3AgICAgLCBwLCBvcmRlciA+PiAxKTsKKyAgICBzaWxrX2xzcDJwb2x5KGxzcCArIDEsIHEsIG9yZGVyID4+IDEpOworCisgICAgLyogcmVjb25zdHJ1Y3QgQSh6KSAqLworICAgIGZvciAoayA9IDA7IGsgPCBvcmRlcj4+MTsgaysrKSB7CisgICAgICAgIGxwYzMyW2tdICAgICAgICAgPSAtcFtrICsgMV0gLSBwW2tdIC0gcVtrICsgMV0gKyBxW2tdOworICAgICAgICBscGMzMltvcmRlci1rLTFdID0gLXBbayArIDFdIC0gcFtrXSArIHFbayArIDFdIC0gcVtrXTsKKyAgICB9CisKKyAgICAvKiBsaW1pdCB0aGUgcmFuZ2Ugb2YgdGhlIExQQyBjb2VmZmljaWVudHMgdG8gZWFjaCBmaXQgd2l0aGluIGFuIGludDE2X3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICBpbnQgajsKKyAgICAgICAgdW5zaWduZWQgaW50IG1heGFicyA9IDA7CisgICAgICAgIGZvciAoaiA9IDAsIGsgPSAwOyBqIDwgb3JkZXI7IGorKykgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHggPSBGRkFCUyhscGMzMltrXSk7CisgICAgICAgICAgICBpZiAoeCA+IG1heGFicykgeworICAgICAgICAgICAgICAgIG1heGFicyA9IHg7IC8vIFExNworICAgICAgICAgICAgICAgIGsgICAgICA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtYXhhYnMgPSAobWF4YWJzICsgMTYpID4+IDU7IC8vIGNvbnZlcnQgdG8gUTEyCisKKyAgICAgICAgaWYgKG1heGFicyA+IDMyNzY3KSB7CisgICAgICAgICAgICAvKiBwZXJmb3JtIGJhbmR3aWR0aCBleHBhbnNpb24gKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGlycCwgY2hpcnBfYmFzZTsgLy8gUTE2CisgICAgICAgICAgICBtYXhhYnMgPSBGRk1JTihtYXhhYnMsIDE2MzgzOCk7IC8vIGFueXRoaW5nIGFib3ZlIHRoaXMgb3ZlcmZsb3dzIGNoaXJwJ3MgbnVtZXJhdG9yCisgICAgICAgICAgICBjaGlycF9iYXNlID0gY2hpcnAgPSA2NTQ3MCAtICgobWF4YWJzIC0gMzI3NjcpIDw8IDE0KSAvICgobWF4YWJzICogKGsrMSkpID4+IDIpOworCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgb3JkZXI7IGsrKykgeworICAgICAgICAgICAgICAgIGxwYzMyW2tdID0gUk9VTkRfTVVMTChscGMzMltrXSwgY2hpcnAsIDE2KTsKKyAgICAgICAgICAgICAgICBjaGlycCAgICA9IChjaGlycF9iYXNlICogY2hpcnAgKyAzMjc2OCkgPj4gMTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaSA9PSAxMCkgeworICAgICAgICAvKiB0aW1lJ3MgdXA6IGp1c3QgY2xhbXAgKi8KKyAgICAgICAgZm9yIChrID0gMDsgayA8IG9yZGVyOyBrKyspIHsKKyAgICAgICAgICAgIGludCB4ID0gKGxwYzMyW2tdICsgMTYpID4+IDU7CisgICAgICAgICAgICBscGNba10gPSBhdl9jbGlwX2ludDE2KHgpOworICAgICAgICAgICAgbHBjMzJba10gPSBscGNba10gPDwgNTsgLy8gc2hvcnRjdXQgbWFuZGF0ZWQgYnkgdGhlIHNwZWM7IGRyb3BzIGxvd2VyIDUgYml0cworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG9yZGVyOyBrKyspCisgICAgICAgICAgICBscGNba10gPSAobHBjMzJba10gKyAxNikgPj4gNTsKKyAgICB9CisKKyAgICAvKiBpZiB0aGUgcHJlZGljdGlvbiBnYWluIGNhdXNlcyB0aGUgTFBDIGZpbHRlciB0byBiZWNvbWUgdW5zdGFibGUsCisgICAgICAgYXBwbHkgZnVydGhlciBiYW5kd2lkdGggZXhwYW5zaW9uIG9uIHRoZSBRMTcgY29lZmZpY2llbnRzICovCisgICAgZm9yIChpID0gMTsgaSA8PSAxNiAmJiAhc2lsa19pc19scGNfc3RhYmxlKGxwYywgb3JkZXIpOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGNoaXJwLCBjaGlycF9iYXNlOworICAgICAgICBjaGlycF9iYXNlID0gY2hpcnAgPSA2NTUzNiAtICgxIDw8IGkpOworCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBvcmRlcjsgaysrKSB7CisgICAgICAgICAgICBscGMzMltrXSA9IFJPVU5EX01VTEwobHBjMzJba10sIGNoaXJwLCAxNik7CisgICAgICAgICAgICBscGNba10gICA9IChscGMzMltrXSArIDE2KSA+PiA1OworICAgICAgICAgICAgY2hpcnAgICAgPSAoY2hpcnBfYmFzZSAqIGNoaXJwICsgMzI3NjgpID4+IDE2OworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspCisgICAgICAgIGxwY2ZbaV0gPSBscGNbaV0gLyA0MDk2LjBmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2lsa19kZWNvZGVfbHBjKFNpbGtDb250ZXh0ICpzLCBTaWxrRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHVzUmFuZ2VDb2RlciAqcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxwY19sZWFkaW5bMTZdLCBmbG9hdCBscGNbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxwY19vcmRlciwgaW50ICpoYXNfbHBjX2xlYWRpbiwgaW50IHZvaWNlZCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgb3JkZXI7ICAgICAgICAgICAgICAgICAgIC8vIG9yZGVyIG9mIHRoZSBMUCBwb2x5bm9taWFsOyAxMCBmb3IgTkIvTUIgYW5kIDE2IGZvciBXQgorICAgIGludDhfdCAgbHNmX2kxLCBsc2ZfaTJbMTZdOyAgLy8gc3RhZ2UtMSBhbmQgc3RhZ2UtMiBjb2RlYm9vayBpbmRpY2VzCisgICAgaW50MTZfdCBsc2ZfcmVzWzE2XTsgICAgICAgICAvLyByZXNpZHVhbCBhcyBhIFExMCB2YWx1ZQorICAgIGludDE2X3QgbmxzZlsxNl07ICAgICAgICAgICAgLy8gUTE1CisKKyAgICAqbHBjX29yZGVyID0gb3JkZXIgPSBzLT53YiA/IDE2IDogMTA7CisKKyAgICAvKiBvYnRhaW4gTFNGIHN0YWdlLTEgYW5kIHN0YWdlLTIgaW5kaWNlcyAqLworICAgIGxzZl9pMSA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX2xzZl9zMVtzLT53Yl1bdm9pY2VkXSk7CisgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspIHsKKyAgICAgICAgaW50IGluZGV4ID0gcy0+d2IgPyBzaWxrX2xzZl9zMl9tb2RlbF9zZWxfd2IgIFtsc2ZfaTFdW2ldIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxrX2xzZl9zMl9tb2RlbF9zZWxfbmJtYltsc2ZfaTFdW2ldOworICAgICAgICBsc2ZfaTJbaV0gPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9sc2ZfczJbaW5kZXhdKSAtIDQ7CisgICAgICAgIGlmIChsc2ZfaTJbaV0gPT0gLTQpCisgICAgICAgICAgICBsc2ZfaTJbaV0gLT0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfbHNmX3MyX2V4dCk7CisgICAgICAgIGVsc2UgaWYgKGxzZl9pMltpXSA9PSA0KQorICAgICAgICAgICAgbHNmX2kyW2ldICs9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX2xzZl9zMl9leHQpOworICAgIH0KKworICAgIC8qIHJldmVyc2UgdGhlIGJhY2t3YXJkcy1wcmVkaWN0aW9uIHN0ZXAgKi8KKyAgICBmb3IgKGkgPSBvcmRlciAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGludCBxc3RlcCA9IHMtPndiID8gOTgzMCA6IDExNzk2OworCisgICAgICAgIGxzZl9yZXNbaV0gPSBsc2ZfaTJbaV0gKiAxMDI0OworICAgICAgICBpZiAobHNmX2kyW2ldIDwgMCkgICAgICBsc2ZfcmVzW2ldICs9IDEwMjsKKyAgICAgICAgZWxzZSBpZiAobHNmX2kyW2ldID4gMCkgbHNmX3Jlc1tpXSAtPSAxMDI7CisgICAgICAgIGxzZl9yZXNbaV0gPSAobHNmX3Jlc1tpXSAqIHFzdGVwKSA+PiAxNjsKKworICAgICAgICBpZiAoaSArIDEgPCBvcmRlcikgeworICAgICAgICAgICAgaW50IHdlaWdodCA9IHMtPndiID8gc2lsa19sc2ZfcHJlZF93ZWlnaHRzX3diICBbc2lsa19sc2Zfd2VpZ2h0X3NlbF93YiAgW2xzZl9pMV1baV1dW2ldIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGtfbHNmX3ByZWRfd2VpZ2h0c19uYm1iW3NpbGtfbHNmX3dlaWdodF9zZWxfbmJtYltsc2ZfaTFdW2ldXVtpXTsKKyAgICAgICAgICAgIGxzZl9yZXNbaV0gKz0gKGxzZl9yZXNbaSsxXSAqIHdlaWdodCkgPj4gODsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlY29uc3RydWN0IHRoZSBOTFNGIGNvZWZmaWNpZW50cyBmcm9tIHRoZSBzdXBwbGllZCBpbmRpY2VzICovCisgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIGNvZGVib29rID0gcy0+d2IgPyBzaWxrX2xzZl9jb2RlYm9va193YiAgW2xzZl9pMV0gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGtfbHNmX2NvZGVib29rX25ibWJbbHNmX2kxXTsKKyAgICAgICAgaW50IGN1ciwgcHJldiwgbmV4dCwgd2VpZ2h0X3NxLCB3ZWlnaHQsIGlwYXJ0LCBmcGFydCwgeSwgdmFsdWU7CisKKyAgICAgICAgLyogZmluZCB0aGUgd2VpZ2h0IG9mIHRoZSByZXNpZHVhbCAqLworICAgICAgICAvKiBUT0RPOiBwcmVjb21wdXRlICovCisgICAgICAgIGN1ciA9IGNvZGVib29rW2ldOworICAgICAgICBwcmV2ID0gaSA/IGNvZGVib29rW2kgLSAxXSA6IDA7CisgICAgICAgIG5leHQgPSBpICsgMSA8IG9yZGVyID8gY29kZWJvb2tbaSArIDFdIDogMjU2OworICAgICAgICB3ZWlnaHRfc3EgPSAoMTAyNCAvIChjdXIgLSBwcmV2KSArIDEwMjQgLyAobmV4dCAtIGN1cikpIDw8IDE2OworCisgICAgICAgIC8qIGFwcHJveGltYXRlIHNxdWFyZS1yb290IHdpdGggbWFuZGF0ZWQgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYyAqLworICAgICAgICBpcGFydCA9IG9wdXNfaWxvZyh3ZWlnaHRfc3EpOworICAgICAgICBmcGFydCA9ICh3ZWlnaHRfc3EgPj4gKGlwYXJ0LTgpKSAmIDEyNzsKKyAgICAgICAgeSA9ICgoaXBhcnQgJiAxKSA/IDMyNzY4IDogNDYyMTQpID4+ICgoMzIgLSBpcGFydCk+PjEpOworICAgICAgICB3ZWlnaHQgPSB5ICsgKCgyMTMgKiBmcGFydCAqIHkpID4+IDE2KTsKKworICAgICAgICB2YWx1ZSA9IGN1ciAqIDEyOCArIChsc2ZfcmVzW2ldICogMTYzODQpIC8gd2VpZ2h0OworICAgICAgICBubHNmW2ldID0gYXZfY2xpcCh2YWx1ZSwgMCwgMzI3NjcpOworICAgIH0KKworICAgIC8qIHN0YWJpbGl6ZSB0aGUgTkxTRiBjb2VmZmljaWVudHMgKi8KKyAgICBzaWxrX3N0YWJpbGl6ZV9sc2YobmxzZiwgb3JkZXIsIHMtPndiID8gc2lsa19sc2ZfbWluX3NwYWNpbmdfd2IgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxrX2xzZl9taW5fc3BhY2luZ19uYm1iKTsKKworICAgIC8qIHByb2R1Y2UgYW4gaW50ZXJwb2xhdGlvbiBmb3IgdGhlIGZpcnN0IDIgc3ViZnJhbWVzLCAqLworICAgIC8qIGFuZCB0aGVuIGNvbnZlcnQgYm90aCBzZXRzIG9mIE5MU0ZzIHRvIExQQyBjb2VmZmljaWVudHMgKi8KKyAgICAqaGFzX2xwY19sZWFkaW4gPSAwOworICAgIGlmIChzLT5zdWJmcmFtZXMgPT0gNCkgeworICAgICAgICBpbnQgb2Zmc2V0ID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfbHNmX2ludGVycG9sYXRpb25fb2Zmc2V0KTsKKyAgICAgICAgaWYgKG9mZnNldCAhPSA0ICYmIGZyYW1lLT5jb2RlZCkgeworICAgICAgICAgICAgKmhhc19scGNfbGVhZGluID0gMTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGludDE2X3QgbmxzZl9sZWFkaW5bMTZdOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlcjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBubHNmX2xlYWRpbltpXSA9IGZyYW1lLT5ubHNmW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgobmxzZltpXSAtIGZyYW1lLT5ubHNmW2ldKSAqIG9mZnNldCA+PiAyKTsKKyAgICAgICAgICAgICAgICBzaWxrX2xzZjJscGMobmxzZl9sZWFkaW4sIGxwY19sZWFkaW4sIG9yZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSAgLyogYXZvaWQgcmUtY29tcHV0YXRpb24gZm9yIGEgKHJvdWdobHkpIDEtaW4tNCBvY2N1cnJlbmNlICovCisgICAgICAgICAgICAgICAgbWVtY3B5KGxwY19sZWFkaW4sIGZyYW1lLT5scGMsIDE2ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgb2Zmc2V0ID0gNDsKKyAgICAgICAgcy0+bmxzZl9pbnRlcnBfZmFjdG9yID0gb2Zmc2V0OworCisgICAgICAgIHNpbGtfbHNmMmxwYyhubHNmLCBscGMsIG9yZGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5ubHNmX2ludGVycF9mYWN0b3IgPSA0OworICAgICAgICBzaWxrX2xzZjJscGMobmxzZiwgbHBjLCBvcmRlcik7CisgICAgfQorCisgICAgbWVtY3B5KGZyYW1lLT5ubHNmLCBubHNmLCBvcmRlciAqIHNpemVvZihubHNmWzBdKSk7CisgICAgbWVtY3B5KGZyYW1lLT5scGMsICBscGMsICBvcmRlciAqIHNpemVvZihscGNbMF0pKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNpbGtfY291bnRfY2hpbGRyZW4oT3B1c1JhbmdlQ29kZXIgKnJjLCBpbnQgbW9kZWwsIGludDMyX3QgdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoaWxkWzJdKQoreworICAgIGlmICh0b3RhbCAhPSAwKSB7CisgICAgICAgIGNoaWxkWzBdID0gb3B1c19yY19nZXRzeW1ib2wocmMsCisgICAgICAgICAgICAgICAgICAgICAgIHNpbGtfbW9kZWxfcHVsc2VfbG9jYXRpb25bbW9kZWxdICsgKCgodG90YWwgLSAxICsgNSkgKiAodG90YWwgLSAxKSkgPj4gMSkpOworICAgICAgICBjaGlsZFsxXSA9IHRvdGFsIC0gY2hpbGRbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hpbGRbMF0gPSAwOworICAgICAgICBjaGlsZFsxXSA9IDA7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2lsa19kZWNvZGVfZXhjaXRhdGlvbihTaWxrQ29udGV4dCAqcywgT3B1c1JhbmdlQ29kZXIgKnJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGV4Y2l0YXRpb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHFvZmZzZXRfaGlnaCwgaW50IGFjdGl2ZSwgaW50IHZvaWNlZCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50MzJfdCBzZWVkOworICAgIGludCBzaGVsbGJsb2NrczsKKyAgICBpbnQgcmF0ZWxldmVsOworICAgIHVpbnQ4X3QgcHVsc2Vjb3VudFsyMF07ICAgICAvLyB0b3RhbCBwdWxzZXMgaW4gZWFjaCBzaGVsbCBibG9jaworICAgIHVpbnQ4X3QgbHNiY291bnRbMjBdID0gezB9OyAvLyByYXcgbHNiaXRzIGRlZmluZWQgZm9yIGVhY2ggcHVsc2UgaW4gZWFjaCBzaGVsbCBibG9jaworICAgIGludDMyX3QgZXhjaXRhdGlvblszMjBdOyAgICAvLyBRMjMKKworICAgIC8qIGV4Y2l0YXRpb24gcGFyYW1ldGVycyAqLworICAgIHNlZWQgPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9sY2dfc2VlZCk7CisgICAgc2hlbGxibG9ja3MgPSBzaWxrX3NoZWxsX2Jsb2Nrc1tzLT5iYW5kd2lkdGhdW3MtPnN1YmZyYW1lcyA+PiAyXTsKKyAgICByYXRlbGV2ZWwgPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9leGNfcmF0ZVt2b2ljZWRdKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaGVsbGJsb2NrczsgaSsrKSB7CisgICAgICAgIHB1bHNlY291bnRbaV0gPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9wdWxzZV9jb3VudFtyYXRlbGV2ZWxdKTsKKyAgICAgICAgaWYgKHB1bHNlY291bnRbaV0gPT0gMTcpIHsKKyAgICAgICAgICAgIHdoaWxlIChwdWxzZWNvdW50W2ldID09IDE3ICYmICsrbHNiY291bnRbaV0gIT0gMTApCisgICAgICAgICAgICAgICAgcHVsc2Vjb3VudFtpXSA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX3B1bHNlX2NvdW50WzldKTsKKyAgICAgICAgICAgIGlmIChsc2Jjb3VudFtpXSA9PSAxMCkKKyAgICAgICAgICAgICAgICBwdWxzZWNvdW50W2ldID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfcHVsc2VfY291bnRbMTBdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGRlY29kZSBwdWxzZSBsb2NhdGlvbnMgdXNpbmcgUFZRICovCisgICAgZm9yIChpID0gMDsgaSA8IHNoZWxsYmxvY2tzOyBpKyspIHsKKyAgICAgICAgaWYgKHB1bHNlY291bnRbaV0gIT0gMCkgeworICAgICAgICAgICAgaW50IGEsIGIsIGMsIGQ7CisgICAgICAgICAgICBpbnQzMl90ICogbG9jYXRpb24gPSBleGNpdGF0aW9uICsgMTYqaTsKKyAgICAgICAgICAgIGludDMyX3QgYnJhbmNoWzRdWzJdOworICAgICAgICAgICAgYnJhbmNoWzBdWzBdID0gcHVsc2Vjb3VudFtpXTsKKworICAgICAgICAgICAgLyogdW5yb2xsZWQgdGFpbCByZWN1cnNpb24gKi8KKyAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCAxOyBhKyspIHsKKyAgICAgICAgICAgICAgICBzaWxrX2NvdW50X2NoaWxkcmVuKHJjLCAwLCBicmFuY2hbMF1bYV0sIGJyYW5jaFsxXSk7CisgICAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IDI7IGIrKykgeworICAgICAgICAgICAgICAgICAgICBzaWxrX2NvdW50X2NoaWxkcmVuKHJjLCAxLCBicmFuY2hbMV1bYl0sIGJyYW5jaFsyXSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAyOyBjKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpbGtfY291bnRfY2hpbGRyZW4ocmMsIDIsIGJyYW5jaFsyXVtjXSwgYnJhbmNoWzNdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZCA9IDA7IGQgPCAyOyBkKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxrX2NvdW50X2NoaWxkcmVuKHJjLCAzLCBicmFuY2hbM11bZF0sIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1lbXNldChleGNpdGF0aW9uICsgMTYqaSwgMCwgMTYqc2l6ZW9mKGludDMyX3QpKTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzaGVsbGJsb2NrcyA8PCA0OyBpKyspIHsKKyAgICAgICAgaW50IGJpdDsKKyAgICAgICAgZm9yIChiaXQgPSAwOyBiaXQgPCBsc2Jjb3VudFtpID4+IDRdOyBiaXQrKykKKyAgICAgICAgICAgIGV4Y2l0YXRpb25baV0gPSAoZXhjaXRhdGlvbltpXSA8PCAxKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfZXhjaXRhdGlvbl9sc2IpOworICAgIH0KKworICAgIC8qIGRlY29kZSBzaWducyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzaGVsbGJsb2NrcyA8PCA0OyBpKyspIHsKKyAgICAgICAgaWYgKGV4Y2l0YXRpb25baV0gIT0gMCkgeworICAgICAgICAgICAgaW50IHNpZ24gPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9leGNpdGF0aW9uX3NpZ25bYWN0aXZlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2VkXVtxb2Zmc2V0X2hpZ2hdW0ZGTUlOKHB1bHNlY291bnRbaSA+PiA0XSwgNildKTsKKyAgICAgICAgICAgIGlmIChzaWduID09IDApCisgICAgICAgICAgICAgICAgZXhjaXRhdGlvbltpXSAqPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGFzc2VtYmxlIHRoZSBleGNpdGF0aW9uICovCisgICAgZm9yIChpID0gMDsgaSA8IHNoZWxsYmxvY2tzIDw8IDQ7IGkrKykgeworICAgICAgICBpbnQgdmFsdWUgPSBleGNpdGF0aW9uW2ldOworICAgICAgICBleGNpdGF0aW9uW2ldID0gdmFsdWUgKiAyNTYgfCBzaWxrX3F1YW50X29mZnNldFt2b2ljZWRdW3FvZmZzZXRfaGlnaF07CisgICAgICAgIGlmICh2YWx1ZSA8IDApICAgICAgZXhjaXRhdGlvbltpXSArPSAyMDsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUgPiAwKSBleGNpdGF0aW9uW2ldIC09IDIwOworCisgICAgICAgIC8qIGludmVydCBzYW1wbGVzIHBzZXVkb3JhbmRvbWx5ICovCisgICAgICAgIHNlZWQgPSAxOTYzMTQxNjUgKiBzZWVkICsgOTA3NjMzNTE1OworICAgICAgICBpZiAoc2VlZCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICBleGNpdGF0aW9uW2ldICo9IC0xOworICAgICAgICBzZWVkICs9IHZhbHVlOworCisgICAgICAgIGV4Y2l0YXRpb25mW2ldID0gZXhjaXRhdGlvbltpXSAvIDgzODg2MDguMGY7CisgICAgfQorfQorCisvKiogTWF4aW11bSByZXNpZHVhbCBoaXN0b3J5IGFjY29yZGluZyB0byA0LjIuNy42LjEgKi8KKyNkZWZpbmUgU0lMS19NQVhfTEFHICAoMjg4ICsgTFRQX09SREVSIC8gMikKKworLyoqIE9yZGVyIG9mIHRoZSBMVFAgZmlsdGVyICovCisjZGVmaW5lIExUUF9PUkRFUiA1CisKK3N0YXRpYyB2b2lkIHNpbGtfZGVjb2RlX2ZyYW1lKFNpbGtDb250ZXh0ICpzLCBPcHVzUmFuZ2VDb2RlciAqcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfbnVtLCBpbnQgY2hhbm5lbCwgaW50IGNvZGVkX2NoYW5uZWxzLCBpbnQgYWN0aXZlLCBpbnQgYWN0aXZlMSkKK3sKKyAgICAvKiBwZXIgZnJhbWUgKi8KKyAgICBpbnQgdm9pY2VkOyAgICAgICAvLyBjb21iaW5lcyB3aXRoIGFjdGl2ZSB0byBpbmRpY2F0ZSBpbmFjdGl2ZSwgYWN0aXZlLCBvciBhY3RpdmUrdm9pY2VkCisgICAgaW50IHFvZmZzZXRfaGlnaDsKKyAgICBpbnQgb3JkZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmRlciBvZiB0aGUgTFBDIGNvZWZmaWNpZW50cworICAgIGZsb2F0IGxwY19sZWFkaW5bMTZdLCBscGNfYm9keVsxNl0sIHJlc2lkdWFsW1NJTEtfTUFYX0xBRyArIFNJTEtfSElTVE9SWV07CisgICAgaW50IGhhc19scGNfbGVhZGluOworICAgIGZsb2F0IGx0cHNjYWxlOworCisgICAgLyogcGVyIHN1YmZyYW1lICovCisgICAgc3RydWN0IHsKKyAgICAgICAgZmxvYXQgZ2FpbjsKKyAgICAgICAgaW50IHBpdGNobGFnOworICAgICAgICBmbG9hdCBsdHB0YXBzWzVdOworICAgIH0gc2ZbNF07CisKKyAgICBTaWxrRnJhbWUgKiBjb25zdCBmcmFtZSA9IHMtPmZyYW1lICsgY2hhbm5lbDsKKworICAgIGludCBpOworCisgICAgLyogb2J0YWluIHN0ZXJlbyB3ZWlnaHRzICovCisgICAgaWYgKGNvZGVkX2NoYW5uZWxzID09IDIgJiYgY2hhbm5lbCA9PSAwKSB7CisgICAgICAgIGludCBuLCB3aVsyXSwgd3NbMl0sIHdbMl07CisgICAgICAgIG4gICAgID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfc3RlcmVvX3MxKTsKKyAgICAgICAgd2lbMF0gPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9zdGVyZW9fczIpICsgMyAqIChuIC8gNSk7CisgICAgICAgIHdzWzBdID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfc3RlcmVvX3MzKTsKKyAgICAgICAgd2lbMV0gPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9zdGVyZW9fczIpICsgMyAqIChuICUgNSk7CisgICAgICAgIHdzWzFdID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfc3RlcmVvX3MzKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgd1tpXSA9IHNpbGtfc3RlcmVvX3dlaWdodHNbd2lbaV1dICsKKyAgICAgICAgICAgICAgICAgICAoKChzaWxrX3N0ZXJlb193ZWlnaHRzW3dpW2ldICsgMV0gLSBzaWxrX3N0ZXJlb193ZWlnaHRzW3dpW2ldXSkgKiA2NTU0KSA+PiAxNikKKyAgICAgICAgICAgICAgICAgICAgKiAod3NbaV0qMiArIDEpOworCisgICAgICAgIHMtPnN0ZXJlb193ZWlnaHRzWzBdID0gKHdbMF0gLSB3WzFdKSAvIDgxOTIuMDsKKyAgICAgICAgcy0+c3RlcmVvX3dlaWdodHNbMV0gPSB3WzFdICAgICAgICAgIC8gODE5Mi4wOworCisgICAgICAgIC8qIGFuZCByZWFkIHRoZSBtaWQtb25seSBmbGFnICovCisgICAgICAgIHMtPm1pZG9ubHkgPSBhY3RpdmUxID8gMCA6IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX21pZF9vbmx5KTsKKyAgICB9CisKKyAgICAvKiBvYnRhaW4gZnJhbWUgdHlwZSAqLworICAgIGlmICghYWN0aXZlKSB7CisgICAgICAgIHFvZmZzZXRfaGlnaCA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX2ZyYW1lX3R5cGVfaW5hY3RpdmUpOworICAgICAgICB2b2ljZWQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCB0eXBlID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfZnJhbWVfdHlwZV9hY3RpdmUpOworICAgICAgICBxb2Zmc2V0X2hpZ2ggPSB0eXBlICYgMTsKKyAgICAgICAgdm9pY2VkID0gdHlwZSA+PiAxOworICAgIH0KKworICAgIC8qIG9idGFpbiBzdWJmcmFtZSBxdWFudGl6YXRpb24gZ2FpbnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c3ViZnJhbWVzOyBpKyspIHsKKyAgICAgICAgaW50IGxvZ19nYWluOyAgICAgLy9RNworICAgICAgICBpbnQgaXBhcnQsIGZwYXJ0LCBsaW5nYWluOworCisgICAgICAgIGlmIChpID09IDAgJiYgKGZyYW1lX251bSA9PSAwIHx8ICFmcmFtZS0+Y29kZWQpKSB7CisgICAgICAgICAgICAvKiBnYWluIGlzIGNvZGVkIGFic29sdXRlICovCisgICAgICAgICAgICBpbnQgeCA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX2dhaW5faGlnaGJpdHNbYWN0aXZlICsgdm9pY2VkXSk7CisgICAgICAgICAgICBsb2dfZ2FpbiA9ICh4PDwzKSB8IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX2dhaW5fbG93Yml0cyk7CisKKyAgICAgICAgICAgIGlmIChmcmFtZS0+Y29kZWQpCisgICAgICAgICAgICAgICAgbG9nX2dhaW4gPSBGRk1BWChsb2dfZ2FpbiwgZnJhbWUtPmxvZ19nYWluIC0gMTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZ2FpbiBpcyBjb2RlZCByZWxhdGl2ZSAqLworICAgICAgICAgICAgaW50IGRlbHRhX2dhaW4gPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9nYWluX2RlbHRhKTsKKyAgICAgICAgICAgIGxvZ19nYWluID0gYXZfY2xpcChGRk1BWCgoZGVsdGFfZ2Fpbjw8MSkgLSAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bG9nX2dhaW4gKyBkZWx0YV9nYWluIC0gNCksIDAsIDYzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lLT5sb2dfZ2FpbiA9IGxvZ19nYWluOworCisgICAgICAgIC8qIGFwcHJveGltYXRlIDIqKih4LzEyOCkgd2l0aCBhIFE3IChpLmUuIG5vbi1pbnRlZ2VyKSBpbnB1dCAqLworICAgICAgICBsb2dfZ2FpbiA9IChsb2dfZ2FpbiAqIDB4MUQxQzcxID4+IDE2KSArIDIwOTA7CisgICAgICAgIGlwYXJ0ID0gbG9nX2dhaW4gPj4gNzsKKyAgICAgICAgZnBhcnQgPSBsb2dfZ2FpbiAmIDEyNzsKKyAgICAgICAgbGluZ2FpbiA9ICgxIDw8IGlwYXJ0KSArICgoLTE3NCAqIGZwYXJ0ICogKDEyOC1mcGFydCkgPj4xNikgKyBmcGFydCkgKiAoKDE8PGlwYXJ0KSA+PiA3KTsKKyAgICAgICAgc2ZbaV0uZ2FpbiA9IGxpbmdhaW4gLyA2NTUzNi4wZjsKKyAgICB9CisKKyAgICAvKiBvYnRhaW4gTFBDIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgICBzaWxrX2RlY29kZV9scGMocywgZnJhbWUsIHJjLCBscGNfbGVhZGluLCBscGNfYm9keSwgJm9yZGVyLCAmaGFzX2xwY19sZWFkaW4sIHZvaWNlZCk7CisKKyAgICAvKiBvYnRhaW4gcGl0Y2ggbGFncywgaWYgdGhpcyBpcyBhIHZvaWNlZCBmcmFtZSAqLworICAgIGlmICh2b2ljZWQpIHsKKyAgICAgICAgaW50IGxhZ19hYnNvbHV0ZSA9ICghZnJhbWVfbnVtIHx8ICFmcmFtZS0+cHJldl92b2ljZWQpOworICAgICAgICBpbnQgcHJpbWFyeWxhZzsgICAgICAgICAvLyBwcmltYXJ5IHBpdGNoIGxhZyBmb3IgdGhlIGVudGlyZSBTSUxLIGZyYW1lCisgICAgICAgIGludCBsdHBmaWx0ZXI7CisgICAgICAgIGNvbnN0IGludDhfdCAqIG9mZnNldHM7CisKKyAgICAgICAgaWYgKCFsYWdfYWJzb2x1dGUpIHsKKyAgICAgICAgICAgIGludCBkZWx0YSA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX3BpdGNoX2RlbHRhKTsKKyAgICAgICAgICAgIGlmIChkZWx0YSkKKyAgICAgICAgICAgICAgICBwcmltYXJ5bGFnID0gZnJhbWUtPnByaW1hcnlsYWcgKyBkZWx0YSAtIDk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGFnX2Fic29sdXRlID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYWdfYWJzb2x1dGUpIHsKKyAgICAgICAgICAgIC8qIHByaW1hcnkgbGFnIGlzIGNvZGVkIGFic29sdXRlICovCisgICAgICAgICAgICBpbnQgaGlnaGJpdHMsIGxvd2JpdHM7CisgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqbW9kZWxbXSA9IHsKKyAgICAgICAgICAgICAgICBzaWxrX21vZGVsX3BpdGNoX2xvd2JpdHNfbmIsIHNpbGtfbW9kZWxfcGl0Y2hfbG93Yml0c19tYiwKKyAgICAgICAgICAgICAgICBzaWxrX21vZGVsX3BpdGNoX2xvd2JpdHNfd2IKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBoaWdoYml0cyA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX3BpdGNoX2hpZ2hiaXRzKTsKKyAgICAgICAgICAgIGxvd2JpdHMgID0gb3B1c19yY19nZXRzeW1ib2wocmMsIG1vZGVsW3MtPmJhbmR3aWR0aF0pOworCisgICAgICAgICAgICBwcmltYXJ5bGFnID0gc2lsa19waXRjaF9taW5fbGFnW3MtPmJhbmR3aWR0aF0gKworICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hiaXRzKnNpbGtfcGl0Y2hfc2NhbGVbcy0+YmFuZHdpZHRoXSArIGxvd2JpdHM7CisgICAgICAgIH0KKyAgICAgICAgZnJhbWUtPnByaW1hcnlsYWcgPSBwcmltYXJ5bGFnOworCisgICAgICAgIGlmIChzLT5zdWJmcmFtZXMgPT0gMikKKyAgICAgICAgICAgIG9mZnNldHMgPSAocy0+YmFuZHdpZHRoID09IE9QVVNfQkFORFdJRFRIX05BUlJPV0JBTkQpCisgICAgICAgICAgICAgICAgICAgICA/IHNpbGtfcGl0Y2hfb2Zmc2V0X25iMTBtc1tvcHVzX3JjX2dldHN5bWJvbChyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGtfbW9kZWxfcGl0Y2hfY29udG91cl9uYjEwbXMpXQorICAgICAgICAgICAgICAgICAgICAgOiBzaWxrX3BpdGNoX29mZnNldF9tYndiMTBtc1tvcHVzX3JjX2dldHN5bWJvbChyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGtfbW9kZWxfcGl0Y2hfY29udG91cl9tYndiMTBtcyldOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvZmZzZXRzID0gKHMtPmJhbmR3aWR0aCA9PSBPUFVTX0JBTkRXSURUSF9OQVJST1dCQU5EKQorICAgICAgICAgICAgICAgICAgICAgPyBzaWxrX3BpdGNoX29mZnNldF9uYjIwbXNbb3B1c19yY19nZXRzeW1ib2wocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxrX21vZGVsX3BpdGNoX2NvbnRvdXJfbmIyMG1zKV0KKyAgICAgICAgICAgICAgICAgICAgIDogc2lsa19waXRjaF9vZmZzZXRfbWJ3YjIwbXNbb3B1c19yY19nZXRzeW1ib2wocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxrX21vZGVsX3BpdGNoX2NvbnRvdXJfbWJ3YjIwbXMpXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c3ViZnJhbWVzOyBpKyspCisgICAgICAgICAgICBzZltpXS5waXRjaGxhZyA9IGF2X2NsaXAocHJpbWFyeWxhZyArIG9mZnNldHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsa19waXRjaF9taW5fbGFnW3MtPmJhbmR3aWR0aF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsa19waXRjaF9tYXhfbGFnW3MtPmJhbmR3aWR0aF0pOworCisgICAgICAgIC8qIG9idGFpbiBMVFAgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICAgICAgICBsdHBmaWx0ZXIgPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9sdHBfZmlsdGVyKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnN1YmZyYW1lczsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaW5kZXgsIGo7CisgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqZmlsdGVyX3NlbFtdID0geworICAgICAgICAgICAgICAgIHNpbGtfbW9kZWxfbHRwX2ZpbHRlcjBfc2VsLCBzaWxrX21vZGVsX2x0cF9maWx0ZXIxX3NlbCwKKyAgICAgICAgICAgICAgICBzaWxrX21vZGVsX2x0cF9maWx0ZXIyX3NlbAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNvbnN0IGludDhfdCAoKmZpbHRlcl90YXBzW10pWzVdID0geworICAgICAgICAgICAgICAgIHNpbGtfbHRwX2ZpbHRlcjBfdGFwcywgc2lsa19sdHBfZmlsdGVyMV90YXBzLCBzaWxrX2x0cF9maWx0ZXIyX3RhcHMKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpbmRleCA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBmaWx0ZXJfc2VsW2x0cGZpbHRlcl0pOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDU7IGorKykKKyAgICAgICAgICAgICAgICBzZltpXS5sdHB0YXBzW2pdID0gZmlsdGVyX3RhcHNbbHRwZmlsdGVyXVtpbmRleF1bal0gLyAxMjguMGY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBvYnRhaW4gTFRQIHNjYWxlIGZhY3RvciAqLworICAgIGlmICh2b2ljZWQgJiYgZnJhbWVfbnVtID09IDApCisgICAgICAgIGx0cHNjYWxlID0gc2lsa19sdHBfc2NhbGVfZmFjdG9yW29wdXNfcmNfZ2V0c3ltYm9sKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxrX21vZGVsX2x0cF9zY2FsZV9pbmRleCldIC8gMTYzODQuMGY7CisgICAgZWxzZSBsdHBzY2FsZSA9IDE1NTY1LjBmLzE2Mzg0LjBmOworCisgICAgLyogZ2VuZXJhdGUgdGhlIGV4Y2l0YXRpb24gc2lnbmFsIGZvciB0aGUgZW50aXJlIGZyYW1lICovCisgICAgc2lsa19kZWNvZGVfZXhjaXRhdGlvbihzLCByYywgcmVzaWR1YWwgKyBTSUxLX01BWF9MQUcsIHFvZmZzZXRfaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSwgdm9pY2VkKTsKKworICAgIC8qIHNraXAgc3ludGhlc2lzaW5nIHRoZSBzaWRlIGNoYW5uZWwgaWYgd2Ugd2FudCBtb25vLW9ubHkgKi8KKyAgICBpZiAocy0+b3V0cHV0X2NoYW5uZWxzID09IGNoYW5uZWwpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIGdlbmVyYXRlIHRoZSBvdXRwdXQgc2lnbmFsICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPnN1YmZyYW1lczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0ICogbHBjX2NvZWZmID0gKGkgPCAyICYmIGhhc19scGNfbGVhZGluKSA/IGxwY19sZWFkaW4gOiBscGNfYm9keTsKKyAgICAgICAgZmxvYXQgKmRzdCAgICA9IGZyYW1lLT5vdXRwdXQgICAgICArIFNJTEtfSElTVE9SWSArIGkgKiBzLT5zZmxlbmd0aDsKKyAgICAgICAgZmxvYXQgKnJlc3B0ciA9IHJlc2lkdWFsICAgICAgICAgICArIFNJTEtfTUFYX0xBRyArIGkgKiBzLT5zZmxlbmd0aDsKKyAgICAgICAgZmxvYXQgKmxwYyAgICA9IGZyYW1lLT5scGNfaGlzdG9yeSArIFNJTEtfSElTVE9SWSArIGkgKiBzLT5zZmxlbmd0aDsKKyAgICAgICAgZmxvYXQgc3VtOworICAgICAgICBpbnQgaiwgazsKKworICAgICAgICBpZiAodm9pY2VkKSB7CisgICAgICAgICAgICBpbnQgb3V0X2VuZDsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlOworCisgICAgICAgICAgICBpZiAoaSA8IDIgfHwgcy0+bmxzZl9pbnRlcnBfZmFjdG9yID09IDQpIHsKKyAgICAgICAgICAgICAgICBvdXRfZW5kID0gLWkgKiBzLT5zZmxlbmd0aDsKKyAgICAgICAgICAgICAgICBzY2FsZSAgID0gbHRwc2NhbGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dF9lbmQgPSAtKGkgLSAyKSAqIHMtPnNmbGVuZ3RoOworICAgICAgICAgICAgICAgIHNjYWxlICAgPSAxLjBmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB3aGVuIHRoZSBMUEMgY29lZmZpY2llbnRzIGNoYW5nZSwgYSByZS13aGl0ZW5pbmcgZmlsdGVyIGlzIHVzZWQgKi8KKyAgICAgICAgICAgIC8qIHRvIHByb2R1Y2UgYSByZXNpZHVhbCB0aGF0IGFjY291bnRzIGZvciB0aGUgY2hhbmdlICovCisgICAgICAgICAgICBmb3IgKGogPSAtIHNmW2ldLnBpdGNobGFnIC0gTFRQX09SREVSLzI7IGogPCBvdXRfZW5kOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzdW0gPSBkc3Rbal07CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG9yZGVyOyBrKyspCisgICAgICAgICAgICAgICAgICAgIHN1bSAtPSBscGNfY29lZmZba10gKiBkc3RbaiAtIGsgLSAxXTsKKyAgICAgICAgICAgICAgICByZXNwdHJbal0gPSBhdl9jbGlwZihzdW0sIC0xLjBmLCAxLjBmKSAqIHNjYWxlIC8gc2ZbaV0uZ2FpbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG91dF9lbmQpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCByZXNjYWxlID0gc2ZbaS0xXS5nYWluIC8gc2ZbaV0uZ2FpbjsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSBvdXRfZW5kOyBqIDwgMDsgaisrKQorICAgICAgICAgICAgICAgICAgICByZXNwdHJbal0gKj0gcmVzY2FsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTFRQIHN5bnRoZXNpcyAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnNmbGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzdW0gPSByZXNwdHJbal07CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IExUUF9PUkRFUjsgaysrKQorICAgICAgICAgICAgICAgICAgICBzdW0gKz0gc2ZbaV0ubHRwdGFwc1trXSAqIHJlc3B0cltqIC0gc2ZbaV0ucGl0Y2hsYWcgKyBMVFBfT1JERVIvMiAtIGtdOworICAgICAgICAgICAgICAgIHJlc3B0cltqXSA9IHN1bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIExQQyBzeW50aGVzaXMgKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnNmbGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgIHN1bSA9IHJlc3B0cltqXSAqIHNmW2ldLmdhaW47CisgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDw9IG9yZGVyOyBrKyspCisgICAgICAgICAgICAgICAgc3VtICs9IGxwY19jb2VmZltrIC0gMV0gKiBscGNbaiAtIGtdOworCisgICAgICAgICAgICBscGNbal0gPSBzdW07CisgICAgICAgICAgICBkc3Rbal0gPSBhdl9jbGlwZihzdW0sIC0xLjBmLCAxLjBmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZyYW1lLT5wcmV2X3ZvaWNlZCA9IHZvaWNlZDsKKyAgICBtZW1tb3ZlKGZyYW1lLT5scGNfaGlzdG9yeSwgZnJhbWUtPmxwY19oaXN0b3J5ICsgcy0+Zmxlbmd0aCwgU0lMS19ISVNUT1JZICogc2l6ZW9mKGZsb2F0KSk7CisgICAgbWVtbW92ZShmcmFtZS0+b3V0cHV0LCAgICAgIGZyYW1lLT5vdXRwdXQgICAgICArIHMtPmZsZW5ndGgsIFNJTEtfSElTVE9SWSAqIHNpemVvZihmbG9hdCkpOworCisgICAgZnJhbWUtPmNvZGVkID0gMTsKK30KKworc3RhdGljIHZvaWQgc2lsa191bm1peF9tcyhTaWxrQ29udGV4dCAqcywgZmxvYXQgKmwsIGZsb2F0ICpyKQoreworICAgIGZsb2F0ICptaWQgICAgPSBzLT5mcmFtZVswXS5vdXRwdXQgKyBTSUxLX0hJU1RPUlkgLSBzLT5mbGVuZ3RoOworICAgIGZsb2F0ICpzaWRlICAgPSBzLT5mcmFtZVsxXS5vdXRwdXQgKyBTSUxLX0hJU1RPUlkgLSBzLT5mbGVuZ3RoOworICAgIGZsb2F0IHcwX3ByZXYgPSBzLT5wcmV2X3N0ZXJlb193ZWlnaHRzWzBdOworICAgIGZsb2F0IHcxX3ByZXYgPSBzLT5wcmV2X3N0ZXJlb193ZWlnaHRzWzFdOworICAgIGZsb2F0IHcwICAgICAgPSBzLT5zdGVyZW9fd2VpZ2h0c1swXTsKKyAgICBmbG9hdCB3MSAgICAgID0gcy0+c3RlcmVvX3dlaWdodHNbMV07CisgICAgaW50IG4xICAgICAgICA9IHNpbGtfc3RlcmVvX2ludGVycF9sZW5bcy0+YmFuZHdpZHRoXTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuMTsgaSsrKSB7CisgICAgICAgIGZsb2F0IGludGVycDAgPSB3MF9wcmV2ICsgaSAqICh3MCAtIHcwX3ByZXYpIC8gbjE7CisgICAgICAgIGZsb2F0IGludGVycDEgPSB3MV9wcmV2ICsgaSAqICh3MSAtIHcxX3ByZXYpIC8gbjE7CisgICAgICAgIGZsb2F0IHAwICAgICAgPSAwLjI1ICogKG1pZFtpIC0gMl0gKyAyICogbWlkW2kgLSAxXSArIG1pZFtpXSk7CisKKyAgICAgICAgbFtpXSA9IGF2X2NsaXBmKCgxICsgaW50ZXJwMSkgKiBtaWRbaSAtIDFdICsgc2lkZVtpIC0gMV0gKyBpbnRlcnAwICogcDAsIC0xLjAsIDEuMCk7CisgICAgICAgIHJbaV0gPSBhdl9jbGlwZigoMSAtIGludGVycDEpICogbWlkW2kgLSAxXSAtIHNpZGVbaSAtIDFdIC0gaW50ZXJwMCAqIHAwLCAtMS4wLCAxLjApOworICAgIH0KKworICAgIGZvciAoOyBpIDwgcy0+Zmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHAwID0gMC4yNSAqIChtaWRbaSAtIDJdICsgMiAqIG1pZFtpIC0gMV0gKyBtaWRbaV0pOworCisgICAgICAgIGxbaV0gPSBhdl9jbGlwZigoMSArIHcxKSAqIG1pZFtpIC0gMV0gKyBzaWRlW2kgLSAxXSArIHcwICogcDAsIC0xLjAsIDEuMCk7CisgICAgICAgIHJbaV0gPSBhdl9jbGlwZigoMSAtIHcxKSAqIG1pZFtpIC0gMV0gLSBzaWRlW2kgLSAxXSAtIHcwICogcDAsIC0xLjAsIDEuMCk7CisgICAgfQorCisgICAgbWVtY3B5KHMtPnByZXZfc3RlcmVvX3dlaWdodHMsIHMtPnN0ZXJlb193ZWlnaHRzLCBzaXplb2Yocy0+c3RlcmVvX3dlaWdodHMpKTsKK30KKworc3RhdGljIHZvaWQgc2lsa19mbHVzaF9mcmFtZShTaWxrRnJhbWUgKmZyYW1lKQoreworICAgIGlmICghZnJhbWUtPmNvZGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBtZW1zZXQoZnJhbWUtPm91dHB1dCwgICAgICAwLCBzaXplb2YoZnJhbWUtPm91dHB1dCkpOworICAgIG1lbXNldChmcmFtZS0+bHBjX2hpc3RvcnksIDAsIHNpemVvZihmcmFtZS0+bHBjX2hpc3RvcnkpKTsKKworICAgIG1lbXNldChmcmFtZS0+bHBjLCAgMCwgc2l6ZW9mKGZyYW1lLT5scGMpKTsKKyAgICBtZW1zZXQoZnJhbWUtPm5sc2YsIDAsIHNpemVvZihmcmFtZS0+bmxzZikpOworCisgICAgZnJhbWUtPmxvZ19nYWluID0gMDsKKworICAgIGZyYW1lLT5wcmltYXJ5bGFnICA9IDA7CisgICAgZnJhbWUtPnByZXZfdm9pY2VkID0gMDsKKyAgICBmcmFtZS0+Y29kZWQgICAgICAgPSAwOworfQorCitpbnQgZmZfc2lsa19kZWNvZGVfc3VwZXJmcmFtZShTaWxrQ29udGV4dCAqcywgT3B1c1JhbmdlQ29kZXIgKnJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm91dHB1dFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gT3B1c0JhbmR3aWR0aCBiYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kZWRfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb25fbXMpCit7CisgICAgaW50IGFjdGl2ZVsyXVs2XSwgcmVkdW5kYW5jeVsyXTsKKyAgICBpbnQgbmJfZnJhbWVzLCBpLCBqOworCisgICAgaWYgKGJhbmR3aWR0aCA+IE9QVVNfQkFORFdJRFRIX1dJREVCQU5EIHx8CisgICAgICAgIGNvZGVkX2NoYW5uZWxzID4gMiB8fCBkdXJhdGlvbl9tcyA+IDYwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZCAiCisgICAgICAgICAgICAgICAidG8gdGhlIFNJTEsgZGVjb2Rlci5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG5iX2ZyYW1lcyA9IDEgKyAoZHVyYXRpb25fbXMgPiAyMCkgKyAoZHVyYXRpb25fbXMgPiA0MCk7CisgICAgcy0+c3ViZnJhbWVzID0gZHVyYXRpb25fbXMgLyBuYl9mcmFtZXMgLyA1OyAgICAgICAgIC8vIDVtcyBzdWJmcmFtZXMKKyAgICBzLT5zZmxlbmd0aCAgPSAyMCAqIChiYW5kd2lkdGggKyAyKTsKKyAgICBzLT5mbGVuZ3RoICAgPSBzLT5zZmxlbmd0aCAqIHMtPnN1YmZyYW1lczsKKyAgICBzLT5iYW5kd2lkdGggPSBiYW5kd2lkdGg7CisgICAgcy0+d2IgICAgICAgID0gYmFuZHdpZHRoID09IE9QVVNfQkFORFdJRFRIX1dJREVCQU5EOworCisgICAgLyogbWFrZSBzdXJlIHRvIGZsdXNoIHRoZSBzaWRlIGNoYW5uZWwgd2hlbiBzd2l0Y2hpbmcgZnJvbSBtb25vIHRvIHN0ZXJlbyAqLworICAgIGlmIChjb2RlZF9jaGFubmVscyA+IHMtPnByZXZfY29kZWRfY2hhbm5lbHMpCisgICAgICAgIHNpbGtfZmx1c2hfZnJhbWUoJnMtPmZyYW1lWzFdKTsKKyAgICBzLT5wcmV2X2NvZGVkX2NoYW5uZWxzID0gY29kZWRfY2hhbm5lbHM7CisKKyAgICAvKiByZWFkIHRoZSBMUC1sYXllciBoZWFkZXIgYml0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjb2RlZF9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuYl9mcmFtZXM7IGorKykKKyAgICAgICAgICAgIGFjdGl2ZVtpXVtqXSA9IG9wdXNfcmNfcDJtb2RlbChyYywgMSk7CisKKyAgICAgICAgcmVkdW5kYW5jeVtpXSA9IG9wdXNfcmNfcDJtb2RlbChyYywgMSk7CisgICAgICAgIGlmIChyZWR1bmRhbmN5W2ldKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkxCUlIgZnJhbWVzIHByZXNlbnQ7IHRoaXMgaXMgdW5zdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5iX2ZyYW1lczsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlZF9jaGFubmVscyAmJiAhcy0+bWlkb25seTsgaisrKQorICAgICAgICAgICAgc2lsa19kZWNvZGVfZnJhbWUocywgcmMsIGksIGosIGNvZGVkX2NoYW5uZWxzLCBhY3RpdmVbal1baV0sIGFjdGl2ZVsxXVtpXSk7CisKKyAgICAgICAgLyogcmVzZXQgdGhlIHNpZGUgY2hhbm5lbCBpZiBpdCBpcyBub3QgY29kZWQgKi8KKyAgICAgICAgaWYgKHMtPm1pZG9ubHkgJiYgcy0+ZnJhbWVbMV0uY29kZWQpCisgICAgICAgICAgICBzaWxrX2ZsdXNoX2ZyYW1lKCZzLT5mcmFtZVsxXSk7CisKKyAgICAgICAgaWYgKGNvZGVkX2NoYW5uZWxzID09IDEgfHwgcy0+b3V0cHV0X2NoYW5uZWxzID09IDEpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5vdXRwdXRfY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgICAgIG1lbWNweShvdXRwdXRbal0gKyBpICogcy0+Zmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWVbMF0ub3V0cHV0ICsgU0lMS19ISVNUT1JZIC0gcy0+Zmxlbmd0aCAtIDIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmZsZW5ndGggKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpbGtfdW5taXhfbXMocywgb3V0cHV0WzBdICsgaSAqIHMtPmZsZW5ndGgsIG91dHB1dFsxXSArIGkgKiBzLT5mbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPm1pZG9ubHkgICAgICAgID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gbmJfZnJhbWVzICogcy0+Zmxlbmd0aDsKK30KKwordm9pZCBmZl9zaWxrX2ZyZWUoU2lsa0NvbnRleHQgKipwcykKK3sKKyAgICBhdl9mcmVlcChwcyk7Cit9CisKK3ZvaWQgZmZfc2lsa19mbHVzaChTaWxrQ29udGV4dCAqcykKK3sKKyAgICBzaWxrX2ZsdXNoX2ZyYW1lKCZzLT5mcmFtZVswXSk7CisgICAgc2lsa19mbHVzaF9mcmFtZSgmcy0+ZnJhbWVbMV0pOworCisgICAgbWVtc2V0KHMtPnByZXZfc3RlcmVvX3dlaWdodHMsIDAsIHNpemVvZihzLT5wcmV2X3N0ZXJlb193ZWlnaHRzKSk7Cit9CisKK2ludCBmZl9zaWxrX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBTaWxrQ29udGV4dCAqKnBzLCBpbnQgb3V0cHV0X2NoYW5uZWxzKQoreworICAgIFNpbGtDb250ZXh0ICpzOworCisgICAgaWYgKG91dHB1dF9jaGFubmVscyAhPSAxICYmIG91dHB1dF9jaGFubmVscyAhPSAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzOiAlZFxuIiwKKyAgICAgICAgICAgICAgIG91dHB1dF9jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzKSk7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+YXZjdHggICAgICAgICAgID0gYXZjdHg7CisgICAgcy0+b3V0cHV0X2NoYW5uZWxzID0gb3V0cHV0X2NoYW5uZWxzOworCisgICAgZmZfc2lsa19mbHVzaChzKTsKKworICAgICpwcyA9IHM7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL29wdXNkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL29wdXNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTllYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvb3B1c2RlYy5jCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICogT3B1cyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQW5kcmV3IEQnQWRkZXNpbworICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgTW96aWxsYSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBPcHVzIGRlY29kZXIKKyAqIEBhdXRob3IgQW5kcmV3IEQnQWRkZXNpbywgQW50b24gS2hpcm5vdgorICoKKyAqIENvZGVjIGhvbWVwYWdlOiBodHRwOi8vb3B1cy1jb2RlYy5vcmcvCisgKiBTcGVjaWZpY2F0aW9uOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NzE2CisgKiBPZ2cgT3B1cyBzcGVjaWZpY2F0aW9uOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1jb2RlYy1vZ2dvcHVzLTAzCisgKgorICogT2dnLWNvbnRhaW5lZCAub3B1cyBmaWxlcyBjYW4gYmUgcHJvZHVjZWQgd2l0aCBvcHVzLXRvb2xzOgorICogaHR0cDovL2dpdC54aXBoLm9yZy8/cD1vcHVzLXRvb2xzLmdpdAorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F1ZGlvX2ZpZm8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJjZWxwX2ZpbHRlcnMuaCIKKyNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgIm9wdXMuaCIKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfZnJhbWVfZHVyYXRpb25fbXNbMTZdID0geworICAgIDEwLCAyMCwgNDAsIDYwLAorICAgIDEwLCAyMCwgNDAsIDYwLAorICAgIDEwLCAyMCwgNDAsIDYwLAorICAgIDEwLCAyMCwKKyAgICAxMCwgMjAsCit9OworCisvKiBudW1iZXIgb2Ygc2FtcGxlcyBvZiBzaWxlbmNlIHRvIGZlZWQgdG8gdGhlIHJlc2FtcGxlcgorICogYXQgdGhlIGJlZ2lubmluZyAqLworc3RhdGljIGNvbnN0IGludCBzaWxrX3Jlc2FtcGxlX2RlbGF5W10gPSB7CisgICAgNCwgOCwgMTEsIDExLCAxMQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2VsdF9iYW5kX2VuZFtdID0geyAxMywgMTcsIDE3LCAxOSwgMjEgfTsKKworc3RhdGljIGludCBnZXRfc2lsa19zYW1wbGVyYXRlKGludCBjb25maWcpCit7CisgICAgaWYgKGNvbmZpZyA8IDQpCisgICAgICAgIHJldHVybiA4MDAwOworICAgIGVsc2UgaWYgKGNvbmZpZyA8IDgpCisgICAgICAgIHJldHVybiAxMjAwMDsKKyAgICByZXR1cm4gMTYwMDA7Cit9CisKKy8qKgorICogUmFuZ2UgZGVjb2RlcgorICovCitzdGF0aWMgaW50IG9wdXNfcmNfaW5pdChPcHVzUmFuZ2VDb2RlciAqcmMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKQoreworICAgIGludCByZXQgPSBpbml0X2dldF9iaXRzOCgmcmMtPmdiLCBkYXRhLCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJjLT5yYW5nZSA9IDEyODsKKyAgICByYy0+dmFsdWUgPSAxMjcgLSBnZXRfYml0cygmcmMtPmdiLCA3KTsKKyAgICByYy0+dG90YWxfcmVhZF9iaXRzID0gOTsKKyAgICBvcHVzX3JjX25vcm1hbGl6ZShyYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb3B1c19yYXdfaW5pdChPcHVzUmFuZ2VDb2RlciAqcmMsIGNvbnN0IHVpbnQ4X3QgKnJpZ2h0ZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMpCit7CisgICAgcmMtPnJiLnBvc2l0aW9uID0gcmlnaHRlbmQ7CisgICAgcmMtPnJiLmJ5dGVzICAgID0gYnl0ZXM7CisgICAgcmMtPnJiLmNhY2hlbGVuID0gMDsKKyAgICByYy0+cmIuY2FjaGV2YWwgPSAwOworfQorCitzdGF0aWMgdm9pZCBvcHVzX2ZhZGUoZmxvYXQgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW4xLCBjb25zdCBmbG9hdCAqaW4yLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICp3aW5kb3csIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICBvdXRbaV0gPSBpbjJbaV0gKiB3aW5kb3dbaV0gKyBpbjFbaV0gKiAoMS4wIC0gd2luZG93W2ldKTsKK30KKworc3RhdGljIGludCBvcHVzX2ZsdXNoX3Jlc2FtcGxlKE9wdXNTdHJlYW1Db250ZXh0ICpzLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgY2VsdF9zaXplID0gYXZfYXVkaW9fZmlmb19zaXplKHMtPmNlbHRfZGVsYXkpOworICAgIGludCByZXQsIGk7CisgICAgcmV0ID0gc3dyX2NvbnZlcnQocy0+c3dyLAorICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90Kiopcy0+b3V0LCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGVsc2UgaWYgKHJldCAhPSBuYl9zYW1wbGVzKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiV3JvbmcgbnVtYmVyIG9mIGZsdXNoZWQgc2FtcGxlczogJWRcbiIsCisgICAgICAgICAgICAgICByZXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgfQorCisgICAgaWYgKGNlbHRfc2l6ZSkgeworICAgICAgICBpZiAoY2VsdF9zaXplICE9IG5iX3NhbXBsZXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiV3JvbmcgbnVtYmVyIG9mIENFTFQgZGVsYXkgc2FtcGxlcy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgICAgICB9CisgICAgICAgIGF2X2F1ZGlvX2ZpZm9fcmVhZChzLT5jZWx0X2RlbGF5LCAodm9pZCoqKXMtPmNlbHRfb3V0cHV0LCBuYl9zYW1wbGVzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm91dHB1dF9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm1hY19zY2FsYXIocy0+b3V0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNlbHRfb3V0cHV0W2ldLCAxLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfc2FtcGxlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+cmVkdW5kYW5jeV9pZHgpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm91dHB1dF9jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgb3B1c19mYWRlKHMtPm91dFtpXSwgcy0+b3V0W2ldLAorICAgICAgICAgICAgICAgICAgICAgIHMtPnJlZHVuZGFuY3lfb3V0cHV0W2ldICsgMTIwICsgcy0+cmVkdW5kYW5jeV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgZmZfY2VsdF93aW5kb3cyICsgcy0+cmVkdW5kYW5jeV9pZHgsIDEyMCAtIHMtPnJlZHVuZGFuY3lfaWR4KTsKKyAgICAgICAgcy0+cmVkdW5kYW5jeV9pZHggPSAwOworICAgIH0KKworICAgIHMtPm91dFswXSAgICs9IG5iX3NhbXBsZXM7CisgICAgcy0+b3V0WzFdICAgKz0gbmJfc2FtcGxlczsKKyAgICBzLT5vdXRfc2l6ZSAtPSBuYl9zYW1wbGVzICogc2l6ZW9mKGZsb2F0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wdXNfaW5pdF9yZXNhbXBsZShPcHVzU3RyZWFtQ29udGV4dCAqcykKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZGVsYXlbMTZdID0geyAwLjAgfTsKKyAgICBjb25zdCB1aW50OF90ICpkZWxheXB0clsyXSA9IHsgKHVpbnQ4X3QqKWRlbGF5LCAodWludDhfdCopZGVsYXkgfTsKKyAgICBpbnQgcmV0OworCisgICAgYXZfb3B0X3NldF9pbnQocy0+c3dyLCAiaW5fc2FtcGxlX3JhdGUiLCBzLT5zaWxrX3NhbXBsZXJhdGUsIDApOworICAgIHJldCA9IHN3cl9pbml0KHMtPnN3cik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBvcGVuaW5nIHRoZSByZXNhbXBsZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBzd3JfY29udmVydChzLT5zd3IsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBkZWxheXB0ciwgc2lsa19yZXNhbXBsZV9kZWxheVtzLT5wYWNrZXQuYmFuZHdpZHRoXSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRXJyb3IgZmVlZGluZyBpbml0aWFsIHNpbGVuY2UgdG8gdGhlIHJlc2FtcGxlci5cbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wdXNfZGVjb2RlX3JlZHVuZGFuY3koT3B1c1N0cmVhbUNvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKQoreworICAgIGludCByZXQ7CisgICAgZW51bSBPcHVzQmFuZHdpZHRoIGJ3ID0gcy0+cGFja2V0LmJhbmR3aWR0aDsKKworICAgIGlmIChzLT5wYWNrZXQubW9kZSA9PSBPUFVTX01PREVfU0lMSyAmJgorICAgICAgICBidyA9PSBPUFVTX0JBTkRXSURUSF9NRURJVU1CQU5EKQorICAgICAgICBidyA9IE9QVVNfQkFORFdJRFRIX1dJREVCQU5EOworCisgICAgcmV0ID0gb3B1c19yY19pbml0KCZzLT5yZWR1bmRhbmN5X3JjLCBkYXRhLCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIG9wdXNfcmF3X2luaXQoJnMtPnJlZHVuZGFuY3lfcmMsIGRhdGEgKyBzaXplLCBzaXplKTsKKworICAgIHJldCA9IGZmX2NlbHRfZGVjb2RlX2ZyYW1lKHMtPmNlbHQsICZzLT5yZWR1bmRhbmN5X3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlZHVuZGFuY3lfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBhY2tldC5zdGVyZW8gKyAxLCAyNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgY2VsdF9iYW5kX2VuZFtzLT5wYWNrZXQuYmFuZHdpZHRoXSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGRlY29kaW5nIHRoZSByZWR1bmRhbmN5IGZyYW1lLlxuIik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvcHVzX2RlY29kZV9mcmFtZShPcHVzU3RyZWFtQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IHNpemUpCit7CisgICAgaW50IHNhbXBsZXMgICAgPSBzLT5wYWNrZXQuZnJhbWVfZHVyYXRpb247CisgICAgaW50IHJlZHVuZGFuY3kgPSAwOworICAgIGludCByZWR1bmRhbmN5X3NpemUsIHJlZHVuZGFuY3lfcG9zOworICAgIGludCByZXQsIGksIGNvbnN1bWVkOworICAgIGludCBkZWxheWVkX3NhbXBsZXMgPSBzLT5kZWxheWVkX3NhbXBsZXM7CisKKyAgICByZXQgPSBvcHVzX3JjX2luaXQoJnMtPnJjLCBkYXRhLCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGRlY29kZSB0aGUgc2lsayBmcmFtZSAqLworICAgIGlmIChzLT5wYWNrZXQubW9kZSA9PSBPUFVTX01PREVfU0lMSyB8fCBzLT5wYWNrZXQubW9kZSA9PSBPUFVTX01PREVfSFlCUklEKSB7CisgICAgICAgIGlmICghc3dyX2lzX2luaXRpYWxpemVkKHMtPnN3cikpIHsKKyAgICAgICAgICAgIHJldCA9IG9wdXNfaW5pdF9yZXNhbXBsZShzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBzYW1wbGVzID0gZmZfc2lsa19kZWNvZGVfc3VwZXJmcmFtZShzLT5zaWxrLCAmcy0+cmMsIHMtPnNpbGtfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihzLT5wYWNrZXQuYmFuZHdpZHRoLCBPUFVTX0JBTkRXSURUSF9XSURFQkFORCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBhY2tldC5zdGVyZW8gKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxrX2ZyYW1lX2R1cmF0aW9uX21zW3MtPnBhY2tldC5jb25maWddKTsKKyAgICAgICAgaWYgKHNhbXBsZXMgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGRlY29kaW5nIGEgU0lMSyBmcmFtZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHNhbXBsZXM7CisgICAgICAgIH0KKyAgICAgICAgc2FtcGxlcyA9IHN3cl9jb252ZXJ0KHMtPnN3ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90Kiopcy0+b3V0LCBzLT5wYWNrZXQuZnJhbWVfZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCoqKXMtPnNpbGtfb3V0cHV0LCBzYW1wbGVzKTsKKyAgICAgICAgaWYgKHNhbXBsZXMgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHJlc2FtcGxpbmcgU0lMSyBkYXRhLlxuIik7CisgICAgICAgICAgICByZXR1cm4gc2FtcGxlczsKKyAgICAgICAgfQorICAgICAgICBhdl9hc3NlcnQyKChzYW1wbGVzICYgNykgPT0gMCk7CisgICAgICAgIHMtPmRlbGF5ZWRfc2FtcGxlcyArPSBzLT5wYWNrZXQuZnJhbWVfZHVyYXRpb24gLSBzYW1wbGVzOworICAgIH0gZWxzZQorICAgICAgICBmZl9zaWxrX2ZsdXNoKHMtPnNpbGspOworCisgICAgLy8gZGVjb2RlIHJlZHVuZGFuY3kgaW5mb3JtYXRpb24KKyAgICBjb25zdW1lZCA9IG9wdXNfcmNfdGVsbCgmcy0+cmMpOworICAgIGlmIChzLT5wYWNrZXQubW9kZSA9PSBPUFVTX01PREVfSFlCUklEICYmIGNvbnN1bWVkICsgMzcgPD0gc2l6ZSAqIDgpCisgICAgICAgIHJlZHVuZGFuY3kgPSBvcHVzX3JjX3AybW9kZWwoJnMtPnJjLCAxMik7CisgICAgZWxzZSBpZiAocy0+cGFja2V0Lm1vZGUgPT0gT1BVU19NT0RFX1NJTEsgJiYgY29uc3VtZWQgKyAxNyA8PSBzaXplICogOCkKKyAgICAgICAgcmVkdW5kYW5jeSA9IDE7CisKKyAgICBpZiAocmVkdW5kYW5jeSkgeworICAgICAgICByZWR1bmRhbmN5X3BvcyA9IG9wdXNfcmNfcDJtb2RlbCgmcy0+cmMsIDEpOworCisgICAgICAgIGlmIChzLT5wYWNrZXQubW9kZSA9PSBPUFVTX01PREVfSFlCUklEKQorICAgICAgICAgICAgcmVkdW5kYW5jeV9zaXplID0gb3B1c19yY191bmltb2RlbCgmcy0+cmMsIDI1NikgKyAyOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZWR1bmRhbmN5X3NpemUgPSBzaXplIC0gKGNvbnN1bWVkICsgNykgLyA4OworICAgICAgICBzaXplIC09IHJlZHVuZGFuY3lfc2l6ZTsKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcmVkdW5kYW5jeSBmcmFtZSBzaXplLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWR1bmRhbmN5X3BvcykgeworICAgICAgICAgICAgcmV0ID0gb3B1c19kZWNvZGVfcmVkdW5kYW5jeShzLCBkYXRhICsgc2l6ZSwgcmVkdW5kYW5jeV9zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBmZl9jZWx0X2ZsdXNoKHMtPmNlbHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZGVjb2RlIHRoZSBDRUxUIGZyYW1lICovCisgICAgaWYgKHMtPnBhY2tldC5tb2RlID09IE9QVVNfTU9ERV9DRUxUIHx8IHMtPnBhY2tldC5tb2RlID09IE9QVVNfTU9ERV9IWUJSSUQpIHsKKyAgICAgICAgZmxvYXQgKm91dF90bXBbMl0gPSB7IHMtPm91dFswXSwgcy0+b3V0WzFdIH07CisgICAgICAgIGZsb2F0ICoqZHN0ID0gKHMtPnBhY2tldC5tb2RlID09IE9QVVNfTU9ERV9DRUxUKSA/CisgICAgICAgICAgICAgICAgICAgICAgb3V0X3RtcCA6IHMtPmNlbHRfb3V0cHV0OworICAgICAgICBpbnQgY2VsdF9vdXRwdXRfc2FtcGxlcyA9IHNhbXBsZXM7CisgICAgICAgIGludCBkZWxheV9zYW1wbGVzID0gYXZfYXVkaW9fZmlmb19zaXplKHMtPmNlbHRfZGVsYXkpOworCisgICAgICAgIGlmIChkZWxheV9zYW1wbGVzKSB7CisgICAgICAgICAgICBpZiAocy0+cGFja2V0Lm1vZGUgPT0gT1BVU19NT0RFX0hZQlJJRCkgeworICAgICAgICAgICAgICAgIGF2X2F1ZGlvX2ZpZm9fcmVhZChzLT5jZWx0X2RlbGF5LCAodm9pZCoqKXMtPmNlbHRfb3V0cHV0LCBkZWxheV9zYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5vdXRwdXRfY2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm1hY19zY2FsYXIob3V0X3RtcFtpXSwgcy0+Y2VsdF9vdXRwdXRbaV0sIDEuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X3NhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBvdXRfdG1wW2ldICs9IGRlbGF5X3NhbXBsZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNlbHRfb3V0cHV0X3NhbXBsZXMgLT0gZGVsYXlfc2FtcGxlczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIlNwdXJpb3VzIENFTFQgZGVsYXkgc2FtcGxlcyBwcmVzZW50LlxuIik7CisgICAgICAgICAgICAgICAgYXZfYXVkaW9fZmlmb19kcmFpbihzLT5jZWx0X2RlbGF5LCBkZWxheV9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9wdXNfcmF3X2luaXQoJnMtPnJjLCBkYXRhICsgc2l6ZSwgc2l6ZSk7CisKKyAgICAgICAgcmV0ID0gZmZfY2VsdF9kZWNvZGVfZnJhbWUocy0+Y2VsdCwgJnMtPnJjLCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBhY2tldC5zdGVyZW8gKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wYWNrZXQuZnJhbWVfZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5wYWNrZXQubW9kZSA9PSBPUFVTX01PREVfSFlCUklEKSA/IDE3IDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsdF9iYW5kX2VuZFtzLT5wYWNrZXQuYmFuZHdpZHRoXSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAocy0+cGFja2V0Lm1vZGUgPT0gT1BVU19NT0RFX0hZQlJJRCkgeworICAgICAgICAgICAgaW50IGNlbHRfZGVsYXkgPSBzLT5wYWNrZXQuZnJhbWVfZHVyYXRpb24gLSBjZWx0X291dHB1dF9zYW1wbGVzOworICAgICAgICAgICAgdm9pZCAqZGVsYXlidWZbMl0gPSB7IHMtPmNlbHRfb3V0cHV0WzBdICsgY2VsdF9vdXRwdXRfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jZWx0X291dHB1dFsxXSArIGNlbHRfb3V0cHV0X3NhbXBsZXMgfTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm91dHB1dF9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtYWNfc2NhbGFyKG91dF90bXBbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNlbHRfb3V0cHV0W2ldLCAxLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbHRfb3V0cHV0X3NhbXBsZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBhdl9hdWRpb19maWZvX3dyaXRlKHMtPmNlbHRfZGVsYXksIGRlbGF5YnVmLCBjZWx0X2RlbGF5KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgZmZfY2VsdF9mbHVzaChzLT5jZWx0KTsKKworICAgIGlmIChzLT5yZWR1bmRhbmN5X2lkeCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+b3V0cHV0X2NoYW5uZWxzOyBpKyspCisgICAgICAgICAgICBvcHVzX2ZhZGUocy0+b3V0W2ldLCBzLT5vdXRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgcy0+cmVkdW5kYW5jeV9vdXRwdXRbaV0gKyAxMjAgKyBzLT5yZWR1bmRhbmN5X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICBmZl9jZWx0X3dpbmRvdzIgKyBzLT5yZWR1bmRhbmN5X2lkeCwgMTIwIC0gcy0+cmVkdW5kYW5jeV9pZHgpOworICAgICAgICBzLT5yZWR1bmRhbmN5X2lkeCA9IDA7CisgICAgfQorICAgIGlmIChyZWR1bmRhbmN5KSB7CisgICAgICAgIGlmICghcmVkdW5kYW5jeV9wb3MpIHsKKyAgICAgICAgICAgIGZmX2NlbHRfZmx1c2gocy0+Y2VsdCk7CisgICAgICAgICAgICByZXQgPSBvcHVzX2RlY29kZV9yZWR1bmRhbmN5KHMsIGRhdGEgKyBzaXplLCByZWR1bmRhbmN5X3NpemUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm91dHB1dF9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgb3B1c19mYWRlKHMtPm91dFtpXSArIHNhbXBsZXMgLSAxMjAgKyBkZWxheWVkX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dFtpXSArIHNhbXBsZXMgLSAxMjAgKyBkZWxheWVkX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlZHVuZGFuY3lfb3V0cHV0W2ldICsgMTIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9jZWx0X3dpbmRvdzIsIDEyMCAtIGRlbGF5ZWRfc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgaWYgKGRlbGF5ZWRfc2FtcGxlcykKKyAgICAgICAgICAgICAgICAgICAgcy0+cmVkdW5kYW5jeV9pZHggPSAxMjAgLSBkZWxheWVkX3NhbXBsZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+b3V0cHV0X2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+b3V0W2ldICsgZGVsYXllZF9zYW1wbGVzLCBzLT5yZWR1bmRhbmN5X291dHB1dFtpXSwgMTIwICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgICAgICAgICAgb3B1c19mYWRlKHMtPm91dFtpXSArIDEyMCArIGRlbGF5ZWRfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVkdW5kYW5jeV9vdXRwdXRbaV0gKyAxMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dFtpXSArIDEyMCArIGRlbGF5ZWRfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfY2VsdF93aW5kb3cyLCAxMjApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNhbXBsZXM7Cit9CisKK3N0YXRpYyBpbnQgb3B1c19kZWNvZGVfc3VicGFja2V0KE9wdXNTdHJlYW1Db250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgb3V0cHV0X3NhbXBsZXMgPSAwOworICAgIGludCBmbHVzaF9uZWVkZWQgICA9IDA7CisgICAgaW50IGksIGosIHJldDsKKworICAgIC8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gZmx1c2ggdGhlIHJlc2FtcGxlciAqLworICAgIGlmIChzd3JfaXNfaW5pdGlhbGl6ZWQocy0+c3dyKSkgeworICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICBpbnQ2NF90IGN1cl9zYW1wbGVyYXRlOworICAgICAgICAgICAgYXZfb3B0X2dldF9pbnQocy0+c3dyLCAiaW5fc2FtcGxlX3JhdGUiLCAwLCAmY3VyX3NhbXBsZXJhdGUpOworICAgICAgICAgICAgZmx1c2hfbmVlZGVkID0gKHMtPnBhY2tldC5tb2RlID09IE9QVVNfTU9ERV9DRUxUKSB8fCAoY3VyX3NhbXBsZXJhdGUgIT0gcy0+c2lsa19zYW1wbGVyYXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsdXNoX25lZWRlZCA9ICEhcy0+ZGVsYXllZF9zYW1wbGVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFidWYgJiYgIWZsdXNoX25lZWRlZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiB1c2UgZHVtbXkgb3V0cHV0IGJ1ZmZlcnMgaWYgdGhlIGNoYW5uZWwgaXMgbm90IG1hcHBlZCB0byBhbnl0aGluZyAqLworICAgIGlmICghcy0+b3V0WzBdIHx8CisgICAgICAgIChzLT5vdXRwdXRfY2hhbm5lbHMgPT0gMiAmJiAhcy0+b3V0WzFdKSkgeworICAgICAgICBhdl9mYXN0X21hbGxvYygmcy0+b3V0X2R1bW15LCAmcy0+b3V0X2R1bW15X2FsbG9jYXRlZF9zaXplLCBzLT5vdXRfc2l6ZSk7CisgICAgICAgIGlmICghcy0+b3V0X2R1bW15KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKCFzLT5vdXRbMF0pCisgICAgICAgICAgICBzLT5vdXRbMF0gPSBzLT5vdXRfZHVtbXk7CisgICAgICAgIGlmICghcy0+b3V0WzFdKQorICAgICAgICAgICAgcy0+b3V0WzFdID0gcy0+b3V0X2R1bW15OworICAgIH0KKworICAgIC8qIGZsdXNoIHRoZSByZXNhbXBsZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKGZsdXNoX25lZWRlZCkgeworICAgICAgICByZXQgPSBvcHVzX2ZsdXNoX3Jlc2FtcGxlKHMsIHMtPmRlbGF5ZWRfc2FtcGxlcyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGZsdXNoaW5nIHRoZSByZXNhbXBsZXIuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgc3dyX2Nsb3NlKHMtPnN3cik7CisgICAgICAgIG91dHB1dF9zYW1wbGVzICs9IHMtPmRlbGF5ZWRfc2FtcGxlczsKKyAgICAgICAgcy0+ZGVsYXllZF9zYW1wbGVzID0gMDsKKworICAgICAgICBpZiAoIWJ1ZikKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAgIC8qIGRlY29kZSBhbGwgdGhlIGZyYW1lcyBpbiB0aGUgcGFja2V0ICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPnBhY2tldC5mcmFtZV9jb3VudDsgaSsrKSB7CisgICAgICAgIGludCBzaXplID0gcy0+cGFja2V0LmZyYW1lX3NpemVbaV07CisgICAgICAgIGludCBzYW1wbGVzID0gb3B1c19kZWNvZGVfZnJhbWUocywgYnVmICsgcy0+cGFja2V0LmZyYW1lX29mZnNldFtpXSwgc2l6ZSk7CisKKyAgICAgICAgaWYgKHNhbXBsZXMgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGRlY29kaW5nIGFuIE9wdXMgZnJhbWUuXG4iKTsKKyAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FtcGxlczsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPm91dHB1dF9jaGFubmVsczsgaisrKQorICAgICAgICAgICAgICAgIG1lbXNldChzLT5vdXRbal0sIDAsIHMtPnBhY2tldC5mcmFtZV9kdXJhdGlvbiAqIHNpemVvZihmbG9hdCkpOworICAgICAgICAgICAgc2FtcGxlcyA9IHMtPnBhY2tldC5mcmFtZV9kdXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRfc2FtcGxlcyArPSBzYW1wbGVzOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5vdXRwdXRfY2hhbm5lbHM7IGorKykKKyAgICAgICAgICAgIHMtPm91dFtqXSArPSBzYW1wbGVzOworICAgICAgICBzLT5vdXRfc2l6ZSAtPSBzYW1wbGVzICogc2l6ZW9mKGZsb2F0KTsKKyAgICB9CisKK2ZpbmlzaDoKKyAgICBzLT5vdXRbMF0gPSBzLT5vdXRbMV0gPSBOVUxMOworICAgIHMtPm91dF9zaXplID0gMDsKKworICAgIHJldHVybiBvdXRwdXRfc2FtcGxlczsKK30KKworc3RhdGljIGludCBvcHVzX2RlY29kZV9wYWNrZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgT3B1c0NvbnRleHQgKmMgICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgICA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmICA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBpbnQgY29kZWRfc2FtcGxlcyAgID0gMDsKKyAgICBpbnQgZGVjb2RlZF9zYW1wbGVzID0gMDsKKyAgICBpbnQgaSwgcmV0OworCisgICAgLyogZGVjb2RlIHRoZSBoZWFkZXIgb2YgdGhlIGZpcnN0IHN1Yi1wYWNrZXQgdG8gZmluZCBvdXQgdGhlIHNhbXBsZSBjb3VudCAqLworICAgIGlmIChidWYpIHsKKyAgICAgICAgT3B1c1BhY2tldCAqcGt0ID0gJmMtPnN0cmVhbXNbMF0ucGFja2V0OworICAgICAgICByZXQgPSBmZl9vcHVzX3BhcnNlX3BhY2tldChwa3QsIGJ1ZiwgYnVmX3NpemUsIGMtPm5iX3N0cmVhbXMgPiAxKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyB0aGUgcGFja2V0IGhlYWRlci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBjb2RlZF9zYW1wbGVzICs9IHBrdC0+ZnJhbWVfY291bnQgKiBwa3QtPmZyYW1lX2R1cmF0aW9uOworICAgICAgICBjLT5zdHJlYW1zWzBdLnNpbGtfc2FtcGxlcmF0ZSA9IGdldF9zaWxrX3NhbXBsZXJhdGUocGt0LT5jb25maWcpOworICAgIH0KKworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gY29kZWRfc2FtcGxlcyArIGMtPnN0cmVhbXNbMF0uZGVsYXllZF9zYW1wbGVzOworCisgICAgLyogbm8gaW5wdXQgb3IgYnVmZmVyZWQgZGF0YSA9PiBub3RoaW5nIHRvIGRvICovCisgICAgaWYgKCFmcmFtZS0+bmJfc2FtcGxlcykgeworICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIHNldHVwIHRoZSBkYXRhIGJ1ZmZlcnMgKi8KKyAgICByZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJnZXRfYnVmZmVyKCkgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgIENoYW5uZWxNYXAgKm1hcCA9ICZjLT5jaGFubmVsX21hcHNbaV07CisgICAgICAgIGlmICghbWFwLT5jb3B5KQorICAgICAgICAgICAgYy0+c3RyZWFtc1ttYXAtPnN0cmVhbV9pZHhdLm91dFttYXAtPmNoYW5uZWxfaWR4XSA9IChmbG9hdCopZnJhbWUtPmV4dGVuZGVkX2RhdGFbaV07CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGMtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgYy0+c3RyZWFtc1tpXS5vdXRfc2l6ZSA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKworICAgIC8qIGRlY29kZSBlYWNoIHN1Yi1wYWNrZXQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIE9wdXNTdHJlYW1Db250ZXh0ICpzID0gJmMtPnN0cmVhbXNbaV07CisKKyAgICAgICAgaWYgKGkgJiYgYnVmKSB7CisgICAgICAgICAgICByZXQgPSBmZl9vcHVzX3BhcnNlX3BhY2tldCgmcy0+cGFja2V0LCBidWYsIGJ1Zl9zaXplLCBpICE9IGMtPm5iX3N0cmVhbXMgLSAxKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIHRoZSBwYWNrZXQgaGVhZGVyLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2RlZF9zYW1wbGVzICE9IHMtPnBhY2tldC5mcmFtZV9jb3VudCAqIHMtPnBhY2tldC5mcmFtZV9kdXJhdGlvbikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiTWlzbWF0Y2hpbmcgY29kZWQgc2FtcGxlIGNvdW50IGluIHN1YnN0cmVhbSAlZC5cbiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5zaWxrX3NhbXBsZXJhdGUgPSBnZXRfc2lsa19zYW1wbGVyYXRlKHMtPnBhY2tldC5jb25maWcpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gb3B1c19kZWNvZGVfc3VicGFja2V0KCZjLT5zdHJlYW1zW2ldLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wYWNrZXQuZGF0YV9zaXplLCBjb2RlZF9zYW1wbGVzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoZGVjb2RlZF9zYW1wbGVzICYmIHJldCAhPSBkZWNvZGVkX3NhbXBsZXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGlmZmVyZW50IG51bWJlcnMgb2YgZGVjb2RlZCBzYW1wbGVzICIKKyAgICAgICAgICAgICAgICAgICAiaW4gYSBtdWx0aS1jaGFubmVsIHN0cmVhbVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBkZWNvZGVkX3NhbXBsZXMgPSByZXQ7CisgICAgICAgIGJ1ZiAgICAgICs9IHMtPnBhY2tldC5wYWNrZXRfc2l6ZTsKKyAgICAgICAgYnVmX3NpemUgLT0gcy0+cGFja2V0LnBhY2tldF9zaXplOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICBDaGFubmVsTWFwICptYXAgPSAmYy0+Y2hhbm5lbF9tYXBzW2ldOworCisgICAgICAgIC8qIGhhbmRsZSBjb3BpZWQgY2hhbm5lbHMgKi8KKyAgICAgICAgaWYgKG1hcC0+Y29weSkgeworICAgICAgICAgICAgbWVtY3B5KGZyYW1lLT5leHRlbmRlZF9kYXRhW2ldLAorICAgICAgICAgICAgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhW21hcC0+Y29weV9pZHhdLAorICAgICAgICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgICAgIH0gZWxzZSBpZiAobWFwLT5zaWxlbmNlKSB7CisgICAgICAgICAgICBtZW1zZXQoZnJhbWUtPmV4dGVuZGVkX2RhdGFbaV0sIDAsIGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYy0+Z2Fpbl9pKSB7CisgICAgICAgICAgICBjLT5mZHNwLT52ZWN0b3JfZm11bF9zY2FsYXIoKGZsb2F0KilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCopZnJhbWUtPmV4dGVuZGVkX2RhdGFbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5nYWluLCBGRkFMSUdOKGRlY29kZWRfc2FtcGxlcywgOCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBkZWNvZGVkX3NhbXBsZXM7CisgICAgKmdvdF9mcmFtZV9wdHIgICAgPSAhIWRlY29kZWRfc2FtcGxlczsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBvcHVzX2RlY29kZV9mbHVzaChBVkNvZGVjQ29udGV4dCAqY3R4KQoreworICAgIE9wdXNDb250ZXh0ICpjID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIE9wdXNTdHJlYW1Db250ZXh0ICpzID0gJmMtPnN0cmVhbXNbaV07CisKKyAgICAgICAgbWVtc2V0KCZzLT5wYWNrZXQsIDAsIHNpemVvZihzLT5wYWNrZXQpKTsKKyAgICAgICAgcy0+ZGVsYXllZF9zYW1wbGVzID0gMDsKKworICAgICAgICBpZiAocy0+Y2VsdF9kZWxheSkKKyAgICAgICAgICAgIGF2X2F1ZGlvX2ZpZm9fZHJhaW4ocy0+Y2VsdF9kZWxheSwgYXZfYXVkaW9fZmlmb19zaXplKHMtPmNlbHRfZGVsYXkpKTsKKyAgICAgICAgc3dyX2Nsb3NlKHMtPnN3cik7CisKKyAgICAgICAgZmZfc2lsa19mbHVzaChzLT5zaWxrKTsKKyAgICAgICAgZmZfY2VsdF9mbHVzaChzLT5jZWx0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBvcHVzX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgT3B1c0NvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBPcHVzU3RyZWFtQ29udGV4dCAqcyA9ICZjLT5zdHJlYW1zW2ldOworCisgICAgICAgIGZmX3NpbGtfZnJlZSgmcy0+c2lsayk7CisgICAgICAgIGZmX2NlbHRfZnJlZSgmcy0+Y2VsdCk7CisKKyAgICAgICAgYXZfZnJlZXAoJnMtPm91dF9kdW1teSk7CisgICAgICAgIHMtPm91dF9kdW1teV9hbGxvY2F0ZWRfc2l6ZSA9IDA7CisKKyAgICAgICAgYXZfYXVkaW9fZmlmb19mcmVlKHMtPmNlbHRfZGVsYXkpOworICAgICAgICBzd3JfZnJlZSgmcy0+c3dyKTsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmYy0+c3RyZWFtcyk7CisgICAgYy0+bmJfc3RyZWFtcyA9IDA7CisKKyAgICBhdl9mcmVlcCgmYy0+Y2hhbm5lbF9tYXBzKTsKKyAgICBhdl9mcmVlcCgmYy0+ZmRzcCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG9wdXNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE9wdXNDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBpLCBqOworCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgID0gQVZfU0FNUExFX0ZNVF9GTFRQOworICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworCisgICAgYy0+ZmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoMCk7CisgICAgaWYgKCFjLT5mZHNwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogZmluZCBvdXQgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLworICAgIHJldCA9IGZmX29wdXNfcGFyc2VfZXh0cmFkYXRhKGF2Y3R4LCBjKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGFsbG9jYXRlIGFuZCBpbml0IGVhY2ggaW5kZXBlbmRlbnQgZGVjb2RlciAqLworICAgIGMtPnN0cmVhbXMgPSBhdl9tYWxsb2N6X2FycmF5KGMtPm5iX3N0cmVhbXMsIHNpemVvZigqYy0+c3RyZWFtcykpOworICAgIGlmICghYy0+c3RyZWFtcykgeworICAgICAgICBjLT5uYl9zdHJlYW1zID0gMDsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBPcHVzU3RyZWFtQ29udGV4dCAqcyA9ICZjLT5zdHJlYW1zW2ldOworICAgICAgICB1aW50NjRfdCBsYXlvdXQ7CisKKyAgICAgICAgcy0+b3V0cHV0X2NoYW5uZWxzID0gKGkgPCBjLT5uYl9zdGVyZW9fc3RyZWFtcykgPyAyIDogMTsKKworICAgICAgICBzLT5hdmN0eCA9IGF2Y3R4OworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5vdXRwdXRfY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgcy0+c2lsa19vdXRwdXRbal0gICAgICAgPSBzLT5zaWxrX2J1ZltqXTsKKyAgICAgICAgICAgIHMtPmNlbHRfb3V0cHV0W2pdICAgICAgID0gcy0+Y2VsdF9idWZbal07CisgICAgICAgICAgICBzLT5yZWR1bmRhbmN5X291dHB1dFtqXSA9IHMtPnJlZHVuZGFuY3lfYnVmW2pdOworICAgICAgICB9CisKKyAgICAgICAgcy0+ZmRzcCA9IGMtPmZkc3A7CisKKyAgICAgICAgcy0+c3dyID1zd3JfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFzLT5zd3IpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgbGF5b3V0ID0gKHMtPm91dHB1dF9jaGFubmVscyA9PSAxKSA/IEFWX0NIX0xBWU9VVF9NT05PIDogQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgYXZfb3B0X3NldF9pbnQocy0+c3dyLCAiaW5fc2FtcGxlX2ZtdCIsICAgICAgYXZjdHgtPnNhbXBsZV9mbXQsICAwKTsKKyAgICAgICAgYXZfb3B0X3NldF9pbnQocy0+c3dyLCAib3V0X3NhbXBsZV9mbXQiLCAgICAgYXZjdHgtPnNhbXBsZV9mbXQsICAwKTsKKyAgICAgICAgYXZfb3B0X3NldF9pbnQocy0+c3dyLCAiaW5fY2hhbm5lbF9sYXlvdXQiLCAgbGF5b3V0LCAgICAgICAgICAgICAwKTsKKyAgICAgICAgYXZfb3B0X3NldF9pbnQocy0+c3dyLCAib3V0X2NoYW5uZWxfbGF5b3V0IiwgbGF5b3V0LCAgICAgICAgICAgICAwKTsKKyAgICAgICAgYXZfb3B0X3NldF9pbnQocy0+c3dyLCAib3V0X3NhbXBsZV9yYXRlIiwgICAgYXZjdHgtPnNhbXBsZV9yYXRlLCAwKTsKKyAgICAgICAgYXZfb3B0X3NldF9pbnQocy0+c3dyLCAiZmlsdGVyX3NpemUiLCAgICAgICAgMTYsICAgICAgICAgICAgICAgICAwKTsKKworICAgICAgICByZXQgPSBmZl9zaWxrX2luaXQoYXZjdHgsICZzLT5zaWxrLCBzLT5vdXRwdXRfY2hhbm5lbHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICByZXQgPSBmZl9jZWx0X2luaXQoYXZjdHgsICZzLT5jZWx0LCBzLT5vdXRwdXRfY2hhbm5lbHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBzLT5jZWx0X2RlbGF5ID0gYXZfYXVkaW9fZmlmb19hbGxvYyhhdmN0eC0+c2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+b3V0cHV0X2NoYW5uZWxzLCAxMDI0KTsKKyAgICAgICAgaWYgKCFzLT5jZWx0X2RlbGF5KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgb3B1c19kZWNvZGVfY2xvc2UoYXZjdHgpOworICAgIHJldHVybiByZXQ7Cit9CisKK0FWQ29kZWMgZmZfb3B1c19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgPSAib3B1cyIsCisgICAgLmxvbmdfbmFtZSAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPcHVzIiksCisgICAgLnR5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfT1BVUywKKyAgICAucHJpdl9kYXRhX3NpemUgID0gc2l6ZW9mKE9wdXNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgID0gb3B1c19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgID0gb3B1c19kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgICA9IG9wdXNfZGVjb2RlX3BhY2tldCwKKyAgICAuZmx1c2ggICAgICAgICAgID0gb3B1c19kZWNvZGVfZmx1c2gsCisgICAgLmNhcGFiaWxpdGllcyAgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfREVMQVksCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcGFmLmggYi9mZm1wZWcvbGliYXZjb2RlYy9wYWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTgyNDVmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGFmLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIFBhY2tlZCBBbmltYXRpb24gRmlsZSBkZWNvZGVyL2RlbXV4ZXIgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1BBRl9ICisjZGVmaW5lIEFWQ09ERUNfUEFGX0gKKworI2RlZmluZSBQQUZfU09VTkRfU0FNUExFUyAgICAgMjIwNQorI2RlZmluZSBQQUZfU09VTkRfRlJBTUVfU0laRSAgKCgyNTYgKyBQQUZfU09VTkRfU0FNUExFUykgKiAyKQorCisjZW5kaWYgLyogQVZDT0RFQ19QQUZfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcGFmYXVkaW8uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BhZmF1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhZWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BhZmF1ZGlvLmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIFBhY2tlZCBBbmltYXRpb24gRmlsZSBhdWRpbyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAicGFmLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCBwYWZfYXVkaW9faW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyAhPSAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgIGF2Y3R4LT5zYW1wbGVfZm10ICAgICA9IEFWX1NBTVBMRV9GTVRfUzE2OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFmX2F1ZGlvX2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIGludDE2X3QgKm91dHB1dF9zYW1wbGVzOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IHBrdC0+ZGF0YTsKKyAgICBpbnQgZnJhbWVzLCByZXQsIGksIGo7CisgICAgaW50MTZfdCBjYlsyNTZdOworCisgICAgZnJhbWVzID0gcGt0LT5zaXplIC8gUEFGX1NPVU5EX0ZSQU1FX1NJWkU7CisgICAgaWYgKGZyYW1lcyA8IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBQQUZfU09VTkRfU0FNUExFUyAqIGZyYW1lczsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgb3V0cHV0X3NhbXBsZXMgPSAoaW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdOworICAgIC8vIGNvZGVib29rIG9mIDI1NiAxNi1iaXQgc2FtcGxlcyBhbmQgOC1iaXQgaW5kaWNlcyB0byBpdAorICAgIGZvciAoaiA9IDA7IGogPCBmcmFtZXM7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBjYltpXSA9IHNpZ25fZXh0ZW5kKEFWX1JMMTYoc3JjICsgaSAqIDIpLCAxNik7CisgICAgICAgIHNyYyArPSAyNTYgKiAyOworICAgICAgICAvLyBhbHdheXMgMiBjaGFubmVscworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUEFGX1NPVU5EX1NBTVBMRVMgKiAyOyBpKyspCisgICAgICAgICAgICAqb3V0cHV0X3NhbXBsZXMrKyA9IGNiWypzcmMrK107CisgICAgfQorICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIHBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl9wYWZfYXVkaW9fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gInBhZl9hdWRpbyIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBbWF6aW5nIFN0dWRpbyBQYWNrZWQgQW5pbWF0aW9uIEZpbGUgQXVkaW8iKSwKKyAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QQUZfQVVESU8sCisgICAgLmluaXQgICAgICAgICA9IHBhZl9hdWRpb19pbml0LAorICAgIC5kZWNvZGUgICAgICAgPSBwYWZfYXVkaW9fZGVjb2RlLAorICAgIC5jYXBhYmlsaXRpZXMgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BhZnZpZGVvLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wYWZ2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyN2FmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wYWZ2aWRlby5jCkBAIC0wLDAgKzEsMzk3IEBACisvKgorICogUGFja2VkIEFuaW1hdGlvbiBGaWxlIHZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJjb3B5X2Jsb2NrLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCitzdGF0aWMgY29uc3QgdWludDhfdCBibG9ja19zZXF1ZW5jZXNbMTZdWzhdID0geworICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgNSwgNywgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgNSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgNSwgNywgNSwgNywgMCwgMCwgMCwgMCB9LAorICAgIHsgNSwgNywgNSwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgNSwgNywgNiwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgNSwgNSwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMywgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgNiwgNiwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMiwgNCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMiwgNCwgNSwgNywgMCwgMCwgMCwgMCB9LAorICAgIHsgMiwgNCwgNSwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMiwgNCwgNiwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMiwgNCwgNSwgNywgNSwgNywgMCwgMCB9LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFGVmlkZW9EZWNDb250ZXh0IHsKKyAgICBBVkZyYW1lICAqcGljOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisKKyAgICBpbnQgY3VycmVudF9mcmFtZTsKKyAgICB1aW50OF90ICpmcmFtZVs0XTsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKyAgICBpbnQgdmlkZW9fc2l6ZTsKKworICAgIHVpbnQ4X3QgKm9wY29kZXM7Cit9IFBBRlZpZGVvRGVjQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IHBhZl92aWRlb19jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUEFGVmlkZW9EZWNDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmMtPnBpYyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmYy0+ZnJhbWVbaV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBwYWZfdmlkZW9faW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUEFGVmlkZW9EZWNDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGMtPndpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICBjLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgaWYgKGF2Y3R4LT5oZWlnaHQgJiAzIHx8IGF2Y3R4LT53aWR0aCAmIDMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAid2lkdGggJWQgYW5kIGhlaWdodCAlZCBtdXN0IGJlIG11bHRpcGxpZSBvZiA0LlxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworCisgICAgYy0+cGljID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWMtPnBpYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGMtPmZyYW1lX3NpemUgPSBhdmN0eC0+d2lkdGggKiBGRkFMSUdOKGF2Y3R4LT5oZWlnaHQsIDI1Nik7CisgICAgYy0+dmlkZW9fc2l6ZSA9IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQ7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBjLT5mcmFtZVtpXSA9IGF2X21hbGxvY3ooYy0+ZnJhbWVfc2l6ZSk7CisgICAgICAgIGlmICghYy0+ZnJhbWVbaV0pIHsKKyAgICAgICAgICAgIHBhZl92aWRlb19jbG9zZShhdmN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWQ0eDRibG9jayhQQUZWaWRlb0RlY0NvbnRleHQgKmMsIHVpbnQ4X3QgKmRzdCwgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZjLT5nYiwgZHN0LCA0KTsKKyAgICAgICAgZHN0ICs9IHdpZHRoOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29weV9jb2xvcl9tYXNrKHVpbnQ4X3QgKmRzdCwgaW50IHdpZHRoLCB1aW50OF90IG1hc2ssIHVpbnQ4X3QgY29sb3IpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGlmIChtYXNrICYgKDEgPDwgNyAtIGkpKQorICAgICAgICAgICAgZHN0W2ldID0gY29sb3I7CisgICAgICAgIGlmIChtYXNrICYgKDEgPDwgMyAtIGkpKQorICAgICAgICAgICAgZHN0W3dpZHRoICsgaV0gPSBjb2xvcjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfc3JjX21hc2sodWludDhfdCAqZHN0LCBpbnQgd2lkdGgsIHVpbnQ4X3QgbWFzaywgY29uc3QgdWludDhfdCAqc3JjKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpZiAobWFzayAmICgxIDw8IDcgLSBpKSkKKyAgICAgICAgICAgIGRzdFtpXSA9IHNyY1tpXTsKKyAgICAgICAgaWYgKG1hc2sgJiAoMSA8PCAzIC0gaSkpCisgICAgICAgICAgICBkc3Rbd2lkdGggKyBpXSA9IHNyY1t3aWR0aCArIGldOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2V0X3NyY19wb3NpdGlvbihQQUZWaWRlb0RlY0NvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqcGVuZCkKK3sKKyAgICBpbnQgdmFsICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZjLT5nYik7CisgICAgaW50IHBhZ2UgPSB2YWwgPj4gMTQ7CisgICAgaW50IHggICAgPSAodmFsICYgMHg3Rik7CisgICAgaW50IHkgICAgPSAoKHZhbCA+PiA3KSAmIDB4N0YpOworCisgICAgKnAgICAgPSBjLT5mcmFtZVtwYWdlXSArIHggKiAyICsgeSAqIDIgKiBjLT53aWR0aDsKKyAgICAqcGVuZCA9IGMtPmZyYW1lW3BhZ2VdICsgYy0+ZnJhbWVfc2l6ZTsKK30KKworc3RhdGljIGludCBkZWNvZGVfMChQQUZWaWRlb0RlY0NvbnRleHQgKmMsIHVpbnQ4X3QgKnBrdCwgdWludDhfdCBjb2RlKQoreworICAgIHVpbnQzMl90IG9wY29kZV9zaXplLCBvZmZzZXQ7CisgICAgdWludDhfdCAqZHN0LCAqZGVuZCwgbWFzayA9IDAsIGNvbG9yID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpzcmMsICpzZW5kLCAqb3Bjb2RlczsKKyAgICBpbnQgaSwgaiwgb3AgPSAwOworCisgICAgaSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjLT5nYik7CisgICAgaWYgKGkpIHsKKyAgICAgICAgaWYgKGNvZGUgJiAweDEwKSB7CisgICAgICAgICAgICBpbnQgYWxpZ247CisKKyAgICAgICAgICAgIGFsaWduID0gYnl0ZXN0cmVhbTJfdGVsbCgmYy0+Z2IpICYgMzsKKyAgICAgICAgICAgIGlmIChhbGlnbikKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZjLT5nYiwgNCAtIGFsaWduKTsKKyAgICAgICAgfQorICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgcGFnZSwgdmFsLCB4LCB5OworICAgICAgICAgICAgdmFsICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmMtPmdiKTsKKyAgICAgICAgICAgIHBhZ2UgICA9IHZhbCA+PiAxNDsKKyAgICAgICAgICAgIHggICAgICA9ICh2YWwgJiAweDdGKSAqIDI7CisgICAgICAgICAgICB5ICAgICAgPSAoKHZhbCA+PiA3KSAmIDB4N0YpICogMjsKKyAgICAgICAgICAgIGRzdCAgICA9IGMtPmZyYW1lW3BhZ2VdICsgeCArIHkgKiBjLT53aWR0aDsKKyAgICAgICAgICAgIGRlbmQgICA9IGMtPmZyYW1lW3BhZ2VdICsgYy0+ZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgIG9mZnNldCA9ICh4ICYgMHg3RikgKiAyOworICAgICAgICAgICAgaiAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmMtPmdiKSArIG9mZnNldDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgICAgICBpZiAoZHN0ICsgMyAqIGMtPndpZHRoICsgNCA+IGRlbmQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHJlYWQ0eDRibG9jayhjLCBkc3QsIGMtPndpZHRoKTsKKyAgICAgICAgICAgICAgICBpZiAoKG9mZnNldCAmIDB4M0YpID09IDApCisgICAgICAgICAgICAgICAgICAgIGRzdCArPSBjLT53aWR0aCAqIDM7CisgICAgICAgICAgICAgICAgZHN0ICs9IDQ7CisgICAgICAgICAgICB9IHdoaWxlIChvZmZzZXQgPCBqKTsKKyAgICAgICAgfSB3aGlsZSAoLS1pKTsKKyAgICB9CisKKyAgICBkc3QgID0gYy0+ZnJhbWVbYy0+Y3VycmVudF9mcmFtZV07CisgICAgZGVuZCA9IGMtPmZyYW1lW2MtPmN1cnJlbnRfZnJhbWVdICsgYy0+ZnJhbWVfc2l6ZTsKKyAgICBkbyB7CisgICAgICAgIHNldF9zcmNfcG9zaXRpb24oYywgJnNyYywgJnNlbmQpOworICAgICAgICBpZiAoKHNyYyArIDMgKiBjLT53aWR0aCArIDQgPiBzZW5kKSB8fAorICAgICAgICAgICAgKGRzdCArIDMgKiBjLT53aWR0aCArIDQgPiBkZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBjb3B5X2Jsb2NrNChkc3QsIHNyYywgYy0+d2lkdGgsIGMtPndpZHRoLCA0KTsKKyAgICAgICAgaSsrOworICAgICAgICBpZiAoKGkgJiAweDNGKSA9PSAwKQorICAgICAgICAgICAgZHN0ICs9IGMtPndpZHRoICogMzsKKyAgICAgICAgZHN0ICs9IDQ7CisgICAgfSB3aGlsZSAoaSA8IGMtPnZpZGVvX3NpemUgLyAxNik7CisKKyAgICBvcGNvZGVfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZjLT5nYik7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmYy0+Z2IsIDIpOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjLT5nYikgPCBvcGNvZGVfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBvcGNvZGVzID0gcGt0ICsgYnl0ZXN0cmVhbTJfdGVsbCgmYy0+Z2IpOworICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZjLT5nYiwgb3Bjb2RlX3NpemUpOworCisgICAgZHN0ID0gYy0+ZnJhbWVbYy0+Y3VycmVudF9mcmFtZV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+aGVpZ2h0OyBpICs9IDQsIGRzdCArPSBjLT53aWR0aCAqIDMpCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjLT53aWR0aDsgaiArPSA0LCBkc3QgKz0gNCkgeworICAgICAgICAgICAgaW50IG9wY29kZSwgayA9IDA7CisgICAgICAgICAgICBpZiAob3AgPiBvcGNvZGVfc2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGlmIChqICYgNCkgeworICAgICAgICAgICAgICAgIG9wY29kZSA9IG9wY29kZXNbb3BdICYgMTU7CisgICAgICAgICAgICAgICAgb3ArKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tvcF0gPj4gNDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKGJsb2NrX3NlcXVlbmNlc1tvcGNvZGVdW2tdKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gYy0+d2lkdGggKiAyOworICAgICAgICAgICAgICAgIGNvZGUgICA9IGJsb2NrX3NlcXVlbmNlc1tvcGNvZGVdW2srK107CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjLT5nYik7CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICBtYXNrID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgY29weV9jb2xvcl9tYXNrKGRzdCArIG9mZnNldCwgYy0+d2lkdGgsIG1hc2ssIGNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgc2V0X3NyY19wb3NpdGlvbihjLCAmc3JjLCAmc2VuZCk7CisgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICBpZiAoc3JjICsgb2Zmc2V0ICsgYy0+d2lkdGggKyA0ID4gc2VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICBtYXNrID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgY29weV9zcmNfbWFzayhkc3QgKyBvZmZzZXQsIGMtPndpZHRoLCBtYXNrLCBzcmMgKyBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhZl92aWRlb19kZWNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqcGt0KQoreworICAgIFBBRlZpZGVvRGVjQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCBjb2RlLCAqZHN0LCAqZW5kOworICAgIGludCBpLCBmcmFtZSwgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIGMtPnBpYykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmMtPmdiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisKKyAgICBjb2RlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmMtPmdiKTsKKyAgICBpZiAoY29kZSAmIDB4MjApIHsgIC8vIGZyYW1lIGlzIGtleWZyYW1lCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBtZW1zZXQoYy0+ZnJhbWVbaV0sIDAsIGMtPmZyYW1lX3NpemUpOworCisgICAgICAgIG1lbXNldChjLT5waWMtPmRhdGFbMV0sIDAsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgYy0+Y3VycmVudF9mcmFtZSAgPSAwOworICAgICAgICBjLT5waWMtPmtleV9mcmFtZSA9IDE7CisgICAgICAgIGMtPnBpYy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+cGljLT5rZXlfZnJhbWUgPSAwOworICAgICAgICBjLT5waWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgIH0KKworICAgIGlmIChjb2RlICYgMHg0MCkgeyAgLy8gcGFsZXR0ZSB1cGRhdGUKKyAgICAgICAgdWludDMyX3QgKm91dCA9ICh1aW50MzJfdCAqKWMtPnBpYy0+ZGF0YVsxXTsKKyAgICAgICAgaW50IGluZGV4LCBjb3VudDsKKworICAgICAgICBpbmRleCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjLT5nYik7CisgICAgICAgIGNvdW50ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmMtPmdiKSArIDE7CisKKyAgICAgICAgaWYgKGluZGV4ICsgY291bnQgPiAyNTYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjLT5nYikgPCAzICogY291bnQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBvdXQgKz0gaW5kZXg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCByLCBnLCBiOworCisgICAgICAgICAgICByID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjLT5nYik7CisgICAgICAgICAgICByID0gciA8PCAyIHwgciA+PiA0OworICAgICAgICAgICAgZyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmYy0+Z2IpOworICAgICAgICAgICAgZyA9IGcgPDwgMiB8IGcgPj4gNDsKKyAgICAgICAgICAgIGIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmMtPmdiKTsKKyAgICAgICAgICAgIGIgPSBiIDw8IDIgfCBiID4+IDQ7CisgICAgICAgICAgICAqb3V0KysgPSAoMHhGRlUgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworICAgICAgICB9CisgICAgICAgIGMtPnBpYy0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisgICAgfQorCisgICAgc3dpdGNoIChjb2RlICYgMHgwRikgeworICAgIGNhc2UgMDoKKyAgICAgICAgLyogQmxvY2stYmFzZWQgbW90aW9uIGNvbXBlbnNhdGlvbiB1c2luZyA0eDQgYmxvY2tzIHdpdGggZWl0aGVyCisgICAgICAgICAqIGhvcml6b250YWwgb3IgdmVydGljYWwgdmVjdG9yczsgbWlnaHQgaW5jb3Jwb3JhdGUgVlEgYXMgd2VsbC4gKi8KKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfMChjLCBwa3QtPmRhdGEsIGNvZGUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIC8qIFVuY29tcHJlc3NlZCBkYXRhLiBUaGlzIG1vZGUgc3BlY2lmaWVzIHRoYXQgKHdpZHRoICogaGVpZ2h0KSBieXRlcworICAgICAgICAgKiBzaG91bGQgYmUgY29waWVkIGRpcmVjdGx5IGZyb20gdGhlIGVuY29kZWQgYnVmZmVyIGludG8gdGhlIG91dHB1dC4gKi8KKyAgICAgICAgZHN0ID0gYy0+ZnJhbWVbYy0+Y3VycmVudF9mcmFtZV07CisgICAgICAgIC8vIHBvc3NpYmx5IGNodW5rIGxlbmd0aCBkYXRhCisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmMtPmdiLCAyKTsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjLT5nYikgPCBjLT52aWRlb19zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXJ1KCZjLT5nYiwgZHN0LCBjLT52aWRlb19zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICAvKiBDb3B5IHJlZmVyZW5jZSBmcmFtZTogQ29uc3VtZSB0aGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0gYXMgdGhlCisgICAgICAgICAqIHJlZmVyZW5jZSBmcmFtZSAod2hpY2ggc2hvdWxkIGJlIDAsIDEsIDIsIG9yIDMsIGFuZCBzaG91bGQgbm90IGJlCisgICAgICAgICAqIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IGZyYW1lIG51bWJlcikuICovCisgICAgICAgIGZyYW1lID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmMtPmdiKTsKKyAgICAgICAgaWYgKGZyYW1lID4gMykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAoZnJhbWUgIT0gYy0+Y3VycmVudF9mcmFtZSkKKyAgICAgICAgICAgIG1lbWNweShjLT5mcmFtZVtjLT5jdXJyZW50X2ZyYW1lXSwgYy0+ZnJhbWVbZnJhbWVdLCBjLT5mcmFtZV9zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICAvKiBSdW4gbGVuZ3RoIGVuY29kaW5nLiovCisgICAgICAgIGRzdCA9IGMtPmZyYW1lW2MtPmN1cnJlbnRfZnJhbWVdOworICAgICAgICBlbmQgPSBkc3QgKyBjLT52aWRlb19zaXplOworCisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmMtPmdiLCAyKTsKKworICAgICAgICB3aGlsZSAoZHN0IDwgZW5kKSB7CisgICAgICAgICAgICBpbnQ4X3QgY29kZTsKKyAgICAgICAgICAgIGludCBjb3VudDsKKworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjLT5nYikgPCAyKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBjb2RlICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmYy0+Z2IpOworICAgICAgICAgICAgY291bnQgPSBGRkFCUyhjb2RlKSArIDE7CisKKyAgICAgICAgICAgIGlmIChkc3QgKyBjb3VudCA+IGVuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGlmIChjb2RlIDwgMCkKKyAgICAgICAgICAgICAgICBtZW1zZXQoZHN0LCBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmMtPmdiKSwgY291bnQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmMtPmdiLCBkc3QsIGNvdW50KTsKKyAgICAgICAgICAgIGRzdCArPSBjb3VudDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJ1bmtub3duL2ludmFsaWQgY29kZSIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGMtPnBpYy0+ZGF0YVswXSwgYy0+cGljLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmZyYW1lW2MtPmN1cnJlbnRfZnJhbWVdLCBjLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPndpZHRoLCBjLT5oZWlnaHQpOworCisgICAgYy0+Y3VycmVudF9mcmFtZSA9IChjLT5jdXJyZW50X2ZyYW1lICsgMSkgJiAzOworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIGMtPnBpYykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIHBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl9wYWZfdmlkZW9fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicGFmX3ZpZGVvIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQW1hemluZyBTdHVkaW8gUGFja2VkIEFuaW1hdGlvbiBGaWxlIFZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BBRl9WSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUEFGVmlkZW9EZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBwYWZfdmlkZW9faW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBwYWZfdmlkZW9fY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gcGFmX3ZpZGVvX2RlY29kZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BhbWVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGFtZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhYjJiNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BhbWVuYy5jCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogUEFNIGltYWdlIGZvcm1hdAorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgcGFtX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcCwgaW50ICpnb3RfcGFja2V0KQoreworICAgIHVpbnQ4X3QgKmJ5dGVzdHJlYW1fc3RhcnQsICpieXRlc3RyZWFtLCAqYnl0ZXN0cmVhbV9lbmQ7CisgICAgaW50IGksIGgsIHcsIG4sIGxpbmVzaXplLCBkZXB0aCwgbWF4dmFsLCByZXQ7CisgICAgY29uc3QgY2hhciAqdHVwbGVfdHlwZTsKKyAgICB1aW50OF90ICpwdHI7CisKKyAgICBoID0gYXZjdHgtPmhlaWdodDsKKyAgICB3ID0gYXZjdHgtPndpZHRoOworICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfTU9OT0JMQUNLOgorICAgICAgICBuICAgICAgICAgID0gdzsKKyAgICAgICAgZGVwdGggICAgICA9IDE7CisgICAgICAgIG1heHZhbCAgICAgPSAxOworICAgICAgICB0dXBsZV90eXBlID0gIkJMQUNLQU5EV0hJVEUiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6CisgICAgICAgIG4gICAgICAgICAgPSB3OworICAgICAgICBkZXB0aCAgICAgID0gMTsKKyAgICAgICAgbWF4dmFsICAgICA9IDI1NTsKKyAgICAgICAgdHVwbGVfdHlwZSA9ICJHUkFZU0NBTEUiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2QkU6CisgICAgICAgIG4gICAgICAgICAgPSB3ICogMjsKKyAgICAgICAgZGVwdGggICAgICA9IDE7CisgICAgICAgIG1heHZhbCAgICAgPSAweEZGRkY7CisgICAgICAgIHR1cGxlX3R5cGUgPSAiR1JBWVNDQUxFIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4QToKKyAgICAgICAgbiAgICAgICAgICA9IHcgKiAyOworICAgICAgICBkZXB0aCAgICAgID0gMjsKKyAgICAgICAgbWF4dmFsICAgICA9IDI1NTsKKyAgICAgICAgdHVwbGVfdHlwZSA9ICJHUkFZU0NBTEVfQUxQSEEiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIG4gICAgICAgICAgPSB3ICogMzsKKyAgICAgICAgZGVwdGggICAgICA9IDM7CisgICAgICAgIG1heHZhbCAgICAgPSAyNTU7CisgICAgICAgIHR1cGxlX3R5cGUgPSAiUkdCIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CisgICAgICAgIG4gICAgICAgICAgPSB3ICogNDsKKyAgICAgICAgZGVwdGggICAgICA9IDQ7CisgICAgICAgIG1heHZhbCAgICAgPSAyNTU7CisgICAgICAgIHR1cGxlX3R5cGUgPSAiUkdCX0FMUEhBIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4QkU6CisgICAgICAgIG4gICAgICAgICAgPSB3ICogNjsKKyAgICAgICAgZGVwdGggICAgICA9IDM7CisgICAgICAgIG1heHZhbCAgICAgPSAweEZGRkY7CisgICAgICAgIHR1cGxlX3R5cGUgPSAiUkdCIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NEJFOgorICAgICAgICBuICAgICAgICAgID0gdyAqIDg7CisgICAgICAgIGRlcHRoICAgICAgPSA0OworICAgICAgICBtYXh2YWwgICAgID0gMHhGRkZGOworICAgICAgICB0dXBsZV90eXBlID0gIlJHQl9BTFBIQSI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgbipoICsgMjAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYnl0ZXN0cmVhbV9zdGFydCA9CisgICAgYnl0ZXN0cmVhbSAgICAgICA9IHBrdC0+ZGF0YTsKKyAgICBieXRlc3RyZWFtX2VuZCAgID0gcGt0LT5kYXRhICsgcGt0LT5zaXplOworCisgICAgc25wcmludGYoYnl0ZXN0cmVhbSwgYnl0ZXN0cmVhbV9lbmQgLSBieXRlc3RyZWFtLAorICAgICAgICAgICAgICJQN1xuV0lEVEggJWRcbkhFSUdIVCAlZFxuREVQVEggJWRcbk1BWFZBTCAlZFxuVFVQTFRZUEUgJXNcbkVOREhEUlxuIiwKKyAgICAgICAgICAgICB3LCBoLCBkZXB0aCwgbWF4dmFsLCB0dXBsZV90eXBlKTsKKyAgICBieXRlc3RyZWFtICs9IHN0cmxlbihieXRlc3RyZWFtKTsKKworICAgIHB0ciAgICAgID0gcC0+ZGF0YVswXTsKKyAgICBsaW5lc2l6ZSA9IHAtPmxpbmVzaXplWzBdOworCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTU9OT0JMQUNLKXsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspCisgICAgICAgICAgICAgICAgKmJ5dGVzdHJlYW0rKyA9IHB0cltqID4+IDNdID4+ICg3IC0gaiAmIDcpICYgMTsKKyAgICAgICAgICAgIHB0ciArPSBsaW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgICAgIG1lbWNweShieXRlc3RyZWFtLCBwdHIsIG4pOworICAgICAgICAgICAgYnl0ZXN0cmVhbSArPSBuOworICAgICAgICAgICAgcHRyICAgICAgICArPSBsaW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBrdC0+c2l6ZSAgID0gYnl0ZXN0cmVhbSAtIGJ5dGVzdHJlYW1fc3RhcnQ7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcGFtX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHBhbV9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfcGFtX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInBhbSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBBTSAoUG9ydGFibGUgQW55TWFwKSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QQU0sCisgICAgLmluaXQgICAgICAgICAgID0gcGFtX2VuY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHBhbV9lbmNvZGVfY2xvc2UsCisgICAgLmVuY29kZTIgICAgICAgID0gcGFtX2VuY29kZV9mcmFtZSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peworICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX1JHQkEsIEFWX1BJWF9GTVRfUkdCNDhCRSwgQVZfUElYX0ZNVF9SR0JBNjRCRSwgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOEEsIEFWX1BJWF9GTVRfR1JBWTE2QkUsIEFWX1BJWF9GTVRfTU9OT0JMQUNLLCBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlMTU3NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BhcnNlci5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogQXVkaW8gYW5kIFZpZGVvIGZyYW1lIGV4dHJhY3Rpb24KKyAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdG9taWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKworc3RhdGljIEFWQ29kZWNQYXJzZXIgKmF2X2ZpcnN0X3BhcnNlciA9IE5VTEw7CisKK0FWQ29kZWNQYXJzZXIgKmF2X3BhcnNlcl9uZXh0KGNvbnN0IEFWQ29kZWNQYXJzZXIgKnApCit7CisgICAgaWYgKHApCisgICAgICAgIHJldHVybiBwLT5uZXh0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGF2X2ZpcnN0X3BhcnNlcjsKK30KKwordm9pZCBhdl9yZWdpc3Rlcl9jb2RlY19wYXJzZXIoQVZDb2RlY1BhcnNlciAqcGFyc2VyKQoreworICAgIGRvIHsKKyAgICAgICAgcGFyc2VyLT5uZXh0ID0gYXZfZmlyc3RfcGFyc2VyOworICAgIH0gd2hpbGUgKHBhcnNlci0+bmV4dCAhPSBhdnByaXZfYXRvbWljX3B0cl9jYXMoKHZvaWQgKiB2b2xhdGlsZSAqKSZhdl9maXJzdF9wYXJzZXIsIHBhcnNlci0+bmV4dCwgcGFyc2VyKSk7Cit9CisKK0FWQ29kZWNQYXJzZXJDb250ZXh0ICphdl9wYXJzZXJfaW5pdChpbnQgY29kZWNfaWQpCit7CisgICAgQVZDb2RlY1BhcnNlckNvbnRleHQgKnMgPSBOVUxMOworICAgIEFWQ29kZWNQYXJzZXIgKnBhcnNlcjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yIChwYXJzZXIgPSBhdl9maXJzdF9wYXJzZXI7IHBhcnNlcjsgcGFyc2VyID0gcGFyc2VyLT5uZXh0KSB7CisgICAgICAgIGlmIChwYXJzZXItPmNvZGVjX2lkc1swXSA9PSBjb2RlY19pZCB8fAorICAgICAgICAgICAgcGFyc2VyLT5jb2RlY19pZHNbMV0gPT0gY29kZWNfaWQgfHwKKyAgICAgICAgICAgIHBhcnNlci0+Y29kZWNfaWRzWzJdID09IGNvZGVjX2lkIHx8CisgICAgICAgICAgICBwYXJzZXItPmNvZGVjX2lkc1szXSA9PSBjb2RlY19pZCB8fAorICAgICAgICAgICAgcGFyc2VyLT5jb2RlY19pZHNbNF0gPT0gY29kZWNfaWQpCisgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKworZm91bmQ6CisgICAgcyA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWQ29kZWNQYXJzZXJDb250ZXh0KSk7CisgICAgaWYgKCFzKQorICAgICAgICBnb3RvIGVycl9vdXQ7CisgICAgcy0+cGFyc2VyID0gcGFyc2VyOworICAgIHMtPnByaXZfZGF0YSA9IGF2X21hbGxvY3oocGFyc2VyLT5wcml2X2RhdGFfc2l6ZSk7CisgICAgaWYgKCFzLT5wcml2X2RhdGEpCisgICAgICAgIGdvdG8gZXJyX291dDsKKyAgICBzLT5mZXRjaF90aW1lc3RhbXA9MTsKKyAgICBzLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBpZiAocGFyc2VyLT5wYXJzZXJfaW5pdCkgeworICAgICAgICByZXQgPSBwYXJzZXItPnBhcnNlcl9pbml0KHMpOworICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICBnb3RvIGVycl9vdXQ7CisgICAgfQorICAgIHMtPmtleV9mcmFtZSAgICAgICAgICAgID0gLTE7CisgICAgcy0+Y29udmVyZ2VuY2VfZHVyYXRpb24gPSAwOworICAgIHMtPmR0c19zeW5jX3BvaW50ICAgICAgID0gSU5UX01JTjsKKyAgICBzLT5kdHNfcmVmX2R0c19kZWx0YSAgICA9IElOVF9NSU47CisgICAgcy0+cHRzX2R0c19kZWx0YSAgICAgICAgPSBJTlRfTUlOOworICAgIHJldHVybiBzOworCitlcnJfb3V0OgorICAgIGlmIChzKQorICAgICAgICBhdl9mcmVlcCgmcy0+cHJpdl9kYXRhKTsKKyAgICBhdl9mcmVlKHMpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIGZmX2ZldGNoX3RpbWVzdGFtcChBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywgaW50IG9mZiwgaW50IHJlbW92ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIHMtPmR0cyAgICA9CisgICAgcy0+cHRzICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgcy0+cG9zICAgID0gLTE7CisgICAgcy0+b2Zmc2V0ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVZfUEFSU0VSX1BUU19OQjsgaSsrKSB7CisgICAgICAgIGlmIChzLT5jdXJfb2Zmc2V0ICsgb2ZmID49IHMtPmN1cl9mcmFtZV9vZmZzZXRbaV0gJiYKKyAgICAgICAgICAgIChzLT5mcmFtZV9vZmZzZXQgPCBzLT5jdXJfZnJhbWVfb2Zmc2V0W2ldIHx8CisgICAgICAgICAgICAgKCFzLT5mcmFtZV9vZmZzZXQgJiYgIXMtPm5leHRfZnJhbWVfb2Zmc2V0KSkgJiYgLy8gZmlyc3QgZmllbGQvZnJhbWUKKyAgICAgICAgICAgIC8vIGNoZWNrIGRpc2FibGVkIHNpbmNlIE1QRUctVFMgZG9lcyBub3Qgc2VuZCBjb21wbGV0ZSBQRVMgcGFja2V0cworICAgICAgICAgICAgLypzLT5uZXh0X2ZyYW1lX29mZnNldCArIG9mZiA8Ki8gIHMtPmN1cl9mcmFtZV9lbmRbaV0peworCisgICAgICAgICAgICBzLT5kdHMgICAgPSBzLT5jdXJfZnJhbWVfZHRzW2ldOworICAgICAgICAgICAgcy0+cHRzICAgID0gcy0+Y3VyX2ZyYW1lX3B0c1tpXTsKKyAgICAgICAgICAgIHMtPnBvcyAgICA9IHMtPmN1cl9mcmFtZV9wb3NbaV07CisgICAgICAgICAgICBzLT5vZmZzZXQgPSBzLT5uZXh0X2ZyYW1lX29mZnNldCAtIHMtPmN1cl9mcmFtZV9vZmZzZXRbaV07CisgICAgICAgICAgICBpZiAocmVtb3ZlKQorICAgICAgICAgICAgICAgIHMtPmN1cl9mcmFtZV9vZmZzZXRbaV0gPSBJTlQ2NF9NQVg7CisgICAgICAgICAgICBpZiAocy0+Y3VyX29mZnNldCArIG9mZiA8IHMtPmN1cl9mcmFtZV9lbmRbaV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBhdl9wYXJzZXJfcGFyc2UyKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzLCBpbnQ2NF90IGR0cywgaW50NjRfdCBwb3MpCit7CisgICAgaW50IGluZGV4LCBpOworICAgIHVpbnQ4X3QgZHVtbXlfYnVmW0ZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkVdOworCisgICAgaWYgKCEocy0+ZmxhZ3MgJiBQQVJTRVJfRkxBR19GRVRDSEVEX09GRlNFVCkpIHsKKyAgICAgICAgcy0+bmV4dF9mcmFtZV9vZmZzZXQgPQorICAgICAgICBzLT5jdXJfb2Zmc2V0ICAgICAgICA9IHBvczsKKyAgICAgICAgcy0+ZmxhZ3MgICAgICAgICAgICB8PSBQQVJTRVJfRkxBR19GRVRDSEVEX09GRlNFVDsKKyAgICB9CisKKyAgICBpZiAoYnVmX3NpemUgPT0gMCkgeworICAgICAgICAvKiBwYWRkaW5nIGlzIGFsd2F5cyBuZWNlc3NhcnkgZXZlbiBpZiBFT0YsIHNvIHdlIGFkZCBpdCBoZXJlICovCisgICAgICAgIG1lbXNldChkdW1teV9idWYsIDAsIHNpemVvZihkdW1teV9idWYpKTsKKyAgICAgICAgYnVmID0gZHVtbXlfYnVmOworICAgIH0gZWxzZSBpZiAocy0+Y3VyX29mZnNldCArIGJ1Zl9zaXplICE9IHMtPmN1cl9mcmFtZV9lbmRbcy0+Y3VyX2ZyYW1lX3N0YXJ0X2luZGV4XSkgeyAvKiBza2lwIHJlbWFpbmRlciBwYWNrZXRzICovCisgICAgICAgIC8qIGFkZCBhIG5ldyBwYWNrZXQgZGVzY3JpcHRvciAqLworICAgICAgICBpID0gKHMtPmN1cl9mcmFtZV9zdGFydF9pbmRleCArIDEpICYgKEFWX1BBUlNFUl9QVFNfTkIgLSAxKTsKKyAgICAgICAgcy0+Y3VyX2ZyYW1lX3N0YXJ0X2luZGV4ID0gaTsKKyAgICAgICAgcy0+Y3VyX2ZyYW1lX29mZnNldFtpXSAgID0gcy0+Y3VyX29mZnNldDsKKyAgICAgICAgcy0+Y3VyX2ZyYW1lX2VuZFtpXSAgICAgID0gcy0+Y3VyX29mZnNldCArIGJ1Zl9zaXplOworICAgICAgICBzLT5jdXJfZnJhbWVfcHRzW2ldICAgICAgPSBwdHM7CisgICAgICAgIHMtPmN1cl9mcmFtZV9kdHNbaV0gICAgICA9IGR0czsKKyAgICAgICAgcy0+Y3VyX2ZyYW1lX3Bvc1tpXSAgICAgID0gcG9zOworICAgIH0KKworICAgIGlmIChzLT5mZXRjaF90aW1lc3RhbXApIHsKKyAgICAgICAgcy0+ZmV0Y2hfdGltZXN0YW1wID0gMDsKKyAgICAgICAgcy0+bGFzdF9wdHMgICAgICAgID0gcy0+cHRzOworICAgICAgICBzLT5sYXN0X2R0cyAgICAgICAgPSBzLT5kdHM7CisgICAgICAgIHMtPmxhc3RfcG9zICAgICAgICA9IHMtPnBvczsKKyAgICAgICAgZmZfZmV0Y2hfdGltZXN0YW1wKHMsIDAsIDApOworICAgIH0KKyAgICAvKiBXQVJOSU5HOiB0aGUgcmV0dXJuZWQgaW5kZXggY2FuIGJlIG5lZ2F0aXZlICovCisgICAgaW5kZXggPSBzLT5wYXJzZXItPnBhcnNlcl9wYXJzZShzLCBhdmN0eCwgKGNvbnN0IHVpbnQ4X3QgKiopIHBvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3V0YnVmX3NpemUsIGJ1ZiwgYnVmX3NpemUpOworICAgIC8qIHVwZGF0ZSB0aGUgZmlsZSBwb2ludGVyICovCisgICAgaWYgKCpwb3V0YnVmX3NpemUpIHsKKyAgICAgICAgLyogZmlsbCB0aGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgcy0+ZnJhbWVfb2Zmc2V0ID0gcy0+bmV4dF9mcmFtZV9vZmZzZXQ7CisKKyAgICAgICAgLyogb2Zmc2V0IG9mIHRoZSBuZXh0IGZyYW1lICovCisgICAgICAgIHMtPm5leHRfZnJhbWVfb2Zmc2V0ID0gcy0+Y3VyX29mZnNldCArIGluZGV4OworICAgICAgICBzLT5mZXRjaF90aW1lc3RhbXAgICA9IDE7CisgICAgfQorICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIGluZGV4ID0gMDsKKyAgICBzLT5jdXJfb2Zmc2V0ICs9IGluZGV4OworICAgIHJldHVybiBpbmRleDsKK30KKworaW50IGF2X3BhcnNlcl9jaGFuZ2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQga2V5ZnJhbWUpCit7CisgICAgaWYgKHMgJiYgcy0+cGFyc2VyLT5zcGxpdCkgeworICAgICAgICBpZiAoYXZjdHgtPmZsYWdzICAmIENPREVDX0ZMQUdfR0xPQkFMX0hFQURFUiB8fAorICAgICAgICAgICAgYXZjdHgtPmZsYWdzMiAmIENPREVDX0ZMQUcyX0xPQ0FMX0hFQURFUikgeworICAgICAgICAgICAgaW50IGkgPSBzLT5wYXJzZXItPnNwbGl0KGF2Y3R4LCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIGJ1ZiAgICAgICs9IGk7CisgICAgICAgICAgICBidWZfc2l6ZSAtPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2FzdCB0byBhdm9pZCB3YXJuaW5nIGFib3V0IGRpc2NhcmRpbmcgcXVhbGlmaWVycyAqLworICAgICpwb3V0YnVmICAgICAgPSAodWludDhfdCAqKSBidWY7CisgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhKSB7CisgICAgICAgIGlmIChrZXlmcmFtZSAmJiAoYXZjdHgtPmZsYWdzMiAmIENPREVDX0ZMQUcyX0xPQ0FMX0hFQURFUikpIHsKKyAgICAgICAgICAgIGludCBzaXplID0gYnVmX3NpemUgKyBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7CisKKyAgICAgICAgICAgICpwb3V0YnVmX3NpemUgPSBzaXplOworICAgICAgICAgICAgKnBvdXRidWYgICAgICA9IGF2X21hbGxvYyhzaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICAgICAgICAgIG1lbWNweSgqcG91dGJ1ZiwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIG1lbWNweSgqcG91dGJ1ZiArIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSwgYnVmLAorICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGF2X3BhcnNlcl9jbG9zZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcykKK3sKKyAgICBpZiAocykgeworICAgICAgICBpZiAocy0+cGFyc2VyLT5wYXJzZXJfY2xvc2UpCisgICAgICAgICAgICBzLT5wYXJzZXItPnBhcnNlcl9jbG9zZShzKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnByaXZfZGF0YSk7CisgICAgICAgIGF2X2ZyZWUocyk7CisgICAgfQorfQorCitpbnQgZmZfY29tYmluZV9mcmFtZShQYXJzZUNvbnRleHQgKnBjLCBpbnQgbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipidWYsIGludCAqYnVmX3NpemUpCit7CisgICAgaWYgKHBjLT5vdmVycmVhZCkgeworICAgICAgICBhdl9kbG9nKE5VTEwsICJvdmVycmVhZCAlZCwgc3RhdGU6JVggbmV4dDolZCBpbmRleDolZCBvX2luZGV4OiVkXG4iLAorICAgICAgICAgICAgICAgIHBjLT5vdmVycmVhZCwgcGMtPnN0YXRlLCBuZXh0LCBwYy0+aW5kZXgsIHBjLT5vdmVycmVhZF9pbmRleCk7CisgICAgICAgIGF2X2Rsb2coTlVMTCwgIiVYICVYICVYICVYXG4iLAorICAgICAgICAgICAgICAgICgqYnVmKVswXSwgKCpidWYpWzFdLCAoKmJ1ZilbMl0sICgqYnVmKVszXSk7CisgICAgfQorCisgICAgLyogQ29weSBvdmVycmVhZCBieXRlcyBmcm9tIGxhc3QgZnJhbWUgaW50byBidWZmZXIuICovCisgICAgZm9yICg7IHBjLT5vdmVycmVhZCA+IDA7IHBjLT5vdmVycmVhZC0tKQorICAgICAgICBwYy0+YnVmZmVyW3BjLT5pbmRleCsrXSA9IHBjLT5idWZmZXJbcGMtPm92ZXJyZWFkX2luZGV4KytdOworCisgICAgLyogZmx1c2ggcmVtYWluaW5nIGlmIEVPRiAqLworICAgIGlmICghKmJ1Zl9zaXplICYmIG5leHQgPT0gRU5EX05PVF9GT1VORCkKKyAgICAgICAgbmV4dCA9IDA7CisKKyAgICBwYy0+bGFzdF9pbmRleCA9IHBjLT5pbmRleDsKKworICAgIC8qIGNvcHkgaW50byBidWZmZXIgZW5kIHJldHVybiAqLworICAgIGlmIChuZXh0ID09IEVORF9OT1RfRk9VTkQpIHsKKyAgICAgICAgdm9pZCAqbmV3X2J1ZmZlciA9IGF2X2Zhc3RfcmVhbGxvYyhwYy0+YnVmZmVyLCAmcGMtPmJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfc2l6ZSArIHBjLT5pbmRleCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICAgICAgaWYgKCFuZXdfYnVmZmVyKSB7CisgICAgICAgICAgICBwYy0+aW5kZXggPSAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBwYy0+YnVmZmVyID0gbmV3X2J1ZmZlcjsKKyAgICAgICAgbWVtY3B5KCZwYy0+YnVmZmVyW3BjLT5pbmRleF0sICpidWYsICpidWZfc2l6ZSk7CisgICAgICAgIHBjLT5pbmRleCArPSAqYnVmX3NpemU7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAqYnVmX3NpemUgICAgICAgICAgPQorICAgIHBjLT5vdmVycmVhZF9pbmRleCA9IHBjLT5pbmRleCArIG5leHQ7CisKKyAgICAvKiBhcHBlbmQgdG8gYnVmZmVyICovCisgICAgaWYgKHBjLT5pbmRleCkgeworICAgICAgICB2b2lkICpuZXdfYnVmZmVyID0gYXZfZmFzdF9yZWFsbG9jKHBjLT5idWZmZXIsICZwYy0+YnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCArIHBjLT5pbmRleCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIGlmICghbmV3X2J1ZmZlcikgeworICAgICAgICAgICAgcGMtPm92ZXJyZWFkX2luZGV4ID0KKyAgICAgICAgICAgIHBjLT5pbmRleCA9IDA7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIHBjLT5idWZmZXIgPSBuZXdfYnVmZmVyOworICAgICAgICBpZiAobmV4dCA+IC1GRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKQorICAgICAgICAgICAgbWVtY3B5KCZwYy0+YnVmZmVyW3BjLT5pbmRleF0sICpidWYsCisgICAgICAgICAgICAgICAgICAgbmV4dCArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBwYy0+aW5kZXggPSAwOworICAgICAgICAqYnVmICAgICAgPSBwYy0+YnVmZmVyOworICAgIH0KKworICAgIC8qIHN0b3JlIG92ZXJyZWFkIGJ5dGVzICovCisgICAgZm9yICg7IG5leHQgPCAwOyBuZXh0KyspIHsKKyAgICAgICAgcGMtPnN0YXRlICAgPSBwYy0+c3RhdGUgICA8PCA4IHwgcGMtPmJ1ZmZlcltwYy0+bGFzdF9pbmRleCArIG5leHRdOworICAgICAgICBwYy0+c3RhdGU2NCA9IHBjLT5zdGF0ZTY0IDw8IDggfCBwYy0+YnVmZmVyW3BjLT5sYXN0X2luZGV4ICsgbmV4dF07CisgICAgICAgIHBjLT5vdmVycmVhZCsrOworICAgIH0KKworICAgIGlmIChwYy0+b3ZlcnJlYWQpIHsKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAib3ZlcnJlYWQgJWQsIHN0YXRlOiVYIG5leHQ6JWQgaW5kZXg6JWQgb19pbmRleDolZFxuIiwKKyAgICAgICAgICAgICAgICBwYy0+b3ZlcnJlYWQsIHBjLT5zdGF0ZSwgbmV4dCwgcGMtPmluZGV4LCBwYy0+b3ZlcnJlYWRfaW5kZXgpOworICAgICAgICBhdl9kbG9nKE5VTEwsICIlWCAlWCAlWCAlWFxuIiwKKyAgICAgICAgICAgICAgICAoKmJ1ZilbMF0sICgqYnVmKVsxXSwgKCpidWYpWzJdLCAoKmJ1ZilbM10pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX3BhcnNlX2Nsb3NlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzKQoreworICAgIFBhcnNlQ29udGV4dCAqcGMgPSBzLT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmcGMtPmJ1ZmZlcik7Cit9CisKK2ludCBmZl9tcGVnNHZpZGVvX3NwbGl0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgaW50IGk7CisgICAgdWludDMyX3Qgc3RhdGUgPSAtMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBidWZfc2l6ZTsgaSsrKSB7CisgICAgICAgIHN0YXRlID0gc3RhdGUgPDwgOCB8IGJ1ZltpXTsKKyAgICAgICAgaWYgKHN0YXRlID09IDB4MUIzIHx8IHN0YXRlID09IDB4MUI2KQorICAgICAgICAgICAgcmV0dXJuIGkgLSAzOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BhcnNlci5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlMGUxMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BhcnNlci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBBVkNvZGVjUGFyc2VyIHByb3RvdHlwZXMgYW5kIGRlZmluaXRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUEFSU0VSX0gKKyNkZWZpbmUgQVZDT0RFQ19QQVJTRVJfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCit0eXBlZGVmIHN0cnVjdCBQYXJzZUNvbnRleHR7CisgICAgdWludDhfdCAqYnVmZmVyOworICAgIGludCBpbmRleDsKKyAgICBpbnQgbGFzdF9pbmRleDsKKyAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX3NpemU7CisgICAgdWludDMyX3Qgc3RhdGU7ICAgICAgICAgICAgIC8vLzwgY29udGFpbnMgdGhlIGxhc3QgZmV3IGJ5dGVzIGluIE1TQiBvcmRlcgorICAgIGludCBmcmFtZV9zdGFydF9mb3VuZDsKKyAgICBpbnQgb3ZlcnJlYWQ7ICAgICAgICAgICAgICAgLy8vPCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdoZXJlIGlycmV2ZXJzaWJseSByZWFkIGZyb20gdGhlIG5leHQgZnJhbWUKKyAgICBpbnQgb3ZlcnJlYWRfaW5kZXg7ICAgICAgICAgLy8vPCB0aGUgaW5kZXggaW50byBQYXJzZUNvbnRleHQuYnVmZmVyIG9mIHRoZSBvdmVycmVhZCBieXRlcworICAgIHVpbnQ2NF90IHN0YXRlNjQ7ICAgICAgICAgICAvLy88IGNvbnRhaW5zIHRoZSBsYXN0IDggYnl0ZXMgaW4gTVNCIG9yZGVyCit9IFBhcnNlQ29udGV4dDsKKworI2RlZmluZSBFTkRfTk9UX0ZPVU5EICgtMTAwKQorCisvKioKKyAqIENvbWJpbmUgdGhlICh0cnVuY2F0ZWQpIGJpdHN0cmVhbSB0byBhIGNvbXBsZXRlIGZyYW1lLgorICogQHJldHVybiAtMSBpZiBubyBjb21wbGV0ZSBmcmFtZSBjb3VsZCBiZSBjcmVhdGVkLAorICogICAgICAgICBBVkVSUk9SKEVOT01FTSkgaWYgdGhlcmUgd2FzIGEgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IKKyAqLworaW50IGZmX2NvbWJpbmVfZnJhbWUoUGFyc2VDb250ZXh0ICpwYywgaW50IG5leHQsIGNvbnN0IHVpbnQ4X3QgKipidWYsIGludCAqYnVmX3NpemUpOworaW50IGZmX21wZWc0dmlkZW9fc3BsaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUpOwordm9pZCBmZl9wYXJzZV9jbG9zZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcyk7CisKKy8qKgorICogRmV0Y2ggdGltZXN0YW1wcyBmb3IgYSBzcGVjaWZpYyBieXRlIHdpdGhpbiB0aGUgY3VycmVudCBhY2Nlc3MgdW5pdC4KKyAqIEBwYXJhbSBvZmYgYnl0ZSBwb3NpdGlvbiB3aXRoaW4gdGhlIGFjY2VzcyB1bml0CisgKiBAcGFyYW0gcmVtb3ZlIEZvdW5kIHRpbWVzdGFtcHMgd2lsbCBiZSByZW1vdmVkIGlmIHNldCB0byAxLCBrZXB0IGlmIHNldCB0byAwLgorICovCit2b2lkIGZmX2ZldGNoX3RpbWVzdGFtcChBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywgaW50IG9mZiwgaW50IHJlbW92ZSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1BBUlNFUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wY20tYmx1cmF5LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wY20tYmx1cmF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1YmMzMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BjbS1ibHVyYXkuYwpAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIExQQ00gY29kZWNzIGZvciBQQ00gZm9ybWF0IGZvdW5kIGluIEJsdS1yYXkgUENNIHN0cmVhbXMKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMyBDaHJpc3RpYW4gU2NobWlkdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBQQ00gY29kZWMgZm9yIEJsdS1yYXkgUENNIGF1ZGlvIHRyYWNrcworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qCisgKiBDaGFubmVsIE1hcHBpbmcgYWNjb3JkaW5nIHRvCisgKiBCbHUtcmF5IERpc2MgUmVhZC1Pbmx5IEZvcm1hdCBWZXJzaW9uIDEKKyAqIFBhcnQgMzogQXVkaW8gVmlzdWFsIEJhc2ljIFNwZWNpZmljYXRpb25zCisgKiBtb25vICAgICBNMSAgICBYCisgKiBzdGVyZW8gICBMICAgICBSCisgKiAzLzAgICAgICBMICAgICBSICAgIEMgICAgWAorICogMi8xICAgICAgTCAgICAgUiAgICBTICAgIFgKKyAqIDMvMSAgICAgIEwgICAgIFIgICAgQyAgICBTCisgKiAyLzIgICAgICBMICAgICBSICAgIExTICAgUlMKKyAqIDMvMiAgICAgIEwgICAgIFIgICAgQyAgICBMUyAgICBSUyAgICBYCisgKiAzLzIrbGZlICBMICAgICBSICAgIEMgICAgTFMgICAgUlMgICAgbGZlCisgKiAzLzQgICAgICBMICAgICBSICAgIEMgICAgTFMgICAgUmxzICAgUnJzICBSUyAgIFgKKyAqIDMvNCtsZmUgIEwgICAgIFIgICAgQyAgICBMUyAgICBSbHMgICBScnMgIFJTICAgbGZlCisgKi8KKworLyoqCisgKiBQYXJzZSB0aGUgaGVhZGVyIG9mIGEgTFBDTSBmcmFtZSByZWFkIGZyb20gYSBCbHUtcmF5IE1QRUctVFMgc3RyZWFtCisgKiBAcGFyYW0gYXZjdHggdGhlIGNvZGVjIGNvbnRleHQKKyAqIEBwYXJhbSBoZWFkZXIgcG9pbnRlciB0byB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgZGF0YSBwYWNrZXQKKyAqLworc3RhdGljIGludCBwY21fYmx1cmF5X3BhcnNlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmhlYWRlcikKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBiaXRzX3Blcl9zYW1wbGVzWzRdID0geyAwLCAxNiwgMjAsIDI0IH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxfbGF5b3V0c1sxNl0gPSB7CisgICAgICAgIDAsIEFWX0NIX0xBWU9VVF9NT05PLCAwLCBBVl9DSF9MQVlPVVRfU1RFUkVPLCBBVl9DSF9MQVlPVVRfU1VSUk9VTkQsCisgICAgICAgIEFWX0NIX0xBWU9VVF8yXzEsIEFWX0NIX0xBWU9VVF80UE9JTlQwLCBBVl9DSF9MQVlPVVRfMl8yLAorICAgICAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMCwgQVZfQ0hfTEFZT1VUXzVQT0lOVDEsIEFWX0NIX0xBWU9VVF83UE9JTlQwLAorICAgICAgICBBVl9DSF9MQVlPVVRfN1BPSU5UMSwgMCwgMCwgMCwgMAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2hhbm5lbHNbMTZdID0geworICAgICAgICAwLCAxLCAwLCAyLCAzLCAzLCA0LCA0LCA1LCA2LCA3LCA4LCAwLCAwLCAwLCAwCisgICAgfTsKKyAgICB1aW50OF90IGNoYW5uZWxfbGF5b3V0ID0gaGVhZGVyWzJdID4+IDQ7CisKKyAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICBhdl9kbG9nKGF2Y3R4LCAicGNtX2JsdXJheV9wYXJzZV9oZWFkZXI6IGhlYWRlciA9ICUwMnglMDJ4JTAyeCUwMnhcbiIsCisgICAgICAgICAgICAgICAgaGVhZGVyWzBdLCBoZWFkZXJbMV0sIGhlYWRlclsyXSwgaGVhZGVyWzNdKTsKKworICAgIC8qIGdldCB0aGUgc2FtcGxlIGRlcHRoIGFuZCBkZXJpdmUgdGhlIHNhbXBsZSBmb3JtYXQgZnJvbSBpdCAqLworICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGVzW2hlYWRlclszXSA+PiA2XTsKKyAgICBpZiAoIShhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDE2IHx8IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMjQpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgc2FtcGxlIGRlcHRoICglZClcbiIsIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDE2ID8gQVZfU0FNUExFX0ZNVF9TMTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVl9TQU1QTEVfRk1UX1MzMjsKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIpCisgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKworICAgIC8qIGdldCB0aGUgc2FtcGxlIHJhdGUuIE5vdCBhbGwgdmFsdWVzIGFyZSB1c2VkLiAqLworICAgIHN3aXRjaCAoaGVhZGVyWzJdICYgMHgwZikgeworICAgIGNhc2UgMToKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gOTYwMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gMTkyMDAwOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSAwOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInJlc2VydmVkIHNhbXBsZSByYXRlICglZClcbiIsCisgICAgICAgICAgICAgICBoZWFkZXJbMl0gJiAweDBmKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBnZXQgdGhlIGNoYW5uZWwgbnVtYmVyIChhbmQgbWFwcGluZykuIE5vdCBhbGwgdmFsdWVzIGFyZSB1c2VkLgorICAgICAqIEl0IG11c3QgYmUgbm90ZWQgdGhhdCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBNUEVHIHN0cmVhbSBjYW4KKyAgICAgKiBkaWZmZXIgZnJvbSB0aGUgYWN0dWFsIG1lYW5pbmdmdWwgbnVtYmVyLCBlLmcuIG1vbm8gYXVkaW8gc3RpbGwgaGFzIHR3bworICAgICAqIGNoYW5uZWxzLCBvbmUgYmVpbmcgZW1wdHkuCisgICAgICovCisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ICA9IGNoYW5uZWxfbGF5b3V0c1tjaGFubmVsX2xheW91dF07CisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgICA9ICAgICAgICBjaGFubmVsc1tjaGFubmVsX2xheW91dF07CisgICAgaWYgKCFhdmN0eC0+Y2hhbm5lbHMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZXNlcnZlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKCVkKVxuIiwKKyAgICAgICAgICAgICAgIGNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZjdHgtPmJpdF9yYXRlID0gRkZBTElHTihhdmN0eC0+Y2hhbm5lbHMsIDIpICogYXZjdHgtPnNhbXBsZV9yYXRlICoKKyAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworCisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwKKyAgICAgICAgICAgICAgICAicGNtX2JsdXJheV9wYXJzZV9oZWFkZXI6ICVkIGNoYW5uZWxzLCAlZCBiaXRzIHBlciBzYW1wbGUsICVkIEh6LCAlZCBiaXQvc1xuIiwKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMsIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsCisgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlLCBhdmN0eC0+Yml0X3JhdGUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjbV9ibHVyYXlfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBpbnQgbnVtX3NvdXJjZV9jaGFubmVscywgY2hhbm5lbCwgcmV0dmFsOworICAgIGludCBzYW1wbGVfc2l6ZSwgc2FtcGxlczsKKyAgICBpbnQxNl90ICpkc3QxNjsKKyAgICBpbnQzMl90ICpkc3QzMjsKKworICAgIGlmIChidWZfc2l6ZSA8IDQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQQ00gcGFja2V0IHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0dmFsID0gcGNtX2JsdXJheV9wYXJzZV9oZWFkZXIoYXZjdHgsIHNyYykpKQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIHNyYyArPSA0OworICAgIGJ1Zl9zaXplIC09IDQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgc3JjLCBidWZfc2l6ZSk7CisKKyAgICAvKiBUaGVyZSdzIGFsd2F5cyBhbiBldmVuIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgc291cmNlICovCisgICAgbnVtX3NvdXJjZV9jaGFubmVscyA9IEZGQUxJR04oYXZjdHgtPmNoYW5uZWxzLCAyKTsKKyAgICBzYW1wbGVfc2l6ZSA9IChudW1fc291cmNlX2NoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAoYXZjdHgtPnNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTYgPyAxNiA6IDI0KSkgPj4gMzsKKyAgICBzYW1wbGVzID0gYnVmX3NpemUgLyBzYW1wbGVfc2l6ZTsKKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBzYW1wbGVzOworICAgIGlmICgocmV0dmFsID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgZHN0MTYgPSAoaW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdOworICAgIGRzdDMyID0gKGludDMyX3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIGlmIChzYW1wbGVzKSB7CisgICAgICAgIHN3aXRjaCAoYXZjdHgtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgICAgICAvKiBjYXNlcyB3aXRoIHNhbWUgbnVtYmVyIG9mIHNvdXJjZSBhbmQgY29kZWQgY2hhbm5lbHMgKi8KKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfU1RFUkVPOgorICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF80UE9JTlQwOgorICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF8yXzI6CisgICAgICAgICAgICBzYW1wbGVzICo9IG51bV9zb3VyY2VfY2hhbm5lbHM7CisgICAgICAgICAgICBpZiAoQVZfU0FNUExFX0ZNVF9TMTYgPT0gYXZjdHgtPnNhbXBsZV9mbXQpIHsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmdiLCBkc3QxNiwgYnVmX3NpemUpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICpkc3QxNisrID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZnYik7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1zYW1wbGVzKTsKKyNlbmRpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICpkc3QzMisrID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZnYikgPDwgODsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXNhbXBsZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIGNhc2VzIHdoZXJlIG51bWJlciBvZiBzb3VyY2UgY2hhbm5lbHMgPSBjb2RlZCBjaGFubmVscyArIDEgKi8KKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfTU9OTzoKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfU1VSUk9VTkQ6CisgICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzJfMToKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfNVBPSU5UMDoKKyAgICAgICAgICAgIGlmIChBVl9TQU1QTEVfRk1UX1MxNiA9PSBhdmN0eC0+c2FtcGxlX2ZtdCkgeworICAgICAgICAgICAgICAgIGRvIHsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnYiwgZHN0MTYsIGF2Y3R4LT5jaGFubmVscyAqIDIpOworICAgICAgICAgICAgICAgICAgICBkc3QxNiArPSBhdmN0eC0+Y2hhbm5lbHM7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZHN0MTYrKyA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNoYW5uZWwpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAyKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXNhbXBsZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBhdmN0eC0+Y2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkc3QzMisrID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZnYikgPDwgODsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDMpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tc2FtcGxlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIHJlbWFwcGluZzogTCwgUiwgQywgTEJhY2ssIFJCYWNrLCBMRiAqLworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF81UE9JTlQxOgorICAgICAgICAgICAgaWYgKEFWX1NBTVBMRV9GTVRfUzE2ID09IGF2Y3R4LT5zYW1wbGVfZm10KSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBkc3QxNlswXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNlsxXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNlsyXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNls0XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNls1XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNlszXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNiArPSA2OworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tc2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0MzJbMF0gPSBieXRlc3RyZWFtMl9nZXRfYmUyNHUoJmdiKSA8PCA4OworICAgICAgICAgICAgICAgICAgICBkc3QzMlsxXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0dSgmZ2IpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIGRzdDMyWzJdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZnYikgPDwgODsKKyAgICAgICAgICAgICAgICAgICAgZHN0MzJbNF0gPSBieXRlc3RyZWFtMl9nZXRfYmUyNHUoJmdiKSA8PCA4OworICAgICAgICAgICAgICAgICAgICBkc3QzMls1XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0dSgmZ2IpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIGRzdDMyWzNdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZnYikgPDwgODsKKyAgICAgICAgICAgICAgICAgICAgZHN0MzIgKz0gNjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXNhbXBsZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiByZW1hcHBpbmc6IEwsIFIsIEMsIExTaWRlLCBMQmFjaywgUkJhY2ssIFJTaWRlLCA8dW51c2VkPiAqLworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF83UE9JTlQwOgorICAgICAgICAgICAgaWYgKEFWX1NBTVBMRV9GTVRfUzE2ID09IGF2Y3R4LT5zYW1wbGVfZm10KSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBkc3QxNlswXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNlsxXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNlsyXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNls1XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNlszXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNls0XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNls2XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNiArPSA3OworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgMik7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1zYW1wbGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBkc3QzMlswXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0dSgmZ2IpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIGRzdDMyWzFdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZnYikgPDwgODsKKyAgICAgICAgICAgICAgICAgICAgZHN0MzJbMl0gPSBieXRlc3RyZWFtMl9nZXRfYmUyNHUoJmdiKSA8PCA4OworICAgICAgICAgICAgICAgICAgICBkc3QzMls1XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0dSgmZ2IpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIGRzdDMyWzNdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZnYikgPDwgODsKKyAgICAgICAgICAgICAgICAgICAgZHN0MzJbNF0gPSBieXRlc3RyZWFtMl9nZXRfYmUyNHUoJmdiKSA8PCA4OworICAgICAgICAgICAgICAgICAgICBkc3QzMls2XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0dSgmZ2IpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIGRzdDMyICs9IDc7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAzKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXNhbXBsZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiByZW1hcHBpbmc6IEwsIFIsIEMsIExTaWRlLCBMQmFjaywgUkJhY2ssIFJTaWRlLCBMRiAqLworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF83UE9JTlQxOgorICAgICAgICAgICAgaWYgKEFWX1NBTVBMRV9GTVRfUzE2ID09IGF2Y3R4LT5zYW1wbGVfZm10KSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBkc3QxNlswXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNlsxXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNlsyXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNls2XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNls0XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNls1XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNls3XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNlszXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBkc3QxNiArPSA4OworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tc2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0MzJbMF0gPSBieXRlc3RyZWFtMl9nZXRfYmUyNHUoJmdiKSA8PCA4OworICAgICAgICAgICAgICAgICAgICBkc3QzMlsxXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0dSgmZ2IpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIGRzdDMyWzJdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZnYikgPDwgODsKKyAgICAgICAgICAgICAgICAgICAgZHN0MzJbNl0gPSBieXRlc3RyZWFtMl9nZXRfYmUyNHUoJmdiKSA8PCA4OworICAgICAgICAgICAgICAgICAgICBkc3QzMls0XSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0dSgmZ2IpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIGRzdDMyWzVdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZnYikgPDwgODsKKyAgICAgICAgICAgICAgICAgICAgZHN0MzJbN10gPSBieXRlc3RyZWFtMl9nZXRfYmUyNHUoJmdiKSA8PCA4OworICAgICAgICAgICAgICAgICAgICBkc3QzMlszXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0dSgmZ2IpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIGRzdDMyICs9IDg7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1zYW1wbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dmFsID0gYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpOworICAgIGlmIChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19CSVRTVFJFQU0pCisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJwY21fYmx1cmF5X2RlY29kZV9mcmFtZTogZGVjb2RlZCAlZCAtPiAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICByZXR2YWwsIGJ1Zl9zaXplKTsKKyAgICByZXR1cm4gcmV0dmFsICsgNDsKK30KKworQVZDb2RlYyBmZl9wY21fYmx1cmF5X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInBjbV9ibHVyYXkiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gc2lnbmVkIDE2fDIwfDI0LWJpdCBiaWctZW5kaWFuIGZvciBCbHUtcmF5IG1lZGlhIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9CTFVSQVksCisgICAgLmRlY29kZSAgICAgICAgID0gcGNtX2JsdXJheV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfUzMyLCBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BjbS1kdmQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BjbS1kdmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDE4NGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGNtLWR2ZC5jCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogTFBDTSBjb2RlY3MgZm9yIFBDTSBmb3JtYXRzIGZvdW5kIGluIFZpZGVvIERWRCBzdHJlYW1zCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hyaXN0aWFuIFNjaG1pZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTFBDTSBjb2RlY3MgZm9yIFBDTSBmb3JtYXRzIGZvdW5kIGluIFZpZGVvIERWRCBzdHJlYW1zCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUENNRFZEQ29udGV4dCB7CisgICAgdWludDMyX3QgbGFzdF9oZWFkZXI7ICAgIC8vIENhY2hlZCBoZWFkZXIgdG8gc2VlIGlmIHBhcnNpbmcgaXMgbmVlZGVkCisgICAgaW50IGJsb2NrX3NpemU7ICAgICAgICAgIC8vIFNpemUgb2YgYSBibG9jayBvZiBzYW1wbGVzIGluIGJ5dGVzCisgICAgaW50IGxhc3RfYmxvY2tfc2l6ZTsgICAgIC8vIFNpemUgb2YgdGhlIGxhc3QgYmxvY2sgb2Ygc2FtcGxlcyBpbiBieXRlcworICAgIGludCBzYW1wbGVzX3Blcl9ibG9jazsgICAvLyBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCBwZXIgYmxvY2sKKyAgICBpbnQgZ3JvdXBzX3Blcl9ibG9jazsgICAgLy8gTnVtYmVyIG9mIDIwLzI0Yml0IHNhbXBsZSBncm91cHMgcGVyIGJsb2NrCisgICAgdWludDhfdCAqZXh0cmFfc2FtcGxlczsgIC8vIFBvaW50ZXIgdG8gbGVmdG92ZXIgc2FtcGxlcyBmcm9tIGEgZnJhbWUKKyAgICBpbnQgZXh0cmFfc2FtcGxlX2NvdW50OyAgLy8gTnVtYmVyIG9mIGxlZnRvdmVyIHNhbXBsZXMgaW4gdGhlIGJ1ZmZlcgorfSBQQ01EVkRDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgcGNtX2R2ZF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUENNRFZEQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICAvKiBJbnZhbGlkIGhlYWRlciB0byBmb3JjZSBwYXJzaW5nIG9mIHRoZSBmaXJzdCBoZWFkZXIgKi8KKyAgICBzLT5sYXN0X2hlYWRlciA9IC0xOworICAgIC8qIHJlc2VydmUgc3BhY2UgZm9yIDggY2hhbm5lbHMsIDMgYnl0ZXMvc2FtcGxlLCA0IHNhbXBsZXMvYmxvY2sgKi8KKyAgICBpZiAoIShzLT5leHRyYV9zYW1wbGVzID0gYXZfbWFsbG9jKDggKiAzICogNCkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBwY21fZHZkX2RlY29kZV91bmluaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFBDTURWRENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJnMtPmV4dHJhX3NhbXBsZXMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNtX2R2ZF9wYXJzZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpoZWFkZXIpCit7CisgICAgLyogbm8gdHJhY2VzIG9mIDQ0MTAwIGFuZCAzMjAwMEh6IGluIGFueSBjb21tZXJjaWFsIHNvZnR3YXJlIG9yIHBsYXllciAqLworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBmcmVxdWVuY2llc1s0XSA9IHsgNDgwMDAsIDk2MDAwLCA0NDEwMCwgMzIwMDAgfTsKKyAgICBQQ01EVkRDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaGVhZGVyX2ludCA9IChoZWFkZXJbMF0gJiAweGUwKSB8IChoZWFkZXJbMV0gPDwgOCkgfCAoaGVhZGVyWzJdIDw8IDE2KTsKKworICAgIC8qIGVhcmx5IGV4aXQgaWYgdGhlIGhlYWRlciBkaWRuJ3QgY2hhbmdlIGFwYXJ0IGZyb20gdGhlIGZyYW1lIG51bWJlciAqLworICAgIGlmIChzLT5sYXN0X2hlYWRlciA9PSBoZWFkZXJfaW50KQorICAgICAgICByZXR1cm4gMDsKKyAgICBzLT5sYXN0X2hlYWRlciA9IC0xOworCisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgInBjbV9kdmRfcGFyc2VfaGVhZGVyOiBoZWFkZXIgPSAlMDJ4JTAyeCUwMnhcbiIsCisgICAgICAgICAgICAgICAgaGVhZGVyWzBdLCBoZWFkZXJbMV0sIGhlYWRlclsyXSk7CisgICAgLyoKKyAgICAgKiBoZWFkZXJbMF0gZW1waGFzaXMgKDEpLCBtdXNlKDEpLCByZXNlcnZlZCgxKSwgZnJhbWUgbnVtYmVyKDUpCisgICAgICogaGVhZGVyWzFdIHF1YW50ICgyKSwgZnJlcSgyKSwgcmVzZXJ2ZWQoMSksIGNoYW5uZWxzKDMpCisgICAgICogaGVhZGVyWzJdIGR5bmFtaWMgcmFuZ2UgY29udHJvbCAoMHg4MCA9IG9mZikKKyAgICAgKi8KKworICAgIC8qIERpc2NhcmQgcG90ZW50aWFsbHkgZXhpc3RpbmcgbGVmdG92ZXIgc2FtcGxlcyBmcm9tIG9sZCBjaGFubmVsIGxheW91dCAqLworICAgIHMtPmV4dHJhX3NhbXBsZV9jb3VudCA9IDA7CisKKyAgICAvKiBnZXQgdGhlIHNhbXBsZSBkZXB0aCBhbmQgZGVyaXZlIHRoZSBzYW1wbGUgZm9ybWF0IGZyb20gaXQgKi8KKyAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTYgKyAoaGVhZGVyWzFdID4+IDYgJiAzKSAqIDQ7CisgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMjgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiUENNIERWRCB1bnN1cHBvcnRlZCBzYW1wbGUgZGVwdGggJWlcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNiA/IEFWX1NBTVBMRV9GTVRfUzE2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZfU0FNUExFX0ZNVF9TMzI7CisgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworCisgICAgLyogZ2V0IHRoZSBzYW1wbGUgcmF0ZSAqLworICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IGZyZXF1ZW5jaWVzW2hlYWRlclsxXSA+PiA0ICYgM107CisKKyAgICAvKiBnZXQgdGhlIG51bWJlciBvZiBjaGFubmVscyAqLworICAgIGF2Y3R4LT5jaGFubmVscyA9IDEgKyAoaGVhZGVyWzFdICYgNyk7CisgICAgLyogY2FsY3VsYXRlIHRoZSBiaXRyYXRlICovCisgICAgYXZjdHgtPmJpdF9yYXRlID0gYXZjdHgtPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgKgorICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisKKyAgICAvKiA0IHNhbXBsZXMgZm9ybSBhIGdyb3VwIGluIDIwLzI0Yml0IFBDTSBvbiBEVkQgVmlkZW8uCisgICAgICogQSBibG9jayBpcyBmb3JtZWQgYnkgdGhlIG51bWJlciBvZiBncm91cHMgdGhhdCBhcmUKKyAgICAgKiBuZWVkZWQgdG8gY29tcGxldGUgYSBzZXQgb2Ygc2FtcGxlcyBmb3IgZWFjaCBjaGFubmVsLiAqLworICAgIGlmIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDE2KSB7CisgICAgICAgIHMtPnNhbXBsZXNfcGVyX2Jsb2NrID0gMTsKKyAgICAgICAgcy0+YmxvY2tfc2l6ZSAgICAgICAgPSBhdmN0eC0+Y2hhbm5lbHMgKiAyOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoYXZjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAvKiBvbmUgZ3JvdXAgaGFzIGFsbCB0aGUgc2FtcGxlcyBuZWVkZWQgKi8KKyAgICAgICAgICAgIHMtPmJsb2NrX3NpemUgICAgICAgID0gNCAqIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgLyA4OworICAgICAgICAgICAgcy0+c2FtcGxlc19wZXJfYmxvY2sgPSA0IC8gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICAgICAgcy0+Z3JvdXBzX3Blcl9ibG9jayAgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIC8qIHR3byBncm91cHMgaGF2ZSBhbGwgdGhlIHNhbXBsZXMgbmVlZGVkICovCisgICAgICAgICAgICBzLT5ibG9ja19zaXplICAgICAgICA9IDggKiBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC8gODsKKyAgICAgICAgICAgIHMtPnNhbXBsZXNfcGVyX2Jsb2NrID0gMTsKKyAgICAgICAgICAgIHMtPmdyb3Vwc19wZXJfYmxvY2sgID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogbmVlZCBhdmN0eC0+Y2hhbm5lbHMgZ3JvdXBzICovCisgICAgICAgICAgICBzLT5ibG9ja19zaXplICAgICAgICA9IDQgKiBhdmN0eC0+Y2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC8gODsKKyAgICAgICAgICAgIHMtPnNhbXBsZXNfcGVyX2Jsb2NrID0gNDsKKyAgICAgICAgICAgIHMtPmdyb3Vwc19wZXJfYmxvY2sgID0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICBhdl9kbG9nKGF2Y3R4LAorICAgICAgICAgICAgICAgICJwY21fZHZkX3BhcnNlX2hlYWRlcjogJWQgY2hhbm5lbHMsICVkIGJpdHMgcGVyIHNhbXBsZSwgJWQgSHosICVkIGJpdC9zXG4iLAorICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscywgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSwKKyAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUsIGF2Y3R4LT5iaXRfcmF0ZSk7CisKKyAgICBzLT5sYXN0X2hlYWRlciA9IGhlYWRlcl9pbnQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKnBjbV9kdmRfZGVjb2RlX3NhbXBsZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkc3QsIGludCBibG9ja3MpCit7CisgICAgUENNRFZEQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50MTZfdCAqZHN0MTYgICA9IGRzdDsKKyAgICBpbnQzMl90ICpkc3QzMiAgID0gZHN0OworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIGludCBpOworICAgIHVpbnQ4X3QgdDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBzcmMsIGJsb2NrcyAqIHMtPmJsb2NrX3NpemUpOworICAgIHN3aXRjaCAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgIGNhc2UgMTY6IHsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnYiwgZHN0MTYsIGJsb2NrcyAqIHMtPmJsb2NrX3NpemUpOworICAgICAgICBkc3QxNiArPSBibG9ja3MgKiBzLT5ibG9ja19zaXplIC8gMjsKKyNlbHNlCisgICAgICAgIGludCBzYW1wbGVzID0gYmxvY2tzICogYXZjdHgtPmNoYW5uZWxzOworICAgICAgICBkbyB7CisgICAgICAgICAgICAqZHN0MTYrKyA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpOworICAgICAgICB9IHdoaWxlICgtLXNhbXBsZXMpOworI2VuZGlmCisgICAgICAgIHJldHVybiBkc3QxNjsKKyAgICB9CisgICAgY2FzZSAyMDoKKyAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA9PSAxKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMjsgaTsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdDMyWzBdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZnYikgPDwgMTY7CisgICAgICAgICAgICAgICAgICAgIGRzdDMyWzFdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZnYikgPDwgMTY7CisgICAgICAgICAgICAgICAgICAgIHQgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICAgICAgKmRzdDMyKysgKz0gKHQgJiAweGYwKSA8PCA4OworICAgICAgICAgICAgICAgICAgICAqZHN0MzIrKyArPSAodCAmIDB4MGYpIDw8IDEyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKC0tYmxvY2tzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZm9yIChpID0gcy0+Z3JvdXBzX3Blcl9ibG9jazsgaTsgaS0tKSB7CisgICAgICAgICAgICAgICAgZHN0MzJbMF0gPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJmdiKSA8PCAxNjsKKyAgICAgICAgICAgICAgICBkc3QzMlsxXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpIDw8IDE2OworICAgICAgICAgICAgICAgIGRzdDMyWzJdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZnYikgPDwgMTY7CisgICAgICAgICAgICAgICAgZHN0MzJbM10gPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJmdiKSA8PCAxNjsKKyAgICAgICAgICAgICAgICB0ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgICAgICAgICAgKmRzdDMyKysgKz0gKHQgJiAweGYwKSA8PCA4OworICAgICAgICAgICAgICAgICpkc3QzMisrICs9ICh0ICYgMHgwZikgPDwgMTI7CisgICAgICAgICAgICAgICAgdCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgICAgICpkc3QzMisrICs9ICh0ICYgMHhmMCkgPDwgODsKKyAgICAgICAgICAgICAgICAqZHN0MzIrKyArPSAodCAmIDB4MGYpIDw8IDEyOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgtLWJsb2Nrcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRzdDMyOworICAgIGNhc2UgMjQ6CisgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPT0gMSkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGZvciAoaSA9IDI7IGk7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBkc3QzMlswXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpIDw8IDE2OworICAgICAgICAgICAgICAgICAgICBkc3QzMlsxXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpIDw8IDE2OworICAgICAgICAgICAgICAgICAgICAqZHN0MzIrKyArPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKSA8PCA4OworICAgICAgICAgICAgICAgICAgICAqZHN0MzIrKyArPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKSA8PCA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKC0tYmxvY2tzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZm9yIChpID0gcy0+Z3JvdXBzX3Blcl9ibG9jazsgaTsgaS0tKSB7CisgICAgICAgICAgICAgICAgZHN0MzJbMF0gPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJmdiKSA8PCAxNjsKKyAgICAgICAgICAgICAgICBkc3QzMlsxXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmZ2IpIDw8IDE2OworICAgICAgICAgICAgICAgIGRzdDMyWzJdID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZnYikgPDwgMTY7CisgICAgICAgICAgICAgICAgZHN0MzJbM10gPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJmdiKSA8PCAxNjsKKyAgICAgICAgICAgICAgICAqZHN0MzIrKyArPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKSA8PCA4OworICAgICAgICAgICAgICAgICpkc3QzMisrICs9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpIDw8IDg7CisgICAgICAgICAgICAgICAgKmRzdDMyKysgKz0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYikgPDwgODsKKyAgICAgICAgICAgICAgICAqZHN0MzIrKyArPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKSA8PCA4OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgtLWJsb2Nrcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRzdDMyOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworc3RhdGljIGludCBwY21fZHZkX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lICAgICA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqc3JjID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgUENNRFZEQ29udGV4dCAqcyAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0dmFsOworICAgIGludCBibG9ja3M7CisgICAgdm9pZCAqZHN0OworCisgICAgaWYgKGJ1Zl9zaXplIDwgMykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBDTSBwYWNrZXQgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXR2YWwgPSBwY21fZHZkX3BhcnNlX2hlYWRlcihhdmN0eCwgc3JjKSkpCisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgaWYgKHMtPmxhc3RfYmxvY2tfc2l6ZSAmJiBzLT5sYXN0X2Jsb2NrX3NpemUgIT0gcy0+YmxvY2tfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiYmxvY2tfc2l6ZSBoYXMgY2hhbmdlZCAlZCAhPSAlZFxuIiwgcy0+bGFzdF9ibG9ja19zaXplLCBzLT5ibG9ja19zaXplKTsKKyAgICAgICAgcy0+ZXh0cmFfc2FtcGxlX2NvdW50ID0gMDsKKyAgICB9CisgICAgcy0+bGFzdF9ibG9ja19zaXplID0gcy0+YmxvY2tfc2l6ZTsKKyAgICBzcmMgICAgICArPSAzOworICAgIGJ1Zl9zaXplIC09IDM7CisKKyAgICBibG9ja3MgPSAoYnVmX3NpemUgKyBzLT5leHRyYV9zYW1wbGVfY291bnQpIC8gcy0+YmxvY2tfc2l6ZTsKKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBibG9ja3MgKiBzLT5zYW1wbGVzX3Blcl9ibG9jazsKKyAgICBpZiAoKHJldHZhbCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIGRzdCA9IGZyYW1lLT5kYXRhWzBdOworCisgICAgLyogY29uc3VtZSBsZWZ0b3ZlciBzYW1wbGVzIGZyb20gbGFzdCBwYWNrZXQgKi8KKyAgICBpZiAocy0+ZXh0cmFfc2FtcGxlX2NvdW50KSB7CisgICAgICAgIGludCBtaXNzaW5nX3NhbXBsZXMgPSBzLT5ibG9ja19zaXplIC0gcy0+ZXh0cmFfc2FtcGxlX2NvdW50OworICAgICAgICBpZiAoYnVmX3NpemUgPj0gbWlzc2luZ19zYW1wbGVzKSB7CisgICAgICAgICAgICBtZW1jcHkocy0+ZXh0cmFfc2FtcGxlcyArIHMtPmV4dHJhX3NhbXBsZV9jb3VudCwgc3JjLAorICAgICAgICAgICAgICAgICAgIG1pc3Npbmdfc2FtcGxlcyk7CisgICAgICAgICAgICBkc3QgPSBwY21fZHZkX2RlY29kZV9zYW1wbGVzKGF2Y3R4LCBzLT5leHRyYV9zYW1wbGVzLCBkc3QsIDEpOworICAgICAgICAgICAgc3JjICs9IG1pc3Npbmdfc2FtcGxlczsKKyAgICAgICAgICAgIGJ1Zl9zaXplIC09IG1pc3Npbmdfc2FtcGxlczsKKyAgICAgICAgICAgIHMtPmV4dHJhX3NhbXBsZV9jb3VudCA9IDA7CisgICAgICAgICAgICBibG9ja3MtLTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5ldyBwYWNrZXQgc3RpbGwgZG9lc24ndCBoYXZlIGVub3VnaCBzYW1wbGVzICovCisgICAgICAgICAgICBtZW1jcHkocy0+ZXh0cmFfc2FtcGxlcyArIHMtPmV4dHJhX3NhbXBsZV9jb3VudCwgc3JjLCBidWZfc2l6ZSk7CisgICAgICAgICAgICBzLT5leHRyYV9zYW1wbGVfY291bnQgKz0gYnVmX3NpemU7CisgICAgICAgICAgICByZXR1cm4gYXZwa3QtPnNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBkZWNvZGUgcmVtYWluaW5nIGNvbXBsZXRlIHNhbXBsZXMgKi8KKyAgICBpZiAoYmxvY2tzKSB7CisgICAgICAgIHBjbV9kdmRfZGVjb2RlX3NhbXBsZXMoYXZjdHgsIHNyYywgZHN0LCBibG9ja3MpOworICAgICAgICBidWZfc2l6ZSAtPSBibG9ja3MgKiBzLT5ibG9ja19zaXplOworICAgIH0KKworICAgIC8qIHN0b3JlIGxlZnRvdmVyIHNhbXBsZXMgKi8KKyAgICBpZiAoYnVmX3NpemUpIHsKKyAgICAgICAgc3JjICs9IGJsb2NrcyAqIHMtPmJsb2NrX3NpemU7CisgICAgICAgIG1lbWNweShzLT5leHRyYV9zYW1wbGVzLCBzcmMsIGJ1Zl9zaXplKTsKKyAgICAgICAgcy0+ZXh0cmFfc2FtcGxlX2NvdW50ID0gYnVmX3NpemU7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX3BjbV9kdmRfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicGNtX2R2ZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgMTZ8MjB8MjQtYml0IGJpZy1lbmRpYW4gZm9yIERWRCBtZWRpYSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fRFZELAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQQ01EVkRDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBwY21fZHZkX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IHBjbV9kdmRfZGVjb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IHBjbV9kdmRfZGVjb2RlX3VuaW5pdCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfUzMyLCBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9Cit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcGNtLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTRhZDBiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGNtLmMKQEAgLTAsMCArMSw1NzEgQEAKKy8qCisgKiBQQ00gY29kZWNzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFBDTSBjb2RlY3MKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgInBjbV90YWJsZWdlbi5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgcGNtX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IDA7CisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWMtPmlkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fQUxBVzoKKyAgICAgICAgcGNtX2FsYXdfdGFibGVpbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX01VTEFXOgorICAgICAgICBwY21fdWxhd190YWJsZWluaXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoYXZjdHgtPmNvZGVjLT5pZCk7CisgICAgYXZjdHgtPmJsb2NrX2FsaWduICAgICAgICAgICA9IGF2Y3R4LT5jaGFubmVscyAqIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgLyA4OworICAgIGF2Y3R4LT5iaXRfcmF0ZSAgICAgICAgICAgICAgPSBhdmN0eC0+YmxvY2tfYWxpZ24gKiBhdmN0eC0+c2FtcGxlX3JhdGUgKiA4OworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogV3JpdGUgUENNIHNhbXBsZXMgbWFjcm8KKyAqIEBwYXJhbSB0eXBlICAgRGF0YXR5cGUgb2YgbmF0aXZlIG1hY2hpbmUgZm9ybWF0CisgKiBAcGFyYW0gZW5kaWFuIGJ5dGVzdHJlYW1fcHV0X3h4eCgpIHN1ZmZpeAorICogQHBhcmFtIHNyYyAgICBTb3VyY2UgcG9pbnRlciAodmFyaWFibGUgbmFtZSkKKyAqIEBwYXJhbSBkc3QgICAgRGVzdGluYXRpb24gcG9pbnRlciAodmFyaWFibGUgbmFtZSkKKyAqIEBwYXJhbSBuICAgICAgVG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgKHZhcmlhYmxlIG5hbWUpCisgKiBAcGFyYW0gc2hpZnQgIEJpdHNoaWZ0IChiaXRzKQorICogQHBhcmFtIG9mZnNldCBTYW1wbGUgdmFsdWUgb2Zmc2V0CisgKi8KKyNkZWZpbmUgRU5DT0RFKHR5cGUsIGVuZGlhbiwgc3JjLCBkc3QsIG4sIHNoaWZ0LCBvZmZzZXQpICAgICAgICAgICAgICAgIFwKKyAgICBzYW1wbGVzXyAjIyB0eXBlID0gKGNvbnN0IHR5cGUgKikgc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKDsgbiA+IDA7IG4tLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVnaXN0ZXIgdHlwZSB2ID0gKCpzYW1wbGVzXyAjIyB0eXBlKysgPj4gc2hpZnQpICsgb2Zmc2V0OyAgICAgIFwKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfICMjIGVuZGlhbigmZHN0LCB2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgRU5DT0RFX1BMQU5BUih0eXBlLCBlbmRpYW4sIGRzdCwgbiwgc2hpZnQsIG9mZnNldCkgICAgICAgICAgICAgIFwKKyAgICBuIC89IGF2Y3R4LT5jaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGMgPSAwOyBjIDwgYXZjdHgtPmNoYW5uZWxzOyBjKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2FtcGxlc18gIyMgdHlwZSA9IChjb25zdCB0eXBlICopIGZyYW1lLT5leHRlbmRlZF9kYXRhW2NdOyAgICAgIFwKKyAgICAgICAgZm9yIChpID0gbjsgaSA+IDA7IGktLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlZ2lzdGVyIHR5cGUgdiA9ICgqc2FtcGxlc18gIyMgdHlwZSsrID4+IHNoaWZ0KSArIG9mZnNldDsgIFwKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0XyAjIyBlbmRpYW4oJmRzdCwgdik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK3N0YXRpYyBpbnQgcGNtX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBpbnQgbiwgYywgc2FtcGxlX3NpemUsIHYsIHJldDsKKyAgICBjb25zdCBzaG9ydCAqc2FtcGxlczsKKyAgICB1bnNpZ25lZCBjaGFyICpkc3Q7CisgICAgY29uc3QgdWludDhfdCAqc2FtcGxlc191aW50OF90OworICAgIGNvbnN0IGludDE2X3QgKnNhbXBsZXNfaW50MTZfdDsKKyAgICBjb25zdCBpbnQzMl90ICpzYW1wbGVzX2ludDMyX3Q7CisgICAgY29uc3QgaW50NjRfdCAqc2FtcGxlc19pbnQ2NF90OworICAgIGNvbnN0IHVpbnQxNl90ICpzYW1wbGVzX3VpbnQxNl90OworICAgIGNvbnN0IHVpbnQzMl90ICpzYW1wbGVzX3VpbnQzMl90OworCisgICAgc2FtcGxlX3NpemUgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGF2Y3R4LT5jb2RlYy0+aWQpIC8gODsKKyAgICBuICAgICAgICAgICA9IGZyYW1lLT5uYl9zYW1wbGVzICogYXZjdHgtPmNoYW5uZWxzOworICAgIHNhbXBsZXMgICAgID0gKGNvbnN0IHNob3J0ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBuICogc2FtcGxlX3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZHN0ID0gYXZwa3QtPmRhdGE7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlYy0+aWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMzJMRToKKyAgICAgICAgRU5DT0RFKHVpbnQzMl90LCBsZTMyLCBzYW1wbGVzLCBkc3QsIG4sIDAsIDB4ODAwMDAwMDApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1UzMkJFOgorICAgICAgICBFTkNPREUodWludDMyX3QsIGJlMzIsIHNhbXBsZXMsIGRzdCwgbiwgMCwgMHg4MDAwMDAwMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzI0TEU6CisgICAgICAgIEVOQ09ERShpbnQzMl90LCBsZTI0LCBzYW1wbGVzLCBkc3QsIG4sIDgsIDApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MyNExFX1BMQU5BUjoKKyAgICAgICAgRU5DT0RFX1BMQU5BUihpbnQzMl90LCBsZTI0LCBkc3QsIG4sIDgsIDApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MyNEJFOgorICAgICAgICBFTkNPREUoaW50MzJfdCwgYmUyNCwgc2FtcGxlcywgZHN0LCBuLCA4LCAwKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMjRMRToKKyAgICAgICAgRU5DT0RFKHVpbnQzMl90LCBsZTI0LCBzYW1wbGVzLCBkc3QsIG4sIDgsIDB4ODAwMDAwKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMjRCRToKKyAgICAgICAgRU5DT0RFKHVpbnQzMl90LCBiZTI0LCBzYW1wbGVzLCBkc3QsIG4sIDgsIDB4ODAwMDAwKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjREQVVEOgorICAgICAgICBmb3IgKDsgbiA+IDA7IG4tLSkgeworICAgICAgICAgICAgdWludDMyX3QgdG1wID0gZmZfcmV2ZXJzZVsoKnNhbXBsZXMgPj4gOCkgJiAweGZmXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmZfcmV2ZXJzZVsqc2FtcGxlcyAmIDB4ZmZdIDw8IDgpOworICAgICAgICAgICAgdG1wIDw8PSA0OyAvLyBzeW5jIGZsYWdzIHdvdWxkIGdvIGhlcmUKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMjQoJmRzdCwgdG1wKTsKKyAgICAgICAgICAgIHNhbXBsZXMrKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMTZMRToKKyAgICAgICAgRU5DT0RFKHVpbnQxNl90LCBsZTE2LCBzYW1wbGVzLCBkc3QsIG4sIDAsIDB4ODAwMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTE2QkU6CisgICAgICAgIEVOQ09ERSh1aW50MTZfdCwgYmUxNiwgc2FtcGxlcywgZHN0LCBuLCAwLCAweDgwMDApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M4OgorICAgICAgICBFTkNPREUodWludDhfdCwgYnl0ZSwgc2FtcGxlcywgZHN0LCBuLCAwLCAtMTI4KQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TOF9QTEFOQVI6CisgICAgICAgIEVOQ09ERV9QTEFOQVIodWludDhfdCwgYnl0ZSwgZHN0LCBuLCAwLCAtMTI4KQorICAgICAgICBicmVhazsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NExFOgorICAgICAgICBFTkNPREUoaW50NjRfdCwgbGU2NCwgc2FtcGxlcywgZHN0LCBuLCAwLCAwKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMzJMRToKKyAgICAgICAgRU5DT0RFKGludDMyX3QsIGxlMzIsIHNhbXBsZXMsIGRzdCwgbiwgMCwgMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyTEVfUExBTkFSOgorICAgICAgICBFTkNPREVfUExBTkFSKGludDMyX3QsIGxlMzIsIGRzdCwgbiwgMCwgMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU6CisgICAgICAgIEVOQ09ERShpbnQxNl90LCBsZTE2LCBzYW1wbGVzLCBkc3QsIG4sIDAsIDApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkxFX1BMQU5BUjoKKyAgICAgICAgRU5DT0RFX1BMQU5BUihpbnQxNl90LCBsZTE2LCBkc3QsIG4sIDAsIDApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NEJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MzMkJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkJFOgorI2Vsc2UKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRCRToKKyAgICAgICAgRU5DT0RFKGludDY0X3QsIGJlNjQsIHNhbXBsZXMsIGRzdCwgbiwgMCwgMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjMyQkU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyQkU6CisgICAgICAgIEVOQ09ERShpbnQzMl90LCBiZTMyLCBzYW1wbGVzLCBkc3QsIG4sIDAsIDApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkJFOgorICAgICAgICBFTkNPREUoaW50MTZfdCwgYmUxNiwgc2FtcGxlcywgZHN0LCBuLCAwLCAwKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZCRV9QTEFOQVI6CisgICAgICAgIEVOQ09ERV9QTEFOQVIoaW50MTZfdCwgYmUxNiwgZHN0LCBuLCAwLCAwKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMzJMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRToKKyNlbmRpZiAvKiBIQVZFX0JJR0VORElBTiAqLworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1U4OgorICAgICAgICBtZW1jcHkoZHN0LCBzYW1wbGVzLCBuICogc2FtcGxlX3NpemUpOworICAgICAgICBicmVhazsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkJFX1BMQU5BUjoKKyNlbHNlCisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEVfUExBTkFSOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MzMkxFX1BMQU5BUjoKKyNlbmRpZiAvKiBIQVZFX0JJR0VORElBTiAqLworICAgICAgICBuIC89IGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGF2Y3R4LT5jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjXTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmZHN0LCBzcmMsIG4gKiBzYW1wbGVfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fQUxBVzoKKyAgICAgICAgZm9yICg7IG4gPiAwOyBuLS0pIHsKKyAgICAgICAgICAgIHYgICAgICA9ICpzYW1wbGVzKys7CisgICAgICAgICAgICAqZHN0KysgPSBsaW5lYXJfdG9fYWxhd1sodiArIDMyNzY4KSA+PiAyXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9NVUxBVzoKKyAgICAgICAgZm9yICg7IG4gPiAwOyBuLS0pIHsKKyAgICAgICAgICAgIHYgICAgICA9ICpzYW1wbGVzKys7CisgICAgICAgICAgICAqZHN0KysgPSBsaW5lYXJfdG9fdWxhd1sodiArIDMyNzY4KSA+PiAyXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKKyAgICByZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgUENNRGVjb2RlIHsKKyAgICBzaG9ydCAgIHRhYmxlWzI1Nl07Cit9IFBDTURlY29kZTsKKworc3RhdGljIGF2X2NvbGQgaW50IHBjbV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUENNRGVjb2RlICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBDTSBjaGFubmVscyBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0FMQVc6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIHMtPnRhYmxlW2ldID0gYWxhdzJsaW5lYXIoaSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX01VTEFXOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBzLT50YWJsZVtpXSA9IHVsYXcybGluZWFyKGkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IGF2Y3R4LT5jb2RlYy0+c2FtcGxlX2ZtdHNbMF07CisKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIpCisgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShhdmN0eC0+Y29kZWNfaWQpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZCBQQ00gc2FtcGxlcyBtYWNybworICogQHBhcmFtIHNpemUgICBEYXRhIHNpemUgb2YgbmF0aXZlIG1hY2hpbmUgZm9ybWF0CisgKiBAcGFyYW0gZW5kaWFuIGJ5dGVzdHJlYW1fZ2V0X3h4eCgpIGVuZGlhbiBzdWZmaXgKKyAqIEBwYXJhbSBzcmMgICAgU291cmNlIHBvaW50ZXIgKHZhcmlhYmxlIG5hbWUpCisgKiBAcGFyYW0gZHN0ICAgIERlc3RpbmF0aW9uIHBvaW50ZXIgKHZhcmlhYmxlIG5hbWUpCisgKiBAcGFyYW0gbiAgICAgIFRvdGFsIG51bWJlciBvZiBzYW1wbGVzICh2YXJpYWJsZSBuYW1lKQorICogQHBhcmFtIHNoaWZ0ICBCaXRzaGlmdCAoYml0cykKKyAqIEBwYXJhbSBvZmZzZXQgU2FtcGxlIHZhbHVlIG9mZnNldAorICovCisjZGVmaW5lIERFQ09ERShzaXplLCBlbmRpYW4sIHNyYywgZHN0LCBuLCBzaGlmdCwgb2Zmc2V0KSAgICAgICAgICAgICAgICBcCisgICAgZm9yICg7IG4gPiAwOyBuLS0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQgIyMgc2l6ZSAjIyBfdCB2ID0gYnl0ZXN0cmVhbV9nZXRfICMjIGVuZGlhbigmc3JjKTsgICAgICAgICBcCisgICAgICAgIEFWX1dOICMjIHNpemUgIyMgQShkc3QsICh2IC0gb2Zmc2V0KSA8PCBzaGlmdCk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdCArPSBzaXplIC8gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIERFQ09ERV9QTEFOQVIoc2l6ZSwgZW5kaWFuLCBzcmMsIGRzdCwgbiwgc2hpZnQsIG9mZnNldCkgICAgICAgICBcCisgICAgbiAvPSBhdmN0eC0+Y2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChjID0gMDsgYyA8IGF2Y3R4LT5jaGFubmVsczsgYysrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdCA9IGZyYW1lLT5leHRlbmRlZF9kYXRhW2NdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSBuOyBpID4gMDsgaS0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludCAjIyBzaXplICMjIF90IHYgPSBieXRlc3RyZWFtX2dldF8gIyMgZW5kaWFuKCZzcmMpOyAgICAgXAorICAgICAgICAgICAgQVZfV04gIyMgc2l6ZSAjIyBBKGRzdCwgKHYgLSBvZmZzZXQpIDw8IHNoaWZ0KTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0ICs9IHNpemUgLyA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworc3RhdGljIGludCBwY21fZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBQQ01EZWNvZGUgKnMgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lICAgICA9IGRhdGE7CisgICAgaW50IHNhbXBsZV9zaXplLCBjLCBuLCByZXQsIHNhbXBsZXNfcGVyX2Jsb2NrOworICAgIHVpbnQ4X3QgKnNhbXBsZXM7CisgICAgaW50MzJfdCAqZHN0X2ludDMyX3Q7CisKKyAgICBzYW1wbGVfc2l6ZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoYXZjdHgtPmNvZGVjX2lkKSAvIDg7CisKKyAgICAvKiBhdl9nZXRfYml0c19wZXJfc2FtcGxlIHJldHVybnMgMCBmb3IgQVZfQ09ERUNfSURfUENNX0RWRCAqLworICAgIHNhbXBsZXNfcGVyX2Jsb2NrID0gMTsKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9MWEYpIHsKKyAgICAgICAgLyogd2UgcHJvY2VzcyA0MC1iaXQgYmxvY2tzIHBlciBjaGFubmVsIGZvciBMWEYgKi8KKyAgICAgICAgc2FtcGxlc19wZXJfYmxvY2sgPSAyOworICAgICAgICBzYW1wbGVfc2l6ZSAgICAgICA9IDU7CisgICAgfQorCisgICAgaWYgKHNhbXBsZV9zaXplID09IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZV9zaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID09IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVsc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCAhPSBhdmN0eC0+Y29kZWMtPmlkKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiY29kZWMgaWRzIG1pc21hdGNoXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBuID0gYXZjdHgtPmNoYW5uZWxzICogc2FtcGxlX3NpemU7CisKKyAgICBpZiAobiAmJiBidWZfc2l6ZSAlIG4pIHsKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgbikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUENNIHBhY2tldCwgZGF0YSBoYXMgc2l6ZSAlZCBidXQgYXQgbGVhc3QgYSBzaXplIG9mICVkIHdhcyBleHBlY3RlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSwgbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBidWZfc2l6ZSAtPSBidWZfc2l6ZSAlIG47CisgICAgfQorCisgICAgbiA9IGJ1Zl9zaXplIC8gc2FtcGxlX3NpemU7CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gbiAqIHNhbXBsZXNfcGVyX2Jsb2NrIC8gYXZjdHgtPmNoYW5uZWxzOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgc2FtcGxlcyA9IGZyYW1lLT5kYXRhWzBdOworCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMzJMRToKKyAgICAgICAgREVDT0RFKDMyLCBsZTMyLCBzcmMsIHNhbXBsZXMsIG4sIDAsIDB4ODAwMDAwMDApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1UzMkJFOgorICAgICAgICBERUNPREUoMzIsIGJlMzIsIHNyYywgc2FtcGxlcywgbiwgMCwgMHg4MDAwMDAwMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzI0TEU6CisgICAgICAgIERFQ09ERSgzMiwgbGUyNCwgc3JjLCBzYW1wbGVzLCBuLCA4LCAwKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRMRV9QTEFOQVI6CisgICAgICAgIERFQ09ERV9QTEFOQVIoMzIsIGxlMjQsIHNyYywgc2FtcGxlcywgbiwgOCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MyNEJFOgorICAgICAgICBERUNPREUoMzIsIGJlMjQsIHNyYywgc2FtcGxlcywgbiwgOCwgMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTI0TEU6CisgICAgICAgIERFQ09ERSgzMiwgbGUyNCwgc3JjLCBzYW1wbGVzLCBuLCA4LCAweDgwMDAwMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTI0QkU6CisgICAgICAgIERFQ09ERSgzMiwgYmUyNCwgc3JjLCBzYW1wbGVzLCBuLCA4LCAweDgwMDAwMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzI0REFVRDoKKyAgICAgICAgZm9yICg7IG4gPiAwOyBuLS0pIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHYgPSBieXRlc3RyZWFtX2dldF9iZTI0KCZzcmMpOworICAgICAgICAgICAgdiA+Pj0gNDsgLy8gc3luYyBmbGFncyBhcmUgaGVyZQorICAgICAgICAgICAgQVZfV04xNkEoc2FtcGxlcywgZmZfcmV2ZXJzZVsodiA+PiA4KSAmIDB4ZmZdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZmX3JldmVyc2VbdiAgICAgICAgJiAweGZmXSA8PCA4KSk7CisgICAgICAgICAgICBzYW1wbGVzICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTE2TEU6CisgICAgICAgIERFQ09ERSgxNiwgbGUxNiwgc3JjLCBzYW1wbGVzLCBuLCAwLCAweDgwMDApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1UxNkJFOgorICAgICAgICBERUNPREUoMTYsIGJlMTYsIHNyYywgc2FtcGxlcywgbiwgMCwgMHg4MDAwKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TODoKKyAgICAgICAgZm9yICg7IG4gPiAwOyBuLS0pCisgICAgICAgICAgICAqc2FtcGxlcysrID0gKnNyYysrICsgMTI4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TOF9QTEFOQVI6CisgICAgICAgIG4gLz0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgYXZjdHgtPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgc2FtcGxlcyA9IGZyYW1lLT5leHRlbmRlZF9kYXRhW2NdOworICAgICAgICAgICAgZm9yIChpID0gbjsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gKnNyYysrICsgMTI4OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjY0TEU6CisgICAgICAgIERFQ09ERSg2NCwgbGU2NCwgc3JjLCBzYW1wbGVzLCBuLCAwLCAwKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMzJMRToKKyAgICAgICAgREVDT0RFKDMyLCBsZTMyLCBzcmMsIHNhbXBsZXMsIG4sIDAsIDApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MzMkxFX1BMQU5BUjoKKyAgICAgICAgREVDT0RFX1BMQU5BUigzMiwgbGUzMiwgc3JjLCBzYW1wbGVzLCBuLCAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU6CisgICAgICAgIERFQ09ERSgxNiwgbGUxNiwgc3JjLCBzYW1wbGVzLCBuLCAwLCAwKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRV9QTEFOQVI6CisgICAgICAgIERFQ09ERV9QTEFOQVIoMTYsIGxlMTYsIHNyYywgc2FtcGxlcywgbiwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NEJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MzMkJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkJFOgorI2Vsc2UKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRCRToKKyAgICAgICAgREVDT0RFKDY0LCBiZTY0LCBzcmMsIHNhbXBsZXMsIG4sIDAsIDApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MzMkJFOgorICAgICAgICBERUNPREUoMzIsIGJlMzIsIHNyYywgc2FtcGxlcywgbiwgMCwgMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU6CisgICAgICAgIERFQ09ERSgxNiwgYmUxNiwgc3JjLCBzYW1wbGVzLCBuLCAwLCAwKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZCRV9QTEFOQVI6CisgICAgICAgIERFQ09ERV9QTEFOQVIoMTYsIGJlMTYsIHNyYywgc2FtcGxlcywgbiwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NExFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkxFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MzMkxFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkxFOgorI2VuZGlmIC8qIEhBVkVfQklHRU5ESUFOICovCisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTg6CisgICAgICAgIG1lbWNweShzYW1wbGVzLCBzcmMsIG4gKiBzYW1wbGVfc2l6ZSk7CisgICAgICAgIGJyZWFrOworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2QkVfUExBTkFSOgorI2Vsc2UKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRV9QTEFOQVI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyTEVfUExBTkFSOgorI2VuZGlmIC8qIEhBVkVfQklHRU5ESUFOICovCisgICAgICAgIG4gLz0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgYXZjdHgtPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgIHNhbXBsZXMgPSBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjXTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fZ2V0X2J1ZmZlcigmc3JjLCBzYW1wbGVzLCBuICogc2FtcGxlX3NpemUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1pPUks6CisgICAgICAgIGZvciAoOyBuID4gMDsgbi0tKSB7CisgICAgICAgICAgICBpbnQgdiA9ICpzcmMrKzsKKyAgICAgICAgICAgIGlmICh2IDwgMTI4KQorICAgICAgICAgICAgICAgIHYgPSAxMjggLSB2OworICAgICAgICAgICAgKnNhbXBsZXMrKyA9IHY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fQUxBVzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9NVUxBVzoKKyAgICAgICAgZm9yICg7IG4gPiAwOyBuLS0pIHsKKyAgICAgICAgICAgIEFWX1dOMTZBKHNhbXBsZXMsIHMtPnRhYmxlWypzcmMrK10pOworICAgICAgICAgICAgc2FtcGxlcyArPSAyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0xYRjoKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBuIC89IGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGF2Y3R4LT5jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICBkc3RfaW50MzJfdCA9IChpbnQzMl90ICopZnJhbWUtPmV4dGVuZGVkX2RhdGFbY107CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBsb3cgMjAgYml0cyBhbmQgZXhwYW5kIHRvIDMyIGJpdHMKKyAgICAgICAgICAgICAgICAqZHN0X2ludDMyX3QrKyA9ICAoc3JjWzJdICAgICAgICAgPDwgMjgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjWzFdICAgICAgICAgPDwgMjApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjWzBdICAgICAgICAgPDwgMTIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjWzJdICYgMHgwRikgPDwgIDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWzFdOworICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgaGlnaCAyMCBiaXRzIGFuZCBleHBhbmQgdG8gMzIgYml0cworICAgICAgICAgICAgICAgICpkc3RfaW50MzJfdCsrID0gIChzcmNbNF0gICAgICAgICA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmNbM10gICAgICAgICA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbMl0gJiAweEYwKSA8PCAgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmNbNF0gICAgICAgICA8PCAgNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmNbM10gICAgICAgICA+PiAgNCk7CisgICAgICAgICAgICAgICAgc3JjICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKKyNkZWZpbmUgUENNX0VOQ09ERVJfMChpZF8sIHNhbXBsZV9mbXRfLCBuYW1lXywgbG9uZ19uYW1lXykKKyNkZWZpbmUgUENNX0VOQ09ERVJfMShpZF8sIHNhbXBsZV9mbXRfLCBuYW1lXywgbG9uZ19uYW1lXykgICAgICAgICAgICAgICAgICBcCitBVkNvZGVjIGZmXyAjIyBuYW1lXyAjIyBfZW5jb2RlciA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5uYW1lICAgICAgICAgPSAjbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwobG9uZ19uYW1lXyksICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF8gIyMgaWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaW5pdCAgICAgICAgID0gcGNtX2VuY29kZV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmVuY29kZTIgICAgICA9IHBjbV9lbmNvZGVfZnJhbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5jYXBhYmlsaXRpZXMgPSBDT0RFQ19DQVBfVkFSSUFCTEVfRlJBTUVfU0laRSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc2FtcGxlX2ZtdHMgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IHNhbXBsZV9mbXRfLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwgICAgXAorfQorCisjZGVmaW5lIFBDTV9FTkNPREVSXzIoY2YsIGlkLCBzYW1wbGVfZm10LCBuYW1lLCBsb25nX25hbWUpICAgICAgICAgICAgICAgICAgXAorICAgIFBDTV9FTkNPREVSXyAjIyBjZihpZCwgc2FtcGxlX2ZtdCwgbmFtZSwgbG9uZ19uYW1lKQorI2RlZmluZSBQQ01fRU5DT0RFUl8zKGNmLCBpZCwgc2FtcGxlX2ZtdCwgbmFtZSwgbG9uZ19uYW1lKSAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ01fRU5DT0RFUl8yKGNmLCBpZCwgc2FtcGxlX2ZtdCwgbmFtZSwgbG9uZ19uYW1lKQorI2RlZmluZSBQQ01fRU5DT0RFUihpZCwgc2FtcGxlX2ZtdCwgbmFtZSwgbG9uZ19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ01fRU5DT0RFUl8zKENPTkZJR18gIyMgaWQgIyMgX0VOQ09ERVIsIGlkLCBzYW1wbGVfZm10LCBuYW1lLCBsb25nX25hbWUpCisKKyNkZWZpbmUgUENNX0RFQ09ERVJfMChpZCwgc2FtcGxlX2ZtdCwgbmFtZSwgbG9uZ19uYW1lKQorI2RlZmluZSBQQ01fREVDT0RFUl8xKGlkXywgc2FtcGxlX2ZtdF8sIG5hbWVfLCBsb25nX25hbWVfKSAgICAgICAgICAgICAgICAgIFwKK0FWQ29kZWMgZmZfICMjIG5hbWVfICMjIF9kZWNvZGVyID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm5hbWUgICAgICAgICAgID0gI25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGxvbmdfbmFtZV8pLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfICMjIGlkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQQ01EZWNvZGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaW5pdCAgICAgICAgICAgPSBwY21fZGVjb2RlX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmRlY29kZSAgICAgICAgID0gcGNtX2RlY29kZV9mcmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgc2FtcGxlX2ZtdF8sICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LCAgXAorfQorCisjZGVmaW5lIFBDTV9ERUNPREVSXzIoY2YsIGlkLCBzYW1wbGVfZm10LCBuYW1lLCBsb25nX25hbWUpICAgICAgICAgICAgICAgICAgXAorICAgIFBDTV9ERUNPREVSXyAjIyBjZihpZCwgc2FtcGxlX2ZtdCwgbmFtZSwgbG9uZ19uYW1lKQorI2RlZmluZSBQQ01fREVDT0RFUl8zKGNmLCBpZCwgc2FtcGxlX2ZtdCwgbmFtZSwgbG9uZ19uYW1lKSAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ01fREVDT0RFUl8yKGNmLCBpZCwgc2FtcGxlX2ZtdCwgbmFtZSwgbG9uZ19uYW1lKQorI2RlZmluZSBQQ01fREVDT0RFUihpZCwgc2FtcGxlX2ZtdCwgbmFtZSwgbG9uZ19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ01fREVDT0RFUl8zKENPTkZJR18gIyMgaWQgIyMgX0RFQ09ERVIsIGlkLCBzYW1wbGVfZm10LCBuYW1lLCBsb25nX25hbWUpCisKKyNkZWZpbmUgUENNX0NPREVDKGlkLCBzYW1wbGVfZm10XywgbmFtZSwgbG9uZ19uYW1lXykgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ01fRU5DT0RFUihpZCwgc2FtcGxlX2ZtdF8sIG5hbWUsIGxvbmdfbmFtZV8pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ01fREVDT0RFUihpZCwgc2FtcGxlX2ZtdF8sIG5hbWUsIGxvbmdfbmFtZV8pCisKKy8qIE5vdGU6IERvIG5vdCBmb3JnZXQgdG8gYWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBNYWtlZmlsZSBhcyB3ZWxsLiAqLworUENNX0NPREVDICAoUENNX0FMQVcsICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsIHBjbV9hbGF3LCAgICAgICAgICJQQ00gQS1sYXcgLyBHLjcxMSBBLWxhdyIpOworUENNX0NPREVDICAoUENNX0YzMkJFLCAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFQsIHBjbV9mMzJiZSwgICAgICAgICJQQ00gMzItYml0IGZsb2F0aW5nIHBvaW50IGJpZy1lbmRpYW4iKTsKK1BDTV9DT0RFQyAgKFBDTV9GMzJMRSwgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxULCBwY21fZjMybGUsICAgICAgICAiUENNIDMyLWJpdCBmbG9hdGluZyBwb2ludCBsaXR0bGUtZW5kaWFuIik7CitQQ01fQ09ERUMgIChQQ01fRjY0QkUsICAgICAgICBBVl9TQU1QTEVfRk1UX0RCTCwgcGNtX2Y2NGJlLCAgICAgICAgIlBDTSA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgYmlnLWVuZGlhbiIpOworUENNX0NPREVDICAoUENNX0Y2NExFLCAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkwsIHBjbV9mNjRsZSwgICAgICAgICJQQ00gNjQtYml0IGZsb2F0aW5nIHBvaW50IGxpdHRsZS1lbmRpYW4iKTsKK1BDTV9ERUNPREVSKFBDTV9MWEYsICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzMyUCxwY21fbHhmLCAgICAgICAgICAiUENNIHNpZ25lZCAyMC1iaXQgbGl0dGxlLWVuZGlhbiBwbGFuYXIiKTsKK1BDTV9DT0RFQyAgKFBDTV9NVUxBVywgICAgICAgIEFWX1NBTVBMRV9GTVRfUzE2LCBwY21fbXVsYXcsICAgICAgICAiUENNIG11LWxhdyAvIEcuNzExIG11LWxhdyIpOworUENNX0NPREVDICAoUENNX1M4LCAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9VOCwgIHBjbV9zOCwgICAgICAgICAgICJQQ00gc2lnbmVkIDgtYml0Iik7CitQQ01fQ09ERUMgIChQQ01fUzhfUExBTkFSLCAgICBBVl9TQU1QTEVfRk1UX1U4UCwgcGNtX3M4X3BsYW5hciwgICAgIlBDTSBzaWduZWQgOC1iaXQgcGxhbmFyIik7CitQQ01fQ09ERUMgIChQQ01fUzE2QkUsICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwgcGNtX3MxNmJlLCAgICAgICAgIlBDTSBzaWduZWQgMTYtYml0IGJpZy1lbmRpYW4iKTsKK1BDTV9DT0RFQyAgKFBDTV9TMTZCRV9QTEFOQVIsIEFWX1NBTVBMRV9GTVRfUzE2UCxwY21fczE2YmVfcGxhbmFyLCAiUENNIHNpZ25lZCAxNi1iaXQgYmlnLWVuZGlhbiBwbGFuYXIiKTsKK1BDTV9DT0RFQyAgKFBDTV9TMTZMRSwgICAgICAgIEFWX1NBTVBMRV9GTVRfUzE2LCBwY21fczE2bGUsICAgICAgICAiUENNIHNpZ25lZCAxNi1iaXQgbGl0dGxlLWVuZGlhbiIpOworUENNX0NPREVDICAoUENNX1MxNkxFX1BMQU5BUiwgQVZfU0FNUExFX0ZNVF9TMTZQLHBjbV9zMTZsZV9wbGFuYXIsICJQQ00gc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIHBsYW5hciIpOworUENNX0NPREVDICAoUENNX1MyNEJFLCAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzIsIHBjbV9zMjRiZSwgICAgICAgICJQQ00gc2lnbmVkIDI0LWJpdCBiaWctZW5kaWFuIik7CitQQ01fQ09ERUMgIChQQ01fUzI0REFVRCwgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwgcGNtX3MyNGRhdWQsICAgICAgIlBDTSBELUNpbmVtYSBhdWRpbyBzaWduZWQgMjQtYml0Iik7CitQQ01fQ09ERUMgIChQQ01fUzI0TEUsICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMiwgcGNtX3MyNGxlLCAgICAgICAgIlBDTSBzaWduZWQgMjQtYml0IGxpdHRsZS1lbmRpYW4iKTsKK1BDTV9DT0RFQyAgKFBDTV9TMjRMRV9QTEFOQVIsIEFWX1NBTVBMRV9GTVRfUzMyUCxwY21fczI0bGVfcGxhbmFyLCAiUENNIHNpZ25lZCAyNC1iaXQgbGl0dGxlLWVuZGlhbiBwbGFuYXIiKTsKK1BDTV9DT0RFQyAgKFBDTV9TMzJCRSwgICAgICAgIEFWX1NBTVBMRV9GTVRfUzMyLCBwY21fczMyYmUsICAgICAgICAiUENNIHNpZ25lZCAzMi1iaXQgYmlnLWVuZGlhbiIpOworUENNX0NPREVDICAoUENNX1MzMkxFLCAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzIsIHBjbV9zMzJsZSwgICAgICAgICJQQ00gc2lnbmVkIDMyLWJpdCBsaXR0bGUtZW5kaWFuIik7CitQQ01fQ09ERUMgIChQQ01fUzMyTEVfUExBTkFSLCBBVl9TQU1QTEVfRk1UX1MzMlAscGNtX3MzMmxlX3BsYW5hciwgIlBDTSBzaWduZWQgMzItYml0IGxpdHRsZS1lbmRpYW4gcGxhbmFyIik7CitQQ01fQ09ERUMgIChQQ01fVTgsICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1U4LCAgcGNtX3U4LCAgICAgICAgICAgIlBDTSB1bnNpZ25lZCA4LWJpdCIpOworUENNX0NPREVDICAoUENNX1UxNkJFLCAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsIHBjbV91MTZiZSwgICAgICAgICJQQ00gdW5zaWduZWQgMTYtYml0IGJpZy1lbmRpYW4iKTsKK1BDTV9DT0RFQyAgKFBDTV9VMTZMRSwgICAgICAgIEFWX1NBTVBMRV9GTVRfUzE2LCBwY21fdTE2bGUsICAgICAgICAiUENNIHVuc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIik7CitQQ01fQ09ERUMgIChQQ01fVTI0QkUsICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMiwgcGNtX3UyNGJlLCAgICAgICAgIlBDTSB1bnNpZ25lZCAyNC1iaXQgYmlnLWVuZGlhbiIpOworUENNX0NPREVDICAoUENNX1UyNExFLCAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzIsIHBjbV91MjRsZSwgICAgICAgICJQQ00gdW5zaWduZWQgMjQtYml0IGxpdHRsZS1lbmRpYW4iKTsKK1BDTV9DT0RFQyAgKFBDTV9VMzJCRSwgICAgICAgIEFWX1NBTVBMRV9GTVRfUzMyLCBwY21fdTMyYmUsICAgICAgICAiUENNIHVuc2lnbmVkIDMyLWJpdCBiaWctZW5kaWFuIik7CitQQ01fQ09ERUMgIChQQ01fVTMyTEUsICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMiwgcGNtX3UzMmxlLCAgICAgICAgIlBDTSB1bnNpZ25lZCAzMi1iaXQgbGl0dGxlLWVuZGlhbiIpOworUENNX0RFQ09ERVIoUENNX1pPUkssICAgICAgICAgQVZfU0FNUExFX0ZNVF9VOCwgIHBjbV96b3JrLCAgICAgICAgICJQQ00gWm9yayIpOworCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wY21fdGFibGVnZW4uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BjbV90YWJsZWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOGU3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wY21fdGFibGVnZW4uYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogR2VuZXJhdGUgYSBoZWFkZXIgZmlsZSBmb3IgaGFyZGNvZGVkIFBDTSB0YWJsZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2RlZmluZSBDT05GSUdfSEFSRENPREVEX1RBQkxFUyAwCisjaW5jbHVkZSAicGNtX3RhYmxlZ2VuLmgiCisjaW5jbHVkZSAidGFibGVwcmludC5oIgorCitpbnQgbWFpbih2b2lkKQoreworICAgIHBjbV9hbGF3X3RhYmxlaW5pdCgpOworICAgIHBjbV91bGF3X3RhYmxlaW5pdCgpOworCisgICAgd3JpdGVfZmlsZWhlYWRlcigpOworCisgICAgV1JJVEVfQVJSQVkoInN0YXRpYyBjb25zdCIsIHVpbnQ4X3QsIGxpbmVhcl90b19hbGF3KTsKKyAgICBXUklURV9BUlJBWSgic3RhdGljIGNvbnN0IiwgdWludDhfdCwgbGluZWFyX3RvX3VsYXcpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wY21fdGFibGVnZW4uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3BjbV90YWJsZWdlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzODcyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wY21fdGFibGVnZW4uaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIEhlYWRlciBmaWxlIGZvciBoYXJkY29kZWQgUENNIHRhYmxlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBSZWltYXIgRMO2ZmZpbmdlciA8UmVpbWFyLkRvZWZmaW5nZXJAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUENNX1RBQkxFR0VOX0gKKyNkZWZpbmUgQVZDT0RFQ19QQ01fVEFCTEVHRU5fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKworLyogZnJvbSBnNzExLmMgYnkgU1VOIG1pY3Jvc3lzdGVtcyAodW5yZXN0cmljdGVkIHVzZSkgKi8KKworI2RlZmluZSAgICAgICAgIFNJR05fQklUICAgICAgICAoMHg4MCkgICAgICAvKiBTaWduIGJpdCBmb3IgYSBBLWxhdyBieXRlLiAqLworI2RlZmluZSAgICAgICAgIFFVQU5UX01BU0sgICAgICAoMHhmKSAgICAgICAvKiBRdWFudGl6YXRpb24gZmllbGQgbWFzay4gKi8KKyNkZWZpbmUgICAgICAgICBOU0VHUyAgICAgICAgICAgKDgpICAgICAgICAgLyogTnVtYmVyIG9mIEEtbGF3IHNlZ21lbnRzLiAqLworI2RlZmluZSAgICAgICAgIFNFR19TSElGVCAgICAgICAoNCkgICAgICAgICAvKiBMZWZ0IHNoaWZ0IGZvciBzZWdtZW50IG51bWJlci4gKi8KKyNkZWZpbmUgICAgICAgICBTRUdfTUFTSyAgICAgICAgKDB4NzApICAgICAgLyogU2VnbWVudCBmaWVsZCBtYXNrLiAqLworCisjZGVmaW5lICAgICAgICAgQklBUyAgICAgICAgICAgICgweDg0KSAgICAgIC8qIEJpYXMgZm9yIGxpbmVhciBjb2RlLiAqLworCisvKgorICogYWxhdzJsaW5lYXIoKSAtIENvbnZlcnQgYW4gQS1sYXcgdmFsdWUgdG8gMTYtYml0IGxpbmVhciBQQ00KKyAqCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBhbGF3MmxpbmVhcih1bnNpZ25lZCBjaGFyIGFfdmFsKQoreworICAgICAgICBpbnQgdDsKKyAgICAgICAgaW50IHNlZzsKKworICAgICAgICBhX3ZhbCBePSAweDU1OworCisgICAgICAgIHQgPSBhX3ZhbCAmIFFVQU5UX01BU0s7CisgICAgICAgIHNlZyA9ICgodW5zaWduZWQpYV92YWwgJiBTRUdfTUFTSykgPj4gU0VHX1NISUZUOworICAgICAgICBpZihzZWcpIHQ9ICh0ICsgdCArIDEgKyAzMikgPDwgKHNlZyArIDIpOworICAgICAgICBlbHNlICAgIHQ9ICh0ICsgdCArIDEgICAgICkgPDwgMzsKKworICAgICAgICByZXR1cm4gKGFfdmFsICYgU0lHTl9CSVQpID8gdCA6IC10OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdWxhdzJsaW5lYXIodW5zaWduZWQgY2hhciB1X3ZhbCkKK3sKKyAgICAgICAgaW50IHQ7CisKKyAgICAgICAgLyogQ29tcGxlbWVudCB0byBvYnRhaW4gbm9ybWFsIHUtbGF3IHZhbHVlLiAqLworICAgICAgICB1X3ZhbCA9IH51X3ZhbDsKKworICAgICAgICAvKgorICAgICAgICAgKiBFeHRyYWN0IGFuZCBiaWFzIHRoZSBxdWFudGl6YXRpb24gYml0cy4gVGhlbgorICAgICAgICAgKiBzaGlmdCB1cCBieSB0aGUgc2VnbWVudCBudW1iZXIgYW5kIHN1YnRyYWN0IG91dCB0aGUgYmlhcy4KKyAgICAgICAgICovCisgICAgICAgIHQgPSAoKHVfdmFsICYgUVVBTlRfTUFTSykgPDwgMykgKyBCSUFTOworICAgICAgICB0IDw8PSAoKHVuc2lnbmVkKXVfdmFsICYgU0VHX01BU0spID4+IFNFR19TSElGVDsKKworICAgICAgICByZXR1cm4gKHVfdmFsICYgU0lHTl9CSVQpID8gKEJJQVMgLSB0KSA6ICh0IC0gQklBUyk7Cit9CisKKyNpZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUworI2RlZmluZSBwY21fYWxhd190YWJsZWluaXQoKQorI2RlZmluZSBwY21fdWxhd190YWJsZWluaXQoKQorI2luY2x1ZGUgImxpYmF2Y29kZWMvcGNtX3RhYmxlcy5oIgorI2Vsc2UKKy8qIDE2Mzg0IGVudHJpZXMgcGVyIHRhYmxlICovCitzdGF0aWMgdWludDhfdCBsaW5lYXJfdG9fYWxhd1sxNjM4NF07CitzdGF0aWMgdWludDhfdCBsaW5lYXJfdG9fdWxhd1sxNjM4NF07CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgYnVpbGRfeGxhd190YWJsZSh1aW50OF90ICpsaW5lYXJfdG9feGxhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqeGxhdzJsaW5lYXIpKHVuc2lnbmVkIGNoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFzaykKK3sKKyAgICBpbnQgaSwgaiwgdiwgdjEsIHYyOworCisgICAgaiA9IDA7CisgICAgZm9yKGk9MDtpPDEyODtpKyspIHsKKyAgICAgICAgaWYgKGkgIT0gMTI3KSB7CisgICAgICAgICAgICB2MSA9IHhsYXcybGluZWFyKGkgXiBtYXNrKTsKKyAgICAgICAgICAgIHYyID0geGxhdzJsaW5lYXIoKGkgKyAxKSBeIG1hc2spOworICAgICAgICAgICAgdiA9ICh2MSArIHYyICsgNCkgPj4gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHYgPSA4MTkyOworICAgICAgICB9CisgICAgICAgIGZvcig7ajx2O2orKykgeworICAgICAgICAgICAgbGluZWFyX3RvX3hsYXdbODE5MiArIGpdID0gKGkgXiBtYXNrKTsKKyAgICAgICAgICAgIGlmIChqID4gMCkKKyAgICAgICAgICAgICAgICBsaW5lYXJfdG9feGxhd1s4MTkyIC0gal0gPSAoaSBeIChtYXNrIF4gMHg4MCkpOworICAgICAgICB9CisgICAgfQorICAgIGxpbmVhcl90b194bGF3WzBdID0gbGluZWFyX3RvX3hsYXdbMV07Cit9CisKK3N0YXRpYyB2b2lkIHBjbV9hbGF3X3RhYmxlaW5pdCh2b2lkKQoreworICAgIGJ1aWxkX3hsYXdfdGFibGUobGluZWFyX3RvX2FsYXcsIGFsYXcybGluZWFyLCAweGQ1KTsKK30KKworc3RhdGljIHZvaWQgcGNtX3VsYXdfdGFibGVpbml0KHZvaWQpCit7CisgICAgYnVpbGRfeGxhd190YWJsZShsaW5lYXJfdG9fdWxhdywgdWxhdzJsaW5lYXIsIDB4ZmYpOworfQorI2VuZGlmIC8qIENPTkZJR19IQVJEQ09ERURfVEFCTEVTICovCisKKyNlbmRpZiAvKiBBVkNPREVDX1BDTV9UQUJMRUdFTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wY3guYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BjeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODdhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wY3guYwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIFBDIFBhaW50YnJ1c2ggUENYICgucGN4KSBpbWFnZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSXZvIHZhbiBQb29ydGVuCisgKgorICogVGhpcyBkZWNvZGVyIGRvZXMgbm90IHN1cHBvcnQgQ0dBIHBhbGV0dGVzLiBJIGFtIHVuYWJsZSB0byBmaW5kIHNhbXBsZXMKKyAqIGFuZCBOZXRwYm0gY2Fubm90IGdlbmVyYXRlIHRoZW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIHZvaWQgcGN4X3JsZV9kZWNvZGUoR2V0Qnl0ZUNvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9zY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wcmVzc2VkKQoreworICAgIHVuc2lnbmVkIGludCBpID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHJ1biwgdmFsdWU7CisKKyAgICBpZiAoY29tcHJlc3NlZCkgeworICAgICAgICB3aGlsZSAoaSA8IGJ5dGVzX3Blcl9zY2FubGluZSAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYik+MCkgeworICAgICAgICAgICAgcnVuICAgPSAxOworICAgICAgICAgICAgdmFsdWUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICBpZiAodmFsdWUgPj0gMHhjMCAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYik+MCkgeworICAgICAgICAgICAgICAgIHJ1biAgID0gdmFsdWUgJiAweDNmOworICAgICAgICAgICAgICAgIHZhbHVlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGkgPCBieXRlc19wZXJfc2NhbmxpbmUgJiYgcnVuLS0pCisgICAgICAgICAgICAgICAgZHN0W2krK10gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoZ2IsIGRzdCwgYnl0ZXNfcGVyX3NjYW5saW5lKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBjeF9wYWxldHRlKEdldEJ5dGVDb250ZXh0ICpnYiwgdWludDMyX3QgKmRzdCwgaW50IHBhbGxlbikKK3sKKyAgICBpbnQgaTsKKworICAgIHBhbGxlbiA9IEZGTUlOKHBhbGxlbiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIC8gMyk7CisgICAgZm9yIChpID0gMDsgaSA8IHBhbGxlbjsgaSsrKQorICAgICAgICAqZHN0KysgPSAweEZGMDAwMDAwIHwgYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KGdiKTsKKyAgICBpZiAocGFsbGVuIDwgMjU2KQorICAgICAgICBtZW1zZXQoZHN0LCAwLCAoMjU2IC0gcGFsbGVuKSAqIHNpemVvZigqZHN0KSk7Cit9CisKK3N0YXRpYyBpbnQgcGN4X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBBVkZyYW1lICogY29uc3QgcCAgPSBkYXRhOworICAgIGludCBjb21wcmVzc2VkLCB4bWluLCB5bWluLCB4bWF4LCB5bWF4OworICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgaW50IHcsIGgsIGJpdHNfcGVyX3BpeGVsLCBieXRlc19wZXJfbGluZSwgbnBsYW5lcywgc3RyaWRlLCB5LCB4LAorICAgICAgICAgICAgICAgICBieXRlc19wZXJfc2NhbmxpbmU7CisgICAgdWludDhfdCAqcHRyLCAqc2NhbmxpbmU7CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPCAxMjgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYikgIT0gMHgwYSB8fCBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKSA+IDUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ0aGlzIGlzIG5vdCBQQ1ggZW5jb2RlZCBkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY29tcHJlc3NlZCAgICAgICAgICAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgYml0c19wZXJfcGl4ZWwgICAgICAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgeG1pbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYik7CisgICAgeW1pbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYik7CisgICAgeG1heCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYik7CisgICAgeW1heCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYik7CisgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYik7CisgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYik7CisKKyAgICBpZiAoeG1heCA8IHhtaW4gfHwgeW1heCA8IHltaW4pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGltYWdlIGRpbWVuc2lvbnNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB3ID0geG1heCAtIHhtaW4gKyAxOworICAgIGggPSB5bWF4IC0geW1pbiArIDE7CisKKyAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIDQ5KTsKKyAgICBucGxhbmVzICAgICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICBieXRlc19wZXJfbGluZSAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmdiKTsKKyAgICBieXRlc19wZXJfc2NhbmxpbmUgPSBucGxhbmVzICogYnl0ZXNfcGVyX2xpbmU7CisKKyAgICBpZiAoYnl0ZXNfcGVyX3NjYW5saW5lIDwgKHcgKiBiaXRzX3Blcl9waXhlbCAqIG5wbGFuZXMgKyA3KSAvIDggfHwKKyAgICAgICAgKCFjb21wcmVzc2VkICYmIGJ5dGVzX3Blcl9zY2FubGluZSA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgLyBoKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBDWCBkYXRhIGlzIGNvcnJ1cHRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHN3aXRjaCAoKG5wbGFuZXMgPDwgOCkgKyBiaXRzX3Blcl9waXhlbCkgeworICAgIGNhc2UgMHgwMzA4OgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMTA4OgorICAgIGNhc2UgMHgwMTA0OgorICAgIGNhc2UgMHgwMTAyOgorICAgIGNhc2UgMHgwMTAxOgorICAgIGNhc2UgMHgwNDAxOgorICAgIGNhc2UgMHgwMzAxOgorICAgIGNhc2UgMHgwMjAxOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIFBDWCBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCA2MCk7CisKKyAgICBpZiAoKHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCB3LCBoKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICBwdHIgICAgPSBwLT5kYXRhWzBdOworICAgIHN0cmlkZSA9IHAtPmxpbmVzaXplWzBdOworCisgICAgc2NhbmxpbmUgPSBhdl9tYWxsb2MoYnl0ZXNfcGVyX3NjYW5saW5lICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFzY2FubGluZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChucGxhbmVzID09IDMgJiYgYml0c19wZXJfcGl4ZWwgPT0gOCkgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBwY3hfcmxlX2RlY29kZSgmZ2IsIHNjYW5saW5lLCBieXRlc19wZXJfc2NhbmxpbmUsIGNvbXByZXNzZWQpOworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgcHRyWzMgKiB4XSAgICAgPSBzY2FubGluZVt4XTsKKyAgICAgICAgICAgICAgICBwdHJbMyAqIHggKyAxXSA9IHNjYW5saW5lW3ggKyBieXRlc19wZXJfbGluZV07CisgICAgICAgICAgICAgICAgcHRyWzMgKiB4ICsgMl0gPSBzY2FubGluZVt4ICsgKGJ5dGVzX3Blcl9saW5lIDw8IDEpXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHRyICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobnBsYW5lcyA9PSAxICYmIGJpdHNfcGVyX3BpeGVsID09IDgpIHsKKyAgICAgICAgaW50IHBhbHN0YXJ0ID0gYXZwa3QtPnNpemUgLSA3Njk7CisKKyAgICAgICAgaWYgKGF2cGt0LT5zaXplIDwgNzY5KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZpbGUgaXMgdG9vIHNob3J0XG4iKTsKKyAgICAgICAgICAgIHJldCA9IGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFID8KKyAgICAgICAgICAgICAgICAgIEFWRVJST1JfSU5WQUxJRERBVEEgOiBhdnBrdC0+c2l6ZTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKywgcHRyICs9IHN0cmlkZSkgeworICAgICAgICAgICAgcGN4X3JsZV9kZWNvZGUoJmdiLCBzY2FubGluZSwgYnl0ZXNfcGVyX3NjYW5saW5lLCBjb21wcmVzc2VkKTsKKyAgICAgICAgICAgIG1lbWNweShwdHIsIHNjYW5saW5lLCB3KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsKCZnYikgIT0gcGFsc3RhcnQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJpbWFnZSBkYXRhIHBvc3NpYmx5IGNvcnJ1cHRlZFxuIik7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZnYiwgcGFsc3RhcnQsIFNFRUtfU0VUKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSAhPSAxMikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJleHBlY3RlZCBwYWxldHRlIGFmdGVyIGltYWdlIGRhdGFcbiIpOworICAgICAgICAgICAgcmV0ID0gYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUgPworICAgICAgICAgICAgICAgICAgQVZFUlJPUl9JTlZBTElEREFUQSA6IGF2cGt0LT5zaXplOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG5wbGFuZXMgPT0gMSkgeyAgIC8qIGFsbCBwYWNrZWQgZm9ybWF0cywgbWF4LiAxNiBjb2xvcnMgKi8KKyAgICAgICAgR2V0Qml0Q29udGV4dCBzOworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGluaXRfZ2V0X2JpdHM4KCZzLCBzY2FubGluZSwgYnl0ZXNfcGVyX3NjYW5saW5lKTsKKworICAgICAgICAgICAgcGN4X3JsZV9kZWNvZGUoJmdiLCBzY2FubGluZSwgYnl0ZXNfcGVyX3NjYW5saW5lLCBjb21wcmVzc2VkKTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKyAgICAgICAgICAgICAgICBwdHJbeF0gPSBnZXRfYml0cygmcywgYml0c19wZXJfcGl4ZWwpOworICAgICAgICAgICAgcHRyICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7ICAgIC8qIHBsYW5hciwgNCwgOCBvciAxNiBjb2xvcnMgKi8KKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgcGN4X3JsZV9kZWNvZGUoJmdiLCBzY2FubGluZSwgYnl0ZXNfcGVyX3NjYW5saW5lLCBjb21wcmVzc2VkKTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgICAgIGludCBtID0gMHg4MCA+PiAoeCAmIDcpLCB2ID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBucGxhbmVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgdiA8PD0gMTsKKyAgICAgICAgICAgICAgICAgICAgdiAgKz0gISEoc2NhbmxpbmVbaSAqIGJ5dGVzX3Blcl9saW5lICsgKHggPj4gMyldICYgbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB0clt4XSA9IHY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdHIgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpOworICAgIGlmIChucGxhbmVzID09IDEgJiYgYml0c19wZXJfcGl4ZWwgPT0gOCkgeworICAgICAgICBwY3hfcGFsZXR0ZSgmZ2IsICh1aW50MzJfdCAqKXAtPmRhdGFbMV0sIDI1Nik7CisgICAgICAgIHJldCArPSAyNTYgKiAzOworICAgIH0gZWxzZSBpZiAoYml0c19wZXJfcGl4ZWwgKiBucGxhbmVzID09IDEpIHsKKyAgICAgICAgQVZfV04zMkEocC0+ZGF0YVsxXSAgLCAweEZGMDAwMDAwKTsKKyAgICAgICAgQVZfV04zMkEocC0+ZGF0YVsxXSs0LCAweEZGRkZGRkZGKTsKKyAgICB9IGVsc2UgaWYgKGJpdHNfcGVyX3BpeGVsIDwgOCkgeworICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZnYiwgMTYsIFNFRUtfU0VUKTsKKyAgICAgICAgcGN4X3BhbGV0dGUoJmdiLCAodWludDMyX3QgKilwLT5kYXRhWzFdLCAxNik7CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisKK2VuZDoKKyAgICBhdl9mcmVlKHNjYW5saW5lKTsKKyAgICByZXR1cm4gcmV0OworfQorCitBVkNvZGVjIGZmX3BjeF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAicGN4IiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDIFBhaW50YnJ1c2ggUENYIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfUENYLAorICAgIC5kZWNvZGUgICAgICAgPSBwY3hfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BjeGVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGN4ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4MDYzYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BjeGVuYy5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogUEMgUGFpbnRicnVzaCBQQ1ggKC5wY3gpIGltYWdlIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBEYW5pZWwgVmVya2FtcCA8ZGFuaWVsIGF0IGRydi5udT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUENYIGltYWdlIGVuY29kZXIKKyAqIEBhdXRob3IgRGFuaWVsIFZlcmthbXAKKyAqIEBzZWUgaHR0cDovL3d3dy5xenguY29tL3BjLWdwZS9wY3gudHh0CisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IG1vbm9ibGFja19wYWxbMTZdID0geyAweDAwMDAwMCwgMHhGRkZGRkYgfTsKKworc3RhdGljIGF2X2NvbGQgaW50IHBjeF9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWF2Y3R4LT5jb2RlZF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBwY3hfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdl9mcmFtZV9mcmVlKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFBDWCBydW4tbGVuZ3RoIGVuY29kZXIKKyAqIEBwYXJhbSBkc3Qgb3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtIGRzdF9zaXplIHNpemUgb2Ygb3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtIHNyYyBpbnB1dCBidWZmZXIKKyAqIEBwYXJhbSBzcmNfcGxhbmVfc2l6ZSBzaXplIG9mIG9uZSBwbGFuZSBvZiBpbnB1dCBidWZmZXIgaW4gYnl0ZXMKKyAqIEBwYXJhbSBucGxhbmVzIG51bWJlciBvZiBwbGFuZXMgaW4gaW5wdXQgYnVmZmVyCisgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIGRzdCBvciAtMSBvbiBlcnJvcgorICogQGJ1ZyB3aWxsIG5vdCB3b3JrIGZvciBucGxhbmVzICE9IDEgJiYgYnBwICE9IDgKKyAqLworc3RhdGljIGludCBwY3hfcmxlX2VuY29kZSggICAgICB1aW50OF90ICpkc3QsIGludCBkc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3BsYW5lX3NpemUsIGludCBucGxhbmVzKQoreworICAgIGludCBwOworICAgIGNvbnN0IHVpbnQ4X3QgKmRzdF9zdGFydCA9IGRzdDsKKworICAgIC8vIGNoZWNrIHdvcnN0LWNhc2UgdXBwZXIgYm91bmQgb24gZHN0X3NpemUKKyAgICBpZiAoZHN0X3NpemUgPCAyTEwgKiBzcmNfcGxhbmVfc2l6ZSAqIG5wbGFuZXMgfHwgc3JjX3BsYW5lX3NpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yIChwID0gMDsgcCA8IG5wbGFuZXM7IHArKykgeworICAgICAgICBpbnQgY291bnQgPSAxOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfcGxhbmUgPSBzcmMgKyBwOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfcGxhbmVfZW5kID0gc3JjX3BsYW5lICsgc3JjX3BsYW5lX3NpemUgKiBucGxhbmVzOworICAgICAgICB1aW50OF90IHByZXYgPSAqc3JjX3BsYW5lOworICAgICAgICBzcmNfcGxhbmUgKz0gbnBsYW5lczsKKworICAgICAgICBmb3IgKDsgOyBzcmNfcGxhbmUgKz0gbnBsYW5lcykgeworICAgICAgICAgICAgaWYgKHNyY19wbGFuZSA8IHNyY19wbGFuZV9lbmQgJiYgKnNyY19wbGFuZSA9PSBwcmV2ICYmIGNvdW50IDwgMHgzRikgeworICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgYnl0ZSBpcyBzYW1lIGFzIHByZXYKKyAgICAgICAgICAgICAgICArK2NvdW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBvdXRwdXQgcHJldiAqIGNvdW50CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDEgfHwgcHJldiA+PSAweEMwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweEMwIHwgY291bnQ7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gcHJldjsKKworICAgICAgICAgICAgICAgIGlmIChzcmNfcGxhbmUgPT0gc3JjX3BsYW5lX2VuZCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBzdGFydCBuZXcgcnVuCisgICAgICAgICAgICAgICAgY291bnQgPSAxOworICAgICAgICAgICAgICAgIHByZXYgPSAqc3JjX3BsYW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGRzdCAtIGRzdF9zdGFydDsKK30KKworc3RhdGljIGludCBwY3hfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQ7CisgICAgdWludDhfdCAqYnVmOworCisgICAgaW50IGJwcCwgbnBsYW5lcywgaSwgeSwgbGluZV9ieXRlcywgd3JpdHRlbiwgcmV0LCBtYXhfcGt0X3NpemUsIHN3LCBzaDsKKyAgICBjb25zdCB1aW50MzJfdCAqcGFsID0gTlVMTDsKKyAgICB1aW50MzJfdCBwYWxldHRlMjU2WzI1Nl07CisgICAgY29uc3QgdWludDhfdCAqc3JjOworCisgICAgaWYgKGF2Y3R4LT53aWR0aCA+IDY1NTM1IHx8IGF2Y3R4LT5oZWlnaHQgPiA2NTUzNSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImltYWdlIGRpbWVuc2lvbnMgZG8gbm90IGZpdCBpbiAxNiBiaXRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIGJwcCA9IDg7CisgICAgICAgIG5wbGFuZXMgPSAzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNF9CWVRFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0X0JZVEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgICAgICBicHAgPSA4OworICAgICAgICBucGxhbmVzID0gMTsKKyAgICAgICAgYXZwcml2X3NldF9zeXN0ZW1hdGljX3BhbDIocGFsZXR0ZTI1NiwgYXZjdHgtPnBpeF9mbXQpOworICAgICAgICBwYWwgPSBwYWxldHRlMjU2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUEFMODoKKyAgICAgICAgYnBwID0gODsKKyAgICAgICAgbnBsYW5lcyA9IDE7CisgICAgICAgIHBhbCA9ICh1aW50MzJfdCAqKWZyYW1lLT5kYXRhWzFdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfTU9OT0JMQUNLOgorICAgICAgICBicHAgPSAxOworICAgICAgICBucGxhbmVzID0gMTsKKyAgICAgICAgcGFsID0gbW9ub2JsYWNrX3BhbDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBwaXhmbXRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbGluZV9ieXRlcyA9IChhdmN0eC0+d2lkdGggKiBicHAgKyA3KSA+PiAzOworICAgIGxpbmVfYnl0ZXMgPSAobGluZV9ieXRlcyArIDEpICYgfjE7CisKKyAgICBtYXhfcGt0X3NpemUgPSAxMjggKyBhdmN0eC0+aGVpZ2h0ICogMiAqIGxpbmVfYnl0ZXMgKiBucGxhbmVzICsgKHBhbCA/IDI1NiozICsgMSA6IDApOworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBtYXhfcGt0X3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgYnVmICAgICA9IHBrdC0+ZGF0YTsKKyAgICBidWZfZW5kID0gcGt0LT5kYXRhICsgcGt0LT5zaXplOworCisgICAgc3cgPSBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW07CisgICAgc2ggPSBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW47CisgICAgaWYgKHN3ID4gMHhGRkZGdSB8fCBzaCA+IDB4RkZGRnUpCisgICAgICAgIGF2X3JlZHVjZSgmc3csICZzaCwgc3csIHNoLCAweEZGRkZ1KTsKKworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgMTApOyAgICAgICAgICAgICAgICAgIC8vIG1hbnVmYWN0dXJlcgorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgNSk7ICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24KKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZidWYsIDEpOyAgICAgICAgICAgICAgICAgICAvLyBlbmNvZGluZworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgYnBwKTsgICAgICAgICAgICAgICAgIC8vIGJpdHMgcGVyIHBpeGVsIHBlciBwbGFuZQorICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmJ1ZiwgMCk7ICAgICAgICAgICAgICAgICAgIC8vIHggbWluCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmYnVmLCAwKTsgICAgICAgICAgICAgICAgICAgLy8geSBtaW4KKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZidWYsIGF2Y3R4LT53aWR0aCAtIDEpOyAgICAvLyB4IG1heAorICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmJ1ZiwgYXZjdHgtPmhlaWdodCAtIDEpOyAgIC8vIHkgbWF4CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmYnVmLCBzdyk7ICAgICAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBEUEkKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZidWYsIHNoKTsgICAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbCBEUEkKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUyNCgmYnVmLCBwYWwgPyBwYWxbaV0gOiAwKTsvLyBwYWxldHRlICg8PSAxNiBjb2xvciBvbmx5KQorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgMCk7ICAgICAgICAgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCBucGxhbmVzKTsgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHBsYW5lcworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmJ1ZiwgbGluZV9ieXRlcyk7ICAgICAgICAgIC8vIHNjYW5saW5lIHBsYW5lIHNpemUgaW4gYnl0ZXMKKworICAgIHdoaWxlIChidWYgLSBwa3QtPmRhdGEgPCAxMjgpCisgICAgICAgICpidWYrKz0gMDsKKworICAgIHNyYyA9IGZyYW1lLT5kYXRhWzBdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBpZiAoKHdyaXR0ZW4gPSBwY3hfcmxlX2VuY29kZShidWYsIGJ1Zl9lbmQgLSBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgbGluZV9ieXRlcywgbnBsYW5lcykpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJidWZmZXIgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBidWYgKz0gd3JpdHRlbjsKKyAgICAgICAgc3JjICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICBpZiAobnBsYW5lcyA9PSAxICYmIGJwcCA9PSA4KSB7CisgICAgICAgIGlmIChidWZfZW5kIC0gYnVmIDwgMjU3KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJ1ZmZlciB0b28gc21hbGxcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgMTIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMjQoJmJ1ZiwgcGFsW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBrdC0+c2l6ZSAgID0gYnVmIC0gcGt0LT5kYXRhOworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3BjeF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwY3giLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQyBQYWludGJydXNoIFBDWCBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ1gsCisgICAgLmluaXQgICAgICAgICAgID0gcGN4X2VuY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHBjeF9lbmNvZGVfY2xvc2UsCisgICAgLmVuY29kZTIgICAgICAgID0gcGN4X2VuY29kZV9mcmFtZSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peworICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LAorICAgICAgICBBVl9QSVhfRk1UX1JHQjgsIEFWX1BJWF9GTVRfQkdSOCwgQVZfUElYX0ZNVF9SR0I0X0JZVEUsIEFWX1BJWF9GTVRfQkdSNF9CWVRFLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX1BBTDgsCisgICAgICAgIEFWX1BJWF9GTVRfTU9OT0JMQUNLLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BlbF90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGVsX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhN2E1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BlbF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgInBpeGVscy5oIgorI2luY2x1ZGUgInJuZF9hdmcuaCIKKworI2luY2x1ZGUgImJpdF9kZXB0aF90ZW1wbGF0ZS5jIgorCisjZGVmaW5lIERFRl9QRUwoT1BOQU1FLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgRlVOQ0MoT1BOQU1FICMjIF9waXhlbHMyKSh1aW50OF90ICpibG9jaywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHBpeGVsMiAqKSBibG9jayksIEFWX1JOMlAocGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgRlVOQ0MoT1BOQU1FICMjIF9waXhlbHM0KSh1aW50OF90ICpibG9jaywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHBpeGVsNCAqKSBibG9jayksIEFWX1JONFAocGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgRlVOQ0MoT1BOQU1FICMjIF9waXhlbHM4KSh1aW50OF90ICpibG9jaywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHBpeGVsNCAqKSBibG9jayksIEFWX1JONFAocGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHBpeGVsNCAqKSAoYmxvY2sgKyA0ICogc2l6ZW9mKHBpeGVsKSkpLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIEFWX1JONFAocGl4ZWxzICsgNCAqIHNpemVvZihwaXhlbCkpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitDQUxMXzJYX1BJWEVMUyhGVU5DQyhPUE5BTUUgIyMgX3BpeGVsczE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBGVU5DQyhPUE5BTUUgIyMgX3BpeGVsczgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA4ICogc2l6ZW9mKHBpeGVsKSkKKworI2RlZmluZSBvcF9hdmcoYSwgYikgYSA9IHJuZF9hdmdfcGl4ZWw0KGEsIGIpCisjZGVmaW5lIG9wX3B1dChhLCBiKSBhID0gYgorCitERUZfUEVMKGF2Zywgb3BfYXZnKQorREVGX1BFTChwdXQsIG9wX3B1dCkKKyN1bmRlZiBvcF9hdmcKKyN1bmRlZiBvcF9wdXQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Bnc3N1YmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGdzc3ViZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmMWY4MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Bnc3N1YmRlYy5jCkBAIC0wLDAgKzEsNjk5IEBACisvKgorICogUEdTIHN1YnRpdGxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBTdGVwaGVuIEJhY2t3YXkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUEdTIHN1YnRpdGxlIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb2xvcnNwYWNlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjZGVmaW5lIFJHQkEocixnLGIsYSkgKCgoYSkgPDwgMjQpIHwgKChyKSA8PCAxNikgfCAoKGcpIDw8IDgpIHwgKGIpKQorI2RlZmluZSBNQVhfRVBPQ0hfUEFMRVRURVMgOCAgIC8vIE1heCA4IGFsbG93ZWQgcGVyIFBHUyBlcG9jaAorI2RlZmluZSBNQVhfRVBPQ0hfT0JKRUNUUyAgNjQgIC8vIE1heCA2NCBhbGxvd2VkIHBlciBQR1MgZXBvY2gKKyNkZWZpbmUgTUFYX09CSkVDVF9SRUZTICAgIDIgICAvLyBNYXggb2JqZWN0cyBwZXIgZGlzcGxheSBzZXQKKworZW51bSBTZWdtZW50VHlwZSB7CisgICAgUEFMRVRURV9TRUdNRU5UICAgICAgPSAweDE0LAorICAgIE9CSkVDVF9TRUdNRU5UICAgICAgID0gMHgxNSwKKyAgICBQUkVTRU5UQVRJT05fU0VHTUVOVCA9IDB4MTYsCisgICAgV0lORE9XX1NFR01FTlQgICAgICAgPSAweDE3LAorICAgIERJU1BMQVlfU0VHTUVOVCAgICAgID0gMHg4MCwKK307CisKK3R5cGVkZWYgc3RydWN0IFBHU1N1Yk9iamVjdFJlZiB7CisgICAgaW50ICAgICBpZDsKKyAgICBpbnQgICAgIHdpbmRvd19pZDsKKyAgICB1aW50OF90IGNvbXBvc2l0aW9uX2ZsYWc7CisgICAgaW50ICAgICB4OworICAgIGludCAgICAgeTsKKyAgICBpbnQgICAgIGNyb3BfeDsKKyAgICBpbnQgICAgIGNyb3BfeTsKKyAgICBpbnQgICAgIGNyb3BfdzsKKyAgICBpbnQgICAgIGNyb3BfaDsKK30gUEdTU3ViT2JqZWN0UmVmOworCit0eXBlZGVmIHN0cnVjdCBQR1NTdWJQcmVzZW50YXRpb24geworICAgIGludCBpZF9udW1iZXI7CisgICAgaW50IHBhbGV0dGVfaWQ7CisgICAgaW50IG9iamVjdF9jb3VudDsKKyAgICBQR1NTdWJPYmplY3RSZWYgb2JqZWN0c1tNQVhfT0JKRUNUX1JFRlNdOworICAgIGludDY0X3QgcHRzOworfSBQR1NTdWJQcmVzZW50YXRpb247CisKK3R5cGVkZWYgc3RydWN0IFBHU1N1Yk9iamVjdCB7CisgICAgaW50ICAgICAgICAgIGlkOworICAgIGludCAgICAgICAgICB3OworICAgIGludCAgICAgICAgICBoOworICAgIHVpbnQ4X3QgICAgICAqcmxlOworICAgIHVuc2lnbmVkIGludCBybGVfYnVmZmVyX3NpemUsIHJsZV9kYXRhX2xlbjsKKyAgICB1bnNpZ25lZCBpbnQgcmxlX3JlbWFpbmluZ19sZW47Cit9IFBHU1N1Yk9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgUEdTU3ViT2JqZWN0cyB7CisgICAgaW50ICAgICAgICAgIGNvdW50OworICAgIFBHU1N1Yk9iamVjdCBvYmplY3RbTUFYX0VQT0NIX09CSkVDVFNdOworfSBQR1NTdWJPYmplY3RzOworCit0eXBlZGVmIHN0cnVjdCBQR1NTdWJQYWxldHRlIHsKKyAgICBpbnQgICAgICAgICBpZDsKKyAgICB1aW50MzJfdCAgICBjbHV0WzI1Nl07Cit9IFBHU1N1YlBhbGV0dGU7CisKK3R5cGVkZWYgc3RydWN0IFBHU1N1YlBhbGV0dGVzIHsKKyAgICBpbnQgICAgICAgICAgIGNvdW50OworICAgIFBHU1N1YlBhbGV0dGUgcGFsZXR0ZVtNQVhfRVBPQ0hfUEFMRVRURVNdOworfSBQR1NTdWJQYWxldHRlczsKKwordHlwZWRlZiBzdHJ1Y3QgUEdTU3ViQ29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgUEdTU3ViUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbjsKKyAgICBQR1NTdWJQYWxldHRlcyAgICAgcGFsZXR0ZXM7CisgICAgUEdTU3ViT2JqZWN0cyAgICAgIG9iamVjdHM7CisgICAgaW50IGZvcmNlZF9zdWJzX29ubHk7Cit9IFBHU1N1YkNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIGZsdXNoX2NhY2hlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBQR1NTdWJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+b2JqZWN0cy5jb3VudDsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWVwKCZjdHgtPm9iamVjdHMub2JqZWN0W2ldLnJsZSk7CisgICAgICAgIGN0eC0+b2JqZWN0cy5vYmplY3RbaV0ucmxlX2J1ZmZlcl9zaXplICA9IDA7CisgICAgICAgIGN0eC0+b2JqZWN0cy5vYmplY3RbaV0ucmxlX3JlbWFpbmluZ19sZW4gID0gMDsKKyAgICB9CisgICAgY3R4LT5vYmplY3RzLmNvdW50ID0gMDsKKyAgICBjdHgtPnBhbGV0dGVzLmNvdW50ID0gMDsKK30KKworc3RhdGljIFBHU1N1Yk9iamVjdCAqIGZpbmRfb2JqZWN0KGludCBpZCwgUEdTU3ViT2JqZWN0cyAqb2JqZWN0cykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBvYmplY3RzLT5jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChvYmplY3RzLT5vYmplY3RbaV0uaWQgPT0gaWQpCisgICAgICAgICAgICByZXR1cm4gJm9iamVjdHMtPm9iamVjdFtpXTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBQR1NTdWJQYWxldHRlICogZmluZF9wYWxldHRlKGludCBpZCwgUEdTU3ViUGFsZXR0ZXMgKnBhbGV0dGVzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBhbGV0dGVzLT5jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChwYWxldHRlcy0+cGFsZXR0ZVtpXS5pZCA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiAmcGFsZXR0ZXMtPnBhbGV0dGVbaV07CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdF9kZWNvZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+cGl4X2ZtdCAgICAgPSBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGNsb3NlX2RlY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGZsdXNoX2NhY2hlKGF2Y3R4KTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSB0aGUgUkxFIGRhdGEuCisgKgorICogVGhlIHN1YnRpdGxlIGlzIHN0b3JlZCBhcyBhIFJ1biBMZW5ndGggRW5jb2RlZCBpbWFnZS4KKyAqCisgKiBAcGFyYW0gYXZjdHggY29udGFpbnMgdGhlIGN1cnJlbnQgY29kZWMgY29udGV4dAorICogQHBhcmFtIHN1YiBwb2ludGVyIHRvIHRoZSBwcm9jZXNzZWQgc3VidGl0bGUgZGF0YQorICogQHBhcmFtIGJ1ZiBwb2ludGVyIHRvIHRoZSBSTEUgZGF0YSB0byBwcm9jZXNzCisgKiBAcGFyYW0gYnVmX3NpemUgc2l6ZSBvZiB0aGUgUkxFIGRhdGEgdG8gcHJvY2VzcworICovCitzdGF0aWMgaW50IGRlY29kZV9ybGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlN1YnRpdGxlUmVjdCAqcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGludCBidWZfc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpybGVfYml0bWFwX2VuZDsKKyAgICBpbnQgcGl4ZWxfY291bnQsIGxpbmVfY291bnQ7CisKKyAgICBybGVfYml0bWFwX2VuZCA9IGJ1ZiArIGJ1Zl9zaXplOworCisgICAgcmVjdC0+cGljdC5kYXRhWzBdID0gYXZfbWFsbG9jKHJlY3QtPncgKiByZWN0LT5oKTsKKworICAgIGlmICghcmVjdC0+cGljdC5kYXRhWzBdKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcGl4ZWxfY291bnQgPSAwOworICAgIGxpbmVfY291bnQgID0gMDsKKworICAgIHdoaWxlIChidWYgPCBybGVfYml0bWFwX2VuZCAmJiBsaW5lX2NvdW50IDwgcmVjdC0+aCkgeworICAgICAgICB1aW50OF90IGZsYWdzLCBjb2xvcjsKKyAgICAgICAgaW50IHJ1bjsKKworICAgICAgICBjb2xvciA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1Zik7CisgICAgICAgIHJ1biAgID0gMTsKKworICAgICAgICBpZiAoY29sb3IgPT0gMHgwMCkgeworICAgICAgICAgICAgZmxhZ3MgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpOworICAgICAgICAgICAgcnVuICAgPSBmbGFncyAmIDB4M2Y7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDQwKQorICAgICAgICAgICAgICAgIHJ1biA9IChydW4gPDwgOCkgKyBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpOworICAgICAgICAgICAgY29sb3IgPSBmbGFncyAmIDB4ODAgPyBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChydW4gPiAwICYmIHBpeGVsX2NvdW50ICsgcnVuIDw9IHJlY3QtPncgKiByZWN0LT5oKSB7CisgICAgICAgICAgICBtZW1zZXQocmVjdC0+cGljdC5kYXRhWzBdICsgcGl4ZWxfY291bnQsIGNvbG9yLCBydW4pOworICAgICAgICAgICAgcGl4ZWxfY291bnQgKz0gcnVuOworICAgICAgICB9IGVsc2UgaWYgKCFydW4pIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBOZXcgTGluZS4gQ2hlY2sgaWYgY29ycmVjdCBwaXhlbHMgZGVjb2RlZCwgaWYgbm90IGRpc3BsYXkgd2FybmluZworICAgICAgICAgICAgICogYW5kIGFkanVzdCBiaXRtYXAgcG9pbnRlciB0byBjb3JyZWN0IG5ldyBsaW5lIHBvc2l0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocGl4ZWxfY291bnQgJSByZWN0LT53ID4gMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGVjb2RlZCAlZCBwaXhlbHMsIHdoZW4gbGluZSBzaG91bGQgYmUgJWQgcGl4ZWxzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudCAlIHJlY3QtPncsIHJlY3QtPncpOworICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lX2NvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGl4ZWxfY291bnQgPCByZWN0LT53ICogcmVjdC0+aCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluc3VmZmljaWVudCBSTEUgZGF0YSBmb3Igc3VidGl0bGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdl9kbG9nKGF2Y3R4LCAiUGl4ZWwgQ291bnQgPSAlZCwgQXJlYSA9ICVkXG4iLCBwaXhlbF9jb3VudCwgcmVjdC0+dyAqIHJlY3QtPmgpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGFyc2UgdGhlIHBpY3R1cmUgc2VnbWVudCBwYWNrZXQuCisgKgorICogVGhlIHBpY3R1cmUgc2VnbWVudCBjb250YWlucyBkZXRhaWxzIG9uIHRoZSBzZXF1ZW5jZSBpZCwKKyAqIHdpZHRoLCBoZWlnaHQgYW5kIFJ1biBMZW5ndGggRW5jb2RlZCAoUkxFKSBiaXRtYXAgZGF0YS4KKyAqCisgKiBAcGFyYW0gYXZjdHggY29udGFpbnMgdGhlIGN1cnJlbnQgY29kZWMgY29udGV4dAorICogQHBhcmFtIGJ1ZiBwb2ludGVyIHRvIHRoZSBwYWNrZXQgdG8gcHJvY2VzcworICogQHBhcmFtIGJ1Zl9zaXplIHNpemUgb2YgcGFja2V0IHRvIHByb2Nlc3MKKyAqLworc3RhdGljIGludCBwYXJzZV9vYmplY3Rfc2VnbWVudChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgUEdTU3ViQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBQR1NTdWJPYmplY3QgKm9iamVjdDsKKworICAgIHVpbnQ4X3Qgc2VxdWVuY2VfZGVzYzsKKyAgICB1bnNpZ25lZCBpbnQgcmxlX2JpdG1hcF9sZW4sIHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGlkOworCisgICAgaWYgKGJ1Zl9zaXplIDw9IDQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGJ1Zl9zaXplIC09IDQ7CisKKyAgICBpZCA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmJ1Zik7CisgICAgb2JqZWN0ID0gZmluZF9vYmplY3QoaWQsICZjdHgtPm9iamVjdHMpOworICAgIGlmICghb2JqZWN0KSB7CisgICAgICAgIGlmIChjdHgtPm9iamVjdHMuY291bnQgPj0gTUFYX0VQT0NIX09CSkVDVFMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgb2JqZWN0cyBpbiBlcG9jaFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBvYmplY3QgPSAmY3R4LT5vYmplY3RzLm9iamVjdFtjdHgtPm9iamVjdHMuY291bnQrK107CisgICAgICAgIG9iamVjdC0+aWQgPSBpZDsKKyAgICB9CisKKyAgICAvKiBza2lwIG9iamVjdCB2ZXJzaW9uIG51bWJlciAqLworICAgIGJ1ZiArPSAxOworCisgICAgLyogUmVhZCB0aGUgU2VxdWVuY2UgRGVzY3JpcHRpb24gdG8gZGV0ZXJtaW5lIGlmIHN0YXJ0IG9mIFJMRSBkYXRhIG9yIGFwcGVuZGVkIHRvIHByZXZpb3VzIFJMRSAqLworICAgIHNlcXVlbmNlX2Rlc2MgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpOworCisgICAgaWYgKCEoc2VxdWVuY2VfZGVzYyAmIDB4ODApKSB7CisgICAgICAgIC8qIEFkZGl0aW9uYWwgUkxFIGRhdGEgKi8KKyAgICAgICAgaWYgKGJ1Zl9zaXplID4gb2JqZWN0LT5ybGVfcmVtYWluaW5nX2xlbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIG1lbWNweShvYmplY3QtPnJsZSArIG9iamVjdC0+cmxlX2RhdGFfbGVuLCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgb2JqZWN0LT5ybGVfZGF0YV9sZW4gKz0gYnVmX3NpemU7CisgICAgICAgIG9iamVjdC0+cmxlX3JlbWFpbmluZ19sZW4gLT0gYnVmX3NpemU7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGJ1Zl9zaXplIDw9IDcpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGJ1Zl9zaXplIC09IDc7CisKKyAgICAvKiBEZWNvZGUgcmxlIGJpdG1hcCBsZW5ndGgsIHN0b3JlZCBzaXplIGluY2x1ZGVzIHdpZHRoL2hlaWdodCBkYXRhICovCisgICAgcmxlX2JpdG1hcF9sZW4gPSBieXRlc3RyZWFtX2dldF9iZTI0KCZidWYpIC0gMioyOworCisgICAgaWYgKGJ1Zl9zaXplID4gcmxlX2JpdG1hcF9sZW4pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQnVmZmVyIGRpbWVuc2lvbiAlZCBsYXJnZXIgdGhhbiB0aGUgZXhwZWN0ZWQgUkxFIGRhdGEgJWRcbiIsCisgICAgICAgICAgICAgICBidWZfc2l6ZSwgcmxlX2JpdG1hcF9sZW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBHZXQgYml0bWFwIGRpbWVuc2lvbnMgZnJvbSBkYXRhICovCisgICAgd2lkdGggID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYnVmKTsKKyAgICBoZWlnaHQgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZidWYpOworCisgICAgLyogTWFrZSBzdXJlIHRoZSBiaXRtYXAgaXMgbm90IHRvbyBsYXJnZSAqLworICAgIGlmIChhdmN0eC0+d2lkdGggPCB3aWR0aCB8fCBhdmN0eC0+aGVpZ2h0IDwgaGVpZ2h0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQml0bWFwIGRpbWVuc2lvbnMgbGFyZ2VyIHRoYW4gdmlkZW8uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgb2JqZWN0LT53ID0gd2lkdGg7CisgICAgb2JqZWN0LT5oID0gaGVpZ2h0OworCisgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZvYmplY3QtPnJsZSwgJm9iamVjdC0+cmxlX2J1ZmZlcl9zaXplLCBybGVfYml0bWFwX2xlbik7CisKKyAgICBpZiAoIW9iamVjdC0+cmxlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgbWVtY3B5KG9iamVjdC0+cmxlLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBvYmplY3QtPnJsZV9kYXRhX2xlbiA9IGJ1Zl9zaXplOworICAgIG9iamVjdC0+cmxlX3JlbWFpbmluZ19sZW4gPSBybGVfYml0bWFwX2xlbiAtIGJ1Zl9zaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGFyc2UgdGhlIHBhbGV0dGUgc2VnbWVudCBwYWNrZXQuCisgKgorICogVGhlIHBhbGV0dGUgc2VnbWVudCBjb250YWlucyBkZXRhaWxzIG9mIHRoZSBwYWxldHRlLAorICogYSBtYXhpbXVtIG9mIDI1NiBjb2xvcnMgY2FuIGJlIGRlZmluZWQuCisgKgorICogQHBhcmFtIGF2Y3R4IGNvbnRhaW5zIHRoZSBjdXJyZW50IGNvZGVjIGNvbnRleHQKKyAqIEBwYXJhbSBidWYgcG9pbnRlciB0byB0aGUgcGFja2V0IHRvIHByb2Nlc3MKKyAqIEBwYXJhbSBidWZfc2l6ZSBzaXplIG9mIHBhY2tldCB0byBwcm9jZXNzCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfcGFsZXR0ZV9zZWdtZW50KEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBQR1NTdWJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFBHU1N1YlBhbGV0dGUgKnBhbGV0dGU7CisKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisgICAgY29uc3QgdWludDhfdCAqY20gICAgICA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOworICAgIGludCBjb2xvcl9pZDsKKyAgICBpbnQgeSwgY2IsIGNyLCBhbHBoYTsKKyAgICBpbnQgciwgZywgYiwgcl9hZGQsIGdfYWRkLCBiX2FkZDsKKyAgICBpbnQgaWQ7CisKKyAgICBpZCAgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpOworICAgIHBhbGV0dGUgPSBmaW5kX3BhbGV0dGUoaWQsICZjdHgtPnBhbGV0dGVzKTsKKyAgICBpZiAoIXBhbGV0dGUpIHsKKyAgICAgICAgaWYgKGN0eC0+cGFsZXR0ZXMuY291bnQgPj0gTUFYX0VQT0NIX1BBTEVUVEVTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IHBhbGV0dGVzIGluIGVwb2NoXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHBhbGV0dGUgPSAmY3R4LT5wYWxldHRlcy5wYWxldHRlW2N0eC0+cGFsZXR0ZXMuY291bnQrK107CisgICAgICAgIHBhbGV0dGUtPmlkICA9IGlkOworICAgIH0KKworICAgIC8qIFNraXAgcGFsZXR0ZSB2ZXJzaW9uICovCisgICAgYnVmICs9IDE7CisKKyAgICB3aGlsZSAoYnVmIDwgYnVmX2VuZCkgeworICAgICAgICBjb2xvcl9pZCAgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpOworICAgICAgICB5ICAgICAgICAgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpOworICAgICAgICBjciAgICAgICAgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpOworICAgICAgICBjYiAgICAgICAgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpOworICAgICAgICBhbHBoYSAgICAgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpOworCisgICAgICAgIFlVVl9UT19SR0IxKGNiLCBjcik7CisgICAgICAgIFlVVl9UT19SR0IyKHIsIGcsIGIsIHkpOworCisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJDb2xvciAlZCA6PSAoJWQsJWQsJWQsJWQpXG4iLCBjb2xvcl9pZCwgciwgZywgYiwgYWxwaGEpOworCisgICAgICAgIC8qIFN0b3JlIGNvbG9yIGluIHBhbGV0dGUgKi8KKyAgICAgICAgcGFsZXR0ZS0+Y2x1dFtjb2xvcl9pZF0gPSBSR0JBKHIsZyxiLGFscGhhKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGFyc2UgdGhlIHByZXNlbnRhdGlvbiBzZWdtZW50IHBhY2tldC4KKyAqCisgKiBUaGUgcHJlc2VudGF0aW9uIHNlZ21lbnQgY29udGFpbnMgZGV0YWlscyBvbiB0aGUgdmlkZW8KKyAqIHdpZHRoLCB2aWRlbyBoZWlnaHQsIHggJiB5IHN1YnRpdGxlIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBhdmN0eCBjb250YWlucyB0aGUgY3VycmVudCBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW0gYnVmIHBvaW50ZXIgdG8gdGhlIHBhY2tldCB0byBwcm9jZXNzCisgKiBAcGFyYW0gYnVmX3NpemUgc2l6ZSBvZiBwYWNrZXQgdG8gcHJvY2VzcworICogQHRvZG8gVE9ETzogSW1wbGVtZW50IGNyb3BwaW5nCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfcHJlc2VudGF0aW9uX3NlZ21lbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpCit7CisgICAgUEdTU3ViQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgc3RhdGUsIHJldDsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisKKyAgICAvLyBWaWRlbyBkZXNjcmlwdG9yCisgICAgaW50IHcgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZidWYpOworICAgIGludCBoID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYnVmKTsKKworICAgIGN0eC0+cHJlc2VudGF0aW9uLnB0cyA9IHB0czsKKworICAgIGF2X2Rsb2coYXZjdHgsICJWaWRlbyBEaW1lbnNpb25zICVkeCVkXG4iLAorICAgICAgICAgICAgdywgaCk7CisgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHcsIGgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogU2tpcCAxIGJ5dGVzIG9mIHVua25vd24sIGZyYW1lIHJhdGUgKi8KKyAgICBidWYrKzsKKworICAgIC8vIENvbXBvc2l0aW9uIGRlc2NyaXB0b3IKKyAgICBjdHgtPnByZXNlbnRhdGlvbi5pZF9udW1iZXIgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZidWYpOworICAgIC8qCisgICAgICogc3RhdGUgaXMgYSAyIGJpdCBmaWVsZCB0aGF0IGRlZmluZXMgcGdzIGVwb2NoIGJvdW5kYXJpZXMKKyAgICAgKiAwMCAtIE5vcm1hbCwgcHJldmlvdXNseSBkZWZpbmVkIG9iamVjdHMgYW5kIHBhbGV0dGVzIGFyZSBzdGlsbCB2YWxpZAorICAgICAqIDAxIC0gQWNxdWlzaXRpb24gcG9pbnQsIHByZXZpb3VzIG9iamVjdHMgYW5kIHBhbGV0dGVzIGNhbiBiZSByZWxlYXNlZAorICAgICAqIDEwIC0gRXBvY2ggc3RhcnQsIHByZXZpb3VzIG9iamVjdHMgYW5kIHBhbGV0dGVzIGNhbiBiZSByZWxlYXNlZAorICAgICAqIDExIC0gRXBvY2ggY29udGludWUsIHByZXZpb3VzIG9iamVjdHMgYW5kIHBhbGV0dGVzIGNhbiBiZSByZWxlYXNlZAorICAgICAqCisgICAgICogcmVzZXJ2ZWQgNiBiaXRzIGRpc2NhcmRlZAorICAgICAqLworICAgIHN0YXRlID0gYnl0ZXN0cmVhbV9nZXRfYnl0ZSgmYnVmKSA+PiA2OworICAgIGlmIChzdGF0ZSAhPSAwKSB7CisgICAgICAgIGZsdXNoX2NhY2hlKGF2Y3R4KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHNraXAgcGFsZXR0ZV91cGRhdGVfZmxhZyAoMHg4MCksCisgICAgICovCisgICAgYnVmICs9IDE7CisgICAgY3R4LT5wcmVzZW50YXRpb24ucGFsZXR0ZV9pZCA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1Zik7CisgICAgY3R4LT5wcmVzZW50YXRpb24ub2JqZWN0X2NvdW50ID0gYnl0ZXN0cmVhbV9nZXRfYnl0ZSgmYnVmKTsKKyAgICBpZiAoY3R4LT5wcmVzZW50YXRpb24ub2JqZWN0X2NvdW50ID4gTUFYX09CSkVDVF9SRUZTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIHByZXNlbnRhdGlvbiBvYmplY3RzICVkXG4iLAorICAgICAgICAgICAgICAgY3R4LT5wcmVzZW50YXRpb24ub2JqZWN0X2NvdW50KTsKKyAgICAgICAgY3R4LT5wcmVzZW50YXRpb24ub2JqZWN0X2NvdW50ID0gMjsKKyAgICAgICAgaWYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdF9jb3VudDsgaSsrKQorICAgIHsKKworICAgICAgICBpZiAoYnVmX2VuZCAtIGJ1ZiA8IDgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNlbnQgc3BhY2UgZm9yIG9iamVjdFxuIik7CisgICAgICAgICAgICBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RfY291bnQgPSBpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RzW2ldLmlkID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYnVmKTsKKyAgICAgICAgY3R4LT5wcmVzZW50YXRpb24ub2JqZWN0c1tpXS53aW5kb3dfaWQgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpOworICAgICAgICBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RzW2ldLmNvbXBvc2l0aW9uX2ZsYWcgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZidWYpOworCisgICAgICAgIGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdHNbaV0ueCA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmJ1Zik7CisgICAgICAgIGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdHNbaV0ueSA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmJ1Zik7CisKKyAgICAgICAgLy8gSWYgY3JvcHBpbmcKKyAgICAgICAgaWYgKGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdHNbaV0uY29tcG9zaXRpb25fZmxhZyAmIDB4ODApIHsKKyAgICAgICAgICAgIGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdHNbaV0uY3JvcF94ID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYnVmKTsKKyAgICAgICAgICAgIGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdHNbaV0uY3JvcF95ID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYnVmKTsKKyAgICAgICAgICAgIGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdHNbaV0uY3JvcF93ID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYnVmKTsKKyAgICAgICAgICAgIGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdHNbaV0uY3JvcF9oID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJTdWJ0aXRsZSBQbGFjZW1lbnQgeD0lZCwgeT0lZFxuIiwKKyAgICAgICAgICAgICAgICBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RzW2ldLngsIGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdHNbaV0ueSk7CisKKyAgICAgICAgaWYgKGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdHNbaV0ueCA+IGF2Y3R4LT53aWR0aCB8fAorICAgICAgICAgICAgY3R4LT5wcmVzZW50YXRpb24ub2JqZWN0c1tpXS55ID4gYXZjdHgtPmhlaWdodCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTdWJ0aXRsZSBvdXQgb2YgdmlkZW8gYm91bmRzLiB4ID0gJWQsIHkgPSAlZCwgdmlkZW8gd2lkdGggPSAlZCwgdmlkZW8gaGVpZ2h0ID0gJWQuXG4iLAorICAgICAgICAgICAgICAgICAgIGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdHNbaV0ueCwKKyAgICAgICAgICAgICAgICAgICBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RzW2ldLnksCisgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgICAgICBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RzW2ldLnggPSAwOworICAgICAgICAgICAgY3R4LT5wcmVzZW50YXRpb24ub2JqZWN0c1tpXS55ID0gMDsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGFyc2UgdGhlIGRpc3BsYXkgc2VnbWVudCBwYWNrZXQuCisgKgorICogVGhlIGRpc3BsYXkgc2VnbWVudCBjb250cm9scyB0aGUgdXBkYXRpbmcgb2YgdGhlIGRpc3BsYXkuCisgKgorICogQHBhcmFtIGF2Y3R4IGNvbnRhaW5zIHRoZSBjdXJyZW50IGNvZGVjIGNvbnRleHQKKyAqIEBwYXJhbSBkYXRhIHBvaW50ZXIgdG8gdGhlIGRhdGEgcGVydGFpbmluZyB0aGUgc3VidGl0bGUgdG8gZGlzcGxheQorICogQHBhcmFtIGJ1ZiBwb2ludGVyIHRvIHRoZSBwYWNrZXQgdG8gcHJvY2VzcworICogQHBhcmFtIGJ1Zl9zaXplIHNpemUgb2YgcGFja2V0IHRvIHByb2Nlc3MKKyAqLworc3RhdGljIGludCBkaXNwbGF5X2VuZF9zZWdtZW50KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBBVlN1YnRpdGxlICAgICpzdWIgPSBkYXRhOworICAgIFBHU1N1YkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBwdHM7CisgICAgUEdTU3ViUGFsZXR0ZSAqcGFsZXR0ZTsKKyAgICBpbnQgaSwgcmV0OworCisgICAgcHRzID0gY3R4LT5wcmVzZW50YXRpb24ucHRzICE9IEFWX05PUFRTX1ZBTFVFID8gY3R4LT5wcmVzZW50YXRpb24ucHRzIDogc3ViLT5wdHM7CisgICAgbWVtc2V0KHN1YiwgMCwgc2l6ZW9mKCpzdWIpKTsKKyAgICBzdWItPnB0cyA9IHB0czsKKyAgICBjdHgtPnByZXNlbnRhdGlvbi5wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBzdWItPnN0YXJ0X2Rpc3BsYXlfdGltZSA9IDA7CisgICAgLy8gVGhlcmUgaXMgbm8gZXhwbGljaXQgZW5kIHRpbWUgZm9yIFBHUyBzdWJ0aXRsZXMuICBUaGUgZW5kIHRpbWUKKyAgICAvLyBpcyBkZWZpbmVkIGJ5IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzdWIgd2hpY2ggbWF5IGNvbnRhaW4gbm8KKyAgICAvLyBvYmplY3RzIChpLmUuIGNsZWFycyB0aGUgcHJldmlvdXMgc3ViKQorICAgIHN1Yi0+ZW5kX2Rpc3BsYXlfdGltZSAgID0gVUlOVDMyX01BWDsKKyAgICBzdWItPmZvcm1hdCAgICAgICAgICAgICA9IDA7CisKKyAgICAvLyBCbGFuayBpZiBsYXN0IG9iamVjdF9jb3VudCB3YXMgMC4KKyAgICBpZiAoIWN0eC0+cHJlc2VudGF0aW9uLm9iamVjdF9jb3VudCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgc3ViLT5yZWN0cyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzdWItPnJlY3RzKSAqIGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdF9jb3VudCk7CisgICAgaWYgKCFzdWItPnJlY3RzKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHBhbGV0dGUgPSBmaW5kX3BhbGV0dGUoY3R4LT5wcmVzZW50YXRpb24ucGFsZXR0ZV9pZCwgJmN0eC0+cGFsZXR0ZXMpOworICAgIGlmICghcGFsZXR0ZSkgeworICAgICAgICAvLyBNaXNzaW5nIHBhbGV0dGUuICBTaG91bGQgb25seSBoYXBwZW4gd2l0aCBkYW1hZ2VkIHN0cmVhbXMuCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYWxldHRlIGlkICVkXG4iLAorICAgICAgICAgICAgICAgY3R4LT5wcmVzZW50YXRpb24ucGFsZXR0ZV9pZCk7CisgICAgICAgIGF2c3VidGl0bGVfZnJlZShzdWIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+cHJlc2VudGF0aW9uLm9iamVjdF9jb3VudDsgaSsrKSB7CisgICAgICAgIFBHU1N1Yk9iamVjdCAqb2JqZWN0OworCisgICAgICAgIHN1Yi0+cmVjdHNbaV0gID0gYXZfbWFsbG9jeihzaXplb2YoKnN1Yi0+cmVjdHNbMF0pKTsKKyAgICAgICAgaWYgKCFzdWItPnJlY3RzW2ldKSB7CisgICAgICAgICAgICBhdnN1YnRpdGxlX2ZyZWUoc3ViKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgc3ViLT5udW1fcmVjdHMrKzsKKyAgICAgICAgc3ViLT5yZWN0c1tpXS0+dHlwZSA9IFNVQlRJVExFX0JJVE1BUDsKKworICAgICAgICAvKiBQcm9jZXNzIGJpdG1hcCAqLworICAgICAgICBvYmplY3QgPSBmaW5kX29iamVjdChjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RzW2ldLmlkLCAmY3R4LT5vYmplY3RzKTsKKyAgICAgICAgaWYgKCFvYmplY3QpIHsKKyAgICAgICAgICAgIC8vIE1pc3Npbmcgb2JqZWN0LiAgU2hvdWxkIG9ubHkgaGFwcGVuIHdpdGggZGFtYWdlZCBzdHJlYW1zLgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG9iamVjdCBpZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RzW2ldLmlkKTsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkgeworICAgICAgICAgICAgICAgIGF2c3VidGl0bGVfZnJlZShzdWIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTGVhdmVzIHJlY3QgZW1wdHkgd2l0aCAwIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3R4LT5wcmVzZW50YXRpb24ub2JqZWN0c1tpXS5jb21wb3NpdGlvbl9mbGFnICYgMHg0MCkKKyAgICAgICAgICAgIHN1Yi0+cmVjdHNbaV0tPmZsYWdzIHw9IEFWX1NVQlRJVExFX0ZMQUdfRk9SQ0VEOworCisgICAgICAgIHN1Yi0+cmVjdHNbaV0tPnggICAgPSBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RzW2ldLng7CisgICAgICAgIHN1Yi0+cmVjdHNbaV0tPnkgICAgPSBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RzW2ldLnk7CisgICAgICAgIHN1Yi0+cmVjdHNbaV0tPncgICAgPSBvYmplY3QtPnc7CisgICAgICAgIHN1Yi0+cmVjdHNbaV0tPmggICAgPSBvYmplY3QtPmg7CisKKyAgICAgICAgc3ViLT5yZWN0c1tpXS0+cGljdC5saW5lc2l6ZVswXSA9IG9iamVjdC0+dzsKKworICAgICAgICBpZiAob2JqZWN0LT5ybGUpIHsKKyAgICAgICAgICAgIGlmIChvYmplY3QtPnJsZV9yZW1haW5pbmdfbGVuKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJSTEUgZGF0YSBsZW5ndGggJXUgaXMgJXUgYnl0ZXMgc2hvcnRlciB0aGFuIGV4cGVjdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QtPnJsZV9kYXRhX2xlbiwgb2JqZWN0LT5ybGVfcmVtYWluaW5nX2xlbik7CisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIGF2c3VidGl0bGVfZnJlZShzdWIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfcmxlKGF2Y3R4LCBzdWItPnJlY3RzW2ldLCBvYmplY3QtPnJsZSwgb2JqZWN0LT5ybGVfZGF0YV9sZW4pOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSB8fAorICAgICAgICAgICAgICAgICAgICByZXQgPT0gQVZFUlJPUihFTk9NRU0pKSB7CisgICAgICAgICAgICAgICAgICAgIGF2c3VidGl0bGVfZnJlZShzdWIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdWItPnJlY3RzW2ldLT53ID0gMDsKKyAgICAgICAgICAgICAgICBzdWItPnJlY3RzW2ldLT5oID0gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbG9ycyAqLworICAgICAgICBzdWItPnJlY3RzW2ldLT5uYl9jb2xvcnMgICAgPSAyNTY7CisgICAgICAgIHN1Yi0+cmVjdHNbaV0tPnBpY3QuZGF0YVsxXSA9IGF2X21hbGxvY3ooQVZQQUxFVFRFX1NJWkUpOworICAgICAgICBpZiAoIXN1Yi0+cmVjdHNbaV0tPnBpY3QuZGF0YVsxXSkgeworICAgICAgICAgICAgYXZzdWJ0aXRsZV9mcmVlKHN1Yik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjdHgtPmZvcmNlZF9zdWJzX29ubHkgfHwgY3R4LT5wcmVzZW50YXRpb24ub2JqZWN0c1tpXS5jb21wb3NpdGlvbl9mbGFnICYgMHg0MCkKKyAgICAgICAgbWVtY3B5KHN1Yi0+cmVjdHNbaV0tPnBpY3QuZGF0YVsxXSwgcGFsZXR0ZS0+Y2x1dCwgc3ViLT5yZWN0c1tpXS0+bmJfY29sb3JzICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kOworICAgIHVpbnQ4X3QgICAgICAgc2VnbWVudF90eXBlOworICAgIGludCAgICAgICAgICAgc2VnbWVudF9sZW5ndGg7CisgICAgaW50IGksIHJldDsKKworICAgIGF2X2Rsb2coYXZjdHgsICJQR1Mgc3ViIHBhY2tldDpcbiIpOworCisgICAgZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgIiUwMnggIiwgYnVmW2ldKTsKKyAgICAgICAgaWYgKGkgJSAxNiA9PSAxNSkKKyAgICAgICAgICAgIGF2X2Rsb2coYXZjdHgsICJcbiIpOworICAgIH0KKworICAgIGlmIChpICYgMTUpCisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJcbiIpOworCisgICAgKmRhdGFfc2l6ZSA9IDA7CisKKyAgICAvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIGF0IGEgbGVhc3QgYSBzZWdtZW50IGNvZGUgYW5kIHNlZ21lbnQgbGVuZ3RoICovCisgICAgaWYgKGJ1Zl9zaXplIDwgMykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYnVmX2VuZCA9IGJ1ZiArIGJ1Zl9zaXplOworCisgICAgLyogU3RlcCB0aHJvdWdoIGJ1ZmZlciB0byBpZGVudGlmeSBzZWdtZW50cyAqLworICAgIHdoaWxlIChidWYgPCBidWZfZW5kKSB7CisgICAgICAgIHNlZ21lbnRfdHlwZSAgID0gYnl0ZXN0cmVhbV9nZXRfYnl0ZSgmYnVmKTsKKyAgICAgICAgc2VnbWVudF9sZW5ndGggPSBieXRlc3RyZWFtX2dldF9iZTE2KCZidWYpOworCisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJTZWdtZW50IExlbmd0aCAlZCwgU2VnbWVudCBUeXBlICV4XG4iLCBzZWdtZW50X2xlbmd0aCwgc2VnbWVudF90eXBlKTsKKworICAgICAgICBpZiAoc2VnbWVudF90eXBlICE9IERJU1BMQVlfU0VHTUVOVCAmJiBzZWdtZW50X2xlbmd0aCA+IGJ1Zl9lbmQgLSBidWYpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICByZXQgPSAwOworICAgICAgICBzd2l0Y2ggKHNlZ21lbnRfdHlwZSkgeworICAgICAgICBjYXNlIFBBTEVUVEVfU0VHTUVOVDoKKyAgICAgICAgICAgIHJldCA9IHBhcnNlX3BhbGV0dGVfc2VnbWVudChhdmN0eCwgYnVmLCBzZWdtZW50X2xlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPQkpFQ1RfU0VHTUVOVDoKKyAgICAgICAgICAgIHJldCA9IHBhcnNlX29iamVjdF9zZWdtZW50KGF2Y3R4LCBidWYsIHNlZ21lbnRfbGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBSRVNFTlRBVElPTl9TRUdNRU5UOgorICAgICAgICAgICAgcmV0ID0gcGFyc2VfcHJlc2VudGF0aW9uX3NlZ21lbnQoYXZjdHgsIGJ1Ziwgc2VnbWVudF9sZW5ndGgsICgoQVZTdWJ0aXRsZSopKGRhdGEpKS0+cHRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdJTkRPV19TRUdNRU5UOgorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdpbmRvdyBTZWdtZW50IFN0cnVjdHVyZSAoTm8gbmV3IGluZm9ybWF0aW9uIHByb3ZpZGVkKToKKyAgICAgICAgICAgICAqICAgICAyIGJ5dGVzOiBVbmtub3duLAorICAgICAgICAgICAgICogICAgIDIgYnl0ZXM6IFggcG9zaXRpb24gb2Ygc3VidGl0bGUsCisgICAgICAgICAgICAgKiAgICAgMiBieXRlczogWSBwb3NpdGlvbiBvZiBzdWJ0aXRsZSwKKyAgICAgICAgICAgICAqICAgICAyIGJ5dGVzOiBXaWR0aCBvZiBzdWJ0aXRsZSwKKyAgICAgICAgICAgICAqICAgICAyIGJ5dGVzOiBIZWlnaHQgb2Ygc3VidGl0bGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERJU1BMQVlfU0VHTUVOVDoKKyAgICAgICAgICAgIHJldCA9IGRpc3BsYXlfZW5kX3NlZ21lbnQoYXZjdHgsIGRhdGEsIGJ1Ziwgc2VnbWVudF9sZW5ndGgpOworICAgICAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSByZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBzdWJ0aXRsZSBzZWdtZW50IHR5cGUgMHgleCwgbGVuZ3RoICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHNlZ21lbnRfdHlwZSwgc2VnbWVudF9sZW5ndGgpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPCAwICYmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGJ1ZiArPSBzZWdtZW50X2xlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFBHU1N1YkNvbnRleHQsIHgpCisjZGVmaW5lIFNEIEFWX09QVF9GTEFHX1NVQlRJVExFX1BBUkFNIHwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyJmb3JjZWRfc3Vic19vbmx5IiwgIk9ubHkgc2hvdyBmb3JjZWQgc3VidGl0bGVzIiwgT0ZGU0VUKGZvcmNlZF9zdWJzX29ubHkpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIFNEfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHBnc2RlY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJQR1Mgc3VidGl0bGUgZGVjb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX3Bnc3N1Yl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwZ3NzdWIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJIRE1WIFByZXNlbnRhdGlvbiBHcmFwaGljIFN0cmVhbSBzdWJ0aXRsZXMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSERNVl9QR1NfU1VCVElUTEUsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFBHU1N1YkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGluaXRfZGVjb2RlciwKKyAgICAuY2xvc2UgICAgICAgICAgPSBjbG9zZV9kZWNvZGVyLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmcGdzZGVjX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BpY3RvcmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGljdG9yZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjNTFiYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BpY3RvcmRlYy5jCkBAIC0wLDAgKzEsMjY3IEBACisvKgorICogUGljdG9yL1BDIFBhaW50IGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUGljdG9yL1BDIFBhaW50IGRlY29kZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJjZ2FfZGF0YS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IFBpY0NvbnRleHQgeworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBuYl9wbGFuZXM7CisgICAgR2V0Qnl0ZUNvbnRleHQgZzsKK30gUGljQ29udGV4dDsKKworc3RhdGljIHZvaWQgcGljbWVtc2V0XzhicHAoUGljQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCB2YWx1ZSwgaW50IHJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqeCwgaW50ICp5KQoreworICAgIHdoaWxlIChydW4gPiAwKSB7CisgICAgICAgIHVpbnQ4X3QgKmQgPSBmcmFtZS0+ZGF0YVswXSArICp5ICogZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBpZiAoKnggKyBydW4gPj0gcy0+d2lkdGgpIHsKKyAgICAgICAgICAgIGludCBuID0gcy0+d2lkdGggLSAqeDsKKyAgICAgICAgICAgIG1lbXNldChkICsgKngsIHZhbHVlLCBuKTsKKyAgICAgICAgICAgIHJ1biAtPSBuOworICAgICAgICAgICAgKnggPSAwOworICAgICAgICAgICAgKnkgLT0gMTsKKyAgICAgICAgICAgIGlmICgqeSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQoZCArICp4LCB2YWx1ZSwgcnVuKTsKKyAgICAgICAgICAgICp4ICs9IHJ1bjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwaWNtZW1zZXQoUGljQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCB2YWx1ZSwgaW50IHJ1biwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKngsIGludCAqeSwgaW50ICpwbGFuZSwgaW50IGJpdHNfcGVyX3BsYW5lKQoreworICAgIHVpbnQ4X3QgKmQ7CisgICAgaW50IHNoaWZ0ID0gKnBsYW5lICogYml0c19wZXJfcGxhbmU7CisgICAgaW50IG1hc2sgID0gKCgxIDw8IGJpdHNfcGVyX3BsYW5lKSAtIDEpIDw8IHNoaWZ0OworICAgIHZhbHVlICAgPDw9IHNoaWZ0OworCisgICAgd2hpbGUgKHJ1biA+IDApIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoaiA9IDgtYml0c19wZXJfcGxhbmU7IGogPj0gMDsgaiAtPSBiaXRzX3Blcl9wbGFuZSkgeworICAgICAgICAgICAgZCA9IGZyYW1lLT5kYXRhWzBdICsgKnkgKiBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICBkWyp4XSB8PSAodmFsdWUgPj4gaikgJiBtYXNrOworICAgICAgICAgICAgKnggKz0gMTsKKyAgICAgICAgICAgIGlmICgqeCA9PSBzLT53aWR0aCkgeworICAgICAgICAgICAgICAgICp5IC09IDE7CisgICAgICAgICAgICAgICAgKnggPSAwOworICAgICAgICAgICAgICAgIGlmICgqeSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAqeSA9IHMtPmhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgICAgKnBsYW5lICs9IDE7CisgICAgICAgICAgICAgICAgICAgdmFsdWUgPDw9IGJpdHNfcGVyX3BsYW5lOworICAgICAgICAgICAgICAgICAgIG1hc2sgIDw8PSBiaXRzX3Blcl9wbGFuZTsKKyAgICAgICAgICAgICAgICAgICBpZiAoKnBsYW5lID49IHMtPm5iX3BsYW5lcykKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJ1bi0tOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2dhX21vZGU0NV9pbmRleFs2XVs0XSA9IHsKKyAgICBbMF0gPSB7IDAsIDMsICA1LCAgIDcgfSwgLy8gbW9kZTQsIHBhbGV0dGUjMSwgbG93IGludGVuc2l0eQorICAgIFsxXSA9IHsgMCwgMiwgIDQsICAgNiB9LCAvLyBtb2RlNCwgcGFsZXR0ZSMyLCBsb3cgaW50ZW5zaXR5CisgICAgWzJdID0geyAwLCAzLCAgNCwgICA3IH0sIC8vIG1vZGU1LCBsb3cgaW50ZW5zaXR5CisgICAgWzNdID0geyAwLCAxMSwgMTMsIDE1IH0sIC8vIG1vZGU0LCBwYWxldHRlIzEsIGhpZ2ggaW50ZW5zaXR5CisgICAgWzRdID0geyAwLCAxMCwgMTIsIDE0IH0sIC8vIG1vZGU0LCBwYWxldHRlIzIsIGhpZ2ggaW50ZW5zaXR5CisgICAgWzVdID0geyAwLCAxMSwgMTIsIDE1IH0sIC8vIG1vZGU1LCBoaWdoIGludGVuc2l0eQorfTsKKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgUGljQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIHVpbnQzMl90ICpwYWxldHRlOworICAgIGludCBiaXRzX3Blcl9wbGFuZSwgYnBwLCBldHlwZSwgZXNpemUsIG5wYWwsIHBvc19hZnRlcl9wYWw7CisgICAgaW50IGksIHgsIHksIHBsYW5lLCB0bXAsIHJldCwgdmFsOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+ZywgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPCAxMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZzLT5nKSAhPSAweDEyMzQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcy0+d2lkdGggICAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJnMtPmcpOworICAgIHMtPmhlaWdodCAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZzLT5nKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nLCA0KTsKKyAgICB0bXAgICAgICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Zyk7CisgICAgYml0c19wZXJfcGxhbmUgPSB0bXAgJiAweEY7CisgICAgcy0+bmJfcGxhbmVzICAgPSAodG1wID4+IDQpICsgMTsKKyAgICBicHAgICAgICAgICAgICA9IGJpdHNfcGVyX3BsYW5lICogcy0+bmJfcGxhbmVzOworICAgIGlmIChiaXRzX3Blcl9wbGFuZSA+IDggfHwgYnBwIDwgMSB8fCBicHAgPiAzMikgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJVbnN1cHBvcnRlZCBiaXQgZGVwdGgiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGlmIChieXRlc3RyZWFtMl9wZWVrX2J5dGUoJnMtPmcpID09IDB4RkYgfHwgYnBwID09IDEgfHwgYnBwID09IDQgfHwgYnBwID09IDgpIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+ZywgMik7CisgICAgICAgIGV0eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnMtPmcpOworICAgICAgICBlc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5nKTsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSA8IGVzaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXR5cGUgPSAtMTsKKyAgICAgICAgZXNpemUgPSAwOworICAgIH0KKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworCisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUocy0+d2lkdGgsIHMtPmhlaWdodCwgMCwgYXZjdHgpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChzLT53aWR0aCAhPSBhdmN0eC0+d2lkdGggJiYgcy0+aGVpZ2h0ICE9IGF2Y3R4LT5oZWlnaHQpIHsKKyAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHMtPndpZHRoLCBzLT5oZWlnaHQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBtZW1zZXQoZnJhbWUtPmRhdGFbMF0sIDAsIHMtPmhlaWdodCAqIGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgZnJhbWUtPnBpY3RfdHlwZSAgICAgICAgICAgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBmcmFtZS0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisKKyAgICBwb3NfYWZ0ZXJfcGFsID0gYnl0ZXN0cmVhbTJfdGVsbCgmcy0+ZykgKyBlc2l6ZTsKKyAgICBwYWxldHRlID0gKHVpbnQzMl90KilmcmFtZS0+ZGF0YVsxXTsKKyAgICBpZiAoZXR5cGUgPT0gMSAmJiBlc2l6ZSA+IDEgJiYgYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZzLT5nKSA8IDYpIHsKKyAgICAgICAgaW50IGlkeCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKTsKKyAgICAgICAgbnBhbCA9IDQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucGFsOyBpKyspCisgICAgICAgICAgICBwYWxldHRlW2ldID0gZmZfY2dhX3BhbGV0dGVbIGNnYV9tb2RlNDVfaW5kZXhbaWR4XVtpXSBdOworICAgIH0gZWxzZSBpZiAoZXR5cGUgPT0gMikgeworICAgICAgICBucGFsID0gRkZNSU4oZXNpemUsIDE2KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5wYWw7IGkrKykgeworICAgICAgICAgICAgaW50IHBhbF9pZHggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7CisgICAgICAgICAgICBwYWxldHRlW2ldICA9IGZmX2NnYV9wYWxldHRlW0ZGTUlOKHBhbF9pZHgsIDE1KV07CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGV0eXBlID09IDMpIHsKKyAgICAgICAgbnBhbCA9IEZGTUlOKGVzaXplLCAxNik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucGFsOyBpKyspIHsKKyAgICAgICAgICAgIGludCBwYWxfaWR4ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpOworICAgICAgICAgICAgcGFsZXR0ZVtpXSAgPSBmZl9lZ2FfcGFsZXR0ZVtGRk1JTihwYWxfaWR4LCA2MyldOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChldHlwZSA9PSA0IHx8IGV0eXBlID09IDUpIHsKKyAgICAgICAgbnBhbCA9IEZGTUlOKGVzaXplIC8gMywgMjU2KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5wYWw7IGkrKykgeworICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0KCZzLT5nKSA8PCAyOworICAgICAgICAgICAgcGFsZXR0ZVtpXSB8PSAweEZGVSA8PCAyNCB8IHBhbGV0dGVbaV0gPj4gNiAmIDB4MzAzMDM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYnBwID09IDEpIHsKKyAgICAgICAgICAgIG5wYWwgPSAyOworICAgICAgICAgICAgcGFsZXR0ZVswXSA9IDB4RkYwMDAwMDA7CisgICAgICAgICAgICBwYWxldHRlWzFdID0gMHhGRkZGRkZGRjsKKyAgICAgICAgfSBlbHNlIGlmIChicHAgPT0gMikgeworICAgICAgICAgICAgbnBhbCA9IDQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnBhbDsgaSsrKQorICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0gPSBmZl9jZ2FfcGFsZXR0ZVsgY2dhX21vZGU0NV9pbmRleFswXVtpXSBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnBhbCA9IDE2OworICAgICAgICAgICAgbWVtY3B5KHBhbGV0dGUsIGZmX2NnYV9wYWxldHRlLCBucGFsICogNCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gZmlsbCByZW1haW5pbmcgcGFsZXR0ZSBlbnRyaWVzCisgICAgbWVtc2V0KHBhbGV0dGUgKyBucGFsLCAwLCBBVlBBTEVUVEVfU0laRSAtIG5wYWwgKiA0KTsKKyAgICAvLyBza2lwIHJlbWFpbmluZyBwYWxldHRlIGJ5dGVzCisgICAgYnl0ZXN0cmVhbTJfc2Vlaygmcy0+ZywgcG9zX2FmdGVyX3BhbCwgU0VFS19TRVQpOworCisgICAgdmFsID0gMDsKKyAgICB5ID0gcy0+aGVpZ2h0IC0gMTsKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnMtPmcpKSB7CisgICAgICAgIHggPSAwOworICAgICAgICBwbGFuZSA9IDA7CisgICAgICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPj0gNikgeworICAgICAgICAgICAgaW50IHN0b3Bfc2l6ZSwgbWFya2VyLCB0MSwgdDI7CisKKyAgICAgICAgICAgIHQxICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKTsKKyAgICAgICAgICAgIHQyICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5nKTsKKyAgICAgICAgICAgIHN0b3Bfc2l6ZSA9IHQxIC0gRkZNSU4odDEsIHQyKTsKKyAgICAgICAgICAgIC8vIGlnbm9yZSB1bmNvbXByZXNzZWQgYmxvY2sgc2l6ZQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+ZywgMik7CisgICAgICAgICAgICBtYXJrZXIgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7CisKKyAgICAgICAgICAgIHdoaWxlIChwbGFuZSA8IHMtPm5iX3BsYW5lcyAmJgorICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSA+IHN0b3Bfc2l6ZSkgeworICAgICAgICAgICAgICAgIGludCBydW4gPSAxOworICAgICAgICAgICAgICAgIHZhbCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsID09IG1hcmtlcikgeworICAgICAgICAgICAgICAgICAgICBydW4gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChydW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5nKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAoYml0c19wZXJfcGxhbmUgPT0gOCkgeworICAgICAgICAgICAgICAgICAgICBwaWNtZW1zZXRfOGJwcChzLCBmcmFtZSwgdmFsLCBydW4sICZ4LCAmeSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh5IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBpY21lbXNldChzLCBmcmFtZSwgdmFsLCBydW4sICZ4LCAmeSwgJnBsYW5lLCBiaXRzX3Blcl9wbGFuZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHggPCBhdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgICAgIGludCBydW4gPSAoeSArIDEpICogYXZjdHgtPndpZHRoIC0geDsKKyAgICAgICAgICAgIGlmIChiaXRzX3Blcl9wbGFuZSA9PSA4KQorICAgICAgICAgICAgICAgIHBpY21lbXNldF84YnBwKHMsIGZyYW1lLCB2YWwsIHJ1biwgJngsICZ5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwaWNtZW1zZXQocywgZnJhbWUsIHZhbCwgcnVuIC8gKDggLyBiaXRzX3Blcl9wbGFuZSksICZ4LCAmeSwgJnBsYW5lLCBiaXRzX3Blcl9wbGFuZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoeSA+PSAwICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweShmcmFtZS0+ZGF0YVswXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMF0sIHMtPmcuYnVmZmVyLCBGRk1JTihhdmN0eC0+d2lkdGgsIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSkpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+ZywgYXZjdHgtPndpZHRoKTsKKyAgICAgICAgICAgIHktLTsKKyAgICAgICAgfQorICAgIH0KK2ZpbmlzaDoKKworICAgICpnb3RfZnJhbWUgICAgICA9IDE7CisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX3BpY3Rvcl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwaWN0b3IiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQaWN0b3IvUEMgUGFpbnQiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUElDVE9SLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQaWNDb250ZXh0KSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9waXhibG9ja2RzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGl4YmxvY2tkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmRlNjhiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGl4YmxvY2tkc3AuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInBpeGJsb2NrZHNwLmgiCisKKyNkZWZpbmUgQklUX0RFUFRIIDE2CisjaW5jbHVkZSAicGl4YmxvY2tkc3BfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKworI2RlZmluZSBCSVRfREVQVEggOAorI2luY2x1ZGUgInBpeGJsb2NrZHNwX3RlbXBsYXRlLmMiCisKK3N0YXRpYyB2b2lkIGRpZmZfcGl4ZWxzX2MoaW50MTZfdCAqYXZfcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzMiwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIHJlYWQgdGhlIHBpeGVscyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgYmxvY2tbMF0gPSBzMVswXSAtIHMyWzBdOworICAgICAgICBibG9ja1sxXSA9IHMxWzFdIC0gczJbMV07CisgICAgICAgIGJsb2NrWzJdID0gczFbMl0gLSBzMlsyXTsKKyAgICAgICAgYmxvY2tbM10gPSBzMVszXSAtIHMyWzNdOworICAgICAgICBibG9ja1s0XSA9IHMxWzRdIC0gczJbNF07CisgICAgICAgIGJsb2NrWzVdID0gczFbNV0gLSBzMls1XTsKKyAgICAgICAgYmxvY2tbNl0gPSBzMVs2XSAtIHMyWzZdOworICAgICAgICBibG9ja1s3XSA9IHMxWzddIC0gczJbN107CisgICAgICAgIHMxICAgICAgKz0gc3RyaWRlOworICAgICAgICBzMiAgICAgICs9IHN0cmlkZTsKKyAgICAgICAgYmxvY2sgICArPSA4OworICAgIH0KK30KKworYXZfY29sZCB2b2lkIGZmX3BpeGJsb2NrZHNwX2luaXQoUGl4YmxvY2tEU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgY29uc3QgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGggPSBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+IDg7CisKKyAgICBjLT5kaWZmX3BpeGVscyA9IGRpZmZfcGl4ZWxzX2M7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKSB7CisgICAgY2FzZSA5OgorICAgIGNhc2UgMTA6CisgICAgY2FzZSAxMjoKKyAgICBjYXNlIDE0OgorICAgICAgICBjLT5nZXRfcGl4ZWxzID0gZ2V0X3BpeGVsc18xNl9jOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGU8PTggfHwgYXZjdHgtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBjLT5nZXRfcGl4ZWxzID0gZ2V0X3BpeGVsc184X2M7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKEFSQ0hfQUxQSEEpCisgICAgICAgIGZmX3BpeGJsb2NrZHNwX2luaXRfYWxwaGEoYywgYXZjdHgsIGhpZ2hfYml0X2RlcHRoKTsKKyAgICBpZiAoQVJDSF9BUk0pCisgICAgICAgIGZmX3BpeGJsb2NrZHNwX2luaXRfYXJtKGMsIGF2Y3R4LCBoaWdoX2JpdF9kZXB0aCk7CisgICAgaWYgKEFSQ0hfUFBDKQorICAgICAgICBmZl9waXhibG9ja2RzcF9pbml0X3BwYyhjLCBhdmN0eCwgaGlnaF9iaXRfZGVwdGgpOworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfcGl4YmxvY2tkc3BfaW5pdF94ODYoYywgYXZjdHgsIGhpZ2hfYml0X2RlcHRoKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BpeGJsb2NrZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy9waXhibG9ja2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Yjg1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9waXhibG9ja2RzcC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1BJWEJMT0NLRFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19QSVhCTE9DS0RTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUGl4YmxvY2tEU1BDb250ZXh0IHsKKyAgICB2b2lkICgqZ2V0X3BpeGVscykoaW50MTZfdCAqYmxvY2sgLyogYWxpZ24gMTYgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscyAvKiBhbGlnbiA4ICovLAorICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKKyAgICB2b2lkICgqZGlmZl9waXhlbHMpKGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqczEgLyogYWxpZ24gOCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnMyIC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKTsKK30gUGl4YmxvY2tEU1BDb250ZXh0OworCit2b2lkIGZmX3BpeGJsb2NrZHNwX2luaXQoUGl4YmxvY2tEU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl9waXhibG9ja2RzcF9pbml0X2FscGhhKFBpeGJsb2NrRFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKTsKK3ZvaWQgZmZfcGl4YmxvY2tkc3BfaW5pdF9hcm0oUGl4YmxvY2tEU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKTsKK3ZvaWQgZmZfcGl4YmxvY2tkc3BfaW5pdF9wcGMoUGl4YmxvY2tEU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKTsKK3ZvaWQgZmZfcGl4YmxvY2tkc3BfaW5pdF94ODYoUGl4YmxvY2tEU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUElYQkxPQ0tEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcGl4YmxvY2tkc3BfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BpeGJsb2NrZHNwX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlOTEwMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BpeGJsb2NrZHNwX3RlbXBsYXRlLmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYml0X2RlcHRoX3RlbXBsYXRlLmMiCisKK3N0YXRpYyB2b2lkIEZVTkNDKGdldF9waXhlbHMpKGludDE2X3QgKmF2X3Jlc3RyaWN0IGJsb2NrLCBjb25zdCB1aW50OF90ICpfcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSkKK3sKKyAgICBjb25zdCBwaXhlbCAqcGl4ZWxzID0gKGNvbnN0IHBpeGVsICopIF9waXhlbHM7CisgICAgaW50IGk7CisKKyAgICAvKiByZWFkIHRoZSBwaXhlbHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGJsb2NrWzBdID0gcGl4ZWxzWzBdOworICAgICAgICBibG9ja1sxXSA9IHBpeGVsc1sxXTsKKyAgICAgICAgYmxvY2tbMl0gPSBwaXhlbHNbMl07CisgICAgICAgIGJsb2NrWzNdID0gcGl4ZWxzWzNdOworICAgICAgICBibG9ja1s0XSA9IHBpeGVsc1s0XTsKKyAgICAgICAgYmxvY2tbNV0gPSBwaXhlbHNbNV07CisgICAgICAgIGJsb2NrWzZdID0gcGl4ZWxzWzZdOworICAgICAgICBibG9ja1s3XSA9IHBpeGVsc1s3XTsKKyAgICAgICAgcGl4ZWxzICArPSBsaW5lX3NpemUgLyBzaXplb2YocGl4ZWwpOworICAgICAgICBibG9jayAgICs9IDg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcGl4ZWxzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9waXhlbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGVhY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcGl4ZWxzLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUElYRUxTX0gKKyNkZWZpbmUgQVZDT0RFQ19QSVhFTFNfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIHBpeGVsIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQ0FMTF8yWF9QSVhFTFNfTUFDUk8oU1RBVElDLCBhLCBiLCBuKSAgICAgICAgXAorU1RBVElDIHZvaWQgYSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBcCisgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIoYmxvY2ssIHBpeGVscywgbGluZV9zaXplLCBoKTsgICAgICAgICAgICAgICAgICBcCisgICAgYihibG9jayArIG4sIHBpeGVscyArIG4sIGxpbmVfc2l6ZSwgaCk7ICAgICAgICAgIFwKK30KKworI2RlZmluZSBDQUxMXzJYX1BJWEVMUyhhLCBiLCBuKSBDQUxMXzJYX1BJWEVMU19NQUNSTyhzdGF0aWMsIGEsIGIsIG4pCisjZGVmaW5lIENBTExfMlhfUElYRUxTX0VYUE9SVChhLCBiLCBuKSBDQUxMXzJYX1BJWEVMU19NQUNSTygsIGEsIGIsIG4pCisKKyNlbmRpZiAvKiBBVkNPREVDX1BJWEVMU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wbmcuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTJiNTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wbmcuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogUE5HIGltYWdlIGZvcm1hdAorICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJwbmcuaCIKKworLyogTWFzayB0byBkZXRlcm1pbmUgd2hpY2ggeSBwaXhlbHMgYXJlIHZhbGlkIGluIGEgcGFzcyAqLworY29uc3QgdWludDhfdCBmZl9wbmdfcGFzc195bWFza1tOQl9QQVNTRVNdID0geworICAgIDB4ODAsIDB4ODAsIDB4MDgsIDB4ODgsIDB4MjIsIDB4YWEsIDB4NTUsCit9OworCisvKiBtaW5pbXVtIHggdmFsdWUgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGZmX3BuZ19wYXNzX3htaW5bTkJfUEFTU0VTXSA9IHsKKyAgICAwLCA0LCAwLCAyLCAwLCAxLCAwCit9OworCisvKiB4IHNoaWZ0IHRvIGdldCByb3cgd2lkdGggKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGZmX3BuZ19wYXNzX3hzaGlmdFtOQl9QQVNTRVNdID0geworICAgIDMsIDMsIDIsIDIsIDEsIDEsIDAKK307CisKK3ZvaWQgKmZmX3BuZ196YWxsb2Modm9pZCAqb3BhcXVlLCB1bnNpZ25lZCBpbnQgaXRlbXMsIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIHJldHVybiBhdl9tYWxsb2N6X2FycmF5KGl0ZW1zLCBzaXplKTsKK30KKwordm9pZCBmZl9wbmdfemZyZWUodm9pZCAqb3BhcXVlLCB2b2lkICpwdHIpCit7CisgICAgYXZfZnJlZShwdHIpOworfQorCitpbnQgZmZfcG5nX2dldF9uYl9jaGFubmVscyhpbnQgY29sb3JfdHlwZSkKK3sKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgY2hhbm5lbHMgPSAxOworICAgIGlmICgoY29sb3JfdHlwZSAmIChQTkdfQ09MT1JfTUFTS19DT0xPUiB8IFBOR19DT0xPUl9NQVNLX1BBTEVUVEUpKSA9PQorICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUikKKyAgICAgICAgY2hhbm5lbHMgPSAzOworICAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCisgICAgICAgIGNoYW5uZWxzKys7CisgICAgcmV0dXJuIGNoYW5uZWxzOworfQorCisvKiBjb21wdXRlIHRoZSByb3cgc2l6ZSBvZiBhbiBpbnRlcmxlYXZlZCBwYXNzICovCitpbnQgZmZfcG5nX3Bhc3Nfcm93X3NpemUoaW50IHBhc3MsIGludCBiaXRzX3Blcl9waXhlbCwgaW50IHdpZHRoKQoreworICAgIGludCBzaGlmdCwgeG1pbiwgcGFzc193aWR0aDsKKworICAgIHhtaW4gPSBmZl9wbmdfcGFzc194bWluW3Bhc3NdOworICAgIGlmICh3aWR0aCA8PSB4bWluKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzaGlmdCAgICAgID0gZmZfcG5nX3Bhc3NfeHNoaWZ0W3Bhc3NdOworICAgIHBhc3Nfd2lkdGggPSAod2lkdGggLSB4bWluICsgKDEgPDwgc2hpZnQpIC0gMSkgPj4gc2hpZnQ7CisgICAgcmV0dXJuIChwYXNzX3dpZHRoICogYml0c19wZXJfcGl4ZWwgKyA3KSA+PiAzOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcG5nLmggYi9mZm1wZWcvbGliYXZjb2RlYy9wbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhjMmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcG5nLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIFBORyBpbWFnZSBmb3JtYXQKKyAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1BOR19ICisjZGVmaW5lIEFWQ09ERUNfUE5HX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUgICAgMQorI2RlZmluZSBQTkdfQ09MT1JfTUFTS19DT0xPUiAgICAgIDIKKyNkZWZpbmUgUE5HX0NPTE9SX01BU0tfQUxQSEEgICAgICA0CisKKyNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfR1JBWSAwCisjZGVmaW5lIFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgIChQTkdfQ09MT1JfTUFTS19DT0xPUiB8IFBOR19DT0xPUl9NQVNLX1BBTEVUVEUpCisjZGVmaW5lIFBOR19DT0xPUl9UWVBFX1JHQiAgICAgICAgKFBOR19DT0xPUl9NQVNLX0NPTE9SKQorI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEgIChQTkdfQ09MT1JfTUFTS19DT0xPUiB8IFBOR19DT0xPUl9NQVNLX0FMUEhBKQorI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBIChQTkdfQ09MT1JfTUFTS19BTFBIQSkKKworI2RlZmluZSBQTkdfRklMVEVSX1RZUEVfTE9DTyAgIDY0CisjZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfTk9ORSAgMAorI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX1NVQiAgIDEKKyNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9VUCAgICAyCisjZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfQVZHICAgMworI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX1BBRVRIIDQKKyNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9NSVhFRCA1CisKKyNkZWZpbmUgUE5HX0lIRFIgICAgICAweDAwMDEKKyNkZWZpbmUgUE5HX0lEQVQgICAgICAweDAwMDIKKyNkZWZpbmUgUE5HX0FMTElNQUdFICAweDAwMDQKKyNkZWZpbmUgUE5HX1BMVEUgICAgICAweDAwMDgKKworI2RlZmluZSBOQl9QQVNTRVMgNworCisjZGVmaW5lIFBOR1NJRyAweDg5NTA0ZTQ3MGQwYTFhMGEKKyNkZWZpbmUgTU5HU0lHIDB4OGE0ZDRlNDcwZDBhMWEwYQorCisvKiBNYXNrIHRvIGRldGVybWluZSB3aGljaCB5IHBpeGVscyBhcmUgdmFsaWQgaW4gYSBwYXNzICovCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9wbmdfcGFzc195bWFza1tOQl9QQVNTRVNdOworCit2b2lkICpmZl9wbmdfemFsbG9jKHZvaWQgKm9wYXF1ZSwgdW5zaWduZWQgaW50IGl0ZW1zLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKK3ZvaWQgZmZfcG5nX3pmcmVlKHZvaWQgKm9wYXF1ZSwgdm9pZCAqcHRyKTsKKworaW50IGZmX3BuZ19nZXRfbmJfY2hhbm5lbHMoaW50IGNvbG9yX3R5cGUpOworCisvKiBjb21wdXRlIHRoZSByb3cgc2l6ZSBvZiBhbiBpbnRlcmxlYXZlZCBwYXNzICovCitpbnQgZmZfcG5nX3Bhc3Nfcm93X3NpemUoaW50IHBhc3MsIGludCBiaXRzX3Blcl9waXhlbCwgaW50IHdpZHRoKTsKKwordm9pZCBmZl9hZGRfcG5nX3BhZXRoX3ByZWRpY3Rpb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKnRvcCwgaW50IHcsIGludCBicHApOworCisjZW5kaWYgLyogQVZDT0RFQ19QTkdfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcG5nX3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcG5nX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZjI5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wbmdfcGFyc2VyLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBQTkcgcGFyc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUGV0ZXIgSG9saWsKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUE5HIHBhcnNlcgorICovCisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJwbmcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUE5HUGFyc2VDb250ZXh0IHsKKyAgICBQYXJzZUNvbnRleHQgcGM7CisgICAgdWludDMyX3QgY2h1bmtfcG9zOyAgICAgICAgICAgLy8vPCBwb3NpdGlvbiBpbnNpZGUgY3VycmVudCBjaHVuaworICAgIHVpbnQzMl90IGNodW5rX2xlbmd0aDsgICAgICAgIC8vLzwgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGNodW5rCisgICAgdWludDMyX3QgcmVtYWluaW5nX3NpemU7ICAgICAgLy8vPCByZW1haW5pbmcgc2l6ZSBvZiB0aGUgY3VycmVudCBjaHVuaworfSBQTkdQYXJzZUNvbnRleHQ7CisKK3N0YXRpYyBpbnQgcG5nX3BhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBQTkdQYXJzZUNvbnRleHQgKnBwYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgbmV4dCA9IEVORF9OT1RfRk9VTkQ7CisgICAgaW50IGkgPSAwOworCisgICAgcy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX05PTkU7CisKKyAgICAqcG91dGJ1Zl9zaXplID0gMDsKKworICAgIGlmICghcHBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCkgeworICAgICAgICB1aW50NjRfdCBzdGF0ZTY0ID0gcHBjLT5wYy5zdGF0ZTY0OworICAgICAgICBmb3IgKDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXRlNjQgPSAoc3RhdGU2NCA8PCA4KSB8IGJ1ZltpXTsKKyAgICAgICAgICAgIGlmIChzdGF0ZTY0ID09IFBOR1NJRyB8fCBzdGF0ZTY0ID09IE1OR1NJRykgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBwcGMtPnBjLmZyYW1lX3N0YXJ0X2ZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcGMtPnBjLnN0YXRlNjQgPSBzdGF0ZTY0OworICAgIH0gZWxzZSBpZiAocHBjLT5yZW1haW5pbmdfc2l6ZSkgeworICAgICAgICBpID0gRkZNSU4ocHBjLT5yZW1haW5pbmdfc2l6ZSwgYnVmX3NpemUpOworICAgICAgICBwcGMtPnJlbWFpbmluZ19zaXplIC09IGk7CisgICAgICAgIGlmIChwcGMtPnJlbWFpbmluZ19zaXplKQorICAgICAgICAgICAgZ290byBmbHVzaDsKKyAgICAgICAgaWYgKHBwYy0+Y2h1bmtfcG9zID09IC0xKSB7CisgICAgICAgICAgICBuZXh0ID0gaTsKKyAgICAgICAgICAgIGdvdG8gZmx1c2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKDsgcHBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCAmJiBpIDwgYnVmX3NpemU7IGkrKykgeworICAgICAgICBwcGMtPnBjLnN0YXRlID0gKHBwYy0+cGMuc3RhdGUgPDwgOCkgfCBidWZbaV07CisgICAgICAgIGlmIChwcGMtPmNodW5rX3BvcyA9PSAzKSB7CisgICAgICAgICAgICBwcGMtPmNodW5rX2xlbmd0aCA9IHBwYy0+cGMuc3RhdGU7CisgICAgICAgICAgICBpZiAocHBjLT5jaHVua19sZW5ndGggPiAweDdmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgcHBjLT5jaHVua19wb3MgPSBwcGMtPnBjLmZyYW1lX3N0YXJ0X2ZvdW5kID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGZsdXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHBjLT5jaHVua19sZW5ndGggKz0gNDsKKyAgICAgICAgfSBlbHNlIGlmIChwcGMtPmNodW5rX3BvcyA9PSA3KSB7CisgICAgICAgICAgICBpZiAocHBjLT5jaHVua19sZW5ndGggPj0gYnVmX3NpemUgLSBpKQorICAgICAgICAgICAgICAgIHBwYy0+cmVtYWluaW5nX3NpemUgPSBwcGMtPmNodW5rX2xlbmd0aCAtIGJ1Zl9zaXplICsgaSArIDE7CisgICAgICAgICAgICBpZiAocHBjLT5wYy5zdGF0ZSA9PSBNS0JFVEFHKCdJJywgJ0UnLCAnTicsICdEJykpIHsKKyAgICAgICAgICAgICAgICBpZiAocHBjLT5yZW1haW5pbmdfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgcHBjLT5jaHVua19wb3MgPSAtMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBwcGMtPmNodW5rX2xlbmd0aCArIGkgKyAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcGMtPmNodW5rX3BvcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHBwYy0+cmVtYWluaW5nX3NpemUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaSArPSBwcGMtPmNodW5rX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcGMtPmNodW5rX3BvcysrOworICAgIH0KKworZmx1c2g6CisgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUoJnBwYy0+cGMsIG5leHQsICZidWYsICZidWZfc2l6ZSkgPCAwKQorICAgICAgICByZXR1cm4gYnVmX3NpemU7CisKKyAgICBwcGMtPmNodW5rX3BvcyA9IHBwYy0+cGMuZnJhbWVfc3RhcnRfZm91bmQgPSAwOworCisgICAgKnBvdXRidWYgICAgICA9IGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK0FWQ29kZWNQYXJzZXIgZmZfcG5nX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX1BORyB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQTkdQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfcGFyc2UgICA9IHBuZ19wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wbmdkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BuZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2IyODUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wbmdkZWMuYwpAQCAtMCwwICsxLDEzMDUgQEAKKy8qCisgKiBQTkcgaW1hZ2UgZm9ybWF0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8vI2RlZmluZSBERUJVRworCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhcG5nLmgiCisjaW5jbHVkZSAicG5nLmgiCisjaW5jbHVkZSAicG5nZHNwLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisKKyNpbmNsdWRlIDx6bGliLmg+CisKK3R5cGVkZWYgc3RydWN0IFBOR0RlY0NvbnRleHQgeworICAgIFBOR0RTUENvbnRleHQgZHNwOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIFRocmVhZEZyYW1lIHByZXZpb3VzX3BpY3R1cmU7CisgICAgVGhyZWFkRnJhbWUgbGFzdF9waWN0dXJlOworICAgIFRocmVhZEZyYW1lIHBpY3R1cmU7CisKKyAgICBpbnQgc3RhdGU7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGN1cl93LCBjdXJfaDsKKyAgICBpbnQgeF9vZmZzZXQsIHlfb2Zmc2V0OworICAgIHVpbnQ4X3QgZGlzcG9zZV9vcCwgYmxlbmRfb3A7CisgICAgaW50IGJpdF9kZXB0aDsKKyAgICBpbnQgY29sb3JfdHlwZTsKKyAgICBpbnQgY29tcHJlc3Npb25fdHlwZTsKKyAgICBpbnQgaW50ZXJsYWNlX3R5cGU7CisgICAgaW50IGZpbHRlcl90eXBlOworICAgIGludCBjaGFubmVsczsKKyAgICBpbnQgYml0c19wZXJfcGl4ZWw7CisgICAgaW50IGJwcDsKKworICAgIGludCBmcmFtZV9pZDsKKyAgICB1aW50OF90ICppbWFnZV9idWY7CisgICAgaW50IGltYWdlX2xpbmVzaXplOworICAgIHVpbnQzMl90IHBhbGV0dGVbMjU2XTsKKyAgICB1aW50OF90ICpjcm93X2J1ZjsKKyAgICB1aW50OF90ICpsYXN0X3JvdzsKKyAgICB1bnNpZ25lZCBpbnQgbGFzdF9yb3dfc2l6ZTsKKyAgICB1aW50OF90ICp0bXBfcm93OworICAgIHVuc2lnbmVkIGludCB0bXBfcm93X3NpemU7CisgICAgdWludDhfdCAqYnVmZmVyOworICAgIGludCBidWZmZXJfc2l6ZTsKKyAgICBpbnQgcGFzczsKKyAgICBpbnQgY3Jvd19zaXplOyAvKiBjb21wcmVzc2VkIHJvdyBzaXplIChpbmNsdWRlIGZpbHRlciB0eXBlKSAqLworICAgIGludCByb3dfc2l6ZTsgLyogZGVjb21wcmVzc2VkIHJvdyBzaXplICovCisgICAgaW50IHBhc3Nfcm93X3NpemU7IC8qIGRlY29tcHJlc3Mgcm93IHNpemUgb2YgdGhlIGN1cnJlbnQgcGFzcyAqLworICAgIGludCB5OworICAgIHpfc3RyZWFtIHpzdHJlYW07Cit9IFBOR0RlY0NvbnRleHQ7CisKKy8qIE1hc2sgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpeGVscyBhcmUgdmFsaWQgaW4gYSBwYXNzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBwbmdfcGFzc19tYXNrW05CX1BBU1NFU10gPSB7CisgICAgMHgwMSwgMHgwMSwgMHgxMSwgMHgxMSwgMHg1NSwgMHg1NSwgMHhmZiwKK307CisKKy8qIE1hc2sgdG8gZGV0ZXJtaW5lIHdoaWNoIHkgcGl4ZWxzIGNhbiBiZSB3cml0dGVuIGluIGEgcGFzcyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcG5nX3Bhc3NfZHNwX3ltYXNrW05CX1BBU1NFU10gPSB7CisgICAgMHhmZiwgMHhmZiwgMHgwZiwgMHhmZiwgMHgzMywgMHhmZiwgMHg1NSwKK307CisKKy8qIE1hc2sgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpeGVscyB0byBvdmVyd3JpdGUgd2hpbGUgZGlzcGxheWluZyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcG5nX3Bhc3NfZHNwX21hc2tbTkJfUEFTU0VTXSA9IHsKKyAgICAweGZmLCAweDBmLCAweGZmLCAweDMzLCAweGZmLCAweDU1LCAweGZmCit9OworCisvKiBOT1RFOiB3ZSB0cnkgdG8gY29uc3RydWN0IGEgZ29vZCBsb29raW5nIGltYWdlIGF0IGVhY2ggcGFzcy4gd2lkdGgKKyAqIGlzIHRoZSBvcmlnaW5hbCBpbWFnZSB3aWR0aC4gV2UgYWxzbyBkbyBwaXhlbCBmb3JtYXQgY29udmVyc2lvbiBhdAorICogdGhpcyBzdGFnZSAqLworc3RhdGljIHZvaWQgcG5nX3B1dF9pbnRlcmxhY2VkX3Jvdyh1aW50OF90ICpkc3QsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHNfcGVyX3BpeGVsLCBpbnQgcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yX3R5cGUsIGNvbnN0IHVpbnQ4X3QgKnNyYykKK3sKKyAgICBpbnQgeCwgbWFzaywgZHNwX21hc2ssIGosIHNyY194LCBiLCBicHA7CisgICAgdWludDhfdCAqZDsKKyAgICBjb25zdCB1aW50OF90ICpzOworCisgICAgbWFzayAgICAgPSBwbmdfcGFzc19tYXNrW3Bhc3NdOworICAgIGRzcF9tYXNrID0gcG5nX3Bhc3NfZHNwX21hc2tbcGFzc107CisKKyAgICBzd2l0Y2ggKGJpdHNfcGVyX3BpeGVsKSB7CisgICAgY2FzZSAxOgorICAgICAgICBzcmNfeCA9IDA7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBqID0gKHggJiA3KTsKKyAgICAgICAgICAgIGlmICgoZHNwX21hc2sgPDwgaikgJiAweDgwKSB7CisgICAgICAgICAgICAgICAgYiA9IChzcmNbc3JjX3ggPj4gM10gPj4gKDcgLSAoc3JjX3ggJiA3KSkpICYgMTsKKyAgICAgICAgICAgICAgICBkc3RbeCA+PiAzXSAmPSAweEZGN0Y+Pmo7CisgICAgICAgICAgICAgICAgZHN0W3ggPj4gM10gfD0gYiA8PCAoNyAtIGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtYXNrIDw8IGopICYgMHg4MCkKKyAgICAgICAgICAgICAgICBzcmNfeCsrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgc3JjX3ggPSAwOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IGoyID0gMiAqICh4ICYgMyk7CisgICAgICAgICAgICBqID0gKHggJiA3KTsKKyAgICAgICAgICAgIGlmICgoZHNwX21hc2sgPDwgaikgJiAweDgwKSB7CisgICAgICAgICAgICAgICAgYiA9IChzcmNbc3JjX3ggPj4gMl0gPj4gKDYgLSAyKihzcmNfeCAmIDMpKSkgJiAzOworICAgICAgICAgICAgICAgIGRzdFt4ID4+IDJdICY9IDB4RkYzRj4+ajI7CisgICAgICAgICAgICAgICAgZHN0W3ggPj4gMl0gfD0gYiA8PCAoNiAtIGoyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobWFzayA8PCBqKSAmIDB4ODApCisgICAgICAgICAgICAgICAgc3JjX3grKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHNyY194ID0gMDsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCBqMiA9IDQqKHgmMSk7CisgICAgICAgICAgICBqID0gKHggJiA3KTsKKyAgICAgICAgICAgIGlmICgoZHNwX21hc2sgPDwgaikgJiAweDgwKSB7CisgICAgICAgICAgICAgICAgYiA9IChzcmNbc3JjX3ggPj4gMV0gPj4gKDQgLSA0KihzcmNfeCAmIDEpKSkgJiAxNTsKKyAgICAgICAgICAgICAgICBkc3RbeCA+PiAxXSAmPSAweEZGMEY+PmoyOworICAgICAgICAgICAgICAgIGRzdFt4ID4+IDFdIHw9IGIgPDwgKDQgLSBqMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1hc2sgPDwgaikgJiAweDgwKQorICAgICAgICAgICAgICAgIHNyY194Kys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnBwID0gYml0c19wZXJfcGl4ZWwgPj4gMzsKKyAgICAgICAgZCAgID0gZHN0OworICAgICAgICBzICAgPSBzcmM7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGogPSB4ICYgNzsKKyAgICAgICAgICAgICAgICBpZiAoKGRzcF9tYXNrIDw8IGopICYgMHg4MCkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZCwgcywgYnBwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZCArPSBicHA7CisgICAgICAgICAgICAgICAgaWYgKChtYXNrIDw8IGopICYgMHg4MCkKKyAgICAgICAgICAgICAgICAgICAgcyArPSBicHA7CisgICAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBmZl9hZGRfcG5nX3BhZXRoX3ByZWRpY3Rpb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgYnBwKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgaW50IGEsIGIsIGMsIHAsIHBhLCBwYiwgcGM7CisKKyAgICAgICAgYSA9IGRzdFtpIC0gYnBwXTsKKyAgICAgICAgYiA9IHRvcFtpXTsKKyAgICAgICAgYyA9IHRvcFtpIC0gYnBwXTsKKworICAgICAgICBwICA9IGIgLSBjOworICAgICAgICBwYyA9IGEgLSBjOworCisgICAgICAgIHBhID0gYWJzKHApOworICAgICAgICBwYiA9IGFicyhwYyk7CisgICAgICAgIHBjID0gYWJzKHAgKyBwYyk7CisKKyAgICAgICAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKQorICAgICAgICAgICAgcCA9IGE7CisgICAgICAgIGVsc2UgaWYgKHBiIDw9IHBjKQorICAgICAgICAgICAgcCA9IGI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHAgPSBjOworICAgICAgICBkc3RbaV0gPSBwICsgc3JjW2ldOworICAgIH0KK30KKworI2RlZmluZSBVTlJPTEwxKGJwcCwgb3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByID0gZHN0WzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYnBwID49IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZyA9IGRzdFsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYnBwID49IDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYiA9IGRzdFsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYnBwID49IDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYSA9IGRzdFszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKDsgaSA8PSBzaXplIC0gYnBwOyBpICs9IGJwcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2kgKyAwXSA9IHIgPSBvcChyLCBzcmNbaSArIDBdLCBsYXN0W2kgKyAwXSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGJwcCA9PSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2kgKyAxXSA9IGcgPSBvcChnLCBzcmNbaSArIDFdLCBsYXN0W2kgKyAxXSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGJwcCA9PSAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2kgKyAyXSA9IGIgPSBvcChiLCBzcmNbaSArIDJdLCBsYXN0W2kgKyAyXSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGJwcCA9PSAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2kgKyAzXSA9IGEgPSBvcChhLCBzcmNbaSArIDNdLCBsYXN0W2kgKyAzXSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBVTlJPTExfRklMVEVSKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChicHAgPT0gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBVTlJPTEwxKDEsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoYnBwID09IDIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBVTlJPTEwxKDIsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoYnBwID09IDMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBVTlJPTEwxKDMsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoYnBwID09IDQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBVTlJPTEwxKDQsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoOyBpIDwgc2l6ZTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaV0gPSBvcChkc3RbaSAtIGJwcF0sIHNyY1tpXSwgbGFzdFtpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLyogTk9URTogJ2RzdCcgY2FuIGJlIGVxdWFsIHRvICdsYXN0JyAqLworc3RhdGljIHZvaWQgcG5nX2ZpbHRlcl9yb3coUE5HRFNQQ29udGV4dCAqZHNwLCB1aW50OF90ICpkc3QsIGludCBmaWx0ZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgdWludDhfdCAqbGFzdCwgaW50IHNpemUsIGludCBicHApCit7CisgICAgaW50IGksIHAsIHIsIGcsIGIsIGE7CisKKyAgICBzd2l0Y2ggKGZpbHRlcl90eXBlKSB7CisgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX05PTkU6CisgICAgICAgIG1lbWNweShkc3QsIHNyYywgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9TVUI6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBicHA7IGkrKykKKyAgICAgICAgICAgIGRzdFtpXSA9IHNyY1tpXTsKKyAgICAgICAgaWYgKGJwcCA9PSA0KSB7CisgICAgICAgICAgICBwID0gKihpbnQgKilkc3Q7CisgICAgICAgICAgICBmb3IgKDsgaSA8IHNpemU7IGkgKz0gYnBwKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgcyA9ICooaW50ICopKHNyYyArIGkpOworICAgICAgICAgICAgICAgIHAgPSAoKHMgJiAweDdmN2Y3ZjdmKSArIChwICYgMHg3ZjdmN2Y3ZikpIF4gKChzIF4gcCkgJiAweDgwODA4MDgwKTsKKyAgICAgICAgICAgICAgICAqKGludCAqKShkc3QgKyBpKSA9IHA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisjZGVmaW5lIE9QX1NVQih4LCBzLCBsKSAoKHgpICsgKHMpKQorICAgICAgICAgICAgVU5ST0xMX0ZJTFRFUihPUF9TVUIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9VUDoKKyAgICAgICAgZHNwLT5hZGRfYnl0ZXNfbDIoZHN0LCBzcmMsIGxhc3QsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfQVZHOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnBwOyBpKyspIHsKKyAgICAgICAgICAgIHAgICAgICA9IChsYXN0W2ldID4+IDEpOworICAgICAgICAgICAgZHN0W2ldID0gcCArIHNyY1tpXTsKKyAgICAgICAgfQorI2RlZmluZSBPUF9BVkcoeCwgcywgbCkgKCgoKCh4KSArIChsKSkgPj4gMSkgKyAocykpICYgMHhmZikKKyAgICAgICAgVU5ST0xMX0ZJTFRFUihPUF9BVkcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfUEFFVEg6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBicHA7IGkrKykgeworICAgICAgICAgICAgcCAgICAgID0gbGFzdFtpXTsKKyAgICAgICAgICAgIGRzdFtpXSA9IHAgKyBzcmNbaV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJwcCA+IDIgJiYgc2l6ZSA+IDQpIHsKKyAgICAgICAgICAgIC8qIHdvdWxkIHdyaXRlIG9mZiB0aGUgZW5kIG9mIHRoZSBhcnJheSBpZiB3ZSBsZXQgaXQgcHJvY2VzcworICAgICAgICAgICAgICogdGhlIGxhc3QgcGl4ZWwgd2l0aCBicHA9MyAqLworICAgICAgICAgICAgaW50IHcgPSBicHAgPT0gNCA/IHNpemUgOiBzaXplIC0gMzsKKyAgICAgICAgICAgIGlmICh3ID4gaSkgeworICAgICAgICAgICAgICAgIGRzcC0+YWRkX3BhZXRoX3ByZWRpY3Rpb24oZHN0ICsgaSwgc3JjICsgaSwgbGFzdCArIGksIHcgLSBpLCBicHApOworICAgICAgICAgICAgICAgIGkgPSB3OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZmX2FkZF9wbmdfcGFldGhfcHJlZGljdGlvbihkc3QgKyBpLCBzcmMgKyBpLCBsYXN0ICsgaSwgc2l6ZSAtIGksIGJwcCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogVGhpcyB1c2VkIHRvIGJlIGNhbGxlZCAiZGVsb2NvIiBpbiBGRm1wZWcKKyAqIGFuZCBpcyBhY3R1YWxseSBhbiBpbnZlcnNlIHJldmVyc2libGUgY29sb3JzcGFjZSB0cmFuc2Zvcm1hdGlvbiAqLworI2RlZmluZSBZVVYyUkdCKE5BTUUsIFRZUEUpIFwKK3N0YXRpYyB2b2lkIGRlbG9jb18gIyMgTkFNRShUWVBFICpkc3QsIGludCBzaXplLCBpbnQgYWxwaGEpIFwKK3sgXAorICAgIGludCBpOyBcCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gMyArIGFscGhhKSB7IFwKKyAgICAgICAgaW50IGcgPSBkc3QgW2kgKyAxXTsgXAorICAgICAgICBkc3RbaSArIDBdICs9IGc7IFwKKyAgICAgICAgZHN0W2kgKyAyXSArPSBnOyBcCisgICAgfSBcCit9CisKK1lVVjJSR0IocmdiOCwgdWludDhfdCkKK1lVVjJSR0IocmdiMTYsIHVpbnQxNl90KQorCisvKiBwcm9jZXNzIGV4YWN0bHkgb25lIGRlY29tcHJlc3NlZCByb3cgKi8KK3N0YXRpYyB2b2lkIHBuZ19oYW5kbGVfcm93KFBOR0RlY0NvbnRleHQgKnMpCit7CisgICAgdWludDhfdCAqcHRyLCAqbGFzdF9yb3c7CisgICAgaW50IGdvdF9saW5lOworCisgICAgaWYgKCFzLT5pbnRlcmxhY2VfdHlwZSkgeworICAgICAgICBwdHIgPSBzLT5pbWFnZV9idWYgKyBzLT5pbWFnZV9saW5lc2l6ZSAqIChzLT55ICsgcy0+eV9vZmZzZXQpICsgcy0+eF9vZmZzZXQgKiBzLT5icHA7CisgICAgICAgIGlmIChzLT55ID09IDApCisgICAgICAgICAgICBsYXN0X3JvdyA9IHMtPmxhc3Rfcm93OworICAgICAgICBlbHNlCisgICAgICAgICAgICBsYXN0X3JvdyA9IHB0ciAtIHMtPmltYWdlX2xpbmVzaXplOworCisgICAgICAgIHBuZ19maWx0ZXJfcm93KCZzLT5kc3AsIHB0ciwgcy0+Y3Jvd19idWZbMF0sIHMtPmNyb3dfYnVmICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9yb3csIHMtPnJvd19zaXplLCBzLT5icHApOworICAgICAgICAvKiBsb2NvIGxhZ3MgYnkgMSByb3cgc28gdGhhdCBpdCBkb2Vzbid0IGludGVyZmVyZSB3aXRoIHRvcCBwcmVkaWN0aW9uICovCisgICAgICAgIGlmIChzLT5maWx0ZXJfdHlwZSA9PSBQTkdfRklMVEVSX1RZUEVfTE9DTyAmJiBzLT55ID4gMCkgeworICAgICAgICAgICAgaWYgKHMtPmJpdF9kZXB0aCA9PSAxNikgeworICAgICAgICAgICAgICAgIGRlbG9jb19yZ2IxNigodWludDE2X3QgKikocHRyIC0gcy0+aW1hZ2VfbGluZXNpemUpLCBzLT5yb3dfc2l6ZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVsb2NvX3JnYjgocHRyIC0gcy0+aW1hZ2VfbGluZXNpemUsIHMtPnJvd19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzLT55Kys7CisgICAgICAgIGlmIChzLT55ID09IHMtPmN1cl9oKSB7CisgICAgICAgICAgICBzLT5zdGF0ZSB8PSBQTkdfQUxMSU1BR0U7CisgICAgICAgICAgICBpZiAocy0+ZmlsdGVyX3R5cGUgPT0gUE5HX0ZJTFRFUl9UWVBFX0xPQ08pIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+Yml0X2RlcHRoID09IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIGRlbG9jb19yZ2IxNigodWludDE2X3QgKilwdHIsIHMtPnJvd19zaXplIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZWxvY29fcmdiOChwdHIsIHMtPnJvd19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ290X2xpbmUgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBwdHIgPSBzLT5pbWFnZV9idWYgKyBzLT5pbWFnZV9saW5lc2l6ZSAqIChzLT55ICsgcy0+eV9vZmZzZXQpICsgcy0+eF9vZmZzZXQgKiBzLT5icHA7CisgICAgICAgICAgICBpZiAoKGZmX3BuZ19wYXNzX3ltYXNrW3MtPnBhc3NdIDw8IChzLT55ICYgNykpICYgMHg4MCkgeworICAgICAgICAgICAgICAgIC8qIGlmIHdlIGFscmVhZHkgcmVhZCBvbmUgcm93LCBpdCBpcyB0aW1lIHRvIHN0b3AgdG8KKyAgICAgICAgICAgICAgICAgKiB3YWl0IGZvciB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgICAgICBpZiAoZ290X2xpbmUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHBuZ19maWx0ZXJfcm93KCZzLT5kc3AsIHMtPnRtcF9yb3csIHMtPmNyb3dfYnVmWzBdLCBzLT5jcm93X2J1ZiArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9yb3csIHMtPnBhc3Nfcm93X3NpemUsIHMtPmJwcCk7CisgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QgKiwgcy0+bGFzdF9yb3csIHMtPnRtcF9yb3cpOworICAgICAgICAgICAgICAgIEZGU1dBUCh1bnNpZ25lZCBpbnQsIHMtPmxhc3Rfcm93X3NpemUsIHMtPnRtcF9yb3dfc2l6ZSk7CisgICAgICAgICAgICAgICAgZ290X2xpbmUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChwbmdfcGFzc19kc3BfeW1hc2tbcy0+cGFzc10gPDwgKHMtPnkgJiA3KSkgJiAweDgwKSB7CisgICAgICAgICAgICAgICAgcG5nX3B1dF9pbnRlcmxhY2VkX3JvdyhwdHIsIHMtPmN1cl93LCBzLT5iaXRzX3Blcl9waXhlbCwgcy0+cGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbG9yX3R5cGUsIHMtPmxhc3Rfcm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnkrKzsKKyAgICAgICAgICAgIGlmIChzLT55ID09IHMtPmN1cl9oKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmxhc3Rfcm93LCAwLCBzLT5yb3dfc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGFzcyA9PSBOQl9QQVNTRVMgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdGF0ZSB8PSBQTkdfQUxMSU1BR0U7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRoZV9lbmQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5wYXNzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT55ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBhc3Nfcm93X3NpemUgPSBmZl9wbmdfcGFzc19yb3dfc2l6ZShzLT5wYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJpdHNfcGVyX3BpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNyb3dfc2l6ZSA9IHMtPnBhc3Nfcm93X3NpemUgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBhc3Nfcm93X3NpemUgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgcGFzcyBpZiBlbXB0eSByb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQordGhlX2VuZDo7CisgICAgfQorfQorCitzdGF0aWMgaW50IHBuZ19kZWNvZGVfaWRhdChQTkdEZWNDb250ZXh0ICpzLCBpbnQgbGVuZ3RoKQoreworICAgIGludCByZXQ7CisgICAgcy0+enN0cmVhbS5hdmFpbF9pbiA9IEZGTUlOKGxlbmd0aCwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSk7CisgICAgcy0+enN0cmVhbS5uZXh0X2luICA9ICh1bnNpZ25lZCBjaGFyICopcy0+Z2IuYnVmZmVyOworICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCBsZW5ndGgpOworCisgICAgLyogZGVjb2RlIG9uZSBsaW5lIGlmIHBvc3NpYmxlICovCisgICAgd2hpbGUgKHMtPnpzdHJlYW0uYXZhaWxfaW4gPiAwKSB7CisgICAgICAgIHJldCA9IGluZmxhdGUoJnMtPnpzdHJlYW0sIFpfUEFSVElBTF9GTFVTSCk7CisgICAgICAgIGlmIChyZXQgIT0gWl9PSyAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImluZmxhdGUgcmV0dXJuZWQgZXJyb3IgJWRcbiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+enN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgaWYgKCEocy0+c3RhdGUgJiBQTkdfQUxMSU1BR0UpKSB7CisgICAgICAgICAgICAgICAgcG5nX2hhbmRsZV9yb3cocyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT56c3RyZWFtLmF2YWlsX291dCA9IHMtPmNyb3dfc2l6ZTsKKyAgICAgICAgICAgIHMtPnpzdHJlYW0ubmV4dF9vdXQgID0gcy0+Y3Jvd19idWY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQgJiYgcy0+enN0cmVhbS5hdmFpbF9pbiA+IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiJWQgdW5kZWNvbXByZXNzZWQgYnl0ZXMgbGVmdCBpbiBidWZmZXJcbiIsIHMtPnpzdHJlYW0uYXZhaWxfaW4pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3pidWYoQVZCUHJpbnQgKmJwLCBjb25zdCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhX2VuZCkKK3sKKyAgICB6X3N0cmVhbSB6c3RyZWFtOworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICB1bnNpZ25lZCBidWZfc2l6ZTsKKyAgICBpbnQgcmV0OworCisgICAgenN0cmVhbS56YWxsb2MgPSBmZl9wbmdfemFsbG9jOworICAgIHpzdHJlYW0uemZyZWUgID0gZmZfcG5nX3pmcmVlOworICAgIHpzdHJlYW0ub3BhcXVlID0gTlVMTDsKKyAgICBpZiAoaW5mbGF0ZUluaXQoJnpzdHJlYW0pICE9IFpfT0spCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIHpzdHJlYW0ubmV4dF9pbiAgPSAodW5zaWduZWQgY2hhciAqKWRhdGE7CisgICAgenN0cmVhbS5hdmFpbF9pbiA9IGRhdGFfZW5kIC0gZGF0YTsKKyAgICBhdl9icHJpbnRfaW5pdChicCwgMCwgLTEpOworCisgICAgd2hpbGUgKHpzdHJlYW0uYXZhaWxfaW4gPiAwKSB7CisgICAgICAgIGF2X2JwcmludF9nZXRfYnVmZmVyKGJwLCAxLCAmYnVmLCAmYnVmX3NpemUpOworICAgICAgICBpZiAoIWJ1Zl9zaXplKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgenN0cmVhbS5uZXh0X291dCAgPSBidWY7CisgICAgICAgIHpzdHJlYW0uYXZhaWxfb3V0ID0gYnVmX3NpemU7CisgICAgICAgIHJldCA9IGluZmxhdGUoJnpzdHJlYW0sIFpfUEFSVElBTF9GTFVTSCk7CisgICAgICAgIGlmIChyZXQgIT0gWl9PSyAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGJwLT5sZW4gKz0genN0cmVhbS5uZXh0X291dCAtIGJ1ZjsKKyAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaW5mbGF0ZUVuZCgmenN0cmVhbSk7CisgICAgYnAtPnN0clticC0+bGVuXSA9IDA7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgaW5mbGF0ZUVuZCgmenN0cmVhbSk7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKGJwLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdWludDhfdCAqaXNvODg1OTFfdG9fdXRmOChjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IHNpemVfaW4pCit7CisgICAgc2l6ZV90IGV4dHJhID0gMCwgaTsKKyAgICB1aW50OF90ICpvdXQsICpxOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVfaW47IGkrKykKKyAgICAgICAgZXh0cmEgKz0gaW5baV0gPj0gMHg4MDsKKyAgICBpZiAoc2l6ZV9pbiA9PSBTSVpFX01BWCB8fCBleHRyYSA+IFNJWkVfTUFYIC0gc2l6ZV9pbiAtIDEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHEgPSBvdXQgPSBhdl9tYWxsb2Moc2l6ZV9pbiArIGV4dHJhICsgMSk7CisgICAgaWYgKCFvdXQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX2luOyBpKyspIHsKKyAgICAgICAgaWYgKGluW2ldID49IDB4ODApIHsKKyAgICAgICAgICAgICoocSsrKSA9IDB4QzAgfCAoaW5baV0gPj4gNik7CisgICAgICAgICAgICAqKHErKykgPSAweDgwIHwgKGluW2ldICYgMHgzRik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqKHErKykgPSBpbltpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqKHErKykgPSAwOworICAgIHJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3RleHRfY2h1bmsoUE5HRGVjQ29udGV4dCAqcywgdWludDMyX3QgbGVuZ3RoLCBpbnQgY29tcHJlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqZGljdCkKK3sKKyAgICBpbnQgcmV0LCBtZXRob2Q7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSAgICAgICAgPSBzLT5nYi5idWZmZXI7CisgICAgY29uc3QgdWludDhfdCAqZGF0YV9lbmQgICAgPSBkYXRhICsgbGVuZ3RoOworICAgIGNvbnN0IHVpbnQ4X3QgKmtleXdvcmQgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICprZXl3b3JkX2VuZCA9IG1lbWNocihrZXl3b3JkLCAwLCBkYXRhX2VuZCAtIGtleXdvcmQpOworICAgIHVpbnQ4X3QgKmt3X3V0ZjggPSBOVUxMLCAqdGV4dCwgKnR4dF91dGY4ID0gTlVMTDsKKyAgICB1bnNpZ25lZCB0ZXh0X2xlbjsKKyAgICBBVkJQcmludCBicDsKKworICAgIGlmICgha2V5d29yZF9lbmQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGRhdGEgPSBrZXl3b3JkX2VuZCArIDE7CisKKyAgICBpZiAoY29tcHJlc3NlZCkgeworICAgICAgICBpZiAoZGF0YSA9PSBkYXRhX2VuZCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBtZXRob2QgPSAqKGRhdGErKyk7CisgICAgICAgIGlmIChtZXRob2QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfemJ1ZigmYnAsIGRhdGEsIGRhdGFfZW5kKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgdGV4dF9sZW4gPSBicC5sZW47CisgICAgICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnAsIChjaGFyICoqKSZ0ZXh0KTsKKyAgICAgICAgaWYgKCF0ZXh0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXh0ID0gKHVpbnQ4X3QgKilkYXRhOworICAgICAgICB0ZXh0X2xlbiA9IGRhdGFfZW5kIC0gdGV4dDsKKyAgICB9CisKKyAgICBrd191dGY4ICA9IGlzbzg4NTkxX3RvX3V0Zjgoa2V5d29yZCwga2V5d29yZF9lbmQgLSBrZXl3b3JkKTsKKyAgICB0eHRfdXRmOCA9IGlzbzg4NTkxX3RvX3V0ZjgodGV4dCwgdGV4dF9sZW4pOworICAgIGlmICh0ZXh0ICE9IGRhdGEpCisgICAgICAgIGF2X2ZyZWUodGV4dCk7CisgICAgaWYgKCEoa3dfdXRmOCAmJiB0eHRfdXRmOCkpIHsKKyAgICAgICAgYXZfZnJlZShrd191dGY4KTsKKyAgICAgICAgYXZfZnJlZSh0eHRfdXRmOCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgYXZfZGljdF9zZXQoZGljdCwga3dfdXRmOCwgdHh0X3V0ZjgsCisgICAgICAgICAgICAgICAgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkgfCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2loZHJfY2h1bmsoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBQTkdEZWNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgaWYgKGxlbmd0aCAhPSAxMykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAocy0+c3RhdGUgJiBQTkdfSURBVCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIklIRFIgYWZ0ZXIgSURBVFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPndpZHRoICA9IHMtPmN1cl93ID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnMtPmdiKTsKKyAgICBzLT5oZWlnaHQgPSBzLT5jdXJfaCA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nYik7CisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUocy0+d2lkdGgsIHMtPmhlaWdodCwgMCwgYXZjdHgpKSB7CisgICAgICAgIHMtPndpZHRoID0gcy0+aGVpZ2h0ID0gMDsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGltYWdlIHNpemVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcy0+Yml0X2RlcHRoICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgcy0+Y29sb3JfdHlwZSAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgcy0+Y29tcHJlc3Npb25fdHlwZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgcy0+ZmlsdGVyX3R5cGUgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgcy0+aW50ZXJsYWNlX3R5cGUgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIDQpOyAvKiBjcmMgKi8KKyAgICBzLT5zdGF0ZSB8PSBQTkdfSUhEUjsKKyAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIndpZHRoPSVkIGhlaWdodD0lZCBkZXB0aD0lZCBjb2xvcl90eXBlPSVkICIKKyAgICAgICAgICAgICAgICAiY29tcHJlc3Npb25fdHlwZT0lZCBmaWx0ZXJfdHlwZT0lZCBpbnRlcmxhY2VfdHlwZT0lZFxuIiwKKyAgICAgICAgICAgICAgICBzLT53aWR0aCwgcy0+aGVpZ2h0LCBzLT5iaXRfZGVwdGgsIHMtPmNvbG9yX3R5cGUsCisgICAgICAgICAgICAgICAgcy0+Y29tcHJlc3Npb25fdHlwZSwgcy0+ZmlsdGVyX3R5cGUsIHMtPmludGVybGFjZV90eXBlKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9waHlzX2NodW5rKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUE5HRGVjQ29udGV4dCAqcykKK3sKKyAgICBpZiAocy0+c3RhdGUgJiBQTkdfSURBVCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBIWXMgYWZ0ZXIgSURBVFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Z2IpOworICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nYik7CisgICAgaWYgKGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA8IDAgfHwgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuIDwgMCkKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7IDAsIDEgfTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgMSk7IC8qIHVuaXQgc3BlY2lmaWVyICovCisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIDQpOyAvKiBjcmMgKi8KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9pZGF0X2NodW5rKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUE5HRGVjQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuZ3RoLCBBVkZyYW1lICpwKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoIShzLT5zdGF0ZSAmIFBOR19JSERSKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIklEQVQgd2l0aG91dCBJSERSXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICghKHMtPnN0YXRlICYgUE5HX0lEQVQpKSB7CisgICAgICAgIC8qIGluaXQgaW1hZ2UgaW5mbyAqLworICAgICAgICBhdmN0eC0+d2lkdGggID0gcy0+d2lkdGg7CisgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSBzLT5oZWlnaHQ7CisKKyAgICAgICAgcy0+Y2hhbm5lbHMgICAgICAgPSBmZl9wbmdfZ2V0X25iX2NoYW5uZWxzKHMtPmNvbG9yX3R5cGUpOworICAgICAgICBzLT5iaXRzX3Blcl9waXhlbCA9IHMtPmJpdF9kZXB0aCAqIHMtPmNoYW5uZWxzOworICAgICAgICBzLT5icHAgICAgICAgICAgICA9IChzLT5iaXRzX3Blcl9waXhlbCArIDcpID4+IDM7CisgICAgICAgIHMtPnJvd19zaXplICAgICAgID0gKHMtPmN1cl93ICogcy0+Yml0c19wZXJfcGl4ZWwgKyA3KSA+PiAzOworCisgICAgICAgIGlmICgocy0+Yml0X2RlcHRoID09IDIgfHwgcy0+Yml0X2RlcHRoID09IDQgfHwgcy0+Yml0X2RlcHRoID09IDgpICYmCisgICAgICAgICAgICAgICAgcy0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IyNDsKKyAgICAgICAgfSBlbHNlIGlmICgocy0+Yml0X2RlcHRoID09IDIgfHwgcy0+Yml0X2RlcHRoID09IDQgfHwgcy0+Yml0X2RlcHRoID09IDgpICYmCisgICAgICAgICAgICAgICAgcy0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0JBOworICAgICAgICB9IGVsc2UgaWYgKChzLT5iaXRfZGVwdGggPT0gMiB8fCBzLT5iaXRfZGVwdGggPT0gNCB8fCBzLT5iaXRfZGVwdGggPT0gOCkgJiYKKyAgICAgICAgICAgICAgICBzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZODsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5iaXRfZGVwdGggPT0gMTYgJiYKKyAgICAgICAgICAgICAgICBzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTZCRTsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5iaXRfZGVwdGggPT0gMTYgJiYKKyAgICAgICAgICAgICAgICBzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikgeworICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjQ4QkU7CisgICAgICAgIH0gZWxzZSBpZiAocy0+Yml0X2RlcHRoID09IDE2ICYmCisgICAgICAgICAgICAgICAgcy0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0JBNjRCRTsKKyAgICAgICAgfSBlbHNlIGlmICgocy0+Yml0c19wZXJfcGl4ZWwgPT0gMSB8fCBzLT5iaXRzX3Blcl9waXhlbCA9PSAyIHx8IHMtPmJpdHNfcGVyX3BpeGVsID09IDQgfHwgcy0+Yml0c19wZXJfcGl4ZWwgPT0gOCkgJiYKKyAgICAgICAgICAgICAgICBzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworICAgICAgICB9IGVsc2UgaWYgKHMtPmJpdF9kZXB0aCA9PSAxICYmIHMtPmJpdHNfcGVyX3BpeGVsID09IDEpIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9NT05PQkxBQ0s7CisgICAgICAgIH0gZWxzZSBpZiAocy0+Yml0X2RlcHRoID09IDggJiYKKyAgICAgICAgICAgICAgICBzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZQTg7CisgICAgICAgIH0gZWxzZSBpZiAocy0+Yml0X2RlcHRoID09IDE2ICYmCisgICAgICAgICAgICAgICAgcy0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKSB7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWUExNkJFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBiaXQgZGVwdGggJWQgIgorICAgICAgICAgICAgICAgICAgICAiYW5kIGNvbG9yIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIHMtPmJpdF9kZXB0aCwgcy0+Y29sb3JfdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZzLT5waWN0dXJlLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChhdmN0eCk7CisKKyAgICAgICAgcC0+cGljdF90eXBlICAgICAgICA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBwLT5rZXlfZnJhbWUgICAgICAgID0gMTsKKyAgICAgICAgcC0+aW50ZXJsYWNlZF9mcmFtZSA9ICEhcy0+aW50ZXJsYWNlX3R5cGU7CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgY29tcHJlc3NlZCByb3cgc2l6ZSAqLworICAgICAgICBpZiAoIXMtPmludGVybGFjZV90eXBlKSB7CisgICAgICAgICAgICBzLT5jcm93X3NpemUgPSBzLT5yb3dfc2l6ZSArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5wYXNzICAgICAgICAgID0gMDsKKyAgICAgICAgICAgIHMtPnBhc3Nfcm93X3NpemUgPSBmZl9wbmdfcGFzc19yb3dfc2l6ZShzLT5wYXNzLAorICAgICAgICAgICAgICAgICAgICBzLT5iaXRzX3Blcl9waXhlbCwKKyAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3cpOworICAgICAgICAgICAgcy0+Y3Jvd19zaXplID0gcy0+cGFzc19yb3dfc2l6ZSArIDE7CisgICAgICAgIH0KKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgInJvd19zaXplPSVkIGNyb3dfc2l6ZSA9JWRcbiIsCisgICAgICAgICAgICAgICAgcy0+cm93X3NpemUsIHMtPmNyb3dfc2l6ZSk7CisgICAgICAgIHMtPmltYWdlX2J1ZiAgICAgID0gcC0+ZGF0YVswXTsKKyAgICAgICAgcy0+aW1hZ2VfbGluZXNpemUgPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgLyogY29weSB0aGUgcGFsZXR0ZSBpZiBuZWVkZWQgKi8KKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCkKKyAgICAgICAgICAgIG1lbWNweShwLT5kYXRhWzFdLCBzLT5wYWxldHRlLCAyNTYgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgLyogZW1wdHkgcm93IGlzIHVzZWQgaWYgZGlmZmVyZW5jaW5nIHRvIHRoZSBmaXJzdCByb3cgKi8KKyAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jeigmcy0+bGFzdF9yb3csICZzLT5sYXN0X3Jvd19zaXplLCBzLT5yb3dfc2l6ZSk7CisgICAgICAgIGlmICghcy0+bGFzdF9yb3cpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKHMtPmludGVybGFjZV90eXBlIHx8CisgICAgICAgICAgICAgICAgcy0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpIHsKKyAgICAgICAgICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcy0+dG1wX3JvdywgJnMtPnRtcF9yb3dfc2l6ZSwgcy0+cm93X3NpemUpOworICAgICAgICAgICAgaWYgKCFzLT50bXBfcm93KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIC8qIGNvbXByZXNzZWQgcm93ICovCisgICAgICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcy0+YnVmZmVyLCAmcy0+YnVmZmVyX3NpemUsIHMtPnJvd19zaXplICsgMTYpOworICAgICAgICBpZiAoIXMtPmJ1ZmZlcikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgLyogd2Ugd2FudCBjcm93X2J1ZisxIHRvIGJlIDE2LWJ5dGUgYWxpZ25lZCAqLworICAgICAgICBzLT5jcm93X2J1ZiAgICAgICAgICA9IHMtPmJ1ZmZlciArIDE1OworICAgICAgICBzLT56c3RyZWFtLmF2YWlsX291dCA9IHMtPmNyb3dfc2l6ZTsKKyAgICAgICAgcy0+enN0cmVhbS5uZXh0X291dCAgPSBzLT5jcm93X2J1ZjsKKyAgICB9CisgICAgcy0+c3RhdGUgfD0gUE5HX0lEQVQ7CisgICAgaWYgKChyZXQgPSBwbmdfZGVjb2RlX2lkYXQocywgbGVuZ3RoKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCA0KTsgLyogY3JjICovCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcGx0ZV9jaHVuayhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFBOR0RlY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICBpbnQgbiwgaSwgciwgZywgYjsKKworICAgIGlmICgobGVuZ3RoICUgMykgIT0gMCB8fCBsZW5ndGggPiAyNTYgKiAzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAvKiByZWFkIHRoZSBwYWxldHRlICovCisgICAgbiA9IGxlbmd0aCAvIDM7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICByID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICAgICAgZyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgICAgIGIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICBzLT5wYWxldHRlW2ldID0gKDB4RkZVIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKKyAgICB9CisgICAgZm9yICg7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgcy0+cGFsZXR0ZVtpXSA9ICgweEZGVSA8PCAyNCk7CisgICAgcy0+c3RhdGUgfD0gUE5HX1BMVEU7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIDQpOyAgICAgLyogY3JjICovCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfdHJuc19jaHVuayhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFBOR0RlY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICBpbnQgdiwgaTsKKworICAgIC8qIHJlYWQgdGhlIHRyYW5zcGFyZW5jeS4gWFhYOiBPbmx5IHBhbGV0dGUgbW9kZSBzdXBwb3J0ZWQgKi8KKyAgICBpZiAocy0+Y29sb3JfdHlwZSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFIHx8CisgICAgICAgICAgICBsZW5ndGggPiAyNTYgfHwKKyAgICAgICAgICAgICEocy0+c3RhdGUgJiBQTkdfUExURSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICB2ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICAgICAgcy0+cGFsZXR0ZVtpXSA9IChzLT5wYWxldHRlW2ldICYgMHgwMGZmZmZmZikgfCAodiA8PCAyNCk7CisgICAgfQorICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCA0KTsgICAgIC8qIGNyYyAqLworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9zbWFsbF9icHAoUE5HRGVjQ29udGV4dCAqcywgQVZGcmFtZSAqcCkKK3sKKyAgICBpZiAocy0+Yml0c19wZXJfcGl4ZWwgPT0gMSAmJiBzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsKKyAgICAgICAgaW50IGksIGosIGs7CisgICAgICAgIHVpbnQ4X3QgKnBkID0gcC0+ZGF0YVswXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPmhlaWdodDsgaisrKSB7CisgICAgICAgICAgICBpID0gcy0+d2lkdGggLyA4OworICAgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAxOyBrLS0pCisgICAgICAgICAgICAgICAgaWYgKChzLT53aWR0aCY3KSA+PSBrKQorICAgICAgICAgICAgICAgICAgICBwZFs4KmkgKyBrIC0gMV0gPSAocGRbaV0+PjgtaykgJiAxOworICAgICAgICAgICAgZm9yIChpLS07IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgcGRbOCppICsgN109ICBwZFtpXSAgICAgJiAxOworICAgICAgICAgICAgICAgIHBkWzgqaSArIDZdPSAocGRbaV0+PjEpICYgMTsKKyAgICAgICAgICAgICAgICBwZFs4KmkgKyA1XT0gKHBkW2ldPj4yKSAmIDE7CisgICAgICAgICAgICAgICAgcGRbOCppICsgNF09IChwZFtpXT4+MykgJiAxOworICAgICAgICAgICAgICAgIHBkWzgqaSArIDNdPSAocGRbaV0+PjQpICYgMTsKKyAgICAgICAgICAgICAgICBwZFs4KmkgKyAyXT0gKHBkW2ldPj41KSAmIDE7CisgICAgICAgICAgICAgICAgcGRbOCppICsgMV09IChwZFtpXT4+NikgJiAxOworICAgICAgICAgICAgICAgIHBkWzgqaSArIDBdPSAgcGRbaV0+Pjc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZCArPSBzLT5pbWFnZV9saW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocy0+Yml0c19wZXJfcGl4ZWwgPT0gMikgeworICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgdWludDhfdCAqcGQgPSBwLT5kYXRhWzBdOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+aGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICAgIGkgPSBzLT53aWR0aCAvIDQ7CisgICAgICAgICAgICBpZiAocy0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSB7CisgICAgICAgICAgICAgICAgaWYgKChzLT53aWR0aCYzKSA+PSAzKSBwZFs0KmkgKyAyXT0gKHBkW2ldID4+IDIpICYgMzsKKyAgICAgICAgICAgICAgICBpZiAoKHMtPndpZHRoJjMpID49IDIpIHBkWzQqaSArIDFdPSAocGRbaV0gPj4gNCkgJiAzOworICAgICAgICAgICAgICAgIGlmICgocy0+d2lkdGgmMykgPj0gMSkgcGRbNCppICsgMF09ICBwZFtpXSA+PiA2OworICAgICAgICAgICAgICAgIGZvciAoaS0tOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBwZFs0KmkgKyAzXT0gIHBkW2ldICAgICAmIDM7CisgICAgICAgICAgICAgICAgICAgIHBkWzQqaSArIDJdPSAocGRbaV0+PjIpICYgMzsKKyAgICAgICAgICAgICAgICAgICAgcGRbNCppICsgMV09IChwZFtpXT4+NCkgJiAzOworICAgICAgICAgICAgICAgICAgICBwZFs0KmkgKyAwXT0gIHBkW2ldPj42OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKChzLT53aWR0aCYzKSA+PSAzKSBwZFs0KmkgKyAyXT0gKChwZFtpXT4+MikgJiAzKSoweDU1OworICAgICAgICAgICAgICAgIGlmICgocy0+d2lkdGgmMykgPj0gMikgcGRbNCppICsgMV09ICgocGRbaV0+PjQpICYgMykqMHg1NTsKKyAgICAgICAgICAgICAgICBpZiAoKHMtPndpZHRoJjMpID49IDEpIHBkWzQqaSArIDBdPSAoIHBkW2ldPj42ICAgICApKjB4NTU7CisgICAgICAgICAgICAgICAgZm9yIChpLS07IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIHBkWzQqaSArIDNdPSAoIHBkW2ldICAgICAmIDMpKjB4NTU7CisgICAgICAgICAgICAgICAgICAgIHBkWzQqaSArIDJdPSAoKHBkW2ldPj4yKSAmIDMpKjB4NTU7CisgICAgICAgICAgICAgICAgICAgIHBkWzQqaSArIDFdPSAoKHBkW2ldPj40KSAmIDMpKjB4NTU7CisgICAgICAgICAgICAgICAgICAgIHBkWzQqaSArIDBdPSAoIHBkW2ldPj42ICAgICApKjB4NTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGQgKz0gcy0+aW1hZ2VfbGluZXNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHMtPmJpdHNfcGVyX3BpeGVsID09IDQpIHsKKyAgICAgICAgaW50IGksIGo7CisgICAgICAgIHVpbnQ4X3QgKnBkID0gcC0+ZGF0YVswXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPmhlaWdodDsgaisrKSB7CisgICAgICAgICAgICBpID0gcy0+d2lkdGgvMjsKKyAgICAgICAgICAgIGlmIChzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+d2lkdGgmMSkgcGRbMippKzBdPSBwZFtpXT4+NDsKKyAgICAgICAgICAgICAgICBmb3IgKGktLTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgcGRbMippICsgMV0gPSBwZFtpXSAmIDE1OworICAgICAgICAgICAgICAgICAgICBwZFsyKmkgKyAwXSA9IHBkW2ldID4+IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+d2lkdGggJiAxKSBwZFsyKmkgKyAwXT0gKHBkW2ldID4+IDQpICogMHgxMTsKKyAgICAgICAgICAgICAgICBmb3IgKGktLTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgcGRbMippICsgMV0gPSAocGRbaV0gJiAxNSkgKiAweDExOworICAgICAgICAgICAgICAgICAgICBwZFsyKmkgKyAwXSA9IChwZFtpXSA+PiA0KSAqIDB4MTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGQgKz0gcy0+aW1hZ2VfbGluZXNpemU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZjdGxfY2h1bmsoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBQTkdEZWNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgdWludDMyX3Qgc2VxdWVuY2VfbnVtYmVyOworCisgICAgaWYgKGxlbmd0aCAhPSAyNikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzZXF1ZW5jZV9udW1iZXIgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Z2IpOworICAgIHMtPmN1cl93ICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nYik7CisgICAgcy0+Y3VyX2ggICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnMtPmdiKTsKKyAgICBzLT54X29mZnNldCAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Z2IpOworICAgIHMtPnlfb2Zmc2V0ICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nYik7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIDQpOyAvKiBkZWxheV9udW0gKDIpLCBkZWxheV9kZW4gKDIpICovCisgICAgcy0+ZGlzcG9zZV9vcCAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICBzLT5ibGVuZF9vcCAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCA0KTsgLyogY3JjICovCisKKyAgICBpZiAoc2VxdWVuY2VfbnVtYmVyID09IDAgJiYKKyAgICAgICAgKHMtPmN1cl93ICE9IHMtPndpZHRoIHx8CisgICAgICAgICBzLT5jdXJfaCAhPSBzLT5oZWlnaHQgfHwKKyAgICAgICAgIHMtPnhfb2Zmc2V0ICE9IDAgfHwKKyAgICAgICAgIHMtPnlfb2Zmc2V0ICE9IDApIHx8CisgICAgICAgIHMtPmN1cl93IDw9IDAgfHwgcy0+Y3VyX2ggPD0gMCB8fAorICAgICAgICBzLT54X29mZnNldCA8IDAgfHwgcy0+eV9vZmZzZXQgPCAwIHx8CisgICAgICAgIHMtPmN1cl93ID4gcy0+d2lkdGggLSBzLT54X29mZnNldHx8IHMtPmN1cl9oID4gcy0+aGVpZ2h0IC0gcy0+eV9vZmZzZXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIGFsd2F5cyAocmUpc3RhcnQgd2l0aCBhIGNsZWFuIGZyYW1lICovCisgICAgaWYgKHNlcXVlbmNlX251bWJlciA9PSAwKSB7CisgICAgICAgIHMtPmRpc3Bvc2Vfb3AgPSBBUE5HX0RJU1BPU0VfT1BfQkFDS0dST1VORDsKKyAgICAgICAgcy0+ZnJhbWVfaWQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmZyYW1lX2lkKys7CisgICAgICAgIGlmIChzLT5mcmFtZV9pZCA9PSAxICYmIHMtPmRpc3Bvc2Vfb3AgPT0gQVBOR19ESVNQT1NFX09QX1BSRVZJT1VTKQorICAgICAgICAgICAgLyogcHJldmlvdXMgZm9yIHRoZSBzZWNvbmQgZnJhbWUgaXMgdGhlIGZpcnN0IGZyYW1lICovCisgICAgICAgICAgICBzLT5kaXNwb3NlX29wID0gQVBOR19ESVNQT1NFX09QX05PTkU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9wX2ZyYW1lX3BuZyhQTkdEZWNDb250ZXh0ICpzLCBBVkZyYW1lICpwKQoreworICAgIGludCBpLCBqOworICAgIHVpbnQ4X3QgKnBkICAgICAgPSBwLT5kYXRhWzBdOworICAgIHVpbnQ4X3QgKnBkX2xhc3QgPSBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVswXTsKKyAgICBpbnQgbHMgPSBGRk1JTihhdl9pbWFnZV9nZXRfbGluZXNpemUocC0+Zm9ybWF0LCBzLT53aWR0aCwgMCksIHMtPndpZHRoICogcy0+YnBwKTsKKworICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcy0+bGFzdF9waWN0dXJlLCBJTlRfTUFYLCAwKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgcy0+aGVpZ2h0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxzOyBpKyspCisgICAgICAgICAgICBwZFtpXSArPSBwZF9sYXN0W2ldOworICAgICAgICBwZCAgICAgICs9IHMtPmltYWdlX2xpbmVzaXplOworICAgICAgICBwZF9sYXN0ICs9IHMtPmltYWdlX2xpbmVzaXplOworICAgIH0KK30KKworLy8gZGl2aWRlIGJ5IDI1NSBhbmQgcm91bmQgdG8gbmVhcmVzdAorLy8gYXBwbHkgYSBmYXN0IHZhcmlhbnQ6IChYKzEyNykvMjU1ID0gKChYKzEyNykqMjU3KzI1Nyk+PjE2ID0gKChYKzEyOCkqMjU3KT4+MTYKKyNkZWZpbmUgRkFTVF9ESVYyNTUoeCkgKCgoKHgpICsgMTI4KSAqIDI1NykgPj4gMTYpCisKK3N0YXRpYyBpbnQgaGFuZGxlX3BfZnJhbWVfYXBuZyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFBOR0RlY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqcCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICB1aW50OF90ICpwZCAgICAgID0gcC0+ZGF0YVswXTsKKyAgICB1aW50OF90ICpwZF9sYXN0ID0gcy0+bGFzdF9waWN0dXJlLmYtPmRhdGFbMF07CisgICAgdWludDhfdCAqcGRfbGFzdF9yZWdpb24gPSBzLT5kaXNwb3NlX29wID09IEFQTkdfRElTUE9TRV9PUF9QUkVWSU9VUyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByZXZpb3VzX3BpY3R1cmUuZi0+ZGF0YVswXSA6IHMtPmxhc3RfcGljdHVyZS5mLT5kYXRhWzBdOworICAgIGludCBscyA9IEZGTUlOKGF2X2ltYWdlX2dldF9saW5lc2l6ZShwLT5mb3JtYXQsIHMtPndpZHRoLCAwKSwgcy0+d2lkdGggKiBzLT5icHApOworCisgICAgaWYgKHMtPmJsZW5kX29wID09IEFQTkdfQkxFTkRfT1BfT1ZFUiAmJgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1JHQkEgJiYgYXZjdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9BUkdCKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkJsZW5kaW5nIHdpdGggcGl4ZWwgZm9ybWF0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoYXZjdHgtPnBpeF9mbXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcy0+bGFzdF9waWN0dXJlLCBJTlRfTUFYLCAwKTsKKyAgICBpZiAocy0+ZGlzcG9zZV9vcCA9PSBBUE5HX0RJU1BPU0VfT1BfUFJFVklPVVMpCisgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcy0+cHJldmlvdXNfcGljdHVyZSwgSU5UX01BWCwgMCk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgcy0+eV9vZmZzZXQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbHM7IGkrKykKKyAgICAgICAgICAgIHBkW2ldID0gcGRfbGFzdFtpXTsKKyAgICAgICAgcGQgICAgICArPSBzLT5pbWFnZV9saW5lc2l6ZTsKKyAgICAgICAgcGRfbGFzdCArPSBzLT5pbWFnZV9saW5lc2l6ZTsKKyAgICB9CisKKyAgICBpZiAocy0+ZGlzcG9zZV9vcCAhPSBBUE5HX0RJU1BPU0VfT1BfQkFDS0dST1VORCAmJiBzLT5ibGVuZF9vcCA9PSBBUE5HX0JMRU5EX09QX09WRVIpIHsKKyAgICAgICAgdWludDhfdCByaSwgZ2ksIGJpLCBhaTsKKworICAgICAgICBwZF9sYXN0X3JlZ2lvbiArPSBzLT55X29mZnNldCAqIHMtPmltYWdlX2xpbmVzaXplOworICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0JBKSB7CisgICAgICAgICAgICByaSA9IDA7CisgICAgICAgICAgICBnaSA9IDE7CisgICAgICAgICAgICBiaSA9IDI7CisgICAgICAgICAgICBhaSA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByaSA9IDM7CisgICAgICAgICAgICBnaSA9IDI7CisgICAgICAgICAgICBiaSA9IDE7CisgICAgICAgICAgICBhaSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSBzLT55X29mZnNldDsgaiA8IHMtPnlfb2Zmc2V0ICsgcy0+Y3VyX2g7IGorKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnhfb2Zmc2V0ICogcy0+YnBwOyBpKyspCisgICAgICAgICAgICAgICAgcGRbaV0gPSBwZF9sYXN0W2ldOworICAgICAgICAgICAgZm9yICg7IGkgPCAocy0+eF9vZmZzZXQgKyBzLT5jdXJfdykgKiBzLT5icHA7IGkgKz0gcy0+YnBwKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBhbHBoYSA9IHBkW2krYWldOworCisgICAgICAgICAgICAgICAgLyogb3V0cHV0ID0gYWxwaGEgKiBmb3JlZ3JvdW5kICsgKDEtYWxwaGEpICogYmFja2dyb3VuZCAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWxwaGEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHBkW2krcmldID0gcGRfbGFzdF9yZWdpb25baStyaV07CisgICAgICAgICAgICAgICAgICAgIHBkW2krZ2ldID0gcGRfbGFzdF9yZWdpb25baStnaV07CisgICAgICAgICAgICAgICAgICAgIHBkW2krYmldID0gcGRfbGFzdF9yZWdpb25baStiaV07CisgICAgICAgICAgICAgICAgICAgIHBkW2krYWldID0gMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyNTU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHBkW2krcmldID0gRkFTVF9ESVYyNTUoYWxwaGEgKiBwZFtpK3JpXSArICgyNTUgLSBhbHBoYSkgKiBwZF9sYXN0X3JlZ2lvbltpK3JpXSk7CisgICAgICAgICAgICAgICAgICAgIHBkW2krZ2ldID0gRkFTVF9ESVYyNTUoYWxwaGEgKiBwZFtpK2dpXSArICgyNTUgLSBhbHBoYSkgKiBwZF9sYXN0X3JlZ2lvbltpK2dpXSk7CisgICAgICAgICAgICAgICAgICAgIHBkW2krYmldID0gRkFTVF9ESVYyNTUoYWxwaGEgKiBwZFtpK2JpXSArICgyNTUgLSBhbHBoYSkgKiBwZF9sYXN0X3JlZ2lvbltpK2JpXSk7CisgICAgICAgICAgICAgICAgICAgIHBkW2krYWldID0gMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICg7IGkgPCBsczsgaSsrKQorICAgICAgICAgICAgICAgIHBkW2ldID0gcGRfbGFzdFtpXTsKKyAgICAgICAgICAgIHBkICAgICAgKz0gcy0+aW1hZ2VfbGluZXNpemU7CisgICAgICAgICAgICBwZF9sYXN0ICs9IHMtPmltYWdlX2xpbmVzaXplOworICAgICAgICAgICAgcGRfbGFzdF9yZWdpb24gKz0gcy0+aW1hZ2VfbGluZXNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGogPSBzLT55X29mZnNldDsgaiA8IHMtPnlfb2Zmc2V0ICsgcy0+Y3VyX2g7IGorKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnhfb2Zmc2V0ICogcy0+YnBwOyBpKyspCisgICAgICAgICAgICAgICAgcGRbaV0gPSBwZF9sYXN0W2ldOworICAgICAgICAgICAgZm9yIChpID0gKHMtPnhfb2Zmc2V0ICsgcy0+Y3VyX3cpICogcy0+YnBwOyBpIDwgbHM7IGkrKykKKyAgICAgICAgICAgICAgICBwZFtpXSA9IHBkX2xhc3RbaV07CisgICAgICAgICAgICBwZCAgICAgICs9IHMtPmltYWdlX2xpbmVzaXplOworICAgICAgICAgICAgcGRfbGFzdCArPSBzLT5pbWFnZV9saW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaiA9IHMtPnlfb2Zmc2V0ICsgcy0+Y3VyX2g7IGogPCBzLT5oZWlnaHQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbHM7IGkrKykKKyAgICAgICAgICAgIHBkW2ldID0gcGRfbGFzdFtpXTsKKyAgICAgICAgcGQgICAgICArPSBzLT5pbWFnZV9saW5lc2l6ZTsKKyAgICAgICAgcGRfbGFzdCArPSBzLT5pbWFnZV9saW5lc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWVfY29tbW9uKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUE5HRGVjQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpwLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZEaWN0aW9uYXJ5ICptZXRhZGF0YSAgPSBOVUxMOworICAgIHVpbnQzMl90IHRhZywgbGVuZ3RoOworICAgIGludCBkZWNvZGVfbmV4dF9kYXQgPSAwOworICAgIGludCByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIEFWRnJhbWUgKnJlZjsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgbGVuZ3RoID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKTsKKyAgICAgICAgaWYgKGxlbmd0aCA8PSAwKSB7CisgICAgICAgICAgICBpZiAoQ09ORklHX0FQTkdfREVDT0RFUiAmJiBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVBORyAmJiBsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghKHMtPnN0YXRlICYgUE5HX0lEQVQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdF9sb29wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICIlZCBieXRlcyBsZWZ0XG4iLCBsZW5ndGgpOworICAgICAgICAgICAgaWYgKCAgIHMtPnN0YXRlICYgUE5HX0FMTElNQUdFCisgICAgICAgICAgICAgICAgJiYgYXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA8PSBGRl9DT01QTElBTkNFX05PUk1BTCkKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXRfbG9vcDsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGxlbmd0aCA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nYik7CisgICAgICAgIGlmIChsZW5ndGggPiAweDdmZmZmZmZmIHx8IGxlbmd0aCA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2h1bmsgdG9vIGJpZ1xuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgdGFnID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnMtPmdiKTsKKyAgICAgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1NUQVJUQ09ERSkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAicG5nOiB0YWc9JWMlYyVjJWMgbGVuZ3RoPSV1XG4iLAorICAgICAgICAgICAgICAgICh0YWcgJiAweGZmKSwKKyAgICAgICAgICAgICAgICAoKHRhZyA+PiA4KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgICgodGFnID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgICgodGFnID4+IDI0KSAmIDB4ZmYpLCBsZW5ndGgpOworICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICBjYXNlIE1LVEFHKCdJJywgJ0gnLCAnRCcsICdSJyk6CisgICAgICAgICAgICBpZiAoZGVjb2RlX2loZHJfY2h1bmsoYXZjdHgsIHMsIGxlbmd0aCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdwJywgJ0gnLCAnWScsICdzJyk6CisgICAgICAgICAgICBpZiAoZGVjb2RlX3BoeXNfY2h1bmsoYXZjdHgsIHMpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnZicsICdjJywgJ1QnLCAnTCcpOgorICAgICAgICAgICAgaWYgKCFDT05GSUdfQVBOR19ERUNPREVSIHx8IGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9BUE5HKQorICAgICAgICAgICAgICAgIGdvdG8gc2tpcF90YWc7CisgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9mY3RsX2NodW5rKGF2Y3R4LCBzLCBsZW5ndGgpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgZGVjb2RlX25leHRfZGF0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdmJywgJ2QnLCAnQScsICdUJyk6CisgICAgICAgICAgICBpZiAoIUNPTkZJR19BUE5HX0RFQ09ERVIgfHwgYXZjdHgtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0FQTkcpCisgICAgICAgICAgICAgICAgZ290byBza2lwX3RhZzsKKyAgICAgICAgICAgIGlmICghZGVjb2RlX25leHRfZGF0KQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nYik7CisgICAgICAgICAgICBsZW5ndGggLT0gNDsKKyAgICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgICAgIGNhc2UgTUtUQUcoJ0knLCAnRCcsICdBJywgJ1QnKToKKyAgICAgICAgICAgIGlmIChDT05GSUdfQVBOR19ERUNPREVSICYmIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BUE5HICYmICFkZWNvZGVfbmV4dF9kYXQpCisgICAgICAgICAgICAgICAgZ290byBza2lwX3RhZzsKKyAgICAgICAgICAgIGlmIChkZWNvZGVfaWRhdF9jaHVuayhhdmN0eCwgcywgbGVuZ3RoLCBwKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ1AnLCAnTCcsICdUJywgJ0UnKToKKyAgICAgICAgICAgIGlmIChkZWNvZGVfcGx0ZV9jaHVuayhhdmN0eCwgcywgbGVuZ3RoKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBza2lwX3RhZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCd0JywgJ1InLCAnTicsICdTJyk6CisgICAgICAgICAgICBpZiAoZGVjb2RlX3RybnNfY2h1bmsoYXZjdHgsIHMsIGxlbmd0aCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gc2tpcF90YWc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygndCcsICdFJywgJ1gnLCAndCcpOgorICAgICAgICAgICAgaWYgKGRlY29kZV90ZXh0X2NodW5rKHMsIGxlbmd0aCwgMCwgJm1ldGFkYXRhKSA8IDApCisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkJyb2tlbiB0RVh0IGNodW5rXG4iKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCBsZW5ndGggKyA0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCd6JywgJ1QnLCAnWCcsICd0Jyk6CisgICAgICAgICAgICBpZiAoZGVjb2RlX3RleHRfY2h1bmsocywgbGVuZ3RoLCAxLCAmbWV0YWRhdGEpIDwgMCkKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQnJva2VuIHpUWHQgY2h1bmtcbiIpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIGxlbmd0aCArIDQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ0knLCAnRScsICdOJywgJ0QnKToKKyAgICAgICAgICAgIGlmICghKHMtPnN0YXRlICYgUE5HX0FMTElNQUdFKSkKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIklFTkQgd2l0aG91dCBhbGwgaW1hZ2VcbiIpOworICAgICAgICAgICAgaWYgKCEocy0+c3RhdGUgJiAoUE5HX0FMTElNQUdFfFBOR19JREFUKSkpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgNCk7IC8qIGNyYyAqLworICAgICAgICAgICAgZ290byBleGl0X2xvb3A7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBza2lwIHRhZyAqLworc2tpcF90YWc6CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgbGVuZ3RoICsgNCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK2V4aXRfbG9vcDoKKworICAgIGlmIChzLT5iaXRzX3Blcl9waXhlbCA8PSA0KQorICAgICAgICBoYW5kbGVfc21hbGxfYnBwKHMsIHApOworCisgICAgLyogaGFuZGxlIHAtZnJhbWVzIG9ubHkgaWYgYSBwcmVkZWNlc3NvciBmcmFtZSBpcyBhdmFpbGFibGUgKi8KKyAgICByZWYgPSBzLT5kaXNwb3NlX29wID09IEFQTkdfRElTUE9TRV9PUF9QUkVWSU9VUyA/CisgICAgICAgICAgICAgcy0+cHJldmlvdXNfcGljdHVyZS5mIDogcy0+bGFzdF9waWN0dXJlLmY7CisgICAgaWYgKHJlZi0+ZGF0YVswXSkgeworICAgICAgICBpZiAoICAgIShhdnBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpICYmIGF2Y3R4LT5jb2RlY190YWcgIT0gQVZfUkwzMigiTVBORyIpCisgICAgICAgICAgICAmJiByZWYtPndpZHRoID09IHAtPndpZHRoCisgICAgICAgICAgICAmJiByZWYtPmhlaWdodD09IHAtPmhlaWdodAorICAgICAgICAgICAgJiYgcmVmLT5mb3JtYXQ9PSBwLT5mb3JtYXQKKyAgICAgICAgICkgeworICAgICAgICAgICAgaWYgKENPTkZJR19QTkdfREVDT0RFUiAmJiBhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQVBORykKKyAgICAgICAgICAgICAgICBoYW5kbGVfcF9mcmFtZV9wbmcocywgcCk7CisgICAgICAgICAgICBlbHNlIGlmIChDT05GSUdfQVBOR19ERUNPREVSICYmCisgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVBORyAmJgorICAgICAgICAgICAgICAgICAgICAgKHJldCA9IGhhbmRsZV9wX2ZyYW1lX2FwbmcoYXZjdHgsIHMsIHApKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPnBpY3R1cmUsIElOVF9NQVgsIDApOworCisgICAgYXZfZnJhbWVfc2V0X21ldGFkYXRhKHAsIG1ldGFkYXRhKTsKKyAgICBtZXRhZGF0YSAgID0gTlVMTDsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9kaWN0X2ZyZWUoJm1ldGFkYXRhKTsKKyAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5waWN0dXJlLCBJTlRfTUFYLCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisjaWYgQ09ORklHX1BOR19ERUNPREVSCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZV9wbmcoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgUE5HRGVjQ29udGV4dCAqY29uc3QgcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmICAgICA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBBVkZyYW1lICpwOworICAgIGludDY0X3Qgc2lnOworICAgIGludCByZXQ7CisKKyAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoYXZjdHgsICZzLT5sYXN0X3BpY3R1cmUpOworICAgIEZGU1dBUChUaHJlYWRGcmFtZSwgcy0+cGljdHVyZSwgcy0+bGFzdF9waWN0dXJlKTsKKyAgICBwID0gcy0+cGljdHVyZS5mOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+Z2IsIGJ1ZiwgYnVmX3NpemUpOworCisgICAgLyogY2hlY2sgc2lnbmF0dXJlICovCisgICAgc2lnID0gYnl0ZXN0cmVhbTJfZ2V0X2JlNjQoJnMtPmdiKTsKKyAgICBpZiAoc2lnICE9IFBOR1NJRyAmJgorICAgICAgICBzaWcgIT0gTU5HU0lHKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBwbmcgc2lnbmF0dXJlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+eSA9IHMtPnN0YXRlID0gMDsKKworICAgIC8qIGluaXQgdGhlIHpsaWIgKi8KKyAgICBzLT56c3RyZWFtLnphbGxvYyA9IGZmX3BuZ196YWxsb2M7CisgICAgcy0+enN0cmVhbS56ZnJlZSAgPSBmZl9wbmdfemZyZWU7CisgICAgcy0+enN0cmVhbS5vcGFxdWUgPSBOVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0KCZzLT56c3RyZWFtKTsKKyAgICBpZiAocmV0ICE9IFpfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbmZsYXRlSW5pdCByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBkZWNvZGVfZnJhbWVfY29tbW9uKGF2Y3R4LCBzLCBwLCBhdnBrdCkpIDwgMCkKKyAgICAgICAgZ290byB0aGVfZW5kOworCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+cGljdHVyZS5mKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXQgPSBieXRlc3RyZWFtMl90ZWxsKCZzLT5nYik7Cit0aGVfZW5kOgorICAgIGluZmxhdGVFbmQoJnMtPnpzdHJlYW0pOworICAgIHMtPmNyb3dfYnVmID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKKyNpZiBDT05GSUdfQVBOR19ERUNPREVSCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZV9hcG5nKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFBOR0RlY0NvbnRleHQgKmNvbnN0IHMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisgICAgQVZGcmFtZSAqcDsKKyAgICBUaHJlYWRGcmFtZSB0bXA7CisKKyAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoYXZjdHgsICZzLT5wcmV2aW91c19waWN0dXJlKTsKKyAgICB0bXAgPSBzLT5wcmV2aW91c19waWN0dXJlOworICAgIHMtPnByZXZpb3VzX3BpY3R1cmUgPSBzLT5sYXN0X3BpY3R1cmU7CisgICAgcy0+bGFzdF9waWN0dXJlID0gcy0+cGljdHVyZTsKKyAgICBzLT5waWN0dXJlID0gdG1wOworICAgIHAgPSBzLT5waWN0dXJlLmY7CisKKyAgICBpZiAoIShzLT5zdGF0ZSAmIFBOR19JSERSKSkgeworICAgICAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGFfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIC8qIG9ubHkgaW5pdCBmaWVsZHMsIHRoZXJlIGlzIG5vIHpsaWIgdXNlIGluIGV4dHJhZGF0YSAqLworICAgICAgICBzLT56c3RyZWFtLnphbGxvYyA9IGZmX3BuZ196YWxsb2M7CisgICAgICAgIHMtPnpzdHJlYW0uemZyZWUgID0gZmZfcG5nX3pmcmVlOworCisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmdiLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9mcmFtZV9jb21tb24oYXZjdHgsIHMsIHAsIGF2cGt0KSkgPCAwKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogcmVzZXQgc3RhdGUgZm9yIGEgbmV3IGZyYW1lICovCisgICAgaWYgKChyZXQgPSBpbmZsYXRlSW5pdCgmcy0+enN0cmVhbSkpICE9IFpfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbmZsYXRlSW5pdCByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmV0KTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIHMtPnkgPSAwOworICAgIHMtPnN0YXRlICY9IH4oUE5HX0lEQVQgfCBQTkdfQUxMSU1BR0UpOworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIGlmICgocmV0ID0gZGVjb2RlX2ZyYW1lX2NvbW1vbihhdmN0eCwgcywgcCwgYXZwa3QpKSA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgaWYgKCEocy0+c3RhdGUgJiBQTkdfQUxMSU1BR0UpKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRnJhbWUgZGlkIG5vdCBjb250YWluIGEgY29tcGxldGUgaW1hZ2VcbiIpOworICAgIGlmICghKHMtPnN0YXRlICYgKFBOR19BTExJTUFHRXxQTkdfSURBVCkpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5waWN0dXJlLmYpKSA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgcmV0ID0gYnl0ZXN0cmVhbTJfdGVsbCgmcy0+Z2IpOworCitlbmQ6CisgICAgaW5mbGF0ZUVuZCgmcy0+enN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHVwZGF0ZV90aHJlYWRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqZHN0LCBjb25zdCBBVkNvZGVjQ29udGV4dCAqc3JjKQoreworICAgIFBOR0RlY0NvbnRleHQgKnBzcmMgPSBzcmMtPnByaXZfZGF0YTsKKyAgICBQTkdEZWNDb250ZXh0ICpwZHN0ID0gZHN0LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmIChkc3QgPT0gc3JjKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHBkc3QtPmZyYW1lX2lkID0gcHNyYy0+ZnJhbWVfaWQ7CisKKyAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoZHN0LCAmcGRzdC0+cGljdHVyZSk7CisgICAgaWYgKHBzcmMtPnBpY3R1cmUuZi0+ZGF0YVswXSAmJgorICAgICAgICAocmV0ID0gZmZfdGhyZWFkX3JlZl9mcmFtZSgmcGRzdC0+cGljdHVyZSwgJnBzcmMtPnBpY3R1cmUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKENPTkZJR19BUE5HX0RFQ09ERVIgJiYgZHN0LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BUE5HKSB7CisgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihkc3QsICZwZHN0LT5sYXN0X3BpY3R1cmUpOworICAgICAgICBpZiAocHNyYy0+bGFzdF9waWN0dXJlLmYtPmRhdGFbMF0pCisgICAgICAgICAgICByZXR1cm4gZmZfdGhyZWFkX3JlZl9mcmFtZSgmcGRzdC0+bGFzdF9waWN0dXJlLCAmcHNyYy0+bGFzdF9waWN0dXJlKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHBuZ19kZWNfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUE5HRGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIHMtPnByZXZpb3VzX3BpY3R1cmUuZiA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgcy0+bGFzdF9waWN0dXJlLmYgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIHMtPnBpY3R1cmUuZiA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5wcmV2aW91c19waWN0dXJlLmYgfHwgIXMtPmxhc3RfcGljdHVyZS5mIHx8ICFzLT5waWN0dXJlLmYpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+cHJldmlvdXNfcGljdHVyZS5mKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9waWN0dXJlLmYpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5waWN0dXJlLmYpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmICghYXZjdHgtPmludGVybmFsLT5pc19jb3B5KSB7CisgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+YWxsb2NhdGVfcHJvZ3Jlc3MgPSAxOworICAgICAgICBmZl9wbmdkc3BfaW5pdCgmcy0+ZHNwKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHBuZ19kZWNfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBQTkdEZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJnMtPnByZXZpb3VzX3BpY3R1cmUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnByZXZpb3VzX3BpY3R1cmUuZik7CisgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGF2Y3R4LCAmcy0+bGFzdF9waWN0dXJlKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5sYXN0X3BpY3R1cmUuZik7CisgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGF2Y3R4LCAmcy0+cGljdHVyZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+cGljdHVyZS5mKTsKKyAgICBhdl9mcmVlcCgmcy0+YnVmZmVyKTsKKyAgICBzLT5idWZmZXJfc2l6ZSA9IDA7CisgICAgYXZfZnJlZXAoJnMtPmxhc3Rfcm93KTsKKyAgICBzLT5sYXN0X3Jvd19zaXplID0gMDsKKyAgICBhdl9mcmVlcCgmcy0+dG1wX3Jvdyk7CisgICAgcy0+dG1wX3Jvd19zaXplID0gMDsKKworICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX0FQTkdfREVDT0RFUgorQVZDb2RlYyBmZl9hcG5nX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFwbmciLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBUE5HIChBbmltYXRlZCBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzKSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BUE5HLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQTkdEZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBwbmdfZGVjX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gcG5nX2RlY19lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lX2FwbmcsCisgICAgLmluaXRfdGhyZWFkX2NvcHkgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChwbmdfZGVjX2luaXQpLAorICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh1cGRhdGVfdGhyZWFkX2NvbnRleHQpLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyAvKnwgQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCovLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1BOR19ERUNPREVSCitBVkNvZGVjIGZmX3BuZ19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwbmciLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQTkcgKFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MpIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BORywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUE5HRGVjQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gcG5nX2RlY19pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHBuZ19kZWNfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZV9wbmcsCisgICAgLmluaXRfdGhyZWFkX2NvcHkgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChwbmdfZGVjX2luaXQpLAorICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh1cGRhdGVfdGhyZWFkX2NvbnRleHQpLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyAvKnwgQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCovLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcG5nZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wbmdkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc1MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcG5nZHNwLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIFBORyBpbWFnZSBmb3JtYXQKKyAqIENvcHlyaWdodCAoYykgMjAwOCBMb3JlbiBNZXJyaXQgPGxvcmVubUB1Lndhc2hpbmd0b24uZWR1PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAicG5nLmgiCisjaW5jbHVkZSAicG5nZHNwLmgiCisKKy8vIDB4N2Y3ZjdmN2Ygb3IgMHg3ZjdmN2Y3ZjdmN2Y3ZjdmIG9yIHdoYXRldmVyLCBkZXBlbmRpbmcgb24gdGhlIGNwdSdzIG5hdGl2ZSBhcml0aG1ldGljIHNpemUKKyNkZWZpbmUgcGJfN2YgKH4wVUwgLyAyNTUgKiAweDdmKQorI2RlZmluZSBwYl84MCAofjBVTCAvIDI1NSAqIDB4ODApCisKK3N0YXRpYyB2b2lkIGFkZF9ieXRlc19sMl9jKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjMSwgdWludDhfdCAqc3JjMiwgaW50IHcpCit7CisgICAgbG9uZyBpOworICAgIGZvciAoaSA9IDA7IGkgPD0gdyAtIChpbnQpIHNpemVvZihsb25nKTsgaSArPSBzaXplb2YobG9uZykpIHsKKyAgICAgICAgbG9uZyBhID0gKihsb25nICopKHNyYzEgKyBpKTsKKyAgICAgICAgbG9uZyBiID0gKihsb25nICopKHNyYzIgKyBpKTsKKyAgICAgICAgKihsb25nICopKGRzdCArIGkpID0gKChhICYgcGJfN2YpICsgKGIgJiBwYl83ZikpIF4gKChhIF4gYikgJiBwYl84MCk7CisgICAgfQorICAgIGZvciAoOyBpIDwgdzsgaSsrKQorICAgICAgICBkc3RbaV0gPSBzcmMxW2ldICsgc3JjMltpXTsKK30KKworYXZfY29sZCB2b2lkIGZmX3BuZ2RzcF9pbml0KFBOR0RTUENvbnRleHQgKmRzcCkKK3sKKyAgICBkc3AtPmFkZF9ieXRlc19sMiAgICAgICAgID0gYWRkX2J5dGVzX2wyX2M7CisgICAgZHNwLT5hZGRfcGFldGhfcHJlZGljdGlvbiA9IGZmX2FkZF9wbmdfcGFldGhfcHJlZGljdGlvbjsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfcG5nZHNwX2luaXRfeDg2KGRzcCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wbmdkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3BuZ2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzFhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wbmdkc3AuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogUE5HIGltYWdlIGZvcm1hdAorICogQ29weXJpZ2h0IChjKSAyMDA4IExvcmVuIE1lcnJpdCA8bG9yZW5tQHUud2FzaGluZ3Rvbi5lZHU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19QTkdEU1BfSAorI2RlZmluZSBBVkNPREVDX1BOR0RTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgUE5HRFNQQ29udGV4dCB7CisgICAgdm9pZCAoKmFkZF9ieXRlc19sMikodWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYzEgLyogYWxpZ24gMTYgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjMiwgaW50IHcpOworCisgICAgLyogdGhpcyBtaWdodCB3cml0ZSB0byBkc3Rbd10gKi8KKyAgICB2b2lkICgqYWRkX3BhZXRoX3ByZWRpY3Rpb24pKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdG9wLCBpbnQgdywgaW50IGJwcCk7Cit9IFBOR0RTUENvbnRleHQ7CisKK3ZvaWQgZmZfcG5nZHNwX2luaXQoUE5HRFNQQ29udGV4dCAqZHNwKTsKK3ZvaWQgZmZfcG5nZHNwX2luaXRfeDg2KFBOR0RTUENvbnRleHQgKmRzcCk7CisKKyNlbmRpZiAvKiBBVkNET0RFQ19QTkdEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcG5nZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wbmdlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDFiMWEyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcG5nZW5jLmMKQEAgLTAsMCArMSw1NDAgQEAKKy8qCisgKiBQTkcgaW1hZ2UgZm9ybWF0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaHVmZnl1dmVuY2RzcC5oIgorI2luY2x1ZGUgInBuZy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjaW5jbHVkZSA8emxpYi5oPgorCisjZGVmaW5lIElPQlVGX1NJWkUgNDA5NgorCit0eXBlZGVmIHN0cnVjdCBQTkdFbmNDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBIdWZmWVVWRW5jRFNQQ29udGV4dCBoZHNwOworCisgICAgdWludDhfdCAqYnl0ZXN0cmVhbTsKKyAgICB1aW50OF90ICpieXRlc3RyZWFtX3N0YXJ0OworICAgIHVpbnQ4X3QgKmJ5dGVzdHJlYW1fZW5kOworCisgICAgaW50IGZpbHRlcl90eXBlOworCisgICAgel9zdHJlYW0genN0cmVhbTsKKyAgICB1aW50OF90IGJ1ZltJT0JVRl9TSVpFXTsKKyAgICBpbnQgZHBpOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgUGh5c2ljYWwgcGl4ZWwgZGVuc2l0eSwgaW4gZG90cyBwZXIgaW5jaCwgaWYgc2V0CisgICAgaW50IGRwbTsgICAgICAgICAgICAgICAgICAgICAvLy88IFBoeXNpY2FsIHBpeGVsIGRlbnNpdHksIGluIGRvdHMgcGVyIG1ldGVyLCBpZiBzZXQKK30gUE5HRW5jQ29udGV4dDsKKworc3RhdGljIHZvaWQgcG5nX2dldF9pbnRlcmxhY2VkX3Jvdyh1aW50OF90ICpkc3QsIGludCByb3dfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHNfcGVyX3BpeGVsLCBpbnQgcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIG1hc2ssIGRzdF94LCBqLCBiLCBicHA7CisgICAgdWludDhfdCAqZDsKKyAgICBjb25zdCB1aW50OF90ICpzOworICAgIHN0YXRpYyBjb25zdCBpbnQgbWFza3NbXSA9IHsweDgwLCAweDA4LCAweDg4LCAweDIyLCAweGFhLCAweDU1LCAweGZmfTsKKworICAgIG1hc2sgPSBtYXNrc1twYXNzXTsKKyAgICBzd2l0Y2ggKGJpdHNfcGVyX3BpeGVsKSB7CisgICAgY2FzZSAxOgorICAgICAgICBtZW1zZXQoZHN0LCAwLCByb3dfc2l6ZSk7CisgICAgICAgIGRzdF94ID0gMDsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGogPSAoeCAmIDcpOworICAgICAgICAgICAgaWYgKChtYXNrIDw8IGopICYgMHg4MCkgeworICAgICAgICAgICAgICAgIGIgPSAoc3JjW3ggPj4gM10gPj4gKDcgLSBqKSkgJiAxOworICAgICAgICAgICAgICAgIGRzdFtkc3RfeCA+PiAzXSB8PSBiIDw8ICg3IC0gKGRzdF94ICYgNykpOworICAgICAgICAgICAgICAgIGRzdF94Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnBwID0gYml0c19wZXJfcGl4ZWwgPj4gMzsKKyAgICAgICAgZCA9IGRzdDsKKyAgICAgICAgcyA9IHNyYzsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGogPSB4ICYgNzsKKyAgICAgICAgICAgIGlmICgobWFzayA8PCBqKSAmIDB4ODApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZCwgcywgYnBwKTsKKyAgICAgICAgICAgICAgICBkICs9IGJwcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMgKz0gYnBwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3ViX3BuZ19wYWV0aF9wcmVkaWN0aW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCB1aW50OF90ICp0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBicHApCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICBpbnQgYSwgYiwgYywgcCwgcGEsIHBiLCBwYzsKKworICAgICAgICBhID0gc3JjW2kgLSBicHBdOworICAgICAgICBiID0gdG9wW2ldOworICAgICAgICBjID0gdG9wW2kgLSBicHBdOworCisgICAgICAgIHAgID0gYiAtIGM7CisgICAgICAgIHBjID0gYSAtIGM7CisKKyAgICAgICAgcGEgPSBhYnMocCk7CisgICAgICAgIHBiID0gYWJzKHBjKTsKKyAgICAgICAgcGMgPSBhYnMocCArIHBjKTsKKworICAgICAgICBpZiAocGEgPD0gcGIgJiYgcGEgPD0gcGMpCisgICAgICAgICAgICBwID0gYTsKKyAgICAgICAgZWxzZSBpZiAocGIgPD0gcGMpCisgICAgICAgICAgICBwID0gYjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcCA9IGM7CisgICAgICAgIGRzdFtpXSA9IHNyY1tpXSAtIHA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzdWJfbGVmdF9wcmVkaWN0aW9uKFBOR0VuY0NvbnRleHQgKmMsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgYnBwLCBpbnQgc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpzcmMxID0gc3JjICsgYnBwOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIgPSBzcmM7CisgICAgaW50IHgsIHVuYWxpZ25lZF93OworCisgICAgbWVtY3B5KGRzdCwgc3JjLCBicHApOworICAgIGRzdCArPSBicHA7CisgICAgc2l6ZSAtPSBicHA7CisgICAgdW5hbGlnbmVkX3cgPSBGRk1JTigzMiAtIGJwcCwgc2l6ZSk7CisgICAgZm9yICh4ID0gMDsgeCA8IHVuYWxpZ25lZF93OyB4KyspCisgICAgICAgICpkc3QrKyA9ICpzcmMxKysgLSAqc3JjMisrOworICAgIHNpemUgLT0gdW5hbGlnbmVkX3c7CisgICAgYy0+aGRzcC5kaWZmX2J5dGVzKGRzdCwgc3JjMSwgc3JjMiwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBuZ19maWx0ZXJfcm93KFBOR0VuY0NvbnRleHQgKmMsIHVpbnQ4X3QgKmRzdCwgaW50IGZpbHRlcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCB1aW50OF90ICp0b3AsIGludCBzaXplLCBpbnQgYnBwKQoreworICAgIGludCBpOworCisgICAgc3dpdGNoIChmaWx0ZXJfdHlwZSkgeworICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9OT05FOgorICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfU1VCOgorICAgICAgICBzdWJfbGVmdF9wcmVkaWN0aW9uKGMsIGRzdCwgc3JjLCBicHAsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfVVA6CisgICAgICAgIGMtPmhkc3AuZGlmZl9ieXRlcyhkc3QsIHNyYywgdG9wLCBzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX0FWRzoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJwcDsgaSsrKQorICAgICAgICAgICAgZHN0W2ldID0gc3JjW2ldIC0gKHRvcFtpXSA+PiAxKTsKKyAgICAgICAgZm9yICg7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICBkc3RbaV0gPSBzcmNbaV0gLSAoKHNyY1tpIC0gYnBwXSArIHRvcFtpXSkgPj4gMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJwcDsgaSsrKQorICAgICAgICAgICAgZHN0W2ldID0gc3JjW2ldIC0gdG9wW2ldOworICAgICAgICBzdWJfcG5nX3BhZXRoX3ByZWRpY3Rpb24oZHN0ICsgaSwgc3JjICsgaSwgdG9wICsgaSwgc2l6ZSAtIGksIGJwcCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHVpbnQ4X3QgKnBuZ19jaG9vc2VfZmlsdGVyKFBOR0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKnRvcCwgaW50IHNpemUsIGludCBicHApCit7CisgICAgaW50IHByZWQgPSBzLT5maWx0ZXJfdHlwZTsKKyAgICBhdl9hc3NlcnQwKGJwcCB8fCAhcHJlZCk7CisgICAgaWYgKCF0b3AgJiYgcHJlZCkKKyAgICAgICAgcHJlZCA9IFBOR19GSUxURVJfVkFMVUVfU1VCOworICAgIGlmIChwcmVkID09IFBOR19GSUxURVJfVkFMVUVfTUlYRUQpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBjb3N0LCBiY29zdCA9IElOVF9NQVg7CisgICAgICAgIHVpbnQ4X3QgKmJ1ZjEgPSBkc3QsICpidWYyID0gZHN0ICsgc2l6ZSArIDE2OworICAgICAgICBmb3IgKHByZWQgPSAwOyBwcmVkIDwgNTsgcHJlZCsrKSB7CisgICAgICAgICAgICBwbmdfZmlsdGVyX3JvdyhzLCBidWYxICsgMSwgcHJlZCwgc3JjLCB0b3AsIHNpemUsIGJwcCk7CisgICAgICAgICAgICBidWYxWzBdID0gcHJlZDsKKyAgICAgICAgICAgIGNvc3QgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBzaXplOyBpKyspCisgICAgICAgICAgICAgICAgY29zdCArPSBhYnMoKGludDhfdCkgYnVmMVtpXSk7CisgICAgICAgICAgICBpZiAoY29zdCA8IGJjb3N0KSB7CisgICAgICAgICAgICAgICAgYmNvc3QgPSBjb3N0OworICAgICAgICAgICAgICAgIEZGU1dBUCh1aW50OF90ICosIGJ1ZjEsIGJ1ZjIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYyOworICAgIH0gZWxzZSB7CisgICAgICAgIHBuZ19maWx0ZXJfcm93KHMsIGRzdCArIDEsIHByZWQsIHNyYywgdG9wLCBzaXplLCBicHApOworICAgICAgICBkc3RbMF0gPSBwcmVkOworICAgICAgICByZXR1cm4gZHN0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgcG5nX3dyaXRlX2NodW5rKHVpbnQ4X3QgKipmLCB1aW50MzJfdCB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuZ3RoKQoreworICAgIHVpbnQzMl90IGNyYzsKKyAgICB1aW50OF90IHRhZ2J1Zls0XTsKKworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoZiwgbGVuZ3RoKTsKKyAgICBjcmMgPSBjcmMzMigwLCBaX05VTEwsIDApOworICAgIEFWX1dMMzIodGFnYnVmLCB0YWcpOworICAgIGNyYyA9IGNyYzMyKGNyYywgdGFnYnVmLCA0KTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKGYsIGF2X2Jzd2FwMzIodGFnKSk7CisgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWYsIGxlbmd0aCk7CisgICAgICAgIG1lbWNweSgqZiwgYnVmLCBsZW5ndGgpOworICAgICAgICAqZiArPSBsZW5ndGg7CisgICAgfQorICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoZiwgY3JjKTsKK30KKworLyogWFhYOiBkbyBmaWx0ZXJpbmcgKi8KK3N0YXRpYyBpbnQgcG5nX3dyaXRlX3JvdyhQTkdFbmNDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcy0+enN0cmVhbS5hdmFpbF9pbiA9IHNpemU7CisgICAgcy0+enN0cmVhbS5uZXh0X2luICA9IGRhdGE7CisgICAgd2hpbGUgKHMtPnpzdHJlYW0uYXZhaWxfaW4gPiAwKSB7CisgICAgICAgIHJldCA9IGRlZmxhdGUoJnMtPnpzdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgICBpZiAocmV0ICE9IFpfT0spCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChzLT56c3RyZWFtLmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICBpZiAocy0+Ynl0ZXN0cmVhbV9lbmQgLSBzLT5ieXRlc3RyZWFtID4gSU9CVUZfU0laRSArIDEwMCkKKyAgICAgICAgICAgICAgICBwbmdfd3JpdGVfY2h1bmsoJnMtPmJ5dGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1LVEFHKCdJJywgJ0QnLCAnQScsICdUJyksIHMtPmJ1ZiwgSU9CVUZfU0laRSk7CisgICAgICAgICAgICBzLT56c3RyZWFtLmF2YWlsX291dCA9IElPQlVGX1NJWkU7CisgICAgICAgICAgICBzLT56c3RyZWFtLm5leHRfb3V0ICA9IHMtPmJ1ZjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljdCwgaW50ICpnb3RfcGFja2V0KQoreworICAgIFBOR0VuY0NvbnRleHQgKnMgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEFWRnJhbWUgKmNvbnN0IHAgPSBwaWN0OworICAgIGludCBiaXRfZGVwdGgsIGNvbG9yX3R5cGUsIHksIGxlbiwgcm93X3NpemUsIHJldCwgaXNfcHJvZ3Jlc3NpdmU7CisgICAgaW50IGJpdHNfcGVyX3BpeGVsLCBwYXNzX3Jvd19zaXplLCBlbmNfcm93X3NpemU7CisgICAgaW50NjRfdCBtYXhfcGFja2V0X3NpemU7CisgICAgaW50IGNvbXByZXNzaW9uX2xldmVsOworICAgIHVpbnQ4X3QgKnB0ciwgKnRvcCwgKmNyb3dfYnVmLCAqY3JvdzsKKyAgICB1aW50OF90ICpjcm93X2Jhc2UgICAgICAgPSBOVUxMOworICAgIHVpbnQ4X3QgKnByb2dyZXNzaXZlX2J1ZiA9IE5VTEw7CisgICAgdWludDhfdCAqdG9wX2J1ZiAgICAgICAgID0gTlVMTDsKKworICAgIGlzX3Byb2dyZXNzaXZlID0gISEoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVCk7CisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRCRToKKyAgICAgICAgYml0X2RlcHRoID0gMTY7CisgICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OEJFOgorICAgICAgICBiaXRfZGVwdGggPSAxNjsKKyAgICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CisgICAgICAgIGJpdF9kZXB0aCAgPSA4OworICAgICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIGJpdF9kZXB0aCAgPSA4OworICAgICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2QkU6CisgICAgICAgIGJpdF9kZXB0aCAgPSAxNjsKKyAgICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICAgICAgYml0X2RlcHRoICA9IDg7CisgICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWThBOgorICAgICAgICBiaXRfZGVwdGggPSA4OworICAgICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX01PTk9CTEFDSzoKKyAgICAgICAgYml0X2RlcHRoICA9IDE7CisgICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUEFMODoKKyAgICAgICAgYml0X2RlcHRoICA9IDg7CisgICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGJpdHNfcGVyX3BpeGVsID0gZmZfcG5nX2dldF9uYl9jaGFubmVscyhjb2xvcl90eXBlKSAqIGJpdF9kZXB0aDsKKyAgICByb3dfc2l6ZSAgICAgICA9IChhdmN0eC0+d2lkdGggKiBiaXRzX3Blcl9waXhlbCArIDcpID4+IDM7CisKKyAgICBzLT56c3RyZWFtLnphbGxvYyA9IGZmX3BuZ196YWxsb2M7CisgICAgcy0+enN0cmVhbS56ZnJlZSAgPSBmZl9wbmdfemZyZWU7CisgICAgcy0+enN0cmVhbS5vcGFxdWUgPSBOVUxMOworICAgIGNvbXByZXNzaW9uX2xldmVsID0gYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsID09IEZGX0NPTVBSRVNTSU9OX0RFRkFVTFQKKyAgICAgICAgICAgICAgICAgICAgICA/IFpfREVGQVVMVF9DT01QUkVTU0lPTgorICAgICAgICAgICAgICAgICAgICAgIDogYXZfY2xpcChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwsIDAsIDkpOworICAgIHJldCA9IGRlZmxhdGVJbml0Migmcy0+enN0cmVhbSwgY29tcHJlc3Npb25fbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIFpfREVGTEFURUQsIDE1LCA4LCBaX0RFRkFVTFRfU1RSQVRFR1kpOworICAgIGlmIChyZXQgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZW5jX3Jvd19zaXplICAgID0gZGVmbGF0ZUJvdW5kKCZzLT56c3RyZWFtLCByb3dfc2l6ZSk7CisgICAgbWF4X3BhY2tldF9zaXplID0gYXZjdHgtPmhlaWdodCAqIChpbnQ2NF90KShlbmNfcm93X3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChlbmNfcm93X3NpemUgKyBJT0JVRl9TSVpFIC0gMSkgLyBJT0JVRl9TSVpFKSAqIDEyKQorICAgICAgICAgICAgICAgICAgICAgICsgRkZfTUlOX0JVRkZFUl9TSVpFOworICAgIGlmIChtYXhfcGFja2V0X3NpemUgPiBJTlRfTUFYKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBtYXhfcGFja2V0X3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5ieXRlc3RyZWFtX3N0YXJ0ID0KKyAgICBzLT5ieXRlc3RyZWFtICAgICAgID0gcGt0LT5kYXRhOworICAgIHMtPmJ5dGVzdHJlYW1fZW5kICAgPSBwa3QtPmRhdGEgKyBwa3QtPnNpemU7CisKKyAgICBjcm93X2Jhc2UgPSBhdl9tYWxsb2MoKHJvd19zaXplICsgMzIpIDw8IChzLT5maWx0ZXJfdHlwZSA9PSBQTkdfRklMVEVSX1ZBTFVFX01JWEVEKSk7CisgICAgaWYgKCFjcm93X2Jhc2UpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAvLyBwaXhlbCBkYXRhIHNob3VsZCBiZSBhbGlnbmVkLCBidXQgdGhlcmUncyBhIGNvbnRyb2wgYnl0ZSBiZWZvcmUgaXQKKyAgICBjcm93X2J1ZiA9IGNyb3dfYmFzZSArIDE1OworICAgIGlmIChpc19wcm9ncmVzc2l2ZSkgeworICAgICAgICBwcm9ncmVzc2l2ZV9idWYgPSBhdl9tYWxsb2Mocm93X3NpemUgKyAxKTsKKyAgICAgICAgaWYgKCFwcm9ncmVzc2l2ZV9idWYpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChpc19wcm9ncmVzc2l2ZSkgeworICAgICAgICB0b3BfYnVmID0gYXZfbWFsbG9jKHJvd19zaXplICsgMSk7CisgICAgICAgIGlmICghdG9wX2J1ZikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiB3cml0ZSBwbmcgaGVhZGVyICovCisgICAgQVZfV0I2NChzLT5ieXRlc3RyZWFtLCBQTkdTSUcpOworICAgIHMtPmJ5dGVzdHJlYW0gKz0gODsKKworICAgIEFWX1dCMzIocy0+YnVmLCBhdmN0eC0+d2lkdGgpOworICAgIEFWX1dCMzIocy0+YnVmICsgNCwgYXZjdHgtPmhlaWdodCk7CisgICAgcy0+YnVmWzhdICA9IGJpdF9kZXB0aDsKKyAgICBzLT5idWZbOV0gID0gY29sb3JfdHlwZTsKKyAgICBzLT5idWZbMTBdID0gMDsgLyogY29tcHJlc3Npb24gdHlwZSAqLworICAgIHMtPmJ1ZlsxMV0gPSAwOyAvKiBmaWx0ZXIgdHlwZSAqLworICAgIHMtPmJ1ZlsxMl0gPSBpc19wcm9ncmVzc2l2ZTsgLyogaW50ZXJsYWNlIHR5cGUgKi8KKworICAgIHBuZ193cml0ZV9jaHVuaygmcy0+Ynl0ZXN0cmVhbSwgTUtUQUcoJ0knLCAnSCcsICdEJywgJ1InKSwgcy0+YnVmLCAxMyk7CisKKyAgICBpZiAocy0+ZHBtKSB7CisgICAgICBBVl9XQjMyKHMtPmJ1Ziwgcy0+ZHBtKTsKKyAgICAgIEFWX1dCMzIocy0+YnVmICsgNCwgcy0+ZHBtKTsKKyAgICAgIHMtPmJ1Zls4XSA9IDE7IC8qIHVuaXQgc3BlY2lmaWVyIGlzIG1ldGVyICovCisgICAgfSBlbHNlIHsKKyAgICAgIEFWX1dCMzIocy0+YnVmLCBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pOworICAgICAgQVZfV0IzMihzLT5idWYgKyA0LCBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgcy0+YnVmWzhdID0gMDsgLyogdW5pdCBzcGVjaWZpZXIgaXMgdW5rbm93biAqLworICAgIH0KKyAgICBwbmdfd3JpdGVfY2h1bmsoJnMtPmJ5dGVzdHJlYW0sIE1LVEFHKCdwJywgJ0gnLCAnWScsICdzJyksIHMtPmJ1ZiwgOSk7CisKKyAgICAvKiBwdXQgdGhlIHBhbGV0dGUgaWYgbmVlZGVkICovCisgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgeworICAgICAgICBpbnQgaGFzX2FscGhhLCBhbHBoYSwgaTsKKyAgICAgICAgdW5zaWduZWQgaW50IHY7CisgICAgICAgIHVpbnQzMl90ICpwYWxldHRlOworICAgICAgICB1aW50OF90ICphbHBoYV9wdHI7CisKKyAgICAgICAgcGFsZXR0ZSAgID0gKHVpbnQzMl90ICopcC0+ZGF0YVsxXTsKKyAgICAgICAgcHRyICAgICAgID0gcy0+YnVmOworICAgICAgICBhbHBoYV9wdHIgPSBzLT5idWYgKyAyNTYgKiAzOworICAgICAgICBoYXNfYWxwaGEgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICAgIHYgICAgID0gcGFsZXR0ZVtpXTsKKyAgICAgICAgICAgIGFscGhhID0gdiA+PiAyNDsKKyAgICAgICAgICAgIGlmIChhbHBoYSAhPSAweGZmKQorICAgICAgICAgICAgICAgIGhhc19hbHBoYSA9IDE7CisgICAgICAgICAgICAqYWxwaGFfcHRyKysgPSBhbHBoYTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMjQoJnB0ciwgdik7CisgICAgICAgIH0KKyAgICAgICAgcG5nX3dyaXRlX2NodW5rKCZzLT5ieXRlc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgTUtUQUcoJ1AnLCAnTCcsICdUJywgJ0UnKSwgcy0+YnVmLCAyNTYgKiAzKTsKKyAgICAgICAgaWYgKGhhc19hbHBoYSkgeworICAgICAgICAgICAgcG5nX3dyaXRlX2NodW5rKCZzLT5ieXRlc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1LVEFHKCd0JywgJ1InLCAnTicsICdTJyksIHMtPmJ1ZiArIDI1NiAqIDMsIDI1Nik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBub3cgcHV0IGVhY2ggcm93ICovCisgICAgcy0+enN0cmVhbS5hdmFpbF9vdXQgPSBJT0JVRl9TSVpFOworICAgIHMtPnpzdHJlYW0ubmV4dF9vdXQgID0gcy0+YnVmOworICAgIGlmIChpc19wcm9ncmVzc2l2ZSkgeworICAgICAgICBpbnQgcGFzczsKKworICAgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgTkJfUEFTU0VTOyBwYXNzKyspIHsKKyAgICAgICAgICAgIC8qIE5PVEU6IGEgcGFzcyBpcyBjb21wbGV0ZWx5IG9taXR0ZWQgaWYgbm8gcGl4ZWxzIHdvdWxkIGJlCisgICAgICAgICAgICAgKiBvdXRwdXQgKi8KKyAgICAgICAgICAgIHBhc3Nfcm93X3NpemUgPSBmZl9wbmdfcGFzc19yb3dfc2l6ZShwYXNzLCBiaXRzX3Blcl9waXhlbCwgYXZjdHgtPndpZHRoKTsKKyAgICAgICAgICAgIGlmIChwYXNzX3Jvd19zaXplID4gMCkgeworICAgICAgICAgICAgICAgIHRvcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKChmZl9wbmdfcGFzc195bWFza1twYXNzXSA8PCAoeSAmIDcpKSAmIDB4ODApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHAtPmRhdGFbMF0gKyB5ICogcC0+bGluZXNpemVbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBGRlNXQVAodWludDhfdCAqLCBwcm9ncmVzc2l2ZV9idWYsIHRvcF9idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2dldF9pbnRlcmxhY2VkX3Jvdyhwcm9ncmVzc2l2ZV9idWYsIHBhc3Nfcm93X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNfcGVyX3BpeGVsLCBwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIsIGF2Y3R4LT53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm93ID0gcG5nX2Nob29zZV9maWx0ZXIocywgY3Jvd19idWYsIHByb2dyZXNzaXZlX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIHBhc3Nfcm93X3NpemUsIGJpdHNfcGVyX3BpeGVsID4+IDMpOworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3dyaXRlX3JvdyhzLCBjcm93LCBwYXNzX3Jvd19zaXplICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBwcm9ncmVzc2l2ZV9idWY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRvcCA9IE5VTEw7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIHB0ciA9IHAtPmRhdGFbMF0gKyB5ICogcC0+bGluZXNpemVbMF07CisgICAgICAgICAgICBjcm93ID0gcG5nX2Nob29zZV9maWx0ZXIocywgY3Jvd19idWYsIHB0ciwgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd19zaXplLCBiaXRzX3Blcl9waXhlbCA+PiAzKTsKKyAgICAgICAgICAgIHBuZ193cml0ZV9yb3cocywgY3Jvdywgcm93X3NpemUgKyAxKTsKKyAgICAgICAgICAgIHRvcCA9IHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBjb21wcmVzcyBsYXN0IGJ5dGVzICovCisgICAgZm9yICg7OykgeworICAgICAgICByZXQgPSBkZWZsYXRlKCZzLT56c3RyZWFtLCBaX0ZJTklTSCk7CisgICAgICAgIGlmIChyZXQgPT0gWl9PSyB8fCByZXQgPT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICBsZW4gPSBJT0JVRl9TSVpFIC0gcy0+enN0cmVhbS5hdmFpbF9vdXQ7CisgICAgICAgICAgICBpZiAobGVuID4gMCAmJiBzLT5ieXRlc3RyZWFtX2VuZCAtIHMtPmJ5dGVzdHJlYW0gPiBsZW4gKyAxMDApIHsKKyAgICAgICAgICAgICAgICBwbmdfd3JpdGVfY2h1bmsoJnMtPmJ5dGVzdHJlYW0sIE1LVEFHKCdJJywgJ0QnLCAnQScsICdUJyksIHMtPmJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnpzdHJlYW0uYXZhaWxfb3V0ID0gSU9CVUZfU0laRTsKKyAgICAgICAgICAgIHMtPnpzdHJlYW0ubmV4dF9vdXQgID0gcy0+YnVmOworICAgICAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisgICAgcG5nX3dyaXRlX2NodW5rKCZzLT5ieXRlc3RyZWFtLCBNS1RBRygnSScsICdFJywgJ04nLCAnRCcpLCBOVUxMLCAwKTsKKworICAgIHBrdC0+c2l6ZSAgID0gcy0+Ynl0ZXN0cmVhbSAtIHMtPmJ5dGVzdHJlYW1fc3RhcnQ7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworICAgIHJldCAgICAgICAgID0gMDsKKwordGhlX2VuZDoKKyAgICBhdl9mcmVlKGNyb3dfYmFzZSk7CisgICAgYXZfZnJlZShwcm9ncmVzc2l2ZV9idWYpOworICAgIGF2X2ZyZWUodG9wX2J1Zik7CisgICAgZGVmbGF0ZUVuZCgmcy0+enN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK2ZhaWw6CisgICAgcmV0ID0gLTE7CisgICAgZ290byB0aGVfZW5kOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcG5nX2VuY19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBQTkdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDMyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAyNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMHgyODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX01PTk9CTEFDSzoKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9QQUw4OgorICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDE7CisKKyAgICBmZl9odWZmeXV2ZW5jZHNwX2luaXQoJnMtPmhkc3ApOworCisgICAgcy0+ZmlsdGVyX3R5cGUgPSBhdl9jbGlwKGF2Y3R4LT5wcmVkaWN0aW9uX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfRklMVEVSX1ZBTFVFX01JWEVEKTsKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9NT05PQkxBQ0spCisgICAgICAgIHMtPmZpbHRlcl90eXBlID0gUE5HX0ZJTFRFUl9WQUxVRV9OT05FOworCisgICAgaWYgKHMtPmRwaSAmJiBzLT5kcG0pIHsKKyAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBvbmUgb2YgJ2RwaScgb3IgJ2RwbScgb3B0aW9ucyBzaG91bGQgYmUgc2V0XG4iKTsKKyAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfSBlbHNlIGlmIChzLT5kcGkpIHsKKyAgICAgIHMtPmRwbSA9IHMtPmRwaSAqIDEwMDAwIC8gMjU0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcG5nX2VuY19jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUE5HRW5jQ29udGV4dCwgeCkKKyNkZWZpbmUgVkUgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ImRwaSIsICJTZXQgaW1hZ2UgcmVzb2x1dGlvbiAoaW4gZG90cyBwZXIgaW5jaCkiLCAgT0ZGU0VUKGRwaSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMHgxMDAwMCwgVkV9LAorICAgIHsiZHBtIiwgIlNldCBpbWFnZSByZXNvbHV0aW9uIChpbiBkb3RzIHBlciBtZXRlcikiLCBPRkZTRVQoZHBtKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAweDEwMDAwLCBWRX0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHBuZ2VuY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJQTkcgZW5jb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX3BuZ19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwbmciLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQTkcgKFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MpIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BORywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUE5HRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gcG5nX2VuY19pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHBuZ19lbmNfY2xvc2UsCisgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9GUkFNRV9USFJFQURTIHwgQ09ERUNfQ0FQX0lOVFJBX09OTFksCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfUkdCMjQsIEFWX1BJWF9GTVRfUkdCQSwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0I0OEJFLCBBVl9QSVhfRk1UX1JHQkE2NEJFLAorICAgICAgICBBVl9QSVhfRk1UX1BBTDgsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWThBLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNkJFLAorICAgICAgICBBVl9QSVhfRk1UX01PTk9CTEFDSywgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmcG5nZW5jX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BubS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcG5tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyZTU1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BubS5jCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogUE5NIGltYWdlIGZvcm1hdAorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAicG5tLmgiCisKK3N0YXRpYyBpbmxpbmUgaW50IHBubV9zcGFjZShpbnQgYykKK3sKKyAgICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcdCc7Cit9CisKK3N0YXRpYyB2b2lkIHBubV9nZXQoUE5NQ29udGV4dCAqc2MsIGNoYXIgKnN0ciwgaW50IGJ1Zl9zaXplKQoreworICAgIGNoYXIgKnM7CisgICAgaW50IGM7CisKKyAgICAvKiBza2lwIHNwYWNlcyBhbmQgY29tbWVudHMgKi8KKyAgICB3aGlsZSAoc2MtPmJ5dGVzdHJlYW0gPCBzYy0+Ynl0ZXN0cmVhbV9lbmQpIHsKKyAgICAgICAgYyA9ICpzYy0+Ynl0ZXN0cmVhbSsrOworICAgICAgICBpZiAoYyA9PSAnIycpICB7CisgICAgICAgICAgICB3aGlsZSAoYyAhPSAnXG4nICYmIHNjLT5ieXRlc3RyZWFtIDwgc2MtPmJ5dGVzdHJlYW1fZW5kKSB7CisgICAgICAgICAgICAgICAgYyA9ICpzYy0+Ynl0ZXN0cmVhbSsrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFwbm1fc3BhY2UoYykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcyA9IHN0cjsKKyAgICB3aGlsZSAoc2MtPmJ5dGVzdHJlYW0gPCBzYy0+Ynl0ZXN0cmVhbV9lbmQgJiYgIXBubV9zcGFjZShjKSkgeworICAgICAgICBpZiAoKHMgLSBzdHIpICA8IGJ1Zl9zaXplIC0gMSkKKyAgICAgICAgICAgICpzKysgPSBjOworICAgICAgICBjID0gKnNjLT5ieXRlc3RyZWFtKys7CisgICAgfQorICAgICpzID0gJ1wwJzsKK30KKworaW50IGZmX3BubV9kZWNvZGVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUE5NQ29udGV4dCAqIGNvbnN0IHMpCit7CisgICAgY2hhciBidWYxWzMyXSwgdHVwbGVfdHlwZVszMl07CisgICAgaW50IGgsIHcsIGRlcHRoLCBtYXh2YWw7CisKKyAgICBwbm1fZ2V0KHMsIGJ1ZjEsIHNpemVvZihidWYxKSk7CisgICAgaWYoYnVmMVswXSAhPSAnUCcpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHMtPnR5cGU9IGJ1ZjFbMV0tJzAnOworCisgICAgaWYgKHMtPnR5cGU9PTEgfHwgcy0+dHlwZT09NCkgeworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfTU9OT1dISVRFOworICAgIH0gZWxzZSBpZiAocy0+dHlwZT09MiB8fCBzLT50eXBlPT01KSB7CisgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUEdNWVVWKQorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZODsKKyAgICB9IGVsc2UgaWYgKHMtPnR5cGU9PTMgfHwgcy0+dHlwZT09NikgeworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgfSBlbHNlIGlmIChzLT50eXBlPT03KSB7CisgICAgICAgIHcgICAgICA9IC0xOworICAgICAgICBoICAgICAgPSAtMTsKKyAgICAgICAgbWF4dmFsID0gLTE7CisgICAgICAgIGRlcHRoICA9IC0xOworICAgICAgICB0dXBsZV90eXBlWzBdID0gJ1wwJzsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgcG5tX2dldChzLCBidWYxLCBzaXplb2YoYnVmMSkpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAoYnVmMSwgIldJRFRIIikpIHsKKyAgICAgICAgICAgICAgICBwbm1fZ2V0KHMsIGJ1ZjEsIHNpemVvZihidWYxKSk7CisgICAgICAgICAgICAgICAgdyA9IHN0cnRvbChidWYxLCBOVUxMLCAxMCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmMSwgIkhFSUdIVCIpKSB7CisgICAgICAgICAgICAgICAgcG5tX2dldChzLCBidWYxLCBzaXplb2YoYnVmMSkpOworICAgICAgICAgICAgICAgIGggPSBzdHJ0b2woYnVmMSwgTlVMTCwgMTApOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZjEsICJERVBUSCIpKSB7CisgICAgICAgICAgICAgICAgcG5tX2dldChzLCBidWYxLCBzaXplb2YoYnVmMSkpOworICAgICAgICAgICAgICAgIGRlcHRoID0gc3RydG9sKGJ1ZjEsIE5VTEwsIDEwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChidWYxLCAiTUFYVkFMIikpIHsKKyAgICAgICAgICAgICAgICBwbm1fZ2V0KHMsIGJ1ZjEsIHNpemVvZihidWYxKSk7CisgICAgICAgICAgICAgICAgbWF4dmFsID0gc3RydG9sKGJ1ZjEsIE5VTEwsIDEwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChidWYxLCAiVFVQTFRZUEUiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAvKiBsaWJhdmNvZGVjIHVzZWQgdG8gd3JpdGUgaW52YWxpZCBmaWxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKGJ1ZjEsICJUVVBMRVRZUEUiKSkgeworICAgICAgICAgICAgICAgIHBubV9nZXQocywgdHVwbGVfdHlwZSwgc2l6ZW9mKHR1cGxlX3R5cGUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChidWYxLCAiRU5ESERSIikpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogY2hlY2sgdGhhdCBhbGwgdGFncyBhcmUgcHJlc2VudCAqLworICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCB8fCBtYXh2YWwgPD0gMCB8fCBkZXB0aCA8PSAwIHx8IHR1cGxlX3R5cGVbMF0gPT0gJ1wwJyB8fCBhdl9pbWFnZV9jaGVja19zaXplKHcsIGgsIDAsIGF2Y3R4KSB8fCBzLT5ieXRlc3RyZWFtID49IHMtPmJ5dGVzdHJlYW1fZW5kKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgYXZjdHgtPndpZHRoICA9IHc7CisgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSBoOworICAgICAgICBzLT5tYXh2YWwgICAgID0gbWF4dmFsOworICAgICAgICBpZiAoZGVwdGggPT0gMSkgeworICAgICAgICAgICAgaWYgKG1heHZhbCA9PSAxKSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX01PTk9CTEFDSzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4dmFsIDwgMjU2KSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVk4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTE2OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDIpIHsKKyAgICAgICAgICAgIGlmIChtYXh2YWwgPT0gMjU1KQorICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZOEE7CisgICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMykgeworICAgICAgICAgICAgaWYgKG1heHZhbCA8IDI1NikgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IyNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjQ4OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDQpIHsKKyAgICAgICAgICAgIGlmIChtYXh2YWwgPCAyNTYpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCQTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQkE2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBwbm1fZ2V0KHMsIGJ1ZjEsIHNpemVvZihidWYxKSk7CisgICAgdyA9IGF0b2koYnVmMSk7CisgICAgcG5tX2dldChzLCBidWYxLCBzaXplb2YoYnVmMSkpOworICAgIGggPSBhdG9pKGJ1ZjEpOworICAgIGlmKHcgPD0gMCB8fCBoIDw9IDAgfHwgYXZfaW1hZ2VfY2hlY2tfc2l6ZSh3LCBoLCAwLCBhdmN0eCkgfHwgcy0+Ynl0ZXN0cmVhbSA+PSBzLT5ieXRlc3RyZWFtX2VuZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdmN0eC0+d2lkdGggID0gdzsKKyAgICBhdmN0eC0+aGVpZ2h0ID0gaDsKKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX01PTk9XSElURSAmJiBhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX01PTk9CTEFDSykgeworICAgICAgICBwbm1fZ2V0KHMsIGJ1ZjEsIHNpemVvZihidWYxKSk7CisgICAgICAgIHMtPm1heHZhbCA9IGF0b2koYnVmMSk7CisgICAgICAgIGlmIChzLT5tYXh2YWwgPD0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG1heHZhbDogJWRcbiIsIHMtPm1heHZhbCk7CisgICAgICAgICAgICBzLT5tYXh2YWwgPSAyNTU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPm1heHZhbCA+PSAyNTYpIHsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dSQVk4KSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVkxNjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I0ODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQICYmIHMtPm1heHZhbCA8IDY1NTM2KSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPm1heHZhbCA8IDUxMikKKyAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA5OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMtPm1heHZhbCA8IDEwMjQpCisgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQMTA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdFxuIik7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ZWxzZQorICAgICAgICBzLT5tYXh2YWw9MTsKKyAgICAvKiBtb3JlIGNoZWNrIGlmIFlVVjQyMCAqLworICAgIGlmIChhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KS0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSKSB7CisgICAgICAgIGlmICgoYXZjdHgtPndpZHRoICYgMSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBoID0gKGF2Y3R4LT5oZWlnaHQgKiAyKTsKKyAgICAgICAgaWYgKChoICUgMykgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBoIC89IDM7CisgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSBoOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BubS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvcG5tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjMGFhZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BubS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBQTk0gaW1hZ2UgZm9ybWF0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19QTk1fSAorI2RlZmluZSBBVkNPREVDX1BOTV9ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKK3R5cGVkZWYgc3RydWN0IFBOTUNvbnRleHQgeworICAgIHVpbnQ4X3QgKmJ5dGVzdHJlYW07CisgICAgdWludDhfdCAqYnl0ZXN0cmVhbV9zdGFydDsKKyAgICB1aW50OF90ICpieXRlc3RyZWFtX2VuZDsKKyAgICBpbnQgbWF4dmFsOyAgICAgICAgICAgICAgICAgLy8vPCBtYXhpbXVtIHZhbHVlIG9mIGEgcGl4ZWwKKyAgICBpbnQgdHlwZTsKK30gUE5NQ29udGV4dDsKKworaW50IGZmX3BubV9kZWNvZGVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUE5NQ29udGV4dCAqIGNvbnN0IHMpOworCisjZW5kaWYgLyogQVZDT0RFQ19QTk1fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcG5tX3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcG5tX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOWUzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wbm1fcGFyc2VyLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIFBOTSBpbWFnZSBwYXJzZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInBhcnNlci5oIiAvL2ZvciBQYXJzZUNvbnRleHQKKyNpbmNsdWRlICJwbm0uaCIKKworCitzdGF0aWMgaW50IHBubV9wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgUGFyc2VDb250ZXh0ICpwYyA9IHMtPnByaXZfZGF0YTsKKyAgICBQTk1Db250ZXh0IHBubWN0eDsKKyAgICBpbnQgbmV4dDsKKworICAgIGZvciAoOyBwYy0+b3ZlcnJlYWQgPiAwOyBwYy0+b3ZlcnJlYWQtLSkgeworICAgICAgICBwYy0+YnVmZmVyW3BjLT5pbmRleCsrXT0gcGMtPmJ1ZmZlcltwYy0+b3ZlcnJlYWRfaW5kZXgrK107CisgICAgfQorcmV0cnk6CisgICAgaWYgKHBjLT5pbmRleCkgeworICAgICAgICBwbm1jdHguYnl0ZXN0cmVhbV9zdGFydCA9CisgICAgICAgIHBubWN0eC5ieXRlc3RyZWFtICAgICAgID0gcGMtPmJ1ZmZlcjsKKyAgICAgICAgcG5tY3R4LmJ5dGVzdHJlYW1fZW5kICAgPSBwYy0+YnVmZmVyICsgcGMtPmluZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIHBubWN0eC5ieXRlc3RyZWFtX3N0YXJ0ID0KKyAgICAgICAgcG5tY3R4LmJ5dGVzdHJlYW0gICAgICAgPSAodWludDhfdCAqKSBidWY7IC8qIGNhc3RzIGF2b2lkIHdhcm5pbmdzICovCisgICAgICAgIHBubWN0eC5ieXRlc3RyZWFtX2VuZCAgID0gKHVpbnQ4X3QgKikgYnVmICsgYnVmX3NpemU7CisgICAgfQorICAgIGlmIChmZl9wbm1fZGVjb2RlX2hlYWRlcihhdmN0eCwgJnBubWN0eCkgPCAwKSB7CisgICAgICAgIGlmIChwbm1jdHguYnl0ZXN0cmVhbSA8IHBubWN0eC5ieXRlc3RyZWFtX2VuZCkgeworICAgICAgICAgICAgaWYgKHBjLT5pbmRleCkgeworICAgICAgICAgICAgICAgIHBjLT5pbmRleCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZisrOworICAgICAgICAgICAgICAgIGJ1Zl9zaXplLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICB9CisjaWYgMAorICAgICAgICBpZiAocGMtPmluZGV4ICYmIHBjLT5pbmRleCAqIDIgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFIDwgcGMtPmJ1ZmZlcl9zaXplICYmIGJ1Zl9zaXplID4gcGMtPmluZGV4KSB7CisgICAgICAgICAgICBtZW1jcHkocGMtPmJ1ZmZlciArIHBjLT5pbmRleCwgYnVmLCBwYy0+aW5kZXgpOworICAgICAgICAgICAgcGMtPmluZGV4ICs9IHBjLT5pbmRleDsKKyAgICAgICAgICAgIGJ1ZiAgICAgICArPSBwYy0+aW5kZXg7CisgICAgICAgICAgICBidWZfc2l6ZSAgLT0gcGMtPmluZGV4OworICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIG5leHQgPSBFTkRfTk9UX0ZPVU5EOworICAgIH0gZWxzZSB7CisgICAgICAgIG5leHQgPSBwbm1jdHguYnl0ZXN0cmVhbSAtIHBubWN0eC5ieXRlc3RyZWFtX3N0YXJ0CisgICAgICAgICAgICAgICArIGF2cGljdHVyZV9nZXRfc2l6ZShhdmN0eC0+cGl4X2ZtdCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgaWYgKHBubWN0eC5ieXRlc3RyZWFtX3N0YXJ0ICE9IGJ1ZikKKyAgICAgICAgICAgIG5leHQgLT0gcGMtPmluZGV4OworICAgICAgICBpZiAobmV4dCA+IGJ1Zl9zaXplKQorICAgICAgICAgICAgbmV4dCA9IEVORF9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUocGMsIG5leHQsICZidWYsICZidWZfc2l6ZSkgPCAwKSB7CisgICAgICAgICpwb3V0YnVmICAgICAgPSBOVUxMOworICAgICAgICAqcG91dGJ1Zl9zaXplID0gMDsKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKyAgICAqcG91dGJ1ZiAgICAgID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gbmV4dDsKK30KKworQVZDb2RlY1BhcnNlciBmZl9wbm1fcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfUEdNLCBBVl9DT0RFQ19JRF9QR01ZVVYsIEFWX0NPREVDX0lEX1BQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0lEX1BCTSwgQVZfQ09ERUNfSURfUEFNIH0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFBhcnNlQ29udGV4dCksCisgICAgLnBhcnNlcl9wYXJzZSAgID0gcG5tX3BhcnNlLAorICAgIC5wYXJzZXJfY2xvc2UgICA9IGZmX3BhcnNlX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BubWRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcG5tZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0YjZlYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BubWRlYy5jCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogUE5NIGltYWdlIGZvcm1hdAorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJwbm0uaCIKKworc3RhdGljIHZvaWQgc2FtcGxlY3B5KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgbiwgaW50IG1heHZhbCkKK3sKKyAgICBpZiAobWF4dmFsIDw9IDI1NSkgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIG4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGk9MDsgaTxuLzI7IGkrKykgeworICAgICAgICAgICAgKCh1aW50MTZfdCAqKWRzdClbaV0gPSBBVl9SQjE2KHNyYysyKmkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IHBubV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmICAgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgICA9IGF2cGt0LT5zaXplOworICAgIFBOTUNvbnRleHQgKiBjb25zdCBzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICogY29uc3QgcCAgICA9IGRhdGE7CisgICAgaW50IGksIGosIG4sIGxpbmVzaXplLCBoLCB1cGdyYWRlID0gMCwgaXNfbW9ubyA9IDA7CisgICAgdW5zaWduZWQgY2hhciAqcHRyOworICAgIGludCBjb21wb25lbnRzLCBzYW1wbGVfbGVuLCByZXQ7CisKKyAgICBzLT5ieXRlc3RyZWFtX3N0YXJ0ID0KKyAgICBzLT5ieXRlc3RyZWFtICAgICAgID0gKHVpbnQ4X3QgKilidWY7CisgICAgcy0+Ynl0ZXN0cmVhbV9lbmQgICA9ICh1aW50OF90ICopYnVmICsgYnVmX3NpemU7CisKKyAgICBpZiAoKHJldCA9IGZmX3BubV9kZWNvZGVfaGVhZGVyKGF2Y3R4LCBzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHAtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIHAtPmtleV9mcmFtZSA9IDE7CisgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBhdl9sb2cyKHMtPm1heHZhbCkgKyAxOworCisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NDoKKyAgICAgICAgbiA9IGF2Y3R4LT53aWR0aCAqIDg7CisgICAgICAgIGNvbXBvbmVudHM9NDsKKyAgICAgICAgc2FtcGxlX2xlbj0xNjsKKyAgICAgICAgaWYgKHMtPm1heHZhbCA8IDY1NTM1KQorICAgICAgICAgICAgdXBncmFkZSA9IDI7CisgICAgICAgIGdvdG8gZG9fcmVhZDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDg6CisgICAgICAgIG4gPSBhdmN0eC0+d2lkdGggKiA2OworICAgICAgICBjb21wb25lbnRzPTM7CisgICAgICAgIHNhbXBsZV9sZW49MTY7CisgICAgICAgIGlmIChzLT5tYXh2YWwgPCA2NTUzNSkKKyAgICAgICAgICAgIHVwZ3JhZGUgPSAyOworICAgICAgICBnb3RvIGRvX3JlYWQ7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CisgICAgICAgIG4gPSBhdmN0eC0+d2lkdGggKiA0OworICAgICAgICBjb21wb25lbnRzPTQ7CisgICAgICAgIHNhbXBsZV9sZW49ODsKKyAgICAgICAgZ290byBkb19yZWFkOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgbiA9IGF2Y3R4LT53aWR0aCAqIDM7CisgICAgICAgIGNvbXBvbmVudHM9MzsKKyAgICAgICAgc2FtcGxlX2xlbj04OworICAgICAgICBpZiAocy0+bWF4dmFsIDwgMjU1KQorICAgICAgICAgICAgdXBncmFkZSA9IDE7CisgICAgICAgIGdvdG8gZG9fcmVhZDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6CisgICAgICAgIG4gPSBhdmN0eC0+d2lkdGg7CisgICAgICAgIGNvbXBvbmVudHM9MTsKKyAgICAgICAgc2FtcGxlX2xlbj04OworICAgICAgICBpZiAocy0+bWF4dmFsIDwgMjU1KQorICAgICAgICAgICAgdXBncmFkZSA9IDE7CisgICAgICAgIGdvdG8gZG9fcmVhZDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWThBOgorICAgICAgICBuID0gYXZjdHgtPndpZHRoICogMjsKKyAgICAgICAgY29tcG9uZW50cz0yOworICAgICAgICBzYW1wbGVfbGVuPTg7CisgICAgICAgIGdvdG8gZG9fcmVhZDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2OgorICAgICAgICBuID0gYXZjdHgtPndpZHRoICogMjsKKyAgICAgICAgY29tcG9uZW50cz0xOworICAgICAgICBzYW1wbGVfbGVuPTE2OworICAgICAgICBpZiAocy0+bWF4dmFsIDwgNjU1MzUpCisgICAgICAgICAgICB1cGdyYWRlID0gMjsKKyAgICAgICAgZ290byBkb19yZWFkOworICAgIGNhc2UgQVZfUElYX0ZNVF9NT05PV0hJVEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX01PTk9CTEFDSzoKKyAgICAgICAgbiA9IChhdmN0eC0+d2lkdGggKyA3KSA+PiAzOworICAgICAgICBjb21wb25lbnRzPTE7CisgICAgICAgIHNhbXBsZV9sZW49MTsKKyAgICAgICAgaXNfbW9ubyA9IDE7CisgICAgZG9fcmVhZDoKKyAgICAgICAgcHRyICAgICAgPSBwLT5kYXRhWzBdOworICAgICAgICBsaW5lc2l6ZSA9IHAtPmxpbmVzaXplWzBdOworICAgICAgICBpZiAocy0+Ynl0ZXN0cmVhbSArIG4gKiBhdmN0eC0+aGVpZ2h0ID4gcy0+Ynl0ZXN0cmVhbV9lbmQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYocy0+dHlwZSA8IDQgfHwgKGlzX21vbm8gJiYgcy0+dHlwZT09NykpeworICAgICAgICAgICAgZm9yIChpPTA7IGk8YXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICAgICAgICAgICAgICBpbml0X3B1dF9iaXRzKCZwYiwgcHRyLCBsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yKGo9MDsgajxhdmN0eC0+d2lkdGggKiBjb21wb25lbnRzOyBqKyspeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYz0wOworICAgICAgICAgICAgICAgICAgICBpbnQgdj0wOworICAgICAgICAgICAgICAgICAgICBpZihzLT50eXBlIDwgNCkKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUocy0+Ynl0ZXN0cmVhbSA8IHMtPmJ5dGVzdHJlYW1fZW5kICYmICgqcy0+Ynl0ZXN0cmVhbSA8ICcwJyB8fCAqcy0+Ynl0ZXN0cmVhbSA+ICc5JyApKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+Ynl0ZXN0cmVhbSsrOworICAgICAgICAgICAgICAgICAgICBpZihzLT5ieXRlc3RyZWFtID49IHMtPmJ5dGVzdHJlYW1fZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc19tb25vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkIGEgc2luZ2xlIGRpZ2l0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gKCpzLT5ieXRlc3RyZWFtKyspJjE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkIGEgc2VxdWVuY2Ugb2YgZGlnaXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IDEwKnYgKyBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAoKnMtPmJ5dGVzdHJlYW0rKykgLSAnMCc7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChjIDw9IDkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzYW1wbGVfbGVuID09IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KilwdHIpW2pdID0gKCgoMTw8c2FtcGxlX2xlbiktMSkqdiArIChzLT5tYXh2YWw+PjEpKS9zLT5tYXh2YWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCBzYW1wbGVfbGVuLCAoKCgxPDxzYW1wbGVfbGVuKS0xKSp2ICsgKHMtPm1heHZhbD4+MSkpL3MtPm1heHZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzYW1wbGVfbGVuICE9IDE2KQorICAgICAgICAgICAgICAgICAgICBmbHVzaF9wdXRfYml0cygmcGIpOworICAgICAgICAgICAgICAgIHB0cis9IGxpbmVzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgaWYgKCF1cGdyYWRlKQorICAgICAgICAgICAgICAgIHNhbXBsZWNweShwdHIsIHMtPmJ5dGVzdHJlYW0sIG4sIHMtPm1heHZhbCk7CisgICAgICAgICAgICBlbHNlIGlmICh1cGdyYWRlID09IDEpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaiwgZiA9ICgyNTUgKiAxMjggKyBzLT5tYXh2YWwgLyAyKSAvIHMtPm1heHZhbDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKQorICAgICAgICAgICAgICAgICAgICBwdHJbal0gPSAocy0+Ynl0ZXN0cmVhbVtqXSAqIGYgKyA2NCkgPj4gNzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodXBncmFkZSA9PSAyKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGosIHYsIGYgPSAoNjU1MzUgKiAzMjc2OCArIHMtPm1heHZhbCAvIDIpIC8gcy0+bWF4dmFsOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuIC8gMjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBhdl9iZTJuZTE2KCgodWludDE2X3QgKilzLT5ieXRlc3RyZWFtKVtqXSk7CisgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QgKilwdHIpW2pdID0gKHYgKiBmICsgMTYzODQpID4+IDE1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmJ5dGVzdHJlYW0gKz0gbjsKKyAgICAgICAgICAgIHB0ciAgICAgICAgICAgKz0gbGluZXNpemU7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMDoKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHRyMSwgKnB0cjI7CisKKyAgICAgICAgICAgIG4gICAgICAgID0gYXZjdHgtPndpZHRoOworICAgICAgICAgICAgcHRyICAgICAgPSBwLT5kYXRhWzBdOworICAgICAgICAgICAgbGluZXNpemUgPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIGlmIChzLT5tYXh2YWwgPj0gMjU2KQorICAgICAgICAgICAgICAgIG4gKj0gMjsKKyAgICAgICAgICAgIGlmIChzLT5ieXRlc3RyZWFtICsgbiAqIGF2Y3R4LT5oZWlnaHQgKiAzIC8gMiA+IHMtPmJ5dGVzdHJlYW1fZW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgIHNhbXBsZWNweShwdHIsIHMtPmJ5dGVzdHJlYW0sIG4sIHMtPm1heHZhbCk7CisgICAgICAgICAgICAgICAgcy0+Ynl0ZXN0cmVhbSArPSBuOworICAgICAgICAgICAgICAgIHB0ciAgICAgICAgICAgKz0gbGluZXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdHIxID0gcC0+ZGF0YVsxXTsKKyAgICAgICAgICAgIHB0cjIgPSBwLT5kYXRhWzJdOworICAgICAgICAgICAgbiA+Pj0gMTsKKyAgICAgICAgICAgIGggPSBhdmN0eC0+aGVpZ2h0ID4+IDE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlY3B5KHB0cjEsIHMtPmJ5dGVzdHJlYW0sIG4sIHMtPm1heHZhbCk7CisgICAgICAgICAgICAgICAgcy0+Ynl0ZXN0cmVhbSArPSBuOworICAgICAgICAgICAgICAgIHNhbXBsZWNweShwdHIyLCBzLT5ieXRlc3RyZWFtLCBuLCBzLT5tYXh2YWwpOworICAgICAgICAgICAgICAgIHMtPmJ5dGVzdHJlYW0gKz0gbjsKKyAgICAgICAgICAgICAgICBwdHIxICs9IHAtPmxpbmVzaXplWzFdOworICAgICAgICAgICAgICAgIHB0cjIgKz0gcC0+bGluZXNpemVbMl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNjoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgKnB0cjEsICpwdHIyOworICAgICAgICAgICAgY29uc3QgaW50IGYgPSAoNjU1MzUgKiAzMjc2OCArIHMtPm1heHZhbCAvIDIpIC8gcy0+bWF4dmFsOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGosIHY7CisKKyAgICAgICAgICAgIG4gICAgICAgID0gYXZjdHgtPndpZHRoICogMjsKKyAgICAgICAgICAgIHB0ciAgICAgID0gcC0+ZGF0YVswXTsKKyAgICAgICAgICAgIGxpbmVzaXplID0gcC0+bGluZXNpemVbMF07CisgICAgICAgICAgICBpZiAocy0+Ynl0ZXN0cmVhbSArIG4gKiBhdmN0eC0+aGVpZ2h0ICogMyAvIDIgPiBzLT5ieXRlc3RyZWFtX2VuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbiAvIDI7IGorKykgeworICAgICAgICAgICAgICAgICAgICB2ID0gYXZfYmUybmUxNigoKHVpbnQxNl90ICopcy0+Ynl0ZXN0cmVhbSlbal0pOworICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90ICopcHRyKVtqXSA9ICh2ICogZiArIDE2Mzg0KSA+PiAxNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+Ynl0ZXN0cmVhbSArPSBuOworICAgICAgICAgICAgICAgIHB0ciAgICAgICAgICAgKz0gbGluZXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdHIxID0gKHVpbnQxNl90KilwLT5kYXRhWzFdOworICAgICAgICAgICAgcHRyMiA9ICh1aW50MTZfdCopcC0+ZGF0YVsyXTsKKyAgICAgICAgICAgIG4gPj49IDE7CisgICAgICAgICAgICBoID0gYXZjdHgtPmhlaWdodCA+PiAxOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuIC8gMjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBhdl9iZTJuZTE2KCgodWludDE2X3QgKilzLT5ieXRlc3RyZWFtKVtqXSk7CisgICAgICAgICAgICAgICAgICAgIHB0cjFbal0gPSAodiAqIGYgKyAxNjM4NCkgPj4gMTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPmJ5dGVzdHJlYW0gKz0gbjsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuIC8gMjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBhdl9iZTJuZTE2KCgodWludDE2X3QgKilzLT5ieXRlc3RyZWFtKVtqXSk7CisgICAgICAgICAgICAgICAgICAgIHB0cjJbal0gPSAodiAqIGYgKyAxNjM4NCkgPj4gMTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPmJ5dGVzdHJlYW0gKz0gbjsKKworICAgICAgICAgICAgICAgIHB0cjEgKz0gcC0+bGluZXNpemVbMV0gLyAyOworICAgICAgICAgICAgICAgIHB0cjIgKz0gcC0+bGluZXNpemVbMl0gLyAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBzLT5ieXRlc3RyZWFtIC0gcy0+Ynl0ZXN0cmVhbV9zdGFydDsKK30KKworCisjaWYgQ09ORklHX1BHTV9ERUNPREVSCitBVkNvZGVjIGZmX3BnbV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwZ20iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQR00gKFBvcnRhYmxlIEdyYXlNYXApIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BHTSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUE5NQ29udGV4dCksCisgICAgLmRlY29kZSAgICAgICAgID0gcG5tX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1BHTVlVVl9ERUNPREVSCitBVkNvZGVjIGZmX3BnbXl1dl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwZ215dXYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQR01ZVVYgKFBvcnRhYmxlIEdyYXlNYXAgWVVWKSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QR01ZVVYsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFBOTUNvbnRleHQpLAorICAgIC5kZWNvZGUgICAgICAgICA9IHBubV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19QUE1fREVDT0RFUgorQVZDb2RlYyBmZl9wcG1fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicHBtIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUFBNIChQb3J0YWJsZSBQaXhlbE1hcCkgaW1hZ2UiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUFBNLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQTk1Db250ZXh0KSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBwbm1fZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfUEJNX0RFQ09ERVIKK0FWQ29kZWMgZmZfcGJtX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInBibSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBCTSAoUG9ydGFibGUgQml0TWFwKSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QQk0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFBOTUNvbnRleHQpLAorICAgIC5kZWNvZGUgICAgICAgICA9IHBubV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19QQU1fREVDT0RFUgorQVZDb2RlYyBmZl9wYW1fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicGFtIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUEFNIChQb3J0YWJsZSBBbnlNYXApIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BBTSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUE5NQ29udGV4dCksCisgICAgLmRlY29kZSAgICAgICAgID0gcG5tX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcG5tZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wbm1lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmMzNjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcG5tZW5jLmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBQTk0gaW1hZ2UgZm9ybWF0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IHBubV9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnAsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICB1aW50OF90ICpieXRlc3RyZWFtLCAqYnl0ZXN0cmVhbV9zdGFydCwgKmJ5dGVzdHJlYW1fZW5kOworICAgIGludCBpLCBoLCBoMSwgYywgbiwgbGluZXNpemUsIHJldDsKKyAgICB1aW50OF90ICpwdHIsICpwdHIxLCAqcHRyMjsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBhdnBpY3R1cmVfZ2V0X3NpemUoYXZjdHgtPnBpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQpICsgMjAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYnl0ZXN0cmVhbV9zdGFydCA9CisgICAgYnl0ZXN0cmVhbSAgICAgICA9IHBrdC0+ZGF0YTsKKyAgICBieXRlc3RyZWFtX2VuZCAgID0gcGt0LT5kYXRhICsgcGt0LT5zaXplOworCisgICAgaCAgPSBhdmN0eC0+aGVpZ2h0OworICAgIGgxID0gaDsKKyAgICBzd2l0Y2ggKGF2Y3R4LT5waXhfZm10KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX01PTk9XSElURToKKyAgICAgICAgYyAgPSAnNCc7CisgICAgICAgIG4gID0gKGF2Y3R4LT53aWR0aCArIDcpID4+IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICAgICAgYyAgPSAnNSc7CisgICAgICAgIG4gID0gYXZjdHgtPndpZHRoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2QkU6CisgICAgICAgIGMgID0gJzUnOworICAgICAgICBuICA9IGF2Y3R4LT53aWR0aCAqIDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgYyAgPSAnNic7CisgICAgICAgIG4gID0gYXZjdHgtPndpZHRoICogMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4QkU6CisgICAgICAgIGMgID0gJzYnOworICAgICAgICBuICA9IGF2Y3R4LT53aWR0aCAqIDY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgICAgICBpZiAoYXZjdHgtPndpZHRoICYgMSB8fCBhdmN0eC0+aGVpZ2h0ICYgMSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwZ215dXYgbmVlZHMgZXZlbiB3aWR0aCBhbmQgaGVpZ2h0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgYyAgPSAnNSc7CisgICAgICAgIG4gID0gYXZjdHgtPndpZHRoOworICAgICAgICBoMSA9IChoICogMykgLyAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE2QkU6CisgICAgICAgIGMgID0gJzUnOworICAgICAgICBuICA9IGF2Y3R4LT53aWR0aCAqIDI7CisgICAgICAgIGgxID0gKGggKiAzKSAvIDI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc25wcmludGYoYnl0ZXN0cmVhbSwgYnl0ZXN0cmVhbV9lbmQgLSBieXRlc3RyZWFtLAorICAgICAgICAgICAgICJQJWNcbiVkICVkXG4iLCBjLCBhdmN0eC0+d2lkdGgsIGgxKTsKKyAgICBieXRlc3RyZWFtICs9IHN0cmxlbihieXRlc3RyZWFtKTsKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9NT05PV0hJVEUpIHsKKyAgICAgICAgaW50IG1heGRlcHRoID0gKDEgPDwgKGF2X3BpeF9mbXRfZGVzY19nZXQoYXZjdHgtPnBpeF9mbXQpLT5jb21wWzBdLmRlcHRoX21pbnVzMSArIDEpKSAtIDE7CisgICAgICAgIHNucHJpbnRmKGJ5dGVzdHJlYW0sIGJ5dGVzdHJlYW1fZW5kIC0gYnl0ZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgIiVkXG4iLCBtYXhkZXB0aCk7CisgICAgICAgIGJ5dGVzdHJlYW0gKz0gc3RybGVuKGJ5dGVzdHJlYW0pOworICAgIH0KKworICAgIHB0ciAgICAgID0gcC0+ZGF0YVswXTsKKyAgICBsaW5lc2l6ZSA9IHAtPmxpbmVzaXplWzBdOworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KGJ5dGVzdHJlYW0sIHB0ciwgbik7CisgICAgICAgIGJ5dGVzdHJlYW0gKz0gbjsKKyAgICAgICAgcHRyICAgICAgICArPSBsaW5lc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQIHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUDE2QkUpIHsKKyAgICAgICAgaCA+Pj0gMTsKKyAgICAgICAgbiA+Pj0gMTsKKyAgICAgICAgcHRyMSA9IHAtPmRhdGFbMV07CisgICAgICAgIHB0cjIgPSBwLT5kYXRhWzJdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgICAgICBtZW1jcHkoYnl0ZXN0cmVhbSwgcHRyMSwgbik7CisgICAgICAgICAgICBieXRlc3RyZWFtICs9IG47CisgICAgICAgICAgICBtZW1jcHkoYnl0ZXN0cmVhbSwgcHRyMiwgbik7CisgICAgICAgICAgICBieXRlc3RyZWFtICs9IG47CisgICAgICAgICAgICAgICAgcHRyMSArPSBwLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgICAgICAgICBwdHIyICs9IHAtPmxpbmVzaXplWzJdOworICAgICAgICB9CisgICAgfQorICAgIHBrdC0+c2l6ZSAgID0gYnl0ZXN0cmVhbSAtIGJ5dGVzdHJlYW1fc3RhcnQ7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBwbm1fZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcG5tX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19QR01fRU5DT0RFUgorQVZDb2RlYyBmZl9wZ21fZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicGdtIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUEdNIChQb3J0YWJsZSBHcmF5TWFwKSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QR00sCisgICAgLmluaXQgICAgICAgICAgID0gcG5tX2VuY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHBubV9lbmNvZGVfY2xvc2UsCisgICAgLmVuY29kZTIgICAgICAgID0gcG5tX2VuY29kZV9mcmFtZSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peworICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX0dSQVkxNkJFLCBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1BHTVlVVl9FTkNPREVSCitBVkNvZGVjIGZmX3BnbXl1dl9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwZ215dXYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQR01ZVVYgKFBvcnRhYmxlIEdyYXlNYXAgWVVWKSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QR01ZVVYsCisgICAgLmluaXQgICAgICAgICAgID0gcG5tX2VuY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHBubV9lbmNvZGVfY2xvc2UsCisgICAgLmVuY29kZTIgICAgICAgID0gcG5tX2VuY29kZV9mcmFtZSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peworICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDIwUDE2QkUsIEFWX1BJWF9GTVRfTk9ORQorICAgIH0sCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfUFBNX0VOQ09ERVIKK0FWQ29kZWMgZmZfcHBtX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInBwbSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBQTSAoUG9ydGFibGUgUGl4ZWxNYXApIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BQTSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBwbm1fZW5jb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gcG5tX2VuY29kZV9jbG9zZSwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBwbm1fZW5jb2RlX2ZyYW1lLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7CisgICAgICAgIEFWX1BJWF9GTVRfUkdCMjQsIEFWX1BJWF9GTVRfUkdCNDhCRSwgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19QQk1fRU5DT0RFUgorQVZDb2RlYyBmZl9wYm1fZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicGJtIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUEJNIChQb3J0YWJsZSBCaXRNYXApIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BCTSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBwbm1fZW5jb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gcG5tX2VuY29kZV9jbG9zZSwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBwbm1fZW5jb2RlX2ZyYW1lLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfTU9OT1dISVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUgfSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9NYWtlZmlsZSBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdlZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL01ha2VmaWxlCkBAIC0wLDAgKzEsMzEgQEAKK09CSlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IHBwYy9mbXRjb252ZXJ0X2FsdGl2ZWMubyAgICAgIFwKKworIyBzdWJzeXN0ZW1zCitPQkpTLSQoQ09ORklHX0FVRElPRFNQKSAgICAgICAgICAgICAgICArPSBwcGMvYXVkaW9kc3AubworT0JKUy0kKENPTkZJR19CTE9DS0RTUCkgICAgICAgICAgICAgICAgKz0gcHBjL2Jsb2NrZHNwLm8KK09CSlMtJChDT05GSUdfRkZUKSAgICAgICAgICAgICAgICAgICAgICs9IHBwYy9mZnRfaW5pdC5vICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwYy9mZnRfYWx0aXZlYy5vICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwYy9mZnRfdnN4Lm8KK09CSlMtJChDT05GSUdfSDI2NENIUk9NQSkgICAgICAgICAgICAgICs9IHBwYy9oMjY0Y2hyb21hX2luaXQubworT0JKUy0kKENPTkZJR19IMjY0RFNQKSAgICAgICAgICAgICAgICAgKz0gcHBjL2gyNjRkc3AubyBwcGMvaHBlbGRzcF9hbHRpdmVjLm8KK09CSlMtJChDT05GSUdfSDI2NFFQRUwpICAgICAgICAgICAgICAgICs9IHBwYy9oMjY0cXBlbC5vCitPQkpTLSQoQ09ORklHX0hQRUxEU1ApICAgICAgICAgICAgICAgICArPSBwcGMvaHBlbGRzcF9hbHRpdmVjLm8KK09CSlMtJChDT05GSUdfSFVGRllVVkRTUCkgICAgICAgICAgICAgICs9IHBwYy9odWZmeXV2ZHNwX2FsdGl2ZWMubworT0JKUy0kKENPTkZJR19GRENURFNQKSAgICAgICAgICAgICAgICAgKz0gcHBjL2ZkY3Rkc3AubworT0JKUy0kKENPTkZJR19JRENURFNQKSAgICAgICAgICAgICAgICAgKz0gcHBjL2lkY3Rkc3AubworT0JKUy0kKENPTkZJR19NRV9DTVApICAgICAgICAgICAgICAgICAgKz0gcHBjL21lX2NtcC5vCitPQkpTLSQoQ09ORklHX01QRUdBVURJT0RTUCkgICAgICAgICAgICArPSBwcGMvbXBlZ2F1ZGlvZHNwX2FsdGl2ZWMubworT0JKUy0kKENPTkZJR19NUEVHVklERU8pICAgICAgICAgICAgICAgKz0gcHBjL21wZWd2aWRlb19hbHRpdmVjLm8gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcGMvbXBlZ3ZpZGVvZHNwLm8KK09CSlMtJChDT05GSUdfTVBFR1ZJREVPRU5DKSAgICAgICAgICAgICs9IHBwYy9tcGVndmlkZW9lbmNkc3AubworT0JKUy0kKENPTkZJR19QSVhCTE9DS0RTUCkgICAgICAgICAgICAgKz0gcHBjL3BpeGJsb2NrZHNwLm8KK09CSlMtJChDT05GSUdfVklERU9EU1ApICAgICAgICAgICAgICAgICs9IHBwYy92aWRlb2RzcF9wcGMubworT0JKUy0kKENPTkZJR19WUDNEU1ApICAgICAgICAgICAgICAgICAgKz0gcHBjL3ZwM2RzcF9hbHRpdmVjLm8KKworIyBkZWNvZGVycy9lbmNvZGVycworT0JKUy0kKENPTkZJR19MTEFVRERTUCkgICAgICAgICAgICAgICAgKz0gcHBjL2xvc3NsZXNzX2F1ZGlvZHNwX2FsdGl2ZWMubworT0JKUy0kKENPTkZJR19TVlExX0VOQ09ERVIpICAgICAgICAgICAgKz0gcHBjL3N2cTFlbmNfYWx0aXZlYy5vCitPQkpTLSQoQ09ORklHX1ZDMV9ERUNPREVSKSAgICAgICAgICAgICArPSBwcGMvdmMxZHNwX2FsdGl2ZWMubworT0JKUy0kKENPTkZJR19WT1JCSVNfREVDT0RFUikgICAgICAgICAgKz0gcHBjL3ZvcmJpc2RzcF9hbHRpdmVjLm8KK09CSlMtJChDT05GSUdfVlA3X0RFQ09ERVIpICAgICAgICAgICAgICs9IHBwYy92cDhkc3BfYWx0aXZlYy5vCitPQkpTLSQoQ09ORklHX1ZQOF9ERUNPREVSKSAgICAgICAgICAgICArPSBwcGMvdnA4ZHNwX2FsdGl2ZWMubwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2FzbS5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZWRlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvYXNtLlMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTG9yZW4gTWVycml0dAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNkZWZpbmUgR0xVRShhLCBiKSBhICMjIGIKKyNkZWZpbmUgSk9JTihhLCBiKSBHTFVFKGEsIGIpCisjZGVmaW5lIFgocykgSk9JTihFWFRFUk5fQVNNLCBzKQorCisjaWYgQVJDSF9QUEM2NAorCisjZGVmaW5lIFBUUiAgLnF1YWQKKyNkZWZpbmUgbHAgICBsZAorI2RlZmluZSBscHggIGxkeAorI2RlZmluZSBzdHAgIHN0ZAorI2RlZmluZSBzdHB1IHN0ZHUKKyNkZWZpbmUgUFMgICA4CisjZGVmaW5lIEwocykgSk9JTiguLCBzKQorCisubWFjcm8gZXh0ZnVuYyBuYW1lCisgICAgLmdsb2JhbCBYKFxuYW1lKQorI2lmIF9DQUxMX0VMRiA9PSAyCisgICAgLnRleHQKK1goXG5hbWUpOgorICAgIGFkZGlzICVyMiwgJXIxMiwgLlRPQy4tWChcbmFtZSlAaGEKKyAgICBhZGRpICVyMiwgJXIyLCAuVE9DLi1YKFxuYW1lKUBsCisgICAgLmxvY2FsZW50cnkgWChcbmFtZSksIC4tWChcbmFtZSkKKyNlbHNlCisgICAgLnNlY3Rpb24gLm9wZCwgImF3IgorWChcbmFtZSk6CisgICAgLnF1YWQgTChcbmFtZSksIC5UT0MuQHRvY2Jhc2UsIDAKKyAgICAucHJldmlvdXMKKyAgICAudHlwZSBYKFxuYW1lKSwgU1RUX0ZVTkMKK0woXG5hbWUpOgorI2VuZGlmCisuZW5kbQorCisubWFjcm8gbW92cmVsIHJkLCBzeW0sIGdwCisgICAgbGQgICAgICBccmQsIFxzeW1AZ290KHIyKQorLmVuZG0KKworLm1hY3JvIGdldF9nb3QgcmQKKy5lbmRtCisKKyNlbHNlIC8qIEFSQ0hfUFBDNjQgKi8KKworI2RlZmluZSBQVFIgIC5pbnQKKyNkZWZpbmUgbHAgICBsd3oKKyNkZWZpbmUgbHB4ICBsd3p4CisjZGVmaW5lIHN0cCAgc3R3CisjZGVmaW5lIHN0cHUgc3R3dQorI2RlZmluZSBQUyAgIDQKKyNkZWZpbmUgTChzKSBzCisKKy5tYWNybyBleHRmdW5jIG5hbWUKKyAgICAuZ2xvYmFsIFgoXG5hbWUpCisgICAgLnR5cGUgICBYKFxuYW1lKSwgU1RUX0ZVTkMKK1goXG5hbWUpOgorXG5hbWU6CisuZW5kbQorCisubWFjcm8gbW92cmVsIHJkLCBzeW0sIGdwCisjaWYgQ09ORklHX1BJQworICAgIGx3eiAgICAgXHJkLCBcc3ltQGdvdChcZ3ApCisjZWxzZQorICAgIGxpcyAgICAgXHJkLCBcc3ltQGhhCisgICAgbGEgICAgICBccmQsIFxzeW1AbChccmQpCisjZW5kaWYKKy5lbmRtCisKKy5tYWNybyBnZXRfZ290IHJkCisjaWYgQ09ORklHX1BJQworICAgIGJjbCAgICAgMjAsIDMxLCAuTGdvdFxACisuTGdvdFxAOgorICAgIG1mbHIgICAgXHJkCisgICAgYWRkaXMgICBccmQsIFxyZCwgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIC0gLkxnb3RcQEBoYQorICAgIGFkZGkgICAgXHJkLCBccmQsIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyAtIC5MZ290XEBAbAorI2VuZGlmCisuZW5kbQorCisjZW5kaWYgLyogQVJDSF9QUEM2NCAqLworCisjaWYgSEFWRV9JQk1fQVNNCisKKy5tYWNybyBERUZJTkVfUkVHIG4KKyAgICAuZXF1aXYgclxuLCBcbgorICAgIC5lcXVpdiBmXG4sIFxuCisgICAgLmVxdWl2IHZcbiwgXG4KKy5lbmRtCisKK0RFRklORV9SRUcgMAorREVGSU5FX1JFRyAxCitERUZJTkVfUkVHIDIKK0RFRklORV9SRUcgMworREVGSU5FX1JFRyA0CitERUZJTkVfUkVHIDUKK0RFRklORV9SRUcgNgorREVGSU5FX1JFRyA3CitERUZJTkVfUkVHIDgKK0RFRklORV9SRUcgOQorREVGSU5FX1JFRyAxMAorREVGSU5FX1JFRyAxMQorREVGSU5FX1JFRyAxMgorREVGSU5FX1JFRyAxMworREVGSU5FX1JFRyAxNAorREVGSU5FX1JFRyAxNQorREVGSU5FX1JFRyAxNgorREVGSU5FX1JFRyAxNworREVGSU5FX1JFRyAxOAorREVGSU5FX1JFRyAxOQorREVGSU5FX1JFRyAyMAorREVGSU5FX1JFRyAyMQorREVGSU5FX1JFRyAyMgorREVGSU5FX1JFRyAyMworREVGSU5FX1JFRyAyNAorREVGSU5FX1JFRyAyNQorREVGSU5FX1JFRyAyNgorREVGSU5FX1JFRyAyNworREVGSU5FX1JFRyAyOAorREVGSU5FX1JFRyAyOQorREVGSU5FX1JFRyAzMAorREVGSU5FX1JFRyAzMQorCisjZW5kaWYgLyogSEFWRV9JQk1fQVNNICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcGMvYXVkaW9kc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9hdWRpb2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OGMzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvYXVkaW9kc3AuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IEx1Y2EgQmFyYmF0byA8bHVfemVyb0BnZW50b28ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBtaXNjZWxsYW5lb3VzIGF1ZGlvIG9wZXJhdGlvbnMKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgSEFWRV9BTFRJVkVDX0gKKyNpbmNsdWRlIDxhbHRpdmVjLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F1ZGlvZHNwLmgiCisKKyNpZiBIQVZFX0FMVElWRUMKKworc3RhdGljIGludDMyX3Qgc2NhbGFycHJvZHVjdF9pbnQxNl9hbHRpdmVjKGNvbnN0IGludDE2X3QgKnYxLCBjb25zdCBpbnQxNl90ICp2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIpCit7CisgICAgaW50IGk7CisgICAgTE9BRF9aRVJPOworICAgIHJlZ2lzdGVyIHZlY19zMTYgdmVjMTsKKyAgICByZWdpc3RlciB2ZWNfczMyIHJlcyA9IHZlY19zcGxhdF9zMzIoMCksIHQ7CisgICAgaW50MzJfdCBpcmVzOworCisgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpICs9IDgpIHsKKyAgICAgICAgdmVjMSA9IHZlY191bmFsaWduZWRfbG9hZCh2MSk7CisgICAgICAgIHQgICAgPSB2ZWNfbXN1bSh2ZWMxLCB2ZWNfbGQoMCwgdjIpLCB6ZXJvX3MzMnYpOworICAgICAgICByZXMgID0gdmVjX3N1bXModCwgcmVzKTsKKyAgICAgICAgdjEgICs9IDg7CisgICAgICAgIHYyICArPSA4OworICAgIH0KKyAgICByZXMgPSB2ZWNfc3BsYXQocmVzLCAzKTsKKyAgICB2ZWNfc3RlKHJlcywgMCwgJmlyZXMpOworCisgICAgcmV0dXJuIGlyZXM7Cit9CisKKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KKworYXZfY29sZCB2b2lkIGZmX2F1ZGlvZHNwX2luaXRfcHBjKEF1ZGlvRFNQQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFX0FMVElWRUMKKyAgICBpZiAoIVBQQ19BTFRJVkVDKGF2X2dldF9jcHVfZmxhZ3MoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGMtPnNjYWxhcnByb2R1Y3RfaW50MTYgPSBzY2FsYXJwcm9kdWN0X2ludDE2X2FsdGl2ZWM7CisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcGMvYmxvY2tkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9ibG9ja2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTliM2IKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvYmxvY2tkc3AuYwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBCcmlhbiBGb2xleQorICogQ29weXJpZ2h0IChjKSAyMDAyIERpZXRlciBTaGlybGV5CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBSb21haW4gRG9sYmVhdSA8cm9tYWluQGRvbGJlYXUub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgSEFWRV9BTFRJVkVDX0gKKyNpbmNsdWRlIDxhbHRpdmVjLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYmxvY2tkc3AuaCIKKworLyogKioqKiogV0FSTklORyAqKioqKiBXQVJOSU5HICoqKioqIFdBUk5JTkcgKioqKiogKi8KKy8qCisgKiBjbGVhcl9ibG9ja3NfZGNiejMyX3BwYyB3aWxsIG5vdCB3b3JrIHByb3Blcmx5IG9uIFBvd2VyUEMgcHJvY2Vzc29ycyB3aXRoCisgKiBhIGNhY2hlIGxpbmUgc2l6ZSBub3QgZXF1YWwgdG8gMzIgYnl0ZXMuIEZvcnR1bmF0ZWx5IGFsbCBwcm9jZXNzb3JzIHVzZWQKKyAqIGJ5IEFwcGxlIHVwIHRvIGF0IGxlYXN0IHRoZSA3NDUwIChBS0Egc2Vjb25kIGdlbmVyYXRpb24gRzQpIHVzZSAzMi1ieXRlCisgKiBjYWNoZSBsaW5lcy4gVGhpcyBpcyBkdWUgdG8gdGhlIHVzZSBvZiB0aGUgJ2RjYnonIGluc3RydWN0aW9uLiBJdCBzaW1wbHkKKyAqIGNsZWFycyBhIHNpbmdsZSBjYWNoZSBsaW5lIHRvIHplcm8sIHNvIHlvdSBuZWVkIHRvIGtub3cgdGhlIGNhY2hlIGxpbmUKKyAqIHNpemUgdG8gdXNlIGl0ISBJdCdzIGFic3VyZCwgYnV0IGl0J3MgZmFzdC4uLgorICoKKyAqIHVwZGF0ZSAyNC8wNi8yMDAzOiBBcHBsZSByZWxlYXNlZCB0aGUgRzUgeWVzdGVyZGF5LCB3aXRoIGEgUFBDOTcwLgorICogY2FjaGUgbGluZSBzaXplOiAxMjggYnl0ZXMuIE91cHMuCisgKiBUaGUgc2VtYW50aWNzIG9mIGRjYnogd2FzIGNoYW5nZWQsIGl0IGFsd2F5cyBjbGVhcnMgMzIgYnl0ZXMuIFNvIHRoZSBmdW5jdGlvbgorICogYmVsb3cgd2lsbCB3b3JrLCBidXQgd2lsbCBiZSBzbG93LiBTbyBJIGZpeGVkIGNoZWNrX2RjYnpfZWZmZWN0IHRvIHVzZSBkY2J6bCwKKyAqIHdoaWNoIGlzIGRlZmluZWQgdG8gY2xlYXIgYSBjYWNoZSBsaW5lIChhcyBkY2J6IGJlZm9yZSkuIFNvIHdlIGNhbiBzdGlsbAorICogZGlzdGluZ3Vpc2gsIGFuZCB1c2UgZGNieiAoMzIgYnl0ZXMpIG9yIGRjYnpsIChvbmUgY2FjaGUgbGluZSkgYXMgcmVxdWlyZWQuCisgKgorICogc2VlIDxodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90ZWNobm90ZXMvdG4vdG4yMDg3Lmh0bWw+CisgKiBhbmQgPGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3RlY2hub3Rlcy90bi90bjIwODYuaHRtbD4KKyAqLworc3RhdGljIHZvaWQgY2xlYXJfYmxvY2tzX2RjYnozMl9wcGMoaW50MTZfdCAqYmxvY2tzKQoreworICAgIHJlZ2lzdGVyIGludCBtaXNhbCA9ICh1bnNpZ25lZCBsb25nKSBibG9ja3MgJiAweDAwMDAwMDEwLCBpID0gMDsKKworICAgIGlmIChtaXNhbCkgeworICAgICAgICAoKHVuc2lnbmVkIGxvbmcgKikgYmxvY2tzKVswXSA9IDBMOworICAgICAgICAoKHVuc2lnbmVkIGxvbmcgKikgYmxvY2tzKVsxXSA9IDBMOworICAgICAgICAoKHVuc2lnbmVkIGxvbmcgKikgYmxvY2tzKVsyXSA9IDBMOworICAgICAgICAoKHVuc2lnbmVkIGxvbmcgKikgYmxvY2tzKVszXSA9IDBMOworICAgICAgICBpICs9IDE2OworICAgIH0KKyAgICBmb3IgKDsgaSA8IHNpemVvZihpbnQxNl90KSAqIDYgKiA2NCAtIDMxOyBpICs9IDMyKQorICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgiZGNieiAlMCwlMSIgOjogImIiIChibG9ja3MpLCAiciIgKGkpIDogIm1lbW9yeSIpOworICAgIGlmIChtaXNhbCkgeworICAgICAgICAoKHVuc2lnbmVkIGxvbmcgKikgYmxvY2tzKVsxODhdID0gMEw7CisgICAgICAgICgodW5zaWduZWQgbG9uZyAqKSBibG9ja3MpWzE4OV0gPSAwTDsKKyAgICAgICAgKCh1bnNpZ25lZCBsb25nICopIGJsb2NrcylbMTkwXSA9IDBMOworICAgICAgICAoKHVuc2lnbmVkIGxvbmcgKikgYmxvY2tzKVsxOTFdID0gMEw7CisgICAgICAgIGkgKz0gMTY7CisgICAgfQorfQorCisvKiBTYW1lIGFzIGFib3ZlLCB3aGVuIGRjYnpsIGNsZWFycyBhIHdob2xlIDEyOCBieXRlcyBjYWNoZSBsaW5lCisgKiBpLmUuIHRoZSBQUEM5NzAgQUtBIEc1LiAqLworc3RhdGljIHZvaWQgY2xlYXJfYmxvY2tzX2RjYnoxMjhfcHBjKGludDE2X3QgKmJsb2NrcykKK3sKKyNpZiBIQVZFX0RDQlpMCisgICAgcmVnaXN0ZXIgaW50IG1pc2FsID0gKHVuc2lnbmVkIGxvbmcpIGJsb2NrcyAmIDB4MDAwMDAwN2YsIGkgPSAwOworCisgICAgaWYgKG1pc2FsKSB7CisgICAgICAgIC8qIFdlIGNvdWxkIHByb2JhYmx5IGFsc28gb3B0aW1pemUgdGhpcyBjYXNlLAorICAgICAgICAgKiBidXQgdGhlcmUncyBub3QgbXVjaCBwb2ludCBhcyB0aGUgbWFjaGluZXMKKyAgICAgICAgICogYXJlbid0IGF2YWlsYWJsZSB5ZXQgKDIwMDMtMDYtMjYpLiAqLworICAgICAgICBtZW1zZXQoYmxvY2tzLCAwLCBzaXplb2YoaW50MTZfdCkgKiA2ICogNjQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoOyBpIDwgc2l6ZW9mKGludDE2X3QpICogNiAqIDY0OyBpICs9IDEyOCkKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCJkY2J6bCAlMCwlMSIgOjogImIiIChibG9ja3MpLCAiciIgKGkpIDogIm1lbW9yeSIpOworICAgIH0KKyNlbHNlCisgICAgbWVtc2V0KGJsb2NrcywgMCwgc2l6ZW9mKGludDE2X3QpICogNiAqIDY0KTsKKyNlbmRpZgorfQorCisvKiBDaGVjayBkY2J6IHJlcG9ydCBob3cgbWFueSBieXRlcyBhcmUgc2V0IHRvIDAgYnkgZGNiei4gKi8KKy8qIHVwZGF0ZSAyNC8wNi8yMDAzOiBSZXBsYWNlIGRjYnogYnkgZGNiemwgdG8gZ2V0IHRoZSBpbnRlbmRlZCBlZmZlY3QKKyAqIChBcHBsZSAiZml4ZWQiIGRjYnopLiBVbmZvcnR1bmF0ZWx5IHRoaXMgY2Fubm90IGJlIHVzZWQgdW5sZXNzIHRoZQorICogYXNzZW1ibGVyIGtub3dzIGFib3V0IGRjYnpsIC4uLiAqLworc3RhdGljIGxvbmcgY2hlY2tfZGNiemxfZWZmZWN0KHZvaWQpCit7CisgICAgbG9uZyBjb3VudCA9IDA7CisjaWYgSEFWRV9EQ0JaTAorICAgIHJlZ2lzdGVyIGNoYXIgKmZha2VkYXRhID0gYXZfbWFsbG9jKDEwMjQpOworICAgIHJlZ2lzdGVyIGNoYXIgKmZha2VkYXRhX21pZGRsZTsKKyAgICByZWdpc3RlciBsb25nIHplcm8gPSAwLCBpID0gMDsKKworICAgIGlmICghZmFrZWRhdGEpCisgICAgICAgIHJldHVybiAwTDsKKworICAgIGZha2VkYXRhX21pZGRsZSA9IGZha2VkYXRhICsgNTEyOworCisgICAgbWVtc2V0KGZha2VkYXRhLCAweEZGLCAxMDI0KTsKKworICAgIC8qIEJlbG93IHRoZSBjb25zdHJhaW50ICJiIiBzZWVtcyB0byBtZWFuICJhZGRyZXNzIGJhc2UgcmVnaXN0ZXIiCisgICAgICogaW4gZ2NjLTMuMyAvIFJTLzYwMDAgc3BlYWtzLiBTZWVtcyB0byBhdm9pZCB1c2luZyByMCwgc28uLi4uICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoImRjYnpsICUwLCAlMSIgOjogImIiIChmYWtlZGF0YV9taWRkbGUpLCAiciIgKHplcm8pKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgICAgIGlmIChmYWtlZGF0YVtpXSA9PSAoY2hhcikgMCkKKyAgICAgICAgICAgIGNvdW50Kys7CisKKyAgICBhdl9mcmVlKGZha2VkYXRhKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIGNvdW50OworfQorCisjaWYgSEFWRV9BTFRJVkVDCitzdGF0aWMgdm9pZCBjbGVhcl9ibG9ja19hbHRpdmVjKGludDE2X3QgKmJsb2NrKQoreworICAgIExPQURfWkVSTzsKKyAgICB2ZWNfc3QoemVyb19zMTZ2LCAgIDAsIGJsb2NrKTsKKyAgICB2ZWNfc3QoemVyb19zMTZ2LCAgMTYsIGJsb2NrKTsKKyAgICB2ZWNfc3QoemVyb19zMTZ2LCAgMzIsIGJsb2NrKTsKKyAgICB2ZWNfc3QoemVyb19zMTZ2LCAgNDgsIGJsb2NrKTsKKyAgICB2ZWNfc3QoemVyb19zMTZ2LCAgNjQsIGJsb2NrKTsKKyAgICB2ZWNfc3QoemVyb19zMTZ2LCAgODAsIGJsb2NrKTsKKyAgICB2ZWNfc3QoemVyb19zMTZ2LCAgOTYsIGJsb2NrKTsKKyAgICB2ZWNfc3QoemVyb19zMTZ2LCAxMTIsIGJsb2NrKTsKK30KKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KKworYXZfY29sZCB2b2lkIGZmX2Jsb2NrZHNwX2luaXRfcHBjKEJsb2NrRFNQQ29udGV4dCAqYywgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpCit7CisgICAgLy8gY29tbW9uIG9wdGltaXphdGlvbnMgd2hldGhlciBBbHRpVmVjIGlzIGF2YWlsYWJsZSBvciBub3QKKyAgICBpZiAoIWhpZ2hfYml0X2RlcHRoKSB7CisgICAgICAgIHN3aXRjaCAoY2hlY2tfZGNiemxfZWZmZWN0KCkpIHsKKyAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgIGMtPmNsZWFyX2Jsb2NrcyA9IGNsZWFyX2Jsb2Nrc19kY2J6MzJfcHBjOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI4OgorICAgICAgICAgICAgYy0+Y2xlYXJfYmxvY2tzID0gY2xlYXJfYmxvY2tzX2RjYnoxMjhfcHBjOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworI2lmIEhBVkVfQUxUSVZFQworICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFoaWdoX2JpdF9kZXB0aCkKKyAgICAgICAgYy0+Y2xlYXJfYmxvY2sgPSBjbGVhcl9ibG9ja19hbHRpdmVjOworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2RjdC10ZXN0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvZGN0LXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzI4NTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2RjdC10ZXN0LmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJmZGN0LmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnbyBmZGN0X3RhYl9hcmNoW10gPSB7CisjaWYgSEFWRV9BTFRJVkVDCisgICAgeyAiYWx0aXZlY2ZkY3QiLCBmZl9mZGN0X2FsdGl2ZWMsIEZGX0lEQ1RfUEVSTV9OT05FLCBBVl9DUFVfRkxBR19BTFRJVkVDIH0sCisjZW5kaWYKKyAgICB7IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGlkY3RfdGFiX2FyY2hbXSA9IHsKKyAgICB7IDAgfQorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9mZGN0LmggYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvZmRjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzN2Y4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvZmRjdC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1BQQ19GRENUX0gKKyNkZWZpbmUgQVZDT0RFQ19QUENfRkRDVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordm9pZCBmZl9mZGN0X2FsdGl2ZWMoaW50MTZfdCAqYmxvY2spOworCisjZW5kaWYgLyogQVZDT0RFQ19QUENfRkRDVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcGMvZmRjdGRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2ZkY3Rkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmVmYzVkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2ZkY3Rkc3AuYwpAQCAtMCwwICsxLDQ3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgSmFtZXMgS2xpY21hbiA8amFtZXNAa2xpY21hbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBIQVZFX0FMVElWRUNfSAorI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ZkY3Rkc3AuaCIKKyNpbmNsdWRlICJmZGN0LmgiCisKKyNpZiBIQVZFX0FMVElWRUMKKworI2RlZmluZSB2czE2KHYpICAgKCh2ZWN0b3Igc2lnbmVkIHNob3J0KSAodikpCisjZGVmaW5lIHZzMzIodikgICAgICgodmVjdG9yIHNpZ25lZCBpbnQpICh2KSkKKyNkZWZpbmUgIHZ1OCh2KSAgKCh2ZWN0b3IgdW5zaWduZWQgY2hhcikgKHYpKQorI2RlZmluZSB2dTE2KHYpICgodmVjdG9yIHVuc2lnbmVkIHNob3J0KSAodikpCisjZGVmaW5lIHZ1MzIodikgICAoKHZlY3RvciB1bnNpZ25lZCBpbnQpICh2KSkKKworI2RlZmluZSBDMSAgICAgMC45ODA3ODUyNTA2NjM3NTczMjQyMTg3NTAwMCAvKiBjb3MoMSAqIFBJIC8gMTYpICovCisjZGVmaW5lIEMyICAgICAwLjkyMzg3OTUwNDIwMzc5NjM4NjcxODc1MDAwIC8qIGNvcygyICogUEkgLyAxNikgKi8KKyNkZWZpbmUgQzMgICAgIDAuODMxNDY5NTk1NDMyMjgxNDk0MTQwNjI1MDAgLyogY29zKDMgKiBQSSAvIDE2KSAqLworI2RlZmluZSBDNCAgICAgMC43MDcxMDY3NjkwODQ5MzA0MTk5MjE4NzUwMCAvKiBjb3MoNCAqIFBJIC8gMTYpICovCisjZGVmaW5lIEM1ICAgICAwLjU1NTU3MDI0NDc4OTEyMzUzNTE1NjI1MDAwIC8qIGNvcyg1ICogUEkgLyAxNikgKi8KKyNkZWZpbmUgQzYgICAgIDAuMzgyNjgzNDI2MTQxNzM4ODkxNjAxNTYyNTAgLyogY29zKDYgKiBQSSAvIDE2KSAqLworI2RlZmluZSBDNyAgICAgMC4xOTUwOTAzMjM2ODY1OTk3MzE0NDUzMTI1MCAvKiBjb3MoNyAqIFBJIC8gMTYpICovCisjZGVmaW5lIFNRUlRfMiAxLjQxNDIxMzUzODE2OTg2MDgzOTg0Mzc1MDAwIC8qIHNxcnQoMikgICAgICAgICAgKi8KKworI2RlZmluZSBXMCAtKDIgKiBDMikKKyNkZWZpbmUgVzEgICgyICogQzYpCisjZGVmaW5lIFcyIChTUVJUXzIgKiBDNikKKyNkZWZpbmUgVzMgKFNRUlRfMiAqIEMzKQorI2RlZmluZSBXNCAoU1FSVF8yICogKC1DMSArIEMzICsgQzUgLSBDNykpCisjZGVmaW5lIFc1IChTUVJUXzIgKiAgKEMxICsgQzMgLSBDNSArIEM3KSkKKyNkZWZpbmUgVzYgKFNRUlRfMiAqICAoQzEgKyBDMyArIEM1IC0gQzcpKQorI2RlZmluZSBXNyAoU1FSVF8yICogIChDMSArIEMzIC0gQzUgLSBDNykpCisjZGVmaW5lIFc4IChTUVJUXzIgKiAgKEM3IC0gQzMpKQorI2RlZmluZSBXOSAoU1FSVF8yICogKC1DMSAtIEMzKSkKKyNkZWZpbmUgV0EgKFNRUlRfMiAqICgtQzMgLSBDNSkpCisjZGVmaW5lIFdCIChTUVJUXzIgKiAgKEM1IC0gQzMpKQorCitzdGF0aWMgY29uc3QgdmVjdG9yIGZsb2F0IGZkY3Rjb25zdHNbM10gPSB7CisgICAgeyBXMCwgVzEsIFcyLCBXMyB9LAorICAgIHsgVzQsIFc1LCBXNiwgVzcgfSwKKyAgICB7IFc4LCBXOSwgV0EsIFdCIH0KK307CisKKyNkZWZpbmUgTERfVzAgdmVjX3NwbGF0KGNuc3RzMCwgMCkKKyNkZWZpbmUgTERfVzEgdmVjX3NwbGF0KGNuc3RzMCwgMSkKKyNkZWZpbmUgTERfVzIgdmVjX3NwbGF0KGNuc3RzMCwgMikKKyNkZWZpbmUgTERfVzMgdmVjX3NwbGF0KGNuc3RzMCwgMykKKyNkZWZpbmUgTERfVzQgdmVjX3NwbGF0KGNuc3RzMSwgMCkKKyNkZWZpbmUgTERfVzUgdmVjX3NwbGF0KGNuc3RzMSwgMSkKKyNkZWZpbmUgTERfVzYgdmVjX3NwbGF0KGNuc3RzMSwgMikKKyNkZWZpbmUgTERfVzcgdmVjX3NwbGF0KGNuc3RzMSwgMykKKyNkZWZpbmUgTERfVzggdmVjX3NwbGF0KGNuc3RzMiwgMCkKKyNkZWZpbmUgTERfVzkgdmVjX3NwbGF0KGNuc3RzMiwgMSkKKyNkZWZpbmUgTERfV0EgdmVjX3NwbGF0KGNuc3RzMiwgMikKKyNkZWZpbmUgTERfV0IgdmVjX3NwbGF0KGNuc3RzMiwgMykKKworI2RlZmluZSBGRENUUk9XKGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNykgLyoge3t7ICovICAgICAgICAgICBcCisgICAgeDAgPSB2ZWNfYWRkKGIwLCBiNyk7ICAgICAgICAgICAgICAgLyogeDAgPSBiMCArIGI3OyAqLyAgICAgICAgIFwKKyAgICB4NyA9IHZlY19zdWIoYjAsIGI3KTsgICAgICAgICAgICAgICAvKiB4NyA9IGIwIC0gYjc7ICovICAgICAgICAgXAorICAgIHgxID0gdmVjX2FkZChiMSwgYjYpOyAgICAgICAgICAgICAgIC8qIHgxID0gYjEgKyBiNjsgKi8gICAgICAgICBcCisgICAgeDYgPSB2ZWNfc3ViKGIxLCBiNik7ICAgICAgICAgICAgICAgLyogeDYgPSBiMSAtIGI2OyAqLyAgICAgICAgIFwKKyAgICB4MiA9IHZlY19hZGQoYjIsIGI1KTsgICAgICAgICAgICAgICAvKiB4MiA9IGIyICsgYjU7ICovICAgICAgICAgXAorICAgIHg1ID0gdmVjX3N1YihiMiwgYjUpOyAgICAgICAgICAgICAgIC8qIHg1ID0gYjIgLSBiNTsgKi8gICAgICAgICBcCisgICAgeDMgPSB2ZWNfYWRkKGIzLCBiNCk7ICAgICAgICAgICAgICAgLyogeDMgPSBiMyArIGI0OyAqLyAgICAgICAgIFwKKyAgICB4NCA9IHZlY19zdWIoYjMsIGI0KTsgICAgICAgICAgICAgICAvKiB4NCA9IGIzIC0gYjQ7ICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYjcgPSB2ZWNfYWRkKHgwLCB4Myk7ICAgICAgICAgICAgICAgLyogYjcgPSB4MCArIHgzOyAqLyAgICAgICAgIFwKKyAgICBiMSA9IHZlY19hZGQoeDEsIHgyKTsgICAgICAgICAgICAgICAvKiBiMSA9IHgxICsgeDI7ICovICAgICAgICAgXAorICAgIGIwID0gdmVjX2FkZChiNywgYjEpOyAgICAgICAgICAgICAgIC8qIGIwID0gYjcgKyBiMTsgKi8gICAgICAgICBcCisgICAgYjQgPSB2ZWNfc3ViKGI3LCBiMSk7ICAgICAgICAgICAgICAgLyogYjQgPSBiNyAtIGIxOyAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIyICAgPSB2ZWNfc3ViKHgwLCB4Myk7ICAgICAgICAgICAgIC8qIGIyID0geDAgLSB4MzsgKi8gICAgICAgICBcCisgICAgYjYgICA9IHZlY19zdWIoeDEsIHgyKTsgICAgICAgICAgICAgLyogYjYgPSB4MSAtIHgyOyAqLyAgICAgICAgIFwKKyAgICBiNSAgID0gdmVjX2FkZChiNiwgYjIpOyAgICAgICAgICAgICAvKiBiNSA9IGI2ICsgYjI7ICovICAgICAgICAgXAorICAgIGNuc3QgPSBMRF9XMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYjUgICA9IHZlY19tYWRkKGNuc3QsIGI1LCBtemVybyk7ICAgLyogYjUgPSBiNSAqIFcyOyAqLyAgICAgICAgIFwKKyAgICBjbnN0ID0gTERfVzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIyICAgPSB2ZWNfbWFkZChjbnN0LCBiMiwgYjUpOyAgICAgIC8qIGIyID0gYjUgKyBiMiAqIFcxOyAqLyAgICBcCisgICAgY25zdCA9IExEX1cwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiNiAgID0gdmVjX21hZGQoY25zdCwgYjYsIGI1KTsgICAgICAvKiBiNiA9IGI1ICsgYjYgKiBXMDsgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeDAgICA9IHZlY19hZGQoeDQsIHg3KTsgICAgICAgICAgICAgLyogeDAgPSB4NCArIHg3OyAqLyAgICAgICAgIFwKKyAgICB4MSAgID0gdmVjX2FkZCh4NSwgeDYpOyAgICAgICAgICAgICAvKiB4MSA9IHg1ICsgeDY7ICovICAgICAgICAgXAorICAgIHgyICAgPSB2ZWNfYWRkKHg0LCB4Nik7ICAgICAgICAgICAgIC8qIHgyID0geDQgKyB4NjsgKi8gICAgICAgICBcCisgICAgeDMgICA9IHZlY19hZGQoeDUsIHg3KTsgICAgICAgICAgICAgLyogeDMgPSB4NSArIHg3OyAqLyAgICAgICAgIFwKKyAgICB4OCAgID0gdmVjX2FkZCh4MiwgeDMpOyAgICAgICAgICAgICAvKiB4OCA9IHgyICsgeDM7ICovICAgICAgICAgXAorICAgIGNuc3QgPSBMRF9XMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeDggICA9IHZlY19tYWRkKGNuc3QsIHg4LCBtemVybyk7ICAgLyogeDggPSB4OCAqIFczOyAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNuc3QgPSBMRF9XODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeDAgICA9IHZlY19tYWRkKGNuc3QsIHgwLCBtemVybyk7ICAgLyogeDAgKj0gVzg7ICovICAgICAgICAgICAgIFwKKyAgICBjbnN0ID0gTERfVzk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHgxICAgPSB2ZWNfbWFkZChjbnN0LCB4MSwgbXplcm8pOyAgIC8qIHgxICo9IFc5OyAqLyAgICAgICAgICAgICBcCisgICAgY25zdCA9IExEX1dBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB4MiAgID0gdmVjX21hZGQoY25zdCwgeDIsIHg4KTsgICAgICAvKiB4MiA9IHgyICogV0EgKyB4ODsgKi8gICAgXAorICAgIGNuc3QgPSBMRF9XQjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeDMgICA9IHZlY19tYWRkKGNuc3QsIHgzLCB4OCk7ICAgICAgLyogeDMgPSB4MyAqIFdCICsgeDg7ICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNuc3QgPSBMRF9XNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYjcgICA9IHZlY19tYWRkKGNuc3QsIHg0LCB4MCk7ICAgICAgLyogYjcgPSB4NCAqIFc0ICsgeDA7ICovICAgIFwKKyAgICBjbnN0ID0gTERfVzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGI1ICAgPSB2ZWNfbWFkZChjbnN0LCB4NSwgeDEpOyAgICAgIC8qIGI1ID0geDUgKiBXNSArIHgxOyAqLyAgICBcCisgICAgY25zdCA9IExEX1c2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiMyAgID0gdmVjX21hZGQoY25zdCwgeDYsIHgxKTsgICAgICAvKiBiMyA9IHg2ICogVzYgKyB4MTsgKi8gICAgXAorICAgIGNuc3QgPSBMRF9XNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYjEgICA9IHZlY19tYWRkKGNuc3QsIHg3LCB4MCk7ICAgICAgLyogYjEgPSB4NyAqIFc3ICsgeDA7ICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGI3ID0gdmVjX2FkZChiNywgeDIpOyAgICAgICAgICAgICAgIC8qIGI3ID0gYjcgKyB4MjsgKi8gICAgICAgICBcCisgICAgYjUgPSB2ZWNfYWRkKGI1LCB4Myk7ICAgICAgICAgICAgICAgLyogYjUgPSBiNSArIHgzOyAqLyAgICAgICAgIFwKKyAgICBiMyA9IHZlY19hZGQoYjMsIHgyKTsgICAgICAgICAgICAgICAvKiBiMyA9IGIzICsgeDI7ICovICAgICAgICAgXAorICAgIGIxID0gdmVjX2FkZChiMSwgeDMpICAgICAgICAgICAgICAgIC8qIGIxID0gYjEgKyB4MzsgKi8gICAgICAgICBcCisgICAgLyogfX19ICovCisKKyNkZWZpbmUgRkRDVENPTChiMCwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcpIC8qIHt7eyAqLyAgICAgICAgICAgXAorICAgIHgwID0gdmVjX2FkZChiMCwgYjcpOyAgICAgICAgICAgICAgIC8qIHgwID0gYjAgKyBiNzsgKi8gICAgICAgICBcCisgICAgeDcgPSB2ZWNfc3ViKGIwLCBiNyk7ICAgICAgICAgICAgICAgLyogeDcgPSBiMCAtIGI3OyAqLyAgICAgICAgIFwKKyAgICB4MSA9IHZlY19hZGQoYjEsIGI2KTsgICAgICAgICAgICAgICAvKiB4MSA9IGIxICsgYjY7ICovICAgICAgICAgXAorICAgIHg2ID0gdmVjX3N1YihiMSwgYjYpOyAgICAgICAgICAgICAgIC8qIHg2ID0gYjEgLSBiNjsgKi8gICAgICAgICBcCisgICAgeDIgPSB2ZWNfYWRkKGIyLCBiNSk7ICAgICAgICAgICAgICAgLyogeDIgPSBiMiArIGI1OyAqLyAgICAgICAgIFwKKyAgICB4NSA9IHZlY19zdWIoYjIsIGI1KTsgICAgICAgICAgICAgICAvKiB4NSA9IGIyIC0gYjU7ICovICAgICAgICAgXAorICAgIHgzID0gdmVjX2FkZChiMywgYjQpOyAgICAgICAgICAgICAgIC8qIHgzID0gYjMgKyBiNDsgKi8gICAgICAgICBcCisgICAgeDQgPSB2ZWNfc3ViKGIzLCBiNCk7ICAgICAgICAgICAgICAgLyogeDQgPSBiMyAtIGI0OyAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGI3ID0gdmVjX2FkZCh4MCwgeDMpOyAgICAgICAgICAgICAgIC8qIGI3ID0geDAgKyB4MzsgKi8gICAgICAgICBcCisgICAgYjEgPSB2ZWNfYWRkKHgxLCB4Mik7ICAgICAgICAgICAgICAgLyogYjEgPSB4MSArIHgyOyAqLyAgICAgICAgIFwKKyAgICBiMCA9IHZlY19hZGQoYjcsIGIxKTsgICAgICAgICAgICAgICAvKiBiMCA9IGI3ICsgYjE7ICovICAgICAgICAgXAorICAgIGI0ID0gdmVjX3N1YihiNywgYjEpOyAgICAgICAgICAgICAgIC8qIGI0ID0gYjcgLSBiMTsgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiMiAgID0gdmVjX3N1Yih4MCwgeDMpOyAgICAgICAgICAgICAvKiBiMiA9IHgwIC0geDM7ICovICAgICAgICAgXAorICAgIGI2ICAgPSB2ZWNfc3ViKHgxLCB4Mik7ICAgICAgICAgICAgIC8qIGI2ID0geDEgLSB4MjsgKi8gICAgICAgICBcCisgICAgYjUgICA9IHZlY19hZGQoYjYsIGIyKTsgICAgICAgICAgICAgLyogYjUgPSBiNiArIGIyOyAqLyAgICAgICAgIFwKKyAgICBjbnN0ID0gTERfVzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGI1ICAgPSB2ZWNfbWFkZChjbnN0LCBiNSwgbXplcm8pOyAgIC8qIGI1ID0gYjUgKiBXMjsgKi8gICAgICAgICBcCisgICAgY25zdCA9IExEX1cxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiMiAgID0gdmVjX21hZGQoY25zdCwgYjIsIGI1KTsgICAgICAvKiBiMiA9IGI1ICsgYjIgKiBXMTsgKi8gICAgXAorICAgIGNuc3QgPSBMRF9XMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYjYgICA9IHZlY19tYWRkKGNuc3QsIGI2LCBiNSk7ICAgICAgLyogYjYgPSBiNSArIGI2ICogVzA7ICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHgwICAgPSB2ZWNfYWRkKHg0LCB4Nyk7ICAgICAgICAgICAgIC8qIHgwID0geDQgKyB4NzsgKi8gICAgICAgICBcCisgICAgeDEgICA9IHZlY19hZGQoeDUsIHg2KTsgICAgICAgICAgICAgLyogeDEgPSB4NSArIHg2OyAqLyAgICAgICAgIFwKKyAgICB4MiAgID0gdmVjX2FkZCh4NCwgeDYpOyAgICAgICAgICAgICAvKiB4MiA9IHg0ICsgeDY7ICovICAgICAgICAgXAorICAgIHgzICAgPSB2ZWNfYWRkKHg1LCB4Nyk7ICAgICAgICAgICAgIC8qIHgzID0geDUgKyB4NzsgKi8gICAgICAgICBcCisgICAgeDggICA9IHZlY19hZGQoeDIsIHgzKTsgICAgICAgICAgICAgLyogeDggPSB4MiArIHgzOyAqLyAgICAgICAgIFwKKyAgICBjbnN0ID0gTERfVzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHg4ICAgPSB2ZWNfbWFkZChjbnN0LCB4OCwgbXplcm8pOyAgIC8qIHg4ID0geDggKiBXMzsgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbnN0ID0gTERfVzg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHgwICAgPSB2ZWNfbWFkZChjbnN0LCB4MCwgbXplcm8pOyAgIC8qIHgwICo9IFc4OyAqLyAgICAgICAgICAgICBcCisgICAgY25zdCA9IExEX1c5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB4MSAgID0gdmVjX21hZGQoY25zdCwgeDEsIG16ZXJvKTsgICAvKiB4MSAqPSBXOTsgKi8gICAgICAgICAgICAgXAorICAgIGNuc3QgPSBMRF9XQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeDIgICA9IHZlY19tYWRkKGNuc3QsIHgyLCB4OCk7ICAgICAgLyogeDIgPSB4MiAqIFdBICsgeDg7ICovICAgIFwKKyAgICBjbnN0ID0gTERfV0I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHgzICAgPSB2ZWNfbWFkZChjbnN0LCB4MywgeDgpOyAgICAgIC8qIHgzID0geDMgKiBXQiArIHg4OyAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbnN0ID0gTERfVzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGI3ICAgPSB2ZWNfbWFkZChjbnN0LCB4NCwgeDApOyAgICAgIC8qIGI3ID0geDQgKiBXNCArIHgwOyAqLyAgICBcCisgICAgY25zdCA9IExEX1c1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiNSAgID0gdmVjX21hZGQoY25zdCwgeDUsIHgxKTsgICAgICAvKiBiNSA9IHg1ICogVzUgKyB4MTsgKi8gICAgXAorICAgIGNuc3QgPSBMRF9XNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYjMgICA9IHZlY19tYWRkKGNuc3QsIHg2LCB4MSk7ICAgICAgLyogYjMgPSB4NiAqIFc2ICsgeDE7ICovICAgIFwKKyAgICBjbnN0ID0gTERfVzc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIxICAgPSB2ZWNfbWFkZChjbnN0LCB4NywgeDApOyAgICAgIC8qIGIxID0geDcgKiBXNyArIHgwOyAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiNyA9IHZlY19hZGQoYjcsIHgyKTsgICAgICAgICAgICAgICAvKiBiNyArPSB4MjsgKi8gICAgICAgICAgICAgXAorICAgIGI1ID0gdmVjX2FkZChiNSwgeDMpOyAgICAgICAgICAgICAgIC8qIGI1ICs9IHgzOyAqLyAgICAgICAgICAgICBcCisgICAgYjMgPSB2ZWNfYWRkKGIzLCB4Mik7ICAgICAgICAgICAgICAgLyogYjMgKz0geDI7ICovICAgICAgICAgICAgIFwKKyAgICBiMSA9IHZlY19hZGQoYjEsIHgzKSAgICAgICAgICAgICAgICAvKiBiMSArPSB4MzsgKi8gICAgICAgICAgICAgXAorICAgIC8qIH19fSAqLworCisvKiB0d28gZGltZW5zaW9uYWwgZGlzY3JldGUgY29zaW5lIHRyYW5zZm9ybSAqLwordm9pZCBmZl9mZGN0X2FsdGl2ZWMoaW50MTZfdCAqYmxvY2spCit7CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCAqYnA7CisgICAgdmVjdG9yIGZsb2F0ICpjcCA9IGZkY3Rjb25zdHM7CisgICAgdmVjdG9yIGZsb2F0IGIwMCwgYjEwLCBiMjAsIGIzMCwgYjQwLCBiNTAsIGI2MCwgYjcwOworICAgIHZlY3RvciBmbG9hdCBiMDEsIGIxMSwgYjIxLCBiMzEsIGI0MSwgYjUxLCBiNjEsIGI3MTsKKyAgICB2ZWN0b3IgZmxvYXQgbXplcm8sIGNuc3QsIGNuc3RzMCwgY25zdHMxLCBjbnN0czI7CisgICAgdmVjdG9yIGZsb2F0IHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisKKyAgICAvKiBzZXR1cCBjb25zdGFudHMge3t7ICovCisgICAgLyogbXplcm8gPSAtMC4wICovCisgICAgbXplcm8gID0gKCh2ZWN0b3IgZmxvYXQpIHZlY19zcGxhdF91MzIoLTEpKTsKKyAgICBtemVybyAgPSAoKHZlY3RvciBmbG9hdCkgdmVjX3NsKHZ1MzIobXplcm8pLCB2dTMyKG16ZXJvKSkpOworICAgIGNuc3RzMCA9IHZlY19sZCgwLCBjcCk7CisgICAgY3ArKzsKKyAgICBjbnN0czEgPSB2ZWNfbGQoMCwgY3ApOworICAgIGNwKys7CisgICAgY25zdHMyID0gdmVjX2xkKDAsIGNwKTsKKyAgICAvKiB9fX0gKi8KKworICAgIC8qIDh4OCBtYXRyaXggdHJhbnNwb3NlICh2ZWN0b3Igc2hvcnRbOF0pIHt7eyAqLworI2RlZmluZSBNRVJHRV9TMTYoaGwsIGEsIGIpIHZlY19tZXJnZSAjIyBobCh2czE2KGEpLCB2czE2KGIpKQorCisgICAgYnAgID0gKHZlY3RvciBzaWduZWQgc2hvcnQgKikgYmxvY2s7CisgICAgYjAwID0gKCh2ZWN0b3IgZmxvYXQpIHZlY19sZCgwLCAgICAgIGJwKSk7CisgICAgYjQwID0gKCh2ZWN0b3IgZmxvYXQpIHZlY19sZCgxNiAqIDQsIGJwKSk7CisgICAgYjAxID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihoLCBiMDAsIGI0MCkpOworICAgIGIxMSA9ICgodmVjdG9yIGZsb2F0KSBNRVJHRV9TMTYobCwgYjAwLCBiNDApKTsKKyAgICBicCsrOworICAgIGIxMCA9ICgodmVjdG9yIGZsb2F0KSB2ZWNfbGQoMCwgICAgICBicCkpOworICAgIGI1MCA9ICgodmVjdG9yIGZsb2F0KSB2ZWNfbGQoMTYgKiA0LCBicCkpOworICAgIGIyMSA9ICgodmVjdG9yIGZsb2F0KSBNRVJHRV9TMTYoaCwgYjEwLCBiNTApKTsKKyAgICBiMzEgPSAoKHZlY3RvciBmbG9hdCkgTUVSR0VfUzE2KGwsIGIxMCwgYjUwKSk7CisgICAgYnArKzsKKyAgICBiMjAgPSAoKHZlY3RvciBmbG9hdCkgdmVjX2xkKDAsICAgICAgYnApKTsKKyAgICBiNjAgPSAoKHZlY3RvciBmbG9hdCkgdmVjX2xkKDE2ICogNCwgYnApKTsKKyAgICBiNDEgPSAoKHZlY3RvciBmbG9hdCkgTUVSR0VfUzE2KGgsIGIyMCwgYjYwKSk7CisgICAgYjUxID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihsLCBiMjAsIGI2MCkpOworICAgIGJwKys7CisgICAgYjMwID0gKCh2ZWN0b3IgZmxvYXQpIHZlY19sZCgwLCAgICAgIGJwKSk7CisgICAgYjcwID0gKCh2ZWN0b3IgZmxvYXQpIHZlY19sZCgxNiAqIDQsIGJwKSk7CisgICAgYjYxID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihoLCBiMzAsIGI3MCkpOworICAgIGI3MSA9ICgodmVjdG9yIGZsb2F0KSBNRVJHRV9TMTYobCwgYjMwLCBiNzApKTsKKworICAgIHgwID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihoLCBiMDEsIGI0MSkpOworICAgIHgxID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihsLCBiMDEsIGI0MSkpOworICAgIHgyID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihoLCBiMTEsIGI1MSkpOworICAgIHgzID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihsLCBiMTEsIGI1MSkpOworICAgIHg0ID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihoLCBiMjEsIGI2MSkpOworICAgIHg1ID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihsLCBiMjEsIGI2MSkpOworICAgIHg2ID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihoLCBiMzEsIGI3MSkpOworICAgIHg3ID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihsLCBiMzEsIGI3MSkpOworCisgICAgYjAwID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihoLCB4MCwgeDQpKTsKKyAgICBiMTAgPSAoKHZlY3RvciBmbG9hdCkgTUVSR0VfUzE2KGwsIHgwLCB4NCkpOworICAgIGIyMCA9ICgodmVjdG9yIGZsb2F0KSBNRVJHRV9TMTYoaCwgeDEsIHg1KSk7CisgICAgYjMwID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihsLCB4MSwgeDUpKTsKKyAgICBiNDAgPSAoKHZlY3RvciBmbG9hdCkgTUVSR0VfUzE2KGgsIHgyLCB4NikpOworICAgIGI1MCA9ICgodmVjdG9yIGZsb2F0KSBNRVJHRV9TMTYobCwgeDIsIHg2KSk7CisgICAgYjYwID0gKCh2ZWN0b3IgZmxvYXQpIE1FUkdFX1MxNihoLCB4MywgeDcpKTsKKyAgICBiNzAgPSAoKHZlY3RvciBmbG9hdCkgTUVSR0VfUzE2KGwsIHgzLCB4NykpOworCisjdW5kZWYgTUVSR0VfUzE2CisgICAgLyogfX19ICovCisKKyAgICAvKiBTb21lIG9mIHRoZSBpbml0aWFsIGNhbGN1bGF0aW9ucyBjYW4gYmUgZG9uZSBhcyB2ZWN0b3Igc2hvcnQKKyAgICAgKiBiZWZvcmUgY29udmVyc2lvbiB0byB2ZWN0b3IgZmxvYXQuICBUaGUgZm9sbG93aW5nIGNvZGUgc2VjdGlvbgorICAgICAqIHRha2VzIGFkdmFudGFnZSBvZiB0aGlzLiAqLworCisgICAgLyogZmRjdCByb3dzIHt7eyAqLworICAgIHgwID0gKCh2ZWN0b3IgZmxvYXQpIHZlY19hZGQodnMxNihiMDApLCB2czE2KGI3MCkpKTsKKyAgICB4NyA9ICgodmVjdG9yIGZsb2F0KSB2ZWNfc3ViKHZzMTYoYjAwKSwgdnMxNihiNzApKSk7CisgICAgeDEgPSAoKHZlY3RvciBmbG9hdCkgdmVjX2FkZCh2czE2KGIxMCksIHZzMTYoYjYwKSkpOworICAgIHg2ID0gKCh2ZWN0b3IgZmxvYXQpIHZlY19zdWIodnMxNihiMTApLCB2czE2KGI2MCkpKTsKKyAgICB4MiA9ICgodmVjdG9yIGZsb2F0KSB2ZWNfYWRkKHZzMTYoYjIwKSwgdnMxNihiNTApKSk7CisgICAgeDUgPSAoKHZlY3RvciBmbG9hdCkgdmVjX3N1Yih2czE2KGIyMCksIHZzMTYoYjUwKSkpOworICAgIHgzID0gKCh2ZWN0b3IgZmxvYXQpIHZlY19hZGQodnMxNihiMzApLCB2czE2KGI0MCkpKTsKKyAgICB4NCA9ICgodmVjdG9yIGZsb2F0KSB2ZWNfc3ViKHZzMTYoYjMwKSwgdnMxNihiNDApKSk7CisKKyAgICBiNzAgPSAoKHZlY3RvciBmbG9hdCkgdmVjX2FkZCh2czE2KHgwKSwgdnMxNih4MykpKTsKKyAgICBiMTAgPSAoKHZlY3RvciBmbG9hdCkgdmVjX2FkZCh2czE2KHgxKSwgdnMxNih4MikpKTsKKworICAgIGIwMCA9ICgodmVjdG9yIGZsb2F0KSB2ZWNfYWRkKHZzMTYoYjcwKSwgdnMxNihiMTApKSk7CisgICAgYjQwID0gKCh2ZWN0b3IgZmxvYXQpIHZlY19zdWIodnMxNihiNzApLCB2czE2KGIxMCkpKTsKKworI2RlZmluZSBDVEYwKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiICMjIG4gIyMgMSA9ICgodmVjdG9yIGZsb2F0KSB2ZWNfdW5wYWNrbCh2czE2KGIgIyMgbiAjIyAwKSkpOyBcCisgICAgYiAjIyBuICMjIDAgPSAoKHZlY3RvciBmbG9hdCkgdmVjX3VucGFja2godnMxNihiICMjIG4gIyMgMCkpKTsgXAorICAgIGIgIyMgbiAjIyAxID0gdmVjX2N0Zih2czMyKGIgIyMgbiAjIyAxKSwgMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBiICMjIG4gIyMgMCA9IHZlY19jdGYodnMzMihiICMjIG4gIyMgMCksIDApCisKKyAgICBDVEYwKDApOworICAgIENURjAoNCk7CisKKyAgICBiMjAgPSAoKHZlY3RvciBmbG9hdCkgdmVjX3N1Yih2czE2KHgwKSwgdnMxNih4MykpKTsKKyAgICBiNjAgPSAoKHZlY3RvciBmbG9hdCkgdmVjX3N1Yih2czE2KHgxKSwgdnMxNih4MikpKTsKKworICAgIENURjAoMik7CisgICAgQ1RGMCg2KTsKKworI3VuZGVmIENURjAKKworICAgIHgwID0gdmVjX2FkZChiNjAsIGIyMCk7CisgICAgeDEgPSB2ZWNfYWRkKGI2MSwgYjIxKTsKKworICAgIGNuc3QgPSBMRF9XMjsKKyAgICB4MCAgID0gdmVjX21hZGQoY25zdCwgeDAsIG16ZXJvKTsKKyAgICB4MSAgID0gdmVjX21hZGQoY25zdCwgeDEsIG16ZXJvKTsKKyAgICBjbnN0ID0gTERfVzE7CisgICAgYjIwICA9IHZlY19tYWRkKGNuc3QsIGIyMCwgeDApOworICAgIGIyMSAgPSB2ZWNfbWFkZChjbnN0LCBiMjEsIHgxKTsKKyAgICBjbnN0ID0gTERfVzA7CisgICAgYjYwICA9IHZlY19tYWRkKGNuc3QsIGI2MCwgeDApOworICAgIGI2MSAgPSB2ZWNfbWFkZChjbnN0LCBiNjEsIHgxKTsKKworI2RlZmluZSBDVEZYKHgsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiICMjIDAgPSAoKHZlY3RvciBmbG9hdCkgdmVjX3VucGFja2godnMxNih4KSkpOyBcCisgICAgYiAjIyAxID0gKCh2ZWN0b3IgZmxvYXQpIHZlY191bnBhY2tsKHZzMTYoeCkpKTsgXAorICAgIGIgIyMgMCA9IHZlY19jdGYodnMzMihiICMjIDApLCAwKTsgICAgICAgICAgICAgIFwKKyAgICBiICMjIDEgPSB2ZWNfY3RmKHZzMzIoYiAjIyAxKSwgMCkKKworICAgIENURlgoeDQsIGI3KTsKKyAgICBDVEZYKHg1LCBiNSk7CisgICAgQ1RGWCh4NiwgYjMpOworICAgIENURlgoeDcsIGIxKTsKKworI3VuZGVmIENURlgKKworICAgIHgwICAgPSB2ZWNfYWRkKGI3MCwgYjEwKTsKKyAgICB4MSAgID0gdmVjX2FkZChiNTAsIGIzMCk7CisgICAgeDIgICA9IHZlY19hZGQoYjcwLCBiMzApOworICAgIHgzICAgPSB2ZWNfYWRkKGI1MCwgYjEwKTsKKyAgICB4OCAgID0gdmVjX2FkZCh4MiwgeDMpOworICAgIGNuc3QgPSBMRF9XMzsKKyAgICB4OCAgID0gdmVjX21hZGQoY25zdCwgeDgsIG16ZXJvKTsKKworICAgIGNuc3QgPSBMRF9XODsKKyAgICB4MCAgID0gdmVjX21hZGQoY25zdCwgeDAsIG16ZXJvKTsKKyAgICBjbnN0ID0gTERfVzk7CisgICAgeDEgICA9IHZlY19tYWRkKGNuc3QsIHgxLCBtemVybyk7CisgICAgY25zdCA9IExEX1dBOworICAgIHgyICAgPSB2ZWNfbWFkZChjbnN0LCB4MiwgeDgpOworICAgIGNuc3QgPSBMRF9XQjsKKyAgICB4MyAgID0gdmVjX21hZGQoY25zdCwgeDMsIHg4KTsKKworICAgIGNuc3QgPSBMRF9XNDsKKyAgICBiNzAgID0gdmVjX21hZGQoY25zdCwgYjcwLCB4MCk7CisgICAgY25zdCA9IExEX1c1OworICAgIGI1MCAgPSB2ZWNfbWFkZChjbnN0LCBiNTAsIHgxKTsKKyAgICBjbnN0ID0gTERfVzY7CisgICAgYjMwICA9IHZlY19tYWRkKGNuc3QsIGIzMCwgeDEpOworICAgIGNuc3QgPSBMRF9XNzsKKyAgICBiMTAgID0gdmVjX21hZGQoY25zdCwgYjEwLCB4MCk7CisKKyAgICBiNzAgPSB2ZWNfYWRkKGI3MCwgeDIpOworICAgIGI1MCA9IHZlY19hZGQoYjUwLCB4Myk7CisgICAgYjMwID0gdmVjX2FkZChiMzAsIHgyKTsKKyAgICBiMTAgPSB2ZWNfYWRkKGIxMCwgeDMpOworCisgICAgeDAgICA9IHZlY19hZGQoYjcxLCBiMTEpOworICAgIHgxICAgPSB2ZWNfYWRkKGI1MSwgYjMxKTsKKyAgICB4MiAgID0gdmVjX2FkZChiNzEsIGIzMSk7CisgICAgeDMgICA9IHZlY19hZGQoYjUxLCBiMTEpOworICAgIHg4ICAgPSB2ZWNfYWRkKHgyLCB4Myk7CisgICAgY25zdCA9IExEX1czOworICAgIHg4ICAgPSB2ZWNfbWFkZChjbnN0LCB4OCwgbXplcm8pOworCisgICAgY25zdCA9IExEX1c4OworICAgIHgwICAgPSB2ZWNfbWFkZChjbnN0LCB4MCwgbXplcm8pOworICAgIGNuc3QgPSBMRF9XOTsKKyAgICB4MSAgID0gdmVjX21hZGQoY25zdCwgeDEsIG16ZXJvKTsKKyAgICBjbnN0ID0gTERfV0E7CisgICAgeDIgICA9IHZlY19tYWRkKGNuc3QsIHgyLCB4OCk7CisgICAgY25zdCA9IExEX1dCOworICAgIHgzICAgPSB2ZWNfbWFkZChjbnN0LCB4MywgeDgpOworCisgICAgY25zdCA9IExEX1c0OworICAgIGI3MSAgPSB2ZWNfbWFkZChjbnN0LCBiNzEsIHgwKTsKKyAgICBjbnN0ID0gTERfVzU7CisgICAgYjUxICA9IHZlY19tYWRkKGNuc3QsIGI1MSwgeDEpOworICAgIGNuc3QgPSBMRF9XNjsKKyAgICBiMzEgID0gdmVjX21hZGQoY25zdCwgYjMxLCB4MSk7CisgICAgY25zdCA9IExEX1c3OworICAgIGIxMSAgPSB2ZWNfbWFkZChjbnN0LCBiMTEsIHgwKTsKKworICAgIGI3MSA9IHZlY19hZGQoYjcxLCB4Mik7CisgICAgYjUxID0gdmVjX2FkZChiNTEsIHgzKTsKKyAgICBiMzEgPSB2ZWNfYWRkKGIzMSwgeDIpOworICAgIGIxMSA9IHZlY19hZGQoYjExLCB4Myk7CisgICAgLyogfX19ICovCisKKyAgICAvKiA4eDggbWF0cml4IHRyYW5zcG9zZSAodmVjdG9yIGZsb2F0WzhdWzJdKSB7e3sgKi8KKyAgICB4MCA9IHZlY19tZXJnZWwoYjAwLCBiMjApOworICAgIHgxID0gdmVjX21lcmdlaChiMDAsIGIyMCk7CisgICAgeDIgPSB2ZWNfbWVyZ2VsKGIxMCwgYjMwKTsKKyAgICB4MyA9IHZlY19tZXJnZWgoYjEwLCBiMzApOworCisgICAgYjAwID0gdmVjX21lcmdlaCh4MSwgeDMpOworICAgIGIxMCA9IHZlY19tZXJnZWwoeDEsIHgzKTsKKyAgICBiMjAgPSB2ZWNfbWVyZ2VoKHgwLCB4Mik7CisgICAgYjMwID0gdmVjX21lcmdlbCh4MCwgeDIpOworCisgICAgeDQgPSB2ZWNfbWVyZ2VsKGI0MSwgYjYxKTsKKyAgICB4NSA9IHZlY19tZXJnZWgoYjQxLCBiNjEpOworICAgIHg2ID0gdmVjX21lcmdlbChiNTEsIGI3MSk7CisgICAgeDcgPSB2ZWNfbWVyZ2VoKGI1MSwgYjcxKTsKKworICAgIGI0MSA9IHZlY19tZXJnZWgoeDUsIHg3KTsKKyAgICBiNTEgPSB2ZWNfbWVyZ2VsKHg1LCB4Nyk7CisgICAgYjYxID0gdmVjX21lcmdlaCh4NCwgeDYpOworICAgIGI3MSA9IHZlY19tZXJnZWwoeDQsIHg2KTsKKworICAgIHgwID0gdmVjX21lcmdlbChiMDEsIGIyMSk7CisgICAgeDEgPSB2ZWNfbWVyZ2VoKGIwMSwgYjIxKTsKKyAgICB4MiA9IHZlY19tZXJnZWwoYjExLCBiMzEpOworICAgIHgzID0gdmVjX21lcmdlaChiMTEsIGIzMSk7CisKKyAgICB4NCA9IHZlY19tZXJnZWwoYjQwLCBiNjApOworICAgIHg1ID0gdmVjX21lcmdlaChiNDAsIGI2MCk7CisgICAgeDYgPSB2ZWNfbWVyZ2VsKGI1MCwgYjcwKTsKKyAgICB4NyA9IHZlY19tZXJnZWgoYjUwLCBiNzApOworCisgICAgYjQwID0gdmVjX21lcmdlaCh4MSwgeDMpOworICAgIGI1MCA9IHZlY19tZXJnZWwoeDEsIHgzKTsKKyAgICBiNjAgPSB2ZWNfbWVyZ2VoKHgwLCB4Mik7CisgICAgYjcwID0gdmVjX21lcmdlbCh4MCwgeDIpOworCisgICAgYjAxID0gdmVjX21lcmdlaCh4NSwgeDcpOworICAgIGIxMSA9IHZlY19tZXJnZWwoeDUsIHg3KTsKKyAgICBiMjEgPSB2ZWNfbWVyZ2VoKHg0LCB4Nik7CisgICAgYjMxID0gdmVjX21lcmdlbCh4NCwgeDYpOworICAgIC8qIH19fSAqLworCisgICAgRkRDVENPTChiMDAsIGIxMCwgYjIwLCBiMzAsIGI0MCwgYjUwLCBiNjAsIGI3MCk7CisgICAgRkRDVENPTChiMDEsIGIxMSwgYjIxLCBiMzEsIGI0MSwgYjUxLCBiNjEsIGI3MSk7CisKKyAgICAvKiByb3VuZCwgY29udmVydCBiYWNrIHRvIHNob3J0IHt7eyAqLworI2RlZmluZSBDVFMobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiICMjIG4gIyMgMCA9IHZlY19yb3VuZChiICMjIG4gIyMgMCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYiAjIyBuICMjIDEgPSB2ZWNfcm91bmQoYiAjIyBuICMjIDEpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIgIyMgbiAjIyAwID0gKCh2ZWN0b3IgZmxvYXQpIHZlY19jdHMoYiAjIyBuICMjIDAsIDApKTsgICAgIFwKKyAgICBiICMjIG4gIyMgMSA9ICgodmVjdG9yIGZsb2F0KSB2ZWNfY3RzKGIgIyMgbiAjIyAxLCAwKSk7ICAgICBcCisgICAgYiAjIyBuICMjIDAgPSAoKHZlY3RvciBmbG9hdCkgdmVjX3BhY2sodnMzMihiICMjIG4gIyMgMCksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzMzIoYiAjIyBuICMjIDEpKSk7IFwKKyAgICB2ZWNfc3QodnMxNihiICMjIG4gIyMgMCksIDAsIGJwKQorCisgICAgYnAgPSAodmVjdG9yIHNpZ25lZCBzaG9ydCAqKSBibG9jazsKKyAgICBDVFMoMCk7CisgICAgYnArKzsKKyAgICBDVFMoMSk7CisgICAgYnArKzsKKyAgICBDVFMoMik7CisgICAgYnArKzsKKyAgICBDVFMoMyk7CisgICAgYnArKzsKKyAgICBDVFMoNCk7CisgICAgYnArKzsKKyAgICBDVFMoNSk7CisgICAgYnArKzsKKyAgICBDVFMoNik7CisgICAgYnArKzsKKyAgICBDVFMoNyk7CisKKyN1bmRlZiBDVFMKKyAgICAvKiB9fX0gKi8KK30KKworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworCithdl9jb2xkIHZvaWQgZmZfZmRjdGRzcF9pbml0X3BwYyhGRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpCit7CisjaWYgSEFWRV9BTFRJVkVDCisgICAgaWYgKCFQUENfQUxUSVZFQyhhdl9nZXRfY3B1X2ZsYWdzKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWhpZ2hfYml0X2RlcHRoKSB7CisgICAgICAgIGlmIChhdmN0eC0+ZGN0X2FsZ28gPT0gRkZfRENUX0FVVE8gfHwKKyAgICAgICAgICAgIGF2Y3R4LT5kY3RfYWxnbyA9PSBGRl9EQ1RfQUxUSVZFQykgeworICAgICAgICAgICAgYy0+ZmRjdCA9IGZmX2ZkY3RfYWx0aXZlYzsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9mZnRfYWx0aXZlYy5TIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2ZmdF9hbHRpdmVjLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiNjY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9mZnRfYWx0aXZlYy5TCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICogRkZUIHRyYW5zZm9ybSB3aXRoIEFsdGl2ZWMgb3B0aW1pemF0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDA5IExvcmVuIE1lcnJpdHQKKyAqCisgKiBUaGlzIGFsZ29yaXRobSAodGhvdWdoIG5vdCBhbnkgb2YgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMpIGlzCisgKiBiYXNlZCBvbiBsaWJkamJmZnQgYnkgRC4gSi4gQmVybnN0ZWluLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgaW5kaXZpZHVhbGx5IGludGVyY2hhbmdlYWJsZSB3aXRoIHRoZSBDIHZlcnNpb25zLgorICogV2hpbGUgQyB0YWtlcyBhcnJheXMgb2YgRkZUQ29tcGxleCwgQWx0aXZlYyBsZWF2ZXMgaW50ZXJtZWRpYXRlIHJlc3VsdHMKKyAqIGluIGJsb2NrcyBhcyBjb252ZW5pZW50IHRvIHRoZSB2ZWN0b3Igc2l6ZS4KKyAqIGkuZS4gezR4IHJlYWwsIDR4IGltYWdpbmFyeSwgNHggcmVhbCwgLi4ufQorICoKKyAqIEkgaWdub3JlIHN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbi4KKyAqIEluc3RlYWQsIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzIGFyZSB0cmVhdGVkIGFzIGdsb2JhbCBjb25zdGFudHM6CisgKiB2MTQ6IHplcm8KKyAqIHYxNS4udjE4OiBjb3NpbmVzCisgKiB2MTkuLnYyOTogcGVybXV0YXRpb25zCisgKiByOTogMTYKKyAqIHIxMjogZmZfY29zX3RhYnMKKyAqIGFuZCB0aGUgcmVzdCBhcmUgZnJlZSBmb3IgbG9jYWwgdXNlLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEhBVkVfR05VX0FTICYmIEhBVkVfQUxUSVZFQworCisjaW5jbHVkZSAiYXNtLlMiCisKKy50ZXh0CisKKy5tYWNybyBhZGRpMiByYSwgaW1tIC8vIGFkZCAzMi1iaXQgaW1tZWRpYXRlCisuaWYgXGltbSAmIDB4ZmZmZgorICAgIGFkZGkgXHJhLCBccmEsIFxpbW1AbAorLmVuZGlmCisuaWYgKFxpbW0rMHg4MDAwKT4+MTYKKyAgICBhZGRpcyBccmEsIFxyYSwgXGltbUBoYQorLmVuZGlmCisuZW5kbQorCisubWFjcm8gRkZUNCBhMCwgYTEsIGEyLCBhMyAvLyBpbjowLTEgb3V0OjItMworICAgIHZwZXJtICAgXGEyLFxhMCxcYTEsdjIwIC8vIHZjcHJtKDAsMSxzMixzMSkgLy8ge3IwLGkwLHIzLGkyfQorICAgIHZwZXJtICAgXGEzLFxhMCxcYTEsdjIxIC8vIHZjcHJtKDIsMyxzMCxzMykgLy8ge3IxLGkxLHIyLGkzfQorICAgIHZhZGRmcCAgXGEwLFxhMixcYTMgICAgICAgICAgICAgICAgICAgICAgICAgLy8ge3QxLHQyLHQ2LHQ1fQorICAgIHZzdWJmcCAgXGExLFxhMixcYTMgICAgICAgICAgICAgICAgICAgICAgICAgLy8ge3QzLHQ0LHQ4LHQ3fQorICAgIHZtcmdodyAgXGEyLFxhMCxcYTEgICAgIC8vIHZjcHJtKDAsczAsMSxzMSkgLy8ge3QxLHQzLHQyLHQ0fQorICAgIHZwZXJtICAgXGEzLFxhMCxcYTEsdjIyIC8vIHZjcHJtKDIsczMsMyxzMikgLy8ge3Q2LHQ3LHQ1LHQ4fQorICAgIHZhZGRmcCAgXGEwLFxhMixcYTMgICAgICAgICAgICAgICAgICAgICAgICAgLy8ge3IwLHIxLGkwLGkxfQorICAgIHZzdWJmcCAgXGExLFxhMixcYTMgICAgICAgICAgICAgICAgICAgICAgICAgLy8ge3IyLHIzLGkyLGkzfQorICAgIHZwZXJtICAgXGEyLFxhMCxcYTEsdjIzIC8vIHZjcHJtKDAsMSxzMCxzMSkgLy8ge3IwLHIxLHIyLHIzfQorICAgIHZwZXJtICAgXGEzLFxhMCxcYTEsdjI0IC8vIHZjcHJtKDIsMyxzMixzMykgLy8ge2kwLGkxLGkyLGkzfQorLmVuZG0KKworLm1hY3JvIEZGVDR4MiBhMCwgYTEsIGIwLCBiMSwgYTIsIGEzLCBiMiwgYjMKKyAgICB2cGVybSAgIFxhMixcYTAsXGExLHYyMCAvLyB2Y3BybSgwLDEsczIsczEpIC8vIHtyMCxpMCxyMyxpMn0KKyAgICB2cGVybSAgIFxhMyxcYTAsXGExLHYyMSAvLyB2Y3BybSgyLDMsczAsczMpIC8vIHtyMSxpMSxyMixpM30KKyAgICB2cGVybSAgIFxiMixcYjAsXGIxLHYyMAorICAgIHZwZXJtICAgXGIzLFxiMCxcYjEsdjIxCisgICAgdmFkZGZwICBcYTAsXGEyLFxhMyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB7dDEsdDIsdDYsdDV9CisgICAgdnN1YmZwICBcYTEsXGEyLFxhMyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB7dDMsdDQsdDgsdDd9CisgICAgdmFkZGZwICBcYjAsXGIyLFxiMworICAgIHZzdWJmcCAgXGIxLFxiMixcYjMKKyAgICB2bXJnaHcgIFxhMixcYTAsXGExICAgICAvLyB2Y3BybSgwLHMwLDEsczEpIC8vIHt0MSx0Myx0Mix0NH0KKyAgICB2cGVybSAgIFxhMyxcYTAsXGExLHYyMiAvLyB2Y3BybSgyLHMzLDMsczIpIC8vIHt0Nix0Nyx0NSx0OH0KKyAgICB2bXJnaHcgIFxiMixcYjAsXGIxCisgICAgdnBlcm0gICBcYjMsXGIwLFxiMSx2MjIKKyAgICB2YWRkZnAgIFxhMCxcYTIsXGEzICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHtyMCxyMSxpMCxpMX0KKyAgICB2c3ViZnAgIFxhMSxcYTIsXGEzICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHtyMixyMyxpMixpM30KKyAgICB2YWRkZnAgIFxiMCxcYjIsXGIzCisgICAgdnN1YmZwICBcYjEsXGIyLFxiMworICAgIHZwZXJtICAgXGEyLFxhMCxcYTEsdjIzIC8vIHZjcHJtKDAsMSxzMCxzMSkgLy8ge3IwLHIxLHIyLHIzfQorICAgIHZwZXJtICAgXGEzLFxhMCxcYTEsdjI0IC8vIHZjcHJtKDIsMyxzMixzMykgLy8ge2kwLGkxLGkyLGkzfQorICAgIHZwZXJtICAgXGIyLFxiMCxcYjEsdjIzCisgICAgdnBlcm0gICBcYjMsXGIwLFxiMSx2MjQKKy5lbmRtCisKKy5tYWNybyBGRlQ4IGEwLCBhMSwgYjAsIGIxLCBhMiwgYTMsIGIyLCBiMywgYjQgLy8gaW4sb3V0OmEwLWIxCisgICAgdm1yZ2h3ICBcYjIsXGIwLFxiMSAgICAgLy8gdmNwcm0oMCxzMCwxLHMxKSAvLyB7cjQscjYsaTQsaTZ9CisgICAgdm1yZ2x3ICBcYjMsXGIwLFxiMSAgICAgLy8gdmNwcm0oMixzMiwzLHMzKSAvLyB7cjUscjcsaTUsaTd9CisgICAgdnBlcm0gICBcYTIsXGEwLFxhMSx2MjAgICAgICAgICAvLyBGRlQ0IC4uLgorICAgIHZwZXJtICAgXGEzLFxhMCxcYTEsdjIxCisgICAgdmFkZGZwICBcYjAsXGIyLFxiMyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB7dDEsdDMsdDIsdDR9CisgICAgdnN1YmZwICBcYjEsXGIyLFxiMyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB7cjUscjcsaTUsaTd9CisgICAgdnBlcm0gICBcYjQsXGIxLFxiMSx2MjUgLy8gdmNwcm0oMiwzLDAsMSkgICAvLyB7aTUsaTcscjUscjd9CisgICAgdmFkZGZwICBcYTAsXGEyLFxhMworICAgIHZzdWJmcCAgXGExLFxhMixcYTMKKyAgICB2bWFkZGZwIFxiMSxcYjEsdjE3LHYxNCAvLyAqIHstMSwxLDEsLTF9L3NxcnQoMikKKyAgICB2bWFkZGZwIFxiMSxcYjQsdjE4LFxiMSAvLyAqIHsgMSwxLDEsMSB9L3NxcnQoMikgLy8ge3Q4LHRhLHQ3LHQ5fQorICAgIHZtcmdodyAgXGEyLFxhMCxcYTEKKyAgICB2cGVybSAgIFxhMyxcYTAsXGExLHYyMgorICAgIHZwZXJtICAgXGIyLFxiMCxcYjEsdjI2IC8vIHZjcHJtKDEsMixzMyxzMCkgLy8ge3QzLHQyLHQ5LHQ4fQorICAgIHZwZXJtICAgXGIzLFxiMCxcYjEsdjI3IC8vIHZjcHJtKDAsMyxzMixzMSkgLy8ge3QxLHQ0LHQ3LHRhfQorICAgIHZhZGRmcCAgXGEwLFxhMixcYTMKKyAgICB2c3ViZnAgIFxhMSxcYTIsXGEzCisgICAgdmFkZGZwICBcYjAsXGIyLFxiMyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB7dDEsdDIsdDksdGF9CisgICAgdnN1YmZwICBcYjEsXGIyLFxiMyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB7dDYsdDUsdGMsdGJ9CisgICAgdnBlcm0gICBcYTIsXGEwLFxhMSx2MjMKKyAgICB2cGVybSAgIFxhMyxcYTAsXGExLHYyNAorICAgIHZwZXJtICAgXGIyLFxiMCxcYjEsdjI4IC8vIHZjcHJtKDAsMixzMSxzMykgLy8ge3QxLHQ5LHQ1LHRifQorICAgIHZwZXJtICAgXGIzLFxiMCxcYjEsdjI5IC8vIHZjcHJtKDEsMyxzMCxzMikgLy8ge3QyLHRhLHQ2LHRjfQorICAgIHZzdWJmcCAgXGIwLFxhMixcYjIgICAgICAgICAgICAgICAgICAgICAgICAgLy8ge3I0LHI1LHI2LHI3fQorICAgIHZzdWJmcCAgXGIxLFxhMyxcYjMgICAgICAgICAgICAgICAgICAgICAgICAgLy8ge2k0LGk1LGk2LGk3fQorICAgIHZhZGRmcCAgXGEwLFxhMixcYjIgICAgICAgICAgICAgICAgICAgICAgICAgLy8ge3IwLHIxLHIyLHIzfQorICAgIHZhZGRmcCAgXGExLFxhMyxcYjMgICAgICAgICAgICAgICAgICAgICAgICAgLy8ge2kwLGkxLGkyLGkzfQorLmVuZG0KKworLm1hY3JvIEJGIGQwLGQxLHMwLHMxCisgICAgdnN1YmZwICBcZDEsXHMwLFxzMQorICAgIHZhZGRmcCAgXGQwLFxzMCxcczEKKy5lbmRtCisKKy5tYWNybyB6aXAgZDAsZDEsczAsczEKKyAgICB2bXJnaHcgIFxkMCxcczAsXHMxCisgICAgdm1yZ2x3ICBcZDEsXHMwLFxzMQorLmVuZG0KKworLm1hY3JvIGRlZl9mZnQ0IGludGVybGVhdmUKK2ZmdDRcaW50ZXJsZWF2ZVwoKV9hbHRpdmVjOgorICAgIGx2eCAgICB2MCwgMCxyMworICAgIGx2eCAgICB2MSxyOSxyMworICAgIEZGVDQgICB2MCx2MSx2Mix2MworLmlmbmIgXGludGVybGVhdmUKKyAgICB6aXAgICAgdjAsdjEsdjIsdjMKKyAgICBzdHZ4ICAgdjAsIDAscjMKKyAgICBzdHZ4ICAgdjEscjkscjMKKy5lbHNlCisgICAgc3R2eCAgIHYyLCAwLHIzCisgICAgc3R2eCAgIHYzLHI5LHIzCisuZW5kaWYKKyAgICBibHIKKy5lbmRtCisKKy5tYWNybyBkZWZfZmZ0OCBpbnRlcmxlYXZlCitmZnQ4XGludGVybGVhdmVcKClfYWx0aXZlYzoKKyAgICBhZGRpICAgcjQscjMsMzIKKyAgICBsdnggICAgdjAsIDAscjMKKyAgICBsdnggICAgdjEscjkscjMKKyAgICBsdnggICAgdjIsIDAscjQKKyAgICBsdnggICAgdjMscjkscjQKKyAgICBGRlQ4ICAgdjAsdjEsdjIsdjMsdjQsdjUsdjYsdjcsdjgKKy5pZm5iIFxpbnRlcmxlYXZlCisgICAgemlwICAgIHY0LHY1LHYwLHYxCisgICAgemlwICAgIHY2LHY3LHYyLHYzCisgICAgc3R2eCAgIHY0LCAwLHIzCisgICAgc3R2eCAgIHY1LHI5LHIzCisgICAgc3R2eCAgIHY2LCAwLHI0CisgICAgc3R2eCAgIHY3LHI5LHI0CisuZWxzZQorICAgIHN0dnggICB2MCwgMCxyMworICAgIHN0dnggICB2MSxyOSxyMworICAgIHN0dnggICB2MiwgMCxyNAorICAgIHN0dnggICB2MyxyOSxyNAorLmVuZGlmCisgICAgYmxyCisuZW5kbQorCisubWFjcm8gZGVmX2ZmdDE2IGludGVybGVhdmUKK2ZmdDE2XGludGVybGVhdmVcKClfYWx0aXZlYzoKKyAgICBhZGRpICAgcjUscjMsNjQKKyAgICBhZGRpICAgcjYscjMsOTYKKyAgICBhZGRpICAgcjQscjMsMzIKKyAgICBsdnggICAgdjAsIDAscjUKKyAgICBsdnggICAgdjEscjkscjUKKyAgICBsdnggICAgdjIsIDAscjYKKyAgICBsdnggICAgdjMscjkscjYKKyAgICBGRlQ0eDIgdjAsdjEsdjIsdjMsdjQsdjUsdjYsdjcKKyAgICBsdnggICAgdjAsIDAscjMKKyAgICBsdnggICAgdjEscjkscjMKKyAgICBsdnggICAgdjIsIDAscjQKKyAgICBsdnggICAgdjMscjkscjQKKyAgICBGRlQ4ICAgdjAsdjEsdjIsdjMsdjgsdjksdjEwLHYxMSx2MTIKKyAgICB2bWFkZGZwICAgdjgsdjQsdjE1LHYxNCAvLyByMip3cmUKKyAgICB2bWFkZGZwICAgdjksdjUsdjE1LHYxNCAvLyBpMip3cmUKKyAgICB2bWFkZGZwICB2MTAsdjYsdjE1LHYxNCAvLyByMyp3cmUKKyAgICB2bWFkZGZwICB2MTEsdjcsdjE1LHYxNCAvLyBpMyp3cmUKKyAgICB2bWFkZGZwICAgdjgsdjUsdjE2LHY4ICAvLyBpMip3aW0KKyAgICB2bm1zdWJmcCAgdjksdjQsdjE2LHY5ICAvLyByMip3aW0KKyAgICB2bm1zdWJmcCB2MTAsdjcsdjE2LHYxMCAvLyBpMyp3aW0KKyAgICB2bWFkZGZwICB2MTEsdjYsdjE2LHYxMSAvLyByMyp3aW0KKyAgICBCRiAgICAgdjEwLHYxMix2MTAsdjgKKyAgICBCRiAgICAgdjExLHYxMyx2OSx2MTEKKyAgICBCRiAgICAgdjAsdjQsdjAsdjEwCisgICAgQkYgICAgIHYzLHY3LHYzLHYxMgorICAgIEJGICAgICB2MSx2NSx2MSx2MTEKKyAgICBCRiAgICAgdjIsdjYsdjIsdjEzCisuaWZuYiBcaW50ZXJsZWF2ZQorICAgIHppcCAgICAgdjgsIHY5LHYwLHYxCisgICAgemlwICAgIHYxMCx2MTEsdjIsdjMKKyAgICB6aXAgICAgdjEyLHYxMyx2NCx2NQorICAgIHppcCAgICB2MTQsdjE1LHY2LHY3CisgICAgc3R2eCAgICB2OCwgMCxyMworICAgIHN0dnggICAgdjkscjkscjMKKyAgICBzdHZ4ICAgdjEwLCAwLHI0CisgICAgc3R2eCAgIHYxMSxyOSxyNAorICAgIHN0dnggICB2MTIsIDAscjUKKyAgICBzdHZ4ICAgdjEzLHI5LHI1CisgICAgc3R2eCAgIHYxNCwgMCxyNgorICAgIHN0dnggICB2MTUscjkscjYKKy5lbHNlCisgICAgc3R2eCAgIHYwLCAwLHIzCisgICAgc3R2eCAgIHY0LCAwLHI1CisgICAgc3R2eCAgIHYzLHI5LHI0CisgICAgc3R2eCAgIHY3LHI5LHI2CisgICAgc3R2eCAgIHYxLHI5LHIzCisgICAgc3R2eCAgIHY1LHI5LHI1CisgICAgc3R2eCAgIHYyLCAwLHI0CisgICAgc3R2eCAgIHY2LCAwLHI2CisuZW5kaWYKKyAgICBibHIKKy5lbmRtCisKKy8vIHZvaWQgcGFzcyhmbG9hdCAqeiwgZmxvYXQgKndyZSwgaW50IG4pCisubWFjcm8gUEFTUyBpbnRlcmxlYXZlLCBzdWZmaXgKK2ZmdF9wYXNzXHN1ZmZpeFwoKV9hbHRpdmVjOgorICAgIG10Y3RyICByNQorICAgIHNsd2kgICByMCxyNSw0CisgICAgc2x3aSAgIHI3LHI1LDYgICAvLyBvMgorICAgIHNsd2kgICByNSxyNSw1ICAgLy8gbzEKKyAgICBhZGQgICByMTAscjUscjcgIC8vIG8zCisgICAgYWRkICAgIHIwLHI0LHIwICAvLyB3aW0KKyAgICBhZGRpICAgcjYscjUsMTYgIC8vIG8xKzE2CisgICAgYWRkaSAgIHI4LHI3LDE2ICAvLyBvMisxNgorICAgIGFkZGkgIHIxMSxyMTAsMTYgLy8gbzMrMTYKKzE6CisgICAgbHZ4ICAgIHY4LCAwLHI0ICAvLyB3cmUKKyAgICBsdnggICB2MTAsIDAscjAgIC8vIHdpbQorICAgIHN1YiAgICByMCxyMCxyOQorICAgIGx2eCAgICB2OSwgMCxyMAorICAgIHZwZXJtICB2OSx2OSx2MTAsdjE5ICAgLy8gdmNwcm0oczAsMywyLDEpID0+IHdpbVswIC4uIC0zXQorICAgIGx2eCAgICB2NCxyMyxyNyAgICAgICAgLy8gcjIgPSB6W28yXQorICAgIGx2eCAgICB2NSxyMyxyOCAgICAgICAgLy8gaTIgPSB6W28yKzE2XQorICAgIGx2eCAgICB2NixyMyxyMTAgICAgICAgLy8gcjMgPSB6W28zXQorICAgIGx2eCAgICB2NyxyMyxyMTEgICAgICAgLy8gaTMgPSB6W28zKzE2XQorICAgIHZtYWRkZnAgIHYxMCx2NCx2OCx2MTQgLy8gcjIqd3JlCisgICAgdm1hZGRmcCAgdjExLHY1LHY4LHYxNCAvLyBpMip3cmUKKyAgICB2bWFkZGZwICB2MTIsdjYsdjgsdjE0IC8vIHIzKndyZQorICAgIHZtYWRkZnAgIHYxMyx2Nyx2OCx2MTQgLy8gaTMqd3JlCisgICAgbHZ4ICAgIHYwLCAwLHIzICAgICAgICAvLyByMCA9IHpbMF0KKyAgICBsdnggICAgdjMscjMscjYgICAgICAgIC8vIGkxID0geltvMSsxNl0KKyAgICB2bWFkZGZwICB2MTAsdjUsdjksdjEwIC8vIGkyKndpbQorICAgIHZubXN1YmZwIHYxMSx2NCx2OSx2MTEgLy8gcjIqd2ltCisgICAgdm5tc3ViZnAgdjEyLHY3LHY5LHYxMiAvLyBpMyp3aW0KKyAgICB2bWFkZGZwICB2MTMsdjYsdjksdjEzIC8vIHIzKndpbQorICAgIGx2eCAgICB2MSxyMyxyOSAgICAgICAgLy8gaTAgPSB6WzE2XQorICAgIGx2eCAgICB2MixyMyxyNSAgICAgICAgLy8gcjEgPSB6W28xXQorICAgIEJGICAgICB2MTIsdjgsdjEyLHYxMAorICAgIEJGICAgICB2MTMsdjksdjExLHYxMworICAgIEJGICAgICB2MCx2NCx2MCx2MTIKKyAgICBCRiAgICAgdjMsdjcsdjMsdjgKKy5pZiAhXGludGVybGVhdmUKKyAgICBzdHZ4ICAgdjAsIDAscjMKKyAgICBzdHZ4ICAgdjQscjMscjcKKyAgICBzdHZ4ICAgdjMscjMscjYKKyAgICBzdHZ4ICAgdjcscjMscjExCisuZW5kaWYKKyAgICBCRiAgICAgdjEsdjUsdjEsdjEzCisgICAgQkYgICAgIHYyLHY2LHYyLHY5CisuaWYgIVxpbnRlcmxlYXZlCisgICAgc3R2eCAgIHYxLHIzLHI5CisgICAgc3R2eCAgIHYyLHIzLHI1CisgICAgc3R2eCAgIHY1LHIzLHI4CisgICAgc3R2eCAgIHY2LHIzLHIxMAorLmVsc2UKKyAgICB2bXJnaHcgdjgsdjAsdjEKKyAgICB2bXJnbHcgdjksdjAsdjEKKyAgICBzdHZ4ICAgdjgsIDAscjMKKyAgICBzdHZ4ICAgdjkscjMscjkKKyAgICB2bXJnaHcgdjgsdjIsdjMKKyAgICB2bXJnbHcgdjksdjIsdjMKKyAgICBzdHZ4ICAgdjgscjMscjUKKyAgICBzdHZ4ICAgdjkscjMscjYKKyAgICB2bXJnaHcgdjgsdjQsdjUKKyAgICB2bXJnbHcgdjksdjQsdjUKKyAgICBzdHZ4ICAgdjgscjMscjcKKyAgICBzdHZ4ICAgdjkscjMscjgKKyAgICB2bXJnaHcgdjgsdjYsdjcKKyAgICB2bXJnbHcgdjksdjYsdjcKKyAgICBzdHZ4ICAgdjgscjMscjEwCisgICAgc3R2eCAgIHY5LHIzLHIxMQorLmVuZGlmCisgICAgYWRkaSAgIHIzLHIzLDMyCisgICAgYWRkaSAgIHI0LHI0LDE2CisgICAgYmRueiAxYgorICAgIHN1YiAgICByMyxyMyxyNQorICAgIGJscgorLmVuZG0KKworI2RlZmluZSBNX1NRUlQxXzIgICAgICAwLjcwNzEwNjc4MTE4NjU0NzUyNDQwICAvKiAxL3NxcnQoMikgKi8KKworI2RlZmluZSBXT1JEXzAgIDB4MDAsMHgwMSwweDAyLDB4MDMKKyNkZWZpbmUgV09SRF8xICAweDA0LDB4MDUsMHgwNiwweDA3CisjZGVmaW5lIFdPUkRfMiAgMHgwOCwweDA5LDB4MGEsMHgwYgorI2RlZmluZSBXT1JEXzMgIDB4MGMsMHgwZCwweDBlLDB4MGYKKyNkZWZpbmUgV09SRF9zMCAweDEwLDB4MTEsMHgxMiwweDEzCisjZGVmaW5lIFdPUkRfczEgMHgxNCwweDE1LDB4MTYsMHgxNworI2RlZmluZSBXT1JEX3MyIDB4MTgsMHgxOSwweDFhLDB4MWIKKyNkZWZpbmUgV09SRF9zMyAweDFjLDB4MWQsMHgxZSwweDFmCisKKyNkZWZpbmUgdmNwcm0oYSwgYiwgYywgZCkgLmJ5dGUgV09SRF8jI2EsIFdPUkRfIyNiLCBXT1JEXyMjYywgV09SRF8jI2QKKworICAgIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorZmZ0X2RhdGE6CisgICAgLmZsb2F0ICAwLCAwLCAwLCAwCisgICAgLmZsb2F0ICAxLCAwLjkyMzg3OTUzLCBNX1NRUlQxXzIsIDAuMzgyNjgzNDMKKyAgICAuZmxvYXQgIDAsIDAuMzgyNjgzNDMsIE1fU1FSVDFfMiwgMC45MjM4Nzk1MworICAgIC5mbG9hdCAgLU1fU1FSVDFfMiwgTV9TUVJUMV8yLCBNX1NRUlQxXzIsLU1fU1FSVDFfMgorICAgIC5mbG9hdCAgIE1fU1FSVDFfMiwgTV9TUVJUMV8yLCBNX1NRUlQxXzIsIE1fU1FSVDFfMgorICAgIHZjcHJtKHMwLDMsMiwxKQorICAgIHZjcHJtKDAsMSxzMixzMSkKKyAgICB2Y3BybSgyLDMsczAsczMpCisgICAgdmNwcm0oMixzMywzLHMyKQorICAgIHZjcHJtKDAsMSxzMCxzMSkKKyAgICB2Y3BybSgyLDMsczIsczMpCisgICAgdmNwcm0oMiwzLDAsMSkKKyAgICB2Y3BybSgxLDIsczMsczApCisgICAgdmNwcm0oMCwzLHMyLHMxKQorICAgIHZjcHJtKDAsMixzMSxzMykKKyAgICB2Y3BybSgxLDMsczAsczIpCisKKy5tYWNybyBsdm0gIGIsIHIsIHJlZ3M6dmFyYXJnCisgICAgbHZ4ICAgICBcciwgMCwgXGIKKyAgICBhZGRpICAgIFxiLCBcYiwgMTYKKyAgLmlmbmIgXHJlZ3MKKyAgICBsdm0gICAgIFxiLCBccmVncworICAuZW5kaWYKKy5lbmRtCisKKy5tYWNybyBzdHZtIGIsIHIsIHJlZ3M6dmFyYXJnCisgICAgc3R2eCAgICBcciwgMCwgXGIKKyAgICBhZGRpICAgIFxiLCBcYiwgMTYKKyAgLmlmbmIgXHJlZ3MKKyAgICBzdHZtICAgIFxiLCBccmVncworICAuZW5kaWYKKy5lbmRtCisKKy5tYWNybyBmZnRfY2FsYyBpbnRlcmxlYXZlCitleHRmdW5jIGZmX2ZmdF9jYWxjXGludGVybGVhdmVcKClfYWx0aXZlYworICAgIG1mbHIgICAgcjAKKyAgICBzdHAgICAgIHIwLCAyKlBTKHIxKQorICAgIHN0cHUgICAgcjEsIC0oMTYwKzE2KlBTKShyMSkKKyAgICBnZXRfZ290IHIxMQorICAgIGFkZGkgICAgcjYsIHIxLCAxNipQUworICAgIHN0dm0gICAgcjYsIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOQorICAgIG1mdnJzYXZlIHIwCisgICAgc3R3ICAgICByMCwgMTUqUFMocjEpCisgICAgbGkgICAgICByNiwgMHhmZmZmZmZmYworICAgIG10dnJzYXZlIHI2CisKKyAgICBtb3ZyZWwgIHI2LCBmZnRfZGF0YSwgcjExCisgICAgbHZtICAgICByNiwgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEKKyAgICBsdm0gICAgIHI2LCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOQorCisgICAgbGkgICAgICByOSwgMTYKKyAgICBtb3ZyZWwgIHIxMiwgWChmZl9jb3NfdGFicyksIHIxMQorCisgICAgbW92cmVsICByNiwgZmZ0X2Rpc3BhdGNoX3RhYlxpbnRlcmxlYXZlXCgpX2FsdGl2ZWMsIHIxMQorICAgIGx3eiAgICAgcjMsIDAocjMpCisgICAgc3ViaSAgICByMywgcjMsIDIKKyAgICBzbHdpICAgIHIzLCByMywgMitBUkNIX1BQQzY0CisgICAgbHB4ICAgICByMywgcjMsIHI2CisgICAgbXRjdHIgICByMworICAgIG1yICAgICAgcjMsIHI0CisgICAgYmN0cmwKKworICAgIGFkZGkgICAgcjYsIHIxLCAxNipQUworICAgIGx2bSAgICAgcjYsIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOQorICAgIGx3eiAgICAgcjYsIDE1KlBTKHIxKQorICAgIG10dnJzYXZlIHI2CisgICAgbHAgICAgICByMSwgMChyMSkKKyAgICBscCAgICAgIHIwLCAyKlBTKHIxKQorICAgIG10bHIgICAgcjAKKyAgICBibHIKKy5lbmRtCisKKy5tYWNybyBERUNMX0ZGVCBzdWZmaXgsIGJpdHMsIG4sIG4yLCBuNAorZmZ0XG5cc3VmZml4XCgpX2FsdGl2ZWM6CisgICAgbWZsciAgcjAKKyAgICBzdHAgICByMCxQUyooXGJpdHMtMykocjEpCisgICAgYmwgICAgZmZ0XG4yXCgpX2FsdGl2ZWMKKyAgICBhZGRpMiByMyxcbio0CisgICAgYmwgICAgZmZ0XG40XCgpX2FsdGl2ZWMKKyAgICBhZGRpMiByMyxcbioyCisgICAgYmwgICAgZmZ0XG40XCgpX2FsdGl2ZWMKKyAgICBhZGRpMiByMyxcbiotNgorICAgIGxwICAgIHIwLFBTKihcYml0cy0zKShyMSkKKyAgICBscCAgICByNCxcYml0cypQUyhyMTIpCisgICAgbXRsciAgcjAKKyAgICBsaSAgICByNSxcbi8xNgorICAgIGIgICAgIGZmdF9wYXNzXHN1ZmZpeFwoKV9hbHRpdmVjCisuZW5kbQorCisubWFjcm8gREVDTF9GRlRTIGludGVybGVhdmUsIHN1ZmZpeAorICAgIC50ZXh0CisgICAgZGVmX2ZmdDQgIFxzdWZmaXgKKyAgICBkZWZfZmZ0OCAgXHN1ZmZpeAorICAgIGRlZl9mZnQxNiBcc3VmZml4CisgICAgUEFTUyBcaW50ZXJsZWF2ZSwgXHN1ZmZpeAorICAgIERFQ0xfRkZUIFxzdWZmaXgsIDUsICAgMzIsICAgMTYsICAgIDgKKyAgICBERUNMX0ZGVCBcc3VmZml4LCA2LCAgIDY0LCAgIDMyLCAgIDE2CisgICAgREVDTF9GRlQgXHN1ZmZpeCwgNywgIDEyOCwgICA2NCwgICAzMgorICAgIERFQ0xfRkZUIFxzdWZmaXgsIDgsICAyNTYsICAxMjgsICAgNjQKKyAgICBERUNMX0ZGVCBcc3VmZml4LCA5LCAgNTEyLCAgMjU2LCAgMTI4CisgICAgREVDTF9GRlQgXHN1ZmZpeCwxMCwgMTAyNCwgIDUxMiwgIDI1NgorICAgIERFQ0xfRkZUIFxzdWZmaXgsMTEsIDIwNDgsIDEwMjQsICA1MTIKKyAgICBERUNMX0ZGVCBcc3VmZml4LDEyLCA0MDk2LCAyMDQ4LCAxMDI0CisgICAgREVDTF9GRlQgXHN1ZmZpeCwxMywgODE5MiwgNDA5NiwgMjA0OAorICAgIERFQ0xfRkZUIFxzdWZmaXgsMTQsMTYzODQsIDgxOTIsIDQwOTYKKyAgICBERUNMX0ZGVCBcc3VmZml4LDE1LDMyNzY4LDE2Mzg0LCA4MTkyCisgICAgREVDTF9GRlQgXHN1ZmZpeCwxNiw2NTUzNiwzMjc2OCwxNjM4NAorCisgICAgZmZ0X2NhbGMgXHN1ZmZpeAorCisgICAgLnJvZGF0YQorICAgIC5hbGlnbiAzCitmZnRfZGlzcGF0Y2hfdGFiXHN1ZmZpeFwoKV9hbHRpdmVjOgorICAgIFBUUiBmZnQ0XHN1ZmZpeFwoKV9hbHRpdmVjCisgICAgUFRSIGZmdDhcc3VmZml4XCgpX2FsdGl2ZWMKKyAgICBQVFIgZmZ0MTZcc3VmZml4XCgpX2FsdGl2ZWMKKyAgICBQVFIgZmZ0MzJcc3VmZml4XCgpX2FsdGl2ZWMKKyAgICBQVFIgZmZ0NjRcc3VmZml4XCgpX2FsdGl2ZWMKKyAgICBQVFIgZmZ0MTI4XHN1ZmZpeFwoKV9hbHRpdmVjCisgICAgUFRSIGZmdDI1NlxzdWZmaXhcKClfYWx0aXZlYworICAgIFBUUiBmZnQ1MTJcc3VmZml4XCgpX2FsdGl2ZWMKKyAgICBQVFIgZmZ0MTAyNFxzdWZmaXhcKClfYWx0aXZlYworICAgIFBUUiBmZnQyMDQ4XHN1ZmZpeFwoKV9hbHRpdmVjCisgICAgUFRSIGZmdDQwOTZcc3VmZml4XCgpX2FsdGl2ZWMKKyAgICBQVFIgZmZ0ODE5MlxzdWZmaXhcKClfYWx0aXZlYworICAgIFBUUiBmZnQxNjM4NFxzdWZmaXhcKClfYWx0aXZlYworICAgIFBUUiBmZnQzMjc2OFxzdWZmaXhcKClfYWx0aXZlYworICAgIFBUUiBmZnQ2NTUzNlxzdWZmaXhcKClfYWx0aXZlYworLmVuZG0KKworREVDTF9GRlRTIDAKK0RFQ0xfRkZUUyAxLCBfaW50ZXJsZWF2ZQorCisjZW5kaWYgLyogSEFWRV9HTlVfQVMgJiYgSEFWRV9BTFRJVkVDICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcGMvZmZ0X2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9mZnRfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NWZhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvZmZ0X2luaXQuYwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIEZGVC9JRkZUIHRyYW5zZm9ybXMKKyAqIEFsdGlWZWMtZW5hYmxlZAorICogQ29weXJpZ2h0IChjKSAyMDA5IExvcmVuIE1lcnJpdHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9mZnQuaCIKKworLyoqCisgKiBEbyBhIGNvbXBsZXggRkZUIHdpdGggdGhlIHBhcmFtZXRlcnMgZGVmaW5lZCBpbiBmZl9mZnRfaW5pdCgpLgorICogVGhlIGlucHV0IGRhdGEgbXVzdCBiZSBwZXJtdXRlZCBiZWZvcmUgd2l0aCBzLT5yZXZ0YWIgdGFibGUuCisgKiBObyAxLjAgLyBzcXJ0KG4pIG5vcm1hbGl6YXRpb24gaXMgZG9uZS4KKyAqIEFsdGlWZWMtZW5hYmxlZDoKKyAqIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlICd6JyBwb2ludGVyIGlzIDE2IGJ5dGVzLWFsaWduZWQuCisgKiBJdCBhbHNvIGFzc3VtZXMgYWxsIEZGVENvbXBsZXggYXJlIDggYnl0ZXMtYWxpZ25lZCBwYWlycyBvZiBmbG9hdHMuCisgKi8KKworI2lmIEhBVkVfVlNYCisjaW5jbHVkZSAiZmZ0X3ZzeC5oIgorI2Vsc2UKK3ZvaWQgZmZfZmZ0X2NhbGNfYWx0aXZlYyhGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KTsKK3ZvaWQgZmZfZmZ0X2NhbGNfaW50ZXJsZWF2ZV9hbHRpdmVjKEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopOworI2VuZGlmCisKKyNpZiBIQVZFX0dOVV9BUyAmJiBIQVZFX0FMVElWRUMKK3N0YXRpYyB2b2lkIGltZGN0X2hhbGZfYWx0aXZlYyhGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm91dHB1dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dCkKK3sKKyAgICBpbnQgaiwgazsKKyAgICBpbnQgbiA9IDEgPDwgcy0+bWRjdF9iaXRzOworICAgIGludCBuNCA9IG4gPj4gMjsKKyAgICBpbnQgbjggPSBuID4+IDM7CisgICAgaW50IG4zMiA9IG4gPj4gNTsKKyAgICBjb25zdCB1aW50MTZfdCAqcmV2dGFiaiA9IHMtPnJldnRhYjsKKyAgICBjb25zdCB1aW50MTZfdCAqcmV2dGFiayA9IHMtPnJldnRhYituNDsKKyAgICBjb25zdCB2ZWNfZiAqdGNvcyA9IChjb25zdCB2ZWNfZiopKHMtPnRjb3MrbjgpOworICAgIGNvbnN0IHZlY19mICp0c2luID0gKGNvbnN0IHZlY19mKikocy0+dHNpbituOCk7CisgICAgY29uc3QgdmVjX2YgKnBpbiA9IChjb25zdCB2ZWNfZiopKGlucHV0K240KTsKKyAgICB2ZWNfZiAqcG91dCA9ICh2ZWNfZiopKG91dHB1dCtuNCk7CisKKyAgICAvKiBwcmUgcm90YXRpb24gKi8KKyAgICBrID0gbjMyLTE7CisgICAgZG8geworICAgICAgICB2ZWNfZiBjb3Msc2luLGNvczAsc2luMCxjb3MxLHNpbjEscmUsaW0scjAsaTAscjEsaTEsYSxiLGMsZDsKKyNkZWZpbmUgQ01VTEEocCxvMCxvMSxvMixvMylcCisgICAgICAgIGEgPSBwaW5bIGsqMitwXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHsgeltrXS5yZSwgICAgeltrXS5pbSwgICAgeltrKzFdLnJlLCAgeltrKzFdLmltICB9ICovXAorICAgICAgICBiID0gcGluWy1rKjItcC0xXTsgICAgICAgICAgICAgICAgICAgICAvKiB7IHpbLWstMl0ucmUsIHpbLWstMl0uaW0sIHpbLWstMV0ucmUsIHpbLWstMV0uaW0gfSAqL1wKKyAgICAgICAgcmUgPSB2ZWNfcGVybShhLCBiLCB2Y3BybSgwLDIsczAsczIpKTsgLyogeyB6W2tdLnJlLCAgICB6W2srMV0ucmUsICB6Wy1rLTJdLnJlLCB6Wy1rLTFdLnJlIH0gKi9cCisgICAgICAgIGltID0gdmVjX3Blcm0oYSwgYiwgdmNwcm0oczMsczEsMywxKSk7IC8qIHsgelstay0xXS5pbSwgelstay0yXS5pbSwgeltrKzFdLmltLCAgeltrXS5pbSAgICB9ICovXAorICAgICAgICBjb3MgPSB2ZWNfcGVybShjb3MwLCBjb3MxLCB2Y3BybShvMCxvMSxzIyNvMixzIyNvMykpOyAvKiB7IGNvc1trXSwgY29zW2srMV0sIGNvc1stay0yXSwgY29zWy1rLTFdIH0gKi9cCisgICAgICAgIHNpbiA9IHZlY19wZXJtKHNpbjAsIHNpbjEsIHZjcHJtKG8wLG8xLHMjI28yLHMjI28zKSk7XAorICAgICAgICByIyNwID0gaW0qY29zIC0gcmUqc2luO1wKKyAgICAgICAgaSMjcCA9IHJlKmNvcyArIGltKnNpbjsKKyNkZWZpbmUgU1RPUkUyKHYsZHN0KVwKKyAgICAgICAgaiA9IGRzdDtcCisgICAgICAgIHZlY19zdGUodiwgMCwgb3V0cHV0K2oqMik7XAorICAgICAgICB2ZWNfc3RlKHYsIDQsIG91dHB1dCtqKjIpOworI2RlZmluZSBTVE9SRTgocClcCisgICAgICAgIGEgPSB2ZWNfcGVybShyIyNwLCBpIyNwLCB2Y3BybSgwLHMwLDAsczApKTtcCisgICAgICAgIGIgPSB2ZWNfcGVybShyIyNwLCBpIyNwLCB2Y3BybSgxLHMxLDEsczEpKTtcCisgICAgICAgIGMgPSB2ZWNfcGVybShyIyNwLCBpIyNwLCB2Y3BybSgyLHMyLDIsczIpKTtcCisgICAgICAgIGQgPSB2ZWNfcGVybShyIyNwLCBpIyNwLCB2Y3BybSgzLHMzLDMsczMpKTtcCisgICAgICAgIFNUT1JFMihhLCByZXZ0YWJrWyBwKjItNF0pO1wKKyAgICAgICAgU1RPUkUyKGIsIHJldnRhYmtbIHAqMi0zXSk7XAorICAgICAgICBTVE9SRTIoYywgcmV2dGFialstcCoyKzJdKTtcCisgICAgICAgIFNUT1JFMihkLCByZXZ0YWJqWy1wKjIrM10pOworCisgICAgICAgIGNvczAgPSB0Y29zW2tdOworICAgICAgICBzaW4wID0gdHNpbltrXTsKKyAgICAgICAgY29zMSA9IHRjb3NbLWstMV07CisgICAgICAgIHNpbjEgPSB0c2luWy1rLTFdOworICAgICAgICBDTVVMQSgwLCAwLDEsMiwzKTsKKyAgICAgICAgQ01VTEEoMSwgMiwzLDAsMSk7CisgICAgICAgIFNUT1JFOCgwKTsKKyAgICAgICAgU1RPUkU4KDEpOworICAgICAgICByZXZ0YWJqICs9IDQ7CisgICAgICAgIHJldnRhYmsgLT0gNDsKKyAgICAgICAgay0tOworICAgIH0gd2hpbGUoayA+PSAwKTsKKworI2lmIEhBVkVfVlNYCisgICAgZmZfZmZ0X2NhbGNfdnN4KHMsIChGRlRDb21wbGV4KilvdXRwdXQpOworI2Vsc2UKKyAgICBmZl9mZnRfY2FsY19hbHRpdmVjKHMsIChGRlRDb21wbGV4KilvdXRwdXQpOworI2VuZGlmCisKKyAgICAvKiBwb3N0IHJvdGF0aW9uICsgcmVvcmRlcmluZyAqLworICAgIGogPSAtbjMyOworICAgIGsgPSBuMzItMTsKKyAgICBkbyB7CisgICAgICAgIHZlY19mIGNvcyxzaW4scmUsaW0sYSxiLGMsZDsKKyNkZWZpbmUgQ01VTEIoZDAsZDEsbylcCisgICAgICAgIHJlID0gcG91dFtvKjJdO1wKKyAgICAgICAgaW0gPSBwb3V0W28qMisxXTtcCisgICAgICAgIGNvcyA9IHRjb3Nbb107XAorICAgICAgICBzaW4gPSB0c2luW29dO1wKKyAgICAgICAgZDAgPSBpbSpzaW4gLSByZSpjb3M7XAorICAgICAgICBkMSA9IHJlKnNpbiArIGltKmNvczsKKworICAgICAgICBDTVVMQihhLGIsaik7CisgICAgICAgIENNVUxCKGMsZCxrKTsKKyAgICAgICAgcG91dFsyKmpdICAgPSB2ZWNfcGVybShhLCBkLCB2Y3BybSgwLHMzLDEsczIpKTsKKyAgICAgICAgcG91dFsyKmorMV0gPSB2ZWNfcGVybShhLCBkLCB2Y3BybSgyLHMxLDMsczApKTsKKyAgICAgICAgcG91dFsyKmtdICAgPSB2ZWNfcGVybShjLCBiLCB2Y3BybSgwLHMzLDEsczIpKTsKKyAgICAgICAgcG91dFsyKmsrMV0gPSB2ZWNfcGVybShjLCBiLCB2Y3BybSgyLHMxLDMsczApKTsKKyAgICAgICAgaisrOworICAgICAgICBrLS07CisgICAgfSB3aGlsZShrID49IDApOworfQorCitzdGF0aWMgdm9pZCBpbWRjdF9jYWxjX2FsdGl2ZWMoRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpCit7CisgICAgaW50IGs7CisgICAgaW50IG4gPSAxIDw8IHMtPm1kY3RfYml0czsKKyAgICBpbnQgbjQgPSBuID4+IDI7CisgICAgaW50IG4xNiA9IG4gPj4gNDsKKyAgICB2ZWNfdTMyIHNpZ24gPSB7MVU8PDMxLDFVPDwzMSwxVTw8MzEsMVU8PDMxfTsKKyAgICB2ZWNfdTMyICpwMCA9ICh2ZWNfdTMyKikob3V0cHV0K240KTsKKyAgICB2ZWNfdTMyICpwMSA9ICh2ZWNfdTMyKikob3V0cHV0K240KjMpOworCisgICAgaW1kY3RfaGFsZl9hbHRpdmVjKHMsIG91dHB1dCArIG40LCBpbnB1dCk7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgbjE2OyBrKyspIHsKKyAgICAgICAgdmVjX3UzMiBhID0gcDBba10gXiBzaWduOworICAgICAgICB2ZWNfdTMyIGIgPSBwMVstay0xXTsKKyAgICAgICAgcDBbLWstMV0gPSB2ZWNfcGVybShhLCBhLCB2Y3BybSgzLDIsMSwwKSk7CisgICAgICAgIHAxW2tdICAgID0gdmVjX3Blcm0oYiwgYiwgdmNwcm0oMywyLDEsMCkpOworICAgIH0KK30KKyNlbmRpZiAvKiBIQVZFX0dOVV9BUyAmJiBIQVZFX0FMVElWRUMgKi8KKworYXZfY29sZCB2b2lkIGZmX2ZmdF9pbml0X3BwYyhGRlRDb250ZXh0ICpzKQoreworI2lmIEhBVkVfR05VX0FTICYmIEhBVkVfQUxUSVZFQworICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKKyAgICAgICAgcmV0dXJuOworCisjaWYgSEFWRV9WU1gKKyAgICBzLT5mZnRfY2FsYyA9IGZmX2ZmdF9jYWxjX2ludGVybGVhdmVfdnN4OworI2Vsc2UKKyAgICBzLT5mZnRfY2FsYyAgID0gZmZfZmZ0X2NhbGNfaW50ZXJsZWF2ZV9hbHRpdmVjOworI2VuZGlmCisgICAgaWYgKHMtPm1kY3RfYml0cyA+PSA1KSB7CisgICAgICAgIHMtPmltZGN0X2NhbGMgPSBpbWRjdF9jYWxjX2FsdGl2ZWM7CisgICAgICAgIHMtPmltZGN0X2hhbGYgPSBpbWRjdF9oYWxmX2FsdGl2ZWM7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfR05VX0FTICYmIEhBVkVfQUxUSVZFQyAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2ZmdF92c3guYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9mZnRfdnN4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyOTc1ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9mZnRfdnN4LmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBGRlQgIHRyYW5zZm9ybSwgb3B0aW1pemVkIHdpdGggVlNYIGJ1aWx0LWluIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDE0IFJvbmcgWWFuCisgKgorICogVGhpcyBhbGdvcml0aG0gKHRob3VnaCBub3QgYW55IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzKSBpcworICogYmFzZWQgb24gbGliZGpiZmZ0IGJ5IEQuIEouIEJlcm5zdGVpbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9mZnQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ZmdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImZmdF92c3guaCIKKworI2lmIEhBVkVfVlNYCisKK3N0YXRpYyB2b2lkIGZmdDMyX3ZzeF9pbnRlcmxlYXZlKEZGVENvbXBsZXggKnopCit7CisgICAgZmZ0MTZfdnN4X2ludGVybGVhdmUoeik7CisgICAgZmZ0OF92c3hfaW50ZXJsZWF2ZSh6KzE2KTsKKyAgICBmZnQ4X3ZzeF9pbnRlcmxlYXZlKHorMjQpOworICAgIHBhc3NfdnN4X2ludGVybGVhdmUoeixmZl9jb3NfMzIsNCk7Cit9CisKK3N0YXRpYyB2b2lkIGZmdDY0X3ZzeF9pbnRlcmxlYXZlKEZGVENvbXBsZXggKnopCit7CisgICAgZmZ0MzJfdnN4X2ludGVybGVhdmUoeik7CisgICAgZmZ0MTZfdnN4X2ludGVybGVhdmUoeiszMik7CisgICAgZmZ0MTZfdnN4X2ludGVybGVhdmUoeis0OCk7CisgICAgcGFzc192c3hfaW50ZXJsZWF2ZSh6LGZmX2Nvc182NCwgOCk7Cit9CitzdGF0aWMgdm9pZCBmZnQxMjhfdnN4X2ludGVybGVhdmUoRkZUQ29tcGxleCAqeikKK3sKKyAgICBmZnQ2NF92c3hfaW50ZXJsZWF2ZSh6KTsKKyAgICBmZnQzMl92c3hfaW50ZXJsZWF2ZSh6KzY0KTsKKyAgICBmZnQzMl92c3hfaW50ZXJsZWF2ZSh6Kzk2KTsKKyAgICBwYXNzX3ZzeF9pbnRlcmxlYXZlKHosZmZfY29zXzEyOCwxNik7Cit9CitzdGF0aWMgdm9pZCBmZnQyNTZfdnN4X2ludGVybGVhdmUoRkZUQ29tcGxleCAqeikKK3sKKyAgICBmZnQxMjhfdnN4X2ludGVybGVhdmUoeik7CisgICAgZmZ0NjRfdnN4X2ludGVybGVhdmUoeisxMjgpOworICAgIGZmdDY0X3ZzeF9pbnRlcmxlYXZlKHorMTkyKTsKKyAgICBwYXNzX3ZzeF9pbnRlcmxlYXZlKHosZmZfY29zXzI1NiwzMik7Cit9CitzdGF0aWMgdm9pZCBmZnQ1MTJfdnN4X2ludGVybGVhdmUoRkZUQ29tcGxleCAqeikKK3sKKyAgICBmZnQyNTZfdnN4X2ludGVybGVhdmUoeik7CisgICAgZmZ0MTI4X3ZzeF9pbnRlcmxlYXZlKHorMjU2KTsKKyAgICBmZnQxMjhfdnN4X2ludGVybGVhdmUoeiszODQpOworICAgIHBhc3NfdnN4X2ludGVybGVhdmUoeixmZl9jb3NfNTEyLDY0KTsKK30KK3N0YXRpYyB2b2lkIGZmdDEwMjRfdnN4X2ludGVybGVhdmUoRkZUQ29tcGxleCAqeikKK3sKKyAgICBmZnQ1MTJfdnN4X2ludGVybGVhdmUoeik7CisgICAgZmZ0MjU2X3ZzeF9pbnRlcmxlYXZlKHorNTEyKTsKKyAgICBmZnQyNTZfdnN4X2ludGVybGVhdmUoeis3NjgpOworICAgIHBhc3NfdnN4X2ludGVybGVhdmUoeixmZl9jb3NfMTAyNCwxMjgpOworCit9CitzdGF0aWMgdm9pZCBmZnQyMDQ4X3ZzeF9pbnRlcmxlYXZlKEZGVENvbXBsZXggKnopCit7CisgICAgZmZ0MTAyNF92c3hfaW50ZXJsZWF2ZSh6KTsKKyAgICBmZnQ1MTJfdnN4X2ludGVybGVhdmUoeisxMDI0KTsKKyAgICBmZnQ1MTJfdnN4X2ludGVybGVhdmUoeisxNTM2KTsKKyAgICBwYXNzX3ZzeF9pbnRlcmxlYXZlKHosZmZfY29zXzIwNDgsMjU2KTsKK30KK3N0YXRpYyB2b2lkIGZmdDQwOTZfdnN4X2ludGVybGVhdmUoRkZUQ29tcGxleCAqeikKK3sKKyAgICBmZnQyMDQ4X3ZzeF9pbnRlcmxlYXZlKHopOworICAgIGZmdDEwMjRfdnN4X2ludGVybGVhdmUoeisyMDQ4KTsKKyAgICBmZnQxMDI0X3ZzeF9pbnRlcmxlYXZlKHorMzA3Mik7CisgICAgcGFzc192c3hfaW50ZXJsZWF2ZSh6LGZmX2Nvc180MDk2LCA1MTIpOworfQorc3RhdGljIHZvaWQgZmZ0ODE5Ml92c3hfaW50ZXJsZWF2ZShGRlRDb21wbGV4ICp6KQoreworICAgIGZmdDQwOTZfdnN4X2ludGVybGVhdmUoeik7CisgICAgZmZ0MjA0OF92c3hfaW50ZXJsZWF2ZSh6KzQwOTYpOworICAgIGZmdDIwNDhfdnN4X2ludGVybGVhdmUoeis2MTQ0KTsKKyAgICBwYXNzX3ZzeF9pbnRlcmxlYXZlKHosZmZfY29zXzgxOTIsMTAyNCk7Cit9CitzdGF0aWMgdm9pZCBmZnQxNjM4NF92c3hfaW50ZXJsZWF2ZShGRlRDb21wbGV4ICp6KQoreworICAgIGZmdDgxOTJfdnN4X2ludGVybGVhdmUoeik7CisgICAgZmZ0NDA5Nl92c3hfaW50ZXJsZWF2ZSh6KzgxOTIpOworICAgIGZmdDQwOTZfdnN4X2ludGVybGVhdmUoeisxMjI4OCk7CisgICAgcGFzc192c3hfaW50ZXJsZWF2ZSh6LGZmX2Nvc18xNjM4NCwyMDQ4KTsKK30KK3N0YXRpYyB2b2lkIGZmdDMyNzY4X3ZzeF9pbnRlcmxlYXZlKEZGVENvbXBsZXggKnopCit7CisgICAgZmZ0MTYzODRfdnN4X2ludGVybGVhdmUoeik7CisgICAgZmZ0ODE5Ml92c3hfaW50ZXJsZWF2ZSh6KzE2Mzg0KTsKKyAgICBmZnQ4MTkyX3ZzeF9pbnRlcmxlYXZlKHorMjQ1NzYpOworICAgIHBhc3NfdnN4X2ludGVybGVhdmUoeixmZl9jb3NfMzI3NjgsNDA5Nik7Cit9CitzdGF0aWMgdm9pZCBmZnQ2NTUzNl92c3hfaW50ZXJsZWF2ZShGRlRDb21wbGV4ICp6KQoreworICAgIGZmdDMyNzY4X3ZzeF9pbnRlcmxlYXZlKHopOworICAgIGZmdDE2Mzg0X3ZzeF9pbnRlcmxlYXZlKHorMzI3NjgpOworICAgIGZmdDE2Mzg0X3ZzeF9pbnRlcmxlYXZlKHorNDkxNTIpOworICAgIHBhc3NfdnN4X2ludGVybGVhdmUoeixmZl9jb3NfNjU1MzYsODE5Mik7Cit9CisKK3N0YXRpYyB2b2lkIGZmdDMyX3ZzeChGRlRDb21wbGV4ICp6KQoreworICAgIGZmdDE2X3ZzeCh6KTsKKyAgICBmZnQ4X3ZzeCh6KzE2KTsKKyAgICBmZnQ4X3ZzeCh6KzI0KTsKKyAgICBwYXNzX3ZzeCh6LGZmX2Nvc18zMiw0KTsKK30KKworc3RhdGljIHZvaWQgZmZ0NjRfdnN4KEZGVENvbXBsZXggKnopCit7CisgICAgZmZ0MzJfdnN4KHopOworICAgIGZmdDE2X3ZzeCh6KzMyKTsKKyAgICBmZnQxNl92c3goeis0OCk7CisgICAgcGFzc192c3goeixmZl9jb3NfNjQsIDgpOworfQorc3RhdGljIHZvaWQgZmZ0MTI4X3ZzeChGRlRDb21wbGV4ICp6KQoreworICAgIGZmdDY0X3ZzeCh6KTsKKyAgICBmZnQzMl92c3goeis2NCk7CisgICAgZmZ0MzJfdnN4KHorOTYpOworICAgIHBhc3NfdnN4KHosZmZfY29zXzEyOCwxNik7Cit9CitzdGF0aWMgdm9pZCBmZnQyNTZfdnN4KEZGVENvbXBsZXggKnopCit7CisgICAgZmZ0MTI4X3ZzeCh6KTsKKyAgICBmZnQ2NF92c3goeisxMjgpOworICAgIGZmdDY0X3ZzeCh6KzE5Mik7CisgICAgcGFzc192c3goeixmZl9jb3NfMjU2LDMyKTsKK30KK3N0YXRpYyB2b2lkIGZmdDUxMl92c3goRkZUQ29tcGxleCAqeikKK3sKKyAgICBmZnQyNTZfdnN4KHopOworICAgIGZmdDEyOF92c3goeisyNTYpOworICAgIGZmdDEyOF92c3goeiszODQpOworICAgIHBhc3NfdnN4KHosZmZfY29zXzUxMiw2NCk7Cit9CitzdGF0aWMgdm9pZCBmZnQxMDI0X3ZzeChGRlRDb21wbGV4ICp6KQoreworICAgIGZmdDUxMl92c3goeik7CisgICAgZmZ0MjU2X3ZzeCh6KzUxMik7CisgICAgZmZ0MjU2X3ZzeCh6Kzc2OCk7CisgICAgcGFzc192c3goeixmZl9jb3NfMTAyNCwxMjgpOworCit9CitzdGF0aWMgdm9pZCBmZnQyMDQ4X3ZzeChGRlRDb21wbGV4ICp6KQoreworICAgIGZmdDEwMjRfdnN4KHopOworICAgIGZmdDUxMl92c3goeisxMDI0KTsKKyAgICBmZnQ1MTJfdnN4KHorMTUzNik7CisgICAgcGFzc192c3goeixmZl9jb3NfMjA0OCwyNTYpOworfQorc3RhdGljIHZvaWQgZmZ0NDA5Nl92c3goRkZUQ29tcGxleCAqeikKK3sKKyAgICBmZnQyMDQ4X3ZzeCh6KTsKKyAgICBmZnQxMDI0X3ZzeCh6KzIwNDgpOworICAgIGZmdDEwMjRfdnN4KHorMzA3Mik7CisgICAgcGFzc192c3goeixmZl9jb3NfNDA5NiwgNTEyKTsKK30KK3N0YXRpYyB2b2lkIGZmdDgxOTJfdnN4KEZGVENvbXBsZXggKnopCit7CisgICAgZmZ0NDA5Nl92c3goeik7CisgICAgZmZ0MjA0OF92c3goeis0MDk2KTsKKyAgICBmZnQyMDQ4X3ZzeCh6KzYxNDQpOworICAgIHBhc3NfdnN4KHosZmZfY29zXzgxOTIsMTAyNCk7Cit9CitzdGF0aWMgdm9pZCBmZnQxNjM4NF92c3goRkZUQ29tcGxleCAqeikKK3sKKyAgICBmZnQ4MTkyX3ZzeCh6KTsKKyAgICBmZnQ0MDk2X3ZzeCh6KzgxOTIpOworICAgIGZmdDQwOTZfdnN4KHorMTIyODgpOworICAgIHBhc3NfdnN4KHosZmZfY29zXzE2Mzg0LDIwNDgpOworfQorc3RhdGljIHZvaWQgZmZ0MzI3NjhfdnN4KEZGVENvbXBsZXggKnopCit7CisgICAgZmZ0MTYzODRfdnN4KHopOworICAgIGZmdDgxOTJfdnN4KHorMTYzODQpOworICAgIGZmdDgxOTJfdnN4KHorMjQ1NzYpOworICAgIHBhc3NfdnN4KHosZmZfY29zXzMyNzY4LDQwOTYpOworfQorc3RhdGljIHZvaWQgZmZ0NjU1MzZfdnN4KEZGVENvbXBsZXggKnopCit7CisgICAgZmZ0MzI3NjhfdnN4KHopOworICAgIGZmdDE2Mzg0X3ZzeCh6KzMyNzY4KTsKKyAgICBmZnQxNjM4NF92c3goeis0OTE1Mik7CisgICAgcGFzc192c3goeixmZl9jb3NfNjU1MzYsODE5Mik7Cit9CisKK3N0YXRpYyB2b2lkICgqIGNvbnN0IGZmdF9kaXNwYXRjaF92c3hbXSkoRkZUQ29tcGxleCopID0geworICAgIGZmdDRfdnN4LCBmZnQ4X3ZzeCwgZmZ0MTZfdnN4LCBmZnQzMl92c3gsIGZmdDY0X3ZzeCwgZmZ0MTI4X3ZzeCwgZmZ0MjU2X3ZzeCwgZmZ0NTEyX3ZzeCwgZmZ0MTAyNF92c3gsCisgICAgZmZ0MjA0OF92c3gsIGZmdDQwOTZfdnN4LCBmZnQ4MTkyX3ZzeCwgZmZ0MTYzODRfdnN4LCBmZnQzMjc2OF92c3gsIGZmdDY1NTM2X3ZzeCwKK307CitzdGF0aWMgdm9pZCAoKiBjb25zdCBmZnRfZGlzcGF0Y2hfdnN4X2ludGVybGVhdmVbXSkoRkZUQ29tcGxleCopID0geworICAgIGZmdDRfdnN4X2ludGVybGVhdmUsIGZmdDhfdnN4X2ludGVybGVhdmUsIGZmdDE2X3ZzeF9pbnRlcmxlYXZlLCBmZnQzMl92c3hfaW50ZXJsZWF2ZSwgZmZ0NjRfdnN4X2ludGVybGVhdmUsCisgICAgZmZ0MTI4X3ZzeF9pbnRlcmxlYXZlLCBmZnQyNTZfdnN4X2ludGVybGVhdmUsIGZmdDUxMl92c3hfaW50ZXJsZWF2ZSwgZmZ0MTAyNF92c3hfaW50ZXJsZWF2ZSwKKyAgICBmZnQyMDQ4X3ZzeF9pbnRlcmxlYXZlLCBmZnQ0MDk2X3ZzeF9pbnRlcmxlYXZlLCBmZnQ4MTkyX3ZzeF9pbnRlcmxlYXZlLCBmZnQxNjM4NF92c3hfaW50ZXJsZWF2ZSwgZmZ0MzI3NjhfdnN4X2ludGVybGVhdmUsIGZmdDY1NTM2X3ZzeF9pbnRlcmxlYXZlLAorfTsKK3ZvaWQgZmZfZmZ0X2NhbGNfaW50ZXJsZWF2ZV92c3goRkZUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqeikKK3sKKyAgICAgZmZ0X2Rpc3BhdGNoX3ZzeF9pbnRlcmxlYXZlW3MtPm5iaXRzLTJdKHopOworfQordm9pZCBmZl9mZnRfY2FsY192c3goRkZUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqeikKK3sKKyAgICAgZmZ0X2Rpc3BhdGNoX3ZzeFtzLT5uYml0cy0yXSh6KTsKK30KKyNlbmRpZiAvKiBIQVZFX1ZTWCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2ZmdF92c3guaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9mZnRfdnN4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1NDc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9mZnRfdnN4LmgKQEAgLTAsMCArMSw4MzAgQEAKKyNpZm5kZWYgQVZDT0RFQ19QUENfRkZUX1ZTWF9ICisjZGVmaW5lIEFWQ09ERUNfUFBDX0ZGVF9WU1hfSAorLyoKKyAqIEZGVCAgdHJhbnNmb3JtLCBvcHRpbWl6ZWQgd2l0aCBWU1ggYnVpbHQtaW4gZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUm9uZyBZYW4gIENvcHlyaWdodCAoYykgMjAwOSBMb3JlbiBNZXJyaXR0CisgKgorICogVGhpcyBhbGdvcml0aG0gKHRob3VnaCBub3QgYW55IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzKSBpcworICogYmFzZWQgb24gbGliZGpiZmZ0IGJ5IEQuIEouIEJlcm5zdGVpbiwgYW5kIGZmdF9hbHRpdmVjX3MuUy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9mZnQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ZmdC1pbnRlcm5hbC5oIgorCisjaWYgSEFWRV9WU1gKKwordm9pZCBmZl9mZnRfY2FsY19pbnRlcmxlYXZlX3ZzeChGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KTsKK3ZvaWQgZmZfZmZ0X2NhbGNfdnN4KEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopOworCisKKyNkZWZpbmUgYnl0ZV8yY29tcGxleCAoMipzaXplb2YoRkZUQ29tcGxleCkpCisjZGVmaW5lIGJ5dGVfNGNvbXBsZXggKDQqc2l6ZW9mKEZGVENvbXBsZXgpKQorI2RlZmluZSBieXRlXzZjb21wbGV4ICg2KnNpemVvZihGRlRDb21wbGV4KSkKKyNkZWZpbmUgYnl0ZV84Y29tcGxleCAoOCpzaXplb2YoRkZUQ29tcGxleCkpCisjZGVmaW5lIGJ5dGVfMTBjb21wbGV4ICgxMCpzaXplb2YoRkZUQ29tcGxleCkpCisjZGVmaW5lIGJ5dGVfMTJjb21wbGV4ICgxMipzaXplb2YoRkZUQ29tcGxleCkpCisjZGVmaW5lIGJ5dGVfMTRjb21wbGV4ICgxNCpzaXplb2YoRkZUQ29tcGxleCkpCisKK2lubGluZSBzdGF0aWMgdm9pZCBwYXNzX3ZzeF9pbnRlcmxlYXZlKEZGVENvbXBsZXggKnosIGNvbnN0IEZGVFNhbXBsZSAqd3JlLCB1bnNpZ25lZCBpbnQgbikKK3sKKyAgICBpbnQgbzEgPSBuPDwxOworICAgIGludCBvMiA9IG48PDI7CisgICAgaW50IG8zID0gbzErbzI7CisgICAgaW50IGkxLCBpMiwgaTM7CisgICAgRkZUU2FtcGxlKiBvdXQgPSAoRkZUU2FtcGxlKil6OworICAgIGNvbnN0IEZGVFNhbXBsZSAqd2ltID0gd3JlK28xOworICAgIHZlY19mIHZ6MCwgdnpvMSwgdnpvMiwgdnpvMzsKKyAgICB2ZWNfZiB4MCwgeDEsIHgyLCB4MzsKKyAgICB2ZWNfZiB4NCwgeDUsIHg2LCB4NzsKKyAgICB2ZWNfZiB4OCwgeDksIHgxMCwgeDExOworICAgIHZlY19mIHgxMiwgeDEzLCB4MTQsIHgxNTsKKyAgICB2ZWNfZiB4MTYsIHgxNywgeDE4LCB4MTk7CisgICAgdmVjX2YgeDIwLCB4MjEsIHgyMiwgeDIzOworICAgIHZlY19mIHZ6MHBsdXMxLCB2em8xcGx1czEsIHZ6bzJwbHVzMSwgdnpvM3BsdXMxOworICAgIHZlY19mIHkwLCB5MSwgeTIsIHkzOworICAgIHZlY19mIHk0LCB5NSwgeTgsIHk5OworICAgIHZlY19mIHkxMCwgeTEzLCB5MTQsIHkxNTsKKyAgICB2ZWNfZiB5MTYsIHkxNywgeTE4LCB5MTk7CisgICAgdmVjX2YgeTIwLCB5MjEsIHkyMiwgeTIzOworICAgIHZlY19mIHdyMSwgd2kxLCB3cjAsIHdpMDsKKyAgICB2ZWNfZiB3cjIsIHdpMiwgd3IzLCB3aTM7CisgICAgdmVjX2YgeG11bHdpMCwgeG11bHdpMSwgeW11bHdpMiwgeW11bHdpMzsKKworICAgIG4gPSBuLTI7CisgICAgaTEgPSBvMSpzaXplb2YoRkZUQ29tcGxleCk7CisgICAgaTIgPSBvMipzaXplb2YoRkZUQ29tcGxleCk7CisgICAgaTMgPSBvMypzaXplb2YoRkZUQ29tcGxleCk7CisgICAgdnpvMiA9IHZlY19sZChpMiwgJihvdXRbMF0pKTsgIC8vIHpvMi5yICB6bzIuaSAgeihvMisxKS5yICB6KG8yKzEpLmkKKyAgICB2em8ycGx1czEgPSB2ZWNfbGQoaTIrMTYsICYob3V0WzBdKSk7CisgICAgdnpvMyA9IHZlY19sZChpMywgJihvdXRbMF0pKTsgIC8vIHpvMy5yICB6bzMuaSAgeihvMysxKS5yICB6KG8zKzEpLmkKKyAgICB2em8zcGx1czEgPSB2ZWNfbGQoaTMrMTYsICYob3V0WzBdKSk7CisgICAgdnowID0gdmVjX2xkKDAsICYob3V0WzBdKSk7ICAgIC8vIHowLnIgIHowLmkgIHoxLnIgIHoxLmkKKyAgICB2ejBwbHVzMSA9IHZlY19sZCgxNiwgJihvdXRbMF0pKTsKKyAgICB2em8xID0gdmVjX2xkKGkxLCAmKG91dFswXSkpOyAgLy8gem8xLnIgIHpvMS5pICB6KG8xKzEpLnIgIHoobzErMSkuaQorICAgIHZ6bzFwbHVzMSA9IHZlY19sZChpMSsxNiwgJihvdXRbMF0pKTsKKworICAgIHgwID0gdmVjX2FkZCh2em8yLCB2em8zKTsKKyAgICB4MSA9IHZlY19zdWIodnpvMiwgdnpvMyk7CisgICAgeTAgPSB2ZWNfYWRkKHZ6bzJwbHVzMSwgdnpvM3BsdXMxKTsKKyAgICB5MSA9IHZlY19zdWIodnpvMnBsdXMxLCB2em8zcGx1czEpOworCisgICAgd3IxID0gdmVjX3NwbGF0cyh3cmVbMV0pOworICAgIHdpMSA9IHZlY19zcGxhdHMod2ltWy0xXSk7CisgICAgd2kyID0gdmVjX3NwbGF0cyh3aW1bLTJdKTsKKyAgICB3aTMgPSB2ZWNfc3BsYXRzKHdpbVstM10pOworICAgIHdyMiA9IHZlY19zcGxhdHMod3JlWzJdKTsKKyAgICB3cjMgPSB2ZWNfc3BsYXRzKHdyZVszXSk7CisKKyAgICB4MiA9IHZlY19wZXJtKHgwLCB4MSwgdmNwcm0oMixzMiwzLHMzKSk7CisgICAgeDMgPSB2ZWNfcGVybSh4MCwgeDEsIHZjcHJtKHMzLDMsczIsMikpOworCisgICAgeTQgPSB2ZWNfcGVybSh5MCwgeTEsIHZjcHJtKHMxLDEsczAsMCkpOworICAgIHk1ID0gdmVjX3Blcm0oeTAsIHkxLCB2Y3BybShzMywzLHMyLDIpKTsKKyAgICB5MiA9IHZlY19wZXJtKHkwLCB5MSwgdmNwcm0oMCxzMCwxLHMxKSk7CisgICAgeTMgPSB2ZWNfcGVybSh5MCwgeTEsIHZjcHJtKDIsczIsMyxzMykpOworCisgICAgeW11bHdpMiA9IHZlY19tdWwoeTQsIHdpMik7CisgICAgeW11bHdpMyA9IHZlY19tdWwoeTUsIHdpMyk7CisgICAgeDQgPSB2ZWNfbXVsKHgyLCB3cjEpOworICAgIHg1ID0gdmVjX211bCh4Mywgd2kxKTsKKyAgICB5OCA9IHZlY19tYWRkKHkyLCB3cjIsIHltdWx3aTIpOworICAgIHk5ID0gdmVjX21zdWIoeTIsIHdyMiwgeW11bHdpMik7CisgICAgeDYgPSB2ZWNfYWRkKHg0LCB4NSk7CisgICAgeDcgPSB2ZWNfc3ViKHg0LCB4NSk7CisgICAgeTEzID0gdmVjX21hZGQoeTMsIHdyMywgeW11bHdpMyk7CisgICAgeTE0ID0gdmVjX21zdWIoeTMsIHdyMywgeW11bHdpMyk7CisKKyAgICB4OCA9IHZlY19wZXJtKHg2LCB4NywgdmNwcm0oMCwxLHMyLHMzKSk7CisgICAgeTEwID0gdmVjX3Blcm0oeTgsIHk5LCB2Y3BybSgwLDEsczIsczMpKTsKKyAgICB5MTUgPSB2ZWNfcGVybSh5MTMsIHkxNCwgdmNwcm0oMCwxLHMyLHMzKSk7CisKKyAgICB4OSA9IHZlY19wZXJtKHgwLCB4OCwgdmNwcm0oMCwxLHMwLHMyKSk7CisgICAgeDEwID0gdmVjX3Blcm0oeDEsIHg4LCB2Y3BybSgxLDAsczMsczEpKTsKKworICAgIHkxNiA9IHZlY19wZXJtKHkxMCwgeTE1LCB2Y3BybSgwLDIsczAsczIpKTsKKyAgICB5MTcgPSB2ZWNfcGVybSh5MTAsIHkxNSwgdmNwcm0oMywxLHMzLHMxKSk7CisKKyAgICB4MTEgPSB2ZWNfYWRkKHZ6MCwgeDkpOworICAgIHgxMiA9IHZlY19zdWIodnowLCB4OSk7CisgICAgeDEzID0gdmVjX2FkZCh2em8xLCB4MTApOworICAgIHgxNCA9IHZlY19zdWIodnpvMSwgeDEwKTsKKworICAgIHkxOCA9IHZlY19hZGQodnowcGx1czEsIHkxNik7CisgICAgeTE5ID0gdmVjX3N1Yih2ejBwbHVzMSwgeTE2KTsKKyAgICB5MjAgPSB2ZWNfYWRkKHZ6bzFwbHVzMSwgeTE3KTsKKyAgICB5MjEgPSB2ZWNfc3ViKHZ6bzFwbHVzMSwgeTE3KTsKKworICAgIHgxNSA9IHZlY19wZXJtKHgxMywgeDE0LCB2Y3BybSgwLHMxLDIsczMpKTsKKyAgICB4MTYgPSB2ZWNfcGVybSh4MTMsIHgxNCwgdmNwcm0oczAsMSxzMiwzKSk7CisgICAgeTIyID0gdmVjX3Blcm0oeTIwLCB5MjEsIHZjcHJtKDAsczEsMixzMykpOworICAgIHkyMyA9IHZlY19wZXJtKHkyMCwgeTIxLCB2Y3BybShzMCwxLHMyLDMpKTsKKworCisgICAgdmVjX3N0KHgxMSwgMCwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3QoeTE4LCAxNiwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3QoeDE1LCBpMSwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3QoeTIyLCBpMSsxNiwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3QoeDEyLCBpMiwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3QoeTE5LCBpMisxNiwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3QoeDE2LCBpMywgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3QoeTIzLCBpMysxNiwgJihvdXRbMF0pKTsKKworICAgIGRvIHsKKyAgICAgICAgb3V0ICs9IDg7CisgICAgICAgIHdyZSArPSA0OworICAgICAgICB3aW0gLT0gNDsKKyAgICAgICAgd3IwID0gdmVjX3NwbGF0cyh3cmVbMF0pOworICAgICAgICB3cjEgPSB2ZWNfc3BsYXRzKHdyZVsxXSk7CisgICAgICAgIHdpMCA9IHZlY19zcGxhdHMod2ltWzBdKTsKKyAgICAgICAgd2kxID0gdmVjX3NwbGF0cyh3aW1bLTFdKTsKKworICAgICAgICB3cjIgPSB2ZWNfc3BsYXRzKHdyZVsyXSk7CisgICAgICAgIHdyMyA9IHZlY19zcGxhdHMod3JlWzNdKTsKKyAgICAgICAgd2kyID0gdmVjX3NwbGF0cyh3aW1bLTJdKTsKKyAgICAgICAgd2kzID0gdmVjX3NwbGF0cyh3aW1bLTNdKTsKKworICAgICAgICB2em8yID0gdmVjX2xkKGkyLCAmKG91dFswXSkpOyAgLy8gem8yLnIgIHpvMi5pICB6KG8yKzEpLnIgIHoobzIrMSkuaQorICAgICAgICB2em8ycGx1czEgPSB2ZWNfbGQoaTIrMTYsICYob3V0WzBdKSk7CisgICAgICAgIHZ6bzMgPSB2ZWNfbGQoaTMsICYob3V0WzBdKSk7ICAvLyB6bzMuciAgem8zLmkgIHoobzMrMSkuciAgeihvMysxKS5pCisgICAgICAgIHZ6bzNwbHVzMSA9IHZlY19sZChpMysxNiwgJihvdXRbMF0pKTsKKyAgICAgICAgdnowID0gdmVjX2xkKDAsICYob3V0WzBdKSk7ICAgIC8vIHowLnIgIHowLmkgIHoxLnIgIHoxLmkKKyAgICAgICAgdnowcGx1czEgPSB2ZWNfbGQoMTYsICYob3V0WzBdKSk7CisgICAgICAgIHZ6bzEgPSB2ZWNfbGQoaTEsICYob3V0WzBdKSk7IC8vIHpvMS5yICB6bzEuaSAgeihvMSsxKS5yICB6KG8xKzEpLmkKKyAgICAgICAgdnpvMXBsdXMxID0gdmVjX2xkKGkxKzE2LCAmKG91dFswXSkpOworCisgICAgICAgIHgwID0gdmVjX2FkZCh2em8yLCB2em8zKTsKKyAgICAgICAgeDEgPSB2ZWNfc3ViKHZ6bzIsIHZ6bzMpOworCisgICAgICAgIHkwID0gdmVjX2FkZCh2em8ycGx1czEsIHZ6bzNwbHVzMSk7CisgICAgICAgIHkxID0gdmVjX3N1Yih2em8ycGx1czEsIHZ6bzNwbHVzMSk7CisKKyAgICAgICAgeDQgPSB2ZWNfcGVybSh4MCwgeDEsIHZjcHJtKHMxLDEsczAsMCkpOworICAgICAgICB4NSA9IHZlY19wZXJtKHgwLCB4MSwgdmNwcm0oczMsMyxzMiwyKSk7CisgICAgICAgIHgyID0gdmVjX3Blcm0oeDAsIHgxLCB2Y3BybSgwLHMwLDEsczEpKTsKKyAgICAgICAgeDMgPSB2ZWNfcGVybSh4MCwgeDEsIHZjcHJtKDIsczIsMyxzMykpOworCisgICAgICAgIHkyID0gdmVjX3Blcm0oeTAsIHkxLCB2Y3BybSgwLHMwLDEsczEpKTsKKyAgICAgICAgeTMgPSB2ZWNfcGVybSh5MCwgeTEsIHZjcHJtKDIsczIsMyxzMykpOworICAgICAgICB4bXVsd2kwID0gdmVjX211bCh4NCwgd2kwKTsKKyAgICAgICAgeG11bHdpMSA9IHZlY19tdWwoeDUsIHdpMSk7CisKKyAgICAgICAgeTQgPSB2ZWNfcGVybSh5MCwgeTEsIHZjcHJtKHMxLDEsczAsMCkpOworICAgICAgICB5NSA9IHZlY19wZXJtKHkwLCB5MSwgdmNwcm0oczMsMyxzMiwyKSk7CisKKyAgICAgICAgeDggPSB2ZWNfbWFkZCh4Miwgd3IwLCB4bXVsd2kwKTsKKyAgICAgICAgeDkgPSB2ZWNfbXN1Yih4Miwgd3IwLCB4bXVsd2kwKTsKKyAgICAgICAgeW11bHdpMiA9IHZlY19tdWwoeTQsIHdpMik7CisgICAgICAgIHltdWx3aTMgPSB2ZWNfbXVsKHk1LCB3aTMpOworCisgICAgICAgIHgxMyA9IHZlY19tYWRkKHgzLCB3cjEsIHhtdWx3aTEpOworICAgICAgICB4MTQgPSB2ZWNfbXN1Yih4Mywgd3IxLCB4bXVsd2kxKTsKKworICAgICAgICB5OCA9IHZlY19tYWRkKHkyLCB3cjIsIHltdWx3aTIpOworICAgICAgICB5OSA9IHZlY19tc3ViKHkyLCB3cjIsIHltdWx3aTIpOworICAgICAgICB5MTMgPSB2ZWNfbWFkZCh5Mywgd3IzLCB5bXVsd2kzKTsKKyAgICAgICAgeTE0ID0gdmVjX21zdWIoeTMsIHdyMywgeW11bHdpMyk7CisKKyAgICAgICAgeDEwID0gdmVjX3Blcm0oeDgsIHg5LCB2Y3BybSgwLDEsczIsczMpKTsKKyAgICAgICAgeDE1ID0gdmVjX3Blcm0oeDEzLCB4MTQsIHZjcHJtKDAsMSxzMixzMykpOworCisgICAgICAgIHkxMCA9IHZlY19wZXJtKHk4LCB5OSwgdmNwcm0oMCwxLHMyLHMzKSk7CisgICAgICAgIHkxNSA9IHZlY19wZXJtKHkxMywgeTE0LCB2Y3BybSgwLDEsczIsczMpKTsKKworICAgICAgICB4MTYgPSB2ZWNfcGVybSh4MTAsIHgxNSwgdmNwcm0oMCwyLHMwLHMyKSk7CisgICAgICAgIHgxNyA9IHZlY19wZXJtKHgxMCwgeDE1LCB2Y3BybSgzLDEsczMsczEpKTsKKworICAgICAgICB5MTYgPSB2ZWNfcGVybSh5MTAsIHkxNSwgdmNwcm0oMCwyLHMwLHMyKSk7CisgICAgICAgIHkxNyA9IHZlY19wZXJtKHkxMCwgeTE1LCB2Y3BybSgzLDEsczMsczEpKTsKKworICAgICAgICB4MTggPSB2ZWNfYWRkKHZ6MCwgeDE2KTsKKyAgICAgICAgeDE5ID0gdmVjX3N1Yih2ejAsIHgxNik7CisgICAgICAgIHgyMCA9IHZlY19hZGQodnpvMSwgeDE3KTsKKyAgICAgICAgeDIxID0gdmVjX3N1Yih2em8xLCB4MTcpOworCisgICAgICAgIHkxOCA9IHZlY19hZGQodnowcGx1czEsIHkxNik7CisgICAgICAgIHkxOSA9IHZlY19zdWIodnowcGx1czEsIHkxNik7CisgICAgICAgIHkyMCA9IHZlY19hZGQodnpvMXBsdXMxLCB5MTcpOworICAgICAgICB5MjEgPSB2ZWNfc3ViKHZ6bzFwbHVzMSwgeTE3KTsKKworICAgICAgICB4MjIgPSB2ZWNfcGVybSh4MjAsIHgyMSwgdmNwcm0oMCxzMSwyLHMzKSk7CisgICAgICAgIHgyMyA9IHZlY19wZXJtKHgyMCwgeDIxLCB2Y3BybShzMCwxLHMyLDMpKTsKKworICAgICAgICB5MjIgPSB2ZWNfcGVybSh5MjAsIHkyMSwgdmNwcm0oMCxzMSwyLHMzKSk7CisgICAgICAgIHkyMyA9IHZlY19wZXJtKHkyMCwgeTIxLCB2Y3BybShzMCwxLHMyLDMpKTsKKworICAgICAgICB2ZWNfc3QoeDE4LCAwLCAmKG91dFswXSkpOworICAgICAgICB2ZWNfc3QoeTE4LCAxNiwgJihvdXRbMF0pKTsKKyAgICAgICAgdmVjX3N0KHgyMiwgaTEsICYob3V0WzBdKSk7CisgICAgICAgIHZlY19zdCh5MjIsIGkxKzE2LCAmKG91dFswXSkpOworICAgICAgICB2ZWNfc3QoeDE5LCBpMiwgJihvdXRbMF0pKTsKKyAgICAgICAgdmVjX3N0KHkxOSwgaTIrMTYsICYob3V0WzBdKSk7CisgICAgICAgIHZlY19zdCh4MjMsIGkzLCAmKG91dFswXSkpOworICAgICAgICB2ZWNfc3QoeTIzLCBpMysxNiwgJihvdXRbMF0pKTsKKyAgICB9IHdoaWxlIChuLT0yKTsKK30KKworaW5saW5lIHN0YXRpYyB2b2lkIGZmdDJfdnN4X2ludGVybGVhdmUoRkZUQ29tcGxleCAqeikKK3sKKyAgICBGRlRTYW1wbGUgcjEsIGkxOworCisgICAgcjEgPSB6WzBdLnJlIC0gelsxXS5yZTsKKyAgICB6WzBdLnJlICs9IHpbMV0ucmU7CisgICAgelsxXS5yZSA9IHIxOworCisgICAgaTEgPSB6WzBdLmltIC0gelsxXS5pbTsKKyAgICB6WzBdLmltICs9IHpbMV0uaW07CisgICAgelsxXS5pbSA9IGkxOworIH0KKworaW5saW5lIHN0YXRpYyB2b2lkIGZmdDRfdnN4X2ludGVybGVhdmUoRkZUQ29tcGxleCAqeikKK3sKKyAgICB2ZWNfZiBhLCBiLCBjLCBkOworICAgIGZsb2F0KiBvdXQ9ICAoZmxvYXQqKXo7CisgICAgYSA9IHZlY19sZCgwLCAmKG91dFswXSkpOworICAgIGIgPSB2ZWNfbGQoYnl0ZV8yY29tcGxleCwgJihvdXRbMF0pKTsKKworICAgIGMgPSB2ZWNfcGVybShhLCBiLCB2Y3BybSgwLDEsczIsczEpKTsKKyAgICBkID0gdmVjX3Blcm0oYSwgYiwgdmNwcm0oMiwzLHMwLHMzKSk7CisgICAgYSA9IHZlY19hZGQoYywgZCk7CisgICAgYiA9IHZlY19zdWIoYywgZCk7CisKKyAgICBjID0gdmVjX3Blcm0oYSwgYiwgdmNwcm0oMCwxLHMwLHMxKSk7CisgICAgZCA9IHZlY19wZXJtKGEsIGIsIHZjcHJtKDIsMyxzMyxzMikpOworCisgICAgYSA9IHZlY19hZGQoYywgZCk7CisgICAgYiA9IHZlY19zdWIoYywgZCk7CisgICAgdmVjX3N0KGEsIDAsICYob3V0WzBdKSk7CisgICAgdmVjX3N0KGIsIGJ5dGVfMmNvbXBsZXgsICYob3V0WzBdKSk7Cit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBmZnQ4X3ZzeF9pbnRlcmxlYXZlKEZGVENvbXBsZXggKnopCit7CisgICAgdmVjX2YgdnowLCB2ejEsIHZ6MiwgdnozOworICAgIHZlY19mIHgwLCB4MSwgeDIsIHgzOworICAgIHZlY19mIHg0LCB4NSwgeDYsIHg3OworICAgIHZlY19mIHg4LCB4OSwgeDEwLCB4MTE7CisgICAgdmVjX2YgeDEyLCB4MTMsIHgxNCwgeDE1OworICAgIHZlY19mIHgxNiwgeDE3LCB4MTgsIHgxOTsKKyAgICB2ZWNfZiB4MjAsIHgyMSwgeDIyLCB4MjM7CisgICAgdmVjX2YgeDI0LCB4MjUsIHgyNiwgeDI3OworICAgIHZlY19mIHgyOCwgeDI5LCB4MzAsIHgzMTsKKyAgICB2ZWNfZiB4MzIsIHgzMywgeDM0OworCisgICAgZmxvYXQqIG91dD0gIChmbG9hdCopejsKKyAgICB2ZWNfZiB2YzEgPSB7c3FydGhhbGYsIHNxcnRoYWxmLCBzcXJ0aGFsZiwgc3FydGhhbGZ9OworCisgICAgdnowID0gdmVjX2xkKDAsICYob3V0WzBdKSk7CisgICAgdnoxID0gdmVjX2xkKGJ5dGVfMmNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdnoyID0gdmVjX2xkKGJ5dGVfNGNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdnozID0gdmVjX2xkKGJ5dGVfNmNvbXBsZXgsICYob3V0WzBdKSk7CisKKyAgICB4MCA9IHZlY19wZXJtKHZ6MCwgdnoxLCB2Y3BybSgwLDEsczIsczEpKTsKKyAgICB4MSA9IHZlY19wZXJtKHZ6MCwgdnoxLCB2Y3BybSgyLDMsczAsczMpKTsKKyAgICB4MiA9IHZlY19wZXJtKHZ6MiwgdnozLCB2Y3BybSgyLDEsczAsczEpKTsKKyAgICB4MyA9IHZlY19wZXJtKHZ6MiwgdnozLCB2Y3BybSgwLDMsczIsczMpKTsKKworICAgIHg0ID0gdmVjX2FkZCh4MCwgeDEpOworICAgIHg1ID0gdmVjX3N1Yih4MCwgeDEpOworICAgIHg2ID0gdmVjX2FkZCh4MiwgeDMpOworICAgIHg3ID0gdmVjX3N1Yih4MiwgeDMpOworCisgICAgeDggPSB2ZWNfcGVybSh4NCwgeDUsIHZjcHJtKDAsMSxzMCxzMSkpOworICAgIHg5ID0gdmVjX3Blcm0oeDQsIHg1LCB2Y3BybSgyLDMsczMsczIpKTsKKyAgICB4MTAgPSB2ZWNfcGVybSh4NiwgeDcsIHZjcHJtKDIsMSxzMixzMSkpOworICAgIHgxMSA9IHZlY19wZXJtKHg2LCB4NywgdmNwcm0oMCwzLHMwLHMzKSk7CisKKyAgICB4MTIgPSB2ZWNfYWRkKHg4LCB4OSk7CisgICAgeDEzID0gdmVjX3N1Yih4OCwgeDkpOworICAgIHgxNCA9IHZlY19hZGQoeDEwLCB4MTEpOworICAgIHgxNSA9IHZlY19zdWIoeDEwLCB4MTEpOworICAgIHgxNiA9IHZlY19wZXJtKHgxMiwgeDEzLCB2Y3BybSgwLHMwLDEsczEpKTsKKyAgICB4MTcgPSB2ZWNfcGVybSh4MTQsIHgxNSwgdmNwcm0oMCxzMCwxLHMxKSk7CisgICAgeDE4ID0gdmVjX3Blcm0oeDE2LCB4MTcsIHZjcHJtKHMwLHMzLHMyLHMxKSk7CisgICAgeDE5ID0gdmVjX2FkZCh4MTYsIHgxOCk7IC8vIHowLnIgIHoyLnIgIHowLmkgIHoyLmkKKyAgICB4MjAgPSB2ZWNfc3ViKHgxNiwgeDE4KTsgLy8gejQuciAgejYuciAgejQuaSAgejYuaQorCisgICAgeDIxID0gdmVjX3Blcm0oeDEyLCB4MTMsIHZjcHJtKDIsczIsMyxzMykpOworICAgIHgyMiA9IHZlY19wZXJtKHgxNCwgeDE1LCB2Y3BybSgyLDMsczIsczMpKTsKKyAgICB4MjMgPSB2ZWNfcGVybSh4MTQsIHgxNSwgdmNwcm0oMywyLHMzLHMyKSk7CisgICAgeDI0ID0gdmVjX2FkZCh4MjIsIHgyMyk7CisgICAgeDI1ID0gdmVjX3N1Yih4MjIsIHgyMyk7CisgICAgeDI2ID0gdmVjX211bCggdmVjX3Blcm0oeDI0LCB4MjUsIHZjcHJtKDIsczIsMCxzMCkpLCB2YzEpOworCisgICAgeDI3ID0gdmVjX2FkZCh4MjEsIHgyNik7IC8vIHoxLnIgIHo3LnIgejEuaSB6My5pCisgICAgeDI4ID0gdmVjX3N1Yih4MjEsIHgyNik7IC8vejUuciAgejMuciB6NS5pIHo3LmkKKworICAgIHgyOSA9IHZlY19wZXJtKHgxOSwgeDI3LCB2Y3BybSgwLDIsczAsczIpKTsgLy8gejAuciAgejAuaSAgejEuciAgejEuaQorICAgIHgzMCA9IHZlY19wZXJtKHgxOSwgeDI3LCB2Y3BybSgxLDMsczEsczMpKTsgLy8gejIuciAgejIuaSAgejcuciAgejMuaQorICAgIHgzMSA9IHZlY19wZXJtKHgyMCwgeDI4LCB2Y3BybSgwLDIsczAsczIpKTsgLy8gejQuciAgejQuaSAgejUuciAgejUuaQorICAgIHgzMiA9IHZlY19wZXJtKHgyMCwgeDI4LCB2Y3BybSgxLDMsczEsczMpKTsgLy8gejYuciAgejYuaSAgejMuciAgejcuaQorICAgIHgzMyA9IHZlY19wZXJtKHgzMCwgeDMyLCB2Y3BybSgwLDEsczIsMykpOyAgLy8gejIuciAgejIuaSAgejMuciAgejMuaQorICAgIHgzNCA9IHZlY19wZXJtKHgzMCwgeDMyLCB2Y3BybShzMCxzMSwyLHMzKSk7IC8vIHo2LnIgIHo2LmkgIHo3LnIgIHo3LmkKKworICAgIHZlY19zdCh4MjksIDAsICYob3V0WzBdKSk7CisgICAgdmVjX3N0KHgzMywgYnl0ZV8yY29tcGxleCwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3QoeDMxLCBieXRlXzRjb21wbGV4LCAmKG91dFswXSkpOworICAgIHZlY19zdCh4MzQsIGJ5dGVfNmNvbXBsZXgsICYob3V0WzBdKSk7Cit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBmZnQxNl92c3hfaW50ZXJsZWF2ZShGRlRDb21wbGV4ICp6KQoreworICAgIGZsb2F0KiBvdXQ9ICAoZmxvYXQqKXo7CisgICAgdmVjX2YgdmMwID0ge3NxcnRoYWxmLCBzcXJ0aGFsZiwgc3FydGhhbGYsIHNxcnRoYWxmfTsKKyAgICB2ZWNfZiB2YzEgPSB7ZmZfY29zXzE2WzFdLCBmZl9jb3NfMTZbMV0sIGZmX2Nvc18xNlsxXSwgZmZfY29zXzE2WzFdfTsKKyAgICB2ZWNfZiB2YzIgPSB7ZmZfY29zXzE2WzNdLCBmZl9jb3NfMTZbM10sIGZmX2Nvc18xNlszXSwgZmZfY29zXzE2WzNdfTsKKyAgICB2ZWNfZiB2ejAsIHZ6MSwgdnoyLCB2ejM7CisgICAgdmVjX2Ygdno0LCB2ejUsIHZ6Niwgdno3OworICAgIHZlY19mIHgwLCB4MSwgeDIsIHgzOworICAgIHZlY19mIHg0LCB4NSwgeDYsIHg3OworICAgIHZlY19mIHg4LCB4OSwgeDEwLCB4MTE7CisgICAgdmVjX2YgeDEyLCB4MTMsIHgxNCwgeDE1OworICAgIHZlY19mIHgxNiwgeDE3LCB4MTgsIHgxOTsKKyAgICB2ZWNfZiB4MjAsIHgyMSwgeDIyLCB4MjM7CisgICAgdmVjX2YgeDI0LCB4MjUsIHgyNiwgeDI3OworICAgIHZlY19mIHgyOCwgeDI5LCB4MzAsIHgzMTsKKyAgICB2ZWNfZiB4MzIsIHgzMywgeDM0LCB4MzU7CisgICAgdmVjX2YgeDM2LCB4MzcsIHgzOCwgeDM5OworICAgIHZlY19mIHg0MCwgeDQxLCB4NDIsIHg0MzsKKyAgICB2ZWNfZiB4NDQsIHg0NSwgeDQ2LCB4NDc7CisgICAgdmVjX2YgeDQ4LCB4NDksIHg1MCwgeDUxOworICAgIHZlY19mIHg1MiwgeDUzLCB4NTQsIHg1NTsKKyAgICB2ZWNfZiB4NTYsIHg1NywgeDU4LCB4NTk7CisgICAgdmVjX2YgeDYwLCB4NjEsIHg2MiwgeDYzOworICAgIHZlY19mIHg2NCwgeDY1LCB4NjYsIHg2NzsKKyAgICB2ZWNfZiB4NjgsIHg2OSwgeDcwLCB4NzE7CisgICAgdmVjX2YgeDcyLCB4NzMsIHg3NCwgeDc1OworICAgIHZlY19mIHg3NiwgeDc3LCB4NzgsIHg3OTsKKyAgICB2ZWNfZiB4ODAsIHg4MSwgeDgyLCB4ODM7CisgICAgdmVjX2YgeDg0LCB4ODUsIHg4NjsKKworICAgIHZ6MCA9IHZlY19sZCgwLCAmKG91dFswXSkpOworICAgIHZ6MSA9IHZlY19sZChieXRlXzJjb21wbGV4LCAmKG91dFswXSkpOworICAgIHZ6MiA9IHZlY19sZChieXRlXzRjb21wbGV4LCAmKG91dFswXSkpOworICAgIHZ6MyA9IHZlY19sZChieXRlXzZjb21wbGV4LCAmKG91dFswXSkpOworICAgIHZ6NCA9IHZlY19sZChieXRlXzhjb21wbGV4LCAmKG91dFswXSkpOworICAgIHZ6NSA9IHZlY19sZChieXRlXzEwY29tcGxleCwgJihvdXRbMF0pKTsKKyAgICB2ejYgPSB2ZWNfbGQoYnl0ZV8xMmNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdno3ID0gdmVjX2xkKGJ5dGVfMTRjb21wbGV4LCAmKG91dFswXSkpOworCisgICAgeDAgPSB2ZWNfcGVybSh2ejAsIHZ6MSwgdmNwcm0oMCwxLHMyLHMxKSk7CisgICAgeDEgPSB2ZWNfcGVybSh2ejAsIHZ6MSwgdmNwcm0oMiwzLHMwLHMzKSk7CisgICAgeDIgPSB2ZWNfcGVybSh2ejIsIHZ6MywgdmNwcm0oMCwxLHMwLHMxKSk7CisgICAgeDMgPSB2ZWNfcGVybSh2ejIsIHZ6MywgdmNwcm0oMiwzLHMyLHMzKSk7CisKKyAgICB4NCA9IHZlY19wZXJtKHZ6NCwgdno1LCB2Y3BybSgwLDEsczIsczEpKTsKKyAgICB4NSA9IHZlY19wZXJtKHZ6NCwgdno1LCB2Y3BybSgyLDMsczAsczMpKTsKKyAgICB4NiA9IHZlY19wZXJtKHZ6Niwgdno3LCB2Y3BybSgwLDEsczIsczEpKTsKKyAgICB4NyA9IHZlY19wZXJtKHZ6Niwgdno3LCB2Y3BybSgyLDMsczAsczMpKTsKKworICAgIHg4ID0gdmVjX2FkZCh4MCwgeDEpOworICAgIHg5ID0gdmVjX3N1Yih4MCwgeDEpOworICAgIHgxMCA9IHZlY19hZGQoeDIsIHgzKTsKKyAgICB4MTEgPSB2ZWNfc3ViKHgyLCB4Myk7CisKKyAgICB4MTIgPSB2ZWNfYWRkKHg0LCB4NSk7CisgICAgeDEzID0gdmVjX3N1Yih4NCwgeDUpOworICAgIHgxNCA9IHZlY19hZGQoeDYsIHg3KTsKKyAgICB4MTUgPSB2ZWNfc3ViKHg2LCB4Nyk7CisKKyAgICB4MTYgPSB2ZWNfcGVybSh4OCwgeDksIHZjcHJtKDAsMSxzMCxzMSkpOworICAgIHgxNyA9IHZlY19wZXJtKHg4LCB4OSwgdmNwcm0oMiwzLHMzLHMyKSk7CisgICAgeDE4ID0gdmVjX3Blcm0oeDEwLCB4MTEsIHZjcHJtKDIsMSxzMSxzMikpOworICAgIHgxOSA9IHZlY19wZXJtKHgxMCwgeDExLCB2Y3BybSgwLDMsczAsczMpKTsKKyAgICB4MjAgPSB2ZWNfcGVybSh4MTIsIHgxNCwgdmNwcm0oMCwxLHMwLCBzMSkpOworICAgIHgyMSA9IHZlY19wZXJtKHgxMiwgeDE0LCB2Y3BybSgyLDMsczIsczMpKTsKKyAgICB4MjIgPSB2ZWNfcGVybSh4MTMsIHgxNSwgdmNwcm0oMCwxLHMwLHMxKSk7CisgICAgeDIzID0gdmVjX3Blcm0oeDEzLCB4MTUsIHZjcHJtKDMsMixzMyxzMikpOworCisgICAgeDI0ID0gdmVjX2FkZCh4MTYsIHgxNyk7CisgICAgeDI1ID0gdmVjX3N1Yih4MTYsIHgxNyk7CisgICAgeDI2ID0gdmVjX2FkZCh4MTgsIHgxOSk7CisgICAgeDI3ID0gdmVjX3N1Yih4MTgsIHgxOSk7CisgICAgeDI4ID0gdmVjX2FkZCh4MjAsIHgyMSk7CisgICAgeDI5ID0gdmVjX3N1Yih4MjAsIHgyMSk7CisgICAgeDMwID0gdmVjX2FkZCh4MjIsIHgyMyk7CisgICAgeDMxID0gdmVjX3N1Yih4MjIsIHgyMyk7CisKKyAgICB4MzIgPSB2ZWNfYWRkKHgyNCwgeDI2KTsKKyAgICB4MzMgPSB2ZWNfc3ViKHgyNCwgeDI2KTsKKyAgICB4MzQgPSB2ZWNfcGVybSh4MzIsIHgzMywgdmNwcm0oMCwxLHMwLHMxKSk7CisKKyAgICB4MzUgPSB2ZWNfcGVybSh4MjgsIHgyOSwgdmNwcm0oMiwxLHMxLHMyKSk7CisgICAgeDM2ID0gdmVjX3Blcm0oeDI4LCB4MjksIHZjcHJtKDAsMyxzMCxzMykpOworICAgIHgzNyA9IHZlY19hZGQoeDM1LCB4MzYpOworICAgIHgzOCA9IHZlY19zdWIoeDM1LCB4MzYpOworICAgIHgzOSA9IHZlY19wZXJtKHgzNywgeDM4LCB2Y3BybSgwLDEsczEsczApKTsKKworICAgIHg0MCA9IHZlY19wZXJtKHgyNywgeDM4LCB2Y3BybSgzLDIsczIsczMpKTsKKyAgICB4NDEgPSB2ZWNfcGVybSh4MjYsICB4MzcsIHZjcHJtKDIsMyxzMyxzMikpOworICAgIHg0MiA9IHZlY19hZGQoeDQwLCB4NDEpOworICAgIHg0MyA9IHZlY19zdWIoeDQwLCB4NDEpOworICAgIHg0NCA9IHZlY19tdWwoeDQyLCB2YzApOworICAgIHg0NSA9IHZlY19tdWwoeDQzLCB2YzApOworCisgICAgeDQ2ID0gdmVjX2FkZCh4MzQsIHgzOSk7ICAvLyB6MC5yICB6MC5pICB6NC5yICB6NC5pCisgICAgeDQ3ID0gdmVjX3N1Yih4MzQsIHgzOSk7ICAvLyB6OC5yICB6OC5pICB6MTIuciAgejEyLmkKKworICAgIHg0OCA9IHZlY19wZXJtKHgzMCwgeDMxLCB2Y3BybSgyLDEsczEsczIpKTsKKyAgICB4NDkgPSB2ZWNfcGVybSh4MzAsIHgzMSwgdmNwcm0oMCwzLHMzLHMwKSk7CisgICAgeDUwID0gdmVjX2FkZCh4NDgsIHg0OSk7CisgICAgeDUxID0gdmVjX3N1Yih4NDgsIHg0OSk7CisgICAgeDUyID0gdmVjX211bCh4NTAsIHZjMSk7CisgICAgeDUzID0gdmVjX211bCh4NTAsIHZjMik7CisgICAgeDU0ID0gdmVjX211bCh4NTEsIHZjMSk7CisgICAgeDU1ID0gdmVjX211bCh4NTEsIHZjMik7CisKKyAgICB4NTYgPSB2ZWNfcGVybSh4MjQsIHgyNSwgdmNwcm0oMiwzLHMyLHMzKSk7CisgICAgeDU3ID0gdmVjX3Blcm0oeDQ0LCB4NDUsIHZjcHJtKDAsMSxzMSxzMCkpOworICAgIHg1OCA9IHZlY19hZGQoeDU2LCB4NTcpOworICAgIHg1OSA9IHZlY19zdWIoeDU2LCB4NTcpOworCisgICAgeDYwID0gdmVjX3Blcm0oeDU0LCB4NTUsIHZjcHJtKDEsMCwzLDIpKTsKKyAgICB4NjEgPSB2ZWNfcGVybSh4NTQsIHg1NSwgdmNwcm0oczEsczAsczMsczIpKTsKKyAgICB4NjIgPSB2ZWNfYWRkKHg1MiwgeDYxKTsKKyAgICB4NjMgPSB2ZWNfc3ViKHg1MiwgeDYxKTsKKyAgICB4NjQgPSB2ZWNfYWRkKHg2MCwgeDUzKTsKKyAgICB4NjUgPSB2ZWNfc3ViKHg2MCwgeDUzKTsKKyAgICB4NjYgPSB2ZWNfcGVybSh4NjIsIHg2NCwgdmNwcm0oMCwxLHMzLHMyKSk7CisgICAgeDY3ID0gdmVjX3Blcm0oeDYzLCB4NjUsIHZjcHJtKHMwLHMxLDMsMikpOworCisgICAgeDY4ID0gdmVjX2FkZCh4NTgsIHg2Nik7IC8vIHoxLnIgICAgejEuaSAgejMuciAgICB6My5pCisgICAgeDY5ID0gdmVjX3N1Yih4NTgsIHg2Nik7IC8vIHo5LnIgICAgejkuaSAgejExLnIgIHoxMS5pCisgICAgeDcwID0gdmVjX2FkZCh4NTksIHg2Nyk7IC8vIHo1LnIgICAgejUuaSAgejE1LnIgIHoxNS5pCisgICAgeDcxID0gdmVjX3N1Yih4NTksIHg2Nyk7IC8vIHoxMy5yICB6MTMuaSB6Ny5yICAgejcuaQorCisgICAgeDcyID0gdmVjX3Blcm0oeDI1LCB4MjcsIHZjcHJtKHMxLHMwLHMyLHMzKSk7CisgICAgeDczID0gdmVjX2FkZCh4MjUsIHg3Mik7CisgICAgeDc0ID0gdmVjX3N1Yih4MjUsIHg3Mik7CisgICAgeDc1ID0gdmVjX3Blcm0oeDczLCB4NzQsIHZjcHJtKDAsMSxzMCxzMSkpOworICAgIHg3NiA9IHZlY19wZXJtKHg0NCwgeDQ1LCB2Y3BybSgzLDIsczIsczMpKTsKKyAgICB4NzcgPSB2ZWNfYWRkKHg3NSwgeDc2KTsgLy8gejIuciAgIHoyLmkgICAgejYuciAgICB6Ni5pCisgICAgeDc4ID0gdmVjX3N1Yih4NzUsIHg3Nik7IC8vIHoxMC5yICB6MTAuaSAgejE0LnIgIHoxNC5pCisKKyAgICB4NzkgPSB2ZWNfcGVybSh4NDYsIHg2OCwgdmNwcm0oMCwxLHMwLHMxKSk7IC8vIHowLnIgIHowLmkgIHoxLnIgIHoxLmkKKyAgICB4ODAgPSB2ZWNfcGVybSh4NzcsIHg2OCwgdmNwcm0oMCwxLHMyLHMzKSk7IC8vIHoyLnIgIHoyLmkgIHozLnIgIHozLmkKKyAgICB4ODEgPSB2ZWNfcGVybSh4NDYsIHg3MCwgdmNwcm0oMiwzLHMwLHMxKSk7IC8vIHo0LnIgIHo0LmkgIHo1LnIgIHo1LmkKKyAgICB4ODIgPSB2ZWNfcGVybSh4NzEsIHg3NywgdmNwcm0oczIsczMsMiwzKSk7IC8vIHo2LnIgIHo2LmkgIHo3LnIgIHo3LmkKKyAgICB2ZWNfc3QoeDc5LCAwLCAmKG91dFswXSkpOworICAgIHZlY19zdCh4ODAsIGJ5dGVfMmNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdmVjX3N0KHg4MSwgYnl0ZV80Y29tcGxleCwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3QoeDgyLCBieXRlXzZjb21wbGV4LCAmKG91dFswXSkpOworICAgIHg4MyA9IHZlY19wZXJtKHg0NywgeDY5LCB2Y3BybSgwLDEsczAsczEpKTsgLy8gejguciAgejguaSAgejkuciAgejkuaQorICAgIHg4NCA9IHZlY19wZXJtKHg3OCwgeDY5LCB2Y3BybSgwLDEsczIsczMpKTsgLy8gejEwLnIgIHoxMC5pICB6MTEuciAgejExLmkKKyAgICB4ODUgPSB2ZWNfcGVybSh4NDcsIHg3MSwgdmNwcm0oMiwzLHMwLHMxKSk7IC8vIHoxMi5yICB6MTIuaSAgejEzLnIgIHoxMy5pCisgICAgeDg2ID0gdmVjX3Blcm0oeDcwLCB4NzgsIHZjcHJtKHMyLHMzLDIsMykpOyAvLyB6MTQuciAgejE0LmkgIHoxNS5yICB6MTUuaQorICAgIHZlY19zdCh4ODMsIGJ5dGVfOGNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdmVjX3N0KHg4NCwgYnl0ZV8xMGNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdmVjX3N0KHg4NSwgYnl0ZV8xMmNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdmVjX3N0KHg4NiwgYnl0ZV8xNGNvbXBsZXgsICYob3V0WzBdKSk7Cit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBmZnQ0X3ZzeChGRlRDb21wbGV4ICp6KQoreworICAgIHZlY19mIGEsIGIsIGMsIGQ7CisgICAgZmxvYXQqIG91dD0gIChmbG9hdCopejsKKyAgICBhID0gdmVjX2xkKDAsICYob3V0WzBdKSk7CisgICAgYiA9IHZlY19sZChieXRlXzJjb21wbGV4LCAmKG91dFswXSkpOworCisgICAgYyA9IHZlY19wZXJtKGEsIGIsIHZjcHJtKDAsMSxzMixzMSkpOworICAgIGQgPSB2ZWNfcGVybShhLCBiLCB2Y3BybSgyLDMsczAsczMpKTsKKyAgICBhID0gdmVjX2FkZChjLCBkKTsKKyAgICBiID0gdmVjX3N1YihjLCBkKTsKKworICAgIGMgPSB2ZWNfcGVybShhLGIsIHZjcHJtKDAsczAsMSxzMSkpOworICAgIGQgPSB2ZWNfcGVybShhLCBiLCB2Y3BybSgyLHMzLDMsczIpKTsKKworICAgIGEgPSB2ZWNfYWRkKGMsIGQpOworICAgIGIgPSB2ZWNfc3ViKGMsIGQpOworCisgICAgYyA9IHZlY19wZXJtKGEsIGIsIHZjcHJtKDAsMSxzMCxzMSkpOworICAgIGQgPSB2ZWNfcGVybShhLCBiLCB2Y3BybSgyLDMsczIsczMpKTsKKworICAgIHZlY19zdChjLCAwLCAmKG91dFswXSkpOworICAgIHZlY19zdChkLCBieXRlXzJjb21wbGV4LCAmKG91dFswXSkpOworICAgIHJldHVybjsKK30KKworaW5saW5lIHN0YXRpYyB2b2lkIGZmdDhfdnN4KEZGVENvbXBsZXggKnopCit7CisgICAgdmVjX2YgdnowLCB2ejEsIHZ6MiwgdnozOworICAgIHZlY19mIHZ6NCwgdno1LCB2ejYsIHZ6Nywgdno4OworCisgICAgZmxvYXQqIG91dD0gIChmbG9hdCopejsKKyAgICB2ZWNfZiB2YzAgPSB7MC4wLCAwLjAsIDAuMCwgMC4wfTsKKyAgICB2ZWNfZiB2YzEgPSB7LXNxcnRoYWxmLCBzcXJ0aGFsZiwgc3FydGhhbGYsIC1zcXJ0aGFsZn07CisgICAgdmVjX2YgdmMyID0ge3NxcnRoYWxmLCBzcXJ0aGFsZiwgc3FydGhhbGYsIHNxcnRoYWxmfTsKKworICAgIHZ6MCA9IHZlY19sZCgwLCAmKG91dFswXSkpOworICAgIHZ6MSA9IHZlY19sZChieXRlXzJjb21wbGV4LCAmKG91dFswXSkpOworICAgIHZ6MiA9IHZlY19sZChieXRlXzRjb21wbGV4LCAmKG91dFswXSkpOworICAgIHZ6MyA9IHZlY19sZChieXRlXzZjb21wbGV4LCAmKG91dFswXSkpOworCisgICAgdno2ID0gdmVjX3Blcm0odnoyLCB2ejMsIHZjcHJtKDAsczAsMSxzMSkpOworICAgIHZ6NyA9IHZlY19wZXJtKHZ6MiwgdnozLCB2Y3BybSgyLHMyLDMsczMpKTsKKyAgICB2ejQgPSB2ZWNfcGVybSh2ejAsIHZ6MSwgdmNwcm0oMCwxLHMyLHMxKSk7CisgICAgdno1ID0gdmVjX3Blcm0odnowLCB2ejEsIHZjcHJtKDIsMyxzMCxzMykpOworCisgICAgdnoyID0gdmVjX2FkZCh2ejYsIHZ6Nyk7CisgICAgdnozID0gdmVjX3N1Yih2ejYsIHZ6Nyk7CisgICAgdno4ID0gdmVjX3Blcm0odnozLCB2ejMsIHZjcHJtKDIsMywwLDEpKTsKKworICAgIHZ6MCA9IHZlY19hZGQodno0LCB2ejUpOworICAgIHZ6MSA9IHZlY19zdWIodno0LCB2ejUpOworCisgICAgdnozID0gdmVjX21hZGQodnozLCB2YzEsIHZjMCk7CisgICAgdnozID0gdmVjX21hZGQodno4LCB2YzIsIHZ6Myk7CisKKyAgICB2ejQgPSB2ZWNfcGVybSh2ejAsIHZ6MSwgdmNwcm0oMCxzMCwxLHMxKSk7CisgICAgdno1ID0gdmVjX3Blcm0odnowLCB2ejEsIHZjcHJtKDIsczMsMyxzMikpOworICAgIHZ6NiA9IHZlY19wZXJtKHZ6MiwgdnozLCB2Y3BybSgxLDIsczMsczApKTsKKyAgICB2ejcgPSB2ZWNfcGVybSh2ejIsIHZ6MywgdmNwcm0oMCwzLHMyLHMxKSk7CisKKyAgICB2ejAgPSB2ZWNfYWRkKHZ6NCwgdno1KTsKKyAgICB2ejEgPSB2ZWNfc3ViKHZ6NCwgdno1KTsKKyAgICB2ejIgPSB2ZWNfYWRkKHZ6Niwgdno3KTsKKyAgICB2ejMgPSB2ZWNfc3ViKHZ6Niwgdno3KTsKKworICAgIHZ6NCA9IHZlY19wZXJtKHZ6MCwgdnoxLCB2Y3BybSgwLDEsczAsczEpKTsKKyAgICB2ejUgPSB2ZWNfcGVybSh2ejAsIHZ6MSwgdmNwcm0oMiwzLHMyLHMzKSk7CisgICAgdno2ID0gdmVjX3Blcm0odnoyLCB2ejMsIHZjcHJtKDAsMixzMSxzMykpOworICAgIHZ6NyA9IHZlY19wZXJtKHZ6MiwgdnozLCB2Y3BybSgxLDMsczAsczIpKTsKKworCisgICAgdnoyID0gdmVjX3N1Yih2ejQsIHZ6Nik7CisgICAgdnozID0gdmVjX3N1Yih2ejUsIHZ6Nyk7CisKKyAgICB2ejAgPSB2ZWNfYWRkKHZ6NCwgdno2KTsKKyAgICB2ejEgPSB2ZWNfYWRkKHZ6NSwgdno3KTsKKworICAgIHZlY19zdCh2ejAsIDAsICYob3V0WzBdKSk7CisgICAgdmVjX3N0KHZ6MSwgYnl0ZV8yY29tcGxleCwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3QodnoyLCBieXRlXzRjb21wbGV4LCAmKG91dFswXSkpOworICAgIHZlY19zdCh2ejMsIGJ5dGVfNmNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgcmV0dXJuOworfQorCitpbmxpbmUgc3RhdGljIHZvaWQgZmZ0MTZfdnN4KEZGVENvbXBsZXggKnopCit7CisgICAgZmxvYXQqIG91dD0gIChmbG9hdCopejsKKyAgICB2ZWNfZiB2YzAgPSB7MC4wLCAwLjAsIDAuMCwgMC4wfTsKKyAgICB2ZWNfZiB2YzEgPSB7LXNxcnRoYWxmLCBzcXJ0aGFsZiwgc3FydGhhbGYsIC1zcXJ0aGFsZn07CisgICAgdmVjX2YgdmMyID0ge3NxcnRoYWxmLCBzcXJ0aGFsZiwgc3FydGhhbGYsIHNxcnRoYWxmfTsKKyAgICB2ZWNfZiB2YzMgPSB7MS4wLCAwLjkyMzg3OTUzLCBzcXJ0aGFsZiwgMC4zODI2ODM0M307CisgICAgdmVjX2YgdmM0ID0gezAuMCwgMC4zODI2ODM0Mywgc3FydGhhbGYsIDAuOTIzODc5NTN9OworICAgIHZlY19mIHZjNSA9IHstMC4wLCAtMC4zODI2ODM0MywgLXNxcnRoYWxmLCAtMC45MjM4Nzk1M307CisKKyAgICB2ZWNfZiB2ejAsIHZ6MSwgdnoyLCB2ejM7CisgICAgdmVjX2Ygdno0LCB2ejUsIHZ6Niwgdno3OworICAgIHZlY19mIHZ6OCwgdno5LCB2ejEwLCB2ejExOworICAgIHZlY19mIHZ6MTIsIHZ6MTM7CisKKyAgICB2ejAgPSB2ZWNfbGQoYnl0ZV84Y29tcGxleCwgJihvdXRbMF0pKTsKKyAgICB2ejEgPSB2ZWNfbGQoYnl0ZV8xMGNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdnoyID0gdmVjX2xkKGJ5dGVfMTJjb21wbGV4LCAmKG91dFswXSkpOworICAgIHZ6MyA9IHZlY19sZChieXRlXzE0Y29tcGxleCwgJihvdXRbMF0pKTsKKworICAgIHZ6NCA9IHZlY19wZXJtKHZ6MCwgdnoxLCB2Y3BybSgwLDEsczIsczEpKTsKKyAgICB2ejUgPSB2ZWNfcGVybSh2ejAsIHZ6MSwgdmNwcm0oMiwzLHMwLHMzKSk7CisgICAgdno2ID0gdmVjX3Blcm0odnoyLCB2ejMsIHZjcHJtKDAsMSxzMixzMSkpOworICAgIHZ6NyA9IHZlY19wZXJtKHZ6MiwgdnozLCB2Y3BybSgyLDMsczAsczMpKTsKKworICAgIHZ6MCA9IHZlY19hZGQodno0LCB2ejUpOworICAgIHZ6MT0gdmVjX3N1Yih2ejQsIHZ6NSk7CisgICAgdnoyID0gdmVjX2FkZCh2ejYsIHZ6Nyk7CisgICAgdnozID0gdmVjX3N1Yih2ejYsIHZ6Nyk7CisKKyAgICB2ejQgPSB2ZWNfcGVybSh2ejAsIHZ6MSwgdmNwcm0oMCxzMCwxLHMxKSk7CisgICAgdno1ID0gdmVjX3Blcm0odnowLCB2ejEsIHZjcHJtKDIsczMsMyxzMikpOworICAgIHZ6NiA9IHZlY19wZXJtKHZ6MiwgdnozLCB2Y3BybSgwLHMwLDEsczEpKTsKKyAgICB2ejcgPSB2ZWNfcGVybSh2ejIsIHZ6MywgdmNwcm0oMixzMywzLHMyKSk7CisKKyAgICB2ejAgPSB2ZWNfYWRkKHZ6NCwgdno1KTsKKyAgICB2ejEgPSB2ZWNfc3ViKHZ6NCwgdno1KTsKKyAgICB2ejIgPSB2ZWNfYWRkKHZ6Niwgdno3KTsKKyAgICB2ejMgPSB2ZWNfc3ViKHZ6Niwgdno3KTsKKworICAgIHZ6NCA9IHZlY19wZXJtKHZ6MCwgdnoxLCB2Y3BybSgwLDEsczAsczEpKTsKKyAgICB2ejUgPSB2ZWNfcGVybSh2ejAsIHZ6MSwgdmNwcm0oMiwzLHMyLHMzKSk7CisKKyAgICB2ejYgPSB2ZWNfcGVybSh2ejIsIHZ6MywgdmNwcm0oMCwxLHMwLHMxKSk7CisgICAgdno3ID0gdmVjX3Blcm0odnoyLCB2ejMsIHZjcHJtKDIsMyxzMixzMykpOworCisgICAgdnowID0gdmVjX2xkKDAsICYob3V0WzBdKSk7CisgICAgdnoxID0gdmVjX2xkKGJ5dGVfMmNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdnoyID0gdmVjX2xkKGJ5dGVfNGNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdnozID0gdmVjX2xkKGJ5dGVfNmNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdnoxMCA9IHZlY19wZXJtKHZ6MiwgdnozLCB2Y3BybSgwLHMwLDEsczEpKTsKKyAgICB2ejExID0gdmVjX3Blcm0odnoyLCB2ejMsIHZjcHJtKDIsczIsMyxzMykpOworICAgIHZ6OCA9IHZlY19wZXJtKHZ6MCwgdnoxLCB2Y3BybSgwLDEsczIsczEpKTsKKyAgICB2ejkgPSB2ZWNfcGVybSh2ejAsIHZ6MSwgdmNwcm0oMiwzLHMwLHMzKSk7CisKKyAgICB2ejIgPSB2ZWNfYWRkKHZ6MTAsIHZ6MTEpOworICAgIHZ6MyA9IHZlY19zdWIodnoxMCwgdnoxMSk7CisgICAgdnoxMiA9IHZlY19wZXJtKHZ6MywgdnozLCB2Y3BybSgyLDMsMCwxKSk7CisgICAgdnowID0gdmVjX2FkZCh2ejgsIHZ6OSk7CisgICAgdnoxID0gdmVjX3N1Yih2ejgsIHZ6OSk7CisKKyAgICB2ejMgPSB2ZWNfbWFkZCh2ejMsIHZjMSwgdmMwKTsKKyAgICB2ejMgPSB2ZWNfbWFkZCh2ejEyLCB2YzIsIHZ6Myk7CisgICAgdno4ID0gdmVjX3Blcm0odnowLCB2ejEsIHZjcHJtKDAsczAsMSxzMSkpOworICAgIHZ6OSA9IHZlY19wZXJtKHZ6MCwgdnoxLCB2Y3BybSgyLHMzLDMsczIpKTsKKyAgICB2ejEwID0gdmVjX3Blcm0odnoyLCB2ejMsIHZjcHJtKDEsMixzMyxzMCkpOworICAgIHZ6MTEgPSB2ZWNfcGVybSh2ejIsIHZ6MywgdmNwcm0oMCwzLHMyLHMxKSk7CisKKyAgICB2ejAgPSB2ZWNfYWRkKHZ6OCwgdno5KTsKKyAgICB2ejEgPSB2ZWNfc3ViKHZ6OCwgdno5KTsKKyAgICB2ejIgPSB2ZWNfYWRkKHZ6MTAsIHZ6MTEpOworICAgIHZ6MyA9IHZlY19zdWIodnoxMCwgdnoxMSk7CisKKyAgICB2ejggPSB2ZWNfcGVybSh2ejAsIHZ6MSwgdmNwcm0oMCwxLHMwLHMxKSk7CisgICAgdno5ID0gdmVjX3Blcm0odnowLCB2ejEsIHZjcHJtKDIsMyxzMixzMykpOworICAgIHZ6MTAgPSB2ZWNfcGVybSh2ejIsIHZ6MywgdmNwcm0oMCwyLHMxLHMzKSk7CisgICAgdnoxMSA9IHZlY19wZXJtKHZ6MiwgdnozLCB2Y3BybSgxLDMsczAsczIpKTsKKworICAgIHZ6MiA9IHZlY19zdWIodno4LCB2ejEwKTsKKyAgICB2ejMgPSB2ZWNfc3ViKHZ6OSwgdnoxMSk7CisgICAgdnowID0gdmVjX2FkZCh2ejgsIHZ6MTApOworICAgIHZ6MSA9IHZlY19hZGQodno5LCB2ejExKTsKKworICAgIHZ6OCA9IHZlY19tYWRkKHZ6NCwgdmMzLCB2YzApOworICAgIHZ6OSA9IHZlY19tYWRkKHZ6NSwgdmMzLCB2YzApOworICAgIHZ6MTAgPSB2ZWNfbWFkZCh2ejYsIHZjMywgdmMwKTsKKyAgICB2ejExID0gdmVjX21hZGQodno3LCB2YzMsIHZjMCk7CisKKyAgICB2ejggPSB2ZWNfbWFkZCh2ejUsIHZjNCwgdno4KTsKKyAgICB2ejkgPSB2ZWNfbWFkZCh2ejQsIHZjNSwgdno5KTsKKyAgICB2ejEwID0gdmVjX21hZGQodno3LCB2YzUsIHZ6MTApOworICAgIHZ6MTEgPSB2ZWNfbWFkZCh2ejYsIHZjNCwgdnoxMSk7CisKKyAgICB2ejEyID0gdmVjX3N1Yih2ejEwLCB2ejgpOworICAgIHZ6MTAgPSB2ZWNfYWRkKHZ6MTAsIHZ6OCk7CisKKyAgICB2ejEzID0gdmVjX3N1Yih2ejksIHZ6MTEpOworICAgIHZ6MTEgPSB2ZWNfYWRkKHZ6OSwgdnoxMSk7CisKKyAgICB2ejQgPSB2ZWNfc3ViKHZ6MCwgdnoxMCk7CisgICAgdnowID0gdmVjX2FkZCh2ejAsIHZ6MTApOworCisgICAgdno3PSB2ZWNfc3ViKHZ6MywgdnoxMik7CisgICAgdnozPSB2ZWNfYWRkKHZ6MywgdnoxMik7CisKKyAgICB2ejUgPSB2ZWNfc3ViKHZ6MSwgdnoxMSk7CisgICAgdnoxID0gdmVjX2FkZCh2ejEsIHZ6MTEpOworCisgICAgdno2ID0gdmVjX3N1Yih2ejIsIHZ6MTMpOworICAgIHZ6MiA9IHZlY19hZGQodnoyLCB2ejEzKTsKKworICAgIHZlY19zdCh2ejAsIDAsICYob3V0WzBdKSk7CisgICAgdmVjX3N0KHZ6MSwgYnl0ZV8yY29tcGxleCwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3QodnoyLCBieXRlXzRjb21wbGV4LCAmKG91dFswXSkpOworICAgIHZlY19zdCh2ejMsIGJ5dGVfNmNvbXBsZXgsICYob3V0WzBdKSk7CisgICAgdmVjX3N0KHZ6NCwgYnl0ZV84Y29tcGxleCwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3Qodno1LCBieXRlXzEwY29tcGxleCwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3Qodno2LCBieXRlXzEyY29tcGxleCwgJihvdXRbMF0pKTsKKyAgICB2ZWNfc3Qodno3LCBieXRlXzE0Y29tcGxleCwgJihvdXRbMF0pKTsKKyAgICByZXR1cm47CisKK30KK2lubGluZSBzdGF0aWMgdm9pZCBwYXNzX3ZzeChGRlRDb21wbGV4ICogeiwgY29uc3QgRkZUU2FtcGxlICogd3JlLCB1bnNpZ25lZCBpbnQgbikKK3sKKyAgICBpbnQgbzEgPSBuPDwxOworICAgIGludCBvMiA9IG48PDI7CisgICAgaW50IG8zID0gbzErbzI7CisgICAgaW50IGkxLCBpMiwgaTM7CisgICAgRkZUU2FtcGxlKiBvdXQgPSAoRkZUU2FtcGxlKil6OworICAgIGNvbnN0IEZGVFNhbXBsZSAqd2ltID0gd3JlK28xOworICAgIHZlY19mIHYwLCB2MSwgdjIsIHYzOworICAgIHZlY19mIHY0LCB2NSwgdjYsIHY3OworICAgIHZlY19mIHY4LCB2OSwgdjEwLCB2MTE7CisgICAgdmVjX2YgdjEyLCB2MTM7CisKKyAgICBuID0gbi0yOworICAgIGkxID0gbzEqc2l6ZW9mKEZGVENvbXBsZXgpOworICAgIGkyID0gbzIqc2l6ZW9mKEZGVENvbXBsZXgpOworICAgIGkzID0gbzMqc2l6ZW9mKEZGVENvbXBsZXgpOworCisgICAgdjggPSB2ZWNfbGQoMCwgJih3cmVbMF0pKTsKKyAgICB2MTAgPSB2ZWNfbGQoMCwgJih3aW1bMF0pKTsKKyAgICB2OSA9IHZlY19sZCgwLCAmKHdpbVstNF0pKTsKKyAgICB2OSA9IHZlY19wZXJtKHY5LCB2MTAsIHZjcHJtKHMwLDMsMiwxKSk7CisKKyAgICB2NCA9IHZlY19sZChpMiwgJihvdXRbMF0pKTsKKyAgICB2NSA9IHZlY19sZChpMisxNiwgJihvdXRbMF0pKTsKKyAgICB2NiA9IHZlY19sZChpMywgJihvdXRbMF0pKTsKKyAgICB2NyA9IHZlY19sZChpMysxNiwgJihvdXRbMF0pKTsKKyAgICB2MTAgPSB2ZWNfbXVsKHY0LCB2OCk7IC8vIHIyKndyZQorICAgIHYxMSA9IHZlY19tdWwodjUsIHY4KTsgLy8gaTIqd3JlCisgICAgdjEyID0gdmVjX211bCh2NiwgdjgpOyAvLyByMyp3cmUKKyAgICB2MTMgPSB2ZWNfbXVsKHY3LCB2OCk7IC8vIGkzKndyZQorCisgICAgdjAgPSB2ZWNfbGQoMCwgJihvdXRbMF0pKTsgLy8gcjAKKyAgICB2MyA9IHZlY19sZChpMSsxNiwgJihvdXRbMF0pKTsgLy8gaTEKKyAgICB2MTAgPSB2ZWNfbWFkZCh2NSwgdjksIHYxMCk7IC8vIHIyKndpbQorICAgIHYxMSA9IHZlY19ubXN1Yih2NCwgdjksIHYxMSk7IC8vIGkyKndpbQorICAgIHYxMiA9IHZlY19ubXN1Yih2NywgdjksIHYxMik7IC8vIHIzKndpbQorICAgIHYxMyA9IHZlY19tYWRkKHY2LCB2OSwgdjEzKTsgLy8gaTMqd2ltCisKKyAgICB2MSA9IHZlY19sZCgxNiwgJihvdXRbMF0pKTsgLy8gaTAKKyAgICB2MiA9IHZlY19sZChpMSwgJihvdXRbMF0pKTsgLy8gcjEKKyAgICB2OCA9IHZlY19zdWIodjEyLCB2MTApOworICAgIHYxMiA9IHZlY19hZGQodjEyLCB2MTApOworICAgIHY5ID0gdmVjX3N1Yih2MTEsIHYxMyk7CisgICAgdjEzID0gdmVjX2FkZCh2MTEsIHYxMyk7CisgICAgdjQgPSB2ZWNfc3ViKHYwLCB2MTIpOworICAgIHYwID0gdmVjX2FkZCh2MCwgdjEyKTsKKyAgICB2NyA9IHZlY19zdWIodjMsIHY4KTsKKyAgICB2MyA9IHZlY19hZGQodjMsIHY4KTsKKworICAgIHZlY19zdCh2MCwgMCwgJihvdXRbMF0pKTsgLy8gcjAKKyAgICB2ZWNfc3QodjMsIGkxKzE2LCAmKG91dFswXSkpOyAvLyBpMQorICAgIHZlY19zdCh2NCwgaTIsICYob3V0WzBdKSk7IC8vIHIyCisgICAgdmVjX3N0KHY3LCBpMysxNiwgJihvdXRbMF0pKTsvLyBpMworCisgICAgdjUgPSB2ZWNfc3ViKHYxLCB2MTMpOworICAgIHYxID0gdmVjX2FkZCh2MSwgdjEzKTsKKyAgICB2NiA9IHZlY19zdWIodjIsIHY5KTsKKyAgICB2MiA9IHZlY19hZGQodjIsIHY5KTsKKworICAgIHZlY19zdCh2MSwgMTYsICYob3V0WzBdKSk7IC8vIGkwCisgICAgdmVjX3N0KHYyLCBpMSwgJihvdXRbMF0pKTsgLy8gcjEKKyAgICB2ZWNfc3QodjUsIGkyKzE2LCAmKG91dFswXSkpOyAvLyBpMgorICAgIHZlY19zdCh2NiwgaTMsICYob3V0WzBdKSk7IC8vIHIzCisKKyAgICBkbyB7CisgICAgICAgIG91dCArPSA4OworICAgICAgICB3cmUgKz0gNDsKKyAgICAgICAgd2ltIC09IDQ7CisKKyAgICAgICAgdjggPSB2ZWNfbGQoMCwgJih3cmVbMF0pKTsKKyAgICAgICAgdjEwID0gdmVjX2xkKDAsICYod2ltWzBdKSk7CisgICAgICAgIHY5ID0gdmVjX2xkKDAsICYod2ltWy00XSkpOworICAgICAgICB2OSA9IHZlY19wZXJtKHY5LCB2MTAsIHZjcHJtKHMwLDMsMiwxKSk7CisKKyAgICAgICAgdjQgPSB2ZWNfbGQoaTIsICYob3V0WzBdKSk7IC8vIHIyCisgICAgICAgIHY1ID0gdmVjX2xkKGkyKzE2LCAmKG91dFswXSkpOyAvLyBpMgorICAgICAgICB2NiA9IHZlY19sZChpMywgJihvdXRbMF0pKTsgLy8gcjMKKyAgICAgICAgdjcgPSB2ZWNfbGQoaTMrMTYsICYob3V0WzBdKSk7Ly8gaTMKKyAgICAgICAgdjEwID0gdmVjX211bCh2NCwgdjgpOyAvLyByMip3cmUKKyAgICAgICAgdjExID0gdmVjX211bCh2NSwgdjgpOyAvLyBpMip3cmUKKyAgICAgICAgdjEyID0gdmVjX211bCh2NiwgdjgpOyAvLyByMyp3cmUKKyAgICAgICAgdjEzID0gdmVjX211bCh2NywgdjgpOyAvLyBpMyp3cmUKKworICAgICAgICB2MCA9IHZlY19sZCgwLCAmKG91dFswXSkpOyAvLyByMAorICAgICAgICB2MyA9IHZlY19sZChpMSsxNiwgJihvdXRbMF0pKTsgLy8gaTEKKyAgICAgICAgdjEwID0gdmVjX21hZGQodjUsIHY5LCB2MTApOyAvLyByMip3aW0KKyAgICAgICAgdjExID0gdmVjX25tc3ViKHY0LCB2OSwgdjExKTsgLy8gaTIqd2ltCisgICAgICAgIHYxMiA9IHZlY19ubXN1Yih2NywgdjksIHYxMik7IC8vIHIzKndpbQorICAgICAgICB2MTMgPSB2ZWNfbWFkZCh2NiwgdjksIHYxMyk7IC8vIGkzKndpbQorCisgICAgICAgIHYxID0gdmVjX2xkKDE2LCAmKG91dFswXSkpOyAvLyBpMAorICAgICAgICB2MiA9IHZlY19sZChpMSwgJihvdXRbMF0pKTsgLy8gcjEKKyAgICAgICAgdjggPSB2ZWNfc3ViKHYxMiwgdjEwKTsKKyAgICAgICAgdjEyID0gdmVjX2FkZCh2MTIsIHYxMCk7CisgICAgICAgIHY5ID0gdmVjX3N1Yih2MTEsIHYxMyk7CisgICAgICAgIHYxMyA9IHZlY19hZGQodjExLCB2MTMpOworICAgICAgICB2NCA9IHZlY19zdWIodjAsIHYxMik7CisgICAgICAgIHYwID0gdmVjX2FkZCh2MCwgdjEyKTsKKyAgICAgICAgdjcgPSB2ZWNfc3ViKHYzLCB2OCk7CisgICAgICAgIHYzID0gdmVjX2FkZCh2MywgdjgpOworCisgICAgICAgIHZlY19zdCh2MCwgMCwgJihvdXRbMF0pKTsgLy8gcjAKKyAgICAgICAgdmVjX3N0KHYzLCBpMSsxNiwgJihvdXRbMF0pKTsgLy8gaTEKKyAgICAgICAgdmVjX3N0KHY0LCBpMiwgJihvdXRbMF0pKTsgLy8gcjIKKyAgICAgICAgdmVjX3N0KHY3LCBpMysxNiwgJihvdXRbMF0pKTsgLy8gaTMKKworICAgICAgICB2NSA9IHZlY19zdWIodjEsIHYxMyk7CisgICAgICAgIHYxID0gdmVjX2FkZCh2MSwgdjEzKTsKKyAgICAgICAgdjYgPSB2ZWNfc3ViKHYyLCB2OSk7CisgICAgICAgIHYyID0gdmVjX2FkZCh2MiwgdjkpOworCisgICAgICAgIHZlY19zdCh2MSwgMTYsICYob3V0WzBdKSk7IC8vIGkwCisgICAgICAgIHZlY19zdCh2MiwgaTEsICYob3V0WzBdKSk7IC8vIHIxCisgICAgICAgIHZlY19zdCh2NSwgaTIrMTYsICYob3V0WzBdKSk7IC8vIGkyCisgICAgICAgIHZlY19zdCh2NiwgaTMsICYob3V0WzBdKSk7IC8vIHIzCisgICAgfSB3aGlsZSAobi09Mik7Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLyogQVZDT0RFQ19QUENfRkZUX1ZTWF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcGMvZm10Y29udmVydF9hbHRpdmVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvZm10Y29udmVydF9hbHRpdmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhNzE2OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9mbXRjb252ZXJ0X2FsdGl2ZWMuYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBMdWNhIEJhcmJhdG8gPGx1X3plcm9AZ2VudG9vLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9mbXRjb252ZXJ0LmgiCisKKyNpZiBIQVZFX0FMVElWRUMKKworc3RhdGljIHZvaWQgaW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXJfYWx0aXZlYyhmbG9hdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG11bCwgaW50IGxlbikKK3sKKyAgICB1bmlvbiB7CisgICAgICAgIHZlY3RvciBmbG9hdCB2OworICAgICAgICBmbG9hdCBzWzRdOworICAgIH0gbXVsX3U7CisgICAgaW50IGk7CisgICAgdmVjdG9yIGZsb2F0IHNyYzEsIHNyYzIsIGRzdDEsIGRzdDIsIG11bF92LCB6ZXJvOworCisgICAgemVybyA9ICh2ZWN0b3IgZmxvYXQpdmVjX3NwbGF0X3UzMigwKTsKKyAgICBtdWxfdS5zWzBdID0gbXVsOworICAgIG11bF92ID0gdmVjX3NwbGF0KG11bF91LnYsIDApOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7CisgICAgICAgIHNyYzEgPSB2ZWNfY3RmKHZlY19sZCgwLCAgc3JjK2kpLCAwKTsKKyAgICAgICAgc3JjMiA9IHZlY19jdGYodmVjX2xkKDE2LCBzcmMraSksIDApOworICAgICAgICBkc3QxID0gdmVjX21hZGQoc3JjMSwgbXVsX3YsIHplcm8pOworICAgICAgICBkc3QyID0gdmVjX21hZGQoc3JjMiwgbXVsX3YsIHplcm8pOworICAgICAgICB2ZWNfc3QoZHN0MSwgIDAsIGRzdCtpKTsKKyAgICAgICAgdmVjX3N0KGRzdDIsIDE2LCBkc3QraSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2ZWN0b3Igc2lnbmVkIHNob3J0IGZsb2F0X3RvX2ludDE2X29uZV9hbHRpdmVjKGNvbnN0IGZsb2F0ICpzcmMpCit7CisgICAgdmVjdG9yIGZsb2F0IHMwID0gdmVjX2xkKDAsIHNyYyk7CisgICAgdmVjdG9yIGZsb2F0IHMxID0gdmVjX2xkKDE2LCBzcmMpOworICAgIHZlY3RvciBzaWduZWQgaW50IHQwID0gdmVjX2N0cyhzMCwgMCk7CisgICAgdmVjdG9yIHNpZ25lZCBpbnQgdDEgPSB2ZWNfY3RzKHMxLCAwKTsKKyAgICByZXR1cm4gdmVjX3BhY2tzKHQwLHQxKTsKK30KKworc3RhdGljIHZvaWQgZmxvYXRfdG9faW50MTZfYWx0aXZlYyhpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGxvbmcgbGVuKQoreworICAgIGludCBpOworICAgIHZlY3RvciBzaWduZWQgc2hvcnQgZDAsIGQxLCBkOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIGFsaWduOworICAgIGlmICgoKGxvbmcpZHN0KSAmIDE1KSB7IC8vRklYTUUKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbiAtIDc7IGkgKz0gOCkgeworICAgICAgICAgICAgZDAgPSB2ZWNfbGQoMCwgZHN0K2kpOworICAgICAgICAgICAgZCAgPSBmbG9hdF90b19pbnQxNl9vbmVfYWx0aXZlYyhzcmMgKyBpKTsKKyAgICAgICAgICAgIGQxID0gdmVjX2xkKDE1LCBkc3QraSk7CisgICAgICAgICAgICBkMSA9IHZlY19wZXJtKGQxLCBkMCwgdmVjX2x2c2woMCwgZHN0ICsgaSkpOworICAgICAgICAgICAgYWxpZ24gPSB2ZWNfbHZzcigwLCBkc3QgKyBpKTsKKyAgICAgICAgICAgIGQwID0gdmVjX3Blcm0oZDEsIGQsIGFsaWduKTsKKyAgICAgICAgICAgIGQxID0gdmVjX3Blcm0oZCwgZDEsIGFsaWduKTsKKyAgICAgICAgICAgIHZlY19zdChkMCwgIDAsIGRzdCArIGkpOworICAgICAgICAgICAgdmVjX3N0KGQxLCAxNSwgZHN0ICsgaSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuIC0gNzsgaSArPSA4KSB7CisgICAgICAgICAgICBkID0gZmxvYXRfdG9faW50MTZfb25lX2FsdGl2ZWMoc3JjICsgaSk7CisgICAgICAgICAgICB2ZWNfc3QoZCwgMCwgZHN0ICsgaSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNkZWZpbmUgVlNURV9JTkMoZHN0LCB2LCBlbGVtLCBpbmMpIGRvIHsgICAgICAgICAgICAgICAgXAorICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IHMgPSB2ZWNfc3BsYXQodiwgZWxlbSk7ICAgICBcCisgICAgICAgIHZlY19zdGUocywgMCwgZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0ICs9IGluYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGZsb2F0X3RvX2ludDE2X3N0cmlkZV9hbHRpdmVjKGludDE2X3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVuLCBpbnQgc3RyaWRlKQoreworICAgIGludCBpOworICAgIHZlY3RvciBzaWduZWQgc2hvcnQgZDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSA3OyBpICs9IDgpIHsKKyAgICAgICAgZCA9IGZsb2F0X3RvX2ludDE2X29uZV9hbHRpdmVjKHNyYyArIGkpOworICAgICAgICBWU1RFX0lOQyhkc3QsIGQsIDAsIHN0cmlkZSk7CisgICAgICAgIFZTVEVfSU5DKGRzdCwgZCwgMSwgc3RyaWRlKTsKKyAgICAgICAgVlNURV9JTkMoZHN0LCBkLCAyLCBzdHJpZGUpOworICAgICAgICBWU1RFX0lOQyhkc3QsIGQsIDMsIHN0cmlkZSk7CisgICAgICAgIFZTVEVfSU5DKGRzdCwgZCwgNCwgc3RyaWRlKTsKKyAgICAgICAgVlNURV9JTkMoZHN0LCBkLCA1LCBzdHJpZGUpOworICAgICAgICBWU1RFX0lOQyhkc3QsIGQsIDYsIHN0cmlkZSk7CisgICAgICAgIFZTVEVfSU5DKGRzdCwgZCwgNywgc3RyaWRlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZsb2F0X3RvX2ludDE2X2ludGVybGVhdmVfYWx0aXZlYyhpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVuLCBpbnQgY2hhbm5lbHMpCit7CisgICAgaW50IGk7CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBkMCwgZDEsIGQyLCBjMCwgYzEsIHQwLCB0MTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBhbGlnbjsKKworICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgICAgICBmbG9hdF90b19pbnQxNl9hbHRpdmVjKGRzdCwgc3JjWzBdLCBsZW4pOworICAgIGVsc2UgeworICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMikgeworICAgICAgICAgICAgaWYgKCgobG9uZylkc3QpICYgMTUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuIC0gNzsgaSArPSA4KSB7CisgICAgICAgICAgICAgICAgICAgIGQwID0gdmVjX2xkKDAsICBkc3QgKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgdDAgPSBmbG9hdF90b19pbnQxNl9vbmVfYWx0aXZlYyhzcmNbMF0gKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgZDEgPSB2ZWNfbGQoMzEsIGRzdCArIGkpOworICAgICAgICAgICAgICAgICAgICB0MSA9IGZsb2F0X3RvX2ludDE2X29uZV9hbHRpdmVjKHNyY1sxXSArIGkpOworICAgICAgICAgICAgICAgICAgICBjMCA9IHZlY19tZXJnZWgodDAsIHQxKTsKKyAgICAgICAgICAgICAgICAgICAgYzEgPSB2ZWNfbWVyZ2VsKHQwLCB0MSk7CisgICAgICAgICAgICAgICAgICAgIGQyID0gdmVjX3Blcm0oZDEsIGQwLCB2ZWNfbHZzbCgwLCBkc3QgKyBpKSk7CisgICAgICAgICAgICAgICAgICAgIGFsaWduID0gdmVjX2x2c3IoMCwgZHN0ICsgaSk7CisgICAgICAgICAgICAgICAgICAgIGQwID0gdmVjX3Blcm0oZDIsIGMwLCBhbGlnbik7CisgICAgICAgICAgICAgICAgICAgIGQxID0gdmVjX3Blcm0oYzAsIGMxLCBhbGlnbik7CisgICAgICAgICAgICAgICAgICAgIHZlY19zdChkMCwgIDAsIGRzdCArIGkpOworICAgICAgICAgICAgICAgICAgICBkMCA9IHZlY19wZXJtKGMxLCBkMiwgYWxpZ24pOworICAgICAgICAgICAgICAgICAgICB2ZWNfc3QoZDEsIDE1LCBkc3QgKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgdmVjX3N0KGQwLCAzMSwgZHN0ICsgaSk7CisgICAgICAgICAgICAgICAgICAgIGRzdCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbiAtIDc7IGkgKz0gOCkgeworICAgICAgICAgICAgICAgICAgICB0MCA9IGZsb2F0X3RvX2ludDE2X29uZV9hbHRpdmVjKHNyY1swXSArIGkpOworICAgICAgICAgICAgICAgICAgICB0MSA9IGZsb2F0X3RvX2ludDE2X29uZV9hbHRpdmVjKHNyY1sxXSArIGkpOworICAgICAgICAgICAgICAgICAgICBkMCA9IHZlY19tZXJnZWgodDAsIHQxKTsKKyAgICAgICAgICAgICAgICAgICAgZDEgPSB2ZWNfbWVyZ2VsKHQwLCB0MSk7CisgICAgICAgICAgICAgICAgICAgIHZlY19zdChkMCwgIDAsIGRzdCArIGkpOworICAgICAgICAgICAgICAgICAgICB2ZWNfc3QoZDEsIDE2LCBkc3QgKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspCisgICAgICAgICAgICAgICAgZmxvYXRfdG9faW50MTZfc3RyaWRlX2FsdGl2ZWMoZHN0ICsgaSwgc3JjW2ldLCBsZW4sIGNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworCithdl9jb2xkIHZvaWQgZmZfZm10X2NvbnZlcnRfaW5pdF9wcGMoRm10Q29udmVydENvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYy0+aW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXIgPSBpbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhcl9hbHRpdmVjOworICAgIGlmICghKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKSB7CisgICAgICAgIGMtPmZsb2F0X3RvX2ludDE2ID0gZmxvYXRfdG9faW50MTZfYWx0aXZlYzsKKyAgICAgICAgYy0+ZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZSA9IGZsb2F0X3RvX2ludDE2X2ludGVybGVhdmVfYWx0aXZlYzsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcGMvaDI2NGNocm9tYV9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvaDI2NGNocm9tYV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2ZWZlYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9oMjY0Y2hyb21hX2luaXQuYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IFJvbWFpbiBEb2xiZWF1IDxyb21haW5AZG9sYmVhdS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaDI2NGNocm9tYS5oIgorCisjaWYgSEFWRV9BTFRJVkVDCisjZGVmaW5lIFBVVF9PUF9VOF9BTFRJVkVDKGQsIHMsIGRzdCkgZCA9IHMKKyNkZWZpbmUgQVZHX09QX1U4X0FMVElWRUMoZCwgcywgZHN0KSBkID0gdmVjX2F2Zyhkc3QsIHMpCisKKyNkZWZpbmUgT1BfVThfQUxUSVZFQyAgICAgICAgICAgICAgICAgICAgICAgICAgUFVUX09QX1U4X0FMVElWRUMKKyNkZWZpbmUgUFJFRklYX2gyNjRfY2hyb21hX21jOF9hbHRpdmVjICAgICAgICAgcHV0X2gyNjRfY2hyb21hX21jOF9hbHRpdmVjCisjZGVmaW5lIFBSRUZJWF9oMjY0X2Nocm9tYV9tYzhfbnVtICAgICAgICAgICAgIGFsdGl2ZWNfcHV0X2gyNjRfY2hyb21hX21jOF9udW0KKyNpbmNsdWRlICJoMjY0Y2hyb21hX3RlbXBsYXRlLmMiCisjdW5kZWYgT1BfVThfQUxUSVZFQworI3VuZGVmIFBSRUZJWF9oMjY0X2Nocm9tYV9tYzhfYWx0aXZlYworI3VuZGVmIFBSRUZJWF9oMjY0X2Nocm9tYV9tYzhfbnVtCisKKyNkZWZpbmUgT1BfVThfQUxUSVZFQyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZHX09QX1U4X0FMVElWRUMKKyNkZWZpbmUgUFJFRklYX2gyNjRfY2hyb21hX21jOF9hbHRpdmVjICAgICAgICAgYXZnX2gyNjRfY2hyb21hX21jOF9hbHRpdmVjCisjZGVmaW5lIFBSRUZJWF9oMjY0X2Nocm9tYV9tYzhfbnVtICAgICAgICAgICAgIGFsdGl2ZWNfYXZnX2gyNjRfY2hyb21hX21jOF9udW0KKyNpbmNsdWRlICJoMjY0Y2hyb21hX3RlbXBsYXRlLmMiCisjdW5kZWYgT1BfVThfQUxUSVZFQworI3VuZGVmIFBSRUZJWF9oMjY0X2Nocm9tYV9tYzhfYWx0aXZlYworI3VuZGVmIFBSRUZJWF9oMjY0X2Nocm9tYV9tYzhfbnVtCisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCisKK2F2X2NvbGQgdm9pZCBmZl9oMjY0Y2hyb21hX2luaXRfcHBjKEgyNjRDaHJvbWFDb250ZXh0ICpjLCBpbnQgYml0X2RlcHRoKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGNvbnN0IGludCBoaWdoX2JpdF9kZXB0aCA9IGJpdF9kZXB0aCA+IDg7CisKKyAgICBpZiAoIVBQQ19BTFRJVkVDKGF2X2dldF9jcHVfZmxhZ3MoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghaGlnaF9iaXRfZGVwdGgpIHsKKyAgICAgICAgYy0+cHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWJbMF0gPSBwdXRfaDI2NF9jaHJvbWFfbWM4X2FsdGl2ZWM7CisgICAgICAgIGMtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdID0gYXZnX2gyNjRfY2hyb21hX21jOF9hbHRpdmVjOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9oMjY0Y2hyb21hX3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvaDI2NGNocm9tYV90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMWUwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvaDI2NGNocm9tYV90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IFJvbWFpbiBEb2xiZWF1IDxyb21haW5AZG9sYmVhdS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKworLyogdGhpcyBjb2RlIGFzc3VtZSB0aGF0IHN0cmlkZSAlIDE2ID09IDAgKi8KKworI2RlZmluZSBDSFJPTUFfTUM4X0FMVElWRUNfQ09SRShCSUFTMSwgQklBUzIpIFwKKyAgICAgICAgdnNyYzJzc0ggPSAodmVjX3MxNilWRUNfTUVSR0VIKHplcm9fdTh2LCh2ZWNfdTgpdnNyYzJ1Yyk7XAorICAgICAgICB2c3JjM3NzSCA9ICh2ZWNfczE2KVZFQ19NRVJHRUgoemVyb191OHYsKHZlY191OCl2c3JjM3VjKTtcCitcCisgICAgICAgIHBzdW0gPSB2ZWNfbWxhZGQodkEsIHZzcmMwc3NILCBCSUFTMSk7XAorICAgICAgICBwc3VtID0gdmVjX21sYWRkKHZCLCB2c3JjMXNzSCwgcHN1bSk7XAorICAgICAgICBwc3VtID0gdmVjX21sYWRkKHZDLCB2c3JjMnNzSCwgcHN1bSk7XAorICAgICAgICBwc3VtID0gdmVjX21sYWRkKHZELCB2c3JjM3NzSCwgcHN1bSk7XAorICAgICAgICBwc3VtID0gQklBUzIocHN1bSk7XAorICAgICAgICBwc3VtID0gdmVjX3NyKHBzdW0sIHY2dXMpO1wKK1wKKyAgICAgICAgdmRzdCA9IHZlY19sZCgwLCBkc3QpO1wKKyAgICAgICAgcHBzdW0gPSAodmVjX3U4KXZlY19wYWNrKHBzdW0sIHBzdW0pO1wKKyAgICAgICAgdmZkc3QgPSB2ZWNfcGVybSh2ZHN0LCBwcHN1bSwgZnBlcm0pO1wKK1wKKyAgICAgICAgT1BfVThfQUxUSVZFQyhmc3VtLCB2ZmRzdCwgdmRzdCk7XAorXAorICAgICAgICB2ZWNfc3QoZnN1bSwgMCwgZHN0KTtcCitcCisgICAgICAgIHZzcmMwc3NIID0gdnNyYzJzc0g7XAorICAgICAgICB2c3JjMXNzSCA9IHZzcmMzc3NIO1wKK1wKKyAgICAgICAgZHN0ICs9IHN0cmlkZTtcCisgICAgICAgIHNyYyArPSBzdHJpZGU7CisKKyNkZWZpbmUgQ0hST01BX01DOF9BTFRJVkVDX0NPUkVfU0lNUExFIFwKK1wKKyAgICAgICAgdnNyYzBzc0ggPSAodmVjX3MxNilWRUNfTUVSR0VIKHplcm9fdTh2LCh2ZWNfdTgpdnNyYzB1Yyk7XAorICAgICAgICB2c3JjMXNzSCA9ICh2ZWNfczE2KVZFQ19NRVJHRUgoemVyb191OHYsKHZlY191OCl2c3JjMXVjKTtcCitcCisgICAgICAgIHBzdW0gPSB2ZWNfbWxhZGQodkEsIHZzcmMwc3NILCB2MzJzcyk7XAorICAgICAgICBwc3VtID0gdmVjX21sYWRkKHZFLCB2c3JjMXNzSCwgcHN1bSk7XAorICAgICAgICBwc3VtID0gdmVjX3NyKHBzdW0sIHY2dXMpO1wKK1wKKyAgICAgICAgdmRzdCA9IHZlY19sZCgwLCBkc3QpO1wKKyAgICAgICAgcHBzdW0gPSAodmVjX3U4KXZlY19wYWNrKHBzdW0sIHBzdW0pO1wKKyAgICAgICAgdmZkc3QgPSB2ZWNfcGVybSh2ZHN0LCBwcHN1bSwgZnBlcm0pO1wKK1wKKyAgICAgICAgT1BfVThfQUxUSVZFQyhmc3VtLCB2ZmRzdCwgdmRzdCk7XAorXAorICAgICAgICB2ZWNfc3QoZnN1bSwgMCwgZHN0KTtcCitcCisgICAgICAgIGRzdCArPSBzdHJpZGU7XAorICAgICAgICBzcmMgKz0gc3RyaWRlOworCisjZGVmaW5lIG5vb3AoYSkgYQorI2RlZmluZSBhZGQyOChhKSB2ZWNfYWRkKHYyOHNzLCBhKQorCisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgR0VUX1ZTUkMxKHZzMCwgb2ZmLCBiLCBwZXJtMCwgcyl7ICAgIFwKKyAgICB2ZWNfdTggdnNyY0N1YywgdnNyY0R1YzsgICAgICAgICAgICAgICAgIFwKKyAgICB2c3JjQ3VjID0gdmVjX2xkKG9mZiwgcyk7ICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobG9hZFNlY29uZCl7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdnNyY0R1YyA9IHZlY19sZChvZmYgKyBiLCBzKTsgICAgICAgIFwKKyAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdnNyY0R1YyA9IHZzcmNDdWM7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2czAgPSB2ZWNfcGVybSh2c3JjQ3VjLCB2c3JjRHVjLCBwZXJtMCk7IFwKK30KKyNkZWZpbmUgR0VUX1ZTUkModnMwLCB2czEsIG9mZiwgYiwgcGVybTAsIHBlcm0xLCBzKXsgXAorICAgIHZlY191OCB2c3JjQ3VjLCB2c3JjRHVjOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnNyY0N1YyA9IHZlY19sZChvZmYsIHMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobG9hZFNlY29uZCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2c3JjRHVjID0gdmVjX2xkKG9mZiArIGIsIHMpOyAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdnNyY0R1YyA9IHZzcmNDdWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnMwID0gdmVjX3Blcm0odnNyY0N1YywgdnNyY0R1YywgcGVybTApOyAgICAgICAgIFwKKyAgICBpZiAocmVhbGx5QmFkQWxpZ24peyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2czEgPSB2c3JjRHVjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdnMxID0gdmVjX3Blcm0odnNyY0N1YywgdnNyY0R1YywgcGVybTEpOyAgICAgXAorIH0KKworI2Vsc2UKKworI2RlZmluZSBHRVRfVlNSQzEodnMwLCBvZmYsIGIsIHBlcm0wLCBzKXsgICAgICAgICAgICBcCisgICAgdnMwID0gdmVjX3ZzeF9sZChvZmYsIHMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyB9CisjZGVmaW5lIEdFVF9WU1JDKHZzMCwgdnMxLCBvZmYsIGIsIHBlcm0wLCBwZXJtMSwgcyl7IFwKKyAgICB2czAgPSB2ZWNfdnN4X2xkKG9mZiwgcyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZzMSA9IHZlY192c3hfbGQob2ZmICsgMSwgcyk7ICAgICAgICAgICAgICAgICAgICBcCisgfQorI2VuZGlmIC8qIEhBVkVfQklHRU5ESUFOICovCisKKyNpZmRlZiBQUkVGSVhfaDI2NF9jaHJvbWFfbWM4X2FsdGl2ZWMKK3N0YXRpYyB2b2lkIFBSRUZJWF9oMjY0X2Nocm9tYV9tYzhfYWx0aXZlYyh1aW50OF90ICogZHN0LCB1aW50OF90ICogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSkgeworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc2lnbmVkIGludCwgQUJDRClbNF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgeygoOCAtIHgpICogKDggLSB5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCggICAgeCkgKiAoOCAtIHkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKDggLSB4KSAqICggICAgeSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgoICAgIHgpICogKCAgICB5KSl9OworICAgIHJlZ2lzdGVyIGludCBpOworICAgIHZlY191OCBmcGVybTsKKyAgICBMT0FEX1pFUk87CisgICAgY29uc3QgdmVjX3MzMiB2QUJDRCA9IHZlY19sZCgwLCBBQkNEKTsKKyAgICBjb25zdCB2ZWNfczE2IHZBID0gVkVDX1NQTEFUMTYodkFCQ0QsIDEpOworICAgIGNvbnN0IHZlY19zMTYgdkIgPSBWRUNfU1BMQVQxNih2QUJDRCwgMyk7CisgICAgY29uc3QgdmVjX3MxNiB2QyA9IFZFQ19TUExBVDE2KHZBQkNELCA1KTsKKyAgICBjb25zdCB2ZWNfczE2IHZEID0gVkVDX1NQTEFUMTYodkFCQ0QsIDcpOworICAgIGNvbnN0IHZlY19zMTYgdjMyc3MgPSB2ZWNfc2wodmVjX3NwbGF0X3MxNigxKSx2ZWNfc3BsYXRfdTE2KDUpKTsKKyAgICBjb25zdCB2ZWNfdTE2IHY2dXMgPSB2ZWNfc3BsYXRfdTE2KDYpOworCisgICAgdmVjX3U4IHZzcmNwZXJtMCwgdnNyY3Blcm0xOworICAgIHZlY191OCB2c3JjMHVjLCB2c3JjMXVjOworICAgIHZlY19zMTYgdnNyYzBzc0gsIHZzcmMxc3NIOworICAgIHZlY191OCB2c3JjMnVjLCB2c3JjM3VjOworICAgIHZlY19zMTYgdnNyYzJzc0gsIHZzcmMzc3NILCBwc3VtOworICAgIHZlY191OCB2ZHN0LCBwcHN1bSwgdmZkc3QsIGZzdW07CisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICByZWdpc3RlciBpbnQgbG9hZFNlY29uZCA9ICgoKHVuc2lnbmVkIGxvbmcpc3JjKSAlIDE2KSA8PSA3ID8gMCA6IDE7CisgICAgcmVnaXN0ZXIgaW50IHJlYWxseUJhZEFsaWduID0gKCgodW5zaWduZWQgbG9uZylzcmMpICUgMTYpID09IDE1ID8gMSA6IDA7CisgICAgdnNyY3Blcm0wID0gdmVjX2x2c2woMCwgc3JjKTsKKyAgICB2c3JjcGVybTEgPSB2ZWNfbHZzbCgxLCBzcmMpOworI2VuZGlmCisKKyAgICBpZiAoKCh1bnNpZ25lZCBsb25nKWRzdCkgJSAxNiA9PSAwKSB7CisgICAgICAgIGZwZXJtID0gKHZlY191OCl7MHgxMCwgMHgxMSwgMHgxMiwgMHgxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3LAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQywgMHgwRCwgMHgwRSwgMHgwRn07CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnBlcm0gPSAodmVjX3U4KXsweDAwLCAweDAxLCAweDAyLCAweDAzLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOCwgMHgxOSwgMHgxQSwgMHgxQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDFDLCAweDFELCAweDFFLCAweDFGfTsKKyAgICB9CisKKyAgICBHRVRfVlNSQyh2c3JjMHVjLCB2c3JjMXVjLCAwLCAxNiwgdnNyY3Blcm0wLCB2c3JjcGVybTEsIHNyYyk7CisKKyAgICB2c3JjMHNzSCA9ICh2ZWNfczE2KVZFQ19NRVJHRUgoemVyb191OHYsKHZlY191OCl2c3JjMHVjKTsKKyAgICB2c3JjMXNzSCA9ICh2ZWNfczE2KVZFQ19NRVJHRUgoemVyb191OHYsKHZlY191OCl2c3JjMXVjKTsKKworICAgIGlmIChBQkNEWzNdKSB7CisgICAgICAgIGZvciAoaSA9IDAgOyBpIDwgaCA7IGkrKykgeworICAgICAgICAgICAgR0VUX1ZTUkModnNyYzJ1YywgdnNyYzN1Yywgc3RyaWRlLCAxNiwgdnNyY3Blcm0wLCB2c3JjcGVybTEsIHNyYyk7CisgICAgICAgICAgICBDSFJPTUFfTUM4X0FMVElWRUNfQ09SRSh2MzJzcywgbm9vcCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB2ZWNfczE2IHZFID0gdmVjX2FkZCh2QiwgdkMpOworICAgICAgICBpZiAoQUJDRFsyXSkgeyAvLyB4ID09IDAgQiA9PSAwCisgICAgICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IGggOyBpKyspIHsKKyAgICAgICAgICAgICAgICBHRVRfVlNSQzEodnNyYzF1Yywgc3RyaWRlLCAxNSwgdnNyY3Blcm0wLCBzcmMpOworICAgICAgICAgICAgICAgIENIUk9NQV9NQzhfQUxUSVZFQ19DT1JFX1NJTVBMRTsKKyAgICAgICAgICAgICAgICB2c3JjMHVjID0gdnNyYzF1YzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8geSA9PSAwIEMgPT0gMAorICAgICAgICAgICAgZm9yIChpID0gMCA7IGkgPCBoIDsgaSsrKSB7CisgICAgICAgICAgICAgICBHRVRfVlNSQyh2c3JjMHVjLCB2c3JjMXVjLCAwLCAxNSwgdnNyY3Blcm0wLCB2c3JjcGVybTEsIHNyYyk7CisgICAgICAgICAgICAgICBDSFJPTUFfTUM4X0FMVElWRUNfQ09SRV9TSU1QTEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworLyogdGhpcyBjb2RlIGFzc3VtZSB0aGF0IHN0cmlkZSAlIDE2ID09IDAgKi8KKyNpZmRlZiBQUkVGSVhfbm9fcm5kX3ZjMV9jaHJvbWFfbWM4X2FsdGl2ZWMKK3N0YXRpYyB2b2lkIFBSRUZJWF9ub19ybmRfdmMxX2Nocm9tYV9tYzhfYWx0aXZlYyh1aW50OF90ICogZHN0LCB1aW50OF90ICogc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KSB7CisgICBERUNMQVJFX0FMSUdORUQoMTYsIHNpZ25lZCBpbnQsIEFCQ0QpWzRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsoKDggLSB4KSAqICg4IC0geSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgoICAgIHgpICogKDggLSB5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCg4IC0geCkgKiAoICAgIHkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCAgICB4KSAqICggICAgeSkpfTsKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICB2ZWNfdTggZnBlcm07CisgICAgTE9BRF9aRVJPOworICAgIGNvbnN0IHZlY19zMzIgdkFCQ0QgPSB2ZWNfbGQoMCwgQUJDRCk7CisgICAgY29uc3QgdmVjX3MxNiB2QSA9IFZFQ19TUExBVDE2KHZBQkNELCAxKTsKKyAgICBjb25zdCB2ZWNfczE2IHZCID0gVkVDX1NQTEFUMTYodkFCQ0QsIDMpOworICAgIGNvbnN0IHZlY19zMTYgdkMgPSBWRUNfU1BMQVQxNih2QUJDRCwgNSk7CisgICAgY29uc3QgdmVjX3MxNiB2RCA9IFZFQ19TUExBVDE2KHZBQkNELCA3KTsKKyAgICBjb25zdCB2ZWNfczE2IHYyOHNzID0gdmVjX3N1Yih2ZWNfc2wodmVjX3NwbGF0X3MxNigxKSx2ZWNfc3BsYXRfdTE2KDUpKSx2ZWNfc3BsYXRfczE2KDQpKTsKKyAgICBjb25zdCB2ZWNfdTE2IHY2dXMgID0gdmVjX3NwbGF0X3UxNig2KTsKKworICAgIHZlY191OCB2c3JjcGVybTAsIHZzcmNwZXJtMTsKKyAgICB2ZWNfdTggdnNyYzB1YywgdnNyYzF1YzsKKyAgICB2ZWNfczE2IHZzcmMwc3NILCB2c3JjMXNzSDsKKyAgICB2ZWNfdTggdnNyYzJ1YywgdnNyYzN1YzsKKyAgICB2ZWNfczE2IHZzcmMyc3NILCB2c3JjM3NzSCwgcHN1bTsKKyAgICB2ZWNfdTggdmRzdCwgcHBzdW0sIHZmZHN0LCBmc3VtOworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgcmVnaXN0ZXIgaW50IGxvYWRTZWNvbmQgICAgID0gKCgodW5zaWduZWQgbG9uZylzcmMpICUgMTYpIDw9IDcgPyAwIDogMTsKKyAgICByZWdpc3RlciBpbnQgcmVhbGx5QmFkQWxpZ24gPSAoKCh1bnNpZ25lZCBsb25nKXNyYykgJSAxNikgPT0gMTUgPyAxIDogMDsKKyAgICB2c3JjcGVybTAgPSB2ZWNfbHZzbCgwLCBzcmMpOworICAgIHZzcmNwZXJtMSA9IHZlY19sdnNsKDEsIHNyYyk7CisjZW5kaWYKKworICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpZHN0KSAlIDE2ID09IDApIHsKKyAgICAgICAgZnBlcm0gPSAodmVjX3U4KXsweDEwLCAweDExLCAweDEyLCAweDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDBDLCAweDBELCAweDBFLCAweDBGfTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcGVybSA9ICh2ZWNfdTgpezB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDE4LCAweDE5LCAweDFBLCAweDFCLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUZ9OworICAgIH0KKworICAgIEdFVF9WU1JDKHZzcmMwdWMsIHZzcmMxdWMsIDAsIDE2LCB2c3JjcGVybTAsIHZzcmNwZXJtMSwgc3JjKTsKKworICAgIHZzcmMwc3NIID0gKHZlY19zMTYpVkVDX01FUkdFSCh6ZXJvX3U4diwgKHZlY191OCl2c3JjMHVjKTsKKyAgICB2c3JjMXNzSCA9ICh2ZWNfczE2KVZFQ19NRVJHRUgoemVyb191OHYsICh2ZWNfdTgpdnNyYzF1Yyk7CisKKyAgICBmb3IgKGkgPSAwIDsgaSA8IGggOyBpKyspIHsKKyAgICAgICAgR0VUX1ZTUkModnNyYzJ1YywgdnNyYzN1Yywgc3RyaWRlLCAxNiwgdnNyY3Blcm0wLCB2c3JjcGVybTEsIHNyYyk7CisgICAgICAgIENIUk9NQV9NQzhfQUxUSVZFQ19DT1JFKHZlY19zcGxhdF9zMTYoMCksIGFkZDI4KTsKKyAgICB9Cit9CisjZW5kaWYKKworI3VuZGVmIG5vb3AKKyN1bmRlZiBhZGQyOAorI3VuZGVmIENIUk9NQV9NQzhfQUxUSVZFQ19DT1JFCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcGMvaDI2NGRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2gyNjRkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTExOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2gyNjRkc3AuYwpAQCAtMCwwICsxLDgwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBSb21haW4gRG9sYmVhdSA8cm9tYWluQGRvbGJlYXUub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjRkYXRhLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9oMjY0ZHNwLmgiCisKKyNpZiBIQVZFX0FMVElWRUMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEQ1QgdHJhbnNmb3JtOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVkVDXzFEX0RDVCh2YjAsdmIxLHZiMix2YjMsdmEwLHZhMSx2YTIsdmEzKSAgICAgICAgICAgICAgIFwKKyAgICAvKiAxc3Qgc3RhZ2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ejAgPSB2ZWNfYWRkKHZiMCx2YjIpOyAgICAgICAvKiB0ZW1wWzBdID0gWVswXSArIFlbMl0gKi8gICAgIFwKKyAgICB2ejEgPSB2ZWNfc3ViKHZiMCx2YjIpOyAgICAgICAvKiB0ZW1wWzFdID0gWVswXSAtIFlbMl0gKi8gICAgIFwKKyAgICB2ejIgPSB2ZWNfc3JhKHZiMSx2ZWNfc3BsYXRfdTE2KDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ejIgPSB2ZWNfc3ViKHZ6Mix2YjMpOyAgICAgICAvKiB0ZW1wWzJdID0gWVsxXS4xLzIgLSBZWzNdICovIFwKKyAgICB2ejMgPSB2ZWNfc3JhKHZiMyx2ZWNfc3BsYXRfdTE2KDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ejMgPSB2ZWNfYWRkKHZiMSx2ejMpOyAgICAgICAvKiB0ZW1wWzNdID0gWVsxXSArIFlbM10uMS8yICovIFwKKyAgICAvKiAybmQgc3RhZ2U6IG91dHB1dCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2YTAgPSB2ZWNfYWRkKHZ6MCx2ejMpOyAgICAgICAvKiB4WzBdID0gdGVtcFswXSArIHRlbXBbM10gKi8gIFwKKyAgICB2YTEgPSB2ZWNfYWRkKHZ6MSx2ejIpOyAgICAgICAvKiB4WzFdID0gdGVtcFsxXSArIHRlbXBbMl0gKi8gIFwKKyAgICB2YTIgPSB2ZWNfc3ViKHZ6MSx2ejIpOyAgICAgICAvKiB4WzJdID0gdGVtcFsxXSAtIHRlbXBbMl0gKi8gIFwKKyAgICB2YTMgPSB2ZWNfc3ViKHZ6MCx2ejMpICAgICAgICAvKiB4WzNdID0gdGVtcFswXSAtIHRlbXBbM10gKi8KKworI2RlZmluZSBWRUNfVFJBTlNQT1NFXzQoYTAsYTEsYTIsYTMsYjAsYjEsYjIsYjMpIFwKKyAgICBiMCA9IHZlY19tZXJnZWgoIGEwLCBhMCApOyBcCisgICAgYjEgPSB2ZWNfbWVyZ2VoKCBhMSwgYTAgKTsgXAorICAgIGIyID0gdmVjX21lcmdlaCggYTIsIGEwICk7IFwKKyAgICBiMyA9IHZlY19tZXJnZWgoIGEzLCBhMCApOyBcCisgICAgYTAgPSB2ZWNfbWVyZ2VoKCBiMCwgYjIgKTsgXAorICAgIGExID0gdmVjX21lcmdlbCggYjAsIGIyICk7IFwKKyAgICBhMiA9IHZlY19tZXJnZWgoIGIxLCBiMyApOyBcCisgICAgYTMgPSB2ZWNfbWVyZ2VsKCBiMSwgYjMgKTsgXAorICAgIGIwID0gdmVjX21lcmdlaCggYTAsIGEyICk7IFwKKyAgICBiMSA9IHZlY19tZXJnZWwoIGEwLCBhMiApOyBcCisgICAgYjIgPSB2ZWNfbWVyZ2VoKCBhMSwgYTMgKTsgXAorICAgIGIzID0gdmVjX21lcmdlbCggYTEsIGEzICkKKworI2lmIEhBVkVfQklHRU5ESUFOCisjZGVmaW5lIHZkc3RfbG9hZChkKSAgICAgICAgICAgICAgXAorICAgIHZkc3Rfb3JpZyA9IHZlY19sZCgwLCBkc3QpOyAgIFwKKyAgICB2ZHN0ID0gdmVjX3Blcm0odmRzdF9vcmlnLCB6ZXJvX3U4diwgdmRzdF9tYXNrKTsKKyNlbHNlCisjZGVmaW5lIHZkc3RfbG9hZChkKSB2ZHN0ID0gdmVjX3ZzeF9sZCgwLCBkc3QpCisjZW5kaWYKKworI2RlZmluZSBWRUNfTE9BRF9VOF9BRERfUzE2X1NUT1JFX1U4KHZhKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmRzdF9sb2FkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZHN0X3NzID0gKHZlY19zMTYpIFZFQ19NRVJHRUgoemVyb191OHYsIHZkc3QpOyAgICAgICAgICAgXAorICAgIHZhID0gdmVjX2FkZCh2YSwgdmRzdF9zcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmFfdTggPSB2ZWNfcGFja3N1KHZhLCB6ZXJvX3MxNnYpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2YV91MzIgPSB2ZWNfc3BsYXQoKHZlY191MzIpdmFfdTgsIDApOyAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfc3RlKHZhX3UzMiwgZWxlbWVudCwgKHVpbnQzMl90Kilkc3QpOworCitzdGF0aWMgdm9pZCBoMjY0X2lkY3RfYWRkX2FsdGl2ZWModWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKK3sKKyAgICB2ZWNfczE2IHZhMCwgdmExLCB2YTIsIHZhMzsKKyAgICB2ZWNfczE2IHZ6MCwgdnoxLCB2ejIsIHZ6MzsKKyAgICB2ZWNfczE2IHZ0bXAwLCB2dG1wMSwgdnRtcDIsIHZ0bXAzOworICAgIHZlY191OCB2YV91ODsKKyAgICB2ZWNfdTMyIHZhX3UzMjsKKyAgICB2ZWNfczE2IHZkc3Rfc3M7CisgICAgY29uc3QgdmVjX3UxNiB2NnVzID0gdmVjX3NwbGF0X3UxNig2KTsKKyAgICB2ZWNfdTggdmRzdCwgdmRzdF9vcmlnOworICAgIHZlY191OCB2ZHN0X21hc2sgPSB2ZWNfbHZzbCgwLCBkc3QpOworICAgIGludCBlbGVtZW50ID0gKCh1bnNpZ25lZCBsb25nKWRzdCAmIDB4ZikgPj4gMjsKKyAgICBMT0FEX1pFUk87CisKKyAgICBibG9ja1swXSArPSAzMjsgIC8qIGFkZCAzMiBhcyBhIERDLWxldmVsIGZvciByb3VuZGluZyAqLworCisgICAgdnRtcDAgPSB2ZWNfbGQoMCxibG9jayk7CisgICAgdnRtcDEgPSB2ZWNfc2xkKHZ0bXAwLCB2dG1wMCwgOCk7CisgICAgdnRtcDIgPSB2ZWNfbGQoMTYsYmxvY2spOworICAgIHZ0bXAzID0gdmVjX3NsZCh2dG1wMiwgdnRtcDIsIDgpOworICAgIG1lbXNldChibG9jaywgMCwgMTYgKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgVkVDXzFEX0RDVCh2dG1wMCx2dG1wMSx2dG1wMix2dG1wMyx2YTAsdmExLHZhMix2YTMpOworICAgIFZFQ19UUkFOU1BPU0VfNCh2YTAsdmExLHZhMix2YTMsdnRtcDAsdnRtcDEsdnRtcDIsdnRtcDMpOworICAgIFZFQ18xRF9EQ1QodnRtcDAsdnRtcDEsdnRtcDIsdnRtcDMsdmEwLHZhMSx2YTIsdmEzKTsKKworICAgIHZhMCA9IHZlY19zcmEodmEwLHY2dXMpOworICAgIHZhMSA9IHZlY19zcmEodmExLHY2dXMpOworICAgIHZhMiA9IHZlY19zcmEodmEyLHY2dXMpOworICAgIHZhMyA9IHZlY19zcmEodmEzLHY2dXMpOworCisgICAgVkVDX0xPQURfVThfQUREX1MxNl9TVE9SRV9VOCh2YTApOworICAgIGRzdCArPSBzdHJpZGU7CisgICAgVkVDX0xPQURfVThfQUREX1MxNl9TVE9SRV9VOCh2YTEpOworICAgIGRzdCArPSBzdHJpZGU7CisgICAgVkVDX0xPQURfVThfQUREX1MxNl9TVE9SRV9VOCh2YTIpOworICAgIGRzdCArPSBzdHJpZGU7CisgICAgVkVDX0xPQURfVThfQUREX1MxNl9TVE9SRV9VOCh2YTMpOworfQorCisjZGVmaW5lIElEQ1Q4XzFEX0FMVElWRUMoczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCAgZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3KSB7XAorICAgIC8qICAgICAgICBhMCAgPSBTUkMoMCkgKyBTUkMoNCk7ICovIFwKKyAgICB2ZWNfczE2IGEwdiA9IHZlY19hZGQoczAsIHM0KTsgICAgXAorICAgIC8qICAgICAgICBhMiAgPSBTUkMoMCkgLSBTUkMoNCk7ICovIFwKKyAgICB2ZWNfczE2IGEydiA9IHZlY19zdWIoczAsIHM0KTsgICAgXAorICAgIC8qICAgICAgICBhNCAgPSAgICAgICAgICAgKFNSQygyKT4+MSkgLSBTUkMoNik7ICovIFwKKyAgICB2ZWNfczE2IGE0diA9IHZlY19zdWIodmVjX3NyYShzMiwgb25ldiksIHM2KTsgICAgXAorICAgIC8qICAgICAgICBhNiAgPSAgICAgICAgICAgKFNSQyg2KT4+MSkgKyBTUkMoMik7ICovIFwKKyAgICB2ZWNfczE2IGE2diA9IHZlY19hZGQodmVjX3NyYShzNiwgb25ldiksIHMyKTsgICAgXAorICAgIC8qICAgICAgICBiMCAgPSAgICAgICAgIGEwICsgYTY7ICovIFwKKyAgICB2ZWNfczE2IGIwdiA9IHZlY19hZGQoYTB2LCBhNnYpOyAgXAorICAgIC8qICAgICAgICBiMiAgPSAgICAgICAgIGEyICsgYTQ7ICovIFwKKyAgICB2ZWNfczE2IGIydiA9IHZlY19hZGQoYTJ2LCBhNHYpOyAgXAorICAgIC8qICAgICAgICBiNCAgPSAgICAgICAgIGEyIC0gYTQ7ICovIFwKKyAgICB2ZWNfczE2IGI0diA9IHZlY19zdWIoYTJ2LCBhNHYpOyAgXAorICAgIC8qICAgICAgICBiNiAgPSAgICAgICAgIGEwIC0gYTY7ICovIFwKKyAgICB2ZWNfczE2IGI2diA9IHZlY19zdWIoYTB2LCBhNnYpOyAgXAorICAgIC8qIGExID0gIFNSQyg1KSAtIFNSQygzKSAtIFNSQyg3KSAtIChTUkMoNyk+PjEpOyAqLyBcCisgICAgLyogICAgICAgIGExID0gICAgICAgICAgICAgKFNSQyg1KS1TUkMoMykpIC0gIChTUkMoNykgICsgIChTUkMoNyk+PjEpKTsgKi8gXAorICAgIHZlY19zMTYgYTF2ID0gdmVjX3N1YiggdmVjX3N1YihzNSwgczMpLCB2ZWNfYWRkKHM3LCB2ZWNfc3JhKHM3LCBvbmV2KSkgKTsgXAorICAgIC8qIGEzID0gIFNSQyg3KSArIFNSQygxKSAtIFNSQygzKSAtIChTUkMoMyk+PjEpOyAqLyBcCisgICAgLyogICAgICAgIGEzID0gICAgICAgICAgICAgKFNSQyg3KStTUkMoMSkpIC0gIChTUkMoMykgICsgIChTUkMoMyk+PjEpKTsgKi8gXAorICAgIHZlY19zMTYgYTN2ID0gdmVjX3N1YiggdmVjX2FkZChzNywgczEpLCB2ZWNfYWRkKHMzLCB2ZWNfc3JhKHMzLCBvbmV2KSkgKTtcCisgICAgLyogYTUgPSAgU1JDKDcpIC0gU1JDKDEpICsgU1JDKDUpICsgKFNSQyg1KT4+MSk7ICovIFwKKyAgICAvKiAgICAgICAgYTUgPSAgICAgICAgICAgICAoU1JDKDcpLVNSQygxKSkgKyAgIFNSQyg1KSArICAgKFNSQyg1KT4+MSk7ICovIFwKKyAgICB2ZWNfczE2IGE1diA9IHZlY19hZGQoIHZlY19zdWIoczcsIHMxKSwgdmVjX2FkZChzNSwgdmVjX3NyYShzNSwgb25ldikpICk7XAorICAgIC8qICAgICAgICBhNyA9ICAgICAgICAgICAgICAgIFNSQyg1KStTUkMoMykgKyAgU1JDKDEpICsgICAoU1JDKDEpPj4xKTsgKi8gXAorICAgIHZlY19zMTYgYTd2ID0gdmVjX2FkZCggdmVjX2FkZChzNSwgczMpLCB2ZWNfYWRkKHMxLCB2ZWNfc3JhKHMxLCBvbmV2KSkgKTtcCisgICAgLyogICAgICAgIGIxID0gICAgICAgICAgICAgICAgICAoYTc+PjIpICArICBhMTsgKi8gXAorICAgIHZlY19zMTYgYjF2ID0gdmVjX2FkZCggdmVjX3NyYShhN3YsIHR3b3YpLCBhMXYpOyBcCisgICAgLyogICAgICAgIGIzID0gICAgICAgICAgYTMgKyAgICAgICAgKGE1Pj4yKTsgKi8gXAorICAgIHZlY19zMTYgYjN2ID0gdmVjX2FkZChhM3YsIHZlY19zcmEoYTV2LCB0d292KSk7IFwKKyAgICAvKiAgICAgICAgYjUgPSAgICAgICAgICAgICAgICAgIChhMz4+MikgIC0gICBhNTsgKi8gXAorICAgIHZlY19zMTYgYjV2ID0gdmVjX3N1YiggdmVjX3NyYShhM3YsIHR3b3YpLCBhNXYpOyBcCisgICAgLyogICAgICAgIGI3ID0gICAgICAgICAgIGE3IC0gICAgICAgIChhMT4+Mik7ICovIFwKKyAgICB2ZWNfczE2IGI3diA9IHZlY19zdWIoIGE3diwgdmVjX3NyYShhMXYsIHR3b3YpKTsgXAorICAgIC8qIERTVCgwLCAgICBiMCArIGI3KTsgKi8gXAorICAgIGQwID0gdmVjX2FkZChiMHYsIGI3dik7IFwKKyAgICAvKiBEU1QoMSwgICAgYjIgKyBiNSk7ICovIFwKKyAgICBkMSA9IHZlY19hZGQoYjJ2LCBiNXYpOyBcCisgICAgLyogRFNUKDIsICAgIGI0ICsgYjMpOyAqLyBcCisgICAgZDIgPSB2ZWNfYWRkKGI0diwgYjN2KTsgXAorICAgIC8qIERTVCgzLCAgICBiNiArIGIxKTsgKi8gXAorICAgIGQzID0gdmVjX2FkZChiNnYsIGIxdik7IFwKKyAgICAvKiBEU1QoNCwgICAgYjYgLSBiMSk7ICovIFwKKyAgICBkNCA9IHZlY19zdWIoYjZ2LCBiMXYpOyBcCisgICAgLyogRFNUKDUsICAgIGI0IC0gYjMpOyAqLyBcCisgICAgZDUgPSB2ZWNfc3ViKGI0diwgYjN2KTsgXAorICAgIC8qIERTVCg2LCAgICBiMiAtIGI1KTsgKi8gXAorICAgIGQ2ID0gdmVjX3N1YihiMnYsIGI1dik7IFwKKyAgICAvKiBEU1QoNywgICAgYjAgLSBiNyk7ICovIFwKKyAgICBkNyA9IHZlY19zdWIoYjB2LCBiN3YpOyBcCit9CisKKyNpZiBIQVZFX0JJR0VORElBTgorI2RlZmluZSBHRVRfMlBFUk0obGR2LCBzdHYsIGQpICBcCisgICAgbGR2ID0gdmVjX2x2c2woMCwgZCk7ICAgICAgIFwKKyAgICBzdHYgPSB2ZWNfbHZzcig4LCBkKTsKKyNkZWZpbmUgZHN0dl9sb2FkKGQpICAgICAgICAgICAgXAorICAgIHZlY191OCBodiA9IHZlY19sZCggMCwgZCApOyBcCisgICAgdmVjX3U4IGx2ID0gdmVjX2xkKCA3LCBkKTsgIFwKKyAgICB2ZWNfdTggZHN0diAgID0gdmVjX3Blcm0oIGh2LCBsdiwgKHZlY191OClwZXJtX2xkdiApOworI2RlZmluZSBkZXN0X3VubGlnbmVkX3N0b3JlKGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY191OCBlZGdlaHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY191OCBib2R5diAgPSB2ZWNfcGVybSggaWRzdHN1bTgsIGlkc3RzdW04LCBwZXJtX3N0diApOyAgXAorICAgIHZlY191OCBlZGdlbHYgPSB2ZWNfcGVybSggc2VsLCB6ZXJvX3U4diwgcGVybV9zdHYgKTsgICAgICAgXAorICAgIGx2ICAgID0gdmVjX3NlbCggbHYsIGJvZHl2LCBlZGdlbHYgKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY19zdCggbHYsIDcsIGQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGh2ICAgID0gdmVjX2xkKCAwLCBkICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVkZ2VodiA9IHZlY19wZXJtKCB6ZXJvX3U4diwgc2VsLCBwZXJtX3N0diApOyAgICAgICAgICAgICAgXAorICAgIGh2ICAgID0gdmVjX3NlbCggaHYsIGJvZHl2LCBlZGdlaHYgKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY19zdCggaHYsIDAsIGQgKTsKKyNlbHNlCisKKyNkZWZpbmUgR0VUXzJQRVJNKGxkdiwgc3R2LCBkKSB7fQorI2RlZmluZSBkc3R2X2xvYWQoZCkgdmVjX3U4IGRzdHYgPSB2ZWNfdnN4X2xkKDAsIGQpCisjZGVmaW5lIGRlc3RfdW5saWduZWRfc3RvcmUoZClcCisgICAgdmVjX3U4IGRzdDggPSB2ZWNfcGVybSgodmVjX3U4KWlkc3RzdW04LCBkc3R2LCB2Y3BybSgyLDMsczIsczMpKTtcCisgICAgdmVjX3ZzeF9zdChkc3Q4LCAwLCBkKQorI2VuZGlmIC8qIEhBVkVfQklHRU5ESUFOICovCisKKyNkZWZpbmUgQUxUSVZFQ19TVE9SRV9TVU1fQ0xJUChkZXN0LCBpZGN0diwgcGVybV9sZHYsIHBlcm1fc3R2LCBzZWwpIHsgXAorICAgIC8qIHVuYWxpZ25lZCBsb2FkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHZfbG9hZChkZXN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY19zMTYgaWRjdF9zaDYgPSB2ZWNfc3JhKGlkY3R2LCBzaXh2KTsgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfdTE2IGRzdDE2ID0gKHZlY191MTYpVkVDX01FUkdFSCh6ZXJvX3U4diwgZHN0dik7ICAgXAorICAgIHZlY19zMTYgaWRzdHN1bSA9IHZlY19hZGRzKGlkY3Rfc2g2LCAodmVjX3MxNilkc3QxNik7ICBcCisgICAgdmVjX3U4IGlkc3RzdW04ID0gdmVjX3BhY2tzdSh6ZXJvX3MxNnYsIGlkc3RzdW0pOyAgICAgICAgXAorICAgIC8qIHVuYWxpZ25lZCBzdG9yZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlc3RfdW5saWduZWRfc3RvcmUoZGVzdCk7XAorfQorCitzdGF0aWMgdm9pZCBoMjY0X2lkY3Q4X2FkZF9hbHRpdmVjKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqZGN0LCBpbnQgc3RyaWRlKQoreworICAgIHZlY19zMTYgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3OworICAgIHZlY19zMTYgZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3OworICAgIHZlY19zMTYgaWRjdDAsIGlkY3QxLCBpZGN0MiwgaWRjdDMsIGlkY3Q0LCBpZGN0NSwgaWRjdDYsIGlkY3Q3OworCisgICAgdmVjX3U4IHBlcm1fbGR2LCBwZXJtX3N0djsKKyAgICBHRVRfMlBFUk0ocGVybV9sZHYsIHBlcm1fc3R2LCBkc3QpOworCisgICAgY29uc3QgdmVjX3UxNiBvbmV2ID0gdmVjX3NwbGF0X3UxNigxKTsKKyAgICBjb25zdCB2ZWNfdTE2IHR3b3YgPSB2ZWNfc3BsYXRfdTE2KDIpOworICAgIGNvbnN0IHZlY191MTYgc2l4diA9IHZlY19zcGxhdF91MTYoNik7CisKKyAgICBjb25zdCB2ZWNfdTggc2VsID0gKHZlY191OCkgezAsMCwwLDAsMCwwLDAsMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX07CisgICAgTE9BRF9aRVJPOworCisgICAgZGN0WzBdICs9IDMyOyAvLyByb3VuZGluZyBmb3IgdGhlID4+NiBhdCB0aGUgZW5kCisKKyAgICBzMCA9IHZlY19sZCgweDAwLCAoaW50MTZfdCopZGN0KTsKKyAgICBzMSA9IHZlY19sZCgweDEwLCAoaW50MTZfdCopZGN0KTsKKyAgICBzMiA9IHZlY19sZCgweDIwLCAoaW50MTZfdCopZGN0KTsKKyAgICBzMyA9IHZlY19sZCgweDMwLCAoaW50MTZfdCopZGN0KTsKKyAgICBzNCA9IHZlY19sZCgweDQwLCAoaW50MTZfdCopZGN0KTsKKyAgICBzNSA9IHZlY19sZCgweDUwLCAoaW50MTZfdCopZGN0KTsKKyAgICBzNiA9IHZlY19sZCgweDYwLCAoaW50MTZfdCopZGN0KTsKKyAgICBzNyA9IHZlY19sZCgweDcwLCAoaW50MTZfdCopZGN0KTsKKyAgICBtZW1zZXQoZGN0LCAwLCA2NCAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICBJRENUOF8xRF9BTFRJVkVDKHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNywKKyAgICAgICAgICAgICAgICAgICAgIGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNyk7CisKKyAgICBUUkFOU1BPU0U4KCBkMCwgIGQxLCAgZDIsICBkMywgIGQ0LCAgZDUsICBkNiwgZDcgKTsKKworICAgIElEQ1Q4XzFEX0FMVElWRUMoZDAsICBkMSwgIGQyLCAgZDMsICBkNCwgIGQ1LCAgZDYsIGQ3LAorICAgICAgICAgICAgICAgICAgICAgaWRjdDAsIGlkY3QxLCBpZGN0MiwgaWRjdDMsIGlkY3Q0LCBpZGN0NSwgaWRjdDYsIGlkY3Q3KTsKKworICAgIEFMVElWRUNfU1RPUkVfU1VNX0NMSVAoJmRzdFswKnN0cmlkZV0sIGlkY3QwLCBwZXJtX2xkdiwgcGVybV9zdHYsIHNlbCk7CisgICAgQUxUSVZFQ19TVE9SRV9TVU1fQ0xJUCgmZHN0WzEqc3RyaWRlXSwgaWRjdDEsIHBlcm1fbGR2LCBwZXJtX3N0diwgc2VsKTsKKyAgICBBTFRJVkVDX1NUT1JFX1NVTV9DTElQKCZkc3RbMipzdHJpZGVdLCBpZGN0MiwgcGVybV9sZHYsIHBlcm1fc3R2LCBzZWwpOworICAgIEFMVElWRUNfU1RPUkVfU1VNX0NMSVAoJmRzdFszKnN0cmlkZV0sIGlkY3QzLCBwZXJtX2xkdiwgcGVybV9zdHYsIHNlbCk7CisgICAgQUxUSVZFQ19TVE9SRV9TVU1fQ0xJUCgmZHN0WzQqc3RyaWRlXSwgaWRjdDQsIHBlcm1fbGR2LCBwZXJtX3N0diwgc2VsKTsKKyAgICBBTFRJVkVDX1NUT1JFX1NVTV9DTElQKCZkc3RbNSpzdHJpZGVdLCBpZGN0NSwgcGVybV9sZHYsIHBlcm1fc3R2LCBzZWwpOworICAgIEFMVElWRUNfU1RPUkVfU1VNX0NMSVAoJmRzdFs2KnN0cmlkZV0sIGlkY3Q2LCBwZXJtX2xkdiwgcGVybV9zdHYsIHNlbCk7CisgICAgQUxUSVZFQ19TVE9SRV9TVU1fQ0xJUCgmZHN0Wzcqc3RyaWRlXSwgaWRjdDcsIHBlcm1fbGR2LCBwZXJtX3N0diwgc2VsKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBoMjY0X2lkY3RfZGNfYWRkX2ludGVybmFsKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsIGludCBzaXplKQoreworICAgIHZlY19zMTYgZGMxNjsKKyAgICB2ZWNfdTggZGNwbHVzLCBkY21pbnVzLCB2MCwgdjEsIHYyLCB2MywgYWxpZ25lcjsKKyAgICB2ZWNfczMyIHZfZGMzMjsKKyAgICBMT0FEX1pFUk87CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQsIGRjKTsKKyAgICBpbnQgaTsKKworICAgIGRjID0gKGJsb2NrWzBdICsgMzIpID4+IDY7CisgICAgYmxvY2tbMF0gPSAwOworICAgIHZfZGMzMiA9IHZlY19sZGUoMCwgJmRjKTsKKyAgICBkYzE2ID0gVkVDX1NQTEFUMTYoKHZlY19zMTYpdl9kYzMyLCAxKTsKKworICAgIGlmIChzaXplID09IDQpCisgICAgICAgIGRjMTYgPSBWRUNfU0xEMTYoZGMxNiwgemVyb19zMTZ2LCA4KTsKKyAgICBkY3BsdXMgPSB2ZWNfcGFja3N1KGRjMTYsIHplcm9fczE2dik7CisgICAgZGNtaW51cyA9IHZlY19wYWNrc3UodmVjX3N1Yih6ZXJvX3MxNnYsIGRjMTYpLCB6ZXJvX3MxNnYpOworCisgICAgYWxpZ25lciA9IHZlY19sdnNyKDAsIGRzdCk7CisjaWYgIUhBVkVfQklHRU5ESUFOCisgICAgYWxpZ25lciA9IHZlY19wZXJtKGFsaWduZXIsIHplcm9fdTh2LCB2Y3N3YXBjKCkpOworI2VuZGlmCisgICAgZGNwbHVzID0gdmVjX3Blcm0oZGNwbHVzLCBkY3BsdXMsIGFsaWduZXIpOworICAgIGRjbWludXMgPSB2ZWNfcGVybShkY21pbnVzLCBkY21pbnVzLCBhbGlnbmVyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IDQpIHsKKyAgICAgICAgdjAgPSB2ZWNfbGQoMCwgZHN0KzAqc3RyaWRlKTsKKyAgICAgICAgdjEgPSB2ZWNfbGQoMCwgZHN0KzEqc3RyaWRlKTsKKyAgICAgICAgdjIgPSB2ZWNfbGQoMCwgZHN0KzIqc3RyaWRlKTsKKyAgICAgICAgdjMgPSB2ZWNfbGQoMCwgZHN0KzMqc3RyaWRlKTsKKworICAgICAgICB2MCA9IHZlY19hZGRzKHYwLCBkY3BsdXMpOworICAgICAgICB2MSA9IHZlY19hZGRzKHYxLCBkY3BsdXMpOworICAgICAgICB2MiA9IHZlY19hZGRzKHYyLCBkY3BsdXMpOworICAgICAgICB2MyA9IHZlY19hZGRzKHYzLCBkY3BsdXMpOworCisgICAgICAgIHYwID0gdmVjX3N1YnModjAsIGRjbWludXMpOworICAgICAgICB2MSA9IHZlY19zdWJzKHYxLCBkY21pbnVzKTsKKyAgICAgICAgdjIgPSB2ZWNfc3Vicyh2MiwgZGNtaW51cyk7CisgICAgICAgIHYzID0gdmVjX3N1YnModjMsIGRjbWludXMpOworCisgICAgICAgIHZlY19zdCh2MCwgMCwgZHN0KzAqc3RyaWRlKTsKKyAgICAgICAgdmVjX3N0KHYxLCAwLCBkc3QrMSpzdHJpZGUpOworICAgICAgICB2ZWNfc3QodjIsIDAsIGRzdCsyKnN0cmlkZSk7CisgICAgICAgIHZlY19zdCh2MywgMCwgZHN0KzMqc3RyaWRlKTsKKworICAgICAgICBkc3QgKz0gNCpzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoMjY0X2lkY3RfZGNfYWRkX2FsdGl2ZWModWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKK3sKKyAgICBoMjY0X2lkY3RfZGNfYWRkX2ludGVybmFsKGRzdCwgYmxvY2ssIHN0cmlkZSwgNCk7Cit9CisKK3N0YXRpYyB2b2lkIGgyNjRfaWRjdDhfZGNfYWRkX2FsdGl2ZWModWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKK3sKKyAgICBoMjY0X2lkY3RfZGNfYWRkX2ludGVybmFsKGRzdCwgYmxvY2ssIHN0cmlkZSwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIGgyNjRfaWRjdF9hZGQxNl9hbHRpdmVjKHVpbnQ4X3QgKmRzdCwgY29uc3QgaW50ICpibG9ja19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1sxNSAqIDhdKQoreworICAgIGludCBpOworICAgIGZvcihpPTA7IGk8MTY7IGkrKyl7CisgICAgICAgIGludCBubnogPSBubnpjWyBzY2FuOFtpXSBdOworICAgICAgICBpZihubnopeworICAgICAgICAgICAgaWYobm56PT0xICYmIGJsb2NrW2kqMTZdKSBoMjY0X2lkY3RfZGNfYWRkX2FsdGl2ZWMoZHN0ICsgYmxvY2tfb2Zmc2V0W2ldLCBibG9jayArIGkqMTYsIHN0cmlkZSk7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIGgyNjRfaWRjdF9hZGRfYWx0aXZlYyhkc3QgKyBibG9ja19vZmZzZXRbaV0sIGJsb2NrICsgaSoxNiwgc3RyaWRlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaDI2NF9pZGN0X2FkZDE2aW50cmFfYWx0aXZlYyh1aW50OF90ICpkc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzE1ICogOF0pCit7CisgICAgaW50IGk7CisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKXsKKyAgICAgICAgaWYobm56Y1sgc2NhbjhbaV0gXSkgaDI2NF9pZGN0X2FkZF9hbHRpdmVjKGRzdCArIGJsb2NrX29mZnNldFtpXSwgYmxvY2sgKyBpKjE2LCBzdHJpZGUpOworICAgICAgICBlbHNlIGlmKGJsb2NrW2kqMTZdKSBoMjY0X2lkY3RfZGNfYWRkX2FsdGl2ZWMoZHN0ICsgYmxvY2tfb2Zmc2V0W2ldLCBibG9jayArIGkqMTYsIHN0cmlkZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoMjY0X2lkY3Q4X2FkZDRfYWx0aXZlYyh1aW50OF90ICpkc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5uemNbMTUgKiA4XSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoaT0wOyBpPDE2OyBpKz00KXsKKyAgICAgICAgaW50IG5ueiA9IG5uemNbIHNjYW44W2ldIF07CisgICAgICAgIGlmKG5ueil7CisgICAgICAgICAgICBpZihubno9PTEgJiYgYmxvY2tbaSoxNl0pIGgyNjRfaWRjdDhfZGNfYWRkX2FsdGl2ZWMoZHN0ICsgYmxvY2tfb2Zmc2V0W2ldLCBibG9jayArIGkqMTYsIHN0cmlkZSk7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIGgyNjRfaWRjdDhfYWRkX2FsdGl2ZWMoZHN0ICsgYmxvY2tfb2Zmc2V0W2ldLCBibG9jayArIGkqMTYsIHN0cmlkZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGgyNjRfaWRjdF9hZGQ4X2FsdGl2ZWModWludDhfdCAqKmRlc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzE1ICogOF0pCit7CisgICAgaW50IGksIGo7CisgICAgZm9yIChqID0gMTsgaiA8IDM7IGorKykgeworICAgICAgICBmb3IoaSA9IGogKiAxNjsgaSA8IGogKiAxNiArIDQ7IGkrKyl7CisgICAgICAgICAgICBpZihubnpjWyBzY2FuOFtpXSBdKQorICAgICAgICAgICAgICAgIGgyNjRfaWRjdF9hZGRfYWx0aXZlYyhkZXN0W2otMV0gKyBibG9ja19vZmZzZXRbaV0sIGJsb2NrICsgaSoxNiwgc3RyaWRlKTsKKyAgICAgICAgICAgIGVsc2UgaWYoYmxvY2tbaSoxNl0pCisgICAgICAgICAgICAgICAgaDI2NF9pZGN0X2RjX2FkZF9hbHRpdmVjKGRlc3Rbai0xXSArIGJsb2NrX29mZnNldFtpXSwgYmxvY2sgKyBpKjE2LCBzdHJpZGUpOworICAgICAgICB9CisgICAgfQorfQorCisjZGVmaW5lIHRyYW5zcG9zZTR4MTYocjAsIHIxLCByMiwgcjMpIHsgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHI0OyAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZ2lzdGVyIHZlY191OCByNTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWdpc3RlciB2ZWNfdTggcjY7ICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHI3OyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHI0ID0gdmVjX21lcmdlaChyMCwgcjIpOyAgLyowLCAyIHNldCAwKi8gXAorICAgIHI1ID0gdmVjX21lcmdlbChyMCwgcjIpOyAgLyowLCAyIHNldCAxKi8gXAorICAgIHI2ID0gdmVjX21lcmdlaChyMSwgcjMpOyAgLyoxLCAzIHNldCAwKi8gXAorICAgIHI3ID0gdmVjX21lcmdlbChyMSwgcjMpOyAgLyoxLCAzIHNldCAxKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIwID0gdmVjX21lcmdlaChyNCwgcjYpOyAgLyphbGwgc2V0IDAqLyAgXAorICAgIHIxID0gdmVjX21lcmdlbChyNCwgcjYpOyAgLyphbGwgc2V0IDEqLyAgXAorICAgIHIyID0gdmVjX21lcmdlaChyNSwgcjcpOyAgLyphbGwgc2V0IDIqLyAgXAorICAgIHIzID0gdmVjX21lcmdlbChyNSwgcjcpOyAgLyphbGwgc2V0IDMqLyAgXAorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGUxNng0KHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHZlY191OCByMCwgcmVnaXN0ZXIgdmVjX3U4IHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciB2ZWNfdTggcjIsIHJlZ2lzdGVyIHZlY191OCByMykgeworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdW5zaWduZWQgY2hhciwgcmVzdWx0KVs2NF07CisgICAgdWludDMyX3QgKnNyY19pbnQgPSAodWludDMyX3QgKilyZXN1bHQsICpkc3RfaW50ID0gKHVpbnQzMl90ICopZHN0OworICAgIGludCBpbnRfZHN0X3N0cmlkZSA9IGRzdF9zdHJpZGUvNDsKKworICAgIHZlY19zdChyMCwgMCwgcmVzdWx0KTsKKyAgICB2ZWNfc3QocjEsIDE2LCByZXN1bHQpOworICAgIHZlY19zdChyMiwgMzIsIHJlc3VsdCk7CisgICAgdmVjX3N0KHIzLCA0OCwgcmVzdWx0KTsKKyAgICAvKiBGSVhNRTogdGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSEhISEgKi8KKyAgICAqZHN0X2ludCA9ICpzcmNfaW50OworICAgICooZHN0X2ludCsgICBpbnRfZHN0X3N0cmlkZSkgPSAqKHNyY19pbnQgKyAxKTsKKyAgICAqKGRzdF9pbnQrIDIqaW50X2RzdF9zdHJpZGUpID0gKihzcmNfaW50ICsgMik7CisgICAgKihkc3RfaW50KyAzKmludF9kc3Rfc3RyaWRlKSA9ICooc3JjX2ludCArIDMpOworICAgICooZHN0X2ludCsgNCppbnRfZHN0X3N0cmlkZSkgPSAqKHNyY19pbnQgKyA0KTsKKyAgICAqKGRzdF9pbnQrIDUqaW50X2RzdF9zdHJpZGUpID0gKihzcmNfaW50ICsgNSk7CisgICAgKihkc3RfaW50KyA2KmludF9kc3Rfc3RyaWRlKSA9ICooc3JjX2ludCArIDYpOworICAgICooZHN0X2ludCsgNyppbnRfZHN0X3N0cmlkZSkgPSAqKHNyY19pbnQgKyA3KTsKKyAgICAqKGRzdF9pbnQrIDgqaW50X2RzdF9zdHJpZGUpID0gKihzcmNfaW50ICsgOCk7CisgICAgKihkc3RfaW50KyA5KmludF9kc3Rfc3RyaWRlKSA9ICooc3JjX2ludCArIDkpOworICAgICooZHN0X2ludCsxMCppbnRfZHN0X3N0cmlkZSkgPSAqKHNyY19pbnQgKyAxMCk7CisgICAgKihkc3RfaW50KzExKmludF9kc3Rfc3RyaWRlKSA9ICooc3JjX2ludCArIDExKTsKKyAgICAqKGRzdF9pbnQrMTIqaW50X2RzdF9zdHJpZGUpID0gKihzcmNfaW50ICsgMTIpOworICAgICooZHN0X2ludCsxMyppbnRfZHN0X3N0cmlkZSkgPSAqKHNyY19pbnQgKyAxMyk7CisgICAgKihkc3RfaW50KzE0KmludF9kc3Rfc3RyaWRlKSA9ICooc3JjX2ludCArIDE0KTsKKyAgICAqKGRzdF9pbnQrMTUqaW50X2RzdF9zdHJpZGUpID0gKihzcmNfaW50ICsgMTUpOworfQorCisvKiogQGJyaWVmIHBlcmZvcm1zIGEgNngxNiB0cmFuc3Bvc2Ugb2YgZGF0YSBpbiBzcmMsIGFuZCBzdG9yZXMgaXQgdG8gZHN0CisgICAgQHRvZG8gRklYTUU6IHNlZSBpZiB3ZSBjYW4ndCBzcGFyZSBzb21lIHZlY19sdnNsKCkgYnkgdGhlbSBmYWN0b3JpemluZworICAgIG91dCBvZiB1bmFsaWduZWRfbG9hZCgpICovCisjZGVmaW5lIHJlYWRBbmRUcmFuc3Bvc2UxNng2KHNyYywgc3JjX3N0cmlkZSwgcjgsIHI5LCByMTAsIHIxMSwgcjEyLCByMTMpIHtcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHIwICA9IHVuYWxpZ25lZF9sb2FkKDAsICAgICAgICAgICAgIHNyYyk7ICAgICAgICAgICAgXAorICAgIHJlZ2lzdGVyIHZlY191OCByMSAgPSB1bmFsaWduZWRfbG9hZCggICBzcmNfc3RyaWRlLCBzcmMpOyAgICAgICAgICAgIFwKKyAgICByZWdpc3RlciB2ZWNfdTggcjIgID0gdW5hbGlnbmVkX2xvYWQoMiogc3JjX3N0cmlkZSwgc3JjKTsgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHIzICA9IHVuYWxpZ25lZF9sb2FkKDMqIHNyY19zdHJpZGUsIHNyYyk7ICAgICAgICAgICAgXAorICAgIHJlZ2lzdGVyIHZlY191OCByNCAgPSB1bmFsaWduZWRfbG9hZCg0KiBzcmNfc3RyaWRlLCBzcmMpOyAgICAgICAgICAgIFwKKyAgICByZWdpc3RlciB2ZWNfdTggcjUgID0gdW5hbGlnbmVkX2xvYWQoNSogc3JjX3N0cmlkZSwgc3JjKTsgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHI2ICA9IHVuYWxpZ25lZF9sb2FkKDYqIHNyY19zdHJpZGUsIHNyYyk7ICAgICAgICAgICAgXAorICAgIHJlZ2lzdGVyIHZlY191OCByNyAgPSB1bmFsaWduZWRfbG9hZCg3KiBzcmNfc3RyaWRlLCBzcmMpOyAgICAgICAgICAgIFwKKyAgICByZWdpc3RlciB2ZWNfdTggcjE0ID0gdW5hbGlnbmVkX2xvYWQoMTQqc3JjX3N0cmlkZSwgc3JjKTsgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHIxNSA9IHVuYWxpZ25lZF9sb2FkKDE1KnNyY19zdHJpZGUsIHNyYyk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHI4ICA9IHVuYWxpZ25lZF9sb2FkKCA4KnNyY19zdHJpZGUsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHI5ICA9IHVuYWxpZ25lZF9sb2FkKCA5KnNyY19zdHJpZGUsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMCA9IHVuYWxpZ25lZF9sb2FkKDEwKnNyY19zdHJpZGUsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMSA9IHVuYWxpZ25lZF9sb2FkKDExKnNyY19zdHJpZGUsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMiA9IHVuYWxpZ25lZF9sb2FkKDEyKnNyY19zdHJpZGUsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMyA9IHVuYWxpZ25lZF9sb2FkKDEzKnNyY19zdHJpZGUsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qTWVyZ2UgZmlyc3QgcGFpcnMqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIwID0gdmVjX21lcmdlaChyMCwgcjgpOyAgICAvKjAsIDgqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxID0gdmVjX21lcmdlaChyMSwgcjkpOyAgICAvKjEsIDkqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIyID0gdmVjX21lcmdlaChyMiwgcjEwKTsgICAvKjIsMTAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIzID0gdmVjX21lcmdlaChyMywgcjExKTsgICAvKjMsMTEqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHI0ID0gdmVjX21lcmdlaChyNCwgcjEyKTsgICAvKjQsMTIqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHI1ID0gdmVjX21lcmdlaChyNSwgcjEzKTsgICAvKjUsMTMqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHI2ID0gdmVjX21lcmdlaChyNiwgcjE0KTsgICAvKjYsMTQqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHI3ID0gdmVjX21lcmdlaChyNywgcjE1KTsgICAvKjcsMTUqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qTWVyZ2Ugc2Vjb25kIHBhaXJzKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHI4ICA9IHZlY19tZXJnZWgocjAsIHI0KTsgICAvKjAsNCwgOCwxMiBzZXQgMCovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHI5ICA9IHZlY19tZXJnZWwocjAsIHI0KTsgICAvKjAsNCwgOCwxMiBzZXQgMSovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMCA9IHZlY19tZXJnZWgocjEsIHI1KTsgICAvKjEsNSwgOSwxMyBzZXQgMCovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMSA9IHZlY19tZXJnZWwocjEsIHI1KTsgICAvKjEsNSwgOSwxMyBzZXQgMSovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMiA9IHZlY19tZXJnZWgocjIsIHI2KTsgICAvKjIsNiwxMCwxNCBzZXQgMCovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMyA9IHZlY19tZXJnZWwocjIsIHI2KTsgICAvKjIsNiwxMCwxNCBzZXQgMSovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxNCA9IHZlY19tZXJnZWgocjMsIHI3KTsgICAvKjMsNywxMSwxNSBzZXQgMCovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxNSA9IHZlY19tZXJnZWwocjMsIHI3KTsgICAvKjMsNywxMSwxNSBzZXQgMSovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qVGhpcmQgbWVyZ2UqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIwID0gdmVjX21lcmdlaChyOCwgIHIxMik7ICAvKjAsMiw0LDYsOCwxMCwxMiwxNCBzZXQgMCovICAgICAgICAgICAgICAgXAorICAgIHIxID0gdmVjX21lcmdlbChyOCwgIHIxMik7ICAvKjAsMiw0LDYsOCwxMCwxMiwxNCBzZXQgMSovICAgICAgICAgICAgICAgXAorICAgIHIyID0gdmVjX21lcmdlaChyOSwgIHIxMyk7ICAvKjAsMiw0LDYsOCwxMCwxMiwxNCBzZXQgMiovICAgICAgICAgICAgICAgXAorICAgIHI0ID0gdmVjX21lcmdlaChyMTAsIHIxNCk7ICAvKjEsMyw1LDcsOSwxMSwxMywxNSBzZXQgMCovICAgICAgICAgICAgICAgXAorICAgIHI1ID0gdmVjX21lcmdlbChyMTAsIHIxNCk7ICAvKjEsMyw1LDcsOSwxMSwxMywxNSBzZXQgMSovICAgICAgICAgICAgICAgXAorICAgIHI2ID0gdmVjX21lcmdlaChyMTEsIHIxNSk7ICAvKjEsMyw1LDcsOSwxMSwxMywxNSBzZXQgMiovICAgICAgICAgICAgICAgXAorICAgIC8qIERvbid0IG5lZWQgdG8gY29tcHV0ZSAzIGFuZCA3Ki8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qRmluYWwgbWVyZ2UqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHI4ICA9IHZlY19tZXJnZWgocjAsIHI0KTsgICAvKmFsbCBzZXQgMCovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHI5ICA9IHZlY19tZXJnZWwocjAsIHI0KTsgICAvKmFsbCBzZXQgMSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMCA9IHZlY19tZXJnZWgocjEsIHI1KTsgICAvKmFsbCBzZXQgMiovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMSA9IHZlY19tZXJnZWwocjEsIHI1KTsgICAvKmFsbCBzZXQgMyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMiA9IHZlY19tZXJnZWgocjIsIHI2KTsgICAvKmFsbCBzZXQgNCovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxMyA9IHZlY19tZXJnZWwocjIsIHI2KTsgICAvKmFsbCBzZXQgNSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIERvbid0IG5lZWQgdG8gY29tcHV0ZSAxNCBhbmQgMTUqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBvdXQ6IG8gPSB8eC15fCA8IGEKK3N0YXRpYyBpbmxpbmUgdmVjX3U4IGRpZmZfbHRfYWx0aXZlYyAoIHJlZ2lzdGVyIHZlY191OCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciB2ZWNfdTggeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdmVjX3U4IGEpIHsKKworICAgIHJlZ2lzdGVyIHZlY191OCBkaWZmID0gdmVjX3N1YnMoeCwgeSk7CisgICAgcmVnaXN0ZXIgdmVjX3U4IGRpZmZuZWcgPSB2ZWNfc3Vicyh5LCB4KTsKKyAgICByZWdpc3RlciB2ZWNfdTggbyA9IHZlY19vcihkaWZmLCBkaWZmbmVnKTsgLyogfHgteXwgKi8KKyAgICBvID0gKHZlY191OCl2ZWNfY21wbHQobywgYSk7CisgICAgcmV0dXJuIG87Cit9CisKK3N0YXRpYyBpbmxpbmUgdmVjX3U4IGgyNjRfZGVibG9ja19tYXNrICggcmVnaXN0ZXIgdmVjX3U4IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHZlY191OCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciB2ZWNfdTggcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdmVjX3U4IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHZlY191OCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciB2ZWNfdTggYmV0YSkgeworCisgICAgcmVnaXN0ZXIgdmVjX3U4IG1hc2s7CisgICAgcmVnaXN0ZXIgdmVjX3U4IHRlbXBtYXNrOworCisgICAgbWFzayA9IGRpZmZfbHRfYWx0aXZlYyhwMCwgcTAsIGFscGhhKTsKKyAgICB0ZW1wbWFzayA9IGRpZmZfbHRfYWx0aXZlYyhwMSwgcDAsIGJldGEpOworICAgIG1hc2sgPSB2ZWNfYW5kKG1hc2ssIHRlbXBtYXNrKTsKKyAgICB0ZW1wbWFzayA9IGRpZmZfbHRfYWx0aXZlYyhxMSwgcTAsIGJldGEpOworICAgIG1hc2sgPSB2ZWNfYW5kKG1hc2ssIHRlbXBtYXNrKTsKKworICAgIHJldHVybiBtYXNrOworfQorCisvLyBvdXQ6IG5ld3AxID0gY2xpcCgocDIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSkgPj4gMSwgcDEtdGMwLCBwMSt0YzApCitzdGF0aWMgaW5saW5lIHZlY191OCBoMjY0X2RlYmxvY2tfcTEocmVnaXN0ZXIgdmVjX3U4IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdmVjX3U4IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdmVjX3U4IHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdmVjX3U4IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdmVjX3U4IHRjMCkgeworCisgICAgcmVnaXN0ZXIgdmVjX3U4IGF2ZXJhZ2UgPSB2ZWNfYXZnKHAwLCBxMCk7CisgICAgcmVnaXN0ZXIgdmVjX3U4IHRlbXA7CisgICAgcmVnaXN0ZXIgdmVjX3U4IHVuY2xpcGVkOworICAgIHJlZ2lzdGVyIHZlY191OCBvbmVzOworICAgIHJlZ2lzdGVyIHZlY191OCBtYXg7CisgICAgcmVnaXN0ZXIgdmVjX3U4IG1pbjsKKyAgICByZWdpc3RlciB2ZWNfdTggbmV3cDE7CisKKyAgICB0ZW1wID0gdmVjX3hvcihhdmVyYWdlLCBwMik7CisgICAgYXZlcmFnZSA9IHZlY19hdmcoYXZlcmFnZSwgcDIpOyAgICAgLyphdmcocDIsIGF2ZyhwMCwgcTApKSAqLworICAgIG9uZXMgPSB2ZWNfc3BsYXRfdTgoMSk7CisgICAgdGVtcCA9IHZlY19hbmQodGVtcCwgb25lcyk7ICAgICAgICAgLyoocDJeYXZnKHAwLCBxMCkpICYgMSAqLworICAgIHVuY2xpcGVkID0gdmVjX3N1YnMoYXZlcmFnZSwgdGVtcCk7IC8qKHAyKygocDArcTArMSk+PjEpKT4+MSAqLworICAgIG1heCA9IHZlY19hZGRzKHAxLCB0YzApOworICAgIG1pbiA9IHZlY19zdWJzKHAxLCB0YzApOworICAgIG5ld3AxID0gdmVjX21heChtaW4sIHVuY2xpcGVkKTsKKyAgICBuZXdwMSA9IHZlY19taW4obWF4LCBuZXdwMSk7CisgICAgcmV0dXJuIG5ld3AxOworfQorCisjZGVmaW5lIGgyNjRfZGVibG9ja19wMF9xMChwMCwgcDEsIHEwLCBxMSwgdGMwbWFza2VkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHZlY191OCBBMHYgPSB2ZWNfc2wodmVjX3NwbGF0X3U4KDEwKSwgdmVjX3NwbGF0X3U4KDQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHBxMGJpdCA9IHZlY194b3IocDAscTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHExbWludXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHAwbWludXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHN0YWdlMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHN0YWdlMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHZlYzE2MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IGRlbHRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IGRlbHRhbmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBxMW1pbnVzID0gdmVjX25vcihxMSwgcTEpOyAgICAgICAgICAgICAgICAgLyogMjU1IC0gcTEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YWdlMSA9IHZlY19hdmcocDEsIHExbWludXMpOyAgICAgICAgICAgICAvKiAocDEgLSBxMSArIDI1Nik+PjEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhZ2UyID0gdmVjX3NyKHN0YWdlMSwgdmVjX3NwbGF0X3U4KDEpKTsgIC8qIChwMSAtIHExICsgMjU2KT4+MiA9IDY0ICsgKHAxIC0gcTEpID4+IDIgKi8gICAgIFwKKyAgICBwMG1pbnVzID0gdmVjX25vcihwMCwgcDApOyAgICAgICAgICAgICAgICAgLyogMjU1IC0gcDAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YWdlMSA9IHZlY19hdmcocTAsIHAwbWludXMpOyAgICAgICAgICAgICAvKiAocTAgLSBwMCArIDI1Nik+PjEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHEwYml0ID0gdmVjX2FuZChwcTBiaXQsIHZlY19zcGxhdF91OCgxKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGFnZTIgPSB2ZWNfYXZnKHN0YWdlMiwgcHEwYml0KTsgICAgICAgICAgLyogMzIgKyAoKHEwIC0gcDApJjEgKyAocDEgLSBxMSkgPj4gMiArIDEpID4+IDEgKi8gXAorICAgIHN0YWdlMiA9IHZlY19hZGRzKHN0YWdlMiwgc3RhZ2UxKTsgICAgICAgICAvKiAxNjAgKyAoKHAwIC0gcTApICsgKHAxIC0gcTEpID4+IDIgKyAxKSA+PiAxICovICBcCisgICAgdmVjMTYwID0gdmVjX2xkKDAsICZBMHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZWx0YW5lZyA9IHZlY19zdWJzKHZlYzE2MCwgc3RhZ2UyKTsgICAgICAgLyogLWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlbHRhID0gdmVjX3N1YnMoc3RhZ2UyLCB2ZWMxNjApOyAgICAgICAgICAvKiBkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVsdGFuZWcgPSB2ZWNfbWluKHRjMG1hc2tlZCwgZGVsdGFuZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZWx0YSA9IHZlY19taW4odGMwbWFza2VkLCBkZWx0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAwID0gdmVjX3N1YnMocDAsIGRlbHRhbmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcTAgPSB2ZWNfc3VicyhxMCwgZGVsdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwMCA9IHZlY19hZGRzKHAwLCBkZWx0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHEwID0gdmVjX2FkZHMocTAsIGRlbHRhbmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgaDI2NF9sb29wX2ZpbHRlcl9sdW1hX2FsdGl2ZWMocDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgYWxwaGEsIGJldGEsIHRjMCkgeyAgICAgICAgICAgIFwKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHVuc2lnbmVkIGNoYXIsIHRlbXApWzE2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IGFscGhhdmVjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZ2lzdGVyIHZlY191OCBiZXRhdmVjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWdpc3RlciB2ZWNfdTggbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHAxbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZ2lzdGVyIHZlY191OCBxMW1hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkICAgY2hhciB0YzB2ZWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWdpc3RlciB2ZWNfdTggZmluYWx0YzA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgdmVjX3U4IHRjMG1hc2tlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZ2lzdGVyIHZlY191OCBuZXdwMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWdpc3RlciB2ZWNfdTggbmV3cTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcFswXSA9IGFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcFsxXSA9IGJldGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWxwaGF2ZWMgPSB2ZWNfbGQoMCwgdGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmV0YXZlYyA9IHZlY19zcGxhdChhbHBoYXZlYywgMHgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWxwaGF2ZWMgPSB2ZWNfc3BsYXQoYWxwaGF2ZWMsIDB4MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFzayA9IGgyNjRfZGVibG9ja19tYXNrKHAwLCBwMSwgcTAsIHExLCBhbHBoYXZlYywgYmV0YXZlYyk7IC8qaWYgaW4gYmxvY2sgKi8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVZfQ09QWTMyKHRlbXAsIHRjMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGMwdmVjID0gdmVjX2xkKDAsIChzaWduZWQgY2hhciopdGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGMwdmVjID0gdmVjX21lcmdlaCh0YzB2ZWMsIHRjMHZlYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGMwdmVjID0gdmVjX21lcmdlaCh0YzB2ZWMsIHRjMHZlYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFzayA9IHZlY19hbmQobWFzaywgdmVjX2NtcGd0KHRjMHZlYywgdmVjX3NwbGF0X3M4KC0xKSkpOyAgLyogaWYgdGMwW2ldID49IDAgKi8gICAgICAgICBcCisgICAgZmluYWx0YzAgPSB2ZWNfYW5kKCh2ZWNfdTgpdGMwdmVjLCBtYXNrKTsgICAgIC8qIHRjID0gdGMwICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAxbWFzayA9IGRpZmZfbHRfYWx0aXZlYyhwMiwgcDAsIGJldGF2ZWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAxbWFzayA9IHZlY19hbmQocDFtYXNrLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICggfHAyIC0gcDB8IDwgYmV0YSkgKi8gXAorICAgIHRjMG1hc2tlZCA9IHZlY19hbmQocDFtYXNrLCAodmVjX3U4KXRjMHZlYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaW5hbHRjMCA9IHZlY19zdWIoZmluYWx0YzAsIHAxbWFzayk7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0YysrICovICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdwMSA9IGgyNjRfZGVibG9ja19xMShwMCwgcDEsIHAyLCBxMCwgdGMwbWFza2VkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKmVuZCBpZiovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBxMW1hc2sgPSBkaWZmX2x0X2FsdGl2ZWMocTIsIHEwLCBiZXRhdmVjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBxMW1hc2sgPSB2ZWNfYW5kKHExbWFzaywgbWFzayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAoIHxxMiAtIHEwfCA8IGJldGEgKSAqL1wKKyAgICB0YzBtYXNrZWQgPSB2ZWNfYW5kKHExbWFzaywgKHZlY191OCl0YzB2ZWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmluYWx0YzAgPSB2ZWNfc3ViKGZpbmFsdGMwLCBxMW1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgLyogdGMrKyAqLyAgICAgICAgICAgICAgICAgICBcCisgICAgbmV3cTEgPSBoMjY0X2RlYmxvY2tfcTEocDAsIHExLCBxMiwgcTAsIHRjMG1hc2tlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyplbmQgaWYqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaDI2NF9kZWJsb2NrX3AwX3EwKHAwLCBwMSwgcTAsIHExLCBmaW5hbHRjMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcDEgPSBuZXdwMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcTEgPSBuZXdxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3N0YXRpYyB2b2lkIGgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hX2FsdGl2ZWModWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQ4X3QgKnRjMCkgeworCisgICAgaWYgKCh0YzBbMF0gJiB0YzBbMV0gJiB0YzBbMl0gJiB0YzBbM10pID49IDApIHsKKyAgICAgICAgcmVnaXN0ZXIgdmVjX3U4IHAyID0gdmVjX2xkKC0zKnN0cmlkZSwgcGl4KTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjX3U4IHAxID0gdmVjX2xkKC0yKnN0cmlkZSwgcGl4KTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjX3U4IHAwID0gdmVjX2xkKC0xKnN0cmlkZSwgcGl4KTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjX3U4IHEwID0gdmVjX2xkKDAsIHBpeCk7CisgICAgICAgIHJlZ2lzdGVyIHZlY191OCBxMSA9IHZlY19sZChzdHJpZGUsIHBpeCk7CisgICAgICAgIHJlZ2lzdGVyIHZlY191OCBxMiA9IHZlY19sZCgyKnN0cmlkZSwgcGl4KTsKKyAgICAgICAgaDI2NF9sb29wX2ZpbHRlcl9sdW1hX2FsdGl2ZWMocDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgYWxwaGEsIGJldGEsIHRjMCk7CisgICAgICAgIHZlY19zdChwMSwgLTIqc3RyaWRlLCBwaXgpOworICAgICAgICB2ZWNfc3QocDAsIC0xKnN0cmlkZSwgcGl4KTsKKyAgICAgICAgdmVjX3N0KHEwLCAwLCBwaXgpOworICAgICAgICB2ZWNfc3QocTEsIHN0cmlkZSwgcGl4KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX2FsdGl2ZWModWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQ4X3QgKnRjMCkgeworCisgICAgcmVnaXN0ZXIgdmVjX3U4IGxpbmUwLCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCwgbGluZTU7CisgICAgaWYgKCh0YzBbMF0gJiB0YzBbMV0gJiB0YzBbMl0gJiB0YzBbM10pIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIHJlYWRBbmRUcmFuc3Bvc2UxNng2KHBpeC0zLCBzdHJpZGUsIGxpbmUwLCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCwgbGluZTUpOworICAgIGgyNjRfbG9vcF9maWx0ZXJfbHVtYV9hbHRpdmVjKGxpbmUwLCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCwgbGluZTUsIGFscGhhLCBiZXRhLCB0YzApOworICAgIHRyYW5zcG9zZTR4MTYobGluZTEsIGxpbmUyLCBsaW5lMywgbGluZTQpOworICAgIHdyaXRlMTZ4NChwaXgtMiwgc3RyaWRlLCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIHdlaWdodF9oMjY0X1dfYWx0aXZlYyh1aW50OF90ICpibG9jaywgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0LCBpbnQgb2Zmc2V0LCBpbnQgdykKK3sKKyAgICBpbnQgeSwgYWxpZ25lZDsKKyAgICB2ZWNfdTggdmJsb2NrOworICAgIHZlY19zMTYgdnRlbXAsIHZ3ZWlnaHQsIHZvZmZzZXQsIHYwLCB2MTsKKyAgICB2ZWNfdTE2IHZsb2cyX2Rlbm9tOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MzJfdCwgdGVtcClbNF07CisgICAgTE9BRF9aRVJPOworCisgICAgb2Zmc2V0IDw8PSBsb2cyX2Rlbm9tOworICAgIGlmKGxvZzJfZGVub20pIG9mZnNldCArPSAxPDwobG9nMl9kZW5vbS0xKTsKKyAgICB0ZW1wWzBdID0gbG9nMl9kZW5vbTsKKyAgICB0ZW1wWzFdID0gd2VpZ2h0OworICAgIHRlbXBbMl0gPSBvZmZzZXQ7CisKKyAgICB2dGVtcCA9ICh2ZWNfczE2KXZlY19sZCgwLCB0ZW1wKTsKKyNpZiAhSEFWRV9CSUdFTkRJQU4KKyAgICB2dGVtcCA9KHZlY19zMTYpdmVjX3Blcm0odnRlbXAsIHZ0ZW1wLCB2Y3N3YXBpMnMoMCwxLDIsMykpOworI2VuZGlmCisgICAgdmxvZzJfZGVub20gPSAodmVjX3UxNil2ZWNfc3BsYXQodnRlbXAsIDEpOworICAgIHZ3ZWlnaHQgPSB2ZWNfc3BsYXQodnRlbXAsIDMpOworICAgIHZvZmZzZXQgPSB2ZWNfc3BsYXQodnRlbXAsIDUpOworICAgIGFsaWduZWQgPSAhKCh1bnNpZ25lZCBsb25nKWJsb2NrICYgMHhmKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICB2YmxvY2sgPSB2ZWNfbGQoMCwgYmxvY2spOworCisgICAgICAgIHYwID0gKHZlY19zMTYpVkVDX01FUkdFSCh6ZXJvX3U4diwgdmJsb2NrKTsKKyAgICAgICAgdjEgPSAodmVjX3MxNilWRUNfTUVSR0VMKHplcm9fdTh2LCB2YmxvY2spOworCisgICAgICAgIGlmICh3ID09IDE2IHx8IGFsaWduZWQpIHsKKyAgICAgICAgICAgIHYwID0gdmVjX21sYWRkKHYwLCB2d2VpZ2h0LCB6ZXJvX3MxNnYpOworICAgICAgICAgICAgdjAgPSB2ZWNfYWRkcyh2MCwgdm9mZnNldCk7CisgICAgICAgICAgICB2MCA9IHZlY19zcmEodjAsIHZsb2cyX2Rlbm9tKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodyA9PSAxNiB8fCAhYWxpZ25lZCkgeworICAgICAgICAgICAgdjEgPSB2ZWNfbWxhZGQodjEsIHZ3ZWlnaHQsIHplcm9fczE2dik7CisgICAgICAgICAgICB2MSA9IHZlY19hZGRzKHYxLCB2b2Zmc2V0KTsKKyAgICAgICAgICAgIHYxID0gdmVjX3NyYSh2MSwgdmxvZzJfZGVub20pOworICAgICAgICB9CisgICAgICAgIHZibG9jayA9IHZlY19wYWNrc3UodjAsIHYxKTsKKyAgICAgICAgdmVjX3N0KHZibG9jaywgMCwgYmxvY2spOworCisgICAgICAgIGJsb2NrICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIGJpd2VpZ2h0X2gyNjRfV19hbHRpdmVjKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodGQsIGludCB3ZWlnaHRzLCBpbnQgb2Zmc2V0LCBpbnQgdykKK3sKKyAgICBpbnQgeSwgZHN0X2FsaWduZWQsIHNyY19hbGlnbmVkOworICAgIHZlY191OCB2c3JjLCB2ZHN0OworICAgIHZlY19zMTYgdnRlbXAsIHZ3ZWlnaHRzLCB2d2VpZ2h0ZCwgdm9mZnNldCwgdjAsIHYxLCB2MiwgdjM7CisgICAgdmVjX3UxNiB2bG9nMl9kZW5vbTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDMyX3QsIHRlbXApWzRdOworICAgIExPQURfWkVSTzsKKworICAgIG9mZnNldCA9ICgob2Zmc2V0ICsgMSkgfCAxKSA8PCBsb2cyX2Rlbm9tOworICAgIHRlbXBbMF0gPSBsb2cyX2Rlbm9tKzE7CisgICAgdGVtcFsxXSA9IHdlaWdodHM7CisgICAgdGVtcFsyXSA9IHdlaWdodGQ7CisgICAgdGVtcFszXSA9IG9mZnNldDsKKworICAgIHZ0ZW1wID0gKHZlY19zMTYpdmVjX2xkKDAsIHRlbXApOworI2lmICFIQVZFX0JJR0VORElBTgorICAgIHZ0ZW1wID0odmVjX3MxNil2ZWNfcGVybSh2dGVtcCwgdnRlbXAsIHZjc3dhcGkycygwLDEsMiwzKSk7CisjZW5kaWYKKyAgICB2bG9nMl9kZW5vbSA9ICh2ZWNfdTE2KXZlY19zcGxhdCh2dGVtcCwgMSk7CisgICAgdndlaWdodHMgPSB2ZWNfc3BsYXQodnRlbXAsIDMpOworICAgIHZ3ZWlnaHRkID0gdmVjX3NwbGF0KHZ0ZW1wLCA1KTsKKyAgICB2b2Zmc2V0ID0gdmVjX3NwbGF0KHZ0ZW1wLCA3KTsKKyAgICBkc3RfYWxpZ25lZCA9ICEoKHVuc2lnbmVkIGxvbmcpZHN0ICYgMHhmKTsKKyAgICBzcmNfYWxpZ25lZCA9ICEoKHVuc2lnbmVkIGxvbmcpc3JjICYgMHhmKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICB2ZHN0ID0gdmVjX2xkKDAsIGRzdCk7CisgICAgICAgIHZzcmMgPSB2ZWNfbGQoMCwgc3JjKTsKKworICAgICAgICB2MCA9ICh2ZWNfczE2KVZFQ19NRVJHRUgoemVyb191OHYsIHZkc3QpOworICAgICAgICB2MSA9ICh2ZWNfczE2KVZFQ19NRVJHRUwoemVyb191OHYsIHZkc3QpOworICAgICAgICB2MiA9ICh2ZWNfczE2KVZFQ19NRVJHRUgoemVyb191OHYsIHZzcmMpOworICAgICAgICB2MyA9ICh2ZWNfczE2KVZFQ19NRVJHRUwoemVyb191OHYsIHZzcmMpOworCisgICAgICAgIGlmICh3ID09IDgpIHsKKyAgICAgICAgICAgIGlmIChzcmNfYWxpZ25lZCkKKyAgICAgICAgICAgICAgICB2MyA9IHYyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYyID0gdjM7CisgICAgICAgIH0KKworICAgICAgICBpZiAodyA9PSAxNiB8fCBkc3RfYWxpZ25lZCkgeworICAgICAgICAgICAgdjAgPSB2ZWNfbWxhZGQodjAsIHZ3ZWlnaHRkLCB6ZXJvX3MxNnYpOworICAgICAgICAgICAgdjIgPSB2ZWNfbWxhZGQodjIsIHZ3ZWlnaHRzLCB6ZXJvX3MxNnYpOworCisgICAgICAgICAgICB2MCA9IHZlY19hZGRzKHYwLCB2b2Zmc2V0KTsKKyAgICAgICAgICAgIHYwID0gdmVjX2FkZHModjAsIHYyKTsKKyAgICAgICAgICAgIHYwID0gdmVjX3NyYSh2MCwgdmxvZzJfZGVub20pOworICAgICAgICB9CisgICAgICAgIGlmICh3ID09IDE2IHx8ICFkc3RfYWxpZ25lZCkgeworICAgICAgICAgICAgdjEgPSB2ZWNfbWxhZGQodjEsIHZ3ZWlnaHRkLCB6ZXJvX3MxNnYpOworICAgICAgICAgICAgdjMgPSB2ZWNfbWxhZGQodjMsIHZ3ZWlnaHRzLCB6ZXJvX3MxNnYpOworCisgICAgICAgICAgICB2MSA9IHZlY19hZGRzKHYxLCB2b2Zmc2V0KTsKKyAgICAgICAgICAgIHYxID0gdmVjX2FkZHModjEsIHYzKTsKKyAgICAgICAgICAgIHYxID0gdmVjX3NyYSh2MSwgdmxvZzJfZGVub20pOworICAgICAgICB9CisgICAgICAgIHZkc3QgPSB2ZWNfcGFja3N1KHYwLCB2MSk7CisgICAgICAgIHZlY19zdCh2ZHN0LCAwLCBkc3QpOworCisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQorCisjZGVmaW5lIEgyNjRfV0VJR0hUKFcpIFwKK3N0YXRpYyB2b2lkIHdlaWdodF9oMjY0X3BpeGVscyAjIyBXICMjIF9hbHRpdmVjKHVpbnQ4X3QgKmJsb2NrLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodCwgaW50IG9mZnNldCkgXAoreyBcCisgICAgd2VpZ2h0X2gyNjRfV19hbHRpdmVjKGJsb2NrLCBzdHJpZGUsIGhlaWdodCwgbG9nMl9kZW5vbSwgd2VpZ2h0LCBvZmZzZXQsIFcpOyBcCit9XAorc3RhdGljIHZvaWQgYml3ZWlnaHRfaDI2NF9waXhlbHMgIyMgVyAjIyBfYWx0aXZlYyh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGhlaWdodCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodGQsIGludCB3ZWlnaHRzLCBpbnQgb2Zmc2V0KSBcCit7IFwKKyAgICBiaXdlaWdodF9oMjY0X1dfYWx0aXZlYyhkc3QsIHNyYywgc3RyaWRlLCBoZWlnaHQsIGxvZzJfZGVub20sIHdlaWdodGQsIHdlaWdodHMsIG9mZnNldCwgVyk7IFwKK30KKworSDI2NF9XRUlHSFQoMTYpCitIMjY0X1dFSUdIVCggOCkKKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KKworYXZfY29sZCB2b2lkIGZmX2gyNjRkc3BfaW5pdF9wcGMoSDI2NERTUENvbnRleHQgKmMsIGNvbnN0IGludCBiaXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hyb21hX2Zvcm1hdF9pZGMpCit7CisjaWYgSEFWRV9BTFRJVkVDCisgICAgaWYgKCFQUENfQUxUSVZFQyhhdl9nZXRfY3B1X2ZsYWdzKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoYml0X2RlcHRoID09IDgpIHsKKyAgICAgICAgYy0+aDI2NF9pZGN0X2FkZCA9IGgyNjRfaWRjdF9hZGRfYWx0aXZlYzsKKyAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpCisgICAgICAgICAgICBjLT5oMjY0X2lkY3RfYWRkOCA9IGgyNjRfaWRjdF9hZGQ4X2FsdGl2ZWM7CisgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQxNiAgICAgID0gaDI2NF9pZGN0X2FkZDE2X2FsdGl2ZWM7CisgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQxNmludHJhID0gaDI2NF9pZGN0X2FkZDE2aW50cmFfYWx0aXZlYzsKKyAgICAgICAgYy0+aDI2NF9pZGN0X2RjX2FkZD0gaDI2NF9pZGN0X2RjX2FkZF9hbHRpdmVjOworICAgICAgICBjLT5oMjY0X2lkY3Q4X2RjX2FkZCA9IGgyNjRfaWRjdDhfZGNfYWRkX2FsdGl2ZWM7CisgICAgICAgIGMtPmgyNjRfaWRjdDhfYWRkICAgID0gaDI2NF9pZGN0OF9hZGRfYWx0aXZlYzsKKyAgICAgICAgYy0+aDI2NF9pZGN0OF9hZGQ0ICAgPSBoMjY0X2lkY3Q4X2FkZDRfYWx0aXZlYzsKKyAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2x1bWE9IGgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hX2FsdGl2ZWM7CisgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hPSBoMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9hbHRpdmVjOworCisgICAgICAgIGMtPndlaWdodF9oMjY0X3BpeGVsc190YWJbMF0gICA9IHdlaWdodF9oMjY0X3BpeGVsczE2X2FsdGl2ZWM7CisgICAgICAgIGMtPndlaWdodF9oMjY0X3BpeGVsc190YWJbMV0gICA9IHdlaWdodF9oMjY0X3BpeGVsczhfYWx0aXZlYzsKKyAgICAgICAgYy0+Yml3ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzBdID0gYml3ZWlnaHRfaDI2NF9waXhlbHMxNl9hbHRpdmVjOworICAgICAgICBjLT5iaXdlaWdodF9oMjY0X3BpeGVsc190YWJbMV0gPSBiaXdlaWdodF9oMjY0X3BpeGVsczhfYWx0aXZlYzsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcGMvaDI2NHFwZWwuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9oMjY0cXBlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NWY1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvaDI2NHFwZWwuYwpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBSb21haW4gRG9sYmVhdSA8cm9tYWluQGRvbGJlYXUub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjRxcGVsLmgiCisjaW5jbHVkZSAiaHBlbGRzcF9hbHRpdmVjLmgiCisKKyNpZiBIQVZFX0FMVElWRUMKKworI2RlZmluZSBQVVRfT1BfVThfQUxUSVZFQyhkLCBzLCBkc3QpIGQgPSBzCisjZGVmaW5lIEFWR19PUF9VOF9BTFRJVkVDKGQsIHMsIGRzdCkgZCA9IHZlY19hdmcoZHN0LCBzKQorCisjZGVmaW5lIE9QX1U4X0FMVElWRUMgICAgICAgICAgICAgICAgICAgICAgICAgIFBVVF9PUF9VOF9BTFRJVkVDCisjZGVmaW5lIFBSRUZJWF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfYWx0aXZlYyAgIHB1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfYWx0aXZlYworI2RlZmluZSBQUkVGSVhfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX251bSAgICAgICBhbHRpdmVjX3B1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbnVtCisjZGVmaW5lIFBSRUZJWF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfYWx0aXZlYyAgIHB1dF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfYWx0aXZlYworI2RlZmluZSBQUkVGSVhfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX251bSAgICAgICBhbHRpdmVjX3B1dF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbnVtCisjZGVmaW5lIFBSRUZJWF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX2FsdGl2ZWMgIHB1dF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX2FsdGl2ZWMKKyNkZWZpbmUgUFJFRklYX2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbnVtICAgICAgYWx0aXZlY19wdXRfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19udW0KKyNpbmNsdWRlICJoMjY0cXBlbF90ZW1wbGF0ZS5jIgorI3VuZGVmIE9QX1U4X0FMVElWRUMKKyN1bmRlZiBQUkVGSVhfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX2FsdGl2ZWMKKyN1bmRlZiBQUkVGSVhfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX251bQorI3VuZGVmIFBSRUZJWF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfYWx0aXZlYworI3VuZGVmIFBSRUZJWF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbnVtCisjdW5kZWYgUFJFRklYX2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfYWx0aXZlYworI3VuZGVmIFBSRUZJWF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX251bQorCisjZGVmaW5lIE9QX1U4X0FMVElWRUMgICAgICAgICAgICAgICAgICAgICAgICAgIEFWR19PUF9VOF9BTFRJVkVDCisjZGVmaW5lIFBSRUZJWF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfYWx0aXZlYyAgIGF2Z19oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfYWx0aXZlYworI2RlZmluZSBQUkVGSVhfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX251bSAgICAgICBhbHRpdmVjX2F2Z19oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbnVtCisjZGVmaW5lIFBSRUZJWF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfYWx0aXZlYyAgIGF2Z19oMjY0X3FwZWwxNl92X2xvd3Bhc3NfYWx0aXZlYworI2RlZmluZSBQUkVGSVhfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX251bSAgICAgICBhbHRpdmVjX2F2Z19oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbnVtCisjZGVmaW5lIFBSRUZJWF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX2FsdGl2ZWMgIGF2Z19oMjY0X3FwZWwxNl9odl9sb3dwYXNzX2FsdGl2ZWMKKyNkZWZpbmUgUFJFRklYX2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbnVtICAgICAgYWx0aXZlY19hdmdfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19udW0KKyNpbmNsdWRlICJoMjY0cXBlbF90ZW1wbGF0ZS5jIgorI3VuZGVmIE9QX1U4X0FMVElWRUMKKyN1bmRlZiBQUkVGSVhfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX2FsdGl2ZWMKKyN1bmRlZiBQUkVGSVhfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX251bQorI3VuZGVmIFBSRUZJWF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfYWx0aXZlYworI3VuZGVmIFBSRUZJWF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbnVtCisjdW5kZWYgUFJFRklYX2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfYWx0aXZlYworI3VuZGVmIFBSRUZJWF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX251bQorCisjZGVmaW5lIEgyNjRfTUMoT1BOQU1FLCBTSVpFLCBDT0RFVFlQRSkgXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzAwXyAjIyBDT0RFVFlQRSAodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVscyAjIyBTSVpFICMjIF8gIyMgQ09ERVRZUEUoZHN0LCBzcmMsIHN0cmlkZSwgU0laRSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMxMF8gIyMgQ09ERVRZUEUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAoreyBcCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBoYWxmKVtTSVpFKlNJWkVdO1wKKyAgICBwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX2hfbG93cGFzc18gIyMgQ09ERVRZUEUoaGFsZiwgc3JjLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBPUE5BTUUgIyMgcGl4ZWxzICMjIFNJWkUgIyMgX2wyXyAjIyBDT0RFVFlQRShkc3QsIHNyYywgaGFsZiwgc3RyaWRlLCBzdHJpZGUsIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMjBfICMjIENPREVUWVBFKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3NfICMjIENPREVUWVBFKGRzdCwgc3JjLCBzdHJpZGUsIHN0cmlkZSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMzMF8gIyMgQ09ERVRZUEUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHVpbnQ4X3QsIGhhbGYpW1NJWkUqU0laRV07XAorICAgIHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzXyAjIyBDT0RFVFlQRShoYWxmLCBzcmMsIFNJWkUsIHN0cmlkZSk7XAorICAgIE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDJfICMjIENPREVUWVBFKGRzdCwgc3JjKzEsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzAxXyAjIyBDT0RFVFlQRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgaGFsZilbU0laRSpTSVpFXTtcCisgICAgcHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF92X2xvd3Bhc3NfICMjIENPREVUWVBFKGhhbGYsIHNyYywgU0laRSwgc3RyaWRlKTtcCisgICAgT1BOQU1FICMjIHBpeGVscyAjIyBTSVpFICMjIF9sMl8gIyMgQ09ERVRZUEUoZHN0LCBzcmMsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzAyXyAjIyBDT0RFVFlQRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzXyAjIyBDT0RFVFlQRShkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMDNfICMjIENPREVUWVBFKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBoYWxmKVtTSVpFKlNJWkVdO1wKKyAgICBwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzc18gIyMgQ09ERVRZUEUoaGFsZiwgc3JjLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBPUE5BTUUgIyMgcGl4ZWxzICMjIFNJWkUgIyMgX2wyXyAjIyBDT0RFVFlQRShkc3QsIHNyYytzdHJpZGUsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzExXyAjIyBDT0RFVFlQRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgaGFsZkgpW1NJWkUqU0laRV07XAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgaGFsZlYpW1NJWkUqU0laRV07XAorICAgIHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzXyAjIyBDT0RFVFlQRShoYWxmSCwgc3JjLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzc18gIyMgQ09ERVRZUEUoaGFsZlYsIHNyYywgU0laRSwgc3RyaWRlKTtcCisgICAgT1BOQU1FICMjIHBpeGVscyAjIyBTSVpFICMjIF9sMl8gIyMgQ09ERVRZUEUoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgU0laRSwgU0laRSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMzMV8gIyMgQ09ERVRZUEUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHVpbnQ4X3QsIGhhbGZIKVtTSVpFKlNJWkVdO1wKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHVpbnQ4X3QsIGhhbGZWKVtTSVpFKlNJWkVdO1wKKyAgICBwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX2hfbG93cGFzc18gIyMgQ09ERVRZUEUoaGFsZkgsIHNyYywgU0laRSwgc3RyaWRlKTtcCisgICAgcHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF92X2xvd3Bhc3NfICMjIENPREVUWVBFKGhhbGZWLCBzcmMrMSwgU0laRSwgc3RyaWRlKTtcCisgICAgT1BOQU1FICMjIHBpeGVscyAjIyBTSVpFICMjIF9sMl8gIyMgQ09ERVRZUEUoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgU0laRSwgU0laRSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMxM18gIyMgQ09ERVRZUEUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHVpbnQ4X3QsIGhhbGZIKVtTSVpFKlNJWkVdO1wKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHVpbnQ4X3QsIGhhbGZWKVtTSVpFKlNJWkVdO1wKKyAgICBwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX2hfbG93cGFzc18gIyMgQ09ERVRZUEUoaGFsZkgsIHNyYyArIHN0cmlkZSwgU0laRSwgc3RyaWRlKTtcCisgICAgcHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF92X2xvd3Bhc3NfICMjIENPREVUWVBFKGhhbGZWLCBzcmMsIFNJWkUsIHN0cmlkZSk7XAorICAgIE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDJfICMjIENPREVUWVBFKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIFNJWkUsIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMzNfICMjIENPREVUWVBFKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBoYWxmSClbU0laRSpTSVpFXTtcCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBoYWxmVilbU0laRSpTSVpFXTtcCisgICAgcHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3NfICMjIENPREVUWVBFKGhhbGZILCBzcmMgKyBzdHJpZGUsIFNJWkUsIHN0cmlkZSk7XAorICAgIHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzXyAjIyBDT0RFVFlQRShoYWxmViwgc3JjKzEsIFNJWkUsIHN0cmlkZSk7XAorICAgIE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDJfICMjIENPREVUWVBFKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIFNJWkUsIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMjJfICMjIENPREVUWVBFKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCB0bXApW1NJWkUqKFNJWkUrOCldO1wKKyAgICBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX2h2X2xvd3Bhc3NfICMjIENPREVUWVBFKGRzdCwgdG1wLCBzcmMsIHN0cmlkZSwgU0laRSwgc3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzIxXyAjIyBDT0RFVFlQRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgaGFsZkgpW1NJWkUqU0laRV07XAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgaGFsZkhWKVtTSVpFKlNJWkVdO1wKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIHRtcClbU0laRSooU0laRSs4KV07XAorICAgIHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzXyAjIyBDT0RFVFlQRShoYWxmSCwgc3JjLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX2h2X2xvd3Bhc3NfICMjIENPREVUWVBFKGhhbGZIViwgdG1wLCBzcmMsIFNJWkUsIFNJWkUsIHN0cmlkZSk7XAorICAgIE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDJfICMjIENPREVUWVBFKGRzdCwgaGFsZkgsIGhhbGZIViwgc3RyaWRlLCBTSVpFLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzIzXyAjIyBDT0RFVFlQRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgaGFsZkgpW1NJWkUqU0laRV07XAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgaGFsZkhWKVtTSVpFKlNJWkVdO1wKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIHRtcClbU0laRSooU0laRSs4KV07XAorICAgIHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzXyAjIyBDT0RFVFlQRShoYWxmSCwgc3JjICsgc3RyaWRlLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX2h2X2xvd3Bhc3NfICMjIENPREVUWVBFKGhhbGZIViwgdG1wLCBzcmMsIFNJWkUsIFNJWkUsIHN0cmlkZSk7XAorICAgIE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDJfICMjIENPREVUWVBFKGRzdCwgaGFsZkgsIGhhbGZIViwgc3RyaWRlLCBTSVpFLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzEyXyAjIyBDT0RFVFlQRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgaGFsZlYpW1NJWkUqU0laRV07XAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgaGFsZkhWKVtTSVpFKlNJWkVdO1wKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIHRtcClbU0laRSooU0laRSs4KV07XAorICAgIHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzXyAjIyBDT0RFVFlQRShoYWxmViwgc3JjLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBwdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX2h2X2xvd3Bhc3NfICMjIENPREVUWVBFKGhhbGZIViwgdG1wLCBzcmMsIFNJWkUsIFNJWkUsIHN0cmlkZSk7XAorICAgIE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDJfICMjIENPREVUWVBFKGRzdCwgaGFsZlYsIGhhbGZIViwgc3RyaWRlLCBTSVpFLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzMyXyAjIyBDT0RFVFlQRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgaGFsZlYpW1NJWkUqU0laRV07XAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgaGFsZkhWKVtTSVpFKlNJWkVdO1wKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIHRtcClbU0laRSooU0laRSs4KV07XAorICAgIHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzXyAjIyBDT0RFVFlQRShoYWxmViwgc3JjKzEsIFNJWkUsIHN0cmlkZSk7XAorICAgIHB1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfaHZfbG93cGFzc18gIyMgQ09ERVRZUEUoaGFsZkhWLCB0bXAsIHNyYywgU0laRSwgU0laRSwgc3RyaWRlKTtcCisgICAgT1BOQU1FICMjIHBpeGVscyAjIyBTSVpFICMjIF9sMl8gIyMgQ09ERVRZUEUoZHN0LCBoYWxmViwgaGFsZkhWLCBzdHJpZGUsIFNJWkUsIFNJWkUpO1wKK31cCisKKyNpZiBIQVZFX0JJR0VORElBTgorI2RlZmluZSBwdXRfdW5saWduZWRfc3RvcmUocywgZGVzdCkgeyAgICBcCisgICAgdG1wMSA9IHZlY19sZCgwLCBkZXN0KTsgICAgICAgICAgICAgIFwKKyAgICBtYXNrID0gdmVjX2x2c2woMCwgZGVzdCk7ICAgICAgICAgICAgXAorICAgIHRtcDIgPSB2ZWNfbGQoMTUsIGRlc3QpOyAgICAgICAgICAgICBcCisgICAgZWRnZXMgPSB2ZWNfcGVybSh0bXAyLCB0bXAxLCBtYXNrKTsgIFwKKyAgICBhbGlnbiA9IHZlY19sdnNyKDAsIGRlc3QpOyAgICAgICAgICAgXAorICAgIHRtcDIgPSB2ZWNfcGVybShzLCBlZGdlcywgYWxpZ24pOyAgICBcCisgICAgdG1wMSA9IHZlY19wZXJtKGVkZ2VzLCBzLCBhbGlnbik7ICAgIFwKKyAgICB2ZWNfc3QodG1wMiwgMTUsIGRlc3QpOyAgICAgICAgICAgICAgXAorICAgIHZlY19zdCh0bXAxLCAwICwgZGVzdCk7ICAgICAgICAgICAgICBcCisgfQorI2Vsc2UKKyNkZWZpbmUgcHV0X3VubGlnbmVkX3N0b3JlKHMsIGRlc3QpIHZlY192c3hfc3QocywgMCwgZGVzdCk7CisjZW5kaWYgLyogSEFWRV9CSUdFTkRJQU4gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9waXhlbHMxNl9sMl9hbHRpdmVjKCB1aW50OF90ICogZHN0LCBjb25zdCB1aW50OF90ICogc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBzcmMyLCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMSwgaW50IGgpCit7CisgICAgaW50IGk7CisgICAgdmVjX3U4IGEsIGIsIGQsIG1hc2tfOworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgdmVjX3U4IHRtcDEsIHRtcDIsIG1hc2ssIGVkZ2VzLCBhbGlnbjsKKyAgICBtYXNrXyA9IHZlY19sdnNsKDAsIHNyYzIpOworI2VuZGlmCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIGEgPSB1bmFsaWduZWRfbG9hZChpICogc3JjX3N0cmlkZTEsIHNyYzEpOworICAgICAgICBiID0gbG9hZF93aXRoX3Blcm1fdmVjKGkgKiAxNiwgc3JjMiwgbWFza18pOworICAgICAgICBkID0gdmVjX2F2ZyhhLCBiKTsKKyAgICAgICAgcHV0X3VubGlnbmVkX3N0b3JlKGQsIGRzdCk7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIH0KK30KKworI2lmIEhBVkVfQklHRU5ESUFOCisjZGVmaW5lIGF2Z191bmxpZ25lZF9zdG9yZShzLCBkZXN0KXsgICAgICAgICAgICBcCisgICAgdG1wMSA9IHZlY19sZCgwLCBkZXN0KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFzayA9IHZlY19sdnNsKDAsIGRlc3QpOyAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wMiA9IHZlY19sZCgxNSwgZGVzdCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgYSA9IHZlY19hdmcodmVjX3Blcm0odG1wMSwgdG1wMiwgbWFzayksIHMpOyBcCisgICAgZWRnZXMgPSB2ZWNfcGVybSh0bXAyLCB0bXAxLCBtYXNrKTsgICAgICAgICBcCisgICAgYWxpZ24gPSB2ZWNfbHZzcigwLCBkZXN0KTsgICAgICAgICAgICAgICAgICBcCisgICAgdG1wMiA9IHZlY19wZXJtKGEsIGVkZ2VzLCBhbGlnbik7ICAgICAgICAgICBcCisgICAgdG1wMSA9IHZlY19wZXJtKGVkZ2VzLCBhLCBhbGlnbik7ICAgICAgICAgICBcCisgICAgdmVjX3N0KHRtcDIsIDE1LCBkZXN0KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjX3N0KHRtcDEsIDAgLCBkZXN0KTsgICAgICAgICAgICAgICAgICAgICBcCisgfQorI2Vsc2UKKyNkZWZpbmUgYXZnX3VubGlnbmVkX3N0b3JlKHMsIGRlc3QpeyAgICAgICAgICAgIFwKKyAgICBhID0gdmVjX2F2Zyh2ZWNfdnN4X2xkKDAsIGRzdCksIHMpOyAgICAgICAgIFwKKyAgICB2ZWNfdnN4X3N0KGEsIDAsIGRzdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyB9CisjZW5kaWYgLyogSEFWRV9CSUdFTkRJQU4gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGF2Z19waXhlbHMxNl9sMl9hbHRpdmVjKCB1aW50OF90ICogZHN0LCBjb25zdCB1aW50OF90ICogc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBzcmMyLCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMSwgaW50IGgpCit7CisgICAgaW50IGk7CisgICAgdmVjX3U4IGEsIGIsIGQsIG1hc2tfOworCisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICB2ZWNfdTggdG1wMSwgdG1wMiwgbWFzaywgZWRnZXMsIGFsaWduOworICAgIG1hc2tfID0gdmVjX2x2c2woMCwgc3JjMik7CisjZW5kaWYKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgYSA9IHVuYWxpZ25lZF9sb2FkKGkgKiBzcmNfc3RyaWRlMSwgc3JjMSk7CisgICAgICAgIGIgPSBsb2FkX3dpdGhfcGVybV92ZWMoaSAqIDE2LCBzcmMyLCBtYXNrXyk7CisgICAgICAgIGQgPSB2ZWNfYXZnKGEsIGIpOworICAgICAgICBhdmdfdW5saWduZWRfc3RvcmUoZCwgZHN0KTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgfQorfQorCisvKiBJbXBsZW1lbnRlZCBidXQgY291bGQgYmUgZmFzdGVyCisjZGVmaW5lIHB1dF9waXhlbHMxNl9sMl9hbHRpdmVjKGQsczEsczIsZHMsczFzLGgpIHB1dF9waXhlbHMxNl9sMihkLHMxLHMyLGRzLHMxcywxNixoKQorI2RlZmluZSBhdmdfcGl4ZWxzMTZfbDJfYWx0aXZlYyhkLHMxLHMyLGRzLHMxcyxoKSBhdmdfcGl4ZWxzMTZfbDIoZCxzMSxzMixkcyxzMXMsMTYsaCkKKyAqLworCitIMjY0X01DKHB1dF8sIDE2LCBhbHRpdmVjKQorSDI2NF9NQyhhdmdfLCAxNiwgYWx0aXZlYykKKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KKworYXZfY29sZCB2b2lkIGZmX2gyNjRxcGVsX2luaXRfcHBjKEgyNjRRcGVsQ29udGV4dCAqYywgaW50IGJpdF9kZXB0aCkKK3sKKyNpZiBIQVZFX0FMVElWRUMKKyAgICBjb25zdCBpbnQgaGlnaF9iaXRfZGVwdGggPSBiaXRfZGVwdGggPiA4OworCisgICAgaWYgKCFQUENfQUxUSVZFQyhhdl9nZXRfY3B1X2ZsYWdzKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWhpZ2hfYml0X2RlcHRoKSB7CisjZGVmaW5lIGRzcGZ1bmMoUEZYLCBJRFgsIE5VTSkgXAorICAgICAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgMF0gPSBQRlggIyMgTlVNICMjIF9tYzAwX2FsdGl2ZWM7IFwKKyAgICAgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bIDFdID0gUEZYICMjIE5VTSAjIyBfbWMxMF9hbHRpdmVjOyBcCisgICAgICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyAyXSA9IFBGWCAjIyBOVU0gIyMgX21jMjBfYWx0aXZlYzsgXAorICAgICAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgM10gPSBQRlggIyMgTlVNICMjIF9tYzMwX2FsdGl2ZWM7IFwKKyAgICAgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bIDRdID0gUEZYICMjIE5VTSAjIyBfbWMwMV9hbHRpdmVjOyBcCisgICAgICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA1XSA9IFBGWCAjIyBOVU0gIyMgX21jMTFfYWx0aXZlYzsgXAorICAgICAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgNl0gPSBQRlggIyMgTlVNICMjIF9tYzIxX2FsdGl2ZWM7IFwKKyAgICAgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bIDddID0gUEZYICMjIE5VTSAjIyBfbWMzMV9hbHRpdmVjOyBcCisgICAgICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA4XSA9IFBGWCAjIyBOVU0gIyMgX21jMDJfYWx0aXZlYzsgXAorICAgICAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgOV0gPSBQRlggIyMgTlVNICMjIF9tYzEyX2FsdGl2ZWM7IFwKKyAgICAgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTBdID0gUEZYICMjIE5VTSAjIyBfbWMyMl9hbHRpdmVjOyBcCisgICAgICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzExXSA9IFBGWCAjIyBOVU0gIyMgX21jMzJfYWx0aXZlYzsgXAorICAgICAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxMl0gPSBQRlggIyMgTlVNICMjIF9tYzAzX2FsdGl2ZWM7IFwKKyAgICAgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTNdID0gUEZYICMjIE5VTSAjIyBfbWMxM19hbHRpdmVjOyBcCisgICAgICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzE0XSA9IFBGWCAjIyBOVU0gIyMgX21jMjNfYWx0aXZlYzsgXAorICAgICAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxNV0gPSBQRlggIyMgTlVNICMjIF9tYzMzX2FsdGl2ZWMKKworICAgICAgICBkc3BmdW5jKHB1dF9oMjY0X3FwZWwsIDAsIDE2KTsKKyAgICAgICAgZHNwZnVuYyhhdmdfaDI2NF9xcGVsLCAwLCAxNik7CisjdW5kZWYgZHNwZnVuYworICAgIH0KKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9oMjY0cXBlbF90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2gyNjRxcGVsX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzNDU0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9oMjY0cXBlbF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsNDg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IFJvbWFpbiBEb2xiZWF1IDxyb21haW5AZG9sYmVhdS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oIgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgQVNTRVJUX0FMSUdORUQocHRyKSBhc3NlcnQoKCh1bnNpZ25lZCBsb25nKXB0ciYweDAwMDAwMDBGKSk7CisjZWxzZQorI2RlZmluZSBBU1NFUlRfQUxJR05FRChwdHIpIDsKKyNlbmRpZgorCisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgbG9hZF9hbGlnbm1lbnQocywgYWxpLCBwbTIsIHBtMSwgcHAwLCBwcDEsIHBwMiwgcHAzKXtcCisgICAgdmVjX3U4IHNyY1IxID0gdmVjX2xkKC0yLCBzKTtcCisgICAgdmVjX3U4IHNyY1IyID0gdmVjX2xkKDE0LCBzKTtcCisgICAgc3dpdGNoIChhbGkpIHtcCisgICAgZGVmYXVsdDoge1wKKyAgICAgICAgc3JjTTIgPSB2ZWNfcGVybShzcmNSMSwgc3JjUjIsIHBtMik7XAorICAgICAgICBzcmNNMSA9IHZlY19wZXJtKHNyY1IxLCBzcmNSMiwgcG0xKTtcCisgICAgICAgIHNyY1AwID0gdmVjX3Blcm0oc3JjUjEsIHNyY1IyLCBwcDApO1wKKyAgICAgICAgc3JjUDEgPSB2ZWNfcGVybShzcmNSMSwgc3JjUjIsIHBwMSk7XAorICAgICAgICBzcmNQMiA9IHZlY19wZXJtKHNyY1IxLCBzcmNSMiwgcHAyKTtcCisgICAgICAgIHNyY1AzID0gdmVjX3Blcm0oc3JjUjEsIHNyY1IyLCBwcDMpO1wKKyAgICB9IGJyZWFrO1wKKyAgICBjYXNlIDExOiB7XAorICAgICAgICBzcmNNMiA9IHZlY19wZXJtKHNyY1IxLCBzcmNSMiwgcG0yKTtcCisgICAgICAgIHNyY00xID0gdmVjX3Blcm0oc3JjUjEsIHNyY1IyLCBwbTEpO1wKKyAgICAgICAgc3JjUDAgPSB2ZWNfcGVybShzcmNSMSwgc3JjUjIsIHBwMCk7XAorICAgICAgICBzcmNQMSA9IHZlY19wZXJtKHNyY1IxLCBzcmNSMiwgcHAxKTtcCisgICAgICAgIHNyY1AyID0gdmVjX3Blcm0oc3JjUjEsIHNyY1IyLCBwcDIpO1wKKyAgICAgICAgc3JjUDMgPSBzcmNSMjtcCisgICAgfSBicmVhaztcCisgICAgY2FzZSAxMjoge1wKKyAgICAgICAgdmVjX3U4IHNyY1IzID0gdmVjX2xkKDMwLCBzKTtcCisgICAgICAgIHNyY00yID0gdmVjX3Blcm0oc3JjUjEsIHNyY1IyLCBwbTIpO1wKKyAgICAgICAgc3JjTTEgPSB2ZWNfcGVybShzcmNSMSwgc3JjUjIsIHBtMSk7XAorICAgICAgICBzcmNQMCA9IHZlY19wZXJtKHNyY1IxLCBzcmNSMiwgcHAwKTtcCisgICAgICAgIHNyY1AxID0gdmVjX3Blcm0oc3JjUjEsIHNyY1IyLCBwcDEpO1wKKyAgICAgICAgc3JjUDIgPSBzcmNSMjtcCisgICAgICAgIHNyY1AzID0gdmVjX3Blcm0oc3JjUjIsIHNyY1IzLCBwcDMpO1wKKyAgICB9IGJyZWFrO1wKKyAgICBjYXNlIDEzOiB7XAorICAgICAgICB2ZWNfdTggc3JjUjMgPSB2ZWNfbGQoMzAsIHMpO1wKKyAgICAgICAgc3JjTTIgPSB2ZWNfcGVybShzcmNSMSwgc3JjUjIsIHBtMik7XAorICAgICAgICBzcmNNMSA9IHZlY19wZXJtKHNyY1IxLCBzcmNSMiwgcG0xKTtcCisgICAgICAgIHNyY1AwID0gdmVjX3Blcm0oc3JjUjEsIHNyY1IyLCBwcDApO1wKKyAgICAgICAgc3JjUDEgPSBzcmNSMjtcCisgICAgICAgIHNyY1AyID0gdmVjX3Blcm0oc3JjUjIsIHNyY1IzLCBwcDIpO1wKKyAgICAgICAgc3JjUDMgPSB2ZWNfcGVybShzcmNSMiwgc3JjUjMsIHBwMyk7XAorICAgIH0gYnJlYWs7XAorICAgIGNhc2UgMTQ6IHtcCisgICAgICAgIHZlY191OCBzcmNSMyA9IHZlY19sZCgzMCwgcyk7XAorICAgICAgICBzcmNNMiA9IHZlY19wZXJtKHNyY1IxLCBzcmNSMiwgcG0yKTtcCisgICAgICAgIHNyY00xID0gdmVjX3Blcm0oc3JjUjEsIHNyY1IyLCBwbTEpO1wKKyAgICAgICAgc3JjUDAgPSBzcmNSMjtcCisgICAgICAgIHNyY1AxID0gdmVjX3Blcm0oc3JjUjIsIHNyY1IzLCBwcDEpO1wKKyAgICAgICAgc3JjUDIgPSB2ZWNfcGVybShzcmNSMiwgc3JjUjMsIHBwMik7XAorICAgICAgICBzcmNQMyA9IHZlY19wZXJtKHNyY1IyLCBzcmNSMywgcHAzKTtcCisgICAgfSBicmVhaztcCisgICAgY2FzZSAxNToge1wKKyAgICAgICAgdmVjX3U4IHNyY1IzID0gdmVjX2xkKDMwLCBzKTtcCisgICAgICAgIHNyY00yID0gdmVjX3Blcm0oc3JjUjEsIHNyY1IyLCBwbTIpO1wKKyAgICAgICAgc3JjTTEgPSBzcmNSMjtcCisgICAgICAgIHNyY1AwID0gdmVjX3Blcm0oc3JjUjIsIHNyY1IzLCBwcDApO1wKKyAgICAgICAgc3JjUDEgPSB2ZWNfcGVybShzcmNSMiwgc3JjUjMsIHBwMSk7XAorICAgICAgICBzcmNQMiA9IHZlY19wZXJtKHNyY1IyLCBzcmNSMywgcHAyKTtcCisgICAgICAgIHNyY1AzID0gdmVjX3Blcm0oc3JjUjIsIHNyY1IzLCBwcDMpO1wKKyAgICB9IGJyZWFrO1wKKyAgICB9XAorIH0KKyNlbHNlCisjZGVmaW5lIGxvYWRfYWxpZ25tZW50KHMsIGFsaSwgcG0yLCBwbTEsIHBwMCwgcHAxLCBwcDIsIHBwMyl7XAorICAgIHNyY00yID0gIHZlY192c3hfbGQoLTIsIHMpO1wKKyAgICBzcmNNMSA9IHZlY192c3hfbGQoLTEsIHMpO1wKKyAgICBzcmNQMCA9IHZlY192c3hfbGQoMCwgcyk7XAorICAgIHNyY1AxID0gdmVjX3ZzeF9sZCgxLCBzKTtcCisgICAgc3JjUDIgPSB2ZWNfdnN4X2xkKDIsIHMpO1wKKyAgICBzcmNQMyA9IHZlY192c3hfbGQoMywgcyk7XAorIH0KKyNlbmRpZiAvKiBIQVZFX0JJR0VORElBTiAqLworCisvKiB0aGlzIGNvZGUgYXNzdW1lIHN0cmlkZSAlIDE2ID09IDAgKi8KKyNpZmRlZiBQUkVGSVhfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX2FsdGl2ZWMKK3N0YXRpYyB2b2lkIFBSRUZJWF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfYWx0aXZlYyh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICBMT0FEX1pFUk87CisgICAgdmVjX3U4IHBlcm1NMiwgcGVybU0xLCBwZXJtUDAsIHBlcm1QMSwgcGVybVAyLCBwZXJtUDM7CisgICAgY29uc3QgdmVjX3MxNiB2NXNzID0gdmVjX3NwbGF0X3MxNig1KTsKKyAgICBjb25zdCB2ZWNfdTE2IHY1dXMgPSB2ZWNfc3BsYXRfdTE2KDUpOworICAgIGNvbnN0IHZlY19zMTYgdjIwc3MgPSB2ZWNfc2wodmVjX3NwbGF0X3MxNig1KSx2ZWNfc3BsYXRfdTE2KDIpKTsKKyAgICBjb25zdCB2ZWNfczE2IHYxNnNzID0gdmVjX3NsKHZlY19zcGxhdF9zMTYoMSksdmVjX3NwbGF0X3UxNig0KSk7CisKKyAgICB2ZWNfdTggc3JjTTIsIHNyY00xLCBzcmNQMCwgc3JjUDEsIHNyY1AyLCBzcmNQMzsKKworICAgIHJlZ2lzdGVyIGludCBhbGlnbiA9ICgoKCh1bnNpZ25lZCBsb25nKXNyYykgLSAyKSAlIDE2KTsKKworICAgIHZlY19zMTYgc3JjUDBBLCBzcmNQMEIsIHNyY1AxQSwgc3JjUDFCLAorICAgICAgICAgICAgICBzcmNQMkEsIHNyY1AyQiwgc3JjUDNBLCBzcmNQM0IsCisgICAgICAgICAgICAgIHNyY00xQSwgc3JjTTFCLCBzcmNNMkEsIHNyY00yQiwKKyAgICAgICAgICAgICAgc3VtMUEsIHN1bTFCLCBzdW0yQSwgc3VtMkIsIHN1bTNBLCBzdW0zQiwKKyAgICAgICAgICAgICAgcHAxQSwgcHAxQiwgcHAyQSwgcHAyQiwgcHAzQSwgcHAzQiwKKyAgICAgICAgICAgICAgcHN1bUEsIHBzdW1CLCBzdW1BLCBzdW1COworCisgICAgdmVjX3U4IHN1bSwgZnN1bTsKKworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgcGVybU0yID0gdmVjX2x2c2woLTIsIHNyYyk7CisgICAgcGVybU0xID0gdmVjX2x2c2woLTEsIHNyYyk7CisgICAgcGVybVAwID0gdmVjX2x2c2woKzAsIHNyYyk7CisgICAgcGVybVAxID0gdmVjX2x2c2woKzEsIHNyYyk7CisgICAgcGVybVAyID0gdmVjX2x2c2woKzIsIHNyYyk7CisgICAgcGVybVAzID0gdmVjX2x2c2woKzMsIHNyYyk7CisjZW5kaWYgLyogSEFWRV9CSUdFTkRJQU4gKi8KKworICAgIGZvciAoaSA9IDAgOyBpIDwgMTYgOyBpICsrKSB7CisgICAgICAgIGxvYWRfYWxpZ25tZW50KHNyYywgYWxpZ24sIHBlcm1NMiwgcGVybU0xLCBwZXJtUDAsIHBlcm1QMSwgcGVybVAyLCBwZXJtUDMpOworCisgICAgICAgIHNyY1AwQSA9ICh2ZWNfczE2KSBWRUNfTUVSR0VIKHplcm9fdTh2LCBzcmNQMCk7CisgICAgICAgIHNyY1AwQiA9ICh2ZWNfczE2KSBWRUNfTUVSR0VMKHplcm9fdTh2LCBzcmNQMCk7CisgICAgICAgIHNyY1AxQSA9ICh2ZWNfczE2KSBWRUNfTUVSR0VIKHplcm9fdTh2LCBzcmNQMSk7CisgICAgICAgIHNyY1AxQiA9ICh2ZWNfczE2KSBWRUNfTUVSR0VMKHplcm9fdTh2LCBzcmNQMSk7CisKKyAgICAgICAgc3JjUDJBID0gKHZlY19zMTYpIFZFQ19NRVJHRUgoemVyb191OHYsIHNyY1AyKTsKKyAgICAgICAgc3JjUDJCID0gKHZlY19zMTYpIFZFQ19NRVJHRUwoemVyb191OHYsIHNyY1AyKTsKKyAgICAgICAgc3JjUDNBID0gKHZlY19zMTYpIFZFQ19NRVJHRUgoemVyb191OHYsIHNyY1AzKTsKKyAgICAgICAgc3JjUDNCID0gKHZlY19zMTYpIFZFQ19NRVJHRUwoemVyb191OHYsIHNyY1AzKTsKKworICAgICAgICBzcmNNMUEgPSAodmVjX3MxNikgVkVDX01FUkdFSCh6ZXJvX3U4diwgc3JjTTEpOworICAgICAgICBzcmNNMUIgPSAodmVjX3MxNikgVkVDX01FUkdFTCh6ZXJvX3U4diwgc3JjTTEpOworICAgICAgICBzcmNNMkEgPSAodmVjX3MxNikgVkVDX01FUkdFSCh6ZXJvX3U4diwgc3JjTTIpOworICAgICAgICBzcmNNMkIgPSAodmVjX3MxNikgVkVDX01FUkdFTCh6ZXJvX3U4diwgc3JjTTIpOworCisgICAgICAgIHN1bTFBID0gdmVjX2FkZHMoc3JjUDBBLCBzcmNQMUEpOworICAgICAgICBzdW0xQiA9IHZlY19hZGRzKHNyY1AwQiwgc3JjUDFCKTsKKyAgICAgICAgc3VtMkEgPSB2ZWNfYWRkcyhzcmNNMUEsIHNyY1AyQSk7CisgICAgICAgIHN1bTJCID0gdmVjX2FkZHMoc3JjTTFCLCBzcmNQMkIpOworICAgICAgICBzdW0zQSA9IHZlY19hZGRzKHNyY00yQSwgc3JjUDNBKTsKKyAgICAgICAgc3VtM0IgPSB2ZWNfYWRkcyhzcmNNMkIsIHNyY1AzQik7CisKKyAgICAgICAgcHAxQSA9IHZlY19tbGFkZChzdW0xQSwgdjIwc3MsIHYxNnNzKTsKKyAgICAgICAgcHAxQiA9IHZlY19tbGFkZChzdW0xQiwgdjIwc3MsIHYxNnNzKTsKKworICAgICAgICBwcDJBID0gdmVjX21sYWRkKHN1bTJBLCB2NXNzLCB6ZXJvX3MxNnYpOworICAgICAgICBwcDJCID0gdmVjX21sYWRkKHN1bTJCLCB2NXNzLCB6ZXJvX3MxNnYpOworCisgICAgICAgIHBwM0EgPSB2ZWNfYWRkKHN1bTNBLCBwcDFBKTsKKyAgICAgICAgcHAzQiA9IHZlY19hZGQoc3VtM0IsIHBwMUIpOworCisgICAgICAgIHBzdW1BID0gdmVjX3N1YihwcDNBLCBwcDJBKTsKKyAgICAgICAgcHN1bUIgPSB2ZWNfc3ViKHBwM0IsIHBwMkIpOworCisgICAgICAgIHN1bUEgPSB2ZWNfc3JhKHBzdW1BLCB2NXVzKTsKKyAgICAgICAgc3VtQiA9IHZlY19zcmEocHN1bUIsIHY1dXMpOworCisgICAgICAgIHN1bSA9IHZlY19wYWNrc3Uoc3VtQSwgc3VtQik7CisKKyAgICAgICAgQVNTRVJUX0FMSUdORUQoZHN0KTsKKworICAgICAgICBPUF9VOF9BTFRJVkVDKGZzdW0sIHN1bSwgdmVjX2xkKDAsIGRzdCkpOworCisgICAgICAgIHZlY19zdChmc3VtLCAwLCBkc3QpOworCisgICAgICAgIHNyYyArPSBzcmNTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RTdHJpZGU7CisgICAgfQorfQorI2VuZGlmCisKKy8qIHRoaXMgY29kZSBhc3N1bWUgc3RyaWRlICUgMTYgPT0gMCAqLworI2lmZGVmIFBSRUZJWF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfYWx0aXZlYworc3RhdGljIHZvaWQgUFJFRklYX2gyNjRfcXBlbDE2X3ZfbG93cGFzc19hbHRpdmVjKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKworICAgIExPQURfWkVSTzsKKyAgICB2ZWNfdTggcGVybTsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIHBlcm0gPSB2ZWNfbHZzbCgwLCBzcmMpOworI2VuZGlmCisgICAgY29uc3QgdmVjX3MxNiB2MjBzcyA9IHZlY19zbCh2ZWNfc3BsYXRfczE2KDUpLHZlY19zcGxhdF91MTYoMikpOworICAgIGNvbnN0IHZlY191MTYgdjV1cyA9IHZlY19zcGxhdF91MTYoNSk7CisgICAgY29uc3QgdmVjX3MxNiB2NXNzID0gdmVjX3NwbGF0X3MxNig1KTsKKyAgICBjb25zdCB2ZWNfczE2IHYxNnNzID0gdmVjX3NsKHZlY19zcGxhdF9zMTYoMSksdmVjX3NwbGF0X3UxNig0KSk7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNiaXMgPSBzcmMgLSAoc3JjU3RyaWRlICogMik7CisKKyAgICBjb25zdCB2ZWNfdTggc3JjTTIgPSBsb2FkX3dpdGhfcGVybV92ZWMoMCwgc3JjYmlzLCBwZXJtKTsKKyAgICBzcmNiaXMgKz0gc3JjU3RyaWRlOworICAgIGNvbnN0IHZlY191OCBzcmNNMSA9IGxvYWRfd2l0aF9wZXJtX3ZlYygwLCBzcmNiaXMsIHBlcm0pOworICAgIHNyY2JpcyArPSBzcmNTdHJpZGU7CisgICAgY29uc3QgdmVjX3U4IHNyY1AwID0gbG9hZF93aXRoX3Blcm1fdmVjKDAsIHNyY2JpcywgcGVybSk7CisgICAgc3JjYmlzICs9IHNyY1N0cmlkZTsKKyAgICBjb25zdCB2ZWNfdTggc3JjUDEgPSBsb2FkX3dpdGhfcGVybV92ZWMoMCwgc3JjYmlzLCBwZXJtKTsKKyAgICBzcmNiaXMgKz0gc3JjU3RyaWRlOworICAgIGNvbnN0IHZlY191OCBzcmNQMiA9IGxvYWRfd2l0aF9wZXJtX3ZlYygwLCBzcmNiaXMsIHBlcm0pOworICAgIHNyY2JpcyArPSBzcmNTdHJpZGU7CisKKyAgICB2ZWNfczE2IHNyY00yc3NBID0gKHZlY19zMTYpIFZFQ19NRVJHRUgoemVyb191OHYsIHNyY00yKTsKKyAgICB2ZWNfczE2IHNyY00yc3NCID0gKHZlY19zMTYpIFZFQ19NRVJHRUwoemVyb191OHYsIHNyY00yKTsKKyAgICB2ZWNfczE2IHNyY00xc3NBID0gKHZlY19zMTYpIFZFQ19NRVJHRUgoemVyb191OHYsIHNyY00xKTsKKyAgICB2ZWNfczE2IHNyY00xc3NCID0gKHZlY19zMTYpIFZFQ19NRVJHRUwoemVyb191OHYsIHNyY00xKTsKKyAgICB2ZWNfczE2IHNyY1Awc3NBID0gKHZlY19zMTYpIFZFQ19NRVJHRUgoemVyb191OHYsIHNyY1AwKTsKKyAgICB2ZWNfczE2IHNyY1Awc3NCID0gKHZlY19zMTYpIFZFQ19NRVJHRUwoemVyb191OHYsIHNyY1AwKTsKKyAgICB2ZWNfczE2IHNyY1Axc3NBID0gKHZlY19zMTYpIFZFQ19NRVJHRUgoemVyb191OHYsIHNyY1AxKTsKKyAgICB2ZWNfczE2IHNyY1Axc3NCID0gKHZlY19zMTYpIFZFQ19NRVJHRUwoemVyb191OHYsIHNyY1AxKTsKKyAgICB2ZWNfczE2IHNyY1Ayc3NBID0gKHZlY19zMTYpIFZFQ19NRVJHRUgoemVyb191OHYsIHNyY1AyKTsKKyAgICB2ZWNfczE2IHNyY1Ayc3NCID0gKHZlY19zMTYpIFZFQ19NRVJHRUwoemVyb191OHYsIHNyY1AyKTsKKworICAgIHZlY19zMTYgcHAxQSwgcHAxQiwgcHAyQSwgcHAyQiwgcHAzQSwgcHAzQiwKKyAgICAgICAgICAgICAgcHN1bUEsIHBzdW1CLCBzdW1BLCBzdW1CLAorICAgICAgICAgICAgICBzcmNQM3NzQSwgc3JjUDNzc0IsCisgICAgICAgICAgICAgIHN1bTFBLCBzdW0xQiwgc3VtMkEsIHN1bTJCLCBzdW0zQSwgc3VtM0I7CisKKyAgICB2ZWNfdTggc3VtLCBmc3VtLCBzcmNQMzsKKworICAgIGZvciAoaSA9IDAgOyBpIDwgMTYgOyBpKyspIHsKKyAgICAgICAgc3JjUDMgPSBsb2FkX3dpdGhfcGVybV92ZWMoMCwgc3JjYmlzLCBwZXJtKTsKKyAgICAgICAgc3JjYmlzICs9IHNyY1N0cmlkZTsKKworICAgICAgICBzcmNQM3NzQSA9ICh2ZWNfczE2KSBWRUNfTUVSR0VIKHplcm9fdTh2LCBzcmNQMyk7CisgICAgICAgIHNyY1Azc3NCID0gKHZlY19zMTYpIFZFQ19NRVJHRUwoemVyb191OHYsIHNyY1AzKTsKKworICAgICAgICBzdW0xQSA9IHZlY19hZGRzKHNyY1Awc3NBLCBzcmNQMXNzQSk7CisgICAgICAgIHN1bTFCID0gdmVjX2FkZHMoc3JjUDBzc0IsIHNyY1Axc3NCKTsKKyAgICAgICAgc3VtMkEgPSB2ZWNfYWRkcyhzcmNNMXNzQSwgc3JjUDJzc0EpOworICAgICAgICBzdW0yQiA9IHZlY19hZGRzKHNyY00xc3NCLCBzcmNQMnNzQik7CisgICAgICAgIHN1bTNBID0gdmVjX2FkZHMoc3JjTTJzc0EsIHNyY1Azc3NBKTsKKyAgICAgICAgc3VtM0IgPSB2ZWNfYWRkcyhzcmNNMnNzQiwgc3JjUDNzc0IpOworCisgICAgICAgIHNyY00yc3NBID0gc3JjTTFzc0E7CisgICAgICAgIHNyY00yc3NCID0gc3JjTTFzc0I7CisgICAgICAgIHNyY00xc3NBID0gc3JjUDBzc0E7CisgICAgICAgIHNyY00xc3NCID0gc3JjUDBzc0I7CisgICAgICAgIHNyY1Awc3NBID0gc3JjUDFzc0E7CisgICAgICAgIHNyY1Awc3NCID0gc3JjUDFzc0I7CisgICAgICAgIHNyY1Axc3NBID0gc3JjUDJzc0E7CisgICAgICAgIHNyY1Axc3NCID0gc3JjUDJzc0I7CisgICAgICAgIHNyY1Ayc3NBID0gc3JjUDNzc0E7CisgICAgICAgIHNyY1Ayc3NCID0gc3JjUDNzc0I7CisKKyAgICAgICAgcHAxQSA9IHZlY19tbGFkZChzdW0xQSwgdjIwc3MsIHYxNnNzKTsKKyAgICAgICAgcHAxQiA9IHZlY19tbGFkZChzdW0xQiwgdjIwc3MsIHYxNnNzKTsKKworICAgICAgICBwcDJBID0gdmVjX21sYWRkKHN1bTJBLCB2NXNzLCB6ZXJvX3MxNnYpOworICAgICAgICBwcDJCID0gdmVjX21sYWRkKHN1bTJCLCB2NXNzLCB6ZXJvX3MxNnYpOworCisgICAgICAgIHBwM0EgPSB2ZWNfYWRkKHN1bTNBLCBwcDFBKTsKKyAgICAgICAgcHAzQiA9IHZlY19hZGQoc3VtM0IsIHBwMUIpOworCisgICAgICAgIHBzdW1BID0gdmVjX3N1YihwcDNBLCBwcDJBKTsKKyAgICAgICAgcHN1bUIgPSB2ZWNfc3ViKHBwM0IsIHBwMkIpOworCisgICAgICAgIHN1bUEgPSB2ZWNfc3JhKHBzdW1BLCB2NXVzKTsKKyAgICAgICAgc3VtQiA9IHZlY19zcmEocHN1bUIsIHY1dXMpOworCisgICAgICAgIHN1bSA9IHZlY19wYWNrc3Uoc3VtQSwgc3VtQik7CisKKyAgICAgICAgQVNTRVJUX0FMSUdORUQoZHN0KTsKKworICAgICAgICBPUF9VOF9BTFRJVkVDKGZzdW0sIHN1bSwgdmVjX2xkKDAsIGRzdCkpOworCisgICAgICAgIHZlY19zdChmc3VtLCAwLCBkc3QpOworCisgICAgICAgIGRzdCArPSBkc3RTdHJpZGU7CisgICAgfQorfQorI2VuZGlmCisKKy8qIHRoaXMgY29kZSBhc3N1bWUgc3RyaWRlICUgMTYgPT0gMCAqYW5kKiB0bXAgaXMgcHJvcGVybHkgYWxpZ25lZCAqLworI2lmZGVmIFBSRUZJWF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX2FsdGl2ZWMKK3N0YXRpYyB2b2lkIFBSRUZJWF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX2FsdGl2ZWModWludDhfdCAqZHN0LCBpbnQxNl90ICp0bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHRtcFN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZSkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICBMT0FEX1pFUk87CisgICAgdmVjX3U4IHBlcm1NMiwgcGVybU0xLCBwZXJtUDAsIHBlcm1QMSwgcGVybVAyLCBwZXJtUDM7CisgICAgY29uc3QgdmVjX3MxNiB2MjBzcyA9IHZlY19zbCh2ZWNfc3BsYXRfczE2KDUpLHZlY19zcGxhdF91MTYoMikpOworICAgIGNvbnN0IHZlY191MzIgdjEwdWkgPSB2ZWNfc3BsYXRfdTMyKDEwKTsKKyAgICBjb25zdCB2ZWNfczE2IHY1c3MgPSB2ZWNfc3BsYXRfczE2KDUpOworICAgIGNvbnN0IHZlY19zMTYgdjFzcyA9IHZlY19zcGxhdF9zMTYoMSk7CisgICAgY29uc3QgdmVjX3MzMiB2NTEyc2kgPSB2ZWNfc2wodmVjX3NwbGF0X3MzMigxKSx2ZWNfc3BsYXRfdTMyKDkpKTsKKyAgICBjb25zdCB2ZWNfdTMyIHYxNnVpID0gdmVjX3NsKHZlY19zcGxhdF91MzIoMSksdmVjX3NwbGF0X3UzMig0KSk7CisKKyAgICByZWdpc3RlciBpbnQgYWxpZ24gPSAoKCgodW5zaWduZWQgbG9uZylzcmMpIC0gMikgJSAxNik7CisKKyAgICB2ZWNfczE2IHNyY1AwQSwgc3JjUDBCLCBzcmNQMUEsIHNyY1AxQiwKKyAgICAgICAgICAgICAgc3JjUDJBLCBzcmNQMkIsIHNyY1AzQSwgc3JjUDNCLAorICAgICAgICAgICAgICBzcmNNMUEsIHNyY00xQiwgc3JjTTJBLCBzcmNNMkIsCisgICAgICAgICAgICAgIHN1bTFBLCBzdW0xQiwgc3VtMkEsIHN1bTJCLCBzdW0zQSwgc3VtM0IsCisgICAgICAgICAgICAgIHBwMUEsIHBwMUIsIHBwMkEsIHBwMkIsIHBzdW1BLCBwc3VtQjsKKworICAgIGNvbnN0IHZlY191OCBtcGVybSA9IChjb25zdCB2ZWNfdTgpCisgICAgICAgIHsweDAwLCAweDA4LCAweDAxLCAweDA5LCAweDAyLCAweDBBLCAweDAzLCAweDBCLAorICAgICAgICAgMHgwNCwgMHgwQywgMHgwNSwgMHgwRCwgMHgwNiwgMHgwRSwgMHgwNywgMHgwRn07CisgICAgaW50MTZfdCAqdG1wYmlzID0gdG1wOworCisgICAgdmVjX3MxNiB0bXBNMXNzQSwgdG1wTTFzc0IsIHRtcE0yc3NBLCB0bXBNMnNzQiwKKyAgICAgICAgICAgICAgdG1wUDBzc0EsIHRtcFAwc3NCLCB0bXBQMXNzQSwgdG1wUDFzc0IsCisgICAgICAgICAgICAgIHRtcFAyc3NBLCB0bXBQMnNzQjsKKworICAgIHZlY19zMzIgcHAxQWUsIHBwMUFvLCBwcDFCZSwgcHAxQm8sIHBwMkFlLCBwcDJBbywgcHAyQmUsIHBwMkJvLAorICAgICAgICAgICAgICBwcDNBZSwgcHAzQW8sIHBwM0JlLCBwcDNCbywgcHAxY0FlLCBwcDFjQW8sIHBwMWNCZSwgcHAxY0JvLAorICAgICAgICAgICAgICBwcDMyQWUsIHBwMzJBbywgcHAzMkJlLCBwcDMyQm8sIHN1bUFlLCBzdW1Bbywgc3VtQmUsIHN1bUJvLAorICAgICAgICAgICAgICBzc3VtQWUsIHNzdW1Bbywgc3N1bUJlLCBzc3VtQm87CisgICAgdmVjX3U4IGZzdW0sIHN1bXYsIHN1bTsKKyAgICB2ZWNfczE2IHNzdW1lLCBzc3VtbzsKKworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgcGVybU0yID0gdmVjX2x2c2woLTIsIHNyYyk7CisgICAgcGVybU0xID0gdmVjX2x2c2woLTEsIHNyYyk7CisgICAgcGVybVAwID0gdmVjX2x2c2woKzAsIHNyYyk7CisgICAgcGVybVAxID0gdmVjX2x2c2woKzEsIHNyYyk7CisgICAgcGVybVAyID0gdmVjX2x2c2woKzIsIHNyYyk7CisgICAgcGVybVAzID0gdmVjX2x2c2woKzMsIHNyYyk7CisjZW5kaWYgLyogSEFWRV9CSUdFTkRJQU4gKi8KKworICAgIHNyYyAtPSAoMiAqIHNyY1N0cmlkZSk7CisgICAgZm9yIChpID0gMCA7IGkgPCAyMSA7IGkgKyspIHsKKyAgICAgICAgdmVjX3U4IHNyY00yLCBzcmNNMSwgc3JjUDAsIHNyY1AxLCBzcmNQMiwgc3JjUDM7CisKKyAgICAgICAgbG9hZF9hbGlnbm1lbnQoc3JjLCBhbGlnbiwgcGVybU0yLCBwZXJtTTEsIHBlcm1QMCwgcGVybVAxLCBwZXJtUDIsIHBlcm1QMyk7CisKKyAgICAgICAgc3JjUDBBID0gKHZlY19zMTYpIFZFQ19NRVJHRUgoemVyb191OHYsIHNyY1AwKTsKKyAgICAgICAgc3JjUDBCID0gKHZlY19zMTYpIFZFQ19NRVJHRUwoemVyb191OHYsIHNyY1AwKTsKKyAgICAgICAgc3JjUDFBID0gKHZlY19zMTYpIFZFQ19NRVJHRUgoemVyb191OHYsIHNyY1AxKTsKKyAgICAgICAgc3JjUDFCID0gKHZlY19zMTYpIFZFQ19NRVJHRUwoemVyb191OHYsIHNyY1AxKTsKKworICAgICAgICBzcmNQMkEgPSAodmVjX3MxNikgVkVDX01FUkdFSCh6ZXJvX3U4diwgc3JjUDIpOworICAgICAgICBzcmNQMkIgPSAodmVjX3MxNikgVkVDX01FUkdFTCh6ZXJvX3U4diwgc3JjUDIpOworICAgICAgICBzcmNQM0EgPSAodmVjX3MxNikgVkVDX01FUkdFSCh6ZXJvX3U4diwgc3JjUDMpOworICAgICAgICBzcmNQM0IgPSAodmVjX3MxNikgVkVDX01FUkdFTCh6ZXJvX3U4diwgc3JjUDMpOworCisgICAgICAgIHNyY00xQSA9ICh2ZWNfczE2KSBWRUNfTUVSR0VIKHplcm9fdTh2LCBzcmNNMSk7CisgICAgICAgIHNyY00xQiA9ICh2ZWNfczE2KSBWRUNfTUVSR0VMKHplcm9fdTh2LCBzcmNNMSk7CisgICAgICAgIHNyY00yQSA9ICh2ZWNfczE2KSBWRUNfTUVSR0VIKHplcm9fdTh2LCBzcmNNMik7CisgICAgICAgIHNyY00yQiA9ICh2ZWNfczE2KSBWRUNfTUVSR0VMKHplcm9fdTh2LCBzcmNNMik7CisKKyAgICAgICAgc3VtMUEgPSB2ZWNfYWRkcyhzcmNQMEEsIHNyY1AxQSk7CisgICAgICAgIHN1bTFCID0gdmVjX2FkZHMoc3JjUDBCLCBzcmNQMUIpOworICAgICAgICBzdW0yQSA9IHZlY19hZGRzKHNyY00xQSwgc3JjUDJBKTsKKyAgICAgICAgc3VtMkIgPSB2ZWNfYWRkcyhzcmNNMUIsIHNyY1AyQik7CisgICAgICAgIHN1bTNBID0gdmVjX2FkZHMoc3JjTTJBLCBzcmNQM0EpOworICAgICAgICBzdW0zQiA9IHZlY19hZGRzKHNyY00yQiwgc3JjUDNCKTsKKworICAgICAgICBwcDFBID0gdmVjX21sYWRkKHN1bTFBLCB2MjBzcywgc3VtM0EpOworICAgICAgICBwcDFCID0gdmVjX21sYWRkKHN1bTFCLCB2MjBzcywgc3VtM0IpOworCisgICAgICAgIHBwMkEgPSB2ZWNfbWxhZGQoc3VtMkEsIHY1c3MsIHplcm9fczE2dik7CisgICAgICAgIHBwMkIgPSB2ZWNfbWxhZGQoc3VtMkIsIHY1c3MsIHplcm9fczE2dik7CisKKyAgICAgICAgcHN1bUEgPSB2ZWNfc3ViKHBwMUEsIHBwMkEpOworICAgICAgICBwc3VtQiA9IHZlY19zdWIocHAxQiwgcHAyQik7CisKKyAgICAgICAgdmVjX3N0KHBzdW1BLCAwLCB0bXApOworICAgICAgICB2ZWNfc3QocHN1bUIsIDE2LCB0bXApOworCisgICAgICAgIHNyYyArPSBzcmNTdHJpZGU7CisgICAgICAgIHRtcCArPSB0bXBTdHJpZGU7IC8qIGludDE2X3QqLCBhbmQgc3RyaWRlIGlzIDE2LCBzbyBpdCdzIE9LIGhlcmUgKi8KKyAgICB9CisKKyAgICB0bXBNMnNzQSA9IHZlY19sZCgwLCB0bXBiaXMpOworICAgIHRtcE0yc3NCID0gdmVjX2xkKDE2LCB0bXBiaXMpOworICAgIHRtcGJpcyArPSB0bXBTdHJpZGU7CisgICAgdG1wTTFzc0EgPSB2ZWNfbGQoMCwgdG1wYmlzKTsKKyAgICB0bXBNMXNzQiA9IHZlY19sZCgxNiwgdG1wYmlzKTsKKyAgICB0bXBiaXMgKz0gdG1wU3RyaWRlOworICAgIHRtcFAwc3NBID0gdmVjX2xkKDAsIHRtcGJpcyk7CisgICAgdG1wUDBzc0IgPSB2ZWNfbGQoMTYsIHRtcGJpcyk7CisgICAgdG1wYmlzICs9IHRtcFN0cmlkZTsKKyAgICB0bXBQMXNzQSA9IHZlY19sZCgwLCB0bXBiaXMpOworICAgIHRtcFAxc3NCID0gdmVjX2xkKDE2LCB0bXBiaXMpOworICAgIHRtcGJpcyArPSB0bXBTdHJpZGU7CisgICAgdG1wUDJzc0EgPSB2ZWNfbGQoMCwgdG1wYmlzKTsKKyAgICB0bXBQMnNzQiA9IHZlY19sZCgxNiwgdG1wYmlzKTsKKyAgICB0bXBiaXMgKz0gdG1wU3RyaWRlOworCisgICAgZm9yIChpID0gMCA7IGkgPCAxNiA7IGkrKykgeworICAgICAgICBjb25zdCB2ZWNfczE2IHRtcFAzc3NBID0gdmVjX2xkKDAsIHRtcGJpcyk7CisgICAgICAgIGNvbnN0IHZlY19zMTYgdG1wUDNzc0IgPSB2ZWNfbGQoMTYsIHRtcGJpcyk7CisKKyAgICAgICAgY29uc3QgdmVjX3MxNiBzdW0xQSA9IHZlY19hZGRzKHRtcFAwc3NBLCB0bXBQMXNzQSk7CisgICAgICAgIGNvbnN0IHZlY19zMTYgc3VtMUIgPSB2ZWNfYWRkcyh0bXBQMHNzQiwgdG1wUDFzc0IpOworICAgICAgICBjb25zdCB2ZWNfczE2IHN1bTJBID0gdmVjX2FkZHModG1wTTFzc0EsIHRtcFAyc3NBKTsKKyAgICAgICAgY29uc3QgdmVjX3MxNiBzdW0yQiA9IHZlY19hZGRzKHRtcE0xc3NCLCB0bXBQMnNzQik7CisgICAgICAgIHZlY19zMTYgc3VtM0EgPSB2ZWNfYWRkcyh0bXBNMnNzQSwgdG1wUDNzc0EpOworICAgICAgICB2ZWNfczE2IHN1bTNCID0gdmVjX2FkZHModG1wTTJzc0IsIHRtcFAzc3NCKTsKKworICAgICAgICB0bXBiaXMgKz0gdG1wU3RyaWRlOworCisgICAgICAgIHRtcE0yc3NBID0gdG1wTTFzc0E7CisgICAgICAgIHRtcE0yc3NCID0gdG1wTTFzc0I7CisgICAgICAgIHRtcE0xc3NBID0gdG1wUDBzc0E7CisgICAgICAgIHRtcE0xc3NCID0gdG1wUDBzc0I7CisgICAgICAgIHRtcFAwc3NBID0gdG1wUDFzc0E7CisgICAgICAgIHRtcFAwc3NCID0gdG1wUDFzc0I7CisgICAgICAgIHRtcFAxc3NBID0gdG1wUDJzc0E7CisgICAgICAgIHRtcFAxc3NCID0gdG1wUDJzc0I7CisgICAgICAgIHRtcFAyc3NBID0gdG1wUDNzc0E7CisgICAgICAgIHRtcFAyc3NCID0gdG1wUDNzc0I7CisKKyAgICAgICAgcHAxQWUgPSB2ZWNfbXVsZShzdW0xQSwgdjIwc3MpOworICAgICAgICBwcDFBbyA9IHZlY19tdWxvKHN1bTFBLCB2MjBzcyk7CisgICAgICAgIHBwMUJlID0gdmVjX211bGUoc3VtMUIsIHYyMHNzKTsKKyAgICAgICAgcHAxQm8gPSB2ZWNfbXVsbyhzdW0xQiwgdjIwc3MpOworCisgICAgICAgIHBwMkFlID0gdmVjX211bGUoc3VtMkEsIHY1c3MpOworICAgICAgICBwcDJBbyA9IHZlY19tdWxvKHN1bTJBLCB2NXNzKTsKKyAgICAgICAgcHAyQmUgPSB2ZWNfbXVsZShzdW0yQiwgdjVzcyk7CisgICAgICAgIHBwMkJvID0gdmVjX211bG8oc3VtMkIsIHY1c3MpOworCisgICAgICAgIHBwM0FvID0gdmVjX211bG8oc3VtM0EsIHYxc3MpOworICAgICAgICBwcDNCbyA9IHZlY19tdWxvKHN1bTNCLCB2MXNzKTsKKyNpZiAhSEFWRV9CSUdFTkRJQU4KKyAgICAgICAgc3VtM0EgPSAodmVjX3MxNil2ZWNfcGVybShzdW0zQSwgc3VtM0EsdmNzd2FwaTJzKDAsMSwyLDMpKTsKKyAgICAgICAgc3VtM0IgPSAodmVjX3MxNil2ZWNfcGVybShzdW0zQiwgc3VtM0IsdmNzd2FwaTJzKDAsMSwyLDMpKTsKKyNlbmRpZgorICAgICAgICBwcDNBZSA9IHZlY19zcmEoKHZlY19zMzIpc3VtM0EsIHYxNnVpKTsKKyAgICAgICAgcHAzQmUgPSB2ZWNfc3JhKCh2ZWNfczMyKXN1bTNCLCB2MTZ1aSk7CisKKyAgICAgICAgcHAxY0FlID0gdmVjX2FkZChwcDFBZSwgdjUxMnNpKTsKKyAgICAgICAgcHAxY0FvID0gdmVjX2FkZChwcDFBbywgdjUxMnNpKTsKKyAgICAgICAgcHAxY0JlID0gdmVjX2FkZChwcDFCZSwgdjUxMnNpKTsKKyAgICAgICAgcHAxY0JvID0gdmVjX2FkZChwcDFCbywgdjUxMnNpKTsKKworICAgICAgICBwcDMyQWUgPSB2ZWNfc3ViKHBwM0FlLCBwcDJBZSk7CisgICAgICAgIHBwMzJBbyA9IHZlY19zdWIocHAzQW8sIHBwMkFvKTsKKyAgICAgICAgcHAzMkJlID0gdmVjX3N1YihwcDNCZSwgcHAyQmUpOworICAgICAgICBwcDMyQm8gPSB2ZWNfc3ViKHBwM0JvLCBwcDJCbyk7CisKKyAgICAgICAgc3VtQWUgPSB2ZWNfYWRkKHBwMWNBZSwgcHAzMkFlKTsKKyAgICAgICAgc3VtQW8gPSB2ZWNfYWRkKHBwMWNBbywgcHAzMkFvKTsKKyAgICAgICAgc3VtQmUgPSB2ZWNfYWRkKHBwMWNCZSwgcHAzMkJlKTsKKyAgICAgICAgc3VtQm8gPSB2ZWNfYWRkKHBwMWNCbywgcHAzMkJvKTsKKworICAgICAgICBzc3VtQWUgPSB2ZWNfc3JhKHN1bUFlLCB2MTB1aSk7CisgICAgICAgIHNzdW1BbyA9IHZlY19zcmEoc3VtQW8sIHYxMHVpKTsKKyAgICAgICAgc3N1bUJlID0gdmVjX3NyYShzdW1CZSwgdjEwdWkpOworICAgICAgICBzc3VtQm8gPSB2ZWNfc3JhKHN1bUJvLCB2MTB1aSk7CisKKyAgICAgICAgc3N1bWUgPSB2ZWNfcGFja3Moc3N1bUFlLCBzc3VtQmUpOworICAgICAgICBzc3VtbyA9IHZlY19wYWNrcyhzc3VtQW8sIHNzdW1Cbyk7CisKKyAgICAgICAgc3VtdiA9IHZlY19wYWNrc3Uoc3N1bWUsIHNzdW1vKTsKKyAgICAgICAgc3VtID0gdmVjX3Blcm0oc3Vtdiwgc3VtdiwgbXBlcm0pOworCisgICAgICAgIEFTU0VSVF9BTElHTkVEKGRzdCk7CisKKyAgICAgICAgT1BfVThfQUxUSVZFQyhmc3VtLCBzdW0sIHZlY19sZCgwLCBkc3QpKTsKKworICAgICAgICB2ZWNfc3QoZnN1bSwgMCwgZHN0KTsKKworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2hwZWxkc3BfYWx0aXZlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2hwZWxkc3BfYWx0aXZlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YTFmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvaHBlbGRzcF9hbHRpdmVjLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgQnJpYW4gRm9sZXkKKyAqIENvcHlyaWdodCAoYykgMjAwMiBEaWV0ZXIgU2hpcmxleQorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgUm9tYWluIERvbGJlYXUgPHJvbWFpbkBkb2xiZWF1Lm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgSEFWRV9BTFRJVkVDX0gKKyNpbmNsdWRlIDxhbHRpdmVjLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2hwZWxkc3AuaCIKKyNpbmNsdWRlICJocGVsZHNwX2FsdGl2ZWMuaCIKKworI2lmIEhBVkVfQUxUSVZFQworLyogbmV4dCBvbmUgYXNzdW1lcyB0aGF0ICgobGluZV9zaXplICUgMTYpID09IDApICovCit2b2lkIGZmX3B1dF9waXhlbHMxNl9hbHRpdmVjKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeGVsc3YxOworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeGVsc3YxQjsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXhlbHN2MUM7CisgICAgcmVnaXN0ZXIgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGl4ZWxzdjFEOworCisgICAgaW50IGk7CisgICAgcmVnaXN0ZXIgcHRyZGlmZl90IGxpbmVfc2l6ZV8yID0gbGluZV9zaXplIDw8IDE7CisgICAgcmVnaXN0ZXIgcHRyZGlmZl90IGxpbmVfc2l6ZV8zID0gbGluZV9zaXplICsgbGluZV9zaXplXzI7CisgICAgcmVnaXN0ZXIgcHRyZGlmZl90IGxpbmVfc2l6ZV80ID0gbGluZV9zaXplIDw8IDI7CisKKy8vIGhhbmQtdW5yb2xsaW5nIHRoZSBsb29wIGJ5IDQgZ2FpbnMgYWJvdXQgMTUlCisvLyBtaW5pbnVtIGV4ZWN1dGlvbiB0aW1lIGdvZXMgZnJvbSA3NCB0byA2MCBjeWNsZXMKKy8vIGl0J3MgZmFzdGVyIHRoYW4gLWZ1bnJvbGwtbG9vcHMsIGJ1dCB1c2luZworLy8gLWZ1bnJvbGwtbG9vcHMgdy8gdGhpcyBpcyBiYWQgLSA3NCBjeWNsZXMgYWdhaW4uCisvLyBhbGwgdGhpcyBpcyBvbiBhIDc0NTAsIHR1bmluZyBmb3IgdGhlIDc0NTAKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSArPSA0KSB7CisgICAgICAgIHBpeGVsc3YxICA9IHVuYWxpZ25lZF9sb2FkKCAwLCBwaXhlbHMpOworICAgICAgICBwaXhlbHN2MUIgPSB1bmFsaWduZWRfbG9hZChsaW5lX3NpemUsIHBpeGVscyk7CisgICAgICAgIHBpeGVsc3YxQyA9IHVuYWxpZ25lZF9sb2FkKGxpbmVfc2l6ZV8yLCBwaXhlbHMpOworICAgICAgICBwaXhlbHN2MUQgPSB1bmFsaWduZWRfbG9hZChsaW5lX3NpemVfMywgcGl4ZWxzKTsKKyAgICAgICAgVkVDX1NUKHBpeGVsc3YxLCAwLCAodW5zaWduZWQgY2hhciopYmxvY2spOworICAgICAgICBWRUNfU1QocGl4ZWxzdjFCLCBsaW5lX3NpemUsICh1bnNpZ25lZCBjaGFyKilibG9jayk7CisgICAgICAgIFZFQ19TVChwaXhlbHN2MUMsIGxpbmVfc2l6ZV8yLCAodW5zaWduZWQgY2hhciopYmxvY2spOworICAgICAgICBWRUNfU1QocGl4ZWxzdjFELCBsaW5lX3NpemVfMywgKHVuc2lnbmVkIGNoYXIqKWJsb2NrKTsKKyAgICAgICAgcGl4ZWxzKz1saW5lX3NpemVfNDsKKyAgICAgICAgYmxvY2sgKz1saW5lX3NpemVfNDsKKyAgICB9Cit9CisKKy8qIG5leHQgb25lIGFzc3VtZXMgdGhhdCAoKGxpbmVfc2l6ZSAlIDE2KSA9PSAwKSAqLworI2RlZmluZSBvcF9hdmcoYSxiKSAgYSA9ICggKChhKXwoYikpIC0gKCgoKGEpXihiKSkmMHhGRUZFRkVGRVVMKT4+MSkgKQordm9pZCBmZl9hdmdfcGl4ZWxzMTZfYWx0aXZlYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXhlbHN2LCBibG9ja3Y7CisKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIGJsb2NrdiA9IHZlY19sZCgwLCBibG9jayk7CisgICAgICAgIHBpeGVsc3YgPSBWRUNfTEQoIDAsIHBpeGVscyk7CisgICAgICAgIGJsb2NrdiA9IHZlY19hdmcoYmxvY2t2LHBpeGVsc3YpOworICAgICAgICB2ZWNfc3QoYmxvY2t2LCAwLCAodW5zaWduZWQgY2hhciopYmxvY2spOworICAgICAgICBwaXhlbHMrPWxpbmVfc2l6ZTsKKyAgICAgICAgYmxvY2sgKz1saW5lX3NpemU7CisgICAgfQorfQorCisvKiBuZXh0IG9uZSBhc3N1bWVzIHRoYXQgKChsaW5lX3NpemUgJSA4KSA9PSAwKSAqLworc3RhdGljIHZvaWQgYXZnX3BpeGVsczhfYWx0aXZlYyh1aW50OF90ICogYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKiBwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeGVsc3YxLCBwaXhlbHN2MiwgcGl4ZWxzdiwgYmxvY2t2OworICAgIGludCBpOworCisgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgLyogYmxvY2sgaXMgOCBieXRlcy1hbGlnbmVkLCBzbyB3ZSdyZSBlaXRoZXIgaW4gdGhlCisgICAgICAgICAgbGVmdCBibG9jayAoMTYgYnl0ZXMtYWxpZ25lZCkgb3IgaW4gdGhlIHJpZ2h0IGJsb2NrIChub3QpICovCisgICAgICAgaW50IHJpZ2h0c2lkZSA9ICgodW5zaWduZWQgbG9uZylibG9jayAmIDB4MDAwMDAwMEYpOworCisgICAgICAgYmxvY2t2ID0gdmVjX2xkKDAsIGJsb2NrKTsKKyAgICAgICBwaXhlbHN2ID0gVkVDX0xEKCAwLCBwaXhlbHMpOworCisgICAgICAgaWYgKHJpZ2h0c2lkZSkgeworICAgICAgICAgICBwaXhlbHN2ID0gdmVjX3Blcm0oYmxvY2t2LCBwaXhlbHN2LCB2Y3BybSgwLDEsczAsczEpKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBwaXhlbHN2ID0gdmVjX3Blcm0oYmxvY2t2LCBwaXhlbHN2LCB2Y3BybShzMCxzMSwyLDMpKTsKKyAgICAgICB9CisKKyAgICAgICBibG9ja3YgPSB2ZWNfYXZnKGJsb2NrdiwgcGl4ZWxzdik7CisKKyAgICAgICB2ZWNfc3QoYmxvY2t2LCAwLCBibG9jayk7CisKKyAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgICAgIGJsb2NrICs9IGxpbmVfc2l6ZTsKKyAgIH0KK30KKworLyogbmV4dCBvbmUgYXNzdW1lcyB0aGF0ICgobGluZV9zaXplICUgOCkgPT0gMCkgKi8KK3N0YXRpYyB2b2lkIHB1dF9waXhlbHM4X3h5Ml9hbHRpdmVjKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeGVsc3YxLCBwaXhlbHN2MiwgcGl4ZWxzYXZnOworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIGJsb2NrdjsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgcGl4ZWxzc3VtMSwgcGl4ZWxzc3VtMiwgdGVtcDM7CisgICAgcmVnaXN0ZXIgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmN6ZXJvID0gKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19zcGxhdF91OCgwKTsKKyAgICByZWdpc3RlciBjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdmN0d28gPSAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19zcGxhdF91MTYoMik7CisKKyAgICBwaXhlbHN2MSA9IFZFQ19MRCgwLCBwaXhlbHMpOworICAgIHBpeGVsc3YyID0gVkVDX0xEKDEsIHBpeGVscyk7CisgICAgcGl4ZWxzdjEgPSBWRUNfTUVSR0VIKHZjemVybywgcGl4ZWxzdjEpOworICAgIHBpeGVsc3YyID0gVkVDX01FUkdFSCh2Y3plcm8sIHBpeGVsc3YyKTsKKworICAgIHBpeGVsc3N1bTEgPSB2ZWNfYWRkKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpcGl4ZWxzdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2Mik7CisgICAgcGl4ZWxzc3VtMSA9IHZlY19hZGQocGl4ZWxzc3VtMSwgdmN0d28pOworCisgICAgZm9yIChpID0gMDsgaSA8IGggOyBpKyspIHsKKyAgICAgICAgaW50IHJpZ2h0c2lkZSA9ICgodW5zaWduZWQgbG9uZylibG9jayAmIDB4MDAwMDAwMEYpOworICAgICAgICBibG9ja3YgPSB2ZWNfbGQoMCwgYmxvY2spOworCisgICAgICAgIHBpeGVsc3YxID0gdW5hbGlnbmVkX2xvYWQobGluZV9zaXplLCBwaXhlbHMpOworICAgICAgICBwaXhlbHN2MiA9IHVuYWxpZ25lZF9sb2FkKGxpbmVfc2l6ZSsxLCBwaXhlbHMpOworICAgICAgICBwaXhlbHN2MSA9IFZFQ19NRVJHRUgodmN6ZXJvLCBwaXhlbHN2MSk7CisgICAgICAgIHBpeGVsc3YyID0gVkVDX01FUkdFSCh2Y3plcm8sIHBpeGVsc3YyKTsKKyAgICAgICAgcGl4ZWxzc3VtMiA9IHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2Mik7CisgICAgICAgIHRlbXAzID0gdmVjX2FkZChwaXhlbHNzdW0xLCBwaXhlbHNzdW0yKTsKKyAgICAgICAgdGVtcDMgPSB2ZWNfc3JhKHRlbXAzLCB2Y3R3byk7CisgICAgICAgIHBpeGVsc3N1bTEgPSB2ZWNfYWRkKHBpeGVsc3N1bTIsIHZjdHdvKTsKKyAgICAgICAgcGl4ZWxzYXZnID0gdmVjX3BhY2tzdSh0ZW1wMywgKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkgdmN6ZXJvKTsKKworICAgICAgICBpZiAocmlnaHRzaWRlKSB7CisgICAgICAgICAgICBibG9ja3YgPSB2ZWNfcGVybShibG9ja3YsIHBpeGVsc2F2ZywgdmNwcm0oMCwgMSwgczAsIHMxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibG9ja3YgPSB2ZWNfcGVybShibG9ja3YsIHBpeGVsc2F2ZywgdmNwcm0oczAsIHMxLCAyLCAzKSk7CisgICAgICAgIH0KKworICAgICAgICB2ZWNfc3QoYmxvY2t2LCAwLCBibG9jayk7CisKKyAgICAgICAgYmxvY2sgKz0gbGluZV9zaXplOworICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgIH0KK30KKworLyogbmV4dCBvbmUgYXNzdW1lcyB0aGF0ICgobGluZV9zaXplICUgOCkgPT0gMCkgKi8KK3N0YXRpYyB2b2lkIHB1dF9ub19ybmRfcGl4ZWxzOF94eTJfYWx0aXZlYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXhlbHN2MSwgcGl4ZWxzdjIsIHBpeGVsc2F2ZzsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciBibG9ja3Y7CisgICAgcmVnaXN0ZXIgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHBpeGVsc3N1bTEsIHBpeGVsc3N1bTIsIHRlbXAzOworICAgIHJlZ2lzdGVyIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZjemVybyA9IChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfc3BsYXRfdTgoMCk7CisgICAgcmVnaXN0ZXIgY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZjb25lID0gKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2ZWNfc3BsYXRfdTE2KDEpOworICAgIHJlZ2lzdGVyIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2Y3R3byA9IChjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX3NwbGF0X3UxNigyKTsKKworICAgIHBpeGVsc3YxID0gVkVDX0xEKDAsIHBpeGVscyk7CisgICAgcGl4ZWxzdjIgPSBWRUNfTEQoMSwgcGl4ZWxzKTsKKyAgICBwaXhlbHN2MSA9IFZFQ19NRVJHRUgodmN6ZXJvLCBwaXhlbHN2MSk7CisgICAgcGl4ZWxzdjIgPSBWRUNfTUVSR0VIKHZjemVybywgcGl4ZWxzdjIpOworICAgIHBpeGVsc3N1bTEgPSB2ZWNfYWRkKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpcGl4ZWxzdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2Mik7CisgICAgcGl4ZWxzc3VtMSA9IHZlY19hZGQocGl4ZWxzc3VtMSwgdmNvbmUpOworCisgICAgZm9yIChpID0gMDsgaSA8IGggOyBpKyspIHsKKyAgICAgICAgaW50IHJpZ2h0c2lkZSA9ICgodW5zaWduZWQgbG9uZylibG9jayAmIDB4MDAwMDAwMEYpOworICAgICAgICBibG9ja3YgPSB2ZWNfbGQoMCwgYmxvY2spOworCisgICAgICAgIHBpeGVsc3YxID0gdW5hbGlnbmVkX2xvYWQobGluZV9zaXplLCBwaXhlbHMpOworICAgICAgICBwaXhlbHN2MiA9IHVuYWxpZ25lZF9sb2FkKGxpbmVfc2l6ZSsxLCBwaXhlbHMpOworICAgICAgICBwaXhlbHN2MSA9IFZFQ19NRVJHRUgodmN6ZXJvLCBwaXhlbHN2MSk7CisgICAgICAgIHBpeGVsc3YyID0gVkVDX01FUkdFSCh2Y3plcm8sIHBpeGVsc3YyKTsKKyAgICAgICAgcGl4ZWxzc3VtMiA9IHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2Mik7CisgICAgICAgIHRlbXAzID0gdmVjX2FkZChwaXhlbHNzdW0xLCBwaXhlbHNzdW0yKTsKKyAgICAgICAgdGVtcDMgPSB2ZWNfc3JhKHRlbXAzLCB2Y3R3byk7CisgICAgICAgIHBpeGVsc3N1bTEgPSB2ZWNfYWRkKHBpeGVsc3N1bTIsIHZjb25lKTsKKyAgICAgICAgcGl4ZWxzYXZnID0gdmVjX3BhY2tzdSh0ZW1wMywgKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkgdmN6ZXJvKTsKKworICAgICAgICBpZiAocmlnaHRzaWRlKSB7CisgICAgICAgICAgICBibG9ja3YgPSB2ZWNfcGVybShibG9ja3YsIHBpeGVsc2F2ZywgdmNwcm0oMCwgMSwgczAsIHMxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibG9ja3YgPSB2ZWNfcGVybShibG9ja3YsIHBpeGVsc2F2ZywgdmNwcm0oczAsIHMxLCAyLCAzKSk7CisgICAgICAgIH0KKworICAgICAgICB2ZWNfc3QoYmxvY2t2LCAwLCBibG9jayk7CisKKyAgICAgICAgYmxvY2sgKz0gbGluZV9zaXplOworICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgIH0KK30KKworLyogbmV4dCBvbmUgYXNzdW1lcyB0aGF0ICgobGluZV9zaXplICUgMTYpID09IDApICovCitzdGF0aWMgdm9pZCBwdXRfcGl4ZWxzMTZfeHkyX2FsdGl2ZWModWludDhfdCAqIGJsb2NrLCBjb25zdCB1aW50OF90ICogcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXhlbHN2MSwgcGl4ZWxzdjIsIHBpeGVsc3YzLCBwaXhlbHN2NDsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciBibG9ja3Y7CisgICAgcmVnaXN0ZXIgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHRlbXAzLCB0ZW1wNCwKKyAgICAgICAgcGl4ZWxzc3VtMSwgcGl4ZWxzc3VtMiwgcGl4ZWxzc3VtMywgcGl4ZWxzc3VtNDsKKyAgICByZWdpc3RlciBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2Y3plcm8gPSAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3NwbGF0X3U4KDApOworICAgIHJlZ2lzdGVyIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2Y3R3byA9IChjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX3NwbGF0X3UxNigyKTsKKworICAgIHBpeGVsc3YxID0gVkVDX0xEKDAsIHBpeGVscyk7CisgICAgcGl4ZWxzdjIgPSBWRUNfTEQoMSwgcGl4ZWxzKTsKKyAgICBwaXhlbHN2MyA9IFZFQ19NRVJHRUwodmN6ZXJvLCBwaXhlbHN2MSk7CisgICAgcGl4ZWxzdjQgPSBWRUNfTUVSR0VMKHZjemVybywgcGl4ZWxzdjIpOworICAgIHBpeGVsc3YxID0gVkVDX01FUkdFSCh2Y3plcm8sIHBpeGVsc3YxKTsKKyAgICBwaXhlbHN2MiA9IFZFQ19NRVJHRUgodmN6ZXJvLCBwaXhlbHN2Mik7CisgICAgcGl4ZWxzc3VtMyA9IHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXBpeGVsc3Y0KTsKKyAgICBwaXhlbHNzdW0zID0gdmVjX2FkZChwaXhlbHNzdW0zLCB2Y3R3byk7CisgICAgcGl4ZWxzc3VtMSA9IHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXBpeGVsc3YyKTsKKyAgICBwaXhlbHNzdW0xID0gdmVjX2FkZChwaXhlbHNzdW0xLCB2Y3R3byk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaCA7IGkrKykgeworICAgICAgICBibG9ja3YgPSB2ZWNfbGQoMCwgYmxvY2spOworCisgICAgICAgIHBpeGVsc3YxID0gdW5hbGlnbmVkX2xvYWQobGluZV9zaXplLCBwaXhlbHMpOworICAgICAgICBwaXhlbHN2MiA9IHVuYWxpZ25lZF9sb2FkKGxpbmVfc2l6ZSsxLCBwaXhlbHMpOworCisgICAgICAgIHBpeGVsc3YzID0gVkVDX01FUkdFTCh2Y3plcm8sIHBpeGVsc3YxKTsKKyAgICAgICAgcGl4ZWxzdjQgPSBWRUNfTUVSR0VMKHZjemVybywgcGl4ZWxzdjIpOworICAgICAgICBwaXhlbHN2MSA9IFZFQ19NRVJHRUgodmN6ZXJvLCBwaXhlbHN2MSk7CisgICAgICAgIHBpeGVsc3YyID0gVkVDX01FUkdFSCh2Y3plcm8sIHBpeGVsc3YyKTsKKyAgICAgICAgcGl4ZWxzc3VtNCA9IHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2NCk7CisgICAgICAgIHBpeGVsc3N1bTIgPSB2ZWNfYWRkKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpcGl4ZWxzdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpcGl4ZWxzdjIpOworICAgICAgICB0ZW1wNCA9IHZlY19hZGQocGl4ZWxzc3VtMywgcGl4ZWxzc3VtNCk7CisgICAgICAgIHRlbXA0ID0gdmVjX3NyYSh0ZW1wNCwgdmN0d28pOworICAgICAgICB0ZW1wMyA9IHZlY19hZGQocGl4ZWxzc3VtMSwgcGl4ZWxzc3VtMik7CisgICAgICAgIHRlbXAzID0gdmVjX3NyYSh0ZW1wMywgdmN0d28pOworCisgICAgICAgIHBpeGVsc3N1bTMgPSB2ZWNfYWRkKHBpeGVsc3N1bTQsIHZjdHdvKTsKKyAgICAgICAgcGl4ZWxzc3VtMSA9IHZlY19hZGQocGl4ZWxzc3VtMiwgdmN0d28pOworCisgICAgICAgIGJsb2NrdiA9IHZlY19wYWNrc3UodGVtcDMsIHRlbXA0KTsKKworICAgICAgICB2ZWNfc3QoYmxvY2t2LCAwLCBibG9jayk7CisKKyAgICAgICAgYmxvY2sgKz0gbGluZV9zaXplOworICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgIH0KK30KKworLyogbmV4dCBvbmUgYXNzdW1lcyB0aGF0ICgobGluZV9zaXplICUgMTYpID09IDApICovCitzdGF0aWMgdm9pZCBwdXRfbm9fcm5kX3BpeGVsczE2X3h5Ml9hbHRpdmVjKHVpbnQ4X3QgKiBibG9jaywgY29uc3QgdWludDhfdCAqIHBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgcmVnaXN0ZXIgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGl4ZWxzdjEsIHBpeGVsc3YyLCBwaXhlbHN2MywgcGl4ZWxzdjQ7CisgICAgcmVnaXN0ZXIgdmVjdG9yIHVuc2lnbmVkIGNoYXIgYmxvY2t2OworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB0ZW1wMywgdGVtcDQsCisgICAgICAgIHBpeGVsc3N1bTEsIHBpeGVsc3N1bTIsIHBpeGVsc3N1bTMsIHBpeGVsc3N1bTQ7CisgICAgcmVnaXN0ZXIgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmN6ZXJvID0gKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19zcGxhdF91OCgwKTsKKyAgICByZWdpc3RlciBjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdmNvbmUgPSAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19zcGxhdF91MTYoMSk7CisgICAgcmVnaXN0ZXIgY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZjdHdvID0gKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2ZWNfc3BsYXRfdTE2KDIpOworCisgICAgcGl4ZWxzdjEgPSBWRUNfTEQoMCwgcGl4ZWxzKTsKKyAgICBwaXhlbHN2MiA9IFZFQ19MRCgxLCBwaXhlbHMpOworICAgIHBpeGVsc3YzID0gVkVDX01FUkdFTCh2Y3plcm8sIHBpeGVsc3YxKTsKKyAgICBwaXhlbHN2NCA9IFZFQ19NRVJHRUwodmN6ZXJvLCBwaXhlbHN2Mik7CisgICAgcGl4ZWxzdjEgPSBWRUNfTUVSR0VIKHZjemVybywgcGl4ZWxzdjEpOworICAgIHBpeGVsc3YyID0gVkVDX01FUkdFSCh2Y3plcm8sIHBpeGVsc3YyKTsKKyAgICBwaXhlbHNzdW0zID0gdmVjX2FkZCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KXBpeGVsc3YzLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpcGl4ZWxzdjQpOworICAgIHBpeGVsc3N1bTMgPSB2ZWNfYWRkKHBpeGVsc3N1bTMsIHZjb25lKTsKKyAgICBwaXhlbHNzdW0xID0gdmVjX2FkZCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KXBpeGVsc3YxLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpcGl4ZWxzdjIpOworICAgIHBpeGVsc3N1bTEgPSB2ZWNfYWRkKHBpeGVsc3N1bTEsIHZjb25lKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoIDsgaSsrKSB7CisgICAgICAgIHBpeGVsc3YxID0gdW5hbGlnbmVkX2xvYWQobGluZV9zaXplLCBwaXhlbHMpOworICAgICAgICBwaXhlbHN2MiA9IHVuYWxpZ25lZF9sb2FkKGxpbmVfc2l6ZSsxLCBwaXhlbHMpOworCisgICAgICAgIHBpeGVsc3YzID0gVkVDX01FUkdFTCh2Y3plcm8sIHBpeGVsc3YxKTsKKyAgICAgICAgcGl4ZWxzdjQgPSBWRUNfTUVSR0VMKHZjemVybywgcGl4ZWxzdjIpOworICAgICAgICBwaXhlbHN2MSA9IFZFQ19NRVJHRUgodmN6ZXJvLCBwaXhlbHN2MSk7CisgICAgICAgIHBpeGVsc3YyID0gVkVDX01FUkdFSCh2Y3plcm8sIHBpeGVsc3YyKTsKKyAgICAgICAgcGl4ZWxzc3VtNCA9IHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2NCk7CisgICAgICAgIHBpeGVsc3N1bTIgPSB2ZWNfYWRkKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpcGl4ZWxzdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpcGl4ZWxzdjIpOworICAgICAgICB0ZW1wNCA9IHZlY19hZGQocGl4ZWxzc3VtMywgcGl4ZWxzc3VtNCk7CisgICAgICAgIHRlbXA0ID0gdmVjX3NyYSh0ZW1wNCwgdmN0d28pOworICAgICAgICB0ZW1wMyA9IHZlY19hZGQocGl4ZWxzc3VtMSwgcGl4ZWxzc3VtMik7CisgICAgICAgIHRlbXAzID0gdmVjX3NyYSh0ZW1wMywgdmN0d28pOworCisgICAgICAgIHBpeGVsc3N1bTMgPSB2ZWNfYWRkKHBpeGVsc3N1bTQsIHZjb25lKTsKKyAgICAgICAgcGl4ZWxzc3VtMSA9IHZlY19hZGQocGl4ZWxzc3VtMiwgdmNvbmUpOworCisgICAgICAgIGJsb2NrdiA9IHZlY19wYWNrc3UodGVtcDMsIHRlbXA0KTsKKworICAgICAgICBWRUNfU1QoYmxvY2t2LCAwLCBibG9jayk7CisKKyAgICAgICAgYmxvY2sgKz0gbGluZV9zaXplOworICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgIH0KK30KKworLyogbmV4dCBvbmUgYXNzdW1lcyB0aGF0ICgobGluZV9zaXplICUgOCkgPT0gMCkgKi8KK3N0YXRpYyB2b2lkIGF2Z19waXhlbHM4X3h5Ml9hbHRpdmVjKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeGVsc3YxLCBwaXhlbHN2MiwgcGl4ZWxzYXZnOworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIGJsb2NrdiwgYmxvY2t0ZW1wOworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBwaXhlbHNzdW0xLCBwaXhlbHNzdW0yLCB0ZW1wMzsKKworICAgIHJlZ2lzdGVyIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZjemVybyA9IChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNfc3BsYXRfdTgoMCk7CisgICAgcmVnaXN0ZXIgY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZjdHdvID0gKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNfc3BsYXRfdTE2KDIpOworCisgICAgcGl4ZWxzdjEgPSBWRUNfTEQoMCwgcGl4ZWxzKTsKKyAgICBwaXhlbHN2MiA9IFZFQ19MRCgxLCBwaXhlbHMpOworICAgIHBpeGVsc3YxID0gVkVDX01FUkdFSCh2Y3plcm8sIHBpeGVsc3YxKTsKKyAgICBwaXhlbHN2MiA9IFZFQ19NRVJHRUgodmN6ZXJvLCBwaXhlbHN2Mik7CisgICAgcGl4ZWxzc3VtMSA9IHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClwaXhlbHN2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXBpeGVsc3YyKTsKKyAgICBwaXhlbHNzdW0xID0gdmVjX2FkZChwaXhlbHNzdW0xLCB2Y3R3byk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaCA7IGkrKykgeworICAgICAgICBpbnQgcmlnaHRzaWRlID0gKCh1bnNpZ25lZCBsb25nKWJsb2NrICYgMHgwMDAwMDAwRik7CisgICAgICAgIGJsb2NrdiA9IHZlY19sZCgwLCBibG9jayk7CisKKyAgICAgICAgcGl4ZWxzdjEgPSB1bmFsaWduZWRfbG9hZChsaW5lX3NpemUsIHBpeGVscyk7CisgICAgICAgIHBpeGVsc3YyID0gdW5hbGlnbmVkX2xvYWQobGluZV9zaXplKzEsIHBpeGVscyk7CisKKyAgICAgICAgcGl4ZWxzdjEgPSBWRUNfTUVSR0VIKHZjemVybywgcGl4ZWxzdjEpOworICAgICAgICBwaXhlbHN2MiA9IFZFQ19NRVJHRUgodmN6ZXJvLCBwaXhlbHN2Mik7CisgICAgICAgIHBpeGVsc3N1bTIgPSB2ZWNfYWRkKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpcGl4ZWxzdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpcGl4ZWxzdjIpOworICAgICAgICB0ZW1wMyA9IHZlY19hZGQocGl4ZWxzc3VtMSwgcGl4ZWxzc3VtMik7CisgICAgICAgIHRlbXAzID0gdmVjX3NyYSh0ZW1wMywgdmN0d28pOworICAgICAgICBwaXhlbHNzdW0xID0gdmVjX2FkZChwaXhlbHNzdW0yLCB2Y3R3byk7CisgICAgICAgIHBpeGVsc2F2ZyA9IHZlY19wYWNrc3UodGVtcDMsICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpIHZjemVybyk7CisKKyAgICAgICAgaWYgKHJpZ2h0c2lkZSkgeworICAgICAgICAgICAgYmxvY2t0ZW1wID0gdmVjX3Blcm0oYmxvY2t2LCBwaXhlbHNhdmcsIHZjcHJtKDAsIDEsIHMwLCBzMSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmxvY2t0ZW1wID0gdmVjX3Blcm0oYmxvY2t2LCBwaXhlbHNhdmcsIHZjcHJtKHMwLCBzMSwgMiwgMykpOworICAgICAgICB9CisKKyAgICAgICAgYmxvY2t2ID0gdmVjX2F2ZyhibG9ja3RlbXAsIGJsb2Nrdik7CisgICAgICAgIHZlY19zdChibG9ja3YsIDAsIGJsb2NrKTsKKworICAgICAgICBibG9jayArPSBsaW5lX3NpemU7CisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7CisgICAgfQorfQorI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworCithdl9jb2xkIHZvaWQgZmZfaHBlbGRzcF9pbml0X3BwYyhIcGVsRFNQQ29udGV4dCAqYywgaW50IGZsYWdzKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMF0gICAgICAgID0gZmZfYXZnX3BpeGVsczE2X2FsdGl2ZWM7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMF0gICAgICAgID0gYXZnX3BpeGVsczhfYWx0aXZlYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVszXSAgICAgICAgPSBhdmdfcGl4ZWxzOF94eTJfYWx0aXZlYzsKKworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzBdICAgICAgICA9IGZmX3B1dF9waXhlbHMxNl9hbHRpdmVjOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzNdICAgICAgICA9IHB1dF9waXhlbHM4X3h5Ml9hbHRpdmVjOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzNdICAgICAgICA9IHB1dF9waXhlbHMxNl94eTJfYWx0aXZlYzsKKworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlswXVswXSA9IGZmX3B1dF9waXhlbHMxNl9hbHRpdmVjOworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVszXSA9IHB1dF9ub19ybmRfcGl4ZWxzOF94eTJfYWx0aXZlYzsKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMF1bM10gPSBwdXRfbm9fcm5kX3BpeGVsczE2X3h5Ml9hbHRpdmVjOworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2hwZWxkc3BfYWx0aXZlYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2hwZWxkc3BfYWx0aXZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDgwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvaHBlbGRzcF9hbHRpdmVjLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBCcmlhbiBGb2xleQorICogQ29weXJpZ2h0IChjKSAyMDAyIERpZXRlciBTaGlybGV5CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBSb21haW4gRG9sYmVhdSA8cm9tYWluQGRvbGJlYXUub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUFBDX0hQRUxEU1BfQUxUSVZFQ19ICisjZGVmaW5lIEFWQ09ERUNfUFBDX0hQRUxEU1BfQUxUSVZFQ19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfYWx0aXZlYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHMxNl9hbHRpdmVjKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUFBDX0hQRUxEU1BfQUxUSVZFQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcGMvaHVmZnl1dmRzcF9hbHRpdmVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvaHVmZnl1dmRzcF9hbHRpdmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwMTUyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9odWZmeXV2ZHNwX2FsdGl2ZWMuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEJyaWFuIEZvbGV5CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGlldGVyIFNoaXJsZXkKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IFJvbWFpbiBEb2xiZWF1IDxyb21haW5AZG9sYmVhdS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBIQVZFX0FMVElWRUNfSAorI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaHVmZnl1dmRzcC5oIgorCisjaWYgSEFWRV9BTFRJVkVDCitzdGF0aWMgdm9pZCBhZGRfYnl0ZXNfYWx0aXZlYyh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50cHRyX3QgdykKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZHN0LCB2c3JjOworCisgICAgLyogZHN0IGFuZCBzcmMgYXJlIDE2IGJ5dGVzLWFsaWduZWQgKGd1YXJhbnRlZWQpLiAqLworICAgIGZvciAoaSA9IDA7IGkgKyAxNSA8IHc7IGkgKz0gMTYpIHsKKyAgICAgICAgdmRzdCA9IHZlY19sZChpLCAodW5zaWduZWQgY2hhciAqKSBkc3QpOworICAgICAgICB2c3JjID0gdmVjX2xkKGksICh1bnNpZ25lZCBjaGFyICopIHNyYyk7CisgICAgICAgIHZkc3QgPSB2ZWNfYWRkKHZzcmMsIHZkc3QpOworICAgICAgICB2ZWNfc3QodmRzdCwgaSwgKHVuc2lnbmVkIGNoYXIgKikgZHN0KTsKKyAgICB9CisgICAgLyogSWYgdyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gKi8KKyAgICBmb3IgKDsgaSA8IHc7IGkrKykKKyAgICAgICAgZHN0W2ldID0gc3JjW2ldOworfQorI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworCithdl9jb2xkIHZvaWQgZmZfaHVmZnl1dmRzcF9pbml0X3BwYyhIdWZmWVVWRFNQQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFX0FMVElWRUMKKyAgICBpZiAoIVBQQ19BTFRJVkVDKGF2X2dldF9jcHVfZmxhZ3MoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGMtPmFkZF9ieXRlcyA9IGFkZF9ieXRlc19hbHRpdmVjOworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL2lkY3Rkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9pZGN0ZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmNTE0YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9pZGN0ZHNwLmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWljaGVsIExlc3BpbmFzc2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyogTk9URTogVGhpcyBjb2RlIGlzIGJhc2VkIG9uIEdQTCBjb2RlIGZyb20gdGhlIGxpYm1wZWcyIHByb2plY3QuICBUaGUKKyAqIGF1dGhvciwgTWljaGVsIExlc3BpbmFzc2VzLCBoYXMgZ2l2ZW4gZXhwbGljaXQgcGVybWlzc2lvbiB0byByZWxlYXNlCisgKiB1bmRlciBMR1BMIGFzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpbnRlZ3JhdGlvbiBieSBEaWV0ZXIgU2hpcmxleQorICoKKyAqIFRoaXMgZmlsZSBpcyBhIGRpcmVjdCBjb3B5IG9mIHRoZSBBbHRpVmVjIElEQ1QgbW9kdWxlIGZyb20gdGhlIGxpYm1wZWcyCisgKiBwcm9qZWN0LiAgSSd2ZSBkZWxldGVkIGFsbCBvZiB0aGUgbGlibXBlZzItc3BlY2lmaWMgY29kZSwgcmVuYW1lZCB0aGUKKyAqIGZ1bmN0aW9ucyBhbmQgcmVvcmRlcmVkIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgVGhlIG9ubHkgY2hhbmdlIHRvIHRoZQorICogSURDVCBmdW5jdGlvbiBpdHNlbGYgd2FzIHRvIGZhY3RvciBvdXQgdGhlIHBhcnRpYWwgdHJhbnNwb3NpdGlvbiwgYW5kIHRvCisgKiBwZXJmb3JtIGEgZnVsbCB0cmFuc3Bvc2UgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBIQVZFX0FMVElWRUNfSAorI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2lkY3Rkc3AuaCIKKworI2lmIEhBVkVfQUxUSVZFQworCisjZGVmaW5lIElEQ1RfSEFMRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiAxc3Qgc3RhZ2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQxID0gdmVjX21yYWRkcyhhMSwgdng3LCB2eDEpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdDggPSB2ZWNfbXJhZGRzKGExLCB2eDEsIHZlY19zdWJzKHplcm8sIHZ4NykpOyAgICAgIFwKKyAgICB0NyA9IHZlY19tcmFkZHMoYTIsIHZ4NSwgdngzKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQzID0gdmVjX21yYWRkcyhtYTIsIHZ4Mywgdng1KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiAybmQgc3RhZ2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQ1ID0gdmVjX2FkZHModngwLCB2eDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdDAgPSB2ZWNfc3Vicyh2eDAsIHZ4NCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0MiA9IHZlY19tcmFkZHMoYTAsIHZ4NiwgdngyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQ0ID0gdmVjX21yYWRkcyhhMCwgdngyLCB2ZWNfc3Vicyh6ZXJvLCB2eDYpKTsgICAgICBcCisgICAgdDYgPSB2ZWNfYWRkcyh0OCwgdDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0MyA9IHZlY19zdWJzKHQ4LCB0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQ4ID0gdmVjX3N1YnModDEsIHQ3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdDEgPSB2ZWNfYWRkcyh0MSwgdDcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIDNyZCBzdGFnZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdDcgPSB2ZWNfYWRkcyh0NSwgdDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0MiA9IHZlY19zdWJzKHQ1LCB0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQ1ID0gdmVjX2FkZHModDAsIHQ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdDAgPSB2ZWNfc3Vicyh0MCwgdDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0NCA9IHZlY19zdWJzKHQ4LCB0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQzID0gdmVjX2FkZHModDgsIHQzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiA0dGggc3RhZ2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZ5MCA9IHZlY19hZGRzKHQ3LCB0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnk3ID0gdmVjX3N1YnModDcsIHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eTEgPSB2ZWNfbXJhZGRzKGM0LCB0MywgdDUpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZ5NiA9IHZlY19tcmFkZHMobWM0LCB0MywgdDUpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnkyID0gdmVjX21yYWRkcyhjNCwgdDQsIHQwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eTUgPSB2ZWNfbXJhZGRzKG1jNCwgdDQsIHQwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZ5MyA9IHZlY19hZGRzKHQyLCB0Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnk0ID0gdmVjX3N1YnModDIsIHQ2KQorCisjZGVmaW5lIElEQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY19zMTYgdnkwLCB2eTEsIHZ5MiwgdnkzLCB2eTQsIHZ5NSwgdnk2LCB2eTc7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfczE2IHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY19zMTYgYzQgICA9IHZlY19zcGxhdChjb25zdGFudHNbMF0sIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfczE2IGEwICAgPSB2ZWNfc3BsYXQoY29uc3RhbnRzWzBdLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjX3MxNiBhMSAgID0gdmVjX3NwbGF0KGNvbnN0YW50c1swXSwgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY19zMTYgYTIgICA9IHZlY19zcGxhdChjb25zdGFudHNbMF0sIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfczE2IG1jNCAgPSB2ZWNfc3BsYXQoY29uc3RhbnRzWzBdLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjX3MxNiBtYTIgID0gdmVjX3NwbGF0KGNvbnN0YW50c1swXSwgNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY19zMTYgYmlhcyA9ICh2ZWNfczE2KSB2ZWNfc3BsYXQoKHZlY19zMzIpIGNvbnN0YW50c1swXSwgMyk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjX3MxNiB6ZXJvICA9IHZlY19zcGxhdF9zMTYoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY191MTYgc2hpZnQgPSB2ZWNfc3BsYXRfdTE2KDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjX3MxNiB2eDAgPSB2ZWNfbXJhZGRzKHZlY19zbChibG9ja1swXSwgc2hpZnQpLCBjb25zdGFudHNbMV0sIHplcm8pOyAgXAorICAgIHZlY19zMTYgdngxID0gdmVjX21yYWRkcyh2ZWNfc2woYmxvY2tbMV0sIHNoaWZ0KSwgY29uc3RhbnRzWzJdLCB6ZXJvKTsgIFwKKyAgICB2ZWNfczE2IHZ4MiA9IHZlY19tcmFkZHModmVjX3NsKGJsb2NrWzJdLCBzaGlmdCksIGNvbnN0YW50c1szXSwgemVybyk7ICBcCisgICAgdmVjX3MxNiB2eDMgPSB2ZWNfbXJhZGRzKHZlY19zbChibG9ja1szXSwgc2hpZnQpLCBjb25zdGFudHNbNF0sIHplcm8pOyAgXAorICAgIHZlY19zMTYgdng0ID0gdmVjX21yYWRkcyh2ZWNfc2woYmxvY2tbNF0sIHNoaWZ0KSwgY29uc3RhbnRzWzFdLCB6ZXJvKTsgIFwKKyAgICB2ZWNfczE2IHZ4NSA9IHZlY19tcmFkZHModmVjX3NsKGJsb2NrWzVdLCBzaGlmdCksIGNvbnN0YW50c1s0XSwgemVybyk7ICBcCisgICAgdmVjX3MxNiB2eDYgPSB2ZWNfbXJhZGRzKHZlY19zbChibG9ja1s2XSwgc2hpZnQpLCBjb25zdGFudHNbM10sIHplcm8pOyAgXAorICAgIHZlY19zMTYgdng3ID0gdmVjX21yYWRkcyh2ZWNfc2woYmxvY2tbN10sIHNoaWZ0KSwgY29uc3RhbnRzWzJdLCB6ZXJvKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSURDVF9IQUxGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eDAgPSB2ZWNfbWVyZ2VoKHZ5MCwgdnk0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdngxID0gdmVjX21lcmdlbCh2eTAsIHZ5NCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZ4MiA9IHZlY19tZXJnZWgodnkxLCB2eTUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eDMgPSB2ZWNfbWVyZ2VsKHZ5MSwgdnk1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdng0ID0gdmVjX21lcmdlaCh2eTIsIHZ5Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZ4NSA9IHZlY19tZXJnZWwodnkyLCB2eTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eDYgPSB2ZWNfbWVyZ2VoKHZ5Mywgdnk3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdng3ID0gdmVjX21lcmdlbCh2eTMsIHZ5Nyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eTAgPSB2ZWNfbWVyZ2VoKHZ4MCwgdng0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnkxID0gdmVjX21lcmdlbCh2eDAsIHZ4NCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZ5MiA9IHZlY19tZXJnZWgodngxLCB2eDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eTMgPSB2ZWNfbWVyZ2VsKHZ4MSwgdng1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnk0ID0gdmVjX21lcmdlaCh2eDIsIHZ4Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZ5NSA9IHZlY19tZXJnZWwodngyLCB2eDYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eTYgPSB2ZWNfbWVyZ2VoKHZ4Mywgdng3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnk3ID0gdmVjX21lcmdlbCh2eDMsIHZ4Nyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eDAgPSB2ZWNfYWRkcyh2ZWNfbWVyZ2VoKHZ5MCwgdnk0KSwgYmlhcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdngxID0gdmVjX21lcmdlbCh2eTAsIHZ5NCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZ4MiA9IHZlY19tZXJnZWgodnkxLCB2eTUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eDMgPSB2ZWNfbWVyZ2VsKHZ5MSwgdnk1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdng0ID0gdmVjX21lcmdlaCh2eTIsIHZ5Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZ4NSA9IHZlY19tZXJnZWwodnkyLCB2eTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eDYgPSB2ZWNfbWVyZ2VoKHZ5Mywgdnk3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdng3ID0gdmVjX21lcmdlbCh2eTMsIHZ5Nyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJRENUX0hBTEY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNoaWZ0ID0gdmVjX3NwbGF0X3UxNig2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eDAgPSB2ZWNfc3JhKHZ5MCwgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdngxID0gdmVjX3NyYSh2eTEsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZ4MiA9IHZlY19zcmEodnkyLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eDMgPSB2ZWNfc3JhKHZ5Mywgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdng0ID0gdmVjX3NyYSh2eTQsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZ4NSA9IHZlY19zcmEodnk1LCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2eDYgPSB2ZWNfc3JhKHZ5Niwgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdng3ID0gdmVjX3NyYSh2eTcsIHNoaWZ0KQorCitzdGF0aWMgY29uc3QgdmVjX3MxNiBjb25zdGFudHNbNV0gPSB7CisgICAgeyAyMzE3MCwgMTM1NzMsICA2NTE4LCAyMTg5NSwgLTIzMTcwLCAtMjE4OTUsICAgIDMyLCAgICAzMSB9LAorICAgIHsgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsICAxNjM4NCwgIDE5MjY2LCAyMTQwNywgMjI3MjUgfSwKKyAgICB7IDIyNzI1LCAzMTUyMSwgMjk2OTIsIDI2NzIyLCAgMjI3MjUsICAyNjcyMiwgMjk2OTIsIDMxNTIxIH0sCisgICAgeyAyMTQwNywgMjk2OTIsIDI3OTY5LCAyNTE3MiwgIDIxNDA3LCAgMjUxNzIsIDI3OTY5LCAyOTY5MiB9LAorICAgIHsgMTkyNjYsIDI2NzIyLCAyNTE3MiwgMjI2NTQsICAxOTI2NiwgIDIyNjU0LCAyNTE3MiwgMjY3MjIgfQorfTsKKworc3RhdGljIHZvaWQgaWRjdF9hbHRpdmVjKGludDE2X3QgKmJsaykKK3sKKyAgICB2ZWNfczE2ICpibG9jayA9ICh2ZWNfczE2ICopIGJsazsKKworICAgIElEQ1Q7CisKKyAgICBibG9ja1swXSA9IHZ4MDsKKyAgICBibG9ja1sxXSA9IHZ4MTsKKyAgICBibG9ja1syXSA9IHZ4MjsKKyAgICBibG9ja1szXSA9IHZ4MzsKKyAgICBibG9ja1s0XSA9IHZ4NDsKKyAgICBibG9ja1s1XSA9IHZ4NTsKKyAgICBibG9ja1s2XSA9IHZ4NjsKKyAgICBibG9ja1s3XSA9IHZ4NzsKK30KKworc3RhdGljIHZvaWQgaWRjdF9wdXRfYWx0aXZlYyh1aW50OF90ICpkZXN0LCBpbnQgc3RyaWRlLCBpbnQxNl90ICpibGspCit7CisgICAgdmVjX3MxNiAqYmxvY2sgPSAodmVjX3MxNiAqKSBibGs7CisgICAgdmVjX3U4IHRtcDsKKworICAgIElEQ1Q7CisKKyNkZWZpbmUgQ09QWShkZXN0LCBzcmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAgPSB2ZWNfcGFja3N1KHNyYywgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfc3RlKCh2ZWNfdTMyKSB0bXAsIDAsICh1bnNpZ25lZCBpbnQgKikgZGVzdCk7ICAgICAgIFwKKyAgICB2ZWNfc3RlKCh2ZWNfdTMyKSB0bXAsIDQsICh1bnNpZ25lZCBpbnQgKikgZGVzdCkKKworICAgIENPUFkoZGVzdCwgdngwKTsKKyAgICBkZXN0ICs9IHN0cmlkZTsKKyAgICBDT1BZKGRlc3QsIHZ4MSk7CisgICAgZGVzdCArPSBzdHJpZGU7CisgICAgQ09QWShkZXN0LCB2eDIpOworICAgIGRlc3QgKz0gc3RyaWRlOworICAgIENPUFkoZGVzdCwgdngzKTsKKyAgICBkZXN0ICs9IHN0cmlkZTsKKyAgICBDT1BZKGRlc3QsIHZ4NCk7CisgICAgZGVzdCArPSBzdHJpZGU7CisgICAgQ09QWShkZXN0LCB2eDUpOworICAgIGRlc3QgKz0gc3RyaWRlOworICAgIENPUFkoZGVzdCwgdng2KTsKKyAgICBkZXN0ICs9IHN0cmlkZTsKKyAgICBDT1BZKGRlc3QsIHZ4Nyk7Cit9CisKK3N0YXRpYyB2b2lkIGlkY3RfYWRkX2FsdGl2ZWModWludDhfdCAqZGVzdCwgaW50IHN0cmlkZSwgaW50MTZfdCAqYmxrKQoreworICAgIHZlY19zMTYgKmJsb2NrID0gKHZlY19zMTYgKikgYmxrOworICAgIHZlY191OCB0bXA7CisgICAgdmVjX3MxNiB0bXAyLCB0bXAzOworICAgIHZlY191OCBwZXJtMDsKKyAgICB2ZWNfdTggcGVybTE7CisgICAgdmVjX3U4IHAwLCBwMSwgcDsKKworICAgIElEQ1Q7CisKKyAgICBwMCAgICA9IHZlY19sdnNsKDAsIGRlc3QpOworICAgIHAxICAgID0gdmVjX2x2c2woc3RyaWRlLCBkZXN0KTsKKyAgICBwICAgICA9IHZlY19zcGxhdF91OCgtMSk7CisgICAgcGVybTAgPSB2ZWNfbWVyZ2VoKHAsIHAwKTsKKyAgICBwZXJtMSA9IHZlY19tZXJnZWgocCwgcDEpOworCisjZGVmaW5lIEFERChkZXN0LCBzcmMsIHBlcm0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogKih1aW50NjRfdCAqKSAmdG1wID0gKih1aW50NjRfdCAqKSBkZXN0OyAqLyAgICAgICAgICBcCisgICAgdG1wICA9IHZlY19sZCgwLCBkZXN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wMiA9ICh2ZWNfczE2KSB2ZWNfcGVybSh0bXAsICh2ZWNfdTgpIHplcm8sIHBlcm0pOyAgICBcCisgICAgdG1wMyA9IHZlY19hZGRzKHRtcDIsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wICA9IHZlY19wYWNrc3UodG1wMywgdG1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjX3N0ZSgodmVjX3UzMikgdG1wLCAwLCAodW5zaWduZWQgaW50ICopIGRlc3QpOyAgICAgICBcCisgICAgdmVjX3N0ZSgodmVjX3UzMikgdG1wLCA0LCAodW5zaWduZWQgaW50ICopIGRlc3QpCisKKyAgICBBREQoZGVzdCwgdngwLCBwZXJtMCk7CisgICAgZGVzdCArPSBzdHJpZGU7CisgICAgQUREKGRlc3QsIHZ4MSwgcGVybTEpOworICAgIGRlc3QgKz0gc3RyaWRlOworICAgIEFERChkZXN0LCB2eDIsIHBlcm0wKTsKKyAgICBkZXN0ICs9IHN0cmlkZTsKKyAgICBBREQoZGVzdCwgdngzLCBwZXJtMSk7CisgICAgZGVzdCArPSBzdHJpZGU7CisgICAgQUREKGRlc3QsIHZ4NCwgcGVybTApOworICAgIGRlc3QgKz0gc3RyaWRlOworICAgIEFERChkZXN0LCB2eDUsIHBlcm0xKTsKKyAgICBkZXN0ICs9IHN0cmlkZTsKKyAgICBBREQoZGVzdCwgdng2LCBwZXJtMCk7CisgICAgZGVzdCArPSBzdHJpZGU7CisgICAgQUREKGRlc3QsIHZ4NywgcGVybTEpOworfQorCisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCisKK2F2X2NvbGQgdm9pZCBmZl9pZGN0ZHNwX2luaXRfcHBjKElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoaWdoX2JpdF9kZXB0aCkKK3sKKyNpZiBIQVZFX0FMVElWRUMKKyAgICBpZiAoIVBQQ19BTFRJVkVDKGF2X2dldF9jcHVfZmxhZ3MoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghaGlnaF9iaXRfZGVwdGggJiYgYXZjdHgtPmxvd3JlcyA9PSAwKSB7CisgICAgICAgIGlmICgoYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX0FVVE8gJiYgIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKSkgfHwKKyAgICAgICAgICAgIChhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfQUxUSVZFQykpIHsKKyAgICAgICAgICAgIGMtPmlkY3QgICAgICA9IGlkY3RfYWx0aXZlYzsKKyAgICAgICAgICAgIGMtPmlkY3RfYWRkICA9IGlkY3RfYWRkX2FsdGl2ZWM7CisgICAgICAgICAgICBjLT5pZGN0X3B1dCAgPSBpZGN0X3B1dF9hbHRpdmVjOworICAgICAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX1RSQU5TUE9TRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9sb3NzbGVzc19hdWRpb2RzcF9hbHRpdmVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvbG9zc2xlc3NfYXVkaW9kc3BfYWx0aXZlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWMyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvbG9zc2xlc3NfYXVkaW9kc3BfYWx0aXZlYy5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTHVjYSBCYXJiYXRvIDxsdV96ZXJvQGdlbnRvby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBIQVZFX0FMVElWRUNfSAorI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2xvc3NsZXNzX2F1ZGlvZHNwLmgiCisKKyNpZiBIQVZFX0JJR0VORElBTgorI2RlZmluZSBHRVRfVCh0dDAsdHQxLHNyYyxhLGIpeyAgICAgICBcCisgICAgICAgIGEgPSB2ZWNfbGQoMTYsIHNyYyk7ICAgICAgICAgIFwKKyAgICAgICAgdHQwID0gdmVjX3Blcm0oYiwgYSwgYWxpZ24pOyAgXAorICAgICAgICBiID0gdmVjX2xkKDMyLCBzcmMpOyAgICAgICAgICBcCisgICAgICAgIHR0MSA9IHZlY19wZXJtKGEsIGIsIGFsaWduKTsgIFwKKyB9CisjZWxzZQorI2RlZmluZSBHRVRfVCh0dDAsdHQxLHNyYyxhLGIpeyAgICAgICBcCisgICAgICAgIHR0MCA9IHZlY192c3hfbGQoMCwgc3JjKTsgICAgIFwKKyAgICAgICAgdHQxID0gdmVjX3ZzeF9sZCgxNiwgc3JjKTsgICAgXAorIH0KKyNlbmRpZgorCisjaWYgSEFWRV9BTFRJVkVDCitzdGF0aWMgaW50MzJfdCBzY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2X2FsdGl2ZWMoaW50MTZfdCAqdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yZGVyLCBpbnQgbXVsKQoreworICAgIExPQURfWkVSTzsKKyAgICB2ZWNfczE2ICpwdjEgPSAodmVjX3MxNiAqKSB2MTsKKyAgICByZWdpc3RlciB2ZWNfczE2IG11bHMgPSB7IG11bCwgbXVsLCBtdWwsIG11bCwgbXVsLCBtdWwsIG11bCwgbXVsIH07CisgICAgcmVnaXN0ZXIgdmVjX3MxNiB0MCwgdDEsIGkwLCBpMSwgaTQsIGkyLCBpMzsKKyAgICByZWdpc3RlciB2ZWNfczMyIHJlcyA9IHplcm9fczMydjsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIHJlZ2lzdGVyIHZlY191OCBhbGlnbiA9IHZlY19sdnNsKDAsIHYyKTsKKyAgICBpMiA9IHZlY19sZCgwLCB2Mik7CisgICAgaTMgPSB2ZWNfbGQoMCwgdjMpOworI2VuZGlmCisgICAgaW50MzJfdCBpcmVzOworCisgICAgb3JkZXIgPj49IDQ7CisgICAgZG8geworICAgICAgICBHRVRfVCh0MCx0MSx2MixpMSxpMik7CisgICAgICAgIGkwICAgICA9IHB2MVswXTsKKyAgICAgICAgaTEgICAgID0gcHYxWzFdOworICAgICAgICByZXMgICAgPSB2ZWNfbXN1bSh0MCwgaTAsIHJlcyk7CisgICAgICAgIHJlcyAgICA9IHZlY19tc3VtKHQxLCBpMSwgcmVzKTsKKyAgICAgICAgR0VUX1QodDAsdDEsdjMsaTQsaTMpOworICAgICAgICBwdjFbMF0gPSB2ZWNfbWxhZGQodDAsIG11bHMsIGkwKTsKKyAgICAgICAgcHYxWzFdID0gdmVjX21sYWRkKHQxLCBtdWxzLCBpMSk7CisgICAgICAgIHB2MSAgICs9IDI7CisgICAgICAgIHYyICAgICs9IDE2OworICAgICAgICB2MyAgICArPSAxNjsKKyAgICB9IHdoaWxlICgtLW9yZGVyKTsKKyAgICByZXMgPSB2ZWNfc3BsYXQodmVjX3N1bXMocmVzLCB6ZXJvX3MzMnYpLCAzKTsKKyAgICB2ZWNfc3RlKHJlcywgMCwgJmlyZXMpOworCisgICAgcmV0dXJuIGlyZXM7Cit9CisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCisKK2F2X2NvbGQgdm9pZCBmZl9sbGF1ZGRzcF9pbml0X3BwYyhMTEF1ZERTUENvbnRleHQgKmMpCit7CisjaWYgSEFWRV9BTFRJVkVDCisgICAgaWYgKCFQUENfQUxUSVZFQyhhdl9nZXRfY3B1X2ZsYWdzKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBjLT5zY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2ID0gc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNl9hbHRpdmVjOworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL21hdGhvcHMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9tYXRob3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkNzE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9tYXRob3BzLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIHNpbXBsZSBtYXRoIG9wZXJhdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PiBldCBhbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUFBDX01BVEhPUFNfSAorI2RlZmluZSBBVkNPREVDX1BQQ19NQVRIT1BTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworI2lmIEhBVkVfUFBDNFhYCisvKiBzaWduZWQgMTZ4MTYgLT4gMzIgbXVsdGlwbHkgYWRkIGFjY3VtdWxhdGUgKi8KKyNkZWZpbmUgTUFDMTYocnQsIHJhLCByYikgXAorICAgIF9fYXNtX18gKCJtYWNsaHcgJTAsICUyLCAlMyIgOiAiPXIiIChydCkgOiAiMCIgKHJ0KSwgInIiIChyYSksICJyIiAocmIpKTsKKworLyogc2lnbmVkIDE2eDE2IC0+IDMyIG11bHRpcGx5ICovCisjZGVmaW5lIE1VTDE2KHJhLCByYikgXAorICAgICh7IGludCBfX3J0OyBcCisgICAgX19hc21fXyAoIm11bGxodyAlMCwgJTEsICUyIiA6ICI9ciIgKF9fcnQpIDogInIiIChyYSksICJyIiAocmIpKTsgXAorICAgIF9fcnQ7IH0pCisjZW5kaWYKKworI2RlZmluZSBNVUxIIE1VTEgKK3N0YXRpYyBpbmxpbmUgYXZfY29uc3QgaW50IE1VTEgoaW50IGEsIGludCBiKXsKKyAgICBpbnQgcjsKKyAgICBfX2FzbV9fICgibXVsaHcgJTAsICUxLCAlMiIgOiAiPXIiKHIpIDogInIiKGEpLCAiciIoYikpOworICAgIHJldHVybiByOworfQorCisjaWYgIUFSQ0hfUFBDNjQKK3N0YXRpYyBpbmxpbmUgYXZfY29uc3QgaW50NjRfdCBNQUM2NChpbnQ2NF90IGQsIGludCBhLCBpbnQgYikKK3sKKyAgICB1bmlvbiB7IHVpbnQ2NF90IHg7IHVuc2lnbmVkIGhsWzJdOyB9IHggPSB7IGQgfTsKKyAgICBpbnQgaCwgbDsKKyAgICBfX2FzbV9fICgibXVsbHcgJTMsICU0LCAlNSAgIFxuXHQiCisgICAgICAgICAgICAgIm11bGh3ICUyLCAlNCwgJTUgICBcblx0IgorICAgICAgICAgICAgICJhZGRjICAlMSwgJTEsICUzICAgXG5cdCIKKyAgICAgICAgICAgICAiYWRkZSAgJTAsICUwLCAlMiAgIFxuXHQiCisgICAgICAgICAgICAgOiAiK3IiKHguaGxbMF0pLCAiK3IiKHguaGxbMV0pLCAiPSZyIihoKSwgIj0mciIobCkKKyAgICAgICAgICAgICA6ICJyIihhKSwgInIiKGIpKTsKKyAgICByZXR1cm4geC54OworfQorI2RlZmluZSBNQUM2NChkLCBhLCBiKSAoKGQpID0gTUFDNjQoZCwgYSwgYikpCisKK3N0YXRpYyBpbmxpbmUgYXZfY29uc3QgaW50NjRfdCBNTFM2NChpbnQ2NF90IGQsIGludCBhLCBpbnQgYikKK3sKKyAgICB1bmlvbiB7IHVpbnQ2NF90IHg7IHVuc2lnbmVkIGhsWzJdOyB9IHggPSB7IGQgfTsKKyAgICBpbnQgaCwgbDsKKyAgICBfX2FzbV9fICgibXVsbHcgJTMsICU0LCAlNSAgIFxuXHQiCisgICAgICAgICAgICAgIm11bGh3ICUyLCAlNCwgJTUgICBcblx0IgorICAgICAgICAgICAgICJzdWJmYyAlMSwgJTMsICUxICAgXG5cdCIKKyAgICAgICAgICAgICAic3ViZmUgJTAsICUyLCAlMCAgIFxuXHQiCisgICAgICAgICAgICAgOiAiK3IiKHguaGxbMF0pLCAiK3IiKHguaGxbMV0pLCAiPSZyIihoKSwgIj0mciIobCkKKyAgICAgICAgICAgICA6ICJyIihhKSwgInIiKGIpKTsKKyAgICByZXR1cm4geC54OworfQorI2RlZmluZSBNTFM2NChkLCBhLCBiKSAoKGQpID0gTUxTNjQoZCwgYSwgYikpCisjZW5kaWYKKworI2VuZGlmIC8qIEFWQ09ERUNfUFBDX01BVEhPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL21lX2NtcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL21lX2NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTdiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvbWVfY21wLmMKQEAgLTAsMCArMSw3NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgQnJpYW4gRm9sZXkKKyAqIENvcHlyaWdodCAoYykgMjAwMiBEaWV0ZXIgU2hpcmxleQorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgUm9tYWluIERvbGJlYXUgPHJvbWFpbkBkb2xiZWF1Lm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIEhBVkVfQUxUSVZFQ19ICisjaW5jbHVkZSA8YWx0aXZlYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW8uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21lX2NtcC5oIgorCisjaWYgSEFWRV9BTFRJVkVDCisKKyNpZiBIQVZFX0JJR0VORElBTgorI2RlZmluZSBHRVRfUEVSTShwZXIxLCBwZXIyLCBwaXgpIHtcCisgICAgcGVyMSA9IHZlY19sdnNsKDAsIHBpeCk7XAorICAgIHBlcjIgPSB2ZWNfYWRkKHBlcjEsIHZlY19zcGxhdF91OCgxKSk7XAorfQorI2RlZmluZSBMT0FEX1BJWCh2LCBpdiwgcGl4LCBwZXIxLCBwZXIyKSB7XAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeDJsICA9IHZlY19sZCgwLCAgcGl4KTtcCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGl4MnIgID0gdmVjX2xkKDE2LCBwaXgpO1wKKyAgICB2ICA9IHZlY19wZXJtKHBpeDJsLCBwaXgyciwgcGVyMSk7XAorICAgIGl2ID0gdmVjX3Blcm0ocGl4MmwsIHBpeDJyLCBwZXIyKTtcCit9CisjZWxzZQorI2RlZmluZSBHRVRfUEVSTShwZXIxLCBwZXIyLCBwaXgpIHt9CisjZGVmaW5lIExPQURfUElYKHYsIGl2LCBwaXgsIHBlcjEsIHBlcjIpIHtcCisgICAgdiAgPSB2ZWNfdnN4X2xkKDAsICBwaXgpO1wKKyAgICBpdiA9IHZlY192c3hfbGQoMSwgIHBpeCk7XAorfQorI2VuZGlmCitzdGF0aWMgaW50IHNhZDE2X3gyX2FsdGl2ZWMoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IGk7CisgICAgaW50IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgcyA9IDA7CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgemVybyA9CisgICAgICAgIChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhcikgdmVjX3NwbGF0X3U4KDApOworICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgc2FkID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZlY19zcGxhdF91MzIoMCk7CisgICAgdmVjdG9yIHNpZ25lZCBpbnQgc3VtZGlmZnM7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybTEsIHBlcm0yLCBwaXgydiwgcGl4Mml2OworCisgICAgR0VUX1BFUk0ocGVybTEsIHBlcm0yLCBwaXgyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIC8qIFJlYWQgdW5hbGlnbmVkIHBpeGVscyBpbnRvIG91ciB2ZWN0b3JzLiBUaGUgdmVjdG9ycyBhcmUgYXMgZm9sbG93czoKKyAgICAgICAgICogcGl4MXY6IHBpeDFbMF0gLSBwaXgxWzE1XQorICAgICAgICAgKiBwaXgydjogcGl4MlswXSAtIHBpeDJbMTVdICAgICAgcGl4Mml2OiBwaXgyWzFdIC0gcGl4MlsxNl0gKi8KKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGl4MXYgID0gdmVjX2xkKDAsICBwaXgxKTsKKyAgICAgICAgTE9BRF9QSVgocGl4MnYsIHBpeDJpdiwgcGl4MiwgcGVybTEsIHBlcm0yKTsKKworICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgdmVjdG9yLiAqLworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBhdmd2ID0gdmVjX2F2ZyhwaXgydiwgcGl4Mml2KTsKKworICAgICAgICAvKiBDYWxjdWxhdGUgYSBzdW0gb2YgYWJzIGRpZmZlcmVuY2VzIHZlY3Rvci4gKi8KKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdDUgPSB2ZWNfc3ViKHZlY19tYXgocGl4MXYsIGF2Z3YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjX21pbihwaXgxdiwgYXZndikpOworCisgICAgICAgIC8qIEFkZCBlYWNoIDQgcGl4ZWwgZ3JvdXAgdG9nZXRoZXIgYW5kIHB1dCA0IHJlc3VsdHMgaW50byBzYWQuICovCisgICAgICAgIHNhZCA9IHZlY19zdW00cyh0NSwgc2FkKTsKKworICAgICAgICBwaXgxICs9IHN0cmlkZTsKKyAgICAgICAgcGl4MiArPSBzdHJpZGU7CisgICAgfQorICAgIC8qIFN1bSB1cCB0aGUgZm91ciBwYXJ0aWFsIHN1bXMsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvIHMuICovCisgICAgc3VtZGlmZnMgPSB2ZWNfc3VtcygodmVjdG9yIHNpZ25lZCBpbnQpIHNhZCwgKHZlY3RvciBzaWduZWQgaW50KSB6ZXJvKTsKKyAgICBzdW1kaWZmcyA9IHZlY19zcGxhdChzdW1kaWZmcywgMyk7CisgICAgdmVjX3N0ZShzdW1kaWZmcywgMCwgJnMpOworCisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbnQgc2FkMTZfeTJfYWx0aXZlYyhNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgcyA9IDA7CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgemVybyA9CisgICAgICAgIChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhcikgdmVjX3NwbGF0X3U4KDApOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeDF2LCBwaXgzdiwgYXZndiwgdDU7CisgICAgdmVjdG9yIHVuc2lnbmVkIGludCBzYWQgPSAodmVjdG9yIHVuc2lnbmVkIGludCkgdmVjX3NwbGF0X3UzMigwKTsKKyAgICB2ZWN0b3Igc2lnbmVkIGludCBzdW1kaWZmczsKKworICAgIHVpbnQ4X3QgKnBpeDMgPSBwaXgyICsgc3RyaWRlOworCisgICAgLyogRHVlIHRvIHRoZSBmYWN0IHRoYXQgcGl4MyA9IHBpeDIgKyBzdHJpZGUsIHRoZSBwaXgzIG9mIG9uZQorICAgICAqIGl0ZXJhdGlvbiBiZWNvbWVzIHBpeDIgaW4gdGhlIG5leHQgaXRlcmF0aW9uLiBXZSBjYW4gdXNlIHRoaXMKKyAgICAgKiBmYWN0IHRvIGF2b2lkIGEgcG90ZW50aWFsbHkgZXhwZW5zaXZlIHVuYWxpZ25lZCByZWFkLCBlYWNoCisgICAgICogdGltZSBhcm91bmQgdGhlIGxvb3AuCisgICAgICogUmVhZCB1bmFsaWduZWQgcGl4ZWxzIGludG8gb3VyIHZlY3RvcnMuIFRoZSB2ZWN0b3JzIGFyZSBhcyBmb2xsb3dzOgorICAgICAqIHBpeDJ2OiBwaXgyWzBdIC0gcGl4MlsxNV0KKyAgICAgKiBTcGxpdCB0aGUgcGl4ZWwgdmVjdG9ycyBpbnRvIHNob3J0cy4gKi8KKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXgydiA9IFZFQ19MRCgwLCBwaXgyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgLyogUmVhZCB1bmFsaWduZWQgcGl4ZWxzIGludG8gb3VyIHZlY3RvcnMuIFRoZSB2ZWN0b3JzIGFyZSBhcyBmb2xsb3dzOgorICAgICAgICAgKiBwaXgxdjogcGl4MVswXSAtIHBpeDFbMTVdCisgICAgICAgICAqIHBpeDN2OiBwaXgzWzBdIC0gcGl4M1sxNV0gKi8KKyAgICAgICAgcGl4MXYgPSB2ZWNfbGQoMCwgIHBpeDEpOworICAgICAgICBwaXgzdiA9IFZFQ19MRCgwLCAgcGl4Myk7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIHZlY3Rvci4gKi8KKyAgICAgICAgYXZndiA9IHZlY19hdmcocGl4MnYsIHBpeDN2KTsKKworICAgICAgICAvKiBDYWxjdWxhdGUgYSBzdW0gb2YgYWJzIGRpZmZlcmVuY2VzIHZlY3Rvci4gKi8KKyAgICAgICAgdDUgPSB2ZWNfc3ViKHZlY19tYXgocGl4MXYsIGF2Z3YpLCB2ZWNfbWluKHBpeDF2LCBhdmd2KSk7CisKKyAgICAgICAgLyogQWRkIGVhY2ggNCBwaXhlbCBncm91cCB0b2dldGhlciBhbmQgcHV0IDQgcmVzdWx0cyBpbnRvIHNhZC4gKi8KKyAgICAgICAgc2FkID0gdmVjX3N1bTRzKHQ1LCBzYWQpOworCisgICAgICAgIHBpeDEgKz0gc3RyaWRlOworICAgICAgICBwaXgydiA9IHBpeDN2OworICAgICAgICBwaXgzICs9IHN0cmlkZTsKKyAgICB9CisKKyAgICAvKiBTdW0gdXAgdGhlIGZvdXIgcGFydGlhbCBzdW1zLCBhbmQgcHV0IHRoZSByZXN1bHQgaW50byBzLiAqLworICAgIHN1bWRpZmZzID0gdmVjX3N1bXMoKHZlY3RvciBzaWduZWQgaW50KSBzYWQsICh2ZWN0b3Igc2lnbmVkIGludCkgemVybyk7CisgICAgc3VtZGlmZnMgPSB2ZWNfc3BsYXQoc3VtZGlmZnMsIDMpOworICAgIHZlY19zdGUoc3VtZGlmZnMsIDAsICZzKTsKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIGludCBzYWQxNl94eTJfYWx0aXZlYyhNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IGk7CisgICAgaW50ICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpIHMgPSAwOworICAgIHVpbnQ4X3QgKnBpeDMgPSBwaXgyICsgc3RyaWRlOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHplcm8gPQorICAgICAgICAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIpIHZlY19zcGxhdF91OCgwKTsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdHdvID0KKyAgICAgICAgKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCkgdmVjX3NwbGF0X3UxNigyKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBhdmd2LCB0NTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXgxdiwgcGl4M3YsIHBpeDNpdjsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgcGl4M2x2LCBwaXgzaHYsIHBpeDNpbHYsIHBpeDNpaHY7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IGF2Z2h2LCBhdmdsdjsKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHNhZCA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KSB2ZWNfc3BsYXRfdTMyKDApOworICAgIHZlY3RvciBzaWduZWQgaW50IHN1bWRpZmZzOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm0xLCBwZXJtMiwgcGl4MnYsIHBpeDJpdjsKKyAgICBHRVRfUEVSTShwZXJtMSwgcGVybTIsIHBpeDIpOworCisgICAgLyogRHVlIHRvIHRoZSBmYWN0IHRoYXQgcGl4MyA9IHBpeDIgKyBzdHJpZGUsIHRoZSBwaXgzIG9mIG9uZQorICAgICAqIGl0ZXJhdGlvbiBiZWNvbWVzIHBpeDIgaW4gdGhlIG5leHQgaXRlcmF0aW9uLiBXZSBjYW4gdXNlIHRoaXMKKyAgICAgKiBmYWN0IHRvIGF2b2lkIGEgcG90ZW50aWFsbHkgZXhwZW5zaXZlIHVuYWxpZ25lZCByZWFkLCBhcyB3ZWxsCisgICAgICogYXMgc29tZSBzcGxpdHRpbmcsIGFuZCB2ZWN0b3IgYWRkaXRpb24gZWFjaCB0aW1lIGFyb3VuZCB0aGUgbG9vcC4KKyAgICAgKiBSZWFkIHVuYWxpZ25lZCBwaXhlbHMgaW50byBvdXIgdmVjdG9ycy4gVGhlIHZlY3RvcnMgYXJlIGFzIGZvbGxvd3M6CisgICAgICogcGl4MnY6IHBpeDJbMF0gLSBwaXgyWzE1XSAgcGl4Mml2OiBwaXgyWzFdIC0gcGl4MlsxNl0KKyAgICAgKiBTcGxpdCB0aGUgcGl4ZWwgdmVjdG9ycyBpbnRvIHNob3J0cy4gKi8KKyAgICBMT0FEX1BJWChwaXgydiwgcGl4Mml2LCBwaXgyLCBwZXJtMSwgcGVybTIpOworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBwaXgyaHYgID0KKyAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkgVkVDX01FUkdFSCh6ZXJvLCBwaXgydik7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHBpeDJsdiAgPQorICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KSBWRUNfTUVSR0VMKHplcm8sIHBpeDJ2KTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgcGl4MmlodiA9CisgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpIFZFQ19NRVJHRUgoemVybywgcGl4Mml2KTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgcGl4MmlsdiA9CisgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpIFZFQ19NRVJHRUwoemVybywgcGl4Mml2KTsKKworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB0MSA9IHZlY19hZGQocGl4Mmh2LCBwaXgyaWh2KTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdDIgPSB2ZWNfYWRkKHBpeDJsdiwgcGl4Mmlsdik7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHQzLCB0NDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgLyogUmVhZCB1bmFsaWduZWQgcGl4ZWxzIGludG8gb3VyIHZlY3RvcnMuIFRoZSB2ZWN0b3JzIGFyZSBhcyBmb2xsb3dzOgorICAgICAgICAgKiBwaXgxdjogcGl4MVswXSAtIHBpeDFbMTVdCisgICAgICAgICAqIHBpeDN2OiBwaXgzWzBdIC0gcGl4M1sxNV0gICAgICBwaXgzaXY6IHBpeDNbMV0gLSBwaXgzWzE2XSAqLworICAgICAgICBwaXgxdiAgPSB2ZWNfbGQoMCwgcGl4MSk7CisgICAgICAgIExPQURfUElYKHBpeDN2LCBwaXgzaXYsIHBpeDMsIHBlcm0xLCBwZXJtMik7CisKKyAgICAgICAgLyogTm90ZSB0aGF0IEFsdGlWZWMgZG9lcyBoYXZlIHZlY19hdmcsIGJ1dCB0aGlzIHdvcmtzIG9uIHZlY3RvciBwYWlycworICAgICAgICAgKiBhbmQgcm91bmRzIHVwLiBXZSBjb3VsZCBkbyBhdmcoYXZnKGEsIGIpLCBhdmcoYywgZCkpLCBidXQgdGhlCisgICAgICAgICAqIHJvdW5kaW5nIHdvdWxkIG1lYW4gdGhhdCwgZm9yIGV4YW1wbGUsIGF2ZygzLCAwLCAwLCAxKSA9IDIsIHdoZW4KKyAgICAgICAgICogaXQgc2hvdWxkIGJlIDEuIEluc3RlYWQsIHdlIGhhdmUgdG8gc3BsaXQgdGhlIHBpeGVsIHZlY3RvcnMgaW50bworICAgICAgICAgKiB2ZWN0b3JzIG9mIHNob3J0cyBhbmQgZG8gdGhlIGF2ZXJhZ2luZyBieSBoYW5kLiAqLworCisgICAgICAgIC8qIFNwbGl0IHRoZSBwaXhlbCB2ZWN0b3JzIGludG8gc2hvcnRzLiAqLworICAgICAgICBwaXgzaHYgID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkgVkVDX01FUkdFSCh6ZXJvLCBwaXgzdik7CisgICAgICAgIHBpeDNsdiAgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KSBWRUNfTUVSR0VMKHplcm8sIHBpeDN2KTsKKyAgICAgICAgcGl4M2lodiA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpIFZFQ19NRVJHRUgoemVybywgcGl4M2l2KTsKKyAgICAgICAgcGl4M2lsdiA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpIFZFQ19NRVJHRUwoemVybywgcGl4M2l2KTsKKworICAgICAgICAvKiBEbyB0aGUgYXZlcmFnaW5nIG9uIHRoZW0uICovCisgICAgICAgIHQzID0gdmVjX2FkZChwaXgzaHYsIHBpeDNpaHYpOworICAgICAgICB0NCA9IHZlY19hZGQocGl4M2x2LCBwaXgzaWx2KTsKKworICAgICAgICBhdmdodiA9IHZlY19zcih2ZWNfYWRkKHZlY19hZGQodDEsIHQzKSwgdHdvKSwgdHdvKTsKKyAgICAgICAgYXZnbHYgPSB2ZWNfc3IodmVjX2FkZCh2ZWNfYWRkKHQyLCB0NCksIHR3byksIHR3byk7CisKKyAgICAgICAgLyogUGFjayB0aGUgc2hvcnRzIGJhY2sgaW50byBhIHJlc3VsdC4gKi8KKyAgICAgICAgYXZndiA9IHZlY19wYWNrKGF2Z2h2LCBhdmdsdik7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIGEgc3VtIG9mIGFicyBkaWZmZXJlbmNlcyB2ZWN0b3IuICovCisgICAgICAgIHQ1ID0gdmVjX3N1Yih2ZWNfbWF4KHBpeDF2LCBhdmd2KSwgdmVjX21pbihwaXgxdiwgYXZndikpOworCisgICAgICAgIC8qIEFkZCBlYWNoIDQgcGl4ZWwgZ3JvdXAgdG9nZXRoZXIgYW5kIHB1dCA0IHJlc3VsdHMgaW50byBzYWQuICovCisgICAgICAgIHNhZCA9IHZlY19zdW00cyh0NSwgc2FkKTsKKworICAgICAgICBwaXgxICs9IHN0cmlkZTsKKyAgICAgICAgcGl4MyArPSBzdHJpZGU7CisgICAgICAgIC8qIFRyYW5zZmVyIHRoZSBjYWxjdWxhdGVkIHZhbHVlcyBmb3IgcGl4MyBpbnRvIHBpeDIuICovCisgICAgICAgIHQxID0gdDM7CisgICAgICAgIHQyID0gdDQ7CisgICAgfQorICAgIC8qIFN1bSB1cCB0aGUgZm91ciBwYXJ0aWFsIHN1bXMsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvIHMuICovCisgICAgc3VtZGlmZnMgPSB2ZWNfc3VtcygodmVjdG9yIHNpZ25lZCBpbnQpIHNhZCwgKHZlY3RvciBzaWduZWQgaW50KSB6ZXJvKTsKKyAgICBzdW1kaWZmcyA9IHZlY19zcGxhdChzdW1kaWZmcywgMyk7CisgICAgdmVjX3N0ZShzdW1kaWZmcywgMCwgJnMpOworCisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbnQgc2FkMTZfYWx0aXZlYyhNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgczsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IHplcm8gPQorICAgICAgICAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCkgdmVjX3NwbGF0X3UzMigwKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHNhZCA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KSB2ZWNfc3BsYXRfdTMyKDApOworICAgIHZlY3RvciBzaWduZWQgaW50IHN1bWRpZmZzOworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICAvKiBSZWFkIHBvdGVudGlhbGx5IHVuYWxpZ25lZCBwaXhlbHMgaW50byB0MSBhbmQgdDIuICovCisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHQxID12ZWNfbGQoMCwgcGl4MSk7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHQyID0gVkVDX0xEKDAsIHBpeDIpOworCisgICAgICAgIC8qIENhbGN1bGF0ZSBhIHN1bSBvZiBhYnMgZGlmZmVyZW5jZXMgdmVjdG9yLiAqLworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0MyA9IHZlY19tYXgodDEsIHQyKTsKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdDQgPSB2ZWNfbWluKHQxLCB0Mik7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHQ1ID0gdmVjX3N1Yih0MywgdDQpOworCisgICAgICAgIC8qIEFkZCBlYWNoIDQgcGl4ZWwgZ3JvdXAgdG9nZXRoZXIgYW5kIHB1dCA0IHJlc3VsdHMgaW50byBzYWQuICovCisgICAgICAgIHNhZCA9IHZlY19zdW00cyh0NSwgc2FkKTsKKworICAgICAgICBwaXgxICs9IHN0cmlkZTsKKyAgICAgICAgcGl4MiArPSBzdHJpZGU7CisgICAgfQorCisgICAgLyogU3VtIHVwIHRoZSBmb3VyIHBhcnRpYWwgc3VtcywgYW5kIHB1dCB0aGUgcmVzdWx0IGludG8gcy4gKi8KKyAgICBzdW1kaWZmcyA9IHZlY19zdW1zKCh2ZWN0b3Igc2lnbmVkIGludCkgc2FkLCAodmVjdG9yIHNpZ25lZCBpbnQpIHplcm8pOworICAgIHN1bWRpZmZzID0gdmVjX3NwbGF0KHN1bWRpZmZzLCAzKTsKKyAgICB2ZWNfc3RlKHN1bWRpZmZzLCAwLCAmcyk7CisKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIGludCBzYWQ4X2FsdGl2ZWMoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgczsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IHplcm8gPQorICAgICAgICAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCkgdmVjX3NwbGF0X3UzMigwKTsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtY2xlYXIgPQorICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpCisgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHNhZCA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KSB2ZWNfc3BsYXRfdTMyKDApOworICAgIHZlY3RvciBzaWduZWQgaW50IHN1bWRpZmZzOworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICAvKiBSZWFkIHBvdGVudGlhbGx5IHVuYWxpZ25lZCBwaXhlbHMgaW50byB0MSBhbmQgdDIuCisgICAgICAgICAqIFNpbmNlIHdlJ3JlIHJlYWRpbmcgMTYgcGl4ZWxzLCBhbmQgYWN0dWFsbHkgb25seSB3YW50IDgsCisgICAgICAgICAqIG1hc2sgb3V0IHRoZSBsYXN0IDggcGl4ZWxzLiBUaGUgMHMgZG9uJ3QgY2hhbmdlIHRoZSBzdW0uICovCisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeDFsID0gVkVDX0xEKDAsIHBpeDEpOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXgybCA9IFZFQ19MRCgwLCBwaXgyKTsKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdDEgPSB2ZWNfYW5kKHBpeDFsLCBwZXJtY2xlYXIpOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0MiA9IHZlY19hbmQocGl4MmwsIHBlcm1jbGVhcik7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIGEgc3VtIG9mIGFicyBkaWZmZXJlbmNlcyB2ZWN0b3IuICovCisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHQzID0gdmVjX21heCh0MSwgdDIpOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0NCA9IHZlY19taW4odDEsIHQyKTsKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdDUgPSB2ZWNfc3ViKHQzLCB0NCk7CisKKyAgICAgICAgLyogQWRkIGVhY2ggNCBwaXhlbCBncm91cCB0b2dldGhlciBhbmQgcHV0IDQgcmVzdWx0cyBpbnRvIHNhZC4gKi8KKyAgICAgICAgc2FkID0gdmVjX3N1bTRzKHQ1LCBzYWQpOworCisgICAgICAgIHBpeDEgKz0gc3RyaWRlOworICAgICAgICBwaXgyICs9IHN0cmlkZTsKKyAgICB9CisKKyAgICAvKiBTdW0gdXAgdGhlIGZvdXIgcGFydGlhbCBzdW1zLCBhbmQgcHV0IHRoZSByZXN1bHQgaW50byBzLiAqLworICAgIHN1bWRpZmZzID0gdmVjX3N1bXMoKHZlY3RvciBzaWduZWQgaW50KSBzYWQsICh2ZWN0b3Igc2lnbmVkIGludCkgemVybyk7CisgICAgc3VtZGlmZnMgPSB2ZWNfc3BsYXQoc3VtZGlmZnMsIDMpOworICAgIHZlY19zdGUoc3VtZGlmZnMsIDAsICZzKTsKKworICAgIHJldHVybiBzOworfQorCisvKiBTdW0gb2YgU3F1YXJlZCBFcnJvcnMgZm9yIGFuIDh4OCBibG9jaywgQWx0aVZlYy1lbmhhbmNlZC4KKyAqIEl0J3MgdGhlIHNhZDhfYWx0aXZlYyBjb2RlIGFib3ZlIHcvIHNxdWFyaW5nIGFkZGVkLiAqLworc3RhdGljIGludCBzc2U4X2FsdGl2ZWMoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgczsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IHplcm8gPQorICAgICAgICAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCkgdmVjX3NwbGF0X3UzMigwKTsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtY2xlYXIgPQorICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpCisgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHN1bSA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KSB2ZWNfc3BsYXRfdTMyKDApOworICAgIHZlY3RvciBzaWduZWQgaW50IHN1bXNxcjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgLyogUmVhZCBwb3RlbnRpYWxseSB1bmFsaWduZWQgcGl4ZWxzIGludG8gdDEgYW5kIHQyLgorICAgICAgICAgKiBTaW5jZSB3ZSdyZSByZWFkaW5nIDE2IHBpeGVscywgYW5kIGFjdHVhbGx5IG9ubHkgd2FudCA4LAorICAgICAgICAgKiBtYXNrIG91dCB0aGUgbGFzdCA4IHBpeGVscy4gVGhlIDBzIGRvbid0IGNoYW5nZSB0aGUgc3VtLiAqLworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0MSA9IHZlY19hbmQoVkVDX0xEKDAsIHBpeDEpLCBwZXJtY2xlYXIpOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0MiA9IHZlY19hbmQoVkVDX0xEKDAsIHBpeDIpLCBwZXJtY2xlYXIpOworCisgICAgICAgIC8qIFNpbmNlIHdlIHdhbnQgdG8gdXNlIHVuc2lnbmVkIGNoYXJzLCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UKKyAgICAgICAgICogb2YgdGhlIGZhY3QgdGhhdCBhYnMoYSAtIGIpIF4gMiA9IChhIC0gYikgXiAyLiAqLworCisgICAgICAgIC8qIENhbGN1bGF0ZSBhYnMgZGlmZmVyZW5jZXMgdmVjdG9yLiAqLworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0MyA9IHZlY19tYXgodDEsIHQyKTsKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdDQgPSB2ZWNfbWluKHQxLCB0Mik7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHQ1ID0gdmVjX3N1Yih0MywgdDQpOworCisgICAgICAgIC8qIFNxdWFyZSB0aGUgdmFsdWVzIGFuZCBhZGQgdGhlbSB0byBvdXIgc3VtLiAqLworICAgICAgICBzdW0gPSB2ZWNfbXN1bSh0NSwgdDUsIHN1bSk7CisKKyAgICAgICAgcGl4MSArPSBzdHJpZGU7CisgICAgICAgIHBpeDIgKz0gc3RyaWRlOworICAgIH0KKworICAgIC8qIFN1bSB1cCB0aGUgZm91ciBwYXJ0aWFsIHN1bXMsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvIHMuICovCisgICAgc3Vtc3FyID0gdmVjX3N1bXMoKHZlY3RvciBzaWduZWQgaW50KSBzdW0sICh2ZWN0b3Igc2lnbmVkIGludCkgemVybyk7CisgICAgc3Vtc3FyID0gdmVjX3NwbGF0KHN1bXNxciwgMyk7CisgICAgdmVjX3N0ZShzdW1zcXIsIDAsICZzKTsKKworICAgIHJldHVybiBzOworfQorCisvKiBTdW0gb2YgU3F1YXJlZCBFcnJvcnMgZm9yIGEgMTZ4MTYgYmxvY2ssIEFsdGlWZWMtZW5oYW5jZWQuCisgKiBJdCdzIHRoZSBzYWQxNl9hbHRpdmVjIGNvZGUgYWJvdmUgdy8gc3F1YXJpbmcgYWRkZWQuICovCitzdGF0aWMgaW50IHNzZTE2X2FsdGl2ZWMoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IGk7CisgICAgaW50ICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpIHM7CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCB6ZXJvID0KKyAgICAgICAgKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQpIHZlY19zcGxhdF91MzIoMCk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGludCBzdW0gPSAodmVjdG9yIHVuc2lnbmVkIGludCkgdmVjX3NwbGF0X3UzMigwKTsKKyAgICB2ZWN0b3Igc2lnbmVkIGludCBzdW1zcXI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIC8qIFJlYWQgcG90ZW50aWFsbHkgdW5hbGlnbmVkIHBpeGVscyBpbnRvIHQxIGFuZCB0Mi4gKi8KKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdDEgPSB2ZWNfbGQoMCwgcGl4MSk7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHQyID0gVkVDX0xEKDAsIHBpeDIpOworCisgICAgICAgIC8qIFNpbmNlIHdlIHdhbnQgdG8gdXNlIHVuc2lnbmVkIGNoYXJzLCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UKKyAgICAgICAgICogb2YgdGhlIGZhY3QgdGhhdCBhYnMoYSAtIGIpIF4gMiA9IChhIC0gYikgXiAyLiAqLworCisgICAgICAgIC8qIENhbGN1bGF0ZSBhYnMgZGlmZmVyZW5jZXMgdmVjdG9yLiAqLworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0MyA9IHZlY19tYXgodDEsIHQyKTsKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdDQgPSB2ZWNfbWluKHQxLCB0Mik7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHQ1ID0gdmVjX3N1Yih0MywgdDQpOworCisgICAgICAgIC8qIFNxdWFyZSB0aGUgdmFsdWVzIGFuZCBhZGQgdGhlbSB0byBvdXIgc3VtLiAqLworICAgICAgICBzdW0gPSB2ZWNfbXN1bSh0NSwgdDUsIHN1bSk7CisKKyAgICAgICAgcGl4MSArPSBzdHJpZGU7CisgICAgICAgIHBpeDIgKz0gc3RyaWRlOworICAgIH0KKworICAgIC8qIFN1bSB1cCB0aGUgZm91ciBwYXJ0aWFsIHN1bXMsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvIHMuICovCisgICAgc3Vtc3FyID0gdmVjX3N1bXMoKHZlY3RvciBzaWduZWQgaW50KSBzdW0sICh2ZWN0b3Igc2lnbmVkIGludCkgemVybyk7CisgICAgc3Vtc3FyID0gdmVjX3NwbGF0KHN1bXNxciwgMyk7CisKKyAgICB2ZWNfc3RlKHN1bXNxciwgMCwgJnMpOworICAgIHJldHVybiBzOworfQorCitzdGF0aWMgaW50IGhhZGFtYXJkOF9kaWZmOHg4X2FsdGl2ZWMoTXBlZ0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQoreworICAgIGludCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpIHN1bTsKKyAgICByZWdpc3RlciBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2emVybyA9CisgICAgICAgIChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhcikgdmVjX3NwbGF0X3U4KDApOworICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdnByb2QxID0KKyAgICAgICAgICAgIChjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0KSB7IDEsIC0xLCAxLCAtMSwgMSwgLTEsIDEsIC0xIH07CisgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdnByb2QyID0KKyAgICAgICAgICAgIChjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0KSB7IDEsIDEsIC0xLCAtMSwgMSwgMSwgLTEsIC0xIH07CisgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdnByb2QzID0KKyAgICAgICAgICAgIChjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0KSB7IDEsIDEsIDEsIDEsIC0xLCAtMSwgLTEsIC0xIH07CisgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm0xID0KKyAgICAgICAgICAgIChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhcikKKyAgICAgICAgICAgIHsgMHgwMiwgMHgwMywgMHgwMCwgMHgwMSwgMHgwNiwgMHgwNywgMHgwNCwgMHgwNSwKKyAgICAgICAgICAgICAgMHgwQSwgMHgwQiwgMHgwOCwgMHgwOSwgMHgwRSwgMHgwRiwgMHgwQywgMHgwRCB9OworICAgICAgICByZWdpc3RlciBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtMiA9CisgICAgICAgICAgICAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIpCisgICAgICAgICAgICB7IDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsCisgICAgICAgICAgICAgIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIgfTsKKyAgICAgICAgcmVnaXN0ZXIgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybTMgPQorICAgICAgICAgICAgKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKQorICAgICAgICAgICAgeyAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3IH07CisKKworI2RlZmluZSBPTkVJVEVSQlVUVEVSRkxZKGksIHJlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyY08gPSAgdW5hbGlnbmVkX2xvYWQoc3RyaWRlICogaSwgc3JjKTsgIFwKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHVuc2lnbmVkIGNoYXIgZHN0TyA9IHVuYWxpZ25lZF9sb2FkKHN0cmlkZSAqIGksIGRzdCk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogUHJvbW90ZSB0aGUgdW5zaWduZWQgY2hhcnMgdG8gc2lnbmVkIHNob3J0cy4gKi8gICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIFdlJ3JlIGluIHRoZSA4eDggZnVuY3Rpb24sIHdlIG9ubHkgY2FyZSBmb3IgdGhlIGZpcnN0IDguICovICAgICAgXAorICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IHNyY1YgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KSBWRUNfTUVSR0VIKCh2ZWN0b3Igc2lnbmVkIGNoYXIpIHZ6ZXJvLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBjaGFyKSBzcmNPKTsgICAgXAorICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGRzdFYgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KSBWRUNfTUVSR0VIKCh2ZWN0b3Igc2lnbmVkIGNoYXIpIHZ6ZXJvLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBjaGFyKSBkc3RPKTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogc3VidHJhY3Rpb25zIGluc2lkZSB0aGUgZmlyc3QgYnV0dGVyZmx5ICovICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgYnV0MCA9IHZlY19zdWIoc3JjViwgZHN0Vik7ICAgICAgICAgICAgXAorICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IG9wMSAgPSB2ZWNfcGVybShidXQwLCBidXQwLCBwZXJtMSk7ICAgIFwKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBidXQxID0gdmVjX21sYWRkKGJ1dDAsIHZwcm9kMSwgb3AxKTsgICBcCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgb3AyICA9IHZlY19wZXJtKGJ1dDEsIGJ1dDEsIHBlcm0yKTsgICAgXAorICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGJ1dDIgPSB2ZWNfbWxhZGQoYnV0MSwgdnByb2QyLCBvcDIpOyAgIFwKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBvcDMgID0gdmVjX3Blcm0oYnV0MiwgYnV0MiwgcGVybTMpOyAgICBcCisgICAgICAgIHJlcyAgPSB2ZWNfbWxhZGQoYnV0MiwgdnByb2QzLCBvcDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICAgICAgICBPTkVJVEVSQlVUVEVSRkxZKDAsIHRlbXAwKTsKKyAgICAgICAgT05FSVRFUkJVVFRFUkZMWSgxLCB0ZW1wMSk7CisgICAgICAgIE9ORUlURVJCVVRURVJGTFkoMiwgdGVtcDIpOworICAgICAgICBPTkVJVEVSQlVUVEVSRkxZKDMsIHRlbXAzKTsKKyAgICAgICAgT05FSVRFUkJVVFRFUkZMWSg0LCB0ZW1wNCk7CisgICAgICAgIE9ORUlURVJCVVRURVJGTFkoNSwgdGVtcDUpOworICAgICAgICBPTkVJVEVSQlVUVEVSRkxZKDYsIHRlbXA2KTsKKyAgICAgICAgT05FSVRFUkJVVFRFUkZMWSg3LCB0ZW1wNyk7CisgICAgfQorI3VuZGVmIE9ORUlURVJCVVRURVJGTFkKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgaW50IHZzdW07CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTAgID0gdmVjX2FkZCh0ZW1wMCwgdGVtcDEpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmUxICA9IHZlY19zdWIodGVtcDAsIHRlbXAxKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lMiAgPSB2ZWNfYWRkKHRlbXAyLCB0ZW1wMyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTMgID0gdmVjX3N1Yih0ZW1wMiwgdGVtcDMpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmU0ICA9IHZlY19hZGQodGVtcDQsIHRlbXA1KTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lNSAgPSB2ZWNfc3ViKHRlbXA0LCB0ZW1wNSk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTYgID0gdmVjX2FkZCh0ZW1wNiwgdGVtcDcpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmU3ICA9IHZlY19zdWIodGVtcDYsIHRlbXA3KTsKKworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmUwQiA9IHZlY19hZGQobGluZTAsIGxpbmUyKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lMkIgPSB2ZWNfc3ViKGxpbmUwLCBsaW5lMik7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTFCID0gdmVjX2FkZChsaW5lMSwgbGluZTMpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmUzQiA9IHZlY19zdWIobGluZTEsIGxpbmUzKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lNEIgPSB2ZWNfYWRkKGxpbmU0LCBsaW5lNik7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTZCID0gdmVjX3N1YihsaW5lNCwgbGluZTYpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmU1QiA9IHZlY19hZGQobGluZTUsIGxpbmU3KTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lN0IgPSB2ZWNfc3ViKGxpbmU1LCBsaW5lNyk7CisKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lMEMgPSB2ZWNfYWRkKGxpbmUwQiwgbGluZTRCKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lNEMgPSB2ZWNfc3ViKGxpbmUwQiwgbGluZTRCKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lMUMgPSB2ZWNfYWRkKGxpbmUxQiwgbGluZTVCKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lNUMgPSB2ZWNfc3ViKGxpbmUxQiwgbGluZTVCKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lMkMgPSB2ZWNfYWRkKGxpbmUyQiwgbGluZTZCKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lNkMgPSB2ZWNfc3ViKGxpbmUyQiwgbGluZTZCKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lM0MgPSB2ZWNfYWRkKGxpbmUzQiwgbGluZTdCKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lN0MgPSB2ZWNfc3ViKGxpbmUzQiwgbGluZTdCKTsKKworICAgICAgICB2c3VtID0gdmVjX3N1bTRzKHZlY19hYnMobGluZTBDKSwgdmVjX3NwbGF0X3MzMigwKSk7CisgICAgICAgIHZzdW0gPSB2ZWNfc3VtNHModmVjX2FicyhsaW5lMUMpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmUyQyksIHZzdW0pOworICAgICAgICB2c3VtID0gdmVjX3N1bTRzKHZlY19hYnMobGluZTNDKSwgdnN1bSk7CisgICAgICAgIHZzdW0gPSB2ZWNfc3VtNHModmVjX2FicyhsaW5lNEMpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmU1QyksIHZzdW0pOworICAgICAgICB2c3VtID0gdmVjX3N1bTRzKHZlY19hYnMobGluZTZDKSwgdnN1bSk7CisgICAgICAgIHZzdW0gPSB2ZWNfc3VtNHModmVjX2FicyhsaW5lN0MpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW1zKHZzdW0sICh2ZWN0b3Igc2lnbmVkIGludCkgdnplcm8pOworICAgICAgICB2c3VtID0gdmVjX3NwbGF0KHZzdW0sIDMpOworCisgICAgICAgIHZlY19zdGUodnN1bSwgMCwgJnN1bSk7CisgICAgfQorICAgIHJldHVybiBzdW07Cit9CisKKy8qCisgKiAxNng4IHdvcmtzIHdpdGggMTYgZWxlbWVudHM7IGl0IGFsbG93cyB0byBhdm9pZCByZXBsaWNhdGluZyBsb2FkcywgYW5kCisgKiBnaXZlcyB0aGUgY29tcGlsZXIgbW9yZSByb29tIGZvciBzY2hlZHVsaW5nLiBJdCdzIG9ubHkgdXNlZCBmcm9tCisgKiBpbnNpZGUgaGFkYW1hcmQ4X2RpZmYxNl9hbHRpdmVjLgorICoKKyAqIFVuZm9ydHVuYXRlbHksIGl0IHNlZW1zIGdjYy0zLjMgaXMgYSBiaXQgZHVtYiwgYW5kIHRoZSBjb21waWxlZCBjb2RlIGhhcworICogYSBMT1Qgb2Ygc3BpbGwgY29kZSwgaXQgc2VlbXMgZ2NjICh1bmxpa2UgeGxjKSBjYW5ub3Qga2VlcCBldmVyeXRoaW5nIGluCisgKiByZWdpc3RlcnMgYnkgaXRzZWxmLiBUaGUgZm9sbG93aW5nIGNvZGUgaW5jbHVkZXMgaGFuZC1tYWRlIHJlZ2lzdGVyCisgKiBhbGxvY2F0aW9uLiBJdCdzIG5vdCBjbGVhbiwgYnV0IG9uIGEgNzQ1MCB0aGUgcmVzdWx0aW5nIGNvZGUgaXMgbXVjaCBmYXN0ZXIKKyAqIChiZXN0IGNhc2UgZmFsbHMgZnJvbSA3MDArIGN5Y2xlcyB0byA1NTApLgorICoKKyAqIHhsYyBkb2Vzbid0IGFkZCBzcGlsbCBjb2RlLCBidXQgaXQgZG9lc24ndCBrbm93IGhvdyB0byBzY2hlZHVsZSBmb3IgdGhlCisgKiA3NDUwLCBhbmQgaXRzIGNvZGUgaXNuJ3QgbXVjaCBmYXN0ZXIgdGhhbiBnY2MtMy4zIG9uIHRoZSA3NDUwIChidXQgdXNlcworICogMjUlIGZld2VyIGluc3RydWN0aW9ucy4uLikKKyAqCisgKiBPbiB0aGUgOTcwLCB0aGUgaGFuZC1tYWRlIFJBIGlzIHN0aWxsIGEgd2luIChhcm91bmQgNjkwIHZzLiBhcm91bmQgNzgwKSwKKyAqIGJ1dCB4bGMgZ29lcyB0byBhcm91bmQgNjYwIG9uIHRoZSByZWd1bGFyIEMgY29kZS4uLgorICovCitzdGF0aWMgaW50IGhhZGFtYXJkOF9kaWZmMTZ4OF9hbHRpdmVjKE1wZWdFbmNDb250ZXh0ICpzLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgc3VtOworICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQKKyAgICAgICAgdGVtcDAgX19hc21fXyAoInYwIiksCisgICAgICAgIHRlbXAxIF9fYXNtX18gKCJ2MSIpLAorICAgICAgICB0ZW1wMiBfX2FzbV9fICgidjIiKSwKKyAgICAgICAgdGVtcDMgX19hc21fXyAoInYzIiksCisgICAgICAgIHRlbXA0IF9fYXNtX18gKCJ2NCIpLAorICAgICAgICB0ZW1wNSBfX2FzbV9fICgidjUiKSwKKyAgICAgICAgdGVtcDYgX19hc21fXyAoInY2IiksCisgICAgICAgIHRlbXA3IF9fYXNtX18gKCJ2NyIpOworICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQKKyAgICAgICAgdGVtcDBTIF9fYXNtX18gKCJ2OCIpLAorICAgICAgICB0ZW1wMVMgX19hc21fXyAoInY5IiksCisgICAgICAgIHRlbXAyUyBfX2FzbV9fICgidjEwIiksCisgICAgICAgIHRlbXAzUyBfX2FzbV9fICgidjExIiksCisgICAgICAgIHRlbXA0UyBfX2FzbV9fICgidjEyIiksCisgICAgICAgIHRlbXA1UyBfX2FzbV9fICgidjEzIiksCisgICAgICAgIHRlbXA2UyBfX2FzbV9fICgidjE0IiksCisgICAgICAgIHRlbXA3UyBfX2FzbV9fICgidjE1Iik7CisgICAgcmVnaXN0ZXIgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnplcm8gX19hc21fXyAoInYzMSIpID0KKyAgICAgICAgKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKSB2ZWNfc3BsYXRfdTgoMCk7CisgICAgeworICAgICAgICByZWdpc3RlciBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZwcm9kMSBfX2FzbV9fICgidjE2IikgPQorICAgICAgICAgICAgKGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQpIHsgMSwgLTEsIDEsIC0xLCAxLCAtMSwgMSwgLTEgfTsKKworICAgICAgICByZWdpc3RlciBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZwcm9kMiBfX2FzbV9fICgidjE3IikgPQorICAgICAgICAgICAgKGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQpIHsgMSwgMSwgLTEsIC0xLCAxLCAxLCAtMSwgLTEgfTsKKworICAgICAgICByZWdpc3RlciBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZwcm9kMyBfX2FzbV9fICgidjE4IikgPQorICAgICAgICAgICAgKGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQpIHsgMSwgMSwgMSwgMSwgLTEsIC0xLCAtMSwgLTEgfTsKKworICAgICAgICByZWdpc3RlciBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtMSBfX2FzbV9fICgidjE5IikgPQorICAgICAgICAgICAgKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKQorICAgICAgICAgICAgeyAweDAyLCAweDAzLCAweDAwLCAweDAxLCAweDA2LCAweDA3LCAweDA0LCAweDA1LAorICAgICAgICAgICAgICAweDBBLCAweDBCLCAweDA4LCAweDA5LCAweDBFLCAweDBGLCAweDBDLCAweDBEIH07CisKKyAgICAgICAgcmVnaXN0ZXIgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybTIgX19hc21fXyAoInYyMCIpID0KKyAgICAgICAgICAgIChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhcikKKyAgICAgICAgICAgIHsgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywKKyAgICAgICAgICAgICAgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiB9OworCisgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm0zIF9fYXNtX18gKCJ2MjEiKSA9CisgICAgICAgICAgICAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIpCisgICAgICAgICAgICB7IDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgICAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcgfTsKKworI2RlZmluZSBPTkVJVEVSQlVUVEVSRkxZKGksIHJlczEsIHJlczIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyY08gX19hc21fXyAoInYyMiIpID0gICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdW5hbGlnbmVkX2xvYWQoc3RyaWRlICogaSwgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIGRzdE8gX19hc21fXyAoInYyMyIpID0gICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdW5hbGlnbmVkX2xvYWQoc3RyaWRlICogaSwgZHN0KTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBQcm9tb3RlIHRoZSB1bnNpZ25lZCBjaGFycyB0byBzaWduZWQgc2hvcnRzLiAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBzcmNWIF9fYXNtX18gKCJ2MjQiKSA9ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydCkgVkVDX01FUkdFSCgodmVjdG9yIHNpZ25lZCBjaGFyKSB2emVybywgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcikgc3JjTyk7ICAgIFwKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBkc3RWIF9fYXNtX18gKCJ2MjUiKSA9ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydCkgVkVDX01FUkdFSCgodmVjdG9yIHNpZ25lZCBjaGFyKSB2emVybywgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcikgZHN0Tyk7ICAgIFwKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBzcmNXIF9fYXNtX18gKCJ2MjYiKSA9ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydCkgVkVDX01FUkdFTCgodmVjdG9yIHNpZ25lZCBjaGFyKSB2emVybywgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcikgc3JjTyk7ICAgIFwKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBkc3RXIF9fYXNtX18gKCJ2MjciKSA9ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydCkgVkVDX01FUkdFTCgodmVjdG9yIHNpZ25lZCBjaGFyKSB2emVybywgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcikgZHN0Tyk7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIHN1YnRyYWN0aW9ucyBpbnNpZGUgdGhlIGZpcnN0IGJ1dHRlcmZseSAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGJ1dDAgIF9fYXNtX18gKCJ2MjgiKSA9ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZlY19zdWIoc3JjViwgZHN0Vik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgYnV0MFMgX19hc21fXyAoInYyOSIpID0gICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmVjX3N1YihzcmNXLCBkc3RXKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBvcDEgICBfX2FzbV9fICgidjMwIikgPSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2ZWNfcGVybShidXQwLCBidXQwLCBwZXJtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGJ1dDEgIF9fYXNtX18gKCJ2MjIiKSA9ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZlY19tbGFkZChidXQwLCB2cHJvZDEsIG9wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgb3AxUyAgX19hc21fXyAoInYyMyIpID0gICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmVjX3Blcm0oYnV0MFMsIGJ1dDBTLCBwZXJtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBidXQxUyBfX2FzbV9fICgidjI0IikgPSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2ZWNfbWxhZGQoYnV0MFMsIHZwcm9kMSwgb3AxUyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IG9wMiAgIF9fYXNtX18gKCJ2MjUiKSA9ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZlY19wZXJtKGJ1dDEsIGJ1dDEsIHBlcm0yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgYnV0MiAgX19hc21fXyAoInYyNiIpID0gICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmVjX21sYWRkKGJ1dDEsIHZwcm9kMiwgb3AyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBvcDJTICBfX2FzbV9fICgidjI3IikgPSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2ZWNfcGVybShidXQxUywgYnV0MVMsIHBlcm0yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGJ1dDJTIF9fYXNtX18gKCJ2MjgiKSA9ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZlY19tbGFkZChidXQxUywgdnByb2QyLCBvcDJTKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgb3AzICAgX19hc21fXyAoInYyOSIpID0gICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmVjX3Blcm0oYnV0MiwgYnV0MiwgcGVybTMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBvcDNTICBfX2FzbV9fICgidjMwIikgPSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2ZWNfcGVybShidXQyUywgYnV0MlMsIHBlcm0zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXMxID0gdmVjX21sYWRkKGJ1dDIsIHZwcm9kMywgb3AzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVzMiA9IHZlY19tbGFkZChidXQyUywgdnByb2QzLCBvcDNTKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisgICAgICAgIE9ORUlURVJCVVRURVJGTFkoMCwgdGVtcDAsIHRlbXAwUyk7CisgICAgICAgIE9ORUlURVJCVVRURVJGTFkoMSwgdGVtcDEsIHRlbXAxUyk7CisgICAgICAgIE9ORUlURVJCVVRURVJGTFkoMiwgdGVtcDIsIHRlbXAyUyk7CisgICAgICAgIE9ORUlURVJCVVRURVJGTFkoMywgdGVtcDMsIHRlbXAzUyk7CisgICAgICAgIE9ORUlURVJCVVRURVJGTFkoNCwgdGVtcDQsIHRlbXA0Uyk7CisgICAgICAgIE9ORUlURVJCVVRURVJGTFkoNSwgdGVtcDUsIHRlbXA1Uyk7CisgICAgICAgIE9ORUlURVJCVVRURVJGTFkoNiwgdGVtcDYsIHRlbXA2Uyk7CisgICAgICAgIE9ORUlURVJCVVRURVJGTFkoNywgdGVtcDcsIHRlbXA3Uyk7CisgICAgfQorI3VuZGVmIE9ORUlURVJCVVRURVJGTFkKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgaW50IHZzdW07CisKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lMCAgPSB2ZWNfYWRkKHRlbXAwLCB0ZW1wMSk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTEgID0gdmVjX3N1Yih0ZW1wMCwgdGVtcDEpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmUyICA9IHZlY19hZGQodGVtcDIsIHRlbXAzKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lMyAgPSB2ZWNfc3ViKHRlbXAyLCB0ZW1wMyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTQgID0gdmVjX2FkZCh0ZW1wNCwgdGVtcDUpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmU1ICA9IHZlY19zdWIodGVtcDQsIHRlbXA1KTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lNiAgPSB2ZWNfYWRkKHRlbXA2LCB0ZW1wNyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTcgID0gdmVjX3N1Yih0ZW1wNiwgdGVtcDcpOworCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTBCID0gdmVjX2FkZChsaW5lMCwgbGluZTIpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmUyQiA9IHZlY19zdWIobGluZTAsIGxpbmUyKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lMUIgPSB2ZWNfYWRkKGxpbmUxLCBsaW5lMyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTNCID0gdmVjX3N1YihsaW5lMSwgbGluZTMpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmU0QiA9IHZlY19hZGQobGluZTQsIGxpbmU2KTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lNkIgPSB2ZWNfc3ViKGxpbmU0LCBsaW5lNik7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTVCID0gdmVjX2FkZChsaW5lNSwgbGluZTcpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmU3QiA9IHZlY19zdWIobGluZTUsIGxpbmU3KTsKKworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmUwQyA9IHZlY19hZGQobGluZTBCLCBsaW5lNEIpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmU0QyA9IHZlY19zdWIobGluZTBCLCBsaW5lNEIpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmUxQyA9IHZlY19hZGQobGluZTFCLCBsaW5lNUIpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmU1QyA9IHZlY19zdWIobGluZTFCLCBsaW5lNUIpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmUyQyA9IHZlY19hZGQobGluZTJCLCBsaW5lNkIpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmU2QyA9IHZlY19zdWIobGluZTJCLCBsaW5lNkIpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmUzQyA9IHZlY19hZGQobGluZTNCLCBsaW5lN0IpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmU3QyA9IHZlY19zdWIobGluZTNCLCBsaW5lN0IpOworCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTBTID0gdmVjX2FkZCh0ZW1wMFMsIHRlbXAxUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTFTID0gdmVjX3N1Yih0ZW1wMFMsIHRlbXAxUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTJTID0gdmVjX2FkZCh0ZW1wMlMsIHRlbXAzUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTNTID0gdmVjX3N1Yih0ZW1wMlMsIHRlbXAzUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTRTID0gdmVjX2FkZCh0ZW1wNFMsIHRlbXA1Uyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTVTID0gdmVjX3N1Yih0ZW1wNFMsIHRlbXA1Uyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTZTID0gdmVjX2FkZCh0ZW1wNlMsIHRlbXA3Uyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTdTID0gdmVjX3N1Yih0ZW1wNlMsIHRlbXA3Uyk7CisKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lMEJTID0gdmVjX2FkZChsaW5lMFMsIGxpbmUyUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTJCUyA9IHZlY19zdWIobGluZTBTLCBsaW5lMlMpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmUxQlMgPSB2ZWNfYWRkKGxpbmUxUywgbGluZTNTKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lM0JTID0gdmVjX3N1YihsaW5lMVMsIGxpbmUzUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTRCUyA9IHZlY19hZGQobGluZTRTLCBsaW5lNlMpOworICAgICAgICByZWdpc3RlciB2ZWN0b3Igc2lnbmVkIHNob3J0IGxpbmU2QlMgPSB2ZWNfc3ViKGxpbmU0UywgbGluZTZTKTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBsaW5lNUJTID0gdmVjX2FkZChsaW5lNVMsIGxpbmU3Uyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTdCUyA9IHZlY19zdWIobGluZTVTLCBsaW5lN1MpOworCisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTBDUyA9IHZlY19hZGQobGluZTBCUywgbGluZTRCUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTRDUyA9IHZlY19zdWIobGluZTBCUywgbGluZTRCUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTFDUyA9IHZlY19hZGQobGluZTFCUywgbGluZTVCUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTVDUyA9IHZlY19zdWIobGluZTFCUywgbGluZTVCUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTJDUyA9IHZlY19hZGQobGluZTJCUywgbGluZTZCUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTZDUyA9IHZlY19zdWIobGluZTJCUywgbGluZTZCUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTNDUyA9IHZlY19hZGQobGluZTNCUywgbGluZTdCUyk7CisgICAgICAgIHJlZ2lzdGVyIHZlY3RvciBzaWduZWQgc2hvcnQgbGluZTdDUyA9IHZlY19zdWIobGluZTNCUywgbGluZTdCUyk7CisKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmUwQyksIHZlY19zcGxhdF9zMzIoMCkpOworICAgICAgICB2c3VtID0gdmVjX3N1bTRzKHZlY19hYnMobGluZTFDKSwgdnN1bSk7CisgICAgICAgIHZzdW0gPSB2ZWNfc3VtNHModmVjX2FicyhsaW5lMkMpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmUzQyksIHZzdW0pOworICAgICAgICB2c3VtID0gdmVjX3N1bTRzKHZlY19hYnMobGluZTRDKSwgdnN1bSk7CisgICAgICAgIHZzdW0gPSB2ZWNfc3VtNHModmVjX2FicyhsaW5lNUMpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmU2QyksIHZzdW0pOworICAgICAgICB2c3VtID0gdmVjX3N1bTRzKHZlY19hYnMobGluZTdDKSwgdnN1bSk7CisKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmUwQ1MpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmUxQ1MpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmUyQ1MpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmUzQ1MpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmU0Q1MpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmU1Q1MpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmU2Q1MpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW00cyh2ZWNfYWJzKGxpbmU3Q1MpLCB2c3VtKTsKKyAgICAgICAgdnN1bSA9IHZlY19zdW1zKHZzdW0sICh2ZWN0b3Igc2lnbmVkIGludCkgdnplcm8pOworICAgICAgICB2c3VtID0gdmVjX3NwbGF0KHZzdW0sIDMpOworCisgICAgICAgIHZlY19zdGUodnN1bSwgMCwgJnN1bSk7CisgICAgfQorICAgIHJldHVybiBzdW07Cit9CisKK3N0YXRpYyBpbnQgaGFkYW1hcmQ4X2RpZmYxNl9hbHRpdmVjKE1wZWdFbmNDb250ZXh0ICpzLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQoreworICAgIGludCBzY29yZSA9IGhhZGFtYXJkOF9kaWZmMTZ4OF9hbHRpdmVjKHMsIGRzdCwgc3JjLCBzdHJpZGUsIDgpOworCisgICAgaWYgKGggPT0gMTYpIHsKKyAgICAgICAgZHN0ICAgKz0gOCAqIHN0cmlkZTsKKyAgICAgICAgc3JjICAgKz0gOCAqIHN0cmlkZTsKKyAgICAgICAgc2NvcmUgKz0gaGFkYW1hcmQ4X2RpZmYxNng4X2FsdGl2ZWMocywgZHN0LCBzcmMsIHN0cmlkZSwgOCk7CisgICAgfQorICAgIHJldHVybiBzY29yZTsKK30KKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KKworYXZfY29sZCB2b2lkIGZmX21lX2NtcF9pbml0X3BwYyhNRUNtcENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyNpZiBIQVZFX0FMVElWRUMKKyAgICBpZiAoIVBQQ19BTFRJVkVDKGF2X2dldF9jcHVfZmxhZ3MoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGMtPnBpeF9hYnNbMF1bMV0gPSBzYWQxNl94Ml9hbHRpdmVjOworICAgIGMtPnBpeF9hYnNbMF1bMl0gPSBzYWQxNl95Ml9hbHRpdmVjOworICAgIGMtPnBpeF9hYnNbMF1bM10gPSBzYWQxNl94eTJfYWx0aXZlYzsKKyAgICBjLT5waXhfYWJzWzBdWzBdID0gc2FkMTZfYWx0aXZlYzsKKyAgICBjLT5waXhfYWJzWzFdWzBdID0gc2FkOF9hbHRpdmVjOworCisgICAgYy0+c2FkWzBdID0gc2FkMTZfYWx0aXZlYzsKKyAgICBjLT5zYWRbMV0gPSBzYWQ4X2FsdGl2ZWM7CisgICAgYy0+c3NlWzBdID0gc3NlMTZfYWx0aXZlYzsKKyAgICBjLT5zc2VbMV0gPSBzc2U4X2FsdGl2ZWM7CisKKyAgICBjLT5oYWRhbWFyZDhfZGlmZlswXSA9IGhhZGFtYXJkOF9kaWZmMTZfYWx0aXZlYzsKKyAgICBjLT5oYWRhbWFyZDhfZGlmZlsxXSA9IGhhZGFtYXJkOF9kaWZmOHg4X2FsdGl2ZWM7CisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcGMvbXBlZ2F1ZGlvZHNwX2FsdGl2ZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9tcGVnYXVkaW9kc3BfYWx0aXZlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmU1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvbXBlZ2F1ZGlvZHNwX2FsdGl2ZWMuYwpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIEFsdGl2ZWMgb3B0aW1pemVkIE1QMyBkZWNvZGluZyBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAxMCBWaXRvciBTZXNzYWsKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWdhdWRpb2RzcC5oIgorCisjaWYgSEFWRV9BTFRJVkVDCisKKyNkZWZpbmUgTUFDUyhydCwgcmEsIHJiKSBydCs9KHJhKSoocmIpCisjZGVmaW5lIE1MU1MocnQsIHJhLCByYikgcnQtPShyYSkqKHJiKQorCisjZGVmaW5lIFNVTTgob3AsIHN1bSwgdywgcCkgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3Aoc3VtLCAodylbMCAqIDY0XSwgKHApWzAgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbMSAqIDY0XSwgKHApWzEgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbMiAqIDY0XSwgKHApWzIgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbMyAqIDY0XSwgKHApWzMgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNCAqIDY0XSwgKHApWzQgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNSAqIDY0XSwgKHApWzUgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNiAqIDY0XSwgKHApWzYgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNyAqIDY0XSwgKHApWzcgKiA2NF0pOyAgICBcCit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X3dpbmRvdyhjb25zdCBmbG9hdCAqYnVmLCBjb25zdCBmbG9hdCAqd2luMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqd2luMiwgZmxvYXQgKnN1bTEsIGZsb2F0ICpzdW0yLCBpbnQgbGVuKQoreworICAgIGNvbnN0IHZlY3RvciBmbG9hdCAqd2luMWEgPSAoY29uc3QgdmVjdG9yIGZsb2F0ICopIHdpbjE7CisgICAgY29uc3QgdmVjdG9yIGZsb2F0ICp3aW4yYSA9IChjb25zdCB2ZWN0b3IgZmxvYXQgKikgd2luMjsKKyAgICBjb25zdCB2ZWN0b3IgZmxvYXQgKmJ1ZmEgID0gKGNvbnN0IHZlY3RvciBmbG9hdCAqKSBidWY7CisgICAgdmVjdG9yIGZsb2F0ICpzdW0xYSA9ICh2ZWN0b3IgZmxvYXQgKikgc3VtMTsKKyAgICB2ZWN0b3IgZmxvYXQgKnN1bTJhID0gKHZlY3RvciBmbG9hdCAqKSBzdW0yOworICAgIHZlY3RvciBmbG9hdCBhdl91bmluaXQodjApLCBhdl91bmluaXQodjQpOworICAgIHZlY3RvciBmbG9hdCB2MSwgdjIsIHYzOworCisgICAgbGVuID0gbGVuID4+IDI7CisKKyNkZWZpbmUgTVVMVChhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2MSA9IHZlY19sZChhLCB3aW4xYSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgdjIgPSB2ZWNfbGQoYiwgd2luMmEpOyAgICAgICAgICAgICBcCisgICAgICAgIHYzID0gdmVjX2xkKGEsIGJ1ZmEpOyAgICAgICAgICAgICAgXAorICAgICAgICB2MCA9IHZlY19tYWRkKHYzLCB2MSwgdjApOyAgICAgICAgIFwKKyAgICAgICAgdjQgPSB2ZWNfbWFkZCh2MiwgdjMsIHY0KTsgICAgICAgICBcCisgICAgfQorCisgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgIHYwID0gdmVjX3hvcih2MCwgdjApOworICAgICAgICB2NCA9IHZlY194b3IodjQsIHY0KTsKKworICAgICAgICBNVUxUKCAgIDAsICAgMCk7CisgICAgICAgIE1VTFQoIDI1NiwgIDY0KTsKKyAgICAgICAgTVVMVCggNTEyLCAxMjgpOworICAgICAgICBNVUxUKCA3NjgsIDE5Mik7CisgICAgICAgIE1VTFQoMTAyNCwgMjU2KTsKKyAgICAgICAgTVVMVCgxMjgwLCAzMjApOworICAgICAgICBNVUxUKDE1MzYsIDM4NCk7CisgICAgICAgIE1VTFQoMTc5MiwgNDQ4KTsKKworICAgICAgICB2ZWNfc3QodjAsIDAsIHN1bTFhKTsKKyAgICAgICAgdmVjX3N0KHY0LCAwLCBzdW0yYSk7CisgICAgICAgIHN1bTFhKys7CisgICAgICAgIHN1bTJhKys7CisgICAgICAgIHdpbjFhKys7CisgICAgICAgIHdpbjJhKys7CisgICAgICAgIGJ1ZmErKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X3dpbmRvd19tcDMoZmxvYXQgKmluLCBmbG9hdCAqd2luLCBpbnQgKnVudXNlZCwgZmxvYXQgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluY3IpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNihmbG9hdCwgc3VtYSwgWzE3XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihmbG9hdCwgc3VtYiwgWzE3XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihmbG9hdCwgc3VtYywgWzE3XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihmbG9hdCwgc3VtZCwgWzE3XSk7CisKKyAgICBmbG9hdCBzdW07CisgICAgaW50IGo7CisgICAgZmxvYXQgKm91dDIgPSBvdXQgKyAzMiAqIGluY3I7CisKKyAgICAvKiBjb3B5IHRvIGF2b2lkIHdyYXAgKi8KKyAgICBtZW1jcHkoaW4gKyA1MTIsIGluLCAzMiAqIHNpemVvZigqaW4pKTsKKworICAgIGFwcGx5X3dpbmRvdyhpbiArIDE2LCB3aW4gICAgICwgd2luICsgNTEyLCBzdW1hLCBzdW1jLCAxNik7CisgICAgYXBwbHlfd2luZG93KGluICsgMzIsIHdpbiArIDQ4LCB3aW4gKyA2NDAsIHN1bWIsIHN1bWQsIDE2KTsKKworICAgIFNVTTgoTUxTUywgc3VtYVswXSwgd2luICsgMzIsIGluICsgNDgpOworCisgICAgc3VtY1sgMF0gPSAwOworICAgIHN1bWJbMTZdID0gMDsKKyAgICBzdW1kWzE2XSA9IDA7CisKKyAgICBvdXRbMCAgXSAgPSBzdW1hWyAgIDBdOworICAgIG91dCArPSBpbmNyOworICAgIG91dDIgLT0gaW5jcjsKKyAgICBmb3Ioaj0xO2o8MTY7aisrKSB7CisgICAgICAgICpvdXQgID0gIHN1bWFbICAgal0gLSBzdW1kWzE2LWpdOworICAgICAgICAqb3V0MiA9IC1zdW1iWzE2LWpdIC0gc3VtY1sgICBqXTsKKyAgICAgICAgb3V0ICArPSBpbmNyOworICAgICAgICBvdXQyIC09IGluY3I7CisgICAgfQorCisgICAgc3VtID0gMDsKKyAgICBTVU04KE1MU1MsIHN1bSwgd2luICsgMTYgKyAzMiwgaW4gKyAzMik7CisgICAgKm91dCA9IHN1bTsKK30KKworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworCithdl9jb2xkIHZvaWQgZmZfbXBhZHNwX2luaXRfcHBjKE1QQURTUENvbnRleHQgKnMpCit7CisjaWYgSEFWRV9BTFRJVkVDCisgICAgaWYgKCFQUENfQUxUSVZFQyhhdl9nZXRfY3B1X2ZsYWdzKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBzLT5hcHBseV93aW5kb3dfZmxvYXQgPSBhcHBseV93aW5kb3dfbXAzOworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL21wZWd2aWRlb19hbHRpdmVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvbXBlZ3ZpZGVvX2FsdGl2ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTUzYWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL21wZWd2aWRlb19hbHRpdmVjLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGlldGVyIFNoaXJsZXkKKyAqCisgKiBkY3RfdW5xdWFudGl6ZV9oMjYzX2FsdGl2ZWM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUm9tYWluIERvbGJlYXUgPHJvbWFpbkBkb2xiZWF1Lm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW8uaCIKKworI2lmIEhBVkVfQUxUSVZFQworCisvKiBBbHRpVmVjIHZlcnNpb24gb2YgZGN0X3VucXVhbnRpemVfaDI2MworICAgdGhpcyBjb2RlIGFzc3VtZXMgYGJsb2NrJyBpcyAxNiBieXRlcy1hbGlnbmVkICovCitzdGF0aWMgdm9pZCBkY3RfdW5xdWFudGl6ZV9oMjYzX2FsdGl2ZWMoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IG4sIGludCBxc2NhbGUpCit7CisgICAgaW50IGksIGxldmVsLCBxbXVsLCBxYWRkOworICAgIGludCBuQ29lZmZzOworCisgICAgYXNzZXJ0KHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0+PTApOworCisgICAgcWFkZCA9IChxc2NhbGUgLSAxKSB8IDE7CisgICAgcW11bCA9IHFzY2FsZSA8PCAxOworCisgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgIGlmICghcy0+aDI2M19haWMpIHsKKyAgICAgICAgICAgIGlmIChuIDwgNCkKKyAgICAgICAgICAgICAgICBibG9ja1swXSA9IGJsb2NrWzBdICogcy0+eV9kY19zY2FsZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBibG9ja1swXSA9IGJsb2NrWzBdICogcy0+Y19kY19zY2FsZTsKKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIHFhZGQgPSAwOworICAgICAgICBpID0gMTsKKyAgICAgICAgbkNvZWZmcz0gNjM7IC8vZG9lcyBub3QgYWx3YXlzIHVzZSB6aWd6YWcgdGFibGUKKyAgICB9IGVsc2UgeworICAgICAgICBpID0gMDsKKyAgICAgICAgbkNvZWZmcz0gcy0+aW50cmFfc2NhbnRhYmxlLnJhc3Rlcl9lbmRbIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gXTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdmN6ZXJvID0gKGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQpdmVjX3NwbGF0X3MxNigwKTsKKyAgICAgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgcW11bDgpID0gcW11bDsKKyAgICAgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaG9ydCwgcWFkZDgpID0gcWFkZDsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIHNpZ25lZCBzaG9ydCBibG9ja3YsIHFtdWx2LCBxYWRkdiwgbnFhZGR2LCB0ZW1wMTsKKyAgICAgICAgcmVnaXN0ZXIgdmVjdG9yIGJvb2wgc2hvcnQgYmxvY2t2X251bGwsIGJsb2Nrdl9uZWc7CisgICAgICAgIHJlZ2lzdGVyIHNob3J0IGJhY2t1cF8wID0gYmxvY2tbMF07CisgICAgICAgIHJlZ2lzdGVyIGludCBqID0gMDsKKworICAgICAgICBxbXVsdiA9IHZlY19zcGxhdCgodmVjX3MxNil2ZWNfbGRlKDAsICZxbXVsOCksIDApOworICAgICAgICBxYWRkdiA9IHZlY19zcGxhdCgodmVjX3MxNil2ZWNfbGRlKDAsICZxYWRkOCksIDApOworICAgICAgICBucWFkZHYgPSB2ZWNfc3ViKHZjemVybywgcWFkZHYpOworCisgICAgICAgIC8vIHZlY3Rvcml6ZSBhbGwgdGhlIDE2IGJ5dGVzLWFsaWduZWQgYmxvY2tzCisgICAgICAgIC8vIG9mIDggZWxlbWVudHMKKyAgICAgICAgZm9yKDsgKGogKyA3KSA8PSBuQ29lZmZzIDsgais9OCkgeworICAgICAgICAgICAgYmxvY2t2ID0gdmVjX2xkKGogPDwgMSwgYmxvY2spOworICAgICAgICAgICAgYmxvY2t2X25lZyA9IHZlY19jbXBsdChibG9ja3YsIHZjemVybyk7CisgICAgICAgICAgICBibG9ja3ZfbnVsbCA9IHZlY19jbXBlcShibG9ja3YsIHZjemVybyk7CisgICAgICAgICAgICAvLyBjaG9vc2UgYmV0d2VlbiArcWFkZCBvciAtcWFkZCBhcyB0aGUgdGhpcmQgb3BlcmFuZAorICAgICAgICAgICAgdGVtcDEgPSB2ZWNfc2VsKHFhZGR2LCBucWFkZHYsIGJsb2Nrdl9uZWcpOworICAgICAgICAgICAgLy8gbXVsdGlwbHkgJiBhZGQgKGJsb2Nre2ksaSs3fSAqIHFtdWwgWystXSBxYWRkKQorICAgICAgICAgICAgdGVtcDEgPSB2ZWNfbWxhZGQoYmxvY2t2LCBxbXVsdiwgdGVtcDEpOworICAgICAgICAgICAgLy8gcHV0IDAgd2hlcmUgYmxvY2tbe2ksaSs3fSB1c2VkIHRvIGhhdmUgMAorICAgICAgICAgICAgYmxvY2t2ID0gdmVjX3NlbCh0ZW1wMSwgYmxvY2t2LCBibG9ja3ZfbnVsbCk7CisgICAgICAgICAgICB2ZWNfc3QoYmxvY2t2LCBqIDw8IDEsIGJsb2NrKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIG5Db2VmZnMgaXNuJ3QgYSBtdWx0aXBsZSBvZiA4LCBmaW5pc2ggdGhlIGpvYgorICAgICAgICAvLyB1c2luZyBnb29kIG9sZCBzY2FsYXIgdW5pdHMuCisgICAgICAgIC8vICh3ZSBjb3VsZCBkbyBpdCB1c2luZyBhIHRydW5jYXRlZCB2ZWN0b3IsCisgICAgICAgIC8vIGJ1dCBJJ20gbm90IHN1cmUgaXQncyB3b3J0aCB0aGUgaGFzc2xlKQorICAgICAgICBmb3IoOyBqIDw9IG5Db2VmZnMgOyBqKyspIHsKKyAgICAgICAgICAgIGxldmVsID0gYmxvY2tbal07CisgICAgICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbGV2ZWwgKiBxbXVsIC0gcWFkZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsICogcW11bCArIHFhZGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJsb2NrW2pdID0gbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA9PSAxKSB7CisgICAgICAgICAgICAvLyBjaGVhdC4gdGhpcyBhdm9pZCBzcGVjaWFsLWNhc2luZyB0aGUgZmlyc3QgaXRlcmF0aW9uCisgICAgICAgICAgICBibG9ja1swXSA9IGJhY2t1cF8wOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCisKK2F2X2NvbGQgdm9pZCBmZl9tcHZfY29tbW9uX2luaXRfcHBjKE1wZWdFbmNDb250ZXh0ICpzKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKChzLT5hdmN0eC0+ZGN0X2FsZ28gPT0gRkZfRENUX0FVVE8pIHx8CisgICAgICAgIChzLT5hdmN0eC0+ZGN0X2FsZ28gPT0gRkZfRENUX0FMVElWRUMpKSB7CisgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2gyNjNfaW50cmEgPSBkY3RfdW5xdWFudGl6ZV9oMjYzX2FsdGl2ZWM7CisgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2gyNjNfaW50ZXIgPSBkY3RfdW5xdWFudGl6ZV9oMjYzX2FsdGl2ZWM7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL21wZWd2aWRlb2RzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL21wZWd2aWRlb2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OTY5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvbXBlZ3ZpZGVvZHNwLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBHTUMgKEdsb2JhbCBNb3Rpb24gQ29tcGVuc2F0aW9uKSwgQWx0aVZlYy1lbmFibGVkCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIFJvbWFpbiBEb2xiZWF1IDxyb21haW5AZG9sYmVhdS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWd2aWRlb2RzcC5oIgorCisjaWYgSEFWRV9BTFRJVkVDCisvKiBBbHRpVmVjLWVuaGFuY2VkIGdtYzEuIEFUTSB0aGlzIGNvZGUgYXNzdW1lcyBzdHJpZGUgaXMgYSBtdWx0aXBsZSBvZiA4CisgKiB0byBwcmVzZXJ2ZSBwcm9wZXIgZHN0IGFsaWdubWVudC4gKi8KK3N0YXRpYyB2b2lkIGdtYzFfYWx0aXZlYyh1aW50OF90ICpkc3QgLyogYWxpZ24gOCAqLywgdWludDhfdCAqc3JjIC8qIGFsaWduMSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgxNiwgaW50IHkxNiwgaW50IHJvdW5kZXIpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgREVDTEFSRV9BTElHTkVEKDE2LCB1bnNpZ25lZCBzaG9ydCwgcm91bmRlcl9hKSA9IHJvdW5kZXI7CisgICAgY29uc3QgREVDTEFSRV9BTElHTkVEKDE2LCB1bnNpZ25lZCBzaG9ydCwgQUJDRClbOF0gPSB7CisgICAgICAgICgxNiAtIHgxNikgKiAoMTYgLSB5MTYpLCAvKiBBICovCisgICAgICAgICAgICAgKHgxNikgKiAoMTYgLSB5MTYpLCAvKiBCICovCisgICAgICAgICgxNiAtIHgxNikgKiAoeTE2KSwgICAgICAvKiBDICovCisgICAgICAgICAgICAgKHgxNikgKiAoeTE2KSwgICAgICAvKiBEICovCisgICAgICAgIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAvKiBwYWRkaW5nICovCisgICAgfTsKKyAgICByZWdpc3RlciBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2Y3plcm8gPQorICAgICAgICAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIpIHZlY19zcGxhdF91OCgwKTsKKyAgICByZWdpc3RlciBjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdmNzcjggPQorICAgICAgICAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0KSB2ZWNfc3BsYXRfdTE2KDgpOworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIGRzdHYsIGRzdHYyLCBzcmN2Qiwgc3JjdkMsIHNyY3ZEOworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB0ZW1wQiwgdGVtcEMsIHRlbXBEOworICAgIHVuc2lnbmVkIGxvbmcgZHN0X29kZCAgICAgICAgPSAodW5zaWduZWQgbG9uZykgZHN0ICYgMHgwMDAwMDAwRjsKKyAgICB1bnNpZ25lZCBsb25nIHNyY19yZWFsbHlfb2RkID0gKHVuc2lnbmVkIGxvbmcpIHNyYyAmIDB4MDAwMDAwMEY7CisgICAgcmVnaXN0ZXIgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHRlbXBBID0KKyAgICAgICAgdmVjX2xkKDAsIChjb25zdCB1bnNpZ25lZCBzaG9ydCAqKSBBQkNEKTsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgQXYgPSB2ZWNfc3BsYXQodGVtcEEsIDApOworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBCdiA9IHZlY19zcGxhdCh0ZW1wQSwgMSk7CisgICAgcmVnaXN0ZXIgdmVjdG9yIHVuc2lnbmVkIHNob3J0IEN2ID0gdmVjX3NwbGF0KHRlbXBBLCAyKTsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgRHYgPSB2ZWNfc3BsYXQodGVtcEEsIDMpOworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBzaG9ydCByb3VuZGVyViA9CisgICAgICAgIHZlY19zcGxhdCgodmVjX3UxNikgdmVjX2xkZSgwLCAmcm91bmRlcl9hKSwgMCk7CisKKyAgICAvKiB3ZSdsbCBiZSBhYmxlIHRvIHBpY2stdXAgb3VyIDkgY2hhciBlbGVtZW50cyBhdCBzcmMgZnJvbSB0aG9zZQorICAgICAqIDMyIGJ5dGVzIHdlIGxvYWQgdGhlIGZpcnN0IGJhdGNoIGhlcmUsIGFzIGluc2lkZSB0aGUgbG9vcCB3ZSBjYW4KKyAgICAgKiByZXVzZSAnc3JjICsgc3RyaWRlJyBmcm9tIG9uZSBpdGVyYXRpb24gYXMgdGhlICdzcmMnIG9mIHRoZSBuZXh0LiAqLworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyY18wID0gdmVjX2xkKDAsIHNyYyk7CisgICAgcmVnaXN0ZXIgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc3JjXzEgPSB2ZWNfbGQoMTYsIHNyYyk7CisgICAgcmVnaXN0ZXIgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc3JjdkEgPSB2ZWNfcGVybShzcmNfMCwgc3JjXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNfbHZzbCgwLCBzcmMpKTsKKworICAgIGlmIChzcmNfcmVhbGx5X29kZCAhPSAweDAwMDAwMDBGKQorICAgICAgICAvKiBJZiAoc3JjICYgMHhGKSA9PSAweEYsIHRoZW4gKHNyYyArIDEpIGlzIHByb3Blcmx5IGFsaWduZWQKKyAgICAgICAgICogb24gdGhlIHNlY29uZCB2ZWN0b3IuICovCisgICAgICAgIHNyY3ZCID0gdmVjX3Blcm0oc3JjXzAsIHNyY18xLCB2ZWNfbHZzbCgxLCBzcmMpKTsKKyAgICBlbHNlCisgICAgICAgIHNyY3ZCID0gc3JjXzE7CisgICAgc3JjdkEgPSB2ZWNfbWVyZ2VoKHZjemVybywgc3JjdkEpOworICAgIHNyY3ZCID0gdmVjX21lcmdlaCh2Y3plcm8sIHNyY3ZCKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgZHN0X29kZCAgICAgICAgPSAgICh1bnNpZ25lZCBsb25nKSBkc3QgICAgICAgICAgICAmIDB4MDAwMDAwMEY7CisgICAgICAgIHNyY19yZWFsbHlfb2RkID0gKCgodW5zaWduZWQgbG9uZykgc3JjKSArIHN0cmlkZSkgJiAweDAwMDAwMDBGOworCisgICAgICAgIGRzdHYgPSB2ZWNfbGQoMCwgZHN0KTsKKworICAgICAgICAvKiBXZSdsbCBiZSBhYmxlIHRvIHBpY2stdXAgb3VyIDkgY2hhciBlbGVtZW50cyBhdCBzcmMgKyBzdHJpZGUgZnJvbQorICAgICAgICAgKiB0aG9zZSAzMiBieXRlcyB0aGVuIHJldXNlIHRoZSByZXN1bHRpbmcgMiB2ZWN0b3JzIHNydmNDIGFuZCBzcmN2RAorICAgICAgICAgKiBhcyB0aGUgbmV4dCBzcmN2QSBhbmQgc3JjdkIuICovCisgICAgICAgIHNyY18wID0gdmVjX2xkKHN0cmlkZSArICAwLCBzcmMpOworICAgICAgICBzcmNfMSA9IHZlY19sZChzdHJpZGUgKyAxNiwgc3JjKTsKKyAgICAgICAgc3JjdkMgPSB2ZWNfcGVybShzcmNfMCwgc3JjXzEsIHZlY19sdnNsKHN0cmlkZSArIDAsIHNyYykpOworCisgICAgICAgIGlmIChzcmNfcmVhbGx5X29kZCAhPSAweDAwMDAwMDBGKQorICAgICAgICAgICAgLyogSWYgKHNyYyAmIDB4RikgPT0gMHhGLCB0aGVuIChzcmMgKyAxKSBpcyBwcm9wZXJseSBhbGlnbmVkCisgICAgICAgICAgICAgKiBvbiB0aGUgc2Vjb25kIHZlY3Rvci4gKi8KKyAgICAgICAgICAgIHNyY3ZEID0gdmVjX3Blcm0oc3JjXzAsIHNyY18xLCB2ZWNfbHZzbChzdHJpZGUgKyAxLCBzcmMpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3JjdkQgPSBzcmNfMTsKKworICAgICAgICBzcmN2QyA9IHZlY19tZXJnZWgodmN6ZXJvLCBzcmN2Qyk7CisgICAgICAgIHNyY3ZEID0gdmVjX21lcmdlaCh2Y3plcm8sIHNyY3ZEKTsKKworICAgICAgICAvKiBPSywgbm93IHdlIChmaW5hbGx5KSBkbyB0aGUgbWF0aCA6LSkKKyAgICAgICAgICogVGhvc2UgZm91ciBpbnN0cnVjdGlvbnMgcmVwbGFjZSAzMiBpbnQgbXVscyAmIDMyIGludCBhZGRzLgorICAgICAgICAgKiBJc24ndCBBbHRpVmVjIG5pY2U/ICovCisgICAgICAgIHRlbXBBID0gdmVjX21sYWRkKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpIHNyY3ZBLCBBdiwgcm91bmRlclYpOworICAgICAgICB0ZW1wQiA9IHZlY19tbGFkZCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KSBzcmN2QiwgQnYsIHRlbXBBKTsKKyAgICAgICAgdGVtcEMgPSB2ZWNfbWxhZGQoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkgc3JjdkMsIEN2LCB0ZW1wQik7CisgICAgICAgIHRlbXBEID0gdmVjX21sYWRkKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpIHNyY3ZELCBEdiwgdGVtcEMpOworCisgICAgICAgIHNyY3ZBID0gc3JjdkM7CisgICAgICAgIHNyY3ZCID0gc3JjdkQ7CisKKyAgICAgICAgdGVtcEQgPSB2ZWNfc3IodGVtcEQsIHZjc3I4KTsKKworICAgICAgICBkc3R2MiA9IHZlY19wYWNrKHRlbXBELCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KSB2Y3plcm8pOworCisgICAgICAgIGlmIChkc3Rfb2RkKQorICAgICAgICAgICAgZHN0djIgPSB2ZWNfcGVybShkc3R2LCBkc3R2MiwgdmNwcm0oMCwgMSwgczAsIHMxKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRzdHYyID0gdmVjX3Blcm0oZHN0diwgZHN0djIsIHZjcHJtKHMwLCBzMSwgMiwgMykpOworCisgICAgICAgIHZlY19zdChkc3R2MiwgMCwgZHN0KTsKKworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgIH0KK30KKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KKworYXZfY29sZCB2b2lkIGZmX21wZWd2aWRlb2RzcF9pbml0X3BwYyhNcGVnVmlkZW9EU1BDb250ZXh0ICpjKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGMtPmdtYzEgPSBnbWMxX2FsdGl2ZWM7CisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcGMvbXBlZ3ZpZGVvZW5jZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvbXBlZ3ZpZGVvZW5jZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxYmE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9tcGVndmlkZW9lbmNkc3AuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWYgSEFWRV9BTFRJVkVDX0gKKyNpbmNsdWRlIDxhbHRpdmVjLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWd2aWRlb2VuY2RzcC5oIgorCisjaWYgSEFWRV9BTFRJVkVDCisKKyNpZiBIQVZFX1ZTWAorc3RhdGljIGludCBwaXhfbm9ybTFfYWx0aXZlYyh1aW50OF90ICpwaXgsIGludCBsaW5lX3NpemUpCit7CisgICAgaW50IGksIHMgPSAwOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgemVybyA9CisgICAgICAgIChjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50KSB2ZWNfc3BsYXRfdTMyKDApOworICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgc3YgPSAodmVjdG9yIHVuc2lnbmVkIGludCkgdmVjX3NwbGF0X3UzMigwKTsKKyAgICB2ZWN0b3Igc2lnbmVkIGludCBzdW07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAvKiBSZWFkIHRoZSBwb3RlbnRpYWxseSB1bmFsaWduZWQgcGl4ZWxzLiAqLworICAgICAgICAvL3ZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeGwgPSB2ZWNfbGQoMCwgIHBpeCk7CisgICAgICAgIC8vdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGl4ciA9IHZlY19sZCgxNSwgcGl4KTsKKyAgICAgICAgLy92ZWN0b3IgdW5zaWduZWQgY2hhciBwaXh2ID0gdmVjX3Blcm0ocGl4bCwgcGl4ciwgcGVybSk7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeHYgPSB2ZWNfdnN4X2xkKDAsICBwaXgpOworCisgICAgICAgIC8qIFNxdWFyZSB0aGUgdmFsdWVzLCBhbmQgYWRkIHRoZW0gdG8gb3VyIHN1bS4gKi8KKyAgICAgICAgc3YgPSB2ZWNfbXN1bShwaXh2LCBwaXh2LCBzdik7CisKKyAgICAgICAgcGl4ICs9IGxpbmVfc2l6ZTsKKyAgICB9CisgICAgLyogU3VtIHVwIHRoZSBmb3VyIHBhcnRpYWwgc3VtcywgYW5kIHB1dCB0aGUgcmVzdWx0IGludG8gcy4gKi8KKyAgICBzdW0gPSB2ZWNfc3VtcygodmVjdG9yIHNpZ25lZCBpbnQpIHN2LCAodmVjdG9yIHNpZ25lZCBpbnQpIHplcm8pOworICAgIHN1bSA9IHZlY19zcGxhdChzdW0sIDMpOworICAgIHZlY192c3hfc3Qoc3VtLCAwLCAmcyk7CisgICAgcmV0dXJuIHM7Cit9CisjZWxzZQorc3RhdGljIGludCBwaXhfbm9ybTFfYWx0aXZlYyh1aW50OF90ICpwaXgsIGludCBsaW5lX3NpemUpCit7CisgICAgaW50IGksIHMgPSAwOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgemVybyA9CisgICAgICAgIChjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50KSB2ZWNfc3BsYXRfdTMyKDApOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm0gPSB2ZWNfbHZzbCgwLCBwaXgpOworICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgc3YgPSAodmVjdG9yIHVuc2lnbmVkIGludCkgdmVjX3NwbGF0X3UzMigwKTsKKyAgICB2ZWN0b3Igc2lnbmVkIGludCBzdW07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAvKiBSZWFkIHRoZSBwb3RlbnRpYWxseSB1bmFsaWduZWQgcGl4ZWxzLiAqLworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXhsID0gdmVjX2xkKDAsICBwaXgpOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXhyID0gdmVjX2xkKDE1LCBwaXgpOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXh2ID0gdmVjX3Blcm0ocGl4bCwgcGl4ciwgcGVybSk7CisKKyAgICAgICAgLyogU3F1YXJlIHRoZSB2YWx1ZXMsIGFuZCBhZGQgdGhlbSB0byBvdXIgc3VtLiAqLworICAgICAgICBzdiA9IHZlY19tc3VtKHBpeHYsIHBpeHYsIHN2KTsKKworICAgICAgICBwaXggKz0gbGluZV9zaXplOworICAgIH0KKyAgICAvKiBTdW0gdXAgdGhlIGZvdXIgcGFydGlhbCBzdW1zLCBhbmQgcHV0IHRoZSByZXN1bHQgaW50byBzLiAqLworICAgIHN1bSA9IHZlY19zdW1zKCh2ZWN0b3Igc2lnbmVkIGludCkgc3YsICh2ZWN0b3Igc2lnbmVkIGludCkgemVybyk7CisgICAgc3VtID0gdmVjX3NwbGF0KHN1bSwgMyk7CisgICAgdmVjX3N0ZShzdW0sIDAsICZzKTsKKworICAgIHJldHVybiBzOworfQorI2VuZGlmIC8qIEhBVkVfVlNYICovCisKKyNpZiBIQVZFX1ZTWAorc3RhdGljIGludCBwaXhfc3VtX2FsdGl2ZWModWludDhfdCAqcGl4LCBpbnQgbGluZV9zaXplKQoreworICAgIGludCBpLCBzOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgemVybyA9CisgICAgICAgIChjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50KSB2ZWNfc3BsYXRfdTMyKDApOworICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgc2FkID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZlY19zcGxhdF91MzIoMCk7CisgICAgdmVjdG9yIHNpZ25lZCBpbnQgc3VtZGlmZnM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAvKiBSZWFkIHRoZSBwb3RlbnRpYWxseSB1bmFsaWduZWQgMTYgcGl4ZWxzIGludG8gdDEuICovCisgICAgICAgIC8vdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGl4bCA9IHZlY19sZCgwLCAgcGl4KTsKKyAgICAgICAgLy92ZWN0b3IgdW5zaWduZWQgY2hhciBwaXhyID0gdmVjX2xkKDE1LCBwaXgpOworICAgICAgICAvL3ZlY3RvciB1bnNpZ25lZCBjaGFyIHQxICAgPSB2ZWNfcGVybShwaXhsLCBwaXhyLCBwZXJtKTsKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdDEgICA9IHZlY192c3hfbGQoMCwgIHBpeCk7CisKKyAgICAgICAgLyogQWRkIGVhY2ggNCBwaXhlbCBncm91cCB0b2dldGhlciBhbmQgcHV0IDQgcmVzdWx0cyBpbnRvIHNhZC4gKi8KKyAgICAgICAgc2FkID0gdmVjX3N1bTRzKHQxLCBzYWQpOworCisgICAgICAgIHBpeCArPSBsaW5lX3NpemU7CisgICAgfQorCisgICAgLyogU3VtIHVwIHRoZSBmb3VyIHBhcnRpYWwgc3VtcywgYW5kIHB1dCB0aGUgcmVzdWx0IGludG8gcy4gKi8KKyAgICBzdW1kaWZmcyA9IHZlY19zdW1zKCh2ZWN0b3Igc2lnbmVkIGludCkgc2FkLCAodmVjdG9yIHNpZ25lZCBpbnQpIHplcm8pOworICAgIHN1bWRpZmZzID0gdmVjX3NwbGF0KHN1bWRpZmZzLCAzKTsKKyAgICB2ZWNfdnN4X3N0KHN1bWRpZmZzLCAwLCAmcyk7CisgICAgcmV0dXJuIHM7Cit9CisjZWxzZQorc3RhdGljIGludCBwaXhfc3VtX2FsdGl2ZWModWludDhfdCAqcGl4LCBpbnQgbGluZV9zaXplKQoreworICAgIGludCBpLCBzOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgemVybyA9CisgICAgICAgIChjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50KSB2ZWNfc3BsYXRfdTMyKDApOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm0gPSB2ZWNfbHZzbCgwLCBwaXgpOworICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgc2FkID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZlY19zcGxhdF91MzIoMCk7CisgICAgdmVjdG9yIHNpZ25lZCBpbnQgc3VtZGlmZnM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAvKiBSZWFkIHRoZSBwb3RlbnRpYWxseSB1bmFsaWduZWQgMTYgcGl4ZWxzIGludG8gdDEuICovCisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeGwgPSB2ZWNfbGQoMCwgIHBpeCk7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeHIgPSB2ZWNfbGQoMTUsIHBpeCk7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHQxICAgPSB2ZWNfcGVybShwaXhsLCBwaXhyLCBwZXJtKTsKKworICAgICAgICAvKiBBZGQgZWFjaCA0IHBpeGVsIGdyb3VwIHRvZ2V0aGVyIGFuZCBwdXQgNCByZXN1bHRzIGludG8gc2FkLiAqLworICAgICAgICBzYWQgPSB2ZWNfc3VtNHModDEsIHNhZCk7CisKKyAgICAgICAgcGl4ICs9IGxpbmVfc2l6ZTsKKyAgICB9CisKKyAgICAvKiBTdW0gdXAgdGhlIGZvdXIgcGFydGlhbCBzdW1zLCBhbmQgcHV0IHRoZSByZXN1bHQgaW50byBzLiAqLworICAgIHN1bWRpZmZzID0gdmVjX3N1bXMoKHZlY3RvciBzaWduZWQgaW50KSBzYWQsICh2ZWN0b3Igc2lnbmVkIGludCkgemVybyk7CisgICAgc3VtZGlmZnMgPSB2ZWNfc3BsYXQoc3VtZGlmZnMsIDMpOworICAgIHZlY19zdGUoc3VtZGlmZnMsIDAsICZzKTsKKworICAgIHJldHVybiBzOworfQorCisjZW5kaWYgLyogSEFWRV9WU1ggKi8KKworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworCithdl9jb2xkIHZvaWQgZmZfbXBlZ3ZpZGVvZW5jZHNwX2luaXRfcHBjKE1wZWd2aWRlb0VuY0RTUENvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyNpZiBIQVZFX0FMVElWRUMKKyAgICBpZiAoIVBQQ19BTFRJVkVDKGF2X2dldF9jcHVfZmxhZ3MoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGMtPnBpeF9ub3JtMSA9IHBpeF9ub3JtMV9hbHRpdmVjOworICAgIGMtPnBpeF9zdW0gICA9IHBpeF9zdW1fYWx0aXZlYzsKKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9waXhibG9ja2RzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL3BpeGJsb2NrZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiZGY5NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9waXhibG9ja2RzcC5jCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEJyaWFuIEZvbGV5CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGlldGVyIFNoaXJsZXkKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IFJvbWFpbiBEb2xiZWF1IDxyb21haW5AZG9sYmVhdS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBIQVZFX0FMVElWRUNfSAorI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvcGl4YmxvY2tkc3AuaCIKKworI2lmIEhBVkVfQUxUSVZFQworCisjaWYgSEFWRV9WU1gKK3N0YXRpYyB2b2lkIGdldF9waXhlbHNfYWx0aXZlYyhpbnQxNl90ICpyZXN0cmljdCBibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCit7CisgICAgaW50IGk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybSA9CisgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikgezB4MDAsMHgxMCwgMHgwMSwweDExLDB4MDIsMHgxMiwweDAzLDB4MTMsXAorICAgICAgICAgICAgMHgwNCwweDE0LDB4MDUsMHgxNSwweDA2LDB4MTYsMHgwNywweDE3fTsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB6ZXJvID0KKyAgICAgICAgKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKSB2ZWNfc3BsYXRfdTgoMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIC8qIFJlYWQgcG90ZW50aWFsbHkgdW5hbGlnbmVkIHBpeGVscy4KKyAgICAgICAgICogV2UncmUgcmVhZGluZyAxNiBwaXhlbHMsIGFuZCBhY3R1YWxseSBvbmx5IHdhbnQgOCwKKyAgICAgICAgICogYnV0IHdlIHNpbXBseSBpZ25vcmUgdGhlIGV4dHJhcy4gKi8KKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgYnl0ZXMgPSB2ZWNfdnN4X2xkKDAsIHBpeGVscyk7CisKKyAgICAgICAgLy8gQ29udmVydCB0aGUgYnl0ZXMgaW50byBzaG9ydHMuCisgICAgICAgIC8vdmVjdG9yIHNpZ25lZCBzaG9ydCBzaG9ydHMgPSAodmVjdG9yIHNpZ25lZCBzaG9ydCkgdmVjX3Blcm0oemVybywgYnl0ZXMsIHBlcm0pOworICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IHNob3J0cyA9ICh2ZWN0b3Igc2lnbmVkIHNob3J0KSB2ZWNfcGVybShieXRlcywgemVybywgcGVybSk7CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgZGF0YSB0byB0aGUgYmxvY2ssIHdlIGFzc3VtZSB0aGUgYmxvY2sgaXMgMTYtYnl0ZSBhbGlnbmVkLgorICAgICAgICB2ZWNfdnN4X3N0KHNob3J0cywgaSAqIDE2LCAodmVjdG9yIHNpZ25lZCBzaG9ydCAqKSBibG9jayk7CisKKyAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICB9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgZ2V0X3BpeGVsc19hbHRpdmVjKGludDE2X3QgKnJlc3RyaWN0IGJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtID0gdmVjX2x2c2woMCwgcGl4ZWxzKTsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB6ZXJvID0KKyAgICAgICAgKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKSB2ZWNfc3BsYXRfdTgoMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIC8qIFJlYWQgcG90ZW50aWFsbHkgdW5hbGlnbmVkIHBpeGVscy4KKyAgICAgICAgICogV2UncmUgcmVhZGluZyAxNiBwaXhlbHMsIGFuZCBhY3R1YWxseSBvbmx5IHdhbnQgOCwKKyAgICAgICAgICogYnV0IHdlIHNpbXBseSBpZ25vcmUgdGhlIGV4dHJhcy4gKi8KKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGl4bCA9IHZlY19sZCgwLCBwaXhlbHMpOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXhyID0gdmVjX2xkKDcsIHBpeGVscyk7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIGJ5dGVzID0gdmVjX3Blcm0ocGl4bCwgcGl4ciwgcGVybSk7CisKKyAgICAgICAgLy8gQ29udmVydCB0aGUgYnl0ZXMgaW50byBzaG9ydHMuCisgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgc2hvcnRzID0gKHZlY3RvciBzaWduZWQgc2hvcnQpIHZlY19tZXJnZWgoemVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyk7CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgZGF0YSB0byB0aGUgYmxvY2ssIHdlIGFzc3VtZSB0aGUgYmxvY2sgaXMgMTYtYnl0ZSBhbGlnbmVkLgorICAgICAgICB2ZWNfc3Qoc2hvcnRzLCBpICogMTYsICh2ZWN0b3Igc2lnbmVkIHNob3J0ICopIGJsb2NrKTsKKworICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgIH0KK30KKworI2VuZGlmIC8qIEhBVkVfVlNYICovCisKKyNpZiBIQVZFX1ZTWAorc3RhdGljIHZvaWQgZGlmZl9waXhlbHNfYWx0aXZlYyhpbnQxNl90ICpyZXN0cmljdCBibG9jaywgY29uc3QgdWludDhfdCAqczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnMyLCBpbnQgc3RyaWRlKQoreworICBpbnQgaTsKKyAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgemVybyA9CisgICAgKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKSB2ZWNfc3BsYXRfdTgoMCk7CisgIHZlY3RvciBzaWduZWQgc2hvcnQgc2hvcnRzMSwgc2hvcnRzMjsKKworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgLyogUmVhZCBwb3RlbnRpYWxseSB1bmFsaWduZWQgcGl4ZWxzLgorICAgICAqIFdlJ3JlIHJlYWRpbmcgMTYgcGl4ZWxzLCBhbmQgYWN0dWFsbHkgb25seSB3YW50IDgsCisgICAgICogYnV0IHdlIHNpbXBseSBpZ25vcmUgdGhlIGV4dHJhcy4gKi8KKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBieXRlcyA9IHZlY192c3hfbGQoMCwgIHMxKTsKKworICAgIC8vIENvbnZlcnQgdGhlIGJ5dGVzIGludG8gc2hvcnRzLgorICAgIHNob3J0czEgPSAodmVjdG9yIHNpZ25lZCBzaG9ydCkgdmVjX21lcmdlaChieXRlcywgemVybyk7CisKKyAgICAvLyBEbyB0aGUgc2FtZSBmb3IgdGhlIHNlY29uZCBibG9jayBvZiBwaXhlbHMuCisgICAgYnl0ZXMgPXZlY192c3hfbGQoMCwgIHMyKTsKKworICAgIC8vIENvbnZlcnQgdGhlIGJ5dGVzIGludG8gc2hvcnRzLgorICAgIHNob3J0czIgPSAodmVjdG9yIHNpZ25lZCBzaG9ydCkgdmVjX21lcmdlaChieXRlcywgemVybyk7CisKKyAgICAvLyBEbyB0aGUgc3VidHJhY3Rpb24uCisgICAgc2hvcnRzMSA9IHZlY19zdWIoc2hvcnRzMSwgc2hvcnRzMik7CisKKyAgICAvLyBTYXZlIHRoZSBkYXRhIHRvIHRoZSBibG9jaywgd2UgYXNzdW1lIHRoZSBibG9jayBpcyAxNi1ieXRlIGFsaWduZWQuCisgICAgdmVjX3ZzeF9zdChzaG9ydHMxLCAwLCAodmVjdG9yIHNpZ25lZCBzaG9ydCAqKSBibG9jayk7CisKKyAgICBzMSAgICArPSBzdHJpZGU7CisgICAgczIgICAgKz0gc3RyaWRlOworICAgIGJsb2NrICs9IDg7CisKKyAgICAvKiBUaGUgY29kZSBiZWxvdyBpcyBhIGNvcHkgb2YgdGhlIGNvZGUgYWJvdmUuLi4KKyAgICAgKiBUaGlzIGlzIGEgbWFudWFsIHVucm9sbC4gKi8KKworICAgIC8qIFJlYWQgcG90ZW50aWFsbHkgdW5hbGlnbmVkIHBpeGVscy4KKyAgICAgKiBXZSdyZSByZWFkaW5nIDE2IHBpeGVscywgYW5kIGFjdHVhbGx5IG9ubHkgd2FudCA4LAorICAgICAqIGJ1dCB3ZSBzaW1wbHkgaWdub3JlIHRoZSBleHRyYXMuICovCisgICAgYnl0ZXMgPSB2ZWNfdnN4X2xkKDAsICBzMSk7CisKKyAgICAvLyBDb252ZXJ0IHRoZSBieXRlcyBpbnRvIHNob3J0cy4KKyAgICBzaG9ydHMxID0gKHZlY3RvciBzaWduZWQgc2hvcnQpIHZlY19tZXJnZWgoYnl0ZXMsIHplcm8pOworCisgICAgLy8gRG8gdGhlIHNhbWUgZm9yIHRoZSBzZWNvbmQgYmxvY2sgb2YgcGl4ZWxzLgorICAgIGJ5dGVzID0gdmVjX3ZzeF9sZCgwLCAgczIpOworCisgICAgLy8gQ29udmVydCB0aGUgYnl0ZXMgaW50byBzaG9ydHMuCisgICAgc2hvcnRzMiA9ICh2ZWN0b3Igc2lnbmVkIHNob3J0KSB2ZWNfbWVyZ2VoKGJ5dGVzLCB6ZXJvKTsKKworICAgIC8vIERvIHRoZSBzdWJ0cmFjdGlvbi4KKyAgICBzaG9ydHMxID0gdmVjX3N1YihzaG9ydHMxLCBzaG9ydHMyKTsKKworICAgIC8vIFNhdmUgdGhlIGRhdGEgdG8gdGhlIGJsb2NrLCB3ZSBhc3N1bWUgdGhlIGJsb2NrIGlzIDE2LWJ5dGUgYWxpZ25lZC4KKyAgICB2ZWNfdnN4X3N0KHNob3J0czEsIDAsICh2ZWN0b3Igc2lnbmVkIHNob3J0ICopIGJsb2NrKTsKKworICAgIHMxICAgICs9IHN0cmlkZTsKKyAgICBzMiAgICArPSBzdHJpZGU7CisgICAgYmxvY2sgKz0gODsKKyAgfQorfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGRpZmZfcGl4ZWxzX2FsdGl2ZWMoaW50MTZfdCAqcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzMiwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtMSA9IHZlY19sdnNsKDAsIHMxKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtMiA9IHZlY19sdnNsKDAsIHMyKTsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB6ZXJvID0KKyAgICAgICAgKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKSB2ZWNfc3BsYXRfdTgoMCk7CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBzaG9ydHMxLCBzaG9ydHMyOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAvKiBSZWFkIHBvdGVudGlhbGx5IHVuYWxpZ25lZCBwaXhlbHMuCisgICAgICAgICAqIFdlJ3JlIHJlYWRpbmcgMTYgcGl4ZWxzLCBhbmQgYWN0dWFsbHkgb25seSB3YW50IDgsCisgICAgICAgICAqIGJ1dCB3ZSBzaW1wbHkgaWdub3JlIHRoZSBleHRyYXMuICovCisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeGwgID0gdmVjX2xkKDAsICBzMSk7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeHIgID0gdmVjX2xkKDE1LCBzMSk7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIGJ5dGVzID0gdmVjX3Blcm0ocGl4bCwgcGl4ciwgcGVybTEpOworCisgICAgICAgIC8vIENvbnZlcnQgdGhlIGJ5dGVzIGludG8gc2hvcnRzLgorICAgICAgICBzaG9ydHMxID0gKHZlY3RvciBzaWduZWQgc2hvcnQpIHZlY19tZXJnZWgoemVybywgYnl0ZXMpOworCisgICAgICAgIC8vIERvIHRoZSBzYW1lIGZvciB0aGUgc2Vjb25kIGJsb2NrIG9mIHBpeGVscy4KKyAgICAgICAgcGl4bCAgPSB2ZWNfbGQoMCwgIHMyKTsKKyAgICAgICAgcGl4ciAgPSB2ZWNfbGQoMTUsIHMyKTsKKyAgICAgICAgYnl0ZXMgPSB2ZWNfcGVybShwaXhsLCBwaXhyLCBwZXJtMik7CisKKyAgICAgICAgLy8gQ29udmVydCB0aGUgYnl0ZXMgaW50byBzaG9ydHMuCisgICAgICAgIHNob3J0czIgPSAodmVjdG9yIHNpZ25lZCBzaG9ydCkgdmVjX21lcmdlaCh6ZXJvLCBieXRlcyk7CisKKyAgICAgICAgLy8gRG8gdGhlIHN1YnRyYWN0aW9uLgorICAgICAgICBzaG9ydHMxID0gdmVjX3N1YihzaG9ydHMxLCBzaG9ydHMyKTsKKworICAgICAgICAvLyBTYXZlIHRoZSBkYXRhIHRvIHRoZSBibG9jaywgd2UgYXNzdW1lIHRoZSBibG9jayBpcyAxNi1ieXRlIGFsaWduZWQuCisgICAgICAgIHZlY19zdChzaG9ydHMxLCAwLCAodmVjdG9yIHNpZ25lZCBzaG9ydCAqKSBibG9jayk7CisKKyAgICAgICAgczEgICAgKz0gc3RyaWRlOworICAgICAgICBzMiAgICArPSBzdHJpZGU7CisgICAgICAgIGJsb2NrICs9IDg7CisKKyAgICAgICAgLyogVGhlIGNvZGUgYmVsb3cgaXMgYSBjb3B5IG9mIHRoZSBjb2RlIGFib3ZlLi4uCisgICAgICAgICAqIFRoaXMgaXMgYSBtYW51YWwgdW5yb2xsLiAqLworCisgICAgICAgIC8qIFJlYWQgcG90ZW50aWFsbHkgdW5hbGlnbmVkIHBpeGVscy4KKyAgICAgICAgICogV2UncmUgcmVhZGluZyAxNiBwaXhlbHMsIGFuZCBhY3R1YWxseSBvbmx5IHdhbnQgOCwKKyAgICAgICAgICogYnV0IHdlIHNpbXBseSBpZ25vcmUgdGhlIGV4dHJhcy4gKi8KKyAgICAgICAgcGl4bCAgPSB2ZWNfbGQoMCwgIHMxKTsKKyAgICAgICAgcGl4ciAgPSB2ZWNfbGQoMTUsIHMxKTsKKyAgICAgICAgYnl0ZXMgPSB2ZWNfcGVybShwaXhsLCBwaXhyLCBwZXJtMSk7CisKKyAgICAgICAgLy8gQ29udmVydCB0aGUgYnl0ZXMgaW50byBzaG9ydHMuCisgICAgICAgIHNob3J0czEgPSAodmVjdG9yIHNpZ25lZCBzaG9ydCkgdmVjX21lcmdlaCh6ZXJvLCBieXRlcyk7CisKKyAgICAgICAgLy8gRG8gdGhlIHNhbWUgZm9yIHRoZSBzZWNvbmQgYmxvY2sgb2YgcGl4ZWxzLgorICAgICAgICBwaXhsICA9IHZlY19sZCgwLCAgczIpOworICAgICAgICBwaXhyICA9IHZlY19sZCgxNSwgczIpOworICAgICAgICBieXRlcyA9IHZlY19wZXJtKHBpeGwsIHBpeHIsIHBlcm0yKTsKKworICAgICAgICAvLyBDb252ZXJ0IHRoZSBieXRlcyBpbnRvIHNob3J0cy4KKyAgICAgICAgc2hvcnRzMiA9ICh2ZWN0b3Igc2lnbmVkIHNob3J0KSB2ZWNfbWVyZ2VoKHplcm8sIGJ5dGVzKTsKKworICAgICAgICAvLyBEbyB0aGUgc3VidHJhY3Rpb24uCisgICAgICAgIHNob3J0czEgPSB2ZWNfc3ViKHNob3J0czEsIHNob3J0czIpOworCisgICAgICAgIC8vIFNhdmUgdGhlIGRhdGEgdG8gdGhlIGJsb2NrLCB3ZSBhc3N1bWUgdGhlIGJsb2NrIGlzIDE2LWJ5dGUgYWxpZ25lZC4KKyAgICAgICAgdmVjX3N0KHNob3J0czEsIDAsICh2ZWN0b3Igc2lnbmVkIHNob3J0ICopIGJsb2NrKTsKKworICAgICAgICBzMSAgICArPSBzdHJpZGU7CisgICAgICAgIHMyICAgICs9IHN0cmlkZTsKKyAgICAgICAgYmxvY2sgKz0gODsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBIQVZFX1ZTWCAqLworCisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCisKK2F2X2NvbGQgdm9pZCBmZl9waXhibG9ja2RzcF9pbml0X3BwYyhQaXhibG9ja0RTUENvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYy0+ZGlmZl9waXhlbHMgPSBkaWZmX3BpeGVsc19hbHRpdmVjOworCisgICAgaWYgKCFoaWdoX2JpdF9kZXB0aCkgeworICAgICAgICBjLT5nZXRfcGl4ZWxzID0gZ2V0X3BpeGVsc19hbHRpdmVjOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9zdnExZW5jX2FsdGl2ZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy9zdnExZW5jX2FsdGl2ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI1ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL3N2cTFlbmNfYWx0aXZlYy5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTHVjYSBCYXJiYXRvIDxsdV96ZXJvQGdlbnRvby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIEhBVkVfQUxUSVZFQ19ICisjaW5jbHVkZSA8YWx0aXZlYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9zdnExZW5jLmgiCisKKyNpZiBIQVZFX0FMVElWRUMKK3N0YXRpYyBpbnQgc3NkX2ludDhfdnNfaW50MTZfYWx0aXZlYyhjb25zdCBpbnQ4X3QgKnBpeDEsIGNvbnN0IGludDE2X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCit7CisgICAgaW50IGksIHNpemUxNiA9IHNpemUgPj4gNDsKKyAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgdnBpeDE7CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCB2cGl4MiwgdmRpZmYsIHZwaXgxbCwgdnBpeDFoOworICAgIHVuaW9uIHsKKyAgICAgICAgdmVjdG9yIHNpZ25lZCBpbnQgdnNjb3JlOworICAgICAgICBpbnQzMl90IHNjb3JlWzRdOworICAgIH0gdSA9IHsgLnZzY29yZSA9IHZlY19zcGxhdF9zMzIoMCkgfTsKKworICAgIHdoaWxlIChzaXplMTYpIHsKKyAgICAgICAgLy8gc2NvcmUgKz0gKHBpeDFbaV0gLSBwaXgyW2ldKSAqIChwaXgxW2ldIC0gcGl4MltpXSk7CisgICAgICAgIC8vIGxvYWQgcGl4MSBhbmQgdGhlIGZpcnN0IGJhdGNoIG9mIHBpeDIKKworICAgICAgICB2cGl4MSA9IHZlY191bmFsaWduZWRfbG9hZChwaXgxKTsKKyAgICAgICAgdnBpeDIgPSB2ZWNfdW5hbGlnbmVkX2xvYWQocGl4Mik7CisgICAgICAgIHBpeDIgKz0gODsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIHZwaXgxaCA9IHZlY191bnBhY2toKHZwaXgxKTsKKyAgICAgICAgdmRpZmYgID0gdmVjX3N1Yih2cGl4MWgsIHZwaXgyKTsKKyAgICAgICAgdnBpeDFsID0gdmVjX3VucGFja2wodnBpeDEpOworICAgICAgICAvLyBsb2FkIGFub3RoZXIgYmF0Y2ggZnJvbSBwaXgyCisgICAgICAgIHZwaXgyICAgID0gdmVjX3VuYWxpZ25lZF9sb2FkKHBpeDIpOworICAgICAgICB1LnZzY29yZSA9IHZlY19tc3VtKHZkaWZmLCB2ZGlmZiwgdS52c2NvcmUpOworICAgICAgICB2ZGlmZiAgICA9IHZlY19zdWIodnBpeDFsLCB2cGl4Mik7CisgICAgICAgIHUudnNjb3JlID0gdmVjX21zdW0odmRpZmYsIHZkaWZmLCB1LnZzY29yZSk7CisgICAgICAgIHBpeDEgICAgKz0gMTY7CisgICAgICAgIHBpeDIgICAgKz0gODsKKyAgICAgICAgc2l6ZTE2LS07CisgICAgfQorICAgIHUudnNjb3JlID0gdmVjX3N1bXModS52c2NvcmUsIHZlY19zcGxhdF9zMzIoMCkpOworCisgICAgc2l6ZSAlPSAxNjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICB1LnNjb3JlWzNdICs9IChwaXgxW2ldIC0gcGl4MltpXSkgKiAocGl4MVtpXSAtIHBpeDJbaV0pOworCisgICAgcmV0dXJuIHUuc2NvcmVbM107Cit9CisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCisKK2F2X2NvbGQgdm9pZCBmZl9zdnExZW5jX2luaXRfcHBjKFNWUTFFbmNDb250ZXh0ICpjKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYy0+c3NkX2ludDhfdnNfaW50MTYgPSBzc2RfaW50OF92c19pbnQxNl9hbHRpdmVjOworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL3ZjMWRzcF9hbHRpdmVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvdmMxZHNwX2FsdGl2ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTI4YjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL3ZjMWRzcF9hbHRpdmVjLmMKQEAgLTAsMCArMSwzNTYgQEAKKy8qCisgKiBWQy0xIGFuZCBXTVYzIGRlY29kZXIgLSBEU1AgZnVuY3Rpb25zIEFsdGlWZWMtb3B0aW1pemVkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdmMxZHNwLmgiCisKKyNpZiBIQVZFX0FMVElWRUMKKworLy8gbWFpbiBzdGVwcyBvZiA4eDggdHJhbnNmb3JtCisjZGVmaW5lIFNURVA4KHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNywgdmVjX3JuZCkgXAorZG8geyBcCisgICAgdDAgPSB2ZWNfc2wodmVjX2FkZChzMCwgczQpLCB2ZWNfMik7IFwKKyAgICB0MCA9IHZlY19hZGQodmVjX3NsKHQwLCB2ZWNfMSksIHQwKTsgXAorICAgIHQwID0gdmVjX2FkZCh0MCwgdmVjX3JuZCk7IFwKKyAgICB0MSA9IHZlY19zbCh2ZWNfc3ViKHMwLCBzNCksIHZlY18yKTsgXAorICAgIHQxID0gdmVjX2FkZCh2ZWNfc2wodDEsIHZlY18xKSwgdDEpOyBcCisgICAgdDEgPSB2ZWNfYWRkKHQxLCB2ZWNfcm5kKTsgXAorICAgIHQyID0gdmVjX2FkZCh2ZWNfc2woczYsIHZlY18yKSwgdmVjX3NsKHM2LCB2ZWNfMSkpOyBcCisgICAgdDIgPSB2ZWNfYWRkKHQyLCB2ZWNfc2woczIsIHZlY180KSk7IFwKKyAgICB0MyA9IHZlY19hZGQodmVjX3NsKHMyLCB2ZWNfMiksIHZlY19zbChzMiwgdmVjXzEpKTsgXAorICAgIHQzID0gdmVjX3N1Yih0MywgdmVjX3NsKHM2LCB2ZWNfNCkpOyBcCisgICAgdDQgPSB2ZWNfYWRkKHQwLCB0Mik7IFwKKyAgICB0NSA9IHZlY19hZGQodDEsIHQzKTsgXAorICAgIHQ2ID0gdmVjX3N1Yih0MSwgdDMpOyBcCisgICAgdDcgPSB2ZWNfc3ViKHQwLCB0Mik7IFwKK1wKKyAgICB0MCA9IHZlY19zbCh2ZWNfYWRkKHMxLCBzMyksIHZlY180KTsgXAorICAgIHQwID0gdmVjX2FkZCh0MCwgdmVjX3NsKHM1LCB2ZWNfMykpOyBcCisgICAgdDAgPSB2ZWNfYWRkKHQwLCB2ZWNfc2woczcsIHZlY18yKSk7IFwKKyAgICB0MCA9IHZlY19hZGQodDAsIHZlY19zdWIoczUsIHMzKSk7IFwKK1wKKyAgICB0MSA9IHZlY19zbCh2ZWNfc3ViKHMxLCBzNSksIHZlY180KTsgXAorICAgIHQxID0gdmVjX3N1Yih0MSwgdmVjX3NsKHM3LCB2ZWNfMykpOyBcCisgICAgdDEgPSB2ZWNfc3ViKHQxLCB2ZWNfc2woczMsIHZlY18yKSk7IFwKKyAgICB0MSA9IHZlY19zdWIodDEsIHZlY19hZGQoczEsIHM3KSk7IFwKK1wKKyAgICB0MiA9IHZlY19zbCh2ZWNfc3ViKHM3LCBzMyksIHZlY180KTsgXAorICAgIHQyID0gdmVjX2FkZCh0MiwgdmVjX3NsKHMxLCB2ZWNfMykpOyBcCisgICAgdDIgPSB2ZWNfYWRkKHQyLCB2ZWNfc2woczUsIHZlY18yKSk7IFwKKyAgICB0MiA9IHZlY19hZGQodDIsIHZlY19zdWIoczEsIHM3KSk7IFwKK1wKKyAgICB0MyA9IHZlY19zbCh2ZWNfc3ViKHM1LCBzNyksIHZlY180KTsgXAorICAgIHQzID0gdmVjX3N1Yih0MywgdmVjX3NsKHMzLCB2ZWNfMykpOyBcCisgICAgdDMgPSB2ZWNfYWRkKHQzLCB2ZWNfc2woczEsIHZlY18yKSk7IFwKKyAgICB0MyA9IHZlY19zdWIodDMsIHZlY19hZGQoczMsIHM1KSk7IFwKK1wKKyAgICBzMCA9IHZlY19hZGQodDQsIHQwKTsgXAorICAgIHMxID0gdmVjX2FkZCh0NSwgdDEpOyBcCisgICAgczIgPSB2ZWNfYWRkKHQ2LCB0Mik7IFwKKyAgICBzMyA9IHZlY19hZGQodDcsIHQzKTsgXAorICAgIHM0ID0gdmVjX3N1Yih0NywgdDMpOyBcCisgICAgczUgPSB2ZWNfc3ViKHQ2LCB0Mik7IFwKKyAgICBzNiA9IHZlY19zdWIodDUsIHQxKTsgXAorICAgIHM3ID0gdmVjX3N1Yih0NCwgdDApOyBcCit9d2hpbGUoMCkKKworI2RlZmluZSBTSElGVF9IT1I4KHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNykgXAorZG8geyBcCisgICAgczAgPSB2ZWNfc3JhKHMwLCB2ZWNfMyk7IFwKKyAgICBzMSA9IHZlY19zcmEoczEsIHZlY18zKTsgXAorICAgIHMyID0gdmVjX3NyYShzMiwgdmVjXzMpOyBcCisgICAgczMgPSB2ZWNfc3JhKHMzLCB2ZWNfMyk7IFwKKyAgICBzNCA9IHZlY19zcmEoczQsIHZlY18zKTsgXAorICAgIHM1ID0gdmVjX3NyYShzNSwgdmVjXzMpOyBcCisgICAgczYgPSB2ZWNfc3JhKHM2LCB2ZWNfMyk7IFwKKyAgICBzNyA9IHZlY19zcmEoczcsIHZlY18zKTsgXAorfXdoaWxlKDApCisKKyNkZWZpbmUgU0hJRlRfVkVSVDgoczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3KSBcCitkbyB7IFwKKyAgICBzMCA9IHZlY19zcmEoczAsIHZlY183KTsgXAorICAgIHMxID0gdmVjX3NyYShzMSwgdmVjXzcpOyBcCisgICAgczIgPSB2ZWNfc3JhKHMyLCB2ZWNfNyk7IFwKKyAgICBzMyA9IHZlY19zcmEoczMsIHZlY183KTsgXAorICAgIHM0ID0gdmVjX3NyYSh2ZWNfYWRkKHM0LCB2ZWNfMXMpLCB2ZWNfNyk7IFwKKyAgICBzNSA9IHZlY19zcmEodmVjX2FkZChzNSwgdmVjXzFzKSwgdmVjXzcpOyBcCisgICAgczYgPSB2ZWNfc3JhKHZlY19hZGQoczYsIHZlY18xcyksIHZlY183KTsgXAorICAgIHM3ID0gdmVjX3NyYSh2ZWNfYWRkKHM3LCB2ZWNfMXMpLCB2ZWNfNyk7IFwKK313aGlsZSgwKQorCisvKiBtYWluIHN0ZXBzIG9mIDR4NCB0cmFuc2Zvcm0gKi8KKyNkZWZpbmUgU1RFUDQoczAsIHMxLCBzMiwgczMsIHZlY19ybmQpIFwKK2RvIHsgXAorICAgIHQxID0gdmVjX2FkZCh2ZWNfc2woczAsIHZlY180KSwgczApOyBcCisgICAgdDEgPSB2ZWNfYWRkKHQxLCB2ZWNfcm5kKTsgXAorICAgIHQyID0gdmVjX2FkZCh2ZWNfc2woczIsIHZlY180KSwgczIpOyBcCisgICAgdDAgPSB2ZWNfYWRkKHQxLCB0Mik7IFwKKyAgICB0MSA9IHZlY19zdWIodDEsIHQyKTsgXAorICAgIHQzID0gdmVjX3NsKHZlY19zdWIoczMsIHMxKSwgdmVjXzEpOyBcCisgICAgdDMgPSB2ZWNfYWRkKHQzLCB2ZWNfc2wodDMsIHZlY18yKSk7IFwKKyAgICB0MiA9IHZlY19hZGQodDMsIHZlY19zbChzMSwgdmVjXzUpKTsgXAorICAgIHQzID0gdmVjX2FkZCh0MywgdmVjX3NsKHMzLCB2ZWNfMykpOyBcCisgICAgdDMgPSB2ZWNfYWRkKHQzLCB2ZWNfc2woczMsIHZlY18yKSk7IFwKKyAgICBzMCA9IHZlY19hZGQodDAsIHQyKTsgXAorICAgIHMxID0gdmVjX3N1Yih0MSwgdDMpOyBcCisgICAgczIgPSB2ZWNfYWRkKHQxLCB0Myk7IFwKKyAgICBzMyA9IHZlY19zdWIodDAsIHQyKTsgXAorfXdoaWxlICgwKQorCisjZGVmaW5lIFNISUZUX0hPUjQoczAsIHMxLCBzMiwgczMpIFwKKyAgICBzMCA9IHZlY19zcmEoczAsIHZlY18zKTsgXAorICAgIHMxID0gdmVjX3NyYShzMSwgdmVjXzMpOyBcCisgICAgczIgPSB2ZWNfc3JhKHMyLCB2ZWNfMyk7IFwKKyAgICBzMyA9IHZlY19zcmEoczMsIHZlY18zKTsKKworI2RlZmluZSBTSElGVF9WRVJUNChzMCwgczEsIHMyLCBzMykgXAorICAgIHMwID0gdmVjX3NyYShzMCwgdmVjXzcpOyBcCisgICAgczEgPSB2ZWNfc3JhKHMxLCB2ZWNfNyk7IFwKKyAgICBzMiA9IHZlY19zcmEoczIsIHZlY183KTsgXAorICAgIHMzID0gdmVjX3NyYShzMywgdmVjXzcpOworCisvKiogRG8gaW52ZXJzZSB0cmFuc2Zvcm0gb24gOHg4IGJsb2NrCisqLworc3RhdGljIHZvaWQgdmMxX2ludl90cmFuc184eDhfYWx0aXZlYyhpbnQxNl90IGJsb2NrWzY0XSkKK3sKKyAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgdmVjdG9yIHNpZ25lZCBpbnQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3OworICAgIHZlY3RvciBzaWduZWQgaW50IHM4LCBzOSwgc0EsIHNCLCBzQywgc0QsIHNFLCBzRjsKKyAgICB2ZWN0b3Igc2lnbmVkIGludCB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDc7CisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgdmVjXzY0ID0gdmVjX3NsKHZlY19zcGxhdF9zMzIoNCksIHZlY19zcGxhdF91MzIoNCkpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjXzcgPSB2ZWNfc3BsYXRfdTMyKDcpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjXzQgPSB2ZWNfc3BsYXRfdTMyKDQpOworICAgIGNvbnN0IHZlY3RvciAgc2lnbmVkIGludCB2ZWNfNHMgPSB2ZWNfc3BsYXRfczMyKDQpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjXzMgPSB2ZWNfc3BsYXRfdTMyKDMpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjXzIgPSB2ZWNfc3BsYXRfdTMyKDIpOworICAgIGNvbnN0IHZlY3RvciAgc2lnbmVkIGludCB2ZWNfMXMgPSB2ZWNfc3BsYXRfczMyKDEpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjXzEgPSB2ZWNfc3BsYXRfdTMyKDEpOworCisgICAgc3JjMCA9IHZlY19sZCggIDAsIGJsb2NrKTsKKyAgICBzcmMxID0gdmVjX2xkKCAxNiwgYmxvY2spOworICAgIHNyYzIgPSB2ZWNfbGQoIDMyLCBibG9jayk7CisgICAgc3JjMyA9IHZlY19sZCggNDgsIGJsb2NrKTsKKyAgICBzcmM0ID0gdmVjX2xkKCA2NCwgYmxvY2spOworICAgIHNyYzUgPSB2ZWNfbGQoIDgwLCBibG9jayk7CisgICAgc3JjNiA9IHZlY19sZCggOTYsIGJsb2NrKTsKKyAgICBzcmM3ID0gdmVjX2xkKDExMiwgYmxvY2spOworCisgICAgczAgPSB2ZWNfdW5wYWNrbChzcmMwKTsKKyAgICBzMSA9IHZlY191bnBhY2tsKHNyYzEpOworICAgIHMyID0gdmVjX3VucGFja2woc3JjMik7CisgICAgczMgPSB2ZWNfdW5wYWNrbChzcmMzKTsKKyAgICBzNCA9IHZlY191bnBhY2tsKHNyYzQpOworICAgIHM1ID0gdmVjX3VucGFja2woc3JjNSk7CisgICAgczYgPSB2ZWNfdW5wYWNrbChzcmM2KTsKKyAgICBzNyA9IHZlY191bnBhY2tsKHNyYzcpOworICAgIHM4ID0gdmVjX3VucGFja2goc3JjMCk7CisgICAgczkgPSB2ZWNfdW5wYWNraChzcmMxKTsKKyAgICBzQSA9IHZlY191bnBhY2toKHNyYzIpOworICAgIHNCID0gdmVjX3VucGFja2goc3JjMyk7CisgICAgc0MgPSB2ZWNfdW5wYWNraChzcmM0KTsKKyAgICBzRCA9IHZlY191bnBhY2toKHNyYzUpOworICAgIHNFID0gdmVjX3VucGFja2goc3JjNik7CisgICAgc0YgPSB2ZWNfdW5wYWNraChzcmM3KTsKKyAgICBTVEVQOChzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHZlY180cyk7CisgICAgU0hJRlRfSE9SOChzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcpOworICAgIFNURVA4KHM4LCBzOSwgc0EsIHNCLCBzQywgc0QsIHNFLCBzRiwgdmVjXzRzKTsKKyAgICBTSElGVF9IT1I4KHM4LCBzOSwgc0EsIHNCLCBzQywgc0QsIHNFLCBzRik7CisgICAgc3JjMCA9IHZlY19wYWNrKHM4LCBzMCk7CisgICAgc3JjMSA9IHZlY19wYWNrKHM5LCBzMSk7CisgICAgc3JjMiA9IHZlY19wYWNrKHNBLCBzMik7CisgICAgc3JjMyA9IHZlY19wYWNrKHNCLCBzMyk7CisgICAgc3JjNCA9IHZlY19wYWNrKHNDLCBzNCk7CisgICAgc3JjNSA9IHZlY19wYWNrKHNELCBzNSk7CisgICAgc3JjNiA9IHZlY19wYWNrKHNFLCBzNik7CisgICAgc3JjNyA9IHZlY19wYWNrKHNGLCBzNyk7CisgICAgVFJBTlNQT1NFOChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKworICAgIHMwID0gdmVjX3VucGFja2woc3JjMCk7CisgICAgczEgPSB2ZWNfdW5wYWNrbChzcmMxKTsKKyAgICBzMiA9IHZlY191bnBhY2tsKHNyYzIpOworICAgIHMzID0gdmVjX3VucGFja2woc3JjMyk7CisgICAgczQgPSB2ZWNfdW5wYWNrbChzcmM0KTsKKyAgICBzNSA9IHZlY191bnBhY2tsKHNyYzUpOworICAgIHM2ID0gdmVjX3VucGFja2woc3JjNik7CisgICAgczcgPSB2ZWNfdW5wYWNrbChzcmM3KTsKKyAgICBzOCA9IHZlY191bnBhY2toKHNyYzApOworICAgIHM5ID0gdmVjX3VucGFja2goc3JjMSk7CisgICAgc0EgPSB2ZWNfdW5wYWNraChzcmMyKTsKKyAgICBzQiA9IHZlY191bnBhY2toKHNyYzMpOworICAgIHNDID0gdmVjX3VucGFja2goc3JjNCk7CisgICAgc0QgPSB2ZWNfdW5wYWNraChzcmM1KTsKKyAgICBzRSA9IHZlY191bnBhY2toKHNyYzYpOworICAgIHNGID0gdmVjX3VucGFja2goc3JjNyk7CisgICAgU1RFUDgoczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCB2ZWNfNjQpOworICAgIFNISUZUX1ZFUlQ4KHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNyk7CisgICAgU1RFUDgoczgsIHM5LCBzQSwgc0IsIHNDLCBzRCwgc0UsIHNGLCB2ZWNfNjQpOworICAgIFNISUZUX1ZFUlQ4KHM4LCBzOSwgc0EsIHNCLCBzQywgc0QsIHNFLCBzRik7CisgICAgc3JjMCA9IHZlY19wYWNrKHM4LCBzMCk7CisgICAgc3JjMSA9IHZlY19wYWNrKHM5LCBzMSk7CisgICAgc3JjMiA9IHZlY19wYWNrKHNBLCBzMik7CisgICAgc3JjMyA9IHZlY19wYWNrKHNCLCBzMyk7CisgICAgc3JjNCA9IHZlY19wYWNrKHNDLCBzNCk7CisgICAgc3JjNSA9IHZlY19wYWNrKHNELCBzNSk7CisgICAgc3JjNiA9IHZlY19wYWNrKHNFLCBzNik7CisgICAgc3JjNyA9IHZlY19wYWNrKHNGLCBzNyk7CisKKyAgICB2ZWNfc3Qoc3JjMCwgIDAsIGJsb2NrKTsKKyAgICB2ZWNfc3Qoc3JjMSwgMTYsIGJsb2NrKTsKKyAgICB2ZWNfc3Qoc3JjMiwgMzIsIGJsb2NrKTsKKyAgICB2ZWNfc3Qoc3JjMywgNDgsIGJsb2NrKTsKKyAgICB2ZWNfc3Qoc3JjNCwgNjQsIGJsb2NrKTsKKyAgICB2ZWNfc3Qoc3JjNSwgODAsIGJsb2NrKTsKKyAgICB2ZWNfc3Qoc3JjNiwgOTYsIGJsb2NrKTsKKyAgICB2ZWNfc3Qoc3JjNywxMTIsIGJsb2NrKTsKK30KKworLyoqIERvIGludmVyc2UgdHJhbnNmb3JtIG9uIDh4NCBwYXJ0IG9mIGJsb2NrCisqLworc3RhdGljIHZvaWQgdmMxX2ludl90cmFuc184eDRfYWx0aXZlYyh1aW50OF90ICpkZXN0LCBpbnQgc3RyaWRlLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgdmVjdG9yIHNpZ25lZCBpbnQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3OworICAgIHZlY3RvciBzaWduZWQgaW50IHM4LCBzOSwgc0EsIHNCLCBzQywgc0QsIHNFLCBzRjsKKyAgICB2ZWN0b3Igc2lnbmVkIGludCB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDc7CisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgdmVjXzY0ID0gdmVjX3NsKHZlY19zcGxhdF9zMzIoNCksIHZlY19zcGxhdF91MzIoNCkpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjXzcgPSB2ZWNfc3BsYXRfdTMyKDcpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjXzUgPSB2ZWNfc3BsYXRfdTMyKDUpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjXzQgPSB2ZWNfc3BsYXRfdTMyKDQpOworICAgIGNvbnN0IHZlY3RvciAgc2lnbmVkIGludCB2ZWNfNHMgPSB2ZWNfc3BsYXRfczMyKDQpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjXzMgPSB2ZWNfc3BsYXRfdTMyKDMpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjXzIgPSB2ZWNfc3BsYXRfdTMyKDIpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjXzEgPSB2ZWNfc3BsYXRfdTMyKDEpOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRtcDsKKyAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IHRtcDIsIHRtcDM7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybTAsIHBlcm0xLCBwMCwgcDEsIHA7CisKKyAgICBzcmMwID0gdmVjX2xkKCAgMCwgYmxvY2spOworICAgIHNyYzEgPSB2ZWNfbGQoIDE2LCBibG9jayk7CisgICAgc3JjMiA9IHZlY19sZCggMzIsIGJsb2NrKTsKKyAgICBzcmMzID0gdmVjX2xkKCA0OCwgYmxvY2spOworICAgIHNyYzQgPSB2ZWNfbGQoIDY0LCBibG9jayk7CisgICAgc3JjNSA9IHZlY19sZCggODAsIGJsb2NrKTsKKyAgICBzcmM2ID0gdmVjX2xkKCA5NiwgYmxvY2spOworICAgIHNyYzcgPSB2ZWNfbGQoMTEyLCBibG9jayk7CisKKyAgICBUUkFOU1BPU0U4KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgIHMwID0gdmVjX3VucGFja2woc3JjMCk7CisgICAgczEgPSB2ZWNfdW5wYWNrbChzcmMxKTsKKyAgICBzMiA9IHZlY191bnBhY2tsKHNyYzIpOworICAgIHMzID0gdmVjX3VucGFja2woc3JjMyk7CisgICAgczQgPSB2ZWNfdW5wYWNrbChzcmM0KTsKKyAgICBzNSA9IHZlY191bnBhY2tsKHNyYzUpOworICAgIHM2ID0gdmVjX3VucGFja2woc3JjNik7CisgICAgczcgPSB2ZWNfdW5wYWNrbChzcmM3KTsKKyAgICBzOCA9IHZlY191bnBhY2toKHNyYzApOworICAgIHM5ID0gdmVjX3VucGFja2goc3JjMSk7CisgICAgc0EgPSB2ZWNfdW5wYWNraChzcmMyKTsKKyAgICBzQiA9IHZlY191bnBhY2toKHNyYzMpOworICAgIHNDID0gdmVjX3VucGFja2goc3JjNCk7CisgICAgc0QgPSB2ZWNfdW5wYWNraChzcmM1KTsKKyAgICBzRSA9IHZlY191bnBhY2toKHNyYzYpOworICAgIHNGID0gdmVjX3VucGFja2goc3JjNyk7CisgICAgU1RFUDgoczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCB2ZWNfNHMpOworICAgIFNISUZUX0hPUjgoczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3KTsKKyAgICBTVEVQOChzOCwgczksIHNBLCBzQiwgc0MsIHNELCBzRSwgc0YsIHZlY180cyk7CisgICAgU0hJRlRfSE9SOChzOCwgczksIHNBLCBzQiwgc0MsIHNELCBzRSwgc0YpOworICAgIHNyYzAgPSB2ZWNfcGFjayhzOCwgczApOworICAgIHNyYzEgPSB2ZWNfcGFjayhzOSwgczEpOworICAgIHNyYzIgPSB2ZWNfcGFjayhzQSwgczIpOworICAgIHNyYzMgPSB2ZWNfcGFjayhzQiwgczMpOworICAgIHNyYzQgPSB2ZWNfcGFjayhzQywgczQpOworICAgIHNyYzUgPSB2ZWNfcGFjayhzRCwgczUpOworICAgIHNyYzYgPSB2ZWNfcGFjayhzRSwgczYpOworICAgIHNyYzcgPSB2ZWNfcGFjayhzRiwgczcpOworICAgIFRSQU5TUE9TRTgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisKKyAgICBzMCA9IHZlY191bnBhY2toKHNyYzApOworICAgIHMxID0gdmVjX3VucGFja2goc3JjMSk7CisgICAgczIgPSB2ZWNfdW5wYWNraChzcmMyKTsKKyAgICBzMyA9IHZlY191bnBhY2toKHNyYzMpOworICAgIHM4ID0gdmVjX3VucGFja2woc3JjMCk7CisgICAgczkgPSB2ZWNfdW5wYWNrbChzcmMxKTsKKyAgICBzQSA9IHZlY191bnBhY2tsKHNyYzIpOworICAgIHNCID0gdmVjX3VucGFja2woc3JjMyk7CisgICAgU1RFUDQoczAsIHMxLCBzMiwgczMsIHZlY182NCk7CisgICAgU0hJRlRfVkVSVDQoczAsIHMxLCBzMiwgczMpOworICAgIFNURVA0KHM4LCBzOSwgc0EsIHNCLCB2ZWNfNjQpOworICAgIFNISUZUX1ZFUlQ0KHM4LCBzOSwgc0EsIHNCKTsKKyAgICBzcmMwID0gdmVjX3BhY2soczAsIHM4KTsKKyAgICBzcmMxID0gdmVjX3BhY2soczEsIHM5KTsKKyAgICBzcmMyID0gdmVjX3BhY2soczIsIHNBKTsKKyAgICBzcmMzID0gdmVjX3BhY2soczMsIHNCKTsKKworICAgIHAwID0gdmVjX2x2c2wgKDAsIGRlc3QpOworICAgIHAxID0gdmVjX2x2c2wgKHN0cmlkZSwgZGVzdCk7CisgICAgcCA9IHZlY19zcGxhdF91OCAoLTEpOworICAgIHBlcm0wID0gdmVjX21lcmdlaCAocCwgcDApOworICAgIHBlcm0xID0gdmVjX21lcmdlaCAocCwgcDEpOworCisjZGVmaW5lIEFERChkZXN0LHNyYyxwZXJtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogKih1aW50NjRfdCAqKSZ0bXAgPSAqKHVpbnQ2NF90ICopZGVzdDsgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wID0gdmVjX2xkICgwLCBkZXN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wMiA9ICh2ZWN0b3Igc2lnbmVkIHNob3J0KXZlY19wZXJtICh0bXAsIHZlY19zcGxhdF91OCgwKSwgcGVybSk7ICBcCisgICAgdG1wMyA9IHZlY19hZGRzICh0bXAyLCBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wID0gdmVjX3BhY2tzdSAodG1wMywgdG1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjX3N0ZSAoKHZlY3RvciB1bnNpZ25lZCBpbnQpdG1wLCAwLCAodW5zaWduZWQgaW50ICopZGVzdCk7ICAgICAgICBcCisgICAgdmVjX3N0ZSAoKHZlY3RvciB1bnNpZ25lZCBpbnQpdG1wLCA0LCAodW5zaWduZWQgaW50ICopZGVzdCk7CisKKyAgICBBREQgKGRlc3QsIHNyYzAsIHBlcm0wKSAgICAgIGRlc3QgKz0gc3RyaWRlOworICAgIEFERCAoZGVzdCwgc3JjMSwgcGVybTEpICAgICAgZGVzdCArPSBzdHJpZGU7CisgICAgQUREIChkZXN0LCBzcmMyLCBwZXJtMCkgICAgICBkZXN0ICs9IHN0cmlkZTsKKyAgICBBREQgKGRlc3QsIHNyYzMsIHBlcm0xKQorfQorCisjZGVmaW5lIFBVVF9PUF9VOF9BTFRJVkVDKGQsIHMsIGRzdCkgZCA9IHMKKyNkZWZpbmUgQVZHX09QX1U4X0FMVElWRUMoZCwgcywgZHN0KSBkID0gdmVjX2F2Zyhkc3QsIHMpCisKKyNkZWZpbmUgT1BfVThfQUxUSVZFQyAgICAgICAgICAgICAgICAgICAgICAgICAgUFVUX09QX1U4X0FMVElWRUMKKyNkZWZpbmUgUFJFRklYX25vX3JuZF92YzFfY2hyb21hX21jOF9hbHRpdmVjICAgcHV0X25vX3JuZF92YzFfY2hyb21hX21jOF9hbHRpdmVjCisjaW5jbHVkZSAiaDI2NGNocm9tYV90ZW1wbGF0ZS5jIgorI3VuZGVmIE9QX1U4X0FMVElWRUMKKyN1bmRlZiBQUkVGSVhfbm9fcm5kX3ZjMV9jaHJvbWFfbWM4X2FsdGl2ZWMKKworI2RlZmluZSBPUF9VOF9BTFRJVkVDICAgICAgICAgICAgICAgICAgICAgICAgICBBVkdfT1BfVThfQUxUSVZFQworI2RlZmluZSBQUkVGSVhfbm9fcm5kX3ZjMV9jaHJvbWFfbWM4X2FsdGl2ZWMgICBhdmdfbm9fcm5kX3ZjMV9jaHJvbWFfbWM4X2FsdGl2ZWMKKyNpbmNsdWRlICJoMjY0Y2hyb21hX3RlbXBsYXRlLmMiCisjdW5kZWYgT1BfVThfQUxUSVZFQworI3VuZGVmIFBSRUZJWF9ub19ybmRfdmMxX2Nocm9tYV9tYzhfYWx0aXZlYworCisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCisKK2F2X2NvbGQgdm9pZCBmZl92YzFkc3BfaW5pdF9wcGMoVkMxRFNQQ29udGV4dCAqZHNwKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZHNwLT52YzFfaW52X3RyYW5zXzh4OCA9IHZjMV9pbnZfdHJhbnNfOHg4X2FsdGl2ZWM7CisgICAgZHNwLT52YzFfaW52X3RyYW5zXzh4NCA9IHZjMV9pbnZfdHJhbnNfOHg0X2FsdGl2ZWM7CisgICAgZHNwLT5wdXRfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IHB1dF9ub19ybmRfdmMxX2Nocm9tYV9tYzhfYWx0aXZlYzsKKyAgICBkc3AtPmF2Z19ub19ybmRfdmMxX2Nocm9tYV9waXhlbHNfdGFiWzBdID0gYXZnX25vX3JuZF92YzFfY2hyb21hX21jOF9hbHRpdmVjOworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL3ZpZGVvZHNwX3BwYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL3ZpZGVvZHNwX3BwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTcwMjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvdmlkZW9kc3BfcHBjLmMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IFJvbWFpbiBEb2xiZWF1CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdmlkZW9kc3AuaCIKKworc3RhdGljIHZvaWQgcHJlZmV0Y2hfcHBjKHVpbnQ4X3QgKm1lbSwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgcmVnaXN0ZXIgY29uc3QgdWludDhfdCAqcCA9IG1lbTsKKyAgICBkbyB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCJkY2J0IDAsJTAiIDogOiAiciIgKHApKTsKKyAgICAgICAgcCArPSBzdHJpZGU7CisgICAgfSB3aGlsZSgtLWgpOworfQorCithdl9jb2xkIHZvaWQgZmZfdmlkZW9kc3BfaW5pdF9wcGMoVmlkZW9EU1BDb250ZXh0ICpjdHgsIGludCBicGMpCit7CisgICAgY3R4LT5wcmVmZXRjaCA9IHByZWZldGNoX3BwYzsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy92b3JiaXNkc3BfYWx0aXZlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL3ZvcmJpc2RzcF9hbHRpdmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1NTdjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BwYy92b3JiaXNkc3BfYWx0aXZlYy5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgTHVjYSBCYXJiYXRvIDxsdV96ZXJvQGdlbnRvby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBIQVZFX0FMVElWRUNfSAorI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKyNlbmRpZgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92b3JiaXNkc3AuaCIKKworI2lmIEhBVkVfQUxUSVZFQworc3RhdGljIHZvaWQgdm9yYmlzX2ludmVyc2VfY291cGxpbmdfYWx0aXZlYyhmbG9hdCAqbWFnLCBmbG9hdCAqYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBibG9ja3NpemUpCit7CisgICAgaW50IGk7CisgICAgdmVjdG9yIGZsb2F0IG0sIGE7CisgICAgdmVjdG9yIGJvb2wgaW50IHQwLCB0MTsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IHZfMzEgPSAvL1hYWAorICAgICAgICB2ZWNfYWRkKHZlY19hZGQodmVjX3NwbGF0X3UzMigxNSksdmVjX3NwbGF0X3UzMigxNSkpLHZlY19zcGxhdF91MzIoMSkpOworICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3NpemU7IGkgKz0gNCkgeworICAgICAgICBtID0gdmVjX2xkKDAsIG1hZytpKTsKKyAgICAgICAgYSA9IHZlY19sZCgwLCBhbmcraSk7CisgICAgICAgIHQwID0gdmVjX2NtcGxlKG0sICh2ZWN0b3IgZmxvYXQpdmVjX3NwbGF0X3UzMigwKSk7CisgICAgICAgIHQxID0gdmVjX2NtcGxlKGEsICh2ZWN0b3IgZmxvYXQpdmVjX3NwbGF0X3UzMigwKSk7CisgICAgICAgIGEgPSB2ZWNfeG9yKGEsICh2ZWN0b3IgZmxvYXQpIHZlY19zbCgodmVjdG9yIHVuc2lnbmVkIGludCl0MCwgdl8zMSkpOworICAgICAgICB0MCA9ICh2ZWN0b3IgYm9vbCBpbnQpdmVjX2FuZChhLCB0MSk7CisgICAgICAgIHQxID0gKHZlY3RvciBib29sIGludCl2ZWNfYW5kYyhhLCB0MSk7CisgICAgICAgIGEgPSB2ZWNfc3ViKG0sICh2ZWN0b3IgZmxvYXQpdDEpOworICAgICAgICBtID0gdmVjX2FkZChtLCAodmVjdG9yIGZsb2F0KXQwKTsKKyAgICAgICAgdmVjX3N0bChhLCAwLCBhbmcraSk7CisgICAgICAgIHZlY19zdGwobSwgMCwgbWFnK2kpOworICAgIH0KK30KKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KKworYXZfY29sZCB2b2lkIGZmX3ZvcmJpc2RzcF9pbml0X3BwYyhWb3JiaXNEU1BDb250ZXh0ICpjKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYy0+dm9yYmlzX2ludmVyc2VfY291cGxpbmcgPSB2b3JiaXNfaW52ZXJzZV9jb3VwbGluZ19hbHRpdmVjOworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL3ZwM2RzcF9hbHRpdmVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvdnAzZHNwX2FsdGl2ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDgxYjNmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL3ZwM2RzcF9hbHRpdmVjLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgQ29ucmFkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZwM2RzcC5oIgorCisjaWYgSEFWRV9BTFRJVkVDCisKK3N0YXRpYyBjb25zdCB2ZWNfczE2IGNvbnN0YW50cyA9CisgICAgezAsIDY0Mjc3LCA2MDU0NywgNTQ0OTEsIDQ2MzQxLCAzNjQxMCwgMjUwODAsIDEyNzg1fTsKK3N0YXRpYyBjb25zdCB2ZWNfdTggaW50ZXJsZWF2ZV9oaWdoID0KKyAgICB7MCwgMSwgMTYsIDE3LCA0LCA1LCAyMCwgMjEsIDgsIDksIDI0LCAyNSwgMTIsIDEzLCAyOCwgMjl9OworCisjZGVmaW5lIElEQ1RfU1RBUlQgXAorICAgIHZlY19zMTYgQSwgQiwgQywgRCwgQWQsIEJkLCBDZCwgRGQsIEUsIEYsIEcsIEg7XAorICAgIHZlY19zMTYgRWQsIEdkLCBBZGQsIEJkZCwgRmQsIEhkO1wKKyAgICB2ZWNfczE2IGVpZ2h0ID0gdmVjX3NwbGF0X3MxNig4KTtcCisgICAgdmVjX3UxNiBmb3VyID0gdmVjX3NwbGF0X3UxNig0KTtcCitcCisgICAgdmVjX3MxNiBDMSA9IHZlY19zcGxhdChjb25zdGFudHMsIDEpO1wKKyAgICB2ZWNfczE2IEMyID0gdmVjX3NwbGF0KGNvbnN0YW50cywgMik7XAorICAgIHZlY19zMTYgQzMgPSB2ZWNfc3BsYXQoY29uc3RhbnRzLCAzKTtcCisgICAgdmVjX3MxNiBDNCA9IHZlY19zcGxhdChjb25zdGFudHMsIDQpO1wKKyAgICB2ZWNfczE2IEM1ID0gdmVjX3NwbGF0KGNvbnN0YW50cywgNSk7XAorICAgIHZlY19zMTYgQzYgPSB2ZWNfc3BsYXQoY29uc3RhbnRzLCA2KTtcCisgICAgdmVjX3MxNiBDNyA9IHZlY19zcGxhdChjb25zdGFudHMsIDcpO1wKK1wKKyAgICB2ZWNfczE2IGIwID0gdmVjX2xkKDB4MDAsIGJsb2NrKTtcCisgICAgdmVjX3MxNiBiMSA9IHZlY19sZCgweDEwLCBibG9jayk7XAorICAgIHZlY19zMTYgYjIgPSB2ZWNfbGQoMHgyMCwgYmxvY2spO1wKKyAgICB2ZWNfczE2IGIzID0gdmVjX2xkKDB4MzAsIGJsb2NrKTtcCisgICAgdmVjX3MxNiBiNCA9IHZlY19sZCgweDQwLCBibG9jayk7XAorICAgIHZlY19zMTYgYjUgPSB2ZWNfbGQoMHg1MCwgYmxvY2spO1wKKyAgICB2ZWNfczE2IGI2ID0gdmVjX2xkKDB4NjAsIGJsb2NrKTtcCisgICAgdmVjX3MxNiBiNyA9IHZlY19sZCgweDcwLCBibG9jayk7CisKKy8vIHRoZXNlIGZ1bmN0aW9ucyBkbyAoYSpDKT4+MTYKKy8vIHRoaW5ncyBhcmUgdHJpY2t5IGJlY2F1c2UgYSBpcyBzaWduZWQsIGJ1dCBDIHVuc2lnbmVkLgorLy8gTTE1IGlzIHVzZWQgaWYgQyBmaXRzIGluIDE1IGJpdCB1bnNpZ25lZCAoQzYsQzcpCisvLyBNMTYgaXMgdXNlZCBpZiBDIHJlcXVpcmVzIDE2IGJpdHMgdW5zaWduZWQKK3N0YXRpYyBpbmxpbmUgdmVjX3MxNiBNMTUodmVjX3MxNiBhLCB2ZWNfczE2IEMpCit7CisgICAgcmV0dXJuICh2ZWNfczE2KXZlY19wZXJtKHZlY19tdWxlKGEsQyksIHZlY19tdWxvKGEsQyksIGludGVybGVhdmVfaGlnaCk7Cit9CitzdGF0aWMgaW5saW5lIHZlY19zMTYgTTE2KHZlY19zMTYgYSwgdmVjX3MxNiBDKQoreworICAgIHJldHVybiB2ZWNfYWRkKGEsIE0xNShhLCBDKSk7Cit9CisKKyNkZWZpbmUgSURDVF8xRChBREQsIFNISUZUKVwKKyAgICBBID0gdmVjX2FkZChNMTYoYjEsIEMxKSwgTTE1KGI3LCBDNykpO1wKKyAgICBCID0gdmVjX3N1YihNMTUoYjEsIEM3KSwgTTE2KGI3LCBDMSkpO1wKKyAgICBDID0gdmVjX2FkZChNMTYoYjMsIEMzKSwgTTE2KGI1LCBDNSkpO1wKKyAgICBEID0gdmVjX3N1YihNMTYoYjUsIEMzKSwgTTE2KGIzLCBDNSkpO1wKK1wKKyAgICBBZCA9IE0xNih2ZWNfc3ViKEEsIEMpLCBDNCk7XAorICAgIEJkID0gTTE2KHZlY19zdWIoQiwgRCksIEM0KTtcCitcCisgICAgQ2QgPSB2ZWNfYWRkKEEsIEMpO1wKKyAgICBEZCA9IHZlY19hZGQoQiwgRCk7XAorXAorICAgIEUgPSBBREQoTTE2KHZlY19hZGQoYjAsIGI0KSwgQzQpKTtcCisgICAgRiA9IEFERChNMTYodmVjX3N1YihiMCwgYjQpLCBDNCkpO1wKK1wKKyAgICBHID0gdmVjX2FkZChNMTYoYjIsIEMyKSwgTTE1KGI2LCBDNikpO1wKKyAgICBIID0gdmVjX3N1YihNMTUoYjIsIEM2KSwgTTE2KGI2LCBDMikpO1wKK1wKKyAgICBFZCA9IHZlY19zdWIoRSwgRyk7XAorICAgIEdkID0gdmVjX2FkZChFLCBHKTtcCitcCisgICAgQWRkID0gdmVjX2FkZChGLCBBZCk7XAorICAgIEJkZCA9IHZlY19zdWIoQmQsIEgpO1wKK1wKKyAgICBGZCA9IHZlY19zdWIoRiwgQWQpO1wKKyAgICBIZCA9IHZlY19hZGQoQmQsIEgpO1wKK1wKKyAgICBiMCA9IFNISUZUKHZlY19hZGQoR2QsIENkKSk7XAorICAgIGI3ID0gU0hJRlQodmVjX3N1YihHZCwgQ2QpKTtcCitcCisgICAgYjEgPSBTSElGVCh2ZWNfYWRkKEFkZCwgSGQpKTtcCisgICAgYjIgPSBTSElGVCh2ZWNfc3ViKEFkZCwgSGQpKTtcCitcCisgICAgYjMgPSBTSElGVCh2ZWNfYWRkKEVkLCBEZCkpO1wKKyAgICBiNCA9IFNISUZUKHZlY19zdWIoRWQsIERkKSk7XAorXAorICAgIGI1ID0gU0hJRlQodmVjX2FkZChGZCwgQmRkKSk7XAorICAgIGI2ID0gU0hJRlQodmVjX3N1YihGZCwgQmRkKSk7CisKKyNkZWZpbmUgTk9QKGEpIGEKKyNkZWZpbmUgQUREOChhKSB2ZWNfYWRkKGEsIGVpZ2h0KQorI2RlZmluZSBTSElGVDQoYSkgdmVjX3NyYShhLCBmb3VyKQorCitzdGF0aWMgdm9pZCB2cDNfaWRjdF9wdXRfYWx0aXZlYyh1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludDE2X3QgYmxvY2tbNjRdKQoreworICAgIHZlY191OCB0OworICAgIElEQ1RfU1RBUlQKKworICAgIC8vIHBpeGVscyBhcmUgc2lnbmVkOyBzbyBhZGQgMTI4KjE2IGluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwgOAorICAgIHZlY19zMTYgdjIwNDggPSB2ZWNfc2wodmVjX3NwbGF0X3MxNigxKSwgdmVjX3NwbGF0X3UxNigxMSkpOworICAgIGVpZ2h0ID0gdmVjX2FkZChlaWdodCwgdjIwNDgpOworCisgICAgSURDVF8xRChOT1AsIE5PUCkKKyAgICBUUkFOU1BPU0U4KGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNyk7CisgICAgSURDVF8xRChBREQ4LCBTSElGVDQpCisKKyNkZWZpbmUgUFVUKGEpXAorICAgIHQgPSB2ZWNfcGFja3N1KGEsIGEpO1wKKyAgICB2ZWNfc3RlKCh2ZWNfdTMyKXQsIDAsICh1bnNpZ25lZCBpbnQgKilkc3QpO1wKKyAgICB2ZWNfc3RlKCh2ZWNfdTMyKXQsIDQsICh1bnNpZ25lZCBpbnQgKilkc3QpOworCisgICAgUFVUKGIwKSAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICBQVVQoYjEpICAgICBkc3QgKz0gc3RyaWRlOworICAgIFBVVChiMikgICAgIGRzdCArPSBzdHJpZGU7CisgICAgUFVUKGIzKSAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICBQVVQoYjQpICAgICBkc3QgKz0gc3RyaWRlOworICAgIFBVVChiNSkgICAgIGRzdCArPSBzdHJpZGU7CisgICAgUFVUKGI2KSAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICBQVVQoYjcpCisgICAgbWVtc2V0KGJsb2NrLCAwLCBzaXplb2YoKmJsb2NrKSAqIDY0KTsKK30KKworc3RhdGljIHZvaWQgdnAzX2lkY3RfYWRkX2FsdGl2ZWModWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLCBpbnQxNl90IGJsb2NrWzY0XSkKK3sKKyAgICBMT0FEX1pFUk87CisgICAgdmVjX3U4IHQsIHZkc3Q7CisgICAgdmVjX3MxNiB2ZHN0XzE2OworICAgIHZlY191OCB2ZHN0X21hc2sgPSB2ZWNfbWVyZ2VoKHZlY19zcGxhdF91OCgtMSksIHZlY19sdnNsKDAsIGRzdCkpOworCisgICAgSURDVF9TVEFSVAorCisgICAgSURDVF8xRChOT1AsIE5PUCkKKyAgICBUUkFOU1BPU0U4KGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNyk7CisgICAgSURDVF8xRChBREQ4LCBTSElGVDQpCisKKyNkZWZpbmUgQUREKGEpXAorICAgIHZkc3QgPSB2ZWNfbGQoMCwgZHN0KTtcCisgICAgdmRzdF8xNiA9ICh2ZWNfczE2KXZlY19wZXJtKHZkc3QsIHplcm9fdTh2LCB2ZHN0X21hc2spO1wKKyAgICB2ZHN0XzE2ID0gdmVjX2FkZHMoYSwgdmRzdF8xNik7XAorICAgIHQgPSB2ZWNfcGFja3N1KHZkc3RfMTYsIHZkc3RfMTYpO1wKKyAgICB2ZWNfc3RlKCh2ZWNfdTMyKXQsIDAsICh1bnNpZ25lZCBpbnQgKilkc3QpO1wKKyAgICB2ZWNfc3RlKCh2ZWNfdTMyKXQsIDQsICh1bnNpZ25lZCBpbnQgKilkc3QpOworCisgICAgQUREKGIwKSAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICBBREQoYjEpICAgICBkc3QgKz0gc3RyaWRlOworICAgIEFERChiMikgICAgIGRzdCArPSBzdHJpZGU7CisgICAgQUREKGIzKSAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICBBREQoYjQpICAgICBkc3QgKz0gc3RyaWRlOworICAgIEFERChiNSkgICAgIGRzdCArPSBzdHJpZGU7CisgICAgQUREKGI2KSAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICBBREQoYjcpCisgICAgbWVtc2V0KGJsb2NrLCAwLCBzaXplb2YoKmJsb2NrKSAqIDY0KTsKK30KKworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworCithdl9jb2xkIHZvaWQgZmZfdnAzZHNwX2luaXRfcHBjKFZQM0RTUENvbnRleHQgKmMsIGludCBmbGFncykKK3sKKyNpZiBIQVZFX0FMVElWRUMKKyAgICBpZiAoIVBQQ19BTFRJVkVDKGF2X2dldF9jcHVfZmxhZ3MoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGMtPmlkY3RfcHV0ID0gdnAzX2lkY3RfcHV0X2FsdGl2ZWM7CisgICAgYy0+aWRjdF9hZGQgPSB2cDNfaWRjdF9hZGRfYWx0aXZlYzsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL3ZwOGRzcF9hbHRpdmVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcGMvdnA4ZHNwX2FsdGl2ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWZmOGNjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHBjL3ZwOGRzcF9hbHRpdmVjLmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBWUDggY29tcGF0aWJsZSB2aWRlbyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIERhdmlkIENvbnJhZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92cDhkc3AuaCIKKyNpbmNsdWRlICJocGVsZHNwX2FsdGl2ZWMuaCIKKworI2lmIEhBVkVfQUxUSVZFQworI2RlZmluZSBSRVBUNCguLi4pIHsgX19WQV9BUkdTX18sIF9fVkFfQVJHU19fLCBfX1ZBX0FSR1NfXywgX19WQV9BUkdTX18gfQorCisvLyBoIHN1YnBlbCBmaWx0ZXIgdXNlcyBtc3VtIHRvIG11bHRpcGx5K2FkZCA0IHBpeGVsIHRhcHMgYXQgb25jZQorc3RhdGljIGNvbnN0IHZlY19zOCBoX3N1YnBlbF9maWx0ZXJzX2lubmVyWzddID0KK3sKKyAgICBSRVBUNCggLTYsIDEyMywgIDEyLCAgLTEpLAorICAgIFJFUFQ0KC0xMSwgMTA4LCAgMzYsICAtOCksCisgICAgUkVQVDQoIC05LCAgOTMsICA1MCwgIC02KSwKKyAgICBSRVBUNCgtMTYsICA3NywgIDc3LCAtMTYpLAorICAgIFJFUFQ0KCAtNiwgIDUwLCAgOTMsICAtOSksCisgICAgUkVQVDQoIC04LCAgMzYsIDEwOCwgLTExKSwKKyAgICBSRVBUNCggLTEsICAxMiwgMTIzLCAgLTYpLAorfTsKKworLy8gZm9yIDZ0YXAgZmlsdGVycywgdGhlc2UgYXJlIHRoZSBvdXRlciB0d28gdGFwcworLy8gVGhlIHplcm9zIG1hc2sgb2ZmIHBpeGVscyA0LTcgd2hlbiBmaWx0ZXJpbmcgMC0zCisvLyBhbmQgdmljZS12ZXJzYQorc3RhdGljIGNvbnN0IHZlY19zOCBoX3N1YnBlbF9maWx0ZXJzX291dGVyWzNdID0KK3sKKyAgICBSRVBUNCgwLCAwLCAyLCAxKSwKKyAgICBSRVBUNCgwLCAwLCAzLCAzKSwKKyAgICBSRVBUNCgwLCAwLCAxLCAyKSwKK307CisKKyNkZWZpbmUgTE9BRF9IX1NVQlBFTF9GSUxURVIoaSkgXAorICAgIHZlY19zOCBmaWx0ZXJfaW5uZXIgID0gaF9zdWJwZWxfZmlsdGVyc19pbm5lcltpXTsgXAorICAgIHZlY19zOCBmaWx0ZXJfb3V0ZXJoID0gaF9zdWJwZWxfZmlsdGVyc19vdXRlclsoaSk+PjFdOyBcCisgICAgdmVjX3M4IGZpbHRlcl9vdXRlcmwgPSB2ZWNfc2xkKGZpbHRlcl9vdXRlcmgsIGZpbHRlcl9vdXRlcmgsIDIpCisKKyNkZWZpbmUgRklMVEVSX0goZHN0diwgb2ZmKSBcCisgICAgYSA9IHZlY19sZCgob2ZmKS1pczZ0YXAtMSwgICAgc3JjKTsgXAorICAgIGIgPSB2ZWNfbGQoKG9mZiktaXM2dGFwLTErMTUsIHNyYyk7IFwKK1wKKyAgICBwaXhoICA9IHZlY19wZXJtKGEsIGIsIHBlcm1oIyNvZmYpOyBcCisgICAgcGl4bCAgPSB2ZWNfcGVybShhLCBiLCBwZXJtbCMjb2ZmKTsgXAorICAgIGZpbHRoID0gdmVjX21zdW0oZmlsdGVyX2lubmVyLCBwaXhoLCBjNjQpOyBcCisgICAgZmlsdGwgPSB2ZWNfbXN1bShmaWx0ZXJfaW5uZXIsIHBpeGwsIGM2NCk7IFwKK1wKKyAgICBpZiAoaXM2dGFwKSB7IFwKKyAgICAgICAgb3V0ZXIgPSB2ZWNfcGVybShhLCBiLCBwZXJtXzZ0YXAjI29mZik7IFwKKyAgICAgICAgZmlsdGggPSB2ZWNfbXN1bShmaWx0ZXJfb3V0ZXJoLCBvdXRlciwgZmlsdGgpOyBcCisgICAgICAgIGZpbHRsID0gdmVjX21zdW0oZmlsdGVyX291dGVybCwgb3V0ZXIsIGZpbHRsKTsgXAorICAgIH0gXAorICAgIGlmICh3ID09IDQpIFwKKyAgICAgICAgZmlsdGwgPSBmaWx0aDsgLyogZGlzY2FyZCBwaXhlbHMgNC03ICovIFwKKyAgICBkc3R2ID0gdmVjX3BhY2tzKGZpbHRoLCBmaWx0bCk7IFwKKyAgICBkc3R2ID0gdmVjX3NyYShkc3R2LCBjNykKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgcHV0X3ZwOF9lcGVsX2hfYWx0aXZlY19jb3JlKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgaW50IHcsIGludCBpczZ0YXApCit7CisgICAgTE9BRF9IX1NVQlBFTF9GSUxURVIobXgtMSk7CisgICAgdmVjX3U4IGFsaWduX3ZlYzAsIGFsaWduX3ZlYzgsIHBlcm1oMCwgcGVybWg4LCBmaWx0OworICAgIHZlY191OCBwZXJtXzZ0YXAwLCBwZXJtXzZ0YXA4LCBwZXJtbDAsIHBlcm1sODsKKyAgICB2ZWNfdTggYSwgYiwgcGl4aCwgcGl4bCwgb3V0ZXI7CisgICAgdmVjX3MxNiBmMTZoLCBmMTZsOworICAgIHZlY19zMzIgZmlsdGgsIGZpbHRsOworCisgICAgdmVjX3U4IHBlcm1faW5uZXI2ID0geyAxLDIsMyw0LCAyLDMsNCw1LCAzLDQsNSw2LCA0LDUsNiw3IH07CisgICAgdmVjX3U4IHBlcm1faW5uZXI0ID0geyAwLDEsMiwzLCAxLDIsMyw0LCAyLDMsNCw1LCAzLDQsNSw2IH07CisgICAgdmVjX3U4IHBlcm1faW5uZXIgID0gaXM2dGFwID8gcGVybV9pbm5lcjYgOiBwZXJtX2lubmVyNDsKKyAgICB2ZWNfdTggcGVybV9vdXRlciA9IHsgNCw5LCAwLDUsIDUsMTAsIDEsNiwgNiwxMSwgMiw3LCA3LDEyLCAzLDggfTsKKyAgICB2ZWNfczMyIGM2NCA9IHZlY19zbCh2ZWNfc3BsYXRfczMyKDEpLCB2ZWNfc3BsYXRfdTMyKDYpKTsKKyAgICB2ZWNfdTE2IGM3ICA9IHZlY19zcGxhdF91MTYoNyk7CisKKyAgICBhbGlnbl92ZWMwID0gdmVjX2x2c2woIC1pczZ0YXAtMSwgc3JjKTsKKyAgICBhbGlnbl92ZWM4ID0gdmVjX2x2c2woOC1pczZ0YXAtMSwgc3JjKTsKKworICAgIHBlcm1oMCAgICAgPSB2ZWNfcGVybShhbGlnbl92ZWMwLCBhbGlnbl92ZWMwLCBwZXJtX2lubmVyKTsKKyAgICBwZXJtaDggICAgID0gdmVjX3Blcm0oYWxpZ25fdmVjOCwgYWxpZ25fdmVjOCwgcGVybV9pbm5lcik7CisgICAgcGVybV9pbm5lciA9IHZlY19hZGQocGVybV9pbm5lciwgdmVjX3NwbGF0X3U4KDQpKTsKKyAgICBwZXJtbDAgICAgID0gdmVjX3Blcm0oYWxpZ25fdmVjMCwgYWxpZ25fdmVjMCwgcGVybV9pbm5lcik7CisgICAgcGVybWw4ICAgICA9IHZlY19wZXJtKGFsaWduX3ZlYzgsIGFsaWduX3ZlYzgsIHBlcm1faW5uZXIpOworICAgIHBlcm1fNnRhcDAgPSB2ZWNfcGVybShhbGlnbl92ZWMwLCBhbGlnbl92ZWMwLCBwZXJtX291dGVyKTsKKyAgICBwZXJtXzZ0YXA4ID0gdmVjX3Blcm0oYWxpZ25fdmVjOCwgYWxpZ25fdmVjOCwgcGVybV9vdXRlcik7CisKKyAgICB3aGlsZSAoaCAtLT4gMCkgeworICAgICAgICBGSUxURVJfSChmMTZoLCAwKTsKKworICAgICAgICBpZiAodyA9PSAxNikgeworICAgICAgICAgICAgRklMVEVSX0goZjE2bCwgOCk7CisgICAgICAgICAgICBmaWx0ID0gdmVjX3BhY2tzdShmMTZoLCBmMTZsKTsKKyAgICAgICAgICAgIHZlY19zdChmaWx0LCAwLCBkc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsdCA9IHZlY19wYWNrc3UoZjE2aCwgZjE2aCk7CisgICAgICAgICAgICB2ZWNfc3RlKCh2ZWNfdTMyKWZpbHQsIDAsICh1aW50MzJfdCopZHN0KTsKKyAgICAgICAgICAgIGlmICh3ID09IDgpCisgICAgICAgICAgICAgICAgdmVjX3N0ZSgodmVjX3UzMilmaWx0LCA0LCAodWludDMyX3QqKWRzdCk7CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIH0KK30KKworLy8gdiBzdWJwZWwgZmlsdGVyIGRvZXMgYSBzaW1wbGUgdmVydGljYWwgbXVsdGlwbHkgKyBhZGQKK3N0YXRpYyBjb25zdCB2ZWNfdTggdl9zdWJwZWxfZmlsdGVyc1s3XSA9Cit7CisgICAgeyAwLCAgIDYsIDEyMywgIDEyLCAgIDEsICAgMCB9LAorICAgIHsgMiwgIDExLCAxMDgsICAzNiwgICA4LCAgIDEgfSwKKyAgICB7IDAsICAgOSwgIDkzLCAgNTAsICAgNiwgICAwIH0sCisgICAgeyAzLCAgMTYsICA3NywgIDc3LCAgMTYsICAgMyB9LAorICAgIHsgMCwgICA2LCAgNTAsICA5MywgICA5LCAgIDAgfSwKKyAgICB7IDEsICAgOCwgIDM2LCAxMDgsICAxMSwgICAyIH0sCisgICAgeyAwLCAgIDEsICAxMiwgMTIzLCAgIDYsICAgMCB9LAorfTsKKworI2RlZmluZSBMT0FEX1ZfU1VCUEVMX0ZJTFRFUihpKSBcCisgICAgdmVjX3U4IHN1YnBlbF9maWx0ZXIgPSB2X3N1YnBlbF9maWx0ZXJzW2ldOyBcCisgICAgdmVjX3U4IGYwID0gdmVjX3NwbGF0KHN1YnBlbF9maWx0ZXIsIDApOyBcCisgICAgdmVjX3U4IGYxID0gdmVjX3NwbGF0KHN1YnBlbF9maWx0ZXIsIDEpOyBcCisgICAgdmVjX3U4IGYyID0gdmVjX3NwbGF0KHN1YnBlbF9maWx0ZXIsIDIpOyBcCisgICAgdmVjX3U4IGYzID0gdmVjX3NwbGF0KHN1YnBlbF9maWx0ZXIsIDMpOyBcCisgICAgdmVjX3U4IGY0ID0gdmVjX3NwbGF0KHN1YnBlbF9maWx0ZXIsIDQpOyBcCisgICAgdmVjX3U4IGY1ID0gdmVjX3NwbGF0KHN1YnBlbF9maWx0ZXIsIDUpCisKKyNkZWZpbmUgRklMVEVSX1YoZHN0diwgdmVjX211bCkgXAorICAgIHMxZiA9ICh2ZWNfczE2KXZlY19tdWwoczEsIGYxKTsgXAorICAgIHMyZiA9ICh2ZWNfczE2KXZlY19tdWwoczIsIGYyKTsgXAorICAgIHMzZiA9ICh2ZWNfczE2KXZlY19tdWwoczMsIGYzKTsgXAorICAgIHM0ZiA9ICh2ZWNfczE2KXZlY19tdWwoczQsIGY0KTsgXAorICAgIHMyZiA9IHZlY19zdWJzKHMyZiwgczFmKTsgXAorICAgIHMzZiA9IHZlY19zdWJzKHMzZiwgczRmKTsgXAorICAgIGlmIChpczZ0YXApIHsgXAorICAgICAgICBzMGYgPSAodmVjX3MxNil2ZWNfbXVsKHMwLCBmMCk7IFwKKyAgICAgICAgczVmID0gKHZlY19zMTYpdmVjX211bChzNSwgZjUpOyBcCisgICAgICAgIHMyZiA9IHZlY19hZGRzKHMyZiwgczBmKTsgXAorICAgICAgICBzM2YgPSB2ZWNfYWRkcyhzM2YsIHM1Zik7IFwKKyAgICB9IFwKKyAgICBkc3R2ID0gdmVjX2FkZHMoczJmLCBzM2YpOyBcCisgICAgZHN0diA9IHZlY19hZGRzKGRzdHYsIGM2NCk7IFwKKyAgICBkc3R2ID0gdmVjX3NyYShkc3R2LCBjNykKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgcHV0X3ZwOF9lcGVsX3ZfYWx0aXZlY19jb3JlKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteSwgaW50IHcsIGludCBpczZ0YXApCit7CisgICAgTE9BRF9WX1NVQlBFTF9GSUxURVIobXktMSk7CisgICAgdmVjX3U4IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIGZpbHQsIGFsaWduX3ZlY2gsIHBlcm1fdmVjLCBhbGlnbl92ZWNsOworICAgIHZlY19zMTYgczBmLCBzMWYsIHMyZiwgczNmLCBzNGYsIHM1ZiwgZjE2aCwgZjE2bDsKKyAgICB2ZWNfczE2IGM2NCA9IHZlY19zbCh2ZWNfc3BsYXRfczE2KDEpLCB2ZWNfc3BsYXRfdTE2KDYpKTsKKyAgICB2ZWNfdTE2IGM3ICA9IHZlY19zcGxhdF91MTYoNyk7CisKKyAgICAvLyB3ZSB3YW50IHBpeGVscyAwLTcgdG8gYmUgaW4gdGhlIGV2ZW4gcG9zaXRpb25zIGFuZCA4LTE1IGluIHRoZSBvZGQsCisgICAgLy8gc28gY29tYmluZSB0aGlzIHBlcm11dGUgd2l0aCB0aGUgYWxpZ25tZW50IHBlcm11dGUgdmVjdG9yCisgICAgYWxpZ25fdmVjaCA9IHZlY19sdnNsKDAsIHNyYyk7CisgICAgYWxpZ25fdmVjbCA9IHZlY19zbGQoYWxpZ25fdmVjaCwgYWxpZ25fdmVjaCwgOCk7CisgICAgaWYgKHcgPT0xNikKKyAgICAgICAgcGVybV92ZWMgPSB2ZWNfbWVyZ2VoKGFsaWduX3ZlY2gsIGFsaWduX3ZlY2wpOworICAgIGVsc2UKKyAgICAgICAgcGVybV92ZWMgPSB2ZWNfbWVyZ2VoKGFsaWduX3ZlY2gsIGFsaWduX3ZlY2gpOworCisgICAgaWYgKGlzNnRhcCkKKyAgICAgICAgczAgPSBsb2FkX3dpdGhfcGVybV92ZWMoLTIqc3JjX3N0cmlkZSwgc3JjLCBwZXJtX3ZlYyk7CisgICAgczEgPSBsb2FkX3dpdGhfcGVybV92ZWMoLTEqc3JjX3N0cmlkZSwgc3JjLCBwZXJtX3ZlYyk7CisgICAgczIgPSBsb2FkX3dpdGhfcGVybV92ZWMoIDAqc3JjX3N0cmlkZSwgc3JjLCBwZXJtX3ZlYyk7CisgICAgczMgPSBsb2FkX3dpdGhfcGVybV92ZWMoIDEqc3JjX3N0cmlkZSwgc3JjLCBwZXJtX3ZlYyk7CisgICAgaWYgKGlzNnRhcCkKKyAgICAgICAgczQgPSBsb2FkX3dpdGhfcGVybV92ZWMoIDIqc3JjX3N0cmlkZSwgc3JjLCBwZXJtX3ZlYyk7CisKKyAgICBzcmMgKz0gKDIraXM2dGFwKSpzcmNfc3RyaWRlOworCisgICAgd2hpbGUgKGggLS0+IDApIHsKKyAgICAgICAgaWYgKGlzNnRhcCkKKyAgICAgICAgICAgIHM1ID0gbG9hZF93aXRoX3Blcm1fdmVjKDAsIHNyYywgcGVybV92ZWMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzNCA9IGxvYWRfd2l0aF9wZXJtX3ZlYygwLCBzcmMsIHBlcm1fdmVjKTsKKworICAgICAgICBGSUxURVJfVihmMTZoLCB2ZWNfbXVsZSk7CisKKyAgICAgICAgaWYgKHcgPT0gMTYpIHsKKyAgICAgICAgICAgIEZJTFRFUl9WKGYxNmwsIHZlY19tdWxvKTsKKyAgICAgICAgICAgIGZpbHQgPSB2ZWNfcGFja3N1KGYxNmgsIGYxNmwpOworICAgICAgICAgICAgdmVjX3N0KGZpbHQsIDAsIGRzdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWx0ID0gdmVjX3BhY2tzdShmMTZoLCBmMTZoKTsKKyAgICAgICAgICAgIGlmICh3ID09IDQpCisgICAgICAgICAgICAgICAgZmlsdCA9ICh2ZWNfdTgpdmVjX3NwbGF0KCh2ZWNfdTMyKWZpbHQsIDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZlY19zdGUoKHZlY191MzIpZmlsdCwgNCwgKHVpbnQzMl90Kilkc3QpOworICAgICAgICAgICAgdmVjX3N0ZSgodmVjX3UzMilmaWx0LCAwLCAodWludDMyX3QqKWRzdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXM2dGFwKQorICAgICAgICAgICAgczAgPSBzMTsKKyAgICAgICAgczEgPSBzMjsKKyAgICAgICAgczIgPSBzMzsKKyAgICAgICAgczMgPSBzNDsKKyAgICAgICAgaWYgKGlzNnRhcCkKKyAgICAgICAgICAgIHM0ID0gczU7CisKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KK30KKworI2RlZmluZSBFUEVMX0ZVTkNTKFdJRFRILCBUQVBTKSBcCitzdGF0aWMgYXZfbm9pbmxpbmUgXAordm9pZCBwdXRfdnA4X2VwZWwgIyMgV0lEVEggIyMgX2ggIyMgVEFQUyAjIyBfYWx0aXZlYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpIFwKK3sgXAorICAgIHB1dF92cDhfZXBlbF9oX2FsdGl2ZWNfY29yZShkc3QsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgaCwgbXgsIFdJRFRILCBUQVBTID09IDYpOyBcCit9IFwKK1wKK3N0YXRpYyBhdl9ub2lubGluZSBcCit2b2lkIHB1dF92cDhfZXBlbCAjIyBXSURUSCAjIyBfdiAjIyBUQVBTICMjIF9hbHRpdmVjKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19zdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkgXAoreyBcCisgICAgcHV0X3ZwOF9lcGVsX3ZfYWx0aXZlY19jb3JlKGRzdCwgZHN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCBoLCBteSwgV0lEVEgsIFRBUFMgPT0gNik7IFwKK30KKworI2RlZmluZSBFUEVMX0hWKFdJRFRILCBIVEFQUywgVlRBUFMpIFwKK3N0YXRpYyB2b2lkIHB1dF92cDhfZXBlbCAjIyBXSURUSCAjIyBfaCAjIyBIVEFQUyAjIyB2ICMjIFZUQVBTICMjIF9hbHRpdmVjKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHJpZGUsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkgXAoreyBcCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCB0bXApWygyKldJRFRIKzUpKjE2XTsgXAorICAgIGlmIChWVEFQUyA9PSA2KSB7IFwKKyAgICAgICAgcHV0X3ZwOF9lcGVsICMjIFdJRFRIICMjIF9oICMjIEhUQVBTICMjIF9hbHRpdmVjKHRtcCwgMTYsICAgICAgc3JjLTIqc3N0cmlkZSwgc3N0cmlkZSwgaCs1LCBteCwgbXkpOyBcCisgICAgICAgIHB1dF92cDhfZXBlbCAjIyBXSURUSCAjIyBfdiAjIyBWVEFQUyAjIyBfYWx0aXZlYyhkc3QsIGRzdHJpZGUsIHRtcCsyKjE2LCAgICAgIDE2LCAgICAgIGgsICAgbXgsIG15KTsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgcHV0X3ZwOF9lcGVsICMjIFdJRFRIICMjIF9oICMjIEhUQVBTICMjIF9hbHRpdmVjKHRtcCwgMTYsICAgICAgc3JjLXNzdHJpZGUsIHNzdHJpZGUsIGgrNCwgbXgsIG15KTsgXAorICAgICAgICBwdXRfdnA4X2VwZWwgIyMgV0lEVEggIyMgX3YgIyMgVlRBUFMgIyMgX2FsdGl2ZWMoZHN0LCBkc3RyaWRlLCB0bXArMTYsICAgICAgMTYsICAgICAgaCwgICBteCwgbXkpOyBcCisgICAgfSBcCit9CisKK0VQRUxfRlVOQ1MoMTYsNikKK0VQRUxfRlVOQ1MoOCwgNikKK0VQRUxfRlVOQ1MoOCwgNCkKK0VQRUxfRlVOQ1MoNCwgNikKK0VQRUxfRlVOQ1MoNCwgNCkKKworRVBFTF9IVigxNiwgNiw2KQorRVBFTF9IVig4LCAgNiw2KQorRVBFTF9IVig4LCAgNCw2KQorRVBFTF9IVig4LCAgNiw0KQorRVBFTF9IVig4LCAgNCw0KQorRVBFTF9IVig0LCAgNiw2KQorRVBFTF9IVig0LCAgNCw2KQorRVBFTF9IVig0LCAgNiw0KQorRVBFTF9IVig0LCAgNCw0KQorCitzdGF0aWMgdm9pZCBwdXRfdnA4X3BpeGVsczE2X2FsdGl2ZWModWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0cmlkZSwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQoreworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeGVsc3YxLCBwaXhlbHN2MjsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXhlbHN2MUIsIHBpeGVsc3YyQjsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXhlbHN2MUMsIHBpeGVsc3YyQzsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciBwaXhlbHN2MUQsIHBpeGVsc3YyRDsKKworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm0gPSB2ZWNfbHZzbCgwLCBzcmMpOworICAgIGludCBpOworICAgIHJlZ2lzdGVyIHB0cmRpZmZfdCBkc3RyaWRlMiA9IGRzdHJpZGUgPDwgMSwgc3N0cmlkZTIgPSBzc3RyaWRlIDw8IDE7CisgICAgcmVnaXN0ZXIgcHRyZGlmZl90IGRzdHJpZGUzID0gZHN0cmlkZTIgKyBkc3RyaWRlLCBzc3RyaWRlMyA9IHNzdHJpZGUgKyBzc3RyaWRlMjsKKyAgICByZWdpc3RlciBwdHJkaWZmX3QgZHN0cmlkZTQgPSBkc3RyaWRlIDw8IDIsIHNzdHJpZGU0ID0gc3N0cmlkZSA8PCAyOworCisvLyBoYW5kLXVucm9sbGluZyB0aGUgbG9vcCBieSA0IGdhaW5zIGFib3V0IDE1JQorLy8gbWluaW51bSBleGVjdXRpb24gdGltZSBnb2VzIGZyb20gNzQgdG8gNjAgY3ljbGVzCisvLyBpdCdzIGZhc3RlciB0aGFuIC1mdW5yb2xsLWxvb3BzLCBidXQgdXNpbmcKKy8vIC1mdW5yb2xsLWxvb3BzIHcvIHRoaXMgaXMgYmFkIC0gNzQgY3ljbGVzIGFnYWluLgorLy8gYWxsIHRoaXMgaXMgb24gYSA3NDUwLCB0dW5pbmcgZm9yIHRoZSA3NDUwCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkgKz0gNCkgeworICAgICAgICBwaXhlbHN2MSAgPSB2ZWNfbGQoIDAsIHNyYyk7CisgICAgICAgIHBpeGVsc3YyICA9IHZlY19sZCgxNSwgc3JjKTsKKyAgICAgICAgcGl4ZWxzdjFCID0gdmVjX2xkKHNzdHJpZGUsIHNyYyk7CisgICAgICAgIHBpeGVsc3YyQiA9IHZlY19sZCgxNSArIHNzdHJpZGUsIHNyYyk7CisgICAgICAgIHBpeGVsc3YxQyA9IHZlY19sZChzc3RyaWRlMiwgc3JjKTsKKyAgICAgICAgcGl4ZWxzdjJDID0gdmVjX2xkKDE1ICsgc3N0cmlkZTIsIHNyYyk7CisgICAgICAgIHBpeGVsc3YxRCA9IHZlY19sZChzc3RyaWRlMywgc3JjKTsKKyAgICAgICAgcGl4ZWxzdjJEID0gdmVjX2xkKDE1ICsgc3N0cmlkZTMsIHNyYyk7CisgICAgICAgIHZlY19zdCh2ZWNfcGVybShwaXhlbHN2MSwgcGl4ZWxzdjIsIHBlcm0pLAorICAgICAgICAgICAgICAgMCwgKHVuc2lnbmVkIGNoYXIqKWRzdCk7CisgICAgICAgIHZlY19zdCh2ZWNfcGVybShwaXhlbHN2MUIsIHBpeGVsc3YyQiwgcGVybSksCisgICAgICAgICAgICAgICBkc3RyaWRlLCAodW5zaWduZWQgY2hhciopZHN0KTsKKyAgICAgICAgdmVjX3N0KHZlY19wZXJtKHBpeGVsc3YxQywgcGl4ZWxzdjJDLCBwZXJtKSwKKyAgICAgICAgICAgICAgIGRzdHJpZGUyLCAodW5zaWduZWQgY2hhciopZHN0KTsKKyAgICAgICAgdmVjX3N0KHZlY19wZXJtKHBpeGVsc3YxRCwgcGl4ZWxzdjJELCBwZXJtKSwKKyAgICAgICAgICAgICAgIGRzdHJpZGUzLCAodW5zaWduZWQgY2hhciopZHN0KTsKKyAgICAgICAgc3JjICs9IHNzdHJpZGU0OworICAgICAgICBkc3QgKz0gZHN0cmlkZTQ7CisgICAgfQorfQorCisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCisKKworYXZfY29sZCB2b2lkIGZmX3ZwNzhkc3BfaW5pdF9wcGMoVlA4RFNQQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFX0FMVElWRUMKKyAgICBpZiAoIVBQQ19BTFRJVkVDKGF2X2dldF9jcHVfZmxhZ3MoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGMtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzBdWzBdWzBdID0gcHV0X3ZwOF9waXhlbHMxNl9hbHRpdmVjOworICAgIGMtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzBdWzBdWzJdID0gcHV0X3ZwOF9lcGVsMTZfaDZfYWx0aXZlYzsKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlswXVsyXVswXSA9IHB1dF92cDhfZXBlbDE2X3Y2X2FsdGl2ZWM7CisgICAgYy0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMF1bMl1bMl0gPSBwdXRfdnA4X2VwZWwxNl9oNnY2X2FsdGl2ZWM7CisKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVswXVsyXSA9IHB1dF92cDhfZXBlbDhfaDZfYWx0aXZlYzsKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVsyXVswXSA9IHB1dF92cDhfZXBlbDhfdjZfYWx0aXZlYzsKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVswXVsxXSA9IHB1dF92cDhfZXBlbDhfaDRfYWx0aXZlYzsKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVsxXVswXSA9IHB1dF92cDhfZXBlbDhfdjRfYWx0aXZlYzsKKworICAgIGMtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzFdWzJdWzJdID0gcHV0X3ZwOF9lcGVsOF9oNnY2X2FsdGl2ZWM7CisgICAgYy0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMV1bMV1bMV0gPSBwdXRfdnA4X2VwZWw4X2g0djRfYWx0aXZlYzsKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVsxXVsyXSA9IHB1dF92cDhfZXBlbDhfaDZ2NF9hbHRpdmVjOworICAgIGMtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzFdWzJdWzFdID0gcHV0X3ZwOF9lcGVsOF9oNHY2X2FsdGl2ZWM7CisKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVswXVsyXSA9IHB1dF92cDhfZXBlbDRfaDZfYWx0aXZlYzsKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVsyXVswXSA9IHB1dF92cDhfZXBlbDRfdjZfYWx0aXZlYzsKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVswXVsxXSA9IHB1dF92cDhfZXBlbDRfaDRfYWx0aXZlYzsKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVsxXVswXSA9IHB1dF92cDhfZXBlbDRfdjRfYWx0aXZlYzsKKworICAgIGMtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzJdWzJdWzJdID0gcHV0X3ZwOF9lcGVsNF9oNnY2X2FsdGl2ZWM7CisgICAgYy0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMl1bMV1bMV0gPSBwdXRfdnA4X2VwZWw0X2g0djRfYWx0aXZlYzsKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVsxXVsyXSA9IHB1dF92cDhfZXBlbDRfaDZ2NF9hbHRpdmVjOworICAgIGMtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzJdWzJdWzFdID0gcHV0X3ZwOF9lcGVsNF9oNHY2X2FsdGl2ZWM7CisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcm9yZXNkYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcm9yZXNkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0OWI1YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Byb3Jlc2RhdGEuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogQXBwbGUgUHJvUmVzIGNvbXBhdGlibGUgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE1heGltIFBvbGlha292c2tpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJwcm9yZXNkYXRhLmgiCisKK2NvbnN0IHVpbnQ4X3QgZmZfcHJvcmVzX3Byb2dyZXNzaXZlX3NjYW5bNjRdID0geworICAgICAwLCAgMSwgIDgsICA5LCAgMiwgIDMsIDEwLCAxMSwKKyAgICAxNiwgMTcsIDI0LCAyNSwgMTgsIDE5LCAyNiwgMjcsCisgICAgIDQsICA1LCAxMiwgMjAsIDEzLCAgNiwgIDcsIDE0LAorICAgIDIxLCAyOCwgMjksIDIyLCAxNSwgMjMsIDMwLCAzMSwKKyAgICAzMiwgMzMsIDQwLCA0OCwgNDEsIDM0LCAzNSwgNDIsCisgICAgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwgMzcsIDQ0LAorICAgIDUxLCA1OCwgNTksIDUyLCA0NSwgMzgsIDM5LCA0NiwKKyAgICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfcHJvcmVzX2ludGVybGFjZWRfc2Nhbls2NF0gPSB7CisgICAgIDAsICA4LCAgMSwgIDksIDE2LCAyNCwgMTcsIDI1LAorICAgICAyLCAxMCwgIDMsIDExLCAxOCwgMjYsIDE5LCAyNywKKyAgICAzMiwgNDAsIDMzLCAzNCwgNDEsIDQ4LCA1NiwgNDksCisgICAgNDIsIDM1LCA0MywgNTAsIDU3LCA1OCwgNTEsIDU5LAorICAgICA0LCAxMiwgIDUsICA2LCAxMywgMjAsIDI4LCAyMSwKKyAgICAxNCwgIDcsIDE1LCAyMiwgMjksIDM2LCA0NCwgMzcsCisgICAgMzAsIDIzLCAzMSwgMzgsIDQ1LCA1MiwgNjAsIDUzLAorICAgIDQ2LCAzOSwgNDcsIDU0LCA2MSwgNjIsIDU1LCA2MworfTsKKworCitjb25zdCB1aW50OF90IGZmX3Byb3Jlc19kY19jb2RlYm9va1s0XSA9IHsKKyAgICAweDA0LCAvLyByaWNlX29yZGVyID0gMCwgZXhwX2dvbG9tYl9vcmRlciA9IDEsIHN3aXRjaF9iaXRzID0gMAorICAgIDB4MjgsIC8vIHJpY2Vfb3JkZXIgPSAxLCBleHBfZ29sb21iX29yZGVyID0gMiwgc3dpdGNoX2JpdHMgPSAwCisgICAgMHg0RCwgLy8gcmljZV9vcmRlciA9IDIsIGV4cF9nb2xvbWJfb3JkZXIgPSAzLCBzd2l0Y2hfYml0cyA9IDEKKyAgICAweDcwICAvLyByaWNlX29yZGVyID0gMywgZXhwX2dvbG9tYl9vcmRlciA9IDQsIHN3aXRjaF9iaXRzID0gMAorfTsKKworY29uc3QgdWludDhfdCBmZl9wcm9yZXNfYWNfY29kZWJvb2tbN10gPSB7CisgICAgMHgwNCwgLy8gcmljZV9vcmRlciA9IDAsIGV4cF9nb2xvbWJfb3JkZXIgPSAxLCBzd2l0Y2hfYml0cyA9IDAKKyAgICAweDI4LCAvLyByaWNlX29yZGVyID0gMSwgZXhwX2dvbG9tYl9vcmRlciA9IDIsIHN3aXRjaF9iaXRzID0gMAorICAgIDB4NEMsIC8vIHJpY2Vfb3JkZXIgPSAyLCBleHBfZ29sb21iX29yZGVyID0gMywgc3dpdGNoX2JpdHMgPSAwCisgICAgMHgwNSwgLy8gcmljZV9vcmRlciA9IDAsIGV4cF9nb2xvbWJfb3JkZXIgPSAxLCBzd2l0Y2hfYml0cyA9IDEKKyAgICAweDI5LCAvLyByaWNlX29yZGVyID0gMSwgZXhwX2dvbG9tYl9vcmRlciA9IDIsIHN3aXRjaF9iaXRzID0gMQorICAgIDB4MDYsIC8vIHJpY2Vfb3JkZXIgPSAwLCBleHBfZ29sb21iX29yZGVyID0gMSwgc3dpdGNoX2JpdHMgPSAyCisgICAgMHgwQSwgLy8gcmljZV9vcmRlciA9IDAsIGV4cF9nb2xvbWJfb3JkZXIgPSAyLCBzd2l0Y2hfYml0cyA9IDIKK307CisKKy8qKgorICogTG9va3VwIHRhYmxlcyBmb3IgYWRhcHRpdmUgc3dpdGNoaW5nIGJldHdlZW4gY29kZWJvb2tzCisgKiBhY2NvcmRpbmcgd2l0aCBwcmV2aW91cyBydW4vbGV2ZWwgdmFsdWUuCisgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfcHJvcmVzX3J1bl90b19jYl9pbmRleFsxNl0gPQorICAgIHsgNSwgNSwgMywgMywgMCwgNCwgNCwgNCwgNCwgMSwgMSwgMSwgMSwgMSwgMSwgMiB9OworCitjb25zdCB1aW50OF90IGZmX3Byb3Jlc19sZXZfdG9fY2JfaW5kZXhbMTBdID0geyAwLCA2LCAzLCA1LCAwLCAxLCAxLCAxLCAxLCAyIH07CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcm9yZXNkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9wcm9yZXNkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4Mjc4ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Byb3Jlc2RhdGEuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQXBwbGUgUHJvUmVzIGNvbXBhdGlibGUgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE1heGltIFBvbGlha292c2tpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19QUk9SRVNEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19QUk9SRVNEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEZSQU1FX0lEIE1LQkVUQUcoJ2knLCAnYycsICdwJywgJ2YnKQorCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9wcm9yZXNfcHJvZ3Jlc3NpdmVfc2Nhbls2NF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9wcm9yZXNfaW50ZXJsYWNlZF9zY2FuWzY0XTsKKworI2RlZmluZSBGSVJTVF9EQ19DQiAweEI4IC8vIHJpY2Vfb3JkZXIgPSA1LCBleHBfZ29sb21iX29yZGVyID0gNiwgc3dpdGNoX2JpdHMgPSAwCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9wcm9yZXNfZGNfY29kZWJvb2tbNF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9wcm9yZXNfYWNfY29kZWJvb2tbN107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9wcm9yZXNfcnVuX3RvX2NiX2luZGV4WzE2XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3Byb3Jlc19sZXZfdG9fY2JfaW5kZXhbMTBdOworCisjZW5kaWYgLyogQVZDT0RFQ19QUk9SRVNEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Byb3Jlc2RlYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHJvcmVzZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlZGU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Byb3Jlc2RlYy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBNYXhpbSBQb2xpYWtvdnNraQorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgRWx2aXMgUHJlc2xleQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUFJPUkVTREVDX0gKKyNkZWZpbmUgQVZDT0RFQ19QUk9SRVNERUNfSAorCisjaW5jbHVkZSAiYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJwcm9yZXNkc3AuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisgICAgdW5zaWduZWQgbWJfeDsKKyAgICB1bnNpZ25lZCBtYl95OworICAgIHVuc2lnbmVkIG1iX2NvdW50OworICAgIHVuc2lnbmVkIGRhdGFfc2l6ZTsKKyAgICBpbnQgcmV0OworfSBTbGljZUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCbG9ja0RTUENvbnRleHQgYmRzcDsKKyAgICBQcm9yZXNEU1BDb250ZXh0IHByb2RzcDsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBpbnQgZnJhbWVfdHlwZTsgICAgICAgICAgICAgIC8vLzwgMCA9IHByb2dyZXNzaXZlLCAxID0gdGZmLCAyID0gYmZmCisgICAgdWludDhfdCBxbWF0X2x1bWFbNjRdOworICAgIHVpbnQ4X3QgcW1hdF9jaHJvbWFbNjRdOworICAgIFNsaWNlQ29udGV4dCAqc2xpY2VzOworICAgIGludCBzbGljZV9jb3VudDsgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2Ygc2xpY2VzIGluIHRoZSBjdXJyZW50IHBpY3R1cmUKKyAgICB1bnNpZ25lZCBtYl93aWR0aDsgICAgICAgICAgIC8vLzwgd2lkdGggb2YgdGhlIGN1cnJlbnQgcGljdHVyZSBpbiBtYgorICAgIHVuc2lnbmVkIG1iX2hlaWdodDsgICAgICAgICAgLy8vPCBoZWlnaHQgb2YgdGhlIGN1cnJlbnQgcGljdHVyZSBpbiBtYgorICAgIHVpbnQ4X3QgcHJvZ3Jlc3NpdmVfc2Nhbls2NF07CisgICAgdWludDhfdCBpbnRlcmxhY2VkX3NjYW5bNjRdOworICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW47CisgICAgaW50IGZpcnN0X2ZpZWxkOworICAgIGludCBhbHBoYV9pbmZvOworfSBQcm9yZXNDb250ZXh0OworCisjZW5kaWYgLyogQVZDT0RFQ19QUk9SRVNERUNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHJvcmVzZGVjMi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHJvcmVzZGVjMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMDRhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcm9yZXNkZWMyLmMKQEAgLTAsMCArMSw2ODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBNYXhpbSBQb2xpYWtvdnNraQorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgRWx2aXMgUHJlc2xleQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBLbm93biBGT1VSQ0NzOiAnYXBjaCcgKEhRKSwgJ2FwY24nIChTRCksICdhcGNzJyAoTFQpLCAnYWNwbycgKFByb3h5KSwgJ2FwNGgnICg0NDQ0KQorICovCisKKy8vI2RlZmluZSBERUJVRworCisjZGVmaW5lIExPTkdfQklUU1RSRUFNX1JFQURFUgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic2ltcGxlX2lkY3QuaCIKKyNpbmNsdWRlICJwcm9yZXNkZWMuaCIKKyNpbmNsdWRlICJwcm9yZXNkYXRhLmgiCisKK3N0YXRpYyB2b2lkIHBlcm11dGUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgcGVybXV0YXRpb25bNjRdKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICBkc3RbaV0gPSBwZXJtdXRhdGlvbltzcmNbaV1dOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFByb3Jlc0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCBpZGN0X3Blcm11dGF0aW9uWzY0XTsKKworICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTA7CisKKyAgICBmZl9ibG9ja2RzcF9pbml0KCZjdHgtPmJkc3AsIGF2Y3R4KTsKKyAgICBmZl9wcm9yZXNkc3BfaW5pdCgmY3R4LT5wcm9kc3AsIGF2Y3R4KTsKKworICAgIGZmX2luaXRfc2NhbnRhYmxlX3Blcm11dGF0aW9uKGlkY3RfcGVybXV0YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wcm9kc3AuaWRjdF9wZXJtdXRhdGlvbl90eXBlKTsKKworICAgIHBlcm11dGUoY3R4LT5wcm9ncmVzc2l2ZV9zY2FuLCBmZl9wcm9yZXNfcHJvZ3Jlc3NpdmVfc2NhbiwgaWRjdF9wZXJtdXRhdGlvbik7CisgICAgcGVybXV0ZShjdHgtPmludGVybGFjZWRfc2NhbiwgZmZfcHJvcmVzX2ludGVybGFjZWRfc2NhbiwgaWRjdF9wZXJtdXRhdGlvbik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWVfaGVhZGVyKFByb3Jlc0NvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkYXRhX3NpemUsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgaGRyX3NpemUsIHdpZHRoLCBoZWlnaHQsIGZsYWdzOworICAgIGludCB2ZXJzaW9uOworICAgIGNvbnN0IHVpbnQ4X3QgKnB0cjsKKworICAgIGhkcl9zaXplID0gQVZfUkIxNihidWYpOworICAgIGF2X2Rsb2coYXZjdHgsICJoZWFkZXIgc2l6ZSAlZFxuIiwgaGRyX3NpemUpOworICAgIGlmIChoZHJfc2l6ZSA+IGRhdGFfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yLCB3cm9uZyBoZWFkZXIgc2l6ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHZlcnNpb24gPSBBVl9SQjE2KGJ1ZiArIDIpOworICAgIGF2X2Rsb2coYXZjdHgsICIlLjRzIHZlcnNpb24gJWRcbiIsIGJ1Zis0LCB2ZXJzaW9uKTsKKyAgICBpZiAodmVyc2lvbiA+IDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCB2ZXJzaW9uOiAlZFxuIiwgdmVyc2lvbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICB3aWR0aCAgPSBBVl9SQjE2KGJ1ZiArIDgpOworICAgIGhlaWdodCA9IEFWX1JCMTYoYnVmICsgMTApOworICAgIGlmICh3aWR0aCAhPSBhdmN0eC0+d2lkdGggfHwgaGVpZ2h0ICE9IGF2Y3R4LT5oZWlnaHQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwaWN0dXJlIHJlc29sdXRpb24gY2hhbmdlOiAlZHglZCAtPiAlZHglZFxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBjdHgtPmZyYW1lX3R5cGUgPSAoYnVmWzEyXSA+PiAyKSAmIDM7CisgICAgY3R4LT5hbHBoYV9pbmZvID0gYnVmWzE3XSAmIDB4ZjsKKworICAgIGlmIChjdHgtPmFscGhhX2luZm8gPiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBhbHBoYSBtb2RlICVkXG4iLCBjdHgtPmFscGhhX2luZm8pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGF2Y3R4LT5za2lwX2FscGhhKSBjdHgtPmFscGhhX2luZm8gPSAwOworCisgICAgYXZfZGxvZyhhdmN0eCwgImZyYW1lIHR5cGUgJWRcbiIsIGN0eC0+ZnJhbWVfdHlwZSk7CisKKyAgICBpZiAoY3R4LT5mcmFtZV90eXBlID09IDApIHsKKyAgICAgICAgY3R4LT5zY2FuID0gY3R4LT5wcm9ncmVzc2l2ZV9zY2FuOyAvLyBwZXJtdXRlZAorICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+c2NhbiA9IGN0eC0+aW50ZXJsYWNlZF9zY2FuOyAvLyBwZXJtdXRlZAorICAgICAgICBjdHgtPmZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICAgICAgY3R4LT5mcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ID0gY3R4LT5mcmFtZV90eXBlID09IDE7CisgICAgfQorCisgICAgaWYgKGN0eC0+YWxwaGFfaW5mbykgeworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IChidWZbMTJdICYgMHhDMCkgPT0gMHhDMCA/IEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCA6IEFWX1BJWF9GTVRfWVVWQTQyMlAxMDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IChidWZbMTJdICYgMHhDMCkgPT0gMHhDMCA/IEFWX1BJWF9GTVRfWVVWNDQ0UDEwIDogQVZfUElYX0ZNVF9ZVVY0MjJQMTA7CisgICAgfQorCisgICAgcHRyICAgPSBidWYgKyAyMDsKKyAgICBmbGFncyA9IGJ1ZlsxOV07CisgICAgYXZfZGxvZyhhdmN0eCwgImZsYWdzICV4XG4iLCBmbGFncyk7CisKKyAgICBpZiAoZmxhZ3MgJiAyKSB7CisgICAgICAgIGlmKGJ1ZiArIGRhdGFfc2l6ZSAtIHB0ciA8IDY0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkhlYWRlciB0cnVuY2F0ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgcGVybXV0ZShjdHgtPnFtYXRfbHVtYSwgY3R4LT5wcm9kc3AuaWRjdF9wZXJtdXRhdGlvbiwgcHRyKTsKKyAgICAgICAgcHRyICs9IDY0OworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldChjdHgtPnFtYXRfbHVtYSwgNCwgNjQpOworICAgIH0KKworICAgIGlmIChmbGFncyAmIDEpIHsKKyAgICAgICAgaWYoYnVmICsgZGF0YV9zaXplIC0gcHRyIDwgNjQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSGVhZGVyIHRydW5jYXRlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBwZXJtdXRlKGN0eC0+cW1hdF9jaHJvbWEsIGN0eC0+cHJvZHNwLmlkY3RfcGVybXV0YXRpb24sIHB0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KGN0eC0+cW1hdF9jaHJvbWEsIDQsIDY0KTsKKyAgICB9CisKKyAgICByZXR1cm4gaGRyX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3BpY3R1cmVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCBpbnQgYnVmX3NpemUpCit7CisgICAgUHJvcmVzQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgaGRyX3NpemUsIHNsaWNlX2NvdW50OworICAgIHVuc2lnbmVkIHBpY19kYXRhX3NpemU7CisgICAgaW50IGxvZzJfc2xpY2VfbWJfd2lkdGgsIGxvZzJfc2xpY2VfbWJfaGVpZ2h0OworICAgIGludCBzbGljZV9tYl9jb3VudCwgbWJfeCwgbWJfeTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhX3B0ciwgKmluZGV4X3B0cjsKKworICAgIGhkcl9zaXplID0gYnVmWzBdID4+IDM7CisgICAgaWYgKGhkcl9zaXplIDwgOCB8fCBoZHJfc2l6ZSA+IGJ1Zl9zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IsIHdyb25nIHBpY3R1cmUgaGVhZGVyIHNpemVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBwaWNfZGF0YV9zaXplID0gQVZfUkIzMihidWYgKyAxKTsKKyAgICBpZiAocGljX2RhdGFfc2l6ZSA+IGJ1Zl9zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IsIHdyb25nIHBpY3R1cmUgZGF0YSBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgbG9nMl9zbGljZV9tYl93aWR0aCAgPSBidWZbN10gPj4gNDsKKyAgICBsb2cyX3NsaWNlX21iX2hlaWdodCA9IGJ1Zls3XSAmIDB4RjsKKyAgICBpZiAobG9nMl9zbGljZV9tYl93aWR0aCA+IDMgfHwgbG9nMl9zbGljZV9tYl9oZWlnaHQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBzbGljZSByZXNvbHV0aW9uOiAlZHglZFxuIiwKKyAgICAgICAgICAgICAgIDEgPDwgbG9nMl9zbGljZV9tYl93aWR0aCwgMSA8PCBsb2cyX3NsaWNlX21iX2hlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGN0eC0+bWJfd2lkdGggID0gKGF2Y3R4LT53aWR0aCAgKyAxNSkgPj4gNDsKKyAgICBpZiAoY3R4LT5mcmFtZV90eXBlKQorICAgICAgICBjdHgtPm1iX2hlaWdodCA9IChhdmN0eC0+aGVpZ2h0ICsgMzEpID4+IDU7CisgICAgZWxzZQorICAgICAgICBjdHgtPm1iX2hlaWdodCA9IChhdmN0eC0+aGVpZ2h0ICsgMTUpID4+IDQ7CisKKyAgICBzbGljZV9jb3VudCA9IEFWX1JCMTYoYnVmICsgNSk7CisKKyAgICBpZiAoY3R4LT5zbGljZV9jb3VudCAhPSBzbGljZV9jb3VudCB8fCAhY3R4LT5zbGljZXMpIHsKKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+c2xpY2VzKTsKKyAgICAgICAgY3R4LT5zbGljZXMgPSBhdl9tYWxsb2N6X2FycmF5KHNsaWNlX2NvdW50LCBzaXplb2YoKmN0eC0+c2xpY2VzKSk7CisgICAgICAgIGlmICghY3R4LT5zbGljZXMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBjdHgtPnNsaWNlX2NvdW50ID0gc2xpY2VfY291bnQ7CisgICAgfQorCisgICAgaWYgKCFzbGljZV9jb3VudCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmIChoZHJfc2l6ZSArIHNsaWNlX2NvdW50KjIgPiBidWZfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yLCB3cm9uZyBzbGljZSBjb3VudFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8vIHBhcnNlIHNsaWNlIGluZm9ybWF0aW9uCisgICAgaW5kZXhfcHRyID0gYnVmICsgaGRyX3NpemU7CisgICAgZGF0YV9wdHIgID0gaW5kZXhfcHRyICsgc2xpY2VfY291bnQqMjsKKworICAgIHNsaWNlX21iX2NvdW50ID0gMSA8PCBsb2cyX3NsaWNlX21iX3dpZHRoOworICAgIG1iX3ggPSAwOworICAgIG1iX3kgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHNsaWNlX2NvdW50OyBpKyspIHsKKyAgICAgICAgU2xpY2VDb250ZXh0ICpzbGljZSA9ICZjdHgtPnNsaWNlc1tpXTsKKworICAgICAgICBzbGljZS0+ZGF0YSA9IGRhdGFfcHRyOworICAgICAgICBkYXRhX3B0ciArPSBBVl9SQjE2KGluZGV4X3B0ciArIGkqMik7CisKKyAgICAgICAgd2hpbGUgKGN0eC0+bWJfd2lkdGggLSBtYl94IDwgc2xpY2VfbWJfY291bnQpCisgICAgICAgICAgICBzbGljZV9tYl9jb3VudCA+Pj0gMTsKKworICAgICAgICBzbGljZS0+bWJfeCA9IG1iX3g7CisgICAgICAgIHNsaWNlLT5tYl95ID0gbWJfeTsKKyAgICAgICAgc2xpY2UtPm1iX2NvdW50ID0gc2xpY2VfbWJfY291bnQ7CisgICAgICAgIHNsaWNlLT5kYXRhX3NpemUgPSBkYXRhX3B0ciAtIHNsaWNlLT5kYXRhOworCisgICAgICAgIGlmIChzbGljZS0+ZGF0YV9zaXplIDwgNikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciwgd3Jvbmcgc2xpY2UgZGF0YSBzaXplXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgbWJfeCArPSBzbGljZV9tYl9jb3VudDsKKyAgICAgICAgaWYgKG1iX3ggPT0gY3R4LT5tYl93aWR0aCkgeworICAgICAgICAgICAgc2xpY2VfbWJfY291bnQgPSAxIDw8IGxvZzJfc2xpY2VfbWJfd2lkdGg7CisgICAgICAgICAgICBtYl94ID0gMDsKKyAgICAgICAgICAgIG1iX3krKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0YV9wdHIgPiBidWYgKyBidWZfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciwgc2xpY2Ugb3V0IG9mIGJvdW5kc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtYl94IHx8IG1iX3kgIT0gY3R4LT5tYl9oZWlnaHQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciB3cm9uZyBtYiBjb3VudCB5ICVkIGggJWRcbiIsCisgICAgICAgICAgICAgICBtYl95LCBjdHgtPm1iX2hlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldHVybiBwaWNfZGF0YV9zaXplOworfQorCisjZGVmaW5lIERFQ09ERV9DT0RFV09SRCh2YWwsIGNvZGVib29rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGludCByaWNlX29yZGVyLCBleHBfb3JkZXIsIHN3aXRjaF9iaXRzOyAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGludCBxLCBidWYsIGJpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJ1ZiA9IEdFVF9DQUNIRShyZSwgZ2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIHRvIHN3aXRjaCBiZXR3ZWVuIHJpY2UgYW5kIGV4cCBnb2xvbWIgKi8gICAgICBcCisgICAgICAgIHN3aXRjaF9iaXRzID0gIGNvZGVib29rICYgMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJpY2Vfb3JkZXIgID0gIGNvZGVib29rID4+IDU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGV4cF9vcmRlciAgID0gKGNvZGVib29rID4+IDIpICYgNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHEgPSAzMSAtIGF2X2xvZzIoYnVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChxID4gc3dpdGNoX2JpdHMpIHsgLyogZXhwIGdvbG9tYiAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiaXRzID0gZXhwX29yZGVyIC0gc3dpdGNoX2JpdHMgKyAocTw8MSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2YWwgPSBTSE9XX1VCSVRTKHJlLCBnYiwgYml0cykgLSAoMSA8PCBleHBfb3JkZXIpICsgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChzd2l0Y2hfYml0cyArIDEpIDw8IHJpY2Vfb3JkZXIpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBTS0lQX0JJVFMocmUsIGdiLCBiaXRzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAocmljZV9vcmRlcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBTS0lQX0JJVFMocmUsIGdiLCBxKzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2YWwgPSAocSA8PCByaWNlX29yZGVyKSArIFNIT1dfVUJJVFMocmUsIGdiLCByaWNlX29yZGVyKTsgICBcCisgICAgICAgICAgICBTS0lQX0JJVFMocmUsIGdiLCByaWNlX29yZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2YWwgPSBxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBTS0lQX0JJVFMocmUsIGdiLCBxKzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUT1NJR05FRCh4KSAoKCh4KSA+PiAxKSBeICgtKCh4KSAmIDEpKSkKKworI2RlZmluZSBGSVJTVF9EQ19DQiAweEI4CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRjX2NvZGVib29rWzddID0geyAweDA0LCAweDI4LCAweDI4LCAweDRELCAweDRELCAweDcwLCAweDcwfTsKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBkZWNvZGVfZGNfY29lZmZzKEdldEJpdENvbnRleHQgKmdiLCBpbnQxNl90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2Nrc19wZXJfc2xpY2UpCit7CisgICAgaW50MTZfdCBwcmV2X2RjOworICAgIGludCBjb2RlLCBpLCBzaWduOworCisgICAgT1BFTl9SRUFERVIocmUsIGdiKTsKKworICAgIERFQ09ERV9DT0RFV09SRChjb2RlLCBGSVJTVF9EQ19DQik7CisgICAgcHJldl9kYyA9IFRPU0lHTkVEKGNvZGUpOworICAgIG91dFswXSA9IHByZXZfZGM7CisKKyAgICBvdXQgKz0gNjQ7IC8vIGRjIGNvZWZmIGZvciB0aGUgbmV4dCBibG9jaworCisgICAgY29kZSA9IDU7CisgICAgc2lnbiA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8IGJsb2Nrc19wZXJfc2xpY2U7IGkrKywgb3V0ICs9IDY0KSB7CisgICAgICAgIERFQ09ERV9DT0RFV09SRChjb2RlLCBkY19jb2RlYm9va1tGRk1JTihjb2RlLCA2VSldKTsKKyAgICAgICAgaWYoY29kZSkgc2lnbiBePSAtKGNvZGUgJiAxKTsKKyAgICAgICAgZWxzZSAgICAgc2lnbiAgPSAwOworICAgICAgICBwcmV2X2RjICs9ICgoKGNvZGUgKyAxKSA+PiAxKSBeIHNpZ24pIC0gc2lnbjsKKyAgICAgICAgb3V0WzBdID0gcHJldl9kYzsKKyAgICB9CisgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7Cit9CisKKy8vIGFkYXB0aXZlIGNvZGVib29rIHN3aXRjaGluZyBsdXQgYWNjb3JkaW5nIHRvIHByZXZpb3VzIHJ1bi9sZXZlbCB2YWx1ZXMKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ1bl90b19jYlsxNl0gPSB7IDB4MDYsIDB4MDYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4NEMgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGxldl90b19jYlsxMF0gPSB7IDB4MDQsIDB4MEEsIDB4MDUsIDB4MDYsIDB4MDQsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4NEMgfTsKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGRlY29kZV9hY19jb2VmZnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKm91dCwgaW50IGJsb2Nrc19wZXJfc2xpY2UpCit7CisgICAgUHJvcmVzQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgYmxvY2tfbWFzaywgc2lnbjsKKyAgICB1bnNpZ25lZCBwb3MsIHJ1biwgbGV2ZWw7CisgICAgaW50IG1heF9jb2VmZnMsIGksIGJpdHNfbGVmdDsKKyAgICBpbnQgbG9nMl9ibG9ja19jb3VudCA9IGF2X2xvZzIoYmxvY2tzX3Blcl9zbGljZSk7CisKKyAgICBPUEVOX1JFQURFUihyZSwgZ2IpOworICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnVuICAgPSA0OworICAgIGxldmVsID0gMjsKKworICAgIG1heF9jb2VmZnMgPSA2NCA8PCBsb2cyX2Jsb2NrX2NvdW50OworICAgIGJsb2NrX21hc2sgPSBibG9ja3NfcGVyX3NsaWNlIC0gMTsKKworICAgIGZvciAocG9zID0gYmxvY2tfbWFzazs7KSB7CisgICAgICAgIGJpdHNfbGVmdCA9IGdiLT5zaXplX2luX2JpdHMgLSByZV9pbmRleDsKKyAgICAgICAgaWYgKCFiaXRzX2xlZnQgfHwgKGJpdHNfbGVmdCA8IDMyICYmICFTSE9XX1VCSVRTKHJlLCBnYiwgYml0c19sZWZ0KSkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBERUNPREVfQ09ERVdPUkQocnVuLCBydW5fdG9fY2JbRkZNSU4ocnVuLCAgMTUpXSk7CisgICAgICAgIHBvcyArPSBydW4gKyAxOworICAgICAgICBpZiAocG9zID49IG1heF9jb2VmZnMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYWMgdGV4IGRhbWFnZWQgJWQsICVkXG4iLCBwb3MsIG1heF9jb2VmZnMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBERUNPREVfQ09ERVdPUkQobGV2ZWwsIGxldl90b19jYltGRk1JTihsZXZlbCwgOSldKTsKKyAgICAgICAgbGV2ZWwgKz0gMTsKKworICAgICAgICBpID0gcG9zID4+IGxvZzJfYmxvY2tfY291bnQ7CisKKyAgICAgICAgc2lnbiA9IFNIT1dfU0JJVFMocmUsIGdiLCAxKTsKKyAgICAgICAgU0tJUF9CSVRTKHJlLCBnYiwgMSk7CisgICAgICAgIG91dFsoKHBvcyAmIGJsb2NrX21hc2spIDw8IDYpICsgY3R4LT5zY2FuW2ldXSA9ICgobGV2ZWwgXiBzaWduKSAtIHNpZ24pOworICAgIH0KKworICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9zbGljZV9sdW1hKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgU2xpY2VDb250ZXh0ICpzbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnFtYXQpCit7CisgICAgUHJvcmVzQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIGJsb2NrcywgWzgqNCo2NF0pOworICAgIGludDE2X3QgKmJsb2NrOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGksIGJsb2Nrc19wZXJfc2xpY2UgPSBzbGljZS0+bWJfY291bnQ8PDI7CisgICAgaW50IHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3NfcGVyX3NsaWNlOyBpKyspCisgICAgICAgIGN0eC0+YmRzcC5jbGVhcl9ibG9jayhibG9ja3MrKGk8PDYpKTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJ1Zl9zaXplIDw8IDMpOworCisgICAgZGVjb2RlX2RjX2NvZWZmcygmZ2IsIGJsb2NrcywgYmxvY2tzX3Blcl9zbGljZSk7CisgICAgaWYgKChyZXQgPSBkZWNvZGVfYWNfY29lZmZzKGF2Y3R4LCAmZ2IsIGJsb2NrcywgYmxvY2tzX3Blcl9zbGljZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGJsb2NrID0gYmxvY2tzOworICAgIGZvciAoaSA9IDA7IGkgPCBzbGljZS0+bWJfY291bnQ7IGkrKykgeworICAgICAgICBjdHgtPnByb2RzcC5pZGN0X3B1dChkc3QsIGRzdF9zdHJpZGUsIGJsb2NrKygwPDw2KSwgcW1hdCk7CisgICAgICAgIGN0eC0+cHJvZHNwLmlkY3RfcHV0KGRzdCAgICAgICAgICAgICArOCwgZHN0X3N0cmlkZSwgYmxvY2srKDE8PDYpLCBxbWF0KTsKKyAgICAgICAgY3R4LT5wcm9kc3AuaWRjdF9wdXQoZHN0KzQqZHN0X3N0cmlkZSAgLCBkc3Rfc3RyaWRlLCBibG9jaysoMjw8NiksIHFtYXQpOworICAgICAgICBjdHgtPnByb2RzcC5pZGN0X3B1dChkc3QrNCpkc3Rfc3RyaWRlKzgsIGRzdF9zdHJpZGUsIGJsb2NrKygzPDw2KSwgcW1hdCk7CisgICAgICAgIGJsb2NrICs9IDQqNjQ7CisgICAgICAgIGRzdCArPSAxNjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3NsaWNlX2Nocm9tYShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFNsaWNlQ29udGV4dCAqc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCB1bnNpZ25lZCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpxbWF0LCBpbnQgbG9nMl9ibG9ja3NfcGVyX21iKQoreworICAgIFByb3Jlc0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBibG9ja3MsIFs4KjQqNjRdKTsKKyAgICBpbnQxNl90ICpibG9jazsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBpLCBqLCBibG9ja3NfcGVyX3NsaWNlID0gc2xpY2UtPm1iX2NvdW50IDw8IGxvZzJfYmxvY2tzX3Blcl9tYjsKKyAgICBpbnQgcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IGJsb2Nrc19wZXJfc2xpY2U7IGkrKykKKyAgICAgICAgY3R4LT5iZHNwLmNsZWFyX2Jsb2NrKGJsb2NrcysoaTw8NikpOworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgYnVmX3NpemUgPDwgMyk7CisKKyAgICBkZWNvZGVfZGNfY29lZmZzKCZnYiwgYmxvY2tzLCBibG9ja3NfcGVyX3NsaWNlKTsKKyAgICBpZiAoKHJldCA9IGRlY29kZV9hY19jb2VmZnMoYXZjdHgsICZnYiwgYmxvY2tzLCBibG9ja3NfcGVyX3NsaWNlKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYmxvY2sgPSBibG9ja3M7CisgICAgZm9yIChpID0gMDsgaSA8IHNsaWNlLT5tYl9jb3VudDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsb2cyX2Jsb2Nrc19wZXJfbWI7IGorKykgeworICAgICAgICAgICAgY3R4LT5wcm9kc3AuaWRjdF9wdXQoZHN0LCAgICAgICAgICAgICAgZHN0X3N0cmlkZSwgYmxvY2srKDA8PDYpLCBxbWF0KTsKKyAgICAgICAgICAgIGN0eC0+cHJvZHNwLmlkY3RfcHV0KGRzdCs0KmRzdF9zdHJpZGUsIGRzdF9zdHJpZGUsIGJsb2NrKygxPDw2KSwgcW1hdCk7CisgICAgICAgICAgICBibG9jayArPSAyKjY0OworICAgICAgICAgICAgZHN0ICs9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVucGFja19hbHBoYShHZXRCaXRDb250ZXh0ICpnYiwgdWludDE2X3QgKmRzdCwgaW50IG51bV9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bV9iaXRzKQoreworICAgIGNvbnN0IGludCBtYXNrID0gKDEgPDwgbnVtX2JpdHMpIC0gMTsKKyAgICBpbnQgaSwgaWR4LCB2YWwsIGFscGhhX3ZhbDsKKworICAgIGlkeCAgICAgICA9IDA7CisgICAgYWxwaGFfdmFsID0gbWFzazsKKyAgICBkbyB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgdmFsID0gZ2V0X2JpdHMoZ2IsIG51bV9iaXRzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHNpZ247CisgICAgICAgICAgICAgICAgdmFsICA9IGdldF9iaXRzKGdiLCBudW1fYml0cyA9PSAxNiA/IDcgOiA0KTsKKyAgICAgICAgICAgICAgICBzaWduID0gdmFsICYgMTsKKyAgICAgICAgICAgICAgICB2YWwgID0gKHZhbCArIDIpID4+IDE7CisgICAgICAgICAgICAgICAgaWYgKHNpZ24pCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IC12YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbHBoYV92YWwgPSAoYWxwaGFfdmFsICsgdmFsKSAmIG1hc2s7CisgICAgICAgICAgICBpZiAobnVtX2JpdHMgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICBkc3RbaWR4KytdID0gYWxwaGFfdmFsID4+IDY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRzdFtpZHgrK10gPSAoYWxwaGFfdmFsIDw8IDIpIHwgKGFscGhhX3ZhbCA+PiA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpZHggPj0gbnVtX2NvZWZmcykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSB3aGlsZSAoZ2V0X2JpdHNfbGVmdChnYik+MCAmJiBnZXRfYml0czEoZ2IpKTsKKyAgICAgICAgdmFsID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBpZiAoIXZhbCkKKyAgICAgICAgICAgIHZhbCA9IGdldF9iaXRzKGdiLCAxMSk7CisgICAgICAgIGlmIChpZHggKyB2YWwgPiBudW1fY29lZmZzKQorICAgICAgICAgICAgdmFsID0gbnVtX2NvZWZmcyAtIGlkeDsKKyAgICAgICAgaWYgKG51bV9iaXRzID09IDE2KSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsOyBpKyspCisgICAgICAgICAgICAgICAgZHN0W2lkeCsrXSA9IGFscGhhX3ZhbCA+PiA2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbDsgaSsrKQorICAgICAgICAgICAgICAgIGRzdFtpZHgrK10gPSAoYWxwaGFfdmFsIDw8IDIpIHwgKGFscGhhX3ZhbCA+PiA2KTsKKworICAgICAgICB9CisgICAgfSB3aGlsZSAoaWR4IDwgbnVtX2NvZWZmcyk7Cit9CisKKy8qKgorICogRGVjb2RlIGFscGhhIHNsaWNlIHBsYW5lLgorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfc2xpY2VfYWxwaGEoUHJvcmVzQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja3NfcGVyX3NsaWNlKQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGk7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBibG9ja3MsIFs4KjQqNjRdKTsKKyAgICBpbnQxNl90ICpibG9jazsKKworICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3NfcGVyX3NsaWNlPDwyOyBpKyspCisgICAgICAgIGN0eC0+YmRzcC5jbGVhcl9ibG9jayhibG9ja3MrKGk8PDYpKTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJ1Zl9zaXplIDw8IDMpOworCisgICAgaWYgKGN0eC0+YWxwaGFfaW5mbyA9PSAyKSB7CisgICAgICAgIHVucGFja19hbHBoYSgmZ2IsIGJsb2NrcywgYmxvY2tzX3Blcl9zbGljZSAqIDQgKiA2NCwgMTYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVucGFja19hbHBoYSgmZ2IsIGJsb2NrcywgYmxvY2tzX3Blcl9zbGljZSAqIDQgKiA2NCwgOCk7CisgICAgfQorCisgICAgYmxvY2sgPSBibG9ja3M7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgYmxvY2ssIDE2ICogYmxvY2tzX3Blcl9zbGljZSAqIHNpemVvZigqZHN0KSk7CisgICAgICAgIGRzdCAgICs9IGRzdF9zdHJpZGUgPj4gMTsKKyAgICAgICAgYmxvY2sgKz0gMTYgKiBibG9ja3NfcGVyX3NsaWNlOworICAgIH0KK30KKworc3RhdGljIGludCBkZWNvZGVfc2xpY2VfdGhyZWFkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCB0aHJlYWRucikKK3sKKyAgICBQcm9yZXNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFNsaWNlQ29udGV4dCAqc2xpY2UgPSAmY3R4LT5zbGljZXNbam9ibnJdOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IHNsaWNlLT5kYXRhOworICAgIEFWRnJhbWUgKnBpYyA9IGN0eC0+ZnJhbWU7CisgICAgaW50IGksIGhkcl9zaXplLCBxc2NhbGUsIGxvZzJfY2hyb21hX2Jsb2Nrc19wZXJfbWI7CisgICAgaW50IGx1bWFfc3RyaWRlLCBjaHJvbWFfc3RyaWRlOworICAgIGludCB5X2RhdGFfc2l6ZSwgdV9kYXRhX3NpemUsIHZfZGF0YV9zaXplLCBhX2RhdGFfc2l6ZTsKKyAgICB1aW50OF90ICpkZXN0X3ksICpkZXN0X3UsICpkZXN0X3YsICpkZXN0X2E7CisgICAgaW50MTZfdCBxbWF0X2x1bWFfc2NhbGVkWzY0XTsKKyAgICBpbnQxNl90IHFtYXRfY2hyb21hX3NjYWxlZFs2NF07CisgICAgaW50IG1iX3hfc2hpZnQ7CisgICAgaW50IHJldDsKKworICAgIHNsaWNlLT5yZXQgPSAtMTsKKyAgICAvL2F2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJzbGljZSAlZCBtYiB3aWR0aCAlZCBtYiB4ICVkIHkgJWRcbiIsCisgICAgLy8gICAgICAgam9ibnIsIHNsaWNlLT5tYl9jb3VudCwgc2xpY2UtPm1iX3gsIHNsaWNlLT5tYl95KTsKKworICAgIC8vIHNsaWNlIGhlYWRlcgorICAgIGhkcl9zaXplID0gYnVmWzBdID4+IDM7CisgICAgcXNjYWxlID0gYXZfY2xpcChidWZbMV0sIDEsIDIyNCk7CisgICAgcXNjYWxlID0gcXNjYWxlID4gMTI4ID8gcXNjYWxlIC0gOTYgPDwgMjogcXNjYWxlOworICAgIHlfZGF0YV9zaXplID0gQVZfUkIxNihidWYgKyAyKTsKKyAgICB1X2RhdGFfc2l6ZSA9IEFWX1JCMTYoYnVmICsgNCk7CisgICAgdl9kYXRhX3NpemUgPSBzbGljZS0+ZGF0YV9zaXplIC0geV9kYXRhX3NpemUgLSB1X2RhdGFfc2l6ZSAtIGhkcl9zaXplOworICAgIGlmIChoZHJfc2l6ZSA+IDcpIHZfZGF0YV9zaXplID0gQVZfUkIxNihidWYgKyA2KTsKKyAgICBhX2RhdGFfc2l6ZSA9IHNsaWNlLT5kYXRhX3NpemUgLSB5X2RhdGFfc2l6ZSAtIHVfZGF0YV9zaXplIC0KKyAgICAgICAgICAgICAgICAgIHZfZGF0YV9zaXplIC0gaGRyX3NpemU7CisKKyAgICBpZiAoeV9kYXRhX3NpemUgPCAwIHx8IHVfZGF0YV9zaXplIDwgMCB8fCB2X2RhdGFfc2l6ZSA8IDAKKyAgICAgICAgfHwgaGRyX3NpemUreV9kYXRhX3NpemUrdV9kYXRhX3NpemUrdl9kYXRhX3NpemUgPiBzbGljZS0+ZGF0YV9zaXplKXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHBsYW5lIGRhdGEgc2l6ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGJ1ZiArPSBoZHJfc2l6ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIHFtYXRfbHVtYV9zY2FsZWQgIFtpXSA9IGN0eC0+cW1hdF9sdW1hICBbaV0gKiBxc2NhbGU7CisgICAgICAgIHFtYXRfY2hyb21hX3NjYWxlZFtpXSA9IGN0eC0+cW1hdF9jaHJvbWFbaV0gKiBxc2NhbGU7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZnJhbWVfdHlwZSA9PSAwKSB7CisgICAgICAgIGx1bWFfc3RyaWRlICAgPSBwaWMtPmxpbmVzaXplWzBdOworICAgICAgICBjaHJvbWFfc3RyaWRlID0gcGljLT5saW5lc2l6ZVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgICBsdW1hX3N0cmlkZSAgID0gcGljLT5saW5lc2l6ZVswXSA8PCAxOworICAgICAgICBjaHJvbWFfc3RyaWRlID0gcGljLT5saW5lc2l6ZVsxXSA8PCAxOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQ0NFAxMCB8fCBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVkE0NDRQMTApIHsKKyAgICAgICAgbWJfeF9zaGlmdCA9IDU7CisgICAgICAgIGxvZzJfY2hyb21hX2Jsb2Nrc19wZXJfbWIgPSAyOworICAgIH0gZWxzZSB7CisgICAgICAgIG1iX3hfc2hpZnQgPSA0OworICAgICAgICBsb2cyX2Nocm9tYV9ibG9ja3NfcGVyX21iID0gMTsKKyAgICB9CisKKyAgICBkZXN0X3kgPSBwaWMtPmRhdGFbMF0gKyAoc2xpY2UtPm1iX3kgPDwgNCkgKiBsdW1hX3N0cmlkZSArIChzbGljZS0+bWJfeCA8PCA1KTsKKyAgICBkZXN0X3UgPSBwaWMtPmRhdGFbMV0gKyAoc2xpY2UtPm1iX3kgPDwgNCkgKiBjaHJvbWFfc3RyaWRlICsgKHNsaWNlLT5tYl94IDw8IG1iX3hfc2hpZnQpOworICAgIGRlc3RfdiA9IHBpYy0+ZGF0YVsyXSArIChzbGljZS0+bWJfeSA8PCA0KSAqIGNocm9tYV9zdHJpZGUgKyAoc2xpY2UtPm1iX3ggPDwgbWJfeF9zaGlmdCk7CisgICAgZGVzdF9hID0gcGljLT5kYXRhWzNdICsgKHNsaWNlLT5tYl95IDw8IDQpICogbHVtYV9zdHJpZGUgKyAoc2xpY2UtPm1iX3ggPDwgNSk7CisKKyAgICBpZiAoY3R4LT5mcmFtZV90eXBlICYmIGN0eC0+Zmlyc3RfZmllbGQgXiBjdHgtPmZyYW1lLT50b3BfZmllbGRfZmlyc3QpIHsKKyAgICAgICAgZGVzdF95ICs9IHBpYy0+bGluZXNpemVbMF07CisgICAgICAgIGRlc3RfdSArPSBwaWMtPmxpbmVzaXplWzFdOworICAgICAgICBkZXN0X3YgKz0gcGljLT5saW5lc2l6ZVsyXTsKKyAgICAgICAgZGVzdF9hICs9IHBpYy0+bGluZXNpemVbM107CisgICAgfQorCisgICAgcmV0ID0gZGVjb2RlX3NsaWNlX2x1bWEoYXZjdHgsIHNsaWNlLCAodWludDE2X3QqKWRlc3RfeSwgbHVtYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCB5X2RhdGFfc2l6ZSwgcW1hdF9sdW1hX3NjYWxlZCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgIHJldCA9IGRlY29kZV9zbGljZV9jaHJvbWEoYXZjdHgsIHNsaWNlLCAodWludDE2X3QqKWRlc3RfdSwgY2hyb21hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgKyB5X2RhdGFfc2l6ZSwgdV9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1hdF9jaHJvbWFfc2NhbGVkLCBsb2cyX2Nocm9tYV9ibG9ja3NfcGVyX21iKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldCA9IGRlY29kZV9zbGljZV9jaHJvbWEoYXZjdHgsIHNsaWNlLCAodWludDE2X3QqKWRlc3RfdiwgY2hyb21hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgKyB5X2RhdGFfc2l6ZSArIHVfZGF0YV9zaXplLCB2X2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWF0X2Nocm9tYV9zY2FsZWQsIGxvZzJfY2hyb21hX2Jsb2Nrc19wZXJfbWIpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIC8qIGRlY29kZSBhbHBoYSBwbGFuZSBpZiBhdmFpbGFibGUgKi8KKyAgICBpZiAoY3R4LT5hbHBoYV9pbmZvICYmIHBpYy0+ZGF0YVszXSAmJiBhX2RhdGFfc2l6ZSkKKyAgICAgICAgZGVjb2RlX3NsaWNlX2FscGhhKGN0eCwgKHVpbnQxNl90KilkZXN0X2EsIGx1bWFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgeV9kYXRhX3NpemUgKyB1X2RhdGFfc2l6ZSArIHZfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYV9kYXRhX3NpemUsIHNsaWNlLT5tYl9jb3VudCk7CisKKyAgICBzbGljZS0+cmV0ID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcGljdHVyZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUHJvcmVzQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGF2Y3R4LT5leGVjdXRlMihhdmN0eCwgZGVjb2RlX3NsaWNlX3RocmVhZCwgTlVMTCwgTlVMTCwgY3R4LT5zbGljZV9jb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5zbGljZV9jb3VudDsgaSsrKQorICAgICAgICBpZiAoY3R4LT5zbGljZXNbaV0ucmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiBjdHgtPnNsaWNlc1tpXS5yZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBQcm9yZXNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBpbnQgZnJhbWVfaGRyX3NpemUsIHBpY19zaXplLCByZXQ7CisKKyAgICBpZiAoYnVmX3NpemUgPCAyOCB8fCBBVl9STDMyKGJ1ZiArIDQpICE9IEFWX1JMMzIoImljcGYiKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgZnJhbWUgaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3R4LT5mcmFtZSA9IGZyYW1lOworICAgIGN0eC0+ZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGN0eC0+ZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgY3R4LT5maXJzdF9maWVsZCA9IDE7CisKKyAgICBidWYgKz0gODsKKyAgICBidWZfc2l6ZSAtPSA4OworCisgICAgZnJhbWVfaGRyX3NpemUgPSBkZWNvZGVfZnJhbWVfaGVhZGVyKGN0eCwgYnVmLCBidWZfc2l6ZSwgYXZjdHgpOworICAgIGlmIChmcmFtZV9oZHJfc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBmcmFtZV9oZHJfc2l6ZTsKKworICAgIGJ1ZiArPSBmcmFtZV9oZHJfc2l6ZTsKKyAgICBidWZfc2l6ZSAtPSBmcmFtZV9oZHJfc2l6ZTsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyBkZWNvZGVfcGljdHVyZToKKyAgICBwaWNfc2l6ZSA9IGRlY29kZV9waWN0dXJlX2hlYWRlcihhdmN0eCwgYnVmLCBidWZfc2l6ZSk7CisgICAgaWYgKHBpY19zaXplIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGRlY29kaW5nIHBpY3R1cmUgaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIHBpY19zaXplOworICAgIH0KKworICAgIGlmICgocmV0ID0gZGVjb2RlX3BpY3R1cmUoYXZjdHgpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBkZWNvZGluZyBwaWN0dXJlXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBidWYgKz0gcGljX3NpemU7CisgICAgYnVmX3NpemUgLT0gcGljX3NpemU7CisKKyAgICBpZiAoY3R4LT5mcmFtZV90eXBlICYmIGJ1Zl9zaXplID4gMCAmJiBjdHgtPmZpcnN0X2ZpZWxkKSB7CisgICAgICAgIGN0eC0+Zmlyc3RfZmllbGQgPSAwOworICAgICAgICBnb3RvIGRlY29kZV9waWN0dXJlOworICAgIH0KKworICAgICpnb3RfZnJhbWUgICAgICA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFByb3Jlc0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5zbGljZXMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfcHJvcmVzX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInByb3JlcyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlByb1JlcyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QUk9SRVMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFByb3Jlc0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Byb3Jlc2RlY19sZ3BsLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9wcm9yZXNkZWNfbGdwbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZTI0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcm9yZXNkZWNfbGdwbC5jCkBAIC0wLDAgKzEsNzgzIEBACisvKgorICogQXBwbGUgUHJvUmVzIGNvbXBhdGlibGUgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE1heGltIFBvbGlha292c2tpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFRoaXMgaXMgYSBkZWNvZGVyIGZvciBBcHBsZSBQcm9SZXMgNDIyIFNEL0hRL0xUL1Byb3h5IGFuZCBQcm9SZXMgNDQ0NC4KKyAqIEl0IGlzIHVzZWQgZm9yIHN0b3JpbmcgYW5kIGVkaXRpbmcgaGlnaCBkZWZpbml0aW9uIHZpZGVvIGRhdGEgaW4gQXBwbGUncyBGaW5hbCBDdXQgUHJvLgorICoKKyAqIEBzZWUgaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9QXBwbGVfUHJvUmVzCisgKi8KKworI2RlZmluZSBMT05HX0JJVFNUUkVBTV9SRUFERVIgLy8gc29tZSBQcm9SZXMgdmxjIGNvZGVzIHJlcXVpcmUgdXAgdG8gMjggYml0cyB0byBiZSByZWFkIGF0IG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludG1hdGguaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicHJvcmVzZGF0YS5oIgorI2luY2x1ZGUgInByb3Jlc2RzcC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCB1aW50OF90ICppbmRleDsgICAgICAgICAgICAvLy88IHBvaW50ZXJzIHRvIHRoZSBkYXRhIG9mIHRoaXMgc2xpY2UKKyAgICBpbnQgc2xpY2VfbnVtOworICAgIGludCB4X3BvcywgeV9wb3M7CisgICAgaW50IHNsaWNlX3dpZHRoOworICAgIGludCBwcmV2X3NsaWNlX3NmOyAgICAgICAgICAgICAgIC8vLzwgc2NhbGVmYWN0b3Igb2YgdGhlIHByZXZpb3VzIGRlY29kZWQgc2xpY2UKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrcylbOCAqIDQgKiA2NF07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBxbWF0X2x1bWFfc2NhbGVkKVs2NF07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBxbWF0X2Nocm9tYV9zY2FsZWQpWzY0XTsKK30gUHJvcmVzVGhyZWFkRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFByb3Jlc0RTUENvbnRleHQgZHNwOworICAgIEFWRnJhbWUgICAgKmZyYW1lOworICAgIFNjYW5UYWJsZSAgc2NhbnRhYmxlOworICAgIGludCAgICAgICAgc2NhbnRhYmxlX3R5cGU7ICAgICAgICAgICAvLy88IC0xID0gdW5pbml0aWFsaXplZCwgMCA9IHByb2dyZXNzaXZlLCAxLzIgPSBpbnRlcmxhY2VkCisKKyAgICBpbnQgICAgICAgIGZyYW1lX3R5cGU7ICAgICAgICAgICAgICAgLy8vPCAwID0gcHJvZ3Jlc3NpdmUsIDEgPSB0b3AtZmllbGQgZmlyc3QsIDIgPSBib3R0b20tZmllbGQgZmlyc3QKKyAgICBpbnQgICAgICAgIHBpY19mb3JtYXQ7ICAgICAgICAgICAgICAgLy8vPCAyID0gNDIyLCAzID0gNDQ0CisgICAgdWludDhfdCAgICBxbWF0X2x1bWFbNjRdOyAgICAgICAgICAgIC8vLzwgZGVxdWFudGl6YXRpb24gbWF0cml4IGZvciBsdW1hCisgICAgdWludDhfdCAgICBxbWF0X2Nocm9tYVs2NF07ICAgICAgICAgIC8vLzwgZGVxdWFudGl6YXRpb24gbWF0cml4IGZvciBjaHJvbWEKKyAgICBpbnQgICAgICAgIHFtYXRfY2hhbmdlZDsgICAgICAgICAgICAgLy8vPCAxIC0gZ2xvYmFsIHF1YW50aXphdGlvbiBtYXRyaWNlcyBjaGFuZ2VkCisgICAgaW50ICAgICAgICB0b3RhbF9zbGljZXM7ICAgICAgICAgICAgLy8vPCB0b3RhbCBudW1iZXIgb2Ygc2xpY2VzIGluIGEgcGljdHVyZQorICAgIFByb3Jlc1RocmVhZERhdGEgKnNsaWNlX2RhdGE7CisgICAgaW50ICAgICAgICBwaWNfbnVtOworICAgIGludCAgICAgICAgY2hyb21hX2ZhY3RvcjsKKyAgICBpbnQgICAgICAgIG1iX2Nocm9tYV9mYWN0b3I7CisgICAgaW50ICAgICAgICBudW1fY2hyb21hX2Jsb2NrczsgICAgICAgLy8vPCBudW1iZXIgb2YgY2hyb21pbmFuY2UgYmxvY2tzIGluIGEgbWFjcm9ibG9jaworICAgIGludCAgICAgICAgbnVtX3hfc2xpY2VzOworICAgIGludCAgICAgICAgbnVtX3lfc2xpY2VzOworICAgIGludCAgICAgICAgc2xpY2Vfd2lkdGhfZmFjdG9yOworICAgIGludCAgICAgICAgc2xpY2VfaGVpZ2h0X2ZhY3RvcjsKKyAgICBpbnQgICAgICAgIG51bV94X21iczsKKyAgICBpbnQgICAgICAgIG51bV95X21iczsKKyAgICBpbnQgICAgICAgIGFscGhhX2luZm87Cit9IFByb3Jlc0NvbnRleHQ7CisKKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBQcm9yZXNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgY3R4LT50b3RhbF9zbGljZXMgICAgID0gMDsKKyAgICBjdHgtPnNsaWNlX2RhdGEgICAgICAgPSBOVUxMOworCisgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBQUk9SRVNfQklUU19QRVJfU0FNUExFOworICAgIGZmX3Byb3Jlc2RzcF9pbml0KCZjdHgtPmRzcCwgYXZjdHgpOworCisgICAgY3R4LT5zY2FudGFibGVfdHlwZSA9IC0xOyAgIC8vIHNldCBzY2FudGFibGUgdHlwZSB0byB1bmluaXRpYWxpemVkCisgICAgbWVtc2V0KGN0eC0+cW1hdF9sdW1hLCA0LCA2NCk7CisgICAgbWVtc2V0KGN0eC0+cW1hdF9jaHJvbWEsIDQsIDY0KTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lX2hlYWRlcihQcm9yZXNDb250ZXh0ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGF0YV9zaXplLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGhkcl9zaXplLCB2ZXJzaW9uLCB3aWR0aCwgaGVpZ2h0LCBmbGFnczsKKyAgICBjb25zdCB1aW50OF90ICpwdHI7CisKKyAgICBoZHJfc2l6ZSA9IEFWX1JCMTYoYnVmKTsKKyAgICBpZiAoaGRyX3NpemUgPiBkYXRhX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmcmFtZSBkYXRhIHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHZlcnNpb24gPSBBVl9SQjE2KGJ1ZiArIDIpOworICAgIGlmICh2ZXJzaW9uID49IDIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgaGVhZGVyIHZlcnNpb246ICVkXG4iLCB2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgd2lkdGggID0gQVZfUkIxNihidWYgKyA4KTsKKyAgICBoZWlnaHQgPSBBVl9SQjE2KGJ1ZiArIDEwKTsKKyAgICBpZiAod2lkdGggIT0gYXZjdHgtPndpZHRoIHx8IGhlaWdodCAhPSBhdmN0eC0+aGVpZ2h0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInBpY3R1cmUgZGltZW5zaW9uIGNoYW5nZWQ6IG9sZDogJWQgeCAlZCwgbmV3OiAlZCB4ICVkXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3R4LT5mcmFtZV90eXBlID0gKGJ1ZlsxMl0gPj4gMikgJiAzOworICAgIGlmIChjdHgtPmZyYW1lX3R5cGUgPiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGZyYW1lIHR5cGU6ICVkXG4iLCBjdHgtPmZyYW1lX3R5cGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBjdHgtPmNocm9tYV9mYWN0b3IgICAgID0gKGJ1ZlsxMl0gPj4gNikgJiAzOworICAgIGN0eC0+bWJfY2hyb21hX2ZhY3RvciAgPSBjdHgtPmNocm9tYV9mYWN0b3IgKyAyOworICAgIGN0eC0+bnVtX2Nocm9tYV9ibG9ja3MgPSAoMSA8PCBjdHgtPmNocm9tYV9mYWN0b3IpID4+IDE7CisgICAgY3R4LT5hbHBoYV9pbmZvICAgICAgICA9IGJ1ZlsxN10gJiAweGY7CisKKyAgICBpZiAoY3R4LT5hbHBoYV9pbmZvID4gMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYWxwaGEgbW9kZSAlZFxuIiwgY3R4LT5hbHBoYV9pbmZvKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChhdmN0eC0+c2tpcF9hbHBoYSkgY3R4LT5hbHBoYV9pbmZvID0gMDsKKworICAgIHN3aXRjaCAoY3R4LT5jaHJvbWFfZmFjdG9yKSB7CisgICAgY2FzZSAyOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IGN0eC0+YWxwaGFfaW5mbyA/IEFWX1BJWF9GTVRfWVVWQTQyMlAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX1BJWF9GTVRfWVVWNDIyUDEwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gY3R4LT5hbHBoYV9pbmZvID8gQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZfUElYX0ZNVF9ZVVY0NDRQMTA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIHBpY3R1cmUgZm9ybWF0OiAlZFxuIiwgY3R4LT5waWNfZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGN0eC0+c2NhbnRhYmxlX3R5cGUgIT0gY3R4LT5mcmFtZV90eXBlKSB7CisgICAgICAgIGlmICghY3R4LT5mcmFtZV90eXBlKQorICAgICAgICAgICAgZmZfaW5pdF9zY2FudGFibGUoY3R4LT5kc3AuaWRjdF9wZXJtdXRhdGlvbiwgJmN0eC0+c2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfcHJvcmVzX3Byb2dyZXNzaXZlX3NjYW4pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmZl9pbml0X3NjYW50YWJsZShjdHgtPmRzcC5pZGN0X3Blcm11dGF0aW9uLCAmY3R4LT5zY2FudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9wcm9yZXNfaW50ZXJsYWNlZF9zY2FuKTsKKyAgICAgICAgY3R4LT5zY2FudGFibGVfdHlwZSA9IGN0eC0+ZnJhbWVfdHlwZTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5mcmFtZV90eXBlKSB7ICAgICAgLyogaWYgaW50ZXJsYWNlZCAqLworICAgICAgICBjdHgtPmZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICAgICAgY3R4LT5mcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ICA9IGN0eC0+ZnJhbWVfdHlwZSAmIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5mcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSA9IDA7CisgICAgfQorCisgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IGJ1ZlsxNF07CisgICAgYXZjdHgtPmNvbG9yX3RyYyAgICAgICA9IGJ1ZlsxNV07CisgICAgYXZjdHgtPmNvbG9yc3BhY2UgICAgICA9IGJ1ZlsxNl07CisKKyAgICBjdHgtPnFtYXRfY2hhbmdlZCA9IDA7CisgICAgcHRyICAgPSBidWYgKyAyMDsKKyAgICBmbGFncyA9IGJ1ZlsxOV07CisgICAgaWYgKGZsYWdzICYgMikgeworICAgICAgICBpZiAocHRyIC0gYnVmID4gaGRyX3NpemUgLSA2NCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJoZWFkZXIgZGF0YSB0b28gc21hbGxcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lbWNtcChjdHgtPnFtYXRfbHVtYSwgcHRyLCA2NCkpIHsKKyAgICAgICAgICAgIG1lbWNweShjdHgtPnFtYXRfbHVtYSwgcHRyLCA2NCk7CisgICAgICAgICAgICBjdHgtPnFtYXRfY2hhbmdlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcHRyICs9IDY0OworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldChjdHgtPnFtYXRfbHVtYSwgNCwgNjQpOworICAgICAgICBjdHgtPnFtYXRfY2hhbmdlZCA9IDE7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgMSkgeworICAgICAgICBpZiAocHRyIC0gYnVmID4gaGRyX3NpemUgLSA2NCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJoZWFkZXIgZGF0YSB0b28gc21hbGxcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtZW1jbXAoY3R4LT5xbWF0X2Nocm9tYSwgcHRyLCA2NCkpIHsKKyAgICAgICAgICAgIG1lbWNweShjdHgtPnFtYXRfY2hyb21hLCBwdHIsIDY0KTsKKyAgICAgICAgICAgIGN0eC0+cW1hdF9jaGFuZ2VkID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldChjdHgtPnFtYXRfY2hyb21hLCA0LCA2NCk7CisgICAgICAgIGN0eC0+cW1hdF9jaGFuZ2VkID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gaGRyX3NpemU7Cit9CisKKworc3RhdGljIGludCBkZWNvZGVfcGljdHVyZV9oZWFkZXIoUHJvcmVzQ29udGV4dCAqY3R4LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGF0YV9zaXplLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50ICAgaSwgaGRyX3NpemUsIHBpY19kYXRhX3NpemUsIG51bV9zbGljZXM7CisgICAgaW50ICAgc2xpY2Vfd2lkdGhfZmFjdG9yLCBzbGljZV9oZWlnaHRfZmFjdG9yOworICAgIGludCAgIHJlbWFpbmRlciwgbnVtX3hfc2xpY2VzOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGFfcHRyLCAqaW5kZXhfcHRyOworCisgICAgaGRyX3NpemUgPSBkYXRhX3NpemUgPiAwID8gYnVmWzBdID4+IDMgOiAwOworICAgIGlmIChoZHJfc2l6ZSA8IDggfHwgaGRyX3NpemUgPiBkYXRhX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwaWN0dXJlIGhlYWRlciB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBwaWNfZGF0YV9zaXplID0gQVZfUkIzMihidWYgKyAxKTsKKyAgICBpZiAocGljX2RhdGFfc2l6ZSA+IGRhdGFfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBpY3R1cmUgZGF0YSB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzbGljZV93aWR0aF9mYWN0b3IgID0gYnVmWzddID4+IDQ7CisgICAgc2xpY2VfaGVpZ2h0X2ZhY3RvciA9IGJ1Zls3XSAmIDB4RjsKKyAgICBpZiAoc2xpY2Vfd2lkdGhfZmFjdG9yID4gMyB8fCBzbGljZV9oZWlnaHRfZmFjdG9yKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIHNsaWNlIGRpbWVuc2lvbjogJWQgeCAlZFxuIiwKKyAgICAgICAgICAgICAgIDEgPDwgc2xpY2Vfd2lkdGhfZmFjdG9yLCAxIDw8IHNsaWNlX2hlaWdodF9mYWN0b3IpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBjdHgtPnNsaWNlX3dpZHRoX2ZhY3RvciAgPSBzbGljZV93aWR0aF9mYWN0b3I7CisgICAgY3R4LT5zbGljZV9oZWlnaHRfZmFjdG9yID0gc2xpY2VfaGVpZ2h0X2ZhY3RvcjsKKworICAgIGN0eC0+bnVtX3hfbWJzID0gKGF2Y3R4LT53aWR0aCArIDE1KSA+PiA0OworICAgIGN0eC0+bnVtX3lfbWJzID0gKGF2Y3R4LT5oZWlnaHQgKworICAgICAgICAgICAgICAgICAgICAgICgxIDw8ICg0ICsgY3R4LT5mcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSkpIC0gMSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICg0ICsgY3R4LT5mcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSk7CisKKyAgICByZW1haW5kZXIgICAgPSBjdHgtPm51bV94X21icyAmICgoMSA8PCBzbGljZV93aWR0aF9mYWN0b3IpIC0gMSk7CisgICAgbnVtX3hfc2xpY2VzID0gKGN0eC0+bnVtX3hfbWJzID4+IHNsaWNlX3dpZHRoX2ZhY3RvcikgKyAocmVtYWluZGVyICYgMSkgKworICAgICAgICAgICAgICAgICAgICgocmVtYWluZGVyID4+IDEpICYgMSkgKyAoKHJlbWFpbmRlciA+PiAyKSAmIDEpOworCisgICAgbnVtX3NsaWNlcyA9IG51bV94X3NsaWNlcyAqIGN0eC0+bnVtX3lfbWJzOworICAgIGlmIChudW1fc2xpY2VzICE9IEFWX1JCMTYoYnVmICsgNSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG51bWJlciBvZiBzbGljZXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT50b3RhbF9zbGljZXMgIT0gbnVtX3NsaWNlcykgeworICAgICAgICBhdl9mcmVlcCgmY3R4LT5zbGljZV9kYXRhKTsKKyAgICAgICAgY3R4LT5zbGljZV9kYXRhID0gYXZfbWFsbG9jKChudW1fc2xpY2VzICsgMSkgKiBzaXplb2YoY3R4LT5zbGljZV9kYXRhWzBdKSk7CisgICAgICAgIGlmICghY3R4LT5zbGljZV9kYXRhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgY3R4LT50b3RhbF9zbGljZXMgPSBudW1fc2xpY2VzOworICAgIH0KKworICAgIGlmIChoZHJfc2l6ZSArIG51bV9zbGljZXMgKiAyID4gZGF0YV9zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAic2xpY2UgdGFibGUgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogcGFyc2Ugc2xpY2UgdGFibGUgYWxsb3dpbmcgcXVpY2sgYWNjZXNzIHRvIHRoZSBzbGljZSBkYXRhICovCisgICAgaW5kZXhfcHRyID0gYnVmICsgaGRyX3NpemU7CisgICAgZGF0YV9wdHIgPSBpbmRleF9wdHIgKyBudW1fc2xpY2VzICogMjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2xpY2VzOyBpKyspIHsKKyAgICAgICAgY3R4LT5zbGljZV9kYXRhW2ldLmluZGV4ID0gZGF0YV9wdHI7CisgICAgICAgIGN0eC0+c2xpY2VfZGF0YVtpXS5wcmV2X3NsaWNlX3NmID0gMDsKKyAgICAgICAgZGF0YV9wdHIgKz0gQVZfUkIxNihpbmRleF9wdHIgKyBpICogMik7CisgICAgfQorICAgIGN0eC0+c2xpY2VfZGF0YVtpXS5pbmRleCA9IGRhdGFfcHRyOworICAgIGN0eC0+c2xpY2VfZGF0YVtpXS5wcmV2X3NsaWNlX3NmID0gMDsKKworICAgIGlmIChkYXRhX3B0ciA+IGJ1ZiArIGRhdGFfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm91dCBvZiBzbGljZSBkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBwaWNfZGF0YV9zaXplOworfQorCisKKy8qKgorICogUmVhZCBhbiB1bnNpZ25lZCByaWNlL2V4cCBnb2xvbWIgY29kZXdvcmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRlY29kZV92bGNfY29kZXdvcmQoR2V0Qml0Q29udGV4dCAqZ2IsIHVuc2lnbmVkIGNvZGVib29rKQoreworICAgIHVuc2lnbmVkIGludCByaWNlX29yZGVyLCBleHBfb3JkZXIsIHN3aXRjaF9iaXRzOworICAgIHVuc2lnbmVkIGludCBidWYsIGNvZGU7CisgICAgaW50IGxvZywgcHJlZml4X2xlbiwgbGVuOworCisgICAgT1BFTl9SRUFERVIocmUsIGdiKTsKKyAgICBVUERBVEVfQ0FDSEUocmUsIGdiKTsKKyAgICBidWYgPSBHRVRfQ0FDSEUocmUsIGdiKTsKKworICAgIC8qIG51bWJlciBvZiBwcmVmaXggYml0cyB0byBzd2l0Y2ggYmV0d2VlbiBSaWNlIGFuZCBleHBHb2xvbWIgKi8KKyAgICBzd2l0Y2hfYml0cyA9IChjb2RlYm9vayAmIDMpICsgMTsKKyAgICByaWNlX29yZGVyICA9IGNvZGVib29rID4+IDU7ICAgICAgICAvKiByaWNlIGNvZGUgb3JkZXIgKi8KKyAgICBleHBfb3JkZXIgICA9IChjb2RlYm9vayA+PiAyKSAmIDc7ICAvKiBleHAgZ29sb21iIGNvZGUgb3JkZXIgKi8KKworICAgIGxvZyA9IDMxIC0gYXZfbG9nMihidWYpOyAvKiBjb3VudCBwcmVmaXggYml0cyAoemVyb2VzKSAqLworCisgICAgaWYgKGxvZyA8IHN3aXRjaF9iaXRzKSB7IC8qIG9rLCB3ZSBnb3QgYSByaWNlIGNvZGUgKi8KKyAgICAgICAgaWYgKCFyaWNlX29yZGVyKSB7CisgICAgICAgICAgICAvKiBzaG9ydGN1dCBmb3IgZmFzdGVyIGRlY29kaW5nIG9mIHJpY2UgY29kZXMgd2l0aG91dCByZW1haW5kZXIgKi8KKyAgICAgICAgICAgIGNvZGUgPSBsb2c7CisgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIGxvZyArIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJlZml4X2xlbiA9IGxvZyArIDE7CisgICAgICAgICAgICBjb2RlID0gKGxvZyA8PCByaWNlX29yZGVyKSArIE5FR19VU1IzMihidWYgPDwgcHJlZml4X2xlbiwgcmljZV9vcmRlcik7CisgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIHByZWZpeF9sZW4gKyByaWNlX29yZGVyKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8qIG90aGVyd2lzZSB3ZSBnb3QgYSBleHAgZ29sb21iIGNvZGUgKi8KKyAgICAgICAgbGVuICA9IChsb2cgPDwgMSkgLSBzd2l0Y2hfYml0cyArIGV4cF9vcmRlciArIDE7CisgICAgICAgIGNvZGUgPSBORUdfVVNSMzIoYnVmLCBsZW4pIC0gKDEgPDwgZXhwX29yZGVyKSArIChzd2l0Y2hfYml0cyA8PCByaWNlX29yZGVyKTsKKyAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsIGdiLCBsZW4pOworICAgIH0KKworICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOworCisgICAgcmV0dXJuIGNvZGU7Cit9CisKKyNkZWZpbmUgTFNCMlNJR04oeCkgKC0oKHgpICYgMSkpCisjZGVmaW5lIFRPU0lHTkVEKHgpICgoKHgpID4+IDEpIF4gTFNCMlNJR04oeCkpCisKKy8qKgorICogRGVjb2RlIERDIGNvZWZmaWNpZW50cyBmb3IgYWxsIGJsb2NrcyBpbiBhIHNsaWNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb2RlX2RjX2NvZWZmcyhHZXRCaXRDb250ZXh0ICpnYiwgaW50MTZfdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ibG9ja3MpCit7CisgICAgaW50MTZfdCBwcmV2X2RjOworICAgIGludCAgICAgaSwgc2lnbjsKKyAgICBpbnQxNl90IGRlbHRhOworICAgIHVuc2lnbmVkIGludCBjb2RlOworCisgICAgY29kZSAgID0gZGVjb2RlX3ZsY19jb2Rld29yZChnYiwgRklSU1RfRENfQ0IpOworICAgIG91dFswXSA9IHByZXZfZGMgPSBUT1NJR05FRChjb2RlKTsKKworICAgIG91dCAgICs9IDY0OyAvKiBtb3ZlIHRvIHRoZSBEQyBjb2VmZiBvZiB0aGUgbmV4dCBibG9jayAqLworICAgIGRlbHRhICA9IDM7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgbmJsb2NrczsgaSsrLCBvdXQgKz0gNjQpIHsKKyAgICAgICAgY29kZSA9IGRlY29kZV92bGNfY29kZXdvcmQoZ2IsIGZmX3Byb3Jlc19kY19jb2RlYm9va1tGRk1JTihGRkFCUyhkZWx0YSksIDMpXSk7CisKKyAgICAgICAgc2lnbiAgICAgPSAtKCgoZGVsdGEgPj4gMTUpICYgMSkgXiAoY29kZSAmIDEpKTsKKyAgICAgICAgZGVsdGEgICAgPSAoKChjb2RlICsgMSkgPj4gMSkgXiBzaWduKSAtIHNpZ247CisgICAgICAgIHByZXZfZGMgKz0gZGVsdGE7CisgICAgICAgIG91dFswXSAgID0gcHJldl9kYzsKKyAgICB9Cit9CisKKworLyoqCisgKiBEZWNvZGUgQUMgY29lZmZpY2llbnRzIGZvciBhbGwgYmxvY2tzIGluIGEgc2xpY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRlY29kZV9hY19jb2VmZnMoR2V0Qml0Q29udGV4dCAqZ2IsIGludDE2X3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2Nrc19wZXJfc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGFuZV9zaXplX2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2NhbikKK3sKKyAgICBpbnQgcG9zLCBibG9ja19tYXNrLCBydW4sIGxldmVsLCBzaWduLCBydW5fY2JfaW5kZXgsIGxldl9jYl9pbmRleDsKKyAgICBpbnQgbWF4X2NvZWZmcywgYml0c19sZWZ0OworCisgICAgLyogc2V0IGluaXRpYWwgcHJlZGljdGlvbiB2YWx1ZXMgKi8KKyAgICBydW4gICA9IDQ7CisgICAgbGV2ZWwgPSAyOworCisgICAgbWF4X2NvZWZmcyA9IGJsb2Nrc19wZXJfc2xpY2UgPDwgNjsKKyAgICBibG9ja19tYXNrID0gYmxvY2tzX3Blcl9zbGljZSAtIDE7CisKKyAgICBmb3IgKHBvcyA9IGJsb2Nrc19wZXJfc2xpY2UgLSAxOyBwb3MgPCBtYXhfY29lZmZzOykgeworICAgICAgICBydW5fY2JfaW5kZXggPSBmZl9wcm9yZXNfcnVuX3RvX2NiX2luZGV4W0ZGTUlOKHJ1biwgMTUpXTsKKyAgICAgICAgbGV2X2NiX2luZGV4ID0gZmZfcHJvcmVzX2xldl90b19jYl9pbmRleFtGRk1JTihsZXZlbCwgOSldOworCisgICAgICAgIGJpdHNfbGVmdCA9IGdldF9iaXRzX2xlZnQoZ2IpOworICAgICAgICBpZiAoYml0c19sZWZ0IDw9IDAgfHwgKGJpdHNfbGVmdCA8PSA4ICYmICFzaG93X2JpdHMoZ2IsIGJpdHNfbGVmdCkpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgcnVuID0gZGVjb2RlX3ZsY19jb2Rld29yZChnYiwgZmZfcHJvcmVzX2FjX2NvZGVib29rW3J1bl9jYl9pbmRleF0pOworICAgICAgICBpZiAocnVuIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGJpdHNfbGVmdCA9IGdldF9iaXRzX2xlZnQoZ2IpOworICAgICAgICBpZiAoYml0c19sZWZ0IDw9IDAgfHwgKGJpdHNfbGVmdCA8PSA4ICYmICFzaG93X2JpdHMoZ2IsIGJpdHNfbGVmdCkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgbGV2ZWwgPSBkZWNvZGVfdmxjX2NvZGV3b3JkKGdiLCBmZl9wcm9yZXNfYWNfY29kZWJvb2tbbGV2X2NiX2luZGV4XSkgKyAxOworICAgICAgICBpZiAobGV2ZWwgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgcG9zICs9IHJ1biArIDE7CisgICAgICAgIGlmIChwb3MgPj0gbWF4X2NvZWZmcykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHNpZ24gPSBnZXRfc2JpdHMoZ2IsIDEpOworICAgICAgICBvdXRbKChwb3MgJiBibG9ja19tYXNrKSA8PCA2KSArIHNjYW5bcG9zID4+IHBsYW5lX3NpemVfZmFjdG9yXV0gPQorICAgICAgICAgICAgKGxldmVsIF4gc2lnbikgLSBzaWduOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogRGVjb2RlIGEgc2xpY2UgcGxhbmUgKGx1bWEgb3IgY2hyb21hKS4KKyAqLworc3RhdGljIGludCBkZWNvZGVfc2xpY2VfcGxhbmUoUHJvcmVzQ29udGV4dCAqY3R4LCBQcm9yZXNUaHJlYWREYXRhICp0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhX3NpemUsIHVpbnQxNl90ICpvdXRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLCBpbnQgbWJzX3Blcl9zbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja3NfcGVyX21iLCBpbnQgcGxhbmVfc2l6ZV9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpxbWF0LCBpbnQgaXNfY2hyb21hKQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50MTZfdCAqYmxvY2tfcHRyOworICAgIGludCBtYl9udW0sIGJsb2Nrc19wZXJfc2xpY2UsIHJldDsKKworICAgIGJsb2Nrc19wZXJfc2xpY2UgPSBtYnNfcGVyX3NsaWNlICogYmxvY2tzX3Blcl9tYjsKKworICAgIG1lbXNldCh0ZC0+YmxvY2tzLCAwLCA4ICogNCAqIDY0ICogc2l6ZW9mKCp0ZC0+YmxvY2tzKSk7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCBkYXRhX3NpemUgPDwgMyk7CisKKyAgICBkZWNvZGVfZGNfY29lZmZzKCZnYiwgdGQtPmJsb2NrcywgYmxvY2tzX3Blcl9zbGljZSk7CisKKyAgICByZXQgPSBkZWNvZGVfYWNfY29lZmZzKCZnYiwgdGQtPmJsb2NrcywgYmxvY2tzX3Blcl9zbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX3NpemVfZmFjdG9yLCBjdHgtPnNjYW50YWJsZS5wZXJtdXRhdGVkKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlIHRyYW5zZm9ybSBhbmQgb3V0cHV0ICovCisgICAgYmxvY2tfcHRyID0gdGQtPmJsb2NrczsKKworICAgIGlmICghaXNfY2hyb21hKSB7CisgICAgICAgIGZvciAobWJfbnVtID0gMDsgbWJfbnVtIDwgbWJzX3Blcl9zbGljZTsgbWJfbnVtKyssIG91dF9wdHIgKz0gYmxvY2tzX3Blcl9tYiAqIDQpIHsKKyAgICAgICAgICAgIGN0eC0+ZHNwLmlkY3RfcHV0KG91dF9wdHIsICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwgYmxvY2tfcHRyLCBxbWF0KTsKKyAgICAgICAgICAgIGJsb2NrX3B0ciArPSA2NDsKKyAgICAgICAgICAgIGlmIChibG9ja3NfcGVyX21iID4gMikgeworICAgICAgICAgICAgICAgIGN0eC0+ZHNwLmlkY3RfcHV0KG91dF9wdHIgKyA4LCAgICAgICAgICAgIGxpbmVzaXplLCBibG9ja19wdHIsIHFtYXQpOworICAgICAgICAgICAgICAgIGJsb2NrX3B0ciArPSA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN0eC0+ZHNwLmlkY3RfcHV0KG91dF9wdHIgKyBsaW5lc2l6ZSAqIDQsICAgICBsaW5lc2l6ZSwgYmxvY2tfcHRyLCBxbWF0KTsKKyAgICAgICAgICAgIGJsb2NrX3B0ciArPSA2NDsKKyAgICAgICAgICAgIGlmIChibG9ja3NfcGVyX21iID4gMikgeworICAgICAgICAgICAgICAgIGN0eC0+ZHNwLmlkY3RfcHV0KG91dF9wdHIgKyBsaW5lc2l6ZSAqIDQgKyA4LCBsaW5lc2l6ZSwgYmxvY2tfcHRyLCBxbWF0KTsKKyAgICAgICAgICAgICAgICBibG9ja19wdHIgKz0gNjQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKG1iX251bSA9IDA7IG1iX251bSA8IG1ic19wZXJfc2xpY2U7IG1iX251bSsrLCBvdXRfcHRyICs9IGJsb2Nrc19wZXJfbWIgKiA0KSB7CisgICAgICAgICAgICBjdHgtPmRzcC5pZGN0X3B1dChvdXRfcHRyLCAgICAgICAgICAgICAgICAgICAgbGluZXNpemUsIGJsb2NrX3B0ciwgcW1hdCk7CisgICAgICAgICAgICBibG9ja19wdHIgKz0gNjQ7CisgICAgICAgICAgICBjdHgtPmRzcC5pZGN0X3B1dChvdXRfcHRyICsgbGluZXNpemUgKiA0LCAgICAgbGluZXNpemUsIGJsb2NrX3B0ciwgcW1hdCk7CisgICAgICAgICAgICBibG9ja19wdHIgKz0gNjQ7CisgICAgICAgICAgICBpZiAoYmxvY2tzX3Blcl9tYiA+IDIpIHsKKyAgICAgICAgICAgICAgICBjdHgtPmRzcC5pZGN0X3B1dChvdXRfcHRyICsgOCwgICAgICAgICAgICBsaW5lc2l6ZSwgYmxvY2tfcHRyLCBxbWF0KTsKKyAgICAgICAgICAgICAgICBibG9ja19wdHIgKz0gNjQ7CisgICAgICAgICAgICAgICAgY3R4LT5kc3AuaWRjdF9wdXQob3V0X3B0ciArIGxpbmVzaXplICogNCArIDgsIGxpbmVzaXplLCBibG9ja19wdHIsIHFtYXQpOworICAgICAgICAgICAgICAgIGJsb2NrX3B0ciArPSA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCB1bnBhY2tfYWxwaGEoR2V0Qml0Q29udGV4dCAqZ2IsIHVpbnQxNl90ICpkc3QsIGludCBudW1fY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1fYml0cykKK3sKKyAgICBjb25zdCBpbnQgbWFzayA9ICgxIDw8IG51bV9iaXRzKSAtIDE7CisgICAgaW50IGksIGlkeCwgdmFsLCBhbHBoYV92YWw7CisKKyAgICBpZHggICAgICAgPSAwOworICAgIGFscGhhX3ZhbCA9IG1hc2s7CisgICAgZG8geworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgICAgICAgICB2YWwgPSBnZXRfYml0cyhnYiwgbnVtX2JpdHMpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHNpZ247CisgICAgICAgICAgICAgICAgdmFsICA9IGdldF9iaXRzKGdiLCBudW1fYml0cyA9PSAxNiA/IDcgOiA0KTsKKyAgICAgICAgICAgICAgICBzaWduID0gdmFsICYgMTsKKyAgICAgICAgICAgICAgICB2YWwgID0gKHZhbCArIDIpID4+IDE7CisgICAgICAgICAgICAgICAgaWYgKHNpZ24pCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IC12YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbHBoYV92YWwgPSAoYWxwaGFfdmFsICsgdmFsKSAmIG1hc2s7CisgICAgICAgICAgICBpZiAobnVtX2JpdHMgPT0gMTYpCisgICAgICAgICAgICAgICAgZHN0W2lkeCsrXSA9IGFscGhhX3ZhbCA+PiA2OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRzdFtpZHgrK10gPSAoYWxwaGFfdmFsIDw8IDIpIHwgKGFscGhhX3ZhbCA+PiA2KTsKKyAgICAgICAgICAgIGlmIChpZHggPj0gbnVtX2NvZWZmcykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChnZXRfYml0czEoZ2IpKTsKKyAgICAgICAgdmFsID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBpZiAoIXZhbCkKKyAgICAgICAgICAgIHZhbCA9IGdldF9iaXRzKGdiLCAxMSk7CisgICAgICAgIGlmIChpZHggKyB2YWwgPiBudW1fY29lZmZzKQorICAgICAgICAgICAgdmFsID0gbnVtX2NvZWZmcyAtIGlkeDsKKyAgICAgICAgaWYgKG51bV9iaXRzID09IDE2KQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbDsgaSsrKQorICAgICAgICAgICAgICAgIGRzdFtpZHgrK10gPSBhbHBoYV92YWwgPj4gNjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbDsgaSsrKQorICAgICAgICAgICAgICAgIGRzdFtpZHgrK10gPSAoYWxwaGFfdmFsIDw8IDIpIHwgKGFscGhhX3ZhbCA+PiA2KTsKKyAgICB9IHdoaWxlIChpZHggPCBudW1fY29lZmZzKTsKK30KKworLyoqCisgKiBEZWNvZGUgYWxwaGEgc2xpY2UgcGxhbmUuCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9hbHBoYV9wbGFuZShQcm9yZXNDb250ZXh0ICpjdHgsIFByb3Jlc1RocmVhZERhdGEgKnRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqb3V0X3B0ciwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYnNfcGVyX3NsaWNlKQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGk7CisgICAgdWludDE2X3QgKmJsb2NrX3B0cjsKKworICAgIG1lbXNldCh0ZC0+YmxvY2tzLCAwLCA4ICogNCAqIDY0ICogc2l6ZW9mKCp0ZC0+YmxvY2tzKSk7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCBkYXRhX3NpemUgPDwgMyk7CisKKyAgICBpZiAoY3R4LT5hbHBoYV9pbmZvID09IDIpCisgICAgICAgIHVucGFja19hbHBoYSgmZ2IsIHRkLT5ibG9ja3MsIG1ic19wZXJfc2xpY2UgKiA0ICogNjQsIDE2KTsKKyAgICBlbHNlCisgICAgICAgIHVucGFja19hbHBoYSgmZ2IsIHRkLT5ibG9ja3MsIG1ic19wZXJfc2xpY2UgKiA0ICogNjQsIDgpOworCisgICAgYmxvY2tfcHRyID0gdGQtPmJsb2NrczsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIG1lbWNweShvdXRfcHRyLCBibG9ja19wdHIsIDE2ICogbWJzX3Blcl9zbGljZSAqIHNpemVvZigqb3V0X3B0cikpOworICAgICAgICBvdXRfcHRyICAgKz0gbGluZXNpemUgPj4gMTsKKyAgICAgICAgYmxvY2tfcHRyICs9IDE2ICogbWJzX3Blcl9zbGljZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEpCit7CisgICAgUHJvcmVzVGhyZWFkRGF0YSAqdGQgPSB0ZGF0YTsKKyAgICBQcm9yZXNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBtYl94X3BvcyAgPSB0ZC0+eF9wb3M7CisgICAgaW50IG1iX3lfcG9zICA9IHRkLT55X3BvczsKKyAgICBpbnQgcGljX251bSAgID0gY3R4LT5waWNfbnVtOworICAgIGludCBzbGljZV9udW0gPSB0ZC0+c2xpY2VfbnVtOworICAgIGludCBtYnNfcGVyX3NsaWNlID0gdGQtPnNsaWNlX3dpZHRoOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKyAgICB1aW50OF90ICp5X2RhdGEsICp1X2RhdGEsICp2X2RhdGEsICphX2RhdGE7CisgICAgQVZGcmFtZSAqcGljID0gY3R4LT5mcmFtZTsKKyAgICBpbnQgaSwgc2YsIHNsaWNlX3dpZHRoX2ZhY3RvcjsKKyAgICBpbnQgc2xpY2VfZGF0YV9zaXplLCBoZHJfc2l6ZTsKKyAgICBpbnQgeV9kYXRhX3NpemUsIHVfZGF0YV9zaXplLCB2X2RhdGFfc2l6ZSwgYV9kYXRhX3NpemU7CisgICAgaW50IHlfbGluZXNpemUsIHVfbGluZXNpemUsIHZfbGluZXNpemUsIGFfbGluZXNpemU7CisgICAgaW50IGNvZmZbNF07CisgICAgaW50IHJldDsKKworICAgIGJ1ZiAgICAgICAgICAgICA9IGN0eC0+c2xpY2VfZGF0YVtzbGljZV9udW1dLmluZGV4OworICAgIHNsaWNlX2RhdGFfc2l6ZSA9IGN0eC0+c2xpY2VfZGF0YVtzbGljZV9udW0gKyAxXS5pbmRleCAtIGJ1ZjsKKworICAgIHNsaWNlX3dpZHRoX2ZhY3RvciA9IGF2X2xvZzIobWJzX3Blcl9zbGljZSk7CisKKyAgICB5X2RhdGEgICAgID0gcGljLT5kYXRhWzBdOworICAgIHVfZGF0YSAgICAgPSBwaWMtPmRhdGFbMV07CisgICAgdl9kYXRhICAgICA9IHBpYy0+ZGF0YVsyXTsKKyAgICBhX2RhdGEgICAgID0gcGljLT5kYXRhWzNdOworICAgIHlfbGluZXNpemUgPSBwaWMtPmxpbmVzaXplWzBdOworICAgIHVfbGluZXNpemUgPSBwaWMtPmxpbmVzaXplWzFdOworICAgIHZfbGluZXNpemUgPSBwaWMtPmxpbmVzaXplWzJdOworICAgIGFfbGluZXNpemUgPSBwaWMtPmxpbmVzaXplWzNdOworCisgICAgaWYgKHBpYy0+aW50ZXJsYWNlZF9mcmFtZSkgeworICAgICAgICBpZiAoIShwaWNfbnVtIF4gcGljLT50b3BfZmllbGRfZmlyc3QpKSB7CisgICAgICAgICAgICB5X2RhdGEgKz0geV9saW5lc2l6ZTsKKyAgICAgICAgICAgIHVfZGF0YSArPSB1X2xpbmVzaXplOworICAgICAgICAgICAgdl9kYXRhICs9IHZfbGluZXNpemU7CisgICAgICAgICAgICBpZiAoYV9kYXRhKQorICAgICAgICAgICAgICAgIGFfZGF0YSArPSBhX2xpbmVzaXplOworICAgICAgICB9CisgICAgICAgIHlfbGluZXNpemUgPDw9IDE7CisgICAgICAgIHVfbGluZXNpemUgPDw9IDE7CisgICAgICAgIHZfbGluZXNpemUgPDw9IDE7CisgICAgICAgIGFfbGluZXNpemUgPDw9IDE7CisgICAgfQorICAgIHlfZGF0YSArPSAobWJfeV9wb3MgPDwgNCkgKiB5X2xpbmVzaXplICsgKG1iX3hfcG9zIDw8IDUpOworICAgIHVfZGF0YSArPSAobWJfeV9wb3MgPDwgNCkgKiB1X2xpbmVzaXplICsgKG1iX3hfcG9zIDw8IGN0eC0+bWJfY2hyb21hX2ZhY3Rvcik7CisgICAgdl9kYXRhICs9IChtYl95X3BvcyA8PCA0KSAqIHZfbGluZXNpemUgKyAobWJfeF9wb3MgPDwgY3R4LT5tYl9jaHJvbWFfZmFjdG9yKTsKKyAgICBpZiAoYV9kYXRhKQorICAgICAgICBhX2RhdGEgKz0gKG1iX3lfcG9zIDw8IDQpICogYV9saW5lc2l6ZSArIChtYl94X3BvcyA8PCA1KTsKKworICAgIGlmIChzbGljZV9kYXRhX3NpemUgPCA2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAic2xpY2UgZGF0YSB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBwYXJzZSBzbGljZSBoZWFkZXIgKi8KKyAgICBoZHJfc2l6ZSAgICA9IGJ1ZlswXSA+PiAzOworICAgIGNvZmZbMF0gICAgID0gaGRyX3NpemU7CisgICAgeV9kYXRhX3NpemUgPSBBVl9SQjE2KGJ1ZiArIDIpOworICAgIGNvZmZbMV0gICAgID0gY29mZlswXSArIHlfZGF0YV9zaXplOworICAgIHVfZGF0YV9zaXplID0gQVZfUkIxNihidWYgKyA0KTsKKyAgICBjb2ZmWzJdICAgICA9IGNvZmZbMV0gKyB1X2RhdGFfc2l6ZTsKKyAgICB2X2RhdGFfc2l6ZSA9IGhkcl9zaXplID4gNyA/IEFWX1JCMTYoYnVmICsgNikgOiBzbGljZV9kYXRhX3NpemUgLSBjb2ZmWzJdOworICAgIGNvZmZbM10gICAgID0gY29mZlsyXSArIHZfZGF0YV9zaXplOworICAgIGFfZGF0YV9zaXplID0gY3R4LT5hbHBoYV9pbmZvID8gc2xpY2VfZGF0YV9zaXplIC0gY29mZlszXSA6IDA7CisKKyAgICAvKiBpZiBWIG9yIGFscGhhIGNvbXBvbmVudCBzaXplIGlzIG5lZ2F0aXZlIHRoYXQgbWVhbnMgdGhhdCBwcmV2aW91cworICAgICAgIGNvbXBvbmVudCBzaXplcyBhcmUgdG9vIGxhcmdlICovCisgICAgaWYgKHZfZGF0YV9zaXplIDwgMCB8fCBhX2RhdGFfc2l6ZSA8IDAgfHwgaGRyX3NpemUgPCA2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBkYXRhIHNpemVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzZiA9IGF2X2NsaXAoYnVmWzFdLCAxLCAyMjQpOworICAgIHNmID0gc2YgPiAxMjggPyAoc2YgLSA5NikgPDwgMiA6IHNmOworCisgICAgLyogc2NhbGUgcXVhbnRpemF0aW9uIG1hdHJpeGVzIGFjY29yZGluZyB3aXRoIHNsaWNlJ3Mgc2NhbGUgZmFjdG9yICovCisgICAgLyogVE9ETzogdGhpcyBjYW4gYmUgU0lNRC1vcHRpbWl6ZWQgYSBsb3QgKi8KKyAgICBpZiAoY3R4LT5xbWF0X2NoYW5nZWQgfHwgc2YgIT0gdGQtPnByZXZfc2xpY2Vfc2YpIHsKKyAgICAgICAgdGQtPnByZXZfc2xpY2Vfc2YgPSBzZjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIHRkLT5xbWF0X2x1bWFfc2NhbGVkW2N0eC0+ZHNwLmlkY3RfcGVybXV0YXRpb25baV1dICAgPSBjdHgtPnFtYXRfbHVtYVtpXSAgICogc2Y7CisgICAgICAgICAgICB0ZC0+cW1hdF9jaHJvbWFfc2NhbGVkW2N0eC0+ZHNwLmlkY3RfcGVybXV0YXRpb25baV1dID0gY3R4LT5xbWF0X2Nocm9tYVtpXSAqIHNmOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZGVjb2RlIGx1bWEgcGxhbmUgKi8KKyAgICByZXQgPSBkZWNvZGVfc2xpY2VfcGxhbmUoY3R4LCB0ZCwgYnVmICsgY29mZlswXSwgeV9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCopIHlfZGF0YSwgeV9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJzX3Blcl9zbGljZSwgNCwgc2xpY2Vfd2lkdGhfZmFjdG9yICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPnFtYXRfbHVtYV9zY2FsZWQsIDApOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBkZWNvZGUgVSBjaHJvbWEgcGxhbmUgKi8KKyAgICByZXQgPSBkZWNvZGVfc2xpY2VfcGxhbmUoY3R4LCB0ZCwgYnVmICsgY29mZlsxXSwgdV9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCopIHVfZGF0YSwgdV9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJzX3Blcl9zbGljZSwgY3R4LT5udW1fY2hyb21hX2Jsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2Vfd2lkdGhfZmFjdG9yICsgY3R4LT5jaHJvbWFfZmFjdG9yIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPnFtYXRfY2hyb21hX3NjYWxlZCwgMSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBkZWNvZGUgViBjaHJvbWEgcGxhbmUgKi8KKyAgICByZXQgPSBkZWNvZGVfc2xpY2VfcGxhbmUoY3R4LCB0ZCwgYnVmICsgY29mZlsyXSwgdl9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCopIHZfZGF0YSwgdl9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJzX3Blcl9zbGljZSwgY3R4LT5udW1fY2hyb21hX2Jsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2Vfd2lkdGhfZmFjdG9yICsgY3R4LT5jaHJvbWFfZmFjdG9yIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPnFtYXRfY2hyb21hX3NjYWxlZCwgMSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBkZWNvZGUgYWxwaGEgcGxhbmUgaWYgYXZhaWxhYmxlICovCisgICAgaWYgKGFfZGF0YSAmJiBhX2RhdGFfc2l6ZSkKKyAgICAgICAgZGVjb2RlX2FscGhhX3BsYW5lKGN0eCwgdGQsIGJ1ZiArIGNvZmZbM10sIGFfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KikgYV9kYXRhLCBhX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJzX3Blcl9zbGljZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRlY29kZV9waWN0dXJlKFByb3Jlc0NvbnRleHQgKmN0eCwgaW50IHBpY19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgc2xpY2VfbnVtLCBzbGljZV93aWR0aCwgeF9wb3MsIHlfcG9zOworCisgICAgc2xpY2VfbnVtID0gMDsKKworICAgIGN0eC0+cGljX251bSA9IHBpY19udW07CisgICAgZm9yICh5X3BvcyA9IDA7IHlfcG9zIDwgY3R4LT5udW1feV9tYnM7IHlfcG9zKyspIHsKKyAgICAgICAgc2xpY2Vfd2lkdGggPSAxIDw8IGN0eC0+c2xpY2Vfd2lkdGhfZmFjdG9yOworCisgICAgICAgIGZvciAoeF9wb3MgPSAwOyB4X3BvcyA8IGN0eC0+bnVtX3hfbWJzICYmIHNsaWNlX3dpZHRoOworICAgICAgICAgICAgIHhfcG9zICs9IHNsaWNlX3dpZHRoKSB7CisgICAgICAgICAgICB3aGlsZSAoY3R4LT5udW1feF9tYnMgLSB4X3BvcyA8IHNsaWNlX3dpZHRoKQorICAgICAgICAgICAgICAgIHNsaWNlX3dpZHRoID4+PSAxOworCisgICAgICAgICAgICBjdHgtPnNsaWNlX2RhdGFbc2xpY2VfbnVtXS5zbGljZV9udW0gICA9IHNsaWNlX251bTsKKyAgICAgICAgICAgIGN0eC0+c2xpY2VfZGF0YVtzbGljZV9udW1dLnhfcG9zICAgICAgID0geF9wb3M7CisgICAgICAgICAgICBjdHgtPnNsaWNlX2RhdGFbc2xpY2VfbnVtXS55X3BvcyAgICAgICA9IHlfcG9zOworICAgICAgICAgICAgY3R4LT5zbGljZV9kYXRhW3NsaWNlX251bV0uc2xpY2Vfd2lkdGggPSBzbGljZV93aWR0aDsKKworICAgICAgICAgICAgc2xpY2VfbnVtKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYXZjdHgtPmV4ZWN1dGUoYXZjdHgsIGRlY29kZV9zbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5zbGljZV9kYXRhLCBOVUxMLCBzbGljZV9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjdHgtPnNsaWNlX2RhdGFbMF0pKTsKK30KKworCisjZGVmaW5lIE1PVkVfREFUQV9QVFIobmJ5dGVzKSBidWYgKz0gKG5ieXRlcyk7IGJ1Zl9zaXplIC09IChuYnl0ZXMpCisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgUHJvcmVzQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBpbnQgZnJhbWVfaGRyX3NpemUsIHBpY19udW0sIHBpY19kYXRhX3NpemU7CisKKyAgICBjdHgtPmZyYW1lICAgICAgICAgICAgPSBkYXRhOworICAgIGN0eC0+ZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGN0eC0+ZnJhbWUtPmtleV9mcmFtZSA9IDE7CisKKyAgICAvKiBjaGVjayBmcmFtZSBhdG9tIGNvbnRhaW5lciAqLworICAgIGlmIChidWZfc2l6ZSA8IDI4IHx8IGJ1Zl9zaXplIDwgQVZfUkIzMihidWYpIHx8CisgICAgICAgIEFWX1JCMzIoYnVmICsgNCkgIT0gRlJBTUVfSUQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGZyYW1lXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgTU9WRV9EQVRBX1BUUig4KTsKKworICAgIGZyYW1lX2hkcl9zaXplID0gZGVjb2RlX2ZyYW1lX2hlYWRlcihjdHgsIGJ1ZiwgYnVmX3NpemUsIGF2Y3R4KTsKKyAgICBpZiAoZnJhbWVfaGRyX3NpemUgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIE1PVkVfREFUQV9QVFIoZnJhbWVfaGRyX3NpemUpOworCisgICAgaWYgKGZmX2dldF9idWZmZXIoYXZjdHgsIGN0eC0+ZnJhbWUsIDApIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yIChwaWNfbnVtID0gMDsgY3R4LT5mcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSAtIHBpY19udW0gKyAxOyBwaWNfbnVtKyspIHsKKyAgICAgICAgcGljX2RhdGFfc2l6ZSA9IGRlY29kZV9waWN0dXJlX2hlYWRlcihjdHgsIGJ1ZiwgYnVmX3NpemUsIGF2Y3R4KTsKKyAgICAgICAgaWYgKHBpY19kYXRhX3NpemUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKGRlY29kZV9waWN0dXJlKGN0eCwgcGljX251bSwgYXZjdHgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIE1PVkVfREFUQV9QVFIocGljX2RhdGFfc2l6ZSk7CisgICAgfQorCisgICAgY3R4LT5mcmFtZSA9IE5VTEw7CisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUHJvcmVzQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZjdHgtPnNsaWNlX2RhdGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworQVZDb2RlYyBmZl9wcm9yZXNfbGdwbF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwcm9yZXNfbGdwbCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGxlIFByb1JlcyAoaUNvZGVjIFBybykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUFJPUkVTLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQcm9yZXNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcm9yZXNkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Byb3Jlc2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDYwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcm9yZXNkc3AuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogQXBwbGUgUHJvUmVzIGNvbXBhdGlibGUgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE1heGltIFBvbGlha292c2tpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAicHJvcmVzZHNwLmgiCisjaW5jbHVkZSAic2ltcGxlX2lkY3QuaCIKKworI2RlZmluZSBCSUFTICAgICAoMSA8PCAoUFJPUkVTX0JJVFNfUEVSX1NBTVBMRSAtIDEpKSAgICAgICAgICAgLy8vPCBiaWFzIHZhbHVlIGZvciBjb252ZXJ0aW5nIHNpZ25lZCBwaXhlbHMgaW50byB1bnNpZ25lZCBvbmVzCisjZGVmaW5lIENMSVBfTUlOICgxIDw8IChQUk9SRVNfQklUU19QRVJfU0FNUExFIC0gOCkpICAgICAgICAgICAvLy88IG1pbmltdW0gdmFsdWUgZm9yIGNsaXBwaW5nIHJlc3VsdGluZyBwaXhlbHMKKyNkZWZpbmUgQ0xJUF9NQVggKDEgPDwgUFJPUkVTX0JJVFNfUEVSX1NBTVBMRSkgLSBDTElQX01JTiAtIDEgIC8vLzwgbWF4aW11bSB2YWx1ZSBmb3IgY2xpcHBpbmcgcmVzdWx0aW5nIHBpeGVscworCisjZGVmaW5lIENMSVAoeCkgKGF2X2NsaXAoKHgpLCBDTElQX01JTiwgQ0xJUF9NQVgpKQorCisvKioKKyAqIEFkZCBiaWFzIHZhbHVlLCBjbGFtcCBhbmQgb3V0cHV0IHBpeGVscyBvZiBhIHNsaWNlCisgKi8KK3N0YXRpYyB2b2lkIHB1dF9waXhlbHModWludDE2X3QgKmRzdCwgaW50IHN0cmlkZSwgY29uc3QgaW50MTZfdCAqaW4pCit7CisgICAgaW50IHgsIHksIHNyY19vZmZzZXQsIGRzdF9vZmZzZXQ7CisKKyAgICBmb3IgKHkgPSAwLCBkc3Rfb2Zmc2V0ID0gMDsgeSA8IDg7IHkrKywgZHN0X29mZnNldCArPSBzdHJpZGUpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykgeworICAgICAgICAgICAgc3JjX29mZnNldCA9ICh5IDw8IDMpICsgeDsKKworICAgICAgICAgICAgZHN0W2RzdF9vZmZzZXQgKyB4XSA9IENMSVAoaW5bc3JjX29mZnNldF0pOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcm9yZXNfaWRjdF9wdXRfYyh1aW50MTZfdCAqb3V0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrLCBjb25zdCBpbnQxNl90ICpxbWF0KQoreworICAgIGZmX3Byb3Jlc19pZGN0KGJsb2NrLCBxbWF0KTsKKyAgICBwdXRfcGl4ZWxzKG91dCwgbGluZXNpemUgPj4gMSwgYmxvY2spOworfQorCithdl9jb2xkIHZvaWQgZmZfcHJvcmVzZHNwX2luaXQoUHJvcmVzRFNQQ29udGV4dCAqZHNwLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgZHNwLT5pZGN0X3B1dCA9IHByb3Jlc19pZGN0X3B1dF9jOworICAgIGRzcC0+aWRjdF9wZXJtdXRhdGlvbl90eXBlID0gRkZfSURDVF9QRVJNX05PTkU7CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX3Byb3Jlc2RzcF9pbml0X3g4Nihkc3AsIGF2Y3R4KTsKKworICAgIGZmX2luaXRfc2NhbnRhYmxlX3Blcm11dGF0aW9uKGRzcC0+aWRjdF9wZXJtdXRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3AtPmlkY3RfcGVybXV0YXRpb25fdHlwZSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wcm9yZXNkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3Byb3Jlc2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OTg2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wcm9yZXNkc3AuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQXBwbGUgUHJvUmVzIGNvbXBhdGlibGUgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE1heGltIFBvbGlha292c2tpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19QUk9SRVNEU1BfSAorI2RlZmluZSBBVkNPREVDX1BST1JFU0RTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKKyNkZWZpbmUgUFJPUkVTX0JJVFNfUEVSX1NBTVBMRSAxMCAvLy88IG91dHB1dCBwcmVjaXNpb24gb2YgcHJvcmVzIGRlY29kZXIKKwordHlwZWRlZiBzdHJ1Y3QgUHJvcmVzRFNQQ29udGV4dCB7CisgICAgaW50IGlkY3RfcGVybXV0YXRpb25fdHlwZTsKKyAgICB1aW50OF90IGlkY3RfcGVybXV0YXRpb25bNjRdOworICAgIHZvaWQgKCogaWRjdF9wdXQpICh1aW50MTZfdCAqb3V0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrLCBjb25zdCBpbnQxNl90ICpxbWF0KTsKK30gUHJvcmVzRFNQQ29udGV4dDsKKwordm9pZCBmZl9wcm9yZXNkc3BfaW5pdChQcm9yZXNEU1BDb250ZXh0ICpkc3AsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK3ZvaWQgZmZfcHJvcmVzZHNwX2luaXRfeDg2KFByb3Jlc0RTUENvbnRleHQgKmRzcCwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUFJPUkVTRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Byb3Jlc2VuY19hbmF0b2xpeS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHJvcmVzZW5jX2FuYXRvbGl5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ3MWY0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Byb3Jlc2VuY19hbmF0b2xpeS5jCkBAIC0wLDAgKzEsNjM2IEBACisvKgorICogQXBwbGUgUHJvUmVzIGVuY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQW5hdG9saXkgV2Fzc2VybWFuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFwcGxlIFByb1JlcyBlbmNvZGVyIChBbmF0b2xpeSBXYXNzZXJtYW4gdmVyc2lvbikKKyAqIEtub3duIEZPVVJDQ3M6ICdhcGNoJyAoSFEpLCAnYXBjbicgKFNEKSwgJ2FwY3MnIChMVCksICdhY3BvJyAoUHJveHkpCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJkY3QuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImZkY3Rkc3AuaCIKKworI2RlZmluZSBERUZBVUxUX1NMSUNFX01CX1dJRFRIIDgKKworI2RlZmluZSBGRl9QUk9GSUxFX1BST1JFU19QUk9YWSAgICAgMAorI2RlZmluZSBGRl9QUk9GSUxFX1BST1JFU19MVCAgICAgICAgMQorI2RlZmluZSBGRl9QUk9GSUxFX1BST1JFU19TVEFOREFSRCAgMgorI2RlZmluZSBGRl9QUk9GSUxFX1BST1JFU19IUSAgICAgICAgMworCitzdGF0aWMgY29uc3QgQVZQcm9maWxlIHByb2ZpbGVzW10gPSB7CisgICAgeyBGRl9QUk9GSUxFX1BST1JFU19QUk9YWSwgICAgImFwY28ifSwKKyAgICB7IEZGX1BST0ZJTEVfUFJPUkVTX0xULCAgICAgICAiYXBjcyJ9LAorICAgIHsgRkZfUFJPRklMRV9QUk9SRVNfU1RBTkRBUkQsICJhcGNuIn0sCisgICAgeyBGRl9QUk9GSUxFX1BST1JFU19IUSwgICAgICAgImFwY2gifSwKKyAgICB7IEZGX1BST0ZJTEVfVU5LTk9XTiB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IHFwX3N0YXJ0X3RhYmxlWzRdID0geyA0LCAxLCAxLCAxIH07CitzdGF0aWMgY29uc3QgaW50IHFwX2VuZF90YWJsZVs0XSAgID0geyA4LCA5LCA2LCA2IH07CitzdGF0aWMgY29uc3QgaW50IGJpdHJhdGVfdGFibGVbNV0gID0geyAxMDAwLCAyMTAwLCAzNTAwLCA1NDAwIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHByb2dyZXNzaXZlX3NjYW5bNjRdID0geworICAgICAwLCAgMSwgIDgsICA5LCAgMiwgIDMsIDEwLCAxMSwKKyAgICAxNiwgMTcsIDI0LCAyNSwgMTgsIDE5LCAyNiwgMjcsCisgICAgIDQsICA1LCAxMiwgMjAsIDEzLCAgNiwgIDcsIDE0LAorICAgIDIxLCAyOCwgMjksIDIyLCAxNSwgMjMsIDMwLCAzMSwKKyAgICAzMiwgMzMsIDQwLCA0OCwgNDEsIDM0LCAzNSwgNDIsCisgICAgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwgMzcsIDQ0LAorICAgIDUxLCA1OCwgNTksIDUyLCA0NSwgMzgsIDM5LCA0NiwKKyAgICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFFNQVRfTFVNQVs0XVs2NF0gPSB7CisgICAgeworICAgICAgICAgNCwgIDcsICA5LCAxMSwgMTMsIDE0LCAxNSwgNjMsCisgICAgICAgICA3LCAgNywgMTEsIDEyLCAxNCwgMTUsIDYzLCA2MywKKyAgICAgICAgIDksIDExLCAxMywgMTQsIDE1LCA2MywgNjMsIDYzLAorICAgICAgICAxMSwgMTEsIDEzLCAxNCwgNjMsIDYzLCA2MywgNjMsCisgICAgICAgIDExLCAxMywgMTQsIDYzLCA2MywgNjMsIDYzLCA2MywKKyAgICAgICAgMTMsIDE0LCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLAorICAgICAgICAxMywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsCisgICAgICAgIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MworICAgIH0sIHsKKyAgICAgICAgIDQsICA1LCAgNiwgIDcsICA5LCAxMSwgMTMsIDE1LAorICAgICAgICAgNSwgIDUsICA3LCAgOCwgMTEsIDEzLCAxNSwgMTcsCisgICAgICAgICA2LCAgNywgIDksIDExLCAxMywgMTUsIDE1LCAxNywKKyAgICAgICAgIDcsICA3LCAgOSwgMTEsIDEzLCAxNSwgMTcsIDE5LAorICAgICAgICAgNywgIDksIDExLCAxMywgMTQsIDE2LCAxOSwgMjMsCisgICAgICAgICA5LCAxMSwgMTMsIDE0LCAxNiwgMTksIDIzLCAyOSwKKyAgICAgICAgIDksIDExLCAxMywgMTUsIDE3LCAyMSwgMjgsIDM1LAorICAgICAgICAxMSwgMTMsIDE2LCAxNywgMjEsIDI4LCAzNSwgNDEKKyAgICB9LCB7CisgICAgICAgICA0LCAgNCwgIDUsICA1LCAgNiwgIDcsICA3LCAgOSwKKyAgICAgICAgIDQsICA0LCAgNSwgIDYsICA3LCAgNywgIDksICA5LAorICAgICAgICAgNSwgIDUsICA2LCAgNywgIDcsICA5LCAgOSwgMTAsCisgICAgICAgICA1LCAgNSwgIDYsICA3LCAgNywgIDksICA5LCAxMCwKKyAgICAgICAgIDUsICA2LCAgNywgIDcsICA4LCAgOSwgMTAsIDEyLAorICAgICAgICAgNiwgIDcsICA3LCAgOCwgIDksIDEwLCAxMiwgMTUsCisgICAgICAgICA2LCAgNywgIDcsICA5LCAxMCwgMTEsIDE0LCAxNywKKyAgICAgICAgIDcsICA3LCAgOSwgMTAsIDExLCAxNCwgMTcsIDIxCisgICAgfSwgeworICAgICAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgICAgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAorICAgICAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDUsCisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwKKyAgICAgICAgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA2LAorICAgICAgICAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNiwgIDcsCisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNSwgIDYsICA3LCAgNworICAgIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFFNQVRfQ0hST01BWzRdWzY0XSA9IHsKKyAgICB7CisgICAgICAgICA0LCAgNywgIDksIDExLCAxMywgMTQsIDYzLCA2MywKKyAgICAgICAgIDcsICA3LCAxMSwgMTIsIDE0LCA2MywgNjMsIDYzLAorICAgICAgICAgOSwgMTEsIDEzLCAxNCwgNjMsIDYzLCA2MywgNjMsCisgICAgICAgIDExLCAxMSwgMTMsIDE0LCA2MywgNjMsIDYzLCA2MywKKyAgICAgICAgMTEsIDEzLCAxNCwgNjMsIDYzLCA2MywgNjMsIDYzLAorICAgICAgICAxMywgMTQsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsCisgICAgICAgIDEzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywKKyAgICAgICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzCisgICAgfSwgeworICAgICAgICAgNCwgIDUsICA2LCAgNywgIDksIDExLCAxMywgMTUsCisgICAgICAgICA1LCAgNSwgIDcsICA4LCAxMSwgMTMsIDE1LCAxNywKKyAgICAgICAgIDYsICA3LCAgOSwgMTEsIDEzLCAxNSwgMTUsIDE3LAorICAgICAgICAgNywgIDcsICA5LCAxMSwgMTMsIDE1LCAxNywgMTksCisgICAgICAgICA3LCAgOSwgMTEsIDEzLCAxNCwgMTYsIDE5LCAyMywKKyAgICAgICAgIDksIDExLCAxMywgMTQsIDE2LCAxOSwgMjMsIDI5LAorICAgICAgICAgOSwgMTEsIDEzLCAxNSwgMTcsIDIxLCAyOCwgMzUsCisgICAgICAgIDExLCAxMywgMTYsIDE3LCAyMSwgMjgsIDM1LCA0MQorICAgIH0sIHsKKyAgICAgICAgIDQsICA0LCAgNSwgIDUsICA2LCAgNywgIDcsICA5LAorICAgICAgICAgNCwgIDQsICA1LCAgNiwgIDcsICA3LCAgOSwgIDksCisgICAgICAgICA1LCAgNSwgIDYsICA3LCAgNywgIDksICA5LCAxMCwKKyAgICAgICAgIDUsICA1LCAgNiwgIDcsICA3LCAgOSwgIDksIDEwLAorICAgICAgICAgNSwgIDYsICA3LCAgNywgIDgsICA5LCAxMCwgMTIsCisgICAgICAgICA2LCAgNywgIDcsICA4LCAgOSwgMTAsIDEyLCAxNSwKKyAgICAgICAgIDYsICA3LCAgNywgIDksIDEwLCAxMSwgMTQsIDE3LAorICAgICAgICAgNywgIDcsICA5LCAxMCwgMTEsIDE0LCAxNywgMjEKKyAgICB9LCB7CisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgICAgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAorICAgICAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwKKyAgICAgICAgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDUsICA1LAorICAgICAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwgIDYsCisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA2LCAgNywKKyAgICAgICAgIDQsICA0LCAgNCwgIDQsICA1LCAgNiwgIDcsICA3CisgICAgfQorfTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRkRDVERTUENvbnRleHQgZmRzcDsKKyAgICB1aW50OF90KiBmaWxsX3k7CisgICAgdWludDhfdCogZmlsbF91OworICAgIHVpbnQ4X3QqIGZpbGxfdjsKKworICAgIGludCBxbWF0X2x1bWFbMTZdWzY0XTsKKyAgICBpbnQgcW1hdF9jaHJvbWFbMTZdWzY0XTsKK30gUHJvcmVzQ29udGV4dDsKKworc3RhdGljIHZvaWQgZW5jb2RlX2NvZGV3b3JkKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgdmFsLCBpbnQgY29kZWJvb2spCit7CisgICAgdW5zaWduZWQgaW50IHJpY2Vfb3JkZXIsIGV4cF9vcmRlciwgc3dpdGNoX2JpdHMsIGZpcnN0X2V4cCwgZXhwLCB6ZXJvcywKKyAgICAgICAgICAgIG1hc2s7CisKKyAgICAvKiBudW1iZXIgb2YgYml0cyB0byBzd2l0Y2ggYmV0d2VlbiByaWNlIGFuZCBleHAgZ29sb21iICovCisgICAgc3dpdGNoX2JpdHMgPSBjb2RlYm9vayAmIDM7CisgICAgcmljZV9vcmRlciAgPSBjb2RlYm9vayA+PiA1OworICAgIGV4cF9vcmRlciAgID0gKGNvZGVib29rID4+IDIpICYgNzsKKworICAgIGZpcnN0X2V4cCA9ICgoc3dpdGNoX2JpdHMgKyAxKSA8PCByaWNlX29yZGVyKTsKKworICAgIGlmICh2YWwgPj0gZmlyc3RfZXhwKSB7IC8qIGV4cCBnb2xvbWIgKi8KKyAgICAgICAgdmFsIC09IGZpcnN0X2V4cDsKKyAgICAgICAgdmFsICs9ICgxIDw8IGV4cF9vcmRlcik7CisgICAgICAgIGV4cCA9IGF2X2xvZzIodmFsKTsKKyAgICAgICAgemVyb3MgPSBleHAgLSBleHBfb3JkZXIgKyBzd2l0Y2hfYml0cyArIDE7CisgICAgICAgIHB1dF9iaXRzKHBiLCB6ZXJvcywgMCk7CisgICAgICAgIHB1dF9iaXRzKHBiLCBleHAgKyAxLCB2YWwpOworICAgIH0gZWxzZSBpZiAocmljZV9vcmRlcikgeworICAgICAgICBtYXNrID0gKDEgPDwgcmljZV9vcmRlcikgLSAxOworICAgICAgICBwdXRfYml0cyhwYiwgKHZhbCA+PiByaWNlX29yZGVyKSwgMCk7CisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAxKTsKKyAgICAgICAgcHV0X2JpdHMocGIsIHJpY2Vfb3JkZXIsIHZhbCAmIG1hc2spOworICAgIH0gZWxzZSB7CisgICAgICAgIHB1dF9iaXRzKHBiLCB2YWwsIDApOworICAgICAgICBwdXRfYml0cyhwYiwgMSwgMSk7CisgICAgfQorfQorCisjZGVmaW5lIFFTQ0FMRShxbWF0LGluZCx2YWwpICgodmFsKSAvICgocW1hdClbaW5kXSkpCisjZGVmaW5lIFRPX0dPTE9NQih2YWwpICgoKHZhbCkgPDwgMSkgXiAoKHZhbCkgPj4gMzEpKQorI2RlZmluZSBESUZGX1NJR04odmFsLCBzaWduKSAoKCh2YWwpID4+IDMxKSBeIChzaWduKSkKKyNkZWZpbmUgSVNfTkVHQVRJVkUodmFsKSAoKCgodmFsKSA+PiAzMSkgXiAtMSkgKyAxKQorI2RlZmluZSBUT19HT0xPTUIyKHZhbCxzaWduKSAoKHZhbCk9PTAgPyAwIDogKCh2YWwpIDw8IDEpICsgKHNpZ24pKQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X2xldmVsKGludCB2YWwpCit7CisgICAgaW50IHNpZ24gPSAodmFsID4+IDMxKTsKKyAgICByZXR1cm4gKHZhbCBeIHNpZ24pIC0gc2lnbjsKK30KKworI2RlZmluZSBGSVJTVF9EQ19DQiAweEI4CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRjX2NvZGVib29rWzddID0geyAweDA0LCAweDI4LCAweDI4LCAweDRELCAweDRELCAweDcwLCAweDcwfTsKKworc3RhdGljIHZvaWQgZW5jb2RlX2RjX2NvZWZmcyhQdXRCaXRDb250ZXh0ICpwYiwgaW50MTZfdCAqaW4sCisgICAgICAgIGludCBibG9ja3NfcGVyX3NsaWNlLCBpbnQgKnFtYXQpCit7CisgICAgaW50IHByZXZfZGMsIGNvZGU7CisgICAgaW50IGksIHNpZ24sIGlkeDsKKyAgICBpbnQgbmV3X2RjLCBkZWx0YSwgZGlmZl9zaWduLCBuZXdfY29kZTsKKworICAgIHByZXZfZGMgPSBRU0NBTEUocW1hdCwgMCwgaW5bMF0gLSAxNjM4NCk7CisgICAgY29kZSA9IFRPX0dPTE9NQihwcmV2X2RjKTsKKyAgICBlbmNvZGVfY29kZXdvcmQocGIsIGNvZGUsIEZJUlNUX0RDX0NCKTsKKworICAgIGNvZGUgPSA1OyBzaWduID0gMDsgaWR4ID0gNjQ7CisgICAgZm9yIChpID0gMTsgaSA8IGJsb2Nrc19wZXJfc2xpY2U7IGkrKywgaWR4ICs9IDY0KSB7CisgICAgICAgIG5ld19kYyAgICA9IFFTQ0FMRShxbWF0LCAwLCBpbltpZHhdIC0gMTYzODQpOworICAgICAgICBkZWx0YSAgICAgPSBuZXdfZGMgLSBwcmV2X2RjOworICAgICAgICBkaWZmX3NpZ24gPSBESUZGX1NJR04oZGVsdGEsIHNpZ24pOworICAgICAgICBuZXdfY29kZSAgPSBUT19HT0xPTUIyKGdldF9sZXZlbChkZWx0YSksIGRpZmZfc2lnbik7CisKKyAgICAgICAgZW5jb2RlX2NvZGV3b3JkKHBiLCBuZXdfY29kZSwgZGNfY29kZWJvb2tbRkZNSU4oY29kZSwgNildKTsKKworICAgICAgICBjb2RlICAgICAgPSBuZXdfY29kZTsKKyAgICAgICAgc2lnbiAgICAgID0gZGVsdGEgPj4gMzE7CisgICAgICAgIHByZXZfZGMgICA9IG5ld19kYzsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ1bl90b19jYlsxNl0gPSB7IDB4MDYsIDB4MDYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MjksCisgICAgICAgIDB4MjksIDB4MjksIDB4MjksIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4NEMgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGxldl90b19jYlsxMF0gPSB7IDB4MDQsIDB4MEEsIDB4MDUsIDB4MDYsIDB4MDQsIDB4MjgsCisgICAgICAgIDB4MjgsIDB4MjgsIDB4MjgsIDB4NEMgfTsKKworc3RhdGljIHZvaWQgZW5jb2RlX2FjX2NvZWZmcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFB1dEJpdENvbnRleHQgKnBiLAorICAgICAgICBpbnQxNl90ICppbiwgaW50IGJsb2Nrc19wZXJfc2xpY2UsIGludCAqcW1hdCkKK3sKKyAgICBpbnQgcHJldl9ydW4gPSA0OworICAgIGludCBwcmV2X2xldmVsID0gMjsKKworICAgIGludCBydW4gPSAwLCBsZXZlbCwgY29kZSwgaSwgajsKKyAgICBmb3IgKGkgPSAxOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBpbnQgaW5kcCA9IHByb2dyZXNzaXZlX3NjYW5baV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBibG9ja3NfcGVyX3NsaWNlOyBqKyspIHsKKyAgICAgICAgICAgIGludCB2YWwgPSBRU0NBTEUocW1hdCwgaW5kcCwgaW5bKGogPDwgNikgKyBpbmRwXSk7CisgICAgICAgICAgICBpZiAodmFsKSB7CisgICAgICAgICAgICAgICAgZW5jb2RlX2NvZGV3b3JkKHBiLCBydW4sIHJ1bl90b19jYltGRk1JTihwcmV2X3J1biwgMTUpXSk7CisKKyAgICAgICAgICAgICAgICBwcmV2X3J1biAgID0gcnVuOworICAgICAgICAgICAgICAgIHJ1biAgICAgICAgPSAwOworICAgICAgICAgICAgICAgIGxldmVsICAgICAgPSBnZXRfbGV2ZWwodmFsKTsKKyAgICAgICAgICAgICAgICBjb2RlICAgICAgID0gbGV2ZWwgLSAxOworCisgICAgICAgICAgICAgICAgZW5jb2RlX2NvZGV3b3JkKHBiLCBjb2RlLCBsZXZfdG9fY2JbRkZNSU4ocHJldl9sZXZlbCwgOSldKTsKKworICAgICAgICAgICAgICAgIHByZXZfbGV2ZWwgPSBsZXZlbDsKKworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCBJU19ORUdBVElWRSh2YWwpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytydW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdldCh1aW50OF90ICpwaXhlbHMsIGludCBzdHJpZGUsIGludDE2X3QqIGJsb2NrKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBBVl9XTjY0KGJsb2NrLCBBVl9STjY0KHBpeGVscykpOworICAgICAgICBBVl9XTjY0KGJsb2NrKzQsIEFWX1JONjQocGl4ZWxzKzgpKTsKKyAgICAgICAgcGl4ZWxzICs9IHN0cmlkZTsKKyAgICAgICAgYmxvY2sgKz0gODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZkY3RfZ2V0KEZEQ1REU1BDb250ZXh0ICpmZHNwLCB1aW50OF90ICpwaXhlbHMsIGludCBzdHJpZGUsIGludDE2X3QqIGJsb2NrKQoreworICAgIGdldChwaXhlbHMsIHN0cmlkZSwgYmxvY2spOworICAgIGZkc3AtPmZkY3QoYmxvY2spOworfQorCitzdGF0aWMgaW50IGVuY29kZV9zbGljZV9wbGFuZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBtYl9jb3VudCwKKyAgICAgICAgdWludDhfdCAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgdWludDhfdCAqYnVmLCB1bnNpZ25lZCBidWZfc2l6ZSwKKyAgICAgICAgaW50ICpxbWF0LCBpbnQgY2hyb21hKQoreworICAgIFByb3Jlc0NvbnRleHQqIGN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgRkRDVERTUENvbnRleHQgKmZkc3AgPSAmY3R4LT5mZHNwOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYmxvY2tzKVtERUZBVUxUX1NMSUNFX01CX1dJRFRIIDw8IDhdLCAqYmxvY2s7CisgICAgaW50IGksIGJsb2Nrc19wZXJfc2xpY2U7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKworICAgIGJsb2NrID0gYmxvY2tzOworICAgIGZvciAoaSA9IDA7IGkgPCBtYl9jb3VudDsgaSsrKSB7CisgICAgICAgIGZkY3RfZ2V0KGZkc3AsIHNyYywgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCBibG9jayArICgwIDw8IDYpKTsKKyAgICAgICAgZmRjdF9nZXQoZmRzcCwgc3JjICsgOCAqIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIGJsb2NrICsgKCgyIC0gY2hyb21hKSA8PCA2KSk7CisgICAgICAgIGlmICghY2hyb21hKSB7CisgICAgICAgICAgICBmZGN0X2dldChmZHNwLCBzcmMgKyAxNiwgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCBibG9jayArICgxIDw8IDYpKTsKKyAgICAgICAgICAgIGZkY3RfZ2V0KGZkc3AsIHNyYyArIDE2ICsgOCAqIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIGJsb2NrICsgKDMgPDwgNikpOworICAgICAgICB9CisKKyAgICAgICAgYmxvY2sgKz0gKDI1NiA+PiBjaHJvbWEpOworICAgICAgICBzcmMgICArPSAoMzIgID4+IGNocm9tYSk7CisgICAgfQorCisgICAgYmxvY2tzX3Blcl9zbGljZSA9IG1iX2NvdW50IDw8ICgyIC0gY2hyb21hKTsKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgYnVmLCBidWZfc2l6ZSA8PCAzKTsKKworICAgIGVuY29kZV9kY19jb2VmZnMoJnBiLCBibG9ja3MsIGJsb2Nrc19wZXJfc2xpY2UsIHFtYXQpOworICAgIGVuY29kZV9hY19jb2VmZnMoYXZjdHgsICZwYiwgYmxvY2tzLCBibG9ja3NfcGVyX3NsaWNlLCBxbWF0KTsKKworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgcmV0dXJuIHB1dF9iaXRzX3B0cigmcGIpIC0gcGIuYnVmOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBlbmNvZGVfc2xpY2VfZGF0YShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgIHVpbnQ4X3QgKmRlc3RfeSwgdWludDhfdCAqZGVzdF91LCB1aW50OF90ICpkZXN0X3YsIGludCBsdW1hX3N0cmlkZSwKKyAgICAgICAgaW50IGNocm9tYV9zdHJpZGUsIHVuc2lnbmVkIG1iX2NvdW50LCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGRhdGFfc2l6ZSwKKyAgICAgICAgdW5zaWduZWQqIHlfZGF0YV9zaXplLCB1bnNpZ25lZCogdV9kYXRhX3NpemUsIHVuc2lnbmVkKiB2X2RhdGFfc2l6ZSwKKyAgICAgICAgaW50IHFwKQoreworICAgIFByb3Jlc0NvbnRleHQqIGN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICAqeV9kYXRhX3NpemUgPSBlbmNvZGVfc2xpY2VfcGxhbmUoYXZjdHgsIG1iX2NvdW50LCBkZXN0X3ksIGx1bWFfc3RyaWRlLAorICAgICAgICAgICAgYnVmLCBkYXRhX3NpemUsIGN0eC0+cW1hdF9sdW1hW3FwIC0gMV0sIDApOworCisgICAgaWYgKCEoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkgeworICAgICAgICAqdV9kYXRhX3NpemUgPSBlbmNvZGVfc2xpY2VfcGxhbmUoYXZjdHgsIG1iX2NvdW50LCBkZXN0X3UsCisgICAgICAgICAgICAgICAgY2hyb21hX3N0cmlkZSwgYnVmICsgKnlfZGF0YV9zaXplLCBkYXRhX3NpemUgLSAqeV9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgY3R4LT5xbWF0X2Nocm9tYVtxcCAtIDFdLCAxKTsKKworICAgICAgICAqdl9kYXRhX3NpemUgPSBlbmNvZGVfc2xpY2VfcGxhbmUoYXZjdHgsIG1iX2NvdW50LCBkZXN0X3YsCisgICAgICAgICAgICAgICAgY2hyb21hX3N0cmlkZSwgYnVmICsgKnlfZGF0YV9zaXplICsgKnVfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSAtICp5X2RhdGFfc2l6ZSAtICp1X2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICBjdHgtPnFtYXRfY2hyb21hW3FwIC0gMV0sIDEpOworICAgIH0KKworICAgIHJldHVybiAqeV9kYXRhX3NpemUgKyAqdV9kYXRhX3NpemUgKyAqdl9kYXRhX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIHN1YmltYWdlX3dpdGhfZmlsbCh1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LAorICAgICAgICB1bnNpZ25lZCBzdHJpZGUsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHVpbnQxNl90ICpkc3QsCisgICAgICAgIHVuc2lnbmVkIGRzdF93aWR0aCwgdW5zaWduZWQgZHN0X2hlaWdodCkKK3sKKworICAgIGludCBib3hfd2lkdGggPSBGRk1JTih3aWR0aCAtIHgsIGRzdF93aWR0aCk7CisgICAgaW50IGJveF9oZWlnaHQgPSBGRk1JTihoZWlnaHQgLSB5LCBkc3RfaGVpZ2h0KTsKKyAgICBpbnQgaSwgaiwgc3JjX3N0cmlkZSA9IHN0cmlkZSA+PiAxOworICAgIHVpbnQxNl90IGxhc3RfcGl4LCAqbGFzdF9saW5lOworCisgICAgc3JjICs9IHkgKiBzcmNfc3RyaWRlICsgeDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYm94X2hlaWdodDsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBib3hfd2lkdGg7ICsraikgeworICAgICAgICAgICAgZHN0W2pdID0gc3JjW2pdOworICAgICAgICB9CisgICAgICAgIGxhc3RfcGl4ID0gZHN0W2ogLSAxXTsKKyAgICAgICAgZm9yICg7IGogPCBkc3Rfd2lkdGg7IGorKykKKyAgICAgICAgICAgIGRzdFtqXSA9IGxhc3RfcGl4OworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdF93aWR0aDsKKyAgICB9CisgICAgbGFzdF9saW5lID0gZHN0IC0gZHN0X3dpZHRoOworICAgIGZvciAoOyBpIDwgZHN0X2hlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkc3Rfd2lkdGg7ICsraikgeworICAgICAgICAgICAgZHN0W2pdID0gbGFzdF9saW5lW2pdOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBkc3Rfd2lkdGg7CisgICAgfQorfQorCitzdGF0aWMgaW50IGVuY29kZV9zbGljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWRnJhbWUgKnBpYywgaW50IG1iX3gsCisgICAgICAgIGludCBtYl95LCB1bnNpZ25lZCBtYl9jb3VudCwgdWludDhfdCAqYnVmLCB1bnNpZ25lZCBkYXRhX3NpemUsCisgICAgICAgIGludCB1bnNhZmUsIGludCAqcXApCit7CisgICAgaW50IGx1bWFfc3RyaWRlLCBjaHJvbWFfc3RyaWRlOworICAgIGludCBoZHJfc2l6ZSA9IDYsIHNsaWNlX3NpemU7CisgICAgdWludDhfdCAqZGVzdF95LCAqZGVzdF91LCAqZGVzdF92OworICAgIHVuc2lnbmVkIHlfZGF0YV9zaXplID0gMCwgdV9kYXRhX3NpemUgPSAwLCB2X2RhdGFfc2l6ZSA9IDA7CisgICAgUHJvcmVzQ29udGV4dCogY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgdGd0X2JpdHMgICA9IChtYl9jb3VudCAqIGJpdHJhdGVfdGFibGVbYXZjdHgtPnByb2ZpbGVdKSA+PiAyOworICAgIGludCBsb3dfYnl0ZXMgID0gKHRndF9iaXRzIC0gKHRndF9iaXRzID4+IDMpKSA+PiAzOyAvLyAxMiUgYml0cmF0ZSBmbHVjdHVhdGlvbgorICAgIGludCBoaWdoX2J5dGVzID0gKHRndF9iaXRzICsgKHRndF9iaXRzID4+IDMpKSA+PiAzOworCisgICAgbHVtYV9zdHJpZGUgICA9IHBpYy0+bGluZXNpemVbMF07CisgICAgY2hyb21hX3N0cmlkZSA9IHBpYy0+bGluZXNpemVbMV07CisKKyAgICBkZXN0X3kgPSBwaWMtPmRhdGFbMF0gKyAobWJfeSA8PCA0KSAqIGx1bWFfc3RyaWRlICAgKyAobWJfeCA8PCA1KTsKKyAgICBkZXN0X3UgPSBwaWMtPmRhdGFbMV0gKyAobWJfeSA8PCA0KSAqIGNocm9tYV9zdHJpZGUgKyAobWJfeCA8PCA0KTsKKyAgICBkZXN0X3YgPSBwaWMtPmRhdGFbMl0gKyAobWJfeSA8PCA0KSAqIGNocm9tYV9zdHJpZGUgKyAobWJfeCA8PCA0KTsKKworICAgIGlmICh1bnNhZmUpIHsKKworICAgICAgICBzdWJpbWFnZV93aXRoX2ZpbGwoKHVpbnQxNl90ICopIHBpYy0+ZGF0YVswXSwgbWJfeCA8PCA0LCBtYl95IDw8IDQsCisgICAgICAgICAgICAgICAgbHVtYV9zdHJpZGUsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAodWludDE2X3QgKikgY3R4LT5maWxsX3ksIG1iX2NvdW50IDw8IDQsIDE2KTsKKyAgICAgICAgc3ViaW1hZ2Vfd2l0aF9maWxsKCh1aW50MTZfdCAqKSBwaWMtPmRhdGFbMV0sIG1iX3ggPDwgMywgbWJfeSA8PCA0LAorICAgICAgICAgICAgICAgIGNocm9tYV9zdHJpZGUsIGF2Y3R4LT53aWR0aCA+PiAxLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICh1aW50MTZfdCAqKSBjdHgtPmZpbGxfdSwgbWJfY291bnQgPDwgMywgMTYpOworICAgICAgICBzdWJpbWFnZV93aXRoX2ZpbGwoKHVpbnQxNl90ICopIHBpYy0+ZGF0YVsyXSwgbWJfeCA8PCAzLCBtYl95IDw8IDQsCisgICAgICAgICAgICAgICAgY2hyb21hX3N0cmlkZSwgYXZjdHgtPndpZHRoID4+IDEsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgKHVpbnQxNl90ICopIGN0eC0+ZmlsbF92LCBtYl9jb3VudCA8PCAzLCAxNik7CisKKyAgICAgICAgZW5jb2RlX3NsaWNlX2RhdGEoYXZjdHgsIGN0eC0+ZmlsbF95LCBjdHgtPmZpbGxfdSwgY3R4LT5maWxsX3YsCisgICAgICAgICAgICAgICAgbWJfY291bnQgPDwgNSwgbWJfY291bnQgPDwgNCwgbWJfY291bnQsIGJ1ZiArIGhkcl9zaXplLAorICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSAtIGhkcl9zaXplLCAmeV9kYXRhX3NpemUsICZ1X2RhdGFfc2l6ZSwgJnZfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICpxcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2xpY2Vfc2l6ZSA9IGVuY29kZV9zbGljZV9kYXRhKGF2Y3R4LCBkZXN0X3ksIGRlc3RfdSwgZGVzdF92LAorICAgICAgICAgICAgICAgIGx1bWFfc3RyaWRlLCBjaHJvbWFfc3RyaWRlLCBtYl9jb3VudCwgYnVmICsgaGRyX3NpemUsCisgICAgICAgICAgICAgICAgZGF0YV9zaXplIC0gaGRyX3NpemUsICZ5X2RhdGFfc2l6ZSwgJnVfZGF0YV9zaXplLCAmdl9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgKnFwKTsKKworICAgICAgICBpZiAoc2xpY2Vfc2l6ZSA+IGhpZ2hfYnl0ZXMgJiYgKnFwIDwgcXBfZW5kX3RhYmxlW2F2Y3R4LT5wcm9maWxlXSkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICpxcCArPSAxOworICAgICAgICAgICAgICAgIHNsaWNlX3NpemUgPSBlbmNvZGVfc2xpY2VfZGF0YShhdmN0eCwgZGVzdF95LCBkZXN0X3UsIGRlc3RfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGx1bWFfc3RyaWRlLCBjaHJvbWFfc3RyaWRlLCBtYl9jb3VudCwgYnVmICsgaGRyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUgLSBoZHJfc2l6ZSwgJnlfZGF0YV9zaXplLCAmdV9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAmdl9kYXRhX3NpemUsICpxcCk7CisgICAgICAgICAgICB9IHdoaWxlIChzbGljZV9zaXplID4gaGlnaF9ieXRlcyAmJiAqcXAgPCBxcF9lbmRfdGFibGVbYXZjdHgtPnByb2ZpbGVdKTsKKyAgICAgICAgfSBlbHNlIGlmIChzbGljZV9zaXplIDwgbG93X2J5dGVzICYmICpxcAorICAgICAgICAgICAgICAgID4gcXBfc3RhcnRfdGFibGVbYXZjdHgtPnByb2ZpbGVdKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgKnFwIC09IDE7CisgICAgICAgICAgICAgICAgc2xpY2Vfc2l6ZSA9IGVuY29kZV9zbGljZV9kYXRhKGF2Y3R4LCBkZXN0X3ksIGRlc3RfdSwgZGVzdF92LAorICAgICAgICAgICAgICAgICAgICAgICAgbHVtYV9zdHJpZGUsIGNocm9tYV9zdHJpZGUsIG1iX2NvdW50LCBidWYgKyBoZHJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSAtIGhkcl9zaXplLCAmeV9kYXRhX3NpemUsICZ1X2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ2X2RhdGFfc2l6ZSwgKnFwKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHNsaWNlX3NpemUgPCBsb3dfYnl0ZXMgJiYgKnFwID4gcXBfc3RhcnRfdGFibGVbYXZjdHgtPnByb2ZpbGVdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ1ZlswXSA9IGhkcl9zaXplIDw8IDM7CisgICAgYnVmWzFdID0gKnFwOworICAgIEFWX1dCMTYoYnVmICsgMiwgeV9kYXRhX3NpemUpOworICAgIEFWX1dCMTYoYnVmICsgNCwgdV9kYXRhX3NpemUpOworCisgICAgcmV0dXJuIGhkcl9zaXplICsgeV9kYXRhX3NpemUgKyB1X2RhdGFfc2l6ZSArIHZfZGF0YV9zaXplOworfQorCitzdGF0aWMgaW50IHByb3Jlc19lbmNvZGVfcGljdHVyZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWRnJhbWUgKnBpYywKKyAgICAgICAgdWludDhfdCAqYnVmLCBjb25zdCBpbnQgYnVmX3NpemUpCit7CisgICAgaW50IG1iX3dpZHRoID0gKGF2Y3R4LT53aWR0aCArIDE1KSA+PiA0OworICAgIGludCBtYl9oZWlnaHQgPSAoYXZjdHgtPmhlaWdodCArIDE1KSA+PiA0OworICAgIGludCBoZHJfc2l6ZSwgc2xfc2l6ZSwgaTsKKyAgICBpbnQgbWJfeSwgc2xfZGF0YV9zaXplLCBxcDsKKyAgICBpbnQgdW5zYWZlX2JvdCwgdW5zYWZlX3JpZ2h0OworICAgIHVpbnQ4X3QgKnNsX2RhdGEsICpzbF9kYXRhX3NpemVzOworICAgIGludCBzbGljZV9wZXJfbGluZSA9IDAsIHJlbSA9IG1iX3dpZHRoOworCisgICAgZm9yIChpID0gYXZfbG9nMihERUZBVUxUX1NMSUNFX01CX1dJRFRIKTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgc2xpY2VfcGVyX2xpbmUgKz0gcmVtID4+IGk7CisgICAgICAgIHJlbSAmPSAoMSA8PCBpKSAtIDE7CisgICAgfQorCisgICAgcXAgPSBxcF9zdGFydF90YWJsZVthdmN0eC0+cHJvZmlsZV07CisgICAgaGRyX3NpemUgPSA4OyBzbF9kYXRhX3NpemUgPSBidWZfc2l6ZSAtIGhkcl9zaXplOworICAgIHNsX2RhdGFfc2l6ZXMgPSBidWYgKyBoZHJfc2l6ZTsKKyAgICBzbF9kYXRhID0gc2xfZGF0YV9zaXplcyArIChzbGljZV9wZXJfbGluZSAqIG1iX2hlaWdodCAqIDIpOworICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBtYl9oZWlnaHQ7IG1iX3krKykgeworICAgICAgICBpbnQgbWJfeCA9IDA7CisgICAgICAgIGludCBzbGljZV9tYl9jb3VudCA9IERFRkFVTFRfU0xJQ0VfTUJfV0lEVEg7CisgICAgICAgIHdoaWxlIChtYl94IDwgbWJfd2lkdGgpIHsKKyAgICAgICAgICAgIHdoaWxlIChtYl93aWR0aCAtIG1iX3ggPCBzbGljZV9tYl9jb3VudCkKKyAgICAgICAgICAgICAgICBzbGljZV9tYl9jb3VudCA+Pj0gMTsKKworICAgICAgICAgICAgdW5zYWZlX2JvdCA9IChhdmN0eC0+aGVpZ2h0ICYgMHhmKSAmJiAobWJfeSA9PSBtYl9oZWlnaHQgLSAxKTsKKyAgICAgICAgICAgIHVuc2FmZV9yaWdodCA9IChhdmN0eC0+d2lkdGggJiAweGYpICYmIChtYl94ICsgc2xpY2VfbWJfY291bnQgPT0gbWJfd2lkdGgpOworCisgICAgICAgICAgICBzbF9zaXplID0gZW5jb2RlX3NsaWNlKGF2Y3R4LCBwaWMsIG1iX3gsIG1iX3ksIHNsaWNlX21iX2NvdW50LAorICAgICAgICAgICAgICAgICAgICBzbF9kYXRhLCBzbF9kYXRhX3NpemUsIHVuc2FmZV9ib3QgfHwgdW5zYWZlX3JpZ2h0LCAmcXApOworCisgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZzbF9kYXRhX3NpemVzLCBzbF9zaXplKTsKKyAgICAgICAgICAgIHNsX2RhdGEgICAgICAgICAgICs9IHNsX3NpemU7CisgICAgICAgICAgICBzbF9kYXRhX3NpemUgICAgICAtPSBzbF9zaXplOworICAgICAgICAgICAgbWJfeCAgICAgICAgICAgICAgKz0gc2xpY2VfbWJfY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWZbMF0gPSBoZHJfc2l6ZSA8PCAzOworICAgIEFWX1dCMzIoYnVmICsgMSwgc2xfZGF0YSAtIGJ1Zik7CisgICAgQVZfV0IxNihidWYgKyA1LCBzbGljZV9wZXJfbGluZSAqIG1iX2hlaWdodCk7CisgICAgYnVmWzddID0gYXZfbG9nMihERUZBVUxUX1NMSUNFX01CX1dJRFRIKSA8PCA0OworCisgICAgcmV0dXJuIHNsX2RhdGEgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgcHJvcmVzX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljdCwgaW50ICpnb3RfcGFja2V0KQoreworICAgIGludCBoZWFkZXJfc2l6ZSA9IDE0ODsKKyAgICB1aW50OF90ICpidWY7CisgICAgaW50IHBpY19zaXplLCByZXQ7CisgICAgaW50IGZyYW1lX3NpemUgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgMTYpICogRkZBTElHTihhdmN0eC0+aGVpZ2h0LCAxNikqMTYgKyA1MDAgKyBGRl9NSU5fQlVGRkVSX1NJWkU7IC8vRklYTUUgY2hvb3NlIHRpZ2h0ZXIgbGltaXQKKworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIGZyYW1lX3NpemUgKyBGRl9NSU5fQlVGRkVSX1NJWkUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBidWYgPSBwa3QtPmRhdGE7CisgICAgcGljX3NpemUgPSBwcm9yZXNfZW5jb2RlX3BpY3R1cmUoYXZjdHgsIHBpY3QsIGJ1ZiArIGhlYWRlcl9zaXplICsgOCwKKyAgICAgICAgICAgIHBrdC0+c2l6ZSAtIGhlYWRlcl9zaXplIC0gOCk7CisKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIHBpY19zaXplICsgOCArIGhlYWRlcl9zaXplKTsKKyAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJmJ1ZiwgImljcGYiLCA0KTsKKworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgaGVhZGVyX3NpemUpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgMCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZidWYsICJmbXBnIiwgNCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmYnVmLCBhdmN0eC0+d2lkdGgpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgYXZjdHgtPmhlaWdodCk7CisgICAgKmJ1ZisrID0gMHg4MzsgLy8gezEwfSg0MjIpezAwfXswMH0oZnJhbWUpezExfQorICAgICpidWYrKyA9IDA7CisgICAgKmJ1ZisrID0gMjsKKyAgICAqYnVmKysgPSAyOworICAgICpidWYrKyA9IDY7CisgICAgKmJ1ZisrID0gMzI7CisgICAgKmJ1ZisrID0gMDsKKyAgICAqYnVmKysgPSAzOworCisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZidWYsIFFNQVRfTFVNQVthdmN0eC0+cHJvZmlsZV0sICAgNjQpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmYnVmLCBRTUFUX0NIUk9NQVthdmN0eC0+cHJvZmlsZV0sIDY0KTsKKworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgIHBrdC0+c2l6ZSA9IHBpY19zaXplICsgOCArIGhlYWRlcl9zaXplOworICAgICpnb3RfcGFja2V0ID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzY2FsZV9tYXQoY29uc3QgdWludDhfdCogc3JjLCBpbnQqIGRzdCwgaW50IHNjYWxlKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICBkc3RbaV0gPSBzcmNbaV0gKiBzY2FsZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHByb3Jlc19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGk7CisgICAgUHJvcmVzQ29udGV4dCogY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1lVVjQyMlAxMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm5lZWQgWVVWNDIyUDEwXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDEwOworCisgICAgaWYgKGF2Y3R4LT53aWR0aCAmIDB4MSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAiZnJhbWUgd2lkdGggbmVlZHMgdG8gYmUgbXVsdGlwbGUgb2YgMlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPndpZHRoID4gNjU1MzQgfHwgYXZjdHgtPmhlaWdodCA+IDY1NTM1KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJUaGUgbWF4aW11bSBkaW1lbnNpb25zIGFyZSA2NTUzNHg2NTUzNVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKChhdmN0eC0+aGVpZ2h0ICYgMHhmKSB8fCAoYXZjdHgtPndpZHRoICYgMHhmKSkgeworICAgICAgICBjdHgtPmZpbGxfeSA9IGF2X21hbGxvYyg0ICogKERFRkFVTFRfU0xJQ0VfTUJfV0lEVEggPDwgOCkpOworICAgICAgICBpZiAoIWN0eC0+ZmlsbF95KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgY3R4LT5maWxsX3UgPSBjdHgtPmZpbGxfeSArIChERUZBVUxUX1NMSUNFX01CX1dJRFRIIDw8IDkpOworICAgICAgICBjdHgtPmZpbGxfdiA9IGN0eC0+ZmlsbF91ICsgKERFRkFVTFRfU0xJQ0VfTUJfV0lEVEggPDwgOCk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5wcm9maWxlID09IEZGX1BST0ZJTEVfVU5LTk9XTikgeworICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfUFJPUkVTX1NUQU5EQVJEOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICJlbmNvZGluZyB3aXRoIFByb1JlcyBzdGFuZGFyZCAoYXBjbikgcHJvZmlsZVxuIik7CisKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5wcm9maWxlIDwgRkZfUFJPRklMRV9QUk9SRVNfUFJPWFkKKyAgICAgICAgICAgIHx8IGF2Y3R4LT5wcm9maWxlID4gRkZfUFJPRklMRV9QUk9SRVNfSFEpIHsKKyAgICAgICAgYXZfbG9nKAorICAgICAgICAgICAgICAgIGF2Y3R4LAorICAgICAgICAgICAgICAgIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAidW5rbm93biBwcm9maWxlICVkLCB1c2UgWzAgLSBhcGNvLCAxIC0gYXBjcywgMiAtIGFwY24gKGRlZmF1bHQpLCAzIC0gYXBjaF1cbiIsCisgICAgICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZmZfZmRjdGRzcF9pbml0KCZjdHgtPmZkc3AsIGF2Y3R4KTsKKworICAgIGF2Y3R4LT5jb2RlY190YWcgPSBBVl9STDMyKChjb25zdCB1aW50OF90Kilwcm9maWxlc1thdmN0eC0+cHJvZmlsZV0ubmFtZSk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspIHsKKyAgICAgICAgc2NhbGVfbWF0KFFNQVRfTFVNQVthdmN0eC0+cHJvZmlsZV0gICwgY3R4LT5xbWF0X2x1bWFbaSAtIDFdICAsIGkpOworICAgICAgICBzY2FsZV9tYXQoUU1BVF9DSFJPTUFbYXZjdHgtPnByb2ZpbGVdLCBjdHgtPnFtYXRfY2hyb21hW2kgLSAxXSwgaSk7CisgICAgfQorCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcHJvcmVzX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUHJvcmVzQ29udGV4dCogY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5maWxsX3kpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfcHJvcmVzX2F3X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInByb3Jlc19hdyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGxlIFByb1JlcyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QUk9SRVMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFByb3Jlc0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHByb3Jlc19lbmNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBwcm9yZXNfZW5jb2RlX2Nsb3NlLAorICAgIC5lbmNvZGUyICAgICAgICA9IHByb3Jlc19lbmNvZGVfZnJhbWUsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXtBVl9QSVhfRk1UX1lVVjQyMlAxMCwgQVZfUElYX0ZNVF9OT05FfSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IENPREVDX0NBUF9JTlRSQV9PTkxZLAorICAgIC5wcm9maWxlcyAgICAgICA9IHByb2ZpbGVzCit9OworCitBVkNvZGVjIGZmX3Byb3Jlc19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwcm9yZXMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBsZSBQcm9SZXMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUFJPUkVTLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQcm9yZXNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBwcm9yZXNfZW5jb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gcHJvcmVzX2VuY29kZV9jbG9zZSwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBwcm9yZXNfZW5jb2RlX2ZyYW1lLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7QVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfTk9ORX0sCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMgfCBDT0RFQ19DQVBfSU5UUkFfT05MWSwKKyAgICAucHJvZmlsZXMgICAgICAgPSBwcm9maWxlcworfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Byb3Jlc2VuY19rb3N0eWEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Byb3Jlc2VuY19rb3N0eWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQzMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHJvcmVzZW5jX2tvc3R5YS5jCkBAIC0wLDAgKzEsMTM1OSBAQAorLyoKKyAqIEFwcGxlIFByb1JlcyBlbmNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGVuY29kZXIgYXBwZWFycyB0byBiZSBiYXNlZCBvbiBBbmF0b2xpeSBXYXNzZXJtYW5zIGNvbnNpZGVyaW5nCisgKiBzaW1pbGFyaXRpZXMgaW4gdGhlIGJ1Z3MuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZmRjdGRzcC5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicHJvcmVzZGF0YS5oIgorCisjZGVmaW5lIENGQUNUT1JfWTQyMiAyCisjZGVmaW5lIENGQUNUT1JfWTQ0NCAzCisKKyNkZWZpbmUgTUFYX01CU19QRVJfU0xJQ0UgOAorCisjZGVmaW5lIE1BWF9QTEFORVMgNAorCitlbnVtIHsKKyAgICBQUk9SRVNfUFJPRklMRV9BVVRPICA9IC0xLAorICAgIFBST1JFU19QUk9GSUxFX1BST1hZID0gMCwKKyAgICBQUk9SRVNfUFJPRklMRV9MVCwKKyAgICBQUk9SRVNfUFJPRklMRV9TVEFOREFSRCwKKyAgICBQUk9SRVNfUFJPRklMRV9IUSwKKyAgICBQUk9SRVNfUFJPRklMRV80NDQ0LAorfTsKKworZW51bSB7CisgICAgUVVBTlRfTUFUX1BST1hZID0gMCwKKyAgICBRVUFOVF9NQVRfTFQsCisgICAgUVVBTlRfTUFUX1NUQU5EQVJELAorICAgIFFVQU5UX01BVF9IUSwKKyAgICBRVUFOVF9NQVRfREVGQVVMVCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHByb3Jlc19xdWFudF9tYXRyaWNlc1tdWzY0XSA9IHsKKyAgICB7IC8vIHByb3h5CisgICAgICAgICA0LCAgNywgIDksIDExLCAxMywgMTQsIDE1LCA2MywKKyAgICAgICAgIDcsICA3LCAxMSwgMTIsIDE0LCAxNSwgNjMsIDYzLAorICAgICAgICAgOSwgMTEsIDEzLCAxNCwgMTUsIDYzLCA2MywgNjMsCisgICAgICAgIDExLCAxMSwgMTMsIDE0LCA2MywgNjMsIDYzLCA2MywKKyAgICAgICAgMTEsIDEzLCAxNCwgNjMsIDYzLCA2MywgNjMsIDYzLAorICAgICAgICAxMywgMTQsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsCisgICAgICAgIDEzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywKKyAgICAgICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLAorICAgIH0sCisgICAgeyAvLyBMVAorICAgICAgICAgNCwgIDUsICA2LCAgNywgIDksIDExLCAxMywgMTUsCisgICAgICAgICA1LCAgNSwgIDcsICA4LCAxMSwgMTMsIDE1LCAxNywKKyAgICAgICAgIDYsICA3LCAgOSwgMTEsIDEzLCAxNSwgMTUsIDE3LAorICAgICAgICAgNywgIDcsICA5LCAxMSwgMTMsIDE1LCAxNywgMTksCisgICAgICAgICA3LCAgOSwgMTEsIDEzLCAxNCwgMTYsIDE5LCAyMywKKyAgICAgICAgIDksIDExLCAxMywgMTQsIDE2LCAxOSwgMjMsIDI5LAorICAgICAgICAgOSwgMTEsIDEzLCAxNSwgMTcsIDIxLCAyOCwgMzUsCisgICAgICAgIDExLCAxMywgMTYsIDE3LCAyMSwgMjgsIDM1LCA0MSwKKyAgICB9LAorICAgIHsgLy8gc3RhbmRhcmQKKyAgICAgICAgIDQsICA0LCAgNSwgIDUsICA2LCAgNywgIDcsICA5LAorICAgICAgICAgNCwgIDQsICA1LCAgNiwgIDcsICA3LCAgOSwgIDksCisgICAgICAgICA1LCAgNSwgIDYsICA3LCAgNywgIDksICA5LCAxMCwKKyAgICAgICAgIDUsICA1LCAgNiwgIDcsICA3LCAgOSwgIDksIDEwLAorICAgICAgICAgNSwgIDYsICA3LCAgNywgIDgsICA5LCAxMCwgMTIsCisgICAgICAgICA2LCAgNywgIDcsICA4LCAgOSwgMTAsIDEyLCAxNSwKKyAgICAgICAgIDYsICA3LCAgNywgIDksIDEwLCAxMSwgMTQsIDE3LAorICAgICAgICAgNywgIDcsICA5LCAxMCwgMTEsIDE0LCAxNywgMjEsCisgICAgfSwKKyAgICB7IC8vIGhpZ2ggcXVhbGl0eQorICAgICAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgICAgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAorICAgICAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDUsCisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwKKyAgICAgICAgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA2LAorICAgICAgICAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNiwgIDcsCisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNSwgIDYsICA3LCAgNywKKyAgICB9LAorICAgIHsgLy8gY29kZWMgZGVmYXVsdAorICAgICAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgICAgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAorICAgICAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgICAgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAorICAgICAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICB9LAorfTsKKworI2RlZmluZSBOVU1fTUJfTElNSVRTIDQKK3N0YXRpYyBjb25zdCBpbnQgcHJvcmVzX21iX2xpbWl0c1tOVU1fTUJfTElNSVRTXSA9IHsKKyAgICAxNjIwLCAvLyB1cCB0byA3MjB4NTc2CisgICAgMjcwMCwgLy8gdXAgdG8gOTYweDcyMAorICAgIDYwNzUsIC8vIHVwIHRvIDE0NDB4MTA4MAorICAgIDkyMTYsIC8vIHVwIHRvIDIwNDh4MTE1MgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwcm9yZXNfcHJvZmlsZSB7CisgICAgY29uc3QgY2hhciAqZnVsbF9uYW1lOworICAgIHVpbnQzMl90ICAgIHRhZzsKKyAgICBpbnQgICAgICAgICBtaW5fcXVhbnQ7CisgICAgaW50ICAgICAgICAgbWF4X3F1YW50OworICAgIGludCAgICAgICAgIGJyX3RhYltOVU1fTUJfTElNSVRTXTsKKyAgICBpbnQgICAgICAgICBxdWFudDsKK30gcHJvcmVzX3Byb2ZpbGVfaW5mb1s1XSA9IHsKKyAgICB7CisgICAgICAgIC5mdWxsX25hbWUgPSAicHJveHkiLAorICAgICAgICAudGFnICAgICAgID0gTUtUQUcoJ2EnLCAncCcsICdjJywgJ28nKSwKKyAgICAgICAgLm1pbl9xdWFudCA9IDQsCisgICAgICAgIC5tYXhfcXVhbnQgPSA4LAorICAgICAgICAuYnJfdGFiICAgID0geyAzMDAsIDI0MiwgMjIwLCAxOTQgfSwKKyAgICAgICAgLnF1YW50ICAgICA9IFFVQU5UX01BVF9QUk9YWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmZ1bGxfbmFtZSA9ICJMVCIsCisgICAgICAgIC50YWcgICAgICAgPSBNS1RBRygnYScsICdwJywgJ2MnLCAncycpLAorICAgICAgICAubWluX3F1YW50ID0gMSwKKyAgICAgICAgLm1heF9xdWFudCA9IDksCisgICAgICAgIC5icl90YWIgICAgPSB7IDcyMCwgNTYwLCA0OTAsIDQ0MCB9LAorICAgICAgICAucXVhbnQgICAgID0gUVVBTlRfTUFUX0xULAorICAgIH0sCisgICAgeworICAgICAgICAuZnVsbF9uYW1lID0gInN0YW5kYXJkIiwKKyAgICAgICAgLnRhZyAgICAgICA9IE1LVEFHKCdhJywgJ3AnLCAnYycsICduJyksCisgICAgICAgIC5taW5fcXVhbnQgPSAxLAorICAgICAgICAubWF4X3F1YW50ID0gNiwKKyAgICAgICAgLmJyX3RhYiAgICA9IHsgMTA1MCwgODA4LCA3MTAsIDYzMiB9LAorICAgICAgICAucXVhbnQgICAgID0gUVVBTlRfTUFUX1NUQU5EQVJELAorICAgIH0sCisgICAgeworICAgICAgICAuZnVsbF9uYW1lID0gImhpZ2ggcXVhbGl0eSIsCisgICAgICAgIC50YWcgICAgICAgPSBNS1RBRygnYScsICdwJywgJ2MnLCAnaCcpLAorICAgICAgICAubWluX3F1YW50ID0gMSwKKyAgICAgICAgLm1heF9xdWFudCA9IDYsCisgICAgICAgIC5icl90YWIgICAgPSB7IDE1NjYsIDEyMTYsIDEwNzAsIDk1MCB9LAorICAgICAgICAucXVhbnQgICAgID0gUVVBTlRfTUFUX0hRLAorICAgIH0sCisgICAgeworICAgICAgICAuZnVsbF9uYW1lID0gIjQ0NDQiLAorICAgICAgICAudGFnICAgICAgID0gTUtUQUcoJ2EnLCAncCcsICc0JywgJ2gnKSwKKyAgICAgICAgLm1pbl9xdWFudCA9IDEsCisgICAgICAgIC5tYXhfcXVhbnQgPSA2LAorICAgICAgICAuYnJfdGFiICAgID0geyAyMzUwLCAxODI4LCAxNjAwLCAxNDI1IH0sCisgICAgICAgIC5xdWFudCAgICAgPSBRVUFOVF9NQVRfSFEsCisgICAgfQorfTsKKworI2RlZmluZSBUUkVMTElTX1dJRFRIIDE2CisjZGVmaW5lIFNDT1JFX0xJTUlUICAgSU5UX01BWCAvIDIKKworc3RydWN0IFRyZWxsaXNOb2RlIHsKKyAgICBpbnQgcHJldl9ub2RlOworICAgIGludCBxdWFudDsKKyAgICBpbnQgYml0czsKKyAgICBpbnQgc2NvcmU7Cit9OworCisjZGVmaW5lIE1BWF9TVE9SRURfUSAxNgorCit0eXBlZGVmIHN0cnVjdCBQcm9yZXNUaHJlYWREYXRhIHsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrcylbTUFYX1BMQU5FU11bNjQgKiA0ICogTUFYX01CU19QRVJfU0xJQ0VdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDE2X3QsIGVtdV9idWYpWzE2ICogMTZdOworICAgIGludDE2X3QgY3VzdG9tX3FbNjRdOworICAgIHN0cnVjdCBUcmVsbGlzTm9kZSAqbm9kZXM7Cit9IFByb3Jlc1RocmVhZERhdGE7CisKK3R5cGVkZWYgc3RydWN0IFByb3Jlc0NvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYmxvY2tzKVtNQVhfUExBTkVTXVs2NCAqIDQgKiBNQVhfTUJTX1BFUl9TTElDRV07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50MTZfdCwgZW11X2J1ZilbMTYqMTZdOworICAgIGludDE2X3QgcXVhbnRzW01BWF9TVE9SRURfUV1bNjRdOworICAgIGludDE2X3QgY3VzdG9tX3FbNjRdOworICAgIGNvbnN0IHVpbnQ4X3QgKnF1YW50X21hdDsKKyAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGU7CisKKyAgICB2b2lkICgqZmRjdCkoRkRDVERTUENvbnRleHQgKmZkc3AsIGNvbnN0IHVpbnQxNl90ICpzcmMsCisgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIEZEQ1REU1BDb250ZXh0IGZkc3A7CisKKyAgICBpbnQgbWJfd2lkdGgsIG1iX2hlaWdodDsKKyAgICBpbnQgbWJzX3Blcl9zbGljZTsKKyAgICBpbnQgbnVtX2Nocm9tYV9ibG9ja3MsIGNocm9tYV9mYWN0b3I7CisgICAgaW50IHNsaWNlc193aWR0aDsKKyAgICBpbnQgc2xpY2VzX3Blcl9waWN0dXJlOworICAgIGludCBwaWN0dXJlc19wZXJfZnJhbWU7IC8vIDEgZm9yIHByb2dyZXNzaXZlLCAyIGZvciBpbnRlcmxhY2VkCisgICAgaW50IGN1cl9waWN0dXJlX2lkeDsKKyAgICBpbnQgbnVtX3BsYW5lczsKKyAgICBpbnQgYml0c19wZXJfbWI7CisgICAgaW50IGZvcmNlX3F1YW50OworICAgIGludCBhbHBoYV9iaXRzOworICAgIGludCB3YXJuOworCisgICAgY2hhciAqdmVuZG9yOworICAgIGludCBxdWFudF9zZWw7CisKKyAgICBpbnQgZnJhbWVfc2l6ZV91cHBlcl9ib3VuZDsKKworICAgIGludCBwcm9maWxlOworICAgIGNvbnN0IHN0cnVjdCBwcm9yZXNfcHJvZmlsZSAqcHJvZmlsZV9pbmZvOworCisgICAgaW50ICpzbGljZV9xOworCisgICAgUHJvcmVzVGhyZWFkRGF0YSAqdGRhdGE7Cit9IFByb3Jlc0NvbnRleHQ7CisKK3N0YXRpYyB2b2lkIGdldF9zbGljZV9kYXRhKFByb3Jlc0NvbnRleHQgKmN0eCwgY29uc3QgdWludDE2X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9ja3MsIHVpbnQxNl90ICplbXVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ic19wZXJfc2xpY2UsIGludCBibG9ja3NfcGVyX21iLCBpbnQgaXNfY2hyb21hKQoreworICAgIGNvbnN0IHVpbnQxNl90ICplc3JjOworICAgIGNvbnN0IGludCBtYl93aWR0aCA9IDQgKiBibG9ja3NfcGVyX21iOworICAgIGludCBlbGluZXNpemU7CisgICAgaW50IGksIGosIGs7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWJzX3Blcl9zbGljZTsgaSsrLCBzcmMgKz0gbWJfd2lkdGgpIHsKKyAgICAgICAgaWYgKHggPj0gdykgeworICAgICAgICAgICAgbWVtc2V0KGJsb2NrcywgMCwgNjQgKiAobWJzX3Blcl9zbGljZSAtIGkpICogYmxvY2tzX3Blcl9tYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoKmJsb2NrcykpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh4ICsgbWJfd2lkdGggPD0gdyAmJiB5ICsgMTYgPD0gaCkgeworICAgICAgICAgICAgZXNyYyAgICAgID0gc3JjOworICAgICAgICAgICAgZWxpbmVzaXplID0gbGluZXNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgYncsIGJoLCBwaXg7CisKKyAgICAgICAgICAgIGVzcmMgICAgICA9IGVtdV9idWY7CisgICAgICAgICAgICBlbGluZXNpemUgPSAxNiAqIHNpemVvZigqZW11X2J1Zik7CisKKyAgICAgICAgICAgIGJ3ID0gRkZNSU4odyAtIHgsIG1iX3dpZHRoKTsKKyAgICAgICAgICAgIGJoID0gRkZNSU4oaCAtIHksIDE2KTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZW11X2J1ZiArIGogKiAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXNyYyArIGogKiBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYncgKiBzaXplb2YoKnNyYykpOworICAgICAgICAgICAgICAgIHBpeCA9IGVtdV9idWZbaiAqIDE2ICsgYncgLSAxXTsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSBidzsgayA8IG1iX3dpZHRoOyBrKyspCisgICAgICAgICAgICAgICAgICAgIGVtdV9idWZbaiAqIDE2ICsga10gPSBwaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKDsgaiA8IDE2OyBqKyspCisgICAgICAgICAgICAgICAgbWVtY3B5KGVtdV9idWYgKyBqICogMTYsCisgICAgICAgICAgICAgICAgICAgICAgIGVtdV9idWYgKyAoYmggLSAxKSAqIDE2LAorICAgICAgICAgICAgICAgICAgICAgICBtYl93aWR0aCAqIHNpemVvZigqZW11X2J1ZikpOworICAgICAgICB9CisgICAgICAgIGlmICghaXNfY2hyb21hKSB7CisgICAgICAgICAgICBjdHgtPmZkY3QoJmN0eC0+ZmRzcCwgZXNyYywgZWxpbmVzaXplLCBibG9ja3MpOworICAgICAgICAgICAgYmxvY2tzICs9IDY0OworICAgICAgICAgICAgaWYgKGJsb2Nrc19wZXJfbWIgPiAyKSB7CisgICAgICAgICAgICAgICAgY3R4LT5mZGN0KCZjdHgtPmZkc3AsIGVzcmMgKyA4LCBlbGluZXNpemUsIGJsb2Nrcyk7CisgICAgICAgICAgICAgICAgYmxvY2tzICs9IDY0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3R4LT5mZGN0KCZjdHgtPmZkc3AsIGVzcmMgKyBlbGluZXNpemUgKiA0LCBlbGluZXNpemUsIGJsb2Nrcyk7CisgICAgICAgICAgICBibG9ja3MgKz0gNjQ7CisgICAgICAgICAgICBpZiAoYmxvY2tzX3Blcl9tYiA+IDIpIHsKKyAgICAgICAgICAgICAgICBjdHgtPmZkY3QoJmN0eC0+ZmRzcCwgZXNyYyArIGVsaW5lc2l6ZSAqIDQgKyA4LCBlbGluZXNpemUsIGJsb2Nrcyk7CisgICAgICAgICAgICAgICAgYmxvY2tzICs9IDY0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3R4LT5mZGN0KCZjdHgtPmZkc3AsIGVzcmMsIGVsaW5lc2l6ZSwgYmxvY2tzKTsKKyAgICAgICAgICAgIGJsb2NrcyArPSA2NDsKKyAgICAgICAgICAgIGN0eC0+ZmRjdCgmY3R4LT5mZHNwLCBlc3JjICsgZWxpbmVzaXplICogNCwgZWxpbmVzaXplLCBibG9ja3MpOworICAgICAgICAgICAgYmxvY2tzICs9IDY0OworICAgICAgICAgICAgaWYgKGJsb2Nrc19wZXJfbWIgPiAyKSB7CisgICAgICAgICAgICAgICAgY3R4LT5mZGN0KCZjdHgtPmZkc3AsIGVzcmMgKyA4LCBlbGluZXNpemUsIGJsb2Nrcyk7CisgICAgICAgICAgICAgICAgYmxvY2tzICs9IDY0OworICAgICAgICAgICAgICAgIGN0eC0+ZmRjdCgmY3R4LT5mZHNwLCBlc3JjICsgZWxpbmVzaXplICogNCArIDgsIGVsaW5lc2l6ZSwgYmxvY2tzKTsKKyAgICAgICAgICAgICAgICBibG9ja3MgKz0gNjQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB4ICs9IG1iX3dpZHRoOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2V0X2FscGhhX2RhdGEoUHJvcmVzQ29udGV4dCAqY3R4LCBjb25zdCB1aW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrcywgaW50IG1ic19wZXJfc2xpY2UsIGludCBhYml0cykKK3sKKyAgICBjb25zdCBpbnQgc2xpY2Vfd2lkdGggPSAxNiAqIG1ic19wZXJfc2xpY2U7CisgICAgaW50IGksIGosIGNvcHlfdywgY29weV9oOworCisgICAgY29weV93ID0gRkZNSU4odyAtIHgsIHNsaWNlX3dpZHRoKTsKKyAgICBjb3B5X2ggPSBGRk1JTihoIC0geSwgMTYpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3B5X2g7IGkrKykgeworICAgICAgICBtZW1jcHkoYmxvY2tzLCBzcmMsIGNvcHlfdyAqIHNpemVvZigqc3JjKSk7CisgICAgICAgIGlmIChhYml0cyA9PSA4KQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvcHlfdzsgaisrKQorICAgICAgICAgICAgICAgIGJsb2Nrc1tqXSA+Pj0gMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvcHlfdzsgaisrKQorICAgICAgICAgICAgICAgIGJsb2Nrc1tqXSA9IChibG9ja3Nbal0gPDwgNikgfCAoYmxvY2tzW2pdID4+IDQpOworICAgICAgICBmb3IgKGogPSBjb3B5X3c7IGogPCBzbGljZV93aWR0aDsgaisrKQorICAgICAgICAgICAgYmxvY2tzW2pdID0gYmxvY2tzW2NvcHlfdyAtIDFdOworICAgICAgICBibG9ja3MgKz0gc2xpY2Vfd2lkdGg7CisgICAgICAgIHNyYyAgICArPSBsaW5lc2l6ZSA+PiAxOworICAgIH0KKyAgICBmb3IgKDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgbWVtY3B5KGJsb2NrcywgYmxvY2tzIC0gc2xpY2Vfd2lkdGgsIHNsaWNlX3dpZHRoICogc2l6ZW9mKCpibG9ja3MpKTsKKyAgICAgICAgYmxvY2tzICs9IHNsaWNlX3dpZHRoOworICAgIH0KK30KKworLyoqCisgKiBXcml0ZSBhbiB1bnNpZ25lZCByaWNlL2V4cCBnb2xvbWIgY29kZXdvcmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfdmxjX2NvZGV3b3JkKFB1dEJpdENvbnRleHQgKnBiLCB1bnNpZ25lZCBjb2RlYm9vaywgaW50IHZhbCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmljZV9vcmRlciwgZXhwX29yZGVyLCBzd2l0Y2hfYml0cywgc3dpdGNoX3ZhbDsKKyAgICBpbnQgZXhwb25lbnQ7CisKKyAgICAvKiBudW1iZXIgb2YgcHJlZml4IGJpdHMgdG8gc3dpdGNoIGJldHdlZW4gUmljZSBhbmQgZXhwR29sb21iICovCisgICAgc3dpdGNoX2JpdHMgPSAoY29kZWJvb2sgJiAzKSArIDE7CisgICAgcmljZV9vcmRlciAgPSAgY29kZWJvb2sgPj4gNTsgICAgICAgLyogcmljZSBjb2RlIG9yZGVyICovCisgICAgZXhwX29yZGVyICAgPSAoY29kZWJvb2sgPj4gMikgJiA3OyAgLyogZXhwIGdvbG9tYiBjb2RlIG9yZGVyICovCisKKyAgICBzd2l0Y2hfdmFsICA9IHN3aXRjaF9iaXRzIDw8IHJpY2Vfb3JkZXI7CisKKyAgICBpZiAodmFsID49IHN3aXRjaF92YWwpIHsKKyAgICAgICAgdmFsIC09IHN3aXRjaF92YWwgLSAoMSA8PCBleHBfb3JkZXIpOworICAgICAgICBleHBvbmVudCA9IGF2X2xvZzIodmFsKTsKKworICAgICAgICBwdXRfYml0cyhwYiwgZXhwb25lbnQgLSBleHBfb3JkZXIgKyBzd2l0Y2hfYml0cywgMCk7CisgICAgICAgIHB1dF9iaXRzKHBiLCBleHBvbmVudCArIDEsIHZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXhwb25lbnQgPSB2YWwgPj4gcmljZV9vcmRlcjsKKworICAgICAgICBpZiAoZXhwb25lbnQpCisgICAgICAgICAgICBwdXRfYml0cyhwYiwgZXhwb25lbnQsIDApOworICAgICAgICBwdXRfYml0cyhwYiwgMSwgMSk7CisgICAgICAgIGlmIChyaWNlX29yZGVyKQorICAgICAgICAgICAgcHV0X3NiaXRzKHBiLCByaWNlX29yZGVyLCB2YWwpOworICAgIH0KK30KKworI2RlZmluZSBHRVRfU0lHTih4KSAgKCh4KSA+PiAzMSkKKyNkZWZpbmUgTUFLRV9DT0RFKHgpICgoKHgpIDw8IDEpIF4gR0VUX1NJR04oeCkpCisKK3N0YXRpYyB2b2lkIGVuY29kZV9kY3MoUHV0Qml0Q29udGV4dCAqcGIsIGludDE2X3QgKmJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2Nrc19wZXJfc2xpY2UsIGludCBzY2FsZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgY29kZWJvb2sgPSAzLCBjb2RlLCBkYywgcHJldl9kYywgZGVsdGEsIHNpZ24sIG5ld19zaWduOworCisgICAgcHJldl9kYyA9IChibG9ja3NbMF0gLSAweDQwMDApIC8gc2NhbGU7CisgICAgZW5jb2RlX3ZsY19jb2Rld29yZChwYiwgRklSU1RfRENfQ0IsIE1BS0VfQ09ERShwcmV2X2RjKSk7CisgICAgc2lnbiAgICAgPSAwOworICAgIGNvZGVib29rID0gMzsKKyAgICBibG9ja3MgICs9IDY0OworCisgICAgZm9yIChpID0gMTsgaSA8IGJsb2Nrc19wZXJfc2xpY2U7IGkrKywgYmxvY2tzICs9IDY0KSB7CisgICAgICAgIGRjICAgICAgID0gKGJsb2Nrc1swXSAtIDB4NDAwMCkgLyBzY2FsZTsKKyAgICAgICAgZGVsdGEgICAgPSBkYyAtIHByZXZfZGM7CisgICAgICAgIG5ld19zaWduID0gR0VUX1NJR04oZGVsdGEpOworICAgICAgICBkZWx0YSAgICA9IChkZWx0YSBeIHNpZ24pIC0gc2lnbjsKKyAgICAgICAgY29kZSAgICAgPSBNQUtFX0NPREUoZGVsdGEpOworICAgICAgICBlbmNvZGVfdmxjX2NvZGV3b3JkKHBiLCBmZl9wcm9yZXNfZGNfY29kZWJvb2tbY29kZWJvb2tdLCBjb2RlKTsKKyAgICAgICAgY29kZWJvb2sgPSAoY29kZSArIChjb2RlICYgMSkpID4+IDE7CisgICAgICAgIGNvZGVib29rID0gRkZNSU4oY29kZWJvb2ssIDMpOworICAgICAgICBzaWduICAgICA9IG5ld19zaWduOworICAgICAgICBwcmV2X2RjICA9IGRjOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZW5jb2RlX2FjcyhQdXRCaXRDb250ZXh0ICpwYiwgaW50MTZfdCAqYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzX3Blcl9zbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYW5lX3NpemVfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzY2FuLCBjb25zdCBpbnQxNl90ICpxbWF0KQoreworICAgIGludCBpZHgsIGk7CisgICAgaW50IHJ1biwgbGV2ZWwsIHJ1bl9jYiwgbGV2X2NiOworICAgIGludCBtYXhfY29lZmZzLCBhYnNfbGV2ZWw7CisKKyAgICBtYXhfY29lZmZzID0gYmxvY2tzX3Blcl9zbGljZSA8PCA2OworICAgIHJ1bl9jYiAgICAgPSBmZl9wcm9yZXNfcnVuX3RvX2NiX2luZGV4WzRdOworICAgIGxldl9jYiAgICAgPSBmZl9wcm9yZXNfbGV2X3RvX2NiX2luZGV4WzJdOworICAgIHJ1biAgICAgICAgPSAwOworCisgICAgZm9yIChpID0gMTsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgZm9yIChpZHggPSBzY2FuW2ldOyBpZHggPCBtYXhfY29lZmZzOyBpZHggKz0gNjQpIHsKKyAgICAgICAgICAgIGxldmVsID0gYmxvY2tzW2lkeF0gLyBxbWF0W3NjYW5baV1dOworICAgICAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICAgICAgYWJzX2xldmVsID0gRkZBQlMobGV2ZWwpOworICAgICAgICAgICAgICAgIGVuY29kZV92bGNfY29kZXdvcmQocGIsIGZmX3Byb3Jlc19hY19jb2RlYm9va1tydW5fY2JdLCBydW4pOworICAgICAgICAgICAgICAgIGVuY29kZV92bGNfY29kZXdvcmQocGIsIGZmX3Byb3Jlc19hY19jb2RlYm9va1tsZXZfY2JdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzX2xldmVsIC0gMSk7CisgICAgICAgICAgICAgICAgcHV0X3NiaXRzKHBiLCAxLCBHRVRfU0lHTihsZXZlbCkpOworCisgICAgICAgICAgICAgICAgcnVuX2NiID0gZmZfcHJvcmVzX3J1bl90b19jYl9pbmRleFtGRk1JTihydW4sIDE1KV07CisgICAgICAgICAgICAgICAgbGV2X2NiID0gZmZfcHJvcmVzX2xldl90b19jYl9pbmRleFtGRk1JTihhYnNfbGV2ZWwsIDkpXTsKKyAgICAgICAgICAgICAgICBydW4gICAgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBlbmNvZGVfc2xpY2VfcGxhbmUoUHJvcmVzQ29udGV4dCAqY3R4LCBQdXRCaXRDb250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYnNfcGVyX3NsaWNlLCBpbnQxNl90ICpibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzX3Blcl9tYiwgaW50IHBsYW5lX3NpemVfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqcW1hdCkKK3sKKyAgICBpbnQgYmxvY2tzX3Blcl9zbGljZSwgc2F2ZWRfcG9zOworCisgICAgc2F2ZWRfcG9zID0gcHV0X2JpdHNfY291bnQocGIpOworICAgIGJsb2Nrc19wZXJfc2xpY2UgPSBtYnNfcGVyX3NsaWNlICogYmxvY2tzX3Blcl9tYjsKKworICAgIGVuY29kZV9kY3MocGIsIGJsb2NrcywgYmxvY2tzX3Blcl9zbGljZSwgcW1hdFswXSk7CisgICAgZW5jb2RlX2FjcyhwYiwgYmxvY2tzLCBibG9ja3NfcGVyX3NsaWNlLCBwbGFuZV9zaXplX2ZhY3RvciwKKyAgICAgICAgICAgICAgIGN0eC0+c2NhbnRhYmxlLCBxbWF0KTsKKyAgICBmbHVzaF9wdXRfYml0cyhwYik7CisKKyAgICByZXR1cm4gKHB1dF9iaXRzX2NvdW50KHBiKSAtIHNhdmVkX3BvcykgPj4gMzsKK30KKworc3RhdGljIHZvaWQgcHV0X2FscGhhX2RpZmYoUHV0Qml0Q29udGV4dCAqcGIsIGludCBjdXIsIGludCBwcmV2LCBpbnQgYWJpdHMpCit7CisgICAgY29uc3QgaW50IG1hc2sgID0gKDEgPDwgYWJpdHMpIC0gMTsKKyAgICBjb25zdCBpbnQgZGJpdHMgPSAoYWJpdHMgPT0gOCkgPyA0IDogNzsKKyAgICBjb25zdCBpbnQgZHNpemUgPSAxIDw8IGRiaXRzIC0gMTsKKyAgICBpbnQgZGlmZiA9IGN1ciAtIHByZXY7CisKKyAgICBkaWZmICY9IG1hc2s7CisgICAgaWYgKGRpZmYgPj0gKDEgPDwgYWJpdHMpIC0gZHNpemUpCisgICAgICAgIGRpZmYgLT0gMSA8PCBhYml0czsKKyAgICBpZiAoZGlmZiA8IC1kc2l6ZSB8fCBkaWZmID4gZHNpemUgfHwgIWRpZmYpIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIDEpOworICAgICAgICBwdXRfYml0cyhwYiwgYWJpdHMsIGRpZmYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKKyAgICAgICAgcHV0X2JpdHMocGIsIGRiaXRzIC0gMSwgRkZBQlMoZGlmZikgLSAxKTsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIGRpZmYgPCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9hbHBoYV9ydW4oUHV0Qml0Q29udGV4dCAqcGIsIGludCBydW4pCit7CisgICAgaWYgKHJ1bikgeworICAgICAgICBwdXRfYml0cyhwYiwgMSwgMCk7CisgICAgICAgIGlmIChydW4gPCAweDEwKQorICAgICAgICAgICAgcHV0X2JpdHMocGIsIDQsIHJ1bik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxNSwgcnVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXRfYml0cyhwYiwgMSwgMSk7CisgICAgfQorfQorCisvLyB0b2RvIGFscGhhIHF1YW50aXNhdGlvbiBmb3IgaGlnaCBxdWFudHMKK3N0YXRpYyBpbnQgZW5jb2RlX2FscGhhX3BsYW5lKFByb3Jlc0NvbnRleHQgKmN0eCwgUHV0Qml0Q29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJzX3Blcl9zbGljZSwgdWludDE2X3QgKmJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFudCkKK3sKKyAgICBjb25zdCBpbnQgYWJpdHMgPSBjdHgtPmFscGhhX2JpdHM7CisgICAgY29uc3QgaW50IG1hc2sgID0gKDEgPDwgYWJpdHMpIC0gMTsKKyAgICBjb25zdCBpbnQgbnVtX2NvZWZmcyA9IG1ic19wZXJfc2xpY2UgKiAyNTY7CisgICAgaW50IHNhdmVkX3BvcyA9IHB1dF9iaXRzX2NvdW50KHBiKTsKKyAgICBpbnQgcHJldiA9IG1hc2ssIGN1cjsKKyAgICBpbnQgaWR4ID0gMDsKKyAgICBpbnQgcnVuID0gMDsKKworICAgIGN1ciA9IGJsb2Nrc1tpZHgrK107CisgICAgcHV0X2FscGhhX2RpZmYocGIsIGN1ciwgcHJldiwgYWJpdHMpOworICAgIHByZXYgPSBjdXI7CisgICAgZG8geworICAgICAgICBjdXIgPSBibG9ja3NbaWR4KytdOworICAgICAgICBpZiAoY3VyICE9IHByZXYpIHsKKyAgICAgICAgICAgIHB1dF9hbHBoYV9ydW4gKHBiLCBydW4pOworICAgICAgICAgICAgcHV0X2FscGhhX2RpZmYocGIsIGN1ciwgcHJldiwgYWJpdHMpOworICAgICAgICAgICAgcHJldiA9IGN1cjsKKyAgICAgICAgICAgIHJ1biAgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVuKys7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChpZHggPCBudW1fY29lZmZzKTsKKyAgICBpZiAocnVuKQorICAgICAgICBwdXRfYWxwaGFfcnVuKHBiLCBydW4pOworICAgIGZsdXNoX3B1dF9iaXRzKHBiKTsKKyAgICByZXR1cm4gKHB1dF9iaXRzX2NvdW50KHBiKSAtIHNhdmVkX3BvcykgPj4gMzsKK30KKworc3RhdGljIGludCBlbmNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkZyYW1lICpwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplc1s0XSwgaW50IHgsIGludCB5LCBpbnQgcXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJzX3Blcl9zbGljZSkKK3sKKyAgICBQcm9yZXNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCB4cCwgeXA7CisgICAgaW50IHRvdGFsX3NpemUgPSAwOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmM7CisgICAgaW50IHNsaWNlX3dpZHRoX2ZhY3RvciA9IGF2X2xvZzIobWJzX3Blcl9zbGljZSk7CisgICAgaW50IG51bV9jYmxvY2tzLCBwd2lkdGgsIGxpbmVzaXplLCBsaW5lX2FkZDsKKyAgICBpbnQgcGxhbmVfZmFjdG9yLCBpc19jaHJvbWE7CisgICAgdWludDE2X3QgKnFtYXQ7CisKKyAgICBpZiAoY3R4LT5waWN0dXJlc19wZXJfZnJhbWUgPT0gMSkKKyAgICAgICAgbGluZV9hZGQgPSAwOworICAgIGVsc2UKKyAgICAgICAgbGluZV9hZGQgPSBjdHgtPmN1cl9waWN0dXJlX2lkeCBeICFwaWMtPnRvcF9maWVsZF9maXJzdDsKKworICAgIGlmIChjdHgtPmZvcmNlX3F1YW50KSB7CisgICAgICAgIHFtYXQgPSBjdHgtPnF1YW50c1swXTsKKyAgICB9IGVsc2UgaWYgKHF1YW50IDwgTUFYX1NUT1JFRF9RKSB7CisgICAgICAgIHFtYXQgPSBjdHgtPnF1YW50c1txdWFudF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcW1hdCA9IGN0eC0+Y3VzdG9tX3E7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgcW1hdFtpXSA9IGN0eC0+cXVhbnRfbWF0W2ldICogcXVhbnQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bnVtX3BsYW5lczsgaSsrKSB7CisgICAgICAgIGlzX2Nocm9tYSAgICA9IChpID09IDEgfHwgaSA9PSAyKTsKKyAgICAgICAgcGxhbmVfZmFjdG9yID0gc2xpY2Vfd2lkdGhfZmFjdG9yICsgMjsKKyAgICAgICAgaWYgKGlzX2Nocm9tYSkKKyAgICAgICAgICAgIHBsYW5lX2ZhY3RvciArPSBjdHgtPmNocm9tYV9mYWN0b3IgLSAzOworICAgICAgICBpZiAoIWlzX2Nocm9tYSB8fCBjdHgtPmNocm9tYV9mYWN0b3IgPT0gQ0ZBQ1RPUl9ZNDQ0KSB7CisgICAgICAgICAgICB4cCAgICAgICAgICA9IHggPDwgNDsKKyAgICAgICAgICAgIHlwICAgICAgICAgID0geSA8PCA0OworICAgICAgICAgICAgbnVtX2NibG9ja3MgPSA0OworICAgICAgICAgICAgcHdpZHRoICAgICAgPSBhdmN0eC0+d2lkdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4cCAgICAgICAgICA9IHggPDwgMzsKKyAgICAgICAgICAgIHlwICAgICAgICAgID0geSA8PCA0OworICAgICAgICAgICAgbnVtX2NibG9ja3MgPSAyOworICAgICAgICAgICAgcHdpZHRoICAgICAgPSBhdmN0eC0+d2lkdGggPj4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmVzaXplID0gcGljLT5saW5lc2l6ZVtpXSAqIGN0eC0+cGljdHVyZXNfcGVyX2ZyYW1lOworICAgICAgICBzcmMgPSAoY29uc3QgdWludDE2X3QqKShwaWMtPmRhdGFbaV0gKyB5cCAqIGxpbmVzaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9hZGQgKiBwaWMtPmxpbmVzaXplW2ldKSArIHhwOworCisgICAgICAgIGlmIChpIDwgMykgeworICAgICAgICAgICAgZ2V0X3NsaWNlX2RhdGEoY3R4LCBzcmMsIGxpbmVzaXplLCB4cCwgeXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2lkdGgsIGF2Y3R4LT5oZWlnaHQgLyBjdHgtPnBpY3R1cmVzX3Blcl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+YmxvY2tzWzBdLCBjdHgtPmVtdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYnNfcGVyX3NsaWNlLCBudW1fY2Jsb2NrcywgaXNfY2hyb21hKTsKKyAgICAgICAgICAgIHNpemVzW2ldID0gZW5jb2RlX3NsaWNlX3BsYW5lKGN0eCwgcGIsIHNyYywgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYnNfcGVyX3NsaWNlLCBjdHgtPmJsb2Nrc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jYmxvY2tzLCBwbGFuZV9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWF0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldF9hbHBoYV9kYXRhKGN0eCwgc3JjLCBsaW5lc2l6ZSwgeHAsIHlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdpZHRoLCBhdmN0eC0+aGVpZ2h0IC8gY3R4LT5waWN0dXJlc19wZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmJsb2Nrc1swXSwgbWJzX3Blcl9zbGljZSwgY3R4LT5hbHBoYV9iaXRzKTsKKyAgICAgICAgICAgIHNpemVzW2ldID0gZW5jb2RlX2FscGhhX3BsYW5lKGN0eCwgcGIsIG1ic19wZXJfc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmJsb2Nrc1swXSwgcXVhbnQpOworICAgICAgICB9CisgICAgICAgIHRvdGFsX3NpemUgKz0gc2l6ZXNbaV07CisgICAgICAgIGlmIChwdXRfYml0c19sZWZ0KHBiKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJVbmRlcmVzdGltYXRlZCByZXF1aXJlZCBidWZmZXIgc2l6ZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0b3RhbF9zaXplOworfQorCitzdGF0aWMgaW5saW5lIGludCBlc3RpbWF0ZV92bGModW5zaWduZWQgY29kZWJvb2ssIGludCB2YWwpCit7CisgICAgdW5zaWduZWQgaW50IHJpY2Vfb3JkZXIsIGV4cF9vcmRlciwgc3dpdGNoX2JpdHMsIHN3aXRjaF92YWw7CisgICAgaW50IGV4cG9uZW50OworCisgICAgLyogbnVtYmVyIG9mIHByZWZpeCBiaXRzIHRvIHN3aXRjaCBiZXR3ZWVuIFJpY2UgYW5kIGV4cEdvbG9tYiAqLworICAgIHN3aXRjaF9iaXRzID0gKGNvZGVib29rICYgMykgKyAxOworICAgIHJpY2Vfb3JkZXIgID0gIGNvZGVib29rID4+IDU7ICAgICAgIC8qIHJpY2UgY29kZSBvcmRlciAqLworICAgIGV4cF9vcmRlciAgID0gKGNvZGVib29rID4+IDIpICYgNzsgIC8qIGV4cCBnb2xvbWIgY29kZSBvcmRlciAqLworCisgICAgc3dpdGNoX3ZhbCAgPSBzd2l0Y2hfYml0cyA8PCByaWNlX29yZGVyOworCisgICAgaWYgKHZhbCA+PSBzd2l0Y2hfdmFsKSB7CisgICAgICAgIHZhbCAtPSBzd2l0Y2hfdmFsIC0gKDEgPDwgZXhwX29yZGVyKTsKKyAgICAgICAgZXhwb25lbnQgPSBhdl9sb2cyKHZhbCk7CisKKyAgICAgICAgcmV0dXJuIGV4cG9uZW50ICogMiAtIGV4cF9vcmRlciArIHN3aXRjaF9iaXRzICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKHZhbCA+PiByaWNlX29yZGVyKSArIHJpY2Vfb3JkZXIgKyAxOworICAgIH0KK30KKworc3RhdGljIGludCBlc3RpbWF0ZV9kY3MoaW50ICplcnJvciwgaW50MTZfdCAqYmxvY2tzLCBpbnQgYmxvY2tzX3Blcl9zbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2FsZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgY29kZWJvb2sgPSAzLCBjb2RlLCBkYywgcHJldl9kYywgZGVsdGEsIHNpZ24sIG5ld19zaWduOworICAgIGludCBiaXRzOworCisgICAgcHJldl9kYyAgPSAoYmxvY2tzWzBdIC0gMHg0MDAwKSAvIHNjYWxlOworICAgIGJpdHMgICAgID0gZXN0aW1hdGVfdmxjKEZJUlNUX0RDX0NCLCBNQUtFX0NPREUocHJldl9kYykpOworICAgIHNpZ24gICAgID0gMDsKKyAgICBjb2RlYm9vayA9IDM7CisgICAgYmxvY2tzICArPSA2NDsKKyAgICAqZXJyb3IgICs9IEZGQUJTKGJsb2Nrc1swXSAtIDB4NDAwMCkgJSBzY2FsZTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBibG9ja3NfcGVyX3NsaWNlOyBpKyssIGJsb2NrcyArPSA2NCkgeworICAgICAgICBkYyAgICAgICA9IChibG9ja3NbMF0gLSAweDQwMDApIC8gc2NhbGU7CisgICAgICAgICplcnJvciAgKz0gRkZBQlMoYmxvY2tzWzBdIC0gMHg0MDAwKSAlIHNjYWxlOworICAgICAgICBkZWx0YSAgICA9IGRjIC0gcHJldl9kYzsKKyAgICAgICAgbmV3X3NpZ24gPSBHRVRfU0lHTihkZWx0YSk7CisgICAgICAgIGRlbHRhICAgID0gKGRlbHRhIF4gc2lnbikgLSBzaWduOworICAgICAgICBjb2RlICAgICA9IE1BS0VfQ09ERShkZWx0YSk7CisgICAgICAgIGJpdHMgICAgKz0gZXN0aW1hdGVfdmxjKGZmX3Byb3Jlc19kY19jb2RlYm9va1tjb2RlYm9va10sIGNvZGUpOworICAgICAgICBjb2RlYm9vayA9IChjb2RlICsgKGNvZGUgJiAxKSkgPj4gMTsKKyAgICAgICAgY29kZWJvb2sgPSBGRk1JTihjb2RlYm9vaywgMyk7CisgICAgICAgIHNpZ24gICAgID0gbmV3X3NpZ247CisgICAgICAgIHByZXZfZGMgID0gZGM7CisgICAgfQorCisgICAgcmV0dXJuIGJpdHM7Cit9CisKK3N0YXRpYyBpbnQgZXN0aW1hdGVfYWNzKGludCAqZXJyb3IsIGludDE2X3QgKmJsb2NrcywgaW50IGJsb2Nrc19wZXJfc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhbmVfc2l6ZV9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzY2FuLCBjb25zdCBpbnQxNl90ICpxbWF0KQoreworICAgIGludCBpZHgsIGk7CisgICAgaW50IHJ1biwgbGV2ZWwsIHJ1bl9jYiwgbGV2X2NiOworICAgIGludCBtYXhfY29lZmZzLCBhYnNfbGV2ZWw7CisgICAgaW50IGJpdHMgPSAwOworCisgICAgbWF4X2NvZWZmcyA9IGJsb2Nrc19wZXJfc2xpY2UgPDwgNjsKKyAgICBydW5fY2IgICAgID0gZmZfcHJvcmVzX3J1bl90b19jYl9pbmRleFs0XTsKKyAgICBsZXZfY2IgICAgID0gZmZfcHJvcmVzX2xldl90b19jYl9pbmRleFsyXTsKKyAgICBydW4gICAgICAgID0gMDsKKworICAgIGZvciAoaSA9IDE7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIGZvciAoaWR4ID0gc2NhbltpXTsgaWR4IDwgbWF4X2NvZWZmczsgaWR4ICs9IDY0KSB7CisgICAgICAgICAgICBsZXZlbCAgID0gYmxvY2tzW2lkeF0gLyBxbWF0W3NjYW5baV1dOworICAgICAgICAgICAgKmVycm9yICs9IEZGQUJTKGJsb2Nrc1tpZHhdKSAlIHFtYXRbc2NhbltpXV07CisgICAgICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBhYnNfbGV2ZWwgPSBGRkFCUyhsZXZlbCk7CisgICAgICAgICAgICAgICAgYml0cyArPSBlc3RpbWF0ZV92bGMoZmZfcHJvcmVzX2FjX2NvZGVib29rW3J1bl9jYl0sIHJ1bik7CisgICAgICAgICAgICAgICAgYml0cyArPSBlc3RpbWF0ZV92bGMoZmZfcHJvcmVzX2FjX2NvZGVib29rW2xldl9jYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzX2xldmVsIC0gMSkgKyAxOworCisgICAgICAgICAgICAgICAgcnVuX2NiID0gZmZfcHJvcmVzX3J1bl90b19jYl9pbmRleFtGRk1JTihydW4sIDE1KV07CisgICAgICAgICAgICAgICAgbGV2X2NiID0gZmZfcHJvcmVzX2xldl90b19jYl9pbmRleFtGRk1JTihhYnNfbGV2ZWwsIDkpXTsKKyAgICAgICAgICAgICAgICBydW4gICAgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXRzOworfQorCitzdGF0aWMgaW50IGVzdGltYXRlX3NsaWNlX3BsYW5lKFByb3Jlc0NvbnRleHQgKmN0eCwgaW50ICplcnJvciwgaW50IHBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjLCBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYnNfcGVyX3NsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzX3Blcl9tYiwgaW50IHBsYW5lX3NpemVfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpxbWF0LCBQcm9yZXNUaHJlYWREYXRhICp0ZCkKK3sKKyAgICBpbnQgYmxvY2tzX3Blcl9zbGljZTsKKyAgICBpbnQgYml0czsKKworICAgIGJsb2Nrc19wZXJfc2xpY2UgPSBtYnNfcGVyX3NsaWNlICogYmxvY2tzX3Blcl9tYjsKKworICAgIGJpdHMgID0gZXN0aW1hdGVfZGNzKGVycm9yLCB0ZC0+YmxvY2tzW3BsYW5lXSwgYmxvY2tzX3Blcl9zbGljZSwgcW1hdFswXSk7CisgICAgYml0cyArPSBlc3RpbWF0ZV9hY3MoZXJyb3IsIHRkLT5ibG9ja3NbcGxhbmVdLCBibG9ja3NfcGVyX3NsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX3NpemVfZmFjdG9yLCBjdHgtPnNjYW50YWJsZSwgcW1hdCk7CisKKyAgICByZXR1cm4gRkZBTElHTihiaXRzLCA4KTsKK30KKworc3RhdGljIGludCBlc3RfYWxwaGFfZGlmZihpbnQgY3VyLCBpbnQgcHJldiwgaW50IGFiaXRzKQoreworICAgIGNvbnN0IGludCBtYXNrICA9ICgxIDw8IGFiaXRzKSAtIDE7CisgICAgY29uc3QgaW50IGRiaXRzID0gKGFiaXRzID09IDgpID8gNCA6IDc7CisgICAgY29uc3QgaW50IGRzaXplID0gMSA8PCBkYml0cyAtIDE7CisgICAgaW50IGRpZmYgPSBjdXIgLSBwcmV2OworCisgICAgZGlmZiAmPSBtYXNrOworICAgIGlmIChkaWZmID49ICgxIDw8IGFiaXRzKSAtIGRzaXplKQorICAgICAgICBkaWZmIC09IDEgPDwgYWJpdHM7CisgICAgaWYgKGRpZmYgPCAtZHNpemUgfHwgZGlmZiA+IGRzaXplIHx8ICFkaWZmKQorICAgICAgICByZXR1cm4gYWJpdHMgKyAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRiaXRzICsgMTsKK30KKworc3RhdGljIGludCBlc3RpbWF0ZV9hbHBoYV9wbGFuZShQcm9yZXNDb250ZXh0ICpjdHgsIGludCAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ic19wZXJfc2xpY2UsIGludCBxdWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2tzKQoreworICAgIGNvbnN0IGludCBhYml0cyA9IGN0eC0+YWxwaGFfYml0czsKKyAgICBjb25zdCBpbnQgbWFzayAgPSAoMSA8PCBhYml0cykgLSAxOworICAgIGNvbnN0IGludCBudW1fY29lZmZzID0gbWJzX3Blcl9zbGljZSAqIDI1NjsKKyAgICBpbnQgcHJldiA9IG1hc2ssIGN1cjsKKyAgICBpbnQgaWR4ID0gMDsKKyAgICBpbnQgcnVuID0gMDsKKyAgICBpbnQgYml0czsKKworICAgICplcnJvciA9IDA7CisgICAgY3VyID0gYmxvY2tzW2lkeCsrXTsKKyAgICBiaXRzID0gZXN0X2FscGhhX2RpZmYoY3VyLCBwcmV2LCBhYml0cyk7CisgICAgcHJldiA9IGN1cjsKKyAgICBkbyB7CisgICAgICAgIGN1ciA9IGJsb2Nrc1tpZHgrK107CisgICAgICAgIGlmIChjdXIgIT0gcHJldikgeworICAgICAgICAgICAgaWYgKCFydW4pCisgICAgICAgICAgICAgICAgYml0cysrOworICAgICAgICAgICAgZWxzZSBpZiAocnVuIDwgMHgxMCkKKyAgICAgICAgICAgICAgICBiaXRzICs9IDQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYml0cyArPSAxNTsKKyAgICAgICAgICAgIGJpdHMgKz0gZXN0X2FscGhhX2RpZmYoY3VyLCBwcmV2LCBhYml0cyk7CisgICAgICAgICAgICBwcmV2ID0gY3VyOworICAgICAgICAgICAgcnVuICA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW4rKzsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGlkeCA8IG51bV9jb2VmZnMpOworCisgICAgaWYgKHJ1bikgeworICAgICAgICBpZiAocnVuIDwgMHgxMCkKKyAgICAgICAgICAgIGJpdHMgKz0gNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYml0cyArPSAxNTsKKyAgICB9CisKKyAgICByZXR1cm4gYml0czsKK30KKworc3RhdGljIGludCBmaW5kX3NsaWNlX3F1YW50KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZGcmFtZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmVsbGlzX25vZGUsIGludCB4LCBpbnQgeSwgaW50IG1ic19wZXJfc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcmVzVGhyZWFkRGF0YSAqdGQpCit7CisgICAgUHJvcmVzQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcSwgcHEsIHhwLCB5cDsKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjOworICAgIGludCBzbGljZV93aWR0aF9mYWN0b3IgPSBhdl9sb2cyKG1ic19wZXJfc2xpY2UpOworICAgIGludCBudW1fY2Jsb2Nrc1tNQVhfUExBTkVTXSwgcHdpZHRoOworICAgIGludCBwbGFuZV9mYWN0b3JbTUFYX1BMQU5FU10sIGlzX2Nocm9tYVtNQVhfUExBTkVTXTsKKyAgICBjb25zdCBpbnQgbWluX3F1YW50ID0gY3R4LT5wcm9maWxlX2luZm8tPm1pbl9xdWFudDsKKyAgICBjb25zdCBpbnQgbWF4X3F1YW50ID0gY3R4LT5wcm9maWxlX2luZm8tPm1heF9xdWFudDsKKyAgICBpbnQgZXJyb3IsIGJpdHMsIGJpdHNfbGltaXQ7CisgICAgaW50IG1icywgcHJldiwgY3VyLCBuZXdfc2NvcmU7CisgICAgaW50IHNsaWNlX2JpdHNbVFJFTExJU19XSURUSF0sIHNsaWNlX3Njb3JlW1RSRUxMSVNfV0lEVEhdOworICAgIGludCBvdmVycXVhbnQ7CisgICAgdWludDE2X3QgKnFtYXQ7CisgICAgaW50IGxpbmVzaXplWzRdLCBsaW5lX2FkZDsKKworICAgIGlmIChjdHgtPnBpY3R1cmVzX3Blcl9mcmFtZSA9PSAxKQorICAgICAgICBsaW5lX2FkZCA9IDA7CisgICAgZWxzZQorICAgICAgICBsaW5lX2FkZCA9IGN0eC0+Y3VyX3BpY3R1cmVfaWR4IF4gIXBpYy0+dG9wX2ZpZWxkX2ZpcnN0OworICAgIG1icyA9IHggKyBtYnNfcGVyX3NsaWNlOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bnVtX3BsYW5lczsgaSsrKSB7CisgICAgICAgIGlzX2Nocm9tYVtpXSAgICA9IChpID09IDEgfHwgaSA9PSAyKTsKKyAgICAgICAgcGxhbmVfZmFjdG9yW2ldID0gc2xpY2Vfd2lkdGhfZmFjdG9yICsgMjsKKyAgICAgICAgaWYgKGlzX2Nocm9tYVtpXSkKKyAgICAgICAgICAgIHBsYW5lX2ZhY3RvcltpXSArPSBjdHgtPmNocm9tYV9mYWN0b3IgLSAzOworICAgICAgICBpZiAoIWlzX2Nocm9tYVtpXSB8fCBjdHgtPmNocm9tYV9mYWN0b3IgPT0gQ0ZBQ1RPUl9ZNDQ0KSB7CisgICAgICAgICAgICB4cCAgICAgICAgICAgICA9IHggPDwgNDsKKyAgICAgICAgICAgIHlwICAgICAgICAgICAgID0geSA8PCA0OworICAgICAgICAgICAgbnVtX2NibG9ja3NbaV0gPSA0OworICAgICAgICAgICAgcHdpZHRoICAgICAgICAgPSBhdmN0eC0+d2lkdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4cCAgICAgICAgICAgICA9IHggPDwgMzsKKyAgICAgICAgICAgIHlwICAgICAgICAgICAgID0geSA8PCA0OworICAgICAgICAgICAgbnVtX2NibG9ja3NbaV0gPSAyOworICAgICAgICAgICAgcHdpZHRoICAgICAgICAgPSBhdmN0eC0+d2lkdGggPj4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmVzaXplW2ldID0gcGljLT5saW5lc2l6ZVtpXSAqIGN0eC0+cGljdHVyZXNfcGVyX2ZyYW1lOworICAgICAgICBzcmMgPSAoY29uc3QgdWludDE2X3QqKShwaWMtPmRhdGFbaV0gKyB5cCAqIGxpbmVzaXplW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9hZGQgKiBwaWMtPmxpbmVzaXplW2ldKSArIHhwOworCisgICAgICAgIGlmIChpIDwgMykgeworICAgICAgICAgICAgZ2V0X3NsaWNlX2RhdGEoY3R4LCBzcmMsIGxpbmVzaXplW2ldLCB4cCwgeXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2lkdGgsIGF2Y3R4LT5oZWlnaHQgLyBjdHgtPnBpY3R1cmVzX3Blcl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5ibG9ja3NbaV0sIHRkLT5lbXVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJzX3Blcl9zbGljZSwgbnVtX2NibG9ja3NbaV0sIGlzX2Nocm9tYVtpXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRfYWxwaGFfZGF0YShjdHgsIHNyYywgbGluZXNpemVbaV0sIHhwLCB5cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3aWR0aCwgYXZjdHgtPmhlaWdodCAvIGN0eC0+cGljdHVyZXNfcGVyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmJsb2Nrc1tpXSwgbWJzX3Blcl9zbGljZSwgY3R4LT5hbHBoYV9iaXRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAocSA9IG1pbl9xdWFudDsgcSA8IG1heF9xdWFudCArIDI7IHErKykgeworICAgICAgICB0ZC0+bm9kZXNbdHJlbGxpc19ub2RlICsgcV0ucHJldl9ub2RlID0gLTE7CisgICAgICAgIHRkLT5ub2Rlc1t0cmVsbGlzX25vZGUgKyBxXS5xdWFudCAgICAgPSBxOworICAgIH0KKworICAgIC8vIHRvZG86IG1heWJlIHBlcmZvcm0gY29hcnNlciBxdWFudGlzaW5nIHRvIGZpdCBpbnRvIGZyYW1lIHNpemUgd2hlbiBuZWVkZWQKKyAgICBmb3IgKHEgPSBtaW5fcXVhbnQ7IHEgPD0gbWF4X3F1YW50OyBxKyspIHsKKyAgICAgICAgYml0cyAgPSAwOworICAgICAgICBlcnJvciA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm51bV9wbGFuZXMgLSAhIWN0eC0+YWxwaGFfYml0czsgaSsrKSB7CisgICAgICAgICAgICBiaXRzICs9IGVzdGltYXRlX3NsaWNlX3BsYW5lKGN0eCwgJmVycm9yLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYnNfcGVyX3NsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2Jsb2Nrc1tpXSwgcGxhbmVfZmFjdG9yW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnF1YW50c1txXSwgdGQpOworICAgICAgICB9CisgICAgICAgIGlmIChjdHgtPmFscGhhX2JpdHMpCisgICAgICAgICAgICBiaXRzICs9IGVzdGltYXRlX2FscGhhX3BsYW5lKGN0eCwgJmVycm9yLCBzcmMsIGxpbmVzaXplWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYnNfcGVyX3NsaWNlLCBxLCB0ZC0+YmxvY2tzWzNdKTsKKyAgICAgICAgaWYgKGJpdHMgPiA2NTAwMCAqIDgpIHsKKyAgICAgICAgICAgIGVycm9yID0gU0NPUkVfTElNSVQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzbGljZV9iaXRzW3FdICA9IGJpdHM7CisgICAgICAgIHNsaWNlX3Njb3JlW3FdID0gZXJyb3I7CisgICAgfQorICAgIGlmIChzbGljZV9iaXRzW21heF9xdWFudF0gPD0gY3R4LT5iaXRzX3Blcl9tYiAqIG1ic19wZXJfc2xpY2UpIHsKKyAgICAgICAgc2xpY2VfYml0c1ttYXhfcXVhbnQgKyAxXSAgPSBzbGljZV9iaXRzW21heF9xdWFudF07CisgICAgICAgIHNsaWNlX3Njb3JlW21heF9xdWFudCArIDFdID0gc2xpY2Vfc2NvcmVbbWF4X3F1YW50XSArIDE7CisgICAgICAgIG92ZXJxdWFudCA9IG1heF9xdWFudDsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHEgPSBtYXhfcXVhbnQgKyAxOyBxIDwgMTI4OyBxKyspIHsKKyAgICAgICAgICAgIGJpdHMgID0gMDsKKyAgICAgICAgICAgIGVycm9yID0gMDsKKyAgICAgICAgICAgIGlmIChxIDwgTUFYX1NUT1JFRF9RKSB7CisgICAgICAgICAgICAgICAgcW1hdCA9IGN0eC0+cXVhbnRzW3FdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxbWF0ID0gdGQtPmN1c3RvbV9xOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBxbWF0W2ldID0gY3R4LT5xdWFudF9tYXRbaV0gKiBxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bnVtX3BsYW5lcyAtICEhY3R4LT5hbHBoYV9iaXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBiaXRzICs9IGVzdGltYXRlX3NsaWNlX3BsYW5lKGN0eCwgJmVycm9yLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBsaW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ic19wZXJfc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2Jsb2Nrc1tpXSwgcGxhbmVfZmFjdG9yW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1hdCwgdGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN0eC0+YWxwaGFfYml0cykKKyAgICAgICAgICAgICAgICBiaXRzICs9IGVzdGltYXRlX2FscGhhX3BsYW5lKGN0eCwgJmVycm9yLCBzcmMsIGxpbmVzaXplWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJzX3Blcl9zbGljZSwgcSwgdGQtPmJsb2Nrc1szXSk7CisgICAgICAgICAgICBpZiAoYml0cyA8PSBjdHgtPmJpdHNfcGVyX21iICogbWJzX3Blcl9zbGljZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNsaWNlX2JpdHNbbWF4X3F1YW50ICsgMV0gID0gYml0czsKKyAgICAgICAgc2xpY2Vfc2NvcmVbbWF4X3F1YW50ICsgMV0gPSBlcnJvcjsKKyAgICAgICAgb3ZlcnF1YW50ID0gcTsKKyAgICB9CisgICAgdGQtPm5vZGVzW3RyZWxsaXNfbm9kZSArIG1heF9xdWFudCArIDFdLnF1YW50ID0gb3ZlcnF1YW50OworCisgICAgYml0c19saW1pdCA9IG1icyAqIGN0eC0+Yml0c19wZXJfbWI7CisgICAgZm9yIChwcSA9IG1pbl9xdWFudDsgcHEgPCBtYXhfcXVhbnQgKyAyOyBwcSsrKSB7CisgICAgICAgIHByZXYgPSB0cmVsbGlzX25vZGUgLSBUUkVMTElTX1dJRFRIICsgcHE7CisKKyAgICAgICAgZm9yIChxID0gbWluX3F1YW50OyBxIDwgbWF4X3F1YW50ICsgMjsgcSsrKSB7CisgICAgICAgICAgICBjdXIgPSB0cmVsbGlzX25vZGUgKyBxOworCisgICAgICAgICAgICBiaXRzICA9IHRkLT5ub2Rlc1twcmV2XS5iaXRzICsgc2xpY2VfYml0c1txXTsKKyAgICAgICAgICAgIGVycm9yID0gc2xpY2Vfc2NvcmVbcV07CisgICAgICAgICAgICBpZiAoYml0cyA+IGJpdHNfbGltaXQpCisgICAgICAgICAgICAgICAgZXJyb3IgPSBTQ09SRV9MSU1JVDsKKworICAgICAgICAgICAgaWYgKHRkLT5ub2Rlc1twcmV2XS5zY29yZSA8IFNDT1JFX0xJTUlUICYmIGVycm9yIDwgU0NPUkVfTElNSVQpCisgICAgICAgICAgICAgICAgbmV3X3Njb3JlID0gdGQtPm5vZGVzW3ByZXZdLnNjb3JlICsgZXJyb3I7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmV3X3Njb3JlID0gU0NPUkVfTElNSVQ7CisgICAgICAgICAgICBpZiAodGQtPm5vZGVzW2N1cl0ucHJldl9ub2RlID09IC0xIHx8CisgICAgICAgICAgICAgICAgdGQtPm5vZGVzW2N1cl0uc2NvcmUgPj0gbmV3X3Njb3JlKSB7CisKKyAgICAgICAgICAgICAgICB0ZC0+bm9kZXNbY3VyXS5iaXRzICAgICAgPSBiaXRzOworICAgICAgICAgICAgICAgIHRkLT5ub2Rlc1tjdXJdLnNjb3JlICAgICA9IG5ld19zY29yZTsKKyAgICAgICAgICAgICAgICB0ZC0+bm9kZXNbY3VyXS5wcmV2X25vZGUgPSBwcmV2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZXJyb3IgPSB0ZC0+bm9kZXNbdHJlbGxpc19ub2RlICsgbWluX3F1YW50XS5zY29yZTsKKyAgICBwcSAgICA9IHRyZWxsaXNfbm9kZSArIG1pbl9xdWFudDsKKyAgICBmb3IgKHEgPSBtaW5fcXVhbnQgKyAxOyBxIDwgbWF4X3F1YW50ICsgMjsgcSsrKSB7CisgICAgICAgIGlmICh0ZC0+bm9kZXNbdHJlbGxpc19ub2RlICsgcV0uc2NvcmUgPD0gZXJyb3IpIHsKKyAgICAgICAgICAgIGVycm9yID0gdGQtPm5vZGVzW3RyZWxsaXNfbm9kZSArIHFdLnNjb3JlOworICAgICAgICAgICAgcHEgICAgPSB0cmVsbGlzX25vZGUgKyBxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBxOworfQorCitzdGF0aWMgaW50IGZpbmRfcXVhbnRfdGhyZWFkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgam9ibnIsIGludCB0aHJlYWRucikKK3sKKyAgICBQcm9yZXNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFByb3Jlc1RocmVhZERhdGEgKnRkID0gY3R4LT50ZGF0YSArIHRocmVhZG5yOworICAgIGludCBtYnNfcGVyX3NsaWNlID0gY3R4LT5tYnNfcGVyX3NsaWNlOworICAgIGludCB4LCB5ID0gam9ibnIsIG1iLCBxID0gMDsKKworICAgIGZvciAoeCA9IG1iID0gMDsgeCA8IGN0eC0+bWJfd2lkdGg7IHggKz0gbWJzX3Blcl9zbGljZSwgbWIrKykgeworICAgICAgICB3aGlsZSAoY3R4LT5tYl93aWR0aCAtIHggPCBtYnNfcGVyX3NsaWNlKQorICAgICAgICAgICAgbWJzX3Blcl9zbGljZSA+Pj0gMTsKKyAgICAgICAgcSA9IGZpbmRfc2xpY2VfcXVhbnQoYXZjdHgsIGF2Y3R4LT5jb2RlZF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1iICsgMSkgKiBUUkVMTElTX1dJRFRILCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYnNfcGVyX3NsaWNlLCB0ZCk7CisgICAgfQorCisgICAgZm9yICh4ID0gY3R4LT5zbGljZXNfd2lkdGggLSAxOyB4ID49IDA7IHgtLSkgeworICAgICAgICBjdHgtPnNsaWNlX3FbeCArIHkgKiBjdHgtPnNsaWNlc193aWR0aF0gPSB0ZC0+bm9kZXNbcV0ucXVhbnQ7CisgICAgICAgIHEgPSB0ZC0+bm9kZXNbcV0ucHJldl9ub2RlOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWMsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBQcm9yZXNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKm9yaWdfYnVmLCAqYnVmLCAqc2xpY2VfaGRyLCAqc2xpY2Vfc2l6ZXMsICp0bXA7CisgICAgdWludDhfdCAqcGljdHVyZV9zaXplX3BvczsKKyAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIGludCB4LCB5LCBpLCBtYiwgcSA9IDA7CisgICAgaW50IHNpemVzWzRdID0geyAwIH07CisgICAgaW50IHNsaWNlX2hkcl9zaXplID0gMiArIDIgKiAoY3R4LT5udW1fcGxhbmVzIC0gMSk7CisgICAgaW50IGZyYW1lX3NpemUsIHBpY3R1cmVfc2l6ZSwgc2xpY2Vfc2l6ZTsKKyAgICBpbnQgcGt0X3NpemUsIHJldDsKKyAgICBpbnQgbWF4X3NsaWNlX3NpemUgPSAoY3R4LT5mcmFtZV9zaXplX3VwcGVyX2JvdW5kIC0gMjAwKSAvIChjdHgtPnBpY3R1cmVzX3Blcl9mcmFtZSAqIGN0eC0+c2xpY2VzX3Blcl9waWN0dXJlICsgMSk7CisgICAgdWludDhfdCBmcmFtZV9mbGFnczsKKworICAgICphdmN0eC0+Y29kZWRfZnJhbWUgICAgICAgICAgID0gKnBpYzsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKworICAgIHBrdF9zaXplID0gY3R4LT5mcmFtZV9zaXplX3VwcGVyX2JvdW5kOworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIHBrdF9zaXplICsgRkZfTUlOX0JVRkZFUl9TSVpFKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgb3JpZ19idWYgPSBwa3QtPmRhdGE7CisKKyAgICAvLyBmcmFtZSBhdG9tCisgICAgb3JpZ19idWYgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZSBzaXplCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMiAgKCZvcmlnX2J1ZiwgRlJBTUVfSUQpOyAvLyBmcmFtZSBjb250YWluZXIgSUQKKyAgICBidWYgPSBvcmlnX2J1ZjsKKworICAgIC8vIGZyYW1lIGhlYWRlcgorICAgIHRtcCA9IGJ1ZjsKKyAgICBidWYgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lIGhlYWRlciBzaXplIHdpbGwgYmUgc3RvcmVkIGhlcmUKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2ICAoJmJ1ZiwgMCk7ICAgICAgICAgICAgIC8vIHZlcnNpb24gMQorICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmYnVmLCBjdHgtPnZlbmRvciwgNCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNiAgKCZidWYsIGF2Y3R4LT53aWR0aCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNiAgKCZidWYsIGF2Y3R4LT5oZWlnaHQpOworCisgICAgZnJhbWVfZmxhZ3MgPSBjdHgtPmNocm9tYV9mYWN0b3IgPDwgNjsKKyAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVCkKKyAgICAgICAgZnJhbWVfZmxhZ3MgfD0gcGljLT50b3BfZmllbGRfZmlyc3QgPyAweDA0IDogMHgwODsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlICAoJmJ1ZiwgZnJhbWVfZmxhZ3MpOworCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSAgKCZidWYsIDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUgICgmYnVmLCBhdmN0eC0+Y29sb3JfcHJpbWFyaWVzKTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlICAoJmJ1ZiwgYXZjdHgtPmNvbG9yX3RyYyk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSAgKCZidWYsIGF2Y3R4LT5jb2xvcnNwYWNlKTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlICAoJmJ1ZiwgMHg0MCB8IChjdHgtPmFscGhhX2JpdHMgPj4gMykpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUgICgmYnVmLCAwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICBpZiAoY3R4LT5xdWFudF9zZWwgIT0gUVVBTlRfTUFUX0RFRkFVTFQpIHsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSAgKCZidWYsIDB4MDMpOyAgICAgIC8vIG1hdHJpeCBmbGFncyAtIGJvdGggbWF0cmljZXMgYXJlIHByZXNlbnQKKyAgICAgICAgLy8gbHVtYSBxdWFudGlzYXRpb24gbWF0cml4CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCBjdHgtPnF1YW50X21hdFtpXSk7CisgICAgICAgIC8vIGNocm9tYSBxdWFudGlzYXRpb24gbWF0cml4CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCBjdHgtPnF1YW50X21hdFtpXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSAgKCZidWYsIDB4MDApOyAgICAgIC8vIG1hdHJpeCBmbGFncyAtIGRlZmF1bHQgbWF0cmljZXMgYXJlIHVzZWQKKyAgICB9CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNiAgKCZ0bXAsIGJ1ZiAtIG9yaWdfYnVmKTsgLy8gd3JpdGUgYmFjayBmcmFtZSBoZWFkZXIgc2l6ZQorCisgICAgZm9yIChjdHgtPmN1cl9waWN0dXJlX2lkeCA9IDA7CisgICAgICAgICBjdHgtPmN1cl9waWN0dXJlX2lkeCA8IGN0eC0+cGljdHVyZXNfcGVyX2ZyYW1lOworICAgICAgICAgY3R4LT5jdXJfcGljdHVyZV9pZHgrKykgeworICAgICAgICAvLyBwaWN0dXJlIGhlYWRlcgorICAgICAgICBwaWN0dXJlX3NpemVfcG9zID0gYnVmICsgMTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSAgKCZidWYsIDB4NDApOyAgICAgICAgICAvLyBwaWN0dXJlIGhlYWRlciBzaXplIChpbiBiaXRzKQorICAgICAgICBidWYgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY3R1cmUgZGF0YSBzaXplIHdpbGwgYmUgc3RvcmVkIGhlcmUKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNiAgKCZidWYsIGN0eC0+c2xpY2VzX3Blcl9waWN0dXJlKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSAgKCZidWYsIGF2X2xvZzIoY3R4LT5tYnNfcGVyX3NsaWNlKSA8PCA0KTsgLy8gc2xpY2Ugd2lkdGggYW5kIGhlaWdodCBpbiBNQnMKKworICAgICAgICAvLyBzZWVrIHRhYmxlIC0gd2lsbCBiZSBmaWxsZWQgZHVyaW5nIHNsaWNlIGVuY29kaW5nCisgICAgICAgIHNsaWNlX3NpemVzID0gYnVmOworICAgICAgICBidWYgKz0gY3R4LT5zbGljZXNfcGVyX3BpY3R1cmUgKiAyOworCisgICAgICAgIC8vIHNsaWNlcworICAgICAgICBpZiAoIWN0eC0+Zm9yY2VfcXVhbnQpIHsKKyAgICAgICAgICAgIHJldCA9IGF2Y3R4LT5leGVjdXRlMihhdmN0eCwgZmluZF9xdWFudF90aHJlYWQsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5tYl9oZWlnaHQpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN0eC0+bWJfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGludCBtYnNfcGVyX3NsaWNlID0gY3R4LT5tYnNfcGVyX3NsaWNlOworICAgICAgICAgICAgZm9yICh4ID0gbWIgPSAwOyB4IDwgY3R4LT5tYl93aWR0aDsgeCArPSBtYnNfcGVyX3NsaWNlLCBtYisrKSB7CisgICAgICAgICAgICAgICAgcSA9IGN0eC0+Zm9yY2VfcXVhbnQgPyBjdHgtPmZvcmNlX3F1YW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdHgtPnNsaWNlX3FbbWIgKyB5ICogY3R4LT5zbGljZXNfd2lkdGhdOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGN0eC0+bWJfd2lkdGggLSB4IDwgbWJzX3Blcl9zbGljZSkKKyAgICAgICAgICAgICAgICAgICAgbWJzX3Blcl9zbGljZSA+Pj0gMTsKKworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1Ziwgc2xpY2VfaGRyX3NpemUgPDwgMyk7CisgICAgICAgICAgICAgICAgc2xpY2VfaGRyID0gYnVmOworICAgICAgICAgICAgICAgIGJ1ZiArPSBzbGljZV9oZHJfc2l6ZSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKHBrdF9zaXplIDw9IGJ1ZiAtIG9yaWdfYnVmICsgMiAqIG1heF9zbGljZV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnN0YXJ0ID0gcGt0LT5kYXRhOworICAgICAgICAgICAgICAgICAgICAvLyBSZWNvbXB1dGUgbmV3IHNpemUgYWNjb3JkaW5nIHRvIG1heF9zbGljZV9zaXplCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkZWR1Y2UgZGVsdGEKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gMjAwICsgKGN0eC0+cGljdHVyZXNfcGVyX2ZyYW1lICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5zbGljZXNfcGVyX3BpY3R1cmUgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zbGljZV9zaXplIC0gcGt0X3NpemU7CisKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBGRk1BWChkZWx0YSwgMiAqIG1heF9zbGljZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5mcmFtZV9zaXplX3VwcGVyX2JvdW5kICs9IGRlbHRhOworCisgICAgICAgICAgICAgICAgICAgIGlmICghY3R4LT53YXJuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhY2tldCB0b28gc21hbGw6IGlzICVpLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5lZWRzICVpIChzbGljZTogJWkpLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvcnJlY3QgYWxsb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0X3NpemUsIGRlbHRhLCBtYXhfc2xpY2Vfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPndhcm4gPSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZfZ3Jvd19wYWNrZXQocGt0LCBkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgICAgICBwa3Rfc2l6ZSArPSBkZWx0YTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBwb2ludGVycworICAgICAgICAgICAgICAgICAgICBvcmlnX2J1ZiAgICAgICAgID0gcGt0LT5kYXRhICsgKG9yaWdfYnVmICAgICAgICAgLSBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZiAgICAgICAgICAgICAgPSBwa3QtPmRhdGEgKyAoYnVmICAgICAgICAgICAgICAtIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgcGljdHVyZV9zaXplX3BvcyA9IHBrdC0+ZGF0YSArIChwaWN0dXJlX3NpemVfcG9zIC0gc3RhcnQpOworICAgICAgICAgICAgICAgICAgICBzbGljZV9zaXplcyAgICAgID0gcGt0LT5kYXRhICsgKHNsaWNlX3NpemVzICAgICAgLSBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIHNsaWNlX2hkciAgICAgICAgPSBwa3QtPmRhdGEgKyAoc2xpY2VfaGRyICAgICAgICAtIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wICAgICAgICAgICAgICA9IHBrdC0+ZGF0YSArICh0bXAgICAgICAgICAgICAgIC0gc3RhcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbml0X3B1dF9iaXRzKCZwYiwgYnVmLCAocGt0X3NpemUgLSAoYnVmIC0gb3JpZ19idWYpKSAqIDgpOworICAgICAgICAgICAgICAgIHJldCA9IGVuY29kZV9zbGljZShhdmN0eCwgcGljLCAmcGIsIHNpemVzLCB4LCB5LCBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYnNfcGVyX3NsaWNlKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnNsaWNlX2hkciwgcSk7CisgICAgICAgICAgICAgICAgc2xpY2Vfc2l6ZSA9IHNsaWNlX2hkcl9zaXplICsgc2l6ZXNbY3R4LT5udW1fcGxhbmVzIC0gMV07CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bnVtX3BsYW5lcyAtIDE7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZzbGljZV9oZHIsIHNpemVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2Vfc2l6ZSArPSBzaXplc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmc2xpY2Vfc2l6ZXMsIHNsaWNlX3NpemUpOworICAgICAgICAgICAgICAgIGJ1ZiArPSBzbGljZV9zaXplIC0gc2xpY2VfaGRyX3NpemU7CisgICAgICAgICAgICAgICAgaWYgKG1heF9zbGljZV9zaXplIDwgc2xpY2Vfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgbWF4X3NsaWNlX3NpemUgPSBzbGljZV9zaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGljdHVyZV9zaXplID0gYnVmIC0gKHBpY3R1cmVfc2l6ZV9wb3MgLSAxKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcGljdHVyZV9zaXplX3BvcywgcGljdHVyZV9zaXplKTsKKyAgICB9CisKKyAgICBvcmlnX2J1ZiAtPSA4OworICAgIGZyYW1lX3NpemUgPSBidWYgLSBvcmlnX2J1ZjsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZvcmlnX2J1ZiwgZnJhbWVfc2l6ZSk7CisKKyAgICBwa3QtPnNpemUgICA9IGZyYW1lX3NpemU7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFByb3Jlc0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKworICAgIGlmIChjdHgtPnRkYXRhKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+dGhyZWFkX2NvdW50OyBpKyspCisgICAgICAgICAgICBhdl9mcmVlcCgmY3R4LT50ZGF0YVtpXS5ub2Rlcyk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZjdHgtPnRkYXRhKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5zbGljZV9xKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9yZXNfZmRjdChGRENURFNQQ29udGV4dCAqZmRzcCwgY29uc3QgdWludDE2X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgaW50IHgsIHk7CisgICAgY29uc3QgdWludDE2X3QgKnRzcmMgPSBzcmM7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICBibG9ja1t5ICogOCArIHhdID0gdHNyY1t4XTsKKyAgICAgICAgdHNyYyArPSBsaW5lc2l6ZSA+PiAxOworICAgIH0KKyAgICBmZHNwLT5mZGN0KGJsb2NrKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGVuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBQcm9yZXNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBtcHM7CisgICAgaW50IGksIGo7CisgICAgaW50IG1pbl9xdWFudCwgbWF4X3F1YW50OworICAgIGludCBpbnRlcmxhY2VkID0gISEoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVCk7CisKKyAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDEwOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBjdHgtPmZkY3QgICAgICA9IHByb3Jlc19mZGN0OworICAgIGN0eC0+c2NhbnRhYmxlID0gaW50ZXJsYWNlZCA/IGZmX3Byb3Jlc19pbnRlcmxhY2VkX3NjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmZl9wcm9yZXNfcHJvZ3Jlc3NpdmVfc2NhbjsKKyAgICBmZl9mZGN0ZHNwX2luaXQoJmN0eC0+ZmRzcCwgYXZjdHgpOworCisgICAgbXBzID0gY3R4LT5tYnNfcGVyX3NsaWNlOworICAgIGlmIChtcHMgJiAobXBzIC0gMSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAidGhlcmUgc2hvdWxkIGJlIGFuIGludGVnZXIgcG93ZXIgb2YgdHdvIE1CcyBwZXIgc2xpY2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoY3R4LT5wcm9maWxlID09IFBST1JFU19QUk9GSUxFX0FVVE8pIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCk7CisgICAgICAgIGN0eC0+cHJvZmlsZSA9IChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIShkZXNjLT5sb2cyX2Nocm9tYV93ICsgZGVzYy0+bG9nMl9jaHJvbWFfaCkpCisgICAgICAgICAgICAgICAgICAgICA/IFBST1JFU19QUk9GSUxFXzQ0NDQgOiBQUk9SRVNfUFJPRklMRV9IUTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIkF1dG9zZWxlY3RlZCAlcy4gSXQgY2FuIGJlIG92ZXJyaWRkZW4gIgorICAgICAgICAgICAgICAgInRocm91Z2ggLXByb2ZpbGUgb3B0aW9uLlxuIiwgY3R4LT5wcm9maWxlID09IFBST1JFU19QUk9GSUxFXzQ0NDQKKyAgICAgICAgICAgICAgID8gIjQ6NDo0OjQgcHJvZmlsZSBiZWNhdXNlIG9mIHRoZSB1c2VkIGlucHV0IGNvbG9yc3BhY2UiCisgICAgICAgICAgICAgICA6ICJIUSBwcm9maWxlIHRvIGtlZXAgYmVzdCBxdWFsaXR5Iik7CisgICAgfQorICAgIGlmIChhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KS0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEpIHsKKyAgICAgICAgaWYgKGN0eC0+cHJvZmlsZSAhPSBQUk9SRVNfUFJPRklMRV80NDQ0KSB7CisgICAgICAgICAgICAvLyBmb3JjZSBhbHBoYSBhbmQgd2FybgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlByb2ZpbGUgc2VsZWN0ZWQgd2lsbCBub3QgIgorICAgICAgICAgICAgICAgICAgICJlbmNvZGUgYWxwaGEuIE92ZXJyaWRlIHdpdGggLXByb2ZpbGUgaWYgbmVlZGVkLlxuIik7CisgICAgICAgICAgICBjdHgtPmFscGhhX2JpdHMgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChjdHgtPmFscGhhX2JpdHMgJiA3KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImFscGhhIGJpdHMgc2hvdWxkIGJlIDAsIDggb3IgMTZcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+YWxwaGFfYml0cyA9IDA7CisgICAgfQorCisgICAgY3R4LT5jaHJvbWFfZmFjdG9yID0gYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IENGQUNUT1JfWTQyMgorICAgICAgICAgICAgICAgICAgICAgICAgIDogQ0ZBQ1RPUl9ZNDQ0OworICAgIGN0eC0+cHJvZmlsZV9pbmZvICA9IHByb3Jlc19wcm9maWxlX2luZm8gKyBjdHgtPnByb2ZpbGU7CisgICAgY3R4LT5udW1fcGxhbmVzICAgID0gMyArICEhY3R4LT5hbHBoYV9iaXRzOworCisgICAgY3R4LT5tYl93aWR0aCAgICAgID0gRkZBTElHTihhdmN0eC0+d2lkdGgsICAxNikgPj4gNDsKKworICAgIGlmIChpbnRlcmxhY2VkKQorICAgICAgICBjdHgtPm1iX2hlaWdodCA9IEZGQUxJR04oYXZjdHgtPmhlaWdodCwgMzIpID4+IDU7CisgICAgZWxzZQorICAgICAgICBjdHgtPm1iX2hlaWdodCA9IEZGQUxJR04oYXZjdHgtPmhlaWdodCwgMTYpID4+IDQ7CisKKyAgICBjdHgtPnNsaWNlc193aWR0aCAgPSBjdHgtPm1iX3dpZHRoIC8gbXBzOworICAgIGN0eC0+c2xpY2VzX3dpZHRoICs9IGF2X3BvcGNvdW50KGN0eC0+bWJfd2lkdGggLSBjdHgtPnNsaWNlc193aWR0aCAqIG1wcyk7CisgICAgY3R4LT5zbGljZXNfcGVyX3BpY3R1cmUgPSBjdHgtPm1iX2hlaWdodCAqIGN0eC0+c2xpY2VzX3dpZHRoOworICAgIGN0eC0+cGljdHVyZXNfcGVyX2ZyYW1lID0gMSArIGludGVybGFjZWQ7CisKKyAgICBpZiAoY3R4LT5xdWFudF9zZWwgPT0gLTEpCisgICAgICAgIGN0eC0+cXVhbnRfbWF0ID0gcHJvcmVzX3F1YW50X21hdHJpY2VzW2N0eC0+cHJvZmlsZV9pbmZvLT5xdWFudF07CisgICAgZWxzZQorICAgICAgICBjdHgtPnF1YW50X21hdCA9IHByb3Jlc19xdWFudF9tYXRyaWNlc1tjdHgtPnF1YW50X3NlbF07CisKKyAgICBpZiAoc3RybGVuKGN0eC0+dmVuZG9yKSAhPSA0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidmVuZG9yIElEIHNob3VsZCBiZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3R4LT5mb3JjZV9xdWFudCA9IGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSAvIEZGX1FQMkxBTUJEQTsKKyAgICBpZiAoIWN0eC0+Zm9yY2VfcXVhbnQpIHsKKyAgICAgICAgaWYgKCFjdHgtPmJpdHNfcGVyX21iKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX01CX0xJTUlUUyAtIDE7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAocHJvcmVzX21iX2xpbWl0c1tpXSA+PSBjdHgtPm1iX3dpZHRoICogY3R4LT5tYl9oZWlnaHQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cGljdHVyZXNfcGVyX2ZyYW1lKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGN0eC0+Yml0c19wZXJfbWIgICA9IGN0eC0+cHJvZmlsZV9pbmZvLT5icl90YWJbaV07CisgICAgICAgIH0gZWxzZSBpZiAoY3R4LT5iaXRzX3Blcl9tYiA8IDEyOCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ0b28gZmV3IGJpdHMgcGVyIE1CLCBwbGVhc2Ugc2V0IGF0IGxlYXN0IDEyOFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIG1pbl9xdWFudCA9IGN0eC0+cHJvZmlsZV9pbmZvLT5taW5fcXVhbnQ7CisgICAgICAgIG1heF9xdWFudCA9IGN0eC0+cHJvZmlsZV9pbmZvLT5tYXhfcXVhbnQ7CisgICAgICAgIGZvciAoaSA9IG1pbl9xdWFudDsgaSA8IE1BWF9TVE9SRURfUTsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykKKyAgICAgICAgICAgICAgICBjdHgtPnF1YW50c1tpXVtqXSA9IGN0eC0+cXVhbnRfbWF0W2pdICogaTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+c2xpY2VfcSA9IGF2X21hbGxvYyhjdHgtPnNsaWNlc19wZXJfcGljdHVyZSAqIHNpemVvZigqY3R4LT5zbGljZV9xKSk7CisgICAgICAgIGlmICghY3R4LT5zbGljZV9xKSB7CisgICAgICAgICAgICBlbmNvZGVfY2xvc2UoYXZjdHgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+dGRhdGEgPSBhdl9tYWxsb2N6KGF2Y3R4LT50aHJlYWRfY291bnQgKiBzaXplb2YoKmN0eC0+dGRhdGEpKTsKKyAgICAgICAgaWYgKCFjdHgtPnRkYXRhKSB7CisgICAgICAgICAgICBlbmNvZGVfY2xvc2UoYXZjdHgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBhdmN0eC0+dGhyZWFkX2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgIGN0eC0+dGRhdGFbal0ubm9kZXMgPSBhdl9tYWxsb2MoKGN0eC0+c2xpY2VzX3dpZHRoICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUUkVMTElTX1dJRFRICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKCpjdHgtPnRkYXRhLT5ub2RlcykpOworICAgICAgICAgICAgaWYgKCFjdHgtPnRkYXRhW2pdLm5vZGVzKSB7CisgICAgICAgICAgICAgICAgZW5jb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gbWluX3F1YW50OyBpIDwgbWF4X3F1YW50ICsgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgY3R4LT50ZGF0YVtqXS5ub2Rlc1tpXS5wcmV2X25vZGUgPSAtMTsKKyAgICAgICAgICAgICAgICBjdHgtPnRkYXRhW2pdLm5vZGVzW2ldLmJpdHMgICAgICA9IDA7CisgICAgICAgICAgICAgICAgY3R4LT50ZGF0YVtqXS5ub2Rlc1tpXS5zY29yZSAgICAgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGxzID0gMDsKKworICAgICAgICBpZiAoY3R4LT5mb3JjZV9xdWFudCA+IDY0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInRvbyBsYXJnZSBxdWFudGlzZXIsIG1heGltdW0gaXMgNjRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgeworICAgICAgICAgICAgY3R4LT5xdWFudHNbMF1bal0gPSBjdHgtPnF1YW50X21hdFtqXSAqIGN0eC0+Zm9yY2VfcXVhbnQ7CisgICAgICAgICAgICBscyArPSBhdl9sb2cyKCgxIDw8IDExKSAgLyBjdHgtPnF1YW50c1swXVtqXSkgKiAyICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+Yml0c19wZXJfbWIgPSBscyAqIDg7CisgICAgICAgIGlmIChjdHgtPmNocm9tYV9mYWN0b3IgPT0gQ0ZBQ1RPUl9ZNDQ0KQorICAgICAgICAgICAgY3R4LT5iaXRzX3Blcl9tYiArPSBscyAqIDQ7CisgICAgfQorCisgICAgY3R4LT5mcmFtZV9zaXplX3VwcGVyX2JvdW5kID0gKGN0eC0+cGljdHVyZXNfcGVyX2ZyYW1lICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5zbGljZXNfcGVyX3BpY3R1cmUgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgKyAyICogY3R4LT5udW1fcGxhbmVzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1wcyAqIGN0eC0+Yml0c19wZXJfbWIpIC8gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDIwMDsKKworICAgIGlmIChjdHgtPmFscGhhX2JpdHMpIHsKKyAgICAgICAgIC8vIFRoZSBhbHBoYSBwbGFuZSBpcyBydW4tY29kZWQgYW5kIG1pZ2h0IGV4Y2VlZCB0aGUgYml0IGJ1ZGdldC4KKyAgICAgICAgIGN0eC0+ZnJhbWVfc2l6ZV91cHBlcl9ib3VuZCArPSAoY3R4LT5waWN0dXJlc19wZXJfZnJhbWUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnNsaWNlc19wZXJfcGljdHVyZSArIDEpICoKKyAgICAgICAgIC8qIG51bSBwaXhlbHMgcGVyIHNsaWNlICovICAgICAoY3R4LT5tYnNfcGVyX3NsaWNlICogMjU2ICoKKyAgICAgICAgIC8qIGJpdHMgcGVyIHBpeGVsICovICAgICAgICAgICAgKDEgKyBjdHgtPmFscGhhX2JpdHMgKyAxKSArIDcgPj4gMyk7CisgICAgfQorCisgICAgYXZjdHgtPmNvZGVjX3RhZyAgID0gY3R4LT5wcm9maWxlX2luZm8tPnRhZzsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAicHJvZmlsZSAlZCwgJWQgc2xpY2VzLCBpbnRlcmxhY2luZzogJXMsICVkIGJpdHMgcGVyIE1CXG4iLAorICAgICAgICAgICBjdHgtPnByb2ZpbGUsIGN0eC0+c2xpY2VzX3Blcl9waWN0dXJlICogY3R4LT5waWN0dXJlc19wZXJfZnJhbWUsCisgICAgICAgICAgIGludGVybGFjZWQgPyAieWVzIiA6ICJubyIsIGN0eC0+Yml0c19wZXJfbWIpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZnJhbWUgc2l6ZSB1cHBlciBib3VuZDogJWRcbiIsCisgICAgICAgICAgIGN0eC0+ZnJhbWVfc2l6ZV91cHBlcl9ib3VuZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUHJvcmVzQ29udGV4dCwgeCkKKyNkZWZpbmUgVkUgICAgIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJtYnNfcGVyX3NsaWNlIiwgIm1hY3JvYmxvY2tzIHBlciBzbGljZSIsIE9GRlNFVChtYnNfcGVyX3NsaWNlKSwKKyAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSA4IH0sIDEsIE1BWF9NQlNfUEVSX1NMSUNFLCBWRSB9LAorICAgIHsgInByb2ZpbGUiLCAgICAgICBOVUxMLCBPRkZTRVQocHJvZmlsZSksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gUFJPUkVTX1BST0ZJTEVfQVVUTyB9LAorICAgICAgICBQUk9SRVNfUFJPRklMRV9BVVRPLCBQUk9SRVNfUFJPRklMRV80NDQ0LCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAiYXV0byIsICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBST1JFU19QUk9GSUxFX0FVVE8gfSwKKyAgICAgICAgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgInByb3h5IiwgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJPUkVTX1BST0ZJTEVfUFJPWFkgfSwKKyAgICAgICAgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgImx0IiwgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJPUkVTX1BST0ZJTEVfTFQgfSwKKyAgICAgICAgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgInN0YW5kYXJkIiwgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJPUkVTX1BST0ZJTEVfU1RBTkRBUkQgfSwKKyAgICAgICAgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgImhxIiwgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJPUkVTX1BST0ZJTEVfSFEgfSwKKyAgICAgICAgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgIjQ0NDQiLCAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJPUkVTX1BST0ZJTEVfNDQ0NCB9LAorICAgICAgICAwLCAwLCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAidmVuZG9yIiwgInZlbmRvciBJRCIsIE9GRlNFVCh2ZW5kb3IpLAorICAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJMYXZjIiB9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIFZFIH0sCisgICAgeyAiYml0c19wZXJfbWIiLCAiZGVzaXJlZCBiaXRzIHBlciBtYWNyb2Jsb2NrIiwgT0ZGU0VUKGJpdHNfcGVyX21iKSwKKyAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDgxOTIsIFZFIH0sCisgICAgeyAicXVhbnRfbWF0IiwgInF1YW50aXNlciBtYXRyaXgiLCBPRkZTRVQocXVhbnRfc2VsKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgUVVBTlRfTUFUX0RFRkFVTFQsIFZFLCAicXVhbnRfbWF0IiB9LAorICAgIHsgImF1dG8iLCAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gLTEgfSwKKyAgICAgICAgMCwgMCwgVkUsICJxdWFudF9tYXQiIH0sCisgICAgeyAicHJveHkiLCAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBRVUFOVF9NQVRfUFJPWFkgfSwKKyAgICAgICAgMCwgMCwgVkUsICJxdWFudF9tYXQiIH0sCisgICAgeyAibHQiLCAgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBRVUFOVF9NQVRfTFQgfSwKKyAgICAgICAgMCwgMCwgVkUsICJxdWFudF9tYXQiIH0sCisgICAgeyAic3RhbmRhcmQiLCAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBRVUFOVF9NQVRfU1RBTkRBUkQgfSwKKyAgICAgICAgMCwgMCwgVkUsICJxdWFudF9tYXQiIH0sCisgICAgeyAiaHEiLCAgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBRVUFOVF9NQVRfSFEgfSwKKyAgICAgICAgMCwgMCwgVkUsICJxdWFudF9tYXQiIH0sCisgICAgeyAiZGVmYXVsdCIsICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBRVUFOVF9NQVRfREVGQVVMVCB9LAorICAgICAgICAwLCAwLCBWRSwgInF1YW50X21hdCIgfSwKKyAgICB7ICJhbHBoYV9iaXRzIiwgImJpdHMgZm9yIGFscGhhIHBsYW5lIiwgT0ZGU0VUKGFscGhhX2JpdHMpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IDE2IH0sIDAsIDE2LCBWRSB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBwcm9yZXNlbmNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiUHJvUmVzIGVuY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9wcm9yZXNfa3NfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicHJvcmVzX2tzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbGUgUHJvUmVzIChpQ29kZWMgUHJvKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QUk9SRVMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFByb3Jlc0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGVuY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGVuY29kZV9jbG9zZSwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBlbmNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwLCBBVl9QSVhfRk1UX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZwcm9yZXNlbmNfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHN5bW9kZWwuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BzeW1vZGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5Y2JlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3BzeW1vZGVsLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBhdWRpbyBlbmNvZGVyIHBzeWNob2Fjb3VzdGljIG1vZGVsCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAicHN5bW9kZWwuaCIKKyNpbmNsdWRlICJpaXJmaWx0ZXIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKK2V4dGVybiBjb25zdCBGRlBzeU1vZGVsIGZmX2FhY19wc3lfbW9kZWw7CisKK2F2X2NvbGQgaW50IGZmX3BzeV9pbml0KEZGUHN5Q29udGV4dCAqY3R4LCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBudW1fbGVucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipiYW5kcywgY29uc3QgaW50KiBudW1fYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2dyb3VwcywgY29uc3QgdWludDhfdCAqZ3JvdXBfbWFwKQoreworICAgIGludCBpLCBqLCBrID0gMDsKKworICAgIGN0eC0+YXZjdHggPSBhdmN0eDsKKyAgICBjdHgtPmNoICAgICAgICA9IGF2X21hbGxvY3pfYXJyYXkoc2l6ZW9mKGN0eC0+Y2hbMF0pLCBhdmN0eC0+Y2hhbm5lbHMgKiAyKTsKKyAgICBjdHgtPmdyb3VwICAgICA9IGF2X21hbGxvY3pfYXJyYXkoc2l6ZW9mKGN0eC0+Z3JvdXBbMF0pLCBudW1fZ3JvdXBzKTsKKyAgICBjdHgtPmJhbmRzICAgICA9IGF2X21hbGxvY19hcnJheSAoc2l6ZW9mKGN0eC0+YmFuZHNbMF0pLCAgICAgIG51bV9sZW5zKTsKKyAgICBjdHgtPm51bV9iYW5kcyA9IGF2X21hbGxvY19hcnJheSAoc2l6ZW9mKGN0eC0+bnVtX2JhbmRzWzBdKSwgIG51bV9sZW5zKTsKKyAgICBtZW1jcHkoY3R4LT5iYW5kcywgICAgIGJhbmRzLCAgICAgc2l6ZW9mKGN0eC0+YmFuZHNbMF0pICAgICAqICBudW1fbGVucyk7CisgICAgbWVtY3B5KGN0eC0+bnVtX2JhbmRzLCBudW1fYmFuZHMsIHNpemVvZihjdHgtPm51bV9iYW5kc1swXSkgKiAgbnVtX2xlbnMpOworCisgICAgLyogYXNzaWduIGNoYW5uZWxzIHRvIGdyb3VwcyAod2l0aCB2aXJ0dWFsIGNoYW5uZWxzIGZvciBjb3VwbGluZykgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2dyb3VwczsgaSsrKSB7CisgICAgICAgIC8qIE5PVEU6IEFkZCAxIHRvIGhhbmRsZSB0aGUgQUFDIGNoYW5fY29uZmlnIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICAgICAgICAgKiAgICAgICBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgYWxsb3dpbmcgYW4gYXJyYXkgb2YgMHMgdG8gbWFwCisgICAgICAgICAqICAgICAgIHRvIG9uZSBjaGFubmVsIHBlciBncm91cC4KKyAgICAgICAgICovCisgICAgICAgIGN0eC0+Z3JvdXBbaV0ubnVtX2NoID0gZ3JvdXBfbWFwW2ldICsgMTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGN0eC0+Z3JvdXBbaV0ubnVtX2NoICogMjsgaisrKQorICAgICAgICAgICAgY3R4LT5ncm91cFtpXS5jaFtqXSAgPSAmY3R4LT5jaFtrKytdOworICAgIH0KKworICAgIHN3aXRjaCAoY3R4LT5hdmN0eC0+Y29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FBQzoKKyAgICAgICAgY3R4LT5tb2RlbCA9ICZmZl9hYWNfcHN5X21vZGVsOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGN0eC0+bW9kZWwtPmluaXQpCisgICAgICAgIHJldHVybiBjdHgtPm1vZGVsLT5pbml0KGN0eCk7CisgICAgcmV0dXJuIDA7Cit9CisKK0ZGUHN5Q2hhbm5lbEdyb3VwICpmZl9wc3lfZmluZF9ncm91cChGRlBzeUNvbnRleHQgKmN0eCwgaW50IGNoYW5uZWwpCit7CisgICAgaW50IGkgPSAwLCBjaCA9IDA7CisKKyAgICB3aGlsZSAoY2ggPD0gY2hhbm5lbCkKKyAgICAgICAgY2ggKz0gY3R4LT5ncm91cFtpKytdLm51bV9jaDsKKworICAgIHJldHVybiAmY3R4LT5ncm91cFtpLTFdOworfQorCithdl9jb2xkIHZvaWQgZmZfcHN5X2VuZChGRlBzeUNvbnRleHQgKmN0eCkKK3sKKyAgICBpZiAoY3R4LT5tb2RlbCAmJiBjdHgtPm1vZGVsLT5lbmQpCisgICAgICAgIGN0eC0+bW9kZWwtPmVuZChjdHgpOworICAgIGF2X2ZyZWVwKCZjdHgtPmJhbmRzKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5udW1fYmFuZHMpOworICAgIGF2X2ZyZWVwKCZjdHgtPmdyb3VwKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5jaCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IEZGUHN5UHJlcHJvY2Vzc0NvbnRleHR7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGZsb2F0IHN0ZXJlb19hdHQ7CisgICAgc3RydWN0IEZGSUlSRmlsdGVyQ29lZmZzICpmY29lZmZzOworICAgIHN0cnVjdCBGRklJUkZpbHRlclN0YXRlICoqZnN0YXRlOworICAgIHN0cnVjdCBGRklJUkZpbHRlckNvbnRleHQgZmlpcjsKK31GRlBzeVByZXByb2Nlc3NDb250ZXh0OworCisjZGVmaW5lIEZJTFRfT1JERVIgNAorCithdl9jb2xkIHN0cnVjdCBGRlBzeVByZXByb2Nlc3NDb250ZXh0KiBmZl9wc3lfcHJlcHJvY2Vzc19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGRlBzeVByZXByb2Nlc3NDb250ZXh0ICpjdHg7CisgICAgaW50IGk7CisgICAgZmxvYXQgY3V0b2ZmX2NvZWZmID0gMDsKKyAgICBjdHggICAgICAgID0gYXZfbWFsbG9jeihzaXplb2YoRkZQc3lQcmVwcm9jZXNzQ29udGV4dCkpOworICAgIGN0eC0+YXZjdHggPSBhdmN0eDsKKworICAgIGlmIChhdmN0eC0+Y3V0b2ZmID4gMCkKKyAgICAgICAgY3V0b2ZmX2NvZWZmID0gMi4wICogYXZjdHgtPmN1dG9mZiAvIGF2Y3R4LT5zYW1wbGVfcmF0ZTsKKworICAgIGlmICghY3V0b2ZmX2NvZWZmICYmIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpCisgICAgICAgIGN1dG9mZl9jb2VmZiA9IDIuMCAqIEFBQ19DVVRPRkYoYXZjdHgpIC8gYXZjdHgtPnNhbXBsZV9yYXRlOworCisgICAgaWYgKGN1dG9mZl9jb2VmZiAmJiBjdXRvZmZfY29lZmYgPCAwLjk4KQorICAgIGN0eC0+ZmNvZWZmcyA9IGZmX2lpcl9maWx0ZXJfaW5pdF9jb2VmZnMoYXZjdHgsIEZGX0ZJTFRFUl9UWVBFX0JVVFRFUldPUlRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfRklMVEVSX01PREVfTE9XUEFTUywgRklMVF9PUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZl9jb2VmZiwgMC4wLCAwLjApOworICAgIGlmIChjdHgtPmZjb2VmZnMpIHsKKyAgICAgICAgY3R4LT5mc3RhdGUgPSBhdl9tYWxsb2N6X2FycmF5KHNpemVvZihjdHgtPmZzdGF0ZVswXSksIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIGN0eC0+ZnN0YXRlW2ldID0gZmZfaWlyX2ZpbHRlcl9pbml0X3N0YXRlKEZJTFRfT1JERVIpOworICAgIH0KKworICAgIGZmX2lpcl9maWx0ZXJfaW5pdCgmY3R4LT5maWlyKTsKKworICAgIHJldHVybiBjdHg7Cit9CisKK3ZvaWQgZmZfcHN5X3ByZXByb2Nlc3Moc3RydWN0IEZGUHN5UHJlcHJvY2Vzc0NvbnRleHQgKmN0eCwgZmxvYXQgKiphdWRpbywgaW50IGNoYW5uZWxzKQoreworICAgIGludCBjaDsKKyAgICBpbnQgZnJhbWVfc2l6ZSA9IGN0eC0+YXZjdHgtPmZyYW1lX3NpemU7CisgICAgRkZJSVJGaWx0ZXJDb250ZXh0ICppaXIgPSAmY3R4LT5maWlyOworCisgICAgaWYgKGN0eC0+ZnN0YXRlKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgaWlyLT5maWx0ZXJfZmx0KGN0eC0+ZmNvZWZmcywgY3R4LT5mc3RhdGVbY2hdLCBmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdWRpb1tjaF1bZnJhbWVfc2l6ZV0sIDEsICZhdWRpb1tjaF1bZnJhbWVfc2l6ZV0sIDEpOworICAgIH0KK30KKworYXZfY29sZCB2b2lkIGZmX3BzeV9wcmVwcm9jZXNzX2VuZChzdHJ1Y3QgRkZQc3lQcmVwcm9jZXNzQ29udGV4dCAqY3R4KQoreworICAgIGludCBpOworICAgIGZmX2lpcl9maWx0ZXJfZnJlZV9jb2VmZnNwKCZjdHgtPmZjb2VmZnMpOworICAgIGlmIChjdHgtPmZzdGF0ZSkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+YXZjdHgtPmNoYW5uZWxzOyBpKyspCisgICAgICAgICAgICBmZl9paXJfZmlsdGVyX2ZyZWVfc3RhdGVwKCZjdHgtPmZzdGF0ZVtpXSk7CisgICAgYXZfZnJlZXAoJmN0eC0+ZnN0YXRlKTsKKyAgICBhdl9mcmVlKGN0eCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wc3ltb2RlbC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHN5bW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTI2MWJhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHN5bW9kZWwuaApAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIGF1ZGlvIGVuY29kZXIgcHN5Y2hvYWNvdXN0aWMgbW9kZWwKKyAqIENvcHlyaWdodCAoQykgMjAwOCBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19QU1lNT0RFTF9ICisjZGVmaW5lIEFWQ09ERUNfUFNZTU9ERUxfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCisvKiogbWF4aW11bSBwb3NzaWJsZSBudW1iZXIgb2YgYmFuZHMgKi8KKyNkZWZpbmUgUFNZX01BWF9CQU5EUyAxMjgKKy8qKiBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyAqLworI2RlZmluZSBQU1lfTUFYX0NIQU5TIDIwCisKKyNkZWZpbmUgQUFDX0NVVE9GRihzKSAoKHMpLT5iaXRfcmF0ZSA/IEZGTUlOMyg0MDAwICsgKHMpLT5iaXRfcmF0ZS84LCAxMjAwMCArIChzKS0+Yml0X3JhdGUvMzIsIChzKS0+c2FtcGxlX3JhdGUgLyAyKSA6ICgocyktPnNhbXBsZV9yYXRlIC8gMikpCisKKy8qKgorICogc2luZ2xlIGJhbmQgcHN5Y2hvYWNvdXN0aWMgaW5mb3JtYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRkZQc3lCYW5kIHsKKyAgICBpbnQgICBiaXRzOworICAgIGZsb2F0IGVuZXJneTsKKyAgICBmbG9hdCB0aHJlc2hvbGQ7CisgICAgZmxvYXQgZGlzdG9ydGlvbjsKKyAgICBmbG9hdCBwZXJjZXB0dWFsX3dlaWdodDsKK30gRkZQc3lCYW5kOworCisvKioKKyAqIHNpbmdsZSBjaGFubmVsIHBzeWNob2Fjb3VzdGljIGluZm9ybWF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IEZGUHN5Q2hhbm5lbCB7CisgICAgRkZQc3lCYW5kIHBzeV9iYW5kc1tQU1lfTUFYX0JBTkRTXTsgLy8vPCBjaGFubmVsIGJhbmRzIGluZm9ybWF0aW9uCisgICAgZmxvYXQgICAgIGVudHJvcHk7ICAgICAgICAgICAgICAgICAgLy8vPCB0b3RhbCBQRSBmb3IgdGhpcyBjaGFubmVsCit9IEZGUHN5Q2hhbm5lbDsKKworLyoqCisgKiBwc3ljaG9hY291c3RpYyBpbmZvcm1hdGlvbiBmb3IgYW4gYXJiaXRyYXJ5IGdyb3VwIG9mIGNoYW5uZWxzCisgKi8KK3R5cGVkZWYgc3RydWN0IEZGUHN5Q2hhbm5lbEdyb3VwIHsKKyAgICBGRlBzeUNoYW5uZWwgKmNoW1BTWV9NQVhfQ0hBTlNdOyAgLy8vPCBwb2ludGVycyB0byB0aGUgaW5kaXZpZHVhbCBjaGFubmVscyBpbiB0aGUgZ3JvdXAKKyAgICB1aW50OF90IG51bV9jaDsgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhpcyBncm91cAorICAgIHVpbnQ4X3QgY291cGxpbmdbUFNZX01BWF9CQU5EU107ICAvLy88IGFsbG93IGNvdXBsaW5nIGZvciB0aGlzIGJhbmQgaW4gdGhlIGdyb3VwCit9IEZGUHN5Q2hhbm5lbEdyb3VwOworCisvKioKKyAqIHdpbmRvd2luZyByZWxhdGVkIGluZm9ybWF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IEZGUHN5V2luZG93SW5mbyB7CisgICAgaW50IHdpbmRvd190eXBlWzNdOyAgICAgICAgICAgICAgIC8vLzwgd2luZG93IHR5cGUgKHNob3J0L2xvbmcvdHJhbnNpdGlvbmFsLCBldGMuKSAtIGN1cnJlbnQsIHByZXZpb3VzIGFuZCBuZXh0CisgICAgaW50IHdpbmRvd19zaGFwZTsgICAgICAgICAgICAgICAgIC8vLzwgd2luZG93IHNoYXBlIChzaW5lL0tCRC93aGF0ZXZlcikKKyAgICBpbnQgbnVtX3dpbmRvd3M7ICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2Ygd2luZG93cyBpbiBhIGZyYW1lCisgICAgaW50IGdyb3VwaW5nWzhdOyAgICAgICAgICAgICAgICAgIC8vLzwgd2luZG93IGdyb3VwaW5nIChmb3IgZS5nLiBBQUMpCisgICAgaW50ICp3aW5kb3dfc2l6ZXM7ICAgICAgICAgICAgICAgIC8vLzwgc2VxdWVuY2Ugb2Ygd2luZG93IHNpemVzIGluc2lkZSBvbmUgZnJhbWUgKGZvciBlZy4gV01BKQorfSBGRlBzeVdpbmRvd0luZm87CisKKy8qKgorICogY29udGV4dCB1c2VkIGJ5IHBzeWNob2Fjb3VzdGljIG1vZGVsCisgKi8KK3R5cGVkZWYgc3RydWN0IEZGUHN5Q29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OyAgICAgICAgICAgIC8vLzwgZW5jb2RlciBjb250ZXh0CisgICAgY29uc3Qgc3RydWN0IEZGUHN5TW9kZWwgKm1vZGVsOyAgIC8vLzwgZW5jb2Rlci1zcGVjaWZpYyBtb2RlbCBmdW5jdGlvbnMKKworICAgIEZGUHN5Q2hhbm5lbCAgICAgICpjaDsgICAgICAgICAgICAvLy88IHNpbmdsZSBjaGFubmVsIGluZm9ybWF0aW9uCisgICAgRkZQc3lDaGFubmVsR3JvdXAgKmdyb3VwOyAgICAgICAgIC8vLzwgY2hhbm5lbCBncm91cCBpbmZvcm1hdGlvbgorICAgIGludCBudW1fZ3JvdXBzOyAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBjaGFubmVsIGdyb3VwcworCisgICAgdWludDhfdCAqKmJhbmRzOyAgICAgICAgICAgICAgICAgIC8vLzwgc2NhbGVmYWN0b3IgYmFuZCBzaXplcyBmb3IgcG9zc2libGUgZnJhbWUgc2l6ZXMKKyAgICBpbnQgICAgICpudW1fYmFuZHM7ICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIHBvc3NpYmxlIGZyYW1lIHNpemVzCisgICAgaW50IG51bV9sZW5zOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmQgc2V0cworCisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IHNpemU7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBzaXplIG9mIHRoZSBiaXRyZXNldm9pciBpbiBiaXRzCisgICAgICAgIGludCBiaXRzOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgYml0cmVzZXZvaXIKKyAgICB9IGJpdHJlczsKKworICAgIHZvaWQqIG1vZGVsX3ByaXZfZGF0YTsgICAgICAgICAgICAvLy88IHBzeWNob2Fjb3VzdGljIG1vZGVsIGltcGxlbWVudGF0aW9uIHByaXZhdGUgZGF0YQorfSBGRlBzeUNvbnRleHQ7CisKKy8qKgorICogY29kZWMtc3BlY2lmaWMgcHN5Y2hvYWNvdXN0aWMgbW9kZWwgaW1wbGVtZW50YXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRkZQc3lNb2RlbCB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBpbnQgICgqaW5pdCkgICAoRkZQc3lDb250ZXh0ICphcGMpOworCisgICAgLyoqCisgICAgICogU3VnZ2VzdCB3aW5kb3cgc2VxdWVuY2UgZm9yIGNoYW5uZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3R4ICAgICAgIG1vZGVsIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gYXVkaW8gICAgIHNhbXBsZXMgZm9yIHRoZSBjdXJyZW50IGZyYW1lCisgICAgICogQHBhcmFtIGxhICAgICAgICBsb29rYWhlYWQgc2FtcGxlcyAoTlVMTCB3aGVuIHVuYXZhaWxhYmxlKQorICAgICAqIEBwYXJhbSBjaGFubmVsICAgbnVtYmVyIG9mIGNoYW5uZWwgZWxlbWVudCB0byBhbmFseXplCisgICAgICogQHBhcmFtIHByZXZfdHlwZSBwcmV2aW91cyB3aW5kb3cgdHlwZQorICAgICAqCisgICAgICogQHJldHVybiBzdWdnZXN0ZWQgd2luZG93IGluZm9ybWF0aW9uIGluIGEgc3RydWN0dXJlCisgICAgICovCisgICAgRkZQc3lXaW5kb3dJbmZvICgqd2luZG93KShGRlBzeUNvbnRleHQgKmN0eCwgY29uc3QgZmxvYXQgKmF1ZGlvLCBjb25zdCBmbG9hdCAqbGEsIGludCBjaGFubmVsLCBpbnQgcHJldl90eXBlKTsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gcHN5Y2hvYWNvdXN0aWMgYW5hbHlzaXMgYW5kIHNldCBiYW5kIGluZm8gKHRocmVzaG9sZCwgZW5lcmd5KSBmb3IgYSBncm91cCBvZiBjaGFubmVscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdHggICAgICBtb2RlbCBjb250ZXh0CisgICAgICogQHBhcmFtIGNoYW5uZWwgIGNoYW5uZWwgbnVtYmVyIG9mIHRoZSBmaXJzdCBjaGFubmVsIGluIHRoZSBncm91cCB0byBwZXJmb3JtIGFuYWx5c2lzIG9uCisgICAgICogQHBhcmFtIGNvZWZmcyAgIGFycmF5IG9mIHBvaW50ZXJzIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMKKyAgICAgKiBAcGFyYW0gd2kgICAgICAgd2luZG93IGluZm9ybWF0aW9uIGZvciB0aGUgY2hhbm5lbHMgaW4gdGhlIGdyb3VwCisgICAgICovCisgICAgdm9pZCAoKmFuYWx5emUpKEZGUHN5Q29udGV4dCAqY3R4LCBpbnQgY2hhbm5lbCwgY29uc3QgZmxvYXQgKipjb2VmZnMsIGNvbnN0IEZGUHN5V2luZG93SW5mbyAqd2kpOworCisgICAgdm9pZCAoKmVuZCkgICAgKEZGUHN5Q29udGV4dCAqYXBjKTsKK30gRkZQc3lNb2RlbDsKKworLyoqCisgKiBJbml0aWFsaXplIHBzeWNob2Fjb3VzdGljIG1vZGVsLgorICoKKyAqIEBwYXJhbSBjdHggICAgICAgIG1vZGVsIGNvbnRleHQKKyAqIEBwYXJhbSBhdmN0eCAgICAgIGNvZGVjIGNvbnRleHQKKyAqIEBwYXJhbSBudW1fbGVucyAgIG51bWJlciBvZiBwb3NzaWJsZSBmcmFtZSBsZW5ndGhzCisgKiBAcGFyYW0gYmFuZHMgICAgICBzY2FsZWZhY3RvciBiYW5kIGxlbmd0aHMgZm9yIGFsbCBmcmFtZSBsZW5ndGhzCisgKiBAcGFyYW0gbnVtX2JhbmRzICBudW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIGFsbCBmcmFtZSBsZW5ndGhzCisgKiBAcGFyYW0gbnVtX2dyb3VwcyBudW1iZXIgb2YgY2hhbm5lbCBncm91cHMKKyAqIEBwYXJhbSBncm91cF9tYXAgIGFycmF5IHdpdGggIyBvZiBjaGFubmVscyBpbiBncm91cCAtIDEsIGZvciBlYWNoIGdyb3VwCisgKgorICogQHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgdmFsdWUgaWYgbm90CisgKi8KK2ludCBmZl9wc3lfaW5pdChGRlBzeUNvbnRleHQgKmN0eCwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgbnVtX2xlbnMsCisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKmJhbmRzLCBjb25zdCBpbnQgKm51bV9iYW5kcywKKyAgICAgICAgICAgICAgICBpbnQgbnVtX2dyb3VwcywgY29uc3QgdWludDhfdCAqZ3JvdXBfbWFwKTsKKworLyoqCisgKiBEZXRlcm1pbmUgd2hhdCBncm91cCBhIGNoYW5uZWwgYmVsb25ncyB0by4KKyAqCisgKiBAcGFyYW0gY3R4ICAgICBwc3ltb2RlbCBjb250ZXh0CisgKiBAcGFyYW0gY2hhbm5lbCBjaGFubmVsIHRvIGxvY2F0ZSB0aGUgZ3JvdXAgZm9yCisgKgorICogQHJldHVybiBwb2ludGVyIHRvIHRoZSBGRlBzeUNoYW5uZWxHcm91cCB0aGlzIGNoYW5uZWwgYmVsb25ncyB0bworICovCitGRlBzeUNoYW5uZWxHcm91cCAqZmZfcHN5X2ZpbmRfZ3JvdXAoRkZQc3lDb250ZXh0ICpjdHgsIGludCBjaGFubmVsKTsKKworLyoqCisgKiBDbGVhbnVwIG1vZGVsIGNvbnRleHQgYXQgdGhlIGVuZC4KKyAqCisgKiBAcGFyYW0gY3R4IG1vZGVsIGNvbnRleHQKKyAqLwordm9pZCBmZl9wc3lfZW5kKEZGUHN5Q29udGV4dCAqY3R4KTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBwcmVwcm9jZXNzaW5nIHN0dWZmLiAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgVGhpcyBzaG91bGQgYmUgbW92ZWQgaW50byBzb21lIGF1ZGlvIGZpbHRlciBldmVudHVhbGx5LiAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgRkZQc3lQcmVwcm9jZXNzQ29udGV4dDsKKworLyoqCisgKiBwc3ljaG9hY291c3RpYyBtb2RlbCBhdWRpbyBwcmVwcm9jZXNzaW5nIGluaXRpYWxpemF0aW9uCisgKi8KK3N0cnVjdCBGRlBzeVByZXByb2Nlc3NDb250ZXh0ICpmZl9wc3lfcHJlcHJvY2Vzc19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKy8qKgorICogUHJlcHJvY2VzcyBzZXZlcmFsIGNoYW5uZWwgaW4gYXVkaW8gZnJhbWUgaW4gb3JkZXIgdG8gY29tcHJlc3MgaXQgYmV0dGVyLgorICoKKyAqIEBwYXJhbSBjdHggICAgICBwcmVwcm9jZXNzaW5nIGNvbnRleHQKKyAqIEBwYXJhbSBhdWRpbyAgICBzYW1wbGVzIHRvIGJlIGZpbHRlcmVkIChpbiBwbGFjZSkKKyAqIEBwYXJhbSBjaGFubmVscyBudW1iZXIgb2YgY2hhbm5lbCB0byBwcmVwcm9jZXNzCisgKi8KK3ZvaWQgZmZfcHN5X3ByZXByb2Nlc3Moc3RydWN0IEZGUHN5UHJlcHJvY2Vzc0NvbnRleHQgKmN0eCwgZmxvYXQgKiphdWRpbywgaW50IGNoYW5uZWxzKTsKKworLyoqCisgKiBDbGVhbnVwIGF1ZGlvIHByZXByb2Nlc3NpbmcgbW9kdWxlLgorICovCit2b2lkIGZmX3BzeV9wcmVwcm9jZXNzX2VuZChzdHJ1Y3QgRkZQc3lQcmVwcm9jZXNzQ29udGV4dCAqY3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUFNZTU9ERUxfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHRocmVhZC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHRocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwN2NhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wdGhyZWFkLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBSb21hbiBTaGFwb3NobmlrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQWxleGFuZGVyIFN0cmFuZ2UgKGFzdHJhbmdlQGl0aGlua3N3LmNvbSkKKyAqCisgKiBNYW55IHRoYW5rcyB0byBTdGV2ZW4gTS4gU2NodWx0eiBmb3IgcHJvdmlkaW5nIGNsZXZlciBpZGVhcyBhbmQKKyAqIHRvIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+IGZvciB3cml0aW5nIGluaXRpYWwKKyAqIGltcGxlbWVudGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNdWx0aXRocmVhZGluZyBzdXBwb3J0IGZ1bmN0aW9ucworICogQHNlZSBkb2MvbXVsdGl0aHJlYWRpbmcudHh0CisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInB0aHJlYWRfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKworLyoqCisgKiBTZXQgdGhlIHRocmVhZGluZyBhbGdvcml0aG1zIHVzZWQuCisgKgorICogVGhyZWFkaW5nIHJlcXVpcmVzIG1vcmUgdGhhbiBvbmUgdGhyZWFkLgorICogRnJhbWUgdGhyZWFkaW5nIHJlcXVpcmVzIGVudGlyZSBmcmFtZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb2RlYywKKyAqIGFuZCBpbnRyb2R1Y2VzIGV4dHJhIGRlY29kaW5nIGRlbGF5LCBzbyBpcyBpbmNvbXBhdGlibGUgd2l0aCBsb3dfZGVsYXkuCisgKgorICogQHBhcmFtIGF2Y3R4IFRoZSBjb250ZXh0LgorICovCitzdGF0aWMgdm9pZCB2YWxpZGF0ZV90aHJlYWRfcGFyYW1ldGVycyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGZyYW1lX3RocmVhZGluZ19zdXBwb3J0ZWQgPSAoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1RSVU5DQVRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0xPV19ERUxBWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShhdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfQ0hVTktTKTsKKyAgICBpZiAoYXZjdHgtPnRocmVhZF9jb3VudCA9PSAxKSB7CisgICAgICAgIGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgPSAwOworICAgIH0gZWxzZSBpZiAoZnJhbWVfdGhyZWFkaW5nX3N1cHBvcnRlZCAmJiAoYXZjdHgtPnRocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSkgeworICAgICAgICBhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlID0gRkZfVEhSRUFEX0ZSQU1FOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUyAmJgorICAgICAgICAgICAgICAgYXZjdHgtPnRocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKSB7CisgICAgICAgIGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgPSBGRl9USFJFQURfU0xJQ0U7CisgICAgfSBlbHNlIGlmICghKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX0FVVE9fVEhSRUFEUykpIHsKKyAgICAgICAgYXZjdHgtPnRocmVhZF9jb3VudCAgICAgICA9IDE7CisgICAgICAgIGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgPSAwOworICAgIH0KKworICAgIGlmIChhdmN0eC0+dGhyZWFkX2NvdW50ID4gTUFYX0FVVE9fVEhSRUFEUykKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJBcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkICVkIHRocmVhZHMuIFVzaW5nIGEgdGhyZWFkIGNvdW50IGdyZWF0ZXIgdGhhbiAlZCBpcyBub3QgcmVjb21tZW5kZWQuXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPnRocmVhZF9jb3VudCwgTUFYX0FVVE9fVEhSRUFEUyk7Cit9CisKK2ludCBmZl90aHJlYWRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgdmFsaWRhdGVfdGhyZWFkX3BhcmFtZXRlcnMoYXZjdHgpOworCisgICAgaWYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUmRkZfVEhSRUFEX1NMSUNFKQorICAgICAgICByZXR1cm4gZmZfc2xpY2VfdGhyZWFkX2luaXQoYXZjdHgpOworICAgIGVsc2UgaWYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUmRkZfVEhSRUFEX0ZSQU1FKQorICAgICAgICByZXR1cm4gZmZfZnJhbWVfdGhyZWFkX2luaXQoYXZjdHgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfdGhyZWFkX2ZyZWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGlmIChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlJkZGX1RIUkVBRF9GUkFNRSkKKyAgICAgICAgZmZfZnJhbWVfdGhyZWFkX2ZyZWUoYXZjdHgsIGF2Y3R4LT50aHJlYWRfY291bnQpOworICAgIGVsc2UKKyAgICAgICAgZmZfc2xpY2VfdGhyZWFkX2ZyZWUoYXZjdHgpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHRocmVhZF9mcmFtZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHRocmVhZF9mcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNGFiODQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wdGhyZWFkX2ZyYW1lLmMKQEAgLTAsMCArMSw4OTkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRnJhbWUgbXVsdGl0aHJlYWRpbmcgc3VwcG9ydCBmdW5jdGlvbnMKKyAqIEBzZWUgZG9jL211bHRpdGhyZWFkaW5nLnR4dAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgSEFWRV9QVEhSRUFEUworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbGlmIEhBVkVfVzMyVEhSRUFEUworI2luY2x1ZGUgImNvbXBhdC93MzJwdGhyZWFkcy5oIgorI2VsaWYgSEFWRV9PUzJUSFJFQURTCisjaW5jbHVkZSAiY29tcGF0L29zMnRocmVhZHMuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicHRocmVhZF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKy8qKgorICogQ29udGV4dCB1c2VkIGJ5IGNvZGVjIHRocmVhZHMgYW5kIHN0b3JlZCBpbiB0aGVpciBBVkNvZGVjSW50ZXJuYWwgdGhyZWFkX2N0eC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgUGVyVGhyZWFkQ29udGV4dCB7CisgICAgc3RydWN0IEZyYW1lVGhyZWFkQ29udGV4dCAqcGFyZW50OworCisgICAgcHRocmVhZF90ICAgICAgdGhyZWFkOworICAgIGludCAgICAgICAgICAgIHRocmVhZF9pbml0OworICAgIHB0aHJlYWRfY29uZF90IGlucHV0X2NvbmQ7ICAgICAgLy8vPCBVc2VkIHRvIHdhaXQgZm9yIGEgbmV3IHBhY2tldCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgICBwdGhyZWFkX2NvbmRfdCBwcm9ncmVzc19jb25kOyAgIC8vLzwgVXNlZCBieSBjaGlsZCB0aHJlYWRzIHRvIHdhaXQgZm9yIHByb2dyZXNzIHRvIGNoYW5nZS4KKyAgICBwdGhyZWFkX2NvbmRfdCBvdXRwdXRfY29uZDsgICAgIC8vLzwgVXNlZCBieSB0aGUgbWFpbiB0aHJlYWQgdG8gd2FpdCBmb3IgZnJhbWVzIHRvIGZpbmlzaC4KKworICAgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsgICAgICAgICAgLy8vPCBNdXRleCB1c2VkIHRvIHByb3RlY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBQZXJUaHJlYWRDb250ZXh0LgorICAgIHB0aHJlYWRfbXV0ZXhfdCBwcm9ncmVzc19tdXRleDsgLy8vPCBNdXRleCB1c2VkIHRvIHByb3RlY3QgZnJhbWUgcHJvZ3Jlc3MgdmFsdWVzIGFuZCBwcm9ncmVzc19jb25kLgorCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OyAgICAgICAgICAvLy88IENvbnRleHQgdXNlZCB0byBkZWNvZGUgcGFja2V0cyBwYXNzZWQgdG8gdGhpcyB0aHJlYWQuCisKKyAgICBBVlBhY2tldCAgICAgICBhdnBrdDsgICAgICAgICAgIC8vLzwgSW5wdXQgcGFja2V0IChmb3IgZGVjb2RpbmcpIG9yIG91dHB1dCAoZm9yIGVuY29kaW5nKS4KKworICAgIEFWRnJhbWUgKmZyYW1lOyAgICAgICAgICAgICAgICAgLy8vPCBPdXRwdXQgZnJhbWUgKGZvciBkZWNvZGluZykgb3IgaW5wdXQgKGZvciBlbmNvZGluZykuCisgICAgaW50ICAgICBnb3RfZnJhbWU7ICAgICAgICAgICAgICAvLy88IFRoZSBvdXRwdXQgb2YgZ290X3BpY3R1cmVfcHRyIGZyb20gdGhlIGxhc3QgYXZjb2RlY19kZWNvZGVfdmlkZW8oKSBjYWxsLgorICAgIGludCAgICAgcmVzdWx0OyAgICAgICAgICAgICAgICAgLy8vPCBUaGUgcmVzdWx0IG9mIHRoZSBsYXN0IGNvZGVjIGRlY29kZS9lbmNvZGUoKSBjYWxsLgorCisgICAgZW51bSB7CisgICAgICAgIFNUQVRFX0lOUFVUX1JFQURZLCAgICAgICAgICAvLy88IFNldCB3aGVuIHRoZSB0aHJlYWQgaXMgYXdhaXRpbmcgYSBwYWNrZXQuCisgICAgICAgIFNUQVRFX1NFVFRJTkdfVVAsICAgICAgICAgICAvLy88IFNldCBiZWZvcmUgdGhlIGNvZGVjIGhhcyBjYWxsZWQgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cCgpLgorICAgICAgICBTVEFURV9HRVRfQlVGRkVSLCAgICAgICAgICAgLyoqPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU2V0IHdoZW4gdGhlIGNvZGVjIGNhbGxzIGdldF9idWZmZXIoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFN0YXRlIGlzIHJldHVybmVkIHRvIFNUQVRFX1NFVFRJTkdfVVAgYWZ0ZXJ3YXJkcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBTVEFURV9HRVRfRk9STUFULCAgICAgICAgICAgLyoqPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU2V0IHdoZW4gdGhlIGNvZGVjIGNhbGxzIGdldF9mb3JtYXQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFN0YXRlIGlzIHJldHVybmVkIHRvIFNUQVRFX1NFVFRJTkdfVVAgYWZ0ZXJ3YXJkcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBTVEFURV9TRVRVUF9GSU5JU0hFRCAgICAgICAgLy8vPCBTZXQgYWZ0ZXIgdGhlIGNvZGVjIGhhcyBjYWxsZWQgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cCgpLgorICAgIH0gc3RhdGU7CisKKyAgICAvKioKKyAgICAgKiBBcnJheSBvZiBmcmFtZXMgcGFzc2VkIHRvIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcigpLgorICAgICAqIEZyYW1lcyBhcmUgcmVsZWFzZWQgYWZ0ZXIgYWxsIHRocmVhZHMgcmVmZXJlbmNpbmcgdGhlbSBhcmUgZmluaXNoZWQuCisgICAgICovCisgICAgQVZGcmFtZSAqcmVsZWFzZWRfYnVmZmVyczsKKyAgICBpbnQgIG51bV9yZWxlYXNlZF9idWZmZXJzOworICAgIGludCAgICAgIHJlbGVhc2VkX2J1ZmZlcnNfYWxsb2NhdGVkOworCisgICAgQVZGcmFtZSAqcmVxdWVzdGVkX2ZyYW1lOyAgICAgICAvLy88IEFWRnJhbWUgdGhlIGNvZGVjIHBhc3NlZCB0byBnZXRfYnVmZmVyKCkKKyAgICBpbnQgICAgICByZXF1ZXN0ZWRfZmxhZ3M7ICAgICAgIC8vLzwgZmxhZ3MgcGFzc2VkIHRvIGdldF9idWZmZXIoKSBmb3IgcmVxdWVzdGVkX2ZyYW1lCisKKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKmF2YWlsYWJsZV9mb3JtYXRzOyAvLy88IEZvcm1hdCBhcnJheSBmb3IgZ2V0X2Zvcm1hdCgpCisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHJlc3VsdF9mb3JtYXQ7ICAgICAgICAgICAgLy8vPCBnZXRfZm9ybWF0KCkgcmVzdWx0Cit9IFBlclRocmVhZENvbnRleHQ7CisKKy8qKgorICogQ29udGV4dCBzdG9yZWQgaW4gdGhlIGNsaWVudCBBVkNvZGVjSW50ZXJuYWwgdGhyZWFkX2N0eC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRnJhbWVUaHJlYWRDb250ZXh0IHsKKyAgICBQZXJUaHJlYWRDb250ZXh0ICp0aHJlYWRzOyAgICAgLy8vPCBUaGUgY29udGV4dHMgZm9yIGVhY2ggdGhyZWFkLgorICAgIFBlclRocmVhZENvbnRleHQgKnByZXZfdGhyZWFkOyAvLy88IFRoZSBsYXN0IHRocmVhZCBzdWJtaXRfcGFja2V0KCkgd2FzIGNhbGxlZCBvbi4KKworICAgIHB0aHJlYWRfbXV0ZXhfdCBidWZmZXJfbXV0ZXg7ICAvLy88IE11dGV4IHVzZWQgdG8gcHJvdGVjdCBnZXQvcmVsZWFzZV9idWZmZXIoKS4KKworICAgIGludCBuZXh0X2RlY29kaW5nOyAgICAgICAgICAgICAvLy88IFRoZSBuZXh0IGNvbnRleHQgdG8gc3VibWl0IGEgcGFja2V0IHRvLgorICAgIGludCBuZXh0X2ZpbmlzaGVkOyAgICAgICAgICAgICAvLy88IFRoZSBuZXh0IGNvbnRleHQgdG8gcmV0dXJuIG91dHB1dCBmcm9tLgorCisgICAgaW50IGRlbGF5aW5nOyAgICAgICAgICAgICAgICAgIC8qKjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU2V0IGZvciB0aGUgZmlyc3QgTiBwYWNrZXRzLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogV2hpbGUgaXQgaXMgc2V0LCBmZl90aHJlYWRfZW4vZGVjb2RlX2ZyYW1lIHdvbid0IHJldHVybiBhbnkgcmVzdWx0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBpbnQgZGllOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBTZXQgd2hlbiB0aHJlYWRzIHNob3VsZCBleGl0LgorfSBGcmFtZVRocmVhZENvbnRleHQ7CisKKyNpZiBGRl9BUElfR0VUX0JVRkZFUgorI2RlZmluZSBUSFJFQURfU0FGRV9DQUxMQkFDS1MoYXZjdHgpIFwKKygoYXZjdHgpLT50aHJlYWRfc2FmZV9jYWxsYmFja3MgfHwgKCEoYXZjdHgpLT5nZXRfYnVmZmVyICYmIChhdmN0eCktPmdldF9idWZmZXIyID09IGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyMikpCisjZWxzZQorI2RlZmluZSBUSFJFQURfU0FGRV9DQUxMQkFDS1MoYXZjdHgpIFwKKygoYXZjdHgpLT50aHJlYWRfc2FmZV9jYWxsYmFja3MgfHwgKGF2Y3R4KS0+Z2V0X2J1ZmZlcjIgPT0gYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXIyKQorI2VuZGlmCisKKy8qKgorICogQ29kZWMgd29ya2VyIHRocmVhZC4KKyAqCisgKiBBdXRvbWF0aWNhbGx5IGNhbGxzIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoKSBpZiB0aGUgY29kZWMgZG9lcworICogbm90IHByb3ZpZGUgYW4gdXBkYXRlX3RocmVhZF9jb250ZXh0IG1ldGhvZCwgb3IgaWYgdGhlIGNvZGVjIHJldHVybnMKKyAqIGJlZm9yZSBjYWxsaW5nIGl0LgorICovCitzdGF0aWMgYXR0cmlidXRlX2FsaWduX2FyZyB2b2lkICpmcmFtZV93b3JrZXJfdGhyZWFkKHZvaWQgKmFyZykKK3sKKyAgICBQZXJUaHJlYWRDb250ZXh0ICpwID0gYXJnOworICAgIEZyYW1lVGhyZWFkQ29udGV4dCAqZmN0eCA9IHAtPnBhcmVudDsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBwLT5hdmN0eDsKKyAgICBjb25zdCBBVkNvZGVjICpjb2RlYyA9IGF2Y3R4LT5jb2RlYzsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+bXV0ZXgpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICB3aGlsZSAocC0+c3RhdGUgPT0gU1RBVEVfSU5QVVRfUkVBRFkgJiYgIWZjdHgtPmRpZSkKKyAgICAgICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcC0+aW5wdXRfY29uZCwgJnAtPm11dGV4KTsKKworICAgICAgICBpZiAoZmN0eC0+ZGllKSBicmVhazsKKworICAgICAgICBpZiAoIWNvZGVjLT51cGRhdGVfdGhyZWFkX2NvbnRleHQgJiYgVEhSRUFEX1NBRkVfQ0FMTEJBQ0tTKGF2Y3R4KSkKKyAgICAgICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoYXZjdHgpOworCisgICAgICAgIGF2X2ZyYW1lX3VucmVmKHAtPmZyYW1lKTsKKyAgICAgICAgcC0+Z290X2ZyYW1lID0gMDsKKyAgICAgICAgcC0+cmVzdWx0ID0gY29kZWMtPmRlY29kZShhdmN0eCwgcC0+ZnJhbWUsICZwLT5nb3RfZnJhbWUsICZwLT5hdnBrdCk7CisKKyAgICAgICAgaWYgKChwLT5yZXN1bHQgPCAwIHx8ICFwLT5nb3RfZnJhbWUpICYmIHAtPmZyYW1lLT5idWZbMF0pIHsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+aW50ZXJuYWwtPmFsbG9jYXRlX3Byb2dyZXNzKQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQSBmcmFtZSB0aHJlYWRlZCBkZWNvZGVyIGRpZCBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAiZnJlZSB0aGUgZnJhbWUgb24gZmFpbHVyZS4gVGhpcyBpcyBhIGJ1ZywgcGxlYXNlIHJlcG9ydCBpdC5cbiIpOworICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYocC0+ZnJhbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHAtPnN0YXRlID09IFNUQVRFX1NFVFRJTkdfVVApIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoYXZjdHgpOworCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXgpOworI2lmIDAgLy9CVUZSRUYtRklYTUUKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9CVUZGRVJTOyBpKyspCisgICAgICAgICAgICBpZiAocC0+cHJvZ3Jlc3NfdXNlZFtpXSAmJiAocC0+Z290X2ZyYW1lIHx8IHAtPnJlc3VsdDwwIHx8IGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9IMjY0KSkgeworICAgICAgICAgICAgICAgIHAtPnByb2dyZXNzW2ldWzBdID0gSU5UX01BWDsKKyAgICAgICAgICAgICAgICBwLT5wcm9ncmVzc1tpXVsxXSA9IElOVF9NQVg7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcC0+c3RhdGUgPSBTVEFURV9JTlBVVF9SRUFEWTsKKworICAgICAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZwLT5wcm9ncmVzc19jb25kKTsKKyAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcC0+b3V0cHV0X2NvbmQpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXgpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcC0+bXV0ZXgpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogVXBkYXRlIHRoZSBuZXh0IHRocmVhZCdzIEFWQ29kZWNDb250ZXh0IHdpdGggdmFsdWVzIGZyb20gdGhlIHJlZmVyZW5jZSB0aHJlYWQncyBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBkc3QgVGhlIGRlc3RpbmF0aW9uIGNvbnRleHQuCisgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2UgY29udGV4dC4KKyAqIEBwYXJhbSBmb3JfdXNlciAwIGlmIHRoZSBkZXN0aW5hdGlvbiBpcyBhIGNvZGVjIHRocmVhZCwgMSBpZiB0aGUgZGVzdGluYXRpb24gaXMgdGhlIHVzZXIncyB0aHJlYWQKKyAqLworc3RhdGljIGludCB1cGRhdGVfY29udGV4dF9mcm9tX3RocmVhZChBVkNvZGVjQ29udGV4dCAqZHN0LCBBVkNvZGVjQ29udGV4dCAqc3JjLCBpbnQgZm9yX3VzZXIpCit7CisgICAgaW50IGVyciA9IDA7CisKKyAgICBpZiAoZHN0ICE9IHNyYykgeworICAgICAgICBkc3QtPnRpbWVfYmFzZSA9IHNyYy0+dGltZV9iYXNlOworICAgICAgICBkc3QtPmZyYW1lcmF0ZSA9IHNyYy0+ZnJhbWVyYXRlOworICAgICAgICBkc3QtPndpZHRoICAgICA9IHNyYy0+d2lkdGg7CisgICAgICAgIGRzdC0+aGVpZ2h0ICAgID0gc3JjLT5oZWlnaHQ7CisgICAgICAgIGRzdC0+cGl4X2ZtdCAgID0gc3JjLT5waXhfZm10OworCisgICAgICAgIGRzdC0+Y29kZWRfd2lkdGggID0gc3JjLT5jb2RlZF93aWR0aDsKKyAgICAgICAgZHN0LT5jb2RlZF9oZWlnaHQgPSBzcmMtPmNvZGVkX2hlaWdodDsKKworICAgICAgICBkc3QtPmhhc19iX2ZyYW1lcyA9IHNyYy0+aGFzX2JfZnJhbWVzOworICAgICAgICBkc3QtPmlkY3RfYWxnbyAgICA9IHNyYy0+aWRjdF9hbGdvOworCisgICAgICAgIGRzdC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gc3JjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgICAgIGRzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyAgID0gc3JjLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworI2lmIEZGX0FQSV9BRkQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgZHN0LT5kdGdfYWN0aXZlX2Zvcm1hdCAgICAgPSBzcmMtPmR0Z19hY3RpdmVfZm9ybWF0OworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYgLyogRkZfQVBJX0FGRCAqLworCisgICAgICAgIGRzdC0+cHJvZmlsZSA9IHNyYy0+cHJvZmlsZTsKKyAgICAgICAgZHN0LT5sZXZlbCAgID0gc3JjLT5sZXZlbDsKKworICAgICAgICBkc3QtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBzcmMtPmJpdHNfcGVyX3Jhd19zYW1wbGU7CisgICAgICAgIGRzdC0+dGlja3NfcGVyX2ZyYW1lICAgICA9IHNyYy0+dGlja3NfcGVyX2ZyYW1lOworICAgICAgICBkc3QtPmNvbG9yX3ByaW1hcmllcyAgICAgPSBzcmMtPmNvbG9yX3ByaW1hcmllczsKKworICAgICAgICBkc3QtPmNvbG9yX3RyYyAgID0gc3JjLT5jb2xvcl90cmM7CisgICAgICAgIGRzdC0+Y29sb3JzcGFjZSAgPSBzcmMtPmNvbG9yc3BhY2U7CisgICAgICAgIGRzdC0+Y29sb3JfcmFuZ2UgPSBzcmMtPmNvbG9yX3JhbmdlOworICAgICAgICBkc3QtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24gPSBzcmMtPmNocm9tYV9zYW1wbGVfbG9jYXRpb247CisKKyAgICAgICAgZHN0LT5od2FjY2VsID0gc3JjLT5od2FjY2VsOworICAgICAgICBkc3QtPmh3YWNjZWxfY29udGV4dCA9IHNyYy0+aHdhY2NlbF9jb250ZXh0OworCisgICAgICAgIGRzdC0+Y2hhbm5lbHMgICAgICAgPSBzcmMtPmNoYW5uZWxzOworICAgICAgICBkc3QtPnNhbXBsZV9yYXRlICAgID0gc3JjLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgZHN0LT5zYW1wbGVfZm10ICAgICA9IHNyYy0+c2FtcGxlX2ZtdDsKKyAgICAgICAgZHN0LT5jaGFubmVsX2xheW91dCA9IHNyYy0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgICAgIGRzdC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhID0gc3JjLT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgfQorCisgICAgaWYgKGZvcl91c2VyKSB7CisgICAgICAgIGRzdC0+ZGVsYXkgICAgICAgPSBzcmMtPnRocmVhZF9jb3VudCAtIDE7CisgICAgICAgIGRzdC0+Y29kZWRfZnJhbWUgPSBzcmMtPmNvZGVkX2ZyYW1lOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkc3QtPmNvZGVjLT51cGRhdGVfdGhyZWFkX2NvbnRleHQpCisgICAgICAgICAgICBlcnIgPSBkc3QtPmNvZGVjLT51cGRhdGVfdGhyZWFkX2NvbnRleHQoZHN0LCBzcmMpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICogVXBkYXRlIHRoZSBuZXh0IHRocmVhZCdzIEFWQ29kZWNDb250ZXh0IHdpdGggdmFsdWVzIHNldCBieSB0aGUgdXNlci4KKyAqCisgKiBAcGFyYW0gZHN0IFRoZSBkZXN0aW5hdGlvbiBjb250ZXh0LgorICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGNvbnRleHQuCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgdXBkYXRlX2NvbnRleHRfZnJvbV91c2VyKEFWQ29kZWNDb250ZXh0ICpkc3QsIEFWQ29kZWNDb250ZXh0ICpzcmMpCit7CisjZGVmaW5lIGNvcHlfZmllbGRzKHMsIGUpIG1lbWNweSgmZHN0LT5zLCAmc3JjLT5zLCAoY2hhciopJmRzdC0+ZSAtIChjaGFyKikmZHN0LT5zKTsKKyAgICBkc3QtPmZsYWdzICAgICAgICAgID0gc3JjLT5mbGFnczsKKworICAgIGRzdC0+ZHJhd19ob3Jpel9iYW5kPSBzcmMtPmRyYXdfaG9yaXpfYmFuZDsKKyAgICBkc3QtPmdldF9idWZmZXIyICAgID0gc3JjLT5nZXRfYnVmZmVyMjsKKyNpZiBGRl9BUElfR0VUX0JVRkZFUgorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGRzdC0+Z2V0X2J1ZmZlciAgICAgPSBzcmMtPmdldF9idWZmZXI7CisgICAgZHN0LT5yZWxlYXNlX2J1ZmZlciA9IHNyYy0+cmVsZWFzZV9idWZmZXI7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorCisgICAgZHN0LT5vcGFxdWUgICA9IHNyYy0+b3BhcXVlOworICAgIGRzdC0+ZGVidWcgICAgPSBzcmMtPmRlYnVnOworICAgIGRzdC0+ZGVidWdfbXYgPSBzcmMtPmRlYnVnX212OworCisgICAgZHN0LT5zbGljZV9mbGFncyA9IHNyYy0+c2xpY2VfZmxhZ3M7CisgICAgZHN0LT5mbGFnczIgICAgICA9IHNyYy0+ZmxhZ3MyOworCisgICAgY29weV9maWVsZHMoc2tpcF9sb29wX2ZpbHRlciwgc3VidGl0bGVfaGVhZGVyKTsKKworICAgIGRzdC0+ZnJhbWVfbnVtYmVyICAgICA9IHNyYy0+ZnJhbWVfbnVtYmVyOworICAgIGRzdC0+cmVvcmRlcmVkX29wYXF1ZSA9IHNyYy0+cmVvcmRlcmVkX29wYXF1ZTsKKyAgICBkc3QtPnRocmVhZF9zYWZlX2NhbGxiYWNrcyA9IHNyYy0+dGhyZWFkX3NhZmVfY2FsbGJhY2tzOworCisgICAgaWYgKHNyYy0+c2xpY2VfY291bnQgJiYgc3JjLT5zbGljZV9vZmZzZXQpIHsKKyAgICAgICAgaWYgKGRzdC0+c2xpY2VfY291bnQgPCBzcmMtPnNsaWNlX2NvdW50KSB7CisgICAgICAgICAgICBpbnQgZXJyID0gYXZfcmVhbGxvY3BfYXJyYXkoJmRzdC0+c2xpY2Vfb2Zmc2V0LCBzcmMtPnNsaWNlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqZHN0LT5zbGljZV9vZmZzZXQpKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGRzdC0+c2xpY2Vfb2Zmc2V0LCBzcmMtPnNsaWNlX29mZnNldCwKKyAgICAgICAgICAgICAgIHNyYy0+c2xpY2VfY291bnQgKiBzaXplb2YoKmRzdC0+c2xpY2Vfb2Zmc2V0KSk7CisgICAgfQorICAgIGRzdC0+c2xpY2VfY291bnQgPSBzcmMtPnNsaWNlX2NvdW50OworICAgIHJldHVybiAwOworI3VuZGVmIGNvcHlfZmllbGRzCit9CisKKy8vLyBSZWxlYXNlcyB0aGUgYnVmZmVycyB0aGF0IHRoaXMgZGVjb2RpbmcgdGhyZWFkIHdhcyB0aGUgbGFzdCB1c2VyIG9mLgorc3RhdGljIHZvaWQgcmVsZWFzZV9kZWxheWVkX2J1ZmZlcnMoUGVyVGhyZWFkQ29udGV4dCAqcCkKK3sKKyAgICBGcmFtZVRocmVhZENvbnRleHQgKmZjdHggPSBwLT5wYXJlbnQ7CisKKyAgICB3aGlsZSAocC0+bnVtX3JlbGVhc2VkX2J1ZmZlcnMgPiAwKSB7CisgICAgICAgIEFWRnJhbWUgKmY7CisKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZmY3R4LT5idWZmZXJfbXV0ZXgpOworCisgICAgICAgIC8vIGZpeCBleHRlbmRlZCBkYXRhIGluIGNhc2UgdGhlIGNhbGxlciBzY3Jld2VkIGl0IHVwCisgICAgICAgIGF2X2Fzc2VydDAocC0+YXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgICAgICAgICAgICAgcC0+YXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKTsKKyAgICAgICAgZiA9ICZwLT5yZWxlYXNlZF9idWZmZXJzWy0tcC0+bnVtX3JlbGVhc2VkX2J1ZmZlcnNdOworICAgICAgICBmLT5leHRlbmRlZF9kYXRhID0gZi0+ZGF0YTsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoZik7CisKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmZjdHgtPmJ1ZmZlcl9tdXRleCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHN1Ym1pdF9wYWNrZXQoUGVyVGhyZWFkQ29udGV4dCAqcCwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEZyYW1lVGhyZWFkQ29udGV4dCAqZmN0eCA9IHAtPnBhcmVudDsKKyAgICBQZXJUaHJlYWRDb250ZXh0ICpwcmV2X3RocmVhZCA9IGZjdHgtPnByZXZfdGhyZWFkOworICAgIGNvbnN0IEFWQ29kZWMgKmNvZGVjID0gcC0+YXZjdHgtPmNvZGVjOworCisgICAgaWYgKCFhdnBrdC0+c2l6ZSAmJiAhKGNvZGVjLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfREVMQVkpKSByZXR1cm4gMDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+bXV0ZXgpOworCisgICAgcmVsZWFzZV9kZWxheWVkX2J1ZmZlcnMocCk7CisKKyAgICBpZiAocHJldl90aHJlYWQpIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgaWYgKHByZXZfdGhyZWFkLT5zdGF0ZSA9PSBTVEFURV9TRVRUSU5HX1VQKSB7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnByZXZfdGhyZWFkLT5wcm9ncmVzc19tdXRleCk7CisgICAgICAgICAgICB3aGlsZSAocHJldl90aHJlYWQtPnN0YXRlID09IFNUQVRFX1NFVFRJTkdfVVApCisgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnByZXZfdGhyZWFkLT5wcm9ncmVzc19jb25kLCAmcHJldl90aHJlYWQtPnByb2dyZXNzX211dGV4KTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwcmV2X3RocmVhZC0+cHJvZ3Jlc3NfbXV0ZXgpOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gdXBkYXRlX2NvbnRleHRfZnJvbV90aHJlYWQocC0+YXZjdHgsIHByZXZfdGhyZWFkLT5hdmN0eCwgMCk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5tdXRleCk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfcGFja2V0X3VucmVmKCZwLT5hdnBrdCk7CisgICAgYXZfcGFja2V0X3JlZigmcC0+YXZwa3QsIGF2cGt0KTsKKworICAgIHAtPnN0YXRlID0gU1RBVEVfU0VUVElOR19VUDsKKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZwLT5pbnB1dF9jb25kKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcC0+bXV0ZXgpOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgY2xpZW50IGRvZXNuJ3QgaGF2ZSBhIHRocmVhZC1zYWZlIGdldF9idWZmZXIoKSwKKyAgICAgKiB0aGVuIGRlY29kaW5nIHRocmVhZHMgY2FsbCBiYWNrIHRvIHRoZSBtYWluIHRocmVhZCwKKyAgICAgKiBhbmQgaXQgY2FsbHMgYmFjayB0byB0aGUgY2xpZW50IGhlcmUuCisgICAgICovCisKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBpZiAoIXAtPmF2Y3R4LT50aHJlYWRfc2FmZV9jYWxsYmFja3MgJiYgKAorICAgICAgICAgcC0+YXZjdHgtPmdldF9mb3JtYXQgIT0gYXZjb2RlY19kZWZhdWx0X2dldF9mb3JtYXQgfHwKKyNpZiBGRl9BUElfR0VUX0JVRkZFUgorICAgICAgICAgcC0+YXZjdHgtPmdldF9idWZmZXIgfHwKKyNlbmRpZgorICAgICAgICAgcC0+YXZjdHgtPmdldF9idWZmZXIyICE9IGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyMikpIHsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICB3aGlsZSAocC0+c3RhdGUgIT0gU1RBVEVfU0VUVVBfRklOSVNIRUQgJiYgcC0+c3RhdGUgIT0gU1RBVEVfSU5QVVRfUkVBRFkpIHsKKyAgICAgICAgICAgIGludCBjYWxsX2RvbmUgPSAxOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wcm9ncmVzc19tdXRleCk7CisgICAgICAgICAgICB3aGlsZSAocC0+c3RhdGUgPT0gU1RBVEVfU0VUVElOR19VUCkKKyAgICAgICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcC0+cHJvZ3Jlc3NfY29uZCwgJnAtPnByb2dyZXNzX211dGV4KTsKKworICAgICAgICAgICAgc3dpdGNoIChwLT5zdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBTVEFURV9HRVRfQlVGRkVSOgorICAgICAgICAgICAgICAgIHAtPnJlc3VsdCA9IGZmX2dldF9idWZmZXIocC0+YXZjdHgsIHAtPnJlcXVlc3RlZF9mcmFtZSwgcC0+cmVxdWVzdGVkX2ZsYWdzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfR0VUX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBwLT5yZXN1bHRfZm9ybWF0ID0gZmZfZ2V0X2Zvcm1hdChwLT5hdmN0eCwgcC0+YXZhaWxhYmxlX2Zvcm1hdHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjYWxsX2RvbmUgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbGxfZG9uZSkgeworICAgICAgICAgICAgICAgIHAtPnN0YXRlICA9IFNUQVRFX1NFVFRJTkdfVVA7CisgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcC0+cHJvZ3Jlc3NfY29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgZmN0eC0+cHJldl90aHJlYWQgPSBwOworICAgIGZjdHgtPm5leHRfZGVjb2RpbmcrKzsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfdGhyZWFkX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpwaWN0dXJlLCBpbnQgKmdvdF9waWN0dXJlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBGcmFtZVRocmVhZENvbnRleHQgKmZjdHggPSBhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHg7CisgICAgaW50IGZpbmlzaGVkID0gZmN0eC0+bmV4dF9maW5pc2hlZDsKKyAgICBQZXJUaHJlYWRDb250ZXh0ICpwOworICAgIGludCBlcnI7CisKKyAgICAvKgorICAgICAqIFN1Ym1pdCBhIHBhY2tldCB0byB0aGUgbmV4dCBkZWNvZGluZyB0aHJlYWQuCisgICAgICovCisKKyAgICBwID0gJmZjdHgtPnRocmVhZHNbZmN0eC0+bmV4dF9kZWNvZGluZ107CisgICAgZXJyID0gdXBkYXRlX2NvbnRleHRfZnJvbV91c2VyKHAtPmF2Y3R4LCBhdmN0eCk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICBlcnIgPSBzdWJtaXRfcGFja2V0KHAsIGF2cGt0KTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgICAgLyoKKyAgICAgKiBJZiB3ZSdyZSBzdGlsbCByZWNlaXZpbmcgdGhlIGluaXRpYWwgcGFja2V0cywgZG9uJ3QgcmV0dXJuIGEgZnJhbWUuCisgICAgICovCisKKyAgICBpZiAoZmN0eC0+bmV4dF9kZWNvZGluZyA+IChhdmN0eC0+dGhyZWFkX2NvdW50LTEtKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GRlYxKSkpCisgICAgICAgIGZjdHgtPmRlbGF5aW5nID0gMDsKKworICAgIGlmIChmY3R4LT5kZWxheWluZykgeworICAgICAgICAqZ290X3BpY3R1cmVfcHRyPTA7CisgICAgICAgIGlmIChhdnBrdC0+c2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJldHVybiB0aGUgbmV4dCBhdmFpbGFibGUgZnJhbWUgZnJvbSB0aGUgb2xkZXN0IHRocmVhZC4KKyAgICAgKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIHRoZW4gd2UgaGF2ZSB0byBza2lwIHRocmVhZHMgdGhhdAorICAgICAqIGRpZG4ndCBvdXRwdXQgYSBmcmFtZSwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGFjY2lkZW50YWxseSBzaWduYWwKKyAgICAgKiBFT0YgKGF2cGt0LT5zaXplID09IDAgJiYgKmdvdF9waWN0dXJlX3B0ciA9PSAwKS4KKyAgICAgKi8KKworICAgIGRvIHsKKyAgICAgICAgcCA9ICZmY3R4LT50aHJlYWRzW2ZpbmlzaGVkKytdOworCisgICAgICAgIGlmIChwLT5zdGF0ZSAhPSBTVEFURV9JTlBVVF9SRUFEWSkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wcm9ncmVzc19tdXRleCk7CisgICAgICAgICAgICB3aGlsZSAocC0+c3RhdGUgIT0gU1RBVEVfSU5QVVRfUkVBRFkpCisgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnAtPm91dHB1dF9jb25kLCAmcC0+cHJvZ3Jlc3NfbXV0ZXgpOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnAtPnByb2dyZXNzX211dGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyYW1lX21vdmVfcmVmKHBpY3R1cmUsIHAtPmZyYW1lKTsKKyAgICAgICAgKmdvdF9waWN0dXJlX3B0ciA9IHAtPmdvdF9mcmFtZTsKKyAgICAgICAgcGljdHVyZS0+cGt0X2R0cyA9IHAtPmF2cGt0LmR0czsKKworICAgICAgICAvKgorICAgICAgICAgKiBBIGxhdGVyIGNhbGwgd2l0aCBhdmtwdC0+c2l6ZSA9PSAwIG1heSBsb29wIG92ZXIgYWxsIHRocmVhZHMsCisgICAgICAgICAqIGluY2x1ZGluZyB0aGlzIG9uZSwgc2VhcmNoaW5nIGZvciBhIGZyYW1lIHRvIHJldHVybiBiZWZvcmUgYmVpbmcKKyAgICAgICAgICogc3RvcHBlZCBieSB0aGUgImZpbmlzaGVkICE9IGZjdHgtPm5leHRfZmluaXNoZWQiIGNvbmRpdGlvbi4KKyAgICAgICAgICogTWFrZSBzdXJlIHdlIGRvbid0IG1pc3Rha2VubHkgcmV0dXJuIHRoZSBzYW1lIGZyYW1lIGFnYWluLgorICAgICAgICAgKi8KKyAgICAgICAgcC0+Z290X2ZyYW1lID0gMDsKKworICAgICAgICBpZiAoZmluaXNoZWQgPj0gYXZjdHgtPnRocmVhZF9jb3VudCkgZmluaXNoZWQgPSAwOworICAgIH0gd2hpbGUgKCFhdnBrdC0+c2l6ZSAmJiAhKmdvdF9waWN0dXJlX3B0ciAmJiBmaW5pc2hlZCAhPSBmY3R4LT5uZXh0X2ZpbmlzaGVkKTsKKworICAgIHVwZGF0ZV9jb250ZXh0X2Zyb21fdGhyZWFkKGF2Y3R4LCBwLT5hdmN0eCwgMSk7CisKKyAgICBpZiAoZmN0eC0+bmV4dF9kZWNvZGluZyA+PSBhdmN0eC0+dGhyZWFkX2NvdW50KSBmY3R4LT5uZXh0X2RlY29kaW5nID0gMDsKKworICAgIGZjdHgtPm5leHRfZmluaXNoZWQgPSBmaW5pc2hlZDsKKworICAgIC8qIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29uc3VtZWQgcGFja2V0IGlmIG5vIGVycm9yIG9jY3VycmVkICovCisgICAgcmV0dXJuIChwLT5yZXN1bHQgPj0gMCkgPyBhdnBrdC0+c2l6ZSA6IHAtPnJlc3VsdDsKK30KKwordm9pZCBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKFRocmVhZEZyYW1lICpmLCBpbnQgbiwgaW50IGZpZWxkKQoreworICAgIFBlclRocmVhZENvbnRleHQgKnA7CisgICAgdm9sYXRpbGUgaW50ICpwcm9ncmVzcyA9IGYtPnByb2dyZXNzID8gKGludCopZi0+cHJvZ3Jlc3MtPmRhdGEgOiBOVUxMOworCisgICAgaWYgKCFwcm9ncmVzcyB8fCBwcm9ncmVzc1tmaWVsZF0gPj0gbikgcmV0dXJuOworCisgICAgcCA9IGYtPm93bmVyLT5pbnRlcm5hbC0+dGhyZWFkX2N0eDsKKworICAgIGlmIChmLT5vd25lci0+ZGVidWcmRkZfREVCVUdfVEhSRUFEUykKKyAgICAgICAgYXZfbG9nKGYtPm93bmVyLCBBVl9MT0dfREVCVUcsICIlcCBmaW5pc2hlZCAlZCBmaWVsZCAlZFxuIiwgcHJvZ3Jlc3MsIG4sIGZpZWxkKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXgpOworICAgIHByb2dyZXNzW2ZpZWxkXSA9IG47CisgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmcC0+cHJvZ3Jlc3NfY29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnAtPnByb2dyZXNzX211dGV4KTsKK30KKwordm9pZCBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoVGhyZWFkRnJhbWUgKmYsIGludCBuLCBpbnQgZmllbGQpCit7CisgICAgUGVyVGhyZWFkQ29udGV4dCAqcDsKKyAgICB2b2xhdGlsZSBpbnQgKnByb2dyZXNzID0gZi0+cHJvZ3Jlc3MgPyAoaW50KilmLT5wcm9ncmVzcy0+ZGF0YSA6IE5VTEw7CisKKyAgICBpZiAoIXByb2dyZXNzIHx8IHByb2dyZXNzW2ZpZWxkXSA+PSBuKSByZXR1cm47CisKKyAgICBwID0gZi0+b3duZXItPmludGVybmFsLT50aHJlYWRfY3R4OworCisgICAgaWYgKGYtPm93bmVyLT5kZWJ1ZyZGRl9ERUJVR19USFJFQURTKQorICAgICAgICBhdl9sb2coZi0+b3duZXIsIEFWX0xPR19ERUJVRywgInRocmVhZCBhd2FpdGluZyAlZCBmaWVsZCAlZCBmcm9tICVwXG4iLCBuLCBmaWVsZCwgcHJvZ3Jlc3MpOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wcm9ncmVzc19tdXRleCk7CisgICAgd2hpbGUgKHByb2dyZXNzW2ZpZWxkXSA8IG4pCisgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZwLT5wcm9ncmVzc19jb25kLCAmcC0+cHJvZ3Jlc3NfbXV0ZXgpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5wcm9ncmVzc19tdXRleCk7Cit9CisKK3ZvaWQgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChBVkNvZGVjQ29udGV4dCAqYXZjdHgpIHsKKyAgICBQZXJUaHJlYWRDb250ZXh0ICpwID0gYXZjdHgtPmludGVybmFsLT50aHJlYWRfY3R4OworCisgICAgaWYgKCEoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSZGRl9USFJFQURfRlJBTUUpKSByZXR1cm47CisKKyAgICBpZihwLT5zdGF0ZSA9PSBTVEFURV9TRVRVUF9GSU5JU0hFRCl7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJNdWx0aXBsZSBmZl90aHJlYWRfZmluaXNoX3NldHVwKCkgY2FsbHNcbiIpOworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXgpOworICAgIHAtPnN0YXRlID0gU1RBVEVfU0VUVVBfRklOSVNIRUQ7CisgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmcC0+cHJvZ3Jlc3NfY29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnAtPnByb2dyZXNzX211dGV4KTsKK30KKworLy8vIFdhaXRzIGZvciBhbGwgdGhyZWFkcyB0byBmaW5pc2guCitzdGF0aWMgdm9pZCBwYXJrX2ZyYW1lX3dvcmtlcl90aHJlYWRzKEZyYW1lVGhyZWFkQ29udGV4dCAqZmN0eCwgaW50IHRocmVhZF9jb3VudCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0aHJlYWRfY291bnQ7IGkrKykgeworICAgICAgICBQZXJUaHJlYWRDb250ZXh0ICpwID0gJmZjdHgtPnRocmVhZHNbaV07CisKKyAgICAgICAgaWYgKHAtPnN0YXRlICE9IFNUQVRFX0lOUFVUX1JFQURZKSB7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnAtPnByb2dyZXNzX211dGV4KTsKKyAgICAgICAgICAgIHdoaWxlIChwLT5zdGF0ZSAhPSBTVEFURV9JTlBVVF9SRUFEWSkKKyAgICAgICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcC0+b3V0cHV0X2NvbmQsICZwLT5wcm9ncmVzc19tdXRleCk7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXgpOworICAgICAgICB9CisgICAgICAgIHAtPmdvdF9mcmFtZSA9IDA7CisgICAgfQorfQorCit2b2lkIGZmX2ZyYW1lX3RocmVhZF9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IHRocmVhZF9jb3VudCkKK3sKKyAgICBGcmFtZVRocmVhZENvbnRleHQgKmZjdHggPSBhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHg7CisgICAgY29uc3QgQVZDb2RlYyAqY29kZWMgPSBhdmN0eC0+Y29kZWM7CisgICAgaW50IGk7CisKKyAgICBwYXJrX2ZyYW1lX3dvcmtlcl90aHJlYWRzKGZjdHgsIHRocmVhZF9jb3VudCk7CisKKyAgICBpZiAoZmN0eC0+cHJldl90aHJlYWQgJiYgZmN0eC0+cHJldl90aHJlYWQgIT0gZmN0eC0+dGhyZWFkcykKKyAgICAgICAgaWYgKHVwZGF0ZV9jb250ZXh0X2Zyb21fdGhyZWFkKGZjdHgtPnRocmVhZHMtPmF2Y3R4LCBmY3R4LT5wcmV2X3RocmVhZC0+YXZjdHgsIDApIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGaW5hbCB0aHJlYWQgdXBkYXRlIGZhaWxlZFxuIik7CisgICAgICAgICAgICBmY3R4LT5wcmV2X3RocmVhZC0+YXZjdHgtPmludGVybmFsLT5pc19jb3B5ID0gZmN0eC0+dGhyZWFkcy0+YXZjdHgtPmludGVybmFsLT5pc19jb3B5OworICAgICAgICAgICAgZmN0eC0+dGhyZWFkcy0+YXZjdHgtPmludGVybmFsLT5pc19jb3B5ID0gMTsKKyAgICAgICAgfQorCisgICAgZmN0eC0+ZGllID0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0aHJlYWRfY291bnQ7IGkrKykgeworICAgICAgICBQZXJUaHJlYWRDb250ZXh0ICpwID0gJmZjdHgtPnRocmVhZHNbaV07CisKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5tdXRleCk7CisgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnAtPmlucHV0X2NvbmQpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcC0+bXV0ZXgpOworCisgICAgICAgIGlmIChwLT50aHJlYWRfaW5pdCkKKyAgICAgICAgICAgIHB0aHJlYWRfam9pbihwLT50aHJlYWQsIE5VTEwpOworICAgICAgICBwLT50aHJlYWRfaW5pdD0wOworCisgICAgICAgIGlmIChjb2RlYy0+Y2xvc2UpCisgICAgICAgICAgICBjb2RlYy0+Y2xvc2UocC0+YXZjdHgpOworCisgICAgICAgIGF2Y3R4LT5jb2RlYyA9IE5VTEw7CisKKyAgICAgICAgcmVsZWFzZV9kZWxheWVkX2J1ZmZlcnMocCk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnAtPmZyYW1lKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGhyZWFkX2NvdW50OyBpKyspIHsKKyAgICAgICAgUGVyVGhyZWFkQ29udGV4dCAqcCA9ICZmY3R4LT50aHJlYWRzW2ldOworCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcC0+bXV0ZXgpOworICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnAtPnByb2dyZXNzX211dGV4KTsKKyAgICAgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnAtPmlucHV0X2NvbmQpOworICAgICAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcC0+cHJvZ3Jlc3NfY29uZCk7CisgICAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZwLT5vdXRwdXRfY29uZCk7CisgICAgICAgIGF2X3BhY2tldF91bnJlZigmcC0+YXZwa3QpOworICAgICAgICBhdl9mcmVlcCgmcC0+cmVsZWFzZWRfYnVmZmVycyk7CisKKyAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwLT5hdmN0eC0+cHJpdl9kYXRhKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwLT5hdmN0eC0+c2xpY2Vfb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyZWVwKCZwLT5hdmN0eC0+aW50ZXJuYWwpOworICAgICAgICBhdl9mcmVlcCgmcC0+YXZjdHgpOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZmY3R4LT50aHJlYWRzKTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmZjdHgtPmJ1ZmZlcl9tdXRleCk7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5pbnRlcm5hbC0+dGhyZWFkX2N0eCk7Cit9CisKK2ludCBmZl9mcmFtZV90aHJlYWRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IHRocmVhZF9jb3VudCA9IGF2Y3R4LT50aHJlYWRfY291bnQ7CisgICAgY29uc3QgQVZDb2RlYyAqY29kZWMgPSBhdmN0eC0+Y29kZWM7CisgICAgQVZDb2RlY0NvbnRleHQgKnNyYyA9IGF2Y3R4OworICAgIEZyYW1lVGhyZWFkQ29udGV4dCAqZmN0eDsKKyAgICBpbnQgaSwgZXJyID0gMDsKKworI2lmIEhBVkVfVzMyVEhSRUFEUworICAgIHczMnRocmVhZF9pbml0KCk7CisjZW5kaWYKKworICAgIGlmICghdGhyZWFkX2NvdW50KSB7CisgICAgICAgIGludCBuYl9jcHVzID0gYXZfY3B1X2NvdW50KCk7CisgICAgICAgIGlmICgoYXZjdHgtPmRlYnVnICYgKEZGX0RFQlVHX1ZJU19RUCB8IEZGX0RFQlVHX1ZJU19NQl9UWVBFKSkgfHwgYXZjdHgtPmRlYnVnX212KQorICAgICAgICAgICAgbmJfY3B1cyA9IDE7CisgICAgICAgIC8vIHVzZSBudW1iZXIgb2YgY29yZXMgKyAxIGFzIHRocmVhZCBjb3VudCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCisgICAgICAgIGlmIChuYl9jcHVzID4gMSkKKyAgICAgICAgICAgIHRocmVhZF9jb3VudCA9IGF2Y3R4LT50aHJlYWRfY291bnQgPSBGRk1JTihuYl9jcHVzICsgMSwgTUFYX0FVVE9fVEhSRUFEUyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocmVhZF9jb3VudCA9IGF2Y3R4LT50aHJlYWRfY291bnQgPSAxOworICAgIH0KKworICAgIGlmICh0aHJlYWRfY291bnQgPD0gMSkgeworICAgICAgICBhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXZjdHgtPmludGVybmFsLT50aHJlYWRfY3R4ID0gZmN0eCA9IGF2X21hbGxvY3ooc2l6ZW9mKEZyYW1lVGhyZWFkQ29udGV4dCkpOworCisgICAgZmN0eC0+dGhyZWFkcyA9IGF2X21hbGxvY3pfYXJyYXkodGhyZWFkX2NvdW50LCBzaXplb2YoUGVyVGhyZWFkQ29udGV4dCkpOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmZmN0eC0+YnVmZmVyX211dGV4LCBOVUxMKTsKKyAgICBmY3R4LT5kZWxheWluZyA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGhyZWFkX2NvdW50OyBpKyspIHsKKyAgICAgICAgQVZDb2RlY0NvbnRleHQgKmNvcHkgPSBhdl9tYWxsb2Moc2l6ZW9mKEFWQ29kZWNDb250ZXh0KSk7CisgICAgICAgIFBlclRocmVhZENvbnRleHQgKnAgID0gJmZjdHgtPnRocmVhZHNbaV07CisKKyAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZwLT5tdXRleCwgTlVMTCk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmcC0+cHJvZ3Jlc3NfbXV0ZXgsIE5VTEwpOworICAgICAgICBwdGhyZWFkX2NvbmRfaW5pdCgmcC0+aW5wdXRfY29uZCwgTlVMTCk7CisgICAgICAgIHB0aHJlYWRfY29uZF9pbml0KCZwLT5wcm9ncmVzc19jb25kLCBOVUxMKTsKKyAgICAgICAgcHRocmVhZF9jb25kX2luaXQoJnAtPm91dHB1dF9jb25kLCBOVUxMKTsKKworICAgICAgICBwLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgIGlmICghcC0+ZnJhbWUpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZjb3B5KTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBwLT5wYXJlbnQgPSBmY3R4OworICAgICAgICBwLT5hdmN0eCAgPSBjb3B5OworCisgICAgICAgIGlmICghY29weSkgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgICpjb3B5ID0gKnNyYzsKKworICAgICAgICBjb3B5LT5pbnRlcm5hbCA9IGF2X21hbGxvYyhzaXplb2YoQVZDb2RlY0ludGVybmFsKSk7CisgICAgICAgIGlmICghY29weS0+aW50ZXJuYWwpIHsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgKmNvcHktPmludGVybmFsID0gKnNyYy0+aW50ZXJuYWw7CisgICAgICAgIGNvcHktPmludGVybmFsLT50aHJlYWRfY3R4ID0gcDsKKyAgICAgICAgY29weS0+aW50ZXJuYWwtPnBrdCA9ICZwLT5hdnBrdDsKKworICAgICAgICBpZiAoIWkpIHsKKyAgICAgICAgICAgIHNyYyA9IGNvcHk7CisKKyAgICAgICAgICAgIGlmIChjb2RlYy0+aW5pdCkKKyAgICAgICAgICAgICAgICBlcnIgPSBjb2RlYy0+aW5pdChjb3B5KTsKKworICAgICAgICAgICAgdXBkYXRlX2NvbnRleHRfZnJvbV90aHJlYWQoYXZjdHgsIGNvcHksIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29weS0+cHJpdl9kYXRhID0gYXZfbWFsbG9jKGNvZGVjLT5wcml2X2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWNvcHktPnByaXZfZGF0YSkgeworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGNvcHktPnByaXZfZGF0YSwgc3JjLT5wcml2X2RhdGEsIGNvZGVjLT5wcml2X2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBjb3B5LT5pbnRlcm5hbC0+aXNfY29weSA9IDE7CisKKyAgICAgICAgICAgIGlmIChjb2RlYy0+aW5pdF90aHJlYWRfY29weSkKKyAgICAgICAgICAgICAgICBlcnIgPSBjb2RlYy0+aW5pdF90aHJlYWRfY29weShjb3B5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIpIGdvdG8gZXJyb3I7CisKKyAgICAgICAgZXJyID0gQVZFUlJPUihwdGhyZWFkX2NyZWF0ZSgmcC0+dGhyZWFkLCBOVUxMLCBmcmFtZV93b3JrZXJfdGhyZWFkLCBwKSk7CisgICAgICAgIHAtPnRocmVhZF9pbml0PSAhZXJyOworICAgICAgICBpZighcC0+dGhyZWFkX2luaXQpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBmZl9mcmFtZV90aHJlYWRfZnJlZShhdmN0eCwgaSsxKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgZmZfdGhyZWFkX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgaTsKKyAgICBGcmFtZVRocmVhZENvbnRleHQgKmZjdHggPSBhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHg7CisKKyAgICBpZiAoIWZjdHgpIHJldHVybjsKKworICAgIHBhcmtfZnJhbWVfd29ya2VyX3RocmVhZHMoZmN0eCwgYXZjdHgtPnRocmVhZF9jb3VudCk7CisgICAgaWYgKGZjdHgtPnByZXZfdGhyZWFkKSB7CisgICAgICAgIGlmIChmY3R4LT5wcmV2X3RocmVhZCAhPSAmZmN0eC0+dGhyZWFkc1swXSkKKyAgICAgICAgICAgIHVwZGF0ZV9jb250ZXh0X2Zyb21fdGhyZWFkKGZjdHgtPnRocmVhZHNbMF0uYXZjdHgsIGZjdHgtPnByZXZfdGhyZWFkLT5hdmN0eCwgMCk7CisgICAgfQorCisgICAgZmN0eC0+bmV4dF9kZWNvZGluZyA9IGZjdHgtPm5leHRfZmluaXNoZWQgPSAwOworICAgIGZjdHgtPmRlbGF5aW5nID0gMTsKKyAgICBmY3R4LT5wcmV2X3RocmVhZCA9IE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT50aHJlYWRfY291bnQ7IGkrKykgeworICAgICAgICBQZXJUaHJlYWRDb250ZXh0ICpwID0gJmZjdHgtPnRocmVhZHNbaV07CisgICAgICAgIC8vIE1ha2Ugc3VyZSBkZWNvZGUgZmx1c2ggY2FsbHMgd2l0aCBzaXplPTAgd29uJ3QgcmV0dXJuIG9sZCBmcmFtZXMKKyAgICAgICAgcC0+Z290X2ZyYW1lID0gMDsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYocC0+ZnJhbWUpOworCisgICAgICAgIHJlbGVhc2VfZGVsYXllZF9idWZmZXJzKHApOworCisgICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPmZsdXNoKQorICAgICAgICAgICAgYXZjdHgtPmNvZGVjLT5mbHVzaChwLT5hdmN0eCk7CisgICAgfQorfQorCitpbnQgZmZfdGhyZWFkX2Nhbl9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUGVyVGhyZWFkQ29udGV4dCAqcCA9IGF2Y3R4LT5pbnRlcm5hbC0+dGhyZWFkX2N0eDsKKyAgICBpZiAoKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUmRkZfVEhSRUFEX0ZSQU1FKSAmJiBwLT5zdGF0ZSAhPSBTVEFURV9TRVRUSU5HX1VQICYmCisgICAgICAgIChhdmN0eC0+Y29kZWMtPnVwZGF0ZV90aHJlYWRfY29udGV4dCB8fCAhVEhSRUFEX1NBRkVfQ0FMTEJBQ0tTKGF2Y3R4KSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRocmVhZF9nZXRfYnVmZmVyX2ludGVybmFsKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVGhyZWFkRnJhbWUgKmYsIGludCBmbGFncykKK3sKKyAgICBQZXJUaHJlYWRDb250ZXh0ICpwID0gYXZjdHgtPmludGVybmFsLT50aHJlYWRfY3R4OworICAgIGludCBlcnI7CisKKyAgICBmLT5vd25lciA9IGF2Y3R4OworCisgICAgZmZfaW5pdF9idWZmZXJfaW5mbyhhdmN0eCwgZi0+Zik7CisKKyAgICBpZiAoIShhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSkKKyAgICAgICAgcmV0dXJuIGZmX2dldF9idWZmZXIoYXZjdHgsIGYtPmYsIGZsYWdzKTsKKworICAgIGlmIChwLT5zdGF0ZSAhPSBTVEFURV9TRVRUSU5HX1VQICYmCisgICAgICAgIChhdmN0eC0+Y29kZWMtPnVwZGF0ZV90aHJlYWRfY29udGV4dCB8fCAhVEhSRUFEX1NBRkVfQ0FMTEJBQ0tTKGF2Y3R4KSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJnZXRfYnVmZmVyKCkgY2Fubm90IGJlIGNhbGxlZCBhZnRlciBmZl90aHJlYWRfZmluaXNoX3NldHVwKClcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5pbnRlcm5hbC0+YWxsb2NhdGVfcHJvZ3Jlc3MpIHsKKyAgICAgICAgaW50ICpwcm9ncmVzczsKKyAgICAgICAgZi0+cHJvZ3Jlc3MgPSBhdl9idWZmZXJfYWxsb2MoMiAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgaWYgKCFmLT5wcm9ncmVzcykgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBwcm9ncmVzcyA9IChpbnQqKWYtPnByb2dyZXNzLT5kYXRhOworCisgICAgICAgIHByb2dyZXNzWzBdID0gcHJvZ3Jlc3NbMV0gPSAtMTsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnAtPnBhcmVudC0+YnVmZmVyX211dGV4KTsKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBpZiAoYXZjdHgtPnRocmVhZF9zYWZlX2NhbGxiYWNrcyB8fCAoCisjaWYgRkZfQVBJX0dFVF9CVUZGRVIKKyAgICAgICAgIWF2Y3R4LT5nZXRfYnVmZmVyICYmCisjZW5kaWYKKyAgICAgICAgYXZjdHgtPmdldF9idWZmZXIyID09IGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyMikpIHsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICBlcnIgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmLT5mLCBmbGFncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wcm9ncmVzc19tdXRleCk7CisgICAgICAgIHAtPnJlcXVlc3RlZF9mcmFtZSA9IGYtPmY7CisgICAgICAgIHAtPnJlcXVlc3RlZF9mbGFncyA9IGZsYWdzOworICAgICAgICBwLT5zdGF0ZSA9IFNUQVRFX0dFVF9CVUZGRVI7CisgICAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnAtPnByb2dyZXNzX2NvbmQpOworCisgICAgICAgIHdoaWxlIChwLT5zdGF0ZSAhPSBTVEFURV9TRVRUSU5HX1VQKQorICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnAtPnByb2dyZXNzX2NvbmQsICZwLT5wcm9ncmVzc19tdXRleCk7CisKKyAgICAgICAgZXJyID0gcC0+cmVzdWx0OworCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5wcm9ncmVzc19tdXRleCk7CisKKyAgICB9CisgICAgaWYgKCFUSFJFQURfU0FGRV9DQUxMQkFDS1MoYXZjdHgpICYmICFhdmN0eC0+Y29kZWMtPnVwZGF0ZV90aHJlYWRfY29udGV4dCkKKyAgICAgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChhdmN0eCk7CisKKyAgICBpZiAoZXJyKQorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmYtPnByb2dyZXNzKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5wYXJlbnQtPmJ1ZmZlcl9tdXRleCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCitlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfdGhyZWFkX2dldF9mb3JtYXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKmZtdCkKK3sKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcmVzOworICAgIFBlclRocmVhZENvbnRleHQgKnAgPSBhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHg7CisgICAgaWYgKCEoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkgfHwgYXZjdHgtPnRocmVhZF9zYWZlX2NhbGxiYWNrcyB8fAorICAgICAgICBhdmN0eC0+Z2V0X2Zvcm1hdCA9PSBhdmNvZGVjX2RlZmF1bHRfZ2V0X2Zvcm1hdCkKKyAgICAgICAgcmV0dXJuIGZmX2dldF9mb3JtYXQoYXZjdHgsIGZtdCk7CisgICAgaWYgKHAtPnN0YXRlICE9IFNUQVRFX1NFVFRJTkdfVVApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJnZXRfZm9ybWF0KCkgY2Fubm90IGJlIGNhbGxlZCBhZnRlciBmZl90aHJlYWRfZmluaXNoX3NldHVwKClcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXgpOworICAgIHAtPmF2YWlsYWJsZV9mb3JtYXRzID0gZm10OworICAgIHAtPnN0YXRlID0gU1RBVEVfR0VUX0ZPUk1BVDsKKyAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZwLT5wcm9ncmVzc19jb25kKTsKKworICAgIHdoaWxlIChwLT5zdGF0ZSAhPSBTVEFURV9TRVRUSU5HX1VQKQorICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcC0+cHJvZ3Jlc3NfY29uZCwgJnAtPnByb2dyZXNzX211dGV4KTsKKworICAgIHJlcyA9IHAtPnJlc3VsdF9mb3JtYXQ7CisKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXgpOworCisgICAgcmV0dXJuIHJlczsKK30KKworaW50IGZmX3RocmVhZF9nZXRfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVGhyZWFkRnJhbWUgKmYsIGludCBmbGFncykKK3sKKyAgICBpbnQgcmV0ID0gdGhyZWFkX2dldF9idWZmZXJfaW50ZXJuYWwoYXZjdHgsIGYsIGZsYWdzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ0aHJlYWRfZ2V0X2J1ZmZlcigpIGZhaWxlZFxuIik7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBUaHJlYWRGcmFtZSAqZikKK3sKKyAgICBQZXJUaHJlYWRDb250ZXh0ICpwID0gYXZjdHgtPmludGVybmFsLT50aHJlYWRfY3R4OworICAgIEZyYW1lVGhyZWFkQ29udGV4dCAqZmN0eDsKKyAgICBBVkZyYW1lICpkc3QsICp0bXA7CitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgaW50IGNhbl9kaXJlY3RfZnJlZSA9ICEoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnRocmVhZF9zYWZlX2NhbGxiYWNrcyAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoCisjaWYgRkZfQVBJX0dFVF9CVUZGRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICFhdmN0eC0+Z2V0X2J1ZmZlciAmJgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Z2V0X2J1ZmZlcjIgPT0gYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXIyKTsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisgICAgaWYgKCFmLT5mIHx8ICFmLT5mLT5idWZbMF0pCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19CVUZGRVJTKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInRocmVhZF9yZWxlYXNlX2J1ZmZlciBjYWxsZWQgb24gcGljICVwXG4iLCBmKTsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmZi0+cHJvZ3Jlc3MpOworICAgIGYtPm93bmVyICAgID0gTlVMTDsKKworICAgIGlmIChjYW5fZGlyZWN0X2ZyZWUpIHsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoZi0+Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmY3R4ID0gcC0+cGFyZW50OworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZmN0eC0+YnVmZmVyX211dGV4KTsKKworICAgIGlmIChwLT5udW1fcmVsZWFzZWRfYnVmZmVycyArIDEgPj0gSU5UX01BWCAvIHNpemVvZigqcC0+cmVsZWFzZWRfYnVmZmVycykpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB0bXAgPSBhdl9mYXN0X3JlYWxsb2MocC0+cmVsZWFzZWRfYnVmZmVycywgJnAtPnJlbGVhc2VkX2J1ZmZlcnNfYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAocC0+bnVtX3JlbGVhc2VkX2J1ZmZlcnMgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcC0+cmVsZWFzZWRfYnVmZmVycykpOworICAgIGlmICghdG1wKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcC0+cmVsZWFzZWRfYnVmZmVycyA9IHRtcDsKKworICAgIGRzdCA9ICZwLT5yZWxlYXNlZF9idWZmZXJzW3AtPm51bV9yZWxlYXNlZF9idWZmZXJzXTsKKyAgICBhdl9mcmFtZV9tb3ZlX3JlZihkc3QsIGYtPmYpOworCisgICAgcC0+bnVtX3JlbGVhc2VkX2J1ZmZlcnMrKzsKKworZmFpbDoKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZmN0eC0+YnVmZmVyX211dGV4KTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3B0aHJlYWRfaW50ZXJuYWwuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3B0aHJlYWRfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJmMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHRocmVhZF9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1BUSFJFQURfSU5URVJOQUxfSAorI2RlZmluZSBBVkNPREVDX1BUSFJFQURfSU5URVJOQUxfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCisvKiBIMjY0IHNsaWNlIHRocmVhZGluZyBzZWVtcyB0byBiZSBidWdneSB3aXRoIG1vcmUgdGhhbiAxNiB0aHJlYWRzLAorICogbGltaXQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIDE2IGZvciBhdXRvbWF0aWMgZGV0ZWN0aW9uICovCisjZGVmaW5lIE1BWF9BVVRPX1RIUkVBRFMgMTYKKworaW50IGZmX3NsaWNlX3RocmVhZF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cit2b2lkIGZmX3NsaWNlX3RocmVhZF9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK2ludCBmZl9mcmFtZV90aHJlYWRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl9mcmFtZV90aHJlYWRfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCB0aHJlYWRfY291bnQpOworCisjZW5kaWYgLy8gQVZDT0RFQ19QVEhSRUFEX0lOVEVSTkFMX0gKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3B0aHJlYWRfc2xpY2UuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3B0aHJlYWRfc2xpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTQ4ZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcHRocmVhZF9zbGljZS5jCkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNsaWNlIG11bHRpdGhyZWFkaW5nIHN1cHBvcnQgZnVuY3Rpb25zCisgKiBAc2VlIGRvYy9tdWx0aXRocmVhZGluZy50eHQKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX1BUSFJFQURTCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VsaWYgSEFWRV9XMzJUSFJFQURTCisjaW5jbHVkZSAiY29tcGF0L3czMnB0aHJlYWRzLmgiCisjZWxpZiBIQVZFX09TMlRIUkVBRFMKKyNpbmNsdWRlICJjb21wYXQvb3MydGhyZWFkcy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwdGhyZWFkX2ludGVybmFsLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKwordHlwZWRlZiBpbnQgKGFjdGlvbl9mdW5jKShBVkNvZGVjQ29udGV4dCAqYywgdm9pZCAqYXJnKTsKK3R5cGVkZWYgaW50IChhY3Rpb25fZnVuYzIpKEFWQ29kZWNDb250ZXh0ICpjLCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IHRocmVhZG5yKTsKKwordHlwZWRlZiBzdHJ1Y3QgU2xpY2VUaHJlYWRDb250ZXh0IHsKKyAgICBwdGhyZWFkX3QgKndvcmtlcnM7CisgICAgYWN0aW9uX2Z1bmMgKmZ1bmM7CisgICAgYWN0aW9uX2Z1bmMyICpmdW5jMjsKKyAgICB2b2lkICphcmdzOworICAgIGludCAqcmV0czsKKyAgICBpbnQgcmV0c19jb3VudDsKKyAgICBpbnQgam9iX2NvdW50OworICAgIGludCBqb2Jfc2l6ZTsKKworICAgIHB0aHJlYWRfY29uZF90IGxhc3Rfam9iX2NvbmQ7CisgICAgcHRocmVhZF9jb25kX3QgY3VycmVudF9qb2JfY29uZDsKKyAgICBwdGhyZWFkX211dGV4X3QgY3VycmVudF9qb2JfbG9jazsKKyAgICB1bnNpZ25lZCBjdXJyZW50X2V4ZWN1dGU7CisgICAgaW50IGN1cnJlbnRfam9iOworICAgIGludCBkb25lOworCisgICAgaW50ICplbnRyaWVzOworICAgIGludCBlbnRyaWVzX2NvdW50OworICAgIGludCB0aHJlYWRfY291bnQ7CisgICAgcHRocmVhZF9jb25kX3QgKnByb2dyZXNzX2NvbmQ7CisgICAgcHRocmVhZF9tdXRleF90ICpwcm9ncmVzc19tdXRleDsKK30gU2xpY2VUaHJlYWRDb250ZXh0OworCitzdGF0aWMgdm9pZCogYXR0cmlidXRlX2FsaWduX2FyZyB3b3JrZXIodm9pZCAqdikKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSB2OworICAgIFNsaWNlVGhyZWFkQ29udGV4dCAqYyA9IGF2Y3R4LT5pbnRlcm5hbC0+dGhyZWFkX2N0eDsKKyAgICB1bnNpZ25lZCBsYXN0X2V4ZWN1dGUgPSAwOworICAgIGludCBvdXJfam9iID0gYy0+am9iX2NvdW50OworICAgIGludCB0aHJlYWRfY291bnQgPSBhdmN0eC0+dGhyZWFkX2NvdW50OworICAgIGludCBzZWxmX2lkOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjLT5jdXJyZW50X2pvYl9sb2NrKTsKKyAgICBzZWxmX2lkID0gYy0+Y3VycmVudF9qb2IrKzsKKyAgICBmb3IgKDs7KXsKKyAgICAgICAgd2hpbGUgKG91cl9qb2IgPj0gYy0+am9iX2NvdW50KSB7CisgICAgICAgICAgICBpZiAoYy0+Y3VycmVudF9qb2IgPT0gdGhyZWFkX2NvdW50ICsgYy0+am9iX2NvdW50KQorICAgICAgICAgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmMtPmxhc3Rfam9iX2NvbmQpOworCisgICAgICAgICAgICB3aGlsZSAobGFzdF9leGVjdXRlID09IGMtPmN1cnJlbnRfZXhlY3V0ZSAmJiAhYy0+ZG9uZSkKKyAgICAgICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmYy0+Y3VycmVudF9qb2JfY29uZCwgJmMtPmN1cnJlbnRfam9iX2xvY2spOworICAgICAgICAgICAgbGFzdF9leGVjdXRlID0gYy0+Y3VycmVudF9leGVjdXRlOworICAgICAgICAgICAgb3VyX2pvYiA9IHNlbGZfaWQ7CisKKyAgICAgICAgICAgIGlmIChjLT5kb25lKSB7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjLT5jdXJyZW50X2pvYl9sb2NrKTsKKworICAgICAgICBjLT5yZXRzW291cl9qb2IlYy0+cmV0c19jb3VudF0gPSBjLT5mdW5jID8gYy0+ZnVuYyhhdmN0eCwgKGNoYXIqKWMtPmFyZ3MgKyBvdXJfam9iKmMtPmpvYl9zaXplKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmZ1bmMyKGF2Y3R4LCBjLT5hcmdzLCBvdXJfam9iLCBzZWxmX2lkKTsKKworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOworICAgICAgICBvdXJfam9iID0gYy0+Y3VycmVudF9qb2IrKzsKKyAgICB9Cit9CisKK3ZvaWQgZmZfc2xpY2VfdGhyZWFkX2ZyZWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNsaWNlVGhyZWFkQ29udGV4dCAqYyA9IGF2Y3R4LT5pbnRlcm5hbC0+dGhyZWFkX2N0eDsKKyAgICBpbnQgaTsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7CisgICAgYy0+ZG9uZSA9IDE7CisgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmYy0+Y3VycmVudF9qb2JfY29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOworCisgICAgZm9yIChpPTA7IGk8YXZjdHgtPnRocmVhZF9jb3VudDsgaSsrKQorICAgICAgICAgcHRocmVhZF9qb2luKGMtPndvcmtlcnNbaV0sIE5VTEwpOworCisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZjLT5jdXJyZW50X2pvYl9sb2NrKTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmYy0+Y3VycmVudF9qb2JfY29uZCk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmMtPmxhc3Rfam9iX2NvbmQpOworICAgIGF2X2ZyZWVwKCZjLT53b3JrZXJzKTsKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmludGVybmFsLT50aHJlYWRfY3R4KTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCB0aHJlYWRfcGFya193b3JrZXJzKFNsaWNlVGhyZWFkQ29udGV4dCAqYywgaW50IHRocmVhZF9jb3VudCkKK3sKKyAgICB3aGlsZSAoYy0+Y3VycmVudF9qb2IgIT0gdGhyZWFkX2NvdW50ICsgYy0+am9iX2NvdW50KQorICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmYy0+bGFzdF9qb2JfY29uZCwgJmMtPmN1cnJlbnRfam9iX2xvY2spOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjLT5jdXJyZW50X2pvYl9sb2NrKTsKK30KKworc3RhdGljIGludCB0aHJlYWRfZXhlY3V0ZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGFjdGlvbl9mdW5jKiBmdW5jLCB2b2lkICphcmcsIGludCAqcmV0LCBpbnQgam9iX2NvdW50LCBpbnQgam9iX3NpemUpCit7CisgICAgU2xpY2VUaHJlYWRDb250ZXh0ICpjID0gYXZjdHgtPmludGVybmFsLT50aHJlYWRfY3R4OworICAgIGludCBkdW1teV9yZXQ7CisKKyAgICBpZiAoIShhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlJkZGX1RIUkVBRF9TTElDRSkgfHwgYXZjdHgtPnRocmVhZF9jb3VudCA8PSAxKQorICAgICAgICByZXR1cm4gYXZjb2RlY19kZWZhdWx0X2V4ZWN1dGUoYXZjdHgsIGZ1bmMsIGFyZywgcmV0LCBqb2JfY291bnQsIGpvYl9zaXplKTsKKworICAgIGlmIChqb2JfY291bnQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOworCisgICAgYy0+Y3VycmVudF9qb2IgPSBhdmN0eC0+dGhyZWFkX2NvdW50OworICAgIGMtPmpvYl9jb3VudCA9IGpvYl9jb3VudDsKKyAgICBjLT5qb2Jfc2l6ZSA9IGpvYl9zaXplOworICAgIGMtPmFyZ3MgPSBhcmc7CisgICAgYy0+ZnVuYyA9IGZ1bmM7CisgICAgaWYgKHJldCkgeworICAgICAgICBjLT5yZXRzID0gcmV0OworICAgICAgICBjLT5yZXRzX2NvdW50ID0gam9iX2NvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIGMtPnJldHMgPSAmZHVtbXlfcmV0OworICAgICAgICBjLT5yZXRzX2NvdW50ID0gMTsKKyAgICB9CisgICAgYy0+Y3VycmVudF9leGVjdXRlKys7CisgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmYy0+Y3VycmVudF9qb2JfY29uZCk7CisKKyAgICB0aHJlYWRfcGFya193b3JrZXJzKGMsIGF2Y3R4LT50aHJlYWRfY291bnQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGhyZWFkX2V4ZWN1dGUyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgYWN0aW9uX2Z1bmMyKiBmdW5jMiwgdm9pZCAqYXJnLCBpbnQgKnJldCwgaW50IGpvYl9jb3VudCkKK3sKKyAgICBTbGljZVRocmVhZENvbnRleHQgKmMgPSBhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHg7CisgICAgYy0+ZnVuYzIgPSBmdW5jMjsKKyAgICByZXR1cm4gdGhyZWFkX2V4ZWN1dGUoYXZjdHgsIE5VTEwsIGFyZywgcmV0LCBqb2JfY291bnQsIDApOworfQorCitpbnQgZmZfc2xpY2VfdGhyZWFkX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBpOworICAgIFNsaWNlVGhyZWFkQ29udGV4dCAqYzsKKyAgICBpbnQgdGhyZWFkX2NvdW50ID0gYXZjdHgtPnRocmVhZF9jb3VudDsKKworI2lmIEhBVkVfVzMyVEhSRUFEUworICAgIHczMnRocmVhZF9pbml0KCk7CisjZW5kaWYKKworICAgIGlmICghdGhyZWFkX2NvdW50KSB7CisgICAgICAgIGludCBuYl9jcHVzID0gYXZfY3B1X2NvdW50KCk7CisgICAgICAgIGlmICAoYXZjdHgtPmhlaWdodCkKKyAgICAgICAgICAgIG5iX2NwdXMgPSBGRk1JTihuYl9jcHVzLCAoYXZjdHgtPmhlaWdodCsxNSkvMTYpOworICAgICAgICAvLyB1c2UgbnVtYmVyIG9mIGNvcmVzICsgMSBhcyB0aHJlYWQgY291bnQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZQorICAgICAgICBpZiAobmJfY3B1cyA+IDEpCisgICAgICAgICAgICB0aHJlYWRfY291bnQgPSBhdmN0eC0+dGhyZWFkX2NvdW50ID0gRkZNSU4obmJfY3B1cyArIDEsIE1BWF9BVVRPX1RIUkVBRFMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJlYWRfY291bnQgPSBhdmN0eC0+dGhyZWFkX2NvdW50ID0gMTsKKyAgICB9CisKKyAgICBpZiAodGhyZWFkX2NvdW50IDw9IDEpIHsKKyAgICAgICAgYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGMgPSBhdl9tYWxsb2N6KHNpemVvZihTbGljZVRocmVhZENvbnRleHQpKTsKKyAgICBpZiAoIWMpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGMtPndvcmtlcnMgPSBhdl9tYWxsb2N6X2FycmF5KHRocmVhZF9jb3VudCwgc2l6ZW9mKHB0aHJlYWRfdCkpOworICAgIGlmICghYy0+d29ya2VycykgeworICAgICAgICBhdl9mcmVlKGMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYXZjdHgtPmludGVybmFsLT50aHJlYWRfY3R4ID0gYzsKKyAgICBjLT5jdXJyZW50X2pvYiA9IDA7CisgICAgYy0+am9iX2NvdW50ID0gMDsKKyAgICBjLT5qb2Jfc2l6ZSA9IDA7CisgICAgYy0+ZG9uZSA9IDA7CisgICAgcHRocmVhZF9jb25kX2luaXQoJmMtPmN1cnJlbnRfam9iX2NvbmQsIE5VTEwpOworICAgIHB0aHJlYWRfY29uZF9pbml0KCZjLT5sYXN0X2pvYl9jb25kLCBOVUxMKTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmMtPmN1cnJlbnRfam9iX2xvY2ssIE5VTEwpOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7CisgICAgZm9yIChpPTA7IGk8dGhyZWFkX2NvdW50OyBpKyspIHsKKyAgICAgICAgaWYocHRocmVhZF9jcmVhdGUoJmMtPndvcmtlcnNbaV0sIE5VTEwsIHdvcmtlciwgYXZjdHgpKSB7CisgICAgICAgICAgIGF2Y3R4LT50aHJlYWRfY291bnQgPSBpOworICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7CisgICAgICAgICAgIGZmX3RocmVhZF9mcmVlKGF2Y3R4KTsKKyAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgdGhyZWFkX3Bhcmtfd29ya2VycyhjLCB0aHJlYWRfY291bnQpOworCisgICAgYXZjdHgtPmV4ZWN1dGUgPSB0aHJlYWRfZXhlY3V0ZTsKKyAgICBhdmN0eC0+ZXhlY3V0ZTIgPSB0aHJlYWRfZXhlY3V0ZTI7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgZmllbGQsIGludCB0aHJlYWQsIGludCBuKQoreworICAgIFNsaWNlVGhyZWFkQ29udGV4dCAqcCA9IGF2Y3R4LT5pbnRlcm5hbC0+dGhyZWFkX2N0eDsKKyAgICBpbnQgKmVudHJpZXMgPSBwLT5lbnRyaWVzOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wcm9ncmVzc19tdXRleFt0aHJlYWRdKTsKKyAgICBlbnRyaWVzW2ZpZWxkXSArPW47CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcC0+cHJvZ3Jlc3NfY29uZFt0aHJlYWRdKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXhbdGhyZWFkXSk7Cit9CisKK3ZvaWQgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBmaWVsZCwgaW50IHRocmVhZCwgaW50IHNoaWZ0KQoreworICAgIFNsaWNlVGhyZWFkQ29udGV4dCAqcCAgPSBhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHg7CisgICAgaW50ICplbnRyaWVzICAgICAgPSBwLT5lbnRyaWVzOworCisgICAgaWYgKCFlbnRyaWVzIHx8ICFmaWVsZCkgcmV0dXJuOworCisgICAgdGhyZWFkID0gdGhyZWFkID8gdGhyZWFkIC0gMSA6IHAtPnRocmVhZF9jb3VudCAtIDE7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnAtPnByb2dyZXNzX211dGV4W3RocmVhZF0pOworICAgIHdoaWxlICgoZW50cmllc1tmaWVsZCAtIDFdIC0gZW50cmllc1tmaWVsZF0pIDwgc2hpZnQpeworICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcC0+cHJvZ3Jlc3NfY29uZFt0aHJlYWRdLCAmcC0+cHJvZ3Jlc3NfbXV0ZXhbdGhyZWFkXSk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5wcm9ncmVzc19tdXRleFt0aHJlYWRdKTsKK30KKworaW50IGZmX2FsbG9jX2VudHJpZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgY291bnQpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9TTElDRSkgIHsKKyAgICAgICAgU2xpY2VUaHJlYWRDb250ZXh0ICpwID0gYXZjdHgtPmludGVybmFsLT50aHJlYWRfY3R4OworICAgICAgICBwLT50aHJlYWRfY291bnQgID0gYXZjdHgtPnRocmVhZF9jb3VudDsKKyAgICAgICAgcC0+ZW50cmllcyAgICAgICA9IGF2X21hbGxvY3pfYXJyYXkoY291bnQsIHNpemVvZihpbnQpKTsKKworICAgICAgICBwLT5wcm9ncmVzc19tdXRleCA9IGF2X21hbGxvY19hcnJheShwLT50aHJlYWRfY291bnQsIHNpemVvZihwdGhyZWFkX211dGV4X3QpKTsKKyAgICAgICAgcC0+cHJvZ3Jlc3NfY29uZCAgPSBhdl9tYWxsb2NfYXJyYXkocC0+dGhyZWFkX2NvdW50LCBzaXplb2YocHRocmVhZF9jb25kX3QpKTsKKworICAgICAgICBpZiAoIXAtPmVudHJpZXMgfHwgIXAtPnByb2dyZXNzX211dGV4IHx8ICFwLT5wcm9ncmVzc19jb25kKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcC0+ZW50cmllcyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmcC0+cHJvZ3Jlc3NfbXV0ZXgpOworICAgICAgICAgICAgYXZfZnJlZXAoJnAtPnByb2dyZXNzX2NvbmQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBwLT5lbnRyaWVzX2NvdW50ICA9IGNvdW50OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwLT50aHJlYWRfY291bnQ7IGkrKykgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZwLT5wcm9ncmVzc19tdXRleFtpXSwgTlVMTCk7CisgICAgICAgICAgICBwdGhyZWFkX2NvbmRfaW5pdCgmcC0+cHJvZ3Jlc3NfY29uZFtpXSwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl9yZXNldF9lbnRyaWVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTbGljZVRocmVhZENvbnRleHQgKnAgPSBhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHg7CisgICAgbWVtc2V0KHAtPmVudHJpZXMsIDAsIHAtPmVudHJpZXNfY291bnQgKiBzaXplb2YoaW50KSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9wdHguYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3B0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjM2FiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9wdHguYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogVi5GbGFzaCBQVFggKC5wdHgpIGltYWdlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJdm8gdmFuIFBvb3J0ZW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgcHR4X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkgeworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBhdnBrdC0+ZGF0YSArIGF2cGt0LT5zaXplOworICAgIEFWRnJhbWUgKiBjb25zdCBwID0gZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB3LCBoLCB5LCBzdHJpZGUsIGJ5dGVzX3Blcl9waXhlbDsKKyAgICBpbnQgcmV0OworICAgIHVpbnQ4X3QgKnB0cjsKKworICAgIGlmIChidWZfZW5kIC0gYnVmIDwgMTQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIG9mZnNldCAgICAgICAgICA9IEFWX1JMMTYoYnVmKTsKKyAgICB3ICAgICAgICAgICAgICAgPSBBVl9STDE2KGJ1Zis4KTsKKyAgICBoICAgICAgICAgICAgICAgPSBBVl9STDE2KGJ1ZisxMCk7CisgICAgYnl0ZXNfcGVyX3BpeGVsID0gQVZfUkwxNihidWYrMTIpID4+IDM7CisKKyAgICBpZiAoYnl0ZXNfcGVyX3BpeGVsICE9IDIpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiSW1hZ2UgZm9ybWF0IG5vdCBSR0IxNSIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjU1NUxFOworCisgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPCBvZmZzZXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChvZmZzZXQgIT0gMHgyYykKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAib2Zmc2V0ICE9IDB4MmMiKTsKKworICAgIGJ1ZiArPSBvZmZzZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCB3LCBoKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICBwdHIgICAgPSBwLT5kYXRhWzBdOworICAgIHN0cmlkZSA9IHAtPmxpbmVzaXplWzBdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGggJiYgYnVmX2VuZCAtIGJ1ZiA+PSB3ICogYnl0ZXNfcGVyX3BpeGVsOyB5KyspIHsKKyAgICAgICAgbWVtY3B5KHB0ciwgYnVmLCB3KmJ5dGVzX3Blcl9waXhlbCk7CisgICAgICAgIHB0ciArPSBzdHJpZGU7CisgICAgICAgIGJ1ZiArPSB3KmJ5dGVzX3Blcl9waXhlbDsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIGlmICh5IDwgaCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiaW5jb21wbGV0ZSBwYWNrZXRcbiIpOworICAgICAgICByZXR1cm4gYXZwa3QtPnNpemU7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldCArIHcqaCpieXRlc19wZXJfcGl4ZWw7Cit9CisKK0FWQ29kZWMgZmZfcHR4X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInB0eCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlYuRmxhc2ggUFRYIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BUWCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBwdHhfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcHV0X2JpdHMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3B1dF9iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1OGNhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3B1dF9iaXRzLmgKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogYml0c3RyZWFtIHdyaXRlciBBUEkKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUFVUX0JJVFNfSAorI2RlZmluZSBBVkNPREVDX1BVVF9CSVRTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorCit0eXBlZGVmIHN0cnVjdCBQdXRCaXRDb250ZXh0IHsKKyAgICB1aW50MzJfdCBiaXRfYnVmOworICAgIGludCBiaXRfbGVmdDsKKyAgICB1aW50OF90ICpidWYsICpidWZfcHRyLCAqYnVmX2VuZDsKKyAgICBpbnQgc2l6ZV9pbl9iaXRzOworfSBQdXRCaXRDb250ZXh0OworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIFB1dEJpdENvbnRleHQgcy4KKyAqCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgd2hlcmUgdG8gcHV0IGJpdHMKKyAqIEBwYXJhbSBidWZmZXJfc2l6ZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiBidWZmZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGluaXRfcHV0X2JpdHMoUHV0Qml0Q29udGV4dCAqcywgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplKQoreworICAgIGlmIChidWZmZXJfc2l6ZSA8IDApIHsKKyAgICAgICAgYnVmZmVyX3NpemUgPSAwOworICAgICAgICBidWZmZXIgICAgICA9IE5VTEw7CisgICAgfQorCisgICAgcy0+c2l6ZV9pbl9iaXRzID0gOCAqIGJ1ZmZlcl9zaXplOworICAgIHMtPmJ1ZiAgICAgICAgICA9IGJ1ZmZlcjsKKyAgICBzLT5idWZfZW5kICAgICAgPSBzLT5idWYgKyBidWZmZXJfc2l6ZTsKKyAgICBzLT5idWZfcHRyICAgICAgPSBzLT5idWY7CisgICAgcy0+Yml0X2xlZnQgICAgID0gMzI7CisgICAgcy0+Yml0X2J1ZiAgICAgID0gMDsKK30KKworLyoqCisgKiBSZWJhc2UgdGhlIGJpdCB3cml0ZXIgb250byBhIHJlYWxsb2NhdGVkIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgd2hlcmUgdG8gcHV0IGJpdHMKKyAqIEBwYXJhbSBidWZmZXJfc2l6ZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiBidWZmZXIsCisgKiAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBsYXJnZXIgdGhhbiB0aGUgcHJldmlvdXMgc2l6ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmViYXNlX3B1dF9iaXRzKFB1dEJpdENvbnRleHQgKnMsIHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplKQoreworICAgIGF2X2Fzc2VydDAoOCpidWZmZXJfc2l6ZSA+IHMtPnNpemVfaW5fYml0cyk7CisKKyAgICBzLT5idWZfZW5kID0gYnVmZmVyICsgYnVmZmVyX3NpemU7CisgICAgcy0+YnVmX3B0ciA9IGJ1ZmZlciArIChzLT5idWZfcHRyIC0gcy0+YnVmKTsKKyAgICBzLT5idWYgICAgID0gYnVmZmVyOworICAgIHMtPnNpemVfaW5fYml0cyA9IDggKiBidWZmZXJfc2l6ZTsKK30KKworLyoqCisgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0cyB3cml0dGVuIHRvIHRoZSBiaXRzdHJlYW0uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB1dF9iaXRzX2NvdW50KFB1dEJpdENvbnRleHQgKnMpCit7CisgICAgcmV0dXJuIChzLT5idWZfcHRyIC0gcy0+YnVmKSAqIDggKyAzMiAtIHMtPmJpdF9sZWZ0OworfQorCisvKioKKyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSBpbiB0aGUgYml0c3RyZWFtLgorICovCitzdGF0aWMgaW5saW5lIGludCBwdXRfYml0c19sZWZ0KFB1dEJpdENvbnRleHQqIHMpCit7CisgICAgcmV0dXJuIChzLT5idWZfZW5kIC0gcy0+YnVmX3B0cikgKiA4IC0gMzIgKyBzLT5iaXRfbGVmdDsKK30KKworLyoqCisgKiBQYWQgdGhlIGVuZCBvZiB0aGUgb3V0cHV0IHN0cmVhbSB3aXRoIHplcm9zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfcHV0X2JpdHMoUHV0Qml0Q29udGV4dCAqcykKK3sKKyNpZm5kZWYgQklUU1RSRUFNX1dSSVRFUl9MRQorICAgIGlmIChzLT5iaXRfbGVmdCA8IDMyKQorICAgICAgICBzLT5iaXRfYnVmIDw8PSBzLT5iaXRfbGVmdDsKKyNlbmRpZgorICAgIHdoaWxlIChzLT5iaXRfbGVmdCA8IDMyKSB7CisgICAgICAgIC8qIFhYWDogc2hvdWxkIHRlc3QgZW5kIG9mIGJ1ZmZlciAqLworI2lmZGVmIEJJVFNUUkVBTV9XUklURVJfTEUKKyAgICAgICAgKnMtPmJ1Zl9wdHIrKyA9IHMtPmJpdF9idWY7CisgICAgICAgIHMtPmJpdF9idWYgID4+PSA4OworI2Vsc2UKKyAgICAgICAgKnMtPmJ1Zl9wdHIrKyA9IHMtPmJpdF9idWYgPj4gMjQ7CisgICAgICAgIHMtPmJpdF9idWYgIDw8PSA4OworI2VuZGlmCisgICAgICAgIHMtPmJpdF9sZWZ0ICArPSA4OworICAgIH0KKyAgICBzLT5iaXRfbGVmdCA9IDMyOworICAgIHMtPmJpdF9idWYgID0gMDsKK30KKworI2lmZGVmIEJJVFNUUkVBTV9XUklURVJfTEUKKyNkZWZpbmUgYXZwcml2X2FsaWduX3B1dF9iaXRzIGFsaWduX3B1dF9iaXRzX3Vuc3VwcG9ydGVkX2hlcmUKKyNkZWZpbmUgYXZwcml2X3B1dF9zdHJpbmcgZmZfcHV0X3N0cmluZ191bnN1cHBvcnRlZF9oZXJlCisjZGVmaW5lIGF2cHJpdl9jb3B5X2JpdHMgYXZwcml2X2NvcHlfYml0c191bnN1cHBvcnRlZF9oZXJlCisjZWxzZQorLyoqCisgKiBQYWQgdGhlIGJpdHN0cmVhbSB3aXRoIHplcm9zIHVwIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkuCisgKi8KK3ZvaWQgYXZwcml2X2FsaWduX3B1dF9iaXRzKFB1dEJpdENvbnRleHQgKnMpOworCisvKioKKyAqIFB1dCB0aGUgc3RyaW5nIHN0cmluZyBpbiB0aGUgYml0c3RyZWFtLgorICoKKyAqIEBwYXJhbSB0ZXJtaW5hdGVfc3RyaW5nIDAtdGVybWluYXRlcyB0aGUgd3JpdHRlbiBzdHJpbmcgaWYgdmFsdWUgaXMgMQorICovCit2b2lkIGF2cHJpdl9wdXRfc3RyaW5nKFB1dEJpdENvbnRleHQgKnBiLCBjb25zdCBjaGFyICpzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXJtaW5hdGVfc3RyaW5nKTsKKworLyoqCisgKiBDb3B5IHRoZSBjb250ZW50IG9mIHNyYyB0byB0aGUgYml0c3RyZWFtLgorICoKKyAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBiaXRzIG9mIHNyYyB0byBjb3B5CisgKi8KK3ZvaWQgYXZwcml2X2NvcHlfYml0cyhQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgbGVuZ3RoKTsKKyNlbmRpZgorCisvKioKKyAqIFdyaXRlIHVwIHRvIDMxIGJpdHMgaW50byBhIGJpdHN0cmVhbS4KKyAqIFVzZSBwdXRfYml0czMyIHRvIHdyaXRlIDMyIGJpdHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfYml0cyhQdXRCaXRDb250ZXh0ICpzLCBpbnQgbiwgdW5zaWduZWQgaW50IHZhbHVlKQoreworICAgIHVuc2lnbmVkIGludCBiaXRfYnVmOworICAgIGludCBiaXRfbGVmdDsKKworICAgIGF2X2Fzc2VydDIobiA8PSAzMSAmJiB2YWx1ZSA8ICgxVSA8PCBuKSk7CisKKyAgICBiaXRfYnVmICA9IHMtPmJpdF9idWY7CisgICAgYml0X2xlZnQgPSBzLT5iaXRfbGVmdDsKKworICAgIC8qIFhYWDogb3B0aW1pemUgKi8KKyNpZmRlZiBCSVRTVFJFQU1fV1JJVEVSX0xFCisgICAgYml0X2J1ZiB8PSB2YWx1ZSA8PCAoMzIgLSBiaXRfbGVmdCk7CisgICAgaWYgKG4gPj0gYml0X2xlZnQpIHsKKyAgICAgICAgYXZfYXNzZXJ0MihzLT5idWZfcHRyKzM8cy0+YnVmX2VuZCk7CisgICAgICAgIEFWX1dMMzIocy0+YnVmX3B0ciwgYml0X2J1Zik7CisgICAgICAgIHMtPmJ1Zl9wdHIgKz0gNDsKKyAgICAgICAgYml0X2J1ZiAgICAgPSAoYml0X2xlZnQgPT0gMzIpID8gMCA6IHZhbHVlID4+IGJpdF9sZWZ0OworICAgICAgICBiaXRfbGVmdCAgICs9IDMyOworICAgIH0KKyAgICBiaXRfbGVmdCAtPSBuOworI2Vsc2UKKyAgICBpZiAobiA8IGJpdF9sZWZ0KSB7CisgICAgICAgIGJpdF9idWYgICAgID0gKGJpdF9idWYgPDwgbikgfCB2YWx1ZTsKKyAgICAgICAgYml0X2xlZnQgICAtPSBuOworICAgIH0gZWxzZSB7CisgICAgICAgIGJpdF9idWYgICA8PD0gYml0X2xlZnQ7CisgICAgICAgIGJpdF9idWYgICAgfD0gdmFsdWUgPj4gKG4gLSBiaXRfbGVmdCk7CisgICAgICAgIGF2X2Fzc2VydDIocy0+YnVmX3B0ciszPHMtPmJ1Zl9lbmQpOworICAgICAgICBBVl9XQjMyKHMtPmJ1Zl9wdHIsIGJpdF9idWYpOworICAgICAgICBzLT5idWZfcHRyICs9IDQ7CisgICAgICAgIGJpdF9sZWZ0ICAgKz0gMzIgLSBuOworICAgICAgICBiaXRfYnVmICAgICA9IHZhbHVlOworICAgIH0KKyNlbmRpZgorCisgICAgcy0+Yml0X2J1ZiAgPSBiaXRfYnVmOworICAgIHMtPmJpdF9sZWZ0ID0gYml0X2xlZnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfc2JpdHMoUHV0Qml0Q29udGV4dCAqcGIsIGludCBuLCBpbnQzMl90IHZhbHVlKQoreworICAgIGF2X2Fzc2VydDIobiA+PSAwICYmIG4gPD0gMzEpOworCisgICAgcHV0X2JpdHMocGIsIG4sIHZhbHVlICYgKCgxIDw8IG4pIC0gMSkpOworfQorCisvKioKKyAqIFdyaXRlIGV4YWN0bHkgMzIgYml0cyBpbnRvIGEgYml0c3RyZWFtLgorICovCitzdGF0aWMgdm9pZCBhdl91bnVzZWQgcHV0X2JpdHMzMihQdXRCaXRDb250ZXh0ICpzLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBpbnQgbG8gPSB2YWx1ZSAmIDB4ZmZmZjsKKyAgICBpbnQgaGkgPSB2YWx1ZSA+PiAxNjsKKyNpZmRlZiBCSVRTVFJFQU1fV1JJVEVSX0xFCisgICAgcHV0X2JpdHMocywgMTYsIGxvKTsKKyAgICBwdXRfYml0cyhzLCAxNiwgaGkpOworI2Vsc2UKKyAgICBwdXRfYml0cyhzLCAxNiwgaGkpOworICAgIHB1dF9iaXRzKHMsIDE2LCBsbyk7CisjZW5kaWYKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGJ5dGUgd2hlcmUgdGhlIGJpdHN0cmVhbSB3cml0ZXIgd2lsbCBwdXQKKyAqIHRoZSBuZXh0IGJpdC4KKyAqLworc3RhdGljIGlubGluZSB1aW50OF90ICpwdXRfYml0c19wdHIoUHV0Qml0Q29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gcy0+YnVmX3B0cjsKK30KKworLyoqCisgKiBTa2lwIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgKiBQdXRCaXRDb250ZXh0IG11c3QgYmUgZmx1c2hlZCAmIGFsaWduZWQgdG8gYSBieXRlIGJvdW5kYXJ5IGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBza2lwX3B1dF9ieXRlcyhQdXRCaXRDb250ZXh0ICpzLCBpbnQgbikKK3sKKyAgICBhdl9hc3NlcnQyKChwdXRfYml0c19jb3VudChzKSAmIDcpID09IDApOworICAgIGF2X2Fzc2VydDIocy0+Yml0X2xlZnQgPT0gMzIpOworICAgIHMtPmJ1Zl9wdHIgKz0gbjsKK30KKworLyoqCisgKiBTa2lwIHRoZSBnaXZlbiBudW1iZXIgb2YgYml0cy4KKyAqIE11c3Qgb25seSBiZSB1c2VkIGlmIHRoZSBhY3R1YWwgdmFsdWVzIGluIHRoZSBiaXRzdHJlYW0gZG8gbm90IG1hdHRlci4KKyAqIElmIG4gaXMgMCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2tpcF9wdXRfYml0cyhQdXRCaXRDb250ZXh0ICpzLCBpbnQgbikKK3sKKyAgICBzLT5iaXRfbGVmdCAtPSBuOworICAgIHMtPmJ1Zl9wdHIgIC09IDQgKiAocy0+Yml0X2xlZnQgPj4gNSk7CisgICAgcy0+Yml0X2xlZnQgJj0gMzE7Cit9CisKKy8qKgorICogQ2hhbmdlIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gc2l6ZSB0aGUgbmV3IHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciB3aGVyZSB0byBwdXQgYml0cworICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3B1dF9iaXRzX2J1ZmZlcl9zaXplKFB1dEJpdENvbnRleHQgKnMsIGludCBzaXplKQoreworICAgIHMtPmJ1Zl9lbmQgPSBzLT5idWYgKyBzaXplOworfQorCisjZW5kaWYgLyogQVZDT0RFQ19QVVRfQklUU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9xY2VscGRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3FjZWxwZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMWM5OTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9xY2VscGRhdGEuaApAQCAtMCwwICsxLDU1MiBAQAorLyoKKyAqIFFDRUxQIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19RQ0VMUERBVEFfSAorI2RlZmluZSBBVkNPREVDX1FDRUxQREFUQV9ICisKKy8qKgorICogQGZpbGUKKyAqIERhdGEgdGFibGVzIGZvciB0aGUgUUNFTFAgZGVjb2RlcgorICogQGF1dGhvciBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0CisgKiBAcmVtYXJrIEZGbXBlZyBtZXJnaW5nIHNwZWFyaGVhZGVkIGJ5IEtlbmFuIEdpbGxldAorICogQHJlbWFyayBEZXZlbG9wbWVudCBtZW50b3JlZCBieSBCZW5qYW1pbiBMYXJzb24KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisvKioKKyAqIFFDRUxQIHVucGFja2VkIGRhdGEgZnJhbWUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUUNFTFBGcmFtZSB7CisvLy8gQG5hbWUgUUNFTFAgZXhjaXRhdGlvbiBjb2RlYm9vayBwYXJhbWV0ZXJzCisvLy8gQHsKKyAgICB1aW50OF90IGNic2lnblsxNl07IC8vLzwgc2lnbiBvZiB0aGUgY29kZWJvb2sgZ2FpbiBmb3IgZWFjaCBjb2RlYm9vayBzdWJmcmFtZQorICAgIHVpbnQ4X3QgY2JnYWluWzE2XTsgLy8vPCB1bnNpZ25lZCBjb2RlYm9vayBnYWluIGZvciBlYWNoIGNvZGVib29rIHN1YmZyYW1lCisgICAgdWludDhfdCBjaW5kZXhbMTZdOyAvLy88IGNvZGVib29rIGluZGV4IGZvciBlYWNoIGNvZGVib29rIHN1YmZyYW1lCisvLy8gQH0KKworLy8vIEBuYW1lIFFDRUxQIHBpdGNoIHByZWRpY3Rpb24gcGFyYW1ldGVycworLy8vIEB7CisgICAgdWludDhfdCBwbGFnWzRdOyAgICAvLy88IHBpdGNoIGxhZyBmb3IgZWFjaCBwaXRjaCBzdWJmcmFtZQorICAgIHVpbnQ4X3QgcGZyYWNbNF07ICAgLy8vPCBmcmFjdGlvbmFsIHBpdGNoIGxhZyBmb3IgZWFjaCBwaXRjaCBzdWJmcmFtZQorICAgIHVpbnQ4X3QgcGdhaW5bNF07ICAgLy8vPCBwaXRjaCBnYWluIGZvciBlYWNoIHBpdGNoIHN1YmZyYW1lCisvLy8gQH0KKworICAgIC8qKgorICAgICAqIGxpbmUgc3BlY3RyYWwgcGFpciBmcmVxdWVuY2llcyAoTFNQKSBmb3IgUkFURV9PQ1RBVkUsCisgICAgICogbGluZSBzcGVjdHJhbCBwYWlyIGZyZXF1ZW5jaWVzIGdyb3VwZWQgaW50byBmaXZlIHZlY3RvcnMKKyAgICAgKiBvZiBkaW1lbnNpb24gdHdvIChMU1BWKSBmb3Igb3RoZXIgcmF0ZXMKKyAgICAgKi8KKyAgICB1aW50OF90IGxzcHZbMTBdOworCisgICAgLyoqCisgICAgICogcmVzZXJ2ZWQgYml0cyBvbmx5IHByZXNlbnQgaW4gYml0cmF0ZSAxLCAxLzQgYW5kIDEvOCBwYWNrZXRzCisgICAgICovCisgICAgdWludDhfdCByZXNlcnZlZDsKK30gUUNFTFBGcmFtZTsKKworLyoqCisgKiBQcmUtY2FsY3VsYXRlZCB0YWJsZSBmb3IgaGFtbXNpbmMgZnVuY3Rpb24uCisgKiBPbmx5IGhhbGYgb2YgdGhlIHRhYmxlIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHN5bW1ldHJ5LgorICoKKyAqIFRJQS9FSUEvSVMtNzMzIDIuNC41LjItMi8zCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBxY2VscF9oYW1tc2luY190YWJsZVs0XSA9IHsgLTAuMDA2ODIyLCAgMC4wNDEyNDksIC0wLjE0MzQ1OSwgIDAuNTg4ODYzfTsKKwordHlwZWRlZiBzdHJ1Y3QgUUNFTFBCaXRtYXAgeworICAgIHVpbnQ4X3QgaW5kZXg7ICAvKio8IGluZGV4IGludG8gdGhlIFFDRUxQQ29udGV4dCBzdHJ1Y3R1cmUgKi8KKyAgICB1aW50OF90IGJpdHBvczsgLyoqPCBwb3NpdGlvbiBvZiB0aGUgbG93ZXN0IGJpdCBpbiB0aGUgdmFsdWUncyBieXRlICovCisgICAgdWludDhfdCBiaXRsZW47IC8qKjwgbnVtYmVyIG9mIGJpdHMgdG8gcmVhZCAqLworfSBRQ0VMUEJpdG1hcDsKKworI2RlZmluZSBRQ0VMUF9PRih2YXJpYWJsZSwgYml0LCBsZW4pIHtvZmZzZXRvZihRQ0VMUEZyYW1lLCB2YXJpYWJsZSksIGJpdCwgbGVufQorCisvKioKKyAqIEJpdG1hcCB1bnBhY2tpbmcgdGFibGVzIGZvciBSQVRFX0ZVTEwKKyAqCisgKiBUSUEvRUlBL0lTLTczMyBUYWJsZSAyLjQuNy4xLTEKKyAqLworc3RhdGljIGNvbnN0IFFDRUxQQml0bWFwIHFjZWxwX3JhdGVfZnVsbF9iaXRtYXBbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgb24gYml0CisgICAgUUNFTFBfT0YobHNwdiAgWyAyXSwgMCwgMyksIC8vIDI2NQorICAgIFFDRUxQX09GKGxzcHYgIFsgMV0sIDAsIDcpLCAvLyAyNjIKKyAgICBRQ0VMUF9PRihsc3B2ICBbIDBdLCAwLCA2KSwgLy8gMjU1CisgICAgUUNFTFBfT0YobHNwdiAgWyA0XSwgMCwgNiksIC8vIDI0OQorICAgIFFDRUxQX09GKGxzcHYgIFsgM10sIDAsIDYpLCAvLyAyNDMKKyAgICBRQ0VMUF9PRihsc3B2ICBbIDJdLCAzLCA0KSwgLy8gMjM3CisgICAgUUNFTFBfT0YoY2JzaWduWyAwXSwgMCwgMSksIC8vIDIzMworICAgIFFDRUxQX09GKGNiZ2FpblsgMF0sIDAsIDQpLCAvLyAyMzIKKyAgICBRQ0VMUF9PRihwZnJhYyBbIDBdLCAwLCAxKSwgLy8gMjI4CisgICAgUUNFTFBfT0YocGxhZyAgWyAwXSwgMCwgNyksIC8vIDIyNworICAgIFFDRUxQX09GKHBnYWluIFsgMF0sIDAsIDMpLCAvLyAyMjAKKyAgICBRQ0VMUF9PRihjaW5kZXhbIDFdLCAwLCA0KSwgLy8gMjE3CisgICAgUUNFTFBfT0YoY2JzaWduWyAxXSwgMCwgMSksIC8vIDIxMworICAgIFFDRUxQX09GKGNiZ2FpblsgMV0sIDAsIDQpLCAvLyAyMTIKKyAgICBRQ0VMUF9PRihjaW5kZXhbIDBdLCAwLCA3KSwgLy8gMjA4CisgICAgUUNFTFBfT0YoY2JnYWluWyAzXSwgMCwgMSksIC8vIDIwMQorICAgIFFDRUxQX09GKGNpbmRleFsgMl0sIDAsIDcpLCAvLyAyMDAKKyAgICBRQ0VMUF9PRihjYnNpZ25bIDJdLCAwLCAxKSwgLy8gMTkzCisgICAgUUNFTFBfT0YoY2JnYWluWyAyXSwgMCwgNCksIC8vIDE5MgorICAgIFFDRUxQX09GKGNpbmRleFsgMV0sIDQsIDMpLCAvLyAxODgKKyAgICBRQ0VMUF9PRihwbGFnICBbIDFdLCAwLCAzKSwgLy8gMTg1CisgICAgUUNFTFBfT0YocGdhaW4gWyAxXSwgMCwgMyksIC8vIDE4MgorICAgIFFDRUxQX09GKGNpbmRleFsgM10sIDAsIDcpLCAvLyAxNzkKKyAgICBRQ0VMUF9PRihjYnNpZ25bIDNdLCAwLCAxKSwgLy8gMTcyCisgICAgUUNFTFBfT0YoY2JnYWluWyAzXSwgMSwgMiksIC8vIDE3MQorICAgIFFDRUxQX09GKGNpbmRleFsgNF0sIDAsIDYpLCAvLyAxNjkKKyAgICBRQ0VMUF9PRihjYnNpZ25bIDRdLCAwLCAxKSwgLy8gMTYzCisgICAgUUNFTFBfT0YoY2JnYWluWyA0XSwgMCwgNCksIC8vIDE2MgorICAgIFFDRUxQX09GKHBmcmFjIFsgMV0sIDAsIDEpLCAvLyAxNTgKKyAgICBRQ0VMUF9PRihwbGFnICBbIDFdLCAzLCA0KSwgLy8gMTU3CisgICAgUUNFTFBfT0YoY2JnYWluWyA2XSwgMCwgMyksIC8vIDE1MworICAgIFFDRUxQX09GKGNpbmRleFsgNV0sIDAsIDcpLCAvLyAxNTAKKyAgICBRQ0VMUF9PRihjYnNpZ25bIDVdLCAwLCAxKSwgLy8gMTQzCisgICAgUUNFTFBfT0YoY2JnYWluWyA1XSwgMCwgNCksIC8vIDE0MgorICAgIFFDRUxQX09GKGNpbmRleFsgNF0sIDYsIDEpLCAvLyAxMzgKKyAgICBRQ0VMUF9PRihjaW5kZXhbIDddLCAwLCAzKSwgLy8gMTM3CisgICAgUUNFTFBfT0YoY2JzaWduWyA3XSwgMCwgMSksIC8vIDEzNAorICAgIFFDRUxQX09GKGNiZ2FpblsgN10sIDAsIDMpLCAvLyAxMzMKKyAgICBRQ0VMUF9PRihjaW5kZXhbIDZdLCAwLCA3KSwgLy8gMTMwCisgICAgUUNFTFBfT0YoY2JzaWduWyA2XSwgMCwgMSksIC8vIDEyMworICAgIFFDRUxQX09GKGNiZ2FpblsgNl0sIDMsIDEpLCAvLyAxMjIKKyAgICBRQ0VMUF9PRihjYmdhaW5bIDhdLCAwLCAxKSwgLy8gMTIxCisgICAgUUNFTFBfT0YocGZyYWMgWyAyXSwgMCwgMSksIC8vIDEyMAorICAgIFFDRUxQX09GKHBsYWcgIFsgMl0sIDAsIDcpLCAvLyAxMTkKKyAgICBRQ0VMUF9PRihwZ2FpbiBbIDJdLCAwLCAzKSwgLy8gMTEyCisgICAgUUNFTFBfT0YoY2luZGV4WyA3XSwgMywgNCksIC8vIDEwOQorICAgIFFDRUxQX09GKGNic2lnblsgOV0sIDAsIDEpLCAvLyAxMDUKKyAgICBRQ0VMUF9PRihjYmdhaW5bIDldLCAwLCA0KSwgLy8gMTA0CisgICAgUUNFTFBfT0YoY2luZGV4WyA4XSwgMCwgNyksIC8vIDEwMAorICAgIFFDRUxQX09GKGNic2lnblsgOF0sIDAsIDEpLCAvLyAgOTMKKyAgICBRQ0VMUF9PRihjYmdhaW5bIDhdLCAxLCAzKSwgLy8gIDkyCisgICAgUUNFTFBfT0YoY2luZGV4WzEwXSwgMCwgNCksIC8vICA4OQorICAgIFFDRUxQX09GKGNic2lnblsxMF0sIDAsIDEpLCAvLyAgODUKKyAgICBRQ0VMUF9PRihjYmdhaW5bMTBdLCAwLCA0KSwgLy8gIDg0CisgICAgUUNFTFBfT0YoY2luZGV4WyA5XSwgMCwgNyksIC8vICA4MAorICAgIFFDRUxQX09GKHBnYWluIFsgM10sIDAsIDIpLCAvLyAgNzMKKyAgICBRQ0VMUF9PRihjaW5kZXhbMTFdLCAwLCA3KSwgLy8gIDcxCisgICAgUUNFTFBfT0YoY2JzaWduWzExXSwgMCwgMSksIC8vICA2NAorICAgIFFDRUxQX09GKGNiZ2FpblsxMV0sIDAsIDMpLCAvLyAgNjMKKyAgICBRQ0VMUF9PRihjaW5kZXhbMTBdLCA0LCAzKSwgLy8gIDYwCisgICAgUUNFTFBfT0YoY2luZGV4WzEyXSwgMCwgMiksIC8vICA1NworICAgIFFDRUxQX09GKGNic2lnblsxMl0sIDAsIDEpLCAvLyAgNTUKKyAgICBRQ0VMUF9PRihjYmdhaW5bMTJdLCAwLCA0KSwgLy8gIDU0CisgICAgUUNFTFBfT0YocGZyYWMgWyAzXSwgMCwgMSksIC8vICA1MAorICAgIFFDRUxQX09GKHBsYWcgIFsgM10sIDAsIDcpLCAvLyAgNDkKKyAgICBRQ0VMUF9PRihwZ2FpbiBbIDNdLCAyLCAxKSwgLy8gIDQyCisgICAgUUNFTFBfT0YoY2luZGV4WzEzXSwgMCwgNiksIC8vICA0MQorICAgIFFDRUxQX09GKGNic2lnblsxM10sIDAsIDEpLCAvLyAgMzUKKyAgICBRQ0VMUF9PRihjYmdhaW5bMTNdLCAwLCA0KSwgLy8gIDM0CisgICAgUUNFTFBfT0YoY2luZGV4WzEyXSwgMiwgNSksIC8vICAzMAorICAgIFFDRUxQX09GKGNiZ2FpblsxNV0sIDAsIDMpLCAvLyAgMjUKKyAgICBRQ0VMUF9PRihjaW5kZXhbMTRdLCAwLCA3KSwgLy8gIDIyCisgICAgUUNFTFBfT0YoY2JzaWduWzE0XSwgMCwgMSksIC8vICAxNQorICAgIFFDRUxQX09GKGNiZ2FpblsxNF0sIDAsIDQpLCAvLyAgMTQKKyAgICBRQ0VMUF9PRihjaW5kZXhbMTNdLCA2LCAxKSwgLy8gIDEwCisgICAgUUNFTFBfT0YocmVzZXJ2ZWQsICAgMCwgMiksIC8vICAgOQorICAgIFFDRUxQX09GKGNpbmRleFsxNV0sIDAsIDcpLCAvLyAgIDcKKyAgICBRQ0VMUF9PRihjYnNpZ25bMTVdLCAwLCAxKSAgLy8gICAwCit9OworCisvKioKKyAqIEJpdG1hcCB1bnBhY2tpbmcgdGFibGVzIGZvciBSQVRFX0hBTEYKKyAqCisgKiBUSUEvRUlBL0lTLTczMyBUYWJsZSAyLjQuNy4yLTEKKyAqLworc3RhdGljIGNvbnN0IFFDRUxQQml0bWFwIHFjZWxwX3JhdGVfaGFsZl9iaXRtYXBbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBvbiBiaXQKKyAgICBRQ0VMUF9PRihsc3B2ICBbMl0sIDAsIDMpLCAvLyAxMjMKKyAgICBRQ0VMUF9PRihsc3B2ICBbMV0sIDAsIDcpLCAvLyAxMjAKKyAgICBRQ0VMUF9PRihsc3B2ICBbMF0sIDAsIDYpLCAvLyAxMTMKKyAgICBRQ0VMUF9PRihsc3B2ICBbNF0sIDAsIDYpLCAvLyAxMDcKKyAgICBRQ0VMUF9PRihsc3B2ICBbM10sIDAsIDYpLCAvLyAxMDEKKyAgICBRQ0VMUF9PRihsc3B2ICBbMl0sIDMsIDQpLCAvLyAgOTUKKyAgICBRQ0VMUF9PRihjYnNpZ25bMF0sIDAsIDEpLCAvLyAgOTEKKyAgICBRQ0VMUF9PRihjYmdhaW5bMF0sIDAsIDQpLCAvLyAgOTAKKyAgICBRQ0VMUF9PRihwZnJhYyBbMF0sIDAsIDEpLCAvLyAgODYKKyAgICBRQ0VMUF9PRihwbGFnICBbMF0sIDAsIDcpLCAvLyAgODUKKyAgICBRQ0VMUF9PRihwZ2FpbiBbMF0sIDAsIDMpLCAvLyAgNzgKKyAgICBRQ0VMUF9PRihwbGFnICBbMV0sIDAsIDYpLCAvLyAgNzUKKyAgICBRQ0VMUF9PRihwZ2FpbiBbMV0sIDAsIDMpLCAvLyAgNjkKKyAgICBRQ0VMUF9PRihjaW5kZXhbMF0sIDAsIDcpLCAvLyAgNjYKKyAgICBRQ0VMUF9PRihwZ2FpbiBbMl0sIDAsIDIpLCAvLyAgNTkKKyAgICBRQ0VMUF9PRihjaW5kZXhbMV0sIDAsIDcpLCAvLyAgNTcKKyAgICBRQ0VMUF9PRihjYnNpZ25bMV0sIDAsIDEpLCAvLyAgNTAKKyAgICBRQ0VMUF9PRihjYmdhaW5bMV0sIDAsIDQpLCAvLyAgNDkKKyAgICBRQ0VMUF9PRihwZnJhYyBbMV0sIDAsIDEpLCAvLyAgNDUKKyAgICBRQ0VMUF9PRihwbGFnICBbMV0sIDYsIDEpLCAvLyAgNDQKKyAgICBRQ0VMUF9PRihjaW5kZXhbMl0sIDAsIDIpLCAvLyAgNDMKKyAgICBRQ0VMUF9PRihjYnNpZ25bMl0sIDAsIDEpLCAvLyAgNDEKKyAgICBRQ0VMUF9PRihjYmdhaW5bMl0sIDAsIDQpLCAvLyAgNDAKKyAgICBRQ0VMUF9PRihwZnJhYyBbMl0sIDAsIDEpLCAvLyAgMzYKKyAgICBRQ0VMUF9PRihwbGFnICBbMl0sIDAsIDcpLCAvLyAgMzUKKyAgICBRQ0VMUF9PRihwZ2FpbiBbMl0sIDIsIDEpLCAvLyAgMjgKKyAgICBRQ0VMUF9PRihwZnJhYyBbM10sIDAsIDEpLCAvLyAgMjcKKyAgICBRQ0VMUF9PRihwbGFnICBbM10sIDAsIDcpLCAvLyAgMjYKKyAgICBRQ0VMUF9PRihwZ2FpbiBbM10sIDAsIDMpLCAvLyAgMTkKKyAgICBRQ0VMUF9PRihjaW5kZXhbMl0sIDIsIDUpLCAvLyAgMTYKKyAgICBRQ0VMUF9PRihjaW5kZXhbM10sIDAsIDcpLCAvLyAgMTEKKyAgICBRQ0VMUF9PRihjYnNpZ25bM10sIDAsIDEpLCAvLyAgIDQKKyAgICBRQ0VMUF9PRihjYmdhaW5bM10sIDAsIDQpICAvLyAgIDMKK307CisKKy8qKgorICogQml0bWFwIHVucGFja2luZyB0YWJsZXMgZm9yIFJBVEVfUVVBUlRFUgorICoKKyAqIFRJQS9FSUEvSVMtNzMzIFRhYmxlIDIuNC43LjMtMQorICovCitzdGF0aWMgY29uc3QgUUNFTFBCaXRtYXAgcWNlbHBfcmF0ZV9xdWFydGVyX2JpdG1hcFtdID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG9uIGJpdAorICAgIFFDRUxQX09GKGxzcHYgIFsyXSwgMCwgMyksIC8vIDUzCisgICAgUUNFTFBfT0YobHNwdiAgWzFdLCAwLCA3KSwgLy8gNTAKKyAgICBRQ0VMUF9PRihsc3B2ICBbMF0sIDAsIDYpLCAvLyA0MworICAgIFFDRUxQX09GKGxzcHYgIFs0XSwgMCwgNiksIC8vIDM3CisgICAgUUNFTFBfT0YobHNwdiAgWzNdLCAwLCA2KSwgLy8gMzEKKyAgICBRQ0VMUF9PRihsc3B2ICBbMl0sIDMsIDQpLCAvLyAyNQorICAgIFFDRUxQX09GKGNiZ2FpblszXSwgMCwgNCksIC8vIDIxCisgICAgUUNFTFBfT0YoY2JnYWluWzJdLCAwLCA0KSwgLy8gMTcKKyAgICBRQ0VMUF9PRihjYmdhaW5bMV0sIDAsIDQpLCAvLyAxMworICAgIFFDRUxQX09GKGNiZ2FpblswXSwgMCwgNCksIC8vICA5CisgICAgUUNFTFBfT0YocmVzZXJ2ZWQsICAwLCAyKSwgLy8gIDUKKyAgICBRQ0VMUF9PRihjYmdhaW5bNF0sIDAsIDQpICAvLyAgMworfTsKKworLyoqCisgKiBCaXRtYXAgdW5wYWNraW5nIHRhYmxlcyBmb3IgUkFURV9PQ1RBVkUKKyAqCisgKiB0cmljazogQ0JTRUVEIGlzIHdyaXR0ZW4gaW50byBRQ0VMUENvbnRleHQuY2JzaWduWzE1XSwKKyAqIHdoaWNoIGlzIG5vdCB1c2VkIGZvciBSQVRFX09DVEFWRS4KKyAqIENCU0VFRCBpcyBvbmx5IHVzZWQgdG8gZW5zdXJlIHRoZSBvY2N1cnJlbmNlIG9mIHJhbmRvbSBiaXQKKyAqIHBhdHRlcm5zIGluIHRoZSAxNiBmaXJzdCBiaXRzIHRoYXQgYXJlIHVzZWQgYXMgdGhlIHNlZWQuCisgKgorICogVElBL0VJQS9JUy03MzMgVGFibGUgMi40LjcuNC0xCisgKi8KK3N0YXRpYyBjb25zdCBRQ0VMUEJpdG1hcCBxY2VscF9yYXRlX29jdGF2ZV9iaXRtYXBbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgb24gYml0CisgICAgUUNFTFBfT0YoY2JzaWduWzE1XSwgMywgMSksIC8vIDE5CisgICAgUUNFTFBfT0YobHNwdiAgIFswXSwgMCwgMSksIC8vIDE4CisgICAgUUNFTFBfT0YobHNwdiAgIFsxXSwgMCwgMSksIC8vIDE3CisgICAgUUNFTFBfT0YobHNwdiAgIFsyXSwgMCwgMSksIC8vIDE2CisgICAgUUNFTFBfT0YoY2JzaWduWzE1XSwgMiwgMSksIC8vIDE1CisgICAgUUNFTFBfT0YobHNwdiAgIFszXSwgMCwgMSksIC8vIDE0CisgICAgUUNFTFBfT0YobHNwdiAgIFs0XSwgMCwgMSksIC8vIDEzCisgICAgUUNFTFBfT0YobHNwdiAgIFs1XSwgMCwgMSksIC8vIDEyCisgICAgUUNFTFBfT0YoY2JzaWduWzE1XSwgMSwgMSksIC8vIDExCisgICAgUUNFTFBfT0YobHNwdiAgIFs2XSwgMCwgMSksIC8vIDEwCisgICAgUUNFTFBfT0YobHNwdiAgIFs3XSwgMCwgMSksIC8vICA5CisgICAgUUNFTFBfT0YobHNwdiAgIFs4XSwgMCwgMSksIC8vICA4CisgICAgUUNFTFBfT0YoY2JzaWduWzE1XSwgMCwgMSksIC8vICA3CisgICAgUUNFTFBfT0YobHNwdiAgIFs5XSwgMCwgMSksIC8vICA2CisgICAgUUNFTFBfT0YoY2JnYWluIFswXSwgMCwgMiksIC8vICA1CisgICAgUUNFTFBfT0YocmVzZXJ2ZWQsICAgMCwgNCkgIC8vICAzCit9OworCisvKioKKyAqIEJpdG1hcHBpbmcgZGF0YSBwb3NpdGlvbiBmb3IgZWFjaCBwYWNrZXQgdHlwZSBpbgorICogdGhlIFFDRUxQQ29udGV4dAorICovCitzdGF0aWMgY29uc3QgUUNFTFBCaXRtYXAgKiBjb25zdCBxY2VscF91bnBhY2tpbmdfYml0bWFwc19wZXJfcmF0ZVs1XSA9IHsKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgZm9yIFNJTEVOQ0UgcmF0ZQorICAgIHFjZWxwX3JhdGVfb2N0YXZlX2JpdG1hcCwKKyAgICBxY2VscF9yYXRlX3F1YXJ0ZXJfYml0bWFwLAorICAgIHFjZWxwX3JhdGVfaGFsZl9iaXRtYXAsCisgICAgcWNlbHBfcmF0ZV9mdWxsX2JpdG1hcCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBxY2VscF91bnBhY2tpbmdfYml0bWFwc19sZW5ndGhzWzVdID0geworICAgIDAsIC8vLzwgZm9yIFNJTEVOQ0UgcmF0ZQorICAgIEZGX0FSUkFZX0VMRU1TKHFjZWxwX3JhdGVfb2N0YXZlX2JpdG1hcCksCisgICAgRkZfQVJSQVlfRUxFTVMocWNlbHBfcmF0ZV9xdWFydGVyX2JpdG1hcCksCisgICAgRkZfQVJSQVlfRUxFTVMocWNlbHBfcmF0ZV9oYWxmX2JpdG1hcCksCisgICAgRkZfQVJSQVlfRUxFTVMocWNlbHBfcmF0ZV9mdWxsX2JpdG1hcCksCit9OworCit0eXBlZGVmIHVpbnQxNl90IHFjZWxwX3ZlY3RvclsyXTsKKworLyoqCisgKiBMU1AgdmVjdG9yIHF1YW50aXphdGlvbiB0YWJsZXMgaW4geCoxMDAwMCBmb3JtCisgKgorICogVElBL0VJQS9JUy03MzMgdGFibGVzIDIuNC4zLjIuNi4zLTEgdGhyb3VnaCAyLjQuMy4yLjYuMy01CisgKi8KKworc3RhdGljIGNvbnN0IHFjZWxwX3ZlY3RvciBxY2VscF9sc3B2cTFbNjRdPSB7Cit7IDMyNywgMTE4fSx7IDkxOSwgMTExfSx7IDQyNywgNDQwfSx7MTMyNywgMTg1fSwKK3sgNDY5LCAgNTB9LHsxMjcyLCAgOTF9LHsgODkyLCAgNTl9LHsxNzcxLCAxOTN9LAoreyAyMjIsIDE1OH0sezExMDAsIDEyN30seyA4MjcsICA1NX0seyA5NzgsIDc5MX0sCit7IDY2NSwgIDQ3fSx7IDcwMCwxNDAxfSx7IDY3MCwgODU5fSx7MTkxMywxMDQ4fSwKK3sgNDcxLCAyMTV9LHsxMDQ2LCAxMjV9LHsgNjQ1LCAyOTh9LHsxNTk5LCAxNjB9LAoreyA1OTMsICAzOX0sezExODcsIDQ2Mn0seyA3NDksIDM0MX0sezE1MjAsIDUxMX0sCit7IDI5MCwgNzkyfSx7IDkwOSwgMzYyfSx7IDc1MywgIDgxfSx7MTExMSwxMDU4fSwKK3sgNTE5LCAyNTN9LHsgODI4LCA4Mzl9LHsgNjg1LCA1NDF9LHsxNDIxLDEyNTh9LAoreyAzODYsIDEzMH0seyA5NjIsIDExOX0seyA1NDIsIDM4N30sezE0MzEsIDE4NX0sCit7IDUyNiwgIDUxfSx7MTE3NSwgMjYwfSx7IDgzMSwgMTY3fSx7MTcyOCwgNTEwfSwKK3sgMjczLCA0Mzd9LHsxMTcyLCAxMTN9LHsgNzcxLCAxNDR9LHsxMTIyLCA3NTF9LAoreyA2MTksIDExOX0seyA0OTIsMTI3Nn0seyA2NTgsIDY5NX0sezE4ODIsIDYxNX0sCit7IDQxNSwgMjAwfSx7MTAxOCwgIDg4fSx7IDY4MSwgMzM5fSx7MTQzNiwgMzI1fSwKK3sgNTU1LCAxMjJ9LHsxMDQyLCA0ODV9LHsgODI2LCAzNDV9LHsxMzc0LCA3NDN9LAoreyAzODMsMTAxOH0sezEwMDUsIDM1OH0seyA3MDQsICA4Nn0sezEzMDEsIDU4Nn0sCit7IDU5NywgMjQxfSx7IDgzMiwgNjIxfSx7IDU1NSwgNTczfSx7MTUwNCwgODM5fX07CisKK3N0YXRpYyBjb25zdCBxY2VscF92ZWN0b3IgcWNlbHBfbHNwdnEyWzEyOF09IHsKK3sgMjU1LCAyOTN9LHsgOTA0LCAyMTl9LHsgMTUxLDEyMTF9LHsxNDQ3LCA0OTh9LAoreyA0NzAsIDI1M30sezE1NTksIDE3N30sezE1NDcsIDk5NH0sezIzOTQsIDI0Mn0sCit7ICA5MSwgODEzfSx7IDg1NywgNTkwfSx7IDkzNCwxMzI2fSx7MTg4OSwgMjgyfSwKK3sgODEzLCA0NzJ9LHsxMDU3LDE0OTR9LHsgNDUwLDMzMTV9LHsyMTYzLDE4OTV9LAoreyA1MzgsIDUzMn0sezEzOTksIDIxOH0seyAxNDYsMTU1Mn0sezE3NTUsIDYyNn0sCit7IDgyMiwgMjAyfSx7MTI5OSwgNjYzfSx7IDcwNiwxNzMyfSx7MjY1NiwgNDAxfSwKK3sgNDE4LCA3NDV9LHsgNzYyLDEwMzh9LHsgNTgzLDE3NDh9LHsxNzQ2LDEyODV9LAoreyA1MjcsMTE2OX0sezEzMTQsIDgzMH0seyA1NTYsMjExNn0sezEwNzMsMjMyMX0sCit7IDI5NywgNTcwfSx7IDk4MSwgNDAzfSx7IDQ2OCwxMTAzfSx7MTc0MCwgMjQzfSwKK3sgNzI1LCAxNzl9LHsxMjU1LCA0NzR9LHsxMzc0LDEzNjJ9LHsxOTIyLCA5MTJ9LAoreyAyODUsIDk0N30seyA5MzAsIDcwMH0seyA1OTMsMTM3Mn0sezE5MDksIDU3Nn0sCit7IDU4OCwgOTE2fSx7MTExMCwxMTE2fSx7IDIyNCwyNzE5fSx7MTYzMywyMjIwfSwKK3sgNDAyLCA1MjB9LHsxMDYxLCA0NDh9LHsgNDAyLDEzNTJ9LHsxNDk5LCA3NzV9LAoreyA2NjQsIDU4OX0sezEwODEsIDcyN30seyA4MDEsMjIwNn0sezIxNjUsMTE1N30sCit7IDU2NiwgODAyfSx7IDkxMSwxMTE2fSx7IDMwNiwxNzAzfSx7MTc5MiwgODM2fSwKK3sgNjU1LCA5OTl9LHsxMDYxLDEwMzh9LHsgMjk4LDIwODl9LHsxMTEwLDE3NTN9LAoreyAzNjEsIDMxMX0seyA5NzAsIDIzOX0seyAyNjUsMTIzMX0sezE0OTUsIDU3M30sCit7IDU2NiwgMjYyfSx7MTU2OSwgMjkzfSx7MTM0MSwxMTQ0fSx7MjI3MSwgNTQ0fSwKK3sgMjE0LCA4Nzd9LHsgODQ3LCA3MTl9LHsgNzk0LDEzODR9LHsyMDY3LCAyNzR9LAoreyA3MDMsIDY4OH0sezEwOTksMTMwNn0seyAzOTEsMjk0N30sezIwMjQsMTY3MH0sCit7IDQ3MSwgNTI1fSx7MTI0NSwgMjkwfSx7IDI2NCwxNTU3fSx7MTU2OCwgODA3fSwKK3sgNzE4LCAzOTl9LHsxMTkzLCA2ODV9LHsgODgzLDE1OTR9LHsyNzI5LCA3NjR9LAoreyA1MDAsIDc1NH0seyA4MDksMTEwOH0seyA1NDEsMTY0OH0sezE1MjMsMTM4NX0sCit7IDYxNCwxMTk2fSx7MTIwOSwgODQ3fSx7IDM0NSwyMjQyfSx7MTQ0MiwxNzQ3fSwKK3sgMTk5LCA1NjB9LHsxMDkyLCAxOTR9LHsgMzQ5LDEyNTN9LHsxNjUzLCA1MDd9LAoreyA2MjUsIDM1NH0sezEzNzYsIDQzMX0sezExODcsMTQ2NX0sezIxNjQsIDg3Mn0sCit7IDM2MCwgOTc0fSx7MTAwOCwgNjk4fSx7IDcwNCwxMzQ2fSx7MjExNCwgNDUyfSwKK3sgNzIwLCA4MTZ9LHsxMjQwLDEwODl9LHsgNDM5LDI0NzV9LHsxNDk4LDIwNDB9LAoreyAzMzYsIDcxOH0sezEyMTMsIDE4N30seyA0NTEsMTQ1MH0sezEzNjgsIDg4NX0sCit7IDU5MiwgNTc4fSx7MTEzMSwgNTMxfSx7IDg2MSwxODU1fSx7MTc2NCwxNTAwfSwKK3sgNDQ0LCA5NzB9LHsgOTM1LCA5MDN9LHsgNDI0LDE2ODd9LHsxNjMzLDExMDJ9LAoreyA3OTMsIDg5N30sezEwNjAsIDg5N30seyAxODUsMjAxMX0sezEyMDUsMTg1NX19OworCitzdGF0aWMgY29uc3QgcWNlbHBfdmVjdG9yIHFjZWxwX2xzcHZxM1sxMjhdPSB7Cit7IDIyNSwgMjgzfSx7MTI5NiwgMzU1fSx7IDU0MywgMzQzfSx7MjA3MywgMjc0fSwKK3sgMjA0LDEwOTl9LHsxNTYyLCA1MjN9LHsxMzg4LCAxNjF9LHsyNzg0LCAyNzR9LAoreyAxMTIsIDg0OX0sezE4NzAsIDE3NX0sezExODksIDE2MH0sezE0OTAsMTA4OH0sCit7IDk2OSwxMTE1fSx7IDY1OSwzMzIyfSx7MTE1OCwxMDczfSx7MzE4MywxMzYzfSwKK3sgNTE3LCAyMjN9LHsxNzQwLCAyMjN9LHsgNzA0LCAzODd9LHsyNjM3LCAyMzR9LAoreyA2OTIsMTAwNX0sezEyODcsMTYxMH0seyA5NTIsIDUzMn0sezIzOTMsIDY0Nn0sCit7IDQ5MCwgNTUyfSx7MTYxOSwgNjU3fSx7IDg0NSwgNjcwfSx7MTc4NCwyMjgwfSwKK3sgMTkxLDE3NzV9LHsgMjcyLDI4Njh9LHsgOTQyLCA5NTJ9LHsyNjI4LDE0Nzl9LAoreyAyNzgsIDU3OX0sezE1NjUsIDIxOH0seyA4MTQsIDE4MH0sezIzNzksIDE4N30sCit7IDI3NiwxNDQ0fSx7MTE5OSwxMjIzfSx7MTIwMCwgMzQ5fSx7MzAwOSwgMzA3fSwKK3sgMzEyLCA4NDR9LHsxODk4LCAzMDZ9LHsgODYzLCA0NzB9LHsxNjg1LDEyNDF9LAoreyA1MTMsMTcyN30seyA3MTEsMjIzM30sezEwODUsIDg2NH0sezMzOTgsIDUyN30sCit7IDQxNCwgNDQwfSx7MTM1NiwgNjEyfSx7IDk2NCwgMTQ3fSx7MjE3MywgNzM4fSwKK3sgNDY1LDEyOTJ9LHsgODc3LDE3NDl9LHsxMTA0LCA2ODl9LHsyMTA1LDEzMTF9LAoreyA1ODAsIDg2NH0sezE4OTUsIDc1Mn0seyA2NTIsIDYwOX0sezE0ODUsMTY5OX0sCit7IDUxNCwxNDAwfSx7IDM4NiwyMTMxfSx7IDkzMywgNzk4fSx7MjQ3MywgOTg2fSwKK3sgMzM0LCAzNjB9LHsxMzc1LCAzOTh9LHsgNjIxLCAyNzZ9LHsyMTgzLCAyODB9LAoreyAzMTEsMTExNH0sezEzODIsIDgwN30sezEyODQsIDE3NX0sezI2MDUsIDYzNn0sCit7IDIzMCwgODE2fSx7MTczOSwgNDA4fSx7MTA3NCwgMTc2fSx7MTYxOSwxMTIwfSwKK3sgNzg0LDEzNzF9LHsgNDQ4LDMwNTB9LHsxMTg5LCA4ODB9LHszMDM5LDExNjV9LAoreyA0MjQsIDI0MX0sezE2NzIsIDE4Nn0seyA4MTUsIDMzM30sezI0MzIsIDMyNH0sCit7IDU4NCwxMDI5fSx7MTEzNywxNTQ2fSx7MTAxNSwgNTg1fSx7MjE5OCwgOTk1fSwKK3sgNTc0LCA1ODF9LHsxNzQ2LCA2NDd9LHsgNzMzLCA3NDB9LHsxOTM4LDE3Mzd9LAoreyAzNDcsMTcxMH0seyAzNzMsMjQyOX0seyA3ODcsMTA2MX0sezI0MzksMTQzOH0sCit7IDE4NSwgNTM2fSx7MTQ4OSwgMTc4fSx7IDcwMywgMjE2fSx7MjE3OCwgNDg3fSwKK3sgMTU0LDE0MjF9LHsxNDE0LCA5OTR9LHsxMTAzLCAzNTJ9LHszMDcyLCA0NzN9LAoreyA0MDgsIDgxOX0sezIwNTUsIDE2OH0seyA5OTgsIDM1NH0sezE5MTcsMTE0MH0sCit7IDY2NSwxNzk5fSx7IDk5MywyMjEzfSx7MTIzNCwgNjMxfSx7MzAwMywgNzYyfSwKK3sgMzczLCA2MjB9LHsxNTE4LCA0MjV9LHsgOTEzLCAzMDB9LHsxOTY2LCA4MzZ9LAoreyA0MDIsMTE4NX0seyA5NDgsMTM4NX0sezExMjEsIDU1NX0sezE4MDIsMTUwOX0sCit7IDQ3NCwgODg2fSx7MTg4OCwgNjEwfSx7IDczOSwgNTg1fSx7MTIzMSwyMzc5fSwKK3sgNjYxLDEzMzV9LHsgMjA1LDIyMTF9LHsgODIzLCA4MjJ9LHsyNDgwLDExNzl9fTsKKworc3RhdGljIGNvbnN0IHFjZWxwX3ZlY3RvciBxY2VscF9sc3B2cTRbNjRdPSB7Cit7IDM0OCwgMzExfSx7IDgxMiwxMTQ1fSx7IDU1MiwgNDYxfSx7MTgyNiwgMjYzfSwKK3sgNjAxLCA2NzV9LHsxNzMwLCAxNzJ9LHsxNTIzLCAxOTN9LHsyNDQ5LCAyNzd9LAoreyAzMzQsIDY2OH0seyA4MDUsMTQ0MX0sezEzMTksIDIwN30sezE2ODQsIDkxMH0sCit7IDU4MiwxMzE4fSx7MTQwMywxMDk4fSx7IDk3OSwgODMyfSx7MjcwMCwxMzU5fSwKK3sgNjI0LCAyMjh9LHsxMjkyLCA5Nzl9LHsgODAwLCAxOTV9LHsyMjI2LCAyODV9LAoreyA3MzAsIDg2Mn0sezE1MzcsIDYwMX0sezExMTUsIDUwOX0sezI3MjAsIDM1NH0sCit7IDIxOCwxMTY3fSx7MTIxMiwxNTM4fSx7MTA3NCwgMjQ3fSx7MTY3NCwxNzEwfSwKK3sgMzIyLDIxNDJ9LHsxMjYzLCA3Nzd9LHsgOTgxLCA1NTZ9LHsyMTE5LDE3MTB9LAoreyAxOTMsIDU5Nn0sezEwMzUsIDk1N30seyA2OTQsIDM5N30sezE5OTcsIDI1M30sCit7IDc0MywgNjAzfSx7MTU4NCwgMzIxfSx7MTM0NiwgMzQ2fSx7MjIyMSwgNzA4fSwKK3sgNDUxLCA3MzJ9LHsxMDQwLDE0MTV9LHsxMTg0LCAyMzB9LHsxODUzLCA5MTl9LAoreyAzMTAsMTY2MX0sezE2MjUsIDcwNn0seyA4NTYsIDg0M30sezI5MDIsIDcwMn0sCit7IDQ2NywgMzQ4fSx7MTEwOCwxMDQ4fSx7IDg1OSwgMzA2fSx7MTk2NCwgNDYzfSwKK3sgNTYwLDEwMTN9LHsxNDI1LCA1MzN9LHsxMTQyLCA2MzR9LHsyMzkxLCA4Nzl9LAoreyAzOTcsMTA4NH0sezEzNDUsMTcwMH0seyA5NzYsIDI0OH0sezE4ODcsMTE4OX0sCit7IDY0NCwyMDg3fSx7MTI2MiwgNjAzfSx7IDg3NywgNTUwfSx7MjIwMywxMzA3fX07CisKK3N0YXRpYyBjb25zdCBxY2VscF92ZWN0b3IgcWNlbHBfbHNwdnE1WzY0XT0geworeyAzNjAsIDIyMn0seyA4MjAsMTA5N30seyA2MDEsIDMxOX0sezE2NTYsIDE5OH0sCit7IDYwNCwgNTEzfSx7MTU1MiwgMTQxfSx7MTM5MSwgMTU1fSx7MjQ3NCwgMjYxfSwKK3sgMjY5LCA3ODV9LHsxNDYzLCA2NDZ9LHsxMTIzLCAxOTF9LHsyMDE1LCAyMjN9LAoreyA3ODUsIDg0NH0sezEyMDIsMTAxMX0seyA5ODAsIDgwN30sezMwMTQsIDc5M30sCit7IDU3MCwgMTgwfSx7MTEzNSwxMzgyfSx7IDc3OCwgMjU2fSx7MTkwMSwgMTc5fSwKK3sgODA3LCA2MjJ9LHsxNDYxLCA0NTh9LHsxMjMxLCAxNzh9LHsyMDI4LCA4MjF9LAoreyAzODcsIDkyN30sezE0OTYsMTAwNH0seyA4ODgsIDM5Mn0sezIyNDYsIDM0MX0sCit7IDI5NSwxNDYyfSx7MTE1NiwgNjk0fSx7MTAyMiwgNDczfSx7MjIyNiwxMzY0fSwKK3sgMjEwLCA0Nzh9LHsxMDI5LDEwMjB9LHsgNzIyLCAxODF9LHsxNzMwLCAyNTF9LAoreyA3MzAsIDQ4OH0sezE0NjUsIDI5M30sezEzMDMsIDMyNn0sezI1OTUsIDM4N30sCit7IDQ1OCwgNTg0fSx7MTU2OSwgNzQyfSx7MTAyOSwgMTczfSx7MTkxMCwgNDk1fSwKK3sgNjA1LDExNTl9LHsxMjY4LCA3MTl9LHsgOTczLCA2NDZ9LHsyODcyLCA0Mjh9LAoreyA0NDMsIDMzNH0seyA4MzUsMTQ2NX0seyA5MTIsIDEzOH0sezE3MTYsIDQ0Mn0sCit7IDYyMCwgNzc4fSx7MTMxNiwgNDUwfSx7MTE4NiwgMzM1fSx7MTQ0NiwxNjY1fSwKK3sgNDg2LDEwNTB9LHsxNjc1LDEwMTl9LHsgODgwLCAyNzh9LHsyMjE0LCAyMDJ9LAoreyA1MzksMTU2NH0sezExNDIsIDUzM30seyA5ODQsIDM5MX0sezIxMzAsMTA4OX19OworCitzdGF0aWMgY29uc3QgcWNlbHBfdmVjdG9yICogY29uc3QgcWNlbHBfbHNwdnFbNV0gPSB7CisgICAgcWNlbHBfbHNwdnExLAorICAgIHFjZWxwX2xzcHZxMiwKKyAgICBxY2VscF9sc3B2cTMsCisgICAgcWNlbHBfbHNwdnE0LAorICAgIHFjZWxwX2xzcHZxNQorfTsKKworLyoqCisgKiBUaGUgZmluYWwgZ2FpbiBzY2FsZWZhY3RvciBiZWZvcmUgY2xpcHBpbmcgaW50byBhIHVzYWJsZSBvdXRwdXQgZmxvYXQKKyAqLworI2RlZmluZSBRQ0VMUF9TQ0FMRSA4MTkyLgorCisvKioKKyAqIFRhYmxlIGZvciBjb21wdXRpbmcgR2EgKGRlY29kZWQgbGluZWFyIGNvZGVib29rIGdhaW4gbWFnbml0dWRlKQorICoKKyAqIEBub3RlIFRoZSB0YWJsZSBjb3VsZCBmaXQgaW4gaW50MTZfdCBpbiB4KjggZm9ybSwgYnV0IGl0IHNlZW1zCisgKiAgICAgICB0byBiZSBzbG93ZXIgb24geDg2CisgKgorICogVElBL0VJQS9JUy03MzMgMi40LjYuMi4xLTMKKyAqLworCitzdGF0aWMgY29uc3QgZmxvYXQgcWNlbHBfZzEyZ2FbNjFdID0geworICAgIDEuMDAwL1FDRUxQX1NDQUxFLCAgIDEuMTI1L1FDRUxQX1NDQUxFLCAgIDEuMjUwL1FDRUxQX1NDQUxFLCAgIDEuMzc1L1FDRUxQX1NDQUxFLAorICAgIDEuNjI1L1FDRUxQX1NDQUxFLCAgIDEuNzUwL1FDRUxQX1NDQUxFLCAgIDIuMDAwL1FDRUxQX1NDQUxFLCAgIDIuMjUwL1FDRUxQX1NDQUxFLAorICAgIDIuNTAwL1FDRUxQX1NDQUxFLCAgIDIuODc1L1FDRUxQX1NDQUxFLCAgIDMuMTI1L1FDRUxQX1NDQUxFLCAgIDMuNTAwL1FDRUxQX1NDQUxFLAorICAgIDQuMDAwL1FDRUxQX1NDQUxFLCAgIDQuNTAwL1FDRUxQX1NDQUxFLCAgIDUuMDAwL1FDRUxQX1NDQUxFLCAgIDUuNjI1L1FDRUxQX1NDQUxFLAorICAgIDYuMjUwL1FDRUxQX1NDQUxFLCAgIDcuMTI1L1FDRUxQX1NDQUxFLCAgIDguMDAwL1FDRUxQX1NDQUxFLCAgIDguODc1L1FDRUxQX1NDQUxFLAorICAgMTAuMDAwL1FDRUxQX1NDQUxFLCAgMTEuMjUwL1FDRUxQX1NDQUxFLCAgMTIuNjI1L1FDRUxQX1NDQUxFLCAgMTQuMTI1L1FDRUxQX1NDQUxFLAorICAgMTUuODc1L1FDRUxQX1NDQUxFLCAgMTcuNzUwL1FDRUxQX1NDQUxFLCAgMjAuMDAwL1FDRUxQX1NDQUxFLCAgMjIuMzc1L1FDRUxQX1NDQUxFLAorICAgMjUuMTI1L1FDRUxQX1NDQUxFLCAgMjguMTI1L1FDRUxQX1NDQUxFLCAgMzEuNjI1L1FDRUxQX1NDQUxFLCAgMzUuNTAwL1FDRUxQX1NDQUxFLAorICAgMzkuNzUwL1FDRUxQX1NDQUxFLCAgNDQuNjI1L1FDRUxQX1NDQUxFLCAgNTAuMTI1L1FDRUxQX1NDQUxFLCAgNTYuMjUwL1FDRUxQX1NDQUxFLAorICAgNjMuMTI1L1FDRUxQX1NDQUxFLCAgNzAuNzUwL1FDRUxQX1NDQUxFLCAgNzkuMzc1L1FDRUxQX1NDQUxFLCAgODkuMTI1L1FDRUxQX1NDQUxFLAorICAxMDAuMDAwL1FDRUxQX1NDQUxFLCAxMTIuMjUwL1FDRUxQX1NDQUxFLCAxMjUuODc1L1FDRUxQX1NDQUxFLCAxNDEuMjUwL1FDRUxQX1NDQUxFLAorICAxNTguNTAwL1FDRUxQX1NDQUxFLCAxNzcuODc1L1FDRUxQX1NDQUxFLCAxOTkuNTAwL1FDRUxQX1NDQUxFLCAyMjMuODc1L1FDRUxQX1NDQUxFLAorICAyNTEuMjUwL1FDRUxQX1NDQUxFLCAyODEuODc1L1FDRUxQX1NDQUxFLCAzMTYuMjUwL1FDRUxQX1NDQUxFLCAzNTQuODc1L1FDRUxQX1NDQUxFLAorICAzOTguMTI1L1FDRUxQX1NDQUxFLCA0NDYuNjI1L1FDRUxQX1NDQUxFLCA1MDEuMTI1L1FDRUxQX1NDQUxFLCA1NjIuMzc1L1FDRUxQX1NDQUxFLAorICA2MzEuMDAwL1FDRUxQX1NDQUxFLCA3MDguMDAwL1FDRUxQX1NDQUxFLCA3OTQuMzc1L1FDRUxQX1NDQUxFLCA4OTEuMjUwL1FDRUxQX1NDQUxFLAorIDEwMDAuMDAwL1FDRUxQX1NDQUxFfTsKKworLyoqCisgKiBDaXJjdWxhciBjb2RlYm9vayBmb3IgcmF0ZSAxIGZyYW1lcyBpbiB4KjEwMCBmb3JtCisgKgorICogVElBL0VJQS9JUy03MzMgMi40LjYuMS0yCisgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IHFjZWxwX3JhdGVfZnVsbF9jb2RlYm9va1sxMjhdID0geworICAgICAxMCwgIC02NSwgIC01OSwgICAxMiwgIDExMCwgICAzNCwgLTEzNCwgIDE1NywKKyAgICAxMDQsICAtODQsICAtMzQsIC0xMTUsICAgMjMsIC0xMDEsICAgIDMsICAgNDUsCisgICAtMTAxLCAgLTE2LCAgLTU5LCAgIDI4LCAgLTQ1LCAgMTM0LCAgLTY3LCAgIDIyLAorICAgICA2MSwgIC0yOSwgIDIyNiwgIC0yNiwgIC01NSwgLTE3OSwgIDE1NywgIC01MSwKKyAgIC0yMjAsICAtOTMsICAtMzcsICAgNjAsICAxMTgsICAgNzQsICAtNDgsICAtOTUsCisgICAtMTgxLCAgMTExLCAgIDM2LCAgLTUyLCAtMjE1LCAgIDc4LCAtMTEyLCAgIDM5LAorICAgIC0xNywgIC00NywgLTIyMywgICAxOSwgICAxMiwgIC05OCwgLTE0MiwgIDEzMCwKKyAgICAgNTQsIC0xMjcsICAgMjEsICAtMTIsICAgMzksICAtNDgsICAgMTIsICAxMjgsCisgICAgICA2LCAtMTY3LCAgIDgyLCAtMTAyLCAgLTc5LCAgIDU1LCAgLTQ0LCAgIDQ4LAorICAgIC0yMCwgIC01MywgICAgOCwgIC02MSwgICAxMSwgIC03MCwgLTE1NywgLTE2OCwKKyAgICAgMjAsICAtNTYsICAtNzQsICAgNzgsICAgMzMsICAtNjMsIC0xNzMsICAgLTIsCisgICAgLTc1LCAgLTUzLCAtMTQ2LCAgIDc3LCAgIDY2LCAgLTI5LCAgICA5LCAgLTc1LAorICAgICA2NSwgIDExOSwgIC00MywgICA3NiwgIDIzMywgICA5OCwgIDEyNSwgLTE1NiwKKyAgICAtMjcsICAgNzgsICAgLTksICAxNzAsICAxNzYsICAxNDMsIC0xNDgsICAgLTcsCisgICAgIDI3LCAtMTM2LCAgICA1LCAgIDI3LCAgIDE4LCAgMTM5LCAgMjA0LCAgICA3LAorICAgLTE4NCwgLTE5NywgICA1MiwgICAtMywgICA3OCwgLTE4OSwgICAgOCwgIC02NQorfTsKKyNkZWZpbmUgUUNFTFBfUkFURV9GVUxMX0NPREVCT09LX1JBVElPIC4wMQorCisvKioKKyAqIENpcmN1bGFyIGNvZGVib29rIGZvciByYXRlIDEvMiBmcmFtZXMgaW4geCoyIGZvcm0KKyAqCisgKiBUSUEvRUlBL0lTLTczMyAyLjQuNi4xLTEKKyAqLworc3RhdGljIGNvbnN0IGludDhfdCBxY2VscF9yYXRlX2hhbGZfY29kZWJvb2tbMTI4XSA9IHsKKyAgICAgMCwgLTQsICAwLCAtMywgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAtMywgLTIsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDUsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDQsICAwLAorICAgICAwLCAgMywgIDIsICAwLCAgMywgIDQsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMywgIDAsICAwLAorICAgIC0zLCAgMywgIDAsICAwLCAtMiwgIDAsICAzLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAtNSwgIDAsCisgICAgIDAsICAwLCAgMCwgIDMsICAwLCAgMCwgIDAsICAzLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgNCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAzLCAgNiwgLTMsIC00LCAgMCwgLTMsIC0zLAorICAgICAzLCAtMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKK307CisjZGVmaW5lIFFDRUxQX1JBVEVfSEFMRl9DT0RFQk9PS19SQVRJTyAwLjUKKworLyoqCisgKiBzcXJ0KDEuODg3KSBpcyB0aGUgbWF4aW11bSBvZiB0aGUgcHNldWRvcmFuZG9tCisgKiB3aGl0ZSBzZXF1ZW5jZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBzY2FsZWQgY29kZWJvb2sKKyAqIHZlY3RvciBmb3IgYml0cmF0ZSAxLzQuCisgKgorICogVElBL0VJQS9JUy03MzMgMi40LjguMS4yCisgKi8KKyNkZWZpbmUgUUNFTFBfU1FSVDE4ODcgMS4zNzM2ODExODYKKworLyoqCisgKiBUYWJsZSBmb3IgaW1wdWxzZSByZXNwb25zZSBvZiBCUEYgdXNlZCB0byBmaWx0ZXIKKyAqIHRoZSB3aGl0ZSBleGNpdGF0aW9uIGZvciBiaXRyYXRlIDEvNCBzeW50aGVzaXMKKyAqCisgKiBPbmx5IGhhbGYgdGhlIHRhYmxlcyBhcmUgbmVlZGVkIGJlY2F1c2Ugb2Ygc3ltbWV0cnkuCisgKgorICogVElBL0VJQS9JUy03MzMgMi40LjguMS4yLTEuMQorICovCitzdGF0aWMgY29uc3QgZG91YmxlIHFjZWxwX3JuZF9maXJfY29lZnNbMTFdID0geworICAtMS4zNDQ1MTllLTEsIDEuNzM1Mzg0ZS0yLCAtNi45MDU4MjZlLTIsIDIuNDM0MzY4ZS0yLAorICAtOC4yMTA3MDFlLTIsIDMuMDQxMzg4ZS0yLCAtOS4yNTEzODRlLTIsIDMuNTAxOTgzZS0yLAorICAtOS45MTg3NzdlLTIsIDMuNzQ5NTE4ZS0yLCAgOC45ODUxMzdlLTEKK307CisKKy8qKgorICogVGhpcyBzcHJlYWQgZmFjdG9yIGlzIHVzZWQsIGZvciBiaXRyYXRlIDEvOCBhbmQgSV9GX1EsCisgKiB0byBmb3JjZSBMU1AgZnJlcXVlbmNpZXMgdG8gYmUgYXQgbGVhc3QgODAgSHogYXBhcnQuCisgKgorICogVElBL0VJQS9JUy03MzMgMi40LjMuMy4yCisgKi8KKyNkZWZpbmUgUUNFTFBfTFNQX1NQUkVBRF9GQUNUT1IgMC4wMgorCisvKioKKyAqIFByZWRpY3RvciBjb2VmZmljaWVudCBmb3IgdGhlIGNvbnZlcnNpb24gb2YgTFNQIGNvZGVzCisgKiB0byBMU1AgZnJlcXVlbmNpZXMgZm9yIDEvOCBhbmQgSV9GX1EKKyAqCisgKiBUSUEvRUlBL0lTLTczMyAyLjQuMy4yLjctMgorICovCisjZGVmaW5lIFFDRUxQX0xTUF9PQ1RBVkVfUFJFRElDVE9SIDI5LjAvMzIKKworLyoqCisgKiBJbml0aWFsIGNvZWZmaWNpZW50IHRvIHBlcmZvcm0gYmFuZHdpZHRoIGV4cGFuc2lvbiBvbiBMUEMKKyAqCisgKiBAbm90ZTogMC45ODgzIGxvb2tzIGxpa2UgYW4gYXBwcm94aW1hdGlvbiBvZiAyNTMvMjU2LgorICoKKyAqIFRJQS9FSUEvSVMtNzMzIDIuNC4zLjMuNiA2CisgKi8KKyNkZWZpbmUgUUNFTFBfQkFORFdJRFRIX0VYUEFOU0lPTl9DT0VGRiAwLjk4ODMKKworI2VuZGlmIC8qIEFWQ09ERUNfUUNFTFBEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3FjZWxwZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9xY2VscGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDg2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9xY2VscGRlYy5jCkBAIC0wLDAgKzEsODAxIEBACisvKgorICogUUNFTFAgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUUNFTFAgZGVjb2RlcgorICogQGF1dGhvciBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0CisgKiBAcmVtYXJrIEZGbXBlZyBtZXJnaW5nIHNwZWFyaGVhZGVkIGJ5IEtlbmFuIEdpbGxldAorICogQHJlbWFyayBEZXZlbG9wbWVudCBtZW50b3JlZCBieSBCZW5qYW1pbiBMYXJzb24KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJxY2VscGRhdGEuaCIKKyNpbmNsdWRlICJjZWxwX2ZpbHRlcnMuaCIKKyNpbmNsdWRlICJhY2VscF9maWx0ZXJzLmgiCisjaW5jbHVkZSAiYWNlbHBfdmVjdG9ycy5oIgorI2luY2x1ZGUgImxzcC5oIgorCit0eXBlZGVmIGVudW0geworICAgIElfRl9RID0gLTEsICAgIC8qKjwgaW5zdWZmaWNpZW50IGZyYW1lIHF1YWxpdHkgKi8KKyAgICBTSUxFTkNFLAorICAgIFJBVEVfT0NUQVZFLAorICAgIFJBVEVfUVVBUlRFUiwKKyAgICBSQVRFX0hBTEYsCisgICAgUkFURV9GVUxMCit9IHFjZWxwX3BhY2tldF9yYXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgR2V0Qml0Q29udGV4dCAgICAgZ2I7CisgICAgcWNlbHBfcGFja2V0X3JhdGUgYml0cmF0ZTsKKyAgICBRQ0VMUEZyYW1lICAgICAgICBmcmFtZTsgICAgLyoqPCB1bnBhY2tlZCBkYXRhIGZyYW1lICovCisKKyAgICB1aW50OF90ICBlcmFzdXJlX2NvdW50OworICAgIHVpbnQ4X3QgIG9jdGF2ZV9jb3VudDsgICAgICAvKio8IGNvdW50IHRoZSBjb25zZWN1dGl2ZSBSQVRFX09DVEFWRSBmcmFtZXMgKi8KKyAgICBmbG9hdCAgICBwcmV2X2xzcGZbMTBdOworICAgIGZsb2F0ICAgIHByZWRpY3Rvcl9sc3BmWzEwXTsvKio8IExTUCBwcmVkaWN0b3IgZm9yIFJBVEVfT0NUQVZFIGFuZCBJX0ZfUSAqLworICAgIGZsb2F0ICAgIHBpdGNoX3N5bnRoZXNpc19maWx0ZXJfbWVtWzMwM107CisgICAgZmxvYXQgICAgcGl0Y2hfcHJlX2ZpbHRlcl9tZW1bMzAzXTsKKyAgICBmbG9hdCAgICBybmRfZmlyX2ZpbHRlcl9tZW1bMTgwXTsKKyAgICBmbG9hdCAgICBmb3JtYW50X21lbVsxNzBdOworICAgIGZsb2F0ICAgIGxhc3RfY29kZWJvb2tfZ2FpbjsKKyAgICBpbnQgICAgICBwcmV2X2cxWzJdOworICAgIGludCAgICAgIHByZXZfYml0cmF0ZTsKKyAgICBmbG9hdCAgICBwaXRjaF9nYWluWzRdOworICAgIHVpbnQ4X3QgIHBpdGNoX2xhZ1s0XTsKKyAgICB1aW50MTZfdCBmaXJzdDE2Yml0czsKKyAgICB1aW50OF90ICB3YXJuZWRfYnVmX21pc21hdGNoX2JpdHJhdGU7CisKKyAgICAvKiBwb3N0ZmlsdGVyICovCisgICAgZmxvYXQgICAgcG9zdGZpbHRlcl9zeW50aF9tZW1bMTBdOworICAgIGZsb2F0ICAgIHBvc3RmaWx0ZXJfYWdjX21lbTsKKyAgICBmbG9hdCAgICBwb3N0ZmlsdGVyX3RpbHRfbWVtOworfSBRQ0VMUENvbnRleHQ7CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgc3BlZWNoIGNvZGVjIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBUSUEvRUlBL0lTLTczMyAyLjQuOQorICovCitzdGF0aWMgYXZfY29sZCBpbnQgcWNlbHBfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFFDRUxQQ29udGV4dCAqcSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBhdmN0eC0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIGF2Y3R4LT5zYW1wbGVfZm10ICAgICA9IEFWX1NBTVBMRV9GTVRfRkxUOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisgICAgICAgIHEtPnByZXZfbHNwZltpXSA9IChpICsgMSkgLyAxMS4wOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVjb2RlIHRoZSAxMCBxdWFudGl6ZWQgTFNQIGZyZXF1ZW5jaWVzIGZyb20gdGhlIExTUFYvTFNQCisgKiB0cmFuc21pc3Npb24gY29kZXMgb2YgYW55IGJpdHJhdGUgYW5kIGNoZWNrIGZvciBiYWRseSByZWNlaXZlZCBwYWNrZXRzLgorICoKKyAqIEBwYXJhbSBxIHRoZSBjb250ZXh0CisgKiBAcGFyYW0gbHNwZiBsaW5lIHNwZWN0cmFsIHBhaXIgZnJlcXVlbmNpZXMKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgaWYgdGhlIHBhY2tldCBpcyBiYWRseSByZWNlaXZlZAorICoKKyAqIFRJQS9FSUEvSVMtNzMzIDIuNC4zLjIuNi4yLTIsIDIuNC44LjcuMworICovCitzdGF0aWMgaW50IGRlY29kZV9sc3BmKFFDRUxQQ29udGV4dCAqcSwgZmxvYXQgKmxzcGYpCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgdG1wX2xzcGYsIHNtb290aCwgZXJhc3VyZV9jb2VmZjsKKyAgICBjb25zdCBmbG9hdCAqcHJlZGljdG9yczsKKworICAgIGlmIChxLT5iaXRyYXRlID09IFJBVEVfT0NUQVZFIHx8IHEtPmJpdHJhdGUgPT0gSV9GX1EpIHsKKyAgICAgICAgcHJlZGljdG9ycyA9IHEtPnByZXZfYml0cmF0ZSAhPSBSQVRFX09DVEFWRSAmJgorICAgICAgICAgICAgICAgICAgICAgcS0+cHJldl9iaXRyYXRlICE9IElfRl9RID8gcS0+cHJldl9sc3BmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBxLT5wcmVkaWN0b3JfbHNwZjsKKworICAgICAgICBpZiAocS0+Yml0cmF0ZSA9PSBSQVRFX09DVEFWRSkgeworICAgICAgICAgICAgcS0+b2N0YXZlX2NvdW50Kys7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcS0+cHJlZGljdG9yX2xzcGZbaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3BmW2ldID0gKHEtPmZyYW1lLmxzcHZbaV0gPyAgUUNFTFBfTFNQX1NQUkVBRF9GQUNUT1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLVFDRUxQX0xTUF9TUFJFQURfRkFDVE9SKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1tpXSAqIFFDRUxQX0xTUF9PQ1RBVkVfUFJFRElDVE9SICAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICsgMSkgKiAoKDEgLSBRQ0VMUF9MU1BfT0NUQVZFX1BSRURJQ1RPUikgLyAxMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbW9vdGggPSBxLT5vY3RhdmVfY291bnQgPCAxMCA/IC44NzUgOiAwLjE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcmFzdXJlX2NvZWZmID0gUUNFTFBfTFNQX09DVEFWRV9QUkVESUNUT1I7CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDIocS0+Yml0cmF0ZSA9PSBJX0ZfUSk7CisKKyAgICAgICAgICAgIGlmIChxLT5lcmFzdXJlX2NvdW50ID4gMSkKKyAgICAgICAgICAgICAgICBlcmFzdXJlX2NvZWZmICo9IHEtPmVyYXN1cmVfY291bnQgPCA0ID8gMC45IDogMC43OworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgICAgIHEtPnByZWRpY3Rvcl9sc3BmW2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNwZltpXSA9IChpICsgMSkgKiAoMSAtIGVyYXN1cmVfY29lZmYpIC8gMTEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJhc3VyZV9jb2VmZiAqIHByZWRpY3RvcnNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbW9vdGggPSAwLjEyNTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSBzdGFiaWxpdHkgb2YgdGhlIExTUCBmcmVxdWVuY2llcy4KKyAgICAgICAgbHNwZlswXSA9IEZGTUFYKGxzcGZbMF0sIFFDRUxQX0xTUF9TUFJFQURfRkFDVE9SKTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDEwOyBpKyspCisgICAgICAgICAgICBsc3BmW2ldID0gRkZNQVgobHNwZltpXSwgbHNwZltpIC0gMV0gKyBRQ0VMUF9MU1BfU1BSRUFEX0ZBQ1RPUik7CisKKyAgICAgICAgbHNwZls5XSA9IEZGTUlOKGxzcGZbOV0sIDEuMCAtIFFDRUxQX0xTUF9TUFJFQURfRkFDVE9SKTsKKyAgICAgICAgZm9yIChpID0gOTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIGxzcGZbaSAtIDFdID0gRkZNSU4obHNwZltpIC0gMV0sIGxzcGZbaV0gLSBRQ0VMUF9MU1BfU1BSRUFEX0ZBQ1RPUik7CisKKyAgICAgICAgLy8gTG93LXBhc3MgZmlsdGVyIHRoZSBMU1AgZnJlcXVlbmNpZXMuCisgICAgICAgIGZmX3dlaWdodGVkX3ZlY3Rvcl9zdW1mKGxzcGYsIGxzcGYsIHEtPnByZXZfbHNwZiwgc21vb3RoLCAxLjAgLSBzbW9vdGgsIDEwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBxLT5vY3RhdmVfY291bnQgPSAwOworCisgICAgICAgIHRtcF9sc3BmID0gMC4wOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBsc3BmWzIgKiBpICsgMF0gPSB0bXBfbHNwZiArPSBxY2VscF9sc3B2cVtpXVtxLT5mcmFtZS5sc3B2W2ldXVswXSAqIDAuMDAwMTsKKyAgICAgICAgICAgIGxzcGZbMiAqIGkgKyAxXSA9IHRtcF9sc3BmICs9IHFjZWxwX2xzcHZxW2ldW3EtPmZyYW1lLmxzcHZbaV1dWzFdICogMC4wMDAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGJhZGx5IHJlY2VpdmVkIHBhY2tldHMuCisgICAgICAgIGlmIChxLT5iaXRyYXRlID09IFJBVEVfUVVBUlRFUikgeworICAgICAgICAgICAgaWYgKGxzcGZbOV0gPD0gLjcwIHx8IGxzcGZbOV0gPj0gLjk3KQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGZvciAoaSA9IDM7IGkgPCAxMDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChmYWJzKGxzcGZbaV0gLSBsc3BmW2kgLSAyXSkgPCAuMDgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsc3BmWzldIDw9IC42NiB8fCBsc3BmWzldID49IC45ODUpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgZm9yIChpID0gNDsgaSA8IDEwOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGZhYnMobHNwZltpXSAtIGxzcGZbaSAtIDRdKSA8IC4wOTMxKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29udmVydCBjb2RlYm9vayB0cmFuc21pc3Npb24gY29kZXMgdG8gR0FJTiBhbmQgSU5ERVguCisgKgorICogQHBhcmFtIHEgdGhlIGNvbnRleHQKKyAqIEBwYXJhbSBnYWluIGFycmF5IGhvbGRpbmcgdGhlIGRlY29kZWQgZ2FpbgorICoKKyAqIFRJQS9FSUEvSVMtNzMzIDIuNC42LjIKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX2dhaW5fYW5kX2luZGV4KFFDRUxQQ29udGV4dCAqcSwgZmxvYXQgKmdhaW4pCit7CisgICAgaW50IGksIHN1YmZyYW1lc19jb3VudCwgZzFbMTZdOworICAgIGZsb2F0IHNsb3BlOworCisgICAgaWYgKHEtPmJpdHJhdGUgPj0gUkFURV9RVUFSVEVSKSB7CisgICAgICAgIHN3aXRjaCAocS0+Yml0cmF0ZSkgeworICAgICAgICBjYXNlIFJBVEVfRlVMTDogc3ViZnJhbWVzX2NvdW50ID0gMTY7IGJyZWFrOworICAgICAgICBjYXNlIFJBVEVfSEFMRjogc3ViZnJhbWVzX2NvdW50ID0gIDQ7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgICAgICAgc3ViZnJhbWVzX2NvdW50ID0gIDU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1YmZyYW1lc19jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBnMVtpXSA9IDQgKiBxLT5mcmFtZS5jYmdhaW5baV07CisgICAgICAgICAgICBpZiAocS0+Yml0cmF0ZSA9PSBSQVRFX0ZVTEwgJiYgISgoaSArIDEpICYgMykpIHsKKyAgICAgICAgICAgICAgICBnMVtpXSArPSBhdl9jbGlwKChnMVtpIC0gMV0gKyBnMVtpIC0gMl0gKyBnMVtpIC0gM10pIC8gMyAtIDYsIDAsIDMyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2FpbltpXSA9IHFjZWxwX2cxMmdhW2cxW2ldXTsKKworICAgICAgICAgICAgaWYgKHEtPmZyYW1lLmNic2lnbltpXSkgeworICAgICAgICAgICAgICAgIGdhaW5baV0gPSAtZ2FpbltpXTsKKyAgICAgICAgICAgICAgICBxLT5mcmFtZS5jaW5kZXhbaV0gPSAocS0+ZnJhbWUuY2luZGV4W2ldIC0gODkpICYgMTI3OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcS0+cHJldl9nMVswXSAgICAgICAgID0gZzFbaSAtIDJdOworICAgICAgICBxLT5wcmV2X2cxWzFdICAgICAgICAgPSBnMVtpIC0gMV07CisgICAgICAgIHEtPmxhc3RfY29kZWJvb2tfZ2FpbiA9IHFjZWxwX2cxMmdhW2cxW2kgLSAxXV07CisKKyAgICAgICAgaWYgKHEtPmJpdHJhdGUgPT0gUkFURV9RVUFSVEVSKSB7CisgICAgICAgICAgICAvLyBQcm92aWRlIHNtb290aGluZyBvZiB0aGUgdW52b2ljZWQgZXhjaXRhdGlvbiBlbmVyZ3kuCisgICAgICAgICAgICBnYWluWzddID0gICAgICAgZ2Fpbls0XTsKKyAgICAgICAgICAgIGdhaW5bNl0gPSAwLjQgKiBnYWluWzNdICsgMC42ICogZ2Fpbls0XTsKKyAgICAgICAgICAgIGdhaW5bNV0gPSAgICAgICBnYWluWzNdOworICAgICAgICAgICAgZ2Fpbls0XSA9IDAuOCAqIGdhaW5bMl0gKyAwLjIgKiBnYWluWzNdOworICAgICAgICAgICAgZ2FpblszXSA9IDAuMiAqIGdhaW5bMV0gKyAwLjggKiBnYWluWzJdOworICAgICAgICAgICAgZ2FpblsyXSA9ICAgICAgIGdhaW5bMV07CisgICAgICAgICAgICBnYWluWzFdID0gMC42ICogZ2FpblswXSArIDAuNCAqIGdhaW5bMV07CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHEtPmJpdHJhdGUgIT0gU0lMRU5DRSkgeworICAgICAgICBpZiAocS0+Yml0cmF0ZSA9PSBSQVRFX09DVEFWRSkgeworICAgICAgICAgICAgZzFbMF0gPSAyICogcS0+ZnJhbWUuY2JnYWluWzBdICsKKyAgICAgICAgICAgICAgICAgICAgYXZfY2xpcCgocS0+cHJldl9nMVswXSArIHEtPnByZXZfZzFbMV0pIC8gMiAtIDUsIDAsIDU0KTsKKyAgICAgICAgICAgIHN1YmZyYW1lc19jb3VudCA9IDg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9hc3NlcnQyKHEtPmJpdHJhdGUgPT0gSV9GX1EpOworCisgICAgICAgICAgICBnMVswXSA9IHEtPnByZXZfZzFbMV07CisgICAgICAgICAgICBzd2l0Y2ggKHEtPmVyYXN1cmVfY291bnQpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDogZzFbMF0gLT0gMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOiBnMVswXSAtPSAyOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGcxWzBdIC09IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZzFbMF0gPCAwKQorICAgICAgICAgICAgICAgIGcxWzBdID0gMDsKKyAgICAgICAgICAgIHN1YmZyYW1lc19jb3VudCA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBpbnRlcnBvbGF0aW9uIGlzIGRvbmUgdG8gcHJvZHVjZSBzbW9vdGhlciBiYWNrZ3JvdW5kIG5vaXNlLgorICAgICAgICBzbG9wZSA9IDAuNSAqIChxY2VscF9nMTJnYVtnMVswXV0gLSBxLT5sYXN0X2NvZGVib29rX2dhaW4pIC8gc3ViZnJhbWVzX2NvdW50OworICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IHN1YmZyYW1lc19jb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIGdhaW5baSAtIDFdID0gcS0+bGFzdF9jb2RlYm9va19nYWluICsgc2xvcGUgKiBpOworCisgICAgICAgIHEtPmxhc3RfY29kZWJvb2tfZ2FpbiA9IGdhaW5baSAtIDJdOworICAgICAgICBxLT5wcmV2X2cxWzBdICAgICAgICAgPSBxLT5wcmV2X2cxWzFdOworICAgICAgICBxLT5wcmV2X2cxWzFdICAgICAgICAgPSBnMVswXTsKKyAgICB9Cit9CisKKy8qKgorICogSWYgdGhlIHJlY2VpdmVkIHBhY2tldCBpcyBSYXRlIDEvNCBhIGZ1cnRoZXIgc2FuaXR5IGNoZWNrIGlzIG1hZGUgb2YgdGhlCisgKiBjb2RlYm9vayBnYWluLgorICoKKyAqIEBwYXJhbSBjYmdhaW4gdGhlIHVucGFja2VkIGNiZ2FpbiBhcnJheQorICogQHJldHVybiAtMSBpZiB0aGUgc2FuaXR5IGNoZWNrIGZhaWxzLCAwIG90aGVyd2lzZQorICoKKyAqIFRJQS9FSUEvSVMtNzMzIDIuNC44LjcuMworICovCitzdGF0aWMgaW50IGNvZGVib29rX3Nhbml0eV9jaGVja19mb3JfcmF0ZV9xdWFydGVyKGNvbnN0IHVpbnQ4X3QgKmNiZ2FpbikKK3sKKyAgICBpbnQgaSwgZGlmZiwgcHJldl9kaWZmID0gMDsKKworICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgZGlmZiA9IGNiZ2FpbltpXSAtIGNiZ2FpbltpLTFdOworICAgICAgICBpZiAoRkZBQlMoZGlmZikgPiAxMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZWxzZSBpZiAoRkZBQlMoZGlmZiAtIHByZXZfZGlmZikgPiAxMikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcHJldl9kaWZmID0gZGlmZjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29tcHV0ZSB0aGUgc2NhbGVkIGNvZGVib29rIHZlY3RvciBDZG4gRnJvbSBJTkRFWCBhbmQgR0FJTgorICogZm9yIGFsbCByYXRlcy4KKyAqCisgKiBUaGUgc3BlY2lmaWNhdGlvbiBsYWNrcyBzb21lIGluZm9ybWF0aW9uIGhlcmUuCisgKgorICogVElBL0VJQS9JUy03MzMgaGFzIGFuIG9taXNzaW9uIG9uIHRoZSBjb2RlYm9vayBpbmRleCBkZXRlcm1pbmF0aW9uCisgKiBmb3JtdWxhIGZvciBSQVRFX0ZVTEwgYW5kIFJBVEVfSEFMRiBmcmFtZXMgYXQgc2VjdGlvbiAyLjQuOC4xLjEuIEl0IHNheXMKKyAqIHlvdSBoYXZlIHRvIHN1YnRyYWN0IHRoZSBkZWNvZGVkIGluZGV4IHBhcmFtZXRlciBmcm9tIHRoZSBnaXZlbiBzY2FsZWQKKyAqIGNvZGVib29rIHZlY3RvciBpbmRleCAnbicgdG8gZ2V0IHRoZSBkZXNpcmVkIGNpcmN1bGFyIGNvZGVib29rIGluZGV4LCBidXQKKyAqIGl0IGRvZXMgbm90IG1lbnRpb24gdGhhdCB5b3UgaGF2ZSB0byBjbGFtcCAnbicgdG8gWzAtOV0gaW4gb3JkZXIgdG8gZ2V0CisgKiBSSS1jb21wbGlhbnQgcmVzdWx0cy4KKyAqCisgKiBUaGUgcmVhc29uIGZvciB0aGlzIG1pc3Rha2Ugc2VlbXMgdG8gYmUgdGhlIGZhY3QgdGhleSBmb3Jnb3QgdG8gbWVudGlvbiB5b3UKKyAqIGhhdmUgdG8gZG8gdGhlc2UgY2FsY3VsYXRpb25zIHBlciBjb2RlYm9vayBzdWJmcmFtZSBhbmQgYWRqdXN0IGdpdmVuCisgKiBlcXVhdGlvbiB2YWx1ZXMgYWNjb3JkaW5nbHkuCisgKgorICogQHBhcmFtIHEgdGhlIGNvbnRleHQKKyAqIEBwYXJhbSBnYWluIGFycmF5IGhvbGRpbmcgdGhlIDQgcGl0Y2ggc3ViZnJhbWUgZ2FpbiB2YWx1ZXMKKyAqIEBwYXJhbSBjZG5fdmVjdG9yIGFycmF5IGZvciB0aGUgZ2VuZXJhdGVkIHNjYWxlZCBjb2RlYm9vayB2ZWN0b3IKKyAqLworc3RhdGljIHZvaWQgY29tcHV0ZV9zdmVjdG9yKFFDRUxQQ29udGV4dCAqcSwgY29uc3QgZmxvYXQgKmdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNkbl92ZWN0b3IpCit7CisgICAgaW50IGksIGosIGs7CisgICAgdWludDE2X3QgY2JzZWVkLCBjaW5kZXg7CisgICAgZmxvYXQgKnJuZCwgdG1wX2dhaW4sIGZpcl9maWx0ZXJfdmFsdWU7CisKKyAgICBzd2l0Y2ggKHEtPmJpdHJhdGUpIHsKKyAgICBjYXNlIFJBVEVfRlVMTDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgIHRtcF9nYWluID0gZ2FpbltpXSAqIFFDRUxQX1JBVEVfRlVMTF9DT0RFQk9PS19SQVRJTzsKKyAgICAgICAgICAgIGNpbmRleCAgID0gLXEtPmZyYW1lLmNpbmRleFtpXTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMDsgaisrKQorICAgICAgICAgICAgICAgICpjZG5fdmVjdG9yKysgPSB0bXBfZ2FpbiAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjZWxwX3JhdGVfZnVsbF9jb2RlYm9va1tjaW5kZXgrKyAmIDEyN107CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQVRFX0hBTEY6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIHRtcF9nYWluID0gZ2FpbltpXSAqIFFDRUxQX1JBVEVfSEFMRl9DT0RFQk9PS19SQVRJTzsKKyAgICAgICAgICAgIGNpbmRleCAgID0gLXEtPmZyYW1lLmNpbmRleFtpXTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0MDsgaisrKQorICAgICAgICAgICAgICAgICpjZG5fdmVjdG9yKysgPSB0bXBfZ2FpbiAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjZWxwX3JhdGVfaGFsZl9jb2RlYm9va1tjaW5kZXgrKyAmIDEyN107CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQVRFX1FVQVJURVI6CisgICAgICAgIGNic2VlZCA9ICgweDAwMDMgJiBxLT5mcmFtZS5sc3B2WzRdKSA8PCAxNCB8CisgICAgICAgICAgICAgICAgICgweDAwM0YgJiBxLT5mcmFtZS5sc3B2WzNdKSA8PCAgOCB8CisgICAgICAgICAgICAgICAgICgweDAwNjAgJiBxLT5mcmFtZS5sc3B2WzJdKSA8PCAgMSB8CisgICAgICAgICAgICAgICAgICgweDAwMDcgJiBxLT5mcmFtZS5sc3B2WzFdKSA8PCAgMyB8CisgICAgICAgICAgICAgICAgICgweDAwMzggJiBxLT5mcmFtZS5sc3B2WzBdKSA+PiAgMzsKKyAgICAgICAgcm5kICAgID0gcS0+cm5kX2Zpcl9maWx0ZXJfbWVtICsgMjA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIHRtcF9nYWluID0gZ2FpbltpXSAqIChRQ0VMUF9TUVJUMTg4NyAvIDMyNzY4LjApOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDIwOyBrKyspIHsKKyAgICAgICAgICAgICAgICBjYnNlZWQgPSA1MjEgKiBjYnNlZWQgKyAyNTk7CisgICAgICAgICAgICAgICAgKnJuZCAgID0gKGludDE2X3QpIGNic2VlZDsKKworICAgICAgICAgICAgICAgICAgICAvLyBGSVIgZmlsdGVyCisgICAgICAgICAgICAgICAgZmlyX2ZpbHRlcl92YWx1ZSA9IDAuMDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTA7IGorKykKKyAgICAgICAgICAgICAgICAgICAgZmlyX2ZpbHRlcl92YWx1ZSArPSBxY2VscF9ybmRfZmlyX2NvZWZzW2pdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocm5kWy1qXSArIHJuZFstMjAral0pOworCisgICAgICAgICAgICAgICAgZmlyX2ZpbHRlcl92YWx1ZSArPSBxY2VscF9ybmRfZmlyX2NvZWZzWzEwXSAqIHJuZFstMTBdOworICAgICAgICAgICAgICAgICpjZG5fdmVjdG9yKysgICAgID0gdG1wX2dhaW4gKiBmaXJfZmlsdGVyX3ZhbHVlOworICAgICAgICAgICAgICAgIHJuZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1lbWNweShxLT5ybmRfZmlyX2ZpbHRlcl9tZW0sIHEtPnJuZF9maXJfZmlsdGVyX21lbSArIDE2MCwKKyAgICAgICAgICAgICAgIDIwICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFURV9PQ1RBVkU6CisgICAgICAgIGNic2VlZCA9IHEtPmZpcnN0MTZiaXRzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICB0bXBfZ2FpbiA9IGdhaW5baV0gKiAoUUNFTFBfU1FSVDE4ODcgLyAzMjc2OC4wKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyMDsgaisrKSB7CisgICAgICAgICAgICAgICAgY2JzZWVkICAgICAgICA9IDUyMSAqIGNic2VlZCArIDI1OTsKKyAgICAgICAgICAgICAgICAqY2RuX3ZlY3RvcisrID0gdG1wX2dhaW4gKiAoaW50MTZfdCkgY2JzZWVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSV9GX1E6CisgICAgICAgIGNic2VlZCA9IC00NDsgLy8gcmFuZG9tIGNvZGVib29rIGluZGV4CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIHRtcF9nYWluID0gZ2FpbltpXSAqIFFDRUxQX1JBVEVfRlVMTF9DT0RFQk9PS19SQVRJTzsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0MDsgaisrKQorICAgICAgICAgICAgICAgICpjZG5fdmVjdG9yKysgPSB0bXBfZ2FpbiAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjZWxwX3JhdGVfZnVsbF9jb2RlYm9va1tjYnNlZWQrKyAmIDEyN107CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTSUxFTkNFOgorICAgICAgICBtZW1zZXQoY2RuX3ZlY3RvciwgMCwgMTYwICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqCisgKiBBcHBseSBnZW5lcmljIGdhaW4gY29udHJvbC4KKyAqCisgKiBAcGFyYW0gdl9vdXQgb3V0cHV0IHZlY3RvcgorICogQHBhcmFtIHZfaW4gZ2Fpbi1jb250cm9sbGVkIHZlY3RvcgorICogQHBhcmFtIHZfcmVmIHZlY3RvciB0byBjb250cm9sIGdhaW4gb2YKKyAqCisgKiBUSUEvRUlBL0lTLTczMyAyLjQuOC4zLCAyLjQuOC42CisgKi8KK3N0YXRpYyB2b2lkIGFwcGx5X2dhaW5fY3RybChmbG9hdCAqdl9vdXQsIGNvbnN0IGZsb2F0ICp2X3JlZiwgY29uc3QgZmxvYXQgKnZfaW4pCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTYwOyBpICs9IDQwKSB7CisgICAgICAgIGZsb2F0IHJlcyA9IGF2cHJpdl9zY2FsYXJwcm9kdWN0X2Zsb2F0X2Modl9yZWYgKyBpLCB2X3JlZiArIGksIDQwKTsKKyAgICAgICAgZmZfc2NhbGVfdmVjdG9yX3RvX2dpdmVuX3N1bV9vZl9zcXVhcmVzKHZfb3V0ICsgaSwgdl9pbiArIGksIHJlcywgNDApOworICAgIH0KK30KKworLyoqCisgKiBBcHBseSBmaWx0ZXIgaW4gcGl0Y2gtc3ViZnJhbWUgc3RlcHMuCisgKgorICogQHBhcmFtIG1lbW9yeSBidWZmZXIgZm9yIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgZmlsdGVyCisgKiAgICAgICAgLSBtdXN0IGJlIGFibGUgdG8gY29udGFpbiAzMDMgZWxlbWVudHMKKyAqICAgICAgICAtIHRoZSAxNDMgZmlyc3QgZWxlbWVudHMgYXJlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlCisgKiAgICAgICAgLSB0aGUgbmV4dCAxNjAgYXJlIGZvciBvdXRwdXQKKyAqIEBwYXJhbSB2X2luIGlucHV0IGZpbHRlciB2ZWN0b3IKKyAqIEBwYXJhbSBnYWluIHBlci1zdWJmcmFtZSBnYWluIGFycmF5LCBlYWNoIGVsZW1lbnQgaXMgYmV0d2VlbiAwLjAgYW5kIDIuMAorICogQHBhcmFtIGxhZyBwZXItc3ViZnJhbWUgbGFnIGFycmF5LCBlYWNoIGVsZW1lbnQgaXMKKyAqICAgICAgICAtIGJldHdlZW4gMTYgYW5kIDE0MyBpZiBpdHMgY29ycmVzcG9uZGluZyBwZnJhYyBpcyAwLAorICogICAgICAgIC0gYmV0d2VlbiAxNiBhbmQgMTM5IG90aGVyd2lzZQorICogQHBhcmFtIHBmcmFjIHBlci1zdWJmcmFtZSBib29sZWFuIGFycmF5LCAxIGlmIHRoZSBsYWcgaXMgZnJhY3Rpb25hbCwgMAorICogICAgICAgIG90aGVyd2lzZQorICoKKyAqIEByZXR1cm4gZmlsdGVyIG91dHB1dCB2ZWN0b3IKKyAqLworc3RhdGljIGNvbnN0IGZsb2F0ICpkb19waXRjaGZpbHRlcihmbG9hdCBtZW1vcnlbMzAzXSwgY29uc3QgZmxvYXQgdl9pblsxNjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBnYWluWzRdLCBjb25zdCB1aW50OF90ICpsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgcGZyYWNbNF0pCit7CisgICAgaW50IGksIGo7CisgICAgZmxvYXQgKnZfbGFnLCAqdl9vdXQ7CisgICAgY29uc3QgZmxvYXQgKnZfbGVuOworCisgICAgdl9vdXQgPSBtZW1vcnkgKyAxNDM7IC8vIE91dHB1dCB2ZWN0b3Igc3RhcnRzIGF0IG1lbW9yeVsxNDNdLgorCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpZiAoZ2FpbltpXSkgeworICAgICAgICAgICAgdl9sYWcgPSBtZW1vcnkgKyAxNDMgKyA0MCAqIGkgLSBsYWdbaV07CisgICAgICAgICAgICBmb3IgKHZfbGVuID0gdl9pbiArIDQwOyB2X2luIDwgdl9sZW47IHZfaW4rKykgeworICAgICAgICAgICAgICAgIGlmIChwZnJhY1tpXSkgeyAvLyBJZiBpdCBpcyBhIGZyYWN0aW9uYWwgbGFnLi4uCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDAsICp2X291dCA9IDAuMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICp2X291dCArPSBxY2VscF9oYW1tc2luY190YWJsZVtqXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfbGFnW2ogLSA0XSArIHZfbGFnWzMgLSBqXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICp2X291dCA9ICp2X2xhZzsKKworICAgICAgICAgICAgICAgICp2X291dCA9ICp2X2luICsgZ2FpbltpXSAqICp2X291dDsKKworICAgICAgICAgICAgICAgIHZfbGFnKys7CisgICAgICAgICAgICAgICAgdl9vdXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweSh2X291dCwgdl9pbiwgNDAgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgIHZfaW4gICs9IDQwOworICAgICAgICAgICAgdl9vdXQgKz0gNDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1tb3ZlKG1lbW9yeSwgbWVtb3J5ICsgMTYwLCAxNDMgKiBzaXplb2YoZmxvYXQpKTsKKyAgICByZXR1cm4gbWVtb3J5ICsgMTQzOworfQorCisvKioKKyAqIEFwcGx5IHBpdGNoIHN5bnRoZXNpcyBmaWx0ZXIgYW5kIHBpdGNoIHByZWZpbHRlciB0byB0aGUgc2NhbGVkIGNvZGVib29rIHZlY3Rvci4KKyAqIFRJQS9FSUEvSVMtNzMzIDIuNC41LjIsIDIuNC44LjcuMgorICoKKyAqIEBwYXJhbSBxIHRoZSBjb250ZXh0CisgKiBAcGFyYW0gY2RuX3ZlY3RvciB0aGUgc2NhbGVkIGNvZGVib29rIHZlY3RvcgorICovCitzdGF0aWMgdm9pZCBhcHBseV9waXRjaF9maWx0ZXJzKFFDRUxQQ29udGV4dCAqcSwgZmxvYXQgKmNkbl92ZWN0b3IpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgZmxvYXQgKnZfc3ludGhlc2lzX2ZpbHRlcmVkLCAqdl9wcmVfZmlsdGVyZWQ7CisKKyAgICBpZiAocS0+Yml0cmF0ZSA+PSBSQVRFX0hBTEYgfHwgcS0+Yml0cmF0ZSA9PSBTSUxFTkNFIHx8CisgICAgICAgIChxLT5iaXRyYXRlID09IElfRl9RICYmIChxLT5wcmV2X2JpdHJhdGUgPj0gUkFURV9IQUxGKSkpIHsKKworICAgICAgICBpZiAocS0+Yml0cmF0ZSA+PSBSQVRFX0hBTEYpIHsKKyAgICAgICAgICAgIC8vIENvbXB1dGUgZ2FpbiAmIGxhZyBmb3IgdGhlIHdob2xlIGZyYW1lLgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgIHEtPnBpdGNoX2dhaW5baV0gPSBxLT5mcmFtZS5wbGFnW2ldID8gKHEtPmZyYW1lLnBnYWluW2ldICsgMSkgKiAwLjI1IDogMC4wOworCisgICAgICAgICAgICAgICAgcS0+cGl0Y2hfbGFnW2ldID0gcS0+ZnJhbWUucGxhZ1tpXSArIDE2OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxvYXQgbWF4X3BpdGNoX2dhaW47CisKKyAgICAgICAgICAgIGlmIChxLT5iaXRyYXRlID09IElfRl9RKSB7CisgICAgICAgICAgICAgICAgICBpZiAocS0+ZXJhc3VyZV9jb3VudCA8IDMpCisgICAgICAgICAgICAgICAgICAgICAgbWF4X3BpdGNoX2dhaW4gPSAwLjkgLSAwLjMgKiAocS0+ZXJhc3VyZV9jb3VudCAtIDEpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIG1heF9waXRjaF9nYWluID0gMC4wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKHEtPmJpdHJhdGUgPT0gU0lMRU5DRSk7CisgICAgICAgICAgICAgICAgbWF4X3BpdGNoX2dhaW4gPSAxLjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIHEtPnBpdGNoX2dhaW5baV0gPSBGRk1JTihxLT5waXRjaF9nYWluW2ldLCBtYXhfcGl0Y2hfZ2Fpbik7CisKKyAgICAgICAgICAgIG1lbXNldChxLT5mcmFtZS5wZnJhYywgMCwgc2l6ZW9mKHEtPmZyYW1lLnBmcmFjKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwaXRjaCBzeW50aGVzaXMgZmlsdGVyCisgICAgICAgIHZfc3ludGhlc2lzX2ZpbHRlcmVkID0gZG9fcGl0Y2hmaWx0ZXIocS0+cGl0Y2hfc3ludGhlc2lzX2ZpbHRlcl9tZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RuX3ZlY3RvciwgcS0+cGl0Y2hfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5waXRjaF9sYWcsIHEtPmZyYW1lLnBmcmFjKTsKKworICAgICAgICAvLyBwaXRjaCBwcmVmaWx0ZXIgdXBkYXRlCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBxLT5waXRjaF9nYWluW2ldID0gMC41ICogRkZNSU4ocS0+cGl0Y2hfZ2FpbltpXSwgMS4wKTsKKworICAgICAgICB2X3ByZV9maWx0ZXJlZCAgICAgICA9IGRvX3BpdGNoZmlsdGVyKHEtPnBpdGNoX3ByZV9maWx0ZXJfbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfc3ludGhlc2lzX2ZpbHRlcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPnBpdGNoX2dhaW4sIHEtPnBpdGNoX2xhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5mcmFtZS5wZnJhYyk7CisKKyAgICAgICAgYXBwbHlfZ2Fpbl9jdHJsKGNkbl92ZWN0b3IsIHZfc3ludGhlc2lzX2ZpbHRlcmVkLCB2X3ByZV9maWx0ZXJlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KHEtPnBpdGNoX3N5bnRoZXNpc19maWx0ZXJfbWVtLAorICAgICAgICAgICAgICAgY2RuX3ZlY3RvciArIDE3LCAxNDMgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgbWVtY3B5KHEtPnBpdGNoX3ByZV9maWx0ZXJfbWVtLCBjZG5fdmVjdG9yICsgMTcsIDE0MyAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBtZW1zZXQocS0+cGl0Y2hfZ2FpbiwgMCwgc2l6ZW9mKHEtPnBpdGNoX2dhaW4pKTsKKyAgICAgICAgbWVtc2V0KHEtPnBpdGNoX2xhZywgIDAsIHNpemVvZihxLT5waXRjaF9sYWcpKTsKKyAgICB9Cit9CisKKy8qKgorICogUmVjb25zdHJ1Y3QgTFBDIGNvZWZmaWNpZW50cyBmcm9tIHRoZSBsaW5lIHNwZWN0cmFsIHBhaXIgZnJlcXVlbmNpZXMKKyAqIGFuZCBwZXJmb3JtIGJhbmR3aWR0aCBleHBhbnNpb24uCisgKgorICogQHBhcmFtIGxzcGYgbGluZSBzcGVjdHJhbCBwYWlyIGZyZXF1ZW5jaWVzCisgKiBAcGFyYW0gbHBjIGxpbmVhciBwcmVkaWN0aXZlIGNvZGluZyBjb2VmZmljaWVudHMKKyAqCisgKiBAbm90ZTogYmFuZHdpZHRoX2V4cGFuc2lvbl9jb2VmZiBjb3VsZCBiZSBwcmVjYWxjdWxhdGVkIGludG8gYSB0YWJsZQorICogICAgICAgIGJ1dCBpdCBzZWVtcyB0byBiZSBzbG93ZXIgb24geDg2CisgKgorICogVElBL0VJQS9JUy03MzMgMi40LjMuMy41CisgKi8KK3N0YXRpYyB2b2lkIGxzcGYybHBjKGNvbnN0IGZsb2F0ICpsc3BmLCBmbG9hdCAqbHBjKQoreworICAgIGRvdWJsZSBsc3BbMTBdOworICAgIGRvdWJsZSBiYW5kd2lkdGhfZXhwYW5zaW9uX2NvZWZmID0gUUNFTFBfQkFORFdJRFRIX0VYUEFOU0lPTl9DT0VGRjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorICAgICAgICBsc3BbaV0gPSBjb3MoTV9QSSAqIGxzcGZbaV0pOworCisgICAgZmZfYWNlbHBfbHNwZDJscGMobHNwLCBscGMsIDUpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgbHBjW2ldICAgICAgICAgICAgICAgICAgICAqPSBiYW5kd2lkdGhfZXhwYW5zaW9uX2NvZWZmOworICAgICAgICBiYW5kd2lkdGhfZXhwYW5zaW9uX2NvZWZmICo9IFFDRUxQX0JBTkRXSURUSF9FWFBBTlNJT05fQ09FRkY7CisgICAgfQorfQorCisvKioKKyAqIEludGVycG9sYXRlIExTUCBmcmVxdWVuY2llcyBhbmQgY29tcHV0ZSBMUEMgY29lZmZpY2llbnRzCisgKiBmb3IgYSBnaXZlbiBiaXRyYXRlICYgcGl0Y2ggc3ViZnJhbWUuCisgKgorICogVElBL0VJQS9JUy03MzMgMi40LjMuMy40LCAyLjQuOC43LjIKKyAqCisgKiBAcGFyYW0gcSB0aGUgY29udGV4dAorICogQHBhcmFtIGN1cnJfbHNwZiBMU1AgZnJlcXVlbmNpZXMgdmVjdG9yIG9mIHRoZSBjdXJyZW50IGZyYW1lCisgKiBAcGFyYW0gbHBjIGZsb2F0IHZlY3RvciBmb3IgdGhlIHJlc3VsdGluZyBMUEMKKyAqIEBwYXJhbSBzdWJmcmFtZV9udW0gZnJhbWUgbnVtYmVyIGluIGRlY29kZWQgc3RyZWFtCisgKi8KK3N0YXRpYyB2b2lkIGludGVycG9sYXRlX2xwYyhRQ0VMUENvbnRleHQgKnEsIGNvbnN0IGZsb2F0ICpjdXJyX2xzcGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmxwYywgY29uc3QgaW50IHN1YmZyYW1lX251bSkKK3sKKyAgICBmbG9hdCBpbnRlcnBvbGF0ZWRfbHNwZlsxMF07CisgICAgZmxvYXQgd2VpZ2h0OworCisgICAgaWYgKHEtPmJpdHJhdGUgPj0gUkFURV9RVUFSVEVSKQorICAgICAgICB3ZWlnaHQgPSAwLjI1ICogKHN1YmZyYW1lX251bSArIDEpOworICAgIGVsc2UgaWYgKHEtPmJpdHJhdGUgPT0gUkFURV9PQ1RBVkUgJiYgIXN1YmZyYW1lX251bSkKKyAgICAgICAgd2VpZ2h0ID0gMC42MjU7CisgICAgZWxzZQorICAgICAgICB3ZWlnaHQgPSAxLjA7CisKKyAgICBpZiAod2VpZ2h0ICE9IDEuMCkgeworICAgICAgICBmZl93ZWlnaHRlZF92ZWN0b3Jfc3VtZihpbnRlcnBvbGF0ZWRfbHNwZiwgY3Vycl9sc3BmLCBxLT5wcmV2X2xzcGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCwgMS4wIC0gd2VpZ2h0LCAxMCk7CisgICAgICAgIGxzcGYybHBjKGludGVycG9sYXRlZF9sc3BmLCBscGMpOworICAgIH0gZWxzZSBpZiAocS0+Yml0cmF0ZSA+PSBSQVRFX1FVQVJURVIgfHwKKyAgICAgICAgICAgICAgIChxLT5iaXRyYXRlID09IElfRl9RICYmICFzdWJmcmFtZV9udW0pKQorICAgICAgICBsc3BmMmxwYyhjdXJyX2xzcGYsIGxwYyk7CisgICAgZWxzZSBpZiAocS0+Yml0cmF0ZSA9PSBTSUxFTkNFICYmICFzdWJmcmFtZV9udW0pCisgICAgICAgIGxzcGYybHBjKHEtPnByZXZfbHNwZiwgbHBjKTsKK30KKworc3RhdGljIHFjZWxwX3BhY2tldF9yYXRlIGJ1Zl9zaXplMmJpdHJhdGUoY29uc3QgaW50IGJ1Zl9zaXplKQoreworICAgIHN3aXRjaCAoYnVmX3NpemUpIHsKKyAgICBjYXNlIDM1OiByZXR1cm4gUkFURV9GVUxMOworICAgIGNhc2UgMTc6IHJldHVybiBSQVRFX0hBTEY7CisgICAgY2FzZSAgODogcmV0dXJuIFJBVEVfUVVBUlRFUjsKKyAgICBjYXNlICA0OiByZXR1cm4gUkFURV9PQ1RBVkU7CisgICAgY2FzZSAgMTogcmV0dXJuIFNJTEVOQ0U7CisgICAgfQorCisgICAgcmV0dXJuIElfRl9ROworfQorCisvKioKKyAqIERldGVybWluZSB0aGUgYml0cmF0ZSBmcm9tIHRoZSBmcmFtZSBzaXplIGFuZC9vciB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZnJhbWUuCisgKgorICogQHBhcmFtIGF2Y3R4IHRoZSBBViBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW0gYnVmX3NpemUgbGVuZ3RoIG9mIHRoZSBidWZmZXIKKyAqIEBwYXJhbSBidWYgdGhlIGJ1ZmZmZXIKKyAqCisgKiBAcmV0dXJuIHRoZSBiaXRyYXRlIG9uIHN1Y2Nlc3MsCisgKiAgICAgICAgIElfRl9RICBpZiB0aGUgYml0cmF0ZSBjYW5ub3QgYmUgc2F0aXNmYWN0b3JpbHkgZGV0ZXJtaW5lZAorICoKKyAqIFRJQS9FSUEvSVMtNzMzIDIuNC44LjcuMQorICovCitzdGF0aWMgcWNlbHBfcGFja2V0X3JhdGUgZGV0ZXJtaW5lX2JpdHJhdGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqYnVmKQoreworICAgIHFjZWxwX3BhY2tldF9yYXRlIGJpdHJhdGU7CisKKyAgICBpZiAoKGJpdHJhdGUgPSBidWZfc2l6ZTJiaXRyYXRlKGJ1Zl9zaXplKSkgPj0gMCkgeworICAgICAgICBpZiAoYml0cmF0ZSA+ICoqYnVmKSB7CisgICAgICAgICAgICBRQ0VMUENvbnRleHQgKnEgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgICAgICAgICAgaWYgKCFxLT53YXJuZWRfYnVmX21pc21hdGNoX2JpdHJhdGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkNsYWltZWQgYml0cmF0ZSBhbmQgYnVmZmVyIHNpemUgbWlzbWF0Y2guXG4iKTsKKyAgICAgICAgICAgICAgICBxLT53YXJuZWRfYnVmX21pc21hdGNoX2JpdHJhdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYml0cmF0ZSA9ICoqYnVmOworICAgICAgICB9IGVsc2UgaWYgKGJpdHJhdGUgPCAqKmJ1ZikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBpcyB0b28gc21hbGwgZm9yIHRoZSBjbGFpbWVkIGJpdHJhdGUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBJX0ZfUTsKKyAgICAgICAgfQorICAgICAgICAoKmJ1ZikrKzsKKyAgICB9IGVsc2UgaWYgKChiaXRyYXRlID0gYnVmX3NpemUyYml0cmF0ZShidWZfc2l6ZSArIDEpKSA+PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiQml0cmF0ZSBieXRlIG1pc3NpbmcsIGd1ZXNzaW5nIGJpdHJhdGUgZnJvbSBwYWNrZXQgc2l6ZS5cbiIpOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gSV9GX1E7CisKKyAgICBpZiAoYml0cmF0ZSA9PSBTSUxFTkNFKSB7CisgICAgICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhpcyB3YXJuaW5nIHdoZW4gdGVzdGVkIHdpdGggc2FtcGxlcy4KKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiQmxhbmsgZnJhbWUgaGFuZGxpbmciKTsKKyAgICB9CisgICAgcmV0dXJuIGJpdHJhdGU7Cit9CisKK3N0YXRpYyB2b2lkIHdhcm5faW5zdWZmaWNpZW50X2ZyYW1lX3F1YWxpdHkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlKQoreworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJGcmFtZSAjJWQsIElGUTogJXNcbiIsCisgICAgICAgICAgIGF2Y3R4LT5mcmFtZV9udW1iZXIsIG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZCBwb3N0ZmlsdGVyKFFDRUxQQ29udGV4dCAqcSwgZmxvYXQgKnNhbXBsZXMsIGZsb2F0ICpscGMpCit7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHBvd18wXzc3NVsxMF0gPSB7CisgICAgICAgIDAuNzc1MDAwLCAwLjYwMDYyNSwgMC40NjU0ODQsIDAuMzYwNzUwLCAwLjI3OTU4MiwKKyAgICAgICAgMC4yMTY2NzYsIDAuMTY3OTI0LCAwLjEzMDE0MSwgMC4xMDA4NTksIDAuMDc4MTY2CisgICAgfSwgcG93XzBfNjI1WzEwXSA9IHsKKyAgICAgICAgMC42MjUwMDAsIDAuMzkwNjI1LCAwLjI0NDE0MSwgMC4xNTI1ODgsIDAuMDk1MzY3LAorICAgICAgICAwLjA1OTYwNSwgMC4wMzcyNTMsIDAuMDIzMjgzLCAwLjAxNDU1MiwgMC4wMDkwOTUKKyAgICB9OworICAgIGZsb2F0IGxwY19zWzEwXSwgbHBjX3BbMTBdLCBwb2xlX291dFsxNzBdLCB6ZXJvX291dFsxNjBdOworICAgIGludCBuOworCisgICAgZm9yIChuID0gMDsgbiA8IDEwOyBuKyspIHsKKyAgICAgICAgbHBjX3Nbbl0gPSBscGNbbl0gKiBwb3dfMF82MjVbbl07CisgICAgICAgIGxwY19wW25dID0gbHBjW25dICogcG93XzBfNzc1W25dOworICAgIH0KKworICAgIGZmX2NlbHBfbHBfemVyb19zeW50aGVzaXNfZmlsdGVyZih6ZXJvX291dCwgbHBjX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPmZvcm1hbnRfbWVtICsgMTAsIDE2MCwgMTApOworICAgIG1lbWNweShwb2xlX291dCwgcS0+cG9zdGZpbHRlcl9zeW50aF9tZW0sIHNpemVvZihmbG9hdCkgKiAxMCk7CisgICAgZmZfY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZihwb2xlX291dCArIDEwLCBscGNfcCwgemVyb19vdXQsIDE2MCwgMTApOworICAgIG1lbWNweShxLT5wb3N0ZmlsdGVyX3N5bnRoX21lbSwgcG9sZV9vdXQgKyAxNjAsIHNpemVvZihmbG9hdCkgKiAxMCk7CisKKyAgICBmZl90aWx0X2NvbXBlbnNhdGlvbigmcS0+cG9zdGZpbHRlcl90aWx0X21lbSwgMC4zLCBwb2xlX291dCArIDEwLCAxNjApOworCisgICAgZmZfYWRhcHRpdmVfZ2Fpbl9jb250cm9sKHNhbXBsZXMsIHBvbGVfb3V0ICsgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9zY2FsYXJwcm9kdWN0X2Zsb2F0X2MocS0+Zm9ybWFudF9tZW0gKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5mb3JtYW50X21lbSArIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MCwgMC45Mzc1LCAmcS0+cG9zdGZpbHRlcl9hZ2NfbWVtKTsKK30KKworc3RhdGljIGludCBxY2VscF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgUUNFTFBDb250ZXh0ICpxICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGZsb2F0ICpvdXRidWZmZXI7CisgICAgaW50ICAgaSwgcmV0OworICAgIGZsb2F0IHF1YW50aXplZF9sc3BmWzEwXSwgbHBjWzEwXTsKKyAgICBmbG9hdCBnYWluWzE2XTsKKyAgICBmbG9hdCAqZm9ybWFudF9tZW07CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gMTYwOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgb3V0YnVmZmVyID0gKGZsb2F0ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICBpZiAoKHEtPmJpdHJhdGUgPSBkZXRlcm1pbmVfYml0cmF0ZShhdmN0eCwgYnVmX3NpemUsICZidWYpKSA9PSBJX0ZfUSkgeworICAgICAgICB3YXJuX2luc3VmZmljaWVudF9mcmFtZV9xdWFsaXR5KGF2Y3R4LCAiQml0cmF0ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4iKTsKKyAgICAgICAgZ290byBlcmFzdXJlOworICAgIH0KKworICAgIGlmIChxLT5iaXRyYXRlID09IFJBVEVfT0NUQVZFICYmCisgICAgICAgIChxLT5maXJzdDE2Yml0cyA9IEFWX1JCMTYoYnVmKSkgPT0gMHhGRkZGKSB7CisgICAgICAgIHdhcm5faW5zdWZmaWNpZW50X2ZyYW1lX3F1YWxpdHkoYXZjdHgsICJCaXRyYXRlIGlzIDEvOCBhbmQgZmlyc3QgMTYgYml0cyBhcmUgb24uIik7CisgICAgICAgIGdvdG8gZXJhc3VyZTsKKyAgICB9CisKKyAgICBpZiAocS0+Yml0cmF0ZSA+IFNJTEVOQ0UpIHsKKyAgICAgICAgY29uc3QgUUNFTFBCaXRtYXAgKmJpdG1hcHMgICAgID0gcWNlbHBfdW5wYWNraW5nX2JpdG1hcHNfcGVyX3JhdGVbcS0+Yml0cmF0ZV07CisgICAgICAgIGNvbnN0IFFDRUxQQml0bWFwICpiaXRtYXBzX2VuZCA9IHFjZWxwX3VucGFja2luZ19iaXRtYXBzX3Blcl9yYXRlW3EtPmJpdHJhdGVdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNlbHBfdW5wYWNraW5nX2JpdG1hcHNfbGVuZ3Roc1txLT5iaXRyYXRlXTsKKyAgICAgICAgdWludDhfdCAqdW5wYWNrZWRfZGF0YSAgICAgICAgID0gKHVpbnQ4X3QgKikmcS0+ZnJhbWU7CisKKyAgICAgICAgaW5pdF9nZXRfYml0cygmcS0+Z2IsIGJ1ZiwgOCAqIGJ1Zl9zaXplKTsKKworICAgICAgICBtZW1zZXQoJnEtPmZyYW1lLCAwLCBzaXplb2YoUUNFTFBGcmFtZSkpOworCisgICAgICAgIGZvciAoOyBiaXRtYXBzIDwgYml0bWFwc19lbmQ7IGJpdG1hcHMrKykKKyAgICAgICAgICAgIHVucGFja2VkX2RhdGFbYml0bWFwcy0+aW5kZXhdIHw9IGdldF9iaXRzKCZxLT5nYiwgYml0bWFwcy0+Yml0bGVuKSA8PCBiaXRtYXBzLT5iaXRwb3M7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGVyYXN1cmVzL2JsYW5rcyBvbiByYXRlcyAxLCAxLzQgYW5kIDEvOC4KKyAgICAgICAgaWYgKHEtPmZyYW1lLnJlc2VydmVkKSB7CisgICAgICAgICAgICB3YXJuX2luc3VmZmljaWVudF9mcmFtZV9xdWFsaXR5KGF2Y3R4LCAiV3JvbmcgZGF0YSBpbiByZXNlcnZlZCBmcmFtZSBhcmVhLiIpOworICAgICAgICAgICAgZ290byBlcmFzdXJlOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5iaXRyYXRlID09IFJBVEVfUVVBUlRFUiAmJgorICAgICAgICAgICAgY29kZWJvb2tfc2FuaXR5X2NoZWNrX2Zvcl9yYXRlX3F1YXJ0ZXIocS0+ZnJhbWUuY2JnYWluKSkgeworICAgICAgICAgICAgd2Fybl9pbnN1ZmZpY2llbnRfZnJhbWVfcXVhbGl0eShhdmN0eCwgIkNvZGVib29rIGdhaW4gc2FuaXR5IGNoZWNrIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIGdvdG8gZXJhc3VyZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChxLT5iaXRyYXRlID49IFJBVEVfSEFMRikgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChxLT5mcmFtZS5wZnJhY1tpXSAmJiBxLT5mcmFtZS5wbGFnW2ldID49IDEyNCkgeworICAgICAgICAgICAgICAgICAgICB3YXJuX2luc3VmZmljaWVudF9mcmFtZV9xdWFsaXR5KGF2Y3R4LCAiQ2Fubm90IGluaXRpYWxpemUgcGl0Y2ggZmlsdGVyLiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVyYXN1cmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZGVjb2RlX2dhaW5fYW5kX2luZGV4KHEsIGdhaW4pOworICAgIGNvbXB1dGVfc3ZlY3RvcihxLCBnYWluLCBvdXRidWZmZXIpOworCisgICAgaWYgKGRlY29kZV9sc3BmKHEsIHF1YW50aXplZF9sc3BmKSA8IDApIHsKKyAgICAgICAgd2Fybl9pbnN1ZmZpY2llbnRfZnJhbWVfcXVhbGl0eShhdmN0eCwgIkJhZGx5IHJlY2VpdmVkIHBhY2tldHMgaW4gZnJhbWUuIik7CisgICAgICAgIGdvdG8gZXJhc3VyZTsKKyAgICB9CisKKyAgICBhcHBseV9waXRjaF9maWx0ZXJzKHEsIG91dGJ1ZmZlcik7CisKKyAgICBpZiAocS0+Yml0cmF0ZSA9PSBJX0ZfUSkgeworZXJhc3VyZToKKyAgICAgICAgcS0+Yml0cmF0ZSA9IElfRl9ROworICAgICAgICBxLT5lcmFzdXJlX2NvdW50Kys7CisgICAgICAgIGRlY29kZV9nYWluX2FuZF9pbmRleChxLCBnYWluKTsKKyAgICAgICAgY29tcHV0ZV9zdmVjdG9yKHEsIGdhaW4sIG91dGJ1ZmZlcik7CisgICAgICAgIGRlY29kZV9sc3BmKHEsIHF1YW50aXplZF9sc3BmKTsKKyAgICAgICAgYXBwbHlfcGl0Y2hfZmlsdGVycyhxLCBvdXRidWZmZXIpOworICAgIH0gZWxzZQorICAgICAgICBxLT5lcmFzdXJlX2NvdW50ID0gMDsKKworICAgIGZvcm1hbnRfbWVtID0gcS0+Zm9ybWFudF9tZW0gKyAxMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGludGVycG9sYXRlX2xwYyhxLCBxdWFudGl6ZWRfbHNwZiwgbHBjLCBpKTsKKyAgICAgICAgZmZfY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZihmb3JtYW50X21lbSwgbHBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJ1ZmZlciArIGkgKiA0MCwgNDAsIDEwKTsKKyAgICAgICAgZm9ybWFudF9tZW0gKz0gNDA7CisgICAgfQorCisgICAgLy8gcG9zdGZpbHRlciwgYXMgcGVyIFRJQS9FSUEvSVMtNzMzIDIuNC44LjYKKyAgICBwb3N0ZmlsdGVyKHEsIG91dGJ1ZmZlciwgbHBjKTsKKworICAgIG1lbWNweShxLT5mb3JtYW50X21lbSwgcS0+Zm9ybWFudF9tZW0gKyAxNjAsIDEwICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICBtZW1jcHkocS0+cHJldl9sc3BmLCBxdWFudGl6ZWRfbHNwZiwgc2l6ZW9mKHEtPnByZXZfbHNwZikpOworICAgIHEtPnByZXZfYml0cmF0ZSAgPSBxLT5iaXRyYXRlOworCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitBVkNvZGVjIGZmX3FjZWxwX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInFjZWxwIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUUNFTFAgLyBQdXJlVm9pY2UiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUUNFTFAsCisgICAgLmluaXQgICAgICAgICAgID0gcWNlbHBfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gcWNlbHBfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFFDRUxQQ29udGV4dCksCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcWRtMi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcWRtMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOWZlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9xZG0yLmMKQEAgLTAsMCArMSwyMDU5IEBACisvKgorICogUURNMiBjb21wYXRpYmxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBFd2FsZCBTbmVsCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQmVuamFtaW4gTGFyc3NvbgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFsZXggQmVyZWdzemFzemkKKyAqIENvcHlyaWdodCAoYykgMjAwNSBSb2JlcnRvIFRvZ25pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFFETTIgZGVjb2RlcgorICogQGF1dGhvciBFd2FsZCBTbmVsLCBCZW5qYW1pbiBMYXJzc29uLCBBbGV4IEJlcmVnc3phc3ppLCBSb2JlcnRvIFRvZ25pCisgKgorICogVGhlIGRlY29kZXIgaXMgbm90IHBlcmZlY3QgeWV0LCB0aGVyZSBhcmUgc3RpbGwgc29tZSBkaXN0b3J0aW9ucworICogZXNwZWNpYWxseSBvbiBmaWxlcyBlbmNvZGVkIHdpdGggMTYgb3IgOCBzdWJiYW5kcy4KKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicmRmdC5oIgorI2luY2x1ZGUgIm1wZWdhdWRpb2RzcC5oIgorI2luY2x1ZGUgIm1wZWdhdWRpby5oIgorCisjaW5jbHVkZSAicWRtMmRhdGEuaCIKKyNpbmNsdWRlICJxZG0yX3RhYmxlZ2VuLmgiCisKKyN1bmRlZiBOREVCVUcKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworCisjZGVmaW5lIFFETTJfTElTVF9BREQobGlzdCwgc2l6ZSwgcGFja2V0KSBcCitkbyB7IFwKKyAgICAgIGlmIChzaXplID4gMCkgeyBcCisgICAgbGlzdFtzaXplIC0gMV0ubmV4dCA9ICZsaXN0W3NpemVdOyBcCisgICAgICB9IFwKKyAgICAgIGxpc3Rbc2l6ZV0ucGFja2V0ID0gcGFja2V0OyBcCisgICAgICBsaXN0W3NpemVdLm5leHQgPSBOVUxMOyBcCisgICAgICBzaXplKys7IFwKK30gd2hpbGUoMCkKKworLy8gUmVzdWx0IGlzIDgsIDE2IG9yIDMwCisjZGVmaW5lIFFETTJfU0JfVVNFRChzdWJfc2FtcGxpbmcpICgoKHN1Yl9zYW1wbGluZykgPj0gMikgPyAzMCA6IDggPDwgKHN1Yl9zYW1wbGluZykpCisKKyNkZWZpbmUgRklYX05PSVNFX0lEWChub2lzZV9pZHgpIFwKKyAgaWYgKChub2lzZV9pZHgpID49IDM4NDApIFwKKyAgICAobm9pc2VfaWR4KSAtPSAzODQwOyBcCisKKyNkZWZpbmUgU0JfRElUSEVSSU5HX05PSVNFKHNiLG5vaXNlX2lkeCkgKG5vaXNlX3RhYmxlWyhub2lzZV9pZHgpKytdICogc2Jfbm9pc2VfYXR0ZW51YXRpb25bKHNiKV0pCisKKyNkZWZpbmUgU0FNUExFU19ORUVERUQgXAorICAgICBhdl9sb2cgKE5VTEwsQVZfTE9HX0lORk8sIlRoaXMgZmlsZSB0cmlnZ2VycyBzb21lIHVudGVzdGVkIGNvZGUuIFBsZWFzZSBjb250YWN0IHRoZSBkZXZlbG9wZXJzLlxuIik7CisKKyNkZWZpbmUgU0FNUExFU19ORUVERURfMih3aHkpIFwKKyAgICAgYXZfbG9nIChOVUxMLEFWX0xPR19JTkZPLCJUaGlzIGZpbGUgdHJpZ2dlcnMgc29tZSBtaXNzaW5nIGNvZGUuIFBsZWFzZSBjb250YWN0IHRoZSBkZXZlbG9wZXJzLlxuUG9zaXRpb246ICVzXG4iLHdoeSk7CisKKyNkZWZpbmUgUURNMl9NQVhfRlJBTUVfU0laRSA1MTIKKwordHlwZWRlZiBpbnQ4X3Qgc2JfaW50OF9hcnJheVsyXVszMF1bNjRdOworCisvKioKKyAqIFN1YnBhY2tldAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7ICAgICAgICAgICAgLy8vPCBzdWJwYWNrZXQgdHlwZQorICAgIHVuc2lnbmVkIGludCBzaXplOyAgIC8vLzwgc3VicGFja2V0IHNpemUKKyAgICBjb25zdCB1aW50OF90ICpkYXRhOyAvLy88IHBvaW50ZXIgdG8gc3VicGFja2V0IGRhdGEgKHBvaW50cyB0byBpbnB1dCBkYXRhIGJ1ZmZlciwgaXQncyBub3QgYSBwcml2YXRlIGNvcHkpCit9IFFETTJTdWJQYWNrZXQ7CisKKy8qKgorICogQSBub2RlIGluIHRoZSBzdWJwYWNrZXQgbGlzdAorICovCit0eXBlZGVmIHN0cnVjdCBRRE0yU3ViUE5vZGUgeworICAgIFFETTJTdWJQYWNrZXQgKnBhY2tldDsgICAgICAvLy88IHBhY2tldAorICAgIHN0cnVjdCBRRE0yU3ViUE5vZGUgKm5leHQ7IC8vLzwgcG9pbnRlciB0byBuZXh0IHBhY2tldCBpbiB0aGUgbGlzdCwgTlVMTCBpZiBsZWFmIG5vZGUKK30gUURNMlN1YlBOb2RlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgcmU7CisgICAgZmxvYXQgaW07Cit9IFFETTJDb21wbGV4OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbGV2ZWw7CisgICAgUURNMkNvbXBsZXggKmNvbXBsZXg7CisgICAgY29uc3QgZmxvYXQgKnRhYmxlOworICAgIGludCAgIHBoYXNlOworICAgIGludCAgIHBoYXNlX3NoaWZ0OworICAgIGludCAgIGR1cmF0aW9uOworICAgIHNob3J0IHRpbWVfaW5kZXg7CisgICAgc2hvcnQgY3V0b2ZmOworfSBGRlRUb25lOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MTZfdCBzdWJfcGFja2V0OworICAgIHVpbnQ4X3QgY2hhbm5lbDsKKyAgICBpbnQxNl90IG9mZnNldDsKKyAgICBpbnQxNl90IGV4cDsKKyAgICB1aW50OF90IHBoYXNlOworfSBGRlRDb2VmZmljaWVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgUURNMkNvbXBsZXgsIGNvbXBsZXgpW01QQV9NQVhfQ0hBTk5FTFNdWzI1Nl07Cit9IFFETTJGRlQ7CisKKy8qKgorICogUURNMiBkZWNvZGVyIGNvbnRleHQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8vLyBQYXJhbWV0ZXJzIGZyb20gY29kZWMgaGVhZGVyLCBkbyBub3QgY2hhbmdlIGR1cmluZyBwbGF5YmFjaworICAgIGludCBuYl9jaGFubmVsczsgICAgICAgICAvLy88IG51bWJlciBvZiBjaGFubmVscworICAgIGludCBjaGFubmVsczsgICAgICAgICAgICAvLy88IG51bWJlciBvZiBjaGFubmVscworICAgIGludCBncm91cF9zaXplOyAgICAgICAgICAvLy88IHNpemUgb2YgZnJhbWUgZ3JvdXAgKDE2IGZyYW1lcyBwZXIgZ3JvdXApCisgICAgaW50IGZmdF9zaXplOyAgICAgICAgICAgIC8vLzwgc2l6ZSBvZiBGRlQsIGluIGNvbXBsZXggbnVtYmVycworICAgIGludCBjaGVja3N1bV9zaXplOyAgICAgICAvLy88IHNpemUgb2YgZGF0YSBibG9jaywgdXNlZCBhbHNvIGZvciBjaGVja3N1bQorCisgICAgLy8vIFBhcmFtZXRlcnMgYnVpbHQgZnJvbSBoZWFkZXIgcGFyYW1ldGVycywgZG8gbm90IGNoYW5nZSBkdXJpbmcgcGxheWJhY2sKKyAgICBpbnQgZ3JvdXBfb3JkZXI7ICAgICAgICAgLy8vPCBvcmRlciBvZiBmcmFtZSBncm91cAorICAgIGludCBmZnRfb3JkZXI7ICAgICAgICAgICAvLy88IG9yZGVyIG9mIEZGVCAoYWN0dWFsbHkgZmZ0b3JkZXIrMSkKKyAgICBpbnQgZnJhbWVfc2l6ZTsgICAgICAgICAgLy8vPCBzaXplIG9mIGRhdGEgZnJhbWUKKyAgICBpbnQgZnJlcXVlbmN5X3JhbmdlOworICAgIGludCBzdWJfc2FtcGxpbmc7ICAgICAgICAvLy88IHN1YnNhbXBsaW5nOiAwPTI1JSwgMT01MCUsIDI9MTAwJSAqLworICAgIGludCBjb2VmZl9wZXJfc2Jfc2VsZWN0OyAvLy88IHNlbGVjdG9yIGZvciAibnVtLiBvZiBjb2VmZnMuIHBlciBzdWJiYW5kIiB0YWJsZXMuIENhbiBiZSAwLCAxLCAyCisgICAgaW50IGNtX3RhYmxlX3NlbGVjdDsgICAgIC8vLzwgc2VsZWN0b3IgZm9yICJjb2RpbmcgbWV0aG9kIiB0YWJsZXMuIENhbiBiZSAwLCAxIChmcm9tIGluaXQ6IDAtNCkKKworICAgIC8vLyBQYWNrZXRzIGFuZCBwYWNrZXQgbGlzdHMKKyAgICBRRE0yU3ViUGFja2V0IHN1Yl9wYWNrZXRzWzE2XTsgICAgICAvLy88IHRoZSBwYWNrZXRzIHRoZW1zZWx2ZXMKKyAgICBRRE0yU3ViUE5vZGUgc3ViX3BhY2tldF9saXN0X0FbMTZdOyAvLy88IGxpc3Qgb2YgYWxsIHBhY2tldHMKKyAgICBRRE0yU3ViUE5vZGUgc3ViX3BhY2tldF9saXN0X0JbMTZdOyAvLy88IEZGVCBwYWNrZXRzIEIgYXJlIG9uIGxpc3QKKyAgICBpbnQgc3ViX3BhY2tldHNfQjsgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBwYWNrZXRzIG9uICdCJyBsaXN0CisgICAgUURNMlN1YlBOb2RlIHN1Yl9wYWNrZXRfbGlzdF9DWzE2XTsgLy8vPCBwYWNrZXRzIHdpdGggZXJyb3JzPworICAgIFFETTJTdWJQTm9kZSBzdWJfcGFja2V0X2xpc3RfRFsxNl07IC8vLzwgRENUIHBhY2tldHMKKworICAgIC8vLyBGRlQgYW5kIHRvbmVzCisgICAgRkZUVG9uZSBmZnRfdG9uZXNbMTAwMF07CisgICAgaW50IGZmdF90b25lX3N0YXJ0OworICAgIGludCBmZnRfdG9uZV9lbmQ7CisgICAgRkZUQ29lZmZpY2llbnQgZmZ0X2NvZWZzWzEwMDBdOworICAgIGludCBmZnRfY29lZnNfaW5kZXg7CisgICAgaW50IGZmdF9jb2Vmc19taW5faW5kZXhbNV07CisgICAgaW50IGZmdF9jb2Vmc19tYXhfaW5kZXhbNV07CisgICAgaW50IGZmdF9sZXZlbF9leHBbNl07CisgICAgUkRGVENvbnRleHQgcmRmdF9jdHg7CisgICAgUURNMkZGVCBmZnQ7CisKKyAgICAvLy8gSS9PIGRhdGEKKyAgICBjb25zdCB1aW50OF90ICpjb21wcmVzc2VkX2RhdGE7CisgICAgaW50IGNvbXByZXNzZWRfc2l6ZTsKKyAgICBmbG9hdCBvdXRwdXRfYnVmZmVyW1FETTJfTUFYX0ZSQU1FX1NJWkUgKiBNUEFfTUFYX0NIQU5ORUxTICogMl07CisKKyAgICAvLy8gU3ludGhlc2lzIGZpbHRlcgorICAgIE1QQURTUENvbnRleHQgbXBhZHNwOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHN5bnRoX2J1ZilbTVBBX01BWF9DSEFOTkVMU11bNTEyKjJdOworICAgIGludCBzeW50aF9idWZfb2Zmc2V0W01QQV9NQVhfQ0hBTk5FTFNdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHNiX3NhbXBsZXMpW01QQV9NQVhfQ0hBTk5FTFNdWzEyOF1bU0JMSU1JVF07CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgc2FtcGxlcylbTVBBX01BWF9DSEFOTkVMUyAqIE1QQV9GUkFNRV9TSVpFXTsKKworICAgIC8vLyBNaXhlZCB0ZW1wb3JhcnkgZGF0YSB1c2VkIGluIGRlY29kaW5nCisgICAgZmxvYXQgdG9uZV9sZXZlbFtNUEFfTUFYX0NIQU5ORUxTXVszMF1bNjRdOworICAgIGludDhfdCBjb2RpbmdfbWV0aG9kW01QQV9NQVhfQ0hBTk5FTFNdWzMwXVs2NF07CisgICAgaW50OF90IHF1YW50aXplZF9jb2VmZnNbTVBBX01BWF9DSEFOTkVMU11bMTBdWzhdOworICAgIGludDhfdCB0b25lX2xldmVsX2lkeF9iYXNlW01QQV9NQVhfQ0hBTk5FTFNdWzMwXVs4XTsKKyAgICBpbnQ4X3QgdG9uZV9sZXZlbF9pZHhfaGkxW01QQV9NQVhfQ0hBTk5FTFNdWzNdWzhdWzhdOworICAgIGludDhfdCB0b25lX2xldmVsX2lkeF9taWRbTVBBX01BWF9DSEFOTkVMU11bMjZdWzhdOworICAgIGludDhfdCB0b25lX2xldmVsX2lkeF9oaTJbTVBBX01BWF9DSEFOTkVMU11bMjZdOworICAgIGludDhfdCB0b25lX2xldmVsX2lkeFtNUEFfTUFYX0NIQU5ORUxTXVszMF1bNjRdOworICAgIGludDhfdCB0b25lX2xldmVsX2lkeF90ZW1wW01QQV9NQVhfQ0hBTk5FTFNdWzMwXVs2NF07CisKKyAgICAvLyBGbGFncworICAgIGludCBoYXNfZXJyb3JzOyAgICAgICAgIC8vLzwgcGFja2V0IGhhcyBlcnJvcnMKKyAgICBpbnQgc3VwZXJibG9ja3R5cGVfMl8zOyAvLy88IHNlbGVjdCBmZnQgdGFibGVzIGFuZCBzb21lIGFsZ29yaXRobSBiYXNlZCBvbiBzdXBlcmJsb2NrIHR5cGUKKyAgICBpbnQgZG9fc3ludGhfZmlsdGVyOyAgICAvLy88IHVzZWQgdG8gcGVyZm9ybSBvciBza2lwIHN5bnRoZXNpcyBmaWx0ZXIKKworICAgIGludCBzdWJfcGFja2V0OworICAgIGludCBub2lzZV9pZHg7IC8vLzwgaW5kZXggZm9yIGRpdGhlcmluZyBub2lzZSB0YWJsZQorfSBRRE0yQ29udGV4dDsKKworCitzdGF0aWMgVkxDIHZsY190YWJfbGV2ZWw7CitzdGF0aWMgVkxDIHZsY190YWJfZGlmZjsKK3N0YXRpYyBWTEMgdmxjX3RhYl9ydW47CitzdGF0aWMgVkxDIGZmdF9sZXZlbF9leHBfYWx0X3ZsYzsKK3N0YXRpYyBWTEMgZmZ0X2xldmVsX2V4cF92bGM7CitzdGF0aWMgVkxDIGZmdF9zdGVyZW9fZXhwX3ZsYzsKK3N0YXRpYyBWTEMgZmZ0X3N0ZXJlb19waGFzZV92bGM7CitzdGF0aWMgVkxDIHZsY190YWJfdG9uZV9sZXZlbF9pZHhfaGkxOworc3RhdGljIFZMQyB2bGNfdGFiX3RvbmVfbGV2ZWxfaWR4X21pZDsKK3N0YXRpYyBWTEMgdmxjX3RhYl90b25lX2xldmVsX2lkeF9oaTI7CitzdGF0aWMgVkxDIHZsY190YWJfdHlwZTMwOworc3RhdGljIFZMQyB2bGNfdGFiX3R5cGUzNDsKK3N0YXRpYyBWTEMgdmxjX3RhYl9mZnRfdG9uZV9vZmZzZXRbNV07CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBxZG0yX3ZsY19vZmZzW10gPSB7CisgICAgMCwyNjAsNTY2LDU5OCw4OTQsMTE2NiwxMjMwLDEyOTQsMTY3OCwxOTUwLDIyMTQsMjI3OCwyMzEwLDI1NzAsMjgzNCwzMTI0LDM0NDgsMzgzOCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgc3dpdGNodGFibGVbMjNdID0geworICAgIDAsIDUsIDEsIDUsIDUsIDUsIDUsIDUsIDIsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDMsIDUsIDUsIDUsIDUsIDUsIDQKK307CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgcWRtMl9pbml0X3ZsYyh2b2lkKQoreworICAgIHN0YXRpYyBWTENfVFlQRSBxZG0yX3RhYmxlWzM4MzhdWzJdOworCisgICAgdmxjX3RhYl9sZXZlbC50YWJsZSAgICAgICAgICAgPSAmcWRtMl90YWJsZVtxZG0yX3ZsY19vZmZzWzBdXTsKKyAgICB2bGNfdGFiX2xldmVsLnRhYmxlX2FsbG9jYXRlZCA9IHFkbTJfdmxjX29mZnNbMV0gLSBxZG0yX3ZsY19vZmZzWzBdOworICAgIGluaXRfdmxjKCZ2bGNfdGFiX2xldmVsLCA4LCAyNCwKKyAgICAgICAgICAgICB2bGNfdGFiX2xldmVsX2h1ZmZiaXRzLCAxLCAxLAorICAgICAgICAgICAgIHZsY190YWJfbGV2ZWxfaHVmZmNvZGVzLCAyLCAyLAorICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDIHwgSU5JVF9WTENfTEUpOworCisgICAgdmxjX3RhYl9kaWZmLnRhYmxlICAgICAgICAgICA9ICZxZG0yX3RhYmxlW3FkbTJfdmxjX29mZnNbMV1dOworICAgIHZsY190YWJfZGlmZi50YWJsZV9hbGxvY2F0ZWQgPSBxZG0yX3ZsY19vZmZzWzJdIC0gcWRtMl92bGNfb2Zmc1sxXTsKKyAgICBpbml0X3ZsYygmdmxjX3RhYl9kaWZmLCA4LCAzNywKKyAgICAgICAgICAgICB2bGNfdGFiX2RpZmZfaHVmZmJpdHMsIDEsIDEsCisgICAgICAgICAgICAgdmxjX3RhYl9kaWZmX2h1ZmZjb2RlcywgMiwgMiwKKyAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyB8IElOSVRfVkxDX0xFKTsKKworICAgIHZsY190YWJfcnVuLnRhYmxlICAgICAgICAgICA9ICZxZG0yX3RhYmxlW3FkbTJfdmxjX29mZnNbMl1dOworICAgIHZsY190YWJfcnVuLnRhYmxlX2FsbG9jYXRlZCA9IHFkbTJfdmxjX29mZnNbM10gLSBxZG0yX3ZsY19vZmZzWzJdOworICAgIGluaXRfdmxjKCZ2bGNfdGFiX3J1biwgNSwgNiwKKyAgICAgICAgICAgICB2bGNfdGFiX3J1bl9odWZmYml0cywgMSwgMSwKKyAgICAgICAgICAgICB2bGNfdGFiX3J1bl9odWZmY29kZXMsIDEsIDEsCisgICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMgfCBJTklUX1ZMQ19MRSk7CisKKyAgICBmZnRfbGV2ZWxfZXhwX2FsdF92bGMudGFibGUgICAgICAgICAgID0gJnFkbTJfdGFibGVbcWRtMl92bGNfb2Zmc1szXV07CisgICAgZmZ0X2xldmVsX2V4cF9hbHRfdmxjLnRhYmxlX2FsbG9jYXRlZCA9IHFkbTJfdmxjX29mZnNbNF0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZG0yX3ZsY19vZmZzWzNdOworICAgIGluaXRfdmxjKCZmZnRfbGV2ZWxfZXhwX2FsdF92bGMsIDgsIDI4LAorICAgICAgICAgICAgIGZmdF9sZXZlbF9leHBfYWx0X2h1ZmZiaXRzLCAxLCAxLAorICAgICAgICAgICAgIGZmdF9sZXZlbF9leHBfYWx0X2h1ZmZjb2RlcywgMiwgMiwKKyAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyB8IElOSVRfVkxDX0xFKTsKKworICAgIGZmdF9sZXZlbF9leHBfdmxjLnRhYmxlICAgICAgICAgICA9ICZxZG0yX3RhYmxlW3FkbTJfdmxjX29mZnNbNF1dOworICAgIGZmdF9sZXZlbF9leHBfdmxjLnRhYmxlX2FsbG9jYXRlZCA9IHFkbTJfdmxjX29mZnNbNV0gLSBxZG0yX3ZsY19vZmZzWzRdOworICAgIGluaXRfdmxjKCZmZnRfbGV2ZWxfZXhwX3ZsYywgOCwgMjAsCisgICAgICAgICAgICAgZmZ0X2xldmVsX2V4cF9odWZmYml0cywgMSwgMSwKKyAgICAgICAgICAgICBmZnRfbGV2ZWxfZXhwX2h1ZmZjb2RlcywgMiwgMiwKKyAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyB8IElOSVRfVkxDX0xFKTsKKworICAgIGZmdF9zdGVyZW9fZXhwX3ZsYy50YWJsZSAgICAgICAgICAgPSAmcWRtMl90YWJsZVtxZG0yX3ZsY19vZmZzWzVdXTsKKyAgICBmZnRfc3RlcmVvX2V4cF92bGMudGFibGVfYWxsb2NhdGVkID0gcWRtMl92bGNfb2Zmc1s2XSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFkbTJfdmxjX29mZnNbNV07CisgICAgaW5pdF92bGMoJmZmdF9zdGVyZW9fZXhwX3ZsYywgNiwgNywKKyAgICAgICAgICAgICBmZnRfc3RlcmVvX2V4cF9odWZmYml0cywgMSwgMSwKKyAgICAgICAgICAgICBmZnRfc3RlcmVvX2V4cF9odWZmY29kZXMsIDEsIDEsCisgICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMgfCBJTklUX1ZMQ19MRSk7CisKKyAgICBmZnRfc3RlcmVvX3BoYXNlX3ZsYy50YWJsZSAgICAgICAgICAgPSAmcWRtMl90YWJsZVtxZG0yX3ZsY19vZmZzWzZdXTsKKyAgICBmZnRfc3RlcmVvX3BoYXNlX3ZsYy50YWJsZV9hbGxvY2F0ZWQgPSBxZG0yX3ZsY19vZmZzWzddIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZG0yX3ZsY19vZmZzWzZdOworICAgIGluaXRfdmxjKCZmZnRfc3RlcmVvX3BoYXNlX3ZsYywgNiwgOSwKKyAgICAgICAgICAgICBmZnRfc3RlcmVvX3BoYXNlX2h1ZmZiaXRzLCAxLCAxLAorICAgICAgICAgICAgIGZmdF9zdGVyZW9fcGhhc2VfaHVmZmNvZGVzLCAxLCAxLAorICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDIHwgSU5JVF9WTENfTEUpOworCisgICAgdmxjX3RhYl90b25lX2xldmVsX2lkeF9oaTEudGFibGUgPQorICAgICAgICAmcWRtMl90YWJsZVtxZG0yX3ZsY19vZmZzWzddXTsKKyAgICB2bGNfdGFiX3RvbmVfbGV2ZWxfaWR4X2hpMS50YWJsZV9hbGxvY2F0ZWQgPSBxZG0yX3ZsY19vZmZzWzhdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZG0yX3ZsY19vZmZzWzddOworICAgIGluaXRfdmxjKCZ2bGNfdGFiX3RvbmVfbGV2ZWxfaWR4X2hpMSwgOCwgMjAsCisgICAgICAgICAgICAgdmxjX3RhYl90b25lX2xldmVsX2lkeF9oaTFfaHVmZmJpdHMsIDEsIDEsCisgICAgICAgICAgICAgdmxjX3RhYl90b25lX2xldmVsX2lkeF9oaTFfaHVmZmNvZGVzLCAyLCAyLAorICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDIHwgSU5JVF9WTENfTEUpOworCisgICAgdmxjX3RhYl90b25lX2xldmVsX2lkeF9taWQudGFibGUgPQorICAgICAgICAmcWRtMl90YWJsZVtxZG0yX3ZsY19vZmZzWzhdXTsKKyAgICB2bGNfdGFiX3RvbmVfbGV2ZWxfaWR4X21pZC50YWJsZV9hbGxvY2F0ZWQgPSBxZG0yX3ZsY19vZmZzWzldIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZG0yX3ZsY19vZmZzWzhdOworICAgIGluaXRfdmxjKCZ2bGNfdGFiX3RvbmVfbGV2ZWxfaWR4X21pZCwgOCwgMjQsCisgICAgICAgICAgICAgdmxjX3RhYl90b25lX2xldmVsX2lkeF9taWRfaHVmZmJpdHMsIDEsIDEsCisgICAgICAgICAgICAgdmxjX3RhYl90b25lX2xldmVsX2lkeF9taWRfaHVmZmNvZGVzLCAyLCAyLAorICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDIHwgSU5JVF9WTENfTEUpOworCisgICAgdmxjX3RhYl90b25lX2xldmVsX2lkeF9oaTIudGFibGUgPQorICAgICAgICAmcWRtMl90YWJsZVtxZG0yX3ZsY19vZmZzWzldXTsKKyAgICB2bGNfdGFiX3RvbmVfbGV2ZWxfaWR4X2hpMi50YWJsZV9hbGxvY2F0ZWQgPSBxZG0yX3ZsY19vZmZzWzEwXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWRtMl92bGNfb2Zmc1s5XTsKKyAgICBpbml0X3ZsYygmdmxjX3RhYl90b25lX2xldmVsX2lkeF9oaTIsIDgsIDI0LAorICAgICAgICAgICAgIHZsY190YWJfdG9uZV9sZXZlbF9pZHhfaGkyX2h1ZmZiaXRzLCAxLCAxLAorICAgICAgICAgICAgIHZsY190YWJfdG9uZV9sZXZlbF9pZHhfaGkyX2h1ZmZjb2RlcywgMiwgMiwKKyAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyB8IElOSVRfVkxDX0xFKTsKKworICAgIHZsY190YWJfdHlwZTMwLnRhYmxlICAgICAgICAgICA9ICZxZG0yX3RhYmxlW3FkbTJfdmxjX29mZnNbMTBdXTsKKyAgICB2bGNfdGFiX3R5cGUzMC50YWJsZV9hbGxvY2F0ZWQgPSBxZG0yX3ZsY19vZmZzWzExXSAtIHFkbTJfdmxjX29mZnNbMTBdOworICAgIGluaXRfdmxjKCZ2bGNfdGFiX3R5cGUzMCwgNiwgOSwKKyAgICAgICAgICAgICB2bGNfdGFiX3R5cGUzMF9odWZmYml0cywgMSwgMSwKKyAgICAgICAgICAgICB2bGNfdGFiX3R5cGUzMF9odWZmY29kZXMsIDEsIDEsCisgICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMgfCBJTklUX1ZMQ19MRSk7CisKKyAgICB2bGNfdGFiX3R5cGUzNC50YWJsZSAgICAgICAgICAgPSAmcWRtMl90YWJsZVtxZG0yX3ZsY19vZmZzWzExXV07CisgICAgdmxjX3RhYl90eXBlMzQudGFibGVfYWxsb2NhdGVkID0gcWRtMl92bGNfb2Zmc1sxMl0gLSBxZG0yX3ZsY19vZmZzWzExXTsKKyAgICBpbml0X3ZsYygmdmxjX3RhYl90eXBlMzQsIDUsIDEwLAorICAgICAgICAgICAgIHZsY190YWJfdHlwZTM0X2h1ZmZiaXRzLCAxLCAxLAorICAgICAgICAgICAgIHZsY190YWJfdHlwZTM0X2h1ZmZjb2RlcywgMSwgMSwKKyAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyB8IElOSVRfVkxDX0xFKTsKKworICAgIHZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0WzBdLnRhYmxlID0KKyAgICAgICAgJnFkbTJfdGFibGVbcWRtMl92bGNfb2Zmc1sxMl1dOworICAgIHZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0WzBdLnRhYmxlX2FsbG9jYXRlZCA9IHFkbTJfdmxjX29mZnNbMTNdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZG0yX3ZsY19vZmZzWzEyXTsKKyAgICBpbml0X3ZsYygmdmxjX3RhYl9mZnRfdG9uZV9vZmZzZXRbMF0sIDgsIDIzLAorICAgICAgICAgICAgIHZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0XzBfaHVmZmJpdHMsIDEsIDEsCisgICAgICAgICAgICAgdmxjX3RhYl9mZnRfdG9uZV9vZmZzZXRfMF9odWZmY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMgfCBJTklUX1ZMQ19MRSk7CisKKyAgICB2bGNfdGFiX2ZmdF90b25lX29mZnNldFsxXS50YWJsZSA9CisgICAgICAgICZxZG0yX3RhYmxlW3FkbTJfdmxjX29mZnNbMTNdXTsKKyAgICB2bGNfdGFiX2ZmdF90b25lX29mZnNldFsxXS50YWJsZV9hbGxvY2F0ZWQgPSBxZG0yX3ZsY19vZmZzWzE0XSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWRtMl92bGNfb2Zmc1sxM107CisgICAgaW5pdF92bGMoJnZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0WzFdLCA4LCAyOCwKKyAgICAgICAgICAgICB2bGNfdGFiX2ZmdF90b25lX29mZnNldF8xX2h1ZmZiaXRzLCAxLCAxLAorICAgICAgICAgICAgIHZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0XzFfaHVmZmNvZGVzLCAyLCAyLAorICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDIHwgSU5JVF9WTENfTEUpOworCisgICAgdmxjX3RhYl9mZnRfdG9uZV9vZmZzZXRbMl0udGFibGUgPQorICAgICAgICAmcWRtMl90YWJsZVtxZG0yX3ZsY19vZmZzWzE0XV07CisgICAgdmxjX3RhYl9mZnRfdG9uZV9vZmZzZXRbMl0udGFibGVfYWxsb2NhdGVkID0gcWRtMl92bGNfb2Zmc1sxNV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFkbTJfdmxjX29mZnNbMTRdOworICAgIGluaXRfdmxjKCZ2bGNfdGFiX2ZmdF90b25lX29mZnNldFsyXSwgOCwgMzIsCisgICAgICAgICAgICAgdmxjX3RhYl9mZnRfdG9uZV9vZmZzZXRfMl9odWZmYml0cywgMSwgMSwKKyAgICAgICAgICAgICB2bGNfdGFiX2ZmdF90b25lX29mZnNldF8yX2h1ZmZjb2RlcywgMiwgMiwKKyAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyB8IElOSVRfVkxDX0xFKTsKKworICAgIHZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0WzNdLnRhYmxlID0KKyAgICAgICAgJnFkbTJfdGFibGVbcWRtMl92bGNfb2Zmc1sxNV1dOworICAgIHZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0WzNdLnRhYmxlX2FsbG9jYXRlZCA9IHFkbTJfdmxjX29mZnNbMTZdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZG0yX3ZsY19vZmZzWzE1XTsKKyAgICBpbml0X3ZsYygmdmxjX3RhYl9mZnRfdG9uZV9vZmZzZXRbM10sIDgsIDM1LAorICAgICAgICAgICAgIHZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0XzNfaHVmZmJpdHMsIDEsIDEsCisgICAgICAgICAgICAgdmxjX3RhYl9mZnRfdG9uZV9vZmZzZXRfM19odWZmY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMgfCBJTklUX1ZMQ19MRSk7CisKKyAgICB2bGNfdGFiX2ZmdF90b25lX29mZnNldFs0XS50YWJsZSA9CisgICAgICAgICZxZG0yX3RhYmxlW3FkbTJfdmxjX29mZnNbMTZdXTsKKyAgICB2bGNfdGFiX2ZmdF90b25lX29mZnNldFs0XS50YWJsZV9hbGxvY2F0ZWQgPSBxZG0yX3ZsY19vZmZzWzE3XSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWRtMl92bGNfb2Zmc1sxNl07CisgICAgaW5pdF92bGMoJnZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0WzRdLCA4LCAzOCwKKyAgICAgICAgICAgICB2bGNfdGFiX2ZmdF90b25lX29mZnNldF80X2h1ZmZiaXRzLCAxLCAxLAorICAgICAgICAgICAgIHZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0XzRfaHVmZmNvZGVzLCAyLCAyLAorICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDIHwgSU5JVF9WTENfTEUpOworfQorCitzdGF0aWMgaW50IHFkbTJfZ2V0X3ZsYyhHZXRCaXRDb250ZXh0ICpnYiwgVkxDICp2bGMsIGludCBmbGFnLCBpbnQgZGVwdGgpCit7CisgICAgaW50IHZhbHVlOworCisgICAgdmFsdWUgPSBnZXRfdmxjMihnYiwgdmxjLT50YWJsZSwgdmxjLT5iaXRzLCBkZXB0aCk7CisKKyAgICAvKiBzdGFnZS0yLCAzIGJpdHMgZXhwb25lbnQgZXNjYXBlIHNlcXVlbmNlICovCisgICAgaWYgKHZhbHVlLS0gPT0gMCkKKyAgICAgICAgdmFsdWUgPSBnZXRfYml0cyhnYiwgZ2V0X2JpdHMoZ2IsIDMpICsgMSk7CisKKyAgICAvKiBzdGFnZS0zLCBvcHRpb25hbCAqLworICAgIGlmIChmbGFnKSB7CisgICAgICAgIGludCB0bXA7CisKKyAgICAgICAgaWYgKHZhbHVlID49IDYwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAidmFsdWUgJWQgaW4gcWRtMl9nZXRfdmxjIHRvbyBsYXJnZVxuIiwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICB0bXA9IHZsY19zdGFnZTNfdmFsdWVzW3ZhbHVlXTsKKworICAgICAgICBpZiAoKHZhbHVlICYgfjMpID4gMCkKKyAgICAgICAgICAgIHRtcCArPSBnZXRfYml0cyhnYiwgKHZhbHVlID4+IDIpKTsKKyAgICAgICAgdmFsdWUgPSB0bXA7CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IHFkbTJfZ2V0X3NlX3ZsYyhWTEMgKnZsYywgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBkZXB0aCkKK3sKKyAgICBpbnQgdmFsdWUgPSBxZG0yX2dldF92bGMoZ2IsIHZsYywgMCwgZGVwdGgpOworCisgICAgcmV0dXJuICh2YWx1ZSAmIDEpID8gKCh2YWx1ZSArIDEpID4+IDEpIDogLSh2YWx1ZSA+PiAxKTsKK30KKworLyoqCisgKiBRRE0yIGNoZWNrc3VtCisgKgorICogQHBhcmFtIGRhdGEgICAgICBwb2ludGVyIHRvIGRhdGEgdG8gYmUgY2hlY2tzdW0nZWQKKyAqIEBwYXJhbSBsZW5ndGggICAgZGF0YSBsZW5ndGgKKyAqIEBwYXJhbSB2YWx1ZSAgICAgY2hlY2tzdW0gdmFsdWUKKyAqCisgKiBAcmV0dXJuICAgICAgICAgIDAgaWYgY2hlY2tzdW0gaXMgT0sKKyAqLworc3RhdGljIHVpbnQxNl90IHFkbTJfcGFja2V0X2NoZWNrc3VtKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBsZW5ndGgsIGludCB2YWx1ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgdmFsdWUgLT0gZGF0YVtpXTsKKworICAgIHJldHVybiAodWludDE2X3QpKHZhbHVlICYgMHhmZmZmKTsKK30KKworLyoqCisgKiBGaWxsIGEgUURNMlN1YlBhY2tldCBzdHJ1Y3R1cmUgd2l0aCBwYWNrZXQgdHlwZSwgc2l6ZSwgYW5kIGRhdGEgcG9pbnRlci4KKyAqCisgKiBAcGFyYW0gZ2IgICAgICAgICAgICBiaXRyZWFkZXIgY29udGV4dAorICogQHBhcmFtIHN1Yl9wYWNrZXQgICAgcGFja2V0IHVuZGVyIGFuYWx5c2lzCisgKi8KK3N0YXRpYyB2b2lkIHFkbTJfZGVjb2RlX3N1Yl9wYWNrZXRfaGVhZGVyKEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUURNMlN1YlBhY2tldCAqc3ViX3BhY2tldCkKK3sKKyAgICBzdWJfcGFja2V0LT50eXBlID0gZ2V0X2JpdHMoZ2IsIDgpOworCisgICAgaWYgKHN1Yl9wYWNrZXQtPnR5cGUgPT0gMCkgeworICAgICAgICBzdWJfcGFja2V0LT5zaXplID0gMDsKKyAgICAgICAgc3ViX3BhY2tldC0+ZGF0YSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3ViX3BhY2tldC0+c2l6ZSA9IGdldF9iaXRzKGdiLCA4KTsKKworICAgICAgICBpZiAoc3ViX3BhY2tldC0+dHlwZSAmIDB4ODApIHsKKyAgICAgICAgICAgIHN1Yl9wYWNrZXQtPnNpemUgPDw9IDg7CisgICAgICAgICAgICBzdWJfcGFja2V0LT5zaXplICB8PSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBzdWJfcGFja2V0LT50eXBlICAmPSAweDdmOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1Yl9wYWNrZXQtPnR5cGUgPT0gMHg3ZikKKyAgICAgICAgICAgIHN1Yl9wYWNrZXQtPnR5cGUgfD0gKGdldF9iaXRzKGdiLCA4KSA8PCA4KTsKKworICAgICAgICAvLyBGSVhNRTogdGhpcyBkZXBlbmRzIG9uIGJpdHJlYWRlci1pbnRlcm5hbCBkYXRhCisgICAgICAgIHN1Yl9wYWNrZXQtPmRhdGEgPSAmZ2ItPmJ1ZmZlcltnZXRfYml0c19jb3VudChnYikgLyA4XTsKKyAgICB9CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiU3VicGFja2V0OiB0eXBlPSVkIHNpemU9JWQgc3RhcnRfb2Zmcz0leFxuIiwKKyAgICAgICAgICAgc3ViX3BhY2tldC0+dHlwZSwgc3ViX3BhY2tldC0+c2l6ZSwgZ2V0X2JpdHNfY291bnQoZ2IpIC8gOCk7Cit9CisKKy8qKgorICogUmV0dXJuIG5vZGUgcG9pbnRlciB0byBmaXJzdCBwYWNrZXQgb2YgcmVxdWVzdGVkIHR5cGUgaW4gbGlzdC4KKyAqCisgKiBAcGFyYW0gbGlzdCAgICBsaXN0IG9mIHN1YnBhY2tldHMgdG8gYmUgc2Nhbm5lZAorICogQHBhcmFtIHR5cGUgICAgdHlwZSBvZiBzZWFyY2hlZCBzdWJwYWNrZXQKKyAqIEByZXR1cm4gICAgICAgIG5vZGUgcG9pbnRlciBmb3Igc3VicGFja2V0IGlmIGZvdW5kLCBlbHNlIE5VTEwKKyAqLworc3RhdGljIFFETTJTdWJQTm9kZSAqcWRtMl9zZWFyY2hfc3VicGFja2V0X3R5cGVfaW5fbGlzdChRRE0yU3ViUE5vZGUgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlKQoreworICAgIHdoaWxlIChsaXN0ICYmIGxpc3QtPnBhY2tldCkgeworICAgICAgICBpZiAobGlzdC0+cGFja2V0LT50eXBlID09IHR5cGUpCisgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFJlcGxhY2UgOCBlbGVtZW50cyB3aXRoIHRoZWlyIGF2ZXJhZ2UgdmFsdWUuCisgKiBDYWxsZWQgYnkgcWRtMl9kZWNvZGVfc3VwZXJibG9jayBiZWZvcmUgc3RhcnRpbmcgc3ViYmxvY2sgZGVjb2RpbmcuCisgKgorICogQHBhcmFtIHEgICAgICAgY29udGV4dAorICovCitzdGF0aWMgdm9pZCBhdmVyYWdlX3F1YW50aXplZF9jb2VmZnMoUURNMkNvbnRleHQgKnEpCit7CisgICAgaW50IGksIGosIG4sIGNoLCBzdW07CisKKyAgICBuID0gY29lZmZfcGVyX3NiX2Zvcl9hdmdbcS0+Y29lZmZfcGVyX3NiX3NlbGVjdF1bUURNMl9TQl9VU0VEKHEtPnN1Yl9zYW1wbGluZykgLSAxXSArIDE7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBxLT5uYl9jaGFubmVsczsgY2grKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgc3VtID0gMDsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgICAgICBzdW0gKz0gcS0+cXVhbnRpemVkX2NvZWZmc1tjaF1baV1bal07CisKKyAgICAgICAgICAgIHN1bSAvPSA4OworICAgICAgICAgICAgaWYgKHN1bSA+IDApCisgICAgICAgICAgICAgICAgc3VtLS07CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICAgICAgcS0+cXVhbnRpemVkX2NvZWZmc1tjaF1baV1bal0gPSBzdW07CisgICAgICAgIH0KK30KKworLyoqCisgKiBCdWlsZCBzdWJiYW5kIHNhbXBsZXMgd2l0aCBub2lzZSB3ZWlnaHRlZCBieSBxLT50b25lX2xldmVsLgorICogQ2FsbGVkIGJ5IHN5bnRoZmlsdF9idWlsZF9zYl9zYW1wbGVzLgorICoKKyAqIEBwYXJhbSBxICAgICBjb250ZXh0CisgKiBAcGFyYW0gc2IgICAgc3ViYmFuZCBpbmRleAorICovCitzdGF0aWMgdm9pZCBidWlsZF9zYl9zYW1wbGVzX2Zyb21fbm9pc2UoUURNMkNvbnRleHQgKnEsIGludCBzYikKK3sKKyAgICBpbnQgY2gsIGo7CisKKyAgICBGSVhfTk9JU0VfSURYKHEtPm5vaXNlX2lkeCk7CisKKyAgICBpZiAoIXEtPm5iX2NoYW5uZWxzKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBxLT5uYl9jaGFubmVsczsgY2grKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgeworICAgICAgICAgICAgcS0+c2Jfc2FtcGxlc1tjaF1baiAqIDJdW3NiXSA9CisgICAgICAgICAgICAgICAgU0JfRElUSEVSSU5HX05PSVNFKHNiLCBxLT5ub2lzZV9pZHgpICogcS0+dG9uZV9sZXZlbFtjaF1bc2JdW2pdOworICAgICAgICAgICAgcS0+c2Jfc2FtcGxlc1tjaF1baiAqIDIgKyAxXVtzYl0gPQorICAgICAgICAgICAgICAgIFNCX0RJVEhFUklOR19OT0lTRShzYiwgcS0+bm9pc2VfaWR4KSAqIHEtPnRvbmVfbGV2ZWxbY2hdW3NiXVtqXTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBDYWxsZWQgd2hpbGUgcHJvY2Vzc2luZyBkYXRhIGZyb20gc3VicGFja2V0cyAxMSBhbmQgMTIuCisgKiBVc2VkIGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIGNvZGluZ19tZXRob2QgYXJyYXkuCisgKgorICogQHBhcmFtIHNiICAgICAgICAgICAgICAgc3ViYmFuZCBpbmRleAorICogQHBhcmFtIGNoYW5uZWxzICAgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzCisgKiBAcGFyYW0gY29kaW5nX21ldGhvZCAgICBxLT5jb2RpbmdfbWV0aG9kWzBdWzBdWzBdCisgKi8KK3N0YXRpYyBpbnQgZml4X2NvZGluZ19tZXRob2RfYXJyYXkoaW50IHNiLCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiX2ludDhfYXJyYXkgY29kaW5nX21ldGhvZCkKK3sKKyAgICBpbnQgaiwgazsKKyAgICBpbnQgY2g7CisgICAgaW50IHJ1biwgY2FzZV92YWw7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7ICkgeworICAgICAgICAgICAgaWYgKGNvZGluZ19tZXRob2RbY2hdW3NiXVtqXSA8IDgpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKChjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gLSA4KSA+IDIyKSB7CisgICAgICAgICAgICAgICAgcnVuICAgICAgPSAxOworICAgICAgICAgICAgICAgIGNhc2VfdmFsID0gODsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzd2l0Y2h0YWJsZVtjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gLSA4XSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogcnVuICA9IDEwOworICAgICAgICAgICAgICAgICAgICBjYXNlX3ZhbCA9IDEwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IHJ1biAgPSAxOworICAgICAgICAgICAgICAgICAgICBjYXNlX3ZhbCA9IDE2OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHJ1biAgPSA1OworICAgICAgICAgICAgICAgICAgICBjYXNlX3ZhbCA9IDI0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHJ1biAgPSAzOworICAgICAgICAgICAgICAgICAgICBjYXNlX3ZhbCA9IDMwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IHJ1biAgPSAxOworICAgICAgICAgICAgICAgICAgICBjYXNlX3ZhbCA9IDMwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU6IHJ1biAgPSAxOworICAgICAgICAgICAgICAgICAgICBjYXNlX3ZhbCA9IDg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJ1biA9IDE7CisgICAgICAgICAgICAgICAgICAgIGNhc2VfdmFsID0gODsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHJ1bjsgaysrKSB7CisgICAgICAgICAgICAgICAgaWYgKGogKyBrIDwgMTI4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RpbmdfbWV0aG9kW2NoXVtzYiArIChqICsgaykgLyA2NF1bKGogKyBrKSAlIDY0XSA+IGNvZGluZ19tZXRob2RbY2hdW3NiXVtqXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNUExFU19ORUVERUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25vdCBkZWJ1Z2dlZCwgYWxtb3N0IG5ldmVyIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJmNvZGluZ19tZXRob2RbY2hdW3NiXVtqICsga10sIGNhc2VfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrICpzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZjb2RpbmdfbWV0aG9kW2NoXVtzYl1baiArIGtdLCBjYXNlX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAqIHNpemVvZihpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGogKz0gcnVuOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFJlbGF0ZWQgdG8gc3ludGhlc2lzIGZpbHRlcgorICogQ2FsbGVkIGJ5IHByb2Nlc3Nfc3VicGFja2V0XzEwCisgKgorICogQHBhcmFtIHEgICAgICAgY29udGV4dAorICogQHBhcmFtIGZsYWcgICAgMSBpZiBjYWxsZWQgYWZ0ZXIgZ2V0dGluZyBkYXRhIGZyb20gc3VicGFja2V0IDEwLCAwIGlmIG5vIHN1YnBhY2tldCAxMAorICovCitzdGF0aWMgdm9pZCBmaWxsX3RvbmVfbGV2ZWxfYXJyYXkoUURNMkNvbnRleHQgKnEsIGludCBmbGFnKQoreworICAgIGludCBpLCBzYiwgY2gsIHNiX3VzZWQ7CisgICAgaW50IHRtcCwgdGFiOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcS0+bmJfY2hhbm5lbHM7IGNoKyspCisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDMwOyBzYisrKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgodGFiPWNvZWZmX3Blcl9zYl9mb3JfZGVxdWFudFtxLT5jb2VmZl9wZXJfc2Jfc2VsZWN0XVtzYl0pIDwgKGxhc3RfY29lZmZbcS0+Y29lZmZfcGVyX3NiX3NlbGVjdF0gLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gcS0+cXVhbnRpemVkX2NvZWZmc1tjaF1bdGFiICsgMV1baV0gKiBkZXF1YW50X3RhYmxlW3EtPmNvZWZmX3Blcl9zYl9zZWxlY3RdW3RhYiArIDFdW3NiXSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+cXVhbnRpemVkX2NvZWZmc1tjaF1bdGFiXVtpXSAqIGRlcXVhbnRfdGFibGVbcS0+Y29lZmZfcGVyX3NiX3NlbGVjdF1bdGFiXVtzYl07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0bXAgPSBxLT5xdWFudGl6ZWRfY29lZmZzW2NoXVt0YWJdW2ldICogZGVxdWFudF90YWJsZVtxLT5jb2VmZl9wZXJfc2Jfc2VsZWN0XVt0YWJdW3NiXTsKKyAgICAgICAgICAgICAgICBpZih0bXAgPCAwKQorICAgICAgICAgICAgICAgICAgICB0bXAgKz0gMHhmZjsKKyAgICAgICAgICAgICAgICBxLT50b25lX2xldmVsX2lkeF9iYXNlW2NoXVtzYl1baV0gPSAodG1wIC8gMjU2KSAmIDB4ZmY7CisgICAgICAgICAgICB9CisKKyAgICBzYl91c2VkID0gUURNMl9TQl9VU0VEKHEtPnN1Yl9zYW1wbGluZyk7CisKKyAgICBpZiAoKHEtPnN1cGVyYmxvY2t0eXBlXzJfMyAhPSAwKSAmJiAhZmxhZykgeworICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBzYl91c2VkOyBzYisrKQorICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcS0+bmJfY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcS0+dG9uZV9sZXZlbF9pZHhbY2hdW3NiXVtpXSA9IHEtPnRvbmVfbGV2ZWxfaWR4X2Jhc2VbY2hdW3NiXVtpIC8gOF07CisgICAgICAgICAgICAgICAgICAgIGlmIChxLT50b25lX2xldmVsX2lkeFtjaF1bc2JdW2ldIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHEtPnRvbmVfbGV2ZWxbY2hdW3NiXVtpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHEtPnRvbmVfbGV2ZWxbY2hdW3NiXVtpXSA9IGZmdF90b25lX2xldmVsX3RhYmxlWzBdW3EtPnRvbmVfbGV2ZWxfaWR4W2NoXVtzYl1baV0gJiAweDNmXTsKKyAgICAgICAgICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGFiID0gcS0+c3VwZXJibG9ja3R5cGVfMl8zID8gMCA6IDE7CisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IHNiX3VzZWQ7IHNiKyspIHsKKyAgICAgICAgICAgIGlmICgoc2IgPj0gNCkgJiYgKHNiIDw9IDIzKSkgeworICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHEtPm5iX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gcS0+dG9uZV9sZXZlbF9pZHhfYmFzZVtjaF1bc2JdW2kgLyA4XSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT50b25lX2xldmVsX2lkeF9oaTFbY2hdW3NiIC8gOF1baSAvIDhdW2kgJSA4XSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT50b25lX2xldmVsX2lkeF9taWRbY2hdW3NiIC0gNF1baSAvIDhdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPnRvbmVfbGV2ZWxfaWR4X2hpMltjaF1bc2IgLSA0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEtPnRvbmVfbGV2ZWxfaWR4W2NoXVtzYl1baV0gPSB0bXAgJiAweGZmOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0bXAgPCAwKSB8fCAoIXEtPnN1cGVyYmxvY2t0eXBlXzJfMyAmJiAhdG1wKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT50b25lX2xldmVsW2NoXVtzYl1baV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPnRvbmVfbGV2ZWxbY2hdW3NiXVtpXSA9IGZmdF90b25lX2xldmVsX3RhYmxlW3RhYl1bdG1wICYgMHgzZl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc2IgPiA0KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHEtPm5iX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBxLT50b25lX2xldmVsX2lkeF9iYXNlW2NoXVtzYl1baSAvIDhdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT50b25lX2xldmVsX2lkeF9oaTFbY2hdWzJdW2kgLyA4XVtpICUgOF0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPnRvbmVfbGV2ZWxfaWR4X2hpMltjaF1bc2IgLSA0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT50b25lX2xldmVsX2lkeFtjaF1bc2JdW2ldID0gdG1wICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRtcCA8IDApIHx8ICghcS0+c3VwZXJibG9ja3R5cGVfMl8zICYmICF0bXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT50b25lX2xldmVsW2NoXVtzYl1baV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+dG9uZV9sZXZlbFtjaF1bc2JdW2ldID0gZmZ0X3RvbmVfbGV2ZWxfdGFibGVbdGFiXVt0bXAgJiAweDNmXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHEtPm5iX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBxLT50b25lX2xldmVsX2lkeFtjaF1bc2JdW2ldID0gcS0+dG9uZV9sZXZlbF9pZHhfYmFzZVtjaF1bc2JdW2kgLyA4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRtcCA8IDApIHx8ICghcS0+c3VwZXJibG9ja3R5cGVfMl8zICYmICF0bXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT50b25lX2xldmVsW2NoXVtzYl1baV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+dG9uZV9sZXZlbFtjaF1bc2JdW2ldID0gZmZ0X3RvbmVfbGV2ZWxfdGFibGVbdGFiXVt0bXAgJiAweDNmXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogUmVsYXRlZCB0byBzeW50aGVzaXMgZmlsdGVyCisgKiBDYWxsZWQgYnkgcHJvY2Vzc19zdWJwYWNrZXRfMTEKKyAqIGMgaXMgYnVpbHQgd2l0aCBkYXRhIGZyb20gc3VicGFja2V0IDExCisgKiBNb3N0IG9mIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGlmIHN1cGVyYmxvY2tfdHlwZV8yXzMgPT0gMCwKKyAqIG5ldmVyIHNlZW4gaXQgaW4gc2FtcGxlcy4KKyAqCisgKiBAcGFyYW0gdG9uZV9sZXZlbF9pZHgKKyAqIEBwYXJhbSB0b25lX2xldmVsX2lkeF90ZW1wCisgKiBAcGFyYW0gY29kaW5nX21ldGhvZCAgICAgICAgcS0+Y29kaW5nX21ldGhvZFswXVswXVswXQorICogQHBhcmFtIG5iX2NoYW5uZWxzICAgICAgICAgIG51bWJlciBvZiBjaGFubmVscworICogQHBhcmFtIGMgICAgICAgICAgICAgICAgICAgIGNvbWluZyBmcm9tIHN1YnBhY2tldCAxMSwgcGFzc2VkIGFzIDgqYworICogQHBhcmFtIHN1cGVyYmxvY2t0eXBlXzJfMyAgIGZsYWcgYmFzZWQgb24gc3VwZXJibG9jayBwYWNrZXQgdHlwZQorICogQHBhcmFtIGNtX3RhYmxlX3NlbGVjdCAgICAgIHEtPmNtX3RhYmxlX3NlbGVjdAorICovCitzdGF0aWMgdm9pZCBmaWxsX2NvZGluZ19tZXRob2RfYXJyYXkoc2JfaW50OF9hcnJheSB0b25lX2xldmVsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYl9pbnQ4X2FycmF5IHRvbmVfbGV2ZWxfaWR4X3RlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JfaW50OF9hcnJheSBjb2RpbmdfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYywgaW50IHN1cGVyYmxvY2t0eXBlXzJfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY21fdGFibGVfc2VsZWN0KQoreworICAgIGludCBjaCwgc2IsIGo7CisgICAgaW50IHRtcCwgYWNjLCBlc3BfNDAsIGNvbXA7CisgICAgaW50IGFkZDEsIGFkZDIsIGFkZDMsIGFkZDQ7CisgICAgaW50NjRfdCBtdWx0cmVzOworCisgICAgaWYgKCFzdXBlcmJsb2NrdHlwZV8yXzMpIHsKKyAgICAgICAgLyogVGhpcyBjYXNlIGlzIHVudGVzdGVkLCBubyBzYW1wbGVzIGF2YWlsYWJsZSAqLworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoTlVMTCwgIiFzdXBlcmJsb2NrdHlwZV8yXzMiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuYl9jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDMwOyBzYisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IDYzOyBqKyspIHsgIC8vIFRoZSBsb29wIG9ubHkgaXRlcmF0ZXMgdG8gNjMgc28gdGhlIGNvZGUgZG9lc24ndCBvdmVyZmxvdyB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGFkZDEgPSB0b25lX2xldmVsX2lkeFtjaF1bc2JdW2pdIC0gMTA7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZGQxIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZDEgPSAwOworICAgICAgICAgICAgICAgICAgICBhZGQyID0gYWRkMyA9IGFkZDQgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoc2IgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGQyID0gdG9uZV9sZXZlbF9pZHhbY2hdW3NiIC0gMl1bal0gKyB0b25lX2xldmVsX2lkeF9vZmZzZXRfdGFibGVbc2JdWzBdIC0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGQyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc2IgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGQzID0gdG9uZV9sZXZlbF9pZHhbY2hdW3NiIC0gMV1bal0gKyB0b25lX2xldmVsX2lkeF9vZmZzZXRfdGFibGVbc2JdWzFdIC0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGQzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc2IgPCAyOSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkNCA9IHRvbmVfbGV2ZWxfaWR4W2NoXVtzYiArIDFdW2pdICsgdG9uZV9sZXZlbF9pZHhfb2Zmc2V0X3RhYmxlW3NiXVszXSAtIDY7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkNCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkNCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG1wID0gdG9uZV9sZXZlbF9pZHhbY2hdW3NiXVtqICsgMV0gKiAyIC0gYWRkNCAtIGFkZDMgLSBhZGQyIC0gYWRkMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAwOworICAgICAgICAgICAgICAgICAgICB0b25lX2xldmVsX2lkeF90ZW1wW2NoXVtzYl1baiArIDFdID0gdG1wICYgMHhmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9uZV9sZXZlbF9pZHhfdGVtcFtjaF1bc2JdWzBdID0gdG9uZV9sZXZlbF9pZHhfdGVtcFtjaF1bc2JdWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWNjID0gMDsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5iX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDMwOyBzYisrKQorICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjYyArPSB0b25lX2xldmVsX2lkeF90ZW1wW2NoXVtzYl1bal07CisKKyAgICAgICAgICAgIG11bHRyZXMgPSAweDY2NjY2NjY3TEwgKiAoYWNjICogMTApOworICAgICAgICAgICAgZXNwXzQwID0gKG11bHRyZXMgPj4gMzIpIC8gOCArICgobXVsdHJlcyAmIDB4ZmZmZmZmZmYpID4+IDMxKTsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyAgY2ggPCBuYl9jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCAzMDsgc2IrKykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSB0b25lX2xldmVsX2lkeF90ZW1wW2NoXVtzYl1bal0qIGVzcF80MCAqIDEwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgKz0gMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgLz0gMjU2OyAvLyBzaWduZWQgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChzYikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPCAzMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSAzMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCArPSAxNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcCA8IDI0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IDI0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wICs9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wIDw9IDUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXAgPD0gMTApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wIDw9IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29tcCA8PSAyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nX21ldGhvZFtjaF1bc2JdW2pdID0gKCh0bXAgJiAweGZmZmEpICsgMzAgKSYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgMzA7IHNiKyspCisgICAgICAgICAgICAgICAgZml4X2NvZGluZ19tZXRob2RfYXJyYXkoc2IsIG5iX2NoYW5uZWxzLCBjb2RpbmdfbWV0aG9kKTsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5iX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDMwOyBzYisrKQorICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYiA+PSAxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gPCAxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nX21ldGhvZFtjaF1bc2JdW2pdID0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYiA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gPCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGluZ19tZXRob2RbY2hdW3NiXVtqXSA9IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gPCAzMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGluZ19tZXRob2RbY2hdW3NiXVtqXSA9IDMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzdXBlcmJsb2NrdHlwZV8yXzMgIT0gMAorICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuYl9jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDMwOyBzYisrKQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKQorICAgICAgICAgICAgICAgICAgICBjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gPSBjb2RpbmdfbWV0aG9kX3RhYmxlW2NtX3RhYmxlX3NlbGVjdF1bc2JdOworICAgIH0KK30KKworLyoqCisgKgorICogQ2FsbGVkIGJ5IHByb2Nlc3Nfc3VicGFja2V0XzExIHRvIHByb2Nlc3MgbW9yZSBkYXRhIGZyb20gc3VicGFja2V0IDExCisgKiB3aXRoIHNiIDAtOC4KKyAqIENhbGxlZCBieSBwcm9jZXNzX3N1YnBhY2tldF8xMiB0byBwcm9jZXNzIGRhdGEgZnJvbSBzdWJwYWNrZXQgMTIgd2l0aAorICogc2IgOC1zYl91c2VkLgorICoKKyAqIEBwYXJhbSBxICAgICAgICAgY29udGV4dAorICogQHBhcmFtIGdiICAgICAgICBiaXRyZWFkZXIgY29udGV4dAorICogQHBhcmFtIGxlbmd0aCAgICBwYWNrZXQgbGVuZ3RoIGluIGJpdHMKKyAqIEBwYXJhbSBzYl9taW4gICAgbG93ZXIgc3ViYmFuZCBwcm9jZXNzZWQgKHNiX21pbiBpbmNsdWRlZCkKKyAqIEBwYXJhbSBzYl9tYXggICAgaGlnaGVyIHN1YmJhbmQgcHJvY2Vzc2VkIChzYl9tYXggZXhjbHVkZWQpCisgKi8KK3N0YXRpYyBpbnQgc3ludGhmaWx0X2J1aWxkX3NiX3NhbXBsZXMoUURNMkNvbnRleHQgKnEsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwgaW50IHNiX21pbiwgaW50IHNiX21heCkKK3sKKyAgICBpbnQgc2IsIGosIGssIG4sIGNoLCBydW4sIGNoYW5uZWxzOworICAgIGludCBqb2luZWRfc3RlcmVvLCB6ZXJvX2VuY29kaW5nOworICAgIGludCB0eXBlMzRfZmlyc3Q7CisgICAgZmxvYXQgdHlwZTM0X2RpdiA9IDA7CisgICAgZmxvYXQgdHlwZTM0X3ByZWRpY3RvcjsKKyAgICBmbG9hdCBzYW1wbGVzWzEwXTsKKyAgICBpbnQgc2lnbl9iaXRzWzE2XSA9IHswfTsKKworICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAvLyBJZiBubyBkYXRhIHVzZSBub2lzZQorICAgICAgICBmb3IgKHNiPXNiX21pbjsgc2IgPCBzYl9tYXg7IHNiKyspCisgICAgICAgICAgICBidWlsZF9zYl9zYW1wbGVzX2Zyb21fbm9pc2UocSwgc2IpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoc2IgPSBzYl9taW47IHNiIDwgc2JfbWF4OyBzYisrKSB7CisgICAgICAgIGNoYW5uZWxzID0gcS0+bmJfY2hhbm5lbHM7CisKKyAgICAgICAgaWYgKHEtPm5iX2NoYW5uZWxzIDw9IDEgfHwgc2IgPCAxMikKKyAgICAgICAgICAgIGpvaW5lZF9zdGVyZW8gPSAwOworICAgICAgICBlbHNlIGlmIChzYiA+PSAyNCkKKyAgICAgICAgICAgIGpvaW5lZF9zdGVyZW8gPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBqb2luZWRfc3RlcmVvID0gKGdldF9iaXRzX2xlZnQoZ2IpID49IDEpID8gZ2V0X2JpdHMxKGdiKSA6IDA7CisKKyAgICAgICAgaWYgKGpvaW5lZF9zdGVyZW8pIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA+PSAxNikKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgICAgICAgICAgc2lnbl9iaXRzW2pdID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspCisgICAgICAgICAgICAgICAgaWYgKHEtPmNvZGluZ19tZXRob2RbMV1bc2JdW2pdID4gcS0+Y29kaW5nX21ldGhvZFswXVtzYl1bal0pCisgICAgICAgICAgICAgICAgICAgIHEtPmNvZGluZ19tZXRob2RbMF1bc2JdW2pdID0gcS0+Y29kaW5nX21ldGhvZFsxXVtzYl1bal07CisKKyAgICAgICAgICAgIGlmIChmaXhfY29kaW5nX21ldGhvZF9hcnJheShzYiwgcS0+bmJfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPmNvZGluZ19tZXRob2QpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImNvZGluZyBtZXRob2QgaW52YWxpZFxuIik7CisgICAgICAgICAgICAgICAgYnVpbGRfc2Jfc2FtcGxlc19mcm9tX25vaXNlKHEsIHNiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5uZWxzID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBGSVhfTk9JU0VfSURYKHEtPm5vaXNlX2lkeCk7CisgICAgICAgICAgICB6ZXJvX2VuY29kaW5nID0gKGdldF9iaXRzX2xlZnQoZ2IpID49IDEpID8gZ2V0X2JpdHMxKGdiKSA6IDA7CisgICAgICAgICAgICB0eXBlMzRfcHJlZGljdG9yID0gMC4wOworICAgICAgICAgICAgdHlwZTM0X2ZpcnN0ID0gMTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDEyODsgKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChxLT5jb2RpbmdfbWV0aG9kW2NoXVtzYl1baiAvIDJdKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA+PSAxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ZXJvX2VuY29kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA1OyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaiArIDIgKiBrKSA+PSAxMjgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzWzIgKiBrXSA9IGdldF9iaXRzMShnYikgPyBkZXF1YW50XzFiaXRbam9pbmVkX3N0ZXJlb11bMiAqIGdldF9iaXRzMShnYildIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID49IDI0MykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgOGJpdCBjb2Rld29yZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA1OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzWzIgKiBrXSA9IGRlcXVhbnRfMWJpdFtqb2luZWRfc3RlcmVvXVtyYW5kb21fZGVxdWFudF9pbmRleFtuXVtrXV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA1OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbMiAqIGsgKyAxXSA9IFNCX0RJVEhFUklOR19OT0lTRShzYixxLT5ub2lzZV9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMTA7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1trXSA9IFNCX0RJVEhFUklOR19OT0lTRShzYixxLT5ub2lzZV9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpID49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmID0gMC44MTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gLWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiAtPSBub2lzZV9zYW1wbGVzWygoc2IgKyAxKSAqIChqICs1ICogY2ggKyAxKSkgJiAxMjddICogOS4wIC8gNDAuMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzWzBdID0gZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1swXSA9IFNCX0RJVEhFUklOR19OT0lTRShzYixxLT5ub2lzZV9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPj0gMTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoemVyb19lbmNvZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGogKyBrKSA+PSAxMjgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzW2tdID0gKGdldF9iaXRzMShnYikgPT0gMCkgPyAwIDogZGVxdWFudF8xYml0W2pvaW5lZF9zdGVyZW9dWzIgKiBnZXRfYml0czEoZ2IpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBnZXRfYml0cyAoZ2IsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA+PSAyNDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIDhiaXQgY29kZXdvcmRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNTsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1trXSA9IGRlcXVhbnRfMWJpdFtqb2luZWRfc3RlcmVvXVtyYW5kb21fZGVxdWFudF9pbmRleFtuXVtrXV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNTsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzW2tdID0gU0JfRElUSEVSSU5HX05PSVNFKHNiLHEtPm5vaXNlX2lkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBydW4gPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA+PSA3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGdldF9iaXRzKGdiLCA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA+PSAxMjUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgN2JpdCBjb2Rld29yZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAzOyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNba10gPSAocmFuZG9tX2RlcXVhbnRfdHlwZTI0W25dW2tdIC0gMi4wKSAqIDAuNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1trXSA9IFNCX0RJVEhFUklOR19OT0lTRShzYixxLT5ub2lzZV9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPj0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4ID0gcWRtMl9nZXRfdmxjKGdiLCAmdmxjX3RhYl90eXBlMzAsIDAsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBGRl9BUlJBWV9FTEVNUyh0eXBlMzBfZGVxdWFudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImluZGV4ICVkIG91dCBvZiB0eXBlMzBfZGVxdWFudCBhcnJheVxuIiwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1swXSA9IHR5cGUzMF9kZXF1YW50W2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbMF0gPSBTQl9ESVRIRVJJTkdfTk9JU0Uoc2IscS0+bm9pc2VfaWR4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPj0gNykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlMzRfZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTM0X2RpdiA9IChmbG9hdCkoMSA8PCBnZXRfYml0cyhnYiwgMikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzWzBdID0gKChmbG9hdClnZXRfYml0cyhnYiwgNSkgLSAxNi4wKSAvIDE1LjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUzNF9wcmVkaWN0b3IgPSBzYW1wbGVzWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlMzRfZmlyc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4ID0gcWRtMl9nZXRfdmxjKGdiLCAmdmxjX3RhYl90eXBlMzQsIDAsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gRkZfQVJSQVlfRUxFTVModHlwZTM0X2RlbHRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImluZGV4ICVkIG91dCBvZiB0eXBlMzRfZGVsdGEgYXJyYXlcbiIsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbMF0gPSB0eXBlMzRfZGVsdGFbaW5kZXhdIC8gdHlwZTM0X2RpdiArIHR5cGUzNF9wcmVkaWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUzNF9wcmVkaWN0b3IgPSBzYW1wbGVzWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1swXSA9IFNCX0RJVEhFUklOR19OT0lTRShzYixxLT5ub2lzZV9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzWzBdID0gU0JfRElUSEVSSU5HX05PSVNFKHNiLHEtPm5vaXNlX2lkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBydW4gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGpvaW5lZF9zdGVyZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHJ1biAmJiBqICsgayA8IDEyODsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxLT5zYl9zYW1wbGVzWzBdW2ogKyBrXVtzYl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPnRvbmVfbGV2ZWxbMF1bc2JdWyhqICsgaykgLyAyXSAqIHNhbXBsZXNba107CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocS0+bmJfY2hhbm5lbHMgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWduX2JpdHNbKGogKyBrKSAvIDhdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5zYl9zYW1wbGVzWzFdW2ogKyBrXVtzYl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+dG9uZV9sZXZlbFsxXVtzYl1bKGogKyBrKSAvIDJdICogLXNhbXBsZXNba107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5zYl9zYW1wbGVzWzFdW2ogKyBrXVtzYl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+dG9uZV9sZXZlbFsxXVtzYl1bKGogKyBrKSAvIDJdICogc2FtcGxlc1trXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBydW47IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaiArIGspIDwgMTI4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPnNiX3NhbXBsZXNbY2hdW2ogKyBrXVtzYl0gPSBxLT50b25lX2xldmVsW2NoXVtzYl1bKGogKyBrKS8yXSAqIHNhbXBsZXNba107CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaiArPSBydW47CisgICAgICAgICAgICB9IC8vIGogbG9vcAorICAgICAgICB9IC8vIGNoYW5uZWwgbG9vcAorICAgIH0gLy8gc3ViYmFuZCBsb29wCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogSW5pdCB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIGNoYW5uZWwgaW4gcXVhbnRpemVkX2NvZWZmcyB3aXRoIGRhdGEKKyAqIGZyb20gcGFja2V0IDEwIChxdWFudGl6ZWRfY29lZmZzW2NoXVswXSkuCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gcHJvY2Vzc19zdWJwYWNrZXRfOSwgYnV0IGZvciBhIHNpbmdsZSBjaGFubmVsCisgKiBhbmQgZm9yIGVsZW1lbnQgWzBdCisgKiBzYW1lIFZMQyB0YWJsZXMgYXMgcHJvY2Vzc19zdWJwYWNrZXRfOSBhcmUgdXNlZC4KKyAqCisgKiBAcGFyYW0gcXVhbnRpemVkX2NvZWZmcyAgICBwb2ludGVyIHRvIHF1YW50aXplZF9jb2VmZnNbY2hdWzBdCisgKiBAcGFyYW0gZ2IgICAgICAgIGJpdHJlYWRlciBjb250ZXh0CisgKi8KK3N0YXRpYyBpbnQgaW5pdF9xdWFudGl6ZWRfY29lZmZzX2VsZW0wKGludDhfdCAqcXVhbnRpemVkX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgaSwgaywgcnVuLCBsZXZlbCwgZGlmZjsKKworICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDE2KQorICAgICAgICByZXR1cm4gLTE7CisgICAgbGV2ZWwgPSBxZG0yX2dldF92bGMoZ2IsICZ2bGNfdGFiX2xldmVsLCAwLCAyKTsKKworICAgIHF1YW50aXplZF9jb2VmZnNbMF0gPSBsZXZlbDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA3OyApIHsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgMTYpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJ1biA9IHFkbTJfZ2V0X3ZsYyhnYiwgJnZsY190YWJfcnVuLCAwLCAxKSArIDE7CisKKyAgICAgICAgaWYgKGkgKyBydW4gPj0gOCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAxNikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZGlmZiA9IHFkbTJfZ2V0X3NlX3ZsYygmdmxjX3RhYl9kaWZmLCBnYiwgMik7CisKKyAgICAgICAgZm9yIChrID0gMTsgayA8PSBydW47IGsrKykKKyAgICAgICAgICAgIHF1YW50aXplZF9jb2VmZnNbaSArIGtdID0gKGxldmVsICsgKChrICogZGlmZikgLyBydW4pKTsKKworICAgICAgICBsZXZlbCArPSBkaWZmOworICAgICAgICBpICs9IHJ1bjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVsYXRlZCB0byBzeW50aGVzaXMgZmlsdGVyLCBwcm9jZXNzIGRhdGEgZnJvbSBwYWNrZXQgMTAKKyAqIEluaXQgcGFydCBvZiBxdWFudGl6ZWRfY29lZmZzIHZpYSBmdW5jdGlvbiBpbml0X3F1YW50aXplZF9jb2VmZnNfZWxlbTAKKyAqIEluaXQgdG9uZV9sZXZlbF9pZHhfaGkxLCB0b25lX2xldmVsX2lkeF9oaTIsIHRvbmVfbGV2ZWxfaWR4X21pZCB3aXRoCisgKiBkYXRhIGZyb20gcGFja2V0IDEwCisgKgorICogQHBhcmFtIHEgICAgICAgICBjb250ZXh0CisgKiBAcGFyYW0gZ2IgICAgICAgIGJpdHJlYWRlciBjb250ZXh0CisgKi8KK3N0YXRpYyB2b2lkIGluaXRfdG9uZV9sZXZlbF9kZXF1YW50aXphdGlvbihRRE0yQ29udGV4dCAqcSwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IHNiLCBqLCBrLCBuLCBjaDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IHEtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGluaXRfcXVhbnRpemVkX2NvZWZmc19lbGVtMChxLT5xdWFudGl6ZWRfY29lZmZzW2NoXVswXSwgZ2IpOworCisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDE2KSB7CisgICAgICAgICAgICBtZW1zZXQocS0+cXVhbnRpemVkX2NvZWZmc1tjaF1bMF0sIDAsIDgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuID0gcS0+c3ViX3NhbXBsaW5nICsgMTsKKworICAgIGZvciAoc2IgPSAwOyBzYiA8IG47IHNiKyspCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHEtPm5iX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrIDwgODsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEtPnRvbmVfbGV2ZWxfaWR4X2hpMVtjaF1bc2JdW2pdW2tdID0gcWRtMl9nZXRfdmxjKGdiLCAmdmxjX3RhYl90b25lX2xldmVsX2lkeF9oaTEsIDAsIDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICBxLT50b25lX2xldmVsX2lkeF9oaTFbY2hdW3NiXVtqXVtrXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgbiA9IFFETTJfU0JfVVNFRChxLT5zdWJfc2FtcGxpbmcpIC0gNDsKKworICAgIGZvciAoc2IgPSAwOyBzYiA8IG47IHNiKyspCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHEtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAxNikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHEtPnRvbmVfbGV2ZWxfaWR4X2hpMltjaF1bc2JdID0gcWRtMl9nZXRfdmxjKGdiLCAmdmxjX3RhYl90b25lX2xldmVsX2lkeF9oaTIsIDAsIDIpOworICAgICAgICAgICAgaWYgKHNiID4gMTkpCisgICAgICAgICAgICAgICAgcS0+dG9uZV9sZXZlbF9pZHhfaGkyW2NoXVtzYl0gLT0gMTY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgcS0+dG9uZV9sZXZlbF9pZHhfbWlkW2NoXVtzYl1bal0gPSAtMTY7CisgICAgICAgIH0KKworICAgIG4gPSBRRE0yX1NCX1VTRUQocS0+c3ViX3NhbXBsaW5nKSAtIDU7CisKKyAgICBmb3IgKHNiID0gMDsgc2IgPCBuOyBzYisrKQorICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBxLT5uYl9jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAxNikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcS0+dG9uZV9sZXZlbF9pZHhfbWlkW2NoXVtzYl1bal0gPSBxZG0yX2dldF92bGMoZ2IsICZ2bGNfdGFiX3RvbmVfbGV2ZWxfaWR4X21pZCwgMCwgMikgLSAzMjsKKyAgICAgICAgICAgIH0KK30KKworLyoqCisgKiBQcm9jZXNzIHN1YnBhY2tldCA5LCBpbml0IHF1YW50aXplZF9jb2VmZnMgd2l0aCBkYXRhIGZyb20gaXQKKyAqCisgKiBAcGFyYW0gcSAgICAgICBjb250ZXh0CisgKiBAcGFyYW0gbm9kZSAgICBwb2ludGVyIHRvIG5vZGUgd2l0aCBwYWNrZXQKKyAqLworc3RhdGljIGludCBwcm9jZXNzX3N1YnBhY2tldF85KFFETTJDb250ZXh0ICpxLCBRRE0yU3ViUE5vZGUgKm5vZGUpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgaSwgaiwgaywgbiwgY2gsIHJ1biwgbGV2ZWwsIGRpZmY7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgbm9kZS0+cGFja2V0LT5kYXRhLCBub2RlLT5wYWNrZXQtPnNpemUgKiA4KTsKKworICAgIG4gPSBjb2VmZl9wZXJfc2JfZm9yX2F2Z1txLT5jb2VmZl9wZXJfc2Jfc2VsZWN0XVtRRE0yX1NCX1VTRUQocS0+c3ViX3NhbXBsaW5nKSAtIDFdICsgMTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHEtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBsZXZlbCA9IHFkbTJfZ2V0X3ZsYygmZ2IsICZ2bGNfdGFiX2xldmVsLCAwLCAyKTsKKyAgICAgICAgICAgIHEtPnF1YW50aXplZF9jb2VmZnNbY2hdW2ldWzBdID0gbGV2ZWw7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoOCAtIDEpOyApIHsKKyAgICAgICAgICAgICAgICBydW4gID0gcWRtMl9nZXRfdmxjKCZnYiwgJnZsY190YWJfcnVuLCAwLCAxKSArIDE7CisgICAgICAgICAgICAgICAgZGlmZiA9IHFkbTJfZ2V0X3NlX3ZsYygmdmxjX3RhYl9kaWZmLCAmZ2IsIDIpOworCisgICAgICAgICAgICAgICAgaWYgKGogKyBydW4gPj0gOCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgZm9yIChrID0gMTsgayA8PSBydW47IGsrKykKKyAgICAgICAgICAgICAgICAgICAgcS0+cXVhbnRpemVkX2NvZWZmc1tjaF1baV1baiArIGtdID0gKGxldmVsICsgKChrICogZGlmZikgLyBydW4pKTsKKworICAgICAgICAgICAgICAgIGxldmVsICs9IGRpZmY7CisgICAgICAgICAgICAgICAgaiAgICAgKz0gcnVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBxLT5uYl9jaGFubmVsczsgY2grKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIHEtPnF1YW50aXplZF9jb2VmZnNbY2hdWzBdW2ldID0gMDsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFByb2Nlc3Mgc3VicGFja2V0IDEwIGlmIG5vdCBudWxsLCBlbHNlCisgKgorICogQHBhcmFtIHEgICAgICAgICBjb250ZXh0CisgKiBAcGFyYW0gbm9kZSAgICAgIHBvaW50ZXIgdG8gbm9kZSB3aXRoIHBhY2tldAorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3N1YnBhY2tldF8xMChRRE0yQ29udGV4dCAqcSwgUURNMlN1YlBOb2RlICpub2RlKQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisKKyAgICBpZiAobm9kZSkgeworICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgbm9kZS0+cGFja2V0LT5kYXRhLCBub2RlLT5wYWNrZXQtPnNpemUgKiA4KTsKKyAgICAgICAgaW5pdF90b25lX2xldmVsX2RlcXVhbnRpemF0aW9uKHEsICZnYik7CisgICAgICAgIGZpbGxfdG9uZV9sZXZlbF9hcnJheShxLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsX3RvbmVfbGV2ZWxfYXJyYXkocSwgMCk7CisgICAgfQorfQorCisvKioKKyAqIFByb2Nlc3Mgc3VicGFja2V0IDExCisgKgorICogQHBhcmFtIHEgICAgICAgICBjb250ZXh0CisgKiBAcGFyYW0gbm9kZSAgICAgIHBvaW50ZXIgdG8gbm9kZSB3aXRoIHBhY2tldAorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3N1YnBhY2tldF8xMShRRE0yQ29udGV4dCAqcSwgUURNMlN1YlBOb2RlICpub2RlKQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAobm9kZSkgeworICAgICAgICBsZW5ndGggPSBub2RlLT5wYWNrZXQtPnNpemUgKiA4OworICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgbm9kZS0+cGFja2V0LT5kYXRhLCBsZW5ndGgpOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMzIpIHsKKyAgICAgICAgaW50IGMgPSBnZXRfYml0cygmZ2IsIDEzKTsKKworICAgICAgICBpZiAoYyA+IDMpCisgICAgICAgICAgICBmaWxsX2NvZGluZ19tZXRob2RfYXJyYXkocS0+dG9uZV9sZXZlbF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+dG9uZV9sZXZlbF9pZHhfdGVtcCwgcS0+Y29kaW5nX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5uYl9jaGFubmVscywgOCAqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+c3VwZXJibG9ja3R5cGVfMl8zLCBxLT5jbV90YWJsZV9zZWxlY3QpOworICAgIH0KKworICAgIHN5bnRoZmlsdF9idWlsZF9zYl9zYW1wbGVzKHEsICZnYiwgbGVuZ3RoLCAwLCA4KTsKK30KKworLyoqCisgKiBQcm9jZXNzIHN1YnBhY2tldCAxMgorICoKKyAqIEBwYXJhbSBxICAgICAgICAgY29udGV4dAorICogQHBhcmFtIG5vZGUgICAgICBwb2ludGVyIHRvIG5vZGUgd2l0aCBwYWNrZXQKKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19zdWJwYWNrZXRfMTIoUURNMkNvbnRleHQgKnEsIFFETTJTdWJQTm9kZSAqbm9kZSkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBsZW5ndGggPSAwOworCisgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgbGVuZ3RoID0gbm9kZS0+cGFja2V0LT5zaXplICogODsKKyAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIG5vZGUtPnBhY2tldC0+ZGF0YSwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBzeW50aGZpbHRfYnVpbGRfc2Jfc2FtcGxlcyhxLCAmZ2IsIGxlbmd0aCwgOCwgUURNMl9TQl9VU0VEKHEtPnN1Yl9zYW1wbGluZykpOworfQorCisvKioKKyAqIFByb2Nlc3MgbmV3IHN1YnBhY2tldHMgZm9yIHN5bnRoZXNpcyBmaWx0ZXIKKyAqCisgKiBAcGFyYW0gcSAgICAgICBjb250ZXh0CisgKiBAcGFyYW0gbGlzdCAgICBsaXN0IHdpdGggc3ludGhlc2lzIGZpbHRlciBwYWNrZXRzIChsaXN0IEQpCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3Nfc3ludGhlc2lzX3N1YnBhY2tldHMoUURNMkNvbnRleHQgKnEsIFFETTJTdWJQTm9kZSAqbGlzdCkKK3sKKyAgICBRRE0yU3ViUE5vZGUgKm5vZGVzWzRdOworCisgICAgbm9kZXNbMF0gPSBxZG0yX3NlYXJjaF9zdWJwYWNrZXRfdHlwZV9pbl9saXN0KGxpc3QsIDkpOworICAgIGlmIChub2Rlc1swXSkKKyAgICAgICAgcHJvY2Vzc19zdWJwYWNrZXRfOShxLCBub2Rlc1swXSk7CisKKyAgICBub2Rlc1sxXSA9IHFkbTJfc2VhcmNoX3N1YnBhY2tldF90eXBlX2luX2xpc3QobGlzdCwgMTApOworICAgIGlmIChub2Rlc1sxXSkKKyAgICAgICAgcHJvY2Vzc19zdWJwYWNrZXRfMTAocSwgbm9kZXNbMV0pOworICAgIGVsc2UKKyAgICAgICAgcHJvY2Vzc19zdWJwYWNrZXRfMTAocSwgTlVMTCk7CisKKyAgICBub2Rlc1syXSA9IHFkbTJfc2VhcmNoX3N1YnBhY2tldF90eXBlX2luX2xpc3QobGlzdCwgMTEpOworICAgIGlmIChub2Rlc1swXSAmJiBub2Rlc1sxXSAmJiBub2Rlc1syXSkKKyAgICAgICAgcHJvY2Vzc19zdWJwYWNrZXRfMTEocSwgbm9kZXNbMl0pOworICAgIGVsc2UKKyAgICAgICAgcHJvY2Vzc19zdWJwYWNrZXRfMTEocSwgTlVMTCk7CisKKyAgICBub2Rlc1szXSA9IHFkbTJfc2VhcmNoX3N1YnBhY2tldF90eXBlX2luX2xpc3QobGlzdCwgMTIpOworICAgIGlmIChub2Rlc1swXSAmJiBub2Rlc1sxXSAmJiBub2Rlc1szXSkKKyAgICAgICAgcHJvY2Vzc19zdWJwYWNrZXRfMTIocSwgbm9kZXNbM10pOworICAgIGVsc2UKKyAgICAgICAgcHJvY2Vzc19zdWJwYWNrZXRfMTIocSwgTlVMTCk7Cit9CisKKy8qKgorICogRGVjb2RlIHN1cGVyYmxvY2ssIGZpbGwgcGFja2V0IGxpc3RzLgorICoKKyAqIEBwYXJhbSBxICAgIGNvbnRleHQKKyAqLworc3RhdGljIHZvaWQgcWRtMl9kZWNvZGVfc3VwZXJfYmxvY2soUURNMkNvbnRleHQgKnEpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBRRE0yU3ViUGFja2V0IGhlYWRlciwgKnBhY2tldDsKKyAgICBpbnQgaSwgcGFja2V0X2J5dGVzLCBzdWJfcGFja2V0X3NpemUsIHN1Yl9wYWNrZXRzX0Q7CisgICAgdW5zaWduZWQgaW50IG5leHRfaW5kZXggPSAwOworCisgICAgbWVtc2V0KHEtPnRvbmVfbGV2ZWxfaWR4X2hpMSwgMCwgc2l6ZW9mKHEtPnRvbmVfbGV2ZWxfaWR4X2hpMSkpOworICAgIG1lbXNldChxLT50b25lX2xldmVsX2lkeF9taWQsIDAsIHNpemVvZihxLT50b25lX2xldmVsX2lkeF9taWQpKTsKKyAgICBtZW1zZXQocS0+dG9uZV9sZXZlbF9pZHhfaGkyLCAwLCBzaXplb2YocS0+dG9uZV9sZXZlbF9pZHhfaGkyKSk7CisKKyAgICBxLT5zdWJfcGFja2V0c19CID0gMDsKKyAgICBzdWJfcGFja2V0c19EICAgID0gMDsKKworICAgIGF2ZXJhZ2VfcXVhbnRpemVkX2NvZWZmcyhxKTsgLy8gYXZlcmFnZSBlbGVtZW50cyBpbiBxdWFudGl6ZWRfY29lZmZzW21heF9jaF1bMTBdWzhdCisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgcS0+Y29tcHJlc3NlZF9kYXRhLCBxLT5jb21wcmVzc2VkX3NpemUgKiA4KTsKKyAgICBxZG0yX2RlY29kZV9zdWJfcGFja2V0X2hlYWRlcigmZ2IsICZoZWFkZXIpOworCisgICAgaWYgKGhlYWRlci50eXBlIDwgMiB8fCBoZWFkZXIudHlwZSA+PSA4KSB7CisgICAgICAgIHEtPmhhc19lcnJvcnMgPSAxOworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiYmFkIHN1cGVyYmxvY2sgdHlwZVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBxLT5zdXBlcmJsb2NrdHlwZV8yXzMgPSAoaGVhZGVyLnR5cGUgPT0gMiB8fCBoZWFkZXIudHlwZSA9PSAzKTsKKyAgICBwYWNrZXRfYnl0ZXMgICAgICAgICAgPSAocS0+Y29tcHJlc3NlZF9zaXplIC0gZ2V0X2JpdHNfY291bnQoJmdiKSAvIDgpOworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGhlYWRlci5kYXRhLCBoZWFkZXIuc2l6ZSAqIDgpOworCisgICAgaWYgKGhlYWRlci50eXBlID09IDIgfHwgaGVhZGVyLnR5cGUgPT0gNCB8fCBoZWFkZXIudHlwZSA9PSA1KSB7CisgICAgICAgIGludCBjc3VtID0gMjU3ICogZ2V0X2JpdHMoJmdiLCA4KTsKKyAgICAgICAgY3N1bSArPSAyICogZ2V0X2JpdHMoJmdiLCA4KTsKKworICAgICAgICBjc3VtID0gcWRtMl9wYWNrZXRfY2hlY2tzdW0ocS0+Y29tcHJlc3NlZF9kYXRhLCBxLT5jaGVja3N1bV9zaXplLCBjc3VtKTsKKworICAgICAgICBpZiAoY3N1bSAhPSAwKSB7CisgICAgICAgICAgICBxLT5oYXNfZXJyb3JzID0gMTsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJiYWQgcGFja2V0IGNoZWNrc3VtXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHEtPnN1Yl9wYWNrZXRfbGlzdF9CWzBdLnBhY2tldCA9IE5VTEw7CisgICAgcS0+c3ViX3BhY2tldF9saXN0X0RbMF0ucGFja2V0ID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIGlmICgtLXEtPmZmdF9sZXZlbF9leHBbaV0gPCAwKQorICAgICAgICAgICAgcS0+ZmZ0X2xldmVsX2V4cFtpXSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBwYWNrZXRfYnl0ZXMgPiAwOyBpKyspIHsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgaWYgKGkgPj0gRkZfQVJSQVlfRUxFTVMocS0+c3ViX3BhY2tldF9saXN0X0EpKSB7CisgICAgICAgICAgICBTQU1QTEVTX05FRURFRF8yKCJ0b28gbWFueSBwYWNrZXQgYnl0ZXMiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHEtPnN1Yl9wYWNrZXRfbGlzdF9BW2ldLm5leHQgPSBOVUxMOworCisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgcS0+c3ViX3BhY2tldF9saXN0X0FbaSAtIDFdLm5leHQgPSAmcS0+c3ViX3BhY2tldF9saXN0X0FbaV07CisKKyAgICAgICAgICAgIC8qIHNlZWsgdG8gbmV4dCBibG9jayAqLworICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIGhlYWRlci5kYXRhLCBoZWFkZXIuc2l6ZSAqIDgpOworICAgICAgICAgICAgc2tpcF9iaXRzKCZnYiwgbmV4dF9pbmRleCAqIDgpOworCisgICAgICAgICAgICBpZiAobmV4dF9pbmRleCA+PSBoZWFkZXIuc2l6ZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRlY29kZSBzdWJwYWNrZXQgKi8KKyAgICAgICAgcGFja2V0ID0gJnEtPnN1Yl9wYWNrZXRzW2ldOworICAgICAgICBxZG0yX2RlY29kZV9zdWJfcGFja2V0X2hlYWRlcigmZ2IsIHBhY2tldCk7CisgICAgICAgIG5leHRfaW5kZXggICAgICA9IHBhY2tldC0+c2l6ZSArIGdldF9iaXRzX2NvdW50KCZnYikgLyA4OworICAgICAgICBzdWJfcGFja2V0X3NpemUgPSAoKHBhY2tldC0+c2l6ZSA+IDB4ZmYpID8gMSA6IDApICsgcGFja2V0LT5zaXplICsgMjsKKworICAgICAgICBpZiAocGFja2V0LT50eXBlID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoc3ViX3BhY2tldF9zaXplID4gcGFja2V0X2J5dGVzKSB7CisgICAgICAgICAgICBpZiAocGFja2V0LT50eXBlICE9IDEwICYmIHBhY2tldC0+dHlwZSAhPSAxMSAmJiBwYWNrZXQtPnR5cGUgIT0gMTIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwYWNrZXQtPnNpemUgKz0gcGFja2V0X2J5dGVzIC0gc3ViX3BhY2tldF9zaXplOworICAgICAgICB9CisKKyAgICAgICAgcGFja2V0X2J5dGVzIC09IHN1Yl9wYWNrZXRfc2l6ZTsKKworICAgICAgICAvKiBhZGQgc3VicGFja2V0IHRvICdhbGwgc3VicGFja2V0cycgbGlzdCAqLworICAgICAgICBxLT5zdWJfcGFja2V0X2xpc3RfQVtpXS5wYWNrZXQgPSBwYWNrZXQ7CisKKyAgICAgICAgLyogYWRkIHN1YnBhY2tldCB0byByZWxhdGVkIGxpc3QgKi8KKyAgICAgICAgaWYgKHBhY2tldC0+dHlwZSA9PSA4KSB7CisgICAgICAgICAgICBTQU1QTEVTX05FRURFRF8yKCJwYWNrZXQgdHlwZSA4Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAocGFja2V0LT50eXBlID49IDkgJiYgcGFja2V0LT50eXBlIDw9IDEyKSB7CisgICAgICAgICAgICAvKiBwYWNrZXRzIGZvciBNUEVHIEF1ZGlvIGxpa2UgU3ludGhlc2lzIEZpbHRlciAqLworICAgICAgICAgICAgUURNMl9MSVNUX0FERChxLT5zdWJfcGFja2V0X2xpc3RfRCwgc3ViX3BhY2tldHNfRCwgcGFja2V0KTsKKyAgICAgICAgfSBlbHNlIGlmIChwYWNrZXQtPnR5cGUgPT0gMTMpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspCisgICAgICAgICAgICAgICAgcS0+ZmZ0X2xldmVsX2V4cFtqXSA9IGdldF9iaXRzKCZnYiwgNik7CisgICAgICAgIH0gZWxzZSBpZiAocGFja2V0LT50eXBlID09IDE0KSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorICAgICAgICAgICAgICAgIHEtPmZmdF9sZXZlbF9leHBbal0gPSBxZG0yX2dldF92bGMoJmdiLCAmZmZ0X2xldmVsX2V4cF92bGMsIDAsIDIpOworICAgICAgICB9IGVsc2UgaWYgKHBhY2tldC0+dHlwZSA9PSAxNSkgeworICAgICAgICAgICAgU0FNUExFU19ORUVERURfMigicGFja2V0IHR5cGUgMTUiKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHBhY2tldC0+dHlwZSA+PSAxNiAmJiBwYWNrZXQtPnR5cGUgPCA0OCAmJgorICAgICAgICAgICAgICAgICAgICFmZnRfc3VicGFja2V0c1twYWNrZXQtPnR5cGUgLSAxNl0pIHsKKyAgICAgICAgICAgIC8qIHBhY2tldHMgZm9yIEZGVCAqLworICAgICAgICAgICAgUURNMl9MSVNUX0FERChxLT5zdWJfcGFja2V0X2xpc3RfQiwgcS0+c3ViX3BhY2tldHNfQiwgcGFja2V0KTsKKyAgICAgICAgfQorICAgIH0gLy8gUGFja2V0IGJ5dGVzIGxvb3AKKworICAgIGlmIChxLT5zdWJfcGFja2V0X2xpc3RfRFswXS5wYWNrZXQpIHsKKyAgICAgICAgcHJvY2Vzc19zeW50aGVzaXNfc3VicGFja2V0cyhxLCBxLT5zdWJfcGFja2V0X2xpc3RfRCk7CisgICAgICAgIHEtPmRvX3N5bnRoX2ZpbHRlciA9IDE7CisgICAgfSBlbHNlIGlmIChxLT5kb19zeW50aF9maWx0ZXIpIHsKKyAgICAgICAgcHJvY2Vzc19zdWJwYWNrZXRfMTAocSwgTlVMTCk7CisgICAgICAgIHByb2Nlc3Nfc3VicGFja2V0XzExKHEsIE5VTEwpOworICAgICAgICBwcm9jZXNzX3N1YnBhY2tldF8xMihxLCBOVUxMKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHFkbTJfZmZ0X2luaXRfY29lZmZpY2llbnQoUURNMkNvbnRleHQgKnEsIGludCBzdWJfcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgZHVyYXRpb24sIGludCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwLCBpbnQgcGhhc2UpCit7CisgICAgaWYgKHEtPmZmdF9jb2Vmc19taW5faW5kZXhbZHVyYXRpb25dIDwgMCkKKyAgICAgICAgcS0+ZmZ0X2NvZWZzX21pbl9pbmRleFtkdXJhdGlvbl0gPSBxLT5mZnRfY29lZnNfaW5kZXg7CisKKyAgICBxLT5mZnRfY29lZnNbcS0+ZmZ0X2NvZWZzX2luZGV4XS5zdWJfcGFja2V0ID0KKyAgICAgICAgKChzdWJfcGFja2V0ID49IDE2KSA/IChzdWJfcGFja2V0IC0gMTYpIDogc3ViX3BhY2tldCk7CisgICAgcS0+ZmZ0X2NvZWZzW3EtPmZmdF9jb2Vmc19pbmRleF0uY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgcS0+ZmZ0X2NvZWZzW3EtPmZmdF9jb2Vmc19pbmRleF0ub2Zmc2V0ICA9IG9mZnNldDsKKyAgICBxLT5mZnRfY29lZnNbcS0+ZmZ0X2NvZWZzX2luZGV4XS5leHAgICAgID0gZXhwOworICAgIHEtPmZmdF9jb2Vmc1txLT5mZnRfY29lZnNfaW5kZXhdLnBoYXNlICAgPSBwaGFzZTsKKyAgICBxLT5mZnRfY29lZnNfaW5kZXgrKzsKK30KKworc3RhdGljIHZvaWQgcWRtMl9mZnRfZGVjb2RlX3RvbmVzKFFETTJDb250ZXh0ICpxLCBpbnQgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBiKQoreworICAgIGludCBjaGFubmVsLCBzdGVyZW8sIHBoYXNlLCBleHA7CisgICAgaW50IGxvY2FsX2ludF80LCBsb2NhbF9pbnRfOCwgc3RlcmVvX3BoYXNlLCBsb2NhbF9pbnRfMTA7CisgICAgaW50IGxvY2FsX2ludF8xNCwgc3RlcmVvX2V4cCwgbG9jYWxfaW50XzIwLCBsb2NhbF9pbnRfMjg7CisgICAgaW50IG4sIG9mZnNldDsKKworICAgIGxvY2FsX2ludF80ICA9IDA7CisgICAgbG9jYWxfaW50XzI4ID0gMDsKKyAgICBsb2NhbF9pbnRfMjAgPSAyOworICAgIGxvY2FsX2ludF84ICA9ICg0IC0gZHVyYXRpb24pOworICAgIGxvY2FsX2ludF8xMCA9IDEgPDwgKHEtPmdyb3VwX29yZGVyIC0gZHVyYXRpb24gLSAxKTsKKyAgICBvZmZzZXQgICAgICAgPSAxOworCisgICAgd2hpbGUgKGdldF9iaXRzX2xlZnQoZ2IpPjApIHsKKyAgICAgICAgaWYgKHEtPnN1cGVyYmxvY2t0eXBlXzJfMykgeworICAgICAgICAgICAgd2hpbGUgKChuID0gcWRtMl9nZXRfdmxjKGdiLCAmdmxjX3RhYl9mZnRfdG9uZV9vZmZzZXRbbG9jYWxfaW50XzhdLCAxLCAyKSkgPCAyKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpPDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYobG9jYWxfaW50XzQgPCBxLT5ncm91cF9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIm92ZXJyZWFkIGluIHFkbTJfZmZ0X2RlY29kZV90b25lcygpXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAxOworICAgICAgICAgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfaW50XzQgICs9IGxvY2FsX2ludF8xMDsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfaW50XzI4ICs9ICgxIDw8IGxvY2FsX2ludF84KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9pbnRfNCAgKz0gOCAqIGxvY2FsX2ludF8xMDsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfaW50XzI4ICs9ICg4IDw8IGxvY2FsX2ludF84KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gKG4gLSAyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZnNldCArPSBxZG0yX2dldF92bGMoZ2IsICZ2bGNfdGFiX2ZmdF90b25lX29mZnNldFtsb2NhbF9pbnRfOF0sIDEsIDIpOworICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA+PSAobG9jYWxfaW50XzEwIC0gMSkpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgICAgICAgKz0gKDEgLSAobG9jYWxfaW50XzEwIC0gMSkpOworICAgICAgICAgICAgICAgIGxvY2FsX2ludF80ICArPSBsb2NhbF9pbnRfMTA7CisgICAgICAgICAgICAgICAgbG9jYWxfaW50XzI4ICs9ICgxIDw8IGxvY2FsX2ludF84KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NhbF9pbnRfNCA+PSBxLT5ncm91cF9zaXplKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGxvY2FsX2ludF8xNCA9IChvZmZzZXQgPj4gbG9jYWxfaW50XzgpOworICAgICAgICBpZiAobG9jYWxfaW50XzE0ID49IEZGX0FSUkFZX0VMRU1TKGZmdF9sZXZlbF9pbmRleF90YWJsZSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHEtPm5iX2NoYW5uZWxzID4gMSkgeworICAgICAgICAgICAgY2hhbm5lbCA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBzdGVyZW8gID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYW5uZWwgPSAwOworICAgICAgICAgICAgc3RlcmVvICA9IDA7CisgICAgICAgIH0KKworICAgICAgICBleHAgID0gcWRtMl9nZXRfdmxjKGdiLCAoYiA/ICZmZnRfbGV2ZWxfZXhwX3ZsYyA6ICZmZnRfbGV2ZWxfZXhwX2FsdF92bGMpLCAwLCAyKTsKKyAgICAgICAgZXhwICs9IHEtPmZmdF9sZXZlbF9leHBbZmZ0X2xldmVsX2luZGV4X3RhYmxlW2xvY2FsX2ludF8xNF1dOworICAgICAgICBleHAgID0gKGV4cCA8IDApID8gMCA6IGV4cDsKKworICAgICAgICBwaGFzZSAgICAgICAgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgICAgIHN0ZXJlb19leHAgICA9IDA7CisgICAgICAgIHN0ZXJlb19waGFzZSA9IDA7CisKKyAgICAgICAgaWYgKHN0ZXJlbykgeworICAgICAgICAgICAgc3RlcmVvX2V4cCAgID0gKGV4cCAtIHFkbTJfZ2V0X3ZsYyhnYiwgJmZmdF9zdGVyZW9fZXhwX3ZsYywgMCwgMSkpOworICAgICAgICAgICAgc3RlcmVvX3BoYXNlID0gKHBoYXNlIC0gcWRtMl9nZXRfdmxjKGdiLCAmZmZ0X3N0ZXJlb19waGFzZV92bGMsIDAsIDEpKTsKKyAgICAgICAgICAgIGlmIChzdGVyZW9fcGhhc2UgPCAwKQorICAgICAgICAgICAgICAgIHN0ZXJlb19waGFzZSArPSA4OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHEtPmZyZXF1ZW5jeV9yYW5nZSA+IChsb2NhbF9pbnRfMTQgKyAxKSkgeworICAgICAgICAgICAgaW50IHN1Yl9wYWNrZXQgPSAobG9jYWxfaW50XzIwICsgbG9jYWxfaW50XzI4KTsKKworICAgICAgICAgICAgcWRtMl9mZnRfaW5pdF9jb2VmZmljaWVudChxLCBzdWJfcGFja2V0LCBvZmZzZXQsIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLCBleHAsIHBoYXNlKTsKKyAgICAgICAgICAgIGlmIChzdGVyZW8pCisgICAgICAgICAgICAgICAgcWRtMl9mZnRfaW5pdF9jb2VmZmljaWVudChxLCBzdWJfcGFja2V0LCBvZmZzZXQsIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9fZXhwLCBzdGVyZW9fcGhhc2UpOworICAgICAgICB9CisgICAgICAgIG9mZnNldCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcWRtMl9kZWNvZGVfZmZ0X3BhY2tldHMoUURNMkNvbnRleHQgKnEpCit7CisgICAgaW50IGksIGosIG1pbiwgbWF4LCB2YWx1ZSwgdHlwZSwgdW5rbm93bl9mbGFnOworICAgIEdldEJpdENvbnRleHQgZ2I7CisKKyAgICBpZiAoIXEtPnN1Yl9wYWNrZXRfbGlzdF9CWzBdLnBhY2tldCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogcmVzZXQgbWluaW11bSBpbmRleGVzIGZvciBGRlQgY29lZmZpY2llbnRzICovCisgICAgcS0+ZmZ0X2NvZWZzX2luZGV4ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICBxLT5mZnRfY29lZnNfbWluX2luZGV4W2ldID0gLTE7CisKKyAgICAvKiBwcm9jZXNzIHN1YnBhY2tldHMgb3JkZXJlZCBieSB0eXBlLCBsYXJnZXN0IHR5cGUgZmlyc3QgKi8KKyAgICBmb3IgKGkgPSAwLCBtYXggPSAyNTY7IGkgPCBxLT5zdWJfcGFja2V0c19COyBpKyspIHsKKyAgICAgICAgUURNMlN1YlBhY2tldCAqcGFja2V0ID0gTlVMTDsKKworICAgICAgICAvKiBmaW5kIHN1YnBhY2tldCB3aXRoIGxhcmdlc3QgdHlwZSBsZXNzIHRoYW4gbWF4ICovCisgICAgICAgIGZvciAoaiA9IDAsIG1pbiA9IDA7IGogPCBxLT5zdWJfcGFja2V0c19COyBqKyspIHsKKyAgICAgICAgICAgIHZhbHVlID0gcS0+c3ViX3BhY2tldF9saXN0X0Jbal0ucGFja2V0LT50eXBlOworICAgICAgICAgICAgaWYgKHZhbHVlID4gbWluICYmIHZhbHVlIDwgbWF4KSB7CisgICAgICAgICAgICAgICAgbWluICAgID0gdmFsdWU7CisgICAgICAgICAgICAgICAgcGFja2V0ID0gcS0+c3ViX3BhY2tldF9saXN0X0Jbal0ucGFja2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWF4ID0gbWluOworCisgICAgICAgIC8qIGNoZWNrIGZvciBlcnJvcnMgKD8pICovCisgICAgICAgIGlmICghcGFja2V0KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChpID09IDAgJiYKKyAgICAgICAgICAgIChwYWNrZXQtPnR5cGUgPCAxNiB8fCBwYWNrZXQtPnR5cGUgPj0gNDggfHwKKyAgICAgICAgICAgICBmZnRfc3VicGFja2V0c1twYWNrZXQtPnR5cGUgLSAxNl0pKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8qIGRlY29kZSBGRlQgdG9uZXMgKi8KKyAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIHBhY2tldC0+ZGF0YSwgcGFja2V0LT5zaXplICogOCk7CisKKyAgICAgICAgaWYgKHBhY2tldC0+dHlwZSA+PSAzMiAmJiBwYWNrZXQtPnR5cGUgPCA0OCAmJiAhZmZ0X3N1YnBhY2tldHNbcGFja2V0LT50eXBlIC0gMTZdKQorICAgICAgICAgICAgdW5rbm93bl9mbGFnID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdW5rbm93bl9mbGFnID0gMDsKKworICAgICAgICB0eXBlID0gcGFja2V0LT50eXBlOworCisgICAgICAgIGlmICgodHlwZSA+PSAxNyAmJiB0eXBlIDwgMjQpIHx8ICh0eXBlID49IDMzICYmIHR5cGUgPCA0MCkpIHsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IHEtPnN1Yl9zYW1wbGluZyArIDUgLSAodHlwZSAmIDE1KTsKKworICAgICAgICAgICAgaWYgKGR1cmF0aW9uID49IDAgJiYgZHVyYXRpb24gPCA0KQorICAgICAgICAgICAgICAgIHFkbTJfZmZ0X2RlY29kZV90b25lcyhxLCBkdXJhdGlvbiwgJmdiLCB1bmtub3duX2ZsYWcpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMzEpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICAgICAgcWRtMl9mZnRfZGVjb2RlX3RvbmVzKHEsIGosICZnYiwgdW5rbm93bl9mbGFnKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDQ2KSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorICAgICAgICAgICAgICAgIHEtPmZmdF9sZXZlbF9leHBbal0gPSBnZXRfYml0cygmZ2IsIDYpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgICAgICBxZG0yX2ZmdF9kZWNvZGVfdG9uZXMocSwgaiwgJmdiLCB1bmtub3duX2ZsYWcpOworICAgICAgICB9CisgICAgfSAvLyBMb29wIG9uIEIgcGFja2V0cworCisgICAgLyogY2FsY3VsYXRlIG1heGltdW0gaW5kZXhlcyBmb3IgRkZUIGNvZWZmaWNpZW50cyAqLworICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IDU7IGkrKykKKyAgICAgICAgaWYgKHEtPmZmdF9jb2Vmc19taW5faW5kZXhbaV0gPj0gMCkgeworICAgICAgICAgICAgaWYgKGogPj0gMCkKKyAgICAgICAgICAgICAgICBxLT5mZnRfY29lZnNfbWF4X2luZGV4W2pdID0gcS0+ZmZ0X2NvZWZzX21pbl9pbmRleFtpXTsKKyAgICAgICAgICAgIGogPSBpOworICAgICAgICB9CisgICAgaWYgKGogPj0gMCkKKyAgICAgICAgcS0+ZmZ0X2NvZWZzX21heF9pbmRleFtqXSA9IHEtPmZmdF9jb2Vmc19pbmRleDsKK30KKworc3RhdGljIHZvaWQgcWRtMl9mZnRfZ2VuZXJhdGVfdG9uZShRRE0yQ29udGV4dCAqcSwgRkZUVG9uZSAqdG9uZSkKK3sKKyAgICBmbG9hdCBsZXZlbCwgZls2XTsKKyAgICBpbnQgaTsKKyAgICBRRE0yQ29tcGxleCBjOworICAgIGNvbnN0IGRvdWJsZSBpc2NhbGUgPSAyLjAgKiBNX1BJIC8gNTEyLjA7CisKKyAgICB0b25lLT5waGFzZSArPSB0b25lLT5waGFzZV9zaGlmdDsKKworICAgIC8qIGNhbGN1bGF0ZSBjdXJyZW50IGxldmVsIChtYXhpbXVtIGFtcGxpdHVkZSkgb2YgdG9uZSAqLworICAgIGxldmVsID0gZmZ0X3RvbmVfZW52ZWxvcGVfdGFibGVbdG9uZS0+ZHVyYXRpb25dW3RvbmUtPnRpbWVfaW5kZXhdICogdG9uZS0+bGV2ZWw7CisgICAgYy5pbSAgPSBsZXZlbCAqIHNpbih0b25lLT5waGFzZSAqIGlzY2FsZSk7CisgICAgYy5yZSAgPSBsZXZlbCAqIGNvcyh0b25lLT5waGFzZSAqIGlzY2FsZSk7CisKKyAgICAvKiBnZW5lcmF0ZSBGRlQgY29lZmZpY2llbnRzIGZvciB0b25lICovCisgICAgaWYgKHRvbmUtPmR1cmF0aW9uID49IDMgfHwgdG9uZS0+Y3V0b2ZmID49IDMpIHsKKyAgICAgICAgdG9uZS0+Y29tcGxleFswXS5pbSArPSBjLmltOworICAgICAgICB0b25lLT5jb21wbGV4WzBdLnJlICs9IGMucmU7CisgICAgICAgIHRvbmUtPmNvbXBsZXhbMV0uaW0gLT0gYy5pbTsKKyAgICAgICAgdG9uZS0+Y29tcGxleFsxXS5yZSAtPSBjLnJlOworICAgIH0gZWxzZSB7CisgICAgICAgIGZbMV0gPSAtdG9uZS0+dGFibGVbNF07CisgICAgICAgIGZbMF0gPSB0b25lLT50YWJsZVszXSAtIHRvbmUtPnRhYmxlWzBdOworICAgICAgICBmWzJdID0gMS4wIC0gdG9uZS0+dGFibGVbMl0gLSB0b25lLT50YWJsZVszXTsKKyAgICAgICAgZlszXSA9IHRvbmUtPnRhYmxlWzFdICsgdG9uZS0+dGFibGVbNF0gLSAxLjA7CisgICAgICAgIGZbNF0gPSB0b25lLT50YWJsZVswXSAtIHRvbmUtPnRhYmxlWzFdOworICAgICAgICBmWzVdID0gdG9uZS0+dGFibGVbMl07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIHRvbmUtPmNvbXBsZXhbZmZ0X2N1dG9mZl9pbmRleF90YWJsZVt0b25lLT5jdXRvZmZdW2ldXS5yZSArPQorICAgICAgICAgICAgICAgIGMucmUgKiBmW2ldOworICAgICAgICAgICAgdG9uZS0+Y29tcGxleFtmZnRfY3V0b2ZmX2luZGV4X3RhYmxlW3RvbmUtPmN1dG9mZl1baV1dLmltICs9CisgICAgICAgICAgICAgICAgYy5pbSAqICgodG9uZS0+Y3V0b2ZmIDw9IGkpID8gLWZbaV0gOiBmW2ldKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICB0b25lLT5jb21wbGV4W2ldLnJlICs9IGMucmUgKiBmW2kgKyAyXTsKKyAgICAgICAgICAgIHRvbmUtPmNvbXBsZXhbaV0uaW0gKz0gYy5pbSAqIGZbaSArIDJdOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29weSB0aGUgdG9uZSBpZiBpdCBoYXMgbm90IHlldCBkaWVkIG91dCAqLworICAgIGlmICgrK3RvbmUtPnRpbWVfaW5kZXggPCAoKDEgPDwgKDUgLSB0b25lLT5kdXJhdGlvbikpIC0gMSkpIHsKKyAgICAgICAgbWVtY3B5KCZxLT5mZnRfdG9uZXNbcS0+ZmZ0X3RvbmVfZW5kXSwgdG9uZSwgc2l6ZW9mKEZGVFRvbmUpKTsKKyAgICAgICAgcS0+ZmZ0X3RvbmVfZW5kID0gKHEtPmZmdF90b25lX2VuZCArIDEpICUgMTAwMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHFkbTJfZmZ0X3RvbmVfc3ludGhlc2l6ZXIoUURNMkNvbnRleHQgKnEsIGludCBzdWJfcGFja2V0KQoreworICAgIGludCBpLCBqLCBjaDsKKyAgICBjb25zdCBkb3VibGUgaXNjYWxlID0gMC4yNSAqIE1fUEk7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBxLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBtZW1zZXQocS0+ZmZ0LmNvbXBsZXhbY2hdLCAwLCBxLT5mZnRfc2l6ZSAqIHNpemVvZihRRE0yQ29tcGxleCkpOworICAgIH0KKworCisgICAgLyogYXBwbHkgRkZUIHRvbmVzIHdpdGggZHVyYXRpb24gNCAoMSBGRlQgcGVyaW9kKSAqLworICAgIGlmIChxLT5mZnRfY29lZnNfbWluX2luZGV4WzRdID49IDApCisgICAgICAgIGZvciAoaSA9IHEtPmZmdF9jb2Vmc19taW5faW5kZXhbNF07IGkgPCBxLT5mZnRfY29lZnNfbWF4X2luZGV4WzRdOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGxldmVsOworICAgICAgICAgICAgUURNMkNvbXBsZXggYzsKKworICAgICAgICAgICAgaWYgKHEtPmZmdF9jb2Vmc1tpXS5zdWJfcGFja2V0ICE9IHN1Yl9wYWNrZXQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNoID0gKHEtPmNoYW5uZWxzID09IDEpID8gMCA6IHEtPmZmdF9jb2Vmc1tpXS5jaGFubmVsOworICAgICAgICAgICAgbGV2ZWwgPSAocS0+ZmZ0X2NvZWZzW2ldLmV4cCA8IDApID8gMC4wIDogZmZ0X3RvbmVfbGV2ZWxfdGFibGVbcS0+c3VwZXJibG9ja3R5cGVfMl8zID8gMCA6IDFdW3EtPmZmdF9jb2Vmc1tpXS5leHAgJiA2M107CisKKyAgICAgICAgICAgIGMucmUgPSBsZXZlbCAqIGNvcyhxLT5mZnRfY29lZnNbaV0ucGhhc2UgKiBpc2NhbGUpOworICAgICAgICAgICAgYy5pbSA9IGxldmVsICogc2luKHEtPmZmdF9jb2Vmc1tpXS5waGFzZSAqIGlzY2FsZSk7CisgICAgICAgICAgICBxLT5mZnQuY29tcGxleFtjaF1bcS0+ZmZ0X2NvZWZzW2ldLm9mZnNldCArIDBdLnJlICs9IGMucmU7CisgICAgICAgICAgICBxLT5mZnQuY29tcGxleFtjaF1bcS0+ZmZ0X2NvZWZzW2ldLm9mZnNldCArIDBdLmltICs9IGMuaW07CisgICAgICAgICAgICBxLT5mZnQuY29tcGxleFtjaF1bcS0+ZmZ0X2NvZWZzW2ldLm9mZnNldCArIDFdLnJlIC09IGMucmU7CisgICAgICAgICAgICBxLT5mZnQuY29tcGxleFtjaF1bcS0+ZmZ0X2NvZWZzW2ldLm9mZnNldCArIDFdLmltIC09IGMuaW07CisgICAgICAgIH0KKworICAgIC8qIGdlbmVyYXRlIGV4aXN0aW5nIEZGVCB0b25lcyAqLworICAgIGZvciAoaSA9IHEtPmZmdF90b25lX2VuZDsgaSAhPSBxLT5mZnRfdG9uZV9zdGFydDsgKSB7CisgICAgICAgIHFkbTJfZmZ0X2dlbmVyYXRlX3RvbmUocSwgJnEtPmZmdF90b25lc1txLT5mZnRfdG9uZV9zdGFydF0pOworICAgICAgICBxLT5mZnRfdG9uZV9zdGFydCA9IChxLT5mZnRfdG9uZV9zdGFydCArIDEpICUgMTAwMDsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgYW5kIGdlbmVyYXRlIG5ldyBGRlQgdG9uZXMgd2l0aCBkdXJhdGlvbiAwIChsb25nKSB0byAzIChzaG9ydCkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBpZiAocS0+ZmZ0X2NvZWZzX21pbl9pbmRleFtpXSA+PSAwKSB7CisgICAgICAgICAgICBmb3IgKGogPSBxLT5mZnRfY29lZnNfbWluX2luZGV4W2ldOyBqIDwgcS0+ZmZ0X2NvZWZzX21heF9pbmRleFtpXTsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgZm91cl9pOworICAgICAgICAgICAgICAgIEZGVFRvbmUgdG9uZTsKKworICAgICAgICAgICAgICAgIGlmIChxLT5mZnRfY29lZnNbal0uc3ViX3BhY2tldCAhPSBzdWJfcGFja2V0KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGZvdXJfaSA9ICg0IC0gaSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcS0+ZmZ0X2NvZWZzW2pdLm9mZnNldCA+PiBmb3VyX2k7CisgICAgICAgICAgICAgICAgY2ggPSAocS0+Y2hhbm5lbHMgPT0gMSkgPyAwIDogcS0+ZmZ0X2NvZWZzW2pdLmNoYW5uZWw7CisKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgcS0+ZnJlcXVlbmN5X3JhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAyKQorICAgICAgICAgICAgICAgICAgICAgICAgdG9uZS5jdXRvZmYgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvbmUuY3V0b2ZmID0gKG9mZnNldCA+PSA2MCkgPyAzIDogMjsKKworICAgICAgICAgICAgICAgICAgICB0b25lLmxldmVsID0gKHEtPmZmdF9jb2Vmc1tqXS5leHAgPCAwKSA/IDAuMCA6IGZmdF90b25lX2xldmVsX3RhYmxlW3EtPnN1cGVyYmxvY2t0eXBlXzJfMyA/IDAgOiAxXVtxLT5mZnRfY29lZnNbal0uZXhwICYgNjNdOworICAgICAgICAgICAgICAgICAgICB0b25lLmNvbXBsZXggPSAmcS0+ZmZ0LmNvbXBsZXhbY2hdW29mZnNldF07CisgICAgICAgICAgICAgICAgICAgIHRvbmUudGFibGUgPSBmZnRfdG9uZV9zYW1wbGVfdGFibGVbaV1bcS0+ZmZ0X2NvZWZzW2pdLm9mZnNldCAtIChvZmZzZXQgPDwgZm91cl9pKV07CisgICAgICAgICAgICAgICAgICAgIHRvbmUucGhhc2UgPSA2NCAqIHEtPmZmdF9jb2Vmc1tqXS5waGFzZSAtIChvZmZzZXQgPDwgOCkgLSAxMjg7CisgICAgICAgICAgICAgICAgICAgIHRvbmUucGhhc2Vfc2hpZnQgPSAoMiAqIHEtPmZmdF9jb2Vmc1tqXS5vZmZzZXQgKyAxKSA8PCAoNyAtIGZvdXJfaSk7CisgICAgICAgICAgICAgICAgICAgIHRvbmUuZHVyYXRpb24gPSBpOworICAgICAgICAgICAgICAgICAgICB0b25lLnRpbWVfaW5kZXggPSAwOworCisgICAgICAgICAgICAgICAgICAgIHFkbTJfZmZ0X2dlbmVyYXRlX3RvbmUocSwgJnRvbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHEtPmZmdF9jb2Vmc19taW5faW5kZXhbaV0gPSBqOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHFkbTJfY2FsY3VsYXRlX2ZmdChRRE0yQ29udGV4dCAqcSwgaW50IGNoYW5uZWwsIGludCBzdWJfcGFja2V0KQoreworICAgIGNvbnN0IGZsb2F0IGdhaW4gPSAocS0+Y2hhbm5lbHMgPT0gMSAmJiBxLT5uYl9jaGFubmVscyA9PSAyKSA/IDAuNWYgOiAxLjBmOworICAgIGZsb2F0ICpvdXQgICAgICAgPSBxLT5vdXRwdXRfYnVmZmVyICsgY2hhbm5lbDsKKyAgICBpbnQgaTsKKyAgICBxLT5mZnQuY29tcGxleFtjaGFubmVsXVswXS5yZSAqPSAyLjBmOworICAgIHEtPmZmdC5jb21wbGV4W2NoYW5uZWxdWzBdLmltICA9IDAuMGY7CisgICAgcS0+cmRmdF9jdHgucmRmdF9jYWxjKCZxLT5yZGZ0X2N0eCwgKEZGVFNhbXBsZSAqKXEtPmZmdC5jb21wbGV4W2NoYW5uZWxdKTsKKyAgICAvKiBhZGQgc2FtcGxlcyB0byBvdXRwdXQgYnVmZmVyICovCisgICAgZm9yIChpID0gMDsgaSA8IEZGQUxJR04ocS0+ZmZ0X3NpemUsIDgpOyBpKyspIHsKKyAgICAgICAgb3V0WzBdICAgICAgICAgICArPSBxLT5mZnQuY29tcGxleFtjaGFubmVsXVtpXS5yZSAqIGdhaW47CisgICAgICAgIG91dFtxLT5jaGFubmVsc10gKz0gcS0+ZmZ0LmNvbXBsZXhbY2hhbm5lbF1baV0uaW0gKiBnYWluOworICAgICAgICBvdXQgICAgICAgICAgICAgICs9IDIgKiBxLT5jaGFubmVsczsKKyAgICB9Cit9CisKKy8qKgorICogQHBhcmFtIHEgICAgICAgIGNvbnRleHQKKyAqIEBwYXJhbSBpbmRleCAgICBzdWJwYWNrZXQgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkIHFkbTJfc3ludGhlc2lzX2ZpbHRlcihRRE0yQ29udGV4dCAqcSwgaW50IGluZGV4KQoreworICAgIGludCBpLCBrLCBjaCwgc2JfdXNlZCwgc3ViX3NhbXBsaW5nLCBkaXRoZXJfc3RhdGUgPSAwOworCisgICAgLyogY29weSBzYl9zYW1wbGVzICovCisgICAgc2JfdXNlZCA9IFFETTJfU0JfVVNFRChxLT5zdWJfc2FtcGxpbmcpOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcS0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBmb3IgKGsgPSBzYl91c2VkOyBrIDwgU0JMSU1JVDsgaysrKQorICAgICAgICAgICAgICAgIHEtPnNiX3NhbXBsZXNbY2hdWyg4ICogaW5kZXgpICsgaV1ba10gPSAwOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcS0+bmJfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZmxvYXQgKnNhbXBsZXNfcHRyID0gcS0+c2FtcGxlcyArIGNoOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGZmX21wYV9zeW50aF9maWx0ZXJfZmxvYXQoJnEtPm1wYWRzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+c3ludGhfYnVmW2NoXSwgJihxLT5zeW50aF9idWZfb2Zmc2V0W2NoXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21wYV9zeW50aF93aW5kb3dfZmxvYXQsICZkaXRoZXJfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfcHRyLCBxLT5uYl9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+c2Jfc2FtcGxlc1tjaF1bKDggKiBpbmRleCkgKyBpXSk7CisgICAgICAgICAgICBzYW1wbGVzX3B0ciArPSAzMiAqIHEtPm5iX2NoYW5uZWxzOworICAgICAgICB9CisgICAgfQorCisgICAgLyogYWRkIHNhbXBsZXMgdG8gb3V0cHV0IGJ1ZmZlciAqLworICAgIHN1Yl9zYW1wbGluZyA9ICg0ID4+IHEtPnN1Yl9zYW1wbGluZyk7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBxLT5jaGFubmVsczsgY2grKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHEtPmZyYW1lX3NpemU7IGkrKykKKyAgICAgICAgICAgIHEtPm91dHB1dF9idWZmZXJbcS0+Y2hhbm5lbHMgKiBpICsgY2hdICs9ICgxIDw8IDIzKSAqIHEtPnNhbXBsZXNbcS0+bmJfY2hhbm5lbHMgKiBzdWJfc2FtcGxpbmcgKiBpICsgY2hdOworfQorCisvKioKKyAqIEluaXQgc3RhdGljIGRhdGEgKGRvZXMgbm90IGRlcGVuZCBvbiBzcGVjaWZpYyBmaWxlKQorICoKKyAqIEBwYXJhbSBxICAgIGNvbnRleHQKKyAqLworc3RhdGljIGF2X2NvbGQgdm9pZCBxZG0yX2luaXRfc3RhdGljX2RhdGEodm9pZCkgeworICAgIHN0YXRpYyBpbnQgZG9uZTsKKworICAgIGlmKGRvbmUpCisgICAgICAgIHJldHVybjsKKworICAgIHFkbTJfaW5pdF92bGMoKTsKKyAgICBmZl9tcGFfc3ludGhfaW5pdF9mbG9hdChmZl9tcGFfc3ludGhfd2luZG93X2Zsb2F0KTsKKyAgICBzb2Z0Y2xpcF90YWJsZV9pbml0KCk7CisgICAgcm5kX3RhYmxlX2luaXQoKTsKKyAgICBpbml0X25vaXNlX3NhbXBsZXMoKTsKKworICAgIGRvbmUgPSAxOworfQorCisvKioKKyAqIEluaXQgcGFyYW1ldGVycyBmcm9tIGNvZGVjIGV4dHJhZGF0YQorICovCitzdGF0aWMgYXZfY29sZCBpbnQgcWRtMl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUURNMkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKmV4dHJhZGF0YTsKKyAgICBpbnQgZXh0cmFkYXRhX3NpemU7CisgICAgaW50IHRtcF92YWwsIHRtcCwgc2l6ZTsKKworICAgIHFkbTJfaW5pdF9zdGF0aWNfZGF0YSgpOworCisgICAgLyogZXh0cmFkYXRhIHBhcnNpbmcKKworICAgIFN0cnVjdHVyZToKKyAgICB3YXZlIHsKKyAgICAgICAgZnJtYSAoUURNMikKKyAgICAgICAgUURDQQorICAgICAgICBRRENQCisgICAgfQorCisgICAgMzIgIHNpemUgKGluY2x1ZGluZyB0aGlzIGZpZWxkKQorICAgIDMyICB0YWcgKD1mcm1hKQorICAgIDMyICB0eXBlICg9UURNMiBvciBRRE1DKQorCisgICAgMzIgIHNpemUgKGluY2x1ZGluZyB0aGlzIGZpZWxkLCBpbiBieXRlcykKKyAgICAzMiAgdGFnICg9UURDQSkgLy8gbWF5YmUgbWFuZGF0b3J5IHBhcmFtZXRlcnMKKyAgICAzMiAgdW5rbm93biAoPTEpCisgICAgMzIgIGNoYW5uZWxzICg9MikKKyAgICAzMiAgc2FtcGxlcmF0ZSAoPTQ0MTAwKQorICAgIDMyICBiaXRyYXRlICg9OTYwMDApCisgICAgMzIgIGJsb2NrIHNpemUgKD00MDk2KQorICAgIDMyICBmcmFtZSBzaXplICg9MjU2KSAoZm9yIG9uZSBjaGFubmVsKQorICAgIDMyICBwYWNrZXQgc2l6ZSAoPTEzMDApCisKKyAgICAzMiAgc2l6ZSAoaW5jbHVkaW5nIHRoaXMgZmllbGQsIGluIGJ5dGVzKQorICAgIDMyICB0YWcgKD1RRENQKSAvLyBtYXliZSBzb21lIHR1bmVhYmxlIHBhcmFtZXRlcnMKKyAgICAzMiAgZmxvYXQxICg9MS4wKQorICAgIDMyICB6ZXJvID8KKyAgICAzMiAgZmxvYXQyICg9MS4wKQorICAgIDMyICBmbG9hdDMgKD0xLjApCisgICAgMzIgIHVua25vd24gKDI3KQorICAgIDMyICB1bmtub3duICg4KQorICAgIDMyICB6ZXJvID8KKyAgICAqLworCisgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhIHx8IChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCA0OCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJleHRyYWRhdGEgbWlzc2luZyBvciB0cnVuY2F0ZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZXh0cmFkYXRhICAgICAgPSBhdmN0eC0+ZXh0cmFkYXRhOworICAgIGV4dHJhZGF0YV9zaXplID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplOworCisgICAgd2hpbGUgKGV4dHJhZGF0YV9zaXplID4gNykgeworICAgICAgICBpZiAoIW1lbWNtcChleHRyYWRhdGEsICJmcm1hUURNIiwgNykpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZXh0cmFkYXRhKys7CisgICAgICAgIGV4dHJhZGF0YV9zaXplLS07CisgICAgfQorCisgICAgaWYgKGV4dHJhZGF0YV9zaXplIDwgMTIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJub3QgZW5vdWdoIGV4dHJhZGF0YSAoJWkpXG4iLAorICAgICAgICAgICAgICAgZXh0cmFkYXRhX3NpemUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKG1lbWNtcChleHRyYWRhdGEsICJmcm1hUURNIiwgNykpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGhlYWRlcnMsIFFETT8gbm90IGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChleHRyYWRhdGFbN10gPT0gJ0MnKSB7CisvLyAgICAgICAgcy0+aXNfcWRtYyA9IDE7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAic3RyZWFtIGlzIFFETUMgdmVyc2lvbiAxLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGV4dHJhZGF0YSArPSA4OworICAgIGV4dHJhZGF0YV9zaXplIC09IDg7CisKKyAgICBzaXplID0gQVZfUkIzMihleHRyYWRhdGEpOworCisgICAgaWYoc2l6ZSA+IGV4dHJhZGF0YV9zaXplKXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJleHRyYWRhdGEgc2l6ZSB0b28gc21hbGwsICVpIDwgJWlcbiIsCisgICAgICAgICAgICAgICBleHRyYWRhdGFfc2l6ZSwgc2l6ZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBleHRyYWRhdGEgKz0gNDsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInNpemU6ICVkXG4iLCBzaXplKTsKKyAgICBpZiAoQVZfUkIzMihleHRyYWRhdGEpICE9IE1LQkVUQUcoJ1EnLCdEJywnQycsJ0EnKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgZXh0cmFkYXRhLCBleHBlY3RpbmcgUURDQVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBleHRyYWRhdGEgKz0gODsKKworICAgIGF2Y3R4LT5jaGFubmVscyA9IHMtPm5iX2NoYW5uZWxzID0gcy0+Y2hhbm5lbHMgPSBBVl9SQjMyKGV4dHJhZGF0YSk7CisgICAgZXh0cmFkYXRhICs9IDQ7CisgICAgaWYgKHMtPmNoYW5uZWxzIDw9IDAgfHwgcy0+Y2hhbm5lbHMgPiBNUEFfTUFYX0NIQU5ORUxTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gYXZjdHgtPmNoYW5uZWxzID09IDIgPyBBVl9DSF9MQVlPVVRfU1RFUkVPIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9NT05POworCisgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gQVZfUkIzMihleHRyYWRhdGEpOworICAgIGV4dHJhZGF0YSArPSA0OworCisgICAgYXZjdHgtPmJpdF9yYXRlID0gQVZfUkIzMihleHRyYWRhdGEpOworICAgIGV4dHJhZGF0YSArPSA0OworCisgICAgcy0+Z3JvdXBfc2l6ZSA9IEFWX1JCMzIoZXh0cmFkYXRhKTsKKyAgICBleHRyYWRhdGEgKz0gNDsKKworICAgIHMtPmZmdF9zaXplID0gQVZfUkIzMihleHRyYWRhdGEpOworICAgIGV4dHJhZGF0YSArPSA0OworCisgICAgcy0+Y2hlY2tzdW1fc2l6ZSA9IEFWX1JCMzIoZXh0cmFkYXRhKTsKKyAgICBpZiAocy0+Y2hlY2tzdW1fc2l6ZSA+PSAxVSA8PCAyOCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImRhdGEgYmxvY2sgc2l6ZSB0b28gbGFyZ2UgKCV1KVxuIiwgcy0+Y2hlY2tzdW1fc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPmZmdF9vcmRlciA9IGF2X2xvZzIocy0+ZmZ0X3NpemUpICsgMTsKKworICAgIC8vIHNvbWV0aGluZyBsaWtlIG1heCBkZWNvZGFibGUgdG9uZXMKKyAgICBzLT5ncm91cF9vcmRlciA9IGF2X2xvZzIocy0+Z3JvdXBfc2l6ZSkgKyAxOworICAgIHMtPmZyYW1lX3NpemUgPSBzLT5ncm91cF9zaXplIC8gMTY7IC8vIDE2IGl0ZXJhdGlvbnMgcGVyIHN1cGVyIGJsb2NrCisKKyAgICBpZiAocy0+ZnJhbWVfc2l6ZSA+IFFETTJfTUFYX0ZSQU1FX1NJWkUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcy0+c3ViX3NhbXBsaW5nID0gcy0+ZmZ0X29yZGVyIC0gNzsKKyAgICBzLT5mcmVxdWVuY3lfcmFuZ2UgPSAyNTUgLyAoMSA8PCAoMiAtIHMtPnN1Yl9zYW1wbGluZykpOworCisgICAgc3dpdGNoICgocy0+c3ViX3NhbXBsaW5nICogMiArIHMtPmNoYW5uZWxzIC0gMSkpIHsKKyAgICAgICAgY2FzZSAwOiB0bXAgPSA0MDsgYnJlYWs7CisgICAgICAgIGNhc2UgMTogdG1wID0gNDg7IGJyZWFrOworICAgICAgICBjYXNlIDI6IHRtcCA9IDU2OyBicmVhazsKKyAgICAgICAgY2FzZSAzOiB0bXAgPSA3MjsgYnJlYWs7CisgICAgICAgIGNhc2UgNDogdG1wID0gODA7IGJyZWFrOworICAgICAgICBjYXNlIDU6IHRtcCA9IDEwMDticmVhazsKKyAgICAgICAgZGVmYXVsdDogdG1wPXMtPnN1Yl9zYW1wbGluZzsgYnJlYWs7CisgICAgfQorICAgIHRtcF92YWwgPSAwOworICAgIGlmICgodG1wICogMTAwMCkgPCBhdmN0eC0+Yml0X3JhdGUpICB0bXBfdmFsID0gMTsKKyAgICBpZiAoKHRtcCAqIDE0NDApIDwgYXZjdHgtPmJpdF9yYXRlKSAgdG1wX3ZhbCA9IDI7CisgICAgaWYgKCh0bXAgKiAxNzYwKSA8IGF2Y3R4LT5iaXRfcmF0ZSkgIHRtcF92YWwgPSAzOworICAgIGlmICgodG1wICogMjI0MCkgPCBhdmN0eC0+Yml0X3JhdGUpICB0bXBfdmFsID0gNDsKKyAgICBzLT5jbV90YWJsZV9zZWxlY3QgPSB0bXBfdmFsOworCisgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA8PSA4MDAwKQorICAgICAgICBzLT5jb2VmZl9wZXJfc2Jfc2VsZWN0ID0gMDsKKyAgICBlbHNlIGlmIChhdmN0eC0+Yml0X3JhdGUgPCAxNjAwMCkKKyAgICAgICAgcy0+Y29lZmZfcGVyX3NiX3NlbGVjdCA9IDE7CisgICAgZWxzZQorICAgICAgICBzLT5jb2VmZl9wZXJfc2Jfc2VsZWN0ID0gMjsKKworICAgIC8vIEZhaWwgb24gdW5rbm93biBmZnQgb3JkZXIKKyAgICBpZiAoKHMtPmZmdF9vcmRlciA8IDcpIHx8IChzLT5mZnRfb3JkZXIgPiA5KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gRkZUIG9yZGVyICglZCksIGNvbnRhY3QgdGhlIGRldmVsb3BlcnMhXG4iLCBzLT5mZnRfb3JkZXIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzLT5mZnRfc2l6ZSAhPSAoMSA8PCAocy0+ZmZ0X29yZGVyIC0gMSkpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRkZUIHNpemUgJWQgbm90IHBvd2VyIG9mIDIuXG4iLCBzLT5mZnRfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZmX3JkZnRfaW5pdCgmcy0+cmRmdF9jdHgsIHMtPmZmdF9vcmRlciwgSURGVF9DMlIpOworICAgIGZmX21wYWRzcF9pbml0KCZzLT5tcGFkc3ApOworCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcWRtMl9kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFFETTJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGZmX3JkZnRfZW5kKCZzLT5yZGZ0X2N0eCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxZG0yX2RlY29kZShRRE0yQ29udGV4dCAqcSwgY29uc3QgdWludDhfdCAqaW4sIGludDE2X3QgKm91dCkKK3sKKyAgICBpbnQgY2gsIGk7CisgICAgY29uc3QgaW50IGZyYW1lX3NpemUgPSAocS0+ZnJhbWVfc2l6ZSAqIHEtPmNoYW5uZWxzKTsKKworICAgIGlmKCh1bnNpZ25lZClmcmFtZV9zaXplID4gRkZfQVJSQVlfRUxFTVMocS0+b3V0cHV0X2J1ZmZlcikvMikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogc2VsZWN0IGlucHV0IGJ1ZmZlciAqLworICAgIHEtPmNvbXByZXNzZWRfZGF0YSA9IGluOworICAgIHEtPmNvbXByZXNzZWRfc2l6ZSA9IHEtPmNoZWNrc3VtX3NpemU7CisKKyAgICAvKiBjb3B5IG9sZCBibG9jaywgY2xlYXIgbmV3IGJsb2NrIG9mIG91dHB1dCBzYW1wbGVzICovCisgICAgbWVtbW92ZShxLT5vdXRwdXRfYnVmZmVyLCAmcS0+b3V0cHV0X2J1ZmZlcltmcmFtZV9zaXplXSwgZnJhbWVfc2l6ZSAqIHNpemVvZihmbG9hdCkpOworICAgIG1lbXNldCgmcS0+b3V0cHV0X2J1ZmZlcltmcmFtZV9zaXplXSwgMCwgZnJhbWVfc2l6ZSAqIHNpemVvZihmbG9hdCkpOworCisgICAgLyogZGVjb2RlIGJsb2NrIG9mIFFETTIgY29tcHJlc3NlZCBkYXRhICovCisgICAgaWYgKHEtPnN1Yl9wYWNrZXQgPT0gMCkgeworICAgICAgICBxLT5oYXNfZXJyb3JzID0gMDsgLy8gemVybyBpdCBmb3IgYSBuZXcgc3VwZXIgYmxvY2sKKyAgICAgICAgYXZfbG9nKE5VTEwsQVZfTE9HX0RFQlVHLCJTdXBlcmJsb2NrIGZvbGxvd3NcbiIpOworICAgICAgICBxZG0yX2RlY29kZV9zdXBlcl9ibG9jayhxKTsKKyAgICB9CisKKyAgICAvKiBwYXJzZSBzdWJwYWNrZXRzICovCisgICAgaWYgKCFxLT5oYXNfZXJyb3JzKSB7CisgICAgICAgIGlmIChxLT5zdWJfcGFja2V0ID09IDIpCisgICAgICAgICAgICBxZG0yX2RlY29kZV9mZnRfcGFja2V0cyhxKTsKKworICAgICAgICBxZG0yX2ZmdF90b25lX3N5bnRoZXNpemVyKHEsIHEtPnN1Yl9wYWNrZXQpOworICAgIH0KKworICAgIC8qIHNvdW5kIHN5bnRoZXNpcyBzdGFnZSAxIChGRlQpICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcS0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgcWRtMl9jYWxjdWxhdGVfZmZ0KHEsIGNoLCBxLT5zdWJfcGFja2V0KTsKKworICAgICAgICBpZiAoIXEtPmhhc19lcnJvcnMgJiYgcS0+c3ViX3BhY2tldF9saXN0X0NbMF0ucGFja2V0KSB7CisgICAgICAgICAgICBTQU1QTEVTX05FRURFRF8yKCJoYXMgZXJyb3JzLCBhbmQgQyBsaXN0IGlzIG5vdCBlbXB0eSIpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzb3VuZCBzeW50aGVzaXMgc3RhZ2UgMiAoTVBFRyBhdWRpbyBsaWtlIHN5bnRoZXNpcyBmaWx0ZXIpICovCisgICAgaWYgKCFxLT5oYXNfZXJyb3JzICYmIHEtPmRvX3N5bnRoX2ZpbHRlcikKKyAgICAgICAgcWRtMl9zeW50aGVzaXNfZmlsdGVyKHEsIHEtPnN1Yl9wYWNrZXQpOworCisgICAgcS0+c3ViX3BhY2tldCA9IChxLT5zdWJfcGFja2V0ICsgMSkgJSAxNjsKKworICAgIC8qIGNsaXAgYW5kIGNvbnZlcnQgb3V0cHV0IGZsb2F0W10gdG8gMTZiaXQgc2lnbmVkIHNhbXBsZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVfc2l6ZTsgaSsrKSB7CisgICAgICAgIGludCB2YWx1ZSA9IChpbnQpcS0+b3V0cHV0X2J1ZmZlcltpXTsKKworICAgICAgICBpZiAodmFsdWUgPiBTT0ZUQ0xJUF9USFJFU0hPTEQpCisgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA+ICBIQVJEQ0xJUF9USFJFU0hPTEQpID8gIDMyNzY3IDogIHNvZnRjbGlwX3RhYmxlWyB2YWx1ZSAtIFNPRlRDTElQX1RIUkVTSE9MRF07CisgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgLVNPRlRDTElQX1RIUkVTSE9MRCkKKyAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlIDwgLUhBUkRDTElQX1RIUkVTSE9MRCkgPyAtMzI3NjcgOiAtc29mdGNsaXBfdGFibGVbLXZhbHVlIC0gU09GVENMSVBfVEhSRVNIT0xEXTsKKworICAgICAgICBvdXRbaV0gPSB2YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxZG0yX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lICAgICA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgUURNMkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludDE2X3QgKm91dDsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYoIWJ1ZikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYoYnVmX3NpemUgPCBzLT5jaGVja3N1bV9zaXplKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gMTYgKiBzLT5mcmFtZV9zaXplOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgb3V0ID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGlmIChxZG0yX2RlY29kZShzLCBidWYsIG91dCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBvdXQgKz0gcy0+Y2hhbm5lbHMgKiBzLT5mcmFtZV9zaXplOworICAgIH0KKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBzLT5jaGVja3N1bV9zaXplOworfQorCitBVkNvZGVjIGZmX3FkbTJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJxZG0yIiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJRRGVzaWduIE11c2ljIENvZGVjIDIiKSwKKyAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1FETTIsCisgICAgLnByaXZfZGF0YV9zaXplICAgPSBzaXplb2YoUURNMkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgID0gcWRtMl9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IHFkbTJfZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICAgID0gcWRtMl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3FkbTJfdGFibGVnZW4uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3FkbTJfdGFibGVnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2E5ZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcWRtMl90YWJsZWdlbi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBHZW5lcmF0ZSBhIGhlYWRlciBmaWxlIGZvciBoYXJkY29kZWQgUURNMiB0YWJsZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2RlZmluZSBDT05GSUdfSEFSRENPREVEX1RBQkxFUyAwCisjaW5jbHVkZSAicWRtMl90YWJsZWdlbi5oIgorI2luY2x1ZGUgInRhYmxlcHJpbnQuaCIKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBzb2Z0Y2xpcF90YWJsZV9pbml0KCk7CisgICAgcm5kX3RhYmxlX2luaXQoKTsKKyAgICBpbml0X25vaXNlX3NhbXBsZXMoKTsKKworICAgIHdyaXRlX2ZpbGVoZWFkZXIoKTsKKworICAgIFdSSVRFX0FSUkFZKCJzdGF0aWMgY29uc3QiLCB1aW50MTZfdCwgc29mdGNsaXBfdGFibGUpOworICAgIFdSSVRFX0FSUkFZKCJzdGF0aWMgY29uc3QiLCBmbG9hdCwgbm9pc2VfdGFibGUpOworICAgIFdSSVRFX0FSUkFZKCJzdGF0aWMgY29uc3QiLCBmbG9hdCwgbm9pc2Vfc2FtcGxlcyk7CisKKyAgICBXUklURV8yRF9BUlJBWSgic3RhdGljIGNvbnN0IiwgdWludDhfdCwgcmFuZG9tX2RlcXVhbnRfaW5kZXgpOworICAgIFdSSVRFXzJEX0FSUkFZKCJzdGF0aWMgY29uc3QiLCB1aW50OF90LCByYW5kb21fZGVxdWFudF90eXBlMjQpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9xZG0yX3RhYmxlZ2VuLmggYi9mZm1wZWcvbGliYXZjb2RlYy9xZG0yX3RhYmxlZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlYzliZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3FkbTJfdGFibGVnZW4uaApAQCAtMCwwICsxLDk3IEBACisvKgorICogSGVhZGVyIGZpbGUgZm9yIGhhcmRjb2RlZCBRRE0yIHRhYmxlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBSZWltYXIgRMO2ZmZpbmdlciA8UmVpbWFyLkRvZWZmaW5nZXJAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUURNMl9UQUJMRUdFTl9ICisjZGVmaW5lIEFWQ09ERUNfUURNMl9UQUJMRUdFTl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKworI2RlZmluZSBTT0ZUQ0xJUF9USFJFU0hPTEQgMjc2MDAKKyNkZWZpbmUgSEFSRENMSVBfVEhSRVNIT0xEIDM1NzE2CisKKyNpZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUworI2RlZmluZSBzb2Z0Y2xpcF90YWJsZV9pbml0KCkKKyNkZWZpbmUgcm5kX3RhYmxlX2luaXQoKQorI2RlZmluZSBpbml0X25vaXNlX3NhbXBsZXMoKQorI2luY2x1ZGUgImxpYmF2Y29kZWMvcWRtMl90YWJsZXMuaCIKKyNlbHNlCitzdGF0aWMgdWludDE2X3Qgc29mdGNsaXBfdGFibGVbSEFSRENMSVBfVEhSRVNIT0xEIC0gU09GVENMSVBfVEhSRVNIT0xEICsgMV07CitzdGF0aWMgZmxvYXQgbm9pc2VfdGFibGVbNDA5NiArIDIwXTsKK3N0YXRpYyB1aW50OF90IHJhbmRvbV9kZXF1YW50X2luZGV4WzI1Nl1bNV07CitzdGF0aWMgdWludDhfdCByYW5kb21fZGVxdWFudF90eXBlMjRbMTI4XVszXTsKK3N0YXRpYyBmbG9hdCBub2lzZV9zYW1wbGVzWzEyOF07CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgc29mdGNsaXBfdGFibGVfaW5pdCh2b2lkKSB7CisgICAgaW50IGk7CisgICAgZG91YmxlIGRmbCA9IFNPRlRDTElQX1RIUkVTSE9MRCAtIDMyNzY3OworICAgIGZsb2F0IGRlbHRhID0gMS4wIC8gLWRmbDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgSEFSRENMSVBfVEhSRVNIT0xEIC0gU09GVENMSVBfVEhSRVNIT0xEICsgMTsgaSsrKQorICAgICAgICBzb2Z0Y2xpcF90YWJsZVtpXSA9IFNPRlRDTElQX1RIUkVTSE9MRCAtICgoaW50KShzaW4oKGZsb2F0KWkgKiBkZWx0YSkgKiBkZmwpICYgMHgwMDAwRkZGRik7Cit9CisKKworLy8gcmFuZG9tIGdlbmVyYXRlZCB0YWJsZQorc3RhdGljIGF2X2NvbGQgdm9pZCBybmRfdGFibGVfaW5pdCh2b2lkKSB7CisgICAgaW50IGksajsKKyAgICB1aW50MzJfdCBsZHc7CisgICAgdWludDY0X3QgcmFuZG9tX3NlZWQgPSAwOworICAgIGZsb2F0IGRlbHRhID0gMS4wIC8gMTYzODQuMDsKKyAgICBmb3IoaSA9IDA7IGkgPCA0MDk2IDtpKyspIHsKKyAgICAgICAgcmFuZG9tX3NlZWQgPSByYW5kb21fc2VlZCAqIDIxNDAxMyArIDI1MzEwMTE7CisgICAgICAgIG5vaXNlX3RhYmxlW2ldID0gKGRlbHRhICogKGZsb2F0KSgoKGludDMyX3QpcmFuZG9tX3NlZWQgPj4gMTYpICYgMHgwMDAwN0ZGRiktIDEuMCkgKiAxLjM7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDI1NiA7aSsrKSB7CisgICAgICAgIHJhbmRvbV9zZWVkID0gODE7CisgICAgICAgIGxkdyA9IGk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA1IDtqKyspIHsKKyAgICAgICAgICAgIHJhbmRvbV9kZXF1YW50X2luZGV4W2ldW2pdID0gbGR3IC8gcmFuZG9tX3NlZWQ7CisgICAgICAgICAgICBsZHcgJT0gcmFuZG9tX3NlZWQ7CisgICAgICAgICAgICByYW5kb21fc2VlZCAvPSAzOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAxMjggO2krKykgeworICAgICAgICByYW5kb21fc2VlZCA9IDI1OworICAgICAgICBsZHcgPSBpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMyA7aisrKSB7CisgICAgICAgICAgICByYW5kb21fZGVxdWFudF90eXBlMjRbaV1bal0gPSBsZHcgLyByYW5kb21fc2VlZDsKKyAgICAgICAgICAgIGxkdyAlPSByYW5kb21fc2VlZDsKKyAgICAgICAgICAgIHJhbmRvbV9zZWVkIC89IDU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X25vaXNlX3NhbXBsZXModm9pZCkgeworICAgIGludCBpOworICAgIHVuc2lnbmVkIHJhbmRvbV9zZWVkID0gMDsKKyAgICBmbG9hdCBkZWx0YSA9IDEuMCAvIDE2Mzg0LjA7CisgICAgZm9yIChpID0gMDsgaSA8IDEyODtpKyspIHsKKyAgICAgICAgcmFuZG9tX3NlZWQgPSByYW5kb21fc2VlZCAqIDIxNDAxMyArIDI1MzEwMTE7CisgICAgICAgIG5vaXNlX3NhbXBsZXNbaV0gPSAoZGVsdGEgKiAoZmxvYXQpKChyYW5kb21fc2VlZCA+PiAxNikgJiAweDAwMDA3ZmZmKSAtIDEuMCk7CisgICAgfQorfQorI2VuZGlmIC8qIENPTkZJR19IQVJEQ09ERURfVEFCTEVTICovCisKKyNlbmRpZiAvKiBBVkNPREVDX1FETTJfVEFCTEVHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcWRtMmRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3FkbTJkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1ZDYxMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3FkbTJkYXRhLmgKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBRRE0yIGNvbXBhdGlibGUgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIEV3YWxkIFNuZWwKKyAqIENvcHlyaWdodCAoYykgMjAwNSBCZW5qYW1pbiBMYXJzc29uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQWxleCBCZXJlZ3N6YXN6aQorICogQ29weXJpZ2h0IChjKSAyMDA1IFJvYmVydG8gVG9nbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworIC8qKgorICogQGZpbGUKKyAqIFZhcmlvdXMgUURNMiB0YWJsZXMuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1FETTJEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19RRE0yREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqIFZMQyBUQUJMRVMgKiovCisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gLTEuLjIzOyBhZGp1c3QgcmV0cmlldmVkIHZhbHVlIGJ5IC0xICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgdmxjX3RhYl9sZXZlbF9odWZmY29kZXNbMjRdID0geworICAgIDB4MDM3YywgMHgwMDA0LCAweDAwM2MsIDB4MDA0YywgMHgwMDNhLCAweDAwMmMsIDB4MDAxYywgMHgwMDFhLAorICAgIDB4MDAyNCwgMHgwMDE0LCAweDAwMDEsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDMsIDB4MDAwNywgMHgwMDA1LAorICAgIDB4MDAwNiwgMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBjLCAweDAwZmMsIDB4MDA3YywgMHgwMTdjCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2bGNfdGFiX2xldmVsX2h1ZmZiaXRzWzI0XSA9IHsKKyAgICAxMCwgNiwgNywgNywgNiwgNiwgNiwgNiwgNiwgNSwgNCwgNCwgNCwgMywgMywgMywgMywgNCwgNCwgNSwgNywgOCwgOSwgMTAKK307CisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gLTEuLjM2OyBhZGp1c3QgcmV0cmlldmVkIHZhbHVlIGJ5IC0xICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgdmxjX3RhYl9kaWZmX2h1ZmZjb2Rlc1szN10gPSB7CisgICAgMHgxYzU3LCAweDAwMDQsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDMsIDB4MDAwMiwgMHgwMDBmLCAweDAwMGUsCisgICAgMHgwMDA3LCAweDAwMTYsIDB4MDAzNywgMHgwMDI3LCAweDAwMjYsIDB4MDA2NiwgMHgwMDA2LCAweDAwOTcsCisgICAgMHgwMDQ2LCAweDAxYzYsIDB4MDAxNywgMHgwNzg2LCAweDAwODYsIDB4MDI1NywgMHgwMGQ3LCAweDAzNTcsCisgICAgMHgwMGM2LCAweDAzODYsIDB4MDE4NiwgMHgwMDAwLCAweDAxNTcsIDB4MGM1NywgMHgwMDU3LCAweDAwMDAsCisgICAgMHgwYjg2LCAweDAwMDAsIDB4MTQ1NywgMHgwMDAwLCAweDA0NTcKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZsY190YWJfZGlmZl9odWZmYml0c1szN10gPSB7CisgICAgMTMsIDMsIDMsIDIsIDMsIDMsIDQsIDQsIDYsIDUsIDYsIDYsIDcsIDcsIDgsIDgsCisgICAgOCwgOSwgOCwgMTEsIDksIDEwLCA4LCAxMCwgOSwgMTIsIDEwLCAwLCAxMCwgMTMsIDExLCAwLAorICAgIDEyLCAwLCAxMywgMCwgMTMKK307CisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gLTEuLjU7IGFkanVzdCByZXRyaWV2ZWQgdmFsdWUgYnkgLTEgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHZsY190YWJfcnVuX2h1ZmZjb2Rlc1s2XSA9IHsKKyAgICAweDFmLCAweDAwLCAweDAxLCAweDAzLCAweDA3LCAweDBmCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2bGNfdGFiX3J1bl9odWZmYml0c1s2XSA9IHsKKyAgICA1LCAxLCAyLCAzLCA0LCA1Cit9OworCisvKiB2YWx1ZXMgaW4gdGhpcyB0YWJsZSByYW5nZSBmcm9tIC0xLi4xOTsgYWRqdXN0IHJldHJpZXZlZCB2YWx1ZSBieSAtMSAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IHZsY190YWJfdG9uZV9sZXZlbF9pZHhfaGkxX2h1ZmZjb2Rlc1syMF0gPSB7CisgICAgMHg1NzE0LCAweDAwMGMsIDB4MDAwMiwgMHgwMDAxLCAweDAwMDAsIDB4MDAwNCwgMHgwMDM0LCAweDAwNTQsCisgICAgMHgwMDk0LCAweDAwMTQsIDB4MDExNCwgMHgwMjE0LCAweDAzMTQsIDB4MDYxNCwgMHgwZTE0LCAweDBmMTQsCisgICAgMHgyNzE0LCAweDA3MTQsIDB4MTcxNCwgMHgzNzE0Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2bGNfdGFiX3RvbmVfbGV2ZWxfaWR4X2hpMV9odWZmYml0c1syMF0gPSB7CisgICAgMTUsIDQsIDIsIDEsIDMsIDUsIDYsIDcsIDgsIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxNCwgMTQsIDE1LCAxNAorfTsKKworLyogdmFsdWVzIGluIHRoaXMgdGFibGUgcmFuZ2UgZnJvbSAtMS4uMjM7IGFkanVzdCByZXRyaWV2ZWQgdmFsdWUgYnkgLTEgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCB2bGNfdGFiX3RvbmVfbGV2ZWxfaWR4X21pZF9odWZmY29kZXNbMjRdID0geworICAgIDB4MGZlYSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwM2VhLCAweDAwZWEsIDB4MDAyYSwgMHgwMDFhLAorICAgIDB4MDAwNiwgMHgwMDAxLCAweDAwMDAsIDB4MDAwMiwgMHgwMDBhLCAweDAwNmEsIDB4MDFlYSwgMHgwN2VhCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2bGNfdGFiX3RvbmVfbGV2ZWxfaWR4X21pZF9odWZmYml0c1syNF0gPSB7CisgICAgMTIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDExLCA5LCA3LCA1LCAzLCAxLCAyLCA0LCA2LCA4LCAxMCwgMTIKK307CisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gLTEuLjIzOyBhZGp1c3QgcmV0cmlldmVkIHZhbHVlIGJ5IC0xICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgdmxjX3RhYl90b25lX2xldmVsX2lkeF9oaTJfaHVmZmNvZGVzWzI0XSA9IHsKKyAgICAweDA2NjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwNjQsIDB4MDBlNCwKKyAgICAweDAwYTQsIDB4MDA2OCwgMHgwMDA0LCAweDAwMDgsIDB4MDAxNCwgMHgwMDE4LCAweDAwMDAsIDB4MDAwMSwKKyAgICAweDAwMDIsIDB4MDAwMywgMHgwMDBjLCAweDAwMjgsIDB4MDAyNCwgMHgwMTY0LCAweDAwMDAsIDB4MDI2NAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdmxjX3RhYl90b25lX2xldmVsX2lkeF9oaTJfaHVmZmJpdHNbMjRdID0geworICAgIDExLCAwLCAwLCAwLCAwLCAwLCAxMCwgOCwgOCwgNywgNiwgNiwgNSwgNSwgNCwgMiwgMiwgMiwgNCwgNywgOCwgOSwgMCwgMTEKK307CisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gLTEuLjg7IGFkanVzdCByZXRyaWV2ZWQgdmFsdWUgYnkgLTEgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHZsY190YWJfdHlwZTMwX2h1ZmZjb2Rlc1s5XSA9IHsKKyAgICAweDNjLCAweDA2LCAweDAwLCAweDAxLCAweDAzLCAweDAyLCAweDA0LCAweDBjLCAweDFjCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2bGNfdGFiX3R5cGUzMF9odWZmYml0c1s5XSA9IHsKKyAgICA2LCAzLCAzLCAyLCAyLCAzLCA0LCA1LCA2Cit9OworCisvKiB2YWx1ZXMgaW4gdGhpcyB0YWJsZSByYW5nZSBmcm9tIC0xLi45OyBhZGp1c3QgcmV0cmlldmVkIHZhbHVlIGJ5IC0xICovCitzdGF0aWMgY29uc3QgdWludDhfdCB2bGNfdGFiX3R5cGUzNF9odWZmY29kZXNbMTBdID0geworICAgIDB4MTgsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MDUsIDB4MDcsIDB4MDMsIDB4MDIsIDB4MDYsIDB4MDgKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZsY190YWJfdHlwZTM0X2h1ZmZiaXRzWzEwXSA9IHsKKyAgICA1LCA0LCAzLCAzLCAzLCAzLCAzLCAzLCAzLCA1Cit9OworCisvKiB2YWx1ZXMgaW4gdGhpcyB0YWJsZSByYW5nZSBmcm9tIC0xLi4yMjsgYWRqdXN0IHJldHJpZXZlZCB2YWx1ZSBieSAtMSAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IHZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0XzBfaHVmZmNvZGVzWzIzXSA9IHsKKyAgICAweDAzOGUsIDB4MDAwMSwgMHgwMDAwLCAweDAwMjIsIDB4MDAwYSwgMHgwMDA2LCAweDAwMTIsIDB4MDAwMiwKKyAgICAweDAwMWUsIDB4MDAzZSwgMHgwMDU2LCAweDAwMTYsIDB4MDAwZSwgMHgwMDMyLCAweDAwNzIsIDB4MDA0MiwKKyAgICAweDAwOGUsIDB4MDA0ZSwgMHgwMGYyLCAweDAwMmUsIDB4MDAzNiwgMHgwMGMyLCAweDAxOGUKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0XzBfaHVmZmJpdHNbMjNdID0geworICAgIDEwLCAxLCAyLCA2LCA0LCA1LCA2LCA3LCA2LCA2LCA3LCA3LCA4LCA3LCA4LCA4LCA5LCA3LCA4LCA2LCA2LCA4LCAxMAorfTsKKworLyogdmFsdWVzIGluIHRoaXMgdGFibGUgcmFuZ2UgZnJvbSAtMS4uMjc7IGFkanVzdCByZXRyaWV2ZWQgdmFsdWUgYnkgLTEgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCB2bGNfdGFiX2ZmdF90b25lX29mZnNldF8xX2h1ZmZjb2Rlc1syOF0gPSB7CisgICAgMHgwN2E0LCAweDAwMDEsIDB4MDAyMCwgMHgwMDEyLCAweDAwMWMsIDB4MDAwOCwgMHgwMDA2LCAweDAwMTAsCisgICAgMHgwMDAwLCAweDAwMTQsIDB4MDAwNCwgMHgwMDMyLCAweDAwNzAsIDB4MDAwYywgMHgwMDAyLCAweDAwM2EsCisgICAgMHgwMDFhLCAweDAwMmMsIDB4MDAyYSwgMHgwMDIyLCAweDAwMjQsIDB4MDAwYSwgMHgwMDY0LCAweDAwMzAsCisgICAgMHgwMDYyLCAweDAwYTQsIDB4MDFhNCwgMHgwM2E0Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2bGNfdGFiX2ZmdF90b25lX29mZnNldF8xX2h1ZmZiaXRzWzI4XSA9IHsKKyAgICAxMSwgMSwgNiwgNiwgNSwgNCwgMywgNiwgNiwgNSwgNiwgNiwgNywgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA3LCA4LCA2LCA3LCA3LCA3LCA5LCAxMCwgMTEKK307CisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gLTEuLjMxOyBhZGp1c3QgcmV0cmlldmVkIHZhbHVlIGJ5IC0xICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgdmxjX3RhYl9mZnRfdG9uZV9vZmZzZXRfMl9odWZmY29kZXNbMzJdID0geworICAgIDB4MTc2MCwgMHgwMDAxLCAweDAwMDAsIDB4MDA4MiwgMHgwMDBjLCAweDAwMDYsIDB4MDAwMywgMHgwMDA3LAorICAgIDB4MDAwOCwgMHgwMDA0LCAweDAwMTAsIDB4MDAxMiwgMHgwMDIyLCAweDAwMWEsIDB4MDAwMCwgMHgwMDIwLAorICAgIDB4MDAwYSwgMHgwMDQwLCAweDAwNGEsIDB4MDA2YSwgMHgwMDJhLCAweDAwNDIsIDB4MDAwMiwgMHgwMDYwLAorICAgIDB4MDBhYSwgMHgwMGUwLCAweDAwYzIsIDB4MDFjMiwgMHgwMTYwLCAweDAzNjAsIDB4MDc2MCwgMHgwZjYwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2bGNfdGFiX2ZmdF90b25lX29mZnNldF8yX2h1ZmZiaXRzWzMyXSA9IHsKKyAgICAxMywgMiwgMCwgOCwgNCwgMywgMywgMywgNCwgNCwgNSwgNSwgNiwgNSwgNywgNywKKyAgICA3LCA3LCA3LCA3LCA4LCA4LCA4LCA5LCA4LCA4LCA5LCA5LCAxMCwgMTEsIDEzLCAxMgorfTsKKworLyogdmFsdWVzIGluIHRoaXMgdGFibGUgcmFuZ2UgZnJvbSAtMS4uMzQ7IGFkanVzdCByZXRyaWV2ZWQgdmFsdWUgYnkgLTEgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCB2bGNfdGFiX2ZmdF90b25lX29mZnNldF8zX2h1ZmZjb2Rlc1szNV0gPSB7CisgICAgMHgzM2VhLCAweDAwMDUsIDB4MDAwMCwgMHgwMDBjLCAweDAwMDAsIDB4MDAwNiwgMHgwMDAzLCAweDAwMDgsCisgICAgMHgwMDAyLCAweDAwMDEsIDB4MDAwNCwgMHgwMDA3LCAweDAwMWEsIDB4MDAwZiwgMHgwMDFjLCAweDAwMmMsCisgICAgMHgwMDBhLCAweDAwMWQsIDB4MDAyZCwgMHgwMDJhLCAweDAwMGQsIDB4MDA0YywgMHgwMDhjLCAweDAwNmEsCisgICAgMHgwMGNkLCAweDAwNGQsIDB4MDBlYSwgMHgwMjBjLCAweDAzMGMsIDB4MDEwYywgMHgwMWVhLCAweDA3ZWEsCisgICAgMHgwYmVhLCAweDAzZWEsIDB4MTNlYQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdmxjX3RhYl9mZnRfdG9uZV9vZmZzZXRfM19odWZmYml0c1szNV0gPSB7CisgICAgMTQsIDQsIDAsIDEwLCA0LCAzLCAzLCA0LCA0LCAzLCA0LCA0LCA1LCA0LCA1LCA2LAorICAgIDYsIDUsIDYsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwKKyAgICAxMiwgMTMsIDE0Cit9OworCisvKiB2YWx1ZXMgaW4gdGhpcyB0YWJsZSByYW5nZSBmcm9tIC0xLi4zNzsgYWRqdXN0IHJldHJpZXZlZCB2YWx1ZSBieSAtMSAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IHZsY190YWJfZmZ0X3RvbmVfb2Zmc2V0XzRfaHVmZmNvZGVzWzM4XSA9IHsKKyAgICAweDUyODIsIDB4MDAxNiwgMHgwMDAwLCAweDAxMzYsIDB4MDAwNCwgMHgwMDAwLCAweDAwMDcsIDB4MDAwYSwKKyAgICAweDAwMGUsIDB4MDAwMywgMHgwMDAxLCAweDAwMGQsIDB4MDAwNiwgMHgwMDA5LCAweDAwMTIsIDB4MDAwNSwKKyAgICAweDAwMjUsIDB4MDAyMiwgMHgwMDE1LCAweDAwMDIsIDB4MDA3NiwgMHgwMDM1LCAweDAwNDIsIDB4MDBjMiwKKyAgICAweDAxODIsIDB4MDBiNiwgMHgwMDM2LCAweDAzYzIsIDB4MDQ4MiwgMHgwMWMyLCAweDA2ODIsIDB4MDg4MiwKKyAgICAweDBhODIsIDB4MDA4MiwgMHgwMjgyLCAweDEyODIsIDB4MzI4MiwgMHgyMjgyCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2bGNfdGFiX2ZmdF90b25lX29mZnNldF80X2h1ZmZiaXRzWzM4XSA9IHsKKyAgICAxNSwgNiwgMCwgOSwgMywgMywgMywgNCwgNCwgMywgNCwgNCwgNSwgNCwgNSwgNiwKKyAgICA2LCA2LCA2LCA4LCA3LCA2LCA4LCA5LCA5LCA4LCA5LCAxMCwgMTEsIDEwLCAxMSwgMTIsCisgICAgMTIsIDEyLCAxNCwgMTUsIDE0LCAxNAorfTsKKworLyoqIEZGVCBUQUJMRVMgKiovCisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gLTEuLjI3OyBhZGp1c3QgcmV0cmlldmVkIHZhbHVlIGJ5IC0xICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgZmZ0X2xldmVsX2V4cF9hbHRfaHVmZmNvZGVzWzI4XSA9IHsKKyAgICAweDFlYzYsIDB4MDAwNiwgMHgwMGMyLCAweDAxNDIsIDB4MDI0MiwgMHgwMjQ2LCAweDAwYzYsIDB4MDA0NiwKKyAgICAweDAwNDIsIDB4MDE0NiwgMHgwMGEyLCAweDAwNjIsIDB4MDAyNiwgMHgwMDE2LCAweDAwMGUsIDB4MDAwNSwKKyAgICAweDAwMDQsIDB4MDAwMywgMHgwMDAwLCAweDAwMDEsIDB4MDAwYSwgMHgwMDEyLCAweDAwMDIsIDB4MDAyMiwKKyAgICAweDAxYzYsIDB4MDJjNiwgMHgwNmM2LCAweDBlYzYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGZmdF9sZXZlbF9leHBfYWx0X2h1ZmZiaXRzWzI4XSA9IHsKKyAgICAxMywgNywgOCwgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLAorICAgIDMsIDIsIDMsIDMsIDQsIDUsIDcsIDgsIDksIDExLCAxMiwgMTMKK307CisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gLTEuLjE5OyBhZGp1c3QgcmV0cmlldmVkIHZhbHVlIGJ5IC0xICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgZmZ0X2xldmVsX2V4cF9odWZmY29kZXNbMjBdID0geworICAgIDB4MGYyNCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMCwgMHgwMDA2LCAweDAwMDUsIDB4MDAwNywgMHgwMDBjLAorICAgIDB4MDAwYiwgMHgwMDE0LCAweDAwMTMsIDB4MDAwNCwgMHgwMDAzLCAweDAwMjMsIDB4MDA2NCwgMHgwMGE0LAorICAgIDB4MDAyNCwgMHgwMTI0LCAweDAzMjQsIDB4MDcyNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZmZ0X2xldmVsX2V4cF9odWZmYml0c1syMF0gPSB7CisgICAgMTIsIDMsIDMsIDMsIDMsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIKK307CisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gLTEuLjY7IGFkanVzdCByZXRyaWV2ZWQgdmFsdWUgYnkgLTEgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGZmdF9zdGVyZW9fZXhwX2h1ZmZjb2Rlc1s3XSA9IHsKKyAgICAweDNlLCAweDAxLCAweDAwLCAweDAyLCAweDA2LCAweDBlLCAweDFlCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBmZnRfc3RlcmVvX2V4cF9odWZmYml0c1s3XSA9IHsKKyAgICA2LCAxLCAyLCAzLCA0LCA1LCA2Cit9OworCisvKiB2YWx1ZXMgaW4gdGhpcyB0YWJsZSByYW5nZSBmcm9tIC0xLi44OyBhZGp1c3QgcmV0cmlldmVkIHZhbHVlIGJ5IC0xICovCitzdGF0aWMgY29uc3QgdWludDhfdCBmZnRfc3RlcmVvX3BoYXNlX2h1ZmZjb2Rlc1s5XSA9IHsKKyAgICAweDM1LCAweDAyLCAweDAwLCAweDAxLCAweDBkLCAweDE1LCAweDA1LCAweDA5LCAweDAzCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBmZnRfc3RlcmVvX3BoYXNlX2h1ZmZiaXRzWzldID0geworICAgIDYsIDIsIDIsIDQsIDQsIDYsIDUsIDQsIDIKK307CisKK3N0YXRpYyBjb25zdCBpbnQgZmZ0X2N1dG9mZl9pbmRleF90YWJsZVs0XVsyXSA9IHsKKyAgICB7IDEsIDIgfSwgey0xLCAwIH0sIHstMSwtMiB9LCB7IDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZmZ0X2xldmVsX2luZGV4X3RhYmxlWzI1Nl0gPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKyAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKyAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGxhc3RfY29lZmZbM10gPSB7CisgICAgNCwgNywgMTAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZWZmX3Blcl9zYl9mb3JfYXZnWzNdWzMwXSA9IHsKKyAgICB7IDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKKyAgICB7IDAsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYgfSwKKyAgICB7IDAsIDEsIDIsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDYsIDYsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDksIDksIDksIDksIDksIDksIDksIDkgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGRlcXVhbnRfdGFibGVbM11bMTBdWzMwXSA9IHsKKyAgICB7IHsgMjU2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgICB7IDAsIDI1NiwgMjU2LCAyMDUsIDE1NCwgMTAyLCA1MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgICAgeyAwLCAwLCAwLCA1MSwgMTAyLCAxNTQsIDIwNSwgMjU2LCAyMzgsIDIxOSwgMjAxLCAxODMsIDE2NSwgMTQ2LCAxMjgsIDExMCwgOTEsIDczLCA1NSwgMzcsIDE4LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDE4LCAzNywgNTUsIDczLCA5MSwgMTEwLCAxMjgsIDE0NiwgMTY1LCAxODMsIDIwMSwgMjE5LCAyMzgsIDI1NiwgMjI4LCAxOTksIDE3MSwgMTQyLCAxMTQsIDg1LCA1NywgMjggfSwKKyAgICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSB9LAorICAgIHsgeyAyNTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICAgIHsgMCwgMjU2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgICB7IDAsIDAsIDI1NiwgMTcxLCA4NSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgICAgeyAwLCAwLCAwLCA4NSwgMTcxLCAyNTYsIDE3MSwgODUsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgODUsIDE3MSwgMjU2LCAyMTksIDE4MywgMTQ2LCAxMTAsIDczLCAzNywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzNywgNzMsIDExMCwgMTQ2LCAxODMsIDIxOSwgMjU2LCAyMjgsIDE5OSwgMTcxLCAxNDIsIDExNCwgODUsIDU3LCAyOCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyOCwgNTcsIDg1LCAxMTQsIDE0MiwgMTcxLCAxOTksIDIyOCwgMjU2LCAyMTMsIDE3MSwgMTI4LCA4NSwgNDMgfSwKKyAgICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSB9LAorICAgIHsgeyAyNTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICAgIHsgMCwgMjU2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgICB7IDAsIDAsIDI1NiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgICAgeyAwLCAwLCAwLCAyNTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICAgIHsgMCwgMCwgMCwgMCwgMjU2LCAyNTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMjU2LCAxNzEsIDg1LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDg1LCAxNzEsIDI1NiwgMTkyLCAxMjgsIDY0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDY0LCAxMjgsIDE5MiwgMjU2LCAyMDUsIDE1NCwgMTAyLCA1MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA1MSwgMTAyLCAxNTQsIDIwNSwgMjU2LCAyMTMsIDE3MSwgMTI4LCA4NSwgNDMsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNDMsIDg1LCAxMjgsIDE3MSwgMjEzLCAyNTYsIDIxMywgMTcxLCAxMjgsIDg1LCA0MyB9IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZWZmX3Blcl9zYl9mb3JfZGVxdWFudFszXVszMF0gPSB7CisgICAgeyAwLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCisgICAgeyAwLCAxLCAyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2IH0sCisgICAgeyAwLCAxLCAyLCAzLCA0LCA0LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA3LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA5LCA5LCA5LCA5LCA5LCA5IH0KK307CisKKy8qIGZpcnN0IGluZGV4IGlzIHN1YmJhbmQsIDJuZCBpbmRleCBpcyAwLCAxIG9yIDMgKDIgaXMgdW51c2VkKSAqLworc3RhdGljIGNvbnN0IGludDhfdCB0b25lX2xldmVsX2lkeF9vZmZzZXRfdGFibGVbMzBdWzRdID0geworICAgIHsgLTUwLCAtNTAsICAwLCAtNTAgfSwKKyAgICB7IC01MCwgLTUwLCAgMCwgLTUwIH0sCisgICAgeyAtNTAsICAtOSwgIDAsIC0xOSB9LAorICAgIHsgLTE2LCAgLTYsICAwLCAtMTIgfSwKKyAgICB7IC0xMSwgIC00LCAgMCwgIC04IH0sCisgICAgeyAgLTgsICAtMywgIDAsICAtNiB9LAorICAgIHsgIC03LCAgLTMsICAwLCAgLTUgfSwKKyAgICB7ICAtNiwgIC0yLCAgMCwgIC00IH0sCisgICAgeyAgLTUsICAtMiwgIDAsICAtMyB9LAorICAgIHsgIC00LCAgLTEsICAwLCAgLTMgfSwKKyAgICB7ICAtNCwgIC0xLCAgMCwgIC0yIH0sCisgICAgeyAgLTMsICAtMSwgIDAsICAtMiB9LAorICAgIHsgIC0zLCAgLTEsICAwLCAgLTIgfSwKKyAgICB7ICAtMywgIC0xLCAgMCwgIC0yIH0sCisgICAgeyAgLTIsICAtMSwgIDAsICAtMSB9LAorICAgIHsgIC0yLCAgLTEsICAwLCAgLTEgfSwKKyAgICB7ICAtMiwgIC0xLCAgMCwgIC0xIH0sCisgICAgeyAgLTIsICAgMCwgIDAsICAtMSB9LAorICAgIHsgIC0yLCAgIDAsICAwLCAgLTEgfSwKKyAgICB7ICAtMSwgICAwLCAgMCwgIC0xIH0sCisgICAgeyAgLTEsICAgMCwgIDAsICAtMSB9LAorICAgIHsgIC0xLCAgIDAsICAwLCAgLTEgfSwKKyAgICB7ICAtMSwgICAwLCAgMCwgIC0xIH0sCisgICAgeyAgLTEsICAgMCwgIDAsICAtMSB9LAorICAgIHsgIC0xLCAgIDAsICAwLCAgLTEgfSwKKyAgICB7ICAtMSwgICAwLCAgMCwgIC0xIH0sCisgICAgeyAgLTEsICAgMCwgIDAsICAgMCB9LAorICAgIHsgIC0xLCAgIDAsICAwLCAgIDAgfSwKKyAgICB7ICAtMSwgICAwLCAgMCwgICAwIH0sCisgICAgeyAgLTEsICAgMCwgIDAsICAgMCB9Cit9OworCisvKiBhbGwgbXkgc2FtcGxlcyBoYXZlIDFzdCBpbmRleCAwIG9yIDEgKi8KKy8qIHNlY29uZCBpbmRleCBpcyBzdWJiYW5kLCBvbmx5IGluZGV4ZXMgMC0yOSBzZWVtIHRvIGJlIHVzZWQgKi8KK3N0YXRpYyBjb25zdCBpbnQ4X3QgY29kaW5nX21ldGhvZF90YWJsZVs1XVszMF0gPSB7CisgICAgeyAzNCwgMzAsIDI0LCAyNCwgMTYsIDE2LCAxNiwgMTYsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMAorICAgIH0sCisgICAgeyAzNCwgMzAsIDI0LCAyNCwgMTYsIDE2LCAxNiwgMTYsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMAorICAgIH0sCisgICAgeyAzNCwgMzAsIDMwLCAzMCwgMjQsIDI0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMCwgMTAsIDEwLAorICAgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMAorICAgIH0sCisgICAgeyAzNCwgMzQsIDMwLCAzMCwgMjQsIDI0LCAyNCwgMjQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMAorICAgIH0sCisgICAgeyAzNCwgMzQsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LAorICAgICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgorICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgaW50IHZsY19zdGFnZTNfdmFsdWVzWzYwXSA9IHsKKyAgICAgICAgMCwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA2LCAgICAgOCwgICAgMTAsICAgIDEyLCAgICAxNiwgICAgMjAsICAgIDI0LAorICAgICAgIDI4LCAgICAzNiwgICAgNDQsICAgIDUyLCAgICA2MCwgICAgNzYsICAgIDkyLCAgIDEwOCwgICAxMjQsICAgMTU2LCAgIDE4OCwgICAyMjAsCisgICAgICAyNTIsICAgMzE2LCAgIDM4MCwgICA0NDQsICAgNTA4LCAgIDYzNiwgICA3NjQsICAgODkyLCAgMTAyMCwgIDEyNzYsICAxNTMyLCAgMTc4OCwKKyAgICAgMjA0NCwgIDI1NTYsICAzMDY4LCAgMzU4MCwgIDQwOTIsICA1MTE2LCAgNjE0MCwgIDcxNjQsICA4MTg4LCAxMDIzNiwgMTIyODQsIDE0MzMyLAorICAgIDE2MzgwLCAyMDQ3NiwgMjQ1NzIsIDI4NjY4LCAzMjc2NCwgNDA5NTYsIDQ5MTQ4LCA1NzM0MCwgNjU1MzIsIDgxOTE2LCA5ODMwMCwxMTQ2ODQKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBmZnRfdG9uZV9zYW1wbGVfdGFibGVbNF1bMTZdWzVdID0geworICAgIHsgeyAuMDEwMDAwMDAwMGYsLS4wMDM3MDM3MDM3ZiwtLjAwMjAwMDAwMDBmLC0uMDA2OTQ0NDQ0NGYsLS4wMDE4NDE2MjA3ZiB9LAorICAgICAgeyAuMDQxNjY2NjY2N2YsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLC0uMDIwODMzMzMzM2YsLS4wMTIzNDU2NzkxZiB9LAorICAgICAgeyAuMTI1MDAwMDAwMGYsIC4wNTU4MDM1NzA5ZiwgLjAzMzA2ODc4MzZmLC0uMDE2NDQ3MzY5MGYsLS4wMDk3NDY1ODg4ZiB9LAorICAgICAgeyAuMTU2MjUwMDAwMGYsIC4wNjI1MDAwMDAwZiwgLjAzNzAzNzAzNzBmLC0uMDA2MjUwMDAwMGYsLS4wMDM3MDM3MDM3ZiB9LAorICAgICAgeyAuMTk5NjAwNzg2MGYsIC4wNzgxMjUwMDAwZiwgLjA0NjI5NjI5NDhmLCAuMDAyMjcyNzI3MmYsIC4wMDEzNDY4MDEzZiB9LAorICAgICAgeyAuMjAwMDAwMDAwMGYsIC4wNjI1MDAwMDAwZiwgLjAzNzAzNzAzNzNmLCAuMDIwODMzMzMzM2YsIC4wMDc0MDc0MDczZiB9LAorICAgICAgeyAuMjEyNzY1OTYxOWYsIC4wNTU1NTU1NTU2ZiwgLjAzMjkyMTgwOTdmLCAuMDIwODMzMzMzM2YsIC4wMTIzNDU2NzkxZiB9LAorICAgICAgeyAuMjE3MzkxMzEyMWYsIC4wNDczNDg0ODQ0ZiwgLjAyODA1ODM2MTNmLCAuMDM0NzIyMjIzOWYsIC4wMjA1NzYxMzI1ZiB9LAorICAgICAgeyAuMjE3MzkxMzEyMWYsIC4wMzQ3MjIyMjM5ZiwgLjAyMDU3NjEzMjVmLCAuMDQ3MzQ4NDg0NGYsIC4wMjgwNTgzNjEzZiB9LAorICAgICAgeyAuMjEyNzY1OTYxOWYsIC4wMjA4MzMzMzMzZiwgLjAxMjM0NTY3OTFmLCAuMDU1NTU1NTU1NmYsIC4wMzI5MjE4MDk3ZiB9LAorICAgICAgeyAuMjAwMDAwMDAwMGYsIC4wMjA4MzMzMzMzZiwgLjAwNzQwNzQwNzNmLCAuMDYyNTAwMDAwMGYsIC4wMzcwMzcwMzcwZiB9LAorICAgICAgeyAuMTk5NjAwNzg2MGYsIC4wMDIyNzI3MjcyZiwgLjAwMTM0NjgwMTNmLCAuMDc4MTI1MDAwMGYsIC4wNDYyOTYyOTQ4ZiB9LAorICAgICAgeyAuMTU2MjUwMDAwMGYsLS4wMDYyNTAwMDAwZiwtLjAwMzcwMzcwMzdmLCAuMDYyNTAwMDAwMGYsIC4wMzcwMzcwMzcwZiB9LAorICAgICAgeyAuMTI1MDAwMDAwMGYsLS4wMTY0NDczNjkwZiwtLjAwOTc0NjU4ODhmLCAuMDU1ODAzNTcwOWYsIC4wMzMwNjg3ODM2ZiB9LAorICAgICAgeyAuMDQxNjY2NjY2N2YsLS4wMjA4MzMzMzMzZiwtLjAxMjM0NTY3OTFmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiB9LAorICAgICAgeyAuMDEwMDAwMDAwMGYsLS4wMDY5NDQ0NDQ0ZiwtLjAwMTg0MTYyMDdmLC0uMDAzNzAzNzAzN2YsLS4wMDIwMDAwMDAwZiB9IH0sCisKKyAgICB7IHsgLjAwNTAwMDAwMDBmLC0uMDIwMDAwMDAwMGYsIC4wMTI1MDAwMDAwZiwtLjMwMzAzMDMwMzBmLCAuMDAyMDAwMDAwMGYgfSwKKyAgICAgIHsgLjEwNDE2NjY2NDJmLCAuMDQwMDAwMDAwMGYsLS4wMjUwMDAwMDAwZiwgLjAzMzMzMzMzMzNmLC0uMDIwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjEyNTAwMDAwMDBmLCAuMDEwMDAwMDAwMGYsIC4wMTQyODU3MTQ0ZiwtLjA1MDAwMDAwMDdmLC0uMDIwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjE1NjI1MDAwMDBmLC0uMDAwNjI1MDAwMGYsLS4wMDA0OTM4MjcxNmYsLS4wMDA2MjUwMDBmLC0uMDAwNDkzODI3MTZmIH0sCisgICAgICB7IC4xNTYyNTAwMDAwZiwtLjAwMDYyNTAwMDBmLC0uMDAwNDkzODI3MTZmLC0uMDAwNjI1MDAwZiwtLjAwMDQ5MzgyNzE2ZiB9LAorICAgICAgeyAuMTI1MDAwMDAwMGYsLS4wNTAwMDAwMDAwZiwtLjAyMDAwMDAwMDBmLCAuMDEwMDAwMDAwMGYsIC4wMTQyODU3MTQ0ZiB9LAorICAgICAgeyAuMTA0MTY2NjY2N2YsIC4wMzMzMzMzMzMzZiwtLjAyMDAwMDAwMDBmLCAuMDQwMDAwMDAwMGYsLS4wMjUwMDAwMDAwZiB9LAorICAgICAgeyAuMDA1MDAwMDAwMGYsLS4zMDMwMzAzMDMwZiwgLjAwMjAwMDAwMDFmLC0uMDIwMDAwMDAwMGYsIC4wMTI1MDAwMDAwZiB9LAorICAgICAgeyAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiB9LAorICAgICAgeyAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiB9LAorICAgICAgeyAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiB9LAorICAgICAgeyAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiB9LAorICAgICAgeyAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiB9LAorICAgICAgeyAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiB9LAorICAgICAgeyAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiB9LAorICAgICAgeyAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiB9IH0sCisKKyAgICB7IHsgLjE0Mjg1NzE0OTJmLCAuMTI1MDAwMDAwMGYsLS4wMjg1NzE0Mjg3ZiwtLjAzNTcxNDI4NzNmLCAuMDIwODMzMzMzM2YgfSwKKyAgICAgIHsgLjE4MTgxODE4MThmLCAuMDU4ODIzNTI5NmYsIC4wMzMzMzMzMzMzZiwgLjAyMTI3NjU5NTFmLCAuMDEwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjE4MTgxODE4MThmLCAuMDIxMjc2NTk1MWYsIC4wMTAwMDAwMDAwZiwgLjA1ODgyMzUyOTZmLCAuMDMzMzMzMzMzM2YgfSwKKyAgICAgIHsgLjE0Mjg1NzE0OTJmLC0uMDM1NzE0Mjg3M2YsIC4wMjA4MzMzMzMzZiwgLjEyNTAwMDAwMDBmLC0uMDI4NTcxNDI4N2YgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSwKKyAgICAgIHsgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYgfSB9LAorCisgICAgeyB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0sCisgICAgICB7IC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmLCAuMDAwMDAwMDAwMGYsIC4wMDAwMDAwMDAwZiwgLjAwMDAwMDAwMDBmIH0gfQorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGZmdF90b25lX2xldmVsX3RhYmxlWzJdWzY0XSA9IHsgeworLyogcG93IH4gKGkgPiA0NikgPyAwIDogKCgoKChpICYgMSkgPyA0MzEgOiAzMDQpIDw8IChpID4+IDEpKSkgLyAxMDI0LjApOyAqLworICAgIDAuMTc2Nzc2NjlmLCAwLjQyNjc3NjUwZiwgMC42MDM1NTM0N2YsIDAuODUzNTUzNDdmLAorICAgIDEuMjA3MTA2ODNmLCAxLjY4MzU5Mzc1ZiwgMi4zNzUwMDAwMGYsIDMuMzY3MTg3NTBmLAorICAgIDQuNzUwMDAwMDBmLCA2LjczNDM3NTAwZiwgOS41MDAwMDAwMGYsIDEzLjQ2ODc1MDBmLAorICAgIDE5LjAwMDAwMDBmLCAyNi45Mzc1MDAwZiwgMzguMDAwMDAwMGYsIDUzLjg3NTAwMDBmLAorICAgIDc2LjAwMDAwMDBmLCAxMDcuNzUwMDAwZiwgMTUyLjAwMDAwMGYsIDIxNS41MDAwMDBmLAorICAgIDMwNC4wMDAwMDBmLCA0MzEuMDAwMDAwZiwgNjA4LjAwMDAwMGYsIDg2Mi4wMDAwMDBmLAorICAgIDEyMTYuMDAwMDBmLCAxNzI0LjAwMDAwZiwgMjQzMi4wMDAwMGYsIDM0NDguMDAwMDBmLAorICAgIDQ4NjQuMDAwMDBmLCA2ODk2LjAwMDAwZiwgOTcyOC4wMDAwMGYsIDEzNzkyLjAwMDBmLAorICAgIDE5NDU2LjAwMDBmLCAyNzU4NC4wMDAwZiwgMzg5MTIuMDAwMGYsIDU1MTY4LjAwMDBmLAorICAgIDc3ODI0LjAwMDBmLCAxMTAzMzYuMDAwZiwgMTU1NjQ4LjAwMGYsIDIyMDY3Mi4wMDBmLAorICAgIDMxMTI5Ni4wMDBmLCA0NDEzNDQuMDAwZiwgNjIyNTkyLjAwMGYsIDg4MjY4OC4wMDBmLAorICAgIDEyNDUxODQuMDBmLCAxNzY1Mzc2LjAwZiwgMjQ5MDM2OC4wMGYsIDAuMDAwMDAwMDBmLAorICAgIDAuMDAwMDAwMDBmLCAwLjAwMDAwMDAwZiwgMC4wMDAwMDAwMGYsIDAuMDAwMDAwMDBmLAorICAgIDAuMDAwMDAwMDBmLCAwLjAwMDAwMDAwZiwgMC4wMDAwMDAwMGYsIDAuMDAwMDAwMDBmLAorICAgIDAuMDAwMDAwMDBmLCAwLjAwMDAwMDAwZiwgMC4wMDAwMDAwMGYsIDAuMDAwMDAwMDBmLAorICAgIDAuMDAwMDAwMDBmLCAwLjAwMDAwMDAwZiwgMC4wMDAwMDAwMGYsIDAuMDAwMDAwMDBmLAorICB9LCB7CisvKiBwb3cgPSAoaSA+IDQ1KSA/IDAgOiAoKCgoaSAmIDEpID8gNDMxIDogMzA0KSA8PCAoaSA+PiAxKSkgLyA1MTIuMCk7ICovCisgICAgMC41OTM3NTAwMGYsIDAuODQxNzk2ODhmLCAxLjE4NzUwMDAwZiwgMS42ODM1OTM3NWYsCisgICAgMi4zNzUwMDAwMGYsIDMuMzY3MTg3NTBmLCA0Ljc1MDAwMDAwZiwgNi43MzQzNzUwMGYsCisgICAgOS41MDAwMDAwMGYsIDEzLjQ2ODc1MDBmLCAxOS4wMDAwMDAwZiwgMjYuOTM3NTAwMGYsCisgICAgMzguMDAwMDAwMGYsIDUzLjg3NTAwMDBmLCA3Ni4wMDAwMDAwZiwgMTA3Ljc1MDAwMGYsCisgICAgMTUyLjAwMDAwMGYsIDIxNS41MDAwMDBmLCAzMDQuMDAwMDAwZiwgNDMxLjAwMDAwMGYsCisgICAgNjA4LjAwMDAwMGYsIDg2Mi4wMDAwMDBmLCAxMjE2LjAwMDAwZiwgMTcyNC4wMDAwMGYsCisgICAgMjQzMi4wMDAwMGYsIDM0NDguMDAwMDBmLCA0ODY0LjAwMDAwZiwgNjg5Ni4wMDAwMGYsCisgICAgOTcyOC4wMDAwMGYsIDEzNzkyLjAwMDBmLCAxOTQ1Ni4wMDAwZiwgMjc1ODQuMDAwMGYsCisgICAgMzg5MTIuMDAwMGYsIDU1MTY4LjAwMDBmLCA3NzgyNC4wMDAwZiwgMTEwMzM2LjAwMGYsCisgICAgMTU1NjQ4LjAwMGYsIDIyMDY3Mi4wMDBmLCAzMTEyOTYuMDAwZiwgNDQxMzQ0LjAwMGYsCisgICAgNjIyNTkyLjAwMGYsIDg4MjY4OC4wMDBmLCAxMjQ1MTg0LjAwZiwgMTc2NTM3Ni4wMGYsCisgICAgMjQ5MDM2OC4wMGYsIDM1MzA3NTIuMDBmLCAwLjAwMDAwMDAwZiwgMC4wMDAwMDAwMGYsCisgICAgMC4wMDAwMDAwMGYsIDAuMDAwMDAwMDBmLCAwLjAwMDAwMDAwZiwgMC4wMDAwMDAwMGYsCisgICAgMC4wMDAwMDAwMGYsIDAuMDAwMDAwMDBmLCAwLjAwMDAwMDAwZiwgMC4wMDAwMDAwMGYsCisgICAgMC4wMDAwMDAwMGYsIDAuMDAwMDAwMDBmLCAwLjAwMDAwMDAwZiwgMC4wMDAwMDAwMGYsCisgICAgMC4wMDAwMDAwMGYsIDAuMDAwMDAwMDBmLCAwLjAwMDAwMDAwZiwgMC4wMDAwMDAwMGYKK30gfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGZmdF90b25lX2VudmVsb3BlX3RhYmxlWzRdWzMxXSA9IHsKKyAgICB7IC4wMDk2MDczNzVmLCAuMDM4MDYwMjQ4ZiwgLjA4NDI2NTIwMmYsIC4xNDY0NDY2NDVmLCAuMjIyMjE0OTA3ZiwgLjMwODY1ODMwMmYsCisgICAgICAuNDAyNDU0ODgzZiwgLjUwMDAwMDA2MGYsIC41OTc1NDUyMDdmLCAuNjkxMzQxNzU4ZiwgLjc3Nzc4NTE4MmYsIC44NTM1NTM0MTRmLAorICAgICAgLjkxNTczNDgyOGYsIC45NjE5Mzk4MTJmLCAuOTkwMzkyNjg1ZiwgMS4wMDAwMDAwMGYsIC45OTAzOTI2MjVmLCAuOTYxOTM5NzUyZiwKKyAgICAgIC45MTU3MzQ3NjhmLCAuODUzNTUzMjk1ZiwgLjc3Nzc4NTA2M2YsIC42OTEzNDE2MzlmLCAuNTk3NTQ1MDg3ZiwgLjUwMDAwMDAwMGYsCisgICAgICAuNDAyNDU0ODUzZiwgLjMwODY1ODI3MmYsIC4yMjIyMTQ4NzhmLCAuMTQ2NDQ2NjE1ZiwgLjA4NDI2NTE3MmYsIC4wMzgwNjAyMThmLAorICAgICAgLjAwOTYwNzM0NWYgfSwKKyAgICB7IC4wMzgwNjAyNDhmLCAuMTQ2NDQ2NjQ1ZiwgLjMwODY1ODMwMmYsIC41MDAwMDAwNjBmLCAuNjkxMzQxNzU4ZiwgLjg1MzU1MzQxNGYsCisgICAgICAuOTYxOTM5ODEyZiwgMS4wMDAwMDAwMGYsIC45NjE5Mzk3NTJmLCAuODUzNTUzMjk1ZiwgLjY5MTM0MTYzOWYsIC41MDAwMDAwMDBmLAorICAgICAgLjMwODY1ODI3MmYsIC4xNDY0NDY2MTVmLCAuMDM4MDYwMjE4ZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwKKyAgICAgIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsCisgICAgICAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLAorICAgICAgLjAwMDAwMDAwMGYgfSwKKyAgICB7IC4xNDY0NDY2NDVmLCAuNTAwMDAwMDYwZiwgLjg1MzU1MzQxNGYsIDEuMDAwMDAwMDBmLCAuODUzNTUzMjk1ZiwgLjUwMDAwMDAwMGYsCisgICAgICAuMTQ2NDQ2NjE1ZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLAorICAgICAgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwKKyAgICAgIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsCisgICAgICAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLAorICAgICAgLjAwMDAwMDAwMGYgfSwKKyAgICB7IC41MDAwMDAwNjBmLCAxLjAwMDAwMDAwZiwgLjUwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsCisgICAgICAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLAorICAgICAgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwKKyAgICAgIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsCisgICAgICAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLCAuMDAwMDAwMDAwZiwgLjAwMDAwMDAwMGYsIC4wMDAwMDAwMDBmLAorICAgICAgLjAwMDAwMDAwMGYgfQorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHNiX25vaXNlX2F0dGVudWF0aW9uWzMyXSA9IHsKKyAgICAwLjBmLCAwLjBmLCAwLjNmLCAwLjRmLCAwLjVmLCAwLjdmLCAxLjBmLCAxLjBmLAorICAgIDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYsCisgICAgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiwKKyAgICAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZmZ0X3N1YnBhY2tldHNbMzJdID0geworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMAorfTsKKworLyogZmlyc3QgaW5kZXggaXMgam9pbmVkX3N0ZXJlbywgc2Vjb25kIGluZGV4IGlzIDAgb3IgMiAoMSBpcyB1bnVzZWQpICovCitzdGF0aWMgY29uc3QgZmxvYXQgZGVxdWFudF8xYml0WzJdWzNdID0geworICAgIHstMC45MjAwMDBmLCAwLjAwMDAwMGYsIDAuOTIwMDAwZiB9LAorICAgIHstMC44OTAwMDBmLCAwLjAwMDAwMGYsIDAuODkwMDAwZiB9Cit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgdHlwZTMwX2RlcXVhbnRbOF0gPSB7CisgICAtMS4wZiwtMC42MjVmLC0wLjI5MTY2NjY1NjczMjU1OWYsMC4wZiwKKyAgIDAuMjVmLDAuNWYsMC43NWYsMS4wZiwKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCB0eXBlMzRfZGVsdGFbMTBdID0geyAvLyBGSVhNRTogY292ZXJzIDggZW50cmllcy4uCisgICAgLTEuMGYsLTAuNjA5NDc1NzMxODQ5NjdmLC0wLjMzMzMzMzM0MzI2NzQ0MWYsLTAuMTM4MDcxMTk0MjkxMTE1ZiwwLjBmLAorICAgIDAuMTM4MDcxMTk0MjkxMTE1ZiwwLjMzMzMzMzM0MzI2NzQ0MWYsMC42MDk0NzU3MzE4NDk2N2YsMS4wZiwwLjBmLAorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUURNMkRBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcWRydy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcWRydy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODJlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9xZHJ3LmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBRdWlja0RyYXcgKHFkcncpIGNvZGVjCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBcHBsZSBRdWlja0RyYXcgY29kZWMuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiAgICAgPSBhdnBrdC0+ZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYXZwa3QtPmRhdGEgKyBhdnBrdC0+c2l6ZTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgQVZGcmFtZSAqIGNvbnN0IHAgICAgICA9IGRhdGE7CisgICAgdWludDhfdCogb3V0ZGF0YTsKKyAgICBpbnQgY29sb3JzOworICAgIGludCBpLCByZXQ7CisgICAgdWludDMyX3QgKnBhbDsKKyAgICBpbnQgciwgZywgYjsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcCwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwLT5rZXlfZnJhbWUgPSAxOworCisgICAgb3V0ZGF0YSA9IHAtPmRhdGFbMF07CisKKyAgICBpZiAoYnVmX2VuZCAtIGJ1ZiA8IDB4NjggKyA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBidWYgICArPSAweDY4OyAvKiBqdW1wIHRvIHBhbGV0dGUgKi8KKyAgICBjb2xvcnMgPSBBVl9SQjMyKGJ1Zik7CisgICAgYnVmICAgKz0gNDsKKworICAgIGlmIChjb2xvcnMgPCAwIHx8IGNvbG9ycyA+IDI1NikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGNvbG9yIGNvdW50IC0gJWkoMHglWClcbiIsIGNvbG9ycywgY29sb3JzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChidWZfZW5kIC0gYnVmIDwgKGNvbG9ycyArIDEpICogOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBwYWwgPSAodWludDMyX3QqKXAtPmRhdGFbMV07CisgICAgZm9yIChpID0gMDsgaSA8PSBjb2xvcnM7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBpbnQgaWR4OworICAgICAgICBpZHggPSBBVl9SQjE2KGJ1Zik7IC8qIGNvbG9yIGluZGV4ICovCisgICAgICAgIGJ1ZiArPSAyOworCisgICAgICAgIGlmIChpZHggPiAyNTUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFsZXR0ZSBpbmRleCBvdXQgb2YgcmFuZ2U6ICV1XG4iLCBpZHgpOworICAgICAgICAgICAgYnVmICs9IDY7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICByID0gKmJ1ZisrOworICAgICAgICBidWYrKzsKKyAgICAgICAgZyA9ICpidWYrKzsKKyAgICAgICAgYnVmKys7CisgICAgICAgIGIgPSAqYnVmKys7CisgICAgICAgIGJ1ZisrOworICAgICAgICBwYWxbaWR4XSA9IDB4RkZVIDw8IDI0IHwgciA8PCAxNiB8IGcgPDwgOCB8IGI7CisgICAgfQorICAgIHAtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworCisgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPCAxOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgYnVmICs9IDE4OyAvKiBza2lwIHVubmVlZGVkIGRhdGEgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIGludCBzaXplLCBsZWZ0LCBjb2RlLCBwaXg7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm5leHQ7CisgICAgICAgIHVpbnQ4X3QgKm91dDsKKyAgICAgICAgaW50IHRzaXplID0gMDsKKworICAgICAgICAvKiBkZWNvZGUgbGluZSAqLworICAgICAgICBvdXQgID0gb3V0ZGF0YTsKKyAgICAgICAgc2l6ZSA9IEFWX1JCMTYoYnVmKTsgLyogc2l6ZSBvZiBwYWNrZWQgbGluZSAqLworICAgICAgICBidWYgKz0gMjsKKyAgICAgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPCBzaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgbGVmdCA9IHNpemU7CisgICAgICAgIG5leHQgPSBidWYgKyBzaXplOworICAgICAgICB3aGlsZSAobGVmdCA+IDApIHsKKyAgICAgICAgICAgIGNvZGUgPSAqYnVmKys7CisgICAgICAgICAgICBpZiAoY29kZSAmIDB4ODAgKSB7IC8qIHJ1biAqLworICAgICAgICAgICAgICAgIHBpeCA9ICpidWYrKzsKKyAgICAgICAgICAgICAgICBpZiAoKG91dCArICgyNTcgLSBjb2RlKSkgPiAob3V0ZGF0YSArICBwLT5saW5lc2l6ZVswXSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG1lbXNldChvdXQsIHBpeCwgMjU3IC0gY29kZSk7CisgICAgICAgICAgICAgICAgb3V0ICAgKz0gMjU3IC0gY29kZTsKKyAgICAgICAgICAgICAgICB0c2l6ZSArPSAyNTcgLSBjb2RlOworICAgICAgICAgICAgICAgIGxlZnQgIC09IDI7CisgICAgICAgICAgICB9IGVsc2UgeyAvKiBjb3B5ICovCisgICAgICAgICAgICAgICAgaWYgKChvdXQgKyBjb2RlKSA+IChvdXRkYXRhICsgIHAtPmxpbmVzaXplWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPCBjb2RlICsgMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgbWVtY3B5KG91dCwgYnVmLCBjb2RlICsgMSk7CisgICAgICAgICAgICAgICAgb3V0ICAgKz0gY29kZSArIDE7CisgICAgICAgICAgICAgICAgYnVmICAgKz0gY29kZSArIDE7CisgICAgICAgICAgICAgICAgbGVmdCAgLT0gMiArIGNvZGU7CisgICAgICAgICAgICAgICAgdHNpemUgKz0gY29kZSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgb3V0ZGF0YSArPSBwLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lICAgICAgPSAxOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2Y3R4LT5waXhfZm10PSBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9xZHJhd19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJxZHJhdyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGxlIFF1aWNrRHJhdyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9RRFJBVywKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9xcGVnLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9xcGVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYxYmNlYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3FwZWcuYwpAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqIFFQRUcgY29kZWMKKyAqIENvcHlyaWdodCAoYykgMjAwNCBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFFQRUcgY29kZWMuCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUXBlZ0NvbnRleHR7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRnJhbWUgKnBpYywgKnJlZjsKKyAgICB1aW50MzJfdCBwYWxbMjU2XTsKKyAgICBHZXRCeXRlQ29udGV4dCBidWZmZXI7Cit9IFFwZWdDb250ZXh0OworCitzdGF0aWMgdm9pZCBxcGVnX2RlY29kZV9pbnRyYShRcGVnQ29udGV4dCAqcWN0eCwgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBpOworICAgIGludCBjb2RlOworICAgIGludCBjMCwgYzE7CisgICAgaW50IHJ1biwgY29weTsKKyAgICBpbnQgZmlsbGVkID0gMDsKKyAgICBpbnQgcm93c190b19nbzsKKworICAgIHJvd3NfdG9fZ28gPSBoZWlnaHQ7CisgICAgaGVpZ2h0LS07CisgICAgZHN0ID0gZHN0ICsgaGVpZ2h0ICogc3RyaWRlOworCisgICAgd2hpbGUgKChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcWN0eC0+YnVmZmVyKSA+IDApICYmIChyb3dzX3RvX2dvID4gMCkpIHsKKyAgICAgICAgY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZxY3R4LT5idWZmZXIpOworICAgICAgICBydW4gPSBjb3B5ID0gMDsKKyAgICAgICAgaWYoY29kZSA9PSAweEZDKSAvKiBlbmQtb2YtcGljdHVyZSBjb2RlICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoY29kZSA+PSAweEY4KSB7IC8qIHZlcnkgbG9uZyBydW4gKi8KKyAgICAgICAgICAgIGMwID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnFjdHgtPmJ1ZmZlcik7CisgICAgICAgICAgICBjMSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZxY3R4LT5idWZmZXIpOworICAgICAgICAgICAgcnVuID0gKChjb2RlICYgMHg3KSA8PCAxNikgKyAoYzAgPDwgOCkgKyBjMSArIDI7CisgICAgICAgIH0gZWxzZSBpZiAoY29kZSA+PSAweEYwKSB7IC8qIGxvbmcgcnVuICovCisgICAgICAgICAgICBjMCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZxY3R4LT5idWZmZXIpOworICAgICAgICAgICAgcnVuID0gKChjb2RlICYgMHhGKSA8PCA4KSArIGMwICsgMjsKKyAgICAgICAgfSBlbHNlIGlmIChjb2RlID49IDB4RTApIHsgLyogc2hvcnQgcnVuICovCisgICAgICAgICAgICBydW4gPSAoY29kZSAmIDB4MUYpICsgMjsKKyAgICAgICAgfSBlbHNlIGlmIChjb2RlID49IDB4QzApIHsgLyogdmVyeSBsb25nIGNvcHkgKi8KKyAgICAgICAgICAgIGMwID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnFjdHgtPmJ1ZmZlcik7CisgICAgICAgICAgICBjMSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZxY3R4LT5idWZmZXIpOworICAgICAgICAgICAgY29weSA9ICgoY29kZSAmIDB4M0YpIDw8IDE2KSArIChjMCA8PCA4KSArIGMxICsgMTsKKyAgICAgICAgfSBlbHNlIGlmIChjb2RlID49IDB4ODApIHsgLyogbG9uZyBjb3B5ICovCisgICAgICAgICAgICBjMCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZxY3R4LT5idWZmZXIpOworICAgICAgICAgICAgY29weSA9ICgoY29kZSAmIDB4N0YpIDw8IDgpICsgYzAgKyAxOworICAgICAgICB9IGVsc2UgeyAvKiBzaG9ydCBjb3B5ICovCisgICAgICAgICAgICBjb3B5ID0gY29kZSArIDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBwZXJmb3JtIGFjdHVhbCBydW4gb3IgY29weSAqLworICAgICAgICBpZihydW4pIHsKKyAgICAgICAgICAgIGludCBwOworCisgICAgICAgICAgICBwID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnFjdHgtPmJ1ZmZlcik7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBydW47IGkrKykgeworICAgICAgICAgICAgICAgIGRzdFtmaWxsZWQrK10gPSBwOworICAgICAgICAgICAgICAgIGlmIChmaWxsZWQgPj0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsbGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZHN0IC09IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgcm93c190b19nby0tOworICAgICAgICAgICAgICAgICAgICBpZihyb3dzX3RvX2dvIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBjb3B5OyBpKyspIHsKKyAgICAgICAgICAgICAgICBkc3RbZmlsbGVkKytdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnFjdHgtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKGZpbGxlZCA+PSB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICBmaWxsZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBkc3QgLT0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICByb3dzX3RvX2dvLS07CisgICAgICAgICAgICAgICAgICAgIGlmKHJvd3NfdG9fZ28gPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGNvbnN0IGludCBxcGVnX3RhYmxlX2hbMTZdID0KKyB7IDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MTgsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MTAsIDB4MDgsIDB4MTgsIDB4MDgsIDB4MDgsIDB4MTgsIDB4MTAsIDB4MDR9Oworc3RhdGljIGNvbnN0IGludCBxcGVnX3RhYmxlX3dbMTZdID0KKyB7IDB4MDAsIDB4MjAsIDB4MTgsIDB4MDgsIDB4MTgsIDB4MTAsIDB4MjAsIDB4MTAsIDB4MDgsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MDgsIDB4MTAsIDB4MTgsIDB4MDR9OworCisvKiBEZWNvZGVzIGRlbHRhIGZyYW1lcyAqLworc3RhdGljIHZvaWQgYXZfbm9pbmxpbmUgcXBlZ19kZWNvZGVfaW50ZXIoUXBlZ0NvbnRleHQgKnFjdHgsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSwgY29uc3QgdWludDhfdCAqY3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcmVmZGF0YSkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgY29kZTsKKyAgICBpbnQgZmlsbGVkID0gMDsKKyAgICBpbnQgb3JpZ19oZWlnaHQ7CisKKyAgICBpZighcmVmZGF0YSkKKyAgICAgICAgcmVmZGF0YT0gZHN0OworCisgICAgLyogY29weSBwcmV2IGZyYW1lICovCisgICAgZm9yKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspCisgICAgICAgIG1lbWNweShkc3QgKyAoaSAqIHN0cmlkZSksIHJlZmRhdGEgKyAoaSAqIHN0cmlkZSksIHdpZHRoKTsKKworICAgIG9yaWdfaGVpZ2h0ID0gaGVpZ2h0OworICAgIGhlaWdodC0tOworICAgIGRzdCA9IGRzdCArIGhlaWdodCAqIHN0cmlkZTsKKworICAgIHdoaWxlICgoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnFjdHgtPmJ1ZmZlcikgPiAwKSAmJiAoaGVpZ2h0ID49IDApKSB7CisgICAgICAgIGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcWN0eC0+YnVmZmVyKTsKKworICAgICAgICBpZihkZWx0YSkgeworICAgICAgICAgICAgLyogbW90aW9uIGNvbXBlbnNhdGlvbiAqLworICAgICAgICAgICAgd2hpbGUoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnFjdHgtPmJ1ZmZlcikgPiAwICYmIChjb2RlICYgMHhGMCkgPT0gMHhGMCkgeworICAgICAgICAgICAgICAgIGlmKGRlbHRhID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1lX2lkeDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1lX3csIG1lX2gsIG1lX3gsIG1lX3k7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm1lX3BsYW5lOworICAgICAgICAgICAgICAgICAgICBpbnQgY29yciwgdmFsOworCisgICAgICAgICAgICAgICAgICAgIC8qIGdldCBibG9jayBzaXplIGJ5IGluZGV4ICovCisgICAgICAgICAgICAgICAgICAgIG1lX2lkeCA9IGNvZGUgJiAweEY7CisgICAgICAgICAgICAgICAgICAgIG1lX3cgPSBxcGVnX3RhYmxlX3dbbWVfaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgbWVfaCA9IHFwZWdfdGFibGVfaFttZV9pZHhdOworCisgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhY3QgbW90aW9uIHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICBjb3JyID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnFjdHgtPmJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gY29yciA+PiA0OworICAgICAgICAgICAgICAgICAgICBpZih2YWwgPiA3KQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsIC09IDE2OworICAgICAgICAgICAgICAgICAgICBtZV94ID0gdmFsOworCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IGNvcnIgJiAweEY7CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbCA+IDcpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgLT0gMTY7CisgICAgICAgICAgICAgICAgICAgIG1lX3kgPSB2YWw7CisKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgbW90aW9uIHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKG1lX3ggKyBmaWxsZWQgPCAwKSB8fCAobWVfeCArIG1lX3cgKyBmaWxsZWQgPiB3aWR0aCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKGhlaWdodCAtIG1lX3kgLSBtZV9oIDwgMCkgfHwgKGhlaWdodCAtIG1lX3kgPj0gb3JpZ19oZWlnaHQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChmaWxsZWQgKyBtZV93ID4gd2lkdGgpIHx8IChoZWlnaHQgLSBtZV9oIDwgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQm9ndXMgbW90aW9uIHZlY3RvciAoJWksJWkpLCBibG9jayBzaXplICVpeCVpIGF0ICVpLCVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lX3gsIG1lX3ksIG1lX3csIG1lX2gsIGZpbGxlZCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBtb3Rpb24gY29tcGVuc2F0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBtZV9wbGFuZSA9IHJlZmRhdGEgKyAoZmlsbGVkICsgbWVfeCkgKyAoaGVpZ2h0IC0gbWVfeSkgKiBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBtZV9oOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBtZV93OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtmaWxsZWQgKyBpIC0gKGogKiBzdHJpZGUpXSA9IG1lX3BsYW5lW2kgLSAoaiAqIHN0cmlkZSldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcWN0eC0+YnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGNvZGUgPT0gMHhFMCkgLyogZW5kLW9mLXBpY3R1cmUgY29kZSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKGNvZGUgPiAweEUwKSB7IC8qIHJ1biBjb2RlOiAweEUxLi4weEZGICovCisgICAgICAgICAgICBpbnQgcDsKKworICAgICAgICAgICAgY29kZSAmPSAweDFGOworICAgICAgICAgICAgcCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZxY3R4LT5idWZmZXIpOworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDw9IGNvZGU7IGkrKykgeworICAgICAgICAgICAgICAgIGRzdFtmaWxsZWQrK10gPSBwOworICAgICAgICAgICAgICAgIGlmKGZpbGxlZCA+PSB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICBmaWxsZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBkc3QgLT0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICBoZWlnaHQtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZihjb2RlID49IDB4QzApIHsgLyogY29weSBjb2RlOiAweEMwLi4weERGICovCisgICAgICAgICAgICBjb2RlICY9IDB4MUY7CisKKyAgICAgICAgICAgIGlmKGNvZGUgKyAxID4gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnFjdHgtPmJ1ZmZlcikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8PSBjb2RlOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkc3RbZmlsbGVkKytdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnFjdHgtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYoZmlsbGVkID49IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGxlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGRzdCAtPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIGhlaWdodC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmKGNvZGUgPj0gMHg4MCkgeyAvKiBza2lwIGNvZGU6IDB4ODAuLjB4QkYgKi8KKyAgICAgICAgICAgIGludCBza2lwOworCisgICAgICAgICAgICBjb2RlICY9IDB4M0Y7CisgICAgICAgICAgICAvKiBjb2RlcyAweDgwIGFuZCAweDgxIGFyZSBhY3R1YWxseSBlc2NhcGUgY29kZXMsCisgICAgICAgICAgICAgICBza2lwIHZhbHVlIG1pbnVzIGNvbnN0YW50IGlzIGluIHRoZSBuZXh0IGJ5dGUgKi8KKyAgICAgICAgICAgIGlmKCFjb2RlKQorICAgICAgICAgICAgICAgIHNraXAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcWN0eC0+YnVmZmVyKSArICA2NDsKKyAgICAgICAgICAgIGVsc2UgaWYoY29kZSA9PSAxKQorICAgICAgICAgICAgICAgIHNraXAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcWN0eC0+YnVmZmVyKSArIDMyMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBza2lwID0gY29kZTsKKyAgICAgICAgICAgIGZpbGxlZCArPSBza2lwOworICAgICAgICAgICAgd2hpbGUoIGZpbGxlZCA+PSB3aWR0aCkgeworICAgICAgICAgICAgICAgIGZpbGxlZCAtPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBkc3QgLT0gc3RyaWRlOworICAgICAgICAgICAgICAgIGhlaWdodC0tOworICAgICAgICAgICAgICAgIGlmKGhlaWdodCA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogemVybyBjb2RlIHRyZWF0ZWQgYXMgb25lLXBpeGVsIHNraXAgKi8KKyAgICAgICAgICAgIGlmKGNvZGUpIHsKKyAgICAgICAgICAgICAgICBkc3RbZmlsbGVkKytdID0gY3RhYmxlW2NvZGUgJiAweDdGXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmaWxsZWQrKzsKKyAgICAgICAgICAgIGlmKGZpbGxlZCA+PSB3aWR0aCkgeworICAgICAgICAgICAgICAgIGZpbGxlZCA9IDA7CisgICAgICAgICAgICAgICAgZHN0IC09IHN0cmlkZTsKKyAgICAgICAgICAgICAgICBoZWlnaHQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgdWludDhfdCBjdGFibGVbMTI4XTsKKyAgICBRcGVnQ29udGV4dCAqIGNvbnN0IGEgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKiBjb25zdCBwID0gYS0+cGljOworICAgIEFWRnJhbWUgKiBjb25zdCByZWYgPSBhLT5yZWY7CisgICAgdWludDhfdCogb3V0ZGF0YTsKKyAgICBpbnQgZGVsdGEsIHJldDsKKyAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgTlVMTCk7CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPCAweDg2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGlzIHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmEtPmJ1ZmZlciwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIGF2X2ZyYW1lX3VucmVmKHJlZik7CisgICAgYXZfZnJhbWVfbW92ZV9yZWYocmVmLCBwKTsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcCwgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBvdXRkYXRhID0gcC0+ZGF0YVswXTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZhLT5idWZmZXIsIDQpOworICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmEtPmJ1ZmZlciwgY3RhYmxlLCAxMjgpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmEtPmJ1ZmZlciwgMSk7CisKKyAgICBkZWx0YSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZhLT5idWZmZXIpOworICAgIGlmKGRlbHRhID09IDB4MTApIHsKKyAgICAgICAgcXBlZ19kZWNvZGVfaW50cmEoYSwgb3V0ZGF0YSwgcC0+bGluZXNpemVbMF0sIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcXBlZ19kZWNvZGVfaW50ZXIoYSwgb3V0ZGF0YSwgcC0+bGluZXNpemVbMF0sIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgZGVsdGEsIGN0YWJsZSwgcmVmLT5kYXRhWzBdKTsKKyAgICB9CisKKyAgICAvKiBtYWtlIHRoZSBwYWxldHRlIGF2YWlsYWJsZSBvbiB0aGUgd2F5IG91dCAqLworICAgIGlmIChwYWwpIHsKKyAgICAgICAgcC0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisgICAgICAgIG1lbWNweShhLT5wYWwsIHBhbCwgQVZQQUxFVFRFX1NJWkUpOworICAgIH0KKyAgICBtZW1jcHkocC0+ZGF0YVsxXSwgYS0+cGFsLCBBVlBBTEVUVEVfU0laRSk7CisKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9mcmFtZSAgICAgID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCl7CisgICAgUXBlZ0NvbnRleHQgKiBjb25zdCBhID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcGFsX3NpemU7CisgICAgY29uc3QgdWludDhfdCAqcGFsX3NyYzsKKworICAgIHBhbF9zaXplID0gRkZNSU4oMTAyNFUsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgcGFsX3NyYyA9IGF2Y3R4LT5leHRyYWRhdGEgKyBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgLSBwYWxfc2l6ZTsKKworICAgIGZvciAoaT0wOyBpPHBhbF9zaXplLzQ7IGkrKykKKyAgICAgICAgYS0+cGFsW2ldID0gMHhGRlU8PDI0IHwgQVZfUkwzMihwYWxfc3JjKzQqaSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBRcGVnQ29udGV4dCAqIGNvbnN0IGEgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmYS0+cGljKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZhLT5yZWYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpeworICAgIFFwZWdDb250ZXh0ICogY29uc3QgYSA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhLT5hdmN0eCA9IGF2Y3R4OworICAgIGF2Y3R4LT5waXhfZm10PSBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICBkZWNvZGVfZmx1c2goYXZjdHgpOworCisgICAgYS0+cGljID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBhLT5yZWYgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYS0+cGljIHx8ICFhLT5yZWYpIHsKKyAgICAgICAgZGVjb2RlX2VuZChhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfcXBlZ19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJxcGVnIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUS10ZWFtIFFQRUciKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUVBFRywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUXBlZ0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IGRlY29kZV9mbHVzaCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3FwZWxfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3FwZWxfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTJhNzhjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcXBlbF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogcXVhcnRlcnBlbCBEU1AgZnVuY3Rpb24gdGVtcGxhdGVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBxdWFydGVycGVsIERTUCBmdW5jdGlvbiB0ZW1wbGF0ZXMKKyAqLworCisjZGVmaW5lIFBJWE9QMihPUE5BTUUsIE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9ub19ybmRfcGl4ZWxzOF9sMl84KHVpbnQ4X3QgKmRzdCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMiwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGEsIGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgPSBBVl9STjMyKCZzcmMxW2kgKiBzcmNfc3RyaWRlMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIgPSBBVl9STjMyKCZzcmMyW2kgKiBzcmNfc3RyaWRlMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHVpbnQzMl90ICopICZkc3RbaSAqIGRzdF9zdHJpZGVdKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5vX3JuZF9hdmczMihhLCBiKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgPSBBVl9STjMyKCZzcmMxW2kgKiBzcmNfc3RyaWRlMSArIDRdKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIgPSBBVl9STjMyKCZzcmMyW2kgKiBzcmNfc3RyaWRlMiArIDRdKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHVpbnQzMl90ICopICZkc3RbaSAqIGRzdF9zdHJpZGUgKyA0XSksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5vX3JuZF9hdmczMihhLCBiKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9ub19ybmRfcGl4ZWxzMTZfbDJfOCh1aW50OF90ICpkc3QsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZTEsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZTIsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9ub19ybmRfcGl4ZWxzOF9sMl84KGRzdCwgc3JjMSwgc3JjMiwgZHN0X3N0cmlkZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGUxLCBzcmNfc3RyaWRlMiwgaCk7ICAgICAgICBcCisgICAgT1BOQU1FICMjIF9ub19ybmRfcGl4ZWxzOF9sMl84KGRzdCAgKyA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgKyA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIgKyA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUsIHNyY19zdHJpZGUxLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGUyLCBoKTsgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9waXhlbHM4X2w0XzgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjNCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGUxLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGUyLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGUzLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGU0LCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogRklYTUUgSElHSCBCSVQgREVQVEggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGEsIGIsIGMsIGQsIGwwLCBsMSwgaDAsIGgxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgID0gQVZfUk4zMigmc3JjMVtpICogc3JjX3N0cmlkZTFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIgID0gQVZfUk4zMigmc3JjMltpICogc3JjX3N0cmlkZTJdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGMgID0gQVZfUk4zMigmc3JjM1tpICogc3JjX3N0cmlkZTNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGQgID0gQVZfUk4zMigmc3JjNFtpICogc3JjX3N0cmlkZTRdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGIgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAweDAyMDIwMjAyVUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGgwID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwxID0gKGMgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGQgJiAweDAzMDMwMzAzVUwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGgxID0gKChjICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKChkICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHVpbnQzMl90ICopICZkc3RbaSAqIGRzdF9zdHJpZGVdKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGgwICsgaDEgKyAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCkpOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgID0gQVZfUk4zMigmc3JjMVtpICogc3JjX3N0cmlkZTEgKyA0XSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIgID0gQVZfUk4zMigmc3JjMltpICogc3JjX3N0cmlkZTIgKyA0XSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGMgID0gQVZfUk4zMigmc3JjM1tpICogc3JjX3N0cmlkZTMgKyA0XSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGQgID0gQVZfUk4zMigmc3JjNFtpICogc3JjX3N0cmlkZTQgKyA0XSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGIgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAweDAyMDIwMjAyVUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGgwID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwxID0gKGMgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGQgJiAweDAzMDMwMzAzVUwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGgxID0gKChjICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKChkICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHVpbnQzMl90ICopICZkc3RbaSAqIGRzdF9zdHJpZGUgKyA0XSksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGgwICsgaDEgKyAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCkpOyAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9ub19ybmRfcGl4ZWxzOF9sNF84KHVpbnQ4X3QgKmRzdCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzMsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzQsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMiwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlNCwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogRklYTUUgSElHSCBCSVQgREVQVEggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGEsIGIsIGMsIGQsIGwwLCBsMSwgaDAsIGgxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgID0gQVZfUk4zMigmc3JjMVtpICogc3JjX3N0cmlkZTFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIgID0gQVZfUk4zMigmc3JjMltpICogc3JjX3N0cmlkZTJdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGMgID0gQVZfUk4zMigmc3JjM1tpICogc3JjX3N0cmlkZTNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGQgID0gQVZfUk4zMigmc3JjNFtpICogc3JjX3N0cmlkZTRdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGIgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAweDAxMDEwMTAxVUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGgwID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwxID0gKGMgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGQgJiAweDAzMDMwMzAzVUwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGgxID0gKChjICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKChkICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHVpbnQzMl90ICopICZkc3RbaSAqIGRzdF9zdHJpZGVdKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGgwICsgaDEgKyAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCkpOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgID0gQVZfUk4zMigmc3JjMVtpICogc3JjX3N0cmlkZTEgKyA0XSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIgID0gQVZfUk4zMigmc3JjMltpICogc3JjX3N0cmlkZTIgKyA0XSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGMgID0gQVZfUk4zMigmc3JjM1tpICogc3JjX3N0cmlkZTMgKyA0XSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGQgID0gQVZfUk4zMigmc3JjNFtpICogc3JjX3N0cmlkZTQgKyA0XSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGIgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAweDAxMDEwMTAxVUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGgwID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwxID0gKGMgJiAweDAzMDMwMzAzVUwpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGQgJiAweDAzMDMwMzAzVUwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGgxID0gKChjICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKChkICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCooKHVpbnQzMl90ICopICZkc3RbaSAqIGRzdF9zdHJpZGUgKyA0XSksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGgwICsgaDEgKyAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCkpOyAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9waXhlbHMxNl9sNF84KHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzMsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzQsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMiwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlMywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlNCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKSAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9waXhlbHM4X2w0XzgoZHN0LCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBkc3Rfc3RyaWRlLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZTEsIHNyY19zdHJpZGUyLCBzcmNfc3RyaWRlMywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZTQsIGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9waXhlbHM4X2w0XzgoZHN0ICArIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSArIDgsIHNyYzIgKyA4LCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMyArIDgsIHNyYzQgKyA4LCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0cmlkZSwgc3JjX3N0cmlkZTEsIHNyY19zdHJpZGUyLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZTMsIHNyY19zdHJpZGU0LCBoKTsgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIF9ub19ybmRfcGl4ZWxzMTZfbDRfOCh1aW50OF90ICpkc3QsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmM0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZTEsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZTIsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZTMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZTQsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9ub19ybmRfcGl4ZWxzOF9sNF84KGRzdCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUsIHNyY19zdHJpZGUxLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGUyLCBzcmNfc3RyaWRlMywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGU0LCBoKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIF9ub19ybmRfcGl4ZWxzOF9sNF84KGRzdCAgKyA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgKyA4LCBzcmMyICsgOCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzMgKyA4LCBzcmM0ICsgOCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUsIHNyY19zdHJpZGUxLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGUyLCBzcmNfc3RyaWRlMywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGU0LCBoKTsgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgb3BfYXZnKGEsIGIpIGEgPSBybmRfYXZnMzIoYSwgYikKKyNkZWZpbmUgb3BfcHV0KGEsIGIpIGEgPSBiCisjZGVmaW5lIHB1dF9ub19ybmRfcGl4ZWxzOF84X2MgcHV0X3BpeGVsczhfOF9jCitQSVhPUDIoYXZnLCBvcF9hdmcpCitQSVhPUDIocHV0LCBvcF9wdXQpCisjdW5kZWYgb3BfYXZnCisjdW5kZWYgb3BfcHV0CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9xcGVsZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9xcGVsZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwZWM2MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3FwZWxkc3AuYwpAQCAtMCwwICsxLDgxNCBAQAorLyoKKyAqIHF1YXJ0ZXJwZWwgRFNQIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogcXVhcnRlcnBlbCBEU1AgZnVuY3Rpb25zCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJjb3B5X2Jsb2NrLmgiCisjaW5jbHVkZSAicXBlbGRzcC5oIgorI2luY2x1ZGUgImRpcmFjZHNwLmgiCisKKyNkZWZpbmUgQklUX0RFUFRIIDgKKyNpbmNsdWRlICJocGVsX3RlbXBsYXRlLmMiCisjaW5jbHVkZSAicGVsX3RlbXBsYXRlLmMiCisjaW5jbHVkZSAicXBlbF90ZW1wbGF0ZS5jIgorCisjZGVmaW5lIFFQRUxfTUMociwgT1BOQU1FLCBSTkQsIE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgbXBlZzRfcXBlbDhfaF9sb3dwYXNzKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKGRzdFswXSwgKHNyY1swXSArIHNyY1sxXSkgKiAyMCAtIChzcmNbMF0gKyBzcmNbMl0pICogNiArIChzcmNbMV0gKyBzcmNbM10pICogMyAtIChzcmNbMl0gKyBzcmNbNF0pKTsgXAorICAgICAgICBPUChkc3RbMV0sIChzcmNbMV0gKyBzcmNbMl0pICogMjAgLSAoc3JjWzBdICsgc3JjWzNdKSAqIDYgKyAoc3JjWzBdICsgc3JjWzRdKSAqIDMgLSAoc3JjWzFdICsgc3JjWzVdKSk7IFwKKyAgICAgICAgT1AoZHN0WzJdLCAoc3JjWzJdICsgc3JjWzNdKSAqIDIwIC0gKHNyY1sxXSArIHNyY1s0XSkgKiA2ICsgKHNyY1swXSArIHNyY1s1XSkgKiAzIC0gKHNyY1swXSArIHNyY1s2XSkpOyBcCisgICAgICAgIE9QKGRzdFszXSwgKHNyY1szXSArIHNyY1s0XSkgKiAyMCAtIChzcmNbMl0gKyBzcmNbNV0pICogNiArIChzcmNbMV0gKyBzcmNbNl0pICogMyAtIChzcmNbMF0gKyBzcmNbN10pKTsgXAorICAgICAgICBPUChkc3RbNF0sIChzcmNbNF0gKyBzcmNbNV0pICogMjAgLSAoc3JjWzNdICsgc3JjWzZdKSAqIDYgKyAoc3JjWzJdICsgc3JjWzddKSAqIDMgLSAoc3JjWzFdICsgc3JjWzhdKSk7IFwKKyAgICAgICAgT1AoZHN0WzVdLCAoc3JjWzVdICsgc3JjWzZdKSAqIDIwIC0gKHNyY1s0XSArIHNyY1s3XSkgKiA2ICsgKHNyY1szXSArIHNyY1s4XSkgKiAzIC0gKHNyY1syXSArIHNyY1s4XSkpOyBcCisgICAgICAgIE9QKGRzdFs2XSwgKHNyY1s2XSArIHNyY1s3XSkgKiAyMCAtIChzcmNbNV0gKyBzcmNbOF0pICogNiArIChzcmNbNF0gKyBzcmNbOF0pICogMyAtIChzcmNbM10gKyBzcmNbN10pKTsgXAorICAgICAgICBPUChkc3RbN10sIChzcmNbN10gKyBzcmNbOF0pICogMjAgLSAoc3JjWzZdICsgc3JjWzhdKSAqIDYgKyAoc3JjWzVdICsgc3JjWzddKSAqIDMgLSAoc3JjWzRdICsgc3JjWzZdKSk7IFwKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjICs9IHNyY1N0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdyA9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHNyYzAgPSBzcmNbMCAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHNyYzEgPSBzcmNbMSAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHNyYzIgPSBzcmNbMiAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHNyYzMgPSBzcmNbMyAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHNyYzQgPSBzcmNbNCAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHNyYzUgPSBzcmNbNSAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHNyYzYgPSBzcmNbNiAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHNyYzcgPSBzcmNbNyAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHNyYzggPSBzcmNbOCAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1AoZHN0WzAgKiBkc3RTdHJpZGVdLCAoc3JjMCArIHNyYzEpICogMjAgLSAoc3JjMCArIHNyYzIpICogNiArIChzcmMxICsgc3JjMykgKiAzIC0gKHNyYzIgKyBzcmM0KSk7IFwKKyAgICAgICAgT1AoZHN0WzEgKiBkc3RTdHJpZGVdLCAoc3JjMSArIHNyYzIpICogMjAgLSAoc3JjMCArIHNyYzMpICogNiArIChzcmMwICsgc3JjNCkgKiAzIC0gKHNyYzEgKyBzcmM1KSk7IFwKKyAgICAgICAgT1AoZHN0WzIgKiBkc3RTdHJpZGVdLCAoc3JjMiArIHNyYzMpICogMjAgLSAoc3JjMSArIHNyYzQpICogNiArIChzcmMwICsgc3JjNSkgKiAzIC0gKHNyYzAgKyBzcmM2KSk7IFwKKyAgICAgICAgT1AoZHN0WzMgKiBkc3RTdHJpZGVdLCAoc3JjMyArIHNyYzQpICogMjAgLSAoc3JjMiArIHNyYzUpICogNiArIChzcmMxICsgc3JjNikgKiAzIC0gKHNyYzAgKyBzcmM3KSk7IFwKKyAgICAgICAgT1AoZHN0WzQgKiBkc3RTdHJpZGVdLCAoc3JjNCArIHNyYzUpICogMjAgLSAoc3JjMyArIHNyYzYpICogNiArIChzcmMyICsgc3JjNykgKiAzIC0gKHNyYzEgKyBzcmM4KSk7IFwKKyAgICAgICAgT1AoZHN0WzUgKiBkc3RTdHJpZGVdLCAoc3JjNSArIHNyYzYpICogMjAgLSAoc3JjNCArIHNyYzcpICogNiArIChzcmMzICsgc3JjOCkgKiAzIC0gKHNyYzIgKyBzcmM4KSk7IFwKKyAgICAgICAgT1AoZHN0WzYgKiBkc3RTdHJpZGVdLCAoc3JjNiArIHNyYzcpICogMjAgLSAoc3JjNSArIHNyYzgpICogNiArIChzcmM0ICsgc3JjOCkgKiAzIC0gKHNyYzMgKyBzcmM3KSk7IFwKKyAgICAgICAgT1AoZHN0WzcgKiBkc3RTdHJpZGVdLCAoc3JjNyArIHNyYzgpICogMjAgLSAoc3JjNiArIHNyYzgpICogNiArIChzcmM1ICsgc3JjNykgKiAzIC0gKHNyYzQgKyBzcmM2KSk7IFwKKyAgICAgICAgZHN0Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1AoZHN0WzBdLCAgKHNyY1swXSAgKyBzcmNbMV0pICAqIDIwIC0gKHNyY1swXSAgKyBzcmNbMl0pICAqIDYgKyAoc3JjWzFdICArIHNyY1szXSkgICogMyAtIChzcmNbMl0gICsgc3JjWzRdKSk7ICBcCisgICAgICAgIE9QKGRzdFsxXSwgIChzcmNbMV0gICsgc3JjWzJdKSAgKiAyMCAtIChzcmNbMF0gICsgc3JjWzNdKSAgKiA2ICsgKHNyY1swXSAgKyBzcmNbNF0pICAqIDMgLSAoc3JjWzFdICArIHNyY1s1XSkpOyAgXAorICAgICAgICBPUChkc3RbMl0sICAoc3JjWzJdICArIHNyY1szXSkgICogMjAgLSAoc3JjWzFdICArIHNyY1s0XSkgICogNiArIChzcmNbMF0gICsgc3JjWzVdKSAgKiAzIC0gKHNyY1swXSAgKyBzcmNbNl0pKTsgIFwKKyAgICAgICAgT1AoZHN0WzNdLCAgKHNyY1szXSAgKyBzcmNbNF0pICAqIDIwIC0gKHNyY1syXSAgKyBzcmNbNV0pICAqIDYgKyAoc3JjWzFdICArIHNyY1s2XSkgICogMyAtIChzcmNbMF0gICsgc3JjWzddKSk7ICBcCisgICAgICAgIE9QKGRzdFs0XSwgIChzcmNbNF0gICsgc3JjWzVdKSAgKiAyMCAtIChzcmNbM10gICsgc3JjWzZdKSAgKiA2ICsgKHNyY1syXSAgKyBzcmNbN10pICAqIDMgLSAoc3JjWzFdICArIHNyY1s4XSkpOyAgXAorICAgICAgICBPUChkc3RbNV0sICAoc3JjWzVdICArIHNyY1s2XSkgICogMjAgLSAoc3JjWzRdICArIHNyY1s3XSkgICogNiArIChzcmNbM10gICsgc3JjWzhdKSAgKiAzIC0gKHNyY1syXSAgKyBzcmNbOV0pKTsgIFwKKyAgICAgICAgT1AoZHN0WzZdLCAgKHNyY1s2XSAgKyBzcmNbN10pICAqIDIwIC0gKHNyY1s1XSAgKyBzcmNbOF0pICAqIDYgKyAoc3JjWzRdICArIHNyY1s5XSkgICogMyAtIChzcmNbM10gICsgc3JjWzEwXSkpOyBcCisgICAgICAgIE9QKGRzdFs3XSwgIChzcmNbN10gICsgc3JjWzhdKSAgKiAyMCAtIChzcmNbNl0gICsgc3JjWzldKSAgKiA2ICsgKHNyY1s1XSAgKyBzcmNbMTBdKSAqIDMgLSAoc3JjWzRdICArIHNyY1sxMV0pKTsgXAorICAgICAgICBPUChkc3RbOF0sICAoc3JjWzhdICArIHNyY1s5XSkgICogMjAgLSAoc3JjWzddICArIHNyY1sxMF0pICogNiArIChzcmNbNl0gICsgc3JjWzExXSkgKiAzIC0gKHNyY1s1XSAgKyBzcmNbMTJdKSk7IFwKKyAgICAgICAgT1AoZHN0WzldLCAgKHNyY1s5XSAgKyBzcmNbMTBdKSAqIDIwIC0gKHNyY1s4XSAgKyBzcmNbMTFdKSAqIDYgKyAoc3JjWzddICArIHNyY1sxMl0pICogMyAtIChzcmNbNl0gICsgc3JjWzEzXSkpOyBcCisgICAgICAgIE9QKGRzdFsxMF0sIChzcmNbMTBdICsgc3JjWzExXSkgKiAyMCAtIChzcmNbOV0gICsgc3JjWzEyXSkgKiA2ICsgKHNyY1s4XSAgKyBzcmNbMTNdKSAqIDMgLSAoc3JjWzddICArIHNyY1sxNF0pKTsgXAorICAgICAgICBPUChkc3RbMTFdLCAoc3JjWzExXSArIHNyY1sxMl0pICogMjAgLSAoc3JjWzEwXSArIHNyY1sxM10pICogNiArIChzcmNbOV0gICsgc3JjWzE0XSkgKiAzIC0gKHNyY1s4XSAgKyBzcmNbMTVdKSk7IFwKKyAgICAgICAgT1AoZHN0WzEyXSwgKHNyY1sxMl0gKyBzcmNbMTNdKSAqIDIwIC0gKHNyY1sxMV0gKyBzcmNbMTRdKSAqIDYgKyAoc3JjWzEwXSArIHNyY1sxNV0pICogMyAtIChzcmNbOV0gICsgc3JjWzE2XSkpOyBcCisgICAgICAgIE9QKGRzdFsxM10sIChzcmNbMTNdICsgc3JjWzE0XSkgKiAyMCAtIChzcmNbMTJdICsgc3JjWzE1XSkgKiA2ICsgKHNyY1sxMV0gKyBzcmNbMTZdKSAqIDMgLSAoc3JjWzEwXSArIHNyY1sxNl0pKTsgXAorICAgICAgICBPUChkc3RbMTRdLCAoc3JjWzE0XSArIHNyY1sxNV0pICogMjAgLSAoc3JjWzEzXSArIHNyY1sxNl0pICogNiArIChzcmNbMTJdICsgc3JjWzE2XSkgKiAzIC0gKHNyY1sxMV0gKyBzcmNbMTVdKSk7IFwKKyAgICAgICAgT1AoZHN0WzE1XSwgKHNyY1sxNV0gKyBzcmNbMTZdKSAqIDIwIC0gKHNyY1sxNF0gKyBzcmNbMTZdKSAqIDYgKyAoc3JjWzEzXSArIHNyY1sxNV0pICogMyAtIChzcmNbMTJdICsgc3JjWzE0XSkpOyBcCisgICAgICAgIGRzdCArPSBkc3RTdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNyYyArPSBzcmNTdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgbXBlZzRfcXBlbDE2X3ZfbG93cGFzcyh1aW50OF90ICpkc3QsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHcgPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmMwICA9IHNyY1swICAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmMxICA9IHNyY1sxICAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmMyICA9IHNyY1syICAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmMzICA9IHNyY1szICAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmM0ICA9IHNyY1s0ICAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmM1ICA9IHNyY1s1ICAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmM2ICA9IHNyY1s2ICAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmM3ICA9IHNyY1s3ICAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmM4ICA9IHNyY1s4ICAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmM5ICA9IHNyY1s5ICAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmMxMCA9IHNyY1sxMCAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmMxMSA9IHNyY1sxMSAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmMxMiA9IHNyY1sxMiAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmMxMyA9IHNyY1sxMyAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmMxNCA9IHNyY1sxNCAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmMxNSA9IHNyY1sxNSAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBzcmMxNiA9IHNyY1sxNiAqIHNyY1N0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKGRzdFswICAqIGRzdFN0cmlkZV0sIChzcmMwICArIHNyYzEpICAqIDIwIC0gKHNyYzAgICsgc3JjMikgICogNiArIChzcmMxICArIHNyYzMpICAqIDMgLSAoc3JjMiAgKyBzcmM0KSk7ICBcCisgICAgICAgIE9QKGRzdFsxICAqIGRzdFN0cmlkZV0sIChzcmMxICArIHNyYzIpICAqIDIwIC0gKHNyYzAgICsgc3JjMykgICogNiArIChzcmMwICArIHNyYzQpICAqIDMgLSAoc3JjMSAgKyBzcmM1KSk7ICBcCisgICAgICAgIE9QKGRzdFsyICAqIGRzdFN0cmlkZV0sIChzcmMyICArIHNyYzMpICAqIDIwIC0gKHNyYzEgICsgc3JjNCkgICogNiArIChzcmMwICArIHNyYzUpICAqIDMgLSAoc3JjMCAgKyBzcmM2KSk7ICBcCisgICAgICAgIE9QKGRzdFszICAqIGRzdFN0cmlkZV0sIChzcmMzICArIHNyYzQpICAqIDIwIC0gKHNyYzIgICsgc3JjNSkgICogNiArIChzcmMxICArIHNyYzYpICAqIDMgLSAoc3JjMCAgKyBzcmM3KSk7ICBcCisgICAgICAgIE9QKGRzdFs0ICAqIGRzdFN0cmlkZV0sIChzcmM0ICArIHNyYzUpICAqIDIwIC0gKHNyYzMgICsgc3JjNikgICogNiArIChzcmMyICArIHNyYzcpICAqIDMgLSAoc3JjMSAgKyBzcmM4KSk7ICBcCisgICAgICAgIE9QKGRzdFs1ICAqIGRzdFN0cmlkZV0sIChzcmM1ICArIHNyYzYpICAqIDIwIC0gKHNyYzQgICsgc3JjNykgICogNiArIChzcmMzICArIHNyYzgpICAqIDMgLSAoc3JjMiAgKyBzcmM5KSk7ICBcCisgICAgICAgIE9QKGRzdFs2ICAqIGRzdFN0cmlkZV0sIChzcmM2ICArIHNyYzcpICAqIDIwIC0gKHNyYzUgICsgc3JjOCkgICogNiArIChzcmM0ICArIHNyYzkpICAqIDMgLSAoc3JjMyAgKyBzcmMxMCkpOyBcCisgICAgICAgIE9QKGRzdFs3ICAqIGRzdFN0cmlkZV0sIChzcmM3ICArIHNyYzgpICAqIDIwIC0gKHNyYzYgICsgc3JjOSkgICogNiArIChzcmM1ICArIHNyYzEwKSAqIDMgLSAoc3JjNCAgKyBzcmMxMSkpOyBcCisgICAgICAgIE9QKGRzdFs4ICAqIGRzdFN0cmlkZV0sIChzcmM4ICArIHNyYzkpICAqIDIwIC0gKHNyYzcgICsgc3JjMTApICogNiArIChzcmM2ICArIHNyYzExKSAqIDMgLSAoc3JjNSAgKyBzcmMxMikpOyBcCisgICAgICAgIE9QKGRzdFs5ICAqIGRzdFN0cmlkZV0sIChzcmM5ICArIHNyYzEwKSAqIDIwIC0gKHNyYzggICsgc3JjMTEpICogNiArIChzcmM3ICArIHNyYzEyKSAqIDMgLSAoc3JjNiAgKyBzcmMxMykpOyBcCisgICAgICAgIE9QKGRzdFsxMCAqIGRzdFN0cmlkZV0sIChzcmMxMCArIHNyYzExKSAqIDIwIC0gKHNyYzkgICsgc3JjMTIpICogNiArIChzcmM4ICArIHNyYzEzKSAqIDMgLSAoc3JjNyAgKyBzcmMxNCkpOyBcCisgICAgICAgIE9QKGRzdFsxMSAqIGRzdFN0cmlkZV0sIChzcmMxMSArIHNyYzEyKSAqIDIwIC0gKHNyYzEwICsgc3JjMTMpICogNiArIChzcmM5ICArIHNyYzE0KSAqIDMgLSAoc3JjOCAgKyBzcmMxNSkpOyBcCisgICAgICAgIE9QKGRzdFsxMiAqIGRzdFN0cmlkZV0sIChzcmMxMiArIHNyYzEzKSAqIDIwIC0gKHNyYzExICsgc3JjMTQpICogNiArIChzcmMxMCArIHNyYzE1KSAqIDMgLSAoc3JjOSAgKyBzcmMxNikpOyBcCisgICAgICAgIE9QKGRzdFsxMyAqIGRzdFN0cmlkZV0sIChzcmMxMyArIHNyYzE0KSAqIDIwIC0gKHNyYzEyICsgc3JjMTUpICogNiArIChzcmMxMSArIHNyYzE2KSAqIDMgLSAoc3JjMTAgKyBzcmMxNikpOyBcCisgICAgICAgIE9QKGRzdFsxNCAqIGRzdFN0cmlkZV0sIChzcmMxNCArIHNyYzE1KSAqIDIwIC0gKHNyYzEzICsgc3JjMTYpICogNiArIChzcmMxMiArIHNyYzE2KSAqIDMgLSAoc3JjMTEgKyBzcmMxNSkpOyBcCisgICAgICAgIE9QKGRzdFsxNSAqIGRzdFN0cmlkZV0sIChzcmMxNSArIHNyYzE2KSAqIDIwIC0gKHNyYzE0ICsgc3JjMTYpICogNiArIChzcmMxMyArIHNyYzE1KSAqIDMgLSAoc3JjMTIgKyBzcmMxNCkpOyBcCisgICAgICAgIGRzdCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMxMF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmWzY0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZiwgc3JjLCA4LCBzdHJpZGUsIDgpOyAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIHNyYywgaGFsZiwgc3RyaWRlLCBzdHJpZGUsIDgsIDgpOyAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMyMF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzcyhkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUsIDgpOyAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMzMF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmWzY0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZiwgc3JjLCA4LCBzdHJpZGUsIDgpOyAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIHNyYyArIDEsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCA4LCA4KTsgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMwMV9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmWzY0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZiwgZnVsbCwgOCwgMTYpOyAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIGZ1bGwsIGhhbGYsIHN0cmlkZSwgMTYsIDgsIDgpOyAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMwMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzcyhkc3QsIGZ1bGwsIHN0cmlkZSwgMTYpOyAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMwM19jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmWzY0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZiwgZnVsbCwgOCwgMTYpOyAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIGZ1bGwgKyAxNiwgaGFsZiwgc3RyaWRlLCAxNiwgOCwgOCk7ICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDhfbWMxMV9vbGRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVls2NF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZlYsIGZ1bGwsIDgsIDE2KTsgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDRfOChkc3QsIGZ1bGwsIGhhbGZILCBoYWxmViwgaGFsZkhWLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE2LCA4LCA4LCA4LCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMxMV9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHM4X2wyXzgoaGFsZkgsIGhhbGZILCBmdWxsLCA4LCA4LCAxNiwgOSk7ICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIGhhbGZILCBoYWxmSFYsIHN0cmlkZSwgOCwgOCwgOCk7ICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDhfbWMzMV9vbGRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVls2NF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZlYsIGZ1bGwgKyAxLCA4LCAxNik7ICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDRfOChkc3QsIGZ1bGwgKyAxLCBoYWxmSCwgaGFsZlYsIGhhbGZIViwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE2LCA4LCA4LCA4LCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMzMV9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHM4X2wyXzgoaGFsZkgsIGhhbGZILCBmdWxsICsgMSwgOCwgOCwgMTYsIDkpOyAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIGhhbGZILCBoYWxmSFYsIHN0cmlkZSwgOCwgOCwgOCk7ICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDhfbWMxM19vbGRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVls2NF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZlYsIGZ1bGwsIDgsIDE2KTsgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDRfOChkc3QsIGZ1bGwgKyAxNiwgaGFsZkggKyA4LCBoYWxmViwgaGFsZkhWLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE2LCA4LCA4LCA4LCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMxM19jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHM4X2wyXzgoaGFsZkgsIGhhbGZILCBmdWxsLCA4LCA4LCAxNiwgOSk7ICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIGhhbGZIICsgOCwgaGFsZkhWLCBzdHJpZGUsIDgsIDgsIDgpOyAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDhfbWMzM19vbGRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVls2NF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZlYsIGZ1bGwgKyAxLCA4LCAxNik7ICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDRfOChkc3QsIGZ1bGwgKyAxNywgaGFsZkggKyA4LCBoYWxmViwgaGFsZkhWLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE2LCA4LCA4LCA4LCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMzM19jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHM4X2wyXzgoaGFsZkgsIGhhbGZILCBmdWxsICsgMSwgOCwgOCwgMTYsIDkpOyAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIGhhbGZIICsgOCwgaGFsZkhWLCBzdHJpZGUsIDgsIDgsIDgpOyAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMyMV9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIHNyYywgOCwgc3RyaWRlLCA5KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIGhhbGZILCBoYWxmSFYsIHN0cmlkZSwgOCwgOCwgOCk7ICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMyM19jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIHNyYywgOCwgc3RyaWRlLCA5KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIGhhbGZIICsgOCwgaGFsZkhWLCBzdHJpZGUsIDgsIDgsIDgpOyAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDhfbWMxMl9vbGRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVls2NF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZlYsIGZ1bGwsIDgsIDE2KTsgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIGhhbGZWLCBoYWxmSFYsIHN0cmlkZSwgOCwgOCwgOCk7ICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMxMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHM4X2wyXzgoaGFsZkgsIGhhbGZILCBmdWxsLCA4LCA4LCAxNiwgOSk7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzcyhkc3QsIGhhbGZILCBzdHJpZGUsIDgpOyAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDhfbWMzMl9vbGRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVls2NF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZlYsIGZ1bGwgKyAxLCA4LCAxNik7ICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCwgOCwgOCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczhfbDJfOChkc3QsIGhhbGZWLCBoYWxmSFYsIHN0cmlkZSwgOCwgOCwgOCk7ICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMzMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzE2ICogOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazkoZnVsbCwgc3JjLCAxNiwgc3RyaWRlLCA5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIGZ1bGwsIDgsIDE2LCA5KTsgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHM4X2wyXzgoaGFsZkgsIGhhbGZILCBmdWxsICsgMSwgOCwgOCwgMTYsIDkpOyAgICAgICAgICBcCisgICAgT1BOQU1FICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzcyhkc3QsIGhhbGZILCBzdHJpZGUsIDgpOyAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDhfbWMyMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFs3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIHNyYywgOCwgc3RyaWRlLCA5KTsgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzcyhkc3QsIGhhbGZILCBzdHJpZGUsIDgpOyAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMTBfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmWzI1Nl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGYsIHNyYywgMTYsIHN0cmlkZSwgMTYpOyAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBzcmMsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCAxNiwgMTYpOyAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMjBfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3MoZHN0LCBzcmMsIHN0cmlkZSwgc3RyaWRlLCAxNik7ICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMzBfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmWzI1Nl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGYsIHNyYywgMTYsIHN0cmlkZSwgMTYpOyAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBzcmMgKyAxLCBoYWxmLCBzdHJpZGUsIHN0cmlkZSwgMTYsIDE2KTsgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMDFfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmWzI1Nl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGYsIGZ1bGwsIDE2LCAyNCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBmdWxsLCBoYWxmLCBzdHJpZGUsIDI0LCAxNiwgMTYpOyAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMDJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3MoZHN0LCBmdWxsLCBzdHJpZGUsIDI0KTsgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMDNfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmWzI1Nl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGYsIGZ1bGwsIDE2LCAyNCk7ICAgICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBmdWxsICsgMjQsIGhhbGYsIHN0cmlkZSwgMjQsIDE2LCAxNik7ICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDE2X21jMTFfb2xkX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVlsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZWLCBmdWxsLCAxNiwgMjQpOyAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2w0XzgoZHN0LCBmdWxsLCBoYWxmSCwgaGFsZlYsIGhhbGZIViwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAyNCwgMTYsIDE2LCAxNiwgMTYpOyAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMTFfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHMxNl9sMl84KGhhbGZILCBoYWxmSCwgZnVsbCwgMTYsIDE2LCAyNCwgMTcpOyAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBoYWxmSCwgaGFsZkhWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOyAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDE2X21jMzFfb2xkX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVlsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZWLCBmdWxsICsgMSwgMTYsIDI0KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2w0XzgoZHN0LCBmdWxsICsgMSwgaGFsZkgsIGhhbGZWLCBoYWxmSFYsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAyNCwgMTYsIDE2LCAxNiwgMTYpOyAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMzFfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHMxNl9sMl84KGhhbGZILCBoYWxmSCwgZnVsbCArIDEsIDE2LCAxNiwgMjQsIDE3KTsgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBoYWxmSCwgaGFsZkhWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOyAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDE2X21jMTNfb2xkX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVlsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZWLCBmdWxsLCAxNiwgMjQpOyAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2w0XzgoZHN0LCBmdWxsICsgMjQsIGhhbGZIICsgMTYsIGhhbGZWLCBoYWxmSFYsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAyNCwgMTYsIDE2LCAxNiwgMTYpOyAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMTNfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHMxNl9sMl84KGhhbGZILCBoYWxmSCwgZnVsbCwgMTYsIDE2LCAyNCwgMTcpOyAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBoYWxmSCArIDE2LCBoYWxmSFYsIHN0cmlkZSwgMTYsIDE2LCAxNik7ICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDE2X21jMzNfb2xkX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVlsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZWLCBmdWxsICsgMSwgMTYsIDI0KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2w0XzgoZHN0LCBmdWxsICsgMjUsIGhhbGZIICsgMTYsIGhhbGZWLCBoYWxmSFYsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAyNCwgMTYsIDE2LCAxNiwgMTYpOyAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMzNfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHMxNl9sMl84KGhhbGZILCBoYWxmSCwgZnVsbCArIDEsIDE2LCAxNiwgMjQsIDE3KTsgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBoYWxmSCArIDE2LCBoYWxmSFYsIHN0cmlkZSwgMTYsIDE2LCAxNik7ICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMjFfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBzcmMsIDE2LCBzdHJpZGUsIDE3KTsgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBoYWxmSCwgaGFsZkhWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOyAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMjNfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBzcmMsIDE2LCBzdHJpZGUsIDE3KTsgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBoYWxmSCArIDE2LCBoYWxmSFYsIHN0cmlkZSwgMTYsIDE2LCAxNik7ICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDE2X21jMTJfb2xkX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVlsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZWLCBmdWxsLCAxNiwgMjQpOyAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBoYWxmViwgaGFsZkhWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOyAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMTJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHMxNl9sMl84KGhhbGZILCBoYWxmSCwgZnVsbCwgMTYsIDE2LCAyNCwgMTcpOyAgICAgICAgICBcCisgICAgT1BOQU1FICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3MoZHN0LCBoYWxmSCwgc3RyaWRlLCAxNik7ICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgcXBlbDE2X21jMzJfb2xkX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmVlsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZWLCBmdWxsICsgMSwgMTYsIDI0KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkgsIDE2LCAxNik7ICAgICAgICAgICAgICBcCisgICAgT1BOQU1FICMjIHBpeGVsczE2X2wyXzgoZHN0LCBoYWxmViwgaGFsZkhWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOyAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMzJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBmdWxsWzI0ICogMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9ibG9jazE3KGZ1bGwsIHNyYywgMjQsIHN0cmlkZSwgMTcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBmdWxsLCAxNiwgMjQsIDE3KTsgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBwaXhlbHMxNl9sMl84KGhhbGZILCBoYWxmSCwgZnVsbCArIDEsIDE2LCAxNiwgMjQsIDE3KTsgICAgICBcCisgICAgT1BOQU1FICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3MoZHN0LCBoYWxmSCwgc3RyaWRlLCAxNik7ICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcXBlbDE2X21jMjJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBoYWxmSFsyNzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0ICMjIFJORCAjIyBtcGVnNF9xcGVsMTZfaF9sb3dwYXNzKGhhbGZILCBzcmMsIDE2LCBzdHJpZGUsIDE3KTsgICAgICAgICBcCisgICAgT1BOQU1FICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3MoZHN0LCBoYWxmSCwgc3RyaWRlLCAxNik7ICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgb3BfYXZnKGEsIGIpICAgICAgICBhID0gKCgoYSkgKyBjbVsoKGIpICsgMTYpID4+IDVdICsgMSkgPj4gMSkKKyNkZWZpbmUgb3BfcHV0KGEsIGIpICAgICAgICBhID0gY21bKChiKSArIDE2KSA+PiA1XQorI2RlZmluZSBvcF9wdXRfbm9fcm5kKGEsIGIpIGEgPSBjbVsoKGIpICsgMTUpID4+IDVdCisKK1FQRUxfTUMoMCwgcHV0XywgXywgb3BfcHV0KQorUVBFTF9NQygxLCBwdXRfbm9fcm5kXywgX25vX3JuZF8sIG9wX3B1dF9ub19ybmQpCitRUEVMX01DKDAsIGF2Z18sIF8sIG9wX2F2ZykKKworI3VuZGVmIG9wX2F2ZworI3VuZGVmIG9wX3B1dAorI3VuZGVmIG9wX3B1dF9ub19ybmQKKwordm9pZCBmZl9wdXRfcGl4ZWxzOHg4X2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgcHV0X3BpeGVsczhfOF9jKGRzdCwgc3JjLCBzdHJpZGUsIDgpOworfQorCit2b2lkIGZmX2F2Z19waXhlbHM4eDhfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBhdmdfcGl4ZWxzOF84X2MoZHN0LCBzcmMsIHN0cmlkZSwgOCk7Cit9CisKK3ZvaWQgZmZfcHV0X3BpeGVsczE2eDE2X2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgcHV0X3BpeGVsczE2XzhfYyhkc3QsIHNyYywgc3RyaWRlLCAxNik7Cit9CisKK3ZvaWQgZmZfYXZnX3BpeGVsczE2eDE2X2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgYXZnX3BpeGVsczE2XzhfYyhkc3QsIHNyYywgc3RyaWRlLCAxNik7Cit9CisKKyNkZWZpbmUgcHV0X3FwZWw4X21jMDBfYyAgICAgICAgIGZmX3B1dF9waXhlbHM4eDhfYworI2RlZmluZSBhdmdfcXBlbDhfbWMwMF9jICAgICAgICAgZmZfYXZnX3BpeGVsczh4OF9jCisjZGVmaW5lIHB1dF9xcGVsMTZfbWMwMF9jICAgICAgICBmZl9wdXRfcGl4ZWxzMTZ4MTZfYworI2RlZmluZSBhdmdfcXBlbDE2X21jMDBfYyAgICAgICAgZmZfYXZnX3BpeGVsczE2eDE2X2MKKyNkZWZpbmUgcHV0X25vX3JuZF9xcGVsOF9tYzAwX2MgIGZmX3B1dF9waXhlbHM4eDhfYworI2RlZmluZSBwdXRfbm9fcm5kX3FwZWwxNl9tYzAwX2MgZmZfcHV0X3BpeGVsczE2eDE2X2MKKwordm9pZCBmZl9wdXRfcGl4ZWxzOF9sMl84KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSwgaW50IHNyY19zdHJpZGUxLCBpbnQgc3JjX3N0cmlkZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpCit7CisgICAgcHV0X3BpeGVsczhfbDJfOChkc3QsIHNyYzEsIHNyYzIsIGRzdF9zdHJpZGUsIHNyY19zdHJpZGUxLCBzcmNfc3RyaWRlMiwgaCk7CisKK30KKworI2lmIENPTkZJR19ESVJBQ19ERUNPREVSCisjZGVmaW5lIERJUkFDX01DKE9QTkFNRSlcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgX2RpcmFjX3BpeGVsczhfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSwgaW50IGgpXAore1wKKyAgICAgT1BOQU1FICMjIF9waXhlbHM4XzhfYyhkc3QsIHNyY1swXSwgc3RyaWRlLCBoKTtcCit9XAordm9pZCBmZl8gIyMgT1BOQU1FICMjIF9kaXJhY19waXhlbHMxNl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWzVdLCBpbnQgc3RyaWRlLCBpbnQgaClcCit7XAorICAgIE9QTkFNRSAjIyBfcGl4ZWxzMTZfOF9jKGRzdCwgc3JjWzBdLCBzdHJpZGUsIGgpO1wKK31cCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgX2RpcmFjX3BpeGVsczMyX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNV0sIGludCBzdHJpZGUsIGludCBoKVwKK3tcCisgICAgT1BOQU1FICMjIF9waXhlbHMxNl84X2MoZHN0ICAgLCBzcmNbMF0gICAsIHN0cmlkZSwgaCk7XAorICAgIE9QTkFNRSAjIyBfcGl4ZWxzMTZfOF9jKGRzdCsxNiwgc3JjWzBdKzE2LCBzdHJpZGUsIGgpO1wKK31cCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgX2RpcmFjX3BpeGVsczhfbDJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSwgaW50IGgpXAore1wKKyAgICBPUE5BTUUgIyMgX3BpeGVsczhfbDJfOChkc3QsIHNyY1swXSwgc3JjWzFdLCBzdHJpZGUsIHN0cmlkZSwgc3RyaWRlLCBoKTtcCit9XAordm9pZCBmZl8gIyMgT1BOQU1FICMjIF9kaXJhY19waXhlbHMxNl9sMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWzVdLCBpbnQgc3RyaWRlLCBpbnQgaClcCit7XAorICAgIE9QTkFNRSAjIyBfcGl4ZWxzMTZfbDJfOChkc3QsIHNyY1swXSwgc3JjWzFdLCBzdHJpZGUsIHN0cmlkZSwgc3RyaWRlLCBoKTtcCit9XAordm9pZCBmZl8gIyMgT1BOQU1FICMjIF9kaXJhY19waXhlbHMzMl9sMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWzVdLCBpbnQgc3RyaWRlLCBpbnQgaClcCit7XAorICAgIE9QTkFNRSAjIyBfcGl4ZWxzMTZfbDJfOChkc3QgICAsIHNyY1swXSAgICwgc3JjWzFdICAgLCBzdHJpZGUsIHN0cmlkZSwgc3RyaWRlLCBoKTtcCisgICAgT1BOQU1FICMjIF9waXhlbHMxNl9sMl84KGRzdCsxNiwgc3JjWzBdKzE2LCBzcmNbMV0rMTYsIHN0cmlkZSwgc3RyaWRlLCBzdHJpZGUsIGgpO1wKK31cCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgX2RpcmFjX3BpeGVsczhfbDRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSwgaW50IGgpXAore1wKKyAgICBPUE5BTUUgIyMgX3BpeGVsczhfbDRfOChkc3QsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSwgc3RyaWRlLCBzdHJpZGUsIHN0cmlkZSwgc3RyaWRlLCBzdHJpZGUsIGgpO1wKK31cCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgX2RpcmFjX3BpeGVsczE2X2w0X2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNV0sIGludCBzdHJpZGUsIGludCBoKVwKK3tcCisgICAgT1BOQU1FICMjIF9waXhlbHMxNl9sNF84KGRzdCwgc3JjWzBdLCBzcmNbMV0sIHNyY1syXSwgc3JjWzNdLCBzdHJpZGUsIHN0cmlkZSwgc3RyaWRlLCBzdHJpZGUsIHN0cmlkZSwgaCk7XAorfVwKK3ZvaWQgZmZfICMjIE9QTkFNRSAjIyBfZGlyYWNfcGl4ZWxzMzJfbDRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSwgaW50IGgpXAore1wKKyAgICBPUE5BTUUgIyMgX3BpeGVsczE2X2w0XzgoZHN0ICAgLCBzcmNbMF0gICAsIHNyY1sxXSAgICwgc3JjWzJdICAgLCBzcmNbM10gICAsIHN0cmlkZSwgc3RyaWRlLCBzdHJpZGUsIHN0cmlkZSwgc3RyaWRlLCBoKTtcCisgICAgT1BOQU1FICMjIF9waXhlbHMxNl9sNF84KGRzdCsxNiwgc3JjWzBdKzE2LCBzcmNbMV0rMTYsIHNyY1syXSsxNiwgc3JjWzNdKzE2LCBzdHJpZGUsIHN0cmlkZSwgc3RyaWRlLCBzdHJpZGUsIHN0cmlkZSwgaCk7XAorfQorRElSQUNfTUMocHV0KQorRElSQUNfTUMoYXZnKQorI2VuZGlmCisKK2F2X2NvbGQgdm9pZCBmZl9xcGVsZHNwX2luaXQoUXBlbERTUENvbnRleHQgKmMpCit7CisjZGVmaW5lIGRzcGZ1bmMoUEZYLCBJRFgsIE5VTSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMF0gID0gUEZYICMjIE5VTSAjIyBfbWMwMF9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMV0gID0gUEZYICMjIE5VTSAjIyBfbWMxMF9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMl0gID0gUEZYICMjIE5VTSAjIyBfbWMyMF9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bM10gID0gUEZYICMjIE5VTSAjIyBfbWMzMF9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bNF0gID0gUEZYICMjIE5VTSAjIyBfbWMwMV9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bNV0gID0gUEZYICMjIE5VTSAjIyBfbWMxMV9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bNl0gID0gUEZYICMjIE5VTSAjIyBfbWMyMV9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bN10gID0gUEZYICMjIE5VTSAjIyBfbWMzMV9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bOF0gID0gUEZYICMjIE5VTSAjIyBfbWMwMl9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bOV0gID0gUEZYICMjIE5VTSAjIyBfbWMxMl9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTBdID0gUEZYICMjIE5VTSAjIyBfbWMyMl9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTFdID0gUEZYICMjIE5VTSAjIyBfbWMzMl9jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTJdID0gUEZYICMjIE5VTSAjIyBfbWMwM19jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTNdID0gUEZYICMjIE5VTSAjIyBfbWMxM19jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTRdID0gUEZYICMjIE5VTSAjIyBfbWMyM19jOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTVdID0gUEZYICMjIE5VTSAjIyBfbWMzM19jCisKKyAgICBkc3BmdW5jKHB1dF9xcGVsLCAwLCAxNik7CisgICAgZHNwZnVuYyhwdXRfcXBlbCwgMSwgOCk7CisKKyAgICBkc3BmdW5jKHB1dF9ub19ybmRfcXBlbCwgMCwgMTYpOworICAgIGRzcGZ1bmMocHV0X25vX3JuZF9xcGVsLCAxLCA4KTsKKworICAgIGRzcGZ1bmMoYXZnX3FwZWwsIDAsIDE2KTsKKyAgICBkc3BmdW5jKGF2Z19xcGVsLCAxLCA4KTsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfcXBlbGRzcF9pbml0X3g4NihjKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3FwZWxkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3FwZWxkc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTE0MjBhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcXBlbGRzcC5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBxdWFydGVycGVsIERTUCBmdW5jdGlvbnMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogcXVhcnRlcnBlbCBEU1AgZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1FQRUxEU1BfSAorI2RlZmluZSBBVkNPREVDX1FQRUxEU1BfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3ZvaWQgZmZfcHV0X3BpeGVsczh4OF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczh4OF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczE2eDE2X2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9hdmdfcGl4ZWxzMTZ4MTZfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSk7CisKK3ZvaWQgZmZfcHV0X3BpeGVsczhfbDJfOCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKTsKKworI2RlZmluZSBERUZfT0xEX1FQRUwobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9wdXRfICAgICAgICAjIyBuYW1lKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiB3aWR0aCAoOCBvciAxNikgKi8sICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9wdXRfbm9fcm5kXyAjIyBuYW1lKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiB3aWR0aCAoOCBvciAxNikgKi8sICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9hdmdfICAgICAgICAjIyBuYW1lKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiB3aWR0aCAoOCBvciAxNikgKi8sICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOworCitERUZfT0xEX1FQRUwocXBlbDE2X21jMTFfb2xkX2MpCitERUZfT0xEX1FQRUwocXBlbDE2X21jMzFfb2xkX2MpCitERUZfT0xEX1FQRUwocXBlbDE2X21jMTJfb2xkX2MpCitERUZfT0xEX1FQRUwocXBlbDE2X21jMzJfb2xkX2MpCitERUZfT0xEX1FQRUwocXBlbDE2X21jMTNfb2xkX2MpCitERUZfT0xEX1FQRUwocXBlbDE2X21jMzNfb2xkX2MpCitERUZfT0xEX1FQRUwocXBlbDhfbWMxMV9vbGRfYykKK0RFRl9PTERfUVBFTChxcGVsOF9tYzMxX29sZF9jKQorREVGX09MRF9RUEVMKHFwZWw4X21jMTJfb2xkX2MpCitERUZfT0xEX1FQRUwocXBlbDhfbWMzMl9vbGRfYykKK0RFRl9PTERfUVBFTChxcGVsOF9tYzEzX29sZF9jKQorREVGX09MRF9RUEVMKHFwZWw4X21jMzNfb2xkX2MpCisKK3R5cGVkZWYgdm9pZCAoKnFwZWxfbWNfZnVuYykodWludDhfdCAqZHN0IC8qIGFsaWduIHdpZHRoICg4IG9yIDE2KSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjIC8qIGFsaWduIDEgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOworCisvKioKKyAqIHF1YXJ0ZXJwZWwgRFNQIGNvbnRleHQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUXBlbERTUENvbnRleHQgeworICAgIHFwZWxfbWNfZnVuYyBwdXRfcXBlbF9waXhlbHNfdGFiWzJdWzE2XTsKKyAgICBxcGVsX21jX2Z1bmMgYXZnX3FwZWxfcGl4ZWxzX3RhYlsyXVsxNl07CisgICAgcXBlbF9tY19mdW5jIHB1dF9ub19ybmRfcXBlbF9waXhlbHNfdGFiWzJdWzE2XTsKK30gUXBlbERTUENvbnRleHQ7CisKK3ZvaWQgZmZfcXBlbGRzcF9pbml0KFFwZWxEU1BDb250ZXh0ICpjKTsKKwordm9pZCBmZl9xcGVsZHNwX2luaXRfeDg2KFFwZWxEU1BDb250ZXh0ICpjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUVBFTERTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9xdHJsZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcXRybGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzY3NjQzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcXRybGUuYwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIFF1aWNrdGltZSBBbmltYXRpb24gKFJMRSkgVmlkZW8gRGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBRVCBSTEUgVmlkZW8gRGVjb2RlciBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFFUIFJMRSBmb3JtYXQsIHZpc2l0OgorICogICBodHRwOi8vd3d3LnBjaXN5cy5uZXQvfm1lbGFuc29uL2NvZGVjcy8KKyAqCisgKiBUaGUgUVQgUkxFIGRlY29kZXIgaGFzIHNldmVuIG1vZGVzIG9mIG9wZXJhdGlvbjoKKyAqIDEsIDIsIDQsIDgsIDE2LCAyNCwgYW5kIDMyIGJpdHMgcGVyIHBpeGVsLiBGb3IgbW9kZXMgMSwgMiwgNCwgYW5kIDgKKyAqIHRoZSBkZWNvZGVyIG91dHB1dHMgUEFMOCBjb2xvcnNwYWNlIGRhdGEuIDE2LWJpdCBkYXRhIHlpZWxkcyBSR0I1NTUKKyAqIGRhdGEuIDI0LWJpdCBkYXRhIGlzIFJHQjI0IGFuZCAzMi1iaXQgZGF0YSBpcyBSR0IzMi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUXRybGVDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAqZnJhbWU7CisKKyAgICBHZXRCeXRlQ29udGV4dCBnOworICAgIHVpbnQzMl90IHBhbFsyNTZdOworfSBRdHJsZUNvbnRleHQ7CisKKyNkZWZpbmUgQ0hFQ0tfUElYRUxfUFRSKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgocGl4ZWxfcHRyICsgbiA+IHBpeGVsX2xpbWl0KSB8fCAocGl4ZWxfcHRyICsgbiA8IDApKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyAocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlByb2JsZW06IHBpeGVsX3B0ciA9ICVkLCBwaXhlbF9saW1pdCA9ICVkXG4iLFwKKyAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKyBuLCBwaXhlbF9saW1pdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworc3RhdGljIHZvaWQgcXRybGVfZGVjb2RlXzFicHAoUXRybGVDb250ZXh0ICpzLCBpbnQgcm93X3B0ciwgaW50IGxpbmVzX3RvX2NoYW5nZSkKK3sKKyAgICBpbnQgcmxlX2NvZGU7CisgICAgaW50IHBpeGVsX3B0cjsKKyAgICBpbnQgcm93X2luYyA9IHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB1aW50OF90IHBpMCwgcGkxOyAgLyogMiA4LXBpeGVsIHZhbHVlcyAqLworICAgIHVpbnQ4X3QgKnJnYiA9IHMtPmZyYW1lLT5kYXRhWzBdOworICAgIGludCBwaXhlbF9saW1pdCA9IHMtPmZyYW1lLT5saW5lc2l6ZVswXSAqIHMtPmF2Y3R4LT5oZWlnaHQ7CisgICAgaW50IHNraXA7CisgICAgLyogc2tpcCAmIDB4ODAgYXBwZWFycyB0byBtZWFuICdzdGFydCBhIG5ldyBsaW5lJywgd2hpY2ggY2FuIGJlIGludGVycHJldGVkCisgICAgICogYXMgJ2dvIHRvIG5leHQgbGluZScgZHVyaW5nIHRoZSBkZWNvZGluZyBvZiBhIGZyYW1lIGJ1dCBpcyAnZ28gdG8gZmlyc3QKKyAgICAgKiBsaW5lJyBhdCB0aGUgYmVnaW5uaW5nLiBTaW5jZSB3ZSBhbHdheXMgaW50ZXJwcmV0IGl0IGFzICdnbyB0byBuZXh0IGxpbmUnCisgICAgICogaW4gdGhlIGRlY29kaW5nIGxvb3AgKHdoaWNoIG1ha2VzIGNvZGUgc2ltcGxlci9mYXN0ZXIpLCB0aGUgZmlyc3QgbGluZQorICAgICAqIHdvdWxkIG5vdCBiZSBjb3VudGVkLCBzbyB3ZSBjb3VudCBvbmUgbW9yZS4KKyAgICAgKiBTZWU6IGh0dHBzOi8vdHJhYy5mZm1wZWcub3JnL3RpY2tldC8yMjYKKyAgICAgKiBJbiB0aGUgZm9sbG93aW5nIGRlY29kaW5nIGxvb3AsIHJvd19wdHIgd2lsbCBiZSB0aGUgcG9zaXRpb24gb2YgdGhlCisgICAgICogY3VycmVudCByb3cuICovCisKKyAgICByb3dfcHRyICAtPSByb3dfaW5jOworICAgIHBpeGVsX3B0ciA9IHJvd19wdHI7CisgICAgbGluZXNfdG9fY2hhbmdlKys7CisgICAgd2hpbGUgKGxpbmVzX3RvX2NoYW5nZSkgeworICAgICAgICBza2lwICAgICA9ICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7CisgICAgICAgIHJsZV9jb2RlID0gKGludDhfdClieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7CisgICAgICAgIGlmIChybGVfY29kZSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKHNraXAgJiAweDgwKSB7CisgICAgICAgICAgICBsaW5lc190b19jaGFuZ2UtLTsKKyAgICAgICAgICAgIHJvd19wdHIgKz0gcm93X2luYzsKKyAgICAgICAgICAgIHBpeGVsX3B0ciA9IHJvd19wdHIgKyAyICogKHNraXAgJiAweDdmKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwaXhlbF9wdHIgKz0gMiAqIHNraXA7CisgICAgICAgIENIRUNLX1BJWEVMX1BUUigwKTsgIC8qIG1ha2Ugc3VyZSBwaXhlbF9wdHIgaXMgcG9zaXRpdmUgKi8KKworICAgICAgICBpZihybGVfY29kZSA9PSAtMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChybGVfY29kZSA8IDApIHsKKyAgICAgICAgICAgIC8qIGRlY29kZSB0aGUgcnVuIGxlbmd0aCBjb2RlICovCisgICAgICAgICAgICBybGVfY29kZSA9IC1ybGVfY29kZTsKKyAgICAgICAgICAgIC8qIGdldCB0aGUgbmV4dCAyIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSwgdHJlYXQgdGhlbSBhcyBncm91cHMKKyAgICAgICAgICAgICAqIG9mIDggcGl4ZWxzLCBhbmQgb3V0cHV0IHRoZW0gcmxlX2NvZGUgdGltZXMgKi8KKworICAgICAgICAgICAgcGkwID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpOworICAgICAgICAgICAgcGkxID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpOworICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKHJsZV9jb2RlICogMik7CisKKyAgICAgICAgICAgIHdoaWxlIChybGVfY29kZS0tKSB7CisgICAgICAgICAgICAgICAgcmdiW3BpeGVsX3B0cisrXSA9IHBpMDsKKyAgICAgICAgICAgICAgICByZ2JbcGl4ZWxfcHRyKytdID0gcGkxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogY29weSB0aGUgc2FtZSBwaXhlbCBkaXJlY3RseSB0byBvdXRwdXQgMiB0aW1lcyAqLworICAgICAgICAgICAgcmxlX2NvZGUgKj0gMjsKKyAgICAgICAgICAgIENIRUNLX1BJWEVMX1BUUihybGVfY29kZSk7CisKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJnMtPmcsICZyZ2JbcGl4ZWxfcHRyXSwgcmxlX2NvZGUpOworICAgICAgICAgICAgcGl4ZWxfcHRyICs9IHJsZV9jb2RlOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcXRybGVfZGVjb2RlXzJuNGJwcChRdHJsZUNvbnRleHQgKnMsIGludCByb3dfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzX3RvX2NoYW5nZSwgaW50IGJwcCkKK3sKKyAgICBpbnQgcmxlX2NvZGUsIGk7CisgICAgaW50IHBpeGVsX3B0cjsKKyAgICBpbnQgcm93X2luYyA9IHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB1aW50OF90IHBpWzE2XTsgIC8qIDE2IHBhbGV0dGUgaW5kaWNlcyAqLworICAgIHVpbnQ4X3QgKnJnYiA9IHMtPmZyYW1lLT5kYXRhWzBdOworICAgIGludCBwaXhlbF9saW1pdCA9IHMtPmZyYW1lLT5saW5lc2l6ZVswXSAqIHMtPmF2Y3R4LT5oZWlnaHQ7CisgICAgaW50IG51bV9waXhlbHMgPSAoYnBwID09IDQpID8gOCA6IDE2OworCisgICAgd2hpbGUgKGxpbmVzX3RvX2NoYW5nZS0tKSB7CisgICAgICAgIHBpeGVsX3B0ciA9IHJvd19wdHIgKyAobnVtX3BpeGVscyAqIChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+ZykgLSAxKSk7CisgICAgICAgIENIRUNLX1BJWEVMX1BUUigwKTsKKworICAgICAgICB3aGlsZSAoKHJsZV9jb2RlID0gKGludDhfdClieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+ZykpICE9IC0xKSB7CisgICAgICAgICAgICBpZiAocmxlX2NvZGUgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIHRoZXJlJ3MgYW5vdGhlciBza2lwIGNvZGUgaW4gdGhlIHN0cmVhbSAqLworICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAobnVtX3BpeGVscyAqIChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+ZykgLSAxKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKDApOyAgLyogbWFrZSBzdXJlIHBpeGVsX3B0ciBpcyBwb3NpdGl2ZSAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChybGVfY29kZSA8IDApIHsKKyAgICAgICAgICAgICAgICAvKiBkZWNvZGUgdGhlIHJ1biBsZW5ndGggY29kZSAqLworICAgICAgICAgICAgICAgIHJsZV9jb2RlID0gLXJsZV9jb2RlOworICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgbmV4dCA0IGJ5dGVzIGZyb20gdGhlIHN0cmVhbSwgdHJlYXQgdGhlbSBhcyBwYWxldHRlCisgICAgICAgICAgICAgICAgICogaW5kZXhlcywgYW5kIG91dHB1dCB0aGVtIHJsZV9jb2RlIHRpbWVzICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gbnVtX3BpeGVscy0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBwaVtudW1fcGl4ZWxzLTEtaV0gPSAoYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZzLT5nKSA+PiAoKGkqYnBwKSAmIDB4MDcpKSAmICgoMTw8YnBwKS0xKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+ZywgKChpICYgKChudW1fcGl4ZWxzPj4yKS0xKSkgPT0gMCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIocmxlX2NvZGUgKiBudW1fcGl4ZWxzKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAocmxlX2NvZGUtLSkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnJnYltwaXhlbF9wdHJdLCAmcGksIG51bV9waXhlbHMpOworICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gbnVtX3BpeGVsczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHNhbWUgcGl4ZWwgZGlyZWN0bHkgdG8gb3V0cHV0IDQgdGltZXMgKi8KKyAgICAgICAgICAgICAgICBybGVfY29kZSAqPSA0OworICAgICAgICAgICAgICAgIENIRUNLX1BJWEVMX1BUUihybGVfY29kZSoobnVtX3BpeGVscz4+MikpOworICAgICAgICAgICAgICAgIHdoaWxlIChybGVfY29kZS0tKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGJwcCA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJnYltwaXhlbF9wdHIrK10gPSAoeCA+PiA0KSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgICAgICByZ2JbcGl4ZWxfcHRyKytdID0gIHggICAgICAgJiAweDBmOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZ2JbcGl4ZWxfcHRyKytdID0gKHggPj4gNikgJiAweDAzOworICAgICAgICAgICAgICAgICAgICAgICAgcmdiW3BpeGVsX3B0cisrXSA9ICh4ID4+IDQpICYgMHgwMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJnYltwaXhlbF9wdHIrK10gPSAoeCA+PiAyKSAmIDB4MDM7CisgICAgICAgICAgICAgICAgICAgICAgICByZ2JbcGl4ZWxfcHRyKytdID0gIHggICAgICAgJiAweDAzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJvd19wdHIgKz0gcm93X2luYzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHF0cmxlX2RlY29kZV84YnBwKFF0cmxlQ29udGV4dCAqcywgaW50IHJvd19wdHIsIGludCBsaW5lc190b19jaGFuZ2UpCit7CisgICAgaW50IHJsZV9jb2RlOworICAgIGludCBwaXhlbF9wdHI7CisgICAgaW50IHJvd19pbmMgPSBzLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgdWludDhfdCBwaTEsIHBpMiwgcGkzLCBwaTQ7ICAvKiA0IHBhbGV0dGUgaW5kZXhlcyAqLworICAgIHVpbnQ4X3QgKnJnYiA9IHMtPmZyYW1lLT5kYXRhWzBdOworICAgIGludCBwaXhlbF9saW1pdCA9IHMtPmZyYW1lLT5saW5lc2l6ZVswXSAqIHMtPmF2Y3R4LT5oZWlnaHQ7CisKKyAgICB3aGlsZSAobGluZXNfdG9fY2hhbmdlLS0pIHsKKyAgICAgICAgcGl4ZWxfcHRyID0gcm93X3B0ciArICg0ICogKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKSAtIDEpKTsKKyAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKDApOworCisgICAgICAgIHdoaWxlICgocmxlX2NvZGUgPSAoaW50OF90KWJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChybGVfY29kZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogdGhlcmUncyBhbm90aGVyIHNraXAgY29kZSBpbiB0aGUgc3RyZWFtICovCisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9ICg0ICogKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKSAtIDEpKTsKKyAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoMCk7ICAvKiBtYWtlIHN1cmUgcGl4ZWxfcHRyIGlzIHBvc2l0aXZlICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKHJsZV9jb2RlIDwgMCkgeworICAgICAgICAgICAgICAgIC8qIGRlY29kZSB0aGUgcnVuIGxlbmd0aCBjb2RlICovCisgICAgICAgICAgICAgICAgcmxlX2NvZGUgPSAtcmxlX2NvZGU7CisgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBuZXh0IDQgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCB0cmVhdCB0aGVtIGFzIHBhbGV0dGUKKyAgICAgICAgICAgICAgICAgKiBpbmRleGVzLCBhbmQgb3V0cHV0IHRoZW0gcmxlX2NvZGUgdGltZXMgKi8KKyAgICAgICAgICAgICAgICBwaTEgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7CisgICAgICAgICAgICAgICAgcGkyID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpOworICAgICAgICAgICAgICAgIHBpMyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKTsKKyAgICAgICAgICAgICAgICBwaTQgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7CisKKyAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIocmxlX2NvZGUgKiA0KTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChybGVfY29kZS0tKSB7CisgICAgICAgICAgICAgICAgICAgIHJnYltwaXhlbF9wdHIrK10gPSBwaTE7CisgICAgICAgICAgICAgICAgICAgIHJnYltwaXhlbF9wdHIrK10gPSBwaTI7CisgICAgICAgICAgICAgICAgICAgIHJnYltwaXhlbF9wdHIrK10gPSBwaTM7CisgICAgICAgICAgICAgICAgICAgIHJnYltwaXhlbF9wdHIrK10gPSBwaTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSBzYW1lIHBpeGVsIGRpcmVjdGx5IHRvIG91dHB1dCA0IHRpbWVzICovCisgICAgICAgICAgICAgICAgcmxlX2NvZGUgKj0gNDsKKyAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIocmxlX2NvZGUpOworCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcy0+ZywgJnJnYltwaXhlbF9wdHJdLCBybGVfY29kZSk7CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IHJsZV9jb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJvd19wdHIgKz0gcm93X2luYzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHF0cmxlX2RlY29kZV8xNmJwcChRdHJsZUNvbnRleHQgKnMsIGludCByb3dfcHRyLCBpbnQgbGluZXNfdG9fY2hhbmdlKQoreworICAgIGludCBybGVfY29kZTsKKyAgICBpbnQgcGl4ZWxfcHRyOworICAgIGludCByb3dfaW5jID0gcy0+ZnJhbWUtPmxpbmVzaXplWzBdOworICAgIHVpbnQxNl90IHJnYjE2OworICAgIHVpbnQ4X3QgKnJnYiA9IHMtPmZyYW1lLT5kYXRhWzBdOworICAgIGludCBwaXhlbF9saW1pdCA9IHMtPmZyYW1lLT5saW5lc2l6ZVswXSAqIHMtPmF2Y3R4LT5oZWlnaHQ7CisKKyAgICB3aGlsZSAobGluZXNfdG9fY2hhbmdlLS0pIHsKKyAgICAgICAgcGl4ZWxfcHRyID0gcm93X3B0ciArIChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+ZykgLSAxKSAqIDI7CisgICAgICAgIENIRUNLX1BJWEVMX1BUUigwKTsKKworICAgICAgICB3aGlsZSAoKHJsZV9jb2RlID0gKGludDhfdClieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+ZykpICE9IC0xKSB7CisgICAgICAgICAgICBpZiAocmxlX2NvZGUgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIHRoZXJlJ3MgYW5vdGhlciBza2lwIGNvZGUgaW4gdGhlIHN0cmVhbSAqLworICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpIC0gMSkgKiAyOworICAgICAgICAgICAgICAgIENIRUNLX1BJWEVMX1BUUigwKTsgIC8qIG1ha2Ugc3VyZSBwaXhlbF9wdHIgaXMgcG9zaXRpdmUgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmxlX2NvZGUgPCAwKSB7CisgICAgICAgICAgICAgICAgLyogZGVjb2RlIHRoZSBydW4gbGVuZ3RoIGNvZGUgKi8KKyAgICAgICAgICAgICAgICBybGVfY29kZSA9IC1ybGVfY29kZTsKKyAgICAgICAgICAgICAgICByZ2IxNiA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZzLT5nKTsKKworICAgICAgICAgICAgICAgIENIRUNLX1BJWEVMX1BUUihybGVfY29kZSAqIDIpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHJsZV9jb2RlLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgKih1aW50MTZfdCAqKSgmcmdiW3BpeGVsX3B0cl0pID0gcmdiMTY7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKHJsZV9jb2RlICogMik7CisKKyAgICAgICAgICAgICAgICAvKiBjb3B5IHBpeGVscyBkaXJlY3RseSB0byBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAocmxlX2NvZGUtLSkgeworICAgICAgICAgICAgICAgICAgICByZ2IxNiA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZzLT5nKTsKKyAgICAgICAgICAgICAgICAgICAgKih1aW50MTZfdCAqKSgmcmdiW3BpeGVsX3B0cl0pID0gcmdiMTY7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByb3dfcHRyICs9IHJvd19pbmM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBxdHJsZV9kZWNvZGVfMjRicHAoUXRybGVDb250ZXh0ICpzLCBpbnQgcm93X3B0ciwgaW50IGxpbmVzX3RvX2NoYW5nZSkKK3sKKyAgICBpbnQgcmxlX2NvZGU7CisgICAgaW50IHBpeGVsX3B0cjsKKyAgICBpbnQgcm93X2luYyA9IHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB1aW50OF90IHIsIGcsIGI7CisgICAgdWludDhfdCAqcmdiID0gcy0+ZnJhbWUtPmRhdGFbMF07CisgICAgaW50IHBpeGVsX2xpbWl0ID0gcy0+ZnJhbWUtPmxpbmVzaXplWzBdICogcy0+YXZjdHgtPmhlaWdodDsKKworICAgIHdoaWxlIChsaW5lc190b19jaGFuZ2UtLSkgeworICAgICAgICBwaXhlbF9wdHIgPSByb3dfcHRyICsgKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKSAtIDEpICogMzsKKyAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKDApOworCisgICAgICAgIHdoaWxlICgocmxlX2NvZGUgPSAoaW50OF90KWJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChybGVfY29kZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogdGhlcmUncyBhbm90aGVyIHNraXAgY29kZSBpbiB0aGUgc3RyZWFtICovCisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+ZykgLSAxKSAqIDM7CisgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKDApOyAgLyogbWFrZSBzdXJlIHBpeGVsX3B0ciBpcyBwb3NpdGl2ZSAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChybGVfY29kZSA8IDApIHsKKyAgICAgICAgICAgICAgICAvKiBkZWNvZGUgdGhlIHJ1biBsZW5ndGggY29kZSAqLworICAgICAgICAgICAgICAgIHJsZV9jb2RlID0gLXJsZV9jb2RlOworICAgICAgICAgICAgICAgIHIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Zyk7CisgICAgICAgICAgICAgICAgZyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKTsKKyAgICAgICAgICAgICAgICBiID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpOworCisgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKHJsZV9jb2RlICogMyk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAocmxlX2NvZGUtLSkgeworICAgICAgICAgICAgICAgICAgICByZ2JbcGl4ZWxfcHRyKytdID0gcjsKKyAgICAgICAgICAgICAgICAgICAgcmdiW3BpeGVsX3B0cisrXSA9IGc7CisgICAgICAgICAgICAgICAgICAgIHJnYltwaXhlbF9wdHIrK10gPSBiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKHJsZV9jb2RlICogMyk7CisKKyAgICAgICAgICAgICAgICAvKiBjb3B5IHBpeGVscyBkaXJlY3RseSB0byBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAocmxlX2NvZGUtLSkgeworICAgICAgICAgICAgICAgICAgICByZ2JbcGl4ZWxfcHRyKytdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpOworICAgICAgICAgICAgICAgICAgICByZ2JbcGl4ZWxfcHRyKytdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpOworICAgICAgICAgICAgICAgICAgICByZ2JbcGl4ZWxfcHRyKytdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByb3dfcHRyICs9IHJvd19pbmM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBxdHJsZV9kZWNvZGVfMzJicHAoUXRybGVDb250ZXh0ICpzLCBpbnQgcm93X3B0ciwgaW50IGxpbmVzX3RvX2NoYW5nZSkKK3sKKyAgICBpbnQgcmxlX2NvZGU7CisgICAgaW50IHBpeGVsX3B0cjsKKyAgICBpbnQgcm93X2luYyA9IHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB1bnNpZ25lZCBpbnQgYXJnYjsKKyAgICB1aW50OF90ICpyZ2IgPSBzLT5mcmFtZS0+ZGF0YVswXTsKKyAgICBpbnQgcGl4ZWxfbGltaXQgPSBzLT5mcmFtZS0+bGluZXNpemVbMF0gKiBzLT5hdmN0eC0+aGVpZ2h0OworCisgICAgd2hpbGUgKGxpbmVzX3RvX2NoYW5nZS0tKSB7CisgICAgICAgIHBpeGVsX3B0ciA9IHJvd19wdHIgKyAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpIC0gMSkgKiA0OworICAgICAgICBDSEVDS19QSVhFTF9QVFIoMCk7CisKKyAgICAgICAgd2hpbGUgKChybGVfY29kZSA9IChpbnQ4X3QpYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpKSAhPSAtMSkgeworICAgICAgICAgICAgaWYgKHJsZV9jb2RlID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiB0aGVyZSdzIGFub3RoZXIgc2tpcCBjb2RlIGluIHRoZSBzdHJlYW0gKi8KKyAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKSAtIDEpICogNDsKKyAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoMCk7ICAvKiBtYWtlIHN1cmUgcGl4ZWxfcHRyIGlzIHBvc2l0aXZlICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKHJsZV9jb2RlIDwgMCkgeworICAgICAgICAgICAgICAgIC8qIGRlY29kZSB0aGUgcnVuIGxlbmd0aCBjb2RlICovCisgICAgICAgICAgICAgICAgcmxlX2NvZGUgPSAtcmxlX2NvZGU7CisgICAgICAgICAgICAgICAgYXJnYiA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nKTsKKworICAgICAgICAgICAgICAgIENIRUNLX1BJWEVMX1BUUihybGVfY29kZSAqIDQpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHJsZV9jb2RlLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEocmdiICsgcGl4ZWxfcHRyLCBhcmdiKTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIocmxlX2NvZGUgKiA0KTsKKworICAgICAgICAgICAgICAgIC8qIGNvcHkgcGl4ZWxzIGRpcmVjdGx5IHRvIG91dHB1dCAqLworICAgICAgICAgICAgICAgIHdoaWxlIChybGVfY29kZS0tKSB7CisgICAgICAgICAgICAgICAgICAgIGFyZ2IgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Zyk7CisgICAgICAgICAgICAgICAgICAgIEFWX1dOMzJBKHJnYiArIHBpeGVsX3B0ciwgYXJnYik7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciAgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcm93X3B0ciArPSByb3dfaW5jOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IHF0cmxlX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBRdHJsZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBzd2l0Y2ggKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpIHsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAzMzoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX01PTk9XSElURTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgY2FzZSA0OgorICAgIGNhc2UgODoKKyAgICBjYXNlIDM0OgorICAgIGNhc2UgMzY6CisgICAgY2FzZSA0MDoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAxNjoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU1NTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI0OgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAzMjoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjMyOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyAoYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvbG9yc3BhY2U6ICVkIGJpdHMvc2FtcGxlP1xuIiwKKyAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF0cmxlX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBRdHJsZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBoZWFkZXIsIHN0YXJ0X2xpbmU7CisgICAgaW50IGhlaWdodCwgcm93X3B0cjsKKyAgICBpbnQgaGFzX3BhbGV0dGUgPSAwOworICAgIGludCByZXQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZzLT5nLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGNoZWNrIGlmIHRoaXMgZnJhbWUgaXMgZXZlbiBzdXBwb3NlZCB0byBjaGFuZ2UgKi8KKyAgICBpZiAoYXZwa3QtPnNpemUgPCA4KQorICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAvKiBzdGFydCBhZnRlciB0aGUgY2h1bmsgc2l6ZSAqLworICAgIGJ5dGVzdHJlYW0yX3NlZWsoJnMtPmcsIDQsIFNFRUtfU0VUKTsKKworICAgIC8qIGZldGNoIHRoZSBoZWFkZXIgKi8KKyAgICBoZWFkZXIgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmcy0+Zyk7CisKKyAgICAvKiBpZiBhIGhlYWRlciBpcyBwcmVzZW50LCBmZXRjaCBhZGRpdGlvbmFsIGRlY29kaW5nIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoaGVhZGVyICYgMHgwMDA4KSB7CisgICAgICAgIGlmIChhdnBrdC0+c2l6ZSA8IDE0KQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICBzdGFydF9saW5lID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJnMtPmcpOworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nLCAyKTsKKyAgICAgICAgaGVpZ2h0ICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZzLT5nKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+ZywgMik7CisgICAgICAgIGlmIChoZWlnaHQgPiBzLT5hdmN0eC0+aGVpZ2h0IC0gc3RhcnRfbGluZSkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydF9saW5lID0gMDsKKyAgICAgICAgaGVpZ2h0ICAgICA9IHMtPmF2Y3R4LT5oZWlnaHQ7CisgICAgfQorICAgIHJvd19wdHIgPSBzLT5mcmFtZS0+bGluZXNpemVbMF0gKiBzdGFydF9saW5lOworCisgICAgc3dpdGNoIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMzM6CisgICAgICAgIHF0cmxlX2RlY29kZV8xYnBwKHMsIHJvd19wdHIsIGhlaWdodCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgIGNhc2UgMzQ6CisgICAgICAgIHF0cmxlX2RlY29kZV8ybjRicHAocywgcm93X3B0ciwgaGVpZ2h0LCAyKTsKKyAgICAgICAgaGFzX3BhbGV0dGUgPSAxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgNDoKKyAgICBjYXNlIDM2OgorICAgICAgICBxdHJsZV9kZWNvZGVfMm40YnBwKHMsIHJvd19wdHIsIGhlaWdodCwgNCk7CisgICAgICAgIGhhc19wYWxldHRlID0gMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDg6CisgICAgY2FzZSA0MDoKKyAgICAgICAgcXRybGVfZGVjb2RlXzhicHAocywgcm93X3B0ciwgaGVpZ2h0KTsKKyAgICAgICAgaGFzX3BhbGV0dGUgPSAxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMTY6CisgICAgICAgIHF0cmxlX2RlY29kZV8xNmJwcChzLCByb3dfcHRyLCBoZWlnaHQpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMjQ6CisgICAgICAgIHF0cmxlX2RlY29kZV8yNGJwcChzLCByb3dfcHRyLCBoZWlnaHQpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMzI6CisgICAgICAgIHF0cmxlX2RlY29kZV8zMmJwcChzLCByb3dfcHRyLCBoZWlnaHQpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyAocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvbG9yc3BhY2U6ICVkIGJpdHMvc2FtcGxlP1xuIiwKKyAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZihoYXNfcGFsZXR0ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgTlVMTCk7CisKKyAgICAgICAgaWYgKHBhbCkgeworICAgICAgICAgICAgcy0+ZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgICAgICAgICAgbWVtY3B5KHMtPnBhbCwgcGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBtYWtlIHRoZSBwYWxldHRlIGF2YWlsYWJsZSBvbiB0aGUgd2F5IG91dCAqLworICAgICAgICBtZW1jcHkocy0+ZnJhbWUtPmRhdGFbMV0sIHMtPnBhbCwgQVZQQUxFVFRFX1NJWkUpOworICAgIH0KKworZG9uZToKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAqZ290X2ZyYW1lICAgICAgPSAxOworCisgICAgLyogYWx3YXlzIHJlcG9ydCB0aGF0IHRoZSBidWZmZXIgd2FzIGNvbXBsZXRlbHkgY29uc3VtZWQgKi8KKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBxdHJsZV9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBRdHJsZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfcXRybGVfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicXRybGUiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJRdWlja1RpbWUgQW5pbWF0aW9uIChSTEUpIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1FUUkxFLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihRdHJsZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHF0cmxlX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHF0cmxlX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gcXRybGVfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcXRybGVlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3F0cmxlZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyMzE4OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3F0cmxlZW5jLmMKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiBRdWlja3RpbWUgQW5pbWF0aW9uIChSTEUpIFZpZGVvIEVuY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNyBDbGVtZW5zIEZydWh3aXJ0aAorICogQ29weXJpZ2h0IChDKSAyMDA3IEFsZXhpcyBCYWxsaWVyCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGZsYXNoc3ZlbmMuYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyoqIE1heGltdW0gUkxFIGNvZGUgZm9yIGJ1bGsgY29weSAqLworI2RlZmluZSBNQVhfUkxFX0JVTEsgICAxMjcKKy8qKiBNYXhpbXVtIFJMRSBjb2RlIGZvciByZXBlYXQgKi8KKyNkZWZpbmUgTUFYX1JMRV9SRVBFQVQgMTI4CisvKiogTWF4aW11bSBSTEUgY29kZSBmb3Igc2tpcCAqLworI2RlZmluZSBNQVhfUkxFX1NLSVAgICAyNTQKKwordHlwZWRlZiBzdHJ1Y3QgUXRybGVFbmNDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgaW50IHBpeGVsX3NpemU7CisgICAgQVZQaWN0dXJlIHByZXZpb3VzX2ZyYW1lOworICAgIHVuc2lnbmVkIGludCBtYXhfYnVmX3NpemU7CisgICAgaW50IGxvZ2ljYWxfd2lkdGg7CisgICAgLyoqCisgICAgICogVGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gYXQgaXRoIHBvc2l0aW9uIHRoZSB2YWx1ZSBvZiB0aGUgYmVzdCBSTEUgY29kZQorICAgICAqIGlmIHRoZSBsaW5lIHN0YXJ0ZWQgYXQgcGl4ZWwgaQorICAgICAqIFRoZXJlIGNhbiBiZSAzIHZhbHVlcyA6CisgICAgICogc2tpcCAoMCkgICAgIDogc2tpcCBhcyBtdWNoIGFzIHBvc3NpYmxlIHBpeGVscyBiZWNhdXNlIHRoZXkgYXJlIGVxdWFsIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHByZXZpb3VzIGZyYW1lIG9uZXMKKyAgICAgKiByZXBlYXQgKDwtMSkgOiByZXBlYXQgdGhhdCBwaXhlbCAtcmxlX2NvZGUgdGltZXMsIHN0aWxsIGFzIG11Y2ggYXMKKyAgICAgKiAgICAgICAgICAgICAgICBwb3NzaWJsZQorICAgICAqIGNvcHkgKD4wKSAgICA6IGNvcHkgdGhlIHJhdyBuZXh0IHJsZV9jb2RlIHBpeGVscyAqLworICAgIHNpZ25lZCBjaGFyICpybGVjb2RlX3RhYmxlOworICAgIC8qKgorICAgICAqIFRoaXMgYXJyYXkgd2lsbCBjb250YWluIHRoZSBsZW5ndGggb2YgdGhlIGJlc3QgcmxlIGVuY29kaW5nIG9mIHRoZSBsaW5lCisgICAgICogc3RhcnRpbmcgYXQgaXRoIHBpeGVsICovCisgICAgaW50ICpsZW5ndGhfdGFibGU7CisgICAgLyoqCisgICAgICogV2lsbCBjb250YWluIGF0IGl0aCBwb3NpdGlvbiB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHBpeGVscyBlcXVhbCB0byB0aGUgcHJldmlvdXMKKyAgICAgKiBmcmFtZSBzdGFydGluZyBmcm9tIHBpeGVsIGkgKi8KKyAgICB1aW50OF90KiBza2lwX3RhYmxlOworfSBRdHJsZUVuY0NvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBxdHJsZV9lbmNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBRdHJsZUVuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKworICAgIGF2cGljdHVyZV9mcmVlKCZzLT5wcmV2aW91c19mcmFtZSk7CisgICAgYXZfZnJlZShzLT5ybGVjb2RlX3RhYmxlKTsKKyAgICBhdl9mcmVlKHMtPmxlbmd0aF90YWJsZSk7CisgICAgYXZfZnJlZShzLT5za2lwX3RhYmxlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHF0cmxlX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBRdHJsZUVuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIDAsIGF2Y3R4KSA8IDApIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcy0+YXZjdHg9YXZjdHg7CisgICAgcy0+bG9naWNhbF93aWR0aD1hdmN0eC0+d2lkdGg7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5waXhfZm10KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgICAgICBpZiAoYXZjdHgtPndpZHRoICUgNCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJXaWR0aCBub3QgYmVpbmcgYSBtdWx0aXBsZSBvZiA0IGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBzLT5sb2dpY2FsX3dpZHRoID0gYXZjdHgtPndpZHRoIC8gNDsKKyAgICAgICAgcy0+cGl4ZWxfc2l6ZSA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NTVCRToKKyAgICAgICAgcy0+cGl4ZWxfc2l6ZSA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgcy0+cGl4ZWxfc2l6ZSA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9BUkdCOgorICAgICAgICBzLT5waXhlbF9zaXplID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjb2xvcnNwYWNlLlxuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HUkFZOCA/IDQwIDogcy0+cGl4ZWxfc2l6ZSo4OworCisgICAgcy0+cmxlY29kZV90YWJsZSA9IGF2X21hbGxvY3oocy0+bG9naWNhbF93aWR0aCk7CisgICAgcy0+c2tpcF90YWJsZSAgICA9IGF2X21hbGxvY3oocy0+bG9naWNhbF93aWR0aCk7CisgICAgcy0+bGVuZ3RoX3RhYmxlICA9IGF2X21hbGxvY3pfYXJyYXkocy0+bG9naWNhbF93aWR0aCArIDEsIHNpemVvZihpbnQpKTsKKyAgICBpZiAoIXMtPnNraXBfdGFibGUgfHwgIXMtPmxlbmd0aF90YWJsZSB8fCAhcy0+cmxlY29kZV90YWJsZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGlmICgocmV0ID0gYXZwaWN0dXJlX2FsbG9jKCZzLT5wcmV2aW91c19mcmFtZSwgYXZjdHgtPnBpeF9mbXQsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCkpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgcGljdHVyZVxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcy0+bWF4X2J1Zl9zaXplID0gcy0+bG9naWNhbF93aWR0aCpzLT5hdmN0eC0+aGVpZ2h0KnMtPnBpeGVsX3NpemUqMiAvKiBpbWFnZSBiYXNlIG1hdGVyaWFsICovCisgICAgICAgICAgICAgICAgICAgICAgKyAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyICsgZm9vdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgKyBzLT5hdmN0eC0+aGVpZ2h0KjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBjb2RlK3JsZSBlbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICArIHMtPmxvZ2ljYWxfd2lkdGgvTUFYX1JMRV9CVUxLICsgMSAgICAgICAgICAgICAvKiBybGUgY29kZXMgKi87CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKSB7CisgICAgICAgIHF0cmxlX2VuY29kZV9lbmQoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIENvbXB1dGUgdGhlIGJlc3QgUkxFIHNlcXVlbmNlIGZvciBhIGxpbmUKKyAqLworc3RhdGljIHZvaWQgcXRybGVfZW5jb2RlX2xpbmUoUXRybGVFbmNDb250ZXh0ICpzLCBjb25zdCBBVkZyYW1lICpwLCBpbnQgbGluZSwgdWludDhfdCAqKmJ1ZikKK3sKKyAgICBpbnQgd2lkdGg9cy0+bG9naWNhbF93aWR0aDsKKyAgICBpbnQgaTsKKyAgICBzaWduZWQgY2hhciBybGVjb2RlOworCisgICAgLyogVGhpcyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGVxdWFsIHRvIHRoZSBwcmVpdm91cyBmcmFtZSBvbmUncworICAgICAqIHN0YXJ0aW5nIGZyb20gdGhlIGl0aCBwaXhlbCAqLworICAgIHVuc2lnbmVkIGludCBza2lwY291bnQ7CisgICAgLyogVGhpcyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgZXF1YWwgcGl4ZWxzIGluIHRoZSBjdXJyZW50CisgICAgICogZnJhbWUsIHN0YXJ0aW5nIGZyb20gdGhlIGl0aCBvbmUgYWxzbyAqLworICAgIHVuc2lnbmVkIGludCBhdl91bmluaXQocmVwZWF0Y291bnQpOworCisgICAgLyogVGhlIGNvc3Qgb2YgdGhlIHRocmVlIGRpZmZlcmVudCBwb3NzaWJpbGl0aWVzICovCisgICAgaW50IHRvdGFsX3NraXBfY29zdDsKKyAgICBpbnQgdG90YWxfcmVwZWF0X2Nvc3Q7CisKKyAgICBpbnQgYmFzZV9idWxrX2Nvc3Q7CisgICAgaW50IGxvd2VzdF9idWxrX2Nvc3Q7CisgICAgaW50IGxvd2VzdF9idWxrX2Nvc3RfaW5kZXg7CisgICAgaW50IHNlY19sb3dlc3RfYnVsa19jb3N0OworICAgIGludCBzZWNfbG93ZXN0X2J1bGtfY29zdF9pbmRleDsKKworICAgIHVpbnQ4X3QgKnRoaXNfbGluZSA9IHAtPiAgICAgICAgICAgICAgIGRhdGFbMF0gKyBsaW5lKnAtPiAgICAgICAgICAgICAgIGxpbmVzaXplWzBdICsKKyAgICAgICAgKHdpZHRoIC0gMSkqcy0+cGl4ZWxfc2l6ZTsKKyAgICB1aW50OF90ICpwcmV2X2xpbmUgPSBzLT5wcmV2aW91c19mcmFtZS5kYXRhWzBdICsgbGluZSpzLT5wcmV2aW91c19mcmFtZS5saW5lc2l6ZVswXSArCisgICAgICAgICh3aWR0aCAtIDEpKnMtPnBpeGVsX3NpemU7CisKKyAgICBzLT5sZW5ndGhfdGFibGVbd2lkdGhdID0gMDsKKyAgICBza2lwY291bnQgPSAwOworCisgICAgLyogSW5pdGlhbCB2YWx1ZXMgKi8KKyAgICBsb3dlc3RfYnVsa19jb3N0ID0gSU5UX01BWCAvIDI7CisgICAgbG93ZXN0X2J1bGtfY29zdF9pbmRleCA9IHdpZHRoOworICAgIHNlY19sb3dlc3RfYnVsa19jb3N0ID0gSU5UX01BWCAvIDI7CisgICAgc2VjX2xvd2VzdF9idWxrX2Nvc3RfaW5kZXggPSB3aWR0aDsKKworICAgIGJhc2VfYnVsa19jb3N0ID0gMSArIHMtPnBpeGVsX3NpemU7CisKKyAgICBmb3IgKGkgPSB3aWR0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisKKyAgICAgICAgaW50IHByZXZfYnVsa19jb3N0OworCisgICAgICAgIC8qIElmIG91ciBsb3dlc3QgYnVsayBjb3N0IGluZGV4IGlzIHRvbyBmYXIgYXdheSwgcmVwbGFjZSBpdAorICAgICAgICAgKiB3aXRoIHRoZSBuZXh0IGxvd2VzdCBidWxrIGNvc3QgKi8KKyAgICAgICAgaWYgKEZGTUlOKHdpZHRoLCBpICsgTUFYX1JMRV9CVUxLKSA8IGxvd2VzdF9idWxrX2Nvc3RfaW5kZXgpIHsKKyAgICAgICAgICAgIGxvd2VzdF9idWxrX2Nvc3QgPSBzZWNfbG93ZXN0X2J1bGtfY29zdDsKKyAgICAgICAgICAgIGxvd2VzdF9idWxrX2Nvc3RfaW5kZXggPSBzZWNfbG93ZXN0X2J1bGtfY29zdF9pbmRleDsKKworICAgICAgICAgICAgc2VjX2xvd2VzdF9idWxrX2Nvc3QgPSBJTlRfTUFYIC8gMjsKKyAgICAgICAgICAgIHNlY19sb3dlc3RfYnVsa19jb3N0X2luZGV4ID0gd2lkdGg7CisgICAgICAgIH0KKworICAgICAgICAvKiBEZWFsIHdpdGggdGhlIGZpcnN0IHBpeGVsJ3MgYnVsayBjb3N0ICovCisgICAgICAgIGlmICghaSkgeworICAgICAgICAgICAgYmFzZV9idWxrX2Nvc3QrKzsKKyAgICAgICAgICAgIGxvd2VzdF9idWxrX2Nvc3QrKzsKKyAgICAgICAgICAgIHNlY19sb3dlc3RfYnVsa19jb3N0Kys7CisgICAgICAgIH0KKworICAgICAgICAvKiBMb29rIGF0IHRoZSBidWxrIGNvc3Qgb2YgdGhlIHByZXZpb3VzIGxvb3AgYW5kIHNlZSBpZiBpdCBpcworICAgICAgICAgKiBhIG5ldyBsb3dlciBidWxrIGNvc3QgKi8KKyAgICAgICAgcHJldl9idWxrX2Nvc3QgPSBzLT5sZW5ndGhfdGFibGVbaSArIDFdICsgYmFzZV9idWxrX2Nvc3Q7CisgICAgICAgIGlmIChwcmV2X2J1bGtfY29zdCA8PSBzZWNfbG93ZXN0X2J1bGtfY29zdCkgeworICAgICAgICAgICAgLyogSWYgaXQncyBsb3dlciB0aGFuIHRoZSAybmQgbG93ZXN0LCB0aGVuIGl0IG1heSBiZSBsb3dlcgorICAgICAgICAgICAgICogdGhhbiB0aGUgbG93ZXN0ICovCisgICAgICAgICAgICBpZiAocHJldl9idWxrX2Nvc3QgPD0gbG93ZXN0X2J1bGtfY29zdCkgeworCisgICAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBmb3VuZCBhIG5ldyBsb3dlc3QgYnVsayBjb3N0LAorICAgICAgICAgICAgICAgICAqIHRoZW4gdGhlIDJuZCBsb3dlc3QgYnVsayBjb3N0IGlzIG5vdyBmYXJ0aGVyIHRoYW4gdGhlCisgICAgICAgICAgICAgICAgICogbG93ZXN0IGJ1bGsgY29zdCwgYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCAqLworICAgICAgICAgICAgICAgIHNlY19sb3dlc3RfYnVsa19jb3N0ID0gSU5UX01BWCAvIDI7CisKKyAgICAgICAgICAgICAgICBsb3dlc3RfYnVsa19jb3N0ID0gcHJldl9idWxrX2Nvc3Q7CisgICAgICAgICAgICAgICAgbG93ZXN0X2J1bGtfY29zdF9pbmRleCA9IGkgKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGVuIGl0IG11c3QgYmUgdGhlIDJuZCBsb3dlc3QgYnVsayBjb3N0ICovCisgICAgICAgICAgICAgICAgc2VjX2xvd2VzdF9idWxrX2Nvc3QgPSBwcmV2X2J1bGtfY29zdDsKKyAgICAgICAgICAgICAgICBzZWNfbG93ZXN0X2J1bGtfY29zdF9pbmRleCA9IGkgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzLT5hdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSAmJiAhbWVtY21wKHRoaXNfbGluZSwgcHJldl9saW5lLCBzLT5waXhlbF9zaXplKSkKKyAgICAgICAgICAgIHNraXBjb3VudCA9IEZGTUlOKHNraXBjb3VudCArIDEsIE1BWF9STEVfU0tJUCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNraXBjb3VudCA9IDA7CisKKyAgICAgICAgdG90YWxfc2tpcF9jb3N0ICA9IHMtPmxlbmd0aF90YWJsZVtpICsgc2tpcGNvdW50XSArIDI7CisgICAgICAgIHMtPnNraXBfdGFibGVbaV0gPSBza2lwY291bnQ7CisKKworICAgICAgICBpZiAoaSA8IHdpZHRoIC0gMSAmJiAhbWVtY21wKHRoaXNfbGluZSwgdGhpc19saW5lICsgcy0+cGl4ZWxfc2l6ZSwgcy0+cGl4ZWxfc2l6ZSkpCisgICAgICAgICAgICByZXBlYXRjb3VudCA9IEZGTUlOKHJlcGVhdGNvdW50ICsgMSwgTUFYX1JMRV9SRVBFQVQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXBlYXRjb3VudCA9IDE7CisKKyAgICAgICAgdG90YWxfcmVwZWF0X2Nvc3QgPSBzLT5sZW5ndGhfdGFibGVbaSArIHJlcGVhdGNvdW50XSArIDEgKyBzLT5waXhlbF9zaXplOworCisgICAgICAgIC8qIHNraXAgY29kZSBpcyBmcmVlIGZvciB0aGUgZmlyc3QgcGl4ZWwsIGl0IGNvc3RzIG9uZSBieXRlIGZvciByZXBlYXQgYW5kIGJ1bGsgY29weQorICAgICAgICAgKiBzbyBsZXQncyBtYWtlIGl0IGF3YXJlICovCisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIHRvdGFsX3NraXBfY29zdC0tOworICAgICAgICAgICAgdG90YWxfcmVwZWF0X2Nvc3QrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXBlYXRjb3VudCA+IDEgJiYgKHNraXBjb3VudCA9PSAwIHx8IHRvdGFsX3JlcGVhdF9jb3N0IDwgdG90YWxfc2tpcF9jb3N0KSkgeworICAgICAgICAgICAgLyogcmVwZWF0IGlzIHRoZSBiZXN0ICovCisgICAgICAgICAgICBzLT5sZW5ndGhfdGFibGVbaV0gID0gdG90YWxfcmVwZWF0X2Nvc3Q7CisgICAgICAgICAgICBzLT5ybGVjb2RlX3RhYmxlW2ldID0gLXJlcGVhdGNvdW50OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNraXBjb3VudCA+IDApIHsKKyAgICAgICAgICAgIC8qIHNraXAgaXMgdGhlIGJlc3QgY2hvaWNlIGhlcmUgKi8KKyAgICAgICAgICAgIHMtPmxlbmd0aF90YWJsZVtpXSAgPSB0b3RhbF9za2lwX2Nvc3Q7CisgICAgICAgICAgICBzLT5ybGVjb2RlX3RhYmxlW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIFdlIGNhbm5vdCBkbyBuZWl0aGVyIHNraXAgbm9yIHJlcGVhdAorICAgICAgICAgICAgICogdGh1cyB3ZSB1c2UgdGhlIGJlc3QgYnVsayBjb3B5ICAqLworCisgICAgICAgICAgICBzLT5sZW5ndGhfdGFibGVbaV0gID0gbG93ZXN0X2J1bGtfY29zdDsKKyAgICAgICAgICAgIHMtPnJsZWNvZGVfdGFibGVbaV0gPSBsb3dlc3RfYnVsa19jb3N0X2luZGV4IC0gaTsKKworICAgICAgICB9CisKKyAgICAgICAgLyogVGhlc2UgYnVsayBjb3N0cyBpbmNyZWFzZSBldmVyeSBpdGVyYXRpb24gKi8KKyAgICAgICAgbG93ZXN0X2J1bGtfY29zdCArPSBzLT5waXhlbF9zaXplOworICAgICAgICBzZWNfbG93ZXN0X2J1bGtfY29zdCArPSBzLT5waXhlbF9zaXplOworCisgICAgICAgIHRoaXNfbGluZSAtPSBzLT5waXhlbF9zaXplOworICAgICAgICBwcmV2X2xpbmUgLT0gcy0+cGl4ZWxfc2l6ZTsKKyAgICB9CisKKyAgICAvKiBHb29kICEgTm93IHdlIGhhdmUgdGhlIGJlc3Qgc2VxdWVuY2UgZm9yIHRoaXMgbGluZSwgbGV0J3Mgb3V0cHV0IGl0ICovCisKKyAgICAvKiBXZSBkbyBhIHNwZWNpYWwgY2FzZSBmb3IgdGhlIGZpcnN0IHBpeGVsIHNvIHRoYXQgd2UgYXZvaWQgdGVzdGluZyBpdCBpbgorICAgICAqIHRoZSB3aG9sZSBsb29wICovCisKKyAgICBpPTA7CisgICAgdGhpc19saW5lID0gcC0+ICAgICAgICAgICAgICAgZGF0YVswXSArIGxpbmUqcC0+bGluZXNpemVbMF07CisKKyAgICBpZiAocy0+cmxlY29kZV90YWJsZVswXSA9PSAwKSB7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoYnVmLCBzLT5za2lwX3RhYmxlWzBdICsgMSk7CisgICAgICAgIGkgKz0gcy0+c2tpcF90YWJsZVswXTsKKyAgICB9CisgICAgZWxzZSBieXRlc3RyZWFtX3B1dF9ieXRlKGJ1ZiwgMSk7CisKKworICAgIHdoaWxlIChpIDwgd2lkdGgpIHsKKyAgICAgICAgcmxlY29kZSA9IHMtPnJsZWNvZGVfdGFibGVbaV07CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoYnVmLCBybGVjb2RlKTsKKyAgICAgICAgaWYgKHJsZWNvZGUgPT0gMCkgeworICAgICAgICAgICAgLyogV3JpdGUgYSBza2lwIHNlcXVlbmNlICovCisgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKGJ1Ziwgcy0+c2tpcF90YWJsZVtpXSArIDEpOworICAgICAgICAgICAgaSArPSBzLT5za2lwX3RhYmxlW2ldOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHJsZWNvZGUgPiAwKSB7CisgICAgICAgICAgICAvKiBidWxrIGNvcHkgKi8KKyAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dSQVk4KSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgLy8gUVQgZ3JheXNjYWxlIGNvbG9yc3BhY2UgaGFzIDA9d2hpdGUgYW5kIDI1NT1ibGFjaywgd2Ugd2lsbAorICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgcGFsZXR0ZSB0aGF0IGlzIGluY2x1ZGVkIGluIHRoZSBBVkZyYW1lIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyBBVl9QSVhfRk1UX0dSQVk4IGhhcyBkZWZpbmVkIGNvbG9yIG1hcHBpbmcKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmxlY29kZSpzLT5waXhlbF9zaXplOyArK2opCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoYnVmLCAqKHRoaXNfbGluZSArIGkqcy0+cGl4ZWxfc2l6ZSArIGopIF4gMHhmZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcihidWYsIHRoaXNfbGluZSArIGkqcy0+cGl4ZWxfc2l6ZSwgcmxlY29kZSpzLT5waXhlbF9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgKz0gcmxlY29kZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIHJlcGVhdCB0aGUgYml0cyAqLworICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR1JBWTgpIHsKKyAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAvLyBRVCBncmF5c2NhbGUgY29sb3JzcGFjZSBoYXMgMD13aGl0ZSBhbmQgMjU1PWJsYWNrLCAuLi4KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+cGl4ZWxfc2l6ZTsgKytqKQorICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKGJ1ZiwgKih0aGlzX2xpbmUgKyBpKnMtPnBpeGVsX3NpemUgKyBqKSBeIDB4ZmYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoYnVmLCB0aGlzX2xpbmUgKyBpKnMtPnBpeGVsX3NpemUsIHMtPnBpeGVsX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSAtPSBybGVjb2RlOworICAgICAgICB9CisgICAgfQorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoYnVmLCAtMSk7IC8vIGVuZCBSTEUgbGluZQorfQorCisvKiogRW5jb2RlIGZyYW1lIGluY2x1ZGluZyBoZWFkZXIgKi8KK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKFF0cmxlRW5jQ29udGV4dCAqcywgY29uc3QgQVZGcmFtZSAqcCwgdWludDhfdCAqYnVmKQoreworICAgIGludCBpOworICAgIGludCBzdGFydF9saW5lID0gMDsKKyAgICBpbnQgZW5kX2xpbmUgPSBzLT5hdmN0eC0+aGVpZ2h0OworICAgIHVpbnQ4X3QgKm9yaWdfYnVmID0gYnVmOworCisgICAgaWYgKCFzLT5hdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSkgeworICAgICAgICB1bnNpZ25lZCBsaW5lX3NpemUgPSBzLT5sb2dpY2FsX3dpZHRoICogcy0+cGl4ZWxfc2l6ZTsKKyAgICAgICAgZm9yIChzdGFydF9saW5lID0gMDsgc3RhcnRfbGluZSA8IHMtPmF2Y3R4LT5oZWlnaHQ7IHN0YXJ0X2xpbmUrKykKKyAgICAgICAgICAgIGlmIChtZW1jbXAocC0+ZGF0YVswXSArIHN0YXJ0X2xpbmUqcC0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIHMtPnByZXZpb3VzX2ZyYW1lLmRhdGFbMF0gKyBzdGFydF9saW5lKnMtPnByZXZpb3VzX2ZyYW1lLmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3NpemUpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGZvciAoZW5kX2xpbmU9cy0+YXZjdHgtPmhlaWdodDsgZW5kX2xpbmUgPiBzdGFydF9saW5lOyBlbmRfbGluZS0tKQorICAgICAgICAgICAgaWYgKG1lbWNtcChwLT5kYXRhWzBdICsgKGVuZF9saW5lIC0gMSkqcC0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIHMtPnByZXZpb3VzX2ZyYW1lLmRhdGFbMF0gKyAoZW5kX2xpbmUgLSAxKSpzLT5wcmV2aW91c19mcmFtZS5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGluZV9zaXplKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDSFVOSyBTSVpFLCBwYXRjaGVkIGxhdGVyCisKKyAgICBpZiAoKHN0YXJ0X2xpbmUgPT0gMCAmJiBlbmRfbGluZSA9PSBzLT5hdmN0eC0+aGVpZ2h0KSB8fCBzdGFydF9saW5lID09IHMtPmF2Y3R4LT5oZWlnaHQpCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgMCk7ICAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVyCisgICAgZWxzZSB7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgOCk7ICAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVyCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1Ziwgc3RhcnRfbGluZSk7ICAgICAgICAgICAgLy8gc3RhcnRpbmcgbGluZQorICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZidWYsIDApOyAgICAgICAgICAgICAgICAgICAgIC8vIHVua25vd24KKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmYnVmLCBlbmRfbGluZSAtIHN0YXJ0X2xpbmUpOyAvLyBsaW5lcyB0byB1cGRhdGUKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmYnVmLCAwKTsgICAgICAgICAgICAgICAgICAgICAvLyB1bmtub3duCisgICAgfQorICAgIGZvciAoaSA9IHN0YXJ0X2xpbmU7IGkgPCBlbmRfbGluZTsgaSsrKQorICAgICAgICBxdHJsZV9lbmNvZGVfbGluZShzLCBwLCBpLCAmYnVmKTsKKworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHplcm8gc2tpcCBjb2RlID0gZnJhbWUgZmluaXNoZWQKKyAgICBBVl9XQjMyKG9yaWdfYnVmLCBidWYgLSBvcmlnX2J1Zik7ICAgICAgICAgICAgICAgICAgICAvLyBwYXRjaCB0aGUgY2h1bmsgc2l6ZQorICAgIHJldHVybiBidWYgLSBvcmlnX2J1ZjsKK30KKworc3RhdGljIGludCBxdHJsZV9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljdCwgaW50ICpnb3RfcGFja2V0KQoreworICAgIFF0cmxlRW5jQ29udGV4dCAqIGNvbnN0IHMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKiBjb25zdCBwID0gYXZjdHgtPmNvZGVkX2ZyYW1lOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgcy0+bWF4X2J1Zl9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGF2Y3R4LT5nb3Bfc2l6ZSA9PSAwIHx8IChzLT5hdmN0eC0+ZnJhbWVfbnVtYmVyICUgYXZjdHgtPmdvcF9zaXplKSA9PSAwKSB7CisgICAgICAgIC8qIEktRnJhbWUgKi8KKyAgICAgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIHAtPmtleV9mcmFtZSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUC1GcmFtZSAqLworICAgICAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgcC0+a2V5X2ZyYW1lID0gMDsKKyAgICB9CisKKyAgICBwa3QtPnNpemUgPSBlbmNvZGVfZnJhbWUocywgcGljdCwgcGt0LT5kYXRhKTsKKworICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBhdl9waWN0dXJlX2NvcHkoJnMtPnByZXZpb3VzX2ZyYW1lLCAoY29uc3QgQVZQaWN0dXJlICopcGljdCwKKyAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisKKyAgICBpZiAocC0+a2V5X2ZyYW1lKQorICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9xdHJsZV9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJxdHJsZSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlF1aWNrVGltZSBBbmltYXRpb24gKFJMRSkgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUVRSTEUsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFF0cmxlRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gcXRybGVfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gcXRybGVfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IHF0cmxlX2VuY29kZV9lbmQsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9SR0I1NTVCRSwgQVZfUElYX0ZNVF9BUkdCLCBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3IyMTBkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3IyMTBkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmViZjdjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcjIxMGRlYy5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogUjIxMCBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFJlaW1hciBEb2VmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPnBpeF9mbXQgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1JHQjQ4OworICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBpbnQgaCwgdywgcmV0OworICAgIEFWRnJhbWUgKnBpYyA9IGRhdGE7CisgICAgY29uc3QgdWludDMyX3QgKnNyYyA9IChjb25zdCB1aW50MzJfdCAqKWF2cGt0LT5kYXRhOworICAgIGludCBhbGlnbmVkX3dpZHRoID0gRkZBTElHTihhdmN0eC0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SMTBLID8gMSA6IDY0KTsKKyAgICB1aW50OF90ICpkc3RfbGluZTsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8IDQgKiBhbGlnbmVkX3dpZHRoICogYXZjdHgtPmhlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBhY2tldCB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpYywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBpYy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcGljLT5rZXlfZnJhbWUgPSAxOworICAgIGRzdF9saW5lID0gcGljLT5kYXRhWzBdOworCisgICAgZm9yIChoID0gMDsgaCA8IGF2Y3R4LT5oZWlnaHQ7IGgrKykgeworICAgICAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopZHN0X2xpbmU7CisgICAgICAgIGZvciAodyA9IDA7IHcgPCBhdmN0eC0+d2lkdGg7IHcrKykgeworICAgICAgICAgICAgdWludDMyX3QgcGl4ZWw7CisgICAgICAgICAgICB1aW50MTZfdCByLCBnLCBiOworICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZD09QVZfQ09ERUNfSURfQVZSUCkgeworICAgICAgICAgICAgICAgIHBpeGVsID0gYXZfbGUybmUzMigqc3JjKyspOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IGF2X2JlMm5lMzIoKnNyYysrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX1IyMTApIHsKKyAgICAgICAgICAgICAgICBiID0gIHBpeGVsIDw8ICA2OworICAgICAgICAgICAgICAgIGcgPSAocGl4ZWwgPj4gIDQpICYgMHhmZmMwOworICAgICAgICAgICAgICAgIHIgPSAocGl4ZWwgPj4gMTQpICYgMHhmZmMwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiID0gIHBpeGVsIDw8ICA0OworICAgICAgICAgICAgICAgIGcgPSAocGl4ZWwgPj4gIDYpICYgMHhmZmMwOworICAgICAgICAgICAgICAgIHIgPSAocGl4ZWwgPj4gMTYpICYgMHhmZmMwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRzdCsrID0gciB8IChyID4+IDEwKTsKKyAgICAgICAgICAgICpkc3QrKyA9IGcgfCAoZyA+PiAxMCk7CisgICAgICAgICAgICAqZHN0KysgPSBiIHwgKGIgPj4gMTApOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBhbGlnbmVkX3dpZHRoIC0gYXZjdHgtPndpZHRoOworICAgICAgICBkc3RfbGluZSArPSBwaWMtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgICpnb3RfZnJhbWUgICAgICA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKKyNpZiBDT05GSUdfUjIxMF9ERUNPREVSCitBVkNvZGVjIGZmX3IyMTBfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicjIxMCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCBSR0IgMTAtYml0IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1IyMTAsCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCisjaWYgQ09ORklHX1IxMEtfREVDT0RFUgorQVZDb2RlYyBmZl9yMTBrX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInIxMGsiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBSkEgS29uYSAxMC1iaXQgUkdCIENvZGVjIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1IxMEssCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCisjaWYgQ09ORklHX0FWUlBfREVDT0RFUgorQVZDb2RlYyBmZl9hdnJwX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImF2cnAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlkIDE6MSAxMC1iaXQgUkdCIFBhY2tlciIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BVlJQLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcjIxMGVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcjIxMGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MWNkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yMjEwZW5jLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBSMjEwIGVuY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpYywgaW50ICpnb3RfcGFja2V0KQoreworICAgIGludCBpLCBqLCByZXQ7CisgICAgaW50IGFsaWduZWRfd2lkdGggPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1IxMEsgPyAxIDogNjQpOworICAgIGludCBwYWQgPSAoYWxpZ25lZF93aWR0aCAtIGF2Y3R4LT53aWR0aCkgKiA0OworICAgIHVpbnQ4X3QgKnNyY19saW5lOworICAgIHVpbnQ4X3QgKmRzdDsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCA0ICogYWxpZ25lZF93aWR0aCAqIGF2Y3R4LT5oZWlnaHQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBzcmNfbGluZSA9IHBpYy0+ZGF0YVswXTsKKyAgICBkc3QgPSBwa3QtPmRhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIHVpbnQxNl90ICpzcmMgPSAodWludDE2X3QgKilzcmNfbGluZTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aDsgaisrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBwaXhlbDsKKyAgICAgICAgICAgIHVpbnQxNl90IHIgPSAqc3JjKysgPj4gNjsKKyAgICAgICAgICAgIHVpbnQxNl90IGcgPSAqc3JjKysgPj4gNjsKKyAgICAgICAgICAgIHVpbnQxNl90IGIgPSAqc3JjKysgPj4gNDsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUjIxMCkKKyAgICAgICAgICAgICAgICBwaXhlbCA9IChyIDw8IDIwKSB8IChnIDw8IDEwKSB8IGIgPj4gMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwaXhlbCA9IChyIDw8IDIyKSB8IChnIDw8IDEyKSB8IGI7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FWUlApCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmZHN0LCBwaXhlbCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmZHN0LCBwaXhlbCk7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGRzdCwgMCwgcGFkKTsKKyAgICAgICAgZHN0ICs9IHBhZDsKKyAgICAgICAgc3JjX2xpbmUgKz0gcGljLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2X2ZyZWVwKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfUjIxMF9FTkNPREVSCitBVkNvZGVjIGZmX3IyMTBfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicjIxMCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCBSR0IgMTAtYml0IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1IyMTAsCisgICAgLmluaXQgICAgICAgICAgID0gZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGVuY29kZV9jbG9zZSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9SR0I0OCwgQVZfUElYX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCisjaWYgQ09ORklHX1IxMEtfRU5DT0RFUgorQVZDb2RlYyBmZl9yMTBrX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInIxMGsiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBSkEgS29uYSAxMC1iaXQgUkdCIENvZGVjIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1IxMEssCisgICAgLmluaXQgICAgICAgICAgID0gZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGVuY29kZV9jbG9zZSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9SR0I0OCwgQVZfUElYX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCisjaWYgQ09ORklHX0FWUlBfRU5DT0RFUgorQVZDb2RlYyBmZl9hdnJwX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImF2cnAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlkIDE6MSAxMC1iaXQgUkdCIFBhY2tlciIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BVlJQLAorICAgIC5pbml0ICAgICAgICAgICA9IGVuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGVuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBlbmNvZGVfY2xvc2UsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfUkdCNDgsIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcmExNDQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JhMTQ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2YTQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JhMTQ0LmMKQEAgLTAsMCArMSwxNzI0IEBACisvKgorICogUmVhbCBBdWRpbyAxLjAgKDE0LjRLKQorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImNlbHBfZmlsdGVycy5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJyYTE0NC5oIgorCitjb25zdCBpbnQxNl90IGZmX2dhaW5fdmFsX3RhYlsyNTZdWzNdID0geworICAgIHsgNTQxLCA5NTYsICA3Njh9LCB7IDg3NywgNTgxLCAgNTY4fSwgeyA2NzUsMTU3NCwgIDYzNX0sIHsxMjQ4LDE0NjQsICA2Njh9LAorICAgIHsxMjQ2LCA4MzksIDEzOTR9LCB7MjU2MCwxMzg2LCAgOTkxfSwgeyA5MjUsIDY4NywgIDYwOH0sIHsyMjA4LCA3OTcsIDExNDR9LAorICAgIHsgNTM1LCA4MzIsICA3OTl9LCB7IDc2MiwgNjA1LCAxMTU0fSwgeyA4MzIsMTEyMiwgMTAwM30sIHsxMTgwLCA2ODcsIDExNzZ9LAorICAgIHsxMjkyLCA5MDEsICA3MzJ9LCB7MTY1NiwgNjg5LCAgODk2fSwgezE3NTAsMTI0OCwgIDg0OH0sIHsyMjg0LCA5NDIsIDEwMjJ9LAorICAgIHsgODI0LDE0NzIsICA2NDN9LCB7IDUxNywgNzY1LCAgNTEyfSwgeyA1NjIsMTgxNiwgMTUyMn0sIHsgNjk0LDE4MjYsIDI3MDB9LAorICAgIHsgNzA0LCA1MjQsICA2NzJ9LCB7MTQ0MiwgNzU3LCAyMjMyfSwgeyA4ODQsIDU1MSwgMTI2Nn0sIHsyMjMyLDEwMDcsIDE2OTJ9LAorICAgIHsgOTMyLCA3NDYsICA3Nzd9LCB7MTEzMiwgODIyLCAgOTI2fSwgezEyMjYsIDc3MSwgIDYxMX0sIHsyOTQ4LDEzNDIsIDEwMDh9LAorICAgIHsxMzAyLCA1OTQsIDExNTh9LCB7MTYwMiwgNjM2LCAxMTI4fSwgezM0MDgsIDkxMCwgMTQzOH0sIHsxOTk2LCA2MTQsICA1NzV9LAorICAgIHsgNjY1LCA5MzUsICA2Mjh9LCB7IDYzMSwxMTkyLCAgODI5fSwgeyA2NDQsIDkyNiwgMTA1Mn0sIHsgODc5LCA5ODgsIDEyMjZ9LAorICAgIHsgOTQxLDI3NjgsIDI3NzJ9LCB7IDU2NSwxMzQ0LCAyMzA0fSwgeyA1NDcsIDYyOCwgIDc0MH0sIHsgNjM5LCA1MzIsIDEwNzR9LAorICAgIHsgOTU1LDEyMDgsICA1OTh9LCB7MTEyNCwxMTYwLCAgOTAwfSwgezEyMDYsIDg5OSwgMTI0Mn0sIHsgNzQ2LCA1MzMsICA2MjR9LAorICAgIHsxNDU4LDEwMjgsICA3MzV9LCB7MTcwNiwxMTAyLCAgNjkyfSwgezE4OTgsMTAxOCwgMTAwNH0sIHsyMTc2LCA5ODgsICA3MzV9LAorICAgIHsxNTc4LCA3ODIsIDE2NDJ9LCB7IDg5NywgNTE2LCAgNzU0fSwgezIwNjgsIDcwMiwgMTY1Nn0sIHsyMzQ0LCA4MTgsIDE1MjZ9LAorICAgIHsgOTA3LCA2NTIsICA1OTJ9LCB7MTA1NiwgNjUyLCAgNjQyfSwgezIxMjQsMTQxNiwgIDc4MH0sIHsyNjY0LDEyNTAsICA3Mjd9LAorICAgIHsxODk0LCA3MjcsIDExMDh9LCB7MjE5NiwgNjU3LCAgOTgxfSwgezQ4NDAsIDkyMCwgMTcwNH0sIHs0OTkyLDEyMzgsICA5ODN9LAorICAgIHsyNDIwLCA5MDksIDEwOTR9LCB7Mjc2MCwgOTM1LCAxMDMyfSwgezI4MDAsIDYxMiwgIDg1M30sIHszMDY4LCA4MzIsICA1NzR9LAorICAgIHsgNTIzLDE3OTYsICA5MjN9LCB7IDcyMiwxOTE2LCAxMzgyfSwgezEyMjYsMTU0MiwgIDkyOH0sIHsgNzU4LCA3NTcsICA1ODR9LAorICAgIHsgNTEyLDExMzQsICA1Nzd9LCB7IDYxNSwxMjc2LCAgNjk4fSwgeyA1NzQsMjU2OCwgMjM1Nn0sIHsgOTkzLDI3MjgsIDM1MTJ9LAorICAgIHsgNTM5LCA4OTAsICA5MTN9LCB7IDY5NCwgOTI4LCAxMDg4fSwgeyA4MDUsIDYwMCwgMTM2MH0sIHsyMTYwLCA5NTEsIDMxMjh9LAorICAgIHsgODE2LCA5NTAsICA1OTB9LCB7IDk1NSwgODQ3LCAgODExfSwgezEwOTQsIDg4MywgIDU1Nn0sIHsxMzA0LCA4ODgsICA2MDR9LAorICAgIHsgODYzLDExNzAsICA4NTV9LCB7MTAyMywgOTk3LCAxMDMyfSwgeyA5MzIsMTIyOCwgMTI4MH0sIHsgNjI3LCA1NjQsICA1NzN9LAorICAgIHsgODc2LCA5MDAsIDE0NDh9LCB7MTAzMCwgODU3LCAxNzkyfSwgezEyOTQsIDk1MywgMTc1OH0sIHsxNjEyLCA4NTQsIDE3MTR9LAorICAgIHsxMDkwLDExNjYsICA2MzF9LCB7MTMxNCwxMjAyLCAgNzUxfSwgezE0ODAsIDkwNSwgIDc5NX0sIHsxNjgyLDEwMTYsICA1Njh9LAorICAgIHsxNDk0LDExNzgsICA5ODN9LCB7IDg3OCwgNjEzLCAgNTI2fSwgezE3MjgsMTQ0NiwgIDc3OX0sIHsyMTM2LDEzNDgsICA3NzR9LAorICAgIHsgOTUwLCA2NDksICA5Mzl9LCB7MTE4MCwgNzAzLCAgODk5fSwgezEyMzYsIDUyNywgMTE1OH0sIHsxNDUwLCA2NDcsICA5NzJ9LAorICAgIHsxMjgyLCA2NDcsICA3MDd9LCB7MTQ2MCwgNjYzLCAgNjQ0fSwgezE2MTQsIDU3MiwgIDU3OH0sIHszNTE2LDEyMjIsICA4MjF9LAorICAgIHsyNjY4LCA3MjksIDE2ODJ9LCB7MzEyOCwgNTg1LCAxNTAyfSwgezMyMDgsIDczMywgIDk3Nn0sIHs2ODAwLCA4NzEsIDE0MTZ9LAorICAgIHszNDgwLCA3NDMsIDE0MDh9LCB7Mzc2NCwgODk5LCAxMTcwfSwgezM3NzIsIDYzMiwgIDg3NX0sIHs0MDkyLCA3MzIsICA2Mzh9LAorICAgIHszMTEyLCA3NTMsIDI2MjB9LCB7MzM3MiwgOTQ1LCAxODkwfSwgezM3NjgsIDk2OSwgMjI4OH0sIHsyMDE2LCA1NTksICA4NTR9LAorICAgIHsxNzM2LCA3MjksICA3ODd9LCB7MTk0MCwgNjg2LCAgNTQ3fSwgezIxNDAsIDYzNSwgIDY3NH0sIHs0NDgwLDEyNzIsICA4Mjh9LAorICAgIHszOTc2LCA1OTIsIDE2NjZ9LCB7NDM4NCwgNjIxLCAxMzg4fSwgezQ0MDAsIDgwMSwgIDk1NX0sIHs0NjU2LCA1MjIsICA2NDZ9LAorICAgIHs0ODQ4LCA2MjUsIDE2MzZ9LCB7NDk4NCwgNTkxLCAgODc0fSwgezUzNTIsIDUzNSwgMTAwMX0sIHsxMTIxNiw5MzgsIDExODR9LAorICAgIHsgOTI1LDMyODAsIDE0NzZ9LCB7IDczNSwxNTgwLCAxMDg4fSwgezExNTAsMTU3NiwgIDY3NH0sIHsgNjU1LCA3ODMsICA1Mjh9LAorICAgIHsgNTI3LDIwNTIsIDEzNTR9LCB7IDc4MiwxNzA0LCAxODgwfSwgeyA1NzgsIDkxMCwgMTAyNn0sIHsgNjkyLCA4ODIsIDE0Njh9LAorICAgIHsgNTg2LCA2ODMsICA3MTV9LCB7IDczOSwgNjA5LCAgNzE3fSwgeyA3NzgsIDc3MywgIDY5N30sIHsgOTIyLCA3ODUsICA4MTN9LAorICAgIHsgNzY2LCA2NTEsICA5ODR9LCB7IDk3OCwgNTk2LCAxMDMwfSwgezEwNzAsIDc1NywgMTA4MH0sIHsxMzI0LCA2ODcsIDExNzh9LAorICAgIHsxMTA4LDIxNDQsICA5Nzl9LCB7IDcyMywgOTgyLCAgNjkwfSwgeyA5MzYsIDk1NiwgIDUyN30sIHsxMTgwLDEwMDIsICA1NDd9LAorICAgIHsgNTE3LDEzMDYsICA4MjV9LCB7IDgzMiwxMTg0LCAgOTc0fSwgezEwMjQsIDk1NywgIDkwM30sIHsxMjYyLDEwOTAsICA5MDZ9LAorICAgIHsxMDI4LCA3MjAsICA2NDl9LCB7MTE5MiwgNjc5LCAgNjk0fSwgezI0NjgsMTQ4MCwgIDk3OX0sIHsyODQ0LDEzNzAsICA4Nzd9LAorICAgIHsxMzEwLCA4MzUsICA4NDh9LCB7MTUwOCwgODM5LCAgNjk4fSwgezE3NDIsMTAzMCwgIDc2OX0sIHsxOTEwLCA4NTIsICA1NzN9LAorICAgIHsxMjgwLCA4NTksIDExNzR9LCB7MTU4NCwgODYzLCAxMTA4fSwgezE2ODYsIDcwOCwgMTM2NH0sIHsxOTQyLCA3NjgsIDExMDR9LAorICAgIHsgODkxLCA1MzYsICA2OTB9LCB7MTAxNiwgNTYwLCAgNjYzfSwgezIxNzIsIDg3MCwgMTM0OH0sIHsyNDA0LCA5OTksIDExNzB9LAorICAgIHsxODkwLCA5NjYsICA4ODl9LCB7MjExNiwgOTEyLCAgNzc3fSwgezIyOTYsMTAyMCwgIDcxNH0sIHs0ODcyLDE4NDQsICA5MzJ9LAorICAgIHsyMzkyLCA3NzgsICA5Mjl9LCB7MjYwNCwgNzcyLCAgNzQ0fSwgezI3NjQsIDk1NywgIDcyMn0sIHs1ODMyLDE1MzIsICA5ODR9LAorICAgIHsyMTg4LCA1MTksIDEyNjR9LCB7MjMzMiwgNTMyLCAgOTIyfSwgezUwNjQsIDk5NSwgMjQxMn0sIHsyNzA4LCA1NzEsICA4NzR9LAorICAgIHsyNDA4LCA1NDUsICA2NjZ9LCB7NTAxNiwxMDg0LCAgODc1fSwgezUzNzYsIDk4MywgMTE5Nn0sIHs1NTM2LCA5NzksICA3MzB9LAorICAgIHs1MzQ0LCA2MzQsIDE3NDR9LCB7NTY4OCwgNzA2LCAxMzQ4fSwgezU5MTIsIDk3NywgMTE5MH0sIHs2MDcyLCA5MDUsICA3NjN9LAorICAgIHs2MDQ4LCA1ODIsIDE1MjZ9LCB7MTE5NjgsMTAxMywxODE2fSwgezEyODY0LDkzNywgMTkwMH0sIHsxMjU2MCwxMDg2LCA5OTh9LAorICAgIHsxOTk4LCA2ODQsIDE4ODR9LCB7MjUwNCwgNjMzLCAxOTkyfSwgezEyNTIsIDU2NywgIDgzNX0sIHsxNDc4LCA1NzEsICA5NzN9LAorICAgIHsyNjIwLCA3NjksIDE0MTR9LCB7MjgwOCwgOTUyLCAxMTQyfSwgezI5MDgsIDcxMiwgMTAyOH0sIHsyOTc2LCA2ODYsICA3NDF9LAorICAgIHsxNDYyLCA1NTIsICA3MTR9LCB7MzI5NiwgOTkxLCAxNDUyfSwgezE1OTAsIDYxNSwgIDU0NH0sIHszNDgwLDExNTAsICA4MjR9LAorICAgIHszMjEyLCA4MzIsICA5MjN9LCB7MzI3NiwgODM5LCAgNTMxfSwgezM1NDgsIDc4NiwgIDg1Mn0sIHszNzMyLCA3NjQsICA1NzB9LAorICAgIHs1NzI4LCA5MDYsIDI2MTZ9LCB7NjI3MiwgODA0LCAyMjUyfSwgezMwOTYsIDUzNSwgIDg3Nn0sIHszMjI4LCA1OTgsICA2NDl9LAorICAgIHs2NTM2LCA3NTksIDE0MzZ9LCB7NjY0OCwgOTkzLCAgODQ2fSwgezY4NjQsIDU2NywgMTIxMH0sezE0MDE2LDEwMTIsIDEzMDJ9LAorICAgIHszNDA4LCA1NDgsIDEwOTh9LCB7NzE2MCwxMDA4LCAxNzQyfSwgezcxMzYsMTAwMCwgMTE4Mn0sIHs3NDgwLDEwMzIsICA4MzZ9LAorICAgIHs3NDQ4LCA2MTIsIDE1NTJ9LCB7Nzc0NCwgNjE0LCAgODE2fSwgezgzODQsIDc3NywgMTQzOH0sIHs4Nzg0LCA2OTQsICA3ODZ9LAorICAgIHsgODgyLDE1MDgsIDEwNjh9LCB7IDU5NywgODM3LCAgNzY2fSwgezEyNzAsIDk1NCwgMTQwOH0sIHsgODAzLCA1NTAsICA3OTh9LAorICAgIHsxMzk4LDEzMDgsICA3OTh9LCB7MTg0OCwxNTM0LCAgNzM4fSwgeyA5NzAsIDY3NSwgIDYwOH0sIHsxMjY0LCA3MDYsICA2ODR9LAorICAgIHsxNzE2LCA3NjcsIDExMjZ9LCB7MjEwOCwgNzY1LCAxNDA0fSwgezIyMzYsIDkyNCwgMTAwM30sIHsyNDcyLDEwNDgsICA2MTF9LAorICAgIHsgOTk5LCA5NDIsICA5NjN9LCB7MTA5NCwgODU3LCAgOTM1fSwgezI5MzYsIDkyNiwgMTEzOH0sIHsxOTM0LCA3NDYsICA1NTF9LAorICAgIHszMzM2LCA2MzMsIDE3NjJ9LCB7Mzc2NCwgNzAxLCAxNDU0fSwgezE4OTAsIDU2NCwgIDYzNn0sIHs0MDk2LDExMjYsICA3OTN9LAorICAgIHszOTM2LCA1NTYsIDExNDB9LCB7MzkzNiwgNTQwLCAgNzQwfSwgezQyMTYsIDc2NCwgIDg3NH0sIHs4NDgwLDEzMjgsIDEwMTR9LAorICAgIHsyMTg0LCA1MTUsIDEwNDJ9LCB7NDQzMiwgOTM0LCAxMzQ0fSwgezQ3ODQsIDk0NSwgMTExMn0sIHs1MDE2LDEwNjIsICA3MzN9LAorICAgIHs5MjE2LDEwMjAsIDIwMjh9LCB7OTk2OCwgOTI0LCAxMTg4fSwgezU0MjQsIDkwOSwgMTIwNn0sIHs2NTEyLCA3NDQsIDEwODZ9Cit9OworCitjb25zdCB1aW50OF90IGZmX2dhaW5fZXhwX3RhYlsyNTZdID0geworICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTQsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAxNCwgMTMsIDE0LCAxNCwgMTMsIDE0LCAxMywgMTQsIDEzLCAxMywgMTMsIDE0LCAxMywgMTMsIDE0LCAxMywKKyAgIDEzLCAxMywgMTMsIDEzLCAxNCwgMTMsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTIsIDEzLCAxMywgMTMsIDEzLAorICAgMTMsIDEyLCAxMywgMTMsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsCisgICAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEyLCAxMiwgMTIsIDEzLCAxMiwgMTIsIDEyLCAxMiwKKyAgIDEyLCAxMiwgMTIsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTIsIDEyLAorICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTMsIDEzLCAxMywgMTMsCisgICAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwKKyAgIDEzLCAxMiwgMTIsIDExLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsCisgICAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMiwgMTIsIDEyLCAxMywKKyAgIDEyLCAxMiwgMTMsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LAorICAgMTIsIDEyLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTIsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAxMywgMTMsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgIDExLCAxMCwgMTEsIDEwLCAxMSwgMTEsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDEwLCAgOSwgMTEsIDEwLAorICAgMTIsIDEyLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMiwgMTIKK307CisKK2NvbnN0IGludDhfdCBmZl9jYjFfdmVjdHNbMTI4XVs0MF09eworICAgIHsKKyAgICAgMzgsICAtNCwgIDE1LCAgLTQsICAxNCwgLTEzLCAgMTIsIC0xMSwgIC0yLCAgLTYsCisgICAgIC02LCAtMTEsIC00NSwgLTE2LCAtMTEsIC0xMywgIC03LCAgIDYsIC0xMiwgICA0LAorICAgIC0yMCwgICAzLCAtMTYsICAxMiwgIC0xLCAgMTIsICA0NiwgIDI0LCAgIDAsICAzMywKKyAgICAgLTMsICAgOSwgLTEyLCAtMTIsICAtOCwgIC03LCAgMTcsICAtNiwgICAwLCAgLTIsCisgICAgfSwgeworICAgICA2MCwgLTE2LCAgIDMsIC0yMiwgIDEwLCAtMzIsICAgMCwgLTI4LCAtMTcsIC0xOCwKKyAgICAgLTMsIC0yNSwgLTM3LCAtMjMsIC0xMCwgICAzLCAgIDIsICAgMywgICAwLCAgIDMsCisgICAgLTE0LCAgIDAsIC0xNCwgIC0xLCAgIDAsICAgMiwgIDMyLCAgIDksICAtMSwgIDI1LAorICAgICAgNywgIDEzLCAgLTUsICAxMywgICA4LCAgIDEsICAgMiwgICA4LCAtMTAsICAgNiwKKyAgICB9LCB7CisgICAgIDI3LCAtMTIsICAyOCwgIC0yLCAgIDYsICAtNywgIDE1LCAgIDksIC0xMSwgICAxLAorICAgIC0xMywgLTExLCAtNDAsICAgNCwgLTI5LCAtMTQsIC0xOSwgIC01LCAtMjMsICAtOCwKKyAgICAtMzAsIC0xMywgLTE3LCAgIDAsIC0xNCwgIDEyLCAgMzQsICAyMCwgIC0yLCAgMjUsCisgICAgICAyLCAtMTYsICAtNCwgLTEyLCAgMTUsICAxNiwgIDI5LCAgIDcsICAyNCwgIDEwLAorICAgIH0sIHsKKyAgICAgNDksIC0yNCwgIDE2LCAtMjAsICAgMiwgLTI2LCAgIDIsICAtNywgLTI1LCAtMTAsCisgICAgLTExLCAtMjUsIC0zMiwgIC0zLCAtMjcsICAgMiwgIC04LCAgLTgsIC0xMSwgIC05LAorICAgIC0yNCwgLTE3LCAtMTYsIC0xNCwgLTEzLCAgIDIsICAyMCwgICA1LCAgLTQsICAxNywKKyAgICAgMTQsIC0xMiwgICAzLCAgMTMsICAzMywgIDI1LCAgMTQsICAyMywgIDE1LCAgMTksCisgICAgfSwgeworICAgICA0NiwgIC02LCAgMjEsICAgOCwgIC0yLCAtMTYsICAtNSwgIC04LCAtMTEsICAgNCwKKyAgICAgIDgsICAxNSwgLTI0LCAgIDQsICAtMiwgLTI2LCAgLTMsIC0xNiwgLTE2LCAtMTQsCisgICAgIC05LCAgLTIsICAtMSwgICA0LCAgMTksICAgNywgIDM2LCAgMTcsICAgOSwgIDEzLAorICAgICAgMCwgIDMxLCAgLTUsIC0xMiwgICA3LCAgLTgsICAxMSwgLTE1LCAtMTMsICAtNCwKKyAgICB9LCB7CisgICAgIDY4LCAtMTgsICAgOSwgIC05LCAgLTYsIC0zNSwgLTE4LCAtMjUsIC0yNiwgIC03LAorICAgICAxMCwgICAxLCAtMTYsICAtMywgIC0xLCAgLTksICAgNiwgLTE5LCAgLTQsIC0xNSwKKyAgICAgLTQsICAtNiwgICAwLCAgLTgsICAyMCwgIC0yLCAgMjMsICAgMiwgICA3LCAgIDUsCisgICAgIDEyLCAgMzUsICAgMSwgIDEzLCAgMjQsICAgMCwgIC0zLCAgIDAsIC0yMiwgICA0LAorICAgIH0sIHsKKyAgICAgMzUsIC0xNCwgIDM0LCAgMTAsIC0xMCwgLTEwLCAgLTEsICAxMiwgLTIwLCAgMTIsCisgICAgICAwLCAgMTUsIC0xOCwgIDI0LCAtMjAsIC0yNywgLTE0LCAtMjgsIC0yNywgLTI3LAorICAgIC0yMCwgLTE5LCAgLTIsICAtOCwgICA1LCAgIDcsICAyNSwgIDEzLCAgIDUsICAgNSwKKyAgICAgIDYsICAgNSwgICAyLCAtMTIsICAzMSwgIDE1LCAgMjMsICAtMSwgIDEyLCAgIDgsCisgICAgfSwgeworICAgICA1NywgLTI2LCAgMjIsICAtNywgLTE0LCAtMjgsIC0xNCwgIC0zLCAtMzUsICAgMCwKKyAgICAgIDMsICAgMSwgLTExLCAgMTYsIC0xOCwgLTEwLCAgLTQsIC0zMSwgLTE1LCAtMjgsCisgICAgLTE0LCAtMjMsICAtMSwgLTIxLCAgIDcsICAtMiwgIDExLCAgLTEsICAgMywgIC0xLAorICAgICAxOCwgICA5LCAgMTAsICAxMywgIDQ5LCAgMjQsICAgOCwgIDE0LCAgIDIsICAxNiwKKyAgICB9LCB7CisgICAgIDI1LCAgMTUsICAyMiwgIDExLCAgMTgsICAgNCwgIDE1LCAtMjIsICAgOCwgIC0yLAorICAgIC0xNywgIC05LCAtNDgsIC0yMCwgLTMwLCAtMTcsIC0xNiwgIDExLCAgLTEsICAxNiwKKyAgICAgIDIsICAxMCwgIC01LCAgMjYsICAtMiwgIC00LCAgMjIsICAgMCwgICAyLCAgMTAsCisgICAgIC02LCAgMTMsIC0xNCwgIDEwLCAtMjMsICAgMCwgIDEwLCAgLTIsICAgMSwgICAwLAorICAgIH0sIHsKKyAgICAgNDcsICAgMywgIDExLCAgLTYsICAxNSwgLTEzLCAgIDIsIC0zOCwgIC02LCAtMTMsCisgICAgLTE1LCAtMjIsIC00MCwgLTI4LCAtMjgsICAgMCwgIC01LCAgIDgsICAxMCwgIDE1LAorICAgICAgNywgICA3LCAgLTQsICAxMywgIC0xLCAtMTQsICAgOSwgLTE0LCAgIDAsICAgMiwKKyAgICAgIDQsICAxOCwgIC03LCAgMzYsICAtNiwgICA4LCAgLTMsICAxMywgIC03LCAgIDgsCisgICAgfSwgeworICAgICAxNCwgICA3LCAgMzYsICAxMywgIDEwLCAgMTAsICAxOCwgICAwLCAgIDAsICAgNSwKKyAgICAtMjUsICAtOCwgLTQzLCAgIDAsIC00OCwgLTE4LCAtMjcsICAgMCwgLTEyLCAgIDMsCisgICAgIC03LCAgLTYsICAtNywgIDEzLCAtMTUsICAtNSwgIDExLCAgLTMsICAgMCwgICAyLAorICAgICAgMCwgLTEyLCAgLTYsICAxMCwgICAwLCAgMjMsICAyMiwgIDExLCAgMjYsICAxMiwKKyAgICB9LCB7CisgICAgIDM2LCAgLTUsICAyNCwgIC00LCAgIDcsICAtNywgICA2LCAtMTcsIC0xNCwgIC01LAorICAgIC0yMiwgLTIyLCAtMzUsICAtOCwgLTQ2LCAgLTEsIC0xNywgIC0zLCAgIDAsICAgMiwKKyAgICAgLTIsIC0xMCwgIC01LCAgIDAsIC0xNCwgLTE1LCAgLTIsIC0xOCwgIC0yLCAgLTQsCisgICAgIDExLCAgLTcsICAgMSwgIDM2LCAgMTgsICAzMiwgICA3LCAgMjcsICAxNywgIDIwLAorICAgIH0sIHsKKyAgICAgMzMsICAxMywgIDI5LCAgMjQsICAgMSwgICAxLCAgLTIsIC0xOCwgICAwLCAgIDksCisgICAgIC0zLCAgMTcsIC0yNywgICAwLCAtMjEsIC0zMCwgLTEyLCAtMTEsICAtNSwgIC0yLAorICAgICAxMiwgICA0LCAgIDksICAxOSwgIDE4LCAgLTksICAxMywgIC02LCAgMTEsICAtOCwKKyAgICAgLTIsICAzNSwgIC04LCAgMTAsICAtNywgIC0xLCAgIDQsIC0xMSwgLTEwLCAgLTIsCisgICAgfSwgeworICAgICA1NSwgICAxLCAgMTcsICAgNiwgIC0xLCAtMTYsIC0xNSwgLTM1LCAtMTUsICAtMiwKKyAgICAgIDAsICAgNCwgLTE5LCAgLTgsIC0yMCwgLTEzLCAgLTEsIC0xNCwgICA3LCAgLTMsCisgICAgIDE4LCAgIDAsICAxMCwgICA1LCAgMTksIC0xOSwgICAwLCAtMjEsICAgOCwgLTE2LAorICAgICAgOSwgIDM5LCAgIDAsICAzNiwgIDEwLCAgIDcsICAtOSwgICA0LCAtMjAsICAgNSwKKyAgICB9LCB7CisgICAgIDIyLCAgIDUsICA0MiwgIDI2LCAgLTYsICAgOCwgICAxLCAgIDIsICAtOSwgIDE3LAorICAgIC0xMCwgIDE4LCAtMjEsICAxOSwgLTM5LCAtMzEsIC0yMywgLTIzLCAtMTYsIC0xNSwKKyAgICAgIDIsIC0xMiwgICA3LCAgIDYsICAgNSwgIC05LCAgIDEsIC0xMCwgICA3LCAtMTYsCisgICAgICA0LCAgIDksICAgMCwgIDEwLCAgMTcsICAyMiwgIDE2LCAgIDIsICAxNCwgICA5LAorICAgIH0sIHsKKyAgICAgNDQsICAtNiwgIDMwLCAgIDgsICAtOSwgLTEwLCAtMTEsIC0xNCwgLTIzLCAgIDUsCisgICAgIC04LCAgIDQsIC0xNCwgIDEyLCAtMzcsIC0xNCwgLTEyLCAtMjYsICAtNCwgLTE2LAorICAgICAgOCwgLTE2LCAgIDksICAtNywgICA2LCAtMTksIC0xMiwgLTI1LCAgIDUsIC0yNCwKKyAgICAgMTUsICAxMywgICA4LCAgMzYsICAzNCwgIDMxLCAgIDEsICAxOCwgICA0LCAgMTgsCisgICAgfSwgeworICAgICAtMywgIC01LCAgLTksICAtNywgIDE1LCAgLTEsICAgNSwgIDEzLCAgIDIsICAxMiwKKyAgICAgIDUsICAgMiwgLTIxLCAtMjMsICAtMiwgLTE2LCAgIDAsICAgNSwgIC02LCAgMTMsCisgICAgLTIzLCAgIDMsIC0zMiwgIDEwLCAtMTUsICAgOCwgIDQ0LCAgMjgsICAgOSwgIDM3LAorICAgICAtMiwgIDEzLCAgLTksIC0xNSwgLTEyLCAtMjcsICAtNywgLTEyLCAgIDAsIC0xMSwKKyAgICB9LCB7CisgICAgIDE4LCAtMTcsIC0yMSwgLTI1LCAgMTEsIC0xOSwgIC02LCAgLTMsIC0xMSwgICAwLAorICAgICAgNywgLTExLCAtMTMsIC0zMSwgIC0xLCAgIDAsICAgOSwgICAxLCAgIDUsICAxMiwKKyAgICAtMTgsICAgMCwgLTMxLCAgLTIsIC0xMywgIC0xLCAgMzAsICAxNCwgICA3LCAgMjksCisgICAgICA5LCAgMTgsICAtMSwgIDEwLCAgIDQsIC0xOCwgLTIyLCAgIDMsIC0xMCwgIC0yLAorICAgIH0sIHsKKyAgICAtMTMsIC0xMywgICAzLCAgLTUsICAgNywgICA0LCAgIDksICAzNCwgIC01LCAgMjAsCisgICAgIC0yLCAgIDMsIC0xNiwgIC0zLCAtMjAsIC0xNywgLTExLCAgLTcsIC0xNywgICAwLAorICAgIC0zNCwgLTEzLCAtMzMsICAtMiwgLTI4LCAgIDgsICAzMiwgIDI0LCAgIDUsICAyOSwKKyAgICAgIDMsIC0xMiwgICAwLCAtMTUsICAxMSwgIC0zLCAgIDMsICAgMiwgIDI0LCAgIDEsCisgICAgfSwgeworICAgICAgOCwgLTI1LCAgLTgsIC0yMywgICAzLCAtMTMsICAtMywgIDE3LCAtMjAsICAgOCwKKyAgICAgIDAsIC0xMCwgIC04LCAtMTEsIC0xOCwgICAwLCAgLTEsIC0xMCwgIC01LCAgIDAsCisgICAgLTI4LCAtMTcsIC0zMiwgLTE1LCAtMjYsICAtMSwgIDE5LCAgIDksICAgMywgIDIxLAorICAgICAxNSwgIC03LCAgIDYsICAgOSwgIDI5LCAgIDUsIC0xMCwgIDE3LCAgMTUsICAgOSwKKyAgICB9LCB7CisgICAgICA0LCAgLTYsICAtMywgICA1LCAgLTEsICAtNCwgLTExLCAgMTYsICAtNiwgIDIzLAorICAgICAxOSwgIDI5LCAgIDAsICAtMywgICA2LCAtMzAsICAgMywgLTE3LCAtMTAsICAtNSwKKyAgICAtMTMsICAtMiwgLTE3LCAgIDMsICAgNSwgICAzLCAgMzUsICAyMSwgIDE3LCAgMTcsCisgICAgICAyLCAgMzUsICAtMiwgLTE1LCAgIDMsIC0yOCwgLTEzLCAtMjEsIC0xMywgLTEzLAorICAgIH0sIHsKKyAgICAgMjYsIC0xOSwgLTE1LCAtMTIsICAtNSwgLTIyLCAtMjQsICAgMCwgLTIxLCAgMTIsCisgICAgIDIxLCAgMTUsICAgOCwgLTExLCAgIDcsIC0xMiwgIDE0LCAtMjAsICAgMiwgIC02LAorICAgICAtNywgIC02LCAtMTYsICAtOSwgICA2LCAgLTUsICAyMSwgICA3LCAgMTUsICAxMCwKKyAgICAgMTMsICAzOSwgICA1LCAgMTAsICAyMCwgLTE5LCAtMjgsICAtNSwgLTIyLCAgLTUsCisgICAgfSwgeworICAgICAtNSwgLTE1LCAgIDksICAgNywgIC05LCAgIDIsICAtOCwgIDM3LCAtMTQsICAzMSwKKyAgICAgMTEsICAyOSwgICA1LCAgMTYsIC0xMSwgLTMwLCAgLTcsIC0yOSwgLTIxLCAtMTgsCisgICAgLTIzLCAtMTksIC0xOCwgIC05LCAgLTcsICAgMywgIDIzLCAgMTcsICAxNCwgICA5LAorICAgICAgOCwgICA5LCAgIDYsIC0xNSwgIDI3LCAgLTQsICAtMiwgIC02LCAgMTIsICAtMSwKKyAgICB9LCB7CisgICAgIDE2LCAtMjcsICAtMiwgLTEwLCAtMTMsIC0xNiwgLTIwLCAgMjAsIC0yOSwgIDIwLAorICAgICAxNCwgIDE2LCAgMTMsICAgOCwgIC05LCAtMTMsICAgMiwgLTMzLCAgLTksIC0xOSwKKyAgICAtMTcsIC0yMywgLTE3LCAtMjIsICAtNiwgIC02LCAgIDksICAgMiwgIDEyLCAgIDIsCisgICAgIDIwLCAgMTMsICAxMywgIDEwLCAgNDUsICAgNCwgLTE2LCAgIDgsICAgMiwgICA3LAorICAgIH0sIHsKKyAgICAtMTYsICAxNCwgIC0yLCAgIDgsICAyMCwgIDE3LCAgIDksICAgMiwgIDE0LCAgMTYsCisgICAgIC02LCAgIDUsIC0yNCwgLTI4LCAtMjEsIC0yMCwgIC04LCAgIDksICAgNCwgIDI1LAorICAgICAtMSwgIDExLCAtMjIsICAyNCwgLTE1LCAgLTgsICAyMSwgICA1LCAgMTEsICAxNCwKKyAgICAgLTUsICAxOCwgLTExLCAgIDcsIC0yNywgLTIwLCAtMTQsICAtNywgICAxLCAgLTksCisgICAgfSwgeworICAgICAgNiwgICAyLCAtMTQsICAtOSwgIDE2LCAgLTEsICAtMywgLTE0LCAgIDAsICAgNSwKKyAgICAgLTMsICAtOCwgLTE2LCAtMzYsIC0xOSwgIC0zLCAgIDEsICAgNiwgIDE3LCAgMjQsCisgICAgICA0LCAgIDcsIC0yMSwgIDExLCAtMTQsIC0xOCwgICA3LCAgLTksICAgOSwgICA3LAorICAgICAgNiwgIDIyLCAgLTMsICAzMywgLTEwLCAtMTEsIC0yOCwgICA3LCAgLTcsICAgMCwKKyAgICB9LCB7CisgICAgLTI2LCAgIDYsICAxMSwgIDEwLCAgMTIsICAyMywgIDEyLCAgMjMsICAgNSwgIDI0LAorICAgIC0xMywgICA1LCAtMTksICAtOCwgLTM4LCAtMjEsIC0yMCwgIC0yLCAgLTYsICAxMiwKKyAgICAtMTEsICAtNSwgLTIzLCAgMTEsIC0yOSwgIC05LCAgIDksICAgMCwgICA3LCAgIDYsCisgICAgICAxLCAgLTcsICAtMiwgICA3LCAgLTMsICAgMywgIC0yLCAgIDYsICAyNywgICAzLAorICAgIH0sIHsKKyAgICAgLTQsICAtNiwgICAwLCAgLTcsICAgOCwgICA0LCAgIDAsICAgNiwgIC05LCAgMTMsCisgICAgLTExLCAgLTcsIC0xMSwgLTE1LCAtMzcsICAtNCwgIC05LCAgLTUsICAgNSwgIDExLAorICAgICAtNSwgIC05LCAtMjIsICAtMSwgLTI3LCAtMTgsICAtNCwgLTE0LCAgIDUsICAgMCwKKyAgICAgMTIsICAtMywgICA0LCAgMzIsICAxNCwgIDEyLCAtMTcsICAyMiwgIDE3LCAgMTEsCisgICAgfSwgeworICAgICAtOCwgIDEyLCAgIDMsICAyMSwgICAzLCAgMTQsICAtOCwgICA1LCAgIDQsICAyOCwKKyAgICAgIDcsICAzMiwgIC0yLCAgLTgsIC0xMiwgLTM0LCAgLTQsIC0xMiwgICAxLCAgIDYsCisgICAgICA5LCAgIDQsICAtNywgIDE3LCAgIDQsIC0xMywgIDExLCAgLTEsICAxOSwgIC00LAorICAgICAgMCwgIDM5LCAgLTQsICAgNywgLTExLCAtMjEsIC0yMCwgLTE2LCAtMTAsIC0xMSwKKyAgICB9LCB7CisgICAgIDEzLCAgIDAsICAtOCwgICAzLCAgIDAsICAtNCwgLTIxLCAtMTEsICAtOSwgIDE2LAorICAgICAxMCwgIDE4LCAgIDUsIC0xNiwgLTEwLCAtMTYsICAgNSwgLTE1LCAgMTMsICAgNSwKKyAgICAgMTUsICAgMSwgIC02LCAgIDQsICAgNiwgLTIzLCAgLTIsIC0xNiwgIDE3LCAtMTIsCisgICAgIDEwLCAgNDQsICAgMywgIDMzLCAgIDYsIC0xMiwgLTM0LCAgLTEsIC0yMCwgIC0zLAorICAgIH0sIHsKKyAgICAtMTgsICAgNCwgIDE3LCAgMjMsICAtNCwgIDIwLCAgLTQsICAyNiwgIC0zLCAgMzYsCisgICAgICAwLCAgMzIsICAgMiwgIDEyLCAtMjksIC0zNCwgLTE2LCAtMjQsIC0xMCwgIC02LAorICAgICAgMCwgLTEyLCAgLTgsICAgNCwgIC04LCAtMTMsICAgMCwgIC02LCAgMTYsIC0xMiwKKyAgICAgIDUsICAxMywgICAzLCAgIDcsICAxMywgICAzLCAgLTgsICAtMiwgIDE0LCAgIDAsCisgICAgfSwgeworICAgICAgMywgIC03LCAgIDUsICAgNSwgIC04LCAgIDIsIC0xNywgICA5LCAtMTgsICAyNCwKKyAgICAgIDIsICAxOSwgIDEwLCAgIDQsIC0yOCwgLTE3LCAgLTUsIC0yOCwgICAyLCAgLTcsCisgICAgICA0LCAtMTUsICAtNywgIC04LCAgLTYsIC0yMywgLTEzLCAtMjEsICAxNCwgLTIwLAorICAgICAxNywgIDE4LCAgMTEsICAzMywgIDMwLCAgMTEsIC0yMywgIDEzLCAgIDUsICAgOSwKKyAgICB9LCB7CisgICAgIDYwLCAgMTAsICAgNywgIC0xLCAgIDksICAtOCwgICA2LCAtMTMsICAgMiwgLTE1LAorICAgICAtMSwgLTEwLCAtMTMsIC0xMSwgIDE1LCAgIDAsICAgNiwgICA5LCAgLTEsICAgMCwKKyAgICAtMTMsICAgMSwgLTExLCAgLTMsIC0xMywgIDIxLCAgMTMsICAyNiwgIC03LCAgMzEsCisgICAgLTEwLCAgLTcsIC0xNiwgLTMzLCAtMzEsIC0xMCwgIDIyLCAgLTgsICAgMSwgIC0yLAorICAgIH0sIHsKKyAgICAgODIsICAtMSwgIC00LCAtMTksICAgNiwgLTI3LCAgLTYsIC0yOSwgLTEyLCAtMjYsCisgICAgICAxLCAtMjQsICAtNSwgLTE4LCAgMTcsICAxNywgIDE3LCAgIDYsICAxMCwgICAwLAorICAgICAtNywgIC0yLCAgLTksIC0xNiwgLTEyLCAgMTEsICAgMCwgIDExLCAgLTksICAyMywKKyAgICAgIDAsICAtMywgIC04LCAgLTgsIC0xMywgIC0xLCAgIDgsICAgNywgIC03LCAgIDYsCisgICAgfSwgeworICAgICA0OSwgICAyLCAgMjEsICAgMCwgICAxLCAgLTIsICAgOSwgICA4LCAgLTYsICAtNiwKKyAgICAgLTgsIC0xMCwgIC04LCAgIDksICAtMiwgICAwLCAgLTQsICAtMiwgLTEzLCAtMTIsCisgICAgLTIzLCAtMTUsIC0xMiwgLTE2LCAtMjYsICAyMSwgICAyLCAgMjEsIC0xMSwgIDIzLAorICAgICAtNCwgLTMzLCAgLTcsIC0zMywgIC02LCAgMTMsICAzNCwgICA1LCAgMjcsICAxMCwKKyAgICB9LCB7CisgICAgIDcxLCAtMTAsICAgOSwgLTE3LCAgLTEsIC0yMCwgIC0zLCAgLTgsIC0yMSwgLTE4LAorICAgICAtNiwgLTI0LCAgIDAsICAgMSwgICAwLCAgMTYsICAgNiwgIC01LCAgIDAsIC0xMywKKyAgICAtMTcsIC0xOSwgLTExLCAtMjksIC0yNSwgIDExLCAtMTEsICAgNiwgLTEzLCAgMTUsCisgICAgICA3LCAtMjksICAgMCwgIC04LCAgMTEsICAyMiwgIDIwLCAgMjEsICAxNywgIDE4LAorICAgIH0sIHsKKyAgICAgNjcsICAgOCwgIDE0LCAgMTEsICAtNywgLTExLCAtMTEsICAtOSwgIC03LCAgLTMsCisgICAgIDEzLCAgMTYsICAgOCwgICA5LCAgMjQsIC0xMiwgIDEwLCAtMTMsICAtNSwgLTE3LAorICAgICAtMiwgIC00LCAgIDMsIC0xMCwgICA2LCAgMTcsICAgNCwgIDE5LCAgIDAsICAxMSwKKyAgICAgLTYsICAxMywgIC05LCAtMzMsIC0xNCwgLTEwLCAgMTYsIC0xNywgLTEwLCAgLTQsCisgICAgfSwgeworICAgICA5MCwgIC0zLCAgIDIsICAtNiwgLTEwLCAtMjksIC0yNCwgLTI2LCAtMjEsIC0xNSwKKyAgICAgMTUsICAgMiwgIDE2LCAgIDEsICAyNSwgICA0LCAgMjEsIC0xNiwgICA2LCAtMTgsCisgICAgICAzLCAgLTgsICAgNSwgLTI0LCAgIDgsICAgNywgIC05LCAgIDQsICAtMSwgICAzLAorICAgICAgNSwgIDE4LCAgLTEsICAtNywgICAyLCAgLTEsICAgMiwgIC0xLCAtMTksICAgMywKKyAgICB9LCB7CisgICAgIDU3LCAgIDAsICAyNywgIDEzLCAtMTQsICAtNSwgIC03LCAgMTEsIC0xNSwgICA0LAorICAgICAgNSwgIDE2LCAgMTMsICAyOSwgICA2LCAtMTMsICAgMCwgLTI1LCAtMTYsIC0zMSwKKyAgICAtMTIsIC0yMiwgICAyLCAtMjMsICAtNiwgIDE2LCAgLTcsICAxNCwgIC0yLCAgIDMsCisgICAgICAwLCAtMTIsICAgMCwgLTMzLCAgIDksICAxMywgIDI4LCAgLTMsICAxNCwgICA3LAorICAgIH0sIHsKKyAgICAgNzksIC0xMSwgIDE1LCAgLTQsIC0xOCwgLTIzLCAtMjAsICAtNSwgLTMwLCAgLTcsCisgICAgICA3LCAgIDIsICAyMSwgIDIxLCAgIDgsICAgMywgIDEwLCAtMjgsICAtNCwgLTMxLAorICAgICAtNiwgLTI1LCAgIDMsIC0zNywgIC00LCAgIDcsIC0yMCwgICAwLCAgLTQsICAtNCwKKyAgICAgMTEsICAtNywgICA2LCAgLTgsICAyNywgIDIyLCAgMTQsICAxMiwgICA1LCAgMTYsCisgICAgfSwgeworICAgICA0NywgIDMwLCAgMTUsICAxNCwgIDE0LCAgIDksICAgOSwgLTIzLCAgMTMsIC0xMCwKKyAgICAtMTIsICAtNywgLTE2LCAtMTUsICAtMywgIC0zLCAgLTEsICAxNCwgICA5LCAgMTIsCisgICAgICA5LCAgIDgsICAgMCwgIDEwLCAtMTQsICAgNCwgIC05LCAgIDIsICAtNSwgICA4LAorICAgIC0xMywgIC0zLCAtMTgsIC0xMCwgLTQ1LCAgLTMsICAxNiwgIC00LCAgIDQsICAgMCwKKyAgICB9LCB7CisgICAgIDY5LCAgMTcsICAgMywgIC0zLCAgMTAsICAtOCwgIC0zLCAtNDAsICAtMSwgLTIxLAorICAgIC0xMCwgLTIxLCAgLTgsIC0yMywgIC0xLCAgMTMsICAgOCwgIDExLCAgMjEsICAxMSwKKyAgICAgMTUsICAgNCwgICAwLCAgLTIsIC0xMywgIC01LCAtMjMsIC0xMiwgIC03LCAgIDAsCisgICAgIC0xLCAgIDAsIC0xMCwgIDE0LCAtMjgsICAgNSwgICAxLCAgMTEsICAtNSwgICA3LAorICAgIH0sIHsKKyAgICAgMzYsICAyMSwgIDI4LCAgMTYsICAgNiwgIDE2LCAgMTIsICAtMiwgICA0LCAgLTIsCisgICAgLTIwLCAgLTcsIC0xMSwgICA0LCAtMjAsICAtNCwgLTEyLCAgIDIsICAtMSwgICAwLAorICAgICAgMCwgIC04LCAgLTIsICAtMiwgLTI3LCAgIDQsIC0yMSwgIC0yLCAgLTksICAgMCwKKyAgICAgLTYsIC0yOSwgIC05LCAtMTAsIC0yMSwgIDIxLCAgMjgsICAxMCwgIDI5LCAgMTEsCisgICAgfSwgeworICAgICA1OCwgICA5LCAgMTYsICAtMSwgICAyLCAgLTIsICAgMCwgLTE5LCAtMTAsIC0xMywKKyAgICAtMTcsIC0yMSwgIC0zLCAgLTMsIC0xOSwgIDEyLCAgLTIsICAgMCwgIDEwLCAgLTEsCisgICAgICA1LCAtMTIsICAgMCwgLTE1LCAtMjYsICAtNSwgLTM0LCAtMTYsIC0xMSwgIC03LAorICAgICAgNCwgLTI1LCAgLTIsICAxNCwgIC0zLCAgMjksICAxMywgIDI1LCAgMjAsICAyMCwKKyAgICB9LCB7CisgICAgIDU1LCAgMjgsICAyMSwgIDI3LCAgLTIsICAgNywgIC04LCAtMjAsICAgNCwgICAxLAorICAgICAgMSwgIDE4LCAgIDUsICAgNCwgICA1LCAtMTYsICAgMiwgIC04LCAgIDUsICAtNSwKKyAgICAgMTksICAgMiwgIDE0LCAgIDMsICAgNiwgICAwLCAtMTgsICAtNCwgICAyLCAtMTEsCisgICAgIC04LCAgMTgsIC0xMSwgLTEwLCAtMjksICAtMywgIDEwLCAtMTMsICAtOCwgIC0zLAorICAgIH0sIHsKKyAgICAgNzcsICAxNiwgICA5LCAgIDksICAtNiwgLTExLCAtMjEsIC0zNywgLTEwLCAtMTAsCisgICAgICA0LCAgIDUsICAxMywgIC0zLCAgIDcsICAgMCwgIDEzLCAtMTEsICAxNywgIC02LAorICAgICAyNSwgIC0xLCAgMTUsICAtOSwgICA3LCAgLTksIC0zMiwgLTE5LCAgIDAsIC0xOCwKKyAgICAgIDIsICAyMiwgIC0zLCAgMTUsIC0xMiwgICA1LCAgLTQsICAgMiwgLTE3LCAgIDUsCisgICAgfSwgeworICAgICA0NCwgIDIwLCAgMzQsICAyOSwgLTEwLCAgMTMsICAtNCwgICAwLCAgLTQsICAgOSwKKyAgICAgLTUsICAxOSwgIDEwLCAgMjQsIC0xMSwgLTE3LCAgLTgsIC0yMCwgIC01LCAtMTksCisgICAgICA5LCAtMTQsICAxMiwgIC05LCAgLTYsICAgMCwgLTMwLCAgLTksICAgMCwgLTE5LAorICAgICAtMiwgIC03LCAgLTIsIC0xMCwgIC01LCAgMjAsICAyMSwgICAxLCAgMTcsICAgOSwKKyAgICB9LCB7CisgICAgIDY2LCAgIDgsICAyMywgIDExLCAtMTQsICAtNSwgLTE3LCAtMTYsIC0xOSwgIC0yLAorICAgICAtMywgICA1LCAgMTgsICAxNywgLTEwLCAgIDAsICAgMSwgLTIzLCAgIDYsIC0yMCwKKyAgICAgMTUsIC0xOCwgIDE0LCAtMjIsICAtNSwgLTEwLCAtNDQsIC0yMywgIC0yLCAtMjYsCisgICAgICA5LCAgLTMsICAgNCwgIDE0LCAgMTIsICAyOSwgICA3LCAgMTYsICAgNywgIDE4LAorICAgIH0sIHsKKyAgICAgMTgsICAgOSwgLTE3LCAgLTQsICAxMSwgICAzLCAgIDAsICAxMSwgICA3LCAgIDQsCisgICAgIDEwLCAgIDMsICAxMCwgLTE4LCAgMjQsICAtMywgIDE0LCAgIDcsICAgNCwgIDEwLAorICAgIC0xNiwgICAxLCAtMjcsICAtNCwgLTI3LCAgMTcsICAxMiwgIDMwLCAgIDAsICAzNSwKKyAgICAgLTksICAtMywgLTEyLCAtMzYsIC0zNSwgLTMwLCAgLTIsIC0xMywgICAyLCAtMTEsCisgICAgfSwgeworICAgICA0MCwgIC0yLCAtMjksIC0yMiwgICA3LCAtMTQsIC0xMiwgIC01LCAgLTcsICAtNywKKyAgICAgMTIsICAtOSwgIDE4LCAtMjYsICAyNiwgIDE0LCAgMjQsICAgNCwgIDE2LCAgIDksCisgICAgLTEwLCAgLTIsIC0yNiwgLTE4LCAtMjYsICAgNywgIC0xLCAgMTUsICAtMSwgIDI3LAorICAgICAgMiwgICAwLCAgLTQsIC0xMSwgLTE3LCAtMjEsIC0xNiwgICAxLCAgLTcsICAtMywKKyAgICB9LCB7CisgICAgICA4LCAgIDEsICAtMywgIC0yLCAgIDMsICAxMCwgICAzLCAgMzIsICAtMSwgIDEyLAorICAgICAgMiwgICA0LCAgMTUsICAgMSwgICA3LCAgLTMsICAgMiwgIC00LCAgLTYsICAtMywKKyAgICAtMjYsIC0xNSwgLTI5LCAtMTcsIC00MCwgIDE3LCAgIDAsICAyNiwgIC0yLCAgMjcsCisgICAgIC0yLCAtMjksICAtNCwgLTM2LCAtMTAsICAtNiwgICA5LCAgIDAsICAyNywgICAwLAorICAgIH0sIHsKKyAgICAgMzAsIC0xMSwgLTE1LCAtMjAsICAgMCwgIC04LCAgLTksICAxNSwgLTE1LCAgIDAsCisgICAgICA1LCAgLTksICAyMywgIC02LCAgIDgsICAxMywgIDEzLCAgLTcsICAgNSwgIC0zLAorICAgIC0yMCwgLTE5LCAtMjcsIC0zMSwgLTM5LCAgIDcsIC0xMywgIDExLCAgLTQsICAxOSwKKyAgICAgIDgsIC0yNSwgICAzLCAtMTEsICAgNywgICAyLCAgLTQsICAxNiwgIDE4LCAgIDksCisgICAgfSwgeworICAgICAyNiwgICA3LCAtMTEsICAgOCwgIC01LCAgIDEsIC0xNywgIDE0LCAgLTEsICAxNSwKKyAgICAgMjQsICAzMCwgIDMyLCAgIDEsICAzMywgLTE2LCAgMTgsIC0xNCwgICAwLCAgLTgsCisgICAgIC02LCAgLTQsIC0xMiwgLTEyLCAgLTYsICAxMywgICAyLCAgMjMsICAgOCwgIDE1LAorICAgICAtNCwgIDE3LCAgLTUsIC0zNiwgLTE4LCAtMzAsICAtOCwgLTIyLCAtMTAsIC0xNCwKKyAgICB9LCB7CisgICAgIDQ4LCAgLTQsIC0yMywgIC05LCAgLTksIC0xNywgLTMwLCAgLTIsIC0xNiwgICAzLAorICAgICAyNiwgIDE2LCAgNDAsICAtNiwgIDM1LCAgIDEsICAyOCwgLTE3LCAgMTIsICAtOSwKKyAgICAgIDAsICAtOCwgLTExLCAtMjUsICAtNSwgICAzLCAtMTAsICAgOCwgICA2LCAgIDcsCisgICAgICA2LCAgMjIsICAgMSwgLTExLCAgLTEsIC0yMSwgLTIyLCAgLTcsIC0xOSwgIC01LAorICAgIH0sIHsKKyAgICAgMTUsICAgMCwgICAyLCAgMTAsIC0xMywgICA3LCAtMTQsICAzNSwgLTEwLCAgMjMsCisgICAgIDE2LCAgMzEsICAzNywgIDIxLCAgMTYsIC0xNywgICA2LCAtMjYsIC0xMCwgLTIxLAorICAgIC0xNiwgLTIxLCAtMTMsIC0yNSwgLTE5LCAgMTMsICAtOCwgIDE5LCAgIDUsICAgNywKKyAgICAgIDEsICAtOCwgICAyLCAtMzYsICAgNSwgIC02LCAgIDMsICAtOCwgIDE1LCAgLTEsCisgICAgfSwgeworICAgICAzNywgLTEyLCAgLTksICAtNywgLTE3LCAtMTEsIC0yNiwgIDE4LCAtMjUsICAxMiwKKyAgICAgMTksICAxNywgIDQ1LCAgMTQsICAxNywgICAwLCAgMTcsIC0zMCwgICAxLCAtMjIsCisgICAgLTEwLCAtMjUsIC0xMiwgLTM4LCAtMTgsICAgMywgLTIyLCAgIDQsICAgMywgICAwLAorICAgICAxMywgIC0zLCAgMTAsIC0xMSwgIDIzLCAgIDIsIC0xMCwgICA3LCAgIDUsICAgNywKKyAgICB9LCB7CisgICAgICA1LCAgMjksICAtOSwgIDExLCAgMTUsICAyMiwgICAzLCAgIDAsICAxOCwgICA4LAorICAgICAtMSwgICA2LCAgIDcsIC0yMywgICA2LCAgLTYsICAgNSwgIDEyLCAgMTUsICAyMSwKKyAgICAgIDUsICAgOCwgLTE3LCAgIDksIC0yOCwgICAwLCAtMTEsICAgNiwgICAyLCAgMTIsCisgICAgLTExLCAgIDAsIC0xNCwgLTEzLCAtNDksIC0yMiwgIC04LCAgLTksICAgNCwgIC05LAorICAgIH0sIHsKKyAgICAgMjcsICAxNiwgLTIxLCAgLTYsICAxMiwgICAzLCAgLTksIC0xNiwgICAzLCAgLTIsCisgICAgICAxLCAgLTcsICAxNSwgLTMxLCAgIDcsICAxMCwgIDE2LCAgIDksICAyNywgIDIxLAorICAgICAxMSwgICA1LCAtMTYsICAtMywgLTI2LCAgLTksIC0yNCwgIC03LCAgIDAsICAgNCwKKyAgICAgIDAsICAgNCwgIC02LCAgMTEsIC0zMiwgLTE0LCAtMjMsICAgNiwgIC01LCAgLTEsCisgICAgfSwgeworICAgICAtNCwgIDIwLCAgIDMsICAxMywgICA4LCAgMjgsICAgNiwgIDIxLCAgMTAsICAxNiwKKyAgICAgLTgsICAgNywgIDEyLCAgLTMsIC0xMSwgIC03LCAgLTUsICAgMCwgICA0LCAgIDgsCisgICAgIC00LCAgLTgsIC0xOCwgIC0zLCAtNDEsICAgMCwgLTIyLCAgIDIsICAgMCwgICA0LAorICAgICAtNSwgLTI1LCAgLTYsIC0xNCwgLTI1LCAgIDEsICAgMiwgICA0LCAgMjksICAgMiwKKyAgICB9LCB7CisgICAgIDE3LCAgIDgsICAtOCwgIC00LCAgIDQsICAxMCwgIC02LCAgIDUsICAtNCwgICA1LAorICAgICAtNiwgIC02LCAgMjAsIC0xMCwgIC05LCAgIDksICAgNCwgIC0yLCAgMTYsICAgNywKKyAgICAgIDEsIC0xMiwgLTE3LCAtMTYsIC0zOSwgIC05LCAtMzYsIC0xMiwgIC0yLCAgLTMsCisgICAgICA2LCAtMjEsICAgMSwgIDExLCAgLTcsICAxMCwgLTExLCAgMjAsICAyMCwgIDExLAorICAgIH0sIHsKKyAgICAgMTMsICAyNywgIC0zLCAgMjQsICAtMSwgIDE5LCAtMTQsICAgMywgICA5LCAgMjAsCisgICAgIDEyLCAgMzMsICAyOSwgIC0zLCAgMTUsIC0yMCwgICA5LCAgLTksICAxMSwgICAzLAorICAgICAxNiwgICAyLCAgLTIsICAgMiwgIC03LCAgLTMsIC0yMCwgICAwLCAgMTAsICAtNywKKyAgICAgLTcsICAyMiwgIC03LCAtMTMsIC0zMywgLTIzLCAtMTQsIC0xOCwgIC03LCAtMTIsCisgICAgfSwgeworICAgICAzNSwgIDE1LCAtMTUsICAgNiwgIC00LCAgIDEsIC0yNywgLTEyLCAgLTUsICAgOCwKKyAgICAgMTUsICAxOSwgIDM3LCAtMTEsICAxNiwgIC0yLCAgMjAsIC0xMiwgIDIzLCAgIDIsCisgICAgIDIyLCAgLTEsICAtMSwgLTExLCAgLTUsIC0xMywgLTM0LCAtMTQsICAgOCwgLTE0LAorICAgICAgNCwgIDI2LCAgIDAsICAxMSwgLTE2LCAtMTQsIC0yOSwgIC0yLCAtMTcsICAtMywKKyAgICB9LCB7CisgICAgICAzLCAgMTksICAgOSwgIDI2LCAgLTgsICAyNiwgLTEwLCAgMjQsICAgMCwgIDI4LAorICAgICAgNSwgIDMzLCAgMzQsICAxNywgIC0yLCAtMjAsICAtMSwgLTIyLCAgIDAsIC0xMCwKKyAgICAgIDYsIC0xNCwgIC0zLCAtMTAsIC0yMCwgIC00LCAtMzIsICAtNCwgICA3LCAtMTUsCisgICAgICAwLCAgLTMsICAgMCwgLTEzLCAgLTksICAgMCwgIC0zLCAgLTQsICAxNywgICAwLAorICAgIH0sIHsKKyAgICAgMjUsICAgNywgIC0yLCAgIDgsIC0xMiwgICA3LCAtMjMsICAgOCwgLTEzLCAgMTYsCisgICAgICA3LCAgMjAsICA0MiwgICA5LCAgIDAsICAtMywgICA5LCAtMjUsICAxMiwgLTEwLAorICAgICAxMiwgLTE4LCAgLTIsIC0yNCwgLTE5LCAtMTMsIC00NiwgLTE5LCAgIDUsIC0yMiwKKyAgICAgMTAsICAgMCwgICA4LCAgMTEsICAgOCwgICA5LCAtMTcsICAxMSwgICA3LCAgIDgsCisgICAgfSwgeworICAgIC0yNSwgIC03LCAgIDIsICAtOCwgIDEyLCAgLTcsICAyMywgIC04LCAgMTMsIC0xNiwKKyAgICAgLTcsIC0yMCwgLTQyLCAgLTksICAgMCwgICAzLCAgLTksICAyNSwgLTEyLCAgMTAsCisgICAgLTEyLCAgMTgsICAgMiwgIDI0LCAgMTksICAxMywgIDQ2LCAgMTksICAtNSwgIDIyLAorICAgIC0xMCwgICAwLCAgLTgsIC0xMSwgIC04LCAgLTksICAxNywgLTExLCAgLTcsICAtOCwKKyAgICB9LCB7CisgICAgIC0zLCAtMTksICAtOSwgLTI2LCAgIDgsIC0yNiwgIDEwLCAtMjQsICAgMCwgLTI4LAorICAgICAtNSwgLTMzLCAtMzQsIC0xNywgICAyLCAgMjAsICAgMSwgIDIyLCAgIDAsICAxMCwKKyAgICAgLTYsICAxNCwgICAzLCAgMTAsICAyMCwgICA0LCAgMzIsICAgNCwgIC03LCAgMTUsCisgICAgICAwLCAgIDMsICAgMCwgIDEzLCAgIDksICAgMCwgICAzLCAgIDQsIC0xNywgICAwLAorICAgIH0sIHsKKyAgICAtMzUsIC0xNSwgIDE1LCAgLTYsICAgNCwgIC0xLCAgMjcsICAxMiwgICA1LCAgLTgsCisgICAgLTE1LCAtMTksIC0zNywgIDExLCAtMTYsICAgMiwgLTIwLCAgMTIsIC0yMywgIC0yLAorICAgIC0yMiwgICAxLCAgIDEsICAxMSwgICA1LCAgMTMsICAzNCwgIDE0LCAgLTgsICAxNCwKKyAgICAgLTQsIC0yNiwgICAwLCAtMTEsICAxNiwgIDE0LCAgMjksICAgMiwgIDE3LCAgIDMsCisgICAgfSwgeworICAgIC0xMywgLTI3LCAgIDMsIC0yNCwgICAxLCAtMTksICAxNCwgIC0zLCAgLTksIC0yMCwKKyAgICAtMTIsIC0zMywgLTI5LCAgIDMsIC0xNSwgIDIwLCAgLTksICAgOSwgLTExLCAgLTMsCisgICAgLTE2LCAgLTIsICAgMiwgIC0yLCAgIDcsICAgMywgIDIwLCAgIDAsIC0xMCwgICA3LAorICAgICAgNywgLTIyLCAgIDcsICAxMywgIDMzLCAgMjMsICAxNCwgIDE4LCAgIDcsICAxMiwKKyAgICB9LCB7CisgICAgLTE3LCAgLTgsICAgOCwgICA0LCAgLTQsIC0xMCwgICA2LCAgLTUsICAgNCwgIC01LAorICAgICAgNiwgICA2LCAtMjAsICAxMCwgICA5LCAgLTksICAtNCwgICAyLCAtMTYsICAtNywKKyAgICAgLTEsICAxMiwgIDE3LCAgMTYsICAzOSwgICA5LCAgMzYsICAxMiwgICAyLCAgIDMsCisgICAgIC02LCAgMjEsICAtMSwgLTExLCAgIDcsIC0xMCwgIDExLCAtMjAsIC0yMCwgLTExLAorICAgIH0sIHsKKyAgICAgIDQsIC0yMCwgIC0zLCAtMTMsICAtOCwgLTI4LCAgLTYsIC0yMSwgLTEwLCAtMTYsCisgICAgICA4LCAgLTcsIC0xMiwgICAzLCAgMTEsICAgNywgICA1LCAgIDAsICAtNCwgIC04LAorICAgICAgNCwgICA4LCAgMTgsICAgMywgIDQxLCAgIDAsICAyMiwgIC0yLCAgIDAsICAtNCwKKyAgICAgIDUsICAyNSwgICA2LCAgMTQsICAyNSwgIC0xLCAgLTIsICAtNCwgLTI5LCAgLTIsCisgICAgfSwgeworICAgIC0yNywgLTE2LCAgMjEsICAgNiwgLTEyLCAgLTMsICAgOSwgIDE2LCAgLTMsICAgMiwKKyAgICAgLTEsICAgNywgLTE1LCAgMzEsICAtNywgLTEwLCAtMTYsICAtOSwgLTI3LCAtMjEsCisgICAgLTExLCAgLTUsICAxNiwgICAzLCAgMjYsICAgOSwgIDI0LCAgIDcsICAgMCwgIC00LAorICAgICAgMCwgIC00LCAgIDYsIC0xMSwgIDMyLCAgMTQsICAyMywgIC02LCAgIDUsICAgMSwKKyAgICB9LCB7CisgICAgIC01LCAtMjksICAgOSwgLTExLCAtMTUsIC0yMiwgIC0zLCAgIDAsIC0xOCwgIC04LAorICAgICAgMSwgIC02LCAgLTcsICAyMywgIC02LCAgIDYsICAtNSwgLTEyLCAtMTUsIC0yMSwKKyAgICAgLTUsICAtOCwgIDE3LCAgLTksICAyOCwgICAwLCAgMTEsICAtNiwgIC0yLCAtMTIsCisgICAgIDExLCAgIDAsICAxNCwgIDEzLCAgNDksICAyMiwgICA4LCAgIDksICAtNCwgICA5LAorICAgIH0sIHsKKyAgICAtMzcsICAxMiwgICA5LCAgIDcsICAxNywgIDExLCAgMjYsIC0xOCwgIDI1LCAtMTIsCisgICAgLTE5LCAtMTcsIC00NSwgLTE0LCAtMTcsICAgMCwgLTE3LCAgMzAsICAtMSwgIDIyLAorICAgICAxMCwgIDI1LCAgMTIsICAzOCwgIDE4LCAgLTMsICAyMiwgIC00LCAgLTMsICAgMCwKKyAgICAtMTMsICAgMywgLTEwLCAgMTEsIC0yMywgIC0yLCAgMTAsICAtNywgIC01LCAgLTcsCisgICAgfSwgeworICAgIC0xNSwgICAwLCAgLTIsIC0xMCwgIDEzLCAgLTcsICAxNCwgLTM1LCAgMTAsIC0yMywKKyAgICAtMTYsIC0zMSwgLTM3LCAtMjEsIC0xNiwgIDE3LCAgLTYsICAyNiwgIDEwLCAgMjEsCisgICAgIDE2LCAgMjEsICAxMywgIDI1LCAgMTksIC0xMywgICA4LCAtMTksICAtNSwgIC03LAorICAgICAtMSwgICA4LCAgLTIsICAzNiwgIC01LCAgIDYsICAtMywgICA4LCAtMTUsICAgMSwKKyAgICB9LCB7CisgICAgLTQ4LCAgIDQsICAyMywgICA5LCAgIDksICAxNywgIDMwLCAgIDIsICAxNiwgIC0zLAorICAgIC0yNiwgLTE2LCAtNDAsICAgNiwgLTM1LCAgLTEsIC0yOCwgIDE3LCAtMTIsICAgOSwKKyAgICAgIDAsICAgOCwgIDExLCAgMjUsICAgNSwgIC0zLCAgMTAsICAtOCwgIC02LCAgLTcsCisgICAgIC02LCAtMjIsICAtMSwgIDExLCAgIDEsICAyMSwgIDIyLCAgIDcsICAxOSwgICA1LAorICAgIH0sIHsKKyAgICAtMjYsICAtNywgIDExLCAgLTgsICAgNSwgIC0xLCAgMTcsIC0xNCwgICAxLCAtMTUsCisgICAgLTI0LCAtMzAsIC0zMiwgIC0xLCAtMzMsICAxNiwgLTE4LCAgMTQsICAgMCwgICA4LAorICAgICAgNiwgICA0LCAgMTIsICAxMiwgICA2LCAtMTMsICAtMiwgLTIzLCAgLTgsIC0xNSwKKyAgICAgIDQsIC0xNywgICA1LCAgMzYsICAxOCwgIDMwLCAgIDgsICAyMiwgIDEwLCAgMTQsCisgICAgfSwgeworICAgIC0zMCwgIDExLCAgMTUsICAyMCwgICAwLCAgIDgsICAgOSwgLTE1LCAgMTUsICAgMCwKKyAgICAgLTUsICAgOSwgLTIzLCAgIDYsICAtOCwgLTEzLCAtMTMsICAgNywgIC01LCAgIDMsCisgICAgIDIwLCAgMTksICAyNywgIDMxLCAgMzksICAtNywgIDEzLCAtMTEsICAgNCwgLTE5LAorICAgICAtOCwgIDI1LCAgLTMsICAxMSwgIC03LCAgLTIsICAgNCwgLTE2LCAtMTgsICAtOSwKKyAgICB9LCB7CisgICAgIC04LCAgLTEsICAgMywgICAyLCAgLTMsIC0xMCwgIC0zLCAtMzIsICAgMSwgLTEyLAorICAgICAtMiwgIC00LCAtMTUsICAtMSwgIC03LCAgIDMsICAtMiwgICA0LCAgIDYsICAgMywKKyAgICAgMjYsICAxNSwgIDI5LCAgMTcsICA0MCwgLTE3LCAgIDAsIC0yNiwgICAyLCAtMjcsCisgICAgICAyLCAgMjksICAgNCwgIDM2LCAgMTAsICAgNiwgIC05LCAgIDAsIC0yNywgICAwLAorICAgIH0sIHsKKyAgICAtNDAsICAgMiwgIDI5LCAgMjIsICAtNywgIDE0LCAgMTIsICAgNSwgICA3LCAgIDcsCisgICAgLTEyLCAgIDksIC0xOCwgIDI2LCAtMjYsIC0xNCwgLTI0LCAgLTQsIC0xNiwgIC05LAorICAgICAxMCwgICAyLCAgMjYsICAxOCwgIDI2LCAgLTcsICAgMSwgLTE1LCAgIDEsIC0yNywKKyAgICAgLTIsICAgMCwgICA0LCAgMTEsICAxNywgIDIxLCAgMTYsICAtMSwgICA3LCAgIDMsCisgICAgfSwgeworICAgIC0xOCwgIC05LCAgMTcsICAgNCwgLTExLCAgLTMsICAgMCwgLTExLCAgLTcsICAtNCwKKyAgICAtMTAsICAtMywgLTEwLCAgMTgsIC0yNCwgICAzLCAtMTQsICAtNywgIC00LCAtMTAsCisgICAgIDE2LCAgLTEsICAyNywgICA0LCAgMjcsIC0xNywgLTEyLCAtMzAsICAgMCwgLTM1LAorICAgICAgOSwgICAzLCAgMTIsICAzNiwgIDM1LCAgMzAsICAgMiwgIDEzLCAgLTIsICAxMSwKKyAgICB9LCB7CisgICAgLTY2LCAgLTgsIC0yMywgLTExLCAgMTQsICAgNSwgIDE3LCAgMTYsICAxOSwgICAyLAorICAgICAgMywgIC01LCAtMTgsIC0xNywgIDEwLCAgIDAsICAtMSwgIDIzLCAgLTYsICAyMCwKKyAgICAtMTUsICAxOCwgLTE0LCAgMjIsICAgNSwgIDEwLCAgNDQsICAyMywgICAyLCAgMjYsCisgICAgIC05LCAgIDMsICAtNCwgLTE0LCAtMTIsIC0yOSwgIC03LCAtMTYsICAtNywgLTE4LAorICAgIH0sIHsKKyAgICAtNDQsIC0yMCwgLTM0LCAtMjksICAxMCwgLTEzLCAgIDQsICAgMCwgICA0LCAgLTksCisgICAgICA1LCAtMTksIC0xMCwgLTI0LCAgMTEsICAxNywgICA4LCAgMjAsICAgNSwgIDE5LAorICAgICAtOSwgIDE0LCAtMTIsICAgOSwgICA2LCAgIDAsICAzMCwgICA5LCAgIDAsICAxOSwKKyAgICAgIDIsICAgNywgICAyLCAgMTAsICAgNSwgLTIwLCAtMjEsICAtMSwgLTE3LCAgLTksCisgICAgfSwgeworICAgIC03NywgLTE2LCAgLTksICAtOSwgICA2LCAgMTEsICAyMSwgIDM3LCAgMTAsICAxMCwKKyAgICAgLTQsICAtNSwgLTEzLCAgIDMsICAtNywgICAwLCAtMTMsICAxMSwgLTE3LCAgIDYsCisgICAgLTI1LCAgIDEsIC0xNSwgICA5LCAgLTcsICAgOSwgIDMyLCAgMTksICAgMCwgIDE4LAorICAgICAtMiwgLTIyLCAgIDMsIC0xNSwgIDEyLCAgLTUsICAgNCwgIC0yLCAgMTcsICAtNSwKKyAgICB9LCB7CisgICAgLTU1LCAtMjgsIC0yMSwgLTI3LCAgIDIsICAtNywgICA4LCAgMjAsICAtNCwgIC0xLAorICAgICAtMSwgLTE4LCAgLTUsICAtNCwgIC01LCAgMTYsICAtMiwgICA4LCAgLTUsICAgNSwKKyAgICAtMTksICAtMiwgLTE0LCAgLTMsICAtNiwgICAwLCAgMTgsICAgNCwgIC0yLCAgMTEsCisgICAgICA4LCAtMTgsICAxMSwgIDEwLCAgMjksICAgMywgLTEwLCAgMTMsICAgOCwgICAzLAorICAgIH0sIHsKKyAgICAtNTgsICAtOSwgLTE2LCAgIDEsICAtMiwgICAyLCAgIDAsICAxOSwgIDEwLCAgMTMsCisgICAgIDE3LCAgMjEsICAgMywgICAzLCAgMTksIC0xMiwgICAyLCAgIDAsIC0xMCwgICAxLAorICAgICAtNSwgIDEyLCAgIDAsICAxNSwgIDI2LCAgIDUsICAzNCwgIDE2LCAgMTEsICAgNywKKyAgICAgLTQsICAyNSwgICAyLCAtMTQsICAgMywgLTI5LCAtMTMsIC0yNSwgLTIwLCAtMjAsCisgICAgfSwgeworICAgIC0zNiwgLTIxLCAtMjgsIC0xNiwgIC02LCAtMTYsIC0xMiwgICAyLCAgLTQsICAgMiwKKyAgICAgMjAsICAgNywgIDExLCAgLTQsICAyMCwgICA0LCAgMTIsICAtMiwgICAxLCAgIDAsCisgICAgICAwLCAgIDgsICAgMiwgICAyLCAgMjcsICAtNCwgIDIxLCAgIDIsICAgOSwgICAwLAorICAgICAgNiwgIDI5LCAgIDksICAxMCwgIDIxLCAtMjEsIC0yOCwgLTEwLCAtMjksIC0xMSwKKyAgICB9LCB7CisgICAgLTY5LCAtMTcsICAtMywgICAzLCAtMTAsICAgOCwgICAzLCAgNDAsICAgMSwgIDIxLAorICAgICAxMCwgIDIxLCAgIDgsICAyMywgICAxLCAtMTMsICAtOCwgLTExLCAtMjEsIC0xMSwKKyAgICAtMTUsICAtNCwgICAwLCAgIDIsICAxMywgICA1LCAgMjMsICAxMiwgICA3LCAgIDAsCisgICAgICAxLCAgIDAsICAxMCwgLTE0LCAgMjgsICAtNSwgIC0xLCAtMTEsICAgNSwgIC03LAorICAgIH0sIHsKKyAgICAtNDcsIC0zMCwgLTE1LCAtMTQsIC0xNCwgIC05LCAgLTksICAyMywgLTEzLCAgMTAsCisgICAgIDEyLCAgIDcsICAxNiwgIDE1LCAgIDMsICAgMywgICAxLCAtMTQsICAtOSwgLTEyLAorICAgICAtOSwgIC04LCAgIDAsIC0xMCwgIDE0LCAgLTQsICAgOSwgIC0yLCAgIDUsICAtOCwKKyAgICAgMTMsICAgMywgIDE4LCAgMTAsICA0NSwgICAzLCAtMTYsICAgNCwgIC00LCAgIDAsCisgICAgfSwgeworICAgIC03OSwgIDExLCAtMTUsICAgNCwgIDE4LCAgMjMsICAyMCwgICA1LCAgMzAsICAgNywKKyAgICAgLTcsICAtMiwgLTIxLCAtMjEsICAtOCwgIC0zLCAtMTAsICAyOCwgICA0LCAgMzEsCisgICAgICA2LCAgMjUsICAtMywgIDM3LCAgIDQsICAtNywgIDIwLCAgIDAsICAgNCwgICA0LAorICAgIC0xMSwgICA3LCAgLTYsICAgOCwgLTI3LCAtMjIsIC0xNCwgLTEyLCAgLTUsIC0xNiwKKyAgICB9LCB7CisgICAgLTU3LCAgIDAsIC0yNywgLTEzLCAgMTQsICAgNSwgICA3LCAtMTEsICAxNSwgIC00LAorICAgICAtNSwgLTE2LCAtMTMsIC0yOSwgIC02LCAgMTMsICAgMCwgIDI1LCAgMTYsICAzMSwKKyAgICAgMTIsICAyMiwgIC0yLCAgMjMsICAgNiwgLTE2LCAgIDcsIC0xNCwgICAyLCAgLTMsCisgICAgICAwLCAgMTIsICAgMCwgIDMzLCAgLTksIC0xMywgLTI4LCAgIDMsIC0xNCwgIC03LAorICAgIH0sIHsKKyAgICAtOTAsICAgMywgIC0yLCAgIDYsICAxMCwgIDI5LCAgMjQsICAyNiwgIDIxLCAgMTUsCisgICAgLTE1LCAgLTIsIC0xNiwgIC0xLCAtMjUsICAtNCwgLTIxLCAgMTYsICAtNiwgIDE4LAorICAgICAtMywgICA4LCAgLTUsICAyNCwgIC04LCAgLTcsICAgOSwgIC00LCAgIDEsICAtMywKKyAgICAgLTUsIC0xOCwgICAxLCAgIDcsICAtMiwgICAxLCAgLTIsICAgMSwgIDE5LCAgLTMsCisgICAgfSwgeworICAgIC02NywgIC04LCAtMTQsIC0xMSwgICA3LCAgMTEsICAxMSwgICA5LCAgIDcsICAgMywKKyAgICAtMTMsIC0xNiwgIC04LCAgLTksIC0yNCwgIDEyLCAtMTAsICAxMywgICA1LCAgMTcsCisgICAgICAyLCAgIDQsICAtMywgIDEwLCAgLTYsIC0xNywgIC00LCAtMTksICAgMCwgLTExLAorICAgICAgNiwgLTEzLCAgIDksICAzMywgIDE0LCAgMTAsIC0xNiwgIDE3LCAgMTAsICAgNCwKKyAgICB9LCB7CisgICAgLTcxLCAgMTAsICAtOSwgIDE3LCAgIDEsICAyMCwgICAzLCAgIDgsICAyMSwgIDE4LAorICAgICAgNiwgIDI0LCAgIDAsICAtMSwgICAwLCAtMTYsICAtNiwgICA1LCAgIDAsICAxMywKKyAgICAgMTcsICAxOSwgIDExLCAgMjksICAyNSwgLTExLCAgMTEsICAtNiwgIDEzLCAtMTUsCisgICAgIC03LCAgMjksICAgMCwgICA4LCAtMTEsIC0yMiwgLTIwLCAtMjEsIC0xNywgLTE4LAorICAgIH0sIHsKKyAgICAtNDksICAtMiwgLTIxLCAgIDAsICAtMSwgICAyLCAgLTksICAtOCwgICA2LCAgIDYsCisgICAgICA4LCAgMTAsICAgOCwgIC05LCAgIDIsICAgMCwgICA0LCAgIDIsICAxMywgIDEyLAorICAgICAyMywgIDE1LCAgMTIsICAxNiwgIDI2LCAtMjEsICAtMiwgLTIxLCAgMTEsIC0yMywKKyAgICAgIDQsICAzMywgICA3LCAgMzMsICAgNiwgLTEzLCAtMzQsICAtNSwgLTI3LCAtMTAsCisgICAgfSwgeworICAgIC04MiwgICAxLCAgIDQsICAxOSwgIC02LCAgMjcsICAgNiwgIDI5LCAgMTIsICAyNiwKKyAgICAgLTEsICAyNCwgICA1LCAgMTgsIC0xNywgLTE3LCAtMTcsICAtNiwgLTEwLCAgIDAsCisgICAgICA3LCAgIDIsICAgOSwgIDE2LCAgMTIsIC0xMSwgICAwLCAtMTEsICAgOSwgLTIzLAorICAgICAgMCwgICAzLCAgIDgsICAgOCwgIDEzLCAgIDEsICAtOCwgIC03LCAgIDcsICAtNiwKKyAgICB9LCB7CisgICAgLTYwLCAtMTAsICAtNywgICAxLCAgLTksICAgOCwgIC02LCAgMTMsICAtMiwgIDE1LAorICAgICAgMSwgIDEwLCAgMTMsICAxMSwgLTE1LCAgIDAsICAtNiwgIC05LCAgIDEsICAgMCwKKyAgICAgMTMsICAtMSwgIDExLCAgIDMsICAxMywgLTIxLCAtMTMsIC0yNiwgICA3LCAtMzEsCisgICAgIDEwLCAgIDcsICAxNiwgIDMzLCAgMzEsICAxMCwgLTIyLCAgIDgsICAtMSwgICAyLAorICAgIH0sIHsKKyAgICAgLTMsICAgNywgIC01LCAgLTUsICAgOCwgIC0yLCAgMTcsICAtOSwgIDE4LCAtMjQsCisgICAgIC0yLCAtMTksIC0xMCwgIC00LCAgMjgsICAxNywgICA1LCAgMjgsICAtMiwgICA3LAorICAgICAtNCwgIDE1LCAgIDcsICAgOCwgICA2LCAgMjMsICAxMywgIDIxLCAtMTQsICAyMCwKKyAgICAtMTcsIC0xOCwgLTExLCAtMzMsIC0zMCwgLTExLCAgMjMsIC0xMywgIC01LCAgLTksCisgICAgfSwgeworICAgICAxOCwgIC00LCAtMTcsIC0yMywgICA0LCAtMjAsICAgNCwgLTI2LCAgIDMsIC0zNiwKKyAgICAgIDAsIC0zMiwgIC0yLCAtMTIsICAyOSwgIDM0LCAgMTYsICAyNCwgIDEwLCAgIDYsCisgICAgICAwLCAgMTIsICAgOCwgIC00LCAgIDgsICAxMywgICAwLCAgIDYsIC0xNiwgIDEyLAorICAgICAtNSwgLTEzLCAgLTMsICAtNywgLTEzLCAgLTMsICAgOCwgICAyLCAtMTQsICAgMCwKKyAgICB9LCB7CisgICAgLTEzLCAgIDAsICAgOCwgIC0zLCAgIDAsICAgNCwgIDIxLCAgMTEsICAgOSwgLTE2LAorICAgIC0xMCwgLTE4LCAgLTUsICAxNiwgIDEwLCAgMTYsICAtNSwgIDE1LCAtMTMsICAtNSwKKyAgICAtMTUsICAtMSwgICA2LCAgLTQsICAtNiwgIDIzLCAgIDIsICAxNiwgLTE3LCAgMTIsCisgICAgLTEwLCAtNDQsICAtMywgLTMzLCAgLTYsICAxMiwgIDM0LCAgIDEsICAyMCwgICAzLAorICAgIH0sIHsKKyAgICAgIDgsIC0xMiwgIC0zLCAtMjEsICAtMywgLTE0LCAgIDgsICAtNSwgIC00LCAtMjgsCisgICAgIC03LCAtMzIsICAgMiwgICA4LCAgMTIsICAzNCwgICA0LCAgMTIsICAtMSwgIC02LAorICAgICAtOSwgIC00LCAgIDcsIC0xNywgIC00LCAgMTMsIC0xMSwgICAxLCAtMTksICAgNCwKKyAgICAgIDAsIC0zOSwgICA0LCAgLTcsICAxMSwgIDIxLCAgMjAsICAxNiwgIDEwLCAgMTEsCisgICAgfSwgeworICAgICAgNCwgICA2LCAgIDAsICAgNywgIC04LCAgLTQsICAgMCwgIC02LCAgIDksIC0xMywKKyAgICAgMTEsICAgNywgIDExLCAgMTUsICAzNywgICA0LCAgIDksICAgNSwgIC01LCAtMTEsCisgICAgICA1LCAgIDksICAyMiwgICAxLCAgMjcsICAxOCwgICA0LCAgMTQsICAtNSwgICAwLAorICAgIC0xMiwgICAzLCAgLTQsIC0zMiwgLTE0LCAtMTIsICAxNywgLTIyLCAtMTcsIC0xMSwKKyAgICB9LCB7CisgICAgIDI2LCAgLTYsIC0xMSwgLTEwLCAtMTIsIC0yMywgLTEyLCAtMjMsICAtNSwgLTI0LAorICAgICAxMywgIC01LCAgMTksICAgOCwgIDM4LCAgMjEsICAyMCwgICAyLCAgIDYsIC0xMiwKKyAgICAgMTEsICAgNSwgIDIzLCAtMTEsICAyOSwgICA5LCAgLTksICAgMCwgIC03LCAgLTYsCisgICAgIC0xLCAgIDcsICAgMiwgIC03LCAgIDMsICAtMywgICAyLCAgLTYsIC0yNywgIC0zLAorICAgIH0sIHsKKyAgICAgLTYsICAtMiwgIDE0LCAgIDksIC0xNiwgICAxLCAgIDMsICAxNCwgICAwLCAgLTUsCisgICAgICAzLCAgIDgsICAxNiwgIDM2LCAgMTksICAgMywgIC0xLCAgLTYsIC0xNywgLTI0LAorICAgICAtNCwgIC03LCAgMjEsIC0xMSwgIDE0LCAgMTgsICAtNywgICA5LCAgLTksICAtNywKKyAgICAgLTYsIC0yMiwgICAzLCAtMzMsICAxMCwgIDExLCAgMjgsICAtNywgICA3LCAgIDAsCisgICAgfSwgeworICAgICAxNiwgLTE0LCAgIDIsICAtOCwgLTIwLCAtMTcsICAtOSwgIC0yLCAtMTQsIC0xNiwKKyAgICAgIDYsICAtNSwgIDI0LCAgMjgsICAyMSwgIDIwLCAgIDgsICAtOSwgIC00LCAtMjUsCisgICAgICAxLCAtMTEsICAyMiwgLTI0LCAgMTUsICAgOCwgLTIxLCAgLTUsIC0xMSwgLTE0LAorICAgICAgNSwgLTE4LCAgMTEsICAtNywgIDI3LCAgMjAsICAxNCwgICA3LCAgLTEsICAgOSwKKyAgICB9LCB7CisgICAgLTE2LCAgMjcsICAgMiwgIDEwLCAgMTMsICAxNiwgIDIwLCAtMjAsICAyOSwgLTIwLAorICAgIC0xNCwgLTE2LCAtMTMsICAtOCwgICA5LCAgMTMsICAtMiwgIDMzLCAgIDksICAxOSwKKyAgICAgMTcsICAyMywgIDE3LCAgMjIsICAgNiwgICA2LCAgLTksICAtMiwgLTEyLCAgLTIsCisgICAgLTIwLCAtMTMsIC0xMywgLTEwLCAtNDUsICAtNCwgIDE2LCAgLTgsICAtMiwgIC03LAorICAgIH0sIHsKKyAgICAgIDUsICAxNSwgIC05LCAgLTcsICAgOSwgIC0yLCAgIDgsIC0zNywgIDE0LCAtMzEsCisgICAgLTExLCAtMjksICAtNSwgLTE2LCAgMTEsICAzMCwgICA3LCAgMjksICAyMSwgIDE4LAorICAgICAyMywgIDE5LCAgMTgsICAgOSwgICA3LCAgLTMsIC0yMywgLTE3LCAtMTQsICAtOSwKKyAgICAgLTgsICAtOSwgIC02LCAgMTUsIC0yNywgICA0LCAgIDIsICAgNiwgLTEyLCAgIDEsCisgICAgfSwgeworICAgIC0yNiwgIDE5LCAgMTUsICAxMiwgICA1LCAgMjIsICAyNCwgICAwLCAgMjEsIC0xMiwKKyAgICAtMjEsIC0xNSwgIC04LCAgMTEsICAtNywgIDEyLCAtMTQsICAyMCwgIC0yLCAgIDYsCisgICAgICA3LCAgIDYsICAxNiwgICA5LCAgLTYsICAgNSwgLTIxLCAgLTcsIC0xNSwgLTEwLAorICAgIC0xMywgLTM5LCAgLTUsIC0xMCwgLTIwLCAgMTksICAyOCwgICA1LCAgMjIsICAgNSwKKyAgICB9LCB7CisgICAgIC00LCAgIDYsICAgMywgIC01LCAgIDEsICAgNCwgIDExLCAtMTYsICAgNiwgLTIzLAorICAgIC0xOSwgLTI5LCAgIDAsICAgMywgIC02LCAgMzAsICAtMywgIDE3LCAgMTAsICAgNSwKKyAgICAgMTMsICAgMiwgIDE3LCAgLTMsICAtNSwgIC0zLCAtMzUsIC0yMSwgLTE3LCAtMTcsCisgICAgIC0yLCAtMzUsICAgMiwgIDE1LCAgLTMsICAyOCwgIDEzLCAgMjEsICAxMywgIDEzLAorICAgIH0sIHsKKyAgICAgLTgsICAyNSwgICA4LCAgMjMsICAtMywgIDEzLCAgIDMsIC0xNywgIDIwLCAgLTgsCisgICAgICAwLCAgMTAsICAgOCwgIDExLCAgMTgsICAgMCwgICAxLCAgMTAsICAgNSwgICAwLAorICAgICAyOCwgIDE3LCAgMzIsICAxNSwgIDI2LCAgIDEsIC0xOSwgIC05LCAgLTMsIC0yMSwKKyAgICAtMTUsICAgNywgIC02LCAgLTksIC0yOSwgIC01LCAgMTAsIC0xNywgLTE1LCAgLTksCisgICAgfSwgeworICAgICAxMywgIDEzLCAgLTMsICAgNSwgIC03LCAgLTQsICAtOSwgLTM0LCAgIDUsIC0yMCwKKyAgICAgIDIsICAtMywgIDE2LCAgIDMsICAyMCwgIDE3LCAgMTEsICAgNywgIDE3LCAgIDAsCisgICAgIDM0LCAgMTMsICAzMywgICAyLCAgMjgsICAtOCwgLTMyLCAtMjQsICAtNSwgLTI5LAorICAgICAtMywgIDEyLCAgIDAsICAxNSwgLTExLCAgIDMsICAtMywgIC0yLCAtMjQsICAtMSwKKyAgICB9LCB7CisgICAgLTE4LCAgMTcsICAyMSwgIDI1LCAtMTEsICAxOSwgICA2LCAgIDMsICAxMSwgICAwLAorICAgICAtNywgIDExLCAgMTMsICAzMSwgICAxLCAgIDAsICAtOSwgIC0xLCAgLTUsIC0xMiwKKyAgICAgMTgsICAgMCwgIDMxLCAgIDIsICAxMywgICAxLCAtMzAsIC0xNCwgIC03LCAtMjksCisgICAgIC05LCAtMTgsICAgMSwgLTEwLCAgLTQsICAxOCwgIDIyLCAgLTMsICAxMCwgICAyLAorICAgIH0sIHsKKyAgICAgIDMsICAgNSwgICA5LCAgIDcsIC0xNSwgICAxLCAgLTUsIC0xMywgIC0yLCAtMTIsCisgICAgIC01LCAgLTIsICAyMSwgIDIzLCAgIDIsICAxNiwgICAwLCAgLTUsICAgNiwgLTEzLAorICAgICAyMywgIC0zLCAgMzIsIC0xMCwgIDE1LCAgLTgsIC00NCwgLTI4LCAgLTksIC0zNywKKyAgICAgIDIsIC0xMywgICA5LCAgMTUsICAxMiwgIDI3LCAgIDcsICAxMiwgICAwLCAgMTEsCisgICAgfSwgeworICAgIC00NCwgICA2LCAtMzAsICAtOCwgICA5LCAgMTAsICAxMSwgIDE0LCAgMjMsICAtNSwKKyAgICAgIDgsICAtNCwgIDE0LCAtMTIsICAzNywgIDE0LCAgMTIsICAyNiwgICA0LCAgMTYsCisgICAgIC04LCAgMTYsICAtOSwgICA3LCAgLTYsICAxOSwgIDEyLCAgMjUsICAtNSwgIDI0LAorICAgIC0xNSwgLTEzLCAgLTgsIC0zNiwgLTM0LCAtMzEsICAtMSwgLTE4LCAgLTQsIC0xOCwKKyAgICB9LCB7CisgICAgLTIyLCAgLTUsIC00MiwgLTI2LCAgIDYsICAtOCwgIC0xLCAgLTIsICAgOSwgLTE3LAorICAgICAxMCwgLTE4LCAgMjEsIC0xOSwgIDM5LCAgMzEsICAyMywgIDIzLCAgMTYsICAxNSwKKyAgICAgLTIsICAxMiwgIC03LCAgLTYsICAtNSwgICA5LCAgLTEsICAxMCwgIC03LCAgMTYsCisgICAgIC00LCAgLTksICAgMCwgLTEwLCAtMTcsIC0yMiwgLTE2LCAgLTIsIC0xNCwgIC05LAorICAgIH0sIHsKKyAgICAtNTUsICAtMSwgLTE3LCAgLTYsICAgMSwgIDE2LCAgMTUsICAzNSwgIDE1LCAgIDIsCisgICAgICAwLCAgLTQsICAxOSwgICA4LCAgMjAsICAxMywgICAxLCAgMTQsICAtNywgICAzLAorICAgIC0xOCwgICAwLCAtMTAsICAtNSwgLTE5LCAgMTksICAgMCwgIDIxLCAgLTgsICAxNiwKKyAgICAgLTksIC0zOSwgICAwLCAtMzYsIC0xMCwgIC03LCAgIDksICAtNCwgIDIwLCAgLTUsCisgICAgfSwgeworICAgIC0zMywgLTEzLCAtMjksIC0yNCwgIC0xLCAgLTEsICAgMiwgIDE4LCAgIDAsICAtOSwKKyAgICAgIDMsIC0xNywgIDI3LCAgIDAsICAyMSwgIDMwLCAgMTIsICAxMSwgICA1LCAgIDIsCisgICAgLTEyLCAgLTQsICAtOSwgLTE5LCAtMTgsICAgOSwgLTEzLCAgIDYsIC0xMSwgICA4LAorICAgICAgMiwgLTM1LCAgIDgsIC0xMCwgICA3LCAgIDEsICAtNCwgIDExLCAgMTAsICAgMiwKKyAgICB9LCB7CisgICAgLTM2LCAgIDUsIC0yNCwgICA0LCAgLTcsICAgNywgIC02LCAgMTcsICAxNCwgICA1LAorICAgICAyMiwgIDIyLCAgMzUsICAgOCwgIDQ2LCAgIDEsICAxNywgICAzLCAgIDAsICAtMiwKKyAgICAgIDIsICAxMCwgICA1LCAgIDAsICAxNCwgIDE1LCAgIDIsICAxOCwgICAyLCAgIDQsCisgICAgLTExLCAgIDcsICAtMSwgLTM2LCAtMTgsIC0zMiwgIC03LCAtMjcsIC0xNywgLTIwLAorICAgIH0sIHsKKyAgICAtMTQsICAtNywgLTM2LCAtMTMsIC0xMCwgLTEwLCAtMTgsICAgMCwgICAwLCAgLTUsCisgICAgIDI1LCAgIDgsICA0MywgICAwLCAgNDgsICAxOCwgIDI3LCAgIDAsICAxMiwgIC0zLAorICAgICAgNywgICA2LCAgIDcsIC0xMywgIDE1LCAgIDUsIC0xMSwgICAzLCAgIDAsICAtMiwKKyAgICAgIDAsICAxMiwgICA2LCAtMTAsICAgMCwgLTIzLCAtMjIsIC0xMSwgLTI2LCAtMTIsCisgICAgfSwgeworICAgIC00NywgIC0zLCAtMTEsICAgNiwgLTE1LCAgMTMsICAtMiwgIDM4LCAgIDYsICAxMywKKyAgICAgMTUsICAyMiwgIDQwLCAgMjgsICAyOCwgICAwLCAgIDUsICAtOCwgLTEwLCAtMTUsCisgICAgIC03LCAgLTcsICAgNCwgLTEzLCAgIDEsICAxNCwgIC05LCAgMTQsICAgMCwgIC0yLAorICAgICAtNCwgLTE4LCAgIDcsIC0zNiwgICA2LCAgLTgsICAgMywgLTEzLCAgIDcsICAtOCwKKyAgICB9LCB7CisgICAgLTI1LCAtMTUsIC0yMiwgLTExLCAtMTgsICAtNCwgLTE1LCAgMjIsICAtOCwgICAyLAorICAgICAxNywgICA5LCAgNDgsICAyMCwgIDMwLCAgMTcsICAxNiwgLTExLCAgIDEsIC0xNiwKKyAgICAgLTIsIC0xMCwgICA1LCAtMjYsICAgMiwgICA0LCAtMjIsICAgMCwgIC0yLCAtMTAsCisgICAgICA2LCAtMTMsICAxNCwgLTEwLCAgMjMsICAgMCwgLTEwLCAgIDIsICAtMSwgICAwLAorICAgIH0sIHsKKyAgICAtNTcsICAyNiwgLTIyLCAgIDcsICAxNCwgIDI4LCAgMTQsICAgMywgIDM1LCAgIDAsCisgICAgIC0zLCAgLTEsICAxMSwgLTE2LCAgMTgsICAxMCwgICA0LCAgMzEsICAxNSwgIDI4LAorICAgICAxNCwgIDIzLCAgIDEsICAyMSwgIC03LCAgIDIsIC0xMSwgICAxLCAgLTMsICAgMSwKKyAgICAtMTgsICAtOSwgLTEwLCAtMTMsIC00OSwgLTI0LCAgLTgsIC0xNCwgIC0yLCAtMTYsCisgICAgfSwgeworICAgIC0zNSwgIDE0LCAtMzQsIC0xMCwgIDEwLCAgMTAsICAgMSwgLTEyLCAgMjAsIC0xMiwKKyAgICAgIDAsIC0xNSwgIDE4LCAtMjQsICAyMCwgIDI3LCAgMTQsICAyOCwgIDI3LCAgMjcsCisgICAgIDIwLCAgMTksICAgMiwgICA4LCAgLTUsICAtNywgLTI1LCAtMTMsICAtNSwgIC01LAorICAgICAtNiwgIC01LCAgLTIsICAxMiwgLTMxLCAtMTUsIC0yMywgICAxLCAtMTIsICAtOCwKKyAgICB9LCB7CisgICAgLTY4LCAgMTgsICAtOSwgICA5LCAgIDYsICAzNSwgIDE4LCAgMjUsICAyNiwgICA3LAorICAgIC0xMCwgIC0xLCAgMTYsICAgMywgICAxLCAgIDksICAtNiwgIDE5LCAgIDQsICAxNSwKKyAgICAgIDQsICAgNiwgICAwLCAgIDgsIC0yMCwgICAyLCAtMjMsICAtMiwgIC03LCAgLTUsCisgICAgLTEyLCAtMzUsICAtMSwgLTEzLCAtMjQsICAgMCwgICAzLCAgIDAsICAyMiwgIC00LAorICAgIH0sIHsKKyAgICAtNDYsICAgNiwgLTIxLCAgLTgsICAgMiwgIDE2LCAgIDUsICAgOCwgIDExLCAgLTQsCisgICAgIC04LCAtMTUsICAyNCwgIC00LCAgIDIsICAyNiwgICAzLCAgMTYsICAxNiwgIDE0LAorICAgICAgOSwgICAyLCAgIDEsICAtNCwgLTE5LCAgLTcsIC0zNiwgLTE3LCAgLTksIC0xMywKKyAgICAgIDAsIC0zMSwgICA1LCAgMTIsICAtNywgICA4LCAtMTEsICAxNSwgIDEzLCAgIDQsCisgICAgfSwgeworICAgIC00OSwgIDI0LCAtMTYsICAyMCwgIC0yLCAgMjYsICAtMiwgICA3LCAgMjUsICAxMCwKKyAgICAgMTEsICAyNSwgIDMyLCAgIDMsICAyNywgIC0yLCAgIDgsICAgOCwgIDExLCAgIDksCisgICAgIDI0LCAgMTcsICAxNiwgIDE0LCAgMTMsICAtMiwgLTIwLCAgLTUsICAgNCwgLTE3LAorICAgIC0xNCwgIDEyLCAgLTMsIC0xMywgLTMzLCAtMjUsIC0xNCwgLTIzLCAtMTUsIC0xOSwKKyAgICB9LCB7CisgICAgLTI3LCAgMTIsIC0yOCwgICAyLCAgLTYsICAgNywgLTE1LCAgLTksICAxMSwgIC0xLAorICAgICAxMywgIDExLCAgNDAsICAtNCwgIDI5LCAgMTQsICAxOSwgICA1LCAgMjMsICAgOCwKKyAgICAgMzAsICAxMywgIDE3LCAgIDAsICAxNCwgLTEyLCAtMzQsIC0yMCwgICAyLCAtMjUsCisgICAgIC0yLCAgMTYsICAgNCwgIDEyLCAtMTUsIC0xNiwgLTI5LCAgLTcsIC0yNCwgLTEwLAorICAgIH0sIHsKKyAgICAtNjAsICAxNiwgIC0zLCAgMjIsIC0xMCwgIDMyLCAgIDAsICAyOCwgIDE3LCAgMTgsCisgICAgICAzLCAgMjUsICAzNywgIDIzLCAgMTAsICAtMywgIC0yLCAgLTMsICAgMCwgIC0zLAorICAgICAxNCwgICAwLCAgMTQsICAgMSwgICAwLCAgLTIsIC0zMiwgIC05LCAgIDEsIC0yNSwKKyAgICAgLTcsIC0xMywgICA1LCAtMTMsICAtOCwgIC0xLCAgLTIsICAtOCwgIDEwLCAgLTYsCisgICAgfSwgeworICAgIC0zOCwgICA0LCAtMTUsICAgNCwgLTE0LCAgMTMsIC0xMiwgIDExLCAgIDIsICAgNiwKKyAgICAgIDYsICAxMSwgIDQ1LCAgMTYsICAxMSwgIDEzLCAgIDcsICAtNiwgIDEyLCAgLTQsCisgICAgIDIwLCAgLTMsICAxNiwgLTEyLCAgIDEsIC0xMiwgLTQ2LCAtMjQsICAgMCwgLTMzLAorICAgICAgMywgIC05LCAgMTIsICAxMiwgICA4LCAgIDcsIC0xNywgICA2LCAgIDAsICAgMgorICAgIH0KK307CisKK2NvbnN0IGludDhfdCBmZl9jYjJfdmVjdHNbMTI4XVs0MF09eworICAgIHsKKyAgICAgNzMsIC0zMiwgLTYwLCAtMTUsIC0yNiwgIDU5LCAgIDIsIC0zMywgIDMwLCAtMTAsCisgICAgIC0zLCAtMTcsICAgOCwgIDMwLCAgLTEsIC0yNiwgIC00LCAtMjIsICAxMCwgIDE2LAorICAgIC0zNiwgIC01LCAtMTEsICA1NiwgIDM3LCAgIDYsIC0xMCwgIC01LCAtMTMsICAtMywKKyAgICAgIDYsICAtNSwgIDExLCAgIDQsIC0xOSwgIC01LCAtMTYsICA0MSwgIDI0LCAgMTMsCisgICAgfSwgeworICAgICAgNCwgLTExLCAtMzcsICAyMywgIC01LCAgNDYsICAtMiwgLTI5LCAgLTUsIC0zOSwKKyAgICAtMjEsICAtOSwgICAwLCAgNDksICAxMiwgIC05LCAtMTYsIC0yNiwgIDIyLCAgMTUsCisgICAgLTQ1LCAtMjAsICAtNSwgIDQwLCAgMjIsICAxNywgLTI2LCAgMzEsIC0xNCwgICAyLAorICAgIC0xNCwgIDEwLCAgMzAsICAyMCwgLTI3LCAgLTksIC0zOSwgIDM5LCAgMTgsICAgNSwKKyAgICB9LCB7CisgICAgIDM0LCAtMjUsIC00OCwgLTI4LCAtMTEsICAzNCwgIC0yLCAtNDEsICAgOSwgIC03LAorICAgIC0xNywgIDIxLCAgMjAsICAyNCwgLTE3LCAtMzMsICAgMCwgLTI0LCAgMTAsICA0MiwKKyAgICAgIDMsICAtNSwgIDEwLCAgNDIsICAxMSwgICA4LCAgLTMsICAgMywgIDE2LCAgIDksCisgICAgIDIyLCAgLTIsICAgMCwgLTMzLCAtMTAsICAxOCwgICA3LCAgNTgsICAxMCwgIDI4LAorICAgIH0sIHsKKyAgICAtMzQsICAtNCwgLTI1LCAgMTAsICAgOSwgIDIxLCAgLTcsIC0zNiwgLTI2LCAtMzYsCisgICAgLTM1LCAgMjgsICAxMiwgIDQyLCAgLTMsIC0xNiwgLTEyLCAtMjgsICAyMSwgIDQyLAorICAgICAtNSwgLTIxLCAgMTYsICAyNiwgIC00LCAgMTksIC0xOSwgIDM5LCAgMTUsICAxNSwKKyAgICAgIDEsICAxMywgIDE5LCAtMTcsIC0xNywgIDE0LCAtMTUsICA1NSwgICA0LCAgMTksCisgICAgfSwgeworICAgICAyOCwgLTIwLCAtNTEsIC0xNCwgIC02LCAgIDcsICAgMCwgLTI2LCAgMjcsICAtNCwKKyAgICAgMTgsIC00MCwgIC02LCAgMTYsICAtMSwgLTE1LCAgIDAsIC01NSwgIC01LCAtMTYsCisgICAgLTE5LCAgMTQsICAtMywgIDQ5LCAgMTQsICAgMSwgLTIyLCAtMzAsIC0xMiwgICAwLAorICAgICAyNCwgIDE1LCAgIDksIC0xNywgLTQ1LCAtMjksICAgNCwgIDI4LCAgNTEsICAzNSwKKyAgICB9LCB7CisgICAgLTQwLCAgIDAsIC0yOCwgIDI0LCAgMTQsICAtNSwgIC00LCAtMjEsICAtNywgLTMzLAorICAgICAgMCwgLTMyLCAtMTUsICAzNSwgIDEyLCAgIDEsIC0xMSwgLTU4LCAgIDUsIC0xNiwKKyAgICAtMjgsICAgMCwgICAxLCAgMzMsICAgMCwgIDExLCAtMzksICAgNSwgLTE0LCAgIDYsCisgICAgICAzLCAgMzEsICAyOCwgIC0xLCAtNTMsIC0zMywgLTE5LCAgMjUsICA0NiwgIDI2LAorICAgIH0sIHsKKyAgICAtMTEsIC0xNCwgLTM5LCAtMjcsICAgOSwgLTE3LCAgLTQsIC0zMywgICA2LCAgIDAsCisgICAgICA0LCAgLTEsICAgNSwgIDEwLCAtMTcsIC0yMiwgICA1LCAtNTcsICAtNSwgICA5LAorICAgICAyMCwgIDEzLCAgMTgsICAzNSwgLTExLCAgIDMsIC0xNiwgLTIyLCAgMTcsICAxMywKKyAgICAgNDAsICAxOSwgIC0xLCAtNTUsIC0zNSwgIC01LCAgMjcsICA0NCwgIDM3LCAgNDksCisgICAgfSwgeworICAgIC04MCwgICA2LCAtMTYsICAxMSwgIDMwLCAtMzAsICAtOSwgLTI4LCAtMjgsIC0yOSwKKyAgICAtMTMsICAgNiwgIC0yLCAgMjgsICAtMywgIC01LCAgLTcsIC02MCwgICA1LCAgIDksCisgICAgIDExLCAgLTEsICAyNCwgIDE5LCAtMjcsICAxMywgLTMyLCAgMTMsICAxNSwgIDE5LAorICAgICAxOSwgIDM1LCAgMTcsIC0zOSwgLTQzLCAgLTksICAgNCwgIDQyLCAgMzIsICA0MSwKKyAgICB9LCB7CisgICAgIDc4LCAtMjEsIC00MywgICA0LCAtMzgsICAxNywgIDE3LCAgLTUsICA1NSwgIDI0LAorICAgIC0xNSwgLTM2LCAgMTQsICAgNCwgIDI0LCAtMjQsICAxMiwgICA1LCAgMTcsICAzMSwKKyAgICAtNTQsICAtNSwgIC0yLCAgMjcsICA0MywgLTEyLCAgIDIsICAgOSwgIC05LCAtMTUsCisgICAgIDIyLCAgLTMsICAyOCwgIDIxLCAtMjAsICAgMywgIDIwLCAgMjgsICAgOSwgIC01LAorICAgIH0sIHsKKyAgICAgIDksICAtMSwgLTIwLCAgNDMsIC0xNywgICAzLCAgMTIsICAgMCwgIDIwLCAgLTQsCisgICAgLTMzLCAtMjksICAgNiwgIDIyLCAgMzgsICAtNywgICAwLCAgIDEsICAyOSwgIDMwLAorICAgIC02MywgLTIxLCAgIDMsICAxMSwgIDI3LCAgLTEsIC0xNCwgIDQ1LCAtMTAsICAtOSwKKyAgICAgIDEsICAxMiwgIDQ3LCAgMzcsIC0yOCwgICAwLCAgLTIsICAyNiwgICA0LCAtMTMsCisgICAgfSwgeworICAgICAzOSwgLTE0LCAtMzAsICAtOCwgLTIyLCAgLTgsICAxMiwgLTEyLCAgMzQsICAyNywKKyAgICAtMjksICAgMiwgIDI2LCAgLTIsICAgOCwgLTMxLCAgMTYsICAgMywgIDE3LCAgNTcsCisgICAgLTE0LCAgLTYsICAxOSwgIDEzLCAgMTYsIC0xMCwgICA4LCAgMTcsICAyMCwgIC0yLAorICAgICAzOCwgICAwLCAgMTcsIC0xNiwgLTExLCAgMjcsICA0NCwgIDQ1LCAgLTQsICAgOCwKKyAgICB9LCB7CisgICAgLTI5LCAgIDUsICAtNywgIDMwLCAgLTEsIC0yMSwgICA3LCAgLTcsICAgMCwgICAwLAorICAgIC00NywgICA5LCAgMTgsICAxNSwgIDIyLCAtMTQsICAgNCwgICAwLCAgMjgsICA1NywKKyAgICAtMjMsIC0yMSwgIDI1LCAgLTIsICAgMSwgICAwLCAgLTcsICA1MywgIDE5LCAgIDMsCisgICAgIDE3LCAgMTUsICAzNiwgICAwLCAtMTksICAyNCwgIDIxLCAgNDMsICAtOSwgICAwLAorICAgIH0sIHsKKyAgICAgMzMsIC0xMCwgLTM0LCAgIDUsIC0xNywgLTM1LCAgMTUsICAgMSwgIDUzLCAgMzAsCisgICAgICA2LCAtNTksICAgMCwgLTEwLCAgMjQsIC0xMywgIDE3LCAtMjcsICAgMSwgIC0xLAorICAgIC0zNywgIDEzLCAgIDQsICAyMCwgIDIwLCAtMTgsIC0xMCwgLTE2LCAgLTgsIC0xMSwKKyAgICAgMzksICAxOCwgIDI2LCAgIDAsIC00NiwgLTIwLCAgNDEsICAxNSwgIDM3LCAgMTUsCisgICAgfSwgeworICAgIC0zNSwgIDEwLCAtMTEsICA0NCwgICAzLCAtNDgsICAxMCwgICA2LCAgMTcsICAgMiwKKyAgICAtMTEsIC01MSwgIC04LCAgIDgsICAzOCwgICAzLCAgIDQsIC0zMSwgIDEyLCAgLTIsCisgICAgLTQ2LCAgLTEsICAxMCwgICA0LCAgIDUsICAtNywgLTI2LCAgMTksIC0xMCwgIC01LAorICAgICAxOCwgIDM0LCAgNDUsICAxNSwgLTU0LCAtMjQsICAxOCwgIDEzLCAgMzEsICAgNywKKyAgICB9LCB7CisgICAgIC01LCAgLTMsIC0yMSwgIC03LCAgLTIsIC02MCwgIDEwLCAgLTUsICAzMiwgIDM0LAorICAgICAtNywgLTIwLCAgMTEsIC0xNiwgICA4LCAtMjAsICAyMSwgLTI5LCAgIDEsICAyNCwKKyAgICAgIDIsICAxMywgIDI3LCAgIDYsICAtNSwgLTE1LCAgLTMsICAtOCwgIDIxLCAgIDEsCisgICAgIDU1LCAgMjEsICAxNSwgLTM4LCAtMzcsICAgMywgIDY1LCAgMzIsICAyMywgIDMwLAorICAgIH0sIHsKKyAgICAtNzQsICAxNywgICAwLCAgMzEsICAxOCwgLTczLCAgIDUsICAgMCwgIC0zLCAgIDUsCisgICAgLTI1LCAtMTIsICAgMywgICAxLCAgMjIsICAtMywgICA5LCAtMzMsICAxMiwgIDI0LAorICAgICAtNiwgIC0yLCAgMzMsICAtOSwgLTIxLCAgLTUsIC0yMCwgIDI3LCAgMTksICAgNywKKyAgICAgMzQsICAzNywgIDM0LCAtMjIsIC00NCwgICAwLCAgNDEsICAyOSwgIDE3LCAgMjEsCisgICAgfSwgeworICAgICA3NiwgLTM1LCAtMzEsIC0yOCwgLTQ5LCAgNDMsIC00MCwgICAwLCAgMjksIC0xNCwKKyAgICAgIDgsICAgNSwgIDEwLCAgMTgsIC0yNiwgLTQ2LCAgIDAsICAgNywgICA2LCAgIDMsCisgICAgLTI1LCAgLTcsICAtMiwgIDQwLCAgMjgsICAxNCwgIDE4LCAgLTMsIC0yNywgLTI4LAorICAgICAtOCwgLTQ1LCAtMTMsICAzNCwgLTEzLCAtMjcsIC0xNSwgIDMxLCAgMTIsICAgMywKKyAgICB9LCB7CisgICAgICA3LCAtMTUsICAtOSwgICA5LCAtMjgsICAyOSwgLTQ1LCAgIDUsICAtNiwgLTQzLAorICAgICAtOSwgIDEyLCAgIDIsICAzNiwgLTEyLCAtMzAsIC0xMSwgICAzLCAgMTcsICAgMywKKyAgICAtMzQsIC0yMiwgICAzLCAgMjQsICAxMiwgIDI0LCAgIDIsICAzMiwgLTI4LCAtMjIsCisgICAgLTI5LCAtMjksICAgNSwgIDUwLCAtMjEsIC0zMSwgLTM4LCAgMjksICAgNywgIC01LAorICAgIH0sIHsKKyAgICAgMzYsIC0yOSwgLTE5LCAtNDEsIC0zNCwgIDE4LCAtNDUsICAtNiwgICA4LCAtMTAsCisgICAgIC01LCAgNDMsICAyMywgIDExLCAtNDIsIC01MywgICA1LCAgIDUsICAgNiwgIDMwLAorICAgICAxNCwgIC04LCAgMjAsICAyNiwgICAxLCAgMTYsICAyNSwgICA0LCAgIDMsIC0xNSwKKyAgICAgIDcsIC00MSwgLTIzLCAgLTMsICAtNCwgIC0zLCAgIDgsICA0OCwgIC0xLCAgMTcsCisgICAgfSwgeworICAgIC0zMiwgIC04LCAgIDMsICAtMiwgLTEzLCAgIDQsIC01MCwgIC0xLCAtMjcsIC0zOSwKKyAgICAtMjMsICA1MSwgIDE1LCAgMzAsIC0yNywgLTM3LCAgLTcsICAgMSwgIDE3LCAgMjksCisgICAgICA1LCAtMjMsICAyNSwgIDEwLCAtMTQsICAyNiwgICA4LCAgNDEsICAgMSwgIC05LAorICAgIC0xMywgLTI2LCAgLTUsICAxMiwgLTEyLCAgLTcsIC0xNCwgIDQ1LCAgLTYsICAgOSwKKyAgICB9LCB7CisgICAgIDMxLCAtMjQsIC0yMywgLTI3LCAtMjksICAtOSwgLTQzLCAgIDgsICAyNiwgIC03LAorICAgICAzMCwgLTE3LCAgLTQsICAgMywgLTI2LCAtMzUsICAgNSwgLTI0LCAtMTAsIC0yOCwKKyAgICAgLTksICAxMiwgICA1LCAgMzMsICAgNSwgICA4LCAgIDUsIC0yOSwgLTI2LCAtMjQsCisgICAgICA5LCAtMjMsIC0xNCwgIDEyLCAtMzksIC01MiwgICA1LCAgMTgsICAzOSwgIDI0LAorICAgIH0sIHsKKyAgICAtMzcsICAtMywgICAwLCAgMTAsICAtNywgLTIyLCAtNDgsICAxMiwgIC04LCAtMzYsCisgICAgIDEyLCAgLTksIC0xMiwgIDIyLCAtMTIsIC0xOSwgIC02LCAtMjgsICAgMCwgLTI5LAorICAgIC0xOCwgIC0zLCAgMTEsICAxNywgLTEwLCAgMTgsIC0xMCwgICA3LCAtMjcsIC0xOCwKKyAgICAtMTEsICAtNywgICAzLCAgMjgsIC00NywgLTU1LCAtMTgsICAxNSwgIDM0LCAgMTYsCisgICAgfSwgeworICAgICAtOCwgLTE3LCAtMTAsIC00MCwgLTEzLCAtMzQsIC00NywgICAwLCAgIDUsICAtNCwKKyAgICAgMTYsICAyMSwgICA4LCAgLTIsIC00MiwgLTQzLCAgMTAsIC0yNiwgLTEwLCAgLTIsCisgICAgIDMxLCAgMTEsICAyNywgIDE5LCAtMjEsICAxMCwgIDEyLCAtMjAsICAgMywgLTExLAorICAgICAyNSwgLTIwLCAtMjUsIC0yNSwgLTI5LCAtMjgsICAyOCwgIDM0LCAgMjUsICAzOCwKKyAgICB9LCB7CisgICAgLTc3LCAgIDIsICAxMSwgIC0xLCAgIDcsIC00NywgLTUyLCAgIDUsIC0yOSwgLTMzLAorICAgICAtMSwgIDI4LCAgIDAsICAxNSwgLTI4LCAtMjYsICAtMiwgLTMwLCAgIDAsICAtMiwKKyAgICAgMjIsICAtNCwgIDMzLCAgIDMsIC0zNiwgIDIxLCAgLTMsICAxNSwgICAyLCAgLTUsCisgICAgICA0LCAgLTQsICAtNiwgIC05LCAtMzcsIC0zMSwgICA1LCAgMzIsICAyMCwgIDMwLAorICAgIH0sIHsKKyAgICAgODEsIC0yNSwgLTE0LCAgLTgsIC02MSwgICAwLCAtMjUsICAyOCwgIDU0LCAgMjAsCisgICAgIC0zLCAtMTQsICAxNywgIC04LCAgIDAsIC00NCwgIDE2LCAgMzUsICAxMywgIDE4LAorICAgIC00MywgIC03LCAgIDYsICAxMSwgIDMzLCAgLTQsICAzMCwgIDExLCAtMjIsIC00MCwKKyAgICAgIDYsIC00MywgICAzLCAgNTAsIC0xNCwgLTE4LCAgMjIsICAxOCwgIC0xLCAtMTYsCisgICAgfSwgeworICAgICAxMiwgIC00LCAgIDgsICAyOSwgLTM5LCAtMTIsIC0zMCwgIDMzLCAgMTksICAtOCwKKyAgICAtMjEsICAtNiwgICA4LCAgIDksICAxMywgLTI4LCAgIDQsICAzMSwgIDI0LCAgMTgsCisgICAgLTUyLCAtMjMsICAxMiwgIC00LCAgMTgsICAgNSwgIDE0LCAgNDcsIC0yNCwgLTM0LAorICAgIC0xNCwgLTI3LCAgMjIsICA2NiwgLTIyLCAtMjIsICAtMSwgIDE2LCAgLTYsIC0yNCwKKyAgICB9LCB7CisgICAgIDQxLCAtMTgsICAtMiwgLTIxLCAtNDUsIC0yNCwgLTMwLCAgMjEsICAzMywgIDI0LAorICAgIC0xNywgIDI0LCAgMjksIC0xNSwgLTE2LCAtNTEsICAyMSwgIDMzLCAgMTMsICA0NSwKKyAgICAgLTMsICAtOCwgIDI4LCAgLTIsICAgNywgIC0yLCAgMzcsICAxOSwgICA3LCAtMjcsCisgICAgIDIyLCAtMzksICAtNywgIDEyLCAgLTUsICAgNSwgIDQ1LCAgMzUsIC0xNSwgIC0xLAorICAgIH0sIHsKKyAgICAtMjcsICAgMSwgIDIwLCAgMTcsIC0yNCwgLTM4LCAtMzUsICAyNiwgIC0xLCAgLTQsCisgICAgLTM1LCAgMzIsICAyMSwgICAzLCAgLTIsIC0zNSwgICA4LCAgMjksICAyNCwgIDQ0LAorICAgIC0xMiwgLTI0LCAgMzQsIC0xOCwgIC04LCAgIDcsICAyMSwgIDU1LCAgIDUsIC0yMSwKKyAgICAgIDIsIC0yMywgIDExLCAgMjgsIC0xMywgICAxLCAgMjIsICAzMywgLTIxLCAtMTAsCisgICAgfSwgeworICAgICAzNiwgLTEzLCAgLTUsICAtNywgLTQwLCAtNTEsIC0yOCwgIDM2LCAgNTIsICAyNywKKyAgICAgMTgsIC0zNiwgICAyLCAtMjIsICAgMCwgLTMzLCAgMjEsICAgMiwgIC0zLCAtMTMsCisgICAgLTI2LCAgMTEsICAxNCwgICA0LCAgMTAsIC0xMCwgIDE4LCAtMTQsIC0yMiwgLTM2LAorICAgICAyNCwgLTIxLCAgIDEsICAyOCwgLTQwLCAtNDIsICA0MiwgICA1LCAgMjUsICAgNSwKKyAgICB9LCB7CisgICAgLTMyLCAgIDYsICAxNywgIDMxLCAtMTksIC02NSwgLTMzLCAgNDEsICAxNiwgIC0xLAorICAgICAgMCwgLTI5LCAgLTYsICAtNCwgIDEzLCAtMTcsICAgOSwgIC0xLCAgIDgsIC0xNCwKKyAgICAtMzUsICAtMywgIDE5LCAtMTEsICAtNCwgICAwLCAgIDEsICAyMSwgLTIzLCAtMzAsCisgICAgICAzLCAgLTUsICAyMCwgIDQ0LCAtNDgsIC00NiwgIDE5LCAgIDMsICAyMCwgIC0zLAorICAgIH0sIHsKKyAgICAgLTMsICAtNywgICA2LCAtMjAsIC0yNSwgLTc3LCAtMzIsICAyOSwgIDMxLCAgMzAsCisgICAgICA0LCAgIDIsICAxNCwgLTI5LCAtMTYsIC00MCwgIDI2LCAgIDAsICAtMywgIDEyLAorICAgICAxMywgIDEwLCAgMzYsICAtOSwgLTE1LCAgLTgsICAyNCwgIC02LCAgIDcsIC0yMiwKKyAgICAgNDAsIC0xNywgIC04LCAgLTksIC0zMSwgLTE4LCAgNjYsICAyMiwgIDExLCAgMTksCisgICAgfSwgeworICAgIC03MiwgIDEzLCAgMjksICAxOCwgIC00LCAtOTAsIC0zNywgIDM0LCAgLTQsICAgMSwKKyAgICAtMTMsICAgOSwgICA2LCAtMTEsICAtMiwgLTI0LCAgMTMsICAtMywgICA3LCAgMTEsCisgICAgICA0LCAgLTQsICA0MiwgLTI1LCAtMzEsICAgMSwgICA4LCAgMjksICAgNiwgLTE3LAorICAgICAxOSwgIC0yLCAgMTAsICAgNiwgLTM4LCAtMjIsICA0MiwgIDE5LCAgIDYsICAxMSwKKyAgICB9LCB7CisgICAgMTE2LCAtMjAsIC02OCwgLTMwLCAtMjgsICA4MywgIDI4LCAtMTgsICAzMiwgLTIyLAorICAgIC0xMywgLTIxLCAgIDUsICAyOCwgICA1LCAgLTcsIC0yNCwgIC04LCAtMjIsICAxNywKKyAgICAtMjMsICAzMCwgLTI1LCAgNDUsICAxNSwgIC05LCAtMTEsIC0xOCwgIDIyLCAtMTAsCisgICAgICA0LCAgLTIsICAxOSwgLTEyLCAgMjMsICAgMywgLTQzLCAgIDIsICAxMiwgIC00LAorICAgIH0sIHsKKyAgICAgNDcsICAgMCwgLTQ1LCAgIDcsICAtNywgIDY5LCAgMjMsIC0xMywgIC0yLCAtNTEsCisgICAgLTMyLCAtMTQsICAtMywgIDQ3LCAgMTksICAgOCwgLTM3LCAtMTEsIC0xMCwgIDE2LAorICAgIC0zMiwgIDE1LCAtMTksICAyOSwgICAwLCAgIDEsIC0yOCwgIDE4LCAgMjAsICAtNCwKKyAgICAtMTYsICAxMywgIDM4LCAgIDMsICAxNSwgICAwLCAtNjYsICAgMCwgICA3LCAtMTMsCisgICAgfSwgeworICAgICA3NywgLTEzLCAtNTYsIC00MywgLTEzLCAgNTcsICAyMywgLTI2LCAgMTEsIC0xOSwKKyAgICAtMjcsICAxNiwgIDE3LCAgMjIsIC0xMCwgLTE1LCAtMTksIC0xMCwgLTIyLCAgNDMsCisgICAgIDE2LCAgMzAsICAtMiwgIDMxLCAtMTEsICAtNiwgIC01LCAgLTksICA1MiwgICAyLAorICAgICAyMCwgICAwLCAgIDgsIC01MCwgIDMzLCAgMjcsIC0xOSwgIDE5LCAgLTEsICAgOSwKKyAgICB9LCB7CisgICAgICA4LCAgIDYsIC0zMywgIC00LCAgIDcsICA0NCwgIDE4LCAtMjEsIC0yMywgLTQ4LAorICAgIC00NiwgIDI0LCAgIDksICA0MCwgICAzLCAgIDEsIC0zMiwgLTEzLCAtMTEsICA0MywKKyAgICAgIDcsICAxNCwgICAzLCAgMTUsIC0yNiwgICAzLCAtMjEsICAyNiwgIDUwLCAgIDgsCisgICAgICAwLCAgMTYsICAyNywgLTM0LCAgMjUsICAyMywgLTQzLCAgMTcsICAtNiwgICAxLAorICAgIH0sIHsKKyAgICAgNzEsICAtOSwgLTU5LCAtMjksICAtOCwgIDMwLCAgMjYsIC0xMSwgIDMwLCAtMTYsCisgICAgICA4LCAtNDQsICAtOSwgIDE0LCAgIDUsICAgMiwgLTE5LCAtNDAsIC0zOCwgLTE1LAorICAgICAtNywgIDUwLCAtMTcsICAzOCwgIC03LCAtMTQsIC0yNCwgLTQzLCAgMjIsICAtNiwKKyAgICAgMjIsICAxOSwgIDE3LCAtMzQsICAtMiwgLTIwLCAtMjMsIC0xMCwgIDM5LCAgMTYsCisgICAgfSwgeworICAgICAgMiwgIDExLCAtMzYsICAgOSwgIDEzLCAgMTcsICAyMSwgIC02LCAgLTUsIC00NSwKKyAgICAtMTAsIC0zNiwgLTE4LCAgMzMsICAxOSwgIDE5LCAtMzEsIC00NCwgLTI3LCAtMTUsCisgICAgLTE2LCAgMzQsIC0xMSwgIDIyLCAtMjIsICAtNCwgLTQwLCAgLTcsICAyMSwgICAwLAorICAgICAgMSwgIDM1LCAgMzYsIC0xOCwgLTEwLCAtMjQsIC00NiwgLTEyLCAgMzQsICAgOCwKKyAgICB9LCB7CisgICAgIDMyLCAgLTIsIC00NywgLTQyLCAgIDcsICAgNSwgIDIxLCAtMTgsICAgOSwgLTEyLAorICAgICAtNSwgIC01LCAgIDIsICAgOCwgLTEwLCAgLTQsIC0xNCwgLTQyLCAtMzgsICAxMCwKKyAgICAgMzMsICA0OSwgICA1LCAgMjQsIC0zMywgLTEyLCAtMTcsIC0zNSwgIDUyLCAgIDYsCisgICAgIDM4LCAgMjIsICAgNywgLTcyLCAgIDcsICAgMywgICAwLCAgIDYsICAyNSwgIDMwLAorICAgIH0sIHsKKyAgICAtMzYsICAxOCwgLTI0LCAgLTMsICAyOCwgIC03LCAgMTYsIC0xMywgLTI2LCAtNDEsCisgICAgLTI0LCAgIDEsICAtNSwgIDI2LCAgIDMsICAxMiwgLTI3LCAtNDYsIC0yNywgIDEwLAorICAgICAyNCwgIDM0LCAgMTAsICAgOCwgLTQ5LCAgLTIsIC0zNCwgICAwLCAgNTEsICAxMiwKKyAgICAgMTcsICAzOCwgIDI1LCAtNTYsICAgMCwgICAwLCAtMjIsICAgMywgIDIwLCAgMjIsCisgICAgfSwgeworICAgIDEyMSwgIC05LCAtNTAsIC0xMCwgLTQwLCAgNDAsICA0MywgICA5LCAgNTgsICAxMiwKKyAgICAtMjUsIC00MSwgIDExLCAgIDIsICAzMSwgIC01LCAgLTgsICAxOSwgLTE1LCAgMzIsCisgICAgLTQxLCAgMzAsIC0xNiwgIDE2LCAgMjAsIC0yOCwgICAwLCAgLTMsICAyNiwgLTIyLAorICAgICAxOSwgICAwLCAgMzYsICAgNCwgIDIyLCAgMTIsICAtNiwgIC05LCAgLTEsIC0yNCwKKyAgICB9LCB7CisgICAgIDUyLCAgMTAsIC0yNywgIDI3LCAtMTgsICAyNiwgIDM4LCAgMTQsICAyMywgLTE2LAorICAgIC00NCwgLTMzLCAgIDMsICAyMCwgIDQ1LCAgMTAsIC0yMCwgIDE1LCAgLTMsICAzMSwKKyAgICAtNTAsICAxNCwgLTEwLCAgIDAsICAgNSwgLTE3LCAtMTUsICAzMiwgIDI0LCAtMTYsCisgICAgIC0xLCAgMTUsICA1NSwgIDIwLCAgMTQsICAgOCwgLTI5LCAtMTIsICAtNywgLTMyLAorICAgIH0sIHsKKyAgICAgODIsICAtMywgLTM4LCAtMjMsIC0yNCwgIDE1LCAgMzgsICAgMiwgIDM3LCAgMTUsCisgICAgLTM5LCAgLTIsICAyMywgIC00LCAgMTUsIC0xMiwgIC0zLCAgMTcsIC0xNSwgIDU4LAorICAgICAtMSwgIDI5LCAgIDYsICAgMiwgIC01LCAtMjYsICAgNywgICA0LCAgNTYsICAtOSwKKyAgICAgMzUsICAgMywgIDI1LCAtMzMsICAzMiwgIDM2LCAgMTcsICAgNywgLTE1LCAgLTksCisgICAgfSwgeworICAgICAxMywgIDE3LCAtMTUsICAxNSwgIC0zLCAgIDEsICAzMywgICA3LCAgIDEsIC0xMiwKKyAgICAtNTgsICAgNSwgIDE1LCAgMTMsICAyOSwgICAzLCAtMTYsICAxMywgIC00LCAgNTcsCisgICAgLTEwLCAgMTMsICAxMSwgLTEzLCAtMjEsIC0xNSwgIC05LCAgNDAsICA1NSwgIC0zLAorICAgICAxNCwgIDE5LCAgNDQsIC0xNywgIDI0LCAgMzIsICAtNSwgICA0LCAtMjEsIC0xOCwKKyAgICB9LCB7CisgICAgIDc2LCAgIDEsIC00MSwgIC05LCAtMTksIC0xMiwgIDQxLCAgMTcsICA1NSwgIDE4LAorICAgICAtMywgLTYzLCAgLTMsIC0xMiwgIDMwLCAgIDUsICAtMywgLTEyLCAtMzEsICAgMCwKKyAgICAtMjQsICA0OSwgIC04LCAgIDksICAtMSwgLTMzLCAtMTIsIC0yOSwgIDI3LCAtMTgsCisgICAgIDM3LCAgMjEsICAzNCwgLTE3LCAgLTMsIC0xMSwgIDE0LCAtMjMsICAyNSwgIC0yLAorICAgIH0sIHsKKyAgICAgIDcsICAyMiwgLTE4LCAgMjksICAgMSwgLTI1LCAgMzYsICAyMSwgIDIwLCAgLTksCisgICAgLTIyLCAtNTYsIC0xMSwgICA2LCAgNDUsICAyMSwgLTE1LCAtMTYsIC0yMCwgIC0xLAorICAgIC0zMywgIDM0LCAgLTIsICAtNiwgLTE3LCAtMjMsIC0yOCwgICA2LCAgMjUsIC0xMiwKKyAgICAgMTYsICAzNywgIDUzLCAgLTEsIC0xMSwgLTE1LCAgLTgsIC0yNSwgIDIwLCAtMTEsCisgICAgfSwgeworICAgICAzNywgICA4LCAtMjksIC0yMiwgIC00LCAtMzcsICAzNiwgICA5LCAgMzQsICAyMiwKKyAgICAtMTcsIC0yNCwgICA4LCAtMTgsICAxNSwgIC0yLCAgIDEsIC0xNCwgLTMxLCAgMjUsCisgICAgIDE1LCAgNDgsICAxMywgIC00LCAtMjgsIC0zMSwgIC01LCAtMjEsICA1NywgIC00LAorICAgICA1MywgIDI0LCAgMjMsIC01NSwgICA2LCAgMTIsICAzNywgIC02LCAgMTEsICAxMSwKKyAgICB9LCB7CisgICAgLTMxLCAgMjgsICAtNiwgIDE2LCAgMTYsIC01MCwgIDMxLCAgMTQsICAgMCwgIC02LAorICAgIC0zNiwgLTE3LCAgIDAsICAgMCwgIDI5LCAgMTQsIC0xMSwgLTE4LCAtMjAsICAyNSwKKyAgICAgIDYsICAzMywgIDE5LCAtMjAsIC00MywgLTIxLCAtMjEsICAxNCwgIDU1LCAgIDAsCisgICAgIDMyLCAgNDAsICA0MiwgLTM5LCAgLTEsICAgOCwgIDE0LCAgLTgsICAgNiwgICAzLAorICAgIH0sIHsKKyAgICAxMTksIC0yNCwgLTM5LCAtNDQsIC01MSwgIDY2LCAtMTQsICAxNSwgIDMxLCAtMjYsCisgICAgIC0xLCAgIDAsICAgNywgIDE2LCAtMTksIC0yOCwgLTE5LCAgMjIsIC0yNiwgICA0LAorICAgIC0xMywgIDI4LCAtMTYsICAyOSwgICA1LCAgLTEsICAxNiwgLTE2LCAgIDgsIC0zNSwKKyAgICAtMTAsIC00MiwgIC00LCAgMTcsICAyOSwgLTE5LCAtNDIsICAtNywgICAwLCAtMTUsCisgICAgfSwgeworICAgICA1MCwgIC0zLCAtMTYsICAtNSwgLTMwLCAgNTMsIC0xOSwgIDIwLCAgLTMsIC01NSwKKyAgICAtMTksICAgOCwgICAwLCAgMzQsICAtNSwgLTExLCAtMzIsICAxOCwgLTE1LCAgIDQsCisgICAgLTIyLCAgMTMsIC0xMCwgIDEzLCAgLTksICAgOCwgICAwLCAgMTksICAgNywgLTI5LAorICAgIC0zMSwgLTI2LCAgMTMsICAzMywgIDIxLCAtMjIsIC02NSwgIC05LCAgLTQsIC0yMywKKyAgICB9LCB7CisgICAgIDc5LCAtMTcsIC0yNywgLTU2LCAtMzYsICA0MSwgLTE5LCAgIDgsICAxMCwgLTIyLAorICAgIC0xNSwgIDM5LCAgMjAsICAgOSwgLTM1LCAtMzUsIC0xNSwgIDIwLCAtMjYsICAzMSwKKyAgICAgMjYsICAyNywgICA2LCAgMTUsIC0yMCwgICAwLCAgMjMsICAtOCwgIDM4LCAtMjIsCisgICAgICA1LCAtMzgsIC0xNSwgLTIwLCAgMzksICAgNCwgLTE4LCAgIDksIC0xMywgIC0xLAorICAgIH0sIHsKKyAgICAgMTAsICAgMywgIC00LCAtMTgsIC0xNSwgIDI3LCAtMjQsICAxMywgLTI0LCAtNTEsCisgICAgLTM0LCAgNDcsICAxMiwgIDI4LCAtMjEsIC0xOSwgLTI3LCAgMTYsIC0xNSwgIDMwLAorICAgICAxNywgIDEyLCAgMTIsICAgMCwgLTM2LCAgMTAsICAgNywgIDI3LCAgMzcsIC0xNiwKKyAgICAtMTUsIC0yMiwgICAzLCAgLTQsICAzMSwgICAxLCAtNDIsICAgNywgLTE4LCAgLTksCisgICAgfSwgeworICAgICA3NCwgLTEyLCAtMzAsIC00MiwgLTMwLCAgMTQsIC0xNiwgIDIzLCAgMjksIC0xOSwKKyAgICAgMjAsIC0yMSwgIC03LCAgIDEsIC0xOSwgLTE3LCAtMTQsIC0xMCwgLTQzLCAtMjcsCisgICAgICAzLCAgNDgsICAtOCwgIDIyLCAtMTYsICAtNywgICA0LCAtNDIsICAgOSwgLTMxLAorICAgICAgNiwgLTIwLCAgLTYsICAtNCwgICAzLCAtNDMsIC0yMiwgLTIwLCAgMjgsICAgNSwKKyAgICB9LCB7CisgICAgICA1LCAgIDcsICAtNywgIC00LCAgLTksICAgMCwgLTIxLCAgMjgsICAtNiwgLTQ4LAorICAgICAgMiwgLTE0LCAtMTUsICAyMCwgIC01LCAgIDAsIC0yNywgLTE0LCAtMzIsIC0yOCwKKyAgICAgLTUsICAzMiwgIC0yLCAgIDYsIC0zMiwgICAzLCAtMTIsICAtNSwgICA4LCAtMjUsCisgICAgLTE0LCAgLTQsICAxMiwgIDExLCAgLTQsIC00NywgLTQ1LCAtMjIsICAyMiwgIC0yLAorICAgIH0sIHsKKyAgICAgMzQsICAtNiwgLTE4LCAtNTUsIC0xNSwgLTExLCAtMjEsICAxNiwgICA4LCAtMTYsCisgICAgICA2LCAgMTYsICAgNSwgIC00LCAtMzUsIC0yNCwgLTEwLCAtMTIsIC00MywgIC0xLAorICAgICA0MywgIDQ3LCAgMTQsICAgOCwgLTQzLCAgLTUsICAxMCwgLTM0LCAgMzksIC0xOCwKKyAgICAgMjIsIC0xNiwgLTE3LCAtNDIsICAxMywgLTE5LCAgIDEsICAtMywgIDE0LCAgMjAsCisgICAgfSwgeworICAgIC0zNCwgIDE0LCAgIDQsIC0xNywgICA1LCAtMjQsIC0yNiwgIDIwLCAtMjcsIC00NSwKKyAgICAtMTIsICAyNCwgIC0yLCAgMTMsIC0yMSwgIC04LCAtMjIsIC0xNiwgLTMyLCAgLTIsCisgICAgIDM0LCAgMzEsICAyMCwgIC03LCAtNTgsICAgNSwgIC01LCAgIDIsICAzOCwgLTEyLAorICAgICAgMiwgIC0xLCAgIDEsIC0yNiwgICA1LCAtMjMsIC0yMSwgIC02LCAgIDgsICAxMSwKKyAgICB9LCB7CisgICAgMTI0LCAtMTMsIC0yMSwgLTIzLCAtNjIsICAyMywgICAwLCAgNDMsICA1NywgICA4LAorICAgIC0xMywgLTE4LCAgMTQsIC0xMCwgICA2LCAtMjYsICAtMywgIDQ5LCAtMTksICAxOSwKKyAgICAtMzEsICAyNywgIC03LCAgIDAsICAxMSwgLTIwLCAgMjksICAtMSwgIDEyLCAtNDcsCisgICAgICA0LCAtMzksICAxMSwgIDM0LCAgMjgsICAtOSwgIC01LCAtMTksIC0xMywgLTM0LAorICAgIH0sIHsKKyAgICAgNTUsICAgNiwgICAxLCAgMTQsIC00MSwgIDEwLCAgLTQsICA0OCwgIDIyLCAtMjAsCisgICAgLTMxLCAtMTAsICAgNSwgICA3LCAgMjAsICAtOSwgLTE2LCAgNDUsICAtOCwgIDE5LAorICAgIC00MCwgIDEyLCAgLTEsIC0xNSwgIC00LCAtMTAsICAxMiwgIDM0LCAgMTEsIC00MSwKKyAgICAtMTYsIC0yNCwgIDMwLCAgNDksICAyMCwgLTEzLCAtMjgsIC0yMiwgLTE4LCAtNDMsCisgICAgfSwgeworICAgICA4NCwgIC02LCAgLTksIC0zNiwgLTQ3LCAgLTEsICAtNCwgIDM2LCAgMzYsICAxMiwKKyAgICAtMjcsICAyMCwgIDI2LCAtMTcsICAtOSwgLTMzLCAgIDEsICA0NywgLTE5LCAgNDYsCisgICAgICA5LCAgMjcsICAxNSwgLTEzLCAtMTUsIC0xOCwgIDM1LCAgIDYsICA0MiwgLTMzLAorICAgICAyMCwgLTM2LCAgIDEsICAtNCwgIDM4LCAgMTQsICAxOCwgIC0yLCAtMjcsIC0yMCwKKyAgICB9LCB7CisgICAgIDE1LCAgMTMsICAxMywgICAxLCAtMjYsIC0xNCwgIC05LCAgNDEsICAgMSwgLTE2LAorICAgIC00NiwgIDI3LCAgMTgsICAgMSwgICA0LCAtMTYsIC0xMSwgIDQzLCAgLTgsICA0NSwKKyAgICAgIDAsICAxMSwgIDIxLCAtMjksIC0zMCwgIC04LCAgMTksICA0MiwgIDQxLCAtMjgsCisgICAgICAwLCAtMjAsICAyMCwgIDExLCAgMzAsICAxMCwgIC00LCAgLTUsIC0zMiwgLTI4LAorICAgIH0sIHsKKyAgICAgNzksICAtMiwgLTEyLCAtMjIsIC00MiwgLTI4LCAgLTEsICA1MSwgIDU0LCAgMTUsCisgICAgICA4LCAtNDEsICAgMCwgLTI0LCAgIDYsIC0xNSwgICAxLCAgMTcsIC0zNiwgLTEyLAorICAgIC0xNCwgIDQ3LCAgIDAsICAtNiwgLTExLCAtMjYsICAxNiwgLTI3LCAgMTMsIC00MywKKyAgICAgMjIsIC0xOCwgIDEwLCAgMTIsICAgMiwgLTM0LCAgMTUsIC0zMywgIDEzLCAtMTMsCisgICAgfSwgeworICAgICAxMCwgIDE4LCAgMTAsICAxNSwgLTIxLCAtNDEsICAtNiwgIDU2LCAgMTksIC0xMywKKyAgICAgLTksIC0zMywgIC05LCAgLTYsICAyMCwgICAxLCAtMTEsICAxMywgLTI0LCAtMTMsCisgICAgLTIzLCAgMzIsICAgNiwgLTIyLCAtMjYsIC0xNSwgICAwLCAgIDgsICAxMiwgLTM3LAorICAgICAgMSwgIC0yLCAgMjgsICAyNywgIC01LCAtMzcsICAtNywgLTM1LCAgIDgsIC0yMSwKKyAgICB9LCB7CisgICAgIDM5LCAgIDQsICAgMCwgLTM1LCAtMjcsIC01MywgIC02LCAgNDQsICAzMywgIDE4LAorICAgICAtNSwgIC0yLCAgMTEsIC0zMSwgIC05LCAtMjIsICAgNiwgIDE1LCAtMzYsICAxMywKKyAgICAgMjUsICA0NiwgIDIzLCAtMjAsIC0zNywgLTI0LCAgMjMsIC0xOSwgIDQzLCAtMjksCisgICAgIDM4LCAtMTQsICAgMCwgLTI2LCAgMTIsIC0xMCwgIDM4LCAtMTYsICAgMCwgICAwLAorICAgIH0sIHsKKyAgICAtMjksICAyNSwgIDIyLCAgIDIsICAtNiwgLTY3LCAtMTEsICA0OSwgIC0xLCAtMTAsCisgICAgLTI0LCAgIDUsICAgMywgLTEzLCAgIDQsICAtNSwgIC02LCAgMTEsIC0yNSwgIDEyLAorICAgICAxNiwgIDMxLCAgMjgsIC0zNiwgLTUzLCAtMTMsICAgNiwgIDE2LCAgNDIsIC0yNCwKKyAgICAgMTcsICAgMSwgIDE4LCAtMTAsICAgNCwgLTEzLCAgMTUsIC0xOCwgIC01LCAgLTcsCisgICAgfSwgeworICAgICAyOSwgLTI1LCAtMjIsICAtMiwgICA2LCAgNjcsICAxMSwgLTQ5LCAgIDEsICAxMCwKKyAgICAgMjQsICAtNSwgIC0zLCAgMTMsICAtNCwgICA1LCAgIDYsIC0xMSwgIDI1LCAtMTIsCisgICAgLTE2LCAtMzEsIC0yOCwgIDM2LCAgNTMsICAxMywgIC02LCAtMTYsIC00MiwgIDI0LAorICAgIC0xNywgIC0xLCAtMTgsICAxMCwgIC00LCAgMTMsIC0xNSwgIDE4LCAgIDUsICAgNywKKyAgICB9LCB7CisgICAgLTM5LCAgLTQsICAgMCwgIDM1LCAgMjcsICA1MywgICA2LCAtNDQsIC0zMywgLTE4LAorICAgICAgNSwgICAyLCAtMTEsICAzMSwgICA5LCAgMjIsICAtNiwgLTE1LCAgMzYsIC0xMywKKyAgICAtMjUsIC00NiwgLTIzLCAgMjAsICAzNywgIDI0LCAtMjMsICAxOSwgLTQzLCAgMjksCisgICAgLTM4LCAgMTQsICAgMCwgIDI2LCAtMTIsICAxMCwgLTM4LCAgMTYsICAgMCwgICAwLAorICAgIH0sIHsKKyAgICAtMTAsIC0xOCwgLTEwLCAtMTUsICAyMSwgIDQxLCAgIDYsIC01NiwgLTE5LCAgMTMsCisgICAgICA5LCAgMzMsICAgOSwgICA2LCAtMjAsICAtMSwgIDExLCAtMTMsICAyNCwgIDEzLAorICAgICAyMywgLTMyLCAgLTYsICAyMiwgIDI2LCAgMTUsICAgMCwgIC04LCAtMTIsICAzNywKKyAgICAgLTEsICAgMiwgLTI4LCAtMjcsICAgNSwgIDM3LCAgIDcsICAzNSwgIC04LCAgMjEsCisgICAgfSwgeworICAgIC03OSwgICAyLCAgMTIsICAyMiwgIDQyLCAgMjgsICAgMSwgLTUxLCAtNTQsIC0xNSwKKyAgICAgLTgsICA0MSwgICAwLCAgMjQsICAtNiwgIDE1LCAgLTEsIC0xNywgIDM2LCAgMTIsCisgICAgIDE0LCAtNDcsICAgMCwgICA2LCAgMTEsICAyNiwgLTE2LCAgMjcsIC0xMywgIDQzLAorICAgIC0yMiwgIDE4LCAtMTAsIC0xMiwgIC0yLCAgMzQsIC0xNSwgIDMzLCAtMTMsICAxMywKKyAgICB9LCB7CisgICAgLTE1LCAtMTMsIC0xMywgIC0xLCAgMjYsICAxNCwgICA5LCAtNDEsICAtMSwgIDE2LAorICAgICA0NiwgLTI3LCAtMTgsICAtMSwgIC00LCAgMTYsICAxMSwgLTQzLCAgIDgsIC00NSwKKyAgICAgIDAsIC0xMSwgLTIxLCAgMjksICAzMCwgICA4LCAtMTksIC00MiwgLTQxLCAgMjgsCisgICAgICAwLCAgMjAsIC0yMCwgLTExLCAtMzAsIC0xMCwgICA0LCAgIDUsICAzMiwgIDI4LAorICAgIH0sIHsKKyAgICAtODQsICAgNiwgICA5LCAgMzYsICA0NywgICAxLCAgIDQsIC0zNiwgLTM2LCAtMTIsCisgICAgIDI3LCAtMjAsIC0yNiwgIDE3LCAgIDksICAzMywgIC0xLCAtNDcsICAxOSwgLTQ2LAorICAgICAtOSwgLTI3LCAtMTUsICAxMywgIDE1LCAgMTgsIC0zNSwgIC02LCAtNDIsICAzMywKKyAgICAtMjAsICAzNiwgIC0xLCAgIDQsIC0zOCwgLTE0LCAtMTgsICAgMiwgIDI3LCAgMjAsCisgICAgfSwgeworICAgIC01NSwgIC02LCAgLTEsIC0xNCwgIDQxLCAtMTAsICAgNCwgLTQ4LCAtMjIsICAyMCwKKyAgICAgMzEsICAxMCwgIC01LCAgLTcsIC0yMCwgICA5LCAgMTYsIC00NSwgICA4LCAtMTksCisgICAgIDQwLCAtMTIsICAgMSwgIDE1LCAgIDQsICAxMCwgLTEyLCAtMzQsIC0xMSwgIDQxLAorICAgICAxNiwgIDI0LCAtMzAsIC00OSwgLTIwLCAgMTMsICAyOCwgIDIyLCAgMTgsICA0MywKKyAgICB9LCB7CisgICAtMTI0LCAgMTMsICAyMSwgIDIzLCAgNjIsIC0yMywgICAwLCAtNDMsIC01NywgIC04LAorICAgICAxMywgIDE4LCAtMTQsICAxMCwgIC02LCAgMjYsICAgMywgLTQ5LCAgMTksIC0xOSwKKyAgICAgMzEsIC0yNywgICA3LCAgIDAsIC0xMSwgIDIwLCAtMjksICAgMSwgLTEyLCAgNDcsCisgICAgIC00LCAgMzksIC0xMSwgLTM0LCAtMjgsICAgOSwgICA1LCAgMTksICAxMywgIDM0LAorICAgIH0sIHsKKyAgICAgMzQsIC0xNCwgIC00LCAgMTcsICAtNSwgIDI0LCAgMjYsIC0yMCwgIDI3LCAgNDUsCisgICAgIDEyLCAtMjQsICAgMiwgLTEzLCAgMjEsICAgOCwgIDIyLCAgMTYsICAzMiwgICAyLAorICAgIC0zNCwgLTMxLCAtMjAsICAgNywgIDU4LCAgLTUsICAgNSwgIC0yLCAtMzgsICAxMiwKKyAgICAgLTIsICAgMSwgIC0xLCAgMjYsICAtNSwgIDIzLCAgMjEsICAgNiwgIC04LCAtMTEsCisgICAgfSwgeworICAgIC0zNCwgICA2LCAgMTgsICA1NSwgIDE1LCAgMTEsICAyMSwgLTE2LCAgLTgsICAxNiwKKyAgICAgLTYsIC0xNiwgIC01LCAgIDQsICAzNSwgIDI0LCAgMTAsICAxMiwgIDQzLCAgIDEsCisgICAgLTQzLCAtNDcsIC0xNCwgIC04LCAgNDMsICAgNSwgLTEwLCAgMzQsIC0zOSwgIDE4LAorICAgIC0yMiwgIDE2LCAgMTcsICA0MiwgLTEzLCAgMTksICAtMSwgICAzLCAtMTQsIC0yMCwKKyAgICB9LCB7CisgICAgIC01LCAgLTcsICAgNywgICA0LCAgIDksICAgMCwgIDIxLCAtMjgsICAgNiwgIDQ4LAorICAgICAtMiwgIDE0LCAgMTUsIC0yMCwgICA1LCAgIDAsICAyNywgIDE0LCAgMzIsICAyOCwKKyAgICAgIDUsIC0zMiwgICAyLCAgLTYsICAzMiwgIC0zLCAgMTIsICAgNSwgIC04LCAgMjUsCisgICAgIDE0LCAgIDQsIC0xMiwgLTExLCAgIDQsICA0NywgIDQ1LCAgMjIsIC0yMiwgICAyLAorICAgIH0sIHsKKyAgICAtNzQsICAxMiwgIDMwLCAgNDIsICAzMCwgLTE0LCAgMTYsIC0yMywgLTI5LCAgMTksCisgICAgLTIwLCAgMjEsICAgNywgIC0xLCAgMTksICAxNywgIDE0LCAgMTAsICA0MywgIDI3LAorICAgICAtMywgLTQ4LCAgIDgsIC0yMiwgIDE2LCAgIDcsICAtNCwgIDQyLCAgLTksICAzMSwKKyAgICAgLTYsICAyMCwgICA2LCAgIDQsICAtMywgIDQzLCAgMjIsICAyMCwgLTI4LCAgLTUsCisgICAgfSwgeworICAgIC0xMCwgIC0zLCAgIDQsICAxOCwgIDE1LCAtMjcsICAyNCwgLTEzLCAgMjQsICA1MSwKKyAgICAgMzQsIC00NywgLTEyLCAtMjgsICAyMSwgIDE5LCAgMjcsIC0xNiwgIDE1LCAtMzAsCisgICAgLTE3LCAtMTIsIC0xMiwgICAwLCAgMzYsIC0xMCwgIC03LCAtMjcsIC0zNywgIDE2LAorICAgICAxNSwgIDIyLCAgLTMsICAgNCwgLTMxLCAgLTEsICA0MiwgIC03LCAgMTgsICAgOSwKKyAgICB9LCB7CisgICAgLTc5LCAgMTcsICAyNywgIDU2LCAgMzYsIC00MSwgIDE5LCAgLTgsIC0xMCwgIDIyLAorICAgICAxNSwgLTM5LCAtMjAsICAtOSwgIDM1LCAgMzUsICAxNSwgLTIwLCAgMjYsIC0zMSwKKyAgICAtMjYsIC0yNywgIC02LCAtMTUsICAyMCwgICAwLCAtMjMsICAgOCwgLTM4LCAgMjIsCisgICAgIC01LCAgMzgsICAxNSwgIDIwLCAtMzksICAtNCwgIDE4LCAgLTksICAxMywgICAxLAorICAgIH0sIHsKKyAgICAtNTAsICAgMywgIDE2LCAgIDUsICAzMCwgLTUzLCAgMTksIC0yMCwgICAzLCAgNTUsCisgICAgIDE5LCAgLTgsICAgMCwgLTM0LCAgIDUsICAxMSwgIDMyLCAtMTgsICAxNSwgIC00LAorICAgICAyMiwgLTEzLCAgMTAsIC0xMywgICA5LCAgLTgsICAgMCwgLTE5LCAgLTcsICAyOSwKKyAgICAgMzEsICAyNiwgLTEzLCAtMzMsIC0yMSwgIDIyLCAgNjUsICAgOSwgICA0LCAgMjMsCisgICAgfSwgeworICAgLTExOSwgIDI0LCAgMzksICA0NCwgIDUxLCAtNjYsICAxNCwgLTE1LCAtMzEsICAyNiwKKyAgICAgIDEsICAgMCwgIC03LCAtMTYsICAxOSwgIDI4LCAgMTksIC0yMiwgIDI2LCAgLTQsCisgICAgIDEzLCAtMjgsICAxNiwgLTI5LCAgLTUsICAgMSwgLTE2LCAgMTYsICAtOCwgIDM1LAorICAgICAxMCwgIDQyLCAgIDQsIC0xNywgLTI5LCAgMTksICA0MiwgICA3LCAgIDAsICAxNSwKKyAgICB9LCB7CisgICAgIDMxLCAtMjgsICAgNiwgLTE2LCAtMTYsICA1MCwgLTMxLCAtMTQsICAgMCwgICA2LAorICAgICAzNiwgIDE3LCAgIDAsICAgMCwgLTI5LCAtMTQsICAxMSwgIDE4LCAgMjAsIC0yNSwKKyAgICAgLTYsIC0zMywgLTE5LCAgMjAsICA0MywgIDIxLCAgMjEsIC0xNCwgLTU1LCAgIDAsCisgICAgLTMyLCAtNDAsIC00MiwgIDM5LCAgIDEsICAtOCwgLTE0LCAgIDgsICAtNiwgIC0zLAorICAgIH0sIHsKKyAgICAtMzcsICAtOCwgIDI5LCAgMjIsICAgNCwgIDM3LCAtMzYsICAtOSwgLTM0LCAtMjIsCisgICAgIDE3LCAgMjQsICAtOCwgIDE4LCAtMTUsICAgMiwgIC0xLCAgMTQsICAzMSwgLTI1LAorICAgIC0xNSwgLTQ4LCAtMTMsICAgNCwgIDI4LCAgMzEsICAgNSwgIDIxLCAtNTcsICAgNCwKKyAgICAtNTMsIC0yNCwgLTIzLCAgNTUsICAtNiwgLTEyLCAtMzcsICAgNiwgLTExLCAtMTEsCisgICAgfSwgeworICAgICAtNywgLTIyLCAgMTgsIC0yOSwgIC0xLCAgMjUsIC0zNiwgLTIxLCAtMjAsICAgOSwKKyAgICAgMjIsICA1NiwgIDExLCAgLTYsIC00NSwgLTIxLCAgMTUsICAxNiwgIDIwLCAgIDEsCisgICAgIDMzLCAtMzQsICAgMiwgICA2LCAgMTcsICAyMywgIDI4LCAgLTYsIC0yNSwgIDEyLAorICAgIC0xNiwgLTM3LCAtNTMsICAgMSwgIDExLCAgMTUsICAgOCwgIDI1LCAtMjAsICAxMSwKKyAgICB9LCB7CisgICAgLTc2LCAgLTEsICA0MSwgICA5LCAgMTksICAxMiwgLTQxLCAtMTcsIC01NSwgLTE4LAorICAgICAgMywgIDYzLCAgIDMsICAxMiwgLTMwLCAgLTUsICAgMywgIDEyLCAgMzEsICAgMCwKKyAgICAgMjQsIC00OSwgICA4LCAgLTksICAgMSwgIDMzLCAgMTIsICAyOSwgLTI3LCAgMTgsCisgICAgLTM3LCAtMjEsIC0zNCwgIDE3LCAgIDMsICAxMSwgLTE0LCAgMjMsIC0yNSwgICAyLAorICAgIH0sIHsKKyAgICAtMTMsIC0xNywgIDE1LCAtMTUsICAgMywgIC0xLCAtMzMsICAtNywgIC0xLCAgMTIsCisgICAgIDU4LCAgLTUsIC0xNSwgLTEzLCAtMjksICAtMywgIDE2LCAtMTMsICAgNCwgLTU3LAorICAgICAxMCwgLTEzLCAtMTEsICAxMywgIDIxLCAgMTUsICAgOSwgLTQwLCAtNTUsICAgMywKKyAgICAtMTQsIC0xOSwgLTQ0LCAgMTcsIC0yNCwgLTMyLCAgIDUsICAtNCwgIDIxLCAgMTgsCisgICAgfSwgeworICAgIC04MiwgICAzLCAgMzgsICAyMywgIDI0LCAtMTUsIC0zOCwgIC0yLCAtMzcsIC0xNSwKKyAgICAgMzksICAgMiwgLTIzLCAgIDQsIC0xNSwgIDEyLCAgIDMsIC0xNywgIDE1LCAtNTgsCisgICAgICAxLCAtMjksICAtNiwgIC0yLCAgIDUsICAyNiwgIC03LCAgLTQsIC01NiwgICA5LAorICAgIC0zNSwgIC0zLCAtMjUsICAzMywgLTMyLCAtMzYsIC0xNywgIC03LCAgMTUsICAgOSwKKyAgICB9LCB7CisgICAgLTUyLCAtMTAsICAyNywgLTI3LCAgMTgsIC0yNiwgLTM4LCAtMTQsIC0yMywgIDE2LAorICAgICA0NCwgIDMzLCAgLTMsIC0yMCwgLTQ1LCAtMTAsICAyMCwgLTE1LCAgIDMsIC0zMSwKKyAgICAgNTAsIC0xNCwgIDEwLCAgIDAsICAtNSwgIDE3LCAgMTUsIC0zMiwgLTI0LCAgMTYsCisgICAgICAxLCAtMTUsIC01NSwgLTIwLCAtMTQsICAtOCwgIDI5LCAgMTIsICAgNywgIDMyLAorICAgIH0sIHsKKyAgIC0xMjEsICAgOSwgIDUwLCAgMTAsICA0MCwgLTQwLCAtNDMsICAtOSwgLTU4LCAtMTIsCisgICAgIDI1LCAgNDEsIC0xMSwgIC0yLCAtMzEsICAgNSwgICA4LCAtMTksICAxNSwgLTMyLAorICAgICA0MSwgLTMwLCAgMTYsIC0xNiwgLTIwLCAgMjgsICAgMCwgICAzLCAtMjYsICAyMiwKKyAgICAtMTksICAgMCwgLTM2LCAgLTQsIC0yMiwgLTEyLCAgIDYsICAgOSwgICAxLCAgMjQsCisgICAgfSwgeworICAgICAzNiwgLTE4LCAgMjQsICAgMywgLTI4LCAgIDcsIC0xNiwgIDEzLCAgMjYsICA0MSwKKyAgICAgMjQsICAtMSwgICA1LCAtMjYsICAtMywgLTEyLCAgMjcsICA0NiwgIDI3LCAtMTAsCisgICAgLTI0LCAtMzQsIC0xMCwgIC04LCAgNDksICAgMiwgIDM0LCAgIDAsIC01MSwgLTEyLAorICAgIC0xNywgLTM4LCAtMjUsICA1NiwgICAwLCAgIDAsICAyMiwgIC0zLCAtMjAsIC0yMiwKKyAgICB9LCB7CisgICAgLTMyLCAgIDIsICA0NywgIDQyLCAgLTcsICAtNSwgLTIxLCAgMTgsICAtOSwgIDEyLAorICAgICAgNSwgICA1LCAgLTIsICAtOCwgIDEwLCAgIDQsICAxNCwgIDQyLCAgMzgsIC0xMCwKKyAgICAtMzMsIC00OSwgIC01LCAtMjQsICAzMywgIDEyLCAgMTcsICAzNSwgLTUyLCAgLTYsCisgICAgLTM4LCAtMjIsICAtNywgIDcyLCAgLTcsICAtMywgICAwLCAgLTYsIC0yNSwgLTMwLAorICAgIH0sIHsKKyAgICAgLTIsIC0xMSwgIDM2LCAgLTksIC0xMywgLTE3LCAtMjEsICAgNiwgICA1LCAgNDUsCisgICAgIDEwLCAgMzYsICAxOCwgLTMzLCAtMTksIC0xOSwgIDMxLCAgNDQsICAyNywgIDE1LAorICAgICAxNiwgLTM0LCAgMTEsIC0yMiwgIDIyLCAgIDQsICA0MCwgICA3LCAtMjEsICAgMCwKKyAgICAgLTEsIC0zNSwgLTM2LCAgMTgsICAxMCwgIDI0LCAgNDYsICAxMiwgLTM0LCAgLTgsCisgICAgfSwgeworICAgIC03MSwgICA5LCAgNTksICAyOSwgICA4LCAtMzAsIC0yNiwgIDExLCAtMzAsICAxNiwKKyAgICAgLTgsICA0NCwgICA5LCAtMTQsICAtNSwgIC0yLCAgMTksICA0MCwgIDM4LCAgMTUsCisgICAgICA3LCAtNTAsICAxNywgLTM4LCAgIDcsICAxNCwgIDI0LCAgNDMsIC0yMiwgICA2LAorICAgIC0yMiwgLTE5LCAtMTcsICAzNCwgICAyLCAgMjAsICAyMywgIDEwLCAtMzksIC0xNiwKKyAgICB9LCB7CisgICAgIC04LCAgLTYsICAzMywgICA0LCAgLTcsIC00NCwgLTE4LCAgMjEsICAyMywgIDQ4LAorICAgICA0NiwgLTI0LCAgLTksIC00MCwgIC0zLCAgLTEsICAzMiwgIDEzLCAgMTEsIC00MywKKyAgICAgLTcsIC0xNCwgIC0zLCAtMTUsICAyNiwgIC0zLCAgMjEsIC0yNiwgLTUwLCAgLTgsCisgICAgICAwLCAtMTYsIC0yNywgIDM0LCAtMjUsIC0yMywgIDQzLCAtMTcsICAgNiwgIC0xLAorICAgIH0sIHsKKyAgICAtNzcsICAxMywgIDU2LCAgNDMsICAxMywgLTU3LCAtMjMsICAyNiwgLTExLCAgMTksCisgICAgIDI3LCAtMTYsIC0xNywgLTIyLCAgMTAsICAxNSwgIDE5LCAgMTAsICAyMiwgLTQzLAorICAgIC0xNiwgLTMwLCAgIDIsIC0zMSwgIDExLCAgIDYsICAgNSwgICA5LCAtNTIsICAtMiwKKyAgICAtMjAsICAgMCwgIC04LCAgNTAsIC0zMywgLTI3LCAgMTksIC0xOSwgICAxLCAgLTksCisgICAgfSwgeworICAgIC00NywgICAwLCAgNDUsICAtNywgICA3LCAtNjksIC0yMywgIDEzLCAgIDIsICA1MSwKKyAgICAgMzIsICAxNCwgICAzLCAtNDcsIC0xOSwgIC04LCAgMzcsICAxMSwgIDEwLCAtMTYsCisgICAgIDMyLCAtMTUsICAxOSwgLTI5LCAgIDAsICAtMSwgIDI4LCAtMTgsIC0yMCwgICA0LAorICAgICAxNiwgLTEzLCAtMzgsICAtMywgLTE1LCAgIDAsICA2NiwgICAwLCAgLTcsICAxMywKKyAgICB9LCB7CisgICAtMTE2LCAgMjAsICA2OCwgIDMwLCAgMjgsIC04MywgLTI4LCAgMTgsIC0zMiwgIDIyLAorICAgICAxMywgIDIxLCAgLTUsIC0yOCwgIC01LCAgIDcsICAyNCwgICA4LCAgMjIsIC0xNywKKyAgICAgMjMsIC0zMCwgIDI1LCAtNDUsIC0xNSwgICA5LCAgMTEsICAxOCwgLTIyLCAgMTAsCisgICAgIC00LCAgIDIsIC0xOSwgIDEyLCAtMjMsICAtMywgIDQzLCAgLTIsIC0xMiwgICA0LAorICAgIH0sIHsKKyAgICAgNzIsIC0xMywgLTI5LCAtMTgsICAgNCwgIDkwLCAgMzcsIC0zNCwgICA0LCAgLTEsCisgICAgIDEzLCAgLTksICAtNiwgIDExLCAgIDIsICAyNCwgLTEzLCAgIDMsICAtNywgLTExLAorICAgICAtNCwgICA0LCAtNDIsICAyNSwgIDMxLCAgLTEsICAtOCwgLTI5LCAgLTYsICAxNywKKyAgICAtMTksICAgMiwgLTEwLCAgLTYsICAzOCwgIDIyLCAtNDIsIC0xOSwgIC02LCAtMTEsCisgICAgfSwgeworICAgICAgMywgICA3LCAgLTYsICAyMCwgIDI1LCAgNzcsICAzMiwgLTI5LCAtMzEsIC0zMCwKKyAgICAgLTQsICAtMiwgLTE0LCAgMjksICAxNiwgIDQwLCAtMjYsICAgMCwgICAzLCAtMTIsCisgICAgLTEzLCAtMTAsIC0zNiwgICA5LCAgMTUsICAgOCwgLTI0LCAgIDYsICAtNywgIDIyLAorICAgIC00MCwgIDE3LCAgIDgsICAgOSwgIDMxLCAgMTgsIC02NiwgLTIyLCAtMTEsIC0xOSwKKyAgICB9LCB7CisgICAgIDMyLCAgLTYsIC0xNywgLTMxLCAgMTksICA2NSwgIDMzLCAtNDEsIC0xNiwgICAxLAorICAgICAgMCwgIDI5LCAgIDYsICAgNCwgLTEzLCAgMTcsICAtOSwgICAxLCAgLTgsICAxNCwKKyAgICAgMzUsICAgMywgLTE5LCAgMTEsICAgNCwgICAwLCAgLTEsIC0yMSwgIDIzLCAgMzAsCisgICAgIC0zLCAgIDUsIC0yMCwgLTQ0LCAgNDgsICA0NiwgLTE5LCAgLTMsIC0yMCwgICAzLAorICAgIH0sIHsKKyAgICAtMzYsICAxMywgICA1LCAgIDcsICA0MCwgIDUxLCAgMjgsIC0zNiwgLTUyLCAtMjcsCisgICAgLTE4LCAgMzYsICAtMiwgIDIyLCAgIDAsICAzMywgLTIxLCAgLTIsICAgMywgIDEzLAorICAgICAyNiwgLTExLCAtMTQsICAtNCwgLTEwLCAgMTAsIC0xOCwgIDE0LCAgMjIsICAzNiwKKyAgICAtMjQsICAyMSwgIC0xLCAtMjgsICA0MCwgIDQyLCAtNDIsICAtNSwgLTI1LCAgLTUsCisgICAgfSwgeworICAgICAyNywgIC0xLCAtMjAsIC0xNywgIDI0LCAgMzgsICAzNSwgLTI2LCAgIDEsICAgNCwKKyAgICAgMzUsIC0zMiwgLTIxLCAgLTMsICAgMiwgIDM1LCAgLTgsIC0yOSwgLTI0LCAtNDQsCisgICAgIDEyLCAgMjQsIC0zNCwgIDE4LCAgIDgsICAtNywgLTIxLCAtNTUsICAtNSwgIDIxLAorICAgICAtMiwgIDIzLCAtMTEsIC0yOCwgIDEzLCAgLTEsIC0yMiwgLTMzLCAgMjEsICAxMCwKKyAgICB9LCB7CisgICAgLTQxLCAgMTgsICAgMiwgIDIxLCAgNDUsICAyNCwgIDMwLCAtMjEsIC0zMywgLTI0LAorICAgICAxNywgLTI0LCAtMjksICAxNSwgIDE2LCAgNTEsIC0yMSwgLTMzLCAtMTMsIC00NSwKKyAgICAgIDMsICAgOCwgLTI4LCAgIDIsICAtNywgICAyLCAtMzcsIC0xOSwgIC03LCAgMjcsCisgICAgLTIyLCAgMzksICAgNywgLTEyLCAgIDUsICAtNSwgLTQ1LCAtMzUsICAxNSwgICAxLAorICAgIH0sIHsKKyAgICAtMTIsICAgNCwgIC04LCAtMjksICAzOSwgIDEyLCAgMzAsIC0zMywgLTE5LCAgIDgsCisgICAgIDIxLCAgIDYsICAtOCwgIC05LCAtMTMsICAyOCwgIC00LCAtMzEsIC0yNCwgLTE4LAorICAgICA1MiwgIDIzLCAtMTIsICAgNCwgLTE4LCAgLTUsIC0xNCwgLTQ3LCAgMjQsICAzNCwKKyAgICAgMTQsICAyNywgLTIyLCAtNjYsICAyMiwgIDIyLCAgIDEsIC0xNiwgICA2LCAgMjQsCisgICAgfSwgeworICAgIC04MSwgIDI1LCAgMTQsICAgOCwgIDYxLCAgIDAsICAyNSwgLTI4LCAtNTQsIC0yMCwKKyAgICAgIDMsICAxNCwgLTE3LCAgIDgsICAgMCwgIDQ0LCAtMTYsIC0zNSwgLTEzLCAtMTgsCisgICAgIDQzLCAgIDcsICAtNiwgLTExLCAtMzMsICAgNCwgLTMwLCAtMTEsICAyMiwgIDQwLAorICAgICAtNiwgIDQzLCAgLTMsIC01MCwgIDE0LCAgMTgsIC0yMiwgLTE4LCAgIDEsICAxNiwKKyAgICB9LCB7CisgICAgIDc3LCAgLTIsIC0xMSwgICAxLCAgLTcsICA0NywgIDUyLCAgLTUsICAyOSwgIDMzLAorICAgICAgMSwgLTI4LCAgIDAsIC0xNSwgIDI4LCAgMjYsICAgMiwgIDMwLCAgIDAsICAgMiwKKyAgICAtMjIsICAgNCwgLTMzLCAgLTMsICAzNiwgLTIxLCAgIDMsIC0xNSwgIC0yLCAgIDUsCisgICAgIC00LCAgIDQsICAgNiwgICA5LCAgMzcsICAzMSwgIC01LCAtMzIsIC0yMCwgLTMwLAorICAgIH0sIHsKKyAgICAgIDgsICAxNywgIDEwLCAgNDAsICAxMywgIDM0LCAgNDcsICAgMCwgIC01LCAgIDQsCisgICAgLTE2LCAtMjEsICAtOCwgICAyLCAgNDIsICA0MywgLTEwLCAgMjYsICAxMCwgICAyLAorICAgIC0zMSwgLTExLCAtMjcsIC0xOSwgIDIxLCAtMTAsIC0xMiwgIDIwLCAgLTMsICAxMSwKKyAgICAtMjUsICAyMCwgIDI1LCAgMjUsICAyOSwgIDI4LCAtMjgsIC0zNCwgLTI1LCAtMzgsCisgICAgfSwgeworICAgICAzNywgICAzLCAgIDAsIC0xMCwgICA3LCAgMjIsICA0OCwgLTEyLCAgIDgsICAzNiwKKyAgICAtMTIsICAgOSwgIDEyLCAtMjIsICAxMiwgIDE5LCAgIDYsICAyOCwgICAwLCAgMjksCisgICAgIDE4LCAgIDMsIC0xMSwgLTE3LCAgMTAsIC0xOCwgIDEwLCAgLTcsICAyNywgIDE4LAorICAgICAxMSwgICA3LCAgLTMsIC0yOCwgIDQ3LCAgNTUsICAxOCwgLTE1LCAtMzQsIC0xNiwKKyAgICB9LCB7CisgICAgLTMxLCAgMjQsICAyMywgIDI3LCAgMjksICAgOSwgIDQzLCAgLTgsIC0yNiwgICA3LAorICAgIC0zMCwgIDE3LCAgIDQsICAtMywgIDI2LCAgMzUsICAtNSwgIDI0LCAgMTAsICAyOCwKKyAgICAgIDksIC0xMiwgIC01LCAtMzMsICAtNSwgIC04LCAgLTUsICAyOSwgIDI2LCAgMjQsCisgICAgIC05LCAgMjMsICAxNCwgLTEyLCAgMzksICA1MiwgIC01LCAtMTgsIC0zOSwgLTI0LAorICAgIH0sIHsKKyAgICAgMzIsICAgOCwgIC0zLCAgIDIsICAxMywgIC00LCAgNTAsICAgMSwgIDI3LCAgMzksCisgICAgIDIzLCAtNTEsIC0xNSwgLTMwLCAgMjcsICAzNywgICA3LCAgLTEsIC0xNywgLTI5LAorICAgICAtNSwgIDIzLCAtMjUsIC0xMCwgIDE0LCAtMjYsICAtOCwgLTQxLCAgLTEsICAgOSwKKyAgICAgMTMsICAyNiwgICA1LCAtMTIsICAxMiwgICA3LCAgMTQsIC00NSwgICA2LCAgLTksCisgICAgfSwgeworICAgIC0zNiwgIDI5LCAgMTksICA0MSwgIDM0LCAtMTgsICA0NSwgICA2LCAgLTgsICAxMCwKKyAgICAgIDUsIC00MywgLTIzLCAtMTEsICA0MiwgIDUzLCAgLTUsICAtNSwgIC02LCAtMzAsCisgICAgLTE0LCAgIDgsIC0yMCwgLTI2LCAgLTEsIC0xNiwgLTI1LCAgLTQsICAtMywgIDE1LAorICAgICAtNywgIDQxLCAgMjMsICAgMywgICA0LCAgIDMsICAtOCwgLTQ4LCAgIDEsIC0xNywKKyAgICB9LCB7CisgICAgIC03LCAgMTUsICAgOSwgIC05LCAgMjgsIC0yOSwgIDQ1LCAgLTUsICAgNiwgIDQzLAorICAgICAgOSwgLTEyLCAgLTIsIC0zNiwgIDEyLCAgMzAsICAxMSwgIC0zLCAtMTcsICAtMywKKyAgICAgMzQsICAyMiwgIC0zLCAtMjQsIC0xMiwgLTI0LCAgLTIsIC0zMiwgIDI4LCAgMjIsCisgICAgIDI5LCAgMjksICAtNSwgLTUwLCAgMjEsICAzMSwgIDM4LCAtMjksICAtNywgICA1LAorICAgIH0sIHsKKyAgICAtNzYsICAzNSwgIDMxLCAgMjgsICA0OSwgLTQzLCAgNDAsICAgMCwgLTI5LCAgMTQsCisgICAgIC04LCAgLTUsIC0xMCwgLTE4LCAgMjYsICA0NiwgICAwLCAgLTcsICAtNiwgIC0zLAorICAgICAyNSwgICA3LCAgIDIsIC00MCwgLTI4LCAtMTQsIC0xOCwgICAzLCAgMjcsICAyOCwKKyAgICAgIDgsICA0NSwgIDEzLCAtMzQsICAxMywgIDI3LCAgMTUsIC0zMSwgLTEyLCAgLTMsCisgICAgfSwgeworICAgICA3NCwgLTE3LCAgIDAsIC0zMSwgLTE4LCAgNzMsICAtNSwgICAwLCAgIDMsICAtNSwKKyAgICAgMjUsICAxMiwgIC0zLCAgLTEsIC0yMiwgICAzLCAgLTksICAzMywgLTEyLCAtMjQsCisgICAgICA2LCAgIDIsIC0zMywgICA5LCAgMjEsICAgNSwgIDIwLCAtMjcsIC0xOSwgIC03LAorICAgIC0zNCwgLTM3LCAtMzQsICAyMiwgIDQ0LCAgIDAsIC00MSwgLTI5LCAtMTcsIC0yMSwKKyAgICB9LCB7CisgICAgICA1LCAgIDMsICAyMSwgICA3LCAgIDIsICA2MCwgLTEwLCAgIDUsIC0zMiwgLTM0LAorICAgICAgNywgIDIwLCAtMTEsICAxNiwgIC04LCAgMjAsIC0yMSwgIDI5LCAgLTEsIC0yNCwKKyAgICAgLTIsIC0xMywgLTI3LCAgLTYsICAgNSwgIDE1LCAgIDMsICAgOCwgLTIxLCAgLTEsCisgICAgLTU1LCAtMjEsIC0xNSwgIDM4LCAgMzcsICAtMywgLTY1LCAtMzIsIC0yMywgLTMwLAorICAgIH0sIHsKKyAgICAgMzUsIC0xMCwgIDExLCAtNDQsICAtMywgIDQ4LCAtMTAsICAtNiwgLTE3LCAgLTIsCisgICAgIDExLCAgNTEsICAgOCwgIC04LCAtMzgsICAtMywgIC00LCAgMzEsIC0xMiwgICAyLAorICAgICA0NiwgICAxLCAtMTAsICAtNCwgIC01LCAgIDcsICAyNiwgLTE5LCAgMTAsICAgNSwKKyAgICAtMTgsIC0zNCwgLTQ1LCAtMTUsICA1NCwgIDI0LCAtMTgsIC0xMywgLTMxLCAgLTcsCisgICAgfSwgeworICAgIC0zMywgIDEwLCAgMzQsICAtNSwgIDE3LCAgMzUsIC0xNSwgIC0xLCAtNTMsIC0zMCwKKyAgICAgLTYsICA1OSwgICAwLCAgMTAsIC0yNCwgIDEzLCAtMTcsICAyNywgIC0xLCAgIDEsCisgICAgIDM3LCAtMTMsICAtNCwgLTIwLCAtMjAsICAxOCwgIDEwLCAgMTYsICAgOCwgIDExLAorICAgIC0zOSwgLTE4LCAtMjYsICAgMCwgIDQ2LCAgMjAsIC00MSwgLTE1LCAtMzcsIC0xNSwKKyAgICB9LCB7CisgICAgIDI5LCAgLTUsICAgNywgLTMwLCAgIDEsICAyMSwgIC03LCAgIDcsICAgMCwgICAwLAorICAgICA0NywgIC05LCAtMTgsIC0xNSwgLTIyLCAgMTQsICAtNCwgICAwLCAtMjgsIC01NywKKyAgICAgMjMsICAyMSwgLTI1LCAgIDIsICAtMSwgICAwLCAgIDcsIC01MywgLTE5LCAgLTMsCisgICAgLTE3LCAtMTUsIC0zNiwgICAwLCAgMTksIC0yNCwgLTIxLCAtNDMsICAgOSwgICAwLAorICAgIH0sIHsKKyAgICAtMzksICAxNCwgIDMwLCAgIDgsICAyMiwgICA4LCAtMTIsICAxMiwgLTM0LCAtMjcsCisgICAgIDI5LCAgLTIsIC0yNiwgICAyLCAgLTgsICAzMSwgLTE2LCAgLTMsIC0xNywgLTU3LAorICAgICAxNCwgICA2LCAtMTksIC0xMywgLTE2LCAgMTAsICAtOCwgLTE3LCAtMjAsICAgMiwKKyAgICAtMzgsICAgMCwgLTE3LCAgMTYsICAxMSwgLTI3LCAtNDQsIC00NSwgICA0LCAgLTgsCisgICAgfSwgeworICAgICAtOSwgICAxLCAgMjAsIC00MywgIDE3LCAgLTMsIC0xMiwgICAwLCAtMjAsICAgNCwKKyAgICAgMzMsICAyOSwgIC02LCAtMjIsIC0zOCwgICA3LCAgIDAsICAtMSwgLTI5LCAtMzAsCisgICAgIDYzLCAgMjEsICAtMywgLTExLCAtMjcsICAgMSwgIDE0LCAtNDUsICAxMCwgICA5LAorICAgICAtMSwgLTEyLCAtNDcsIC0zNywgIDI4LCAgIDAsICAgMiwgLTI2LCAgLTQsICAxMywKKyAgICB9LCB7CisgICAgLTc4LCAgMjEsICA0MywgIC00LCAgMzgsIC0xNywgLTE3LCAgIDUsIC01NSwgLTI0LAorICAgICAxNSwgIDM2LCAtMTQsICAtNCwgLTI0LCAgMjQsIC0xMiwgIC01LCAtMTcsIC0zMSwKKyAgICAgNTQsICAgNSwgICAyLCAtMjcsIC00MywgIDEyLCAgLTIsICAtOSwgICA5LCAgMTUsCisgICAgLTIyLCAgIDMsIC0yOCwgLTIxLCAgMjAsICAtMywgLTIwLCAtMjgsICAtOSwgICA1LAorICAgIH0sIHsKKyAgICAgODAsICAtNiwgIDE2LCAtMTEsIC0zMCwgIDMwLCAgIDksICAyOCwgIDI4LCAgMjksCisgICAgIDEzLCAgLTYsICAgMiwgLTI4LCAgIDMsICAgNSwgICA3LCAgNjAsICAtNSwgIC05LAorICAgIC0xMSwgICAxLCAtMjQsIC0xOSwgIDI3LCAtMTMsICAzMiwgLTEzLCAtMTUsIC0xOSwKKyAgICAtMTksIC0zNSwgLTE3LCAgMzksICA0MywgICA5LCAgLTQsIC00MiwgLTMyLCAtNDEsCisgICAgfSwgeworICAgICAxMSwgIDE0LCAgMzksICAyNywgIC05LCAgMTcsICAgNCwgIDMzLCAgLTYsICAgMCwKKyAgICAgLTQsICAgMSwgIC01LCAtMTAsICAxNywgIDIyLCAgLTUsICA1NywgICA1LCAgLTksCisgICAgLTIwLCAtMTMsIC0xOCwgLTM1LCAgMTEsICAtMywgIDE2LCAgMjIsIC0xNywgLTEzLAorICAgIC00MCwgLTE5LCAgIDEsICA1NSwgIDM1LCAgIDUsIC0yNywgLTQ0LCAtMzcsIC00OSwKKyAgICB9LCB7CisgICAgIDQwLCAgIDAsICAyOCwgLTI0LCAtMTQsICAgNSwgICA0LCAgMjEsICAgNywgIDMzLAorICAgICAgMCwgIDMyLCAgMTUsIC0zNSwgLTEyLCAgLTEsICAxMSwgIDU4LCAgLTUsICAxNiwKKyAgICAgMjgsICAgMCwgIC0xLCAtMzMsICAgMCwgLTExLCAgMzksICAtNSwgIDE0LCAgLTYsCisgICAgIC0zLCAtMzEsIC0yOCwgICAxLCAgNTMsICAzMywgIDE5LCAtMjUsIC00NiwgLTI2LAorICAgIH0sIHsKKyAgICAtMjgsICAyMCwgIDUxLCAgMTQsICAgNiwgIC03LCAgIDAsICAyNiwgLTI3LCAgIDQsCisgICAgLTE4LCAgNDAsICAgNiwgLTE2LCAgIDEsICAxNSwgICAwLCAgNTUsICAgNSwgIDE2LAorICAgICAxOSwgLTE0LCAgIDMsIC00OSwgLTE0LCAgLTEsICAyMiwgIDMwLCAgMTIsICAgMCwKKyAgICAtMjQsIC0xNSwgIC05LCAgMTcsICA0NSwgIDI5LCAgLTQsIC0yOCwgLTUxLCAtMzUsCisgICAgfSwgeworICAgICAzNCwgICA0LCAgMjUsIC0xMCwgIC05LCAtMjEsICAgNywgIDM2LCAgMjYsICAzNiwKKyAgICAgMzUsIC0yOCwgLTEyLCAtNDIsICAgMywgIDE2LCAgMTIsICAyOCwgLTIxLCAtNDIsCisgICAgICA1LCAgMjEsIC0xNiwgLTI2LCAgIDQsIC0xOSwgIDE5LCAtMzksIC0xNSwgLTE1LAorICAgICAtMSwgLTEzLCAtMTksICAxNywgIDE3LCAtMTQsICAxNSwgLTU1LCAgLTQsIC0xOSwKKyAgICB9LCB7CisgICAgLTM0LCAgMjUsICA0OCwgIDI4LCAgMTEsIC0zNCwgICAyLCAgNDEsICAtOSwgICA3LAorICAgICAxNywgLTIxLCAtMjAsIC0yNCwgIDE3LCAgMzMsICAgMCwgIDI0LCAtMTAsIC00MiwKKyAgICAgLTMsICAgNSwgLTEwLCAtNDIsIC0xMSwgIC04LCAgIDMsICAtMywgLTE2LCAgLTksCisgICAgLTIyLCAgIDIsICAgMCwgIDMzLCAgMTAsIC0xOCwgIC03LCAtNTgsIC0xMCwgLTI4LAorICAgIH0sIHsKKyAgICAgLTQsICAxMSwgIDM3LCAtMjMsICAgNSwgLTQ2LCAgIDIsICAyOSwgICA1LCAgMzksCisgICAgIDIxLCAgIDksICAgMCwgLTQ5LCAtMTIsICAgOSwgIDE2LCAgMjYsIC0yMiwgLTE1LAorICAgICA0NSwgIDIwLCAgIDUsIC00MCwgLTIyLCAtMTcsICAyNiwgLTMxLCAgMTQsICAtMiwKKyAgICAgMTQsIC0xMCwgLTMwLCAtMjAsICAyNywgICA5LCAgMzksIC0zOSwgLTE4LCAgLTUsCisgICAgfSwgeworICAgIC03MywgIDMyLCAgNjAsICAxNSwgIDI2LCAtNTksICAtMiwgIDMzLCAtMzAsICAxMCwKKyAgICAgIDMsICAxNywgIC04LCAtMzAsICAgMSwgIDI2LCAgIDQsICAyMiwgLTEwLCAtMTYsCisgICAgIDM2LCAgIDUsICAxMSwgLTU2LCAtMzcsICAtNiwgIDEwLCAgIDUsICAxMywgICAzLAorICAgICAtNiwgICA1LCAtMTEsICAtNCwgIDE5LCAgIDUsICAxNiwgLTQxLCAtMjQsIC0xMworICAgIH0KK307CisKK2NvbnN0IHVpbnQxNl90IGZmX2NiMV9iYXNlWzEyOF09eworICAgIDE5NjU3LCAxODQ3NCwgMTgzNjUsIDE3NTIwLCAyMTA0OCwgMTgyMzEsIDE4NTg0LCAxNjY3MSwKKyAgICAyMDM2MywgMTkwNjksIDE5NDA5LCAxODQzMCwgMjE4NDQsIDE4NzUzLCAxOTYxMywgMTc0MTEsCisgICAgMjAzODksIDIxNzcyLCAyMDEyOSwgMjE3MDIsIDIwOTc4LCAyMDQ3MiwgMTk2MjcsIDE5Mzg3LAorICAgIDIxNDc3LCAyMzEzNCwgMjE4NDEsIDIzOTE5LCAyMjA4OSwgMjE1MTksIDIxMTM0LCAyMDg1MiwKKyAgICAxOTY3NSwgMTc4MjEsIDE5MDQ0LCAxNzQ3NywgMTk5ODYsIDE2OTU1LCAxODQ0NiwgMTYwODYsCisgICAgMjExMzgsIDE4ODk5LCAyMDk1MiwgMTg5MjksIDIxNDUyLCAxNzgzMywgMjAxMDQsIDE3MTU5LAorICAgIDE5NzcwLCAyMDA1NiwgMjAzMzYsIDIwODY2LCAxOTMyOSwgMTgyMTcsIDE4OTA4LCAxODAwNCwKKyAgICAyMTU1NiwgMjE5NDgsIDIzMDc5LCAyMzg4OSwgMjA5MjIsIDE5NTQ0LCAyMDk4NCwgMTk3ODEsCisgICAgMTk3ODEsIDIwOTg0LCAxOTU0NCwgMjA5MjIsIDIzODg5LCAyMzA3OSwgMjE5NDgsIDIxNTU2LAorICAgIDE4MDA0LCAxODkwOCwgMTgyMTcsIDE5MzI5LCAyMDg2NiwgMjAzMzYsIDIwMDU2LCAxOTc3MCwKKyAgICAxNzE1OSwgMjAxMDQsIDE3ODMzLCAyMTQ1MiwgMTg5MjksIDIwOTUyLCAxODg5OSwgMjExMzgsCisgICAgMTYwODYsIDE4NDQ2LCAxNjk1NSwgMTk5ODYsIDE3NDc3LCAxOTA0NCwgMTc4MjEsIDE5Njc1LAorICAgIDIwODUyLCAyMTEzNCwgMjE1MTksIDIyMDg5LCAyMzkxOSwgMjE4NDEsIDIzMTM0LCAyMTQ3NywKKyAgICAxOTM4NywgMTk2MjcsIDIwNDcyLCAyMDk3OCwgMjE3MDIsIDIwMTI5LCAyMTc3MiwgMjAzODksCisgICAgMTc0MTEsIDE5NjEzLCAxODc1MywgMjE4NDQsIDE4NDMwLCAxOTQwOSwgMTkwNjksIDIwMzYzLAorICAgIDE2NjcxLCAxODU4NCwgMTgyMzEsIDIxMDQ4LCAxNzUyMCwgMTgzNjUsIDE4NDc0LCAxOTY1NywKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX2NiMl9iYXNlWzEyOF09eworICAgIDEyMTc0LCAxMzM4MCwgMTM4NzksIDEzODMyLCAxMzE3MCwgMTMyMjcsIDEzMjA0LCAxMjA1MywKKyAgICAxMjQxMCwgMTM5ODgsIDE0MzQ4LCAxNDYzMSwgMTMxMDAsIDEzNDE1LCAxMzIyNCwgMTIyNjgsCisgICAgMTE5ODIsIDEzODI1LCAxMzQ5OSwgMTQyMTAsIDEzODc3LCAxNDc4OCwgMTM4MTEsIDEzMTA5LAorICAgIDExNDQ5LCAxMzI3NSwgMTI4MzMsIDEzNzE3LCAxMjcyOCwgMTM2OTYsIDEyNzU5LCAxMjQwNSwKKyAgICAxMDIzMCwgMTIxODUsIDExNjI4LCAxMzE2MSwgMTE3NjIsIDEzNDU4LCAxMjMxMiwgMTI4MTgsCisgICAgMTA0NDMsIDEyNzczLCAxMjAxMSwgMTQwMjAsIDExODE4LCAxMzgyNSwgMTI0NTMsIDEzMjI2LAorICAgIDEwNDQ2LCAxMzE2MiwgMTE4ODEsIDE0MzAwLCAxMjg1OSwgMTYyODgsIDEzNDkwLCAxNTA1MywKKyAgICAxMDE1NSwgMTI4MjAsIDExNTE5LCAxMzk3MywgMTIwNDEsIDE1MDgxLCAxMjYzNSwgMTQxOTgsCisgICAgMTQxOTgsIDEyNjM1LCAxNTA4MSwgMTIwNDEsIDEzOTczLCAxMTUxOSwgMTI4MjAsIDEwMTU1LAorICAgIDE1MDUzLCAxMzQ5MCwgMTYyODgsIDEyODU5LCAxNDMwMCwgMTE4ODEsIDEzMTYyLCAxMDQ0NiwKKyAgICAxMzIyNiwgMTI0NTMsIDEzODI1LCAxMTgxOCwgMTQwMjAsIDEyMDExLCAxMjc3MywgMTA0NDMsCisgICAgMTI4MTgsIDEyMzEyLCAxMzQ1OCwgMTE3NjIsIDEzMTYxLCAxMTYyOCwgMTIxODUsIDEwMjMwLAorICAgIDEyNDA1LCAxMjc1OSwgMTM2OTYsIDEyNzI4LCAxMzcxNywgMTI4MzMsIDEzMjc1LCAxMTQ0OSwKKyAgICAxMzEwOSwgMTM4MTEsIDE0Nzg4LCAxMzg3NywgMTQyMTAsIDEzNDk5LCAxMzgyNSwgMTE5ODIsCisgICAgMTIyNjgsIDEzMjI0LCAxMzQxNSwgMTMxMDAsIDE0NjMxLCAxNDM0OCwgMTM5ODgsIDEyNDEwLAorICAgIDEyMDUzLCAxMzIwNCwgMTMyMjcsIDEzMTcwLCAxMzgzMiwgMTM4NzksIDEzMzgwLCAxMjE3NCwKK307CisKK2NvbnN0IGludDE2X3QgZmZfZW5lcmd5X3RhYlszMl09eworICAgICAgICAwLCAgICAxNiwgICAgMjAsICAgIDI1LCAgICAzMiwgICAgNDEsICAgIDUxLCAgICA2NSwKKyAgICAgICA4MSwgICAxMDMsICAgMTI5LCAgIDE2MywgICAyMDUsICAgMjU5LCAgIDMyNiwgICA0MTAsCisgICAgICA1MTYsICAgNjUwLCAgIDgxOSwgIDEwMzEsICAxMjk4LCAgMTYzNCwgIDIwNTcsICAyNTkwLAorICAgICAzMjYxLCAgNDEwNSwgIDUxNjgsICA2NTA3LCAgODE5MiwgMTAzMTMsIDEyOTgzLCAxNjM0NQorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgbHBjX3JlZmxfY2IxWzY0XT17CisgICAgLTQwNDEsIC00MDE4LCAtMzk5OCwgLTM5NzcsIC0zOTU0LCAtMzkzMCwgLTM5MDYsIC0zODc5LAorICAgIC0zODUyLCAtMzgyNSwgLTM3OTUsIC0zNzY0LCAtMzczMSwgLTM2OTksIC0zNjY2LCAtMzYzMSwKKyAgICAtMzU5NCwgLTM1NTUsIC0zNTEzLCAtMzQ2OCwgLTM0MjAsIC0zMzcyLCAtMzMyMSwgLTMyNjgsCisgICAgLTMyMTIsIC0zMTUzLCAtMzA5MCwgLTMwMjEsIC0yOTQ0LCAtMjg2MywgLTI3NzIsIC0yNjc2LAorICAgIC0yNTY1LCAtMjQ0NSwgLTIzMjgsIC0yMjAyLCAtMjA3MiwgLTE5NDEsIC0xODA4LCAtMTY2MCwKKyAgICAtMTUwOCwgLTEzNDgsIC0xMTg1LCAgLTk5NCwgIC03OTgsICAtNjAwLCAgLTM3NCwgIC0xMTAsCisgICAgICAxNTIsICAgNDQ3LCAgIDcyMCwgICA5ODIsICAxMjI5LCAgMTQ1NiwgIDE2ODIsICAxOTE2LAorICAgICAyMTMwLCAgMjM1MywgIDI1OTUsICAyODUzLCAgMzExOCwgIDMzNjMsICAzNTg4LCAgMzgxNAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgbHBjX3JlZmxfY2IyWzMyXT17CisgICAgLTMwOTEsIC0yMzg2LCAtMTg3MSwgLTE0MjUsIC0xMDIxLCAgLTY0OSwgIC0zMTYsICAgLTIwLAorICAgICAgMjY3LCAgIDU0NCwgICA4MTAsICAxMDY1LCAgMTMwNSwgIDE1MzQsICAxNzU2LCAgMTk3MCwKKyAgICAgMjE3MSwgIDIzNTksICAyNTM2LCAgMjcwMCwgIDI4NTQsICAyOTk2LCAgMzEzMywgIDMyNjMsCisgICAgIDMzODYsICAzNDk5LCAgMzYwMywgIDM3MDEsICAzNzg5LCAgMzg3MCwgIDM5NDcsICA0MDIwCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBscGNfcmVmbF9jYjNbMzJdPXsKKyAgICAtMzUyNSwgLTMyOTUsIC0zMDgxLCAtMjg5MCwgLTI2OTYsIC0yNTExLCAtMjMyOCwgLTIxNDksCisgICAgLTE5NzksIC0xODE3LCAtMTY1OCwgLTE0OTgsIC0xMzQxLCAtMTE4OCwgLTEwMzIsICAtODc2LAorICAgICAtNzIxLCAgLTU2MSwgIC0zOTQsICAtMjI4LCAgIC01NCwgICAxMTksICAgMjk2LCAgIDQ4NCwKKyAgICAgIDY4MywgICA4OTUsICAxMTIzLCAgMTM3MywgIDE2NTEsICAxOTY1LCAgMjM2MCwgIDI4NTQKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGxwY19yZWZsX2NiNFsxNl09eworICAgIC0xODQ1LCAtMTA1NywgIC01MjIsICAgLTc3LCAgIDMwMSwgICA2NDcsICAgOTc1LCAgMTI4NSwKKyAgICAgMTU4MiwgIDE4NzMsICAyMTYzLCAgMjQ1MiwgIDI3MzUsICAzMDE3LCAgMzI5OSwgIDM1NjkKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGxwY19yZWZsX2NiNVsxNl09eworICAgIC0yNjkxLCAtMjE4NywgLTE3ODgsIC0xNDM1LCAtMTExOCwgIC04MzcsICAtNTcxLCAgLTMxNiwKKyAgICAgIC01OSwgICAyMDEsICAgNDcwLCAgIDc1OSwgIDEwNzcsICAxNDU3LCAgMTkwOCwgIDI0OTUKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGxwY19yZWZsX2NiNls4XT17CisgICAgLTEzNzIsICAtNDc0LCAgIDEzMywgICA2MzIsICAxMTAwLCAgMTU3MSwgIDIwNzUsICAyNjcyCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBscGNfcmVmbF9jYjdbOF09eworICAgIC0yMzg5LCAtMTc4NywgLTEyMzEsICAtNzE3LCAgLTIzOSwgICAyMzQsICAgNzcwLCAgMTQ3NAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgbHBjX3JlZmxfY2I4WzhdPXsKKyAgICAtMTU2OSwgIC04NjQsICAtMjk2LCAgIDIwMCwgICA2NzAsICAxMTUxLCAgMTcwOSwgIDIzODUKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGxwY19yZWZsX2NiOVs4XT17CisgICAgLTIyMDAsIC0xNjA4LCAtMTA2MiwgIC01NjksICAtMTIwLCAgIDMzOCwgICA4NjMsICAxNjIxCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBscGNfcmVmbF9jYjEwWzRdPXsKKyAgICAgLTYxNywgICAxOTAsICAgODAyLCAgMTQ4MworfTsKKworY29uc3QgaW50MTZfdCAqIGNvbnN0IGZmX2xwY19yZWZsX2NiWzEwXT17CisgICAgbHBjX3JlZmxfY2IxLCBscGNfcmVmbF9jYjIsIGxwY19yZWZsX2NiMywgbHBjX3JlZmxfY2I0LCBscGNfcmVmbF9jYjUsCisgICAgbHBjX3JlZmxfY2I2LCBscGNfcmVmbF9jYjcsIGxwY19yZWZsX2NiOCwgbHBjX3JlZmxfY2I5LCBscGNfcmVmbF9jYjEwCit9OworCitzdGF0aWMgdm9pZCBhZGRfd2F2KGludDE2X3QgKmRlc3QsIGludCBuLCBpbnQgc2tpcF9maXJzdCwgaW50ICptLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpzMSwgY29uc3QgaW50OF90ICpzMiwgY29uc3QgaW50OF90ICpzMykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgdlszXTsKKworICAgIHZbMF0gPSAwOworICAgIGZvciAoaT0hc2tpcF9maXJzdDsgaTwzOyBpKyspCisgICAgICAgIHZbaV0gPSAoZmZfZ2Fpbl92YWxfdGFiW25dW2ldICogbVtpXSkgPj4gZmZfZ2Fpbl9leHBfdGFiW25dOworCisgICAgaWYgKHZbMF0pIHsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBCTE9DS1NJWkU7IGkrKykKKyAgICAgICAgICAgIGRlc3RbaV0gPSAoczFbaV0qdlswXSArIHMyW2ldKnZbMV0gKyBzM1tpXSp2WzJdKSA+PiAxMjsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGk9MDsgaSA8IEJMT0NLU0laRTsgaSsrKQorICAgICAgICAgICAgZGVzdFtpXSA9ICggICAgICAgICAgICAgczJbaV0qdlsxXSArIHMzW2ldKnZbMl0pID4+IDEyOworICAgIH0KK30KKworLyoqCisgKiBDb3B5IHRoZSBsYXN0IG9mZnNldCB2YWx1ZXMgb2YgKnNvdXJjZSB0byAqdGFyZ2V0LiBJZiB0aG9zZSB2YWx1ZXMgYXJlIG5vdAorICogZW5vdWdoIHRvIGZpbGwgdGhlIHRhcmdldCBidWZmZXIsIGZpbGwgaXQgd2l0aCBhbm90aGVyIGNvcHkgb2YgdGhvc2UgdmFsdWVzLgorICovCit2b2lkIGZmX2NvcHlfYW5kX2R1cChpbnQxNl90ICp0YXJnZXQsIGNvbnN0IGludDE2X3QgKnNvdXJjZSwgaW50IG9mZnNldCkKK3sKKyAgICBzb3VyY2UgKz0gQlVGRkVSU0laRSAtIG9mZnNldDsKKworICAgIG1lbWNweSh0YXJnZXQsIHNvdXJjZSwgRkZNSU4oQkxPQ0tTSVpFLCBvZmZzZXQpKnNpemVvZigqdGFyZ2V0KSk7CisgICAgaWYgKG9mZnNldCA8IEJMT0NLU0laRSkKKyAgICAgICAgbWVtY3B5KHRhcmdldCArIG9mZnNldCwgc291cmNlLCAoQkxPQ0tTSVpFIC0gb2Zmc2V0KSpzaXplb2YoKnRhcmdldCkpOworfQorCisvKioKKyAqIEV2YWx1YXRlIHRoZSByZWZsZWN0aW9uIGNvZWZmaWNpZW50cyBmcm9tIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzLgorICoKKyAqIEByZXR1cm4gMSBpZiBvbmUgb2YgdGhlIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbgorICogICAgICAgICA0MDk1LCAwIGlmIG5vdC4KKyAqLworaW50IGZmX2V2YWxfcmVmbChpbnQgKnJlZmwsIGNvbnN0IGludDE2X3QgKmNvZWZzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGIsIGksIGo7CisgICAgaW50IGJ1ZmZlcjFbTFBDX09SREVSXTsKKyAgICBpbnQgYnVmZmVyMltMUENfT1JERVJdOworICAgIGludCAqYnAxID0gYnVmZmVyMTsKKyAgICBpbnQgKmJwMiA9IGJ1ZmZlcjI7CisKKyAgICBmb3IgKGk9MDsgaSA8IExQQ19PUkRFUjsgaSsrKQorICAgICAgICBidWZmZXIyW2ldID0gY29lZnNbaV07CisKKyAgICByZWZsW0xQQ19PUkRFUi0xXSA9IGJwMltMUENfT1JERVItMV07CisKKyAgICBpZiAoKHVuc2lnbmVkKSBicDJbTFBDX09SREVSLTFdICsgMHgxMDAwID4gMHgxZmZmKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT3ZlcmZsb3cuIEJyb2tlbiBzYW1wbGU/XG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgZm9yIChpID0gTFBDX09SREVSLTI7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGIgPSAweDEwMDAtKChicDJbaSsxXSAqIGJwMltpKzFdKSA+PiAxMik7CisKKyAgICAgICAgaWYgKCFiKQorICAgICAgICAgICAgYiA9IC0yOworCisgICAgICAgIGIgPSAweDEwMDAwMDAgLyBiOworICAgICAgICBmb3IgKGo9MDsgaiA8PSBpOyBqKyspIHsKKyNpZiBDT05GSUdfRlRSQVBWCisgICAgICAgICAgICBpbnQgYSA9IGJwMltqXSAtICgocmVmbFtpKzFdICogYnAyW2ktal0pID4+IDEyKTsKKyAgICAgICAgICAgIGlmKChpbnQpKGEqKHVuc2lnbmVkKWIpICE9IGEqKGludDY0X3QpYikKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyNlbmRpZgorICAgICAgICAgICAgYnAxW2pdID0gKChicDJbal0gLSAoKHJlZmxbaSsxXSAqIGJwMltpLWpdKSA+PiAxMikpICogYikgPj4gMTI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHVuc2lnbmVkKSBicDFbaV0gKyAweDEwMDAgPiAweDFmZmYpCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICByZWZsW2ldID0gYnAxW2ldOworCisgICAgICAgIEZGU1dBUChpbnQgKiwgYnAxLCBicDIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBFdmFsdWF0ZSB0aGUgTFBDIGZpbHRlciBjb2VmZmljaWVudHMgZnJvbSB0aGUgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMuCisgKiBEb2VzIHRoZSBpbnZlcnNlIG9mIHRoZSBmZl9ldmFsX3JlZmwoKSBmdW5jdGlvbi4KKyAqLwordm9pZCBmZl9ldmFsX2NvZWZzKGludCAqY29lZnMsIGNvbnN0IGludCAqcmVmbCkKK3sKKyAgICBpbnQgYnVmZmVyW0xQQ19PUkRFUl07CisgICAgaW50ICpiMSA9IGJ1ZmZlcjsKKyAgICBpbnQgKmIyID0gY29lZnM7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGk9MDsgaSA8IExQQ19PUkRFUjsgaSsrKSB7CisgICAgICAgIGIxW2ldID0gcmVmbFtpXSA8PCA0OworCisgICAgICAgIGZvciAoaj0wOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgYjFbal0gPSAoKHJlZmxbaV0gKiBiMltpLWotMV0pID4+IDEyKSArIGIyW2pdOworCisgICAgICAgIEZGU1dBUChpbnQgKiwgYjEsIGIyKTsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaSA8IExQQ19PUkRFUjsgaSsrKQorICAgICAgICBjb2Vmc1tpXSA+Pj0gNDsKK30KKwordm9pZCBmZl9pbnRfdG9faW50MTYoaW50MTZfdCAqb3V0LCBjb25zdCBpbnQgKmlucCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMUENfT1JERVI7IGkrKykKKyAgICAgICAgKm91dCsrID0gKmlucCsrOworfQorCisvKioKKyAqIEV2YWx1YXRlIHNxcnQoeCA8PCAyNCkuIHggbXVzdCBmaXQgaW4gMjAgYml0cy4gVGhpcyB2YWx1ZSBpcyBldmFsdWF0ZWQgaW4gYW4KKyAqIG9kZCB3YXkgdG8gbWFrZSB0aGUgb3V0cHV0IGlkZW50aWNhbCB0byB0aGUgYmluYXJ5IGRlY29kZXIuCisgKi8KK2ludCBmZl90X3NxcnQodW5zaWduZWQgaW50IHgpCit7CisgICAgaW50IHMgPSAyOworICAgIHdoaWxlICh4ID4gMHhmZmYpIHsKKyAgICAgICAgcysrOworICAgICAgICB4ID4+PSAyOworICAgIH0KKworICAgIHJldHVybiBmZl9zcXJ0KHggPDwgMjApIDw8IHM7Cit9CisKK3Vuc2lnbmVkIGludCBmZl9ybXMoY29uc3QgaW50ICpkYXRhKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGludCByZXMgPSAweDEwMDAwOworICAgIGludCBiID0gTFBDX09SREVSOworCisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUjsgaSsrKSB7CisgICAgICAgIHJlcyA9ICgoKDB4MTAwMDAwMCAtIGRhdGFbaV0qZGF0YVtpXSkgPj4gMTIpICogcmVzKSA+PiAxMjsKKworICAgICAgICBpZiAocmVzID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICB3aGlsZSAocmVzIDw9IDB4M2ZmZikgeworICAgICAgICAgICAgYisrOworICAgICAgICAgICAgcmVzIDw8PSAyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZmX3Rfc3FydChyZXMpID4+IGI7Cit9CisKK2ludCBmZl9pbnRlcnAoUkExNDRDb250ZXh0ICpyYWN0eCwgaW50MTZfdCAqb3V0LCBpbnQgYSwgaW50IGNvcHlvbGQsIGludCBlbmVyZ3kpCit7CisgICAgaW50IHdvcmtbTFBDX09SREVSXTsKKyAgICBpbnQgYiA9IE5CTE9DS1MgLSBhOworICAgIGludCBpOworCisgICAgLy8gSW50ZXJwb2xhdGUgYmxvY2sgY29lZmZpY2llbnRzIGZyb20gdGhlIHRoaXMgZnJhbWUncyBmb3J0aCBibG9jayBhbmQKKyAgICAvLyBsYXN0IGZyYW1lJ3MgZm9ydGggYmxvY2suCisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUjsgaSsrKQorICAgICAgICBvdXRbaV0gPSAoYSAqIHJhY3R4LT5scGNfY29lZlswXVtpXSArIGIgKiByYWN0eC0+bHBjX2NvZWZbMV1baV0pPj4gMjsKKworICAgIGlmIChmZl9ldmFsX3JlZmwod29yaywgb3V0LCByYWN0eC0+YXZjdHgpKSB7CisgICAgICAgIC8vIFRoZSBpbnRlcnBvbGF0ZWQgY29lZmZpY2llbnRzIGFyZSB1bnN0YWJsZSwgY29weSBlaXRoZXIgbmV3IG9yIG9sZAorICAgICAgICAvLyBjb2VmZmljaWVudHMuCisgICAgICAgIGZmX2ludF90b19pbnQxNihvdXQsIHJhY3R4LT5scGNfY29lZltjb3B5b2xkXSk7CisgICAgICAgIHJldHVybiBmZl9yZXNjYWxlX3JtcyhyYWN0eC0+bHBjX3JlZmxfcm1zW2NvcHlvbGRdLCBlbmVyZ3kpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmZl9yZXNjYWxlX3JtcyhmZl9ybXMod29yayksIGVuZXJneSk7CisgICAgfQorfQorCit1bnNpZ25lZCBpbnQgZmZfcmVzY2FsZV9ybXModW5zaWduZWQgaW50IHJtcywgdW5zaWduZWQgaW50IGVuZXJneSkKK3sKKyAgICByZXR1cm4gKHJtcyAqIGVuZXJneSkgPj4gMTA7Cit9CisKKy8qKiBpbnZlcnNlIHJvb3QgbWVhbiBzcXVhcmUgKi8KK2ludCBmZl9pcm1zKEF1ZGlvRFNQQ29udGV4dCAqYWRzcCwgY29uc3QgaW50MTZfdCAqZGF0YSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3VtID0gYWRzcC0+c2NhbGFycHJvZHVjdF9pbnQxNihkYXRhLCBkYXRhLCBCTE9DS1NJWkUpOworCisgICAgaWYgKHN1bSA9PSAwKQorICAgICAgICByZXR1cm4gMDsgLyogT09QUyAtIGRpdmlzaW9uIGJ5IHplcm8gKi8KKworICAgIHJldHVybiAweDIwMDAwMDAwIC8gKGZmX3Rfc3FydChzdW0pID4+IDgpOworfQorCit2b2lkIGZmX3N1YmJsb2NrX3N5bnRoZXNpcyhSQTE0NENvbnRleHQgKnJhY3R4LCBjb25zdCBpbnQxNl90ICpscGNfY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2JhX2lkeCwgaW50IGNiMV9pZHgsIGludCBjYjJfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd2YWwsIGludCBnYWluKQoreworICAgIGludDE2X3QgKmJsb2NrOworICAgIGludCBtWzNdOworCisgICAgaWYgKGNiYV9pZHgpIHsKKyAgICAgICAgY2JhX2lkeCArPSBCTE9DS1NJWkUvMiAtIDE7CisgICAgICAgIGZmX2NvcHlfYW5kX2R1cChyYWN0eC0+YnVmZmVyX2EsIHJhY3R4LT5hZGFwdF9jYiwgY2JhX2lkeCk7CisgICAgICAgIG1bMF0gPSAoZmZfaXJtcygmcmFjdHgtPmFkc3AsIHJhY3R4LT5idWZmZXJfYSkgKiBndmFsKSA+PiAxMjsKKyAgICB9IGVsc2UgeworICAgICAgICBtWzBdID0gMDsKKyAgICB9CisgICAgbVsxXSA9IChmZl9jYjFfYmFzZVtjYjFfaWR4XSAqIGd2YWwpID4+IDg7CisgICAgbVsyXSA9IChmZl9jYjJfYmFzZVtjYjJfaWR4XSAqIGd2YWwpID4+IDg7CisgICAgbWVtbW92ZShyYWN0eC0+YWRhcHRfY2IsIHJhY3R4LT5hZGFwdF9jYiArIEJMT0NLU0laRSwKKyAgICAgICAgICAgIChCVUZGRVJTSVpFIC0gQkxPQ0tTSVpFKSAqIHNpemVvZigqcmFjdHgtPmFkYXB0X2NiKSk7CisKKyAgICBibG9jayA9IHJhY3R4LT5hZGFwdF9jYiArIEJVRkZFUlNJWkUgLSBCTE9DS1NJWkU7CisKKyAgICBhZGRfd2F2KGJsb2NrLCBnYWluLCBjYmFfaWR4LCBtLCBjYmFfaWR4PyByYWN0eC0+YnVmZmVyX2E6IE5VTEwsCisgICAgICAgICAgICBmZl9jYjFfdmVjdHNbY2IxX2lkeF0sIGZmX2NiMl92ZWN0c1tjYjJfaWR4XSk7CisKKyAgICBtZW1jcHkocmFjdHgtPmN1cnJfc2Jsb2NrLCByYWN0eC0+Y3Vycl9zYmxvY2sgKyBCTE9DS1NJWkUsCisgICAgICAgICAgIExQQ19PUkRFUipzaXplb2YoKnJhY3R4LT5jdXJyX3NibG9jaykpOworCisgICAgaWYgKGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcihyYWN0eC0+Y3Vycl9zYmxvY2sgKyBMUENfT1JERVIsIGxwY19jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLCBCTE9DS1NJWkUsIExQQ19PUkRFUiwgMSwgMCwgMHhmZmYpKQorICAgICAgICBtZW1zZXQocmFjdHgtPmN1cnJfc2Jsb2NrLCAwLCAoTFBDX09SREVSK0JMT0NLU0laRSkqc2l6ZW9mKCpyYWN0eC0+Y3Vycl9zYmxvY2spKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JhMTQ0LmggYi9mZm1wZWcvbGliYXZjb2RlYy9yYTE0NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzQ3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yYTE0NC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBSZWFsIEF1ZGlvIDEuMCAoMTQuNEspCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19SQTE0NF9ICisjZGVmaW5lIEFWQ09ERUNfUkExNDRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibHBjLmgiCisjaW5jbHVkZSAiYXVkaW9fZnJhbWVfcXVldWUuaCIKKyNpbmNsdWRlICJhdWRpb2RzcC5oIgorCisjZGVmaW5lIE5CTE9DS1MgICAgICAgICA0ICAgICAgIC8vLzwgbnVtYmVyIG9mIHN1YmJsb2NrcyB3aXRoaW4gYSBibG9jaworI2RlZmluZSBCTE9DS1NJWkUgICAgICAgNDAgICAgICAvLy88IHN1YmJsb2NrIHNpemUgaW4gMTYtYml0IHdvcmRzCisjZGVmaW5lIEJVRkZFUlNJWkUgICAgICAxNDYgICAgIC8vLzwgdGhlIHNpemUgb2YgdGhlIGFkYXB0aXZlIGNvZGVib29rCisjZGVmaW5lIEZJWEVEX0NCX1NJWkUgICAxMjggICAgIC8vLzwgc2l6ZSBvZiBmaXhlZCBjb2RlYm9va3MKKyNkZWZpbmUgRlJBTUVfU0laRSAgICAgIDIwICAgICAgLy8vPCBzaXplIG9mIGVuY29kZWQgZnJhbWUKKyNkZWZpbmUgTFBDX09SREVSICAgICAgIDEwICAgICAgLy8vPCBvcmRlciBvZiBMUEMgZmlsdGVyCisKK3R5cGVkZWYgc3RydWN0IFJBMTQ0Q29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEF1ZGlvRFNQQ29udGV4dCBhZHNwOworICAgIExQQ0NvbnRleHQgbHBjX2N0eDsKKyAgICBBdWRpb0ZyYW1lUXVldWUgYWZxOworICAgIGludCBsYXN0X2ZyYW1lOworCisgICAgdW5zaWduZWQgaW50ICAgICBvbGRfZW5lcmd5OyAgICAgICAgLy8vPCBwcmV2aW91cyBmcmFtZSBlbmVyZ3kKKworICAgIHVuc2lnbmVkIGludCAgICAgbHBjX3RhYmxlc1syXVsxMF07CisKKyAgICAvKiogTFBDIGNvZWZmaWNpZW50czogbHBjX2NvZWZbMF0gaXMgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgY3VycmVudCBmcmFtZQorICAgICAqICBhbmQgbHBjX2NvZWZbMV0gb2YgdGhlIHByZXZpb3VzIG9uZS4gKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgKmxwY19jb2VmWzJdOworCisgICAgdW5zaWduZWQgaW50ICAgICBscGNfcmVmbF9ybXNbMl07CisKKyAgICBpbnQxNl90IGN1cnJfYmxvY2tbTkJMT0NLUyAqIEJMT0NLU0laRV07CisKKyAgICAvKiogVGhlIGN1cnJlbnQgc3ViYmxvY2sgcGFkZGVkIGJ5IHRoZSBsYXN0IDEwIHZhbHVlcyBvZiB0aGUgcHJldmlvdXMgb25lLiAqLworICAgIGludDE2X3QgY3Vycl9zYmxvY2tbNTBdOworCisgICAgLyoqIEFkYXB0aXZlIGNvZGVib29rLCBpdHMgc2l6ZSBpcyB0d28gdW5pdHMgYmlnZ2VyIHRvIGF2b2lkIGEKKyAgICAgKiAgYnVmZmVyIG92ZXJmbG93LiAqLworICAgIGludDE2X3QgYWRhcHRfY2JbMTQ2KzJdOworCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBidWZmZXJfYSlbRkZBTElHTihCTE9DS1NJWkUsMTYpXTsKK30gUkExNDRDb250ZXh0OworCit2b2lkIGZmX2NvcHlfYW5kX2R1cChpbnQxNl90ICp0YXJnZXQsIGNvbnN0IGludDE2X3QgKnNvdXJjZSwgaW50IG9mZnNldCk7CitpbnQgZmZfZXZhbF9yZWZsKGludCAqcmVmbCwgY29uc3QgaW50MTZfdCAqY29lZnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cit2b2lkIGZmX2V2YWxfY29lZnMoaW50ICpjb2VmcywgY29uc3QgaW50ICpyZWZsKTsKK3ZvaWQgZmZfaW50X3RvX2ludDE2KGludDE2X3QgKm91dCwgY29uc3QgaW50ICppbnApOworaW50IGZmX3Rfc3FydCh1bnNpZ25lZCBpbnQgeCk7Cit1bnNpZ25lZCBpbnQgZmZfcm1zKGNvbnN0IGludCAqZGF0YSk7CitpbnQgZmZfaW50ZXJwKFJBMTQ0Q29udGV4dCAqcmFjdHgsIGludDE2X3QgKm91dCwgaW50IGEsIGludCBjb3B5b2xkLAorICAgICAgICAgICAgICBpbnQgZW5lcmd5KTsKK3Vuc2lnbmVkIGludCBmZl9yZXNjYWxlX3Jtcyh1bnNpZ25lZCBpbnQgcm1zLCB1bnNpZ25lZCBpbnQgZW5lcmd5KTsKK2ludCBmZl9pcm1zKEF1ZGlvRFNQQ29udGV4dCAqYWRzcCwgY29uc3QgaW50MTZfdCAqZGF0YS8qYWxpZ24gMTYqLyk7Cit2b2lkIGZmX3N1YmJsb2NrX3N5bnRoZXNpcyhSQTE0NENvbnRleHQgKnJhY3R4LCBjb25zdCBpbnQxNl90ICpscGNfY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2JhX2lkeCwgaW50IGNiMV9pZHgsIGludCBjYjJfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd2YWwsIGludCBnYWluKTsKKworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfZ2Fpbl92YWxfdGFiWzI1Nl1bM107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9nYWluX2V4cF90YWJbMjU2XTsKK2V4dGVybiBjb25zdCBpbnQ4X3QgZmZfY2IxX3ZlY3RzWzEyOF1bNDBdOworZXh0ZXJuIGNvbnN0IGludDhfdCBmZl9jYjJfdmVjdHNbMTI4XVs0MF07CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfY2IxX2Jhc2VbMTI4XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9jYjJfYmFzZVsxMjhdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfZW5lcmd5X3RhYlszMl07CitleHRlcm4gY29uc3QgaW50MTZfdCAqIGNvbnN0IGZmX2xwY19yZWZsX2NiWzEwXTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUkExNDRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcmExNDRkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JhMTQ0ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNzgyMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JhMTQ0ZGVjLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBSZWFsIEF1ZGlvIDEuMCAoMTQuNEspCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFZpdG9yIFNlc3NhaworICogQ29weXJpZ2h0IChjKSAyMDAzIE5pY2sgS3Vyc2hldgorICogICAgIEJhc2VkIG9uIHB1YmxpYyBkb21haW4gZGVjb2RlciBhdCBodHRwOi8vd3d3LmhvbmV5cG90Lm5ldC9hdWRpbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyYTE0NC5oIgorCisKK3N0YXRpYyBhdl9jb2xkIGludCByYTE0NF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqIGF2Y3R4KQoreworICAgIFJBMTQ0Q29udGV4dCAqcmFjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcmFjdHgtPmF2Y3R4ID0gYXZjdHg7CisgICAgZmZfYXVkaW9kc3BfaW5pdCgmcmFjdHgtPmFkc3ApOworCisgICAgcmFjdHgtPmxwY19jb2VmWzBdID0gcmFjdHgtPmxwY190YWJsZXNbMF07CisgICAgcmFjdHgtPmxwY19jb2VmWzFdID0gcmFjdHgtPmxwY190YWJsZXNbMV07CisKKyAgICBhdmN0eC0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIGF2Y3R4LT5zYW1wbGVfZm10ICAgICA9IEFWX1NBTVBMRV9GTVRfUzE2OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX291dHB1dF9zdWJibG9jayhSQTE0NENvbnRleHQgKnJhY3R4LCBjb25zdCBpbnQxNl90ICAqbHBjX2NvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndmFsLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgY2JhX2lkeCA9IGdldF9iaXRzKGdiLCA3KTsgLy8gaW5kZXggb2YgdGhlIGFkYXB0aXZlIENCLCAwIGlmIG5vbmUKKyAgICBpbnQgZ2FpbiAgICA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICBpbnQgY2IxX2lkeCA9IGdldF9iaXRzKGdiLCA3KTsKKyAgICBpbnQgY2IyX2lkeCA9IGdldF9iaXRzKGdiLCA3KTsKKworICAgIGZmX3N1YmJsb2NrX3N5bnRoZXNpcyhyYWN0eCwgbHBjX2NvZWZzLCBjYmFfaWR4LCBjYjFfaWR4LCBjYjJfaWR4LCBndmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluKTsKK30KKworLyoqIFVuY29tcHJlc3Mgb25lIGJsb2NrICgyMCBieXRlcyAtPiAxNjAqMiBieXRlcykuICovCitzdGF0aWMgaW50IHJhMTQ0X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqIGF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBzaXplc1tMUENfT1JERVJdID0gezYsIDUsIDUsIDQsIDQsIDMsIDMsIDMsIDMsIDJ9OworICAgIHVuc2lnbmVkIGludCByZWZsX3Jtc1tOQkxPQ0tTXTsgICAgICAgICAgIC8vIFJNUyBvZiB0aGUgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKKyAgICBpbnQxNl90IGJsb2NrX2NvZWZzW05CTE9DS1NdW0xQQ19PUkRFUl07ICAvLyBMUEMgY29lZmZpY2llbnRzIG9mIGVhY2ggc3ViLWJsb2NrCisgICAgdW5zaWduZWQgaW50IGxwY19yZWZsW0xQQ19PUkRFUl07ICAgICAgICAgLy8gTFBDIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzIG9mIHRoZSBmcmFtZQorICAgIGludCBpLCBqOworICAgIGludCByZXQ7CisgICAgaW50MTZfdCAqc2FtcGxlczsKKyAgICB1bnNpZ25lZCBpbnQgZW5lcmd5OworCisgICAgUkExNDRDb250ZXh0ICpyYWN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKworICAgIGlmIChidWZfc2l6ZSA8IEZSQU1FX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRnJhbWUgdG9vIHNtYWxsICglZCBieXRlcykuIFRydW5jYXRlZCBmaWxlP1xuIiwgYnVmX3NpemUpOworICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBOQkxPQ0tTICogQkxPQ0tTSVpFOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgc2FtcGxlcyA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICBpbml0X2dldF9iaXRzOCgmZ2IsIGJ1ZiwgRlJBTUVfU0laRSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBDX09SREVSOyBpKyspCisgICAgICAgIGxwY19yZWZsW2ldID0gZmZfbHBjX3JlZmxfY2JbaV1bZ2V0X2JpdHMoJmdiLCBzaXplc1tpXSldOworCisgICAgZmZfZXZhbF9jb2VmcyhyYWN0eC0+bHBjX2NvZWZbMF0sIGxwY19yZWZsKTsKKyAgICByYWN0eC0+bHBjX3JlZmxfcm1zWzBdID0gZmZfcm1zKGxwY19yZWZsKTsKKworICAgIGVuZXJneSA9IGZmX2VuZXJneV90YWJbZ2V0X2JpdHMoJmdiLCA1KV07CisKKyAgICByZWZsX3Jtc1swXSA9IGZmX2ludGVycChyYWN0eCwgYmxvY2tfY29lZnNbMF0sIDEsIDEsIHJhY3R4LT5vbGRfZW5lcmd5KTsKKyAgICByZWZsX3Jtc1sxXSA9IGZmX2ludGVycChyYWN0eCwgYmxvY2tfY29lZnNbMV0sIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5lcmd5IDw9IHJhY3R4LT5vbGRfZW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX3Rfc3FydChlbmVyZ3kqcmFjdHgtPm9sZF9lbmVyZ3kpID4+IDEyKTsKKyAgICByZWZsX3Jtc1syXSA9IGZmX2ludGVycChyYWN0eCwgYmxvY2tfY29lZnNbMl0sIDMsIDAsIGVuZXJneSk7CisgICAgcmVmbF9ybXNbM10gPSBmZl9yZXNjYWxlX3JtcyhyYWN0eC0+bHBjX3JlZmxfcm1zWzBdLCBlbmVyZ3kpOworCisgICAgZmZfaW50X3RvX2ludDE2KGJsb2NrX2NvZWZzWzNdLCByYWN0eC0+bHBjX2NvZWZbMF0pOworCisgICAgZm9yIChpPTA7IGkgPCBOQkxPQ0tTOyBpKyspIHsKKyAgICAgICAgZG9fb3V0cHV0X3N1YmJsb2NrKHJhY3R4LCBibG9ja19jb2Vmc1tpXSwgcmVmbF9ybXNbaV0sICZnYik7CisKKyAgICAgICAgZm9yIChqPTA7IGogPCBCTE9DS1NJWkU7IGorKykKKyAgICAgICAgICAgICpzYW1wbGVzKysgPSBhdl9jbGlwX2ludDE2KHJhY3R4LT5jdXJyX3NibG9ja1tqICsgMTBdIDw8IDIpOworICAgIH0KKworICAgIHJhY3R4LT5vbGRfZW5lcmd5ID0gZW5lcmd5OworICAgIHJhY3R4LT5scGNfcmVmbF9ybXNbMV0gPSByYWN0eC0+bHBjX3JlZmxfcm1zWzBdOworCisgICAgRkZTV0FQKHVuc2lnbmVkIGludCAqLCByYWN0eC0+bHBjX2NvZWZbMF0sIHJhY3R4LT5scGNfY29lZlsxXSk7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gRlJBTUVfU0laRTsKK30KKworQVZDb2RlYyBmZl9yYV8xNDRfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicmVhbF8xNDQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsQXVkaW8gMS4wICgxNC40SykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUkFfMTQ0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihSQTE0NENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHJhMTQ0X2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IHJhMTQ0X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JhMTQ0ZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9yYTE0NGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDNmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yYTE0NGVuYy5jCkBAIC0wLDAgKzEsNTU5IEBACisvKgorICogUmVhbCBBdWRpbyAxLjAgKDE0LjRLKSBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgRnJhbmNlc2NvIExhdnJhIDxmcmFuY2VzY29sYXZyYUBpbnRlcmZyZWUuaXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJlYWwgQXVkaW8gMS4wICgxNC40SykgZW5jb2RlcgorICogQGF1dGhvciBGcmFuY2VzY28gTGF2cmEgPGZyYW5jZXNjb2xhdnJhQGludGVyZnJlZS5pdD4KKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJhdWRpb19mcmFtZV9xdWV1ZS5oIgorI2luY2x1ZGUgImNlbHBfZmlsdGVycy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAicmExNDQuaCIKKworc3RhdGljIGF2X2NvbGQgaW50IHJhMTQ0X2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUkExNDRDb250ZXh0ICpyYWN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZmZfbHBjX2VuZCgmcmFjdHgtPmxwY19jdHgpOworICAgIGZmX2FmX3F1ZXVlX2Nsb3NlKCZyYWN0eC0+YWZxKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgYXZfY29sZCBpbnQgcmExNDRfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKiBhdmN0eCkKK3sKKyAgICBSQTE0NENvbnRleHQgKnJhY3R4OworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG51bWJlciBvZiBjaGFubmVsczogJWRcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gTkJMT0NLUyAqIEJMT0NLU0laRTsKKyAgICBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nID0gYXZjdHgtPmZyYW1lX3NpemU7CisgICAgYXZjdHgtPmJpdF9yYXRlID0gODAwMDsKKyAgICByYWN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcmFjdHgtPmxwY19jb2VmWzBdID0gcmFjdHgtPmxwY190YWJsZXNbMF07CisgICAgcmFjdHgtPmxwY19jb2VmWzFdID0gcmFjdHgtPmxwY190YWJsZXNbMV07CisgICAgcmFjdHgtPmF2Y3R4ID0gYXZjdHg7CisgICAgZmZfYXVkaW9kc3BfaW5pdCgmcmFjdHgtPmFkc3ApOworICAgIHJldCA9IGZmX2xwY19pbml0KCZyYWN0eC0+bHBjX2N0eCwgYXZjdHgtPmZyYW1lX3NpemUsIExQQ19PUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICBGRl9MUENfVFlQRV9MRVZJTlNPTik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBmZl9hZl9xdWV1ZV9pbml0KGF2Y3R4LCAmcmFjdHgtPmFmcSk7CisKKyAgICByZXR1cm4gMDsKK2Vycm9yOgorICAgIHJhMTQ0X2VuY29kZV9jbG9zZShhdmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIFF1YW50aXplIGEgdmFsdWUgYnkgc2VhcmNoaW5nIGEgc29ydGVkIHRhYmxlIGZvciB0aGUgZWxlbWVudCB3aXRoIHRoZQorICogbmVhcmVzdCB2YWx1ZQorICoKKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBxdWFudGl6ZQorICogQHBhcmFtIHRhYmxlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHF1YW50aXphdGlvbiB0YWJsZQorICogQHBhcmFtIHNpemUgc2l6ZSBvZiB0aGUgcXVhbnRpemF0aW9uIHRhYmxlCisgKiBAcmV0dXJuIGluZGV4IG9mIHRoZSBxdWFudGl6YXRpb24gdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudCB3aXRoIHRoZQorICogICAgICAgICBuZWFyZXN0IHZhbHVlCisgKi8KK3N0YXRpYyBpbnQgcXVhbnRpemUoaW50IHZhbHVlLCBjb25zdCBpbnQxNl90ICp0YWJsZSwgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgdW5zaWduZWQgaW50IGxvdyA9IDAsIGhpZ2ggPSBzaXplIC0gMTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCBpbmRleCA9IChsb3cgKyBoaWdoKSA+PiAxOworICAgICAgICBpbnQgZXJyb3IgPSB0YWJsZVtpbmRleF0gLSB2YWx1ZTsKKworICAgICAgICBpZiAoaW5kZXggPT0gbG93KQorICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2hpZ2hdICsgZXJyb3IgPiB2YWx1ZSA/IGxvdyA6IGhpZ2g7CisgICAgICAgIGlmIChlcnJvciA+IDApIHsKKyAgICAgICAgICAgIGhpZ2ggPSBpbmRleDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvdyA9IGluZGV4OworICAgICAgICB9CisgICAgfQorfQorCisKKy8qKgorICogT3J0aG9nb25hbGl6ZSBhIHZlY3RvciB0byBhbm90aGVyIHZlY3RvcgorICoKKyAqIEBwYXJhbSB2IHZlY3RvciB0byBvcnRob2dvbmFsaXplCisgKiBAcGFyYW0gdSB2ZWN0b3IgYWdhaW5zdCB3aGljaCBvcnRob2dvbmFsaXphdGlvbiBpcyBwZXJmb3JtZWQKKyAqLworc3RhdGljIHZvaWQgb3J0aG9nb25hbGl6ZShmbG9hdCAqdiwgY29uc3QgZmxvYXQgKnUpCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgbnVtID0gMCwgZGVuID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS1NJWkU7IGkrKykgeworICAgICAgICBudW0gKz0gdltpXSAqIHVbaV07CisgICAgICAgIGRlbiArPSB1W2ldICogdVtpXTsKKyAgICB9CisgICAgbnVtIC89IGRlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkxPQ0tTSVpFOyBpKyspCisgICAgICAgIHZbaV0gLT0gbnVtICogdVtpXTsKK30KKworCisvKioKKyAqIENhbGN1bGF0ZSBtYXRjaCBzY29yZSBhbmQgZ2FpbiBvZiBhbiBMUEMtZmlsdGVyZWQgdmVjdG9yIHdpdGggcmVzcGVjdCB0bworICogaW5wdXQgZGF0YSwgcG9zc2libHkgb3Rob2dvbmFsaXppbmcgaXQgdG8gdXAgdG8gMiBvdGhlciB2ZWN0b3JzCisgKgorICogQHBhcmFtIHdvcmsgYXJyYXkgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGZpbHRlcmVkIHZlY3RvcgorICogQHBhcmFtIGNvZWZzIGNvZWZmaWNpZW50cyBvZiB0aGUgTFBDIGZpbHRlcgorICogQHBhcmFtIHZlY3Qgb3JpZ2luYWwgdmVjdG9yCisgKiBAcGFyYW0gb3J0aG8xIGZpcnN0IHZlY3RvciBhZ2FpbnN0IHdoaWNoIG9ydGhvZ29uYWxpemF0aW9uIGlzIHBlcmZvcm1lZAorICogQHBhcmFtIG9ydGhvMiBzZWNvbmQgdmVjdG9yIGFnYWluc3Qgd2hpY2ggb3J0aG9nb25hbGl6YXRpb24gaXMgcGVyZm9ybWVkCisgKiBAcGFyYW0gZGF0YSBpbnB1dCBkYXRhCisgKiBAcGFyYW0gc2NvcmUgcG9pbnRlciB0byB2YXJpYWJsZSB3aGVyZSBtYXRjaCBzY29yZSBpcyByZXR1cm5lZAorICogQHBhcmFtIGdhaW4gcG9pbnRlciB0byB2YXJpYWJsZSB3aGVyZSBnYWluIGlzIHJldHVybmVkCisgKi8KK3N0YXRpYyB2b2lkIGdldF9tYXRjaF9zY29yZShmbG9hdCAqd29yaywgY29uc3QgZmxvYXQgKmNvZWZzLCBmbG9hdCAqdmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqb3J0aG8xLCBjb25zdCBmbG9hdCAqb3J0aG8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkYXRhLCBmbG9hdCAqc2NvcmUsIGZsb2F0ICpnYWluKQoreworICAgIGZsb2F0IGMsIGc7CisgICAgaW50IGk7CisKKyAgICBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXJmKHdvcmssIGNvZWZzLCB2ZWN0LCBCTE9DS1NJWkUsIExQQ19PUkRFUik7CisgICAgaWYgKG9ydGhvMSkKKyAgICAgICAgb3J0aG9nb25hbGl6ZSh3b3JrLCBvcnRobzEpOworICAgIGlmIChvcnRobzIpCisgICAgICAgIG9ydGhvZ29uYWxpemUod29yaywgb3J0aG8yKTsKKyAgICBjID0gZyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IEJMT0NLU0laRTsgaSsrKSB7CisgICAgICAgIGcgKz0gd29ya1tpXSAqIHdvcmtbaV07CisgICAgICAgIGMgKz0gZGF0YVtpXSAqIHdvcmtbaV07CisgICAgfQorICAgIGlmIChjIDw9IDApIHsKKyAgICAgICAgKnNjb3JlID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqZ2FpbiA9IGMgLyBnOworICAgICpzY29yZSA9ICpnYWluICogYzsKK30KKworCisvKioKKyAqIENyZWF0ZSBhIHZlY3RvciBmcm9tIHRoZSBhZGFwdGl2ZSBjb2RlYm9vayBhdCBhIGdpdmVuIGxhZyB2YWx1ZQorICoKKyAqIEBwYXJhbSB2ZWN0IGFycmF5IHdoZXJlIHZlY3RvciBpcyBzdG9yZWQKKyAqIEBwYXJhbSBjYiBhZGFwdGl2ZSBjb2RlYm9vaworICogQHBhcmFtIGxhZyBsYWcgdmFsdWUKKyAqLworc3RhdGljIHZvaWQgY3JlYXRlX2FkYXB0X3ZlY3QoZmxvYXQgKnZlY3QsIGNvbnN0IGludDE2X3QgKmNiLCBpbnQgbGFnKQoreworICAgIGludCBpOworCisgICAgY2IgKz0gQlVGRkVSU0laRSAtIGxhZzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZNSU4oQkxPQ0tTSVpFLCBsYWcpOyBpKyspCisgICAgICAgIHZlY3RbaV0gPSBjYltpXTsKKyAgICBpZiAobGFnIDwgQkxPQ0tTSVpFKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQkxPQ0tTSVpFIC0gbGFnOyBpKyspCisgICAgICAgICAgICB2ZWN0W2xhZyArIGldID0gY2JbaV07Cit9CisKKworLyoqCisgKiBTZWFyY2ggdGhlIGFkYXB0aXZlIGNvZGVib29rIGZvciB0aGUgYmVzdCBlbnRyeSBhbmQgZ2FpbiBhbmQgcmVtb3ZlIGl0cworICogY29udHJpYnV0aW9uIGZyb20gaW5wdXQgZGF0YQorICoKKyAqIEBwYXJhbSBhZGFwdF9jYiBhcnJheSBmcm9tIHdoaWNoIHRoZSBhZGFwdGl2ZSBjb2RlYm9vayBpcyBleHRyYWN0ZWQKKyAqIEBwYXJhbSB3b3JrIGFycmF5IHVzZWQgdG8gY2FsY3VsYXRlIExQQy1maWx0ZXJlZCB2ZWN0b3JzCisgKiBAcGFyYW0gY29lZnMgY29lZmZpY2llbnRzIG9mIHRoZSBMUEMgZmlsdGVyCisgKiBAcGFyYW0gZGF0YSBpbnB1dCBkYXRhCisgKiBAcmV0dXJuIGluZGV4IG9mIHRoZSBiZXN0IGVudHJ5IG9mIHRoZSBhZGFwdGl2ZSBjb2RlYm9vaworICovCitzdGF0aWMgaW50IGFkYXB0aXZlX2NiX3NlYXJjaChjb25zdCBpbnQxNl90ICphZGFwdF9jYiwgZmxvYXQgKndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqY29lZnMsIGZsb2F0ICpkYXRhKQoreworICAgIGludCBpLCBhdl91bmluaXQoYmVzdF92ZWN0KTsKKyAgICBmbG9hdCBzY29yZSwgZ2FpbiwgYmVzdF9zY29yZSwgYXZfdW5pbml0KGJlc3RfZ2Fpbik7CisgICAgZmxvYXQgZXhjW0JMT0NLU0laRV07CisKKyAgICBnYWluID0gYmVzdF9zY29yZSA9IDA7CisgICAgZm9yIChpID0gQkxPQ0tTSVpFIC8gMjsgaSA8PSBCVUZGRVJTSVpFOyBpKyspIHsKKyAgICAgICAgY3JlYXRlX2FkYXB0X3ZlY3QoZXhjLCBhZGFwdF9jYiwgaSk7CisgICAgICAgIGdldF9tYXRjaF9zY29yZSh3b3JrLCBjb2VmcywgZXhjLCBOVUxMLCBOVUxMLCBkYXRhLCAmc2NvcmUsICZnYWluKTsKKyAgICAgICAgaWYgKHNjb3JlID4gYmVzdF9zY29yZSkgeworICAgICAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlOworICAgICAgICAgICAgYmVzdF92ZWN0ID0gaTsKKyAgICAgICAgICAgIGJlc3RfZ2FpbiA9IGdhaW47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFiZXN0X3Njb3JlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qKgorICAgICAqIFJlLWNhbGN1bGF0ZSB0aGUgZmlsdGVyZWQgdmVjdG9yIGZyb20gdGhlIHZlY3RvciB3aXRoIG1heGltdW0gbWF0Y2ggc2NvcmUKKyAgICAgKiBhbmQgcmVtb3ZlIGl0cyBjb250cmlidXRpb24gZnJvbSBpbnB1dCBkYXRhLgorICAgICAqLworICAgIGNyZWF0ZV9hZGFwdF92ZWN0KGV4YywgYWRhcHRfY2IsIGJlc3RfdmVjdCk7CisgICAgZmZfY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZih3b3JrLCBjb2VmcywgZXhjLCBCTE9DS1NJWkUsIExQQ19PUkRFUik7CisgICAgZm9yIChpID0gMDsgaSA8IEJMT0NLU0laRTsgaSsrKQorICAgICAgICBkYXRhW2ldIC09IGJlc3RfZ2FpbiAqIHdvcmtbaV07CisgICAgcmV0dXJuIGJlc3RfdmVjdCAtIEJMT0NLU0laRSAvIDIgKyAxOworfQorCisKKy8qKgorICogRmluZCB0aGUgYmVzdCB2ZWN0b3Igb2YgYSBmaXhlZCBjb2RlYm9vayBieSBhcHBseWluZyBhbiBMUEMgZmlsdGVyIHRvCisgKiBjb2RlYm9vayBlbnRyaWVzLCBwb3NzaWJseSBvdGhvZ29uYWxpemluZyB0aGVtIHRvIHVwIHRvIDIgb3RoZXIgdmVjdG9ycyBhbmQKKyAqIG1hdGNoaW5nIHRoZSByZXN1bHRzIHdpdGggaW5wdXQgZGF0YQorICoKKyAqIEBwYXJhbSB3b3JrIGFycmF5IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBmaWx0ZXJlZCB2ZWN0b3JzCisgKiBAcGFyYW0gY29lZnMgY29lZmZpY2llbnRzIG9mIHRoZSBMUEMgZmlsdGVyCisgKiBAcGFyYW0gY2IgZml4ZWQgY29kZWJvb2sKKyAqIEBwYXJhbSBvcnRobzEgZmlyc3QgdmVjdG9yIGFnYWluc3Qgd2hpY2ggb3J0aG9nb25hbGl6YXRpb24gaXMgcGVyZm9ybWVkCisgKiBAcGFyYW0gb3J0aG8yIHNlY29uZCB2ZWN0b3IgYWdhaW5zdCB3aGljaCBvcnRob2dvbmFsaXphdGlvbiBpcyBwZXJmb3JtZWQKKyAqIEBwYXJhbSBkYXRhIGlucHV0IGRhdGEKKyAqIEBwYXJhbSBpZHggcG9pbnRlciB0byB2YXJpYWJsZSB3aGVyZSB0aGUgaW5kZXggb2YgdGhlIGJlc3QgY29kZWJvb2sgZW50cnkgaXMKKyAqICAgICAgICByZXR1cm5lZAorICogQHBhcmFtIGdhaW4gcG9pbnRlciB0byB2YXJpYWJsZSB3aGVyZSB0aGUgZ2FpbiBvZiB0aGUgYmVzdCBjb2RlYm9vayBlbnRyeSBpcworICogICAgICAgIHJldHVybmVkCisgKi8KK3N0YXRpYyB2b2lkIGZpbmRfYmVzdF92ZWN0KGZsb2F0ICp3b3JrLCBjb25zdCBmbG9hdCAqY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgY2JbXVtCTE9DS1NJWkVdLCBjb25zdCBmbG9hdCAqb3J0aG8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKm9ydGhvMiwgZmxvYXQgKmRhdGEsIGludCAqaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmdhaW4pCit7CisgICAgaW50IGksIGo7CisgICAgZmxvYXQgZywgc2NvcmUsIGJlc3Rfc2NvcmU7CisgICAgZmxvYXQgdmVjdFtCTE9DS1NJWkVdOworCisgICAgKmlkeCA9ICpnYWluID0gYmVzdF9zY29yZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IEZJWEVEX0NCX1NJWkU7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgQkxPQ0tTSVpFOyBqKyspCisgICAgICAgICAgICB2ZWN0W2pdID0gY2JbaV1bal07CisgICAgICAgIGdldF9tYXRjaF9zY29yZSh3b3JrLCBjb2VmcywgdmVjdCwgb3J0aG8xLCBvcnRobzIsIGRhdGEsICZzY29yZSwgJmcpOworICAgICAgICBpZiAoc2NvcmUgPiBiZXN0X3Njb3JlKSB7CisgICAgICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7CisgICAgICAgICAgICAqaWR4ID0gaTsKKyAgICAgICAgICAgICpnYWluID0gZzsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKioKKyAqIFNlYXJjaCB0aGUgdHdvIGZpeGVkIGNvZGVib29rcyBmb3IgdGhlIGJlc3QgZW50cnkgYW5kIGdhaW4KKyAqCisgKiBAcGFyYW0gd29yayBhcnJheSB1c2VkIHRvIGNhbGN1bGF0ZSBMUEMtZmlsdGVyZWQgdmVjdG9ycworICogQHBhcmFtIGNvZWZzIGNvZWZmaWNpZW50cyBvZiB0aGUgTFBDIGZpbHRlcgorICogQHBhcmFtIGRhdGEgaW5wdXQgZGF0YQorICogQHBhcmFtIGNiYV9pZHggaW5kZXggb2YgdGhlIGJlc3QgZW50cnkgb2YgdGhlIGFkYXB0aXZlIGNvZGVib29rCisgKiBAcGFyYW0gY2IxX2lkeCBwb2ludGVyIHRvIHZhcmlhYmxlIHdoZXJlIHRoZSBpbmRleCBvZiB0aGUgYmVzdCBlbnRyeSBvZiB0aGUKKyAqICAgICAgICBmaXJzdCBmaXhlZCBjb2RlYm9vayBpcyByZXR1cm5lZAorICogQHBhcmFtIGNiMl9pZHggcG9pbnRlciB0byB2YXJpYWJsZSB3aGVyZSB0aGUgaW5kZXggb2YgdGhlIGJlc3QgZW50cnkgb2YgdGhlCisgKiAgICAgICAgc2Vjb25kIGZpeGVkIGNvZGVib29rIGlzIHJldHVybmVkCisgKi8KK3N0YXRpYyB2b2lkIGZpeGVkX2NiX3NlYXJjaChmbG9hdCAqd29yaywgY29uc3QgZmxvYXQgKmNvZWZzLCBmbG9hdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2JhX2lkeCwgaW50ICpjYjFfaWR4LCBpbnQgKmNiMl9pZHgpCit7CisgICAgaW50IGksIG9ydGhvX2NiMTsKKyAgICBmbG9hdCBnYWluOworICAgIGZsb2F0IGNiYV92ZWN0W0JMT0NLU0laRV0sIGNiMV92ZWN0W0JMT0NLU0laRV07CisgICAgZmxvYXQgdmVjdFtCTE9DS1NJWkVdOworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlcmVkIHZlY3RvciBmcm9tIHRoZSBhZGFwdGl2ZSBjb2RlYm9vayBjYW4gYmUgcmV0cmlldmVkIGZyb20KKyAgICAgKiB3b3JrLCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGp1c3QgYWZ0ZXIgYWRhcHRpdmVfY2Jfc2VhcmNoKCkuCisgICAgICovCisgICAgaWYgKGNiYV9pZHgpCisgICAgICAgIG1lbWNweShjYmFfdmVjdCwgd29yaywgc2l6ZW9mKGNiYV92ZWN0KSk7CisKKyAgICBmaW5kX2Jlc3RfdmVjdCh3b3JrLCBjb2VmcywgZmZfY2IxX3ZlY3RzLCBjYmFfaWR4ID8gY2JhX3ZlY3QgOiBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgIGRhdGEsIGNiMV9pZHgsICZnYWluKTsKKworICAgIC8qKgorICAgICAqIFJlLWNhbGN1bGF0ZSB0aGUgZmlsdGVyZWQgdmVjdG9yIGZyb20gdGhlIHZlY3RvciB3aXRoIG1heGltdW0gbWF0Y2ggc2NvcmUKKyAgICAgKiBhbmQgcmVtb3ZlIGl0cyBjb250cmlidXRpb24gZnJvbSBpbnB1dCBkYXRhLgorICAgICAqLworICAgIGlmIChnYWluKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS1NJWkU7IGkrKykKKyAgICAgICAgICAgIHZlY3RbaV0gPSBmZl9jYjFfdmVjdHNbKmNiMV9pZHhdW2ldOworICAgICAgICBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXJmKHdvcmssIGNvZWZzLCB2ZWN0LCBCTE9DS1NJWkUsIExQQ19PUkRFUik7CisgICAgICAgIGlmIChjYmFfaWR4KQorICAgICAgICAgICAgb3J0aG9nb25hbGl6ZSh3b3JrLCBjYmFfdmVjdCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS1NJWkU7IGkrKykKKyAgICAgICAgICAgIGRhdGFbaV0gLT0gZ2FpbiAqIHdvcmtbaV07CisgICAgICAgIG1lbWNweShjYjFfdmVjdCwgd29yaywgc2l6ZW9mKGNiMV92ZWN0KSk7CisgICAgICAgIG9ydGhvX2NiMSA9IDE7CisgICAgfSBlbHNlCisgICAgICAgIG9ydGhvX2NiMSA9IDA7CisKKyAgICBmaW5kX2Jlc3RfdmVjdCh3b3JrLCBjb2VmcywgZmZfY2IyX3ZlY3RzLCBjYmFfaWR4ID8gY2JhX3ZlY3QgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgIG9ydGhvX2NiMSA/IGNiMV92ZWN0IDogTlVMTCwgZGF0YSwgY2IyX2lkeCwgJmdhaW4pOworfQorCisKKy8qKgorICogRW5jb2RlIGEgc3ViYmxvY2sgb2YgdGhlIGN1cnJlbnQgZnJhbWUKKyAqCisgKiBAcGFyYW0gcmFjdHggZW5jb2RlciBjb250ZXh0CisgKiBAcGFyYW0gc2Jsb2NrX2RhdGEgaW5wdXQgZGF0YSBvZiB0aGUgc3ViYmxvY2sKKyAqIEBwYXJhbSBscGNfY29lZnMgY29lZmZpY2llbnRzIG9mIHRoZSBMUEMgZmlsdGVyCisgKiBAcGFyYW0gcm1zIFJNUyBvZiB0aGUgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKKyAqIEBwYXJhbSBwYiBwb2ludGVyIHRvIFB1dEJpdENvbnRleHQgb2YgdGhlIGN1cnJlbnQgZnJhbWUKKyAqLworc3RhdGljIHZvaWQgcmExNDRfZW5jb2RlX3N1YmJsb2NrKFJBMTQ0Q29udGV4dCAqcmFjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqc2Jsb2NrX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqbHBjX2NvZWZzLCB1bnNpZ25lZCBpbnQgcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKnBiKQoreworICAgIGZsb2F0IGRhdGFbQkxPQ0tTSVpFXSA9IHsgMCB9LCB3b3JrW0xQQ19PUkRFUiArIEJMT0NLU0laRV07CisgICAgZmxvYXQgY29lZnNbTFBDX09SREVSXTsKKyAgICBmbG9hdCB6ZXJvW0JMT0NLU0laRV0sIGNiYVtCTE9DS1NJWkVdLCBjYjFbQkxPQ0tTSVpFXSwgY2IyW0JMT0NLU0laRV07CisgICAgaW50IGNiYV9pZHgsIGNiMV9pZHgsIGNiMl9pZHgsIGdhaW47CisgICAgaW50IGksIG47CisgICAgdW5zaWduZWQgbVszXTsKKyAgICBmbG9hdCBnWzNdOworICAgIGZsb2F0IGVycm9yLCBiZXN0X2Vycm9yOworCisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUjsgaSsrKSB7CisgICAgICAgIHdvcmtbaV0gPSByYWN0eC0+Y3Vycl9zYmxvY2tbQkxPQ0tTSVpFICsgaV07CisgICAgICAgIGNvZWZzW2ldID0gbHBjX2NvZWZzW2ldICogKDEvNDA5Ni4wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHplcm8taW5wdXQgcmVzcG9uc2Ugb2YgdGhlIExQQyBmaWx0ZXIgYW5kIHN1YnRyYWN0IGl0IGZyb20KKyAgICAgKiBpbnB1dCBkYXRhLgorICAgICAqLworICAgIGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYod29yayArIExQQ19PUkRFUiwgY29lZnMsIGRhdGEsIEJMT0NLU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ19PUkRFUik7CisgICAgZm9yIChpID0gMDsgaSA8IEJMT0NLU0laRTsgaSsrKSB7CisgICAgICAgIHplcm9baV0gPSB3b3JrW0xQQ19PUkRFUiArIGldOworICAgICAgICBkYXRhW2ldID0gc2Jsb2NrX2RhdGFbaV0gLSB6ZXJvW2ldOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvZGVib29rIHNlYXJjaCBpcyBwZXJmb3JtZWQgd2l0aG91dCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBjb250cmlidXRpb24KKyAgICAgKiBvZiB0aGUgcHJldmlvdXMgc3ViYmxvY2ssIHNpbmNlIGl0IGhhcyBiZWVuIGp1c3Qgc3VidHJhY3RlZCBmcm9tIGlucHV0CisgICAgICogZGF0YS4KKyAgICAgKi8KKyAgICBtZW1zZXQod29yaywgMCwgTFBDX09SREVSICogc2l6ZW9mKCp3b3JrKSk7CisKKyAgICBjYmFfaWR4ID0gYWRhcHRpdmVfY2Jfc2VhcmNoKHJhY3R4LT5hZGFwdF9jYiwgd29yayArIExQQ19PUkRFUiwgY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBpZiAoY2JhX2lkeCkgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZpbHRlcmVkIHZlY3RvciBmcm9tIHRoZSBhZGFwdGl2ZSBjb2RlYm9vayBjYW4gYmUgcmV0cmlldmVkIGZyb20KKyAgICAgICAgICogd29yaywgc2VlIGltcGxlbWVudGF0aW9uIG9mIGFkYXB0aXZlX2NiX3NlYXJjaCgpLgorICAgICAgICAgKi8KKyAgICAgICAgbWVtY3B5KGNiYSwgd29yayArIExQQ19PUkRFUiwgc2l6ZW9mKGNiYSkpOworCisgICAgICAgIGZmX2NvcHlfYW5kX2R1cChyYWN0eC0+YnVmZmVyX2EsIHJhY3R4LT5hZGFwdF9jYiwgY2JhX2lkeCArIEJMT0NLU0laRSAvIDIgLSAxKTsKKyAgICAgICAgbVswXSA9IChmZl9pcm1zKCZyYWN0eC0+YWRzcCwgcmFjdHgtPmJ1ZmZlcl9hKSAqIHJtcykgPj4gMTI7CisgICAgfQorICAgIGZpeGVkX2NiX3NlYXJjaCh3b3JrICsgTFBDX09SREVSLCBjb2VmcywgZGF0YSwgY2JhX2lkeCwgJmNiMV9pZHgsICZjYjJfaWR4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkxPQ0tTSVpFOyBpKyspIHsKKyAgICAgICAgY2IxW2ldID0gZmZfY2IxX3ZlY3RzW2NiMV9pZHhdW2ldOworICAgICAgICBjYjJbaV0gPSBmZl9jYjJfdmVjdHNbY2IyX2lkeF1baV07CisgICAgfQorICAgIGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYod29yayArIExQQ19PUkRFUiwgY29lZnMsIGNiMSwgQkxPQ0tTSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDX09SREVSKTsKKyAgICBtZW1jcHkoY2IxLCB3b3JrICsgTFBDX09SREVSLCBzaXplb2YoY2IxKSk7CisgICAgbVsxXSA9IChmZl9jYjFfYmFzZVtjYjFfaWR4XSAqIHJtcykgPj4gODsKKyAgICBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXJmKHdvcmsgKyBMUENfT1JERVIsIGNvZWZzLCBjYjIsIEJMT0NLU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ19PUkRFUik7CisgICAgbWVtY3B5KGNiMiwgd29yayArIExQQ19PUkRFUiwgc2l6ZW9mKGNiMikpOworICAgIG1bMl0gPSAoZmZfY2IyX2Jhc2VbY2IyX2lkeF0gKiBybXMpID4+IDg7CisgICAgYmVzdF9lcnJvciA9IEZMVF9NQVg7CisgICAgZ2FpbiA9IDA7CisgICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKSB7CisgICAgICAgIGdbMV0gPSAoKGZmX2dhaW5fdmFsX3RhYltuXVsxXSAqIG1bMV0pID4+IGZmX2dhaW5fZXhwX3RhYltuXSkgKgorICAgICAgICAgICAgICAgKDEvNDA5Ni4wKTsKKyAgICAgICAgZ1syXSA9ICgoZmZfZ2Fpbl92YWxfdGFiW25dWzJdICogbVsyXSkgPj4gZmZfZ2Fpbl9leHBfdGFiW25dKSAqCisgICAgICAgICAgICAgICAoMS80MDk2LjApOworICAgICAgICBlcnJvciA9IDA7CisgICAgICAgIGlmIChjYmFfaWR4KSB7CisgICAgICAgICAgICBnWzBdID0gKChmZl9nYWluX3ZhbF90YWJbbl1bMF0gKiBtWzBdKSA+PiBmZl9nYWluX2V4cF90YWJbbl0pICoKKyAgICAgICAgICAgICAgICAgICAoMS80MDk2LjApOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEJMT0NLU0laRTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGF0YVtpXSA9IHplcm9baV0gKyBnWzBdICogY2JhW2ldICsgZ1sxXSAqIGNiMVtpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdbMl0gKiBjYjJbaV07CisgICAgICAgICAgICAgICAgZXJyb3IgKz0gKGRhdGFbaV0gLSBzYmxvY2tfZGF0YVtpXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhW2ldIC0gc2Jsb2NrX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEJMT0NLU0laRTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGF0YVtpXSA9IHplcm9baV0gKyBnWzFdICogY2IxW2ldICsgZ1syXSAqIGNiMltpXTsKKyAgICAgICAgICAgICAgICBlcnJvciArPSAoZGF0YVtpXSAtIHNibG9ja19kYXRhW2ldKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGFbaV0gLSBzYmxvY2tfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVycm9yIDwgYmVzdF9lcnJvcikgeworICAgICAgICAgICAgYmVzdF9lcnJvciA9IGVycm9yOworICAgICAgICAgICAgZ2FpbiA9IG47CisgICAgICAgIH0KKyAgICB9CisgICAgcHV0X2JpdHMocGIsIDcsIGNiYV9pZHgpOworICAgIHB1dF9iaXRzKHBiLCA4LCBnYWluKTsKKyAgICBwdXRfYml0cyhwYiwgNywgY2IxX2lkeCk7CisgICAgcHV0X2JpdHMocGIsIDcsIGNiMl9pZHgpOworICAgIGZmX3N1YmJsb2NrX3N5bnRoZXNpcyhyYWN0eCwgbHBjX2NvZWZzLCBjYmFfaWR4LCBjYjFfaWR4LCBjYjJfaWR4LCBybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW4pOworfQorCisKK3N0YXRpYyBpbnQgcmExNDRfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2l6ZXNbTFBDX09SREVSXSA9IHs2NCwgMzIsIDMyLCAxNiwgMTYsIDgsIDgsIDgsIDgsIDR9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJpdF9zaXplc1tMUENfT1JERVJdID0gezYsIDUsIDUsIDQsIDQsIDMsIDMsIDMsIDMsIDJ9OworICAgIFJBMTQ0Q29udGV4dCAqcmFjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFB1dEJpdENvbnRleHQgcGI7CisgICAgaW50MzJfdCBscGNfZGF0YVtOQkxPQ0tTICogQkxPQ0tTSVpFXTsKKyAgICBpbnQzMl90IGxwY19jb2Vmc1tMUENfT1JERVJdW01BWF9MUENfT1JERVJdOworICAgIGludCBzaGlmdFtMUENfT1JERVJdOworICAgIGludDE2X3QgYmxvY2tfY29lZnNbTkJMT0NLU11bTFBDX09SREVSXTsKKyAgICBpbnQgbHBjX3JlZmxbTFBDX09SREVSXTsgICAgLyoqPCByZWZsZWN0aW9uIGNvZWZmaWNpZW50cyBvZiB0aGUgZnJhbWUgKi8KKyAgICB1bnNpZ25lZCBpbnQgcmVmbF9ybXNbTkJMT0NLU107IC8qKjwgUk1TIG9mIHRoZSByZWZsZWN0aW9uIGNvZWZmaWNpZW50cyAqLworICAgIGNvbnN0IGludDE2X3QgKnNhbXBsZXMgPSBmcmFtZSA/IChjb25zdCBpbnQxNl90ICopZnJhbWUtPmRhdGFbMF0gOiBOVUxMOworICAgIGludCBlbmVyZ3kgPSAwOworICAgIGludCBpLCBpZHgsIHJldDsKKworICAgIGlmIChyYWN0eC0+bGFzdF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBGUkFNRV9TSVpFKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyoqCisgICAgICogU2luY2UgdGhlIExQQyBjb2VmZmljaWVudHMgYXJlIGNhbGN1bGF0ZWQgb24gYSBmcmFtZSBjZW50ZXJlZCBvdmVyIHRoZQorICAgICAqIGZvdXJ0aCBzdWJmcmFtZSwgdG8gZW5jb2RlIGEgZ2l2ZW4gZnJhbWUsIGRhdGEgZnJvbSB0aGUgbmV4dCBmcmFtZSBpcworICAgICAqIG5lZWRlZC4gSW4gZWFjaCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIHRoZSBwcmV2aW91cyBmcmFtZSAod2hvc2UgZGF0YSBhcmUKKyAgICAgKiBzYXZlZCBpbiB0aGUgZW5jb2RlciBjb250ZXh0KSBpcyBlbmNvZGVkLCBhbmQgZGF0YSBmcm9tIHRoZSBjdXJyZW50IGZyYW1lCisgICAgICogYXJlIHNhdmVkIGluIHRoZSBlbmNvZGVyIGNvbnRleHQgdG8gYmUgdXNlZCBpbiB0aGUgbmV4dCBmdW5jdGlvbiBjYWxsLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCAoMiAqIEJMT0NLU0laRSArIEJMT0NLU0laRSAvIDIpOyBpKyspIHsKKyAgICAgICAgbHBjX2RhdGFbaV0gPSByYWN0eC0+Y3Vycl9ibG9ja1tCTE9DS1NJWkUgKyBCTE9DS1NJWkUgLyAyICsgaV07CisgICAgICAgIGVuZXJneSArPSAobHBjX2RhdGFbaV0gKiBscGNfZGF0YVtpXSkgPj4gNDsKKyAgICB9CisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGludCBqOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZnJhbWUtPm5iX3NhbXBsZXMgJiYgaSA8IE5CTE9DS1MgKiBCTE9DS1NJWkU7IGkrKywgaisrKSB7CisgICAgICAgICAgICBscGNfZGF0YVtpXSA9IHNhbXBsZXNbal0gPj4gMjsKKyAgICAgICAgICAgIGVuZXJneSArPSAobHBjX2RhdGFbaV0gKiBscGNfZGF0YVtpXSkgPj4gNDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA8IE5CTE9DS1MgKiBCTE9DS1NJWkUpCisgICAgICAgIG1lbXNldCgmbHBjX2RhdGFbaV0sIDAsIChOQkxPQ0tTICogQkxPQ0tTSVpFIC0gaSkgKiBzaXplb2YoKmxwY19kYXRhKSk7CisgICAgZW5lcmd5ID0gZmZfZW5lcmd5X3RhYltxdWFudGl6ZShmZl90X3NxcnQoZW5lcmd5ID4+IDUpID4+IDEwLCBmZl9lbmVyZ3lfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpXTsKKworICAgIGZmX2xwY19jYWxjX2NvZWZzKCZyYWN0eC0+bHBjX2N0eCwgbHBjX2RhdGEsIE5CTE9DS1MgKiBCTE9DS1NJWkUsIExQQ19PUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICBMUENfT1JERVIsIDE2LCBscGNfY29lZnMsIHNoaWZ0LCBGRl9MUENfVFlQRV9MRVZJTlNPTiwKKyAgICAgICAgICAgICAgICAgICAgICAwLCBPUkRFUl9NRVRIT0RfRVNULCAxMiwgMCk7CisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUjsgaSsrKQorICAgICAgICBibG9ja19jb2Vmc1tOQkxPQ0tTIC0gMV1baV0gPSAtKGxwY19jb2Vmc1tMUENfT1JERVIgLSAxXVtpXSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMiAtIHNoaWZ0W0xQQ19PUkRFUiAtIDFdKSk7CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBhcHBseSBwZXJjZXB0dWFsIHdlaWdodGluZyBvZiB0aGUgaW5wdXQgc3BlZWNoIHRocm91Z2ggYmFuZHdpZHRoCisgICAgICogZXhwYW5zaW9uIG9mIHRoZSBMUEMgZmlsdGVyLgorICAgICAqLworCisgICAgaWYgKGZmX2V2YWxfcmVmbChscGNfcmVmbCwgYmxvY2tfY29lZnNbTkJMT0NLUyAtIDFdLCBhdmN0eCkpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBmaWx0ZXIgaXMgdW5zdGFibGU6IHVzZSB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBwcmV2aW91cyBmcmFtZS4KKyAgICAgICAgICovCisgICAgICAgIGZmX2ludF90b19pbnQxNihibG9ja19jb2Vmc1tOQkxPQ0tTIC0gMV0sIHJhY3R4LT5scGNfY29lZlsxXSk7CisgICAgICAgIGlmIChmZl9ldmFsX3JlZmwobHBjX3JlZmwsIGJsb2NrX2NvZWZzW05CTE9DS1MgLSAxXSwgYXZjdHgpKSB7CisgICAgICAgICAgICAvKiB0aGUgZmlsdGVyIGlzIHN0aWxsIHVuc3RhYmxlLiBzZXQgcmVmbGVjdGlvbiBjb2VmZnMgdG8gemVyby4gKi8KKyAgICAgICAgICAgIG1lbXNldChscGNfcmVmbCwgMCwgc2l6ZW9mKGxwY19yZWZsKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaW5pdF9wdXRfYml0cygmcGIsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUjsgaSsrKSB7CisgICAgICAgIGlkeCA9IHF1YW50aXplKGxwY19yZWZsW2ldLCBmZl9scGNfcmVmbF9jYltpXSwgc2l6ZXNbaV0pOworICAgICAgICBwdXRfYml0cygmcGIsIGJpdF9zaXplc1tpXSwgaWR4KTsKKyAgICAgICAgbHBjX3JlZmxbaV0gPSBmZl9scGNfcmVmbF9jYltpXVtpZHhdOworICAgIH0KKyAgICByYWN0eC0+bHBjX3JlZmxfcm1zWzBdID0gZmZfcm1zKGxwY19yZWZsKTsKKyAgICBmZl9ldmFsX2NvZWZzKHJhY3R4LT5scGNfY29lZlswXSwgbHBjX3JlZmwpOworICAgIHJlZmxfcm1zWzBdID0gZmZfaW50ZXJwKHJhY3R4LCBibG9ja19jb2Vmc1swXSwgMSwgMSwgcmFjdHgtPm9sZF9lbmVyZ3kpOworICAgIHJlZmxfcm1zWzFdID0gZmZfaW50ZXJwKHJhY3R4LCBibG9ja19jb2Vmc1sxXSwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmVyZ3kgPD0gcmFjdHgtPm9sZF9lbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdF9zcXJ0KGVuZXJneSAqIHJhY3R4LT5vbGRfZW5lcmd5KSA+PiAxMik7CisgICAgcmVmbF9ybXNbMl0gPSBmZl9pbnRlcnAocmFjdHgsIGJsb2NrX2NvZWZzWzJdLCAzLCAwLCBlbmVyZ3kpOworICAgIHJlZmxfcm1zWzNdID0gZmZfcmVzY2FsZV9ybXMocmFjdHgtPmxwY19yZWZsX3Jtc1swXSwgZW5lcmd5KTsKKyAgICBmZl9pbnRfdG9faW50MTYoYmxvY2tfY29lZnNbTkJMT0NLUyAtIDFdLCByYWN0eC0+bHBjX2NvZWZbMF0pOworICAgIHB1dF9iaXRzKCZwYiwgNSwgcXVhbnRpemUoZW5lcmd5LCBmZl9lbmVyZ3lfdGFiLCAzMikpOworICAgIGZvciAoaSA9IDA7IGkgPCBOQkxPQ0tTOyBpKyspCisgICAgICAgIHJhMTQ0X2VuY29kZV9zdWJibG9jayhyYWN0eCwgcmFjdHgtPmN1cnJfYmxvY2sgKyBpICogQkxPQ0tTSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfY29lZnNbaV0sIHJlZmxfcm1zW2ldLCAmcGIpOworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgcmFjdHgtPm9sZF9lbmVyZ3kgPSBlbmVyZ3k7CisgICAgcmFjdHgtPmxwY19yZWZsX3Jtc1sxXSA9IHJhY3R4LT5scGNfcmVmbF9ybXNbMF07CisgICAgRkZTV0FQKHVuc2lnbmVkIGludCAqLCByYWN0eC0+bHBjX2NvZWZbMF0sIHJhY3R4LT5scGNfY29lZlsxXSk7CisKKyAgICAvKiBjb3B5IGlucHV0IHNhbXBsZXMgdG8gY3VycmVudCBibG9jayBmb3IgcHJvY2Vzc2luZyBpbiBuZXh0IGNhbGwgKi8KKyAgICBpID0gMDsKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgZm9yICg7IGkgPCBmcmFtZS0+bmJfc2FtcGxlczsgaSsrKQorICAgICAgICAgICAgcmFjdHgtPmN1cnJfYmxvY2tbaV0gPSBzYW1wbGVzW2ldID4+IDI7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9hZl9xdWV1ZV9hZGQoJnJhY3R4LT5hZnEsIGZyYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UKKyAgICAgICAgcmFjdHgtPmxhc3RfZnJhbWUgPSAxOworICAgIG1lbXNldCgmcmFjdHgtPmN1cnJfYmxvY2tbaV0sIDAsCisgICAgICAgICAgIChOQkxPQ0tTICogQkxPQ0tTSVpFIC0gaSkgKiBzaXplb2YoKnJhY3R4LT5jdXJyX2Jsb2NrKSk7CisKKyAgICAvKiBHZXQgdGhlIG5leHQgZnJhbWUgcHRzL2R1cmF0aW9uICovCisgICAgZmZfYWZfcXVldWVfcmVtb3ZlKCZyYWN0eC0+YWZxLCBhdmN0eC0+ZnJhbWVfc2l6ZSwgJmF2cGt0LT5wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICZhdnBrdC0+ZHVyYXRpb24pOworCisgICAgYXZwa3QtPnNpemUgPSBGUkFNRV9TSVpFOworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKKworQVZDb2RlYyBmZl9yYV8xNDRfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicmVhbF8xNDQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsQXVkaW8gMS4wICgxNC40SykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUkFfMTQ0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihSQTE0NENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHJhMTQ0X2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IHJhMTQ0X2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSByYTE0NF9lbmNvZGVfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RFTEFZIHwgQ09ERUNfQ0FQX1NNQUxMX0xBU1RfRlJBTUUsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAuc3VwcG9ydGVkX3NhbXBsZXJhdGVzID0gKGNvbnN0IGludFtdKXsgODAwMCwgMCB9LAorICAgIC5jaGFubmVsX2xheW91dHMgPSAoY29uc3QgdWludDY0X3RbXSkgeyBBVl9DSF9MQVlPVVRfTU9OTywgMCB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JhMjg4LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9yYTI4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjI2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yYTI4OC5jCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogUmVhbEF1ZGlvIDIuMCAoMjguOEspCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInJhMjg4LmgiCisjaW5jbHVkZSAibHBjLmgiCisjaW5jbHVkZSAiY2VscF9maWx0ZXJzLmgiCisKKyNkZWZpbmUgTUFYX0JBQ0tXQVJEX0ZJTFRFUl9PUkRFUiAgMzYKKyNkZWZpbmUgTUFYX0JBQ0tXQVJEX0ZJTFRFUl9MRU4gICAgNDAKKyNkZWZpbmUgTUFYX0JBQ0tXQVJEX0ZJTFRFUl9OT05SRUMgMzUKKworI2RlZmluZSBSQTI4OF9CTE9DS19TSVpFICAgICAgICA1CisjZGVmaW5lIFJBMjg4X0JMT0NLU19QRVJfRlJBTUUgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsICAgc3BfbHBjKVtGRkFMSUdOKDM2LCAxNildOyAgIC8vLzwgTFBDIGNvZWZmaWNpZW50cyBmb3Igc3BlZWNoIGRhdGEgKHNwZWM6IEEpCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgZ2Fpbl9scGMpW0ZGQUxJR04oMTAsIDE2KV07ICAgLy8vPCBMUEMgY29lZmZpY2llbnRzIGZvciBnYWluICAgICAgICAoc3BlYzogR0IpCisKKyAgICAvKiogc3BlZWNoIGRhdGEgaGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwZWM6IFNCKS4KKyAgICAgKiAgSXRzIGZpcnN0IDcwIGNvZWZmaWNpZW50cyBhcmUgdXBkYXRlZCBvbmx5IGF0IGJhY2t3YXJkIGZpbHRlcmluZy4KKyAgICAgKi8KKyAgICBmbG9hdCBzcF9oaXN0WzExMV07CisKKyAgICAvLy8gc3BlZWNoIHBhcnQgb2YgdGhlIGdhaW4gYXV0b2NvcnJlbGF0aW9uICAgICAgICAgICAgICAgICAgKHNwZWM6IFJFWFApCisgICAgZmxvYXQgc3BfcmVjWzM3XTsKKworICAgIC8qKiBsb2ctZ2FpbiBoaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3BlYzogU0JMRykuCisgICAgICogIEl0cyBmaXJzdCAyOCBjb2VmZmljaWVudHMgYXJlIHVwZGF0ZWQgb25seSBhdCBiYWNrd2FyZCBmaWx0ZXJpbmcuCisgICAgICovCisgICAgZmxvYXQgZ2Fpbl9oaXN0WzM4XTsKKworICAgIC8vLyByZWN1cnNpdmUgcGFydCBvZiB0aGUgZ2FpbiBhdXRvY29ycmVsYXRpb24gICAgICAgICAgICAgICAoc3BlYzogUkVYUExHKQorICAgIGZsb2F0IGdhaW5fcmVjWzExXTsKK30gUkEyODhDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgcmEyODhfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBSQTI4OENvbnRleHQgKnJhY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZyYWN0eC0+ZmRzcCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHJhMjg4X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBSQTI4OENvbnRleHQgKnJhY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICA9IDE7CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgICAgID0gQVZfU0FNUExFX0ZNVF9GTFQ7CisKKyAgICBpZiAoYXZjdHgtPmJsb2NrX2FsaWduIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBibG9jayBhbGlnblxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICByYWN0eC0+ZmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCk7CisgICAgaWYgKCFyYWN0eC0+ZmRzcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb252b2x2ZShmbG9hdCAqdGd0LCBjb25zdCBmbG9hdCAqc3JjLCBpbnQgbGVuLCBpbnQgbikKK3sKKyAgICBmb3IgKDsgbiA+PSAwOyBuLS0pCisgICAgICAgIHRndFtuXSA9IGF2cHJpdl9zY2FsYXJwcm9kdWN0X2Zsb2F0X2Moc3JjLCBzcmMgLSBuLCBsZW4pOworCit9CisKK3N0YXRpYyB2b2lkIGRlY29kZShSQTI4OENvbnRleHQgKnJhY3R4LCBmbG9hdCBnYWluLCBpbnQgY2JfY29lZikKK3sKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgc3Vtc3VtOworICAgIGZsb2F0IHN1bSwgYnVmZmVyWzVdOworICAgIGZsb2F0ICpibG9jayA9IHJhY3R4LT5zcF9oaXN0ICsgNzAgKyAzNjsgLy8gY3VycmVudCBibG9jaworICAgIGZsb2F0ICpnYWluX2Jsb2NrID0gcmFjdHgtPmdhaW5faGlzdCArIDI4OworCisgICAgbWVtbW92ZShyYWN0eC0+c3BfaGlzdCArIDcwLCByYWN0eC0+c3BfaGlzdCArIDc1LCAzNipzaXplb2YoKmJsb2NrKSk7CisKKyAgICAvKiBibG9jayA0NiBvZiBHLjcyOCBzcGVjICovCisgICAgc3VtID0gMzIuMDsKKyAgICBmb3IgKGk9MDsgaSA8IDEwOyBpKyspCisgICAgICAgIHN1bSAtPSBnYWluX2Jsb2NrWzktaV0gKiByYWN0eC0+Z2Fpbl9scGNbaV07CisKKyAgICAvKiBibG9jayA0NyBvZiBHLjcyOCBzcGVjICovCisgICAgc3VtID0gYXZfY2xpcGYoc3VtLCAwLCA2MCk7CisKKyAgICAvKiBibG9jayA0OCBvZiBHLjcyOCBzcGVjICovCisgICAgLyogZXhwKHN1bSAqIDAuMTE1MTI5MjU0NjQ5NykgPT0gcG93KDEwLjAsc3VtLzIwKSAqLworICAgIHN1bXN1bSA9IGV4cChzdW0gKiAwLjExNTEyOTI1NDY0OTcpICogZ2FpbiAqICgxLjAvKDE8PDIzKSk7CisKKyAgICBmb3IgKGk9MDsgaSA8IDU7IGkrKykKKyAgICAgICAgYnVmZmVyW2ldID0gY29kZXRhYmxlW2NiX2NvZWZdW2ldICogc3Vtc3VtOworCisgICAgc3VtID0gYXZwcml2X3NjYWxhcnByb2R1Y3RfZmxvYXRfYyhidWZmZXIsIGJ1ZmZlciwgNSk7CisKKyAgICBzdW0gPSBGRk1BWChzdW0sIDUuMCAvICgxPDwyNCkpOworCisgICAgLyogc2hpZnQgYW5kIHN0b3JlICovCisgICAgbWVtbW92ZShnYWluX2Jsb2NrLCBnYWluX2Jsb2NrICsgMSwgOSAqIHNpemVvZigqZ2Fpbl9ibG9jaykpOworCisgICAgZ2Fpbl9ibG9ja1s5XSA9IDEwICogbG9nMTAoc3VtKSArICgxMCpsb2cxMCgoKDE8PDI0KS81LikpIC0gMzIpOworCisgICAgZmZfY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZihibG9jaywgcmFjdHgtPnNwX2xwYywgYnVmZmVyLCA1LCAzNik7Cit9CisKKy8qKgorICogSHlicmlkIHdpbmRvdyBmaWx0ZXJpbmcsIHNlZSBibG9ja3MgMzYgYW5kIDQ5IG9mIHRoZSBHLjcyOCBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEBwYXJhbSBvcmRlciAgIGZpbHRlciBvcmRlcgorICogQHBhcmFtIG4gICAgICAgaW5wdXQgbGVuZ3RoCisgKiBAcGFyYW0gbm9uX3JlYyBudW1iZXIgb2Ygbm9uLXJlY3Vyc2l2ZSBzYW1wbGVzCisgKiBAcGFyYW0gb3V0ICAgICBmaWx0ZXIgb3V0cHV0CisgKiBAcGFyYW0gaGlzdCAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBoaXN0b3J5IG9mIHRoZSBmaWx0ZXIKKyAqIEBwYXJhbSBvdXQgICAgIHBvaW50ZXIgdG8gdGhlIG5vbi1yZWN1cnNpdmUgcGFydCBvZiB0aGUgb3V0cHV0CisgKiBAcGFyYW0gb3V0MiAgICBwb2ludGVyIHRvIHRoZSByZWN1cnNpdmUgcGFydCBvZiB0aGUgb3V0cHV0CisgKiBAcGFyYW0gd2luZG93ICBwb2ludGVyIHRvIHRoZSB3aW5kb3dpbmcgZnVuY3Rpb24gdGFibGUKKyAqLworc3RhdGljIHZvaWQgZG9faHlicmlkX3dpbmRvdyhSQTI4OENvbnRleHQgKnJhY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIsIGludCBuLCBpbnQgbm9uX3JlYywgZmxvYXQgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmhpc3QsIGZsb2F0ICpvdXQyLCBjb25zdCBmbG9hdCAqd2luZG93KQoreworICAgIGludCBpOworICAgIGZsb2F0IGJ1ZmZlcjFbTUFYX0JBQ0tXQVJEX0ZJTFRFUl9PUkRFUiArIDFdOworICAgIGZsb2F0IGJ1ZmZlcjJbTUFYX0JBQ0tXQVJEX0ZJTFRFUl9PUkRFUiArIDFdOworICAgIExPQ0FMX0FMSUdORUQoMzIsIGZsb2F0LCB3b3JrLCBbRkZBTElHTihNQVhfQkFDS1dBUkRfRklMVEVSX09SREVSICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0JBQ0tXQVJEX0ZJTFRFUl9MRU4gICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9CQUNLV0FSRF9GSUxURVJfTk9OUkVDLCAxNildKTsKKworICAgIGF2X2Fzc2VydDIob3JkZXI+PTApOworCisgICAgcmFjdHgtPmZkc3AtPnZlY3Rvcl9mbXVsKHdvcmssIHdpbmRvdywgaGlzdCwgRkZBTElHTihvcmRlciArIG4gKyBub25fcmVjLCAxNikpOworCisgICAgY29udm9sdmUoYnVmZmVyMSwgd29yayArIG9yZGVyICAgICwgbiAgICAgICwgb3JkZXIpOworICAgIGNvbnZvbHZlKGJ1ZmZlcjIsIHdvcmsgKyBvcmRlciArIG4sIG5vbl9yZWMsIG9yZGVyKTsKKworICAgIGZvciAoaT0wOyBpIDw9IG9yZGVyOyBpKyspIHsKKyAgICAgICAgb3V0MltpXSA9IG91dDJbaV0gKiAwLjU2MjUgKyBidWZmZXIxW2ldOworICAgICAgICBvdXQgW2ldID0gb3V0MltpXSAgICAgICAgICArIGJ1ZmZlcjJbaV07CisgICAgfQorCisgICAgLyogTXVsdGlwbHkgYnkgdGhlIHdoaXRlIG5vaXNlIGNvcnJlY3RpbmcgZmFjdG9yIChXTkNGKS4gKi8KKyAgICAqb3V0ICo9IDI1Ny4wIC8gMjU2LjA7Cit9CisKKy8qKgorICogQmFja3dhcmQgc3ludGhlc2lzIGZpbHRlciwgZmluZCB0aGUgTFBDIGNvZWZmaWNpZW50cyBmcm9tIHBhc3Qgc3BlZWNoIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIGJhY2t3YXJkX2ZpbHRlcihSQTI4OENvbnRleHQgKnJhY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpoaXN0LCBmbG9hdCAqcmVjLCBjb25zdCBmbG9hdCAqd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpscGMsIGNvbnN0IGZsb2F0ICp0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yZGVyLCBpbnQgbiwgaW50IG5vbl9yZWMsIGludCBtb3ZlX3NpemUpCit7CisgICAgZmxvYXQgdGVtcFtNQVhfQkFDS1dBUkRfRklMVEVSX09SREVSKzFdOworCisgICAgZG9faHlicmlkX3dpbmRvdyhyYWN0eCwgb3JkZXIsIG4sIG5vbl9yZWMsIHRlbXAsIGhpc3QsIHJlYywgd2luZG93KTsKKworICAgIGlmICghY29tcHV0ZV9scGNfY29lZnModGVtcCwgb3JkZXIsIGxwYywgMCwgMSwgMSkpCisgICAgICAgIHJhY3R4LT5mZHNwLT52ZWN0b3JfZm11bChscGMsIGxwYywgdGFiLCBGRkFMSUdOKG9yZGVyLCAxNikpOworCisgICAgbWVtbW92ZShoaXN0LCBoaXN0ICsgbiwgbW92ZV9zaXplKnNpemVvZigqaGlzdCkpOworfQorCitzdGF0aWMgaW50IHJhMjg4X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqIGF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBmbG9hdCAqb3V0OworICAgIGludCBpLCByZXQ7CisgICAgUkEyODhDb250ZXh0ICpyYWN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKworICAgIGlmIChidWZfc2l6ZSA8IGF2Y3R4LT5ibG9ja19hbGlnbikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJFcnJvciEgSW5wdXQgYnVmZmVyIGlzIHRvbyBzbWFsbCBbJWQ8JWRdXG4iLAorICAgICAgICAgICAgICAgYnVmX3NpemUsIGF2Y3R4LT5ibG9ja19hbGlnbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBSQTI4OF9CTE9DS19TSVpFICogUkEyODhfQkxPQ0tTX1BFUl9GUkFNRTsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG91dCA9IChmbG9hdCAqKWZyYW1lLT5kYXRhWzBdOworCisgICAgaW5pdF9nZXRfYml0czgoJmdiLCBidWYsIGF2Y3R4LT5ibG9ja19hbGlnbik7CisKKyAgICBmb3IgKGk9MDsgaSA8IFJBMjg4X0JMT0NLU19QRVJfRlJBTUU7IGkrKykgeworICAgICAgICBmbG9hdCBnYWluID0gYW1wdGFibGVbZ2V0X2JpdHMoJmdiLCAzKV07CisgICAgICAgIGludCBjYl9jb2VmID0gZ2V0X2JpdHMoJmdiLCA2ICsgKGkmMSkpOworCisgICAgICAgIGRlY29kZShyYWN0eCwgZ2FpbiwgY2JfY29lZik7CisKKyAgICAgICAgbWVtY3B5KG91dCwgJnJhY3R4LT5zcF9oaXN0WzcwICsgMzZdLCBSQTI4OF9CTE9DS19TSVpFICogc2l6ZW9mKCpvdXQpKTsKKyAgICAgICAgb3V0ICs9IFJBMjg4X0JMT0NLX1NJWkU7CisKKyAgICAgICAgaWYgKChpICYgNykgPT0gMykgeworICAgICAgICAgICAgYmFja3dhcmRfZmlsdGVyKHJhY3R4LCByYWN0eC0+c3BfaGlzdCwgcmFjdHgtPnNwX3JlYywgc3luX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWN0eC0+c3BfbHBjLCBzeW5fYndfdGFiLCAzNiwgNDAsIDM1LCA3MCk7CisKKyAgICAgICAgICAgIGJhY2t3YXJkX2ZpbHRlcihyYWN0eCwgcmFjdHgtPmdhaW5faGlzdCwgcmFjdHgtPmdhaW5fcmVjLCBnYWluX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWN0eC0+Z2Fpbl9scGMsIGdhaW5fYndfdGFiLCAxMCwgOCwgMjAsIDI4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBhdmN0eC0+YmxvY2tfYWxpZ247Cit9CisKK0FWQ29kZWMgZmZfcmFfMjg4X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInJlYWxfMjg4IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVhbEF1ZGlvIDIuMCAoMjguOEspIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1JBXzI4OCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUkEyODhDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSByYTI4OF9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSByYTI4OF9kZWNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gcmEyODhfZGVjb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcmEyODguaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3JhMjg4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwZTQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JhMjg4LmgKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBSZWFsQXVkaW8gMi4wICgyOC44SykKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1JBMjg4X0gKKyNkZWZpbmUgQVZDT0RFQ19SQTI4OF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBhbXB0YWJsZVs4XT17CisgICAgIDAuNTE1NjI1LCAgMC45MDIzNDM3NSwgIDEuNTc5MTAxNTYsICAyLjc2MzQyNzczLAorICAgIC0wLjUxNTYyNSwgLTAuOTAyMzQzNzUsIC0xLjU3OTEwMTU2LCAtMi43NjM0Mjc3MworfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY29kZXRhYmxlWzEyOF1bNV09eworICAgIHsgICA2NjgsIC0yOTUwLCAtMTI1NCwgLTE3OTAsIC0yNTUzfSwgeyAtNTAzMiwgLTQ1NzcsIC0xMDQ1LCAgMjkwOCwgIDMzMTh9LAorICAgIHsgLTI4MTksIC0yNjc3LCAgLTk0OCwgLTI4MjUsIC00NDUwfSwgeyAtNjY3OSwgIC0zNDAsICAxNDgyLCAtMTI3NiwgIDEyNjJ9LAorICAgIHsgIC01NjIsIC02NzU3LCAgMTI4MSwgICAxNzksIC0xMjc0fSwgeyAtMjUxMiwgLTcxMzAsIC00OTI1LCAgNjkxMywgIDI0MTF9LAorICAgIHsgLTI0NzgsICAtMTU2LCAgNDY4MywgLTM4NzMsICAgICAwfSwgeyAtODIwOCwgIDIxNDAsICAtNDc4LCAtMjc4NSwgICA1MzN9LAorICAgIHsgIDE4ODksICAyNzU5LCAgMTM4MSwgLTY5NTUsIC01OTEzfSwgeyAgNTA4MiwgLTI0NjAsIC01Nzc4LCAgMTc5NywgICA1Njh9LAorICAgIHsgLTIyMDgsIC0zMzA5LCAtNDUyMywgLTYyMzYsIC03NTA1fSwgeyAtMjcxOSwgIDQzNTgsIC0yOTg4LCAtMTE0OSwgIDI2NjR9LAorICAgIHsgIDEyNTksICAgOTk1LCAgMjcxMSwgLTI0NjQsLTEwMzkwfSwgeyAgMTcyMiwgLTc1NjksIC0yNzQyLCAgMjE3MSwgLTIzMjl9LAorICAgIHsgIDEwMzIsICAgNzQ3LCAgLTg1OCwgLTc5NDYsLTEyODQzfSwgeyAgMzEwNiwgIDQ4NTYsIC00MTkzLCAtMjU0MSwgIDEwMzV9LAorICAgIHsgIDE4NjIsICAtOTYwLCAtNjYyOCwgICA0MTAsICA1ODgyfSwgeyAtMjQ5MywgLTI2MjgsIC00MDAwLCAgIC02MCwgIDcyMDJ9LAorICAgIHsgLTI2NzIsICAxNDQ2LCAgMTUzNiwgLTM4MzEsICAxMjMzfSwgeyAtNTMwMiwgIDY5MTIsICAxNTg5LCAtNDE4NywgIDM2NjV9LAorICAgIHsgLTM0NTYsIC04MTcwLCAtNzcwOSwgIDEzODQsICA0Njk4fSwgeyAtNDY5OSwgLTYyMDksLTExMTc2LCAgODEwNCwgMTY4MzB9LAorICAgIHsgICA5MzAsICA3MDA0LCAgMTI2OSwgLTg5NzcsICAyNTY3fSwgeyAgNDY0OSwgMTE4MDQsICAzNDQxLCAtNTY1NywgIDExOTl9LAorICAgIHsgIDI1NDIsICAtMTgzLCAtODg1OSwgLTc5NzYsICAzMjMwfSwgeyAtMjg3MiwgLTIwMTEsIC05NzEzLCAtODM4NSwgMTI5ODN9LAorICAgIHsgIDMwODYsICAyMTQwLCAtMzY4MCwgLTk2NDMsIC0yODk2fSwgeyAtNzYwOSwgIDY1MTUsIC0yMjgzLCAtMjUyMiwgIDYzMzJ9LAorICAgIHsgLTMzMzMsIC01NjIwLCAtOTEzMCwtMTExMzEsICA1NTQzfSwgeyAgLTQwNywgLTY3MjEsLTE3NDY2LCAtMjg4OSwgMTE1Njh9LAorICAgIHsgIDM2OTIsICA2Nzk2LCAgLTI2MiwtMTA4NDYsIC0xODU2fSwgeyAgNzI3NSwgMTM0MDQsIC0yOTg5LC0xMDU5NSwgIDQ5MzZ9LAorICAgIHsgICAyNDQsIC0yMjE5LCAgMjY1NiwgIDM3NzYsIC01NDEyfSwgeyAtNDA0MywgLTU5MzQsICAyMTMxLCAgIDg2MywgLTI4NjZ9LAorICAgIHsgLTMzMDIsICAxNzQzLCAtMjAwNiwgIC0xMjgsIC0yMDUyfSwgeyAtNjM2MSwgIDMzNDIsIC0xNTgzLCAgIC0yMSwgIDExNDJ9LAorICAgIHsgLTM4MzcsIC0xODMxLCAgNjM5NywgIDI1NDUsIC0yODQ4fSwgeyAtOTMzMiwgLTY1MjgsICA1MzA5LCAgMTk4NiwgLTIyNDV9LAorICAgIHsgLTQ0OTAsICAgNzQ4LCAgMTkzNSwgLTMwMjcsICAtNDkzfSwgeyAtOTI1NSwgIDUzNjYsICAzMTkzLCAtNDQ5MywgIDE3ODR9LAorICAgIHsgIDQ3ODQsICAtMzcwLCAgMTg2NiwgIDEwNTcsIC0xODg5fSwgeyAgNzM0MiwgLTI2OTAsIC0yNTc3LCAgIDY3NiwgIC02MTF9LAorICAgIHsgIC01MDIsICAyMjM1LCAtMTg1MCwgLTE3NzcsIC0yMDQ5fSwgeyAgMTAxMSwgIDM4ODAsIC0yNDY1LCAgMjIwOSwgIC0xNTJ9LAorICAgIHsgIDI1OTIsICAyODI5LCAgNTU4OCwgIDI4MzksIC03MzA2fSwgeyAtMzA0OSwgLTQ5MTgsICA1OTU1LCAgOTIwMSwgLTQ0NDd9LAorICAgIHsgICA2OTcsICAzOTA4LCAgNTc5OCwgLTQ0NTEsIC00NjQ0fSwgeyAtMjEyMSwgIDU0NDQsIC0yNTcwLCAgIDMyMSwgLTEyMDJ9LAorICAgIHsgIDI4NDYsIC0yMDg2LCAgMzUzMiwgICA1NjYsICAtNzA4fSwgeyAtNDI3OSwgICA5NTAsICA0OTgwLCAgMzc0OSwgICA0NTJ9LAorICAgIHsgLTI0ODQsICAzNTAyLCAgMTcxOSwgIC0xNzAsICAgMjM4fSwgeyAtMzQzNSwgICAyNjMsICAyMTE0LCAtMjAwNSwgIDIzNjF9LAorICAgIHsgLTczMzgsIC0xMjA4LCAgOTM0NywgLTEyMTYsIC00MDEzfSwgey0xMzQ5OCwgIC00MzksICA4MDI4LCAtNDIzMiwgICAzNjF9LAorICAgIHsgLTM3MjksICA1NDMzLCAgMjAwNCwgLTQ3MjcsIC0xMjU5fSwgeyAtMzk4NiwgIDc3NDMsICA4NDI5LCAtMzY5MSwgIC05ODd9LAorICAgIHsgIDUxOTgsICAtNDIzLCAgMTE1MCwgLTEyODEsICAgODE2fSwgeyAgNzQwOSwgIDQxMDksIC0zOTQ5LCAgMjY5MCwgICAgMzB9LAorICAgIHsgIDEyNDYsICAzMDU1LCAgIC0zNSwgLTEzNzAsICAtMjQ2fSwgeyAtMTQ4OSwgIDU2MzUsICAtNjc4LCAtMjYyNywgIDMxNzB9LAorICAgIHsgIDQ4MzAsIC00NTg1LCAgMjAwOCwgLTEwNjIsICAgNzk5fSwgeyAgLTEyOSwgICA3MTcsICA0NTk0LCAxNDkzNywgMTA3MDZ9LAorICAgIHsgICA0MTcsICAyNzU5LCAgMTg1MCwgLTUwNTcsIC0xMTUzfSwgeyAtMzg4NywgIDczNjEsIC01NzY4LCAgNDI4NSwgICA2NjZ9LAorICAgIHsgIDE0NDMsICAtOTM4LCAgICAyMCwgLTIxMTksIC0xNjk3fSwgeyAtMzcxMiwgLTM0MDIsIC0yMjEyLCAgIDExMCwgIDIxMzZ9LAorICAgIHsgLTI5NTIsICAgIDEyLCAtMTU2OCwgLTM1MDAsIC0xODU1fSwgeyAtMTMxNSwgLTE3MzEsICAxMTYwLCAgLTU1OCwgIDE3MDl9LAorICAgIHsgICAgODgsIC00NTY5LCAgIDE5NCwgIC00NTQsIC0yOTU3fSwgeyAtMjgzOSwgLTE2NjYsICAtMjczLCAgMjA4NCwgIC0xNTV9LAorICAgIHsgIC0xODksIC0yMzc2LCAgMTY2MywgLTEwNDAsIC0yNDQ5fSwgeyAtMjg0MiwgLTEzNjksICAgNjM2LCAgLTI0OCwgLTI2Nzd9LAorICAgIHsgIDE1MTcsICAgIDc5LCAtMzAxMywgLTM2NjksICAtOTczfSwgeyAgMTkxMywgLTI0OTMsIC01MzEyLCAgLTc0OSwgIDEyNzF9LAorICAgIHsgLTI5MDMsIC0zMzI0LCAtMzc1NiwgLTM2OTAsIC0xODI5fSwgeyAtMjkxMywgLTE1NDcsIC0yNzYwLCAtMTQwNiwgIDExMjR9LAorICAgIHsgIDE4NDQsIC0xODM0LCAgIDQ1NiwgICA3MDYsIC00MjcyfSwgeyAgIDQ2NywgLTQyNTYsIC0xOTA5LCAgMTUyMSwgIDExMzR9LAorICAgIHsgIC0xMjcsICAtOTk0LCAgLTYzNywgLTE0OTEsIC02NDk0fSwgeyAgIDg3MywgLTIwNDUsIC0zODI4LCAtMjc5MiwgIC01Nzh9LAorICAgIHsgIDIzMTEsIC0xODE3LCAgMjYzMiwgLTMwNTIsICAxOTY4fSwgeyAgIDY0MSwgIDExOTQsICAxODkzLCAgNDEwNywgIDYzNDJ9LAorICAgIHsgICAtNDUsICAxMTk4LCAgMjE2MCwgLTE0NDksICAyMjAzfSwgeyAtMjAwNCwgIDE3MTMsICAzNTE4LCAgMjY1MiwgIDQyNTF9LAorICAgIHsgIDI5MzYsIC0zOTY4LCAgMTI4MCwgICAxMzEsIC0xNDc2fSwgeyAgMjgyNywgICAgIDgsIC0xOTI4LCAgMjY1OCwgIDM1MTN9LAorICAgIHsgIDMxOTksICAtODE2LCAgMjY4NywgLTE3NDEsIC0xNDA3fSwgeyAgMjk0OCwgIDQwMjksICAgMzk0LCAgLTI1MywgIDEyOTh9LAorICAgIHsgIDQyODYsICAgIDUxLCAtNDUwNywgICAtMzIsICAtNjU5fSwgeyAgMzkwMywgIDU2NDYsIC01NTg4LCAtMjU5MiwgIDU3MDd9LAorICAgIHsgIC02MDYsICAxMjM0LCAtMTYwNywgLTUxODcsICAgNjY0fSwgeyAgLTUyNSwgIDM2MjAsIC0yMTkyLCAtMjUyNywgIDE3MDd9LAorICAgIHsgIDQyOTcsIC0zMjUxLCAtMjI4MywgICA4MTIsIC0yMjY0fSwgeyAgNTc2NSwgICA1MjgsIC0zMjg3LCAgMTM1MiwgIDE2NzJ9LAorICAgIHsgIDI3MzUsICAxMjQxLCAtMTEwMywgLTMyNzMsIC0zNDA3fSwgeyAgNDAzMywgIDE2NDgsIC0yOTY1LCAtMTE3NCwgIDE0NDR9LAorICAgIHsgICAgNzQsICAgOTE4LCAgMTk5OSwgICA5MTUsIC0xMDI2fSwgeyAtMjQ5NiwgLTE2MDUsICAyMDM0LCAgMjk1MCwgICAyMjl9LAorICAgIHsgLTIxNjgsICAyMDM3LCAgICAxNSwgLTEyNjQsICAtMjA4fSwgeyAtMzU1MiwgIDE1MzAsICAgNTgxLCAgMTQ5MSwgICA5NjJ9LAorICAgIHsgLTI2MTMsIC0yMzM4LCAgMzYyMSwgLTE0ODgsIC0yMTg1fSwgeyAtMTc0NywgICAgODEsICA1NTM4LCAgMTQzMiwgLTIyNTd9LAorICAgIHsgLTEwMTksICAgODY3LCAgIDIxNCwgLTIyODQsIC0xNTEwfSwgeyAtMTY4NCwgIDI4MTYsICAtMjI5LCAgMjU1MSwgLTEzODl9LAorICAgIHsgIDI3MDcsICAgNTA0LCAgIDQ3OSwgIDI3ODMsIC0xMDA5fSwgeyAgMjUxNywgLTE0ODcsIC0xNTk2LCAgIDYyMSwgIDE5Mjl9LAorICAgIHsgIC0xNDgsICAyMjA2LCAtNDI4OCwgIDEyOTIsIC0xNDAxfSwgeyAgLTUyNywgIDEyNDMsIC0yNzMxLCAgMTkwOSwgIDEyODB9LAorICAgIHsgIDIxNDksIC0xNTAxLCAgMzY4OCwgICA2MTAsIC00NTkxfSwgeyAgMzMwNiwgLTMzNjksICAxODc1LCAgMzYzNiwgLTEyMTd9LAorICAgIHsgIDI1NzQsICAyNTEzLCAgMTQ0OSwgLTMwNzQsIC00OTc5fSwgeyAgIDgxNCwgIDE4MjYsIC0yNDk3LCAgNDIzNCwgLTQwNzd9LAorICAgIHsgIDE2NjQsICAtMjIwLCAgMzQxOCwgIDEwMDIsICAxMTE1fSwgeyAgIDc4MSwgIDE2NTgsICAzOTE5LCAgNjEzMCwgIDMxNDB9LAorICAgIHsgIDExNDgsICA0MDY1LCAgMTUxNiwgICA4MTUsICAgMTk5fSwgeyAgMTE5MSwgIDI0ODksICAyNTYxLCAgMjQyMSwgIDI0NDN9LAorICAgIHsgICA3NzAsIC01OTE1LCAgNTUxNSwgIC0zNjgsIC0zMTk5fSwgeyAgMTE5MCwgIDEwNDcsICAzNzQyLCAgNjkyNywgLTIwODl9LAorICAgIHsgICAyOTIsICAzMDk5LCAgNDMwOCwgIC03NTgsIC0yNDU1fSwgeyAgIDUyMywgIDM5MjEsICA0MDQ0LCAgMTM4NiwgICAgODV9LAorICAgIHsgIDQzNjcsICAxMDA2LCAtMTI1MiwgLTE0NjYsIC0xMzgzfSwgeyAgMzg1MiwgIDE1NzksICAgLTc3LCAgMjA2NCwgICA4Njh9LAorICAgIHsgIDUxMDksICAyOTE5LCAgLTIwMiwgICAzNTksICAtNTA5fSwgeyAgMzY1MCwgIDMyMDYsICAyMzAzLCAgMTY5MywgIDEyOTZ9LAorICAgIHsgIDI5MDUsIC0zOTA3LCAgIDIyOSwgLTExOTYsIC0yMzMyfSwgeyAgNTk3NywgLTM1ODUsICAgODA1LCAgMzgyNSwgLTMxMzh9LAorICAgIHsgIDM3NDYsICAtNjA2LCAgICA1MywgIC0yNjksIC0zMzAxfSwgeyAgIDYwNiwgIDIwMTgsIC0xMzE2LCAgNDA2NCwgICAzOTh9Cit9OworCitERUNMQVJFX0FMSUdORUQoMzIsIHN0YXRpYyBjb25zdCBmbG9hdCwgc3luX3dpbmRvdylbRkZBTElHTigxMTEsIDE2KV09eworICAwLjU3NjY5MDk3MiwgMC41ODA4MzgwMjUsIDAuNTg1MDEzOTg2LCAwLjU4OTIxOTk4NywgMC41OTM0NTU5NywgIDAuNTk3NzIzMDA3LAorICAwLjYwMjAyMDI2NCwgMC42MDYzODQyNzcsIDAuNjEwNzQ4MjkxLCAwLjYxNTE0MjgyMiwgMC42MTk1OTgzODksIDAuNjI0MDg0NDczLAorICAwLjYyODU3MDU1NywgMC42MzMxMTc2NzYsIDAuNjM3Njk1MzEzLCAwLjY0MjI3Mjk0OSwgMC42NDY5MTE2MjEsIDAuNjUxNTgwODExLAorICAwLjY1NjI4MDUxOCwgMC42NjEwNDEyNiwgIDAuNjY1ODAyMDAyLCAwLjY3MDU5MzI2MiwgMC42NzU0NDU1NTcsIDAuNjgwMzI4MzY5LAorICAwLjY4NTI0MTY5OSwgMC42OTAxODU1NDcsIDAuNjk1MTU5OTEyLCAwLjcwMDE2NDc5NSwgMC43MDUyMzA3MTMsIDAuNzEwMzI3MTQ4LAorICAwLjcxNTQ1NDEwMiwgMC43MjA2MTE1NzIsIDAuNzI1ODMwMDc4LCAwLjczMTA0ODU4NCwgMC43MzYzMjgxMjUsIDAuNzQxNjM4MTg0LAorICAwLjc0NzAwOTI3NywgMC43NTIzODAzNzEsIDAuNzU3ODEyNSwgICAwLjc2MzMwNTY2NCwgMC43Njg3OTg4MjgsIDAuNzc0MzUzMDI3LAorICAwLjc3OTkzNzc0NCwgMC43ODU1ODM0OTYsIDAuNzkxMjI5MjQ4LCAwLjc5NjkzNjAzNSwgMC44MDI3MDM4NTcsIDAuODA4NTAyMTk3LAorICAwLjgxNDMzMTA1NSwgMC44MjAyMjA5NDcsIDAuODI2MTQxMzU3LCAwLjgzMjA5MjI4NSwgMC44MzgxMDQyNDgsIDAuODQ0MTQ2NzI5LAorICAwLjg1MDI1MDI0NCwgMC44NTYzODQyNzcsIDAuODYyNTQ4ODI4LCAwLjg2ODc3NDQxNCwgMC44NzUwNjEwMzUsIDAuODgxMzc4MTc0LAorICAwLjg4NzcyNTgzLCAgMC44OTQxMzQ1MjEsIDAuOTAwNjA0MjQ4LCAwLjkwNzEwNDQ5MiwgMC45MTM2MzUyNTQsIDAuOTIwMjI3MDUxLAorICAwLjkyNjg3OTg4MywgMC45MzM1NjMyMzIsIDAuOTQwMzA3NjE3LCAwLjk0NzA4MjUyLCAgMC45NTM5MTg0NTcsIDAuOTYwODE1NDMsCisgIDAuOTY3NzQyOTIsICAwLjk3NDczMTQ0NSwgMC45ODE3ODEwMDYsIDAuOTg4ODYxMDg0LCAwLjk5NDg0MjUyOSwgMC45OTg1NjU2NzQsCisgIDAuOTk5OTY5NDgyLCAwLjk5OTExNDk5LCAgMC45OTYwMDIxOTcsIDAuOTkwNjAwNTg2LCAwLjk4MjkxMDE1NiwgMC45NzMwMjI0NjEsCisgIDAuOTYwODc2NDY1LCAwLjk0NjUzMzIwMywgMC45MzAwNTM3MTEsIDAuOTExNDM3OTg4LCAwLjg5MDc0NzA3LCAgMC44NjgwNDE5OTIsCisgIDAuODQzMzIyNzU0LCAwLjgxNjY4MDkwOCwgMC43ODgyMDgwMDgsIDAuNzU3OTA0MDUzLCAwLjcyNTg5MTExMywgMC42OTIxOTk3MDcsCisgIDAuNjU2OTIxMzg3LCAwLjYyMDE3ODIyMywgMC41ODIwMDA3MzIsIDAuNTQyNDgwNDY5LCAwLjUwMTczOTUwMiwgMC40NTk4Mzg4NjcsCisgIDAuNDE2OTAwNjM1LCAwLjM3MzAxNjM1NywgMC4zMjgyNzc1ODgsIDAuMjgyNzc1ODc5LCAwLjIzNjY2MzgxOCwgMC4xODk5NzE5MjQsCisgIDAuMTQyODUyNzgzLCAwLjA5NTQyODQ2NjgsMC4wNDc3NjAwMDk4Cit9OworCitERUNMQVJFX0FMSUdORUQoMzIsIHN0YXRpYyBjb25zdCBmbG9hdCwgZ2Fpbl93aW5kb3cpW0ZGQUxJR04oMzgsIDE2KV09eworICAwLjUwNTY5OTk5MiwgMC41MjQyMDAwMjIsIDAuNTQzMzk5OTksICAwLjU2MzMwMDAxNCwgMC41ODM5NTM4NTcsIDAuNjA1MzQ2NjgsCisgIDAuNjI3NTAyNDQxLCAwLjY1MDQ4MjE3OCwgMC42NzQzMTY0MDYsIDAuNjk5MDA1MTI3LCAwLjcyNDU3ODg1NywgMC43NTExMjkxNSwKKyAgMC43Nzg2MjU0ODgsIDAuODA3MTI4OTA2LCAwLjgzNjY2OTkyMiwgMC44NjczMDk1NywgIDAuODk5MDc4MzY5LCAwLjkzMjAwNjgzNiwKKyAgMC45NjE0ODY4MTYsIDAuOTgyNzU3NTY4LCAwLjk5NTYzNTk4NiwgMSwgICAgICAgICAgIDAuOTk1ODE5MDkyLCAwLjk4MzE1NDI5NywKKyAgMC45NjIwNjY2NSwgIDAuOTMyNzY5Nzc1LCAwLjg5NTUwNzgxMywgMC44NTA1ODU5MzgsIDAuNzk4NDAwODc5LCAwLjczOTM3OTg4MywKKyAgMC42NzQwNzIyNjYsIDAuNjAyOTk2ODI2LCAwLjUyNjc2MzkxNiwgMC40NDYwMTQ0MDQsIDAuMzYxNDgwNzEzLCAwLjI3MzgzNDIyOSwKKyAgMC4xODM4Njg0MDgsIDAuMDkyMzQ2MTkxNAorfTsKKworLyoqIHN5bnRoZXNpcyBiYW5kd2lkdGggYnJvYWRlbmluZyB0YWJsZSAqLworREVDTEFSRV9BTElHTkVEKDMyLCBzdGF0aWMgY29uc3QgZmxvYXQsIHN5bl9id190YWIpW0ZGQUxJR04oMzYsIDE2KV0gPSB7CisgIDAuOTg4MjgxMjUsICAwLjk3NjY5OTgyOSwgMC45NjUyNTQxMjgsIDAuOTUzOTQyNTM3LCAwLjk0Mjc2MzUwNywgMC45MzE3MTU0ODgsCisgIDAuOTIwNzk2OTMxLCAwLjkxMDAwNjM0NCwgMC44OTkzNDIxNzksIDAuODg4ODAzMDA1LCAwLjg3ODM4NzMzMiwgMC44NjgwOTM3MjksCisgIDAuODU3OTIwNzY2LCAwLjg0Nzg2NzAxMiwgMC44Mzc5MzEwOTcsIDAuODI4MTExNTg5LCAwLjgxODQwNzE3OCwgMC44MDg4MTY0OTMsCisgIDAuNzk5MzM4MTYyLCAwLjc4OTk3MDkzNCwgMC43ODA3MTM0MzksIDAuNzcxNTY0NDI0LCAwLjc2MjUyMjYzOCwgMC43NTM1ODY4MjksCisgIDAuNzQ0NzU1NzQ1LCAwLjczNjAyODEzNSwgMC43Mjc0MDI4MDYsIDAuNzE4ODc4NTY3LCAwLjcxMDQ1NDIyNiwgMC43MDIxMjg1ODksCisgIDAuNjkzOTAwNTI2LCAwLjY4NTc2ODkwMiwgMC42Nzc3MzI1MjcsIDAuNjY5NzkwMzI4LCAwLjY2MTk0MTIzLCAgMC42NTQxODQxMDMKK307CisKKy8qKiBnYWluIGJhbmR3aWR0aCBicm9hZGVuaW5nIHRhYmxlICovCitERUNMQVJFX0FMSUdORUQoMzIsIHN0YXRpYyBjb25zdCBmbG9hdCwgZ2Fpbl9id190YWIpW0ZGQUxJR04oMTAsIDE2KV0gPSB7CisgIDAuOTA2MjUsICAgICAwLjgyMTI4OTA2MywgMC43NDQzMjM3MywgIDAuNjc0NDk5NTEyLCAwLjYxMTI2NzA5LAorICAwLjU1Mzk1NTA3OCwgMC41MDIwMTQxNiwgIDAuNDU0OTU2MDU1LCAwLjQxMjI5MjQ4LCAgMC4zNzM2NTcyMjcKK307CisKKyNlbmRpZiAvKiBBVkNPREVDX1JBMjg4X0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JhbGYuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JhbGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTMxOWFjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmFsZi5jCkBAIC0wLDAgKzEsNTM2IEBACisvKgorICogUmVhbEF1ZGlvIExvc3NsZXNzIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUaGlzIGlzIGEgZGVjb2RlciBmb3IgUmVhbCBBdWRpbyBMb3NzbGVzcyBmb3JtYXQuCisgKiBEZWRpY2F0ZWQgdG8gdGhlIG1hc3Rlcm1pbmQgYmVoaW5kIGl0LCBSYWxwaCBXaWdndW0uCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorI2luY2x1ZGUgInJhbGZkYXRhLmgiCisKKyNkZWZpbmUgRklMVEVSX05PTkUgMAorI2RlZmluZSBGSUxURVJfUkFXICA2NDIKKwordHlwZWRlZiBzdHJ1Y3QgVkxDU2V0IHsKKyAgICBWTEMgZmlsdGVyX3BhcmFtczsKKyAgICBWTEMgYmlhczsKKyAgICBWTEMgY29kaW5nX21vZGU7CisgICAgVkxDIGZpbHRlcl9jb2VmZnNbMTBdWzExXTsKKyAgICBWTEMgc2hvcnRfY29kZXNbMTVdOworICAgIFZMQyBsb25nX2NvZGVzWzEyNV07Cit9IFZMQ1NldDsKKworI2RlZmluZSBSQUxGX01BWF9QS1RfU0laRSA4MTkyCisKK3R5cGVkZWYgc3RydWN0IFJBTEZDb250ZXh0IHsKKyAgICBpbnQgdmVyc2lvbjsKKyAgICBpbnQgbWF4X2ZyYW1lX3NpemU7CisgICAgVkxDU2V0IHNldHNbM107CisgICAgaW50MzJfdCBjaGFubmVsX2RhdGFbMl1bNDA5Nl07CisKKyAgICBpbnQgICAgIGZpbHRlcl9wYXJhbXM7ICAgLy8vPCBjb21iaW5lZCBmaWx0ZXIgcGFyYW1ldGVycyBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbCBkYXRhCisgICAgaW50ICAgICBmaWx0ZXJfbGVuZ3RoOyAgIC8vLzwgbGVuZ3RoIG9mIHRoZSBmaWx0ZXIgZm9yIHRoZSBjdXJyZW50IGNoYW5uZWwgZGF0YQorICAgIGludCAgICAgZmlsdGVyX2JpdHM7ICAgICAvLy88IGZpbHRlciBwcmVjaXNpb24gZm9yIHRoZSBjdXJyZW50IGNoYW5uZWwgZGF0YQorICAgIGludDMyX3QgZmlsdGVyWzY0XTsKKworICAgIGludCAgICAgYmlhc1syXTsgICAgICAgICAvLy88IGEgY29uc3RhbnQgdmFsdWUgYWRkZWQgdG8gY2hhbm5lbCBkYXRhIGFmdGVyIGZpbHRlcmluZworCisgICAgaW50IG51bV9ibG9ja3M7ICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJsb2NrcyBpbnNpZGUgdGhlIGZyYW1lCisgICAgaW50IHNhbXBsZV9vZmZzZXQ7CisgICAgaW50IGJsb2NrX3NpemVbMSA8PCAxMl07IC8vLzwgc2l6ZSBvZiB0aGUgYmxvY2tzCisgICAgaW50IGJsb2NrX3B0c1sxIDw8IDEyXTsgIC8vLzwgYmxvY2sgc3RhcnQgdGltZSAoaW4gbWlsbGlzZWNvbmRzKQorCisgICAgdWludDhfdCBwa3RbMTYzODRdOworICAgIGludCAgICAgaGFzX3BrdDsKK30gUkFMRkNvbnRleHQ7CisKKyNkZWZpbmUgTUFYX0VMRU1TIDY0NCAvLyBubyBSQUxGIHRhYmxlIHVzZXMgbW9yZSB0aGFuIHRoYXQKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXRfcmFsZl92bGMoVkxDICp2bGMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBlbGVtcykKK3sKKyAgICB1aW50OF90ICBsZW5zW01BWF9FTEVNU107CisgICAgdWludDE2X3QgY29kZXNbTUFYX0VMRU1TXTsKKyAgICBpbnQgY291bnRzWzE3XSwgcHJlZml4ZXNbMThdOworICAgIGludCBpLCBjdXJfbGVuOworICAgIGludCBtYXhfYml0cyA9IDA7CisgICAgaW50IG5iID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gMTY7IGkrKykKKyAgICAgICAgY291bnRzW2ldID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZWxlbXM7IGkrKykgeworICAgICAgICBjdXJfbGVuICA9IChuYiA/ICpkYXRhICYgMHhGIDogKmRhdGEgPj4gNCkgKyAxOworICAgICAgICBjb3VudHNbY3VyX2xlbl0rKzsKKyAgICAgICAgbWF4X2JpdHMgPSBGRk1BWChtYXhfYml0cywgY3VyX2xlbik7CisgICAgICAgIGxlbnNbaV0gID0gY3VyX2xlbjsKKyAgICAgICAgZGF0YSAgICArPSBuYjsKKyAgICAgICAgbmIgICAgICBePSAxOworICAgIH0KKyAgICBwcmVmaXhlc1sxXSA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKQorICAgICAgICBwcmVmaXhlc1tpICsgMV0gPSAocHJlZml4ZXNbaV0gKyBjb3VudHNbaV0pIDw8IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZWxlbXM7IGkrKykKKyAgICAgICAgY29kZXNbaV0gPSBwcmVmaXhlc1tsZW5zW2ldXSsrOworCisgICAgcmV0dXJuIGZmX2luaXRfdmxjX3NwYXJzZSh2bGMsIEZGTUlOKG1heF9iaXRzLCA5KSwgZWxlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5zLCAxLCAxLCBjb2RlcywgMiwgMiwgTlVMTCwgMCwgMCwgMCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFJBTEZDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCBqLCBrOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBmZl9mcmVlX3ZsYygmY3R4LT5zZXRzW2ldLmZpbHRlcl9wYXJhbXMpOworICAgICAgICBmZl9mcmVlX3ZsYygmY3R4LT5zZXRzW2ldLmJpYXMpOworICAgICAgICBmZl9mcmVlX3ZsYygmY3R4LT5zZXRzW2ldLmNvZGluZ19tb2RlKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMTE7IGsrKykKKyAgICAgICAgICAgICAgICBmZl9mcmVlX3ZsYygmY3R4LT5zZXRzW2ldLmZpbHRlcl9jb2VmZnNbal1ba10pOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTU7IGorKykKKyAgICAgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPnNldHNbaV0uc2hvcnRfY29kZXNbal0pOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTI1OyBqKyspCisgICAgICAgICAgICBmZl9mcmVlX3ZsYygmY3R4LT5zZXRzW2ldLmxvbmdfY29kZXNbal0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFJBTEZDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCBqLCBrOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMjQgfHwgbWVtY21wKGF2Y3R4LT5leHRyYWRhdGEsICJMU0Q6IiwgNCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFeHRyYWRhdGEgaXMgbm90IGdyb292eSwgZHVkZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGN0eC0+dmVyc2lvbiA9IEFWX1JCMTYoYXZjdHgtPmV4dHJhZGF0YSArIDQpOworICAgIGlmIChjdHgtPnZlcnNpb24gIT0gMHgxMDMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiVW5rbm93biB2ZXJzaW9uICVYIiwgY3R4LT52ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGF2Y3R4LT5jaGFubmVscyAgICA9IEFWX1JCMTYoYXZjdHgtPmV4dHJhZGF0YSArIDgpOworICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDEyKTsKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDwgMSB8fCBhdmN0eC0+Y2hhbm5lbHMgPiAyCisgICAgICAgIHx8IGF2Y3R4LT5zYW1wbGVfcmF0ZSA8IDgwMDAgfHwgYXZjdHgtPnNhbXBsZV9yYXRlID4gOTYwMDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNvZGluZyBwYXJhbWV0ZXJzICVkIEh6ICVkIGNoXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgICAgID0gQVZfU0FNUExFX0ZNVF9TMTZQOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IChhdmN0eC0+Y2hhbm5lbHMgPT0gMikgPyBBVl9DSF9MQVlPVVRfU1RFUkVPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX0NIX0xBWU9VVF9NT05POworCisgICAgY3R4LT5tYXhfZnJhbWVfc2l6ZSA9IEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDE2KTsKKyAgICBpZiAoY3R4LT5tYXhfZnJhbWVfc2l6ZSA+ICgxIDw8IDIwKSB8fCAhY3R4LT5tYXhfZnJhbWVfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgZnJhbWUgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgIGN0eC0+bWF4X2ZyYW1lX3NpemUpOworICAgIH0KKyAgICBjdHgtPm1heF9mcmFtZV9zaXplID0gRkZNQVgoY3R4LT5tYXhfZnJhbWVfc2l6ZSwgYXZjdHgtPnNhbXBsZV9yYXRlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgcmV0ID0gaW5pdF9yYWxmX3ZsYygmY3R4LT5zZXRzW2ldLmZpbHRlcl9wYXJhbXMsIGZpbHRlcl9wYXJhbV9kZWZbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMVEVSUEFSQU1fRUxFTUVOVFMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZGVjb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gaW5pdF9yYWxmX3ZsYygmY3R4LT5zZXRzW2ldLmJpYXMsIGJpYXNfZGVmW2ldLCBCSUFTX0VMRU1FTlRTKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGRlY29kZV9jbG9zZShhdmN0eCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IGluaXRfcmFsZl92bGMoJmN0eC0+c2V0c1tpXS5jb2RpbmdfbW9kZSwgY29kaW5nX21vZGVfZGVmW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPRElOR19NT0RFX0VMRU1FTlRTKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGRlY29kZV9jbG9zZShhdmN0eCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMTE7IGsrKykgeworICAgICAgICAgICAgICAgIHJldCA9IGluaXRfcmFsZl92bGMoJmN0eC0+c2V0c1tpXS5maWx0ZXJfY29lZmZzW2pdW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2NvZWZmc19kZWZbaV1bal1ba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxURVJfQ09FRkZTX0VMRU1FTlRTKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY2xvc2UoYXZjdHgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTU7IGorKykgeworICAgICAgICAgICAgcmV0ID0gaW5pdF9yYWxmX3ZsYygmY3R4LT5zZXRzW2ldLnNob3J0X2NvZGVzW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydF9jb2Rlc19kZWZbaV1bal0sIFNIT1JUX0NPREVTX0VMRU1FTlRTKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgZGVjb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMjU7IGorKykgeworICAgICAgICAgICAgcmV0ID0gaW5pdF9yYWxmX3ZsYygmY3R4LT5zZXRzW2ldLmxvbmdfY29kZXNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfY29kZXNfZGVmW2ldW2pdLCBMT05HX0NPREVTX0VMRU1FTlRTKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgZGVjb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dGVuZF9jb2RlKEdldEJpdENvbnRleHQgKmdiLCBpbnQgdmFsLCBpbnQgcmFuZ2UsIGludCBiaXRzKQoreworICAgIGlmICh2YWwgPT0gMCkgeworICAgICAgICB2YWwgPSAtcmFuZ2UgLSBnZXRfdWVfZ29sb21iKGdiKTsKKyAgICB9IGVsc2UgaWYgKHZhbCA9PSByYW5nZSAqIDIpIHsKKyAgICAgICAgdmFsID0gIHJhbmdlICsgZ2V0X3VlX2dvbG9tYihnYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsIC09IHJhbmdlOworICAgIH0KKyAgICBpZiAoYml0cykKKyAgICAgICAgdmFsID0gKHZhbCA8PCBiaXRzKSB8IGdldF9iaXRzKGdiLCBiaXRzKTsKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jaGFubmVsKFJBTEZDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiLCBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsIGludCBtb2RlLCBpbnQgYml0cykKK3sKKyAgICBpbnQgaSwgdDsKKyAgICBpbnQgY29kZV9wYXJhbXM7CisgICAgVkxDU2V0ICpzZXQgPSBjdHgtPnNldHMgKyBtb2RlOworICAgIFZMQyAqY29kZV92bGM7IGludCByYW5nZSwgcmFuZ2UyLCBhZGRfYml0czsKKyAgICBpbnQgKmRzdCA9IGN0eC0+Y2hhbm5lbF9kYXRhW2NoXTsKKworICAgIGN0eC0+ZmlsdGVyX3BhcmFtcyA9IGdldF92bGMyKGdiLCBzZXQtPmZpbHRlcl9wYXJhbXMudGFibGUsIDksIDIpOworICAgIGN0eC0+ZmlsdGVyX2JpdHMgICA9IChjdHgtPmZpbHRlcl9wYXJhbXMgLSAyKSA+PiA2OworICAgIGN0eC0+ZmlsdGVyX2xlbmd0aCA9IGN0eC0+ZmlsdGVyX3BhcmFtcyAtIChjdHgtPmZpbHRlcl9iaXRzIDw8IDYpIC0gMTsKKworICAgIGlmIChjdHgtPmZpbHRlcl9wYXJhbXMgPT0gRklMVEVSX1JBVykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgICAgICBkc3RbaV0gPSBnZXRfYml0cyhnYiwgYml0cyk7CisgICAgICAgIGN0eC0+Ymlhc1tjaF0gPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjdHgtPmJpYXNbY2hdID0gZ2V0X3ZsYzIoZ2IsIHNldC0+Ymlhcy50YWJsZSwgOSwgMik7CisgICAgY3R4LT5iaWFzW2NoXSA9IGV4dGVuZF9jb2RlKGdiLCBjdHgtPmJpYXNbY2hdLCAxMjcsIDQpOworCisgICAgaWYgKGN0eC0+ZmlsdGVyX3BhcmFtcyA9PSBGSUxURVJfTk9ORSkgeworICAgICAgICBtZW1zZXQoZHN0LCAwLCBzaXplb2YoKmRzdCkgKiBsZW5ndGgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5maWx0ZXJfcGFyYW1zID4gMSkgeworICAgICAgICBpbnQgY21vZGUgPSAwLCBjb2VmZiA9IDA7CisgICAgICAgIFZMQyAqdmxjID0gc2V0LT5maWx0ZXJfY29lZmZzW2N0eC0+ZmlsdGVyX2JpdHNdICsgNTsKKworICAgICAgICBhZGRfYml0cyA9IGN0eC0+ZmlsdGVyX2JpdHM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+ZmlsdGVyX2xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0ID0gZ2V0X3ZsYzIoZ2IsIHZsY1tjbW9kZV0udGFibGUsIHZsY1tjbW9kZV0uYml0cywgMik7CisgICAgICAgICAgICB0ID0gZXh0ZW5kX2NvZGUoZ2IsIHQsIDIxLCBhZGRfYml0cyk7CisgICAgICAgICAgICBpZiAoIWNtb2RlKQorICAgICAgICAgICAgICAgIGNvZWZmIC09IDEyIDw8IGFkZF9iaXRzOworICAgICAgICAgICAgY29lZmYgPSB0IC0gY29lZmY7CisgICAgICAgICAgICBjdHgtPmZpbHRlcltpXSA9IGNvZWZmOworCisgICAgICAgICAgICBjbW9kZSA9IGNvZWZmID4+IGFkZF9iaXRzOworICAgICAgICAgICAgaWYgKGNtb2RlIDwgMCkgeworICAgICAgICAgICAgICAgIGNtb2RlID0gLTEgLSBhdl9sb2cyKC1jbW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKGNtb2RlIDwgLTUpCisgICAgICAgICAgICAgICAgICAgIGNtb2RlID0gLTU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNtb2RlID4gMCkgeworICAgICAgICAgICAgICAgIGNtb2RlID0gIDEgKyBhdl9sb2cyKGNtb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoY21vZGUgPiA1KQorICAgICAgICAgICAgICAgICAgICBjbW9kZSA9IDU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlX3BhcmFtcyA9IGdldF92bGMyKGdiLCBzZXQtPmNvZGluZ19tb2RlLnRhYmxlLCBzZXQtPmNvZGluZ19tb2RlLmJpdHMsIDIpOworICAgIGlmIChjb2RlX3BhcmFtcyA+PSAxNSkgeworICAgICAgICBhZGRfYml0cyA9IGF2X2NsaXAoKGNvZGVfcGFyYW1zIC8gNSAtIDMpIC8gMiwgMCwgMTApOworICAgICAgICBpZiAoYWRkX2JpdHMgPiA5ICYmIChjb2RlX3BhcmFtcyAlIDUpICE9IDIpCisgICAgICAgICAgICBhZGRfYml0cy0tOworICAgICAgICByYW5nZSAgICA9IDEwOworICAgICAgICByYW5nZTIgICA9IDIxOworICAgICAgICBjb2RlX3ZsYyA9IHNldC0+bG9uZ19jb2RlcyArIGNvZGVfcGFyYW1zIC0gMTU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWRkX2JpdHMgPSAwOworICAgICAgICByYW5nZSAgICA9IDY7CisgICAgICAgIHJhbmdlMiAgID0gMTM7CisgICAgICAgIGNvZGVfdmxjID0gc2V0LT5zaG9ydF9jb2RlcyArIGNvZGVfcGFyYW1zOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMikgeworICAgICAgICBpbnQgY29kZTEsIGNvZGUyOworCisgICAgICAgIHQgPSBnZXRfdmxjMihnYiwgY29kZV92bGMtPnRhYmxlLCBjb2RlX3ZsYy0+Yml0cywgMik7CisgICAgICAgIGNvZGUxID0gdCAvIHJhbmdlMjsKKyAgICAgICAgY29kZTIgPSB0ICUgcmFuZ2UyOworICAgICAgICBkc3RbaV0gICAgID0gZXh0ZW5kX2NvZGUoZ2IsIGNvZGUxLCByYW5nZSwgMCkgPDwgYWRkX2JpdHM7CisgICAgICAgIGRzdFtpICsgMV0gPSBleHRlbmRfY29kZShnYiwgY29kZTIsIHJhbmdlLCAwKSA8PCBhZGRfYml0czsKKyAgICAgICAgaWYgKGFkZF9iaXRzKSB7CisgICAgICAgICAgICBkc3RbaV0gICAgIHw9IGdldF9iaXRzKGdiLCBhZGRfYml0cyk7CisgICAgICAgICAgICBkc3RbaSArIDFdIHw9IGdldF9iaXRzKGdiLCBhZGRfYml0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXBwbHlfbHBjKFJBTEZDb250ZXh0ICpjdHgsIGludCBjaCwgaW50IGxlbmd0aCwgaW50IGJpdHMpCit7CisgICAgaW50IGksIGosIGFjYzsKKyAgICBpbnQgKmF1ZGlvID0gY3R4LT5jaGFubmVsX2RhdGFbY2hdOworICAgIGludCBiaWFzID0gMSA8PCAoY3R4LT5maWx0ZXJfYml0cyAtIDEpOworICAgIGludCBtYXhfY2xpcCA9ICgxIDw8IGJpdHMpIC0gMSwgbWluX2NsaXAgPSAtbWF4X2NsaXAgLSAxOworCisgICAgZm9yIChpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIGludCBmbGVuID0gRkZNSU4oY3R4LT5maWx0ZXJfbGVuZ3RoLCBpKTsKKworICAgICAgICBhY2MgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmxlbjsgaisrKQorICAgICAgICAgICAgYWNjICs9IGN0eC0+ZmlsdGVyW2pdICogYXVkaW9baSAtIGogLSAxXTsKKyAgICAgICAgaWYgKGFjYyA8IDApIHsKKyAgICAgICAgICAgIGFjYyA9IChhY2MgKyBiaWFzIC0gMSkgPj4gY3R4LT5maWx0ZXJfYml0czsKKyAgICAgICAgICAgIGFjYyA9IEZGTUFYKGFjYywgbWluX2NsaXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWNjID0gKGFjYyArIGJpYXMpID4+IGN0eC0+ZmlsdGVyX2JpdHM7CisgICAgICAgICAgICBhY2MgPSBGRk1JTihhY2MsIG1heF9jbGlwKTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb1tpXSArPSBhY2M7CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9ibG9jayhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0MCwgaW50MTZfdCAqZHN0MSkKK3sKKyAgICBSQUxGQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgbGVuLCBjaCwgcmV0OworICAgIGludCBkbW9kZSwgbW9kZVsyXSwgYml0c1syXTsKKyAgICBpbnQgKmNoMCwgKmNoMTsKKyAgICBpbnQgaSwgdCwgdDI7CisKKyAgICBsZW4gPSAxMiAtIGdldF91bmFyeShnYiwgMCwgNik7CisKKyAgICBpZiAobGVuIDw9IDcpIGxlbiBePSAxOyAvLyBjb2RlcyBmb3IgbGVuZ3RoID0gNiBhbmQgNyBhcmUgc3dhcHBlZAorICAgIGxlbiA9IDEgPDwgbGVuOworCisgICAgaWYgKGN0eC0+c2FtcGxlX29mZnNldCArIGxlbiA+IGN0eC0+bWF4X2ZyYW1lX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRGVjb2RlcidzIHN0b21hY2ggaXMgY3J5aW5nLCBpdCBhdGUgdG9vIG1hbnkgc2FtcGxlc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiAxKQorICAgICAgICBkbW9kZSA9IGdldF9iaXRzKGdiLCAyKSArIDE7CisgICAgZWxzZQorICAgICAgICBkbW9kZSA9IDA7CisKKyAgICBtb2RlWzBdID0gKGRtb2RlID09IDQpID8gMSA6IDA7CisgICAgbW9kZVsxXSA9IChkbW9kZSA+PSAyKSA/IDIgOiAwOworICAgIGJpdHNbMF0gPSAxNjsKKyAgICBiaXRzWzFdID0gKG1vZGVbMV0gPT0gMikgPyAxNyA6IDE2OworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgYXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2NoYW5uZWwoY3R4LCBnYiwgY2gsIGxlbiwgbW9kZVtjaF0sIGJpdHNbY2hdKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKGN0eC0+ZmlsdGVyX3BhcmFtcyA+IDEgJiYgY3R4LT5maWx0ZXJfcGFyYW1zICE9IEZJTFRFUl9SQVcpIHsKKyAgICAgICAgICAgIGN0eC0+ZmlsdGVyX2JpdHMgKz0gMzsKKyAgICAgICAgICAgIGFwcGx5X2xwYyhjdHgsIGNoLCBsZW4sIGJpdHNbY2hdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGNoMCA9IGN0eC0+Y2hhbm5lbF9kYXRhWzBdOworICAgIGNoMSA9IGN0eC0+Y2hhbm5lbF9kYXRhWzFdOworICAgIHN3aXRjaCAoZG1vZGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgIGRzdDBbaV0gPSBjaDBbaV0gKyBjdHgtPmJpYXNbMF07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBkc3QwW2ldID0gY2gwW2ldICsgY3R4LT5iaWFzWzBdOworICAgICAgICAgICAgZHN0MVtpXSA9IGNoMVtpXSArIGN0eC0+Ymlhc1sxXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2gwW2ldICs9IGN0eC0+Ymlhc1swXTsKKyAgICAgICAgICAgIGRzdDBbaV0gPSBjaDBbaV07CisgICAgICAgICAgICBkc3QxW2ldID0gY2gwW2ldIC0gKGNoMVtpXSArIGN0eC0+Ymlhc1sxXSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIHQgID0gY2gwW2ldICsgY3R4LT5iaWFzWzBdOworICAgICAgICAgICAgdDIgPSBjaDFbaV0gKyBjdHgtPmJpYXNbMV07CisgICAgICAgICAgICBkc3QwW2ldID0gdCArIHQyOworICAgICAgICAgICAgZHN0MVtpXSA9IHQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIHQgID0gICBjaDFbaV0gKyBjdHgtPmJpYXNbMV07CisgICAgICAgICAgICB0MiA9ICgoY2gwW2ldICsgY3R4LT5iaWFzWzBdKSA8PCAxKSB8ICh0ICYgMSk7CisgICAgICAgICAgICBkc3QwW2ldID0gKHQyICsgdCkgLyAyOworICAgICAgICAgICAgZHN0MVtpXSA9ICh0MiAtIHQpIC8gMjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjdHgtPnNhbXBsZV9vZmZzZXQgKz0gbGVuOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFJBTEZDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lICAgPSBkYXRhOworICAgIGludDE2X3QgKnNhbXBsZXMwOworICAgIGludDE2X3QgKnNhbXBsZXMxOworICAgIGludCByZXQ7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgdGFibGVfc2l6ZSwgdGFibGVfYnl0ZXMsIGk7CisgICAgY29uc3QgdWludDhfdCAqc3JjLCAqYmxvY2tfcG9pbnRlcjsKKyAgICBpbnQgc3JjX3NpemU7CisgICAgaW50IGJ5dGVzX2xlZnQ7CisKKyAgICBpZiAoY3R4LT5oYXNfcGt0KSB7CisgICAgICAgIGN0eC0+aGFzX3BrdCA9IDA7CisgICAgICAgIHRhYmxlX2J5dGVzID0gKEFWX1JCMTYoYXZwa3QtPmRhdGEpICsgNykgPj4gMzsKKyAgICAgICAgaWYgKHRhYmxlX2J5dGVzICsgMyA+IGF2cGt0LT5zaXplIHx8IGF2cGt0LT5zaXplID4gUkFMRl9NQVhfUEtUX1NJWkUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiV3JvbmcgcGFja2V0J3MgYnJlYXRoIHNtZWxscyBvZiB3cm9uZyBkYXRhIVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWVtY21wKGN0eC0+cGt0LCBhdnBrdC0+ZGF0YSwgMiArIHRhYmxlX2J5dGVzKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJXcm9uZyBwYWNrZXQgdGFpbHMgYXJlIHdyb25nIVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIHNyYyAgICAgID0gY3R4LT5wa3Q7CisgICAgICAgIHNyY19zaXplID0gUkFMRl9NQVhfUEtUX1NJWkUgKyBhdnBrdC0+c2l6ZTsKKyAgICAgICAgbWVtY3B5KGN0eC0+cGt0ICsgUkFMRl9NQVhfUEtUX1NJWkUsIGF2cGt0LT5kYXRhICsgMiArIHRhYmxlX2J5dGVzLAorICAgICAgICAgICAgICAgYXZwa3QtPnNpemUgLSAyIC0gdGFibGVfYnl0ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhdnBrdC0+c2l6ZSA9PSBSQUxGX01BWF9QS1RfU0laRSkgeworICAgICAgICAgICAgbWVtY3B5KGN0eC0+cGt0LCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgICAgICAgICAgY3R4LT5oYXNfcGt0ICAgPSAxOworICAgICAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworCisgICAgICAgICAgICByZXR1cm4gYXZwa3QtPnNpemU7CisgICAgICAgIH0KKyAgICAgICAgc3JjICAgICAgPSBhdnBrdC0+ZGF0YTsKKyAgICAgICAgc3JjX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICB9CisKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IGN0eC0+bWF4X2ZyYW1lX3NpemU7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzYW1wbGVzMCA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisgICAgc2FtcGxlczEgPSAoaW50MTZfdCAqKWZyYW1lLT5kYXRhWzFdOworCisgICAgaWYgKHNyY19zaXplIDwgNSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInRvbyBzaG9ydCBwYWNrZXRzIGFyZSB0b28gc2hvcnQhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHRhYmxlX3NpemUgID0gQVZfUkIxNihzcmMpOworICAgIHRhYmxlX2J5dGVzID0gKHRhYmxlX3NpemUgKyA3KSA+PiAzOworICAgIGlmIChzcmNfc2l6ZSA8IHRhYmxlX2J5dGVzICsgMykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInNob3J0IHBhY2tldHMgYXJlIHNob3J0IVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpbml0X2dldF9iaXRzKCZnYiwgc3JjICsgMiwgdGFibGVfc2l6ZSk7CisgICAgY3R4LT5udW1fYmxvY2tzID0gMDsKKyAgICB3aGlsZSAoZ2V0X2JpdHNfbGVmdCgmZ2IpID4gMCkgeworICAgICAgICBjdHgtPmJsb2NrX3NpemVbY3R4LT5udW1fYmxvY2tzXSA9IGdldF9iaXRzKCZnYiwgMTUpOworICAgICAgICBpZiAoZ2V0X2JpdHMxKCZnYikpIHsKKyAgICAgICAgICAgIGN0eC0+YmxvY2tfcHRzW2N0eC0+bnVtX2Jsb2Nrc10gPSBnZXRfYml0cygmZ2IsIDkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3R4LT5ibG9ja19wdHNbY3R4LT5udW1fYmxvY2tzXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5udW1fYmxvY2tzKys7CisgICAgfQorCisgICAgYmxvY2tfcG9pbnRlciA9IHNyYyAgICAgICsgdGFibGVfYnl0ZXMgKyAyOworICAgIGJ5dGVzX2xlZnQgICAgPSBzcmNfc2l6ZSAtIHRhYmxlX2J5dGVzIC0gMjsKKyAgICBjdHgtPnNhbXBsZV9vZmZzZXQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm51bV9ibG9ja3M7IGkrKykgeworICAgICAgICBpZiAoYnl0ZXNfbGVmdCA8IGN0eC0+YmxvY2tfc2l6ZVtpXSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJJ20gcGVkYWxpbmcgYmFja3dhcmRzXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBibG9ja19wb2ludGVyLCBjdHgtPmJsb2NrX3NpemVbaV0gKiA4KTsKKyAgICAgICAgaWYgKGRlY29kZV9ibG9jayhhdmN0eCwgJmdiLCBzYW1wbGVzMCArIGN0eC0+c2FtcGxlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzMSArIGN0eC0+c2FtcGxlX29mZnNldCkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNpciwgSSBnb3QgY2Fyc2ljayBpbiB5b3VyIG9mZmljZS4gTm90IGRlY29kaW5nIHRoZSByZXN0IG9mIHBhY2tldC5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2tfcG9pbnRlciArPSBjdHgtPmJsb2NrX3NpemVbaV07CisgICAgICAgIGJ5dGVzX2xlZnQgICAgLT0gY3R4LT5ibG9ja19zaXplW2ldOworICAgIH0KKworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gY3R4LT5zYW1wbGVfb2Zmc2V0OworICAgICpnb3RfZnJhbWVfcHRyICAgID0gY3R4LT5zYW1wbGVfb2Zmc2V0ID4gMDsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBSQUxGQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGN0eC0+aGFzX3BrdCA9IDA7Cit9CisKKworQVZDb2RlYyBmZl9yYWxmX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInJhbGYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsQXVkaW8gTG9zc2xlc3MiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUkFMRiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUkFMRkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmZsdXNoICAgICAgICAgID0gZGVjb2RlX2ZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9yYWxmZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmFsZmRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTg0ZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmFsZmRhdGEuaApAQCAtMCwwICsxLDk5MjAgQEAKKy8qCisgKiBSZWFsQXVkaW8gTG9zc2xlc3MgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19SQUxGREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfUkFMRkRBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgRklMVEVSUEFSQU1fRUxFTUVOVFMgICA2NDMKKyNkZWZpbmUgQklBU19FTEVNRU5UUyAgICAgICAgICAyNTUKKyNkZWZpbmUgQ09ESU5HX01PREVfRUxFTUVOVFMgICAxNDAKKyNkZWZpbmUgRklMVEVSX0NPRUZGU19FTEVNRU5UUyAgNDMKKyNkZWZpbmUgU0hPUlRfQ09ERVNfRUxFTUVOVFMgICAxNjkKKyNkZWZpbmUgTE9OR19DT0RFU19FTEVNRU5UUyAgICA0NDEKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZmlsdGVyX3BhcmFtX2RlZlszXVszMjRdID0geworICB7CisgICAgMHg0OCwgMHg4NiwgMHg2NiwgMHg4QSwgMHhCQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjQsIDB4NTQsIDB4NDUsCisgICAgMHg2NiwgMHg4OCwgMHhBQSwgMHhBQiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4NjUsIDB4NDUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4NzgsCisgICAgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhCQywgMHhDQiwgMHhCRiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RjksIDB4ODYsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NjcsIDB4NzcsIDB4ODgsIDB4ODgsIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHg5QiwgMHhCQiwgMHhDQiwgMHhCQiwgMHhDQywgMHhDQywKKyAgICAweENGLCAweEZGLCAweENDLCAweENGLCAweEZDLCAweEJDLCAweENDLCAweEZCLCAweEI5LCAweEZDLCAweEE4LCAweDc2LAorICAgIDB4NjYsIDB4NTYsIDB4NjYsIDB4NjcsIDB4NjcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODksIDB4ODgsIDB4ODksCisgICAgMHg5OSwgMHg5OSwgMHg5QSwgMHg5QSwgMHg5QSwgMHg5QSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHg5QSwgMHhBOSwKKyAgICAweEFCLCAweEE5LCAweEE5LCAweDk4LCAweDg2LCAweEZGLCAweENBLCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4OTksIDB4OTksIDB4OTgsIDB4OTksIDB4OTksIDB4OUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4NywKKyAgICAweDY1LCAweEZGLCAweEZCLCAweEFBLCAweEE5LCAweDg4LCAweDg4LCAweDg5LCAweDk5LCAweDk4LCAweDk5LCAweDlBLAorICAgIDB4QTksIDB4OUEsIDB4QTksIDB4QUEsIDB4QTksIDB4OUEsIDB4QUEsIDB4QTksIDB4QUEsIDB4QTksIDB4OTksIDB4OTksCisgICAgMHhBOSwgMHg5QSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg3NywgMHg2NCwgMHhGRiwgMHhGRiwgMHhGQywKKyAgICAweEJCLCAweEJBLCAweEI5LCAweEFBLCAweEFCLCAweEFBLCAweEFBLCAweEJBLCAweEFCLCAweEFCLCAweEFCLCAweENCLAorICAgIDB4QkEsIDB4QUIsIDB4QkIsIDB4QkIsIDB4QUEsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QTksIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHg4OCwgMHg4NywgMHg2NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweENCLCAweEJCLCAweEJDLCAweEJCLCAweENDLCAweEZCLCAweENDLCAweENGLCAweENGLAorICAgIDB4Q0MsIDB4RkMsIDB4RkMsIDB4Q0YsIDB4Q0IsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4OTksCisgICAgMHg4NiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QjgsIDB4QTAsIDB4MDAsIDB4MDAsCisgIH0sIHsKKyAgICAweEZCLCAweDk1LCAweDY3LCAweDhCLCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHg1NSwgMHg1NiwKKyAgICAweDc3LCAweDg5LCAweEJBLCAweEJCLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCOCwgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEFBLCAweEFBLCAweEJDLCAweEJDLCAweENCLCAweEJDLCAweENGLCAweENGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGQiwgMHg4NiwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweEJCLCAweEFCLCAweEJGLCAweENCLCAweEZBLCAweENDLAorICAgIDB4RkMsIDB4RUMsIDB4RUYsIDB4RkIsIDB4QkMsIDB4RkYsIDB4QkMsIDB4QkIsIDB4QTksIDB4RkYsIDB4OTgsIDB4NzYsCisgICAgMHg2NiwgMHg2NiwgMHg2NSwgMHg2NiwgMHg2NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweDk5LCAweDk5LCAweEFBLAorICAgIDB4QUEsIDB4QTksIDB4OTksIDB4OTgsIDB4NzYsIDB4RkYsIDB4RjksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHg5OSwgMHg4OSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDg5LCAweDk5LCAweDk5LCAweDk5LCAweDk4LCAweDk5LCAweDk4LCAweDc3LCAweDc3LAorICAgIDB4NjUsIDB4RkYsIDB4Q0EsIDB4QTksIDB4OTksIDB4ODksIDB4ODgsIDB4ODgsIDB4OTgsIDB4ODksIDB4OTksIDB4OTgsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHg5OSwgMHg5OSwgMHhBOSwgMHg5QSwgMHhBOSwgMHg5OSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEE5LCAweDk5LCAweDk5LCAweDk4LCAweDg4LCAweDc3LCAweDY0LCAweEZGLCAweENCLCAweEE5LAorICAgIDB4QTksIDB4QUEsIDB4QUEsIDB4QUEsIDB4OUEsIDB4QUIsIDB4QUEsIDB4OUEsIDB4QkIsIDB4QUIsIDB4QUIsIDB4QkIsCisgICAgMHhBQiwgMHhCQSwgMHhCQiwgMHhCQSwgMHhBQSwgMHhCQSwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBOSwgMHhBOSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweDg4LCAweDc3LCAweDY0LCAweEZGLCAweEZGLCAweEZGLCAweEJDLCAweEZCLCAweENCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkEsIDB4QkEsIDB4QUIsIDB4QkYsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4QkYsIDB4Q0MsCisgICAgMHhDQiwgMHhDQiwgMHhDQywgMHhCQiwgMHhCQiwgMHhGQiwgMHhDQiwgMHhCQywgMHhDQSwgMHhCQywgMHhBQSwgMHhBOSwKKyAgICAweDg2LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEZGLCAweEZDLCAweEZGLCAweEZGLCAweENGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgfSwgeworICAgIDB4OUIsIDB4NjUsIDB4NjcsIDB4QUIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEI1LCAweDU0LCAweDU2LAorICAgIDB4NjcsIDB4ODgsIDB4QTksIDB4QUIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEE4LCAweDY1LCAweDQ0LCAweDQ1LCAweDU2LCAweDY3LCAweDc4LAorICAgIDB4ODksIDB4OTksIDB4QTksIDB4QUEsIDB4QkIsIDB4QkIsIDB4QUIsIDB4QkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEY5LCAweDc2LCAweDU1LCAweDU0LCAweDU1LCAweDU1LCAweDU2LCAweDY3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4ODksIDB4OTksIDB4OTgsIDB4OTksIDB4OEEsIDB4OTksIDB4QkIsIDB4QUIsIDB4QkMsIDB4QUIsIDB4QkEsIDB4QUEsCisgICAgMHhCQiwgMHhDQiwgMHhDQywgMHhCQiwgMHhDQywgMHhCQiwgMHhBQywgMHhCQSwgMHg5NywgMHhGQiwgMHg5NywgMHg3NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4OTksIDB4ODksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4OTgsIDB4OTksIDB4OTksCisgICAgMHhBOSwgMHg5OSwgMHg4OCwgMHg4NywgMHg2NSwgMHhGRiwgMHhDQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg4NywKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4ODgsIDB4ODcsIDB4NzcsCisgICAgMHg2NCwgMHhGRiwgMHhGQywgMHhDQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHg5QSwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4ODksIDB4ODgsIDB4ODcsIDB4NjQsIDB4RkYsIDB4RkYsIDB4RkIsCisgICAgMHhGRiwgMHhCQywgMHhGQywgMHhCQiwgMHhDQiwgMHhCQiwgMHhDQSwgMHhDQiwgMHhCQywgMHhDQywgMHhCRiwgMHhCQywKKyAgICAweEJCLCAweEJCLCAweEJFLCAweEJDLCAweENCLCAweENDLCAweEJCLCAweEZDLCAweEJDLCAweENDLCAweEFCLCAweENCLAorICAgIDB4QUIsIDB4QkIsIDB4QUEsIDB4QTksIDB4OTcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkIsIDB4Q0YsIDB4RkIsCisgICAgMHhDQywgMHhGQywgMHhDRiwgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaWFzX2RlZlszXVsxMjhdID0geworICB7CisgICAgMHg0QSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQSwgMHhCQSwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweDlBLCAweEE5LCAweEE5LAorICAgIDB4OTksIDB4QTksIDB4OTksIDB4OTksIDB4QTksIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHg4OCwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDc3LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDU1LCAweDU1LCAweDU1LAorICAgIDB4NTUsIDB4NTQsIDB4NDQsIDB4MzIsIDB4NDQsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4NywgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDg4LCAweDg5LCAweDg5LCAweDk5LCAweDk5LCAweDk4LCAweDk5LCAweDlBLAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QTksIDB4OUEsIDB4OTksIDB4OUEsIDB4QTksIDB4QTksIDB4QTksCisgICAgMHhBQSwgMHhBQSwgMHhBOSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJBLCAweDQwLAorICB9LCB7CisgICAgMHg0QywgMHhCQywgMHhBQywgMHhCQywgMHhCQSwgMHhBQiwgMHhBQiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQiwgMHhBQSwKKyAgICAweEJCLCAweEFBLCAweEJCLCAweEFBLCAweEFCLCAweEJBLCAweEJBLCAweEFBLCAweEJCLCAweEFBLCAweEE5LCAweEFBLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4OUEsIDB4OUEsIDB4QUEsIDB4QTksIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OCwgMHg5OCwgMHg5OCwgMHg4OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg3LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDY3LCAweDY2LCAweDY2LCAweDU1LCAweDQ0LCAweDQ1LAorICAgIDB4NTQsIDB4NDQsIDB4NDQsIDB4MzMsIDB4NDQsIDB4NDUsIDB4NTUsIDB4NTYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4NywgMHg4NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDk5LCAweDg4LCAweDk5LCAweDk5LCAweDg5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEE5LAorICAgIDB4QTksIDB4QUEsIDB4OUEsIDB4QTksIDB4QUEsIDB4OUEsIDB4QUEsIDB4OUEsIDB4QUEsIDB4QUIsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQiwgMHhBQiwgMHhBQSwKKyAgICAweEFCLCAweEFCLCAweEFDLCAweEJCLCAweEFBLCAweEJCLCAweEJCLCAweDQwLAorICB9LCB7CisgICAgMHg1QiwgMHhCQiwgMHhCQywgMHhCQiwgMHhDQiwgMHhDQywgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhCQiwgMHhDQiwKKyAgICAweEJBLCAweENCLCAweEJDLCAweEJCLCAweEFBLCAweEJCLCAweEFCLCAweEJBLCAweEJCLCAweEJCLCAweEFCLCAweEJCLAorICAgIDB4QUEsIDB4QkEsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QTksIDB4OUEsCisgICAgMHg5QSwgMHg5OSwgMHg5QSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OCwgMHg5OCwgMHg4OSwgMHg5OSwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDY2LCAweDY2LCAweDU1LAorICAgIDB4NTQsIDB4NDQsIDB4NDMsIDB4MjIsIDB4MzQsIDB4NDQsIDB4NTUsIDB4NTYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg4NywgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHg4OSwgMHg5OSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweDlBLCAweEE5LCAweEE5LCAweDlBLCAweDlBLCAweEFBLCAweDlBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkEsIDB4QkIsCisgICAgMHhBQSwgMHhCQiwgMHhBQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQywKKyAgICAweEJCLCAweEJDLCAweEJCLCAweEJCLCAweENDLCAweEJDLCAweENCLCAweDUwLAorICB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb2RpbmdfbW9kZV9kZWZbM11bNzJdID0geworICB7CisgICAgMHhBQSwgMHg5OSwgMHhBQywgMHhCOSwgMHhCRCwgMHhBQSwgMHg3QSwgMHhBOCwgMHhBOCwgMHhBOCwgMHg3OSwgMHg3OSwKKyAgICAweDc3LCAweEE4LCAweDk3LCAweDc5LCAweDg5LCAweDc3LCAweDg3LCAweDg3LCAweDY4LCAweDc4LCAweDY2LCAweDg2LAorICAgIDB4ODcsIDB4NjcsIDB4NjgsIDB4NjYsIDB4NzYsIDB4NzYsIDB4NTcsIDB4NjcsIDB4NTUsIDB4NzUsIDB4NjUsIDB4NTYsCisgICAgMHg1NiwgMHg1NSwgMHg2NSwgMHg2NSwgMHg1NiwgMHg0NSwgMHg1NSwgMHg1NCwgMHg1NSwgMHg1NSwgMHg0NSwgMHg1NSwKKyAgICAweDU0LCAweDU1LCAweDU1LCAweDQ1LCAweDU2LCAweDY0LCAweDY2LCAweDc2LCAweDU3LCAweDY3LCAweDc3LCAweDc3LAorICAgIDB4OTgsIDB4ODgsIDB4OUQsIDB4QkYsIDB4QkEsIDB4RUMsIDB4RkMsIDB4QkEsIDB4RUYsIDB4RkMsIDB4MDAsIDB4MDAsCisgIH0sIHsKKyAgICAweENGLCAweDlCLCAweEFGLCAweEZGLCAweEZGLCAweEFCLCAweDhBLCAweDk4LCAweEI4LCAweEY5LCAweDc4LCAweDg5LAorICAgIDB4NzcsIDB4RjksIDB4RjcsIDB4NzksIDB4ODksIDB4NzcsIDB4OTcsIDB4OTcsIDB4NjgsIDB4NjgsIDB4NjYsIDB4QTYsCisgICAgMHg4NywgMHg3NywgMHg2OCwgMHg2NiwgMHg3NSwgMHg3NiwgMHg2NywgMHg1NiwgMHg2NSwgMHg3NSwgMHg3NSwgMHg1NiwKKyAgICAweDU2LCAweDU1LCAweDY1LCAweDY1LCAweDU2LCAweDU2LCAweDU1LCAweDU0LCAweDU1LCAweDU1LCAweDQ1LCAweDU1LAorICAgIDB4NTMsIDB4NTUsIDB4NjUsIDB4MzUsIDB4NjcsIDB4NjQsIDB4NjYsIDB4NjYsIDB4NTYsIDB4NzgsIDB4ODYsIDB4ODgsCisgICAgMHhBOCwgMHhGQiwgMHhBRiwgMHhGRiwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKyAgfSwgeworICAgIDB4REMsIDB4QUQsIDB4Q0MsIDB4Q0EsIDB4Q0YsIDB4RkUsIDB4REYsIDB4RkYsIDB4RTksIDB4RkYsIDB4OTksIDB4NzksCisgICAgMHg5NywgMHg5NywgMHg5NywgMHg3OSwgMHg3OSwgMHg3NywgMHg5NywgMHg5NywgMHg3OSwgMHg3OSwgMHg3NywgMHg4NiwKKyAgICAweDg3LCAweDY4LCAweDY4LCAweDc2LCAweDc2LCAweDc2LCAweDY3LCAweDU3LCAweDY2LCAweDY1LCAweDc2LCAweDY2LAorICAgIDB4NTYsIDB4NTUsIDB4NjQsIDB4NjUsIDB4NTUsIDB4NDUsIDB4NTUsIDB4NTQsIDB4NTUsIDB4NTUsIDB4MzUsIDB4NTUsCisgICAgMHg1MywgMHg1NSwgMHg2NSwgMHgzNSwgMHg2NywgMHg2NCwgMHg2NywgMHg4NywgMHg1NywgMHg4QSwgMHg4NiwgMHg4QiwKKyAgICAweEJBLCAweDlBLCAweENELCAweEFBLCAweEFGLCAweEZDLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweDAwLCAweDAwLAorICB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBmaWx0ZXJfY29lZmZzX2RlZlszXVsxMF1bMTFdWzI0XSA9IHsKKyB7CisgIHsKKyAgIHsKKyAgICAweDQ3LCAweDg4LCAweDc2LCAweDUyLCAweDEyLCAweDM1LCAweDQ0LCAweDQzLCAweDM0LCAweDQ1LCAweDc3LCAweDY3LAorICAgIDB4NjYsIDB4ODcsIDB4ODcsIDB4N0QsIDB4OEEsIDB4ODksIDB4OUQsIDB4REQsIDB4OUMsIDB4QzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4N0MsIDB4Q0MsIDB4QzcsIDB4NjUsIDB4Q0MsIDB4MjIsIDB4MjMsIDB4NDYsIDB4MzIsIDB4MjIsIDB4NDYsIDB4N0IsCisgICAgMHhCNiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhCQiwgMHhCQiwgMHhCNCwgMHg0MywgMHgyNSwgMHg1QiwgMHg1QSwgMHhBQiwgMHg1QiwgMHgyMiwgMHgyMiwgMHgyQiwKKyAgICAweEJBLCAweEFBLCAweDQ2LCAweDVCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEIwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweDk5LCAweDg5LCAweDg4LCAweDg5LCAweDMxLCAweDg4LCAweDg4LCAweDg5LCAweDg4LCAweDM4LCAweDg4LCAweDEzLAorICAgIDB4MjgsIDB4ODgsIDB4ODgsIDB4MjgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4OTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OTksIDB4ODksIDB4ODgsIDB4ODksIDB4ODgsIDB4ODgsIDB4ODgsIDB4MzksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHgwOCwgMHg4OCwgMHg4OCwgMHg4MSwgMHg5OSwgMHg4OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHgyMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQSwgMHhEOSwgMHg4NiwgMHhDRCwgMHhERCwgMHhERCwgMHg5OCwgMHg3NiwgMHg0MywgMHg2NSwgMHgzNSwgMHg2MywKKyAgICAweDIzLCAweDQ0LCAweDMzLCAweDI0LCAweDQ1LCAweDQ0LCAweDQ1LCAweDU5LCAweEE4LCAweDkwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweDk5LCAweDg5LCAweDg4LCAweDg5LCAweDk4LCAweDg4LCAweDg4LCAweDg5LCAweDk4LCAweDA4LCAweDg4LCAweDg4LAorICAgIDB4MjgsIDB4ODgsIDB4ODgsIDB4ODMsIDB4MTksIDB4OTgsIDB4ODgsIDB4OTksIDB4OTksIDB4OTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QTUsIDB4QTQsIDB4MDEsIDB4NEEsIDB4QUEsCisgICAgMHg1MywgMHg0QSwgMHhBNCwgMHhBQSwgMHg1QSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHg5QSwgMHhBQSwgMHhBMywgMHgzMSwgMHgzMSwKKyAgICAweDM0LCAweDM0LCAweEE5LCAweEE1LCAweDQ0LCAweDRBLCAweEFBLCAweEFBLCAweEFBLCAweEEwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEVFLCAweERFLCAweEVELCAweERFLCAweEVFLCAweEVELCAweERELCAweERFLCAweEU4LCAweEVFLCAweEU3LCAweDY0LAorICAgIDB4NDcsIDB4NDMsIDB4MzAsIDB4NDMsIDB4NDMsIDB4MzYsIDB4N0UsIDB4RUUsIDB4RUUsIDB4OTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NjcsIDB4ODcsIDB4ODcsIDB4NjYsIDB4NjUsIDB4NTUsIDB4NDQsIDB4NDUsIDB4NjUsIDB4NTQsIDB4NTQsIDB4MzIsCisgICAgMHgzNCwgMHg2NiwgMHg2MywgMHg1NSwgMHg0NCwgMHg1NCwgMHgzNCwgMHg0NSwgMHg1NiwgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDU2LCAweDY2LCAweDY1LCAweDU0LCAweDMzLCAweDM0LCAweDMzLCAweDMzLCAweDMzLCAweDM0LCAweDQ0LCAweDQ1LAorICAgIDB4NTYsIDB4NjYsIDB4NjcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4ODksIDB4NjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NzgsIDB4ODksIDB4OTgsIDB4NjUsIDB4NjUsIDB4MzIsIDB4MjIsIDB4MzIsIDB4MzMsIDB4MzMsIDB4NDUsIDB4NzcsCisgICAgMHg3NywgMHg4QiwgMHg5QSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRSwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHg5RCwgMHhEOCwgMHg4RCwgMHg1NywgMHg1NiwgMHg1NSwgMHg0NCwgMHg0NSwgMHgyMiwgMHgyMiwgMHgyMywgMHgzNCwKKyAgICAweDU3LCAweDc4LCAweDg4LCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweEQwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweERDLCAweENDLCAweDhDLCAweENDLCAweDg3LCAweDY1LCAweDU1LCAweDU0LCAweDIzLCAweDQ0LCAweDIxLCAweDIzLAorICAgIDB4NDYsIDB4NTYsIDB4ODcsIDB4N0MsIDB4OEMsIDB4OEMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4REQsIDB4Q0QsIDB4Q0MsIDB4Q0QsIDB4REMsIDB4QzcsIDB4NjQsIDB4NTgsIDB4MzEsIDB4MjUsIDB4MzMsIDB4MjIsCisgICAgMHg0NCwgMHg1NiwgMHg2NiwgMHg2RCwgMHhERCwgMHhERCwgMHhEQywgMHhEQywgMHhEQywgMHhEMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhCOSwgMHg5OSwgMHhBNiwgMHg2NywgMHg3OCwgMHg3NiwgMHg3OCwgMHg4OCwgMHg2NiwgMHg1NSwgMHg0NCwgMHg0MywKKyAgICAweDIzLCAweDMzLCAweDMzLCAweDMzLCAweDM0LCAweDQ1LCAweDU2LCAweDY2LCAweDg4LCAweEIwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweERELCAweENELCAweERDLCAweENELCAweERDLCAweENDLCAweDc3LCAweEM1LCAweDUzLCAweDEyLCAweDIzLCAweDMzLAorICAgIDB4MzMsIDB4NDYsIDB4NjUsIDB4NzUsIDB4OEQsIDB4REQsIDB4REQsIDB4REMsIDB4REMsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4REQsIDB4Q0QsIDB4Q0MsIDB4Q0QsIDB4REMsIDB4Q0MsIDB4OEMsIDB4ODUsIDB4NTUsIDB4MzMsIDB4MjEsIDB4MjMsCisgICAgMHgzMywgMHg0NCwgMHg1NiwgMHg1NiwgMHg1NiwgMHg4RCwgMHhERCwgMHhDQywgMHhEQywgMHhEMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhFRSwgMHhERSwgMHhERCwgMHhERSwgMHhERCwgMHhERCwgMHhERCwgMHg4NywgMHg3NSwgMHg1NSwgMHg0MywgMHgyMiwKKyAgICAweDIxLCAweDI1LCAweDY1LCAweDU1LCAweDY2LCAweDc3LCAweEQ4LCAweDhELCAweERELCAweDkwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEFBLCAweDk4LCAweDc3LCAweDU1LCAweDQzLAorICAgIDB4MzMsIDB4MzMsIDB4MjEsIDB4MzMsIDB4MzQsIDB4NjYsIDB4ODksIDB4QUYsIDB4RkYsIDB4QzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NTcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjUsIDB4NTUsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsCisgICAgMHgzMywgMHg0NCwgMHg0MywgMHg0NCwgMHg0NCwgMHg0NSwgMHg1NiwgMHg2NiwgMHg3NywgMHg1MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDU3LCAweDc2LCAweDY2LCAweDY1LCAweDQ0LCAweDQ0LCAweDQzLCAweDMzLCAweDMzLCAweDMzLCAweDMzLCAweDM0LAorICAgIDB4NDUsIDB4NTYsIDB4NjcsIDB4NzcsIDB4NzcsIDB4ODksIDB4ODgsIDB4ODksIDB4OTksIDB4NjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OEEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NDQsIDB4NDMsIDB4MzIsIDB4MzIsIDB4MjIsIDB4MzMsIDB4NDUsCisgICAgMHg2NywgMHg4OSwgMHhFQiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGQiwgMHhCQSwgMHhBNywgMHg3OCwgMHg2NiwgMHg2NSwgMHg1NCwgMHgyMiwgMHgyMSwgMHgyMywgMHg0NCwKKyAgICAweDU2LCAweDhBLCAweDlFLCAweEFGLCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEFGLCAweEZELCAweERGLCAweEFDLCAweDk4LCAweDc3LCAweDY2LCAweDQ0LCAweDMxLCAweDExLCAweDM1LAorICAgIDB4NjcsIDB4ODgsIDB4OEEsIDB4QUEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RUYsIDB4RUUsIDB4RUYsIDB4QTgsIDB4OEUsIDB4OTcsIDB4NjYsIDB4NDMsIDB4MjIsIDB4MjEsIDB4MjMsCisgICAgMHg0NSwgMHg2NywgMHg5NywgMHg3RiwgMHhGRiwgMHhFRSwgMHhFOSwgMHhFRSwgMHhFRSwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQSwgMHhBOSwgMHg5NywgMHg2NSwgMHg0NSwgMHg0NSwgMHg2NywgMHg2NiwgMHg1NSwgMHg1NCwgMHg0NCwgMHg0NCwKKyAgICAweDMzLCAweDMzLCAweDMzLCAweDMzLCAweDQ0LCAweDQ1LCAweDU2LCAweDY4LCAweDhCLCAweEIwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEVFLCAweERFLCAweEVELCAweERFLCAweEVELCAweERELCAweEQ4LCAweDc3LCAweDY1LCAweDQzLCAweDExLCAweDIyLAorICAgIDB4MzQsIDB4NjYsIDB4NzgsIDB4ODcsIDB4RUUsIDB4RUUsIDB4RUUsIDB4OUQsIDB4RUQsIDB4RTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4RkYsIDB4QUUsIDB4RUEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzEsIDB4MTEsCisgICAgMHgzNCwgMHg1NiwgMHg4OCwgMHg5OSwgMHg5QiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhERiwgMHhGRiwgMHhGRCwgMHg5QSwgMHg3NiwgMHg2NSwgMHg0MywgMHgyMSwKKyAgICAweDEyLCAweDM1LCAweDU2LCAweDY3LCAweDg5LCAweDk5LCAweEFGLCAweEFGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZFLCAweEVGLCAweERCLCAweEJBLCAweEFBLCAweDk5LCAweDc2LCAweDU1LCAweDQzLCAweDIyLAorICAgIDB4MjIsIDB4MzMsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjcsIDB4OEEsIDB4RkEsIDB4RkIsIDB4QTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NTcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjUsIDB4NTUsIDB4NTQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDMsIDB4MzMsCisgICAgMHgzMywgMHgzNCwgMHg0NCwgMHg0NCwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDU4LCAweDc3LCAweDc2LCAweDY2LCAweDU1LCAweDU0LCAweDQ0LCAweDMzLCAweDMzLCAweDIzLCAweDMzLCAweDMzLAorICAgIDB4NDUsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4NjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OUEsIDB4QTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MjIsIDB4MjMsIDB4NDUsCisgICAgMHg1NiwgMHg5OSwgMHg5RCwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRCwgMHhCQiwgMHhBQSwgMHhCQSwgMHhBOSwgMHg4NywgMHg3NywgMHg1NCwgMHgzMywgMHgyMSwgMHgxMiwgMHg0NSwKKyAgICAweDY4LCAweDhBLCAweEFBLCAweENCLCAweEZGLCAweENGLCAweEZGLCAweEZGLCAweEZFLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZFLCAweEE5LCAweDk4LCAweDg3LCAweDY1LCAweDQxLCAweDAyLCAweDQ1LAorICAgIDB4NzcsIDB4ODgsIDB4QUMsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QkYsIDB4RkMsIDB4QUIsIDB4RkIsIDB4QkEsIDB4QUIsIDB4QjgsIDB4ODgsIDB4NzYsIDB4NTIsIDB4MDEsIDB4MzUsCisgICAgMHg3OCwgMHg5OSwgMHhBQiwgMHhBQSwgMHhDRiwgMHhCQiwgMHhDRiwgMHhGQywgMHhGQywgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhCQSwgMHhDQSwgMHg5OCwgMHg3NSwgMHgyMSwgMHgzNSwgMHg3NywgMHg3NywgMHg3NiwgMHg2NSwgMHg1NCwgMHg0NCwKKyAgICAweDQ0LCAweDM0LCAweDQ0LCAweDQ0LCAweDQ1LCAweDU2LCAweDc4LCAweDg4LCAweDlBLCAweEMwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweERGLCAweENGLCAweENDLCAweEZGLCAweEFCLCAweEM5LCAweEI5LCAweDk4LCAweDk3LCAweDc1LCAweDIwLCAweDEzLAorICAgIDB4NTYsIDB4ODksIDB4ODksIDB4QUEsIDB4RkMsIDB4QkMsIDB4QUYsIDB4Q0MsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4QkIsIDB4RkIsIDB4RkYsIDB4RkIsIDB4QkEsIDB4QTgsIDB4NzcsIDB4NTQsIDB4MjEsIDB4MTEsCisgICAgMHg0NSwgMHg2NywgMHg4OCwgMHg4QSwgMHhFRiwgMHhCQiwgMHhGRiwgMHhCQiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhGQiwgMHhDQiwgMHhCOSwgMHg4OCwgMHg2NSwgMHgzMSwgMHgxMiwKKyAgICAweDIzLCAweDM1LCAweDY3LCAweDg4LCAweEFBLCAweEFDLCAweEZDLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZDLCAweEVGLCAweEZGLCAweEJCLCAweEFBLCAweEE5LCAweDc2LCAweDU1LCAweDMyLCAweDIyLAorICAgIDB4MjIsIDB4MzMsIDB4MzQsIDB4NTYsIDB4NjcsIDB4NjgsIDB4OUEsIDB4QUEsIDB4Q0QsIDB4RTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NTgsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NTUsIDB4NTQsIDB4NDQsIDB4NDQsIDB4NDMsIDB4MzMsIDB4MzMsCisgICAgMHgzMywgMHgzNCwgMHg0NCwgMHg1NSwgMHg1NSwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OCwgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDU3LCAweDc3LCAweDc2LCAweDY2LCAweDU1LCAweDU1LCAweDU0LCAweDQzLCAweDMzLCAweDIyLCAweDMzLCAweDM0LAorICAgIDB4NDUsIDB4NTUsIDB4NjYsIDB4NjcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OTksIDB4NTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QUMsIDB4OTksIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NTQsIDB4NDMsIDB4MzIsIDB4MjEsIDB4MjMsIDB4NDUsCisgICAgMHg2NiwgMHg4OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhCOSwgMHhBQSwgMHg5OCwgMHg3NywgMHg2NSwgMHg0MiwgMHgyMSwgMHgxMiwgMHg0NSwKKyAgICAweDc4LCAweDhBLCAweEJBLCAweEFBLCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEJDLCAweEJCLCAweEI5LCAweDk4LCAweDc2LCAweDMyLCAweDAxLCAweDQ2LAorICAgIDB4NzksIDB4QUIsIDB4QkIsIDB4QkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4QUEsIDB4QUEsIDB4OTksIDB4NzYsIDB4NDIsIDB4MDEsIDB4MzYsCisgICAgMHg3OSwgMHg5QSwgMHhBQiwgMHhCRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhDQywgMHhEQywgMHhCOSwgMHg3NSwgMHgxMCwgMHg0NywgMHg4OSwgMHg5OSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDU1LCAweDU1LCAweDU2LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEJFLCAweEUwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweENDLCAweEZGLCAweEZCLCAweEFCLCAweDg3LCAweDY0LCAweDEwLCAweDIzLAorICAgIDB4NjcsIDB4OTksIDB4OUEsIDB4QUQsIDB4Q0UsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RkQsIDB4RkEsIDB4QjksIDB4OTcsIDB4NjUsIDB4MjAsIDB4MTMsCisgICAgMHg1NiwgMHg3OCwgMHhBQSwgMHg5QiwgMHhGQiwgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGQywgMHhDOSwgMHhBQywgMHg5OCwgMHg4NywgMHg1NCwgMHgzMSwgMHgxMiwKKyAgICAweDIzLCAweDQ1LCAweDY3LCAweDc4LCAweDlBLCAweEFBLCAweEVCLCAweEZGLCAweEZGLCAweEUwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZFLCAweENBLCAweEZBLCAweDk5LCAweDk4LCAweDg4LCAweDY1LCAweDQ0LCAweDMyLCAweDIyLAorICAgIDB4MjIsIDB4MzMsIDB4NDUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QkIsIDB4QUIsIDB4QTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NDgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NDQsIDB4NDQsIDB4NDMsIDB4MzMsIDB4MzMsCisgICAgMHgzMywgMHgzNCwgMHg0NSwgMHg1NSwgMHg1NSwgMHg2NiwgMHg2NywgMHg3NywgMHg3OCwgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDY4LCAweDg3LCAweDc3LCAweDc3LCAweDY2LCAweDU1LCAweDU0LCAweDQzLCAweDMzLCAweDIyLCAweDIzLCAweDM0LAorICAgIDB4NDUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4ODgsIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODksIDB4NjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QUIsIDB4QkEsIDB4QUEsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NTQsIDB4MzMsIDB4MjEsIDB4MTIsIDB4NDYsCisgICAgMHg2NywgMHg4OSwgMHg5QSwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg1NCwgMHgyMSwgMHgxMSwgMHg0NSwKKyAgICAweDc4LCAweDhBLCAweDlBLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJDLCAweEFBLCAweDk5LCAweDc2LCAweDMyLCAweDAxLCAweDQ2LAorICAgIDB4NzgsIDB4OUEsIDB4QUIsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0EsIDB4RTksIDB4ODksIDB4NzYsIDB4NTIsIDB4MDEsIDB4MzUsCisgICAgMHg2OCwgMHg5OCwgMHg5QSwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBRCwgMHhDQiwgMHhBOSwgMHg3NCwgMHgxMCwgMHg0NiwgMHg4OSwgMHg5QSwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NiwKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDY2LCAweDY2LCAweDc4LCAweDg4LCAweDhBLCAweEQwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEFBLCAweEFBLCAweDg3LCAweDYzLCAweDEwLCAweDI0LAorICAgIDB4NjcsIDB4ODksIDB4QUYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkIsIDB4OUEsIDB4OTcsIDB4NjQsIDB4MjAsIDB4MTMsCisgICAgMHg2NywgMHg4OSwgMHg5QSwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5OSwgMHg4NywgMHg3NiwgMHg0MywgMHgyMSwgMHgxMiwKKyAgICAweDM0LCAweDU2LCAweDY3LCAweDg4LCAweDg5LCAweEFFLCAweENGLCAweEZELCAweEVGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEFBLCAweDg3LCAweDY2LCAweDU0LCAweDMxLCAweDEyLAorICAgIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjcsIDB4NzcsIDB4ODksIDB4QUIsIDB4QUIsIDB4Q0YsIDB4QzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NTgsIDB4ODcsIDB4ODcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NDQsIDB4NDMsIDB4MzIsIDB4MjIsCisgICAgMHgzMywgMHg0NCwgMHg1NSwgMHg1NiwgMHg2NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg3MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDY3LCAweDc2LCAweDY2LCAweDc2LCAweDY2LCAweDU1LCAweDQ0LCAweDQ0LCAweDMzLCAweDIyLCAweDIyLCAweDM0LAorICAgIDB4NTYsIDB4NjcsIDB4NzcsIDB4ODksIDB4ODgsIDB4OTksIDB4QUIsIDB4OUEsIDB4QUIsIDB4NzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OUIsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzcsIDB4NjUsIDB4NTQsIDB4NDMsIDB4MjEsIDB4MTIsIDB4NDUsCisgICAgMHg2NywgMHg5QSwgMHg5QSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRSwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGQywgMHhDQiwgMHhCQSwgMHhBQSwgMHg5OCwgMHg4NywgMHg2NSwgMHgzMSwgMHgwMiwgMHg1NiwKKyAgICAweDg5LCAweEFCLCAweENCLCAweEJDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweEFBLCAweDlBLCAweDk4LCAweDc2LCAweDQyLCAweDAxLCAweDM2LAorICAgIDB4NzksIDB4QUYsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4NzgsIDB4QTksIDB4OTgsIDB4NzYsIDB4NTIsIDB4MDEsIDB4MzUsCisgICAgMHg3OCwgMHg4RSwgMHhDQiwgMHhCRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHg4QywgMHhCQSwgMHg5OSwgMHg3NCwgMHgxMCwgMHgzNiwgMHg4OSwgMHg5QSwgMHhBOSwgMHg5OSwgMHg4OCwgMHg4NywKKyAgICAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDU2LCAweDY2LCAweDc4LCAweDg5LCAweEMwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweDhBLCAweEE5LCAweDg4LCAweDYzLCAweDEwLCAweDI0LAorICAgIDB4NjcsIDB4OEIsIDB4QkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QzksIDB4OTksIDB4NzYsIDB4NTQsIDB4MTAsIDB4MjQsCisgICAgMHg1NiwgMHg3OCwgMHg5QSwgMHhBQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEOSwgMHg4NywgMHg1NCwgMHgyMCwgMHgyMiwKKyAgICAweDQ1LCAweDY3LCAweDc3LCAweDg5LCAweEFDLCAweEFCLCAweEZCLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFELCAweEFCLCAweDg2LCAweDU0LCAweDIxLCAweDEyLAorICAgIDB4MzQsIDB4NDUsIDB4NjYsIDB4NzcsIDB4NjcsIDB4NzcsIDB4ODgsIDB4OTksIDB4OUEsIDB4OTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NTcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTQsIDB4NDMsIDB4MzIsIDB4MjMsCisgICAgMHgzMywgMHg0NCwgMHg1NSwgMHg1NSwgMHg2NiwgMHg2NywgMHg4OCwgMHg3NywgMHg3NywgMHg1MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDM1LCAweDQ0LCAweDQ1LCAweDU1LCAweDU0LCAweDQ0LCAweDQ0LCAweDQzLCAweDMzLCAweDMzLCAweDIzLCAweDQ0LAorICAgIDB4NjgsIDB4OTksIDB4QUEsIDB4QUEsIDB4Q0IsIDB4QUIsIDB4QUYsIDB4RkUsIDB4RUIsIDB4RTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NzcsIDB4NjYsIDB4NjcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NTQsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MTIsIDB4NDUsCisgICAgMHg2OCwgMHhBQSwgMHhCRSwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRSwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhFQSwgMHg5OCwgMHg4OCwgMHg4NywgMHg3NywgMHg2NSwgMHg1NSwgMHg0NCwgMHgzMiwgMHgwMiwgMHg0NiwKKyAgICAweDc4LCAweDg5LCAweEFBLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFCLCAweEFCLCAweDk5LCAweDc2LCAweDY1LCAweDQyLCAweDAxLCAweDQ1LAorICAgIDB4NzgsIDB4QUEsIDB4QUQsIDB4QUMsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RUIsIDB4QkEsIDB4QTksIDB4ODYsIDB4NDIsIDB4MDEsIDB4MzYsCisgICAgMHg3NywgMHg4QSwgMHhCQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQywgMHhCQiwgMHg5OCwgMHg3NCwgMHgxMCwgMHgzNiwgMHg3NywgMHg4OSwgMHg5OSwgMHg5OSwgMHg4OCwgMHg3NywKKyAgICAweDc2LCAweDY2LCAweDY2LCAweDU1LCAweDU2LCAweDY3LCAweDg5LCAweEFBLCAweEFCLCAweEMwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEM5LCAweDk5LCAweDk5LCAweDg4LCAweDY0LCAweDEwLCAweDI0LAorICAgIDB4NTUsIDB4NjgsIDB4ODksIDB4QkIsIDB4QUQsIDB4QkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OTcsIDB4NjUsIDB4NjUsIDB4NTQsIDB4MjAsIDB4MjMsCisgICAgMHg0NSwgMHg1NiwgMHg3NywgMHg3NywgMHg4RSwgMHhDQiwgMHhCRSwgMHhERiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQSwgMHg3NiwgMHg1MywgMHgyMSwgMHgxMywKKyAgICAweDM0LCAweDU1LCAweDQ1LCAweDU1LCAweDY3LCAweDc5LCAweEFCLCAweEZBLCAweEZCLCAweEEwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZFLCAweDg3LCAweDU0LCAweDIxLCAweDIzLAorICAgIDB4MzMsIDB4NDQsIDB4NTUsIDB4NTUsIDB4NDQsIDB4NDUsIDB4NTcsIDB4OEEsIDB4QUEsIDB4ODAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NzksIDB4OTksIDB4OTksIDB4OTcsIDB4NzcsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4MzIsIDB4MzMsCisgICAgMHgzMywgMHgzMywgMHg0NCwgMHg0NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg3NywgMHg3OCwgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDM0LCAweDU0LCAweDQ1LCAweDU1LCAweDU0LCAweDQ0LCAweDQ0LCAweDMzLCAweDMyLCAweDQzLCAweDM0LCAweDQ0LAorICAgIDB4NTYsIDB4NzcsIDB4QkIsIDB4QjYsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4QzgsIDB4Q0IsIDB4NzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4N0UsIDB4NjcsIDB4NTUsIDB4NjUsIDB4NDQsIDB4NTUsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MjMsIDB4MjMsIDB4NTcsCisgICAgMHg5OCwgMHhERCwgMHhERCwgMHhERSwgMHhFRCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhFMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhFRiwgMHhFRSwgMHg5NywgMHg3NSwgMHg1NCwgMHg0MywgMHgzMywgMHgzMywgMHgzMiwgMHgxMiwgMHg1OCwKKyAgICAweDg4LCAweEVFLCAweEFFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEVFLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweDg4LCAweDg3LCAweDY2LCAweDUzLCAweDIyLCAweDAyLCAweDU3LAorICAgIDB4OUQsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4QTksIDB4NzgsIDB4NzYsIDB4NDIsIDB4MDEsIDB4MzYsCisgICAgMHg5OSwgMHg5QSwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQiwgMHhBQSwgMHhBOCwgMHg3NSwgMHgxMCwgMHgyNiwgMHg3OSwgMHg4OCwgMHg3NywgMHg3NywgMHg2NiwgMHg2NiwKKyAgICAweDU3LCAweDc4LCAweDg4LCAweDg5LCAweDk4LCAweDlBLCAweEJCLCAweEJCLCAweERELCAweEMwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZFLCAweEVGLCAweEZGLCAweEZFLCAweEE4LCAweDc4LCAweDc2LCAweDU0LCAweDIwLCAweDIyLAorICAgIDB4NDUsIDB4NkUsIDB4OEUsIDB4RUYsIDB4RkYsIDB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RTcsIDB4NjYsIDB4NjQsIDB4MjAsIDB4MjMsCisgICAgMHgzNCwgMHg1NiwgMHg3OCwgMHg4OCwgMHhBRiwgMHhGQywgMHhGRiwgMHhGRiwgMHhBRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhFRSwgMHhERSwgMHhFRCwgMHhERSwgMHhFRCwgMHg4RCwgMHhERCwgMHhEOSwgMHhFNiwgMHg2MywgMHgyMSwgMHgyMywKKyAgICAweDQzLCAweDM0LCAweDM1LCAweDU1LCAweDY1LCAweDQ3LCAweEVFLCAweEVELCAweEVELCAweEUwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweERELCAweENELCAweERDLCAweENELCAweERELCAweENDLCAweENDLCAweENELCAweERELCAweDc2LCAweDQzLCAweDQ0LAorICAgIDB4NDQsIDB4NDMsIDB4MzQsIDB4MzMsIDB4MjIsIDB4MzMsIDB4MzUsIDB4RDgsIDB4Q0MsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NkIsIDB4NzcsIDB4QkIsIDB4QjYsIDB4OTYsIDB4NTUsIDB4NTUsIDB4NTQsIDB4NDQsIDB4NDQsIDB4MzMsIDB4NDMsCisgICAgMHgzMywgMHgzMywgMHg0NSwgMHgzNCwgMHg0NCwgMHg2OCwgMHg1NywgMHg3OCwgMHg4NiwgMHg1MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDRBLCAweEFBLCAweEFBLCAweDlBLCAweDQ0LCAweDQ0LCAweDQ1LCAweDIzLCAweDI0LCAweDIyLCAweEEzLCAweDNBLAorICAgIDB4NDQsIDB4OTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QUEsIDB4NDUsIDB4MzQsIDB4OTQsIDB4NEEsIDB4NEEsIDB4MzIsIDB4MjMsIDB4MzIsIDB4MjQsIDB4NEEsIDB4QUEsCisgICAgMHhBQSwgMHhBOSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHg0QSwgMHhBNCwgMHg0NCwgMHgyMSwgMHg0MywgMHgzMiwgMHgyMywgMHg1QSwKKyAgICAweEFBLCAweEFBLCAweDk5LCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEEwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweERELCAweERELCAweERELCAweERELCAweERELCAweDdELCAweDhELCAweDc0LCAweDIxLCAweDExLCAweDM1LCAweDdELAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RTksIDB4NjQsIDB4MzIsIDB4MDEsIDB4NTcsCisgICAgMHhFOCwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhFRSwgMHhERSwgMHhFOSwgMHg1NSwgMHgxMCwgMHgyNywgMHg5OCwgMHg2NSwgMHg0OCwgMHhBRSwgMHg5OSwgMHg4OCwKKyAgICAweDc3LCAweDg3LCAweDc5LCAweDg5LCAweEVBLCAweEVFLCAweEFFLCAweEVFLCAweEVFLCAweEUwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweENCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEI2LCAweDQ1LCAweDExLCAweDEzLAorICAgIDB4NDQsIDB4M0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QkIsIDB4QUIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4NUEsIDB4MzEsIDB4MTIsCisgICAgMHgyMywgMHgzNCwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhBQiwgMHhCQiwgMHhCQiwgMHhBQSwgMHhBQiwgMHhCQiwgMHhCQiwgMHhCNSwgMHg1NSwKKyAgICAweDY0LCAweDIyLCAweDI0LCAweDU1LCAweDMyLCAweDE0LCAweEJCLCAweEJCLCAweEJCLCAweEIwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEFBLCAweEFBLCAweEE5LCAweDlBLCAweEFBLCAweEE5LCAweDk5LCAweDlBLCAweDRBLCAweEFBLCAweEEzLCAweDMzLAorICAgIDB4MzIsIDB4MzQsIDB4MzUsIDB4NDQsIDB4NDIsIDB4MjQsIDB4QTQsIDB4QUEsIDB4QUEsIDB4QTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QUEsIDB4OUEsIDB4OTksIDB4OUEsIDB4QTksIDB4NTQsIDB4OTQsIDB4OTUsIDB4NDQsIDB4NTMsIDB4MzQsIDB4NTMsCisgICAgMHgyMywgMHgzNCwgMHgzNCwgMHg0NSwgMHgzMywgMHg0QSwgMHg5OSwgMHg5OSwgMHhBOSwgMHhBMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgfSwKKyB7CisgIHsKKyAgIHsKKyAgICAweDU3LCAweEFCLCAweDY2LCAweDUyLCAweDEyLCAweDQ0LCAweDQ1LCAweDQzLCAweDMzLCAweDQ1LCAweDc3LCAweEE2LAorICAgIDB4NzcsIDB4QTcsIDB4QTcsIDB4NjUsIDB4NzcsIDB4QkIsIDB4QjcsIDB4QkIsIDB4N0IsIDB4QjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QkIsIDB4NUIsIDB4QkIsIDB4NUIsIDB4QkIsIDB4MjEsIDB4MjIsIDB4NDUsIDB4NjIsIDB4MjYsIDB4NTYsIDB4QkIsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQSwgMHgzQSwgMHg5OSwgMHg5MywgMHgxOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHgyNCwgMHgxOSwgMHgzMywKKyAgICAweDk5LCAweDkzLCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEEwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweDc3LCAweDY3LCAweDY2LCAweDY3LCAweDc2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDY2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4MTAsIDB4NzcsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NzcsIDB4NjcsIDB4NjYsIDB4NjcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2MSwgMHg2NiwgMHg2NiwgMHg2NywgMHgwNywgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhERCwgMHhERCwgMHhENiwgMHhDRCwgMHhERCwgMHhEOSwgMHg4OCwgMHhDOSwgMHg2NCwgMHg3NiwgMHgzNCwgMHg0MiwKKyAgICAweDEyLCAweDU0LCAweDUzLCAweDM0LCAweDU0LCAweDU2LCAweDY2LCAweDc5LCAweERELCAweEQwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweDg4LCAweDc4LCAweDc3LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg3LCAweDA3LCAweDc3LCAweDc3LAorICAgIDB4MjEsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODcsIDB4ODcsIDB4ODgsIDB4ODgsIDB4ODAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QUEsIDB4OUEsIDB4OTksIDB4OUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4OTksIDB4MDEsIDB4OTksIDB4OTksCisgICAgMHg0MywgMHg5OSwgMHgzNCwgMHg5OSwgMHg5NCwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHg5OSwgMHg4OSwgMHg4OCwgMHg4OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg4OCwgMHg4MiwgMHg4OCwgMHgyMSwKKyAgICAweDgyLCAweDgyLCAweDgzLCAweDg4LCAweDgyLCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweDkwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweERELCAweERELCAweERELCAweENELCAweERELCAweERELCAweENDLCAweENELCAweERELCAweERELCAweEQ2LCAweDc0LAorICAgIDB4NTYsIDB4NjQsIDB4MjAsIDB4NTQsIDB4NDIsIDB4MzgsIDB4REQsIDB4REQsIDB4REQsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NzksIDB4ODcsIDB4OTYsIDB4NzYsIDB4NzYsIDB4NTUsIDB4NjYsIDB4NDQsIDB4NTUsIDB4NDQsIDB4NTUsIDB4MzIsCisgICAgMHgyNCwgMHg4OCwgMHg2MiwgMHg1NSwgMHg0NSwgMHg0MywgMHg0NywgMHg2NiwgMHg3NiwgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDU3LCAweDY2LCAweDY1LCAweDU0LCAweDQzLCAweDM0LCAweDMzLCAweDMzLCAweDMzLCAweDMzLCAweDQ0LCAweDQ1LAorICAgIDB4NTUsIDB4NjYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4OTgsIDB4ODgsIDB4NzksIDB4NjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4ODgsIDB4OTgsIDB4OEQsIDB4NjUsIDB4NjYsIDB4MzIsIDB4MzMsIDB4MjIsIDB4MjMsIDB4MzMsIDB4NDUsIDB4NjcsCisgICAgMHg3OCwgMHg2OCwgMHg4RCwgMHhDRCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhEMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHg4RCwgMHhDRCwgMHhEQywgMHhDNSwgMHg1NiwgMHg0NiwgMHg0NSwgMHg1NCwgMHgyMiwgMHgyMiwgMHgyMiwgMHg0NSwKKyAgICAweDU3LCAweDZDLCAweENDLCAweENELCAweERELCAweERELCAweERELCAweERDLCAweENDLCAweEQwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweENDLCAweENDLCAweENCLCAweEJDLCAweENDLCAweEM3LCAweEI1LCAweDU0LCAweDEyLCAweDMzLCAweDIyLCAweDI1LAorICAgIDB4NTYsIDB4QjYsIDB4N0IsIDB4QjcsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4QzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QkIsIDB4QUIsIDB4QkEsIDB4QUIsIDB4QkIsIDB4QTUsIDB4QTUsIDB4NTUsIDB4MjEsIDB4MkIsIDB4MzMsIDB4MjMsCisgICAgMHg0NCwgMHg1NSwgMHhBNiwgMHg1QiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQywgMHhBQiwgMHhDNiwgMHg2NiwgMHg4NywgMHg4NywgMHg3NywgMHg5OCwgMHg2NiwgMHg1NCwgMHg0MywgMHg0MywKKyAgICAweDMzLCAweDMyLCAweDMzLCAweDMzLCAweDQ0LCAweDQ1LCAweDY2LCAweDY4LCAweDc5LCAweEEwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEFCLCAweEJCLCAweEJCLCAweEJBLCAweDRCLCAweDQzLCAweDIyLCAweDIyLCAweDMyLAorICAgIDB4NDQsIDB4MzQsIDB4QTUsIDB4QTYsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QkIsIDB4QUIsIDB4QUEsIDB4QUIsIDB4QkEsIDB4QUEsIDB4QTYsIDB4NjUsIDB4NTQsIDB4NDMsIDB4MjEsIDB4MjMsCisgICAgMHgzNCwgMHgzNCwgMHg1NSwgMHg1NiwgMHg2QiwgMHhCQiwgMHhCNiwgMHhCQSwgMHhCQSwgMHhCMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhERCwgMHhDRCwgMHhEQywgMHhDRCwgMHhERCwgMHhDQywgMHhDQywgMHhDNiwgMHg2NiwgMHg0NCwgMHg0MywgMHgzMiwKKyAgICAweDIxLCAweDI1LCAweDY1LCAweDQ2LCAweDU0LCAweDhELCAweERELCAweERDLCAweEQ3LCAweEMwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEVGLCAweEVFLCAweEVGLCAweEVFLCAweEVFLCAweEVFLCAweDlBLCAweEY3LCAweDY2LCAweDU1LCAweDQzLAorICAgIDB4MzMsIDB4MjIsIDB4MjIsIDB4MzMsIDB4MzQsIDB4NzgsIDB4OTgsIDB4RUUsIDB4RkUsIDB4OTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NTcsIDB4NjcsIDB4NjYsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NDQsIDB4NTQsIDB4NDQsIDB4NDMsIDB4NDMsIDB4MzQsCisgICAgMHg0MywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NSwgMHg0NSwgMHg1NSwgMHg2NywgMHg3NywgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDc4LCAweDg4LCAweDc2LCAweDY2LCAweDU1LCAweDU0LCAweDQ0LCAweDMzLCAweDIyLCAweDIzLCAweDMzLCAweDQ0LAorICAgIDB4NTUsIDB4NjcsIDB4NjcsIDB4NzgsIDB4OTgsIDB4OTgsIDB4OTksIDB4OUEsIDB4QTksIDB4OTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OTksIDB4QUEsIDB4QUIsIDB4OTcsIDB4NjUsIDB4NTUsIDB4NDQsIDB4MzIsIDB4MjIsIDB4MjIsIDB4MzMsIDB4NDUsCisgICAgMHg2NywgMHg4OSwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGQywgMHhCQiwgMHhBOCwgMHg4OCwgMHg3NywgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMSwgMHgyMywgMHg0NiwKKyAgICAweDc3LCAweDhBLCAweEY4LCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEVFLCAweERFLCAweEVELCAweERFLCAweEU5LCAweERELCAweDc3LCAweDY1LCAweDQzLCAweDIxLCAweDEyLCAweDM0LAorICAgIDB4NTcsIDB4N0QsIDB4NzgsIDB4REUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4REUsIDB4RUUsIDB4RTcsIDB4N0QsIDB4OTYsIDB4NTQsIDB4MjIsIDB4MTEsIDB4MjQsCisgICAgMHg1NiwgMHg4NywgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhDQiwgMHhBQSwgMHg5NywgMHg2NSwgMHg0NCwgMHg0NSwgMHg3NywgMHg3NiwgMHg2NiwgMHg1NSwgMHg0NCwgMHgzMywKKyAgICAweDMzLCAweDMzLCAweDMzLCAweDMzLCAweDQ0LCAweDU1LCAweDY4LCAweDk5LCAweDlBLCAweEMwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweERELCAweERELCAweERELCAweDdELCAweERELCAweERDLCAweENDLCAweDY2LCAweDY2LCAweDQzLCAweDExLCAweDIyLAorICAgIDB4MzQsIDB4NTYsIDB4OEMsIDB4Q0QsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RUYsIDB4RkUsIDB4RUYsIDB4RkYsIDB4RUUsIDB4RTksIDB4ODgsIDB4NzYsIDB4NTQsIDB4MzEsIDB4MTEsCisgICAgMHgzNCwgMHg1NywgMHg3NywgMHg4RiwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRSwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRSwgMHhFRSwgMHhFRSwgMHhFQSwgMHhBRSwgMHhFRSwgMHhBOSwgMHhFOSwgMHg4NywgMHg2NSwgMHg0MywgMHgxMSwKKyAgICAweDIyLCAweDM1LCAweDU2LCAweDY2LCAweDg4LCAweDlBLCAweEVFLCAweEVBLCAweEVFLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEVBLCAweEZGLCAweEZCLCAweEVBLCAweDk4LCAweDc2LCAweDU1LCAweDQzLCAweDIyLAorICAgIDB4MjIsIDB4MzMsIDB4MzMsIDB4NDQsIDB4NDYsIDB4NzgsIDB4QUEsIDB4RkYsIDB4RkIsIDB4QjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NzksIDB4OTksIDB4NzcsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NTQsIDB4NDQsIDB4NDMsIDB4NDMsIDB4MzMsIDB4MzMsCisgICAgMHgzMywgMHgzNCwgMHg0NCwgMHg1NSwgMHg1NSwgMHg2NiwgMHg2NiwgMHg3OSwgMHg5OSwgMHg4MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDY4LCAweDg3LCAweDc3LCAweDY2LCAweDU1LCAweDU1LCAweDU0LCAweDQzLCAweDMyLCAweDIyLCAweDMzLCAweDM0LAorICAgIDB4NDUsIDB4NjYsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODksIDB4OTgsIDB4ODgsIDB4ODgsIDB4NjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QUEsIDB4QUIsIDB4QUIsIDB4QTksIDB4ODgsIDB4NjYsIDB4NjUsIDB4NDMsIDB4MjIsIDB4MjEsIDB4MjMsIDB4NDYsCisgICAgMHg3OCwgMHhBOSwgMHhCRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRCwgMHhGRiwgMHhGRiwgMHhCQywgMHg5OSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg0MiwgMHgyMSwgMHgxMiwgMHg0NiwKKyAgICAweDY3LCAweDk5LCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJFLCAweEZBLCAweEI5LCAweDg3LCAweDY1LCAweDMxLCAweDAyLCAweDU2LAorICAgIDB4NzksIDB4OUEsIDB4QUYsIDB4RUEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OUIsIDB4QUUsIDB4QkUsIDB4OUIsIDB4QkIsIDB4QUIsIDB4QUEsIDB4OTgsIDB4NzYsIDB4NTIsIDB4MDEsIDB4MzUsCisgICAgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQywgMHhCQSwgMHhCQiwgMHhFQSwgMHhCQSwgMHhFQSwgMHhCMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhDQywgMHhCQywgMHhBNywgMHg2NSwgMHgyMSwgMHg0NiwgMHg4OCwgMHg4NywgMHg3NywgMHg2NSwgMHg0NCwgMHg0NCwKKyAgICAweDQzLCAweDMzLCAweDQ0LCAweDQ1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweDlCLCAweEMwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweDlFLCAweDlFLCAweEE5LCAweEFCLCAweEFBLCAweEE5LCAweDlELCAweDk5LCAweDg3LCAweDY1LCAweDEwLCAweDIzLAorICAgIDB4NjgsIDB4ODgsIDB4OTgsIDB4OUEsIDB4QTksIDB4QUEsIDB4REEsIDB4QUQsIDB4QUEsIDB4OTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUYsIDB4RkYsIDB4RkMsIDB4QkIsIDB4QTksIDB4QTcsIDB4NjUsIDB4MzAsIDB4MTIsCisgICAgMHg1NiwgMHg3OCwgMHg5QSwgMHg5QSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg0MSwgMHgxMSwKKyAgICAweDI0LCAweDQ3LCAweDc3LCAweDg5LCAweEJCLCAweEVELCAweENGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweENGLCAweEZGLCAweEVGLCAweENGLCAweENFLCAweDlCLCAweEE5LCAweDg3LCAweDY1LCAweDQyLCAweDExLAorICAgIDB4MjMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NjcsIDB4OUEsIDB4QUIsIDB4Q0YsIDB4Q0MsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NjgsIDB4NzgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTQsIDB4NDQsIDB4MzMsIDB4MzMsIDB4MzIsCisgICAgMHgzMywgMHgzNCwgMHg1NSwgMHg1NSwgMHg2NiwgMHg2NiwgMHg3NywgMHg3NywgMHg4OCwgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDY4LCAweDc3LCAweDc2LCAweDY2LCAweDU1LCAweDU1LCAweDU0LCAweDQ0LCAweDMyLCAweDIyLCAweDMzLCAweDM0LAorICAgIDB4NTUsIDB4NTYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODgsIDB4OTksIDB4OTksIDB4NTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4Q0IsIDB4Q0EsIDB4QUEsIDB4QTksIDB4OTcsIDB4NzcsIDB4NjYsIDB4NTQsIDB4MzIsIDB4MjEsIDB4MTMsIDB4NDYsCisgICAgMHg3OSwgMHhBQSwgMHhBQiwgMHhCRiwgMHhDRCwgMHhGRCwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGQywgMHhGRiwgMHhCQiwgMHhBOSwgMHhBOCwgMHg4NywgMHg2NSwgMHgzMSwgMHgwMiwgMHg1NiwKKyAgICAweDg5LCAweEFCLCAweEJCLCAweEJCLCAweEJDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZCLCAweEZGLCAweENELCAweENGLCAweDk5LCAweDg3LCAweDY1LCAweDQyLCAweDAxLCAweDQ1LAorICAgIDB4NjcsIDB4OUEsIDB4QkIsIDB4QUYsIDB4QkQsIDB4QkYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RjksIDB4QTgsIDB4ODYsIDB4NDIsIDB4MDEsIDB4MzYsCisgICAgMHg3OCwgMHg4QSwgMHhCRiwgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhDRiwgMHhEQiwgMHhCQSwgMHg4NSwgMHgxMCwgMHg0NywgMHg4OSwgMHg5OSwgMHg5OSwgMHg4NywgMHg2NiwgMHg2NSwKKyAgICAweDU1LCAweDU1LCAweDU1LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweEFDLCAweENFLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEZGLCAweEJGLCAweEJCLCAweEZGLCAweDk4LCAweDYzLCAweDEwLCAweDI0LAorICAgIDB4NTksIDB4OTksIDB4QkYsIDB4RkIsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4QkIsIDB4QUYsIDB4OTcsIDB4NjUsIDB4MjAsIDB4MTMsCisgICAgMHg1NiwgMHg3OCwgMHg5OSwgMHhBQiwgMHhGRCwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQywgMHhCQiwgMHhBQSwgMHg5NywgMHg2NSwgMHgzMCwgMHgxMywKKyAgICAweDQ0LCAweDU2LCAweDg4LCAweDg5LCAweEE5LCAweEJGLCAweEZGLCAweENGLCAweEZDLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZBLCAweEJBLCAweEJBLCAweEI5LCAweDg3LCAweDY1LCAweDMyLCAweDExLAorICAgIDB4MjMsIDB4NDUsIDB4NTYsIDB4NjcsIDB4NzcsIDB4OUEsIDB4QkEsIDB4QkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NTcsIDB4NzgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NDQsIDB4NDQsIDB4NDMsIDB4MzMsIDB4MjMsCisgICAgMHgzMywgMHg0NCwgMHg0NSwgMHg1NSwgMHg1NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDY4LCAweDg3LCAweDg3LCAweDc3LCAweDY2LCAweDU1LCAweDU0LCAweDQ0LCAweDMyLCAweDIyLCAweDIzLCAweDQ0LAorICAgIDB4NDUsIDB4NTYsIDB4NjYsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4NTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OUEsIDB4QjksIDB4QTksIDB4QTgsIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTQsIDB4NDMsIDB4MjEsIDB4MTIsIDB4NDUsCisgICAgMHg2OCwgMHg4OCwgMHhBQSwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhDRiwgMHhCQSwgMHg5OCwgMHg3NywgMHg2NSwgMHgzMSwgMHgwMiwgMHg1NiwKKyAgICAweDg5LCAweEFDLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEI5LCAweDg3LCAweDc2LCAweDQyLCAweDAxLCAweDM2LAorICAgIDB4ODksIDB4QUEsIDB4QkQsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RUYsIDB4QkYsIDB4QUMsIDB4OTksIDB4ODcsIDB4NDIsIDB4MDEsIDB4MzUsCisgICAgMHg3OSwgMHhBQSwgMHhCQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhDRCwgMHhDQywgMHhCOSwgMHg3NCwgMHgxMCwgMHg0NiwgMHg4QSwgMHhBOSwgMHg5OSwgMHg5OCwgMHg3NywgMHg2NiwKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDU1LCAweDY2LCAweDY3LCAweDg5LCAweDlBLCAweEFCLCAweEQwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJCLCAweERBLCAweEE4LCAweDUzLCAweDEwLCAweDI0LAorICAgIDB4NjgsIDB4OUEsIDB4QUUsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RkIsIDB4OTgsIDB4NzQsIDB4MTAsIDB4MjMsCisgICAgMHg1NywgMHg4OSwgMHhBQiwgMHhCQywgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQiwgMHhCQSwgMHg5OCwgMHg2NSwgMHgyMCwgMHgxMywKKyAgICAweDU2LCAweDc4LCAweDg5LCAweDlBLCAweEFDLCAweEVGLCAweEZCLCAweEZGLCAweERGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJCLCAweDk5LCAweDg2LCAweDU0LCAweDIxLCAweDEyLAorICAgIDB4MzQsIDB4NDUsIDB4NTYsIDB4NjcsIDB4NjcsIDB4OTksIDB4QUIsIDB4RUIsIDB4RkYsIDB4QjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NTcsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjUsIDB4NTUsIDB4NDQsIDB4NDMsIDB4MzIsIDB4MjIsCisgICAgMHgzMywgMHg0NCwgMHg1NSwgMHg1NiwgMHg2NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwgMHg3MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDc4LCAweDg4LCAweDg4LCAweDc3LCAweDc2LCAweDY1LCAweDU0LCAweDQ0LCAweDMzLCAweDMyLCAweDEyLCAweDM0LAorICAgIDB4NDYsIDB4NzgsIDB4OTksIDB4OUEsIDB4QkEsIDB4QUMsIDB4QUIsIDB4Q0IsIDB4QUEsIDB4OTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OUEsIDB4OTgsIDB4ODgsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NjUsIDB4NTQsIDB4NDMsIDB4MjEsIDB4MTIsIDB4NDUsCisgICAgMHg2NywgMHg4QiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRCwgMHhBOSwgMHg5OSwgMHg4NywgMHg3NywgMHg1NSwgMHg0MSwgMHgwMiwgMHg0NiwKKyAgICAweDc5LCAweEFCLCAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweERCLCAweDlBLCAweEJBLCAweDk4LCAweDc2LCAweDQyLCAweDAxLCAweDM2LAorICAgIDB4NzksIDB4QkIsIDB4Q0IsIDB4RkMsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkEsIDB4OUEsIDB4QUEsIDB4ODcsIDB4NDIsIDB4MDEsIDB4MzUsCisgICAgMHg3OCwgMHhEQSwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhCQywgMHhDQywgMHhBOSwgMHg3NCwgMHgxMCwgMHgzNiwgMHg4QSwgMHhBQSwgMHhBOSwgMHg5OSwgMHg4OCwgMHg3NywKKyAgICAweDc2LCAweDY2LCAweDY1LCAweDY2LCAweDU1LCAweDY2LCAweDc4LCAweDg4LCAweEFCLCAweEMwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEFBLCAweDk3LCAweDYzLCAweDEwLCAweDI0LAorICAgIDB4NjcsIDB4ODgsIDB4OUIsIDB4RkQsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RkMsIDB4QkIsIDB4OTcsIDB4NjQsIDB4MTAsIDB4MjMsCisgICAgMHg2NywgMHg4OCwgMHhBQSwgMHhBQiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhCRCwgMHhBNywgMHg2NCwgMHgyMCwgMHgxNCwKKyAgICAweDU1LCAweDc3LCAweDc4LCAweDhBLCAweEFBLCAweEFCLCAweEZELCAweENDLCAweEJGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVBLCAweDc2LCAweDU0LCAweDIxLCAweDEyLAorICAgIDB4MzQsIDB4NDUsIDB4NTYsIDB4NjcsIDB4NzcsIDB4OEEsIDB4QUEsIDB4OTksIDB4QkEsIDB4OTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NjgsIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTQsIDB4NDMsIDB4MjIsIDB4MjMsCisgICAgMHgzNCwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3NywgMHg3NywgMHg3OCwgMHg5OSwgMHg5OSwgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDQ1LCAweDU2LCAweDY2LCAweDY1LCAweDU1LCAweDU0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQyLCAweDEyLCAweDM1LAorICAgIDB4NjgsIDB4OEUsIDB4OUEsIDB4QkMsIDB4RUIsIDB4QkIsIDB4RUIsIDB4QkIsIDB4QkUsIDB4QjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4ODcsIDB4NzcsIDB4NzYsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NTUsIDB4NTQsIDB4NDMsIDB4MzEsIDB4MTIsIDB4NDUsCisgICAgMHg1NiwgMHhBOSwgMHhFRSwgMHhERSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhBRiwgMHg5OCwgMHg5NywgMHg3OCwgMHg3NSwgMHg1NSwgMHg0NCwgMHgzMiwgMHgwMiwgMHg0NSwKKyAgICAweDY4LCAweDhFLCAweDlDLCAweEVGLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweEJBLCAweDk4LCAweDc3LCAweDY1LCAweDQyLCAweDAxLCAweDQ1LAorICAgIDB4NjksIDB4OUMsIDB4OUIsIDB4REYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4Q0EsIDB4QUEsIDB4QTgsIDB4NzYsIDB4NTIsIDB4MDEsIDB4MzUsCisgICAgMHg2NywgMHg4QSwgMHhFQSwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBOSwgMHhBQiwgMHg5OCwgMHg3NCwgMHgxMCwgMHgzNiwgMHg4OSwgMHg5OSwgMHg5OSwgMHg4OCwgMHg4NywgMHg4NywKKyAgICAweDc2LCAweDY2LCAweDY2LCAweDU1LCAweDU2LCAweDY3LCAweDc5LCAweDlCLCAweDlCLCAweEIwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEI4LCAweDg4LCAweDg3LCAweDU0LCAweDEwLCAweDI0LAorICAgIDB4NTYsIDB4NzcsIDB4ODksIDB4QkYsIDB4RkYsIDB4RUMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4RkYsIDB4RkIsIDB4REIsIDB4QjksIDB4ODYsIDB4NTMsIDB4MjAsIDB4MjMsCisgICAgMHg0NCwgMHg1NiwgMHg4OCwgMHg3OCwgMHhBQSwgMHhGRiwgMHhBQiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhCRiwgMHhGQSwgMHg5NywgMHg2NCwgMHgyMCwgMHgyMywKKyAgICAweDQ0LCAweDU1LCAweDU2LCAweDY3LCAweDc3LCAweDg5LCAweDlCLCAweEI5LCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEQ5LCAweDc1LCAweDQzLCAweDIxLCAweDIzLAorICAgIDB4MzQsIDB4NDQsIDB4NDQsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NjYsIDB4NzgsIDB4OEEsIDB4ODAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NzksIDB4ODksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NTQsIDB4NDQsIDB4NDQsIDB4NDMsIDB4MjIsIDB4MzMsCisgICAgMHgzMywgMHg0NCwgMHg0NSwgMHg0NSwgMHg2NiwgMHg2OCwgMHg3NywgMHg5OCwgMHg4OCwgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDI1LCAweDQ1LCAweDU3LCAweDQ1LCAweDQ1LCAweDU1LCAweDQzLCAweDMzLCAweDMzLCAweDMzLCAweDM0LCAweDQ0LAorICAgIDB4NTUsIDB4QkIsIDB4QkIsIDB4NkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4ODYsIDB4NzYsIDB4NzUsIDB4NTUsIDB4NTUsIDB4NjUsIDB4NzQsIDB4NDQsIDB4MzMsIDB4MzIsIDB4MTIsIDB4MzUsCisgICAgMHg2QywgMHhDQywgMHhDQywgMHhDRCwgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhEMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhFRSwgMHhERSwgMHhERCwgMHg4RSwgMHg3NiwgMHg1NSwgMHg0MywgMHg0NCwgMHgzMiwgMHgzMiwgMHgxMiwgMHg0NiwKKyAgICAweDg3LCAweDk5LCAweDlELCAweERFLCAweEVFLCAweEVFLCAweERELCAweERELCAweERELCAweEUwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZFLCAweEVGLCAweEZGLCAweEE5LCAweDk2LCAweDU1LCAweDQzLCAweDMyLCAweDAyLCAweDQ1LAorICAgIDB4ODgsIDB4RUUsIDB4RTksIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4QUYsIDB4ODksIDB4NjYsIDB4NDIsIDB4MDEsIDB4MzYsCisgICAgMHhEOSwgMHg4QSwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQSwgMHhFQSwgMHhGOSwgMHg3NCwgMHgxMCwgMHgzNSwgMHg3OSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NiwgMHg1NSwKKyAgICAweDU2LCAweDY3LCAweDc3LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEZDLCAweEVFLCAweEIwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEU5LCAweDk3LCAweEY3LCAweDY1LCAweDIwLCAweDEzLAorICAgIDB4NTYsIDB4NzksIDB4RUEsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RUUsIDB4RUUsIDB4RUQsIDB4REUsIDB4RUUsIDB4RUQsIDB4REQsIDB4REUsIDB4NzUsIDB4NjMsIDB4MTEsIDB4MjIsCisgICAgMHgzNCwgMHg0NSwgMHg2NywgMHg3OCwgMHg5RSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhFRSwgMHhERSwgMHhERCwgMHhERSwgMHhFRCwgMHhEOCwgMHhERCwgMHhERSwgMHg4NywgMHg1NCwgMHgyMCwgMHgyMywKKyAgICAweDQ2LCAweDQ2LCAweDU2LCAweDY3LCAweDc2LCAweDc5LCAweDhFLCAweEVELCAweEVELCAweEUwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEVFLCAweERFLCAweERELCAweERFLCAweERELCAweERELCAweERELCAweEQ5LCAweDk4LCAweDU0LCAweDMyLCAweDIzLAorICAgIDB4NDUsIDB4NDQsIDB4MzQsIDB4NDMsIDB4MjMsIDB4NjYsIDB4MzYsIDB4RDgsIDB4REQsIDB4OTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4N0IsIDB4N0IsIDB4QTcsIDB4NzcsIDB4NkEsIDB4NTcsIDB4NTYsIDB4NTUsIDB4NDUsIDB4NDMsIDB4MzMsIDB4MzMsCisgICAgMHgzMywgMHgzMywgMHg0NCwgMHg0MywgMHgzNSwgMHhCQiwgMHhCQSwgMHhBQSwgMHhCNywgMHg1MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDI0LCAweEEzLCAweDQ0LCAweDQ0LCAweEFBLCAweDQ5LCAweDM0LCAweDQzLCAweDI0LCAweDQyLCAweDM1LCAweEE5LAorICAgIDB4OTksIDB4NDksIDB4OTksIDB4OUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OTksIDB4MzksIDB4OTQsIDB4OTQsIDB4MzksIDB4NDMsIDB4OTIsIDB4MzMsIDB4MjksIDB4MjIsIDB4MzksIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHg4OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg0OSwgMHg0OSwgMHgzMywgMHgzNCwgMHgzMywgMHgyMSwgMHgyMywgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweDk4LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDkwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweERDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweEM2LCAweDMyLCAweDIxLCAweDEyLCAweDQ1LAorICAgIDB4QzcsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RDcsIDB4REQsIDB4NzUsIDB4NDIsIDB4MDEsIDB4MzgsCisgICAgMHhERCwgMHg3RCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhFMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhDQywgMHg4QywgMHg4NywgMHg2NCwgMHgxMCwgMHgzNywgMHg4NiwgMHg2NiwgMHg2NywgMHg2OSwgMHg3OCwgMHg3NywKKyAgICAweDc2LCAweDY2LCAweDY2LCAweDY3LCAweDY4LCAweDc3LCAweDg4LCAweENDLCAweENDLCAweEMwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEJCLCAweEFCLCAweEFBLCAweEFCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEE0LCAweDIwLCAweDIyLAorICAgIDB4NDQsIDB4QTUsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkEsIDB4QjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4NEIsIDB4MzMsIDB4MDMsCisgICAgMHgyMywgMHg0NiwgMHg0QiwgMHg1QiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhBQiwgMHhCQiwgMHhCQiwgMHhBQSwgMHhBQiwgMHhCQiwgMHhCQiwgMHhCMiwgMHg0MywKKyAgICAweDQ0LCAweDMyLCAweDEzLCAweDQ2LCAweDM0LCAweDM1LCAweEJCLCAweEJCLCAweEJCLCAweEIwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEE5LCAweDlBLCAweEFBLCAweEFBLCAweEE0LCAweDIzLAorICAgIDB4MzIsIDB4QTUsIDB4MzIsIDB4QTIsIDB4MjQsIDB4QTMsIDB4QUEsIDB4NEEsIDB4QUEsIDB4QTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QTksIDB4NTksIDB4OTksIDB4OTksIDB4OTksIDB4NTQsIDB4NDksIDB4NDUsIDB4NTUsIDB4NDUsIDB4NDMsIDB4MzksCisgICAgMHg1MiwgMHgzMywgMHg0MywgMHg0NCwgMHgyNSwgMHg1OSwgMHg1OSwgMHg5OSwgMHg1OSwgMHhBMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgfSwKKyB7CisgIHsKKyAgIHsKKyAgICAweDU4LCAweDc2LCAweDVCLCAweDUzLCAweDIxLCAweDI1LCAweDU0LCAweDQzLCAweDMzLCAweDQ4LCAweDg4LCAweDU2LAorICAgIDB4NjcsIDB4NkIsIDB4ODcsIDB4QkMsIDB4N0MsIDB4OEMsIDB4Q0MsIDB4Q0MsIDB4OEMsIDB4QjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4Q0MsIDB4Q0MsIDB4NkMsIDB4NEMsIDB4Q0MsIDB4MTIsIDB4MTIsIDB4NDUsIDB4NTMsIDB4MzUsIDB4N0MsIDB4Q0MsCisgICAgMHhDQywgMHhDQywgMHhCQiwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQSwgMHhBQSwgMHhBNCwgMHhBMSwgMHg0NCwgMHg1NSwgMHhBOSwgMHg5QSwgMHhBQSwgMHhBMiwgMHgyMiwgMHgyNCwKKyAgICAweEE1LCAweEE0LCAweDQ5LCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEEwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweDk5LCAweDg4LCAweDMzLCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDI4LCAweDg4LCAweDg4LCAweDg4LCAweDIxLAorICAgIDB4MzMsIDB4ODgsIDB4ODMsIDB4ODIsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NjYsIDB4NTYsIDB4NTUsIDB4NTYsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4MDYsIDB4NjUsIDB4NTUsIDB4NTUsCisgICAgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhFRSwgMHg5RCwgMHhBNiwgMHg5RCwgMHhEQSwgMHhEOSwgMHg5NywgMHg1NSwgMHg0MiwgMHg2NCwgMHg0MywgMHgzMiwKKyAgICAweDI0LCAweDQ0LCAweDMzLCAweDQ0LCAweDY2LCAweDU1LCAweDU4LCAweDdELCAweERELCAweEEwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweDg4LCAweDc4LCAweDc3LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDgyLCAweDA3LCAweDc3LCAweDc3LAorICAgIDB4NzIsIDB4MjcsIDB4NzcsIDB4NzgsIDB4ODcsIDB4NzcsIDB4ODcsIDB4ODgsIDB4ODgsIDB4ODAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QkIsIDB4QUIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4NDQsIDB4MDEsIDB4M0EsIDB4QUEsCisgICAgMHg0QSwgMHg0QSwgMHg0NSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg4OSwgMHg5OSwgMHg5MiwgMHgzOSwgMHgyMSwKKyAgICAweDQ5LCAweDQzLCAweDMzLCAweDk5LCAweDM0LCAweDM5LCAweDk5LCAweDk5LCAweDk5LCAweDkwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEVFLCAweEVFLCAweEVELCAweERFLCAweEVFLCAweEVELCAweERELCAweERFLCAweEVFLCAweEVFLCAweDk3LCAweDc1LAorICAgIDB4NTUsIDB4NzUsIDB4MjAsIDB4MzQsIDB4NjMsIDB4MjYsIDB4OEUsIDB4RUUsIDB4RUUsIDB4RTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NjksIDB4QjgsIDB4NzcsIDB4OEIsIDB4ODUsIDB4NTYsIDB4NTUsIDB4NDQsIDB4NjUsIDB4NDQsIDB4MzMsIDB4MzIsCisgICAgMHgyMywgMHg2NywgMHhBNCwgMHg3NCwgMHg0NSwgMHg0NCwgMHg0NSwgMHg2OCwgMHg4NiwgMHg3MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDY3LCAweDc2LCAweDY2LCAweDU0LCAweDQzLCAweDQzLCAweDMzLCAweDMzLCAweDMzLCAweDMzLCAweDQ0LCAweDQ0LAorICAgIDB4NTUsIDB4NjYsIDB4NjcsIDB4NjcsIDB4NzcsIDB4NzcsIDB4ODksIDB4ODksIDB4OTksIDB4NjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QTksIDB4OTksIDB4OTksIDB4NjYsIDB4NjYsIDB4NDMsIDB4MzMsIDB4MjIsIDB4MjIsIDB4MzMsIDB4MzQsIDB4NTcsCisgICAgMHg3OCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRSwgMHhFOSwgMHhFOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg0NCwgMHg0NCwgMHgzMiwgMHgyMiwgMHgyMiwgMHgzNCwKKyAgICAweDU2LCAweDc5LCAweDhFLCAweEVBLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEVFLCAweERFLCAweERELCAweEQ4LCAweERELCAweDc1LCAweDU0LCAweDU0LCAweDMzLCAweDQ0LCAweDMxLCAweDEzLAorICAgIDB4NDUsIDB4NjYsIDB4ODgsIDB4ODksIDB4OEUsIDB4REQsIDB4REQsIDB4REQsIDB4RUQsIDB4RTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4Q0MsIDB4QkMsIDB4QkIsIDB4QkMsIDB4Q0IsIDB4NzUsIDB4NjUsIDB4NDUsIDB4MzIsIDB4MjQsIDB4NDMsIDB4MTIsCisgICAgMHg0NiwgMHg1NCwgMHg3NywgMHhCQywgMHhDQywgMHhDQywgMHhDQiwgMHhDQiwgMHhDQiwgMHhDMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBOSwgMHg4QiwgMHg5NywgMHg1NiwgMHg4OCwgMHg3NiwgMHg3NywgMHg2NiwgMHg1NSwgMHg0NCwgMHgzMywgMHgzMywKKyAgICAweDMzLCAweDMzLCAweDMzLCAweDMzLCAweDQ1LCAweDU2LCAweDY3LCAweDhBLCAweENBLCAweEMwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweERELCAweENELCAweENDLCAweENELCAweERDLCAweENDLCAweDY4LCAweDU1LCAweDUzLCAweDIxLCAweDIzLCAweDMzLAorICAgIDB4MzMsIDB4NDUsIDB4NzcsIDB4NjcsIDB4REQsIDB4REQsIDB4REQsIDB4REMsIDB4REMsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RUUsIDB4REUsIDB4REQsIDB4REUsIDB4RTksIDB4OEQsIDB4RDgsIDB4NjcsIDB4NDQsIDB4MzIsIDB4MjIsIDB4MjIsCisgICAgMHgzMywgMHg0NCwgMHg0NiwgMHg4NywgMHhFRSwgMHhFRSwgMHhFRSwgMHhERCwgMHhERCwgMHhFMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhFRiwgMHhFRSwgMHhFRiwgMHhGRSwgMHhFRSwgMHhFOSwgMHg3OCwgMHg2NywgMHg1NCwgMHg0MywgMHgyMiwKKyAgICAweDEyLCAweDM1LCAweDUzLCAweDU1LCAweDU2LCAweDdBLCAweEZFLCAweEVFLCAweEZFLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJBLCAweEZCLCAweDg3LCAweDY2LCAweDU0LCAweDMzLAorICAgIDB4MzMsIDB4MjIsIDB4MjIsIDB4MzMsIDB4NDYsIDB4NjcsIDB4N0EsIDB4Q0YsIDB4Q0YsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NjcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NDQsIDB4NDMsIDB4NDQsIDB4MzMsIDB4MzQsCisgICAgMHg0MywgMHg0NCwgMHg0MywgMHg0NCwgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NiwgMHg4OCwgMHg3MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDc4LCAweDc3LCAweDc2LCAweDY2LCAweDU1LCAweDQ0LCAweDQ0LCAweDMzLCAweDMzLCAweDIyLCAweDMzLCAweDM0LAorICAgIDB4NDUsIDB4NjcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4OTksIDB4ODksIDB4QTksIDB4QTksIDB4NzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QTksIDB4OUIsIDB4OTksIDB4ODcsIDB4NzcsIDB4NTQsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MjIsIDB4MjMsIDB4NDUsCisgICAgMHg2NywgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRCwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NywgMHg2NSwgMHgzMiwgMHgxMSwgMHgyMywgMHg0NCwKKyAgICAweDU3LCAweDlBLCAweENFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweDg4LCAweDc3LCAweDY1LCAweDU0LCAweDMxLCAweDExLCAweDM1LAorICAgIDB4NTcsIDB4ODgsIDB4OEYsIDB4REYsIDB4RkMsIDB4OUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RUYsIDB4RUUsIDB4RUYsIDB4RkUsIDB4OTksIDB4ODcsIDB4NzcsIDB4NTQsIDB4MjIsIDB4MTEsIDB4MjQsCisgICAgMHg2NiwgMHg3NywgMHg3OCwgMHhFQSwgMHhGOSwgMHhGRiwgMHhFRSwgMHhFRSwgMHhGRSwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQiwgMHhBQSwgMHg5NywgMHg2NSwgMHg0NCwgMHg0NSwgMHg2NiwgMHg2NSwgMHg1NCwgMHg0NCwgMHg0MywgMHgzMywKKyAgICAweDMzLCAweDMzLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc4LCAweDhCLCAweEFCLCAweEIwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEVFLCAweERFLCAweEVELCAweERFLCAweDk4LCAweDhELCAweERELCAweDY3LCAweDY2LCAweDQzLCAweDExLCAweDIyLAorICAgIDB4MzQsIDB4NTcsIDB4NzcsIDB4OEUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUQsIDB4REQsIDB4RTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkIsIDB4RkYsIDB4QkIsIDB4OTgsIDB4NjYsIDB4NTQsIDB4MzEsIDB4MTEsCisgICAgMHgzNCwgMHg1NiwgMHg5OCwgMHhCRiwgMHhEQywgMHhCRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwgMHhBQSwgMHg4OCwgMHg2NiwgMHgzMiwgMHgxMSwKKyAgICAweDIzLCAweDM1LCAweDY2LCAweDc3LCAweDk5LCAweENFLCAweEZFLCAweENELCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweENBLCAweEE5LCAweDc2LCAweDU0LCAweDQyLCAweDIyLAorICAgIDB4MjIsIDB4MzMsIDB4MzQsIDB4NTUsIDB4NTYsIDB4NzcsIDB4OUIsIDB4QkYsIDB4RkYsIDB4QzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NjksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NDQsIDB4NDMsIDB4NDMsIDB4MzMsIDB4MzMsCisgICAgMHgzMywgMHgzNCwgMHg0NCwgMHg0NCwgMHg1NSwgMHg2NywgMHg3NywgMHg4OCwgMHg4OSwgMHg3MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDc5LCAweDk4LCAweDg3LCAweDc3LCAweDY2LCAweDU1LCAweDQ0LCAweDQzLCAweDMzLCAweDIyLCAweDIzLCAweDMzLAorICAgIDB4NDUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4ODksIDB4OTksIDB4OUEsIDB4QTksIDB4OTksIDB4NzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QkIsIDB4RkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4NzYsIDB4NjUsIDB4NDQsIDB4MzIsIDB4MjEsIDB4MjIsIDB4MzUsCisgICAgMHg3OSwgMHhBRSwgMHhDQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhDRiwgMHhGQSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg2NSwgMHgzMywgMHgyMSwgMHgxMiwgMHg0NCwKKyAgICAweDU3LCAweDg5LCAweEFCLCAweEJFLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweERCLCAweEE5LCAweDk5LCAweDg2LCAweDY1LCAweDQxLCAweDAyLCAweDQ1LAorICAgIDB4NzgsIDB4ODksIDB4Q0EsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUIsIDB4QTksIDB4OTgsIDB4NzYsIDB4NTIsIDB4MDEsIDB4MzUsCisgICAgMHg2OCwgMHg4OSwgMHg5RSwgMHhFRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhEQiwgMHhDQSwgMHg5OCwgMHg3NSwgMHgyMSwgMHg0NiwgMHg3NywgMHg3NiwgMHg2NiwgMHg1NCwgMHg0NCwgMHg0NCwKKyAgICAweDMzLCAweDM0LCAweDQ0LCAweDQ1LCAweDY2LCAweDc3LCAweDg5LCAweEFDLCAweENCLCAweEQwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJCLCAweDk4LCAweDc3LCAweDY1LCAweDEwLCAweDIzLAorICAgIDB4NTYsIDB4ODksIDB4QUEsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QkIsIDB4Q0EsIDB4ODcsIDB4NjUsIDB4MzAsIDB4MTIsCisgICAgMHg1NiwgMHg3OCwgMHhBOSwgMHhCQSwgMHhGRCwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRCwgMHhBQSwgMHhBOSwgMHg5NywgMHg2NCwgMHgzMSwgMHgxMiwKKyAgICAweDIzLCAweDQ1LCAweDU2LCAweDc4LCAweEE5LCAweEFDLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZDLCAweENCLCAweEE4LCAweDY1LCAweDU0LCAweDMyLCAweDEyLAorICAgIDB4MjMsIDB4MzQsIDB4NDUsIDB4NTYsIDB4NzcsIDB4ODgsIDB4QUMsIDB4REYsIDB4REYsIDB4RTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NjgsIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NTQsIDB4NDQsIDB4NDMsIDB4MzIsIDB4MjIsCisgICAgMHgzMywgMHg0NCwgMHg1NSwgMHg1NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwgMHg5OSwgMHg3MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDhBLCAweEE5LCAweDg4LCAweDg3LCAweDY2LCAweDY1LCAweDU0LCAweDQzLCAweDMzLCAweDIyLCAweDIzLCAweDMzLAorICAgIDB4NDUsIDB4NTUsIDB4NjcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4OTksIDB4NjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4Q0YsIDB4QkYsIDB4Q0EsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NTQsIDB4MzMsIDB4MjEsIDB4MTIsIDB4NDUsCisgICAgMHg3OCwgMHg4QSwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhCRSwgMHhCQSwgMHg5OSwgMHg3NywgMHg2NSwgMHgzMSwgMHgwMiwgMHg1NiwKKyAgICAweDg5LCAweDlCLCAweEJDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEJCLCAweDk3LCAweDc2LCAweDMyLCAweDAxLCAweDQ2LAorICAgIDB4ODgsIDB4OUIsIDB4QUIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkMsIDB4QTgsIDB4OTcsIDB4NDIsIDB4MDEsIDB4MzUsCisgICAgMHg3OCwgMHg5QSwgMHhCQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhEQywgMHhDQiwgMHhCOSwgMHg3NSwgMHgxMCwgMHg0NywgMHg4OSwgMHg4OSwgMHg4OCwgMHg3NiwgMHg2NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDc4LCAweDlBLCAweEFDLCAweEZFLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweENBLCAweEE5LCAweDg3LCAweDYzLCAweDEwLCAweDI0LAorICAgIDB4NjcsIDB4OEEsIDB4Q0EsIDB4RkYsIDB4RkUsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QUEsIDB4OTgsIDB4NzQsIDB4MjAsIDB4MTMsCisgICAgMHg1NywgMHg4QSwgMHg5RSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQywgMHhBOSwgMHg4NywgMHg2NSwgMHgzMCwgMHgxMywKKyAgICAweDQ0LCAweDU2LCAweDc4LCAweDlBLCAweEJFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJCLCAweDk4LCAweDY1LCAweDU0LCAweDMxLCAweDEyLAorICAgIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUMsIDB4RkMsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NjgsIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NTUsIDB4NTQsIDB4NDQsIDB4NDMsIDB4MzIsIDB4MjIsCisgICAgMHgzMywgMHg0NCwgMHg0NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHg5MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDhBLCAweDk5LCAweDg4LCAweDc3LCAweDc2LCAweDY2LCAweDU1LCAweDQzLCAweDMzLCAweDIyLCAweDIyLCAweDMzLAorICAgIDB4NDUsIDB4NjcsIDB4NzcsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4OUEsIDB4QUEsIDB4ODAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QkMsIDB4QUEsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODcsIDB4NjYsIDB4NTQsIDB4MzMsIDB4MjEsIDB4MTIsIDB4NDUsCisgICAgMHg4OSwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhFRiwgMHhGQywgMHhDQywgMHhCQSwgMHg5OCwgMHg4NywgMHg2NSwgMHgzMSwgMHgwMiwgMHg1NiwKKyAgICAweDc5LCAweEJCLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZELCAweEJBLCAweDk4LCAweDc2LCAweDQyLCAweDAxLCAweDM2LAorICAgIDB4NzgsIDB4OUEsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4QkIsIDB4QTksIDB4ODcsIDB4NDIsIDB4MDEsIDB4MzUsCisgICAgMHg3OCwgMHhBQiwgMHhGQiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhERCwgMHhFQywgMHhDOSwgMHg3NCwgMHgxMCwgMHg0NywgMHg4OSwgMHg5OSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDU1LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDg5LCAweEJDLCAweENELCAweEUwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERBLCAweDk4LCAweDYzLCAweDEwLCAweDI0LAorICAgIDB4NTgsIDB4OUEsIDB4QkYsIDB4RUYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REIsIDB4OTcsIDB4NzQsIDB4MTAsIDB4MjMsCisgICAgMHg1NywgMHg5QSwgMHhBQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQSwgMHhBOCwgMHg2NSwgMHgyMCwgMHgxMywKKyAgICAweDU2LCAweDc3LCAweDg5LCAweDlCLCAweENFLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENCLCAweDlBLCAweEFBLCAweDc2LCAweDU0LCAweDIxLCAweDEyLAorICAgIDB4MzQsIDB4NDUsIDB4NTYsIDB4NjYsIDB4NzgsIDB4OTksIDB4QUYsIDB4RUMsIDB4RUYsIDB4QjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NzgsIDB4ODgsIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjUsIDB4NTUsIDB4NTQsIDB4NDMsIDB4MjIsIDB4MjIsCisgICAgMHgzMywgMHg0NCwgMHg1NSwgMHg2NywgMHg3NywgMHg4OCwgMHg5OCwgMHg5OSwgMHhBQSwgMHg4MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDY3LCAweDc3LCAweDg2LCAweDY2LCAweDY2LCAweDY1LCAweDU0LCAweDQ0LCAweDMzLCAweDMyLCAweDEyLCAweDM0LAorICAgIDB4NTcsIDB4OTksIDB4QUMsIDB4OUEsIDB4QUMsIDB4RkIsIDB4Q0YsIDB4RUUsIDB4RUIsIDB4QTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QUEsIDB4OTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NDMsIDB4MjEsIDB4MTIsIDB4MzUsCisgICAgMHg4QSwgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGQSwgMHhEQSwgMHg5OSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NSwgMHg1MywgMHgzMiwgMHgwMiwgMHg0NSwKKyAgICAweDY3LCAweDlBLCAweENGLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEZCLCAweEJCLCAweEU5LCAweDg3LCAweDc2LCAweDQyLCAweDAxLCAweDM2LAorICAgIDB4ODksIDB4QkIsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUEsIDB4QTksIDB4NzYsIDB4NTIsIDB4MDEsIDB4MzUsCisgICAgMHg2NywgMHg4QSwgMHg5QSwgMHhDOSwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhFQywgMHhDQywgMHhBOSwgMHg3NCwgMHgxMCwgMHgzNywgMHg4OCwgMHg4OSwgMHg5OSwgMHg4OCwgMHg4NywgMHg3NiwKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDc3LCAweDc4LCAweEFBLCAweEZFLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVELCAweEJBLCAweDg3LCAweDY0LCAweDEwLCAweDI0LAorICAgIDB4NDYsIDB4NzcsIDB4QUIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4Q0YsIDB4RkYsIDB4ODgsIDB4NjQsIDB4MTAsIDB4MjQsCisgICAgMHg0NiwgMHg3OCwgMHg4OCwgMHhBQSwgMHhCRiwgMHhDQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhEQywgMHhBNywgMHg2NSwgMHgyMCwgMHgxNCwKKyAgICAweDU1LCAweDU3LCAweDc3LCAweDg4LCAweDlBLCAweEFBLCAweEJCLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEY5LCAweDk3LCAweDc2LCAweDUzLCAweDIxLCAweDEzLAorICAgIDB4MzQsIDB4NDUsIDB4NTUsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4QUEsIDB4REMsIDB4QTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OUQsIDB4QUMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4NzcsIDB4NjUsIDB4NTQsIDB4NTQsIDB4NDMsIDB4MjEsIDB4MjMsCisgICAgMHgzNCwgMHg0NSwgMHg1NSwgMHg2NiwgMHg2NywgMHg3OSwgMHg5OSwgMHg5RCwgMHhCQiwgMHg4MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDQ3LCAweDdDLCAweDY1LCAweDQ1LCAweDQ1LCAweDQ1LCAweDQ1LCAweDMzLCAweDQzLCAweDIyLCAweDIzLCAweDQ0LAorICAgIDB4NTcsIDB4NzcsIDB4Q0MsIDB4QjgsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4QzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4ODksIDB4ODgsIDB4NjcsIDB4NjgsIDB4NjcsIDB4NzYsIDB4NTUsIDB4NTUsIDB4NDMsIDB4MjEsIDB4MTIsIDB4NDYsCisgICAgMHg4RSwgMHhFQSwgMHhFRSwgMHhFRiwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhFRSwgMHhERSwgMHhEOSwgMHhEOCwgMHg4NywgMHg2NiwgMHg2NCwgMHg1NSwgMHg0NCwgMHg0MiwgMHgwMiwgMHg0NSwKKyAgICAweDY3LCAweDhELCAweERELCAweERFLCAweEVFLCAweEVFLCAweEVFLCAweEVELCAweERELCAweEUwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZBLCAweEZGLCAweENGLCAweEI3LCAweDk4LCAweDY2LCAweDU0LCAweDQyLCAweDAxLCAweDU3LAorICAgIDB4ODksIDB4RkEsIDB4RkYsIDB4RUYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QUEsIDB4ODgsIDB4NzYsIDB4NDIsIDB4MDEsIDB4MzYsCisgICAgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhCQywgMHhBQSwgMHhCOCwgMHg3NSwgMHgxMCwgMHgzNSwgMHg3OCwgMHg4OCwgMHg4NywgMHg2NiwgMHg2NiwgMHg1NSwKKyAgICAweDU1LCAweDY2LCAweDc3LCAweDc3LCAweDg4LCAweDk5LCAweDlBLCAweERCLCAweEJCLCAweEQwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZELCAweDk5LCAweDg3LCAweDY1LCAweDEwLCAweDIzLAorICAgIDB4NTYsIDB4NzgsIDB4OUUsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4RkYsIDB4RUYsIDB4RkUsIDB4RUYsIDB4RkYsIDB4RUUsIDB4RTksIDB4RTgsIDB4NjUsIDB4NTQsIDB4MjAsIDB4MjMsCisgICAgMHgzNCwgMHg2NywgMHg3QSwgMHg5OSwgMHg5RiwgMHhGOSwgMHhGRiwgMHhGRSwgMHhGRSwgMHhGMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhGRiwgMHhFRiwgMHhFRSwgMHhFRiwgMHhGRSwgMHhFRSwgMHhFOSwgMHhFRiwgMHg4NywgMHg1MywgMHgyMCwgMHgyMywKKyAgICAweDU1LCAweDU1LCAweDU2LCAweDY4LCAweDk4LCAweDhBLCAweDlGLCAweEZFLCAweEZFLCAweEYwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweDhBLCAweDc3LCAweDU0LCAweDMxLCAweDIzLAorICAgIDB4NDQsIDB4MzQsIDB4NDQsIDB4NDQsIDB4NDMsIDB4NDUsIDB4NTcsIDB4RkEsIDB4RkIsIDB4RjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4N0MsIDB4QjcsIDB4OEIsIDB4NzYsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NTQsIDB4NDQsIDB4NDMsIDB4MzMsIDB4MzIsCisgICAgMHgzMywgMHg0NCwgMHg1NCwgMHg0NCwgMHg0NCwgMHg1NywgMHg5OCwgMHg4NywgMHhDQiwgMHg1MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDQ2LCAweEFCLCAweDZBLCAweDZCLCAweDY1LCAweDU0LCAweDU0LCAweDMyLCAweDIyLCAweDMyLCAweDQzLCAweDQ0LAorICAgIDB4QTQsIDB4NkEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QjAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4NjcsIDB4NjYsIDB4NkIsIDB4NkMsIDB4NTYsIDB4QjUsIDB4NTUsIDB4MzQsIDB4MzIsIDB4MjEsIDB4MjMsIDB4NjQsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQiwgMHhDMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhDQywgMHhDQywgMHhDQywgMHhCQywgMHg3NiwgMHg1NywgMHg1NSwgMHg1NCwgMHg0MywgMHgyMSwgMHgxMiwgMHg0NiwKKyAgICAweDdDLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweEMwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweDc3LCAweDQzLCAweDIyLCAweDAyLCAweDU3LAorICAgIDB4OEQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4REQsIDB4Q0QsIDB4Q0MsIDB4Q0QsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4NjUsIDB4NDIsIDB4MDEsIDB4M0MsCisgICAgMHg3QywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhEQywgMHhEMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhFRSwgMHg4RSwgMHhEOSwgMHg3NSwgMHgxMCwgMHgzNSwgMHg3NywgMHg2NiwgMHg2OCwgMHg3NywgMHg2NiwgMHg2NSwKKyAgICAweDY2LCAweDY1LCAweDY2LCAweDY4LCAweDg4LCAweEVFLCAweEFFLCAweEVELCAweERELCAweEUwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweEQ4LCAweERELCAweDU1LCAweDIwLCAweDE0LAorICAgIDB4NTYsIDB4NEQsIDB4N0QsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RDAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4QkMsIDB4Q0MsIDB4Q0MsIDB4Q0IsIDB4QkMsIDB4QzcsIDB4NjMsIDB4MjAsIDB4MjMsCisgICAgMHg0NCwgMHg1NSwgMHg3NiwgMHg3QywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhCQiwgMHhCQiwgMHhCQSwgMHhBQiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQiwgMHhCNSwgMHhCNiwgMHgzMSwgMHgyMiwKKyAgICAweDM0LCAweDQzLCAweDM0LCAweDU0LCAweDQ1LCAweDRCLCAweEJCLCAweEJCLCAweEJCLCAweEIwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweENDLCAweEJDLCAweENCLCAweEJDLCAweENCLCAweEJCLCAweEJCLCAweEI3LCAweDY2LCAweDU1LCAweDQyLCAweDIyLAorICAgIDB4MjMsIDB4MzQsIDB4NDMsIDB4MzUsIDB4NTQsIDB4NTUsIDB4NkMsIDB4Q0IsIDB4Q0IsIDB4QzAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4Q0IsIDB4QkIsIDB4NkIsIDB4QjcsIDB4QkIsIDB4NkIsIDB4NjUsIDB4NTUsIDB4MzQsIDB4MzMsIDB4NDMsIDB4MzIsCisgICAgMHgyMywgMHgzNCwgMHg1NSwgMHg0NCwgMHg0NiwgMHhCQiwgMHhCQiwgMHhCNiwgMHhCQiwgMHhDMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgIHsKKyAgIHsKKyAgICAweDg4LCAweDc4LCAweDcxLCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDI3LCAweDcxLCAweDc3LCAweDE3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4NzcsIDB4ODgsIDB4ODcsIDB4ODgsIDB4ODAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OTksIDB4ODksIDB4ODgsIDB4ODksIDB4ODgsIDB4ODIsIDB4ODgsIDB4ODMsIDB4ODMsIDB4MTIsIDB4MjIsIDB4MzgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OCwgMHg5MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHg5OSwgMHg4OSwgMHg4OCwgMHg4OSwgMHg4OCwgMHg4OCwgMHgzOCwgMHg4OSwgMHgyMiwgMHgxMSwgMHgyOCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDk4LCAweDg4LCAweDg4LCAweDk4LCAweDk4LCAweDkwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEFBLCAweDlBLCAweDk5LCAweDlBLCAweDM5LCAweDk5LCAweDk5LCAweDMzLCAweDk5LCAweDQyLCAweDAyLCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QTksIDB4QTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4QUEsIDB4OUEsIDB4OTksIDB4OUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QTksIDB4OTIsIDB4MDEsIDB4MzQsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBOSwgMHg5OSwgMHg5QSwgMHhBOSwgMHhBOSwgMHhBMCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHgzMCwgMHg0QSwgMHhBQSwgMHg5QSwgMHhBQSwgMHhBNCwgMHg0MywgMHg0MywKKyAgICAweDM1LCAweDRBLCAweDNBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEEwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEFBLCAweDlBLCAweDk5LCAweDlBLCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweDk5LCAweDkzLCAweDExLCAweDEzLAorICAgIDB4MzQsIDB4OTksIDB4OTksIDB4OUEsIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QTksIDB4QTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4OTksIDB4ODksIDB4ODgsIDB4ODksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4ODgsIDB4ODgsIDB4MzEsIDB4MTIsCisgICAgMHg4OCwgMHgxOCwgMHg4OCwgMHg4OSwgMHg5OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHg5OCwgMHg5MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgICB7CisgICAgMHg4OCwgMHg3OCwgMHg3NywgMHg3OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3NywgMHg3NywgMHg3MSwgMHgxMSwKKyAgICAweDcyLCAweDc3LCAweDc3LCAweDc4LCAweDg3LCAweDc3LCAweDg4LCAweDg4LCAweDg4LCAweDgwLCAweDAwLCAweDAwLAorICAgfSwKKyAgIHsKKyAgICAweEFBLCAweDlBLCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDM5LCAweDkyLCAweDIxLAorICAgIDB4MTksIDB4MzksIDB4OTksIDB4OTQsIDB4OTMsIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QTAsIDB4MDAsIDB4MDAsCisgICB9LAorICAgeworICAgIDB4ODgsIDB4NzgsIDB4NzcsIDB4NzgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzcsIDB4NzIsIDB4NzcsIDB4NzIsCisgICAgMHgxNywgMHgyNywgMHg3NywgMHg3OCwgMHg4NywgMHg3MSwgMHg3OCwgMHg4NywgMHg4OCwgMHg4MCwgMHgwMCwgMHgwMCwKKyAgIH0sCisgIH0sCisgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHNob3J0X2NvZGVzX2RlZlszXVsxNV1bODhdID0geworIHsKKyAgeworICAgIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhERCwgMHhGQywgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQywgMHhDQiwgMHhCQywKKyAgICAweERGLCAweEZGLCAweEZELCAweERCLCAweEM5LCAweDY5LCAweEJDLCAweEZGLCAweEZDLCAweEZGLCAweEI5LCAweDQyLAorICAgIDB4NUEsIDB4Q0QsIDB4RkYsIDB4RkQsIDB4REMsIDB4NjIsIDB4MDMsIDB4OUIsIDB4Q0YsIDB4RkYsIDB4RkQsIDB4QzksCisgICAgMHg1MywgMHg0QSwgMHhDQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQSwgMHg5QSwgMHhCQywgMHhGRiwgMHhGRiwgMHhGQywKKyAgICAweERDLCAweEJDLCAweEJDLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweENDLCAweENELCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4REYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0QsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGQywgMHhGQywgMHhDQywgMHhDRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhEQiwgMHhBOSwgMHg5QiwKKyAgICAweENGLCAweERGLCAweEZGLCAweENCLCAweDk3LCAweDY3LCAweDlCLCAweEZGLCAweEZGLCAweERDLCAweEE3LCAweDQyLAorICAgIDB4NDcsIDB4QUQsIDB4RkYsIDB4RkYsIDB4QzksIDB4NjMsIDB4MDMsIDB4NjksIDB4QkYsIDB4RkYsIDB4RkMsIDB4QTcsCisgICAgMHg1MywgMHg0NywgMHhBQywgMHhERiwgMHhGRCwgMHhEQywgMHg5NywgMHg3NywgMHg4QywgMHhCRCwgMHhGRiwgMHhGRiwKKyAgICAweENDLCAweEFBLCAweEFCLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweENDLCAweENDLCAweENGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4REMsIDB4RkYsIDB4REYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCOSwgMHhBRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDk2LCAweDU2LCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEE2LCAweDQzLAorICAgIDB4NDcsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RjksIDB4NTMsIDB4MDMsIDB4NkEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTYsCisgICAgMHg0MywgMHg0NiwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5NiwgMHg1NiwgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEM5LCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRCwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweERELCAweERCLCAweEJDLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweDQzLAorICAgIDB4NkIsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkQsIDB4QTMsIDB4MDIsIDB4QUQsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkIsCisgICAgMHg1MiwgMHgzQSwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwgMHhBQSwgMHhDRSwgMHhGRiwgMHhERiwgMHhGRiwKKyAgICAweEZFLCAweERELCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVELCAweEZELCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4Q0YsIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4Q0MsIDB4Q0EsCisgICAgMHhGRiwgMHhDRiwgMHhGQiwgMHhBQSwgMHhBQSwgMHhDRiwgMHhDQiwgMHhGQywgMHhGRiwgMHhBQSwgMHhBOSwgMHg5OSwKKyAgICAweEFDLCAweEJGLCAweEZDLCAweEE5LCAweDk4LCAweDg4LCAweDk5LCAweEFBLCAweENGLCAweENBLCAweEE4LCAweDUzLAorICAgIDB4NTgsIDB4OUYsIDB4Q0MsIDB4Q0MsIDB4QjksIDB4NzMsIDB4MDIsIDB4NjgsIDB4QUMsIDB4Q0YsIDB4Q0EsIDB4OTgsCisgICAgMHg1MywgMHgzNywgMHg5QiwgMHhBQywgMHhGQiwgMHhBQSwgMHg5NywgMHg3OCwgMHg4QSwgMHhGQiwgMHhGRiwgMHhGQSwKKyAgICAweEJCLCAweDk5LCAweDlBLCAweEFCLCAweEZGLCAweEZGLCAweEVCLCAweEJBLCAweEFBLCAweEFDLCAweENCLCAweEZGLAorICAgIDB4QkYsIDB4QkMsIDB4QkMsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkMsIDB4RkMsIDB4RkYsIDB4RkYsIDB4Q0YsCisgICAgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkQsIDB4RkMsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGQywgMHhBQiwgMHhCQSwgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhBOSwgMHg3NywgMHg3OCwKKyAgICAweEFGLCAweEZGLCAweEZGLCAweEE4LCAweDY1LCAweDQ1LCAweDY4LCAweEZGLCAweEZDLCAweEZCLCAweDc0LCAweDMzLAorICAgIDB4MzUsIDB4N0IsIDB4RkYsIDB4RkYsIDB4QjcsIDB4NDMsIDB4MjMsIDB4NDYsIDB4QUYsIDB4RkYsIDB4Q0IsIDB4NzUsCisgICAgMHgzMywgMHgzNSwgMHg3QSwgMHhDQywgMHhGRiwgMHhGOCwgMHg2NSwgMHg0NSwgMHg2OCwgMHhBQywgMHhDRiwgMHhDQywKKyAgICAweEE4LCAweDc3LCAweDc4LCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEI5LCAweDk5LCAweEZDLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REEsIDB4RkMsIDB4RkYsCisgICAgMHhGRiwgMHhGQywgMHhGQiwgMHg5QSwgMHg5OSwgMHhCQSwgMHhGRiwgMHhGRiwgMHhGQiwgMHg5NywgMHg3NywgMHg3NywKKyAgICAweDlDLCAweENGLCAweEZDLCAweDk4LCAweDY1LCAweDQ1LCAweDY4LCAweEFGLCAweEZGLCAweEM5LCAweDc1LCAweDMzLAorICAgIDB4MzUsIDB4NzksIDB4RkYsIDB4RkIsIDB4ODYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4OUYsIDB4RkYsIDB4QzksIDB4NzUsCisgICAgMHgzMywgMHgzNSwgMHg3QiwgMHhCRiwgMHhGRiwgMHhBOCwgMHg2NSwgMHg0NSwgMHg2OCwgMHhBRiwgMHhGRiwgMHhGQSwKKyAgICAweEE4LCAweDc3LCAweDc4LCAweDlCLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweDk5LCAweEJCLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4Q0UsIDB4RkYsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkQsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QkIsIDB4QkMsIDB4RUYsCisgICAgMHhGRiwgMHhGRiwgMHhEQiwgMHg5OSwgMHg4OSwgMHhBQywgMHhERiwgMHhGRiwgMHhEQiwgMHg5NywgMHg2NiwgMHg2NywKKyAgICAweDlDLCAweEZGLCAweEVDLCAweDk3LCAweDY1LCAweDQ1LCAweDY3LCAweEFDLCAweEZGLCAweEI5LCAweDY1LCAweDMzLAorICAgIDB4MzUsIDB4NjksIDB4QkYsIDB4RkIsIDB4ODYsIDB4NDMsIDB4MzMsIDB4NDYsIDB4OUIsIDB4RUUsIDB4QjksIDB4NjUsCisgICAgMHgzMywgMHgzNSwgMHg2OSwgMHhCRSwgMHhGRCwgMHhBNywgMHg2NSwgMHg0NSwgMHg2NywgMHhBQywgMHhERiwgMHhEQiwKKyAgICAweDk3LCAweDY2LCAweDY3LCAweDlCLCAweERGLCAweEZGLCAweERDLCAweEE5LCAweDg5LCAweDlCLCAweENGLCAweEZGLAorICAgIDB4RkYsIDB4REMsIDB4QkIsIDB4QkMsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RUYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4QkIsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhBQSwgMHg5OSwgMHhBQiwgMHhGRiwgMHhGRiwgMHhGQSwgMHg5OCwgMHg3NiwgMHg2NywKKyAgICAweEFDLCAweENGLCAweEZBLCAweEE3LCAweDY0LCAweDQ1LCAweDY3LCAweDlCLCAweEZGLCAweEY4LCAweDc0LCAweDMzLAorICAgIDB4MzQsIDB4NjgsIDB4QUYsIDB4RkIsIDB4OTYsIDB4NDMsIDB4MzMsIDB4NDYsIDB4OEIsIDB4RkYsIDB4RjksIDB4NzUsCisgICAgMHg0MywgMHgzNSwgMHg2OSwgMHhCRiwgMHhDQywgMHg5OCwgMHg2NSwgMHg0NSwgMHg2NywgMHg5QSwgMHhCRiwgMHhGRiwKKyAgICAweDk4LCAweDY2LCAweDY4LCAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweDk4LCAweDg4LCAweEFGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4QkEsIDB4QkEsIDB4QkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsCisgICAgMHhGRiwgMHhBQSwgMHhGRiwgMHhGOSwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHg4OCwgMHg3RiwKKyAgICAweEFGLCAweEZBLCAweEZGLCAweEY4LCAweDc1LCAweDU1LCAweDc5LCAweEZGLCAweEZGLCAweEY5LCAweDc1LCAweDMyLAorICAgIDB4MzQsIDB4OEEsIDB4RkYsIDB4RkYsIDB4QjgsIDB4NDMsIDB4MjIsIDB4NTgsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4OTUsCisgICAgMHgzMywgMHg0NiwgMHg3QSwgMHhGRiwgMHhGQSwgMHhGRiwgMHg3NSwgMHg0NiwgMHg3OSwgMHhGQSwgMHhGRiwgMHhBRiwKKyAgICAweEY5LCAweDg5LCAweDhBLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFGLCAweEFBLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RkEsCisgICAgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkMsIDB4QkEsIDB4QUEsIDB4OTksIDB4QUEsIDB4QkQsIDB4QkIsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODksIDB4OUIsCisgICAgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg3NywgMHg3OCwgMHg5QSwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg2NiwKKyAgICAweDc4LCAweEFCLCAweEE4LCAweDc2LCAweDU1LCAweDQ1LCAweDU2LCAweDc5LCAweEE5LCAweDg3LCAweDU1LCAweDQ0LAorICAgIDB4NDQsIDB4NjcsIDB4OEEsIDB4OTgsIDB4NzUsIDB4NDQsIDB4NDQsIDB4NDUsIDB4NjgsIDB4OUEsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhBOSwgMHg3NiwgMHg1NSwgMHg0NSwgMHg1NiwgMHg3OSwgMHhBQiwgMHg5OCwKKyAgICAweDc2LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweEJBLCAweDk4LCAweDc3LCAweDc3LCAweDc4LCAweDlBLCAweENELAorICAgIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODksIDB4QUEsIDB4QkIsIDB4REQsIDB4Q0EsIDB4QTksIDB4OUEsIDB4QUIsIDB4Q0MsCisgICAgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4Q0EsIDB4QUEsIDB4QUEsIDB4QUIsIDB4Q0UsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODksIDB4OUIsCisgICAgMHhDRCwgMHhCQiwgMHg5OCwgMHg4NywgMHg3NywgMHg3OCwgMHhBQiwgMHhEQSwgMHhBOCwgMHg3NiwgMHg2NSwgMHg2NiwKKyAgICAweDc4LCAweEFDLCAweEE5LCAweDc2LCAweDU1LCAweDQ0LCAweDU2LCAweDc5LCAweEFBLCAweDk3LCAweDY1LCAweDQ0LAorICAgIDB4NDQsIDB4NjcsIDB4OUEsIDB4QTgsIDB4NzUsIDB4NDQsIDB4MzQsIDB4NDUsIDB4NzksIDB4OUEsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCOSwgMHg3NiwgMHg1NSwgMHg0NSwgMHg1NiwgMHg3OSwgMHhBQiwgMHhBOCwKKyAgICAweDc2LCAweDY1LCAweDY2LCAweDc4LCAweEJCLCAweENCLCAweEE4LCAweDc3LCAweDc3LCAweDc4LCAweEFCLCAweEJELAorICAgIDB4Q0IsIDB4QTksIDB4OTgsIDB4OTksIDB4QUEsIDB4Q0QsIDB4RkQsIDB4RkIsIDB4QUEsIDB4QUIsIDB4QUIsIDB4Q0MsCisgICAgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0QsIDB4Q0IsIDB4QUEsIDB4QUEsIDB4QUIsIDB4Q0UsIDB4RUQsIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODksIDB4QUIsCisgICAgMHhDRSwgMHhDQiwgMHg5OCwgMHg3NywgMHg3NywgMHg3OCwgMHg5QiwgMHhDQiwgMHhBOCwgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDc4LCAweEFCLCAweEE5LCAweDc2LCAweDU1LCAweDQ1LCAweDU2LCAweDc5LCAweEJBLCAweDg3LCAweDU1LCAweDQ0LAorICAgIDB4NDUsIDB4NTcsIDB4OEEsIDB4QTgsIDB4NzUsIDB4NDQsIDB4MzQsIDB4NDUsIDB4NzgsIDB4QUEsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhBOSwgMHg3NiwgMHg1NSwgMHg0NSwgMHg1NiwgMHg3OSwgMHhBQiwgMHhBOCwKKyAgICAweDc2LCAweDY1LCAweDY2LCAweDc4LCAweEFCLCAweENCLCAweDk4LCAweDc3LCAweDc3LCAweDc4LCAweDlCLCAweENELAorICAgIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODksIDB4QUIsIDB4Q0QsIDB4RUQsIDB4Q0IsIDB4QUEsIDB4QUEsIDB4QUIsIDB4Q0QsCisgICAgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0QsIDB4Q0IsIDB4QjksIDB4QUEsIDB4QkIsIDB4RkYsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODksIDB4ODksIDB4OUIsCisgICAgMHhFRiwgMHhCQiwgMHhBOCwgMHg3NywgMHg3NywgMHg3OCwgMHg5QiwgMHhGQywgMHhBOCwgMHg3NiwgMHg1NSwgMHg1NiwKKyAgICAweDc4LCAweEFCLCAweEI5LCAweDc2LCAweDU1LCAweDQ1LCAweDU2LCAweDc5LCAweEJCLCAweDk3LCAweDY1LCAweDQ0LAorICAgIDB4NDQsIDB4NTcsIDB4OEEsIDB4QTgsIDB4NzUsIDB4NDQsIDB4NDQsIDB4NDUsIDB4NjgsIDB4QUEsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg1NywgMHg5QSwgMHhCOSwgMHg3NiwgMHg1NSwgMHg0NSwgMHg1NiwgMHg3OSwgMHhCQiwgMHg5OCwKKyAgICAweDc2LCAweDU1LCAweDY2LCAweDc4LCAweEFCLCAweEZCLCAweEE4LCAweDc3LCAweDc3LCAweDc4LCAweEFCLCAweEJELAorICAgIDB4RkIsIDB4QTksIDB4ODgsIDB4ODksIDB4QUMsIDB4Q0MsIDB4QkMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsCisgICAgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUMsIDB4QUIsIDB4QTksIDB4QUEsIDB4QUIsIDB4Q0MsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4ODgsIDB4OUEsCisgICAgMHhCRCwgMHhCQSwgMHg5OCwgMHg3NywgMHg3NywgMHg3OCwgMHg5QiwgMHhDQSwgMHhBOCwgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDc4LCAweEFCLCAweEE5LCAweDc2LCAweDU1LCAweDQ1LCAweDU2LCAweDc5LCAweEJBLCAweDg3LCAweDU1LCAweDQ0LAorICAgIDB4NDUsIDB4NTcsIDB4ODksIDB4OTgsIDB4NzUsIDB4NDQsIDB4NDQsIDB4NDUsIDB4NjgsIDB4OUEsIDB4ODcsIDB4NTUsCisgICAgMHg0NCwgMHg0NSwgMHg1NywgMHg4OSwgMHhBOCwgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OSwgMHhBQiwgMHhBOCwKKyAgICAweDc2LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweENCLCAweEE4LCAweDc3LCAweDc3LCAweDc4LCAweDlCLCAweERDLAorICAgIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODksIDB4OUEsIDB4QkQsIDB4Q0IsIDB4Q0IsIDB4QTksIDB4QTksIDB4QUEsIDB4QkIsCisgICAgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyB9LAorIHsKKyAgeworICAgIDB4QUYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGQiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBOSwgMHhBRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweDk2LCAweDU2LCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEE2LCAweDMyLAorICAgIDB4MzYsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RjksIDB4NjMsIDB4MTIsIDB4NkEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OTYsCisgICAgMHgzMywgMHgzNiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5NiwgMHg1NiwgMHg5QSwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweERBLCAweDlBLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweDU2LCAweEZDLCAweENGLCAweEZGLCAweEZGLCAweEY2LCAweDMyLAorICAgIDB4MzksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4NjIsIDB4MTIsIDB4NkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjYsCisgICAgMHg0MywgMHgzNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBNiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFQSwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDk2LCAweDU2LCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEI2LCAweDQzLAorICAgIDB4MzYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4NjIsIDB4MTIsIDB4NUIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDYsCisgICAgMHg0MiwgMHgzNiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5NiwgMHg1NiwgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZBLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY4LCAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweDQzLAorICAgIDB4NUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTMsIDB4MTEsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHg2MSwgMHgzRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweDhBLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY4LCAweDUzLAorICAgIDB4NUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OTMsIDB4MTEsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsCisgICAgMHg1MSwgMHgzOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4OCwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4NzcsIDB4NjcsIDB4NzYsIDB4NjcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4NzcsIDB4NjcsIDB4NzYsIDB4NjcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4NzcsIDB4NjcsIDB4NzYsIDB4NjcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4NzcsIDB4NjcsIDB4NzYsIDB4NjcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4NzcsIDB4NjcsIDB4NzYsIDB4NjcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUMsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUMsIDB4REUsIDB4Q0IsIDB4QkEsIDB4QTksIDB4OTgsIDB4OTksIDB4QUIsCisgICAgMHhERSwgMHhCQSwgMHg5OCwgMHg3NywgMHg3NywgMHg3OCwgMHhBQiwgMHhFQSwgMHhBOCwgMHg3NiwgMHg2NSwgMHg2NiwKKyAgICAweDc5LCAweEFDLCAweEE5LCAweDg2LCAweDU0LCAweDQ0LCAweDU2LCAweDc5LCAweEFBLCAweDg3LCAweDY1LCAweDQ0LAorICAgIDB4NDUsIDB4NTcsIDB4OUEsIDB4QTksIDB4NzUsIDB4NDQsIDB4MzQsIDB4NDUsIDB4NzgsIDB4OUEsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCOSwgMHg4NiwgMHg1NSwgMHg0NSwgMHg1NiwgMHg4OSwgMHhBQywgMHhBOCwKKyAgICAweDc2LCAweDY1LCAweDY2LCAweDc4LCAweDlBLCAweENDLCAweEE4LCAweDg3LCAweDc3LCAweDg5LCAweDlCLCAweEJGLAorICAgIDB4REIsIDB4QTksIDB4OTgsIDB4OTksIDB4OUIsIDB4QkMsIDB4REYsIDB4Q0IsIDB4QUEsIDB4QjksIDB4QUIsIDB4QkIsCisgICAgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkMsIDB4Q0IsIDB4QUEsIDB4OUEsIDB4QUIsIDB4Q0UsIDB4Q0QsIDB4Q0IsIDB4OTksIDB4ODgsIDB4ODksIDB4OUIsCisgICAgMHhDRCwgMHhDQSwgMHg5OCwgMHg3NywgMHg2NywgMHg3OCwgMHg5QiwgMHhDQiwgMHhBOCwgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDc4LCAweEFCLCAweEE5LCAweDc2LCAweDU1LCAweDQ1LCAweDU2LCAweDc5LCAweEFBLCAweDg3LCAweDY1LCAweDQ0LAorICAgIDB4NDUsIDB4NTcsIDB4OEEsIDB4OTgsIDB4NjUsIDB4NDQsIDB4NDQsIDB4NDUsIDB4NzgsIDB4QUEsIDB4ODcsIDB4NTUsCisgICAgMHg0NCwgMHg0NSwgMHg1NywgMHg4QSwgMHhBOSwgMHg3NiwgMHg1NSwgMHg0NSwgMHg1NiwgMHg3OSwgMHhBQiwgMHhBOCwKKyAgICAweDc2LCAweDU1LCAweDY2LCAweDc4LCAweDlCLCAweENCLCAweEE4LCAweDc3LCAweDY3LCAweDc4LCAweDlCLCAweENELAorICAgIDB4REIsIDB4QTksIDB4ODgsIDB4ODksIDB4OUIsIDB4Q0QsIDB4REMsIDB4REIsIDB4QUEsIDB4QTksIDB4QUIsIDB4QkUsCisgICAgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkMsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsIDB4OTksIDB4ODgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhCQiwgMHg5OCwgMHg3NywgMHg3NywgMHg3OCwgMHg5QiwgMHhDQiwgMHhBOCwgMHg3NiwgMHg1NSwgMHg1NiwKKyAgICAweDc4LCAweEFCLCAweEE5LCAweDc2LCAweDU1LCAweDQ0LCAweDU2LCAweDc5LCAweEFBLCAweDg3LCAweDY1LCAweDQ0LAorICAgIDB4NDUsIDB4NTcsIDB4OEEsIDB4QTgsIDB4NzUsIDB4NDQsIDB4NDQsIDB4NDUsIDB4NjgsIDB4QUEsIDB4ODcsIDB4NTUsCisgICAgMHg0NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBOSwgMHg3NiwgMHg1NSwgMHg0NSwgMHg1NiwgMHg3OSwgMHhBQiwgMHhBOCwKKyAgICAweDc2LCAweDY1LCAweDY2LCAweDc4LCAweEFBLCAweENCLCAweDk4LCAweDc3LCAweDc3LCAweDc4LCAweDlBLCAweEJELAorICAgIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODksIDB4QUIsIDB4QkIsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OUEsIDB4QUEsIDB4QkIsCisgICAgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REYsIDB4RUMsIDB4QkEsIDB4QUEsIDB4QkQsIDB4RUYsIDB4REQsIDB4Q0IsIDB4QTksIDB4OTksIDB4OUEsIDB4QkQsCisgICAgMHhDRiwgMHhEQiwgMHg5OCwgMHg3NywgMHg3NywgMHg4OCwgMHhBQywgMHhERSwgMHhBOSwgMHg3NiwgMHg1NSwgMHg2NiwKKyAgICAweDc5LCAweDlGLCAweEI5LCAweDg2LCAweDU1LCAweDQ1LCAweDU2LCAweDg5LCAweEJCLCAweDk3LCAweDY1LCAweDQ0LAorICAgIDB4NDUsIDB4NjcsIDB4OUIsIDB4QjgsIDB4NzUsIDB4NDQsIDB4MzQsIDB4NDUsIDB4NzksIDB4QUEsIDB4OTcsIDB4NjQsCisgICAgMHg0NCwgMHg0NSwgMHg1NywgMHg5QiwgMHhDOSwgMHg4NiwgMHg1NSwgMHg0NCwgMHg1NiwgMHg3OSwgMHhCQywgMHhBOCwKKyAgICAweDc2LCAweDU1LCAweDY2LCAweDc5LCAweEJGLCAweEZDLCAweEE4LCAweDg3LCAweDc3LCAweDc4LCAweEFBLCAweEZGLAorICAgIDB4RkMsIDB4QUEsIDB4OTksIDB4OTksIDB4QUMsIDB4Q0YsIDB4RkYsIDB4Q0IsIDB4QkEsIDB4QUIsIDB4QkMsIDB4QkUsCisgICAgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkMsIDB4QkIsIDB4QkIsIDB4OUIsIDB4QkIsIDB4RkUsIDB4Q0QsIDB4Q0MsIDB4QTksIDB4OTksIDB4OTksIDB4QUMsCisgICAgMHhFRCwgMHhDQywgMHhBOCwgMHg4NywgMHg3NywgMHg4OCwgMHhBQiwgMHhDQiwgMHhBOCwgMHg3NiwgMHg1NiwgMHg2NiwKKyAgICAweDc5LCAweEJDLCAweEE5LCAweDg2LCAweDU1LCAweDQ0LCAweDU2LCAweDc5LCAweENBLCAweDk3LCAweDY1LCAweDQ0LAorICAgIDB4NDQsIDB4NjcsIDB4OEEsIDB4QTksIDB4NzUsIDB4NDQsIDB4MzQsIDB4NDUsIDB4NzksIDB4QkIsIDB4OTcsIDB4NjQsCisgICAgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCOSwgMHg4NiwgMHg1NCwgMHg0NSwgMHg1NiwgMHg4OSwgMHhCQywgMHhBOSwKKyAgICAweDc2LCAweDY2LCAweDY2LCAweDc5LCAweEFDLCAweEZDLCAweEE4LCAweDg3LCAweDc3LCAweDc5LCAweDlCLCAweERFLAorICAgIDB4REMsIDB4QTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkQsIDB4QkQsIDB4REIsIDB4QkEsIDB4QUEsIDB4QkIsIDB4Q0QsCisgICAgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyB9LAorIHsKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweDdGLCAweEZDLCAweEFGLCAweEZGLCAweEZGLCAweEY2LCAweDMyLAorICAgIDB4NkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjIsIDB4MDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHg2MywgMHg1RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhDQywgMHhDRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQSwgMHg5OSwgMHhCQiwKKyAgICAweEZGLCAweEZGLCAweEZDLCAweEJCLCAweDg2LCAweDU2LCAweDlCLCAweEZGLCAweEZGLCAweEZCLCAweEE3LCAweDQyLAorICAgIDB4MzYsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RjksIDB4NjIsIDB4MTMsIDB4NTksIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTYsCisgICAgMHgzMiwgMHg0NywgMHhBRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHg5NiwgMHg1NywgMHg5QSwgMHhDQywgMHhGRiwgMHhGRiwKKyAgICAweEZCLCAweEFBLCAweEFBLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweEJGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQiwgMHg5OSwgMHg5QiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweDg2LCAweDU2LCAweDhCLCAweEZGLCAweEZGLCAweEZGLCAweEE2LCAweDQyLAorICAgIDB4MzYsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RjksIDB4NTIsIDB4MTMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTUsCisgICAgMHgzMywgMHgzNiwgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRSwgMHg4NiwgMHg1NiwgMHg4QiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZFLCAweEE4LCAweDlBLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3NywgMHg3RiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDc1LCAweDQ1LCAweDY4LCAweENGLCAweEZGLCAweEZGLCAweEI1LCAweDQzLAorICAgIDB4MzUsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4NDMsIDB4MjMsIDB4NTcsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4QTUsCisgICAgMHgzMiwgMHgzNCwgMHg4RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweDg3LCAweDk4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVELCAweEFGLCAweEZGLCAweEZGLCAweEZGLCAweEYzLAorICAgIDB4M0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjQsIDB4MDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHg1MiwgMHgzNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OEYsIDB4RjgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHg4OCwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RiwgMHhGOCwgMHg2NywgMHg4NywKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEY4LCAweDc2LCAweDU0LCAweDc3LCAweEVGLCAweEZGLCAweEZGLCAweDg0LCAweDMzLAorICAgIDB4MzUsIDB4N0YsIDB4RkYsIDB4RjgsIDB4ODYsIDB4NTMsIDB4MjMsIDB4NTcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjUsCisgICAgMHgzMywgMHgzNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGOCwgMHg1NSwgMHg0NCwgMHg1OCwgMHhFRSwgMHhFRSwgMHhGRSwKKyAgICAweEZFLCAweDY3LCAweDg4LCAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkMsIDB4Q0MsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkMsIDB4QTksIDB4QTksIDB4Q0YsCisgICAgMHhGRiwgMHhGQywgMHhCQSwgMHg5OCwgMHg3NywgMHg4OSwgMHhCRiwgMHhGRiwgMHhCOSwgMHg4NywgMHg2NiwgMHg2NywKKyAgICAweDhBLCAweENGLCAweEJBLCAweDg3LCAweDY1LCAweDQ0LCAweDY3LCAweDlGLCAweEZCLCAweEE4LCAweDY1LCAweDQzLAorICAgIDB4NDUsIDB4NjksIDB4Q0YsIDB4RUEsIDB4NzYsIDB4NDMsIDB4MzMsIDB4NDYsIDB4OEYsIDB4RkMsIDB4QTgsIDB4NjUsCisgICAgMHg0MywgMHgzNCwgMHg2OCwgMHhBRiwgMHhGOSwgMHg5NywgMHg2NCwgMHg0NCwgMHg1NywgMHhBRiwgMHhGRiwgMHhGQSwKKyAgICAweDk3LCAweDY2LCAweDY3LCAweDlDLCAweEZGLCAweEZGLCAweEZCLCAweEE5LCAweDk5LCAweDlCLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4Q0IsIDB4Q0MsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkQsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4REMsIDB4Q0QsIDB4Q0YsIDB4RkYsCisgICAgMHhGRiwgMHhDQywgMHhDQiwgMHhBOSwgMHg5QSwgMHhCQywgMHhGRiwgMHhGRCwgMHhEQiwgMHhBOCwgMHg3NiwgMHg3OCwKKyAgICAweEFELCAweEZGLCAweERDLCAweEE4LCAweDY1LCAweDQ1LCAweDY4LCAweEJGLCAweEZFLCAweENBLCAweDc1LCAweDMzLAorICAgIDB4MzUsIDB4N0EsIDB4Q0YsIDB4RkMsIDB4QTYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4OUMsIDB4RkYsIDB4QzksIDB4NzUsCisgICAgMHgzMywgMHgzNSwgMHg3OSwgMHhDRSwgMHhGRCwgMHhCOCwgMHg2NSwgMHg0NSwgMHg2OCwgMHhBQywgMHhERiwgMHhGQywKKyAgICAweEE4LCAweDc2LCAweDc4LCAweEFCLCAweERGLCAweEZGLCAweEZELCAweEJBLCAweDk5LCAweEFCLCAweENGLCAweEZGLAorICAgIDB4RkYsIDB4RkQsIDB4REQsIDB4Q0QsIDB4REYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsCisgICAgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHg5RCwgMHhGRiwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHg3NywgMHg4QSwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweDc1LCAweDQ1LCAweDY4LCAweEZGLCAweEZGLCAweEZGLCAweDg0LCAweDMzLAorICAgIDB4MzUsIDB4OUEsIDB4RkYsIDB4RkYsIDB4RjYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NzUsCisgICAgMHgzMywgMHgzNSwgMHg3QSwgMHhGRiwgMHhGRiwgMHhGOCwgMHg2NCwgMHg0NSwgMHg2OSwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweDk3LCAweDg2LCAweDc4LCAweDlGLCAweEZGLCAweEZGLCAweEFGLCAweEZGLCAweEFGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsCisgICAgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4NzcsIDB4NjcsIDB4NzYsIDB4NjcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4NzcsIDB4NjcsIDB4NzYsIDB4NjcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RUUsIDB4REQsIDB4REQsIDB4REQsIDB4NUQsIDB4REQsIDB4NEQsIDB4REQsIDB4REQsIDB4RDYsIDB4REQsIDB4RDUsCisgICAgMHhERCwgMHhERCwgMHg1RCwgMHhERCwgMHg2RCwgMHhERCwgMHhERCwgMHhENSwgMHhERCwgMHhERCwgMHhENiwgMHhERCwKKyAgICAweERELCAweDZELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweEQ2LCAweERELCAweERELCAweEQ2LAorICAgIDB4RDUsIDB4REQsIDB4NUQsIDB4NkQsIDB4NTUsIDB4REQsIDB4MEQsIDB4NTUsIDB4NjUsIDB4REQsIDB4NUQsIDB4REQsCisgICAgMHg2NiwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhENSwgMHhENSwgMHg1RCwgMHg1RCwgMHhENiwgMHhERCwgMHhERCwKKyAgICAweERELCAweERELCAweEQ2LCAweEQ1LCAweDZELCAweDZELCAweDZELCAweEQ0LCAweDZELCAweERELCAweERELCAweERELAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4NTUsIDB4RDYsIDB4REQsIDB4REUsCisgICAgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4OUIsIDB4QTksIDB4OUIsIDB4QUMsIDB4Q0MsIDB4RkEsIDB4QkEsIDB4QkIsIDB4QTksIDB4QUEsIDB4QkYsCisgICAgMHhGRiwgMHhBQSwgMHhBQSwgMHg5OCwgMHg4OCwgMHg4OCwgMHhBRCwgMHhGOSwgMHg5OSwgMHg4OCwgMHg3NiwgMHg2NiwKKyAgICAweDc5LCAweEFBLCAweDk5LCAweDk4LCAweDc1LCAweDU0LCAweDU2LCAweDhGLCAweEZBLCAweEE5LCAweDc1LCAweDQzLAorICAgIDB4MzQsIDB4NjgsIDB4QUIsIDB4QkEsIDB4ODYsIDB4NTMsIDB4MzMsIDB4NTYsIDB4OEEsIDB4QkMsIDB4QjgsIDB4NjQsCisgICAgMHgzMywgMHg0NSwgMHg3OSwgMHhBQywgMHhDQiwgMHg4NiwgMHg1NCwgMHg1NSwgMHg2NywgMHg4QSwgMHhBQywgMHhDQSwKKyAgICAweDc2LCAweDY3LCAweDc4LCAweDg5LCAweEJCLCAweEZGLCAweEI5LCAweDc4LCAweDg4LCAweDlBLCAweEJCLCAweDlGLAorICAgIDB4RkQsIDB4RjksIDB4QUIsIDB4OUEsIDB4QUIsIDB4QUEsIDB4RkYsIDB4RkMsIDB4RkEsIDB4QUIsIDB4OTksIDB4QUEsCisgICAgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0MsIDB4QkMsIDB4QkIsIDB4QkMsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCNCwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEI0LCAweDQ0LCAweEI0LCAweDJCLCAweEJDLCAweENDLCAweENCLCAweEJCLCAweDMzLAorICAgIDB4NEIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QjQsIDB4QkIsIDB4NDQsIDB4M0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsCisgICAgMHhCMywgMHhCNCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCNCwgMHg0NCwgMHgzQiwgMHhCQiwgMHhCQiwgMHhCQiwKKyAgICAweEI0LCAweEIzLCAweEJCLCAweEJDLCAweENDLCAweENDLCAweENDLCAweENCLCAweEI0LCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0IsIDB4Q0MsIDB4Q0MsCisgICAgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4NzcsIDB4NjcsIDB4NzYsIDB4NjcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbG9uZ19jb2Rlc19kZWZbM11bMTI1XVsyMjRdID0geworIHsKKyAgeworICAgIDB4QkUsIDB4RUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsCisgICAgMHhGRSwgMHhFRCwgMHhERCwgMHhDQywgMHhERSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRCwgMHhEQywKKyAgICAweENCLCAweENCLCAweEJCLCAweENDLCAweERFLCAweEVGLCAweEZGLCAweEZFLCAweEVELCAweERDLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REMsIDB4QkIsIDB4QTksIDB4OTksIDB4OTksCisgICAgMHg5OSwgMHhBQiwgMHhDRCwgMHhFRiwgMHhGRSwgMHhFQywgMHhDQiwgMHhBOSwgMHg4OCwgMHg4NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweENELCAweEZGLCAweEZFLCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4REUsIDB4RkQsIDB4REMsIDB4QUEsIDB4ODcsIDB4NzYsIDB4NjUsIDB4NjYsIDB4NjcsIDB4ODksIDB4QkMsIDB4RUYsCisgICAgMHhERCwgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhFRCwgMHhEQywKKyAgICAweEE5LCAweDg3LCAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc5LCAweEFDLCAweERELCAweERELCAweENBLCAweDk4LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTUsIDB4NjcsIDB4OUEsIDB4QkQsIDB4REUsIDB4RUIsIDB4QTksIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg2NiwgMHg4OSwgMHhBQiwgMHhERCwgMHhFRCwgMHhDQSwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDU2LCAweDc4LCAweDlBLCAweENDLCAweERFLCAweEZDLCAweEJBLCAweDg3LCAweDc2LCAweDY1LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QkIsIDB4REQsIDB4RkUsIDB4REIsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjcsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhERiwgMHhFRiwgMHhDQiwgMHhBOSwgMHg4OCwgMHg4NywgMHg4OCwgMHg4OSwgMHhBQiwgMHhDQywgMHhFRCwKKyAgICAweEZGLCAweEVELCAweENCLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweERFLCAweEVGLCAweEZGLAorICAgIDB4RkQsIDB4REIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhEQywgMHhDQywgMHhCQywgMHhDQywgMHhEQywgMHhERSwgMHhFRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERSwKKyAgICAweERELCAweENELCAweERELCAweEVFLCAweEZGLCAweEZFLCAweERGLCAweEZGLCAweEZGLCAweEVGLCAweERELCAweERELAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4RkQsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJELCAweENELCAweENDLCAweENDLCAweENDLCAweENDLCAweENELCAweEVGLCAweEZGLCAweEZGLCAweENGLCAweEZFLAorICAgIDB4REMsIDB4REMsIDB4Q0MsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4REUsIDB4RUYsIDB4RkYsIDB4RUUsIDB4REQsIDB4Q0MsCisgICAgMHhDQiwgMHhCQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhERCwgMHhGRiwgMHhEQywgMHhERCwgMHhDQiwgMHhCQSwgMHhBOSwKKyAgICAweDk5LCAweDlBLCAweDlBLCAweEJDLCAweERGLCAweEZGLCAweEJELCAweERCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4OUEsIDB4QkMsIDB4RUYsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwKKyAgICAweENDLCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDY1LCAweDY2LCAweDY3LCAweDg4LCAweEFCLCAweENDLAorICAgIDB4Q0MsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QkMsIDB4Q0MsIDB4Q0EsCisgICAgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhDQywgMHhCQiwgMHhBOSwgMHg4NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDY3LCAweDg5LCAweEFDLCAweEJDLCAweENBLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0MsIDB4QjksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsCisgICAgMHg1NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywKKyAgICAweDg5LCAweEFCLCAweEJELCAweERGLCAweENBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDc3LCAweDg5LCAweDlBLAorICAgIDB4QkMsIDB4Q0YsIDB4REQsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkMsIDB4REQsCisgICAgMHhGRiwgMHhEQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhERiwgMHhGRiwKKyAgICAweERDLCAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENDLCAweERELCAweEZGLCAweEZGLCAweEVDLAorICAgIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4REMsIDB4REYsIDB4REYsIDB4RkYsIDB4RkQsIDB4RUUsIDB4Q0MsCisgICAgMHhCQywgMHhCQiwgMHhDQywgMHhERCwgMHhDRSwgMHhGRSwgMHhDRiwgMHhGRiwgMHhERCwgMHhERCwgMHhDRCwgMHhEQywKKyAgICAweENCLCAweEJELCAweENELCAweERELCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRCwgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhERCwgMHhFRiwgMHhGRiwgMHhERCwgMHhFRSwKKyAgICAweERELCAweENELCAweENDLCAweENDLCAweENDLCAweENELCAweERGLCAweEZGLCAweEZGLCAweERFLCAweERELCAweENDLAorICAgIDB4QkIsIDB4QkIsIDB4QkEsIDB4QkIsIDB4Q0QsIDB4REUsIDB4RkYsIDB4RkQsIDB4REQsIDB4Q0MsIDB4QkEsIDB4QUEsCisgICAgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQywgMHhERSwgMHhGRiwgMHhDRCwgMHhDQiwgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEJDLCAweERGLCAweEVELCAweENDLCAweEJBLCAweDk4LCAweDg4LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QkMsIDB4REUsIDB4Q0MsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsCisgICAgMHhDRCwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywKKyAgICAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDU1LCAweDU1LCAweDU2LCAweDY3LCAweDg5LCAweEJDLCAweENDLCAweENBLAorICAgIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4Q0MsIDB4Q0MsIDB4QjksIDB4ODcsCisgICAgMHg2NSwgMHg1NSwgMHg0NSwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQywgMHhDQywgMHhDQiwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDlCLCAweENDLCAweENDLCAweEJBLCAweDg3LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NTYsIDB4NzgsIDB4OTksIDB4QkMsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQiwgMHhDQywgMHhERCwgMHhDQiwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QiwKKyAgICAweEJDLCAweENFLCAweEVELCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDc4LCAweDg5LCAweDlBLCAweEJDLCAweERDLAorICAgIDB4RUUsIDB4REMsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QkMsIDB4Q0QsIDB4Q0YsIDB4RkUsCisgICAgMHhERCwgMHhCQiwgMHhBQSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQywgMHhDQywgMHhEQywgMHhGRiwgMHhGRSwgMHhEQywKKyAgICAweENCLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERFLCAweERGLCAweEZGLCAweEZGLCAweEVELCAweENDLAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REUsIDB4RkQsIDB4REYsIDB4RkYsIDB4RUQsIDB4REQsIDB4REMsIDB4Q0MsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4Q0QsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REYsIDB4RkYsIDB4RkYsIDB4REQsIDB4RkYsCisgICAgMHhERiwgMHhFQywgMHhDQywgMHhEQywgMHhDRCwgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhFRSwgMHhDQywgMHhDQywKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEFDLCAweENDLCAweEVGLCAweEVGLCAweEZELCAweERELCAweENDLCAweEJCLCAweEFBLAorICAgIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4REYsIDB4RkYsIDB4REQsIDB4Q0IsIDB4QkEsIDB4OTksIDB4OTgsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhCQywgMHhERCwgMHhGQywgMHhEQiwgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEJDLCAweEVELCAweEJDLCAweEJBLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDg4LCAweDlBLAorICAgIDB4QkQsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUMsIDB4Q0UsCisgICAgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg4QSwgMHhCQywgMHhEQywgMHhEQiwKKyAgICAweEE5LCAweDc2LCAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweEFBLCAweENDLCAweENDLCAweEI5LCAweDg3LAorICAgIDB4NjYsIDB4NTUsIDB4NDUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QkMsIDB4Q0MsIDB4REIsIDB4QTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QiwgMHhDQywgMHhDQywgMHhCQSwgMHg5NywgMHg2NiwgMHg1NSwgMHg1NSwKKyAgICAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweENGLCAweERDLCAweEE5LCAweDg3LCAweDY2LCAweDY1LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QUIsIDB4Q0MsIDB4RkQsIDB4Q0IsIDB4QTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhCQywgMHhDRiwgMHhGRCwgMHhDQiwgMHg5OSwgMHg4NywgMHg3NywgMHg3OCwgMHg4OSwgMHhBQSwgMHhDQywgMHhDQywKKyAgICAweEZGLCAweERDLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDk5LCAweDlBLCAweEJDLCAweERELCAweENGLCAweEZFLAorICAgIDB4REQsIDB4QkIsIDB4QUEsIDB4QTksIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkQsIDB4REMsIDB4RkYsIDB4RkYsIDB4REQsCisgICAgMHhCQywgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhGRSwgMHhDRiwgMHhGRiwgMHhGRCwgMHhGRCwgMHhERCwKKyAgICAweERDLCAweENDLCAweENDLCAweERELCAweERFLCAweEZFLCAweENGLCAweEZGLCAweERELCAweENELCAweERELCAweENDLAorICAgIDB4Q0QsIDB4Q0MsIDB4Q0QsIDB4Q0QsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJGLCAweEVFLCAweERELCAweERELCAweENELCAweERELCAweERELCAweEVGLCAweEZGLCAweEZGLCAweERFLCAweEZGLAorICAgIDB4RkQsIDB4RUQsIDB4REQsIDB4Q0MsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUYsIDB4REQsCisgICAgMHhDQywgMHhDQiwgMHhCQiwgMHhDQywgMHhERSwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRCwgMHhEQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweENELCAweERGLCAweEZGLCAweEZGLCAweERDLCAweEJBLCAweEE5LCAweDk5LCAweDg5LAorICAgIDB4OTksIDB4QUIsIDB4Q0QsIDB4RkYsIDB4RkQsIDB4REQsIDB4Q0EsIDB4QTksIDB4ODgsIDB4ODcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhDRCwgMHhGRiwgMHhERSwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweERGLCAweEZFLCAweERDLCAweEE5LCAweDg3LCAweDc2LCAweDY1LCAweDU2LCAweDY3LCAweDg5LCAweEFDLCAweEVGLAorICAgIDB4RUQsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4RUQsIDB4REIsCisgICAgMHhBOSwgMHg3NiwgMHg2NSwgMHg1NCwgMHg1NSwgMHg1NiwgMHg3OSwgMHhBQiwgMHhDRSwgMHhERCwgMHhCQSwgMHg4NywKKyAgICAweDY2LCAweDU0LCAweDQ0LCAweDU1LCAweDY3LCAweDlBLCAweEJELCAweERELCAweERCLCAweEE5LCAweDg2LCAweDY1LAorICAgIDB4NTQsIDB4NTUsIDB4NjYsIDB4NzksIDB4QUIsIDB4Q0QsIDB4REQsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg1NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhERiwgMHhGQywgMHhCOSwgMHg4NywgMHg2NiwgMHg2NSwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEJDLCAweERELCAweEZGLCAweERDLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REYsIDB4RkYsIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODcsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkMsIDB4RUQsCisgICAgMHhGRiwgMHhGRCwgMHhDQiwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQiwgMHhCQywgMHhERiwgMHhFRiwgMHhGRiwKKyAgICAweEVELCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweENDLCAweENELCAweEVELCAweEZGLCAweEZGLCAweEZELAorICAgIDB4REMsIDB4Q0IsIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUQsCisgICAgMHhERSwgMHhERCwgMHhERSwgMHhERCwgMHhERiwgMHhGRiwgMHhCRiwgMHhGRiwgMHhFRiwgMHhERiwgMHhFRCwgMHhEQywKKyAgICAweERELCAweERELCAweERFLCAweEVELCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhCQywgMHhEQywKKyAgICAweENDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENELCAweERELCAweEJDLCAweENCLCAweEJBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4Q0QsIDB4REIsIDB4Q0IsIDB4QUEsIDB4QTksIDB4OTgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDQywgMHhCQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg5LCAweDlBLCAweEJCLCAweEJBLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4OUEsIDB4QkIsIDB4QUIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwKKyAgICAweEFBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDg4LCAweDlBLCAweEFBLCAweEE5LAorICAgIDB4ODgsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUEsIDB4QUEsIDB4OTgsIDB4ODcsCisgICAgMHg2NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDU2LCAweDY2LCAweDc4LCAweDg5LCAweEFBLCAweEFBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QUEsIDB4QTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg3OCwgMHg5OSwgMHhBQSwgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweEFCLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDg5LCAweEFBLCAweEJBLAorICAgIDB4QkMsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QkMsIDB4Q0IsCisgICAgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQiwgMHhDQywgMHhDQiwgMHhCQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENDLCAweEJELCAweERELCAweENCLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REMsIDB4QkQsIDB4Q0MsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4OUEsIDB4OUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0QsIDB4QkIsIDB4Q0MsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhEQywgMHhCQywgMHhCQiwgMHhBQSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEJCLCAweENELCAweENBLCAweEJCLCAweEFBLCAweDk5LCAweDk4LAorICAgIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0IsIDB4QUIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4NzcsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhCQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEJBLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDc2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LAorICAgIDB4QUEsIDB4QUEsIDB4QTksIDB4OTgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QUEsCisgICAgMHhBQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhBOSwgMHhBOSwKKyAgICAweDg4LCAweDc2LCAweDY2LCAweDY1LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEFBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4OTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsCisgICAgMHg2NSwgMHg2NiwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBOSwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4NzgsIDB4ODksIDB4QUEsIDB4QUIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQSwgMHhBQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHg5QSwgMHhBQSwKKyAgICAweEJCLCAweEJBLCAweDk5LCAweDg4LCAweDg3LCAweDc4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEFCLCAweENCLAorICAgIDB4QUEsIDB4OTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4QkEsIDB4Q0MsIDB4Q0IsIDB4QUEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhCRCwgMHhEQywgMHhDQywgMHhCQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERCLCAweEJELCAweENDLCAweEJBLCAweEFBLCAweEE5LCAweDk5LAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEJCLCAweEFBLCAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENDLCAweEJCLCAweERDLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4OTksIDB4OUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4REQsIDB4QkMsIDB4QkIsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhDQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg5LCAweDk5LCAweEFCLCAweEJCLCAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg3LCAweDc3LAorICAgIDB4NzgsIDB4ODgsIDB4OTksIDB4QUIsIDB4QkEsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhBQSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3NywgMHg4OSwKKyAgICAweDlBLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDc2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LCAweEFBLAorICAgIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4OTksIDB4OTksIDB4OTksCisgICAgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHg5OSwgMHg5OSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweDk5LCAweEE5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OTksIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHg5QSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDc4LCAweDg5LCAweEE5LCAweEFBLCAweDk5LCAweDg4LCAweDc3LCAweDc2LCAweDY2LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4OUEsIDB4QUEsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4OUEsIDB4QkEsCisgICAgMHhCQiwgMHhBQSwgMHg5OCwgMHg4OCwgMHg4NywgMHg3NywgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhBQiwgMHhCQiwKKyAgICAweEE5LCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJCLCAweENDLCAweEJCLCAweEFBLAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkMsIDB4REMsIDB4QkIsIDB4QkEsIDB4QUEsCisgICAgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDQiwgMHhCQywgMHhDQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwKKyAgICAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhCQiwgMHhDQywKKyAgICAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERDLCAweEJDLCAweEJCLCAweEFBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QkIsIDB4QkMsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTgsCisgICAgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQiwgMHhBQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg3OCwKKyAgICAweDg4LCAweDg4LCAweDlBLCAweEFCLCAweEJBLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4OUEsIDB4QkIsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NjYsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHg5QSwgMHhBQSwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBQSwKKyAgICAweEFBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDg4LCAweDlBLCAweDk5LCAweEE5LAorICAgIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjUsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QTksIDB4OUEsIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg2NSwgMHg1NSwgMHg2NiwgMHg2NywgMHg4OCwgMHg5QSwgMHg5OSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDY2LCAweDY2LCAweDc4LCAweDg5LCAweEE5LCAweEFBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4OUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg3OCwgMHg5OSwgMHhBQSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFBLCAweEFBLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweDlBLCAweEJBLAorICAgIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QUIsIDB4QkIsCisgICAgMHhBQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQiwgMHhDRCwgMHhDQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweEJELCAweERDLCAweENCLCAweEJBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4REIsIDB4QkMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4OUEsIDB4OTksCisgICAgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQiwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUMsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4REQsIDB4Q0MsIDB4REMsCisgICAgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhFRCwgMHhCQywgMHhDQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENELCAweENCLCAweENCLCAweEFBLCAweDk5LCAweDk4LAorICAgIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QkIsIDB4Q0MsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4NzgsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQywgMHhCQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweEFBLCAweEJCLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDc2LCAweDY2LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUEsIDB4QkEsIDB4QTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsCisgICAgMHhBQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBQSwgMHhBOSwKKyAgICAweDg4LCAweDc2LCAweDY2LCAweDU1LCAweDU2LCAweDY2LCAweDc4LCAweDg5LCAweEFBLCAweEFBLCAweDk4LCAweDg3LAorICAgIDB4NjYsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsCisgICAgMHg1NSwgMHg1NiwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQSwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEFBLCAweEE5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LAorICAgIDB4NzgsIDB4OTksIDB4QUEsIDB4QUIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQSwgMHhBQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHg5QSwgMHhCQSwKKyAgICAweEJDLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDc4LCAweDg4LCAweDg5LCAweDlBLCAweEJCLCAweEJDLCAweENCLAorICAgIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0IsIDB4REQsIDB4Q0IsIDB4QkEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhDRCwgMHhFRCwgMHhDQiwgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweERDLCAweEJELCAweERDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJGLCAweEVFLCAweERELCAweERELCAweERELCAweERFLCAweEVFLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLAorICAgIDB4RkUsIDB4RUQsIDB4REQsIDB4REQsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkUsIDB4REQsCisgICAgMHhDQywgMHhDQiwgMHhCQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRSwgMHhEQywgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweEFCLCAweEJDLCAweERELCAweEZGLCAweEZGLCAweEVFLCAweERELCAweEJCLCAweEE5LCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4QkMsIDB4REUsIDB4RkYsIDB4RkQsIDB4REMsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQywgMHhERiwgMHhGRiwgMHhERCwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg3OCwgMHg4QSwgMHhCQywKKyAgICAweEVGLCAweEZELCAweERDLCAweEI5LCAweDg3LCAweDY2LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweENELCAweEZGLAorICAgIDB4REQsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDUsIDB4NTYsIDB4NzgsIDB4QUIsIDB4REUsIDB4RkQsIDB4REIsCisgICAgMHhBOSwgMHg3NiwgMHg1NSwgMHg0NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhCQywgMHhFRiwgMHhFRCwgMHhCQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweDlCLCAweENELCAweEVFLCAweERDLCAweEE5LCAweDg2LCAweDU1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QkMsIDB4REQsIDB4RUUsIDB4Q0IsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHhBQiwgMHhDRSwgMHhFRiwgMHhGRCwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDlBLCAweENELCAweEVFLCAweEZGLCAweERDLCAweEJBLCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDlBLCAweEJDLAorICAgIDB4REYsIDB4RUYsIDB4RkYsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkMsIDB4Q0QsIDB4RUYsCisgICAgMHhGRiwgMHhGRSwgMHhEQywgMHhCQSwgMHhBOSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhFRiwgMHhFRiwgMHhGRiwKKyAgICAweEZFLCAweERDLCAweENCLCAweEJCLCAweEJCLCAweEJDLCAweERELCAweEVGLCAweEZFLCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsCisgICAgMHhFRiwgMHhFRSwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRCwKKyAgICAweERFLCAweEVFLCAweEVGLCAweEVGLCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBRCwgMHhDRCwgMHhDQiwgMHhCQywgMHhDQiwgMHhDQywgMHhDRCwgMHhERCwgMHhERSwgMHhFRiwgMHhCRCwgMHhERSwKKyAgICAweERELCAweENDLCAweENDLCAweENDLCAweERDLCAweERELCAweEZGLCAweEZGLCAweEZGLCAweERELCAweERELCAweENCLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4REQsIDB4RUYsIDB4RUYsIDB4REQsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QUEsCisgICAgMHhBOSwgMHhBQSwgMHhCQiwgMHhDQywgMHhGRiwgMHhGRSwgMHhDRCwgMHhDQywgMHhBQSwgMHg5OSwgMHg5OCwgMHg4OCwKKyAgICAweDk5LCAweEFCLCAweENFLCAweEZFLCAweENDLCAweENCLCAweEJBLCAweDk4LCAweDg4LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4RkUsIDB4Q0QsIDB4QkIsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUMsCisgICAgMHhERSwgMHhEQywgMHhEQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NywgMHg4QSwgMHhCQywgMHhGRCwKKyAgICAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlCLCAweENELCAweERDLCAweENCLAorICAgIDB4OTksIDB4NzYsIDB4NTUsIDB4NDQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4REQsIDB4Q0MsIDB4QkEsIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhEQywgMHhDQiwgMHhBOCwgMHg3NiwgMHg2NSwKKyAgICAweDU0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweERDLCAweENELCAweEJBLCAweDk4LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4Q0QsIDB4RUMsIDB4QjksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5QSwgMHhCQiwgMHhEQywgMHhERSwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHhBQiwKKyAgICAweENELCAweENFLCAweEZELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweENDLCAweERELAorICAgIDB4RUYsIDB4RkQsIDB4REIsIDB4QUEsIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REQsIDB4REYsIDB4RkQsCisgICAgMHhGRCwgMHhDQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhERCwgMHhGQywgMHhFRiwgMHhFRiwgMHhFRCwKKyAgICAweERELCAweENDLCAweEJDLCAweEJDLCAweENDLCAweEVELCAweEVFLCAweERGLCAweEZGLCAweEZGLCAweEZELCAweEVELAorICAgIDB4REMsIDB4REMsIDB4REQsIDB4REQsIDB4REQsIDB4RUQsIDB4QkUsIDB4REQsIDB4REQsIDB4REQsIDB4REMsIDB4REMsCisgICAgMHhDRCwgMHhDQywgMHhDQywgMHhERCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUYsIDB4RkYsIDB4REQsIDB4RkUsCisgICAgMHhERCwgMHhDQywgMHhDQywgMHhDQiwgMHhDQywgMHhERCwgMHhERSwgMHhGRiwgMHhGRiwgMHhERSwgMHhERCwgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENELCAweERFLCAweEZGLCAweEZELCAweERELCAweENCLCAweEFBLCAweEE5LAorICAgIDB4OTksIDB4OTksIDB4QUIsIDB4QkMsIDB4RUYsIDB4RkYsIDB4Q0QsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhCQywgMHhERSwgMHhFQywgMHhDQiwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEJDLCAweEVFLCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4RUMsIDB4Q0EsIDB4OTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUIsIDB4REQsCisgICAgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQywgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweEFCLCAweENELCAweENCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTUsIDB4NDUsIDB4NTYsIDB4NjcsIDB4OEEsIDB4QkMsIDB4Q0MsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg3OSwgMHhBQiwgMHhDQywgMHhDQywgMHhCOSwgMHg4NywgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERELCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QUIsIDB4Q0MsIDB4REQsIDB4Q0IsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjcsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhERSwgMHhERCwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg4OCwgMHg4OSwgMHhBQSwgMHhCQywgMHhERCwKKyAgICAweEVGLCAweERDLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweERELCAweERGLCAweEZGLAorICAgIDB4REMsIDB4Q0IsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4RUQsIDB4RkYsIDB4RkUsIDB4REMsCisgICAgMHhDQywgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhFRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhEQywKKyAgICAweENDLCAweENDLCAweENELCAweERFLCAweEVFLCAweEZFLCAweERGLCAweEZGLCAweEZFLCAweEVELCAweERELCAweERDLAorICAgIDB4Q0QsIDB4REQsIDB4REQsIDB4RUUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJFLCAweERELCAweENDLCAweENDLCAweENDLCAweENDLCAweENELCAweERELCAweEVGLCAweEVGLCAweENELCAweEZELAorICAgIDB4RUQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RUUsIDB4RkYsIDB4RkYsIDB4REUsIDB4REMsIDB4Q0IsCisgICAgMHhCQiwgMHhCQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhERCwgMHhGRiwgMHhGRCwgMHhERCwgMHhDQiwgMHhBQSwgMHhBOSwKKyAgICAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweERFLCAweEZFLCAweENELCAweENCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4QUEsIDB4QkQsIDB4RUYsIDB4REMsIDB4REMsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHhDRCwgMHhGRCwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweENELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU2LCAweDY3LCAweDg5LCAweEFDLCAweERELAorICAgIDB4Q0MsIDB4QjksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4Q0MsIDB4Q0EsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NCwgMHg1NSwgMHg2NywgMHg3OSwgMHhBQiwgMHhERCwgMHhDQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDY3LCAweDhBLCAweEJDLCAweENDLCAweENCLCAweDk4LCAweDc2LCAweDU1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4Q0MsIDB4QkEsIDB4OTcsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDRCwgMHhEQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFCLCAweERDLCAweERELCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REQsIDB4RUQsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4ODgsIDB4ODksIDB4OUIsIDB4QkMsIDB4REQsCisgICAgMHhERSwgMHhEQywgMHhCQiwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQiwgMHhCQywgMHhDRSwgMHhDRiwgMHhGRSwKKyAgICAweERDLCAweENCLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweERELCAweEVELCAweEZGLCAweEVFLCAweEVELAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0UsIDB4RUUsIDB4REYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4REQsCisgICAgMHhEQywgMHhDQywgMHhDRCwgMHhERCwgMHhGRSwgMHhGRSwgMHhCRiwgMHhGRSwgMHhERCwgMHhERCwgMHhDRCwgMHhDQywKKyAgICAweERELCAweENDLCAweERELCAweEVFLCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRiwgMHhGRiwgMHhGRSwgMHhFRSwgMHhFRSwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwKKyAgICAweEZGLCAweEVFLCAweERELCAweERELCAweEVFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEVELAorICAgIDB4Q0MsIDB4Q0IsIDB4Q0MsIDB4Q0QsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REMsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHhBQiwgMHhCQywgMHhERiwgMHhGRiwgMHhGRiwgMHhFRSwgMHhEQywgMHhCQiwgMHhBOSwgMHg5OSwgMHg5OSwKKyAgICAweDlBLCAweEJDLCAweERGLCAweEZGLCAweEZFLCAweEVELCAweENCLCAweEE5LCAweDg4LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkMsIDB4REYsIDB4RkYsIDB4RUUsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NzgsIDB4OEEsIDB4QkMsCisgICAgMHhFRiwgMHhGRCwgMHhEQywgMHhCOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhGRiwKKyAgICAweERELCAweENBLCAweDk4LCAweDc2LCAweDU1LCAweDQ1LCAweDU2LCAweDc4LCAweEFCLCAweERGLCAweEZFLCAweERDLAorICAgIDB4QTksIDB4NzYsIDB4NTUsIDB4NDQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QkMsIDB4RUYsIDB4RUQsIDB4Q0EsIDB4OTcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHg5QiwgMHhDRSwgMHhFRSwgMHhEQywgMHhBOSwgMHg3NiwgMHg1NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEJDLCAweEVFLCAweEVFLCAweENCLCAweDk4LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4QUIsIDB4Q0UsIDB4RUYsIDB4RkQsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5QSwgMHhCRCwgMHhFRiwgMHhGRiwgMHhFQywgMHhCOSwgMHg5OCwgMHg3NywgMHg3NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweERGLCAweEZGLCAweEZGLCAweERDLCAweEJBLCAweDk4LCAweDg4LCAweDg4LCAweDlBLCAweEJCLCAweERFLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4REMsIDB4QkEsIDB4QTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRSwgMHhFQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEVELCAweERDLCAweENDLCAweENELCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4RUUsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUMsIDB4QkIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4QkMsIDB4REQsCisgICAgMHhDQiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhFRCwgMHhDQywgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweEE5LCAweDk5LCAweEFBLCAweEJCLCAweENDLCAweERFLCAweERCLCAweENCLCAweEJBLCAweEE5LCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4REMsIDB4QkMsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg5OSwgMHhBQiwgMHhDRCwgMHhDQiwgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEFCLCAweENDLCAweEFCLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDlBLAorICAgIDB4QkMsIDB4Q0EsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODksIDB4OUEsIDB4QkIsCisgICAgMHhBQSwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCQSwgMHhBOSwKKyAgICAweDk4LCAweDc2LCAweDY1LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJCLCAweEFBLCAweDk5LCAweDg3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUIsIDB4QkIsIDB4QTksIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwgMHhCQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEJCLCAweEJBLCAweDk4LCAweDg3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QUEsIDB4QkIsIDB4QkIsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NjcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQiwgMHhCQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OCwgMHg5QSwgMHhBQiwgMHhDQiwKKyAgICAweENDLCAweENCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJDLCAweEJELCAweERDLAorICAgIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4REMsIDB4REUsIDB4RUQsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhDRCwgMHhFRSwgMHhERCwgMHhDQywgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweENDLCAweERELCAweERDLCAweEFFLCAweERELCAweENDLCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEJBLCAweEFBLCAweEFBLCAweEE5LCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERDLCAweEFCLCAweENCLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4RUQsIDB4QkIsIDB4QkIsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhDRCwgMHhEQSwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweENDLCAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4QUEsIDB4QkMsIDB4Q0EsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg4OSwgMHhBQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweEJBLCAweEE5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDg4LCAweDlBLCAweEJBLAorICAgIDB4OUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjYsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QUEsIDB4QTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQSwgMHhBQSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDY3LCAweDg5LCAweDlBLCAweEFBLCAweEE5LCAweDg4LCAweDc2LCAweDY2LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4QUEsIDB4OTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBQSwgMHhBOSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg4LCAweDlBLCAweEJBLCAweEJCLCAweEE5LCAweDg4LCAweDc3LCAweDc2LCAweDY3LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4QUIsIDB4QkEsIDB4QTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4ODksIDB4QUEsIDB4QkEsCisgICAgMHhCQiwgMHhCQSwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhBQywgMHhEQiwKKyAgICAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENCLCAweENELCAweENDLCAweEJCLAorICAgIDB4QUEsIDB4QTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4QkMsIDB4RUQsIDB4REMsIDB4QkIsIDB4QkEsCisgICAgMHhBQSwgMHhBQSwgMHhCQSwgMHhCQiwgMHhDQywgMHhDQywgMHhBQywgMHhDQywgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweEJCLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhCQiwgMHhDQywKKyAgICAweEJBLCAweEFBLCAweEE5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENDLCAweERDLCAweEJCLCAweEJBLCAweEFBLAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4Q0EsIDB4QkEsIDB4QTksIDB4OTksIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJBLCAweEFBLCAweDk4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4OUEsIDB4QkEsIDB4OUEsIDB4OTksIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksCisgICAgMHhBQSwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwKKyAgICAweDk5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEE5LCAweDk5LAorICAgIDB4ODcsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NjYsIDB4NzgsIDB4ODksIDB4QTksIDB4OTksIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg2NSwgMHg1NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHg5OSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LCAweEE5LCAweDk5LCAweDk4LCAweDc3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5OSwgMHhBQSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg2NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFBLCAweEFBLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDg5LCAweDlBLCAweEJBLAorICAgIDB4QUIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QUIsIDB4QkIsCisgICAgMHhBQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQiwgMHhDQywgMHhDQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJDLCAweEJDLCAweERDLCAweENCLCAweEJBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4Q0IsIDB4QkMsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUEsIDB4OTksCisgICAgMHg5QSwgMHhBQSwgMHhBQiwgMHhCQiwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QTksIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4QUIsIDB4REMsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhFQywgMHhCQywgMHhCQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweEFCLCAweEJDLCAweENELCAweENCLCAweEJCLCAweEFBLCAweDk5LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0MsIDB4QUIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4NzgsCisgICAgMHg4OCwgMHg4OSwgMHhBQSwgMHhCQywgMHhCQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweEFBLCAweEJCLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDk5LAorICAgIDB4QUIsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkEsCisgICAgMHg5QSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwgMHhBOSwgMHhBOSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDY2LCAweDc4LCAweDk5LCAweEFBLCAweEFBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NjcsIDB4ODksIDB4OUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwgMHhBQSwgMHg5OSwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweEFBLCAweEFBLCAweDk4LCAweDc3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QkEsIDB4QUIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhBQiwgMHhCQSwgMHhBOSwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQSwKKyAgICAweEJDLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweEJCLCAweENCLAorICAgIDB4QkEsIDB4QTksIDB4OTksIDB4OTgsIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0IsIDB4Q0QsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHhBQSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhDRCwgMHhFRCwgMHhEQywgMHhCQiwgMHhCQiwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweERDLCAweEFDLCAweENDLCAweEJCLCAweEJBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweEJCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJCLCAweENDLCAweENFLCAweEFDLCAweERELAorICAgIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RkUsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhBQiwgMHhDQywgMHhERSwgMHhEQiwgMHhDQiwgMHhCQSwgMHhBOSwgMHg5OSwKKyAgICAweDk4LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweERELCAweEJCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0QsIDB4Q0IsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5OSwgMHhBQiwgMHhDQywgMHhBQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwKKyAgICAweEJDLCAweENBLCAweEFBLCAweDk4LCAweDc3LCAweDY2LCAweDY1LCAweDY2LCAweDY3LCAweDg4LCAweDlBLCAweEJCLAorICAgIDB4QUEsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QkEsIDB4QTksCisgICAgMHg4OCwgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDc3LCAweDg5LCAweEFCLCAweEJBLCAweEFBLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkIsIDB4QkIsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhCQiwgMHhCQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweDlBLCAweEJCLCAweEJCLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkIsIDB4QkMsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OUEsIDB4QUIsIDB4Q0IsCisgICAgMHhDQywgMHhDQiwgMHhBOSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQiwgMHhCQywgMHhCRCwgMHhEQywKKyAgICAweENCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweERDLCAweERFLCAweERDLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4Q0UsIDB4RkUsIDB4REMsIDB4Q0MsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhFQywgMHhCRSwgMHhEQywgMHhDQywgMHhDQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJDLCAweENDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRSwgMHhFRCwgMHhERSwgMHhERCwgMHhERCwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRiwKKyAgICAweEVFLCAweERELCAweERELCAweERELCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEVELCAweERDLAorICAgIDB4Q0MsIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RUQsIDB4Q0MsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQiwgMHhCQywgMHhERiwgMHhGRiwgMHhGRiwgMHhERCwgMHhEQywgMHhCQSwgMHg5OSwgMHg5OCwgMHg5OSwKKyAgICAweDlBLCAweEJDLCAweERGLCAweEZGLCAweEZELCAweERDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkMsIDB4RUYsIDB4RkYsIDB4REQsIDB4Q0IsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkQsCisgICAgMHhFRiwgMHhGRCwgMHhEQywgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QiwgMHhDRCwgMHhGRiwKKyAgICAweERELCAweEJBLCAweDk3LCAweDY2LCAweDU0LCAweDQ1LCAweDU2LCAweDc5LCAweEFDLCAweERFLCAweEZFLCAweERCLAorICAgIDB4QTksIDB4NzYsIDB4NTUsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OEEsIDB4QkQsIDB4RkYsIDB4REQsIDB4Q0EsIDB4OTcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHhBQiwgMHhDRSwgMHhFRSwgMHhEQywgMHhBOSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDhBLCAweEJELCAweEVGLCAweEVFLCAweENCLCAweDk4LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzksIDB4QUIsIDB4REUsIDB4RUYsIDB4RUQsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QSwgMHhCRCwgMHhGRSwgMHhFRiwgMHhFQywgMHhCQSwgMHg5OCwgMHg3NywgMHg3NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweERFLCAweEVGLCAweEZGLCAweERDLCAweEJBLCAweDk5LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENELCAweEVFLAorICAgIDB4RkYsIDB4RkUsIDB4REMsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4RUYsIDB4RUYsIDB4RkYsCisgICAgMHhGRiwgMHhEQywgMHhDQywgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEVELCAweERELCAweENELCAweENELCAweERELCAweERGLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4RkUsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRiwgMHhFRiwgMHhGRiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4REQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkYsIDB4Q0UsIDB4RkUsCisgICAgMHhERCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhERiwgMHhFRCwgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERGLCAweEZGLCAweEZFLCAweEVELCAweENCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4QUIsIDB4Q0QsIDB4REYsIDB4RkYsIDB4REQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhCQywgMHhFRiwgMHhGRCwgMHhEQiwgMHhCOSwgMHg5OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweENELCAweEZFLCAweERDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4RkMsIDB4Q0IsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUMsIDB4REUsCisgICAgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQywgMHhDQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDU0LCAweDU1LCAweDY3LCAweDc5LCAweEFCLCAweENELCAweERDLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REMsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhCQSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweENDLCAweERELCAweERCLCAweEE5LCAweDg3LCAweDY2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4ODksIDB4QkMsIDB4REQsIDB4RUQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRSwgMHhERSwgMHhFQywgMHhCQSwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHhBQiwgMHhDRCwgMHhFRSwKKyAgICAweEZGLCAweEVDLCAweEJCLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweEFCLCAweENDLCAweERGLCAweEVGLCAweEZGLAorICAgIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkQsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUQsCisgICAgMHhDQywgMHhDQiwgMHhCQiwgMHhDQywgMHhDQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRSwgMHhERCwKKyAgICAweERDLCAweERELCAweERELCAweEVFLCAweEZGLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEVGLCAweEVELCAweERELAorICAgIDB4REQsIDB4REYsIDB4RkYsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweEVELCAweERDLCAweENDLCAweENDLCAweENDLCAweENELCAweERELCAweEVGLCAweEZGLCAweENFLCAweEZFLAorICAgIDB4REQsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RkYsIDB4RkYsIDB4RUUsIDB4REQsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhDQywgMHhERSwgMHhGRiwgMHhGRCwgMHhEQywgMHhDQiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweERFLCAweEZGLCAweERELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QkMsIDB4REYsIDB4RUQsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5QSwgMHhCQywgMHhFRSwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg4OSwgMHg5QiwKKyAgICAweENELCAweEVDLCAweEJBLCAweDk4LCAweDc2LCAweDY2LCAweDU1LCAweDU2LCAweDY3LCAweDg5LCAweEFCLCAweERELAorICAgIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REMsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NSwgMHg2NywgMHg3OCwgMHhBQiwgMHhDRCwgMHhDQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDY3LCAweDhBLCAweEJDLCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDU1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4NzgsIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhERCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFCLCAweENELCAweERELCAweENBLCAweDk4LCAweDg3LCAweDc3LCAweDY3LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REUsIDB4RUMsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUEsIDB4QkMsIDB4REQsCisgICAgMHhFRSwgMHhEQywgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhERSwgMHhFRiwgMHhGRSwKKyAgICAweERDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweENDLCAweERFLCAweEZFLCAweEZGLCAweEZFLCAweEVELAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4REMsCisgICAgMHhDQywgMHhDQywgMHhERCwgMHhERSwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhFRSwgMHhERCwgMHhERCwgMHhDRCwKKyAgICAweERELCAweERFLCAweEVFLCAweEZGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRCwgMHhEQywgMHhEQywgMHhDQywgMHhCQywgMHhDQywgMHhDRCwgMHhERCwgMHhERSwgMHhFRSwgMHhCRSwgMHhGRSwKKyAgICAweERELCAweENDLCAweENCLCAweEJCLCAweENDLCAweENELCAweEVFLCAweEZGLCAweEZGLCAweERFLCAweERDLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4RUYsIDB4RkYsIDB4RkQsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhERSwgMHhGRSwgMHhDRCwgMHhDQiwgMHhBQSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweEFBLCAweENDLCAweEVFLCAweEVDLCAweENCLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhDRSwgMHhEQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg3NywgMHg4QSwgMHhBQywgMHhERCwKKyAgICAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweEJELCAweERDLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhEQywgMHhDQSwgMHg5OCwgMHg3NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweERDLCAweENDLCAweEJBLCAweDg3LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5OSwgMHhBQywgMHhEQywgMHhERCwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHhBQiwKKyAgICAweENELCAweERELCAweEVDLCAweENBLCAweEE5LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweEFCLCAweEJDLCAweERELAorICAgIDB4REUsIDB4REMsIDB4Q0IsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUIsIDB4QkMsIDB4REUsIDB4REUsIDB4RkUsCisgICAgMHhERCwgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhERCwgMHhFRiwgMHhFRSwgMHhERCwKKyAgICAweENDLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERFLCAweEVGLCAweEVGLCAweEZGLCAweEZFLCAweEVFLCAweERELAorICAgIDB4Q0QsIDB4Q0QsIDB4Q0QsIDB4REQsIDB4RkYsIDB4RkUsIDB4Q0UsIDB4RUQsIDB4RUUsIDB4REQsIDB4REQsIDB4Q0MsCisgICAgMHhERCwgMHhDRCwgMHhERSwgMHhERSwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkUsIDB4RUUsIDB4RUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkYsIDB4QkUsIDB4RkYsCisgICAgMHhGRSwgMHhERCwgMHhEQywgMHhDRCwgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhFRCwgMHhEQywKKyAgICAweENCLCAweEJCLCAweEJCLCAweENDLCAweERELCAweEZGLCAweEZGLCAweEZELCAweEVFLCAweENDLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkMsIDB4REUsIDB4RkYsIDB4RkYsIDB4REQsIDB4REMsIDB4QkEsIDB4OTksIDB4OTgsIDB4ODksCisgICAgMHg5QSwgMHhBQiwgMHhERCwgMHhGRiwgMHhGRCwgMHhEQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3OCwgMHg5OSwKKyAgICAweEFDLCAweERFLCAweEZGLCAweERELCAweENCLCAweDk4LCAweDg3LCAweDY2LCAweDY2LCAweDc4LCAweDlBLCAweEJDLAorICAgIDB4REYsIDB4RUQsIDB4REMsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4RUUsCisgICAgMHhEQywgMHhCQSwgMHg5NywgMHg2NiwgMHg1NSwgMHg0NSwgMHg1NiwgMHg3OCwgMHhBQiwgMHhDRSwgMHhFRCwgMHhEQiwKKyAgICAweEE4LCAweDc2LCAweDU1LCAweDQ0LCAweDQ1LCAweDY3LCAweDg5LCAweEJDLCAweERFLCAweERDLCAweEJBLCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUIsIDB4Q0UsIDB4REQsIDB4REIsIDB4QTksIDB4NzYsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhCQywgMHhERSwgMHhERCwgMHhDQSwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweEFCLCAweERELCAweEVFLCAweEVDLCAweEJBLCAweDk4LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QkQsIDB4RUUsIDB4RUYsIDB4REMsIDB4QjksIDB4OTgsIDB4NzcsIDB4NzcsIDB4NzgsIDB4OUEsIDB4QkMsCisgICAgMHhERSwgMHhFRSwgMHhGRSwgMHhEQiwgMHhBQSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5QSwgMHhBQiwgMHhDRSwgMHhGRSwKKyAgICAweEZGLCAweEVELCAweERCLCAweEJBLCAweEFBLCAweDk5LCAweEFBLCAweEJCLCAweENELCAweEVGLCAweEVGLCAweEZGLAorICAgIDB4RkUsIDB4REMsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4RUYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkUsCisgICAgMHhFRCwgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRSwKKyAgICAweERFLCAweERFLCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLCAweEZFLCAweEVFLCAweEVELCAweERFLAorICAgIDB4RUQsIDB4REUsIDB4RUUsIDB4RkUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweERELCAweEVFLCAweEJDLCAweERELAorICAgIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4RUUsIDB4RkUsIDB4Q0QsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhFRSwgMHhFQywgMHhDQiwgMHhCQSwgMHhBOSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweDlBLCAweEJCLCAweENELCAweEVELCAweEJDLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QkIsIDB4Q0QsIDB4REIsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhCQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEJDLCAweENCLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweENDLAorICAgIDB4QkIsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4QTksCisgICAgMHg5OCwgMHg3NiwgMHg2NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwgMHhCQiwgMHhBOSwgMHg4NywKKyAgICAweDY2LCAweDU0LCAweDQ1LCAweDU2LCAweDc3LCAweDg5LCAweEFCLCAweEJCLCAweEJBLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkIsIDB4QkIsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTYsCisgICAgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQiwgMHhCQiwgMHhCQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFCLCAweENDLCAweENDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg5LCAweDlBLAorICAgIDB4QkMsIDB4Q0MsIDB4Q0IsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODcsIDB4ODgsIDB4ODgsIDB4OUEsIDB4QUIsIDB4Q0MsCisgICAgMHhERCwgMHhDQiwgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhDRCwgMHhFRCwKKyAgICAweENCLCAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweERDLCAweERGLCAweEVELCAweENDLAorICAgIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4REUsIDB4RkUsIDB4RUQsIDB4REMsIDB4Q0IsCisgICAgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhERSwgMHhGRCwgMHhBRSwgMHhERCwgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwKKyAgICAweEJCLCAweENDLCAweENDLCAweERELCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDQywgMHhCQiwgMHhDQywKKyAgICAweEJBLCAweEFBLCAweEE5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweEJDLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MsIDB4Q0EsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweDlBLCAweEJCLCAweEJBLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4OUEsIDB4QkIsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQSwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQSwKKyAgICAweDk5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEE5LCAweDk5LAorICAgIDB4ODcsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QUEsIDB4OTksIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg2NSwgMHg1NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBOSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDY2LCAweDY3LCAweDc4LCAweDg5LCAweEFBLCAweDlBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhBQSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEFBLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDg5LCAweEFBLCAweEJCLAorICAgIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4QkIsIDB4Q0IsCisgICAgMHhBQSwgMHg5OSwgMHg5OSwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhDQywgMHhDQiwgMHhCQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENDLCAweENDLCAweERDLCAweENCLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0QsIDB4REMsIDB4QUQsIDB4Q0MsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QUEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4QUIsIDB4Q0IsCisgICAgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhEQywgMHhBQiwgMHhBQSwgMHhBOSwKKyAgICAweDk5LCAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweENBLCAweEJBLCAweDk5LCAweDk4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QkIsIDB4QUEsIDB4QTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsCisgICAgMHg3OCwgMHg4OCwgMHg5QSwgMHhBQiwgMHhCOSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEJBLCAweDlBLCAweDk4LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUEsIDB4QTksIDB4OTksIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsCisgICAgMHg5OSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBOSwgMHg5OCwKKyAgICAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LCAweEE5LCAweDk5LCAweDg4LCAweDc3LAorICAgIDB4NjYsIDB4NjYsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4OTksIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBOSwgMHg5OSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweDk5LCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4NzgsIDB4OTksIDB4QUEsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQSwKKyAgICAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEFCLCAweEJCLAorICAgIDB4QUEsIDB4OTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0IsIDB4QkMsIDB4QkIsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhCQywgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweENDLCAweEJDLCAweENCLCAweEJBLCAweEFBLCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEJCLCAweEFBLCAweEE5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJCLCAweEJDLCAweEFCLCAweERDLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4OUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REMsIDB4QkMsIDB4QkIsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhDQSwgMHhCQiwgMHhBOSwgMHg5OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweEFCLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHhBQSwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4NywgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDg4LCAweDlBLCAweEFBLAorICAgIDB4OUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjYsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QTksIDB4QTksCisgICAgMHg4NywgMHg3NiwgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEE5LCAweEE5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NTUsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBQSwgMHhBOSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg4LCAweDlBLCAweEFBLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4QUEsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUIsIDB4QkIsCisgICAgMHhCQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhDQiwKKyAgICAweEFBLCAweEE5LCAweDk5LCAweDg5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENCLCAweENDLCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4OTksIDB4OTksIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4Q0MsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhEQywgMHhBRCwgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweENDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQywgMHhDQywgMHhCQiwgMHhCQiwgMHhBQiwgMHhBQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHhBQywgMHhERCwKKyAgICAweENDLCAweEJCLCAweEJCLCAweEJBLCAweEJCLCAweEJDLCAweENELCAweERFLCAweEZELCAweENELCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4QTksIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0QsIDB4REUsIDB4REIsIDB4Q0MsIDB4QkEsIDB4QTksIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDRCwgMHhFRCwgMHhCQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEFCLCAweENELCAweENCLCAweEJBLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QkIsIDB4REMsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhDQywKKyAgICAweEFBLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDk5LCAweEFCLCAweEJBLCAweEFBLAorICAgIDB4OTgsIDB4NzYsIDB4NjUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkIsIDB4QkIsIDB4QTksIDB4ODcsCisgICAgMHg2NiwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCQiwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEJCLCAweEJCLCAweEE5LCAweDg3LCAweDc2LCAweDY1LCAweDU2LAorICAgIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QkIsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQiwgMHhDQiwgMHhDQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweENDLCAweENCLCAweEJBLCAweDk4LCAweDg4LCAweDg3LCAweDg4LCAweDg5LCAweDlBLCAweEFDLCAweENDLAorICAgIDB4Q0QsIDB4Q0IsIDB4QkEsIDB4OTksIDB4OTgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4Q0QsIDB4REQsCisgICAgMHhDQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhEQywgMHhERSwgMHhERCwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweERELCAweEZFLCAweEVELCAweERDLCAweENCLAorICAgIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RUQsIDB4QkQsIDB4RUQsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsCisgICAgMHhCQiwgMHhDQywgMHhDQywgMHhERCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRSwgMHhFRSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRSwKKyAgICAweERELCAweERDLCAweENELCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVELCAweENDLCAweEJCLAorICAgIDB4QkIsIDB4QkMsIDB4Q0UsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OUEsCisgICAgMHhBQiwgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhDQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OSwgMHhBQiwKKyAgICAweENELCAweEZGLCAweEZGLCAweEVGLCAweERDLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDg4LCAweEFCLCAweENFLAorICAgIDB4RkYsIDB4RkUsIDB4RUQsIDB4QkEsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzksIDB4QUMsIDB4REYsIDB4RkYsCisgICAgMHhGRiwgMHhDQiwgMHg5OCwgMHg3NiwgMHg1NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCQywgMHhGRiwgMHhGRiwgMHhFQywKKyAgICAweEI5LCAweDg2LCAweDU0LCAweDMzLCAweDQ1LCAweDY4LCAweDlCLCAweERFLCAweEZGLCAweEZFLCAweERCLCAweDk4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTYsIDB4ODksIDB4QkMsIDB4RUYsIDB4RkYsIDB4RUQsIDB4QkEsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg3OCwgMHg5QiwgMHhDRSwgMHhGRiwgMHhGRiwgMHhEQywgMHhBOSwgMHg4NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDhBLCAweEJDLCAweEVGLCAweEZGLCAweEZFLCAweERCLCAweEE4LCAweDg3LCAweDY2LCAweDc3LCAweDg5LAorICAgIDB4QUMsIDB4REYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODksIDB4QUIsIDB4Q0QsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhDQiwgMHhBOSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhFRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEVELCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweENELCAweERGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRCwgMHhFRSwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweERELCAweENDLCAweENDLCAweENDLCAweEJDLCAweERDLCAweERELCAweEVFLCAweEZGLCAweEJELCAweEZELAorICAgIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RkYsIDB4RkYsIDB4REUsIDB4REMsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhERSwgMHhGRiwgMHhFRCwgMHhEQywgMHhCQiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEFCLCAweEJDLCAweERELCAweEVFLCAweENDLCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QkMsIDB4REYsIDB4RUMsIDB4Q0IsIDB4QTksIDB4OTgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QiwgMHhDRCwgMHhGRCwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweENELCAweERDLCAweENCLCAweDk4LCAweDc3LCAweDY2LCAweDU1LCAweDU2LCAweDY3LCAweDg5LCAweEJDLCAweERELAorICAgIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4REMsIDB4Q0EsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEJELCAweENDLCAweENBLCAweDk4LCAweDc2LCAweDU1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4QjksIDB4ODcsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhERCwgMHhEQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDlBLCAweEJCLCAweERELCAweERELCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REQsIDB4RUMsIDB4QkEsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4Q0MsIDB4RUUsCisgICAgMHhFRSwgMHhEQywgMHhCQiwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhERSwgMHhFRSwgMHhGRSwKKyAgICAweERDLCAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweEVFLCAweEZGLCAweEZFLCAweERELAorICAgIDB4Q0MsIDB4QkMsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RUQsIDB4REQsCisgICAgMHhDRCwgMHhDQywgMHhDRSwgMHhERSwgMHhGRSwgMHhGRSwgMHhBRiwgMHhGRSwgMHhFRSwgMHhERCwgMHhERCwgMHhDRCwKKyAgICAweERELCAweERFLCAweEVFLCAweEZGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERSwgMHhFRCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhFRiwgMHhGRiwgMHhDRSwgMHhGRSwKKyAgICAweERELCAweENDLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERFLCAweEZGLCAweEZGLCAweEVFLCAweERDLCAweENCLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4REUsIDB4RkYsIDB4RkQsIDB4REMsIDB4QkIsIDB4QTksIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhERSwgMHhGRiwgMHhERCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEJDLCAweERFLCAweEVDLCAweENCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QkMsIDB4REUsIDB4Q0MsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhEQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQiwgMHhERCwKKyAgICAweENCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweERDLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NjcsIDB4NzksIDB4QUIsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3NywgMHg4QSwgMHhCQywgMHhEQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweENDLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg4OSwgMHhBQiwgMHhERCwgMHhERCwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHhBQiwKKyAgICAweENELCAweERELCAweERDLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDg4LCAweDg5LCAweEFCLCAweENELCAweEVFLAorICAgIDB4RUUsIDB4REMsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkMsIDB4REUsIDB4RUUsIDB4RkUsCisgICAgMHhEQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhDQywgMHhERSwgMHhGRiwgMHhGRiwgMHhGRSwgMHhERCwKKyAgICAweENCLCAweEJCLCAweEJCLCAweEJCLCAweENELCAweERFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEVELCAweERDLAorICAgIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkYsIDB4RkUsIDB4REQsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhERSwgMHhFRSwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REYsIDB4RkQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4RUUsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkUsCisgICAgMHhFRCwgMHhDQywgMHhDQywgMHhCQiwgMHhDQywgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRCwgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweEVGLCAweEZGLCAweEZELCAweEVELCAweENCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4QUIsIDB4QkMsIDB4REUsIDB4RkYsIDB4REQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHhBQSwgMHhCRCwgMHhERiwgMHhGRCwgMHhEQiwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweDlCLCAweENELCAweEZGLCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4RUMsIDB4QkIsIDB4OTgsIDB4NzcsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QkMsIDB4REUsCisgICAgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQywgMHhDQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDU0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweENCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTUsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REMsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhERCwgMHhEQywgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweEJELCAweERELCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4OTksIDB4QkMsIDB4REQsIDB4REQsIDB4Q0EsIDB4OTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhFRSwgMHhFQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHhBQiwgMHhDRCwgMHhERCwKKyAgICAweEZGLCAweERDLCAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweEFCLCAweEJDLCAweERFLCAweEZGLCAweEZGLAorICAgIDB4REQsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUQsCisgICAgMHhDQywgMHhDQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhERCwKKyAgICAweERDLCAweERELCAweERELCAweEVFLCAweEZGLCAweEZGLCAweENGLCAweEZGLCAweEZFLCAweEVFLCAweERELCAweERELAorICAgIDB4REQsIDB4REUsIDB4RUYsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENGLCAweEVFLCAweEVFLCAweERELCAweERFLCAweERFLCAweEVFLCAweEVFLCAweEZFLCAweEVGLCAweEFGLCAweEZGLAorICAgIDB4RkUsIDB4RUQsIDB4REQsIDB4REQsIDB4REUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkUsIDB4REMsCisgICAgMHhDQywgMHhDQiwgMHhCQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRSwgMHhEQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFCLCAweENDLCAweERFLCAweEZGLCAweEZGLCAweEVFLCAweERDLCAweEJBLCAweEE5LCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4QkMsIDB4REUsIDB4RkYsIDB4RkUsIDB4RUMsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQywgMHhERiwgMHhGRiwgMHhFRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwKKyAgICAweEVGLCAweEZELCAweERDLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDlCLCAweENELCAweEZGLAorICAgIDB4REQsIDB4QkEsIDB4OTgsIDB4NjYsIDB4NTQsIDB4NDUsIDB4NTYsIDB4ODksIDB4QUMsIDB4REUsIDB4RUQsIDB4REIsCisgICAgMHhBOSwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCRCwgMHhFRSwgMHhFRCwgMHhCQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweEFCLCAweERFLCAweEZFLCAweERDLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4OUEsIDB4QkQsIDB4RUUsIDB4RUQsIDB4Q0IsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQywgMHhERSwgMHhFRSwgMHhFRCwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDlCLCAweENELCAweEZFLCAweEZGLCAweERDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4REYsIDB4RkYsIDB4RkUsIDB4REMsIDB4QkEsIDB4OTksIDB4OTgsIDB4OTksIDB4OUEsIDB4QkMsIDB4REYsIDB4RkYsCisgICAgMHhGRiwgMHhGRSwgMHhEQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZFLCAweERELCAweENDLCAweEJCLCAweEJCLCAweENDLCAweERELCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4RUUsIDB4REQsIDB4REMsIDB4REQsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRSwKKyAgICAweEVFLCAweEZGLCAweEZGLCAweEZGLCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCQywgMHhDQywgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhCQywgMHhEQywKKyAgICAweENCLCAweEJCLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENELCAweERFLCAweEZFLCAweENDLCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RUIsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTgsCisgICAgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhERCwgMHhCQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDlBLCAweEFCLCAweENELCAweERCLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4QUIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQywgMHhDQSwgMHhBQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhDQywKKyAgICAweEFBLCAweDk5LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEJBLCAweEE5LAorICAgIDB4ODgsIDB4NzYsIDB4NjUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkIsIDB4QUEsIDB4OTgsIDB4ODcsCisgICAgMHg2NiwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCQiwgMHhBOSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEJCLCAweEJCLCAweEE5LCAweDg3LCAweDc2LCAweDY1LCAweDU2LAorICAgIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QkIsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzcsCisgICAgMHg4OSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweENDLCAweENCLCAweEFBLCAweDk4LCAweDg4LCAweDg3LCAweDg4LCAweDg5LCAweDlBLCAweEJCLCAweENDLAorICAgIDB4Q0QsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4Q0QsIDB4REQsCisgICAgMHhDQiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhDQywgMHhERCwgMHhERSwgMHhEQywgMHhDQiwKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweERFLCAweERFLCAweEZFLCAweEVELCAweENDLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RUQsIDB4QUUsIDB4REQsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsCisgICAgMHhCQiwgMHhDQywgMHhDRCwgMHhERCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUIsIDB4QkEsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4QUIsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERCwgMHhCQiwgMHhCQSwgMHhBOSwKKyAgICAweDk5LCAweDk4LCAweDg5LCAweDk5LCAweEFBLCAweEJCLCAweENELCAweENBLCAweEJBLCAweEE5LCAweDk4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4Q0MsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEJCLCAweDlBLCAweDk4LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QTksIDB4OTksIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QUEsCisgICAgMHg5OSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHg5OSwKKyAgICAweDg3LCAweDc2LCAweDY2LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDg5LCAweEFBLCAweDk5LCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QTksIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg2NSwgMHg2NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhBQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg4OSwgMHhBQSwgMHhCQiwKKyAgICAweEJCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweEJCLCAweENCLAorICAgIDB4QUEsIDB4QTksIDB4OTksIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0IsIDB4Q0QsIDB4Q0IsIDB4QUEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDQywgMHhDRCwgMHhEQywgMHhDQiwgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweERDLCAweEFDLCAweENDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFCLCAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweEFCLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4Q0MsIDB4REMsIDB4QkIsIDB4QkEsIDB4QTksCisgICAgMHg5OSwgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhDQSwgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJCLCAweEFBLCAweEE5LCAweDg4LCAweDg3LCAweDc3LCAweDc3LAorICAgIDB4NzgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QjksIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHg5QSwgMHhCQiwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFBLCAweEE5LCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLAorICAgIDB4OTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QTksIDB4OTgsCisgICAgMHg4NywgMHg3NiwgMHg2NiwgMHg2NSwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywKKyAgICAweDY2LCAweDY1LCAweDU2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEE5LCAweDk5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QUEsIDB4OTksIDB4OTgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg4LCAweDk5LCAweEFBLCAweEFBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QUEsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkEsCisgICAgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhCQiwgMHhDQiwKKyAgICAweEFBLCAweDk5LCAweDk4LCAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEJCLCAweENCLCAweENDLCAweENCLCAweEFBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhEQywgMHhCQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweENDLCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDQywgMHhBQiwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweENELCAweERDLCAweEJDLCAweEJCLCAweEE5LAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0QsIDB4Q0EsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhDQywgMHhBQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweDlBLCAweEJCLCAweEJBLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4QUEsIDB4QkIsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhBQSwKKyAgICAweDk5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEE5LCAweDk5LAorICAgIDB4ODcsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsIDB4OTksIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg2NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBOSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDU2LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLCAweDlBLCAweDk4LCAweDg3LCAweDY2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhBQSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEFBLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLAorICAgIDB4QkIsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4QkIsIDB4Q0IsCisgICAgMHhBQSwgMHhBOSwgMHg5OSwgMHg4OCwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhDRCwgMHhDQywgMHhCQSwKKyAgICAweEFBLCAweEE5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENELCAweENDLCAweERDLCAweENDLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REMsIDB4QUQsIDB4Q0MsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkMsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0MsIDB4REQsIDB4QUMsIDB4REMsCisgICAgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERSwgMHhFRSwgMHhDQywgMHhDQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJDLCAweERFLCAweEVCLCAweENCLCAweEFBLCAweDk5LCAweDk4LAorICAgIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QkMsIDB4REQsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODcsIDB4NzgsCisgICAgMHg4OCwgMHg5OSwgMHhBQiwgMHhDRCwgMHhDQiwgMHhCQSwgMHg5OSwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDk5LCAweEFCLCAweENDLCAweEFCLCAweEE5LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkMsIDB4Q0EsIDB4QTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QkIsCisgICAgMHhBQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhCQSwgMHhBOSwKKyAgICAweDg3LCAweDc2LCAweDU1LCAweDU1LCAweDU1LCAweDY3LCAweDc4LCAweDlBLCAweEJCLCAweEFBLCAweDk4LCAweDc3LAorICAgIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwgMHhBQSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEJCLCAweEJBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QUEsIDB4QkIsIDB4QkIsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQywgMHhCQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQywKKyAgICAweENDLCAweENCLCAweEE5LCAweDk5LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENDLCAweENELCAweERDLAorICAgIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4REQsIDB4REUsIDB4REMsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERSwgMHhERSwgMHhFRSwgMHhERCwgMHhDQywgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERFLCAweEVELCAweEJFLCAweERELCAweENDLCAweENCLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4RUQsIDB4REUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUQsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFQywgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweEJCLCAweENELCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweERELCAweEJCLCAweEE5LCAweDk5LCAweDk5LAorICAgIDB4QUEsIDB4QkQsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhEQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhDRCwKKyAgICAweEZGLCAweEZGLCAweERDLCAweEI5LCAweDg3LCAweDY1LCAweDU1LCAweDU2LCAweDc4LCAweEFCLCAweERGLCAweEZGLAorICAgIDB4RkQsIDB4Q0EsIDB4OTgsIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4ODksIDB4QkMsIDB4RUYsIDB4RkUsIDB4REMsCisgICAgMHhBOSwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhDRCwgMHhGRiwgMHhGRSwgMHhDQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc5LCAweEFDLCAweERGLCAweEZGLCAweEVDLCAweEI5LCAweDg3LCAweDU1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4OUEsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4REIsIDB4QTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQywgMHhERiwgMHhGRiwgMHhGRCwgMHhDQiwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NywgMHg4OSwKKyAgICAweEFCLCAweENGLCAweEZGLCAweEZGLCAweEZELCAweENBLCAweDk4LCAweDg3LCAweDc3LCAweDg5LCAweDlBLCAweENELAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUMsIDB4QkIsIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4REYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhERCwgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQiwgMHhDQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZFLCAweERDLCAweENDLCAweENDLCAweENELCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkQsIDB4REQsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRSwgMHhFRCwgMHhERCwgMHhEQywgMHhDQywgMHhDQywgMHhDRCwgMHhERSwgMHhFRSwgMHhERSwgMHhBRiwgMHhGRSwKKyAgICAweERELCAweERDLCAweENDLCAweENDLCAweENDLCAweERELCAweEVGLCAweEZGLCAweEZGLCAweEVGLCAweERELCAweENCLAorICAgIDB4QkIsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0QsIDB4RUUsIDB4RkYsIDB4RUUsIDB4RUQsIDB4Q0IsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhFRSwgMHhGRiwgMHhERCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDk5LCAweEFCLCAweENELCAweEVGLCAweEVELCAweERDLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4Q0UsIDB4RUUsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhERSwgMHhFQywgMHhDQiwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhERCwKKyAgICAweENDLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlCLCAweENELCAweERDLCAweENBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REQsIDB4Q0MsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhEQywgMHhDQiwgMHg5OCwgMHg3NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweERFLCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4REQsIDB4REIsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhERCwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg5OSwgMHhBQiwKKyAgICAweERFLCAweEVELCAweEVELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweENELCAweEVFLAorICAgIDB4REUsIDB4RUMsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4RUYsIDB4RUUsIDB4RkUsCisgICAgMHhFRCwgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRCwKKyAgICAweERDLCAweENDLCAweENDLCAweENDLCAweENELCAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEVFLCAweEVELAorICAgIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RkYsIDB4RkYsIDB4QUYsIDB4RUUsIDB4RUUsIDB4RUQsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhFRCwgMHhFRiwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4QkMsIDB4Q0MsIDB4REQsIDB4REQsIDB4RUUsIDB4QkUsIDB4RkUsCisgICAgMHhERCwgMHhDQywgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhFRSwgMHhGRiwgMHhGRSwgMHhERSwgMHhEQywgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweEZGLCAweEVELCAweERDLCAweENCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4QUIsIDB4QkMsIDB4REUsIDB4RkUsIDB4REQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHhBQiwgMHhDQywgMHhERSwgMHhEQywgMHhDQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweENELCAweEVELCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4OEEsIDB4QkMsIDB4REQsCisgICAgMHhCQywgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQywgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweENCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhDQywgMHhCOSwgMHg4NywgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweEJELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhERCwgMHhERCwgMHhCQSwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhDRCwgMHhERCwKKyAgICAweERFLCAweERDLCAweEJCLCAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweERFLCAweEVELCAweEVFLAorICAgIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4RkUsIDB4RUYsIDB4RkUsIDB4REQsCisgICAgMHhDQywgMHhDQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERSwgMHhFRiwgMHhFRSwgMHhGRiwgMHhFRSwgMHhFRCwgMHhEQywKKyAgICAweENDLCAweERELCAweERELCAweERFLCAweEZGLCAweEZGLCAweEJFLCAweEVFLCAweEVELCAweERELCAweERELCAweENELAorICAgIDB4Q0QsIDB4REQsIDB4RUUsIDB4RUYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweEVELCAweERELCAweENDLCAweENDLCAweERDLCAweERELCAweERFLCAweEVGLCAweEVGLCAweEFFLCAweEZFLAorICAgIDB4RUQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REUsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RUUsIDB4REQsIDB4REIsCisgICAgMHhCQiwgMHhCQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhFRSwgMHhGRiwgMHhFRCwgMHhFRCwgMHhDQiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDlBLCAweEJCLCAweENELCAweEVGLCAweEZFLCAweERELCAweENCLCAweEFBLCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4OTksIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RUQsIDB4REIsIDB4QjksIDB4OTgsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhDRCwgMHhFRSwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQywKKyAgICAweERFLCAweERDLCAweENCLCAweDk4LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDc3LCAweDlBLCAweEJDLCAweEVELAorICAgIDB4Q0MsIDB4QjksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4REMsIDB4Q0EsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhCQywgMHhERCwgMHhDQywgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEJELCAweERDLCAweENCLCAweDk4LCAweDc2LCAweDU1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REQsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhERCwgMHhEQywgMHhCOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweERELCAweERFLCAweERCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDk5LCAweEFCLAorICAgIDB4REQsIDB4RUUsIDB4RUQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0QsIDB4RUUsCisgICAgMHhGRiwgMHhFRCwgMHhDQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhERSwgMHhFRSwgMHhGRiwKKyAgICAweERELCAweENDLCAweEJCLCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweERFLCAweEVFLCAweEZGLCAweEZFLCAweEVELAorICAgIDB4REMsIDB4Q0IsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4RUUsIDB4RkYsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUQsCisgICAgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhBRSwgMHhFRSwgMHhFRSwgMHhFRCwgMHhFRCwgMHhERCwKKyAgICAweERELCAweERFLCAweEVFLCAweEZFLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEVELCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHhCQiwgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhCQiwgMHhBOSwgMHg5OSwgMHg5OSwKKyAgICAweEFCLCAweEJELCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweENBLCAweEE5LCAweDg3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkQsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4Q0QsCisgICAgMHhGRiwgMHhGRiwgMHhGQywgMHhCOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHhBQiwgMHhERiwgMHhGRiwKKyAgICAweEZELCAweENBLCAweDk3LCAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDg5LCAweEFDLCAweEZGLCAweEZGLCAweERDLAorICAgIDB4QTksIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OUEsIDB4Q0YsIDB4RkYsIDB4RkQsIDB4Q0EsIDB4OTcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OSwgMHhBQywgMHhERiwgMHhGRiwgMHhGQywgMHhCOSwgMHg4NiwgMHg2NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDlBLCAweENELCAweEZGLCAweEZGLCAweERCLCAweEE4LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUMsIDB4RUYsIDB4RkYsIDB4RkYsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NjYsIDB4NjcsIDB4ODksCisgICAgMHhBQiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OSwgMHg5QiwgMHhDRCwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweEFCLCAweEJDLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RUQsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRCwgMHhEQywgMHhDQywgMHhDQywgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZELCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4QkMsIDB4QkMsIDB4Q0MsIDB4REQsIDB4REUsIDB4RUUsIDB4QUUsIDB4RUUsCisgICAgMHhERCwgMHhDQywgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRSwgMHhERSwgMHhEQywgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENELCAweERFLCAweEVGLCAweEVELCAweERDLCAweEJCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4REUsIDB4RkUsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg5OSwgMHhBQiwgMHhDRCwgMHhERiwgMHhFQywgMHhDQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweENELCAweEVFLCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REIsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REQsCisgICAgMHhCQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQiwgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENDLCAweENCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDc4LCAweDlBLCAweEJDLCAweENDLCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4OUEsIDB4QUMsIDB4REQsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhERCwgMHhERCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQywgMHhFRCwKKyAgICAweEVFLCAweERDLCAweENCLCAweEFBLCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweERFLCAweEVFLCAweEZFLAorICAgIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkUsIDB4REQsCisgICAgMHhDQywgMHhDQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERCwgMHhFRiwgMHhFRSwgMHhGRiwgMHhGRSwgMHhFRCwgMHhERCwKKyAgICAweENDLCAweENDLCAweERELCAweEVFLCAweEVGLCAweEZFLCAweDlFLCAweEVELCAweERELCAweERELCAweERDLCAweENDLAorICAgIDB4REQsIDB4REQsIDB4REUsIDB4RUYsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweENELCAweDlDLCAweERDLAorICAgIDB4QkIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RUQsIDB4QkMsIDB4Q0IsIDB4QUEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhERCwgMHhEQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OCwKKyAgICAweDg4LCAweDg5LCAweDk5LCAweEFCLCAweEJDLCAweERDLCAweEJCLCAweEFBLCAweDk5LCAweDg4LCAweDg3LCAweDc4LAorICAgIDB4ODgsIDB4OTksIDB4QUIsIDB4QkMsIDB4Q0EsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5OSwgMHhBQiwgMHhDQywgMHhBQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwKKyAgICAweEFDLCAweENBLCAweEE5LCAweDk4LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEJCLAorICAgIDB4QUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkEsIDB4QTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwgMHhBQSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDc3LCAweDg5LCAweEFCLCAweEJBLCAweEE5LCAweDg4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTYsCisgICAgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhCQSwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFBLCAweEJCLCAweEJCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkMsIDB4QkIsIDB4QkIsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OUEsIDB4QUIsIDB4Q0IsCisgICAgMHhCQywgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhDQywgMHhDQywKKyAgICAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweEJELCAweERDLCAweENELCAweENDLCAweEJCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4Q0MsIDB4RUUsIDB4REMsIDB4Q0IsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhFRCwgMHg5RCwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweEJDLCAweENDLCAweERELCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhCQywgMHg5QiwgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEE5LCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERDLCAweEJCLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0QsIDB4QkEsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweDlBLCAweEJDLCAweEJBLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4QUEsIDB4QkIsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4OTksCisgICAgMHhBQiwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBQSwKKyAgICAweDk5LCAweDk4LCAweDc3LCAweDY2LCAweDY1LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEE5LCAweDk5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsIDB4OTksIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLCAweDlBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzgsIDB4ODksIDB4QUEsIDB4QUEsIDB4QTksIDB4OTgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhBQSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEFBLCAweEJBLCAweDk5LCAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDk5LCAweEFBLCAweEJBLAorICAgIDB4QUIsIDB4QkEsIDB4OTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4QkIsIDB4Q0IsCisgICAgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhCQywgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweEE5LCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweEJDLCAweERDLCAweENDLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0MsIDB4REMsIDB4OUMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QTksIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4OUIsIDB4Q0MsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhEQywgMHhCQywgMHhCQiwgMHhBQSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweENELCAweENBLCAweEJCLCAweEFBLCAweDk5LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0IsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsCisgICAgMHg4OCwgMHg5OSwgMHhBQSwgMHhDQywgMHhCQSwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDk5LCAweEFCLCAweEJCLCAweEFBLCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDlBLAorICAgIDB4QUMsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkIsCisgICAgMHg5QSwgMHg5OCwgMHg3NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCOSwgMHhBOSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEJBLCAweDlBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QUEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEFBLCAweEJBLCAweDk4LCAweDc3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4OUEsIDB4QkEsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhBQiwgMHhCQiwgMHhCQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3OCwgMHg4OCwgMHg5QSwgMHhBQiwgMHhDQiwKKyAgICAweEJDLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDg5LCAweDk5LCAweEFCLCAweEJDLCAweEJCLCAweENDLAorICAgIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4Q0IsIDB4Q0QsIDB4Q0MsIDB4QkIsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhDQywgMHhEQywgMHhDQywgMHhDQiwgMHhCQiwKKyAgICAweEJCLCAweEFCLCAweEJCLCAweENDLCAweENELCAweERDLCAweDlDLCAweENCLCAweEJCLCAweEJBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweERELCAweENDLCAweENDLCAweENDLCAweENDLCAweENELCAweERFLCAweEVFLCAweEVGLCAweDlFLCAweEZFLAorICAgIDB4REQsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkYsIDB4REUsIDB4REMsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhFRSwgMHhGRiwgMHhGRCwgMHhEQywgMHhDQiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDlBLCAweEFCLCAweENELCAweEVGLCAweEZGLCAweERELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4OTksIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RUMsIDB4Q0IsIDB4QTksIDB4OTgsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhDRCwgMHhFRSwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwKKyAgICAweERFLCAweEVDLCAweENBLCAweDk4LCAweDc3LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERELAorICAgIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4REMsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQywgMHhERCwgMHhDQywgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ0LCAweDU2LCAweDc4LCAweDlBLCAweEJELCAweERDLCAweENCLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg3OCwgMHg5QiwgMHhCRCwgMHhERCwgMHhEQiwgMHhCOSwgMHg4OCwgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweERELCAweERELCAweENCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDk5LCAweEFCLAorICAgIDB4Q0QsIDB4REQsIDB4RUQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0QsIDB4RUQsCisgICAgMHhFRSwgMHhFRCwgMHhDQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhERSwgMHhFRSwgMHhGRSwKKyAgICAweERELCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweEZFLCAweEVGLCAweEZFLCAweERELAorICAgIDB4REMsIDB4Q0IsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4RUUsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RUUsIDB4REQsCisgICAgMHhEQywgMHhERCwgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhBRSwgMHhGRSwgMHhFRSwgMHhFRCwgMHhERCwgMHhERCwKKyAgICAweERELCAweERFLCAweEVFLCAweEZGLCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RUQsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsIDB4Q0MsCisgICAgMHhDQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhCQiwgMHhBQSwgMHhBQiwKKyAgICAweEJDLCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVDLCAweEJBLCAweDk5LCAweDg5LCAweDlBLCAweEJCLAorICAgIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NzcsIDB4ODksIDB4QkMsIDB4RUYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwgMHg5OCwgMHg2NSwgMHg1NSwgMHg2NywgMHg4QSwgMHhCQywgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweERDLCAweEE5LCAweDc1LCAweDQ0LCAweDQ0LCAweDY3LCAweDlCLCAweENGLCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4Q0EsIDB4ODcsIDB4NTQsIDB4MzMsIDB4NDUsIDB4NzksIDB4QUMsIDB4REYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QTksCisgICAgMHg3NSwgMHg0MywgMHgzNCwgMHg1NywgMHg4QSwgMHhDRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwgMHg5NywgMHg2NCwKKyAgICAweDQ0LCAweDQ1LCAweDc5LCAweEFDLCAweERGLCAweEZGLCAweEZGLCAweEZELCAweEJBLCAweDg3LCAweDY1LCAweDU1LAorICAgIDB4NjgsIDB4OUIsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QjksIDB4ODcsIDB4NzcsIDB4NzgsIDB4OUEsCisgICAgMHhCRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhCQSwgMHg5OCwgMHg4OSwgMHg5QSwgMHhCQywgMHhERiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweERDLCAweEJCLCAweEFBLCAweEFCLCAweEJDLCAweERGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRSwgMHhERCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4Q0QsIDB4OUUsIDB4RkUsCisgICAgMHhERCwgMHhERCwgMHhDQywgMHhDQywgMHhDRCwgMHhERCwgMHhFRSwgMHhGRSwgMHhGRCwgMHhERSwgMHhFRCwgMHhEQywKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERFLCAweEVGLCAweEVDLCAweERELCAweENDLCAweEJBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4RUQsIDB4RUQsIDB4Q0QsIDB4Q0MsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksCisgICAgMHg5QSwgMHhCQiwgMHhDRCwgMHhERiwgMHhEQywgMHhEQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEJDLCAweENELCAweEVELCAweENELCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDY2LCAweDc4LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUIsIDB4QkQsIDB4RUQsCisgICAgMHhDQywgMHhCQSwgMHg5NywgMHg2NSwgMHg1NCwgMHg0NSwgMHg2NiwgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwKKyAgICAweEE4LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDhBLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDg3LAorICAgIDB4NjUsIDB4NDQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg2NywgMHg5QSwgMHhCQywgMHhFRCwgMHhDRCwgMHhDQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweERDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY3LCAweDg4LAorICAgIDB4OUIsIDB4Q0MsIDB4RUQsIDB4Q0QsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODksIDB4OUEsIDB4QkMsCisgICAgMHhERCwgMHhEQywgMHhEQywgMHhDQywgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhERSwgMHhFRCwKKyAgICAweERFLCAweERELCAweENDLCAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweERELCAweEVFLCAweERDLCAweEZFLAorICAgIDB4REQsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4RUUsIDB4RkUsIDB4REYsIDB4RUUsIDB4REQsCisgICAgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhFRSwgMHhFRiwgMHhFRCwgMHhGRiwgMHhFRSwgMHhFRCwgMHhERCwKKyAgICAweERELCAweERFLCAweEVGLCAweEVGLCAweEZGLCAweEVFLCAweDlELCAweERELCAweENELCAweERELCAweERELCAweERELAorICAgIDB4REQsIDB4REUsIDB4RUUsIDB4RkUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweERELCAweENDLCAweENCLCAweEJCLCAweEJDLCAweENDLCAweENELCAweERELCAweERFLCAweEFFLCAweEVFLAorICAgIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REQsIDB4RUYsIDB4RkUsIDB4REUsIDB4REMsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERCwgMHhFRiwgMHhFRCwgMHhEQywgMHhDQiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweERFLCAweEVFLCAweENDLCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4OTksIDB4QUEsIDB4QkMsIDB4REUsIDB4REMsIDB4Q0IsIDB4QTksIDB4OTgsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhDQywgMHhERCwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweENELCAweERCLCAweEJBLCAweDk4LCAweDc3LCAweDY1LCAweDU1LCAweDU2LCAweDc3LCAweDlBLCAweEJDLCAweERELAorICAgIDB4QkIsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4REIsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhCQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweEJBLCAweDk4LCAweDc2LCAweDU1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4Q0MsIDB4QkEsIDB4ODgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NywgMHg3OCwgMHg5QSwgMHhCRCwgMHhDQywgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweERELCAweENELCAweENCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDk5LCAweEFCLAorICAgIDB4Q0QsIDB4REMsIDB4REMsIDB4QkEsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0QsIDB4REQsCisgICAgMHhERCwgMHhEQywgMHhCQiwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhERSwgMHhERCwgMHhFRCwKKyAgICAweERDLCAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweEZFLCAweERGLCAweEVFLCAweERDLAorICAgIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REUsIDB4RkYsIDB4RkUsIDB4RkUsIDB4RkUsIDB4REQsIDB4REQsCisgICAgMHhDQywgMHhDQywgMHhERCwgMHhERSwgMHhGRiwgMHhGRSwgMHhBRSwgMHhFRCwgMHhERCwgMHhERCwgMHhDQywgMHhDQywKKyAgICAweENELCAweERELCAweEVFLCAweEVGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERSwgMHhFRCwgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhERCwgMHhERSwgMHg5RiwgMHhGRiwKKyAgICAweEVELCAweERELCAweERELCAweENDLCAweENELCAweERELCAweEVFLCAweEVGLCAweEZFLCAweEVGLCAweEVELCAweERDLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0UsIDB4RUUsIDB4RkYsIDB4RUQsIDB4RUQsIDB4REMsIDB4QkEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhFRSwgMHhGRCwgMHhERSwgMHhEQywgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OSwKKyAgICAweDlBLCAweEFCLCAweENELCAweEVGLCAweERELCAweERDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDc4LCAweDlBLAorICAgIDB4QkIsIDB4Q0QsIDB4RUQsIDB4Q0QsIDB4Q0IsIDB4QTgsIDB4ODcsIDB4NjYsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsCisgICAgMHhERSwgMHhEQywgMHhEQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhFRCwKKyAgICAweENELCAweEJBLCAweDk3LCAweDY1LCAweDU0LCAweDQ1LCAweDY2LCAweDc5LCAweEFCLCAweENELCAweERDLCAweENCLAorICAgIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OEEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4ODcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwgMHhBOSwgMHg3NiwgMHg2NSwKKyAgICAweDQ1LCAweDU2LCAweDY3LCAweDlBLCAweEJDLCAweERELCAweERELCAweENBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REQsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjYsIDB4NjcsIDB4ODgsCisgICAgMHg5QSwgMHhCRCwgMHhERCwgMHhERCwgMHhDQiwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OCwgMHg5QSwgMHhCQywKKyAgICAweENFLCAweERFLCAweEVELCAweENCLCAweEFBLCAweDk5LCAweDg4LCAweDg5LCAweDlBLCAweEJDLCAweENELCAweEVELAorICAgIDB4RUYsIDB4RUQsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0QsIDB4RUUsIDB4REUsIDB4RkUsCisgICAgMHhERCwgMHhDQywgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhERSwgMHhGRSwgMHhERiwgMHhGRSwgMHhERCwKKyAgICAweERDLCAweENDLCAweENDLCAweENDLCAweERFLCAweEVFLCAweEVGLCAweEVFLCAweEZGLCAweEVGLCAweEVFLCAweERFLAorICAgIDB4REQsIDB4REQsIDB4REUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4QUUsIDB4REQsIDB4REQsIDB4RUQsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERELCAweENDLAorICAgIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4Q0IsIDB4QUEsIDB4QUIsCisgICAgMHhCQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhCQSwgMHg5OSwgMHg4OSwgMHg5QSwgMHhCQywKKyAgICAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEJBLCAweDk4LCAweDc3LCAweDc3LCAweDg5LCAweEJDLCAweERGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4OTgsIDB4NjYsIDB4NTUsIDB4NjcsIDB4OEEsIDB4QkQsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGQywgMHhBOSwgMHg3NiwgMHg0NCwgMHg0NSwgMHg2NywgMHg5QiwgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweENBLCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDc4LCAweEFDLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEE5LAorICAgIDB4NzUsIDB4NDMsIDB4MjQsIDB4NTcsIDB4OEEsIDB4Q0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4OTcsIDB4NjUsCisgICAgMHg0NCwgMHg0NiwgMHg3OSwgMHhBQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhCQSwgMHg4NywgMHg2NSwgMHg1NiwKKyAgICAweDY4LCAweDlCLCAweENELCAweEZGLCAweEZGLCAweEZGLCAweERDLCAweEI5LCAweDg3LCAweDc3LCAweDc4LCAweDlBLAorICAgIDB4QkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QkEsIDB4OTksIDB4ODksIDB4OUEsIDB4QkMsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhCQiwgMHhBQSwgMHhBQiwgMHhCQywgMHhERiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweERELCAweENDLCAweENDLCAweENELCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweEVELCAweENELCAweENDLCAweENDLCAweENDLCAweENDLCAweENELCAweERELCAweERELCAweDlFLCAweEZFLAorICAgIDB4REQsIDB4REMsIDB4Q0MsIDB4QkMsIDB4Q0MsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkUsIDB4REUsIDB4REQsIDB4Q0MsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERSwgMHhFRiwgMHhFRCwgMHhFRCwgMHhDQiwgMHhCQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweENELCAweERFLCAweEVFLCAweERELCAweENDLCAweEJBLCAweDk5LCAweDk4LCAweDk5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4REMsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhDRCwgMHhFRCwgMHhDQywgMHhCQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweERELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERELAorICAgIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NCwgMHgzNCwgMHg1NSwgMHg2NywgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhCQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDM0LCAweDU2LCAweDc4LCAweDlCLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTYsIDB4NjgsIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTYsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEJDLCAweERELCAweENELCAweENCLCAweEE5LCAweDk4LCAweDg3LCAweDc4LCAweDg5LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4REQsIDB4RUMsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODgsIDB4OTksIDB4OUEsIDB4QkIsIDB4Q0QsIDB4RUQsCisgICAgMHhERSwgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhFRiwgMHhFRCwgMHhFRSwKKyAgICAweERDLCAweENCLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweEVGLCAweEVFLCAweEVGLCAweEZFLCAweERELAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REUsIDB4RkYsIDB4RUQsIDB4RkYsIDB4RUUsIDB4RUQsIDB4REQsCisgICAgMHhDRCwgMHhERCwgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHg4RSwgMHhERCwgMHhERCwgMHhDQywgMHhDQywgMHhDRCwKKyAgICAweERELCAweERELCAweERFLCAweEVFLCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBOSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQiwgMHg5QiwgMHhDQywKKyAgICAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweENDLCAweEVDLCAweEJDLCAweEJCLCAweEFBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0QsIDB4QkIsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTgsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhDQiwgMHhBQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDk5LCAweEFCLCAweEJDLCAweEJBLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OTksIDB4QUIsIDB4Q0IsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhBQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg3NywgMHg2NiwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwgMHhCQiwKKyAgICAweDlBLCAweDk4LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDk5LCAweEFCLCAweEE5LCAweEE5LAorICAgIDB4ODcsIDB4NzYsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkEsIDB4OUEsIDB4OTgsIDB4ODcsCisgICAgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEJBLCAweEFBLCAweEE5LCAweDg3LCAweDc2LCAweDY1LCAweDU2LAorICAgIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QUEsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg4OSwgMHhBQSwgMHhCQSwgMHhBQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHg5QSwKKyAgICAweEJCLCAweEJBLCAweEJCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENCLAorICAgIDB4QkMsIDB4QkIsIDB4QTksIDB4OTksIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkIsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDQywgMHhCQywgMHhDQywgMHhCQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweEJDLCAweERELCAweENDLCAweERELCAweERDLCAweENCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4RUMsIDB4OEMsIDB4QkIsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhCQiwgMHhCQywgMHhDQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QUEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkIsIDB4OUIsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBOSwgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhDQiwgMHhBQiwgMHhCQSwgMHhBOSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweEJBLCAweEJBLCAweEE5LCAweDk4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QkIsIDB4Q0IsIDB4QUEsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhCOSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweEFBLCAweEJBLCAweDlBLCAweDk5LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDk5LAorICAgIDB4QUIsIDB4QTksIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QUEsCisgICAgMHg5OSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NSwgMHg1NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwgMHhBOSwgMHg5OSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLCAweDk5LCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QTksIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg1NSwgMHg2NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY3LCAweDc4LCAweDg5LCAweEFBLCAweEE5LCAweEE5LCAweDk4LCAweDc3LCAweDc2LCAweDY2LCAweDY3LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhBQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQSwKKyAgICAweEFCLCAweEJBLCAweDk5LCAweDk4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweEJCLCAweENCLAorICAgIDB4QUEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0IsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHhBOSwgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhCQiwgMHhEQywgMHhDQiwgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweEJCLCAweENDLCAweERDLCAweDlCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweDhCLCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4REQsIDB4REMsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhDQiwgMHhDQiwgMHhCQSwgMHg5OSwgMHg5OCwKKyAgICAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweENCLCAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg3LCAweDg4LAorICAgIDB4ODgsIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkEsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5QSwgMHhBQiwgMHhDQiwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEJCLCAweEJBLCAweEE5LCAweDk4LCAweDc2LCAweDY2LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEJBLAorICAgIDB4QUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkEsIDB4QTksCisgICAgMHg4OCwgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NSwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHg5OCwgMHg4NywKKyAgICAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc3LCAweDg5LCAweEFCLCAweEFBLCAweEE5LCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTYsCisgICAgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQiwgMHhBQSwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFCLCAweEJCLCAweEFCLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweDlBLAorICAgIDB4QkMsIDB4QkIsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4ODgsIDB4ODcsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0IsCisgICAgMHhCQywgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhCQiwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweEE5LCAweDk5LCAweDlBLCAweEFBLCAweEFCLCAweENDLCAweENDLCAweEJELCAweENDLCAweEJCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4Q0MsIDB4REQsIDB4Q0MsIDB4Q0IsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHhEQywgMHg4QywgMHhCQiwgMHhCQiwgMHhCQiwgMHhBQSwgMHhBQSwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweENDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRCwgMHhERCwgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhDRCwgMHhERCwgMHg4RSwgMHhGRSwKKyAgICAweEVELCAweERELCAweENDLCAweENDLCAweENELCAweERELCAweEVGLCAweEZGLCAweEZELCAweERFLCAweEVELCAweENDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4RUUsIDB4RUYsIDB4RUQsIDB4REQsIDB4Q0MsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhFRSwgMHhGRCwgMHhERCwgMHhEQywgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwKKyAgICAweDlBLCAweEJCLCAweENELCAweEVFLCAweEVDLCAweERDLCAweEJBLCAweEE5LCAweDg4LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkMsIDB4Q0UsIDB4RUQsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkMsCisgICAgMHhERSwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhFRCwKKyAgICAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDU0LCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweENCLAorICAgIDB4QTksIDB4NzYsIDB4NTQsIDB4MzQsIDB4NDUsIDB4NjgsIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsCisgICAgMHg2NSwgMHg0NCwgMHgzNCwgMHg1NiwgMHg3OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhEQiwgMHhBOSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweERELCAweERELCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0UsIDB4REMsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NzcsIDB4ODksCisgICAgMHhBQiwgMHhDQywgMHhERCwgMHhERCwgMHhEQiwgMHhBQSwgMHg5OCwgMHg4NywgMHg3OCwgMHg4OSwgMHg5QSwgMHhCQywKKyAgICAweERFLCAweERELCAweEVELCAweENCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweENELCAweEVELAorICAgIDB4REUsIDB4REQsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4RUYsIDB4RUQsIDB4RkYsCisgICAgMHhFRCwgMHhEQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhERCwgMHhFRSwgMHhGRSwgMHhERiwgMHhGRSwgMHhERCwKKyAgICAweERDLCAweENDLCAweENDLCAweERELCAweERELCAweEVFLCAweEZGLCAweEZELCAweEZGLCAweEZFLCAweEVFLCAweEVELAorICAgIDB4REQsIDB4REQsIDB4RUUsIDB4RUUsIDB4RkYsIDB4RkYsIDB4OUQsIDB4REQsIDB4REUsIDB4REQsIDB4REQsIDB4Q0QsCisgICAgMHhERCwgMHhFRSwgMHhERSwgMHhFRiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0YsIDB4RkUsIDB4RUUsIDB4REUsIDB4REQsIDB4REQsIDB4REQsIDB4RUQsIDB4REQsIDB4REQsIDB4OUYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRSwKKyAgICAweERELCAweERELCAweENELCAweERELCAweERFLCAweEVGLCAweEZGLCAweEVFLCAweEZGLCAweEVELCAweERDLCAweENCLAorICAgIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4RUUsIDB4RkYsIDB4RkUsIDB4RUYsIDB4RUQsIDB4Q0MsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhCQiwgMHhDRCwgMHhFRSwgMHhGRiwgMHhGRSwgMHhFRSwgMHhEQywgMHhCQSwgMHg5OCwgMHg4OCwgMHg5OSwgMHhBQiwKKyAgICAweENELCAweERFLCAweEZFLCAweEVGLCAweERDLCAweEJBLCAweDk4LCAweDc3LCAweDc3LCAweDg5LCAweEFCLCAweENELAorICAgIDB4RkYsIDB4RUUsIDB4RUQsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REUsIDB4RkYsCisgICAgMHhFRSwgMHhDQiwgMHhBOCwgMHg3NiwgMHg1NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCRCwgMHhERiwgMHhFRSwgMHhFRCwKKyAgICAweEJBLCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDc4LCAweEFCLCAweERFLCAweEZGLCAweERFLCAweENCLCAweEE4LAorICAgIDB4NzUsIDB4NDMsIDB4MjQsIDB4NTcsIDB4OEEsIDB4QkQsIDB4RUYsIDB4RUQsIDB4RUQsIDB4QkEsIDB4OTcsIDB4NjUsCisgICAgMHg0NCwgMHg0NiwgMHg3OCwgMHhBQiwgMHhERCwgMHhGRSwgMHhERiwgMHhEQywgMHhBOSwgMHg4NywgMHg2NSwgMHg1NiwKKyAgICAweDc4LCAweDlBLCAweENELCAweEVGLCAweEVFLCAweEVELCAweERCLCAweEE5LCAweDg3LCAweDc3LCAweDc4LCAweDlBLAorICAgIDB4QkMsIDB4REYsIDB4RkUsIDB4REYsIDB4RUQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4OUEsIDB4QkIsIDB4REQsCisgICAgMHhGRiwgMHhGRCwgMHhGRSwgMHhERCwgMHhDQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQywgMHhERCwgMHhGRSwgMHhGRSwKKyAgICAweERGLCAweEVFLCAweERELCAweENDLCAweENCLCAweEJCLCAweEJDLCAweENELCAweEVGLCAweEZGLCAweEZELCAweEZFLAorICAgIDB4RkUsIDB4REQsIDB4REMsIDB4Q0MsIDB4REQsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkUsIDB4RkYsCisgICAgMHhFRSwgMHhFRCwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDhDLCAweERELCAweERELCAweERELCAweERELCAweERELAorICAgIDB4RUQsIDB4RkUsIDB4RUYsIDB4RkYsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENELCAweERELCAweERDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweERELCAweERELCAweDlFLCAweEZFLAorICAgIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REQsIDB4RUUsIDB4RUUsIDB4REUsIDB4REQsIDB4Q0MsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDRCwgMHhERCwgMHhFRiwgMHhFRCwgMHhERCwgMHhDQiwgMHhCQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweENDLCAweERFLCAweEVELCAweENELCAweENCLCAweEJBLCAweDk5LCAweDk4LCAweDg5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4REMsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhDRCwgMHhFRCwgMHhDQywgMHhCQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQiwKKyAgICAweENELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERELAorICAgIDB4Q0MsIDB4QkEsIDB4OTcsIDB4NjYsIDB4NTQsIDB4NDUsIDB4NjYsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg4NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweEFCLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg2LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTYsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhEQywgMHhBQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg4OCwKKyAgICAweDlBLCAweEJELCAweEVELCAweENELCAweENCLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4REQsIDB4REMsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODksIDB4OUEsIDB4QkMsIDB4Q0QsIDB4RUUsCisgICAgMHhERCwgMHhEQywgMHhDQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQywgMHhDRCwgMHhFRiwgMHhFRCwgMHhFRSwKKyAgICAweERDLCAweENCLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweEVFLCAweEZFLCAweERFLCAweEVFLCAweERELAorICAgIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RUUsIDB4RkYsIDB4RUQsIDB4RkYsIDB4RUUsIDB4RUUsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhGRiwgMHhGRiwgMHg5RCwgMHhFRCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwKKyAgICAweERELCAweERFLCAweEVFLCAweEZGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRSwgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhDRCwgMHhERCwgMHhBRSwgMHhFRSwKKyAgICAweERDLCAweENDLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERELCAweERFLCAweEVELCAweERFLCAweERDLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4REQsIDB4REMsIDB4Q0IsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhDRCwgMHhFRCwgMHhDRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweEFBLCAweEJDLCAweERELCAweERDLCAweENCLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4QUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhDQiwgMHhCQSwgMHg5OCwgMHg3NywgMHg2NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhEQywKKyAgICAweEJCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4QkIsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENDLCAweEJDLCAweEFBLCAweDg4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3OCwgMHg5OSwgMHhBQiwKKyAgICAweENELCAweERDLCAweENDLCAweEJBLCAweEE5LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweENDLCAweERELAorICAgIDB4Q0QsIDB4Q0MsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4REQsIDB4RUQsCisgICAgMHhDQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERSwgMHhFRSwgMHhERSwgMHhERCwgMHhEQywKKyAgICAweENCLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERFLCAweEVGLCAweEVELCAweEZFLCAweEVELCAweERELCAweENDLAorICAgIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REUsIDB4RUYsIDB4RkUsIDB4QUQsIDB4REQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsCisgICAgMHhDRCwgMHhERCwgMHhERSwgMHhFRSwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REQsIDB4OUUsIDB4RkUsCisgICAgMHhFRCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhERSwgMHhFRSwgMHhFRCwgMHhERSwgMHhFRCwgMHhDQywKKyAgICAweENCLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweERELCAweEVGLCAweERELCAweEVELCAweENCLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RUQsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTksIDB4OTgsIDB4OTksCisgICAgMHg5QSwgMHhBQiwgMHhDRCwgMHhERSwgMHhEQywgMHhEQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweENELCAweEVELCAweENDLCAweEJBLCAweEE5LCAweDg3LCAweDY2LCAweDY3LCAweDc4LCAweDlBLCAweEJDLAorICAgIDB4Q0QsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REMsCisgICAgMHhDQywgMHhCQSwgMHg5OCwgMHg2NSwgMHg1NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhDQywgMHhDQiwKKyAgICAweEE4LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDhBLCAweEJDLCAweERDLCAweENDLCAweEJBLCAweDk3LAorICAgIDB4NjUsIDB4NDQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg2NywgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweENELCAweENDLCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY3LCAweDg4LAorICAgIDB4OUEsIDB4QkMsIDB4REMsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkMsCisgICAgMHhERCwgMHhEQywgMHhEQywgMHhDQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDRCwgMHhFRCwKKyAgICAweERFLCAweERDLCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENELCAweERFLCAweERELCAweEVELAorICAgIDB4REMsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUQsIDB4REYsIDB4RUQsIDB4REQsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhERSwgMHhFRiwgMHhERCwgMHhFRSwgMHhFRSwgMHhERCwgMHhERCwKKyAgICAweERELCAweERELCAweERFLCAweEVFLCAweEVGLCAweEZFLCAweDlELCAweERELCAweENDLCAweENDLCAweENDLCAweENDLAorICAgIDB4Q0QsIDB4REQsIDB4REQsIDB4REUsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweERGLCAweEZGLCAweEZGLCAweEZFLCAweEZELCAweERELCAweERELCAweERELCAweERELCAweERELCAweDhGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhFRSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhFRSwgMHhERCwKKyAgICAweERELCAweERELCAweEZFLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZFLCAweEZELCAweENDLCAweEJCLCAweEJDLAorICAgIDB4Q0MsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUIsIDB4Q0QsCisgICAgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg5QSwgMHhDRCwgMHhFRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEVDLCAweEE5LCAweDg2LCAweDY2LCAweDc4LCAweDlCLCAweENFLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RUQsIDB4Q0EsIDB4ODYsIDB4NTQsIDB4NDUsIDB4NzgsIDB4QUMsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhDQiwgMHhBOCwgMHg2NCwgMHgyMiwgMHg0NiwgMHg4QSwgMHhCRCwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRSwgMHhCQSwKKyAgICAweDg2LCAweDQyLCAweDI0LCAweDY4LCAweEFDLCAweERFLCAweEZGLCAweEZGLCAweEZFLCAweERDLCAweEE4LCAweDc1LAorICAgIDB4NDQsIDB4NTYsIDB4OEEsIDB4QkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4Q0IsIDB4OTgsIDB4NzYsIDB4NjYsCisgICAgMHg3OSwgMHhBQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhDQSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhBQiwKKyAgICAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERELCAweEJCLCAweEFBLCAweEFBLCAweEFCLCAweENELCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsIDB4Q0MsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRCwgMHhERCwgMHhERCwgMHhERSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5RSwgMHhGRSwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRSwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRCwgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDQywgMHhDRCwgMHhERCwgMHg5RCwgMHhGRSwKKyAgICAweERELCAweENDLCAweENCLCAweEJCLCAweEJDLCAweENDLCAweERELCAweEVFLCAweEZFLCAweERFLCAweERELCAweENDLAorICAgIDB4QkIsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4REQsIDB4RUUsIDB4RUQsIDB4REQsIDB4Q0IsIDB4QUEsIDB4QTksCisgICAgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhERCwgMHhFRCwgMHhDRCwgMHhDQiwgMHhBQSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDk5LCAweEFCLCAweEJDLCAweERFLCAweERDLCAweENCLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhDQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhERCwKKyAgICAweEJCLCAweEE5LCAweDg3LCAweDY2LCAweDU0LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweENELCAweENCLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4QkMsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhDQSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENDLCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU2LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhDQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg4OCwgMHg5QSwgMHhCQiwKKyAgICAweENELCAweERDLCAweERDLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENELCAweERELAorICAgIDB4REUsIDB4REMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REUsIDB4REQsIDB4RUQsCisgICAgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhERSwgMHhGRSwgMHhERSwgMHhFRCwgMHhEQywKKyAgICAweENDLCAweENCLCAweEJCLCAweENDLCAweERELCAweERFLCAweEVGLCAweEVELCAweEVGLCAweEVFLCAweERELCAweERELAorICAgIDB4REMsIDB4REQsIDB4REQsIDB4RUUsIDB4RkYsIDB4RkUsIDB4OEQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsCisgICAgMHhDQywgMHhDRCwgMHhERSwgMHhFRSwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4OUMsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhEQywgMHhCQywgMHhDQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJDLCAweENELCAweENCLCAweENCLCAweEFBLCAweDk5LCAweDk4LAorICAgIDB4ODgsIDB4OTksIDB4OTksIDB4QUIsIDB4QkMsIDB4REMsIDB4QkIsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQywgMHhCQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEFCLCAweENCLCAweEFCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QkIsCisgICAgMHhBQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhCQSwgMHhBOSwKKyAgICAweDg4LCAweDc2LCAweDU1LCAweDU1LCAweDU1LCAweDY3LCAweDc4LCAweDlBLCAweEJCLCAweEFBLCAweDk4LCAweDg3LAorICAgIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QkEsIDB4QTksIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY2LCAweDc4LCAweDk5LCAweEFCLCAweEJBLCAweEJBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QUEsIDB4QkIsIDB4QUIsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksIDB4OUEsCisgICAgMHhCQywgMHhCQiwgMHhCQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4NywgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhDQiwKKyAgICAweEJDLCAweEJCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweENELCAweENCLCAweERDLAorICAgIDB4QkIsIDB4QUEsIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REMsIDB4QkQsIDB4Q0MsIDB4QkIsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhDQywgMHhERSwgMHhDQywgMHhFRCwgMHhDQywgMHhDQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJDLCAweENELCAweERFLCAweEVELCAweDhDLCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REQsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFCLCAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJCLCAweDlCLCAweENCLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REIsIDB4QkIsIDB4QkEsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhCQSwgMHhCQSwgMHhBOSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENCLCAweEFCLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc4LAorICAgIDB4ODgsIDB4ODksIDB4QUEsIDB4QkIsIDB4QkEsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5OSwgMHhBQSwgMHhCQSwgMHg5QSwgMHg5OSwgMHg4NywgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEE5LCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEJBLAorICAgIDB4OUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUEsIDB4QTksIDB4QTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEE5LCAweEE5LCAweDg4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQSwgMHhBOSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3NywKKyAgICAweDg5LCAweDlBLCAweEJBLCAweEFBLCAweEE5LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QUIsIDB4QUEsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OTksIDB4QUIsIDB4QkIsCisgICAgMHhBQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhCQSwgMHhDQiwKKyAgICAweEFBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENCLCAweEJDLCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0QsIDB4QkIsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QkEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhEQywgMHg5QiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEFCLCAweEJCLCAweENDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHg5QywgMHhEQywKKyAgICAweENCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweENELCAweERDLCAweEJDLCAweEJCLCAweEFBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4QkIsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTgsCisgICAgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQiwgMHhCQywgMHhDQiwgMHhBQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg3OCwKKyAgICAweDg4LCAweDk5LCAweEFCLCAweEJDLCAweEJBLCAweEJBLCAweDk5LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QUIsIDB4Q0IsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhCQiwKKyAgICAweEFBLCAweDk4LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEFBLCAweEE5LAorICAgIDB4ODcsIDB4NzYsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4OTgsIDB4ODcsCisgICAgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEJBLCAweEFBLCAweDk5LCAweDg3LCAweDc2LCAweDY1LCAweDU2LAorICAgIDB4NjcsIDB4NzgsIDB4OTksIDB4QUIsIDB4QUEsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg4OSwgMHhBQSwgMHhCQiwgMHhBQiwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweEJBLCAweEJCLCAweEE5LCAweDk4LCAweDg4LCAweDg3LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENCLAorICAgIDB4QkMsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkIsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhEQiwgMHhCRCwgMHhDQywgMHhCQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweENDLCAweERELCAweENDLCAweENCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4REMsIDB4OEMsIDB4Q0IsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4REMsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4OEQsIDB4RUUsCisgICAgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwgMHhDQywgMHhDQywgMHhERCwgMHhFRSwgMHhGRCwgMHhERCwgMHhEQywgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFCLCAweEJCLCAweEJDLCAweERELCAweEVGLCAweERELCAweERDLCAweENCLCAweEFBLCAweEE5LAorICAgIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4REQsIDB4RUQsIDB4Q0MsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg5OSwgMHhBQiwgMHhCQywgMHhERCwgMHhEQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweENDLCAweERDLCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4Q0IsIDB4QkIsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REMsCisgICAgMHhCQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NCwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENDLCAweEJCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NCwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhCQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY3LCAweDg4LCAweDlCLCAweEJELCAweENDLCAweENCLCAweEE5LCAweDg4LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0QsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QUIsCisgICAgMHhDRCwgMHhDQywgMHhEQywgMHhCQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQiwgMHhDRCwgMHhERCwKKyAgICAweERELCAweENDLCAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweERFLCAweERELCAweEVELAorICAgIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0QsIDB4REUsIDB4RUUsIDB4REUsIDB4REQsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhGRiwgMHhFRCwgMHhGRiwgMHhERSwgMHhERCwgMHhEQywKKyAgICAweENDLCAweENELCAweERELCAweEVFLCAweEVGLCAweEZFLCAweDlELCAweERELCAweENDLCAweENDLCAweENDLCAweENDLAorICAgIDB4Q0QsIDB4REQsIDB4REUsIDB4RUUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEVGLCAweEZGLCAweEZGLCAweEZFLCAweEVGLCAweERELCAweERELCAweERELCAweERELCAweERELCAweDlGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUUsIDB4REUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRCwgMHhEQywgMHhDQywKKyAgICAweEJCLCAweEJDLCAweENELCAweERFLCAweEZGLCAweEZFLCAweEZGLCAweEZFLCAweERDLCAweEJBLCAweEFBLCAweEFBLAorICAgIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhFRiwgMHhGRiwgMHhFRiwgMHhEQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhDRCwKKyAgICAweEZGLCAweEVFLCAweEVELCAweENBLCAweDk4LCAweDY2LCAweDU1LCAweDY2LCAweDg5LCAweEFCLCAweERFLCAweEZGLAorICAgIDB4RUUsIDB4REIsIDB4QTgsIDB4NzYsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OEEsIDB4Q0QsIDB4RkYsIDB4RkUsIDB4RkQsCisgICAgMHhCQSwgMHg4NiwgMHg1NCwgMHgzMywgMHg0NSwgMHg3OCwgMHhBQiwgMHhERSwgMHhGRiwgMHhERSwgMHhEQiwgMHhBOCwKKyAgICAweDc1LCAweDQzLCAweDM0LCAweDU2LCAweDhBLCAweEJELCAweEVGLCAweEZFLCAweEZELCAweEJBLCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NDUsIDB4NzgsIDB4QUIsIDB4REUsIDB4RkYsIDB4RUUsIDB4REMsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsCisgICAgMHg2OCwgMHg5QSwgMHhDRCwgMHhGRiwgMHhGRSwgMHhGRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg3NywgMHg5QSwKKyAgICAweEJDLCAweEVGLCAweEZGLCAweEVGLCAweEZELCAweENCLCAweEE5LCAweDg4LCAweDg4LCAweDlBLCAweEJDLCAweERGLAorICAgIDB4RkYsIDB4RkQsIDB4RkUsIDB4REMsIDB4Q0IsIDB4QUEsIDB4OUEsIDB4QUEsIDB4QkMsIDB4REYsIDB4RkYsIDB4RkYsCisgICAgMHhERiwgMHhGRSwgMHhERCwgMHhDQywgMHhCQiwgMHhCQiwgMHhDRCwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwKKyAgICAweEZFLCAweEVELCAweERDLCAweERDLCAweERELCAweEVFLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEVFLAorICAgIDB4RUYsIDB4RUQsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RCwgMHhERCwgMHhDRCwgMHhERSwgMHhERCwgMHhERiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERSwgMHhERCwgMHhERCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhERCwgMHg5RSwgMHhGRSwKKyAgICAweEVELCAweERELCAweENDLCAweENDLCAweENDLCAweERELCAweERFLCAweEVGLCAweEZELCAweEVFLCAweEVELCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RUQsIDB4RUQsIDB4Q0MsIDB4QkEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERSwgMHhGRCwgMHhERSwgMHhDQywgMHhCQSwgMHg5OSwgMHg5OCwgMHg5OSwKKyAgICAweDlBLCAweEFCLCAweENELCAweERFLCAweERELCAweERDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QUIsIDB4Q0QsIDB4RUQsIDB4Q0QsIDB4Q0IsIDB4QTgsIDB4ODcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkMsCisgICAgMHhERCwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhERCwKKyAgICAweENDLCAweEJBLCAweDk3LCAweDY1LCAweDU0LCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweENCLAorICAgIDB4QTksIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4ODcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDlBLCAweEJDLCAweERELCAweENELCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUMsIDB4Q0UsIDB4REMsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjYsIDB4NjcsIDB4ODksCisgICAgMHhBQiwgMHhDRCwgMHhFRCwgMHhDRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OCwgMHg5QSwgMHhCQywKKyAgICAweERFLCAweEVDLCAweERELCAweENCLCAweEFBLCAweDk5LCAweDg5LCAweDk5LCAweEFBLCAweEJDLCAweERFLCAweEVFLAorICAgIDB4REQsIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4REQsIDB4RUYsIDB4RUMsIDB4RUQsCisgICAgMHhEQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhFRiwgMHhGRSwgMHhERiwgMHhFRSwgMHhERCwKKyAgICAweENDLCAweENDLCAweENDLCAweENELCAweEVELCAweEZFLCAweEZGLCAweEZDLCAweEZGLCAweEZFLCAweEVELCAweERELAorICAgIDB4REQsIDB4REQsIDB4RUUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4OUQsIDB4RUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsCisgICAgMHhFRCwgMHhERSwgMHhFRiwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4REQsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4QUUsIDB4RUUsCisgICAgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHhFRSwgMHhFRSwgMHhERSwgMHhERCwgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweENELCAweERFLCAweERELCAweERDLCAweENCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OUEsIDB4QUEsIDB4QkMsIDB4Q0QsIDB4RUQsIDB4REQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHhBQSwgMHhCQywgMHhDRCwgMHhEQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFBLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REMsIDB4Q0EsIDB4OTgsIDB4NzcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4REMsCisgICAgMHhCQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU0LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENDLCAweEJCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhCQywgMHhBQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDc4LCAweDlBLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzgsIDB4OTksIDB4QUIsCisgICAgMHhDRCwgMHhEQywgMHhEQywgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhDRCwgMHhFRCwKKyAgICAweENELCAweENDLCAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweERFLCAweEVELCAweEVELAorICAgIDB4Q0MsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REUsIDB4RkUsIDB4REUsIDB4REQsIDB4Q0MsCisgICAgMHhDQywgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhERSwgMHhGRiwgMHhFRCwgMHhGRSwgMHhFRCwgMHhERCwgMHhDQywKKyAgICAweENDLCAweENELCAweERELCAweEVFLCAweEVGLCAweEZGLCAweEFELCAweERELCAweERDLCAweENDLCAweENDLCAweENDLAorICAgIDB4Q0QsIDB4REQsIDB4RUUsIDB4RUYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweEVELCAweERELCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweERELCAweDlFLCAweEZGLAorICAgIDB4RUUsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RkQsIDB4RUYsIDB4RUQsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhFRiwgMHhERCwgMHhFRCwgMHhDQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweENDLCAweERELCAweEVELCAweERFLCAweERDLCAweEJBLCAweEE5LCAweDk4LCAweDg5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4REQsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhDRCwgMHhFRCwgMHhDRCwgMHhDQiwgMHhBOCwgMHg4NywgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwKKyAgICAweENELCAweERDLCAweERCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERELAorICAgIDB4Q0MsIDB4QkEsIDB4OTcsIDB4NjUsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweEFCLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg4OCwKKyAgICAweDlBLCAweEJDLCAweERELCAweENELCAweENCLCAweEE5LCAweDk4LCAweDg3LCAweDc4LCAweDg5LCAweDlBLCAweEJDLAorICAgIDB4Q0QsIDB4REQsIDB4REMsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTgsIDB4OTksIDB4OUEsIDB4QkIsIDB4Q0QsIDB4REQsCisgICAgMHhERSwgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhERCwgMHhERCwgMHhFRCwKKyAgICAweERDLCAweENCLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERFLCAweEVELCAweERFLCAweEVELCAweERELAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUYsIDB4REQsIDB4RkUsIDB4RUUsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRiwgMHhGRSwgMHg5RCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhDQywKKyAgICAweERELCAweERELCAweERFLCAweERFLCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERiwgMHhGRiwgMHhGRSwgMHhFRSwgMHhERCwgMHhERCwgMHhEQywgMHhDQywgMHhERCwgMHhDRCwgMHg4RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZFLCAweERFLCAweEVFLCAweERGLCAweEVGLCAweEZGLCAweEZFLCAweEVGLCAweEZGLCAweEZGLAorICAgIDB4REQsIDB4REMsIDB4Q0MsIDB4REQsIDB4REUsIDB4RUUsIDB4RkYsIDB4REYsIDB4RkYsIDB4RUUsIDB4REMsIDB4Q0IsCisgICAgMHhCQiwgMHhCQywgMHhDRCwgMHhERCwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRCwgMHhEQywgMHhCQSwgMHhBQSwgMHhBQSwKKyAgICAweEFCLCAweENELCAweEVFLCAweEZGLCAweEVFLCAweEVFLCAweENDLCAweEJBLCAweDk4LCAweDg4LCAweDg5LCAweEFCLAorICAgIDB4Q0MsIDB4RUYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QkEsIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODksIDB4QUIsIDB4Q0QsCisgICAgMHhFRiwgMHhGRSwgMHhFRCwgMHhDQSwgMHg5NywgMHg2NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQywgMHhERSwgMHhGRSwKKyAgICAweEVFLCAweERCLCAweEE4LCAweDc1LCAweDQ0LCAweDQ1LCAweDY3LCAweDhBLCAweEJELCAweEVFLCAweEVELCAweEZDLAorICAgIDB4QkEsIDB4ODcsIDB4NTQsIDB4MzMsIDB4NDUsIDB4NzgsIDB4OUIsIDB4REUsIDB4RkYsIDB4REQsIDB4Q0IsIDB4QTgsCisgICAgMHg3NSwgMHg0MywgMHgzNCwgMHg1NywgMHg4QSwgMHhCQywgMHhFRiwgMHhGRCwgMHhEQywgMHhCQSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDQ1LCAweDc4LCAweEFCLCAweERFLCAweEZGLCAweERFLCAweERDLCAweEE5LCAweDg3LCAweDY1LCAweDU1LAorICAgIDB4NjgsIDB4OUEsIDB4Q0QsIDB4RUYsIDB4RkQsIDB4RUQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzgsIDB4OUEsCisgICAgMHhCQywgMHhFRiwgMHhGRiwgMHhERSwgMHhFQywgMHhDQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg5QSwgMHhCQywgMHhERCwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweERDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJDLCAweERELCAweEVGLCAweEZGLAorICAgIDB4RUYsIDB4RkUsIDB4REQsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkUsCisgICAgMHhFRSwgMHhERCwgMHhEQywgMHhDQywgMHhDRCwgMHhERiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwKKyAgICAweEVFLCAweEVELCAweEVFLCAweEVFLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEVGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEQsIDB4REQsIDB4REUsIDB4RUQsIDB4REUsIDB4RkYsCisgICAgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0YsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0IsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4OEUsIDB4RkUsCisgICAgMHhFRCwgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhFRSwgMHhFRiwgMHhGRCwgMHhERSwgMHhFRCwgMHhDQywKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERFLCAweEVGLCAweEVELCAweEVELCAweENCLCAweEJBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RkQsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTksIDB4OTksIDB4OTksCisgICAgMHg5QSwgMHhBQiwgMHhDRCwgMHhFRSwgMHhEQywgMHhEQywgMHhCQSwgMHg5OCwgMHg4OCwgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweENELCAweEVELCAweENDLCAweENBLCAweDk4LCAweDg3LCAweDY2LCAweDY3LCAweDc4LCAweDlBLCAweEJCLAorICAgIDB4REQsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REQsCisgICAgMHhDQywgMHhCQSwgMHg5OCwgMHg2NiwgMHg1NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwKKyAgICAweEE4LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDlBLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk3LAorICAgIDB4NjUsIDB4NDQsIDB4MzQsIDB4NTYsIDB4NzksIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NiwgMHg2OCwgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY3LCAweDg4LAorICAgIDB4OUEsIDB4QkMsIDB4RUQsIDB4Q0QsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkMsCisgICAgMHhERSwgMHhEQywgMHhEQywgMHhDQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg5OSwgMHg5QSwgMHhCQywgMHhDRCwgMHhFRSwKKyAgICAweERFLCAweERDLCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEJDLCAweENELCAweERGLCAweEVELCAweEVELAorICAgIDB4REMsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4RUUsIDB4RkUsIDB4REUsIDB4RUQsIDB4REQsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhFRiwgMHhGRiwgMHhFRCwgMHhGRSwgMHhFRSwgMHhFRCwgMHhERCwKKyAgICAweENELCAweERELCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweDdDLCAweENDLCAweENDLCAweENDLCAweERDLCAweENELAorICAgIDB4REQsIDB4REUsIDB4RUUsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJDLCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweEJDLCAweDhDLCAweERELAorICAgIDB4Q0IsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REMsIDB4Q0MsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERCwgMHhDQiwgMHhDQiwgMHhCQSwgMHhBOSwgMHg5OSwKKyAgICAweDg5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweERDLCAweEJCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4QkIsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5QSwgMHhBQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweEJBLCAweEFBLCAweDk4LCAweDc3LCAweDY2LCAweDU1LCAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweENCLAorICAgIDB4QUEsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QUIsIDB4QkEsIDB4QTksCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHg5QSwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4NywKKyAgICAweDY2LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDk5LCAweEFCLCAweEJBLCAweEFBLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUEsIDB4QkIsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjUsIDB4NTYsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhBQiwgMHhCQSwgMHhCQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDg5LCAweEFCLCAweENCLCAweEJCLCAweEFBLCAweDk5LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweDlBLAorICAgIDB4QkMsIDB4QkIsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4Q0MsCisgICAgMHhCQywgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhDQiwgMHhDQywKKyAgICAweENCLCAweEFBLCAweEE5LCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERDLCAweEJELCAweERDLCAweEJCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REUsIDB4Q0MsIDB4REQsIDB4REMsIDB4Q0MsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhERCwgMHhFRCwgMHg4QywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweEJDLCAweENDLCAweERELCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQiwgMHhCQSwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQiwgMHg5QiwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweENCLCAweEJDLCAweEJBLCAweEFBLAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MsIDB4QkEsIDB4QkIsIDB4QTksIDB4OTksIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3OCwKKyAgICAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweEJBLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OTksIDB4QUEsIDB4QkEsIDB4QUEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhCQSwKKyAgICAweDlBLCAweDk4LCAweDc3LCAweDY2LCAweDU1LCAweDU2LCAweDY2LCAweDc4LCAweDg5LCAweEFBLCAweEE5LCAweEE5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4OUEsIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEFBLCAweDlBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzgsIDB4ODksIDB4QUEsIDB4QTksIDB4QTksIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEFCLCAweEFBLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc4LCAweDg4LCAweDk5LCAweEFCLCAweEJCLAorICAgIDB4QUIsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkMsIDB4QkIsIDB4Q0IsCisgICAgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQywgMHhDQiwgMHhCQywgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweENCLCAweERDLCAweENCLCAweEJCLCAweEJBLAorICAgIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REMsIDB4OUIsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhCQiwgMHhCQywgMHhDQywgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUMsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4OEMsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhEQywgMHhCRCwgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweENCLCAweENCLCAweEJBLCAweEE5LCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4REIsIDB4QkIsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhCQiwgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwKKyAgICAweDlBLCAweEJCLCAweENCLCAweEFCLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweDlBLAorICAgIDB4QkIsIDB4QkEsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkIsCisgICAgMHhBQSwgMHg5OSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5OSwgMHhCQiwgMHhCQSwgMHhBOSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFBLCAweEJCLCAweEFBLCAweDk5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QkEsIDB4QUEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg4OSwgMHg5QSwgMHhCQiwgMHhBQiwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY3LCAweDc4LCAweDlBLCAweEFCLCAweEJBLCAweEJBLCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4ODksIDB4QUIsIDB4QkIsIDB4QkIsIDB4QkEsIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4OUEsCisgICAgMHhCQywgMHhCQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQiwKKyAgICAweEJDLCAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweENCLCAweERDLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4OTksIDB4OUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REMsIDB4Q0QsIDB4Q0MsIDB4Q0IsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhERCwgMHhDQywgMHhERCwgMHhDQywgMHhDQywgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweENDLCAweENDLCAweERFLCAweEVELCAweDhDLCAweENCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweERGLCAweEVFLCAweEVELCAweERDLCAweENDLCAweEJDLCAweENDLCAweENDLCAweERDLCAweENELCAweDdFLCAweEZGLAorICAgIDB4RUUsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUUsIDB4RUYsIDB4RkQsIDB4RUYsIDB4RUQsIDB4REMsCisgICAgMHhDQywgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhFRSwgMHhGRiwgMHhFRCwgMHhFRSwgMHhEQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweENELCAweERGLCAweEZFLCAweERFLCAweERDLCAweEJBLCAweEE5LCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RUQsIDB4RUMsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQiwgMHhERCwgMHhFRCwgMHhERCwgMHhDQiwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweENFLCAweERELCAweERCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweENELCAweEVELAorICAgIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsCisgICAgMHhBOSwgMHg3NiwgMHg1NCwgMHgzNCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDM0LCAweDU2LCAweDc5LCAweEFCLCAweENELCAweEVDLCAweENCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTYsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRSwgMHhERCwgMHhEQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweENELCAweEVELCAweERELCAweENCLCAweEFBLCAweDk4LCAweDg3LCAweDc4LCAweDg5LCAweDlBLCAweEJDLAorICAgIDB4REYsIDB4RUQsIDB4RUQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODksIDB4OTksIDB4QUEsIDB4QkMsIDB4REUsIDB4RUYsCisgICAgMHhERSwgMHhERCwgMHhDQywgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhGRSwgMHhGRCwgMHhGRSwKKyAgICAweERELCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweERELCAweEZGLCAweEZGLCAweERGLCAweEVGLCAweEVELAorICAgIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4RUUsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RUYsIDB4RUUsIDB4RkUsIDB4REQsCisgICAgMHhERCwgMHhFRCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwKKyAgICAweEVELCAweEZFLCAweEVGLCAweEZGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRCwgMHhERCwgMHhERCwgMHhERCwgMHhDQywgMHg4RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEZFLCAweEVGLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkUsIDB4Q0QsIDB4REMsIDB4REQsIDB4REQsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4REMsIDB4Q0MsCisgICAgMHhCQywgMHhCQywgMHhERCwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhERCwgMHhCQiwgMHhBQSwgMHhBQSwKKyAgICAweEJCLCAweENDLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweERDLCAweEJBLCAweDk4LCAweDg4LCAweDg5LCAweEFCLAorICAgIDB4Q0MsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NzcsIDB4ODksIDB4QUIsIDB4REQsCisgICAgMHhGRiwgMHhGRiwgMHhGRSwgMHhDQiwgMHg5OCwgMHg2NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQywgMHhERiwgMHhGRiwKKyAgICAweEZGLCAweERCLCAweEE4LCAweDc1LCAweDQ0LCAweDQ1LCAweDY3LCAweDhBLCAweENELCAweEZGLCAweEZGLCAweEZELAorICAgIDB4QkEsIDB4ODcsIDB4NTQsIDB4MzMsIDB4NDUsIDB4NzgsIDB4QUIsIDB4Q0UsIDB4RkYsIDB4RUYsIDB4Q0IsIDB4QTgsCisgICAgMHg3NSwgMHg0MywgMHgzNCwgMHg1NywgMHg4QSwgMHhCRCwgMHhGRiwgMHhGRSwgMHhGRCwgMHhDQSwgMHg5NywgMHg2NSwKKyAgICAweDQ0LCAweDQ1LCAweDc4LCAweEFCLCAweERELCAweEZGLCAweEVGLCAweERDLCAweEE5LCAweDg3LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4OUEsIDB4Q0UsIDB4RkYsIDB4RkUsIDB4RkYsIDB4REIsIDB4QTksIDB4ODcsIDB4NzYsIDB4NzcsIDB4OUEsCisgICAgMHhCQywgMHhGRiwgMHhGRiwgMHhFRiwgMHhGQywgMHhDQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg5QSwgMHhCQywgMHhERiwKKyAgICAweEZGLCAweEZFLCAweEZFLCAweERDLCAweENCLCAweEFBLCAweEFBLCAweEFBLCAweEJDLCAweERFLCAweEZGLCAweEZGLAorICAgIDB4REYsIDB4RkUsIDB4REMsIDB4REMsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsCisgICAgMHhGRSwgMHhFRCwgMHhERCwgMHhEQywgMHhERSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwKKyAgICAweEVGLCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEMsIDB4REMsIDB4REMsIDB4REUsIDB4RkUsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REUsIDB4RUUsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4OEYsIDB4RkYsCisgICAgMHhFRSwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhGRSwgMHhFRCwgMHhGRiwgMHhGRSwgMHhERCwKKyAgICAweENDLCAweENDLCAweENDLCAweENDLCAweENELCAweERELCAweEVGLCAweERELCAweEVFLCAweERDLCAweENCLCAweEJCLAorICAgIDB4QUIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RUQsIDB4REUsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTksCisgICAgMHhBQSwgMHhCQywgMHhDRCwgMHhFRSwgMHhERCwgMHhERCwgMHhDQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweERELCAweEVELCAweENELCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4REQsIDB4REMsIDB4QkEsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REQsCisgICAgMHhDRCwgMHhDQSwgMHg5OCwgMHg3NiwgMHg1NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhBQywgMHhERSwgMHhEQywgMHhEQiwKKyAgICAweEE5LCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDc4LCAweDlBLCAweENELCAweERELCAweENELCAweENBLCAweDk4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTYsIDB4ODksIDB4QUMsIDB4Q0UsIDB4REMsIDB4REMsIDB4QkEsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg3OCwgMHg5QSwgMHhDRCwgMHhFRCwgMHhDRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDhBLCAweEJDLCAweERFLCAweERDLCAweERDLCAweEJBLCAweDk4LCAweDg3LCAweDc2LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUUsIDB4Q0QsIDB4REMsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODksIDB4QUIsIDB4Q0QsCisgICAgMHhERiwgMHhEQywgMHhFRCwgMHhDQiwgMHhCQSwgMHhBOSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhFRiwgMHhGRSwKKyAgICAweENFLCAweERELCAweENDLCAweEJCLCAweEFBLCAweEJCLCAweEJCLCAweENDLCAweERFLCAweEZGLCAweEVELCAweEVELAorICAgIDB4RUQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REUsIDB4RkYsIDB4RkYsIDB4REUsIDB4RUUsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRCwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweERFLCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweDhELCAweERELCAweERELCAweERELCAweERELCAweERELAorICAgIDB4RUQsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweERGLCAweEVELCAweERDLCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweENDLCAweEFFLCAweEZFLAorICAgIDB4RUQsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUQsIDB4RUUsIDB4REQsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhERSwgMHhERCwgMHhEQywgMHhDQiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENELCAweERDLCAweERELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QkMsIDB4Q0QsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweEJDLCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweENDLAorICAgIDB4QkIsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhCQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweEJBLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQiwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REMsIDB4Q0IsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0QsIDB4RUQsCisgICAgMHhDRCwgMHhDQiwgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhERSwgMHhFQywgMHhERCwKKyAgICAweENDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENELCAweERFLCAweEZFLCAweENFLCAweERELCAweENDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RkYsIDB4RkMsIDB4RUUsIDB4REQsIDB4REMsIDB4Q0MsCisgICAgMHhDQywgMHhDQywgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHg5RCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywKKyAgICAweERELCAweERFLCAweEVFLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhFRiwgMHhGRiwgMHhFRCwgMHhERCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHg4RiwgMHhGRiwKKyAgICAweEVFLCAweERELCAweERDLCAweENDLCAweENDLCAweERELCAweERELCAweEVFLCAweEVELCAweEZGLCAweEZELCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REQsIDB4RUUsIDB4REYsIDB4RkUsIDB4REMsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERSwgMHhGRCwgMHhFRiwgMHhEQywgMHhCQSwgMHg5OSwgMHg5OCwgMHg5OSwKKyAgICAweDlBLCAweEFCLCAweENDLCAweERFLCAweERFLCAweEVDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QUIsIDB4Q0QsIDB4RUQsIDB4REQsIDB4Q0IsIDB4QTgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkMsCisgICAgMHhERCwgMHhERCwgMHhEQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhERCwKKyAgICAweERELCAweEJBLCAweDk3LCAweDY1LCAweDU0LCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweENCLAorICAgIDB4QTksIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDlBLCAweEJDLCAweEVELCAweENELCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4REUsIDB4RUMsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4ODgsCisgICAgMHhBQiwgMHhDRCwgMHhFRSwgMHhERCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OCwgMHg5QSwgMHhCQywKKyAgICAweEVGLCAweEVELCAweERELCAweENCLCAweEFBLCAweDk5LCAweDk4LCAweDk5LCAweDlBLCAweEJDLCAweERFLCAweEZFLAorICAgIDB4REQsIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4REUsIDB4RkYsIDB4RkQsIDB4RkUsCisgICAgMHhEQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERSwgMHhGRiwgMHhGRiwgMHhERSwgMHhERCwgMHhERCwKKyAgICAweERDLCAweENDLCAweENDLCAweENELCAweERFLCAweEZGLCAweEZGLCAweEZELCAweEZFLCAweEVELCAweERELCAweEVELAorICAgIDB4REQsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEMsIDB4REMsIDB4REQsIDB4Q0QsIDB4REQsIDB4REUsCisgICAgMHhERSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4REQsIDB4REMsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4N0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZELCAweERELCAweERELCAweERELCAweERGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweERELCAweENCLAorICAgIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4REMsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhCQiwgMHhDQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQiwgMHhCQSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhBQiwKKyAgICAweENDLCAweERGLCAweEZGLCAweEZGLCAweERDLCAweEJBLCAweDk3LCAweDc3LCAweDc3LCAweDg5LCAweEFCLCAweENELAorICAgIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4OTgsIDB4NjUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QkMsIDB4REYsIDB4RkYsCisgICAgMHhGRiwgMHhEQywgMHhBOCwgMHg3NSwgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCRCwgMHhGRiwgMHhGRiwgMHhGRCwKKyAgICAweEJBLCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDc4LCAweEFCLCAweERGLCAweEZGLCAweEZGLCAweERDLCAweDk4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTYsIDB4OEEsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0EsIDB4OTcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg3OCwgMHhBQywgMHhERiwgMHhGRiwgMHhFRiwgMHhEQywgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwKKyAgICAweDY4LCAweDlBLCAweENFLCAweEZGLCAweEZGLCAweEZFLCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDc4LCAweDlBLAorICAgIDB4QkMsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4OUEsIDB4QkMsIDB4REYsCisgICAgMHhGRiwgMHhGRCwgMHhGRiwgMHhERCwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQywgMHhERSwgMHhGRiwgMHhGRiwKKyAgICAweERGLCAweEZELCAweERELCAweENCLCAweEJCLCAweEJCLCAweENELCAweERGLCAweEZGLCAweEZGLCAweEZELCAweEZGLAorICAgIDB4REYsIDB4REQsIDB4REMsIDB4REMsIDB4REQsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkUsCisgICAgMHhFRiwgMHhFRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDhDLCAweENELCAweERELCAweEVELCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEVGLCAweEZGLCAweEVGLCAweEVFLCAweERELCAweERELCAweERELCAweERELCAweERDLCAweERELCAweDdGLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4RUQsIDB4RUUsIDB4REUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsCisgICAgMHhEQywgMHhDQywgMHhDRCwgMHhERCwgMHhFRSwgMHhFRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRCwgMHhEQywgMHhDQiwKKyAgICAweEJCLCAweEJDLCAweENELCAweENGLCAweEZGLCAweEZFLCAweEZGLCAweEZELCAweERCLCAweEJBLCAweEFBLCAweEFBLAorICAgIDB4QUIsIDB4Q0MsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkQsIDB4REMsIDB4QUEsIDB4OTksIDB4ODksIDB4OTksIDB4QUIsCisgICAgMHhCQywgMHhERiwgMHhGRiwgMHhGRCwgMHhEQywgMHhCQSwgMHg5OCwgMHg3NywgMHg3OCwgMHg4OSwgMHhBQiwgMHhDRCwKKyAgICAweEZGLCAweEVGLCAweEVELCAweENBLCAweDk4LCAweDc2LCAweDU2LCAweDY3LCAweDg5LCAweEJDLCAweERFLCAweEZFLAorICAgIDB4REUsIDB4Q0IsIDB4QTksIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjgsIDB4OUEsIDB4QkMsIDB4RUYsIDB4RUUsIDB4RUQsCisgICAgMHhCQSwgMHg4NywgMHg2NCwgMHgyMywgMHg0NiwgMHg3OCwgMHhBQiwgMHhERCwgMHhGRSwgMHhGRSwgMHhEQiwgMHhBOSwKKyAgICAweDc2LCAweDQzLCAweDI0LCAweDU3LCAweDhBLCAweEJELCAweERFLCAweEVELCAweEZELCAweEJBLCAweDk4LCAweDY1LAorICAgIDB4NDQsIDB4NTYsIDB4NzksIDB4QUIsIDB4Q0QsIDB4RkYsIDB4REQsIDB4REMsIDB4QjksIDB4ODcsIDB4NjYsIDB4NTYsCisgICAgMHg3OCwgMHg5QSwgMHhCRCwgMHhFRiwgMHhGRCwgMHhGRCwgMHhDQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3OCwgMHg5QSwKKyAgICAweEJDLCAweERFLCAweEZGLCAweERFLCAweERDLCAweEJCLCAweEE5LCAweDk4LCAweDg5LCAweDlBLCAweEFDLCAweERFLAorICAgIDB4RkYsIDB4RkUsIDB4RkUsIDB4REQsIDB4Q0IsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4RUYsIDB4RkYsCisgICAgMHhERiwgMHhFRCwgMHhEQywgMHhDQywgMHhCQiwgMHhCQiwgMHhCQywgMHhERCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwKKyAgICAweEVGLCAweERELCAweERDLCAweENDLCAweERELCAweERELCAweEVGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEVFLAorICAgIDB4RUUsIDB4REQsIDB4REUsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUQsCisgICAgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3QywgMHhDQywgMHhDQywgMHhERCwgMHhEQywgMHhDRSwKKyAgICAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCQywgMHhDQywgMHhCQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQSwgMHhCQiwgMHhCQiwgMHg4RCwgMHhFRCwKKyAgICAweERDLCAweENCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweENELCAweEVDLCAweENELCAweENDLCAweEJCLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REQsIDB4Q0MsIDB4REMsIDB4QkEsIDB4QTksIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhEQywgMHhCQywgMHhCQSwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEFCLCAweENELCAweEJCLCAweEJCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4OUEsIDB4QkMsIDB4Q0MsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4OUEsCisgICAgMHhCQywgMHhCQiwgMHhCQSwgMHg5OCwgMHg3NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhDQiwKKyAgICAweEFCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweEJBLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0IsIDB4QUIsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhCQSwgMHhCQSwgMHg5OCwgMHg3NywgMHg2NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENCLCAweEFCLCAweEE5LCAweDg4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4QkEsIDB4QTksIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg4OSwgMHhBQiwgMHhDQywgMHhCQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHhBQiwKKyAgICAweEJDLCAweENCLCAweENCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweEFBLCAweEJDLCAweERDLAorICAgIDB4QkMsIDB4Q0IsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4REQsIDB4REIsIDB4Q0MsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQywgMHhDRCwgMHhFRCwgMHhDRCwgMHhDQywgMHhDQywKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweENELCAweEVGLCAweEVDLCAweERELCAweERELCAweENDLCAweENDLAorICAgIDB4Q0IsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUUsIDB4RkUsIDB4OEMsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsCisgICAgMHhDQywgMHhDQywgMHhERSwgMHhERSwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUMsIDB4QkEsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUEsIDB4QkIsIDB4OUIsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhBOSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhDQiwgMHhCQywgMHhCQSwgMHhBOSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweEJDLCAweEJCLCAweEJBLCAweEE5LCAweDk4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QUIsIDB4Q0IsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzgsCisgICAgMHg4OCwgMHg5OSwgMHg5QSwgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDk5LCAweEFBLCAweEJBLCAweEFBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4QTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkEsCisgICAgMHg5QSwgMHg5OCwgMHg3NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQSwgMHhBOSwgMHhBOSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEFBLCAweDlBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsIDB4QTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc4LCAweDg5LCAweEFBLCAweEE5LCAweEE5LCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhCQSwgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQiwKKyAgICAweEFCLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweEJBLCAweEJCLAorICAgIDB4QUEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0MsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhDQiwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQSwKKyAgICAweEFBLCAweEFCLCAweEJCLCAweEJDLCAweENELCAweERDLCAweDlCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJDLCAweENDLCAweEJCLCAweEJCLCAweEFBLCAweEFBLCAweEFCLCAweEFCLCAweEJCLCAweEJDLCAweDhELCAweEVELAorICAgIDB4Q0MsIDB4Q0IsIDB4QkEsIDB4QkEsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4REMsIDB4Q0QsIDB4Q0MsIDB4QkIsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhDQywgMHhDQiwgMHhCQSwgMHhBOSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJDLCAweERDLCAweEJDLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkIsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHg5QSwgMHhBQiwgMHhDQiwgMHhCQiwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweEJBLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweENCLAorICAgIDB4QUIsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkIsIDB4QkEsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhCQiwgMHhBQSwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEFCLCAweEJBLCAweEJBLCAweDk4LCAweDc3LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUIsIDB4QkIsIDB4QUIsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg3OCwgMHg5QSwgMHhCQywgMHhCQSwgMHhCQSwgMHg5OSwgMHg4NywgMHg3NywgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDg5LCAweEFCLCAweENCLCAweEJCLCAweEFBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFBLAorICAgIDB4QkMsIDB4Q0IsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkMsIDB4REMsCisgICAgMHhCQywgMHhDQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhDRCwgMHhDQiwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEE5LCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweEJELCAweENDLCAweENDLAorICAgIDB4QkIsIDB4QkEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4REMsIDB4RUQsIDB4Q0MsIDB4Q0IsIDB4QkIsCisgICAgMHhCQiwgMHhDQywgMHhDQywgMHhDRCwgMHhERSwgMHhFRSwgMHg4QywgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweENDLCAweENELCAweERELCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhFRiwgMHhGRiwgMHhFRiwgMHhFRCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHg3RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweERELCAweERDLCAweERFLCAweERFLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4REQsIDB4Q0MsIDB4QkMsIDB4Q0MsIDB4REUsIDB4RUUsIDB4RkYsIDB4RUYsIDB4RkUsIDB4RUQsIDB4Q0IsIDB4QkIsCisgICAgMHhBQiwgMHhCQiwgMHhCQywgMHhERCwgMHhFRiwgMHhGRSwgMHhFRiwgMHhFRCwgMHhDQiwgMHhBQSwgMHg5OSwgMHg5QSwKKyAgICAweEFCLCAweEJDLCAweERFLCAweEVGLCAweEVELCAweEVELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg5LCAweDlBLAorICAgIDB4QkMsIDB4REUsIDB4RkQsIDB4RUUsIDB4REIsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODksIDB4QUIsIDB4Q0QsCisgICAgMHhFRiwgMHhFRCwgMHhFQywgMHhCQSwgMHg4NywgMHg2NiwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhFRSwKKyAgICAweERFLCAweENCLCAweDk4LCAweDc2LCAweDQ0LCAweDQ1LCAweDY3LCAweDhBLCAweEJDLCAweERGLCAweEVELCAweERDLAorICAgIDB4QjksIDB4ODYsIDB4NTQsIDB4MzMsIDB4NDUsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4RUQsIDB4REQsIDB4Q0IsIDB4OTgsCisgICAgMHg3NSwgMHg0MywgMHgzNCwgMHg1NywgMHg4OSwgMHhCQywgMHhERSwgMHhGRCwgMHhERCwgMHhCQSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDQ2LCAweDc4LCAweDlCLCAweENELCAweEVGLCAweEVFLCAweENCLCAweEE5LCAweDg3LCAweDY1LCAweDU2LAorICAgIDB4NjcsIDB4OEEsIDB4QkMsIDB4REYsIDB4RkUsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHhBQywgMHhDRSwgMHhFRiwgMHhERSwgMHhEQywgMHhCQSwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OSwgMHhBQiwgMHhDRCwKKyAgICAweEVGLCAweEZELCAweEVELCAweERDLCAweEJCLCAweEE5LCAweEE5LCAweDlBLCAweEJCLCAweENELCAweEVGLCAweEZGLAorICAgIDB4RUYsIDB4RUQsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RkYsIDB4RUQsIDB4RkYsCisgICAgMHhFRCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhERSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhERCwKKyAgICAweERELCAweERELCAweERFLCAweERFLCAweEVGLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZFLCAweEVFLAorICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEQsIDB4REUsIDB4REMsIDB4RUQsIDB4REQsIDB4REUsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4REMsIDB4Q0MsIDB4N0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4Q0IsCisgICAgMHhDRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhCQiwgMHhBQSwgMHhBQiwgMHhCQywKKyAgICAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEJBLCAweDk4LCAweDg5LCAweEFCLCAweENELCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QkEsIDB4ODcsIDB4NjYsIDB4NzgsIDB4QUIsIDB4Q0QsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhEQiwgMHg5NywgMHg1NCwgMHg0NSwgMHg3OSwgMHhBQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZDLCAweEE4LCAweDY0LCAweDIyLCAweDQ2LCAweDhBLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENBLAorICAgIDB4OTYsIDB4NDIsIDB4MjQsIDB4NjgsIDB4QUMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTksIDB4NzUsCisgICAgMHg0MywgMHg1NywgMHg5QSwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwgMHhBOCwgMHg3NiwgMHg2NywKKyAgICAweDg5LCAweEJELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweENCLCAweEE5LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4Q0IsIDB4QUEsIDB4QUIsIDB4QkQsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQywgMHhCQiwgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweERDLCAweERELCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweERGLCAweEZGLCAweERGLCAweERELCAweERELCAweENDLCAweERCLCAweENDLCAweENDLCAweENDLCAweDhGLCAweEZGLAorICAgIDB4RkUsIDB4RkQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REQsIDB4REUsIDB4RkQsIDB4RkYsIDB4RkYsIDB4REQsCisgICAgMHhDQywgMHhCQiwgMHhCQiwgMHhCQywgMHhERCwgMHhERCwgMHhGRiwgMHhERiwgMHhGRCwgMHhERCwgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweEFBLCAweEFDLCAweENDLCAweEZGLCAweEZELCAweEZGLCAweERELCAweENBLCAweEE5LCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0QsIDB4RUYsIDB4REYsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksCisgICAgMHhBQywgMHhDRCwgMHhGRCwgMHhERSwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg3NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweERGLCAweEVELCAweEVDLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDY3LCAweDc4LCAweDlCLCAweEJFLCAweEZGLAorICAgIDB4REQsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REYsIDB4RkQsIDB4Q0IsCisgICAgMHhBOSwgMHg4NiwgMHg1NCwgMHgzNCwgMHg0NSwgMHg3OCwgMHg5QSwgMHhCRCwgMHhFRiwgMHhEQywgMHhCQSwgMHg5OCwKKyAgICAweDY1LCAweDQzLCAweDM0LCAweDU2LCAweDg5LCAweEFDLCAweERFLCAweEZDLCAweERCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REYsIDB4REQsIDB4QkIsIDB4QTgsIDB4NzcsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg4QSwgMHhBQywgMHhERiwgMHhGQywgMHhEQywgMHhCQSwgMHg5OCwgMHg3NywgMHg3NiwgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweENFLCAweEVGLCAweENELCAweENCLCAweEFBLCAweDk4LCAweDg4LCAweDg4LCAweDg5LCAweEFCLCAweENELAorICAgIDB4REYsIDB4RkQsIDB4RUQsIDB4Q0IsIDB4QkEsIDB4QTksIDB4OTksIDB4OUEsIDB4QUEsIDB4Q0QsIDB4RkYsIDB4RkYsCisgICAgMHhERSwgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhERSwgMHhGRiwgMHhGRCwgMHhGRCwKKyAgICAweERELCAweENDLCAweENCLCAweEJCLCAweENDLCAweERELCAweEZFLCAweEZGLCAweEZGLCAweENFLCAweEVELCAweEVELAorICAgIDB4REMsIDB4Q0MsIDB4REQsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RUYsCisgICAgMHhFRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RCwgMHhERCwgMHhERSwgMHhFRiwgMHhERiwgMHhERiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhFRCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhBRiwgMHhGRiwKKyAgICAweEVELCAweERDLCAweENDLCAweEJCLCAweEJDLCAweENDLCAweENELCAweERFLCAweEVELCAweEZGLCAweEVELCAweENDLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RkQsIDB4Q0IsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhDRCwgMHhERCwgMHhFRSwgMHhEQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEJDLCAweENELCAweERELCAweERDLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhEQywgMHhDQiwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQywgMHhDRCwKKyAgICAweENDLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJELCAweERDLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweERELCAweENDLCAweEE5LCAweDg3LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4RUMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhFRSwgMHhDQywgMHhCQSwgMHg5OSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg5OSwgMHhBQywKKyAgICAweERFLCAweEZDLCAweENDLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDlBLCAweEFCLCAweENFLCAweEZGLAorICAgIDB4REQsIDB4Q0MsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RkQsIDB4RUQsCisgICAgMHhDQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhFRiwgMHhGRiwgMHhERSwgMHhFRCwgMHhEQywKKyAgICAweENCLCAweEJCLCAweEJDLCAweENDLCAweERELCAweEVGLCAweEZGLCAweEZELCAweEZFLCAweEVELCAweERELCAweERDLAorICAgIDB4REQsIDB4REQsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsCisgICAgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4REQsIDB4REQsIDB4REQsIDB4REMsIDB4Q0MsIDB4OEYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhERCwgMHhERSwgMHhFRCwgMHhERCwgMHhERCwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRCwKKyAgICAweENDLCAweENDLCAweENDLCAweENCLCAweENELCAweERFLCAweEVGLCAweERGLCAweEZGLCAweEVDLCAweERCLCAweEJCLAorICAgIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REYsIDB4RkQsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QTksIDB4OTksIDB4OTksCisgICAgMHhBQSwgMHhCQywgMHhERCwgMHhFRiwgMHhERiwgMHhFRCwgMHhDQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5QSwKKyAgICAweEJDLCAweENDLCAweEZELCAweEZFLCAweERCLCAweEE5LCAweDg3LCAweDc2LCAweDc3LCAweDc4LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4REYsIDB4RkMsIDB4QkEsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NjcsIDB4NzgsIDB4OUIsIDB4QkQsIDB4RkUsCisgICAgMHhFRiwgMHhDQSwgMHg5OCwgMHg3NiwgMHg1NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRSwgMHhFRCwgMHhEQywKKyAgICAweEE5LCAweDg2LCAweDU0LCAweDMzLCAweDQ1LCAweDY4LCAweDlBLCAweEJDLCAweEVELCAweEVELCAweEJBLCAweDk4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTcsIDB4ODksIDB4QUMsIDB4REQsIDB4RUQsIDB4REMsIDB4QTksIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhGRiwgMHhGRiwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NiwKKyAgICAweDY3LCAweDg5LCAweEJDLCAweERGLCAweEVELCAweERDLCAweEJBLCAweDk4LCAweDg3LCAweDc2LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4Q0UsIDB4RkYsIDB4Q0UsIDB4Q0IsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODksIDB4QUIsIDB4REQsCisgICAgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQiwgMHhCQSwgMHhBOSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhERiwgMHhGRiwKKyAgICAweERGLCAweEVFLCAweENDLCAweEJBLCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweERGLCAweEZGLCAweEZFLCAweEZELAorICAgIDB4REQsIDB4Q0MsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsIDB4REUsIDB4REQsCisgICAgMHhEQywgMHhDRCwgMHhDQywgMHhERCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhGRiwgMHhFRCwgMHhERCwgMHhERCwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDhDLCAweENELCAweENELCAweERELCAweEVFLCAweERFLAorICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweERGLCAweDhGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweENGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4QkIsIDB4QkMsIDB4Q0QsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQSwgMHg5OSwgMHg5OSwgMHhBQiwgMHhDRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENBLCAweDk3LCAweDc3LCAweDg5LCAweEJDLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4REMsIDB4OTcsIDB4NTQsIDB4NDYsIDB4OEEsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRCwgMHhCOSwgMHg3NCwgMHgxMiwgMHg1NywgMHg5QiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwKKyAgICAweDk3LCAweDQyLCAweDI0LCAweDc5LCAweEJELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEI5LCAweDg2LAorICAgIDB4NDQsIDB4NTcsIDB4OUIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTksIDB4ODcsIDB4NzcsCisgICAgMHg4QSwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhBQSwgMHg5OSwgMHg5QSwgMHhDRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweENDLCAweEJCLCAweEJCLCAweENGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRCwgMHhEQywgMHhERCwgMHhDRCwgMHg3RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsCisgICAgMHhDQywgMHhDRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQywgMHhCQiwgMHhCQywKKyAgICAweENGLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweENDLCAweEJBLCAweEE5LCAweEFBLCAweEJDLAorICAgIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4QTksIDB4ODgsIDB4ODgsIDB4OUEsIDB4QkQsIDB4REYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQiwgMHhCOSwgMHg4NywgMHg2NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZELCAweENBLCAweDg3LCAweDU0LCAweDQ1LCAweDc4LCAweEFCLCAweERGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4REIsIDB4QTgsIDB4NjQsIDB4MjIsIDB4NDYsIDB4OEEsIDB4QkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QkEsCisgICAgMHg4NiwgMHg0MiwgMHgyNCwgMHg2OCwgMHhBQiwgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQiwgMHhBOCwgMHg3NSwKKyAgICAweDQ0LCAweDU2LCAweDhBLCAweEJELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENBLCAweDk4LCAweDc2LCAweDY2LAorICAgIDB4NzksIDB4QUMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4ODksIDB4QUIsCisgICAgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGQywgMHhCQSwgMHhBQSwgMHg5QSwgMHhBQywgMHhDQywgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERDLCAweENCLCAweEJCLCAweENDLCAweERGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4REQsIDB4REYsIDB4REMsIDB4Q0MsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0QsIDB4REMsIDB4REMsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhDQiwgMHhDQywgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweEE5LCAweDlBLCAweEJDLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4OTgsIDB4NzcsIDB4ODksIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGQywgMHhBOCwgMHg1NCwgMHg0NiwgMHg4QSwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweENBLCAweDc0LCAweDEyLCAweDQ3LCAweEFCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLAorICAgIDB4QTcsIDB4NDIsIDB4MjQsIDB4N0EsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0EsIDB4ODYsCisgICAgMHg0NCwgMHg1OCwgMHhBQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhCQSwgMHg4NywgMHg3OCwKKyAgICAweDlCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEJBLCAweDk5LCAweEFCLCAweENGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4Q0MsIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENDLCAweENCLCAweEJBLCAweEFBLCAweEE5LCAweDk5LCAweDlBLCAweEFBLCAweEFCLCAweEJDLCAweDlDLCAweENDLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhCQiwgMHhCQiwgMHhBOSwgMHg5OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEJCLCAweENCLCAweEJCLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4QUEsIDB4QkIsIDB4QkEsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHhBQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEJBLCAweEE5LCAweDg4LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEFBLAorICAgIDB4OUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QTksIDB4QTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweEE5LCAweEE5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg4LCAweDlBLCAweEJCLCAweEFBLCAweEE5LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkIsIDB4QkEsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0MsCisgICAgMHhCQiwgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQywgMHhDQiwgMHhDQiwKKyAgICAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJDLCAweENDLCAweEJDLCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4REMsIDB4REMsIDB4Q0IsIDB4QkIsIDB4QkIsCisgICAgMHhCQSwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhFRSwgMHg5QywgMHhDQiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwKKyAgICAweEJCLCAweEJCLCAweENDLCAweERELCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhFRSwgMHhFRCwgMHhERCwgMHhEQywgMHhDRCwgMHhEQywgMHg3RiwgMHhGRiwKKyAgICAweEZGLCAweEZFLCAweEVELCAweERELCAweERELCAweEZELCAweEZGLCAweEVFLCAweEZELCAweEZGLCAweEZGLCAweERFLAorICAgIDB4REQsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REQsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4REQsIDB4REMsIDB4Q0MsCisgICAgMHhCQiwgMHhDQywgMHhCRCwgMHhERCwgMHhFRiwgMHhGRSwgMHhGRiwgMHhGRCwgMHhEQywgMHhCQiwgMHhBQSwgMHhBQSwKKyAgICAweEJCLCAweENELCAweERFLCAweEVGLCAweERGLCAweEZFLCAweERDLCAweEJBLCAweDk5LCAweDk5LCAweDk5LCAweEFCLAorICAgIDB4Q0MsIDB4REUsIDB4RkQsIDB4RkQsIDB4RUMsIDB4Q0EsIDB4OTgsIDB4ODcsIDB4NzgsIDB4ODksIDB4QUIsIDB4Q0QsCisgICAgMHhGRiwgMHhERSwgMHhGRCwgMHhDQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhERCwgMHhGRSwKKyAgICAweERELCAweENCLCAweEE5LCAweDg2LCAweDU0LCAweDQ1LCAweDc4LCAweDlBLCAweENFLCAweERGLCAweEVFLCAweERDLAorICAgIDB4QkEsIDB4OTcsIDB4NjQsIDB4MjMsIDB4NDYsIDB4NzksIDB4QUIsIDB4REQsIDB4RkQsIDB4RUUsIDB4REIsIDB4QTksCisgICAgMHg3NiwgMHg0MiwgMHgyNCwgMHg2NywgMHg5QSwgMHhCQywgMHhERSwgMHhFRiwgMHhFRSwgMHhDQSwgMHg5OCwgMHg3NSwKKyAgICAweDQ0LCAweDU2LCAweDg5LCAweEFCLCAweERFLCAweEZFLCAweEVFLCAweERDLCAweEJBLCAweDg4LCAweDc2LCAweDY2LAorICAgIDB4NzgsIDB4OUIsIDB4Q0QsIDB4RUYsIDB4REQsIDB4RkQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQywgMHhERiwgMHhGRiwgMHhERiwgMHhERCwgMHhDQiwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhCQywgMHhERSwKKyAgICAweEZGLCAweEZELCAweEVFLCAweERELCAweENCLCAweEFBLCAweEFBLCAweEFCLCAweENDLCAweERFLCAweEZGLCAweEZGLAorICAgIDB4REYsIDB4RkQsIDB4REMsIDB4Q0MsIDB4QkMsIDB4Q0IsIDB4Q0MsIDB4Q0UsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RUYsCisgICAgMHhGRSwgMHhERCwgMHhEQywgMHhDRCwgMHhDRCwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhFRSwgMHhERCwKKyAgICAweEVFLCAweERFLCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEZGLCAweEZGLCAweERGLCAweEZGLAorICAgIDB4RkUsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0MsIDB4Q0QsIDB4Q0MsIDB4REQsIDB4RUUsIDB4RUYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4Q0YsIDB4REYsIDB4REMsIDB4Q0IsIDB4Q0QsIDB4N0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZELCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELAorICAgIDB4Q0MsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4Q0MsIDB4QkMsCisgICAgMHhDRCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhCQiwgMHhBQSwgMHhCQiwgMHhCQywKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEE5LCAweDk4LCAweDg5LCAweEFCLCAweENELCAweERGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QkEsIDB4ODcsIDB4NjYsIDB4NzgsIDB4QUIsIDB4Q0YsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhDQiwgMHg5NywgMHg1NCwgMHg0NSwgMHg3OSwgMHhCQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZDLCAweEI5LCAweDY0LCAweDIyLCAweDQ2LCAweDlBLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEJBLAorICAgIDB4ODYsIDB4NDIsIDB4MjMsIDB4NjgsIDB4QUMsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QTksIDB4NzUsCisgICAgMHg0NCwgMHg1NywgMHg5QiwgMHhDRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQiwgMHhBOCwgMHg3NiwgMHg2NywKKyAgICAweDhBLCAweEJDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJCLCAweEE5LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4Q0IsIDB4QkIsIDB4QUIsIDB4QkMsIDB4Q0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRCwgMHhERiwgMHhDQywgMHhDQywgMHhDRCwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweENELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdELCAweERELCAweERGLCAweEZELCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZELCAweDdGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENELCAweERELAorICAgIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4REMsIDB4QkIsIDB4QkIsIDB4Q0YsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhDQiwgMHhBOSwgMHhBQSwgMHhCQywgMHhERCwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENCLCAweDk3LCAweDc3LCAweDg5LCAweEFDLCAweERGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTgsIDB4NjQsIDB4NDYsIDB4OEEsIDB4QkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhCOSwgMHg3NCwgMHgxMiwgMHg0NywgMHg5QiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwKKyAgICAweDk3LCAweDQyLCAweDI0LCAweDc5LCAweEJELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERELCAweEJBLCAweDg2LAorICAgIDB4NDQsIDB4NTgsIDB4OUMsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REIsIDB4QTksIDB4ODcsIDB4NzgsCisgICAgMHg5QSwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQywgMHhCQSwgMHg5OSwgMHhBQiwgMHhCRCwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweENDLCAweEJCLCAweEJDLCAweENFLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4REMsIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhERiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRiwgMHhFRCwgMHhDQywgMHhFRCwgMHhCQiwgMHhDQiwgMHhCQiwgMHhDQywgMHhCQywgMHhDQywgMHg2RCwgMHhGRiwKKyAgICAweEVELCAweERDLCAweENDLCAweEJELCAweENDLCAweERDLCAweEVFLCAweEZGLCAweEZDLCAweEVELCAweERGLCAweENELAorICAgIDB4Q0MsIDB4Q0IsIDB4Q0MsIDB4Q0QsIDB4Q0QsIDB4REUsIDB4RkYsIDB4Q0YsIDB4RUQsIDB4RUMsIDB4Q0IsIDB4QkEsCisgICAgMHhCQiwgMHhCQiwgMHhDQywgMHhDQywgMHhERCwgMHhGQywgMHhERCwgMHhEQywgMHhCQSwgMHhCQSwgMHhBOSwgMHg5QSwKKyAgICAweEFBLCAweEJCLCAweENELCAweEVGLCAweERDLCAweERDLCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDk5LCAweDlCLAorICAgIDB4QkMsIDB4Q0QsIDB4RkQsIDB4QkMsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4NzcsIDB4NzcsIDB4ODksIDB4QUEsIDB4QkQsCisgICAgMHhDRCwgMHhEQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhEQywKKyAgICAweEJDLCAweEJCLCAweEE4LCAweDc2LCAweDQ0LCAweDQ1LCAweDY3LCAweDlBLCAweEJDLCAweENFLCAweERDLCAweERCLAorICAgIDB4QjksIDB4ODcsIDB4NjQsIDB4MjMsIDB4NDYsIDB4NzgsIDB4QUIsIDB4QkMsIDB4RUMsIDB4Q0MsIDB4QkEsIDB4OTgsCisgICAgMHg3NiwgMHg0MywgMHgzNCwgMHg1NywgMHg4OSwgMHhCQiwgMHhDRCwgMHhEQiwgMHhDQiwgMHhCQSwgMHg5NywgMHg2NSwKKyAgICAweDQ0LCAweDU2LCAweDc4LCAweDlCLCAweEJELCAweERELCAweENELCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU2LAorICAgIDB4NzgsIDB4OUEsIDB4QkIsIDB4REYsIDB4RUIsIDB4REMsIDB4QkEsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzgsIDB4OEEsCisgICAgMHhCQiwgMHhDRCwgMHhGRCwgMHhDQywgMHhEQiwgMHhCQiwgMHg5OSwgMHg5OCwgMHg4OCwgMHg5QSwgMHhBQSwgMHhCQywKKyAgICAweERGLCAweERDLCAweERELCAweEJDLCAweEJCLCAweEFBLCAweDk5LCAweEFBLCAweEFCLCAweEJDLCAweENFLCAweEZFLAorICAgIDB4REYsIDB4RkQsIDB4Q0MsIDB4QkIsIDB4QUEsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REMsIDB4RkYsIDB4RUMsIDB4RkYsCisgICAgMHhEQywgMHhEQywgMHhDQywgMHhCQiwgMHhCQywgMHhDRCwgMHhFRCwgMHhFRCwgMHhGRSwgMHhERSwgMHhFRSwgMHhFRCwKKyAgICAweENELCAweENDLCAweENDLCAweERELCAweERELCAweEVGLCAweEVGLCAweEVDLCAweEVGLCAweEZFLCAweEVELCAweEVELAorICAgIDB4REUsIDB4RUQsIDB4RUUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4NkMsIDB4Q0MsIDB4REQsIDB4REQsIDB4REQsIDB4QkMsCisgICAgMHhDQywgMHhFRCwgMHhERCwgMHhFRiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4REQsIDB4REQsIDB4REUsIDB4RUYsIDB4RkYsIDB4Q0YsIDB4RkYsCisgICAgMHhGRiwgMHhERCwgMHhEQywgMHhDQywgMHhDRCwgMHhERSwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFQywKKyAgICAweENCLCAweEJBLCAweEFBLCAweEJCLCAweENDLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweERDLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4OUEsIDB4QUEsIDB4QkMsIDB4RUYsIDB4RkYsIDB4RkQsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg5OSwgMHhBQSwgMHhCQywgMHhERiwgMHhGRiwgMHhERCwgMHhCQSwgMHg5OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweEJDLCAweEZGLCAweEZELCAweENBLCAweDk4LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4RUQsIDB4REIsIDB4QTgsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4ODksIDB4QkMsIDB4REYsCisgICAgMHhEQywgMHhCOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QiwgMHhDRCwgMHhFRCwgMHhDQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweEVGLCAweERDLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4RkQsIDB4REEsIDB4OTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQywgMHhERiwgMHhEQywgMHhCOSwgMHg4NywgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweEFCLCAweERGLCAweEZELCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4OUEsIDB4QkUsIDB4RUYsIDB4REUsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4OUEsIDB4QkMsCisgICAgMHhERiwgMHhGRSwgMHhEQywgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5QSwgMHhCQywgMHhGRSwgMHhGRiwKKyAgICAweEZFLCAweERDLCAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweERGLCAweEZGLCAweEZGLCAweEZELAorICAgIDB4REMsIDB4QkIsIDB4QkIsIDB4QUEsIDB4QkIsIDB4QkMsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REUsCisgICAgMHhEQywgMHhDQywgMHhDRCwgMHhDRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhERiwgMHhERCwKKyAgICAweEVELCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEVGLCAweEZFLCAweEZGLCAweEZELCAweEVDLCAweERELCAweENDLCAweENDLCAweENDLCAweERELCAweDZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkQsIDB4REQsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhFRCwgMHhDQywgMHhDRCwgMHhGRiwgMHhFRCwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERCwgMHhDQywKKyAgICAweENDLCAweENDLCAweERELCAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweEZFLCAweEZELCAweENDLCAweENCLCAweEJCLAorICAgIDB4QkQsIDB4RkQsIDB4RUYsIDB4RkYsIDB4REYsIDB4RUUsIDB4RkQsIDB4Q0IsIDB4QkEsIDB4QTksIDB4QUIsIDB4QkMsCisgICAgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhEQywgMHhDQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg5QSwgMHhCQywgMHhERiwKKyAgICAweEZGLCAweEZGLCAweEZFLCAweERDLCAweEE5LCAweDg3LCAweDY2LCAweDc4LCAweDlCLCAweENDLCAweERELCAweEZFLAorICAgIDB4RUQsIDB4REMsIDB4QkEsIDB4OTcsIDB4NTQsIDB4NDUsIDB4NzksIDB4QUIsIDB4REQsIDB4RkYsIDB4RkQsIDB4REQsCisgICAgMHhDQiwgMHhBOCwgMHg2NCwgMHgyMiwgMHg0NiwgMHg4QSwgMHhCQywgMHhERiwgMHhGRSwgMHhERCwgMHhEQywgMHhCQSwKKyAgICAweDg2LCAweDQyLCAweDI0LCAweDY4LCAweEFCLCAweENELCAweEZGLCAweEVELCAweERELCAweENCLCAweEE5LCAweDc1LAorICAgIDB4NDQsIDB4NTcsIDB4OEEsIDB4QkQsIDB4REYsIDB4RkYsIDB4REYsIDB4REQsIDB4Q0IsIDB4OTgsIDB4NzYsIDB4NjcsCisgICAgMHg4OSwgMHhCQywgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhCQSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhBQiwKKyAgICAweENELCAweERFLCAweEZFLCAweERGLCAweEZELCAweEVELCAweEJCLCAweEE5LCAweEFBLCAweEJDLCAweENELCAweERGLAorICAgIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4REMsIDB4Q0EsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REYsIDB4RkYsIDB4RkYsCisgICAgMHhERiwgMHhGRiwgMHhEQywgMHhERCwgMHhDQywgMHhDQywgMHhERCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwKKyAgICAweEZGLCAweEVGLCAweERELCAweERDLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEZGLCAweEZGLAorICAgIDB4REYsIDB4REQsIDB4RkQsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RUQsIDB4RkYsIDB4RkUsIDB4REYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QywgMHhERCwgMHhEQywgMHhDQywgMHhGRCwgMHhGRCwKKyAgICAweERELCAweERGLCAweEZGLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRCwgMHhDRCwgMHhEQywgMHhGRCwgMHhERCwgMHhERCwgMHg4RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4Q0QsIDB4RkYsIDB4REQsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0MsCisgICAgMHhDQywgMHhDRCwgMHhERSwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhDQiwgMHhCQiwgMHhDQiwKKyAgICAweENDLCAweENGLCAweEZELCAweEZGLCAweEZGLCAweEZELCAweEZELCAweENCLCAweEFBLCAweEE5LCAweEFBLCAweEJDLAorICAgIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4QkIsIDB4QTksIDB4ODgsIDB4ODgsIDB4OUEsIDB4QkMsIDB4REYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhBOSwgMHg4NywgMHg2NiwgMHg3OCwgMHg5QSwgMHhDQywgMHhGRiwgMHhGRCwKKyAgICAweEZGLCAweERDLCAweEJBLCAweDg3LCAweDU0LCAweDQ1LCAweDc5LCAweEFCLCAweERDLCAweERGLCAweEZGLCAweEZELAorICAgIDB4Q0EsIDB4OTgsIDB4NjQsIDB4MjIsIDB4NDYsIDB4OEEsIDB4QkQsIDB4RkYsIDB4RkYsIDB4REYsIDB4REMsIDB4QjksCisgICAgMHg4NiwgMHg0MiwgMHgyNCwgMHg2OCwgMHg5QywgMHhDRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhDQiwgMHhBOSwgMHg3NSwKKyAgICAweDQ0LCAweDU2LCAweDhBLCAweEJELCAweEZGLCAweEZGLCAweEZGLCAweERELCAweEJCLCAweDk4LCAweDc2LCAweDY2LAorICAgIDB4NzksIDB4QUIsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODksIDB4QUIsCisgICAgMHhERCwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhDQywgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhDRCwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERDLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4REYsIDB4RkYsIDB4REQsIDB4REMsIDB4REQsIDB4Q0QsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRCwgMHhGRiwgMHhERCwgMHhERiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLAorICAgIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0QsIDB4REQsIDB4REYsIDB4RkQsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQiwgMHhCQywgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENCLCAweEE5LCAweDlBLCAweEJGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4OTgsIDB4NzcsIDB4ODksIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGQiwgMHhBOCwgMHg2NCwgMHg0NiwgMHg4QSwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEI5LCAweDc0LCAweDEyLCAweDQ3LCAweDlBLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZCLAorICAgIDB4OTcsIDB4NDIsIDB4MjQsIDB4NzksIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUEsIDB4ODYsCisgICAgMHg0NCwgMHg1NywgMHg5QiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCOSwgMHg4NywgMHg3OCwKKyAgICAweDlCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFBLCAweDk5LCAweEFBLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkIsIDB4QkIsIDB4RUYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweENELCAweENDLCAweENGLCAweEJCLCAweDZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRSwKKyAgICAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJDLCAweEJDLAorICAgIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QkEsIDB4OTksIDB4QUEsIDB4QkMsCisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCOSwgMHg5OCwgMHg4OCwgMHhBQSwgMHhCRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweENELCAweEI5LCAweDg3LCAweDY2LCAweDc4LCAweDlBLCAweENGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4Q0EsIDB4ODcsIDB4NTQsIDB4NDUsIDB4NzksIDB4QUIsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhGQiwgMHhBOCwgMHg2NCwgMHgyMiwgMHg0NiwgMHg4QSwgMHhCRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCOSwKKyAgICAweDg2LCAweDQyLCAweDI0LCAweDY4LCAweEFCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEE4LCAweDc1LAorICAgIDB4NDQsIDB4NTYsIDB4OUIsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NjYsCisgICAgMHg4OSwgMHhDQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhCQiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEZCLCAweENCLCAweEFBLCAweEFBLCAweEJDLCAweERGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4Q0MsIDB4QUIsIDB4QkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhDRCwgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QywgMHhCQywgMHhDRiwgMHhGRiwgMHhDRCwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhEQywgMHhEQiwgMHhCQSwgMHhBQSwgMHhBOSwgMHhBQSwgMHhBOSwgMHhBQiwgMHhCQiwgMHhDQywgMHhBRiwgMHhGRCwKKyAgICAweEJCLCAweEJBLCAweEE5LCAweEFBLCAweDlBLCAweEFCLCAweEJCLCAweENELCAweERDLCAweENCLCAweEJCLCAweEFBLAorICAgIDB4OTksIDB4OTksIDB4ODksIDB4OUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhBQiwgMHhDQiwgMHhCQiwgMHhCOSwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweEFBLCAweEJCLCAweENBLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4QUIsIDB4Q0EsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsCisgICAgMHhBQiwgMHhCQiwgMHhBQSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwKKyAgICAweEFBLCAweDk4LCAweDc3LCAweDY2LCAweDU1LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweDlCLCAweEFBLCAweEE5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QUEsIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QywgMHhBOSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDY2LCAweDY3LCAweDc4LCAweDlBLCAweEJCLCAweDlBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzgsIDB4ODksIDB4OUEsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzcsCisgICAgMHg4OCwgMHg5QiwgMHhCQywgMHhBQSwgMHg5OSwgMHg5OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweENBLCAweEFBLCAweDk5LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDg5LCAweDk5LCAweEFCLCAweERELAorICAgIDB4Q0IsIDB4Q0IsIDB4QTksIDB4ODksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0IsIDB4REMsCisgICAgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OCwgMHg5OSwgMHg5QSwgMHhCQSwgMHhCQywgMHhEQywgMHhFQywgMHhDQywgMHhBQiwKKyAgICAweEJBLCAweDlBLCAweDlBLCAweEFBLCAweEFCLCAweEJDLCAweEVGLCAweEVDLCAweEVDLCAweENCLCAweEJCLCAweEJCLAorICAgIDB4QkEsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REMsIDB4RUUsIDB4QUMsIDB4QkMsIDB4Q0IsIDB4QkEsIDB4Q0EsIDB4QkEsCisgICAgMHhCQywgMHhCQiwgMHhERCwgMHhERCwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkYsIDB4REYsIDB4Q0MsIDB4RUQsIDB4QkEsIDB4QkMsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4Q0YsIDB4NkYsIDB4RkYsCisgICAgMHhEQywgMHhGRiwgMHhFRiwgMHhFRCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhERiwgMHhGRiwgMHhGRCwKKyAgICAweEZGLCAweERDLCAweERGLCAweEZELCAweEZELCAweEZELCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweERDLAorICAgIDB4QkIsIDB4Q0IsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkMsIDB4Q0YsIDB4RkMsIDB4RkYsIDB4Q0IsIDB4QkIsIDB4QUIsCisgICAgMHhDQywgMHhCRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwgMHhCQiwgMHhBOSwgMHhBOSwgMHhBQywgMHhCRSwKKyAgICAweEVFLCAweEZFLCAweEVELCAweENGLCAweEZGLCAweERBLCAweEE5LCAweDg4LCAweDg4LCAweEFBLCAweENELCAweENELAorICAgIDB4RkYsIDB4REMsIDB4RkYsIDB4RkIsIDB4QTksIDB4ODYsIDB4NjYsIDB4NzgsIDB4QUIsIDB4Q0MsIDB4RkQsIDB4RkMsCisgICAgMHhDRiwgMHhERCwgMHhEQSwgMHg4NiwgMHg1NCwgMHg0NiwgMHg3OSwgMHhBRCwgMHhDRiwgMHhGRiwgMHhDQywgMHhGRiwKKyAgICAweENCLCAweEE5LCAweDY0LCAweDIyLCAweDQ3LCAweDhBLCAweENCLCAweEZGLCAweEZGLCAweENGLCAweEZELCAweEI5LAorICAgIDB4ODYsIDB4NDIsIDB4MjQsIDB4NjgsIDB4OUIsIDB4Q0UsIDB4RkQsIDB4Q0MsIDB4RkQsIDB4QkIsIDB4QTksIDB4NzYsCisgICAgMHg0NCwgMHg1NywgMHg4QSwgMHhCQywgMHhFRSwgMHhERSwgMHhFRCwgMHhGRiwgMHhEQiwgMHhBOCwgMHg3NiwgMHg2NiwKKyAgICAweDc4LCAweEFDLCAweENELCAweERGLCAweEZELCAweEZGLCAweEZCLCAweENCLCAweEE5LCAweDg4LCAweDg5LCAweDlCLAorICAgIDB4Q0YsIDB4Q0YsIDB4RkYsIDB4REYsIDB4RkMsIDB4REYsIDB4Q0EsIDB4QTksIDB4QUEsIDB4QUEsIDB4Q0YsIDB4REQsCisgICAgMHhGRiwgMHhGQywgMHhGRiwgMHhGRCwgMHhDQywgMHhDQywgMHhCQiwgMHhBQiwgMHhDQywgMHhDRiwgMHhGRiwgMHhGQywKKyAgICAweENGLCAweERELCAweEZDLCAweEZGLCAweENCLCAweENELCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEZDLCAweEZGLAorICAgIDB4REYsIDB4REYsIDB4Q0YsIDB4RkMsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkQsIDB4Q0YsIDB4RkYsIDB4Q0YsCisgICAgMHhGRiwgMHhGQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwKKyAgICAweEZELCAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZELCAweENDLCAweENELCAweEJELCAweERDLCAweEZELAorICAgIDB4Q0QsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywKKyAgICAweENDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENDLCAweENCLCAweENDLAorICAgIDB4Q0MsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkMsIDB4QkEsIDB4QTksIDB4QUEsIDB4Q0YsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg5QSwgMHhCRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweEI5LCAweDg2LCAweDY2LCAweDc4LCAweDlBLCAweENGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4QjksIDB4ODcsIDB4NTQsIDB4NDUsIDB4NzgsIDB4QUMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGQiwgMHhBOCwgMHg2NCwgMHgyMiwgMHg0NiwgMHg4QSwgMHhCQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhDQSwKKyAgICAweDg2LCAweDQyLCAweDI0LCAweDY4LCAweDlDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEE4LCAweDc1LAorICAgIDB4NDQsIDB4NTYsIDB4OEEsIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjYsCisgICAgMHg4OSwgMHhCQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhBQywKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweENCLCAweEFBLCAweEE5LCAweEJCLCAweENGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkMsIDB4QkIsIDB4Q0YsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2RiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGRiwgMHhGRiwgMHg5RiwgMHg2RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4OUMsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDY1LCAweDQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4OTQsIDB4MTIsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGOCwgMHg1MiwgMHgxNCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOCwKKyAgICAweDU0LCAweDc4LCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweDg3LAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OTksIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEY5LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjksIDB4NkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OTgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHg3NCwgMHg1NywgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZBLCAweDg1LCAweDEyLCAweDU5LCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RjksIDB4NTIsIDB4MTQsIDB4ODksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OTcsCisgICAgMHg1NCwgMHg2NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOCwgMHg4OSwKKyAgICAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDVGLCAweEZGLCAweEZDLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY2LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDVGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RjYsIDB4RjYsIDB4NkYsIDB4NjgsIDB4RjUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjYsCisgICAgMHg2NiwgMHhGNiwgMHhGRiwgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEY2LCAweDZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDY2LCAweEY2LCAweDZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkYsIDB4RkYsIDB4NkYsIDB4NjYsIDB4NjYsIDB4RkYsIDB4NkYsIDB4RjYsCisgICAgMHhGRiwgMHhGRiwgMHg2RiwgMHhDRiwgMHhGRiwgMHg2RiwgMHhGRiwgMHhGNiwgMHg2RiwgMHg2RiwgMHhGRiwgMHg2RiwKKyAgICAweEZGLCAweEY2LCAweDU2LCAweEY2LCAweEY2LCAweDU2LCAweEZGLCAweEZGLCAweDY2LCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NTYsIDB4NkYsIDB4RkYsIDB4RjYsIDB4RkYsIDB4NkYsIDB4RkYsIDB4RkYsCisgICAgMHhGNiwgMHg2NiwgMHhGNiwgMHhGRiwgMHg2NiwgMHg2RiwgMHhGRiwgMHg2RiwgMHhGRiwgMHg2RiwgMHhGNiwgMHhGRiwKKyAgICAweDY2LCAweDZGLCAweDU2LCAweEY2LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY2LCAweDZGLAorICAgIDB4NDYsIDB4RjUsIDB4NkYsIDB4NkYsIDB4RkYsIDB4RjUsIDB4NkIsIDB4QUYsIDB4RkYsIDB4NUYsIDB4RkYsIDB4RkYsCisgICAgMHg2RiwgMHg2RiwgMHhGNiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2RiwgMHhGNiwgMHg2NiwgMHhGNSwgMHhGRiwKKyAgICAweDVGLCAweEZGLCAweEZGLCAweDZGLCAweEZGLCAweEZGLCAweEZGLCAweEY1LCAweDU1LCAweEY2LCAweEY2LCAweEZGLAorICAgIDB4RkYsIDB4NkYsIDB4RkYsIDB4RkYsIDB4NkYsIDB4RjYsIDB4RkYsIDB4RjYsIDB4RjYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNiwgMHg2RiwgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZGLCAweEY2LCAweEZGLCAweDZGLCAweEZGLCAweEZGLCAweEZGLCAweDZGLAorICAgIDB4RjYsIDB4RkYsIDB4RjYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGNiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2RiwgMHg2RiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGRiwgMHg5RiwgMHg0RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEZGLCAweEZGLCAweEY5LAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OTgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGOCwgMHg2NywgMHg4RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEY4LCAweDk3LCAweDU0LCAweDQ3LCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4OEYsIDB4NzQsIDB4MTIsIDB4NTcsIDB4OEYsIDB4RjksIDB4RkYsIDB4RkYsIDB4OUYsIDB4RkYsIDB4OUYsCisgICAgMHg5OCwgMHg1MiwgMHgyNCwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywKKyAgICAweDU0LCAweDU4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweEY4LAorICAgIDB4OUYsIDB4OUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjksIDB4RkYsIDB4ODksIDB4RkYsCisgICAgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweEY5LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NUYsIDB4RjksIDB4OTksIDB4RkYsIDB4OUYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQSwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFBLCAweEJBLCAweEZGLCAweEZGLCAweEJGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTgsIDB4NzcsIDB4OUEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOCwgMHg1NCwgMHg0NSwgMHg5QSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZBLCAweDg0LCAweDIyLCAweDQ3LCAweEFGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4QTgsIDB4NDIsIDB4MTQsIDB4N0EsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OTYsCisgICAgMHg0NCwgMHg1OSwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQiwgMHg5NywgMHg3OCwKKyAgICAweEFCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZBLCAweEJGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4QkYsIDB4RkIsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDVGLCAweEZGLCAweEZCLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY4LCAweEZGLCAweEZGLCAweDVGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHg3RiwgMHhGRiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY2LCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4NzYsIDB4RjcsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHg2RiwgMHg2NywgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweEY3LCAweDU1LCAweDVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RjcsIDB4NTUsIDB4NDQsIDB4NDYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGNywgMHhGNSwgMHg1NCwgMHg0NCwgMHg1NywgMHg2NiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNiwKKyAgICAweDc1LCAweDQ0LCAweDM0LCAweDQ2LCAweDZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweDU1LAorICAgIDB4NDUsIDB4NDUsIDB4NTYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0YsIDB4NkYsIDB4N0YsIDB4NzUsIDB4NTcsCisgICAgMHg1NiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3NiwgMHg2NiwgMHg3RiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweDdGLCAweEY3LCAweDdGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2RiwgMHg3RiwgMHhGRiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2RiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RiwgMHhGRiwgMHhGRiwgMHg1RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweDQ0LCAweDQ1LCAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4NzMsIDB4MjIsIDB4NDgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGNywgMHg0MiwgMHgyNCwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NiwKKyAgICAweDQzLCAweDRDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY4LCAweDc3LAorICAgIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4RjksIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NEYsIDB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY4LCAweDc1LCAweDY3LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RjksIDB4NzYsIDB4NDMsIDB4NDYsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGNiwgMHg2MywgMHgyMywgMHg1OCwgMHg4RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEFGLCAweDQzLCAweDIzLCAweDU3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEZGLCAweDg1LAorICAgIDB4NTQsIDB4NDUsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEYsIDB4RjcsIDB4NTUsCisgICAgMHg2OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOCwgMHhCRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY4LCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEY4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0RiwgMHhGOCwgMHhGOCwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhCRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweEFGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjksIDB4ODcsIDB4ODgsIDB4OUYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBQSwgMHg4NywgMHg2NiwgMHg3OCwgMHhBRiwgMHhCRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEJGLCAweEE3LCAweDU0LCAweDQ1LCAweDZBLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RjcsIDB4NjQsIDB4MjIsIDB4NDYsIDB4ODksIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsCisgICAgMHg3NiwgMHg0MiwgMHgyNCwgMHg2OCwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHg3NSwKKyAgICAweDQ0LCAweDU3LCAweEE5LCAweEZGLCAweEZGLCAweEZBLCAweEZGLCAweEZGLCAweEZGLCAweDk3LCAweDc2LCAweDY3LAorICAgIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4QkEsIDB4OTgsIDB4OEEsIDB4QkIsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhGQSwgMHhBRiwgMHhCRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjksIDB4OUYsIDB4RkYsIDB4Q0YsIDB4OTksIDB4RkYsIDB4M0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZELCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4NzgsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZBLCAweDg0LCAweDIyLCAweDQ4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RjcsIDB4NDIsIDB4MTQsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsCisgICAgMHg0NCwgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5OSwgMHg4OCwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweDNGLCAweEZGLAorICAgIDB4RkUsIDB4RUUsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY2LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NTYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGMywgMHgxMiwgMHg0NiwgMHhGRiwgMHhGRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweDUyLCAweDI0LCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4NDQsIDB4NkUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZFLCAweEZFLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4ODMsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGNCwgMHgxMiwgMHg0RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEY3LCAweDQyLCAweDI0LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LAorICAgIDB4NDQsIDB4NzcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4OEYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweDlDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorIH0sCisgeworICB7CisgICAgMHhCRSwgMHhERCwgMHhFQywgMHhERCwgMHhERCwgMHhEQywgMHhERSwgMHhFRSwgMHhGRiwgMHhGRiwgMHhDRCwgMHhGRSwKKyAgICAweEZELCAweERELCAweERDLCAweENELCAweERELCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweERFLCAweEZELCAweENDLAorICAgIDB4Q0MsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RUQsIDB4REMsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhGRiwgMHhGRiwgMHhERiwgMHhFQywgMHhCQiwgMHhBOSwgMHg5OSwgMHg5OSwKKyAgICAweDk5LCAweEFCLCAweENELCAweEZGLCAweEZELCAweEVDLCAweEJCLCAweEE5LCAweDg4LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4RkUsIDB4RUQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhGQywgMHhEQywgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwgMHg2NiwgMHg2NywgMHg4OSwgMHhCQywgMHhERiwKKyAgICAweERDLCAweENBLCAweDk4LCAweDc2LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweENELCAweERELCAweERCLAorICAgIDB4QTksIDB4ODcsIDB4NjUsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NzksIDB4QUMsIDB4REQsIDB4REMsIDB4QkEsIDB4OTcsCisgICAgMHg2NSwgMHg1NCwgMHg0NCwgMHg1NSwgMHg2NywgMHg4QSwgMHhCRCwgMHhERSwgMHhDQiwgMHhBOSwgMHg3NiwgMHg2NSwKKyAgICAweDU0LCAweDU1LCAweDY2LCAweDc5LCAweEFCLCAweENELCAweEVELCAweENBLCAweDk4LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REUsIDB4REMsIDB4QjksIDB4ODcsIDB4NjYsIDB4NjUsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQywgMHhEQywgMHhFRiwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweENELCAweERGLCAweEZFLCAweENCLCAweEE5LCAweDg4LCAweDc3LCAweDc4LCAweDg5LCAweEFCLCAweENDLCAweEVELAorICAgIDB4RkYsIDB4RUQsIDB4Q0IsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUIsIDB4QkMsIDB4REYsIDB4REYsIDB4RkYsCisgICAgMHhFRCwgMHhDQywgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRSwKKyAgICAweERDLCAweENCLCAweEJCLCAweEJDLCAweENDLCAweEVFLCAweEVGLCAweEVGLCAweEZGLCAweEZGLCAweEZFLCAweEVFLAorICAgIDB4Q0MsIDB4REQsIDB4REQsIDB4REYsIDB4RUYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERSwgMHhERSwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUQsIDB4Q0IsIDB4QkIsIDB4QkMsIDB4Q0IsIDB4RkMsIDB4REIsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkYsCisgICAgMHhCRCwgMHhDQywgMHhEQywgMHhEQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhDQywgMHhEQywKKyAgICAweEJCLCAweEFCLCAweEJBLCAweEJDLCAweENELCAweERELCAweERELCAweEZCLCAweERELCAweEZCLCAweEFCLCAweEFBLAorICAgIDB4OUEsIDB4QUEsIDB4QUEsIDB4QkMsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkMsIDB4Q0IsIDB4QkEsIDB4OTksIDB4OTksCisgICAgMHg5OSwgMHhBQiwgMHhCQywgMHhDRiwgMHhGQiwgMHhEQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3OCwgMHg4OCwKKyAgICAweEFBLCAweEJDLCAweERGLCAweENGLCAweEZCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg5LCAweEFBLAorICAgIDB4QkYsIDB4Q0YsIDB4Q0MsIDB4QTksIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUIsIDB4RkMsCisgICAgMHhDQiwgMHhEQSwgMHhBOCwgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhGQiwKKyAgICAweEE5LCAweDg3LCAweDY1LCAweDQ0LCAweDQ1LCAweDU2LCAweDc5LCAweDlCLCAweENDLCAweEJGLCAweEJBLCAweDk3LAorICAgIDB4NzUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NjgsIDB4OUEsIDB4QkUsIDB4RkIsIDB4REIsIDB4QTksIDB4ODYsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQSwgMHhDQywgMHhERiwgMHhCQiwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweEFDLCAweERDLCAweEZDLCAweEE5LCAweDg3LCAweDY2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4OEEsIDB4QUIsIDB4QkIsIDB4RkMsIDB4QkMsIDB4QjksIDB4ODcsIDB4NzYsIDB4NzcsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhEQywgMHhCQywgMHhGQywgMHhCQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhDQiwgMHhDQiwKKyAgICAweEZGLCAweEZDLCAweENBLCAweEFBLCAweDk5LCAweDk5LCAweEE5LCAweDlCLCAweEJDLCAweENELCAweERGLCAweEZGLAorICAgIDB4Q0YsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0YsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhDQywgMHhDQiwgMHhCQiwgMHhDQywgMHhCQiwgMHhEQiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhERCwgMHhGRCwKKyAgICAweEJGLCAweERDLCAweENCLCAweEJGLCAweERGLCAweEZDLCAweEZGLCAweEZGLCAweEZFLCAweEVELCAweEZGLCAweENCLAorICAgIDB4QkMsIDB4REMsIDB4QkMsIDB4QkMsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENELCAweERGLCAweERELCAweERELCAweERDLCAweERELCAweERELCAweERFLCAweEZGLCAweEZGLCAweERGLCAweEZGLAorICAgIDB4RkUsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkQsIDB4REMsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDRCwgMHhERiwgMHhGRiwgMHhGRCwgMHhGRSwgMHhEQywgMHhCQiwgMHhBQSwKKyAgICAweDlBLCAweEFBLCAweEFCLCAweENELCAweEVGLCAweEZGLCAweERGLCAweERDLCAweEJBLCAweEE5LCAweDk4LCAweDg4LAorICAgIDB4ODksIDB4QUEsIDB4QkQsIDB4REYsIDB4RkQsIDB4RUMsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHhCQywgMHhFRiwgMHhERCwgMHhDQiwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NywgMHg4OCwgMHhBQiwKKyAgICAweENELCAweEZELCAweERCLCAweEE5LCAweDg3LCAweDY2LCAweDY1LCAweDU2LCAweDY3LCAweDg5LCAweEFCLCAweEVELAorICAgIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzcsIDB4OEEsIDB4QkQsIDB4REQsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhEQywgMHhCOSwgMHg4NywKKyAgICAweDY1LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEJELCAweERELCAweENCLCAweEE4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhERSwgMHhEQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NSwgMHg2NiwgMHg2NywKKyAgICAweDg5LCAweEFCLCAweERELCAweEVELCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDc3LCAweDg5LCAweDlCLAorICAgIDB4Q0MsIDB4REUsIDB4RUMsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzgsIDB4ODksIDB4OUEsIDB4QkMsIDB4RUQsCisgICAgMHhGRiwgMHhERCwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhBQSwgMHhCQywgMHhERCwgMHhERiwgMHhGRiwKKyAgICAweEZELCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweERELCAweEVELCAweEZGLCAweEZFLCAweEZELAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4QkMsIDB4REQsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REMsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhERSwgMHhERiwgMHhGRSwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhERCwgMHhEQywKKyAgICAweENELCAweERELCAweERFLCAweERFLCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhERSwgMHhFRSwgMHhFRSwgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVELCAweERELCAweERELCAweERFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweDRELCAweERELAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RUUsIDB4RTMsIDB4RUUsIDB4RTQsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHg1RSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweDNFLCAweDRFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4NDQsIDB4NDQsIDB4NEQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsCisgICAgMHg0NCwgMHg0RCwgMHhERCwgMHhENCwgMHg0RCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhENCwgMHhEMywKKyAgICAweDNELCAweDRELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERFLCAweEVFLCAweEU0LCAweEU0LCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4NEUsIDB4RUUsIDB4NDQsIDB4RUUsCisgICAgMHhFNCwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RTQsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVELCAweEVELCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4NEUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRCwgMHhFRCwgMHhFRCwgMHhFRSwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REMsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsIDB4RkYsCisgICAgMHhERiwgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhERCwgMHhEQywKKyAgICAweENDLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERGLCAweEZGLCAweEZFLCAweEZELCAweEVDLCAweEJCLCAweEFBLAorICAgIDB4OUEsIDB4QUEsIDB4QUIsIDB4Q0QsIDB4REYsIDB4RkYsIDB4Q0QsIDB4Q0QsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg5OSwgMHg5QSwgMHhDRCwgMHhERiwgMHhGRCwgMHhEQywgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweDlBLCAweEJELCAweEZGLCAweENDLCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDc3LCAweDg5LCAweDlBLAorICAgIDB4REYsIDB4RkMsIDB4REIsIDB4QjksIDB4ODcsIDB4NjYsIDB4NjUsIDB4NjYsIDB4NjcsIDB4ODksIDB4QUMsIDB4REQsCisgICAgMHhERCwgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg4QSwgMHhDRCwgMHhFRCwgMHhDQiwKKyAgICAweEE4LCAweDc2LCAweDY1LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDlCLCAweERFLCAweERDLCAweEJBLCAweDg3LAorICAgIDB4NjUsIDB4NTUsIDB4NDUsIDB4NTUsIDB4NjcsIDB4OEEsIDB4QkQsIDB4Q0QsIDB4Q0IsIDB4QTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NCwgMHg1NSwgMHg1NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhFRCwgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweENELCAweEZCLCAweEE5LCAweDg3LCAweDY2LCAweDY1LCAweDY2LCAweDY3LAorICAgIDB4ODksIDB4QUIsIDB4Q0QsIDB4RkYsIDB4REIsIDB4QTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhDQywgMHhERiwgMHhGRCwgMHhDQSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywgMHg4OSwgMHg5QSwgMHhCQywgMHhFRCwKKyAgICAweEZGLCAweEZELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweERELCAweERGLCAweEZGLAorICAgIDB4REMsIDB4Q0IsIDB4QUEsIDB4QUEsIDB4OUEsIDB4QUIsIDB4QkMsIDB4Q0UsIDB4RUQsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhDQywgMHhCQiwgMHhCQywgMHhCQiwgMHhDQywgMHhERCwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywKKyAgICAweENDLCAweENELCAweERDLCAweERGLCAweEZGLCAweEVGLCAweERGLCAweEZGLCAweEZFLCAweEZDLCAweEVDLCAweENELAorICAgIDB4Q0MsIDB4REQsIDB4Q0QsIDB4REQsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweENCLCAweEJCLCAweEJCLCAweEJBLCAweEFCLCAweEJCLCAweENDLCAweENDLCAweEVGLCAweEJDLCAweERELAorICAgIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4RUUsIDB4RkUsIDB4Q0MsIDB4Q0MsIDB4QkIsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhDQywgMHhERSwgMHhFQywgMHhDQywgMHhCQSwgMHhBQSwgMHg5OSwKKyAgICAweDk4LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweERELCAweEJDLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4OTksIDB4QUIsIDB4QkMsIDB4REIsIDB4QkIsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg5OSwgMHhBQiwgMHhDQywgMHhCQiwgMHhBQSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg5QSwKKyAgICAweEFDLCAweENCLCAweEJBLCAweDk4LCAweDg3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDlBLCAweEJCLAorICAgIDB4QkIsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QkIsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhBQiwgMHhCQiwgMHg5OSwgMHg4NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDY3LCAweDg5LCAweEFBLCAweEFCLCAweEJBLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkIsIDB4QkIsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCQiwgMHhCQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywKKyAgICAweDg4LCAweDlBLCAweEJCLCAweENDLCAweEFBLCAweDk4LCAweDc3LCAweDc2LCAweDY2LCAweDc3LCAweDc4LCAweDk5LAorICAgIDB4QUIsIDB4QkMsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUIsIDB4QkIsCisgICAgMHhDQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQywgMHhCRCwgMHhERCwKKyAgICAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENDLCAweEVFLCAweERDLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4Q0YsIDB4RkUsIDB4REQsIDB4Q0MsIDB4QkIsCisgICAgMHhCQSwgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhEQywgMHhDRSwgMHhERCwgMHhEQywgMHhDQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweENDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhERCwgMHhCQywgMHhEQywKKyAgICAweENDLCAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweENCLCAweENELCAweEVFLCAweEJELCAweENDLCAweEJCLAorICAgIDB4QUEsIDB4OTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QkMsIDB4Q0QsIDB4REIsIDB4Q0MsIDB4QUEsIDB4QTksIDB4OTksCisgICAgMHg4OCwgMHg4OSwgMHg5OSwgMHg5QSwgMHhCQywgMHhEQywgMHhCQywgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg3NywKKyAgICAweDg4LCAweDg5LCAweDlBLCAweEJDLCAweENCLCAweEJBLCAweEE5LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4OUEsIDB4QkIsIDB4QUIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhCQSwgMHhBQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQSwKKyAgICAweEFBLCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDg5LCAweEFBLCAweEFBLCAweEE5LAorICAgIDB4ODgsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUEsIDB4QUEsIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDU2LCAweDY2LCAweDc4LCAweDg5LCAweEFBLCAweEJBLCAweDk4LCAweDg3LCAweDY2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QUIsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsCisgICAgMHg4OCwgMHg5QSwgMHhBQSwgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg5OSwKKyAgICAweEFCLCAweEFCLCAweEJCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLCAweEJCLAorICAgIDB4Q0MsIDB4QkEsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkMsIDB4QkMsIDB4Q0IsCisgICAgMHhCQSwgMHg5OSwgMHg5OSwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhERCwgMHhEQywgMHhCQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweENELCAweEJFLCAweEVFLCAweENDLCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REIsIDB4Q0QsIDB4RUMsIDB4QkIsIDB4QkIsIDB4QkEsIDB4QUEsCisgICAgMHhBQSwgMHhBQiwgMHhCQiwgMHhCQywgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4OTksIDB4OTksIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4QkIsIDB4Q0IsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhEQywgMHhCQywgMHhCQiwgMHhBQSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweENBLCAweEJCLCAweEFBLCAweDk5LCAweDk4LAorICAgIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0IsIDB4QUIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODcsIDB4NzcsCisgICAgMHg4OCwgMHg4OCwgMHg5QSwgMHhBQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEFBLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDc2LCAweDY2LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4OUEsIDB4QUEsIDB4QTksIDB4OTgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QUEsCisgICAgMHg5QSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHg5OSwgMHhBOSwKKyAgICAweDg4LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEE5LCAweDlBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NjUsIDB4NTYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4OTksIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg2NSwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBOSwgMHhBQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweDlBLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4NzgsIDB4OTksIDB4QUEsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHg5QSwgMHhBQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHg5QSwgMHhBQSwKKyAgICAweEJCLCAweEFBLCAweDk5LCAweDg4LCAweDg3LCAweDc4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEFCLCAweENCLAorICAgIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QkEsIDB4Q0QsIDB4Q0IsIDB4QUEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhCRCwgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweENCLCAweENDLCAweENCLCAweEJBLCAweEFBLCAweDk5LCAweDk5LAorICAgIDB4OTksIDB4QUEsIDB4QUEsIDB4QkIsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERELCAweENDLCAweENCLAorICAgIDB4QkMsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QUMsIDB4Q0QsIDB4REUsIDB4QkQsIDB4Q0IsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhDQSwgMHhCQywgMHhCQSwgMHg5OSwgMHg5OCwKKyAgICAweDg4LCAweDg5LCAweDg5LCAweDlBLCAweEJCLCAweENDLCAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4QkEsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHhBQSwgMHhDQywgMHhBQSwgMHhBOSwgMHg4OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweEJBLCAweEI5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDk5LCAweEFBLAorICAgIDB4QUEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QUEsIDB4QTksCisgICAgMHg4NywgMHg3NiwgMHg2NiwgMHg2NSwgMHg1NiwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQSwgMHhBQSwgMHg5OCwgMHg4NywKKyAgICAweDY2LCAweDY1LCAweDU1LCAweDY2LCAweDY3LCAweDg4LCAweDlBLCAweEFBLCAweEE5LCAweDg4LCAweDc2LCAweDY2LAorICAgIDB4NTUsIDB4NTYsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUEsIDB4QUEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBQSwgMHhBOSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywKKyAgICAweDc4LCAweDlBLCAweEJBLCAweEFCLCAweEE5LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDk5LAorICAgIDB4QUEsIDB4QkIsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkEsCisgICAgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4NywgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhCRCwgMHhCQiwKKyAgICAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweEJCLCAweERELCAweENCLCAweEFCLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QkMsIDB4QkMsIDB4QkQsIDB4REMsIDB4QkIsIDB4QkIsIDB4QUEsCisgICAgMHhBOSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhEQywgMHhEQywgMHhCRSwgMHhEQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweDkwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QywgMHhCQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhERSwgMHhDQiwgMHhFQywKKyAgICAweENDLCAweEJCLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweEJDLCAweERELCAweEVFLCAweEJELCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0UsIDB4REIsIDB4Q0IsIDB4QkEsIDB4QTksIDB4OTksCisgICAgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhEQywgMHhCQywgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweENCLCAweEJCLCAweEE5LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4QUIsIDB4QkMsIDB4QUIsIDB4QTksIDB4OTgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4OTksCisgICAgMHhBQiwgMHhCQSwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwKKyAgICAweEFBLCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDU1LCAweDY2LCAweDY3LCAweDg5LCAweDlBLCAweEFBLCAweEE5LAorICAgIDB4ODgsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OTksIDB4QUEsIDB4QUEsIDB4OTgsIDB4ODcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY2LCAweDc4LCAweDk5LCAweEFBLCAweEFCLCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDU2LAorICAgIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QUIsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhBQSwgMHhCQiwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg5OSwKKyAgICAweEFCLCAweEJCLCAweENCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLAorICAgIDB4Q0MsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4QkMsIDB4REMsCisgICAgMHhCQSwgMHhBOSwgMHg5OSwgMHg4OCwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhDRCwgMHhEQywgMHhCQiwKKyAgICAweEFBLCAweDk5LCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweENELCAweEJELCAweEVELCAweENDLCAweEJCLCAweEJCLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0MsIDB4REMsIDB4QkQsIDB4REMsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhCQiwgMHhCQiwgMHhCQywgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4RUQsIDB4REQsIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RUYsIDB4QkYsIDB4RkYsCisgICAgMHhGRCwgMHhERCwgMHhERCwgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhFRCwgMHhEQywKKyAgICAweENDLCAweENDLCAweENDLCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEZFLCAweERDLCAweENCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4Q0MsIDB4RUYsIDB4RkYsIDB4RkYsIDB4REUsIDB4REMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksCisgICAgMHhBQSwgMHhCQywgMHhERiwgMHhGRiwgMHhFRCwgMHhFQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5QSwKKyAgICAweEJELCAweEVGLCAweEZGLCAweERELCAweENCLCAweEE5LCAweDg4LCAweDc2LCAweDY3LCAweDc4LCAweDlBLCAweENELAorICAgIDB4RUYsIDB4RkQsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4RUUsCisgICAgMHhERSwgMHhDQiwgMHg5OCwgMHg3NiwgMHg1NCwgMHg0NCwgMHg1NiwgMHg3OSwgMHhBQywgMHhERSwgMHhFRCwgMHhEQywKKyAgICAweEI5LCAweDg3LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDlBLCAweENELCAweEVELCAweERFLCAweENCLCAweDk4LAorICAgIDB4NjUsIDB4NDQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4QUIsIDB4REUsIDB4REUsIDB4RkMsIDB4QjksIDB4ODcsIDB4NTUsCisgICAgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCQywgMHhFRCwgMHhFRSwgMHhEQiwgMHhBOCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweENFLCAweEVGLCAweEZELCAweENBLCAweDk4LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUIsIDB4QkQsIDB4RUQsIDB4RkYsIDB4RkQsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkMsCisgICAgMHhERSwgMHhERiwgMHhGRSwgMHhEQywgMHhCQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDRCwgMHhFRCwKKyAgICAweEZGLCAweEZGLCAweEVDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENELCAweEZFLCAweEVGLCAweEZGLAorICAgIDB4RkYsIDB4RUMsIDB4REMsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4REUsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRSwgMHhFRCwgMHhEQywgMHhDRCwgMHhERCwgMHhERSwgMHhFRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEVFLCAweEZFLCAweERFLCAweEVFLCAweEZGLCAweEZGLCAweENGLCAweEZGLCAweEZGLCAweEVFLCAweERELCAweERFLAorICAgIDB4RkUsIDB4REQsIDB4REUsIDB4RUUsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc4LCAweDg4LCAweDg4LCAweDg3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDgwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRiwgMHhERCwgMHhEQywgMHhDQywgMHhCQywgMHhDRCwgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhDRCwgMHhERiwKKyAgICAweERDLCAweENCLCAweENCLCAweENCLCAweENDLCAweENELCAweEZGLCAweEZGLCAweEZGLCAweERFLCAweERDLCAweENDLAorICAgIDB4QkIsIDB4QkEsIDB4QUIsIDB4QkIsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkMsIDB4REQsIDB4QkIsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhERiwgMHhGRiwgMHhEQywgMHhCQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweEFCLCAweEJDLCAweERGLCAweEZDLCAweENDLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4QkQsIDB4RkYsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhERCwgMHhGQywgMHhDQSwgMHg5OSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQiwgMHhGRiwKKyAgICAweENDLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweEJFLCAweEVDLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhERCwgMHhDQiwgMHg5OCwgMHg3NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDc4LCAweEFCLCAweENDLCAweENDLCAweEJBLCAweDk3LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REYsIDB4REIsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQiwgMHhDRCwgMHhERCwgMHhEQiwgMHhBOCwgMHg4NywgMHg3NywgMHg2NywgMHg3NywgMHg4OSwgMHhBQSwKKyAgICAweEJELCAweEZGLCAweERELCAweENBLCAweEE5LCAweDg4LCAweDc3LCAweDg4LCAweDg5LCAweDlBLCAweEJDLCAweERDLAorICAgIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODksIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0YsIDB4Q0YsIDB4RkYsCisgICAgMHhGRCwgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhEQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwKKyAgICAweENCLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweENELCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweERDLAorICAgIDB4Q0MsIDB4Q0MsIDB4REQsIDB4Q0MsIDB4RkUsIDB4REYsIDB4REYsIDB4RkYsIDB4RkYsIDB4REQsIDB4Q0MsIDB4Q0QsCisgICAgMHhDQywgMHhDRiwgMHhERCwgMHhERCwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJGLCAweERELCAweEVELCAweEVELCAweERELCAweERFLCAweEVFLCAweEZGLCAweEZGLCAweEZGLCAweENFLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4REUsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkUsIDB4REQsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRSwgMHhFRCwgMHhDQywgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweENELCAweEVGLCAweEZGLCAweEZGLCAweERFLCAweERELCAweEJCLCAweEFBLCAweDk5LCAweDk5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUQsIDB4RkYsIDB4RkUsIDB4RkQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4OUEsCisgICAgMHhCRCwgMHhFRiwgMHhGRiwgMHhERiwgMHhEQywgMHhCOSwgMHg4NywgMHg3NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhDRSwKKyAgICAweEZGLCAweEZFLCAweERELCAweEJBLCAweDk3LCAweDc2LCAweDU1LCAweDU2LCAweDc4LCAweDlCLCAweENFLCAweEZGLAorICAgIDB4RUQsIDB4REIsIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzksIDB4QUMsIDB4RUYsIDB4RUUsIDB4RUMsCisgICAgMHhCOSwgMHg4NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhDRCwgMHhGRSwgMHhFRSwgMHhDQiwgMHg5OCwKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc5LCAweEFDLCAweEVGLCAweEZELCAweEVDLCAweEI5LCAweDg3LCAweDU1LAorICAgIDB4NDQsIDB4NDUsIDB4NjcsIDB4OUEsIDB4Q0QsIDB4RkQsIDB4RUYsIDB4REIsIDB4QTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQywgMHhERiwgMHhFRSwgMHhGRCwgMHhDQiwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweEFCLCAweENELCAweEVFLCAweEZGLCAweEZELCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4REYsIDB4RUYsIDB4RkYsIDB4RUQsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4REQsIDB4RUUsCisgICAgMHhGRiwgMHhGRiwgMHhEQywgMHhDQiwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhFRSwgMHhFRiwgMHhGRiwKKyAgICAweEZGLCAweEVELCAweENDLCAweENDLCAweENDLCAweENDLCAweENELCAweEVGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhFRSwgMHhGRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhFRiwgMHhGRiwgMHhFRSwgMHhFRCwgMHhFRSwKKyAgICAweEVELCAweEZFLCAweEZFLCAweEVFLCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhBQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhERSwgMHhCQywgMHhERCwKKyAgICAweENDLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERGLCAweEZELCAweEJDLCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4RUUsIDB4RUIsIDB4Q0IsIDB4QkEsIDB4QTksIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhDRCwgMHhERCwgMHhCQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEFCLCAweENELCAweENCLCAweEJBLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QkMsIDB4Q0MsIDB4QkIsIDB4QTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCQiwKKyAgICAweEJCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDk5LCAweEFCLCAweEJBLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTQsIDB4NTUsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkIsIDB4QkIsIDB4QTksIDB4ODcsCisgICAgMHg2NiwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCQiwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDc4LCAweDlBLCAweEJCLCAweEJCLCAweEE5LCAweDg3LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkIsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEFCLCAweEJDLCAweENCLCAweEJBLCAweDk5LCAweDg4LCAweDg3LCAweDc4LCAweDg4LCAweDlBLCAweEFCLCAweENCLAorICAgIDB4Q0QsIDB4Q0IsIDB4QkEsIDB4OTksIDB4OTgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4REQsCisgICAgMHhDQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhEQywgMHhERSwgMHhERCwgMHhDQiwKKyAgICAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweENFLCAweEVFLCAweERELCAweENDLCAweENCLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RUMsIDB4QkQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4QkIsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhDQywgMHhDQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4Q0MsIDB4QkIsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHg5OSwgMHhBOSwgMHhBQSwgMHhCQiwgMHhCRCwgMHhEQywgMHhBQiwgMHhCQSwgMHhBOSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEJCLCAweENELCAweENBLCAweEJBLCAweEE5LCAweDk5LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4Q0IsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4NzcsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhCOSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweEFBLCAweEJCLCAweDlBLCAweDk4LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUEsIDB4QTksIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsCisgICAgMHg5OSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBOSwgMHg5OSwKKyAgICAweDg3LCAweDc2LCAweDY2LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDg5LCAweEFBLCAweDlBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4OTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsCisgICAgMHg2NSwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBOSwgMHg5OSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweDlBLCAweEE5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODgsIDB4OTksIDB4QUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQSwgMHhBQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQSwKKyAgICAweEJCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJCLCAweENCLAorICAgIDB4QUEsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4QkIsIDB4QUEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhCRCwgMHhERCwgMHhDQiwgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERCLCAweEJELCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEFBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENDLCAweEJCLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4QTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QUIsIDB4Q0MsIDB4REMsIDB4QUIsIDB4QUEsIDB4QTksCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhDQSwgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENCLCAweEFBLCAweEE5LCAweDg4LCAweDg4LCAweDc3LCAweDc3LAorICAgIDB4NzgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QjksIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHg5QSwgMHhCQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFBLCAweEE5LCAweDk5LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LCAweEFBLAorICAgIDB4OTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QTksIDB4OTksCisgICAgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQSwgMHg5OSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDY1LCAweDU2LCAweDY2LCAweDY3LCAweDg4LCAweDlBLCAweDk5LCAweDk5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QTksIDB4OUEsIDB4OTgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDc4LCAweDg5LCAweEFBLCAweEFBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDY3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4OUEsIDB4QUEsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4OUEsIDB4QUEsCisgICAgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhBQiwgMHhCQiwKKyAgICAweEFBLCAweDk5LCAweDk4LCAweDg4LCAweDg4LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENDLCAweENCLCAweEJBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkIsIDB4QkQsIDB4REMsIDB4Q0IsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDQiwgMHhDRCwgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHg5OSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhCQSwgMHhBQSwgMHhBOSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhBQiwgMHhDQywKKyAgICAweEJCLCAweEJCLCAweEFBLCAweEFBLCAweEJBLCAweEJDLCAweENELCAweEVELCAweEVDLCAweEJDLCAweEJCLCAweEJBLAorICAgIDB4QTksIDB4QTksIDB4QTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4REUsIDB4REIsIDB4QkIsIDB4QkEsIDB4OTksIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhEQywgMHhBQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDk5LCAweEFCLCAweENDLCAweEJBLCAweEJBLCAweDk5LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4QUIsIDB4Q0MsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4OUEsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg4OSwgMHg5QSwgMHhCQSwKKyAgICAweEFBLCAweDk5LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweEFBLCAweEFBLAorICAgIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4OTksIDB4ODcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQSwgMHhCQSwgMHhBOSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEJBLCAweEFCLCAweEE5LCAweDg3LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4ODksIDB4QUEsIDB4QUIsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg2NywgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEFCLCAweEFDLCAweENCLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc4LCAweDg5LCAweDk5LCAweEFBLCAweEJBLAorICAgIDB4Q0MsIDB4Q0IsIDB4QTksIDB4OTksIDB4ODgsIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkIsIDB4QUMsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQiwgMHhDQiwgMHhDRSwgMHhEQywgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweEJFLCAweEVELCAweERDLCAweENDLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QUEsIDB4QkMsIDB4Q0MsIDB4REIsIDB4QUQsIDB4REQsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkEsCisgICAgMHhBQSwgMHhCQiwgMHhCQiwgMHhCQywgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4Q0QsIDB4QUIsIDB4Q0MsCisgICAgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhGRCwgMHhCQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweDlBLCAweEFBLCAweEFBLCAweEJCLCAweENELCAweERFLCAweERCLCAweEJCLCAweEFBLCAweDk5LCAweDk5LAorICAgIDB4ODksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4REMsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhCQiwgMHhDQywgMHhDQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEJCLCAweENDLCAweEFCLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkMsIDB4Q0EsIDB4QUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjUsIDB4NjYsIDB4NjcsIDB4ODksIDB4QUEsIDB4Q0IsCisgICAgMHhBQSwgMHg5OSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCQSwgMHhBQSwKKyAgICAweDk4LCAweDc2LCAweDY1LCAweDU1LCAweDU1LCAweDY3LCAweDc4LCAweDlBLCAweEJCLCAweEFBLCAweEE5LCAweDg3LAorICAgIDB4NjYsIDB4NTUsIDB4NDUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUIsIDB4QkIsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwgMHhCQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEJCLCAweEJBLCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4OUEsIDB4QkIsIDB4QkMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhBQiwgMHhCQywgMHhDQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQiwKKyAgICAweENELCAweENCLCAweEFBLCAweDk5LCAweDk4LCAweDg4LCAweDg5LCAweDk5LCAweEFBLCAweEJCLCAweEJELCAweEVELAorICAgIDB4Q0IsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0IsIDB4REUsIDB4RUQsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhDRCwgMHhCRCwgMHhGRSwgMHhFRCwgMHhDQywgMHhDQywKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERCLCAweEFELCAweERELCAweENDLCAweENDLCAweEJCLCAweEJCLAorICAgIDB4QUIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFGLCAweERGLCAweERGLCAweEZELCAweERELCAweENELCAweERGLCAweEZELCAweEZGLCAweERELCAweDlGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweERGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4REYsIDB4Q0QsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhERiwgMHhDQywgMHhDRCwgMHhGRCwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZELCAweEJBLCAweDg4LCAweEFDLCAweERGLCAweEZELCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0EsIDB4NzQsIDB4NDYsIDB4OUMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhERiwgMHhGQywgMHg4NSwgMHgyMiwgMHg0NywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEQ4LCAweDQyLCAweDEzLCAweDdCLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERDLCAweEE2LAorICAgIDB4NDMsIDB4NTgsIDB4Q0YsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QTgsIDB4NzgsCisgICAgMHhBQiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhEQiwgMHhCQywgMHhERiwKKyAgICAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEZGLCAweERELCAweEZELCAweERGLCAweERGLAorICAgIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhERiwKKyAgICAweERELCAweEZELCAweEZGLCAweERELCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERiwgMHhGRiwgMHhGRCwgMHhERCwgMHhDRCwgMHhERSwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwKKyAgICAweEZGLCAweEVELCAweERDLCAweENDLCAweENELCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVFLCAweERELAorICAgIDB4QkIsIDB4QkEsIDB4QkIsIDB4QkQsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0MsIDB4QkEsIDB4QUEsCisgICAgMHg5OSwgMHhBQSwgMHhCQiwgMHhDRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OSwKKyAgICAweDlBLCAweEFCLCAweENFLCAweEZGLCAweEZFLCAweEZDLCAweENBLCAweDk4LCAweDg3LCAweDc3LCAweDc4LCAweDk5LAorICAgIDB4QUIsIDB4REQsIDB4RkYsIDB4REQsIDB4QkIsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4OTksIDB4QkMsCisgICAgMHhERiwgMHhFRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhGRiwKKyAgICAweEZDLCAweEI5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweEFCLCAweENGLCAweEZDLCAweERCLAorICAgIDB4QTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OEEsIDB4QkMsIDB4RUQsIDB4REMsIDB4Q0EsIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QiwgMHhDRSwgMHhGRSwgMHhEQiwgMHhBOSwgMHg3NiwgMHg1NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEJDLCAweERELCAweERDLCAweENBLCAweDk4LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4QUIsIDB4Q0YsIDB4RUQsIDB4RkQsIDB4QkEsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5QSwgMHhCRSwgMHhFRiwgMHhERiwgMHhDQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweENGLCAweEZFLCAweEZGLCAweERDLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDlBLCAweEJDLCAweERGLCAweEVGLAorICAgIDB4RkYsIDB4RkUsIDB4Q0IsIDB4QkEsIDB4OTksIDB4OUEsIDB4QUEsIDB4QkMsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRCwgMHhDRCwgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwKKyAgICAweEVELCAweERDLCAweERDLCAweERELCAweENGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweERGLCAweEVGLAorICAgIDB4REQsIDB4RUUsIDB4RkYsIDB4REUsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RUQsCisgICAgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REYsIDB4RUUsIDB4RUQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkYsIDB4REUsIDB4RkYsCisgICAgMHhFRCwgMHhDQywgMHhDQywgMHhCQywgMHhDQywgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhFRiwgMHhFRCwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEJCLCAweENELCAweERFLCAweEZGLCAweEZFLCAweEZELCAweENCLCAweEFBLCAweEE5LAorICAgIDB4OTksIDB4OTksIDB4QUIsIDB4QkMsIDB4RUYsIDB4RkYsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHhBQSwgMHhCQywgMHhFRiwgMHhGRCwgMHhEQiwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweDlCLCAweENELCAweEVFLCAweERELCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDg5LCAweEFCLAorICAgIDB4Q0UsIDB4RUMsIDB4Q0IsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QkMsIDB4REUsCisgICAgMHhDQywgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhEQywgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDU0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweENCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzcsIDB4OUEsIDB4QkQsIDB4REMsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhERCwgMHhEQywgMHhCOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweENELCAweERELCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4RUQsIDB4RUQsIDB4Q0IsIDB4OTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhERSwgMHhFQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4NywgMHg4OCwgMHg4OSwgMHhBQiwgMHhDRCwgMHhFRiwKKyAgICAweEZGLCAweERELCAweEJCLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweEFCLCAweENDLCAweEVGLCAweEZGLCAweEZGLAorICAgIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUQsCisgICAgMHhDQywgMHhCQiwgMHhCQiwgMHhCQywgMHhEQywgMHhERSwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhFRSwgMHhFRCwKKyAgICAweERDLCAweERELCAweEVELCAweEVGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZFLCAweEVELCAweERELCAweERELAorICAgIDB4REQsIDB4REQsIDB4RUYsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENELCAweENELCAweERDLCAweENDLCAweENELCAweERFLCAweERELCAweEZGLCAweEZGLCAweEZGLCAweERELCAweEZFLAorICAgIDB4REMsIDB4Q0MsIDB4Q0IsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4REQsIDB4Q0IsCisgICAgMHhCQiwgMHhCQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhFRiwgMHhFRiwgMHhGRCwgMHhGQywgMHhDQiwgMHhBOSwgMHhBOSwKKyAgICAweDk5LCAweDlBLCAweEFCLCAweENELCAweERGLCAweEZFLCAweENFLCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4OTksIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RkMsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHhBQiwgMHhDRSwgMHhGRSwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQywKKyAgICAweERFLCAweEVDLCAweENBLCAweDk4LCAweDc3LCAweDY1LCAweDU1LCAweDU2LCAweDc3LCAweDlBLCAweEJDLCAweERELAorICAgIDB4Q0MsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4RUMsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhERCwgMHhDQywgMHhCOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEJELCAweERDLCAweENCLCAweDk4LCAweDc2LCAweDU1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4REQsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhERCwgMHhEQywgMHhCOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDk5LCAweEJCLCAweERGLCAweERFLCAweENCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REQsIDB4RUQsIDB4QkIsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODksIDB4QUEsIDB4QkQsIDB4REQsCisgICAgMHhGRiwgMHhFRCwgMHhDQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhERSwgMHhFRiwgMHhGRiwKKyAgICAweEZELCAweENDLCAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweERELCAweEVFLCAweEZGLCAweEZGLCAweEVELAorICAgIDB4REMsIDB4Q0IsIDB4QkMsIDB4Q0IsIDB4Q0QsIDB4Q0QsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsCisgICAgMHhFQywgMHhEQywgMHhDQywgMHhFRiwgMHhFRiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhFRCwgMHhERCwKKyAgICAweERDLCAweERELCAweERELCAweERGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRiwgMHhFRSwgMHhFRCwgMHhFRiwgMHhFRCwgMHhFRSwgMHhGRSwgMHhFRiwgMHhGRSwgMHhGRiwgMHhBRSwgMHhGRiwKKyAgICAweEZFLCAweEVFLCAweEVFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweERELAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkUsIDB4RUQsIDB4Q0MsIDB4Q0IsCisgICAgMHhCQiwgMHhDQywgMHhERSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERCwgMHhDQiwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEJCLCAweENELCAweEVGLCAweEZGLCAweEZFLCAweEZFLCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RUUsIDB4REMsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODksIDB4QUIsIDB4REUsCisgICAgMHhGRiwgMHhGRiwgMHhGRCwgMHhCQSwgMHg5NywgMHg3NiwgMHg1NSwgMHg2NiwgMHg4OSwgMHhBQywgMHhERiwgMHhGRSwKKyAgICAweEVFLCAweERCLCAweEE4LCAweDc2LCAweDU0LCAweDQ1LCAweDY3LCAweDhBLCAweEJELCAweEZGLCAweEVFLCAweEVELAorICAgIDB4QkEsIDB4ODcsIDB4NTQsIDB4MzMsIDB4NDUsIDB4NjgsIDB4OUIsIDB4REYsIDB4RkUsIDB4RkYsIDB4REIsIDB4QTgsCisgICAgMHg3NSwgMHg0MywgMHgzNCwgMHg1NiwgMHg4OSwgMHhCQywgMHhFRiwgMHhFRSwgMHhGRCwgMHhDQSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDQ1LCAweDY4LCAweDlCLCAweENFLCAweEZGLCAweEZGLCAweEVDLCAweEI5LCAweDg2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4OEEsIDB4QkQsIDB4RUYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QTksIDB4ODcsIDB4NjYsIDB4NzcsIDB4ODksCisgICAgMHhBQiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhDQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OSwgMHhBQiwgMHhDRCwKKyAgICAweEVGLCAweEZGLCAweEZGLCAweEZFLCAweENCLCAweEFBLCAweDk5LCAweDlBLCAweEFBLCAweEJDLCAweERFLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4REMsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhFRCwgMHhERCwgMHhDRCwgMHhERCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEVGLCAweEVGLCAweEVGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUUsIDB4REQsIDB4RUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RkUsIDB4RUUsIDB4RkYsIDB4QkQsIDB4RkYsCisgICAgMHhFRSwgMHhFRCwgMHhFRCwgMHhFRSwgMHhFRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRSwgMHhFRCwgMHhERCwKKyAgICAweENDLCAweENDLCAweERELCAweERFLCAweEVFLCAweEZGLCAweEZGLCAweEVFLCAweEVFLCAweERDLCAweENCLCAweEJCLAorICAgIDB4QkIsIDB4QkMsIDB4REQsIDB4RUUsIDB4RkYsIDB4RkUsIDB4REUsIDB4REMsIDB4QkIsIDB4QUEsIDB4OTksIDB4QUEsCisgICAgMHhCQiwgMHhDRCwgMHhFRiwgMHhGRiwgMHhFRCwgMHhERCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhBQiwKKyAgICAweENELCAweEVGLCAweEZFLCAweERELCAweERCLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDg5LCAweEFCLCAweENFLAorICAgIDB4RkYsIDB4RUQsIDB4REMsIDB4QkEsIDB4OTcsIDB4NzYsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REUsIDB4RkUsCisgICAgMHhERCwgMHhDQiwgMHhBOCwgMHg3NiwgMHg1NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCQywgMHhFRiwgMHhERCwgMHhEQywKKyAgICAweEI5LCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDY4LCAweDlCLCAweENELCAweEVFLCAweERFLCAweENCLCAweEE4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTYsIDB4ODksIDB4QkMsIDB4REYsIDB4REQsIDB4RUQsIDB4QkEsIDB4OTcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg3OCwgMHg5QSwgMHhDRCwgMHhFRSwgMHhERSwgMHhEQywgMHhCOSwgMHg4NywgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEJDLCAweERFLCAweERELCAweEVFLCAweERCLCAweEE5LCAweDg3LCAweDY2LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4RkQsIDB4REUsIDB4RUQsIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkMsCisgICAgMHhERiwgMHhERCwgMHhGRSwgMHhFRCwgMHhDQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhERSwgMHhGRSwKKyAgICAweERGLCAweEZGLCAweEVELCAweENDLCAweEJCLCAweEFCLCAweEJCLCAweEJDLCAweERFLCAweEVGLCAweERELCAweEZGLAorICAgIDB4RkYsIDB4RUUsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RkUsIDB4REYsIDB4RkYsIDB4RkYsCisgICAgMHhFRSwgMHhFRCwgMHhERCwgMHhERCwgMHhERCwgMHhERSwgMHhGRSwgMHhFRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwKKyAgICAweEVFLCAweEVFLCAweEZFLCAweEZGLCAweEZGLCAweEZFLCAweDlELCAweEVFLCAweERELCAweERFLCAweERELCAweERELAorICAgIDB4REQsIDB4REQsIDB4RkUsIDB4RUQsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFCLCAweEFBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweEJCLCAweENCLAorICAgIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4REMsIDB4QUIsIDB4QkEsIDB4QTksCisgICAgMHg5OSwgMHg4OCwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhDQSwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJCLCAweEFBLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4OTksIDB4QUIsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHg5QSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFBLCAweEE5LCAweDk5LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLAorICAgIDB4OTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QTksIDB4OTgsCisgICAgMHg4NywgMHg3NiwgMHg2NiwgMHg1NSwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBOSwgMHg5OSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDY1LCAweDU2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweDk5LCAweDk5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NjUsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QUEsIDB4OTksIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3NywKKyAgICAweDg4LCAweDlBLCAweEFBLCAweEFBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUEsIDB4QUEsIDB4QTksIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkEsCisgICAgMHhBQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhBQiwgMHhDQiwKKyAgICAweEE5LCAweDk5LCAweDk4LCAweDg4LCAweDg5LCAweDk5LCAweEFBLCAweEFCLCAweENCLCAweEJDLCAweEJBLCAweEFBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MsIDB4QkMsIDB4Q0MsIDB4Q0IsIDB4QkEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhEQywgMHhBQywgMHhCQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweENDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhBQiwgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweEFCLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4ODgsIDB4ODksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkEsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQiwgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywKKyAgICAweDc4LCAweDg5LCAweDk5LCAweEFCLCAweEE5LCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4OUEsIDB4QkEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHg5QSwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBQSwKKyAgICAweDk5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEE5LCAweDk4LAorICAgIDB4ODcsIDB4NzYsIDB4NjYsIDB4NTYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QTksIDB4OTksIDB4ODgsIDB4NzcsCisgICAgMHg2NiwgMHg2NSwgMHg1NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHg5OSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LCAweEE5LCAweDk5LCAweDk4LCAweDc3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QTksIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5OSwgMHhBQSwgMHg5QSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg4OSwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweDk4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDg5LCAweDlBLCAweEJBLAorICAgIDB4QUIsIDB4QTksIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QUIsIDB4QkIsCisgICAgMHhBQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQiwgMHhCQywgMHhCQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEFCLCAweEJDLCAweEJDLCAweERDLCAweEJCLCAweEJBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REMsIDB4QUMsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QTksIDB4OTksCisgICAgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUIsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4QkQsIDB4QUIsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhCQywgMHhEQywgMHhCQywgMHhCQSwgMHhBOSwKKyAgICAweDk5LCAweDg5LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweENELCAweEJBLCAweEJBLCAweEE5LCAweDk4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4QkMsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsCisgICAgMHg3OCwgMHg4OSwgMHg5QSwgMHhCQywgMHhCOSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEJBLCAweDlBLCAweDk5LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QTksIDB4OTksIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsCisgICAgMHg5OSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBOSwgMHg5OCwKKyAgICAweDg3LCAweDc2LCAweDY2LCAweDY1LCAweDY2LCAweDY2LCAweDc4LCAweDg5LCAweEFBLCAweDk5LCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NjUsIDB4NTYsIDB4NjYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4OTksIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEE5LCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODgsIDB4OTksIDB4QUEsIDB4OUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQSwKKyAgICAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEJCLCAweEJCLCAweENCLAorICAgIDB4QUEsIDB4OTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0IsIDB4Q0MsIDB4Q0IsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhCQywgMHhEQywgMHhCQywgMHhCQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweERDLCAweEFELCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweDlBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweENDLCAweENDLCAweEJDLCAweENCLCAweENCLCAweENDLCAweENDLCAweENELCAweERELCAweDlDLCAweEVELAorICAgIDB4Q0QsIDB4Q0MsIDB4Q0IsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4RUUsIDB4RUYsIDB4RkQsIDB4Q0QsIDB4Q0MsIDB4Q0IsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhFRiwgMHhEQywgMHhDQywgMHhCQSwgMHhBQSwgMHg5OSwKKyAgICAweDlBLCAweEFBLCAweEJCLCAweEJDLCAweERFLCAweEZELCAweENELCAweEJCLCAweEE5LCAweDk4LCAweDg4LCAweDg5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4RUUsIDB4REMsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhDRCwgMHhFRCwgMHhCQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhCQiwKKyAgICAweENFLCAweERDLCAweENCLCAweEE4LCAweDg3LCAweDY2LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERDLAorICAgIDB4QkMsIDB4QkEsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NDUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4Q0MsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQywgMHhDQywgMHhDQywgMHhCQSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ0LCAweDU2LCAweDc4LCAweDlBLCAweEJELCAweENDLCAweENCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4REMsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhDRCwgMHhDQywgMHhBQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweERDLCAweERELCAweENCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REQsIDB4RUQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4REMsCisgICAgMHhERSwgMHhERCwgMHhDQiwgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhERCwgMHhERCwgMHhFRSwKKyAgICAweERELCAweENDLCAweEJCLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweERELCAweERGLCAweEZFLCAweEVFLAorICAgIDB4REMsIDB4Q0MsIDB4Q0IsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4REUsIDB4RkYsIDB4RkYsIDB4RUUsIDB4REQsCisgICAgMHhEQywgMHhDRCwgMHhERCwgMHhERCwgMHhFRCwgMHhFRCwgMHhBRSwgMHhERCwgMHhERCwgMHhDRCwgMHhDQywgMHhDQywKKyAgICAweENDLCAweENELCAweERELCAweERELCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERiwgMHhGRSwgMHhFRSwgMHhERCwgMHhERCwgMHhERCwgMHhFRSwgMHhFRiwgMHhFRiwgMHhGRiwgMHhCRiwgMHhGRiwKKyAgICAweEZGLCAweERELCAweERELCAweERELCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERELAorICAgIDB4Q0MsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REMsIDB4Q0IsIDB4QUEsCisgICAgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhGRiwgMHhGRiwgMHhFRiwgMHhEQywgMHhCQiwgMHhBOSwgMHg5OSwgMHg5OSwKKyAgICAweDlBLCAweEJDLCAweERFLCAweEZGLCAweEZFLCAweEVELCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc4LCAweDlBLAorICAgIDB4QkMsIDB4REYsIDB4RkYsIDB4RUQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsCisgICAgMHhFRiwgMHhGRCwgMHhEQywgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhDRSwgMHhGRiwKKyAgICAweEVELCAweEJBLCAweDk3LCAweDY1LCAweDU1LCAweDQ1LCAweDU2LCAweDc5LCAweEFCLCAweERFLCAweEZELCAweENCLAorICAgIDB4QTksIDB4NzYsIDB4NTUsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OEEsIDB4QkMsIDB4RUYsIDB4REQsIDB4QkEsIDB4ODcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHhBQiwgMHhERSwgMHhFRSwgMHhEQywgMHhBOSwgMHg3NiwgMHg1NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDlBLCAweEJELCAweEVGLCAweEVFLCAweENBLCAweDk4LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUMsIDB4REYsIDB4RkUsIDB4RUQsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QiwgMHhDRCwgMHhFRSwgMHhGRiwgMHhEQywgMHhCQSwgMHg5OCwgMHg3NywgMHg3NywgMHg4OCwgMHg5QSwgMHhCQywKKyAgICAweEVGLCAweEZGLCAweEZFLCAweERDLCAweEJBLCAweDk5LCAweDg4LCAweDg5LCAweEFBLCAweEJDLCAweERFLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4REMsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhEQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEVELCAweERELCAweENELCAweERELCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4QUYsIDB4RkEsIDB4N0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHg5RiwgMHhBQSwgMHhCQSwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweEZGLCAweEZGLCAweDk4LCAweDg5LCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4NzYsIDB4NzgsIDB4NzgsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHg2NCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEE5LCAweDc0LCAweDIyLCAweDU3LCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4OTcsIDB4NTIsIDB4MTQsIDB4NjksIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjksIDB4ODYsCisgICAgMHg0NCwgMHg1NywgMHg4QSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5OSwgMHg3NiwgMHg3NywKKyAgICAweDg5LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEM5LCAweDg5LCAweDk5LCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUYsIDB4QUYsIDB4RkEsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEFGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsCisgICAgMHhGRiwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHhGRiwgMHhBRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDc5LCAweEZBLCAweENGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENELCAweERELCAweENDLCAweENCLCAweEJCLCAweENDLCAweENDLCAweERELCAweEVFLCAweEVFLCAweENELCAweEVFLAorICAgIDB4REQsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RkYsIDB4REUsIDB4REMsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhGRiwgMHhGRCwgMHhEQywgMHhCQiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweERFLCAweEZFLCAweENDLCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QkMsIDB4REUsIDB4RUMsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NywgMHg4OCwgMHhBQiwKKyAgICAweENELCAweERDLCAweENBLCAweDk4LCAweDc3LCAweDY1LCAweDU1LCAweDU2LCAweDY3LCAweDg5LCAweEFCLCAweERELAorICAgIDB4QkIsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REMsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhCQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU1LCAweDQ1LCAweDU2LCAweDc3LCAweDlBLCAweEJDLCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDU1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4Q0MsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDk5LCAweEFDLCAweERELCAweERELCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REQsIDB4REMsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzgsIDB4ODgsIDB4ODksIDB4QUEsIDB4QkMsIDB4REQsCisgICAgMHhFRSwgMHhEQywgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQiwgMHhCQywgMHhERSwgMHhERSwgMHhGRSwKKyAgICAweERDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweENDLCAweERELCAweEVELCAweEZGLCAweEZFLCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REUsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4REQsCisgICAgMHhDQywgMHhDQywgMHhERCwgMHhFRSwgMHhFRiwgMHhGRSwgMHhDRiwgMHhGRiwgMHhFRSwgMHhERCwgMHhERCwgMHhERCwKKyAgICAweERELCAweERELCAweERELCAweEVFLCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRSwgMHhERSwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhERCwgMHhFRiwgMHhGRiwgMHhCRiwgMHhFRiwKKyAgICAweEVELCAweERDLCAweENDLCAweENDLCAweENELCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweERELCAweENCLAorICAgIDB4QkIsIDB4QkEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4RUYsIDB4RkYsIDB4RkQsIDB4RUQsIDB4Q0IsIDB4QkEsIDB4QTksCisgICAgMHg5OSwgMHg5QSwgMHhCQiwgMHhDRCwgMHhFRiwgMHhGRiwgMHhERCwgMHhDQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweEFCLCAweENELCAweEVGLCAweEVELCAweENDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4REUsIDB4RkYsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODksIDB4QUMsCisgICAgMHhERSwgMHhFRCwgMHhDQiwgMHhBOSwgMHg3NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NywgMHg4QSwgMHhCQywgMHhERSwKKyAgICAweERDLCAweEJBLCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweENFLCAweEVELCAweENCLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REQsIDB4REMsIDB4QjksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhFQywgMHhDQiwgMHg5OCwgMHg3NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweERGLCAweERELCAweEJBLCAweDk3LCAweDY2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4QUIsIDB4Q0QsIDB4REQsIDB4REIsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5QSwgMHhCRCwgMHhERiwgMHhERSwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg5QSwgMHhBQywKKyAgICAweERGLCAweERGLCAweEZELCAweENCLCAweEE5LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEJCLCAweENELCAweEVFLAorICAgIDB4RkYsIDB4RkMsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTksIDB4OUEsIDB4QkIsIDB4Q0QsIDB4RUYsIDB4RkYsIDB4RkUsCisgICAgMHhFQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhFRiwgMHhFRCwgMHhFRiwgMHhGRiwgMHhFRCwKKyAgICAweERELCAweENCLCAweENCLCAweENDLCAweERELCAweERFLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEVFLCAweEVELAorICAgIDB4REQsIDB4REUsIDB4RUUsIDB4RUUsIDB4RkYsIDB4RkUsIDB4QUUsIDB4RkYsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUQsCisgICAgMHhGRCwgMHhFRCwgMHhGRSwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0YsIDB4RkUsIDB4RkYsIDB4RUUsIDB4RUYsIDB4RUYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRSwgMHhFRSwgMHhERCwgMHhERiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRCwKKyAgICAweERELCAweENCLCAweEJDLCAweENELCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERELCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4QkIsIDB4QkMsIDB4REYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4REQsIDB4Q0IsIDB4QTksIDB4OTksIDB4OTksCisgICAgMHg5QSwgMHhCQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEJDLCAweERGLCAweEZGLCAweEZFLCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDY2LCAweDc4LCAweDlBLCAweEJELAorICAgIDB4RkYsIDB4RkUsIDB4REMsIDB4QjksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUIsIDB4REUsIDB4RkYsCisgICAgMHhFRSwgMHhDQSwgMHg5OCwgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OSwgMHhBQywgMHhFRiwgMHhGRiwgMHhEQywKKyAgICAweEE5LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDhBLCAweENELCAweEZGLCAweEVELCAweENBLCAweDk3LAorICAgIDB4NjUsIDB4NDQsIDB4NDQsIDB4NTYsIDB4NzksIDB4QUMsIDB4REYsIDB4RkUsIDB4RUMsIDB4QTksIDB4ODYsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg2NywgMHg5QSwgMHhDRCwgMHhGRiwgMHhFRSwgMHhDQiwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFDLCAweERGLCAweEZGLCAweEZELCAweENBLCAweDk4LCAweDc2LCAweDY2LCAweDY3LCAweDg5LAorICAgIDB4QUIsIDB4Q0UsIDB4RUYsIDB4RkYsIDB4RUMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODksIDB4OUIsIDB4Q0QsCisgICAgMHhFRiwgMHhGRiwgMHhGRiwgMHhFQywgMHhCQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhERiwgMHhGRiwKKyAgICAweEZGLCAweEZFLCAweERDLCAweEJCLCAweEFBLCAweEFBLCAweEFCLCAweENDLCAweERGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4REQsIDB4Q0IsIDB4Q0IsIDB4Q0MsIDB4Q0QsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRSwgMHhERCwgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFCLCAweEJCLCAweEFBLCAweEFBLCAweDk5LCAweEFBLCAweEFBLCAweEFCLCAweENDLCAweENELCAweEJCLCAweENDLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4REQsIDB4RUUsIDB4QkMsIDB4QkIsIDB4QTksCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhEQSwgMHhCQSwgMHhBOSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweENDLCAweEFCLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4OUEsIDB4QkMsIDB4Q0EsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHhBQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5OSwKKyAgICAweEFCLCAweEJBLCAweEE5LCAweDg4LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDg4LCAweDlBLCAweEJCLAorICAgIDB4OUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjUsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsIDB4QjksIDB4QTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQiwgMHg5QSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEFBLCAweEE5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NTUsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwgMHhBQSwgMHhBOSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg4LCAweDlBLCAweEJCLCAweEJCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4QkIsIDB4QkEsIDB4QTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsCisgICAgMHhCQywgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQywgMHhCQywgMHhDQywKKyAgICAweEJCLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweENDLCAweEJCLAorICAgIDB4QUEsIDB4QUEsIDB4QTksIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0QsIDB4Q0QsIDB4REQsIDB4REMsIDB4Q0IsIDB4QkIsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhFQywgMHhBRSwgMHhERCwgMHhDQywgMHhCQiwgMHhBQSwgMHhBQSwKKyAgICAweEFCLCAweEJCLCAweEJDLCAweENELCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhCQSwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQiwgMHg5QiwgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEE5LCAweEFBLCAweEFBLCAweEJCLCAweENELCAweERDLCAweEJDLCAweEJCLCAweEFBLAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0QsIDB4Q0EsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhCQywgMHhDQywgMHhBQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweDlBLCAweEJDLCAweEJBLCAweEFBLCAweDk5LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4QUEsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhCOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQiwKKyAgICAweDlBLCAweDk4LCAweDg3LCAweDY2LCAweDY1LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweEE5LCAweEE5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsIDB4OUEsIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwgMHhBOSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDY2LCAweDY3LCAweDc4LCAweDlBLCAweEJBLCAweEFBLCAweDk4LCAweDg3LCAweDY2LCAweDY2LCAweDY2LAorICAgIDB4NjcsIDB4NzgsIDB4ODksIDB4QUEsIDB4QUEsIDB4QTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEFCLCAweEFBLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDk5LCAweEFBLCAweEJCLAorICAgIDB4QkIsIDB4QkEsIDB4OTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkMsIDB4QkIsIDB4Q0IsCisgICAgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhDRCwgMHhDQywgMHhCQiwKKyAgICAweEFBLCAweEE5LCAweDk5LCAweEFBLCAweEFCLCAweEJCLCAweERELCAweEJDLCAweERDLCAweENDLCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4QkEsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REMsIDB4OUMsIDB4Q0MsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QUEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4QUIsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhDQywgMHhEQywgMHhBQiwgMHhCQSwgMHhBOSwKKyAgICAweDk5LCAweDk4LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweENBLCAweEJBLCAweEE5LCAweDk4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0IsIDB4QUEsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsCisgICAgMHg3OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhCOSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEJBLCAweDlBLCAweDk4LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QTksIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsCisgICAgMHg5OSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBOSwgMHg5OCwKKyAgICAweDg3LCAweDc2LCAweDY2LCAweDU1LCAweDY2LCAweDY3LCAweDc4LCAweDg5LCAweEFBLCAweDk5LCAweDg4LCAweDc3LAorICAgIDB4NjYsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QTksIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBQSwgMHg5OSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEE5LCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QUEsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhBQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQSwKKyAgICAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEJCLCAweEFCLCAweEJCLAorICAgIDB4QUEsIDB4OTksIDB4OTksIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0IsIDB4QkMsIDB4Q0IsIDB4QUEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhCQywgMHhCQywgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweENCLCAweEFDLCAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweENCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweENDLCAweDlDLCAweERDLAorICAgIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4REQsIDB4RUMsIDB4QkMsIDB4Q0IsIDB4QUEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhDRSwgMHhDQiwgMHhDQiwgMHhCQSwgMHg5OSwgMHg5OCwKKyAgICAweDg4LCAweDg5LCAweDk5LCAweEFCLCAweEJDLCAweERDLCAweEJCLCAweEJBLCAweDk4LCAweDg4LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4QUEsIDB4QkMsIDB4Q0IsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg5OSwgMHhBQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5OSwKKyAgICAweEJDLCAweEJBLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDg5LCAweDlBLCAweEJCLAorICAgIDB4QUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QkEsIDB4QTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwgMHhBQSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweEJBLCAweEE5LCAweDg4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkIsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjUsIDB4NjYsCisgICAgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhCQiwgMHhBQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFBLCAweENCLCAweEJCLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDg5LCAweDlBLAorICAgIDB4QkMsIDB4QkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0MsCisgICAgMHhCQywgMHhCQiwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhDQywgMHhEQywKKyAgICAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweERDLCAweERELCAweERDLCAweEJCLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4REUsIDB4Q0QsIDB4Q0IsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERCwgMHhFRCwgMHg5RCwgMHhDQywgMHhDQywgMHhCQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweEJDLCAweENDLCAweERELCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBRSwgMHhERSwgMHhERCwgMHhFRCwgMHhEQywgMHhDQywgMHhEQywgMHhERCwgMHhERCwgMHhERCwgMHg5RSwgMHhGRiwKKyAgICAweEZGLCAweEZELCAweEVFLCAweEVFLCAweEVFLCAweERFLCAweEVFLCAweEVGLCAweEZELCAweEVGLCAweEVFLCAweEVELAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4REUsIDB4RUYsIDB4RUUsIDB4RUYsIDB4REUsIDB4RUYsIDB4REQsIDB4REMsIDB4Q0MsCisgICAgMHhDQywgMHhDQywgMHhERCwgMHhFRSwgMHhFRiwgMHhGRCwgMHhERiwgMHhFRCwgMHhDQywgMHhCQiwgMHhCQiwgMHhCQiwKKyAgICAweEJDLCAweENELCAweERELCAweEZGLCAweERFLCAweEVFLCAweERDLCAweEJBLCAweDk5LCAweDk5LCAweDlBLCAweEJDLAorICAgIDB4Q0UsIDB4RkUsIDB4RkQsIDB4REYsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4ODgsIDB4OUEsIDB4QkMsIDB4REUsCisgICAgMHhGRSwgMHhERCwgMHhFRSwgMHhDQiwgMHhBOCwgMHg3NiwgMHg2NiwgMHg2NywgMHg5QSwgMHhCQywgMHhFRSwgMHhGRCwKKyAgICAweERFLCAweERDLCAweEE5LCAweDg2LCAweDU0LCAweDQ1LCAweDY4LCAweDlCLCAweENELCAweEVGLCAweEVELCAweEVELAorICAgIDB4Q0IsIDB4OTcsIDB4NjQsIDB4MzIsIDB4NDYsIDB4NzksIDB4QkMsIDB4REUsIDB4RkUsIDB4REUsIDB4RUMsIDB4QjksCisgICAgMHg4NiwgMHg0MiwgMHgyNCwgMHg1NywgMHg5QSwgMHhDRCwgMHhFRiwgMHhERCwgMHhFRCwgMHhDQiwgMHg5OCwgMHg3NSwKKyAgICAweDQ0LCAweDU2LCAweDc5LCAweEFDLCAweERFLCAweEVFLCAweERGLCAweEVELCAweENBLCAweDk4LCAweDc2LCAweDY2LAorICAgIDB4NzgsIDB4OUIsIDB4Q0QsIDB4RkYsIDB4RUQsIDB4RUYsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NzgsIDB4OUEsCisgICAgMHhCQywgMHhERSwgMHhGRSwgMHhERiwgMHhFRCwgMHhEQywgMHhCQSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhCQywgMHhERCwKKyAgICAweEVGLCAweEVFLCAweEZGLCAweEVELCAweENDLCAweEJCLCAweEFBLCAweEJCLCAweEJDLCAweERELCAweEVGLCAweEZFLAorICAgIDB4REYsIDB4RkUsIDB4RUUsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REUsIDB4RUYsIDB4RkYsIDB4RUUsIDB4RkUsCisgICAgMHhGRSwgMHhFRSwgMHhFRSwgMHhERCwgMHhERCwgMHhFRCwgMHhFRSwgMHhFRSwgMHhGRSwgMHhFRSwgMHhFRiwgMHhGRiwKKyAgICAweEVFLCAweEVFLCAweERFLCAweEVFLCAweEZFLCAweEZGLCAweEZGLCAweEVFLCAweEZGLCAweEZGLCAweEZFLCAweEVGLAorICAgIDB4RUYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUUsIDB4REQsIDB4REQsIDB4RUUsIDB4REQsIDB4REQsCisgICAgMHhFRSwgMHhERSwgMHhFRSwgMHhGRSwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUYsIDB4RkUsIDB4RUYsIDB4RkYsIDB4RUYsIDB4QUYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEVFLCAweERFLCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEVDLCAweENDLAorICAgIDB4Q0MsIDB4Q0MsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUMsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhCQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFQywgMHhCQSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhBQiwKKyAgICAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEJBLCAweDk4LCAweDc3LCAweDc3LCAweDg5LCAweEFDLCAweERGLAorICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4Q0IsIDB4OTgsIDB4NjYsIDB4NTUsIDB4NjYsIDB4ODksIDB4QkMsIDB4REYsIDB4RkYsCisgICAgMHhGRiwgMHhEQywgMHhBOCwgMHg3NiwgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRCwKKyAgICAweENBLCAweDg2LCAweDU0LCAweDMzLCAweDQ1LCAweDY4LCAweEFDLCAweERGLCAweEZGLCAweEZGLCAweERDLCAweEE4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTYsIDB4OEEsIDB4QkQsIDB4RUYsIDB4RkUsIDB4RkUsIDB4Q0EsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg3OCwgMHhBQywgMHhERiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhCOSwgMHg4NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDlCLCAweENFLCAweEZGLCAweEZGLCAweEZGLCAweERCLCAweEE5LCAweDg3LCAweDY2LCAweDc3LCAweDhBLAorICAgIDB4QkQsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REIsIDB4QTksIDB4OTgsIDB4ODgsIDB4OUEsIDB4QkMsIDB4RUYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhEQywgMHhCQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZFLCAweERELCAweENDLCAweEJDLCAweENELCAweERFLCAweEVGLCAweEZGLCAweEZFLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RUQsIDB4REQsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweERFLCAweERELCAweERELCAweENDLCAweERELCAweERELCAweEVFLCAweERFLCAweEVGLCAweEFFLCAweEZFLAorICAgIDB4RUUsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4REUsIDB4REMsCisgICAgMHhDQywgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhGRSwgMHhFRiwgMHhFRSwgMHhGRCwgMHhEQywgMHhCQSwgMHhBQSwKKyAgICAweDlBLCAweEFBLCAweEJDLCAweERELCAweEVGLCAweEZGLCAweERELCAweERDLCAweEJBLCAweEE5LCAweDg4LCAweDg4LAorICAgIDB4OTksIDB4QUIsIDB4Q0QsIDB4RkYsIDB4RkMsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQywgMHhERCwgMHhGRSwgMHhERCwgMHhDQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhCQywKKyAgICAweERFLCAweEZDLCAweERCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweENELCAweEVGLAorICAgIDB4REQsIDB4QkEsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4QUIsIDB4REUsIDB4RUMsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhCRCwgMHhFRiwgMHhDQywgMHhCQSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ0LCAweDU2LCAweDc4LCAweDlCLCAweENELCAweERELCAweERCLCAweEE4LCAweDc2LCAweDU1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QkMsIDB4RUUsIDB4REQsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRSwgMHhFRCwgMHhEQywgMHhCOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweEZFLCAweEVELCAweENCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4RUQsIDB4RUUsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkMsIDB4REQsIDB4RUUsCisgICAgMHhFRiwgMHhFRCwgMHhDQywgMHhCQSwgMHhBOSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhFRiwgMHhFRCwgMHhGRSwKKyAgICAweEVELCAweERDLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweENELCAweEVGLCAweEZFLCAweEZGLCAweEZGLCAweEVELAorICAgIDB4REQsIDB4REMsIDB4Q0QsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RkYsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUUsCisgICAgMHhERSwgMHhERCwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHg5RiwgMHhFRSwgMHhFRCwgMHhGRSwgMHhFRiwgMHhFRSwKKyAgICAweERGLCAweEVFLCAweEVFLCAweEZGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRSwgMHhERCwgMHhEQywgMHhDQywgMHhDQiwgMHhDQywgMHhDQywgMHhERCwgMHhFRSwgMHhFRSwgMHhCRSwgMHhGRSwKKyAgICAweERELCAweENDLCAweENCLCAweEJCLCAweEJDLCAweENELCAweERFLCAweEZGLCAweEZGLCAweERFLCAweERDLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RkYsIDB4RkQsIDB4REMsIDB4Q0IsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhERSwgMHhFRSwgMHhDRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweEFBLCAweEJDLCAweERFLCAweEVDLCAweENCLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUUsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhFQywgMHhDQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NywgMHg4OSwgMHhCQywgMHhERCwKKyAgICAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweENELCAweERDLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhDQywgMHhEQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweENDLCAweEJBLCAweDg3LCAweDY2LCAweDU1LCAweDU1LAorICAgIDB4NjcsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhERCwgMHhDQSwgMHhBOSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg5OSwgMHhBQiwKKyAgICAweENELCAweERELCAweEVDLCAweEJBLCAweEE5LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweENELCAweERELAorICAgIDB4REUsIDB4REMsIDB4QkIsIDB4QTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4RUUsIDB4RUUsCisgICAgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERSwgMHhFRSwgMHhFRiwgMHhGRSwgMHhERCwKKyAgICAweENDLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERFLCAweEVGLCAweEVFLCAweEZGLCAweEZGLCAweEVELCAweERELAorICAgIDB4REMsIDB4Q0QsIDB4REQsIDB4REUsIDB4RUYsIDB4RkUsIDB4QkUsIDB4RkUsIDB4RUUsIDB4RUQsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhFRSwgMHhFRSwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4RUQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4REQsIDB4REQsIDB4OUQsIDB4RkYsCisgICAgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhFRSwgMHhFRiwgMHhGRCwgMHhFRSwgMHhERCwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweEVGLCAweERFLCAweEVELCAweENCLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4REUsIDB4RkUsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsCisgICAgMHg5OSwgMHhBQiwgMHhDRCwgMHhFRiwgMHhEQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweENELCAweEZELCAweERDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDg5LCAweEFCLAorICAgIDB4Q0UsIDB4RUMsIDB4REIsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NzcsIDB4OEEsIDB4QkQsIDB4RUQsCisgICAgMHhDQywgMHhCOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QiwgMHhDRCwgMHhEQywgMHhDQiwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEJCLCAweERELCAweENDLCAweEI5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4REMsIDB4REIsIDB4OTgsIDB4NzYsIDB4NTUsCisgICAgMHg0NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhERCwgMHhDQywgMHhCQSwgMHg5NywgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY3LCAweDg4LCAweEFBLCAweENELCAweERDLCAweERCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QUIsCisgICAgMHhDRCwgMHhERSwgMHhFRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhERCwKKyAgICAweEVFLCAweERDLCAweENCLCAweEFBLCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweEVFLCAweERFLCAweEZELAorICAgIDB4REQsIDB4Q0IsIDB4QkEsIDB4QkEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RkQsIDB4RkYsIDB4RkUsIDB4REQsCisgICAgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhEQywgMHhERCwgMHhGRSwgMHhFRiwgMHhGRiwgMHhFRiwgMHhFRSwgMHhERCwKKyAgICAweERELCAweERELCAweERELCAweERGLCAweEZGLCAweEVGLCAweEFELCAweERELCAweERELCAweERFLCAweERDLCAweERELAorICAgIDB4REQsIDB4REMsIDB4REQsIDB4REUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRCwgMHhERCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERCwgMHhDQywKKyAgICAweEJDLCAweENDLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERDLCAweEJBLCAweEFBLCAweEFBLAorICAgIDB4QkMsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4ODksIDB4QUMsCisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhCQSwgMHg4OCwgMHg3NiwgMHg3NywgMHg4OSwgMHhBQywgMHhERiwKKyAgICAweEZGLCAweEZGLCAweEZELCAweENBLCAweDk4LCAweDY2LCAweDU1LCAweDY3LCAweDg5LCAweEJDLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkMsIDB4QTgsIDB4NzYsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OEEsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhCQSwgMHg4NywgMHg1NCwgMHgzMywgMHg0NSwgMHg2OCwgMHhBQiwgMHhERiwgMHhGRiwgMHhGRiwgMHhEQywgMHhBOCwKKyAgICAweDc1LCAweDQzLCAweDM0LCAweDU2LCAweDhBLCAweEJELCAweEZGLCAweEZGLCAweEZGLCAweENBLCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NDUsIDB4NzgsIDB4QUIsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QjksIDB4ODYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg5QSwgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhBOSwgMHg4NywgMHg2NiwgMHg3NywgMHg4QSwKKyAgICAweEJDLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweERDLCAweEE5LCAweDg4LCAweDg4LCAweDk5LCAweEJDLCAweERGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0MsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0YsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhFQywgMHhDQywgMHhCQywgMHhDQywgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZELCAweERELCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRSwgMHhFRCwgMHhERCwgMHhDRCwgMHhDQywgMHhDQywgMHhERCwgMHhERSwgMHhERSwgMHhFRSwgMHg5RSwgMHhGRiwKKyAgICAweEVELCAweERELCAweERDLCAweENDLCAweENELCAweERFLCAweEZFLCAweEZGLCAweEZGLCAweERGLCAweEVELCAweENDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RUUsIDB4REMsIDB4QkEsIDB4QUEsCisgICAgMHg5QSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhERiwgMHhGRSwgMHhERCwgMHhEQywgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OSwKKyAgICAweDlBLCAweEFCLCAweENELCAweEVGLCAweEVELCAweERDLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUUsIDB4Q0MsIDB4Q0IsIDB4QTgsIDB4ODcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkMsCisgICAgMHhERSwgMHhFQywgMHhEQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhFRCwKKyAgICAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDU0LCAweDU1LCAweDY2LCAweDc5LCAweEFCLCAweENFLCAweERDLCAweENCLAorICAgIDB4QTgsIDB4NzYsIDB4NTQsIDB4MzQsIDB4NDUsIDB4NjcsIDB4OEEsIDB4QkMsIDB4RUQsIDB4REMsIDB4QkEsIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHgzNCwgMHg1NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhEQywgMHhEQiwgMHhBOSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU2LCAweDY3LCAweDlBLCAweEJDLCAweERELCAweENELCAweENBLCAweDk4LCAweDc2LCAweDY1LCAweDU2LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REQsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4ODgsCisgICAgMHg5QSwgMHhCQywgMHhFRCwgMHhERSwgMHhEQywgMHhBOSwgMHg5OCwgMHg3NywgMHg3NywgMHg4OSwgMHg5QSwgMHhCQywKKyAgICAweERELCAweERELCAweEZELCAweENCLCAweEFBLCAweDk5LCAweDg4LCAweDk5LCAweDlBLCAweEJDLCAweENELCAweEZFLAorICAgIDB4RUYsIDB4RUQsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0QsIDB4RUYsIDB4RUQsIDB4RkYsCisgICAgMHhFRCwgMHhDQywgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhFRSwgMHhGRSwgMHhFRiwgMHhGRiwgMHhFRCwKKyAgICAweERELCAweENDLCAweENDLCAweENDLCAweERELCAweERGLCAweEZGLCAweEVELCAweEZGLCAweEZGLCAweEVFLCAweEVELAorICAgIDB4REQsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkUsIDB4OUUsIDB4REQsIDB4RUQsIDB4REQsIDB4REQsIDB4REQsCisgICAgMHhFRCwgMHhERCwgMHhERSwgMHhFRSwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4OUIsIDB4REMsCisgICAgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERCwgMHhFRCwgMHhCQywgMHhCQiwgMHhBQSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJDLCAweENELCAweENCLCAweEJCLCAweEFBLCAweDk5LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4REMsIDB4QUIsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsCisgICAgMHg4OCwgMHg4OSwgMHhBQSwgMHhDQywgMHhDQSwgMHhCQSwgMHg5OSwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweEFCLCAweENCLCAweEFBLCAweDk5LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDlBLAorICAgIDB4QUIsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkIsCisgICAgMHhBQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCQSwgMHhBOSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEJBLCAweEFBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QUEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY3LCAweDc4LCAweDg5LCAweEFCLCAweEJBLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4OUEsIDB4QkIsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksIDB4OUEsCisgICAgMHhCQywgMHhCQiwgMHhCQiwgMHhBOSwgMHg4OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OCwgMHg5QSwgMHhBQiwgMHhDQiwKKyAgICAweEJDLCAweEJCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJDLCAweENDLCAweERDLAorICAgIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4REMsIDB4Q0QsIDB4REMsIDB4QkIsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERCwgMHhDQywgMHhERCwgMHhDQywgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERELCAweEVDLCAweDhELCAweENDLCAweENCLCAweEJCLCAweEJBLCAweEFBLAorICAgIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweEJDLCAweDlCLCAweENDLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4OTksIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REMsIDB4QUIsIDB4QkEsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDQywgMHhDQSwgMHhCQSwgMHhBOSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEJCLCAweENCLCAweEFCLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHhBQSwgMHhCQiwgMHg5QSwgMHg5OSwgMHg4NywgMHg3NywgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweEE5LCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDlBLCAweEJBLAorICAgIDB4OUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjUsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QTksIDB4OTksCisgICAgMHg4NywgMHg3NiwgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEE5LCAweEE5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NTUsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NywgMHg3OCwgMHg4OSwgMHhBQSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NywgMHg3NywKKyAgICAweDg5LCAweDlBLCAweEFBLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QUIsIDB4QUEsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsCisgICAgMHhCQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhDQiwKKyAgICAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENCLCAweEJDLCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4QTksIDB4OUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4QkMsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDQywgMHhEQywgMHg5QywgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHg4QiwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweERDLCAweEJDLCAweEJCLCAweEFBLAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0QsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQywgMHhDQywgMHhBQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweDlBLCAweEJDLCAweEJBLCAweEFBLCAweDk5LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4QUIsIDB4QkIsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsCisgICAgMHhBQiwgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQSwKKyAgICAweDlBLCAweDk4LCAweDc3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweEFBLCAweEE5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4OUEsIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhBOSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEJBLCAweEFBLCAweDk4LCAweDg3LCAweDY2LCAweDY2LCAweDY2LAorICAgIDB4NjcsIDB4NzgsIDB4ODksIDB4QUIsIDB4QUEsIDB4QTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsCisgICAgMHg4OSwgMHhBQSwgMHhCQSwgMHhBQiwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHg5QSwKKyAgICAweEFCLCAweEJCLCAweEJBLCAweEE5LCAweDg4LCAweDg3LCAweDc3LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJCLAorICAgIDB4QkMsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkIsIDB4Q0MsCisgICAgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhDQiwgMHhDRCwgMHhDQywgMHhCQiwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENELCAweENELCAweERELCAweENDLCAweENCLCAweEJCLAorICAgIDB4QkEsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REMsIDB4OUMsIDB4Q0IsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhBQiwgMHhCQiwgMHhCQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REQsIDB4OEQsIDB4RUUsCisgICAgMHhERCwgMHhDQywgMHhDQywgMHhDQiwgMHhDQywgMHhERCwgMHhFRiwgMHhFRSwgMHhGRSwgMHhERSwgMHhEQywgMHhDQywKKyAgICAweEJCLCAweEFCLCAweEJCLCAweEJCLCAweENDLCAweERELCAweEZGLCAweEVELCAweERELCAweENCLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4REQsIDB4RkQsIDB4Q0QsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsCisgICAgMHg5OSwgMHhBQSwgMHhCQywgMHhERSwgMHhEQywgMHhDQiwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFBLCAweENELCAweERELCAweENDLCAweEJBLCAweDk4LCAweDg3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0UsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OEEsIDB4QkMsIDB4REQsCisgICAgMHhDQywgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QiwgMHhCQywgMHhEQiwgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDQ1LCAweDY3LCAweDg5LCAweEFDLCAweENDLCAweENCLCAweEI5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4Q0MsIDB4Q0MsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NCwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQiwgMHhEQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY3LCAweDg5LCAweDlBLCAweENDLCAweENDLCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkIsCisgICAgMHhDRCwgMHhERCwgMHhFQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhERCwKKyAgICAweERELCAweEVDLCAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweERELCAweERELCAweEZFLAorICAgIDB4REMsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4REQsIDB4RUQsIDB4RUYsIDB4RUUsIDB4REQsCisgICAgMHhDQywgMHhDQiwgMHhCQiwgMHhDQywgMHhDQywgMHhERCwgMHhERSwgMHhFRSwgMHhGRiwgMHhFRSwgMHhERSwgMHhERCwKKyAgICAweENELCAweERDLCAweERELCAweEVELCAweEVGLCAweEVFLCAweDlFLCAweEVFLCAweERELCAweERELCAweERDLCAweENDLAorICAgIDB4Q0MsIDB4Q0QsIDB4REQsIDB4REUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEFGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhFRCwgMHhERCwgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhEQywgMHhDQiwKKyAgICAweEJCLCAweENDLCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVELCAweERDLCAweEJBLCAweEFBLCAweEFBLAorICAgIDB4QkIsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NywgMHg4OSwgMHhBQiwgMHhERCwKKyAgICAweEZGLCAweEZGLCAweEVELCAweENBLCAweDk4LCAweDY2LCAweDU1LCAweDY2LCAweDg5LCAweEJDLCAweERGLCAweEZGLAorICAgIDB4RkYsIDB4REIsIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NjcsIDB4OEEsIDB4QkMsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhCQSwgMHg4NywgMHg1NCwgMHgzMywgMHg0NSwgMHg2OCwgMHhBQiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhEQiwgMHhBOCwKKyAgICAweDY1LCAweDQzLCAweDM0LCAweDU2LCAweDhBLCAweEJELCAweEVGLCAweEZFLCAweEZELCAweENBLCAweDg3LCAweDY0LAorICAgIDB4NDQsIDB4NTYsIDB4NzgsIDB4QUIsIDB4REUsIDB4RkYsIDB4RUYsIDB4REMsIDB4QjksIDB4ODYsIDB4NjUsIDB4NTYsCisgICAgMHg2NywgMHg5QSwgMHhDRCwgMHhGRiwgMHhGRSwgMHhGRiwgMHhEQywgMHhBOSwgMHg4NywgMHg2NiwgMHg3NywgMHg4QSwKKyAgICAweEJDLCAweERGLCAweEZGLCAweEVGLCAweEZELCAweENCLCAweEE5LCAweDg4LCAweDg4LCAweDlBLCAweEJCLCAweERFLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4Q0IsIDB4QUEsIDB4QTksIDB4QUEsIDB4QkIsIDB4Q0QsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhERCwgMHhEQywgMHhDQiwgMHhCQiwgMHhCQywgMHhDRSwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweERELCAweERELCAweERELCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RCwgMHhERCwgMHhERCwgMHhERiwgMHhFRSwgMHhFRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhFRiwgMHhFRCwgMHhFRCwgMHhERCwgMHhDQywgMHhDRCwgMHhERCwgMHhERCwgMHhFRCwgMHhERSwgMHg5RSwgMHhGRiwKKyAgICAweEZFLCAweERELCAweERDLCAweENDLCAweERELCAweERFLCAweEVFLCAweEZFLCAweEZFLCAweEZFLCAweEVELCAweERELAorICAgIDB4Q0MsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RUUsIDB4RUYsIDB4RUQsIDB4RkUsIDB4REMsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQywgMHhDRCwgMHhFRiwgMHhGRiwgMHhERSwgMHhEQywgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwKKyAgICAweDlBLCAweEJDLCAweENELCAweEVGLCAweEVDLCAweERDLCAweEJCLCAweEE5LCAweDg4LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkMsIDB4Q0UsIDB4RUUsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsCisgICAgMHhFRiwgMHhERCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhFRSwKKyAgICAweERDLCAweEJBLCAweDk4LCAweDY2LCAweDU0LCAweDQ1LCAweDU2LCAweDg5LCAweEFDLCAweENELCAweERDLCAweENCLAorICAgIDB4QTksIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4RUQsIDB4Q0MsIDB4QkEsIDB4OTcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OSwgMHhBQiwgMHhERCwgMHhERCwgMHhEQiwgMHhBOSwgMHg4NiwgMHg1NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDlBLCAweEJELCAweERELCAweERFLCAweENCLCAweDk4LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4REUsIDB4RUQsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjYsIDB4NjcsIDB4ODksCisgICAgMHhBQiwgMHhDRCwgMHhFRSwgMHhERSwgMHhEQywgMHhBQSwgMHg5OCwgMHg4NywgMHg3OCwgMHg4OSwgMHg5QSwgMHhCQywKKyAgICAweERFLCAweEVELCAweEVELCAweERCLCAweEJBLCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEJDLCAweERELCAweEVGLAorICAgIDB4RUUsIDB4RUQsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4RUYsIDB4RkQsIDB4RUYsCisgICAgMHhERCwgMHhEQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERSwgMHhFRSwgMHhGRiwgMHhERiwgMHhGRiwgMHhFRCwKKyAgICAweERELCAweENDLCAweERELCAweENELCAweERFLCAweEVGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEVFLCAweEVFLAorICAgIDB4REYsIDB4REUsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4OUQsIDB4RUQsIDB4REUsIDB4REUsIDB4REUsIDB4RUQsCisgICAgMHhFRSwgMHhFRSwgMHhGRiwgMHhFRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REUsIDB4RUQsIDB4REMsIDB4Q0MsIDB4QkMsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REQsIDB4REQsIDB4QUUsIDB4RkUsCisgICAgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwgMHhDQywgMHhDQywgMHhERSwgMHhFRiwgMHhGRSwgMHhERSwgMHhEQywgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweEVGLCAweEVELCAweERDLCAweENCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4QUIsIDB4QkMsIDB4REUsIDB4RUUsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHhBQSwgMHhCQywgMHhERSwgMHhFQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweEFBLCAweENDLCAweEVELCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NzcsIDB4ODksIDB4QkMsIDB4REQsCisgICAgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQiwgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweENCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhERCwgMHhDQywgMHhCQSwgMHg4NywgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY3LCAweDc4LCAweDlBLCAweEJELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUIsCisgICAgMHhDRCwgMHhERCwgMHhEQywgMHhCQSwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhDRCwgMHhERSwKKyAgICAweERFLCAweERDLCAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweERFLCAweEVFLCAweEVFLAorICAgIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RkUsIDB4REYsIDB4RUQsIDB4REQsCisgICAgMHhDQywgMHhDQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERSwgMHhFRiwgMHhFRCwgMHhGRiwgMHhFRSwgMHhFRCwgMHhERCwKKyAgICAweENELCAweENELCAweERELCAweEVFLCAweEZGLCAweEZGLCAweEFFLCAweEVFLCAweERELCAweERELCAweERELCAweERELAorICAgIDB4REQsIDB4REUsIDB4RUUsIDB4RUYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENGLCAweEVELCAweERELCAweERDLCAweERDLCAweERDLCAweENDLCAweENELCAweERELCAweERELCAweDhFLCAweEZFLAorICAgIDB4RUUsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RUUsIDB4RkUsIDB4RUYsIDB4RUUsIDB4REMsCisgICAgMHhDQywgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhERSwgMHhFRiwgMHhERSwgMHhGRSwgMHhEQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFCLCAweEJDLCAweENELCAweERELCAweEVELCAweERFLCAweERDLCAweEJCLCAweEE5LCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4QkIsIDB4Q0QsIDB4REYsIDB4REQsIDB4RUMsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQiwgMHhERCwgMHhGRCwgMHhERCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweERELCAweEVDLCAweERDLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweEJELCAweEVDLAorICAgIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4ODksIDB4QUIsIDB4Q0UsIDB4REMsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc5LCAweEFCLCAweENELCAweERDLCAweERDLCAweEE5LCAweDg2LCAweDU1LAorICAgIDB4NDQsIDB4NTUsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REQsIDB4REQsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTYsCisgICAgMHg2NywgMHg4OSwgMHhBQywgMHhERCwgMHhERCwgMHhEQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweEJELCAweEVELCAweENELCAweERDLCAweEI5LCAweDk4LCAweDg3LCAweDc4LCAweDg5LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4RUQsIDB4REUsIDB4Q0IsIDB4QkEsIDB4OTksIDB4OTgsIDB4OTksIDB4QUIsIDB4QkIsIDB4Q0QsIDB4RUUsCisgICAgMHhERSwgMHhFRCwgMHhEQywgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhFRSwgMHhERCwgMHhFRSwKKyAgICAweERDLCAweERDLCAweEJDLCAweEJDLCAweEJCLCAweENDLCAweENELCAweERELCAweEZELCAweERGLCAweEVFLCAweERFLAorICAgIDB4REMsIDB4Q0QsIDB4Q0QsIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RUQsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RUUsCisgICAgMHhFRCwgMHhERSwgMHhFRCwgMHhERCwgMHhGRiwgMHhGRCwgMHg5RCwgMHhERCwgMHhERSwgMHhDRCwgMHhEQywgMHhERCwKKyAgICAweERELCAweEVELCAweERFLCAweEVGLCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRCwgMHhERiwgMHhERCwgMHg4RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4REMsCisgICAgMHhDRCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQywgMHhCQiwgMHhCQiwKKyAgICAweENDLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEJCLCAweEE5LCAweDk5LCAweDlBLCAweEJDLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4OTgsIDB4ODcsIDB4NzgsIDB4OEEsIDB4QkMsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwgMHhBOCwgMHg3NiwgMHg1NSwgMHg2NywgMHg5QSwgMHhDRCwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZELCAweEI5LCAweDc2LCAweDU0LCAweDQ1LCAweDY4LCAweDlCLCAweENGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4Q0IsIDB4OTcsIDB4NTQsIDB4MjMsIDB4NDUsIDB4NzksIDB4QkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTksCisgICAgMHg3NSwgMHg0MywgMHgyNCwgMHg1NywgMHg5QiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQiwgMHg5OCwgMHg2NSwKKyAgICAweDQ0LCAweDU2LCAweDc5LCAweEJDLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweENBLCAweDg3LCAweDY1LCAweDU2LAorICAgIDB4NzgsIDB4QUIsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QkEsIDB4ODgsIDB4NzcsIDB4NzgsIDB4OUEsCisgICAgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhCQSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhDRCwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERDLCAweEJCLCAweEJBLCAweEJCLCAweENELCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsIDB4RkMsIDB4Q0MsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4REQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4REQsIDB4OUUsIDB4RUYsCisgICAgMHhERCwgMHhDQywgMHhDQiwgMHhDQywgMHhDQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRSwgMHhERSwgMHhFRCwgMHhDQywKKyAgICAweENCLCAweEJBLCAweEJBLCAweEJCLCAweENELCAweENELCAweEVFLCAweEVFLCAweEVELCAweENDLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4OUEsIDB4QkIsIDB4QkQsIDB4REQsIDB4RkUsIDB4REUsIDB4Q0IsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsCisgICAgMHg5OSwgMHhBQiwgMHhCQywgMHhERSwgMHhEQywgMHhDQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweENELCAweEVFLCAweENELCAweEJBLCAweDk4LCAweDg3LCAweDY2LCAweDY2LCAweDc4LCAweDg5LCAweEJCLAorICAgIDB4Q0UsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REQsCisgICAgMHhDQywgMHhCQSwgMHg4NywgMHg2NiwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QiwgMHhDRCwgMHhDQiwgMHhDQiwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDQ1LCAweDY3LCAweDg5LCAweEJDLCAweENELCAweENDLCAweEI5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REMsIDB4Q0IsIDB4QTgsIDB4NzYsIDB4NjUsCisgICAgMHg0NCwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQywgMHhERCwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweENDLCAweEE5LCAweDg4LCAweDc2LCAweDY2LCAweDY3LCAweDg4LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkMsCisgICAgMHhERCwgMHhEQywgMHhFQywgMHhCQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg5OSwgMHg5OSwgMHhCQiwgMHhDRCwgMHhERCwKKyAgICAweENFLCAweERDLCAweENCLCAweEFBLCAweEE5LCAweDk5LCAweEFBLCAweEJCLCAweEJELCAweERGLCAweERELCAweEVFLAorICAgIDB4REQsIDB4Q0IsIDB4QkIsIDB4QkEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RkUsIDB4REUsIDB4RUUsIDB4REQsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhERSwgMHhFRiwgMHhFRCwgMHhGRiwgMHhFRSwgMHhERCwgMHhERCwKKyAgICAweERDLCAweERFLCAweERELCAweEVFLCAweEVGLCAweEZELCAweDhELCAweERELCAweERDLCAweENDLCAweENDLCAweENDLAorICAgIDB4REMsIDB4REQsIDB4REUsIDB4REUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweDhDLCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REMsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhEQywgMHhDQiwgMHhDQiwgMHhCQSwgMHhBOSwgMHg5OCwKKyAgICAweDg4LCAweDk5LCAweDk5LCAweEFCLCAweEJDLCAweERDLCAweEJDLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0MsIDB4QkEsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5OSwgMHhBQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEJDLCAweEJBLCAweEE5LCAweDk4LCAweDc3LCAweDY2LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEJCLAorICAgIDB4QUEsIDB4OTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkEsIDB4QTksCisgICAgMHg4NywgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NSwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwgMHhBQSwgMHg5OCwgMHg3NywKKyAgICAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc3LCAweDg5LCAweEFCLCAweEJBLCAweEE5LCAweDg4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkIsIDB4QUEsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjUsIDB4NTYsCisgICAgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQiwgMHhCQSwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDg5LCAweEFCLCAweEJCLCAweEFCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg5LCAweDlBLAorICAgIDB4QkMsIDB4QkIsIDB4QkIsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0IsCisgICAgMHhCQywgMHhCQiwgMHhBOSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhDQywgMHhDQywKKyAgICAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENELCAweEVDLCAweENELCAweERDLCAweEJCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0MsIDB4REUsIDB4Q0MsIDB4RUQsIDB4Q0MsIDB4Q0MsIDB4Q0IsCisgICAgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERSwgMHhERCwgMHg4QywgMHhDQiwgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweENCLCAweENDLCAweENDLCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQiwgMHg5QiwgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEE5LCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERDLCAweEFCLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4Q0MsIDB4QkEsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweEFBLCAweEJCLCAweEE5LCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4QUEsIDB4QkEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4OTksCisgICAgMHhBQSwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBQSwKKyAgICAweDk5LCAweDk4LCAweDc3LCAweDY2LCAweDY1LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEE5LCAweDk5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsIDB4OUEsIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLCAweDlBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjcsIDB4NzgsIDB4ODksIDB4QUEsIDB4QTksIDB4QTksIDB4OTgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEFBLCAweEJBLCAweDk5LCAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDk5LCAweEFBLCAweEJBLAorICAgIDB4QUIsIDB4QkEsIDB4OTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4QkIsIDB4QkIsCisgICAgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhCQywgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweEE5LCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweEJCLCAweENDLCAweENCLCAweEJCLCAweEJBLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REMsIDB4OUIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUMsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkIsIDB4OEIsIDB4REMsCisgICAgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDQywgMHhEQiwgMHhCQywgMHhDQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJDLCAweENELCAweEJCLCAweEJCLCAweEFBLCAweDk5LCAweDk4LAorICAgIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4QkIsIDB4REIsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQywgMHhCQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEFCLCAweENCLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsIDB4QkEsCisgICAgMHhBQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhBQSwgMHhBOSwKKyAgICAweDg4LCAweDc2LCAweDU1LCAweDU1LCAweDU1LCAweDY3LCAweDg4LCAweDlBLCAweEJBLCAweEFBLCAweDk4LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QUEsIDB4QUEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY3LCAweDc4LCAweDk5LCAweEFCLCAweEFBLCAweEJBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4ODksIDB4QUEsIDB4QkEsIDB4QUIsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4OUEsCisgICAgMHhCQiwgMHhCQSwgMHhCQiwgMHhBQSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQiwKKyAgICAweEJDLCAweEJCLCAweEFBLCAweDk5LCAweDk4LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweEJCLCAweENDLAorICAgIDB4QkIsIDB4QUEsIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4Q0MsIDB4Q0IsIDB4QkMsIDB4Q0MsIDB4QkIsCisgICAgMHhBQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhCQywgMHhEQywgMHhDQywgMHhDQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweENDLCAweENELCAweERDLCAweDhCLCAweEJCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJFLCAweERELCAweENDLCAweENDLCAweENDLCAweEJDLCAweENDLCAweENDLCAweENDLCAweERDLCAweDhFLCAweEVFLAorICAgIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUYsIDB4RkQsIDB4RUUsIDB4RUQsIDB4Q0MsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHhFRSwgMHhERCwgMHhFRCwgMHhDQywgMHhCQSwgMHhBQSwKKyAgICAweEE5LCAweEFBLCAweEFCLCAweENDLCAweERFLCAweEZELCAweENELCAweERDLCAweEJBLCAweDk5LCAweDk4LCAweDg5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4REMsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4OTksCisgICAgMHhBQiwgMHhDRCwgMHhFRCwgMHhDRCwgMHhCQiwgMHg5OSwgMHg4NywgMHg2NiwgMHg2NiwgMHg3OCwgMHg4QSwgMHhCQiwKKyAgICAweENELCAweERELCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERELAorICAgIDB4QkMsIDB4QkEsIDB4OTcsIDB4NjYsIDB4NTQsIDB4NDUsIDB4NjYsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4Q0IsCisgICAgMHg5OCwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhCQywgMHhERCwgMHhCQywgMHhCQSwgMHg4NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweDlBLCAweENELCAweENDLCAweENCLCAweEE5LCAweDg2LCAweDY1LAorICAgIDB4NDQsIDB4NTYsIDB4NjcsIDB4OUEsIDB4QUMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTYsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQywgMHhBOSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NywgMHg4OCwKKyAgICAweDlBLCAweEJDLCAweERELCAweENELCAweENCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4REQsIDB4REMsIDB4REQsIDB4Q0IsIDB4QTksIDB4OTksIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4REQsCisgICAgMHhDRCwgMHhERCwgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQywgMHhDRCwgMHhFRiwgMHhERCwgMHhFRSwKKyAgICAweERDLCAweENCLCAweEJCLCAweEJBLCAweEJCLCAweEJDLCAweENDLCAweERFLCAweEVFLCAweEVFLCAweEZFLCAweERELAorICAgIDB4Q0MsIDB4QkMsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REUsIDB4RkYsIDB4RUQsIDB4RkUsIDB4RUUsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERCwgMHhFRSwgMHhFRiwgMHhGRCwgMHg5RCwgMHhFRCwgMHhDQywgMHhEQywgMHhDQywgMHhEQywKKyAgICAweERELCAweERELCAweEVFLCAweEVELCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRSwgMHhGRiwgMHhFRSwgMHhGRSwgMHg5RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkQsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REMsCisgICAgMHhEQywgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhEQywgMHhCQiwgMHhCQiwKKyAgICAweENELCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweERCLCAweEFBLCAweDlBLCAweEFCLCAweENDLAorICAgIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODgsIDB4OUEsIDB4QkQsIDB4RUYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhBOSwgMHg4NywgMHg2NiwgMHg3OCwgMHg5QiwgMHhDRCwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZELCAweEJBLCAweDg2LCAweDU0LCAweDQ1LCAweDc4LCAweEFDLCAweERFLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4REIsIDB4OTgsIDB4NjQsIDB4MjIsIDB4NDYsIDB4ODksIDB4QkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QkEsCisgICAgMHg4NiwgMHg0MiwgMHgyNCwgMHg2OCwgMHg5QiwgMHhERSwgMHhGRiwgMHhGRCwgMHhGRiwgMHhDQywgMHhBOCwgMHg3NSwKKyAgICAweDQ0LCAweDU2LCAweDhBLCAweEJELCAweEZGLCAweEZGLCAweEZGLCAweEVELCAweENCLCAweDk4LCAweDc2LCAweDY2LAorICAgIDB4NzksIDB4QUMsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4Q0EsIDB4OTgsIDB4ODgsIDB4ODksIDB4QUIsCisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhCQiwgMHhBQSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweERELCAweENCLCAweEJCLCAweEJDLCAweENELCAweEVGLCAweEZGLCAweEZGLAorICAgIDB4RUYsIDB4RkUsIDB4RkUsIDB4REQsIDB4REMsIDB4Q0QsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhFRiwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwKKyAgICAweEVGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEQsIDB4REQsIDB4REQsIDB4REUsIDB4REUsIDB4REUsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4RUQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4Q0MsIDB4REQsIDB4OUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRCwgMHhEQywgMHhDRCwgMHhDRCwgMHhERCwgMHhERCwgMHhFRiwgMHhFRCwgMHhFRSwgMHhERCwgMHhDQywKKyAgICAweENDLCAweEJCLCAweENCLCAweENDLCAweERELCAweERFLCAweEVGLCAweERELCAweEVFLCAweENDLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0MsIDB4REUsIDB4RUUsIDB4REUsIDB4REMsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksCisgICAgMHhBQSwgMHhCQywgMHhDQywgMHhERSwgMHhEQywgMHhEQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg3OCwgMHg4OCwgMHg5QSwKKyAgICAweEJDLCAweENELCAweERELCAweENELCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDY3LCAweDc4LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4REMsIDB4REIsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4QUIsIDB4Q0QsIDB4RUQsCisgICAgMHhDRCwgMHhCQSwgMHg5OCwgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NywgMHg4OSwgMHhCQiwgMHhDRCwgMHhEQywgMHhEQiwKKyAgICAweEE5LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY4LCAweDlBLCAweEJDLCAweERELCAweERELCAweEJBLCAweDk4LAorICAgIDB4NjUsIDB4NDQsIDB4NDQsIDB4NTYsIDB4NzksIDB4QUIsIDB4Q0QsIDB4REMsIDB4REIsIDB4QTksIDB4ODcsIDB4NTUsCisgICAgMHg0NCwgMHg1NSwgMHg2OCwgMHg5QSwgMHhDQywgMHhFRCwgMHhDQywgMHhDQiwgMHhBOCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweERELCAweERDLCAweERDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY3LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUQsIDB4Q0QsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4ODgsIDB4NzgsIDB4ODksIDB4OUEsIDB4Q0MsCisgICAgMHhERSwgMHhFQywgMHhEQywgMHhDQiwgMHhCQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhERCwgMHhFRSwKKyAgICAweERELCAweERELCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERFLCAweEVFLCAweEVELCAweEVELAorICAgIDB4REQsIDB4REMsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkQsIDB4Q0QsIDB4RkUsIDB4RUUsIDB4Q0UsIDB4RUUsIDB4REQsCisgICAgMHhERCwgMHhEQywgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFQywgMHhGRSwgMHhFRSwgMHhGRSwgMHhGRCwKKyAgICAweERELCAweERELCAweEVFLCAweEVGLCAweEVGLCAweEZFLCAweDhELCAweERDLCAweERELCAweERELCAweENELCAweERELAorICAgIDB4REQsIDB4REQsIDB4REUsIDB4RkUsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweERELCAweENDLCAweENCLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweENELCAweERELCAweEFELCAweEVFLAorICAgIDB4REQsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4REUsIDB4RkQsIDB4REUsIDB4REMsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhFRSwgMHhERCwgMHhEQywgMHhDQiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweENELCAweERELCAweENELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4QUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhBQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweENELCAweENCLCAweEJBLCAweDk4LCAweDc3LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDg5LCAweEFDLCAweENDLAorICAgIDB4QkIsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhCQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweEJBLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4REMsIDB4QkIsIDB4QjksIDB4ODgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweERDLCAweENDLCAweEJBLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REMsIDB4REMsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0MsIDB4RUQsCisgICAgMHhDRCwgMHhDQywgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhERSwgMHhERCwgMHhERCwKKyAgICAweERDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweEZFLCAweERFLCAweERELCAweENDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RUQsIDB4RUUsIDB4RUQsIDB4REQsIDB4Q0MsCisgICAgMHhDQywgMHhDQywgMHhERCwgMHhERSwgMHhFRiwgMHhGRiwgMHhBRCwgMHhERCwgMHhDRCwgMHhDQywgMHhDQywgMHhDQywKKyAgICAweENELCAweERELCAweERFLCAweEVFLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRCwgMHhERCwgMHhEQywgMHhDQywgMHhDQywgMHhDQiwgMHhDQywgMHhDQywgMHhDQywgMHhEQywgMHg5RCwgMHhGRSwKKyAgICAweEVELCAweERDLCAweENDLCAweENDLCAweENDLCAweENELCAweERELCAweERFLCAweEVELCAweERFLCAweEVELCAweENDLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4REQsIDB4RUMsIDB4Q0IsIDB4QkEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhEQywgMHhDRCwgMHhEQywgMHhCQSwgMHg5OSwgMHg5OCwgMHg5OSwKKyAgICAweDlBLCAweEFCLCAweEJDLCAweERFLCAweENDLCAweERDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QUIsIDB4Q0MsIDB4REMsIDB4Q0MsIDB4QkEsIDB4QTgsIDB4ODcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkIsCisgICAgMHhDRCwgMHhDQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhEQywKKyAgICAweENDLCAweEJBLCAweDk4LCAweDY1LCAweDU0LCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweENDLCAweENCLAorICAgIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4REMsIDB4Q0MsIDB4QkEsIDB4OTcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OSwgMHhBQiwgMHhDRCwgMHhDQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU1LCAweDY4LCAweDlBLCAweEJDLCAweERDLCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4Q0IsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4ODgsCisgICAgMHhBQSwgMHhCQywgMHhEQywgMHhDRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OSwgMHg5QSwgMHhCQywKKyAgICAweERFLCAweERDLCAweERDLCAweEJCLCAweEFBLCAweDk5LCAweDk4LCAweDk5LCAweDlBLCAweEJCLCAweENELCAweEVELAorICAgIDB4Q0QsIDB4REMsIDB4Q0IsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4RUUsIDB4REMsIDB4RUQsCisgICAgMHhDQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhFRCwgMHhERSwgMHhERCwgMHhEQywKKyAgICAweENDLCAweENDLCAweENDLCAweENDLCAweERELCAweERFLCAweEVGLCAweERELCAweEVFLCAweEVELCAweERELCAweERELAorICAgIDB4REMsIDB4REQsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkUsIDB4OUQsIDB4REMsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsCisgICAgMHhDQywgMHhERCwgMHhERCwgMHhERSwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REYsIDB4RkYsIDB4RkUsIDB4RUUsIDB4REQsIDB4REQsIDB4REQsIDB4REMsIDB4REQsIDB4REQsIDB4OEYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhFRSwgMHhFRCwgMHhERiwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhFRCwKKyAgICAweERDLCAweERELCAweERDLCAweERELCAweERFLCAweEZGLCAweEZGLCAweEVFLCAweEZGLCAweERELCAweERDLCAweENCLAorICAgIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RUQsIDB4REMsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhBQiwgMHhDRCwgMHhERSwgMHhGRiwgMHhFRCwgMHhGRSwgMHhEQywgMHhCQSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhBQiwKKyAgICAweENELCAweEVGLCAweEZGLCAweERGLCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDc3LCAweDg5LCAweEFCLCAweENELAorICAgIDB4RkYsIDB4RkUsIDB4RUQsIDB4Q0EsIDB4OTgsIDB4NjYsIDB4NTUsIDB4NjcsIDB4ODksIDB4QkMsIDB4REUsIDB4RkUsCisgICAgMHhFRCwgMHhEQiwgMHhBOCwgMHg3NiwgMHg0NCwgMHg0NCwgMHg2NywgMHg4QSwgMHhCRCwgMHhERiwgMHhGRCwgMHhGQywKKyAgICAweEJBLCAweDg2LCAweDU0LCAweDMzLCAweDQ1LCAweDc4LCAweEFCLCAweENFLCAweEZFLCAweEVFLCAweENCLCAweEE4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTcsIDB4ODksIDB4QkMsIDB4RkYsIDB4RkUsIDB4RUQsIDB4QkEsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg3OCwgMHhBQiwgMHhERSwgMHhGRiwgMHhERiwgMHhEQywgMHhBOSwgMHg4NywgMHg2NSwgMHg1NiwKKyAgICAweDY4LCAweDlBLCAweENELCAweEVGLCAweEZFLCAweEVFLCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDc4LCAweDhBLAorICAgIDB4QkMsIDB4REYsIDB4RkYsIDB4REUsIDB4RUQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4OUEsIDB4QkMsIDB4REUsCisgICAgMHhGRiwgMHhGRSwgMHhFRSwgMHhERCwgMHhDQiwgMHhBQSwgMHg5OSwgMHhBQSwgMHhCQywgMHhDRSwgMHhGRiwgMHhGRiwKKyAgICAweEVGLCAweEZGLCAweERELCAweENDLCAweEJCLCAweEJCLCAweENDLCAweERFLCAweEVGLCAweEZGLCAweEZFLCAweEZFLAorICAgIDB4RUYsIDB4REQsIDB4REMsIDB4Q0QsIDB4Q0QsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsCisgICAgMHhFRSwgMHhFRCwgMHhERSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlFLCAweERGLCAweEZGLCAweEZGLCAweEZELCAweEZFLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweEVELCAweERELCAweERDLCAweENDLCAweENDLCAweENDLCAweENDLCAweERELCAweERELCAweDlFLCAweEZGLAorICAgIDB4RUUsIDB4REUsIDB4REMsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkUsIDB4RkYsIDB4RUQsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhFRSwgMHhGRiwgMHhERCwgMHhGRSwgMHhDQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweENELCAweERELCAweEVFLCAweERFLCAweERDLCAweEJBLCAweEE5LCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4QUIsIDB4REUsIDB4REUsIDB4REQsIDB4RUMsIDB4Q0EsIDB4OTksIDB4ODgsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQiwgMHhDRCwgMHhFRCwgMHhDRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweERELCAweERDLCAweERCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweEVELAorICAgIDB4Q0MsIDB4Q0EsIDB4OTgsIDB4NjUsIDB4NTQsIDB4NDUsIDB4NjYsIDB4ODksIDB4QUIsIDB4REQsIDB4REMsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCRCwgMHhEQywgMHhDQywgMHhCQSwgMHg4NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweEFCLCAweENELCAweEVDLCAweENCLCAweEE5LCAweDg2LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjgsIDB4OUEsIDB4QkQsIDB4REQsIDB4Q0QsIDB4Q0IsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQywgMHhERSwgMHhEQywgMHhEQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg4OSwKKyAgICAweEFCLCAweENELCAweEZELCAweENFLCAweENCLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDg5LCAweDlBLCAweEJDLAorICAgIDB4RUUsIDB4REMsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4REUsIDB4RkUsCisgICAgMHhERSwgMHhERCwgMHhDQywgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhGRiwgMHhFRCwgMHhFRSwKKyAgICAweERELCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweENELCAweERFLCAweEVGLCAweEZGLCAweERFLCAweEVFLCAweERFLAorICAgIDB4REQsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RUQsIDB4RkYsIDB4RkUsIDB4RUUsIDB4REQsCisgICAgMHhERCwgMHhFRSwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RCwgMHhDRCwgMHhDRCwgMHhERCwgMHhEQywgMHhDRCwKKyAgICAweEVELCAweEVFLCAweEVFLCAweEZGLCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQiwgMHg4QiwgMHhDQywKKyAgICAweENCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweENELCAweERDLCAweEJDLCAweENCLCAweEFBLAorICAgIDB4QUEsIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4QkIsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTgsCisgICAgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhDQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4NywgMHg4OCwKKyAgICAweDg5LCAweDk5LCAweEFCLCAweEJDLCAweEJBLCAweEJBLCAweDk5LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OTksIDB4QUIsIDB4Q0IsIDB4QUIsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwgMHhCQiwKKyAgICAweEFBLCAweDk4LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDk5LCAweEFCLCAweEJBLCAweEE5LAorICAgIDB4ODgsIDB4NzYsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4OTgsIDB4ODcsCisgICAgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEJCLCAweEFBLCAweEE5LCAweDg3LCAweDc2LCAweDY1LCAweDU2LAorICAgIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QkEsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQSwgMHhCQiwgMHhBQiwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweEJBLCAweENCLCAweEFBLCAweDk4LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENCLAorICAgIDB4QkMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4Q0IsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhDQywgMHhEQywgMHhCQywgMHhDQywgMHhCQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweENDLCAweERELCAweENDLCAweENCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REQsIDB4RUQsIDB4OEMsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QUIsIDB4QUIsCisgICAgMHhCQiwgMHhCQywgMHhDQywgMHhDRCwgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QkEsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUEsIDB4QkIsIDB4OEIsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQSwgMHhBQSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENDLCAweEJBLCAweEJBLCAweEE5LCAweDk5LCAweDg4LAorICAgIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0IsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4ODgsCisgICAgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhBQSwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDk5LCAweEFBLCAweEJBLCAweDlBLCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4QTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QkEsCisgICAgMHg5QSwgMHg5OCwgMHg3NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhBOSwgMHhBOSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEFBLCAweDlBLCAweDk4LCAweDg3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsIDB4QTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQSwgMHg5QSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEE5LCAweEE5LCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4OUEsIDB4QkEsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhBQiwgMHhBQSwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQiwKKyAgICAweEFCLCAweEJBLCAweEE5LCAweDk5LCAweDg4LCAweDg4LCAweDg5LCAweDk5LCAweEFBLCAweEJDLCAweEJBLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QkIsIDB4Q0IsIDB4QkMsIDB4Q0IsIDB4QkIsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhCQiwgMHhEQywgMHhDQiwgMHhCQiwgMHhCQSwKKyAgICAweEFBLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERDLCAweDlCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJCLCAweDhCLCAweENDLAorICAgIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REIsIDB4QkMsIDB4QkIsIDB4QUEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhCQiwgMHhDQiwgMHhBQSwgMHg5OSwgMHg5OCwKKyAgICAweDg4LCAweDk5LCAweDk5LCAweEFCLCAweEJDLCAweENCLCAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkEsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5QSwgMHhBQiwgMHhCQiwgMHhBQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEJCLCAweEJBLCAweEFBLCAweDk4LCAweDc2LCAweDY2LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEJCLAorICAgIDB4QUEsIDB4QTgsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QUEsIDB4QTksCisgICAgMHg4OCwgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NSwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHg5OCwgMHg4NywKKyAgICAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDg5LCAweEFCLCAweEFBLCAweEE5LCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTYsCisgICAgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQiwgMHhBQSwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFBLCAweEJCLCAweEFCLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg5LCAweDlBLAorICAgIDB4QkIsIDB4QkEsIDB4QkIsIDB4QTksIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4Q0IsCisgICAgMHhCQywgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhCQiwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweEE5LCAweDk5LCAweDlBLCAweEFBLCAweEFCLCAweEJDLCAweERDLCAweEJDLCAweENDLCAweEJCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REQsIDB4Q0IsIDB4REQsIDB4Q0MsIDB4Q0IsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhDQywgMHhDQywgMHhERCwgMHhEQywgMHg4QiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhBQSwgMHhBQSwKKyAgICAweEFCLCAweEJCLCAweEJCLCAweENDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRCwgMHhFQywgMHhDQywgMHhDQiwgMHhDQiwgMHhCQiwgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHg4RCwgMHhFRCwKKyAgICAweEVELCAweERDLCAweENCLCAweEJCLCAweEJDLCAweENELCAweENELCAweEVGLCAweEZELCAweERFLCAweEVELCAweENCLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4Q0UsIDB4RUUsIDB4REQsIDB4REQsIDB4Q0IsIDB4QkEsIDB4OTksCisgICAgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQywgMHhERSwgMHhFRCwgMHhERCwgMHhDQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwKKyAgICAweDk5LCAweEFBLCAweEJDLCAweERELCAweERDLCAweERCLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QkMsIDB4REMsIDB4Q0QsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhDQiwgMHhDQSwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5OSwgMHhCQywgMHhEQywKKyAgICAweEJCLCAweEE5LCAweDg3LCAweDY2LCAweDU0LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4Q0MsIDB4Q0MsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhEQiwgMHhDQiwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU0LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweERDLCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhCQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg4OCwgMHg5QSwgMHhCQywKKyAgICAweERELCAweERDLCAweERDLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENELCAweERELAorICAgIDB4Q0QsIDB4REMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REUsIDB4RUMsIDB4RUQsCisgICAgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhERSwgMHhFRCwgMHhERSwgMHhFRCwgMHhEQywKKyAgICAweENDLCAweEJDLCAweEJDLCAweENDLCAweERELCAweERFLCAweEZGLCAweEVELCAweEZGLCAweERELCAweERELCAweERELAorICAgIDB4Q0QsIDB4REQsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkUsIDB4OUQsIDB4REQsIDB4REQsIDB4REQsIDB4Q0MsIDB4Q0MsCisgICAgMHhDQywgMHhERCwgMHhFRSwgMHhFRSwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REYsIDB4RkUsIDB4RUQsIDB4REUsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4Q0MsIDB4REQsIDB4OUYsIDB4RkYsCisgICAgMHhGRiwgMHhFRSwgMHhERSwgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRiwgMHhGRCwgMHhFRiwgMHhFRiwgMHhFRSwKKyAgICAweERELCAweENDLCAweENDLCAweENELCAweENELCAweEVFLCAweEZGLCAweERGLCAweEZGLCAweEVELCAweENDLCAweENCLAorICAgIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4REUsIDB4RkUsIDB4REUsIDB4REQsIDB4Q0MsIDB4QUEsIDB4QUEsIDB4QUEsCisgICAgMHhBQiwgMHhCQywgMHhERCwgMHhGRiwgMHhFRSwgMHhGRCwgMHhDQiwgMHhCQSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhBQSwKKyAgICAweEJDLCAweERGLCAweEZGLCAweEVFLCAweERDLCAweEI5LCAweDg3LCAweDc3LCAweDc3LCAweDg5LCAweEFCLCAweENELAorICAgIDB4RUYsIDB4RUUsIDB4RUMsIDB4QkEsIDB4OTcsIDB4NjYsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0UsIDB4RkUsCisgICAgMHhERSwgMHhDQiwgMHhBOCwgMHg3NiwgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCQywgMHhERSwgMHhFRCwgMHhFQywKKyAgICAweEI5LCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDc4LCAweDlCLCAweENFLCAweEVFLCAweERELCAweENCLCAweDk4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTYsIDB4OEEsIDB4QkMsIDB4REYsIDB4RUQsIDB4RUMsIDB4Q0EsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg3OCwgMHhBQiwgMHhERSwgMHhFRSwgMHhERCwgMHhEQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDlBLCAweENELCAweEZGLCAweEVELCAweERFLCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDhBLAorICAgIDB4QkMsIDB4RUYsIDB4RkYsIDB4REYsIDB4REMsIDB4QkEsIDB4QTksIDB4ODgsIDB4ODgsIDB4OUEsIDB4QkIsIDB4Q0UsCisgICAgMHhFRiwgMHhGRCwgMHhFRCwgMHhEQywgMHhDQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhFRiwgMHhGRiwKKyAgICAweERGLCAweEVELCAweERDLCAweENCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweEVGLCAweEZGLCAweEZELCAweEVFLAorICAgIDB4REQsIDB4REQsIDB4Q0MsIDB4Q0QsIDB4Q0QsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RUYsIDB4RUYsCisgICAgMHhERCwgMHhFRSwgMHhERSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRSwKKyAgICAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDhDLCAweERELCAweERFLCAweERFLCAweEVELCAweERELAorICAgIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENELCAweERELCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENELCAweDlELCAweEZFLAorICAgIDB4RUQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RUQsIDB4REUsIDB4REQsIDB4Q0MsCisgICAgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhERCwgMHhFRiwgMHhERCwgMHhERCwgMHhDQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERELCAweEVELCAweENELCAweERCLCAweEJBLCAweDk5LCAweDk4LCAweDg5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4RUUsIDB4REMsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhDRCwgMHhERCwgMHhDQywgMHhCQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQiwKKyAgICAweERELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJELCAweERELAorICAgIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NjUsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0UsIDB4REIsIDB4Q0IsCisgICAgMHhBOSwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCQywgMHhEQywgMHhDQywgMHhCQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc5LCAweEFCLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRSwgMHhEQywgMHhDQywgMHhBQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg4OCwKKyAgICAweDlCLCAweEJELCAweEVELCAweENELCAweENCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4RUUsIDB4REMsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTgsIDB4OTksIDB4QUEsIDB4QkMsIDB4REUsIDB4RUUsCisgICAgMHhDRCwgMHhEQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERCwgMHhGRiwgMHhFQywgMHhERCwKKyAgICAweERDLCAweENCLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweERELCAweEVGLCAweEZFLCAweENGLCAweEVFLCAweERELAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RkYsIDB4RUQsIDB4RUUsIDB4RUQsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhFRSwgMHhGRSwgMHhGRiwgMHhGRSwgMHg4QywgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwKKyAgICAweERELCAweEVFLCAweEVFLCAweEVGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERSwgMHhERCwgMHhDQywgMHhDQywgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDQywgMHhDQywgMHg5RSwgMHhFRSwKKyAgICAweERELCAweENDLCAweENCLCAweEJCLCAweEJDLCAweENDLCAweERELCAweERFLCAweEVELCAweERFLCAweERDLCAweENCLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4REQsIDB4REQsIDB4Q0IsIDB4QUEsIDB4QTksCisgICAgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQywgMHhDRCwgMHhFRCwgMHhDRCwgMHhDQiwgMHhBQSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDk5LCAweEFBLCAweEJDLCAweERELCAweERDLCAweENCLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QkMsIDB4REMsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDQywgMHhDQywgMHhDQiwgMHg5OSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhEQywKKyAgICAweENCLCAweEE5LCAweDg3LCAweDY1LCAweDU0LCAweDU1LCAweDY3LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4QkIsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg4NywgMHg2NSwKKyAgICAweDU0LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweERDLCAweEJDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4OUIsIDB4Q0QsIDB4Q0IsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3OCwgMHg5OSwgMHhBQiwKKyAgICAweENELCAweERDLCAweENDLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweENELCAweERELAorICAgIDB4Q0QsIDB4Q0MsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4REUsIDB4RUMsIDB4REQsCisgICAgMHhDQywgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhERSwgMHhFRSwgMHhERSwgMHhERCwgMHhDQywKKyAgICAweENCLCAweEJCLCAweEJCLCAweENDLCAweENELCAweERFLCAweEVGLCAweEVELCAweEVFLCAweERELCAweERELCAweENDLAorICAgIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkUsIDB4QUQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsCisgICAgMHhDRCwgMHhERCwgMHhERSwgMHhFRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4REQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4OUQsIDB4RkYsCisgICAgMHhFRCwgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhERSwgMHhFRSwgMHhGRCwgMHhERSwgMHhFRCwgMHhDQywKKyAgICAweENCLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERELCAweEVGLCAweERELCAweERELCAweENDLCAweEJBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RUMsIDB4REQsIDB4REMsIDB4QkEsIDB4OTksIDB4OTksIDB4OTksCisgICAgMHg5QSwgMHhBQiwgMHhDRCwgMHhERSwgMHhEQywgMHhEQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEFCLCAweENELCAweEVELCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY3LCAweDc4LCAweDlBLCAweEFDLAorICAgIDB4Q0QsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REQsCisgICAgMHhDQywgMHhCQSwgMHg5NywgMHg2NSwgMHg1NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwKKyAgICAweEE5LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDlBLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk3LAorICAgIDB4NjUsIDB4NDQsIDB4NDQsIDB4NTYsIDB4NzksIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg2NywgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweERDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY3LCAweDg4LAorICAgIDB4OUEsIDB4Q0MsIDB4REQsIDB4Q0QsIDB4Q0IsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkMsCisgICAgMHhERCwgMHhEQywgMHhERCwgMHhDQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDRCwgMHhFRCwKKyAgICAweENELCAweERDLCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweEVFLCAweERDLCAweEVELAorICAgIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RkQsIDB4Q0UsIDB4RUQsIDB4REQsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhERCwgMHhFRSwgMHhGRiwgMHhFRCwgMHhFRSwgMHhFRSwgMHhERSwgMHhERCwKKyAgICAweERELCAweERFLCAweERFLCAweEVFLCAweEZGLCAweEZFLCAweDlELCAweERDLCAweENELCAweERELCAweENDLCAweENELAorICAgIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENGLCAweEZGLCAweEVFLCAweERELCAweENELCAweENDLCAweERDLCAweENDLCAweERELCAweENELCAweDhGLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4RUQsIDB4RUUsIDB4REQsIDB4REUsIDB4RUUsIDB4RkYsIDB4RkQsIDB4RUYsIDB4RkYsIDB4RUUsCisgICAgMHhERCwgMHhDQywgMHhDRCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRiwgMHhERSwgMHhGRSwgMHhFRCwgMHhEQywgMHhDQiwKKyAgICAweEJCLCAweEJDLCAweENDLCAweERFLCAweEVGLCAweEZFLCAweEVFLCAweEVFLCAweENDLCAweEJBLCAweEFBLCAweEFBLAorICAgIDB4QUIsIDB4Q0MsIDB4Q0UsIDB4RUYsIDB4RUQsIDB4RUQsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4ODksIDB4QUEsCisgICAgMHhDRCwgMHhERSwgMHhGRSwgMHhERSwgMHhEQywgMHhCQSwgMHg4OCwgMHg3NywgMHg3NywgMHg4OSwgMHhBQiwgMHhDRCwKKyAgICAweEVGLCAweEVFLCAweEVELCAweENCLCAweDk4LCAweDY1LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweERFLCAweEZFLAorICAgIDB4RUUsIDB4REIsIDB4QTksIDB4NzUsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OEEsIDB4QkQsIDB4RUYsIDB4RUQsIDB4RUMsCisgICAgMHhDQSwgMHg4NywgMHg1NCwgMHgzMywgMHg0NSwgMHg3OCwgMHhBQiwgMHhDRSwgMHhGRSwgMHhERCwgMHhDQiwgMHhBOCwKKyAgICAweDc1LCAweDQzLCAweDM0LCAweDU3LCAweDhBLCAweEJELCAweEVGLCAweEVELCAweERDLCAweEJBLCAweDk3LCAweDY1LAorICAgIDB4NDQsIDB4NDUsIDB4NzgsIDB4QUIsIDB4REUsIDB4RUUsIDB4REUsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsCisgICAgMHg2OCwgMHg5QSwgMHhDRCwgMHhFRiwgMHhGRCwgMHhFRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg3OCwgMHg5QSwKKyAgICAweEJDLCAweEVFLCAweEZGLCAweERGLCAweERDLCAweEJBLCAweEE5LCAweDg4LCAweDg4LCAweDlBLCAweEJDLCAweERFLAorICAgIDB4RUYsIDB4RUQsIDB4RkUsIDB4REQsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkMsIDB4REUsIDB4REUsIDB4RkUsCisgICAgMHhERiwgMHhFRCwgMHhEQywgMHhDQywgMHhCQiwgMHhCQiwgMHhDQywgMHhERSwgMHhFRSwgMHhGRiwgMHhFRCwgMHhFRiwKKyAgICAweEVELCAweERELCAweENELCAweERELCAweERELCAweEVFLCAweEZGLCAweEZFLCAweEZFLCAweERGLCAweEZFLCAweERFLAorICAgIDB4RUUsIDB4RUUsIDB4REUsIDB4RUUsIDB4RkYsIDB4RUYsIDB4RkUsIDB4RkUsIDB4RkYsIDB4RUUsIDB4RUUsIDB4RUYsCisgICAgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5RCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhFRSwKKyAgICAweEVFLCAweEZFLCAweEZGLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRCwgMHhEQywgMHhDQywgMHhCQiwgMHhCQiwgMHhDQywgMHhDQywgMHhCQywgMHhCQywgMHhDRCwgMHg4RCwgMHhFRSwKKyAgICAweERELCAweERDLCAweENDLCAweENDLCAweENDLCAweENELCAweERELCAweEVFLCAweEVELCAweERFLCAweEVELCAweERDLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4REYsIDB4REMsIDB4REMsIDB4Q0MsIDB4QkEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERCwgMHhFRCwgMHhDRCwgMHhDQywgMHhCQSwgMHg5OSwgMHg5OSwgMHg5OSwKKyAgICAweDlBLCAweEFCLCAweENDLCAweERFLCAweERDLCAweERDLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUQsIDB4Q0QsIDB4Q0IsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkMsCisgICAgMHhDRCwgMHhDQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQywKKyAgICAweENELCAweEJBLCAweDk3LCAweDY1LCAweDU0LCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweENDLCAweENCLAorICAgIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4RUQsIDB4Q0MsIDB4QkEsIDB4OTcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDlBLCAweEJDLCAweERELCAweENELCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUMsIDB4Q0UsIDB4Q0MsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4ODksCisgICAgMHg5QSwgMHhCQywgMHhFRCwgMHhDQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OSwgMHg5QSwgMHhCQywKKyAgICAweERGLCAweERDLCAweERDLCAweENCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweERELCAweEVELAorICAgIDB4Q0UsIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REYsIDB4REMsIDB4RUQsCisgICAgMHhERCwgMHhDQywgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhFRSwgMHhFRSwgMHhERSwgMHhFRCwgMHhERCwKKyAgICAweENDLCAweENDLCAweENDLCAweENELCAweERELCAweERGLCAweEVGLCAweEVELCAweEZGLCAweEVFLCAweEVELCAweERDLAorICAgIDB4REQsIDB4REQsIDB4RUUsIDB4RUUsIDB4RkYsIDB4RkUsIDB4N0MsIDB4Q0QsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsCisgICAgMHhERCwgMHhERCwgMHhFRCwgMHhFRSwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4OEIsIDB4REMsCisgICAgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDQywgMHhEQywgMHhCQywgMHhCQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJDLCAweENELCAweEJCLCAweENCLCAweEFBLCAweDk5LCAweDk4LAorICAgIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4Q0IsIDB4QUIsIDB4QUEsIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQywgMHhCQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDk5LCAweEFCLCAweENCLCAweEFBLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QkIsCisgICAgMHhBQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQiwgMHhBOSwgMHhBOSwKKyAgICAweDg4LCAweDc2LCAweDU1LCAweDU1LCAweDU1LCAweDY3LCAweDg4LCAweDlBLCAweEJCLCAweEFBLCAweDk4LCAweDg3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QUEsIDB4QTksIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQiwgMHhBQSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY2LCAweDc4LCAweDk5LCAweEFCLCAweEJBLCAweEJBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4OUEsIDB4QkIsIDB4QUIsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksIDB4OUEsCisgICAgMHhCQiwgMHhCQSwgMHhCQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4NywgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQiwKKyAgICAweEFCLCAweEJCLCAweEFBLCAweDk5LCAweDk4LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweENCLCAweENCLAorICAgIDB4QkIsIDB4QUEsIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4REMsIDB4QkMsIDB4Q0MsIDB4QkIsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERCwgMHhDQiwgMHhERCwgMHhDQywgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERFLCAweEVELCAweDhCLCAweEJCLCAweEJCLCAweEJCLCAweEJBLCAweEFBLAorICAgIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFCLCAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweDhCLCAweENDLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QkEsIDB4QTksCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhCQSwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEFCLCAweENCLCAweEFCLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc4LAorICAgIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4QUEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5OSwgMHhBQSwgMHhCQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEE5LCAweEE5LCAweDg4LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEJBLAorICAgIDB4OUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUEsIDB4QTksIDB4OTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEE5LCAweEE5LCAweDg4LCAweDc2LCAweDY2LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQSwgMHhBOSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweDlBLCAweEJBLCAweEFBLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QUIsIDB4QUEsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OTksIDB4QUIsIDB4QkIsCisgICAgMHhBQiwgMHhCQSwgMHhBOSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQywgMHhCQSwgMHhCQiwKKyAgICAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJDLCAweENCLCAweEJDLCAweEJCLCAweEJBLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4Q0IsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QkEsCisgICAgMHhBQSwgMHhBQiwgMHhCQiwgMHhCQywgMHhDQywgMHhEQywgMHg4QiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEFCLCAweEJCLCAweENDLCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQywgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQiwgMHg4QywgMHhEQywKKyAgICAweEJCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweENELCAweERDLCAweEJDLCAweEJCLCAweEFBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTgsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhCQiwgMHhDQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4NywgMHg4OCwKKyAgICAweDg5LCAweDk5LCAweEFCLCAweEJDLCAweEJBLCAweEJBLCAweDk5LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QUIsIDB4QkIsIDB4QUEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsCisgICAgMHhCQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwgMHhCQiwKKyAgICAweEFBLCAweDk4LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDk5LCAweEFCLCAweEFBLCAweEE5LAorICAgIDB4ODgsIDB4NzYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4OTgsIDB4ODcsCisgICAgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEJBLCAweEFBLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDU2LAorICAgIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QUEsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQSwgMHhCQiwgMHhBQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OSwgMHg5QSwKKyAgICAweEJCLCAweEJBLCAweEJCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENCLAorICAgIDB4QkMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4QkIsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhEQiwgMHhCRCwgMHhDQywgMHhCQiwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweEJDLCAweENELCAweENCLCAweERDLCAweENDLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4REMsIDB4OEMsIDB4QkIsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4REQsIDB4Q0QsIDB4Q0IsIDB4Q0IsIDB4QkIsIDB4Q0IsIDB4Q0IsIDB4Q0MsIDB4Q0MsIDB4N0QsIDB4RkYsCisgICAgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhERCwgMHhERSwgMHhFRCwgMHhERCwgMHhEQywgMHhDQywKKyAgICAweEJCLCAweEFCLCAweEFCLCAweEJCLCAweENDLCAweERELCAweEVFLCAweERELCAweERELCAweENCLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4RUMsIDB4Q0QsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODksCisgICAgMHg5OSwgMHhBQSwgMHhCQywgMHhERCwgMHhEQywgMHhEQiwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3OCwgMHg5OSwKKyAgICAweEFCLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REMsCisgICAgMHhCQywgMHhCOSwgMHg4NywgMHg2NSwgMHg1NCwgMHg1NSwgMHg2NywgMHg3OSwgMHg5QiwgMHhCQywgMHhDQywgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDg5LCAweEFDLCAweENELCAweENDLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUIsIDB4QkQsIDB4REIsIDB4Q0EsIDB4QTgsIDB4ODcsIDB4NjUsCisgICAgMHg1NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhCQiwgMHhDRCwgMHhCQiwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFBLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkIsIDB4QTksIDB4OTgsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkIsCisgICAgMHhERSwgMHhEQywgMHhEQywgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhERCwgMHhFRCwKKyAgICAweERELCAweERDLCAweEJCLCAweEFBLCAweEE5LCAweDk5LCAweEFBLCAweEJDLCAweENELCAweEVGLCAweERDLCAweEVELAorICAgIDB4REMsIDB4QkIsIDB4QkIsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4RUUsIDB4RUUsIDB4REUsIDB4RUQsIDB4REQsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhFRSwgMHhFRiwgMHhGRCwgMHhGRSwgMHhERCwgMHhERCwgMHhEQywKKyAgICAweERELCAweERELCAweERFLCAweEVELCAweEZGLCAweEZFLCAweDhELCAweENELCAweENELCAweENDLCAweENDLCAweENDLAorICAgIDB4Q0QsIDB4REQsIDB4RUUsIDB4RUYsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEVELCAweERELCAweERELCAweERDLCAweDhGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhFRSwgMHhFRCwgMHhERCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERCwgMHhEQywKKyAgICAweENDLCAweENDLCAweENELCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVDLCAweENCLCAweEJCLCAweEFCLAorICAgIDB4QkMsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4QkIsIDB4QTksIDB4OTksIDB4OUEsIDB4QUIsCisgICAgMHhDRCwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRCwgMHhDQSwgMHg5OCwgMHg3NywgMHg3NywgMHg4OSwgMHhBQywgMHhERiwKKyAgICAweEZGLCAweEZGLCAweEZFLCAweERCLCAweEE4LCAweDc2LCAweDU2LCAweDY3LCAweDhBLCAweEJELCAweERGLCAweEZGLAorICAgIDB4RkYsIDB4RkMsIDB4QjksIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjgsIDB4OUIsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhDQiwgMHg5NywgMHg1NCwgMHgyMywgMHg0NiwgMHg3OSwgMHhBQywgMHhFRiwgMHhGRiwgMHhGRiwgMHhFQywgMHhBOSwKKyAgICAweDc2LCAweDQzLCAweDI0LCAweDU3LCAweDlCLCAweENELCAweEZGLCAweEZGLCAweEZELCAweENCLCAweDk4LCAweDY1LAorICAgIDB4NDQsIDB4NDYsIDB4NzksIDB4QkMsIDB4RUYsIDB4RkYsIDB4RUYsIDB4REQsIDB4QkEsIDB4ODcsIDB4NjYsIDB4NTYsCisgICAgMHg3OCwgMHhBQiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhEQywgMHhBOSwgMHg4OCwgMHg3NywgMHg3OCwgMHg5QSwKKyAgICAweENELCAweEZGLCAweEZGLCAweERGLCAweEZELCAweENCLCAweEFBLCAweDk5LCAweDk5LCAweEFCLCAweEJELCAweERGLAorICAgIDB4RkYsIDB4RkQsIDB4RkYsIDB4REQsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4RkUsIDB4RkYsIDB4RkYsCisgICAgMHhFRiwgMHhGRCwgMHhFRCwgMHhEQywgMHhDQywgMHhDQywgMHhDRCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwKKyAgICAweEVGLCAweERELCAweERELCAweERFLCAweEVFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEZGLCAweEZGLAorICAgIDB4RUYsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3QywgMHhDRCwgMHhERCwgMHhERCwgMHhGRCwgMHhFRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERSwgMHhFRSwgMHhERCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHg5RSwgMHhGRiwKKyAgICAweEVFLCAweEVELCAweENDLCAweENDLCAweENDLCAweENELCAweERELCAweEVFLCAweEZELCAweEVGLCAweEVELCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REQsIDB4RUYsIDB4REQsIDB4RUQsIDB4REMsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERCwgMHhGRSwgMHhERSwgMHhEQywgMHhCQSwgMHg5OSwgMHg5OSwgMHg5OSwKKyAgICAweDlBLCAweEFCLCAweENDLCAweERFLCAweERELCAweERDLCAweEJBLCAweDk4LCAweDg4LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUQsIDB4REQsIDB4Q0EsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkMsCisgICAgMHhERCwgMHhEQywgMHhEQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhFRCwKKyAgICAweENDLCAweEJBLCAweDk3LCAweDY1LCAweDU0LCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweENCLAorICAgIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4RUQsIDB4Q0MsIDB4QkEsIDB4OTcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDlBLCAweEJDLCAweEVELCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUMsIDB4REUsIDB4RUMsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QiwgMHhDRCwgMHhFRCwgMHhDRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OCwgMHg5QSwgMHhCQywKKyAgICAweEVGLCAweEVDLCAweERDLCAweENCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweERFLCAweEZFLAorICAgIDB4Q0UsIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4REUsIDB4RkYsIDB4RUMsIDB4RUQsCisgICAgMHhEQywgMHhDQywgMHhCQiwgMHhCQiwgMHhCQiwgMHhDRCwgMHhERSwgMHhFRiwgMHhGRiwgMHhDRiwgMHhFRCwgMHhERCwKKyAgICAweERDLCAweENDLCAweENDLCAweENELCAweERFLCAweEVGLCAweEZGLCAweEZDLCAweEZFLCAweEZFLCAweERELCAweERELAorICAgIDB4REUsIDB4RUUsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEQsIDB4REQsIDB4Q0QsIDB4REQsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REUsIDB4RUQsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4Q0MsIDB4OUUsIDB4RkUsCisgICAgMHhFRCwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhERSwgMHhFRCwgMHhFRSwgMHhERCwgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweERFLCAweERELCAweERDLCAweENCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REQsIDB4REQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhCQiwgMHhDRCwgMHhDQywgMHhDQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweDlBLCAweEJDLCAweERDLCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4Q0MsCisgICAgMHhCQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENDLCAweEJCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhCQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweEJELCAweENCLCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhEQywgMHhDQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhDRCwgMHhFRSwKKyAgICAweENELCAweENCLCAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweERFLCAweEVDLCAweERELAorICAgIDB4Q0MsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RkYsIDB4Q0UsIDB4REQsIDB4Q0MsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRCwgMHhFRSwgMHhERCwgMHhDRCwgMHhDQywKKyAgICAweENDLCAweENDLCAweERELCAweEVGLCAweEZGLCAweEZGLCAweEFELCAweERDLCAweENDLCAweENDLCAweENDLCAweENDLAorICAgIDB4REQsIDB4REUsIDB4RUYsIDB4RkYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweERGLCAweEVELCAweEVFLCAweERELCAweERDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweDlGLCAweEZGLAorICAgIDB4RkUsIDB4RUQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RUQsIDB4RUYsIDB4RUUsIDB4REMsCisgICAgMHhDQywgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHhFRSwgMHhERSwgMHhFRSwgMHhEQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERELCAweEVELCAweERFLCAweERDLCAweEJBLCAweDk5LCAweDk4LCAweDk5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4REQsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhDRCwgMHhERCwgMHhERCwgMHhDQiwgMHhBOCwgMHg3NywgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweERELCAweENDLCAweERCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERDLAorICAgIDB4Q0MsIDB4QkEsIDB4OTcsIDB4NjUsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhCQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc5LCAweEFCLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQywgMHhDRCwgMHhEQywgMHhEQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg4OCwKKyAgICAweDlCLCAweENELCAweERELCAweENELCAweENCLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4REYsIDB4REQsIDB4REMsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODksIDB4OTksIDB4QUEsIDB4QkMsIDB4REQsIDB4RUQsCisgICAgMHhDRCwgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERCwgMHhFRiwgMHhFRCwgMHhFRCwKKyAgICAweERDLCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweERELCAweEVFLCAweEZFLCAweENELCAweEVELCAweERELAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkUsIDB4RUUsIDB4RUQsIDB4REQsCisgICAgMHhERCwgMHhFRSwgMHhERSwgMHhGRSwgMHhGRiwgMHhGRSwgMHg5QywgMHhDRCwgMHhDQywgMHhDQywgMHhDQywgMHhERCwKKyAgICAweERELCAweERFLCAweEVGLCAweEZGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRSwgMHhERCwgMHhERCwgMHhERCwgMHhDQywgMHhDRCwgMHg3RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEVFLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RUYsIDB4REMsIDB4REQsIDB4REQsIDB4RkYsIDB4RUYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkUsIDB4REQsIDB4Q0MsCisgICAgMHhCQiwgMHhCQywgMHhDRCwgMHhERCwgMHhERiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhEQywgMHhCQSwgMHhBQSwgMHhBQSwKKyAgICAweEFCLCAweENDLCAweERGLCAweEZGLCAweEVGLCAweEZGLCAweERDLCAweEJBLCAweDk4LCAweDg4LCAweDk5LCAweEFCLAorICAgIDB4Q0QsIDB4REYsIDB4RkUsIDB4RkYsIDB4RkMsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NzcsIDB4ODksIDB4QUIsIDB4Q0QsCisgICAgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQiwgMHg5NywgMHg2NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhCQiwgMHhERiwgMHhGRiwKKyAgICAweEZGLCAweERDLCAweEE4LCAweDc1LCAweDQ0LCAweDQ1LCAweDY3LCAweDlBLCAweENELCAweEZGLCAweEZGLCAweEZELAorICAgIDB4QkEsIDB4ODcsIDB4NTQsIDB4MzMsIDB4NDUsIDB4NzgsIDB4QUIsIDB4REYsIDB4RkYsIDB4RkUsIDB4REIsIDB4QTgsCisgICAgMHg3NSwgMHg0MywgMHgzNCwgMHg1NywgMHg4QSwgMHhCRCwgMHhGRiwgMHhGRiwgMHhFRCwgMHhCQSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDQ1LCAweDc4LCAweEFCLCAweERGLCAweEZGLCAweEZGLCAweERDLCAweEE5LCAweDg3LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4OUIsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NzgsIDB4OUEsCisgICAgMHhCQywgMHhERiwgMHhGRiwgMHhFRiwgMHhFQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg5QSwgMHhCQywgMHhERiwKKyAgICAweEZGLCAweEZFLCAweEZGLCAweENELCAweENCLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweERGLCAweEZGLCAweEZGLAorICAgIDB4RUYsIDB4RkYsIDB4REQsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4REMsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkUsCisgICAgMHhFRiwgMHhERCwgMHhEQywgMHhERCwgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEQsIDB4REMsIDB4REQsIDB4REUsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0YsIDB4REUsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REMsIDB4Q0MsIDB4Q0QsIDB4OEYsIDB4RkYsCisgICAgMHhFRSwgMHhEQywgMHhEQywgMHhCQywgMHhDRCwgMHhERSwgMHhERCwgMHhFRiwgMHhFRCwgMHhFRSwgMHhFRSwgMHhEQywKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweENELCAweEVELCAweEVFLCAweEVELCAweEZFLCAweERDLCAweEJBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4Q0MsIDB4REQsIDB4RUQsIDB4REUsIDB4Q0MsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODksCisgICAgMHg5OSwgMHhBQiwgMHhCQywgMHhERSwgMHhERCwgMHhEQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweENFLCAweERELCAweERELCAweENBLCAweDk4LCAweDc3LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFCLAorICAgIDB4Q0UsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUIsIDB4QkQsIDB4REQsCisgICAgMHhDQywgMHhCQSwgMHg4NywgMHg2NSwgMHg1NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRSwgMHhEQywgMHhDQiwKKyAgICAweEE5LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDhBLCAweEJDLCAweENELCAweENDLCAweEJBLCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4RUMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg2NywgMHg4QSwgMHhCQywgMHhERCwgMHhDRCwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QkQsIDB4RUQsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkMsCisgICAgMHhERSwgMHhEQywgMHhEQywgMHhDQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg5OSwgMHg5QSwgMHhCQywgMHhERCwgMHhFRSwKKyAgICAweENFLCAweERDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJDLCAweENELCAweEVGLCAweEVELCAweEVFLAorICAgIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4REQsIDB4RUUsIDB4RkUsIDB4REUsIDB4RUUsIDB4REQsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhERiwgMHhFRSwgMHhGRiwgMHhFQywgMHhFRiwgMHhFRSwgMHhERCwgMHhERCwKKyAgICAweERELCAweERELCAweEVGLCAweEZGLCAweEZGLCAweEZFLCAweDhELCAweERELCAweERDLCAweERDLCAweERELCAweERELAorICAgIDB4REQsIDB4REUsIDB4RUYsIDB4RUYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweDlBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweDhCLCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REIsIDB4QkMsIDB4QkIsIDB4QUEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQywgMHhDRCwgMHhCQiwgMHhDQiwgMHhBQSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweENCLCAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg3LCAweDg4LAorICAgIDB4ODgsIDB4OTksIDB4QUIsIDB4QkMsIDB4QkEsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5OSwgMHhBQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEJCLCAweEFBLCAweEE5LCAweDk4LCAweDc2LCAweDY2LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEJBLAorICAgIDB4QUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QUEsIDB4QTksCisgICAgMHg4OCwgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NSwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHg5OCwgMHg4NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDc3LCAweDg5LCAweEFCLCAweEFBLCAweEE5LCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NTYsCisgICAgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhCQSwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFBLCAweEJCLCAweEFCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkIsIDB4QkEsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0IsCisgICAgMHhBQywgMHhCQSwgMHhBOSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhDQiwgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJDLCAweERDLCAweEJDLCAweENCLCAweEJCLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4REIsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERCwgMHhFQywgMHg4QiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhBQSwgMHhBQSwKKyAgICAweEJCLCAweEJCLCAweENDLCAweENELCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHg5QiwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweEFBLCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweENCLCAweEJDLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4QkEsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywKKyAgICAweDg4LCAweDk5LCAweDlBLCAweEJCLCAweEFBLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OTksIDB4QUEsIDB4QkEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBQSwKKyAgICAweDk5LCAweDk4LCAweDc3LCAweDY2LCAweDY1LCAweDU2LCAweDY2LCAweDc4LCAweDg5LCAweEFBLCAweEE5LCAweDk5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsIDB4OTksIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLCAweDlBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsIDB4QTksIDB4QTksIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhCQSwgMHg5QSwgMHhBOSwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEFBLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDc3LCAweDc4LCAweDg4LCAweDk5LCAweEFBLCAweEJCLAorICAgIDB4QUIsIDB4QUEsIDB4OTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4QkEsIDB4QkIsCisgICAgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhDQiwgMHhCQywgMHhCQiwgMHhCQSwKKyAgICAweEFBLCAweEE5LCAweDlBLCAweEFBLCAweEFCLCAweEJCLCAweENELCAweENCLCAweERDLCAweENCLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REMsIDB4OUIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkMsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkIsIDB4OEMsIDB4REQsCisgICAgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDQywgMHhEQywgMHhDRCwgMHhDQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJDLCAweENELCAweENCLCAweENCLCAweEFBLCAweDk5LCAweDk4LAorICAgIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0IsIDB4QkMsIDB4QUEsIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzgsCisgICAgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQywgMHhCQiwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDk5LCAweEFCLCAweENCLCAweEFCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QUIsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsIDB4QkIsCisgICAgMHhBQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhCQSwgMHhBOSwKKyAgICAweDg3LCAweDc2LCAweDU1LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEJBLCAweEFBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQiwgMHhBQSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg1NiwKKyAgICAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEJBLCAweEJBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QUEsIDB4QkIsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQywgMHhCQiwgMHhCQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQywKKyAgICAweEJDLCAweEJCLCAweEE5LCAweDk5LCAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweENCLCAweENDLAorICAgIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REMsIDB4QkQsIDB4Q0MsIDB4QkIsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhCQywgMHhERCwgMHhDQywgMHhEQywgMHhDQywgMHhDQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERFLCAweEVELCAweDhCLCAweEJCLCAweEJCLCAweEJBLCAweEFBLCAweEJCLAorICAgIDB4QkIsIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENGLCAweEVELCAweEVELCAweERDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweDdFLCAweEZGLAorICAgIDB4RkUsIDB4REQsIDB4REMsIDB4Q0QsIDB4REQsIDB4Q0UsIDB4RUUsIDB4RkYsIDB4RkQsIDB4REYsIDB4REQsIDB4REMsCisgICAgMHhEQywgMHhDQywgMHhCQywgMHhDQywgMHhDRCwgMHhERCwgMHhGRSwgMHhERCwgMHhFRSwgMHhEQywgMHhCQiwgMHhCQiwKKyAgICAweEFBLCAweEJCLCAweEJCLCAweERELCAweERFLCAweEVELCAweERFLCAweERELCAweEJBLCAweEE5LCAweDk5LCAweDk5LAorICAgIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REQsIDB4REQsIDB4REMsIDB4QkIsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsCisgICAgMHhCQywgMHhERSwgMHhFRCwgMHhDRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhCQywKKyAgICAweERFLCAweERELCAweERDLCAweEJBLCAweDg3LCAweDY1LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLAorICAgIDB4REQsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QkMsIDB4Q0UsIDB4REMsIDB4REIsCisgICAgMHhBOSwgMHg4NiwgMHg1NCwgMHgzMywgMHg0NSwgMHg3OCwgMHg5QSwgMHhDRCwgMHhERCwgMHhDRCwgMHhDQSwgMHg5OCwKKyAgICAweDc1LCAweDQzLCAweDM0LCAweDU3LCAweDg5LCAweEFDLCAweENFLCAweENDLCAweERCLCAweEI5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4RkQsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTYsCisgICAgMHg2NywgMHg4OSwgMHhCQywgMHhERCwgMHhEQywgMHhERCwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweENELCAweEVELCAweENELCAweENCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg5LCAweEFCLCAweENELAorICAgIDB4REYsIDB4RUMsIDB4RUQsIDB4REIsIDB4QkEsIDB4QTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4REUsIDB4REUsCisgICAgMHhDRiwgMHhERCwgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhERiwgMHhFRCwgMHhGRSwKKyAgICAweERELCAweENDLCAweENCLCAweENCLCAweENDLCAweENELCAweERFLCAweEVFLCAweEZELCAweERGLCAweEVGLCAweEZELAorICAgIDB4REQsIDB4REQsIDB4REMsIDB4RUQsIDB4RUQsIDB4RUUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RUUsIDB4RUQsCisgICAgMHhERCwgMHhERiwgMHhFRSwgMHhGRSwgMHhGRiwgMHhGRiwgMHg4RCwgMHhERCwgMHhEQywgMHhDRCwgMHhERCwgMHhDRCwKKyAgICAweENELCAweERELCAweEVELCAweEVFLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRSwgMHhDRiwgMHhDRCwgMHhDQywgMHhDQywgMHg4RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsCisgICAgMHhGRiwgMHhDRCwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQiwgMHhDQywgMHhCQiwKKyAgICAweENDLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENDLCAweEJBLCAweEFBLCAweEFCLCAweEJDLAorICAgIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODgsIDB4OUEsIDB4QkQsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhBOSwgMHg4NywgMHg2NiwgMHg3OCwgMHg5QiwgMHhDRCwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweERDLCAweEJBLCAweDg2LCAweDU0LCAweDQ1LCAweDc4LCAweEFDLCAweERGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkIsIDB4QTgsIDB4NjQsIDB4MjIsIDB4NDYsIDB4ODksIDB4QkQsIDB4RkYsIDB4RkYsIDB4REYsIDB4REMsIDB4QjksCisgICAgMHg4NiwgMHg0MiwgMHgyNCwgMHg2OCwgMHg5QiwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQywgMHhBOCwgMHg3NSwKKyAgICAweDQ0LCAweDU2LCAweDhBLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweENBLCAweDk4LCAweDc2LCAweDY2LAorICAgIDB4NzksIDB4QUQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkQsIDB4QkEsIDB4OTgsIDB4ODgsIDB4ODksIDB4QUIsCisgICAgMHhEQywgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhEQywgMHhDQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhDRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERCLCAweENDLCAweEJCLCAweENDLCAweEZELCAweERGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsIDB4Q0YsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRCwgMHhGRiwgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEQsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REYsIDB4RkQsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0IsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4OEYsIDB4RkYsCisgICAgMHhFRSwgMHhERCwgMHhEQywgMHhDQywgMHhDRCwgMHhEQywgMHhFRCwgMHhERiwgMHhGQywgMHhGRiwgMHhFRSwgMHhEQywKKyAgICAweENDLCAweENCLCAweEJCLCAweEJDLCAweENDLCAweERFLCAweEVGLCAweERGLCAweEZELCAweENDLCAweEJCLCAweEFCLAorICAgIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RUQsIDB4REQsIDB4REMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksCisgICAgMHg5QSwgMHhCQywgMHhDRCwgMHhERCwgMHhERCwgMHhGRCwgMHhDQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwKKyAgICAweEJCLCAweENELCAweERELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4REQsIDB4REMsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4RUQsCisgICAgMHhDQywgMHhDQSwgMHg5OCwgMHg3NiwgMHg1NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQywgMHhERSwgMHhEQywgMHhDQiwKKyAgICAweEE5LCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDc4LCAweDlBLCAweEJDLCAweERELCAweERDLCAweEJBLCAweDk4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTYsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhERCwgMHhERCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEJDLCAweERFLCAweERDLCAweENDLCAweEJBLCAweDk4LCAweDg3LCAweDc2LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUUsIDB4Q0QsIDB4Q0IsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODksIDB4QUIsIDB4Q0QsCisgICAgMHhERSwgMHhGQywgMHhFRCwgMHhCQiwgMHhCQSwgMHhBOSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCRCwgMHhERiwgMHhGRSwKKyAgICAweENELCAweEVELCAweENCLCAweEJCLCAweEJBLCAweEFBLCAweEJCLCAweENDLCAweEVELCAweEZGLCAweEVDLCAweEVFLAorICAgIDB4REMsIDB4Q0MsIDB4Q0MsIDB4QkMsIDB4Q0MsIDB4REQsIDB4REYsIDB4RUYsIDB4RkYsIDB4Q0QsIDB4RUQsIDB4REQsCisgICAgMHhDRCwgMHhDRCwgMHhEQywgMHhERCwgMHhERiwgMHhFRiwgMHhGRiwgMHhGQywgMHhGRiwgMHhGRCwgMHhFRSwgMHhFRCwKKyAgICAweEVFLCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweDhELCAweERDLCAweENELCAweENELCAweERELCAweEVELAorICAgIDB4RUUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEVELCAweERDLCAweENDLCAweENDLCAweENDLCAweENDLCAweERELCAweERELCAweEFGLCAweEZGLAorICAgIDB4RkQsIDB4REMsIDB4Q0IsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REQsIDB4RUYsIDB4RkUsIDB4RkYsIDB4RUQsIDB4Q0IsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhFRiwgMHhFRSwgMHhFRCwgMHhDQiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweENELCAweEZFLCAweEVELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QkMsIDB4REQsIDB4REQsIDB4REIsIDB4QTksIDB4OTgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweENELCAweERDLCAweENBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweERELAorICAgIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REMsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhDQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEJELCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QiwgMHhDRCwgMHhFQywgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweERFLCAweENDLCAweEJBLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDk5LCAweEFCLAorICAgIDB4REYsIDB4RUQsIDB4REMsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OUEsIDB4QUIsIDB4Q0QsIDB4RkYsCisgICAgMHhERCwgMHhDQywgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhGRiwgMHhGRCwgMHhFRCwKKyAgICAweENDLCAweEJCLCAweEJBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweEVGLCAweEZGLCAweERGLCAweEVELCAweERDLAorICAgIDB4Q0MsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RUQsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRCwgMHhERCwgMHhERCwgMHhERCwgMHhEQywgMHhERCwKKyAgICAweERFLCAweEVGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhFRiwgMHhGRiwgMHhFRCwgMHhEQywgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhERCwgMHg5RiwgMHhGRiwKKyAgICAweEZFLCAweERELCAweENDLCAweENDLCAweENDLCAweENELCAweERELCAweEVFLCAweEZELCAweEZFLCAweEVFLCAweENDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4REUsIDB4RUUsIDB4REUsIDB4RkYsIDB4REMsIDB4QkIsIDB4QUEsCisgICAgMHg5OSwgMHhBQSwgMHhBQiwgMHhDQywgMHhDRSwgMHhERCwgMHhFRCwgMHhFQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwKKyAgICAweDlBLCAweEFCLCAweEJDLCAweEVFLCAweENELCAweERDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4Q0MsIDB4RUQsIDB4REQsIDB4Q0EsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhERCwgMHhEQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhERCwKKyAgICAweERDLCAweEJBLCAweDk3LCAweDY1LCAweDU0LCAweDU1LCAweDY2LCAweDc4LCAweEFCLCAweEJELCAweENDLCAweENCLAorICAgIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REUsIDB4Q0MsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHg5QiwgMHhDRCwgMHhEQywgMHhDQiwgMHhBOCwgMHg3NiwgMHg2NSwKKyAgICAweDU0LCAweDU1LCAweDY3LCAweDlBLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REMsIDB4REMsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QSwgMHhCRCwgMHhERCwgMHhERCwgMHhDQiwgMHhBOSwgMHg4OCwgMHg4NywgMHg3NywgMHg4OCwgMHg5QSwgMHhCQywKKyAgICAweERGLCAweERELCAweERDLCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg5LCAweDlBLCAweEJDLCAweENFLCAweEZFLAorICAgIDB4REQsIDB4REMsIDB4QkIsIDB4QkEsIDB4QTksIDB4QUEsIDB4QUEsIDB4QkMsIDB4REUsIDB4REYsIDB4RkQsIDB4RkQsCisgICAgMHhDQywgMHhDQiwgMHhCQiwgMHhCQSwgMHhCQiwgMHhCQywgMHhERCwgMHhFRiwgMHhGRiwgMHhERiwgMHhERCwgMHhEQywKKyAgICAweENDLCAweENDLCAweENDLCAweENDLCAweERELCAweEVFLCAweEZGLCAweEZELCAweEVFLCAweERFLCAweERELCAweERELAorICAgIDB4REQsIDB4REQsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4OUMsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REMsIDB4RUQsCisgICAgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRSwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REQsIDB4RUQsIDB4REQsIDB4Q0MsIDB4REQsIDB4OEYsIDB4RkYsCisgICAgMHhGRiwgMHhGRSwgMHhGRSwgMHhERCwgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZFLCAweERELCAweERELCAweERDLCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweERELCAweENDLAorICAgIDB4QkIsIDB4QkIsIDB4Q0QsIDB4REYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4REUsIDB4REMsIDB4QkIsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhDQywgMHhDRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhDQywgMHhCQSwgMHg5OCwgMHg4OCwgMHg5OSwgMHhBQiwKKyAgICAweENELCAweEZELCAweEZGLCAweEVELCAweEVELCAweEJBLCAweDg3LCAweDc3LCAweDc3LCAweDg5LCAweEFCLCAweENELAorICAgIDB4RkYsIDB4REQsIDB4RUQsIDB4Q0IsIDB4OTcsIDB4NjUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QkMsIDB4RkYsIDB4RUYsCisgICAgMHhFRiwgMHhEQiwgMHhBOCwgMHg3NSwgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhDRCwgMHhFRiwgMHhFRCwgMHhFQywKKyAgICAweENBLCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDc4LCAweEFCLCAweERGLCAweEZFLCAweERFLCAweENCLCAweEE4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTcsIDB4ODksIDB4Q0QsIDB4RUYsIDB4RkQsIDB4RUMsIDB4Q0EsIDB4OTcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg3OSwgMHhBQiwgMHhERSwgMHhERiwgMHhGRSwgMHhEQywgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDlBLCAweENELCAweEZGLCAweEZFLCAweERFLCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDc4LCAweDlBLAorICAgIDB4QkMsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4OUEsIDB4QkMsIDB4REUsCisgICAgMHhGRiwgMHhGRiwgMHhERiwgMHhDQywgMHhCQiwgMHhBQSwgMHhBOSwgMHhBQiwgMHhCQywgMHhERCwgMHhGRSwgMHhGRiwKKyAgICAweERGLCAweEVFLCAweEVDLCAweENDLCAweEJCLCAweEJDLCAweEJELCAweEVELCAweEZGLCAweEZGLCAweEZGLCAweEVGLAorICAgIDB4RkQsIDB4REQsIDB4Q0MsIDB4REMsIDB4Q0QsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4REUsIDB4RUYsCisgICAgMHhERSwgMHhGRCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHhFRSwKKyAgICAweEVFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdDLCAweENCLCAweENELCAweERFLCAweEZGLCAweEVFLAorICAgIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENELCAweEVELCAweERCLCAweENDLCAweEJBLCAweEFCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDdGLCAweEZELAorICAgIDB4Q0QsIDB4Q0IsIDB4QkEsIDB4QkIsIDB4QkIsIDB4QkYsIDB4REMsIDB4REMsIDB4RkQsIDB4REQsIDB4REMsIDB4QkIsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhFRCwgMHhDRiwgMHhFQywgMHhEQywgMHhCQSwgMHhBQSwgMHg5OSwKKyAgICAweDk4LCAweDk5LCAweEFBLCAweEJCLCAweENELCAweERGLCAweERDLCAweEJBLCAweEE5LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4OTksIDB4OUEsIDB4QkMsIDB4Q0UsIDB4REMsIDB4REIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHhDRCwgMHhDRiwgMHhDQywgMHhCOSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwKKyAgICAweENDLCAweERDLCAweENBLCAweDk4LCAweDc3LCAweDY1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFDLCAweENDLAorICAgIDB4QkIsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REIsIDB4Q0EsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQSwgMHhDQywgMHhDQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweERCLCAweEJBLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg3OCwgMHg5QSwgMHhCRCwgMHhDQiwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDg5LCAweEFDLCAweENGLCAweENDLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4Q0MsIDB4REIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0MsIDB4REQsCisgICAgMHhERiwgMHhDQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCRCwgMHhERiwgMHhGQywgMHhFRSwKKyAgICAweERCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJELCAweERFLCAweEZGLCAweENGLCAweERELCAweERELAorICAgIDB4QkMsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REUsIDB4RkYsIDB4REQsIDB4REQsIDB4RUQsIDB4Q0QsIDB4Q0QsCisgICAgMHhEQywgMHhDQywgMHhDRSwgMHhERiwgMHhGRiwgMHhGRiwgMHg4RCwgMHhCQiwgMHhFRCwgMHhDQywgMHhDQiwgMHhDRCwKKyAgICAweENGLCAweERELCAweERGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRCwgMHhDQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhBQSwgMHhCQiwgMHg3QywgMHhEQywKKyAgICAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweEJDLCAweERDLCAweENDLCAweEJCLCAweEFBLAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4Q0IsIDB4QkEsIDB4QTksIDB4OTksIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhCQywgMHhEQywgMHhCQiwgMHhBQSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywKKyAgICAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweEJBLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OTksIDB4QUIsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhBQiwgMHhCOSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBQiwKKyAgICAweDlBLCAweDk4LCAweDc3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEI5LCAweEE5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4OUEsIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhCOSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEJBLCAweDlBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkEsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhCQiwgMHhBQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEFDLCAweEJBLCAweEJBLCAweEE5LCAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDlBLCAweEFCLCAweENDLAorICAgIDB4QkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OTksIDB4QUIsIDB4Q0QsIDB4Q0IsIDB4Q0IsCisgICAgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDQywgMHhERSwgMHhCQywgMHhDQywgMHhCQiwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENELCAweENFLCAweERCLCAweERFLCAweENDLCAweENCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REQsIDB4RUQsIDB4OUMsIDB4Q0IsIDB4QkIsIDB4QUIsIDB4QUEsIDB4QkEsCisgICAgMHhCQiwgMHhCQiwgMHhDRCwgMHhERCwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkIsIDB4OUMsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhBQiwgMHhCQywgMHhEQywgMHhCQywgMHhCQSwgMHhBOSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweEJCLCAweEJBLCAweEE5LCAweDk4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4QkIsIDB4QUEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEJBLCAweEFBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QUEsCisgICAgMHg5OSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NSwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHg5OSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLCAweDk5LCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QTksIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg1NSwgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEE5LCAweEE5LCAweDg4LCAweDc3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhCQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQiwKKyAgICAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweEJCLCAweEJCLAorICAgIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4REMsIDB4QkMsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQywgMHhDRCwgMHhEQiwgMHhDRCwgMHhDQiwgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweERELCAweDlDLCAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REQsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENDLCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweDlBLCAweEFBLCAweEFBLCAweEJCLCAweEJCLCAweDhDLCAweENELAorICAgIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0MsIDB4REMsIDB4Q0MsIDB4QkEsIDB4QkEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhBQiwgMHhDQywgMHhDQywgMHhDQiwgMHhBOSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDg5LCAweDk5LCAweDlBLCAweEJCLCAweENCLCAweEJCLCAweEFBLCAweDk4LCAweDg4LCAweDc3LCAweDc4LAorICAgIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4QkIsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5OSwgMHhBQiwgMHhCQiwgMHhBQSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEFBLCAweEE5LCAweDg4LCAweDc2LCAweDY2LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEJCLAorICAgIDB4OUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QUEsIDB4QTksCisgICAgMHg4NywgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OSwgMHg5QSwgMHhCQiwgMHhBQSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEE5LCAweEE5LCAweDg4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQiwgMHhCQSwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFBLCAweEJDLCAweEFCLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkMsIDB4QkEsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OUEsIDB4QkIsIDB4Q0IsCisgICAgMHhBQiwgMHhCQSwgMHhBOSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhDQiwgMHhEQiwKKyAgICAweEFBLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEJCLCAweENELCAweERDLCAweEJDLCAweEJCLCAweEJBLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REUsIDB4REIsIDB4Q0MsIDB4Q0MsIDB4QkIsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhDRSwgMHhERCwgMHg3QiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEJCLCAweENCLCAweENDLCAweENDLCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhEQywgMHhGRSwgMHhDRCwgMHhDQywgMHhERCwgMHg3RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkQsIDB4RkYsIDB4REYsIDB4RkYsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4REMsCisgICAgMHhCRCwgMHhERiwgMHhGRCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhEQywgMHhDQywgMHhCQiwKKyAgICAweENDLCAweEZGLCAweERGLCAweEZGLCAweEZELCAweEZGLCAweEZELCAweENCLCAweEFBLCAweEFBLCAweEFDLCAweEJCLAorICAgIDB4QkUsIDB4REYsIDB4RkYsIDB4RUYsIDB4REYsIDB4REMsIDB4QTksIDB4OTgsIDB4ODksIDB4QUEsIDB4Q0IsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQywgMHhBOSwgMHg4NiwgMHg2NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhGRiwgMHhGRCwKKyAgICAweEZGLCAweEZELCAweEJBLCAweDg2LCAweDU0LCAweDQ1LCAweDc5LCAweEFDLCAweENGLCAweERGLCAweEZGLCAweEZGLAorICAgIDB4Q0MsIDB4QTgsIDB4NjQsIDB4MjIsIDB4NDYsIDB4OEEsIDB4QkUsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0EsCisgICAgMHg4NiwgMHg0MiwgMHgyNCwgMHg2OCwgMHhBQiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhBOSwgMHg3NSwKKyAgICAweDQ0LCAweDU2LCAweDhBLCAweENELCAweERGLCAweEZFLCAweEZGLCAweEZELCAweERCLCAweDk4LCAweDc2LCAweDY2LAorICAgIDB4ODksIDB4QkMsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODksIDB4QkIsCisgICAgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQywgMHhCQSwgMHhBOSwgMHg5QSwgMHhCQywgMHhERCwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERDLCAweEJDLCAweEJCLCAweENDLCAweENDLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4REMsIDB4RkQsIDB4REQsIDB4REQsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhEQywgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZELCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4Q0QsIDB4REYsIDB4RkQsIDB4RUUsIDB4REYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RkMsIDB4RkYsIDB4N0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELAorICAgIDB4RkYsIDB4REYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RkMsIDB4Q0MsIDB4Q0YsCisgICAgMHhERCwgMHhGRiwgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhERCwgMHhCQiwgMHhCQSwgMHhBQywgMHhDQiwKKyAgICAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFBLCAweDk5LCAweDg5LCAweEFBLCAweEFGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkMsIDB4QkEsIDB4ODcsIDB4NjYsIDB4NzksIDB4QUIsIDB4REQsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhDQiwgMHg5NywgMHg1NCwgMHg0NSwgMHg3OSwgMHhCQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEI5LCAweDY0LCAweDIyLCAweDQ2LCAweDhBLCAweERELCAweERELCAweEZGLCAweEZGLCAweEZELCAweERDLAorICAgIDB4OTYsIDB4NDIsIDB4MjMsIDB4NjksIDB4QkIsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QjksIDB4NzUsCisgICAgMHg0NCwgMHg1NywgMHg5QiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhBOSwgMHg3NiwgMHg2NiwKKyAgICAweDg5LCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENCLCAweEE5LCAweDg4LCAweDk5LCAweEFELAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QUEsIDB4QUIsIDB4Q0MsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhEQiwgMHhCQiwgMHhCRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweERELCAweEZELCAweEZELCAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4REMsIDB4REMsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweERGLCAweEZELCAweEZGLCAweEZBLCAweEJELAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDg5LCAweDk5LCAweDk4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDk4LCAweDk4LCAweDlBLCAweDZBLCAweENCLAorICAgIDB4OUEsIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4OUEsIDB4QUIsIDB4QUEsIDB4REEsIDB4OUEsIDB4QTksIDB4ODksCisgICAgMHg5OSwgMHg4OSwgMHg5OSwgMHg4OSwgMHg4QSwgMHg5OSwgMHhBQSwgMHg5QSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg5LCAweEE5LCAweEFBLCAweEFBLCAweDg5LCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODksIDB4OUEsIDB4QjksIDB4QTksIDB4QTksIDB4OTgsIDB4NzgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhBOSwgMHg4OSwgMHg5OCwgMHg4NywgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweDlBLCAweEE4LCAweDk4LCAweDg4LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDc3LCAweDg4LCAweDg5LCAweDk4LAorICAgIDB4ODksIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODgsIDB4OUIsIDB4QTgsIDB4OTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OCwgMHhBOCwgMHg4OSwgMHg4OCwgMHg4NywKKyAgICAweDc2LCAweDY1LCAweDU2LCAweDY3LCAweDc3LCAweDg4LCAweDk5LCAweDk4LCAweDk5LCAweDc4LCAweDc3LCAweDY2LAorICAgIDB4NjUsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OEEsIDB4OTksIDB4ODksIDB4OTgsIDB4NzgsIDB4NzcsIDB4NjYsIDB4NjYsCisgICAgMHg2NywgMHg3NywgMHg4OCwgMHhBQiwgMHg5OCwgMHg5OSwgMHg4OSwgMHg4NywgMHg3NywgMHg3NiwgMHg2NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweEE5LCAweDlBLCAweDlBLCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4OUIsIDB4OTgsIDB4QTksIDB4OTksIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4OUEsIDB4QTksCisgICAgMHg4QSwgMHg5OSwgMHg5OSwgMHg4OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHg4QSwgMHhBQSwgMHhBOSwgMHhBQiwKKyAgICAweEFBLCAweDk4LCAweDg4LCAweDg5LCAweDg4LCAweDg5LCAweDlBLCAweEJBLCAweEE5LCAweEFDLCAweEJBLCAweEI5LAorICAgIDB4QUEsIDB4OTksIDB4OTksIDB4OUEsIDB4OTksIDB4QUEsIDB4QUQsIDB4QTksIDB4QkEsIDB4QUIsIDB4QUIsIDB4QTksCisgICAgMHg5QSwgMHg5QSwgMHhCQSwgMHhBQSwgMHg5QywgMHhCQiwgMHg4QiwgMHhBOSwgMHhBOCwgMHg5OSwgMHg5OCwgMHg4OCwKKyAgICAweDk5LCAweDlBLCAweEFBLCAweEFCLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRSwgMHhERCwgMHhDQywgMHhDQywgMHhEQywgMHhERCwgMHhFRCwgMHhFRiwgMHhERiwgMHhGRiwKKyAgICAweEVELCAweERDLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhERCwgMHhGRiwgMHhGRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEJDLCAweEZGLCAweEZFLCAweERDLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QkMsIDB4REYsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhFRSwgMHhCQiwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQiwgMHhERiwKKyAgICAweENCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweEJELCAweERDLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NSwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhEQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweERELCAweENDLCAweEE5LCAweDg3LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4RUMsIDB4Q0EsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhERiwgMHhEQywgMHhCQSwgMHg5OSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHhBQiwKKyAgICAweERGLCAweEZGLCAweERDLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweENELCAweEZGLAorICAgIDB4RkUsIDB4Q0IsIDB4QkEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhEQywgMHhDQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQywgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhERCwKKyAgICAweENCLCAweEJCLCAweEJCLCAweENDLCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweERELAorICAgIDB4REQsIDB4REUsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RUYsIDB4REQsCisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QUEsIDB4OTksIDB4QTksIDB4ODksIDB4ODksIDB4OTksIDB4OTgsIDB4OTksIDB4QkIsIDB4NkIsIDB4QUIsCisgICAgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhCQSwgMHhBQiwgMHhCRSwgMHhGQiwgMHg5QiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweEE5LCAweEFDLCAweDlCLCAweEJBLCAweEM5LCAweEI5LCAweEE5LCAweDk5LCAweDg4LAorICAgIDB4ODksIDB4ODgsIDB4ODksIDB4QUEsIDB4QUEsIDB4QkEsIDB4OTksIDB4OTksIDB4ODgsIDB4ODgsIDB4NzcsIDB4ODcsCisgICAgMHg4OCwgMHg4OSwgMHhBQSwgMHhBQSwgMHhBOSwgMHg5QSwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwKKyAgICAweDk5LCAweEFBLCAweEE5LCAweDlBLCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QkIsIDB4QTksIDB4OTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzgsIDB4ODgsIDB4OTksIDB4QjksCisgICAgMHg5QSwgMHg5OCwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBQSwgMHg5OSwgMHg5OSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDc3LCAweDc4LCAweDhBLCAweEE5LCAweDk5LCAweDk5LCAweDg3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QTgsIDB4OTksIDB4OTgsIDB4NzYsIDB4NjYsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBOSwgMHg5OSwgMHg5OCwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwKKyAgICAweDY3LCAweDc4LCAweDk4LCAweDlCLCAweEE5LCAweDk5LCAweDk4LCAweDg3LCAweDc3LCAweDY2LCAweDc3LCAweDc3LAorICAgIDB4ODksIDB4OTksIDB4Q0EsIDB4OUEsIDB4QTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhBQiwgMHg5OSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4NywgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QiwgMHhCOSwKKyAgICAweEFCLCAweEE5LCAweEFBLCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDlBLCAweEJBLCAweEFCLCAweEE5LCAweEVBLAorICAgIDB4QUEsIDB4OUEsIDB4QTksIDB4OUEsIDB4ODksIDB4OTksIDB4OUEsIDB4QUMsIDB4QUIsIDB4QUMsIDB4REEsIDB4QkEsCisgICAgMHhBQSwgMHg5QSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQSwgMHhDQywgMHhBQSwgMHhGQiwgMHhEQiwgMHhCQSwgMHhBQSwKKyAgICAweEFBLCAweEJBLCAweEJCLCAweEJCLCAweEZDLCAweEZCLCAweDdBLCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LAorICAgIDB4OTksIDB4OUEsIDB4QUEsIDB4QUIsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQiwgMHhBOSwgMHhBQSwgMHhCQiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweDk4LCAweDc3LCAweDg5LCAweEFGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTgsIDB4NTQsIDB4NDYsIDB4OEEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhEQSwgMHg3NCwgMHgxMiwgMHg0NywgMHhBQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEE3LCAweDQyLCAweDI0LCAweDc5LCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJBLCAweDg2LAorICAgIDB4NDQsIDB4NTcsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjksIDB4ODcsIDB4NzcsCisgICAgMHg5QiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQiwgMHhCQSwgMHg5QSwgMHhBQiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg4QSwgMHg5OCwgMHg4OCwgMHg4NywgMHg3NywgMHhGNywgMHg2RiwgMHg4OCwgMHg4RiwgMHhBQSwgMHg1OSwgMHhGQSwKKyAgICAweEFGLCAweEFGLCAweDhBLCAweDg3LCAweDhBLCAweEE4LCAweEZBLCAweEE5LCAweEY5LCAweDlBLCAweEFGLCAweDk4LAorICAgIDB4OUEsIDB4NzksIDB4ODksIDB4NzgsIDB4OUEsIDB4RkEsIDB4RkYsIDB4QUMsIDB4ODgsIDB4OEYsIDB4ODcsIDB4ODgsCisgICAgMHhBOCwgMHg4OSwgMHg5QSwgMHg4NywgMHhBRiwgMHhGQSwgMHg3QSwgMHhBOSwgMHg4NywgMHg3OCwgMHg3NywgMHg5OCwKKyAgICAweDc4LCAweDg5LCAweEFBLCAweEZBLCAweEE4LCAweDk4LCAweDk5LCAweDg3LCAweDc4LCAweDg3LCAweDc3LCAweDg3LAorICAgIDB4ODcsIDB4RkEsIDB4RTgsIDB4OEIsIDB4OTcsIDB4NzYsIDB4ODgsIDB4NzcsIDB4NjcsIDB4NzcsIDB4NzgsIDB4NzgsCisgICAgMHg4QSwgMHg4NywgMHhBOSwgMHg4RiwgMHg3NywgMHg3NywgMHg2NywgMHg5NywgMHg4OCwgMHg3OCwgMHg5OSwgMHhBOCwKKyAgICAweDc5LCAweDg5LCAweDc3LCAweDc2LCAweDY2LCAweDc2LCAweDc3LCAweDc3LCAweDhGLCAweDg5LCAweDk4LCAweEY5LAorICAgIDB4ODgsIDB4OTcsIDB4NjYsIDB4NTcsIDB4NjcsIDB4NzgsIDB4NzcsIDB4QTksIDB4ODgsIDB4NzgsIDB4ODcsIDB4ODcsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg2OCwgMHg5NywgMHhGOSwgMHg4OCwgMHhBOCwgMHg3OCwgMHg4NywgMHg3NiwKKyAgICAweDY2LCAweDc3LCAweDY4LCAweDc3LCAweDg4LCAweDg5LCAweDk5LCAweEE4LCAweDc4LCAweDc3LCAweDc3LCAweDc2LAorICAgIDB4NjcsIDB4NzYsIDB4NzcsIDB4ODksIDB4QTksIDB4OEEsIDB4ODcsIDB4ODcsIDB4NzcsIDB4NjgsIDB4NzYsIDB4NzYsCisgICAgMHg4OCwgMHg5QSwgMHg5QSwgMHhBQSwgMHhBNywgMHg5NywgMHg4NywgMHg4NywgMHg4NywgMHg3NywgMHg5OSwgMHg3NywKKyAgICAweDlBLCAweDg3LCAweDlBLCAweDk5LCAweDc5LCAweDc5LCAweDc2LCAweDg3LCAweDk4LCAweDk5LCAweEE4LCAweDg4LAorICAgIDB4OTgsIDB4OUEsIDB4QTksIDB4OTksIDB4OTcsIDB4OTgsIDB4OEEsIDB4OTgsIDB4OUEsIDB4RkYsIDB4QTgsIDB4RkEsCisgICAgMHg3RiwgMHg4QSwgMHg4RiwgMHg5OCwgMHg4QSwgMHhBOCwgMHhGRiwgMHhGOSwgMHhBOCwgMHhBRiwgMHg5OSwgMHg5OSwKKyAgICAweDg4LCAweDk5LCAweEFBLCAweDk4LCAweDlBLCAweEFBLCAweEFGLCAweEFBLCAweEZBLCAweEY5LCAweDlBLCAweEZBLAorICAgIDB4RjksIDB4OEEsIDB4QTgsIDB4OTgsIDB4QUYsIDB4QTksIDB4OUYsIDB4RkEsIDB4ODksIDB4ODcsIDB4NzgsIDB4OTgsCisgICAgMHg4NywgMHg4QSwgMHg4NywgMHg5OSwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4NkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweEJGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkEsIDB4ODgsIDB4QUIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOCwgMHg2NSwgMHg1NywgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweDg0LCAweDEyLCAweDU4LCAweEFGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RjgsIDB4NTIsIDB4MTQsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4OTYsCisgICAgMHg1NCwgMHg2OCwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHhBOCwgMHg4OSwKKyAgICAweEFGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVCLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZGLCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEJGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEVGLCAweEZFLCAweEVGLCAweEZGLCAweEZFLCAweEVFLCAweEU1LCAweEZGLCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHg0RSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHg1RiwgMHhGRiwKKyAgICAweEZGLCAweEY1LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEVFLCAweDVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RTUsIDB4RTUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRiwgMHhGRiwgMHg1NSwgMHhGNSwgMHg1RiwgMHhGNSwgMHhGRiwgMHg1RiwgMHg1RiwKKyAgICAweEZGLCAweEZGLCAweEY0LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDU1LCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RjUsIDB4RkYsIDB4RjUsIDB4RkYsIDB4NUYsIDB4NEYsIDB4RkUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFMywgMHhFNSwgMHhFRSwgMHg1RSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFNSwgMHg0RSwKKyAgICAweEVFLCAweDVFLCAweDVFLCAweEU1LCAweDVFLCAweDVFLCAweDU1LCAweEVFLCAweEVFLCAweDU0LCAweEVFLCAweEU1LAorICAgIDB4NUUsIDB4RTUsIDB4RTYsIDB4NUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUYsIDB4RjUsIDB4RkYsIDB4RjUsIDB4RkYsCisgICAgMHhGNSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg1RiwgMHhGNSwgMHhGRiwgMHg1RiwgMHhGRiwKKyAgICAweEY1LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY1LCAweEZGLCAweDVGLCAweEY1LCAweDVGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4NUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkUsIDB4RkYsIDB4NUYsCisgICAgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRSwgMHhGRSwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg3OCwgMHhGNiwgMHg2NiwgMHg2OCwgMHg3NiwgMHg2NywgMHg2NywgMHg5OCwgMHg3OCwgMHg3RiwgMHg2OCwgMHg5OCwKKyAgICAweDlGLCAweEY4LCAweEY3LCAweEZFLCAweDhGLCAweEZGLCAweDlGLCAweEZGLCAweDlGLCAweDg4LCAweDdGLCAweDg4LAorICAgIDB4OUYsIDB4NzksIDB4OUYsIDB4RkYsIDB4OEYsIDB4OUYsIDB4RjksIDB4OTYsIDB4OTksIDB4OTcsIDB4NzgsIDB4NjcsCisgICAgMHhGNywgMHg5OCwgMHhGRiwgMHg3OSwgMHg5OSwgMHhGOCwgMHg3NywgMHhGOCwgMHg4OSwgMHg5NywgMHg3OCwgMHg4OSwKKyAgICAweEY3LCAweDhGLCAweEZGLCAweEZGLCAweDc4LCAweDk5LCAweDc5LCAweDk3LCAweDk3LCAweDc3LCAweDk5LCAweDdGLAorICAgIDB4NzksIDB4OTksIDB4OTgsIDB4NzcsIDB4OUYsIDB4NjcsIDB4NjcsIDB4NjcsIDB4NzgsIDB4OTgsIDB4OUYsIDB4OTksCisgICAgMHg4OSwgMHhGNiwgMHg5RiwgMHg3OSwgMHg3OCwgMHg3NiwgMHg2NiwgMHhGOCwgMHg3OCwgMHg4OSwgMHg3OCwgMHhGOCwKKyAgICAweDg3LCAweDg4LCAweDk5LCAweDg3LCAweDc3LCAweDY5LCAweDc5LCAweDc4LCAweEY3LCAweDlGLCAweDc3LCAweEY5LAorICAgIDB4OTksIDB4NzYsIDB4NzcsIDB4NzcsIDB4NjgsIDB4ODcsIDB4NzgsIDB4OUYsIDB4OTcsIDB4ODgsIDB4NzgsIDB4ODksCisgICAgMHg5NywgMHg3NiwgMHg3NywgMHg3NywgMHg4OSwgMHg4RiwgMHg4RiwgMHg2NywgMHg4OSwgMHg5OCwgMHg4OSwgMHg3OCwKKyAgICAweDc3LCAweDg3LCAweDc4LCAweDc5LCAweDc4LCAweDk2LCAweDY4LCAweDlGLCAweEE4LCAweDk3LCAweDc4LCAweDc4LAorICAgIDB4OEYsIDB4ODksIDB4NzksIDB4OEYsIDB4NjcsIDB4RkYsIDB4OEYsIDB4OTksIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzYsCisgICAgMHg4NiwgMHhGOCwgMHhGNiwgMHg5OSwgMHg5RiwgMHg3RiwgMHg4OSwgMHg5NywgMHg3OSwgMHg4OCwgMHg2RiwgMHg4OCwKKyAgICAweDg5LCAweDY4LCAweEZGLCAweEZGLCAweEY5LCAweDk4LCAweDg5LCAweEY4LCAweEZGLCAweDk4LCAweDlGLCAweEY3LAorICAgIDB4NzgsIDB4NzksIDB4RjksIDB4NzcsIDB4ODksIDB4RjgsIDB4OTcsIDB4ODksIDB4RjksIDB4OTgsIDB4NzcsIDB4OUYsCisgICAgMHg5RiwgMHg4OSwgMHg5RiwgMHg5OSwgMHg5OCwgMHg5RiwgMHg5OSwgMHg5RiwgMHg5OCwgMHg4OSwgMHg5OCwgMHhGRiwKKyAgICAweDlGLCAweEY4LCAweEY5LCAweDg4LCAweDlGLCAweDdGLCAweEY5LCAweDY3LCAweEZGLCAweDk5LCAweDk4LCAweEY5LAorICAgIDB4RkYsIDB4ODksIDB4OUYsIDB4RkYsIDB4OUYsIDB4RjksIDB4NTksIDB4NzcsIDB4OTgsIDB4NjgsIDB4OTYsIDB4NzcsCisgICAgMHg2OCwgMHg4OSwgMHhGNywgMHg2RiwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4NjgsIDB4ODksIDB4NzgsIDB4NzcsIDB4NjcsIDB4ODgsIDB4ODgsIDB4RkYsIDB4NzksIDB4OTksIDB4NjksIDB4RjksCisgICAgMHhGOSwgMHg4OCwgMHg4NywgMHg3OSwgMHg4RiwgMHhGOSwgMHhGOCwgMHhGOSwgMHhGNywgMHg4RiwgMHg5OCwgMHg3OCwKKyAgICAweDc5LCAweEY5LCAweEY4LCAweDg4LCAweDc5LCAweDdGLCAweEY5LCAweDk3LCAweEZGLCAweDhGLCAweDk4LCAweDc4LAorICAgIDB4NzcsIDB4NjcsIDB4RjgsIDB4RjksIDB4RkYsIDB4RjksIDB4NzgsIDB4RjgsIDB4ODgsIDB4ODcsIDB4ODgsIDB4NzcsCisgICAgMHg5OCwgMHhGNywgMHg5OCwgMHhGRiwgMHg5OCwgMHg5RiwgMHhGOCwgMHg5OCwgMHg4NywgMHg3NiwgMHg3OSwgMHg5NywKKyAgICAweDc4LCAweDg5LCAweDhDLCAweDc3LCAweDg4LCAweDc4LCAweDc3LCAweDc3LCAweDg4LCAweDc3LCAweDc4LCAweDc5LAorICAgIDB4OUYsIDB4ODgsIDB4NzksIDB4NzcsIDB4NzcsIDB4NzcsIDB4NjcsIDB4NzcsIDB4NzcsIDB4OEYsIDB4OTksIDB4OTcsCisgICAgMHg4NywgMHg3NywgMHg3OCwgMHg4NywgMHg3OCwgMHg3NiwgMHg3NywgMHg3OCwgMHg5RiwgMHg5OSwgMHhGNywgMHg3NywKKyAgICAweDk4LCAweDc2LCAweDc2LCAweDc3LCAweDY4LCAweDdGLCAweDc4LCAweEZGLCAweEY5LCAweDc4LCAweDg4LCAweDg3LAorICAgIDB4ODgsIDB4NzYsIDB4NjcsIDB4ODgsIDB4NzksIDB4NzgsIDB4RjksIDB4ODcsIDB4ODksIDB4OTcsIDB4NzcsIDB4NjgsCisgICAgMHg2NywgMHg3NywgMHg3NywgMHg3NywgMHg4RSwgMHg3OCwgMHg3OCwgMHg4QSwgMHg4OCwgMHg3NywgMHg4NywgMHg3NywKKyAgICAweDY3LCAweDg4LCAweDg4LCAweDhGLCAweDg3LCAweDg5LCAweDg4LCAweDc3LCAweDc2LCAweDc3LCAweDc5LCAweDc3LAorICAgIDB4NzcsIDB4OEYsIDB4ODgsIDB4NzksIDB4RjgsIDB4NzcsIDB4NzgsIDB4NzcsIDB4ODgsIDB4NzcsIDB4NzgsIDB4OTgsCisgICAgMHg4OSwgMHg4OSwgMHhGRiwgMHhGOCwgMHg4OCwgMHg5OSwgMHg3NywgMHg5OCwgMHg3OCwgMHg4NywgMHg5OSwgMHg5OSwKKyAgICAweDk4LCAweEY4LCAweDk4LCAweEZGLCAweEZGLCAweDc5LCAweDg4LCAweDc3LCAweDc5LCAweDhGLCAweDg4LCAweEY4LAorICAgIDB4ODgsIDB4RkYsIDB4ODgsIDB4NzgsIDB4OTksIDB4OUYsIDB4ODgsIDB4RjksIDB4RjgsIDB4ODgsIDB4OTksIDB4QjksCisgICAgMHhGNywgMHg4OCwgMHg5OSwgMHhGOSwgMHg5OSwgMHg5RiwgMHhGRiwgMHg5OSwgMHhGRiwgMHg4RiwgMHg5OCwgMHg4RiwKKyAgICAweDg5LCAweDk5LCAweEY4LCAweDk5LCAweDhGLCAweEY5LCAweDVGLCAweDg5LCAweDc3LCAweDg3LCAweDk5LCAweDc4LAorICAgIDB4ODgsIDB4NzcsIDB4RjgsIDB4OEYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDVFLCAweERFLCAweEU1LCAweERFLCAweEVFLCAweEVELCAweERELCAweERFLCAweEVFLCAweEVFLCAweDRFLCAweEVELAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUQsCisgICAgMHhERCwgMHg0RCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweDVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweERELAorICAgIDB4NUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RDUsIDB4NDUsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFNSwgMHhFRSwgMHhFRSwgMHhFNSwgMHhFRSwgMHhFRSwKKyAgICAweDVFLCAweEVFLCAweEVFLCAweEVFLCAweEU1LCAweEU1LCAweEVFLCAweEU1LCAweDU0LCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4NDUsIDB4RUUsIDB4RUUsIDB4NTUsIDB4RUUsIDB4RUUsIDB4RTUsIDB4RUQsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHg1RCwgMHhERCwgMHhERCwgMHhERCwgMHg1NSwgMHhERCwgMHhERCwKKyAgICAweDU1LCAweDVELCAweDRELCAweERELCAweERELCAweDQ1LCAweERELCAweDVELCAweERELCAweERELCAweERELCAweERELAorICAgIDB4NTQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REUsIDB4NUUsIDB4RUUsIDB4NUUsIDB4RUUsCisgICAgMHhFRSwgMHg1RSwgMHhFRSwgMHhFRSwgMHhFNSwgMHhFRSwgMHhFRSwgMHhFRSwgMHg0RSwgMHhFRSwgMHg0RSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweDVFLCAweEVFLCAweEU0LCAweEU1LCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RTUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4NUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHg1NSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEU1LCAweDVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVELAorICAgIDB4RUUsIDB4RUQsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RTUsIDB4RUQsIDB4RUQsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHg1RSwgMHhFRSwgMHhFRSwgMHhFRCwgMHhFRCwgMHhFRSwgMHhFNSwgMHhFRSwgMHhFRSwKKyAgICAweEVELCAweEVELCAweEVELCAweEVFLCAweEUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlGLCAweEZGLCAweEY5LCAweEY4LCAweEY5LCAweDRGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4NjQsIDB4NjgsIDB4OUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHg4NSwgMHgxMiwgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweDUyLCAweDE0LCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY5LAorICAgIDB4NTQsIDB4NUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg1OSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweDdGLCAweEZGLCAweEZGLCAweEZGLCAweDZGLCAweEZGLCAweEY2LAorICAgIDB4RjYsIDB4RkYsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGNywgMHhGNiwgMHhGRiwgMHhGNiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNiwgMHhGRiwgMHhGRiwgMHg2NiwgMHhGNiwKKyAgICAweEZGLCAweEY2LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDU3LCAweDY3LCAweDZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkQsIDB4QkYsIDB4RjcsIDB4RjcsIDB4NkYsIDB4NjYsIDB4NkYsIDB4NjYsIDB4RjYsIDB4RkYsCisgICAgMHhGRiwgMHhGNiwgMHhGNiwgMHhGRiwgMHg3NSwgMHg3NiwgMHhGNSwgMHg2NiwgMHg2NiwgMHg2NiwgMHhGRiwgMHhGRiwKKyAgICAweEY2LCAweEZGLCAweEZGLCAweEY1LCAweDU3LCAweDY2LCAweEZGLCAweEZGLCAweDdGLCAweEZGLCAweEZGLCAweEY2LAorICAgIDB4RkYsIDB4NTYsIDB4NTYsIDB4NzUsIDB4NzcsIDB4RkYsIDB4NkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RjYsCisgICAgMHhGNiwgMHhGNiwgMHg0NCwgMHhGNSwgMHhGNiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2NiwKKyAgICAweDU2LCAweDc1LCAweDU2LCAweEY2LCAweEZGLCAweEZELCAweEM2LCAweEFGLCAweEY2LCAweDZGLCAweEZGLCAweDU1LAorICAgIDB4NTcsIDB4NUYsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NkYsIDB4RkYsIDB4NjgsCisgICAgMHg3RiwgMHhGRiwgMHhGRiwgMHg2RiwgMHhGRiwgMHhGNiwgMHhGNiwgMHg1RiwgMHg2NSwgMHg2RiwgMHg2RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEY2LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RjYsIDB4NkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweDZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY2LCAweEZGLCAweEZGLAorICAgIDB4NkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NUYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4RkYsIDB4N0YsCisgICAgMHhGRiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRCwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjYsIDB4NkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHgxMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweDYxLCAweDE1LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RjUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzRiwgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc4LCAweDg4LCAweDg4LCAweDg3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDgwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc4LCAweDg4LCAweDg4LCAweDg3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDgwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgfSwKKyB7CisgIHsKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc4LCAweDg4LCAweDg4LCAweDg3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDgwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhERSwgMHhFRSwgMHhFRSwgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRCwKKyAgICAweERELCAweERELCAweERELCAweERFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVELAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHg1RSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHg1RSwgMHhFRCwKKyAgICAweEQ1LCAweDU1LCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RUUsIDB4RTUsIDB4RTUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFNSwgMHhFRSwgMHhFNSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweDVFLCAweDVFLCAweEVFLCAweDU1LCAweDU0LCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVELAorICAgIDB4REQsIDB4REQsIDB4RDUsIDB4NUQsIDB4NDQsIDB4NUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4NUQsIDB4RDUsCisgICAgMHhENSwgMHg1RCwgMHhERCwgMHhEMywgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHg1RCwKKyAgICAweEQ0LCAweDM1LCAweDVELCAweERELCAweERELCAweERELCAweERELCAweEQ1LCAweDVFLCAweEU0LCAweDU0LCAweDUzLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RTUsIDB4RUUsIDB4RUUsIDB4NUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFNSwgMHhFRSwgMHg1RSwgMHhFRSwgMHhFNSwgMHg1RSwgMHhFRSwgMHg1RSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4NUUsIDB4RUUsIDB4RTQsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEU1LCAweEVFLCAweEVFLCAweEVELCAweEVFLCAweEVELCAweERELCAweEVELCAweEVELCAweEVELCAweEVELCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUQsIDB4RUUsIDB4RUUsIDB4RUQsCisgICAgMHhFRSwgMHhFRCwgMHhFRCwgMHhFRSwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4REMsIDB4Q0QsIDB4Q0MsIDB4Q0MsIDB4REMsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsIDB4RUYsCisgICAgMHhFRCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhERiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRCwgMHhEQywKKyAgICAweEJCLCAweEJCLCAweEFBLCAweEJCLCAweENELCAweERGLCAweEZGLCAweEZELCAweEVELCAweENDLCAweEJCLCAweEE5LAorICAgIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4REYsIDB4RkYsIDB4Q0QsIDB4Q0MsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhCQywgMHhERiwgMHhFQywgMHhEQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEJDLCAweEVFLCAweERELCAweEJBLCAweEE4LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDg4LCAweDlBLAorICAgIDB4Q0QsIDB4REQsIDB4REIsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsCisgICAgMHhDQywgMHhBOSwgMHg4NywgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3NywgMHg4OSwgMHhCRCwgMHhEQywgMHhDQiwKKyAgICAweDk4LCAweDc2LCAweDY1LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJELCAweENDLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUQsIDB4Q0QsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhDQywgMHhEQywgMHhCOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwKKyAgICAweDU2LCAweDc3LCAweDhBLCAweEJDLCAweERELCAweERCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDY2LCAweDY3LAorICAgIDB4ODksIDB4QUIsIDB4Q0QsIDB4RUMsIDB4Q0EsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQywgMHhERSwgMHhEQywgMHhCQSwgMHg5OSwgMHg4NywgMHg3NywgMHg3NywgMHg4OSwgMHg5QSwgMHhCQywgMHhEQywKKyAgICAweEZFLCAweEVDLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEJDLCAweENELCAweERGLCAweEZFLAorICAgIDB4REMsIDB4QkIsIDB4QTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QkMsIDB4Q0QsIDB4RUUsIDB4RkYsIDB4RkYsIDB4REMsCisgICAgMHhDQiwgMHhCQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhERCwgMHhERSwgMHhERiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhDQywKKyAgICAweENDLCAweENDLCAweENDLCAweERELCAweEVGLCAweEVELCAweERGLCAweEZGLCAweERGLCAweERELCAweERELCAweERDLAorICAgIDB4Q0MsIDB4Q0QsIDB4RUQsIDB4Q0UsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEVFLCAweEVFLCAweEVFLCAweERFLCAweEVFLCAweEVFLCAweERELCAweERFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUQsIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweDRFLAorICAgIDB4RUUsIDB4RUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RDQsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFRSwgMHg0RSwgMHg0RSwgMHg0RSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweDRFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFNCwgMHhFMywgMHg0RCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwKKyAgICAweERELCAweERELCAweERELCAweDRELCAweDRELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELAorICAgIDB4NDQsIDB4NEQsIDB4NEQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4NEUsIDB4RTQsIDB4RUUsIDB4M0UsIDB4NEUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFMywgMHhFRSwgMHhFNSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEU0LCAweEVFLCAweEVFLCAweEVFLCAweDRFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4NEUsIDB4M0UsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFNCwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweDRFLCAweEVFLCAweDRFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUQsIDB4RUQsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUMsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4OUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4QkIsIDB4Q0MsCisgICAgMHhCQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhEQywgMHhCQywgMHhDQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEFCLCAweENELCAweERCLCAweENCLCAweEFBLCAweDk5LCAweDk5LAorICAgIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4Q0MsIDB4QUIsIDB4QUEsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhCQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEJCLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDc2LCAweDY2LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QkEsIDB4QUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsCisgICAgMHhBQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBQSwgMHhBOSwKKyAgICAweDg4LCAweDc2LCAweDY2LCAweDU1LCAweDU2LCAweDY2LCAweDc4LCAweDg5LCAweEFBLCAweEFBLCAweDk4LCAweDg3LAorICAgIDB4NjYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsCisgICAgMHg1NSwgMHg1NiwgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQSwgMHhBQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg1NiwKKyAgICAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEFBLCAweEE5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODgsIDB4OTksIDB4QUEsIDB4QUIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhBQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg4OSwgMHhBQSwgMHhCQSwKKyAgICAweEJCLCAweEJBLCAweDk5LCAweDk4LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJDLCAweENDLAorICAgIDB4QkEsIDB4OTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4QkIsIDB4REQsIDB4Q0MsIDB4QkEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhCRCwgMHhERCwgMHhDQiwgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweENCLCAweEJDLCAweENCLCAweEJBLCAweEFBLCAweEE5LCAweDlBLAorICAgIDB4QUEsIDB4QUEsIDB4QkEsIDB4QkMsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEJCLCAweENDLCAweEJCLCAweENDLAorICAgIDB4Q0EsIDB4QUEsIDB4QUEsIDB4OUEsIDB4QTksIDB4QUEsIDB4QkIsIDB4QkQsIDB4REMsIDB4QkMsIDB4QkIsIDB4QUEsCisgICAgMHhBOSwgMHg5OSwgMHg5OCwgMHg5OSwgMHhBOSwgMHhBQiwgMHhCQiwgMHhDQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg5LCAweDk5LCAweEFCLCAweEJCLCAweEFBLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDc3LAorICAgIDB4ODgsIDB4ODgsIDB4OUEsIDB4QUIsIDB4QUEsIDB4QUEsIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OCwgMHg5OSwgMHhCQSwgMHg5QSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweDlBLCAweEE5LCAweDk5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDg5LCAweEFBLAorICAgIDB4OTksIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4OTksIDB4OTksCisgICAgMHg4OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3NywgMHg4OSwgMHg5OSwgMHg5OSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDY2LCAweDU2LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweDk5LCAweEE5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QTksIDB4OTksIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwgMHg5OSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDc4LCAweDg5LCAweEE5LCAweEFBLCAweDk5LCAweDg4LCAweDc3LCAweDc2LCAweDY3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4OUEsIDB4OUEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OUEsIDB4QjksCisgICAgMHhBQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4NywgMHg3NywgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQiwgMHhBQiwgMHhDQSwKKyAgICAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDk5LCAweEFCLCAweEJCLCAweEJCLCAweEJCLCAweEFBLAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4QkMsIDB4Q0MsIDB4Q0IsIDB4QUEsIDB4OUEsCisgICAgMHg5OSwgMHg5QSwgMHg5QSwgMHhBQiwgMHhCQywgMHhDQywgMHhCQywgMHhDQSwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwKKyAgICAweDk5LCAweDlBLCAweEFBLCAweEFCLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhCQiwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweEJDLCAweEJBLCAweEFBLAorICAgIDB4OTksIDB4OTksIDB4ODksIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4QkEsIDB4QkEsIDB4QTksIDB4OTksIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4NywgMHg3NywKKyAgICAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEFBLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4OTksIDB4QUEsIDB4OUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NjcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHg5OSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwgMHhBOSwKKyAgICAweDk5LCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDk5LCAweDk5LCAweDk4LAorICAgIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OTksIDB4OTksIDB4ODgsIDB4NzcsCisgICAgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHg4NywgMHg3NywgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY3LCAweDc3LCAweDg5LCAweDk5LCAweDk5LCAweDk4LCAweDc3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4OTksIDB4OTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg3OCwgMHg4OSwgMHhBOSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg2NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweDlBLCAweDlBLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDk5LCAweEE5LAorICAgIDB4QUIsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4QUEsIDB4QkEsCisgICAgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQSwgMHhCQiwgMHhCQSwgMHhBOSwKKyAgICAweDk5LCAweDk5LCAweDg5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweEJDLCAweENCLCAweEJCLCAweEFBLCAweEE5LAorICAgIDB4OTksIDB4OTksIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0IsIDB4QkMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksCisgICAgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUMsIDB4QkEsIDB4QUEsIDB4OUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0IsIDB4QUIsIDB4Q0MsCisgICAgMHhCQSwgMHhBQSwgMHhBOSwgMHg5OSwgMHhBOSwgMHhBQSwgMHhBQSwgMHhCQywgMHhDQywgMHhBQywgMHhCQSwgMHhBQSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJDLCAweEJCLCAweENCLCAweEE5LCAweDk5LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4QUEsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsCisgICAgMHg3OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEFBLCAweDlBLCAweDk5LCAweDg4LCAweDc3LCAweDc2LCAweDY3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4OTksIDB4OTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QTksCisgICAgMHg5OSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg4OCwgMHg4OSwgMHg5OSwgMHg5OCwKKyAgICAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweEE5LCAweDk5LCAweDk4LCAweDg3LAorICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4OTksIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NywgMHg3NywgMHg4OSwgMHg5OSwgMHg5QSwgMHg4OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweDk5LCAweEE5LCAweDg4LCAweDc3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4NzgsIDB4ODksIDB4QTksIDB4QUEsIDB4OTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NjcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHhBQSwgMHhCQSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHg5OSwgMHhBQSwKKyAgICAweEFCLCAweEFBLCAweDk4LCAweDg4LCAweDg3LCAweDc3LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEFBLCAweEJBLAorICAgIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4QkEsIDB4QTksCisgICAgMHhBOSwgMHg5OSwgMHg5OCwgMHg5OSwgMHg5OSwgMHhBQiwgMHhBQiwgMHhBQywgMHhDQywgMHhCQSwgMHhBQSwgMHhBOSwKKyAgICAweDk5LCAweDlBLCAweDlBLCAweEJCLCAweEJDLCAweENCLCAweEJDLCAweEJCLCAweEFBLCAweEE5LCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4OUEsIDB4QUEsIDB4QkIsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEJCLCAweEFBLCAweEFBLCAweEE5LCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERELCAweENCLCAweERDLAorICAgIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0QsIDB4REQsIDB4Q0MsIDB4QkIsIDB4QUEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQywgMHhDRCwgMHhEQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEJDLCAweENDLCAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QkEsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHg5QSwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweEFBLCAweEE5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLAorICAgIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QTksIDB4QTksCisgICAgMHg4OCwgMHg3NiwgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQSwgMHhBQSwgMHg5OCwgMHg4NywKKyAgICAweDY2LCAweDY1LCAweDU1LCAweDY2LCAweDY3LCAweDg4LCAweDlBLCAweEE5LCAweEE5LCAweDg4LCAweDc2LCAweDY2LAorICAgIDB4NTUsIDB4NTYsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUEsIDB4QUEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBQSwgMHhCOSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywKKyAgICAweDc4LCAweDk5LCAweEFBLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDc2LCAweDY2LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4OUEsIDB4QUEsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4OUEsIDB4QkEsCisgICAgMHhCQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhBQywgMHhDQiwKKyAgICAweEJBLCAweDk5LCAweDk4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJCLCAweERDLCAweENCLCAweEJBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4REQsIDB4Q0IsIDB4QkEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhEQiwgMHhCRCwgMHhDQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweDlBLCAweEFBLCAweEJCLCAweEJDLCAweDkwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRCwgMHhEQywgMHhERCwgMHhDQywgMHhDQywgMHhDRCwgMHhERSwgMHhFRCwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwKKyAgICAweEVFLCAweERELCAweERDLCAweENELCAweENELCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVELCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REMsIDB4QkIsIDB4QUEsCisgICAgMHhBOSwgMHhBQSwgMHhBQiwgMHhDRCwgMHhFRiwgMHhGRiwgMHhERCwgMHhDQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwKKyAgICAweDk5LCAweEFCLCAweENELCAweEVGLCAweEZELCAweERDLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4Q0UsIDB4RkUsIDB4REQsIDB4Q0EsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhERiwgMHhGRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg3NywgMHg5QSwgMHhCQywgMHhFRSwKKyAgICAweERDLCAweEJBLCAweDk3LCAweDc2LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweENELCAweEVELCAweENCLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REQsIDB4REMsIDB4QjksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhERCwgMHhDQiwgMHhBOCwgMHg3NiwgMHg1NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweERELCAweEJBLCAweDk4LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4REUsIDB4REMsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhGRCwgMHhEQiwgMHhBOSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg5OSwgMHhBQywKKyAgICAweENELCAweERGLCAweEZELCAweENCLCAweEE5LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweENELCAweEVGLAorICAgIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4RUYsIDB4REYsIDB4RkUsCisgICAgMHhFRCwgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDQywgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwKKyAgICAweERDLCAweEJDLCAweENCLCAweENDLCAweENELCAweERFLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZFLCAweEVFLAorICAgIDB4REQsIDB4REUsIDB4REUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RUUsIDB4RUQsIDB4REQsCisgICAgMHhFRSwgMHhERiwgMHhFRSwgMHhGRSwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0IsIDB4Q0MsIDB4Q0MsIDB4RUYsIDB4RkYsIDB4REYsIDB4Q0QsIDB4RkYsCisgICAgMHhDRCwgMHhDQywgMHhDQywgMHhDQywgMHhCRCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhEQywgMHhCQiwKKyAgICAweEJCLCAweEFCLCAweEJBLCAweEJDLCAweERDLCAweERGLCAweEZGLCAweEZELCAweERDLCAweENCLCAweEFBLCAweEE5LAorICAgIDB4OTksIDB4OUEsIDB4QkIsIDB4QkMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4REIsIDB4QTksIDB4OTksIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHhBQiwgMHhDQywgMHhERiwgMHhGQywgMHhEQywgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweENELCAweEZGLCAweEJDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0YsIDB4RkMsIDB4QkIsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NzcsIDB4ODksIDB4QUIsIDB4Q0YsCisgICAgMHhDQywgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhGQywgMHhCQiwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweENCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REMsIDB4Q0IsIDB4QTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhFQywgMHhCQSwgMHg4NywgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweEJELCAweENELCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QUIsIDB4Q0MsIDB4REQsIDB4REIsIDB4OTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhCQywgMHhDRiwgMHhGRCwgMHhCQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QiwgMHhDQywgMHhGQywKKyAgICAweEZGLCAweERELCAweEJBLCAweDlBLCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweEZELCAweERGLCAweEZELAorICAgIDB4RkQsIDB4Q0IsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0YsIDB4RkQsIDB4RkYsIDB4RkYsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDRCwgMHhERCwgMHhERiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRCwKKyAgICAweENDLCAweENDLCAweEZDLCAweENELCAweEZFLCAweEZFLCAweERGLCAweEZGLCAweEZELCAweERELCAweEZDLCAweERDLAorICAgIDB4REQsIDB4Q0MsIDB4Q0UsIDB4RkQsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENGLCAweERELCAweERDLCAweENDLCAweENDLCAweENELCAweERELCAweEVGLCAweEZGLCAweEZGLCAweEZELCAweEZFLAorICAgIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4REQsIDB4Q0IsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERiwgMHhGRiwgMHhGRCwgMHhFRCwgMHhDQiwgMHhBQSwgMHhBOSwKKyAgICAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweERGLCAweEZGLCAweERELCAweENCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QkQsIDB4RUYsIDB4RkMsIDB4REIsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5QSwgMHhCRCwgMHhGRiwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NywgMHg4OSwgMHhBQiwKKyAgICAweENELCAweEZDLCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU2LCAweDY3LCAweDg5LCAweEFCLCAweERGLAorICAgIDB4Q0MsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REMsIDB4Q0EsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhDQywgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU1LCAweDQ1LCAweDU2LCAweDY3LCAweDhBLCAweEJELCAweERDLCAweENBLCAweDk4LCAweDc2LCAweDU1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4NzksIDB4QUIsIDB4Q0QsIDB4REMsIDB4QjksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhERSwgMHhEQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFDLCAweENELCAweEZELCAweENCLCAweDk4LCAweDg3LCAweDc2LCAweDY3LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REYsIDB4RkQsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUEsIDB4QkMsIDB4REQsCisgICAgMHhGRiwgMHhGRCwgMHhCQSwgMHhBOSwgMHg5OSwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhERCwgMHhFRiwgMHhGRiwKKyAgICAweEVELCAweENCLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEVELAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REQsCisgICAgMHhDQywgMHhDQywgMHhERCwgMHhFRSwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhFRCwgMHhERCwKKyAgICAweERELCAweERELCAweEVELCAweEVFLCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBRSwgMHhDRCwgMHhDQywgMHhFQywgMHhDRCwgMHhDQywgMHhDRCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhERCwgMHhGRCwKKyAgICAweERDLCAweERDLCAweENELCAweENDLCAweERELCAweEVELCAweERGLCAweEZGLCAweEZGLCAweENGLCAweERGLCAweENDLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REYsIDB4RkYsIDB4RkQsIDB4RkQsIDB4Q0IsIDB4QkIsIDB4QUEsCisgICAgMHg5OSwgMHhBOSwgMHhBQiwgMHhDRCwgMHhGRiwgMHhGRiwgMHhERSwgMHhDQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweEFBLCAweENELCAweEZGLCAweEZELCAweERDLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QkQsIDB4RkQsIDB4Q0MsIDB4QkEsIDB4OTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODgsIDB4QUMsCisgICAgMHhDRiwgMHhFQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQywgMHhERCwKKyAgICAweERELCAweEJBLCAweDk3LCAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweERDLCAweENCLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTQsIDB4NTUsIDB4NjcsIDB4NzksIDB4QUIsIDB4REQsIDB4REMsIDB4QjksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3NywgMHg5QSwgMHhCQywgMHhERCwgMHhDQiwgMHg5OCwgMHg3NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweEJELCAweERDLCAweEI5LCAweDk3LCAweDY2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4Q0QsIDB4REIsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5OSwgMHhBQywgMHhEQywgMHhGRSwgMHhDQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQywKKyAgICAweENELCAweENELCAweEVELCAweEJBLCAweDk5LCAweDg4LCAweDc4LCAweDg4LCAweDk5LCAweEFCLCAweENELCAweERDLAorICAgIDB4RkYsIDB4RkMsIDB4QkEsIDB4QTksIDB4OTksIDB4ODksIDB4OTksIDB4QUIsIDB4QkMsIDB4REQsIDB4Q0YsIDB4RkYsCisgICAgMHhGRCwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhDQiwgMHhDRCwgMHhEQywgMHhGRiwgMHhGRiwgMHhERCwKKyAgICAweENDLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERELCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEVFLCAweERFLAorICAgIDB4REMsIDB4Q0QsIDB4REYsIDB4RUUsIDB4RkYsIDB4RkQsIDB4REYsIDB4RkYsIDB4RUUsIDB4REMsIDB4REQsIDB4Q0MsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhGRCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUUsIDB4RUQsIDB4REUsIDB4REQsIDB4REQsIDB4REUsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4RkUsCisgICAgMHhGRiwgMHhFRSwgMHhERCwgMHhERCwgMHhDRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhFRSwgMHhEQywKKyAgICAweENCLCAweENCLCAweEJCLCAweENDLCAweERFLCAweEVGLCAweEZGLCAweEZELCAweEZFLCAweERDLCAweENCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0QsIDB4RUYsIDB4RkYsIDB4REYsIDB4REMsIDB4QkIsIDB4QTksIDB4OTksIDB4OTksCisgICAgMHg5QSwgMHhBQiwgMHhERiwgMHhGRiwgMHhGRCwgMHhERCwgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweERFLCAweEZGLCAweERELCAweERCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDc3LCAweDg5LCAweEJDLAorICAgIDB4RkUsIDB4RkQsIDB4REIsIDB4QjksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NzcsIDB4OUEsIDB4QkQsIDB4RkYsCisgICAgMHhERCwgMHhDQSwgMHg5OCwgMHg2NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QiwgMHhDRSwgMHhGRCwgMHhFQiwKKyAgICAweEE5LCAweDc2LCAweDU1LCAweDQ0LCAweDQ1LCAweDY3LCAweDg5LCAweEJELCAweEZGLCAweERELCAweEJBLCAweDk3LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4RUQsIDB4REIsIDB4QTksIDB4NzYsIDB4NTUsCisgICAgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhCQywgMHhGRCwgMHhFRCwgMHhDQiwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweEFCLCAweERGLCAweEZELCAweEVDLCAweEI5LCAweDg3LCAweDY2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4RUQsIDB4REYsIDB4RkMsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4OUEsIDB4QUMsCisgICAgMHhERSwgMHhFRiwgMHhGRiwgMHhDQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5QSwgMHhCQiwgMHhDRSwgMHhGRSwKKyAgICAweEZGLCAweEZFLCAweENCLCAweEJBLCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENELCAweEVGLCAweEVGLCAweEZGLAorICAgIDB4RUQsIDB4REMsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsCisgICAgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwKKyAgICAweERFLCAweERFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweERELCAweEVELCAweENELAorICAgIDB4REQsIDB4Q0MsIDB4REQsIDB4REUsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweEJCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweERFLCAweEFDLCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REQsIDB4RkUsIDB4Q0MsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhEQiwgMHhDQiwgMHhBQSwgMHhBOSwgMHg5OSwKKyAgICAweDg4LCAweDg5LCAweDk5LCAweEFCLCAweEJDLCAweEVELCAweEJCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0MsIDB4Q0IsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg5OSwgMHhBQiwgMHhDQywgMHhBQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg5OSwKKyAgICAweEJDLCAweEJBLCAweEFBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDg4LCAweDlBLCAweEJCLAorICAgIDB4QUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QkEsIDB4QTksCisgICAgMHg4OCwgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwgMHhBQSwgMHg5OCwgMHg4NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDc3LCAweDg5LCAweEFCLCAweEJBLCAweEE5LCAweDg4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkIsIDB4QkIsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjUsIDB4NTYsCisgICAgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCQiwgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweDlBLCAweEJCLCAweEJCLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDY3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkIsIDB4QkMsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0IsCisgICAgMHhDQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhCRCwgMHhEQywKKyAgICAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweENDLCAweEVFLCAweERDLCAweENCLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4Q0QsIDB4RkQsIDB4REMsIDB4Q0IsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhFQywgMHhCRCwgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweENCLCAweENDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg4QSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OCwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhBQSwgMHhCQiwKKyAgICAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEJCLCAweENELCAweERDLCAweEFCLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4OTksIDB4ODgsIDB4OTksIDB4OUEsIDB4QUEsIDB4QkMsIDB4QzksIDB4QUEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywKKyAgICAweDc4LCAweDg4LCAweDk5LCAweEFCLCAweEI5LCAweEE5LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QUEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQSwgMHhBOSwgMHg5OSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg4OSwgMHhBOSwKKyAgICAweDk5LCAweDk4LCAweDg3LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweDk5LCAweDk5LAorICAgIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4OTksIDB4ODksIDB4ODgsIDB4NzcsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg5QSwgMHg5OSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LCAweDk5LCAweDk5LCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4OTksIDB4QTksIDB4ODgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg3OCwgMHg4OSwgMHhBOSwgMHg5QSwgMHg5OSwgMHg4NywgMHg3NywgMHg3NywgMHg2NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweDlBLCAweDlBLCAweEFBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweDlBLCAweEJBLAorICAgIDB4QUIsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4OTksIDB4QUIsIDB4QUIsIDB4QkIsCisgICAgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQSwgMHhCQywgMHhCQiwgMHhBQSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEFCLCAweEFELCAweERELCAweEJCLCAweEFBLCAweEE5LAorICAgIDB4QTksIDB4OUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4REIsIDB4QUMsIDB4Q0IsIDB4QUEsIDB4QTksIDB4OTksIDB4OTksCisgICAgMHg5OSwgMHg5QSwgMHhBQSwgMHhBQiwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QUEsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4QkEsIDB4Q0IsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhBOSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhEQywgMHhBQiwgMHhCQiwgMHhBQSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweENBLCAweEJBLCAweEE5LCAweDk5LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0IsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhCQSwgMHhBQSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEJCLCAweDlBLCAweDk5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QTksIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsCisgICAgMHg5QSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBOSwgMHg5OSwKKyAgICAweDg3LCAweDc2LCAweDY2LCAweDU1LCAweDY2LCAweDY2LCAweDc4LCAweDg5LCAweEFBLCAweDlBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QTksIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg1NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBQSwgMHhBQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NjcsIDB4NzcsIDB4ODgsIDB4ODksCisgICAgMHhBQiwgMHhBQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg4OSwgMHhBQSwgMHhCQSwKKyAgICAweEJCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweEFCLCAweENCLAorICAgIDB4QUEsIDB4OTksIDB4OTgsIDB4ODgsIDB4ODksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4Q0IsIDB4QkEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhBQiwgMHhCQywgMHhCRCwgMHhEQywgMHhDQiwgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERCLCAweEJDLCAweENCLCAweEJCLCAweEFBLCAweEFBLCAweDlBLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFCLCAweEJBLCAweEFBLCAweEE5LCAweDk5LCAweDlBLCAweEFBLCAweEFBLCAweEJDLCAweEJELCAweEJCLCAweENDLAorICAgIDB4QkIsIDB4QkEsIDB4QUEsIDB4QTksIDB4QTksIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REQsIDB4QkMsIDB4QkEsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCRCwgMHhDQiwgMHhCQiwgMHhBOSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENDLCAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4QkEsIDB4QUEsIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHg5QSwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4NywgMHg3NywgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLAorICAgIDB4OUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QUEsIDB4OTksCisgICAgMHg4NywgMHg3NiwgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQSwgMHg5OSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDY1LCAweDU2LCAweDY2LCAweDY3LCAweDg4LCAweDlBLCAweEE5LCAweEE5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NjUsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsIDB4OUEsIDB4OTgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg4LCAweDlBLCAweEFBLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDc2LCAweDY3LCAweDc3LCAweDc4LCAweDk5LAorICAgIDB4QUIsIDB4QUIsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsCisgICAgMHhCQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDQywKKyAgICAweEFBLCAweDk5LCAweDk4LCAweDg4LCAweDg5LCAweDk5LCAweDlBLCAweEJCLCAweENCLCAweENELCAweENCLCAweEFBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4Q0MsIDB4QkQsIDB4REMsIDB4Q0IsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhDQywgMHhEQiwgMHhBRCwgMHhDQiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQywgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhERSwgMHhCQywgMHhEQywKKyAgICAweENCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweEZELCAweEJDLCAweENCLCAweEJBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0UsIDB4REIsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTgsCisgICAgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQiwgMHhCQywgMHhERCwgMHhCQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDk5LCAweEFCLCAweEJDLCAweENCLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4ODksIDB4QUIsIDB4Q0MsIDB4QUIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4OUEsCisgICAgMHhBQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQiwKKyAgICAweEFBLCAweDk5LCAweDg3LCAweDY2LCAweDY1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweEJBLCAweEE5LAorICAgIDB4ODgsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NjcsIDB4NzgsIDB4OTksIDB4QkIsIDB4QUEsIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEJCLCAweEFBLCAweDk5LCAweDg3LCAweDc2LCAweDY1LCAweDU2LAorICAgIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QkIsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHg5QSwgMHhCQiwgMHhCQiwgMHhBQSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NywgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEFCLCAweEJCLCAweENCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDg4LCAweDk5LCAweEFCLCAweEJCLAorICAgIDB4Q0MsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkMsIDB4QkMsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhEQywgMHhERCwgMHhEQywgMHhCQiwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweENFLCAweEZELCAweERDLCAweENCLCAweEJCLAorICAgIDB4QUIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4REMsIDB4QkQsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QUEsCisgICAgMHhBQiwgMHhCQiwgMHhCQywgMHhDQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkUsIDB4RUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkYsCisgICAgMHhFRCwgMHhERCwgMHhDRCwgMHhERCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhFRCwgMHhEQywKKyAgICAweENDLCAweEJDLCAweEJDLCAweERELCAweERFLCAweEZGLCAweEZGLCAweEZELCAweERELCAweERDLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RkYsIDB4RkYsIDB4REUsIDB4REMsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksCisgICAgMHg5QSwgMHhCQywgMHhERSwgMHhGRiwgMHhGRCwgMHhEQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5QSwKKyAgICAweEJDLCAweERGLCAweEZGLCAweERELCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY3LCAweDc4LCAweDlBLCAweEJELAorICAgIDB4RkYsIDB4RkQsIDB4REMsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4RkUsCisgICAgMHhERCwgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NCwgMHg0NSwgMHg1NiwgMHg4OSwgMHhBQiwgMHhFRSwgMHhGRCwgMHhEQiwKKyAgICAweEE5LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDlBLCAweEJELCAweEVFLCAweERELCAweEJBLCAweDk4LAorICAgIDB4NjUsIDB4NDQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4QUIsIDB4REUsIDB4RUQsIDB4RUMsIDB4QTksIDB4ODcsIDB4NTUsCisgICAgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCQywgMHhFRCwgMHhFRCwgMHhDQiwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweENFLCAweEVFLCAweEZELCAweEJBLCAweDk4LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QkQsIDB4RUUsIDB4RkYsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkMsCisgICAgMHhERSwgMHhFRiwgMHhGRSwgMHhEQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDRCwgMHhGRSwKKyAgICAweEVGLCAweEZFLCAweERDLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENELCAweERGLCAweEVGLCAweEZGLAorICAgIDB4RkUsIDB4REMsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhFRCwgMHhERCwgMHhDQywgMHhDRCwgMHhERCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweERFLCAweEVELCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEJFLCAweEZGLCAweEZGLCAweEVFLCAweEVFLCAweERFLAorICAgIDB4RUQsIDB4REQsIDB4RUUsIDB4RkUsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweERDLCAweENDLCAweENDLCAweENDLCAweENDLCAweERELCAweERGLCAweEZFLCAweEZGLCAweEJDLCAweEVELAorICAgIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4REMsIDB4Q0MsCisgICAgMHhCQiwgMHhBQiwgMHhBQiwgMHhCQywgMHhDRCwgMHhFRiwgMHhGRiwgMHhGQywgMHhEQywgMHhDQiwgMHhBQSwgMHhBOSwKKyAgICAweDk5LCAweDlBLCAweEFCLCAweENDLCAweEZGLCAweEZFLCAweENELCAweENCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LAorICAgIDB4OTksIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RkMsIDB4Q0IsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHhBQiwgMHhDRSwgMHhGRSwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweERFLCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU2LCAweDc3LCAweDhBLCAweEJDLCAweERFLAorICAgIDB4Q0MsIDB4QjksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4REMsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQywgMHhERCwgMHhDQywgMHhCOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweENELCAweERELCAweENCLCAweDk4LCAweDc2LCAweDU1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4Q0QsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhDQywgMHhDRCwgMHhEQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweERELCAweERELCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4REQsIDB4REUsIDB4RUQsIDB4QkIsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0MsIDB4REQsCisgICAgMHhGRiwgMHhFQywgMHhDQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQywgMHhERCwgMHhERiwgMHhGRiwKKyAgICAweEZFLCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweEVELCAweERELCAweEZGLCAweEZGLCAweEVFLAorICAgIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RUUsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUQsCisgICAgMHhEQywgMHhDRCwgMHhDRCwgMHhERCwgMHhERSwgMHhFRCwgMHhDRiwgMHhGRiwgMHhGRSwgMHhFRSwgMHhERCwgMHhERCwKKyAgICAweENELCAweENDLCAweERELCAweERELCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRCwgMHhERCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRiwgMHhERCwgMHhFRCwKKyAgICAweERDLCAweENDLCAweENCLCAweEJCLCAweENDLCAweENELCAweEVFLCAweEZGLCAweEZGLCAweERFLCAweERELCAweENCLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REYsIDB4RkYsIDB4RkQsIDB4REMsIDB4QkIsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHhBQiwgMHhCQywgMHhERSwgMHhGRiwgMHhDRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweEFBLCAweEJDLCAweEVGLCAweEZDLCAweENCLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4OUIsIDB4Q0QsIDB4RUUsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhFQywgMHhDQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQywgMHhERSwKKyAgICAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweENELCAweERDLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhEQywgMHhDQSwgMHg5OCwgMHg3NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENDLCAweENDLCAweEJBLCAweDg3LCAweDY2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5OSwgMHhBQiwgMHhERCwgMHhERCwgMHhDQSwgMHhBOSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHhBQiwKKyAgICAweENELCAweERFLCAweERDLCAweEJBLCAweEE5LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweEFBLCAweEJDLCAweERELAorICAgIDB4RUUsIDB4REMsIDB4QkIsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4REUsIDB4REYsIDB4RkYsCisgICAgMHhERCwgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhFRCwKKyAgICAweENDLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweERELCAweEVGLCAweERGLCAweEZGLCAweEZFLCAweEVELCAweERELAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RkUsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4REUsIDB4REQsIDB4REQsCisgICAgMHhDRCwgMHhERCwgMHhERSwgMHhFRSwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkUsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REYsIDB4RUUsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4REUsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERCwgMHhDQywgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweENELCAweERGLCAweEZGLCAweEZELCAweERDLCAweENCLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4QUEsIDB4QUIsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4QkIsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg5OSwgMHhBQiwgMHhDRiwgMHhGRiwgMHhGQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweENFLCAweEZGLCAweENELCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4REQsIDB4RkMsIDB4Q0IsIDB4OTgsIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NzcsIDB4OEEsIDB4QkQsIDB4RkYsCisgICAgMHhDQywgMHhCOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhFRCwgMHhDQiwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweERELCAweENDLCAweEI5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REQsIDB4Q0IsIDB4QTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhFRCwgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweEJELCAweENELCAweEZDLCAweEI5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4OTksIDB4QUIsIDB4RkQsIDB4RkYsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhERiwgMHhGRCwgMHhCQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHhBQiwgMHhDQywgMHhERCwKKyAgICAweEZGLCAweERFLCAweENDLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweERELCAweENGLCAweEZGLAorICAgIDB4REQsIDB4Q0IsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4RUQsIDB4RkYsIDB4RkYsIDB4REQsCisgICAgMHhERCwgMHhDQywgMHhCQiwgMHhDQywgMHhDQywgMHhDRCwgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRCwKKyAgICAweERDLCAweENELCAweEVELCAweERFLCAweERGLCAweEVFLCAweEJGLCAweEZGLCAweEZGLCAweEZFLCAweEVELCAweERDLAorICAgIDB4REQsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJELCAweERELCAweERDLCAweENDLCAweERDLCAweENELCAweERELCAweERFLCAweEZGLCAweEVGLCAweEJFLCAweEVFLAorICAgIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REUsIDB4REQsIDB4Q0IsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERSwgMHhFRiwgMHhGRiwgMHhGRCwgMHhERCwgMHhDQiwgMHhCQSwgMHhBQSwKKyAgICAweEFBLCAweEFCLCAweEJDLCAweENFLCAweEZGLCAweEZFLCAweENELCAweERCLCAweEJBLCAweDk5LCAweDk4LCAweDk5LAorICAgIDB4OUEsIDB4QUMsIDB4REQsIDB4RkYsIDB4RkQsIDB4REMsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzcsIDB4NzgsIDB4OTksCisgICAgMHhCQywgMHhERSwgMHhFRSwgMHhEQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweERGLCAweEZDLCAweERCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJELCAweEZFLAorICAgIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NjYsIDB4NTUsIDB4NDUsIDB4NTYsIDB4NzgsIDB4QUIsIDB4Q0UsIDB4REQsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCQywgMHhERSwgMHhERCwgMHhCQSwgMHg4NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweDlCLCAweENELCAweERELCAweERCLCAweEE5LCAweDg2LCAweDU1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QkMsIDB4REUsIDB4REQsIDB4Q0IsIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhERSwgMHhGQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweERELCAweEZGLCAweERDLCAweEFBLCAweDk4LCAweDc3LCAweDc3LCAweDg4LCAweDk5LCAweEFCLAorICAgIDB4Q0QsIDB4REUsIDB4RkUsIDB4REIsIDB4QkEsIDB4OTgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4REUsCisgICAgMHhFRiwgMHhFRSwgMHhDQywgMHhCQSwgMHhBOSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhFRCwgMHhFRiwgMHhGRiwKKyAgICAweEZELCAweERDLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweENELCAweERFLCAweEVGLCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4REQsIDB4Q0QsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REUsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUQsCisgICAgMHhERCwgMHhERCwgMHhERCwgMHhFRSwgMHhGRiwgMHhGRSwgMHhCRiwgMHhFRSwgMHhFRSwgMHhGRSwgMHhFRCwgMHhERCwKKyAgICAweERELCAweERELCAweERFLCAweEVFLCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QywgMHhDQiwgMHhCQiwgMHhCQSwgMHhCQSwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhERSwgMHhBQywgMHhERCwKKyAgICAweENDLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweEVGLCAweEZFLCAweENELCAweENCLCAweEJCLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4RUYsIDB4REIsIDB4Q0IsIDB4QkEsIDB4QTksIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDRCwgMHhFRCwgMHhCQywgMHhCQSwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEJCLCAweENELCAweERCLCAweEJBLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QkMsIDB4REMsIDB4QkIsIDB4QTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsCisgICAgMHhCQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhDQywKKyAgICAweEJCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweEJCLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NTQsIDB4NTUsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkIsIDB4QkIsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhCQiwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg4LCAweEFBLCAweEJCLCAweEJCLCAweEE5LCAweDg3LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4QkIsIDB4QkEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQiwgMHhDQiwgMHhDQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweEJDLCAweENCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEJCLCAweENDLAorICAgIDB4Q0QsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTgsIDB4ODksIDB4OTksIDB4OUEsIDB4QkIsIDB4Q0QsIDB4Q0MsIDB4REQsCisgICAgMHhDQiwgMHhCQSwgMHhBQSwgMHhBOSwgMHg5QSwgMHhBQSwgMHhCQywgMHhDQywgMHhEQywgMHhERSwgMHhFRCwgMHhDQywKKyAgICAweEJCLCAweEJBLCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweENELCAweENELCAweEZFLCAweEVELCAweERDLCAweENDLAorICAgIDB4QkIsIDB4Q0IsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUMsIDB4QUQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4QkIsIDB4QkIsCisgICAgMHhCQiwgMHhDQiwgMHhDQywgMHhDQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QkEsIDB4QUEsIDB4QTksIDB4QTksIDB4OUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4QUIsIDB4REMsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhFRCwgMHhCQiwgMHhCQiwgMHhBQSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENELCAweENBLCAweEJCLCAweEE5LCAweDk5LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QkIsIDB4REMsIDB4QUIsIDB4QUEsIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhCQSwgMHhBQSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweEFCLCAweEJCLCAweEFBLCAweDk5LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkIsCisgICAgMHg5QSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NSwgMHg1NiwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHhBOSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLCAweEFBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QUEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg1NSwgMHg2NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEFBLCAweEE5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhCQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQiwKKyAgICAweEJDLCAweEJBLCAweDk5LCAweDk4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweEJDLCAweENCLAorICAgIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0IsIDB4Q0QsIDB4Q0IsIDB4QkIsCisgICAgMHhBQSwgMHhBOSwgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhDRCwgMHhFQywgMHhEQywgMHhCQiwgMHhCQiwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweENELCAweERDLCAweEFELCAweENDLCAweENCLCAweEJBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFCLCAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENDLCAweEFCLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4QTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REMsIDB4QkMsIDB4QkEsIDB4QTksCisgICAgMHg5OSwgMHg5OSwgMHg4OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhDQSwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENCLCAweEFBLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc3LAorICAgIDB4NzgsIDB4ODksIDB4OUEsIDB4QkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHg5QSwgMHhCQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NywgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweEE5LCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLAorICAgIDB4OTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QTksIDB4OTksCisgICAgMHg4NywgMHg3NiwgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg4OSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywKKyAgICAweDY2LCAweDY1LCAweDU2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEE5LCAweDk5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QUEsIDB4OUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg4LCAweDk5LCAweEFBLCAweEFBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4QUEsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4ODksIDB4QUEsIDB4QkEsCisgICAgMHhCQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhCQiwgMHhCQiwgMHhDQiwKKyAgICAweEFBLCAweDk5LCAweDk4LCAweDg4LCAweDg5LCAweDk5LCAweEFBLCAweEFCLCAweENCLCAweEJDLCAweENCLCAweEJBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0QsIDB4QkMsIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhEQywgMHhBQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweENDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhCQSwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDQywgMHhBQiwgMHhDQywKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweEFCLCAweEJBLCAweEFBLAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4Q0QsIDB4Q0EsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweDlBLCAweEJDLCAweEJBLCAweEJBLCAweDk4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4OUEsIDB4QkIsIDB4OUEsIDB4OTksIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhBQSwKKyAgICAweDlBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEE5LCAweEE5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4OTksIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDY2LCAweDY3LCAweDc4LCAweDg5LCAweEFBLCAweDlBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjcsIDB4NzcsIDB4ODksIDB4QUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhBQSwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDg5LCAweEFBLCAweEJBLAorICAgIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QUMsIDB4QkIsIDB4Q0IsCisgICAgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhCRCwgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEFCLCAweENELCAweENELCAweERDLCAweENCLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REMsIDB4QUMsIDB4Q0MsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhBQiwgMHhDQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4OUIsIDB4Q0MsCisgICAgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhERCwgMHhFRCwgMHhCQywgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweENCLCAweENCLCAweEFBLCAweDk5LCAweDk5LAorICAgIDB4ODksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REMsIDB4QkIsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg5QSwgMHhBQiwgMHhDRCwgMHhDQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEJCLCAweENDLCAweEFCLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkMsIDB4QkEsIDB4QUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QkIsCisgICAgMHhBQSwgMHg5OSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhBQiwgMHhCQSwgMHhBOSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDU1LCAweDU1LCAweDY3LCAweDg4LCAweDlBLCAweEJCLCAweEFBLCAweDk5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkEsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQiwgMHhBQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY2LCAweDc4LCAweDk5LCAweEFCLCAweEJCLCAweEJBLCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QUEsIDB4QkIsIDB4QkMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksIDB4OUEsCisgICAgMHhBQiwgMHhCQiwgMHhDQiwgMHhBQSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQiwKKyAgICAweENDLCAweENCLCAweEFBLCAweDk5LCAweDk4LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweEJDLCAweERDLAorICAgIDB4Q0IsIDB4QUEsIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4REMsIDB4Q0UsIDB4REMsIDB4Q0IsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhDRCwgMHhFRCwgMHhERCwgMHhDQywgMHhDQiwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweENDLCAweENELCAweEVDLCAweEFELCAweENDLCAweENDLCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweEZFLCAweEVELCAweERELCAweERELCAweERELCAweERELCAweERFLCAweEVFLCAweEVFLCAweEJGLCAweEZGLAorICAgIDB4RkUsIDB4RkQsIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkUsIDB4RUQsCisgICAgMHhDQywgMHhDQiwgMHhDQywgMHhDQywgMHhERSwgMHhFRiwgMHhGRiwgMHhFRSwgMHhGRiwgMHhFQywgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweEFCLCAweEJDLCAweERELCAweEZGLCAweEZFLCAweEVGLCAweEVELCAweENCLCAweEFBLCAweDk5LCAweDk5LAorICAgIDB4QUEsIDB4QkMsIDB4REUsIDB4RkYsIDB4RUUsIDB4RkQsIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsCisgICAgMHhCQywgMHhERSwgMHhGRiwgMHhERSwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg3NywgMHg3OCwgMHg5QSwgMHhCRCwKKyAgICAweEVGLCAweEVELCAweEVDLCAweEI5LCAweDg3LCAweDY2LCAweDU1LCAweDY2LCAweDc5LCAweEFCLCAweENFLCAweEZFLAorICAgIDB4REQsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REUsIDB4RUQsIDB4REIsCisgICAgMHhBOSwgMHg4NiwgMHg1NCwgMHg0MywgMHg0NSwgMHg2OCwgMHg5QSwgMHhDRCwgMHhFRSwgMHhERCwgMHhCQSwgMHg5OCwKKyAgICAweDc1LCAweDQzLCAweDM0LCAweDU2LCAweDc5LCAweEFCLCAweERFLCAweEVELCAweERDLCAweEI5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4RUUsIDB4REQsIDB4Q0IsIDB4QTksIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhCQywgMHhERiwgMHhFRCwgMHhFRCwgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweENELCAweEZFLCAweERFLCAweEVDLCAweEJBLCAweDk5LCAweDg4LCAweDc4LCAweDg5LCAweEFCLCAweEJELAorICAgIDB4RUYsIDB4RUQsIDB4RkUsIDB4REMsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4QUIsIDB4QkMsIDB4REYsIDB4RkUsCisgICAgMHhFRiwgMHhGRSwgMHhEQywgMHhCQiwgMHhCQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhERSwgMHhFRiwgMHhGRCwgMHhGRSwKKyAgICAweEVFLCAweERELCAweENDLCAweENDLCAweENDLCAweERELCAweERFLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEVFLAorICAgIDB4RUUsIDB4REQsIDB4REQsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUUsCisgICAgMHhGRSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhERCwgMHhERSwKKyAgICAweEVGLCAweEZFLCAweEVFLCAweEZGLCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRSwgMHhEQywgMHhEQywgMHhDQywgMHhDQiwgMHhDQiwgMHhDQywgMHhDQywgMHhERCwgMHhDRCwgMHhBRCwgMHhFRCwKKyAgICAweERELCAweENDLCAweENDLCAweENDLCAweEJDLCAweENELCAweENFLCAweEVGLCAweEZFLCAweEVFLCAweERDLCAweENCLAorICAgIDB4QkIsIDB4QkEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REUsIDB4REYsIDB4REMsIDB4REMsIDB4Q0IsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhERSwgMHhGRCwgMHhDRCwgMHhDQiwgMHhBOSwgMHg5OSwgMHg4OCwgMHg4OCwKKyAgICAweDk5LCAweEFBLCAweEJDLCAweEVGLCAweERDLCAweERCLCAweEFBLCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhERSwgMHhEQywgMHhDQiwgMHg5OCwgMHg3NywgMHg2NSwgMHg1NSwgMHg1NiwgMHg3NywgMHg4OSwgMHhCQywgMHhERCwKKyAgICAweENDLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlCLCAweEJDLCAweERCLCAweENBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhEQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweERELCAweENDLCAweEJBLCAweDg4LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhEQywgMHhDRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHhBQywKKyAgICAweENFLCAweERDLCAweERELCAweENBLCAweEE5LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweENELCAweEVELAorICAgIDB4REQsIDB4REMsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTksIDB4OUEsIDB4QUMsIDB4Q0QsIDB4RUUsIDB4REQsIDB4RUYsCisgICAgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhFRCwgMHhGRCwgMHhFRSwgMHhFRSwgMHhERCwKKyAgICAweERDLCAweENCLCAweEJCLCAweEJDLCAweENELCAweERFLCAweEVGLCAweEVELCAweEZGLCAweEVELCAweEVELCAweERELAorICAgIDB4REMsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkUsIDB4QUQsIDB4RUQsIDB4REQsIDB4REQsIDB4Q0QsIDB4REMsCisgICAgMHhERCwgMHhERSwgMHhFRCwgMHhFRCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0QsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUYsIDB4Q0UsIDB4RkUsCisgICAgMHhERCwgMHhDQywgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERSwgMHhGRiwgMHhGRiwgMHhERSwgMHhEQywgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENFLCAweEZGLCAweEVELCAweERDLCAweEJCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4REUsIDB4RkUsIDB4REQsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg5QSwgMHhCQywgMHhERSwgMHhFQywgMHhDQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEJDLCAweERFLCAweENDLCAweEI5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDg4LCAweDlCLAorICAgIDB4Q0QsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUIsIDB4REQsCisgICAgMHhCQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhEQiwgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDU1LCAweDU1LCAweDY3LCAweDc4LCAweEFCLCAweENDLCAweENCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzcsIDB4OEEsIDB4QkMsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4ODksIDB4QUMsIDB4REQsIDB4REQsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhERCwgMHhEQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg4OCwgMHg4OSwgMHhBQiwgMHhCRCwgMHhERCwKKyAgICAweERFLCAweERDLCAweEJBLCAweDk5LCAweDk4LCAweDg5LCAweDk5LCAweEFCLCAweEJDLCAweERFLCAweEVELCAweEZELAorICAgIDB4REMsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4RkUsIDB4RUYsIDB4RUUsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRSwgMHhGRiwgMHhFRSwgMHhERCwgMHhEQywKKyAgICAweENDLCAweENDLCAweERELCAweEVFLCAweEVGLCAweEZGLCAweENGLCAweEVFLCAweEVELCAweERELCAweERELCAweENDLAorICAgIDB4Q0QsIDB4REQsIDB4REYsIDB4RUUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJELCAweENDLCAweENDLCAweEJCLCAweEJCLCAweEJDLCAweEJDLCAweENDLCAweENDLCAweERELCAweEFDLCAweERELAorICAgIDB4REQsIDB4Q0MsIDB4Q0MsIDB4QkMsIDB4QkMsIDB4Q0MsIDB4REQsIDB4REYsIDB4RkQsIDB4REUsIDB4RUMsIDB4Q0IsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhDRCwgMHhERSwgMHhDQywgMHhERCwgMHhDQiwgMHhBQSwgMHhBOSwKKyAgICAweDk5LCAweDlBLCAweEFCLCAweENDLCAweERELCAweEVELCAweENELCAweEJCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LAorICAgIDB4OTksIDB4QUEsIDB4QkMsIDB4REQsIDB4REIsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhDQywgMHhFRCwgMHhCQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweENELCAweENCLCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERDLAorICAgIDB4QkMsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4Q0EsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhCQiwgMHhCOSwgMHg4NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweENBLCAweEE4LCAweDc2LCAweDY1LAorICAgIDB4NDQsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTYsCisgICAgMHg2NywgMHg3OCwgMHg5QSwgMHhCRCwgMHhDQywgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweERDLCAweENELCAweEJCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDlBLCAweEFCLAorICAgIDB4Q0QsIDB4Q0MsIDB4REMsIDB4QkIsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0QsIDB4REMsCisgICAgMHhDRCwgMHhEQywgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhDRCwgMHhDQywgMHhFRCwKKyAgICAweERDLCAweENCLCAweEJCLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweERELCAweERFLCAweERELCAweERELAorICAgIDB4Q0MsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REYsIDB4REQsIDB4RkYsIDB4RUQsIDB4REQsIDB4REMsCisgICAgMHhDQywgMHhDRCwgMHhERCwgMHhFRSwgMHhFRSwgMHhGRCwgMHhBRCwgMHhEQywgMHhEQywgMHhDQywgMHhDQywgMHhCQywKKyAgICAweENDLCAweENDLCAweERDLCAweERFLCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBRSwgMHhFRCwgMHhERCwgMHhERCwgMHhERCwgMHhEQywgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHg5RSwgMHhGRiwKKyAgICAweEZGLCAweEVELCAweEVELCAweERELCAweEVFLCAweEVGLCAweEZFLCAweEZGLCAweEZELCAweERGLCAweEVFLCAweERELAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RUYsIDB4RkUsIDB4RkYsIDB4RUQsIDB4RkUsIDB4REQsIDB4Q0MsIDB4Q0IsCisgICAgMHhCQywgMHhDQywgMHhERSwgMHhFRSwgMHhFRSwgMHhGRSwgMHhERiwgMHhERCwgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQiwKKyAgICAweEJDLCAweERELCAweERGLCAweEVGLCAweEVELCAweEVELCAweERCLCAweEJBLCAweDk5LCAweDg4LCAweDk5LCAweEFCLAorICAgIDB4Q0QsIDB4RUYsIDB4RkQsIDB4REUsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NzcsIDB4ODksIDB4QUIsIDB4REQsCisgICAgMHhGRiwgMHhERCwgMHhFRCwgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NSwgMHg2NywgMHg4OSwgMHhCQywgMHhERCwgMHhGRSwKKyAgICAweERFLCAweENCLCAweEE5LCAweDc2LCAweDU0LCAweDQ1LCAweDY3LCAweDlBLCAweENELCAweEVGLCAweEVELCAweEVELAorICAgIDB4Q0EsIDB4ODcsIDB4NTQsIDB4MzMsIDB4NDUsIDB4NzgsIDB4QUIsIDB4Q0UsIDB4RUQsIDB4REUsIDB4REIsIDB4QTgsCisgICAgMHg3NSwgMHg0MywgMHgyNCwgMHg1NywgMHg4QSwgMHhCQywgMHhERSwgMHhFRCwgMHhFRCwgMHhDQSwgMHg5NywgMHg2NSwKKyAgICAweDQ0LCAweDQ2LCAweDc4LCAweEFDLCAweENELCAweEVELCAweERFLCAweERELCAweEJBLCAweDg3LCAweDY1LCAweDU2LAorICAgIDB4NjgsIDB4OUEsIDB4QkQsIDB4RUYsIDB4REQsIDB4RkUsIDB4REMsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzgsIDB4OEEsCisgICAgMHhCQywgMHhERSwgMHhFRSwgMHhFRiwgMHhGRCwgMHhEQiwgMHhBQSwgMHg5OCwgMHg4OCwgMHg5QSwgMHhBQiwgMHhDRCwKKyAgICAweEZGLCAweERELCAweEZFLCAweEVELCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENELCAweERGLCAweEZFLAorICAgIDB4REYsIDB4RkUsIDB4RUQsIDB4REMsIDB4Q0IsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REUsIDB4RkYsIDB4RUUsIDB4RkYsCisgICAgMHhGRiwgMHhGRSwgMHhERCwgMHhDRCwgMHhERCwgMHhERCwgMHhFRiwgMHhFRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRSwKKyAgICAweEZFLCAweEVFLCAweEVELCAweEVFLCAweEVFLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLAorICAgIDB4RkUsIDB4RUYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QUQsIDB4REQsIDB4REQsIDB4REQsIDB4RUQsIDB4REUsCisgICAgMHhERSwgMHhFRSwgMHhERCwgMHhFRSwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4REMsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4Q0QsIDB4QUQsIDB4RUQsCisgICAgMHhDQywgMHhCQiwgMHhBQSwgMHhCQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhERiwgMHhGRCwgMHhERCwgMHhDQywgMHhCQiwKKyAgICAweEFBLCAweEE5LCAweDlBLCAweEFBLCAweEJCLCAweENELCAweEVFLCAweERDLCAweERCLCAweEJBLCAweEE5LCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4REQsIDB4QkMsIDB4QkEsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhCQiwgMHhDRCwgMHhDQiwgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEJCLCAweENDLCAweEJCLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweDlBLAorICAgIDB4QkMsIDB4Q0IsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4Q0MsCisgICAgMHhCQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhBQywgMHhDQSwgMHhBOSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg4LCAweDlBLCAweEJCLCAweEFCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QkIsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg4OSwgMHg5QSwgMHhCQiwgMHhCQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDc4LCAweDlBLCAweEFDLCAweEJCLCAweEJBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4ODksIDB4QUIsIDB4Q0MsIDB4QkMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4OUEsCisgICAgMHhCQywgMHhDQywgMHhDQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhDQywKKyAgICAweENELCAweENCLCAweEFBLCAweDk5LCAweDk4LCAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweENELCAweENDLCAweERELAorICAgIDB4Q0IsIDB4QkEsIDB4QUEsIDB4OTksIDB4OUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REQsIDB4Q0UsIDB4REQsIDB4Q0MsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhFRSwgMHhERCwgMHhGRCwgMHhFRCwgMHhDQywgMHhDQywKKyAgICAweEJDLCAweEJDLCAweENDLCAweERELCAweEVFLCAweEZFLCAweDlELCAweERELCAweENDLCAweENDLCAweEJCLCAweEJCLAorICAgIDB4QkMsIDB4Q0MsIDB4REQsIDB4RUUsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEJBLCAweEFBLCAweEFBLCAweDk5LCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweDlCLCAweERDLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0MsIDB4REMsIDB4QkIsIDB4QkIsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhDQSwgMHhCQiwgMHhBOSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweERDLCAweEFCLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc4LAorICAgIDB4ODgsIDB4ODksIDB4QUEsIDB4QkMsIDB4QkEsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg5OSwgMHhBQiwgMHhCQiwgMHg5QSwgMHg5OSwgMHg4NywgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg5QSwKKyAgICAweEFCLCAweEJBLCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEJBLAorICAgIDB4OUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjUsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QUEsIDB4QTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDQ1LCAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweEE5LCAweEE5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweDlBLCAweEJBLCAweEFCLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QUIsIDB4QkIsIDB4QkEsIDB4QTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OTksIDB4QUIsIDB4QkIsCisgICAgMHhCQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQywgMHhCQiwgMHhDQywKKyAgICAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweENDLCAweENDLCAweENDLCAweEJCLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4Q0MsIDB4REQsIDB4REMsIDB4Q0IsIDB4QkIsCisgICAgMHhBQSwgMHhBQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHg5QywgMHhDQiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEJCLCAweEJCLCAweENDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhBQiwgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweENDLCAweEFCLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4ODgsIDB4ODksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkEsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywKKyAgICAweDc4LCAweDg5LCAweDlBLCAweEFCLCAweEI5LCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4OUEsIDB4QkEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksCisgICAgMHhBQSwgMHhBOSwgMHg5OSwgMHg4NywgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg5OSwgMHhBQSwKKyAgICAweDk5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEE5LCAweDk4LAorICAgIDB4ODcsIDB4NzYsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsCisgICAgMHg2NiwgMHg2NSwgMHg1NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBOSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LCAweEFBLCAweDk5LCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QTksIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhBQSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEFBLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDg5LCAweEFBLCAweEJBLAorICAgIDB4QUIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4QkIsIDB4QkIsCisgICAgMHhBQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhCQywgMHhDQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENDLCAweEJDLCAweERDLCAweENCLCAweEJBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REMsIDB4QUMsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4OUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4OUIsIDB4QkEsIDB4QTksIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkIsIDB4OUIsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhEQywgMHhCQywgMHhCQSwgMHhBQSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweEJBLCAweEJBLCAweEE5LCAweDk5LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0IsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzcsCisgICAgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhCQSwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEJBLCAweDlBLCAweDk4LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QTksIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QUEsCisgICAgMHg5QSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg1NiwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHg5OSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLCAweDk5LCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QTksIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg1NSwgMHg2NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY3LCAweDc4LCAweDg5LCAweEFBLCAweEE5LCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY3LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QUEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhCQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg4NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwKKyAgICAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweEJCLCAweENCLAorICAgIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0IsIDB4QkMsIDB4Q0IsIDB4QUEsCisgICAgMHhBQSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhCQiwgMHhDQywgMHhDQiwgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENDLCAweERDLCAweDlDLCAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFELCAweENDLCAweENDLCAweENDLCAweENCLCAweEJCLCAweEJDLCAweEJDLCAweENDLCAweERDLCAweDlELCAweEVELAorICAgIDB4RUQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RUQsIDB4REYsIDB4REQsIDB4Q0MsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDRCwgMHhERCwgMHhFRSwgMHhEQywgMHhERCwgMHhDQiwgMHhCQSwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweEVDLCAweENDLCAweENCLCAweEJBLCAweDk5LCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4Q0MsIDB4Q0MsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OUEsCisgICAgMHhBQiwgMHhDRCwgMHhEQywgMHhDQywgMHhCQSwgMHg5OSwgMHg4NywgMHg3NywgMHg3NywgMHg4OCwgMHg5QSwgMHhCQiwKKyAgICAweENELCAweENDLCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU2LCAweDY3LCAweDg4LCAweEFBLCAweEJDLCAweERDLAorICAgIDB4QkMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0IsIDB4Q0IsCisgICAgMHhBOSwgMHg4NywgMHg1NCwgMHgzMywgMHg0NSwgMHg3OCwgMHg5QSwgMHhCQywgMHhEQywgMHhCQywgMHhCQSwgMHg5OCwKKyAgICAweDc2LCAweDQzLCAweDM0LCAweDU2LCAweDg5LCAweEFCLCAweENELCAweENDLCAweENCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4QkEsIDB4OTksIDB4ODcsIDB4NjUsIDB4NTYsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhDQywgMHhDQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NiwgMHg3NywgMHg4OCwKKyAgICAweDlBLCAweEJDLCAweERDLCAweENELCAweENDLCAweEFBLCAweDk4LCAweDg4LCAweDg4LCAweDg4LCAweDlBLCAweEJCLAorICAgIDB4Q0QsIDB4REMsIDB4REMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4REMsCisgICAgMHhDRSwgMHhERCwgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhERSwgMHhERCwgMHhERCwKKyAgICAweERELCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERELCAweEVELCAweERGLCAweEVFLCAweERELAorICAgIDB4REMsIDB4Q0IsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4RUUsIDB4RUYsIDB4REQsIDB4RUUsIDB4RUUsIDB4RUQsIDB4REQsCisgICAgMHhDRCwgMHhDRCwgMHhERSwgMHhFRSwgMHhFRSwgMHhGRSwgMHg5RCwgMHhDRCwgMHhDRCwgMHhDQywgMHhDQywgMHhDQywKKyAgICAweENDLCAweERELCAweERELCAweERFLCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhFRSwgMHhERSwgMHhERSwgMHhFRiwgMHhFRSwgMHhFRSwgMHhBRiwgMHhGRiwKKyAgICAweEZGLCAweEZFLCAweEVFLCAweEVELCAweEVGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4REQsIDB4Q0QsIDB4Q0MsIDB4REUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RUUsIDB4REMsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhDRCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQiwgMHhCQSwgMHg5OSwgMHg5QSwKKyAgICAweEFCLCAweENELCAweEZFLCAweEZGLCAweEZGLCAweEZFLCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg5LCAweDlCLAorICAgIDB4Q0QsIDB4RUYsIDB4RkUsIDB4RkYsIDB4REMsIDB4QjksIDB4ODcsIDB4NzYsIDB4NzcsIDB4NzgsIDB4QUIsIDB4Q0QsCisgICAgMHhFRiwgMHhGRSwgMHhFRCwgMHhCQSwgMHg5NywgMHg2NiwgMHg1NSwgMHg2NywgMHg3OSwgMHhBQiwgMHhERSwgMHhGRiwKKyAgICAweEVGLCAweENCLCAweDk4LCAweDc2LCAweDU0LCAweDQ1LCAweDY3LCAweDg5LCAweEJDLCAweEVGLCAweEZFLCAweEVDLAorICAgIDB4QjksIDB4ODYsIDB4NTQsIDB4MzMsIDB4NDUsIDB4NjgsIDB4OUIsIDB4Q0UsIDB4RkYsIDB4RkUsIDB4Q0IsIDB4OTgsCisgICAgMHg3NSwgMHg0MywgMHgzNCwgMHg1NiwgMHg4OSwgMHhCQywgMHhFRiwgMHhGRSwgMHhFRCwgMHhCOSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU1LCAweDc4LCAweDlCLCAweENFLCAweEZGLCAweEZGLCAweERCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4OEEsIDB4QkQsIDB4RkYsIDB4RkYsIDB4RUQsIDB4Q0IsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NzcsIDB4ODksCisgICAgMHhBQywgMHhFRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhDQiwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OSwgMHhBQiwgMHhDRSwKKyAgICAweEVGLCAweEZFLCAweEZGLCAweERELCAweENCLCAweEE5LCAweDk5LCAweDlBLCAweEFCLCAweENELCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RUQsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhFRSwgMHhEQywgMHhDQywgMHhDQywgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwKKyAgICAweEVFLCAweEVFLCAweERFLCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUYsIDB4RkYsIDB4RkYsIDB4RUUsIDB4RkUsIDB4RUYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4REQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4REQsIDB4OUUsIDB4RUUsCisgICAgMHhERCwgMHhDQywgMHhDQywgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRSwgMHhFRiwgMHhERCwgMHhDQywKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweEZGLCAweERELCAweEVDLCAweENCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4RUQsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHhBQiwgMHhCQywgMHhERiwgMHhFQywgMHhEQiwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweENELCAweEVELCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0UsIDB4RUMsIDB4Q0EsIDB4OTgsIDB4NzcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4OEEsIDB4QkMsIDB4REQsCisgICAgMHhDQywgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhEQywgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweERELCAweEJCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REMsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NTUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQywgMHhERCwgMHhDQywgMHhCQSwgMHg4OCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlCLCAweENELCAweERDLCAweERCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4QkMsCisgICAgMHhERSwgMHhFRCwgMHhFRCwgMHhDQSwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhDRCwgMHhERCwKKyAgICAweERFLCAweERDLCAweENCLCAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweERFLCAweEZELCAweEZFLAorICAgIDB4REMsIDB4QkIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0MsIDB4REUsIDB4RkUsIDB4REYsIDB4RUUsIDB4REQsCisgICAgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhFRSwgMHhGRiwgMHhFRCwgMHhGRSwgMHhGRSwgMHhFRCwgMHhERCwKKyAgICAweENELCAweERELCAweERFLCAweEZFLCAweEZGLCAweEZGLCAweEFFLCAweEVFLCAweEVELCAweERELCAweERELCAweERELAorICAgIDB4REQsIDB4RUUsIDB4RkUsIDB4RUYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweERFLCAweERELCAweERDLCAweENDLCAweEJCLCAweEJCLCAweENDLCAweENELCAweERFLCAweEVFLCAweEJFLCAweEVFLAorICAgIDB4REQsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0QsIDB4REUsIDB4RUYsIDB4RkUsIDB4REUsIDB4REMsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERCwgMHhFRiwgMHhFRCwgMHhEQywgMHhDQiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweERFLCAweEVFLCAweERDLCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QkMsIDB4REUsIDB4RUMsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg4OSwgMHhBQiwKKyAgICAweENELCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDY3LCAweDg5LCAweEFCLCAweERELAorICAgIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REIsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU1LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDU1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4QTksIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDk5LCAweEFDLCAweERELCAweERDLCAweEJBLCAweDk5LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REQsIDB4REMsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0QsIDB4RUUsCisgICAgMHhERSwgMHhEQywgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQiwgMHhCQywgMHhERSwgMHhFRSwgMHhFRCwKKyAgICAweERDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweERFLCAweEZFLCAweERGLCAweEVFLCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REUsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RUUsIDB4RUQsIDB4REMsCisgICAgMHhDQywgMHhDQywgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhCRiwgMHhFRSwgMHhERCwgMHhERCwgMHhEQywgMHhERCwKKyAgICAweERELCAweERFLCAweEVGLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERiwgMHhFRSwgMHhERCwgMHhERCwgMHhDQywgMHhERCwgMHhDRCwgMHhERSwgMHhFRiwgMHhGRSwgMHhBRiwgMHhGRiwKKyAgICAweEZELCAweERDLCAweENDLCAweENDLCAweENDLCAweEVELCAweEVFLCAweEZGLCAweEZGLCAweEZGLCAweERELCAweENDLAorICAgIDB4QkIsIDB4QUEsIDB4QkIsIDB4QkIsIDB4Q0QsIDB4RUUsIDB4RkYsIDB4RkUsIDB4RUQsIDB4Q0IsIDB4QUEsIDB4QTksCisgICAgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhFRSwgMHhGRSwgMHhERCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDk5LCAweEFCLCAweENELCAweEVGLCAweEVELCAweERDLCAweEFBLCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4RkQsIDB4REQsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhDRiwgMHhFQywgMHhDQiwgMHhBOCwgMHg3NywgMHg2NSwgMHg1NSwgMHg1NiwgMHg3NywgMHg4QSwgMHhCQywgMHhERSwKKyAgICAweENDLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweENFLCAweERDLCAweENBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REQsIDB4Q0MsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhEQywgMHhDQSwgMHg5OCwgMHg3NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweERELCAweERDLCAweEJBLCAweDg3LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUIsIDB4Q0QsIDB4REQsIDB4REMsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhERSwgMHhERSwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg5OSwgMHhCQiwKKyAgICAweENELCAweEVELCAweEVELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweENELCAweEVFLAorICAgIDB4RUUsIDB4RUQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RUQsIDB4RkYsCisgICAgMHhERCwgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhCQywgMHhDRCwgMHhERSwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRCwKKyAgICAweERDLCAweENCLCAweEJDLCAweENDLCAweERELCAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEVFLCAweERELAorICAgIDB4REQsIDB4REQsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUUsIDB4RUUsIDB4RUQsIDB4RUQsIDB4REQsIDB4REQsCisgICAgMHhERSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REYsIDB4RkYsIDB4RkYsIDB4RUUsIDB4RkUsIDB4REUsIDB4RUUsIDB4RkYsIDB4REUsIDB4RkYsIDB4OUYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhERCwgMHhERSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwKKyAgICAweERDLCAweENDLCAweENDLCAweERELCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVDLCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QTksIDB4OTksIDB4OTksCisgICAgMHg5QSwgMHhCQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEJELCAweEZGLCAweEZGLCAweEVGLCAweERCLCAweEE5LCAweDg3LCAweDY2LCAweDY2LCAweDc4LCAweDlBLCAweENELAorICAgIDB4RkYsIDB4RkYsIDB4RkMsIDB4QjksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUIsIDB4Q0UsIDB4RkYsCisgICAgMHhFRSwgMHhDQSwgMHg5OCwgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg4OSwgMHhBQywgMHhERiwgMHhGRSwgMHhEQywKKyAgICAweEE5LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDlBLCAweENELCAweEZGLCAweEVELCAweENBLCAweDk3LAorICAgIDB4NjUsIDB4NDQsIDB4NDQsIDB4NTYsIDB4NzksIDB4QUMsIDB4REYsIDB4RkUsIDB4REMsIDB4QTksIDB4ODYsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg2NywgMHg5QSwgMHhDRCwgMHhGRiwgMHhFRSwgMHhDQiwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFDLCAweEZGLCAweEZGLCAweEZELCAweENBLCAweDk4LCAweDc2LCAweDY2LCAweDY3LCAweDg4LAorICAgIDB4QUIsIDB4Q0UsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODksIDB4OUIsIDB4Q0QsCisgICAgMHhGRiwgMHhGRSwgMHhGRiwgMHhEQywgMHhCQSwgMHg5OSwgMHg5OCwgMHg5OSwgMHhBQiwgMHhDRCwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEVELCAweENCLCAweEJBLCAweEFBLCAweEFCLCAweENELCAweEVGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRSwgMHhFRCwgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFGLCAweEZGLCAweEZGLCAweEVFLCAweERFLCAweEZFLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJFLCAweEVFLCAweERELCAweERELCAweENDLCAweENDLCAweERELCAweERELCAweERELCAweEVELCAweDlGLCAweEZGLAorICAgIDB4RkUsIDB4REQsIDB4REQsIDB4Q0QsIDB4REQsIDB4RUYsIDB4RUUsIDB4RkYsIDB4RkUsIDB4RUYsIDB4RUQsIDB4REMsCisgICAgMHhDQywgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHhFRSwgMHhGRiwgMHhFRSwgMHhFRSwgMHhEQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFCLCAweEJDLCAweERELCAweEVGLCAweEZFLCAweERELCAweENDLCAweENBLCAweEE5LCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4QkMsIDB4Q0QsIDB4RUYsIDB4REUsIDB4REMsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OUEsCisgICAgMHhCQywgMHhERSwgMHhGRSwgMHhERSwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweERFLCAweEVELCAweERDLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweEVFLAorICAgIDB4REQsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REYsIDB4RUQsIDB4REIsCisgICAgMHhBOSwgMHg4NywgMHg1NCwgMHgzMywgMHg0NSwgMHg3OCwgMHg5QSwgMHhDQywgMHhGRCwgMHhEQywgMHhDQSwgMHg5OCwKKyAgICAweDc1LCAweDQzLCAweDM0LCAweDU2LCAweDg5LCAweEFCLCAweENFLCAweERELCAweERDLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4RUUsIDB4REQsIDB4Q0EsIDB4QTksIDB4NzcsIDB4NjUsIDB4NTYsCisgICAgMHg2NywgMHg4OSwgMHhBQywgMHhERSwgMHhFRCwgMHhFRCwgMHhDQSwgMHg5OCwgMHg3NywgMHg3NiwgMHg3NywgMHg4OSwKKyAgICAweEFCLCAweENELCAweEZFLCAweEVFLCAweERDLCAweEJBLCAweDk4LCAweDg4LCAweDc4LCAweDg5LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4RUQsIDB4RkUsIDB4Q0MsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4REUsIDB4RUUsCisgICAgMHhFRiwgMHhGRCwgMHhEQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhGRiwgMHhFRSwgMHhGRiwKKyAgICAweEVELCAweERDLCAweENDLCAweEJCLCAweEJCLCAweENELCAweERELCAweEVGLCAweEZGLCAweEVGLCAweEZGLCAweEZFLAorICAgIDB4RUQsIDB4REQsIDB4REMsIDB4REQsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5RSwgMHhERSwgMHhERCwgMHhERSwgMHhERCwgMHhDRCwKKyAgICAweERELCAweEZFLCAweEVGLCAweEZGLCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQiwgMHhCQSwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDQywgMHg4QiwgMHhDQiwKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweERDLCAweEJDLCAweEJCLCAweEFBLAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0QsIDB4Q0EsIDB4QkIsIDB4QTksIDB4OTksIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhBQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweEFBLCAweEJDLCAweEJBLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4QUIsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4OTksCisgICAgMHhBQiwgMHhCOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhCQSwKKyAgICAweDlBLCAweDk4LCAweDc3LCAweDY2LCAweDY1LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLCAweEE5LCAweEE5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4OUEsIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwgMHhBOSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEJBLCAweDlBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QUEsIDB4QTksIDB4OTgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEFBLCAweEJBLCAweEE5LCAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDk5LCAweEFBLCAweEJCLAorICAgIDB4QkMsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4QkIsIDB4Q0IsCisgICAgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQywgMHhDQiwgMHhCRCwgMHhDQiwgMHhCQiwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweENDLCAweERELCAweENDLCAweEJCLCAweEJBLAorICAgIDB4QUEsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REMsIDB4OUMsIDB4Q0MsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhCQiwgMHhCQiwgMHhDQywgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUIsIDB4QUEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4QUIsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhEQywgMHhCQiwgMHhCQSwgMHhBOSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweENBLCAweEJBLCAweEE5LCAweDk4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0IsIDB4QUEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsCisgICAgMHg3OCwgMHg4OSwgMHg5QSwgMHhCQiwgMHhCOSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDg5LCAweDlBLCAweEJCLCAweDlBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDY3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QTksIDB4OTksIDB4ODcsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsCisgICAgMHg5OSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHg5OSwKKyAgICAweDg3LCAweDc2LCAweDY2LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDg5LCAweEFBLCAweDk5LCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NjUsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QTksIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEE5LCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QUEsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhBQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQSwKKyAgICAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweEJCLCAweENCLAorICAgIDB4QUEsIDB4OTksIDB4OTksIDB4ODgsIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0IsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhCQywgMHhEQywgMHhDQiwgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENELCAweERDLCAweDlDLCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweEJCLCAweEFBLCAweEFBLCAweDk5LCAweDk5LCAweEFBLCAweEFBLCAweEJDLCAweENDLCAweDlDLCAweENDLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4REQsIDB4RUQsIDB4QkMsIDB4QkEsIDB4QUEsCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhDQiwgMHhCQiwgMHhBOSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweENCLCAweEFCLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4QUEsIDB4QkMsIDB4QkEsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg5OSwgMHhBQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg5OSwKKyAgICAweEFCLCAweEJBLCAweEE5LCAweDg4LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEJBLAorICAgIDB4OUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsIDB4QTksIDB4OTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQSwgMHg5OSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEFBLCAweEE5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg4LCAweDlBLCAweEJCLCAweEFCLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QUIsIDB4QkIsIDB4QkEsIDB4QTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0IsCisgICAgMHhCQywgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhCQiwgMHhDQiwKKyAgICAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFCLCAweEJDLCAweENDLCAweENELCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4Q0MsIDB4RUQsIDB4Q0MsIDB4QkIsIDB4QkIsCisgICAgMHhCQiwgMHhBQiwgMHhCQiwgMHhCQywgMHhEQywgMHhERCwgMHg5QywgMHhDQiwgMHhCQiwgMHhCQiwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEJCLCAweEJDLCAweENELCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCQywgMHhEQywgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhERSwgMHg5RCwgMHhFRCwKKyAgICAweENDLCAweEJCLCAweEJBLCAweEFCLCAweEJCLCAweEJDLCAweERELCAweEVGLCAweEZFLCAweERELCAweENDLCAweEJBLAorICAgIDB4QUEsIDB4QUEsIDB4OUEsIDB4QUEsIDB4QkMsIDB4Q0QsIDB4REYsIDB4RUMsIDB4REMsIDB4QUEsIDB4OTksIDB4OTksCisgICAgMHg4OSwgMHg5OSwgMHg5QSwgMHhCQiwgMHhDRCwgMHhERCwgMHhDQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEJCLCAweENELCAweERCLCAweEJBLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUIsCisgICAgMHhCQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhDQywKKyAgICAweEJCLCAweDk5LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERCLCAweEE5LAorICAgIDB4ODgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4OUIsIDB4Q0MsIDB4QkIsIDB4QTksIDB4ODcsCisgICAgMHg2NiwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3NywgMHg4OSwgMHhBQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweEFBLCAweENDLCAweEJCLCAweEE5LCAweDg3LCAweDc2LCAweDY1LCAweDU2LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4QkIsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQiwgMHhDQywgMHhDQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHhBQSwKKyAgICAweEJDLCAweERDLCAweERDLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEJCLCAweERELAorICAgIDB4Q0QsIDB4Q0MsIDB4QkEsIDB4OTksIDB4OTgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0QsIDB4Q0QsIDB4RUQsCisgICAgMHhDQiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQywgMHhDRCwgMHhFRCwgMHhERiwgMHhFRCwgMHhDQywKKyAgICAweEJCLCAweEJCLCAweEFCLCAweEJCLCAweEJCLCAweENELCAweERFLCAweEVELCAweEVFLCAweERELCAweERDLCAweENDLAorICAgIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RUUsIDB4RUUsIDB4OUQsIDB4Q0QsIDB4Q0MsIDB4Q0MsIDB4Q0IsIDB4QkMsCisgICAgMHhDQywgMHhDQywgMHhDRCwgMHhERCwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkQsIDB4REQsIDB4REMsIDB4RUQsIDB4REQsIDB4REQsIDB4OUYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRSwKKyAgICAweEVELCAweERELCAweENELCAweERELCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweENELCAweEJCLAorICAgIDB4QkIsIDB4QkMsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4REMsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhBQiwgMHhDRCwgMHhERSwgMHhGRiwgMHhFRiwgMHhGRCwgMHhEQywgMHhCQSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhBQiwKKyAgICAweENELCAweEVGLCAweEZGLCAweEZGLCAweEVELCAweEJBLCAweDg4LCAweDc3LCAweDc3LCAweDg5LCAweEFCLCAweENELAorICAgIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0EsIDB4OTgsIDB4NjYsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REYsIDB4RkYsCisgICAgMHhFRiwgMHhDQiwgMHhBOCwgMHg3NSwgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCRCwgMHhGRiwgMHhGRiwgMHhGQywKKyAgICAweEJBLCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDY4LCAweEFCLCAweERGLCAweEZGLCAweEZGLCAweERCLCAweEE4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTYsIDB4OEEsIDB4QkQsIDB4RUYsIDB4RkYsIDB4RkQsIDB4QkEsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg3OCwgMHhBQiwgMHhERiwgMHhGRiwgMHhGRiwgMHhFQywgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwKKyAgICAweDY4LCAweDlBLCAweENELCAweEZGLCAweEZGLCAweEZGLCAweENDLCAweEE5LCAweDg3LCAweDc2LCAweDc3LCAweDhBLAorICAgIDB4QkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4OUEsIDB4QkMsIDB4REYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhERSwgMHhDQiwgMHhCQSwgMHhBOSwgMHhBQSwgMHhCQywgMHhDRCwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweERELCAweERDLCAweEJCLCAweEJCLCAweENDLCAweERFLCAweEZGLCAweEZGLCAweEZFLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4REQsIDB4Q0MsIDB4REMsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhFRCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDhELCAweERELCAweERELCAweEZFLCAweEVELCAweERGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweERELCAweERDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweERDLCAweDlELCAweEVFLAorICAgIDB4RUUsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUQsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhFRiwgMHhERCwgMHhFRCwgMHhDQiwgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweEVFLCAweERELCAweENCLCAweEJBLCAweDk5LCAweDk5LCAweDg5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0QsIDB4RUUsIDB4REMsIDB4Q0MsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhDRCwgMHhERCwgMHhDRCwgMHhCQSwgMHg5OSwgMHg4NywgMHg2NiwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweERELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERELAorICAgIDB4Q0MsIDB4QkEsIDB4OTcsIDB4NjYsIDB4NTQsIDB4NDUsIDB4NjYsIDB4NzksIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg4NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweEFCLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4OEEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhEQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NywgMHg4OCwKKyAgICAweDlBLCAweEJELCAweEVELCAweENELCAweENCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4REMsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTgsIDB4ODksIDB4OUEsIDB4QkIsIDB4Q0QsIDB4RUUsCisgICAgMHhERSwgMHhERCwgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQywgMHhERCwgMHhERiwgMHhFRCwgMHhFRCwKKyAgICAweERDLCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweEZGLCAweEZFLCAweENFLCAweEZGLCAweERELAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkQsIDB4RkUsIDB4RkYsIDB4REUsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERSwgMHhFRiwgMHhGRiwgMHhGRSwgMHg5RCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwKKyAgICAweERELCAweEVFLCAweEVGLCAweEVGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRSwgMHhERCwgMHhDQywgMHhDQywgMHhCQiwgMHhCQywgMHhDQywgMHhDQywgMHhERCwgMHhERCwgMHhBRSwgMHhGRSwKKyAgICAweERELCAweENDLCAweENCLCAweEJCLCAweEJDLCAweENDLCAweERFLCAweEVGLCAweEZFLCAweERFLCAweERELCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RUUsIDB4RUQsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHhBQiwgMHhCQywgMHhERSwgMHhFRCwgMHhDRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweEFBLCAweEJDLCAweERFLCAweERDLCAweENCLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4QUIsIDB4Q0MsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhEQywgMHhDQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg3NywgMHg4OSwgMHhCQywgMHhERCwKKyAgICAweENCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDU2LCAweDc4LCAweDlBLCAweEJELCAweERCLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4REMsIDB4QkIsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg1NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweENDLCAweEI5LCAweDg3LCAweDc2LCAweDU1LCAweDU1LAorICAgIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkQsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhDRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg5OSwgMHhBQiwKKyAgICAweENELCAweERELCAweERDLCAweEJBLCAweEE5LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweENELCAweEVELAorICAgIDB4REUsIDB4REMsIDB4QkIsIDB4QTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4REUsIDB4RUQsIDB4RUQsCisgICAgMHhEQywgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERSwgMHhGRSwgMHhERiwgMHhFRSwgMHhERCwKKyAgICAweENDLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERFLCAweEZGLCAweEVELCAweEZGLCAweEVFLCAweERELCAweERELAorICAgIDB4Q0MsIDB4REQsIDB4REQsIDB4RUUsIDB4RkYsIDB4RkYsIDB4QUUsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4Q0MsCisgICAgMHhERCwgMHhERCwgMHhFRSwgMHhFRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4RUQsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REQsIDB4REQsIDB4OUYsIDB4RkUsCisgICAgMHhFRCwgMHhERCwgMHhDRCwgMHhEQywgMHhDQywgMHhERCwgMHhERSwgMHhFRiwgMHhGRCwgMHhFRiwgMHhERSwgMHhDQywKKyAgICAweENCLCAweEJCLCAweEJCLCAweENDLCAweENELCAweERFLCAweEVGLCAweERELCAweEVELCAweERDLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RkQsIDB4REQsIDB4REIsIDB4QkEsIDB4OTksIDB4OTgsIDB4ODksCisgICAgMHg5QSwgMHhBQiwgMHhDRCwgMHhFRSwgMHhERCwgMHhEQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3OCwgMHg5OSwKKyAgICAweEFCLCAweENELCAweEZELCAweERELCAweENCLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc4LCAweDlBLCAweEJDLAorICAgIDB4REQsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REQsCisgICAgMHhDQywgMHhCQSwgMHg5NywgMHg2NSwgMHg1NCwgMHg1NSwgMHg1NiwgMHg3OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwKKyAgICAweEE4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDhBLCAweEJDLCAweEVELCAweENDLCAweEJBLCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsIDB4QTksIDB4NzYsIDB4NTUsCisgICAgMHg0NCwgMHg1NSwgMHg2NywgMHg4QSwgMHhCQywgMHhEQywgMHhDRCwgMHhDQSwgMHg5OCwgMHg3NiwgMHg1NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDY2LCAweDY3LCAweDg4LAorICAgIDB4OUEsIDB4Q0MsIDB4REQsIDB4REQsIDB4Q0MsIDB4QUEsIDB4OTgsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkMsCisgICAgMHhERCwgMHhEQywgMHhFRCwgMHhDQiwgMHhBOSwgMHg5OSwgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQywgMHhDRSwgMHhFRCwKKyAgICAweERGLCAweERDLCAweENCLCAweEJBLCAweEE5LCAweEFBLCAweEFBLCAweEJDLCAweERELCAweEVGLCAweEVELCAweEVFLAorICAgIDB4REQsIDB4Q0MsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkMsIDB4REQsIDB4RUUsIDB4RUUsIDB4RUYsIDB4RkUsIDB4RUQsCisgICAgMHhEQywgMHhEQywgMHhDQywgMHhDRCwgMHhERCwgMHhFRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhFRSwgMHhGRCwgMHhERCwKKyAgICAweERELCAweERELCAweEVELCAweERGLCAweEZGLCAweEZGLCAweDlELCAweERELCAweENELCAweERELCAweERELCAweERELAorICAgIDB4REQsIDB4REUsIDB4REUsIDB4RUYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweERGLCAweEZGLCAweEZFLCAweEZFLCAweERFLCAweENELCAweERELCAweEVELCAweERELCAweERFLCAweDhGLCAweEZGLAorICAgIDB4RkYsIDB4RUYsIDB4RUQsIDB4RUUsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsCisgICAgMHhERCwgMHhEQywgMHhERCwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhDQywgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweENELCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweENDLCAweEJBLCAweEE5LCAweDlBLAorICAgIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REMsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODksIDB4QUEsCisgICAgMHhDRCwgMHhGRiwgMHhGRiwgMHhFRiwgMHhFQywgMHhCOSwgMHg4NywgMHg3NiwgMHg3NywgMHg4OCwgMHhBQiwgMHhDRSwKKyAgICAweEZGLCAweEZGLCAweEZELCAweEJBLCAweDk3LCAweDY2LCAweDU1LCAweDY2LCAweDg5LCAweEFDLCAweERGLCAweEZGLAorICAgIDB4RUUsIDB4REIsIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjcsIDB4OEEsIDB4QkQsIDB4RkYsIDB4RkQsIDB4REQsCisgICAgMHhCOSwgMHg4NiwgMHg1NCwgMHgzMywgMHg0NSwgMHg2OCwgMHg5QiwgMHhDRiwgMHhGRiwgMHhFRiwgMHhDQiwgMHg5OCwKKyAgICAweDY1LCAweDQzLCAweDM0LCAweDU2LCAweDg5LCAweEJDLCAweEZGLCAweEZELCAweEVELCAweEJBLCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NzgsIDB4OUIsIDB4REQsIDB4RkUsIDB4RUYsIDB4REMsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg5QSwgMHhCRCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQiwgMHhBOCwgMHg4NywgMHg2NiwgMHg3NywgMHg4OSwKKyAgICAweEJDLCAweERGLCAweEZGLCAweEZGLCAweERELCAweEJCLCAweEE5LCAweDg4LCAweDg4LCAweDg5LCAweEFCLCAweENGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUMsIDB4Q0IsIDB4QUEsIDB4QTksIDB4OUEsIDB4QkIsIDB4REQsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRCwgMHhFRCwgMHhDQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEVELCAweERDLCAweENELCAweENELCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RUYsIDB4RUUsIDB4RUQsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5RCwgMHhERSwgMHhFRiwgMHhGRSwgMHhFRCwgMHhFRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCQywgMHhDQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHg5RCwgMHhFRCwKKyAgICAweERDLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERGLCAweEVELCAweERELCAweERDLCAweEJCLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REYsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QTksIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhERCwgMHhDQywgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEJDLCAweENELCAweERCLCAweENCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QkMsIDB4Q0MsIDB4QkIsIDB4QUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsCisgICAgMHhCQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg3NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhDQiwKKyAgICAweEJCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4QUEsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDg5LCAweEFCLCAweENDLCAweEJCLCAweEE5LCAweDg3LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkMsIDB4QkIsIDB4QkEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg4OSwgMHhBQiwgMHhDQywgMHhCQywgMHhCQSwgMHg5OSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHhBQiwKKyAgICAweEJDLCAweERDLCAweENCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweENDLAorICAgIDB4Q0QsIDB4Q0IsIDB4QkEsIDB4OTksIDB4OTgsIDB4OTksIDB4OUEsIDB4QUIsIDB4QkIsIDB4REQsIDB4Q0MsIDB4REMsCisgICAgMHhDQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhERSwgMHhDRCwgMHhERCwgMHhDQywKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJELCAweERELCAweEVGLCAweERELCAweEVELCAweERELCAweENDLCAweENDLAorICAgIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RkQsIDB4OEQsIDB4Q0MsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsCisgICAgMHhDQiwgMHhDQywgMHhERCwgMHhERSwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4OTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4OEIsIDB4Q0MsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDQywgMHhEQywgMHhCQywgMHhCQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENELCAweENBLCAweEJCLCAweEFBLCAweDk5LCAweDk4LAorICAgIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0IsIDB4QUIsIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzgsCisgICAgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQywgMHhCQSwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwKKyAgICAweDk5LCAweEFCLCAweEJCLCAweEFBLCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDc4LCAweDlBLAorICAgIDB4QUIsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QkEsCisgICAgMHg5QSwgMHg5OCwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhBOSwgMHhBOSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEJBLCAweDlBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEFBLCAweEFBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QUEsIDB4QkEsIDB4QUIsIDB4QTksIDB4OTgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQiwgMHhCQSwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg4OCwgMHg4OCwgMHg5QSwgMHhBQiwgMHhDQiwKKyAgICAweEJCLCAweEJBLCAweEE5LCAweDk5LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJDLCAweEJCLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4Q0MsIDB4QkMsIDB4Q0IsIDB4QkIsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhDRCwgMHhDQiwgMHhEQywgMHhDQywgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweENDLCAweENELCAweERDLCAweDhDLCAweEJCLCAweEJBLCAweEFCLCAweEFBLCAweEFBLAorICAgIDB4QUIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDlCLCAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJCLCAweDlCLCAweENCLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4OUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REMsIDB4QkMsIDB4QkEsIDB4QTksCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhCQSwgMHhCQSwgMHhBOSwgMHg5OSwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEJCLCAweENCLCAweEFBLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHhBQSwgMHhCQSwgMHg5QSwgMHg5OSwgMHg4NywgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg5OSwKKyAgICAweEFCLCAweEE5LCAweEE5LCAweDg4LCAweDc3LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEFBLAorICAgIDB4OUEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjUsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsIDB4QTksIDB4OTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwgMHg5OSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEE5LCAweEE5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NTUsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQSwgMHhBOSwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweDlBLCAweEJBLCAweEFBLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4QUEsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4OTksIDB4QUIsIDB4QkIsCisgICAgMHhBQiwgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQywgMHhCQiwgMHhDQiwKKyAgICAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENCLCAweEJDLCAweENCLCAweEJBLAorICAgIDB4QUEsIDB4QTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4Q0IsIDB4REMsIDB4Q0IsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhEQywgMHg5QiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEFCLCAweEJCLCAweEJDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQywgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhCQywgMHg4QywgMHhDQywKKyAgICAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENDLCAweERDLCAweEJDLCAweEJCLCAweEFBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4Q0IsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsCisgICAgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhDQiwgMHhCQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3OCwKKyAgICAweDg4LCAweDk5LCAweEFCLCAweEJDLCAweEJBLCAweEJBLCAweDk5LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OTksIDB4QUIsIDB4Q0IsIDB4QUEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4ODgsIDB4OUEsCisgICAgMHhCQywgMHhCQSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwgMHg1NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhCQiwKKyAgICAweEFBLCAweDk4LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEFBLCAweEE5LAorICAgIDB4ODcsIDB4NzYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4OTgsIDB4NzcsCisgICAgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEJBLCAweEFBLCAweDk5LCAweDg3LCAweDc2LCAweDY1LCAweDY2LAorICAgIDB4NjcsIDB4NzgsIDB4OTksIDB4QUIsIDB4QUEsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg5QSwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweENCLAorICAgIDB4QkMsIDB4QkIsIDB4QTksIDB4OTksIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4QkIsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDQywgMHhDRCwgMHhDQywgMHhCQiwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweENDLCAweERELCAweENDLCAweENCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0UsIDB4RUMsIDB4OUMsIDB4Q0IsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhBQiwgMHhCQiwgMHhCQywgMHhDQywgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkYsIDB4REMsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4N0QsIDB4RkQsCisgICAgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHhFRiwgMHhGRCwgMHhERSwgMHhEQywgMHhDQiwKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweENFLCAweEVFLCAweERDLCAweERDLCAweENCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4Q0QsIDB4RUQsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4OTksIDB4ODgsIDB4ODgsCisgICAgMHg5OSwgMHhBQiwgMHhCQywgMHhERSwgMHhDQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFBLCAweEJELCAweERELCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4Q0MsIDB4Q0EsIDB4QTgsIDB4NzcsIDB4NjYsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REMsCisgICAgMHhCQywgMHhBOSwgMHg4NywgMHg2NSwgMHg1NCwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhDQiwgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU0LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENDLCAweEJCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0MsIDB4Q0EsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NCwgMHg1NiwgMHg2NywgMHg4OSwgMHhBQywgMHhDQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NiwKKyAgICAweDY3LCAweDg4LCAweDlBLCAweEJELCAweERDLCAweENCLCAweEE5LCAweDg4LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4REMsIDB4Q0QsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUIsCisgICAgMHhDRCwgMHhEQywgMHhEQywgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhDRCwgMHhGRCwKKyAgICAweERELCAweERDLCAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweERELCAweEVELCAweEVELAorICAgIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RUUsIDB4REYsIDB4RUUsIDB4REMsCisgICAgMHhDQywgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhFRiwgMHhFRCwgMHhFRSwgMHhGRCwgMHhERCwgMHhDQywKKyAgICAweENDLCAweENDLCAweERELCAweEVFLCAweEZGLCAweEVFLCAweDhELCAweERDLCAweERDLCAweENDLCAweENDLCAweENDLAorICAgIDB4Q0QsIDB4REQsIDB4REQsIDB4RUUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENFLCAweEVGLCAweEZELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERDLCAweERELCAweDhGLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4RkQsIDB4REUsIDB4RkUsIDB4RkUsIDB4RUYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RUUsCisgICAgMHhEQywgMHhDRCwgMHhEQywgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhFRCwgMHhEQywgMHhDQiwKKyAgICAweEJCLCAweEJDLCAweENELCAweERFLCAweEVGLCAweEZFLCAweEVGLCAweEVFLCAweENDLCAweEJBLCAweEE5LCAweDlBLAorICAgIDB4QUIsIDB4Q0MsIDB4REUsIDB4RkYsIDB4RUUsIDB4RkUsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4ODksIDB4OUIsCisgICAgMHhDRCwgMHhERSwgMHhGRiwgMHhERSwgMHhEQywgMHhCQSwgMHg5NywgMHg3NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhDRCwKKyAgICAweEZGLCAweERELCAweEVELCAweEJBLCAweDk3LCAweDY2LCAweDU1LCAweDY2LCAweDg5LCAweEFDLCAweENELCAweEZFLAorICAgIDB4REUsIDB4REIsIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjcsIDB4OEEsIDB4QkMsIDB4RUUsIDB4RUQsIDB4RUMsCisgICAgMHhCOSwgMHg4NiwgMHg1NCwgMHgzMywgMHg0NSwgMHg2OCwgMHg5QiwgMHhDRSwgMHhGRSwgMHhERCwgMHhDQiwgMHhBOCwKKyAgICAweDc1LCAweDQzLCAweDM0LCAweDU2LCAweDhBLCAweEJDLCAweEVGLCAweEVFLCAweEVDLCAweEJBLCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NDYsIDB4NzgsIDB4QUIsIDB4Q0QsIDB4RkUsIDB4RUQsIDB4REIsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg5QSwgMHhCRCwgMHhERiwgMHhGRCwgMHhFRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg3NywgMHg4QSwKKyAgICAweEJDLCAweERFLCAweEZGLCAweERFLCAweERELCAweEJBLCAweEE5LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweERELAorICAgIDB4RUYsIDB4RkQsIDB4RkUsIDB4REMsIDB4Q0IsIDB4QUEsIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0QsIDB4RkYsIDB4RkYsCisgICAgMHhERiwgMHhGRSwgMHhERCwgMHhDQywgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhFRiwgMHhGRiwgMHhFRCwgMHhGRiwKKyAgICAweEVFLCAweERELCAweERDLCAweENDLCAweENELCAweERELCAweEVGLCAweEZGLCAweEZGLCAweERGLCAweEZFLCAweEVFLAorICAgIDB4RUUsIDB4RUQsIDB4RUUsIDB4REYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RUYsIDB4RUYsIDB4RkUsCisgICAgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4QywgMHhDQywgMHhERCwgMHhERCwgMHhERCwgMHhERCwKKyAgICAweERFLCAweEZGLCAweEVGLCAweEZGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRSwgMHhFRCwgMHhERCwgMHhDRCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhERCwgMHg5RSwgMHhGRSwKKyAgICAweEVELCAweERELCAweENDLCAweENDLCAweENDLCAweERELCAweERFLCAweEVGLCAweEZELCAweEVGLCAweEVELCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4REYsIDB4REQsIDB4RUQsIDB4Q0MsIDB4QkEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERSwgMHhFRCwgMHhERCwgMHhEQywgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OSwKKyAgICAweDlBLCAweEFCLCAweENELCAweERELCAweERELCAweERDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUQsIDB4Q0MsIDB4Q0EsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUMsCisgICAgMHhERCwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhERCwKKyAgICAweENDLCAweEJBLCAweDk3LCAweDY1LCAweDU0LCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweENCLAorICAgIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OEEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4ODcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDlBLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QiwgMHhCQywgMHhERCwgMHhDQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OCwgMHg5QSwgMHhCQywKKyAgICAweERFLCAweERDLCAweEVDLCAweENCLCAweEFBLCAweDk5LCAweDg4LCAweDk5LCAweDlBLCAweEJDLCAweERELCAweEZFLAorICAgIDB4Q0UsIDB4REMsIDB4Q0IsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0UsIDB4RUYsIDB4RkMsIDB4RUQsCisgICAgMHhEQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhFRiwgMHhGRiwgMHhERSwgMHhFRCwgMHhERCwKKyAgICAweENDLCAweENDLCAweENDLCAweENELCAweERELCAweEVFLCAweEZGLCAweEZELCAweEZFLCAweEVFLCAweEVELCAweEVELAorICAgIDB4REQsIDB4REQsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUQsIDB4REQsIDB4REMsIDB4REMsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhFRSwgMHhFRiwgMHhFRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4REQsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4QUUsIDB4RUUsCisgICAgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhERCwgMHhFRSwgMHhFRCwgMHhERSwgMHhEQywgMHhDQiwKKyAgICAweEJBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweENELCAweERFLCAweERELCAweERDLCAweENCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4REQsIDB4RUQsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg5OSwgMHhBQSwgMHhCQywgMHhERCwgMHhEQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweEFCLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4Q0IsIDB4Q0EsIDB4OTgsIDB4NzcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QUMsIDB4REMsCisgICAgMHhCQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NCwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENDLCAweEJCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhCQiwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDc4LCAweDlBLCAweEJELCAweENDLCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzgsIDB4OTksIDB4QUIsCisgICAgMHhDRCwgMHhEQywgMHhEQywgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhDRCwgMHhFRCwKKyAgICAweENELCAweENDLCAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweENDLCAweERFLCAweERDLCAweEVELAorICAgIDB4Q0MsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RUUsIDB4REUsIDB4REQsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRCwgMHhFRSwgMHhFRCwgMHhERCwgMHhDQywKKyAgICAweENDLCAweENDLCAweERELCAweEVFLCAweEZGLCAweEZGLCAweDlELCAweERELCAweERELCAweENDLCAweENDLCAweENDLAorICAgIDB4Q0QsIDB4REUsIDB4RUUsIDB4RUYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweERFLCAweEVFLCAweERELCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweERDLCAweDlFLCAweEZFLAorICAgIDB4RUQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REQsIDB4RUYsIDB4RkQsIDB4REYsIDB4RUQsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHhERSwgMHhERSwgMHhFRCwgMHhDQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweENDLCAweENELCAweEVELCAweERFLCAweERDLCAweEJBLCAweDk5LCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4REMsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhDRCwgMHhERCwgMHhDRCwgMHhCQSwgMHhBOCwgMHg3NywgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQiwKKyAgICAweERELCAweENDLCAweENCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERDLAorICAgIDB4Q0QsIDB4QkEsIDB4OTcsIDB4NjUsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhCQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweEFCLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4REQsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg4OCwKKyAgICAweDlCLCAweENDLCAweEVELCAweENELCAweENCLCAweEFBLCAweDk4LCAweDg3LCAweDc4LCAweDg5LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4REQsIDB4REMsIDB4Q0IsIDB4QUEsIDB4OTksIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0QsIDB4RUQsCisgICAgMHhERSwgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQywgMHhERCwgMHhERSwgMHhFQywgMHhERCwKKyAgICAweERDLCAweENCLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweERELCAweEVGLCAweEZFLCAweERFLCAweEVFLCAweERELAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RUUsIDB4RkYsIDB4RkQsIDB4RUUsIDB4RUUsIDB4REQsIDB4REMsCisgICAgMHhERCwgMHhERCwgMHhERCwgMHhFRiwgMHhGRiwgMHhGRiwgMHg5RCwgMHhEQywgMHhEQywgMHhDQywgMHhDQywgMHhDRCwKKyAgICAweERELCAweEVELCAweEVFLCAweEVFLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERiwgMHhGRiwgMHhFRiwgMHhFRCwgMHhERCwgMHhDRCwgMHhEQywgMHhDQywgMHhDRCwgMHhERCwgMHg4RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEVFLCAweERELCAweERFLCAweEVGLCAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEVFLAorICAgIDB4REQsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RUUsIDB4RUYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RUQsIDB4Q0MsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhDRCwgMHhERSwgMHhGRiwgMHhGRSwgMHhFRiwgMHhGRCwgMHhDQiwgMHhBQSwgMHg5OSwgMHg5QSwKKyAgICAweEFCLCAweEJDLCAweERFLCAweEZGLCAweEVFLCAweEZELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg5LCAweDlCLAorICAgIDB4Q0MsIDB4RUUsIDB4RkQsIDB4RUYsIDB4REIsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjcsIDB4ODgsIDB4OUIsIDB4Q0QsCisgICAgMHhGRiwgMHhGRCwgMHhERCwgMHhCQSwgMHg5NywgMHg2NiwgMHg1NSwgMHg2NiwgMHg4OSwgMHhBQiwgMHhERSwgMHhGRiwKKyAgICAweERELCAweENCLCAweDk4LCAweDc2LCAweDU0LCAweDQ1LCAweDY3LCAweDhBLCAweEJDLCAweERGLCAweEZFLCAweEVDLAorICAgIDB4QTksIDB4ODYsIDB4NTQsIDB4MzMsIDB4NDUsIDB4NjgsIDB4OUIsIDB4Q0QsIDB4RkUsIDB4REQsIDB4Q0IsIDB4OTgsCisgICAgMHg2NSwgMHg0MywgMHgzNCwgMHg1NiwgMHg4OSwgMHhCQywgMHhERiwgMHhFRCwgMHhEQywgMHhCQSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU2LCAweDc4LCAweEFCLCAweENELCAweEVFLCAweERFLCAweENCLCAweEE5LCAweDc2LCAweDY1LCAweDU2LAorICAgIDB4NjcsIDB4OEEsIDB4QkQsIDB4REYsIDB4RkQsIDB4RkQsIDB4Q0IsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NzcsIDB4ODksCisgICAgMHhBQywgMHhFRiwgMHhGRiwgMHhERiwgMHhERCwgMHhCQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhDRSwKKyAgICAweEZGLCAweEZELCAweEVGLCAweERELCAweENCLCAweEFBLCAweDk5LCAweDlBLCAweEJCLCAweENELCAweEVGLCAweEZGLAorICAgIDB4RUYsIDB4RkUsIDB4REQsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsCisgICAgMHhERSwgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhERSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwKKyAgICAweEVFLCAweEVELCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUQsIDB4REQsIDB4REQsIDB4RUUsIDB4REQsIDB4REYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4OEQsIDB4RUUsCisgICAgMHhDQywgMHhDQywgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhFRiwgMHhFRCwgMHhDRCwgMHhEQywgMHhDQiwKKyAgICAweEFBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweERELCAweENDLCAweERDLCAweEJCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0MsIDB4RUQsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhCQywgMHhDRCwgMHhDQywgMHhDQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweDlBLCAweEJDLCAweERDLCAweEJCLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4QkMsIDB4Q0IsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4REMsCisgICAgMHhCQiwgMHhBOSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweENDLCAweEJCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4QkIsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhCQiwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4QkMsIDB4QkEsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzgsIDB4OTksIDB4QUIsCisgICAgMHhDRCwgMHhDQywgMHhDQywgMHhCQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQywgMHhEQywKKyAgICAweENELCAweENDLCAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweENDLCAweERELCAweERDLCAweEVELAorICAgIDB4Q0MsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4REQsIDB4RUQsIDB4Q0UsIDB4RUQsIDB4Q0MsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDRCwgMHhFRSwgMHhEQywgMHhFRSwgMHhFRCwgMHhEQywgMHhDQywKKyAgICAweENDLCAweENDLCAweENDLCAweERELCAweEVFLCAweEZFLCAweDdDLCAweENDLCAweENDLCAweENCLCAweENCLCAweEJCLAorICAgIDB4Q0MsIDB4Q0MsIDB4REUsIDB4REUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweDlBLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweDhDLCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REMsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhCQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OSwKKyAgICAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweENCLCAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkEsIDB4QkEsIDB4OTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsCisgICAgMHg5QSwgMHhBQiwgMHhDQiwgMHhBQSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwKKyAgICAweEJCLCAweEJBLCAweEFBLCAweDk4LCAweDc2LCAweDY2LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEJCLAorICAgIDB4QUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QUEsIDB4QTksCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHg5OCwgMHg4NywKKyAgICAweDY2LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDg5LCAweEFCLCAweEFBLCAweEE5LCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NTYsCisgICAgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQiwgMHhBQSwgMHhCQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDg5LCAweEFBLCAweEJCLCAweEFCLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweDlBLAorICAgIDB4QkMsIDB4QkEsIDB4QkIsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4Q0IsCisgICAgMHhCQywgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OCwgMHg4OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhCQiwgMHhDQiwKKyAgICAweEJCLCAweEFBLCAweEE5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweERDLCAweEJELCAweENDLCAweEJCLAorICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4Q0IsIDB4REQsIDB4Q0MsIDB4Q0IsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERSwgMHhFRCwgMHg4QiwgMHhCQiwgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwKKyAgICAweEJCLCAweEJCLCAweEJDLCAweENDLCAweEEwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg5QiwgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQSwgMHhCQiwgMHg5QiwgMHhDQiwKKyAgICAweEJCLCAweEFBLCAweEFBLCAweDlBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERCLCAweEJCLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MsIDB4QkEsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3OCwKKyAgICAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweEFBLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OTksIDB4QUEsIDB4QkEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhCQSwKKyAgICAweDlBLCAweDk4LCAweDc3LCAweDY2LCAweDU1LCAweDU2LCAweDY2LCAweDc4LCAweDg5LCAweEFBLCAweEE5LCAweEE5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QUEsIDB4OTksIDB4OTgsIDB4NzcsCisgICAgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwgMHhBOSwgMHhBOSwgMHg4OCwgMHg3NiwgMHg2NiwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEFBLCAweDlBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzgsIDB4ODksIDB4QUEsIDB4QTksIDB4QTksIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEFBLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc4LCAweDg4LCAweDk5LCAweEFBLCAweEJBLAorICAgIDB4QUIsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4QkEsIDB4Q0IsCisgICAgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDQiwgMHhCQywgMHhDQiwgMHhCQSwKKyAgICAweEFBLCAweEFBLCAweDk5LCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweENCLCAweENDLCAweENCLCAweEJCLCAweEJBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4Q0MsIDB4REMsIDB4OUIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUIsIDB4QkIsIDB4QUEsIDB4QUEsIDB4OTksIDB4OTksIDB4QUEsIDB4QUEsIDB4QkIsIDB4QkIsIDB4OEIsIDB4Q0MsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhEQiwgMHhCQywgMHhCQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENDLCAweEJCLCAweEJCLCAweEFBLCAweDk5LCAweDg4LAorICAgIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0IsIDB4QUIsIDB4QUEsIDB4OTgsIDB4ODgsIDB4ODcsIDB4ODgsCisgICAgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQywgMHhCQSwgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDk5LCAweEFCLCAweEJBLCAweEFBLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QUIsIDB4QUEsIDB4QTksIDB4OTgsIDB4NzYsIDB4NjYsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QkEsCisgICAgMHg5QSwgMHg5OCwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQiwgMHhBOSwgMHhBOSwKKyAgICAweDg3LCAweDc2LCAweDU1LCAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEJBLCAweDlBLCAweDk4LCAweDg3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NzcsIDB4ODksIDB4QUIsIDB4QTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg1NiwKKyAgICAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEFBLCAweEJBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QUEsIDB4QkEsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhCQiwgMHhCQSwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5QSwgMHhBQiwgMHhDQiwKKyAgICAweEFDLCAweEJBLCAweEE5LCAweDk5LCAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweEJCLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0IsIDB4QkMsIDB4Q0IsIDB4QkIsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhDQiwgMHhERCwgMHhDQywgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweENDLCAweERDLCAweERDLCAweDhCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJELCAweENDLCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweDdELCAweEZFLAorICAgIDB4REMsIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4RUUsIDB4RUQsIDB4REQsIDB4REMsIDB4QkIsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhERSwgMHhEQywgMHhEQywgMHhDQiwgMHhBOSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENELCAweEVELCAweENELCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QUMsIDB4Q0QsIDB4Q0MsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhCQywgMHhBOSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweENDLCAweENCLCAweEJBLCAweDk4LCAweDc3LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweENDLAorICAgIDB4QkIsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTQsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhCQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweEJBLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDk5LCAweEJCLCAweENDLCAweENDLCAweEJBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0MsIDB4Q0MsIDB4REMsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4QkMsIDB4REQsCisgICAgMHhDQywgMHhDQywgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhERSwgMHhEQywgMHhERCwKKyAgICAweENDLCAweEJCLCAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweENDLCAweERFLCAweEVELCAweERFLCAweERELCAweENDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RUYsIDB4RUQsIDB4RUQsIDB4RUUsIDB4RUMsIDB4Q0MsCisgICAgMHhDQywgMHhDQywgMHhERCwgMHhERSwgMHhGRiwgMHhGRSwgMHg4RCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywKKyAgICAweENDLCAweENDLCAweERELCAweEVGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhEQywgMHhERCwgMHhERCwgMHhDRCwgMHhDQywgMHhDQywgMHg4RiwgMHhGRiwKKyAgICAweEZGLCAweEVFLCAweEVFLCAweEVELCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4REQsIDB4REQsIDB4Q0QsIDB4Q0QsIDB4RUUsIDB4RUYsIDB4RUYsIDB4RUUsIDB4RkYsIDB4RUQsIDB4REQsIDB4Q0IsCisgICAgMHhCQiwgMHhCQywgMHhDRCwgMHhERCwgMHhFRiwgMHhGRCwgMHhFRiwgMHhERSwgMHhEQywgMHhCQSwgMHhBQSwgMHhBQSwKKyAgICAweEFCLCAweENELCAweERFLCAweEZGLCAweERFLCAweEZFLCAweERDLCAweEE5LCAweDk4LCAweDg4LCAweDk5LCAweEFCLAorICAgIDB4Q0MsIDB4RUYsIDB4RkQsIDB4RUYsIDB4REMsIDB4QjksIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODksIDB4QUIsIDB4Q0QsCisgICAgMHhFRiwgMHhFRSwgMHhERCwgMHhDQSwgMHg5OCwgMHg2NiwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQywgMHhERSwgMHhGRSwKKyAgICAweEVELCAweERCLCAweEE4LCAweDc2LCAweDQ0LCAweDQ1LCAweDY3LCAweDhBLCAweEJELCAweEVGLCAweERELCAweEVELAorICAgIDB4QkEsIDB4ODcsIDB4NTQsIDB4MzMsIDB4NDUsIDB4NzgsIDB4QUIsIDB4Q0UsIDB4RkUsIDB4REUsIDB4Q0IsIDB4QTgsCisgICAgMHg3NSwgMHg0MywgMHgzNCwgMHg1NiwgMHg4OSwgMHhCQywgMHhFRiwgMHhFRCwgMHhFRCwgMHhDQSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDQ1LCAweDc4LCAweEFCLCAweENFLCAweEVFLCAweERELCAweERDLCAweEE5LCAweDg3LCAweDY1LCAweDU1LAorICAgIDB4NjgsIDB4OUEsIDB4Q0QsIDB4REYsIDB4RkQsIDB4RkQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NzcsIDB4ODksCisgICAgMHhCQywgMHhERSwgMHhFRiwgMHhDRSwgMHhEQywgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg5OSwgMHhCQiwgMHhERCwKKyAgICAweEZGLCAweEVELCAweEVGLCAweEVDLCAweENCLCAweEFBLCAweEE5LCAweEFBLCAweEJCLCAweERELCAweEVGLCAweEZGLAorICAgIDB4Q0QsIDB4RUQsIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkMsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RkUsCisgICAgMHhERCwgMHhERCwgMHhEQywgMHhDRCwgMHhDRCwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRSwgMHhERSwgMHhFRCwKKyAgICAweERELCAweEVFLCAweERFLCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEZDLCAweEZFLCAweEZFLCAweERFLCAweEVFLAorICAgIDB4REUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4REUsCisgICAgMHhFRSwgMHhERSwgMHhGRiwgMHhGRiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0UsIDB4REQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4OUUsIDB4RkUsCisgICAgMHhFRCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHhERSwgMHhFRSwgMHhGRCwgMHhERiwgMHhFRCwgMHhDQywKKyAgICAweENCLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERELCAweEVFLCAweERELCAweEVELCAweERDLCAweEJBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RUQsIDB4REQsIDB4REMsIDB4QkEsIDB4OTksIDB4OTgsIDB4OTksCisgICAgMHg5QSwgMHhBQiwgMHhDRCwgMHhERSwgMHhEQywgMHhEQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweENELCAweEVELCAweENDLCAweENCLCAweDk5LCAweDg3LCAweDY2LCAweDY3LCAweDc4LCAweDlBLCAweEJDLAorICAgIDB4Q0QsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REQsCisgICAgMHhDQywgMHhCQSwgMHg5NywgMHg2NSwgMHg1NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwKKyAgICAweEE5LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDlBLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk3LAorICAgIDB4NjUsIDB4NDQsIDB4NDQsIDB4NTYsIDB4NzksIDB4QUIsIDB4Q0QsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg2NywgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweENELCAweERDLCAweENDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY3LCAweDg4LAorICAgIDB4OUEsIDB4Q0QsIDB4RUQsIDB4Q0QsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkMsCisgICAgMHhERSwgMHhEQywgMHhEQywgMHhDQiwgMHhBQSwgMHg5OSwgMHg5OCwgMHg5OSwgMHg5QSwgMHhCQywgMHhERSwgMHhFRCwKKyAgICAweENELCAweERDLCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweEVGLCAweERDLCAweEVELAorICAgIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RkUsIDB4Q0UsIDB4RUQsIDB4REQsCisgICAgMHhEQywgMHhDQywgMHhDQywgMHhDRCwgMHhERCwgMHhFRSwgMHhGRiwgMHhFQywgMHhGRSwgMHhFRSwgMHhFRCwgMHhERCwKKyAgICAweERELCAweERELCAweEVFLCAweEVFLCAweEZGLCAweEZGLCAweDhELCAweERELCAweERDLCAweERELCAweERELCAweERELAorICAgIDB4REQsIDB4REQsIDB4RUUsIDB4RUUsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENELCAweERELCAweENDLCAweENCLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweENDLCAweEFFLCAweEVFLAorICAgIDB4REQsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RUQsIDB4REUsIDB4REMsIDB4Q0IsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhERSwgMHhERCwgMHhEQywgMHhDQiwgMHhBQSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweENELCAweERELCAweENELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QkMsIDB4Q0QsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweENELCAweENCLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweENDLAorICAgIDB4QkIsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDQywgMHhCQiwgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweEJBLCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4QkIsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk5LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REMsIDB4Q0MsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0QsIDB4RUQsCisgICAgMHhDRCwgMHhDQiwgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhERSwgMHhEQywgMHhERCwKKyAgICAweENDLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERFLCAweEZFLCAweENFLCAweERELCAweENDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4RkYsIDB4RUQsIDB4RUUsIDB4REQsIDB4REMsIDB4Q0MsCisgICAgMHhDQywgMHhDQywgMHhERCwgMHhFRSwgMHhFRiwgMHhGRSwgMHhBRCwgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywKKyAgICAweENDLCAweERELCAweEVFLCAweEVGLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRSwgMHhERCwgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDRCwgMHg5RSwgMHhGRiwKKyAgICAweEVELCAweERELCAweENDLCAweENDLCAweENDLCAweERELCAweERELCAweERFLCAweEZELCAweEVFLCAweEVELCAweENDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0QsIDB4REQsIDB4RUUsIDB4REQsIDB4RUQsIDB4Q0MsIDB4QkEsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhERCwgMHhFRCwgMHhERCwgMHhDQywgMHhCQSwgMHg5OSwgMHg5OCwgMHg5OSwKKyAgICAweDlBLCAweEFCLCAweENELCAweERFLCAweERELCAweERDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QUIsIDB4Q0QsIDB4REQsIDB4Q0QsIDB4Q0IsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OUEsIDB4QkIsCisgICAgMHhDRCwgMHhEQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhEQywKKyAgICAweENDLCAweEJBLCAweDk4LCAweDY1LCAweDU0LCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweENDLCAweENCLAorICAgIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4REMsIDB4Q0MsIDB4QkEsIDB4OTcsCisgICAgMHg2NSwgMHg0NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhDQywgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwKKyAgICAweDQ0LCAweDU1LCAweDY3LCAweDlBLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REMsIDB4REIsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4ODgsCisgICAgMHg5QSwgMHhDRCwgMHhFRCwgMHhDRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OCwgMHg5QSwgMHhCQywKKyAgICAweERFLCAweERDLCAweERDLCAweENCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEJDLCAweENELCAweEVELAorICAgIDB4Q0UsIDB4REMsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkMsIDB4Q0QsIDB4RUYsIDB4RUMsIDB4RUQsCisgICAgMHhEQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhFRSwgMHhGRSwgMHhDRSwgMHhFRCwgMHhERCwKKyAgICAweENDLCAweENDLCAweENDLCAweENDLCAweERELCAweEVGLCAweEZGLCAweEZELCAweEVFLCAweEVFLCAweERELCAweERELAorICAgIDB4REQsIDB4REQsIDB4REUsIDB4RUYsIDB4RUYsIDB4RkYsIDB4OUMsIDB4Q0QsIDB4REMsIDB4REMsIDB4Q0MsIDB4Q0QsCisgICAgMHhERCwgMHhERCwgMHhFRSwgMHhGRSwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4Q0YsIDB4RkUsIDB4RUQsIDB4RUQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4N0UsIDB4RkYsCisgICAgMHhGRiwgMHhGRSwgMHhFRSwgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRiwgMHhGRCwgMHhERiwgMHhGRSwgMHhGRSwKKyAgICAweERDLCAweENDLCAweENDLCAweENDLCAweERELCAweEVFLCAweEVGLCAweERFLCAweEZFLCAweEVFLCAweENDLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4RUYsIDB4RkQsIDB4RUYsIDB4RUQsIDB4Q0IsIDB4QkEsIDB4QTksIDB4OUEsCisgICAgMHhBQiwgMHhCQywgMHhERCwgMHhFRSwgMHhERSwgMHhFRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OSwgMHhBQSwKKyAgICAweENDLCAweERFLCAweEVELCAweERFLCAweERCLCAweEI5LCAweDg3LCAweDc2LCAweDc3LCAweDg5LCAweEFCLCAweENELAorICAgIDB4RUYsIDB4REUsIDB4REMsIDB4QkEsIDB4OTcsIDB4NjYsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4Q0UsIDB4RkQsCisgICAgMHhERCwgMHhDQiwgMHhBOCwgMHg3NSwgMHg1NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCRCwgMHhERiwgMHhFRCwgMHhFQywKKyAgICAweEI5LCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDc4LCAweEFCLCAweENELCAweEVELCAweERELCAweENCLCAweEE4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTYsIDB4ODksIDB4QkMsIDB4RUYsIDB4RUQsIDB4REMsIDB4QkEsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg0NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhFRCwgMHhERCwgMHhEQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDlBLCAweEJDLCAweEVGLCAweERELCAweEVELCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDc3LCAweDg5LAorICAgIDB4QkMsIDB4REUsIDB4RkUsIDB4REYsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0QsCisgICAgMHhGRiwgMHhFRCwgMHhFRSwgMHhERCwgMHhCQiwgMHhBQSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhDRCwgMHhFRiwgMHhGRiwKKyAgICAweERFLCAweEVELCAweENDLCAweENCLCAweEJCLCAweEJCLCAweEJDLCAweERELCAweEVGLCAweEZGLCAweEZFLCAweEZGLAorICAgIDB4RUQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkUsIDB4RUUsCisgICAgMHhERSwgMHhERSwgMHhERSwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhFRiwgMHhFRSwgMHhGRSwKKyAgICAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDhDLCAweERELCAweERDLCAweERFLCAweERFLCAweEVELAorICAgIDB4RUQsIDB4RkYsIDB4RUUsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweENGLCAweEVFLCAweERELCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweERELCAweDhFLCAweEZGLAorICAgIDB4RUQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REUsIDB4RUYsIDB4RkUsIDB4RUYsIDB4RUQsIDB4Q0MsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDRCwgMHhFRSwgMHhFRSwgMHhERSwgMHhFRCwgMHhDQiwgMHhCQSwgMHhBQSwKKyAgICAweEE5LCAweEFBLCAweEFCLCAweENELCAweERFLCAweEZELCAweEVELCAweERDLCAweEJBLCAweDk5LCAweDk4LCAweDk5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REYsIDB4REMsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhBQiwgMHhDRCwgMHhFRCwgMHhEQywgMHhCQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweENFLCAweERDLCAweERCLCAweEE5LCAweDg3LCAweDY2LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERDLAorICAgIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NjYsIDB4NTQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsCisgICAgMHhBOCwgMHg3NiwgMHg1NCwgMHgzNCwgMHg1NSwgMHg2NywgMHg5QSwgMHhCQywgMHhEQywgMHhDQywgMHhCQSwgMHg5OCwKKyAgICAweDY1LCAweDUzLCAweDM0LCAweDU2LCAweDc4LCAweDlBLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NTQsIDB4NTYsIDB4NjcsIDB4OTksIDB4QkMsIDB4REQsIDB4Q0MsIDB4Q0EsIDB4OTgsIDB4NzcsIDB4NjUsIDB4NTYsCisgICAgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhEQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg4OCwKKyAgICAweDlBLCAweEJELCAweEVELCAweENELCAweENCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLCAweEJDLAorICAgIDB4REUsIDB4RUMsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QkIsIDB4Q0QsIDB4RUUsCisgICAgMHhERSwgMHhEQywgMHhDQiwgMHhBQSwgMHhBQSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDRSwgMHhFRiwgMHhGRCwgMHhFRSwKKyAgICAweERELCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERFLCAweEZGLCAweERFLCAweEVELCAweERELAorICAgIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RUQsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERSwgMHhFRiwgMHhGRiwgMHhGRSwgMHg3QywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywKKyAgICAweERELCAweERELCAweEVFLCAweEZFLCAweEQwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhBQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHg4QiwgMHhEQywKKyAgICAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweENDLCAweENELCAweEVCLCAweEJDLCAweEJCLCAweEFBLAorICAgIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4QkIsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTgsCisgICAgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhDQiwgMHhBQiwgMHhBQSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEFCLCAweEJDLCAweEJBLCAweEJBLCAweDk5LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LAorICAgIDB4OUEsIDB4QUIsIDB4Q0IsIDB4QUEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsCisgICAgMHhCQiwgMHhCQSwgMHhBOSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg1NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwgMHhCQiwKKyAgICAweEFBLCAweDk4LCAweDg3LCAweDY2LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEFCLCAweEFBLCAweEE5LAorICAgIDB4ODgsIDB4NzYsIDB4NTUsIDB4NDUsIDB4NTYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4OTgsIDB4ODcsCisgICAgMHg2NiwgMHg1NSwgMHg0NSwgMHg1NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEJBLCAweEFBLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDU2LAorICAgIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QkEsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQSwgMHhCQiwgMHhBQiwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEJDLCAweEJBLCAweEJCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDlBLCAweEFCLCAweENCLAorICAgIDB4QkMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTgsIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0MsIDB4QkIsIDB4Q0MsCisgICAgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhEQywgMHhCRCwgMHhDQywgMHhCQiwKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJDLCAweERELCAweENCLCAweERDLCAweENDLCAweENCLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4RUMsIDB4OEIsIDB4QkIsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsCisgICAgMHhBQiwgMHhCQiwgMHhCQywgMHhDQywgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QUIsIDB4QkEsIDB4QUEsIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUEsIDB4QkIsIDB4OEIsIDB4Q0IsCisgICAgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDQiwgMHhCQiwgMHhCQSwgMHhBQSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJCLCAweENDLCAweEJBLCAweEJBLCAweEE5LCAweDk4LCAweDg4LAorICAgIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0IsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzcsIDB4NzgsCisgICAgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDk5LCAweEFBLCAweEJBLCAweDlBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4QTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkEsCisgICAgMHg5QSwgMHg5OCwgMHg3NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQSwgMHhBOSwgMHhBOSwKKyAgICAweDg3LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDY3LCAweDc4LCAweDlBLCAweEFBLCAweDlBLCAweDk4LCAweDc3LAorICAgIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsIDB4QTksIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc4LCAweDg5LCAweEFCLCAweEE5LCAweEE5LCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODgsIDB4OUEsIDB4QkEsIDB4QUEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksCisgICAgMHhBQiwgMHhBQSwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhCQiwKKyAgICAweEFCLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFBLCAweEJDLCAweEJBLCAweENCLAorICAgIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QkMsIDB4Q0IsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDRCwgMHhDQiwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQSwKKyAgICAweEFBLCAweEFCLCAweEJCLCAweEJDLCAweENDLCAweERDLCAweDhCLCAweEJCLCAweEFBLCAweEFBLCAweEFBLCAweEFBLAorICAgIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0MsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEFDLCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEFBLCAweEJCLCAweEJCLCAweDhDLCAweERDLAorICAgIDB4Q0IsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4QkMsIDB4Q0QsIDB4REMsIDB4QkMsIDB4Q0IsIDB4QkEsCisgICAgMHhBOSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhDQiwgMHhDQiwgMHhBQSwgMHg5OSwgMHg5OCwKKyAgICAweDg5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweENCLCAweEJCLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkIsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsCisgICAgMHg5QSwgMHhBQiwgMHhDQiwgMHhBQSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweEJBLCAweEE5LCAweDk4LCAweDc2LCAweDY2LCAweDU2LCAweDY2LCAweDc3LCAweDg5LCAweEFBLCAweEJCLAorICAgIDB4QUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OTksIDB4QUIsIDB4QkEsIDB4QTksCisgICAgMHg4OCwgMHg3NiwgMHg1NSwgMHg0NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQiwgMHhBQSwgMHg5OCwgMHg4NywKKyAgICAweDY2LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDg5LCAweEFCLCAweEJBLCAweEE5LCAweDk4LCAweDc2LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkIsIDB4QUEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NTYsCisgICAgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQiwgMHhCQSwgMHhCQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFBLCAweENCLCAweEFCLCAweEFBLCAweDk5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg5LCAweDlBLAorICAgIDB4QkMsIDB4QkIsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4OUEsIDB4QUIsIDB4Q0IsCisgICAgMHhCQywgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhDQiwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweEE5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweERDLCAweEJELCAweENDLCAweEJCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0QsIDB4REQsIDB4REMsIDB4REQsIDB4Q0MsIDB4Q0IsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERSwgMHhFRCwgMHg4QywgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhBQiwKKyAgICAweEJCLCAweEJDLCAweENDLCAweENELCAweEIwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRSwgMHhEQywgMHhDQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhCQywgMHhDQywgMHg3RCwgMHhGRSwKKyAgICAweERELCAweENDLCAweENCLCAweEJCLCAweEJDLCAweENDLCAweERELCAweEVFLCAweEZELCAweERFLCAweERDLCAweENCLAorICAgIDB4QkIsIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4REQsIDB4REQsIDB4Q0IsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5QSwgMHhBQiwgMHhDQywgMHhERCwgMHhGRCwgMHhDRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDk5LCAweEFCLCAweEJDLCAweERELCAweENDLCAweENCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4QkQsIDB4REMsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QUIsCisgICAgMHhDRCwgMHhEQiwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhEQywKKyAgICAweENCLCAweEE5LCAweDg3LCAweDY1LCAweDU0LCAweDU1LCAweDY3LCAweDc4LCAweDlCLCAweEJDLCAweENCLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4QkIsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhDQiwgMHg5OCwgMHg3NywgMHg2NSwKKyAgICAweDU0LCAweDU1LCAweDY3LCAweDg5LCAweEFDLCAweENDLCAweEJDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4OUEsIDB4QkQsIDB4Q0MsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzcsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwgMHhCQiwKKyAgICAweENELCAweERDLCAweERDLCAweEJBLCAweEE5LCAweDk4LCAweDg4LCAweDg5LCAweDk5LCAweEFCLCAweENELCAweERELAorICAgIDB4REUsIDB4REMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4QUEsIDB4QUIsIDB4Q0MsIDB4REUsIDB4RkMsIDB4REQsCisgICAgMHhEQywgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhERiwgMHhFRSwgMHhERSwgMHhERSwgMHhEQywKKyAgICAweENDLCAweENCLCAweEJDLCAweEJDLCAweENELCAweERFLCAweEZGLCAweEVELCAweEZFLCAweEVELCAweERELCAweENDLAorICAgIDB4Q0QsIDB4Q0MsIDB4REUsIDB4REUsIDB4RkYsIDB4RkYsIDB4OEMsIDB4Q0MsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsCisgICAgMHhERCwgMHhDRCwgMHhERSwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RUYsIDB4RkYsIDB4RUUsIDB4RUQsIDB4RUQsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4OEYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRCwgMHhFRCwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhFRSwKKyAgICAweERELCAweERDLCAweENELCAweERELCAweERELCAweEZGLCAweEZGLCAweERFLCAweEZGLCAweEVELCAweERDLCAweENCLAorICAgIDB4QkIsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RkYsIDB4RkQsIDB4RUYsIDB4RUUsIDB4REMsIDB4QkIsIDB4QUEsIDB4QUEsCisgICAgMHhCQiwgMHhDRCwgMHhERSwgMHhGRiwgMHhFRiwgMHhGRSwgMHhEQiwgMHhCQSwgMHg5OCwgMHg4OCwgMHg5OSwgMHhBQiwKKyAgICAweENDLCAweERFLCAweEZGLCAweEVGLCAweERELCAweEI5LCAweDg3LCAweDc3LCAweDc3LCAweDg5LCAweEFCLCAweENFLAorICAgIDB4RUYsIDB4RUQsIDB4RUQsIDB4Q0EsIDB4OTcsIDB4NjYsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUMsIDB4REQsIDB4RkYsCisgICAgMHhERCwgMHhEQiwgMHhBOCwgMHg3NSwgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCRCwgMHhGRiwgMHhFRCwgMHhFQywKKyAgICAweEJBLCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDc4LCAweEFCLCAweERFLCAweEZFLCAweERELCAweENCLCAweEE4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTcsIDB4OEEsIDB4QkQsIDB4RkUsIDB4RkQsIDB4RUMsIDB4Q0EsIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg0NSwgMHg3OCwgMHhBQywgMHhERiwgMHhGRiwgMHhERSwgMHhEQywgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDlBLCAweENELCAweEZGLCAweEZELCAweEZELCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDhBLAorICAgIDB4QkQsIDB4RUYsIDB4RkYsIDB4Q0YsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODgsIDB4ODgsIDB4OUEsIDB4QkMsIDB4REUsCisgICAgMHhGRiwgMHhFRCwgMHhGRCwgMHhFRCwgMHhDQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQywgMHhERSwgMHhFRSwgMHhGRiwKKyAgICAweERFLCAweEZELCAweERELCAweENCLCAweEJCLCAweEJCLCAweENDLCAweEVFLCAweEZGLCAweEZGLCAweEZELCAweEZFLAorICAgIDB4RUUsIDB4REQsIDB4REQsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4REYsIDB4RUUsIDB4RUUsCisgICAgMHhERCwgMHhFRCwgMHhERCwgMHhFRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhFRSwgMHhFRSwgMHhFRiwgMHhFRiwKKyAgICAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdDLCAweENDLCAweENDLCAweERELCAweERELCAweERFLAorICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEVGLCAweEVGLCAweEVELCAweERELCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweDhGLCAweEZGLAorICAgIDB4RUYsIDB4REQsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4REUsIDB4RUUsIDB4RUQsIDB4RUYsIDB4RUQsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHhFRSwgMHhERSwgMHhGRSwgMHhEQywgMHhCQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJCLCAweENDLCAweERELCAweEZELCAweEVFLCAweERDLCAweEJBLCAweDk5LCAweDk5LCAweDk5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0QsIDB4REUsIDB4REQsIDB4REQsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhBQiwgMHhDRCwgMHhFRCwgMHhERCwgMHhDQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweERFLCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweEVFLAorICAgIDB4Q0MsIDB4QkEsIDB4OTcsIDB4NjUsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0UsIDB4REMsIDB4Q0IsCisgICAgMHhBOSwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg5QSwgMHhCQywgMHhFRCwgMHhDQywgMHhCQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweEFCLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4OUEsIDB4QkMsIDB4RUUsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQywgMHhERSwgMHhFQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDlCLCAweENELCAweEVFLCAweENELCAweENCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLCAweEJELAorICAgIDB4RUYsIDB4RkMsIDB4REMsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTgsIDB4OTksIDB4OUEsIDB4QkMsIDB4REYsIDB4RkYsCisgICAgMHhDRSwgMHhEQywgMHhDQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhERSwgMHhGRiwgMHhGQywgMHhFRCwKKyAgICAweERELCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweENELCAweERFLCAweEVGLCAweEZGLCAweENFLCAweEVELCAweERELAorICAgIDB4REMsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RkUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhERCwgMHhFRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERSwKKyAgICAweEVGLCAweEVGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhERiwgMHhFRSwgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDQywgMHhDQywgMHhBRiwgMHhGRSwKKyAgICAweEVELCAweENDLCAweEJCLCAweEJCLCAweEJCLCAweENDLCAweENELCAweERFLCAweEVELCAweEVGLCAweERELCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4REUsIDB4REQsIDB4RUQsIDB4Q0IsIDB4QUEsIDB4OTksCisgICAgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhFRCwgMHhERCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEJDLCAweENELCAweERDLCAweENCLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4OUEsIDB4QkMsIDB4REMsIDB4Q0MsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUIsCisgICAgMHhDQywgMHhDQywgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwgMHhDQywKKyAgICAweEJCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweENCLCAweEJBLAorICAgIDB4OTgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0MsIDB4QkIsIDB4QTksIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhDQiwgMHhCQSwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU1LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweERELCAweEJCLCAweEE5LCAweDg3LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REIsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzgsCisgICAgMHg5QSwgMHhCQywgMHhERCwgMHhDQywgMHhCQSwgMHg5OSwgMHg4NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwgMHhBQiwKKyAgICAweENELCAweEVDLCAweENDLCAweEJBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweEFCLCAweENELCAweEVFLAorICAgIDB4Q0QsIDB4Q0IsIDB4QkEsIDB4QTksIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4RUYsIDB4RUMsIDB4REQsCisgICAgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhDRCwgMHhERiwgMHhGRiwgMHhDRSwgMHhERCwgMHhDQywKKyAgICAweENCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweEVGLCAweEZGLCAweEZDLCAweEVFLCAweERELCAweERELCAweENDLAorICAgIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkYsIDB4QUQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsCisgICAgMHhERCwgMHhFRSwgMHhFRiwgMHhGRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4REYsIDB4RkUsIDB4RUQsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4OEYsIDB4RkYsCisgICAgMHhGRSwgMHhERCwgMHhEQywgMHhDQywgMHhERCwgMHhERCwgMHhERCwgMHhFRSwgMHhFQywgMHhFRiwgMHhFRSwgMHhEQywKKyAgICAweENCLCAweEJCLCAweEJCLCAweEJDLCAweENDLCAweERELCAweEVGLCAweERFLCAweEVFLCAweERDLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0MsIDB4REQsIDB4RUQsIDB4RUUsIDB4REMsIDB4QkEsIDB4OTksIDB4OTksIDB4OTksCisgICAgMHg5QSwgMHhBQiwgMHhDQywgMHhERSwgMHhERCwgMHhFQywgMHhCQSwgMHg5OCwgMHg4NywgMHg3NywgMHg4OCwgMHg5QSwKKyAgICAweEFCLCAweENELCAweERELCAweERELCAweENCLCAweEE4LCAweDc3LCAweDY2LCAweDY3LCAweDc4LCAweDlBLCAweEJDLAorICAgIDB4Q0QsIDB4REQsIDB4REMsIDB4QTksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4Q0MsIDB4REQsCisgICAgMHhDQywgMHhCQSwgMHg5NywgMHg2NSwgMHg1NCwgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhEQywgMHhDQiwKKyAgICAweEE5LCAweDc2LCAweDU0LCAweDQ0LCAweDQ1LCAweDY3LCAweDlBLCAweEJDLCAweERELCAweENDLCAweEJBLCAweDk3LAorICAgIDB4NjUsIDB4NDQsIDB4NDQsIDB4NTYsIDB4NzgsIDB4QUIsIDB4Q0QsIDB4REMsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NjUsCisgICAgMHg0NCwgMHg1NSwgMHg2NywgMHg5QSwgMHhCQywgMHhFRSwgMHhDQywgMHhDQSwgMHg5OCwgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY3LCAweDg5LCAweEFCLCAweERFLCAweERELCAweERDLCAweEJBLCAweDk4LCAweDc3LCAweDY2LCAweDY3LCAweDc4LAorICAgIDB4OUIsIDB4Q0QsIDB4RUUsIDB4Q0QsIDB4Q0IsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsIDB4QkMsCisgICAgMHhFRiwgMHhFQywgMHhERCwgMHhDQiwgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhERSwgMHhGRSwKKyAgICAweENFLCAweERDLCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweERFLCAweEVGLCAweEZDLCAweEVELAorICAgIDB4REMsIDB4Q0MsIDB4QkIsIDB4QkIsIDB4QkIsIDB4Q0MsIDB4REUsIDB4RUYsIDB4RkYsIDB4Q0UsIDB4RUQsIDB4REQsCisgICAgMHhEQywgMHhDQywgMHhDQywgMHhERCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRSwgMHhFRSwgMHhERCwgMHhERCwKKyAgICAweERELCAweERELCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweDhDLCAweENDLCAweENDLCAweERDLCAweERELCAweERELAorICAgIDB4REUsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEVGLCAweEZGLCAweEZGLCAweEZELCAweEVELCAweERELCAweERDLCAweENDLCAweENDLCAweENDLCAweDdGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4REUsIDB4REYsIDB4REUsIDB4RUYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhFRCwgMHhERCwgMHhDQywgMHhDRCwgMHhFRSwgMHhFRSwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhDQywKKyAgICAweEJDLCAweEJCLCAweENELCAweERELCAweEVGLCAweEZELCAweEZGLCAweEZFLCAweEVDLCAweEJBLCAweEFBLCAweEFBLAorICAgIDB4QkIsIDB4Q0MsIDB4REYsIDB4RUYsIDB4REYsIDB4RkYsIDB4REMsIDB4QkEsIDB4OTgsIDB4ODgsIDB4OTksIDB4QUIsCisgICAgMHhDQywgMHhFRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhCQSwgMHg4NywgMHg3NywgMHg3NywgMHg4OSwgMHhBQiwgMHhERCwKKyAgICAweEVGLCAweERGLCAweEZGLCAweENBLCAweDk3LCAweDY1LCAweDU1LCAweDY3LCAweDg5LCAweEJDLCAweERGLCAweEZFLAorICAgIDB4RUYsIDB4REMsIDB4QTgsIDB4NzUsIDB4NDQsIDB4NDUsIDB4NjcsIDB4OUEsIDB4QkQsIDB4RUYsIDB4RkUsIDB4RkQsCisgICAgMHhDQSwgMHg4NywgMHg1NCwgMHgzMywgMHg0NSwgMHg3OCwgMHhBQiwgMHhDRiwgMHhGRiwgMHhERiwgMHhEQywgMHhBOCwKKyAgICAweDc1LCAweDQzLCAweDM0LCAweDU3LCAweDhBLCAweENELCAweEVGLCAweEVELCAweEZELCAweENBLCAweDk3LCAweDY1LAorICAgIDB4NDQsIDB4NDUsIDB4NzgsIDB4QUIsIDB4REYsIDB4RkYsIDB4RUYsIDB4REMsIDB4QjksIDB4ODcsIDB4NjUsIDB4NTUsCisgICAgMHg2OCwgMHg5QiwgMHhDRiwgMHhGRiwgMHhGRCwgMHhFRSwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg3OCwgMHg5QSwKKyAgICAweENELCAweEZGLCAweEZGLCAweERGLCAweEVELCAweENCLCAweEE5LCAweDk4LCAweDg4LCAweDlBLCAweEJDLCAweERGLAorICAgIDB4RkYsIDB4RkQsIDB4RkQsIDB4REMsIDB4Q0IsIDB4QUEsIDB4QUEsIDB4QUEsIDB4Q0QsIDB4REYsIDB4RkYsIDB4RkYsCisgICAgMHhERiwgMHhGRCwgMHhERCwgMHhDQywgMHhDQiwgMHhDQywgMHhDRCwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRSwKKyAgICAweEZFLCAweERELCAweERDLCAweERELCAweERELCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEZFLCAweEVFLAorICAgIDB4RUUsIDB4REUsIDB4RUUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RCwgMHhDQywgMHhDRCwgMHhERSwgMHhFRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhFRiwgMHhGRiwgMHhERiwgMHhERSwgMHhERCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHg3RiwgMHhGRiwKKyAgICAweEVGLCAweEZGLCAweEZELCAweEVFLCAweEZFLCAweERELCAweEVGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEVFLAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4Q0QsIDB4REYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkUsIDB4RUQsIDB4REMsIDB4Q0IsCisgICAgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRCwgMHhEQiwgMHhCQSwgMHhBQSwgMHhBQSwKKyAgICAweEJCLCAweENDLCAweERELCAweEZGLCAweEZGLCAweEZFLCAweERCLCAweEFBLCAweDk4LCAweDg5LCAweDk5LCAweEFCLAorICAgIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUMsIDB4Q0MsCisgICAgMHhGRiwgMHhGRCwgMHhGRCwgMHhDQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NywgMHg4OSwgMHhBQywgMHhDRCwgMHhGRSwKKyAgICAweERELCAweENCLCAweEE5LCAweDc2LCAweDU0LCAweDQ1LCAweDY3LCAweDlBLCAweENDLCAweERGLCAweERELCAweEVELAorICAgIDB4QkEsIDB4OTcsIDB4NjQsIDB4MjMsIDB4NDYsIDB4NzgsIDB4QUIsIDB4REQsIDB4RkYsIDB4REQsIDB4Q0IsIDB4QTksCisgICAgMHg3NiwgMHg0MywgMHgyNCwgMHg1NywgMHg5QSwgMHhDRCwgMHhGRiwgMHhGRSwgMHhEQywgMHhDQSwgMHg5OCwgMHg2NSwKKyAgICAweDQ0LCAweDU2LCAweDc4LCAweEFDLCAweERFLCAweEZELCAweERELCAweERDLCAweEFBLCAweDg3LCAweDY2LCAweDU2LAorICAgIDB4NzgsIDB4OUEsIDB4QkQsIDB4RkYsIDB4RkUsIDB4REQsIDB4Q0IsIDB4QTksIDB4ODcsIDB4NzcsIDB4NzgsIDB4OTksCisgICAgMHhCQywgMHhFRiwgMHhGRiwgMHhERiwgMHhFRCwgMHhDQiwgMHhBOSwgMHg5OCwgMHg4OSwgMHg5QSwgMHhCQywgMHhERCwKKyAgICAweEZGLCAweEZELCAweEZGLCAweEVDLCAweENCLCAweEJBLCAweEFBLCAweEFBLCAweEFDLCAweERFLCAweEVGLCAweEZGLAorICAgIDB4REYsIDB4RkUsIDB4Q0MsIDB4REMsIDB4QkIsIDB4QkIsIDB4QkMsIDB4REQsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsCisgICAgMHhERSwgMHhFRCwgMHhERCwgMHhDQywgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRSwgMHhGRiwKKyAgICAweEZGLCAweEVDLCAweEVELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEVELCAweEZFLAorICAgIDB4RUQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4Q0IsIDB4QkMsIDB4Q0QsIDB4REMsIDB4Q0YsCisgICAgMHhERiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkQsIDB4Q0MsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4OEQsIDB4REMsCisgICAgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhEQywgMHhDRCwgMHhDQiwgMHhBQSwKKyAgICAweEE5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweEJDLCAweENELCAweENCLCAweENCLCAweEJBLCAweDk5LCAweDk5LAorICAgIDB4ODksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4REIsIDB4QkMsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhBQiwgMHhDRCwgMHhCQiwgMHhCQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3OCwgMHg4OSwKKyAgICAweDlBLCAweEFCLCAweENCLCAweEFCLCAweEE5LCAweDg4LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweDlBLAorICAgIDB4QkMsIDB4QkEsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjYsIDB4NTYsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkIsCisgICAgMHhBQSwgMHg5OSwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQiwgMHhCQSwgMHhBOSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEJCLCAweEFBLCAweDk5LCAweDg3LAorICAgIDB4NjYsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkEsIDB4QTksIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg4OSwgMHg5QSwgMHhCQiwgMHhBQSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg1NiwKKyAgICAweDY2LCAweDc4LCAweDlBLCAweEFCLCAweEJBLCAweEJBLCAweDk5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4QUIsIDB4Q0MsIDB4QUIsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksIDB4OUEsCisgICAgMHhCQywgMHhDQSwgMHhDQiwgMHhBQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhCQywgMHhDQywKKyAgICAweEJDLCAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweDg4LCAweDk5LCAweDlBLCAweEJCLCAweENELCAweERCLCAweERDLAorICAgIDB4Q0IsIDB4QUEsIDB4QUEsIDB4OTksIDB4OUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4REQsIDB4QkQsIDB4Q0MsIDB4QkIsCisgICAgMHhCQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhDQywgMHhERSwgMHhEQiwgMHhERCwgMHhDQywgMHhDQiwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweENDLCAweENELCAweERFLCAweEVELCAweDhDLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4QkMsIDB4REQsIDB4REUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJDLCAweEJCLCAweEFBLCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweDlCLCAweENCLAorICAgIDB4QkEsIDB4QUEsIDB4QTksIDB4OTksIDB4OUEsIDB4QUEsIDB4QkIsIDB4QkMsIDB4REIsIDB4QkMsIDB4QkEsIDB4QTksCisgICAgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhCQSwgMHhCQSwgMHhBOSwgMHg5OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDk5LCAweDlBLCAweEFCLCAweENCLCAweEFCLCAweEE5LCAweDk4LCAweDg3LCAweDc3LCAweDc3LAorICAgIDB4ODgsIDB4ODksIDB4OUEsIDB4QkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsCisgICAgMHg4OSwgMHhBQSwgMHhCQSwgMHg5QSwgMHg5OCwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg3OCwgMHg5OSwKKyAgICAweEFCLCAweEE5LCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg4LCAweDlBLCAweEFBLAorICAgIDB4OTksIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjUsIDB4NTYsIDB4NjYsIDB4NzcsIDB4ODksIDB4OUEsIDB4QTksIDB4OTksCisgICAgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwgMHg2NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwgMHg5OSwgMHg5OCwgMHg3NywKKyAgICAweDY2LCAweDY1LCAweDU1LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEE5LCAweDk5LCAweDg3LCAweDc2LCAweDY2LAorICAgIDB4NjUsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsIDB4OUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg3NywgMHg4OSwgMHhBQSwgMHhBOSwgMHhBOSwgMHg5OCwgMHg3NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg4LCAweDlBLCAweEJBLCAweDlBLCAweEE5LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDk5LAorICAgIDB4QUIsIDB4QkEsIDB4QkEsIDB4OTksIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsCisgICAgMHhBQiwgMHhBQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQywgMHhCQSwgMHhCQiwKKyAgICAweEFBLCAweEE5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweENDLCAweEJDLCAweEJCLCAweEFBLAorICAgIDB4QUEsIDB4OTksIDB4OTksIDB4QUEsIDB4QUEsIDB4QkIsIDB4Q0QsIDB4Q0IsIDB4Q0MsIDB4Q0IsIDB4QkIsIDB4QUEsCisgICAgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQywgMHhDRCwgMHhERCwgMHg5QiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwKKyAgICAweEFBLCAweEJCLCAweEJDLCAweENELCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCRCwgMHhDQiwgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQiwgMHhCQiwgMHg4RCwgMHhEQywKKyAgICAweENCLCAweEJCLCAweEJBLCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweENELCAweERCLCAweENDLCAweENCLCAweEFBLAorICAgIDB4QUEsIDB4OTksIDB4OUEsIDB4QUEsIDB4QUIsIDB4QkIsIDB4Q0QsIDB4QkMsIDB4Q0IsIDB4QUEsIDB4OTksIDB4OTgsCisgICAgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhCQywgMHhEQiwgMHhCQiwgMHhCQSwgMHg5OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg5LCAweDlBLCAweEFCLCAweEJDLCAweEJCLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LAorICAgIDB4OUEsIDB4QkIsIDB4Q0IsIDB4QUIsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzcsIDB4ODksIDB4OUEsCisgICAgMHhCQiwgMHhCQSwgMHhCOSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg1NiwgMHg2NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhCQiwKKyAgICAweEFBLCAweDk5LCAweDg3LCAweDY1LCAweDU1LCAweDU1LCAweDY3LCAweDc4LCAweDlBLCAweEFCLCAweEJBLCAweEE5LAorICAgIDB4ODgsIDB4NzYsIDB4NTUsIDB4NDQsIDB4NTYsIDB4NjcsIDB4ODksIDB4OUEsIDB4QkIsIDB4QUEsIDB4OTksIDB4ODcsCisgICAgMHg2NiwgMHg1NCwgMHg0NSwgMHg1NiwgMHg3OCwgMHg4OSwgMHhBQiwgMHhCQSwgMHhBQSwgMHg5OCwgMHg3NywgMHg2NSwKKyAgICAweDU1LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEJCLCAweEFBLCAweEE5LCAweDg4LCAweDc2LCAweDY2LCAweDU2LAorICAgIDB4NjYsIDB4NzgsIDB4OTksIDB4QkIsIDB4QkEsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OSwgMHhBQiwgMHhDQiwgMHhBQiwgMHhBQSwgMHg5OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweENCLCAweEJCLCAweEFBLCAweDk5LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDlBLCAweEJDLCAweENDLAorICAgIDB4QkMsIDB4QkIsIDB4QUEsIDB4OTksIDB4OTksIDB4ODgsIDB4OTksIDB4OUEsIDB4QUIsIDB4Q0QsIDB4Q0IsIDB4Q0IsCisgICAgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERCwgMHhCRCwgMHhEQywgMHhCQiwKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEFCLCAweEJCLCAweENDLCAweERFLCAweERCLCAweERELCAweENDLCAweENCLCAweEJCLAorICAgIDB4QkIsIDB4QkMsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUQsIDB4OEIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsCisgICAgMHhCQiwgMHhCQywgMHhDRCwgMHhERCwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RUUsIDB4RkYsIDB4REYsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4N0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRCwgMHhERSwgMHhERCwgMHhERSwgMHhERSwgMHhFRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhFRCwKKyAgICAweENELCAweENDLCAweENDLCAweERDLCAweERELCAweEVFLCAweEZGLCAweERGLCAweEZGLCAweERFLCAweENDLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkMsIDB4REQsIDB4RkUsIDB4RkUsIDB4RkYsIDB4RUQsIDB4Q0IsIDB4QUEsIDB4OTksIDB4QUEsCisgICAgMHhBQSwgMHhCQywgMHhDRSwgMHhFRiwgMHhFRSwgMHhFRCwgMHhDQiwgMHhBOSwgMHg4OCwgMHg4OCwgMHg4OSwgMHhBQiwKKyAgICAweENDLCAweERFLCAweEZGLCAweERGLCAweERCLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDg5LCAweEFCLCAweENELAorICAgIDB4REUsIDB4RUQsIDB4RkMsIDB4QkEsIDB4OTcsIDB4NjYsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0UsIDB4RUQsCisgICAgMHhERSwgMHhDQiwgMHhBOCwgMHg3NSwgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCQywgMHhERSwgMHhFRCwgMHhFQywKKyAgICAweEI5LCAweDg3LCAweDU0LCAweDMzLCAweDQ1LCAweDc4LCAweEFCLCAweENFLCAweEZGLCAweERFLCAweENCLCAweDk4LAorICAgIDB4NzUsIDB4NDMsIDB4MzQsIDB4NTcsIDB4ODksIDB4QkMsIDB4REUsIDB4RkQsIDB4REMsIDB4QkEsIDB4OTcsIDB4NjUsCisgICAgMHg0NCwgMHg0NiwgMHg3OCwgMHhBQiwgMHhDRCwgMHhGRSwgMHhERSwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NiwKKyAgICAweDY3LCAweDlBLCAweEJDLCAweERGLCAweERELCAweEVELCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDg5LAorICAgIDB4QUMsIDB4REYsIDB4RkYsIDB4RUYsIDB4REMsIDB4QkIsIDB4QTksIDB4ODgsIDB4ODgsIDB4OTksIDB4QUIsIDB4Q0QsCisgICAgMHhGRiwgMHhGRiwgMHhGRCwgMHhEQywgMHhCQiwgMHhBQSwgMHg5OSwgMHg5QSwgMHhBQiwgMHhDRSwgMHhERiwgMHhGRiwKKyAgICAweERGLCAweEZELCAweERDLCAweEJCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweEVGLCAweEZGLCAweEZELCAweEZGLAorICAgIDB4REUsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4RUUsIDB4RkYsIDB4RkYsIDB4REYsIDB4RUYsIDB4RUUsCisgICAgMHhFRCwgMHhERCwgMHhERCwgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRSwgMHhFRiwgMHhGRSwgMHhFRSwKKyAgICAweEVGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdDLCAweENDLCAweERELCAweERELCAweEVELCAweERFLAorICAgIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERDLCAweENDLCAweENCLCAweEJCLCAweDdGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhERCwgMHhGRCwgMHhERiwgMHhGRiwgMHhERiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQywKKyAgICAweENDLCAweENELCAweEZGLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZDLCAweERCLCAweEJBLCAweEJCLAorICAgIDB4Q0IsIDB4REQsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4Q0IsIDB4QTksIDB4OTksIDB4OUEsIDB4QkMsCisgICAgMHhERCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwgMHg5OCwgMHg3NywgMHg3OCwgMHg5QSwgMHhCQywgMHhERCwKKyAgICAweEZELCAweEZGLCAweEZGLCAweERELCAweEE4LCAweDc2LCAweDU1LCAweDY4LCAweDlBLCAweEJDLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkMsIDB4QzksIDB4NzYsIDB4NTQsIDB4NDUsIDB4NjgsIDB4QUIsIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhDQSwgMHg5NywgMHg1NCwgMHgyMywgMHg0NSwgMHg3OSwgMHhCQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhCOSwKKyAgICAweDc2LCAweDQzLCAweDI0LCAweDU3LCAweDlBLCAweENGLCAweEZGLCAweEZGLCAweEZELCAweERCLCAweEE4LCAweDY1LAorICAgIDB4NDQsIDB4NTYsIDB4NzksIDB4QkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4QkEsIDB4ODcsIDB4NjUsIDB4NTYsCisgICAgMHg3OCwgMHhBQywgMHhERiwgMHhGRiwgMHhGRCwgMHhGQywgMHhGRCwgMHhCQSwgMHg4OCwgMHg3NywgMHg3OCwgMHg5QSwKKyAgICAweENELCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweERDLCAweEJBLCAweDk5LCAweDk5LCAweEFCLCAweENELCAweEZGLAorICAgIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkQsIDB4REMsIDB4QkIsIDB4QkEsIDB4QkIsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhERiwgMHhGRCwgMHhGRiwgMHhERCwgMHhEQywgMHhDQiwgMHhEQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhGRiwKKyAgICAweERGLCAweERELCAweEZELCAweEZELCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEZGLCAweEZELAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3QywgMHhDQiwgMHhERCwgMHhDRiwgMHhGRiwgMHhERiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhFRiwgMHhFRiwgMHhGRCwgMHhEQywgMHhEQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHg5RiwgMHhGRiwKKyAgICAweEZFLCAweERELCAweERDLCAweENDLCAweENDLCAweENDLCAweERELCAweERGLCAweEZELCAweEZGLCAweEZGLCAweENDLAorICAgIDB4Q0IsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkMsIDB4REMsIDB4RUYsIDB4RUYsIDB4RkQsIDB4REMsIDB4QkEsIDB4QUEsCisgICAgMHg5OSwgMHhBQSwgMHhBQiwgMHhDQywgMHhERSwgMHhGRCwgMHhGRSwgMHhEQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OSwKKyAgICAweDlBLCAweEFBLCAweENDLCAweERELCAweEVELCAweERDLCAweEJBLCAweDk4LCAweDg3LCAweDc3LCAweDc4LCAweDg5LAorICAgIDB4QUIsIDB4Q0QsIDB4RUUsIDB4REQsIDB4QkEsIDB4OTgsIDB4NzcsIDB4NjYsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUMsCisgICAgMHhDRCwgMHhERCwgMHhDQiwgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCQywgMHhFRCwKKyAgICAweERDLCAweEJBLCAweDg3LCAweDY1LCAweDU0LCAweDQ1LCAweDY2LCAweDc5LCAweEFCLCAweENELCAweEVDLCAweENCLAorICAgIDB4QTgsIDB4NzYsIDB4NTQsIDB4NDQsIDB4NTUsIDB4NjcsIDB4ODksIDB4QkQsIDB4RUUsIDB4Q0MsIDB4QkEsIDB4ODcsCisgICAgMHg2NSwgMHg1NCwgMHg0NCwgMHg1NiwgMHg3OCwgMHhBQiwgMHhERSwgMHhFQywgMHhDQiwgMHg5OCwgMHg3NiwgMHg2NSwKKyAgICAweDU0LCAweDU1LCAweDY3LCAweDhBLCAweEJDLCAweEZFLCAweENDLCAweEJBLCAweDk4LCAweDc2LCAweDY1LCAweDU1LAorICAgIDB4NjcsIDB4ODksIDB4QUIsIDB4REYsIDB4RkMsIDB4Q0IsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjcsIDB4NzgsCisgICAgMHg5QSwgMHhCRSwgMHhGRiwgMHhDQywgMHhDQiwgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3OCwgMHg5QSwgMHhCQywKKyAgICAweEZGLCAweEZDLCAweERELCAweEJCLCAweEFBLCAweDk5LCAweDg4LCAweDg5LCAweDlBLCAweEJDLCAweERGLCAweEZGLAorICAgIDB4REQsIDB4REMsIDB4QkIsIDB4QkEsIDB4QTksIDB4OUEsIDB4QUEsIDB4QkMsIDB4REUsIDB4RkYsIDB4RkMsIDB4RUQsCisgICAgMHhDQywgMHhDQywgMHhCQiwgMHhCQiwgMHhCQywgMHhDQywgMHhERSwgMHhGRiwgMHhGRiwgMHhERCwgMHhERCwgMHhFRCwKKyAgICAweERDLCAweERDLCAweERELCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEZGLCAweEZFLCAweERFLCAweERELAorICAgIDB4REQsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUMsIDB4REQsIDB4REQsIDB4REYsIDB4REUsIDB4RUUsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REQsIDB4REUsIDB4QkYsIDB4RkYsCisgICAgMHhGRSwgMHhEQywgMHhDQywgMHhCQiwgMHhCQywgMHhDQywgMHhERCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRCwgMHhDQywKKyAgICAweEJCLCAweEFBLCAweEFBLCAweEFCLCAweEJDLCAweENELCAweEVGLCAweEVGLCAweEZELCAweENCLCAweEFBLCAweDk5LAorICAgIDB4OTksIDB4OTksIDB4QUEsIDB4QkMsIDB4REQsIDB4RkUsIDB4RkUsIDB4Q0IsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODgsCisgICAgMHg4OSwgMHg5QSwgMHhCQywgMHhERiwgMHhERCwgMHhEQywgMHhBOSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg4OSwKKyAgICAweDlBLCAweEJDLCAweERELCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweEFCLAorICAgIDB4Q0QsIDB4REMsIDB4Q0IsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NTYsIDB4NzcsIDB4ODksIDB4QUMsIDB4REQsCisgICAgMHhDQywgMHhBOSwgMHg4NywgMHg2NSwgMHg1NSwgMHg1NSwgMHg2NiwgMHg3OCwgMHg5QSwgMHhCRCwgMHhEQywgMHhCQSwKKyAgICAweDk4LCAweDc2LCAweDU1LCAweDQ0LCAweDU1LCAweDY3LCAweDg5LCAweEFCLCAweERELCAweENCLCAweEE5LCAweDg3LAorICAgIDB4NjUsIDB4NTQsIDB4NDUsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkQsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsCisgICAgMHg1NSwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQywgMHhERSwgMHhDQywgMHhBOSwgMHg4NywgMHg3NiwgMHg2NSwgMHg1NSwKKyAgICAweDY2LCAweDc4LCAweDlCLCAweENELCAweEVDLCAweENCLCAweEE5LCAweDg3LCAweDc2LCAweDY2LCAweDY2LCAweDc4LAorICAgIDB4OUEsIDB4QkMsIDB4RUYsIDB4Q0MsIDB4QkEsIDB4OTksIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksIDB4QUMsCisgICAgMHhERiwgMHhGRCwgMHhEQywgMHhCQSwgMHg5OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg5OSwgMHhBQiwgMHhDRSwgMHhGRiwKKyAgICAweERELCAweERDLCAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweDlBLCAweEJCLCAweENELCAweEZGLCAweEZELCAweEVELAorICAgIDB4Q0MsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4REQsIDB4RkYsIDB4RkYsIDB4REYsIDB4RUQsIDB4REMsCisgICAgMHhDQywgMHhCQiwgMHhCQywgMHhDQywgMHhERSwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhFRSwgMHhERCwgMHhEQywKKyAgICAweERELCAweERELCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEJFLCAweEVELCAweERELCAweERELCAweERELCAweERELAorICAgIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweERELCAweEZELCAweEVDLCAweERDLCAweENELCAweENFLCAweDlGLCAweEZGLAorICAgIDB4RkYsIDB4RkQsIDB4REQsIDB4Q0MsIDB4REMsIDB4REQsIDB4REUsIDB4RUYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RUQsCisgICAgMHhEQywgMHhDQiwgMHhCQiwgMHhDQywgMHhDQywgMHhERCwgMHhFRiwgMHhERiwgMHhGRSwgMHhERCwgMHhDQiwgMHhBQSwKKyAgICAweEFBLCAweEFBLCAweEJDLCAweENELCAweERELCAweEZELCAweEZGLCAweERDLCAweEJBLCAweDk5LCAweDk4LCAweDk5LAorICAgIDB4OUEsIDB4QUIsIDB4Q0MsIDB4REQsIDB4REYsIDB4RUQsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4ODgsIDB4OUEsCisgICAgMHhBQiwgMHhDRCwgMHhGRCwgMHhFRCwgMHhDQiwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg3OCwgMHg5QSwgMHhBQywKKyAgICAweERELCAweERELCAweEVCLCAweEE5LCAweDg3LCAweDY1LCAweDU1LCAweDY2LCAweDc4LCAweDlBLCAweEJDLCAweERELAorICAgIDB4REQsIDB4QkEsIDB4OTcsIDB4NjUsIDB4NTQsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4REUsIDB4REQsIDB4Q0IsCisgICAgMHhBOSwgMHg3NiwgMHg1NCwgMHg0NCwgMHg0NSwgMHg2NywgMHg4QSwgMHhCQywgMHhGRCwgMHhERCwgMHhCQSwgMHg5NywKKyAgICAweDY1LCAweDQ0LCAweDQ0LCAweDU2LCAweDc4LCAweEFCLCAweENELCAweERELCAweERDLCAweEE5LCAweDg3LCAweDY1LAorICAgIDB4NDQsIDB4NTUsIDB4NjcsIDB4OUEsIDB4QkQsIDB4RUUsIDB4REQsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NjUsIDB4NTUsCisgICAgMHg2NywgMHg4OSwgMHhBQywgMHhERCwgMHhFRCwgMHhEQywgMHhCQSwgMHg5OCwgMHg3NywgMHg2NiwgMHg2NywgMHg3OCwKKyAgICAweDlCLCAweENGLCAweEZFLCAweERELCAweERCLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDg4LCAweDlBLCAweEJELAorICAgIDB4REYsIDB4RkQsIDB4REQsIDB4QkIsIDB4QTksIDB4OTksIDB4ODksIDB4ODksIDB4QUEsIDB4QkQsIDB4RUUsIDB4RkYsCisgICAgMHhERSwgMHhEQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCRCwgMHhERiwgMHhGRiwgMHhGRCwgMHhERCwKKyAgICAweERDLCAweENCLCAweEJCLCAweEJCLCAweEJDLCAweENELCAweERGLCAweEZGLCAweEZGLCAweERFLCAweERELCAweERDLAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4REQsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4REYsIDB4RkUsIDB4REUsCisgICAgMHhERCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5QywgMHhDQywgMHhEQywgMHhEQywgMHhERCwgMHhERCwKKyAgICAweERELCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhCQiwgMHhCQiwgMHhDQiwgMHg3RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkQsIDB4RkYsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsCisgICAgMHhDRCwgMHhEQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhCQiwgMHhDQywKKyAgICAweENDLCAweENELCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweENCLCAweEFBLCAweEE5LCAweEFCLCAweEJELAorICAgIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4QTksIDB4ODgsIDB4ODgsIDB4OUEsIDB4QkMsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhCOSwgMHg3NiwgMHg2NiwgMHg3OCwgMHg5QiwgMHhDRCwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweENBLCAweDg2LCAweDU0LCAweDQ1LCAweDc5LCAweEFCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkIsIDB4QTgsIDB4NjQsIDB4MjIsIDB4NDYsIDB4OEEsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QkEsCisgICAgMHg4NiwgMHg0MiwgMHgyNCwgMHg2OCwgMHhBQiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhCOCwgMHg3NSwKKyAgICAweDQ0LCAweDU2LCAweDhBLCAweENGLCAweEZGLCAweEZGLCAweERGLCAweEZELCAweENCLCAweDk4LCAweDc2LCAweDY3LAorICAgIDB4ODksIDB4QkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QkEsIDB4QTksIDB4ODgsIDB4ODksIDB4QkIsCisgICAgMHhDRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhDQywgMHhCQiwgMHhBQSwgMHhBQSwgMHhCQywgMHhERiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZELCAweENDLCAweENDLCAweEJDLCAweENDLCAweENGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4Q0YsIDB4RkQsIDB4RkYsIDB4Q0MsIDB4REQsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhERCwgMHhERiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwKKyAgICAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0IsIDB4Q0QsIDB4REMsIDB4Q0QsIDB4REYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4REYsIDB4RkQsIDB4Q0IsIDB4QkYsIDB4QkMsIDB4REMsIDB4QkEsIDB4Q0IsIDB4Q0IsIDB4N0YsIDB4REYsCisgICAgMHhERCwgMHhERiwgMHhDQywgMHhCQywgMHhGQywgMHhGQywgMHhGRiwgMHhGRiwgMHhGQywgMHhERCwgMHhGRiwgMHhERCwKKyAgICAweERDLCAweEZCLCAweERCLCAweENCLCAweENGLCAweERDLCAweEZGLCAweEJDLCAweEZGLCAweEZBLCAweEZCLCAweEZCLAorICAgIDB4QUIsIDB4Q0MsIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkMsIDB4QkIsIDB4QUEsIDB4QTksIDB4OUEsCisgICAgMHhCQiwgMHhDQywgMHhDQywgMHhGRiwgMHhDQywgMHhGRCwgMHhDQiwgMHg5QiwgMHg4OSwgMHg4OCwgMHg5OSwgMHhBQiwKKyAgICAweEFELCAweENELCAweEZGLCAweEZDLCAweEJBLCAweEFBLCAweDk3LCAweDc3LCAweDc4LCAweDg5LCAweEFBLCAweEJGLAorICAgIDB4RkYsIDB4Q0IsIDB4RkMsIDB4QjksIDB4OTcsIDB4NzYsIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsIDB4RkMsIDB4RkIsCisgICAgMHhCQywgMHhCQiwgMHhBOSwgMHg3NiwgMHg1NCwgMHg1NSwgMHg2NywgMHg4QSwgMHhBQywgMHhEQywgMHhERCwgMHhDQywKKyAgICAweEI5LCAweDk3LCAweDY0LCAweDIzLCAweDQ2LCAweDc4LCAweDlDLCAweENCLCAweEZDLCAweENGLCAweEJCLCAweEE4LAorICAgIDB4NzYsIDB4NDMsIDB4MjQsIDB4NjcsIDB4OTksIDB4QUMsIDB4Q0YsIDB4Q0YsIDB4QkMsIDB4QzksIDB4OTcsIDB4NjUsCisgICAgMHg0NCwgMHg1NiwgMHg3OCwgMHg5QSwgMHhDRCwgMHhGRiwgMHhEQywgMHhDQSwgMHhBOSwgMHg4NywgMHg2NiwgMHg2NiwKKyAgICAweDc4LCAweDlBLCAweEJCLCAweEZGLCAweEZGLCAweEZGLCAweENCLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDhBLAorICAgIDB4QkMsIDB4QkMsIDB4RkMsIDB4RkMsIDB4Q0YsIDB4Q0MsIDB4OTksIDB4OTgsIDB4ODgsIDB4OTksIDB4OUEsIDB4Q0YsCisgICAgMHhDRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhDQiwgMHhBQSwgMHg5QSwgMHhBOSwgMHhBQSwgMHhDRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZFLCAweEVDLCAweEFBLCAweEFCLCAweEFDLCAweENDLCAweERGLCAweEZGLCAweEZDLCAweERGLAorICAgIDB4Q0QsIDB4Q0QsIDB4QkMsIDB4Q0IsIDB4Q0YsIDB4RkIsIDB4REMsIDB4RkQsIDB4RkYsIDB4REYsIDB4RkYsIDB4REMsCisgICAgMHhGRCwgMHhEQywgMHhGQywgMHhERiwgMHhERCwgMHhDRiwgMHhGRiwgMHhGQSwgMHhEQywgMHhERiwgMHhGRCwgMHhGRCwKKyAgICAweENELCAweERGLCAweERGLCAweERELCAweERGLCAweEZGLCAweDZDLCAweEJCLCAweENDLCAweENDLCAweERCLCAweEZELAorICAgIDB4Q0YsIDB4RkYsIDB4REQsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEJDLCAweENCLCAweEFBLCAweEFBLCAweDk5LCAweDk5LCAweEE5LCAweEFBLCAweEFBLCAweEFCLCAweDhDLCAweENDLAorICAgIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIDB4Q0IsIDB4Q0QsIDB4REIsIDB4QkMsIDB4Q0EsIDB4QkEsCisgICAgMHg5QSwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBQSwgMHhCQiwgMHhDRSwgMHhDQiwgMHhCQiwgMHhBQSwgMHg5OSwgMHg5OCwKKyAgICAweDg4LCAweDg5LCAweDlBLCAweEFCLCAweEJDLCAweENCLCAweEJCLCAweEE5LCAweDk4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4OTksIDB4QUIsIDB4QkMsIDB4QkEsIDB4QkEsIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHg5QSwgMHhBQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg4NywgMHg3NywgMHg2NiwgMHg2NywgMHg3NywgMHg4OSwgMHg5QSwKKyAgICAweEJDLCAweEJBLCAweEE5LCAweDk4LCAweDc2LCAweDY2LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEJCLAorICAgIDB4QUEsIDB4OTgsIDB4ODcsIDB4NjYsIDB4NTUsIDB4NTYsIDB4NjcsIDB4NzgsIDB4ODksIDB4QUIsIDB4QkEsIDB4QTksCisgICAgMHg4OCwgMHg3NiwgMHg2NSwgMHg0NCwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQiwgMHg5QSwgMHg5OCwgMHg4NywKKyAgICAweDY2LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDg5LCAweEFBLCAweEI5LCAweEE5LCAweDg4LCAweDc3LCAweDY1LAorICAgIDB4NTUsIDB4NTYsIDB4NjcsIDB4ODgsIDB4OUEsIDB4QkIsIDB4OUEsIDB4QTksIDB4ODcsIDB4NzYsIDB4NjYsIDB4NTYsCisgICAgMHg2NiwgMHg3OCwgMHg5OSwgMHhBQiwgMHhCQSwgMHhCQSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywKKyAgICAweDg5LCAweEFCLCAweENCLCAweEFCLCAweEE5LCAweDk4LCAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkMsIDB4REEsIDB4QkIsIDB4QTksIDB4OTgsIDB4ODgsIDB4ODcsIDB4ODgsIDB4ODgsIDB4OUEsIDB4QUIsIDB4Q0IsCisgICAgMHhBQywgMHhCQSwgMHhBQSwgMHg5OSwgMHg5OCwgMHg4OCwgMHg4OSwgMHg5OSwgMHhBQiwgMHhDRCwgMHhDQSwgMHhDQiwKKyAgICAweEJBLCAweEJBLCAweEE5LCAweDk5LCAweDk5LCAweEFBLCAweEFCLCAweENDLCAweERDLCAweEJELCAweENDLCAweEJCLAorICAgIDB4QkEsIDB4QUEsIDB4QkEsIDB4QUEsIDB4QkIsIDB4QkUsIDB4RUQsIDB4Q0IsIDB4Q0MsIDB4REQsIDB4Q0IsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhDRCwgMHhGRSwgMHhGRSwgMHg4QywgMHhCQiwgMHhCQiwgMHhBQSwgMHhBQiwgMHhCQiwKKyAgICAweEJCLCAweENDLCAweENELCAweERELCAweEMwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhCQywgMHhCQiwgMHhBQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhBQiwgMHhCQywgMHhBQywgMHhDQywKKyAgICAweEJBLCAweEFBLCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweEJDLCAweERDLCAweEJDLCAweEJBLCAweEE5LAorICAgIDB4OTksIDB4OTgsIDB4OTksIDB4OTksIDB4OUEsIDB4QUIsIDB4QkMsIDB4QkIsIDB4QkEsIDB4QTksIDB4OTgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OSwgMHg5QSwgMHhBQiwgMHhDQiwgMHhBQiwgMHhBOSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywKKyAgICAweDg4LCAweDg5LCAweDlBLCAweEJCLCAweEJBLCAweEE5LCAweDk4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LAorICAgIDB4ODksIDB4OUEsIDB4QkEsIDB4QUEsIDB4OTgsIDB4ODcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4NzgsIDB4ODksCisgICAgMHhBQiwgMHhBOSwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBQSwKKyAgICAweDk5LCAweDk4LCAweDc3LCAweDY2LCAweDY1LCAweDY2LCAweDY2LCAweDc3LCAweDg5LCAweDlBLCAweEE5LCAweDk5LAorICAgIDB4ODcsIDB4NzYsIDB4NjUsIDB4NTUsIDB4NjYsIDB4NjcsIDB4NzgsIDB4OTksIDB4QUEsIDB4OTksIDB4ODgsIDB4NzcsCisgICAgMHg2NiwgMHg2NSwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg5QSwgMHhBOSwgMHg5OSwgMHg4NywgMHg3NiwgMHg2NiwKKyAgICAweDY1LCAweDY2LCAweDY3LCAweDc4LCAweDk5LCAweEFBLCAweDk5LCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NzcsIDB4ODksIDB4QUEsIDB4QTksIDB4QTksIDB4ODgsIDB4NzcsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NzcsCisgICAgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwgMHg5OSwKKyAgICAweEFCLCAweEJBLCAweEFBLCAweDk5LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDg4LCAweDk5LCAweEFCLCAweEJCLAorICAgIDB4QUIsIDB4QUEsIDB4OTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkMsIDB4Q0IsIDB4QkIsCisgICAgMHhBQSwgMHg5OSwgMHg5OSwgMHg5OCwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQywgMHhEQywgMHhCQywgMHhCQiwgMHhCQSwKKyAgICAweEFBLCAweDk5LCAweDk5LCAweDlBLCAweEFCLCAweEJDLCAweENELCAweERDLCAweERDLCAweENCLCAweEJBLCAweEFBLAorICAgIDB4QUEsIDB4QUEsIDB4QUIsIDB4QkMsIDB4Q0QsIDB4RUQsIDB4QUMsIDB4QkIsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHhCQiwgMHhDQywgMHhERSwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4QkMsIDB4QkEsIDB4QkEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QkIsIDB4OEMsIDB4Q0MsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHhBQSwgMHhCQiwgMHhCQiwgMHhDRCwgMHhEQywgMHhEQiwgMHhCQywgMHhCQywgMHhBOSwKKyAgICAweDk5LCAweDk5LCAweDk5LCAweDlBLCAweEFBLCAweEJCLCAweENDLCAweEFCLCAweENBLCAweEFBLCAweDk4LCAweDg4LAorICAgIDB4ODgsIDB4ODksIDB4OTksIDB4QUEsIDB4Q0MsIDB4QkEsIDB4QkIsIDB4QTksIDB4OTgsIDB4ODgsIDB4NzgsIDB4ODgsCisgICAgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhBQSwgMHhBQSwgMHg5OCwgMHg4NywgMHg3NywgMHg3NywgMHg3NywgMHg4OCwKKyAgICAweDk5LCAweEFBLCAweEJBLCAweEJBLCAweDk4LCAweDg3LCAweDc2LCAweDY2LCAweDY3LCAweDc3LCAweDg4LCAweDlBLAorICAgIDB4QkEsIDB4QUEsIDB4QTksIDB4ODgsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NzcsIDB4ODgsIDB4QUEsIDB4QUEsCisgICAgMHhBQSwgMHg5OCwgMHg4NywgMHg2NiwgMHg1NSwgMHg1NiwgMHg2NywgMHg3OCwgMHg5OSwgMHhBQSwgMHhBQSwgMHhBOSwKKyAgICAweDg4LCAweDc2LCAweDY1LCAweDQ0LCAweDU2LCAweDY3LCAweDg4LCAweDlBLCAweEFBLCAweDlBLCAweDk4LCAweDg3LAorICAgIDB4NjYsIDB4NTQsIDB4NDUsIDB4NjYsIDB4NzgsIDB4ODksIDB4QUIsIDB4QUEsIDB4QjksIDB4OTgsIDB4NzYsIDB4NjYsCisgICAgMHg1NSwgMHg1NiwgMHg2NywgMHg4OCwgMHg5QSwgMHhCQSwgMHhBQSwgMHg5OSwgMHg4OCwgMHg3NywgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDc4LCAweDk5LCAweEFCLCAweEJBLCAweEFBLCAweDk4LCAweDg3LCAweDc3LCAweDY2LCAweDY2LCAweDc3LAorICAgIDB4ODksIDB4OUEsIDB4QkIsIDB4QUIsIDB4QTksIDB4OTgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksIDB4OUEsCisgICAgMHhCQiwgMHhBQiwgMHhEQSwgMHhBOSwgMHg5OCwgMHg4OCwgMHg3NywgMHg4OCwgMHg4OCwgMHg5QSwgMHhBQywgMHhCQiwKKyAgICAweEJDLCAweEFCLCAweEE5LCAweDk5LCAweDk4LCAweDg4LCAweDg5LCAweDlBLCAweEFBLCAweEJELCAweENCLCAweEJCLAorICAgIDB4QkIsIDB4QTksIDB4QTksIDB4OTksIDB4OTksIDB4QUEsIDB4QUMsIDB4QkMsIDB4Q0MsIDB4QkMsIDB4Q0MsIDB4QkEsCisgICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhCQywgMHhDRCwgMHhDQiwgMHhDRCwgMHhCQiwgMHhDQiwgMHhCQSwKKyAgICAweEJCLCAweEJCLCAweEFDLCAweEJCLCAweERELCAweERELCAweDdBLCAweEFBLCAweEFBLCAweEJBLCAweEFBLCAweEFBLAorICAgIDB4QUIsIDB4QkIsIDB4QkIsIDB4Q0QsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEJGLCAweERGLCAweEJCLCAweEFCLCAweEJGLCAweDZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhDQywgMHhGRCwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywKKyAgICAweEJCLCAweERGLCAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJDLCAweEJGLAorICAgIDB4Q0YsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4QkIsIDB4QkEsIDB4QUIsIDB4RkMsCisgICAgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEQywgMHhDQSwgMHg5OSwgMHg5OSwgMHhBQywgMHhERiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweENELCAweEJBLCAweDg3LCAweDc3LCAweDg5LCAweDlCLCAweEJGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4Q0IsIDB4OTcsIDB4NTQsIDB4NDYsIDB4OEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhDRCwgMHhBOSwgMHg2NCwgMHgxMiwgMHg1NywgMHg5QiwgMHhCRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQSwKKyAgICAweDk3LCAweDUyLCAweDI0LCAweDc5LCAweEFCLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEE5LCAweDg2LAorICAgIDB4NTQsIDB4NTcsIDB4OUIsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkMsIDB4Q0MsIDB4QTksIDB4ODcsIDB4NzcsCisgICAgMHg4QSwgMHhBQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQiwgMHg5OSwgMHg5OSwgMHg5QSwgMHhBRiwKKyAgICAweENGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEJGLCAweEFDLCAweEJBLCAweEFBLCAweENDLCAweEJGLCAweEZGLAorICAgIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4QkMsIDB4QkIsIDB4REYsIDB4REQsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhERiwgMHhGRiwgMHhERiwgMHhGQywgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZELCAweEZELCAweERGLCAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEZGLCAweEZELAorICAgIDB4REYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QiwgMHhDRiwgMHhERiwgMHhERiwgMHhGRiwgMHhDRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhBRiwgMHhGRiwgMHhCRiwgMHhBQiwgMHhGQiwgMHg5RiwgMHhCQiwgMHhBQiwgMHg2QiwgMHhGRiwKKyAgICAweEZCLCAweEZGLCAweEFGLCAweEFBLCAweEZCLCAweEZBLCAweEJCLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweEJGLAorICAgIDB4QjksIDB4RkIsIDB4QkEsIDB4QkIsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RkEsIDB4RkIsIDB4QkIsCisgICAgMHhBQSwgMHhGRiwgMHhGQSwgMHhCRiwgMHhCRiwgMHhGRiwgMHhCRiwgMHhGQSwgMHhBRiwgMHhCQiwgMHg5OSwgMHg5QSwKKyAgICAweEE5LCAweEJGLCAweEZCLCAweEZCLCAweEFCLCAweEZCLCAweEJBLCAweEE5LCAweDk4LCAweDlBLCAweDk5LCAweEFBLAorICAgIDB4RkIsIDB4QkIsIDB4RkYsIDB4QUYsIDB4RkEsIDB4QUEsIDB4OTgsIDB4NzgsIDB4NzgsIDB4ODksIDB4QUYsIDB4QkYsCisgICAgMHhBRiwgMHhGQiwgMHhCRiwgMHhCQSwgMHg5OSwgMHg3NiwgMHg2NiwgMHg4OCwgMHg5OSwgMHhCRiwgMHhGRiwgMHhCRiwKKyAgICAweEZGLCAweEZBLCAweDk4LCAweDc3LCAweDU0LCAweDU2LCAweDc5LCAweDlCLCAweEJGLCAweEJCLCAweEJCLCAweEFGLAorICAgIDB4QUIsIDB4QTgsIDB4NjQsIDB4MjIsIDB4NTcsIDB4ODgsIDB4OUEsIDB4RkYsIDB4QUIsIDB4QUYsIDB4OTksIDB4QjgsCisgICAgMHg3NywgMHg1MiwgMHgyNSwgMHg3OSwgMHhBOSwgMHhBQSwgMHhGRiwgMHhGQSwgMHhCQiwgMHhCQSwgMHg5OCwgMHg3NiwKKyAgICAweDU0LCAweDY2LCAweDc4LCAweDk5LCAweEJGLCAweEZCLCAweDlGLCAweEZBLCAweDlBLCAweDk4LCAweDc2LCAweDY2LAorICAgIDB4NzgsIDB4OEEsIDB4RkEsIDB4QUIsIDB4QUYsIDB4RkIsIDB4QkEsIDB4QjgsIDB4OTgsIDB4ODgsIDB4NzgsIDB4OUEsCisgICAgMHhBQiwgMHhGRiwgMHhGQiwgMHhBRiwgMHhCRiwgMHhCQSwgMHhBQSwgMHg5OSwgMHhBOSwgMHg5RiwgMHg4QSwgMHhGQSwKKyAgICAweEZGLCAweEFBLCAweEZGLCAweEJCLCAweEFGLCAweEE5LCAweEE4LCAweDg5LCAweEFCLCAweEZBLCAweEJCLCAweEZGLAorICAgIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkIsIDB4QTksIDB4QUIsIDB4QUYsIDB4QkYsIDB4QkIsIDB4QkIsIDB4QkIsIDB4RkYsCisgICAgMHhCRiwgMHhGQiwgMHhGRiwgMHhGQSwgMHhCRiwgMHhBRiwgMHhBRiwgMHhGQiwgMHhGRiwgMHhBRiwgMHhCRiwgMHhGRiwKKyAgICAweEZGLCAweEJCLCAweEZGLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkIsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkIsIDB4NkYsIDB4QUEsIDB4QUIsIDB4QUIsIDB4QkEsIDB4RkEsCisgICAgMHhGQSwgMHhCQiwgMHhGRiwgMHhGQiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsIDB4Q0MsIDB4Q0YsIDB4Q0QsIDB4Q0YsIDB4NkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweERDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkQsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4REMsCisgICAgMHhGQywgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERCwgMHhDQywgMHhEQywgMHhERCwKKyAgICAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEVCLCAweEJBLCAweEJCLCAweEJDLCAweERELCAweEZELAorICAgIDB4REYsIDB4RkMsIDB4RkYsIDB4REQsIDB4Q0IsIDB4OTgsIDB4NzgsIDB4OUEsIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhERiwgMHhGRiwgMHhGRCwgMHhCOCwgMHg1NCwgMHg0NiwgMHg5QiwgMHhDRCwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweENELCAweERBLCAweDc0LCAweDIyLCAweDQ4LCAweEFDLCAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLAorICAgIDB4QTcsIDB4NDIsIDB4MTQsIDB4N0EsIDB4REYsIDB4RkYsIDB4RkYsIDB4REQsIDB4RkYsIDB4RkQsIDB4REEsIDB4OTYsCisgICAgMHg0NCwgMHg1OCwgMHhCQywgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGQywgMHhEQSwgMHg5NywgMHg3OCwKKyAgICAweEFDLCAweERELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweEZDLCAweENBLCAweEFBLCAweEFCLCAweENGLAorICAgIDB4RkYsIDB4RkQsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkQsIDB4RkMsIDB4REMsIDB4QkMsIDB4Q0QsIDB4REYsIDB4REYsCisgICAgMHhGRiwgMHhGQywgMHhGRiwgMHhGRCwgMHhGRiwgMHhERiwgMHhDQywgMHhGRCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweERGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4REQsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZCLCAweERELCAweENELCAweERELCAweEZGLCAweERGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweERELCAweERELCAweENELCAweERELCAweERFLCAweERGLCAweEZGLCAweENGLCAweEZGLAorICAgIDB4RkYsIDB4REMsIDB4Q0MsIDB4Q0IsIDB4Q0MsIDB4QkQsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REMsCisgICAgMHhCQiwgMHhCQSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERiwgMHhFRiwgMHhGRiwgMHhGRCwgMHhDQywgMHhCQSwgMHg5OSwKKyAgICAweDk5LCAweDk5LCAweEFBLCAweEJDLCAweERGLCAweEZGLCAweEZFLCAweERDLCAweEFBLCAweDk4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4QUIsIDB4QkMsIDB4REUsIDB4RkYsIDB4REMsIDB4QjksIDB4OTgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4ODksCisgICAgMHhBQSwgMHhDQywgMHhGRiwgMHhGQywgMHhDQSwgMHg5OCwgMHg3NiwgMHg2NiwgMHg2NiwgMHg3NywgMHg4OSwgMHhBQiwKKyAgICAweENELCAweEZFLCAweENCLCAweEE4LCAweDc2LCAweDY1LCAweDU1LCAweDU2LCAweDc3LCAweDk5LCAweEJDLCAweERFLAorICAgIDB4REMsIDB4QjksIDB4ODcsIDB4NjUsIDB4NTUsIDB4NTUsIDB4NjYsIDB4NzgsIDB4OUEsIDB4Q0QsIDB4REMsIDB4Q0EsCisgICAgMHg5OCwgMHg3NiwgMHg1NSwgMHg0NCwgMHg1NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhERCwgMHhDQywgMHhBOSwgMHg4NywKKyAgICAweDY1LCAweDU0LCAweDQ1LCAweDU2LCAweDc4LCAweDlBLCAweENELCAweEVDLCAweENBLCAweDk4LCAweDc2LCAweDU1LAorICAgIDB4NTUsIDB4NTUsIDB4NjcsIDB4ODksIDB4QUIsIDB4REYsIDB4Q0MsIDB4QjksIDB4ODcsIDB4NzYsIDB4NTUsIDB4NTUsCisgICAgMHg2NiwgMHg3OCwgMHhBQiwgMHhDRiwgMHhGRCwgMHhDQiwgMHhBOSwgMHg4NywgMHg3NiwgMHg2NiwgMHg2NiwgMHg3OCwKKyAgICAweDlBLCAweEJDLCAweEZGLCAweERELCAweENBLCAweEE5LCAweDg3LCAweDc3LCAweDc3LCAweDc4LCAweDlBLCAweEJDLAorICAgIDB4REYsIDB4RkQsIDB4REMsIDB4QkEsIDB4QTksIDB4ODgsIDB4ODgsIDB4ODgsIDB4OUEsIDB4QUMsIDB4REYsIDB4RkYsCisgICAgMHhGRiwgMHhEQywgMHhCQSwgMHhBOSwgMHg5OSwgMHg5OSwgMHhBQSwgMHhCQiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweERELCAweENCLCAweEJBLCAweEFBLCAweEFCLCAweEJDLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERDLAorICAgIDB4REMsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUUsIDB4REQsCisgICAgMHhERCwgMHhERSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRSwgMHhGRSwgMHhERCwgMHhFRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhDRiwgMHhGRSwgMHhGRCwgMHhEQywgMHhDRiwgMHhGRCwgMHhFRCwgMHhDQywgMHhCQywgMHhFQywgMHg3RiwgMHhFRiwKKyAgICAweEZGLCAweEVGLCAweEVGLCAweEVFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELCAweERGLCAweERELCAweEZGLAorICAgIDB4REQsIDB4RkQsIDB4RUYsIDB4RUYsIDB4RUUsIDB4RUYsIDB4RkYsIDB4Q0YsIDB4RUYsIDB4RkYsIDB4REYsIDB4RUYsCisgICAgMHhERiwgMHhERSwgMHhFRiwgMHhFRiwgMHhGRiwgMHhGRCwgMHhFRSwgMHhGRCwgMHhGRCwgMHhERCwgMHhERCwgMHhDQywKKyAgICAweERELCAweEVFLCAweEZFLCAweEZELCAweEVELCAweEZGLCAweEVFLCAweERDLCAweENDLCAweEJDLCAweEJDLCAweENFLAorICAgIDB4RUQsIDB4RkYsIDB4RkUsIDB4RUYsIDB4Q0QsIDB4RkYsIDB4QkIsIDB4QUEsIDB4QUEsIDB4QkMsIDB4REQsIDB4RUUsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhDQiwgMHg5OCwgMHg3NywgMHg4OSwgMHhCQywgMHhERSwgMHhGRiwgMHhGRCwKKyAgICAweERFLCAweERGLCAweERDLCAweEE4LCAweDU0LCAweDQ2LCAweDhBLCAweENGLCAweEVGLCAweEVGLCAweERDLCAweEZGLAorICAgIDB4REMsIDB4Q0EsIDB4NzQsIDB4MTIsIDB4NDcsIDB4QUMsIDB4RUQsIDB4RUUsIDB4RkUsIDB4RUUsIDB4RUYsIDB4RkIsCisgICAgMHhBNywgMHg0MiwgMHgyNCwgMHg3QSwgMHhCRCwgMHhFRSwgMHhFRiwgMHhERSwgMHhFRCwgMHhERSwgMHhDQSwgMHg4NiwKKyAgICAweDQ0LCAweDY4LCAweEFELCAweERELCAweEVFLCAweEZELCAweERFLCAweEVFLCAweEZDLCAweEI5LCAweDg3LCAweDc4LAorICAgIDB4QUIsIDB4Q0YsIDB4REQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkMsIDB4Q0MsIDB4QkEsIDB4OUEsIDB4QUIsIDB4QkUsCisgICAgMHhFRiwgMHhFRiwgMHhGRCwgMHhERiwgMHhGRiwgMHhGRCwgMHhDQywgMHhDQywgMHhDQywgMHhEQywgMHhDRCwgMHhGRiwKKyAgICAweEZGLCAweEVGLCAweEZGLCAweEZFLCAweERFLCAweERELCAweENDLCAweEZELCAweEVGLCAweERGLCAweEZGLCAweEZFLAorICAgIDB4RkYsIDB4RkYsIDB4RUQsIDB4REQsIDB4REQsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REUsIDB4RkYsCisgICAgMHhGRSwgMHhGRiwgMHhFRCwgMHhGRSwgMHhGRSwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhDRSwgMHhFRiwgMHhGRiwKKyAgICAweEZGLCAweEZELCAweERFLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEVGLCAweEZFLCAweEVFLAorICAgIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0UsIDB4REQsIDB4Q0MsIDB4Q0MsIDB4Q0UsIDB4Q0UsCisgICAgMHhDRSwgMHhFRCwgMHhGRiwgMHhGRiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4RkYsIDB4OEYsIDB4RjgsIDB4RjgsIDB4RjksIDB4RjgsIDB4NUYsIDB4RkYsCisgICAgMHhGOSwgMHhGOCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RiwgMHhGRiwgMHhGRiwKKyAgICAweEY4LCAweDk5LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweEZGLAorICAgIDB4ODgsIDB4OUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4RkUsIDB4OEYsIDB4OEYsCisgICAgMHg4RiwgMHhGOCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwKKyAgICAweEY4LCAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweDhGLCAweEY4LCAweEY5LCAweEY5LCAweDhGLCAweEZGLAorICAgIDB4OEYsIDB4OEYsIDB4RjgsIDB4ODksIDB4OEYsIDB4NjgsIDB4NjgsIDB4ODgsIDB4ODgsIDB4RjgsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGOCwgMHg4OCwgMHg3OCwgMHg2NCwgMHg1NiwgMHhGRiwgMHg4RiwgMHhGOCwgMHhGRiwgMHhGRiwgMHhGOCwKKyAgICAweEZGLCAweDg4LCAweDY0LCAweDIyLCAweDQ4LCAweDg4LCAweDhGLCAweEZGLCAweEZGLCAweEU5LCAweDhGLCAweEZGLAorICAgIDB4RjcsIDB4NTIsIDB4MjUsIDB4NzgsIDB4OEYsIDB4RjgsIDB4RkYsIDB4RkYsIDB4OUYsIDB4RkYsIDB4RjgsIDB4ODcsCisgICAgMHg0NCwgMHg1OCwgMHg4RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHg4RiwgMHhGNywgMHg3NiwKKyAgICAweDg4LCAweEY5LCAweEZGLCAweEZGLCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweDc5LCAweDg4LCAweEY5LCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4RkYsIDB4RjgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGOCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRiwgMHhGRiwgMHg4RiwgMHhGOSwgMHhGRiwgMHg4RiwgMHhGRiwgMHhGRiwKKyAgICAweDhGLCAweEZGLCAweEZGLCAweEY4LCAweEZGLCAweDk4LCAweEY4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUYsIDB4RkYsIDB4OEYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHg4RiwgMHhGRiwgMHg4RiwgMHhGRiwgMHhGOCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZGLCAweDk5LCAweEZGLCAweENGLCAweEY4LCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDdGLCAweDg3LCAweDg3LCAweDY2LCAweDY4LCAweDg3LCAweDc3LCAweDc3LCAweDY4LCAweEZGLCAweDU3LCAweEZGLAorICAgIDB4ODgsIDB4RkYsIDB4ODgsIDB4ODgsIDB4OEYsIDB4ODgsIDB4RkYsIDB4RkYsIDB4RjgsIDB4NkYsIDB4RjcsIDB4NzgsCisgICAgMHhGOCwgMHg4RiwgMHg4NywgMHg3OCwgMHg4NywgMHhGRiwgMHhGNywgMHg4NywgMHhGNywgMHhGOCwgMHg3RiwgMHhGOCwKKyAgICAweDg4LCAweDg4LCAweDg3LCAweDg4LCAweDhGLCAweDg3LCAweEY4LCAweDg4LCAweEY3LCAweEY3LCAweEZGLCAweDhGLAorICAgIDB4ODgsIDB4N0YsIDB4OEYsIDB4RjgsIDB4RjcsIDB4OEYsIDB4OEYsIDB4RjcsIDB4NzcsIDB4RjcsIDB4NjgsIDB4OEYsCisgICAgMHg4RiwgMHhGRiwgMHhGNywgMHg2OSwgMHg4RiwgMHg4OCwgMHg3NiwgMHg3OCwgMHg2RiwgMHg3NywgMHg2RiwgMHhGRiwKKyAgICAweDdGLCAweDg4LCAweEY4LCAweDhGLCAweEY3LCAweDg3LCAweDg4LCAweEY3LCAweDdGLCAweEY4LCAweDhGLCAweDc3LAorICAgIDB4NjgsIDB4ODcsIDB4RjcsIDB4ODYsIDB4ODcsIDB4NjcsIDB4NjcsIDB4N0YsIDB4NzgsIDB4RjgsIDB4NzcsIDB4NzcsCisgICAgMHg4OCwgMHg2NywgMHhGNywgMHg3NiwgMHg4OCwgMHg3OCwgMHg3NywgMHhGRiwgMHg4RiwgMHg3RiwgMHg4OCwgMHg4NywKKyAgICAweDY3LCAweDY3LCAweDc3LCAweDc3LCAweDc4LCAweDhGLCAweDdGLCAweDc3LCAweDdGLCAweDg3LCAweDc2LCAweDY4LAorICAgIDB4ODcsIDB4NzcsIDB4NjcsIDB4N0YsIDB4N0UsIDB4RTgsIDB4Q0IsIDB4ODgsIDB4N0YsIDB4RjcsIDB4NzcsIDB4ODcsCisgICAgMHg2RiwgMHg4RiwgMHg4NywgMHg3RiwgMHg2OCwgMHg4OCwgMHhGNywgMHg4OCwgMHhGNywgMHhGNiwgMHg4NywgMHhGOCwKKyAgICAweDg3LCAweEZGLCAweEY3LCAweDg4LCAweEY4LCAweDhGLCAweDhGLCAweEY3LCAweDg4LCAweDdGLCAweEZGLCAweDhGLAorICAgIDB4RkYsIDB4NzcsIDB4RjgsIDB4ODgsIDB4NzgsIDB4OEYsIDB4RjcsIDB4NzgsIDB4NzcsIDB4ODgsIDB4OEYsIDB4RjcsCisgICAgMHg4RiwgMHhGOCwgMHhGRiwgMHhGOCwgMHg4RiwgMHg4OCwgMHg3OCwgMHg3NywgMHg3RiwgMHhGOCwgMHg3OCwgMHhGOCwKKyAgICAweDg4LCAweDg4LCAweDdGLCAweDhGLCAweDdGLCAweDhGLCAweEE3LCAweDc4LCAweDdGLCAweEZGLCAweEZGLCAweDg3LAorICAgIDB4OEYsIDB4NzgsIDB4ODcsIDB4OEYsIDB4OEYsIDB4ODcsIDB4OEYsIDB4NzcsIDB4RjgsIDB4RjcsIDB4ODgsIDB4OEYsCisgICAgMHg4RiwgMHhGRiwgMHhGOCwgMHg4NywgMHg3RiwgMHhGOCwgMHg4RiwgMHg4NywgMHg4RiwgMHg4NywgMHg3OCwgMHg3RiwKKyAgICAweEY3LCAweDc3LCAweDc4LCAweEY4LCAweDcwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg1NywgMHg3OCwgMHg2NiwgMHg3NywgMHg2NiwgMHg3NiwgMHg3NywgMHg3NiwgMHg4NywgMHg3OSwgMHg2OCwgMHhBRCwKKyAgICAweDk4LCAweDg5LCAweDk4LCAweERBLCAweEI5LCAweDk5LCAweDk5LCAweDlELCAweDk4LCAweDc5LCAweEFBLCAweDg5LAorICAgIDB4OTgsIDB4ODgsIDB4ODgsIDB4OTgsIDB4QUEsIDB4ODgsIDB4OUEsIDB4ODcsIDB4ODksIDB4QTksIDB4OTksIDB4ODksCisgICAgMHg5OCwgMHg5OCwgMHg5OSwgMHg4OSwgMHhBOSwgMHg5OSwgMHg3QSwgMHg4OCwgMHg3OSwgMHg5OCwgMHg4OCwgMHg4NywKKyAgICAweDg3LCAweDk4LCAweDg4LCAweDlBLCAweDc2LCAweDk4LCAweDc3LCAweDg4LCAweDg3LCAweDk3LCAweDg4LCAweDk4LAorICAgIDB4OTgsIDB4OTksIDB4ODgsIDB4NzksIDB4ODksIDB4OTksIDB4NzgsIDB4ODcsIDB4ODgsIDB4ODgsIDB4ODksIDB4QTksCisgICAgMHg5OCwgMHg4NywgMHg5OSwgMHg4NywgMHg3OCwgMHg3OCwgMHg4NywgMHg4NywgMHg4NywgMHg5NywgMHg5OSwgMHg5NywKKyAgICAweDc5LCAweDk4LCAweDk4LCAweDc4LCAweDg3LCAweDk4LCAweDg3LCAweDc4LCAweDg4LCAweDlBLCAweDc2LCAweDk5LAorICAgIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzcsIDB4ODcsIDB4NzgsIDB4ODgsIDB4OTksIDB4QTcsIDB4NzksIDB4ODgsIDB4ODksCisgICAgMHg4NywgMHg3NywgMHg4NywgMHg4OCwgMHg3OCwgMHg4OCwgMHg4OSwgMHg3NywgMHg4OCwgMHg5NywgMHg4OCwgMHg4NywKKyAgICAweDg3LCAweDY3LCAweDg4LCAweDg5LCAweDg5LCAweDg4LCAweDc5LCAweDg5LCAweDg4LCAweDc4LCAweDg3LCAweDc3LAorICAgIDB4NzcsIDB4NzgsIDB4ODksIDB4OEEsIDB4NzYsIDB4ODksIDB4OTcsIDB4NzcsIDB4OTcsIDB4ODcsIDB4NzcsIDB4OTksCisgICAgMHg4OSwgMHg5OSwgMHg5NiwgMHg2QSwgMHhBOCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg4NywgMHg4OCwgMHg4OCwKKyAgICAweDk5LCAweDg3LCAweDlBLCAweEE4LCAweDg4LCAweDk4LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDk5LCAweDk4LAorICAgIDB4NzksIDB4OTksIDB4ODgsIDB4ODgsIDB4OTgsIDB4ODgsIDB4ODcsIDB4ODgsIDB4ODgsIDB4QTksIDB4NzgsIDB4QUEsCisgICAgMHg5OCwgMHg5OCwgMHhBOCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHhBNywgMHg4QSwgMHg5OCwgMHg4OSwKKyAgICAweDhBLCAweDg4LCAweDg4LCAweDlBLCAweDg5LCAweDg5LCAweDk5LCAweDc4LCAweEE5LCAweDk5LCAweEQ4LCAweDg5LAorICAgIDB4OTgsIDB4OEEsIDB4ODksIDB4OTgsIDB4QUEsIDB4ODcsIDB4NjksIDB4ODgsIDB4ODcsIDB4ODcsIDB4NzgsIDB4NzcsCisgICAgMHg2NywgMHg4NywgMHg3NywgMHg3OSwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUIsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NSwgMHg2OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEY1LCAweDEyLCAweDZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4NjEsIDB4MTUsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsCisgICAgMHg2NSwgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQiwgMHhBRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweEJCLCAweEZGLCAweDZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkIsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBOSwgMHg5OSwgMHhCRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDk3LCAweDY2LCAweDg4LCAweEJGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkIsIDB4QjcsIDB4NTMsIDB4NDUsIDB4N0EsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGOSwgMHg2MywgMHgyMiwgMHg0NiwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweDk2LCAweDQyLCAweDI0LCAweDc5LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJBLCAweDg1LAorICAgIDB4NDQsIDB4NTcsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4ODYsIDB4NjcsCisgICAgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhGOSwgMHg5OSwgMHhCRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2RiwgMHhCQiwgMHhCRiwgMHhGRCwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RiwgMHhGRiwgMHg1RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweDg4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RjYsIDB4MTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGMywgMHgwNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOCwKKyAgICAweEJDLCAweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RTUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RkYsCisgICAgMHhFRSwgMHhFRSwgMHhFNSwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NUYsIDB4NUUsCisgICAgMHg1RSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEY0LCAweDVGLCAweDVGLCAweEZGLCAweEY1LAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NTQsIDB4NTUsIDB4NUYsIDB4NUYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHg1RiwgMHg0RiwgMHhGRiwgMHg1NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwKKyAgICAweEVFLCAweEVFLCAweDRFLCAweEU1LCAweEU2LCAweEVFLCAweDVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEU1LAorICAgIDB4RTUsIDB4RTUsIDB4RUUsIDB4NUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4NUUsCisgICAgMHhFRSwgMHg0NCwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHg1RSwgMHhFRiwgMHhGRiwgMHhGNSwgMHg0NSwgMHgzRiwKKyAgICAweDNGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY1LCAweEZGLCAweEZGLCAweEZGLCAweDRGLCAweDRGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NUYsIDB4NUYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNSwgMHhGRiwgMHg1RiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwKKyAgICAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkUsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlGLCAweEFGLCAweDVGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkEsIDB4RkYsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUYsIDB4RkYsIDB4RkYsCisgICAgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHg5OSwgMHg5QiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEE3LCAweDY3LCAweDdGLCAweEFCLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTcsIDB4NTQsIDB4NDUsIDB4NzksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHg2NCwgMHgyMiwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEE2LCAweDQyLCAweDIzLCAweDY5LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweDc1LAorICAgIDB4NDMsIDB4NTcsIDB4OUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjksIDB4NzcsIDB4NjcsCisgICAgMHg5QSwgMHhCRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGOSwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEYwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhCQSwgMHhBQSwgMHhBRiwgMHg1RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEFGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHg5OSwgMHhBQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweDY1LCAweDU2LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4OTQsIDB4MTIsIDB4NTksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGOSwgMHg1MiwgMHgxNCwgMHg5RCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5NywKKyAgICAweDU0LCAweDZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFBLCAweEFBLAorICAgIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkEsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4OUYsIDB4RkYsIDB4QkYsIDB4RkIsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5RiwgMHhGRiwgMHhGRSwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkYsIDB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUEsIDB4QUYsIDB4RkYsIDB4QTksIDB4QUEsIDB4RkYsIDB4NUYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEFGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4QUYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUYsCisgICAgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhGQSwgMHhGRiwgMHhBRiwgMHhGRiwgMHhBRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTgsIDB4QTcsIDB4NjcsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhENywgMHg1MywgMHg0NSwgMHg3QSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZBLCAweDY0LCAweDIyLCAweDQ3LCAweEFGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFGLCAweEY5LAorICAgIDB4OTcsIDB4NDIsIDB4MjQsIDB4NjgsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4NzYsCisgICAgMHg0NCwgMHg1OCwgMHg5RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3NiwgMHg2NywKKyAgICAweEZGLCAweEZBLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweEE5LCAweEFGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENBLCAweEFGLCAweEZGLCAweEZBLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkEsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDRGLCAweEE5LCAweEFGLCAweEZGLCAweEZBLCAweDlGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDVGLCAweEVGLCAweDU2LCAweDZGLCAweEY2LCAweDY2LCAweEVFLCAweEVGLCAweDZGLCAweEZGLCAweDU2LCAweEU2LAorICAgIDB4RTYsIDB4RUUsIDB4RUUsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUUsIDB4RTYsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFNiwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRiwgMHhGRiwgMHhGRiwgMHg2RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEVFLCAweEVFLCAweEU2LCAweEVFLCAweEVFLCAweDZFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4NkUsIDB4NEUsIDB4NkUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFNiwgMHhFRSwgMHhFRSwgMHhFRiwgMHhGNiwgMHhGNSwgMHg2RiwgMHg1NiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEY1LCAweEZGLCAweEZGLCAweEZGLCAweEY0LCAweDZGLCAweDZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLAorICAgIDB4RUUsIDB4RTUsIDB4RTYsIDB4NjYsIDB4NjUsIDB4NkUsIDB4RTUsIDB4RUUsIDB4RTYsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFNSwgMHg1NiwgMHg0NSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEU2LCAweEU2LCAweDY1LCAweDY1LCAweEVFLCAweEVFLCAweEVFLCAweEU2LCAweEVFLCAweEVFLCAweEU2LCAweDY2LAorICAgIDB4NkUsIDB4NkUsIDB4RUUsIDB4RUUsIDB4RTYsIDB4RUUsIDB4NkUsIDB4RUYsIDB4RjYsIDB4RjYsIDB4RkYsIDB4NTYsCisgICAgMHhGRiwgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg1NSwgMHg2RiwKKyAgICAweDY2LCAweEY1LCAweEY2LCAweEZGLCAweEY2LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjYsIDB4RjUsIDB4RjYsIDB4RkYsIDB4NkYsIDB4RkUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFNiwgMHhFRSwgMHhFRSwgMHhGRSwgMHg2RSwgMHhGRSwKKyAgICAweEZGLCAweEZFLCAweEZGLCAweDZFLCAweEY2LCAweEZFLCAweEZGLCAweDY2LCAweEZGLCAweEZFLCAweEZGLCAweEZFLAorICAgIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHg1RiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHg1RiwgMHhGRiwgMHg2NSwgMHg2RiwgMHhGNiwgMHhGRSwKKyAgICAweDY2LCAweEZFLCAweDY2LCAweDVFLCAweDUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QTgsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkYsIDB4M0YsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZFLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsIDB4NzYsIDB4NzcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NiwgMHg1NCwgMHg0NSwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEY5LCAweDY0LCAweDIyLCAweDQ4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RjYsIDB4NDIsIDB4MjQsIDB4NUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RjUsCisgICAgMHg0NCwgMHg1QiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHhGNiwKKyAgICAweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDg3LCAweDdGLCAweDhGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDhGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweEVFLCAweEVFLCAweEVFLCAweERFLCAweEVFLCAweEVFLCAweEVELCAweEQ1LCAweEVFLCAweEVFLCAweDNFLCAweEVFLAorICAgIDB4RUUsIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsCisgICAgMHhERCwgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFNCwgMHgyMSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhERCwKKyAgICAweERELCAweEQxLCAweDFELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELCAweERELAorICAgIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVELCAweEUwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZFLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3NSwgMHg0RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEY0LCAweDEyLCAweDQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4NDIsIDB4MTQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHg1NCwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc4LCAweDg4LCAweDg4LCAweDg3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDgwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0RiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkMsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3NywgMHg2NywgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEY2LCAweDQ0LCAweDQ1LCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RjYsIDB4NTQsIDB4MjIsIDB4NDYsIDB4OUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGNSwgMHg0MiwgMHgzNCwgMHg1RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3NSwKKyAgICAweDQzLCAweDRGLCAweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweDU2LAorICAgIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyAgeworICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4REUsIDB4RUUsIDB4RUUsIDB4RUQsIDB4REUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweERELCAweERELCAweERELCAweERELCAweERELCAweERFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwKKyAgICAweERELCAweERELCAweERELCAweERFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHg1MywgMHg0RSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEU1LCAweDEyLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVELCAweERELCAweERELCAweERELAorICAgIDB4REQsIDB4RDIsIDB4MjQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsCisgICAgMHhEMywgMHgzRCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERCwgMHhERSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUUsCisgICAgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKyAgICAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweEVFLCAweDNFLCAweEU1LCAweEVFLCAweEVFLCAweEVFLCAweEVFLAorICAgIDB4RUUsIDB4RUUsIDB4RUUsIDB4RUQsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH0sCisgIHsKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDc4LCAweDg4LCAweDg4LCAweDg3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDgwLCAweDAwLCAweDAwLCAweDAwLAorICB9LAorICB7CisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg3OCwgMHg4OCwgMHg4OCwgMHg4NywgMHg3OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgICAgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgfSwKKyB9LAorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUkFMRkRBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcmFuZ2Vjb2Rlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmFuZ2Vjb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZmI5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yYW5nZWNvZGVyLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBSYW5nZSBjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJhbmdlIGNvZGVyLgorICogYmFzZWQgdXBvbgorICogICAgIlJhbmdlIGVuY29kaW5nOiBhbiBhbGdvcml0aG0gZm9yIHJlbW92aW5nIHJlZHVuZGFuY3kgZnJvbSBhIGRpZ2l0aXNlZAorICogICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLgorICogICAgIEcuIE4uIE4uIE1hcnRpbiAgICAgICAgICAgICAgICAgIFByZXNlbnRlZCBpbiBNYXJjaCAxOTc5IHRvIHRoZSBWaWRlbyAmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSBSZWNvcmRpbmcgQ29uZmVyZW5jZSwKKyAqICAgICBJQk0gVUsgU2NpZW50aWZpYyBDZW50ZXIgICAgICAgICBoZWxkIGluIFNvdXRoYW1wdG9uIEp1bHkgMjQtMjcgMTk3OS4iCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInJhbmdlY29kZXIuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisKK2F2X2NvbGQgdm9pZCBmZl9pbml0X3JhbmdlX2VuY29kZXIoUmFuZ2VDb2RlciAqYywgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgYy0+Ynl0ZXN0cmVhbV9zdGFydCAgPQorICAgIGMtPmJ5dGVzdHJlYW0gICAgICAgID0gYnVmOworICAgIGMtPmJ5dGVzdHJlYW1fZW5kICAgID0gYnVmICsgYnVmX3NpemU7CisgICAgYy0+bG93ICAgICAgICAgICAgICAgPSAwOworICAgIGMtPnJhbmdlICAgICAgICAgICAgID0gMHhGRjAwOworICAgIGMtPm91dHN0YW5kaW5nX2NvdW50ID0gMDsKKyAgICBjLT5vdXRzdGFuZGluZ19ieXRlICA9IC0xOworfQorCithdl9jb2xkIHZvaWQgZmZfaW5pdF9yYW5nZV9kZWNvZGVyKFJhbmdlQ29kZXIgKmMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKQoreworICAgIC8qIGNhc3QgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyAqLworICAgIGZmX2luaXRfcmFuZ2VfZW5jb2RlcihjLCAodWludDhfdCAqKWJ1ZiwgYnVmX3NpemUpOworCisgICAgYy0+bG93ID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigoY29uc3QgdWludDhfdCAqKikmYy0+Ynl0ZXN0cmVhbSk7Cit9CisKK3ZvaWQgZmZfYnVpbGRfcmFjX3N0YXRlcyhSYW5nZUNvZGVyICpjLCBpbnQgZmFjdG9yLCBpbnQgbWF4X3ApCit7CisgICAgY29uc3QgaW50NjRfdCBvbmUgPSAxTEwgPDwgMzI7CisgICAgaW50NjRfdCBwOworICAgIGludCBsYXN0X3A4LCBwOCwgaTsKKworICAgIG1lbXNldChjLT56ZXJvX3N0YXRlLCAwLCBzaXplb2YoYy0+emVyb19zdGF0ZSkpOworICAgIG1lbXNldChjLT5vbmVfc3RhdGUsIDAsIHNpemVvZihjLT5vbmVfc3RhdGUpKTsKKworICAgIGxhc3RfcDggPSAwOworICAgIHAgICAgICAgPSBvbmUgLyAyOworICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworICAgICAgICBwOCA9ICgyNTYgKiBwICsgb25lIC8gMikgPj4gMzI7IC8vIEZJWE1FOiB0cnkgd2l0aG91dCB0aGUgb25lCisgICAgICAgIGlmIChwOCA8PSBsYXN0X3A4KQorICAgICAgICAgICAgcDggPSBsYXN0X3A4ICsgMTsKKyAgICAgICAgaWYgKGxhc3RfcDggJiYgbGFzdF9wOCA8IDI1NiAmJiBwOCA8PSBtYXhfcCkKKyAgICAgICAgICAgIGMtPm9uZV9zdGF0ZVtsYXN0X3A4XSA9IHA4OworCisgICAgICAgIHAgICAgICArPSAoKG9uZSAtIHApICogZmFjdG9yICsgb25lIC8gMikgPj4gMzI7CisgICAgICAgIGxhc3RfcDggPSBwODsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAyNTYgLSBtYXhfcDsgaSA8PSBtYXhfcDsgaSsrKSB7CisgICAgICAgIGlmIChjLT5vbmVfc3RhdGVbaV0pCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBwICA9IChpICogb25lICsgMTI4KSA+PiA4OworICAgICAgICBwICs9ICgob25lIC0gcCkgKiBmYWN0b3IgKyBvbmUgLyAyKSA+PiAzMjsKKyAgICAgICAgcDggPSAoMjU2ICogcCArIG9uZSAvIDIpID4+IDMyOyAvLyBGSVhNRTogdHJ5IHdpdGhvdXQgdGhlIG9uZQorICAgICAgICBpZiAocDggPD0gaSkKKyAgICAgICAgICAgIHA4ID0gaSArIDE7CisgICAgICAgIGlmIChwOCA+IG1heF9wKQorICAgICAgICAgICAgcDggPSBtYXhfcDsKKyAgICAgICAgYy0+b25lX3N0YXRlW2ldID0gcDg7CisgICAgfQorCisgICAgZm9yIChpID0gMTsgaSA8IDI1NTsgaSsrKQorICAgICAgICBjLT56ZXJvX3N0YXRlW2ldID0gMjU2IC0gYy0+b25lX3N0YXRlWzI1NiAtIGldOworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiAqLworaW50IGZmX3JhY190ZXJtaW5hdGUoUmFuZ2VDb2RlciAqYykKK3sKKyAgICBjLT5yYW5nZSA9IDB4RkY7CisgICAgYy0+bG93ICArPSAweEZGOworICAgIHJlbm9ybV9lbmNvZGVyKGMpOworICAgIGMtPnJhbmdlID0gMHhGRjsKKyAgICByZW5vcm1fZW5jb2RlcihjKTsKKworICAgIGF2X2Fzc2VydDEoYy0+bG93ICAgPT0gMCk7CisgICAgYXZfYXNzZXJ0MShjLT5yYW5nZSA+PSAweDEwMCk7CisKKyAgICByZXR1cm4gYy0+Ynl0ZXN0cmVhbSAtIGMtPmJ5dGVzdHJlYW1fc3RhcnQ7Cit9CisKKyNpZmRlZiBURVNUCisjZGVmaW5lIFNJWkUgMTAyNDAKKworI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisKK3N0YXRpYyB1aW50OF90IGJbOSAqIFNJWkVdOworc3RhdGljIHVpbnQ4X3Qgcls5ICogU0laRV07CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgUmFuZ2VDb2RlciBjOworICAgIGludCBpOworICAgIHVpbnQ4X3Qgc3RhdGVbMTBdOworICAgIEFWTEZHIHBybmc7CisKKyAgICBhdl9sZmdfaW5pdCgmcHJuZywgMSk7CisKKyAgICBmZl9pbml0X3JhbmdlX2VuY29kZXIoJmMsIGIsIFNJWkUpOworICAgIGZmX2J1aWxkX3JhY19zdGF0ZXMoJmMsIDAuMDUgKiAoMUxMIDw8IDMyKSwgMTI4ICsgNjQgKyAzMiArIDE2KTsKKworICAgIG1lbXNldChzdGF0ZSwgMTI4LCBzaXplb2Yoc3RhdGUpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyBpKyspCisgICAgICAgIHJbaV0gPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDc7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgU0laRTsgaSsrKQorICAgICAgICBwdXRfcmFjKCZjLCBzdGF0ZSwgcltpXSAmIDEpOworCisgICAgZmZfcmFjX3Rlcm1pbmF0ZSgmYyk7CisKKyAgICBmZl9pbml0X3JhbmdlX2RlY29kZXIoJmMsIGIsIFNJWkUpOworCisgICAgbWVtc2V0KHN0YXRlLCAxMjgsIHNpemVvZihzdGF0ZSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykKKyAgICAgICAgaWYgKChyW2ldICYgMSkgIT0gZ2V0X3JhYygmYywgc3RhdGUpKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAicmFjIGZhaWx1cmUgYXQgJWRcbiIsIGkpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JhbmdlY29kZXIuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3JhbmdlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzZmYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmFuZ2Vjb2Rlci5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogUmFuZ2UgY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSYW5nZSBjb2Rlci4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUkFOR0VDT0RFUl9ICisjZGVmaW5lIEFWQ09ERUNfUkFOR0VDT0RFUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VDb2RlciB7CisgICAgaW50IGxvdzsKKyAgICBpbnQgcmFuZ2U7CisgICAgaW50IG91dHN0YW5kaW5nX2NvdW50OworICAgIGludCBvdXRzdGFuZGluZ19ieXRlOworICAgIHVpbnQ4X3QgemVyb19zdGF0ZVsyNTZdOworICAgIHVpbnQ4X3Qgb25lX3N0YXRlWzI1Nl07CisgICAgdWludDhfdCAqYnl0ZXN0cmVhbV9zdGFydDsKKyAgICB1aW50OF90ICpieXRlc3RyZWFtOworICAgIHVpbnQ4X3QgKmJ5dGVzdHJlYW1fZW5kOworfSBSYW5nZUNvZGVyOworCit2b2lkIGZmX2luaXRfcmFuZ2VfZW5jb2RlcihSYW5nZUNvZGVyICpjLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSk7Cit2b2lkIGZmX2luaXRfcmFuZ2VfZGVjb2RlcihSYW5nZUNvZGVyICpjLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSk7CitpbnQgZmZfcmFjX3Rlcm1pbmF0ZShSYW5nZUNvZGVyICpjKTsKK3ZvaWQgZmZfYnVpbGRfcmFjX3N0YXRlcyhSYW5nZUNvZGVyICpjLCBpbnQgZmFjdG9yLCBpbnQgbWF4X3ApOworCitzdGF0aWMgaW5saW5lIHZvaWQgcmVub3JtX2VuY29kZXIoUmFuZ2VDb2RlciAqYykKK3sKKyAgICAvLyBGSVhNRTogb3B0aW1pemUKKyAgICB3aGlsZSAoYy0+cmFuZ2UgPCAweDEwMCkgeworICAgICAgICBpZiAoYy0+b3V0c3RhbmRpbmdfYnl0ZSA8IDApIHsKKyAgICAgICAgICAgIGMtPm91dHN0YW5kaW5nX2J5dGUgPSBjLT5sb3cgPj4gODsKKyAgICAgICAgfSBlbHNlIGlmIChjLT5sb3cgPD0gMHhGRjAwKSB7CisgICAgICAgICAgICAqYy0+Ynl0ZXN0cmVhbSsrID0gYy0+b3V0c3RhbmRpbmdfYnl0ZTsKKyAgICAgICAgICAgIGZvciAoOyBjLT5vdXRzdGFuZGluZ19jb3VudDsgYy0+b3V0c3RhbmRpbmdfY291bnQtLSkKKyAgICAgICAgICAgICAgICAqYy0+Ynl0ZXN0cmVhbSsrID0gMHhGRjsKKyAgICAgICAgICAgIGMtPm91dHN0YW5kaW5nX2J5dGUgPSBjLT5sb3cgPj4gODsKKyAgICAgICAgfSBlbHNlIGlmIChjLT5sb3cgPj0gMHgxMDAwMCkgeworICAgICAgICAgICAgKmMtPmJ5dGVzdHJlYW0rKyA9IGMtPm91dHN0YW5kaW5nX2J5dGUgKyAxOworICAgICAgICAgICAgZm9yICg7IGMtPm91dHN0YW5kaW5nX2NvdW50OyBjLT5vdXRzdGFuZGluZ19jb3VudC0tKQorICAgICAgICAgICAgICAgICpjLT5ieXRlc3RyZWFtKysgPSAweDAwOworICAgICAgICAgICAgYy0+b3V0c3RhbmRpbmdfYnl0ZSA9IChjLT5sb3cgPj4gOCkgJiAweEZGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYy0+b3V0c3RhbmRpbmdfY291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIGMtPmxvdyAgICAgPSAoYy0+bG93ICYgMHhGRikgPDwgODsKKyAgICAgICAgYy0+cmFuZ2UgPDw9IDg7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfcmFjX2NvdW50KFJhbmdlQ29kZXIgKmMpCit7CisgICAgaW50IHggPSBjLT5ieXRlc3RyZWFtIC0gYy0+Ynl0ZXN0cmVhbV9zdGFydCArIGMtPm91dHN0YW5kaW5nX2NvdW50OworICAgIGlmIChjLT5vdXRzdGFuZGluZ19ieXRlID49IDApCisgICAgICAgIHgrKzsKKyAgICByZXR1cm4gOCAqIHggLSBhdl9sb2cyKGMtPnJhbmdlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9yYWMoUmFuZ2VDb2RlciAqYywgdWludDhfdCAqY29uc3Qgc3RhdGUsIGludCBiaXQpCit7CisgICAgaW50IHJhbmdlMSA9IChjLT5yYW5nZSAqICgqc3RhdGUpKSA+PiA4OworCisgICAgYXZfYXNzZXJ0Migqc3RhdGUpOworICAgIGF2X2Fzc2VydDIocmFuZ2UxIDwgYy0+cmFuZ2UpOworICAgIGF2X2Fzc2VydDIocmFuZ2UxID4gMCk7CisgICAgaWYgKCFiaXQpIHsKKyAgICAgICAgYy0+cmFuZ2UgLT0gcmFuZ2UxOworICAgICAgICAqc3RhdGUgICAgPSBjLT56ZXJvX3N0YXRlWypzdGF0ZV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+bG93ICArPSBjLT5yYW5nZSAtIHJhbmdlMTsKKyAgICAgICAgYy0+cmFuZ2UgPSByYW5nZTE7CisgICAgICAgICpzdGF0ZSAgID0gYy0+b25lX3N0YXRlWypzdGF0ZV07CisgICAgfQorCisgICAgcmVub3JtX2VuY29kZXIoYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWZpbGwoUmFuZ2VDb2RlciAqYykKK3sKKyAgICBpZiAoYy0+cmFuZ2UgPCAweDEwMCkgeworICAgICAgICBjLT5yYW5nZSA8PD0gODsKKyAgICAgICAgYy0+bG93ICAgPDw9IDg7CisgICAgICAgIGlmIChjLT5ieXRlc3RyZWFtIDwgYy0+Ynl0ZXN0cmVhbV9lbmQpCisgICAgICAgICAgICBjLT5sb3cgKz0gYy0+Ynl0ZXN0cmVhbVswXTsKKyAgICAgICAgYy0+Ynl0ZXN0cmVhbSsrOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3JhYyhSYW5nZUNvZGVyICpjLCB1aW50OF90ICpjb25zdCBzdGF0ZSkKK3sKKyAgICBpbnQgcmFuZ2UxID0gKGMtPnJhbmdlICogKCpzdGF0ZSkpID4+IDg7CisKKyAgICBjLT5yYW5nZSAtPSByYW5nZTE7CisjaWYgMQorICAgIGlmIChjLT5sb3cgPCBjLT5yYW5nZSkgeworICAgICAgICAqc3RhdGUgPSBjLT56ZXJvX3N0YXRlWypzdGF0ZV07CisgICAgICAgIHJlZmlsbChjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+bG93ICAtPSBjLT5yYW5nZTsKKyAgICAgICAgKnN0YXRlICAgPSBjLT5vbmVfc3RhdGVbKnN0YXRlXTsKKyAgICAgICAgYy0+cmFuZ2UgPSByYW5nZTE7CisgICAgICAgIHJlZmlsbChjKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2Vsc2UKKyAgICB7CisgICAgICAgIGludCBvbmVfbWFzayBvbmVfbWFzayA9IChjLT5yYW5nZSAtIGMtPmxvdyAtIDEpID4+IDMxOworCisgICAgICAgIGMtPmxvdyAgIC09ICAgICAgICAgICBjLT5yYW5nZSAgJiBvbmVfbWFzazsKKyAgICAgICAgYy0+cmFuZ2UgKz0gKHJhbmdlMSAtIGMtPnJhbmdlKSAmIG9uZV9tYXNrOworCisgICAgICAgICpzdGF0ZSA9IGMtPnplcm9fc3RhdGVbKCpzdGF0ZSkgKyAoMjU2ICYgb25lX21hc2spXTsKKyAgICB9CisgICAgcmVmaWxsKGMpOworCisgICAgcmV0dXJuIG9uZV9tYXNrICYgMTsKKyNlbmRpZgorfQorCisjZW5kaWYgLyogQVZDT0RFQ19SQU5HRUNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JhdGVjb250cm9sLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9yYXRlY29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNWUyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yYXRlY29udHJvbC5jCkBAIC0wLDAgKzEsMTA2NyBAQAorLyoKKyAqIFJhdGUgY29udHJvbCBmb3IgdmlkZW8gZW5jb2RlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSYXRlIGNvbnRyb2wgZm9yIHZpZGVvIGVuY29kZXJzLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJyYXRlY29udHJvbC5oIgorI2luY2x1ZGUgIm1wZWd1dGlscy5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisKKyN1bmRlZiBOREVCVUcgLy8gQWx3YXlzIGNoZWNrIGFzc2VydHMsIHRoZSBzcGVlZCBlZmZlY3QgaXMgZmFyIHRvbyBzbWFsbCB0byBkaXNhYmxlIHRoZW0uCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpZm5kZWYgTV9FCisjZGVmaW5lIE1fRSAyLjcxODI4MTgyOAorI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5pdF9wYXNzMihNcGVnRW5jQ29udGV4dCAqcyk7CitzdGF0aWMgZG91YmxlIGdldF9xc2NhbGUoTXBlZ0VuY0NvbnRleHQgKnMsIFJhdGVDb250cm9sRW50cnkgKnJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmF0ZV9mYWN0b3IsIGludCBmcmFtZV9udW0pOworCit2b2lkIGZmX3dyaXRlX3Bhc3MxX3N0YXRzKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIHNucHJpbnRmKHMtPmF2Y3R4LT5zdGF0c19vdXQsIDI1NiwKKyAgICAgICAgICAgICAiaW46JWQgb3V0OiVkIHR5cGU6JWQgcTolZCBpdGV4OiVkIHB0ZXg6JWQgbXY6JWQgbWlzYzolZCAiCisgICAgICAgICAgICAgImZjb2RlOiVkIGJjb2RlOiVkIG1jLXZhcjolIlBSSWQ2NCIgdmFyOiUiUFJJZDY0IiBpY291bnQ6JWQgc2tpcGNvdW50OiVkIGhiaXRzOiVkO1xuIiwKKyAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5kaXNwbGF5X3BpY3R1cmVfbnVtYmVyLAorICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmNvZGVkX3BpY3R1cmVfbnVtYmVyLAorICAgICAgICAgICAgIHMtPnBpY3RfdHlwZSwKKyAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+cXVhbGl0eSwKKyAgICAgICAgICAgICBzLT5pX3RleF9iaXRzLAorICAgICAgICAgICAgIHMtPnBfdGV4X2JpdHMsCisgICAgICAgICAgICAgcy0+bXZfYml0cywKKyAgICAgICAgICAgICBzLT5taXNjX2JpdHMsCisgICAgICAgICAgICAgcy0+Zl9jb2RlLAorICAgICAgICAgICAgIHMtPmJfY29kZSwKKyAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWNfbWJfdmFyX3N1bSwKKyAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdmFyX3N1bSwKKyAgICAgICAgICAgICBzLT5pX2NvdW50LCBzLT5za2lwX2NvdW50LAorICAgICAgICAgICAgIHMtPmhlYWRlcl9iaXRzKTsKK30KKworc3RhdGljIGRvdWJsZSBnZXRfZnBzKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICByZXR1cm4gMS4wIC8gYXZfcTJkKGF2Y3R4LT50aW1lX2Jhc2UpIC8gRkZNQVgoYXZjdHgtPnRpY2tzX3Blcl9mcmFtZSwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHFwMmJpdHMoUmF0ZUNvbnRyb2xFbnRyeSAqcmNlLCBkb3VibGUgcXApCit7CisgICAgaWYgKHFwIDw9IDAuMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAicXA8PTAuMFxuIik7CisgICAgfQorICAgIHJldHVybiByY2UtPnFzY2FsZSAqIChkb3VibGUpKHJjZS0+aV90ZXhfYml0cyArIHJjZS0+cF90ZXhfYml0cyArIDEpIC8gcXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIGJpdHMycXAoUmF0ZUNvbnRyb2xFbnRyeSAqcmNlLCBkb3VibGUgYml0cykKK3sKKyAgICBpZiAoYml0cyA8IDAuOSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiYml0czwwLjlcbiIpOworICAgIH0KKyAgICByZXR1cm4gcmNlLT5xc2NhbGUgKiAoZG91YmxlKShyY2UtPmlfdGV4X2JpdHMgKyByY2UtPnBfdGV4X2JpdHMgKyAxKSAvIGJpdHM7Cit9CisKK2F2X2NvbGQgaW50IGZmX3JhdGVfY29udHJvbF9pbml0KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIFJhdGVDb250cm9sQ29udGV4dCAqcmNjID0gJnMtPnJjX2NvbnRleHQ7CisgICAgaW50IGksIHJlczsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvbnN0X25hbWVzW10gPSB7CisgICAgICAgICJQSSIsCisgICAgICAgICJFIiwKKyAgICAgICAgImlUZXgiLAorICAgICAgICAicFRleCIsCisgICAgICAgICJ0ZXgiLAorICAgICAgICAibXYiLAorICAgICAgICAiZkNvZGUiLAorICAgICAgICAiaUNvdW50IiwKKyAgICAgICAgIm1jVmFyIiwKKyAgICAgICAgInZhciIsCisgICAgICAgICJpc0kiLAorICAgICAgICAiaXNQIiwKKyAgICAgICAgImlzQiIsCisgICAgICAgICJhdmdRUCIsCisgICAgICAgICJxQ29tcCIsCisjaWYgMAorICAgICAgICAibGFzdElRUCIsCisgICAgICAgICJsYXN0UFFQIiwKKyAgICAgICAgImxhc3RCUVAiLAorICAgICAgICAibmV4dE5vbkJRUCIsCisjZW5kaWYKKyAgICAgICAgImF2Z0lJVGV4IiwKKyAgICAgICAgImF2Z1BJVGV4IiwKKyAgICAgICAgImF2Z1BQVGV4IiwKKyAgICAgICAgImF2Z0JQVGV4IiwKKyAgICAgICAgImF2Z1RleCIsCisgICAgICAgIE5VTEwKKyAgICB9OworICAgIHN0YXRpYyBkb3VibGUgKCogY29uc3QgZnVuYzFbXSkodm9pZCAqLCBkb3VibGUpID0geworICAgICAgICAodm9pZCAqKWJpdHMycXAsCisgICAgICAgICh2b2lkICopcXAyYml0cywKKyAgICAgICAgTlVMTAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmdW5jMV9uYW1lc1tdID0geworICAgICAgICAiYml0czJxcCIsCisgICAgICAgICJxcDJiaXRzIiwKKyAgICAgICAgTlVMTAorICAgIH07CisgICAgZW1tc19jKCk7CisKKyAgICBpZiAoIXMtPmF2Y3R4LT5yY19tYXhfYXZhaWxhYmxlX3Zidl91c2UgJiYgcy0+YXZjdHgtPnJjX2J1ZmZlcl9zaXplKSB7CisgICAgICAgIGlmIChzLT5hdmN0eC0+cmNfbWF4X3JhdGUpIHsKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5yY19tYXhfYXZhaWxhYmxlX3Zidl91c2UgPSBhdl9jbGlwZihzLT5hdmN0eC0+cmNfbWF4X3JhdGUvKHMtPmF2Y3R4LT5yY19idWZmZXJfc2l6ZSpnZXRfZnBzKHMtPmF2Y3R4KSksIDEuMC8zLCAxLjApOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5yY19tYXhfYXZhaWxhYmxlX3Zidl91c2UgPSAxLjA7CisgICAgfQorCisgICAgcmVzID0gYXZfZXhwcl9wYXJzZSgmcmNjLT5yY19lcV9ldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmNfZXEgPyBzLT5yY19lcSA6ICJ0ZXhecUNvbXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfbmFtZXMsIGZ1bmMxX25hbWVzLCBmdW5jMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDAsIHMtPmF2Y3R4KTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgcmNfZXEgXCIlc1wiXG4iLCBzLT5yY19lcSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICByY2MtPnByZWRbaV0uY29lZmYgPSBGRl9RUDJMQU1CREEgKiA3LjA7CisgICAgICAgIHJjYy0+cHJlZFtpXS5jb3VudCA9IDEuMDsKKyAgICAgICAgcmNjLT5wcmVkW2ldLmRlY2F5ID0gMC40OworCisgICAgICAgIHJjYy0+aV9jcGx4X3N1bSBbaV0gPQorICAgICAgICByY2MtPnBfY3BseF9zdW0gW2ldID0KKyAgICAgICAgcmNjLT5tdl9iaXRzX3N1bVtpXSA9CisgICAgICAgIHJjYy0+cXNjYWxlX3N1bSBbaV0gPQorICAgICAgICByY2MtPmZyYW1lX2NvdW50W2ldID0gMTsgLy8gMSBpcyBiZXR0ZXIgYmVjYXVzZSBvZiAxLzAgYW5kIHN1Y2gKKworICAgICAgICByY2MtPmxhc3RfcXNjYWxlX2ZvcltpXSA9IEZGX1FQMkxBTUJEQSAqIDU7CisgICAgfQorICAgIHJjYy0+YnVmZmVyX2luZGV4ID0gcy0+YXZjdHgtPnJjX2luaXRpYWxfYnVmZmVyX29jY3VwYW5jeTsKKyAgICBpZiAoIXJjYy0+YnVmZmVyX2luZGV4KQorICAgICAgICByY2MtPmJ1ZmZlcl9pbmRleCA9IHMtPmF2Y3R4LT5yY19idWZmZXJfc2l6ZSAqIDMgLyA0OworCisgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19QQVNTMikgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY2hhciAqcDsKKworICAgICAgICAvKiBmaW5kIG51bWJlciBvZiBwaWNzICovCisgICAgICAgIHAgPSBzLT5hdmN0eC0+c3RhdHNfaW47CisgICAgICAgIGZvciAoaSA9IC0xOyBwOyBpKyspCisgICAgICAgICAgICBwID0gc3RyY2hyKHAgKyAxLCAnOycpOworICAgICAgICBpICs9IHMtPm1heF9iX2ZyYW1lczsKKyAgICAgICAgaWYgKGkgPD0gMCB8fCBpID49IElOVF9NQVggLyBzaXplb2YoUmF0ZUNvbnRyb2xFbnRyeSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJjYy0+ZW50cnkgICAgICAgPSBhdl9tYWxsb2N6KGkgKiBzaXplb2YoUmF0ZUNvbnRyb2xFbnRyeSkpOworICAgICAgICByY2MtPm51bV9lbnRyaWVzID0gaTsKKworICAgICAgICAvKiBpbml0IGFsbCB0byBza2lwcGVkIHAgZnJhbWVzCisgICAgICAgICAqICh3aXRoIGIgZnJhbWVzIHdlIG1pZ2h0IGhhdmUgYSBub3QgZW5jb2RlZCBmcmFtZSBhdCB0aGUgZW5kIEZJWE1FKSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmNjLT5udW1fZW50cmllczsgaSsrKSB7CisgICAgICAgICAgICBSYXRlQ29udHJvbEVudHJ5ICpyY2UgPSAmcmNjLT5lbnRyeVtpXTsKKworICAgICAgICAgICAgcmNlLT5waWN0X3R5cGUgID0gcmNlLT5uZXdfcGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgICAgICAgICByY2UtPnFzY2FsZSAgICAgPSByY2UtPm5ld19xc2NhbGUgICAgPSBGRl9RUDJMQU1CREEgKiAyOworICAgICAgICAgICAgcmNlLT5taXNjX2JpdHMgID0gcy0+bWJfbnVtICsgMTA7CisgICAgICAgICAgICByY2UtPm1iX3Zhcl9zdW0gPSBzLT5tYl9udW0gKiAxMDA7CisgICAgICAgIH0KKworICAgICAgICAvKiByZWFkIHN0YXRzICovCisgICAgICAgIHAgPSBzLT5hdmN0eC0+c3RhdHNfaW47CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByY2MtPm51bV9lbnRyaWVzIC0gcy0+bWF4X2JfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgIFJhdGVDb250cm9sRW50cnkgKnJjZTsKKyAgICAgICAgICAgIGludCBwaWN0dXJlX251bWJlcjsKKyAgICAgICAgICAgIGludCBlOworICAgICAgICAgICAgY2hhciAqbmV4dDsKKworICAgICAgICAgICAgbmV4dCA9IHN0cmNocihwLCAnOycpOworICAgICAgICAgICAgaWYgKG5leHQpIHsKKyAgICAgICAgICAgICAgICAoKm5leHQpID0gMDsgLy8gc3NjYW5mIGluIHVuYmVsaWV2YWJseSBzbG93IG9uIGxvb29uZyBzdHJpbmdzIC8vIEZJWE1FIGNvcHkgLyBkbyBub3Qgd3JpdGUKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlID0gc3NjYW5mKHAsICIgaW46JWQgIiwgJnBpY3R1cmVfbnVtYmVyKTsKKworICAgICAgICAgICAgYXNzZXJ0KHBpY3R1cmVfbnVtYmVyID49IDApOworICAgICAgICAgICAgYXNzZXJ0KHBpY3R1cmVfbnVtYmVyIDwgcmNjLT5udW1fZW50cmllcyk7CisgICAgICAgICAgICByY2UgPSAmcmNjLT5lbnRyeVtwaWN0dXJlX251bWJlcl07CisKKyAgICAgICAgICAgIGUgKz0gc3NjYW5mKHAsICIgaW46JSpkIG91dDolKmQgdHlwZTolZCBxOiVmIGl0ZXg6JWQgcHRleDolZCBtdjolZCBtaXNjOiVkIGZjb2RlOiVkIGJjb2RlOiVkIG1jLXZhcjolIlNDTmQ2NCIgdmFyOiUiU0NOZDY0IiBpY291bnQ6JWQgc2tpcGNvdW50OiVkIGhiaXRzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyY2UtPnBpY3RfdHlwZSwgJnJjZS0+cXNjYWxlLCAmcmNlLT5pX3RleF9iaXRzLCAmcmNlLT5wX3RleF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJjZS0+bXZfYml0cywgJnJjZS0+bWlzY19iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJjZS0+Zl9jb2RlLCAmcmNlLT5iX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAmcmNlLT5tY19tYl92YXJfc3VtLCAmcmNlLT5tYl92YXJfc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJjZS0+aV9jb3VudCwgJnJjZS0+c2tpcF9jb3VudCwgJnJjZS0+aGVhZGVyX2JpdHMpOworICAgICAgICAgICAgaWYgKGUgIT0gMTQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgInN0YXRpc3RpY3MgYXJlIGRhbWFnZWQgYXQgbGluZSAlZCwgcGFyc2VyIG91dD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaSwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbml0X3Bhc3MyKHMpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAvLyBGSVhNRSBtYXliZSBtb3ZlIHRvIGVuZAorICAgICAgICBpZiAoKHMtPmZsYWdzICYgQ09ERUNfRkxBR19QQVNTMikgJiYgcy0+YXZjdHgtPnJjX3N0cmF0ZWd5ID09IEZGX1JDX1NUUkFURUdZX1hWSUQpIHsKKyNpZiBDT05GSUdfTElCWFZJRAorICAgICAgICAgICAgcmV0dXJuIGZmX3h2aWRfcmF0ZV9jb250cm9sX2luaXQocyk7CisjZWxzZQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlh2aWQgcmF0ZWNvbnRyb2wgcmVxdWlyZXMgbGliYXZjb2RlYyBjb21waWxlZCB3aXRoIFh2aWQgc3VwcG9ydC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIShzLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzIpKSB7CisgICAgICAgIHJjYy0+c2hvcnRfdGVybV9xc3VtICAgPSAwLjAwMTsKKyAgICAgICAgcmNjLT5zaG9ydF90ZXJtX3Fjb3VudCA9IDAuMDAxOworCisgICAgICAgIHJjYy0+cGFzczFfcmNfZXFfb3V0cHV0X3N1bSA9IDAuMDAxOworICAgICAgICByY2MtPnBhc3MxX3dhbnRlZF9iaXRzICAgICAgPSAwLjAwMTsKKworICAgICAgICBpZiAocy0+YXZjdHgtPnFibHVyID4gMS4wKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInFibHVyIHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgLyogaW5pdCBzdHVmZiB3aXRoIHRoZSB1c2VyIHNwZWNpZmllZCBjb21wbGV4aXR5ICovCisgICAgICAgIGlmIChzLT5yY19pbml0aWFsX2NwbHgpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2MCAqIDMwOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgYml0cyA9IHMtPnJjX2luaXRpYWxfY3BseCAqIChpIC8gMTAwMDAuMCArIDEuMCkgKiBzLT5tYl9udW07CisgICAgICAgICAgICAgICAgUmF0ZUNvbnRyb2xFbnRyeSByY2U7CisKKyAgICAgICAgICAgICAgICBpZiAoaSAlICgocy0+Z29wX3NpemUgKyAzKSAvIDQpID09IDApCisgICAgICAgICAgICAgICAgICAgIHJjZS5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpICUgKHMtPm1heF9iX2ZyYW1lcyArIDEpKQorICAgICAgICAgICAgICAgICAgICByY2UucGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0I7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByY2UucGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisKKyAgICAgICAgICAgICAgICByY2UubmV3X3BpY3RfdHlwZSA9IHJjZS5waWN0X3R5cGU7CisgICAgICAgICAgICAgICAgcmNlLm1jX21iX3Zhcl9zdW0gPSBiaXRzICogcy0+bWJfbnVtIC8gMTAwMDAwOworICAgICAgICAgICAgICAgIHJjZS5tYl92YXJfc3VtICAgID0gcy0+bWJfbnVtOworCisgICAgICAgICAgICAgICAgcmNlLnFzY2FsZSAgICA9IEZGX1FQMkxBTUJEQSAqIDI7CisgICAgICAgICAgICAgICAgcmNlLmZfY29kZSAgICA9IDI7CisgICAgICAgICAgICAgICAgcmNlLmJfY29kZSAgICA9IDE7CisgICAgICAgICAgICAgICAgcmNlLm1pc2NfYml0cyA9IDE7CisKKyAgICAgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgICAgICAgICAgICAgIHJjZS5pX2NvdW50ICAgID0gcy0+bWJfbnVtOworICAgICAgICAgICAgICAgICAgICByY2UuaV90ZXhfYml0cyA9IGJpdHM7CisgICAgICAgICAgICAgICAgICAgIHJjZS5wX3RleF9iaXRzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmNlLm12X2JpdHMgICAgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJjZS5pX2NvdW50ICAgID0gMDsgLy8gRklYTUUgd2UgZG8ga25vdyB0aGlzIGFwcHJveAorICAgICAgICAgICAgICAgICAgICByY2UuaV90ZXhfYml0cyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJjZS5wX3RleF9iaXRzID0gYml0cyAqIDAuOTsKKyAgICAgICAgICAgICAgICAgICAgcmNlLm12X2JpdHMgICAgPSBiaXRzICogMC4xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByY2MtPmlfY3BseF9zdW1bcmNlLnBpY3RfdHlwZV0gICs9IHJjZS5pX3RleF9iaXRzICogcmNlLnFzY2FsZTsKKyAgICAgICAgICAgICAgICByY2MtPnBfY3BseF9zdW1bcmNlLnBpY3RfdHlwZV0gICs9IHJjZS5wX3RleF9iaXRzICogcmNlLnFzY2FsZTsKKyAgICAgICAgICAgICAgICByY2MtPm12X2JpdHNfc3VtW3JjZS5waWN0X3R5cGVdICs9IHJjZS5tdl9iaXRzOworICAgICAgICAgICAgICAgIHJjYy0+ZnJhbWVfY291bnRbcmNlLnBpY3RfdHlwZV0rKzsKKworICAgICAgICAgICAgICAgIGdldF9xc2NhbGUocywgJnJjZSwgcmNjLT5wYXNzMV93YW50ZWRfYml0cyAvIHJjYy0+cGFzczFfcmNfZXFfb3V0cHV0X3N1bSwgaSk7CisKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBtaXNiZWhhdmVzIGEgbGl0dGxlIGZvciB2YXJpYWJsZSBmcHMKKyAgICAgICAgICAgICAgICByY2MtPnBhc3MxX3dhbnRlZF9iaXRzICs9IHMtPmJpdF9yYXRlIC8gZ2V0X2ZwcyhzLT5hdmN0eCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworYXZfY29sZCB2b2lkIGZmX3JhdGVfY29udHJvbF91bmluaXQoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgUmF0ZUNvbnRyb2xDb250ZXh0ICpyY2MgPSAmcy0+cmNfY29udGV4dDsKKyAgICBlbW1zX2MoKTsKKworICAgIGF2X2V4cHJfZnJlZShyY2MtPnJjX2VxX2V2YWwpOworICAgIGF2X2ZyZWVwKCZyY2MtPmVudHJ5KTsKKworI2lmIENPTkZJR19MSUJYVklECisgICAgaWYgKChzLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzIpICYmIHMtPmF2Y3R4LT5yY19zdHJhdGVneSA9PSBGRl9SQ19TVFJBVEVHWV9YVklEKQorICAgICAgICBmZl94dmlkX3JhdGVfY29udHJvbF91bmluaXQocyk7CisjZW5kaWYKK30KKworaW50IGZmX3Zidl91cGRhdGUoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBmcmFtZV9zaXplKQoreworICAgIFJhdGVDb250cm9sQ29udGV4dCAqcmNjID0gJnMtPnJjX2NvbnRleHQ7CisgICAgY29uc3QgZG91YmxlIGZwcyAgICAgICAgPSBnZXRfZnBzKHMtPmF2Y3R4KTsKKyAgICBjb25zdCBpbnQgYnVmZmVyX3NpemUgICA9IHMtPmF2Y3R4LT5yY19idWZmZXJfc2l6ZTsKKyAgICBjb25zdCBkb3VibGUgbWluX3JhdGUgICA9IHMtPmF2Y3R4LT5yY19taW5fcmF0ZSAvIGZwczsKKyAgICBjb25zdCBkb3VibGUgbWF4X3JhdGUgICA9IHMtPmF2Y3R4LT5yY19tYXhfcmF0ZSAvIGZwczsKKworICAgIGF2X2Rsb2cocywgIiVkICVmICVkICVmICVmXG4iLAorICAgICAgICAgICAgYnVmZmVyX3NpemUsIHJjYy0+YnVmZmVyX2luZGV4LCBmcmFtZV9zaXplLCBtaW5fcmF0ZSwgbWF4X3JhdGUpOworCisgICAgaWYgKGJ1ZmZlcl9zaXplKSB7CisgICAgICAgIGludCBsZWZ0OworCisgICAgICAgIHJjYy0+YnVmZmVyX2luZGV4IC09IGZyYW1lX3NpemU7CisgICAgICAgIGlmIChyY2MtPmJ1ZmZlcl9pbmRleCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicmMgYnVmZmVyIHVuZGVyZmxvd1xuIik7CisgICAgICAgICAgICBpZiAoZnJhbWVfc2l6ZSA+IG1heF9yYXRlICYmIHMtPnFzY2FsZSA9PSBzLT5hdmN0eC0+cW1heCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibWF4IGJpdHJhdGUgcG9zc2libHkgdG9vIHNtYWxsIG9yIHRyeSB0cmVsbGlzIHdpdGggbGFyZ2UgbG1heCBvciBpbmNyZWFzZSBxbWF4XG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJjYy0+YnVmZmVyX2luZGV4ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGxlZnQgPSBidWZmZXJfc2l6ZSAtIHJjYy0+YnVmZmVyX2luZGV4IC0gMTsKKyAgICAgICAgcmNjLT5idWZmZXJfaW5kZXggKz0gYXZfY2xpcChsZWZ0LCBtaW5fcmF0ZSwgbWF4X3JhdGUpOworCisgICAgICAgIGlmIChyY2MtPmJ1ZmZlcl9pbmRleCA+IGJ1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICBpbnQgc3R1ZmZpbmcgPSBjZWlsKChyY2MtPmJ1ZmZlcl9pbmRleCAtIGJ1ZmZlcl9zaXplKSAvIDgpOworCisgICAgICAgICAgICBpZiAoc3R1ZmZpbmcgPCA0ICYmIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KQorICAgICAgICAgICAgICAgIHN0dWZmaW5nID0gNDsKKyAgICAgICAgICAgIHJjYy0+YnVmZmVyX2luZGV4IC09IDggKiBzdHVmZmluZzsKKworICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1JDKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAic3R1ZmZpbmcgJWQgYnl0ZXNcbiIsIHN0dWZmaW5nKTsKKworICAgICAgICAgICAgcmV0dXJuIHN0dWZmaW5nOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIE1vZGlmeSB0aGUgYml0cmF0ZSBjdXJ2ZSBmcm9tIHBhc3MxIGZvciBvbmUgZnJhbWUuCisgKi8KK3N0YXRpYyBkb3VibGUgZ2V0X3FzY2FsZShNcGVnRW5jQ29udGV4dCAqcywgUmF0ZUNvbnRyb2xFbnRyeSAqcmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByYXRlX2ZhY3RvciwgaW50IGZyYW1lX251bSkKK3sKKyAgICBSYXRlQ29udHJvbENvbnRleHQgKnJjYyA9ICZzLT5yY19jb250ZXh0OworICAgIEFWQ29kZWNDb250ZXh0ICphICAgICAgID0gcy0+YXZjdHg7CisgICAgY29uc3QgaW50IHBpY3RfdHlwZSAgICAgPSByY2UtPm5ld19waWN0X3R5cGU7CisgICAgY29uc3QgZG91YmxlIG1iX251bSAgICAgPSBzLT5tYl9udW07CisgICAgZG91YmxlIHEsIGJpdHM7CisgICAgaW50IGk7CisKKyAgICBkb3VibGUgY29uc3RfdmFsdWVzW10gPSB7CisgICAgICAgIE1fUEksCisgICAgICAgIE1fRSwKKyAgICAgICAgcmNlLT5pX3RleF9iaXRzICogcmNlLT5xc2NhbGUsCisgICAgICAgIHJjZS0+cF90ZXhfYml0cyAqIHJjZS0+cXNjYWxlLAorICAgICAgICAocmNlLT5pX3RleF9iaXRzICsgcmNlLT5wX3RleF9iaXRzKSAqIChkb3VibGUpcmNlLT5xc2NhbGUsCisgICAgICAgIHJjZS0+bXZfYml0cyAvIG1iX251bSwKKyAgICAgICAgcmNlLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgPyAocmNlLT5mX2NvZGUgKyByY2UtPmJfY29kZSkgKiAwLjUgOiByY2UtPmZfY29kZSwKKyAgICAgICAgcmNlLT5pX2NvdW50IC8gbWJfbnVtLAorICAgICAgICByY2UtPm1jX21iX3Zhcl9zdW0gLyBtYl9udW0sCisgICAgICAgIHJjZS0+bWJfdmFyX3N1bSAvIG1iX251bSwKKyAgICAgICAgcmNlLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0ksCisgICAgICAgIHJjZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QLAorICAgICAgICByY2UtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiwKKyAgICAgICAgcmNjLT5xc2NhbGVfc3VtW3BpY3RfdHlwZV0gLyAoZG91YmxlKXJjYy0+ZnJhbWVfY291bnRbcGljdF90eXBlXSwKKyAgICAgICAgYS0+cWNvbXByZXNzLAorI2lmIDAKKyAgICAgICAgcmNjLT5sYXN0X3FzY2FsZV9mb3JbQVZfUElDVFVSRV9UWVBFX0ldLAorICAgICAgICByY2MtPmxhc3RfcXNjYWxlX2ZvcltBVl9QSUNUVVJFX1RZUEVfUF0sCisgICAgICAgIHJjYy0+bGFzdF9xc2NhbGVfZm9yW0FWX1BJQ1RVUkVfVFlQRV9CXSwKKyAgICAgICAgcmNjLT5uZXh0X25vbl9iX3FzY2FsZSwKKyNlbmRpZgorICAgICAgICByY2MtPmlfY3BseF9zdW1bQVZfUElDVFVSRV9UWVBFX0ldIC8gKGRvdWJsZSlyY2MtPmZyYW1lX2NvdW50W0FWX1BJQ1RVUkVfVFlQRV9JXSwKKyAgICAgICAgcmNjLT5pX2NwbHhfc3VtW0FWX1BJQ1RVUkVfVFlQRV9QXSAvIChkb3VibGUpcmNjLT5mcmFtZV9jb3VudFtBVl9QSUNUVVJFX1RZUEVfUF0sCisgICAgICAgIHJjYy0+cF9jcGx4X3N1bVtBVl9QSUNUVVJFX1RZUEVfUF0gLyAoZG91YmxlKXJjYy0+ZnJhbWVfY291bnRbQVZfUElDVFVSRV9UWVBFX1BdLAorICAgICAgICByY2MtPnBfY3BseF9zdW1bQVZfUElDVFVSRV9UWVBFX0JdIC8gKGRvdWJsZSlyY2MtPmZyYW1lX2NvdW50W0FWX1BJQ1RVUkVfVFlQRV9CXSwKKyAgICAgICAgKHJjYy0+aV9jcGx4X3N1bVtwaWN0X3R5cGVdICsgcmNjLT5wX2NwbHhfc3VtW3BpY3RfdHlwZV0pIC8gKGRvdWJsZSlyY2MtPmZyYW1lX2NvdW50W3BpY3RfdHlwZV0sCisgICAgICAgIDAKKyAgICB9OworCisgICAgYml0cyA9IGF2X2V4cHJfZXZhbChyY2MtPnJjX2VxX2V2YWwsIGNvbnN0X3ZhbHVlcywgcmNlKTsKKyAgICBpZiAoaXNuYW4oYml0cykpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBldmFsdWF0aW5nIHJjX2VxIFwiJXNcIlxuIiwgcy0+cmNfZXEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmNjLT5wYXNzMV9yY19lcV9vdXRwdXRfc3VtICs9IGJpdHM7CisgICAgYml0cyAqPSByYXRlX2ZhY3RvcjsKKyAgICBpZiAoYml0cyA8IDAuMCkKKyAgICAgICAgYml0cyA9IDAuMDsKKyAgICBiaXRzICs9IDEuMDsgLy8gYXZvaWQgMS8wIGlzc3VlcworCisgICAgLyogdXNlciBvdmVycmlkZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5hdmN0eC0+cmNfb3ZlcnJpZGVfY291bnQ7IGkrKykgeworICAgICAgICBSY092ZXJyaWRlICpyY28gPSBzLT5hdmN0eC0+cmNfb3ZlcnJpZGU7CisgICAgICAgIGlmIChyY29baV0uc3RhcnRfZnJhbWUgPiBmcmFtZV9udW0pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHJjb1tpXS5lbmRfZnJhbWUgPCBmcmFtZV9udW0pCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAocmNvW2ldLnFzY2FsZSkKKyAgICAgICAgICAgIGJpdHMgPSBxcDJiaXRzKHJjZSwgcmNvW2ldLnFzY2FsZSk7ICAvLyBGSVhNRSBtb3ZlIGF0IGVuZCB0byByZWFsbHkgZm9yY2UgaXQ/CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJpdHMgKj0gcmNvW2ldLnF1YWxpdHlfZmFjdG9yOworICAgIH0KKworICAgIHEgPSBiaXRzMnFwKHJjZSwgYml0cyk7CisKKyAgICAvKiBJL0IgZGlmZmVyZW5jZSAqLworICAgIGlmIChwaWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgJiYgcy0+YXZjdHgtPmlfcXVhbnRfZmFjdG9yIDwgMC4wKQorICAgICAgICBxID0gLXEgKiBzLT5hdmN0eC0+aV9xdWFudF9mYWN0b3IgKyBzLT5hdmN0eC0+aV9xdWFudF9vZmZzZXQ7CisgICAgZWxzZSBpZiAocGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmIHMtPmF2Y3R4LT5iX3F1YW50X2ZhY3RvciA8IDAuMCkKKyAgICAgICAgcSA9IC1xICogcy0+YXZjdHgtPmJfcXVhbnRfZmFjdG9yICsgcy0+YXZjdHgtPmJfcXVhbnRfb2Zmc2V0OworICAgIGlmIChxIDwgMSkKKyAgICAgICAgcSA9IDE7CisKKyAgICByZXR1cm4gcTsKK30KKworc3RhdGljIGRvdWJsZSBnZXRfZGlmZl9saW1pdGVkX3EoTXBlZ0VuY0NvbnRleHQgKnMsIFJhdGVDb250cm9sRW50cnkgKnJjZSwgZG91YmxlIHEpCit7CisgICAgUmF0ZUNvbnRyb2xDb250ZXh0ICpyY2MgICA9ICZzLT5yY19jb250ZXh0OworICAgIEFWQ29kZWNDb250ZXh0ICphICAgICAgICAgPSBzLT5hdmN0eDsKKyAgICBjb25zdCBpbnQgcGljdF90eXBlICAgICAgID0gcmNlLT5uZXdfcGljdF90eXBlOworICAgIGNvbnN0IGRvdWJsZSBsYXN0X3BfcSAgICAgPSByY2MtPmxhc3RfcXNjYWxlX2ZvcltBVl9QSUNUVVJFX1RZUEVfUF07CisgICAgY29uc3QgZG91YmxlIGxhc3Rfbm9uX2JfcSA9IHJjYy0+bGFzdF9xc2NhbGVfZm9yW3JjYy0+bGFzdF9ub25fYl9waWN0X3R5cGVdOworCisgICAgaWYgKHBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSAmJgorICAgICAgICAoYS0+aV9xdWFudF9mYWN0b3IgPiAwLjAgfHwgcmNjLT5sYXN0X25vbl9iX3BpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkpCisgICAgICAgIHEgPSBsYXN0X3BfcSAqIEZGQUJTKGEtPmlfcXVhbnRfZmFjdG9yKSArIGEtPmlfcXVhbnRfb2Zmc2V0OworICAgIGVsc2UgaWYgKHBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJgorICAgICAgICAgICAgIGEtPmJfcXVhbnRfZmFjdG9yID4gMC4wKQorICAgICAgICBxID0gbGFzdF9ub25fYl9xICogYS0+Yl9xdWFudF9mYWN0b3IgKyBhLT5iX3F1YW50X29mZnNldDsKKyAgICBpZiAocSA8IDEpCisgICAgICAgIHEgPSAxOworCisgICAgLyogbGFzdCBxc2NhbGUgLyBxZGlmZiBzdHVmZiAqLworICAgIGlmIChyY2MtPmxhc3Rfbm9uX2JfcGljdF90eXBlID09IHBpY3RfdHlwZSB8fCBwaWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgZG91YmxlIGxhc3RfcSAgICAgPSByY2MtPmxhc3RfcXNjYWxlX2ZvcltwaWN0X3R5cGVdOworICAgICAgICBjb25zdCBpbnQgbWF4ZGlmZiA9IEZGX1FQMkxBTUJEQSAqIGEtPm1heF9xZGlmZjsKKworICAgICAgICBpZiAocSA+IGxhc3RfcSArIG1heGRpZmYpCisgICAgICAgICAgICBxID0gbGFzdF9xICsgbWF4ZGlmZjsKKyAgICAgICAgZWxzZSBpZiAocSA8IGxhc3RfcSAtIG1heGRpZmYpCisgICAgICAgICAgICBxID0gbGFzdF9xIC0gbWF4ZGlmZjsKKyAgICB9CisKKyAgICByY2MtPmxhc3RfcXNjYWxlX2ZvcltwaWN0X3R5cGVdID0gcTsgLy8gTm90ZSB3ZSBjYW5ub3QgZG8gdGhhdCBhZnRlciBibHVycmluZworCisgICAgaWYgKHBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgcmNjLT5sYXN0X25vbl9iX3BpY3RfdHlwZSA9IHBpY3RfdHlwZTsKKworICAgIHJldHVybiBxOworfQorCisvKioKKyAqIEdldCB0aGUgcW1pbiAmIHFtYXggZm9yIHBpY3RfdHlwZS4KKyAqLworc3RhdGljIHZvaWQgZ2V0X3FtaW5tYXgoaW50ICpxbWluX3JldCwgaW50ICpxbWF4X3JldCwgTXBlZ0VuY0NvbnRleHQgKnMsIGludCBwaWN0X3R5cGUpCit7CisgICAgaW50IHFtaW4gPSBzLT5sbWluOworICAgIGludCBxbWF4ID0gcy0+bG1heDsKKworICAgIGFzc2VydChxbWluIDw9IHFtYXgpOworCisgICAgc3dpdGNoIChwaWN0X3R5cGUpIHsKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9COgorICAgICAgICBxbWluID0gKGludCkocW1pbiAqIEZGQUJTKHMtPmF2Y3R4LT5iX3F1YW50X2ZhY3RvcikgKyBzLT5hdmN0eC0+Yl9xdWFudF9vZmZzZXQgKyAwLjUpOworICAgICAgICBxbWF4ID0gKGludCkocW1heCAqIEZGQUJTKHMtPmF2Y3R4LT5iX3F1YW50X2ZhY3RvcikgKyBzLT5hdmN0eC0+Yl9xdWFudF9vZmZzZXQgKyAwLjUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9JOgorICAgICAgICBxbWluID0gKGludCkocW1pbiAqIEZGQUJTKHMtPmF2Y3R4LT5pX3F1YW50X2ZhY3RvcikgKyBzLT5hdmN0eC0+aV9xdWFudF9vZmZzZXQgKyAwLjUpOworICAgICAgICBxbWF4ID0gKGludCkocW1heCAqIEZGQUJTKHMtPmF2Y3R4LT5pX3F1YW50X2ZhY3RvcikgKyBzLT5hdmN0eC0+aV9xdWFudF9vZmZzZXQgKyAwLjUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBxbWluID0gYXZfY2xpcChxbWluLCAxLCBGRl9MQU1CREFfTUFYKTsKKyAgICBxbWF4ID0gYXZfY2xpcChxbWF4LCAxLCBGRl9MQU1CREFfTUFYKTsKKworICAgIGlmIChxbWF4IDwgcW1pbikKKyAgICAgICAgcW1heCA9IHFtaW47CisKKyAgICAqcW1pbl9yZXQgPSBxbWluOworICAgICpxbWF4X3JldCA9IHFtYXg7Cit9CisKK3N0YXRpYyBkb3VibGUgbW9kaWZ5X3FzY2FsZShNcGVnRW5jQ29udGV4dCAqcywgUmF0ZUNvbnRyb2xFbnRyeSAqcmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBxLCBpbnQgZnJhbWVfbnVtKQoreworICAgIFJhdGVDb250cm9sQ29udGV4dCAqcmNjICA9ICZzLT5yY19jb250ZXh0OworICAgIGNvbnN0IGRvdWJsZSBidWZmZXJfc2l6ZSA9IHMtPmF2Y3R4LT5yY19idWZmZXJfc2l6ZTsKKyAgICBjb25zdCBkb3VibGUgZnBzICAgICAgICAgPSBnZXRfZnBzKHMtPmF2Y3R4KTsKKyAgICBjb25zdCBkb3VibGUgbWluX3JhdGUgICAgPSBzLT5hdmN0eC0+cmNfbWluX3JhdGUgLyBmcHM7CisgICAgY29uc3QgZG91YmxlIG1heF9yYXRlICAgID0gcy0+YXZjdHgtPnJjX21heF9yYXRlIC8gZnBzOworICAgIGNvbnN0IGludCBwaWN0X3R5cGUgICAgICA9IHJjZS0+bmV3X3BpY3RfdHlwZTsKKyAgICBpbnQgcW1pbiwgcW1heDsKKworICAgIGdldF9xbWlubWF4KCZxbWluLCAmcW1heCwgcywgcGljdF90eXBlKTsKKworICAgIC8qIG1vZHVsYXRpb24gKi8KKyAgICBpZiAocy0+cmNfcW1vZF9mcmVxICYmCisgICAgICAgIGZyYW1lX251bSAlIHMtPnJjX3Ftb2RfZnJlcSA9PSAwICYmCisgICAgICAgIHBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkKKyAgICAgICAgcSAqPSBzLT5yY19xbW9kX2FtcDsKKworICAgIC8qIGJ1ZmZlciBvdmVyZmxvdy91bmRlcmZsb3cgcHJvdGVjdGlvbiAqLworICAgIGlmIChidWZmZXJfc2l6ZSkgeworICAgICAgICBkb3VibGUgZXhwZWN0ZWRfc2l6ZSA9IHJjYy0+YnVmZmVyX2luZGV4OworICAgICAgICBkb3VibGUgcV9saW1pdDsKKworICAgICAgICBpZiAobWluX3JhdGUpIHsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gMiAqIChidWZmZXJfc2l6ZSAtIGV4cGVjdGVkX3NpemUpIC8gYnVmZmVyX3NpemU7CisgICAgICAgICAgICBpZiAoZCA+IDEuMCkKKyAgICAgICAgICAgICAgICBkID0gMS4wOworICAgICAgICAgICAgZWxzZSBpZiAoZCA8IDAuMDAwMSkKKyAgICAgICAgICAgICAgICBkID0gMC4wMDAxOworICAgICAgICAgICAgcSAqPSBwb3coZCwgMS4wIC8gcy0+cmNfYnVmZmVyX2FnZ3Jlc3Npdml0eSk7CisKKyAgICAgICAgICAgIHFfbGltaXQgPSBiaXRzMnFwKHJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUFYKChtaW5fcmF0ZSAtIGJ1ZmZlcl9zaXplICsgcmNjLT5idWZmZXJfaW5kZXgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5yY19taW5fdmJ2X292ZXJmbG93X3VzZSwgMSkpOworCisgICAgICAgICAgICBpZiAocSA+IHFfbGltaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUkMpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbWl0aW5nIFFQICVmIC0+ICVmXG4iLCBxLCBxX2xpbWl0KTsKKyAgICAgICAgICAgICAgICBxID0gcV9saW1pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYXhfcmF0ZSkgeworICAgICAgICAgICAgZG91YmxlIGQgPSAyICogZXhwZWN0ZWRfc2l6ZSAvIGJ1ZmZlcl9zaXplOworICAgICAgICAgICAgaWYgKGQgPiAxLjApCisgICAgICAgICAgICAgICAgZCA9IDEuMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGQgPCAwLjAwMDEpCisgICAgICAgICAgICAgICAgZCA9IDAuMDAwMTsKKyAgICAgICAgICAgIHEgLz0gcG93KGQsIDEuMCAvIHMtPnJjX2J1ZmZlcl9hZ2dyZXNzaXZpdHkpOworCisgICAgICAgICAgICBxX2xpbWl0ID0gYml0czJxcChyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1BWChyY2MtPmJ1ZmZlcl9pbmRleCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+cmNfbWF4X2F2YWlsYWJsZV92YnZfdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpOworICAgICAgICAgICAgaWYgKHEgPCBxX2xpbWl0KSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1JDKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW1pdGluZyBRUCAlZiAtPiAlZlxuIiwgcSwgcV9saW1pdCk7CisgICAgICAgICAgICAgICAgcSA9IHFfbGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZGxvZyhzLCAicTolZiBtYXg6JWYgbWluOiVmIHNpemU6JWYgaW5kZXg6JWYgYWdyOiVmXG4iLAorICAgICAgICAgICAgcSwgbWF4X3JhdGUsIG1pbl9yYXRlLCBidWZmZXJfc2l6ZSwgcmNjLT5idWZmZXJfaW5kZXgsCisgICAgICAgICAgICBzLT5yY19idWZmZXJfYWdncmVzc2l2aXR5KTsKKyAgICBpZiAocy0+cmNfcXNxdWlzaCA9PSAwLjAgfHwgcW1pbiA9PSBxbWF4KSB7CisgICAgICAgIGlmIChxIDwgcW1pbikKKyAgICAgICAgICAgIHEgPSBxbWluOworICAgICAgICBlbHNlIGlmIChxID4gcW1heCkKKyAgICAgICAgICAgIHEgPSBxbWF4OworICAgIH0gZWxzZSB7CisgICAgICAgIGRvdWJsZSBtaW4yID0gbG9nKHFtaW4pOworICAgICAgICBkb3VibGUgbWF4MiA9IGxvZyhxbWF4KTsKKworICAgICAgICBxICA9IGxvZyhxKTsKKyAgICAgICAgcSAgPSAocSAtIG1pbjIpIC8gKG1heDIgLSBtaW4yKSAtIDAuNTsKKyAgICAgICAgcSAqPSAtNC4wOworICAgICAgICBxICA9IDEuMCAvICgxLjAgKyBleHAocSkpOworICAgICAgICBxICA9IHEgKiAobWF4MiAtIG1pbjIpICsgbWluMjsKKworICAgICAgICBxID0gZXhwKHEpOworICAgIH0KKworICAgIHJldHVybiBxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAxIFBhc3MgQ29kZQorCitzdGF0aWMgZG91YmxlIHByZWRpY3Rfc2l6ZShQcmVkaWN0b3IgKnAsIGRvdWJsZSBxLCBkb3VibGUgdmFyKQoreworICAgIHJldHVybiBwLT5jb2VmZiAqIHZhciAvIChxICogcC0+Y291bnQpOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfcHJlZGljdG9yKFByZWRpY3RvciAqcCwgZG91YmxlIHEsIGRvdWJsZSB2YXIsIGRvdWJsZSBzaXplKQoreworICAgIGRvdWJsZSBuZXdfY29lZmYgPSBzaXplICogcSAvICh2YXIgKyAxKTsKKyAgICBpZiAodmFyIDwgMTApCisgICAgICAgIHJldHVybjsKKworICAgIHAtPmNvdW50ICo9IHAtPmRlY2F5OworICAgIHAtPmNvZWZmICo9IHAtPmRlY2F5OworICAgIHAtPmNvdW50Kys7CisgICAgcC0+Y29lZmYgKz0gbmV3X2NvZWZmOworfQorCitzdGF0aWMgdm9pZCBhZGFwdGl2ZV9xdWFudGl6YXRpb24oTXBlZ0VuY0NvbnRleHQgKnMsIGRvdWJsZSBxKQoreworICAgIGludCBpOworICAgIGNvbnN0IGZsb2F0IGx1bWlfbWFza2luZyAgICAgICAgID0gcy0+YXZjdHgtPmx1bWlfbWFza2luZyAvICgxMjguMCAqIDEyOC4wKTsKKyAgICBjb25zdCBmbG9hdCBkYXJrX21hc2tpbmcgICAgICAgICA9IHMtPmF2Y3R4LT5kYXJrX21hc2tpbmcgLyAoMTI4LjAgKiAxMjguMCk7CisgICAgY29uc3QgZmxvYXQgdGVtcF9jcGx4X21hc2tpbmcgICAgPSBzLT5hdmN0eC0+dGVtcG9yYWxfY3BseF9tYXNraW5nOworICAgIGNvbnN0IGZsb2F0IHNwYXRpYWxfY3BseF9tYXNraW5nID0gcy0+YXZjdHgtPnNwYXRpYWxfY3BseF9tYXNraW5nOworICAgIGNvbnN0IGZsb2F0IHBfbWFza2luZyAgICAgICAgICAgID0gcy0+YXZjdHgtPnBfbWFza2luZzsKKyAgICBjb25zdCBmbG9hdCBib3JkZXJfbWFza2luZyAgICAgICA9IHMtPmJvcmRlcl9tYXNraW5nOworICAgIGZsb2F0IGJpdHNfc3VtICAgICAgICAgICAgICAgICAgID0gMC4wOworICAgIGZsb2F0IGNwbHhfc3VtICAgICAgICAgICAgICAgICAgID0gMC4wOworICAgIGZsb2F0ICpjcGx4X3RhYiAgICAgICAgICAgICAgICAgID0gcy0+Y3BseF90YWI7CisgICAgZmxvYXQgKmJpdHNfdGFiICAgICAgICAgICAgICAgICAgPSBzLT5iaXRzX3RhYjsKKyAgICBjb25zdCBpbnQgcW1pbiAgICAgICAgICAgICAgICAgICA9IHMtPmF2Y3R4LT5tYl9sbWluOworICAgIGNvbnN0IGludCBxbWF4ICAgICAgICAgICAgICAgICAgID0gcy0+YXZjdHgtPm1iX2xtYXg7CisgICAgUGljdHVyZSAqY29uc3QgcGljICAgICAgICAgICAgICAgPSAmcy0+Y3VycmVudF9waWN0dXJlOworICAgIGNvbnN0IGludCBtYl93aWR0aCAgICAgICAgICAgICAgID0gcy0+bWJfd2lkdGg7CisgICAgY29uc3QgaW50IG1iX2hlaWdodCAgICAgICAgICAgICAgPSBzLT5tYl9oZWlnaHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bWJfbnVtOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IG1iX3h5ID0gcy0+bWJfaW5kZXgyeHlbaV07CisgICAgICAgIGZsb2F0IHRlbXBfY3BseCA9IHNxcnQocGljLT5tY19tYl92YXJbbWJfeHldKTsgLy8gRklYTUUgbWVyZ2UgaW4gcG93KCkKKyAgICAgICAgZmxvYXQgc3BhdF9jcGx4ID0gc3FydChwaWMtPm1iX3ZhclttYl94eV0pOworICAgICAgICBjb25zdCBpbnQgbHVtaSAgPSBwaWMtPm1iX21lYW5bbWJfeHldOworICAgICAgICBmbG9hdCBiaXRzLCBjcGx4LCBmYWN0b3I7CisgICAgICAgIGludCBtYl94ID0gbWJfeHkgJSBzLT5tYl9zdHJpZGU7CisgICAgICAgIGludCBtYl95ID0gbWJfeHkgLyBzLT5tYl9zdHJpZGU7CisgICAgICAgIGludCBtYl9kaXN0YW5jZTsKKyAgICAgICAgZmxvYXQgbWJfZmFjdG9yID0gMC4wOworICAgICAgICBpZiAoc3BhdF9jcGx4IDwgNCkKKyAgICAgICAgICAgIHNwYXRfY3BseCA9IDQ7ICAgICAgICAgICAgICAvLyBGSVhNRSBmaW5ldHVuZQorICAgICAgICBpZiAodGVtcF9jcGx4IDwgNCkKKyAgICAgICAgICAgIHRlbXBfY3BseCA9IDQ7ICAgICAgICAgICAgICAvLyBGSVhNRSBmaW5ldHVuZQorCisgICAgICAgIGlmICgocy0+bWJfdHlwZVttYl94eV0gJiBDQU5ESURBVEVfTUJfVFlQRV9JTlRSQSkpIHsgLy8gRklYTUUgaHEgbW9kZQorICAgICAgICAgICAgY3BseCAgID0gc3BhdF9jcGx4OworICAgICAgICAgICAgZmFjdG9yID0gMS4wICsgcF9tYXNraW5nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3BseCAgID0gdGVtcF9jcGx4OworICAgICAgICAgICAgZmFjdG9yID0gcG93KHRlbXBfY3BseCwgLXRlbXBfY3BseF9tYXNraW5nKTsKKyAgICAgICAgfQorICAgICAgICBmYWN0b3IgKj0gcG93KHNwYXRfY3BseCwgLXNwYXRpYWxfY3BseF9tYXNraW5nKTsKKworICAgICAgICBpZiAobHVtaSA+IDEyNykKKyAgICAgICAgICAgIGZhY3RvciAqPSAoMS4wIC0gKGx1bWkgLSAxMjgpICogKGx1bWkgLSAxMjgpICogbHVtaV9tYXNraW5nKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmFjdG9yICo9ICgxLjAgLSAobHVtaSAtIDEyOCkgKiAobHVtaSAtIDEyOCkgKiBkYXJrX21hc2tpbmcpOworCisgICAgICAgIGlmIChtYl94IDwgbWJfd2lkdGggLyA1KSB7CisgICAgICAgICAgICBtYl9kaXN0YW5jZSA9IG1iX3dpZHRoIC8gNSAtIG1iX3g7CisgICAgICAgICAgICBtYl9mYWN0b3IgICA9IChmbG9hdCltYl9kaXN0YW5jZSAvIChmbG9hdCkobWJfd2lkdGggLyA1KTsKKyAgICAgICAgfSBlbHNlIGlmIChtYl94ID4gNCAqIG1iX3dpZHRoIC8gNSkgeworICAgICAgICAgICAgbWJfZGlzdGFuY2UgPSBtYl94IC0gNCAqIG1iX3dpZHRoIC8gNTsKKyAgICAgICAgICAgIG1iX2ZhY3RvciAgID0gKGZsb2F0KW1iX2Rpc3RhbmNlIC8gKGZsb2F0KShtYl93aWR0aCAvIDUpOworICAgICAgICB9CisgICAgICAgIGlmIChtYl95IDwgbWJfaGVpZ2h0IC8gNSkgeworICAgICAgICAgICAgbWJfZGlzdGFuY2UgPSBtYl9oZWlnaHQgLyA1IC0gbWJfeTsKKyAgICAgICAgICAgIG1iX2ZhY3RvciAgID0gRkZNQVgobWJfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpbWJfZGlzdGFuY2UgLyAoZmxvYXQpKG1iX2hlaWdodCAvIDUpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtYl95ID4gNCAqIG1iX2hlaWdodCAvIDUpIHsKKyAgICAgICAgICAgIG1iX2Rpc3RhbmNlID0gbWJfeSAtIDQgKiBtYl9oZWlnaHQgLyA1OworICAgICAgICAgICAgbWJfZmFjdG9yICAgPSBGRk1BWChtYl9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCltYl9kaXN0YW5jZSAvIChmbG9hdCkobWJfaGVpZ2h0IC8gNSkpOworICAgICAgICB9CisKKyAgICAgICAgZmFjdG9yICo9IDEuMCAtIGJvcmRlcl9tYXNraW5nICogbWJfZmFjdG9yOworCisgICAgICAgIGlmIChmYWN0b3IgPCAwLjAwMDAxKQorICAgICAgICAgICAgZmFjdG9yID0gMC4wMDAwMTsKKworICAgICAgICBiaXRzICAgICAgICA9IGNwbHggKiBmYWN0b3I7CisgICAgICAgIGNwbHhfc3VtICAgKz0gY3BseDsKKyAgICAgICAgYml0c19zdW0gICArPSBiaXRzOworICAgICAgICBjcGx4X3RhYltpXSA9IGNwbHg7CisgICAgICAgIGJpdHNfdGFiW2ldID0gYml0czsKKyAgICB9CisKKyAgICAvKiBoYW5kbGUgcW1pbi9xbWF4IGNsaXBwaW5nICovCisgICAgaWYgKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX05BUSkgeworICAgICAgICBmbG9hdCBmYWN0b3IgPSBiaXRzX3N1bSAvIGNwbHhfc3VtOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bWJfbnVtOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IG5ld3EgPSBxICogY3BseF90YWJbaV0gLyBiaXRzX3RhYltpXTsKKyAgICAgICAgICAgIG5ld3EgKj0gZmFjdG9yOworCisgICAgICAgICAgICBpZiAobmV3cSA+IHFtYXgpIHsKKyAgICAgICAgICAgICAgICBiaXRzX3N1bSAtPSBiaXRzX3RhYltpXTsKKyAgICAgICAgICAgICAgICBjcGx4X3N1bSAtPSBjcGx4X3RhYltpXSAqIHEgLyBxbWF4OworICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdxIDwgcW1pbikgeworICAgICAgICAgICAgICAgIGJpdHNfc3VtIC09IGJpdHNfdGFiW2ldOworICAgICAgICAgICAgICAgIGNwbHhfc3VtIC09IGNwbHhfdGFiW2ldICogcSAvIHFtaW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpdHNfc3VtIDwgMC4wMDEpCisgICAgICAgICAgICBiaXRzX3N1bSA9IDAuMDAxOworICAgICAgICBpZiAoY3BseF9zdW0gPCAwLjAwMSkKKyAgICAgICAgICAgIGNwbHhfc3VtID0gMC4wMDE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm1iX251bTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBtYl94eSA9IHMtPm1iX2luZGV4Mnh5W2ldOworICAgICAgICBmbG9hdCBuZXdxICAgICAgPSBxICogY3BseF90YWJbaV0gLyBiaXRzX3RhYltpXTsKKyAgICAgICAgaW50IGludHE7CisKKyAgICAgICAgaWYgKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX05BUSkgeworICAgICAgICAgICAgbmV3cSAqPSBiaXRzX3N1bSAvIGNwbHhfc3VtOworICAgICAgICB9CisKKyAgICAgICAgaW50cSA9IChpbnQpKG5ld3EgKyAwLjUpOworCisgICAgICAgIGlmIChpbnRxID4gcW1heCkKKyAgICAgICAgICAgIGludHEgPSBxbWF4OworICAgICAgICBlbHNlIGlmIChpbnRxIDwgcW1pbikKKyAgICAgICAgICAgIGludHEgPSBxbWluOworICAgICAgICBzLT5sYW1iZGFfdGFibGVbbWJfeHldID0gaW50cTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfZ2V0XzJwYXNzX2Zjb2RlKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIFJhdGVDb250cm9sQ29udGV4dCAqcmNjID0gJnMtPnJjX2NvbnRleHQ7CisgICAgUmF0ZUNvbnRyb2xFbnRyeSAqcmNlICAgPSAmcmNjLT5lbnRyeVtzLT5waWN0dXJlX251bWJlcl07CisKKyAgICBzLT5mX2NvZGUgPSByY2UtPmZfY29kZTsKKyAgICBzLT5iX2NvZGUgPSByY2UtPmJfY29kZTsKK30KKworLy8gRklYTUUgcmQgb3IgYXQgbGVhc3QgYXBwcm94IGZvciBkcXVhbnQKKworZmxvYXQgZmZfcmF0ZV9lc3RpbWF0ZV9xc2NhbGUoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBkcnlfcnVuKQoreworICAgIGZsb2F0IHE7CisgICAgaW50IHFtaW4sIHFtYXg7CisgICAgZmxvYXQgYnJfY29tcGVuc2F0aW9uOworICAgIGRvdWJsZSBkaWZmOworICAgIGRvdWJsZSBzaG9ydF90ZXJtX3E7CisgICAgZG91YmxlIGZwczsKKyAgICBpbnQgcGljdHVyZV9udW1iZXIgPSBzLT5waWN0dXJlX251bWJlcjsKKyAgICBpbnQ2NF90IHdhbnRlZF9iaXRzOworICAgIFJhdGVDb250cm9sQ29udGV4dCAqcmNjID0gJnMtPnJjX2NvbnRleHQ7CisgICAgQVZDb2RlY0NvbnRleHQgKmEgICAgICAgPSBzLT5hdmN0eDsKKyAgICBSYXRlQ29udHJvbEVudHJ5IGxvY2FsX3JjZSwgKnJjZTsKKyAgICBkb3VibGUgYml0czsKKyAgICBkb3VibGUgcmF0ZV9mYWN0b3I7CisgICAgaW50NjRfdCB2YXI7CisgICAgY29uc3QgaW50IHBpY3RfdHlwZSA9IHMtPnBpY3RfdHlwZTsKKyAgICBQaWN0dXJlICogY29uc3QgcGljID0gJnMtPmN1cnJlbnRfcGljdHVyZTsKKyAgICBlbW1zX2MoKTsKKworI2lmIENPTkZJR19MSUJYVklECisgICAgaWYgKChzLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzIpICYmCisgICAgICAgIHMtPmF2Y3R4LT5yY19zdHJhdGVneSA9PSBGRl9SQ19TVFJBVEVHWV9YVklEKQorICAgICAgICByZXR1cm4gZmZfeHZpZF9yYXRlX2VzdGltYXRlX3FzY2FsZShzLCBkcnlfcnVuKTsKKyNlbmRpZgorCisgICAgZ2V0X3FtaW5tYXgoJnFtaW4sICZxbWF4LCBzLCBwaWN0X3R5cGUpOworCisgICAgZnBzID0gZ2V0X2ZwcyhzLT5hdmN0eCk7CisgICAgLyogdXBkYXRlIHByZWRpY3RvcnMgKi8KKyAgICBpZiAocGljdHVyZV9udW1iZXIgPiAyICYmICFkcnlfcnVuKSB7CisgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdF92YXIgPQorICAgICAgICAgICAgcy0+bGFzdF9waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgPyByY2MtPmxhc3RfbWJfdmFyX3N1bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByY2MtPmxhc3RfbWNfbWJfdmFyX3N1bTsKKyAgICAgICAgYXZfYXNzZXJ0MShzLT5mcmFtZV9iaXRzID49IHMtPnN0dWZmaW5nX2JpdHMpOworICAgICAgICB1cGRhdGVfcHJlZGljdG9yKCZyY2MtPnByZWRbcy0+bGFzdF9waWN0X3R5cGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJjYy0+bGFzdF9xc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3FydChsYXN0X3ZhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWVfYml0cyAtIHMtPnN0dWZmaW5nX2JpdHMpOworICAgIH0KKworICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzIpIHsKKyAgICAgICAgYXNzZXJ0KHBpY3R1cmVfbnVtYmVyID49IDApOworICAgICAgICBpZiAocGljdHVyZV9udW1iZXIgPj0gcmNjLT5udW1fZW50cmllcykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIklucHV0IGlzIGxvbmdlciB0aGFuIDItcGFzcyBsb2cgZmlsZVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmNlICAgICAgICAgPSAmcmNjLT5lbnRyeVtwaWN0dXJlX251bWJlcl07CisgICAgICAgIHdhbnRlZF9iaXRzID0gcmNlLT5leHBlY3RlZF9iaXRzOworICAgIH0gZWxzZSB7CisgICAgICAgIFBpY3R1cmUgKmR0c19waWM7CisgICAgICAgIHJjZSA9ICZsb2NhbF9yY2U7CisKKyAgICAgICAgLyogRklYTUUgYWRkIGEgZHRzIGZpZWxkIHRvIEFWRnJhbWUgYW5kIGVuc3VyZSBpdCBpcyBzZXQgYW5kIHVzZSBpdAorICAgICAgICAgKiBoZXJlIGluc3RlYWQgb2YgcmVvcmRlcmluZyBidXQgdGhlIHJlb3JkZXJpbmcgaXMgc2ltcGxlciBmb3Igbm93CisgICAgICAgICAqIHVudGlsIEguMjY0IEItcHlyYW1pZCBtdXN0IGJlIGhhbmRsZWQuICovCisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgfHwgcy0+bG93X2RlbGF5KQorICAgICAgICAgICAgZHRzX3BpYyA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGR0c19waWMgPSBzLT5sYXN0X3BpY3R1cmVfcHRyOworCisgICAgICAgIGlmICghZHRzX3BpYyB8fCBkdHNfcGljLT5mLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICB3YW50ZWRfYml0cyA9ICh1aW50NjRfdCkocy0+Yml0X3JhdGUgKiAoZG91YmxlKXBpY3R1cmVfbnVtYmVyIC8gZnBzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd2FudGVkX2JpdHMgPSAodWludDY0X3QpKHMtPmJpdF9yYXRlICogKGRvdWJsZSlkdHNfcGljLT5mLT5wdHMgLyBmcHMpOworICAgIH0KKworICAgIGRpZmYgPSBzLT50b3RhbF9iaXRzIC0gd2FudGVkX2JpdHM7CisgICAgYnJfY29tcGVuc2F0aW9uID0gKGEtPmJpdF9yYXRlX3RvbGVyYW5jZSAtIGRpZmYpIC8gYS0+Yml0X3JhdGVfdG9sZXJhbmNlOworICAgIGlmIChicl9jb21wZW5zYXRpb24gPD0gMC4wKQorICAgICAgICBicl9jb21wZW5zYXRpb24gPSAwLjAwMTsKKworICAgIHZhciA9IHBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSA/IHBpYy0+bWJfdmFyX3N1bSA6IHBpYy0+bWNfbWJfdmFyX3N1bTsKKworICAgIHNob3J0X3Rlcm1fcSA9IDA7IC8qIGF2b2lkIHdhcm5pbmcgKi8KKyAgICBpZiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1BBU1MyKSB7CisgICAgICAgIGlmIChwaWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgICAgICBhc3NlcnQocGljdF90eXBlID09IHJjZS0+bmV3X3BpY3RfdHlwZSk7CisKKyAgICAgICAgcSA9IHJjZS0+bmV3X3FzY2FsZSAvIGJyX2NvbXBlbnNhdGlvbjsKKyAgICAgICAgYXZfZGxvZyhzLCAiJWYgJWYgJWYgbGFzdDolZCB2YXI6JSJQUklkNjQiIHR5cGU6JWQvL1xuIiwgcSwgcmNlLT5uZXdfcXNjYWxlLAorICAgICAgICAgICAgICAgIGJyX2NvbXBlbnNhdGlvbiwgcy0+ZnJhbWVfYml0cywgdmFyLCBwaWN0X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJjZS0+cGljdF90eXBlICAgICA9CisgICAgICAgIHJjZS0+bmV3X3BpY3RfdHlwZSA9IHBpY3RfdHlwZTsKKyAgICAgICAgcmNlLT5tY19tYl92YXJfc3VtID0gcGljLT5tY19tYl92YXJfc3VtOworICAgICAgICByY2UtPm1iX3Zhcl9zdW0gICAgPSBwaWMtPm1iX3Zhcl9zdW07CisgICAgICAgIHJjZS0+cXNjYWxlICAgICAgICA9IEZGX1FQMkxBTUJEQSAqIDI7CisgICAgICAgIHJjZS0+Zl9jb2RlICAgICAgICA9IHMtPmZfY29kZTsKKyAgICAgICAgcmNlLT5iX2NvZGUgICAgICAgID0gcy0+Yl9jb2RlOworICAgICAgICByY2UtPm1pc2NfYml0cyAgICAgPSAxOworCisgICAgICAgIGJpdHMgPSBwcmVkaWN0X3NpemUoJnJjYy0+cHJlZFtwaWN0X3R5cGVdLCByY2UtPnFzY2FsZSwgc3FydCh2YXIpKTsKKyAgICAgICAgaWYgKHBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICAgICAgcmNlLT5pX2NvdW50ICAgID0gcy0+bWJfbnVtOworICAgICAgICAgICAgcmNlLT5pX3RleF9iaXRzID0gYml0czsKKyAgICAgICAgICAgIHJjZS0+cF90ZXhfYml0cyA9IDA7CisgICAgICAgICAgICByY2UtPm12X2JpdHMgICAgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmNlLT5pX2NvdW50ICAgID0gMDsgICAgLy8gRklYTUUgd2UgZG8ga25vdyB0aGlzIGFwcHJveAorICAgICAgICAgICAgcmNlLT5pX3RleF9iaXRzID0gMDsKKyAgICAgICAgICAgIHJjZS0+cF90ZXhfYml0cyA9IGJpdHMgKiAwLjk7CisgICAgICAgICAgICByY2UtPm12X2JpdHMgICAgPSBiaXRzICogMC4xOworICAgICAgICB9CisgICAgICAgIHJjYy0+aV9jcGx4X3N1bVtwaWN0X3R5cGVdICArPSByY2UtPmlfdGV4X2JpdHMgKiByY2UtPnFzY2FsZTsKKyAgICAgICAgcmNjLT5wX2NwbHhfc3VtW3BpY3RfdHlwZV0gICs9IHJjZS0+cF90ZXhfYml0cyAqIHJjZS0+cXNjYWxlOworICAgICAgICByY2MtPm12X2JpdHNfc3VtW3BpY3RfdHlwZV0gKz0gcmNlLT5tdl9iaXRzOworICAgICAgICByY2MtPmZyYW1lX2NvdW50W3BpY3RfdHlwZV0rKzsKKworICAgICAgICByYXRlX2ZhY3RvciA9IHJjYy0+cGFzczFfd2FudGVkX2JpdHMgLworICAgICAgICAgICAgICAgICAgICAgIHJjYy0+cGFzczFfcmNfZXFfb3V0cHV0X3N1bSAqIGJyX2NvbXBlbnNhdGlvbjsKKworICAgICAgICBxID0gZ2V0X3FzY2FsZShzLCByY2UsIHJhdGVfZmFjdG9yLCBwaWN0dXJlX251bWJlcik7CisgICAgICAgIGlmIChxIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBhc3NlcnQocSA+IDAuMCk7CisgICAgICAgIHEgPSBnZXRfZGlmZl9saW1pdGVkX3EocywgcmNlLCBxKTsKKyAgICAgICAgYXNzZXJ0KHEgPiAwLjApOworCisgICAgICAgIC8vIEZJWE1FIHR5cGUgZGVwZW5kZW50IGJsdXIgbGlrZSBpbiAyLXBhc3MKKyAgICAgICAgaWYgKHBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCB8fCBzLT5pbnRyYV9vbmx5KSB7CisgICAgICAgICAgICByY2MtPnNob3J0X3Rlcm1fcXN1bSAgICo9IGEtPnFibHVyOworICAgICAgICAgICAgcmNjLT5zaG9ydF90ZXJtX3Fjb3VudCAqPSBhLT5xYmx1cjsKKworICAgICAgICAgICAgcmNjLT5zaG9ydF90ZXJtX3FzdW0gKz0gcTsKKyAgICAgICAgICAgIHJjYy0+c2hvcnRfdGVybV9xY291bnQrKzsKKyAgICAgICAgICAgIHEgPSBzaG9ydF90ZXJtX3EgPSByY2MtPnNob3J0X3Rlcm1fcXN1bSAvIHJjYy0+c2hvcnRfdGVybV9xY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KHEgPiAwLjApOworCisgICAgICAgIHEgPSBtb2RpZnlfcXNjYWxlKHMsIHJjZSwgcSwgcGljdHVyZV9udW1iZXIpOworCisgICAgICAgIHJjYy0+cGFzczFfd2FudGVkX2JpdHMgKz0gcy0+Yml0X3JhdGUgLyBmcHM7CisKKyAgICAgICAgYXNzZXJ0KHEgPiAwLjApOworICAgIH0KKworICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19SQykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICIlYyBxcDolZDwlMi4xZjwlZCAlZCB3YW50OiVkIHRvdGFsOiVkIGNvbXA6JWYgc3RfcTolMi4yZiAiCisgICAgICAgICAgICAgICAic2l6ZTolZCB2YXI6JSJQUklkNjQiLyUiUFJJZDY0IiBicjolZCBmcHM6JWRcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfcGljdHVyZV90eXBlX2NoYXIocGljdF90eXBlKSwKKyAgICAgICAgICAgICAgIHFtaW4sIHEsIHFtYXgsIHBpY3R1cmVfbnVtYmVyLAorICAgICAgICAgICAgICAgKGludCl3YW50ZWRfYml0cyAvIDEwMDAsIChpbnQpcy0+dG90YWxfYml0cyAvIDEwMDAsCisgICAgICAgICAgICAgICBicl9jb21wZW5zYXRpb24sIHNob3J0X3Rlcm1fcSwgcy0+ZnJhbWVfYml0cywKKyAgICAgICAgICAgICAgIHBpYy0+bWJfdmFyX3N1bSwgcGljLT5tY19tYl92YXJfc3VtLAorICAgICAgICAgICAgICAgcy0+Yml0X3JhdGUgLyAxMDAwLCAoaW50KWZwcyk7CisgICAgfQorCisgICAgaWYgKHEgPCBxbWluKQorICAgICAgICBxID0gcW1pbjsKKyAgICBlbHNlIGlmIChxID4gcW1heCkKKyAgICAgICAgcSA9IHFtYXg7CisKKyAgICBpZiAocy0+YWRhcHRpdmVfcXVhbnQpCisgICAgICAgIGFkYXB0aXZlX3F1YW50aXphdGlvbihzLCBxKTsKKyAgICBlbHNlCisgICAgICAgIHEgPSAoaW50KShxICsgMC41KTsKKworICAgIGlmICghZHJ5X3J1bikgeworICAgICAgICByY2MtPmxhc3RfcXNjYWxlICAgICAgICA9IHE7CisgICAgICAgIHJjYy0+bGFzdF9tY19tYl92YXJfc3VtID0gcGljLT5tY19tYl92YXJfc3VtOworICAgICAgICByY2MtPmxhc3RfbWJfdmFyX3N1bSAgICA9IHBpYy0+bWJfdmFyX3N1bTsKKyAgICB9CisgICAgcmV0dXJuIHE7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDItUGFzcyBjb2RlCisKK3N0YXRpYyBpbnQgaW5pdF9wYXNzMihNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBSYXRlQ29udHJvbENvbnRleHQgKnJjYyA9ICZzLT5yY19jb250ZXh0OworICAgIEFWQ29kZWNDb250ZXh0ICphICAgICAgID0gcy0+YXZjdHg7CisgICAgaW50IGksIHRvb2JpZzsKKyAgICBkb3VibGUgZnBzICAgICAgICAgICAgID0gZ2V0X2ZwcyhzLT5hdmN0eCk7CisgICAgZG91YmxlIGNvbXBsZXhpdHlbNV0gICA9IHsgMCB9OyAvLyBhcHByb3hpbWF0ZSBiaXRzIGF0IHF1YW50PTEKKyAgICB1aW50NjRfdCBjb25zdF9iaXRzWzVdID0geyAwIH07IC8vIHF1YW50aXplciBpbmRlcGVuZGVudCBiaXRzCisgICAgdWludDY0X3QgYWxsX2NvbnN0X2JpdHM7CisgICAgdWludDY0X3QgYWxsX2F2YWlsYWJsZV9iaXRzID0gKHVpbnQ2NF90KShzLT5iaXRfcmF0ZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKXJjYy0+bnVtX2VudHJpZXMgLyBmcHMpOworICAgIGRvdWJsZSByYXRlX2ZhY3RvciAgICAgICAgICA9IDA7CisgICAgZG91YmxlIHN0ZXA7CisgICAgY29uc3QgaW50IGZpbHRlcl9zaXplID0gKGludCkoYS0+cWJsdXIgKiA0KSB8IDE7CisgICAgZG91YmxlIGV4cGVjdGVkX2JpdHMgPSAwOyAvLyBpbml0IHRvIHNpbGVuY2UgZ2NjIHdhcm5pbmcKKyAgICBkb3VibGUgKnFzY2FsZSwgKmJsdXJyZWRfcXNjYWxlLCBxc2NhbGVfc3VtOworCisgICAgLyogZmluZCBjb21wbGV4aXR5ICYgY29uc3RfYml0cyAmIGRlY2lkZSB0aGUgcGljdF90eXBlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCByY2MtPm51bV9lbnRyaWVzOyBpKyspIHsKKyAgICAgICAgUmF0ZUNvbnRyb2xFbnRyeSAqcmNlID0gJnJjYy0+ZW50cnlbaV07CisKKyAgICAgICAgcmNlLT5uZXdfcGljdF90eXBlICAgICAgICAgICAgICAgID0gcmNlLT5waWN0X3R5cGU7CisgICAgICAgIHJjYy0+aV9jcGx4X3N1bVtyY2UtPnBpY3RfdHlwZV0gICs9IHJjZS0+aV90ZXhfYml0cyAqIHJjZS0+cXNjYWxlOworICAgICAgICByY2MtPnBfY3BseF9zdW1bcmNlLT5waWN0X3R5cGVdICArPSByY2UtPnBfdGV4X2JpdHMgKiByY2UtPnFzY2FsZTsKKyAgICAgICAgcmNjLT5tdl9iaXRzX3N1bVtyY2UtPnBpY3RfdHlwZV0gKz0gcmNlLT5tdl9iaXRzOworICAgICAgICByY2MtPmZyYW1lX2NvdW50W3JjZS0+cGljdF90eXBlXSsrOworCisgICAgICAgIGNvbXBsZXhpdHlbcmNlLT5uZXdfcGljdF90eXBlXSArPSAocmNlLT5pX3RleF9iaXRzICsgcmNlLT5wX3RleF9iaXRzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKXJjZS0+cXNjYWxlOworICAgICAgICBjb25zdF9iaXRzW3JjZS0+bmV3X3BpY3RfdHlwZV0gKz0gcmNlLT5tdl9iaXRzICsgcmNlLT5taXNjX2JpdHM7CisgICAgfQorCisgICAgYWxsX2NvbnN0X2JpdHMgPSBjb25zdF9iaXRzW0FWX1BJQ1RVUkVfVFlQRV9JXSArCisgICAgICAgICAgICAgICAgICAgICBjb25zdF9iaXRzW0FWX1BJQ1RVUkVfVFlQRV9QXSArCisgICAgICAgICAgICAgICAgICAgICBjb25zdF9iaXRzW0FWX1BJQ1RVUkVfVFlQRV9CXTsKKworICAgIGlmIChhbGxfYXZhaWxhYmxlX2JpdHMgPCBhbGxfY29uc3RfYml0cykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJlcXVlc3RlZCBiaXRyYXRlIGlzIHRvbyBsb3dcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcXNjYWxlICAgICAgICAgPSBhdl9tYWxsb2NfYXJyYXkocmNjLT5udW1fZW50cmllcywgc2l6ZW9mKGRvdWJsZSkpOworICAgIGJsdXJyZWRfcXNjYWxlID0gYXZfbWFsbG9jX2FycmF5KHJjYy0+bnVtX2VudHJpZXMsIHNpemVvZihkb3VibGUpKTsKKyAgICB0b29iaWcgPSAwOworCisgICAgZm9yIChzdGVwID0gMjU2ICogMjU2OyBzdGVwID4gMC4wMDAwMDAxOyBzdGVwICo9IDAuNSkgeworICAgICAgICBleHBlY3RlZF9iaXRzID0gMDsKKyAgICAgICAgcmF0ZV9mYWN0b3IgICs9IHN0ZXA7CisKKyAgICAgICAgcmNjLT5idWZmZXJfaW5kZXggPSBzLT5hdmN0eC0+cmNfYnVmZmVyX3NpemUgLyAyOworCisgICAgICAgIC8qIGZpbmQgcXNjYWxlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByY2MtPm51bV9lbnRyaWVzOyBpKyspIHsKKyAgICAgICAgICAgIFJhdGVDb250cm9sRW50cnkgKnJjZSA9ICZyY2MtPmVudHJ5W2ldOworCisgICAgICAgICAgICBxc2NhbGVbaV0gPSBnZXRfcXNjYWxlKHMsICZyY2MtPmVudHJ5W2ldLCByYXRlX2ZhY3RvciwgaSk7CisgICAgICAgICAgICByY2MtPmxhc3RfcXNjYWxlX2ZvcltyY2UtPnBpY3RfdHlwZV0gPSBxc2NhbGVbaV07CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGZpbHRlcl9zaXplICUgMiA9PSAxKTsKKworICAgICAgICAvKiBmaXhlZCBJL0IgUVAgcmVsYXRpdmUgdG8gUCBtb2RlICovCisgICAgICAgIGZvciAoaSA9IEZGTUFYKDAsIHJjYy0+bnVtX2VudHJpZXMgLSAzMDApOyBpIDwgcmNjLT5udW1fZW50cmllczsgaSsrKSB7CisgICAgICAgICAgICBSYXRlQ29udHJvbEVudHJ5ICpyY2UgPSAmcmNjLT5lbnRyeVtpXTsKKworICAgICAgICAgICAgcXNjYWxlW2ldID0gZ2V0X2RpZmZfbGltaXRlZF9xKHMsIHJjZSwgcXNjYWxlW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IHJjYy0+bnVtX2VudHJpZXMgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgUmF0ZUNvbnRyb2xFbnRyeSAqcmNlID0gJnJjYy0+ZW50cnlbaV07CisKKyAgICAgICAgICAgIHFzY2FsZVtpXSA9IGdldF9kaWZmX2xpbWl0ZWRfcShzLCByY2UsIHFzY2FsZVtpXSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBzbW9vdGggY3VydmUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJjYy0+bnVtX2VudHJpZXM7IGkrKykgeworICAgICAgICAgICAgUmF0ZUNvbnRyb2xFbnRyeSAqcmNlID0gJnJjYy0+ZW50cnlbaV07CisgICAgICAgICAgICBjb25zdCBpbnQgcGljdF90eXBlICAgPSByY2UtPm5ld19waWN0X3R5cGU7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGRvdWJsZSBxID0gMC4wLCBzdW0gPSAwLjA7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmaWx0ZXJfc2l6ZTsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ICAgID0gaSArIGogLSBmaWx0ZXJfc2l6ZSAvIDI7CisgICAgICAgICAgICAgICAgZG91YmxlIGQgICAgID0gaW5kZXggLSBpOworICAgICAgICAgICAgICAgIGRvdWJsZSBjb2VmZiA9IGEtPnFibHVyID09IDAgPyAxLjAgOiBleHAoLWQgKiBkIC8gKGEtPnFibHVyICogYS0+cWJsdXIpKTsKKworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcmNjLT5udW1fZW50cmllcykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHBpY3RfdHlwZSAhPSByY2MtPmVudHJ5W2luZGV4XS5uZXdfcGljdF90eXBlKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBxICAgKz0gcXNjYWxlW2luZGV4XSAqIGNvZWZmOworICAgICAgICAgICAgICAgIHN1bSArPSBjb2VmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJsdXJyZWRfcXNjYWxlW2ldID0gcSAvIHN1bTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGZpbmQgZXhwZWN0ZWQgYml0cyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmNjLT5udW1fZW50cmllczsgaSsrKSB7CisgICAgICAgICAgICBSYXRlQ29udHJvbEVudHJ5ICpyY2UgPSAmcmNjLT5lbnRyeVtpXTsKKyAgICAgICAgICAgIGRvdWJsZSBiaXRzOworCisgICAgICAgICAgICByY2UtPm5ld19xc2NhbGUgPSBtb2RpZnlfcXNjYWxlKHMsIHJjZSwgYmx1cnJlZF9xc2NhbGVbaV0sIGkpOworCisgICAgICAgICAgICBiaXRzICA9IHFwMmJpdHMocmNlLCByY2UtPm5ld19xc2NhbGUpICsgcmNlLT5tdl9iaXRzICsgcmNlLT5taXNjX2JpdHM7CisgICAgICAgICAgICBiaXRzICs9IDggKiBmZl92YnZfdXBkYXRlKHMsIGJpdHMpOworCisgICAgICAgICAgICByY2UtPmV4cGVjdGVkX2JpdHMgPSBleHBlY3RlZF9iaXRzOworICAgICAgICAgICAgZXhwZWN0ZWRfYml0cyAgICAgKz0gYml0czsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsCisgICAgICAgICAgICAgICAgImV4cGVjdGVkX2JpdHM6ICVmIGFsbF9hdmFpbGFibGVfYml0czogJWQgcmF0ZV9mYWN0b3I6ICVmXG4iLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkX2JpdHMsIChpbnQpYWxsX2F2YWlsYWJsZV9iaXRzLCByYXRlX2ZhY3Rvcik7CisgICAgICAgIGlmIChleHBlY3RlZF9iaXRzID4gYWxsX2F2YWlsYWJsZV9iaXRzKSB7CisgICAgICAgICAgICByYXRlX2ZhY3RvciAtPSBzdGVwOworICAgICAgICAgICAgKyt0b29iaWc7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZShxc2NhbGUpOworICAgIGF2X2ZyZWUoYmx1cnJlZF9xc2NhbGUpOworCisgICAgLyogY2hlY2sgYml0cmF0ZSBjYWxjdWxhdGlvbnMgYW5kIHByaW50IGluZm8gKi8KKyAgICBxc2NhbGVfc3VtID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCByY2MtPm51bV9lbnRyaWVzOyBpKyspIHsKKyAgICAgICAgYXZfZGxvZyhzLCAiW2xhdmMgcmNdIGVudHJ5WyVkXS5uZXdfcXNjYWxlID0gJS4zZiAgcXAgPSAlLjNmXG4iLAorICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgcmNjLT5lbnRyeVtpXS5uZXdfcXNjYWxlLAorICAgICAgICAgICAgICAgIHJjYy0+ZW50cnlbaV0ubmV3X3FzY2FsZSAvIEZGX1FQMkxBTUJEQSk7CisgICAgICAgIHFzY2FsZV9zdW0gKz0gYXZfY2xpcChyY2MtPmVudHJ5W2ldLm5ld19xc2NhbGUgLyBGRl9RUDJMQU1CREEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+cW1pbiwgcy0+YXZjdHgtPnFtYXgpOworICAgIH0KKyAgICBhc3NlcnQodG9vYmlnIDw9IDQwKTsKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgIltsYXZjIHJjXSByZXF1ZXN0ZWQgYml0cmF0ZTogJWQgYnBzICBleHBlY3RlZCBiaXRyYXRlOiAlZCBicHNcbiIsCisgICAgICAgICAgIHMtPmJpdF9yYXRlLAorICAgICAgICAgICAoaW50KShleHBlY3RlZF9iaXRzIC8gKChkb3VibGUpYWxsX2F2YWlsYWJsZV9iaXRzIC8gcy0+Yml0X3JhdGUpKSk7CisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICJbbGF2YyByY10gZXN0aW1hdGVkIHRhcmdldCBhdmVyYWdlIHFwOiAlLjNmXG4iLAorICAgICAgICAgICAoZmxvYXQpcXNjYWxlX3N1bSAvIHJjYy0+bnVtX2VudHJpZXMpOworICAgIGlmICh0b29iaWcgPT0gMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgIltsYXZjIHJjXSBVc2luZyBhbGwgb2YgcmVxdWVzdGVkIGJpdHJhdGUgaXMgbm90ICIKKyAgICAgICAgICAgICAgICJuZWNlc3NhcnkgZm9yIHRoaXMgdmlkZW8gd2l0aCB0aGVzZSBwYXJhbWV0ZXJzLlxuIik7CisgICAgfSBlbHNlIGlmICh0b29iaWcgPT0gNDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiW2xhdmMgcmNdIEVycm9yOiBiaXRyYXRlIHRvbyBsb3cgZm9yIHRoaXMgdmlkZW8gIgorICAgICAgICAgICAgICAgIndpdGggdGhlc2UgcGFyYW1ldGVycy5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmIChmYWJzKGV4cGVjdGVkX2JpdHMgLyBhbGxfYXZhaWxhYmxlX2JpdHMgLSAxLjApID4gMC4wMSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJbbGF2YyByY10gRXJyb3I6IDJwYXNzIGN1cnZlIGZhaWxlZCB0byBjb252ZXJnZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JhdGVjb250cm9sLmggYi9mZm1wZWcvbGliYXZjb2RlYy9yYXRlY29udHJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjRiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yYXRlY29udHJvbC5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogUmF0ZWNvbnRyb2wKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1JBVEVDT05UUk9MX0gKKyNkZWZpbmUgQVZDT0RFQ19SQVRFQ09OVFJPTF9ICisKKy8qKgorICogQGZpbGUKKyAqIHJhdGVjb250cm9sIGhlYWRlci4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorCit0eXBlZGVmIHN0cnVjdCBQcmVkaWN0b3J7CisgICAgZG91YmxlIGNvZWZmOworICAgIGRvdWJsZSBjb3VudDsKKyAgICBkb3VibGUgZGVjYXk7Cit9IFByZWRpY3RvcjsKKwordHlwZWRlZiBzdHJ1Y3QgUmF0ZUNvbnRyb2xFbnRyeXsKKyAgICBpbnQgcGljdF90eXBlOworICAgIGZsb2F0IHFzY2FsZTsKKyAgICBpbnQgbXZfYml0czsKKyAgICBpbnQgaV90ZXhfYml0czsKKyAgICBpbnQgcF90ZXhfYml0czsKKyAgICBpbnQgbWlzY19iaXRzOworICAgIGludCBoZWFkZXJfYml0czsKKyAgICB1aW50NjRfdCBleHBlY3RlZF9iaXRzOworICAgIGludCBuZXdfcGljdF90eXBlOworICAgIGZsb2F0IG5ld19xc2NhbGU7CisgICAgaW50NjRfdCBtY19tYl92YXJfc3VtOworICAgIGludDY0X3QgbWJfdmFyX3N1bTsKKyAgICBpbnQgaV9jb3VudDsKKyAgICBpbnQgc2tpcF9jb3VudDsKKyAgICBpbnQgZl9jb2RlOworICAgIGludCBiX2NvZGU7Cit9UmF0ZUNvbnRyb2xFbnRyeTsKKworLyoqCisgKiByYXRlIGNvbnRyb2wgY29udGV4dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgUmF0ZUNvbnRyb2xDb250ZXh0eworICAgIGludCBudW1fZW50cmllczsgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIFJhdGVDb250cm9sRW50cmllcworICAgIFJhdGVDb250cm9sRW50cnkgKmVudHJ5OworICAgIGRvdWJsZSBidWZmZXJfaW5kZXg7ICAgICAgICAgIC8vLzwgYW1vdW50IG9mIGJpdHMgaW4gdGhlIHZpZGVvL2F1ZGlvIGJ1ZmZlcgorICAgIFByZWRpY3RvciBwcmVkWzVdOworICAgIGRvdWJsZSBzaG9ydF90ZXJtX3FzdW07ICAgICAgIC8vLzwgc3VtIG9mIHJlY2VudCBxc2NhbGVzCisgICAgZG91YmxlIHNob3J0X3Rlcm1fcWNvdW50OyAgICAgLy8vPCBjb3VudCBvZiByZWNlbnQgcXNjYWxlcworICAgIGRvdWJsZSBwYXNzMV9yY19lcV9vdXRwdXRfc3VtOy8vLzwgc3VtIG9mIHRoZSBvdXRwdXQgb2YgdGhlIHJjIGVxdWF0aW9uLCB0aGlzIGlzIHVzZWQgZm9yIG5vcm1hbGl6YXRpb24KKyAgICBkb3VibGUgcGFzczFfd2FudGVkX2JpdHM7ICAgICAvLy88IGJpdHMgd2hpY2ggc2hvdWxkIGhhdmUgYmVlbiBvdXRwdXRlZCBieSB0aGUgcGFzczEgY29kZSAoaW5jbHVkaW5nIGNvbXBsZXhpdHkgaW5pdCkKKyAgICBkb3VibGUgbGFzdF9xc2NhbGU7CisgICAgZG91YmxlIGxhc3RfcXNjYWxlX2Zvcls1XTsgICAgLy8vPCBsYXN0IHFzY2FsZSBmb3IgYSBzcGVjaWZpYyBwaWN0IHR5cGUsIHVzZWQgZm9yIG1heF9kaWZmICYgaXBiIGZhY3RvciBzdHVmZgorICAgIGludDY0X3QgbGFzdF9tY19tYl92YXJfc3VtOworICAgIGludDY0X3QgbGFzdF9tYl92YXJfc3VtOworICAgIHVpbnQ2NF90IGlfY3BseF9zdW1bNV07CisgICAgdWludDY0X3QgcF9jcGx4X3N1bVs1XTsKKyAgICB1aW50NjRfdCBtdl9iaXRzX3N1bVs1XTsKKyAgICB1aW50NjRfdCBxc2NhbGVfc3VtWzVdOworICAgIGludCBmcmFtZV9jb3VudFs1XTsKKyAgICBpbnQgbGFzdF9ub25fYl9waWN0X3R5cGU7CisKKyAgICB2b2lkICpub25fbGF2Y19vcGFxdWU7ICAgICAgICAvLy88IGNvbnRleHQgZm9yIG5vbiBsYXZjIHJjIGNvZGUgKGZvciBleGFtcGxlIHh2aWQpCisgICAgZmxvYXQgZHJ5X3J1bl9xc2NhbGU7ICAgICAgICAgLy8vPCBmb3IgeHZpZCByYworICAgIGludCBsYXN0X3BpY3R1cmVfbnVtYmVyOyAgICAgIC8vLzwgZm9yIHh2aWQgcmMKKyAgICBBVkV4cHIgKiByY19lcV9ldmFsOworfVJhdGVDb250cm9sQ29udGV4dDsKKworc3RydWN0IE1wZWdFbmNDb250ZXh0OworCisvKiByYXRlIGNvbnRyb2wgKi8KK2ludCBmZl9yYXRlX2NvbnRyb2xfaW5pdChzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMpOworZmxvYXQgZmZfcmF0ZV9lc3RpbWF0ZV9xc2NhbGUoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgZHJ5X3J1bik7Cit2b2lkIGZmX3dyaXRlX3Bhc3MxX3N0YXRzKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyk7Cit2b2lkIGZmX3JhdGVfY29udHJvbF91bmluaXQoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzKTsKK2ludCBmZl92YnZfdXBkYXRlKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywgaW50IGZyYW1lX3NpemUpOwordm9pZCBmZl9nZXRfMnBhc3NfZmNvZGUoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzKTsKKworaW50IGZmX3h2aWRfcmF0ZV9jb250cm9sX2luaXQoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfeHZpZF9yYXRlX2NvbnRyb2xfdW5pbml0KHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyk7CitmbG9hdCBmZl94dmlkX3JhdGVfZXN0aW1hdGVfcXNjYWxlKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywgaW50IGRyeV9ydW4pOworCisjZW5kaWYgLyogQVZDT0RFQ19SQVRFQ09OVFJPTF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9yYXcuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Jhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWQzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yYXcuYwpAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIFJhdyBWaWRlbyBDb2RlYworICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSYXcgVmlkZW8gQ29kZWMKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInJhdy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworY29uc3QgUGl4ZWxGb3JtYXRUYWcgZmZfcmF3X3BpeF9mbXRfdGFnc1tdID0geworICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBNS1RBRygnSScsICc0JywgJzInLCAnMCcpIH0sIC8qIFBsYW5hciBmb3JtYXRzICovCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAsIE1LVEFHKCdJJywgJ1knLCAnVScsICdWJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIwUCwgTUtUQUcoJ1knLCAnVicsICcxJywgJzInKSB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MTBQLCBNS1RBRygnWScsICdVJywgJ1YnLCAnOScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQxMFAsIE1LVEFHKCdZJywgJ1YnLCAnVScsICc5JykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDExUCwgTUtUQUcoJ1knLCAnNCcsICcxJywgJ0InKSB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjJQLCBNS1RBRygnWScsICc0JywgJzInLCAnQicpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAsIE1LVEFHKCdQJywgJzQnLCAnMicsICcyJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUCwgTUtUQUcoJ1knLCAnVicsICcxJywgJzYnKSB9LAorICAgIC8qIHl1dmpYWFggZm9ybWF0cyBhcmUgZGVwcmVjYXRlZCBoYWNrcyBzcGVjaWZpYyB0byBsaWJhdiosCisgICAgICAgdGhleSBhcmUgaWRlbnRpY2FsIHRvIHl1dlhYWCAgKi8KKyAgICB7IEFWX1BJWF9GTVRfWVVWSjQyMFAsIE1LVEFHKCdJJywgJzQnLCAnMicsICcwJykgfSwgLyogUGxhbmFyIGZvcm1hdHMgKi8KKyAgICB7IEFWX1BJWF9GTVRfWVVWSjQyMFAsIE1LVEFHKCdJJywgJ1knLCAnVScsICdWJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWSjQyMFAsIE1LVEFHKCdZJywgJ1YnLCAnMScsICcyJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWSjQyMlAsIE1LVEFHKCdZJywgJzQnLCAnMicsICdCJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWSjQyMlAsIE1LVEFHKCdQJywgJzQnLCAnMicsICcyJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfR1JBWTgsICAgIE1LVEFHKCdZJywgJzgnLCAnMCcsICcwJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfR1JBWTgsICAgIE1LVEFHKCdZJywgJzgnLCAnICcsICcgJykgfSwKKworICAgIHsgQVZfUElYX0ZNVF9ZVVlWNDIyLCBNS1RBRygnWScsICdVJywgJ1knLCAnMicpIH0sIC8qIFBhY2tlZCBmb3JtYXRzICovCisgICAgeyBBVl9QSVhfRk1UX1lVWVY0MjIsIE1LVEFHKCdZJywgJzQnLCAnMicsICcyJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVZVjQyMiwgTUtUQUcoJ1YnLCAnNCcsICcyJywgJzInKSB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVlWNDIyLCBNS1RBRygnVicsICdZJywgJ1UnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVWVY0MjIsIE1LVEFHKCdZJywgJ1UnLCAnTicsICdWJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVZZVTQyMiwgTUtUQUcoJ1knLCAnVicsICdZJywgJ1UnKSB9LCAvKiBQaGlsaXBzICovCisgICAgeyBBVl9QSVhfRk1UX1VZVlk0MjIsIE1LVEFHKCdVJywgJ1knLCAnVicsICdZJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfVVlWWTQyMiwgTUtUQUcoJ0gnLCAnRCcsICdZJywgJ0MnKSB9LAorICAgIHsgQVZfUElYX0ZNVF9VWVZZNDIyLCBNS1RBRygnVScsICdZJywgJ04nLCAnVicpIH0sCisgICAgeyBBVl9QSVhfRk1UX1VZVlk0MjIsIE1LVEFHKCdVJywgJ1knLCAnTicsICdZJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfVVlWWTQyMiwgTUtUQUcoJ3UnLCAneScsICd2JywgJzEnKSB9LAorICAgIHsgQVZfUElYX0ZNVF9VWVZZNDIyLCBNS1RBRygnMicsICdWJywgJ3UnLCAnMScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1VZVlk0MjIsIE1LVEFHKCdBJywgJ1YnLCAnUicsICduJykgfSwgLyogQXZpZCBBVkkgQ29kZWMgMToxICovCisgICAgeyBBVl9QSVhfRk1UX1VZVlk0MjIsIE1LVEFHKCdBJywgJ1YnLCAnMScsICd4JykgfSwgLyogQXZpZCAxOjF4ICovCisgICAgeyBBVl9QSVhfRk1UX1VZVlk0MjIsIE1LVEFHKCdBJywgJ1YnLCAndScsICdwJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfVVlWWTQyMiwgTUtUQUcoJ1YnLCAnRCcsICdUJywgJ1onKSB9LCAvKiBTb2Z0TGFiLU5TSyBWaWRlb1RpemVyICovCisgICAgeyBBVl9QSVhfRk1UX1VZVlk0MjIsIE1LVEFHKCdhJywgJ3UnLCAndicsICcyJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfVVlWWTQyMiwgTUtUQUcoJ2MnLCAneScsICd1JywgJ3YnKSB9LCAvKiBDWVVWIGlzIGFsc28gQ3JlYXRpdmUgWVVWICovCisgICAgeyBBVl9QSVhfRk1UX1VZWVZZWTQxMSwgTUtUQUcoJ1knLCAnNCcsICcxJywgJzEnKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HUkFZOCwgICBNS1RBRygnRycsICdSJywgJ0UnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX05WMTIsICAgIE1LVEFHKCdOJywgJ1YnLCAnMScsICcyJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfTlYyMSwgICAgTUtUQUcoJ04nLCAnVicsICcyJywgJzEnKSB9LAorCisgICAgLyogbnV0ICovCisgICAgeyBBVl9QSVhfRk1UX1JHQjU1NUxFLCBNS1RBRygnUicsICdHJywgJ0InLCAxNSkgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSNTU1TEUsIE1LVEFHKCdCJywgJ0cnLCAnUicsIDE1KSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NjVMRSwgTUtUQUcoJ1InLCAnRycsICdCJywgMTYpIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjU2NUxFLCBNS1RBRygnQicsICdHJywgJ1InLCAxNikgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCNTU1QkUsIE1LVEFHKDE1ICwgJ0InLCAnRycsICdSJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSNTU1QkUsIE1LVEFHKDE1ICwgJ1InLCAnRycsICdCJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCNTY1QkUsIE1LVEFHKDE2ICwgJ0InLCAnRycsICdSJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSNTY1QkUsIE1LVEFHKDE2ICwgJ1InLCAnRycsICdCJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCNDQ0TEUsIE1LVEFHKCdSJywgJ0cnLCAnQicsIDEyKSB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1I0NDRMRSwgTUtUQUcoJ0InLCAnRycsICdSJywgMTIpIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjQ0NEJFLCBNS1RBRygxMiAsICdCJywgJ0cnLCAnUicpIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjQ0NEJFLCBNS1RBRygxMiAsICdSJywgJ0cnLCAnQicpIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQkE2NExFLCBNS1RBRygnUicsICdCJywgJ0EnLCA2NCApIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUkE2NExFLCBNS1RBRygnQicsICdSJywgJ0EnLCA2NCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQkE2NEJFLCBNS1RBRyg2NCAsICdSJywgJ0InLCAnQScpIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUkE2NEJFLCBNS1RBRyg2NCAsICdCJywgJ1InLCAnQScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQkEsICAgICBNS1RBRygnUicsICdHJywgJ0InLCAnQScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjAsICAgICBNS1RBRygnUicsICdHJywgJ0InLCAgMCApIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUkEsICAgICBNS1RBRygnQicsICdHJywgJ1InLCAnQScpIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjAsICAgICBNS1RBRygnQicsICdHJywgJ1InLCAgMCApIH0sCisgICAgeyBBVl9QSVhfRk1UX0FCR1IsICAgICBNS1RBRygnQScsICdCJywgJ0cnLCAnUicpIH0sCisgICAgeyBBVl9QSVhfRk1UXzBCR1IsICAgICBNS1RBRyggMCAsICdCJywgJ0cnLCAnUicpIH0sCisgICAgeyBBVl9QSVhfRk1UX0FSR0IsICAgICBNS1RBRygnQScsICdSJywgJ0cnLCAnQicpIH0sCisgICAgeyBBVl9QSVhfRk1UXzBSR0IsICAgICBNS1RBRyggMCAsICdSJywgJ0cnLCAnQicpIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjI0LCAgICBNS1RBRygnUicsICdHJywgJ0InLCAyNCApIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjI0LCAgICBNS1RBRygnQicsICdHJywgJ1InLCAyNCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQxMVAsICBNS1RBRygnNCcsICcxJywgJzEnLCAnUCcpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAsICBNS1RBRygnNCcsICcyJywgJzInLCAnUCcpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVko0MjJQLCBNS1RBRygnNCcsICcyJywgJzInLCAnUCcpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0MFAsICBNS1RBRygnNCcsICc0JywgJzAnLCAnUCcpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVko0NDBQLCBNS1RBRygnNCcsICc0JywgJzAnLCAnUCcpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAsICBNS1RBRygnNCcsICc0JywgJzQnLCAnUCcpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVko0NDRQLCBNS1RBRygnNCcsICc0JywgJzQnLCAnUCcpIH0sCisgICAgeyBBVl9QSVhfRk1UX01PTk9XSElURSxNS1RBRygnQicsICcxJywgJ1cnLCAnMCcpIH0sCisgICAgeyBBVl9QSVhfRk1UX01PTk9CTEFDSyxNS1RBRygnQicsICcwJywgJ1cnLCAnMScpIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjgsICAgICBNS1RBRygnQicsICdHJywgJ1InLCAgOCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjgsICAgICBNS1RBRygnUicsICdHJywgJ0InLCAgOCApIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjQsICAgICBNS1RBRygnQicsICdHJywgJ1InLCAgNCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjQsICAgICBNS1RBRygnUicsICdHJywgJ0InLCAgNCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjRfQllURSxNS1RBRygnQicsICc0JywgJ0InLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjRfQllURSxNS1RBRygnUicsICc0JywgJ0InLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjQ4TEUsICBNS1RBRygnUicsICdHJywgJ0InLCA0OCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjQ4QkUsICBNS1RBRyggNDgsICdSJywgJ0cnLCAnQicpIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjQ4TEUsICBNS1RBRygnQicsICdHJywgJ1InLCA0OCApIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjQ4QkUsICBNS1RBRyggNDgsICdCJywgJ0cnLCAnUicpIH0sCisgICAgeyBBVl9QSVhfRk1UX0dSQVkxNkxFLCAgICBNS1RBRygnWScsICcxJywgIDAgLCAxNiApIH0sCisgICAgeyBBVl9QSVhfRk1UX0dSQVkxNkJFLCAgICBNS1RBRygxNiAsICAwICwgJzEnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAxMExFLCBNS1RBRygnWScsICczJywgMTEgLCAxMCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAxMEJFLCBNS1RBRygxMCAsIDExICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxMExFLCBNS1RBRygnWScsICczJywgMTAgLCAxMCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxMEJFLCBNS1RBRygxMCAsIDEwICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAxMExFLCBNS1RBRygnWScsICczJywgIDAgLCAxMCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAxMEJFLCBNS1RBRygxMCAsICAwICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAxMkxFLCBNS1RBRygnWScsICczJywgMTEgLCAxMiApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAxMkJFLCBNS1RBRygxMiAsIDExICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxMkxFLCBNS1RBRygnWScsICczJywgMTAgLCAxMiApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxMkJFLCBNS1RBRygxMiAsIDEwICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAxMkxFLCBNS1RBRygnWScsICczJywgIDAgLCAxMiApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAxMkJFLCBNS1RBRygxMiAsICAwICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAxNExFLCBNS1RBRygnWScsICczJywgMTEgLCAxNCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAxNEJFLCBNS1RBRygxNCAsIDExICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxNExFLCBNS1RBRygnWScsICczJywgMTAgLCAxNCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxNEJFLCBNS1RBRygxNCAsIDEwICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAxNExFLCBNS1RBRygnWScsICczJywgIDAgLCAxNCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAxNEJFLCBNS1RBRygxNCAsICAwICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAxNkxFLCBNS1RBRygnWScsICczJywgMTEgLCAxNiApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAxNkJFLCBNS1RBRygxNiAsIDExICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxNkxFLCBNS1RBRygnWScsICczJywgMTAgLCAxNiApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxNkJFLCBNS1RBRygxNiAsIDEwICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAxNkxFLCBNS1RBRygnWScsICczJywgIDAgLCAxNiApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAxNkJFLCBNS1RBRygxNiAsICAwICwgJzMnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0MjBQLCAgICBNS1RBRygnWScsICc0JywgMTEgLCAgOCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0MjJQLCAgICBNS1RBRygnWScsICc0JywgMTAgLCAgOCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0NDRQLCAgICBNS1RBRygnWScsICc0JywgIDAgLCAgOCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lBOCwgICAgICAgICBNS1RBRygnWScsICcyJywgIDAgLCAgOCApIH0sCisKKyAgICB7IEFWX1BJWF9GTVRfWVVWQTQyMFA5TEUsICBNS1RBRygnWScsICc0JywgMTEgLCAgOSApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0MjBQOUJFLCAgTUtUQUcoIDkgLCAxMSAsICc0JywgJ1knKSB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVZBNDIyUDlMRSwgIE1LVEFHKCdZJywgJzQnLCAxMCAsICA5ICkgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWQTQyMlA5QkUsICBNS1RBRyggOSAsIDEwICwgJzQnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0NDRQOUxFLCAgTUtUQUcoJ1knLCAnNCcsICAwICwgIDkgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVZBNDQ0UDlCRSwgIE1LVEFHKCA5ICwgIDAgLCAnNCcsICdZJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWQTQyMFAxMExFLCBNS1RBRygnWScsICc0JywgMTEgLCAxMCApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0MjBQMTBCRSwgTUtUQUcoMTAgLCAxMSAsICc0JywgJ1knKSB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwTEUsIE1LVEFHKCdZJywgJzQnLCAxMCAsIDEwICkgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWQTQyMlAxMEJFLCBNS1RBRygxMCAsIDEwICwgJzQnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0NDRQMTBMRSwgTUtUQUcoJ1knLCAnNCcsICAwICwgMTAgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwQkUsIE1LVEFHKDEwICwgIDAgLCAnNCcsICdZJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWQTQyMFAxNkxFLCBNS1RBRygnWScsICc0JywgMTEgLCAxNiApIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0MjBQMTZCRSwgTUtUQUcoMTYgLCAxMSAsICc0JywgJ1knKSB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2TEUsIE1LVEFHKCdZJywgJzQnLCAxMCAsIDE2ICkgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWQTQyMlAxNkJFLCBNS1RBRygxNiAsIDEwICwgJzQnLCAnWScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0NDRQMTZMRSwgTUtUQUcoJ1knLCAnNCcsICAwICwgMTYgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2QkUsIE1LVEFHKDE2ICwgIDAgLCAnNCcsICdZJykgfSwKKworICAgIHsgQVZfUElYX0ZNVF9HQlJQLCAgICAgICAgIE1LVEFHKCdHJywgJzMnLCAwMCAsICA4ICkgfSwKKyAgICB7IEFWX1BJWF9GTVRfR0JSUDlMRSwgICAgICBNS1RBRygnRycsICczJywgMDAgLCAgOSApIH0sCisgICAgeyBBVl9QSVhfRk1UX0dCUlA5QkUsICAgICAgTUtUQUcoIDkgLCAwMCAsICczJywgJ0cnKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HQlJQMTBMRSwgICAgIE1LVEFHKCdHJywgJzMnLCAwMCAsIDEwICkgfSwKKyAgICB7IEFWX1BJWF9GTVRfR0JSUDEwQkUsICAgICBNS1RBRygxMCAsIDAwICwgJzMnLCAnRycpIH0sCisgICAgeyBBVl9QSVhfRk1UX0dCUlAxMkxFLCAgICAgTUtUQUcoJ0cnLCAnMycsIDAwICwgMTIgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HQlJQMTJCRSwgICAgIE1LVEFHKDEyICwgMDAgLCAnMycsICdHJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfR0JSUDE0TEUsICAgICBNS1RBRygnRycsICczJywgMDAgLCAxNCApIH0sCisgICAgeyBBVl9QSVhfRk1UX0dCUlAxNEJFLCAgICAgTUtUQUcoMTQgLCAwMCAsICczJywgJ0cnKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HQlJQMTZMRSwgICAgIE1LVEFHKCdHJywgJzMnLCAwMCAsIDE2ICkgfSwKKyAgICB7IEFWX1BJWF9GTVRfR0JSUDE2QkUsICAgICBNS1RBRygxNiAsIDAwICwgJzMnLCAnRycpIH0sCisKKyAgICB7IEFWX1BJWF9GTVRfWFlaMTJMRSwgICAgICBNS1RBRygnWCcsICdZJywgJ1onICwgMzYgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9YWVoxMkJFLCAgICAgIE1LVEFHKDM2ICwgJ1onICwgJ1knLCAnWCcpIH0sCisKKyAgICB7IEFWX1BJWF9GTVRfQkFZRVJfQkdHUjgsICAgIE1LVEFHKDB4QkEsICdCJywgJ0cnLCA4ICAgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9CQVlFUl9CR0dSMTZMRSwgTUtUQUcoMHhCQSwgJ0InLCAnRycsIDE2ICApIH0sCisgICAgeyBBVl9QSVhfRk1UX0JBWUVSX0JHR1IxNkJFLCBNS1RBRygxNiAgLCAnRycsICdCJywgMHhCQSkgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkFZRVJfUkdHQjgsICAgIE1LVEFHKDB4QkEsICdSJywgJ0cnLCA4ICAgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9CQVlFUl9SR0dCMTZMRSwgTUtUQUcoMHhCQSwgJ1InLCAnRycsIDE2ICApIH0sCisgICAgeyBBVl9QSVhfRk1UX0JBWUVSX1JHR0IxNkJFLCBNS1RBRygxNiAgLCAnRycsICdSJywgMHhCQSkgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkFZRVJfR0JSRzgsICAgIE1LVEFHKDB4QkEsICdHJywgJ0InLCA4ICAgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9CQVlFUl9HQlJHMTZMRSwgTUtUQUcoMHhCQSwgJ0cnLCAnQicsIDE2ICApIH0sCisgICAgeyBBVl9QSVhfRk1UX0JBWUVSX0dCUkcxNkJFLCBNS1RBRygxNiwgICAnQicsICdHJywgMHhCQSkgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkFZRVJfR1JCRzgsICAgIE1LVEFHKDB4QkEsICdHJywgJ1InLCA4ICAgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9CQVlFUl9HUkJHMTZMRSwgTUtUQUcoMHhCQSwgJ0cnLCAnUicsIDE2ICApIH0sCisgICAgeyBBVl9QSVhfRk1UX0JBWUVSX0dSQkcxNkJFLCBNS1RBRygxNiwgICAnUicsICdHJywgMHhCQSkgfSwKKworICAgIC8qIHF1aWNrdGltZSAqLworICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBNS1RBRygnUicsICc0JywgJzInLCAnMCcpIH0sIC8qIFJhZGl1cyBEViBZVVYgUEFMICovCisgICAgeyBBVl9QSVhfRk1UX1lVVjQxMVAsIE1LVEFHKCdSJywgJzQnLCAnMScsICcxJykgfSwgLyogUmFkaXVzIERWIFlVViBOVFNDICovCisgICAgeyBBVl9QSVhfRk1UX1VZVlk0MjIsIE1LVEFHKCcyJywgJ3YnLCAndScsICd5JykgfSwKKyAgICB7IEFWX1BJWF9GTVRfVVlWWTQyMiwgTUtUQUcoJzInLCAnVicsICd1JywgJ3knKSB9LAorICAgIHsgQVZfUElYX0ZNVF9VWVZZNDIyLCBNS1RBRygnQScsICdWJywgJ1UnLCAnSScpIH0sIC8qIEZJWE1FIG1lcmdlIGJvdGggZmllbGRzICovCisgICAgeyBBVl9QSVhfRk1UX1VZVlk0MjIsIE1LVEFHKCdiJywgJ3gnLCAneScsICd2JykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVZVjQyMiwgTUtUQUcoJ3knLCAndScsICd2JywgJzInKSB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVlWNDIyLCBNS1RBRygneScsICd1JywgJ3YnLCAncycpIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVWVY0MjIsIE1LVEFHKCdEJywgJ1YnLCAnTycsICdPJykgfSwgLyogRGlnaXRhbCBWb29kb28gU0QgOCBCaXQgKi8KKyAgICB7IEFWX1BJWF9GTVRfUkdCNTU1TEUsTUtUQUcoJ0wnLCAnNScsICc1JywgJzUnKSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NjVMRSxNS1RBRygnTCcsICc1JywgJzYnLCAnNScpIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjU2NUJFLE1LVEFHKCdCJywgJzUnLCAnNicsICc1JykgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSMjQsICAgTUtUQUcoJzInLCAnNCcsICdCJywgJ0cnKSB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1IyNCwgICBNS1RBRygnYicsICd4JywgJ2InLCAnZycpIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUkEsICAgIE1LVEFHKCdCJywgJ0cnLCAnUicsICdBJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCQSwgICAgTUtUQUcoJ1InLCAnRycsICdCJywgJ0EnKSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0IyNCwgICBNS1RBRygnYicsICd4JywgJ3InLCAnZycpIH0sCisgICAgeyBBVl9QSVhfRk1UX0FCR1IsICAgIE1LVEFHKCdBJywgJ0InLCAnRycsICdSJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfR1JBWTE2QkUsTUtUQUcoJ2InLCAnMScsICc2JywgJ2cnKSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I0OEJFLCBNS1RBRygnYicsICc0JywgJzgnLCAncicpIH0sCisKKyAgICAvKiBzcGVjaWFsICovCisgICAgeyBBVl9QSVhfRk1UX1JHQjU2NUxFLE1LVEFHKCAzICwgIDAgLCAgMCAsICAwICkgfSwgLyogZmxpcHBlZCBSR0I1NjVMRSAqLworICAgIHsgQVZfUElYX0ZNVF9ZVVY0NDRQLCBNS1RBRygnWScsICdWJywgJzInLCAnNCcpIH0sIC8qIFlVVjQ0NFAsIHN3YXBwZWQgVVYgKi8KKworICAgIHsgQVZfUElYX0ZNVF9OT05FLCAwIH0sCit9OworCitjb25zdCBzdHJ1Y3QgUGl4ZWxGb3JtYXRUYWcgKmF2cHJpdl9nZXRfcmF3X3BpeF9mbXRfdGFncyh2b2lkKQoreworICAgIHJldHVybiBmZl9yYXdfcGl4X2ZtdF90YWdzOworfQorCit1bnNpZ25lZCBpbnQgYXZjb2RlY19waXhfZm10X3RvX2NvZGVjX3RhZyhlbnVtIEFWUGl4ZWxGb3JtYXQgZm10KQoreworICAgIGNvbnN0IFBpeGVsRm9ybWF0VGFnICp0YWdzID0gZmZfcmF3X3BpeF9mbXRfdGFnczsKKyAgICB3aGlsZSAodGFncy0+cGl4X2ZtdCA+PSAwKSB7CisgICAgICAgIGlmICh0YWdzLT5waXhfZm10ID09IGZtdCkKKyAgICAgICAgICAgIHJldHVybiB0YWdzLT5mb3VyY2M7CisgICAgICAgIHRhZ3MrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IFBpeGVsRm9ybWF0VGFnIGF2cHJpdl9waXhfZm10X2Jwc19hdmlbXSA9IHsKKyAgICB7IEFWX1BJWF9GTVRfTU9OT1dISVRFLCAxIH0sCisgICAgeyBBVl9QSVhfRk1UX1BBTDgsICAgIDIgfSwKKyAgICB7IEFWX1BJWF9GTVRfUEFMOCwgICAgNCB9LAorICAgIHsgQVZfUElYX0ZNVF9QQUw4LCAgICA4IH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjQ0NExFLCAxMiB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NTVMRSwgMTUgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCNTU1TEUsIDE2IH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjI0LCAgMjQgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSQSwgICAzMiB9LAorICAgIHsgQVZfUElYX0ZNVF9OT05FLCAgICAwIH0sCit9OworCitjb25zdCBQaXhlbEZvcm1hdFRhZyBhdnByaXZfcGl4X2ZtdF9icHNfbW92W10gPSB7CisgICAgeyBBVl9QSVhfRk1UX01PTk9XSElURSwgMSB9LAorICAgIHsgQVZfUElYX0ZNVF9QQUw4LCAgICAgIDIgfSwKKyAgICB7IEFWX1BJWF9GTVRfUEFMOCwgICAgICA0IH0sCisgICAgeyBBVl9QSVhfRk1UX1BBTDgsICAgICAgOCB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NTVCRSwgMTYgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCMjQsICAgIDI0IH0sCisgICAgeyBBVl9QSVhfRk1UX0FSR0IsICAgICAzMiB9LAorICAgIHsgQVZfUElYX0ZNVF9NT05PV0hJVEUsMzMgfSwKKyAgICB7IEFWX1BJWF9GTVRfTk9ORSwgICAgICAwIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcmF3LmggYi9mZm1wZWcvbGliYXZjb2RlYy9yYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGJmNGNjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmF3LmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIFJhdyBWaWRlbyBDb2RlYworICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSYXcgVmlkZW8gQ29kZWMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUkFXX0gKKyNkZWZpbmUgQVZDT0RFQ19SQVdfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBQaXhlbEZvcm1hdFRhZyB7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgdW5zaWduZWQgaW50IGZvdXJjYzsKK30gUGl4ZWxGb3JtYXRUYWc7CisKK2V4dGVybiBjb25zdCBQaXhlbEZvcm1hdFRhZyBmZl9yYXdfcGl4X2ZtdF90YWdzW107IC8vIGV4cG9zZWQgdGhyb3VnaCBhdnByaXZfZ2V0X3Jhd19waXhfZm10X3RhZ3MoKQorCitjb25zdCBzdHJ1Y3QgUGl4ZWxGb3JtYXRUYWcgKmF2cHJpdl9nZXRfcmF3X3BpeF9mbXRfdGFncyh2b2lkKTsKKworZW51bSBBVlBpeGVsRm9ybWF0IGF2cHJpdl9maW5kX3BpeF9mbXQoY29uc3QgUGl4ZWxGb3JtYXRUYWcgKnRhZ3MsIHVuc2lnbmVkIGludCBmb3VyY2MpOworCitleHRlcm4gYXZfZXhwb3J0IGNvbnN0IFBpeGVsRm9ybWF0VGFnIGF2cHJpdl9waXhfZm10X2Jwc19hdmlbXTsKK2V4dGVybiBhdl9leHBvcnQgY29uc3QgUGl4ZWxGb3JtYXRUYWcgYXZwcml2X3BpeF9mbXRfYnBzX21vdltdOworCisjZW5kaWYgLyogQVZDT0RFQ19SQVdfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcmF3ZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9yYXdkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDdkZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmF3ZGVjLmMKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBSYXcgVmlkZW8gRGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSYXcgVmlkZW8gRGVjb2RlcgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnN3YXBkc3AuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicmF3LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2J1ZmZlci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCit0eXBlZGVmIHN0cnVjdCBSYXdWaWRlb0NvbnRleHQgeworICAgIEFWQ2xhc3MgKmF2X2NsYXNzOworICAgIEFWQnVmZmVyUmVmICpwYWxldHRlOworICAgIGludCBmcmFtZV9zaXplOyAgLyogc2l6ZSBvZiB0aGUgZnJhbWUgaW4gYnl0ZXMgKi8KKyAgICBpbnQgZmxpcDsKKyAgICBpbnQgaXNfMl80X2JwcDsgLy8gMiBvciA0IGJwcCByYXcgaW4gYXZpL21vdgorICAgIGludCBpc195dXYyOworICAgIGludCBpc19sdF8xNmJwcDsgLy8gMTZicHAgcGl4Zm10IGFuZCBiaXRzX3Blcl9jb2RlZF9zYW1wbGUgPCAxNgorICAgIGludCB0ZmY7CisKKyAgICBCc3dhcERTUENvbnRleHQgYmJkc3A7CisgICAgdm9pZCAqYml0c3RyZWFtX2J1ZjsKKyAgICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX2J1Zl9zaXplOworfSBSYXdWaWRlb0NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW109eworeyJ0b3AiLCAidG9wIGZpZWxkIGZpcnN0Iiwgb2Zmc2V0b2YoUmF3VmlkZW9Db250ZXh0LCB0ZmYpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgMSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU19LAore05VTEx9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyByYXdkZWNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAicmF3ZGVjIiwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgcmF3X2luaXRfZGVjb2RlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUmF3VmlkZW9Db250ZXh0ICpjb250ZXh0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7CisKKyAgICBmZl9ic3dhcGRzcF9pbml0KCZjb250ZXh0LT5iYmRzcCk7CisKKyAgICBpZiAoICAgYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygncicsJ2EnLCd3JywnICcpCisgICAgICAgIHx8IGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ04nLCdPJywnMScsJzYnKSkKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBhdnByaXZfZmluZF9waXhfZm10KGF2cHJpdl9waXhfZm10X2Jwc19tb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgIGVsc2UgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ1cnLCAnUicsICdBJywgJ1cnKSkKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBhdnByaXZfZmluZF9waXhfZm10KGF2cHJpdl9waXhfZm10X2Jwc19hdmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgIGVsc2UgaWYgKGF2Y3R4LT5jb2RlY190YWcgJiYgKGF2Y3R4LT5jb2RlY190YWcgJiAweEZGRkZGRikgIT0gTUtUQUcoJ0InLCdJJywnVCcsIDApKQorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IGF2cHJpdl9maW5kX3BpeF9mbXQoZmZfcmF3X3BpeF9mbXRfdGFncywgYXZjdHgtPmNvZGVjX3RhZyk7CisgICAgZWxzZSBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FICYmIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpCisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gYXZwcml2X2ZpbmRfcGl4X2ZtdChhdnByaXZfcGl4X2ZtdF9icHNfYXZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKworICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKKyAgICBpZiAoIWRlc2MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBpeGVsIGZvcm1hdC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChkZXNjLT5mbGFncyAmIChBVl9QSVhfRk1UX0ZMQUdfUEFMIHwgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCkpIHsKKyAgICAgICAgY29udGV4dC0+cGFsZXR0ZSA9IGF2X2J1ZmZlcl9hbGxvYyhBVlBBTEVUVEVfU0laRSk7CisgICAgICAgIGlmICghY29udGV4dC0+cGFsZXR0ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwpCisgICAgICAgICAgICBhdnByaXZfc2V0X3N5c3RlbWF0aWNfcGFsMigodWludDMyX3QqKWNvbnRleHQtPnBhbGV0dGUtPmRhdGEsIGF2Y3R4LT5waXhfZm10KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWVtc2V0KGNvbnRleHQtPnBhbGV0dGUtPmRhdGEsIDAsIEFWUEFMRVRURV9TSVpFKTsKKyAgICB9CisKKyAgICBpZiAoKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSA5ICYmCisgICAgICAgICAhbWVtY21wKGF2Y3R4LT5leHRyYWRhdGEgKyBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgLSA5LCAiQm90dG9tVXAiLCA5KSkgfHwKKyAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnYycsJ3knLCd1JywndicpIHx8CisgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoMywgMCwgMCwgMCkgfHwKKyAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnVycsJ1InLCdBJywnVycpKQorICAgICAgICBjb250ZXh0LT5mbGlwID0gMTsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IEFWX1JMMzIoInl1djIiKSAmJgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCAgID09IEFWX1BJWF9GTVRfWVVZVjQyMikKKyAgICAgICAgY29udGV4dC0+aXNfeXV2MiA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmxpcChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGljdHVyZSAqcGljdHVyZSkKK3sKKyAgICBwaWN0dXJlLT5kYXRhWzBdICAgICArPSBwaWN0dXJlLT5saW5lc2l6ZVswXSAqIChhdmN0eC0+aGVpZ2h0IC0gMSk7CisgICAgcGljdHVyZS0+bGluZXNpemVbMF0gKj0gLTE7Cit9CisKKy8qCisgKiBTY2FsZSBzYW1wbGUgdG8gMTYtYml0IHJlc29sdXRpb24KKyAqLworI2RlZmluZSBTQ0FMRTE2KHgsIGJpdHMpICgoKHgpIDw8ICgxNiAtIChiaXRzKSkpIHwgKCh4KSA+PiAoMiAqIChiaXRzKSAtIDE2KSkpCisKKy8qKgorICogU2NhbGUgYnVmZmVyIHRvIDE2IGJpdHMgcGVyIGNvZGVkIHNhbXBsZSByZXNvbHV0aW9uCisgKi8KKyNkZWZpbmUgTUtTQ0FMRTE2KG5hbWUsIHIxNiwgdzE2KSBcCitzdGF0aWMgdm9pZCBuYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdWludDhfdCAqIGRzdCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBwYWNrZWQpIFwKK3sgXAorICAgIGludCBpOyBcCisgICAgaWYgKCFwYWNrZWQpIHsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpICsgMSA8IGJ1Zl9zaXplOyBpICs9IDIpIFwKKyAgICAgICAgICAgIHcxNihkc3QgKyBpLCBTQ0FMRTE2KHIxNihidWYgKyBpKSwgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkpOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBHZXRCaXRDb250ZXh0IGdiOyBcCisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJ1Zl9zaXplICogOCk7IFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQ7IGkrKykgeyBcCisgICAgICAgICAgICBpbnQgc2FtcGxlID0gZ2V0X2JpdHMoJmdiLCBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsgXAorICAgICAgICAgICAgdzE2KGRzdCArIGkqMiwgU0NBTEUxNihzYW1wbGUsIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpKTsgXAorICAgICAgICB9IFwKKyAgIH0gXAorfQorCitNS1NDQUxFMTYoc2NhbGUxNmJlLCBBVl9SQjE2LCBBVl9XQjE2KQorTUtTQ0FMRTE2KHNjYWxlMTZsZSwgQVZfUkwxNiwgQVZfV0wxNikKKworc3RhdGljIGludCByYXdfZGVjb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZjdHgtPnBpeF9mbXQpOworICAgIFJhd1ZpZGVvQ29udGV4dCAqY29udGV4dCAgICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnVmICAgICAgICAgICAgID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgICAgICAgICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgaW50IGxpbmVzaXplX2FsaWduICAgICAgICAgICAgID0gNDsKKyAgICBpbnQgcmVzLCBsZW47CisgICAgaW50IG5lZWRfY29weTsKKworICAgIEFWRnJhbWUgICAqZnJhbWUgICA9IGRhdGE7CisgICAgQVZQaWN0dXJlICpwaWN0dXJlID0gZGF0YTsKKworICAgIGlmICgoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSA0IHx8IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMikgJiYKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4ICYmCisgICAgICAgKCFhdmN0eC0+Y29kZWNfdGFnIHx8IGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ3InLCdhJywndycsJyAnKSkpIHsKKyAgICAgICAgY29udGV4dC0+aXNfMl80X2JwcCA9IDE7CisgICAgICAgIGNvbnRleHQtPmZyYW1lX3NpemUgPSBhdnBpY3R1cmVfZ2V0X3NpemUoYXZjdHgtPnBpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZBTElHTihhdmN0eC0+d2lkdGgsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb250ZXh0LT5pc19sdF8xNmJwcCA9IGF2X2dldF9iaXRzX3Blcl9waXhlbChkZXNjKSA9PSAxNiAmJiBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlICYmIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPCAxNjsKKyAgICAgICAgY29udGV4dC0+ZnJhbWVfc2l6ZSA9IGF2cGljdHVyZV9nZXRfc2l6ZShhdmN0eC0+cGl4X2ZtdCwgYXZjdHgtPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQpOworICAgIH0KKyAgICBpZiAoY29udGV4dC0+ZnJhbWVfc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBjb250ZXh0LT5mcmFtZV9zaXplOworCisgICAgbmVlZF9jb3B5ID0gIWF2cGt0LT5idWYgfHwgY29udGV4dC0+aXNfMl80X2JwcCB8fCBjb250ZXh0LT5pc195dXYyIHx8IGNvbnRleHQtPmlzX2x0XzE2YnBwOworCisgICAgZnJhbWUtPnBpY3RfdHlwZSAgICAgICAgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBmcmFtZS0+a2V5X2ZyYW1lICAgICAgICA9IDE7CisKKyAgICByZXMgPSBmZl9kZWNvZGVfZnJhbWVfcHJvcHMoYXZjdHgsIGZyYW1lKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIGF2X2ZyYW1lX3NldF9wa3RfcG9zICAgICAoZnJhbWUsIGF2Y3R4LT5pbnRlcm5hbC0+cGt0LT5wb3MpOworICAgIGF2X2ZyYW1lX3NldF9wa3RfZHVyYXRpb24oZnJhbWUsIGF2Y3R4LT5pbnRlcm5hbC0+cGt0LT5kdXJhdGlvbik7CisKKyAgICBpZiAoY29udGV4dC0+dGZmID49IDApIHsKKyAgICAgICAgZnJhbWUtPmludGVybGFjZWRfZnJhbWUgPSAxOworICAgICAgICBmcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ICA9IGNvbnRleHQtPnRmZjsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IGF2X2ltYWdlX2NoZWNrX3NpemUoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCAwLCBhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIGlmIChuZWVkX2NvcHkpCisgICAgICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfYWxsb2MoRkZNQVgoY29udGV4dC0+ZnJhbWVfc2l6ZSwgYnVmX3NpemUpKTsKKyAgICBlbHNlCisgICAgICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfcmVmKGF2cGt0LT5idWYpOworICAgIGlmICghZnJhbWUtPmJ1ZlswXSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8vMmJwcCBhbmQgNGJwcCByYXcgaW4gYXZpIGFuZCBtb3YgKHllcyB0aGlzIGlzIHVnbHkgLi4uKQorICAgIGlmIChjb250ZXh0LT5pc18yXzRfYnBwKSB7CisgICAgICAgIGludCBpOworICAgICAgICB1aW50OF90ICpkc3QgPSBmcmFtZS0+YnVmWzBdLT5kYXRhOworICAgICAgICBidWZfc2l6ZSA9IGNvbnRleHQtPmZyYW1lX3NpemUgLSBBVlBBTEVUVEVfU0laRTsKKyAgICAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gNCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgMiAqIGkgKyAxIDwgYnVmX3NpemUgJiYgaTxhdnBrdC0+c2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZHN0WzIgKiBpICsgMF0gPSBidWZbaV0gPj4gNDsKKyAgICAgICAgICAgICAgICBkc3RbMiAqIGkgKyAxXSA9IGJ1ZltpXSAmIDE1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZXNpemVfYWxpZ24gPSA4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfYXNzZXJ0MChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgNCAqIGkgKyAzIDwgYnVmX3NpemUgJiYgaTxhdnBrdC0+c2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZHN0WzQgKiBpICsgMF0gPSBidWZbaV0gPj4gNjsKKyAgICAgICAgICAgICAgICBkc3RbNCAqIGkgKyAxXSA9IGJ1ZltpXSA+PiA0ICYgMzsKKyAgICAgICAgICAgICAgICBkc3RbNCAqIGkgKyAyXSA9IGJ1ZltpXSA+PiAyICYgMzsKKyAgICAgICAgICAgICAgICBkc3RbNCAqIGkgKyAzXSA9IGJ1ZltpXSAgICAgICYgMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmVzaXplX2FsaWduID0gMTY7CisgICAgICAgIH0KKyAgICAgICAgYnVmID0gZHN0OworICAgIH0gZWxzZSBpZiAoY29udGV4dC0+aXNfbHRfMTZicHApIHsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gZnJhbWUtPmJ1ZlswXS0+ZGF0YTsKKyAgICAgICAgaW50IHBhY2tlZCA9IChhdmN0eC0+Y29kZWNfdGFnICYgMHhGRkZGRkYpID09IE1LVEFHKCdCJywnSScsJ1QnLCAwKTsKKyAgICAgICAgaW50IHN3YXAgICA9ICBhdmN0eC0+Y29kZWNfdGFnID4+IDI0OworCisgICAgICAgIGlmIChwYWNrZWQgJiYgc3dhcCkgeworICAgICAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZjb250ZXh0LT5iaXRzdHJlYW1fYnVmLCAmY29udGV4dC0+Yml0c3RyZWFtX2J1Zl9zaXplLCBidWZfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWNvbnRleHQtPmJpdHN0cmVhbV9idWYpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGlmIChzd2FwID09IDE2KQorICAgICAgICAgICAgICAgIGNvbnRleHQtPmJiZHNwLmJzd2FwMTZfYnVmKGNvbnRleHQtPmJpdHN0cmVhbV9idWYsIChjb25zdCB1aW50MTZfdCopYnVmLCBidWZfc2l6ZSAvIDIpOworICAgICAgICAgICAgZWxzZSBpZiAoc3dhcCA9PSAzMikKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5iYmRzcC5ic3dhcF9idWYoY29udGV4dC0+Yml0c3RyZWFtX2J1ZiwgKGNvbnN0IHVpbnQzMl90KilidWYsIGJ1Zl9zaXplIC8gNCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBidWYgPSBjb250ZXh0LT5iaXRzdHJlYW1fYnVmOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKQorICAgICAgICAgICAgc2NhbGUxNmJlKGF2Y3R4LCBkc3QsIGJ1ZiwgYnVmX3NpemUsIHBhY2tlZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNjYWxlMTZsZShhdmN0eCwgZHN0LCBidWYsIGJ1Zl9zaXplLCBwYWNrZWQpOworCisgICAgICAgIGJ1ZiA9IGRzdDsKKyAgICB9IGVsc2UgaWYgKG5lZWRfY29weSkgeworICAgICAgICBtZW1jcHkoZnJhbWUtPmJ1ZlswXS0+ZGF0YSwgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgIGJ1ZiA9IGZyYW1lLT5idWZbMF0tPmRhdGE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0EnLCAnVicsICcxJywgJ3gnKSB8fAorICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdBJywgJ1YnLCAndScsICdwJykpCisgICAgICAgIGJ1ZiArPSBidWZfc2l6ZSAtIGNvbnRleHQtPmZyYW1lX3NpemU7CisKKyAgICBsZW4gPSBjb250ZXh0LT5mcmFtZV9zaXplIC0gKGF2Y3R4LT5waXhfZm10PT1BVl9QSVhfRk1UX1BBTDggPyBBVlBBTEVUVEVfU0laRSA6IDApOworICAgIGlmIChidWZfc2l6ZSA8IGxlbiAmJiAoYXZjdHgtPmNvZGVjX3RhZyAmIDB4RkZGRkZGKSAhPSBNS1RBRygnQicsJ0knLCdUJywgMCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGJ1ZmZlciBzaXplLCBwYWNrZXQgc2l6ZSAlZCA8IGV4cGVjdGVkIGZyYW1lX3NpemUgJWRcbiIsIGJ1Zl9zaXplLCBsZW4pOworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lLT5idWZbMF0pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICgocmVzID0gYXZwaWN0dXJlX2ZpbGwocGljdHVyZSwgYnVmLCBhdmN0eC0+cGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCkpIDwgMCkgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lLT5idWZbMF0pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgIGlmIChwYWwpIHsKKyAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmY29udGV4dC0+cGFsZXR0ZSk7CisgICAgICAgICAgICBjb250ZXh0LT5wYWxldHRlID0gYXZfYnVmZmVyX2FsbG9jKEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgIGlmICghY29udGV4dC0+cGFsZXR0ZSkgeworICAgICAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmZnJhbWUtPmJ1ZlswXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShjb250ZXh0LT5wYWxldHRlLT5kYXRhLCBwYWwsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgIGZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoYXZjdHgtPnBpeF9mbXQ9PUFWX1BJWF9GTVRfQkdSMjQgICAgfHwKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQ9PUFWX1BJWF9GTVRfR1JBWTggICAgfHwKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQ9PUFWX1BJWF9GTVRfUkdCNTU1TEUgfHwKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQ9PUFWX1BJWF9GTVRfUkdCNTU1QkUgfHwKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQ9PUFWX1BJWF9GTVRfUkdCNTY1TEUgfHwKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQ9PUFWX1BJWF9GTVRfTU9OT1dISVRFIHx8CisgICAgICAgIGF2Y3R4LT5waXhfZm10PT1BVl9QSVhfRk1UX1BBTDgpICYmCisgICAgICAgIEZGQUxJR04oZnJhbWUtPmxpbmVzaXplWzBdLCBsaW5lc2l6ZV9hbGlnbikgKiBhdmN0eC0+aGVpZ2h0IDw9IGJ1Zl9zaXplKQorICAgICAgICBmcmFtZS0+bGluZXNpemVbMF0gPSBGRkFMSUdOKGZyYW1lLT5saW5lc2l6ZVswXSwgbGluZXNpemVfYWxpZ24pOworCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTlYxMiAmJiBhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdOJywgJ1YnLCAnMScsICcyJykgJiYKKyAgICAgICAgRkZBTElHTihmcmFtZS0+bGluZXNpemVbMF0sIGxpbmVzaXplX2FsaWduKSAqIGF2Y3R4LT5oZWlnaHQgKworICAgICAgICBGRkFMSUdOKGZyYW1lLT5saW5lc2l6ZVsxXSwgbGluZXNpemVfYWxpZ24pICogKChhdmN0eC0+aGVpZ2h0ICsgMSkgLyAyKSA8PSBidWZfc2l6ZSkgeworICAgICAgICBpbnQgbGEwID0gRkZBTElHTihmcmFtZS0+bGluZXNpemVbMF0sIGxpbmVzaXplX2FsaWduKTsKKyAgICAgICAgZnJhbWUtPmRhdGFbMV0gKz0gKGxhMCAtIGZyYW1lLT5saW5lc2l6ZVswXSkgKiBhdmN0eC0+aGVpZ2h0OworICAgICAgICBmcmFtZS0+bGluZXNpemVbMF0gPSBsYTA7CisgICAgICAgIGZyYW1lLT5saW5lc2l6ZVsxXSA9IEZGQUxJR04oZnJhbWUtPmxpbmVzaXplWzFdLCBsaW5lc2l6ZV9hbGlnbik7CisgICAgfQorCisgICAgaWYgKChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDggJiYgYnVmX3NpemUgPCBjb250ZXh0LT5mcmFtZV9zaXplKSB8fAorICAgICAgICAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKSkgeworICAgICAgICBmcmFtZS0+YnVmWzFdICA9IGF2X2J1ZmZlcl9yZWYoY29udGV4dC0+cGFsZXR0ZSk7CisgICAgICAgIGlmICghZnJhbWUtPmJ1ZlsxXSkgeworICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZS0+YnVmWzBdKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgZnJhbWUtPmRhdGFbMV0gPSBmcmFtZS0+YnVmWzFdLT5kYXRhOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjI0ICYmCisgICAgICAgICgoZnJhbWUtPmxpbmVzaXplWzBdICsgMykgJiB+MykgKiBhdmN0eC0+aGVpZ2h0IDw9IGJ1Zl9zaXplKQorICAgICAgICBmcmFtZS0+bGluZXNpemVbMF0gPSAoZnJhbWUtPmxpbmVzaXplWzBdICsgMykgJiB+MzsKKworICAgIGlmIChjb250ZXh0LT5mbGlwKQorICAgICAgICBmbGlwKGF2Y3R4LCBwaWN0dXJlKTsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdZJywgJ1YnLCAnMScsICcyJykgfHwKKyAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnWScsICdWJywgJzEnLCAnNicpIHx8CisgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ1knLCAnVicsICcyJywgJzQnKSB8fAorICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdZJywgJ1YnLCAnVScsICc5JykpCisgICAgICAgIEZGU1dBUCh1aW50OF90ICosIHBpY3R1cmUtPmRhdGFbMV0sIHBpY3R1cmUtPmRhdGFbMl0pOworCisgICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gQVZfUkwzMigiSTQyMCIpICYmIChhdmN0eC0+d2lkdGgrMSkqKGF2Y3R4LT5oZWlnaHQrMSkgKiAzLzIgPT0gYnVmX3NpemUpIHsKKyAgICAgICAgcGljdHVyZS0+ZGF0YVsxXSA9IHBpY3R1cmUtPmRhdGFbMV0gKyAgKGF2Y3R4LT53aWR0aCsxKSooYXZjdHgtPmhlaWdodCsxKSAtYXZjdHgtPndpZHRoKmF2Y3R4LT5oZWlnaHQ7CisgICAgICAgIHBpY3R1cmUtPmRhdGFbMl0gPSBwaWN0dXJlLT5kYXRhWzJdICsgKChhdmN0eC0+d2lkdGgrMSkqKGF2Y3R4LT5oZWlnaHQrMSkgLWF2Y3R4LT53aWR0aCphdmN0eC0+aGVpZ2h0KSo1LzQ7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gQVZfUkwzMigieXV2MiIpICYmCisgICAgICAgIGF2Y3R4LT5waXhfZm10ICAgPT0gQVZfUElYX0ZNVF9ZVVlWNDIyKSB7CisgICAgICAgIGludCB4LCB5OworICAgICAgICB1aW50OF90ICpsaW5lID0gcGljdHVyZS0+ZGF0YVswXTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKQorICAgICAgICAgICAgICAgIGxpbmVbMiAqIHggKyAxXSBePSAweDgwOworICAgICAgICAgICAgbGluZSArPSBwaWN0dXJlLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdmN0eC0+ZmllbGRfb3JkZXIgPiBBVl9GSUVMRF9QUk9HUkVTU0lWRSkgeyAvKiB3ZSBoYXZlIGludGVybGFjZWQgbWF0ZXJpYWwgZmxhZ2dlZCBpbiBjb250YWluZXIgKi8KKyAgICAgICAgZnJhbWUtPmludGVybGFjZWRfZnJhbWUgPSAxOworICAgICAgICBpZiAoYXZjdHgtPmZpZWxkX29yZGVyID09IEFWX0ZJRUxEX1RUIHx8IGF2Y3R4LT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9UQikKKyAgICAgICAgICAgIGZyYW1lLT50b3BfZmllbGRfZmlyc3QgPSAxOworICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHJhd19jbG9zZV9kZWNvZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBSYXdWaWRlb0NvbnRleHQgKmNvbnRleHQgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZjb250ZXh0LT5wYWxldHRlKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9yYXd2aWRlb19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJyYXd2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUmF3VmlkZW9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSByYXdfaW5pdF9kZWNvZGVyLAorICAgIC5jbG9zZSAgICAgICAgICA9IHJhd19jbG9zZV9kZWNvZGVyLAorICAgIC5kZWNvZGUgICAgICAgICA9IHJhd19kZWNvZGUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnJhd2RlY19jbGFzcywKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfUEFSQU1fQ0hBTkdFLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Jhd2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmF3ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3OTIzMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Jhd2VuYy5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBSYXcgVmlkZW8gRW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSYXcgVmlkZW8gRW5jb2RlcgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAicmF3LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKworc3RhdGljIGF2X2NvbGQgaW50IHJhd19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCk7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9waXhlbChkZXNjKTsKKyAgICBpZighYXZjdHgtPmNvZGVjX3RhZykKKyAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IGF2Y29kZWNfcGl4X2ZtdF90b19jb2RlY190YWcoYXZjdHgtPnBpeF9mbXQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhd19lbmNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgaW50IHJldCA9IGF2cGljdHVyZV9nZXRfc2l6ZShhdmN0eC0+cGl4X2ZtdCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIHJldCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoKHJldCA9IGF2cGljdHVyZV9sYXlvdXQoKGNvbnN0IEFWUGljdHVyZSAqKWZyYW1lLCBhdmN0eC0+cGl4X2ZtdCwgYXZjdHgtPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0LCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmKGF2Y3R4LT5jb2RlY190YWcgPT0gQVZfUkwzMigieXV2MiIpICYmIHJldCA+IDAgJiYKKyAgICAgICBhdmN0eC0+cGl4X2ZtdCAgID09IEFWX1BJWF9GTVRfWVVZVjQyMikgeworICAgICAgICBpbnQgeDsKKyAgICAgICAgZm9yKHggPSAxOyB4IDwgYXZjdHgtPmhlaWdodCphdmN0eC0+d2lkdGgqMjsgeCArPSAyKQorICAgICAgICAgICAgcGt0LT5kYXRhW3hdIF49IDB4ODA7CisgICAgfQorICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHJhd19jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9yYXd2aWRlb19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJyYXd2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTywKKyAgICAuaW5pdCAgICAgICAgICAgPSByYXdfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gcmF3X2VuY29kZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSByYXdfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcmRmdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmRmdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTIxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yZGZ0LmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiAoSSlSREZUIHRyYW5zZm9ybXMKKyAqIENvcHlyaWdodCAoYykgMjAwOSBBbGV4IENvbnZlcnNlIDxhbGV4IGRvdCBjb252ZXJzZSBhdCBnbWFpbCBkb3QgY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJyZGZ0LmgiCisKKy8qKgorICogQGZpbGUKKyAqIChJbnZlcnNlKSBSZWFsIERpc2NyZXRlIEZvdXJpZXIgVHJhbnNmb3Jtcy4KKyAqLworCisvKiBzaW4oMipwaSp4L24pIGZvciAwPD14PG4vNCwgZm9sbG93ZWQgYnkgbi8yPD14PDNuLzQgKi8KKyNpZiAhQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKK1NJTlRBQkxFKDE2KTsKK1NJTlRBQkxFKDMyKTsKK1NJTlRBQkxFKDY0KTsKK1NJTlRBQkxFKDEyOCk7CitTSU5UQUJMRSgyNTYpOworU0lOVEFCTEUoNTEyKTsKK1NJTlRBQkxFKDEwMjQpOworU0lOVEFCTEUoMjA0OCk7CitTSU5UQUJMRSg0MDk2KTsKK1NJTlRBQkxFKDgxOTIpOworU0lOVEFCTEUoMTYzODQpOworU0lOVEFCTEUoMzI3NjgpOworU0lOVEFCTEUoNjU1MzYpOworI2VuZGlmCitzdGF0aWMgU0lOVEFCTEVfQ09OU1QgRkZUU2FtcGxlICogY29uc3QgZmZfc2luX3RhYnNbXSA9IHsKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgIGZmX3Npbl8xNiwgZmZfc2luXzMyLCBmZl9zaW5fNjQsIGZmX3Npbl8xMjgsIGZmX3Npbl8yNTYsIGZmX3Npbl81MTIsIGZmX3Npbl8xMDI0LAorICAgIGZmX3Npbl8yMDQ4LCBmZl9zaW5fNDA5NiwgZmZfc2luXzgxOTIsIGZmX3Npbl8xNjM4NCwgZmZfc2luXzMyNzY4LCBmZl9zaW5fNjU1MzYsCit9OworCisvKiogTWFwIG9uZSByZWFsIEZGVCBpbnRvIHR3byBwYXJhbGxlbCByZWFsIGV2ZW4gYW5kIG9kZCBGRlRzLiBUaGVuIGludGVybGVhdmUKKyAqIHRoZSB0d28gcmVhbCBGRlRzIGludG8gb25lIGNvbXBsZXggRkZULiBVbm1hbmdsZSB0aGUgcmVzdWx0cy4KKyAqIHJlZjogaHR0cDovL3d3dy5lbmdpbmVlcmluZ3Byb2R1Y3Rpdml0eXRvb2xzLmNvbS9zdHVmZi9UMDAwMS9QVDEwLkhUTQorICovCitzdGF0aWMgdm9pZCByZGZ0X2NhbGNfYyhSREZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpkYXRhKQoreworICAgIGludCBpLCBpMSwgaTI7CisgICAgRkZUQ29tcGxleCBldiwgb2Q7CisgICAgY29uc3QgaW50IG4gPSAxIDw8IHMtPm5iaXRzOworICAgIGNvbnN0IGZsb2F0IGsxID0gMC41OworICAgIGNvbnN0IGZsb2F0IGsyID0gMC41IC0gcy0+aW52ZXJzZTsKKyAgICBjb25zdCBGRlRTYW1wbGUgKnRjb3MgPSBzLT50Y29zOworICAgIGNvbnN0IEZGVFNhbXBsZSAqdHNpbiA9IHMtPnRzaW47CisKKyAgICBpZiAoIXMtPmludmVyc2UpIHsKKyAgICAgICAgcy0+ZmZ0LmZmdF9wZXJtdXRlKCZzLT5mZnQsIChGRlRDb21wbGV4KilkYXRhKTsKKyAgICAgICAgcy0+ZmZ0LmZmdF9jYWxjKCZzLT5mZnQsIChGRlRDb21wbGV4KilkYXRhKTsKKyAgICB9CisgICAgLyogaT0wIGlzIGEgc3BlY2lhbCBjYXNlIGJlY2F1c2Ugb2YgcGFja2luZywgdGhlIERDIHRlcm0gaXMgcmVhbCwgc28gd2UKKyAgICAgICBhcmUgZ29pbmcgdG8gdGhyb3cgdGhlIE4vMiB0ZXJtIChhbHNvIHJlYWwpIGluIHdpdGggaXQuICovCisgICAgZXYucmUgPSBkYXRhWzBdOworICAgIGRhdGFbMF0gPSBldi5yZStkYXRhWzFdOworICAgIGRhdGFbMV0gPSBldi5yZS1kYXRhWzFdOworICAgIGZvciAoaSA9IDE7IGkgPCAobj4+Mik7IGkrKykgeworICAgICAgICBpMSA9IDIqaTsKKyAgICAgICAgaTIgPSBuLWkxOworICAgICAgICAvKiBTZXBhcmF0ZSBldmVuIGFuZCBvZGQgRkZUcyAqLworICAgICAgICBldi5yZSA9ICBrMSooZGF0YVtpMSAgXStkYXRhW2kyICBdKTsKKyAgICAgICAgb2QuaW0gPSAtazIqKGRhdGFbaTEgIF0tZGF0YVtpMiAgXSk7CisgICAgICAgIGV2LmltID0gIGsxKihkYXRhW2kxKzFdLWRhdGFbaTIrMV0pOworICAgICAgICBvZC5yZSA9ICBrMiooZGF0YVtpMSsxXStkYXRhW2kyKzFdKTsKKyAgICAgICAgLyogQXBwbHkgdHdpZGRsZSBmYWN0b3JzIHRvIHRoZSBvZGQgRkZUIGFuZCBhZGQgdG8gdGhlIGV2ZW4gRkZUICovCisgICAgICAgIGRhdGFbaTEgIF0gPSAgZXYucmUgKyBvZC5yZSp0Y29zW2ldIC0gb2QuaW0qdHNpbltpXTsKKyAgICAgICAgZGF0YVtpMSsxXSA9ICBldi5pbSArIG9kLmltKnRjb3NbaV0gKyBvZC5yZSp0c2luW2ldOworICAgICAgICBkYXRhW2kyICBdID0gIGV2LnJlIC0gb2QucmUqdGNvc1tpXSArIG9kLmltKnRzaW5baV07CisgICAgICAgIGRhdGFbaTIrMV0gPSAtZXYuaW0gKyBvZC5pbSp0Y29zW2ldICsgb2QucmUqdHNpbltpXTsKKyAgICB9CisgICAgZGF0YVsyKmkrMV09cy0+c2lnbl9jb252ZW50aW9uKmRhdGFbMippKzFdOworICAgIGlmIChzLT5pbnZlcnNlKSB7CisgICAgICAgIGRhdGFbMF0gKj0gazE7CisgICAgICAgIGRhdGFbMV0gKj0gazE7CisgICAgICAgIHMtPmZmdC5mZnRfcGVybXV0ZSgmcy0+ZmZ0LCAoRkZUQ29tcGxleCopZGF0YSk7CisgICAgICAgIHMtPmZmdC5mZnRfY2FsYygmcy0+ZmZ0LCAoRkZUQ29tcGxleCopZGF0YSk7CisgICAgfQorfQorCithdl9jb2xkIGludCBmZl9yZGZ0X2luaXQoUkRGVENvbnRleHQgKnMsIGludCBuYml0cywgZW51bSBSREZUcmFuc2Zvcm1UeXBlIHRyYW5zKQoreworICAgIGludCBuID0gMSA8PCBuYml0czsKKworICAgIHMtPm5iaXRzICAgICAgICAgICA9IG5iaXRzOworICAgIHMtPmludmVyc2UgICAgICAgICA9IHRyYW5zID09IElERlRfQzJSIHx8IHRyYW5zID09IERGVF9DMlI7CisgICAgcy0+c2lnbl9jb252ZW50aW9uID0gdHJhbnMgPT0gSURGVF9SMkMgfHwgdHJhbnMgPT0gREZUX0MyUiA/IDEgOiAtMTsKKworICAgIGlmIChuYml0cyA8IDQgfHwgbmJpdHMgPiAxNikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGZmX2ZmdF9pbml0KCZzLT5mZnQsIG5iaXRzLTEsIHRyYW5zID09IElERlRfQzJSIHx8IHRyYW5zID09IElERlRfUjJDKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZmX2luaXRfZmZfY29zX3RhYnMobmJpdHMpOworICAgIHMtPnRjb3MgPSBmZl9jb3NfdGFic1tuYml0c107CisgICAgcy0+dHNpbiA9IGZmX3Npbl90YWJzW25iaXRzXSsodHJhbnMgPT0gREZUX1IyQyB8fCB0cmFucyA9PSBERlRfQzJSKSoobj4+Mik7CisjaWYgIUNPTkZJR19IQVJEQ09ERURfVEFCTEVTCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY29uc3QgZG91YmxlIHRoZXRhID0gKHRyYW5zID09IERGVF9SMkMgfHwgdHJhbnMgPT0gREZUX0MyUiA/IC0xIDogMSkgKiAyICogTV9QSSAvIG47CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAobiA+PiAyKTsgaSsrKQorICAgICAgICAgICAgcy0+dHNpbltpXSA9IHNpbihpICogdGhldGEpOworICAgIH0KKyNlbmRpZgorICAgIHMtPnJkZnRfY2FsYyAgID0gcmRmdF9jYWxjX2M7CisKKyAgICBpZiAoQVJDSF9BUk0pIGZmX3JkZnRfaW5pdF9hcm0ocyk7CisKKyAgICByZXR1cm4gMDsKK30KKworYXZfY29sZCB2b2lkIGZmX3JkZnRfZW5kKFJERlRDb250ZXh0ICpzKQoreworICAgIGZmX2ZmdF9lbmQoJnMtPmZmdCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9yZGZ0LmggYi9mZm1wZWcvbGliYXZjb2RlYy9yZGZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjNDBlNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JkZnQuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogKEkpUkRGVCB0cmFuc2Zvcm1zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQWxleCBDb252ZXJzZSA8YWxleCBkb3QgY29udmVyc2UgYXQgZ21haWwgZG90IGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmICFkZWZpbmVkKEFWQ09ERUNfUkRGVF9IKSAmJiAoIWRlZmluZWQoRkZUX0ZMT0FUKSB8fCBGRlRfRkxPQVQpCisjZGVmaW5lIEFWQ09ERUNfUkRGVF9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJmZnQuaCIKKworI2lmIENPTkZJR19IQVJEQ09ERURfVEFCTEVTCisjICAgZGVmaW5lIFNJTlRBQkxFX0NPTlNUIGNvbnN0CisjZWxzZQorIyAgIGRlZmluZSBTSU5UQUJMRV9DT05TVAorI2VuZGlmCisKKyNkZWZpbmUgU0lOVEFCTEUoc2l6ZSkgXAorICAgIFNJTlRBQkxFX0NPTlNUIERFQ0xBUkVfQUxJR05FRCgxNiwgRkZUU2FtcGxlLCBmZl9zaW5fIyNzaXplKVtzaXplLzJdCisKK2V4dGVybiBTSU5UQUJMRSgxNik7CitleHRlcm4gU0lOVEFCTEUoMzIpOworZXh0ZXJuIFNJTlRBQkxFKDY0KTsKK2V4dGVybiBTSU5UQUJMRSgxMjgpOworZXh0ZXJuIFNJTlRBQkxFKDI1Nik7CitleHRlcm4gU0lOVEFCTEUoNTEyKTsKK2V4dGVybiBTSU5UQUJMRSgxMDI0KTsKK2V4dGVybiBTSU5UQUJMRSgyMDQ4KTsKK2V4dGVybiBTSU5UQUJMRSg0MDk2KTsKK2V4dGVybiBTSU5UQUJMRSg4MTkyKTsKK2V4dGVybiBTSU5UQUJMRSgxNjM4NCk7CitleHRlcm4gU0lOVEFCTEUoMzI3NjgpOworZXh0ZXJuIFNJTlRBQkxFKDY1NTM2KTsKKworc3RydWN0IFJERlRDb250ZXh0IHsKKyAgICBpbnQgbmJpdHM7CisgICAgaW50IGludmVyc2U7CisgICAgaW50IHNpZ25fY29udmVudGlvbjsKKworICAgIC8qIHByZS9wb3N0IHJvdGF0aW9uIHRhYmxlcyAqLworICAgIGNvbnN0IEZGVFNhbXBsZSAqdGNvczsKKyAgICBTSU5UQUJMRV9DT05TVCBGRlRTYW1wbGUgKnRzaW47CisgICAgRkZUQ29udGV4dCBmZnQ7CisgICAgdm9pZCAoKnJkZnRfY2FsYykoc3RydWN0IFJERlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKnopOworfTsKKworLyoqCisgKiBTZXQgdXAgYSByZWFsIEZGVC4KKyAqIEBwYXJhbSBuYml0cyAgICAgICAgICAgbG9nMiBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBhcnJheQorICogQHBhcmFtIHRyYW5zICAgICAgICAgICB0aGUgdHlwZSBvZiB0cmFuc2Zvcm0KKyAqLworaW50IGZmX3JkZnRfaW5pdChSREZUQ29udGV4dCAqcywgaW50IG5iaXRzLCBlbnVtIFJERlRyYW5zZm9ybVR5cGUgdHJhbnMpOwordm9pZCBmZl9yZGZ0X2VuZChSREZUQ29udGV4dCAqcyk7CisKK3ZvaWQgZmZfcmRmdF9pbml0X2FybShSREZUQ29udGV4dCAqcyk7CisKKworI2VuZGlmIC8qIEFWQ09ERUNfUkRGVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9yZWFsdGV4dGRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmVhbHRleHRkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzA5NTNiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmVhbHRleHRkZWMuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIENsw6ltZW50IELFk3NjaAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSZWFsVGV4dCBzdWJ0aXRsZSBkZWNvZGVyCisgKiBAc2VlIGh0dHA6Ly9zZXJ2aWNlLnJlYWwuY29tL2hlbHAvbGlicmFyeS9ndWlkZXMvUHJvZHVjdGlvbkd1aWRlL3Byb2RndWlkZS9odG1maWxlcy9yZWFsdGV4dC5odG0KKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImFzcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKworc3RhdGljIGludCBydF9ldmVudF90b19hc3MoQVZCUHJpbnQgKmJ1ZiwgY29uc3QgY2hhciAqcCkKK3sKKyAgICBpbnQgcHJldl9jaHJfaXNfc3BhY2UgPSAxOworCisgICAgd2hpbGUgKCpwKSB7CisgICAgICAgIGlmICgqcCAhPSAnPCcpIHsKKyAgICAgICAgICAgIGlmICghYXZfaXNzcGFjZSgqcCkpCisgICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGJ1ZiwgKnAsIDEpOworICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZfY2hyX2lzX3NwYWNlKQorICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhidWYsICcgJywgMSk7CisgICAgICAgICAgICBwcmV2X2Nocl9pc19zcGFjZSA9IGF2X2lzc3BhY2UoKnApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kID0gc3RyY2hyKHAsICc+Jyk7CisgICAgICAgICAgICBpZiAoIWVuZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICghYXZfc3RybmNhc2VjbXAocCwgIjxici8+IiwgNSkgfHwKKyAgICAgICAgICAgICAgICAhYXZfc3RybmNhc2VjbXAocCwgIjxicj4iLCAgNCkpIHsKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIlxcTiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCA9IGVuZDsKKyAgICAgICAgfQorICAgICAgICBwKys7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWx0ZXh0X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9zdWJfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKKyAgICBjb25zdCBjaGFyICpwdHIgPSBhdnBrdC0+ZGF0YTsKKyAgICBBVkJQcmludCBidWY7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAwLCA0MDk2KTsKKyAgICAvLyBub3RlOiBubyBuZWVkIHRvIHJlc2NhbGUgcHRzICYgZHVyYXRpb24gc2luY2UgdGhleSBhcmUgaW4gdGhlIHNhbWUKKyAgICAvLyB0aW1lYmFzZSBhcyBBU1MgKDEvMTAwKQorICAgIGlmIChwdHIgJiYgYXZwa3QtPnNpemUgPiAwICYmICFydF9ldmVudF90b19hc3MoJmJ1ZiwgcHRyKSkKKyAgICAgICAgcmV0ID0gZmZfYXNzX2FkZF9yZWN0X2JwcmludChzdWIsICZidWYsIGF2cGt0LT5wdHMsIGF2cGt0LT5kdXJhdGlvbik7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgICpnb3Rfc3ViX3B0ciA9IHN1Yi0+bnVtX3JlY3RzID4gMDsKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfcmVhbHRleHRfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicmVhbHRleHQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsVGV4dCBzdWJ0aXRsZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9SRUFMVEVYVCwKKyAgICAuZGVjb2RlICAgICAgICAgPSByZWFsdGV4dF9kZWNvZGVfZnJhbWUsCisgICAgLmluaXQgICAgICAgICAgID0gZmZfYXNzX3N1YnRpdGxlX2hlYWRlcl9kZWZhdWx0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JlY3RhbmdsZS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmVjdGFuZ2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0YTc2MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JlY3RhbmdsZS5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogcmVjdGFuZ2xlIGZpbGxpbmcgZnVuY3Rpb24KKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiB1c2VmdWwgcmVjdGFuZ2xlIGZpbGxpbmcgZnVuY3Rpb24KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUkVDVEFOR0xFX0gKKyNkZWZpbmUgQVZDT0RFQ19SRUNUQU5HTEVfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorCisvKioKKyAqIGZpbGwgYSByZWN0YW5nbGUuCisgKiBAcGFyYW0gaCBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgc2hvdWxkIGJlIGEgY29uc3RhbnQKKyAqIEBwYXJhbSB3IHdpZHRoIG9mIHRoZSByZWN0YW5nbGUsIHNob3VsZCBiZSBhIGNvbnN0YW50CisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB2YWwgKDEsIDIgb3IgNCksIHNob3VsZCBiZSBhIGNvbnN0YW50CisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmlsbF9yZWN0YW5nbGUodm9pZCAqdnAsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSwgdWludDMyX3QgdmFsLCBpbnQgc2l6ZSl7CisgICAgdWludDhfdCAqcD0gKHVpbnQ4X3QqKXZwOworICAgIGF2X2Fzc2VydDIoc2l6ZT09MSB8fCBzaXplPT0yIHx8IHNpemU9PTQpOworICAgIGF2X2Fzc2VydDIodzw9NCk7CisKKyAgICB3ICAgICAgKj0gc2l6ZTsKKyAgICBzdHJpZGUgKj0gc2l6ZTsKKworICAgIGF2X2Fzc2VydDIoKCgobG9uZyl2cCkmKEZGTUlOKHcsIDg8PChIQVZFX05FT058QVJDSF9QUEN8SEFWRV9NTVgpKS0xKSkgPT0gMCk7CisgICAgYXZfYXNzZXJ0Migoc3RyaWRlJih3LTEpKT09MCk7CisgICAgaWYodz09Mil7CisgICAgICAgIGNvbnN0IHVpbnQxNl90IHY9IHNpemU9PTQgPyB2YWwgOiB2YWwqMHgwMTAxOworICAgICAgICAqKHVpbnQxNl90KikocCArIDAqc3RyaWRlKT0gdjsKKyAgICAgICAgaWYoaD09MSkgcmV0dXJuOworICAgICAgICAqKHVpbnQxNl90KikocCArIDEqc3RyaWRlKT0gdjsKKyAgICAgICAgaWYoaD09MikgcmV0dXJuOworICAgICAgICAqKHVpbnQxNl90KikocCArIDIqc3RyaWRlKT0gdjsKKyAgICAgICAgKih1aW50MTZfdCopKHAgKyAzKnN0cmlkZSk9IHY7CisgICAgfWVsc2UgaWYodz09NCl7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHY9IHNpemU9PTQgPyB2YWwgOiBzaXplPT0yID8gdmFsKjB4MDAwMTAwMDEgOiB2YWwqMHgwMTAxMDEwMTsKKyAgICAgICAgKih1aW50MzJfdCopKHAgKyAwKnN0cmlkZSk9IHY7CisgICAgICAgIGlmKGg9PTEpIHJldHVybjsKKyAgICAgICAgKih1aW50MzJfdCopKHAgKyAxKnN0cmlkZSk9IHY7CisgICAgICAgIGlmKGg9PTIpIHJldHVybjsKKyAgICAgICAgKih1aW50MzJfdCopKHAgKyAyKnN0cmlkZSk9IHY7CisgICAgICAgICoodWludDMyX3QqKShwICsgMypzdHJpZGUpPSB2OworICAgIH1lbHNlIGlmKHc9PTgpeworICAgIC8vZ2NjIGNhbid0IG9wdGltaXplIDY0Yml0IG1hdGggb24geDg2XzMyCisjaWYgSEFWRV9GQVNUXzY0QklUCisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHY9ICBzaXplPT0yID8gdmFsKjB4MDAwMTAwMDEwMDAxMDAwMVVMTCA6IHZhbCoweDAxMDAwMDAwMDFVTEw7CisgICAgICAgICoodWludDY0X3QqKShwICsgMCpzdHJpZGUpPSB2OworICAgICAgICBpZihoPT0xKSByZXR1cm47CisgICAgICAgICoodWludDY0X3QqKShwICsgMSpzdHJpZGUpPSB2OworICAgICAgICBpZihoPT0yKSByZXR1cm47CisgICAgICAgICoodWludDY0X3QqKShwICsgMipzdHJpZGUpPSB2OworICAgICAgICAqKHVpbnQ2NF90KikocCArIDMqc3RyaWRlKT0gdjsKKyAgICB9ZWxzZSBpZih3PT0xNil7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHY9IHZhbCoweDAxMDAwMDAwMDFVTEw7CisgICAgICAgICoodWludDY0X3QqKShwICsgMCswKnN0cmlkZSk9IHY7CisgICAgICAgICoodWludDY0X3QqKShwICsgOCswKnN0cmlkZSk9IHY7CisgICAgICAgICoodWludDY0X3QqKShwICsgMCsxKnN0cmlkZSk9IHY7CisgICAgICAgICoodWludDY0X3QqKShwICsgOCsxKnN0cmlkZSk9IHY7CisgICAgICAgIGlmKGg9PTIpIHJldHVybjsKKyAgICAgICAgKih1aW50NjRfdCopKHAgKyAwKzIqc3RyaWRlKT0gdjsKKyAgICAgICAgKih1aW50NjRfdCopKHAgKyA4KzIqc3RyaWRlKT0gdjsKKyAgICAgICAgKih1aW50NjRfdCopKHAgKyAwKzMqc3RyaWRlKT0gdjsKKyAgICAgICAgKih1aW50NjRfdCopKHAgKyA4KzMqc3RyaWRlKT0gdjsKKyNlbHNlCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHY9IHNpemU9PTIgPyB2YWwqMHgwMDAxMDAwMSA6IHZhbDsKKyAgICAgICAgKih1aW50MzJfdCopKHAgKyAwKzAqc3RyaWRlKT0gdjsKKyAgICAgICAgKih1aW50MzJfdCopKHAgKyA0KzAqc3RyaWRlKT0gdjsKKyAgICAgICAgaWYoaD09MSkgcmV0dXJuOworICAgICAgICAqKHVpbnQzMl90KikocCArIDArMSpzdHJpZGUpPSB2OworICAgICAgICAqKHVpbnQzMl90KikocCArIDQrMSpzdHJpZGUpPSB2OworICAgICAgICBpZihoPT0yKSByZXR1cm47CisgICAgICAgICoodWludDMyX3QqKShwICsgMCsyKnN0cmlkZSk9IHY7CisgICAgICAgICoodWludDMyX3QqKShwICsgNCsyKnN0cmlkZSk9IHY7CisgICAgICAgICoodWludDMyX3QqKShwICsgMCszKnN0cmlkZSk9IHY7CisgICAgICAgICoodWludDMyX3QqKShwICsgNCszKnN0cmlkZSk9IHY7CisgICAgfWVsc2UgaWYodz09MTYpeworICAgICAgICAqKHVpbnQzMl90KikocCArIDArMCpzdHJpZGUpPSB2YWw7CisgICAgICAgICoodWludDMyX3QqKShwICsgNCswKnN0cmlkZSk9IHZhbDsKKyAgICAgICAgKih1aW50MzJfdCopKHAgKyA4KzAqc3RyaWRlKT0gdmFsOworICAgICAgICAqKHVpbnQzMl90KikocCArMTIrMCpzdHJpZGUpPSB2YWw7CisgICAgICAgICoodWludDMyX3QqKShwICsgMCsxKnN0cmlkZSk9IHZhbDsKKyAgICAgICAgKih1aW50MzJfdCopKHAgKyA0KzEqc3RyaWRlKT0gdmFsOworICAgICAgICAqKHVpbnQzMl90KikocCArIDgrMSpzdHJpZGUpPSB2YWw7CisgICAgICAgICoodWludDMyX3QqKShwICsxMisxKnN0cmlkZSk9IHZhbDsKKyAgICAgICAgaWYoaD09MikgcmV0dXJuOworICAgICAgICAqKHVpbnQzMl90KikocCArIDArMipzdHJpZGUpPSB2YWw7CisgICAgICAgICoodWludDMyX3QqKShwICsgNCsyKnN0cmlkZSk9IHZhbDsKKyAgICAgICAgKih1aW50MzJfdCopKHAgKyA4KzIqc3RyaWRlKT0gdmFsOworICAgICAgICAqKHVpbnQzMl90KikocCArMTIrMipzdHJpZGUpPSB2YWw7CisgICAgICAgICoodWludDMyX3QqKShwICsgMCszKnN0cmlkZSk9IHZhbDsKKyAgICAgICAgKih1aW50MzJfdCopKHAgKyA0KzMqc3RyaWRlKT0gdmFsOworICAgICAgICAqKHVpbnQzMl90KikocCArIDgrMypzdHJpZGUpPSB2YWw7CisgICAgICAgICoodWludDMyX3QqKShwICsxMiszKnN0cmlkZSk9IHZhbDsKKyNlbmRpZgorICAgIH1lbHNlCisgICAgICAgIGF2X2Fzc2VydDIoMCk7CisgICAgYXZfYXNzZXJ0MihoPT00KTsKK30KKworI2VuZGlmIC8qIEFWQ09ERUNfUkVDVEFOR0xFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JlbW92ZV9leHRyYWRhdGFfYnNmLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9yZW1vdmVfZXh0cmFkYXRhX2JzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODBiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yZW1vdmVfZXh0cmFkYXRhX2JzZi5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKworCitzdGF0aWMgaW50IHJlbW92ZV9leHRyYWRhdGEoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50IGtleWZyYW1lKXsKKyAgICBpbnQgY21kPSBhcmdzID8gKmFyZ3MgOiAwOworICAgIEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzOworCisgICAgaWYoIWJzZmMtPnBhcnNlcil7CisgICAgICAgIGJzZmMtPnBhcnNlcj0gYXZfcGFyc2VyX2luaXQoYXZjdHgtPmNvZGVjX2lkKTsKKyAgICB9CisgICAgcz0gYnNmYy0+cGFyc2VyOworCisgICAgaWYocyAmJiBzLT5wYXJzZXItPnNwbGl0KXsKKyAgICAgICAgaWYoICAoKChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpIHx8IChhdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfTE9DQUxfSEVBREVSKSkgJiYgY21kPT0nYScpCisgICAgICAgICAgIHx8KCFrZXlmcmFtZSAmJiBjbWQ9PSdrJykKKyAgICAgICAgICAgfHwoY21kPT0nZScgfHwgIWNtZCkKKyAgICAgICAgICApeworICAgICAgICAgICAgaW50IGk9IHMtPnBhcnNlci0+c3BsaXQoYXZjdHgsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICAgICAgYnVmICs9IGk7CisgICAgICAgICAgICBidWZfc2l6ZSAtPSBpOworICAgICAgICB9CisgICAgfQorICAgICpwb3V0YnVmPSAodWludDhfdCAqKSBidWY7CisgICAgKnBvdXRidWZfc2l6ZT0gYnVmX3NpemU7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZCaXRTdHJlYW1GaWx0ZXIgZmZfcmVtb3ZlX2V4dHJhZGF0YV9ic2Y9eworICAgIC5uYW1lICAgPSAicmVtb3ZlX2V4dHJhIiwKKyAgICAuZmlsdGVyID0gcmVtb3ZlX2V4dHJhZGF0YSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9yZXNhbXBsZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmVzYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDVhYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmVzYW1wbGUuYwpAQCAtMCwwICsxLDQ0MyBAQAorLyoKKyAqIHNhbXBsZXJhdGUgY29udmVyc2lvbiBmb3IgYm90aCBhdWRpbyBhbmQgdmlkZW8KKyAqIENvcHlyaWdodCAoYykgMjAwMCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogc2FtcGxlcmF0ZSBjb252ZXJzaW9uIGZvciBib3RoIGF1ZGlvIGFuZCB2aWRlbworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJhdWRpb2NvbnZlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKworI2lmIEZGX0FQSV9BVkNPREVDX1JFU0FNUExFCisKKyNkZWZpbmUgTUFYX0NIQU5ORUxTIDgKKworc3RydWN0IEFWUmVzYW1wbGVDb250ZXh0OworCitzdGF0aWMgY29uc3QgY2hhciAqY29udGV4dF90b19uYW1lKHZvaWQgKnB0cikKK3sKKyAgICByZXR1cm4gImF1ZGlvcmVzYW1wbGUiOworfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0ge3tOVUxMfX07CitzdGF0aWMgY29uc3QgQVZDbGFzcyBhdWRpb3Jlc2FtcGxlX2NvbnRleHRfY2xhc3MgPSB7CisgICAgIlJlU2FtcGxlQ29udGV4dCIsIGNvbnRleHRfdG9fbmFtZSwgb3B0aW9ucywgTElCQVZVVElMX1ZFUlNJT05fSU5UCit9OworCitzdHJ1Y3QgUmVTYW1wbGVDb250ZXh0IHsKKyAgICBzdHJ1Y3QgQVZSZXNhbXBsZUNvbnRleHQgKnJlc2FtcGxlX2NvbnRleHQ7CisgICAgc2hvcnQgKnRlbXBbTUFYX0NIQU5ORUxTXTsKKyAgICBpbnQgdGVtcF9sZW47CisgICAgZmxvYXQgcmF0aW87CisgICAgLyogY2hhbm5lbCBjb252ZXJ0ICovCisgICAgaW50IGlucHV0X2NoYW5uZWxzLCBvdXRwdXRfY2hhbm5lbHMsIGZpbHRlcl9jaGFubmVsczsKKyAgICBBVkF1ZGlvQ29udmVydCAqY29udmVydF9jdHhbMl07CisgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10WzJdOyAvLy88IGlucHV0IGFuZCBvdXRwdXQgc2FtcGxlIGZvcm1hdAorICAgIHVuc2lnbmVkIHNhbXBsZV9zaXplWzJdOyAgICAgICAgICAgLy8vPCBzaXplIG9mIG9uZSBzYW1wbGUgaW4gc2FtcGxlX2ZtdAorICAgIHNob3J0ICpidWZmZXJbMl07ICAgICAgICAgICAgICAgICAgLy8vPCBidWZmZXJzIHVzZWQgZm9yIGNvbnZlcnNpb24gdG8gUzE2CisgICAgdW5zaWduZWQgYnVmZmVyX3NpemVbMl07ICAgICAgICAgICAvLy88IHNpemVzIG9mIGFsbG9jYXRlZCBidWZmZXJzCit9OworCisvKiBuMTogbnVtYmVyIG9mIHNhbXBsZXMgKi8KK3N0YXRpYyB2b2lkIHN0ZXJlb190b19tb25vKHNob3J0ICpvdXRwdXQsIHNob3J0ICppbnB1dCwgaW50IG4xKQoreworICAgIHNob3J0ICpwLCAqcTsKKyAgICBpbnQgbiA9IG4xOworCisgICAgcCA9IGlucHV0OworICAgIHEgPSBvdXRwdXQ7CisgICAgd2hpbGUgKG4gPj0gNCkgeworICAgICAgICBxWzBdID0gKHBbMF0gKyBwWzFdKSA+PiAxOworICAgICAgICBxWzFdID0gKHBbMl0gKyBwWzNdKSA+PiAxOworICAgICAgICBxWzJdID0gKHBbNF0gKyBwWzVdKSA+PiAxOworICAgICAgICBxWzNdID0gKHBbNl0gKyBwWzddKSA+PiAxOworICAgICAgICBxICs9IDQ7CisgICAgICAgIHAgKz0gODsKKyAgICAgICAgbiAtPSA0OworICAgIH0KKyAgICB3aGlsZSAobiA+IDApIHsKKyAgICAgICAgcVswXSA9IChwWzBdICsgcFsxXSkgPj4gMTsKKyAgICAgICAgcSsrOworICAgICAgICBwICs9IDI7CisgICAgICAgIG4tLTsKKyAgICB9Cit9CisKKy8qIG4xOiBudW1iZXIgb2Ygc2FtcGxlcyAqLworc3RhdGljIHZvaWQgbW9ub190b19zdGVyZW8oc2hvcnQgKm91dHB1dCwgc2hvcnQgKmlucHV0LCBpbnQgbjEpCit7CisgICAgc2hvcnQgKnAsICpxOworICAgIGludCBuID0gbjE7CisgICAgaW50IHY7CisKKyAgICBwID0gaW5wdXQ7CisgICAgcSA9IG91dHB1dDsKKyAgICB3aGlsZSAobiA+PSA0KSB7CisgICAgICAgIHYgPSBwWzBdOyBxWzBdID0gdjsgcVsxXSA9IHY7CisgICAgICAgIHYgPSBwWzFdOyBxWzJdID0gdjsgcVszXSA9IHY7CisgICAgICAgIHYgPSBwWzJdOyBxWzRdID0gdjsgcVs1XSA9IHY7CisgICAgICAgIHYgPSBwWzNdOyBxWzZdID0gdjsgcVs3XSA9IHY7CisgICAgICAgIHEgKz0gODsKKyAgICAgICAgcCArPSA0OworICAgICAgICBuIC09IDQ7CisgICAgfQorICAgIHdoaWxlIChuID4gMCkgeworICAgICAgICB2ID0gcFswXTsgcVswXSA9IHY7IHFbMV0gPSB2OworICAgICAgICBxICs9IDI7CisgICAgICAgIHAgKz0gMTsKKyAgICAgICAgbi0tOworICAgIH0KK30KKworLyoKKzUuMSB0byBzdGVyZW8gaW5wdXQ6IFtmbCwgZnIsIGMsIGxmZSwgcmwsIHJyXQorLSBMZWZ0ID0gZnJvbnRfbGVmdCArIHJlYXJfZ2FpbiAqIHJlYXJfbGVmdCArIGNlbnRlcl9nYWluICogY2VudGVyCistIFJpZ2h0ID0gZnJvbnRfcmlnaHQgKyByZWFyX2dhaW4gKiByZWFyX3JpZ2h0ICsgY2VudGVyX2dhaW4gKiBjZW50ZXIKK1doZXJlIHJlYXJfZ2FpbiBpcyB1c3VhbGx5IGFyb3VuZCAwLjUtMS4wIGFuZAorICAgICAgY2VudGVyX2dhaW4gaXMgYWxtb3N0IGFsd2F5cyAwLjcgKC0zIGRCKQorKi8KK3N0YXRpYyB2b2lkIHN1cnJvdW5kX3RvX3N0ZXJlbyhzaG9ydCAqKm91dHB1dCwgc2hvcnQgKmlucHV0LCBpbnQgY2hhbm5lbHMsIGludCBzYW1wbGVzKQoreworICAgIGludCBpOworICAgIHNob3J0IGwsIHI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludCBmbCxmcixjLHJsLHJyOworICAgICAgICBmbCA9IGlucHV0WzBdOworICAgICAgICBmciA9IGlucHV0WzFdOworICAgICAgICBjID0gaW5wdXRbMl07CisgICAgICAgIC8vIGxmZSA9IGlucHV0WzNdOworICAgICAgICBybCA9IGlucHV0WzRdOworICAgICAgICByciA9IGlucHV0WzVdOworCisgICAgICAgIGwgPSBhdl9jbGlwX2ludDE2KGZsICsgKDAuNSAqIHJsKSArICgwLjcgKiBjKSk7CisgICAgICAgIHIgPSBhdl9jbGlwX2ludDE2KGZyICsgKDAuNSAqIHJyKSArICgwLjcgKiBjKSk7CisKKyAgICAgICAgLyogb3V0cHV0IGwgJiByLiAqLworICAgICAgICAqb3V0cHV0WzBdKysgPSBsOworICAgICAgICAqb3V0cHV0WzFdKysgPSByOworCisgICAgICAgIC8qIGluY3JlbWVudCBpbnB1dC4gKi8KKyAgICAgICAgaW5wdXQgKz0gY2hhbm5lbHM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWludGVybGVhdmUoc2hvcnQgKipvdXRwdXQsIHNob3J0ICppbnB1dCwgaW50IGNoYW5uZWxzLCBpbnQgc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAgICpvdXRwdXRbal0rKyA9ICppbnB1dCsrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpbnRlcmxlYXZlKHNob3J0ICpvdXRwdXQsIHNob3J0ICoqaW5wdXQsIGludCBjaGFubmVscywgaW50IHNhbXBsZXMpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICAqb3V0cHV0KysgPSAqaW5wdXRbal0rKzsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgYWMzXzVwMV9tdXgoc2hvcnQgKm91dHB1dCwgc2hvcnQgKmlucHV0MSwgc2hvcnQgKmlucHV0MiwgaW50IG4pCit7CisgICAgaW50IGk7CisgICAgc2hvcnQgbCwgcjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgbCA9ICppbnB1dDErKzsKKyAgICAgICAgciA9ICppbnB1dDIrKzsKKyAgICAgICAgKm91dHB1dCsrID0gbDsgICAgICAgICAgICAgICAgICAvKiBsZWZ0ICovCisgICAgICAgICpvdXRwdXQrKyA9IChsIC8gMikgKyAociAvIDIpOyAgLyogY2VudGVyICovCisgICAgICAgICpvdXRwdXQrKyA9IHI7ICAgICAgICAgICAgICAgICAgLyogcmlnaHQgKi8KKyAgICAgICAgKm91dHB1dCsrID0gMDsgICAgICAgICAgICAgICAgICAvKiBsZWZ0IHN1cnJvdW5kICovCisgICAgICAgICpvdXRwdXQrKyA9IDA7ICAgICAgICAgICAgICAgICAgLyogcmlnaHQgc3Vycm91ZCAqLworICAgICAgICAqb3V0cHV0KysgPSAwOyAgICAgICAgICAgICAgICAgIC8qIGxvdyBmcmVxICovCisgICAgfQorfQorCisjZGVmaW5lIFNVUFBPUlRfUkVTQU1QTEUoY2gxLCBjaDIsIGNoMywgY2g0LCBjaDUsIGNoNiwgY2g3LCBjaDgpIFwKKyAgICBjaDg8PDcgfCBjaDc8PDYgfCBjaDY8PDUgfCBjaDU8PDQgfCBjaDQ8PDMgfCBjaDM8PDIgfCBjaDI8PDEgfCBjaDE8PDAKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3VwcG9ydGVkX3Jlc2FtcGxpbmdbTUFYX0NIQU5ORUxTXSA9IHsKKyAgICAvLyBvdXRwdXQgY2g6ICAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDgKKyAgICBTVVBQT1JUX1JFU0FNUExFKDEsIDEsIDAsIDAsIDAsIDAsIDAsIDApLCAvLyAxIGlucHV0IGNoYW5uZWwKKyAgICBTVVBQT1JUX1JFU0FNUExFKDEsIDEsIDAsIDAsIDAsIDEsIDAsIDApLCAvLyAyIGlucHV0IGNoYW5uZWxzCisgICAgU1VQUE9SVF9SRVNBTVBMRSgwLCAwLCAxLCAwLCAwLCAwLCAwLCAwKSwgLy8gMyBpbnB1dCBjaGFubmVscworICAgIFNVUFBPUlRfUkVTQU1QTEUoMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCksIC8vIDQgaW5wdXQgY2hhbm5lbHMKKyAgICBTVVBQT1JUX1JFU0FNUExFKDAsIDAsIDAsIDAsIDEsIDAsIDAsIDApLCAvLyA1IGlucHV0IGNoYW5uZWxzCisgICAgU1VQUE9SVF9SRVNBTVBMRSgwLCAxLCAwLCAwLCAwLCAxLCAwLCAwKSwgLy8gNiBpbnB1dCBjaGFubmVscworICAgIFNVUFBPUlRfUkVTQU1QTEUoMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCksIC8vIDcgaW5wdXQgY2hhbm5lbHMKKyAgICBTVVBQT1JUX1JFU0FNUExFKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEpLCAvLyA4IGlucHV0IGNoYW5uZWxzCit9OworCitSZVNhbXBsZUNvbnRleHQgKmF2X2F1ZGlvX3Jlc2FtcGxlX2luaXQoaW50IG91dHB1dF9jaGFubmVscywgaW50IGlucHV0X2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRfcmF0ZSwgaW50IGlucHV0X3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10X291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbHRlcl9sZW5ndGgsIGludCBsb2cyX3BoYXNlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lYXIsIGRvdWJsZSBjdXRvZmYpCit7CisgICAgUmVTYW1wbGVDb250ZXh0ICpzOworCisgICAgaWYgKGlucHV0X2NoYW5uZWxzID4gTUFYX0NIQU5ORUxTKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiUmVzYW1wbGluZyB3aXRoIGlucHV0IGNoYW5uZWxzIGdyZWF0ZXIgdGhhbiAlZCBpcyB1bnN1cHBvcnRlZC5cbiIsCisgICAgICAgICAgICAgICBNQVhfQ0hBTk5FTFMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCEoc3VwcG9ydGVkX3Jlc2FtcGxpbmdbaW5wdXRfY2hhbm5lbHMtMV0gJiAoMTw8KG91dHB1dF9jaGFubmVscy0xKSkpKSB7CisgICAgICAgIGludCBpOworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgYXVkaW8gcmVzYW1wbGluZy4gQWxsb3dlZCAiCisgICAgICAgICAgICAgICAib3V0cHV0IGNoYW5uZWxzIGZvciAlZCBpbnB1dCBjaGFubmVsJXMiLCBpbnB1dF9jaGFubmVscywKKyAgICAgICAgICAgICAgIGlucHV0X2NoYW5uZWxzID4gMSA/ICJzOiIgOiAiOiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxTOyBpKyspCisgICAgICAgICAgICBpZiAoc3VwcG9ydGVkX3Jlc2FtcGxpbmdbaW5wdXRfY2hhbm5lbHMtMV0gJiAoMTw8aSkpCisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiAlZCIsIGkgKyAxKTsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHMgPSBhdl9tYWxsb2N6KHNpemVvZihSZVNhbXBsZUNvbnRleHQpKTsKKyAgICBpZiAoIXMpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzYW1wbGUgY29udGV4dC5cbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzLT5yYXRpbyA9IChmbG9hdClvdXRwdXRfcmF0ZSAvIChmbG9hdClpbnB1dF9yYXRlOworCisgICAgcy0+aW5wdXRfY2hhbm5lbHMgPSBpbnB1dF9jaGFubmVsczsKKyAgICBzLT5vdXRwdXRfY2hhbm5lbHMgPSBvdXRwdXRfY2hhbm5lbHM7CisKKyAgICBzLT5maWx0ZXJfY2hhbm5lbHMgPSBzLT5pbnB1dF9jaGFubmVsczsKKyAgICBpZiAocy0+b3V0cHV0X2NoYW5uZWxzIDwgcy0+ZmlsdGVyX2NoYW5uZWxzKQorICAgICAgICBzLT5maWx0ZXJfY2hhbm5lbHMgPSBzLT5vdXRwdXRfY2hhbm5lbHM7CisKKyAgICBzLT5zYW1wbGVfZm10WzBdICA9IHNhbXBsZV9mbXRfaW47CisgICAgcy0+c2FtcGxlX2ZtdFsxXSAgPSBzYW1wbGVfZm10X291dDsKKyAgICBzLT5zYW1wbGVfc2l6ZVswXSA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKHMtPnNhbXBsZV9mbXRbMF0pOworICAgIHMtPnNhbXBsZV9zaXplWzFdID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUocy0+c2FtcGxlX2ZtdFsxXSk7CisKKyAgICBpZiAocy0+c2FtcGxlX2ZtdFswXSAhPSBBVl9TQU1QTEVfRk1UX1MxNikgeworICAgICAgICBpZiAoIShzLT5jb252ZXJ0X2N0eFswXSA9IGF2X2F1ZGlvX2NvbnZlcnRfYWxsb2MoQVZfU0FNUExFX0ZNVF9TMTYsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYW1wbGVfZm10WzBdLCAxLCBOVUxMLCAwKSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjb252ZXJ0ICVzIHNhbXBsZSBmb3JtYXQgdG8gczE2IHNhbXBsZSBmb3JtYXRcbiIsCisgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShzLT5zYW1wbGVfZm10WzBdKSk7CisgICAgICAgICAgICBhdl9mcmVlKHMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+c2FtcGxlX2ZtdFsxXSAhPSBBVl9TQU1QTEVfRk1UX1MxNikgeworICAgICAgICBpZiAoIShzLT5jb252ZXJ0X2N0eFsxXSA9IGF2X2F1ZGlvX2NvbnZlcnRfYWxsb2Mocy0+c2FtcGxlX2ZtdFsxXSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzE2LCAxLCBOVUxMLCAwKSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjb252ZXJ0IHMxNiBzYW1wbGUgZm9ybWF0IHRvICVzIHNhbXBsZSBmb3JtYXRcbiIsCisgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShzLT5zYW1wbGVfZm10WzFdKSk7CisgICAgICAgICAgICBhdl9hdWRpb19jb252ZXJ0X2ZyZWUocy0+Y29udmVydF9jdHhbMF0pOworICAgICAgICAgICAgYXZfZnJlZShzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+cmVzYW1wbGVfY29udGV4dCA9IGF2X3Jlc2FtcGxlX2luaXQob3V0cHV0X3JhdGUsIGlucHV0X3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2xlbmd0aCwgbG9nMl9waGFzZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lYXIsIGN1dG9mZik7CisKKyAgICAqKGNvbnN0IEFWQ2xhc3MqKilzLT5yZXNhbXBsZV9jb250ZXh0ID0gJmF1ZGlvcmVzYW1wbGVfY29udGV4dF9jbGFzczsKKworICAgIHJldHVybiBzOworfQorCisvKiByZXNhbXBsZSBhdWRpby4gJ25iX3NhbXBsZXMnIGlzIHRoZSBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworLyogWFhYOiBvcHRpbWl6ZSBpdCAhICovCitpbnQgYXVkaW9fcmVzYW1wbGUoUmVTYW1wbGVDb250ZXh0ICpzLCBzaG9ydCAqb3V0cHV0LCBzaG9ydCAqaW5wdXQsIGludCBuYl9zYW1wbGVzKQoreworICAgIGludCBpLCBuYl9zYW1wbGVzMTsKKyAgICBzaG9ydCAqYnVmaW5bTUFYX0NIQU5ORUxTXTsKKyAgICBzaG9ydCAqYnVmb3V0W01BWF9DSEFOTkVMU107CisgICAgc2hvcnQgKmJ1ZnRtcDJbTUFYX0NIQU5ORUxTXSwgKmJ1ZnRtcDNbTUFYX0NIQU5ORUxTXTsKKyAgICBzaG9ydCAqb3V0cHV0X2JhayA9IE5VTEw7CisgICAgaW50IGxlbm91dDsKKworICAgIGlmIChzLT5pbnB1dF9jaGFubmVscyA9PSBzLT5vdXRwdXRfY2hhbm5lbHMgJiYgcy0+cmF0aW8gPT0gMS4wICYmIDApIHsKKyAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICAgICBtZW1jcHkob3V0cHV0LCBpbnB1dCwgbmJfc2FtcGxlcyAqIHMtPmlucHV0X2NoYW5uZWxzICogc2l6ZW9mKHNob3J0KSk7CisgICAgICAgIHJldHVybiBuYl9zYW1wbGVzOworICAgIH0KKworICAgIGlmIChzLT5zYW1wbGVfZm10WzBdICE9IEFWX1NBTVBMRV9GTVRfUzE2KSB7CisgICAgICAgIGludCBpc3RyaWRlWzFdID0geyBzLT5zYW1wbGVfc2l6ZVswXSB9OworICAgICAgICBpbnQgb3N0cmlkZVsxXSA9IHsgMiB9OworICAgICAgICBjb25zdCB2b2lkICppYnVmWzFdID0geyBpbnB1dCB9OworICAgICAgICB2b2lkICAgICAgICpvYnVmWzFdOworICAgICAgICB1bnNpZ25lZCBpbnB1dF9zaXplID0gbmJfc2FtcGxlcyAqIHMtPmlucHV0X2NoYW5uZWxzICogMjsKKworICAgICAgICBpZiAoIXMtPmJ1ZmZlcl9zaXplWzBdIHx8IHMtPmJ1ZmZlcl9zaXplWzBdIDwgaW5wdXRfc2l6ZSkgeworICAgICAgICAgICAgYXZfZnJlZShzLT5idWZmZXJbMF0pOworICAgICAgICAgICAgcy0+YnVmZmVyX3NpemVbMF0gPSBpbnB1dF9zaXplOworICAgICAgICAgICAgcy0+YnVmZmVyWzBdID0gYXZfbWFsbG9jKHMtPmJ1ZmZlcl9zaXplWzBdKTsKKyAgICAgICAgICAgIGlmICghcy0+YnVmZmVyWzBdKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPnJlc2FtcGxlX2NvbnRleHQsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb2J1ZlswXSA9IHMtPmJ1ZmZlclswXTsKKworICAgICAgICBpZiAoYXZfYXVkaW9fY29udmVydChzLT5jb252ZXJ0X2N0eFswXSwgb2J1Ziwgb3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWJ1ZiwgaXN0cmlkZSwgbmJfc2FtcGxlcyAqIHMtPmlucHV0X2NoYW5uZWxzKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5yZXNhbXBsZV9jb250ZXh0LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkF1ZGlvIHNhbXBsZSBmb3JtYXQgY29udmVyc2lvbiBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpbnB1dCA9IHMtPmJ1ZmZlclswXTsKKyAgICB9CisKKyAgICBsZW5vdXQ9IDIqcy0+b3V0cHV0X2NoYW5uZWxzKm5iX3NhbXBsZXMgKiBzLT5yYXRpbyArIDE2OworCisgICAgaWYgKHMtPnNhbXBsZV9mbXRbMV0gIT0gQVZfU0FNUExFX0ZNVF9TMTYpIHsKKyAgICAgICAgaW50IG91dF9zaXplID0gbGVub3V0ICogYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUocy0+c2FtcGxlX2ZtdFsxXSkgKgorICAgICAgICAgICAgICAgICAgICAgICBzLT5vdXRwdXRfY2hhbm5lbHM7CisgICAgICAgIG91dHB1dF9iYWsgPSBvdXRwdXQ7CisKKyAgICAgICAgaWYgKCFzLT5idWZmZXJfc2l6ZVsxXSB8fCBzLT5idWZmZXJfc2l6ZVsxXSA8IG91dF9zaXplKSB7CisgICAgICAgICAgICBhdl9mcmVlKHMtPmJ1ZmZlclsxXSk7CisgICAgICAgICAgICBzLT5idWZmZXJfc2l6ZVsxXSA9IG91dF9zaXplOworICAgICAgICAgICAgcy0+YnVmZmVyWzFdID0gYXZfbWFsbG9jKHMtPmJ1ZmZlcl9zaXplWzFdKTsKKyAgICAgICAgICAgIGlmICghcy0+YnVmZmVyWzFdKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPnJlc2FtcGxlX2NvbnRleHQsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0cHV0ID0gcy0+YnVmZmVyWzFdOworICAgIH0KKworICAgIC8qIFhYWDogbW92ZSB0aG9zZSBtYWxsb2MgdG8gcmVzYW1wbGUgaW5pdCBjb2RlICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmZpbHRlcl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGJ1ZmluW2ldID0gYXZfbWFsbG9jX2FycmF5KChuYl9zYW1wbGVzICsgcy0+dGVtcF9sZW4pLCBzaXplb2Yoc2hvcnQpKTsKKyAgICAgICAgYnVmb3V0W2ldID0gYXZfbWFsbG9jX2FycmF5KGxlbm91dCwgc2l6ZW9mKHNob3J0KSk7CisKKyAgICAgICAgaWYgKCFidWZpbltpXSB8fCAhYnVmb3V0W2ldKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+cmVzYW1wbGVfY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlclxuIik7CisgICAgICAgICAgICBuYl9zYW1wbGVzMSA9IDA7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoYnVmaW5baV0sIHMtPnRlbXBbaV0sIHMtPnRlbXBfbGVuICogc2l6ZW9mKHNob3J0KSk7CisgICAgICAgIGJ1ZnRtcDJbaV0gPSBidWZpbltpXSArIHMtPnRlbXBfbGVuOworICAgIH0KKworICAgIGlmIChzLT5pbnB1dF9jaGFubmVscyA9PSAyICYmIHMtPm91dHB1dF9jaGFubmVscyA9PSAxKSB7CisgICAgICAgIGJ1ZnRtcDNbMF0gPSBvdXRwdXQ7CisgICAgICAgIHN0ZXJlb190b19tb25vKGJ1ZnRtcDJbMF0sIGlucHV0LCBuYl9zYW1wbGVzKTsKKyAgICB9IGVsc2UgaWYgKHMtPm91dHB1dF9jaGFubmVscyA+PSAyICYmIHMtPmlucHV0X2NoYW5uZWxzID09IDEpIHsKKyAgICAgICAgYnVmdG1wM1swXSA9IGJ1Zm91dFswXTsKKyAgICAgICAgbWVtY3B5KGJ1ZnRtcDJbMF0sIGlucHV0LCBuYl9zYW1wbGVzICogc2l6ZW9mKHNob3J0KSk7CisgICAgfSBlbHNlIGlmIChzLT5pbnB1dF9jaGFubmVscyA9PSA2ICYmIHMtPm91dHB1dF9jaGFubmVscyA9PTIpIHsKKyAgICAgICAgYnVmdG1wM1swXSA9IGJ1Zm91dFswXTsKKyAgICAgICAgYnVmdG1wM1sxXSA9IGJ1Zm91dFsxXTsKKyAgICAgICAgc3Vycm91bmRfdG9fc3RlcmVvKGJ1ZnRtcDIsIGlucHV0LCBzLT5pbnB1dF9jaGFubmVscywgbmJfc2FtcGxlcyk7CisgICAgfSBlbHNlIGlmIChzLT5vdXRwdXRfY2hhbm5lbHMgPj0gcy0+aW5wdXRfY2hhbm5lbHMgJiYgcy0+aW5wdXRfY2hhbm5lbHMgPj0gMikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+aW5wdXRfY2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgYnVmdG1wM1tpXSA9IGJ1Zm91dFtpXTsKKyAgICAgICAgfQorICAgICAgICBkZWludGVybGVhdmUoYnVmdG1wMiwgaW5wdXQsIHMtPmlucHV0X2NoYW5uZWxzLCBuYl9zYW1wbGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBidWZ0bXAzWzBdID0gb3V0cHV0OworICAgICAgICBtZW1jcHkoYnVmdG1wMlswXSwgaW5wdXQsIG5iX3NhbXBsZXMgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICB9CisKKyAgICBuYl9zYW1wbGVzICs9IHMtPnRlbXBfbGVuOworCisgICAgLyogcmVzYW1wbGUgZWFjaCBjaGFubmVsICovCisgICAgbmJfc2FtcGxlczEgPSAwOyAvKiBhdm9pZCB3YXJuaW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmZpbHRlcl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGludCBjb25zdW1lZDsKKyAgICAgICAgaW50IGlzX2xhc3QgPSBpICsgMSA9PSBzLT5maWx0ZXJfY2hhbm5lbHM7CisKKyAgICAgICAgbmJfc2FtcGxlczEgPSBhdl9yZXNhbXBsZShzLT5yZXNhbXBsZV9jb250ZXh0LCBidWZ0bXAzW2ldLCBidWZpbltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uc3VtZWQsIG5iX3NhbXBsZXMsIGxlbm91dCwgaXNfbGFzdCk7CisgICAgICAgIHMtPnRlbXBfbGVuID0gbmJfc2FtcGxlcyAtIGNvbnN1bWVkOworICAgICAgICBzLT50ZW1wW2ldID0gYXZfcmVhbGxvY19hcnJheShzLT50ZW1wW2ldLCBzLT50ZW1wX2xlbiwgc2l6ZW9mKHNob3J0KSk7CisgICAgICAgIG1lbWNweShzLT50ZW1wW2ldLCBidWZpbltpXSArIGNvbnN1bWVkLCBzLT50ZW1wX2xlbiAqIHNpemVvZihzaG9ydCkpOworICAgIH0KKworICAgIGlmIChzLT5vdXRwdXRfY2hhbm5lbHMgPT0gMiAmJiBzLT5pbnB1dF9jaGFubmVscyA9PSAxKSB7CisgICAgICAgIG1vbm9fdG9fc3RlcmVvKG91dHB1dCwgYnVmdG1wM1swXSwgbmJfc2FtcGxlczEpOworICAgIH0gZWxzZSBpZiAocy0+b3V0cHV0X2NoYW5uZWxzID09IDYgJiYgcy0+aW5wdXRfY2hhbm5lbHMgPT0gMikgeworICAgICAgICBhYzNfNXAxX211eChvdXRwdXQsIGJ1ZnRtcDNbMF0sIGJ1ZnRtcDNbMV0sIG5iX3NhbXBsZXMxKTsKKyAgICB9IGVsc2UgaWYgKChzLT5vdXRwdXRfY2hhbm5lbHMgPT0gcy0+aW5wdXRfY2hhbm5lbHMgJiYgcy0+aW5wdXRfY2hhbm5lbHMgPj0gMikgfHwKKyAgICAgICAgICAgICAgIChzLT5vdXRwdXRfY2hhbm5lbHMgPT0gMiAmJiBzLT5pbnB1dF9jaGFubmVscyA9PSA2KSkgeworICAgICAgICBpbnRlcmxlYXZlKG91dHB1dCwgYnVmdG1wMywgcy0+b3V0cHV0X2NoYW5uZWxzLCBuYl9zYW1wbGVzMSk7CisgICAgfQorCisgICAgaWYgKHMtPnNhbXBsZV9mbXRbMV0gIT0gQVZfU0FNUExFX0ZNVF9TMTYpIHsKKyAgICAgICAgaW50IGlzdHJpZGVbMV0gPSB7IDIgfTsKKyAgICAgICAgaW50IG9zdHJpZGVbMV0gPSB7IHMtPnNhbXBsZV9zaXplWzFdIH07CisgICAgICAgIGNvbnN0IHZvaWQgKmlidWZbMV0gPSB7IG91dHB1dCB9OworICAgICAgICB2b2lkICAgICAgICpvYnVmWzFdID0geyBvdXRwdXRfYmFrIH07CisKKyAgICAgICAgaWYgKGF2X2F1ZGlvX2NvbnZlcnQocy0+Y29udmVydF9jdHhbMV0sIG9idWYsIG9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlidWYsIGlzdHJpZGUsIG5iX3NhbXBsZXMxICogcy0+b3V0cHV0X2NoYW5uZWxzKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5yZXNhbXBsZV9jb250ZXh0LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkF1ZGlvIHNhbXBsZSBmb3JtYXQgY29udmVyc2lvbiBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKK2ZhaWw6CisgICAgZm9yIChpID0gMDsgaSA8IHMtPmZpbHRlcl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWUoYnVmaW5baV0pOworICAgICAgICBhdl9mcmVlKGJ1Zm91dFtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIG5iX3NhbXBsZXMxOworfQorCit2b2lkIGF1ZGlvX3Jlc2FtcGxlX2Nsb3NlKFJlU2FtcGxlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBhdl9yZXNhbXBsZV9jbG9zZShzLT5yZXNhbXBsZV9jb250ZXh0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZmlsdGVyX2NoYW5uZWxzOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZzLT50ZW1wW2ldKTsKKyAgICBhdl9mcmVlcCgmcy0+YnVmZmVyWzBdKTsKKyAgICBhdl9mcmVlcCgmcy0+YnVmZmVyWzFdKTsKKyAgICBhdl9hdWRpb19jb252ZXJ0X2ZyZWUocy0+Y29udmVydF9jdHhbMF0pOworICAgIGF2X2F1ZGlvX2NvbnZlcnRfZnJlZShzLT5jb252ZXJ0X2N0eFsxXSk7CisgICAgYXZfZnJlZShzKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9yZXNhbXBsZTIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Jlc2FtcGxlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOWZlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yZXNhbXBsZTIuYwpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIGF1ZGlvIHJlc2FtcGxpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBhdWRpbyByZXNhbXBsaW5nCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKyNpZiBGRl9BUElfQVZDT0RFQ19SRVNBTVBMRQorCisjaWZuZGVmIENPTkZJR19SRVNBTVBMRV9IUAorI2RlZmluZSBGSUxURVJfU0hJRlQgMTUKKworI2RlZmluZSBGRUxFTSBpbnQxNl90CisjZGVmaW5lIEZFTEVNMiBpbnQzMl90CisjZGVmaW5lIEZFTEVNTCBpbnQ2NF90CisjZGVmaW5lIEZFTEVNX01BWCBJTlQxNl9NQVgKKyNkZWZpbmUgRkVMRU1fTUlOIElOVDE2X01JTgorI2RlZmluZSBXSU5ET1dfVFlQRSA5CisjZWxpZiAhZGVmaW5lZChDT05GSUdfUkVTQU1QTEVfQVVESU9QSElMRV9LSUREWV9NT0RFKQorI2RlZmluZSBGSUxURVJfU0hJRlQgMzAKKworI2RlZmluZSBGRUxFTSBpbnQzMl90CisjZGVmaW5lIEZFTEVNMiBpbnQ2NF90CisjZGVmaW5lIEZFTEVNTCBpbnQ2NF90CisjZGVmaW5lIEZFTEVNX01BWCBJTlQzMl9NQVgKKyNkZWZpbmUgRkVMRU1fTUlOIElOVDMyX01JTgorI2RlZmluZSBXSU5ET1dfVFlQRSAxMgorI2Vsc2UKKyNkZWZpbmUgRklMVEVSX1NISUZUIDAKKworI2RlZmluZSBGRUxFTSBkb3VibGUKKyNkZWZpbmUgRkVMRU0yIGRvdWJsZQorI2RlZmluZSBGRUxFTUwgZG91YmxlCisjZGVmaW5lIFdJTkRPV19UWVBFIDI0CisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBBVlJlc2FtcGxlQ29udGV4dHsKKyAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKKyAgICBGRUxFTSAqZmlsdGVyX2Jhbms7CisgICAgaW50IGZpbHRlcl9sZW5ndGg7CisgICAgaW50IGlkZWFsX2RzdF9pbmNyOworICAgIGludCBkc3RfaW5jcjsKKyAgICBpbnQgaW5kZXg7CisgICAgaW50IGZyYWM7CisgICAgaW50IHNyY19pbmNyOworICAgIGludCBjb21wZW5zYXRpb25fZGlzdGFuY2U7CisgICAgaW50IHBoYXNlX3NoaWZ0OworICAgIGludCBwaGFzZV9tYXNrOworICAgIGludCBsaW5lYXI7Cit9QVZSZXNhbXBsZUNvbnRleHQ7CisKKy8qKgorICogMHRoIG9yZGVyIG1vZGlmaWVkIGJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAqLworc3RhdGljIGRvdWJsZSBiZXNzZWwoZG91YmxlIHgpeworICAgIGRvdWJsZSB2PTE7CisgICAgZG91YmxlIGxhc3R2PTA7CisgICAgZG91YmxlIHQ9MTsKKyAgICBpbnQgaTsKKworICAgIHg9IHgqeC80OworICAgIGZvcihpPTE7IHYgIT0gbGFzdHY7IGkrKyl7CisgICAgICAgIGxhc3R2PXY7CisgICAgICAgIHQgKj0geC8oaSppKTsKKyAgICAgICAgdiArPSB0OworICAgIH0KKyAgICByZXR1cm4gdjsKK30KKworLyoqCisgKiBCdWlsZCBhIHBvbHlwaGFzZSBmaWx0ZXJiYW5rLgorICogQHBhcmFtIGZhY3RvciByZXNhbXBsaW5nIGZhY3RvcgorICogQHBhcmFtIHNjYWxlIHdhbnRlZCBzdW0gb2YgY29lZmZpY2llbnRzIGZvciBlYWNoIGZpbHRlcgorICogQHBhcmFtIHR5cGUgMC0+Y3ViaWMsIDEtPmJsYWNrbWFuIG51dHRhbGwgd2luZG93ZWQgc2luYywgMi4uMTYtPmthaXNlciB3aW5kb3dlZCBzaW5jIGJldGE9Mi4uMTYKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IGJ1aWxkX2ZpbHRlcihGRUxFTSAqZmlsdGVyLCBkb3VibGUgZmFjdG9yLCBpbnQgdGFwX2NvdW50LCBpbnQgcGhhc2VfY291bnQsIGludCBzY2FsZSwgaW50IHR5cGUpeworICAgIGludCBwaCwgaTsKKyAgICBkb3VibGUgeCwgeSwgdzsKKyAgICBkb3VibGUgKnRhYiA9IGF2X21hbGxvY19hcnJheSh0YXBfY291bnQsIHNpemVvZigqdGFiKSk7CisgICAgY29uc3QgaW50IGNlbnRlcj0gKHRhcF9jb3VudC0xKS8yOworCisgICAgaWYgKCF0YWIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBpZiB1cHNhbXBsaW5nLCBvbmx5IG5lZWQgdG8gaW50ZXJwb2xhdGUsIG5vIGZpbHRlciAqLworICAgIGlmIChmYWN0b3IgPiAxLjApCisgICAgICAgIGZhY3RvciA9IDEuMDsKKworICAgIGZvcihwaD0wO3BoPHBoYXNlX2NvdW50O3BoKyspIHsKKyAgICAgICAgZG91YmxlIG5vcm0gPSAwOworICAgICAgICBmb3IoaT0wO2k8dGFwX2NvdW50O2krKykgeworICAgICAgICAgICAgeCA9IE1fUEkgKiAoKGRvdWJsZSkoaSAtIGNlbnRlcikgLSAoZG91YmxlKXBoIC8gcGhhc2VfY291bnQpICogZmFjdG9yOworICAgICAgICAgICAgaWYgKHggPT0gMCkgeSA9IDEuMDsKKyAgICAgICAgICAgIGVsc2UgICAgICAgIHkgPSBzaW4oeCkgLyB4OworICAgICAgICAgICAgc3dpdGNoKHR5cGUpeworICAgICAgICAgICAgY2FzZSAwOnsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBkPSAtMC41OyAvL2ZpcnN0IG9yZGVyIGRlcml2YXRpdmUgPSAtMC41CisgICAgICAgICAgICAgICAgeCA9IGZhYnMoKChkb3VibGUpKGkgLSBjZW50ZXIpIC0gKGRvdWJsZSlwaCAvIHBoYXNlX2NvdW50KSAqIGZhY3Rvcik7CisgICAgICAgICAgICAgICAgaWYoeDwxLjApIHk9IDEgLSAzKngqeCArIDIqeCp4KnggKyBkKiggICAgICAgICAgICAteCp4ICsgeCp4KngpOworICAgICAgICAgICAgICAgIGVsc2UgICAgICB5PSAgICAgICAgICAgICAgICAgICAgICAgZCooLTQgKyA4KnggLSA1KngqeCArIHgqeCp4KTsKKyAgICAgICAgICAgICAgICBicmVhazt9CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgdyA9IDIuMCp4IC8gKGZhY3Rvcip0YXBfY291bnQpICsgTV9QSTsKKyAgICAgICAgICAgICAgICB5ICo9IDAuMzYzNTgxOSAtIDAuNDg5MTc3NSAqIGNvcyh3KSArIDAuMTM2NTk5NSAqIGNvcygyKncpIC0gMC4wMTA2NDExICogY29zKDMqdyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHcgPSAyLjAqeCAvIChmYWN0b3IqdGFwX2NvdW50Kk1fUEkpOworICAgICAgICAgICAgICAgIHkgKj0gYmVzc2VsKHR5cGUqc3FydChGRk1BWCgxLXcqdywgMCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFiW2ldID0geTsKKyAgICAgICAgICAgIG5vcm0gKz0geTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5vcm1hbGl6ZSBzbyB0aGF0IGFuIHVuaWZvcm0gY29sb3IgcmVtYWlucyB0aGUgc2FtZSAqLworICAgICAgICBmb3IoaT0wO2k8dGFwX2NvdW50O2krKykgeworI2lmZGVmIENPTkZJR19SRVNBTVBMRV9BVURJT1BISUxFX0tJRERZX01PREUKKyAgICAgICAgICAgIGZpbHRlcltwaCAqIHRhcF9jb3VudCArIGldID0gdGFiW2ldIC8gbm9ybTsKKyNlbHNlCisgICAgICAgICAgICBmaWx0ZXJbcGggKiB0YXBfY291bnQgKyBpXSA9IGF2X2NsaXAobHJpbnRmKHRhYltpXSAqIHNjYWxlIC8gbm9ybSksIEZFTEVNX01JTiwgRkVMRU1fTUFYKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorI2lmIDAKKyAgICB7CisjZGVmaW5lIExFTiAxMDI0CisgICAgICAgIGludCBqLGs7CisgICAgICAgIGRvdWJsZSBzaW5lW0xFTiArIHRhcF9jb3VudF07CisgICAgICAgIGRvdWJsZSBmaWx0ZXJlZFtMRU5dOworICAgICAgICBkb3VibGUgbWF4ZmY9LTIsIG1pbmZmPTIsIG1heHNmPS0yLCBtaW5zZj0yOworICAgICAgICBmb3IoaT0wOyBpPExFTjsgaSsrKXsKKyAgICAgICAgICAgIGRvdWJsZSBzcz0wLCBzZj0wLCBmZj0wOworICAgICAgICAgICAgZm9yKGo9MDsgajxMRU4rdGFwX2NvdW50OyBqKyspCisgICAgICAgICAgICAgICAgc2luZVtqXT0gY29zKGkqaipNX1BJL0xFTik7CisgICAgICAgICAgICBmb3Ioaj0wOyBqPExFTjsgaisrKXsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3VtPTA7CisgICAgICAgICAgICAgICAgcGg9MDsKKyAgICAgICAgICAgICAgICBmb3Ioaz0wOyBrPHRhcF9jb3VudDsgaysrKQorICAgICAgICAgICAgICAgICAgICBzdW0gKz0gZmlsdGVyW3BoICogdGFwX2NvdW50ICsga10gKiBzaW5lW2sral07CisgICAgICAgICAgICAgICAgZmlsdGVyZWRbal09IHN1bSAvICgxPDxGSUxURVJfU0hJRlQpOworICAgICAgICAgICAgICAgIHNzKz0gc2luZVtqICsgY2VudGVyXSAqIHNpbmVbaiArIGNlbnRlcl07CisgICAgICAgICAgICAgICAgZmYrPSBmaWx0ZXJlZFtqXSAqIGZpbHRlcmVkW2pdOworICAgICAgICAgICAgICAgIHNmKz0gc2luZVtqICsgY2VudGVyXSAqIGZpbHRlcmVkW2pdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3M9IHNxcnQoMipzcy9MRU4pOworICAgICAgICAgICAgZmY9IHNxcnQoMipmZi9MRU4pOworICAgICAgICAgICAgc2Y9IDIqc2YvTEVOOworICAgICAgICAgICAgbWF4ZmY9IEZGTUFYKG1heGZmLCBmZik7CisgICAgICAgICAgICBtaW5mZj0gRkZNSU4obWluZmYsIGZmKTsKKyAgICAgICAgICAgIG1heHNmPSBGRk1BWChtYXhzZiwgc2YpOworICAgICAgICAgICAgbWluc2Y9IEZGTUlOKG1pbnNmLCBzZik7CisgICAgICAgICAgICBpZihpJTExPT0wKXsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiaTolNGQgc3M6JWYgZmY6JTEzLjZlLSUxMy42ZSBzZjolMTMuNmUtJTEzLjZlXG4iLCBpLCBzcywgbWF4ZmYsIG1pbmZmLCBtYXhzZiwgbWluc2YpOworICAgICAgICAgICAgICAgIG1pbmZmPW1pbnNmPSAyOworICAgICAgICAgICAgICAgIG1heGZmPW1heHNmPSAtMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgYXZfZnJlZSh0YWIpOworICAgIHJldHVybiAwOworfQorCitBVlJlc2FtcGxlQ29udGV4dCAqYXZfcmVzYW1wbGVfaW5pdChpbnQgb3V0X3JhdGUsIGludCBpbl9yYXRlLCBpbnQgZmlsdGVyX3NpemUsIGludCBwaGFzZV9zaGlmdCwgaW50IGxpbmVhciwgZG91YmxlIGN1dG9mZil7CisgICAgQVZSZXNhbXBsZUNvbnRleHQgKmM9IGF2X21hbGxvY3ooc2l6ZW9mKEFWUmVzYW1wbGVDb250ZXh0KSk7CisgICAgZG91YmxlIGZhY3Rvcj0gRkZNSU4ob3V0X3JhdGUgKiBjdXRvZmYgLyBpbl9yYXRlLCAxLjApOworICAgIGludCBwaGFzZV9jb3VudD0gMTw8cGhhc2Vfc2hpZnQ7CisKKyAgICBpZiAoIWMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYy0+cGhhc2Vfc2hpZnQ9IHBoYXNlX3NoaWZ0OworICAgIGMtPnBoYXNlX21hc2s9IHBoYXNlX2NvdW50LTE7CisgICAgYy0+bGluZWFyPSBsaW5lYXI7CisKKyAgICBjLT5maWx0ZXJfbGVuZ3RoPSBGRk1BWCgoaW50KWNlaWwoZmlsdGVyX3NpemUvZmFjdG9yKSwgMSk7CisgICAgYy0+ZmlsdGVyX2Jhbms9IGF2X21hbGxvY3pfYXJyYXkoYy0+ZmlsdGVyX2xlbmd0aCwgKHBoYXNlX2NvdW50KzEpKnNpemVvZihGRUxFTSkpOworICAgIGlmICghYy0+ZmlsdGVyX2JhbmspCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKGJ1aWxkX2ZpbHRlcihjLT5maWx0ZXJfYmFuaywgZmFjdG9yLCBjLT5maWx0ZXJfbGVuZ3RoLCBwaGFzZV9jb3VudCwgMTw8RklMVEVSX1NISUZULCBXSU5ET1dfVFlQRSkpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgbWVtY3B5KCZjLT5maWx0ZXJfYmFua1tjLT5maWx0ZXJfbGVuZ3RoKnBoYXNlX2NvdW50KzFdLCBjLT5maWx0ZXJfYmFuaywgKGMtPmZpbHRlcl9sZW5ndGgtMSkqc2l6ZW9mKEZFTEVNKSk7CisgICAgYy0+ZmlsdGVyX2JhbmtbYy0+ZmlsdGVyX2xlbmd0aCpwaGFzZV9jb3VudF09IGMtPmZpbHRlcl9iYW5rW2MtPmZpbHRlcl9sZW5ndGggLSAxXTsKKworICAgIGlmKCFhdl9yZWR1Y2UoJmMtPnNyY19pbmNyLCAmYy0+ZHN0X2luY3IsIG91dF9yYXRlLCBpbl9yYXRlICogKGludDY0X3QpcGhhc2VfY291bnQsIElOVDMyX01BWC8yKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBjLT5pZGVhbF9kc3RfaW5jcj0gYy0+ZHN0X2luY3I7CisKKyAgICBjLT5pbmRleD0gLXBoYXNlX2NvdW50KigoYy0+ZmlsdGVyX2xlbmd0aC0xKS8yKTsKKworICAgIHJldHVybiBjOworZXJyb3I6CisgICAgYXZfZnJlZShjLT5maWx0ZXJfYmFuayk7CisgICAgYXZfZnJlZShjKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBhdl9yZXNhbXBsZV9jbG9zZShBVlJlc2FtcGxlQ29udGV4dCAqYyl7CisgICAgYXZfZnJlZXAoJmMtPmZpbHRlcl9iYW5rKTsKKyAgICBhdl9mcmVlcCgmYyk7Cit9CisKK3ZvaWQgYXZfcmVzYW1wbGVfY29tcGVuc2F0ZShBVlJlc2FtcGxlQ29udGV4dCAqYywgaW50IHNhbXBsZV9kZWx0YSwgaW50IGNvbXBlbnNhdGlvbl9kaXN0YW5jZSl7CisvLyAgICBzYW1wbGVfZGVsdGEgKz0gKGMtPmlkZWFsX2RzdF9pbmNyIC0gYy0+ZHN0X2luY3IpKihpbnQ2NF90KWMtPmNvbXBlbnNhdGlvbl9kaXN0YW5jZSAvIGMtPmlkZWFsX2RzdF9pbmNyOworICAgIGMtPmNvbXBlbnNhdGlvbl9kaXN0YW5jZT0gY29tcGVuc2F0aW9uX2Rpc3RhbmNlOworICAgIGMtPmRzdF9pbmNyID0gYy0+aWRlYWxfZHN0X2luY3IgLSBjLT5pZGVhbF9kc3RfaW5jciAqIChpbnQ2NF90KXNhbXBsZV9kZWx0YSAvIGNvbXBlbnNhdGlvbl9kaXN0YW5jZTsKK30KKworaW50IGF2X3Jlc2FtcGxlKEFWUmVzYW1wbGVDb250ZXh0ICpjLCBzaG9ydCAqZHN0LCBzaG9ydCAqc3JjLCBpbnQgKmNvbnN1bWVkLCBpbnQgc3JjX3NpemUsIGludCBkc3Rfc2l6ZSwgaW50IHVwZGF0ZV9jdHgpeworICAgIGludCBkc3RfaW5kZXgsIGk7CisgICAgaW50IGluZGV4PSBjLT5pbmRleDsKKyAgICBpbnQgZnJhYz0gYy0+ZnJhYzsKKyAgICBpbnQgZHN0X2luY3JfZnJhYz0gYy0+ZHN0X2luY3IgJSBjLT5zcmNfaW5jcjsKKyAgICBpbnQgZHN0X2luY3I9ICAgICAgYy0+ZHN0X2luY3IgLyBjLT5zcmNfaW5jcjsKKyAgICBpbnQgY29tcGVuc2F0aW9uX2Rpc3RhbmNlPSBjLT5jb21wZW5zYXRpb25fZGlzdGFuY2U7CisKKyAgaWYoY29tcGVuc2F0aW9uX2Rpc3RhbmNlID09IDAgJiYgYy0+ZmlsdGVyX2xlbmd0aCA9PSAxICYmIGMtPnBoYXNlX3NoaWZ0PT0wKXsKKyAgICAgICAgaW50NjRfdCBpbmRleDI9ICgoaW50NjRfdClpbmRleCk8PDMyOworICAgICAgICBpbnQ2NF90IGluY3I9ICgxTEw8PDMyKSAqIGMtPmRzdF9pbmNyIC8gYy0+c3JjX2luY3I7CisgICAgICAgIGRzdF9zaXplPSBGRk1JTihkc3Rfc2l6ZSwgKHNyY19zaXplLTEtaW5kZXgpICogKGludDY0X3QpYy0+c3JjX2luY3IgLyBjLT5kc3RfaW5jcik7CisKKyAgICAgICAgZm9yKGRzdF9pbmRleD0wOyBkc3RfaW5kZXggPCBkc3Rfc2l6ZTsgZHN0X2luZGV4KyspeworICAgICAgICAgICAgZHN0W2RzdF9pbmRleF0gPSBzcmNbaW5kZXgyPj4zMl07CisgICAgICAgICAgICBpbmRleDIgKz0gaW5jcjsKKyAgICAgICAgfQorICAgICAgICBpbmRleCArPSBkc3RfaW5kZXggKiBkc3RfaW5jcjsKKyAgICAgICAgaW5kZXggKz0gKGZyYWMgKyBkc3RfaW5kZXggKiAoaW50NjRfdClkc3RfaW5jcl9mcmFjKSAvIGMtPnNyY19pbmNyOworICAgICAgICBmcmFjICAgPSAoZnJhYyArIGRzdF9pbmRleCAqIChpbnQ2NF90KWRzdF9pbmNyX2ZyYWMpICUgYy0+c3JjX2luY3I7CisgIH1lbHNleworICAgIGZvcihkc3RfaW5kZXg9MDsgZHN0X2luZGV4IDwgZHN0X3NpemU7IGRzdF9pbmRleCsrKXsKKyAgICAgICAgRkVMRU0gKmZpbHRlcj0gYy0+ZmlsdGVyX2JhbmsgKyBjLT5maWx0ZXJfbGVuZ3RoKihpbmRleCAmIGMtPnBoYXNlX21hc2spOworICAgICAgICBpbnQgc2FtcGxlX2luZGV4PSBpbmRleCA+PiBjLT5waGFzZV9zaGlmdDsKKyAgICAgICAgRkVMRU0yIHZhbD0wOworCisgICAgICAgIGlmKHNhbXBsZV9pbmRleCA8IDApeworICAgICAgICAgICAgZm9yKGk9MDsgaTxjLT5maWx0ZXJfbGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgdmFsICs9IHNyY1tGRkFCUyhzYW1wbGVfaW5kZXggKyBpKSAlIHNyY19zaXplXSAqIGZpbHRlcltpXTsKKyAgICAgICAgfWVsc2UgaWYoc2FtcGxlX2luZGV4ICsgYy0+ZmlsdGVyX2xlbmd0aCA+IHNyY19zaXplKXsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9ZWxzZSBpZihjLT5saW5lYXIpeworICAgICAgICAgICAgRkVMRU0yIHYyPTA7CisgICAgICAgICAgICBmb3IoaT0wOyBpPGMtPmZpbHRlcl9sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAgICAgdmFsICs9IHNyY1tzYW1wbGVfaW5kZXggKyBpXSAqIChGRUxFTTIpZmlsdGVyW2ldOworICAgICAgICAgICAgICAgIHYyICArPSBzcmNbc2FtcGxlX2luZGV4ICsgaV0gKiAoRkVMRU0yKWZpbHRlcltpICsgYy0+ZmlsdGVyX2xlbmd0aF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWwrPSh2Mi12YWwpKihGRUxFTUwpZnJhYyAvIGMtPnNyY19pbmNyOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8Yy0+ZmlsdGVyX2xlbmd0aDsgaSsrKXsKKyAgICAgICAgICAgICAgICB2YWwgKz0gc3JjW3NhbXBsZV9pbmRleCArIGldICogKEZFTEVNMilmaWx0ZXJbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmZGVmIENPTkZJR19SRVNBTVBMRV9BVURJT1BISUxFX0tJRERZX01PREUKKyAgICAgICAgZHN0W2RzdF9pbmRleF0gPSBhdl9jbGlwX2ludDE2KGxyaW50Zih2YWwpKTsKKyNlbHNlCisgICAgICAgIHZhbCA9ICh2YWwgKyAoMTw8KEZJTFRFUl9TSElGVC0xKSkpPj5GSUxURVJfU0hJRlQ7CisgICAgICAgIGRzdFtkc3RfaW5kZXhdID0gKHVuc2lnbmVkKSh2YWwgKyAzMjc2OCkgPiA2NTUzNSA/ICh2YWw+PjMxKSBeIDMyNzY3IDogdmFsOworI2VuZGlmCisKKyAgICAgICAgZnJhYyArPSBkc3RfaW5jcl9mcmFjOworICAgICAgICBpbmRleCArPSBkc3RfaW5jcjsKKyAgICAgICAgaWYoZnJhYyA+PSBjLT5zcmNfaW5jcil7CisgICAgICAgICAgICBmcmFjIC09IGMtPnNyY19pbmNyOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGRzdF9pbmRleCArIDEgPT0gY29tcGVuc2F0aW9uX2Rpc3RhbmNlKXsKKyAgICAgICAgICAgIGNvbXBlbnNhdGlvbl9kaXN0YW5jZT0gMDsKKyAgICAgICAgICAgIGRzdF9pbmNyX2ZyYWM9IGMtPmlkZWFsX2RzdF9pbmNyICUgYy0+c3JjX2luY3I7CisgICAgICAgICAgICBkc3RfaW5jcj0gICAgICBjLT5pZGVhbF9kc3RfaW5jciAvIGMtPnNyY19pbmNyOworICAgICAgICB9CisgICAgfQorICB9CisgICAgKmNvbnN1bWVkPSBGRk1BWChpbmRleCwgMCkgPj4gYy0+cGhhc2Vfc2hpZnQ7CisgICAgaWYoaW5kZXg+PTApIGluZGV4ICY9IGMtPnBoYXNlX21hc2s7CisKKyAgICBpZihjb21wZW5zYXRpb25fZGlzdGFuY2UpeworICAgICAgICBjb21wZW5zYXRpb25fZGlzdGFuY2UgLT0gZHN0X2luZGV4OworICAgICAgICBhdl9hc3NlcnQyKGNvbXBlbnNhdGlvbl9kaXN0YW5jZSA+IDApOworICAgIH0KKyAgICBpZih1cGRhdGVfY3R4KXsKKyAgICAgICAgYy0+ZnJhYz0gZnJhYzsKKyAgICAgICAgYy0+aW5kZXg9IGluZGV4OworICAgICAgICBjLT5kc3RfaW5jcj0gZHN0X2luY3JfZnJhYyArIGMtPnNyY19pbmNyKmRzdF9pbmNyOworICAgICAgICBjLT5jb21wZW5zYXRpb25fZGlzdGFuY2U9IGNvbXBlbnNhdGlvbl9kaXN0YW5jZTsKKyAgICB9CisKKyAgICByZXR1cm4gZHN0X2luZGV4OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JsLmggYi9mZm1wZWcvbGliYXZjb2RlYy9ybC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OTdlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9ybC5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogcmwgaGVhZGVyLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19STF9ICisjZGVmaW5lIEFWQ09ERUNfUkxfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworLyogcnVuIGxlbmd0aCB0YWJsZSAqLworI2RlZmluZSBNQVhfUlVOICAgIDY0CisjZGVmaW5lIE1BWF9MRVZFTCAgNjQKKworLyoqIFJMVGFibGUuICovCit0eXBlZGVmIHN0cnVjdCBSTFRhYmxlIHsKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgZW50cmllcyBvZiB0YWJsZV92bGMgbWludXMgMQorICAgIGludCBsYXN0OyAgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiB2YWx1ZXMgZm9yIGxhc3QgPSAwCisgICAgY29uc3QgdWludDE2X3QgKCp0YWJsZV92bGMpWzJdOworICAgIGNvbnN0IGludDhfdCAqdGFibGVfcnVuOworICAgIGNvbnN0IGludDhfdCAqdGFibGVfbGV2ZWw7CisgICAgdWludDhfdCAqaW5kZXhfcnVuWzJdOyAgICAgICAgIC8vLzwgZW5jb2Rpbmcgb25seQorICAgIGludDhfdCAqbWF4X2xldmVsWzJdOyAgICAgICAgICAvLy88IGVuY29kaW5nICYgZGVjb2RpbmcKKyAgICBpbnQ4X3QgKm1heF9ydW5bMl07ICAgICAgICAgICAgLy8vPCBlbmNvZGluZyAmIGRlY29kaW5nCisgICAgUkxfVkxDX0VMRU0gKnJsX3ZsY1szMl07ICAgICAgIC8vLzwgZGVjb2Rpbmcgb25seQorfSBSTFRhYmxlOworCisvKioKKyAqCisgKiBAcGFyYW0gc3RhdGljX3N0b3JlIHN0YXRpYyB1aW50OF90IGFycmF5WzJdWzIqTUFYX1JVTiArIE1BWF9MRVZFTCArIDNdIHdoaWNoIHdpbGwgaG9sZAorICogICAgICAgICAgICAgICAgICAgICB0aGUgbGV2ZWwgYW5kIHJ1biB0YWJsZXMsIGlmIHRoaXMgaXMgTlVMTCBhdl9tYWxsb2MoKSB3aWxsIGJlIHVzZWQKKyAqLwordm9pZCBmZl9pbml0X3JsKFJMVGFibGUgKnJsLCB1aW50OF90IHN0YXRpY19zdG9yZVsyXVsyKk1BWF9SVU4gKyBNQVhfTEVWRUwgKyAzXSk7Cit2b2lkIGZmX2luaXRfdmxjX3JsKFJMVGFibGUgKnJsLCB1bnNpZ25lZCBzdGF0aWNfc2l6ZSk7CisKKyNkZWZpbmUgSU5JVF9WTENfUkwocmwsIHN0YXRpY19zaXplKVwKK3tcCisgICAgaW50IHE7XAorICAgIHN0YXRpYyBSTF9WTENfRUxFTSBybF92bGNfdGFibGVbMzJdW3N0YXRpY19zaXplXTtcCitcCisgICAgaWYoIXJsLnJsX3ZsY1swXSl7XAorICAgICAgICBmb3IocT0wOyBxPDMyOyBxKyspXAorICAgICAgICAgICAgcmwucmxfdmxjW3FdPSBybF92bGNfdGFibGVbcV07XAorXAorICAgICAgICBmZl9pbml0X3ZsY19ybCgmcmwsIHN0YXRpY19zaXplKTtcCisgICAgfVwKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3JsX2luZGV4KGNvbnN0IFJMVGFibGUgKnJsLCBpbnQgbGFzdCwgaW50IHJ1biwgaW50IGxldmVsKQoreworICAgIGludCBpbmRleDsKKyAgICBpbmRleCA9IHJsLT5pbmRleF9ydW5bbGFzdF1bcnVuXTsKKyAgICBpZiAoaW5kZXggPj0gcmwtPm4pCisgICAgICAgIHJldHVybiBybC0+bjsKKyAgICBpZiAobGV2ZWwgPiBybC0+bWF4X2xldmVsW2xhc3RdW3J1bl0pCisgICAgICAgIHJldHVybiBybC0+bjsKKyAgICByZXR1cm4gaW5kZXggKyBsZXZlbCAtIDE7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX1JMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JsMi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmwyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmMzFiNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JsMi5jCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogUkwyIFZpZGVvIERlY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTYXNjaGEgU29tbWVyIChzYXNjaGFzb21tZXJAZnJlZW5ldC5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUkwyIFZpZGVvIERlY29kZXIKKyAqIEBhdXRob3IgU2FzY2hhIFNvbW1lciAoc2FzY2hhc29tbWVyQGZyZWVuZXQuZGUpCisgKiBAc2VlIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPVJMMgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCisjZGVmaW5lIEVYVFJBREFUQTFfU0laRSAoNiArIDI1NiAqIDMpIC8vLzwgdmlkZW8gYmFzZSwgY2xyIGNvdW50LCBwYWxldHRlCisKK3R5cGVkZWYgc3RydWN0IFJsMkNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKworICAgIHVpbnQxNl90IHZpZGVvX2Jhc2U7ICAvLy88IGluaXRpYWwgZHJhd2luZyBvZmZzZXQKKyAgICB1aW50MzJfdCBjbHJfY291bnQ7ICAgLy8vPCBudW1iZXIgb2YgdXNlZCBjb2xvcnMgKGN1cnJlbnRseSB1bnVzZWQpCisgICAgdWludDhfdCAqYmFja19mcmFtZTsgIC8vLzwgYmFja2dyb3VuZCBmcmFtZQorICAgIHVpbnQzMl90IHBhbGV0dGVbQVZQQUxFVFRFX0NPVU5UXTsKK30gUmwyQ29udGV4dDsKKworLyoqCisgKiBSdW4gTGVuZ3RoIERlY29kZSBhIHNpbmdsZSAzMjB4MjAwIGZyYW1lCisgKiBAcGFyYW0gcyBybDIgY29udGV4dAorICogQHBhcmFtIGluIGlucHV0IGJ1ZmZlcgorICogQHBhcmFtIHNpemUgaW5wdXQgYnVmZmVyIHNpemUKKyAqIEBwYXJhbSBvdXQgb3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtIHN0cmlkZSBzdHJpZGUgb2YgdGhlIG91dHB1dCBidWZmZXIKKyAqIEBwYXJhbSB2aWRlb19iYXNlIG9mZnNldCBvZiB0aGUgcmxlIGRhdGEgaW5zaWRlIHRoZSBmcmFtZQorICovCitzdGF0aWMgdm9pZCBybDJfcmxlX2RlY29kZShSbDJDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICppbiwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0LCBpbnQgc3RyaWRlLCBpbnQgdmlkZW9fYmFzZSkKK3sKKyAgICBpbnQgYmFzZV94ID0gdmlkZW9fYmFzZSAlIHMtPmF2Y3R4LT53aWR0aDsKKyAgICBpbnQgYmFzZV95ID0gdmlkZW9fYmFzZSAvIHMtPmF2Y3R4LT53aWR0aDsKKyAgICBpbnQgc3RyaWRlX2FkaiA9IHN0cmlkZSAtIHMtPmF2Y3R4LT53aWR0aDsKKyAgICBpbnQgaTsKKyAgICBjb25zdCB1aW50OF90ICpiYWNrX2ZyYW1lID0gcy0+YmFja19mcmFtZTsKKyAgICBjb25zdCB1aW50OF90ICppbl9lbmQgICAgID0gaW4gKyBzaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKm91dF9lbmQgICAgPSBvdXQgKyBzdHJpZGUgKiBzLT5hdmN0eC0+aGVpZ2h0OworICAgIHVpbnQ4X3QgKmxpbmVfZW5kOworCisgICAgLyoqIGNvcHkgc3RhcnQgb2YgdGhlIGJhY2tncm91bmQgZnJhbWUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IGJhc2VfeTsgaSsrKSB7CisgICAgICAgIGlmIChzLT5iYWNrX2ZyYW1lKQorICAgICAgICAgICAgbWVtY3B5KG91dCwgYmFja19mcmFtZSwgcy0+YXZjdHgtPndpZHRoKTsKKyAgICAgICAgb3V0ICAgICAgICArPSBzdHJpZGU7CisgICAgICAgIGJhY2tfZnJhbWUgKz0gcy0+YXZjdHgtPndpZHRoOworICAgIH0KKyAgICBiYWNrX2ZyYW1lICs9IGJhc2VfeCAtIHMtPmF2Y3R4LT53aWR0aDsKKyAgICBsaW5lX2VuZCAgICA9IG91dCAtIHN0cmlkZV9hZGo7CisgICAgb3V0ICAgICAgICArPSBiYXNlX3ggLSBzdHJpZGU7CisKKyAgICAvKiogZGVjb2RlIHRoZSB2YXJpYWJsZSBwYXJ0IG9mIHRoZSBmcmFtZSAqLworICAgIHdoaWxlIChpbiA8IGluX2VuZCkgeworICAgICAgICB1aW50OF90IHZhbCA9ICppbisrOworICAgICAgICBpbnQgbGVuICAgICA9IDE7CisgICAgICAgIGlmICh2YWwgPj0gMHg4MCkgeworICAgICAgICAgICAgaWYgKGluID49IGluX2VuZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGxlbiA9ICppbisrOworICAgICAgICAgICAgaWYgKCFsZW4pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGVuID49IG91dF9lbmQgLSBvdXQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAocy0+YmFja19mcmFtZSkKKyAgICAgICAgICAgIHZhbCB8PSAweDgwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWwgJj0gfjB4ODA7CisKKyAgICAgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgICAgICAqb3V0KysgPSAodmFsID09IDB4ODApID8gKmJhY2tfZnJhbWUgOiB2YWw7CisgICAgICAgICAgICBiYWNrX2ZyYW1lKys7CisgICAgICAgICAgICBpZiAob3V0ID09IGxpbmVfZW5kKSB7CisgICAgICAgICAgICAgICAgIG91dCAgICAgICs9IHN0cmlkZV9hZGo7CisgICAgICAgICAgICAgICAgIGxpbmVfZW5kICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgaWYgKGxlbiA+PSBvdXRfZW5kIC0gb3V0KQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogY29weSB0aGUgcmVzdCBmcm9tIHRoZSBiYWNrZ3JvdW5kIGZyYW1lICovCisgICAgaWYgKHMtPmJhY2tfZnJhbWUpIHsKKyAgICAgICAgd2hpbGUgKG91dCA8IG91dF9lbmQpIHsKKyAgICAgICAgICAgIG1lbWNweShvdXQsIGJhY2tfZnJhbWUsIGxpbmVfZW5kIC0gb3V0KTsKKyAgICAgICAgICAgIGJhY2tfZnJhbWUgKz0gbGluZV9lbmQgLSBvdXQ7CisgICAgICAgICAgICBvdXQgICAgICAgICA9IGxpbmVfZW5kICsgc3RyaWRlX2FkajsKKyAgICAgICAgICAgIGxpbmVfZW5kICAgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgZGVjb2RlcgorICogQHBhcmFtIGF2Y3R4IGRlY29kZXIgY29udGV4dAorICogQHJldHVybiAwIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBybDJfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFJsMkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBiYWNrX3NpemU7CisgICAgaW50IGk7CisKKyAgICBzLT5hdmN0eCAgICAgICA9IGF2Y3R4OworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworCisgICAgLyoqIHBhcnNlIGV4dHJhIGRhdGEgKi8KKyAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEgfHwgYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgRVhUUkFEQVRBMV9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBleHRyYWRhdGEgc2l6ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyoqIGdldCBmcmFtZV9vZmZzZXQgKi8KKyAgICBzLT52aWRlb19iYXNlID0gQVZfUkwxNigmYXZjdHgtPmV4dHJhZGF0YVswXSk7CisgICAgcy0+Y2xyX2NvdW50ICA9IEFWX1JMMzIoJmF2Y3R4LT5leHRyYWRhdGFbMl0pOworCisgICAgaWYgKHMtPnZpZGVvX2Jhc2UgPj0gYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdmlkZW9fYmFzZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qKiBpbml0aWFsaXplIHBhbGV0dGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQVZQQUxFVFRFX0NPVU5UOyBpKyspCisgICAgICAgIHMtPnBhbGV0dGVbaV0gPSAweEZGVSA8PCAyNCB8IEFWX1JCMjQoJmF2Y3R4LT5leHRyYWRhdGFbNiArIGkgKiAzXSk7CisKKyAgICAvKiogZGVjb2RlIGJhY2tncm91bmQgZnJhbWUgaWYgcHJlc2VudCAqLworICAgIGJhY2tfc2l6ZSA9IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAtIEVYVFJBREFUQTFfU0laRTsKKworICAgIGlmIChiYWNrX3NpemUgPiAwKSB7CisgICAgICAgIHVpbnQ4X3QgKmJhY2tfZnJhbWUgPSBhdl9tYWxsb2N6KGF2Y3R4LT53aWR0aCphdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgaWYgKCFiYWNrX2ZyYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcmwyX3JsZV9kZWNvZGUocywgYXZjdHgtPmV4dHJhZGF0YSArIEVYVFJBREFUQTFfU0laRSwgYmFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBiYWNrX2ZyYW1lLCBhdmN0eC0+d2lkdGgsIDApOworICAgICAgICBzLT5iYWNrX2ZyYW1lID0gYmFja19mcmFtZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBybDJfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgcmV0LCBidWZfc2l6ZSAgPSBhdnBrdC0+c2l6ZTsKKyAgICBSbDJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiogcnVuIGxlbmd0aCBkZWNvZGUgKi8KKyAgICBybDJfcmxlX2RlY29kZShzLCBidWYsIGJ1Zl9zaXplLCBmcmFtZS0+ZGF0YVswXSwgZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgIHMtPnZpZGVvX2Jhc2UpOworCisgICAgLyoqIG1ha2UgdGhlIHBhbGV0dGUgYXZhaWxhYmxlIG9uIHRoZSB3YXkgb3V0ICovCisgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzFdLCBzLT5wYWxldHRlLCBBVlBBTEVUVEVfU0laRSk7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIC8qKiByZXBvcnQgdGhhdCB0aGUgYnVmZmVyIHdhcyBjb21wbGV0ZWx5IGNvbnN1bWVkICovCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCisKKy8qKgorICogVW5pbml0IGRlY29kZXIKKyAqIEBwYXJhbSBhdmN0eCBkZWNvZGVyIGNvbnRleHQKKyAqIEByZXR1cm4gMCBzdWNjZXNzLCAtMSBvbiBlcnJvcgorICovCitzdGF0aWMgYXZfY29sZCBpbnQgcmwyX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFJsMkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJnMtPmJhY2tfZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworQVZDb2RlYyBmZl9ybDJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicmwyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUkwyIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1JMMiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUmwyQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gcmwyX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHJsMl9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHJsMl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ybGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZWM2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9ybGUuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogUkxFIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCb2JieSBCaW5naGFtCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInJsZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworLyoqCisgKiBDb3VudCB1cCB0byAxMjcgY29uc2VjdXRpdmUgcGl4ZWxzIHdoaWNoIGFyZSBlaXRoZXIgYWxsIHRoZSBzYW1lIG9yCisgKiBhbGwgZGlmZmVyIGZyb20gdGhlIHByZXZpb3VzIGFuZCBuZXh0IHBpeGVscy4KKyAqIEBwYXJhbSBzdGFydCBQb2ludGVyIHRvIHRoZSBmaXJzdCBwaXhlbAorICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBwaXhlbHMKKyAqIEBwYXJhbSBicHAgQnl0ZXMgcGVyIHBpeGVsCisgKiBAcGFyYW0gc2FtZSAxIGlmIHNlYXJjaGluZyBmb3IgaWRlbnRpY2FsIHBpeGVsIHZhbHVlcy4gIDAgZm9yIGRpZmZlcmluZworICogQHJldHVybiBOdW1iZXIgb2YgbWF0Y2hpbmcgY29uc2VjdXRpdmUgcGl4ZWxzIGZvdW5kCisgKi8KK3N0YXRpYyBpbnQgY291bnRfcGl4ZWxzKGNvbnN0IHVpbnQ4X3QgKnN0YXJ0LCBpbnQgbGVuLCBpbnQgYnBwLCBpbnQgc2FtZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpwb3M7CisgICAgaW50IGNvdW50ID0gMTsKKworICAgIGZvcihwb3MgPSBzdGFydCArIGJwcDsgY291bnQgPCBGRk1JTigxMjcsIGxlbik7IHBvcyArPSBicHAsIGNvdW50ICsrKSB7CisgICAgICAgIGlmKHNhbWUgIT0gIW1lbWNtcChwb3MtYnBwLCBwb3MsIGJwcCkpIHsKKyAgICAgICAgICAgIGlmKCFzYW1lKSB7CisgICAgICAgICAgICAgICAgLyogaWYgYnBwID09IDEsIHRoZW4gMCAxIDEgMCBpcyBtb3JlIGVmZmljaWVudGx5IGVuY29kZWQgYXMgYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgKiByYXcgYmxvY2sgb2YgcGl4ZWxzLiAgZm9yIGxhcmdlciBicHAsIFJMRSBpcyBhcyBnb29kIG9yIGJldHRlciAqLworICAgICAgICAgICAgICAgIGlmKGJwcCA9PSAxICYmIGNvdW50ICsgMSA8IEZGTUlOKDEyNywgbGVuKSAmJiAqcG9zICE9ICoocG9zKzEpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8qIGlmIFJMRSBjYW4gZW5jb2RlIHRoZSBuZXh0IGJsb2NrIGJldHRlciB0aGFuIGFzIGEgcmF3IGJsb2NrLAorICAgICAgICAgICAgICAgICAqIGJhY2sgdXAgYW5kIGxlYXZlIF9hbGxfIHRoZSBpZGVudGljYWwgcGl4ZWxzIGZvciBSTEUgKi8KKyAgICAgICAgICAgICAgICBjb3VudCAtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgZmZfcmxlX2VuY29kZSh1aW50OF90ICpvdXRidWYsIGludCBvdXRfc2l6ZSwgY29uc3QgdWludDhfdCAqcHRyICwgaW50IGJwcCwgaW50IHcsCisgICAgICAgICAgICAgICAgICBpbnQgYWRkX3JlcCwgaW50IHhvcl9yZXAsIGludCBhZGRfcmF3LCBpbnQgeG9yX3JhdykKK3sKKyAgICBpbnQgY291bnQsIHg7CisgICAgdWludDhfdCAqb3V0ID0gb3V0YnVmOworCisgICAgZm9yKHggPSAwOyB4IDwgdzsgeCArPSBjb3VudCkgeworICAgICAgICAvKiBzZWUgaWYgd2UgY2FuIGVuY29kZSB0aGUgbmV4dCBzZXQgb2YgcGl4ZWxzIHdpdGggUkxFICovCisgICAgICAgIGlmKChjb3VudCA9IGNvdW50X3BpeGVscyhwdHIsIHcteCwgYnBwLCAxKSkgPiAxKSB7CisgICAgICAgICAgICBpZihvdXQgKyBicHAgKyAxID4gb3V0YnVmICsgb3V0X3NpemUpIHJldHVybiAtMTsKKyAgICAgICAgICAgICpvdXQrKyA9IChjb3VudCBeIHhvcl9yZXApICsgYWRkX3JlcDsKKyAgICAgICAgICAgIG1lbWNweShvdXQsIHB0ciwgYnBwKTsKKyAgICAgICAgICAgIG91dCArPSBicHA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBmYWxsIGJhY2sgb24gdW5jb21wcmVzc2VkICovCisgICAgICAgICAgICBjb3VudCA9IGNvdW50X3BpeGVscyhwdHIsIHcteCwgYnBwLCAwKTsKKyAgICAgICAgICAgIGlmKG91dCArIGJwcCpjb3VudCA+PSBvdXRidWYgKyBvdXRfc2l6ZSkgcmV0dXJuIC0xOworICAgICAgICAgICAgKm91dCsrID0gKGNvdW50IF4geG9yX3JhdykgKyBhZGRfcmF3OworCisgICAgICAgICAgICBtZW1jcHkob3V0LCBwdHIsIGJwcCAqIGNvdW50KTsKKyAgICAgICAgICAgIG91dCArPSBicHAgKiBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB0ciArPSBjb3VudCAqIGJwcDsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0IC0gb3V0YnVmOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcmxlLmggYi9mZm1wZWcvbGliYXZjb2RlYy9ybGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDg1MTMyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcmxlLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIFJMRSBlbmNvZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19STEVfSAorI2RlZmluZSBBVkNPREVDX1JMRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBSTEUgY29tcHJlc3MgdGhlIHJvdywgd2l0aCBtYXhpbXVtIHNpemUgb2Ygb3V0X3NpemUuIFZhbHVlIGJlZm9yZSByZXBlYXRlZCBieXRlcyBpcyAoY291bnQgXiB4b3JfcmVwKSArIGFkZF9yZXAuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGJlZm9yZSByYXcgYnl0ZXMgaXMgICAgICAoY291bnQgXiB4b3JfcmF3KSArIGFkZF9yYXcuCisgKiBAcGFyYW0gb3V0YnVmIE91dHB1dCBidWZmZXIKKyAqIEBwYXJhbSBvdXRfc2l6ZSBNYXhpbXVtIG91dHB1dCBzaXplCisgKiBAcGFyYW0gaW5idWYgSW5wdXQgYnVmZmVyCisgKiBAcGFyYW0gYnBwIEJ5dGVzIHBlciBwaXhlbAorICogQHBhcmFtIHcgSW1hZ2Ugd2lkdGgKKyAqIEByZXR1cm4gU2l6ZSBvZiBvdXRwdXQgaW4gYnl0ZXMsIG9yIC0xIGlmIGxhcmdlciB0aGFuIG91dF9zaXplCisgKi8KK2ludCBmZl9ybGVfZW5jb2RlKHVpbnQ4X3QgKm91dGJ1ZiwgaW50IG91dF9zaXplLCBjb25zdCB1aW50OF90ICppbmJ1ZiwgaW50IGJwcCwgaW50IHcsCisgICAgICAgICAgICAgICAgICBpbnQgYWRkX3JlcCwgaW50IHhvcl9yZXAsIGludCBhZGRfcmF3LCBpbnQgeG9yX3Jhdyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1JMRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ybmRfYXZnLmggYi9mZm1wZWcvbGliYXZjb2RlYy9ybmRfYXZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0Nzc1ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JuZF9hdmcuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgQkVSTyA8YmVyb0BnZW9jaXRpZXMuY28uanA+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3NrYXIgQXJ2aWRzc29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19STkRfQVZHX0gKKyNkZWZpbmUgQVZDT0RFQ19STkRfQVZHX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEJZVEVfVkVDMzIoYykgKChjKSAqIDB4MDEwMTAxMDFVTCkKKyNkZWZpbmUgQllURV9WRUM2NChjKSAoKGMpICogMHgwMDAxMDAwMTAwMDEwMDAxVUwpCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgcm5kX2F2ZzMyKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgcmV0dXJuIChhIHwgYikgLSAoKChhIF4gYikgJiB+QllURV9WRUMzMigweDAxKSkgPj4gMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgbm9fcm5kX2F2ZzMyKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgcmV0dXJuIChhICYgYikgKyAoKChhIF4gYikgJiB+QllURV9WRUMzMigweDAxKSkgPj4gMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3Qgcm5kX2F2ZzY0KHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisgICAgcmV0dXJuIChhIHwgYikgLSAoKChhIF4gYikgJiB+QllURV9WRUM2NCgweDAxKSkgPj4gMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3Qgbm9fcm5kX2F2ZzY0KHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisgICAgcmV0dXJuIChhICYgYikgKyAoKChhIF4gYikgJiB+QllURV9WRUM2NCgweDAxKSkgPj4gMSk7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX1JORF9BVkdfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcm9xYXVkaW9lbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JvcWF1ZGlvZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1OTA3NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JvcWF1ZGlvZW5jLmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBSb1EgYXVkaW8gZW5jb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBFcmljIExhc290YQorICogICAgQmFzZWQgb24gUm9RIHNwZWNzIChjKTIwMDEgVGltIEZlcmd1c29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCisjZGVmaW5lIFJPUV9GUkFNRV9TSVpFICAgICAgICAgICA3MzUKKyNkZWZpbmUgUk9RX0hFQURFUl9TSVpFICAgOAorCisjZGVmaW5lIE1BWF9EUENNICgxMjcqMTI3KQorCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgc2hvcnQgbGFzdFNhbXBsZVsyXTsKKyAgICBpbnQgaW5wdXRfZnJhbWVzOworICAgIGludCBidWZmZXJlZF9zYW1wbGVzOworICAgIGludDE2X3QgKmZyYW1lX2J1ZmZlcjsKKyAgICBpbnQ2NF90IGZpcnN0X3B0czsKK30gUk9RRFBDTUNvbnRleHQ7CisKKworc3RhdGljIGF2X2NvbGQgaW50IHJvcV9kcGNtX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUk9RRFBDTUNvbnRleHQgKmNvbnRleHQgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmNvbnRleHQtPmZyYW1lX2J1ZmZlcik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHJvcV9kcGNtX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBST1FEUENNQ29udGV4dCAqY29udGV4dCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQXVkaW8gbXVzdCBiZSBtb25vIG9yIHN0ZXJlb1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmIChhdmN0eC0+c2FtcGxlX3JhdGUgIT0gMjIwNTApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBdWRpbyBtdXN0IGJlIDIyMDUwIEh6XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IFJPUV9GUkFNRV9TSVpFOworICAgIGF2Y3R4LT5iaXRfcmF0ZSAgID0gKFJPUV9IRUFERVJfU0laRSArIFJPUV9GUkFNRV9TSVpFICogYXZjdHgtPmNoYW5uZWxzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAoMjIwNTAgLyBST1FfRlJBTUVfU0laRSkgKiA4OworCisgICAgY29udGV4dC0+ZnJhbWVfYnVmZmVyID0gYXZfbWFsbG9jKDggKiBST1FfRlJBTUVfU0laRSAqIGF2Y3R4LT5jaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY29udGV4dC0+ZnJhbWVfYnVmZmVyKSk7CisgICAgaWYgKCFjb250ZXh0LT5mcmFtZV9idWZmZXIpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGNvbnRleHQtPmxhc3RTYW1wbGVbMF0gPSBjb250ZXh0LT5sYXN0U2FtcGxlWzFdID0gMDsKKworICAgIHJldHVybiAwOworZXJyb3I6CisgICAgcm9xX2RwY21fZW5jb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBkcGNtX3ByZWRpY3Qoc2hvcnQgKnByZXZpb3VzLCBzaG9ydCBjdXJyZW50KQoreworICAgIGludCBkaWZmOworICAgIGludCBuZWdhdGl2ZTsKKyAgICBpbnQgcmVzdWx0OworICAgIGludCBwcmVkaWN0ZWQ7CisKKyAgICBkaWZmID0gY3VycmVudCAtICpwcmV2aW91czsKKworICAgIG5lZ2F0aXZlID0gZGlmZjwwOworICAgIGRpZmYgPSBGRkFCUyhkaWZmKTsKKworICAgIGlmIChkaWZmID49IE1BWF9EUENNKQorICAgICAgICByZXN1bHQgPSAxMjc7CisgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IGZmX3NxcnQoZGlmZik7CisgICAgICAgIHJlc3VsdCArPSBkaWZmID4gcmVzdWx0KnJlc3VsdCtyZXN1bHQ7CisgICAgfQorCisgICAgLyogU2VlIGlmIHRoaXMgb3ZlcmZsb3dzICovCisgcmV0cnk6CisgICAgZGlmZiA9IHJlc3VsdCpyZXN1bHQ7CisgICAgaWYgKG5lZ2F0aXZlKQorICAgICAgICBkaWZmID0gLWRpZmY7CisgICAgcHJlZGljdGVkID0gKnByZXZpb3VzICsgZGlmZjsKKworICAgIC8qIElmIGl0IG92ZXJmbG93cywgYmFjayBvZmYgYSBzdGVwICovCisgICAgaWYgKHByZWRpY3RlZCA+IDMyNzY3IHx8IHByZWRpY3RlZCA8IC0zMjc2OCkgeworICAgICAgICByZXN1bHQtLTsKKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisKKyAgICAvKiBBZGQgdGhlIHNpZ24gYml0ICovCisgICAgcmVzdWx0IHw9IG5lZ2F0aXZlIDw8IDc7ICAgLy9pZiAobmVnYXRpdmUpIHJlc3VsdCB8PSAxMjg7CisKKyAgICAqcHJldmlvdXMgPSBwcmVkaWN0ZWQ7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHJvcV9kcGNtX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIGludCBpLCBzdGVyZW8sIGRhdGFfc2l6ZSwgcmV0OworICAgIGNvbnN0IGludDE2X3QgKmluID0gZnJhbWUgPyAoY29uc3QgaW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdIDogTlVMTDsKKyAgICB1aW50OF90ICpvdXQ7CisgICAgUk9RRFBDTUNvbnRleHQgKmNvbnRleHQgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgc3RlcmVvID0gKGF2Y3R4LT5jaGFubmVscyA9PSAyKTsKKworICAgIGlmICghaW4gJiYgY29udGV4dC0+aW5wdXRfZnJhbWVzID49IDgpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGluICYmIGNvbnRleHQtPmlucHV0X2ZyYW1lcyA8IDgpIHsKKyAgICAgICAgbWVtY3B5KCZjb250ZXh0LT5mcmFtZV9idWZmZXJbY29udGV4dC0+YnVmZmVyZWRfc2FtcGxlcyAqIGF2Y3R4LT5jaGFubmVsc10sCisgICAgICAgICAgICAgICBpbiwgYXZjdHgtPmZyYW1lX3NpemUgKiBhdmN0eC0+Y2hhbm5lbHMgKiBzaXplb2YoKmluKSk7CisgICAgICAgIGNvbnRleHQtPmJ1ZmZlcmVkX3NhbXBsZXMgKz0gYXZjdHgtPmZyYW1lX3NpemU7CisgICAgICAgIGlmIChjb250ZXh0LT5pbnB1dF9mcmFtZXMgPT0gMCkKKyAgICAgICAgICAgIGNvbnRleHQtPmZpcnN0X3B0cyA9IGZyYW1lLT5wdHM7CisgICAgICAgIGlmIChjb250ZXh0LT5pbnB1dF9mcmFtZXMgPCA3KSB7CisgICAgICAgICAgICBjb250ZXh0LT5pbnB1dF9mcmFtZXMrKzsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb250ZXh0LT5pbnB1dF9mcmFtZXMgPCA4KQorICAgICAgICBpbiA9IGNvbnRleHQtPmZyYW1lX2J1ZmZlcjsKKworICAgIGlmIChzdGVyZW8pIHsKKyAgICAgICAgY29udGV4dC0+bGFzdFNhbXBsZVswXSAmPSAweEZGMDA7CisgICAgICAgIGNvbnRleHQtPmxhc3RTYW1wbGVbMV0gJj0gMHhGRjAwOworICAgIH0KKworICAgIGlmIChjb250ZXh0LT5pbnB1dF9mcmFtZXMgPT0gNykKKyAgICAgICAgZGF0YV9zaXplID0gYXZjdHgtPmNoYW5uZWxzICogY29udGV4dC0+YnVmZmVyZWRfc2FtcGxlczsKKyAgICBlbHNlCisgICAgICAgIGRhdGFfc2l6ZSA9IGF2Y3R4LT5jaGFubmVscyAqIGF2Y3R4LT5mcmFtZV9zaXplOworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgUk9RX0hFQURFUl9TSVpFICsgZGF0YV9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG91dCA9IGF2cGt0LT5kYXRhOworCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmb3V0LCBzdGVyZW8gPyAweDIxIDogMHgyMCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmb3V0LCAweDEwKTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZvdXQsIGRhdGFfc2l6ZSk7CisKKyAgICBpZiAoc3RlcmVvKSB7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJm91dCwgKGNvbnRleHQtPmxhc3RTYW1wbGVbMV0pPj44KTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmb3V0LCAoY29udGV4dC0+bGFzdFNhbXBsZVswXSk+PjgpOworICAgIH0gZWxzZQorICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZvdXQsIGNvbnRleHQtPmxhc3RTYW1wbGVbMF0pOworCisgICAgLyogV3JpdGUgdGhlIGFjdHVhbCBzYW1wbGVzICovCisgICAgZm9yIChpID0gMDsgaSA8IGRhdGFfc2l6ZTsgaSsrKQorICAgICAgICAqb3V0KysgPSBkcGNtX3ByZWRpY3QoJmNvbnRleHQtPmxhc3RTYW1wbGVbaSAmIDFdLCAqaW4rKyk7CisKKyAgICBhdnBrdC0+cHRzICAgICAgPSBjb250ZXh0LT5pbnB1dF9mcmFtZXMgPD0gNyA/IGNvbnRleHQtPmZpcnN0X3B0cyA6IGZyYW1lLT5wdHM7CisgICAgYXZwa3QtPmR1cmF0aW9uID0gZGF0YV9zaXplIC8gYXZjdHgtPmNoYW5uZWxzOworCisgICAgY29udGV4dC0+aW5wdXRfZnJhbWVzKys7CisgICAgaWYgKCFpbikKKyAgICAgICAgY29udGV4dC0+aW5wdXRfZnJhbWVzID0gRkZNQVgoY29udGV4dC0+aW5wdXRfZnJhbWVzLCA4KTsKKworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfcm9xX2RwY21fZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicm9xX2RwY20iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJpZCBSb1EgRFBDTSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9ST1FfRFBDTSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUk9RRFBDTUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHJvcV9kcGNtX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IHJvcV9kcGNtX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSByb3FfZHBjbV9lbmNvZGVfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcm9xdmlkZW8uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JvcXZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkYTkzYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JvcXZpZGVvLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWlrZSBNZWxhbnNvbgorICogQ29weXJpZ2h0IChDKSAyMDAzIERyLiBUaW0gRmVyZ3Vzb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaWQgUm9RIFZpZGVvIGNvbW1vbiBmdW5jdGlvbnMgYmFzZWQgb24gd29yayBieSBEci4gVGltIEZlcmd1c29uCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJyb3F2aWRlby5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgYmxvY2tfY29weSh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHN0cmlkZSwgaW50IGluc3RyaWRlLCBpbnQgc3opCit7CisgICAgaW50IHJvd3MgPSBzejsKKyAgICB3aGlsZShyb3dzLS0pIHsKKyAgICAgICAgbWVtY3B5KG91dCwgaW4sIHN6KTsKKyAgICAgICAgb3V0ICs9IG91dHN0cmlkZTsKKyAgICAgICAgaW4gKz0gaW5zdHJpZGU7CisgICAgfQorfQorCit2b2lkIGZmX2FwcGx5X3ZlY3Rvcl8yeDIoUm9xQ29udGV4dCAqcmksIGludCB4LCBpbnQgeSwgcm9xX2NlbGwgKmNlbGwpCit7CisgICAgdW5zaWduZWQgY2hhciAqYnB0cjsKKyAgICBpbnQgYm9mZnMsc3RyaWRlOworCisgICAgc3RyaWRlID0gcmktPmN1cnJlbnRfZnJhbWUtPmxpbmVzaXplWzBdOworICAgIGJvZmZzID0geSpzdHJpZGUgKyB4OworCisgICAgYnB0ciA9IHJpLT5jdXJyZW50X2ZyYW1lLT5kYXRhWzBdICsgYm9mZnM7CisgICAgYnB0clswICAgICAgIF0gPSBjZWxsLT55WzBdOworICAgIGJwdHJbMSAgICAgICBdID0gY2VsbC0+eVsxXTsKKyAgICBicHRyW3N0cmlkZSAgXSA9IGNlbGwtPnlbMl07CisgICAgYnB0cltzdHJpZGUrMV0gPSBjZWxsLT55WzNdOworCisgICAgc3RyaWRlID0gcmktPmN1cnJlbnRfZnJhbWUtPmxpbmVzaXplWzFdOworICAgIGJvZmZzID0geSpzdHJpZGUgKyB4OworCisgICAgYnB0ciA9IHJpLT5jdXJyZW50X2ZyYW1lLT5kYXRhWzFdICsgYm9mZnM7CisgICAgYnB0clswICAgICAgIF0gPQorICAgIGJwdHJbMSAgICAgICBdID0KKyAgICBicHRyW3N0cmlkZSAgXSA9CisgICAgYnB0cltzdHJpZGUrMV0gPSBjZWxsLT51OworCisgICAgYnB0ciA9IHJpLT5jdXJyZW50X2ZyYW1lLT5kYXRhWzJdICsgYm9mZnM7CisgICAgYnB0clswICAgICAgIF0gPQorICAgIGJwdHJbMSAgICAgICBdID0KKyAgICBicHRyW3N0cmlkZSAgXSA9CisgICAgYnB0cltzdHJpZGUrMV0gPSBjZWxsLT52OworfQorCit2b2lkIGZmX2FwcGx5X3ZlY3Rvcl80eDQoUm9xQ29udGV4dCAqcmksIGludCB4LCBpbnQgeSwgcm9xX2NlbGwgKmNlbGwpCit7CisgICAgdW5zaWduZWQgY2hhciAqYnB0cjsKKyAgICBpbnQgYm9mZnMsc3RyaWRlOworCisgICAgc3RyaWRlID0gcmktPmN1cnJlbnRfZnJhbWUtPmxpbmVzaXplWzBdOworICAgIGJvZmZzID0geSpzdHJpZGUgKyB4OworCisgICAgYnB0ciA9IHJpLT5jdXJyZW50X2ZyYW1lLT5kYXRhWzBdICsgYm9mZnM7CisgICAgYnB0clsgICAgICAgICAwXSA9IGJwdHJbICAgICAgICAgMV0gPSBicHRyW3N0cmlkZSAgICBdID0gYnB0cltzdHJpZGUgICsxXSA9IGNlbGwtPnlbMF07CisgICAgYnB0clsgICAgICAgICAyXSA9IGJwdHJbICAgICAgICAgM10gPSBicHRyW3N0cmlkZSAgKzJdID0gYnB0cltzdHJpZGUgICszXSA9IGNlbGwtPnlbMV07CisgICAgYnB0cltzdHJpZGUqMiAgXSA9IGJwdHJbc3RyaWRlKjIrMV0gPSBicHRyW3N0cmlkZSozICBdID0gYnB0cltzdHJpZGUqMysxXSA9IGNlbGwtPnlbMl07CisgICAgYnB0cltzdHJpZGUqMisyXSA9IGJwdHJbc3RyaWRlKjIrM10gPSBicHRyW3N0cmlkZSozKzJdID0gYnB0cltzdHJpZGUqMyszXSA9IGNlbGwtPnlbM107CisKKyAgICBzdHJpZGUgPSByaS0+Y3VycmVudF9mcmFtZS0+bGluZXNpemVbMV07CisgICAgYm9mZnMgPSB5KnN0cmlkZSArIHg7CisKKyAgICBicHRyID0gcmktPmN1cnJlbnRfZnJhbWUtPmRhdGFbMV0gKyBib2ZmczsKKyAgICBicHRyWyAgICAgICAgIDBdID0gYnB0clsgICAgICAgICAxXSA9IGJwdHJbc3RyaWRlICAgIF0gPSBicHRyW3N0cmlkZSAgKzFdID0KKyAgICBicHRyWyAgICAgICAgIDJdID0gYnB0clsgICAgICAgICAzXSA9IGJwdHJbc3RyaWRlICArMl0gPSBicHRyW3N0cmlkZSAgKzNdID0KKyAgICBicHRyW3N0cmlkZSoyICBdID0gYnB0cltzdHJpZGUqMisxXSA9IGJwdHJbc3RyaWRlKjMgIF0gPSBicHRyW3N0cmlkZSozKzFdID0KKyAgICBicHRyW3N0cmlkZSoyKzJdID0gYnB0cltzdHJpZGUqMiszXSA9IGJwdHJbc3RyaWRlKjMrMl0gPSBicHRyW3N0cmlkZSozKzNdID0gY2VsbC0+dTsKKworICAgIGJwdHIgPSByaS0+Y3VycmVudF9mcmFtZS0+ZGF0YVsyXSArIGJvZmZzOworICAgIGJwdHJbICAgICAgICAgMF0gPSBicHRyWyAgICAgICAgIDFdID0gYnB0cltzdHJpZGUgICAgXSA9IGJwdHJbc3RyaWRlICArMV0gPQorICAgIGJwdHJbICAgICAgICAgMl0gPSBicHRyWyAgICAgICAgIDNdID0gYnB0cltzdHJpZGUgICsyXSA9IGJwdHJbc3RyaWRlICArM10gPQorICAgIGJwdHJbc3RyaWRlKjIgIF0gPSBicHRyW3N0cmlkZSoyKzFdID0gYnB0cltzdHJpZGUqMyAgXSA9IGJwdHJbc3RyaWRlKjMrMV0gPQorICAgIGJwdHJbc3RyaWRlKjIrMl0gPSBicHRyW3N0cmlkZSoyKzNdID0gYnB0cltzdHJpZGUqMysyXSA9IGJwdHJbc3RyaWRlKjMrM10gPSBjZWxsLT52OworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcHBseV9tb3Rpb25fZ2VuZXJpYyhSb3FDb250ZXh0ICpyaSwgaW50IHgsIGludCB5LCBpbnQgZGVsdGF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YXksIGludCBzeikKK3sKKyAgICBpbnQgbXgsIG15LCBjcDsKKworICAgIG14ID0geCArIGRlbHRheDsKKyAgICBteSA9IHkgKyBkZWx0YXk7CisKKyAgICAvKiBjaGVjayBNViBhZ2FpbnN0IGZyYW1lIGJvdW5kYXJpZXMgKi8KKyAgICBpZiAoKG14IDwgMCkgfHwgKG14ID4gcmktPndpZHRoIC0gc3opIHx8CisgICAgICAgIChteSA8IDApIHx8IChteSA+IHJpLT5oZWlnaHQgLSBzeikpIHsKKyAgICAgICAgYXZfbG9nKHJpLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibW90aW9uIHZlY3RvciBvdXQgb2YgYm91bmRzOiBNViA9ICglZCwgJWQpLCBib3VuZGFyaWVzID0gKDAsIDAsICVkLCAlZClcbiIsCisgICAgICAgICAgICBteCwgbXksIHJpLT53aWR0aCwgcmktPmhlaWdodCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXJpLT5sYXN0X2ZyYW1lLT5kYXRhWzBdKSB7CisgICAgICAgIGF2X2xvZyhyaS0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZGVjb2RlIHR5cGUuIEludmFsaWQgaGVhZGVyP1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IoY3AgPSAwOyBjcCA8IDM7IGNwKyspIHsKKyAgICAgICAgaW50IG91dHN0cmlkZSA9IHJpLT5jdXJyZW50X2ZyYW1lLT5saW5lc2l6ZVtjcF07CisgICAgICAgIGludCBpbnN0cmlkZSAgPSByaS0+bGFzdF9mcmFtZSAgIC0+bGluZXNpemVbY3BdOworICAgICAgICBibG9ja19jb3B5KHJpLT5jdXJyZW50X2ZyYW1lLT5kYXRhW2NwXSArIHkqb3V0c3RyaWRlICsgeCwKKyAgICAgICAgICAgICAgICAgICByaS0+bGFzdF9mcmFtZS0+ZGF0YVtjcF0gKyBteSppbnN0cmlkZSArIG14LAorICAgICAgICAgICAgICAgICAgIG91dHN0cmlkZSwgaW5zdHJpZGUsIHN6KTsKKyAgICB9Cit9CisKKwordm9pZCBmZl9hcHBseV9tb3Rpb25fNHg0KFJvcUNvbnRleHQgKnJpLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YXgsIGludCBkZWx0YXkpCit7CisgICAgYXBwbHlfbW90aW9uX2dlbmVyaWMocmksIHgsIHksIGRlbHRheCwgZGVsdGF5LCA0KTsKK30KKwordm9pZCBmZl9hcHBseV9tb3Rpb25fOHg4KFJvcUNvbnRleHQgKnJpLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YXgsIGludCBkZWx0YXkpCit7CisgICAgYXBwbHlfbW90aW9uX2dlbmVyaWMocmksIHgsIHksIGRlbHRheCwgZGVsdGF5LCA4KTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JvcXZpZGVvLmggYi9mZm1wZWcvbGliYXZjb2RlYy9yb3F2aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTZlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yb3F2aWRlby5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWlrZSBNZWxhbnNvbgorICogQ29weXJpZ2h0IChDKSAyMDAzIERyLiBUaW0gRmVyZ3Vzb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1JPUVZJREVPX0gKKyNkZWZpbmUgQVZDT0RFQ19ST1FWSURFT19ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKwordHlwZWRlZiBzdHJ1Y3Qgcm9xX2NlbGwgeworICAgIHVuc2lnbmVkIGNoYXIgeVs0XTsKKyAgICB1bnNpZ25lZCBjaGFyIHUsIHY7Cit9IHJvcV9jZWxsOworCit0eXBlZGVmIHN0cnVjdCByb3FfcWNlbGwgeworICAgIGludCBpZHhbNF07Cit9IHJvcV9xY2VsbDsKKwordHlwZWRlZiBzdHJ1Y3QgbW90aW9uX3ZlY3QgeworICAgIGludCBkWzJdOworfSBtb3Rpb25fdmVjdDsKKworc3RydWN0IFJvcVRlbXBEYXRhOworCit0eXBlZGVmIHN0cnVjdCBSb3FDb250ZXh0IHsKKworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBVkZyYW1lICpsYXN0X2ZyYW1lOworICAgIEFWRnJhbWUgKmN1cnJlbnRfZnJhbWU7CisgICAgaW50IGZpcnN0X2ZyYW1lOworCisgICAgcm9xX2NlbGwgY2IyeDJbMjU2XTsKKyAgICByb3FfcWNlbGwgY2I0eDRbMjU2XTsKKworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIGludCB3aWR0aCwgaGVpZ2h0OworCisgICAgLyogRW5jb2RlciBvbmx5IGRhdGEgKi8KKyAgICBBVkxGRyByYW5kY3R4OworICAgIHVpbnQ2NF90IGxhbWJkYTsKKworICAgIG1vdGlvbl92ZWN0ICp0aGlzX21vdGlvbjQ7CisgICAgbW90aW9uX3ZlY3QgKmxhc3RfbW90aW9uNDsKKworICAgIG1vdGlvbl92ZWN0ICp0aGlzX21vdGlvbjg7CisgICAgbW90aW9uX3ZlY3QgKmxhc3RfbW90aW9uODsKKworICAgIHVuc2lnbmVkIGludCBmcmFtZXNTaW5jZUtleWZyYW1lOworCisgICAgY29uc3QgQVZGcmFtZSAqZnJhbWVfdG9fZW5jOworICAgIHVpbnQ4X3QgKm91dF9idWY7CisgICAgc3RydWN0IFJvcVRlbXBEYXRhICp0bXBEYXRhOworCisgICAgaW50IHF1YWtlM19jb21wYXQ7IC8vIFF1YWtlIDMgY29tcGF0aWJpbGl0eSBvcHRpb24KKworfSBSb3FDb250ZXh0OworCisjZGVmaW5lIFJvUV9JTkZPICAgICAgICAgICAgICAweDEwMDEKKyNkZWZpbmUgUm9RX1FVQURfQ09ERUJPT0sgICAgIDB4MTAwMgorI2RlZmluZSBSb1FfUVVBRF9WUSAgICAgICAgICAgMHgxMDExCisjZGVmaW5lIFJvUV9TT1VORF9NT05PICAgICAgICAweDEwMjAKKyNkZWZpbmUgUm9RX1NPVU5EX1NURVJFTyAgICAgIDB4MTAyMQorCisjZGVmaW5lIFJvUV9JRF9NT1QgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUm9RX0lEX0ZDQyAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSb1FfSURfU0xEICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFJvUV9JRF9DQ0MgICAgICAgICAgICAgIDB4MDMKKwordm9pZCBmZl9hcHBseV92ZWN0b3JfMngyKFJvcUNvbnRleHQgKnJpLCBpbnQgeCwgaW50IHksIHJvcV9jZWxsICpjZWxsKTsKK3ZvaWQgZmZfYXBwbHlfdmVjdG9yXzR4NChSb3FDb250ZXh0ICpyaSwgaW50IHgsIGludCB5LCByb3FfY2VsbCAqY2VsbCk7CisKK3ZvaWQgZmZfYXBwbHlfbW90aW9uXzR4NChSb3FDb250ZXh0ICpyaSwgaW50IHgsIGludCB5LCBpbnQgZGVsdGF4LCBpbnQgZGVsdGF5KTsKKwordm9pZCBmZl9hcHBseV9tb3Rpb25fOHg4KFJvcUNvbnRleHQgKnJpLCBpbnQgeCwgaW50IHksIGludCBkZWx0YXgsIGludCBkZWx0YXkpOworCisjZW5kaWYgLyogQVZDT0RFQ19ST1FWSURFT19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9yb3F2aWRlb2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcm9xdmlkZW9kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzE2ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcm9xdmlkZW9kZWMuYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaWQgUm9RIFZpZGVvIERlY29kZXIgYnkgRHIuIFRpbSBGZXJndXNvbgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGlkIFJvUSBmb3JtYXQsIHZpc2l0OgorICogICBodHRwOi8vd3d3LmNzc2UubW9uYXNoLmVkdS5hdS9+dGltZi8KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInJvcXZpZGVvLmgiCisKK3N0YXRpYyB2b2lkIHJvcXZpZGVvX2RlY29kZV9mcmFtZShSb3FDb250ZXh0ICpyaSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgY2h1bmtfaWQgPSAwLCBjaHVua19hcmcgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgY2h1bmtfc2l6ZSA9IDA7CisgICAgaW50IGksIGosIGssIG52MSwgbnYyLCB2cWZsZyA9IDAsIHZxZmxnX3BvcyA9IC0xOworICAgIGludCB2cWlkLCB4cG9zLCB5cG9zLCB4cCwgeXAsIHgsIHksIG14LCBteTsKKyAgICBpbnQgZnJhbWVfc3RhdHNbMl1bNF0gPSB7ezB9LHswfX07CisgICAgcm9xX3FjZWxsICpxY2VsbDsKKyAgICBpbnQ2NF90IGNodW5rX3N0YXJ0OworCisgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZyaS0+Z2IpID49IDgpIHsKKyAgICAgICAgY2h1bmtfaWQgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZyaS0+Z2IpOworICAgICAgICBjaHVua19zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnJpLT5nYik7CisgICAgICAgIGNodW5rX2FyZyAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcmktPmdiKTsKKworICAgICAgICBpZihjaHVua19pZCA9PSBSb1FfUVVBRF9WUSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZihjaHVua19pZCA9PSBSb1FfUVVBRF9DT0RFQk9PSykgeworICAgICAgICAgICAgaWYoKG52MSA9IGNodW5rX2FyZyA+PiA4KSA9PSAwKQorICAgICAgICAgICAgICAgIG52MSA9IDI1NjsKKyAgICAgICAgICAgIGlmKChudjIgPSBjaHVua19hcmcgJiAweGZmKSA9PSAwICYmIG52MSAqIDYgPCBjaHVua19zaXplKQorICAgICAgICAgICAgICAgIG52MiA9IDI1NjsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IG52MTsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmktPmNiMngyW2ldLnlbMF0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcmktPmdiKTsKKyAgICAgICAgICAgICAgICByaS0+Y2IyeDJbaV0ueVsxXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZyaS0+Z2IpOworICAgICAgICAgICAgICAgIHJpLT5jYjJ4MltpXS55WzJdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnJpLT5nYik7CisgICAgICAgICAgICAgICAgcmktPmNiMngyW2ldLnlbM10gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcmktPmdiKTsKKyAgICAgICAgICAgICAgICByaS0+Y2IyeDJbaV0udSAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZyaS0+Z2IpOworICAgICAgICAgICAgICAgIHJpLT5jYjJ4MltpXS52ICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnJpLT5nYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBudjI7IGkrKykKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHJpLT5jYjR4NFtpXS5pZHhbal0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcmktPmdiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNodW5rX3N0YXJ0ID0gYnl0ZXN0cmVhbTJfdGVsbCgmcmktPmdiKTsKKyAgICB4cG9zID0geXBvcyA9IDA7CisKKyAgICBpZiAoY2h1bmtfc2l6ZSA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZyaS0+Z2IpKSB7CisgICAgICAgIGF2X2xvZyhyaS0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNodW5rIGRvZXMgbm90IGZpdCBpbiBpbnB1dCBidWZmZXJcbiIpOworICAgICAgICBjaHVua19zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnJpLT5nYik7CisgICAgfQorCisgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX3RlbGwoJnJpLT5nYikgPCBjaHVua19zdGFydCArIGNodW5rX3NpemUpIHsKKyAgICAgICAgZm9yICh5cCA9IHlwb3M7IHlwIDwgeXBvcyArIDE2OyB5cCArPSA4KQorICAgICAgICAgICAgZm9yICh4cCA9IHhwb3M7IHhwIDwgeHBvcyArIDE2OyB4cCArPSA4KSB7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJnJpLT5nYikgPj0gY2h1bmtfc3RhcnQgKyBjaHVua19zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhyaS0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ2h1bmsgaXMgdG9vIHNob3J0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodnFmbGdfcG9zIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB2cWZsZyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZyaS0+Z2IpOworICAgICAgICAgICAgICAgICAgICB2cWZsZ19wb3MgPSA3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2cWlkID0gKHZxZmxnID4+ICh2cWZsZ19wb3MgKiAyKSkgJiAweDM7CisgICAgICAgICAgICAgICAgZnJhbWVfc3RhdHNbMF1bdnFpZF0rKzsKKyAgICAgICAgICAgICAgICB2cWZsZ19wb3MtLTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCh2cWlkKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSb1FfSURfTU9UOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJvUV9JRF9GQ0M6IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcmktPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgbXggPSA4IC0gKGJ5dGUgPj4gNCkgLSAoKHNpZ25lZCBjaGFyKSAoY2h1bmtfYXJnID4+IDgpKTsKKyAgICAgICAgICAgICAgICAgICAgbXkgPSA4IC0gKGJ5dGUgJiAweGYpIC0gKChzaWduZWQgY2hhcikgY2h1bmtfYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgZmZfYXBwbHlfbW90aW9uXzh4OChyaSwgeHAsIHlwLCBteCwgbXkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBSb1FfSURfU0xEOgorICAgICAgICAgICAgICAgICAgICBxY2VsbCA9IHJpLT5jYjR4NCArIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZyaS0+Z2IpOworICAgICAgICAgICAgICAgICAgICBmZl9hcHBseV92ZWN0b3JfNHg0KHJpLCB4cCwgICAgIHlwLCAgICAgcmktPmNiMngyICsgcWNlbGwtPmlkeFswXSk7CisgICAgICAgICAgICAgICAgICAgIGZmX2FwcGx5X3ZlY3Rvcl80eDQocmksIHhwICsgNCwgeXAsICAgICByaS0+Y2IyeDIgKyBxY2VsbC0+aWR4WzFdKTsKKyAgICAgICAgICAgICAgICAgICAgZmZfYXBwbHlfdmVjdG9yXzR4NChyaSwgeHAsICAgICB5cCArIDQsIHJpLT5jYjJ4MiArIHFjZWxsLT5pZHhbMl0pOworICAgICAgICAgICAgICAgICAgICBmZl9hcHBseV92ZWN0b3JfNHg0KHJpLCB4cCArIDQsIHlwICsgNCwgcmktPmNiMngyICsgcWNlbGwtPmlkeFszXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUm9RX0lEX0NDQzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHhwOyB5ID0geXA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihrICYgMHgwMSkgeCArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoayAmIDB4MDIpIHkgKz0gNDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJnJpLT5nYikgPj0gY2h1bmtfc3RhcnQgKyBjaHVua19zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHJpLT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJDaHVuayBpcyB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cWZsZ19wb3MgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnFmbGcgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcmktPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cWZsZ19wb3MgPSA3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdnFpZCA9ICh2cWZsZyA+PiAodnFmbGdfcG9zICogMikpICYgMHgzOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfc3RhdHNbMV1bdnFpZF0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZxZmxnX3Bvcy0tOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHZxaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9RX0lEX01PVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9RX0lEX0ZDQzogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnJpLT5nYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXggPSA4IC0gKGJ5dGUgPj4gNCkgLSAoKHNpZ25lZCBjaGFyKSAoY2h1bmtfYXJnID4+IDgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSA9IDggLSAoYnl0ZSAmIDB4ZikgLSAoKHNpZ25lZCBjaGFyKSBjaHVua19hcmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FwcGx5X21vdGlvbl80eDQocmksIHgsIHksIG14LCBteSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvUV9JRF9TTEQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNlbGwgPSByaS0+Y2I0eDQgKyBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcmktPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9hcHBseV92ZWN0b3JfMngyKHJpLCB4LCAgICAgeSwgICAgIHJpLT5jYjJ4MiArIHFjZWxsLT5pZHhbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FwcGx5X3ZlY3Rvcl8yeDIocmksIHggKyAyLCB5LCAgICAgcmktPmNiMngyICsgcWNlbGwtPmlkeFsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfYXBwbHlfdmVjdG9yXzJ4MihyaSwgeCwgICAgIHkgKyAyLCByaS0+Y2IyeDIgKyBxY2VsbC0+aWR4WzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9hcHBseV92ZWN0b3JfMngyKHJpLCB4ICsgMiwgeSArIDIsIHJpLT5jYjJ4MiArIHFjZWxsLT5pZHhbM10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb1FfSURfQ0NDOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FwcGx5X3ZlY3Rvcl8yeDIocmksIHgsICAgICB5LCAgICAgcmktPmNiMngyICsgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnJpLT5nYikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FwcGx5X3ZlY3Rvcl8yeDIocmksIHggKyAyLCB5LCAgICAgcmktPmNiMngyICsgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnJpLT5nYikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FwcGx5X3ZlY3Rvcl8yeDIocmksIHgsICAgICB5ICsgMiwgcmktPmNiMngyICsgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnJpLT5nYikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FwcGx5X3ZlY3Rvcl8yeDIocmksIHggKyAyLCB5ICsgMiwgcmktPmNiMngyICsgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnJpLT5nYikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB4cG9zICs9IDE2OworICAgICAgICBpZiAoeHBvcyA+PSByaS0+d2lkdGgpIHsKKyAgICAgICAgICAgIHhwb3MgLT0gcmktPndpZHRoOworICAgICAgICAgICAgeXBvcyArPSAxNjsKKyAgICAgICAgfQorICAgICAgICBpZih5cG9zID49IHJpLT5oZWlnaHQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IHJvcV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUm9xQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworCisgICAgaWYgKGF2Y3R4LT53aWR0aCAlIDE2IHx8IGF2Y3R4LT5oZWlnaHQgJSAxNikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJEaW1lbnNpb25zIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBzLT53aWR0aCA9IGF2Y3R4LT53aWR0aDsKKyAgICBzLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgcy0+bGFzdF9mcmFtZSAgICA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgcy0+Y3VycmVudF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5jdXJyZW50X2ZyYW1lIHx8ICFzLT5sYXN0X2ZyYW1lKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmN1cnJlbnRfZnJhbWUpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5sYXN0X2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWSjQ0NFA7CisgICAgYXZjdHgtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfSlBFRzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvcV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBSb3FDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgY29weT0gIXMtPmN1cnJlbnRfZnJhbWUtPmRhdGFbMF07CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5jdXJyZW50X2ZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYoY29weSkKKyAgICAgICAgYXZfcGljdHVyZV9jb3B5KChBVlBpY3R1cmUqKXMtPmN1cnJlbnRfZnJhbWUsIChBVlBpY3R1cmUqKXMtPmxhc3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmdiLCBidWYsIGJ1Zl9zaXplKTsKKyAgICByb3F2aWRlb19kZWNvZGVfZnJhbWUocyk7CisKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5jdXJyZW50X2ZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgICpnb3RfZnJhbWUgICAgICA9IDE7CisKKyAgICAvKiBzaHVmZmxlIGZyYW1lcyAqLworICAgIEZGU1dBUChBVkZyYW1lICosIHMtPmN1cnJlbnRfZnJhbWUsIHMtPmxhc3RfZnJhbWUpOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcm9xX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFJvcUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+Y3VycmVudF9mcmFtZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9mcmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9yb3FfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicm9xdmlkZW8iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJpZCBSb1EgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUk9RLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihSb3FDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSByb3FfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gcm9xX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gcm9xX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3JvcXZpZGVvZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9yb3F2aWRlb2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDc5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9yb3F2aWRlb2VuYy5jCkBAIC0wLDAgKzEsMTExNSBAQAorLyoKKyAqIFJvUSBWaWRlbyBFbmNvZGVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBWaXRvciBTZXNzYWsgPHZpdG9yMTAwMUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBFcmljIExhc290YQorICogICAgQmFzZWQgb24gUm9RIHNwZWNzIChDKSAyMDAxIFRpbSBGZXJndXNvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBpZCBSb1EgZW5jb2RlciBieSBWaXRvci4gQmFzZWQgb24gdGhlIFN3aXRjaGJsYWRlMyBsaWJyYXJ5IGFuZCB0aGUKKyAqIFN3aXRjaGJsYWRlMyBGRm1wZWcgZ2x1ZSBieSBFcmljIExhc290YS4KKyAqLworCisvKgorICogQ09TVFM6CisgKiBMZXZlbCAxOgorICogIFNLSVAgLSAyIGJpdHMKKyAqICBNT1RJT04gLSAyICsgOCBiaXRzCisgKiAgQ09ERUJPT0sgLSAyICsgOCBiaXRzCisgKiAgU1VCRElWSURFIC0gMiArIGNvbWJpbmVkIHN1YmNlbCBjb3N0CisgKgorICogTGV2ZWwgMjoKKyAqICBTS0lQIC0gMiBiaXRzCisgKiAgTU9USU9OIC0gMiArIDggYml0cworICogIENPREVCT09LIC0gMiArIDggYml0cworICogIFNVQkRJVklERSAtIDIgKyA0KjggYml0cworICoKKyAqIE1heGltdW0gY29zdDogMTM4IGJpdHMgcGVyIGNlbAorICoKKyAqIFByb3BlciBldmFsdWF0aW9uIHJlcXVpcmVzIExDRCBmcmFjdGlvbiBjb21wYXJpc29uLCB3aGljaCByZXF1aXJlcworICogU3F1YXJlZCBFcnJvciAoU0UpIGxvc3MgKiBzYXZpbmdzIGluY3JlYXNlCisgKgorICogTWF4aW11bSBzYXZpbmdzIGluY3JlYXNlOiAxMzYgYml0cworICogTWF4aW11bSBTRSBsb3NzIHdpdGhvdXQgb3ZlcmZsb3c6IDMxNTgwNjQxCisgKiBDb21wb25lbnRzIGluIDh4OCBzdXBlcmNlbDogMTkyCisgKiBNYXhpbXVtIFNFIHByZWNpc2lvbiBwZXIgY29tcG9uZW50OiAxNjQ0ODIKKyAqICAgID42NTAyNSwgc28gbm8gdHJ1bmNhdGlvbiBpcyBuZWVkZWQgKHBoZXcpCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAicm9xdmlkZW8uaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiZWxiZy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCisjZGVmaW5lIENIUk9NQV9CSUFTIDEKKworLyoqCisgKiBNYXhpbXVtIG51bWJlciBvZiBnZW5lcmF0ZWQgNHg0IGNvZGVib29rcy4gQ2FuJ3QgYmUgMjU2IHRvIHdvcmthcm91bmQgYQorICogUXVha2UgMyBidWcuCisgKi8KKyNkZWZpbmUgTUFYX0NCU180eDQgMjU2CisKKyNkZWZpbmUgTUFYX0NCU18yeDIgMjU2IC8vLzwgTWF4aW11bSBudW1iZXIgb2YgMngyIGNvZGVib29rcy4KKworLyogVGhlIGNhc3QgaXMgdXNlZnVsIHdoZW4gbXVsdGlwbHlpbmcgaXQgYnkgSU5UX01BWCAqLworI2RlZmluZSBST1FfTEFNQkRBX1NDQUxFICgodWludDY0X3QpIEZGX0xBTUJEQV9TQ0FMRSkKKworLyogTWFjcm9ibG9jayBzdXBwb3J0IGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgdW5wYWNrX3JvcV9jZWxsKHJvcV9jZWxsICpjZWxsLCB1aW50OF90IHVbNCozXSkKK3sKKyAgICBtZW1jcHkodSAgLCBjZWxsLT55LCA0KTsKKyAgICBtZW1zZXQodSs0LCBjZWxsLT51LCA0KTsKKyAgICBtZW1zZXQodSs4LCBjZWxsLT52LCA0KTsKK30KKworc3RhdGljIHZvaWQgdW5wYWNrX3JvcV9xY2VsbCh1aW50OF90IGNiMltdLCByb3FfcWNlbGwgKnFjZWxsLCB1aW50OF90IHVbNCo0KjNdKQoreworICAgIGludCBpLGNwOworICAgIHN0YXRpYyBjb25zdCBpbnQgb2Zmc2V0c1s0XSA9IHswLCAyLCA4LCAxMH07CisKKyAgICBmb3IgKGNwPTA7IGNwPDM7IGNwKyspCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykgeworICAgICAgICAgICAgdVs0KjQqY3AgKyBvZmZzZXRzW2ldICBdID0gY2IyW3FjZWxsLT5pZHhbaV0qMioyKjMgKyA0KmNwICBdOworICAgICAgICAgICAgdVs0KjQqY3AgKyBvZmZzZXRzW2ldKzFdID0gY2IyW3FjZWxsLT5pZHhbaV0qMioyKjMgKyA0KmNwKzFdOworICAgICAgICAgICAgdVs0KjQqY3AgKyBvZmZzZXRzW2ldKzRdID0gY2IyW3FjZWxsLT5pZHhbaV0qMioyKjMgKyA0KmNwKzJdOworICAgICAgICAgICAgdVs0KjQqY3AgKyBvZmZzZXRzW2ldKzVdID0gY2IyW3FjZWxsLT5pZHhbaV0qMioyKjMgKyA0KmNwKzNdOworICAgICAgICB9Cit9CisKKworc3RhdGljIHZvaWQgZW5sYXJnZV9yb3FfbWI0KHVpbnQ4X3QgYmFzZVszKjE2XSwgdWludDhfdCB1WzMqNjRdKQoreworICAgIGludCB4LHksY3A7CisKKyAgICBmb3IoY3A9MDsgY3A8MzsgY3ArKykKKyAgICAgICAgZm9yKHk9MDsgeTw4OyB5KyspCisgICAgICAgICAgICBmb3IoeD0wOyB4PDg7IHgrKykKKyAgICAgICAgICAgICAgICAqdSsrID0gYmFzZVsoeS8yKSo0ICsgKHgvMikgKyAxNipjcF07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNxdWFyZShpbnQgeCkKK3sKKyAgICByZXR1cm4geCp4OworfQorCitzdGF0aWMgaW5saW5lIGludCBldmFsX3NzZShjb25zdCB1aW50OF90ICphLCBjb25zdCB1aW50OF90ICpiLCBpbnQgY291bnQpCit7CisgICAgaW50IGRpZmY9MDsKKworICAgIHdoaWxlKGNvdW50LS0pCisgICAgICAgIGRpZmYgKz0gc3F1YXJlKCpiKysgLSAqYSsrKTsKKworICAgIHJldHVybiBkaWZmOworfQorCisvLyBGSVhNRSBDb3VsZCB1c2UgRFNQQ29udGV4dC5zc2UsIGJ1dCBpdCBpcyBub3Qgc28gc3BlZWQgY3JpdGljYWwgKHVzZWQKKy8vIGp1c3QgZm9yIG1vdGlvbiBlc3RpbWF0aW9uKS4KK3N0YXRpYyBpbnQgYmxvY2tfc3NlKHVpbnQ4X3QgKiBjb25zdCAqYnVmMSwgdWludDhfdCAqIGNvbnN0ICpidWYyLCBpbnQgeDEsIGludCB5MSwKKyAgICAgICAgICAgICAgICAgICAgIGludCB4MiwgaW50IHkyLCBjb25zdCBpbnQgKnN0cmlkZTEsIGNvbnN0IGludCAqc3RyaWRlMiwgaW50IHNpemUpCit7CisgICAgaW50IGksIGs7CisgICAgaW50IHNzZT0wOworCisgICAgZm9yIChrPTA7IGs8MzsgaysrKSB7CisgICAgICAgIGludCBiaWFzID0gKGsgPyBDSFJPTUFfQklBUyA6IDQpOworICAgICAgICBmb3IgKGk9MDsgaTxzaXplOyBpKyspCisgICAgICAgICAgICBzc2UgKz0gYmlhcypldmFsX3NzZShidWYxW2tdICsgKHkxK2kpKnN0cmlkZTFba10gKyB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZjJba10gKyAoeTIraSkqc3RyaWRlMltrXSArIHgyLCBzaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3NlOworfQorCitzdGF0aWMgaW50IGV2YWxfbW90aW9uX2Rpc3QoUm9xQ29udGV4dCAqZW5jLCBpbnQgeCwgaW50IHksIG1vdGlvbl92ZWN0IHZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKQoreworICAgIGludCBteD12ZWN0LmRbMF07CisgICAgaW50IG15PXZlY3QuZFsxXTsKKworICAgIGlmIChteCA8IC03IHx8IG14ID4gNykKKyAgICAgICAgcmV0dXJuIElOVF9NQVg7CisKKyAgICBpZiAobXkgPCAtNyB8fCBteSA+IDcpCisgICAgICAgIHJldHVybiBJTlRfTUFYOworCisgICAgbXggKz0geDsKKyAgICBteSArPSB5OworCisgICAgaWYgKCh1bnNpZ25lZCkgbXggPiBlbmMtPndpZHRoLXNpemUgfHwgKHVuc2lnbmVkKSBteSA+IGVuYy0+aGVpZ2h0LXNpemUpCisgICAgICAgIHJldHVybiBJTlRfTUFYOworCisgICAgcmV0dXJuIGJsb2NrX3NzZShlbmMtPmZyYW1lX3RvX2VuYy0+ZGF0YSwgZW5jLT5sYXN0X2ZyYW1lLT5kYXRhLCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgbXgsIG15LAorICAgICAgICAgICAgICAgICAgICAgZW5jLT5mcmFtZV90b19lbmMtPmxpbmVzaXplLCBlbmMtPmxhc3RfZnJhbWUtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Cit9CisKKy8qKgorICogQHJldHVybiBkaXN0b3J0aW9uIGJldHdlZW4gdHdvIG1hY3JvYmxvY2tzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNxdWFyZWRfZGlmZl9tYWNyb2Jsb2NrKHVpbnQ4X3QgYVtdLCB1aW50OF90IGJbXSwgaW50IHNpemUpCit7CisgICAgaW50IGNwLCBzZGlmZj0wOworCisgICAgZm9yKGNwPTA7Y3A8MztjcCsrKSB7CisgICAgICAgIGludCBiaWFzID0gKGNwID8gQ0hST01BX0JJQVMgOiA0KTsKKyAgICAgICAgc2RpZmYgKz0gYmlhcypldmFsX3NzZShhLCBiLCBzaXplKnNpemUpOworICAgICAgICBhICs9IHNpemUqc2l6ZTsKKyAgICAgICAgYiArPSBzaXplKnNpemU7CisgICAgfQorCisgICAgcmV0dXJuIHNkaWZmOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBldmFsX2Rpc3RbNF07CisgICAgaW50IGJlc3RfYml0X3VzZTsKKyAgICBpbnQgYmVzdF9jb2Rpbmc7CisKKyAgICBpbnQgc3ViQ2Vsc1s0XTsKKyAgICBtb3Rpb25fdmVjdCBtb3Rpb247CisgICAgaW50IGNiRW50cnk7Cit9IFN1YmNlbEV2YWx1YXRpb247CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IGV2YWxfZGlzdFs0XTsKKyAgICBpbnQgYmVzdF9jb2Rpbmc7CisKKyAgICBTdWJjZWxFdmFsdWF0aW9uIHN1YkNlbHNbNF07CisKKyAgICBtb3Rpb25fdmVjdCBtb3Rpb247CisgICAgaW50IGNiRW50cnk7CisKKyAgICBpbnQgc291cmNlWCwgc291cmNlWTsKK30gQ2VsRXZhbHVhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgbnVtQ0I0OworICAgIGludCBudW1DQjI7CisgICAgaW50IHVzZWRDQjJbTUFYX0NCU18yeDJdOworICAgIGludCB1c2VkQ0I0W01BWF9DQlNfNHg0XTsKKyAgICB1aW50OF90IHVucGFja2VkX2NiMltNQVhfQ0JTXzJ4MioyKjIqM107CisgICAgdWludDhfdCB1bnBhY2tlZF9jYjRbTUFYX0NCU180eDQqNCo0KjNdOworICAgIHVpbnQ4X3QgdW5wYWNrZWRfY2I0X2VubGFyZ2VkW01BWF9DQlNfNHg0KjgqOCozXTsKK30gUm9xQ29kZWJvb2tzOworCisvKioKKyAqIFRlbXBvcmFyeSB2YXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IFJvcVRlbXBEYXRhCit7CisgICAgQ2VsRXZhbHVhdGlvbiAqY2VsX2V2YWxzOworCisgICAgaW50IGYyaTRbTUFYX0NCU180eDRdOworICAgIGludCBpMmY0W01BWF9DQlNfNHg0XTsKKyAgICBpbnQgZjJpMltNQVhfQ0JTXzJ4Ml07CisgICAgaW50IGkyZjJbTUFYX0NCU18yeDJdOworCisgICAgaW50IG1haW5DaHVua1NpemU7CisKKyAgICBpbnQgbnVtQ0I0OworICAgIGludCBudW1DQjI7CisKKyAgICBSb3FDb2RlYm9va3MgY29kZWJvb2tzOworCisgICAgaW50ICpjbG9zZXN0X2NiMjsKKyAgICBpbnQgdXNlZF9vcHRpb25bNF07Cit9IFJvcVRlbXBkYXRhOworCisvKioKKyAqIEluaXRpYWxpemUgY2VsIGV2YWx1YXRvcnMgYW5kIHNldCB0aGVpciBzb3VyY2UgY29vcmRpbmF0ZXMKKyAqLworc3RhdGljIHZvaWQgY3JlYXRlX2NlbF9ldmFscyhSb3FDb250ZXh0ICplbmMsIFJvcVRlbXBkYXRhICp0ZW1wRGF0YSkKK3sKKyAgICBpbnQgbj0wLCB4LCB5LCBpOworCisgICAgdGVtcERhdGEtPmNlbF9ldmFscyA9IGF2X21hbGxvY19hcnJheShlbmMtPndpZHRoKmVuYy0+aGVpZ2h0LzY0LCBzaXplb2YoQ2VsRXZhbHVhdGlvbikpOworCisgICAgLyogTWFwIHRvIHRoZSBST1EgcXVhZHRyZWUgb3JkZXIgKi8KKyAgICBmb3IgKHk9MDsgeTxlbmMtPmhlaWdodDsgeSs9MTYpCisgICAgICAgIGZvciAoeD0wOyB4PGVuYy0+d2lkdGg7IHgrPTE2KQorICAgICAgICAgICAgZm9yKGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgICAgICAgICB0ZW1wRGF0YS0+Y2VsX2V2YWxzW24gIF0uc291cmNlWCA9IHggKyAoaSYxKSo4OworICAgICAgICAgICAgICAgIHRlbXBEYXRhLT5jZWxfZXZhbHNbbisrXS5zb3VyY2VZID0geSArIChpJjIpKjQ7CisgICAgICAgICAgICB9Cit9CisKKy8qKgorICogR2V0IG1hY3JvYmxvY2tzIGZyb20gcGFydHMgb2YgdGhlIGltYWdlCisgKi8KK3N0YXRpYyB2b2lkIGdldF9mcmFtZV9tYihjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50IHgsIGludCB5LCB1aW50OF90IG1iW10sIGludCBkaW0pCit7CisgICAgaW50IGksIGosIGNwOworCisgICAgZm9yIChjcD0wOyBjcDwzOyBjcCsrKSB7CisgICAgICAgIGludCBzdHJpZGUgPSBmcmFtZS0+bGluZXNpemVbY3BdOworICAgICAgICBmb3IgKGk9MDsgaTxkaW07IGkrKykKKyAgICAgICAgICAgIGZvciAoaj0wOyBqPGRpbTsgaisrKQorICAgICAgICAgICAgICAgICptYisrID0gZnJhbWUtPmRhdGFbY3BdWyh5K2kpKnN0cmlkZSArIHggKyBqXTsKKyAgICB9Cit9CisKKy8qKgorICogRmluZCB0aGUgY29kZWJvb2sgd2l0aCB0aGUgbG93ZXN0IGRpc3RvcnRpb24gZnJvbSBhbiBpbWFnZQorICovCitzdGF0aWMgaW50IGluZGV4X21iKHVpbnQ4X3QgY2x1c3RlcltdLCB1aW50OF90IGNiW10sIGludCBudW1DQiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICpvdXRJbmRleCwgaW50IGRpbSkKK3sKKyAgICBpbnQgaSwgbERpZmYgPSBJTlRfTUFYLCBwaWNrPTA7CisKKyAgICAvKiBEaWZmIGFnYWluc3QgdGhlIG90aGVycyAqLworICAgIGZvciAoaT0wOyBpPG51bUNCOyBpKyspIHsKKyAgICAgICAgaW50IGRpZmYgPSBzcXVhcmVkX2RpZmZfbWFjcm9ibG9jayhjbHVzdGVyLCBjYiArIGkqZGltKmRpbSozLCBkaW0pOworICAgICAgICBpZiAoZGlmZiA8IGxEaWZmKSB7CisgICAgICAgICAgICBsRGlmZiA9IGRpZmY7CisgICAgICAgICAgICBwaWNrID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpvdXRJbmRleCA9IHBpY2s7CisgICAgcmV0dXJuIGxEaWZmOworfQorCisjZGVmaW5lIEVWQUxfTU9USU9OKE1PVElPTikgXAorICAgIGRvIHsgXAorICAgICAgICBkaWZmID0gZXZhbF9tb3Rpb25fZGlzdChlbmMsIGosIGksIE1PVElPTiwgYmxvY2tzaXplKTsgXAorICAgICAgICAgICAgXAorICAgICAgICBpZiAoZGlmZiA8IGxvd2VzdGRpZmYpIHsgXAorICAgICAgICAgICAgbG93ZXN0ZGlmZiA9IGRpZmY7IFwKKyAgICAgICAgICAgIGJlc3RwaWNrID0gTU9USU9OOyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUoMCkKKworc3RhdGljIHZvaWQgbW90aW9uX3NlYXJjaChSb3FDb250ZXh0ICplbmMsIGludCBibG9ja3NpemUpCit7CisgICAgc3RhdGljIGNvbnN0IG1vdGlvbl92ZWN0IG9mZnNldHNbOF0gPSB7CisgICAgICAgIHt7IDAsLTF9fSwKKyAgICAgICAge3sgMCwgMX19LAorICAgICAgICB7ey0xLCAwfX0sCisgICAgICAgIHt7IDEsIDB9fSwKKyAgICAgICAge3stMSwgMX19LAorICAgICAgICB7eyAxLC0xfX0sCisgICAgICAgIHt7LTEsLTF9fSwKKyAgICAgICAge3sgMSwgMX19LAorICAgIH07CisKKyAgICBpbnQgZGlmZiwgbG93ZXN0ZGlmZiwgb2xkYmVzdDsKKyAgICBpbnQgb2ZmWzNdOworICAgIG1vdGlvbl92ZWN0IGJlc3RwaWNrID0ge3swLDB9fTsKKyAgICBpbnQgaSwgaiwgaywgb2Zmc2V0OworCisgICAgbW90aW9uX3ZlY3QgKmxhc3RfbW90aW9uOworICAgIG1vdGlvbl92ZWN0ICp0aGlzX21vdGlvbjsKKyAgICBtb3Rpb25fdmVjdCB2ZWN0LCB2ZWN0MjsKKworICAgIGludCBtYXg9KGVuYy0+d2lkdGgvYmxvY2tzaXplKSplbmMtPmhlaWdodC9ibG9ja3NpemU7CisKKyAgICBpZiAoYmxvY2tzaXplID09IDQpIHsKKyAgICAgICAgbGFzdF9tb3Rpb24gPSBlbmMtPmxhc3RfbW90aW9uNDsKKyAgICAgICAgdGhpc19tb3Rpb24gPSBlbmMtPnRoaXNfbW90aW9uNDsKKyAgICB9IGVsc2UgeworICAgICAgICBsYXN0X21vdGlvbiA9IGVuYy0+bGFzdF9tb3Rpb244OworICAgICAgICB0aGlzX21vdGlvbiA9IGVuYy0+dGhpc19tb3Rpb244OworICAgIH0KKworICAgIGZvciAoaT0wOyBpPGVuYy0+aGVpZ2h0OyBpKz1ibG9ja3NpemUpCisgICAgICAgIGZvciAoaj0wOyBqPGVuYy0+d2lkdGg7IGorPWJsb2Nrc2l6ZSkgeworICAgICAgICAgICAgbG93ZXN0ZGlmZiA9IGV2YWxfbW90aW9uX2Rpc3QoZW5jLCBqLCBpLCAobW90aW9uX3ZlY3QpIHt7MCwwfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NpemUpOworICAgICAgICAgICAgYmVzdHBpY2suZFswXSA9IDA7CisgICAgICAgICAgICBiZXN0cGljay5kWzFdID0gMDsKKworICAgICAgICAgICAgaWYgKGJsb2Nrc2l6ZSA9PSA0KQorICAgICAgICAgICAgICAgIEVWQUxfTU9USU9OKGVuYy0+dGhpc19tb3Rpb244WyhpLzgpKihlbmMtPndpZHRoLzgpICsgai84XSk7CisKKyAgICAgICAgICAgIG9mZnNldCA9IChpL2Jsb2Nrc2l6ZSkqZW5jLT53aWR0aC9ibG9ja3NpemUgKyBqL2Jsb2Nrc2l6ZTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCBtYXggJiYgb2Zmc2V0ID49IDApCisgICAgICAgICAgICAgICAgRVZBTF9NT1RJT04obGFzdF9tb3Rpb25bb2Zmc2V0XSk7CisKKyAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgaWYgKG9mZnNldCA8IG1heCAmJiBvZmZzZXQgPj0gMCkKKyAgICAgICAgICAgICAgICBFVkFMX01PVElPTihsYXN0X21vdGlvbltvZmZzZXRdKTsKKworICAgICAgICAgICAgb2Zmc2V0ID0gKGkvYmxvY2tzaXplICsgMSkqZW5jLT53aWR0aC9ibG9ja3NpemUgKyBqL2Jsb2Nrc2l6ZTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCBtYXggJiYgb2Zmc2V0ID49IDApCisgICAgICAgICAgICAgICAgRVZBTF9NT1RJT04obGFzdF9tb3Rpb25bb2Zmc2V0XSk7CisKKyAgICAgICAgICAgIG9mZlswXT0gKGkvYmxvY2tzaXplKSplbmMtPndpZHRoL2Jsb2Nrc2l6ZSArIGovYmxvY2tzaXplIC0gMTsKKyAgICAgICAgICAgIG9mZlsxXT0gb2ZmWzBdIC0gZW5jLT53aWR0aC9ibG9ja3NpemUgKyAxOworICAgICAgICAgICAgb2ZmWzJdPSBvZmZbMV0gKyAxOworCisgICAgICAgICAgICBpZiAoaSkgeworCisgICAgICAgICAgICAgICAgZm9yKGs9MDsgazwyOyBrKyspCisgICAgICAgICAgICAgICAgICAgIHZlY3QuZFtrXT0gbWlkX3ByZWQodGhpc19tb3Rpb25bb2ZmWzBdXS5kW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfbW90aW9uW29mZlsxXV0uZFtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX21vdGlvbltvZmZbMl1dLmRba10pOworCisgICAgICAgICAgICAgICAgRVZBTF9NT1RJT04odmVjdCk7CisgICAgICAgICAgICAgICAgZm9yKGs9MDsgazwzOyBrKyspCisgICAgICAgICAgICAgICAgICAgIEVWQUxfTU9USU9OKHRoaXNfbW90aW9uW29mZltrXV0pOworICAgICAgICAgICAgfSBlbHNlIGlmKGopCisgICAgICAgICAgICAgICAgRVZBTF9NT1RJT04odGhpc19tb3Rpb25bb2ZmWzBdXSk7CisKKyAgICAgICAgICAgIHZlY3QgPSBiZXN0cGljazsKKworICAgICAgICAgICAgb2xkYmVzdCA9IC0xOworICAgICAgICAgICAgd2hpbGUgKG9sZGJlc3QgIT0gbG93ZXN0ZGlmZikgeworICAgICAgICAgICAgICAgIG9sZGJlc3QgPSBsb3dlc3RkaWZmOworICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrPDg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICB2ZWN0MiA9IHZlY3Q7CisgICAgICAgICAgICAgICAgICAgIHZlY3QyLmRbMF0gKz0gb2Zmc2V0c1trXS5kWzBdOworICAgICAgICAgICAgICAgICAgICB2ZWN0Mi5kWzFdICs9IG9mZnNldHNba10uZFsxXTsKKyAgICAgICAgICAgICAgICAgICAgRVZBTF9NT1RJT04odmVjdDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2ZWN0ID0gYmVzdHBpY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgPSAoaS9ibG9ja3NpemUpKmVuYy0+d2lkdGgvYmxvY2tzaXplICsgai9ibG9ja3NpemU7CisgICAgICAgICAgICB0aGlzX21vdGlvbltvZmZzZXRdID0gYmVzdHBpY2s7CisgICAgICAgIH0KK30KKworLyoqCisgKiBHZXQgZGlzdG9ydGlvbiBmb3IgYWxsIG9wdGlvbnMgYXZhaWxhYmxlIHRvIGEgc3ViY2VsCisgKi8KK3N0YXRpYyB2b2lkIGdhdGhlcl9kYXRhX2Zvcl9zdWJjZWwoU3ViY2VsRXZhbHVhdGlvbiAqc3ViY2VsLCBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksIFJvcUNvbnRleHQgKmVuYywgUm9xVGVtcGRhdGEgKnRlbXBEYXRhKQoreworICAgIHVpbnQ4X3QgbWI0WzQqNCozXTsKKyAgICB1aW50OF90IG1iMlsyKjIqM107CisgICAgaW50IGNsdXN0ZXJfaW5kZXg7CisgICAgaW50IGksIGJlc3RfZGlzdDsKKworICAgIHN0YXRpYyBjb25zdCBpbnQgYml0c1VzZWRbNF0gPSB7MiwgMTAsIDEwLCAzNH07CisKKyAgICBpZiAoZW5jLT5mcmFtZXNTaW5jZUtleWZyYW1lID49IDEpIHsKKyAgICAgICAgc3ViY2VsLT5tb3Rpb24gPSBlbmMtPnRoaXNfbW90aW9uNFt5KmVuYy0+d2lkdGgvMTYgKyB4LzRdOworCisgICAgICAgIHN1YmNlbC0+ZXZhbF9kaXN0W1JvUV9JRF9GQ0NdID0KKyAgICAgICAgICAgIGV2YWxfbW90aW9uX2Rpc3QoZW5jLCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPnRoaXNfbW90aW9uNFt5KmVuYy0+d2lkdGgvMTYgKyB4LzRdLCA0KTsKKyAgICB9IGVsc2UKKyAgICAgICAgc3ViY2VsLT5ldmFsX2Rpc3RbUm9RX0lEX0ZDQ10gPSBJTlRfTUFYOworCisgICAgaWYgKGVuYy0+ZnJhbWVzU2luY2VLZXlmcmFtZSA+PSAyKQorICAgICAgICBzdWJjZWwtPmV2YWxfZGlzdFtSb1FfSURfTU9UXSA9IGJsb2NrX3NzZShlbmMtPmZyYW1lX3RvX2VuYy0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5jdXJyZW50X2ZyYW1lLT5kYXRhLCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPmZyYW1lX3RvX2VuYy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Y3VycmVudF9mcmFtZS0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOworICAgIGVsc2UKKyAgICAgICAgc3ViY2VsLT5ldmFsX2Rpc3RbUm9RX0lEX01PVF0gPSBJTlRfTUFYOworCisgICAgY2x1c3Rlcl9pbmRleCA9IHkqZW5jLT53aWR0aC8xNiArIHgvNDsKKworICAgIGdldF9mcmFtZV9tYihlbmMtPmZyYW1lX3RvX2VuYywgeCwgeSwgbWI0LCA0KTsKKworICAgIHN1YmNlbC0+ZXZhbF9kaXN0W1JvUV9JRF9TTERdID0gaW5kZXhfbWIobWI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcERhdGEtPmNvZGVib29rcy51bnBhY2tlZF9jYjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YS0+Y29kZWJvb2tzLm51bUNCNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJjZWwtPmNiRW50cnksIDQpOworCisgICAgc3ViY2VsLT5ldmFsX2Rpc3RbUm9RX0lEX0NDQ10gPSAwOworCisgICAgZm9yKGk9MDtpPDQ7aSsrKSB7CisgICAgICAgIHN1YmNlbC0+c3ViQ2Vsc1tpXSA9IHRlbXBEYXRhLT5jbG9zZXN0X2NiMltjbHVzdGVyX2luZGV4KjQraV07CisKKyAgICAgICAgZ2V0X2ZyYW1lX21iKGVuYy0+ZnJhbWVfdG9fZW5jLCB4KzIqKGkmMSksCisgICAgICAgICAgICAgICAgICAgICB5KyhpJjIpLCBtYjIsIDIpOworCisgICAgICAgIHN1YmNlbC0+ZXZhbF9kaXN0W1JvUV9JRF9DQ0NdICs9CisgICAgICAgICAgICBzcXVhcmVkX2RpZmZfbWFjcm9ibG9jayh0ZW1wRGF0YS0+Y29kZWJvb2tzLnVucGFja2VkX2NiMiArIHN1YmNlbC0+c3ViQ2Vsc1tpXSoyKjIqMywgbWIyLCAyKTsKKyAgICB9CisKKyAgICBiZXN0X2Rpc3QgPSBJTlRfTUFYOworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgaWYgKFJPUV9MQU1CREFfU0NBTEUqc3ViY2VsLT5ldmFsX2Rpc3RbaV0gKyBlbmMtPmxhbWJkYSpiaXRzVXNlZFtpXSA8CisgICAgICAgICAgICBiZXN0X2Rpc3QpIHsKKyAgICAgICAgICAgIHN1YmNlbC0+YmVzdF9jb2RpbmcgPSBpOworICAgICAgICAgICAgc3ViY2VsLT5iZXN0X2JpdF91c2UgPSBiaXRzVXNlZFtpXTsKKyAgICAgICAgICAgIGJlc3RfZGlzdCA9IFJPUV9MQU1CREFfU0NBTEUqc3ViY2VsLT5ldmFsX2Rpc3RbaV0gKworICAgICAgICAgICAgICAgIGVuYy0+bGFtYmRhKmJpdHNVc2VkW2ldOworICAgICAgICB9Cit9CisKKy8qKgorICogR2V0IGRpc3RvcnRpb24gZm9yIGFsbCBvcHRpb25zIGF2YWlsYWJsZSB0byBhIGNlbAorICovCitzdGF0aWMgdm9pZCBnYXRoZXJfZGF0YV9mb3JfY2VsKENlbEV2YWx1YXRpb24gKmNlbCwgUm9xQ29udGV4dCAqZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3FUZW1wZGF0YSAqdGVtcERhdGEpCit7CisgICAgdWludDhfdCBtYjhbOCo4KjNdOworICAgIGludCBpbmRleCA9IGNlbC0+c291cmNlWSplbmMtPndpZHRoLzY0ICsgY2VsLT5zb3VyY2VYLzg7CisgICAgaW50IGksIGosIGJlc3RfZGlzdCwgZGl2aWRlX2JpdF91c2U7CisKKyAgICBpbnQgYml0c1VzZWRbNF0gPSB7MiwgMTAsIDEwLCAwfTsKKworICAgIGlmIChlbmMtPmZyYW1lc1NpbmNlS2V5ZnJhbWUgPj0gMSkgeworICAgICAgICBjZWwtPm1vdGlvbiA9IGVuYy0+dGhpc19tb3Rpb244W2luZGV4XTsKKworICAgICAgICBjZWwtPmV2YWxfZGlzdFtSb1FfSURfRkNDXSA9CisgICAgICAgICAgICBldmFsX21vdGlvbl9kaXN0KGVuYywgY2VsLT5zb3VyY2VYLCBjZWwtPnNvdXJjZVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+dGhpc19tb3Rpb244W2luZGV4XSwgOCk7CisgICAgfSBlbHNlCisgICAgICAgIGNlbC0+ZXZhbF9kaXN0W1JvUV9JRF9GQ0NdID0gSU5UX01BWDsKKworICAgIGlmIChlbmMtPmZyYW1lc1NpbmNlS2V5ZnJhbWUgPj0gMikKKyAgICAgICAgY2VsLT5ldmFsX2Rpc3RbUm9RX0lEX01PVF0gPSBibG9ja19zc2UoZW5jLT5mcmFtZV90b19lbmMtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Y3VycmVudF9mcmFtZS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsLT5zb3VyY2VYLCBjZWwtPnNvdXJjZVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbC0+c291cmNlWCwgY2VsLT5zb3VyY2VZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPmZyYW1lX3RvX2VuYy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Y3VycmVudF9mcmFtZS0+bGluZXNpemUsOCk7CisgICAgZWxzZQorICAgICAgICBjZWwtPmV2YWxfZGlzdFtSb1FfSURfTU9UXSA9IElOVF9NQVg7CisKKyAgICBnZXRfZnJhbWVfbWIoZW5jLT5mcmFtZV90b19lbmMsIGNlbC0+c291cmNlWCwgY2VsLT5zb3VyY2VZLCBtYjgsIDgpOworCisgICAgY2VsLT5ldmFsX2Rpc3RbUm9RX0lEX1NMRF0gPQorICAgICAgICBpbmRleF9tYihtYjgsIHRlbXBEYXRhLT5jb2RlYm9va3MudW5wYWNrZWRfY2I0X2VubGFyZ2VkLAorICAgICAgICAgICAgICAgICB0ZW1wRGF0YS0+Y29kZWJvb2tzLm51bUNCNCwgJmNlbC0+Y2JFbnRyeSwgOCk7CisKKyAgICBnYXRoZXJfZGF0YV9mb3Jfc3ViY2VsKGNlbC0+c3ViQ2VscyArIDAsIGNlbC0+c291cmNlWCswLCBjZWwtPnNvdXJjZVkrMCwgZW5jLCB0ZW1wRGF0YSk7CisgICAgZ2F0aGVyX2RhdGFfZm9yX3N1YmNlbChjZWwtPnN1YkNlbHMgKyAxLCBjZWwtPnNvdXJjZVgrNCwgY2VsLT5zb3VyY2VZKzAsIGVuYywgdGVtcERhdGEpOworICAgIGdhdGhlcl9kYXRhX2Zvcl9zdWJjZWwoY2VsLT5zdWJDZWxzICsgMiwgY2VsLT5zb3VyY2VYKzAsIGNlbC0+c291cmNlWSs0LCBlbmMsIHRlbXBEYXRhKTsKKyAgICBnYXRoZXJfZGF0YV9mb3Jfc3ViY2VsKGNlbC0+c3ViQ2VscyArIDMsIGNlbC0+c291cmNlWCs0LCBjZWwtPnNvdXJjZVkrNCwgZW5jLCB0ZW1wRGF0YSk7CisKKyAgICBjZWwtPmV2YWxfZGlzdFtSb1FfSURfQ0NDXSA9IDA7CisgICAgZGl2aWRlX2JpdF91c2UgPSAwOworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykgeworICAgICAgICBjZWwtPmV2YWxfZGlzdFtSb1FfSURfQ0NDXSArPQorICAgICAgICAgICAgY2VsLT5zdWJDZWxzW2ldLmV2YWxfZGlzdFtjZWwtPnN1YkNlbHNbaV0uYmVzdF9jb2RpbmddOworICAgICAgICBkaXZpZGVfYml0X3VzZSArPSBjZWwtPnN1YkNlbHNbaV0uYmVzdF9iaXRfdXNlOworICAgIH0KKworICAgIGJlc3RfZGlzdCA9IElOVF9NQVg7CisgICAgYml0c1VzZWRbM10gPSAyICsgZGl2aWRlX2JpdF91c2U7CisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIGlmIChST1FfTEFNQkRBX1NDQUxFKmNlbC0+ZXZhbF9kaXN0W2ldICsgZW5jLT5sYW1iZGEqYml0c1VzZWRbaV0gPAorICAgICAgICAgICAgYmVzdF9kaXN0KSB7CisgICAgICAgICAgICBjZWwtPmJlc3RfY29kaW5nID0gaTsKKyAgICAgICAgICAgIGJlc3RfZGlzdCA9IFJPUV9MQU1CREFfU0NBTEUqY2VsLT5ldmFsX2Rpc3RbaV0gKworICAgICAgICAgICAgICAgIGVuYy0+bGFtYmRhKmJpdHNVc2VkW2ldOworICAgICAgICB9CisKKyAgICB0ZW1wRGF0YS0+dXNlZF9vcHRpb25bY2VsLT5iZXN0X2NvZGluZ10rKzsKKyAgICB0ZW1wRGF0YS0+bWFpbkNodW5rU2l6ZSArPSBiaXRzVXNlZFtjZWwtPmJlc3RfY29kaW5nXTsKKworICAgIGlmIChjZWwtPmJlc3RfY29kaW5nID09IFJvUV9JRF9TTEQpCisgICAgICAgIHRlbXBEYXRhLT5jb2RlYm9va3MudXNlZENCNFtjZWwtPmNiRW50cnldKys7CisKKyAgICBpZiAoY2VsLT5iZXN0X2NvZGluZyA9PSBSb1FfSURfQ0NDKQorICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjZWwtPnN1YkNlbHNbaV0uYmVzdF9jb2RpbmcgPT0gUm9RX0lEX1NMRCkKKyAgICAgICAgICAgICAgICB0ZW1wRGF0YS0+Y29kZWJvb2tzLnVzZWRDQjRbY2VsLT5zdWJDZWxzW2ldLmNiRW50cnldKys7CisgICAgICAgICAgICBlbHNlIGlmIChjZWwtPnN1YkNlbHNbaV0uYmVzdF9jb2RpbmcgPT0gUm9RX0lEX0NDQykKKyAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajw0OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhLT5jb2RlYm9va3MudXNlZENCMltjZWwtPnN1YkNlbHNbaV0uc3ViQ2Vsc1tqXV0rKzsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCByZW1hcF9jb2RlYm9va3MoUm9xQ29udGV4dCAqZW5jLCBSb3FUZW1wZGF0YSAqdGVtcERhdGEpCit7CisgICAgaW50IGksIGosIGlkeD0wOworCisgICAgLyogTWFrZSByZW1hcHMgZm9yIHRoZSBmaW5hbCBjb2RlYm9vayB1c2FnZSAqLworICAgIGZvciAoaT0wOyBpPChlbmMtPnF1YWtlM19jb21wYXQgPyBNQVhfQ0JTXzR4NC0xIDogTUFYX0NCU180eDQpOyBpKyspIHsKKyAgICAgICAgaWYgKHRlbXBEYXRhLT5jb2RlYm9va3MudXNlZENCNFtpXSkgeworICAgICAgICAgICAgdGVtcERhdGEtPmkyZjRbaV0gPSBpZHg7CisgICAgICAgICAgICB0ZW1wRGF0YS0+ZjJpNFtpZHhdID0gaTsKKyAgICAgICAgICAgIGZvciAoaj0wOyBqPDQ7IGorKykKKyAgICAgICAgICAgICAgICB0ZW1wRGF0YS0+Y29kZWJvb2tzLnVzZWRDQjJbZW5jLT5jYjR4NFtpXS5pZHhbal1dKys7CisgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRlbXBEYXRhLT5udW1DQjQgPSBpZHg7CisKKyAgICBpZHggPSAwOworICAgIGZvciAoaT0wOyBpPE1BWF9DQlNfMngyOyBpKyspIHsKKyAgICAgICAgaWYgKHRlbXBEYXRhLT5jb2RlYm9va3MudXNlZENCMltpXSkgeworICAgICAgICAgICAgdGVtcERhdGEtPmkyZjJbaV0gPSBpZHg7CisgICAgICAgICAgICB0ZW1wRGF0YS0+ZjJpMltpZHhdID0gaTsKKyAgICAgICAgICAgIGlkeCsrOworICAgICAgICB9CisgICAgfQorICAgIHRlbXBEYXRhLT5udW1DQjIgPSBpZHg7CisKK30KKworLyoqCisgKiBXcml0ZSBjb2RlYm9vayBjaHVuaworICovCitzdGF0aWMgdm9pZCB3cml0ZV9jb2RlYm9va3MoUm9xQ29udGV4dCAqZW5jLCBSb3FUZW1wZGF0YSAqdGVtcERhdGEpCit7CisgICAgaW50IGksIGo7CisgICAgdWludDhfdCAqKm91dHA9ICZlbmMtPm91dF9idWY7CisKKyAgICBpZiAodGVtcERhdGEtPm51bUNCMikgeworICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KG91dHAsIFJvUV9RVUFEX0NPREVCT09LKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMihvdXRwLCB0ZW1wRGF0YS0+bnVtQ0IyKjYgKyB0ZW1wRGF0YS0+bnVtQ0I0KjQpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKG91dHAsIHRlbXBEYXRhLT5udW1DQjQpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKG91dHAsIHRlbXBEYXRhLT5udW1DQjIpOworCisgICAgICAgIGZvciAoaT0wOyBpPHRlbXBEYXRhLT5udW1DQjI7IGkrKykgeworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKG91dHAsIGVuYy0+Y2IyeDJbdGVtcERhdGEtPmYyaTJbaV1dLnksIDQpOworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZShvdXRwLCBlbmMtPmNiMngyW3RlbXBEYXRhLT5mMmkyW2ldXS51KTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUob3V0cCwgZW5jLT5jYjJ4Mlt0ZW1wRGF0YS0+ZjJpMltpXV0udik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTx0ZW1wRGF0YS0+bnVtQ0I0OyBpKyspCisgICAgICAgICAgICBmb3IgKGo9MDsgajw0OyBqKyspCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZShvdXRwLCB0ZW1wRGF0YS0+aTJmMltlbmMtPmNiNHg0W3RlbXBEYXRhLT5mMmk0W2ldXS5pZHhbal1dKTsKKworICAgIH0KK30KKworc3RhdGljIGlubGluZSB1aW50OF90IG1vdGlvbl9hcmcobW90aW9uX3ZlY3QgbW90KQoreworICAgIHVpbnQ4X3QgYXggPSA4IC0gKCh1aW50OF90KSBtb3QuZFswXSk7CisgICAgdWludDhfdCBheSA9IDggLSAoKHVpbnQ4X3QpIG1vdC5kWzFdKTsKKyAgICByZXR1cm4gKChheCYxNSk8PDQpIHwgKGF5JjE1KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgdHlwZVNwb29sOworICAgIGludCB0eXBlU3Bvb2xMZW5ndGg7CisgICAgdWludDhfdCBhcmd1bWVudFNwb29sWzY0XTsKKyAgICB1aW50OF90ICphcmdzOworICAgIHVpbnQ4X3QgKipwb3V0OworfSBDb2RpbmdTcG9vbDsKKworLyogTk9URTogVHlwZWNvZGVzIG11c3QgYmUgc3Bvb2xlZCBBRlRFUiBhcmd1bWVudHMhISAqLworc3RhdGljIHZvaWQgd3JpdGVfdHlwZWNvZGUoQ29kaW5nU3Bvb2wgKnMsIHVpbnQ4X3QgdHlwZSkKK3sKKyAgICBzLT50eXBlU3Bvb2wgfD0gKHR5cGUgJiAzKSA8PCAoMTQgLSBzLT50eXBlU3Bvb2xMZW5ndGgpOworICAgIHMtPnR5cGVTcG9vbExlbmd0aCArPSAyOworICAgIGlmIChzLT50eXBlU3Bvb2xMZW5ndGggPT0gMTYpIHsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNihzLT5wb3V0LCBzLT50eXBlU3Bvb2wpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIocy0+cG91dCwgcy0+YXJndW1lbnRTcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmFyZ3MgLSBzLT5hcmd1bWVudFNwb29sKTsKKyAgICAgICAgcy0+dHlwZVNwb29sTGVuZ3RoID0gMDsKKyAgICAgICAgcy0+dHlwZVNwb29sID0gMDsKKyAgICAgICAgcy0+YXJncyA9IHMtPmFyZ3VtZW50U3Bvb2w7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZWNvbnN0cnVjdF9hbmRfZW5jb2RlX2ltYWdlKFJvcUNvbnRleHQgKmVuYywgUm9xVGVtcGRhdGEgKnRlbXBEYXRhLCBpbnQgdywgaW50IGgsIGludCBudW1CbG9ja3MpCit7CisgICAgaW50IGksIGosIGs7CisgICAgaW50IHgsIHk7CisgICAgaW50IHN1YlgsIHN1Ylk7CisgICAgaW50IGRpc3Q9MDsKKworICAgIHJvcV9xY2VsbCAqcWNlbGw7CisgICAgQ2VsRXZhbHVhdGlvbiAqZXZhbDsKKworICAgIENvZGluZ1Nwb29sIHNwb29sOworCisgICAgc3Bvb2wudHlwZVNwb29sPTA7CisgICAgc3Bvb2wudHlwZVNwb29sTGVuZ3RoPTA7CisgICAgc3Bvb2wuYXJncyA9IHNwb29sLmFyZ3VtZW50U3Bvb2w7CisgICAgc3Bvb2wucG91dCA9ICZlbmMtPm91dF9idWY7CisKKyAgICBpZiAodGVtcERhdGEtPnVzZWRfb3B0aW9uW1JvUV9JRF9DQ0NdJTIpCisgICAgICAgIHRlbXBEYXRhLT5tYWluQ2h1bmtTaXplKz04OyAvL0ZJWE1FCisKKyAgICAvKiBXcml0ZSB0aGUgdmlkZW8gY2h1bmsgaGVhZGVyICovCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmZW5jLT5vdXRfYnVmLCBSb1FfUVVBRF9WUSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmZW5jLT5vdXRfYnVmLCB0ZW1wRGF0YS0+bWFpbkNodW5rU2l6ZS84KTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZlbmMtPm91dF9idWYsIDB4MCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmZW5jLT5vdXRfYnVmLCAweDApOworCisgICAgZm9yIChpPTA7IGk8bnVtQmxvY2tzOyBpKyspIHsKKyAgICAgICAgZXZhbCA9IHRlbXBEYXRhLT5jZWxfZXZhbHMgKyBpOworCisgICAgICAgIHggPSBldmFsLT5zb3VyY2VYOworICAgICAgICB5ID0gZXZhbC0+c291cmNlWTsKKyAgICAgICAgZGlzdCArPSBldmFsLT5ldmFsX2Rpc3RbZXZhbC0+YmVzdF9jb2RpbmddOworCisgICAgICAgIHN3aXRjaCAoZXZhbC0+YmVzdF9jb2RpbmcpIHsKKyAgICAgICAgY2FzZSBSb1FfSURfTU9UOgorICAgICAgICAgICAgd3JpdGVfdHlwZWNvZGUoJnNwb29sLCBSb1FfSURfTU9UKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUm9RX0lEX0ZDQzoKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnNwb29sLmFyZ3MsIG1vdGlvbl9hcmcoZXZhbC0+bW90aW9uKSk7CisKKyAgICAgICAgICAgIHdyaXRlX3R5cGVjb2RlKCZzcG9vbCwgUm9RX0lEX0ZDQyk7CisgICAgICAgICAgICBmZl9hcHBseV9tb3Rpb25fOHg4KGVuYywgeCwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbC0+bW90aW9uLmRbMF0sIGV2YWwtPm1vdGlvbi5kWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUm9RX0lEX1NMRDoKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnNwb29sLmFyZ3MsIHRlbXBEYXRhLT5pMmY0W2V2YWwtPmNiRW50cnldKTsKKyAgICAgICAgICAgIHdyaXRlX3R5cGVjb2RlKCZzcG9vbCwgUm9RX0lEX1NMRCk7CisKKyAgICAgICAgICAgIHFjZWxsID0gZW5jLT5jYjR4NCArIGV2YWwtPmNiRW50cnk7CisgICAgICAgICAgICBmZl9hcHBseV92ZWN0b3JfNHg0KGVuYywgeCAgLCB5ICAsIGVuYy0+Y2IyeDIgKyBxY2VsbC0+aWR4WzBdKTsKKyAgICAgICAgICAgIGZmX2FwcGx5X3ZlY3Rvcl80eDQoZW5jLCB4KzQsIHkgICwgZW5jLT5jYjJ4MiArIHFjZWxsLT5pZHhbMV0pOworICAgICAgICAgICAgZmZfYXBwbHlfdmVjdG9yXzR4NChlbmMsIHggICwgeSs0LCBlbmMtPmNiMngyICsgcWNlbGwtPmlkeFsyXSk7CisgICAgICAgICAgICBmZl9hcHBseV92ZWN0b3JfNHg0KGVuYywgeCs0LCB5KzQsIGVuYy0+Y2IyeDIgKyBxY2VsbC0+aWR4WzNdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUm9RX0lEX0NDQzoKKyAgICAgICAgICAgIHdyaXRlX3R5cGVjb2RlKCZzcG9vbCwgUm9RX0lEX0NDQyk7CisKKyAgICAgICAgICAgIGZvciAoaj0wOyBqPDQ7IGorKykgeworICAgICAgICAgICAgICAgIHN1YlggPSB4ICsgNCooaiYxKTsKKyAgICAgICAgICAgICAgICBzdWJZID0geSArIDIqKGomMik7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2goZXZhbC0+c3ViQ2Vsc1tqXS5iZXN0X2NvZGluZykgeworICAgICAgICAgICAgICAgIGNhc2UgUm9RX0lEX01PVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFJvUV9JRF9GQ0M6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnNwb29sLmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX2FyZyhldmFsLT5zdWJDZWxzW2pdLm1vdGlvbikpOworCisgICAgICAgICAgICAgICAgICAgIGZmX2FwcGx5X21vdGlvbl80eDQoZW5jLCBzdWJYLCBzdWJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwtPnN1YkNlbHNbal0ubW90aW9uLmRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbC0+c3ViQ2Vsc1tqXS5tb3Rpb24uZFsxXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBSb1FfSURfU0xEOgorICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZzcG9vbC5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhLT5pMmY0W2V2YWwtPnN1YkNlbHNbal0uY2JFbnRyeV0pOworCisgICAgICAgICAgICAgICAgICAgIHFjZWxsID0gZW5jLT5jYjR4NCArIGV2YWwtPnN1YkNlbHNbal0uY2JFbnRyeTsKKworICAgICAgICAgICAgICAgICAgICBmZl9hcHBseV92ZWN0b3JfMngyKGVuYywgc3ViWCAgLCBzdWJZICAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5jYjJ4MiArIHFjZWxsLT5pZHhbMF0pOworICAgICAgICAgICAgICAgICAgICBmZl9hcHBseV92ZWN0b3JfMngyKGVuYywgc3ViWCsyLCBzdWJZICAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5jYjJ4MiArIHFjZWxsLT5pZHhbMV0pOworICAgICAgICAgICAgICAgICAgICBmZl9hcHBseV92ZWN0b3JfMngyKGVuYywgc3ViWCAgLCBzdWJZKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5jYjJ4MiArIHFjZWxsLT5pZHhbMl0pOworICAgICAgICAgICAgICAgICAgICBmZl9hcHBseV92ZWN0b3JfMngyKGVuYywgc3ViWCsyLCBzdWJZKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5jYjJ4MiArIHFjZWxsLT5pZHhbM10pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgUm9RX0lEX0NDQzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7IGs8NDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2JfaWR4ID0gZXZhbC0+c3ViQ2Vsc1tqXS5zdWJDZWxzW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmc3Bvb2wuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcERhdGEtPmkyZjJbY2JfaWR4XSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FwcGx5X3ZlY3Rvcl8yeDIoZW5jLCBzdWJYICsgMiooayYxKSwgc3ViWSArIChrJjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPmNiMngyICsgY2JfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVfdHlwZWNvZGUoJnNwb29sLCBldmFsLT5zdWJDZWxzW2pdLmJlc3RfY29kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRmx1c2ggdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJndW1lbnQvdHlwZSBzcG9vbCAqLworICAgIHdoaWxlIChzcG9vbC50eXBlU3Bvb2xMZW5ndGgpCisgICAgICAgIHdyaXRlX3R5cGVjb2RlKCZzcG9vbCwgMHgwKTsKKworI2lmIDAKKyAgICB1aW50OF90ICpmZGF0YVszXSA9IHtlbmMtPmZyYW1lX3RvX2VuYy0+ZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+ZnJhbWVfdG9fZW5jLT5kYXRhWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5mcmFtZV90b19lbmMtPmRhdGFbMl19OworICAgIHVpbnQ4X3QgKmNkYXRhWzNdID0ge2VuYy0+Y3VycmVudF9mcmFtZS0+ZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Y3VycmVudF9mcmFtZS0+ZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Y3VycmVudF9mcmFtZS0+ZGF0YVsyXX07CisgICAgYXZfbG9nKGVuYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkV4cGVjdGVkIGRpc3RvcnRpb246ICVpIEFjdHVhbDogJWlcbiIsCisgICAgICAgICAgIGRpc3QsCisgICAgICAgICAgIGJsb2NrX3NzZShmZGF0YSwgY2RhdGEsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICBlbmMtPmZyYW1lX3RvX2VuYy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICBlbmMtPmN1cnJlbnRfZnJhbWUtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgZW5jLT53aWR0aCkpOyAgLy9XQVJOSU5HOiBTcXVhcmUgZGltZW5zaW9ucyBpbXBsaWVkLi4uCisjZW5kaWYKK30KKworCisvKioKKyAqIENyZWF0ZSBhIHNpbmdsZSBZVVYgY2VsbCBmcm9tIGEgMngyIHNlY3Rpb24gb2YgdGhlIGltYWdlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmFtZV9ibG9ja190b19jZWxsKHVpbnQ4X3QgKmJsb2NrLCB1aW50OF90ICogY29uc3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLCBpbnQgbGVmdCwgY29uc3QgaW50ICpzdHJpZGUpCit7CisgICAgaW50IGksIGosIHU9MCwgdj0wOworCisgICAgZm9yIChpPTA7IGk8MjsgaSsrKQorICAgICAgICBmb3IgKGo9MDsgajwyOyBqKyspIHsKKyAgICAgICAgICAgIGludCB4ID0gKHRvcCtpKSpzdHJpZGVbMF0gKyBsZWZ0ICsgajsKKyAgICAgICAgICAgICpibG9jaysrID0gZGF0YVswXVt4XTsKKyAgICAgICAgICAgIHggPSAodG9wK2kpKnN0cmlkZVsxXSArIGxlZnQgKyBqOworICAgICAgICAgICAgdSAgICAgICArPSBkYXRhWzFdW3hdOworICAgICAgICAgICAgdiAgICAgICArPSBkYXRhWzJdW3hdOworICAgICAgICB9CisKKyAgICAqYmxvY2srKyA9ICh1KzIpLzQ7CisgICAgKmJsb2NrKysgPSAodisyKS80OworfQorCisvKioKKyAqIENyZWF0ZSBZVVYgY2x1c3RlcnMgZm9yIHRoZSBlbnRpcmUgaW1hZ2UKKyAqLworc3RhdGljIHZvaWQgY3JlYXRlX2NsdXN0ZXJzKGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgdywgaW50IGgsIHVpbnQ4X3QgKnl1dkNsdXN0ZXJzKQoreworICAgIGludCBpLCBqLCBrLCBsOworCisgICAgZm9yIChpPTA7IGk8aDsgaSs9NCkKKyAgICAgICAgZm9yIChqPTA7IGo8dzsgais9NCkgeworICAgICAgICAgICAgZm9yIChrPTA7IGsgPCAyOyBrKyspCisgICAgICAgICAgICAgICAgZm9yIChsPTA7IGwgPCAyOyBsKyspCisgICAgICAgICAgICAgICAgICAgIGZyYW1lX2Jsb2NrX3RvX2NlbGwoeXV2Q2x1c3RlcnMgKyAobCArIDIqaykqNiwgZnJhbWUtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsyKmssIGorMipsLCBmcmFtZS0+bGluZXNpemUpOworICAgICAgICAgICAgeXV2Q2x1c3RlcnMgKz0gMjQ7CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfY29kZWJvb2soUm9xQ29udGV4dCAqZW5jLCBSb3FUZW1wZGF0YSAqdGVtcGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBvaW50cywgaW50IGlucHV0Q291bnQsIHJvcV9jZWxsICpyZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCBjYnNpemUpCit7CisgICAgaW50IGksIGosIGs7CisgICAgaW50IGNfc2l6ZSA9IHNpemUqc2l6ZS80OworICAgIGludCAqYnVmOworICAgIGludCAqY29kZWJvb2sgPSBhdl9tYWxsb2NfYXJyYXkoNipjX3NpemUsIGNic2l6ZSpzaXplb2YoaW50KSk7CisgICAgaW50ICpjbG9zZXN0X2NiOworCisgICAgaWYgKHNpemUgPT0gNCkKKyAgICAgICAgY2xvc2VzdF9jYiA9IGF2X21hbGxvY19hcnJheSg2KmNfc2l6ZSwgaW5wdXRDb3VudCpzaXplb2YoaW50KSk7CisgICAgZWxzZQorICAgICAgICBjbG9zZXN0X2NiID0gdGVtcGRhdGEtPmNsb3Nlc3RfY2IyOworCisgICAgYXZwcml2X2luaXRfZWxiZyhwb2ludHMsIDYqY19zaXplLCBpbnB1dENvdW50LCBjb2RlYm9vaywgY2JzaXplLCAxLCBjbG9zZXN0X2NiLCAmZW5jLT5yYW5kY3R4KTsKKyAgICBhdnByaXZfZG9fZWxiZyhwb2ludHMsIDYqY19zaXplLCBpbnB1dENvdW50LCBjb2RlYm9vaywgY2JzaXplLCAxLCBjbG9zZXN0X2NiLCAmZW5jLT5yYW5kY3R4KTsKKworICAgIGlmIChzaXplID09IDQpCisgICAgICAgIGF2X2ZyZWUoY2xvc2VzdF9jYik7CisKKyAgICBidWYgPSBjb2RlYm9vazsKKyAgICBmb3IgKGk9MDsgaTxjYnNpemU7IGkrKykKKyAgICAgICAgZm9yIChrPTA7IGs8Y19zaXplOyBrKyspIHsKKyAgICAgICAgICAgIGZvcihqPTA7IGo8NDsgaisrKQorICAgICAgICAgICAgICAgIHJlc3VsdHMtPnlbal0gPSAqYnVmKys7CisKKyAgICAgICAgICAgIHJlc3VsdHMtPnUgPSAgICAoKmJ1ZisrICsgQ0hST01BX0JJQVMvMikvQ0hST01BX0JJQVM7CisgICAgICAgICAgICByZXN1bHRzLT52ID0gICAgKCpidWYrKyArIENIUk9NQV9CSUFTLzIpL0NIUk9NQV9CSUFTOworICAgICAgICAgICAgcmVzdWx0cysrOworICAgICAgICB9CisKKyAgICBhdl9mcmVlKGNvZGVib29rKTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfbmV3X2NvZGVib29rcyhSb3FDb250ZXh0ICplbmMsIFJvcVRlbXBkYXRhICp0ZW1wRGF0YSkKK3sKKyAgICBpbnQgaSxqOworICAgIFJvcUNvZGVib29rcyAqY29kZWJvb2tzID0gJnRlbXBEYXRhLT5jb2RlYm9va3M7CisgICAgaW50IG1heCA9IGVuYy0+d2lkdGgqZW5jLT5oZWlnaHQvMTY7CisgICAgdWludDhfdCBtYjJbMyo0XTsKKyAgICByb3FfY2VsbCAqcmVzdWx0czQgPSBhdl9tYWxsb2Moc2l6ZW9mKHJvcV9jZWxsKSpNQVhfQ0JTXzR4NCo0KTsKKyAgICB1aW50OF90ICp5dXZDbHVzdGVycz1hdl9tYWxsb2NfYXJyYXkobWF4LCBzaXplb2YoaW50KSo2KjQpOworICAgIGludCAqcG9pbnRzID0gYXZfbWFsbG9jX2FycmF5KG1heCwgNio0KnNpemVvZihpbnQpKTsKKyAgICBpbnQgYmlhczsKKworICAgIC8qIFN1YnNhbXBsZSBZVVYgZGF0YSAqLworICAgIGNyZWF0ZV9jbHVzdGVycyhlbmMtPmZyYW1lX3RvX2VuYywgZW5jLT53aWR0aCwgZW5jLT5oZWlnaHQsIHl1dkNsdXN0ZXJzKTsKKworICAgIC8qIENhc3QgdG8gaW50ZWdlciBhbmQgYXBwbHkgY2hyb21hIGJpYXMgKi8KKyAgICBmb3IgKGk9MDsgaTxtYXgqMjQ7IGkrKykgeworICAgICAgICBiaWFzID0gKChpJTYpPDQpID8gMSA6IENIUk9NQV9CSUFTOworICAgICAgICBwb2ludHNbaV0gPSBiaWFzKnl1dkNsdXN0ZXJzW2ldOworICAgIH0KKworICAgIC8qIENyZWF0ZSA0eDQgY29kZWJvb2tzICovCisgICAgZ2VuZXJhdGVfY29kZWJvb2soZW5jLCB0ZW1wRGF0YSwgcG9pbnRzLCBtYXgsIHJlc3VsdHM0LCA0LCAoZW5jLT5xdWFrZTNfY29tcGF0ID8gTUFYX0NCU180eDQtMSA6IE1BWF9DQlNfNHg0KSk7CisKKyAgICBjb2RlYm9va3MtPm51bUNCNCA9IChlbmMtPnF1YWtlM19jb21wYXQgPyBNQVhfQ0JTXzR4NC0xIDogTUFYX0NCU180eDQpOworCisgICAgdGVtcERhdGEtPmNsb3Nlc3RfY2IyID0gYXZfbWFsbG9jX2FycmF5KG1heCwgNCpzaXplb2YoaW50KSk7CisKKyAgICAvKiBDcmVhdGUgMngyIGNvZGVib29rcyAqLworICAgIGdlbmVyYXRlX2NvZGVib29rKGVuYywgdGVtcERhdGEsIHBvaW50cywgbWF4KjQsIGVuYy0+Y2IyeDIsIDIsIE1BWF9DQlNfMngyKTsKKworICAgIGNvZGVib29rcy0+bnVtQ0IyID0gTUFYX0NCU18yeDI7CisKKyAgICAvKiBVbnBhY2sgMngyIGNvZGVib29rIGNsdXN0ZXJzICovCisgICAgZm9yIChpPTA7IGk8Y29kZWJvb2tzLT5udW1DQjI7IGkrKykKKyAgICAgICAgdW5wYWNrX3JvcV9jZWxsKGVuYy0+Y2IyeDIgKyBpLCBjb2RlYm9va3MtPnVucGFja2VkX2NiMiArIGkqMioyKjMpOworCisgICAgLyogSW5kZXggYWxsIDR4NCBlbnRyaWVzIHRvIHRoZSAyeDIgZW50cmllcywgdW5wYWNrLCBhbmQgZW5sYXJnZSAqLworICAgIGZvciAoaT0wOyBpPGNvZGVib29rcy0+bnVtQ0I0OyBpKyspIHsKKyAgICAgICAgZm9yIChqPTA7IGo8NDsgaisrKSB7CisgICAgICAgICAgICB1bnBhY2tfcm9xX2NlbGwoJnJlc3VsdHM0WzQqaSArIGpdLCBtYjIpOworICAgICAgICAgICAgaW5kZXhfbWIobWIyLCBjb2RlYm9va3MtPnVucGFja2VkX2NiMiwgY29kZWJvb2tzLT5udW1DQjIsCisgICAgICAgICAgICAgICAgICAgICAmZW5jLT5jYjR4NFtpXS5pZHhbal0sIDIpOworICAgICAgICB9CisgICAgICAgIHVucGFja19yb3FfcWNlbGwoY29kZWJvb2tzLT51bnBhY2tlZF9jYjIsIGVuYy0+Y2I0eDQgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVib29rcy0+dW5wYWNrZWRfY2I0ICsgaSo0KjQqMyk7CisgICAgICAgIGVubGFyZ2Vfcm9xX21iNChjb2RlYm9va3MtPnVucGFja2VkX2NiNCArIGkqNCo0KjMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYm9va3MtPnVucGFja2VkX2NiNF9lbmxhcmdlZCArIGkqOCo4KjMpOworICAgIH0KKworICAgIGF2X2ZyZWUoeXV2Q2x1c3RlcnMpOworICAgIGF2X2ZyZWUocG9pbnRzKTsKKyAgICBhdl9mcmVlKHJlc3VsdHM0KTsKK30KKworc3RhdGljIGludCByb3FfZW5jb2RlX3ZpZGVvKFJvcUNvbnRleHQgKmVuYykKK3sKKyAgICBSb3FUZW1wZGF0YSAqdGVtcERhdGEgPSBlbmMtPnRtcERhdGE7CisgICAgaW50IGk7CisKKyAgICBtZW1zZXQodGVtcERhdGEsIDAsIHNpemVvZigqdGVtcERhdGEpKTsKKworICAgIGNyZWF0ZV9jZWxfZXZhbHMoZW5jLCB0ZW1wRGF0YSk7CisKKyAgICBnZW5lcmF0ZV9uZXdfY29kZWJvb2tzKGVuYywgdGVtcERhdGEpOworCisgICAgaWYgKGVuYy0+ZnJhbWVzU2luY2VLZXlmcmFtZSA+PSAxKSB7CisgICAgICAgIG1vdGlvbl9zZWFyY2goZW5jLCA4KTsKKyAgICAgICAgbW90aW9uX3NlYXJjaChlbmMsIDQpOworICAgIH0KKworIHJldHJ5X2VuY29kZToKKyAgICBmb3IgKGk9MDsgaTxlbmMtPndpZHRoKmVuYy0+aGVpZ2h0LzY0OyBpKyspCisgICAgICAgIGdhdGhlcl9kYXRhX2Zvcl9jZWwodGVtcERhdGEtPmNlbF9ldmFscyArIGksIGVuYywgdGVtcERhdGEpOworCisgICAgLyogUXVha2UgMyBjYW4ndCBoYW5kbGUgY2h1bmtzIGJpZ2dlciB0aGFuIDY1NTM1IGJ5dGVzICovCisgICAgaWYgKHRlbXBEYXRhLT5tYWluQ2h1bmtTaXplLzggPiA2NTUzNSAmJiBlbmMtPnF1YWtlM19jb21wYXQpIHsKKyAgICAgICAgaWYgKGVuYy0+bGFtYmRhID4gMTAwMDAwKSB7CisgICAgICAgICAgICBhdl9sb2coZW5jLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGVuY29kZSB2aWRlbyBpbiBRdWFrZSBjb21wYXRpYmxlIGZvcm1cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coZW5jLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIldhcm5pbmcsIGdlbmVyYXRlZCBhIGZyYW1lIHRvbyBiaWcgZm9yIFF1YWtlICglZCA+IDY1NTM1KSwgIgorICAgICAgICAgICAgICAgIm5vdyBzd2l0Y2hpbmcgdG8gYSBiaWdnZXIgcXNjYWxlIHZhbHVlLlxuIiwKKyAgICAgICAgICAgICAgIHRlbXBEYXRhLT5tYWluQ2h1bmtTaXplLzgpOworICAgICAgICBlbmMtPmxhbWJkYSAqPSAxLjU7CisgICAgICAgIHRlbXBEYXRhLT5tYWluQ2h1bmtTaXplID0gMDsKKyAgICAgICAgbWVtc2V0KHRlbXBEYXRhLT51c2VkX29wdGlvbiwgMCwgc2l6ZW9mKHRlbXBEYXRhLT51c2VkX29wdGlvbikpOworICAgICAgICBtZW1zZXQodGVtcERhdGEtPmNvZGVib29rcy51c2VkQ0I0LCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKHRlbXBEYXRhLT5jb2RlYm9va3MudXNlZENCNCkpOworICAgICAgICBtZW1zZXQodGVtcERhdGEtPmNvZGVib29rcy51c2VkQ0IyLCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKHRlbXBEYXRhLT5jb2RlYm9va3MudXNlZENCMikpOworCisgICAgICAgIGdvdG8gcmV0cnlfZW5jb2RlOworICAgIH0KKworICAgIHJlbWFwX2NvZGVib29rcyhlbmMsIHRlbXBEYXRhKTsKKworICAgIHdyaXRlX2NvZGVib29rcyhlbmMsIHRlbXBEYXRhKTsKKworICAgIHJlY29uc3RydWN0X2FuZF9lbmNvZGVfaW1hZ2UoZW5jLCB0ZW1wRGF0YSwgZW5jLT53aWR0aCwgZW5jLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPndpZHRoKmVuYy0+aGVpZ2h0LzY0KTsKKworICAgIGVuYy0+YXZjdHgtPmNvZGVkX2ZyYW1lID0gZW5jLT5jdXJyZW50X2ZyYW1lOworCisgICAgLyogUm90YXRlIGZyYW1lIGhpc3RvcnkgKi8KKyAgICBGRlNXQVAoQVZGcmFtZSAqLCBlbmMtPmN1cnJlbnRfZnJhbWUsIGVuYy0+bGFzdF9mcmFtZSk7CisgICAgRkZTV0FQKG1vdGlvbl92ZWN0ICosIGVuYy0+bGFzdF9tb3Rpb240LCBlbmMtPnRoaXNfbW90aW9uNCk7CisgICAgRkZTV0FQKG1vdGlvbl92ZWN0ICosIGVuYy0+bGFzdF9tb3Rpb244LCBlbmMtPnRoaXNfbW90aW9uOCk7CisKKyAgICBhdl9mcmVlcCgmdGVtcERhdGEtPmNlbF9ldmFscyk7CisgICAgYXZfZnJlZXAoJnRlbXBEYXRhLT5jbG9zZXN0X2NiMik7CisKKyAgICBlbmMtPmZyYW1lc1NpbmNlS2V5ZnJhbWUrKzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcm9xX2VuY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFJvcUNvbnRleHQgKmVuYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZlbmMtPmN1cnJlbnRfZnJhbWUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmVuYy0+bGFzdF9mcmFtZSk7CisKKyAgICBhdl9mcmVlcCgmZW5jLT50bXBEYXRhKTsKKyAgICBhdl9mcmVlcCgmZW5jLT50aGlzX21vdGlvbjQpOworICAgIGF2X2ZyZWVwKCZlbmMtPmxhc3RfbW90aW9uNCk7CisgICAgYXZfZnJlZXAoJmVuYy0+dGhpc19tb3Rpb244KTsKKyAgICBhdl9mcmVlcCgmZW5jLT5sYXN0X21vdGlvbjgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCByb3FfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFJvcUNvbnRleHQgKmVuYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9sZmdfaW5pdCgmZW5jLT5yYW5kY3R4LCAxKTsKKworICAgIGVuYy0+ZnJhbWVzU2luY2VLZXlmcmFtZSA9IDA7CisgICAgaWYgKChhdmN0eC0+d2lkdGggJiAweGYpIHx8IChhdmN0eC0+aGVpZ2h0ICYgMHhmKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRpbWVuc2lvbnMgbXVzdCBiZSBkaXZpc2libGUgYnkgMTZcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+d2lkdGggPiA2NTUzNSB8fCBhdmN0eC0+aGVpZ2h0ID4gNjU1MzUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEaW1lbnNpb25zIGFyZSBtYXggJWRcbiIsIGVuYy0+cXVha2UzX2NvbXBhdCA/IDMyNzY4IDogNjU1MzUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICgoKGF2Y3R4LT53aWR0aCkmKGF2Y3R4LT53aWR0aC0xKSl8fCgoYXZjdHgtPmhlaWdodCkmKGF2Y3R4LT5oZWlnaHQtMSkpKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIldhcm5pbmc6IGRpbWVuc2lvbnMgbm90IHBvd2VyIG9mIHR3bywgdGhpcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHF1YWtlXG4iKTsKKworICAgIGVuYy0+d2lkdGggPSBhdmN0eC0+d2lkdGg7CisgICAgZW5jLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgZW5jLT5mcmFtZXNTaW5jZUtleWZyYW1lID0gMDsKKyAgICBlbmMtPmZpcnN0X2ZyYW1lID0gMTsKKworICAgIGVuYy0+bGFzdF9mcmFtZSAgICA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgZW5jLT5jdXJyZW50X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWVuYy0+bGFzdF9mcmFtZSB8fCAhZW5jLT5jdXJyZW50X2ZyYW1lKSB7CisgICAgICAgIHJvcV9lbmNvZGVfZW5kKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBlbmMtPnRtcERhdGEgICAgICA9IGF2X21hbGxvYyhzaXplb2YoUm9xVGVtcGRhdGEpKTsKKworICAgIGVuYy0+dGhpc19tb3Rpb240ID0KKyAgICAgICAgYXZfbWFsbG9jel9hcnJheSgoZW5jLT53aWR0aCplbmMtPmhlaWdodC8xNiksIHNpemVvZihtb3Rpb25fdmVjdCkpOworCisgICAgZW5jLT5sYXN0X21vdGlvbjQgPQorICAgICAgICBhdl9tYWxsb2NfYXJyYXkgKChlbmMtPndpZHRoKmVuYy0+aGVpZ2h0LzE2KSwgc2l6ZW9mKG1vdGlvbl92ZWN0KSk7CisKKyAgICBlbmMtPnRoaXNfbW90aW9uOCA9CisgICAgICAgIGF2X21hbGxvY3pfYXJyYXkoKGVuYy0+d2lkdGgqZW5jLT5oZWlnaHQvNjQpLCBzaXplb2YobW90aW9uX3ZlY3QpKTsKKworICAgIGVuYy0+bGFzdF9tb3Rpb244ID0KKyAgICAgICAgYXZfbWFsbG9jX2FycmF5ICgoZW5jLT53aWR0aCplbmMtPmhlaWdodC82NCksIHNpemVvZihtb3Rpb25fdmVjdCkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJvcV93cml0ZV92aWRlb19pbmZvX2NodW5rKFJvcUNvbnRleHQgKmVuYykKK3sKKyAgICAvKiBST1EgaW5mbyBjaHVuayAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmVuYy0+b3V0X2J1ZiwgUm9RX0lORk8pOworCisgICAgLyogU2l6ZTogOCBieXRlcyAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmVuYy0+b3V0X2J1ZiwgOCk7CisKKyAgICAvKiBVbnVzZWQgYXJndW1lbnQgKi8KKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZlbmMtPm91dF9idWYsIDB4MDApOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmVuYy0+b3V0X2J1ZiwgMHgwMCk7CisKKyAgICAvKiBXaWR0aCAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmVuYy0+b3V0X2J1ZiwgZW5jLT53aWR0aCk7CisKKyAgICAvKiBIZWlnaHQgKi8KKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZlbmMtPm91dF9idWYsIGVuYy0+aGVpZ2h0KTsKKworICAgIC8qIFVudXNlZCBpbiBRdWFrZSAzLCBtaW1pY3MgdGhlIG91dHB1dCBvZiB0aGUgcmVhbCBlbmNvZGVyICovCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmZW5jLT5vdXRfYnVmLCAweDA4KTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZlbmMtPm91dF9idWYsIDB4MDApOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmVuYy0+b3V0X2J1ZiwgMHgwNCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmZW5jLT5vdXRfYnVmLCAweDAwKTsKK30KKworc3RhdGljIGludCByb3FfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIFJvcUNvbnRleHQgKmVuYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHNpemUsIHJldDsKKworICAgIGVuYy0+YXZjdHggPSBhdmN0eDsKKworICAgIGVuYy0+ZnJhbWVfdG9fZW5jID0gZnJhbWU7CisKKyAgICBpZiAoZnJhbWUtPnF1YWxpdHkpCisgICAgICAgIGVuYy0+bGFtYmRhID0gZnJhbWUtPnF1YWxpdHkgLSAxOworICAgIGVsc2UKKyAgICAgICAgZW5jLT5sYW1iZGEgPSAyKlJPUV9MQU1CREFfU0NBTEU7CisKKyAgICAvKiAxMzggYml0cyBtYXggcGVyIDh4OCBibG9jayArCisgICAgICogICAgIDI1NiBjb2RlYm9va3MqKDYgYnl0ZXMgMngyICsgNCBieXRlcyA0eDQpICsgOCBieXRlcyBmcmFtZSBoZWFkZXIgKi8KKyAgICBzaXplID0gKChlbmMtPndpZHRoICogZW5jLT5oZWlnaHQgLyA2NCkgKiAxMzggKyA3KSAvIDggKyAyNTYgKiAoNiArIDQpICsgODsKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBlbmMtPm91dF9idWYgPSBwa3QtPmRhdGE7CisKKyAgICAvKiBDaGVjayBmb3IgSSBmcmFtZSAqLworICAgIGlmIChlbmMtPmZyYW1lc1NpbmNlS2V5ZnJhbWUgPT0gYXZjdHgtPmdvcF9zaXplKQorICAgICAgICBlbmMtPmZyYW1lc1NpbmNlS2V5ZnJhbWUgPSAwOworCisgICAgaWYgKGVuYy0+Zmlyc3RfZnJhbWUpIHsKKyAgICAgICAgLyogQWxsb2MgbWVtb3J5IGZvciB0aGUgcmVjb25zdHJ1Y3Rpb24gZGF0YSAod2UgbXVzdCBrbm93IHRoZSBzdHJpZGUKKyAgICAgICAgIGZvciB0aGF0KSAqLworICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGVuYy0+Y3VycmVudF9mcmFtZSwgMCkpIDwgMCB8fAorICAgICAgICAgICAgKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGVuYy0+bGFzdF9mcmFtZSwgICAgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgLyogQmVmb3JlIHRoZSBmaXJzdCB2aWRlbyBmcmFtZSwgd3JpdGUgYSAidmlkZW8gaW5mbyIgY2h1bmsgKi8KKyAgICAgICAgcm9xX3dyaXRlX3ZpZGVvX2luZm9fY2h1bmsoZW5jKTsKKworICAgICAgICBlbmMtPmZpcnN0X2ZyYW1lID0gMDsKKyAgICB9CisKKyAgICAvKiBFbmNvZGUgdGhlIGFjdHVhbCBmcmFtZSAqLworICAgIGlmICgocmV0ID0gcm9xX2VuY29kZV92aWRlbyhlbmMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QtPnNpemUgICA9IGVuYy0+b3V0X2J1ZiAtIHBrdC0+ZGF0YTsKKyAgICBpZiAoZW5jLT5mcmFtZXNTaW5jZUtleWZyYW1lID09IDEpCisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihSb3FDb250ZXh0LCB4KQorI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInF1YWtlM19jb21wYXQiLCAiV2hldGhlciB0byByZXNwZWN0IGtub3duIGxpbWl0YXRpb25zIGluIFF1YWtlIDMgZGVjb2RlciIsIE9GRlNFVChxdWFrZTNfY29tcGF0KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDAsIDEsIFZFIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyByb3FfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiUm9RIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfcm9xX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgID0gInJvcXZpZGVvIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiaWQgUm9RIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1JPUSwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgPSBzaXplb2YoUm9xQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgID0gcm9xX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICAgICAgICA9IHJvcV9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgICAgICAgID0gcm9xX2VuY29kZV9lbmQsCisgICAgLnBpeF9mbXRzICAgICAgICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJnJvcV9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ycHphLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9ycHphLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyYjA5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3JwemEuYwpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIFF1aWNrdGltZSBWaWRlbyAoUlBaQSkgVmlkZW8gRGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBRVCBSUFpBIFZpZGVvIERlY29kZXIgYnkgUm9iZXJ0byBUb2duaQorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFJQWkEgZm9ybWF0LCB2aXNpdDoKKyAqICAgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvCisgKgorICogVGhlIFJQWkEgZGVjb2RlciBvdXRwdXRzIFJHQjU1NSBjb2xvcnNwYWNlIGRhdGEuCisgKgorICogTm90ZSB0aGF0IHRoaXMgZGVjb2RlciByZWFkcyBiaWcgZW5kaWFuIFJHQjU1NSBwaXhlbCB2YWx1ZXMgZnJvbSB0aGUKKyAqIGJ5dGVzdHJlYW0sIGFycmFuZ2VzIHRoZW0gaW4gdGhlIGhvc3QncyBlbmRpYW4gb3JkZXIsIGFuZCBvdXRwdXRzCisgKiB0aGVtIHRvIHRoZSBmaW5hbCByZW5kZXJlZCBtYXAgaW4gdGhlIHNhbWUgaG9zdCBlbmRpYW4gb3JkZXIuIFRoaXMgaXMKKyAqIGludGVuZGVkIGJlaGF2aW9yIGFzIHRoZSBsaWJhdmNvZGVjIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgUkdCNTU1CisgKiBwaXhlbHMgc2hhbGwgYmUgc3RvcmVkIGluIG5hdGl2ZSBDUFUgZW5kaWFubmVzcy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUnB6YUNvbnRleHQgeworCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRnJhbWUgKmZyYW1lOworCisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7Cit9IFJwemFDb250ZXh0OworCisjZGVmaW5lIEFEVkFOQ0VfQkxPQ0soKSBcCit7IFwKKyAgICBwaXhlbF9wdHIgKz0gNDsgXAorICAgIGlmIChwaXhlbF9wdHIgPj0gd2lkdGgpIFwKKyAgICB7IFwKKyAgICAgICAgcGl4ZWxfcHRyID0gMDsgXAorICAgICAgICByb3dfcHRyICs9IHN0cmlkZSAqIDQ7IFwKKyAgICB9IFwKKyAgICB0b3RhbF9ibG9ja3MtLTsgXAorICAgIGlmICh0b3RhbF9ibG9ja3MgPCAwKSBcCisgICAgeyBcCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAid2FybmluZzogYmxvY2sgY291bnRlciBqdXN0IHdlbnQgbmVnYXRpdmUgKHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4pXG4iKTsgXAorICAgICAgICByZXR1cm47IFwKKyAgICB9IFwKK30KKworc3RhdGljIHZvaWQgcnB6YV9kZWNvZGVfc3RyZWFtKFJwemFDb250ZXh0ICpzKQoreworICAgIGludCB3aWR0aCA9IHMtPmF2Y3R4LT53aWR0aDsKKyAgICBpbnQgc3RyaWRlID0gcy0+ZnJhbWUtPmxpbmVzaXplWzBdIC8gMjsKKyAgICBpbnQgcm93X2luYyA9IHN0cmlkZSAtIDQ7CisgICAgaW50IGNodW5rX3NpemU7CisgICAgdWludDE2X3QgY29sb3JBID0gMCwgY29sb3JCOworICAgIHVpbnQxNl90IGNvbG9yNFs0XTsKKyAgICB1aW50MTZfdCB0YSwgdGI7CisgICAgdWludDE2X3QgKnBpeGVscyA9ICh1aW50MTZfdCAqKXMtPmZyYW1lLT5kYXRhWzBdOworCisgICAgaW50IHJvd19wdHIgPSAwOworICAgIGludCBwaXhlbF9wdHIgPSAtNDsKKyAgICBpbnQgYmxvY2tfcHRyOworICAgIGludCBwaXhlbF94LCBwaXhlbF95OworICAgIGludCB0b3RhbF9ibG9ja3M7CisKKyAgICAvKiBGaXJzdCBieXRlIGlzIGFsd2F5cyAweGUxLiBXYXJuIGlmIGl0J3MgZGlmZmVyZW50ICovCisgICAgaWYgKGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZSgmcy0+Z2IpICE9IDB4ZTEpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmlyc3QgY2h1bmsgYnl0ZSBpcyAweCUwMnggaW5zdGVhZCBvZiAweGUxXG4iLAorICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZzLT5nYikpOworCisgICAgLyogR2V0IGNodW5rIHNpemUsIGluZ25vcmluZyBmaXJzdCBieXRlICovCisgICAgY2h1bmtfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nYikgJiAweDAwRkZGRkZGOworCisgICAgLyogSWYgbGVuZ3RoIG1pc21hdGNoIHVzZSBzaXplIGZyb20gTU9WIGZpbGUgYW5kIHRyeSB0byBkZWNvZGUgYW55d2F5ICovCisgICAgaWYgKGNodW5rX3NpemUgIT0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSArIDQpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiTU9WIGNodW5rIHNpemUgJWQgIT0gZW5jb2RlZCBjaHVuayBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgKyA0CisgICAgICAgICAgICAgICk7CisKKyAgICAvKiBOdW1iZXIgb2YgNHg0IGJsb2NrcyBpbiBmcmFtZS4gKi8KKyAgICB0b3RhbF9ibG9ja3MgPSAoKHMtPmF2Y3R4LT53aWR0aCArIDMpIC8gNCkgKiAoKHMtPmF2Y3R4LT5oZWlnaHQgKyAzKSAvIDQpOworCisgICAgLyogUHJvY2VzcyBjaHVuayBkYXRhICovCisgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikpIHsKKyAgICAgICAgdWludDhfdCBvcGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOyAvKiBHZXQgb3Bjb2RlICovCisKKyAgICAgICAgaW50IG5fYmxvY2tzID0gKG9wY29kZSAmIDB4MWYpICsgMTsgLyogRXh0cmFjdCBibG9jayBjb3VudGVyIGZyb20gb3Bjb2RlICovCisKKyAgICAgICAgLyogSWYgb3Bjb2RlIE1TYml0IGlzIDAsIHdlIG5lZWQgbW9yZSBkYXRhIHRvIGRlY2lkZSB3aGF0IHRvIGRvICovCisgICAgICAgIGlmICgob3Bjb2RlICYgMHg4MCkgPT0gMCkgeworICAgICAgICAgICAgY29sb3JBID0gKG9wY29kZSA8PCA4KSB8IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgICAgICAgICBvcGNvZGUgPSAwOworICAgICAgICAgICAgaWYgKChieXRlc3RyZWFtMl9wZWVrX2J5dGUoJnMtPmdiKSAmIDB4ODApICE9IDApIHsKKyAgICAgICAgICAgICAgICAvKiBNdXN0IGJlaGF2ZSBhcyBvcGNvZGUgMTEweHh4eHgsIHVzaW5nIGNvbG9yQSBjb21wdXRlZAorICAgICAgICAgICAgICAgICAqIGFib3ZlLiBVc2UgZmFrZSBvcGNvZGUgMHgyMCB0byBlbnRlciBzd2l0Y2ggYmxvY2sgYXQKKyAgICAgICAgICAgICAgICAgKiB0aGUgcmlnaHQgcGxhY2UgKi8KKyAgICAgICAgICAgICAgICBvcGNvZGUgPSAweDIwOworICAgICAgICAgICAgICAgIG5fYmxvY2tzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5fYmxvY2tzID0gRkZNSU4obl9ibG9ja3MsIHRvdGFsX2Jsb2Nrcyk7CisKKyAgICAgICAgc3dpdGNoIChvcGNvZGUgJiAweGUwKSB7CisKKyAgICAgICAgLyogU2tpcCBibG9ja3MgKi8KKyAgICAgICAgY2FzZSAweDgwOgorICAgICAgICAgICAgd2hpbGUgKG5fYmxvY2tzLS0pIHsKKyAgICAgICAgICAgICAgQURWQU5DRV9CTE9DSygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogRmlsbCBibG9ja3Mgd2l0aCBvbmUgY29sb3IgKi8KKyAgICAgICAgY2FzZSAweGEwOgorICAgICAgICAgICAgY29sb3JBID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJnMtPmdiKTsKKyAgICAgICAgICAgIHdoaWxlIChuX2Jsb2Nrcy0tKSB7CisgICAgICAgICAgICAgICAgQURWQU5DRV9CTE9DSygpCisgICAgICAgICAgICAgICAgYmxvY2tfcHRyID0gcm93X3B0ciArIHBpeGVsX3B0cjsKKyAgICAgICAgICAgICAgICBmb3IgKHBpeGVsX3kgPSAwOyBwaXhlbF95IDwgNDsgcGl4ZWxfeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAocGl4ZWxfeCA9IDA7IHBpeGVsX3ggPCA0OyBwaXhlbF94KyspeworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2Jsb2NrX3B0cl0gPSBjb2xvckE7CisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19wdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBibG9ja19wdHIgKz0gcm93X2luYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBGaWxsIGJsb2NrcyB3aXRoIDQgY29sb3JzICovCisgICAgICAgIGNhc2UgMHhjMDoKKyAgICAgICAgICAgIGNvbG9yQSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZzLT5nYik7CisgICAgICAgIGNhc2UgMHgyMDoKKyAgICAgICAgICAgIGNvbG9yQiA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZzLT5nYik7CisKKyAgICAgICAgICAgIC8qIHNvcnQgb3V0IHRoZSBjb2xvcnMgKi8KKyAgICAgICAgICAgIGNvbG9yNFswXSA9IGNvbG9yQjsKKyAgICAgICAgICAgIGNvbG9yNFsxXSA9IDA7CisgICAgICAgICAgICBjb2xvcjRbMl0gPSAwOworICAgICAgICAgICAgY29sb3I0WzNdID0gY29sb3JBOworCisgICAgICAgICAgICAvKiByZWQgY29tcG9uZW50cyAqLworICAgICAgICAgICAgdGEgPSAoY29sb3JBID4+IDEwKSAmIDB4MUY7CisgICAgICAgICAgICB0YiA9IChjb2xvckIgPj4gMTApICYgMHgxRjsKKyAgICAgICAgICAgIGNvbG9yNFsxXSB8PSAoKDExICogdGEgKyAyMSAqIHRiKSA+PiA1KSA8PCAxMDsKKyAgICAgICAgICAgIGNvbG9yNFsyXSB8PSAoKDIxICogdGEgKyAxMSAqIHRiKSA+PiA1KSA8PCAxMDsKKworICAgICAgICAgICAgLyogZ3JlZW4gY29tcG9uZW50cyAqLworICAgICAgICAgICAgdGEgPSAoY29sb3JBID4+IDUpICYgMHgxRjsKKyAgICAgICAgICAgIHRiID0gKGNvbG9yQiA+PiA1KSAmIDB4MUY7CisgICAgICAgICAgICBjb2xvcjRbMV0gfD0gKCgxMSAqIHRhICsgMjEgKiB0YikgPj4gNSkgPDwgNTsKKyAgICAgICAgICAgIGNvbG9yNFsyXSB8PSAoKDIxICogdGEgKyAxMSAqIHRiKSA+PiA1KSA8PCA1OworCisgICAgICAgICAgICAvKiBibHVlIGNvbXBvbmVudHMgKi8KKyAgICAgICAgICAgIHRhID0gY29sb3JBICYgMHgxRjsKKyAgICAgICAgICAgIHRiID0gY29sb3JCICYgMHgxRjsKKyAgICAgICAgICAgIGNvbG9yNFsxXSB8PSAoKDExICogdGEgKyAyMSAqIHRiKSA+PiA1KTsKKyAgICAgICAgICAgIGNvbG9yNFsyXSB8PSAoKDIxICogdGEgKyAxMSAqIHRiKSA+PiA1KTsKKworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCBuX2Jsb2NrcyAqIDQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgd2hpbGUgKG5fYmxvY2tzLS0pIHsKKyAgICAgICAgICAgICAgICBBRFZBTkNFX0JMT0NLKCk7CisgICAgICAgICAgICAgICAgYmxvY2tfcHRyID0gcm93X3B0ciArIHBpeGVsX3B0cjsKKyAgICAgICAgICAgICAgICBmb3IgKHBpeGVsX3kgPSAwOyBwaXhlbF95IDwgNDsgcGl4ZWxfeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5kZXggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwaXhlbF94ID0gMDsgcGl4ZWxfeCA8IDQ7IHBpeGVsX3grKyl7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGlkeCA9IChpbmRleCA+PiAoMiAqICgzIC0gcGl4ZWxfeCkpKSAmIDB4MDM7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNbYmxvY2tfcHRyXSA9IGNvbG9yNFtpZHhdOworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfcHRyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfcHRyICs9IHJvd19pbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogRmlsbCBibG9jayB3aXRoIDE2IGNvbG9ycyAqLworICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IDMwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIEFEVkFOQ0VfQkxPQ0soKTsKKyAgICAgICAgICAgIGJsb2NrX3B0ciA9IHJvd19wdHIgKyBwaXhlbF9wdHI7CisgICAgICAgICAgICBmb3IgKHBpeGVsX3kgPSAwOyBwaXhlbF95IDwgNDsgcGl4ZWxfeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChwaXhlbF94ID0gMDsgcGl4ZWxfeCA8IDQ7IHBpeGVsX3grKyl7CisgICAgICAgICAgICAgICAgICAgIC8qIFdlIGFscmVhZHkgaGF2ZSBjb2xvciBvZiB1cHBlciBsZWZ0IHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIGlmICgocGl4ZWxfeSAhPSAwKSB8fCAocGl4ZWxfeCAhPSAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yQSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICBwaXhlbHNbYmxvY2tfcHRyXSA9IGNvbG9yQTsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfcHRyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJsb2NrX3B0ciArPSByb3dfaW5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogVW5rbm93biBvcGNvZGUgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBvcGNvZGUgJWQgaW4gcnB6YSBjaHVuay4iCisgICAgICAgICAgICAgICAgICIgU2tpcCByZW1haW5pbmcgJWQgYnl0ZXMgb2YgY2h1bmsgZGF0YS5cbiIsIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gLyogT3Bjb2RlIHN3aXRjaCAqLworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IHJwemFfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFJwemFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU1NTsKKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnB6YV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFJwemFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+Z2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBycHphX2RlY29kZV9zdHJlYW0ocyk7CisKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWUgICAgICA9IDE7CisKKyAgICAvKiBhbHdheXMgcmVwb3J0IHRoYXQgdGhlIGJ1ZmZlciB3YXMgY29tcGxldGVseSBjb25zdW1lZCAqLworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHJwemFfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUnB6YUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfcnB6YV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJycHphIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUXVpY2tUaW1lIHZpZGVvIChSUFpBKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9SUFpBLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihScHphQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gcnB6YV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBycHphX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gcnB6YV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ydGpwZWcuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3J0anBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDJiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9ydGpwZWcuYwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIFJUSnBlZyBkZWNvZGluZyBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwNiBSZWltYXIgRG9lZmZpbmdlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInJ0anBlZy5oIgorCisjZGVmaW5lIFBVVF9DT0VGRihjKSBcCisgICAgaSA9IHNjYW5bY29lZmYtLV07IFwKKyAgICBibG9ja1tpXSA9IChjKSAqIHF1YW50W2ldOworCisvLy8gYWxpZ25zIHRoZSBiaXRzdHJlYW0gdG8gdGhlIGdpdmVuIHBvd2VyIG9mIHR3bworI2RlZmluZSBBTElHTihhKSBcCisgICAgbiA9ICgtZ2V0X2JpdHNfY291bnQoZ2IpKSAmIChhIC0gMSk7IFwKKyAgICBpZiAobikge3NraXBfYml0cyhnYiwgbik7fQorCisvKioKKyAqIEBicmllZiByZWFkIG9uZSBibG9jayBmcm9tIHN0cmVhbQorICogQHBhcmFtIGdiIGNvbnRhaW5zIHN0cmVhbSBkYXRhCisgKiBAcGFyYW0gYmxvY2sgd2hlcmUgZGF0YSBpcyB3cml0dGVuIHRvCisgKiBAcGFyYW0gc2NhbiBhcnJheSBjb250YWluaW5nIHRoZSBtYXBwaW5nIHN0cmVhbSBhZGRyZXNzIC0+IGJsb2NrIHBvc2l0aW9uCisgKiBAcGFyYW0gcXVhbnQgcXVhbnRpemF0aW9uIGZhY3RvcnMKKyAqIEByZXR1cm4gMCBtZWFucyB0aGUgYmxvY2sgaXMgbm90IGNvZGVkLCA8IDAgbWVhbnMgYW4gZXJyb3Igb2NjdXJyZWQuCisgKgorICogTm90ZTogR2V0Qml0Q29udGV4dCBpcyB1c2VkIHRvIG1ha2UgdGhlIGNvZGUgc2ltcGxlciwgc2luY2UgYWxsIGRhdGEgaXMKKyAqIGFsaWduZWQgdGhpcyBjb3VsZCBiZSBkb25lIGZhc3RlciBpbiBhIGRpZmZlcmVudCB3YXksIGUuZy4gYXMgaXQgaXMgZG9uZQorICogaW4gTVBsYXllciBsaWJtcGNvZGVjcy9uYXRpdmUvcnRqcGVnbi5jLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfYmxvY2soR2V0Qml0Q29udGV4dCAqZ2IsIGludDE2X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpzY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpxdWFudCkgeworICAgIGludCBjb2VmZiwgaSwgbjsKKyAgICBpbnQ4X3QgYWM7CisgICAgdWludDhfdCBkYyA9IGdldF9iaXRzKGdiLCA4KTsKKworICAgIC8vIGJsb2NrIG5vdCBjb2RlZAorICAgIGlmIChkYyA9PSAyNTUpCisgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzCisgICAgY29lZmYgPSBnZXRfYml0cyhnYiwgNik7CisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgKGNvZWZmIDw8IDEpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8vIG5vcm1hbGx5IHdlIHdvdWxkIG9ubHkgbmVlZCB0byBjbGVhciB0aGUgKDYzIC0gY29lZmYpIGxhc3QgdmFsdWVzLAorICAgIC8vIGJ1dCBzaW5jZSB3ZSBkbyBub3Qga25vdyB3aGVyZSB0aGV5IGFyZSB3ZSBqdXN0IGNsZWFyIHRoZSB3aG9sZSBibG9jaworICAgIG1lbXNldChibG9jaywgMCwgNjQgKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgLy8gMiBiaXRzIHBlciBjb2VmZmljaWVudAorICAgIHdoaWxlIChjb2VmZikgeworICAgICAgICBhYyA9IGdldF9zYml0cyhnYiwgMik7CisgICAgICAgIGlmIChhYyA9PSAtMikKKyAgICAgICAgICAgIGJyZWFrOyAvLyBjb250aW51ZSB3aXRoIG1vcmUgYml0cworICAgICAgICBQVVRfQ09FRkYoYWMpOworICAgIH0KKworICAgIC8vIDQgYml0cyBwZXIgY29lZmZpY2llbnQKKyAgICBBTElHTig0KTsKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAoY29lZmYgPDwgMikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHdoaWxlIChjb2VmZikgeworICAgICAgICBhYyA9IGdldF9zYml0cyhnYiwgNCk7CisgICAgICAgIGlmIChhYyA9PSAtOCkKKyAgICAgICAgICAgIGJyZWFrOyAvLyBjb250aW51ZSB3aXRoIG1vcmUgYml0cworICAgICAgICBQVVRfQ09FRkYoYWMpOworICAgIH0KKworICAgIC8vIDggYml0cyBwZXIgY29lZmZpY2llbnQKKyAgICBBTElHTig4KTsKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAoY29lZmYgPDwgMykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHdoaWxlIChjb2VmZikgeworICAgICAgICBhYyA9IGdldF9zYml0cyhnYiwgOCk7CisgICAgICAgIFBVVF9DT0VGRihhYyk7CisgICAgfQorCisgICAgUFVUX0NPRUZGKGRjKTsKKyAgICByZXR1cm4gMTsKK30KKworLyoqCisgKiBAYnJpZWYgZGVjb2RlIG9uZSBydGpwZWcgWVVWNDIwIGZyYW1lCisgKiBAcGFyYW0gYyBjb250ZXh0LCBtdXN0IGJlIGluaXRpYWxpemVkIHZpYSBmZl9ydGpwZWdfZGVjb2RlX2luaXQKKyAqIEBwYXJhbSBmIEFWRnJhbWUgdG8gcGxhY2UgZGVjb2RlZCBmcmFtZSBpbnRvLiBJZiBwYXJ0cyBvZiB0aGUgZnJhbWUKKyAqICAgICAgICAgIGFyZSBub3QgY29kZWQgdGhleSBhcmUgbGVmdCB1bmNoYW5nZWQsIHNvIGNvbnNpZGVyIGluaXRpYWxpemluZyBpdAorICogQHBhcmFtIGJ1ZiBidWZmZXIgY29udGFpbmluZyBpbnB1dCBkYXRhCisgKiBAcGFyYW0gYnVmX3NpemUgbGVuZ3RoIG9mIGlucHV0IGRhdGEgaW4gYnl0ZXMKKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGlucHV0IGJ1ZmZlcgorICovCitpbnQgZmZfcnRqcGVnX2RlY29kZV9mcmFtZV95dXY0MjAoUlRKcGVnQ29udGV4dCAqYywgQVZGcmFtZSAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkgeworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IHcgPSBjLT53IC8gMTYsIGggPSBjLT5oIC8gMTY7CisgICAgaW50IHgsIHksIHJldDsKKyAgICB1aW50OF90ICp5MSA9IGYtPmRhdGFbMF0sICp5MiA9IGYtPmRhdGFbMF0gKyA4ICogZi0+bGluZXNpemVbMF07CisgICAgdWludDhfdCAqdSA9IGYtPmRhdGFbMV0sICp2ID0gZi0+ZGF0YVsyXTsKKworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBidWYsIGJ1Zl9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisjZGVmaW5lIEJMT0NLKHF1YW50LCBkc3QsIHN0cmlkZSkgZG8geyBcCisgICAgaW50IHJlcyA9IGdldF9ibG9jaygmZ2IsIGJsb2NrLCBjLT5zY2FuLCBxdWFudCk7IFwKKyAgICBpZiAocmVzIDwgMCkgXAorICAgICAgICByZXR1cm4gcmVzOyBcCisgICAgaWYgKHJlcyA+IDApIFwKKyAgICAgICAgYy0+aWRzcC5pZGN0X3B1dChkc3QsIHN0cmlkZSwgYmxvY2spOyBcCit9IHdoaWxlICgwKQorICAgICAgICAgICAgaW50MTZfdCAqYmxvY2sgPSBjLT5ibG9jazsKKyAgICAgICAgICAgIEJMT0NLKGMtPmxxdWFudCwgeTEsIGYtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgIHkxICs9IDg7CisgICAgICAgICAgICBCTE9DSyhjLT5scXVhbnQsIHkxLCBmLT5saW5lc2l6ZVswXSk7CisgICAgICAgICAgICB5MSArPSA4OworICAgICAgICAgICAgQkxPQ0soYy0+bHF1YW50LCB5MiwgZi0+bGluZXNpemVbMF0pOworICAgICAgICAgICAgeTIgKz0gODsKKyAgICAgICAgICAgIEJMT0NLKGMtPmxxdWFudCwgeTIsIGYtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgIHkyICs9IDg7CisgICAgICAgICAgICBCTE9DSyhjLT5jcXVhbnQsIHUsICBmLT5saW5lc2l6ZVsxXSk7CisgICAgICAgICAgICB1ICs9IDg7CisgICAgICAgICAgICBCTE9DSyhjLT5jcXVhbnQsIHYsICBmLT5saW5lc2l6ZVsyXSk7CisgICAgICAgICAgICB2ICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgeTEgKz0gMiAqIDggKiAoZi0+bGluZXNpemVbMF0gLSB3KTsKKyAgICAgICAgeTIgKz0gMiAqIDggKiAoZi0+bGluZXNpemVbMF0gLSB3KTsKKyAgICAgICAgdSArPSA4ICogKGYtPmxpbmVzaXplWzFdIC0gdyk7CisgICAgICAgIHYgKz0gOCAqIChmLT5saW5lc2l6ZVsyXSAtIHcpOworICAgIH0KKyAgICByZXR1cm4gZ2V0X2JpdHNfY291bnQoJmdiKSAvIDg7Cit9CisKKy8qKgorICogQGJyaWVmIGluaXRpYWxpemUgYW4gUlRKcGVnQ29udGV4dCwgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcworICogQHBhcmFtIGMgY29udGV4dCB0byBpbml0aWFsaXplCisgKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgaW1hZ2UsIHdpbGwgYmUgcm91bmRlZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlCisgKiAgICAgICAgICAgICAgb2YgMTYgZm9yIGRlY29kaW5nCisgKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBvZiBpbWFnZSwgd2lsbCBiZSByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUKKyAqICAgICAgICAgICAgICBvZiAxNiBmb3IgZGVjb2RpbmcKKyAqIEBwYXJhbSBscXVhbnQgbHVtYSBxdWFudGl6YXRpb24gdGFibGUgdG8gdXNlCisgKiBAcGFyYW0gY3F1YW50IGNocm9tYSBxdWFudGl6YXRpb24gdGFibGUgdG8gdXNlCisgKi8KK3ZvaWQgZmZfcnRqcGVnX2RlY29kZV9pbml0KFJUSnBlZ0NvbnRleHQgKmMsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpscXVhbnQsIGNvbnN0IHVpbnQzMl90ICpjcXVhbnQpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBpbnQgcCA9IGMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltpXTsKKyAgICAgICAgYy0+bHF1YW50W3BdID0gbHF1YW50W2ldOworICAgICAgICBjLT5jcXVhbnRbcF0gPSBjcXVhbnRbaV07CisgICAgfQorICAgIGMtPncgPSB3aWR0aDsKKyAgICBjLT5oID0gaGVpZ2h0OworfQorCit2b2lkIGZmX3J0anBlZ19pbml0KFJUSnBlZ0NvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZmX2lkY3Rkc3BfaW5pdCgmYy0+aWRzcCwgYXZjdHgpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgaW50IHogPSBmZl96aWd6YWdfZGlyZWN0W2ldOworICAgICAgICB6ID0gKCh6IDw8IDMpIHwgKHogPj4gMykpICYgNjM7IC8vIHJ0anBlZyB1c2VzIGEgdHJhbnNwb3NlZCB2YXJpYW50CisKKyAgICAgICAgLy8gcGVybXV0ZSB0aGUgc2NhbiBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcyBmb3IgdGhlIGNob3NlbiBpZGN0CisgICAgICAgIGMtPnNjYW5baV0gPSBjLT5pZHNwLmlkY3RfcGVybXV0YXRpb25bel07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcnRqcGVnLmggYi9mZm1wZWcvbGliYXZjb2RlYy9ydGpwZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjJmZjQwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnRqcGVnLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIFJUSnBlZyBkZWNvZGluZyBmdW5jdGlvbnMKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBSZWltYXIgRG9lZmZpbmdlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUlRKUEVHX0gKKyNkZWZpbmUgQVZDT0RFQ19SVEpQRUdfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorCisjZGVmaW5lIFJUSlBFR19GSUxFX1ZFUlNJT04gMAorI2RlZmluZSBSVEpQRUdfSEVBREVSX1NJWkUgMTIKKwordHlwZWRlZiBzdHJ1Y3QgUlRKcGVnQ29udGV4dCB7CisgICAgaW50IHcsIGg7CisgICAgSURDVERTUENvbnRleHQgaWRzcDsKKyAgICB1aW50OF90IHNjYW5bNjRdOworICAgIHVpbnQzMl90IGxxdWFudFs2NF07CisgICAgdWludDMyX3QgY3F1YW50WzY0XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrKVs2NF07Cit9IFJUSnBlZ0NvbnRleHQ7CisKK3ZvaWQgZmZfcnRqcGVnX2luaXQoUlRKcGVnQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKwordm9pZCBmZl9ydGpwZWdfZGVjb2RlX2luaXQoUlRKcGVnQ29udGV4dCAqYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKmxxdWFudCwgY29uc3QgdWludDMyX3QgKmNxdWFudCk7CisKK2ludCBmZl9ydGpwZWdfZGVjb2RlX2ZyYW1lX3l1djQyMChSVEpwZWdDb250ZXh0ICpjLCBBVkZyYW1lICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKTsKKyNlbmRpZiAvKiBBVkNPREVDX1JUSlBFR19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ydjEwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9ydjEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5N2IyOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3J2MTAuYwpAQCAtMCwwICsxLDgyMiBAQAorLyoKKyAqIFJWMTAvUlYyMCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUlYxMC9SVjIwIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImVycm9yX3Jlc2lsaWVuY2UuaCIKKyNpbmNsdWRlICJoMjYzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtcGVnX2VyLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAibXBlZzR2aWRlby5oIgorCisjZGVmaW5lIFJWX0dFVF9NQUpPUl9WRVIoeCkgICgoeCkgPj4gMjgpCisjZGVmaW5lIFJWX0dFVF9NSU5PUl9WRVIoeCkgKCgoeCkgPj4gMjApICYgMHhGRikKKyNkZWZpbmUgUlZfR0VUX01JQ1JPX1ZFUih4KSAoKCh4KSA+PiAxMikgJiAweEZGKQorCisjZGVmaW5lIERDX1ZMQ19CSVRTIDE0IC8vIEZJWE1FIGZpbmQgYSBiZXR0ZXIgc29sdXRpb24KKwordHlwZWRlZiBzdHJ1Y3QgUlZEZWNDb250ZXh0IHsKKyAgICBNcGVnRW5jQ29udGV4dCBtOworICAgIGludCBzdWJfaWQ7CisgICAgaW50IG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0OworfSBSVkRlY0NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBydl9sdW1fY29kZVsyNTZdID0geworICAgIDB4M2U3ZiwgMHgwZjAwLCAweDBmMDEsIDB4MGYwMiwgMHgwZjAzLCAweDBmMDQsIDB4MGYwNSwgMHgwZjA2LAorICAgIDB4MGYwNywgMHgwZjA4LCAweDBmMDksIDB4MGYwYSwgMHgwZjBiLCAweDBmMGMsIDB4MGYwZCwgMHgwZjBlLAorICAgIDB4MGYwZiwgMHgwZjEwLCAweDBmMTEsIDB4MGYxMiwgMHgwZjEzLCAweDBmMTQsIDB4MGYxNSwgMHgwZjE2LAorICAgIDB4MGYxNywgMHgwZjE4LCAweDBmMTksIDB4MGYxYSwgMHgwZjFiLCAweDBmMWMsIDB4MGYxZCwgMHgwZjFlLAorICAgIDB4MGYxZiwgMHgwZjIwLCAweDBmMjEsIDB4MGYyMiwgMHgwZjIzLCAweDBmMjQsIDB4MGYyNSwgMHgwZjI2LAorICAgIDB4MGYyNywgMHgwZjI4LCAweDBmMjksIDB4MGYyYSwgMHgwZjJiLCAweDBmMmMsIDB4MGYyZCwgMHgwZjJlLAorICAgIDB4MGYyZiwgMHgwZjMwLCAweDBmMzEsIDB4MGYzMiwgMHgwZjMzLCAweDBmMzQsIDB4MGYzNSwgMHgwZjM2LAorICAgIDB4MGYzNywgMHgwZjM4LCAweDBmMzksIDB4MGYzYSwgMHgwZjNiLCAweDBmM2MsIDB4MGYzZCwgMHgwZjNlLAorICAgIDB4MGYzZiwgMHgwMzgwLCAweDAzODEsIDB4MDM4MiwgMHgwMzgzLCAweDAzODQsIDB4MDM4NSwgMHgwMzg2LAorICAgIDB4MDM4NywgMHgwMzg4LCAweDAzODksIDB4MDM4YSwgMHgwMzhiLCAweDAzOGMsIDB4MDM4ZCwgMHgwMzhlLAorICAgIDB4MDM4ZiwgMHgwMzkwLCAweDAzOTEsIDB4MDM5MiwgMHgwMzkzLCAweDAzOTQsIDB4MDM5NSwgMHgwMzk2LAorICAgIDB4MDM5NywgMHgwMzk4LCAweDAzOTksIDB4MDM5YSwgMHgwMzliLCAweDAzOWMsIDB4MDM5ZCwgMHgwMzllLAorICAgIDB4MDM5ZiwgMHgwMGMwLCAweDAwYzEsIDB4MDBjMiwgMHgwMGMzLCAweDAwYzQsIDB4MDBjNSwgMHgwMGM2LAorICAgIDB4MDBjNywgMHgwMGM4LCAweDAwYzksIDB4MDBjYSwgMHgwMGNiLCAweDAwY2MsIDB4MDBjZCwgMHgwMGNlLAorICAgIDB4MDBjZiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LAorICAgIDB4MDA1NywgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMGMsIDB4MDAwZCwgMHgwMDA0LAorICAgIDB4MDAwMCwgMHgwMDA1LCAweDAwMGUsIDB4MDAwZiwgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwgMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorICAgIDB4MDBkMCwgMHgwMGQxLCAweDAwZDIsIDB4MDBkMywgMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgwMGQ3LAorICAgIDB4MDBkOCwgMHgwMGQ5LCAweDAwZGEsIDB4MDBkYiwgMHgwMGRjLCAweDAwZGQsIDB4MDBkZSwgMHgwMGRmLAorICAgIDB4MDNhMCwgMHgwM2ExLCAweDAzYTIsIDB4MDNhMywgMHgwM2E0LCAweDAzYTUsIDB4MDNhNiwgMHgwM2E3LAorICAgIDB4MDNhOCwgMHgwM2E5LCAweDAzYWEsIDB4MDNhYiwgMHgwM2FjLCAweDAzYWQsIDB4MDNhZSwgMHgwM2FmLAorICAgIDB4MDNiMCwgMHgwM2IxLCAweDAzYjIsIDB4MDNiMywgMHgwM2I0LCAweDAzYjUsIDB4MDNiNiwgMHgwM2I3LAorICAgIDB4MDNiOCwgMHgwM2I5LCAweDAzYmEsIDB4MDNiYiwgMHgwM2JjLCAweDAzYmQsIDB4MDNiZSwgMHgwM2JmLAorICAgIDB4MGY0MCwgMHgwZjQxLCAweDBmNDIsIDB4MGY0MywgMHgwZjQ0LCAweDBmNDUsIDB4MGY0NiwgMHgwZjQ3LAorICAgIDB4MGY0OCwgMHgwZjQ5LCAweDBmNGEsIDB4MGY0YiwgMHgwZjRjLCAweDBmNGQsIDB4MGY0ZSwgMHgwZjRmLAorICAgIDB4MGY1MCwgMHgwZjUxLCAweDBmNTIsIDB4MGY1MywgMHgwZjU0LCAweDBmNTUsIDB4MGY1NiwgMHgwZjU3LAorICAgIDB4MGY1OCwgMHgwZjU5LCAweDBmNWEsIDB4MGY1YiwgMHgwZjVjLCAweDBmNWQsIDB4MGY1ZSwgMHgwZjVmLAorICAgIDB4MGY2MCwgMHgwZjYxLCAweDBmNjIsIDB4MGY2MywgMHgwZjY0LCAweDBmNjUsIDB4MGY2NiwgMHgwZjY3LAorICAgIDB4MGY2OCwgMHgwZjY5LCAweDBmNmEsIDB4MGY2YiwgMHgwZjZjLCAweDBmNmQsIDB4MGY2ZSwgMHgwZjZmLAorICAgIDB4MGY3MCwgMHgwZjcxLCAweDBmNzIsIDB4MGY3MywgMHgwZjc0LCAweDBmNzUsIDB4MGY3NiwgMHgwZjc3LAorICAgIDB4MGY3OCwgMHgwZjc5LCAweDBmN2EsIDB4MGY3YiwgMHgwZjdjLCAweDBmN2QsIDB4MGY3ZSwgMHgwZjdmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnZfbHVtX2JpdHNbMjU2XSA9IHsKKyAgICAxNCwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDQsCisgICAgIDIsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LAorICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHJ2X2Nocm9tX2NvZGVbMjU2XSA9IHsKKyAgICAweGZlN2YsIDB4M2YwMCwgMHgzZjAxLCAweDNmMDIsIDB4M2YwMywgMHgzZjA0LCAweDNmMDUsIDB4M2YwNiwKKyAgICAweDNmMDcsIDB4M2YwOCwgMHgzZjA5LCAweDNmMGEsIDB4M2YwYiwgMHgzZjBjLCAweDNmMGQsIDB4M2YwZSwKKyAgICAweDNmMGYsIDB4M2YxMCwgMHgzZjExLCAweDNmMTIsIDB4M2YxMywgMHgzZjE0LCAweDNmMTUsIDB4M2YxNiwKKyAgICAweDNmMTcsIDB4M2YxOCwgMHgzZjE5LCAweDNmMWEsIDB4M2YxYiwgMHgzZjFjLCAweDNmMWQsIDB4M2YxZSwKKyAgICAweDNmMWYsIDB4M2YyMCwgMHgzZjIxLCAweDNmMjIsIDB4M2YyMywgMHgzZjI0LCAweDNmMjUsIDB4M2YyNiwKKyAgICAweDNmMjcsIDB4M2YyOCwgMHgzZjI5LCAweDNmMmEsIDB4M2YyYiwgMHgzZjJjLCAweDNmMmQsIDB4M2YyZSwKKyAgICAweDNmMmYsIDB4M2YzMCwgMHgzZjMxLCAweDNmMzIsIDB4M2YzMywgMHgzZjM0LCAweDNmMzUsIDB4M2YzNiwKKyAgICAweDNmMzcsIDB4M2YzOCwgMHgzZjM5LCAweDNmM2EsIDB4M2YzYiwgMHgzZjNjLCAweDNmM2QsIDB4M2YzZSwKKyAgICAweDNmM2YsIDB4MGY4MCwgMHgwZjgxLCAweDBmODIsIDB4MGY4MywgMHgwZjg0LCAweDBmODUsIDB4MGY4NiwKKyAgICAweDBmODcsIDB4MGY4OCwgMHgwZjg5LCAweDBmOGEsIDB4MGY4YiwgMHgwZjhjLCAweDBmOGQsIDB4MGY4ZSwKKyAgICAweDBmOGYsIDB4MGY5MCwgMHgwZjkxLCAweDBmOTIsIDB4MGY5MywgMHgwZjk0LCAweDBmOTUsIDB4MGY5NiwKKyAgICAweDBmOTcsIDB4MGY5OCwgMHgwZjk5LCAweDBmOWEsIDB4MGY5YiwgMHgwZjljLCAweDBmOWQsIDB4MGY5ZSwKKyAgICAweDBmOWYsIDB4MDNjMCwgMHgwM2MxLCAweDAzYzIsIDB4MDNjMywgMHgwM2M0LCAweDAzYzUsIDB4MDNjNiwKKyAgICAweDAzYzcsIDB4MDNjOCwgMHgwM2M5LCAweDAzY2EsIDB4MDNjYiwgMHgwM2NjLCAweDAzY2QsIDB4MDNjZSwKKyAgICAweDAzY2YsIDB4MDBlMCwgMHgwMGUxLCAweDAwZTIsIDB4MDBlMywgMHgwMGU0LCAweDAwZTUsIDB4MDBlNiwKKyAgICAweDAwZTcsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDA4LCAweDAwMDksIDB4MDAwMiwKKyAgICAweDAwMDAsIDB4MDAwMywgMHgwMDBhLCAweDAwMGIsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKKyAgICAweDAzZDAsIDB4MDNkMSwgMHgwM2QyLCAweDAzZDMsIDB4MDNkNCwgMHgwM2Q1LCAweDAzZDYsIDB4MDNkNywKKyAgICAweDAzZDgsIDB4MDNkOSwgMHgwM2RhLCAweDAzZGIsIDB4MDNkYywgMHgwM2RkLCAweDAzZGUsIDB4MDNkZiwKKyAgICAweDBmYTAsIDB4MGZhMSwgMHgwZmEyLCAweDBmYTMsIDB4MGZhNCwgMHgwZmE1LCAweDBmYTYsIDB4MGZhNywKKyAgICAweDBmYTgsIDB4MGZhOSwgMHgwZmFhLCAweDBmYWIsIDB4MGZhYywgMHgwZmFkLCAweDBmYWUsIDB4MGZhZiwKKyAgICAweDBmYjAsIDB4MGZiMSwgMHgwZmIyLCAweDBmYjMsIDB4MGZiNCwgMHgwZmI1LCAweDBmYjYsIDB4MGZiNywKKyAgICAweDBmYjgsIDB4MGZiOSwgMHgwZmJhLCAweDBmYmIsIDB4MGZiYywgMHgwZmJkLCAweDBmYmUsIDB4MGZiZiwKKyAgICAweDNmNDAsIDB4M2Y0MSwgMHgzZjQyLCAweDNmNDMsIDB4M2Y0NCwgMHgzZjQ1LCAweDNmNDYsIDB4M2Y0NywKKyAgICAweDNmNDgsIDB4M2Y0OSwgMHgzZjRhLCAweDNmNGIsIDB4M2Y0YywgMHgzZjRkLCAweDNmNGUsIDB4M2Y0ZiwKKyAgICAweDNmNTAsIDB4M2Y1MSwgMHgzZjUyLCAweDNmNTMsIDB4M2Y1NCwgMHgzZjU1LCAweDNmNTYsIDB4M2Y1NywKKyAgICAweDNmNTgsIDB4M2Y1OSwgMHgzZjVhLCAweDNmNWIsIDB4M2Y1YywgMHgzZjVkLCAweDNmNWUsIDB4M2Y1ZiwKKyAgICAweDNmNjAsIDB4M2Y2MSwgMHgzZjYyLCAweDNmNjMsIDB4M2Y2NCwgMHgzZjY1LCAweDNmNjYsIDB4M2Y2NywKKyAgICAweDNmNjgsIDB4M2Y2OSwgMHgzZjZhLCAweDNmNmIsIDB4M2Y2YywgMHgzZjZkLCAweDNmNmUsIDB4M2Y2ZiwKKyAgICAweDNmNzAsIDB4M2Y3MSwgMHgzZjcyLCAweDNmNzMsIDB4M2Y3NCwgMHgzZjc1LCAweDNmNzYsIDB4M2Y3NywKKyAgICAweDNmNzgsIDB4M2Y3OSwgMHgzZjdhLCAweDNmN2IsIDB4M2Y3YywgMHgzZjdkLCAweDNmN2UsIDB4M2Y3ZiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ2X2Nocm9tX2JpdHNbMjU2XSA9IHsKKyAgICAxNiwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDYsICA2LCAgNiwgIDYsICA0LCAgNCwgIDMsCisgICAgIDIsICAzLCAgNCwgIDQsICA2LCAgNiwgIDYsICA2LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorfTsKKworc3RhdGljIFZMQyBydl9kY19sdW0sIHJ2X2RjX2Nocm9tOworCitpbnQgZmZfcnZfZGVjb2RlX2RjKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgbikKK3sKKyAgICBpbnQgY29kZTsKKworICAgIGlmIChuIDwgNCkgeworICAgICAgICBjb2RlID0gZ2V0X3ZsYzIoJnMtPmdiLCBydl9kY19sdW0udGFibGUsIERDX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgaWYgKGNvZGUgPCAwKSB7CisgICAgICAgICAgICAvKiBYWFg6IEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhleSB1c2UgTE9OR0VSIGNvZGVzIHRoYW4KKyAgICAgICAgICAgICAqIG5lY2Vzc2FyeS4gVGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIGJlIGNvbXBsZXRlbHkgdXNlbGVzcworICAgICAgICAgICAgICogaWYgdGhleSBoYWQgdGhvdWdodCBhYm91dCBpdCAhISEgKi8KKyAgICAgICAgICAgIGNvZGUgPSBnZXRfYml0cygmcy0+Z2IsIDcpOworICAgICAgICAgICAgaWYgKGNvZGUgPT0gMHg3YykgeworICAgICAgICAgICAgICAgIGNvZGUgPSAoaW50OF90KSAoZ2V0X2JpdHMoJnMtPmdiLCA3KSArIDEpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09IDB4N2QpIHsKKyAgICAgICAgICAgICAgICBjb2RlID0gLTEyOCArIGdldF9iaXRzKCZzLT5nYiwgNyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMHg3ZSkgeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb2RlID0gKGludDhfdCkgKGdldF9iaXRzKCZzLT5nYiwgOCkgKyAxKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAoaW50OF90KSAoZ2V0X2JpdHMoJnMtPmdiLCA4KSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMHg3ZikgeworICAgICAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDExKTsKKyAgICAgICAgICAgICAgICBjb2RlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGUgLT0gMTI4OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZSA9IGdldF92bGMyKCZzLT5nYiwgcnZfZGNfY2hyb20udGFibGUsIERDX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgLyogc2FtZSByZW1hcmsgKi8KKyAgICAgICAgaWYgKGNvZGUgPCAwKSB7CisgICAgICAgICAgICBjb2RlID0gZ2V0X2JpdHMoJnMtPmdiLCA5KTsKKyAgICAgICAgICAgIGlmIChjb2RlID09IDB4MWZjKSB7CisgICAgICAgICAgICAgICAgY29kZSA9IChpbnQ4X3QpIChnZXRfYml0cygmcy0+Z2IsIDcpICsgMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMHgxZmQpIHsKKyAgICAgICAgICAgICAgICBjb2RlID0gLTEyOCArIGdldF9iaXRzKCZzLT5nYiwgNyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMHgxZmUpIHsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA5KTsKKyAgICAgICAgICAgICAgICBjb2RlID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjaHJvbWEgZGMgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlIC09IDEyODsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLWNvZGU7Cit9CisKKy8qIHJlYWQgUlYgMS4wIGNvbXBhdGlibGUgZnJhbWUgaGVhZGVyICovCitzdGF0aWMgaW50IHJ2MTBfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludCBtYl9jb3VudCwgcGJfZnJhbWUsIG1hcmtlciwgbWJfeHk7CisKKyAgICBtYXJrZXIgPSBnZXRfYml0czEoJnMtPmdiKTsKKworICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkKKyAgICAgICAgcy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgZWxzZQorICAgICAgICBzLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIGlmICghbWFya2VyKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1hcmtlciBtaXNzaW5nXG4iKTsKKworICAgIHBiX2ZyYW1lID0gZ2V0X2JpdHMxKCZzLT5nYik7CisKKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAicGljdF90eXBlPSVkIHBiX2ZyYW1lPSVkXG4iLCBzLT5waWN0X3R5cGUsIHBiX2ZyYW1lKTsKKworICAgIGlmIChwYl9mcmFtZSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJwYiBmcmFtZSIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgcy0+cXNjYWxlID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKKyAgICBpZiAocy0+cXNjYWxlID09IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHFzY2FsZSB2YWx1ZTogMFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgaWYgKHMtPnJ2MTBfdmVyc2lvbiA9PSAzKSB7CisgICAgICAgICAgICAvKiBzcGVjaWZpYyBNUEVHIGxpa2UgREMgY29kaW5nIG5vdCB1c2VkICovCisgICAgICAgICAgICBzLT5sYXN0X2RjWzBdID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIHMtPmxhc3RfZGNbMV0gPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgcy0+bGFzdF9kY1syXSA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiREM6JWQgJWQgJWRcbiIsIHMtPmxhc3RfZGNbMF0sCisgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfZGNbMV0sIHMtPmxhc3RfZGNbMl0pOworICAgICAgICB9CisgICAgfQorICAgIC8qIGlmIG11bHRpcGxlIHBhY2tldHMgcGVyIGZyYW1lIGFyZSBzZW50LCB0aGUgcG9zaXRpb24gYXQgd2hpY2gKKyAgICAgKiB0byBkaXNwbGF5IHRoZSBtYWNyb2Jsb2NrcyBpcyBjb2RlZCBoZXJlICovCisKKyAgICBtYl94eSA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfd2lkdGg7CisgICAgaWYgKHNob3dfYml0cygmcy0+Z2IsIDEyKSA9PSAwIHx8IChtYl94eSAmJiBtYl94eSA8IHMtPm1iX251bSkpIHsKKyAgICAgICAgcy0+bWJfeCAgPSBnZXRfYml0cygmcy0+Z2IsIDYpOyAvKiBtYl94ICovCisgICAgICAgIHMtPm1iX3kgID0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsgLyogbWJfeSAqLworICAgICAgICBtYl9jb3VudCA9IGdldF9iaXRzKCZzLT5nYiwgMTIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPm1iX3ggID0gMDsKKyAgICAgICAgcy0+bWJfeSAgPSAwOworICAgICAgICBtYl9jb3VudCA9IHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0OworICAgIH0KKyAgICBza2lwX2JpdHMoJnMtPmdiLCAzKTsgICAvKiBpZ25vcmVkICovCisgICAgcy0+Zl9jb2RlICAgICAgICAgID0gMTsKKyAgICBzLT51bnJlc3RyaWN0ZWRfbXYgPSAxOworCisgICAgcmV0dXJuIG1iX2NvdW50OworfQorCitzdGF0aWMgaW50IHJ2MjBfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKFJWRGVjQ29udGV4dCAqcnYpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmcnYtPm07CisgICAgaW50IHNlcSwgbWJfcG9zLCBpLCByZXQ7CisgICAgaW50IHJwcl9tYXg7CisKKyAgICBpID0gZ2V0X2JpdHMoJnMtPmdiLCAyKTsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG1tIC4uLgorICAgIGNhc2UgMjoKKyAgICAgICAgcy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgcy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0I7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5rbm93biBmcmFtZSB0eXBlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHMtPmxvd19kZWxheSAmJiBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJsb3cgZGVsYXkgQlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFzLT5sYXN0X3BpY3R1cmVfcHRyICYmIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVhcmx5IEItZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZXNlcnZlZCBiaXQgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+cXNjYWxlID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKKyAgICBpZiAocy0+cXNjYWxlID09IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHFzY2FsZSB2YWx1ZTogMFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChSVl9HRVRfTUlOT1JfVkVSKHJ2LT5zdWJfaWQpID49IDIpCisgICAgICAgIHMtPmxvb3BfZmlsdGVyID0gZ2V0X2JpdHMxKCZzLT5nYikgJiYgIXMtPmF2Y3R4LT5sb3dyZXM7CisKKyAgICBpZiAoUlZfR0VUX01JTk9SX1ZFUihydi0+c3ViX2lkKSA8PSAxKQorICAgICAgICBzZXEgPSBnZXRfYml0cygmcy0+Z2IsIDgpIDw8IDc7CisgICAgZWxzZQorICAgICAgICBzZXEgPSBnZXRfYml0cygmcy0+Z2IsIDEzKSA8PCAyOworCisgICAgcnByX21heCA9IHMtPmF2Y3R4LT5leHRyYWRhdGFbMV0gJiA3OworICAgIGlmIChycHJfbWF4KSB7CisgICAgICAgIGludCBmLCBuZXdfdywgbmV3X2g7CisgICAgICAgIGludCBycHJfYml0cyA9IGF2X2xvZzIocnByX21heCkgKyAxOworCisgICAgICAgIGYgPSBnZXRfYml0cygmcy0+Z2IsIHJwcl9iaXRzKTsKKworICAgICAgICBpZiAoZikgeworICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDggKyAyICogZikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXh0cmFkYXRhIHRvbyBzbWFsbC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXdfdyA9IDQgKiAoKHVpbnQ4X3QgKikgcy0+YXZjdHgtPmV4dHJhZGF0YSlbNiArIDIgKiBmXTsKKyAgICAgICAgICAgIG5ld19oID0gNCAqICgodWludDhfdCAqKSBzLT5hdmN0eC0+ZXh0cmFkYXRhKVs3ICsgMiAqIGZdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3X3cgPSBydi0+b3JpZ193aWR0aDsKKyAgICAgICAgICAgIG5ld19oID0gcnYtPm9yaWdfaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIGlmIChuZXdfdyAhPSBzLT53aWR0aCB8fCBuZXdfaCAhPSBzLT5oZWlnaHQpIHsKKyAgICAgICAgICAgIEFWUmF0aW9uYWwgb2xkX2FzcGVjdCA9IHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgImF0dGVtcHRpbmcgdG8gY2hhbmdlIHJlc29sdXRpb24gdG8gJWR4JWRcbiIsIG5ld193LCBuZXdfaCk7CisgICAgICAgICAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZShuZXdfdywgbmV3X2gsIDAsIHMtPmF2Y3R4KSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBmZl9tcHZfY29tbW9uX2VuZChzKTsKKworICAgICAgICAgICAgLy8gYXR0ZW1wdCB0byBrZWVwIGFzcGVjdCBkdXJpbmcgdHlwaWNhbCByZXNvbHV0aW9uIHN3aXRjaGVzCisgICAgICAgICAgICBpZiAoIW9sZF9hc3BlY3QubnVtKQorICAgICAgICAgICAgICAgIG9sZF9hc3BlY3QgPSAoQVZSYXRpb25hbCl7MSwgMX07CisgICAgICAgICAgICBpZiAoMiAqIG5ld193ICogcy0+aGVpZ2h0ID09IG5ld19oICogcy0+d2lkdGgpCisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhdl9tdWxfcShvbGRfYXNwZWN0LCAoQVZSYXRpb25hbCl7MiwgMX0pOworICAgICAgICAgICAgaWYgKG5ld193ICogcy0+aGVpZ2h0ID09IDIgKiBuZXdfaCAqIHMtPndpZHRoKQorICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfbXVsX3Eob2xkX2FzcGVjdCwgKEFWUmF0aW9uYWwpezEsIDJ9KTsKKworICAgICAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMocy0+YXZjdHgsIG5ld193LCBuZXdfaCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBzLT53aWR0aCAgPSBuZXdfdzsKKyAgICAgICAgICAgIHMtPmhlaWdodCA9IG5ld19oOworICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9tcHZfY29tbW9uX2luaXQocykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJGICVkLyVkLyVkXG4iLCBmLCBycHJfYml0cywgcnByX21heCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUocy0+d2lkdGgsIHMtPmhlaWdodCwgMCwgcy0+YXZjdHgpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBtYl9wb3MgPSBmZl9oMjYzX2RlY29kZV9tYmEocyk7CisKKyAgICBzZXEgfD0gcy0+dGltZSAmIH4weDdGRkY7CisgICAgaWYgKHNlcSAtIHMtPnRpbWUgPiAgMHg0MDAwKQorICAgICAgICBzZXEgLT0gMHg4MDAwOworICAgIGlmIChzZXEgLSBzLT50aW1lIDwgLTB4NDAwMCkKKyAgICAgICAgc2VxICs9IDB4ODAwMDsKKworICAgIGlmIChzZXEgIT0gcy0+dGltZSkgeworICAgICAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgICAgICBzLT50aW1lICAgICAgICAgICAgPSBzZXE7CisgICAgICAgICAgICBzLT5wcF90aW1lICAgICAgICAgPSBzLT50aW1lIC0gcy0+bGFzdF9ub25fYl90aW1lOworICAgICAgICAgICAgcy0+bGFzdF9ub25fYl90aW1lID0gcy0+dGltZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnRpbWUgICAgPSBzZXE7CisgICAgICAgICAgICBzLT5wYl90aW1lID0gcy0+cHBfdGltZSAtIChzLT5sYXN0X25vbl9iX3RpbWUgLSBzLT50aW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIGlmIChzLT5wcF90aW1lIDw9cy0+cGJfdGltZSB8fCBzLT5wcF90aW1lIDw9IHMtPnBwX3RpbWUgLSBzLT5wYl90aW1lIHx8IHMtPnBwX3RpbWU8PTApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJtZXNzZWQgdXAgb3JkZXIsIHBvc3NpYmxlIGZyb20gc2Vla2luZz8gc2tpcHBpbmcgY3VycmVudCBiIGZyYW1lXG4iKTsKKyNkZWZpbmUgRVJST1JfU0tJUF9GUkFNRSAtMTIzCisgICAgICAgICAgICByZXR1cm4gRVJST1JfU0tJUF9GUkFNRTsKKyAgICAgICAgfQorICAgICAgICBmZl9tcGVnNF9pbml0X2RpcmVjdF9tdihzKTsKKyAgICB9CisKKyAgICBzLT5ub19yb3VuZGluZyA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgaWYgKFJWX0dFVF9NSU5PUl9WRVIocnYtPnN1Yl9pZCkgPD0gMSAmJiBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgIC8vIGJpbmFyeSBkZWNvZGVyIHJlYWRzIDMrMiBiaXRzIGhlcmUgYnV0IHRoZXkgZG9uJ3Qgc2VlbSB0byBiZSB1c2VkCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDUpOworCisgICAgcy0+Zl9jb2RlICAgICAgICAgID0gMTsKKyAgICBzLT51bnJlc3RyaWN0ZWRfbXYgPSAxOworICAgIHMtPmgyNjNfYWljICAgICAgICA9IHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBzLT5tb2RpZmllZF9xdWFudCAgPSAxOworICAgIGlmICghcy0+YXZjdHgtPmxvd3JlcykKKyAgICAgICAgcy0+bG9vcF9maWx0ZXIgPSAxOworCisgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgIm51bTolNWQgeDolMmQgeTolMmQgdHlwZTolZCBxc2NhbGU6JTJkIHJuZDolZFxuIiwKKyAgICAgICAgICAgICAgIHNlcSwgcy0+bWJfeCwgcy0+bWJfeSwgcy0+cGljdF90eXBlLCBzLT5xc2NhbGUsCisgICAgICAgICAgICAgICBzLT5ub19yb3VuZGluZyk7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IgfHwgIXMtPmxvd19kZWxheSk7CisKKyAgICByZXR1cm4gcy0+bWJfd2lkdGggKiBzLT5tYl9oZWlnaHQgLSBtYl9wb3M7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBydjEwX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBSVkRlY0NvbnRleHQgKnJ2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZydi0+bTsKKyAgICBzdGF0aWMgaW50IGRvbmUgPSAwOworICAgIGludCBtYWpvcl92ZXIsIG1pbm9yX3ZlciwgbWljcm9fdmVyLCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgOCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkV4dHJhZGF0YSBpcyB0b28gc21hbGwuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+Y29kZWRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlZF9oZWlnaHQsIDAsIGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZmZfbXB2X2RlY29kZV9kZWZhdWx0cyhzKTsKKyAgICBmZl9tcHZfZGVjb2RlX2luaXQocywgYXZjdHgpOworCisgICAgcy0+b3V0X2Zvcm1hdCAgPSBGTVRfSDI2MzsKKworICAgIHJ2LT5vcmlnX3dpZHRoICA9CisgICAgcy0+d2lkdGggICAgICAgID0gYXZjdHgtPmNvZGVkX3dpZHRoOworICAgIHJ2LT5vcmlnX2hlaWdodCA9CisgICAgcy0+aGVpZ2h0ICAgICAgID0gYXZjdHgtPmNvZGVkX2hlaWdodDsKKworICAgIHMtPmgyNjNfbG9uZ192ZWN0b3JzID0gKCh1aW50OF90ICopIGF2Y3R4LT5leHRyYWRhdGEpWzNdICYgMTsKKyAgICBydi0+c3ViX2lkICAgICAgICAgICA9IEFWX1JCMzIoKHVpbnQ4X3QgKikgYXZjdHgtPmV4dHJhZGF0YSArIDQpOworCisgICAgbWFqb3JfdmVyID0gUlZfR0VUX01BSk9SX1ZFUihydi0+c3ViX2lkKTsKKyAgICBtaW5vcl92ZXIgPSBSVl9HRVRfTUlOT1JfVkVSKHJ2LT5zdWJfaWQpOworICAgIG1pY3JvX3ZlciA9IFJWX0dFVF9NSUNST19WRVIocnYtPnN1Yl9pZCk7CisKKyAgICBzLT5sb3dfZGVsYXkgPSAxOworICAgIHN3aXRjaCAobWFqb3JfdmVyKSB7CisgICAgY2FzZSAxOgorICAgICAgICBzLT5ydjEwX3ZlcnNpb24gPSBtaWNyb192ZXIgPyAzIDogMTsKKyAgICAgICAgcy0+b2JtYyAgICAgICAgID0gbWljcm9fdmVyID09IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKG1pbm9yX3ZlciA+PSAyKSB7CisgICAgICAgICAgICBzLT5sb3dfZGVsYXkgICAgICAgICAgID0gMDsKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5oYXNfYl9mcmFtZXMgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5rbm93biBoZWFkZXIgJVhcbiIsIHJ2LT5zdWJfaWQpOworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJSVjEvMiB2ZXJzaW9uIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAidmVyOiVYIHZlcjA6JSJQUklYMzIiXG4iLCBydi0+c3ViX2lkLAorICAgICAgICAgICAgICAgKCh1aW50MzJfdCAqKSBhdmN0eC0+ZXh0cmFkYXRhKVswXSk7CisgICAgfQorCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisKKyAgICBmZl9tcHZfaWRjdF9pbml0KHMpOworICAgIGlmICgocmV0ID0gZmZfbXB2X2NvbW1vbl9pbml0KHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZl9oMjYzZHNwX2luaXQoJnMtPmgyNjNkc3ApOworICAgIGZmX2gyNjNfZGVjb2RlX2luaXRfdmxjKCk7CisKKyAgICAvKiBpbml0IHJ2IHZsYyAqLworICAgIGlmICghZG9uZSkgeworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJnJ2X2RjX2x1bSwgRENfVkxDX0JJVFMsIDI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ2X2x1bV9iaXRzLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgcnZfbHVtX2NvZGUsIDIsIDIsIDE2Mzg0KTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZydl9kY19jaHJvbSwgRENfVkxDX0JJVFMsIDI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ2X2Nocm9tX2JpdHMsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBydl9jaHJvbV9jb2RlLCAyLCAyLCAxNjM4OCk7CisgICAgICAgIGRvbmUgPSAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcnYxMF9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmZl9tcHZfY29tbW9uX2VuZChzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydjEwX2RlY29kZV9wYWNrZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUsIGludCBidWZfc2l6ZTIpCit7CisgICAgUlZEZWNDb250ZXh0ICpydiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmcnYtPm07CisgICAgaW50IG1iX2NvdW50LCBtYl9wb3MsIGxlZnQsIHN0YXJ0X21iX3gsIGFjdGl2ZV9iaXRzX3NpemUsIHJldDsKKworICAgIGFjdGl2ZV9iaXRzX3NpemUgPSBidWZfc2l6ZSAqIDg7CisgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1ZiwgRkZNQVgoYnVmX3NpemUsIGJ1Zl9zaXplMikgKiA4KTsKKyAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlYxMCkKKyAgICAgICAgbWJfY291bnQgPSBydjEwX2RlY29kZV9waWN0dXJlX2hlYWRlcihzKTsKKyAgICBlbHNlCisgICAgICAgIG1iX2NvdW50ID0gcnYyMF9kZWNvZGVfcGljdHVyZV9oZWFkZXIocnYpOworICAgIGlmIChtYl9jb3VudCA8IDApIHsKKyAgICAgICAgaWYgKG1iX2NvdW50ICE9IEVSUk9SX1NLSVBfRlJBTUUpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkhFQURFUiBFUlJPUlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzLT5tYl94ID49IHMtPm1iX3dpZHRoIHx8CisgICAgICAgIHMtPm1iX3kgPj0gcy0+bWJfaGVpZ2h0KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUE9TIEVSUk9SICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIG1iX3BvcyA9IHMtPm1iX3kgKiBzLT5tYl93aWR0aCArIHMtPm1iX3g7CisgICAgbGVmdCAgID0gcy0+bWJfd2lkdGggKiBzLT5tYl9oZWlnaHQgLSBtYl9wb3M7CisgICAgaWYgKG1iX2NvdW50ID4gbGVmdCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNPVU5UIEVSUk9SXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChzLT5tYl94ID09IDAgJiYgcy0+bWJfeSA9PSAwKSB8fCAhcy0+Y3VycmVudF9waWN0dXJlX3B0cikgeworICAgICAgICAvLyBGSVhNRSB3cml0ZSBwYXJzZXIgc28gd2UgYWx3YXlzIGhhdmUgY29tcGxldGUgZnJhbWVzPworICAgICAgICBpZiAocy0+Y3VycmVudF9waWN0dXJlX3B0cikgeworICAgICAgICAgICAgZmZfZXJfZnJhbWVfZW5kKCZzLT5lcik7CisgICAgICAgICAgICBmZl9tcHZfZnJhbWVfZW5kKHMpOworICAgICAgICAgICAgcy0+bWJfeCA9IHMtPm1iX3kgPSBzLT5yZXN5bmNfbWJfeCA9IHMtPnJlc3luY19tYl95ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJldCA9IGZmX21wdl9mcmFtZV9zdGFydChzLCBhdmN0eCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGZmX21wZWdfZXJfZnJhbWVfc3RhcnQocyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnBpY3RfdHlwZSAhPSBzLT5waWN0X3R5cGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2xpY2UgdHlwZSBtaXNtYXRjaFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgYXZfZGxvZyhhdmN0eCwgInFzY2FsZT0lZFxuIiwgcy0+cXNjYWxlKTsKKworICAgIC8qIGRlZmF1bHQgcXVhbnRpemF0aW9uIHZhbHVlcyAqLworICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjEwKSB7CisgICAgICAgIGlmIChzLT5tYl95ID09IDApCisgICAgICAgICAgICBzLT5maXJzdF9zbGljZV9saW5lID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5maXJzdF9zbGljZV9saW5lID0gMTsKKyAgICAgICAgcy0+cmVzeW5jX21iX3ggICAgICA9IHMtPm1iX3g7CisgICAgfQorICAgIHN0YXJ0X21iX3ggICAgID0gcy0+bWJfeDsKKyAgICBzLT5yZXN5bmNfbWJfeSA9IHMtPm1iX3k7CisgICAgaWYgKHMtPmgyNjNfYWljKSB7CisgICAgICAgIHMtPnlfZGNfc2NhbGVfdGFibGUgPQorICAgICAgICBzLT5jX2RjX3NjYWxlX3RhYmxlID0gZmZfYWljX2RjX3NjYWxlX3RhYmxlOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPnlfZGNfc2NhbGVfdGFibGUgPQorICAgICAgICBzLT5jX2RjX3NjYWxlX3RhYmxlID0gZmZfbXBlZzFfZGNfc2NhbGVfdGFibGU7CisgICAgfQorCisgICAgaWYgKHMtPm1vZGlmaWVkX3F1YW50KQorICAgICAgICBzLT5jaHJvbWFfcXNjYWxlX3RhYmxlID0gZmZfaDI2M19jaHJvbWFfcXNjYWxlX3RhYmxlOworCisgICAgZmZfc2V0X3FzY2FsZShzLCBzLT5xc2NhbGUpOworCisgICAgcy0+cnYxMF9maXJzdF9kY19jb2RlZFswXSA9IDA7CisgICAgcy0+cnYxMF9maXJzdF9kY19jb2RlZFsxXSA9IDA7CisgICAgcy0+cnYxMF9maXJzdF9kY19jb2RlZFsyXSA9IDA7CisgICAgcy0+YmxvY2tfd3JhcFswXSA9CisgICAgcy0+YmxvY2tfd3JhcFsxXSA9CisgICAgcy0+YmxvY2tfd3JhcFsyXSA9CisgICAgcy0+YmxvY2tfd3JhcFszXSA9IHMtPmI4X3N0cmlkZTsKKyAgICBzLT5ibG9ja193cmFwWzRdID0KKyAgICBzLT5ibG9ja193cmFwWzVdID0gcy0+bWJfc3RyaWRlOworICAgIGZmX2luaXRfYmxvY2tfaW5kZXgocyk7CisKKyAgICAvKiBkZWNvZGUgZWFjaCBtYWNyb2Jsb2NrICovCisgICAgZm9yIChzLT5tYl9udW1fbGVmdCA9IG1iX2NvdW50OyBzLT5tYl9udW1fbGVmdCA+IDA7IHMtPm1iX251bV9sZWZ0LS0pIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KHMpOworICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiKiptYiB4PSVkIHk9JWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworCisgICAgICAgIHMtPm12X2RpciAgPSBNVl9ESVJfRk9SV0FSRDsKKyAgICAgICAgcy0+bXZfdHlwZSA9IE1WX1RZUEVfMTZYMTY7CisgICAgICAgIHJldCA9IGZmX2gyNjNfZGVjb2RlX21iKHMsIHMtPmJsb2NrKTsKKworICAgICAgICAvLyBSZXBlYXQgdGhlIHNsaWNlIGVuZCBjaGVjayBmcm9tIGZmX2gyNjNfZGVjb2RlX21iIHdpdGggb3VyIGFjdGl2ZQorICAgICAgICAvLyBiaXRzdHJlYW0gc2l6ZQorICAgICAgICBpZiAocmV0ICE9IFNMSUNFX0VSUk9SKSB7CisgICAgICAgICAgICBpbnQgdiA9IHNob3dfYml0cygmcy0+Z2IsIDE2KTsKKworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2NvdW50KCZzLT5nYikgKyAxNiA+IGFjdGl2ZV9iaXRzX3NpemUpCisgICAgICAgICAgICAgICAgdiA+Pj0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKSArIDE2IC0gYWN0aXZlX2JpdHNfc2l6ZTsKKworICAgICAgICAgICAgaWYgKCF2KQorICAgICAgICAgICAgICAgIHJldCA9IFNMSUNFX0VORDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ICE9IFNMSUNFX0VSUk9SICYmIGFjdGl2ZV9iaXRzX3NpemUgPCBnZXRfYml0c19jb3VudCgmcy0+Z2IpICYmCisgICAgICAgICAgICA4ICogYnVmX3NpemUyID49IGdldF9iaXRzX2NvdW50KCZzLT5nYikpIHsKKyAgICAgICAgICAgIGFjdGl2ZV9iaXRzX3NpemUgPSBidWZfc2l6ZTIgKiA4OworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJ1cGRhdGUgc2l6ZSBmcm9tICVkIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgIDggKiBidWZfc2l6ZSwgYWN0aXZlX2JpdHNfc2l6ZSk7CisgICAgICAgICAgICByZXQgPSBTTElDRV9PSzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXQgPT0gU0xJQ0VfRVJST1IgfHwgYWN0aXZlX2JpdHNfc2l6ZSA8IGdldF9iaXRzX2NvdW50KCZzLT5nYikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRVJST1IgYXQgTUIgJWQgJWRcbiIsIHMtPm1iX3gsCisgICAgICAgICAgICAgICAgICAgcy0+bWJfeSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgZmZfaDI2M191cGRhdGVfbW90aW9uX3ZhbChzKTsKKyAgICAgICAgZmZfbXB2X2RlY29kZV9tYihzLCBzLT5ibG9jayk7CisgICAgICAgIGlmIChzLT5sb29wX2ZpbHRlcikKKyAgICAgICAgICAgIGZmX2gyNjNfbG9vcF9maWx0ZXIocyk7CisKKyAgICAgICAgaWYgKCsrcy0+bWJfeCA9PSBzLT5tYl93aWR0aCkgeworICAgICAgICAgICAgcy0+bWJfeCA9IDA7CisgICAgICAgICAgICBzLT5tYl95Kys7CisgICAgICAgICAgICBmZl9pbml0X2Jsb2NrX2luZGV4KHMpOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5tYl94ID09IHMtPnJlc3luY19tYl94KQorICAgICAgICAgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZSA9IDA7CisgICAgICAgIGlmIChyZXQgPT0gU0xJQ0VfRU5EKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgc3RhcnRfbWJfeCwgcy0+cmVzeW5jX21iX3ksIHMtPm1iX3ggLSAxLCBzLT5tYl95LAorICAgICAgICAgICAgICAgICAgICBFUl9NQl9FTkQpOworCisgICAgcmV0dXJuIGFjdGl2ZV9iaXRzX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NsaWNlX29mZnNldChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IG4pCit7CisgICAgaWYgKGF2Y3R4LT5zbGljZV9jb3VudCkKKyAgICAgICAgcmV0dXJuIGF2Y3R4LT5zbGljZV9vZmZzZXRbbl07CisgICAgZWxzZQorICAgICAgICByZXR1cm4gQVZfUkwzMihidWYgKyBuICogOCk7Cit9CisKK3N0YXRpYyBpbnQgcnYxMF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpwaWN0ID0gZGF0YTsKKyAgICBpbnQgaSwgcmV0OworICAgIGludCBzbGljZV9jb3VudDsKKyAgICBjb25zdCB1aW50OF90ICpzbGljZXNfaGRyID0gTlVMTDsKKworICAgIGF2X2Rsb2coYXZjdHgsICIqKioqKmZyYW1lICVkIHNpemU9JWRcbiIsIGF2Y3R4LT5mcmFtZV9udW1iZXIsIGJ1Zl9zaXplKTsKKyAgICBzLT5mbGFncyAgPSBhdmN0eC0+ZmxhZ3M7CisgICAgcy0+ZmxhZ3MyID0gYXZjdHgtPmZsYWdzMjsKKworICAgIC8qIG5vIHN1cHBsZW1lbnRhcnkgcGljdHVyZSAqLworICAgIGlmIChidWZfc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghYXZjdHgtPnNsaWNlX2NvdW50KSB7CisgICAgICAgIHNsaWNlX2NvdW50ID0gKCpidWYrKykgKyAxOworICAgICAgICBidWZfc2l6ZS0tOworCisgICAgICAgIGlmICghc2xpY2VfY291bnQgfHwgYnVmX3NpemUgPD0gOCAqIHNsaWNlX2NvdW50KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2xpY2UgY291bnQ6ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICBzbGljZV9jb3VudCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIHNsaWNlc19oZHIgPSBidWYgKyA0OworICAgICAgICBidWYgICAgICAgKz0gOCAqIHNsaWNlX2NvdW50OworICAgICAgICBidWZfc2l6ZSAgLT0gOCAqIHNsaWNlX2NvdW50OworICAgIH0gZWxzZQorICAgICAgICBzbGljZV9jb3VudCA9IGF2Y3R4LT5zbGljZV9jb3VudDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzbGljZV9jb3VudDsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIG9mZnNldCA9IGdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIGkpOworICAgICAgICBpbnQgc2l6ZSwgc2l6ZTI7CisKKyAgICAgICAgaWYgKG9mZnNldCA+PSBidWZfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGlmIChpICsgMSA9PSBzbGljZV9jb3VudCkKKyAgICAgICAgICAgIHNpemUgPSBidWZfc2l6ZSAtIG9mZnNldDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2l6ZSA9IGdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIGkgKyAxKSAtIG9mZnNldDsKKworICAgICAgICBpZiAoaSArIDIgPj0gc2xpY2VfY291bnQpCisgICAgICAgICAgICBzaXplMiA9IGJ1Zl9zaXplIC0gb2Zmc2V0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBzaXplMiA9IGdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIGkgKyAyKSAtIG9mZnNldDsKKworICAgICAgICBpZiAoc2l6ZSA8PSAwIHx8IHNpemUyIDw9IDAgfHwKKyAgICAgICAgICAgIG9mZnNldCArIEZGTUFYKHNpemUsIHNpemUyKSA+IGJ1Zl9zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKChyZXQgPSBydjEwX2RlY29kZV9wYWNrZXQoYXZjdHgsIGJ1ZiArIG9mZnNldCwgc2l6ZSwgc2l6ZTIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmIChyZXQgPiA4ICogc2l6ZSkKKyAgICAgICAgICAgIGkrKzsKKyAgICB9CisKKyAgICBpZiAocy0+Y3VycmVudF9waWN0dXJlX3B0ciAmJiBzLT5tYl95ID49IHMtPm1iX2hlaWdodCkgeworICAgICAgICBmZl9lcl9mcmFtZV9lbmQoJnMtPmVyKTsKKyAgICAgICAgZmZfbXB2X2ZyYW1lX2VuZChzKTsKKworICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CIHx8IHMtPmxvd19kZWxheSkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYocGljdCwgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+ZikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgZmZfcHJpbnRfZGVidWdfaW5mbyhzLCBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLCBwaWN0KTsKKyAgICAgICAgICAgIGZmX21wdl9leHBvcnRfcXBfdGFibGUocywgcGljdCwgcy0+Y3VycmVudF9waWN0dXJlX3B0ciwgRkZfUVNDQUxFX1RZUEVfTVBFRzEpOworICAgICAgICB9IGVsc2UgaWYgKHMtPmxhc3RfcGljdHVyZV9wdHIpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKHBpY3QsIHMtPmxhc3RfcGljdHVyZV9wdHItPmYpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGZmX3ByaW50X2RlYnVnX2luZm8ocywgcy0+bGFzdF9waWN0dXJlX3B0ciwgcGljdCk7CisgICAgICAgICAgICBmZl9tcHZfZXhwb3J0X3FwX3RhYmxlKHMsIHBpY3Qscy0+bGFzdF9waWN0dXJlX3B0ciwgRkZfUVNDQUxFX1RZUEVfTVBFRzEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPmxhc3RfcGljdHVyZV9wdHIgfHwgcy0+bG93X2RlbGF5KSB7CisgICAgICAgICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNvIHdlIGNhbiBkZXRlY3QgaWYgZnJhbWVfZW5kIHdhcyBub3QgY2FsbGVkIChmaW5kIHNvbWUgbmljZXIgc29sdXRpb24uLi4pCisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl9ydjEwX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInJ2MTAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsVmlkZW8gMS4wIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1JWMTAsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFJWRGVjQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gcnYxMF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBydjEwX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gcnYxMF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAubWF4X2xvd3JlcyAgICAgPSAzLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeworICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH0sCit9OworCitBVkNvZGVjIGZmX3J2MjBfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicnYyMCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlYWxWaWRlbyAyLjAiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUlYyMCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUlZEZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBydjEwX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHJ2MTBfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBydjEwX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5mbHVzaCAgICAgICAgICA9IGZmX21wZWdfZmx1c2gsCisgICAgLm1heF9sb3dyZXMgICAgID0gMywKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3J2MTBlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3J2MTBlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTQxMTMyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnYxMGVuYy5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBSVjEwIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSVjEwIGVuY29kZXIKKyAqLworCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKwordm9pZCBmZl9ydjEwX2VuY29kZV9waWN0dXJlX2hlYWRlcihNcGVnRW5jQ29udGV4dCAqcywgaW50IHBpY3R1cmVfbnVtYmVyKQoreworICAgIGludCBmdWxsX2ZyYW1lPSAwOworCisgICAgYXZwcml2X2FsaWduX3B1dF9iaXRzKCZzLT5wYik7CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOyAgICAgLyogbWFya2VyICovCisKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApKTsKKworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAvKiBub3QgUEIgZnJhbWUgKi8KKworICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgcy0+cXNjYWxlKTsKKworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgLyogc3BlY2lmaWMgTVBFRyBsaWtlIERDIGNvZGluZyBub3QgdXNlZCAqLworICAgIH0KKyAgICAvKiBpZiBtdWx0aXBsZSBwYWNrZXRzIHBlciBmcmFtZSBhcmUgc2VudCwgdGhlIHBvc2l0aW9uIGF0IHdoaWNoCisgICAgICAgdG8gZGlzcGxheSB0aGUgbWFjcm9ibG9ja3MgaXMgY29kZWQgaGVyZSAqLworICAgIGlmKCFmdWxsX2ZyYW1lKXsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA2LCAwKTsgLyogbWJfeCAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDYsIDApOyAvKiBtYl95ICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMTIsIHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0KTsKKyAgICB9CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDMsIDApOyAgICAgLyogaWdub3JlZCAqLworfQorCitGRl9NUFZfR0VORVJJQ19DTEFTUyhydjEwKQorCitBVkNvZGVjIGZmX3J2MTBfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicnYxMCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlYWxWaWRlbyAxLjAiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUlYxMCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ0VuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX21wdl9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBmZl9tcHZfZW5jb2RlX3BpY3R1cmUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9lbmQsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmcnYxMF9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ydjIwZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9ydjIwZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyNzVjNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3J2MjBlbmMuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogUlYyMCBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUlYyMCBlbmNvZGVyCisgKi8KKworI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgImgyNjMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCit2b2lkIGZmX3J2MjBfZW5jb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgcGljdHVyZV9udW1iZXIpeworICAgIHB1dF9iaXRzKCZzLT5wYiwgMiwgcy0+cGljdF90eXBlKTsgLy9JIDAgdnMuIDEgPworICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAvKiB1bmtub3duIGJpdCAqLworICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgcy0+cXNjYWxlKTsKKworICAgIHB1dF9zYml0cygmcy0+cGIsIDgsIHBpY3R1cmVfbnVtYmVyKTsgLy9GSVhNRSB3cm9uZywgYnV0IGNvcnJlY3QgaXMgbm90IGtub3duCisgICAgcy0+bWJfeD0gcy0+bWJfeT0gMDsKKyAgICBmZl9oMjYzX2VuY29kZV9tYmEocyk7CisKKyAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPm5vX3JvdW5kaW5nKTsKKworICAgIGF2X2Fzc2VydDAocy0+Zl9jb2RlID09IDEpOworICAgIGF2X2Fzc2VydDAocy0+dW5yZXN0cmljdGVkX212ID09IDApOworICAgIGF2X2Fzc2VydDAocy0+YWx0X2ludGVyX3ZsYyA9PSAwKTsKKyAgICBhdl9hc3NlcnQwKHMtPnVtdnBsdXMgPT0gMCk7CisgICAgYXZfYXNzZXJ0MChzLT5tb2RpZmllZF9xdWFudD09MSk7CisgICAgYXZfYXNzZXJ0MChzLT5sb29wX2ZpbHRlcj09MSk7CisKKyAgICBzLT5oMjYzX2FpYz0gcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGlmKHMtPmgyNjNfYWljKXsKKyAgICAgICAgcy0+eV9kY19zY2FsZV90YWJsZT0KKyAgICAgICAgcy0+Y19kY19zY2FsZV90YWJsZT0gZmZfYWljX2RjX3NjYWxlX3RhYmxlOworICAgIH1lbHNleworICAgICAgICBzLT55X2RjX3NjYWxlX3RhYmxlPQorICAgICAgICBzLT5jX2RjX3NjYWxlX3RhYmxlPSBmZl9tcGVnMV9kY19zY2FsZV90YWJsZTsKKyAgICB9Cit9CisKK0ZGX01QVl9HRU5FUklDX0NMQVNTKHJ2MjApCisKK0FWQ29kZWMgZmZfcnYyMF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJydjIwIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVhbFZpZGVvIDIuMCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9SVjIwLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGZmX21wdl9lbmNvZGVfcGljdHVyZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl9tcHZfZW5jb2RlX2VuZCwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfTk9ORSB9LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZydjIwX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3J2MzAuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3J2MzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDgzMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnYzMC5jCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogUlYzMCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSVjMwIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1wZWd1dGlscy5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgImdvbG9tYi5oIgorCisjaW5jbHVkZSAicnYzNC5oIgorI2luY2x1ZGUgInJ2MzBkYXRhLmgiCisKKworc3RhdGljIGludCBydjMwX3BhcnNlX3NsaWNlX2hlYWRlcihSVjM0RGVjQ29udGV4dCAqciwgR2V0Qml0Q29udGV4dCAqZ2IsIFNsaWNlSW5mbyAqc2kpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gci0+cy5hdmN0eDsKKyAgICBpbnQgbWJfYml0czsKKyAgICBpbnQgdyA9IHItPnMud2lkdGgsIGggPSByLT5zLmhlaWdodDsKKyAgICBpbnQgbWJfc2l6ZTsKKyAgICBpbnQgcnByOworCisgICAgbWVtc2V0KHNpLCAwLCBzaXplb2YoU2xpY2VJbmZvKSk7CisgICAgaWYoZ2V0X2JpdHMoZ2IsIDMpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc2ktPnR5cGUgPSBnZXRfYml0cyhnYiwgMik7CisgICAgaWYoc2ktPnR5cGUgPT0gMSkgc2ktPnR5cGUgPSAwOworICAgIGlmKGdldF9iaXRzMShnYikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzaS0+cXVhbnQgPSBnZXRfYml0cyhnYiwgNSk7CisgICAgc2tpcF9iaXRzMShnYik7CisgICAgc2ktPnB0cyA9IGdldF9iaXRzKGdiLCAxMyk7CisgICAgcnByID0gZ2V0X2JpdHMoZ2IsIGF2X2xvZzIoci0+bWF4X3JwcikgKyAxKTsKKyAgICBpZihycHIpeworICAgICAgICBpZiAocnByID4gci0+bWF4X3JwcikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJycHIgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IHJwciAqIDIgKyA4KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW5zdWZmaWNpZW50IGV4dHJhZGF0YSAtIG5lZWQgYXQgbGVhc3QgJWQgYnl0ZXMsIGdvdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICA4ICsgcnByICogMiwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICB3ID0gci0+cy5hdmN0eC0+ZXh0cmFkYXRhWzYgKyBycHIqMl0gPDwgMjsKKyAgICAgICAgaCA9IHItPnMuYXZjdHgtPmV4dHJhZGF0YVs3ICsgcnByKjJdIDw8IDI7CisgICAgfQorICAgIHNpLT53aWR0aCAgPSB3OworICAgIHNpLT5oZWlnaHQgPSBoOworICAgIG1iX3NpemUgPSAoKHcgKyAxNSkgPj4gNCkgKiAoKGggKyAxNSkgPj4gNCk7CisgICAgbWJfYml0cyA9IGZmX3J2MzRfZ2V0X3N0YXJ0X29mZnNldChnYiwgbWJfc2l6ZSk7CisgICAgc2ktPnN0YXJ0ID0gZ2V0X2JpdHMoZ2IsIG1iX2JpdHMpOworICAgIHNraXBfYml0czEoZ2IpOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSA0eDQgaW50cmEgdHlwZXMgYXJyYXkuCisgKi8KK3N0YXRpYyBpbnQgcnYzMF9kZWNvZGVfaW50cmFfdHlwZXMoUlYzNERlY0NvbnRleHQgKnIsIEdldEJpdENvbnRleHQgKmdiLCBpbnQ4X3QgKmRzdCkKK3sKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKywgZHN0ICs9IHItPmludHJhX3R5cGVzX3N0cmlkZSAtIDQpeworICAgICAgICBmb3IoaiA9IDA7IGogPCA0OyBqKz0gMil7CisgICAgICAgICAgICB1bnNpZ25lZCBjb2RlID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKSA8PCAxOworICAgICAgICAgICAgaWYgKGNvZGUgPiA4MFUqMlUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coci0+cy5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IGludHJhIHByZWRpY3Rpb24gY29kZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgMjsgaysrKXsKKyAgICAgICAgICAgICAgICBpbnQgQSA9IGRzdFstci0+aW50cmFfdHlwZXNfc3RyaWRlXSArIDE7CisgICAgICAgICAgICAgICAgaW50IEIgPSBkc3RbLTFdICsgMTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBydjMwX2l0eXBlX2Zyb21fY29udGV4dFtBICogOTAgKyBCICogOSArIHJ2MzBfaXR5cGVfY29kZVtjb2RlICsga11dOworICAgICAgICAgICAgICAgIGlmKGRzdFstMV0gPT0gOSl7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhyLT5zLmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgaW50cmEgcHJlZGljdGlvbiBtb2RlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgbWFjcm9ibG9jayBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIGludCBydjMwX2RlY29kZV9tYl9pbmZvKFJWMzREZWNDb250ZXh0ICpyKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgcnYzMF9wX3R5cGVzWzZdID0geyBSVjM0X01CX1NLSVAsIFJWMzRfTUJfUF8xNngxNiwgUlYzNF9NQl9QXzh4OCwgLTEsIFJWMzRfTUJfVFlQRV9JTlRSQSwgUlYzNF9NQl9UWVBFX0lOVFJBMTZ4MTYgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHJ2MzBfYl90eXBlc1s2XSA9IHsgUlYzNF9NQl9TS0lQLCBSVjM0X01CX0JfRElSRUNULCBSVjM0X01CX0JfRk9SV0FSRCwgUlYzNF9NQl9CX0JBQ0tXQVJELCBSVjM0X01CX1RZUEVfSU5UUkEsIFJWMzRfTUJfVFlQRV9JTlRSQTE2eDE2IH07CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmci0+czsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICB1bnNpZ25lZCBjb2RlICAgICA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisKKyAgICBpZiAoY29kZSA+IDExKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IE1CIHR5cGUgY29kZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYoY29kZSA+IDUpeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRxdWFudCBuZWVkZWRcbiIpOworICAgICAgICBjb2RlIC09IDY7CisgICAgfQorICAgIGlmKHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgcmV0dXJuIHJ2MzBfcF90eXBlc1tjb2RlXTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBydjMwX2JfdHlwZXNbY29kZV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydjMwX3dlYWtfbG9vcF9maWx0ZXIodWludDhfdCAqc3JjLCBjb25zdCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0cmlkZSwgY29uc3QgaW50IGxpbSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOworICAgIGludCBpLCBkaWZmOworCisgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKXsKKyAgICAgICAgZGlmZiA9ICgoc3JjWy0yKnN0ZXBdIC0gc3JjWzEqc3RlcF0pIC0gKHNyY1stMSpzdGVwXSAtIHNyY1swKnN0ZXBdKSo0KSA+PiAzOworICAgICAgICBkaWZmID0gYXZfY2xpcChkaWZmLCAtbGltLCBsaW0pOworICAgICAgICBzcmNbLTEqc3RlcF0gPSBjbVtzcmNbLTEqc3RlcF0gKyBkaWZmXTsKKyAgICAgICAgc3JjWyAwKnN0ZXBdID0gY21bc3JjWyAwKnN0ZXBdIC0gZGlmZl07CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBydjMwX2xvb3BfZmlsdGVyKFJWMzREZWNDb250ZXh0ICpyLCBpbnQgcm93KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnItPnM7CisgICAgaW50IG1iX3BvcywgbWJfeDsKKyAgICBpbnQgaSwgaiwgazsKKyAgICB1aW50OF90ICpZLCAqQzsKKyAgICBpbnQgbG9jX2xpbSwgY3VyX2xpbSwgbGVmdF9saW0gPSAwLCB0b3BfbGltID0gMDsKKworICAgIG1iX3BvcyA9IHJvdyAqIHMtPm1iX3N0cmlkZTsKKyAgICBmb3IobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrLCBtYl9wb3MrKyl7CisgICAgICAgIGludCBtYnR5cGUgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tYl90eXBlW21iX3Bvc107CisgICAgICAgIGlmKElTX0lOVFJBKG1idHlwZSkgfHwgSVNfU0VQQVJBVEVfREMobWJ0eXBlKSkKKyAgICAgICAgICAgIHItPmRlYmxvY2tfY29lZnNbbWJfcG9zXSA9IDB4RkZGRjsKKyAgICAgICAgaWYoSVNfSU5UUkEobWJ0eXBlKSkKKyAgICAgICAgICAgIHItPmNicF9jaHJvbWFbbWJfcG9zXSA9IDB4RkY7CisgICAgfQorCisgICAgLyogYWxsIHZlcnRpY2FsIGVkZ2VzIGFyZSBmaWx0ZXJlZCBmaXJzdAorICAgICAqIGFuZCBob3Jpem9udGFsIGVkZ2VzIGFyZSBmaWx0ZXJlZCBvbiB0aGUgbmV4dCBpdGVyYXRpb24KKyAgICAgKi8KKyAgICBtYl9wb3MgPSByb3cgKiBzLT5tYl9zdHJpZGU7CisgICAgZm9yKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKywgbWJfcG9zKyspeworICAgICAgICBjdXJfbGltID0gcnYzMF9sb29wX2ZpbHRfbGltW3MtPmN1cnJlbnRfcGljdHVyZV9wdHItPnFzY2FsZV90YWJsZVttYl9wb3NdXTsKKyAgICAgICAgaWYobWJfeCkKKyAgICAgICAgICAgIGxlZnRfbGltID0gcnYzMF9sb29wX2ZpbHRfbGltW3MtPmN1cnJlbnRfcGljdHVyZV9wdHItPnFzY2FsZV90YWJsZVttYl9wb3MgLSAxXV07CisgICAgICAgIGZvcihqID0gMDsgaiA8IDE2OyBqICs9IDQpeworICAgICAgICAgICAgWSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmRhdGFbMF0gKyBtYl94KjE2ICsgKHJvdyoxNiArIGopICogcy0+bGluZXNpemUgKyA0ICogIW1iX3g7CisgICAgICAgICAgICBmb3IoaSA9ICFtYl94OyBpIDwgNDsgaSsrLCBZICs9IDQpeworICAgICAgICAgICAgICAgIGludCBpaiA9IGkgKyBqOworICAgICAgICAgICAgICAgIGxvY19saW0gPSAwOworICAgICAgICAgICAgICAgIGlmKHItPmRlYmxvY2tfY29lZnNbbWJfcG9zXSAmICgxIDw8IGlqKSkKKyAgICAgICAgICAgICAgICAgICAgbG9jX2xpbSA9IGN1cl9saW07CisgICAgICAgICAgICAgICAgZWxzZSBpZighaSAmJiByLT5kZWJsb2NrX2NvZWZzW21iX3BvcyAtIDFdICYgKDEgPDwgKGlqICsgMykpKQorICAgICAgICAgICAgICAgICAgICBsb2NfbGltID0gbGVmdF9saW07CisgICAgICAgICAgICAgICAgZWxzZSBpZiggaSAmJiByLT5kZWJsb2NrX2NvZWZzW21iX3Bvc10gICAgICYgKDEgPDwgKGlqIC0gMSkpKQorICAgICAgICAgICAgICAgICAgICBsb2NfbGltID0gY3VyX2xpbTsKKyAgICAgICAgICAgICAgICBpZihsb2NfbGltKQorICAgICAgICAgICAgICAgICAgICBydjMwX3dlYWtfbG9vcF9maWx0ZXIoWSwgMSwgcy0+bGluZXNpemUsIGxvY19saW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvcihrID0gMDsgayA8IDI7IGsrKyl7CisgICAgICAgICAgICBpbnQgY3VyX2NicCwgbGVmdF9jYnAgPSAwOworICAgICAgICAgICAgY3VyX2NicCA9IChyLT5jYnBfY2hyb21hW21iX3Bvc10gPj4gKGsqNCkpICYgMHhGOworICAgICAgICAgICAgaWYobWJfeCkKKyAgICAgICAgICAgICAgICBsZWZ0X2NicCA9IChyLT5jYnBfY2hyb21hW21iX3BvcyAtIDFdID4+IChrKjQpKSAmIDB4RjsKKyAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IDg7IGogKz0gNCl7CisgICAgICAgICAgICAgICAgQyA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmRhdGFbayArIDFdICsgbWJfeCo4ICsgKHJvdyo4ICsgaikgKiBzLT51dmxpbmVzaXplICsgNCAqICFtYl94OworICAgICAgICAgICAgICAgIGZvcihpID0gIW1iX3g7IGkgPCAyOyBpKyssIEMgKz0gNCl7CisgICAgICAgICAgICAgICAgICAgIGludCBpaiA9IGkgKyAoaiA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jX2xpbSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJfY2JwICYgKDEgPDwgaWopKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9jX2xpbSA9IGN1cl9saW07CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIWkgJiYgbGVmdF9jYnAgJiAoMSA8PCAoaWogKyAxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NfbGltID0gbGVmdF9saW07CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGkgJiYgY3VyX2NicCAgJiAoMSA8PCAoaWogLSAxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NfbGltID0gY3VyX2xpbTsKKyAgICAgICAgICAgICAgICAgICAgaWYobG9jX2xpbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ2MzBfd2Vha19sb29wX2ZpbHRlcihDLCAxLCBzLT51dmxpbmVzaXplLCBsb2NfbGltKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbWJfcG9zID0gcm93ICogcy0+bWJfc3RyaWRlOworICAgIGZvcihtYl94ID0gMDsgbWJfeCA8IHMtPm1iX3dpZHRoOyBtYl94KyssIG1iX3BvcysrKXsKKyAgICAgICAgY3VyX2xpbSA9IHJ2MzBfbG9vcF9maWx0X2xpbVtzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5xc2NhbGVfdGFibGVbbWJfcG9zXV07CisgICAgICAgIGlmKHJvdykKKyAgICAgICAgICAgIHRvcF9saW0gPSBydjMwX2xvb3BfZmlsdF9saW1bcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+cXNjYWxlX3RhYmxlW21iX3BvcyAtIHMtPm1iX3N0cmlkZV1dOworICAgICAgICBmb3IoaiA9IDQqIXJvdzsgaiA8IDE2OyBqICs9IDQpeworICAgICAgICAgICAgWSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmRhdGFbMF0gKyBtYl94KjE2ICsgKHJvdyoxNiArIGopICogcy0+bGluZXNpemU7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyssIFkgKz0gNCl7CisgICAgICAgICAgICAgICAgaW50IGlqID0gaSArIGo7CisgICAgICAgICAgICAgICAgbG9jX2xpbSA9IDA7CisgICAgICAgICAgICAgICAgaWYoci0+ZGVibG9ja19jb2Vmc1ttYl9wb3NdICYgKDEgPDwgaWopKQorICAgICAgICAgICAgICAgICAgICBsb2NfbGltID0gY3VyX2xpbTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCFqICYmIHItPmRlYmxvY2tfY29lZnNbbWJfcG9zIC0gcy0+bWJfc3RyaWRlXSAmICgxIDw8IChpaiArIDEyKSkpCisgICAgICAgICAgICAgICAgICAgIGxvY19saW0gPSB0b3BfbGltOworICAgICAgICAgICAgICAgIGVsc2UgaWYoIGogJiYgci0+ZGVibG9ja19jb2Vmc1ttYl9wb3NdICAgICAgICAgICAgICAgICYgKDEgPDwgKGlqIC0gNCkpKQorICAgICAgICAgICAgICAgICAgICBsb2NfbGltID0gY3VyX2xpbTsKKyAgICAgICAgICAgICAgICBpZihsb2NfbGltKQorICAgICAgICAgICAgICAgICAgICBydjMwX3dlYWtfbG9vcF9maWx0ZXIoWSwgcy0+bGluZXNpemUsIDEsIGxvY19saW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvcihrID0gMDsgayA8IDI7IGsrKyl7CisgICAgICAgICAgICBpbnQgY3VyX2NicCwgdG9wX2NicCA9IDA7CisgICAgICAgICAgICBjdXJfY2JwID0gKHItPmNicF9jaHJvbWFbbWJfcG9zXSA+PiAoayo0KSkgJiAweEY7CisgICAgICAgICAgICBpZihyb3cpCisgICAgICAgICAgICAgICAgdG9wX2NicCA9IChyLT5jYnBfY2hyb21hW21iX3BvcyAtIHMtPm1iX3N0cmlkZV0gPj4gKGsqNCkpICYgMHhGOworICAgICAgICAgICAgZm9yKGogPSA0KiFyb3c7IGogPCA4OyBqICs9IDQpeworICAgICAgICAgICAgICAgIEMgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5kYXRhW2srMV0gKyBtYl94KjggKyAocm93KjggKyBqKSAqIHMtPnV2bGluZXNpemU7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrLCBDICs9IDQpeworICAgICAgICAgICAgICAgICAgICBpbnQgaWogPSBpICsgKGogPj4gMSk7CisgICAgICAgICAgICAgICAgICAgIGxvY19saW0gPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoci0+Y2JwX2Nocm9tYVttYl9wb3NdICYgKDEgPDwgaWopKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9jX2xpbSA9IGN1cl9saW07CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIWogJiYgdG9wX2NicCAmICgxIDw8IChpaiArIDIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY19saW0gPSB0b3BfbGltOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBqICYmIGN1cl9jYnAgJiAoMSA8PCAoaWogLSAyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NfbGltID0gY3VyX2xpbTsKKyAgICAgICAgICAgICAgICAgICAgaWYobG9jX2xpbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ2MzBfd2Vha19sb29wX2ZpbHRlcihDLCBzLT51dmxpbmVzaXplLCAxLCBsb2NfbGltKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBkZWNvZGVyLgorICovCitzdGF0aWMgYXZfY29sZCBpbnQgcnYzMF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUlYzNERlY0NvbnRleHQgKnIgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkV4dHJhZGF0YSBpcyB0b28gc21hbGwuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgci0+cnYzMCA9IDE7CisgICAgaWYgKChyZXQgPSBmZl9ydjM0X2RlY29kZV9pbml0KGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgci0+bWF4X3JwciA9IGF2Y3R4LT5leHRyYWRhdGFbMV0gJiA3OworICAgIGlmKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDIqci0+bWF4X3JwciArIDgpeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW5zdWZmaWNpZW50IGV4dHJhZGF0YSAtIG5lZWQgYXQgbGVhc3QgJWQgYnl0ZXMsIGdvdCAlZFxuIiwKKyAgICAgICAgICAgICAgIDIqci0+bWF4X3JwciArIDgsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgfQorCisgICAgci0+cGFyc2Vfc2xpY2VfaGVhZGVyID0gcnYzMF9wYXJzZV9zbGljZV9oZWFkZXI7CisgICAgci0+ZGVjb2RlX2ludHJhX3R5cGVzID0gcnYzMF9kZWNvZGVfaW50cmFfdHlwZXM7CisgICAgci0+ZGVjb2RlX21iX2luZm8gICAgID0gcnYzMF9kZWNvZGVfbWJfaW5mbzsKKyAgICByLT5sb29wX2ZpbHRlciAgICAgICAgPSBydjMwX2xvb3BfZmlsdGVyOworICAgIHItPmx1bWFfZGNfcXVhbnRfaSA9IHJ2MzBfbHVtYV9kY19xdWFudDsKKyAgICByLT5sdW1hX2RjX3F1YW50X3AgPSBydjMwX2x1bWFfZGNfcXVhbnQ7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfcnYzMF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAicnYzMCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsVmlkZW8gMy4wIiksCisgICAgLnR5cGUgICAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUlYzMCwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKFJWMzREZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gcnYzMF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICAgICAgID0gZmZfcnYzNF9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICAgICAgICAgPSBmZl9ydjM0X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9ERUxBWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5mbHVzaCAgICAgICAgICAgICAgICAgPSBmZl9tcGVnX2ZsdXNoLAorICAgIC5waXhfZm10cyAgICAgICAgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorICAgIC5pbml0X3RocmVhZF9jb3B5ICAgICAgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChmZl9ydjM0X2RlY29kZV9pbml0X3RocmVhZF9jb3B5KSwKKyAgICAudXBkYXRlX3RocmVhZF9jb250ZXh0ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoZmZfcnYzNF9kZWNvZGVfdXBkYXRlX3RocmVhZF9jb250ZXh0KSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ydjMwZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnYzMGRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRjYjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnYzMGRhdGEuaApAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIFJlYWxWaWRlbyAzIGRlY29kZXIKKyAqIGNvcHlyaWdodCAoYykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIG1pc2NlbGxhbmVvdXMgUlYzMCB0YWJsZXMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUlYzMERBVEFfSAorI2RlZmluZSBBVkNPREVDX1JWMzBEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiogREMgcXVhbnRpemVyIG1hcHBpbmcgZm9yIFJWMzAgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHJ2MzBfbHVtYV9kY19xdWFudFszMl0gPSB7CisgICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIyLCAyMiwgMjMsIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUKK307CisKKy8qKgorICogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBzdG9yaW5nIHRoZSBkaWZmZXJlbmNlcworICogYmV0d2VlbiB0aGUgcHJlZGljdGVkIGFuZCB0aGUgcmVhbCBpbnRyYSB0eXBlLgorICovCitzdGF0aWMgY29uc3QgdWludDhfdCBydjMwX2l0eXBlX2NvZGVbOSo5KjJdID0geworICAgIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDAsIDIsIDIsIDAsIDAsIDMsIDMsIDAsIDEsIDIsCisgICAgMiwgMSwgMCwgNCwgNCwgMCwgMywgMSwgMSwgMywgMCwgNSwgNSwgMCwgMiwgMiwgMSwgNCwKKyAgICA0LCAxLCAwLCA2LCAzLCAyLCAxLCA1LCAyLCAzLCA1LCAxLCA2LCAwLCAwLCA3LCA0LCAyLAorICAgIDIsIDQsIDMsIDMsIDYsIDEsIDEsIDYsIDcsIDAsIDAsIDgsIDUsIDIsIDQsIDMsIDIsIDUsCisgICAgMywgNCwgMSwgNywgNCwgNCwgNywgMSwgOCwgMCwgNiwgMiwgMywgNSwgNSwgMywgMiwgNiwKKyAgICAxLCA4LCAyLCA3LCA3LCAyLCA4LCAxLCA1LCA0LCA0LCA1LCAzLCA2LCA2LCAzLCA4LCAyLAorICAgIDQsIDYsIDUsIDUsIDYsIDQsIDIsIDgsIDcsIDMsIDMsIDcsIDYsIDUsIDUsIDYsIDcsIDQsCisgICAgNCwgNywgOCwgMywgMywgOCwgNywgNSwgOCwgNCwgNSwgNywgNCwgOCwgNiwgNiwgNywgNiwKKyAgICA1LCA4LCA4LCA1LCA2LCA3LCA4LCA2LCA3LCA3LCA2LCA4LCA4LCA3LCA3LCA4LCA4LCA4LAorfTsKKworLyoqCisgKiBUaGlzIHRhYmxlIGlzIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGN1cnJlbnQgaW50cmEgdHlwZQorICogYmFzZWQgb24gaXRzIG5laWdoYm9ycyBhbmQgYWRqdXN0bWVudCBwcm92aWRlZCBieQorICogY29kZSByZWFkIGFuZCBkZWNvZGVkIGJlZm9yZS4KKyAqCisgKiBUaGlzIGlzIHJlYWxseSBhIHRocmVlLWRpbWVuc2lvbmFsIG1hdHJpeCB3aXRoIGRpbWVuc2lvbnMKKyAqIFstMS4uOV1bLTEuLjldWzAuLjldLiBUaGUgZmlyc3QgYW5kIHNlY29uZCBjb29yZGluYXRlcyBhcmUKKyAqIGRldGVybWluZWQgYnkgdGhlIHRvcCBhbmQgbGVmdCBuZWlnaGJvcnMgKC0xIGlmIHVuYXZhaWxhYmxlKS4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnYzMF9pdHlwZV9mcm9tX2NvbnRleHRbOTAwXSA9IHsKKyAgICAwLCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorICAgIDAsIDIsIDksIDksIDksIDksIDksIDksIDksCisgICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICAyLCAwLCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorICAgIDksIDksIDksIDksIDksIDksIDksIDksIDksCisgICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorICAgIDksIDksIDksIDksIDksIDksIDksIDksIDksCisgICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorCisgICAgMCwgMSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICAwLCAyLCAxLCA2LCA0LCA4LCA1LCA3LCAzLAorICAgIDEsIDAsIDIsIDYsIDUsIDQsIDMsIDgsIDcsCisgICAgMiwgOCwgMCwgMSwgNywgNCwgMywgNiwgNSwKKyAgICAyLCAwLCAxLCAzLCA4LCA1LCA0LCA3LCA2LAorICAgIDIsIDAsIDEsIDQsIDYsIDcsIDgsIDMsIDUsCisgICAgMCwgMSwgNSwgMiwgNiwgMywgOCwgNCwgNywKKyAgICAwLCAxLCA2LCAyLCA0LCA3LCA1LCA4LCAzLAorICAgIDIsIDcsIDAsIDEsIDQsIDgsIDYsIDMsIDUsCisgICAgMiwgOCwgMCwgMSwgNywgMywgNCwgNSwgNiwKKworICAgIDEsIDAsIDksIDksIDksIDksIDksIDksIDksCisgICAgMSwgMiwgNSwgNiwgMywgMCwgNCwgOCwgNywKKyAgICAxLCA2LCAyLCA1LCAzLCAwLCA0LCA4LCA3LAorICAgIDIsIDEsIDcsIDYsIDgsIDMsIDUsIDAsIDQsCisgICAgMSwgMiwgNSwgMywgNiwgOCwgNCwgNywgMCwKKyAgICAxLCA2LCAyLCAwLCA0LCA1LCA4LCA3LCAzLAorICAgIDEsIDUsIDIsIDYsIDMsIDgsIDQsIDAsIDcsCisgICAgMSwgNiwgMCwgMiwgNCwgNSwgNywgMywgOCwKKyAgICAyLCAxLCA3LCA2LCAwLCA4LCA1LCA0LCAzLAorICAgIDEsIDIsIDcsIDgsIDMsIDQsIDUsIDYsIDAsCisKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorICAgIDAsIDIsIDEsIDgsIDcsIDYsIDUsIDQsIDMsCisgICAgMSwgMiwgMCwgNiwgNSwgNywgNCwgOCwgMywKKyAgICAyLCA4LCA3LCAxLCAwLCA2LCA0LCAzLCA1LAorICAgIDIsIDAsIDgsIDEsIDMsIDcsIDUsIDQsIDYsCisgICAgMiwgMCwgNCwgMSwgNywgOCwgNiwgMywgNSwKKyAgICAyLCAwLCAxLCA1LCA4LCA0LCA2LCA3LCAzLAorICAgIDIsIDAsIDYsIDEsIDQsIDcsIDgsIDUsIDMsCisgICAgMiwgNywgOCwgMSwgMCwgNSwgNCwgNiwgMywKKyAgICAyLCA4LCA3LCAxLCAwLCA0LCAzLCA2LCA1LAorCisgICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICAwLCAyLCAxLCAzLCA1LCA4LCA2LCA0LCA3LAorICAgIDEsIDAsIDIsIDUsIDMsIDYsIDQsIDgsIDcsCisgICAgMiwgOCwgMSwgMCwgMywgNSwgNywgNiwgNCwKKyAgICAzLCAyLCA1LCA4LCAxLCA0LCA2LCA3LCAwLAorICAgIDQsIDIsIDAsIDYsIDEsIDUsIDgsIDMsIDcsCisgICAgNSwgMywgMSwgMiwgOCwgNiwgNCwgMCwgNywKKyAgICAxLCA2LCAwLCAyLCA0LCA1LCA4LCAzLCA3LAorICAgIDIsIDcsIDAsIDEsIDUsIDQsIDgsIDYsIDMsCisgICAgMiwgOCwgMywgNSwgMSwgMCwgNywgNiwgNCwKKworICAgIDksIDksIDksIDksIDksIDksIDksIDksIDksCisgICAgMiwgMCwgNiwgMSwgNCwgNywgNSwgOCwgMywKKyAgICAxLCA2LCAyLCAwLCA0LCA1LCAzLCA3LCA4LAorICAgIDIsIDgsIDcsIDYsIDQsIDAsIDEsIDUsIDMsCisgICAgNCwgMiwgMSwgMCwgNiwgOCwgMywgNSwgNywKKyAgICA0LCAyLCA2LCAwLCAxLCA1LCA3LCA4LCAzLAorICAgIDEsIDIsIDUsIDAsIDYsIDMsIDQsIDcsIDgsCisgICAgNiwgNCwgMCwgMSwgMiwgNywgNSwgMywgOCwKKyAgICAyLCA3LCA0LCA2LCAwLCAxLCA4LCA1LCAzLAorICAgIDIsIDgsIDcsIDQsIDYsIDEsIDMsIDUsIDAsCisKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorICAgIDUsIDEsIDIsIDMsIDYsIDgsIDAsIDQsIDcsCisgICAgMSwgNSwgNiwgMywgMiwgMCwgNCwgOCwgNywKKyAgICAyLCAxLCA1LCAzLCA2LCA4LCA3LCA0LCAwLAorICAgIDUsIDMsIDEsIDIsIDYsIDgsIDQsIDcsIDAsCisgICAgMSwgNiwgMiwgNCwgNSwgOCwgMCwgMywgNywKKyAgICA1LCAxLCAzLCA2LCAyLCAwLCA4LCA0LCA3LAorICAgIDEsIDYsIDUsIDIsIDAsIDQsIDMsIDcsIDgsCisgICAgMiwgNywgMSwgNiwgNSwgMCwgOCwgMywgNCwKKyAgICAyLCA1LCAxLCAzLCA2LCA4LCA0LCAwLCA3LAorCisgICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICAxLCA2LCAyLCAwLCA1LCA0LCAzLCA3LCA4LAorICAgIDEsIDYsIDUsIDQsIDIsIDMsIDAsIDcsIDgsCisgICAgMiwgMSwgNiwgNywgNCwgOCwgNSwgMywgMCwKKyAgICAyLCAxLCA2LCA1LCA4LCA0LCAzLCAwLCA3LAorICAgIDYsIDQsIDEsIDIsIDAsIDUsIDcsIDgsIDMsCisgICAgMSwgNiwgNSwgMiwgMywgMCwgNCwgOCwgNywKKyAgICA2LCAxLCA0LCAwLCAyLCA3LCA1LCAzLCA4LAorICAgIDIsIDcsIDQsIDYsIDEsIDUsIDAsIDgsIDMsCisgICAgMiwgMSwgNiwgOCwgNCwgNywgMywgNSwgMCwKKworICAgIDksIDksIDksIDksIDksIDksIDksIDksIDksCisgICAgMiwgMCwgNCwgNywgNiwgMSwgOCwgNSwgMywKKyAgICA2LCAxLCAyLCAwLCA0LCA3LCA1LCA4LCAzLAorICAgIDIsIDcsIDgsIDAsIDEsIDYsIDQsIDMsIDUsCisgICAgMiwgNCwgMCwgOCwgMywgMSwgNywgNiwgNSwKKyAgICA0LCAyLCA3LCAwLCA2LCAxLCA4LCA1LCAzLAorICAgIDIsIDEsIDAsIDgsIDUsIDYsIDcsIDQsIDMsCisgICAgMiwgNiwgNCwgMSwgNywgMCwgNSwgOCwgMywKKyAgICAyLCA3LCA0LCAwLCA4LCA2LCAxLCA1LCAzLAorICAgIDIsIDgsIDcsIDQsIDEsIDAsIDMsIDYsIDUsCisKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorICAgIDIsIDAsIDgsIDEsIDMsIDQsIDYsIDUsIDcsCisgICAgMSwgMiwgMCwgNiwgOCwgNSwgNywgMywgNCwKKyAgICAyLCA4LCA3LCAxLCAwLCAzLCA2LCA1LCA0LAorICAgIDgsIDMsIDIsIDUsIDEsIDAsIDQsIDcsIDYsCisgICAgMiwgMCwgNCwgOCwgNSwgMSwgNywgNiwgMywKKyAgICAyLCAxLCAwLCA4LCA1LCAzLCA2LCA0LCA3LAorICAgIDIsIDEsIDYsIDAsIDgsIDQsIDUsIDcsIDMsCisgICAgMiwgNywgOCwgNCwgMCwgNiwgMSwgNSwgMywKKyAgICAyLCA4LCAzLCAwLCA3LCA0LCAxLCA2LCA1LAorfTsKKworLyoqCisgKiBMb29wIGZpbHRlciBsaW1pdHMgYXJlIHRha2VuIGZyb20gdGhpcyB0YWJsZS4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnYzMF9sb29wX2ZpbHRfbGltWzMyXSA9IHsKKyAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNQorfTsKKyNlbmRpZiAvKiBBVkNPREVDX1JWMzBEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3J2MzBkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3J2MzBkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjIwNWUwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnYzMGRzcC5jCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogUlYzMCBkZWNvZGVyIG1vdGlvbiBjb21wZW5zYXRpb24gZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSVjMwIGRlY29kZXIgbW90aW9uIGNvbXBlbnNhdGlvbiBmdW5jdGlvbnMKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjRjaHJvbWEuaCIKKyNpbmNsdWRlICJoMjY0cXBlbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJydjM0ZHNwLmgiCisKKyNkZWZpbmUgUlYzMF9MT1dQQVNTKE9QTkFNRSwgT1ApIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBydjMwX3RwZWw4X2hfbG93cGFzcyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgY29uc3QgaW50IEMxLCBjb25zdCBpbnQgQzIpe1wKKyAgICBjb25zdCBpbnQgaCA9IDg7XAorICAgIGNvbnN0IHVpbnQ4X3QgKmNtID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7XAorICAgIGludCBpO1wKKyAgICBmb3IoaSA9IDA7IGkgPCBoOyBpKyspXAorICAgIHtcCisgICAgICAgIE9QKGRzdFswXSwgKC0oc3JjWy0xXStzcmNbMl0pICsgc3JjWzBdKkMxICsgc3JjWzFdKkMyICsgOCk+PjQpO1wKKyAgICAgICAgT1AoZHN0WzFdLCAoLShzcmNbIDBdK3NyY1szXSkgKyBzcmNbMV0qQzEgKyBzcmNbMl0qQzIgKyA4KT4+NCk7XAorICAgICAgICBPUChkc3RbMl0sICgtKHNyY1sgMV0rc3JjWzRdKSArIHNyY1syXSpDMSArIHNyY1szXSpDMiArIDgpPj40KTtcCisgICAgICAgIE9QKGRzdFszXSwgKC0oc3JjWyAyXStzcmNbNV0pICsgc3JjWzNdKkMxICsgc3JjWzRdKkMyICsgOCk+PjQpO1wKKyAgICAgICAgT1AoZHN0WzRdLCAoLShzcmNbIDNdK3NyY1s2XSkgKyBzcmNbNF0qQzEgKyBzcmNbNV0qQzIgKyA4KT4+NCk7XAorICAgICAgICBPUChkc3RbNV0sICgtKHNyY1sgNF0rc3JjWzddKSArIHNyY1s1XSpDMSArIHNyY1s2XSpDMiArIDgpPj40KTtcCisgICAgICAgIE9QKGRzdFs2XSwgKC0oc3JjWyA1XStzcmNbOF0pICsgc3JjWzZdKkMxICsgc3JjWzddKkMyICsgOCk+PjQpO1wKKyAgICAgICAgT1AoZHN0WzddLCAoLShzcmNbIDZdK3NyY1s5XSkgKyBzcmNbN10qQzEgKyBzcmNbOF0qQzIgKyA4KT4+NCk7XAorICAgICAgICBkc3QgKz0gZHN0U3RyaWRlO1wKKyAgICAgICAgc3JjICs9IHNyY1N0cmlkZTtcCisgICAgfVwKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnYzMF90cGVsOF92X2xvd3Bhc3ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGNvbnN0IGludCBDMSwgY29uc3QgaW50IEMyKXtcCisgICAgY29uc3QgaW50IHcgPSA4O1wKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QO1wKKyAgICBpbnQgaTtcCisgICAgZm9yKGkgPSAwOyBpIDwgdzsgaSsrKVwKKyAgICB7XAorICAgICAgICBjb25zdCBpbnQgc3JjQSA9IHNyY1stMSpzcmNTdHJpZGVdO1wKKyAgICAgICAgY29uc3QgaW50IHNyYzAgPSBzcmNbMCAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMxID0gc3JjWzEgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjMiA9IHNyY1syICpzcmNTdHJpZGVdO1wKKyAgICAgICAgY29uc3QgaW50IHNyYzMgPSBzcmNbMyAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM0ID0gc3JjWzQgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjNSA9IHNyY1s1ICpzcmNTdHJpZGVdO1wKKyAgICAgICAgY29uc3QgaW50IHNyYzYgPSBzcmNbNiAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM3ID0gc3JjWzcgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjOCA9IHNyY1s4ICpzcmNTdHJpZGVdO1wKKyAgICAgICAgY29uc3QgaW50IHNyYzkgPSBzcmNbOSAqc3JjU3RyaWRlXTtcCisgICAgICAgIE9QKGRzdFswKmRzdFN0cmlkZV0sICgtKHNyY0Erc3JjMikgKyBzcmMwKkMxICsgc3JjMSpDMiArIDgpPj40KTtcCisgICAgICAgIE9QKGRzdFsxKmRzdFN0cmlkZV0sICgtKHNyYzArc3JjMykgKyBzcmMxKkMxICsgc3JjMipDMiArIDgpPj40KTtcCisgICAgICAgIE9QKGRzdFsyKmRzdFN0cmlkZV0sICgtKHNyYzErc3JjNCkgKyBzcmMyKkMxICsgc3JjMypDMiArIDgpPj40KTtcCisgICAgICAgIE9QKGRzdFszKmRzdFN0cmlkZV0sICgtKHNyYzIrc3JjNSkgKyBzcmMzKkMxICsgc3JjNCpDMiArIDgpPj40KTtcCisgICAgICAgIE9QKGRzdFs0KmRzdFN0cmlkZV0sICgtKHNyYzMrc3JjNikgKyBzcmM0KkMxICsgc3JjNSpDMiArIDgpPj40KTtcCisgICAgICAgIE9QKGRzdFs1KmRzdFN0cmlkZV0sICgtKHNyYzQrc3JjNykgKyBzcmM1KkMxICsgc3JjNipDMiArIDgpPj40KTtcCisgICAgICAgIE9QKGRzdFs2KmRzdFN0cmlkZV0sICgtKHNyYzUrc3JjOCkgKyBzcmM2KkMxICsgc3JjNypDMiArIDgpPj40KTtcCisgICAgICAgIE9QKGRzdFs3KmRzdFN0cmlkZV0sICgtKHNyYzYrc3JjOSkgKyBzcmM3KkMxICsgc3JjOCpDMiArIDgpPj40KTtcCisgICAgICAgIGRzdCsrO1wKKyAgICAgICAgc3JjKys7XAorICAgIH1cCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2MzBfdHBlbDhfaHZfbG93cGFzcyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGNvbnN0IGludCB3ID0gODtcCisgICAgY29uc3QgaW50IGggPSA4O1wKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QO1wKKyAgICBpbnQgaSwgajtcCisgICAgZm9yKGogPSAwOyBqIDwgaDsgaisrKXtcCisgICAgICAgIGZvcihpID0gMDsgaSA8IHc7IGkrKyl7XAorICAgICAgICAgICAgT1AoZHN0W2ldLCAoXAorICAgICAgICAgICAgICAgICAgc3JjW3NyY1N0cmlkZSotMStpLTFdICAtMTIqc3JjW3NyY1N0cmlkZSotMStpXSAgLTYqc3JjW3NyY1N0cmlkZSotMStpKzFdICAgICtzcmNbc3JjU3RyaWRlKi0xK2krMl0rXAorICAgICAgICAgICAgICAtMTIqc3JjW3NyY1N0cmlkZSogMCtpLTFdICsxNDQqc3JjW3NyY1N0cmlkZSogMCtpXSArNzIqc3JjW3NyY1N0cmlkZSogMCtpKzFdIC0xMipzcmNbc3JjU3RyaWRlKiAwK2krMl0gK1wKKyAgICAgICAgICAgICAgIC02KnNyY1tzcmNTdHJpZGUqIDEraS0xXSAgKzcyKnNyY1tzcmNTdHJpZGUqIDEraV0gKzM2KnNyY1tzcmNTdHJpZGUqIDEraSsxXSAgLTYqc3JjW3NyY1N0cmlkZSogMStpKzJdICtcCisgICAgICAgICAgICAgICAgICBzcmNbc3JjU3RyaWRlKiAyK2ktMV0gIC0xMipzcmNbc3JjU3RyaWRlKiAyK2ldICAtNipzcmNbc3JjU3RyaWRlKiAyK2krMV0gICAgK3NyY1tzcmNTdHJpZGUqIDIraSsyXSArXAorICAgICAgICAgICAgICAgICAgMTI4KT4+OCk7XAorICAgICAgICB9XAorICAgICAgICBzcmMgKz0gc3JjU3RyaWRlO1wKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZTtcCisgICAgfVwKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnYzMF90cGVsOF9oaHZfbG93cGFzcyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGNvbnN0IGludCB3ID0gODtcCisgICAgY29uc3QgaW50IGggPSA4O1wKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QO1wKKyAgICBpbnQgaSwgajtcCisgICAgZm9yKGogPSAwOyBqIDwgaDsgaisrKXtcCisgICAgICAgIGZvcihpID0gMDsgaSA8IHc7IGkrKyl7XAorICAgICAgICAgICAgT1AoZHN0W2ldLCAoXAorICAgICAgICAgICAgICAgICAgc3JjW3NyY1N0cmlkZSotMStpLTFdICAtMTIqc3JjW3NyY1N0cmlkZSotMStpKzFdICAtNipzcmNbc3JjU3RyaWRlKi0xK2ldICAgICtzcmNbc3JjU3RyaWRlKi0xK2krMl0rXAorICAgICAgICAgICAgICAtMTIqc3JjW3NyY1N0cmlkZSogMCtpLTFdICsxNDQqc3JjW3NyY1N0cmlkZSogMCtpKzFdICs3MipzcmNbc3JjU3RyaWRlKiAwK2ldIC0xMipzcmNbc3JjU3RyaWRlKiAwK2krMl0rXAorICAgICAgICAgICAgICAgLTYqc3JjW3NyY1N0cmlkZSogMStpLTFdICArNzIqc3JjW3NyY1N0cmlkZSogMStpKzFdICszNipzcmNbc3JjU3RyaWRlKiAxK2ldICAtNipzcmNbc3JjU3RyaWRlKiAxK2krMl0rXAorICAgICAgICAgICAgICAgICAgc3JjW3NyY1N0cmlkZSogMitpLTFdICAtMTIqc3JjW3NyY1N0cmlkZSogMitpKzFdICAtNipzcmNbc3JjU3RyaWRlKiAyK2ldICAgICtzcmNbc3JjU3RyaWRlKiAyK2krMl0rXAorICAgICAgICAgICAgICAgICAgMTI4KT4+OCk7XAorICAgICAgICB9XAorICAgICAgICBzcmMgKz0gc3JjU3RyaWRlO1wKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZTtcCisgICAgfVwKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnYzMF90cGVsOF9odnZfbG93cGFzcyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGNvbnN0IGludCB3ID0gODtcCisgICAgY29uc3QgaW50IGggPSA4O1wKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QO1wKKyAgICBpbnQgaSwgajtcCisgICAgZm9yKGogPSAwOyBqIDwgaDsgaisrKXtcCisgICAgICAgIGZvcihpID0gMDsgaSA8IHc7IGkrKyl7XAorICAgICAgICAgICAgT1AoZHN0W2ldLCAoXAorICAgICAgICAgICAgICAgICAgc3JjW3NyY1N0cmlkZSotMStpLTFdICAtMTIqc3JjW3NyY1N0cmlkZSotMStpXSAgLTYqc3JjW3NyY1N0cmlkZSotMStpKzFdICAgICtzcmNbc3JjU3RyaWRlKi0xK2krMl0rXAorICAgICAgICAgICAgICAgLTYqc3JjW3NyY1N0cmlkZSogMCtpLTFdICArNzIqc3JjW3NyY1N0cmlkZSogMCtpXSArMzYqc3JjW3NyY1N0cmlkZSogMCtpKzFdICAtNipzcmNbc3JjU3RyaWRlKiAwK2krMl0rXAorICAgICAgICAgICAgICAtMTIqc3JjW3NyY1N0cmlkZSogMStpLTFdICsxNDQqc3JjW3NyY1N0cmlkZSogMStpXSArNzIqc3JjW3NyY1N0cmlkZSogMStpKzFdIC0xMipzcmNbc3JjU3RyaWRlKiAxK2krMl0rXAorICAgICAgICAgICAgICAgICAgc3JjW3NyY1N0cmlkZSogMitpLTFdICAtMTIqc3JjW3NyY1N0cmlkZSogMitpXSAgLTYqc3JjW3NyY1N0cmlkZSogMitpKzFdICAgICtzcmNbc3JjU3RyaWRlKiAyK2krMl0rXAorICAgICAgICAgICAgICAgICAgMTI4KT4+OCk7XAorICAgICAgICB9XAorICAgICAgICBzcmMgKz0gc3JjU3RyaWRlO1wKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZTtcCisgICAgfVwKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnYzMF90cGVsOF9oaHZ2X2xvd3Bhc3ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKKyAgICBjb25zdCBpbnQgdyA9IDg7XAorICAgIGNvbnN0IGludCBoID0gODtcCisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDtcCisgICAgaW50IGksIGo7XAorICAgIGZvcihqID0gMDsgaiA8IGg7IGorKyl7XAorICAgICAgICBmb3IoaSA9IDA7IGkgPCB3OyBpKyspe1wKKyAgICAgICAgICAgIE9QKGRzdFtpXSwgKFwKKyAgICAgICAgICAgICAgIDM2KnNyY1tpK3NyY1N0cmlkZSowXSArNTQqc3JjW2krMStzcmNTdHJpZGUqMF0gKzYqc3JjW2krMitzcmNTdHJpZGUqMF0rXAorICAgICAgICAgICAgICAgNTQqc3JjW2krc3JjU3RyaWRlKjFdICs4MSpzcmNbaSsxK3NyY1N0cmlkZSoxXSArOSpzcmNbaSsyK3NyY1N0cmlkZSoxXStcCisgICAgICAgICAgICAgICAgNipzcmNbaStzcmNTdHJpZGUqMl0gKyA5KnNyY1tpKzErc3JjU3RyaWRlKjJdICsgIHNyY1tpKzIrc3JjU3RyaWRlKjJdK1wKKyAgICAgICAgICAgICAgIDEyOCk+PjgpO1wKKyAgICAgICAgfVwKKyAgICAgICAgc3JjICs9IHNyY1N0cmlkZTtcCisgICAgICAgIGRzdCArPSBkc3RTdHJpZGU7XAorICAgIH1cCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2MzBfdHBlbDE2X3ZfbG93cGFzcyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgY29uc3QgaW50IEMxLCBjb25zdCBpbnQgQzIpe1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsOF92X2xvd3Bhc3MoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgQzEsIEMyKTtcCisgICAgT1BOQU1FICMjIHJ2MzBfdHBlbDhfdl9sb3dwYXNzKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIEMxLCBDMik7XAorICAgIHNyYyArPSA4KnNyY1N0cmlkZTtcCisgICAgZHN0ICs9IDgqZHN0U3RyaWRlO1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsOF92X2xvd3Bhc3MoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgQzEsIEMyKTtcCisgICAgT1BOQU1FICMjIHJ2MzBfdHBlbDhfdl9sb3dwYXNzKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIEMxLCBDMik7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBydjMwX3RwZWwxNl9oX2xvd3Bhc3ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGNvbnN0IGludCBDMSwgY29uc3QgaW50IEMyKXtcCisgICAgT1BOQU1FICMjIHJ2MzBfdHBlbDhfaF9sb3dwYXNzKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIEMxLCBDMik7XAorICAgIE9QTkFNRSAjIyBydjMwX3RwZWw4X2hfbG93cGFzcyhkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCBDMSwgQzIpO1wKKyAgICBzcmMgKz0gOCpzcmNTdHJpZGU7XAorICAgIGRzdCArPSA4KmRzdFN0cmlkZTtcCisgICAgT1BOQU1FICMjIHJ2MzBfdHBlbDhfaF9sb3dwYXNzKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIEMxLCBDMik7XAorICAgIE9QTkFNRSAjIyBydjMwX3RwZWw4X2hfbG93cGFzcyhkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCBDMSwgQzIpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnYzMF90cGVsMTZfaHZfbG93cGFzcyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIE9QTkFNRSAjIyBydjMwX3RwZWw4X2h2X2xvd3Bhc3MoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIE9QTkFNRSAjIyBydjMwX3RwZWw4X2h2X2xvd3Bhc3MoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIHNyYyArPSA4KnNyY1N0cmlkZTtcCisgICAgZHN0ICs9IDgqZHN0U3RyaWRlO1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsOF9odl9sb3dwYXNzKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsOF9odl9sb3dwYXNzKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnYzMF90cGVsMTZfaGh2X2xvd3Bhc3ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsOF9oaHZfbG93cGFzcyhkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTtcCisgICAgT1BOQU1FICMjIHJ2MzBfdHBlbDhfaGh2X2xvd3Bhc3MoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIHNyYyArPSA4KnNyY1N0cmlkZTtcCisgICAgZHN0ICs9IDgqZHN0U3RyaWRlO1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsOF9oaHZfbG93cGFzcyhkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTtcCisgICAgT1BOQU1FICMjIHJ2MzBfdHBlbDhfaGh2X2xvd3Bhc3MoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBydjMwX3RwZWwxNl9odnZfbG93cGFzcyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIE9QTkFNRSAjIyBydjMwX3RwZWw4X2h2dl9sb3dwYXNzKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsOF9odnZfbG93cGFzcyhkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTtcCisgICAgc3JjICs9IDgqc3JjU3RyaWRlO1wKKyAgICBkc3QgKz0gOCpkc3RTdHJpZGU7XAorICAgIE9QTkFNRSAjIyBydjMwX3RwZWw4X2h2dl9sb3dwYXNzKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsOF9odnZfbG93cGFzcyhkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2MzBfdHBlbDE2X2hodnZfbG93cGFzcyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIE9QTkFNRSAjIyBydjMwX3RwZWw4X2hodnZfbG93cGFzcyhkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTtcCisgICAgT1BOQU1FICMjIHJ2MzBfdHBlbDhfaGh2dl9sb3dwYXNzKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBzcmMgKz0gOCpzcmNTdHJpZGU7XAorICAgIGRzdCArPSA4KmRzdFN0cmlkZTtcCisgICAgT1BOQU1FICMjIHJ2MzBfdHBlbDhfaGh2dl9sb3dwYXNzKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsOF9oaHZ2X2xvd3Bhc3MoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorfVwKK1wKKworI2RlZmluZSBSVjMwX01DKE9QTkFNRSwgU0laRSkgXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2MzBfdHBlbCAjIyBTSVpFICMjIF9tYzEwX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsICMjIFNJWkUgIyMgX2hfbG93cGFzcyhkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUsIDEyLCA2KTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2MzBfdHBlbCAjIyBTSVpFICMjIF9tYzIwX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsICMjIFNJWkUgIyMgX2hfbG93cGFzcyhkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUsIDYsIDEyKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2MzBfdHBlbCAjIyBTSVpFICMjIF9tYzAxX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzcyhkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUsIDEyLCA2KTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2MzBfdHBlbCAjIyBTSVpFICMjIF9tYzAyX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzcyhkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUsIDYsIDEyKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2MzBfdHBlbCAjIyBTSVpFICMjIF9tYzExX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsICMjIFNJWkUgIyMgX2h2X2xvd3Bhc3MoZHN0LCBzcmMsIHN0cmlkZSwgc3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2MzBfdHBlbCAjIyBTSVpFICMjIF9tYzEyX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBPUE5BTUUgIyMgcnYzMF90cGVsICMjIFNJWkUgIyMgX2h2dl9sb3dwYXNzKGRzdCwgc3JjLCBzdHJpZGUsIHN0cmlkZSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBydjMwX3RwZWwgIyMgU0laRSAjIyBfbWMyMV9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgT1BOQU1FICMjIHJ2MzBfdHBlbCAjIyBTSVpFICMjIF9oaHZfbG93cGFzcyhkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnYzMF90cGVsICMjIFNJWkUgIyMgX21jMjJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIE9QTkFNRSAjIyBydjMwX3RwZWwgIyMgU0laRSAjIyBfaGh2dl9sb3dwYXNzKGRzdCwgc3JjLCBzdHJpZGUsIHN0cmlkZSk7XAorfVwKK1wKKworI2RlZmluZSBvcF9hdmcoYSwgYikgIGEgPSAoKChhKStjbVtiXSsxKT4+MSkKKyNkZWZpbmUgb3BfcHV0KGEsIGIpICBhID0gY21bYl0KKworUlYzMF9MT1dQQVNTKHB1dF8gICAgICAgLCBvcF9wdXQpCitSVjMwX0xPV1BBU1MoYXZnXyAgICAgICAsIG9wX2F2ZykKK1JWMzBfTUMocHV0XywgOCkKK1JWMzBfTUMocHV0XywgMTYpCitSVjMwX01DKGF2Z18sIDgpCitSVjMwX01DKGF2Z18sIDE2KQorCithdl9jb2xkIHZvaWQgZmZfcnYzMGRzcF9pbml0KFJWMzREU1BDb250ZXh0ICpjKQoreworICAgIEgyNjRDaHJvbWFDb250ZXh0IGgyNjRjaHJvbWE7CisgICAgSDI2NFFwZWxDb250ZXh0IHFwZWw7CisKKyAgICBmZl9ydjM0ZHNwX2luaXQoYyk7CisgICAgZmZfaDI2NGNocm9tYV9pbml0KCZoMjY0Y2hyb21hLCA4KTsKKyAgICBmZl9oMjY0cXBlbF9pbml0KCZxcGVsLCA4KTsKKworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWyAwXSA9IHFwZWwucHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWzBdOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWyAxXSA9IHB1dF9ydjMwX3RwZWwxNl9tYzEwX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bIDJdID0gcHV0X3J2MzBfdHBlbDE2X21jMjBfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsgNF0gPSBwdXRfcnYzMF90cGVsMTZfbWMwMV9jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWyA1XSA9IHB1dF9ydjMwX3RwZWwxNl9tYzExX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bIDZdID0gcHV0X3J2MzBfdHBlbDE2X21jMjFfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsgOF0gPSBwdXRfcnYzMF90cGVsMTZfbWMwMl9jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWyA5XSA9IHB1dF9ydjMwX3RwZWwxNl9tYzEyX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMTBdID0gcHV0X3J2MzBfdHBlbDE2X21jMjJfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsgMF0gPSBxcGVsLmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVswXTsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsgMV0gPSBhdmdfcnYzMF90cGVsMTZfbWMxMF9jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWyAyXSA9IGF2Z19ydjMwX3RwZWwxNl9tYzIwX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bIDRdID0gYXZnX3J2MzBfdHBlbDE2X21jMDFfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsgNV0gPSBhdmdfcnYzMF90cGVsMTZfbWMxMV9jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWyA2XSA9IGF2Z19ydjMwX3RwZWwxNl9tYzIxX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bIDhdID0gYXZnX3J2MzBfdHBlbDE2X21jMDJfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsgOV0gPSBhdmdfcnYzMF90cGVsMTZfbWMxMl9jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzEwXSA9IGF2Z19ydjMwX3RwZWwxNl9tYzIyX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bIDBdID0gcXBlbC5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMF07CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bIDFdID0gcHV0X3J2MzBfdHBlbDhfbWMxMF9jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWyAyXSA9IHB1dF9ydjMwX3RwZWw4X21jMjBfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsgNF0gPSBwdXRfcnYzMF90cGVsOF9tYzAxX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bIDVdID0gcHV0X3J2MzBfdHBlbDhfbWMxMV9jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWyA2XSA9IHB1dF9ydjMwX3RwZWw4X21jMjFfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsgOF0gPSBwdXRfcnYzMF90cGVsOF9tYzAyX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bIDldID0gcHV0X3J2MzBfdHBlbDhfbWMxMl9jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzEwXSA9IHB1dF9ydjMwX3RwZWw4X21jMjJfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsgMF0gPSBxcGVsLmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVswXTsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsgMV0gPSBhdmdfcnYzMF90cGVsOF9tYzEwX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bIDJdID0gYXZnX3J2MzBfdHBlbDhfbWMyMF9jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWyA0XSA9IGF2Z19ydjMwX3RwZWw4X21jMDFfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsgNV0gPSBhdmdfcnYzMF90cGVsOF9tYzExX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bIDZdID0gYXZnX3J2MzBfdHBlbDhfbWMyMV9jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWyA4XSA9IGF2Z19ydjMwX3RwZWw4X21jMDJfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsgOV0gPSBhdmdfcnYzMF90cGVsOF9tYzEyX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMTBdID0gYXZnX3J2MzBfdHBlbDhfbWMyMl9jOworCisgICAgYy0+cHV0X2Nocm9tYV9waXhlbHNfdGFiWzBdID0gaDI2NGNocm9tYS5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlswXTsKKyAgICBjLT5wdXRfY2hyb21hX3BpeGVsc190YWJbMV0gPSBoMjY0Y2hyb21hLnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdOworICAgIGMtPmF2Z19jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGgyNjRjaHJvbWEuYXZnX2gyNjRfY2hyb21hX3BpeGVsc190YWJbMF07CisgICAgYy0+YXZnX2Nocm9tYV9waXhlbHNfdGFiWzFdID0gaDI2NGNocm9tYS5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsxXTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3J2MzQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3J2MzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjMyYWIyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnYzNC5jCkBAIC0wLDAgKzEsMTg0MiBAQAorLyoKKyAqIFJWMzAvNDAgZGVjb2RlciBjb21tb24gZGF0YQorICogQ29weXJpZ2h0IChjKSAyMDA3IE1pa2UgTWVsYW5zb24sIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUlYzMC80MCBkZWNvZGVyIGNvbW1vbiBkYXRhCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImVycm9yX3Jlc2lsaWVuY2UuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtcGVnX2VyLmgiCisjaW5jbHVkZSAicXBlbGRzcC5oIgorI2luY2x1ZGUgInJlY3RhbmdsZS5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCisjaW5jbHVkZSAicnYzNHZsYy5oIgorI2luY2x1ZGUgInJ2MzRkYXRhLmgiCisjaW5jbHVkZSAicnYzNC5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgWkVSTzh4Mih2b2lkKiBkc3QsIGludCBzdHJpZGUpCit7CisgICAgZmlsbF9yZWN0YW5nbGUoZHN0LCAgICAgICAgICAgICAgICAgMSwgMiwgc3RyaWRlLCAwLCA0KTsKKyAgICBmaWxsX3JlY3RhbmdsZSgoKHVpbnQ4X3QqKShkc3QpKSs0LCAxLCAyLCBzdHJpZGUsIDAsIDQpOworfQorCisvKiogdHJhbnNsYXRpb24gb2YgUlYzMC80MCBtYWNyb2Jsb2NrIHR5cGVzIHRvIGxhdmMgb25lcyAqLworc3RhdGljIGNvbnN0IGludCBydjM0X21iX3R5cGVfdG9fbGF2Y1sxMl0gPSB7CisgICAgTUJfVFlQRV9JTlRSQSwKKyAgICBNQl9UWVBFX0lOVFJBMTZ4MTYgICAgICAgICAgICAgIHwgTUJfVFlQRV9TRVBBUkFURV9EQywKKyAgICBNQl9UWVBFXzE2eDE2ICAgfCBNQl9UWVBFX0wwLAorICAgIE1CX1RZUEVfOHg4ICAgICB8IE1CX1RZUEVfTDAsCisgICAgTUJfVFlQRV8xNngxNiAgIHwgTUJfVFlQRV9MMCwKKyAgICBNQl9UWVBFXzE2eDE2ICAgfCBNQl9UWVBFX0wxLAorICAgIE1CX1RZUEVfU0tJUCwKKyAgICBNQl9UWVBFX0RJUkVDVDIgfCBNQl9UWVBFXzE2eDE2LAorICAgIE1CX1RZUEVfMTZ4OCAgICB8IE1CX1RZUEVfTDAsCisgICAgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9MMCwKKyAgICBNQl9UWVBFXzE2eDE2ICAgfCBNQl9UWVBFX0wwTDEsCisgICAgTUJfVFlQRV8xNngxNiAgIHwgTUJfVFlQRV9MMCAgICB8IE1CX1RZUEVfU0VQQVJBVEVfREMKK307CisKKworc3RhdGljIFJWMzRWTEMgaW50cmFfdmxjc1tOVU1fSU5UUkFfVEFCTEVTXSwgaW50ZXJfdmxjc1tOVU1fSU5URVJfVEFCTEVTXTsKKworc3RhdGljIGludCBydjM0X2RlY29kZV9tdihSVjM0RGVjQ29udGV4dCAqciwgaW50IGJsb2NrX3R5cGUpOworCisvKioKKyAqIEBuYW1lIFJWMzAvNDAgVkxDIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgKiBAeworICovCisKK3N0YXRpYyBjb25zdCBpbnQgdGFibGVfb2Zmc1tdID0geworICAgICAgMCwgICAxODE4LCAgIDM2MjIsICAgNDE0NCwgICA0Njk4LCAgIDUyMzQsICAgNTgwNCwgICA1ODY4LCAgIDU5MDAsICAgNTkzMiwKKyAgIDU5OTYsICAgNjI1MiwgICA2MzE2LCAgIDYzNDgsICAgNjM4MCwgICA3Njc0LCAgIDg5NDQsICAxMDI3NCwgIDExNjY4LCAgMTIyNTAsCisgIDE0MDYwLCAgMTU4NDYsICAxNjM3MiwgIDE2OTYyLCAgMTc1MTIsICAxODE0OCwgIDE4MTgwLCAgMTgyMTIsICAxODI0NCwgIDE4MzA4LAorICAxODU2NCwgIDE4NjI4LCAgMTg2NjAsICAxODY5MiwgIDIwMDM2LCAgMjEzMTQsICAyMjY0OCwgIDIzOTY4LCAgMjQ2MTQsICAyNjM4NCwKKyAgMjgxOTAsICAyODczNiwgIDI5MzY2LCAgMjk5MzgsICAzMDYwOCwgIDMwNjQwLCAgMzA2NzIsICAzMDcwNCwgIDMwNzY4LCAgMzEwMjQsCisgIDMxMDg4LCAgMzExMjAsICAzMTE4NCwgIDMyNTcwLCAgMzM4OTgsICAzNTIzNiwgIDM2NjQ0LCAgMzcyODYsICAzOTAyMCwgIDQwODAyLAorICA0MTM2OCwgIDQyMDUyLCAgNDI2OTIsICA0MzM0OCwgIDQzMzgwLCAgNDM0MTIsICA0MzQ0NCwgIDQzNDc2LCAgNDM2MDQsICA0MzY2OCwKKyAgNDM3MDAsICA0MzczMiwgIDQ1MTAwLCAgNDY0MzAsICA0Nzc3OCwgIDQ5MTYwLCAgNDk4MDIsICA1MTU1MCwgIDUzMzQwLCAgNTM5NzIsCisgIDU0NjQ4LCAgNTUzNDgsICA1NTk5NCwgIDU2MTIyLCAgNTYxNTQsICA1NjE4NiwgIDU2MjE4LCAgNTYzNDYsICA1NjQxMCwgIDU2NDQyLAorICA1NjQ3NCwgIDU3ODc4LCAgNTkyOTAsICA2MDYzNiwgIDYyMDM2LCAgNjI2ODIsICA2NDQ2MCwgIDY0NTI0LCAgNjQ1ODgsICA2NDcxNiwKKyAgNjQ4NDQsICA2NjA3NiwgIDY3NDY2LCAgNjc5NzgsICA2ODU0MiwgIDY5MDY0LCAgNjk2NDgsICA3MDI5NiwgIDcyMDEwLCAgNzIwNzQsCisgIDcyMTM4LCAgNzIyMDIsICA3MjMzMCwgIDczNTcyLCAgNzQ5MzYsICA3NTQ1NCwgIDc2MDMwLCAgNzY1NjYsICA3NzE3NiwgIDc3ODIyLAorICA3OTU4MiwgIDc5NjQ2LCAgNzk2NzgsICA3OTc0MiwgIDc5ODcwLCAgODExODAsICA4MjUzNiwgIDgzMDY0LCAgODM2NzIsICA4NDI0MiwKKyAgODQ5MzQsICA4NTU3NiwgIDg3Mzg0LCAgODc0NDgsICA4NzQ4MCwgIDg3NTQ0LCAgODc2NzIsICA4ODk4MiwgIDkwMzQwLCAgOTA5MDIsCisgIDkxNTk4LCAgOTIxODIsICA5Mjg0NiwgIDkzNDg4LCAgOTUyNDYsICA5NTI3OCwgIDk1MzEwLCAgOTUzNzQsICA5NTUwMiwgIDk2ODc4LAorICA5ODI2NiwgIDk4ODQ4LCAgOTk1NDIsIDEwMDIzNCwgMTAwODg0LCAxMDE1MjQsIDEwMzMyMCwgMTAzMzUyLCAxMDMzODQsIDEwMzQxNiwKKyAxMDM0ODAsIDEwNDg3NCwgMTA2MjIyLCAxMDY5MTAsIDEwNzU4NCwgMTA4MjU4LCAxMDg5MDIsIDEwOTU0NCwgMTExMzY2LCAxMTEzOTgsCisgMTExNDMwLCAxMTE0NjIsIDExMTQ5NCwgMTEyODc4LCAxMTQzMjAsIDExNDk4OCwgMTE1NjYwLCAxMTYzMTAsIDExNjk1MCwgMTE3NTkyCit9OworCitzdGF0aWMgVkxDX1RZUEUgdGFibGVfZGF0YVsxMTc1OTJdWzJdOworCisvKioKKyAqIEdlbmVyYXRlIFZMQyBmcm9tIGNvZGV3b3JkIGxlbmd0aHMuCisgKiBAcGFyYW0gYml0cyAgIGNvZGV3b3JkIGxlbmd0aHMgKHplcm9lcyBhcmUgYWNjZXB0ZWQpCisgKiBAcGFyYW0gc2l6ZSAgIGxlbmd0aCBvZiBpbnB1dCBkYXRhCisgKiBAcGFyYW0gdmxjICAgIG91dHB1dCBWTEMKKyAqIEBwYXJhbSBpbnN5bXMgc3ltYm9scyBmb3IgaW5wdXQgY29kZXMgKE5VTEwgZm9yIGRlZmF1bHQgb25lcykKKyAqIEBwYXJhbSBudW0gICAgVkxDIHRhYmxlIG51bWJlciAoZm9yIHN0YXRpYyBpbml0aWFsaXphdGlvbikKKyAqLworc3RhdGljIHZvaWQgcnYzNF9nZW5fdmxjKGNvbnN0IHVpbnQ4X3QgKmJpdHMsIGludCBzaXplLCBWTEMgKnZsYywgY29uc3QgdWludDhfdCAqaW5zeW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW0pCit7CisgICAgaW50IGk7CisgICAgaW50IGNvdW50c1sxN10gPSB7MH0sIGNvZGVzWzE3XTsKKyAgICB1aW50MTZfdCBjd1tNQVhfVkxDX1NJWkVdLCBzeW1zW01BWF9WTENfU0laRV07CisgICAgdWludDhfdCBiaXRzMltNQVhfVkxDX1NJWkVdOworICAgIGludCBtYXhiaXRzID0gMCwgcmVhbHNpemUgPSAwOworCisgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXsKKyAgICAgICAgaWYoYml0c1tpXSl7CisgICAgICAgICAgICBiaXRzMltyZWFsc2l6ZV0gPSBiaXRzW2ldOworICAgICAgICAgICAgc3ltc1tyZWFsc2l6ZV0gPSBpbnN5bXMgPyBpbnN5bXNbaV0gOiBpOworICAgICAgICAgICAgcmVhbHNpemUrKzsKKyAgICAgICAgICAgIG1heGJpdHMgPSBGRk1BWChtYXhiaXRzLCBiaXRzW2ldKTsKKyAgICAgICAgICAgIGNvdW50c1tiaXRzW2ldXSsrOworICAgICAgICB9CisgICAgfQorCisgICAgY29kZXNbMF0gPSAwOworICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNvZGVzW2krMV0gPSAoY29kZXNbaV0gKyBjb3VudHNbaV0pIDw8IDE7CisgICAgZm9yKGkgPSAwOyBpIDwgcmVhbHNpemU7IGkrKykKKyAgICAgICAgY3dbaV0gPSBjb2Rlc1tiaXRzMltpXV0rKzsKKworICAgIHZsYy0+dGFibGUgPSAmdGFibGVfZGF0YVt0YWJsZV9vZmZzW251bV1dOworICAgIHZsYy0+dGFibGVfYWxsb2NhdGVkID0gdGFibGVfb2Zmc1tudW0gKyAxXSAtIHRhYmxlX29mZnNbbnVtXTsKKyAgICBmZl9pbml0X3ZsY19zcGFyc2UodmxjLCBGRk1JTihtYXhiaXRzLCA5KSwgcmVhbHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGJpdHMyLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICBjdywgICAgMiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3ltcywgIDIsIDIsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplIGFsbCB0YWJsZXMuCisgKi8KK3N0YXRpYyBhdl9jb2xkIHZvaWQgcnYzNF9pbml0X3RhYmxlcyh2b2lkKQoreworICAgIGludCBpLCBqLCBrOworCisgICAgZm9yKGkgPSAwOyBpIDwgTlVNX0lOVFJBX1RBQkxFUzsgaSsrKXsKKyAgICAgICAgZm9yKGogPSAwOyBqIDwgMjsgaisrKXsKKyAgICAgICAgICAgIHJ2MzRfZ2VuX3ZsYyhydjM0X3RhYmxlX2ludHJhX2NicHBhdCAgIFtpXVtqXSwgQ0JQUEFUX1ZMQ19TSVpFLCAgICZpbnRyYV92bGNzW2ldLmNicHBhdHRlcm5bal0sICAgICBOVUxMLCAxOSppICsgMCArIGopOworICAgICAgICAgICAgcnYzNF9nZW5fdmxjKHJ2MzRfdGFibGVfaW50cmFfc2Vjb25kcGF0W2ldW2pdLCBPVEhFUkJMS19WTENfU0laRSwgJmludHJhX3ZsY3NbaV0uc2Vjb25kX3BhdHRlcm5bal0sIE5VTEwsIDE5KmkgKyAyICsgaik7CisgICAgICAgICAgICBydjM0X2dlbl92bGMocnYzNF90YWJsZV9pbnRyYV90aGlyZHBhdCBbaV1bal0sIE9USEVSQkxLX1ZMQ19TSVpFLCAmaW50cmFfdmxjc1tpXS50aGlyZF9wYXR0ZXJuW2pdLCAgTlVMTCwgMTkqaSArIDQgKyBqKTsKKyAgICAgICAgICAgIGZvcihrID0gMDsgayA8IDQ7IGsrKyl7CisgICAgICAgICAgICAgICAgcnYzNF9nZW5fdmxjKHJ2MzRfdGFibGVfaW50cmFfY2JwW2ldW2orayoyXSwgIENCUF9WTENfU0laRSwgICAmaW50cmFfdmxjc1tpXS5jYnBbal1ba10sICAgICAgICAgcnYzNF9jYnBfY29kZSwgMTkqaSArIDYgKyBqKjQgKyBrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IoaiA9IDA7IGogPCA0OyBqKyspeworICAgICAgICAgICAgcnYzNF9nZW5fdmxjKHJ2MzRfdGFibGVfaW50cmFfZmlyc3RwYXRbaV1bal0sIEZJUlNUQkxLX1ZMQ19TSVpFLCAmaW50cmFfdmxjc1tpXS5maXJzdF9wYXR0ZXJuW2pdLCBOVUxMLCAxOSppICsgMTQgKyBqKTsKKyAgICAgICAgfQorICAgICAgICBydjM0X2dlbl92bGMocnYzNF9pbnRyYV9jb2VmZltpXSwgQ09FRkZfVkxDX1NJWkUsICZpbnRyYV92bGNzW2ldLmNvZWZmaWNpZW50LCBOVUxMLCAxOSppICsgMTgpOworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IE5VTV9JTlRFUl9UQUJMRVM7IGkrKyl7CisgICAgICAgIHJ2MzRfZ2VuX3ZsYyhydjM0X2ludGVyX2NicHBhdFtpXSwgQ0JQUEFUX1ZMQ19TSVpFLCAmaW50ZXJfdmxjc1tpXS5jYnBwYXR0ZXJuWzBdLCBOVUxMLCBpKjEyICsgOTUpOworICAgICAgICBmb3IoaiA9IDA7IGogPCA0OyBqKyspeworICAgICAgICAgICAgcnYzNF9nZW5fdmxjKHJ2MzRfaW50ZXJfY2JwW2ldW2pdLCBDQlBfVkxDX1NJWkUsICZpbnRlcl92bGNzW2ldLmNicFswXVtqXSwgcnYzNF9jYnBfY29kZSwgaSoxMiArIDk2ICsgaik7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGogPSAwOyBqIDwgMjsgaisrKXsKKyAgICAgICAgICAgIHJ2MzRfZ2VuX3ZsYyhydjM0X3RhYmxlX2ludGVyX2ZpcnN0cGF0IFtpXVtqXSwgRklSU1RCTEtfVkxDX1NJWkUsICZpbnRlcl92bGNzW2ldLmZpcnN0X3BhdHRlcm5bal0sICBOVUxMLCBpKjEyICsgMTAwICsgaik7CisgICAgICAgICAgICBydjM0X2dlbl92bGMocnYzNF90YWJsZV9pbnRlcl9zZWNvbmRwYXRbaV1bal0sIE9USEVSQkxLX1ZMQ19TSVpFLCAmaW50ZXJfdmxjc1tpXS5zZWNvbmRfcGF0dGVybltqXSwgTlVMTCwgaSoxMiArIDEwMiArIGopOworICAgICAgICAgICAgcnYzNF9nZW5fdmxjKHJ2MzRfdGFibGVfaW50ZXJfdGhpcmRwYXQgW2ldW2pdLCBPVEhFUkJMS19WTENfU0laRSwgJmludGVyX3ZsY3NbaV0udGhpcmRfcGF0dGVybltqXSwgIE5VTEwsIGkqMTIgKyAxMDQgKyBqKTsKKyAgICAgICAgfQorICAgICAgICBydjM0X2dlbl92bGMocnYzNF9pbnRlcl9jb2VmZltpXSwgQ09FRkZfVkxDX1NJWkUsICZpbnRlcl92bGNzW2ldLmNvZWZmaWNpZW50LCBOVUxMLCBpKjEyICsgMTA2KTsKKyAgICB9Cit9CisKKy8qKiBAfSAqLyAvLyB2bGMgZ3JvdXAKKworLyoqCisgKiBAbmFtZSBSVjMwLzQwIDR4NCBibG9jayBkZWNvZGluZyBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqCisgKiBEZWNvZGUgY29kZWQgYmxvY2sgcGF0dGVybi4KKyAqLworc3RhdGljIGludCBydjM0X2RlY29kZV9jYnAoR2V0Qml0Q29udGV4dCAqZ2IsIFJWMzRWTEMgKnZsYywgaW50IHRhYmxlKQoreworICAgIGludCBwYXR0ZXJuLCBjb2RlLCBjYnA9MDsKKyAgICBpbnQgb25lczsKKyAgICBzdGF0aWMgY29uc3QgaW50IGNicF9tYXNrc1szXSA9IHsweDEwMDAwMCwgMHgwMTAwMDAsIDB4MTEwMDAwfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHNoaWZ0c1s0XSA9IHsgMCwgMiwgOCwgMTAgfTsKKyAgICBjb25zdCBpbnQgKmN1cnNoaWZ0ID0gc2hpZnRzOworICAgIGludCBpLCB0LCBtYXNrOworCisgICAgY29kZSA9IGdldF92bGMyKGdiLCB2bGMtPmNicHBhdHRlcm5bdGFibGVdLnRhYmxlLCA5LCAyKTsKKyAgICBwYXR0ZXJuID0gY29kZSAmIDB4RjsKKyAgICBjb2RlID4+PSA0OworCisgICAgb25lcyA9IHJ2MzRfY291bnRfb25lc1twYXR0ZXJuXTsKKworICAgIGZvcihtYXNrID0gODsgbWFzazsgbWFzayA+Pj0gMSwgY3Vyc2hpZnQrKyl7CisgICAgICAgIGlmKHBhdHRlcm4gJiBtYXNrKQorICAgICAgICAgICAgY2JwIHw9IGdldF92bGMyKGdiLCB2bGMtPmNicFt0YWJsZV1bb25lc10udGFibGUsIHZsYy0+Y2JwW3RhYmxlXVtvbmVzXS5iaXRzLCAxKSA8PCBjdXJzaGlmdFswXTsKKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspeworICAgICAgICB0ID0gKG1vZHVsb190aHJlZV90YWJsZVtjb2RlXSA+PiAoNiAtIDIqaSkpICYgMzsKKyAgICAgICAgaWYodCA9PSAxKQorICAgICAgICAgICAgY2JwIHw9IGNicF9tYXNrc1tnZXRfYml0czEoZ2IpXSA8PCBpOworICAgICAgICBpZih0ID09IDIpCisgICAgICAgICAgICBjYnAgfD0gY2JwX21hc2tzWzJdIDw8IGk7CisgICAgfQorICAgIHJldHVybiBjYnA7Cit9CisKKy8qKgorICogR2V0IG9uZSBjb2VmZmljaWVudCB2YWx1ZSBmcm9tIHRoZSBiaXRzdHJlYW0gYW5kIHN0b3JlIGl0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb2RlX2NvZWZmKGludDE2X3QgKmRzdCwgaW50IGNvZWYsIGludCBlc2MsIEdldEJpdENvbnRleHQgKmdiLCBWTEMqIHZsYywgaW50IHEpCit7CisgICAgaWYoY29lZil7CisgICAgICAgIGlmKGNvZWYgPT0gZXNjKXsKKyAgICAgICAgICAgIGNvZWYgPSBnZXRfdmxjMihnYiwgdmxjLT50YWJsZSwgOSwgMik7CisgICAgICAgICAgICBpZihjb2VmID4gMjMpeworICAgICAgICAgICAgICAgIGNvZWYgLT0gMjM7CisgICAgICAgICAgICAgICAgY29lZiA9IDIyICsgKCgxIDw8IGNvZWYpIHwgZ2V0X2JpdHMoZ2IsIGNvZWYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZWYgKz0gZXNjOworICAgICAgICB9CisgICAgICAgIGlmKGdldF9iaXRzMShnYikpCisgICAgICAgICAgICBjb2VmID0gLWNvZWY7CisgICAgICAgICpkc3QgPSAoY29lZipxICsgOCkgPj4gNDsKKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIDJ4MiBzdWJibG9jayBvZiBjb2VmZmljaWVudHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNvZGVfc3ViYmxvY2soaW50MTZfdCAqZHN0LCBpbnQgY29kZSwgY29uc3QgaW50IGlzX2Jsb2NrMiwgR2V0Qml0Q29udGV4dCAqZ2IsIFZMQyAqdmxjLCBpbnQgcSkKK3sKKyAgICBpbnQgZmxhZ3MgPSBtb2R1bG9fdGhyZWVfdGFibGVbY29kZV07CisKKyAgICBkZWNvZGVfY29lZmYoICAgIGRzdCswKjQrMCwgKGZsYWdzID4+IDYpICAgICwgMywgZ2IsIHZsYywgcSk7CisgICAgaWYoaXNfYmxvY2syKXsKKyAgICAgICAgZGVjb2RlX2NvZWZmKGRzdCsxKjQrMCwgKGZsYWdzID4+IDQpICYgMywgMiwgZ2IsIHZsYywgcSk7CisgICAgICAgIGRlY29kZV9jb2VmZihkc3QrMCo0KzEsIChmbGFncyA+PiAyKSAmIDMsIDIsIGdiLCB2bGMsIHEpOworICAgIH1lbHNleworICAgICAgICBkZWNvZGVfY29lZmYoZHN0KzAqNCsxLCAoZmxhZ3MgPj4gNCkgJiAzLCAyLCBnYiwgdmxjLCBxKTsKKyAgICAgICAgZGVjb2RlX2NvZWZmKGRzdCsxKjQrMCwgKGZsYWdzID4+IDIpICYgMywgMiwgZ2IsIHZsYywgcSk7CisgICAgfQorICAgIGRlY29kZV9jb2VmZiggICAgZHN0KzEqNCsxLCAoZmxhZ3MgPj4gMCkgJiAzLCAyLCBnYiwgdmxjLCBxKTsKK30KKworLyoqCisgKiBEZWNvZGUgYSBzaW5nbGUgY29lZmZpY2llbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNvZGVfc3ViYmxvY2sxKGludDE2X3QgKmRzdCwgaW50IGNvZGUsIEdldEJpdENvbnRleHQgKmdiLCBWTEMgKnZsYywgaW50IHEpCit7CisgICAgaW50IGNvZWZmID0gbW9kdWxvX3RocmVlX3RhYmxlW2NvZGVdID4+IDY7CisgICAgZGVjb2RlX2NvZWZmKGRzdCwgY29lZmYsIDMsIGdiLCB2bGMsIHEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb2RlX3N1YmJsb2NrMyhpbnQxNl90ICpkc3QsIGludCBjb2RlLCBHZXRCaXRDb250ZXh0ICpnYiwgVkxDICp2bGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcV9kYywgaW50IHFfYWMxLCBpbnQgcV9hYzIpCit7CisgICAgaW50IGZsYWdzID0gbW9kdWxvX3RocmVlX3RhYmxlW2NvZGVdOworCisgICAgZGVjb2RlX2NvZWZmKGRzdCswKjQrMCwgKGZsYWdzID4+IDYpICAgICwgMywgZ2IsIHZsYywgcV9kYyk7CisgICAgZGVjb2RlX2NvZWZmKGRzdCswKjQrMSwgKGZsYWdzID4+IDQpICYgMywgMiwgZ2IsIHZsYywgcV9hYzEpOworICAgIGRlY29kZV9jb2VmZihkc3QrMSo0KzAsIChmbGFncyA+PiAyKSAmIDMsIDIsIGdiLCB2bGMsIHFfYWMxKTsKKyAgICBkZWNvZGVfY29lZmYoZHN0KzEqNCsxLCAoZmxhZ3MgPj4gMCkgJiAzLCAyLCBnYiwgdmxjLCBxX2FjMik7Cit9CisKKy8qKgorICogRGVjb2RlIGNvZWZmaWNpZW50cyBmb3IgNHg0IGJsb2NrLgorICoKKyAqIFRoaXMgaXMgZG9uZSBieSBmaWxsaW5nIDJ4MiBzdWJibG9ja3Mgd2l0aCBkZWNvZGVkIGNvZWZmaWNpZW50cworICogaW4gdGhpcyBvcmRlciAodGhlIHNhbWUgZm9yIHN1YmJsb2NrcyBhbmQgc3ViYmxvY2sgY29lZmZpY2llbnRzKToKKyAqICBvLS1vCisgKiAgICAvCisgKiAgIC8KKyAqICBvLS1vCisgKi8KKworc3RhdGljIGludCBydjM0X2RlY29kZV9ibG9jayhpbnQxNl90ICpkc3QsIEdldEJpdENvbnRleHQgKmdiLCBSVjM0VkxDICpydmxjLCBpbnQgZmMsIGludCBzYywgaW50IHFfZGMsIGludCBxX2FjMSwgaW50IHFfYWMyKQoreworICAgIGludCBjb2RlLCBwYXR0ZXJuLCBoYXNfYWMgPSAxOworCisgICAgY29kZSA9IGdldF92bGMyKGdiLCBydmxjLT5maXJzdF9wYXR0ZXJuW2ZjXS50YWJsZSwgOSwgMik7CisKKyAgICBwYXR0ZXJuID0gY29kZSAmIDB4NzsKKworICAgIGNvZGUgPj49IDM7CisKKyAgICBpZiAobW9kdWxvX3RocmVlX3RhYmxlW2NvZGVdICYgMHgzRikgeworICAgICAgICBkZWNvZGVfc3ViYmxvY2szKGRzdCwgY29kZSwgZ2IsICZydmxjLT5jb2VmZmljaWVudCwgcV9kYywgcV9hYzEsIHFfYWMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWNvZGVfc3ViYmxvY2sxKGRzdCwgY29kZSwgZ2IsICZydmxjLT5jb2VmZmljaWVudCwgcV9kYyk7CisgICAgICAgIGlmICghcGF0dGVybikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBoYXNfYWMgPSAwOworICAgIH0KKworICAgIGlmKHBhdHRlcm4gJiA0KXsKKyAgICAgICAgY29kZSA9IGdldF92bGMyKGdiLCBydmxjLT5zZWNvbmRfcGF0dGVybltzY10udGFibGUsIDksIDIpOworICAgICAgICBkZWNvZGVfc3ViYmxvY2soZHN0ICsgNCowKzIsIGNvZGUsIDAsIGdiLCAmcnZsYy0+Y29lZmZpY2llbnQsIHFfYWMyKTsKKyAgICB9CisgICAgaWYocGF0dGVybiAmIDIpeyAvLyBMb29rcyBsaWtlIGNvZWZmaWNpZW50cyAxIGFuZCAyIGFyZSBzd2FwcGVkIGZvciB0aGlzIGJsb2NrCisgICAgICAgIGNvZGUgPSBnZXRfdmxjMihnYiwgcnZsYy0+c2Vjb25kX3BhdHRlcm5bc2NdLnRhYmxlLCA5LCAyKTsKKyAgICAgICAgZGVjb2RlX3N1YmJsb2NrKGRzdCArIDQqMiswLCBjb2RlLCAxLCBnYiwgJnJ2bGMtPmNvZWZmaWNpZW50LCBxX2FjMik7CisgICAgfQorICAgIGlmKHBhdHRlcm4gJiAxKXsKKyAgICAgICAgY29kZSA9IGdldF92bGMyKGdiLCBydmxjLT50aGlyZF9wYXR0ZXJuW3NjXS50YWJsZSwgOSwgMik7CisgICAgICAgIGRlY29kZV9zdWJibG9jayhkc3QgKyA0KjIrMiwgY29kZSwgMCwgZ2IsICZydmxjLT5jb2VmZmljaWVudCwgcV9hYzIpOworICAgIH0KKyAgICByZXR1cm4gaGFzX2FjIHwgcGF0dGVybjsKK30KKworLyoqCisgKiBAbmFtZSBSVjMwLzQwIGJpdHN0cmVhbSBwYXJzaW5nCisgKiBAeworICovCisKKy8qKgorICogRGVjb2RlIHN0YXJ0aW5nIHNsaWNlIHBvc2l0aW9uLgorICogQHRvZG8gTWF5YmUgcmVwbGFjZSB3aXRoIGZmX2gyNjNfZGVjb2RlX21iYSgpID8KKyAqLworaW50IGZmX3J2MzRfZ2V0X3N0YXJ0X29mZnNldChHZXRCaXRDb250ZXh0ICpnYiwgaW50IG1iX3NpemUpCit7CisgICAgaW50IGk7CisgICAgZm9yKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICBpZihydjM0X21iX21heF9zaXplc1tpXSA+PSBtYl9zaXplIC0gMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIHJldHVybiBydjM0X21iX2JpdHNfc2l6ZXNbaV07Cit9CisKKy8qKgorICogU2VsZWN0IFZMQyBzZXQgZm9yIGRlY29kaW5nIGZyb20gY3VycmVudCBxdWFudGl6ZXIsIG1vZGlmaWVyIGFuZCBmcmFtZSB0eXBlLgorICovCitzdGF0aWMgaW5saW5lIFJWMzRWTEMqIGNob29zZV92bGNfc2V0KGludCBxdWFudCwgaW50IG1vZCwgaW50IHR5cGUpCit7CisgICAgaWYobW9kID09IDIgJiYgcXVhbnQgPCAxOSkgcXVhbnQgKz0gMTA7CisgICAgZWxzZSBpZihtb2QgJiYgcXVhbnQgPCAyNikgcXVhbnQgKz0gNTsKKyAgICByZXR1cm4gdHlwZSA/ICZpbnRlcl92bGNzW3J2MzRfcXVhbnRfdG9fdmxjX3NldFsxXVthdl9jbGlwKHF1YW50LCAwLCAzMCldXQorICAgICAgICAgICAgICAgIDogJmludHJhX3ZsY3NbcnYzNF9xdWFudF90b192bGNfc2V0WzBdW2F2X2NsaXAocXVhbnQsIDAsIDMwKV1dOworfQorCisvKioKKyAqIERlY29kZSBpbnRyYSBtYWNyb2Jsb2NrIGhlYWRlciBhbmQgcmV0dXJuIENCUCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBydjM0X2RlY29kZV9pbnRyYV9tYl9oZWFkZXIoUlYzNERlY0NvbnRleHQgKnIsIGludDhfdCAqaW50cmFfdHlwZXMpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmci0+czsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICBpbnQgbWJfcG9zID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisgICAgaW50IHQ7CisKKyAgICByLT5pczE2ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZihyLT5pczE2KXsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bWJfdHlwZVttYl9wb3NdID0gTUJfVFlQRV9JTlRSQTE2eDE2OworICAgICAgICByLT5ibG9ja190eXBlID0gUlYzNF9NQl9UWVBFX0lOVFJBMTZ4MTY7CisgICAgICAgIHQgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIGZpbGxfcmVjdGFuZ2xlKGludHJhX3R5cGVzLCA0LCA0LCByLT5pbnRyYV90eXBlc19zdHJpZGUsIHQsIHNpemVvZihpbnRyYV90eXBlc1swXSkpOworICAgICAgICByLT5sdW1hX3ZsYyAgID0gMjsKKyAgICB9ZWxzZXsKKyAgICAgICAgaWYoIXItPnJ2MzApeworICAgICAgICAgICAgaWYoIWdldF9iaXRzMShnYikpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJOZWVkIERRVUFOVFxuIik7CisgICAgICAgIH0KKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bWJfdHlwZVttYl9wb3NdID0gTUJfVFlQRV9JTlRSQTsKKyAgICAgICAgci0+YmxvY2tfdHlwZSA9IFJWMzRfTUJfVFlQRV9JTlRSQTsKKyAgICAgICAgaWYoci0+ZGVjb2RlX2ludHJhX3R5cGVzKHIsIGdiLCBpbnRyYV90eXBlcykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByLT5sdW1hX3ZsYyAgID0gMTsKKyAgICB9CisKKyAgICByLT5jaHJvbWFfdmxjID0gMDsKKyAgICByLT5jdXJfdmxjcyAgID0gY2hvb3NlX3ZsY19zZXQoci0+c2kucXVhbnQsIHItPnNpLnZsY19zZXQsIDApOworCisgICAgcmV0dXJuIHJ2MzRfZGVjb2RlX2NicChnYiwgci0+Y3VyX3ZsY3MsIHItPmlzMTYpOworfQorCisvKioKKyAqIERlY29kZSBpbnRlciBtYWNyb2Jsb2NrIGhlYWRlciBhbmQgcmV0dXJuIENCUCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBydjM0X2RlY29kZV9pbnRlcl9tYl9oZWFkZXIoUlYzNERlY0NvbnRleHQgKnIsIGludDhfdCAqaW50cmFfdHlwZXMpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmci0+czsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICBpbnQgbWJfcG9zID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisgICAgaW50IGksIHQ7CisKKyAgICByLT5ibG9ja190eXBlID0gci0+ZGVjb2RlX21iX2luZm8ocik7CisgICAgaWYoci0+YmxvY2tfdHlwZSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1iX3R5cGVbbWJfcG9zXSA9IHJ2MzRfbWJfdHlwZV90b19sYXZjW3ItPmJsb2NrX3R5cGVdOworICAgIHItPm1iX3R5cGVbbWJfcG9zXSA9IHItPmJsb2NrX3R5cGU7CisgICAgaWYoci0+YmxvY2tfdHlwZSA9PSBSVjM0X01CX1NLSVApeworICAgICAgICBpZihzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApCisgICAgICAgICAgICByLT5tYl90eXBlW21iX3Bvc10gPSBSVjM0X01CX1BfMTZ4MTY7CisgICAgICAgIGlmKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgICAgIHItPm1iX3R5cGVbbWJfcG9zXSA9IFJWMzRfTUJfQl9ESVJFQ1Q7CisgICAgfQorICAgIHItPmlzMTYgPSAhIUlTX0lOVFJBMTZ4MTYocy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bWJfdHlwZVttYl9wb3NdKTsKKyAgICBydjM0X2RlY29kZV9tdihyLCByLT5ibG9ja190eXBlKTsKKyAgICBpZihyLT5ibG9ja190eXBlID09IFJWMzRfTUJfU0tJUCl7CisgICAgICAgIGZpbGxfcmVjdGFuZ2xlKGludHJhX3R5cGVzLCA0LCA0LCByLT5pbnRyYV90eXBlc19zdHJpZGUsIDAsIHNpemVvZihpbnRyYV90eXBlc1swXSkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgci0+Y2hyb21hX3ZsYyA9IDE7CisgICAgci0+bHVtYV92bGMgICA9IDA7CisKKyAgICBpZihJU19JTlRSQShzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tYl90eXBlW21iX3Bvc10pKXsKKyAgICAgICAgaWYoci0+aXMxNil7CisgICAgICAgICAgICB0ID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoaW50cmFfdHlwZXMsIDQsIDQsIHItPmludHJhX3R5cGVzX3N0cmlkZSwgdCwgc2l6ZW9mKGludHJhX3R5cGVzWzBdKSk7CisgICAgICAgICAgICByLT5sdW1hX3ZsYyAgID0gMjsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpZihyLT5kZWNvZGVfaW50cmFfdHlwZXMociwgZ2IsIGludHJhX3R5cGVzKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgci0+bHVtYV92bGMgICA9IDE7CisgICAgICAgIH0KKyAgICAgICAgci0+Y2hyb21hX3ZsYyA9IDA7CisgICAgICAgIHItPmN1cl92bGNzID0gY2hvb3NlX3ZsY19zZXQoci0+c2kucXVhbnQsIHItPnNpLnZsY19zZXQsIDApOworICAgIH1lbHNleworICAgICAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgaW50cmFfdHlwZXNbKGkgJiAzKSArIChpPj4yKSAqIHItPmludHJhX3R5cGVzX3N0cmlkZV0gPSAwOworICAgICAgICByLT5jdXJfdmxjcyA9IGNob29zZV92bGNfc2V0KHItPnNpLnF1YW50LCByLT5zaS52bGNfc2V0LCAxKTsKKyAgICAgICAgaWYoci0+bWJfdHlwZVttYl9wb3NdID09IFJWMzRfTUJfUF9NSVgxNngxNil7CisgICAgICAgICAgICByLT5pczE2ID0gMTsKKyAgICAgICAgICAgIHItPmNocm9tYV92bGMgPSAxOworICAgICAgICAgICAgci0+bHVtYV92bGMgICA9IDI7CisgICAgICAgICAgICByLT5jdXJfdmxjcyA9IGNob29zZV92bGNfc2V0KHItPnNpLnF1YW50LCByLT5zaS52bGNfc2V0LCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBydjM0X2RlY29kZV9jYnAoZ2IsIHItPmN1cl92bGNzLCByLT5pczE2KTsKK30KKworLyoqIEB9ICovIC8vYml0c3RyZWFtIGZ1bmN0aW9ucworCisvKioKKyAqIEBuYW1lIG1vdGlvbiB2ZWN0b3IgcmVsYXRlZCBjb2RlIChwcmVkaWN0aW9uLCByZWNvbnN0cnVjdGlvbiwgbW90aW9uIGNvbXBlbnNhdGlvbikKKyAqIEB7CisgKi8KKworLyoqIG1hY3JvYmxvY2sgcGFydGl0aW9uIHdpZHRoIGluIDh4OCBibG9ja3MgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHBhcnRfc2l6ZXNfd1tSVjM0X01CX1RZUEVTXSA9IHsgMiwgMiwgMiwgMSwgMiwgMiwgMiwgMiwgMiwgMSwgMiwgMiB9OworCisvKiogbWFjcm9ibG9jayBwYXJ0aXRpb24gaGVpZ2h0IGluIDh4OCBibG9ja3MgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHBhcnRfc2l6ZXNfaFtSVjM0X01CX1RZUEVTXSA9IHsgMiwgMiwgMiwgMSwgMiwgMiwgMiwgMiwgMSwgMiwgMiwgMiB9OworCisvKiogYXZhaWxhYmlsaXR5IGluZGV4IGZvciBzdWJibG9ja3MgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGF2YWlsX2luZGV4ZXNbNF0gPSB7IDYsIDcsIDEwLCAxMSB9OworCisvKioKKyAqIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgorICoKKyAqIE1vdGlvbiBwcmVkaWN0aW9uIHBlcmZvcm1lZCBmb3IgdGhlIGJsb2NrIGJ5IHVzaW5nIG1lZGlhbiBwcmVkaWN0aW9uIG9mCisgKiBtb3Rpb24gdmVjdG9ycyBmcm9tIHRoZSBsZWZ0LCB0b3AgYW5kIHJpZ2h0IHRvcCBibG9ja3MgYnV0IGluIGNvcm5lciBjYXNlcworICogc29tZSBvdGhlciB2ZWN0b3JzIG1heSBiZSB1c2VkIGluc3RlYWQuCisgKi8KK3N0YXRpYyB2b2lkIHJ2MzRfcHJlZF9tdihSVjM0RGVjQ29udGV4dCAqciwgaW50IGJsb2NrX3R5cGUsIGludCBzdWJibG9ja19ubywgaW50IGRtdl9ubykKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZyLT5zOworICAgIGludCBtdl9wb3MgPSBzLT5tYl94ICogMiArIHMtPm1iX3kgKiAyICogcy0+Yjhfc3RyaWRlOworICAgIGludCBBWzJdID0gezB9LCBCWzJdLCBDWzJdOworICAgIGludCBpLCBqOworICAgIGludCBteCwgbXk7CisgICAgaW50KiBhdmFpbCA9IHItPmF2YWlsX2NhY2hlICsgYXZhaWxfaW5kZXhlc1tzdWJibG9ja19ub107CisgICAgaW50IGNfb2ZmID0gcGFydF9zaXplc193W2Jsb2NrX3R5cGVdOworCisgICAgbXZfcG9zICs9IChzdWJibG9ja19ubyAmIDEpICsgKHN1YmJsb2NrX25vID4+IDEpKnMtPmI4X3N0cmlkZTsKKyAgICBpZihzdWJibG9ja19ubyA9PSAzKQorICAgICAgICBjX29mZiA9IC0xOworCisgICAgaWYoYXZhaWxbLTFdKXsKKyAgICAgICAgQVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbMF1bbXZfcG9zLTFdWzBdOworICAgICAgICBBWzFdID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFswXVttdl9wb3MtMV1bMV07CisgICAgfQorICAgIGlmKGF2YWlsWy00XSl7CisgICAgICAgIEJbMF0gPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsWzBdW212X3Bvcy1zLT5iOF9zdHJpZGVdWzBdOworICAgICAgICBCWzFdID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFswXVttdl9wb3Mtcy0+Yjhfc3RyaWRlXVsxXTsKKyAgICB9ZWxzZXsKKyAgICAgICAgQlswXSA9IEFbMF07CisgICAgICAgIEJbMV0gPSBBWzFdOworICAgIH0KKyAgICBpZighYXZhaWxbY19vZmYtNF0peworICAgICAgICBpZihhdmFpbFstNF0gJiYgKGF2YWlsWy0xXSB8fCByLT5ydjMwKSl7CisgICAgICAgICAgICBDWzBdID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFswXVttdl9wb3Mtcy0+Yjhfc3RyaWRlLTFdWzBdOworICAgICAgICAgICAgQ1sxXSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbMF1bbXZfcG9zLXMtPmI4X3N0cmlkZS0xXVsxXTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBDWzBdID0gQVswXTsKKyAgICAgICAgICAgIENbMV0gPSBBWzFdOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIENbMF0gPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsWzBdW212X3Bvcy1zLT5iOF9zdHJpZGUrY19vZmZdWzBdOworICAgICAgICBDWzFdID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFswXVttdl9wb3Mtcy0+Yjhfc3RyaWRlK2Nfb2ZmXVsxXTsKKyAgICB9CisgICAgbXggPSBtaWRfcHJlZChBWzBdLCBCWzBdLCBDWzBdKTsKKyAgICBteSA9IG1pZF9wcmVkKEFbMV0sIEJbMV0sIENbMV0pOworICAgIG14ICs9IHItPmRtdltkbXZfbm9dWzBdOworICAgIG15ICs9IHItPmRtdltkbXZfbm9dWzFdOworICAgIGZvcihqID0gMDsgaiA8IHBhcnRfc2l6ZXNfaFtibG9ja190eXBlXTsgaisrKXsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgcGFydF9zaXplc193W2Jsb2NrX3R5cGVdOyBpKyspeworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFswXVttdl9wb3MgKyBpICsgaipzLT5iOF9zdHJpZGVdWzBdID0gbXg7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsWzBdW212X3BvcyArIGkgKyBqKnMtPmI4X3N0cmlkZV1bMV0gPSBteTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2RlZmluZSBHRVRfUFRTX0RJRkYoYSwgYikgKCgoYSkgLSAoYikgKyA4MTkyKSAmIDB4MUZGRikKKworLyoqCisgKiBDYWxjdWxhdGUgbW90aW9uIHZlY3RvciBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgYWRkZWQgZm9yIGRpcmVjdCBibG9ja3MuCisgKi8KK3N0YXRpYyBpbnQgY2FsY19hZGRfbXYoUlYzNERlY0NvbnRleHQgKnIsIGludCBkaXIsIGludCB2YWwpCit7CisgICAgaW50IG11bCA9IGRpciA/IC1yLT5tdl93ZWlnaHQyIDogci0+bXZfd2VpZ2h0MTsKKworICAgIHJldHVybiAodmFsICogbXVsICsgMHgyMDAwKSA+PiAxNDsKK30KKworLyoqCisgKiBQcmVkaWN0IG1vdGlvbiB2ZWN0b3IgZm9yIEItZnJhbWUgbWFjcm9ibG9jay4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJ2MzRfcHJlZF9iX3ZlY3RvcihpbnQgQVsyXSwgaW50IEJbMl0sIGludCBDWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQV9hdmFpbCwgaW50IEJfYXZhaWwsIGludCBDX2F2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm14LCBpbnQgKm15KQoreworICAgIGlmKEFfYXZhaWwgKyBCX2F2YWlsICsgQ19hdmFpbCAhPSAzKXsKKyAgICAgICAgKm14ID0gQVswXSArIEJbMF0gKyBDWzBdOworICAgICAgICAqbXkgPSBBWzFdICsgQlsxXSArIENbMV07CisgICAgICAgIGlmKEFfYXZhaWwgKyBCX2F2YWlsICsgQ19hdmFpbCA9PSAyKXsKKyAgICAgICAgICAgICpteCAvPSAyOworICAgICAgICAgICAgKm15IC89IDI7CisgICAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgICAgKm14ID0gbWlkX3ByZWQoQVswXSwgQlswXSwgQ1swXSk7CisgICAgICAgICpteSA9IG1pZF9wcmVkKEFbMV0sIEJbMV0sIENbMV0pOworICAgIH0KK30KKworLyoqCisgKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIEItZnJhbWVzCisgKi8KK3N0YXRpYyB2b2lkIHJ2MzRfcHJlZF9tdl9iKFJWMzREZWNDb250ZXh0ICpyLCBpbnQgYmxvY2tfdHlwZSwgaW50IGRpcikKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZyLT5zOworICAgIGludCBtYl9wb3MgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKKyAgICBpbnQgbXZfcG9zID0gcy0+bWJfeCAqIDIgKyBzLT5tYl95ICogMiAqIHMtPmI4X3N0cmlkZTsKKyAgICBpbnQgQVsyXSA9IHsgMCB9LCBCWzJdID0geyAwIH0sIENbMl0gPSB7IDAgfTsKKyAgICBpbnQgaGFzX0EgPSAwLCBoYXNfQiA9IDAsIGhhc19DID0gMDsKKyAgICBpbnQgbXgsIG15OworICAgIGludCBpLCBqOworICAgIFBpY3R1cmUgKmN1cl9waWMgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyOworICAgIGNvbnN0IGludCBtYXNrID0gZGlyID8gTUJfVFlQRV9MMSA6IE1CX1RZUEVfTDA7CisgICAgaW50IHR5cGUgPSBjdXJfcGljLT5tYl90eXBlW21iX3Bvc107CisKKyAgICBpZigoci0+YXZhaWxfY2FjaGVbNi0xXSAmIHR5cGUpICYgbWFzayl7CisgICAgICAgIEFbMF0gPSBjdXJfcGljLT5tb3Rpb25fdmFsW2Rpcl1bbXZfcG9zIC0gMV1bMF07CisgICAgICAgIEFbMV0gPSBjdXJfcGljLT5tb3Rpb25fdmFsW2Rpcl1bbXZfcG9zIC0gMV1bMV07CisgICAgICAgIGhhc19BID0gMTsKKyAgICB9CisgICAgaWYoKHItPmF2YWlsX2NhY2hlWzYtNF0gJiB0eXBlKSAmIG1hc2speworICAgICAgICBCWzBdID0gY3VyX3BpYy0+bW90aW9uX3ZhbFtkaXJdW212X3BvcyAtIHMtPmI4X3N0cmlkZV1bMF07CisgICAgICAgIEJbMV0gPSBjdXJfcGljLT5tb3Rpb25fdmFsW2Rpcl1bbXZfcG9zIC0gcy0+Yjhfc3RyaWRlXVsxXTsKKyAgICAgICAgaGFzX0IgPSAxOworICAgIH0KKyAgICBpZihyLT5hdmFpbF9jYWNoZVs2LTRdICYmIChyLT5hdmFpbF9jYWNoZVs2LTJdICYgdHlwZSkgJiBtYXNrKXsKKyAgICAgICAgQ1swXSA9IGN1cl9waWMtPm1vdGlvbl92YWxbZGlyXVttdl9wb3MgLSBzLT5iOF9zdHJpZGUgKyAyXVswXTsKKyAgICAgICAgQ1sxXSA9IGN1cl9waWMtPm1vdGlvbl92YWxbZGlyXVttdl9wb3MgLSBzLT5iOF9zdHJpZGUgKyAyXVsxXTsKKyAgICAgICAgaGFzX0MgPSAxOworICAgIH1lbHNlIGlmKChzLT5tYl94KzEpID09IHMtPm1iX3dpZHRoICYmIChyLT5hdmFpbF9jYWNoZVs2LTVdICYgdHlwZSkgJiBtYXNrKXsKKyAgICAgICAgQ1swXSA9IGN1cl9waWMtPm1vdGlvbl92YWxbZGlyXVttdl9wb3MgLSBzLT5iOF9zdHJpZGUgLSAxXVswXTsKKyAgICAgICAgQ1sxXSA9IGN1cl9waWMtPm1vdGlvbl92YWxbZGlyXVttdl9wb3MgLSBzLT5iOF9zdHJpZGUgLSAxXVsxXTsKKyAgICAgICAgaGFzX0MgPSAxOworICAgIH0KKworICAgIHJ2MzRfcHJlZF9iX3ZlY3RvcihBLCBCLCBDLCBoYXNfQSwgaGFzX0IsIGhhc19DLCAmbXgsICZteSk7CisKKyAgICBteCArPSByLT5kbXZbZGlyXVswXTsKKyAgICBteSArPSByLT5kbXZbZGlyXVsxXTsKKworICAgIGZvcihqID0gMDsgaiA8IDI7IGorKyl7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDI7IGkrKyl7CisgICAgICAgICAgICBjdXJfcGljLT5tb3Rpb25fdmFsW2Rpcl1bbXZfcG9zICsgaSArIGoqcy0+Yjhfc3RyaWRlXVswXSA9IG14OworICAgICAgICAgICAgY3VyX3BpYy0+bW90aW9uX3ZhbFtkaXJdW212X3BvcyArIGkgKyBqKnMtPmI4X3N0cmlkZV1bMV0gPSBteTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihibG9ja190eXBlID09IFJWMzRfTUJfQl9CQUNLV0FSRCB8fCBibG9ja190eXBlID09IFJWMzRfTUJfQl9GT1JXQVJEKXsKKyAgICAgICAgWkVSTzh4MihjdXJfcGljLT5tb3Rpb25fdmFsWyFkaXJdW212X3Bvc10sIHMtPmI4X3N0cmlkZSk7CisgICAgfQorfQorCisvKioKKyAqIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiAtIFJWMyB2ZXJzaW9uCisgKi8KK3N0YXRpYyB2b2lkIHJ2MzRfcHJlZF9tdl9ydjMoUlYzNERlY0NvbnRleHQgKnIsIGludCBibG9ja190eXBlLCBpbnQgZGlyKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnItPnM7CisgICAgaW50IG12X3BvcyA9IHMtPm1iX3ggKiAyICsgcy0+bWJfeSAqIDIgKiBzLT5iOF9zdHJpZGU7CisgICAgaW50IEFbMl0gPSB7MH0sIEJbMl0sIENbMl07CisgICAgaW50IGksIGosIGs7CisgICAgaW50IG14LCBteTsKKyAgICBpbnQqIGF2YWlsID0gci0+YXZhaWxfY2FjaGUgKyBhdmFpbF9pbmRleGVzWzBdOworCisgICAgaWYoYXZhaWxbLTFdKXsKKyAgICAgICAgQVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbMF1bbXZfcG9zIC0gMV1bMF07CisgICAgICAgIEFbMV0gPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsWzBdW212X3BvcyAtIDFdWzFdOworICAgIH0KKyAgICBpZihhdmFpbFstNF0peworICAgICAgICBCWzBdID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFswXVttdl9wb3MgLSBzLT5iOF9zdHJpZGVdWzBdOworICAgICAgICBCWzFdID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFswXVttdl9wb3MgLSBzLT5iOF9zdHJpZGVdWzFdOworICAgIH1lbHNleworICAgICAgICBCWzBdID0gQVswXTsKKyAgICAgICAgQlsxXSA9IEFbMV07CisgICAgfQorICAgIGlmKCFhdmFpbFstNCArIDJdKXsKKyAgICAgICAgaWYoYXZhaWxbLTRdICYmIChhdmFpbFstMV0pKXsKKyAgICAgICAgICAgIENbMF0gPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsWzBdW212X3BvcyAtIHMtPmI4X3N0cmlkZSAtIDFdWzBdOworICAgICAgICAgICAgQ1sxXSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbMF1bbXZfcG9zIC0gcy0+Yjhfc3RyaWRlIC0gMV1bMV07CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgQ1swXSA9IEFbMF07CisgICAgICAgICAgICBDWzFdID0gQVsxXTsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBDWzBdID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFswXVttdl9wb3MgLSBzLT5iOF9zdHJpZGUgKyAyXVswXTsKKyAgICAgICAgQ1sxXSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbMF1bbXZfcG9zIC0gcy0+Yjhfc3RyaWRlICsgMl1bMV07CisgICAgfQorICAgIG14ID0gbWlkX3ByZWQoQVswXSwgQlswXSwgQ1swXSk7CisgICAgbXkgPSBtaWRfcHJlZChBWzFdLCBCWzFdLCBDWzFdKTsKKyAgICBteCArPSByLT5kbXZbMF1bMF07CisgICAgbXkgKz0gci0+ZG12WzBdWzFdOworICAgIGZvcihqID0gMDsgaiA8IDI7IGorKyl7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDI7IGkrKyl7CisgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCAyOyBrKyspeworICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxba11bbXZfcG9zICsgaSArIGoqcy0+Yjhfc3RyaWRlXVswXSA9IG14OworICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxba11bbXZfcG9zICsgaSArIGoqcy0+Yjhfc3RyaWRlXVsxXSA9IG15OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgaW50IGNocm9tYV9jb2VmZnNbM10gPSB7IDAsIDMsIDUgfTsKKworLyoqCisgKiBnZW5lcmljIG1vdGlvbiBjb21wZW5zYXRpb24gZnVuY3Rpb24KKyAqCisgKiBAcGFyYW0gciBkZWNvZGVyIGNvbnRleHQKKyAqIEBwYXJhbSBibG9ja190eXBlIHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIEBwYXJhbSB4b2ZmIGhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiBAcGFyYW0geW9mZiB2ZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIEBwYXJhbSBtdl9vZmYgb2Zmc2V0IHRvIHRoZSBtb3Rpb24gdmVjdG9yIGluZm9ybWF0aW9uCisgKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgdGhlIGN1cnJlbnQgcGFydGl0aW9uIGluIDh4OCBibG9ja3MKKyAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIHRoZSBjdXJyZW50IHBhcnRpdGlvbiBpbiA4eDggYmxvY2tzCisgKiBAcGFyYW0gZGlyIG1vdGlvbiBjb21wZW5zYXRpb24gZGlyZWN0aW9uIChpLmUuIGZyb20gdGhlIGxhc3Qgb3IgdGhlIG5leHQgcmVmZXJlbmNlIGZyYW1lKQorICogQHBhcmFtIHRoaXJkcGVsIG1vdGlvbiB2ZWN0b3JzIGFyZSBzcGVjaWZpZWQgaW4gMS8zIG9mIHBpeGVsCisgKiBAcGFyYW0gcXBlbF9tYyBhIHNldCBvZiBmdW5jdGlvbnMgdXNlZCB0byBwZXJmb3JtIGx1bWEgbW90aW9uIGNvbXBlbnNhdGlvbgorICogQHBhcmFtIGNocm9tYV9tYyBhIHNldCBvZiBmdW5jdGlvbnMgdXNlZCB0byBwZXJmb3JtIGNocm9tYSBtb3Rpb24gY29tcGVuc2F0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBydjM0X21jKFJWMzREZWNDb250ZXh0ICpyLCBjb25zdCBpbnQgYmxvY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHhvZmYsIGNvbnN0IGludCB5b2ZmLCBpbnQgbXZfb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgd2lkdGgsIGNvbnN0IGludCBoZWlnaHQsIGludCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0aGlyZHBlbCwgaW50IHdlaWdodGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBxcGVsX21jX2Z1bmMgKCpxcGVsX21jKVsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRfY2hyb21hX21jX2Z1bmMgKCpjaHJvbWFfbWMpKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnItPnM7CisgICAgdWludDhfdCAqWSwgKlUsICpWLCAqc3JjWSwgKnNyY1UsICpzcmNWOworICAgIGludCBkeHksIG14LCBteSwgdW14LCB1bXksIGx4LCBseSwgdXZteCwgdXZteSwgc3JjX3gsIHNyY195LCB1dnNyY194LCB1dnNyY195OworICAgIGludCBtdl9wb3MgPSBzLT5tYl94ICogMiArIHMtPm1iX3kgKiAyICogcy0+Yjhfc3RyaWRlICsgbXZfb2ZmOworICAgIGludCBpczE2eDE2ID0gMTsKKyAgICBpbnQgZW11ID0gMDsKKworICAgIGlmKHRoaXJkcGVsKXsKKyAgICAgICAgaW50IGNocm9tYV9teCwgY2hyb21hX215OworICAgICAgICBteCA9IChzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsW2Rpcl1bbXZfcG9zXVswXSArICgzIDw8IDI0KSkgLyAzIC0gKDEgPDwgMjQpOworICAgICAgICBteSA9IChzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsW2Rpcl1bbXZfcG9zXVsxXSArICgzIDw8IDI0KSkgLyAzIC0gKDEgPDwgMjQpOworICAgICAgICBseCA9IChzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsW2Rpcl1bbXZfcG9zXVswXSArICgzIDw8IDI0KSkgJSAzOworICAgICAgICBseSA9IChzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsW2Rpcl1bbXZfcG9zXVsxXSArICgzIDw8IDI0KSkgJSAzOworICAgICAgICBjaHJvbWFfbXggPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsW2Rpcl1bbXZfcG9zXVswXSAvIDI7CisgICAgICAgIGNocm9tYV9teSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbZGlyXVttdl9wb3NdWzFdIC8gMjsKKyAgICAgICAgdW14ID0gKGNocm9tYV9teCArICgzIDw8IDI0KSkgLyAzIC0gKDEgPDwgMjQpOworICAgICAgICB1bXkgPSAoY2hyb21hX215ICsgKDMgPDwgMjQpKSAvIDMgLSAoMSA8PCAyNCk7CisgICAgICAgIHV2bXggPSBjaHJvbWFfY29lZmZzWyhjaHJvbWFfbXggKyAoMyA8PCAyNCkpICUgM107CisgICAgICAgIHV2bXkgPSBjaHJvbWFfY29lZmZzWyhjaHJvbWFfbXkgKyAoMyA8PCAyNCkpICUgM107CisgICAgfWVsc2V7CisgICAgICAgIGludCBjeCwgY3k7CisgICAgICAgIG14ID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFtkaXJdW212X3Bvc11bMF0gPj4gMjsKKyAgICAgICAgbXkgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsW2Rpcl1bbXZfcG9zXVsxXSA+PiAyOworICAgICAgICBseCA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbZGlyXVttdl9wb3NdWzBdICYgMzsKKyAgICAgICAgbHkgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tb3Rpb25fdmFsW2Rpcl1bbXZfcG9zXVsxXSAmIDM7CisgICAgICAgIGN4ID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFtkaXJdW212X3Bvc11bMF0gLyAyOworICAgICAgICBjeSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbZGlyXVttdl9wb3NdWzFdIC8gMjsKKyAgICAgICAgdW14ID0gY3ggPj4gMjsKKyAgICAgICAgdW15ID0gY3kgPj4gMjsKKyAgICAgICAgdXZteCA9IChjeCAmIDMpIDw8IDE7CisgICAgICAgIHV2bXkgPSAoY3kgJiAzKSA8PCAxOworICAgICAgICAvL2R1ZSB0byBzb21lIGZsYXcgUlY0MCB1c2VzIHRoZSBzYW1lIE1DIGNvbXBlbnNhdGlvbiByb3V0aW5lIGZvciBIMlYyIGFuZCBIM1YzCisgICAgICAgIGlmKHV2bXggPT0gNiAmJiB1dm15ID09IDYpCisgICAgICAgICAgICB1dm14ID0gdXZteSA9IDQ7CisgICAgfQorCisgICAgaWYgKEhBVkVfVEhSRUFEUyAmJiAocy0+YXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkpIHsKKyAgICAgICAgLyogd2FpdCBmb3IgdGhlIHJlZmVyZW5jZWQgbWIgcm93IHRvIGJlIGZpbmlzaGVkICovCisgICAgICAgIGludCBtYl9yb3cgPSBzLT5tYl95ICsgKCh5b2ZmICsgbXkgKyA1ICsgOCAqIGhlaWdodCkgPj4gNCk7CisgICAgICAgIFRocmVhZEZyYW1lICpmID0gZGlyID8gJnMtPm5leHRfcGljdHVyZV9wdHItPnRmIDogJnMtPmxhc3RfcGljdHVyZV9wdHItPnRmOworICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoZiwgbWJfcm93LCAwKTsKKyAgICB9CisKKyAgICBkeHkgPSBseSo0ICsgbHg7CisgICAgc3JjWSA9IGRpciA/IHMtPm5leHRfcGljdHVyZV9wdHItPmYtPmRhdGFbMF0gOiBzLT5sYXN0X3BpY3R1cmVfcHRyLT5mLT5kYXRhWzBdOworICAgIHNyY1UgPSBkaXIgPyBzLT5uZXh0X3BpY3R1cmVfcHRyLT5mLT5kYXRhWzFdIDogcy0+bGFzdF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVsxXTsKKyAgICBzcmNWID0gZGlyID8gcy0+bmV4dF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVsyXSA6IHMtPmxhc3RfcGljdHVyZV9wdHItPmYtPmRhdGFbMl07CisgICAgc3JjX3ggPSBzLT5tYl94ICogMTYgKyB4b2ZmICsgbXg7CisgICAgc3JjX3kgPSBzLT5tYl95ICogMTYgKyB5b2ZmICsgbXk7CisgICAgdXZzcmNfeCA9IHMtPm1iX3ggKiA4ICsgKHhvZmYgPj4gMSkgKyB1bXg7CisgICAgdXZzcmNfeSA9IHMtPm1iX3kgKiA4ICsgKHlvZmYgPj4gMSkgKyB1bXk7CisgICAgc3JjWSArPSBzcmNfeSAqIHMtPmxpbmVzaXplICsgc3JjX3g7CisgICAgc3JjVSArPSB1dnNyY195ICogcy0+dXZsaW5lc2l6ZSArIHV2c3JjX3g7CisgICAgc3JjViArPSB1dnNyY195ICogcy0+dXZsaW5lc2l6ZSArIHV2c3JjX3g7CisgICAgaWYocy0+aF9lZGdlX3BvcyAtICh3aWR0aCA8PCAzKSA8IDYgfHwgcy0+dl9lZGdlX3BvcyAtIChoZWlnaHQgPDwgMykgPCA2IHx8CisgICAgICAgKHVuc2lnbmVkKShzcmNfeCAtICEhbHgqMikgPiBzLT5oX2VkZ2VfcG9zIC0gISFseCoyIC0gKHdpZHRoIDw8MykgLSA0IHx8CisgICAgICAgKHVuc2lnbmVkKShzcmNfeSAtICEhbHkqMikgPiBzLT52X2VkZ2VfcG9zIC0gISFseSoyIC0gKGhlaWdodDw8MykgLSA0KSB7CisgICAgICAgIHNyY1kgLT0gMiArIDIqcy0+bGluZXNpemU7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsIHNyY1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lc2l6ZSwgcy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2lkdGggPDwgMykgKyA2LCAoaGVpZ2h0IDw8IDMpICsgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY194IC0gMiwgc3JjX3kgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3Bvcywgcy0+dl9lZGdlX3Bvcyk7CisgICAgICAgIHNyY1kgPSBzLT5lZGdlX2VtdV9idWZmZXIgKyAyICsgMipzLT5saW5lc2l6ZTsKKyAgICAgICAgZW11ID0gMTsKKyAgICB9CisgICAgaWYoIXdlaWdodGVkKXsKKyAgICAgICAgWSA9IHMtPmRlc3RbMF0gKyB4b2ZmICAgICAgKyB5b2ZmICAgICAqcy0+bGluZXNpemU7CisgICAgICAgIFUgPSBzLT5kZXN0WzFdICsgKHhvZmY+PjEpICsgKHlvZmY+PjEpKnMtPnV2bGluZXNpemU7CisgICAgICAgIFYgPSBzLT5kZXN0WzJdICsgKHhvZmY+PjEpICsgKHlvZmY+PjEpKnMtPnV2bGluZXNpemU7CisgICAgfWVsc2V7CisgICAgICAgIFkgPSByLT50bXBfYl9ibG9ja195IFtkaXJdICAgICArICB4b2ZmICAgICArICB5b2ZmICAgICpzLT5saW5lc2l6ZTsKKyAgICAgICAgVSA9IHItPnRtcF9iX2Jsb2NrX3V2W2RpcioyXSAgICsgKHhvZmY+PjEpICsgKHlvZmY+PjEpKnMtPnV2bGluZXNpemU7CisgICAgICAgIFYgPSByLT50bXBfYl9ibG9ja191dltkaXIqMisxXSArICh4b2ZmPj4xKSArICh5b2ZmPj4xKSpzLT51dmxpbmVzaXplOworICAgIH0KKworICAgIGlmKGJsb2NrX3R5cGUgPT0gUlYzNF9NQl9QXzE2eDgpeworICAgICAgICBxcGVsX21jWzFdW2R4eV0oWSwgc3JjWSwgcy0+bGluZXNpemUpOworICAgICAgICBZICAgICs9IDg7CisgICAgICAgIHNyY1kgKz0gODsKKyAgICB9ZWxzZSBpZihibG9ja190eXBlID09IFJWMzRfTUJfUF84eDE2KXsKKyAgICAgICAgcXBlbF9tY1sxXVtkeHldKFksIHNyY1ksIHMtPmxpbmVzaXplKTsKKyAgICAgICAgWSAgICArPSA4ICogcy0+bGluZXNpemU7CisgICAgICAgIHNyY1kgKz0gOCAqIHMtPmxpbmVzaXplOworICAgIH0KKyAgICBpczE2eDE2ID0gKGJsb2NrX3R5cGUgIT0gUlYzNF9NQl9QXzh4OCkgJiYgKGJsb2NrX3R5cGUgIT0gUlYzNF9NQl9QXzE2eDgpICYmIChibG9ja190eXBlICE9IFJWMzRfTUJfUF84eDE2KTsKKyAgICBxcGVsX21jWyFpczE2eDE2XVtkeHldKFksIHNyY1ksIHMtPmxpbmVzaXplKTsKKyAgICBpZiAoZW11KSB7CisgICAgICAgIHVpbnQ4X3QgKnV2YnVmID0gcy0+ZWRnZV9lbXVfYnVmZmVyOworCisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh1dmJ1Ziwgc3JjVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnV2bGluZXNpemUsIHMtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2lkdGggPDwgMikgKyAxLCAoaGVpZ2h0IDw8IDIpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c3JjX3gsIHV2c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHMtPnZfZWRnZV9wb3MgPj4gMSk7CisgICAgICAgIHNyY1UgPSB1dmJ1ZjsKKyAgICAgICAgdXZidWYgKz0gOSpzLT51dmxpbmVzaXplOworCisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh1dmJ1Ziwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnV2bGluZXNpemUsIHMtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2lkdGggPDwgMikgKyAxLCAoaGVpZ2h0IDw8IDIpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c3JjX3gsIHV2c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHMtPnZfZWRnZV9wb3MgPj4gMSk7CisgICAgICAgIHNyY1YgPSB1dmJ1ZjsKKyAgICB9CisgICAgY2hyb21hX21jWzItd2lkdGhdICAgKFUsIHNyY1UsIHMtPnV2bGluZXNpemUsIGhlaWdodCo0LCB1dm14LCB1dm15KTsKKyAgICBjaHJvbWFfbWNbMi13aWR0aF0gICAoViwgc3JjViwgcy0+dXZsaW5lc2l6ZSwgaGVpZ2h0KjQsIHV2bXgsIHV2bXkpOworfQorCitzdGF0aWMgdm9pZCBydjM0X21jXzFtdihSVjM0RGVjQ29udGV4dCAqciwgY29uc3QgaW50IGJsb2NrX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeG9mZiwgY29uc3QgaW50IHlvZmYsIGludCBtdl9vZmYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgd2lkdGgsIGNvbnN0IGludCBoZWlnaHQsIGludCBkaXIpCit7CisgICAgcnYzNF9tYyhyLCBibG9ja190eXBlLCB4b2ZmLCB5b2ZmLCBtdl9vZmYsIHdpZHRoLCBoZWlnaHQsIGRpciwgci0+cnYzMCwgMCwKKyAgICAgICAgICAgIHItPnJkc3AucHV0X3BpeGVsc190YWIsCisgICAgICAgICAgICByLT5yZHNwLnB1dF9jaHJvbWFfcGl4ZWxzX3RhYik7Cit9CisKK3N0YXRpYyB2b2lkIHJ2NF93ZWlnaHQoUlYzNERlY0NvbnRleHQgKnIpCit7CisgICAgci0+cmRzcC5ydjQwX3dlaWdodF9waXhlbHNfdGFiW3ItPnNjYWxlZF93ZWlnaHRdWzBdKHItPnMuZGVzdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dG1wX2JfYmxvY2tfeVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dG1wX2JfYmxvY2tfeVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+d2VpZ2h0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+d2VpZ2h0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+cy5saW5lc2l6ZSk7CisgICAgci0+cmRzcC5ydjQwX3dlaWdodF9waXhlbHNfdGFiW3ItPnNjYWxlZF93ZWlnaHRdWzFdKHItPnMuZGVzdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dG1wX2JfYmxvY2tfdXZbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnRtcF9iX2Jsb2NrX3V2WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT53ZWlnaHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT53ZWlnaHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zLnV2bGluZXNpemUpOworICAgIHItPnJkc3AucnY0MF93ZWlnaHRfcGl4ZWxzX3RhYltyLT5zY2FsZWRfd2VpZ2h0XVsxXShyLT5zLmRlc3RbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnRtcF9iX2Jsb2NrX3V2WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT50bXBfYl9ibG9ja191dlszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+d2VpZ2h0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+d2VpZ2h0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+cy51dmxpbmVzaXplKTsKK30KKworc3RhdGljIHZvaWQgcnYzNF9tY18ybXYoUlYzNERlY0NvbnRleHQgKnIsIGNvbnN0IGludCBibG9ja190eXBlKQoreworICAgIGludCB3ZWlnaHRlZCA9ICFyLT5ydjMwICYmIGJsb2NrX3R5cGUgIT0gUlYzNF9NQl9CX0JJRElSICYmIHItPndlaWdodDEgIT0gODE5MjsKKworICAgIHJ2MzRfbWMociwgYmxvY2tfdHlwZSwgMCwgMCwgMCwgMiwgMiwgMCwgci0+cnYzMCwgd2VpZ2h0ZWQsCisgICAgICAgICAgICByLT5yZHNwLnB1dF9waXhlbHNfdGFiLAorICAgICAgICAgICAgci0+cmRzcC5wdXRfY2hyb21hX3BpeGVsc190YWIpOworICAgIGlmKCF3ZWlnaHRlZCl7CisgICAgICAgIHJ2MzRfbWMociwgYmxvY2tfdHlwZSwgMCwgMCwgMCwgMiwgMiwgMSwgci0+cnYzMCwgMCwKKyAgICAgICAgICAgICAgICByLT5yZHNwLmF2Z19waXhlbHNfdGFiLAorICAgICAgICAgICAgICAgIHItPnJkc3AuYXZnX2Nocm9tYV9waXhlbHNfdGFiKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcnYzNF9tYyhyLCBibG9ja190eXBlLCAwLCAwLCAwLCAyLCAyLCAxLCByLT5ydjMwLCAxLAorICAgICAgICAgICAgICAgIHItPnJkc3AucHV0X3BpeGVsc190YWIsCisgICAgICAgICAgICAgICAgci0+cmRzcC5wdXRfY2hyb21hX3BpeGVsc190YWIpOworICAgICAgICBydjRfd2VpZ2h0KHIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcnYzNF9tY18ybXZfc2tpcChSVjM0RGVjQ29udGV4dCAqcikKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgd2VpZ2h0ZWQgPSAhci0+cnYzMCAmJiByLT53ZWlnaHQxICE9IDgxOTI7CisKKyAgICBmb3IoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgIGZvcihpID0gMDsgaSA8IDI7IGkrKyl7CisgICAgICAgICAgICAgcnYzNF9tYyhyLCBSVjM0X01CX1BfOHg4LCBpKjgsIGoqOCwgaStqKnItPnMuYjhfc3RyaWRlLCAxLCAxLCAwLCByLT5ydjMwLAorICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ZWQsCisgICAgICAgICAgICAgICAgICAgICByLT5yZHNwLnB1dF9waXhlbHNfdGFiLAorICAgICAgICAgICAgICAgICAgICAgci0+cmRzcC5wdXRfY2hyb21hX3BpeGVsc190YWIpOworICAgICAgICAgICAgIHJ2MzRfbWMociwgUlYzNF9NQl9QXzh4OCwgaSo4LCBqKjgsIGkraipyLT5zLmI4X3N0cmlkZSwgMSwgMSwgMSwgci0+cnYzMCwKKyAgICAgICAgICAgICAgICAgICAgIHdlaWdodGVkLAorICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ZWQgPyByLT5yZHNwLnB1dF9waXhlbHNfdGFiIDogci0+cmRzcC5hdmdfcGl4ZWxzX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgIHdlaWdodGVkID8gci0+cmRzcC5wdXRfY2hyb21hX3BpeGVsc190YWIgOiByLT5yZHNwLmF2Z19jaHJvbWFfcGl4ZWxzX3RhYik7CisgICAgICAgIH0KKyAgICBpZih3ZWlnaHRlZCkKKyAgICAgICAgcnY0X3dlaWdodChyKTsKK30KKworLyoqIG51bWJlciBvZiBtb3Rpb24gdmVjdG9ycyBpbiBlYWNoIG1hY3JvYmxvY2sgdHlwZSAqLworc3RhdGljIGNvbnN0IGludCBudW1fbXZzW1JWMzRfTUJfVFlQRVNdID0geyAwLCAwLCAxLCA0LCAxLCAxLCAwLCAwLCAyLCAyLCAyLCAxIH07CisKKy8qKgorICogRGVjb2RlIG1vdGlvbiB2ZWN0b3IgZGlmZmVyZW5jZXMKKyAqIGFuZCBwZXJmb3JtIG1vdGlvbiB2ZWN0b3IgcmVjb25zdHJ1Y3Rpb24gYW5kIG1vdGlvbiBjb21wZW5zYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgcnYzNF9kZWNvZGVfbXYoUlYzNERlY0NvbnRleHQgKnIsIGludCBibG9ja190eXBlKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnItPnM7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+Z2I7CisgICAgaW50IGksIGosIGssIGw7CisgICAgaW50IG12X3BvcyA9IHMtPm1iX3ggKiAyICsgcy0+bWJfeSAqIDIgKiBzLT5iOF9zdHJpZGU7CisgICAgaW50IG5leHRfYnQ7CisKKyAgICBtZW1zZXQoci0+ZG12LCAwLCBzaXplb2Yoci0+ZG12KSk7CisgICAgZm9yKGkgPSAwOyBpIDwgbnVtX212c1tibG9ja190eXBlXTsgaSsrKXsKKyAgICAgICAgci0+ZG12W2ldWzBdID0gc3ZxM19nZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgci0+ZG12W2ldWzFdID0gc3ZxM19nZXRfc2VfZ29sb21iKGdiKTsKKyAgICB9CisgICAgc3dpdGNoKGJsb2NrX3R5cGUpeworICAgIGNhc2UgUlYzNF9NQl9UWVBFX0lOVFJBOgorICAgIGNhc2UgUlYzNF9NQl9UWVBFX0lOVFJBMTZ4MTY6CisgICAgICAgIFpFUk84eDIocy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFswXVtzLT5tYl94ICogMiArIHMtPm1iX3kgKiAyICogcy0+Yjhfc3RyaWRlXSwgcy0+Yjhfc3RyaWRlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBSVjM0X01CX1NLSVA6CisgICAgICAgIGlmKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCl7CisgICAgICAgICAgICBaRVJPOHgyKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbMF1bcy0+bWJfeCAqIDIgKyBzLT5tYl95ICogMiAqIHMtPmI4X3N0cmlkZV0sIHMtPmI4X3N0cmlkZSk7CisgICAgICAgICAgICBydjM0X21jXzFtdiAociwgYmxvY2tfdHlwZSwgMCwgMCwgMCwgMiwgMiwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgUlYzNF9NQl9CX0RJUkVDVDoKKyAgICAgICAgLy9zdXJwcmlzaW5nbHksIGl0IHVzZXMgbW90aW9uIHNjaGVtZSBmcm9tIG5leHQgcmVmZXJlbmNlIGZyYW1lCisgICAgICAgIC8qIHdhaXQgZm9yIHRoZSBjdXJyZW50IG1iIHJvdyB0byBiZSBmaW5pc2hlZCAqLworICAgICAgICBpZiAoSEFWRV9USFJFQURTICYmIChzLT5hdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSkKKyAgICAgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcy0+bmV4dF9waWN0dXJlX3B0ci0+dGYsIEZGTUFYKDAsIHMtPm1iX3ktMSksIDApOworCisgICAgICAgIG5leHRfYnQgPSBzLT5uZXh0X3BpY3R1cmVfcHRyLT5tYl90eXBlW3MtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlXTsKKyAgICAgICAgaWYoSVNfSU5UUkEobmV4dF9idCkgfHwgSVNfU0tJUChuZXh0X2J0KSl7CisgICAgICAgICAgICBaRVJPOHgyKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbMF1bcy0+bWJfeCAqIDIgKyBzLT5tYl95ICogMiAqIHMtPmI4X3N0cmlkZV0sIHMtPmI4X3N0cmlkZSk7CisgICAgICAgICAgICBaRVJPOHgyKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbMV1bcy0+bWJfeCAqIDIgKyBzLT5tYl95ICogMiAqIHMtPmI4X3N0cmlkZV0sIHMtPmI4X3N0cmlkZSk7CisgICAgICAgIH1lbHNlCisgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCAyOyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IobCA9IDA7IGwgPCAyOyBsKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFtsXVttdl9wb3MgKyBpICsgaipzLT5iOF9zdHJpZGVdW2tdID0gY2FsY19hZGRfbXYociwgbCwgcy0+bmV4dF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFswXVttdl9wb3MgKyBpICsgaipzLT5iOF9zdHJpZGVdW2tdKTsKKyAgICAgICAgaWYoIShJU18xNlg4KG5leHRfYnQpIHx8IElTXzhYMTYobmV4dF9idCkgfHwgSVNfOFg4KG5leHRfYnQpKSkgLy93ZSBjYW4gdXNlIHdob2xlIG1hY3JvYmxvY2sgTUMKKyAgICAgICAgICAgIHJ2MzRfbWNfMm12KHIsIGJsb2NrX3R5cGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBydjM0X21jXzJtdl9za2lwKHIpOworICAgICAgICBaRVJPOHgyKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1vdGlvbl92YWxbMF1bcy0+bWJfeCAqIDIgKyBzLT5tYl95ICogMiAqIHMtPmI4X3N0cmlkZV0sIHMtPmI4X3N0cmlkZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlYzNF9NQl9QXzE2eDE2OgorICAgIGNhc2UgUlYzNF9NQl9QX01JWDE2eDE2OgorICAgICAgICBydjM0X3ByZWRfbXYociwgYmxvY2tfdHlwZSwgMCwgMCk7CisgICAgICAgIHJ2MzRfbWNfMW12IChyLCBibG9ja190eXBlLCAwLCAwLCAwLCAyLCAyLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSVjM0X01CX0JfRk9SV0FSRDoKKyAgICBjYXNlIFJWMzRfTUJfQl9CQUNLV0FSRDoKKyAgICAgICAgci0+ZG12WzFdWzBdID0gci0+ZG12WzBdWzBdOworICAgICAgICByLT5kbXZbMV1bMV0gPSByLT5kbXZbMF1bMV07CisgICAgICAgIGlmKHItPnJ2MzApCisgICAgICAgICAgICBydjM0X3ByZWRfbXZfcnYzKHIsIGJsb2NrX3R5cGUsIGJsb2NrX3R5cGUgPT0gUlYzNF9NQl9CX0JBQ0tXQVJEKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnYzNF9wcmVkX212X2IgIChyLCBibG9ja190eXBlLCBibG9ja190eXBlID09IFJWMzRfTUJfQl9CQUNLV0FSRCk7CisgICAgICAgIHJ2MzRfbWNfMW12ICAgICAociwgYmxvY2tfdHlwZSwgMCwgMCwgMCwgMiwgMiwgYmxvY2tfdHlwZSA9PSBSVjM0X01CX0JfQkFDS1dBUkQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJWMzRfTUJfUF8xNng4OgorICAgIGNhc2UgUlYzNF9NQl9QXzh4MTY6CisgICAgICAgIHJ2MzRfcHJlZF9tdihyLCBibG9ja190eXBlLCAwLCAwKTsKKyAgICAgICAgcnYzNF9wcmVkX212KHIsIGJsb2NrX3R5cGUsIDEgKyAoYmxvY2tfdHlwZSA9PSBSVjM0X01CX1BfMTZ4OCksIDEpOworICAgICAgICBpZihibG9ja190eXBlID09IFJWMzRfTUJfUF8xNng4KXsKKyAgICAgICAgICAgIHJ2MzRfbWNfMW12KHIsIGJsb2NrX3R5cGUsIDAsIDAsIDAsICAgICAgICAgICAgMiwgMSwgMCk7CisgICAgICAgICAgICBydjM0X21jXzFtdihyLCBibG9ja190eXBlLCAwLCA4LCBzLT5iOF9zdHJpZGUsIDIsIDEsIDApOworICAgICAgICB9CisgICAgICAgIGlmKGJsb2NrX3R5cGUgPT0gUlYzNF9NQl9QXzh4MTYpeworICAgICAgICAgICAgcnYzNF9tY18xbXYociwgYmxvY2tfdHlwZSwgMCwgMCwgMCwgMSwgMiwgMCk7CisgICAgICAgICAgICBydjM0X21jXzFtdihyLCBibG9ja190eXBlLCA4LCAwLCAxLCAxLCAyLCAwKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFJWMzRfTUJfQl9CSURJUjoKKyAgICAgICAgcnYzNF9wcmVkX212X2IgIChyLCBibG9ja190eXBlLCAwKTsKKyAgICAgICAgcnYzNF9wcmVkX212X2IgIChyLCBibG9ja190eXBlLCAxKTsKKyAgICAgICAgcnYzNF9tY18ybXYgICAgIChyLCBibG9ja190eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSVjM0X01CX1BfOHg4OgorICAgICAgICBmb3IoaT0wO2k8IDQ7aSsrKXsKKyAgICAgICAgICAgIHJ2MzRfcHJlZF9tdihyLCBibG9ja190eXBlLCBpLCBpKTsKKyAgICAgICAgICAgIHJ2MzRfbWNfMW12IChyLCBibG9ja190eXBlLCAoaSYxKTw8MywgKGkmMik8PDIsIChpJjEpKyhpPj4xKSpzLT5iOF9zdHJpZGUsIDEsIDEsIDApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorLyoqIEB9ICovIC8vIG12IGdyb3VwCisKKy8qKgorICogQG5hbWUgTWFjcm9ibG9jayByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qKiBtYXBwaW5nIG9mIFJWMzAvNDAgaW50cmEgcHJlZGljdGlvbiB0eXBlcyB0byBzdGFuZGFyZCBILjI2NCB0eXBlcyAqLworc3RhdGljIGNvbnN0IGludCBpdHRyYW5zWzldID0geworIERDX1BSRUQsIFZFUlRfUFJFRCwgSE9SX1BSRUQsIERJQUdfRE9XTl9SSUdIVF9QUkVELCBESUFHX0RPV05fTEVGVF9QUkVELAorIFZFUlRfUklHSFRfUFJFRCwgVkVSVF9MRUZUX1BSRUQsIEhPUl9VUF9QUkVELCBIT1JfRE9XTl9QUkVELAorfTsKKworLyoqIG1hcHBpbmcgb2YgUlYzMC80MCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIHR5cGVzIHRvIHN0YW5kYXJkIEguMjY0IHR5cGVzICovCitzdGF0aWMgY29uc3QgaW50IGl0dHJhbnMxNls0XSA9IHsKKyBEQ19QUkVEOHg4LCBWRVJUX1BSRUQ4eDgsIEhPUl9QUkVEOHg4LCBQTEFORV9QUkVEOHg4LAorfTsKKworLyoqCisgKiBQZXJmb3JtIDR4NCBpbnRyYSBwcmVkaWN0aW9uLgorICovCitzdGF0aWMgdm9pZCBydjM0X3ByZWRfNHg0X2Jsb2NrKFJWMzREZWNDb250ZXh0ICpyLCB1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludCBpdHlwZSwgaW50IHVwLCBpbnQgbGVmdCwgaW50IGRvd24sIGludCByaWdodCkKK3sKKyAgICB1aW50OF90ICpwcmV2ID0gZHN0IC0gc3RyaWRlICsgNDsKKyAgICB1aW50MzJfdCB0b3BsZWZ0OworCisgICAgaWYoIXVwICYmICFsZWZ0KQorICAgICAgICBpdHlwZSA9IERDXzEyOF9QUkVEOworICAgIGVsc2UgaWYoIXVwKXsKKyAgICAgICAgaWYoaXR5cGUgPT0gVkVSVF9QUkVEKSBpdHlwZSA9IEhPUl9QUkVEOworICAgICAgICBpZihpdHlwZSA9PSBEQ19QUkVEKSAgIGl0eXBlID0gTEVGVF9EQ19QUkVEOworICAgIH1lbHNlIGlmKCFsZWZ0KXsKKyAgICAgICAgaWYoaXR5cGUgPT0gSE9SX1BSRUQpICBpdHlwZSA9IFZFUlRfUFJFRDsKKyAgICAgICAgaWYoaXR5cGUgPT0gRENfUFJFRCkgICBpdHlwZSA9IFRPUF9EQ19QUkVEOworICAgICAgICBpZihpdHlwZSA9PSBESUFHX0RPV05fTEVGVF9QUkVEKSBpdHlwZSA9IERJQUdfRE9XTl9MRUZUX1BSRURfUlY0MF9OT0RPV047CisgICAgfQorICAgIGlmKCFkb3duKXsKKyAgICAgICAgaWYoaXR5cGUgPT0gRElBR19ET1dOX0xFRlRfUFJFRCkgaXR5cGUgPSBESUFHX0RPV05fTEVGVF9QUkVEX1JWNDBfTk9ET1dOOworICAgICAgICBpZihpdHlwZSA9PSBIT1JfVVBfUFJFRCkgaXR5cGUgPSBIT1JfVVBfUFJFRF9SVjQwX05PRE9XTjsKKyAgICAgICAgaWYoaXR5cGUgPT0gVkVSVF9MRUZUX1BSRUQpIGl0eXBlID0gVkVSVF9MRUZUX1BSRURfUlY0MF9OT0RPV047CisgICAgfQorICAgIGlmKCFyaWdodCAmJiB1cCl7CisgICAgICAgIHRvcGxlZnQgPSBkc3RbLXN0cmlkZSArIDNdICogMHgwMTAxMDEwMXU7CisgICAgICAgIHByZXYgPSAodWludDhfdCopJnRvcGxlZnQ7CisgICAgfQorICAgIHItPmgucHJlZDR4NFtpdHlwZV0oZHN0LCBwcmV2LCBzdHJpZGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhZGp1c3RfcHJlZDE2KGludCBpdHlwZSwgaW50IHVwLCBpbnQgbGVmdCkKK3sKKyAgICBpZighdXAgJiYgIWxlZnQpCisgICAgICAgIGl0eXBlID0gRENfMTI4X1BSRUQ4eDg7CisgICAgZWxzZSBpZighdXApeworICAgICAgICBpZihpdHlwZSA9PSBQTEFORV9QUkVEOHg4KWl0eXBlID0gSE9SX1BSRUQ4eDg7CisgICAgICAgIGlmKGl0eXBlID09IFZFUlRfUFJFRDh4OCkgaXR5cGUgPSBIT1JfUFJFRDh4ODsKKyAgICAgICAgaWYoaXR5cGUgPT0gRENfUFJFRDh4OCkgICBpdHlwZSA9IExFRlRfRENfUFJFRDh4ODsKKyAgICB9ZWxzZSBpZighbGVmdCl7CisgICAgICAgIGlmKGl0eXBlID09IFBMQU5FX1BSRUQ4eDgpaXR5cGUgPSBWRVJUX1BSRUQ4eDg7CisgICAgICAgIGlmKGl0eXBlID09IEhPUl9QUkVEOHg4KSAgaXR5cGUgPSBWRVJUX1BSRUQ4eDg7CisgICAgICAgIGlmKGl0eXBlID09IERDX1BSRUQ4eDgpICAgaXR5cGUgPSBUT1BfRENfUFJFRDh4ODsKKyAgICB9CisgICAgcmV0dXJuIGl0eXBlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnYzNF9wcm9jZXNzX2Jsb2NrKFJWMzREZWNDb250ZXh0ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwZHN0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmMsIGludCBzYywgaW50IHFfZGMsIGludCBxX2FjKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnItPnM7CisgICAgaW50MTZfdCAqcHRyID0gcy0+YmxvY2tbMF07CisgICAgaW50IGhhc19hYyA9IHJ2MzRfZGVjb2RlX2Jsb2NrKHB0ciwgJnMtPmdiLCByLT5jdXJfdmxjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmMsIHNjLCBxX2RjLCBxX2FjLCBxX2FjKTsKKyAgICBpZihoYXNfYWMpeworICAgICAgICByLT5yZHNwLnJ2MzRfaWRjdF9hZGQocGRzdCwgc3RyaWRlLCBwdHIpOworICAgIH1lbHNleworICAgICAgICByLT5yZHNwLnJ2MzRfaWRjdF9kY19hZGQocGRzdCwgc3RyaWRlLCBwdHJbMF0pOworICAgICAgICBwdHJbMF0gPSAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcnYzNF9vdXRwdXRfaTE2eDE2KFJWMzREZWNDb250ZXh0ICpyLCBpbnQ4X3QgKmludHJhX3R5cGVzLCBpbnQgY2JwKQoreworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgYmxvY2sxNiwgWzE2XSk7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgICAgPSAmci0+czsKKyAgICBHZXRCaXRDb250ZXh0ICAqZ2IgICA9ICZzLT5nYjsKKyAgICBpbnQgICAgICAgICAgICAgcV9kYyA9IHJ2MzRfcXNjYWxlX3RhYlsgci0+bHVtYV9kY19xdWFudF9pW3MtPnFzY2FsZV0gXSwKKyAgICAgICAgICAgICAgICAgICAgcV9hYyA9IHJ2MzRfcXNjYWxlX3RhYltzLT5xc2NhbGVdOworICAgIHVpbnQ4X3QgICAgICAgICpkc3QgID0gcy0+ZGVzdFswXTsKKyAgICBpbnQxNl90ICAgICAgICAqcHRyICA9IHMtPmJsb2NrWzBdOworICAgIGludCBpLCBqLCBpdHlwZSwgaGFzX2FjOworCisgICAgbWVtc2V0KGJsb2NrMTYsIDAsIDE2ICogc2l6ZW9mKCpibG9jazE2KSk7CisKKyAgICBoYXNfYWMgPSBydjM0X2RlY29kZV9ibG9jayhibG9jazE2LCBnYiwgci0+Y3VyX3ZsY3MsIDMsIDAsIHFfZGMsIHFfZGMsIHFfYWMpOworICAgIGlmKGhhc19hYykKKyAgICAgICAgci0+cmRzcC5ydjM0X2ludl90cmFuc2Zvcm0oYmxvY2sxNik7CisgICAgZWxzZQorICAgICAgICByLT5yZHNwLnJ2MzRfaW52X3RyYW5zZm9ybV9kYyhibG9jazE2KTsKKworICAgIGl0eXBlID0gaXR0cmFuczE2W2ludHJhX3R5cGVzWzBdXTsKKyAgICBpdHlwZSA9IGFkanVzdF9wcmVkMTYoaXR5cGUsIHItPmF2YWlsX2NhY2hlWzYtNF0sIHItPmF2YWlsX2NhY2hlWzYtMV0pOworICAgIHItPmgucHJlZDE2eDE2W2l0eXBlXShkc3QsIHMtPmxpbmVzaXplKTsKKworICAgIGZvcihqID0gMDsgaiA8IDQ7IGorKyl7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKywgY2JwID4+PSAxKXsKKyAgICAgICAgICAgIGludCBkYyA9IGJsb2NrMTZbaSArIGoqNF07CisKKyAgICAgICAgICAgIGlmKGNicCAmIDEpeworICAgICAgICAgICAgICAgIGhhc19hYyA9IHJ2MzRfZGVjb2RlX2Jsb2NrKHB0ciwgZ2IsIHItPmN1cl92bGNzLCByLT5sdW1hX3ZsYywgMCwgcV9hYywgcV9hYywgcV9hYyk7CisgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgIGhhc19hYyA9IDA7CisKKyAgICAgICAgICAgIGlmKGhhc19hYyl7CisgICAgICAgICAgICAgICAgcHRyWzBdID0gZGM7CisgICAgICAgICAgICAgICAgci0+cmRzcC5ydjM0X2lkY3RfYWRkKGRzdCs0KmksIHMtPmxpbmVzaXplLCBwdHIpOworICAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgICAgICByLT5yZHNwLnJ2MzRfaWRjdF9kY19hZGQoZHN0KzQqaSwgcy0+bGluZXNpemUsIGRjKTsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCArPSA0KnMtPmxpbmVzaXplOworICAgIH0KKworICAgIGl0eXBlID0gaXR0cmFuczE2W2ludHJhX3R5cGVzWzBdXTsKKyAgICBpZihpdHlwZSA9PSBQTEFORV9QUkVEOHg4KSBpdHlwZSA9IERDX1BSRUQ4eDg7CisgICAgaXR5cGUgPSBhZGp1c3RfcHJlZDE2KGl0eXBlLCByLT5hdmFpbF9jYWNoZVs2LTRdLCByLT5hdmFpbF9jYWNoZVs2LTFdKTsKKworICAgIHFfZGMgPSBydjM0X3FzY2FsZV90YWJbcnYzNF9jaHJvbWFfcXVhbnRbMV1bcy0+cXNjYWxlXV07CisgICAgcV9hYyA9IHJ2MzRfcXNjYWxlX3RhYltydjM0X2Nocm9tYV9xdWFudFswXVtzLT5xc2NhbGVdXTsKKworICAgIGZvcihqID0gMTsgaiA8IDM7IGorKyl7CisgICAgICAgIGRzdCA9IHMtPmRlc3Rbal07CisgICAgICAgIHItPmgucHJlZDh4OFtpdHlwZV0oZHN0LCBzLT51dmxpbmVzaXplKTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrLCBjYnAgPj49IDEpeworICAgICAgICAgICAgdWludDhfdCAqcGRzdDsKKyAgICAgICAgICAgIGlmKCEoY2JwICYgMSkpIGNvbnRpbnVlOworICAgICAgICAgICAgcGRzdCAgID0gZHN0ICsgKGkmMSkqNCArIChpJjIpKjIqcy0+dXZsaW5lc2l6ZTsKKworICAgICAgICAgICAgcnYzNF9wcm9jZXNzX2Jsb2NrKHIsIHBkc3QsIHMtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+Y2hyb21hX3ZsYywgMSwgcV9kYywgcV9hYyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJ2MzRfb3V0cHV0X2ludHJhKFJWMzREZWNDb250ZXh0ICpyLCBpbnQ4X3QgKmludHJhX3R5cGVzLCBpbnQgY2JwKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzICAgPSAmci0+czsKKyAgICB1aW50OF90ICAgICAgICAqZHN0ID0gcy0+ZGVzdFswXTsKKyAgICBpbnQgICAgICBhdmFpbFs2KjhdID0gezB9OworICAgIGludCBpLCBqLCBrOworICAgIGludCBpZHgsIHFfYWMsIHFfZGM7CisKKyAgICAvLyBTZXQgbmVpZ2hib3VyIGluZm9ybWF0aW9uLgorICAgIGlmKHItPmF2YWlsX2NhY2hlWzFdKQorICAgICAgICBhdmFpbFswXSA9IDE7CisgICAgaWYoci0+YXZhaWxfY2FjaGVbMl0pCisgICAgICAgIGF2YWlsWzFdID0gYXZhaWxbMl0gPSAxOworICAgIGlmKHItPmF2YWlsX2NhY2hlWzNdKQorICAgICAgICBhdmFpbFszXSA9IGF2YWlsWzRdID0gMTsKKyAgICBpZihyLT5hdmFpbF9jYWNoZVs0XSkKKyAgICAgICAgYXZhaWxbNV0gPSAxOworICAgIGlmKHItPmF2YWlsX2NhY2hlWzVdKQorICAgICAgICBhdmFpbFs4XSA9IGF2YWlsWzE2XSA9IDE7CisgICAgaWYoci0+YXZhaWxfY2FjaGVbOV0pCisgICAgICAgIGF2YWlsWzI0XSA9IGF2YWlsWzMyXSA9IDE7CisKKyAgICBxX2FjID0gcnYzNF9xc2NhbGVfdGFiW3MtPnFzY2FsZV07CisgICAgZm9yKGogPSAwOyBqIDwgNDsgaisrKXsKKyAgICAgICAgaWR4ID0gOSArIGoqODsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrLCBjYnAgPj49IDEsIGRzdCArPSA0LCBpZHgrKyl7CisgICAgICAgICAgICBydjM0X3ByZWRfNHg0X2Jsb2NrKHIsIGRzdCwgcy0+bGluZXNpemUsIGl0dHJhbnNbaW50cmFfdHlwZXNbaV1dLCBhdmFpbFtpZHgtOF0sIGF2YWlsW2lkeC0xXSwgYXZhaWxbaWR4KzddLCBhdmFpbFtpZHgtN10pOworICAgICAgICAgICAgYXZhaWxbaWR4XSA9IDE7CisgICAgICAgICAgICBpZighKGNicCAmIDEpKSBjb250aW51ZTsKKworICAgICAgICAgICAgcnYzNF9wcm9jZXNzX2Jsb2NrKHIsIGRzdCwgcy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+bHVtYV92bGMsIDAsIHFfYWMsIHFfYWMpOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBzLT5saW5lc2l6ZSAqIDQgLSA0KjQ7CisgICAgICAgIGludHJhX3R5cGVzICs9IHItPmludHJhX3R5cGVzX3N0cmlkZTsKKyAgICB9CisKKyAgICBpbnRyYV90eXBlcyAtPSByLT5pbnRyYV90eXBlc19zdHJpZGUgKiA0OworCisgICAgcV9kYyA9IHJ2MzRfcXNjYWxlX3RhYltydjM0X2Nocm9tYV9xdWFudFsxXVtzLT5xc2NhbGVdXTsKKyAgICBxX2FjID0gcnYzNF9xc2NhbGVfdGFiW3J2MzRfY2hyb21hX3F1YW50WzBdW3MtPnFzY2FsZV1dOworCisgICAgZm9yKGsgPSAwOyBrIDwgMjsgaysrKXsKKyAgICAgICAgZHN0ID0gcy0+ZGVzdFsxK2tdOworICAgICAgICBmaWxsX3JlY3RhbmdsZShyLT5hdmFpbF9jYWNoZSArIDYsIDIsIDIsIDQsIDAsIDQpOworCisgICAgICAgIGZvcihqID0gMDsgaiA8IDI7IGorKyl7CisgICAgICAgICAgICBpbnQqIGFjYWNoZSA9IHItPmF2YWlsX2NhY2hlICsgNiArIGoqNDsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDI7IGkrKywgY2JwID4+PSAxLCBhY2FjaGUrKyl7CisgICAgICAgICAgICAgICAgaW50IGl0eXBlID0gaXR0cmFuc1tpbnRyYV90eXBlc1tpKjIraioyKnItPmludHJhX3R5cGVzX3N0cmlkZV1dOworICAgICAgICAgICAgICAgIHJ2MzRfcHJlZF80eDRfYmxvY2sociwgZHN0KzQqaSwgcy0+dXZsaW5lc2l6ZSwgaXR5cGUsIGFjYWNoZVstNF0sIGFjYWNoZVstMV0sICFpICYmICFqLCBhY2FjaGVbLTNdKTsKKyAgICAgICAgICAgICAgICBhY2FjaGVbMF0gPSAxOworCisgICAgICAgICAgICAgICAgaWYoIShjYnAmMSkpIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgcnYzNF9wcm9jZXNzX2Jsb2NrKHIsIGRzdCArIDQqaSwgcy0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+Y2hyb21hX3ZsYywgMSwgcV9kYywgcV9hYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdCArPSA0KnMtPnV2bGluZXNpemU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaXNfbXZfZGlmZl9ndF8zKGludDE2X3QgKCptb3Rpb25fdmFsKVsyXSwgaW50IHN0ZXApCit7CisgICAgaW50IGQ7CisgICAgZCA9IG1vdGlvbl92YWxbMF1bMF0gLSBtb3Rpb25fdmFsWy1zdGVwXVswXTsKKyAgICBpZihkIDwgLTMgfHwgZCA+IDMpCisgICAgICAgIHJldHVybiAxOworICAgIGQgPSBtb3Rpb25fdmFsWzBdWzFdIC0gbW90aW9uX3ZhbFstc3RlcF1bMV07CisgICAgaWYoZCA8IC0zIHx8IGQgPiAzKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydjM0X3NldF9kZWJsb2NrX2NvZWYoUlYzNERlY0NvbnRleHQgKnIpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmci0+czsKKyAgICBpbnQgaG12bWFzayA9IDAsIHZtdm1hc2sgPSAwLCBpLCBqOworICAgIGludCBtaWR4ID0gcy0+bWJfeCAqIDIgKyBzLT5tYl95ICogMiAqIHMtPmI4X3N0cmlkZTsKKyAgICBpbnQxNl90ICgqbW90aW9uX3ZhbClbMl0gPSAmcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bW90aW9uX3ZhbFswXVttaWR4XTsKKyAgICBmb3IoaiA9IDA7IGogPCAxNjsgaiArPSA4KXsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKXsKKyAgICAgICAgICAgIGlmKGlzX212X2RpZmZfZ3RfMyhtb3Rpb25fdmFsICsgaSwgMSkpCisgICAgICAgICAgICAgICAgdm12bWFzayB8PSAweDExIDw8IChqICsgaSoyKTsKKyAgICAgICAgICAgIGlmKChqIHx8IHMtPm1iX3kpICYmIGlzX212X2RpZmZfZ3RfMyhtb3Rpb25fdmFsICsgaSwgcy0+Yjhfc3RyaWRlKSkKKyAgICAgICAgICAgICAgICBobXZtYXNrIHw9IDB4MDMgPDwgKGogKyBpKjIpOworICAgICAgICB9CisgICAgICAgIG1vdGlvbl92YWwgKz0gcy0+Yjhfc3RyaWRlOworICAgIH0KKyAgICBpZihzLT5maXJzdF9zbGljZV9saW5lKQorICAgICAgICBobXZtYXNrICY9IH4weDAwMEY7CisgICAgaWYoIXMtPm1iX3gpCisgICAgICAgIHZtdm1hc2sgJj0gfjB4MTExMTsKKyAgICBpZihyLT5ydjMwKXsgLy9SVjMwIG1hcmtzIGJvdGggc3ViYmxvY2tzIG9uIHRoZSBlZGdlIGZvciBmaWx0ZXJpbmcKKyAgICAgICAgdm12bWFzayB8PSAodm12bWFzayAmIDB4NDQ0NCkgPj4gMTsKKyAgICAgICAgaG12bWFzayB8PSAoaG12bWFzayAmIDB4MEYwMCkgPj4gNDsKKyAgICAgICAgaWYocy0+bWJfeCkKKyAgICAgICAgICAgIHItPmRlYmxvY2tfY29lZnNbcy0+bWJfeCAtIDEgKyBzLT5tYl95KnMtPm1iX3N0cmlkZV0gfD0gKHZtdm1hc2sgJiAweDExMTEpIDw8IDM7CisgICAgICAgIGlmKCFzLT5maXJzdF9zbGljZV9saW5lKQorICAgICAgICAgICAgci0+ZGVibG9ja19jb2Vmc1tzLT5tYl94ICsgKHMtPm1iX3kgLSAxKSpzLT5tYl9zdHJpZGVdIHw9IChobXZtYXNrICYgMHhGKSA8PCAxMjsKKyAgICB9CisgICAgcmV0dXJuIGhtdm1hc2sgfCB2bXZtYXNrOworfQorCitzdGF0aWMgaW50IHJ2MzRfZGVjb2RlX2ludGVyX21hY3JvYmxvY2soUlYzNERlY0NvbnRleHQgKnIsIGludDhfdCAqaW50cmFfdHlwZXMpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgICA9ICZyLT5zOworICAgIEdldEJpdENvbnRleHQgICpnYiAgPSAmcy0+Z2I7CisgICAgdWludDhfdCAgICAgICAgKmRzdCA9IHMtPmRlc3RbMF07CisgICAgaW50MTZfdCAgICAgICAgKnB0ciA9IHMtPmJsb2NrWzBdOworICAgIGludCAgICAgICAgICBtYl9wb3MgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKKyAgICBpbnQgY2JwLCBjYnAyOworICAgIGludCBxX2RjLCBxX2FjLCBoYXNfYWM7CisgICAgaW50IGksIGo7CisgICAgaW50IGRpc3Q7CisKKyAgICAvLyBDYWxjdWxhdGUgd2hpY2ggbmVpZ2hib3VycyBhcmUgYXZhaWxhYmxlLiBNYXliZSBpdCdzIHdvcnRoIG9wdGltaXppbmcgdG9vLgorICAgIG1lbXNldChyLT5hdmFpbF9jYWNoZSwgMCwgc2l6ZW9mKHItPmF2YWlsX2NhY2hlKSk7CisgICAgZmlsbF9yZWN0YW5nbGUoci0+YXZhaWxfY2FjaGUgKyA2LCAyLCAyLCA0LCAxLCA0KTsKKyAgICBkaXN0ID0gKHMtPm1iX3ggLSBzLT5yZXN5bmNfbWJfeCkgKyAocy0+bWJfeSAtIHMtPnJlc3luY19tYl95KSAqIHMtPm1iX3dpZHRoOworICAgIGlmKHMtPm1iX3ggJiYgZGlzdCkKKyAgICAgICAgci0+YXZhaWxfY2FjaGVbNV0gPQorICAgICAgICByLT5hdmFpbF9jYWNoZVs5XSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1iX3R5cGVbbWJfcG9zIC0gMV07CisgICAgaWYoZGlzdCA+PSBzLT5tYl93aWR0aCkKKyAgICAgICAgci0+YXZhaWxfY2FjaGVbMl0gPQorICAgICAgICByLT5hdmFpbF9jYWNoZVszXSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1iX3R5cGVbbWJfcG9zIC0gcy0+bWJfc3RyaWRlXTsKKyAgICBpZigoKHMtPm1iX3grMSkgPCBzLT5tYl93aWR0aCkgJiYgZGlzdCA+PSBzLT5tYl93aWR0aCAtIDEpCisgICAgICAgIHItPmF2YWlsX2NhY2hlWzRdID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bWJfdHlwZVttYl9wb3MgLSBzLT5tYl9zdHJpZGUgKyAxXTsKKyAgICBpZihzLT5tYl94ICYmIGRpc3QgPiBzLT5tYl93aWR0aCkKKyAgICAgICAgci0+YXZhaWxfY2FjaGVbMV0gPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tYl90eXBlW21iX3BvcyAtIHMtPm1iX3N0cmlkZSAtIDFdOworCisgICAgcy0+cXNjYWxlID0gci0+c2kucXVhbnQ7CisgICAgY2JwID0gY2JwMiA9IHJ2MzRfZGVjb2RlX2ludGVyX21iX2hlYWRlcihyLCBpbnRyYV90eXBlcyk7CisgICAgci0+Y2JwX2x1bWEgIFttYl9wb3NdID0gY2JwOworICAgIHItPmNicF9jaHJvbWFbbWJfcG9zXSA9IGNicCA+PiAxNjsKKyAgICByLT5kZWJsb2NrX2NvZWZzW21iX3Bvc10gPSBydjM0X3NldF9kZWJsb2NrX2NvZWYocikgfCByLT5jYnBfbHVtYVttYl9wb3NdOworICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPnFzY2FsZV90YWJsZVttYl9wb3NdID0gcy0+cXNjYWxlOworCisgICAgaWYoY2JwID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoSVNfSU5UUkEocy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bWJfdHlwZVttYl9wb3NdKSl7CisgICAgICAgIGlmKHItPmlzMTYpIHJ2MzRfb3V0cHV0X2kxNngxNihyLCBpbnRyYV90eXBlcywgY2JwKTsKKyAgICAgICAgZWxzZSAgICAgICAgcnYzNF9vdXRwdXRfaW50cmEociwgaW50cmFfdHlwZXMsIGNicCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmKHItPmlzMTYpeworICAgICAgICAvLyBPbmx5IGZvciBSVjM0X01CX1BfTUlYMTZ4MTYKKyAgICAgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBibG9jazE2LCBbMTZdKTsKKyAgICAgICAgbWVtc2V0KGJsb2NrMTYsIDAsIDE2ICogc2l6ZW9mKCpibG9jazE2KSk7CisgICAgICAgIHFfZGMgPSBydjM0X3FzY2FsZV90YWJbIHItPmx1bWFfZGNfcXVhbnRfcFtzLT5xc2NhbGVdIF07CisgICAgICAgIHFfYWMgPSBydjM0X3FzY2FsZV90YWJbcy0+cXNjYWxlXTsKKyAgICAgICAgaWYgKHJ2MzRfZGVjb2RlX2Jsb2NrKGJsb2NrMTYsIGdiLCByLT5jdXJfdmxjcywgMywgMCwgcV9kYywgcV9kYywgcV9hYykpCisgICAgICAgICAgICByLT5yZHNwLnJ2MzRfaW52X3RyYW5zZm9ybShibG9jazE2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgci0+cmRzcC5ydjM0X2ludl90cmFuc2Zvcm1fZGMoYmxvY2sxNik7CisKKyAgICAgICAgcV9hYyA9IHJ2MzRfcXNjYWxlX3RhYltzLT5xc2NhbGVdOworCisgICAgICAgIGZvcihqID0gMDsgaiA8IDQ7IGorKyl7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyssIGNicCA+Pj0gMSl7CisgICAgICAgICAgICAgICAgaW50ICAgICAgZGMgICA9IGJsb2NrMTZbaSArIGoqNF07CisKKyAgICAgICAgICAgICAgICBpZihjYnAgJiAxKXsKKyAgICAgICAgICAgICAgICAgICAgaGFzX2FjID0gcnYzNF9kZWNvZGVfYmxvY2socHRyLCBnYiwgci0+Y3VyX3ZsY3MsIHItPmx1bWFfdmxjLCAwLCBxX2FjLCBxX2FjLCBxX2FjKTsKKyAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICBoYXNfYWMgPSAwOworCisgICAgICAgICAgICAgICAgaWYoaGFzX2FjKXsKKyAgICAgICAgICAgICAgICAgICAgcHRyWzBdID0gZGM7CisgICAgICAgICAgICAgICAgICAgIHItPnJkc3AucnYzNF9pZGN0X2FkZChkc3QrNCppLCBzLT5saW5lc2l6ZSwgcHRyKTsKKyAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICByLT5yZHNwLnJ2MzRfaWRjdF9kY19hZGQoZHN0KzQqaSwgcy0+bGluZXNpemUsIGRjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0ICs9IDQqcy0+bGluZXNpemU7CisgICAgICAgIH0KKworICAgICAgICByLT5jdXJfdmxjcyA9IGNob29zZV92bGNfc2V0KHItPnNpLnF1YW50LCByLT5zaS52bGNfc2V0LCAxKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcV9hYyA9IHJ2MzRfcXNjYWxlX3RhYltzLT5xc2NhbGVdOworCisgICAgICAgIGZvcihqID0gMDsgaiA8IDQ7IGorKyl7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyssIGNicCA+Pj0gMSl7CisgICAgICAgICAgICAgICAgaWYoIShjYnAgJiAxKSkgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBydjM0X3Byb2Nlc3NfYmxvY2sociwgZHN0ICsgNCppLCBzLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+bHVtYV92bGMsIDAsIHFfYWMsIHFfYWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICs9IDQqcy0+bGluZXNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBxX2RjID0gcnYzNF9xc2NhbGVfdGFiW3J2MzRfY2hyb21hX3F1YW50WzFdW3MtPnFzY2FsZV1dOworICAgIHFfYWMgPSBydjM0X3FzY2FsZV90YWJbcnYzNF9jaHJvbWFfcXVhbnRbMF1bcy0+cXNjYWxlXV07CisKKyAgICBmb3IoaiA9IDE7IGogPCAzOyBqKyspeworICAgICAgICBkc3QgPSBzLT5kZXN0W2pdOworICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyssIGNicCA+Pj0gMSl7CisgICAgICAgICAgICB1aW50OF90ICpwZHN0OworICAgICAgICAgICAgaWYoIShjYnAgJiAxKSkgY29udGludWU7CisgICAgICAgICAgICBwZHN0ID0gZHN0ICsgKGkmMSkqNCArIChpJjIpKjIqcy0+dXZsaW5lc2l6ZTsKKworICAgICAgICAgICAgcnYzNF9wcm9jZXNzX2Jsb2NrKHIsIHBkc3QsIHMtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+Y2hyb21hX3ZsYywgMSwgcV9kYywgcV9hYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydjM0X2RlY29kZV9pbnRyYV9tYWNyb2Jsb2NrKFJWMzREZWNDb250ZXh0ICpyLCBpbnQ4X3QgKmludHJhX3R5cGVzKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnItPnM7CisgICAgaW50IGNicCwgZGlzdDsKKyAgICBpbnQgbWJfcG9zID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisKKyAgICAvLyBDYWxjdWxhdGUgd2hpY2ggbmVpZ2hib3VycyBhcmUgYXZhaWxhYmxlLiBNYXliZSBpdCdzIHdvcnRoIG9wdGltaXppbmcgdG9vLgorICAgIG1lbXNldChyLT5hdmFpbF9jYWNoZSwgMCwgc2l6ZW9mKHItPmF2YWlsX2NhY2hlKSk7CisgICAgZmlsbF9yZWN0YW5nbGUoci0+YXZhaWxfY2FjaGUgKyA2LCAyLCAyLCA0LCAxLCA0KTsKKyAgICBkaXN0ID0gKHMtPm1iX3ggLSBzLT5yZXN5bmNfbWJfeCkgKyAocy0+bWJfeSAtIHMtPnJlc3luY19tYl95KSAqIHMtPm1iX3dpZHRoOworICAgIGlmKHMtPm1iX3ggJiYgZGlzdCkKKyAgICAgICAgci0+YXZhaWxfY2FjaGVbNV0gPQorICAgICAgICByLT5hdmFpbF9jYWNoZVs5XSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1iX3R5cGVbbWJfcG9zIC0gMV07CisgICAgaWYoZGlzdCA+PSBzLT5tYl93aWR0aCkKKyAgICAgICAgci0+YXZhaWxfY2FjaGVbMl0gPQorICAgICAgICByLT5hdmFpbF9jYWNoZVszXSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1iX3R5cGVbbWJfcG9zIC0gcy0+bWJfc3RyaWRlXTsKKyAgICBpZigoKHMtPm1iX3grMSkgPCBzLT5tYl93aWR0aCkgJiYgZGlzdCA+PSBzLT5tYl93aWR0aCAtIDEpCisgICAgICAgIHItPmF2YWlsX2NhY2hlWzRdID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bWJfdHlwZVttYl9wb3MgLSBzLT5tYl9zdHJpZGUgKyAxXTsKKyAgICBpZihzLT5tYl94ICYmIGRpc3QgPiBzLT5tYl93aWR0aCkKKyAgICAgICAgci0+YXZhaWxfY2FjaGVbMV0gPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tYl90eXBlW21iX3BvcyAtIHMtPm1iX3N0cmlkZSAtIDFdOworCisgICAgcy0+cXNjYWxlID0gci0+c2kucXVhbnQ7CisgICAgY2JwID0gcnYzNF9kZWNvZGVfaW50cmFfbWJfaGVhZGVyKHIsIGludHJhX3R5cGVzKTsKKyAgICByLT5jYnBfbHVtYSAgW21iX3Bvc10gPSBjYnA7CisgICAgci0+Y2JwX2Nocm9tYVttYl9wb3NdID0gY2JwID4+IDE2OworICAgIHItPmRlYmxvY2tfY29lZnNbbWJfcG9zXSA9IDB4RkZGRjsKKyAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5xc2NhbGVfdGFibGVbbWJfcG9zXSA9IHMtPnFzY2FsZTsKKworICAgIGlmKGNicCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYoci0+aXMxNil7CisgICAgICAgIHJ2MzRfb3V0cHV0X2kxNngxNihyLCBpbnRyYV90eXBlcywgY2JwKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcnYzNF9vdXRwdXRfaW50cmEociwgaW50cmFfdHlwZXMsIGNicCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfc2xpY2VfZW5kKFJWMzREZWNDb250ZXh0ICpyLCBNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgYml0czsKKyAgICBpZihzLT5tYl95ID49IHMtPm1iX2hlaWdodCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYoIXMtPm1iX251bV9sZWZ0KQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZihyLT5zLm1iX3NraXBfcnVuID4gMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYml0cyA9IGdldF9iaXRzX2xlZnQoJnMtPmdiKTsKKyAgICBpZihiaXRzIDw9IDAgfHwgKGJpdHMgPCA4ICYmICFzaG93X2JpdHMoJnMtPmdiLCBiaXRzKSkpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHJ2MzRfZGVjb2Rlcl9mcmVlKFJWMzREZWNDb250ZXh0ICpyKQoreworICAgIGF2X2ZyZWVwKCZyLT5pbnRyYV90eXBlc19oaXN0KTsKKyAgICByLT5pbnRyYV90eXBlcyA9IE5VTEw7CisgICAgYXZfZnJlZXAoJnItPnRtcF9iX2Jsb2NrX2Jhc2UpOworICAgIGF2X2ZyZWVwKCZyLT5tYl90eXBlKTsKKyAgICBhdl9mcmVlcCgmci0+Y2JwX2x1bWEpOworICAgIGF2X2ZyZWVwKCZyLT5jYnBfY2hyb21hKTsKKyAgICBhdl9mcmVlcCgmci0+ZGVibG9ja19jb2Vmcyk7Cit9CisKKworc3RhdGljIGludCBydjM0X2RlY29kZXJfYWxsb2MoUlYzNERlY0NvbnRleHQgKnIpCit7CisgICAgci0+aW50cmFfdHlwZXNfc3RyaWRlID0gci0+cy5tYl93aWR0aCAqIDQgKyA0OworCisgICAgci0+Y2JwX2Nocm9tYSAgICAgICA9IGF2X21hbGxvY3ooci0+cy5tYl9zdHJpZGUgKiByLT5zLm1iX2hlaWdodCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnItPmNicF9jaHJvbWEpKTsKKyAgICByLT5jYnBfbHVtYSAgICAgICAgID0gYXZfbWFsbG9jeihyLT5zLm1iX3N0cmlkZSAqIHItPnMubWJfaGVpZ2h0ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqci0+Y2JwX2x1bWEpKTsKKyAgICByLT5kZWJsb2NrX2NvZWZzICAgID0gYXZfbWFsbG9jeihyLT5zLm1iX3N0cmlkZSAqIHItPnMubWJfaGVpZ2h0ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqci0+ZGVibG9ja19jb2VmcykpOworICAgIHItPmludHJhX3R5cGVzX2hpc3QgPSBhdl9tYWxsb2Moci0+aW50cmFfdHlwZXNfc3RyaWRlICogNCAqIDIgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpyLT5pbnRyYV90eXBlc19oaXN0KSk7CisgICAgci0+bWJfdHlwZSAgICAgICAgICA9IGF2X21hbGxvY3ooci0+cy5tYl9zdHJpZGUgKiByLT5zLm1iX2hlaWdodCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpyLT5tYl90eXBlKSk7CisKKyAgICBpZiAoIShyLT5jYnBfY2hyb21hICAgICAgICYmIHItPmNicF9sdW1hICYmIHItPmRlYmxvY2tfY29lZnMgJiYKKyAgICAgICAgICByLT5pbnRyYV90eXBlc19oaXN0ICYmIHItPm1iX3R5cGUpKSB7CisgICAgICAgIHJ2MzRfZGVjb2Rlcl9mcmVlKHIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHItPmludHJhX3R5cGVzID0gci0+aW50cmFfdHlwZXNfaGlzdCArIHItPmludHJhX3R5cGVzX3N0cmlkZSAqIDQ7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJ2MzRfZGVjb2Rlcl9yZWFsbG9jKFJWMzREZWNDb250ZXh0ICpyKQoreworICAgIHJ2MzRfZGVjb2Rlcl9mcmVlKHIpOworICAgIHJldHVybiBydjM0X2RlY29kZXJfYWxsb2Mocik7Cit9CisKKworc3RhdGljIGludCBydjM0X2RlY29kZV9zbGljZShSVjM0RGVjQ29udGV4dCAqciwgaW50IGVuZCwgY29uc3QgdWludDhfdCogYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmci0+czsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICBpbnQgbWJfcG9zLCBzbGljZV90eXBlOworICAgIGludCByZXM7CisKKyAgICBpbml0X2dldF9iaXRzKCZyLT5zLmdiLCBidWYsIGJ1Zl9zaXplKjgpOworICAgIHJlcyA9IHItPnBhcnNlX3NsaWNlX2hlYWRlcihyLCBnYiwgJnItPnNpKTsKKyAgICBpZihyZXMgPCAwKXsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3Qgb3IgdW5rbm93biBzbGljZSBoZWFkZXJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc2xpY2VfdHlwZSA9IHItPnNpLnR5cGUgPyByLT5zaS50eXBlIDogQVZfUElDVFVSRV9UWVBFX0k7CisgICAgaWYgKHNsaWNlX3R5cGUgIT0gcy0+cGljdF90eXBlKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2xpY2UgdHlwZSBtaXNtYXRjaFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAocy0+d2lkdGggIT0gci0+c2kud2lkdGggfHwgcy0+aGVpZ2h0ICE9IHItPnNpLmhlaWdodCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlNpemUgbWlzbWF0Y2hcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByLT5zaS5lbmQgPSBlbmQ7CisgICAgcy0+cXNjYWxlID0gci0+c2kucXVhbnQ7CisgICAgcy0+bWJfbnVtX2xlZnQgPSByLT5zaS5lbmQgLSByLT5zaS5zdGFydDsKKyAgICByLT5zLm1iX3NraXBfcnVuID0gMDsKKworICAgIG1iX3BvcyA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfd2lkdGg7CisgICAgaWYoci0+c2kuc3RhcnQgIT0gbWJfcG9zKXsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJTbGljZSBpbmRpY2F0ZXMgTUIgb2Zmc2V0ICVkLCBnb3QgJWRcbiIsIHItPnNpLnN0YXJ0LCBtYl9wb3MpOworICAgICAgICBzLT5tYl94ID0gci0+c2kuc3RhcnQgJSBzLT5tYl93aWR0aDsKKyAgICAgICAgcy0+bWJfeSA9IHItPnNpLnN0YXJ0IC8gcy0+bWJfd2lkdGg7CisgICAgfQorICAgIG1lbXNldChyLT5pbnRyYV90eXBlc19oaXN0LCAtMSwgci0+aW50cmFfdHlwZXNfc3RyaWRlICogNCAqIDIgKiBzaXplb2YoKnItPmludHJhX3R5cGVzX2hpc3QpKTsKKyAgICBzLT5maXJzdF9zbGljZV9saW5lID0gMTsKKyAgICBzLT5yZXN5bmNfbWJfeCA9IHMtPm1iX3g7CisgICAgcy0+cmVzeW5jX21iX3kgPSBzLT5tYl95OworCisgICAgZmZfaW5pdF9ibG9ja19pbmRleChzKTsKKyAgICB3aGlsZSghY2hlY2tfc2xpY2VfZW5kKHIsIHMpKSB7CisgICAgICAgIGZmX3VwZGF0ZV9ibG9ja19pbmRleChzKTsKKworICAgICAgICBpZihyLT5zaS50eXBlKQorICAgICAgICAgICAgcmVzID0gcnYzNF9kZWNvZGVfaW50ZXJfbWFjcm9ibG9jayhyLCByLT5pbnRyYV90eXBlcyArIHMtPm1iX3ggKiA0ICsgNCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IHJ2MzRfZGVjb2RlX2ludHJhX21hY3JvYmxvY2sociwgci0+aW50cmFfdHlwZXMgKyBzLT5tYl94ICogNCArIDQpOworICAgICAgICBpZihyZXMgPCAwKXsKKyAgICAgICAgICAgIGZmX2VyX2FkZF9zbGljZSgmcy0+ZXIsIHMtPnJlc3luY19tYl94LCBzLT5yZXN5bmNfbWJfeSwgcy0+bWJfeC0xLCBzLT5tYl95LCBFUl9NQl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCsrcy0+bWJfeCA9PSBzLT5tYl93aWR0aCkgeworICAgICAgICAgICAgcy0+bWJfeCA9IDA7CisgICAgICAgICAgICBzLT5tYl95Kys7CisgICAgICAgICAgICBmZl9pbml0X2Jsb2NrX2luZGV4KHMpOworCisgICAgICAgICAgICBtZW1tb3ZlKHItPmludHJhX3R5cGVzX2hpc3QsIHItPmludHJhX3R5cGVzLCByLT5pbnRyYV90eXBlc19zdHJpZGUgKiA0ICogc2l6ZW9mKCpyLT5pbnRyYV90eXBlc19oaXN0KSk7CisgICAgICAgICAgICBtZW1zZXQoci0+aW50cmFfdHlwZXMsIC0xLCByLT5pbnRyYV90eXBlc19zdHJpZGUgKiA0ICogc2l6ZW9mKCpyLT5pbnRyYV90eXBlc19oaXN0KSk7CisKKyAgICAgICAgICAgIGlmKHItPmxvb3BfZmlsdGVyICYmIHMtPm1iX3kgPj0gMikKKyAgICAgICAgICAgICAgICByLT5sb29wX2ZpbHRlcihyLCBzLT5tYl95IC0gMik7CisKKyAgICAgICAgICAgIGlmIChIQVZFX1RIUkVBRFMgJiYgKHMtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpKQorICAgICAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPmN1cnJlbnRfcGljdHVyZV9wdHItPnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfeSAtIDIsIDApOworCisgICAgICAgIH0KKyAgICAgICAgaWYocy0+bWJfeCA9PSBzLT5yZXN5bmNfbWJfeCkKKyAgICAgICAgICAgIHMtPmZpcnN0X3NsaWNlX2xpbmU9MDsKKyAgICAgICAgcy0+bWJfbnVtX2xlZnQtLTsKKyAgICB9CisgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgcy0+cmVzeW5jX21iX3gsIHMtPnJlc3luY19tYl95LCBzLT5tYl94LTEsIHMtPm1iX3ksIEVSX01CX0VORCk7CisKKyAgICByZXR1cm4gcy0+bWJfeSA9PSBzLT5tYl9oZWlnaHQ7Cit9CisKKy8qKiBAfSAqLyAvLyByZWNvbnMgZ3JvdXAgZW5kCisKKy8qKgorICogSW5pdGlhbGl6ZSBkZWNvZGVyLgorICovCithdl9jb2xkIGludCBmZl9ydjM0X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBSVjM0RGVjQ29udGV4dCAqciA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmci0+czsKKyAgICBpbnQgcmV0OworCisgICAgZmZfbXB2X2RlY29kZV9kZWZhdWx0cyhzKTsKKyAgICBmZl9tcHZfZGVjb2RlX2luaXQocywgYXZjdHgpOworICAgIHMtPm91dF9mb3JtYXQgPSBGTVRfSDI2MzsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgIGF2Y3R4LT5oYXNfYl9mcmFtZXMgPSAxOworICAgIHMtPmxvd19kZWxheSA9IDA7CisKKyAgICBmZl9tcHZfaWRjdF9pbml0KHMpOworICAgIGlmICgocmV0ID0gZmZfbXB2X2NvbW1vbl9pbml0KHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZl9oMjY0X3ByZWRfaW5pdCgmci0+aCwgQVZfQ09ERUNfSURfUlY0MCwgOCwgMSk7CisKKyNpZiBDT05GSUdfUlYzMF9ERUNPREVSCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjMwKQorICAgICAgICBmZl9ydjMwZHNwX2luaXQoJnItPnJkc3ApOworI2VuZGlmCisjaWYgQ09ORklHX1JWNDBfREVDT0RFUgorICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlY0MCkKKyAgICAgICAgZmZfcnY0MGRzcF9pbml0KCZyLT5yZHNwKTsKKyNlbmRpZgorCisgICAgaWYgKChyZXQgPSBydjM0X2RlY29kZXJfYWxsb2MocikpIDwgMCkgeworICAgICAgICBmZl9tcHZfY29tbW9uX2VuZCgmci0+cyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYoIWludHJhX3ZsY3NbMF0uY2JwcGF0dGVyblswXS5iaXRzKQorICAgICAgICBydjM0X2luaXRfdGFibGVzKCk7CisKKyAgICBhdmN0eC0+aW50ZXJuYWwtPmFsbG9jYXRlX3Byb2dyZXNzID0gMTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfcnYzNF9kZWNvZGVfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGVycjsKKyAgICBSVjM0RGVjQ29udGV4dCAqciA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICByLT5zLmF2Y3R4ID0gYXZjdHg7CisKKyAgICBpZiAoYXZjdHgtPmludGVybmFsLT5pc19jb3B5KSB7CisgICAgICAgIHItPnRtcF9iX2Jsb2NrX2Jhc2UgPSBOVUxMOworICAgICAgICBmZl9tcHZfaWRjdF9pbml0KCZyLT5zKTsKKyAgICAgICAgaWYgKChlcnIgPSBmZl9tcHZfY29tbW9uX2luaXQoJnItPnMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBpZiAoKGVyciA9IHJ2MzRfZGVjb2Rlcl9hbGxvYyhyKSkgPCAwKSB7CisgICAgICAgICAgICBmZl9tcHZfY29tbW9uX2VuZCgmci0+cyk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9ydjM0X2RlY29kZV91cGRhdGVfdGhyZWFkX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmRzdCwgY29uc3QgQVZDb2RlY0NvbnRleHQgKnNyYykKK3sKKyAgICBSVjM0RGVjQ29udGV4dCAqciA9IGRzdC0+cHJpdl9kYXRhLCAqcjEgPSBzcmMtPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHMgPSAmci0+cywgKiBjb25zdCBzMSA9ICZyMS0+czsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKGRzdCA9PSBzcmMgfHwgIXMxLT5jb250ZXh0X2luaXRpYWxpemVkKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzLT5oZWlnaHQgIT0gczEtPmhlaWdodCB8fCBzLT53aWR0aCAhPSBzMS0+d2lkdGgpIHsKKyAgICAgICAgcy0+aGVpZ2h0ID0gczEtPmhlaWdodDsKKyAgICAgICAgcy0+d2lkdGggID0gczEtPndpZHRoOworICAgICAgICBpZiAoKGVyciA9IGZmX21wdl9jb21tb25fZnJhbWVfc2l6ZV9jaGFuZ2UocykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGlmICgoZXJyID0gcnYzNF9kZWNvZGVyX3JlYWxsb2MocikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgci0+Y3VyX3B0cyAgPSByMS0+Y3VyX3B0czsKKyAgICByLT5sYXN0X3B0cyA9IHIxLT5sYXN0X3B0czsKKyAgICByLT5uZXh0X3B0cyA9IHIxLT5uZXh0X3B0czsKKworICAgIG1lbXNldCgmci0+c2ksIDAsIHNpemVvZihyLT5zaSkpOworCisgICAgLy8gRG8gbm8gY2FsbCBmZl9tcGVnX3VwZGF0ZV90aHJlYWRfY29udGV4dCBvbiBhIHBhcnRpYWxseSBpbml0aWFsaXplZAorICAgIC8vIGRlY29kZXIgY29udGV4dC4KKyAgICBpZiAoIXMxLT5saW5lc2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZmZfbXBlZ191cGRhdGVfdGhyZWFkX2NvbnRleHQoZHN0LCBzcmMpOworfQorCitzdGF0aWMgaW50IGdldF9zbGljZV9vZmZzZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsIGludCBuKQoreworICAgIGlmKGF2Y3R4LT5zbGljZV9jb3VudCkgcmV0dXJuIGF2Y3R4LT5zbGljZV9vZmZzZXRbbl07CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZfUkwzMihidWYgKyBuKjggLSA0KSA9PSAxID8gQVZfUkwzMihidWYgKyBuKjgpIDogIEFWX1JCMzIoYnVmICsgbio4KTsKK30KKworc3RhdGljIGludCBmaW5pc2hfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwaWN0KQoreworICAgIFJWMzREZWNDb250ZXh0ICpyID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZyLT5zOworICAgIGludCBnb3RfcGljdHVyZSA9IDAsIHJldDsKKworICAgIGZmX2VyX2ZyYW1lX2VuZCgmcy0+ZXIpOworICAgIGZmX21wdl9mcmFtZV9lbmQocyk7CisgICAgcy0+bWJfbnVtX2xlZnQgPSAwOworCisgICAgaWYgKEhBVkVfVEhSRUFEUyAmJiAocy0+YXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkpCisgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPmN1cnJlbnRfcGljdHVyZV9wdHItPnRmLCBJTlRfTUFYLCAwKTsKKworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgfHwgcy0+bG93X2RlbGF5KSB7CisgICAgICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKHBpY3QsIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBmZl9wcmludF9kZWJ1Z19pbmZvKHMsIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIsIHBpY3QpOworICAgICAgICBmZl9tcHZfZXhwb3J0X3FwX3RhYmxlKHMsIHBpY3QsIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIsIEZGX1FTQ0FMRV9UWVBFX01QRUcxKTsKKyAgICAgICAgZ290X3BpY3R1cmUgPSAxOworICAgIH0gZWxzZSBpZiAocy0+bGFzdF9waWN0dXJlX3B0cikgeworICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihwaWN0LCBzLT5sYXN0X3BpY3R1cmVfcHRyLT5mKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZmZfcHJpbnRfZGVidWdfaW5mbyhzLCBzLT5sYXN0X3BpY3R1cmVfcHRyLCBwaWN0KTsKKyAgICAgICAgZmZfbXB2X2V4cG9ydF9xcF90YWJsZShzLCBwaWN0LCBzLT5sYXN0X3BpY3R1cmVfcHRyLCBGRl9RU0NBTEVfVFlQRV9NUEVHMSk7CisgICAgICAgIGdvdF9waWN0dXJlID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gZ290X3BpY3R1cmU7Cit9CisKK3N0YXRpYyBBVlJhdGlvbmFsIHVwZGF0ZV9zYXIoaW50IG9sZF93LCBpbnQgb2xkX2gsIEFWUmF0aW9uYWwgc2FyLCBpbnQgbmV3X3csIGludCBuZXdfaCkKK3sKKyAgICAvLyBhdHRlbXB0IHRvIGtlZXAgYXNwZWN0IGR1cmluZyB0eXBpY2FsIHJlc29sdXRpb24gc3dpdGNoZXMKKyAgICBpZiAoIXNhci5udW0pCisgICAgICAgIHNhciA9IChBVlJhdGlvbmFsKXsxLCAxfTsKKworICAgIHNhciA9IGF2X211bF9xKHNhciwgKEFWUmF0aW9uYWwpe25ld19oICogb2xkX3csIG5ld193ICogb2xkX2h9KTsKKyAgICByZXR1cm4gc2FyOworfQorCitpbnQgZmZfcnYzNF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X3BpY3R1cmVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBSVjM0RGVjQ29udGV4dCAqciA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmci0+czsKKyAgICBBVkZyYW1lICpwaWN0ID0gZGF0YTsKKyAgICBTbGljZUluZm8gc2k7CisgICAgaW50IGksIHJldDsKKyAgICBpbnQgc2xpY2VfY291bnQ7CisgICAgY29uc3QgdWludDhfdCAqc2xpY2VzX2hkciA9IE5VTEw7CisgICAgaW50IGxhc3QgPSAwOworCisgICAgLyogbm8gc3VwcGxlbWVudGFyeSBwaWN0dXJlICovCisgICAgaWYgKGJ1Zl9zaXplID09IDApIHsKKyAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciBsYXN0IHBpY3R1cmUgKi8KKyAgICAgICAgaWYgKHMtPmxvd19kZWxheT09MCAmJiBzLT5uZXh0X3BpY3R1cmVfcHRyKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihwaWN0LCBzLT5uZXh0X3BpY3R1cmVfcHRyLT5mKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBzLT5uZXh0X3BpY3R1cmVfcHRyID0gTlVMTDsKKworICAgICAgICAgICAgKmdvdF9waWN0dXJlX3B0ciA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYoIWF2Y3R4LT5zbGljZV9jb3VudCl7CisgICAgICAgIHNsaWNlX2NvdW50ID0gKCpidWYrKykgKyAxOworICAgICAgICBzbGljZXNfaGRyID0gYnVmICsgNDsKKyAgICAgICAgYnVmICs9IDggKiBzbGljZV9jb3VudDsKKyAgICAgICAgYnVmX3NpemUgLT0gMSArIDggKiBzbGljZV9jb3VudDsKKyAgICB9ZWxzZQorICAgICAgICBzbGljZV9jb3VudCA9IGF2Y3R4LT5zbGljZV9jb3VudDsKKworICAgIC8vcGFyc2UgZmlyc3Qgc2xpY2UgaGVhZGVyIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBmcmFtZSBjYW4gYmUgZGVjb2RlZAorICAgIGlmKGdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIDApIDwgMCB8fAorICAgICAgIGdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIDApID4gYnVmX3NpemUpeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNsaWNlIG9mZnNldCBpcyBpbnZhbGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBidWYrZ2V0X3NsaWNlX29mZnNldChhdmN0eCwgc2xpY2VzX2hkciwgMCksIChidWZfc2l6ZS1nZXRfc2xpY2Vfb2Zmc2V0KGF2Y3R4LCBzbGljZXNfaGRyLCAwKSkqOCk7CisgICAgaWYoci0+cGFyc2Vfc2xpY2VfaGVhZGVyKHIsICZyLT5zLmdiLCAmc2kpIDwgMCB8fCBzaS5zdGFydCl7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmlyc3Qgc2xpY2UgaGVhZGVyIGlzIGluY29ycmVjdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoKCFzLT5sYXN0X3BpY3R1cmVfcHRyIHx8ICFzLT5sYXN0X3BpY3R1cmVfcHRyLT5mLT5kYXRhWzBdKSAmJgorICAgICAgICBzaS50eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBkZWNvZGVyIHN0YXRlOiBCLWZyYW1lIHdpdGhvdXQgIgorICAgICAgICAgICAgICAgInJlZmVyZW5jZSBkYXRhLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiggICAoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiAmJiBzaS50eXBlPT1BVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICB8fCAoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTktFWSAmJiBzaS50eXBlIT1BVl9QSUNUVVJFX1RZUEVfSSkKKyAgICAgICB8fCAgYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX0FMTCkKKyAgICAgICAgcmV0dXJuIGF2cGt0LT5zaXplOworCisgICAgLyogZmlyc3Qgc2xpY2UgKi8KKyAgICBpZiAoc2kuc3RhcnQgPT0gMCkgeworICAgICAgICBpZiAocy0+bWJfbnVtX2xlZnQgPiAwICYmIHMtPmN1cnJlbnRfcGljdHVyZV9wdHIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTmV3IGZyYW1lIGJ1dCBzdGlsbCAlZCBNQiBsZWZ0LlxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5tYl9udW1fbGVmdCk7CisgICAgICAgICAgICBmZl9lcl9mcmFtZV9lbmQoJnMtPmVyKTsKKyAgICAgICAgICAgIGZmX21wdl9mcmFtZV9lbmQocyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+d2lkdGggIT0gc2kud2lkdGggfHwgcy0+aGVpZ2h0ICE9IHNpLmhlaWdodCkgeworICAgICAgICAgICAgaW50IGVycjsKKworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNoYW5naW5nIGRpbWVuc2lvbnMgdG8gJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgc2kud2lkdGgsIHNpLmhlaWdodCk7CisKKyAgICAgICAgICAgIGlmIChhdl9pbWFnZV9jaGVja19zaXplKHNpLndpZHRoLCBzaS5oZWlnaHQsIDAsIHMtPmF2Y3R4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSB1cGRhdGVfc2FyKAorICAgICAgICAgICAgICAgIHMtPndpZHRoLCBzLT5oZWlnaHQsIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLAorICAgICAgICAgICAgICAgIHNpLndpZHRoLCBzaS5oZWlnaHQpOworICAgICAgICAgICAgcy0+d2lkdGggID0gc2kud2lkdGg7CisgICAgICAgICAgICBzLT5oZWlnaHQgPSBzaS5oZWlnaHQ7CisKKyAgICAgICAgICAgIGVyciA9IGZmX3NldF9kaW1lbnNpb25zKHMtPmF2Y3R4LCBzLT53aWR0aCwgcy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgICAgIGlmICgoZXJyID0gZmZfbXB2X2NvbW1vbl9mcmFtZV9zaXplX2NoYW5nZShzKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IHJ2MzRfZGVjb2Rlcl9yZWFsbG9jKHIpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBzLT5waWN0X3R5cGUgPSBzaS50eXBlID8gc2kudHlwZSA6IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBpZiAoZmZfbXB2X2ZyYW1lX3N0YXJ0KHMsIHMtPmF2Y3R4KSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGZmX21wZWdfZXJfZnJhbWVfc3RhcnQocyk7CisgICAgICAgIGlmICghci0+dG1wX2JfYmxvY2tfYmFzZSkgeworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIHItPnRtcF9iX2Jsb2NrX2Jhc2UgPSBhdl9tYWxsb2Mocy0+bGluZXNpemUgKiA0OCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgICAgIHItPnRtcF9iX2Jsb2NrX3lbaV0gPSByLT50bXBfYl9ibG9ja19iYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaSAqIDE2ICogcy0+bGluZXNpemU7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIHItPnRtcF9iX2Jsb2NrX3V2W2ldID0gci0+dG1wX2JfYmxvY2tfYmFzZSArIDMyICogcy0+bGluZXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGkgPj4gMSkgKiA4ICogcy0+dXZsaW5lc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoaSAmICAxKSAqIDE2OworICAgICAgICB9CisgICAgICAgIHItPmN1cl9wdHMgPSBzaS5wdHM7CisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgIHItPmxhc3RfcHRzID0gci0+bmV4dF9wdHM7CisgICAgICAgICAgICByLT5uZXh0X3B0cyA9IHItPmN1cl9wdHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcmVmZGlzdCA9IEdFVF9QVFNfRElGRihyLT5uZXh0X3B0cywgci0+bGFzdF9wdHMpOworICAgICAgICAgICAgaW50IGRpc3QwICAgPSBHRVRfUFRTX0RJRkYoci0+Y3VyX3B0cywgIHItPmxhc3RfcHRzKTsKKyAgICAgICAgICAgIGludCBkaXN0MSAgID0gR0VUX1BUU19ESUZGKHItPm5leHRfcHRzLCByLT5jdXJfcHRzKTsKKworICAgICAgICAgICAgaWYoIXJlZmRpc3QpeworICAgICAgICAgICAgICAgIHItPm12X3dlaWdodDEgPSByLT5tdl93ZWlnaHQyID0gci0+d2VpZ2h0MSA9IHItPndlaWdodDIgPSA4MTkyOworICAgICAgICAgICAgICAgIHItPnNjYWxlZF93ZWlnaHQgPSAwOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgci0+bXZfd2VpZ2h0MSA9IChkaXN0MCA8PCAxNCkgLyByZWZkaXN0OworICAgICAgICAgICAgICAgIHItPm12X3dlaWdodDIgPSAoZGlzdDEgPDwgMTQpIC8gcmVmZGlzdDsKKyAgICAgICAgICAgICAgICBpZigoci0+bXZfd2VpZ2h0MXxyLT5tdl93ZWlnaHQyKSAmIDUxMSl7CisgICAgICAgICAgICAgICAgICAgIHItPndlaWdodDEgPSByLT5tdl93ZWlnaHQxOworICAgICAgICAgICAgICAgICAgICByLT53ZWlnaHQyID0gci0+bXZfd2VpZ2h0MjsKKyAgICAgICAgICAgICAgICAgICAgci0+c2NhbGVkX3dlaWdodCA9IDA7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIHItPndlaWdodDEgPSByLT5tdl93ZWlnaHQxID4+IDk7CisgICAgICAgICAgICAgICAgICAgIHItPndlaWdodDIgPSByLT5tdl93ZWlnaHQyID4+IDk7CisgICAgICAgICAgICAgICAgICAgIHItPnNjYWxlZF93ZWlnaHQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzLT5tYl94ID0gcy0+bWJfeSA9IDA7CisgICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAocy0+YXZjdHgpOworICAgIH0gZWxzZSBpZiAoSEFWRV9USFJFQURTICYmCisgICAgICAgICAgICAgICAocy0+YXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJEZWNvZGVyIG5lZWRzIGZ1bGwgZnJhbWVzIGluIGZyYW1lICIKKyAgICAgICAgICAgICAgICJtdWx0aXRocmVhZGluZyBtb2RlIChzdGFydCBNQiBpcyAlZCkuXG4iLCBzaS5zdGFydCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IHNsaWNlX2NvdW50OyBpKyspeworICAgICAgICBpbnQgb2Zmc2V0ID0gZ2V0X3NsaWNlX29mZnNldChhdmN0eCwgc2xpY2VzX2hkciwgaSk7CisgICAgICAgIGludCBzaXplOworICAgICAgICBpZihpKzEgPT0gc2xpY2VfY291bnQpCisgICAgICAgICAgICBzaXplID0gYnVmX3NpemUgLSBvZmZzZXQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNpemUgPSBnZXRfc2xpY2Vfb2Zmc2V0KGF2Y3R4LCBzbGljZXNfaGRyLCBpKzEpIC0gb2Zmc2V0OworCisgICAgICAgIGlmKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmX3NpemUpeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTbGljZSBvZmZzZXQgaXMgaW52YWxpZFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHItPnNpLmVuZCA9IHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0OworICAgICAgICBzLT5tYl9udW1fbGVmdCA9IHItPnMubWJfeCArIHItPnMubWJfeSpyLT5zLm1iX3dpZHRoIC0gci0+c2kuc3RhcnQ7CisKKyAgICAgICAgaWYoaSsxIDwgc2xpY2VfY291bnQpeworICAgICAgICAgICAgaWYgKGdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIGkrMSkgPCAwIHx8CisgICAgICAgICAgICAgICAgZ2V0X3NsaWNlX29mZnNldChhdmN0eCwgc2xpY2VzX2hkciwgaSsxKSA+IGJ1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTbGljZSBvZmZzZXQgaXMgaW52YWxpZFxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgYnVmK2dldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIGkrMSksIChidWZfc2l6ZS1nZXRfc2xpY2Vfb2Zmc2V0KGF2Y3R4LCBzbGljZXNfaGRyLCBpKzEpKSo4KTsKKyAgICAgICAgICAgIGlmKHItPnBhcnNlX3NsaWNlX2hlYWRlcihyLCAmci0+cy5nYiwgJnNpKSA8IDApeworICAgICAgICAgICAgICAgIGlmKGkrMiA8IHNsaWNlX2NvdW50KQorICAgICAgICAgICAgICAgICAgICBzaXplID0gZ2V0X3NsaWNlX29mZnNldChhdmN0eCwgc2xpY2VzX2hkciwgaSsyKSAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBidWZfc2l6ZSAtIG9mZnNldDsKKyAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgci0+c2kuZW5kID0gc2kuc3RhcnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPiBidWZfc2l6ZSAtIG9mZnNldCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTbGljZSBzaXplIGlzIGludmFsaWRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbGFzdCA9IHJ2MzRfZGVjb2RlX3NsaWNlKHIsIHItPnNpLmVuZCwgYnVmICsgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgaWYobGFzdCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChzLT5jdXJyZW50X3BpY3R1cmVfcHRyKSB7CisgICAgICAgIGlmIChsYXN0KSB7CisgICAgICAgICAgICBpZihyLT5sb29wX2ZpbHRlcikKKyAgICAgICAgICAgICAgICByLT5sb29wX2ZpbHRlcihyLCBzLT5tYl9oZWlnaHQgLSAxKTsKKworICAgICAgICAgICAgcmV0ID0gZmluaXNoX2ZyYW1lKGF2Y3R4LCBwaWN0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAqZ290X3BpY3R1cmVfcHRyID0gcmV0OworICAgICAgICB9IGVsc2UgaWYgKEhBVkVfVEhSRUFEUyAmJgorICAgICAgICAgICAgICAgICAgIChzLT5hdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIm1hcmtpbmcgdW5maXNoZWQgZnJhbWUgYXMgZmluaXNoZWRcbiIpOworICAgICAgICAgICAgLyogYWx3YXlzIG1hcmsgdGhlIGN1cnJlbnQgZnJhbWUgYXMgZmluaXNoZWQsIGZyYW1lLW10IHN1cHBvcnRzCisgICAgICAgICAgICAgKiBvbmx5IGNvbXBsZXRlIGZyYW1lcyAqLworICAgICAgICAgICAgZmZfZXJfZnJhbWVfZW5kKCZzLT5lcik7CisgICAgICAgICAgICBmZl9tcHZfZnJhbWVfZW5kKHMpOworICAgICAgICAgICAgcy0+bWJfbnVtX2xlZnQgPSAwOworICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+dGYsIElOVF9NQVgsIDApOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK2F2X2NvbGQgaW50IGZmX3J2MzRfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUlYzNERlY0NvbnRleHQgKnIgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmZfbXB2X2NvbW1vbl9lbmQoJnItPnMpOworICAgIHJ2MzRfZGVjb2Rlcl9mcmVlKHIpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ydjM0LmggYi9mZm1wZWcvbGliYXZjb2RlYy9ydjM0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwMTY0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3J2MzQuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIFJWMzAvNDAgZGVjb2RlciBjb21tb24gZGF0YSBkZWNsYXJhdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwNyBNaWtlIE1lbGFuc29uLCBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJWMzAgYW5kIFJWNDAgZGVjb2RlciBjb21tb24gZGF0YSBkZWNsYXJhdGlvbnMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUlYzNF9ICisjZGVmaW5lIEFWQ09ERUNfUlYzNF9ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisKKyNpbmNsdWRlICJoMjY0cHJlZC5oIgorI2luY2x1ZGUgInJ2MzRkc3AuaCIKKworI2RlZmluZSBNQl9UWVBFX1NFUEFSQVRFX0RDIDB4MDEwMDAwMDAKKyNkZWZpbmUgSVNfU0VQQVJBVEVfREMoYSkgICAoKGEpICYgTUJfVFlQRV9TRVBBUkFURV9EQykKKworLyoqCisgKiBSVjMwIGFuZCBSVjQwIE1hY3JvYmxvY2sgdHlwZXMKKyAqLworZW51bSBSVjQwQmxvY2tUeXBlc3sKKyAgICBSVjM0X01CX1RZUEVfSU5UUkEsICAgICAgLy8vPCBJbnRyYSBtYWNyb2Jsb2NrCisgICAgUlYzNF9NQl9UWVBFX0lOVFJBMTZ4MTYsIC8vLzwgSW50cmEgbWFjcm9ibG9jayB3aXRoIERDcyBpbiBhIHNlcGFyYXRlIDR4NCBibG9jaworICAgIFJWMzRfTUJfUF8xNngxNiwgICAgICAgICAvLy88IFAtZnJhbWUgbWFjcm9ibG9jaywgb25lIG1vdGlvbiBmcmFtZQorICAgIFJWMzRfTUJfUF84eDgsICAgICAgICAgICAvLy88IFAtZnJhbWUgbWFjcm9ibG9jaywgOHg4IG1vdGlvbiBjb21wZW5zYXRpb24gcGFydGl0aW9ucworICAgIFJWMzRfTUJfQl9GT1JXQVJELCAgICAgICAvLy88IEItZnJhbWUgbWFjcm9ibG9jaywgZm9yd2FyZCBwcmVkaWN0aW9uCisgICAgUlYzNF9NQl9CX0JBQ0tXQVJELCAgICAgIC8vLzwgQi1mcmFtZSBtYWNyb2Jsb2NrLCBiYWNrd2FyZCBwcmVkaWN0aW9uCisgICAgUlYzNF9NQl9TS0lQLCAgICAgICAgICAgIC8vLzwgU2tpcHBlZCBibG9jaworICAgIFJWMzRfTUJfQl9ESVJFQ1QsICAgICAgICAvLy88IEJpZGlyZWN0aW9uYWxseSBwcmVkaWN0ZWQgQi1mcmFtZSBtYWNyb2Jsb2NrLCBubyBtb3Rpb24gdmVjdG9ycworICAgIFJWMzRfTUJfUF8xNng4LCAgICAgICAgICAvLy88IFAtZnJhbWUgbWFjcm9ibG9jaywgMTZ4OCBtb3Rpb24gY29tcGVuc2F0aW9uIHBhcnRpdGlvbnMKKyAgICBSVjM0X01CX1BfOHgxNiwgICAgICAgICAgLy8vPCBQLWZyYW1lIG1hY3JvYmxvY2ssIDh4MTYgbW90aW9uIGNvbXBlbnNhdGlvbiBwYXJ0aXRpb25zCisgICAgUlYzNF9NQl9CX0JJRElSLCAgICAgICAgIC8vLzwgQmlkaXJlY3Rpb25hbGx5IHByZWRpY3RlZCBCLWZyYW1lIG1hY3JvYmxvY2ssIHR3byBtb3Rpb24gdmVjdG9ycworICAgIFJWMzRfTUJfUF9NSVgxNngxNiwgICAgICAvLy88IFAtZnJhbWUgbWFjcm9ibG9jayB3aXRoIERDcyBpbiBhIHNlcGFyYXRlIDR4NCBibG9jaywgb25lIG1vdGlvbiB2ZWN0b3IKKyAgICBSVjM0X01CX1RZUEVTCit9OworCisvKioKKyAqIFZMQyB0YWJsZXMgdXNlZCBieSB0aGUgZGVjb2RlcgorICoKKyAqIEludHJhIGZyYW1lIFZMQyBzZXRzIGRvIG5vdCBjb250YWluIHNvbWUgb2YgdGhvc2UgdGFibGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBSVjM0VkxDeworICAgIFZMQyBjYnBwYXR0ZXJuWzJdOyAgICAgLy8vPCBWTENzIHVzZWQgZm9yIHBhdHRlcm4gb2YgY29kZWQgYmxvY2sgcGF0dGVybnMgZGVjb2RpbmcKKyAgICBWTEMgY2JwWzJdWzRdOyAgICAgICAgIC8vLzwgVkxDcyB1c2VkIGZvciBjb2RlZCBibG9jayBwYXR0ZXJucyBkZWNvZGluZworICAgIFZMQyBmaXJzdF9wYXR0ZXJuWzRdOyAgLy8vPCBWTENzIHVzZWQgZm9yIGRlY29kaW5nIGNvZWZmaWNpZW50cyBpbiB0aGUgZmlyc3Qgc3ViYmxvY2sKKyAgICBWTEMgc2Vjb25kX3BhdHRlcm5bMl07IC8vLzwgVkxDcyB1c2VkIGZvciBkZWNvZGluZyBjb2VmZmljaWVudHMgaW4gdGhlIHN1YmJsb2NrcyAyIGFuZCAzCisgICAgVkxDIHRoaXJkX3BhdHRlcm5bMl07ICAvLy88IFZMQ3MgdXNlZCBmb3IgZGVjb2RpbmcgY29lZmZpY2llbnRzIGluIHRoZSBsYXN0IHN1YmJsb2NrCisgICAgVkxDIGNvZWZmaWNpZW50OyAgICAgICAvLy88IFZMQ3MgdXNlZCBmb3IgZGVjb2RpbmcgYmlnIGNvZWZmaWNpZW50cworfVJWMzRWTEM7CisKKy8qKiBlc3NlbnRpYWwgc2xpY2UgaW5mb3JtYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IFNsaWNlSW5mb3sKKyAgICBpbnQgdHlwZTsgICAgICAgICAgICAgIC8vLzwgc2xpY2UgdHlwZSAoaW50cmEsIGludGVyKQorICAgIGludCBxdWFudDsgICAgICAgICAgICAgLy8vPCBxdWFudGl6ZXIgdXNlZCBmb3IgdGhpcyBzbGljZQorICAgIGludCB2bGNfc2V0OyAgICAgICAgICAgLy8vPCBWTENzIHVzZWQgZm9yIHRoaXMgc2xpY2UKKyAgICBpbnQgc3RhcnQsIGVuZDsgICAgICAgIC8vLzwgc3RhcnQgYW5kIGVuZCBtYWNyb2Jsb2NrcyBvZiB0aGUgc2xpY2UKKyAgICBpbnQgd2lkdGg7ICAgICAgICAgICAgIC8vLzwgY29kZWQgd2lkdGgKKyAgICBpbnQgaGVpZ2h0OyAgICAgICAgICAgIC8vLzwgY29kZWQgaGVpZ2h0CisgICAgaW50IHB0czsgICAgICAgICAgICAgICAvLy88IGZyYW1lIHRpbWVzdGFtcAorfVNsaWNlSW5mbzsKKworLyoqIGRlY29kZXIgY29udGV4dCAqLwordHlwZWRlZiBzdHJ1Y3QgUlYzNERlY0NvbnRleHR7CisgICAgTXBlZ0VuY0NvbnRleHQgczsKKyAgICBSVjM0RFNQQ29udGV4dCByZHNwOworICAgIGludDhfdCAqaW50cmFfdHlwZXNfaGlzdDsvLy88IG9sZCBibG9jayB0eXBlcywgdXNlZCBmb3IgcHJlZGljdGlvbgorICAgIGludDhfdCAqaW50cmFfdHlwZXM7ICAgICAvLy88IGJsb2NrIHR5cGVzCisgICAgaW50ICAgIGludHJhX3R5cGVzX3N0cmlkZTsvLy88IGJsb2NrIHR5cGVzIGFycmF5IHN0cmlkZQorICAgIGNvbnN0IHVpbnQ4X3QgKmx1bWFfZGNfcXVhbnRfaTsvLy88IGx1bWEgc3ViYmxvY2sgREMgcXVhbnRpemVyIGZvciBpbnRyYWZyYW1lcworICAgIGNvbnN0IHVpbnQ4X3QgKmx1bWFfZGNfcXVhbnRfcDsvLy88IGx1bWEgc3ViYmxvY2sgREMgcXVhbnRpemVyIGZvciBpbnRlcmZyYW1lcworCisgICAgUlYzNFZMQyAqY3VyX3ZsY3M7ICAgICAgIC8vLzwgVkxDIHNldCB1c2VkIGZvciBjdXJyZW50IGZyYW1lIGRlY29kaW5nCisgICAgSDI2NFByZWRDb250ZXh0IGg7ICAgICAgIC8vLzwgZnVuY3Rpb25zIGZvciA0eDQgYW5kIDE2eDE2IGludHJhIGJsb2NrIHByZWRpY3Rpb24KKyAgICBTbGljZUluZm8gc2k7ICAgICAgICAgICAgLy8vPCBjdXJyZW50IHNsaWNlIGluZm9ybWF0aW9uCisKKyAgICBpbnQgKm1iX3R5cGU7ICAgICAgICAgICAgLy8vPCBpbnRlcm5hbCBtYWNyb2Jsb2NrIHR5cGVzCisgICAgaW50IGJsb2NrX3R5cGU7ICAgICAgICAgIC8vLzwgY3VycmVudCBibG9jayB0eXBlCisgICAgaW50IGx1bWFfdmxjOyAgICAgICAgICAgIC8vLzwgd2hpY2ggVkxDIHNldCB3aWxsIGJlIHVzZWQgZm9yIGRlY29kaW5nIG9mIGx1bWEgYmxvY2tzCisgICAgaW50IGNocm9tYV92bGM7ICAgICAgICAgIC8vLzwgd2hpY2ggVkxDIHNldCB3aWxsIGJlIHVzZWQgZm9yIGRlY29kaW5nIG9mIGNocm9tYSBibG9ja3MKKyAgICBpbnQgaXMxNjsgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGJsb2NrIGhhcyBhZGRpdGlvbmFsIDE2eDE2IHNwZWNpZmljIGZlYXR1cmVzIG9yIG5vdAorICAgIGludCBkbXZbNF1bMl07ICAgICAgICAgICAvLy88IGRpZmZlcmVudGlhbCBtb3Rpb24gdmVjdG9ycyBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworCisgICAgaW50IHJ2MzA7ICAgICAgICAgICAgICAgIC8vLzwgaW5kaWNhdGVzIHdoaWNoIFJWIHZhcmlhc250IGlzIGN1cnJlbnRseSBkZWNvZGVkCisgICAgaW50IG1heF9ycHI7CisKKyAgICBpbnQgY3VyX3B0cywgbGFzdF9wdHMsIG5leHRfcHRzOworICAgIGludCBzY2FsZWRfd2VpZ2h0OworICAgIGludCB3ZWlnaHQxLCB3ZWlnaHQyOyAgICAvLy88IEIgZnJhbWUgZGlzdGFuY2UgZnJhY3Rpb25zICgwLjE0KSB1c2VkIGluIG1vdGlvbiBjb21wZW5zYXRpb24KKyAgICBpbnQgbXZfd2VpZ2h0MSwgbXZfd2VpZ2h0MjsKKworICAgIHVpbnQxNl90ICpjYnBfbHVtYTsgICAgICAvLy88IENCUCB2YWx1ZXMgZm9yIGx1bWEgc3ViYmxvY2tzCisgICAgdWludDhfdCAgKmNicF9jaHJvbWE7ICAgIC8vLzwgQ0JQIHZhbHVlcyBmb3IgY2hyb21hIHN1YmJsb2NrcworICAgIHVpbnQxNl90ICpkZWJsb2NrX2NvZWZzOyAvLy88IGRlYmxvY2sgY29lZmZpY2llbnRzIGZvciBlYWNoIG1hY3JvYmxvY2sKKworICAgIC8qKiA4eDggYmxvY2sgYXZhaWxhYmxlIGZsYWdzIChmb3IgTVYgcHJlZGljdGlvbikgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDMyX3QsIGF2YWlsX2NhY2hlKVszKjRdOworCisgICAgLyoqIHRlbXBvcmFyeSBibG9ja3MgZm9yIFJWNCB3ZWlnaHRlZCBNQyAqLworICAgIHVpbnQ4X3QgKnRtcF9iX2Jsb2NrX3lbMl07CisgICAgdWludDhfdCAqdG1wX2JfYmxvY2tfdXZbNF07CisgICAgdWludDhfdCAqdG1wX2JfYmxvY2tfYmFzZTsKKworICAgIGludCAoKnBhcnNlX3NsaWNlX2hlYWRlcikoc3RydWN0IFJWMzREZWNDb250ZXh0ICpyLCBHZXRCaXRDb250ZXh0ICpnYiwgU2xpY2VJbmZvICpzaSk7CisgICAgaW50ICgqZGVjb2RlX21iX2luZm8pKHN0cnVjdCBSVjM0RGVjQ29udGV4dCAqcik7CisgICAgaW50ICgqZGVjb2RlX2ludHJhX3R5cGVzKShzdHJ1Y3QgUlYzNERlY0NvbnRleHQgKnIsIEdldEJpdENvbnRleHQgKmdiLCBpbnQ4X3QgKmRzdCk7CisgICAgdm9pZCAoKmxvb3BfZmlsdGVyKShzdHJ1Y3QgUlYzNERlY0NvbnRleHQgKnIsIGludCByb3cpOworfVJWMzREZWNDb250ZXh0OworCisvKioKKyAqIGNvbW1vbiBkZWNvZGluZyBmdW5jdGlvbnMKKyAqLworaW50IGZmX3J2MzRfZ2V0X3N0YXJ0X29mZnNldChHZXRCaXRDb250ZXh0ICpnYiwgaW50IGJsb2Nrcyk7CitpbnQgZmZfcnYzNF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworaW50IGZmX3J2MzRfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCk7CitpbnQgZmZfcnYzNF9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CitpbnQgZmZfcnYzNF9kZWNvZGVfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworaW50IGZmX3J2MzRfZGVjb2RlX3VwZGF0ZV90aHJlYWRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqZHN0LCBjb25zdCBBVkNvZGVjQ29udGV4dCAqc3JjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUlYzNF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ydjM0X3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnYzNF9wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTA3YTVmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnYzNF9wYXJzZXIuYwpAQCAtMCwwICsxLDkzIEBACisvKgorICogUlYzMC80MCBwYXJzZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMSBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJWMzAvNDAgcGFyc2VyCisgKi8KKworI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFBhcnNlQ29udGV4dCBwYzsKKyAgICBpbnQ2NF90IGtleV9kdHM7CisgICAgaW50IGtleV9wdHM7Cit9IFJWMzRQYXJzZUNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBpbnQgcnZfdG9fYXZfZnJhbWVfdHlwZVs0XSA9IHsKKyAgICBBVl9QSUNUVVJFX1RZUEVfSSwgQVZfUElDVFVSRV9UWVBFX0ksIEFWX1BJQ1RVUkVfVFlQRV9QLCBBVl9QSUNUVVJFX1RZUEVfQiwKK307CisKK3N0YXRpYyBpbnQgcnYzNF9wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIFJWMzRQYXJzZUNvbnRleHQgKnBjID0gcy0+cHJpdl9kYXRhOworICAgIGludCB0eXBlLCBwdHMsIGhkcjsKKworICAgIGlmIChidWZfc2l6ZSA8IDEzICsgKmJ1ZiAqIDgpIHsKKyAgICAgICAgKnBvdXRidWYgPSBidWY7CisgICAgICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKworICAgIGhkciA9IEFWX1JCMzIoYnVmICsgOSArICpidWYgKiA4KTsKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWMzApIHsKKyAgICAgICAgdHlwZSA9IChoZHIgPj4gMjcpICYgMzsKKyAgICAgICAgcHRzICA9IChoZHIgPj4gIDcpICYgMHgxRkZGOworICAgIH0gZWxzZSB7CisgICAgICAgIHR5cGUgPSAoaGRyID4+IDI5KSAmIDM7CisgICAgICAgIHB0cyAgPSAoaGRyID4+ICA2KSAmIDB4MUZGRjsKKyAgICB9CisKKyAgICBpZiAodHlwZSAhPSAzICYmIHMtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBwYy0+a2V5X2R0cyA9IHMtPnB0czsKKyAgICAgICAgcGMtPmtleV9wdHMgPSBwdHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHR5cGUgIT0gMykKKyAgICAgICAgICAgIHMtPnB0cyA9IHBjLT5rZXlfZHRzICsgKChwdHMgLSBwYy0+a2V5X3B0cykgJiAweDFGRkYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5wdHMgPSBwYy0+a2V5X2R0cyAtICgocGMtPmtleV9wdHMgLSBwdHMpICYgMHgxRkZGKTsKKyAgICB9CisgICAgcy0+cGljdF90eXBlID0gcnZfdG9fYXZfZnJhbWVfdHlwZVt0eXBlXTsKKworICAgICpwb3V0YnVmID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKKyNpZiBDT05GSUdfUlYzMF9QQVJTRVIKK0FWQ29kZWNQYXJzZXIgZmZfcnYzMF9wYXJzZXIgPSB7CisgICAgLmNvZGVjX2lkcyAgICAgID0geyBBVl9DT0RFQ19JRF9SVjMwIH0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFJWMzRQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfcGFyc2UgICA9IHJ2MzRfcGFyc2UsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfUlY0MF9QQVJTRVIKK0FWQ29kZWNQYXJzZXIgZmZfcnY0MF9wYXJzZXIgPSB7CisgICAgLmNvZGVjX2lkcyAgICAgID0geyBBVl9DT0RFQ19JRF9SVjQwIH0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFJWMzRQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfcGFyc2UgICA9IHJ2MzRfcGFyc2UsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ydjM0ZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnYzNGRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI3MDFmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnYzNGRhdGEuaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIFJlYWxWaWRlbyA0IGRlY29kZXIKKyAqIGNvcHlyaWdodCAoYykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIG1pc2NlbGxhbmVvdXMgUlYzMC80MCB0YWJsZXMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUlYzNERBVEFfSAorI2RlZmluZSBBVkNPREVDX1JWMzREQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIG51bWJlciBvZiBvbmVzIGluIG5pYmJsZSBtaW51cyBvbmUKKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnYzNF9jb3VudF9vbmVzWzE2XSA9IHsKKyAgICAwLCAwLCAwLCAxLCAwLCAxLCAxLCAyLCAwLCAxLCAxLCAyLCAxLCAyLCAyLCAzCit9OworCisvKioKKyAqIHZhbHVlcyB1c2VkIHRvIHJlY29uc3RydWN0IGNvZGVkIGJsb2NrIHBhdHRlcm4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnYzNF9jYnBfY29kZVsxNl0gPSB7CisgICAgMHgwMCwgMHgyMCwgMHgxMCwgMHgzMCwgMHgwMiwgMHgyMiwgMHgxMiwgMHgzMiwKKyAgICAweDAxLCAweDIxLCAweDExLCAweDMxLCAweDAzLCAweDIzLCAweDEzLCAweDMzCit9OworCisvKioKKyAqIHByZWNhbGN1bGF0ZWQgcmVzdWx0cyBvZiBkaXZpc2lvbiBieSB0aHJlZSBhbmQgbW9kdWxvIHRocmVlIGZvciB2YWx1ZXMgMC0xMDcKKyAqCisgKiBBIGxvdCBvZiBmb3VyLXR1cGxlcyBpbiBSVjQwIGFyZSByZXByZXNlbnRlZCBhcyBjMCoyNytjMSo5K2MyKjMrYzMuCisgKiBUaGlzIHRhYmxlIGFsbG93cyBjb252ZXJzaW9uIGZyb20gYSB2YWx1ZSBiYWNrIHRvIGEgdmVjdG9yLgorICovCitzdGF0aWMgY29uc3QgdWludDhfdCBtb2R1bG9fdGhyZWVfdGFibGVbMTA4XSA9IHsKKyAgICAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA1LCAweDA2LCAweDA4LCAweDA5LCAweDBBLAorICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTgsIDB4MTksIDB4MUEsCisgICAgMHgyMCwgMHgyMSwgMHgyMiwgMHgyNCwgMHgyNSwgMHgyNiwgMHgyOCwgMHgyOSwgMHgyQSwKKworICAgIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDgsIDB4NDksIDB4NEEsCisgICAgMHg1MCwgMHg1MSwgMHg1MiwgMHg1NCwgMHg1NSwgMHg1NiwgMHg1OCwgMHg1OSwgMHg1QSwKKyAgICAweDYwLCAweDYxLCAweDYyLCAweDY0LCAweDY1LCAweDY2LCAweDY4LCAweDY5LCAweDZBLAorCisgICAgMHg4MCwgMHg4MSwgMHg4MiwgMHg4NCwgMHg4NSwgMHg4NiwgMHg4OCwgMHg4OSwgMHg4QSwKKyAgICAweDkwLCAweDkxLCAweDkyLCAweDk0LCAweDk1LCAweDk2LCAweDk4LCAweDk5LCAweDlBLAorICAgIDB4QTAsIDB4QTEsIDB4QTIsIDB4QTQsIDB4QTUsIDB4QTYsIDB4QTgsIDB4QTksIDB4QUEsCisKKyAgICAweEMwLCAweEMxLCAweEMyLCAweEM0LCAweEM1LCAweEM2LCAweEM4LCAweEM5LCAweENBLAorICAgIDB4RDAsIDB4RDEsIDB4RDIsIDB4RDQsIDB4RDUsIDB4RDYsIDB4RDgsIDB4RDksIDB4REEsCisgICAgMHhFMCwgMHhFMSwgMHhFMiwgMHhFNCwgMHhFNSwgMHhFNiwgMHhFOCwgMHhFOSwgMHhFQSwKK307CisKKy8qKgorICogcXVhbnRpemVyIHZhbHVlcyB1c2VkIGZvciBBQyBhbmQgREMgY29lZmZpY2llbnRzIGluIGNocm9tYSBibG9ja3MKKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnYzNF9jaHJvbWFfcXVhbnRbMl1bMzJdID0geworIHsgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAxNiwgMTcsIDE3LCAxOCwgMTksIDIwLCAyMCwgMjEsIDIyLCAyMiwgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSB9LAorIHsgIDAsICAwLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsCisgICAxNCwgMTUsIDE1LCAxNiwgMTcsIDE4LCAxOCwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsIDIzLCAyMyB9Cit9OworCisvKioKKyAqIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgZGVxdWFudGl6aW5nLgorICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgcnYzNF9xc2NhbGVfdGFiWzMyXSA9IHsKKyAgNjAsICAgNjcsICAgNzYsICAgODUsICAgOTYsICAxMDgsICAxMjEsICAxMzYsCisgMTUyLCAgMTcxLCAgMTkyLCAgMjE2LCAgMjQyLCAgMjcyLCAgMzA1LCAgMzQxLAorIDM4MywgIDQzMiwgIDQ4MSwgIDU0NCwgIDYwNiwgIDY4MywgIDc2NywgIDg1NCwKKyA5NjMsIDEwNzQsIDEyMTIsIDEzOTIsIDE1NjYsIDE3MDgsIDE5NzgsIDIyMTEKK307CisKKy8qKgorICogdGFibGVzIHVzZWQgdG8gdHJhbnNsYXRlIGEgcXVhbnRpemVyIHZhbHVlIGludG8gYSBWTEMgc2V0IGZvciBkZWNvZGluZworICogVGhlIGZpcnN0IHRhYmxlIGlzIHVzZWQgZm9yIGludHJhZnJhbWVzLgorICovCitzdGF0aWMgY29uc3QgdWludDhfdCBydjM0X3F1YW50X3RvX3ZsY19zZXRbMl1bMzFdID0geworIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDAgfSwKKyB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsCisgICAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2IH0sCit9OworCisvKioKKyAqIHRhYmxlIGZvciBvYnRhaW5pbmcgdGhlIHF1YW50aXplciBkaWZmZXJlbmNlCisgKiBAdG9kbyBVc2Ugd2l0aCBmZl9tb2RpZmllZF9xdWFudF90YWIgZnJvbSBoMjYzZGF0YS5oLgorICovCitzdGF0aWMgY29uc3QgdWludDhfdCBydjM0X2RxdWFudF90YWJbMl1bMzJdPXsKKy8vICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxCit7CisgICAgMCwgMywgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOAorfSx7CisgICAgMCwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMSwzMSwyNgorfQorfTsKKworLyoqCisgKiBtYXhpbXVtIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBmb3IgZWFjaCBvZiB0aGUgcG9zc2libGUgc2xpY2Ugb2Zmc2V0IHNpemVzCisgKiBAdG9kbyBUaGlzIGlzIHRoZSBzYW1lIGFzIGZmX21iYV9tYXgsIG1heWJlIHVzZSBpdCBpbnN0ZWFkLgorICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgcnYzNF9tYl9tYXhfc2l6ZXNbNl0gPSB7IDB4MkYsIDB4NjIsIDB4MThCLCAweDYyRiwgMHgxOEJGLCAweDIzRkYgfTsKKy8qKgorICogYml0cyBuZWVkZWQgdG8gY29kZSB0aGUgc2xpY2Ugb2Zmc2V0IGZvciB0aGUgZ2l2ZW4gc2l6ZQorICogQHRvZG8gVGhpcyBpcyB0aGUgc2FtZSBhcyBmZl9tYmFfbGVuZ3RoLCBtYXliZSB1c2UgaXQgaW5zdGVhZC4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnYzNF9tYl9iaXRzX3NpemVzWzZdID0geyA2LCA3LCA5LCAxMSwgMTMsIDE0IH07CisKKyNlbmRpZiAvKiBBVkNPREVDX1JWMzREQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3J2MzRkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3J2MzRkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2YyNDVlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnYzNGRzcC5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogUlYzMC80MCBkZWNvZGVyIGNvbW1vbiBkc3AgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTWlrZSBNZWxhbnNvbiwgS29uc3RhbnRpbiBTaGlzaGtvdgorICogQ29weXJpZ2h0IChjKSAyMDExIEphbm5lIEdydW5hdQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSVjMwLzQwIGRlY29kZXIgY29tbW9uIGRzcCBmdW5jdGlvbnMKKyAqLworCisjaW5jbHVkZSAicnYzNGRzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworLyoqCisgKiBAbmFtZSBSVjMwLzQwIGludmVyc2UgdHJhbnNmb3JtIGZ1bmN0aW9ucworICogQHsKKyAqLworCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHJ2MzRfcm93X3RyYW5zZm9ybShpbnQgdGVtcFsxNl0sIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKXsKKyAgICAgICAgY29uc3QgaW50IHowID0gMTMqKGJsb2NrW2krNCowXSArICAgIGJsb2NrW2krNCoyXSk7CisgICAgICAgIGNvbnN0IGludCB6MSA9IDEzKihibG9ja1tpKzQqMF0gLSAgICBibG9ja1tpKzQqMl0pOworICAgICAgICBjb25zdCBpbnQgejIgPSAgNyogYmxvY2tbaSs0KjFdIC0gMTcqYmxvY2tbaSs0KjNdOworICAgICAgICBjb25zdCBpbnQgejMgPSAxNyogYmxvY2tbaSs0KjFdICsgIDcqYmxvY2tbaSs0KjNdOworCisgICAgICAgIHRlbXBbNCppKzBdID0gejAgKyB6MzsKKyAgICAgICAgdGVtcFs0KmkrMV0gPSB6MSArIHoyOworICAgICAgICB0ZW1wWzQqaSsyXSA9IHoxIC0gejI7CisgICAgICAgIHRlbXBbNCppKzNdID0gejAgLSB6MzsKKyAgICB9Cit9CisKKy8qKgorICogUmVhbCBWaWRlbyAzLjAvNC4wIGludmVyc2UgdHJhbnNmb3JtICsgc2FtcGxlIHJlY29uc3RydWN0aW9uCisgKiBDb2RlIGlzIGFsbW9zdCB0aGUgc2FtZSBhcyBpbiBTVlEzLCBvbmx5IHNjYWxpbmcgaXMgZGlmZmVyZW50LgorICovCitzdGF0aWMgdm9pZCBydjM0X2lkY3RfYWRkX2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jayl7CisgICAgaW50ICAgICAgdGVtcFsxNl07CisgICAgaW50ICAgICAgaTsKKworICAgIHJ2MzRfcm93X3RyYW5zZm9ybSh0ZW1wLCBibG9jayk7CisgICAgbWVtc2V0KGJsb2NrLCAwLCAxNipzaXplb2YoaW50MTZfdCkpOworCisgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKXsKKyAgICAgICAgY29uc3QgaW50IHowID0gMTMqKHRlbXBbNCowK2ldICsgICAgdGVtcFs0KjIraV0pICsgMHgyMDA7CisgICAgICAgIGNvbnN0IGludCB6MSA9IDEzKih0ZW1wWzQqMCtpXSAtICAgIHRlbXBbNCoyK2ldKSArIDB4MjAwOworICAgICAgICBjb25zdCBpbnQgejIgPSAgNyogdGVtcFs0KjEraV0gLSAxNyp0ZW1wWzQqMytpXTsKKyAgICAgICAgY29uc3QgaW50IHozID0gMTcqIHRlbXBbNCoxK2ldICsgIDcqdGVtcFs0KjMraV07CisKKyAgICAgICAgZHN0WzBdID0gYXZfY2xpcF91aW50OCggZHN0WzBdICsgKCAoejAgKyB6MykgPj4gMTAgKSApOworICAgICAgICBkc3RbMV0gPSBhdl9jbGlwX3VpbnQ4KCBkc3RbMV0gKyAoICh6MSArIHoyKSA+PiAxMCApICk7CisgICAgICAgIGRzdFsyXSA9IGF2X2NsaXBfdWludDgoIGRzdFsyXSArICggKHoxIC0gejIpID4+IDEwICkgKTsKKyAgICAgICAgZHN0WzNdID0gYXZfY2xpcF91aW50OCggZHN0WzNdICsgKCAoejAgLSB6MykgPj4gMTAgKSApOworCisgICAgICAgIGRzdCAgKz0gc3RyaWRlOworICAgIH0KK30KKworLyoqCisgKiBSZWFsVmlkZW8gMy4wLzQuMCBpbnZlcnNlIHRyYW5zZm9ybSBmb3IgREMgYmxvY2sKKyAqCisgKiBDb2RlIGlzIGFsbW9zdCB0aGUgc2FtZSBhcyBydjM0X2ludl90cmFuc2Zvcm0oKQorICogYnV0IGZpbmFsIGNvZWZmaWNpZW50cyBhcmUgbXVsdGlwbGllZCBieSAxLjUgYW5kIGhhdmUgbm8gcm91bmRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHJ2MzRfaW52X3RyYW5zZm9ybV9ub3JvdW5kX2MoaW50MTZfdCAqYmxvY2speworICAgIGludCB0ZW1wWzE2XTsKKyAgICBpbnQgaTsKKworICAgIHJ2MzRfcm93X3RyYW5zZm9ybSh0ZW1wLCBibG9jayk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspeworICAgICAgICBjb25zdCBpbnQgejAgPSAzOSoodGVtcFs0KjAraV0gKyAgICB0ZW1wWzQqMitpXSk7CisgICAgICAgIGNvbnN0IGludCB6MSA9IDM5Kih0ZW1wWzQqMCtpXSAtICAgIHRlbXBbNCoyK2ldKTsKKyAgICAgICAgY29uc3QgaW50IHoyID0gMjEqIHRlbXBbNCoxK2ldIC0gNTEqdGVtcFs0KjMraV07CisgICAgICAgIGNvbnN0IGludCB6MyA9IDUxKiB0ZW1wWzQqMStpXSArIDIxKnRlbXBbNCozK2ldOworCisgICAgICAgIGJsb2NrW2kqNCswXSA9ICh6MCArIHozKSA+PiAxMTsKKyAgICAgICAgYmxvY2tbaSo0KzFdID0gKHoxICsgejIpID4+IDExOworICAgICAgICBibG9ja1tpKjQrMl0gPSAoejEgLSB6MikgPj4gMTE7CisgICAgICAgIGJsb2NrW2kqNCszXSA9ICh6MCAtIHozKSA+PiAxMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJ2MzRfaWRjdF9kY19hZGRfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBkYykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGRjID0gKDEzKjEzKmRjICsgMHgyMDApID4+IDEwOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgZHN0W2pdID0gYXZfY2xpcF91aW50OCggZHN0W2pdICsgZGMgKTsKKworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcnYzNF9pbnZfdHJhbnNmb3JtX2RjX25vcm91bmRfYyhpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQxNl90IGRjID0gKDEzICogMTMgKiAzICogYmxvY2tbMF0pID4+IDExOworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYmxvY2sgKz0gNCkKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgIGJsb2NrW2pdID0gZGM7Cit9CisKKy8qKiBAfSAqLyAvLyB0cmFuc2Zvcm0KKworCithdl9jb2xkIHZvaWQgZmZfcnYzNGRzcF9pbml0KFJWMzREU1BDb250ZXh0ICpjKQoreworICAgIGMtPnJ2MzRfaW52X3RyYW5zZm9ybSAgICA9IHJ2MzRfaW52X3RyYW5zZm9ybV9ub3JvdW5kX2M7CisgICAgYy0+cnYzNF9pbnZfdHJhbnNmb3JtX2RjID0gcnYzNF9pbnZfdHJhbnNmb3JtX2RjX25vcm91bmRfYzsKKworICAgIGMtPnJ2MzRfaWRjdF9hZGQgICAgPSBydjM0X2lkY3RfYWRkX2M7CisgICAgYy0+cnYzNF9pZGN0X2RjX2FkZCA9IHJ2MzRfaWRjdF9kY19hZGRfYzsKKworICAgIGlmIChBUkNIX0FSTSkKKyAgICAgICAgZmZfcnYzNGRzcF9pbml0X2FybShjKTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX3J2MzRkc3BfaW5pdF94ODYoYyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ydjM0ZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy9ydjM0ZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5ZWM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3J2MzRkc3AuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogUlYzMC80MCBkZWNvZGVyIG1vdGlvbiBjb21wZW5zYXRpb24gZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSVjMwLzQwIGRlY29kZXIgbW90aW9uIGNvbXBlbnNhdGlvbiBmdW5jdGlvbnMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUlYzNERTUF9ICisjZGVmaW5lIEFWQ09ERUNfUlYzNERTUF9ICisKKyNpbmNsdWRlICJoMjY0Y2hyb21hLmgiCisjaW5jbHVkZSAicXBlbGRzcC5oIgorCit0eXBlZGVmIHZvaWQgKCpydjQwX3dlaWdodF9mdW5jKSh1aW50OF90ICpkc3QvKmFsaWduIHdpZHRoICg4IG9yIDE2KSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjMS8qYWxpZ24gd2lkdGggKDggb3IgMTYpKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMyLyphbGlnbiB3aWR0aCAoOCBvciAxNikqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3MSwgaW50IHcyLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKwordHlwZWRlZiB2b2lkICgqcnYzNF9pbnZfdHJhbnNmb3JtX2Z1bmMpKGludDE2X3QgKmJsb2NrKTsKKwordHlwZWRlZiB2b2lkICgqcnYzNF9pZGN0X2FkZF9mdW5jKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKTsKK3R5cGVkZWYgdm9pZCAoKnJ2MzRfaWRjdF9kY19hZGRfZnVuYykodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBkYyk7CisKK3R5cGVkZWYgdm9pZCAoKnJ2NDBfd2Vha19sb29wX2ZpbHRlcl9mdW5jKSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbHRlcl9wMSwgaW50IGZpbHRlcl9xMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsIGludCBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW1zLCBpbnQgbGltX3ExLCBpbnQgbGltX3AxKTsKKwordHlwZWRlZiB2b2lkICgqcnY0MF9zdHJvbmdfbG9vcF9maWx0ZXJfZnVuYykodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhLCBpbnQgbGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkbW9kZSwgaW50IGNocm9tYSk7CisKK3R5cGVkZWYgaW50ICgqcnY0MF9sb29wX2ZpbHRlcl9zdHJlbmd0aF9mdW5jKSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEsIGludCBiZXRhMiwgaW50IGVkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwMSwgaW50ICpxMSk7CisKK3R5cGVkZWYgc3RydWN0IFJWMzREU1BDb250ZXh0IHsKKyAgICBxcGVsX21jX2Z1bmMgcHV0X3BpeGVsc190YWJbNF1bMTZdOworICAgIHFwZWxfbWNfZnVuYyBhdmdfcGl4ZWxzX3RhYls0XVsxNl07CisgICAgaDI2NF9jaHJvbWFfbWNfZnVuYyBwdXRfY2hyb21hX3BpeGVsc190YWJbM107CisgICAgaDI2NF9jaHJvbWFfbWNfZnVuYyBhdmdfY2hyb21hX3BpeGVsc190YWJbM107CisgICAgLyoqCisgICAgICogQml3ZWlnaHQgZnVuY3Rpb25zLCBmaXJzdCBkaW1lbnNpb24gaXMgdHJhbnNmb3JtIHNpemUgKDE2LzgpLAorICAgICAqIHNlY29uZCBpcyB3aGV0aGVyIHRoZSB3ZWlnaHQgaXMgcHJlc2NhbGVkIGJ5IDEvNTEyIHRvIHNraXAKKyAgICAgKiB0aGUgaW50ZXJtZWRpYXRlIHNoaWZ0aW5nLgorICAgICAqLworICAgIHJ2NDBfd2VpZ2h0X2Z1bmMgcnY0MF93ZWlnaHRfcGl4ZWxzX3RhYlsyXVsyXTsKKyAgICBydjM0X2ludl90cmFuc2Zvcm1fZnVuYyBydjM0X2ludl90cmFuc2Zvcm07CisgICAgcnYzNF9pbnZfdHJhbnNmb3JtX2Z1bmMgcnYzNF9pbnZfdHJhbnNmb3JtX2RjOworICAgIHJ2MzRfaWRjdF9hZGRfZnVuYyBydjM0X2lkY3RfYWRkOworICAgIHJ2MzRfaWRjdF9kY19hZGRfZnVuYyBydjM0X2lkY3RfZGNfYWRkOworICAgIHJ2NDBfd2Vha19sb29wX2ZpbHRlcl9mdW5jIHJ2NDBfd2Vha19sb29wX2ZpbHRlclsyXTsKKyAgICBydjQwX3N0cm9uZ19sb29wX2ZpbHRlcl9mdW5jIHJ2NDBfc3Ryb25nX2xvb3BfZmlsdGVyWzJdOworICAgIHJ2NDBfbG9vcF9maWx0ZXJfc3RyZW5ndGhfZnVuYyBydjQwX2xvb3BfZmlsdGVyX3N0cmVuZ3RoWzJdOworfSBSVjM0RFNQQ29udGV4dDsKKwordm9pZCBmZl9ydjMwZHNwX2luaXQoUlYzNERTUENvbnRleHQgKmMpOwordm9pZCBmZl9ydjM0ZHNwX2luaXQoUlYzNERTUENvbnRleHQgKmMpOwordm9pZCBmZl9ydjQwZHNwX2luaXQoUlYzNERTUENvbnRleHQgKmMpOworCit2b2lkIGZmX3J2MzRkc3BfaW5pdF9hcm0oUlYzNERTUENvbnRleHQgKmMpOwordm9pZCBmZl9ydjM0ZHNwX2luaXRfeDg2KFJWMzREU1BDb250ZXh0ICpjKTsKKwordm9pZCBmZl9ydjQwZHNwX2luaXRfYWFyY2g2NChSVjM0RFNQQ29udGV4dCAqYyk7Cit2b2lkIGZmX3J2NDBkc3BfaW5pdF94ODYoUlYzNERTUENvbnRleHQgKmMpOwordm9pZCBmZl9ydjQwZHNwX2luaXRfYXJtKFJWMzREU1BDb250ZXh0ICpjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUlYzNERTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ydjM0dmxjLmggYi9mZm1wZWcvbGliYXZjb2RlYy9ydjM0dmxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyOTM1NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3J2MzR2bGMuaApAQCAtMCwwICsxLDQwNTUgQEAKKy8qCisgKiBSZWFsVmlkZW8gMy80IGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJWMzAvNDAgVkxDIHRhYmxlcworICovCisKKyNpZm5kZWYgQVZDT0RFQ19SVjM0VkxDX0gKKyNkZWZpbmUgQVZDT0RFQ19SVjM0VkxDX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIE5VTV9JTlRSQV9UQUJMRVMgNQorI2RlZmluZSBOVU1fSU5URVJfVEFCTEVTIDcKKworI2RlZmluZSBDQlBQQVRfVkxDX1NJWkUgICAxMjk2CisjZGVmaW5lIENCUF9WTENfU0laRSAgICAgICAgMTYKKyNkZWZpbmUgRklSU1RCTEtfVkxDX1NJWkUgIDg2NAorI2RlZmluZSBPVEhFUkJMS19WTENfU0laRSAgMTA4CisjZGVmaW5lIENPRUZGX1ZMQ19TSVpFICAgICAgMzIKKyNkZWZpbmUgTUFYX1ZMQ19TSVpFICAgICAgMTI5NgorCitzdGF0aWMgY29uc3QgdWludDhfdCBydjM0X3RhYmxlX2ludHJhX2NicHBhdFtOVU1fSU5UUkFfVEFCTEVTXVsyXVtDQlBQQVRfVkxDX1NJWkVdID0geworICB7CisgICAgeworICAgICAgIDgsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDEwLCAxMCwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDYsCisgICAgICAxMiwgMTIsIDEzLCAxMiwgMTMsIDEyLCAxMywgMTEsIDEzLCAxMywgMTMsIDEyLCAxMywgMTIsIDEyLCAgOCwKKyAgICAgIDE0LCAxMywgMTYsIDEzLCAxNSwgMTMsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxMywgMTQsIDEwLAorICAgICAgMTIsIDEzLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEyLCAxMywgMTMsIDEyLCAxMiwgMTMsIDEyLCAxMiwgIDgsCisgICAgICAxMywgMTQsIDE0LCAxMiwgMTQsIDE0LCAxNCwgMTIsIDE0LCAxNSwgMTQsIDEyLCAxNCwgMTMsIDEzLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNCwgMTQsICA5LAorICAgICAgMTQsIDE2LCAxMywgMTMsIDE2LCAxNiwgMTYsIDE0LCAxNSwgMTYsIDE0LCAxMywgMTUsIDE1LCAxNCwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTUsIDE0LCAxMCwKKyAgICAgIDE2LCAxNiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNiwgMTUsICA5LAorICAgICAgMTIsIDEzLCAxMywgMTMsIDEyLCAxMiwgMTQsIDEyLCAxMiwgMTQsIDEzLCAxMiwgMTIsIDEyLCAxMiwgIDgsCisgICAgICAxNCwgMTQsIDE2LCAxNCwgMTMsIDEyLCAxNCwgMTIsIDE0LCAxNSwgMTQsIDEzLCAxMywgMTIsIDEzLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTMsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywgMTUsIDEwLAorICAgICAgMTQsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDEzLCAxNCwgMTYsIDE0LCAxMywgMTMsIDEzLCAxMywgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTIsIDE2LCAxNiwgMTQsIDEzLCAxNCwgMTMsIDEzLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTQsICA5LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNCwgMTAsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTUsIDE0LCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNSwgMTUsICA4LAorICAgICAgMTQsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNSwgMTMsIDEzLCAxNCwgMTAsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTUsIDEzLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE0LCAxMCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTYsICA5LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMTAsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTMsIDE0LCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTQsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTEsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTUsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTQsICA4LAorICAgICAgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDEyLCAxMiwgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgIDgsCisgICAgICAxNCwgMTQsIDE2LCAxNCwgMTUsIDE0LCAxNiwgMTMsIDE0LCAxNSwgMTQsIDEzLCAxNCwgMTMsIDEzLCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEwLAorICAgICAgMTQsIDE1LCAxNCwgMTQsIDE1LCAxNCwgMTUsIDEzLCAxNCwgMTQsIDEzLCAxMiwgMTMsIDEzLCAxMywgIDksCisgICAgICAxNSwgMTYsIDE1LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE1LCAxNiwgMTQsIDEyLCAxNCwgMTMsIDEzLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNCwgMTQsICA5LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDEzLCAxMywgMTYsIDE2LCAxNCwgMTAsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTUsIDEzLCAxNiwgMTQsIDE0LCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNiwgMTUsICA4LAorICAgICAgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTYsIDEzLCAxMywgMTQsIDE0LCAxMywgMTIsIDEyLCAxMiwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTUsIDE0LCAxNiwgMTMsIDE1LCAxNiwgMTQsIDEzLCAxMywgMTIsIDEzLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxMywgMTQsICA5LAorICAgICAgMTUsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTYsIDEzLCAxNCwgMTYsIDE0LCAxMywgMTMsIDEzLCAxMiwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNSwgMTIsIDE1LCAxNSwgMTQsIDEyLCAxMywgMTIsIDEyLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMywgMTMsICA3LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE0LCAxNCwgMTYsIDE0LCAxMywgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTQsIDEyLCAxNiwgMTMsIDEyLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNSwgMTIsIDE2LCAxMywgMTMsICA2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTMsIDEzLCAxNCwgMTAsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTMsIDE0LCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTQsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTQsIDEzLCAxMywgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDEzLCAxNCwgMTIsIDEyLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTMsIDE0LCAxMiwgMTMsICA2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNCwgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDEzLCAxNSwgMTMsIDEyLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTQsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTIsIDE2LCAxMiwgMTIsICA1LAorICAgICAgMTQsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNCwgMTUsIDE0LCAxNCwgMTMsIDE0LCAxMywgMTAsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxMCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNCwgMTUsIDE0LCAxMywgMTAsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTQsIDEzLCAxNiwgMTQsIDE0LCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTUsICA5LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEyLCAxMywgMTYsIDE2LCAxMywgMTAsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDEzLCAxNiwgMTYsIDEzLCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNSwgMTIsIDE2LCAxNiwgMTQsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE1LCAxNCwgMTMsIDEzLCAxMywgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMTMsIDEzLCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTUsICA5LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTYsIDE0LCAxNCwgMTQsIDEzLCAxMywgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTQsIDEyLCAxMywgMTIsIDEyLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMywgMTMsICA3LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLCAxMywgMTYsIDE0LCAxMywgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTMsIDEyLCAxNCwgMTMsIDEyLCAgNiwKKyAgICAgIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNCwgMTAsIDE1LCAxMiwgMTIsICA1LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTIsIDEzLCAxMywgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE1LCAxMywgMTIsIDEzLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxMiwgMTQsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTMsIDEzLCAxMywgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTUsIDEzLCAxMiwgMTEsIDEyLCAgNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTIsIDEzLCAxMCwgMTIsICA1LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMTMsIDE0LCAxMiwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTMsIDEyLCAxMywgMTIsIDEwLCAgNSwKKyAgICAgIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMCwgMTYsIDE2LCAxMywgMTAsIDEzLCAxMCwgMTAsICAxLAorICAgIH0sCisgICAgeworICAgICAgIDIsICA3LCAgNywgIDgsICA3LCAgOCwgIDksICA4LCAgNywgIDksICA4LCAgOCwgIDgsICA4LCAgOSwgIDcsCisgICAgICAgNiwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMCwgMTEsIDExLCAgOSwKKyAgICAgICA5LCAxMSwgMTIsIDEyLCAxMiwgMTMsIDE0LCAxMywgMTMsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTQsIDExLAorICAgICAgIDYsIDEwLCAgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMCwgMTEsIDEwLCAxMSwgMTEsIDExLCAxMSwgIDksCisgICAgICAgNiwgIDksIDEwLCAxMCwgMTAsIDExLCAxMiwgMTEsIDEwLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAgOCwKKyAgICAgICA5LCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTIsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEwLAorICAgICAgIDksIDEzLCAxMSwgMTMsIDEzLCAxNCwgMTQsIDEzLCAxMywgMTQsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTIsCisgICAgICAgOSwgMTIsIDEyLCAxMiwgMTIsIDE0LCAxNCwgMTMsIDEzLCAxNCwgMTMsIDEzLCAxMywgMTQsIDEzLCAxMSwKKyAgICAgICA4LCAxMiwgMTIsIDExLCAxMiwgMTQsIDE0LCAxMiwgMTMsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTQsIDExLAorICAgICAgIDYsIDEwLCAxMCwgMTEsICA5LCAxMCwgMTIsIDExLCAxMCwgMTIsIDExLCAxMSwgMTAsIDExLCAxMSwgIDksCisgICAgICAgNywgMTAsIDEwLCAxMSwgMTAsIDExLCAxMiwgMTEsIDExLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAgOSwKKyAgICAgICA5LCAxMiwgMTMsIDEzLCAxMiwgMTIsIDE0LCAxMywgMTMsIDE0LCAxNCwgMTMsIDE0LCAxMywgMTQsIDExLAorICAgICAgIDgsIDExLCAxMSwgMTIsIDExLCAxMiwgMTIsIDEyLCAxMSwgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTAsCisgICAgICAgNywgMTAsIDEwLCAxMSwgMTAsIDExLCAxMiwgMTEsIDEwLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAgOCwKKyAgICAgICA5LCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMiwgMTIsIDEzLCAxMywgMTIsIDEzLCAxMiwgMTMsIDEwLAorICAgICAgMTAsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE0LCAxNCwgMTUsIDE0LCAxNSwgMTQsIDE0LCAxNCwgMTIsCisgICAgICAgOSwgMTIsIDEyLCAxMywgMTIsIDEzLCAxNCwgMTMsIDEyLCAxMywgMTMsIDEyLCAxMywgMTMsIDEzLCAxMCwKKyAgICAgICA5LCAxMiwgMTIsIDEyLCAxMiwgMTMsIDE0LCAxMiwgMTIsIDE0LCAxMywgMTIsIDEzLCAxMywgMTMsIDEwLAorICAgICAgIDksIDEyLCAxMywgMTMsIDExLCAxMywgMTQsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTIsIDEzLCAxMywgMTEsCisgICAgICAxMCwgMTIsIDEzLCAxMywgMTIsIDEyLCAxNCwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxMywgMTMsIDE0LCAxMSwKKyAgICAgIDEwLCAxMywgMTQsIDE0LCAxMywgMTIsIDE1LCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxMywgMTQsIDExLAorICAgICAgMTEsIDE0LCAxNCwgMTQsIDEzLCAxNCwgMTUsIDE0LCAxNCwgMTUsIDE1LCAxNCwgMTMsIDE0LCAxNCwgMTIsCisgICAgICAxMCwgMTMsIDEyLCAxMywgMTIsIDEyLCAxNCwgMTMsIDEzLCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMCwKKyAgICAgIDEwLCAxMiwgMTMsIDEzLCAxMywgMTIsIDE0LCAxMiwgMTMsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEwLAorICAgICAgMTMsIDE1LCAxNiwgMTYsIDE1LCAxNSwgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTQsIDE0LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE1LCAxMSwKKyAgICAgIDEwLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxMiwgMTMsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEwLAorICAgICAgIDYsIDEwLCAxMCwgMTEsIDEwLCAxMSwgMTIsIDExLCAxMCwgMTIsIDEwLCAxMSwgMTAsIDExLCAxMSwgIDksCisgICAgICAgOCwgMTEsIDExLCAxMiwgMTEsIDEyLCAxMywgMTIsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMCwKKyAgICAgIDExLCAxMywgMTQsIDE0LCAxMywgMTQsIDE1LCAxNCwgMTMsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTUsIDEyLAorICAgICAgIDcsIDExLCAxMCwgMTIsIDExLCAxMiwgMTIsIDEyLCAxMSwgMTIsIDExLCAxMiwgMTEsIDEyLCAxMiwgMTAsCisgICAgICAgNywgMTAsIDEwLCAxMSwgMTAsIDExLCAxMiwgMTEsIDExLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAgOSwKKyAgICAgIDEwLCAxMiwgMTMsIDEzLCAxMiwgMTMsIDE0LCAxMywgMTMsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEwLAorICAgICAgMTAsIDEzLCAxMiwgMTQsIDEzLCAxNCwgMTQsIDE0LCAxMywgMTQsIDEyLCAxNCwgMTUsIDE0LCAxNCwgMTEsCisgICAgICAxMCwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTMsIDEyLCAxMywgMTMsIDEzLCAxMCwKKyAgICAgICA5LCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxMywgMTMsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEwLAorICAgICAgIDcsIDEwLCAxMCwgMTEsIDEwLCAxMSwgMTIsIDExLCAxMCwgMTIsIDEyLCAxMSwgIDksIDExLCAxMSwgIDksCisgICAgICAgNywgMTAsIDExLCAxMSwgMTAsIDExLCAxMiwgMTEsIDEwLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAgOSwKKyAgICAgIDEwLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE1LCAxMywgMTMsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEwLAorICAgICAgIDgsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDExLCAxMSwgMTIsIDEyLCAxMSwgMTEsIDEyLCAxMSwgIDksCisgICAgICAgNiwgIDksICA5LCAxMCwgIDksIDEwLCAxMCwgMTAsICA5LCAxMSwgMTAsIDEwLCAgOSwgMTAsIDEwLCAgNywKKyAgICAgICA4LCAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMSwgMTEsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsICA4LAorICAgICAgMTAsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDEzLCAxMywgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTEsCisgICAgICAgOCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTEsIDExLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAgOCwKKyAgICAgICA4LCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMCwgMTEsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsICA4LAorICAgICAgMTAsIDEzLCAxMywgMTMsIDEyLCAxMywgMTQsIDEzLCAxMiwgMTQsIDE0LCAxNCwgMTAsIDEzLCAxMywgMTEsCisgICAgICAxMCwgMTIsIDEyLCAxMywgMTIsIDEzLCAxNCwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMiwgMTIsIDEzLCAxMCwKKyAgICAgIDExLCAxMywgMTQsIDE0LCAxMywgMTMsIDE0LCAxMywgMTMsIDE1LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEwLAorICAgICAgMTAsIDEyLCAxMywgMTMsIDEyLCAxMywgMTQsIDEzLCAxMywgMTQsIDE0LCAxMywgMTIsIDEzLCAxMywgMTEsCisgICAgICAgOCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwgMTEsIDExLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAgOCwKKyAgICAgICA5LCAxMSwgMTIsIDEyLCAxMSwgMTEsIDEyLCAxMSwgMTIsIDEyLCAxMiwgMTEsIDEyLCAxMSwgMTEsICA4LAorICAgICAgMTIsIDE1LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE0LCAxNCwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNSwgMTIsCisgICAgICAxMCwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTIsIDEyLCAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAgOSwKKyAgICAgICA5LCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMCwgMTEsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsICA3LAorICAgICAgMTAsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTUsIDE0LCAxMywgMTQsIDE0LCAxNCwgMTIsIDE0LCAxNSwgMTIsCisgICAgICAxMSwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNCwgMTUsIDE1LCAxMiwKKyAgICAgIDEzLCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTAsIDEzLCAxMywgMTQsIDEzLCAxNSwgMTQsIDE0LCAxMywgMTUsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTIsCisgICAgICAxMCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTMsIDEzLCAxMywgMTMsIDE0LCAxMSwKKyAgICAgIDEyLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNCwgMTQsIDE1LCAxNSwgMTQsIDE1LCAxNCwgMTQsIDEyLAorICAgICAgMTEsIDE0LCAxNCwgMTUsIDE0LCAxNSwgMTUsIDE0LCAxNCwgMTUsIDEyLCAxNCwgMTUsIDE2LCAxNSwgMTIsCisgICAgICAxMSwgMTMsIDEzLCAxNCwgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxMSwKKyAgICAgIDExLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNCwgMTQsIDE2LCAxNCwgMTMsIDE0LCAxNCwgMTQsIDExLAorICAgICAgMTAsIDEzLCAxMywgMTMsIDEyLCAxNCwgMTQsIDE0LCAxMiwgMTUsIDE0LCAxNCwgMTEsIDEzLCAxMywgMTIsCisgICAgICAxMCwgMTIsIDEzLCAxNCwgMTIsIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTQsIDEzLCAxMiwgMTMsIDEzLCAxMSwKKyAgICAgIDEyLCAxNCwgMTQsIDE1LCAxNCwgMTUsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTUsIDEyLAorICAgICAgMTAsIDEzLCAxMywgMTMsIDEyLCAxMywgMTQsIDEzLCAxMywgMTQsIDEzLCAxMywgMTIsIDEzLCAxMywgMTEsCisgICAgICAgOSwgMTEsIDExLCAxMiwgMTEsIDEyLCAxMiwgMTEsIDExLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAgOSwKKyAgICAgIDEwLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMiwgMTIsIDEzLCAxMywgMTIsIDEzLCAxMiwgMTIsICA5LAorICAgICAgMTEsIDEzLCAxMywgMTUsIDE0LCAxNCwgMTUsIDE0LCAxNCwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTEsCisgICAgICAxMCwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTIsIDEyLCAxMywgMTEsIDExLCAxMiwgMTIsIDEyLCAgOCwKKyAgICAgICA5LCAxMiwgMTIsIDExLCAxMiwgMTIsIDEzLCAxMSwgMTIsIDEyLCAxMiwgMTEsIDEyLCAxMSwgMTEsICA4LAorICAgICAgMTAsIDEzLCAxMywgMTQsIDEyLCAxNCwgMTUsIDE0LCAxMywgMTUsIDE1LCAxNCwgMTAsIDEzLCAxMywgMTEsCisgICAgICAxMSwgMTMsIDE0LCAxMywgMTMsIDE0LCAxNCwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxMSwgMTMsIDEzLCAxMSwKKyAgICAgIDEyLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNCwgMTUsIDE2LCAxNSwgMTQsIDEzLCAxMywgMTQsIDExLAorICAgICAgMTEsIDE0LCAxMywgMTQsIDEzLCAxNCwgMTUsIDE0LCAxMywgMTUsIDE0LCAxNCwgMTEsIDEzLCAxMywgMTEsCisgICAgICAgOSwgMTIsIDEyLCAxMiwgMTEsIDEyLCAxMywgMTEsIDEyLCAxMywgMTIsIDExLCAxMCwgMTEsIDExLCAgOCwKKyAgICAgIDEwLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMSwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsICA4LAorICAgICAgMTIsIDE1LCAxNCwgMTUsIDE0LCAxNSwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTIsCisgICAgICAxMCwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTEsIDEyLCAxMywgMTIsIDExLCAxMSwgMTEsIDExLCAgOCwKKyAgICAgICA4LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAgOSwgMTAsIDExLCAxMCwgIDksIDEwLCAgOSwgIDksICA1LAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAxMiwgMTIsIDExLCAgOSwgMTEsIDEwLCAxMSwgIDksIDExLCAxMSwgMTAsICA5LCAgOSwgIDgsICA5LCAgNSwKKyAgICAgIDE0LCAxMywgMTQsIDExLCAxNCwgMTEsIDEzLCAxMCwgMTQsIDEzLCAxMiwgMTAsIDEyLCAxMCwgMTEsICA2LAorICAgICAgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMiwgMTYsIDExLCAxNiwgMTQsIDE2LCAxMiwgMTUsIDEyLCAxMywgIDgsCisgICAgICAxNCwgMTQsIDEyLCAxMSwgMTQsIDEyLCAxMywgMTAsIDEzLCAxMywgMTEsIDEwLCAxMiwgMTEsIDEwLCAgNiwKKyAgICAgIDE2LCAxNSwgMTQsIDExLCAxNiwgMTMsIDE0LCAxMCwgMTUsIDE0LCAxMywgMTAsIDEzLCAxMSwgMTEsICA3LAorICAgICAgMTYsIDE2LCAxNiwgMTEsIDE2LCAxNCwgMTYsIDExLCAxNiwgMTYsIDE1LCAxMiwgMTUsIDEzLCAxMywgIDgsCisgICAgICAxNiwgMTYsIDEzLCAxMiwgMTYsIDE2LCAxNSwgMTIsIDE2LCAxNiwgMTIsIDExLCAxNSwgMTMsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTQsIDExLCAxNiwgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNCwgMTEsIDE1LCAxNCwgMTMsICA4LAorICAgICAgMTYsIDE2LCAxNSwgMTAsIDE2LCAxNiwgMTYsIDEwLCAxNiwgMTYsIDE1LCAxMSwgMTYsIDE0LCAxNCwgIDgsCisgICAgICAxNCwgMTQsIDE0LCAxMiwgMTMsIDExLCAxMywgMTAsIDEzLCAxMywgMTIsIDExLCAxMSwgMTAsIDEwLCAgNiwKKyAgICAgIDE2LCAxNSwgMTYsIDEzLCAxMywgMTEsIDE0LCAxMSwgMTUsIDE0LCAxMywgMTEsIDEyLCAxMCwgMTEsICA3LAorICAgICAgMTYsIDE1LCAxNiwgMTQsIDE2LCAxMSwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMywgMTYsIDEyLCAxMywgIDgsCisgICAgICAxNiwgMTYsIDE0LCAxMywgMTUsIDEzLCAxNCwgMTEsIDE0LCAxNSwgMTMsIDExLCAxMywgMTEsIDExLCAgNywKKyAgICAgIDE2LCAxNiwgMTUsIDEzLCAxNSwgMTMsIDE0LCAxMSwgMTYsIDE1LCAxNCwgMTEsIDEzLCAxMSwgMTEsICA3LAorICAgICAgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMywgMTYsIDExLCAxNiwgMTYsIDE2LCAxMiwgMTYsIDEyLCAxMywgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTQsIDEzLCAxNSwgMTQsIDEzLCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNCwgMTIsIDE1LCAxMywgMTMsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTYsIDE1LCAxMiwgMTYsIDEzLCAxMywgIDcsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTMsIDEyLCAxNiwgMTIsIDE2LCAxNiwgMTQsIDEzLCAxMiwgMTEsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE1LCAxNCwgMTEsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTMsIDE0LCAxMSwgMTMsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE1LCAxMCwgMTYsIDExLCAxNiwgMTYsIDE2LCAxNCwgMTUsIDExLCAxMywgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTIsIDEzLCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTMsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTMsIDE0LCAxMiwgMTMsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE2LCAxMiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMywgMTUsIDEyLCAxMywgIDcsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTQsIDEzLCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxMywgMTMsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEwLCAxNiwgMTYsIDE2LCAxMywgMTYsIDEzLCAxMywgIDcsCisgICAgICAxNCwgMTQsIDEzLCAxMiwgMTMsIDEyLCAxMywgMTEsIDEyLCAxMywgMTEsIDEwLCAxMSwgMTAsIDEwLCAgNiwKKyAgICAgIDE2LCAxNiwgMTUsIDEzLCAxNiwgMTMsIDE1LCAxMSwgMTQsIDE0LCAxMywgMTEsIDEzLCAxMSwgMTEsICA3LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxMywgMTYsIDEzLCAxNCwgIDksCisgICAgICAxNiwgMTYsIDEzLCAxMywgMTUsIDE0LCAxNCwgMTEsIDEzLCAxNCwgMTEsIDExLCAxMiwgMTEsIDExLCAgNywKKyAgICAgIDE2LCAxNiwgMTUsIDEyLCAxNiwgMTQsIDE1LCAxMSwgMTQsIDE0LCAxMiwgMTEsIDEzLCAxMSwgMTEsICA3LAorICAgICAgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNCwgMTYsIDEyLCAxNiwgMTYsIDE0LCAxMiwgMTYsIDEzLCAxMywgIDgsCisgICAgICAxNiwgMTYsIDE0LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTIsIDExLCAxNSwgMTMsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTUsIDEzLCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxMywgMTEsIDE2LCAxMywgMTIsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTEsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTYsIDE0LCAxMSwgMTYsIDE0LCAxMywgIDcsCisgICAgICAxNiwgMTYsIDE1LCAxMywgMTQsIDEzLCAxNCwgMTEsIDE0LCAxNCwgMTIsIDExLCAxMSwgMTAsIDExLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDEzLCAxNCwgMTIsIDE1LCAxMSwgMTUsIDE0LCAxMywgMTEsIDEyLCAxMSwgMTEsICA3LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTYsIDE2LCAxMywgMTQsIDEyLCAxMywgIDgsCisgICAgICAxNiwgMTYsIDE1LCAxMywgMTUsIDE0LCAxNCwgMTIsIDE0LCAxNCwgMTIsIDExLCAxMiwgMTEsIDExLCAgNywKKyAgICAgIDE2LCAxNiwgMTQsIDEyLCAxNSwgMTMsIDE0LCAxMSwgMTUsIDE0LCAxMywgMTEsIDEyLCAxMSwgMTEsICA2LAorICAgICAgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMywgMTYsIDExLCAxNiwgMTUsIDE0LCAxMSwgMTQsIDExLCAxMiwgIDYsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTMsIDEyLCAxNCwgMTMsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTUsIDEzLCAxNiwgMTQsIDE1LCAxMSwgMTYsIDE2LCAxMywgMTEsIDE0LCAxMiwgMTEsICA2LAorICAgICAgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNCwgMTUsIDExLCAxNiwgMTYsIDEzLCAxMCwgMTQsIDEyLCAxMiwgIDYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTQsIDEzLCAxMiwgMTEsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMiwgMTYsIDE2LCAxNSwgMTMsIDEzLCAxMSwgMTIsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNCwgMTQsIDExLCAxMywgIDcsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTMsIDE2LCAxNiwgMTQsIDEzLCAxMywgMTIsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNSwgMTMsIDE1LCAxMSwgMTYsIDE1LCAxNCwgMTIsIDEzLCAxMSwgMTEsICA2LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE2LCAxMiwgMTUsIDExLCAxNiwgMTYsIDE1LCAxMiwgMTQsIDExLCAxMiwgIDYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTUsIDEzLCAxNCwgMTMsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxMiwgMTYsIDE2LCAxNCwgMTIsIDEzLCAxMiwgMTEsICA2LAorICAgICAgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMywgMTUsIDEwLCAxNiwgMTYsIDE0LCAxMSwgMTQsIDExLCAxMSwgIDUsCisgICAgICAxNiwgMTYsIDE1LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE0LCAxNCwgMTIsIDEyLCAxMiwgMTIsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNCwgMTMsIDE0LCAxMywgMTMsICA5LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDEzLCAxNSwgIDksCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE0LCAxNiwgMTIsIDEyLCAxMywgMTMsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE1LCAxMywgMTIsIDE0LCAxMiwgMTIsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE0LCAxMiwgMTYsIDEzLCAxMywgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTEsIDExLCAxNSwgMTQsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxMiwgMTEsIDE1LCAxMywgMTIsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTYsIDEzLCAxMCwgMTYsIDEzLCAxMiwgIDcsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTMsIDE0LCAxNiwgMTMsIDEzLCAxMiwgMTIsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxMywgMTYsIDE2LCAxNCwgMTMsIDEzLCAxMiwgMTIsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxMywgMTUsIDEyLCAxNCwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTMsIDE0LCAxNiwgMTMsIDEyLCAxMiwgMTIsIDExLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxMiwgMTQsIDE0LCAxMywgMTEsIDEzLCAxMSwgMTEsICA2LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEyLCAxNiwgMTUsIDE0LCAxMSwgMTQsIDExLCAxMiwgIDYsCisgICAgICAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTIsIDEyLCAxNCwgMTMsIDExLCAgOCwKKyAgICAgIDE2LCAxNiwgMTUsIDE0LCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE1LCAxMiwgMTEsIDEzLCAxMiwgMTEsICA2LAorICAgICAgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNCwgMTYsIDExLCAxNiwgMTQsIDEzLCAxMCwgMTQsIDExLCAxMSwgIDUsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE0LCAxNiwgMTUsIDEzLCAxMSwgMTEsIDExLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTMsIDEyLCAxMSwgMTIsICA3LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTYsIDE2LCAxMywgMTMsIDExLCAxMywgIDcsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTQsIDEzLCAxMiwgMTIsIDExLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTQsIDE1LCAxMiwgMTYsIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsICA2LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE2LCAxMywgMTUsIDExLCAxNiwgMTQsIDE0LCAxMSwgMTMsIDEwLCAxMSwgIDUsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTMsIDEyLCAxMiwgMTIsIDExLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE1LCAxMiwgMTYsIDE1LCAxMiwgMTEsIDEyLCAxMSwgMTAsICA1LAorICAgICAgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMywgMTQsIDEwLCAxNiwgMTQsIDEyLCAgOSwgMTIsIDEwLCAgOSwgIDMsCisgICAgfSwKKyAgICB7CisgICAgICAgMiwgIDYsICA2LCAgNywgIDYsICA3LCAgOCwgIDcsICA3LCAgOCwgIDcsICA4LCAgNywgIDgsICA4LCAgNSwKKyAgICAgICA1LCAgOCwgIDksICA5LCAgOSwgIDksIDEyLCAxMCwgMTAsIDExLCAxMCwgMTAsIDEwLCAxMSwgMTEsICA4LAorICAgICAgIDksIDEwLCAxMywgMTIsIDEzLCAxMiwgMTUsIDEzLCAxMywgMTQsIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTEsCisgICAgICAgNSwgMTAsICA5LCAxMCwgMTAsIDEwLCAxMiwgMTAsIDEwLCAxMiwgMTAsIDExLCAxMSwgMTEsIDExLCAgOCwKKyAgICAgICA2LCAgOSwgMTAsICA5LCAxMCwgMTEsIDEyLCAxMCwgMTAsIDEyLCAxMSwgMTEsIDEwLCAxMSwgMTEsICA4LAorICAgICAgIDksIDExLCAxMiwgMTEsIDEyLCAxMywgMTQsIDEyLCAxMywgMTQsIDE0LCAxMiwgMTMsIDEzLCAxMywgMTEsCisgICAgICAxMCwgMTMsIDExLCAxMiwgMTQsIDE0LCAxNSwgMTMsIDEzLCAxNSwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxMiwKKyAgICAgICA5LCAxMiwgMTIsIDEyLCAxMywgMTMsIDE1LCAxMywgMTMsIDE0LCAxMywgMTMsIDE0LCAxMywgMTUsIDExLAorICAgICAgIDgsIDExLCAxMiwgMTAsIDEyLCAxMywgMTQsIDEyLCAxMywgMTQsIDE0LCAxMywgMTMsIDEzLCAxNCwgMTEsCisgICAgICAgNSwgIDksIDEwLCAxMCwgIDksIDEwLCAxMiwgMTEsIDEwLCAxMiwgMTEsIDExLCAgOSwgMTEsIDExLCAgOSwKKyAgICAgICA2LCAxMCwgMTAsIDExLCAxMCwgMTAsIDEyLCAxMSwgMTEsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsICA5LAorICAgICAgIDksIDExLCAxMywgMTMsIDEyLCAxMSwgMTQsIDEyLCAxMywgMTUsIDEzLCAxMywgMTQsIDEzLCAxNCwgMTEsCisgICAgICAgOCwgMTEsIDExLCAxMiwgMTEsIDEyLCAxMywgMTIsIDEyLCAxMywgMTIsIDEzLCAxMiwgMTIsIDEyLCAxMCwKKyAgICAgICA3LCAxMCwgMTAsIDExLCAxMCwgMTEsIDEyLCAxMSwgMTEsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTIsICA5LAorICAgICAgIDksIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTQsIDEyLCAxMywgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTEsCisgICAgICAxMSwgMTQsIDEzLCAxNSwgMTUsIDE2LCAxNiwgMTUsIDE1LCAxNiwgMTUsIDE1LCAxNiwgMTYsIDE1LCAxMywKKyAgICAgIDEwLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE1LCAxMywgMTMsIDE0LCAxMywgMTMsIDE0LCAxNCwgMTQsIDExLAorICAgICAgIDksIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsIDEyLCAxMywgMTQsIDE0LCAxMywgMTMsIDEzLCAxNCwgMTEsCisgICAgICAgOSwgMTMsIDEzLCAxMywgMTEsIDEyLCAxNSwgMTMsIDEzLCAxNSwgMTQsIDE0LCAxMSwgMTMsIDE0LCAxMSwKKyAgICAgIDEwLCAxMywgMTMsIDEzLCAxMiwgMTIsIDE1LCAxMywgMTMsIDE1LCAxNCwgMTQsIDEzLCAxMywgMTQsIDExLAorICAgICAgMTAsIDEyLCAxMywgMTMsIDEyLCAxMSwgMTQsIDEyLCAxMywgMTUsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTEsCisgICAgICAxMSwgMTQsIDE1LCAxNSwgMTMsIDE0LCAxNiwgMTQsIDE0LCAxNiwgMTYsIDE0LCAxNCwgMTUsIDE1LCAxMywKKyAgICAgIDEwLCAxMywgMTMsIDEzLCAxMiwgMTMsIDE0LCAxMywgMTMsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTQsIDExLAorICAgICAgMTAsIDEyLCAxMywgMTMsIDEzLCAxMiwgMTQsIDEzLCAxMywgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTEsCisgICAgICAxMywgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwKKyAgICAgIDEyLCAxNSwgMTUsIDE1LCAxNCwgMTUsIDE2LCAxNCwgMTUsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTUsIDEzLAorICAgICAgMTAsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsIDEyLCAxMywgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTEsCisgICAgICAgNiwgMTAsIDEwLCAxMSwgMTAsIDExLCAxMiwgMTEsIDEwLCAxMiwgMTEsIDExLCAxMCwgMTEsIDExLCAgOSwKKyAgICAgICA4LCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMiwgMTIsIDEzLCAxMiwgMTMsIDEyLCAxMywgMTMsIDEwLAorICAgICAgMTEsIDEzLCAxNSwgMTQsIDE1LCAxNCwgMTYsIDE0LCAxNSwgMTYsIDE2LCAxNCwgMTUsIDE1LCAxNSwgMTMsCisgICAgICAgNywgMTEsIDEwLCAxMiwgMTEsIDExLCAxMywgMTEsIDExLCAxMywgMTAsIDExLCAxMiwgMTIsIDEyLCAxMCwKKyAgICAgICA3LCAxMSwgMTEsIDExLCAxMSwgMTEsIDEzLCAxMSwgMTEsIDEzLCAxMSwgMTIsIDEyLCAxMiwgMTIsICA5LAorICAgICAgMTAsIDEyLCAxMywgMTMsIDEzLCAxMywgMTUsIDEzLCAxNCwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTEsCisgICAgICAxMCwgMTMsIDEyLCAxNCwgMTQsIDE0LCAxNSwgMTMsIDEzLCAxNSwgMTIsIDEzLCAxNSwgMTUsIDE0LCAxMiwKKyAgICAgIDEwLCAxMywgMTIsIDEyLCAxMywgMTMsIDE1LCAxNCwgMTMsIDE1LCAxMywgMTMsIDE0LCAxNCwgMTQsIDExLAorICAgICAgMTAsIDEzLCAxMywgMTIsIDEzLCAxNCwgMTUsIDEzLCAxMywgMTUsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTEsCisgICAgICAgNywgMTAsIDExLCAxMSwgMTAsIDExLCAxMiwgMTEsIDEwLCAxMiwgMTIsIDEyLCAgOSwgMTEsIDEyLCAgOSwKKyAgICAgICA3LCAxMSwgMTEsIDExLCAxMSwgMTEsIDEzLCAxMSwgMTEsIDEzLCAxMiwgMTIsIDExLCAxMiwgMTIsICA5LAorICAgICAgMTAsIDEyLCAxNCwgMTMsIDEzLCAxMywgMTYsIDEzLCAxNCwgMTYsIDE0LCAxNCwgMTMsIDEzLCAxNCwgMTEsCisgICAgICAgOCwgMTEsIDExLCAxMiwgMTEsIDEyLCAxMywgMTIsIDEyLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMCwKKyAgICAgICA2LCAgOSwgIDksIDEwLCAgOSwgMTAsIDExLCAxMCwgMTAsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA4LAorICAgICAgIDgsIDExLCAxMSwgMTEsIDEyLCAxMSwgMTMsIDExLCAxMiwgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTAsCisgICAgICAxMSwgMTQsIDEzLCAxNCwgMTQsIDE0LCAxNiwgMTQsIDE0LCAxNiwgMTQsIDE0LCAxNSwgMTUsIDE0LCAxMiwKKyAgICAgICA5LCAxMiwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMiwgMTIsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEwLAorICAgICAgIDgsIDExLCAxMSwgMTEsIDExLCAxMSwgMTMsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgIDksCisgICAgICAxMCwgMTMsIDE0LCAxMywgMTEsIDEzLCAxNCwgMTQsIDEzLCAxNSwgMTUsIDE0LCAxMCwgMTMsIDE0LCAxMSwKKyAgICAgIDEwLCAxMywgMTMsIDEzLCAxMiwgMTMsIDE0LCAxMywgMTMsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDExLAorICAgICAgMTAsIDEzLCAxNCwgMTMsIDEzLCAxMiwgMTUsIDEzLCAxNCwgMTUsIDE0LCAxNCwgMTQsIDEzLCAxNCwgMTIsCisgICAgICAxMSwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxNSwgMTQsIDE0LCAxNSwgMTQsIDE1LCAxMywgMTQsIDE0LCAxMiwKKyAgICAgICA5LCAxMSwgMTIsIDEyLCAxMSwgMTEsIDEzLCAxMiwgMTIsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEwLAorICAgICAgIDksIDExLCAxMiwgMTIsIDEyLCAxMSwgMTMsIDExLCAxMiwgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTAsCisgICAgICAxMywgMTUsIDE1LCAxNiwgMTUsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE2LCAxNCwKKyAgICAgIDEwLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxMywgMTMsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDExLAorICAgICAgIDgsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDExLCAxMSwgMTIsIDEyLCAxMSwgMTIsIDExLCAxMiwgIDksCisgICAgICAxMSwgMTQsIDE0LCAxNSwgMTQsIDE1LCAxNSwgMTQsIDEzLCAxNSwgMTQsIDE1LCAxMiwgMTQsIDE1LCAxMywKKyAgICAgIDEyLCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTUsIDEzLAorICAgICAgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsCisgICAgICAxMSwgMTQsIDEzLCAxNSwgMTQsIDE0LCAxNiwgMTQsIDE0LCAxNiwgMTMsIDE0LCAxNSwgMTQsIDE1LCAxMiwKKyAgICAgIDExLCAxNCwgMTMsIDE0LCAxNCwgMTQsIDE2LCAxNSwgMTQsIDE2LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDEyLAorICAgICAgMTMsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTMsCisgICAgICAxMSwgMTQsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTQsIDE0LCAxNiwgMTIsIDE0LCAxNiwgMTYsIDE0LCAxMiwKKyAgICAgIDExLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE2LCAxNSwgMTQsIDE2LCAxMywgMTQsIDE2LCAxNSwgMTQsIDEyLAorICAgICAgMTIsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTYsIDE0LCAxNSwgMTYsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTIsCisgICAgICAxMSwgMTQsIDE0LCAxNCwgMTMsIDE0LCAxNiwgMTUsIDEzLCAxNiwgMTUsIDE1LCAxMSwgMTQsIDE0LCAxMiwKKyAgICAgIDExLCAxNCwgMTQsIDE1LCAxNCwgMTQsIDE2LCAxNCwgMTQsIDE1LCAxNCwgMTQsIDEzLCAxNSwgMTUsIDEyLAorICAgICAgMTMsIDE1LCAxNiwgMTUsIDE1LCAxNSwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNiwgMTMsCisgICAgICAxMSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTQsIDE0LCAxNiwgMTQsIDE0LCAxNCwgMTUsIDE0LCAxMiwKKyAgICAgICA5LCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMiwgMTIsIDEzLCAxMiwgMTMsIDEyLCAxMiwgMTIsIDEwLAorICAgICAgMTEsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDEzLCAxMywgMTQsIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTEsCisgICAgICAxMiwgMTUsIDE0LCAxNSwgMTUsIDE1LCAxNiwgMTUsIDE0LCAxNiwgMTQsIDE0LCAxNiwgMTYsIDE0LCAxMywKKyAgICAgIDEwLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDE0LCAxMiwgMTMsIDEzLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEwLAorICAgICAgMTAsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTQsIDEyLCAxMiwgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTAsCisgICAgICAxMCwgMTQsIDE0LCAxNCwgMTIsIDE0LCAxNiwgMTQsIDEzLCAxNiwgMTYsIDE2LCAxMCwgMTMsIDE0LCAxMiwKKyAgICAgIDExLCAxNCwgMTQsIDE0LCAxMywgMTQsIDE2LCAxNCwgMTQsIDE2LCAxNSwgMTQsIDEyLCAxMywgMTQsIDEyLAorICAgICAgMTIsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTYsIDE0LCAxNCwgMTYsIDE1LCAxNSwgMTQsIDE0LCAxNSwgMTIsCisgICAgICAxMiwgMTQsIDE1LCAxNSwgMTQsIDE1LCAxNiwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxMywgMTUsIDE0LCAxMiwKKyAgICAgICA5LCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMiwgMTIsIDEzLCAxMywgMTIsIDExLCAxMiwgMTIsIDEwLAorICAgICAgMTAsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEyLCAxMiwgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTAsCisgICAgICAxMywgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE1LCAxMywKKyAgICAgIDEwLCAxMiwgMTIsIDEzLCAxMiwgMTMsIDEzLCAxMiwgMTMsIDE0LCAxMywgMTMsIDEyLCAxMywgMTMsIDEwLAorICAgICAgIDcsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDEwLCAxMCwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDcsCisgICAgfSwKKyAgfSwKKyAgeworICAgIHsKKyAgICAgIDEwLCAxMCwgIDksICA4LCAgOSwgIDgsICA5LCAgNywgIDksICA5LCAgOCwgIDcsICA4LCAgNywgIDcsICA0LAorICAgICAgMTMsIDExLCAxMiwgIDksIDEyLCAgOSwgMTIsICA5LCAxMiwgMTEsIDExLCAgOSwgMTAsICA5LCAgOSwgIDYsCisgICAgICAxNSwgMTIsIDE1LCAxMSwgMTQsIDEwLCAxNCwgMTAsIDE0LCAxMywgMTMsIDExLCAxMywgMTEsIDEyLCAgNywKKyAgICAgIDEzLCAxMiwgMTEsICA5LCAxMiwgMTEsIDEyLCAgOSwgMTIsIDEyLCAxMCwgIDksIDEwLCAxMCwgIDksICA2LAorICAgICAgMTQsIDEzLCAxMiwgMTAsIDEzLCAxMiwgMTMsICA5LCAxMywgMTIsIDExLCAxMCwgMTIsIDExLCAxMCwgIDYsCisgICAgICAxNiwgMTQsIDE0LCAxMCwgMTUsIDEzLCAxNCwgMTAsIDE1LCAxNSwgMTQsIDExLCAxNCwgMTIsIDEyLCAgOCwKKyAgICAgIDE1LCAxNCwgMTIsIDExLCAxNSwgMTQsIDEzLCAxMSwgMTQsIDE0LCAxMSwgMTAsIDEzLCAxMiwgMTEsICA4LAorICAgICAgMTUsIDE2LCAxMywgMTEsIDE2LCAxNCwgMTQsIDExLCAxNSwgMTUsIDEyLCAxMCwgMTQsIDEzLCAxMiwgIDgsCisgICAgICAxNiwgMTUsIDE0LCAxMCwgMTYsIDE0LCAxNCwgMTAsIDE2LCAxNSwgMTQsIDEwLCAxNCwgMTMsIDEyLCAgNywKKyAgICAgIDEzLCAxMiwgMTIsIDExLCAxMSwgIDksIDEyLCAgOSwgMTIsIDEyLCAxMSwgMTAsIDEwLCAgOSwgIDksICA2LAorICAgICAgMTMsIDEzLCAxNCwgMTIsIDEyLCAxMCwgMTIsIDEwLCAxNCwgMTMsIDEyLCAxMSwgMTEsIDEwLCAxMCwgIDcsCisgICAgICAxNiwgMTQsIDE2LCAxMywgMTQsIDExLCAxNSwgMTAsIDE2LCAxNSwgMTQsIDEyLCAxNCwgMTEsIDEyLCAgOCwKKyAgICAgIDE0LCAxNCwgMTMsIDEyLCAxMywgMTIsIDEzLCAxMCwgMTMsIDEzLCAxMiwgMTEsIDExLCAxMCwgMTAsICA3LAorICAgICAgMTUsIDE0LCAxNCwgMTIsIDE0LCAxMiwgMTMsIDEwLCAxNCwgMTMsIDEyLCAxMSwgMTIsIDExLCAxMSwgIDcsCisgICAgICAxNiwgMTUsIDE2LCAxMywgMTUsIDEzLCAxNSwgMTAsIDE2LCAxNSwgMTQsIDEyLCAxNCwgMTIsIDEyLCAgNywKKyAgICAgIDE1LCAxNiwgMTQsIDEzLCAxNiwgMTQsIDE0LCAxMiwgMTUsIDE1LCAxMiwgMTIsIDEzLCAxMiwgMTIsICA4LAorICAgICAgMTYsIDE2LCAxNCwgMTMsIDE2LCAxNCwgMTQsIDExLCAxNSwgMTUsIDE0LCAxMSwgMTQsIDEyLCAxMiwgIDgsCisgICAgICAxNiwgMTYsIDE1LCAxMiwgMTYsIDE0LCAxNSwgMTAsIDE2LCAxNiwgMTMsIDEyLCAxNCwgMTMsIDEyLCAgNywKKyAgICAgIDE0LCAxNCwgMTQsIDEzLCAxMywgMTEsIDEzLCAxMSwgMTQsIDE0LCAxMywgMTIsIDExLCAxMCwgMTEsICA4LAorICAgICAgMTYsIDE1LCAxNiwgMTMsIDEzLCAxMSwgMTQsIDExLCAxNSwgMTQsIDE0LCAxMywgMTIsIDExLCAxMiwgIDgsCisgICAgICAxNSwgMTUsIDE2LCAxNCwgMTQsIDEwLCAxNCwgMTAsIDE2LCAxNSwgMTUsIDEzLCAxNCwgMTAsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNSwgMTMsIDE0LCAxMiwgMTUsIDE1LCAxMywgMTMsIDEzLCAxMiwgMTIsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE1LCAxMywgMTQsIDExLCAxNiwgMTYsIDE0LCAxMywgMTMsIDEyLCAxMiwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDEyLCAxNSwgMTEsIDE2LCAxNSwgMTUsIDEzLCAxNCwgMTIsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxMywgMTYsIDE2LCAxNCwgMTMsIDE0LCAxMywgMTIsICA5LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTUsIDExLCAxNiwgMTYsIDE0LCAxMywgMTUsIDEzLCAxMiwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNCwgMTAsIDE2LCAxNiwgMTUsIDEzLCAxNCwgMTIsIDEyLCAgNywKKyAgICAgIDEyLCAxMiwgMTIsIDExLCAxMiwgMTEsIDEyLCAxMCwgMTEsIDExLCAxMCwgIDksICA5LCAgOSwgIDksICA2LAorICAgICAgMTQsIDEzLCAxNCwgMTIsIDEzLCAxMiwgMTMsIDEwLCAxMywgMTMsIDEyLCAxMCwgMTIsIDEwLCAxMSwgIDcsCisgICAgICAxNiwgMTQsIDE2LCAxMywgMTUsIDEzLCAxNiwgMTIsIDE1LCAxNCwgMTQsIDEyLCAxNCwgMTIsIDEzLCAgOCwKKyAgICAgIDE0LCAxNCwgMTMsIDExLCAxNCwgMTIsIDEzLCAxMSwgMTIsIDEyLCAxMCwgMTAsIDExLCAxMCwgMTAsICA3LAorICAgICAgMTQsIDE0LCAxMywgMTIsIDE0LCAxMiwgMTMsIDExLCAxMywgMTMsIDEyLCAxMCwgMTIsIDExLCAxMCwgIDcsCisgICAgICAxNiwgMTUsIDE1LCAxMiwgMTYsIDE0LCAxNSwgMTEsIDE2LCAxNCwgMTMsIDExLCAxNCwgMTIsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTMsIDEzLCAxNiwgMTUsIDE0LCAxMiwgMTQsIDE0LCAxMSwgMTEsIDEzLCAxMiwgMTEsICA4LAorICAgICAgMTYsIDE2LCAxNCwgMTIsIDE2LCAxNCwgMTQsIDEyLCAxNSwgMTQsIDEyLCAxMSwgMTQsIDEyLCAxMiwgIDgsCisgICAgICAxNiwgMTUsIDE0LCAxMSwgMTYsIDE1LCAxNSwgMTEsIDE2LCAxNSwgMTMsIDExLCAxNCwgMTMsIDEyLCAgOCwKKyAgICAgIDE0LCAxMywgMTMsIDEyLCAxMywgMTEsIDEzLCAxMCwgMTIsIDEzLCAxMSwgMTAsIDEwLCAxMCwgMTAsICA3LAorICAgICAgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTMsIDExLCAxNCwgMTMsIDEyLCAxMSwgMTIsIDEwLCAxMSwgIDcsCisgICAgICAxNiwgMTUsIDE2LCAxNCwgMTUsIDEyLCAxNSwgMTEsIDE2LCAxNCwgMTQsIDEyLCAxNCwgMTEsIDEyLCAgOCwKKyAgICAgIDE0LCAxNSwgMTMsIDEyLCAxNCwgMTMsIDEzLCAxMSwgMTMsIDEzLCAxMSwgMTEsIDExLCAxMCwgMTAsICA3LAorICAgICAgMTQsIDE0LCAxNCwgMTIsIDE0LCAxMywgMTMsIDEwLCAxNCwgMTMsIDEyLCAxMCwgMTIsIDEwLCAxMCwgIDYsCisgICAgICAxNiwgMTUsIDE1LCAxMywgMTYsIDEzLCAxNSwgMTEsIDE1LCAxNCwgMTMsIDExLCAxMywgMTEsIDExLCAgNywKKyAgICAgIDE2LCAxNiwgMTQsIDEzLCAxNiwgMTUsIDE0LCAxMiwgMTUsIDE1LCAxMiwgMTEsIDEzLCAxMiwgMTEsICA4LAorICAgICAgMTYsIDE2LCAxNCwgMTMsIDE2LCAxNCwgMTQsIDExLCAxNSwgMTQsIDEyLCAxMSwgMTMsIDEyLCAxMSwgIDcsCisgICAgICAxNiwgMTYsIDE1LCAxMiwgMTYsIDE0LCAxNCwgMTEsIDE1LCAxNSwgMTMsIDExLCAxNCwgMTIsIDExLCAgNiwKKyAgICAgIDE2LCAxNSwgMTUsIDE0LCAxNCwgMTIsIDE0LCAxMiwgMTMsIDE0LCAxMywgMTIsIDExLCAxMSwgMTEsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE0LCAxMiwgMTUsIDEyLCAxNSwgMTQsIDE0LCAxMiwgMTIsIDExLCAxMiwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNSwgMTQsIDEyLCAxNSwgMTIsIDE2LCAxNSwgMTQsIDEzLCAxMywgMTEsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTQsIDE1LCAxMiwgMTQsIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsICA4LAorICAgICAgMTYsIDE2LCAxNSwgMTQsIDE0LCAxMiwgMTQsIDExLCAxNCwgMTQsIDEzLCAxMiwgMTIsIDExLCAxMSwgIDcsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTUsIDEyLCAxNCwgMTEsIDE1LCAxNSwgMTQsIDEyLCAxMywgMTEsIDEyLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywgMTUsIDE1LCAxNCwgMTIsIDEzLCAxMiwgMTEsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE1LCAxNCwgMTQsIDEyLCAxNiwgMTUsIDEzLCAxMiwgMTMsIDEyLCAxMSwgIDcsCisgICAgICAxNiwgMTYsIDE2LCAxMywgMTYsIDEzLCAxNCwgMTAsIDE2LCAxNSwgMTQsIDExLCAxMywgMTEsIDExLCAgNiwKKyAgICAgIDE0LCAxNSwgMTMsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTIsIDEzLCAxMSwgMTEsIDExLCAxMSwgMTAsICA4LAorICAgICAgMTYsIDE2LCAxNSwgMTMsIDE2LCAxNCwgMTYsIDEzLCAxNCwgMTQsIDEzLCAxMiwgMTMsIDEyLCAxMiwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNCwgMTUsIDEzLCAxNSwgMTMsIDEzLCAgOSwKKyAgICAgIDE1LCAxNSwgMTQsIDE0LCAxNSwgMTQsIDE0LCAxMiwgMTMsIDE0LCAxMSwgMTEsIDEyLCAxMiwgMTEsICA4LAorICAgICAgMTUsIDE2LCAxNSwgMTMsIDE1LCAxNCwgMTQsIDEyLCAxNCwgMTQsIDEyLCAxMSwgMTMsIDEyLCAxMiwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxMywgMTYsIDE1LCAxNSwgMTMsIDE2LCAxNSwgMTQsIDExLCAxNSwgMTIsIDEzLCAgOCwKKyAgICAgIDE2LCAxNiwgMTQsIDEzLCAxNiwgMTUsIDE1LCAxMywgMTQsIDE0LCAxMCwgMTEsIDE0LCAxMiwgMTEsICA4LAorICAgICAgMTYsIDE2LCAxNSwgMTMsIDE2LCAxNiwgMTUsIDEzLCAxNSwgMTQsIDEyLCAxMSwgMTQsIDEzLCAxMiwgIDgsCisgICAgICAxNiwgMTYsIDE1LCAxMywgMTYsIDE1LCAxNiwgMTIsIDE2LCAxNCwgMTMsIDEwLCAxNSwgMTMsIDEyLCAgNywKKyAgICAgIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE1LCAxMiwgMTMsIDE0LCAxMiwgMTIsIDExLCAxMSwgMTEsICA4LAorICAgICAgMTYsIDE1LCAxNiwgMTQsIDE1LCAxMywgMTUsIDEyLCAxNCwgMTQsIDEzLCAxMiwgMTIsIDExLCAxMiwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNSwgMTQsIDEyLCAxNCwgMTEsIDEzLCAgOCwKKyAgICAgIDE2LCAxNiwgMTUsIDE0LCAxNiwgMTQsIDE1LCAxMywgMTQsIDE0LCAxMiwgMTEsIDEyLCAxMSwgMTEsICA4LAorICAgICAgMTUsIDE2LCAxNSwgMTQsIDE1LCAxNCwgMTQsIDEyLCAxNCwgMTMsIDEyLCAxMSwgMTIsIDExLCAxMSwgIDcsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTIsIDE1LCAxNCwgMTMsIDExLCAxMywgMTEsIDEyLCAgNywKKyAgICAgIDE2LCAxNiwgMTUsIDE0LCAxNiwgMTUsIDE1LCAxMywgMTQsIDE1LCAxMSwgMTEsIDEzLCAxMiwgMTEsICA4LAorICAgICAgMTYsIDE2LCAxNSwgMTMsIDE2LCAxNCwgMTUsIDEyLCAxNSwgMTQsIDEyLCAxMSwgMTMsIDExLCAxMSwgIDcsCisgICAgICAxNiwgMTYsIDE1LCAxMywgMTYsIDE0LCAxNiwgMTIsIDE1LCAxNCwgMTMsIDEwLCAxMywgMTEsIDExLCAgNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNCwgMTQsIDE1LCAxMywgMTQsIDE0LCAxNCwgMTIsIDExLCAxMSwgMTEsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE1LCAxNCwgMTYsIDEzLCAxNSwgMTQsIDE0LCAxMywgMTIsIDExLCAxMSwgIDcsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTUsIDEzLCAxNiwgMTIsIDE1LCAxNSwgMTQsIDEyLCAxMywgMTAsIDEyLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNSwgMTUsIDE0LCAxMywgMTQsIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsICA4LAorICAgICAgMTYsIDE1LCAxNiwgMTQsIDE2LCAxMywgMTUsIDEyLCAxNCwgMTQsIDEzLCAxMiwgMTIsIDEwLCAxMCwgIDYsCisgICAgICAxNiwgMTUsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTEsIDE2LCAxNCwgMTMsIDExLCAxMywgMTAsIDExLCAgNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE1LCAxMywgMTQsIDE2LCAxMiwgMTIsIDEyLCAxMiwgMTAsICA3LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTQsIDEyLCAxNSwgMTUsIDEyLCAxMSwgMTIsIDExLCAxMCwgIDYsCisgICAgICAxNiwgMTYsIDE2LCAxMywgMTYsIDEzLCAxNSwgMTAsIDE1LCAxNCwgMTMsIDEwLCAxMywgMTAsIDEwLCAgNCwKKyAgICB9LAorICAgIHsKKyAgICAgICAxLCAgNiwgIDYsICA3LCAgNiwgIDcsICA5LCAgOCwgIDcsICA5LCAgNywgIDgsICA3LCAgOCwgIDgsICA2LAorICAgICAgIDYsICA5LCAxMCwgMTAsIDEwLCAxMCwgMTIsIDExLCAxMCwgMTIsIDExLCAxMSwgMTEsIDExLCAxMiwgIDksCisgICAgICAgOSwgMTAsIDEzLCAxMSwgMTMsIDEyLCAxNCwgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMiwKKyAgICAgICA2LCAxMCwgIDksIDEwLCAxMCwgMTEsIDEzLCAxMSwgMTEsIDEzLCAxMCwgMTIsIDExLCAxMiwgMTIsICA5LAorICAgICAgIDYsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTMsIDExLCAxMSwgMTMsIDEyLCAxMiwgMTEsIDEyLCAxMiwgIDksCisgICAgICAgOSwgMTEsIDEzLCAxMiwgMTMsIDE0LCAxNSwgMTMsIDE0LCAxNiwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxMiwKKyAgICAgIDEwLCAxMywgMTEsIDEzLCAxNCwgMTQsIDE2LCAxNCwgMTQsIDE1LCAxMywgMTQsIDE1LCAxNSwgMTYsIDEyLAorICAgICAgIDksIDEzLCAxMiwgMTIsIDE0LCAxNCwgMTYsIDE0LCAxNCwgMTUsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTIsCisgICAgICAgOCwgMTEsIDEyLCAxMSwgMTMsIDE0LCAxNSwgMTMsIDEzLCAxNSwgMTQsIDE0LCAxMywgMTUsIDE1LCAxMSwKKyAgICAgICA2LCAxMCwgMTAsIDExLCAgOSwgMTAsIDEzLCAxMSwgMTAsIDEzLCAxMSwgMTIsIDEwLCAxMiwgMTIsICA5LAorICAgICAgIDYsIDEwLCAxMCwgMTEsIDExLCAxMCwgMTMsIDExLCAxMSwgMTMsIDExLCAxMiwgMTIsIDEyLCAxMywgMTAsCisgICAgICAgOSwgMTIsIDEzLCAxMywgMTMsIDEyLCAxNiwgMTMsIDE0LCAxNSwgMTQsIDE0LCAxNSwgMTQsIDE1LCAxMiwKKyAgICAgICA4LCAxMiwgMTIsIDEzLCAxMiwgMTMsIDE1LCAxNCwgMTMsIDE1LCAxMywgMTQsIDEzLCAxMywgMTQsIDExLAorICAgICAgIDcsIDExLCAxMSwgMTIsIDExLCAxMiwgMTMsIDEyLCAxMiwgMTMsIDEyLCAxMywgMTIsIDEzLCAxMywgMTAsCisgICAgICAgOSwgMTIsIDEzLCAxMywgMTMsIDEzLCAxNiwgMTMsIDEzLCAxNSwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxMiwKKyAgICAgIDExLCAxNSwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTAsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTYsIDE1LCAxNCwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTMsCisgICAgICAgOSwgMTIsIDEzLCAxMywgMTMsIDE0LCAxNiwgMTQsIDEzLCAxNSwgMTQsIDE0LCAxNCwgMTYsIDE1LCAxMiwKKyAgICAgIDEwLCAxMywgMTQsIDE0LCAxMSwgMTMsIDE2LCAxNCwgMTQsIDE2LCAxNSwgMTUsIDEyLCAxNCwgMTUsIDEyLAorICAgICAgMTAsIDEzLCAxNCwgMTQsIDEyLCAxMiwgMTYsIDE1LCAxNCwgMTYsIDE1LCAxNSwgMTQsIDE0LCAxNiwgMTIsCisgICAgICAgOSwgMTIsIDEzLCAxNCwgMTMsIDExLCAxNiwgMTMsIDE0LCAxNSwgMTMsIDE0LCAxNCwgMTQsIDE1LCAxMiwKKyAgICAgIDExLCAxNSwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTAsIDEzLCAxNCwgMTQsIDEzLCAxNCwgMTYsIDE1LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE1LCAxNiwgMTMsCisgICAgICAxMCwgMTMsIDEzLCAxNCwgMTMsIDEzLCAxNiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTQsIDE1LCAxMywKKyAgICAgIDEzLCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LAorICAgICAgMTIsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMCwgMTIsIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTMsIDE0LCAxNCwgMTQsIDE1LCAxMiwKKyAgICAgICA2LCAxMCwgMTEsIDExLCAxMCwgMTEsIDEzLCAxMiwgMTEsIDEzLCAxMSwgMTIsIDExLCAxMiwgMTIsIDEwLAorICAgICAgIDgsIDEyLCAxMywgMTMsIDEyLCAxMywgMTQsIDE0LCAxMywgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTIsCisgICAgICAxMiwgMTQsIDE2LCAxNSwgMTUsIDE1LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgICA3LCAxMSwgMTEsIDEyLCAxMiwgMTIsIDE0LCAxMywgMTIsIDE0LCAxMSwgMTIsIDEzLCAxMywgMTMsIDExLAorICAgICAgIDgsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTQsIDEzLCAxMiwgMTQsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTEsCisgICAgICAxMSwgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNiwgMTUsIDE1LCAxNiwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxMywKKyAgICAgIDEwLCAxNCwgMTIsIDE0LCAxNCwgMTUsIDE2LCAxNSwgMTMsIDE2LCAxMiwgMTQsIDE2LCAxNiwgMTUsIDEzLAorICAgICAgMTAsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTYsIDE1LCAxNCwgMTYsIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTIsCisgICAgICAxMCwgMTMsIDE0LCAxMywgMTQsIDE0LCAxNiwgMTUsIDE0LCAxNiwgMTUsIDE1LCAxNCwgMTYsIDE2LCAxMywKKyAgICAgICA3LCAxMSwgMTEsIDExLCAxMCwgMTIsIDE0LCAxMywgMTEsIDE0LCAxMywgMTMsIDEwLCAxMiwgMTMsIDEwLAorICAgICAgIDgsIDExLCAxMiwgMTIsIDExLCAxMiwgMTQsIDEzLCAxMiwgMTUsIDEzLCAxMywgMTIsIDEzLCAxNCwgMTEsCisgICAgICAxMSwgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNiwgMTUsIDE0LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgICA4LCAxMiwgMTIsIDEzLCAxMiwgMTMsIDE1LCAxNCwgMTIsIDE1LCAxMywgMTMsIDEzLCAxNCwgMTQsIDExLAorICAgICAgIDYsIDEwLCAxMCwgMTEsIDEwLCAxMSwgMTMsIDEyLCAxMSwgMTMsIDExLCAxMiwgMTEsIDEyLCAxMiwgIDksCisgICAgICAgOSwgMTIsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTMsIDEzLCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMiwKKyAgICAgIDExLCAxNSwgMTQsIDE1LCAxNCwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgIDksIDEzLCAxMiwgMTMsIDEzLCAxMywgMTUsIDE0LCAxMywgMTQsIDEzLCAxNCwgMTQsIDE1LCAxNCwgMTIsCisgICAgICAgOSwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTMsIDEzLCAxMywgMTMsIDE0LCAxMSwKKyAgICAgIDEwLCAxMywgMTUsIDE0LCAxMiwgMTQsIDE2LCAxNCwgMTQsIDE2LCAxNSwgMTUsIDEyLCAxNCwgMTYsIDEyLAorICAgICAgMTAsIDE0LCAxNCwgMTQsIDEzLCAxNCwgMTYsIDE1LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE0LCAxNiwgMTMsCisgICAgICAxMSwgMTMsIDE0LCAxNCwgMTQsIDEzLCAxNiwgMTQsIDE0LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxMywKKyAgICAgIDExLCAxNSwgMTUsIDE1LCAxNCwgMTUsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDEzLAorICAgICAgIDksIDEzLCAxMywgMTMsIDEyLCAxMywgMTUsIDE0LCAxMywgMTUsIDE0LCAxNCwgMTMsIDE0LCAxNSwgMTEsCisgICAgICAgOSwgMTIsIDEyLCAxMywgMTIsIDEyLCAxNCwgMTMsIDEzLCAxNCwgMTMsIDE0LCAxNCwgMTQsIDE0LCAxMSwKKyAgICAgIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LAorICAgICAgMTEsIDE0LCAxNCwgMTUsIDE1LCAxNCwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTIsCisgICAgICAgOSwgMTIsIDEyLCAxMywgMTIsIDEyLCAxNCwgMTIsIDEyLCAxNCwgMTMsIDEzLCAxMywgMTMsIDE0LCAxMSwKKyAgICAgIDExLCAxNCwgMTQsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTYsIDEzLAorICAgICAgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDExLCAxNSwgMTQsIDE2LCAxNCwgMTUsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTUsIDE2LCAxNiwgMTYsIDEzLAorICAgICAgMTEsIDE1LCAxNCwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgIDExLCAxNCwgMTMsIDE0LCAxNSwgMTQsIDE2LCAxNSwgMTQsIDE2LCAxMiwgMTQsIDE2LCAxNiwgMTUsIDEzLAorICAgICAgMTEsIDE0LCAxNCwgMTYsIDE0LCAxNSwgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNSwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMiwgMTQsIDE0LCAxNSwgMTQsIDE2LCAxNiwgMTUsIDE0LCAxNiwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxMywKKyAgICAgIDExLCAxNCwgMTUsIDE1LCAxMywgMTUsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDEyLCAxNSwgMTUsIDEzLAorICAgICAgMTEsIDE1LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTQsCisgICAgICAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwKKyAgICAgIDExLCAxNSwgMTQsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLAorICAgICAgMTAsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTYsIDE1LCAxNCwgMTYsIDE0LCAxNSwgMTQsIDE0LCAxNSwgMTIsCisgICAgICAxMiwgMTUsIDE0LCAxNiwgMTQsIDE1LCAxNiwgMTUsIDE1LCAxNiwgMTUsIDE1LCAxNiwgMTUsIDE2LCAxMywKKyAgICAgIDEyLCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTUsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTAsIDEzLCAxMywgMTQsIDE0LCAxMywgMTYsIDE0LCAxMywgMTYsIDEzLCAxNCwgMTUsIDE1LCAxNSwgMTIsCisgICAgICAxMCwgMTMsIDEzLCAxNCwgMTMsIDEzLCAxNiwgMTQsIDE0LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxMiwKKyAgICAgIDEwLCAxNCwgMTUsIDE0LCAxMywgMTUsIDE2LCAxNSwgMTQsIDE2LCAxNiwgMTYsIDExLCAxNCwgMTYsIDEyLAorICAgICAgMTEsIDE0LCAxNCwgMTYsIDE0LCAxNSwgMTYsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTMsIDE1LCAxNiwgMTMsCisgICAgICAxMiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywKKyAgICAgIDEyLCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDEzLAorICAgICAgMTAsIDEzLCAxNCwgMTQsIDEzLCAxNCwgMTYsIDE0LCAxMywgMTYsIDE1LCAxNCwgMTIsIDE0LCAxNiwgMTEsCisgICAgICAxMCwgMTMsIDEzLCAxNCwgMTMsIDE0LCAxNiwgMTQsIDE0LCAxNSwgMTQsIDE0LCAxMywgMTQsIDE0LCAxMSwKKyAgICAgIDEzLCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTEsIDEzLCAxNCwgMTUsIDE0LCAxNCwgMTYsIDE1LCAxNCwgMTYsIDE0LCAxNSwgMTQsIDE1LCAxNiwgMTIsCisgICAgICAgOCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMywgMTIsIDExLCAxMywgMTEsIDEyLCAxMSwgMTIsIDEyLCAgOSwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDgsICA4LCAgOCwgIDcsICA4LCAgNywgIDgsICA2LCAgOCwgIDgsICA3LCAgNiwgIDcsICA2LCAgNiwgIDQsCisgICAgICAxMSwgMTAsIDExLCAgOSwgMTEsICA5LCAxMSwgIDgsIDExLCAxMCwgMTAsICA5LCAxMCwgIDgsICA5LCAgNiwKKyAgICAgIDEzLCAxMSwgMTMsIDEwLCAxMiwgMTAsIDEzLCAgOSwgMTMsIDEyLCAxMywgMTAsIDEyLCAxMCwgMTEsICA3LAorICAgICAgMTEsIDExLCAxMCwgIDksIDExLCAxMCwgMTEsICA5LCAxMCwgMTEsICA5LCAgOCwgMTAsICA5LCAgOSwgIDYsCisgICAgICAxMiwgMTIsIDExLCAgOSwgMTIsIDExLCAxMiwgIDksIDEyLCAxMiwgMTEsICA5LCAxMSwgMTAsIDEwLCAgNywKKyAgICAgIDE0LCAxMywgMTMsIDEwLCAxNSwgMTIsIDEzLCAxMCwgMTUsIDEzLCAxMywgMTAsIDEzLCAxMiwgMTIsICA4LAorICAgICAgMTMsIDEzLCAxMSwgMTAsIDE0LCAxMywgMTIsIDEwLCAxMywgMTMsIDEwLCAxMCwgMTIsIDExLCAxMCwgIDgsCisgICAgICAxNSwgMTQsIDEzLCAxMCwgMTQsIDEzLCAxMywgMTAsIDE0LCAxMywgMTIsIDEwLCAxMywgMTIsIDExLCAgOCwKKyAgICAgIDE0LCAxNCwgMTMsIDEwLCAxNiwgMTMsIDEzLCAxMCwgMTUsIDE0LCAxMywgMTAsIDEzLCAxMiwgMTIsICA4LAorICAgICAgMTEsIDExLCAxMSwgMTAsIDEwLCAgOSwgMTAsICA5LCAxMCwgMTAsIDEwLCAgOSwgIDksICA4LCAgOSwgIDYsCisgICAgICAxMiwgMTIsIDEyLCAxMSwgMTEsICA5LCAxMiwgIDksIDEyLCAxMiwgMTEsIDEwLCAxMSwgIDksIDEwLCAgNywKKyAgICAgIDE0LCAxMywgMTQsIDEyLCAxMywgMTAsIDEzLCAxMCwgMTUsIDEzLCAxNCwgMTIsIDEyLCAxMCwgMTIsICA4LAorICAgICAgMTMsIDEzLCAxMiwgMTEsIDEyLCAxMSwgMTIsIDEwLCAxMiwgMTIsIDExLCAxMCwgMTEsIDEwLCAxMCwgIDcsCisgICAgICAxNCwgMTMsIDEzLCAxMSwgMTMsIDEyLCAxMiwgMTAsIDEzLCAxMywgMTIsIDExLCAxMiwgMTAsIDEwLCAgNywKKyAgICAgIDE2LCAxNSwgMTUsIDEyLCAxNCwgMTIsIDEzLCAxMCwgMTUsIDE0LCAxMywgMTIsIDEzLCAxMiwgMTIsICA4LAorICAgICAgMTUsIDE1LCAxMywgMTMsIDE0LCAxNCwgMTQsIDEyLCAxNCwgMTQsIDEyLCAxMSwgMTMsIDEyLCAxMSwgIDgsCisgICAgICAxNSwgMTYsIDE0LCAxMiwgMTUsIDE0LCAxMywgMTEsIDE1LCAxNSwgMTMsIDEyLCAxMywgMTIsIDExLCAgOCwKKyAgICAgIDE2LCAxNSwgMTUsIDEyLCAxNiwgMTQsIDE0LCAxMCwgMTUsIDE1LCAxNCwgMTIsIDE0LCAxMiwgMTIsICA4LAorICAgICAgMTMsIDEzLCAxMywgMTMsIDExLCAxMCwgMTIsIDEwLCAxMiwgMTMsIDEyLCAxMSwgMTAsIDEwLCAxMCwgIDgsCisgICAgICAxNCwgMTMsIDE0LCAxMywgMTIsIDEwLCAxMywgMTAsIDE0LCAxNCwgMTMsIDEyLCAxMiwgMTAsIDExLCAgOCwKKyAgICAgIDE1LCAxNCwgMTYsIDE0LCAxMywgMTAsIDE0LCAxMCwgMTYsIDE0LCAxNCwgMTMsIDEzLCAxMCwgMTIsICA4LAorICAgICAgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEyLCAxNCwgMTQsIDEzLCAxMiwgMTIsIDExLCAxMSwgIDksCisgICAgICAxNSwgMTUsIDE1LCAxNCwgMTQsIDEyLCAxNCwgMTEsIDE1LCAxNCwgMTMsIDEzLCAxMywgMTEsIDExLCAgOCwKKyAgICAgIDE2LCAxNSwgMTYsIDE0LCAxNSwgMTIsIDE0LCAxMSwgMTYsIDE2LCAxNSwgMTMsIDE0LCAxMiwgMTIsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTQsIDE1LCAxNCwgMTQsIDEyLCAxNSwgMTUsIDE0LCAxMywgMTMsIDEyLCAxMSwgIDksCisgICAgICAxNiwgMTYsIDE1LCAxNSwgMTYsIDE0LCAxNCwgMTEsIDE2LCAxNiwgMTQsIDEzLCAxNCwgMTIsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDEzLCAxNSwgMTMsIDE0LCAxMCwgMTYsIDE2LCAxNSwgMTMsIDE0LCAxMiwgMTIsICA4LAorICAgICAgMTEsIDExLCAxMSwgMTAsIDExLCAxMCwgMTEsICA5LCAxMCwgMTAsICA5LCAgOCwgIDksICA5LCAgOSwgIDYsCisgICAgICAxMiwgMTIsIDEzLCAxMSwgMTIsIDExLCAxMiwgMTAsIDEyLCAxMiwgMTEsIDEwLCAxMSwgMTAsIDEwLCAgNywKKyAgICAgIDE1LCAxMywgMTUsIDEyLCAxNCwgMTMsIDE0LCAxMSwgMTQsIDEzLCAxMywgMTEsIDEzLCAxMSwgMTIsICA4LAorICAgICAgMTIsIDEzLCAxMiwgMTEsIDEzLCAxMSwgMTIsIDEwLCAxMSwgMTIsIDEwLCAgOSwgMTEsIDEwLCAxMCwgIDcsCisgICAgICAxNCwgMTMsIDEzLCAxMSwgMTQsIDEyLCAxMywgMTEsIDEyLCAxMiwgMTEsIDEwLCAxMiwgMTEsIDEwLCAgNywKKyAgICAgIDE1LCAxNCwgMTUsIDEyLCAxNSwgMTMsIDE1LCAxMSwgMTUsIDE0LCAxMywgMTEsIDEzLCAxMiwgMTIsICA4LAorICAgICAgMTQsIDE0LCAxMywgMTIsIDE1LCAxNCwgMTMsIDEyLCAxMywgMTMsIDExLCAxMCwgMTMsIDEyLCAxMSwgIDgsCisgICAgICAxNiwgMTUsIDEzLCAxMiwgMTUsIDE0LCAxNCwgMTIsIDE0LCAxNCwgMTIsIDExLCAxNCwgMTIsIDExLCAgOCwKKyAgICAgIDE2LCAxNSwgMTQsIDEyLCAxNiwgMTUsIDE1LCAxMSwgMTUsIDE0LCAxMywgMTEsIDE0LCAxMywgMTIsICA4LAorICAgICAgMTIsIDEyLCAxMiwgMTEsIDEyLCAxMSwgMTIsIDEwLCAxMSwgMTEsIDExLCAxMCwgMTAsICA5LCAgOSwgIDcsCisgICAgICAxMywgMTMsIDE0LCAxMiwgMTMsIDExLCAxMywgMTEsIDEzLCAxMiwgMTIsIDExLCAxMSwgMTAsIDEwLCAgNywKKyAgICAgIDE1LCAxNCwgMTYsIDEzLCAxNCwgMTIsIDE0LCAxMSwgMTQsIDE0LCAxNCwgMTIsIDEzLCAxMSwgMTIsICA4LAorICAgICAgMTMsIDEzLCAxMywgMTIsIDEzLCAxMiwgMTMsIDExLCAxMiwgMTIsIDExLCAxMCwgMTEsIDEwLCAxMCwgIDcsCisgICAgICAxNCwgMTQsIDEzLCAxMiwgMTMsIDEyLCAxMywgMTAsIDEzLCAxMywgMTEsIDEwLCAxMiwgMTAsIDEwLCAgNywKKyAgICAgIDE2LCAxNSwgMTUsIDEzLCAxNSwgMTIsIDE0LCAxMSwgMTUsIDE0LCAxMywgMTEsIDEzLCAxMSwgMTEsICA3LAorICAgICAgMTUsIDE2LCAxNCwgMTMsIDE1LCAxNCwgMTQsIDEyLCAxNCwgMTQsIDEyLCAxMSwgMTMsIDEyLCAxMSwgIDgsCisgICAgICAxNiwgMTUsIDE0LCAxMywgMTUsIDE0LCAxNCwgMTEsIDE0LCAxNCwgMTIsIDExLCAxMywgMTIsIDExLCAgNywKKyAgICAgIDE2LCAxNSwgMTUsIDEyLCAxNiwgMTQsIDE0LCAxMSwgMTUsIDE0LCAxMywgMTEsIDE0LCAxMiwgMTEsICA3LAorICAgICAgMTQsIDE1LCAxNCwgMTQsIDEzLCAxMiwgMTMsIDEyLCAxMywgMTMsIDEyLCAxMiwgMTEsIDEwLCAxMSwgIDgsCisgICAgICAxNSwgMTUsIDE1LCAxNCwgMTMsIDEyLCAxNCwgMTIsIDE0LCAxNCwgMTMsIDEyLCAxMiwgMTEsIDExLCAgOCwKKyAgICAgIDE2LCAxNSwgMTYsIDE0LCAxNCwgMTIsIDE1LCAxMiwgMTYsIDE0LCAxNCwgMTMsIDEzLCAxMSwgMTIsICA4LAorICAgICAgMTUsIDE1LCAxNSwgMTQsIDE0LCAxMywgMTQsIDEyLCAxNCwgMTQsIDEzLCAxMiwgMTIsIDExLCAxMSwgIDgsCisgICAgICAxNSwgMTUsIDE1LCAxNCwgMTQsIDEzLCAxNCwgMTIsIDE0LCAxNCwgMTMsIDEyLCAxMiwgMTEsIDExLCAgNywKKyAgICAgIDE2LCAxNSwgMTYsIDE0LCAxNSwgMTIsIDE1LCAxMSwgMTUsIDE0LCAxNCwgMTIsIDEzLCAxMSwgMTIsICA3LAorICAgICAgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTQsIDEzLCAxNSwgMTUsIDEzLCAxMiwgMTMsIDEyLCAxMSwgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTUsIDE0LCAxNCwgMTIsIDE1LCAxNSwgMTMsIDEyLCAxNCwgMTIsIDExLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE0LCAxMSwgMTUsIDE1LCAxNCwgMTIsIDE0LCAxMiwgMTEsICA3LAorICAgICAgMTMsIDEzLCAxMywgMTIsIDEzLCAxMiwgMTMsIDExLCAxMSwgMTIsIDExLCAxMCwgMTAsIDEwLCAxMCwgIDgsCisgICAgICAxNSwgMTQsIDE0LCAxMywgMTQsIDEzLCAxNCwgMTIsIDEzLCAxMywgMTIsIDExLCAxMywgMTEsIDExLCAgOCwKKyAgICAgIDE2LCAxNSwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxMywgMTUsIDE0LCAxNCwgMTIsIDE0LCAxMiwgMTMsICA5LAorICAgICAgMTQsIDE1LCAxMywgMTMsIDE0LCAxMywgMTQsIDEyLCAxMiwgMTMsIDExLCAxMSwgMTIsIDExLCAxMSwgIDgsCisgICAgICAxNSwgMTUsIDE0LCAxMywgMTUsIDE0LCAxNCwgMTIsIDEzLCAxMywgMTIsIDExLCAxMywgMTIsIDExLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTUsIDE2LCAxMywgMTUsIDE0LCAxNCwgMTIsIDE0LCAxMywgMTMsICA5LAorICAgICAgMTQsIDE1LCAxMywgMTMsIDE2LCAxNSwgMTUsIDEzLCAxMywgMTQsIDExLCAxMSwgMTMsIDEyLCAxMSwgIDksCisgICAgICAxNiwgMTYsIDE0LCAxMywgMTYsIDE1LCAxNiwgMTMsIDE0LCAxNCwgMTIsIDExLCAxNCwgMTMsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTUsIDEyLCAxNiwgMTUsIDE1LCAxMiwgMTUsIDE0LCAxMywgMTEsIDE0LCAxMywgMTIsICA4LAorICAgICAgMTQsIDE0LCAxNCwgMTMsIDE0LCAxMywgMTQsIDEyLCAxMiwgMTMsIDEyLCAxMSwgMTEsIDExLCAxMSwgIDgsCisgICAgICAxNSwgMTUsIDE1LCAxNCwgMTQsIDEzLCAxNSwgMTIsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTEsIDExLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTQsIDE2LCAxMywgMTUsIDE0LCAxNCwgMTIsIDE0LCAxMiwgMTIsICA5LAorICAgICAgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTQsIDEyLCAxMSwgMTIsIDExLCAxMSwgIDgsCisgICAgICAxNSwgMTUsIDE1LCAxMywgMTUsIDE0LCAxNCwgMTIsIDEzLCAxMywgMTIsIDExLCAxMiwgMTEsIDExLCAgNywKKyAgICAgIDE2LCAxNSwgMTYsIDE0LCAxNiwgMTQsIDE1LCAxMiwgMTUsIDE0LCAxNCwgMTIsIDEzLCAxMiwgMTIsICA4LAorICAgICAgMTYsIDE2LCAxNSwgMTQsIDE2LCAxNSwgMTUsIDEzLCAxNCwgMTQsIDEyLCAxMSwgMTMsIDEyLCAxMSwgIDgsCisgICAgICAxNiwgMTYsIDE1LCAxMywgMTYsIDE0LCAxNCwgMTIsIDE0LCAxNSwgMTIsIDExLCAxMywgMTIsIDExLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTUsIDE1LCAxMiwgMTUsIDE0LCAxMywgMTEsIDE0LCAxMiwgMTEsICA3LAorICAgICAgMTUsIDE1LCAxNSwgMTQsIDEzLCAxMywgMTQsIDEzLCAxMywgMTQsIDEzLCAxMiwgMTEsIDExLCAxMSwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTUsIDEzLCAxNSwgMTIsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTEsIDEyLCAgOCwKKyAgICAgIDE2LCAxNiwgMTYsIDE0LCAxNSwgMTMsIDE1LCAxMiwgMTUsIDE0LCAxNCwgMTIsIDEzLCAxMSwgMTIsICA4LAorICAgICAgMTUsIDE2LCAxNiwgMTQsIDE1LCAxNCwgMTUsIDEzLCAxNCwgMTQsIDEyLCAxMiwgMTEsIDExLCAxMSwgIDgsCisgICAgICAxNiwgMTUsIDE1LCAxNCwgMTUsIDE0LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDEyLCAxMiwgMTEsIDExLCAgNywKKyAgICAgIDE2LCAxNiwgMTYsIDEzLCAxNSwgMTMsIDE1LCAxMiwgMTUsIDE0LCAxNCwgMTIsIDEzLCAxMSwgMTEsICA3LAorICAgICAgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNiwgMTUsIDEzLCAxNCwgMTQsIDEyLCAxMiwgMTIsIDEyLCAxMSwgIDgsCisgICAgICAxNiwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNCwgMTIsIDE1LCAxNSwgMTMsIDExLCAxMiwgMTEsIDEwLCAgNywKKyAgICAgIDE2LCAxNiwgMTUsIDEzLCAxNiwgMTQsIDE0LCAxMSwgMTUsIDE0LCAxMywgMTAsIDEzLCAxMSwgMTAsICA1LAorICAgIH0sCisgICAgeworICAgICAgIDEsICA2LCAgNiwgIDcsICA2LCAgNywgIDksICA3LCAgNiwgIDksICA3LCAgOCwgIDcsICA4LCAgOCwgIDUsCisgICAgICAgNSwgIDgsIDEwLCAxMCwgMTAsIDEwLCAxMiwgMTEsIDExLCAxMiwgMTEsIDExLCAxMSwgMTIsIDEyLCAgOSwKKyAgICAgICA5LCAxMCwgMTIsIDExLCAxMywgMTIsIDE1LCAxMywgMTQsIDE1LCAxNSwgMTQsIDE0LCAxNSwgMTUsIDEyLAorICAgICAgIDYsIDEwLCAgOSwgMTAsIDEwLCAxMSwgMTMsIDEyLCAxMSwgMTMsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTAsCisgICAgICAgNiwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMywgMTEsIDExLCAxMywgMTIsIDEyLCAxMSwgMTIsIDEyLCAxMCwKKyAgICAgICA5LCAxMiwgMTMsIDEyLCAxMywgMTMsIDE2LCAxMywgMTQsIDE2LCAxNSwgMTQsIDE0LCAxNSwgMTYsIDEyLAorICAgICAgIDksIDEzLCAxMSwgMTMsIDE0LCAxNCwgMTYsIDE1LCAxNCwgMTYsIDEzLCAxNSwgMTUsIDE1LCAxNSwgMTIsCisgICAgICAgOSwgMTMsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTUsIDE0LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxMiwKKyAgICAgICA4LCAxMiwgMTIsIDExLCAxMywgMTQsIDE1LCAxMywgMTMsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEyLAorICAgICAgIDYsIDEwLCAxMCwgMTEsICA5LCAxMCwgMTMsIDExLCAxMSwgMTMsIDEyLCAxMiwgMTAsIDEyLCAxMiwgIDksCisgICAgICAgNiwgMTAsIDExLCAxMSwgMTEsIDEwLCAxMywgMTIsIDExLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMCwKKyAgICAgICA5LCAxMiwgMTMsIDEzLCAxMywgMTIsIDE2LCAxMywgMTQsIDE2LCAxNCwgMTUsIDE2LCAxNCwgMTUsIDEyLAorICAgICAgIDgsIDEyLCAxMywgMTMsIDEzLCAxMywgMTYsIDE0LCAxMywgMTYsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTIsCisgICAgICAgNywgMTEsIDExLCAxMiwgMTEsIDEyLCAxNCwgMTMsIDEyLCAxNCwgMTMsIDEzLCAxMiwgMTMsIDEzLCAxMSwKKyAgICAgICA5LCAxMiwgMTMsIDEzLCAxMywgMTMsIDE1LCAxNCwgMTQsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTYsIDEyLAorICAgICAgMTEsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMCwgMTQsIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxMywKKyAgICAgICA5LCAxMywgMTMsIDEzLCAxNCwgMTQsIDE2LCAxNCwgMTQsIDE2LCAxNSwgMTQsIDE0LCAxNiwgMTYsIDEzLAorICAgICAgIDksIDEzLCAxNCwgMTQsIDExLCAxMywgMTYsIDE0LCAxMywgMTYsIDE1LCAxNiwgMTMsIDE0LCAxNSwgMTIsCisgICAgICAxMCwgMTMsIDE0LCAxNSwgMTMsIDEyLCAxNiwgMTQsIDE0LCAxNiwgMTUsIDE1LCAxNCwgMTQsIDE2LCAxMywKKyAgICAgICA5LCAxMiwgMTMsIDE0LCAxMiwgMTEsIDE1LCAxMywgMTMsIDE1LCAxMywgMTQsIDE1LCAxNCwgMTYsIDEyLAorICAgICAgMTEsIDE1LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsCisgICAgICAxMSwgMTQsIDE0LCAxNSwgMTMsIDE0LCAxNiwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywKKyAgICAgIDEwLCAxMiwgMTMsIDE0LCAxMywgMTMsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTYsIDE1LCAxNCwgMTYsIDEzLAorICAgICAgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgICA5LCAxMiwgMTMsIDE0LCAxMywgMTMsIDE2LCAxMywgMTMsIDE1LCAxNSwgMTYsIDE1LCAxNSwgMTYsIDEyLAorICAgICAgIDYsIDExLCAxMSwgMTIsIDEwLCAxMiwgMTMsIDEyLCAxMSwgMTMsIDExLCAxMiwgMTEsIDEyLCAxMywgMTAsCisgICAgICAgOSwgMTIsIDEzLCAxMywgMTMsIDEzLCAxNiwgMTQsIDE0LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMiwKKyAgICAgIDEyLCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgIDcsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTQsIDEzLCAxMiwgMTQsIDExLCAxMywgMTMsIDEzLCAxMywgMTEsCisgICAgICAgOCwgMTIsIDEyLCAxMywgMTIsIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTMsIDEzLCAxMywgMTQsIDE0LCAxMSwKKyAgICAgIDExLCAxNCwgMTQsIDE1LCAxNiwgMTUsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLAorICAgICAgMTAsIDE0LCAxMiwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNCwgMTYsIDEyLCAxNSwgMTYsIDE2LCAxNiwgMTMsCisgICAgICAxMSwgMTQsIDEzLCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE0LCAxNiwgMTYsIDE2LCAxMywKKyAgICAgIDExLCAxNCwgMTQsIDE0LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDEzLAorICAgICAgIDcsIDExLCAxMiwgMTEsIDEwLCAxMiwgMTQsIDEzLCAxMiwgMTQsIDEzLCAxMywgMTAsIDEyLCAxMywgMTAsCisgICAgICAgOCwgMTIsIDEyLCAxMywgMTIsIDEyLCAxNSwgMTMsIDEzLCAxNCwgMTMsIDEzLCAxMywgMTMsIDE0LCAxMSwKKyAgICAgIDExLCAxMywgMTUsIDE2LCAxNCwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLAorICAgICAgIDksIDEyLCAxMywgMTMsIDEzLCAxMywgMTUsIDE0LCAxMywgMTUsIDEzLCAxNCwgMTMsIDE0LCAxNCwgMTIsCisgICAgICAgNywgMTEsIDExLCAxMSwgMTEsIDExLCAxMywgMTIsIDExLCAxMywgMTEsIDEyLCAxMSwgMTIsIDEyLCAxMCwKKyAgICAgICA5LCAxMiwgMTMsIDEzLCAxMywgMTMsIDE2LCAxMywgMTQsIDE2LCAxNSwgMTQsIDE0LCAxNCwgMTYsIDEyLAorICAgICAgMTIsIDE0LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMCwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNiwgMTUsIDE0LCAxNiwgMTQsIDE0LCAxNiwgMTUsIDE1LCAxMiwKKyAgICAgICA5LCAxMiwgMTMsIDEzLCAxMywgMTUsIDE2LCAxNCwgMTMsIDE2LCAxNCwgMTMsIDEzLCAxNCwgMTQsIDExLAorICAgICAgMTAsIDE0LCAxNSwgMTQsIDEyLCAxNCwgMTYsIDE1LCAxMywgMTYsIDE2LCAxNiwgMTIsIDE0LCAxNiwgMTIsCisgICAgICAxMSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNiwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTUsIDE2LCAxMywKKyAgICAgIDExLCAxNCwgMTQsIDE2LCAxNCwgMTMsIDE2LCAxNSwgMTQsIDE2LCAxNSwgMTYsIDE1LCAxNSwgMTYsIDEzLAorICAgICAgMTIsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTQsCisgICAgICAxMCwgMTMsIDE0LCAxNCwgMTMsIDE0LCAxNiwgMTQsIDEzLCAxNiwgMTUsIDE1LCAxMywgMTQsIDE0LCAxMiwKKyAgICAgICA5LCAxMiwgMTMsIDE0LCAxMywgMTIsIDE2LCAxNCwgMTMsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDEyLAorICAgICAgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMiwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywKKyAgICAgICA5LCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LCAxMywgMTIsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDExLAorICAgICAgMTEsIDE0LCAxNCwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNiwgMTMsCisgICAgICAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTEsIDE0LCAxNCwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMiwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTAsIDE0LCAxMiwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNCwgMTYsIDEyLCAxNCwgMTYsIDE2LCAxNSwgMTQsCisgICAgICAxMiwgMTUsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgIDEyLCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTEsIDE1LCAxNSwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTMsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMSwgMTUsIDE0LCAxNiwgMTQsIDE0LCAxNiwgMTUsIDE0LCAxNiwgMTUsIDE2LCAxNSwgMTYsIDE2LCAxMiwKKyAgICAgIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLAorICAgICAgMTIsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMCwgMTQsIDEzLCAxNCwgMTUsIDE0LCAxNiwgMTUsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE1LCAxMywKKyAgICAgIDEwLCAxNCwgMTQsIDE0LCAxMywgMTQsIDE2LCAxNSwgMTUsIDE2LCAxNCwgMTQsIDE0LCAxNiwgMTYsIDEyLAorICAgICAgMTAsIDE0LCAxNSwgMTQsIDEzLCAxNiwgMTYsIDE1LCAxMywgMTYsIDE2LCAxNiwgMTIsIDE0LCAxNiwgMTIsCisgICAgICAxMSwgMTYsIDE2LCAxNiwgMTQsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxMywKKyAgICAgIDEyLCAxNSwgMTQsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE0LAorICAgICAgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTQsCisgICAgICAxMSwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNiwgMTQsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTUsIDE1LCAxMiwKKyAgICAgIDEwLCAxNCwgMTMsIDE0LCAxNCwgMTQsIDE2LCAxNSwgMTQsIDE2LCAxNSwgMTUsIDE0LCAxNCwgMTYsIDEyLAorICAgICAgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMiwgMTQsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxMywKKyAgICAgICA4LCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMiwgMTEsIDEzLCAxMiwgMTIsIDEyLCAxMywgMTIsIDEwLAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAgNSwgIDYsICA2LCAgNiwgIDYsICA2LCAgNywgIDYsICA2LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNCwKKyAgICAgICA5LCAgOSwgIDksICA4LCAgOSwgIDgsIDEwLCAgOCwgMTAsIDEwLCAgOSwgIDksICA5LCAgOCwgIDksICA2LAorICAgICAgMTEsIDEwLCAxMiwgMTAsIDExLCAxMCwgMTIsICA5LCAxMiwgMTEsIDExLCAxMCwgMTEsIDEwLCAxMSwgIDgsCisgICAgICAgOSwgMTAsICA5LCAgOCwgMTAsIDEwLCAxMCwgIDksICA5LCAxMCwgIDgsICA4LCAgOSwgIDksICA4LCAgNywKKyAgICAgIDEwLCAxMSwgMTAsICA5LCAxMSwgMTEsIDExLCAgOSwgMTEsIDExLCAxMCwgIDksIDEwLCAxMCwgMTAsICA3LAorICAgICAgMTMsIDEyLCAxMiwgMTAsIDEzLCAxMiwgMTMsIDEwLCAxMywgMTIsIDEyLCAxMSwgMTMsIDEyLCAxMSwgIDksCisgICAgICAxMSwgMTIsIDEwLCAxMCwgMTIsIDEyLCAxMSwgMTAsIDExLCAxMiwgMTAsIDEwLCAxMSwgMTEsIDEwLCAgOCwKKyAgICAgIDEyLCAxMiwgMTEsIDEwLCAxMywgMTMsIDEzLCAxMCwgMTMsIDEzLCAxMiwgMTEsIDEzLCAxMiwgMTEsICA5LAorICAgICAgMTIsIDEyLCAxMiwgMTAsIDEzLCAxMywgMTMsIDEwLCAxMywgMTMsIDEyLCAxMCwgMTMsIDEyLCAxMiwgIDksCisgICAgICAgOSwgIDksIDEwLCAxMCwgIDksICA4LCAxMCwgIDksICA5LCAxMCwgIDksICA5LCAgOCwgIDgsICA5LCAgNiwKKyAgICAgIDEwLCAxMSwgMTEsIDExLCAxMCwgIDksIDExLCAgOSwgMTEsIDExLCAxMSwgMTAsIDEwLCAgOSwgMTAsICA3LAorICAgICAgMTIsIDEyLCAxMywgMTIsIDEyLCAxMCwgMTMsIDEwLCAxMywgMTMsIDEzLCAxMiwgMTIsIDExLCAxMSwgIDksCisgICAgICAxMSwgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwgMTAsIDExLCAxMiwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOCwKKyAgICAgIDEyLCAxMiwgMTIsIDExLCAxMiwgMTEsIDExLCAxMCwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTAsICA4LAorICAgICAgMTQsIDEzLCAxMywgMTIsIDEzLCAxMiwgMTMsIDEwLCAxNCwgMTQsIDEzLCAxMiwgMTMsIDEyLCAxMiwgIDksCisgICAgICAxMywgMTQsIDEzLCAxMiwgMTMsIDEzLCAxMywgMTIsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDExLCAgOSwKKyAgICAgIDE0LCAxNCwgMTMsIDEyLCAxMywgMTMsIDEzLCAxMSwgMTQsIDE0LCAxMywgMTIsIDEzLCAxMiwgMTIsICA5LAorICAgICAgMTQsIDE1LCAxNCwgMTIsIDE1LCAxMywgMTMsIDExLCAxNSwgMTQsIDE0LCAxMiwgMTQsIDEzLCAxMiwgIDksCisgICAgICAxMSwgMTEsIDEyLCAxMiwgMTAsIDEwLCAxMiwgMTEsIDExLCAxMiwgMTEsIDExLCAxMCwgMTAsIDEwLCAgOCwKKyAgICAgIDEyLCAxMiwgMTQsIDEzLCAxMSwgMTAsIDEyLCAxMSwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMCwgMTEsICA5LAorICAgICAgMTMsIDEzLCAxNCwgMTQsIDEyLCAxMCwgMTMsIDExLCAxNCwgMTQsIDE0LCAxMywgMTIsIDExLCAxMiwgIDksCisgICAgICAxMywgMTMsIDEzLCAxMywgMTIsIDEzLCAxMywgMTIsIDEzLCAxNCwgMTIsIDEyLCAxMiwgMTIsIDExLCAgOSwKKyAgICAgIDEzLCAxNCwgMTQsIDEzLCAxMywgMTIsIDEzLCAxMSwgMTQsIDE0LCAxMywgMTIsIDEzLCAxMiwgMTIsICA5LAorICAgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMiwgMTMsIDExLCAxNSwgMTUsIDE1LCAxMywgMTQsIDEyLCAxMiwgIDksCisgICAgICAxNCwgMTUsIDE1LCAxMywgMTQsIDE0LCAxMywgMTIsIDEzLCAxNCwgMTMsIDEzLCAxMiwgMTIsIDExLCAxMCwKKyAgICAgIDE2LCAxNiwgMTUsIDE0LCAxNSwgMTQsIDEzLCAxMSwgMTUsIDE1LCAxNCwgMTMsIDEzLCAxMywgMTIsICA5LAorICAgICAgMTUsIDE1LCAxNSwgMTMsIDE0LCAxMywgMTMsIDExLCAxNSwgMTUsIDE1LCAxMywgMTQsIDEzLCAxMiwgIDksCisgICAgICAgOCwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgIDksICA4LCAxMCwgIDksICA5LCAgOCwgIDgsICA5LCAgNywKKyAgICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMCwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMCwgMTAsICA4LAorICAgICAgMTMsIDEzLCAxNCwgMTIsIDEzLCAxMiwgMTQsIDExLCAxMywgMTMsIDEzLCAxMiwgMTMsIDExLCAxMiwgIDksCisgICAgICAxMCwgMTEsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTAsIDEwLCAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOCwKKyAgICAgIDEyLCAxMiwgMTIsIDExLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDEyLCAxMSwgMTAsIDExLCAxMSwgMTAsICA4LAorICAgICAgMTQsIDEzLCAxNCwgMTIsIDE0LCAxMywgMTQsIDEyLCAxNCwgMTMsIDEzLCAxMSwgMTMsIDEyLCAxMiwgIDksCisgICAgICAxMiwgMTMsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMywgMTEsIDExLCAxMiwgMTIsIDExLCAgOSwKKyAgICAgIDEzLCAxNCwgMTMsIDEyLCAxNCwgMTQsIDE0LCAxMiwgMTQsIDEzLCAxMiwgMTEsIDEzLCAxMiwgMTIsICA5LAorICAgICAgMTQsIDE0LCAxMywgMTIsIDE1LCAxNCwgMTUsIDEyLCAxNCwgMTQsIDEzLCAxMSwgMTMsIDEzLCAxMiwgIDksCisgICAgICAxMCwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMiwgMTAsIDEwLCAxMSwgMTAsIDEwLCAgOSwgIDksIDEwLCAgNywKKyAgICAgIDEyLCAxMiwgMTMsIDEyLCAxMiwgMTEsIDEyLCAxMSwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMCwgMTAsICA4LAorICAgICAgMTQsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTMsIDEyLCAxNCwgMTMsIDE0LCAxMiwgMTMsIDExLCAxMiwgIDksCisgICAgICAxMiwgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMiwgMTEsIDEwLCAxMCwgMTAsIDEwLCAgOCwKKyAgICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTIsIDEyLCAxMSwgMTAsIDExLCAxMCwgMTAsICA3LAorICAgICAgMTQsIDE0LCAxNCwgMTIsIDE0LCAxMiwgMTQsIDExLCAxNCwgMTMsIDEzLCAxMSwgMTMsIDExLCAxMSwgIDgsCisgICAgICAxMywgMTUsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTIsIDEzLCAxNCwgMTIsIDEyLCAxMiwgMTIsIDExLCAgOSwKKyAgICAgIDE0LCAxNSwgMTMsIDEyLCAxNCwgMTMsIDEzLCAxMSwgMTMsIDEzLCAxMiwgMTEsIDEzLCAxMiwgMTEsICA4LAorICAgICAgMTUsIDE1LCAxNSwgMTIsIDE1LCAxNCwgMTQsIDExLCAxNCwgMTQsIDEzLCAxMSwgMTMsIDEyLCAxMiwgIDgsCisgICAgICAxMiwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMywgMTIsIDEyLCAxMywgMTIsIDEyLCAxMSwgMTEsIDExLCAgOSwKKyAgICAgIDEzLCAxNCwgMTUsIDE0LCAxMywgMTIsIDE0LCAxMiwgMTMsIDEzLCAxNCwgMTIsIDEyLCAxMSwgMTIsICA5LAorICAgICAgMTQsIDE0LCAxNSwgMTQsIDE0LCAxMiwgMTQsIDEyLCAxNCwgMTQsIDE0LCAxMywgMTMsIDExLCAxMiwgIDksCisgICAgICAxMywgMTQsIDE0LCAxNCwgMTMsIDEzLCAxNCwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDExLCAgOSwKKyAgICAgIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTMsIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsICA4LAorICAgICAgMTUsIDE0LCAxNSwgMTQsIDE0LCAxMywgMTQsIDExLCAxNSwgMTQsIDE0LCAxMiwgMTMsIDExLCAxMiwgIDgsCisgICAgICAxNCwgMTUsIDE0LCAxNCwgMTUsIDE0LCAxNCwgMTMsIDE0LCAxNSwgMTMsIDEzLCAxMiwgMTIsIDExLCAxMCwKKyAgICAgIDE2LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTQsIDE0LCAxMywgMTIsIDEzLCAxMiwgMTEsICA5LAorICAgICAgMTUsIDE1LCAxNSwgMTQsIDE2LCAxNCwgMTQsIDExLCAxNSwgMTUsIDE0LCAxMiwgMTMsIDEyLCAxMSwgIDgsCisgICAgICAxMSwgMTIsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDEwLCAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOCwKKyAgICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTIsICA5LAorICAgICAgMTQsIDE0LCAxNCwgMTMsIDE1LCAxMywgMTUsIDEzLCAxNCwgMTQsIDE0LCAxMiwgMTQsIDEyLCAxMywgMTAsCisgICAgICAxMiwgMTMsIDEyLCAxMywgMTMsIDEzLCAxMywgMTIsIDExLCAxMiwgMTEsIDExLCAxMiwgMTEsIDExLCAgOSwKKyAgICAgIDE0LCAxNCwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxMiwgMTIsIDEzLCAxMiwgMTEsIDEzLCAxMiwgMTIsICA5LAorICAgICAgMTQsIDE0LCAxNSwgMTMsIDE1LCAxNSwgMTUsIDEzLCAxNSwgMTMsIDEzLCAxMiwgMTQsIDEyLCAxMywgMTAsCisgICAgICAxMywgMTUsIDEyLCAxMywgMTQsIDE0LCAxNCwgMTMsIDEyLCAxMywgMTEsIDExLCAxMywgMTIsIDExLCAxMCwKKyAgICAgIDE0LCAxNSwgMTQsIDEzLCAxNSwgMTQsIDE1LCAxMywgMTQsIDE0LCAxMiwgMTEsIDEzLCAxMywgMTIsICA5LAorICAgICAgMTQsIDE1LCAxNCwgMTMsIDE1LCAxNCwgMTUsIDEzLCAxNCwgMTQsIDEzLCAxMSwgMTQsIDEzLCAxMiwgIDksCisgICAgICAxMiwgMTMsIDEzLCAxMywgMTIsIDEzLCAxMywgMTIsIDExLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAgOSwKKyAgICAgIDEzLCAxNCwgMTQsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMSwgMTEsICA5LAorICAgICAgMTUsIDE1LCAxNiwgMTQsIDE1LCAxNCwgMTQsIDEzLCAxNSwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMywgMTAsCisgICAgICAxMywgMTQsIDE0LCAxMywgMTMsIDE0LCAxNCwgMTMsIDEyLCAxMywgMTIsIDEyLCAxMSwgMTEsIDExLCAgOSwKKyAgICAgIDE0LCAxNCwgMTQsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTMsIDEzLCAxMiwgMTEsIDEyLCAxMSwgMTEsICA4LAorICAgICAgMTUsIDE1LCAxNSwgMTMsIDE1LCAxNCwgMTQsIDEyLCAxNCwgMTMsIDEzLCAxMiwgMTMsIDEyLCAxMiwgIDksCisgICAgICAxNCwgMTUsIDE0LCAxNCwgMTUsIDE1LCAxNCwgMTMsIDEzLCAxNCwgMTIsIDEyLCAxMywgMTIsIDEyLCAgOSwKKyAgICAgIDE1LCAxNSwgMTQsIDEzLCAxNSwgMTQsIDE0LCAxMywgMTQsIDE0LCAxMiwgMTEsIDEzLCAxMiwgMTEsICA4LAorICAgICAgMTUsIDE2LCAxNCwgMTMsIDE1LCAxNSwgMTUsIDEyLCAxNCwgMTQsIDEzLCAxMSwgMTQsIDEyLCAxMiwgIDgsCisgICAgICAxMiwgMTQsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTIsIDEyLCAxMywgMTIsIDEyLCAxMCwgMTEsIDExLCAgOSwKKyAgICAgIDE0LCAxNSwgMTUsIDE0LCAxMywgMTMsIDE1LCAxMywgMTMsIDE0LCAxNCwgMTIsIDEyLCAxMSwgMTIsICA5LAorICAgICAgMTUsIDE1LCAxNiwgMTQsIDE0LCAxMywgMTUsIDEzLCAxNCwgMTQsIDE0LCAxMywgMTMsIDExLCAxMiwgIDksCisgICAgICAxNCwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxNCwgMTMsIDEyLCAxMiwgMTIsIDExLCAgOSwKKyAgICAgIDE0LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxMiwgMTMsIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsICA4LAorICAgICAgMTUsIDE1LCAxNSwgMTQsIDE0LCAxMywgMTUsIDEyLCAxNSwgMTQsIDE0LCAxMiwgMTMsIDExLCAxMSwgIDgsCisgICAgICAxNCwgMTYsIDE0LCAxNCwgMTQsIDE1LCAxNCwgMTMsIDEzLCAxNCwgMTIsIDEyLCAxMiwgMTIsIDExLCAgOSwKKyAgICAgIDE1LCAxNSwgMTUsIDE0LCAxNSwgMTQsIDE0LCAxMiwgMTQsIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsICA4LAorICAgICAgMTUsIDE1LCAxNCwgMTMsIDE1LCAxMywgMTQsIDEyLCAxNCwgMTQsIDEzLCAxMSwgMTMsIDExLCAxMSwgIDcsCisgICAgfSwKKyAgICB7CisgICAgICAgMSwgIDUsICA2LCAgNywgIDYsICA3LCAgOSwgIDgsICA2LCAgOSwgIDgsICA4LCAgNywgIDgsICA4LCAgNiwKKyAgICAgICA1LCAgOCwgMTAsIDEwLCAxMCwgMTEsIDEzLCAxMiwgMTEsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEwLAorICAgICAgIDgsIDEwLCAxMywgMTIsIDEzLCAxMywgMTYsIDE0LCAxNCwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTIsCisgICAgICAgNSwgMTAsICA5LCAxMSwgMTEsIDEyLCAxMywgMTIsIDExLCAxMywgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMCwKKyAgICAgICA2LCAxMCwgMTEsIDExLCAxMSwgMTIsIDE0LCAxMiwgMTEsIDEzLCAxMywgMTMsIDEyLCAxMywgMTMsIDExLAorICAgICAgIDgsIDEyLCAxMywgMTIsIDE0LCAxNCwgMTYsIDE0LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsCisgICAgICAgOSwgMTMsIDExLCAxNCwgMTQsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxMywKKyAgICAgICA5LCAxMywgMTMsIDEzLCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgIDgsIDEyLCAxMywgMTIsIDEzLCAxNCwgMTYsIDE0LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTMsCisgICAgICAgNSwgMTAsIDExLCAxMiwgIDksIDExLCAxMywgMTIsIDExLCAxMywgMTMsIDEzLCAxMSwgMTIsIDEzLCAxMCwKKyAgICAgICA2LCAxMCwgMTEsIDEyLCAxMSwgMTEsIDE0LCAxMywgMTIsIDE0LCAxMiwgMTMsIDEzLCAxMywgMTMsIDExLAorICAgICAgIDksIDEyLCAxNCwgMTUsIDEzLCAxMywgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsCisgICAgICAgOCwgMTMsIDEzLCAxNCwgMTMsIDE0LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE0LCAxMywKKyAgICAgICA3LCAxMSwgMTIsIDEzLCAxMiwgMTIsIDE0LCAxMywgMTIsIDE0LCAxMywgMTQsIDEzLCAxNCwgMTQsIDEyLAorICAgICAgIDksIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsCisgICAgICAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNSwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgIDksIDEzLCAxNCwgMTQsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAgOSwgMTMsIDE0LCAxNSwgMTEsIDEzLCAxNiwgMTQsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTQsIDE2LCAxMywKKyAgICAgICA5LCAxMywgMTQsIDE2LCAxMywgMTMsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE0LAorICAgICAgIDgsIDEyLCAxMywgMTYsIDEzLCAxMiwgMTYsIDE0LCAxMywgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTMsCisgICAgICAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNCwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgIDksIDEzLCAxNiwgMTYsIDE0LCAxNCwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDksIDEzLCAxNCwgMTUsIDE0LCAxNCwgMTYsIDE0LCAxMywgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTQsCisgICAgICAgNiwgMTEsIDExLCAxMiwgMTEsIDEyLCAxNCwgMTMsIDExLCAxNCwgMTIsIDEzLCAxMiwgMTMsIDEzLCAxMSwKKyAgICAgICA5LCAxMywgMTMsIDE0LCAxMywgMTQsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDEzLAorICAgICAgMTEsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAgNywgMTEsIDExLCAxMywgMTIsIDEzLCAxNiwgMTQsIDEyLCAxNiwgMTIsIDE0LCAxNCwgMTQsIDE0LCAxMiwKKyAgICAgICA4LCAxMiwgMTIsIDEzLCAxMiwgMTQsIDE2LCAxNCwgMTMsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEyLAorICAgICAgMTEsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMCwgMTQsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTAsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAgNywgMTEsIDEyLCAxMiwgMTEsIDEzLCAxNiwgMTQsIDEyLCAxNSwgMTQsIDE0LCAxMSwgMTMsIDEzLCAxMiwKKyAgICAgICA4LCAxMiwgMTIsIDEzLCAxMywgMTMsIDE2LCAxNCwgMTMsIDE2LCAxMywgMTUsIDEzLCAxNCwgMTQsIDEyLAorICAgICAgMTEsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAgOCwgMTIsIDEzLCAxNCwgMTMsIDE0LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE1LCAxMywKKyAgICAgICA2LCAxMSwgMTEsIDEyLCAxMSwgMTIsIDEzLCAxMywgMTEsIDEzLCAxMiwgMTMsIDEyLCAxMywgMTMsIDExLAorICAgICAgIDksIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTYsIDE0LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTMsCisgICAgICAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNCwgMTMsIDE0LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDEzLAorICAgICAgIDksIDEzLCAxNCwgMTMsIDEzLCAxNiwgMTYsIDE0LCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNCwgMTMsCisgICAgICAxMCwgMTQsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTQsIDE2LCAxNCwKKyAgICAgIDExLCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTAsIDE0LCAxNiwgMTYsIDE0LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNCwgMTQsIDE0LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDEzLAorICAgICAgIDksIDEzLCAxMywgMTYsIDE0LCAxNCwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTMsCisgICAgICAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDksIDEzLCAxNCwgMTQsIDEzLCAxNiwgMTYsIDE0LCAxMywgMTYsIDE0LCAxNiwgMTQsIDE0LCAxNiwgMTIsCisgICAgICAxMCwgMTQsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNCwKKyAgICAgIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMSwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMCwgMTQsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgIDExLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTEsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNCwKKyAgICAgIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwKKyAgICAgIDExLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLAorICAgICAgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNSwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTAsIDE0LCAxNCwgMTQsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsCisgICAgICAxMCwgMTQsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNCwKKyAgICAgIDExLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LAorICAgICAgMTEsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNSwgMTQsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDEzLAorICAgICAgMTAsIDE1LCAxNCwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsCisgICAgICAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDExLCAxNCwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgIDgsIDEyLCAxMiwgMTMsIDEyLCAxNCwgMTQsIDE0LCAxMiwgMTYsIDEzLCAxNCwgMTIsIDE0LCAxNCwgMTEsCisgICAgfSwKKyAgfSwKK307CisKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnYzNF90YWJsZV9pbnRyYV9jYnBbTlVNX0lOVFJBX1RBQkxFU11bOF1bQ0JQX1ZMQ19TSVpFXSA9IHsKKyAgeworICAgIHsgMCwgIDMsICAzLCAgNCwgIDMsICA1LCAgNSwgIDUsICAyLCAgNSwgIDQsICA2LCAgNCwgIDYsICA2LCAgNiwgfSwKKyAgICB7IDAsICAyLCAgMywgIDQsICAyLCAgNSwgIDYsICA3LCAgMywgIDYsICA1LCAgNywgIDQsICA3LCAgOCwgIDgsIH0sCisgICAgeyAwLCAgMywgIDQsICA0LCAgMywgIDQsICA1LCAgNSwgIDMsICA1LCAgNCwgIDUsICA0LCAgNSwgIDUsICAzLCB9LAorICAgIHsgMCwgIDMsICAzLCAgNCwgIDMsICA0LCAgNSwgIDUsICAzLCAgNSwgIDQsICA2LCAgMywgIDUsICA2LCAgNSwgfSwKKyAgICB7IDAsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA0LCAgNCwgIDUsICA0LCAgNSwgIDQsICA0LCAgNCwgIDIsIH0sCisgICAgeyAwLCAgMywgIDMsICA0LCAgMywgIDQsICA1LCAgNSwgIDMsICA1LCAgNCwgIDUsICA0LCAgNSwgIDUsICA0LCB9LAorICAgIHsgMCwgIDYsICA2LCAgNSwgIDYsICA1LCAgNiwgIDQsICA2LCAgNiwgIDUsICA0LCAgNCwgIDQsICA0LCAgMSwgfSwKKyAgICB7IDAsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA0LCAgNCwgIDUsICA1LCAgNCwgIDQsICA0LCAgNCwgIDIsIH0sCisgIH0sCisgIHsKKyAgICB7IDAsICA0LCAgMywgIDQsICAzLCAgNCwgIDUsICA0LCAgMywgIDUsICA0LCAgNSwgIDMsICA1LCAgNSwgIDUsIH0sCisgICAgeyAwLCAgMiwgIDMsICA0LCAgMiwgIDUsICA2LCAgNywgIDMsICA2LCAgNSwgIDcsICA0LCAgNywgIDgsICA4LCB9LAorICAgIHsgMCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwgIDQsICA0LCAgNSwgIDQsICA0LCAgMywgIDQsICA0LCAgMywgfSwKKyAgICB7IDAsICAzLCAgMywgIDQsICAzLCAgNCwgIDUsICA1LCAgMywgIDUsICA0LCAgNiwgIDMsICA1LCAgNiwgIDUsIH0sCisgICAgeyAwLCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNCwgIDQsICA1LCAgNSwgIDUsICA0LCAgNCwgIDQsICAyLCB9LAorICAgIHsgMCwgIDMsICAzLCAgNCwgIDMsICA0LCAgNSwgIDUsICAzLCAgNSwgIDQsICA1LCAgNCwgIDUsICA1LCAgNCwgfSwKKyAgICB7IDAsICA1LCAgNiwgIDUsICA1LCAgNSwgIDYsICA0LCAgNiwgIDYsICA1LCAgNCwgIDUsICA0LCAgNCwgIDEsIH0sCisgICAgeyAwLCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNCwgIDQsICA1LCAgNSwgIDQsICA0LCAgNCwgIDUsICAyLCB9LAorICB9LAorICB7CisgICAgeyAwLCAgMywgIDMsICA0LCAgMywgIDQsICA0LCAgNSwgIDMsICA1LCAgNCwgIDUsICA0LCAgNSwgIDUsICA1LCB9LAorICAgIHsgMCwgIDIsICAzLCAgNCwgIDIsICA0LCAgNiwgIDcsICAzLCAgNiwgIDUsICA3LCAgNSwgIDcsICA4LCAgOCwgfSwKKyAgICB7IDAsICA0LCAgNCwgIDQsICA0LCAgNCwgIDUsICA0LCAgMywgIDUsICA0LCAgNCwgIDQsICA0LCAgNCwgIDMsIH0sCisgICAgeyAwLCAgMywgIDMsICA0LCAgMywgIDMsICA2LCAgNiwgIDMsICA2LCAgNCwgIDYsICAzLCAgNiwgIDYsICA1LCB9LAorICAgIHsgMCwgIDQsICA0LCAgNCwgIDMsICA0LCAgNSwgIDQsICA0LCAgNSwgIDQsICA0LCAgNCwgIDQsICA0LCAgMywgfSwKKyAgICB7IDAsICAzLCAgMywgIDQsICAzLCAgNCwgIDUsICA1LCAgMywgIDUsICA0LCAgNSwgIDQsICA1LCAgNSwgIDQsIH0sCisgICAgeyAwLCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNCwgIDUsICA2LCAgNSwgIDUsICA1LCAgNCwgIDQsICAxLCB9LAorICAgIHsgMCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNiwgIDQsICA0LCAgNiwgIDUsICA0LCAgNCwgIDQsICA0LCAgMiwgfSwKKyAgfSwKKyAgeworICAgIHsgMCwgIDMsICAzLCAgNCwgIDMsICA0LCAgNCwgIDUsICAzLCAgNSwgIDQsICA1LCAgNCwgIDUsICA1LCAgNSwgfSwKKyAgICB7IDAsICAyLCAgMywgIDQsICAyLCAgNCwgIDcsICA2LCAgMywgIDcsICA1LCAgNywgIDUsICA3LCAgNywgIDcsIH0sCisgICAgeyAwLCAgMywgIDMsICA0LCAgMywgIDQsICA1LCAgNSwgIDMsICA1LCAgNCwgIDUsICA0LCAgNSwgIDUsICA0LCB9LAorICAgIHsgMCwgIDMsICAzLCAgMywgIDMsICA0LCAgNiwgIDYsICAzLCAgNiwgIDQsICA2LCAgMywgIDYsICA2LCAgNSwgfSwKKyAgICB7IDAsICAzLCAgNCwgIDQsICAzLCAgNCwgIDUsICA0LCAgNCwgIDUsICA0LCAgNSwgIDQsICA1LCAgNCwgIDMsIH0sCisgICAgeyAwLCAgMywgIDMsICA0LCAgMywgIDQsICA1LCAgNSwgIDMsICA1LCAgNCwgIDUsICA0LCAgNSwgIDUsICA0LCB9LAorICAgIHsgMCwgIDQsICA1LCAgNCwgIDQsICA0LCAgNSwgIDQsICA0LCAgNSwgIDUsICA0LCAgNCwgIDQsICA0LCAgMiwgfSwKKyAgICB7IDAsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA0LCAgNCwgIDUsICA1LCAgNCwgIDQsICA0LCAgNCwgIDIsIH0sCisgIH0sCisgIHsKKyAgICB7IDAsICAzLCAgMywgIDQsICAzLCAgNCwgIDUsICA2LCAgMiwgIDUsICA0LCAgNywgIDQsICA2LCAgNiwgIDcsIH0sCisgICAgeyAwLCAgMiwgIDMsICA0LCAgMiwgIDQsICA2LCAgNywgIDMsICA3LCAgNSwgIDcsICA1LCAgNywgIDcsICA3LCB9LAorICAgIHsgMCwgIDMsICAzLCAgNCwgIDMsICA0LCAgNSwgIDUsICAzLCAgNSwgIDQsICA1LCAgNCwgIDUsICA1LCAgNCwgfSwKKyAgICB7IDAsICAyLCAgMywgIDQsICAzLCAgNCwgIDYsICA1LCAgMywgIDYsICA0LCAgNiwgIDQsICA2LCAgNiwgIDYsIH0sCisgICAgeyAwLCAgMywgIDMsICA0LCAgMywgIDQsICA1LCAgNSwgIDMsICA1LCAgNCwgIDUsICA0LCAgNSwgIDUsICA0LCB9LAorICAgIHsgMCwgIDMsICAzLCAgNCwgIDMsICA0LCAgNSwgIDUsICAzLCAgNSwgIDQsICA1LCAgNCwgIDUsICA1LCAgNCwgfSwKKyAgICB7IDAsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA0LCAgNCwgIDUsICA1LCAgNCwgIDQsICA0LCAgNCwgIDIsIH0sCisgICAgeyAwLCAgMywgIDQsICA0LCAgNCwgIDQsICA1LCAgNCwgIDQsICA1LCAgNCwgIDQsICA0LCAgNCwgIDQsICAzLCB9LAorICB9LAorfTsKKworCitzdGF0aWMgY29uc3QgdWludDhfdCBydjM0X3RhYmxlX2ludHJhX2ZpcnN0cGF0W05VTV9JTlRSQV9UQUJMRVNdWzRdW0ZJUlNUQkxLX1ZMQ19TSVpFXSA9IHsKKyAgeworICAgIHsKKyAgICAgICAwLCAxMCwgIDUsIDEwLCAgNywgMTIsICA5LCAxMSwgIDgsIDEzLCAgOSwgMTIsIDEwLCAxMywgMTEsIDEyLAorICAgICAgMTYsIDE2LCAxNCwgMTUsIDE1LCAxNiwgMTMsIDE0LCAgNSwgMTIsICA2LCAxMSwgIDksIDEzLCAxMCwgMTEsCisgICAgICAgOSwgMTQsICA5LCAxMiwgMTEsIDE0LCAxMSwgMTIsIDE2LCAxNiwgMTQsIDE1LCAxNSwgMTYsIDEzLCAxMywKKyAgICAgIDEwLCAxNSwgIDksIDEyLCAxMiwgMTYsIDExLCAxMiwgMTIsIDE2LCAxMCwgMTMsIDEzLCAxNiwgMTEsIDEyLAorICAgICAgMTYsIDE2LCAxMywgMTQsIDE1LCAxNiwgMTMsIDEyLCAgNiwgMTIsICA4LCAxMSwgIDgsIDEyLCAxMCwgMTEsCisgICAgICAgOSwgMTQsIDEwLCAxMiwgMTAsIDEzLCAxMSwgMTIsIDE1LCAxNiwgMTQsIDE1LCAxNCwgMTYsIDEzLCAxMywKKyAgICAgICA4LCAxMywgIDksIDEyLCAxMCwgMTMsIDEwLCAxMiwgMTAsIDE0LCAgOSwgMTIsIDExLCAxNCwgMTAsIDEyLAorICAgICAgMTUsIDE2LCAxMywgMTUsIDE0LCAxNiwgMTMsIDEzLCAxMSwgMTYsIDEwLCAxMywgMTMsIDE2LCAxMSwgMTIsCisgICAgICAxMiwgMTYsIDExLCAxMywgMTMsIDE2LCAxMSwgMTIsIDE2LCAxNiwgMTMsIDE0LCAxNSwgMTYsIDEyLCAxMiwKKyAgICAgIDEwLCAxNiwgMTIsIDE0LCAxMCwgMTQsIDExLCAxMiwgMTIsIDE2LCAxMywgMTQsIDExLCAxNCwgMTIsIDEyLAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNSwgMTMsIDEzLCAxMSwgMTYsIDEyLCAxNCwgMTEsIDE0LCAxMSwgMTIsCisgICAgICAxMiwgMTYsIDEyLCAxNCwgMTEsIDE0LCAxMSwgMTIsIDE2LCAxNiwgMTQsIDE1LCAxMywgMTUsIDEzLCAxMiwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxMywgMTYsIDEyLCAxMiwgMTQsIDE2LCAxMywgMTQsIDEzLCAxNiwgMTIsIDEyLAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDE0LCAxNSwgMTIsIDExLCAgMiwgMTAsICA2LCAxMCwgIDcsIDEyLCAgOSwgMTEsCisgICAgICAgOCwgMTIsICA5LCAxMSwgMTAsIDEzLCAxMCwgMTEsIDE1LCAxNiwgMTQsIDE1LCAxNCwgMTYsIDEzLCAxMywKKyAgICAgICA1LCAxMiwgIDYsIDExLCAgOSwgMTMsIDEwLCAxMSwgIDksIDEzLCAgOSwgMTEsIDEwLCAxMywgMTAsIDExLAorICAgICAgMTUsIDE2LCAxMywgMTQsIDE0LCAxNiwgMTMsIDEzLCAgOSwgMTUsICA4LCAxMiwgMTIsIDE1LCAxMSwgMTEsCisgICAgICAxMSwgMTYsIDEwLCAxMiwgMTMsIDE1LCAxMSwgMTEsIDE1LCAxNiwgMTMsIDE0LCAxNSwgMTYsIDEyLCAxMiwKKyAgICAgICA2LCAxMiwgIDgsIDExLCAgOCwgMTIsICA5LCAxMSwgIDksIDE0LCAgOSwgMTIsIDEwLCAxMywgMTAsIDExLAorICAgICAgMTUsIDE2LCAxNCwgMTUsIDE0LCAxNiwgMTMsIDEzLCAgNywgMTMsICA4LCAxMSwgIDksIDEzLCAxMCwgMTEsCisgICAgICAgOSwgMTQsICA5LCAxMiwgMTAsIDEzLCAxMCwgMTEsIDE0LCAxNiwgMTMsIDE0LCAxMywgMTYsIDEyLCAxMiwKKyAgICAgIDExLCAxNiwgMTAsIDEyLCAxMiwgMTUsIDExLCAxMSwgMTEsIDE2LCAxMCwgMTIsIDEyLCAxNSwgMTEsIDExLAorICAgICAgMTUsIDE2LCAxMiwgMTMsIDE0LCAxNiwgMTIsIDExLCAgOSwgMTUsIDExLCAxMywgIDksIDEzLCAxMSwgMTIsCisgICAgICAxMSwgMTYsIDEyLCAxNCwgMTAsIDE0LCAxMSwgMTIsIDE2LCAxNiwgMTQsIDE1LCAxMywgMTUsIDEyLCAxMiwKKyAgICAgIDExLCAxNiwgMTEsIDE0LCAxMCwgMTQsIDExLCAxMiwgMTEsIDE2LCAxMiwgMTMsIDExLCAxNCwgMTEsIDExLAorICAgICAgMTUsIDE2LCAxNCwgMTUsIDEzLCAxNCwgMTIsIDEyLCAxMywgMTYsIDEyLCAxNCwgMTMsIDE1LCAxMSwgMTEsCisgICAgICAxMywgMTYsIDEyLCAxNCwgMTMsIDE1LCAxMSwgMTEsIDE2LCAxNiwgMTMsIDE0LCAxMywgMTUsIDExLCAxMCwKKyAgICAgICA1LCAxMiwgIDcsIDExLCAgOCwgMTMsIDEwLCAxMSwgIDksIDEzLCAgOSwgMTIsIDEwLCAxNCwgMTEsIDEyLAorICAgICAgMTYsIDE2LCAxNCwgMTUsIDE0LCAxNiwgMTMsIDEzLCAgNywgMTMsICA3LCAxMSwgIDksIDEzLCAxMCwgMTEsCisgICAgICAgOSwgMTQsICA5LCAxMiwgMTEsIDE0LCAxMSwgMTIsIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTYsIDEzLCAxMywKKyAgICAgICA5LCAxNSwgIDgsIDEyLCAxMiwgMTUsIDExLCAxMiwgMTEsIDE2LCAxMCwgMTIsIDEzLCAxNiwgMTEsIDEyLAorICAgICAgMTYsIDE2LCAxMywgMTQsIDE1LCAxNiwgMTIsIDEyLCAgNywgMTMsICA4LCAxMiwgIDksIDEzLCAxMCwgMTEsCisgICAgICAxMCwgMTQsIDEwLCAxMiwgMTAsIDE0LCAxMSwgMTIsIDE2LCAxNiwgMTQsIDE1LCAxNCwgMTYsIDEzLCAxMywKKyAgICAgICA4LCAxNCwgIDksIDEyLCAxMCwgMTMsIDEwLCAxMSwgIDksIDE0LCAgOSwgMTIsIDEwLCAxNCwgMTAsIDExLAorICAgICAgMTUsIDE2LCAxMywgMTQsIDE0LCAxNiwgMTIsIDEyLCAxMSwgMTYsIDEwLCAxMiwgMTIsIDE1LCAxMSwgMTIsCisgICAgICAxMSwgMTYsIDEwLCAxMiwgMTIsIDE1LCAxMSwgMTEsIDE1LCAxNiwgMTIsIDE0LCAxNCwgMTYsIDEyLCAxMSwKKyAgICAgIDEwLCAxNiwgMTEsIDEzLCAgOSwgMTQsIDExLCAxMiwgMTIsIDE2LCAxMiwgMTQsIDExLCAxNCwgMTEsIDEyLAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNSwgMTMsIDEyLCAxMSwgMTYsIDExLCAxNCwgMTAsIDE0LCAxMSwgMTIsCisgICAgICAxMSwgMTYsIDEyLCAxNCwgMTEsIDE0LCAxMSwgMTEsIDE1LCAxNiwgMTQsIDE1LCAxMywgMTUsIDEyLCAxMiwKKyAgICAgIDEzLCAxNiwgMTIsIDE0LCAxMywgMTUsIDExLCAxMSwgMTMsIDE2LCAxMiwgMTQsIDEyLCAxNCwgMTEsIDExLAorICAgICAgMTUsIDE2LCAxMiwgMTMsIDEzLCAxNCwgMTEsIDEwLCAgNiwgMTMsICA4LCAxMSwgIDksIDEzLCAxMCwgMTEsCisgICAgICAxMCwgMTQsIDEwLCAxMiwgMTAsIDEzLCAxMCwgMTEsIDE1LCAxNiwgMTMsIDEzLCAxMywgMTQsIDEyLCAxMSwKKyAgICAgICA3LCAxMywgIDgsIDExLCAgOSwgMTMsICA5LCAxMSwgMTAsIDE0LCAgOSwgMTEsIDEwLCAxMywgMTAsIDExLAorICAgICAgMTUsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTEsIDExLCAgOSwgMTQsICA4LCAxMSwgMTAsIDEzLCAgOSwgMTAsCisgICAgICAxMSwgMTUsICA5LCAxMSwgMTEsIDEzLCAgOSwgMTAsIDE1LCAxNiwgMTIsIDEzLCAxMywgMTQsIDEwLCAgOSwKKyAgICAgICA3LCAxMywgIDgsIDExLCAgOSwgMTMsICA5LCAxMSwgMTAsIDE0LCAxMCwgMTIsIDEwLCAxMywgMTAsIDExLAorICAgICAgMTUsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTEsIDExLCAgOCwgMTMsICA4LCAxMSwgIDksIDEzLCAgOSwgMTAsCisgICAgICAgOSwgMTQsICA5LCAxMSwgMTAsIDEzLCAgOSwgMTAsIDE0LCAxNiwgMTIsIDEzLCAxMywgMTQsIDExLCAxMCwKKyAgICAgICA5LCAxNCwgIDgsIDExLCAxMCwgMTMsICA5LCAgOSwgMTAsIDE0LCAgOCwgMTEsIDEwLCAxMywgIDksICA5LAorICAgICAgMTQsIDE2LCAxMSwgMTIsIDEyLCAxNCwgMTAsICA5LCAgOSwgMTQsICA5LCAxMiwgIDgsIDEyLCAgOSwgMTAsCisgICAgICAxMSwgMTUsIDEwLCAxMiwgMTAsIDEzLCAgOSwgMTAsIDE1LCAxNiwgMTMsIDEzLCAxMiwgMTMsIDExLCAxMCwKKyAgICAgICA5LCAxNCwgIDksIDEyLCAgOSwgMTIsICA5LCAxMCwgMTAsIDE0LCAxMCwgMTIsICA5LCAxMiwgIDksICA5LAorICAgICAgMTQsIDE2LCAxMiwgMTMsIDExLCAxMywgMTAsICA5LCAxMCwgMTQsICA5LCAxMSwgMTAsIDEyLCAgOCwgIDgsCisgICAgICAxMCwgMTQsICA5LCAxMSwgMTAsIDEyLCAgOCwgIDgsIDEyLCAxNCwgIDksIDEwLCAxMCwgMTEsICA4LCAgNywKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgOSwgIDYsICA5LCAgNiwgMTAsICA4LCAgOSwgIDcsIDExLCAgOCwgMTEsICA5LCAxMSwgIDksIDEwLAorICAgICAgMTQsIDE2LCAxMywgMTQsIDEzLCAxNCwgMTIsIDExLCAgNSwgMTEsICA3LCAxMCwgIDgsIDEwLCAgOCwgIDksCisgICAgICAgOCwgMTIsICA4LCAxMSwgIDksIDEyLCAgOSwgMTAsIDE0LCAxNiwgMTIsIDEzLCAxMywgMTQsIDExLCAxMSwKKyAgICAgIDEwLCAxNCwgIDksIDExLCAxMSwgMTMsIDEwLCAxMCwgMTEsIDE1LCAgOSwgMTEsIDEyLCAxMywgMTAsIDEwLAorICAgICAgMTUsIDE2LCAxMiwgMTIsIDEzLCAxNCwgMTEsICA5LCAgNiwgMTEsICA3LCAxMCwgIDcsIDEwLCAgOCwgIDksCisgICAgICAgOCwgMTIsICA5LCAxMSwgIDksIDExLCAgOSwgMTAsIDE0LCAxNiwgMTMsIDEzLCAxMywgMTQsIDExLCAxMSwKKyAgICAgICA3LCAxMiwgIDgsIDExLCAgOCwgMTEsICA5LCAgOSwgIDksIDEzLCAgOSwgMTEsICA5LCAxMiwgIDksIDEwLAorICAgICAgMTQsIDE2LCAxMiwgMTMsIDEyLCAxNCwgMTEsIDEwLCAxMSwgMTQsIDEwLCAxMiwgMTEsIDEzLCAxMCwgMTAsCisgICAgICAxMiwgMTUsIDEwLCAxMiwgMTIsIDEzLCAxMCwgMTAsIDE1LCAxNiwgMTIsIDEyLCAxMywgMTQsIDEwLCAgOSwKKyAgICAgIDEwLCAxNCwgMTEsIDEzLCAgOSwgMTIsIDEwLCAxMCwgMTEsIDE1LCAxMiwgMTMsIDEwLCAxMiwgMTAsIDEwLAorICAgICAgMTQsIDE2LCAxMywgMTQsIDEyLCAxMywgMTEsIDEwLCAxMSwgMTQsIDExLCAxMywgMTAsIDEyLCAxMCwgMTAsCisgICAgICAxMiwgMTUsIDExLCAxMywgMTAsIDEyLCAxMCwgMTAsIDE1LCAxNiwgMTMsIDEzLCAxMiwgMTMsIDExLCAgOSwKKyAgICAgIDEzLCAxNiwgMTIsIDEzLCAxMiwgMTMsIDEwLCAgOSwgMTQsIDE2LCAxMiwgMTMsIDEyLCAxMywgMTAsICA5LAorICAgICAgMTYsIDE2LCAxMiwgMTIsIDEzLCAxMywgMTAsICA3LCAgNCwgMTAsICA2LCAgOSwgIDcsIDEwLCAgOCwgIDksCisgICAgICAgOCwgMTIsICA5LCAxMSwgIDksIDExLCAgOSwgIDksIDE0LCAxNiwgMTMsIDEzLCAxMywgMTQsIDExLCAxMSwKKyAgICAgICA2LCAxMSwgIDcsIDEwLCAgOCwgMTEsICA4LCAgOSwgIDksIDEyLCAgOSwgMTEsICA5LCAxMiwgIDksICA5LAorICAgICAgMTQsIDE2LCAxMiwgMTMsIDEzLCAxNCwgMTEsIDEwLCAxMCwgMTQsICA5LCAxMSwgMTEsIDEzLCAgOSwgIDksCisgICAgICAxMSwgMTQsICA5LCAxMSwgMTEsIDEzLCAxMCwgIDksIDE0LCAxNiwgMTEsIDEyLCAxMywgMTQsIDEwLCAgOSwKKyAgICAgICA2LCAxMSwgIDgsIDEwLCAgNywgMTAsICA4LCAgOSwgIDksIDEyLCAgOSwgMTEsICA5LCAxMSwgIDksICA5LAorICAgICAgMTQsIDE2LCAxMywgMTMsIDEyLCAxMywgMTEsIDEwLCAgOCwgMTIsICA4LCAxMCwgIDgsIDExLCAgOSwgIDksCisgICAgICAgOSwgMTIsICA5LCAxMSwgIDksIDExLCAgOSwgIDksIDE0LCAxNiwgMTIsIDEzLCAxMiwgMTMsIDExLCAxMCwKKyAgICAgIDExLCAxNCwgMTAsIDExLCAxMSwgMTMsICA5LCAgOSwgMTEsIDE0LCAxMCwgMTEsIDExLCAxMywgIDksICA5LAorICAgICAgMTQsIDE2LCAxMSwgMTIsIDEzLCAxNCwgMTAsICA4LCAxMCwgMTQsIDExLCAxMiwgIDksIDEyLCAxMCwgMTAsCisgICAgICAxMSwgMTQsIDExLCAxMywgMTAsIDEyLCAxMCwgMTAsIDE0LCAxNiwgMTMsIDE0LCAxMiwgMTMsIDExLCAgOSwKKyAgICAgIDExLCAxNCwgMTEsIDEyLCAxMCwgMTIsIDEwLCAxMCwgMTEsIDE0LCAxMSwgMTIsIDEwLCAxMiwgMTAsICA5LAorICAgICAgMTQsIDE2LCAxMywgMTMsIDExLCAxMiwgMTAsICA5LCAxMywgMTYsIDEyLCAxMywgMTIsIDEzLCAxMCwgIDksCisgICAgICAxMywgMTYsIDExLCAxMiwgMTEsIDEzLCAxMCwgIDgsIDE1LCAxNiwgMTIsIDEyLCAxMiwgMTIsICA5LCAgNywKKyAgICAgICA4LCAxMiwgIDgsIDExLCAgOSwgMTIsICA5LCAxMCwgMTAsIDE0LCAxMCwgMTIsIDExLCAxMywgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTIsIDExLCAgOCwgMTMsICA4LCAxMSwgIDksIDEyLCAxMCwgMTAsCisgICAgICAxMSwgMTQsIDEwLCAxMiwgMTEsIDEzLCAxMCwgMTAsIDE2LCAxNiwgMTMsIDE0LCAxNCwgMTQsIDEyLCAxMSwKKyAgICAgIDExLCAxNCwgIDksIDEyLCAxMSwgMTMsIDEwLCAxMCwgMTIsIDE1LCAxMCwgMTIsIDEyLCAxNCwgMTAsIDEwLAorICAgICAgMTUsIDE2LCAxMiwgMTIsIDE0LCAxNCwgMTEsICA5LCAgOSwgMTMsICA5LCAxMSwgIDksIDEyLCAxMCwgMTAsCisgICAgICAxMSwgMTQsIDEwLCAxMiwgMTAsIDEyLCAxMCwgMTAsIDE1LCAxNiwgMTQsIDE0LCAxMywgMTQsIDEyLCAxMSwKKyAgICAgICA5LCAxMywgIDksIDExLCAxMCwgMTIsIDEwLCAxMCwgMTAsIDE0LCAxMCwgMTIsIDEwLCAxMiwgMTAsIDEwLAorICAgICAgMTUsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTEsIDEwLCAxMSwgMTUsIDEwLCAxMiwgMTEsIDEzLCAxMCwgMTAsCisgICAgICAxMSwgMTUsIDEwLCAxMiwgMTIsIDEzLCAxMCwgIDksIDE1LCAxNiwgMTEsIDEyLCAxMywgMTQsIDEwLCAgOSwKKyAgICAgIDExLCAxNSwgMTEsIDEzLCAxMCwgMTIsIDEwLCAxMCwgMTIsIDE2LCAxMiwgMTMsIDExLCAxMywgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDEyLCAxMywgMTEsICA5LCAxMSwgMTUsIDExLCAxMywgMTAsIDEzLCAxMCwgMTAsCisgICAgICAxMiwgMTUsIDEyLCAxMywgMTAsIDEyLCAxMCwgMTAsIDE0LCAxNiwgMTMsIDEzLCAxMiwgMTMsIDEwLCAgOSwKKyAgICAgIDEzLCAxNiwgMTIsIDEzLCAxMiwgMTMsIDEwLCAgOSwgMTMsIDE2LCAxMSwgMTIsIDExLCAxMywgMTAsICA5LAorICAgICAgMTQsIDE2LCAxMSwgMTIsIDEyLCAxMiwgIDksICA3LCAxMCwgMTUsIDEwLCAxMiwgMTEsIDEzLCAxMCwgMTAsCisgICAgICAxMiwgMTYsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTUsIDEyLCAxMCwKKyAgICAgIDEwLCAxNCwgMTAsIDEyLCAxMCwgMTMsIDEwLCAxMCwgMTIsIDE1LCAxMSwgMTIsIDExLCAxMywgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxNCwgMTMsIDE0LCAxNCwgMTEsICA5LCAxMSwgMTQsIDEwLCAxMSwgMTEsIDEyLCAgOSwgIDksCisgICAgICAxMiwgMTUsIDEwLCAxMSwgMTEsIDEzLCAgOSwgIDgsIDE2LCAxNiwgMTIsIDEyLCAxMywgMTMsIDEwLCAgNywKKyAgICAgIDEwLCAxNSwgMTAsIDEyLCAxMCwgMTMsIDEwLCAxMCwgMTIsIDE1LCAxMSwgMTIsIDExLCAxMywgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxNCwgMTMsIDE0LCAxNCwgMTEsICA5LCAxMCwgMTQsIDEwLCAxMiwgMTAsIDEyLCAxMCwgMTAsCisgICAgICAxMiwgMTUsIDExLCAxMiwgMTEsIDEzLCAxMCwgMTAsIDE2LCAxNiwgMTMsIDEzLCAxMywgMTQsIDExLCAgOSwKKyAgICAgIDExLCAxNCwgMTAsIDExLCAxMCwgMTIsICA5LCAgOCwgMTEsIDE0LCAgOSwgMTEsIDExLCAxMiwgIDksICA4LAorICAgICAgMTQsIDE2LCAxMCwgMTEsIDEyLCAxMywgIDksICA3LCAxMSwgMTUsIDExLCAxMiwgMTAsIDEyLCAxMCwgIDksCisgICAgICAxMywgMTYsIDExLCAxMiwgMTEsIDEyLCAxMCwgIDksIDE2LCAxNiwgMTMsIDEzLCAxMiwgMTMsIDEwLCAgNywKKyAgICAgIDExLCAxNSwgMTAsIDEyLCAxMCwgMTIsICA5LCAgOCwgMTIsIDE1LCAxMSwgMTIsIDEwLCAxMiwgIDksICA4LAorICAgICAgMTQsIDE2LCAxMiwgMTIsIDExLCAxMiwgIDksICA3LCAxMSwgMTQsIDEwLCAxMSwgMTAsIDEyLCAgOCwgIDcsCisgICAgICAxMSwgMTQsICA5LCAxMCwgMTAsIDExLCAgOCwgIDYsIDEyLCAxNSwgIDksICA5LCAgOSwgMTAsICA3LCAgNCwKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgNiwgIDMsICA3LCAgMywgIDcsICA2LCAgNywgIDUsICA5LCAgNiwgIDksICA3LCAgOSwgIDgsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAgMywgIDgsICA1LCAgOCwgIDYsICA4LCAgNywgIDcsCisgICAgICAgNywgMTEsICA3LCAxMCwgIDgsIDEwLCAgOCwgIDksIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxMCwKKyAgICAgICA4LCAxNiwgIDcsIDExLCAxMCwgMTYsICA5LCAgOSwgMTEsIDE2LCAgOSwgMTQsIDE2LCAxNiwgMTAsICA5LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEwLCAgMywgIDgsICA1LCAgOCwgIDUsICA4LCAgNywgIDcsCisgICAgICAgNywgMTEsICA4LCAxMCwgIDgsIDEwLCAgOCwgIDksIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMSwKKyAgICAgICA2LCAxMCwgIDcsICA5LCAgNywgMTAsICA4LCAgOCwgIDgsIDExLCAgOCwgMTAsICA4LCAxMSwgIDgsICA4LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsIDEwLCAxMCwgMTYsICA5LCAxMywgMTEsIDE2LCAxMCwgIDksCisgICAgICAxMSwgMTYsICA5LCAxMSwgMTYsIDE2LCAxMCwgIDksIDE2LCAxNiwgMTEsIDE2LCAxNiwgMTYsIDExLCAgOSwKKyAgICAgICA5LCAxNiwgMTAsIDExLCAgOCwgMTEsICA5LCAgOSwgMTEsIDE2LCAxMiwgMTYsIDEwLCAxNiwgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEwLCAxMCwgMTYsIDExLCAxNiwgMTAsIDE2LCAxMCwgMTAsCisgICAgICAxMSwgMTYsIDExLCAxNiwgMTAsIDE2LCAxMCwgIDksIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAgOSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsICA5LAorICAgICAgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNiwgIDksICA3LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICB9LAorICAgIHsKKyAgICAgICAyLCAgOCwgIDUsICA5LCAgNiwgIDksICA4LCAgOCwgIDgsIDEyLCAgOSwgMTEsICA5LCAxMSwgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTQsIDEyLCAgNSwgMTAsICA2LCAgOSwgIDgsIDEwLCAgOCwgIDksCisgICAgICAgOSwgMTIsICA5LCAxMSwgMTAsIDEyLCAxMCwgMTAsIDE2LCAxNiwgMTQsIDE1LCAxNSwgMTYsIDEzLCAxMiwKKyAgICAgIDEwLCAxMywgIDksIDEyLCAxMSwgMTIsIDEwLCAxMCwgMTIsIDE1LCAxMSwgMTIsIDEyLCAxMywgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxNSwgMTQsIDE1LCAxNiwgMTMsIDEyLCAgNiwgMTAsICA4LCAxMCwgIDcsIDEwLCAgOCwgIDksCisgICAgICAgOSwgMTMsIDEwLCAxMSwgMTAsIDEyLCAxMCwgMTAsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEzLCAxMiwKKyAgICAgICA3LCAxMSwgIDgsIDExLCAgOSwgMTEsICA5LCAgOSwgMTAsIDEzLCAxMCwgMTEsIDEwLCAxMiwgMTAsICA5LAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDE0LCAxNSwgMTIsIDExLCAxMSwgMTQsIDExLCAxMiwgMTEsIDEzLCAxMCwgMTAsCisgICAgICAxMiwgMTUsIDExLCAxMywgMTIsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTUsIDEzLCAxMSwKKyAgICAgIDEwLCAxMywgMTEsIDEyLCAxMCwgMTIsIDEwLCAxMCwgMTIsIDE1LCAxMiwgMTMsIDExLCAxMywgMTEsIDExLAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNSwgMTMsIDExLCAxMSwgMTQsIDExLCAxMywgMTEsIDEyLCAxMSwgMTAsCisgICAgICAxMiwgMTYsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTUsIDE2LCAxMywgMTUsIDEyLCAxMSwKKyAgICAgIDEzLCAxNSwgMTIsIDEzLCAxMywgMTQsIDExLCAxMSwgMTQsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTEsIDExLAorICAgICAgMTYsIDE2LCAxNSwgMTQsIDE1LCAxNSwgMTIsIDEwLCAgMywgIDgsICA2LCAgOSwgIDcsICA5LCAgOCwgIDgsCisgICAgICAgOCwgMTIsICA5LCAxMSwgIDksIDExLCAgOSwgIDksIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTYsIDEzLCAxMiwKKyAgICAgICA2LCAxMCwgIDcsICA5LCAgOCwgMTAsICA4LCAgOCwgIDksIDEyLCAgOSwgMTEsIDEwLCAxMiwgMTAsICA5LAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDE0LCAxNSwgMTMsIDExLCAxMCwgMTMsICA5LCAxMSwgMTEsIDEyLCAxMCwgMTAsCisgICAgICAxMiwgMTQsIDExLCAxMiwgMTIsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTQsIDE0LCAxNSwgMTUsIDEzLCAxMSwKKyAgICAgICA2LCAxMCwgIDgsIDEwLCAgNywgMTAsICA4LCAgOSwgMTAsIDEyLCAxMCwgMTEsIDEwLCAxMSwgMTAsICA5LAorICAgICAgMTYsIDE2LCAxNCwgMTUsIDE0LCAxNSwgMTMsIDExLCAgOCwgMTEsICA4LCAxMCwgIDksIDExLCAgOSwgIDksCisgICAgICAgOSwgMTMsICA5LCAxMSwgMTAsIDExLCAgOSwgIDksIDE2LCAxNiwgMTMsIDE0LCAxNCwgMTQsIDEyLCAxMCwKKyAgICAgIDExLCAxNCwgMTAsIDEyLCAxMSwgMTIsIDEwLCAxMCwgMTIsIDE0LCAxMSwgMTIsIDEyLCAxMywgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxMywgMTQsIDE1LCAxNSwgMTIsIDEwLCAxMCwgMTMsIDExLCAxMiwgMTAsIDEyLCAxMCwgMTAsCisgICAgICAxMiwgMTQsIDEyLCAxMywgMTEsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTUsIDE0LCAxNCwgMTQsIDEyLCAxMSwKKyAgICAgIDExLCAxNCwgMTEsIDEyLCAxMCwgMTIsIDEwLCAxMCwgMTIsIDE1LCAxMiwgMTIsIDExLCAxMywgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxNCwgMTUsIDEzLCAxNCwgMTIsIDEwLCAxMywgMTUsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxMywgMTYsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTMsIDE0LCAxMywgMTUsIDExLCAgOSwKKyAgICAgICA2LCAxMCwgIDgsIDEwLCAgOCwgMTEsICA5LCAxMCwgMTEsIDEzLCAxMSwgMTIsIDExLCAxMywgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDEyLCAgOCwgMTEsICA5LCAxMSwgIDksIDExLCAxMCwgMTAsCisgICAgICAxMSwgMTQsIDExLCAxMiwgMTEsIDEyLCAxMSwgMTAsIDE2LCAxNiwgMTUsIDE1LCAxNiwgMTYsIDEzLCAxMiwKKyAgICAgIDExLCAxNCwgMTAsIDEyLCAxMiwgMTMsIDExLCAxMCwgMTMsIDE2LCAxMiwgMTMsIDEzLCAxNCwgMTEsIDExLAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTMsIDEyLCAgOCwgMTIsICA5LCAxMSwgIDksIDExLCAxMCwgMTAsCisgICAgICAxMSwgMTQsIDExLCAxMiwgMTEsIDEyLCAxMSwgMTAsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLCAxMiwKKyAgICAgICA5LCAxMiwgMTAsIDExLCAxMCwgMTIsIDEwLCAxMCwgMTEsIDE0LCAxMSwgMTIsIDExLCAxMywgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxNSwgMTQsIDE1LCAxNSwgMTMsIDExLCAxMiwgMTQsIDExLCAxMywgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxMiwgMTUsIDExLCAxMiwgMTMsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTQsIDE1LCAxNiwgMTUsIDEzLCAxMSwKKyAgICAgIDExLCAxNSwgMTIsIDEzLCAxMSwgMTMsIDExLCAxMCwgMTMsIDE2LCAxMywgMTQsIDEyLCAxNCwgMTEsIDExLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTMsIDEyLCAxMiwgMTQsIDEyLCAxMywgMTEsIDEzLCAxMSwgMTAsCisgICAgICAxMywgMTUsIDEyLCAxMywgMTEsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTUsIDE1LCAxMywgMTUsIDEzLCAxMSwKKyAgICAgIDEzLCAxNiwgMTMsIDEzLCAxMywgMTMsIDEyLCAxMSwgMTMsIDE2LCAxMywgMTMsIDEzLCAxMywgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxMywgMTUsIDE0LCAxNCwgMTIsICA5LCAgOSwgMTMsIDEwLCAxMiwgMTEsIDEzLCAxMSwgMTEsCisgICAgICAxMywgMTYsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTEsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxMiwKKyAgICAgIDEwLCAxNCwgMTEsIDEzLCAxMSwgMTMsIDExLCAxMCwgMTMsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTIsIDExLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDEyLCAxMSwgMTUsIDExLCAxMywgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxNCwgMTYsIDEyLCAxMywgMTMsIDE0LCAxMiwgMTAsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDEzLCAxMSwKKyAgICAgIDEwLCAxNCwgMTEsIDEyLCAxMSwgMTMsIDExLCAxMCwgMTMsIDE2LCAxMiwgMTMsIDEyLCAxNCwgMTIsIDExLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDEyLCAxMSwgMTQsIDExLCAxMiwgMTEsIDEzLCAxMSwgMTAsCisgICAgICAxMywgMTUsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTUsIDE1LCAxNiwgMTYsIDEzLCAxMSwKKyAgICAgIDEyLCAxNSwgMTIsIDEzLCAxMiwgMTMsIDExLCAxMCwgMTMsIDE2LCAxMiwgMTMsIDEzLCAxMywgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDE2LCAxNSwgMTMsIDEwLCAxMiwgMTUsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxNCwgMTYsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTEsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDEzLCAxMSwKKyAgICAgIDEyLCAxNiwgMTIsIDEzLCAxMiwgMTMsIDExLCAxMCwgMTMsIDE2LCAxMywgMTMsIDEyLCAxNCwgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNSwgMTMsIDEwLCAxMiwgMTUsIDEyLCAxNCwgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxMywgMTYsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTMsIDE0LCAxMywgMTQsIDExLCAgOCwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDAsIDExLCAgNSwgMTEsICA3LCAxMywgMTAsIDEyLCAgNywgMTMsICA5LCAxMywgMTAsIDE0LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTUsICA0LCAxMywgIDYsIDEyLCAxMCwgMTQsIDExLCAxMiwKKyAgICAgICA4LCAxNCwgIDksIDEzLCAxMSwgMTUsIDEyLCAxMywgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNiwgMTUsIDE0LAorICAgICAgIDksIDE2LCAgOSwgMTMsIDEzLCAxNiwgMTIsIDEzLCAxMiwgMTYsIDEwLCAxNCwgMTQsIDE2LCAxMywgMTMsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTQsICA1LCAxMywgIDgsIDEzLCAgOCwgMTMsIDExLCAxMiwKKyAgICAgICA5LCAxNCwgMTAsIDEzLCAxMCwgMTQsIDEyLCAxMywgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNiwgMTQsIDE1LAorICAgICAgIDcsIDE0LCAgOSwgMTMsIDEwLCAxNCwgMTEsIDEzLCAgOSwgMTUsIDEwLCAxMywgMTEsIDE0LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTUsIDE2LCAxNCwgMTQsIDExLCAxNiwgMTEsIDE0LCAxMywgMTYsIDEyLCAxMywKKyAgICAgIDEyLCAxNiwgMTEsIDE0LCAxNCwgMTYsIDEyLCAxMywgMTYsIDE2LCAxNCwgMTUsIDE2LCAxNiwgMTQsIDEzLAorICAgICAgMTAsIDE2LCAxMiwgMTUsIDEwLCAxNSwgMTIsIDE0LCAxMiwgMTYsIDEzLCAxNiwgMTEsIDE1LCAxMywgMTQsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTQsIDExLCAxNiwgMTIsIDE1LCAxMSwgMTYsIDEyLCAxMywKKyAgICAgIDEyLCAxNiwgMTMsIDE1LCAxMiwgMTYsIDEyLCAxMywgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE0LAorICAgICAgMTQsIDE2LCAxMywgMTUsIDE0LCAxNiwgMTMsIDEzLCAxNCwgMTYsIDE0LCAxNSwgMTQsIDE2LCAxMywgMTMsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxMywgMTMsICAyLCAxMiwgIDYsIDExLCAgNywgMTMsIDEwLCAxMiwKKyAgICAgICA3LCAxMywgIDksIDEyLCAxMCwgMTQsIDExLCAxMiwgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNiwgMTQsIDE1LAorICAgICAgIDUsIDEzLCAgNiwgMTIsICA5LCAxMywgMTAsIDEyLCAgOCwgMTQsICA5LCAxMywgMTEsIDE0LCAxMSwgMTMsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTUsIDE2LCAxNCwgMTQsICA5LCAxNiwgIDgsIDEzLCAxMiwgMTYsIDExLCAxMywKKyAgICAgIDExLCAxNiwgMTAsIDEzLCAxMywgMTYsIDEyLCAxMywgMTYsIDE2LCAxMywgMTUsIDE2LCAxNiwgMTMsIDEzLAorICAgICAgIDUsIDEzLCAgOCwgMTIsICA3LCAxMywgMTAsIDEyLCAgOCwgMTQsIDEwLCAxMywgMTAsIDE0LCAxMSwgMTMsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTUsIDE2LCAxNCwgMTQsICA3LCAxNCwgIDgsIDEyLCAgOSwgMTQsIDExLCAxMiwKKyAgICAgICA4LCAxNCwgIDksIDEzLCAxMCwgMTQsIDExLCAxMiwgMTUsIDE2LCAxNCwgMTUsIDE0LCAxNiwgMTMsIDE0LAorICAgICAgMTEsIDE2LCAxMCwgMTMsIDEzLCAxNiwgMTIsIDEzLCAxMSwgMTYsIDEwLCAxMywgMTMsIDE2LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDEzLCAxNSwgMTUsIDE2LCAxMywgMTMsICA5LCAxNiwgMTIsIDE1LCAgOSwgMTQsIDExLCAxMywKKyAgICAgIDExLCAxNiwgMTMsIDE1LCAxMSwgMTQsIDEyLCAxMywgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNiwgMTQsIDE0LAorICAgICAgMTEsIDE2LCAxMiwgMTQsIDExLCAxNSwgMTIsIDEzLCAxMSwgMTYsIDEyLCAxNCwgMTEsIDE1LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxMywgMTMsIDEzLCAxNiwgMTMsIDE1LCAxMywgMTYsIDEyLCAxMywKKyAgICAgIDE0LCAxNiwgMTMsIDE1LCAxMywgMTYsIDEyLCAxMiwgMTYsIDE2LCAxNCwgMTUsIDE0LCAxNiwgMTIsIDEyLAorICAgICAgIDQsIDEzLCAgNywgMTIsICA4LCAxNCwgMTEsIDEyLCAgOSwgMTQsIDEwLCAxMywgMTEsIDE0LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTUsICA2LCAxNCwgIDcsIDEyLCAxMCwgMTQsIDExLCAxMiwKKyAgICAgICA5LCAxNSwgMTAsIDEzLCAxMSwgMTUsIDEyLCAxMywgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE0LAorICAgICAgIDksIDE2LCAgOCwgMTMsIDEyLCAxNiwgMTEsIDEzLCAxMiwgMTYsIDEwLCAxNCwgMTMsIDE2LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTQsICA2LCAxNCwgIDgsIDEzLCAgOCwgMTQsIDExLCAxMywKKyAgICAgICA5LCAxNSwgMTAsIDEzLCAxMSwgMTQsIDEyLCAxMywgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE0LAorICAgICAgIDcsIDE1LCAgOSwgMTMsIDEwLCAxNCwgMTEsIDEzLCAgOSwgMTUsIDEwLCAxMywgMTEsIDE0LCAxMSwgMTMsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTUsIDE2LCAxNCwgMTQsIDEwLCAxNiwgMTAsIDEzLCAxMiwgMTYsIDEyLCAxMywKKyAgICAgIDExLCAxNiwgMTAsIDEzLCAxMywgMTYsIDEyLCAxMywgMTYsIDE2LCAxMywgMTQsIDE1LCAxNiwgMTMsIDEzLAorICAgICAgIDksIDE2LCAxMiwgMTQsICA5LCAxNCwgMTEsIDEzLCAxMiwgMTYsIDEyLCAxNSwgMTEsIDE1LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTQsIDEwLCAxNiwgMTIsIDE1LCAxMSwgMTUsIDEyLCAxMywKKyAgICAgIDExLCAxNiwgMTIsIDE0LCAxMSwgMTUsIDEyLCAxMywgMTYsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTMsIDEzLAorICAgICAgMTMsIDE2LCAxMywgMTUsIDEzLCAxNiwgMTIsIDEzLCAxMywgMTYsIDEyLCAxNCwgMTMsIDE2LCAxMiwgMTIsCisgICAgICAxNSwgMTYsIDEzLCAxNCwgMTMsIDE2LCAxMiwgMTIsICA2LCAxNCwgIDgsIDEzLCAgOSwgMTQsIDEwLCAxMiwKKyAgICAgIDEwLCAxNSwgMTAsIDEyLCAxMSwgMTQsIDExLCAxMiwgMTYsIDE2LCAxNCwgMTQsIDE0LCAxNiwgMTMsIDEzLAorICAgICAgIDcsIDE1LCAgOCwgMTMsICA5LCAxNCwgMTAsIDEyLCAxMCwgMTUsIDEwLCAxMywgMTEsIDE0LCAxMSwgMTIsCisgICAgICAxNiwgMTYsIDE0LCAxNCwgMTQsIDE2LCAxMywgMTIsICA5LCAxNiwgIDgsIDEyLCAxMSwgMTQsIDEwLCAxMSwKKyAgICAgIDExLCAxNiwgMTAsIDEzLCAxMSwgMTQsIDEwLCAxMSwgMTYsIDE2LCAxMywgMTQsIDE0LCAxNiwgMTIsIDExLAorICAgICAgIDcsIDE0LCAgOSwgMTMsICA5LCAxNCwgMTAsIDEyLCAxMCwgMTYsIDEwLCAxMywgMTEsIDE0LCAxMSwgMTIsCisgICAgICAxNiwgMTYsIDE0LCAxNCwgMTQsIDE1LCAxMywgMTIsICA3LCAxNCwgIDksIDEzLCAgOSwgMTQsIDEwLCAxMiwKKyAgICAgICA5LCAxNCwgMTAsIDEyLCAxMCwgMTQsIDExLCAxMiwgMTUsIDE2LCAxMywgMTQsIDE0LCAxNSwgMTIsIDEyLAorICAgICAgIDksIDE1LCAgOSwgMTIsIDExLCAxNCwgMTAsIDExLCAxMCwgMTUsICA5LCAxMiwgMTEsIDE0LCAxMCwgMTEsCisgICAgICAxNCwgMTYsIDExLCAxMywgMTMsIDE1LCAxMSwgMTEsICA5LCAxNiwgMTAsIDEzLCAgOSwgMTQsIDEwLCAxMSwKKyAgICAgIDExLCAxNiwgMTEsIDEzLCAxMCwgMTQsIDEwLCAxMSwgMTYsIDE2LCAxNCwgMTUsIDEzLCAxNSwgMTIsIDEyLAorICAgICAgIDksIDE2LCAxMCwgMTMsICA5LCAxMywgMTAsIDExLCAxMCwgMTUsIDEwLCAxMywgMTAsIDEzLCAxMCwgMTEsCisgICAgICAxNCwgMTYsIDEzLCAxNCwgMTIsIDE0LCAxMSwgMTEsIDExLCAxNiwgMTAsIDEzLCAxMSwgMTMsICA5LCAxMCwKKyAgICAgIDExLCAxNCwgMTAsIDEyLCAxMCwgMTMsICA5LCAgOSwgMTMsIDE1LCAxMCwgMTEsIDExLCAxMiwgIDksICA4LAorICAgIH0sCisgICAgeworICAgICAgIDAsIDEwLCAgNSwgMTAsICA2LCAxMSwgIDgsIDEwLCAgNywgMTIsICA4LCAxMSwgIDksIDEyLCAgOSwgMTAsCisgICAgICAxNCwgMTYsIDEzLCAxMywgMTMsIDE0LCAxMiwgMTEsICA1LCAxMiwgIDYsIDEwLCAgOCwgMTIsICA5LCAxMCwKKyAgICAgICA4LCAxMywgIDgsIDExLCAgOSwgMTIsICA5LCAxMCwgMTQsIDE2LCAxMiwgMTMsIDEzLCAxNCwgMTEsIDExLAorICAgICAgIDksIDE1LCAgOCwgMTIsIDExLCAxNCwgMTAsIDEwLCAxMSwgMTYsICA5LCAxMiwgMTIsIDE0LCAxMCwgMTAsCisgICAgICAxNCwgMTYsIDExLCAxMiwgMTMsIDE0LCAxMSwgMTAsICA1LCAxMiwgIDgsIDExLCAgNywgMTEsICA5LCAxMCwKKyAgICAgICA4LCAxMywgIDksIDExLCAgOSwgMTIsICA5LCAxMCwgMTQsIDE2LCAxMiwgMTMsIDEzLCAxNCwgMTEsIDExLAorICAgICAgIDcsIDEzLCAgOCwgMTEsICA5LCAxMiwgIDksIDEwLCAgOSwgMTMsICA5LCAxMSwgIDksIDEyLCAgOSwgMTAsCisgICAgICAxNCwgMTYsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTAsIDExLCAxNSwgMTAsIDEyLCAxMiwgMTQsIDEwLCAxMCwKKyAgICAgIDEyLCAxNiwgMTAsIDEyLCAxMiwgMTQsIDEwLCAxMCwgMTQsIDE2LCAxMSwgMTIsIDEzLCAxNCwgMTAsICA5LAorICAgICAgMTAsIDE1LCAxMSwgMTMsICA5LCAxMywgMTAsIDEwLCAxMSwgMTUsIDEyLCAxMywgMTAsIDEyLCAxMCwgMTAsCisgICAgICAxNCwgMTYsIDEzLCAxNCwgMTIsIDEzLCAxMSwgMTAsIDExLCAxNiwgMTEsIDEzLCAxMCwgMTMsIDEwLCAxMCwKKyAgICAgIDExLCAxNiwgMTEsIDEzLCAxMCwgMTMsIDEwLCAxMCwgMTQsIDE2LCAxMywgMTQsIDEyLCAxMywgMTEsICA5LAorICAgICAgMTMsIDE2LCAxMiwgMTMsIDEyLCAxNCwgMTEsIDEwLCAxNCwgMTYsIDEyLCAxMywgMTIsIDE0LCAxMCwgIDksCisgICAgICAxNiwgMTYsIDEyLCAxMywgMTMsIDEzLCAxMCwgIDgsICAzLCAxMSwgIDYsIDEwLCAgNywgMTEsICA5LCAxMCwKKyAgICAgICA4LCAxMiwgIDgsIDExLCAgOSwgMTIsICA5LCAxMCwgMTQsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTEsIDExLAorICAgICAgIDUsIDEyLCAgNiwgMTAsICA4LCAxMiwgIDksIDEwLCAgOCwgMTMsICA4LCAxMSwgIDksIDEyLCAgOSwgMTAsCisgICAgICAxNCwgMTYsIDEyLCAxMywgMTMsIDE0LCAxMSwgMTAsICA5LCAxNCwgIDgsIDExLCAxMSwgMTQsIDEwLCAxMCwKKyAgICAgIDExLCAxNSwgIDksIDExLCAxMiwgMTQsIDEwLCAxMCwgMTQsIDE2LCAxMSwgMTIsIDEzLCAxNCwgMTEsICA5LAorICAgICAgIDYsIDEyLCAgOCwgMTEsICA3LCAxMSwgIDksIDEwLCAgOCwgMTMsICA5LCAxMSwgIDksIDEyLCAgOSwgMTAsCisgICAgICAxNCwgMTYsIDEyLCAxMywgMTMsIDEzLCAxMSwgMTAsICA3LCAxMywgIDgsIDExLCAgOCwgMTIsICA5LCAxMCwKKyAgICAgICA5LCAxMywgIDksIDExLCAgOSwgMTIsICA5LCAgOSwgMTQsIDE2LCAxMiwgMTMsIDEyLCAxMywgMTEsIDEwLAorICAgICAgMTAsIDE1LCAgOSwgMTIsIDExLCAxNCwgMTAsIDEwLCAxMSwgMTUsICA5LCAxMSwgMTEsIDEzLCAxMCwgIDksCisgICAgICAxNCwgMTYsIDExLCAxMiwgMTMsIDE0LCAxMCwgIDksICA5LCAxNSwgMTEsIDEzLCAgOSwgMTIsIDEwLCAxMCwKKyAgICAgIDExLCAxNSwgMTEsIDEzLCAgOSwgMTIsIDEwLCAxMCwgMTQsIDE2LCAxMywgMTQsIDEyLCAxMywgMTEsIDEwLAorICAgICAgMTAsIDE1LCAxMSwgMTMsIDEwLCAxMywgMTAsIDEwLCAxMSwgMTUsIDExLCAxMywgMTAsIDEyLCAxMCwgMTAsCisgICAgICAxNCwgMTYsIDEyLCAxMywgMTEsIDEyLCAxMCwgIDksIDEzLCAxNiwgMTIsIDEzLCAxMiwgMTQsIDEwLCAgOSwKKyAgICAgIDEzLCAxNiwgMTEsIDEyLCAxMiwgMTMsIDEwLCAgOSwgMTQsIDE2LCAxMSwgMTIsIDEyLCAxMywgIDksICA4LAorICAgICAgIDcsIDEzLCAgOCwgMTIsICA5LCAxMywgMTAsIDExLCAxMCwgMTQsIDEwLCAxMiwgMTEsIDEzLCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDEzLCAxNCwgMTQsIDE0LCAxMiwgMTEsICA4LCAxNCwgIDgsIDEyLCAgOSwgMTMsIDEwLCAxMCwKKyAgICAgIDEwLCAxNCwgMTAsIDEyLCAxMSwgMTMsIDEwLCAxMCwgMTYsIDE2LCAxMywgMTMsIDE0LCAxNCwgMTIsIDExLAorICAgICAgMTAsIDE1LCAgOSwgMTIsIDExLCAxNCwgMTAsIDEwLCAxMiwgMTYsIDEwLCAxMiwgMTIsIDE0LCAxMCwgMTAsCisgICAgICAxNiwgMTYsIDEyLCAxMywgMTQsIDE1LCAxMSwgMTAsICA4LCAxNCwgIDksIDEyLCAgOSwgMTMsIDEwLCAxMSwKKyAgICAgIDEwLCAxNSwgMTAsIDEyLCAxMCwgMTMsIDEwLCAxMSwgMTYsIDE2LCAxMywgMTQsIDE0LCAxNCwgMTIsIDExLAorICAgICAgIDgsIDE0LCAgOSwgMTIsICA5LCAxMywgMTAsIDEwLCAxMCwgMTQsIDEwLCAxMiwgMTAsIDEzLCAxMCwgMTAsCisgICAgICAxNSwgMTYsIDEzLCAxMywgMTMsIDE0LCAxMSwgMTAsIDEwLCAxNSwgMTAsIDEyLCAxMiwgMTQsIDEwLCAxMCwKKyAgICAgIDExLCAxNiwgIDksIDEyLCAxMiwgMTQsIDEwLCAxMCwgMTQsIDE2LCAxMSwgMTIsIDEzLCAxNCwgMTAsICA5LAorICAgICAgMTEsIDE2LCAxMSwgMTMsIDEwLCAxMywgMTAsIDEwLCAxMiwgMTYsIDEyLCAxMywgMTAsIDEzLCAxMSwgMTAsCisgICAgICAxNSwgMTYsIDE0LCAxNCwgMTIsIDEzLCAxMSwgMTAsIDExLCAxNiwgMTEsIDEzLCAxMCwgMTMsIDEwLCAxMCwKKyAgICAgIDExLCAxNiwgMTIsIDEzLCAxMCwgMTIsIDEwLCAxMCwgMTQsIDE2LCAxMywgMTQsIDExLCAxMywgMTEsICA5LAorICAgICAgMTMsIDE2LCAxMiwgMTMsIDEyLCAxNCwgMTAsIDEwLCAxMiwgMTYsIDExLCAxMiwgMTIsIDEzLCAxMCwgIDksCisgICAgICAxNCwgMTYsIDExLCAxMiwgMTEsIDEyLCAgOSwgIDgsIDEwLCAxNiwgMTAsIDEzLCAxMSwgMTQsIDExLCAxMSwKKyAgICAgIDEyLCAxNiwgMTEsIDEzLCAxMiwgMTQsIDExLCAxMSwgMTYsIDE2LCAxNCwgMTMsIDE0LCAxNCwgMTIsIDEwLAorICAgICAgMTAsIDE1LCAxMCwgMTMsIDEwLCAxMywgMTAsIDExLCAxMiwgMTYsIDExLCAxMywgMTEsIDEzLCAxMSwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxMywgMTQsIDE0LCAxMiwgMTAsIDExLCAxNSwgIDksIDEyLCAxMSwgMTMsIDEwLCAgOSwKKyAgICAgIDEyLCAxNiwgMTAsIDEyLCAxMiwgMTMsIDEwLCAgOSwgMTYsIDE2LCAxMiwgMTIsIDEzLCAxNCwgMTAsICA4LAorICAgICAgMTAsIDE2LCAxMCwgMTMsIDEwLCAxNCwgMTEsIDExLCAxMiwgMTYsIDExLCAxMywgMTIsIDE0LCAxMSwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxMywgMTQsIDE0LCAxMiwgMTAsICA5LCAxNSwgIDksIDEyLCAxMCwgMTMsIDEwLCAxMCwKKyAgICAgIDExLCAxNiwgMTAsIDEyLCAxMSwgMTMsIDEwLCAxMCwgMTYsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTEsICA5LAorICAgICAgMTAsIDE1LCAgOSwgMTEsIDExLCAxMywgIDksICA5LCAxMSwgMTUsICA5LCAxMSwgMTEsIDEzLCAgOSwgIDgsCisgICAgICAxNCwgMTYsIDEwLCAxMSwgMTMsIDEzLCAxMCwgIDgsIDExLCAxNiwgMTEsIDEzLCAxMCwgMTMsIDEwLCAgOSwKKyAgICAgIDEzLCAxNiwgMTEsIDEzLCAxMSwgMTMsIDEwLCAgOSwgMTYsIDE2LCAxMywgMTMsIDEzLCAxMywgMTAsICA4LAorICAgICAgMTEsIDE2LCAxMCwgMTIsIDEwLCAxMywgMTAsICA5LCAxMSwgMTYsIDExLCAxMiwgMTAsIDEyLCAgOSwgIDksCisgICAgICAxNSwgMTYsIDEyLCAxMywgMTEsIDEyLCAxMCwgIDgsIDExLCAxNiwgMTAsIDEyLCAxMSwgMTIsICA5LCAgOCwKKyAgICAgIDExLCAxNSwgIDksIDExLCAxMCwgMTIsICA5LCAgNywgMTMsIDE1LCAgOSwgIDksIDEwLCAxMCwgIDcsICA1LAorICAgIH0sCisgICAgeworICAgICAgIDAsICA3LCAgMywgIDgsICA0LCAgOSwgIDcsICA4LCAgNSwgMTAsICA3LCAxMCwgIDgsIDExLCAgOCwgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMSwgMTAsICAyLCAxMCwgIDQsICA5LCAgNywgMTAsICA3LCAgOCwKKyAgICAgICA3LCAxNiwgIDcsIDEwLCAgOSwgMTYsICA4LCAgOSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsIDEwLAorICAgICAgIDgsIDE2LCAgNywgMTAsIDEwLCAxNiwgIDksICA4LCAxMCwgMTYsICA5LCAxMSwgMTYsIDE2LCAgOSwgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMSwgIDksICAzLCAxMCwgIDYsICA5LCAgNiwgMTEsICA4LCAgOCwKKyAgICAgICA3LCAxNiwgIDgsIDEwLCAgOSwgMTYsICA5LCAgOSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsIDEwLAorICAgICAgIDUsIDE2LCAgNywgMTAsICA4LCAxMSwgIDgsICA4LCAgOCwgMTYsICA4LCAxMCwgIDksIDE2LCAgOCwgIDgsCisgICAgICAxNiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMCwgIDksICA5LCAxNiwgIDksIDExLCAxMSwgMTYsICA5LCAgOSwKKyAgICAgIDExLCAxNiwgIDksIDExLCAxMSwgMTYsICA5LCAgOCwgMTYsIDE2LCAxMCwgMTYsIDE2LCAxNiwgMTAsICA5LAorICAgICAgIDgsIDE2LCAxMCwgMTYsICA4LCAxNiwgMTAsICA5LCAxMiwgMTYsIDExLCAxNiwgMTAsIDE2LCAxMCwgIDksCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTAsIDEwLCAxNiwgMTEsIDE2LCAxMCwgMTYsIDEwLCAgOSwKKyAgICAgIDExLCAxNiwgMTEsIDE2LCAxMCwgMTYsIDEwLCAgOSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsICA5LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTAsICA5LCAxNiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMCwgIDksCisgICAgICAxNiwgMTYsIDEwLCAxMSwgMTEsIDE2LCAgOSwgIDcsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIH0sCisgICAgeworICAgICAgIDIsICA5LCAgNiwgIDksICA2LCAxMCwgIDgsICA5LCAgOCwgMTIsICA5LCAxMSwgIDksIDEyLCAxMCwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxNCwgMTUsIDE1LCAxMywgMTIsICA1LCAxMSwgIDcsIDEwLCAgOCwgMTEsICA5LCAgOSwKKyAgICAgICA5LCAxMywgIDksIDExLCAxMCwgMTIsIDEwLCAxMCwgMTUsIDE2LCAxNCwgMTQsIDE0LCAxNiwgMTIsIDExLAorICAgICAgMTAsIDE0LCAgOSwgMTEsIDExLCAxMywgMTAsIDEwLCAxMiwgMTUsIDEwLCAxMiwgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTQsIDE1LCAxMiwgMTEsICA1LCAxMSwgIDgsIDEwLCAgNywgMTEsICA5LCAgOSwKKyAgICAgICA5LCAxMywgIDksIDEyLCAgOSwgMTIsIDEwLCAxMCwgMTUsIDE2LCAxMywgMTQsIDEzLCAxNiwgMTIsIDExLAorICAgICAgIDcsIDEyLCAgOCwgMTEsICA5LCAxMSwgIDksIDEwLCAgOSwgMTMsICA5LCAxMSwgMTAsIDEyLCAgOSwgIDksCisgICAgICAxNiwgMTYsIDEzLCAxNCwgMTMsIDE0LCAxMSwgMTEsIDEwLCAxNCwgMTAsIDEyLCAxMSwgMTMsIDEwLCAxMCwKKyAgICAgIDExLCAxNiwgMTEsIDEyLCAxMiwgMTMsIDEwLCAxMCwgMTYsIDE2LCAxMywgMTQsIDEzLCAxNCwgMTIsIDExLAorICAgICAgMTAsIDE0LCAxMSwgMTMsIDEwLCAxMywgMTAsIDExLCAxMiwgMTYsIDEyLCAxMywgMTAsIDEyLCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTMsIDE0LCAxMiwgMTEsIDExLCAxNSwgMTEsIDEzLCAxMSwgMTMsIDEwLCAxMCwKKyAgICAgIDEyLCAxNSwgMTIsIDEzLCAxMSwgMTMsIDExLCAxMCwgMTUsIDE2LCAxNCwgMTUsIDEzLCAxNSwgMTIsIDExLAorICAgICAgMTIsIDE2LCAxMiwgMTMsIDEyLCAxNCwgMTEsIDExLCAxMywgMTYsIDEyLCAxMywgMTIsIDE0LCAxMSwgMTAsCisgICAgICAxNiwgMTYsIDEzLCAxNCwgMTMsIDE0LCAxMSwgMTAsICAzLCAxMCwgIDYsICA5LCAgNywgMTAsICA4LCAgOSwKKyAgICAgICA5LCAxMiwgIDksIDExLCAxMCwgMTIsICA5LCAxMCwgMTUsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTIsIDExLAorICAgICAgIDYsIDExLCAgNywgMTAsICA4LCAxMCwgIDksICA5LCAgOSwgMTMsICA5LCAxMSwgMTAsIDEyLCAgOSwgIDksCisgICAgICAxNSwgMTYsIDEzLCAxNCwgMTQsIDE1LCAxMiwgMTEsIDEwLCAxNCwgIDksIDExLCAxMSwgMTIsIDEwLCAxMCwKKyAgICAgIDEyLCAxNCwgMTAsIDEyLCAxMSwgMTMsIDEwLCAxMCwgMTUsIDE2LCAxMywgMTQsIDE0LCAxNiwgMTIsIDExLAorICAgICAgIDYsIDExLCAgOCwgMTAsICA3LCAxMSwgIDksICA5LCAgOSwgMTMsICA5LCAxMSwgIDksIDEyLCAgOSwgIDksCisgICAgICAxNSwgMTYsIDE0LCAxNCwgMTMsIDE0LCAxMiwgMTEsICA3LCAxMSwgIDgsIDExLCAgOCwgMTEsICA5LCAgOSwKKyAgICAgICA5LCAxMiwgIDksIDExLCAgOSwgMTIsICA5LCAgOSwgMTUsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTEsIDEwLAorICAgICAgMTAsIDEzLCAxMCwgMTIsIDExLCAxMywgMTAsIDEwLCAxMSwgMTUsIDEwLCAxMiwgMTEsIDEzLCAxMCwgMTAsCisgICAgICAxNCwgMTYsIDEyLCAxMywgMTMsIDE0LCAxMSwgMTAsIDEwLCAxNCwgMTEsIDEyLCAgOSwgMTIsIDEwLCAxMCwKKyAgICAgIDExLCAxNSwgMTEsIDEzLCAxMCwgMTMsIDEwLCAxMCwgMTUsIDE2LCAxNCwgMTQsIDEzLCAxNCwgMTIsIDExLAorICAgICAgMTAsIDE0LCAxMCwgMTIsIDEwLCAxMiwgMTAsIDEwLCAxMSwgMTUsIDExLCAxMiwgMTAsIDEyLCAxMCwgMTAsCisgICAgICAxNSwgMTYsIDEzLCAxNCwgMTIsIDE0LCAxMSwgMTAsIDEyLCAxNiwgMTEsIDEzLCAxMiwgMTQsIDExLCAxMCwKKyAgICAgIDEyLCAxNiwgMTIsIDEzLCAxMSwgMTMsIDEwLCAxMCwgMTUsIDE2LCAxMiwgMTQsIDEyLCAxNCwgMTEsICA5LAorICAgICAgIDcsIDEyLCAgOSwgMTEsICA5LCAxMiwgMTAsIDEwLCAxMSwgMTQsIDExLCAxMiwgMTEsIDEzLCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxMywgMTIsICA4LCAxMiwgIDksIDExLCAgOSwgMTIsIDEwLCAxMCwKKyAgICAgIDExLCAxNCwgMTEsIDEyLCAxMSwgMTMsIDEwLCAxMCwgMTYsIDE2LCAxNCwgMTUsIDE1LCAxNiwgMTMsIDEyLAorICAgICAgMTEsIDE0LCAxMCwgMTIsIDExLCAxMywgMTAsIDEwLCAxMiwgMTYsIDExLCAxMywgMTIsIDE0LCAxMSwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTQsIDE2LCAxMiwgMTEsICA4LCAxMywgIDksIDExLCAgOSwgMTIsIDEwLCAxMCwKKyAgICAgIDExLCAxNCwgMTEsIDEyLCAxMSwgMTMsIDEwLCAxMCwgMTYsIDE2LCAxNSwgMTUsIDE0LCAxNSwgMTMsIDEyLAorICAgICAgIDksIDEzLCAgOSwgMTIsICA5LCAxMiwgMTAsIDEwLCAxMSwgMTQsIDEwLCAxMiwgMTAsIDEyLCAxMCwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTQsIDE0LCAxMiwgMTEsIDExLCAxNSwgMTEsIDEyLCAxMSwgMTMsIDExLCAxMCwKKyAgICAgIDEyLCAxNiwgMTEsIDEyLCAxMiwgMTMsIDExLCAxMCwgMTYsIDE2LCAxMywgMTUsIDE0LCAxNSwgMTEsIDExLAorICAgICAgMTEsIDE2LCAxMSwgMTMsIDEwLCAxMywgMTEsIDExLCAxMiwgMTYsIDEyLCAxNCwgMTEsIDEzLCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTQsIDE1LCAxMywgMTEsIDExLCAxNiwgMTEsIDEzLCAxMSwgMTMsIDExLCAxMCwKKyAgICAgIDEyLCAxNiwgMTIsIDEzLCAxMCwgMTMsIDExLCAxMCwgMTYsIDE2LCAxNCwgMTQsIDEyLCAxNCwgMTIsIDEwLAorICAgICAgMTIsIDE2LCAxMiwgMTQsIDEyLCAxNCwgMTEsIDExLCAxMywgMTYsIDEyLCAxNCwgMTIsIDE0LCAxMSwgMTAsCisgICAgICAxNSwgMTYsIDEyLCAxNCwgMTIsIDE0LCAxMSwgIDksICA5LCAxNCwgMTEsIDEzLCAxMSwgMTMsIDExLCAxMSwKKyAgICAgIDEzLCAxNiwgMTIsIDE0LCAxMywgMTQsIDEyLCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDEyLAorICAgICAgIDksIDE0LCAxMCwgMTIsIDEwLCAxMywgMTEsIDExLCAxMiwgMTYsIDEyLCAxMywgMTMsIDE0LCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxMywgMTIsIDEwLCAxNSwgMTEsIDEzLCAxMSwgMTQsIDExLCAxMCwKKyAgICAgIDEzLCAxNiwgMTIsIDEzLCAxMiwgMTUsIDExLCAxMCwgMTYsIDE2LCAxNCwgMTYsIDE1LCAxNiwgMTMsIDExLAorICAgICAgMTAsIDE0LCAxMCwgMTMsIDExLCAxNCwgMTEsIDExLCAxMywgMTYsIDEyLCAxMywgMTIsIDE0LCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywgMTIsIDEwLCAxNCwgMTAsIDEyLCAxMCwgMTMsIDEwLCAxMSwKKyAgICAgIDEyLCAxNSwgMTIsIDEzLCAxMiwgMTMsIDExLCAxMCwgMTYsIDE2LCAxNCwgMTQsIDE1LCAxNSwgMTMsIDExLAorICAgICAgMTEsIDE2LCAxMSwgMTMsIDExLCAxNCwgMTEsIDEwLCAxMiwgMTYsIDExLCAxMywgMTIsIDE0LCAxMSwgMTAsCisgICAgICAxNiwgMTYsIDEzLCAxNCwgMTQsIDE1LCAxMiwgMTAsIDExLCAxNiwgMTIsIDEzLCAxMSwgMTQsIDExLCAxMCwKKyAgICAgIDEzLCAxNiwgMTMsIDE0LCAxMiwgMTQsIDExLCAxMSwgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNSwgMTIsIDExLAorICAgICAgMTEsIDE2LCAxMiwgMTMsIDExLCAxNCwgMTEsIDEwLCAxMywgMTYsIDEyLCAxMywgMTEsIDE0LCAxMSwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTMsIDE0LCAxMiwgMTAsIDEyLCAxNiwgMTIsIDE0LCAxMiwgMTQsIDEwLCAxMCwKKyAgICAgIDEyLCAxNiwgMTEsIDEzLCAxMSwgMTQsIDEwLCAxMCwgMTQsIDE2LCAxMSwgMTMsIDEyLCAxMywgMTAsICA4LAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAgMCwgMTIsICA2LCAxMywgIDcsIDE0LCAxMSwgMTQsICA4LCAxNCwgMTAsIDE0LCAxMSwgMTUsIDEzLCAxNSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDUsIDE0LCAgNywgMTMsIDEwLCAxNiwgMTIsIDE0LAorICAgICAgIDksIDE2LCAxMCwgMTQsIDEyLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMCwgMTYsICA5LCAxNCwgMTQsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTEsIDE2LCAxNiwgMTYsIDE0LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDUsIDE0LCAgOSwgMTQsICA4LCAxNCwgMTIsIDE0LAorICAgICAgIDksIDE2LCAxMSwgMTQsIDExLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAgOCwgMTYsIDEwLCAxNCwgMTEsIDE2LCAxMiwgMTQsIDEwLCAxNiwgMTEsIDE1LCAxMiwgMTYsIDEzLCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTIsIDE2LCAxMiwgMTYsIDE0LCAxNiwgMTQsIDE2LAorICAgICAgMTMsIDE2LCAxMiwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMCwgMTYsIDEzLCAxNiwgMTEsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTQsIDE2LCAxMywgMTYsIDE0LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTQsIDE2LAorICAgICAgMTMsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE0LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDEsIDEyLCAgNiwgMTIsICA4LCAxNCwgMTEsIDEzLAorICAgICAgIDgsIDE0LCAxMCwgMTMsIDExLCAxNCwgMTMsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAgNSwgMTQsICA3LCAxMywgMTAsIDE0LCAxMSwgMTQsICA5LCAxNiwgMTAsIDE0LCAxMiwgMTYsIDEzLCAxNSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDksIDE2LCAgOSwgMTQsIDEzLCAxNiwgMTMsIDE0LAorICAgICAgMTIsIDE2LCAxMSwgMTUsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAgNSwgMTQsICA5LCAxMywgIDgsIDE0LCAxMiwgMTQsICA5LCAxNiwgMTEsIDE0LCAxMSwgMTYsIDEzLCAxNCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDcsIDE1LCAgOSwgMTQsIDEwLCAxNiwgMTIsIDE0LAorICAgICAgIDksIDE2LCAxMCwgMTQsIDExLCAxNiwgMTIsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsCisgICAgICAxMSwgMTYsIDExLCAxNSwgMTQsIDE2LCAxMywgMTUsIDEyLCAxNiwgMTEsIDE1LCAxNCwgMTYsIDEzLCAxNCwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTAsIDE2LCAxMywgMTYsIDEwLCAxNiwgMTMsIDE2LAorICAgICAgMTIsIDE2LCAxNCwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMSwgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDEzLCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LAorICAgICAgMTUsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTQsCisgICAgICAgNCwgMTQsICA4LCAxMywgIDksIDE2LCAxMiwgMTQsICA5LCAxNiwgMTEsIDE0LCAxMSwgMTYsIDEzLCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDYsIDE1LCAgOCwgMTMsIDEwLCAxNiwgMTIsIDE0LAorICAgICAgMTAsIDE2LCAxMSwgMTQsIDEyLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAgOSwgMTYsICA5LCAxNCwgMTMsIDE2LCAxMywgMTUsIDEyLCAxNiwgMTEsIDE2LCAxNCwgMTYsIDEzLCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDYsIDE2LCAgOSwgMTQsICA5LCAxNiwgMTIsIDE0LAorICAgICAgMTAsIDE2LCAxMSwgMTUsIDEyLCAxNiwgMTMsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAgOCwgMTYsIDEwLCAxNCwgMTEsIDE2LCAxMiwgMTQsIDEwLCAxNiwgMTEsIDE0LCAxMiwgMTYsIDEzLCAxNSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxMSwgMTUsIDE0LCAxNiwgMTMsIDE1LAorICAgICAgMTIsIDE2LCAxMSwgMTUsIDE0LCAxNiwgMTMsIDE0LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTYsCisgICAgICAxMCwgMTYsIDEzLCAxNiwgMTAsIDE2LCAxMywgMTUsIDEzLCAxNiwgMTQsIDE2LCAxMiwgMTYsIDE0LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTMsIDE2LAorICAgICAgMTIsIDE2LCAxMywgMTYsIDExLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTYsCisgICAgICAxNCwgMTYsIDE0LCAxNiwgMTUsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE0LCAxNCwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxNCwgIDYsIDE2LCAgOSwgMTQsIDEwLCAxNiwgMTIsIDE0LAorICAgICAgMTAsIDE2LCAxMSwgMTMsIDEyLCAxNiwgMTMsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTQsCisgICAgICAgNywgMTYsICA5LCAxNCwgMTAsIDE2LCAxMiwgMTMsIDExLCAxNiwgMTEsIDE0LCAxMiwgMTYsIDEyLCAxNCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNCwgIDksIDE2LCAgOSwgMTQsIDEyLCAxNiwgMTEsIDEzLAorICAgICAgMTIsIDE2LCAxMSwgMTQsIDEyLCAxNiwgMTIsIDEzLCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTQsCisgICAgICAgNywgMTYsIDEwLCAxNCwgMTAsIDE2LCAxMiwgMTQsIDExLCAxNiwgMTEsIDE0LCAxMSwgMTYsIDEyLCAxNCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNCwgIDgsIDE2LCAxMCwgMTQsIDEwLCAxNiwgMTEsIDEzLAorICAgICAgMTAsIDE2LCAxMSwgMTMsIDExLCAxNiwgMTIsIDEzLCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTQsCisgICAgICAxMCwgMTYsICA5LCAxMywgMTIsIDE2LCAxMSwgMTMsIDExLCAxNiwgMTAsIDEzLCAxMiwgMTYsIDExLCAxMiwKKyAgICAgIDE2LCAxNiwgMTMsIDE1LCAxNSwgMTYsIDEzLCAxMywgIDksIDE2LCAxMSwgMTQsICA5LCAxNiwgMTEsIDEzLAorICAgICAgMTIsIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTIsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTQsCisgICAgICAxMCwgMTYsIDExLCAxNCwgMTAsIDE2LCAxMSwgMTMsIDExLCAxNiwgMTIsIDE0LCAxMCwgMTUsIDExLCAxMywKKyAgICAgIDE2LCAxNiwgMTUsIDE2LCAxMywgMTYsIDEzLCAxMywgMTIsIDE2LCAxMSwgMTMsIDEyLCAxNiwgMTEsIDEyLAorICAgICAgMTIsIDE2LCAxMSwgMTMsIDExLCAxNCwgMTEsIDExLCAxMywgMTYsIDEyLCAxMywgMTIsIDE0LCAxMSwgMTEsCisgICAgfSwKKyAgICB7CisgICAgICAgMCwgMTAsICA1LCAxMCwgIDYsIDExLCAgOCwgMTAsICA3LCAxMiwgIDgsIDExLCAgOCwgMTIsICA5LCAxMCwKKyAgICAgIDE0LCAxNiwgMTMsIDEzLCAxMywgMTQsIDEyLCAxMSwgIDQsIDEyLCAgNiwgMTAsICA4LCAxMiwgIDksIDEwLAorICAgICAgIDgsIDEzLCAgOCwgMTEsICA5LCAxMiwgIDksIDEwLCAxNCwgMTYsIDEyLCAxMywgMTMsIDE0LCAxMSwgMTEsCisgICAgICAgOSwgMTUsICA4LCAxMiwgMTIsIDE0LCAxMCwgMTEsIDExLCAxNiwgIDksIDEyLCAxMiwgMTQsIDEwLCAxMCwKKyAgICAgIDE0LCAxNiwgMTEsIDEzLCAxMywgMTUsIDExLCAxMSwgIDQsIDEyLCAgOCwgMTEsICA2LCAxMSwgIDksIDEwLAorICAgICAgIDgsIDEzLCAgOSwgMTEsICA4LCAxMiwgIDksIDEwLCAxNCwgMTYsIDEyLCAxMywgMTMsIDE0LCAxMSwgMTEsCisgICAgICAgNywgMTMsICA4LCAxMSwgIDksIDEyLCAgOSwgMTAsICA4LCAxMywgIDksIDExLCAgOSwgMTIsICA5LCAxMCwKKyAgICAgIDE0LCAxNiwgMTIsIDEzLCAxMiwgMTMsIDExLCAxMCwgMTEsIDE2LCAxMCwgMTIsIDEyLCAxNCwgMTAsIDExLAorICAgICAgMTEsIDE2LCAxMCwgMTIsIDEyLCAxNCwgMTAsIDEwLCAxNSwgMTYsIDExLCAxMywgMTMsIDE0LCAxMSwgMTAsCisgICAgICAxMCwgMTYsIDExLCAxMywgIDksIDEzLCAxMCwgMTEsIDExLCAxNSwgMTIsIDEzLCAxMCwgMTIsIDEwLCAxMSwKKyAgICAgIDE1LCAxNiwgMTMsIDE0LCAxMiwgMTMsIDExLCAxMSwgMTEsIDE2LCAxMSwgMTMsIDEwLCAxMywgMTAsIDExLAorICAgICAgMTIsIDE2LCAxMSwgMTMsIDEwLCAxMywgMTAsIDEwLCAxNSwgMTYsIDEzLCAxNCwgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxMywgMTYsIDEyLCAxMywgMTMsIDE0LCAxMSwgMTEsIDE0LCAxNiwgMTIsIDEzLCAxMiwgMTQsIDExLCAxMCwKKyAgICAgIDE2LCAxNiwgMTMsIDEzLCAxMywgMTQsIDExLCAgOSwgIDMsIDExLCAgNiwgMTAsICA2LCAxMSwgIDksIDEwLAorICAgICAgIDgsIDEyLCAgOCwgMTEsICA5LCAxMiwgIDksIDEwLCAxNCwgMTYsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTEsCisgICAgICAgNSwgMTIsICA2LCAxMCwgIDgsIDEyLCAgOSwgMTAsICA4LCAxMywgIDgsIDExLCAgOSwgMTIsICA5LCAxMCwKKyAgICAgIDE0LCAxNiwgMTIsIDEzLCAxMywgMTQsIDExLCAxMSwgIDksIDE1LCAgOCwgMTEsIDExLCAxNCwgMTAsIDEwLAorICAgICAgMTEsIDE1LCAgOSwgMTEsIDEyLCAxNCwgMTAsIDEwLCAxNCwgMTYsIDExLCAxMiwgMTMsIDE0LCAxMSwgMTAsCisgICAgICAgNSwgMTIsICA4LCAxMSwgIDcsIDExLCAgOSwgMTAsICA4LCAxMywgIDksIDExLCAgOSwgMTIsICA5LCAxMCwKKyAgICAgIDE0LCAxNiwgMTIsIDEzLCAxMywgMTMsIDExLCAxMSwgIDcsIDEzLCAgOCwgMTEsICA4LCAxMiwgIDksIDEwLAorICAgICAgIDgsIDEzLCAgOCwgMTEsICA5LCAxMiwgIDksICA5LCAxMywgMTYsIDExLCAxMywgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxMCwgMTUsICA5LCAxMiwgMTEsIDE0LCAxMCwgMTAsIDExLCAxNSwgIDksIDExLCAxMSwgMTMsIDEwLCAxMCwKKyAgICAgIDE0LCAxNiwgMTEsIDEyLCAxMywgMTQsIDEwLCAxMCwgIDksIDE2LCAxMSwgMTMsICA5LCAxMiwgMTAsIDEwLAorICAgICAgMTEsIDE2LCAxMSwgMTMsICA5LCAxMiwgMTAsIDEwLCAxNSwgMTYsIDEzLCAxNCwgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxMSwgMTYsIDExLCAxMywgMTAsIDEzLCAxMCwgMTAsIDExLCAxNSwgMTEsIDEzLCAgOSwgMTIsIDEwLCAxMCwKKyAgICAgIDE0LCAxNiwgMTIsIDEzLCAxMSwgMTMsIDEwLCAxMCwgMTMsIDE2LCAxMiwgMTMsIDEyLCAxNCwgMTEsIDEwLAorICAgICAgMTMsIDE2LCAxMSwgMTMsIDEyLCAxMywgMTAsIDEwLCAxNCwgMTYsIDExLCAxMiwgMTIsIDEzLCAxMCwgIDksCisgICAgICAgNywgMTQsICA4LCAxMiwgIDksIDEzLCAxMCwgMTEsIDEwLCAxNCwgMTAsIDEyLCAxMSwgMTMsIDExLCAxMSwKKyAgICAgIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTQsIDEyLCAxMiwgIDcsIDE0LCAgOCwgMTIsICA5LCAxMywgMTAsIDExLAorICAgICAgMTAsIDE0LCAxMCwgMTIsIDExLCAxMywgMTAsIDExLCAxNiwgMTYsIDEzLCAxMywgMTQsIDE0LCAxMiwgMTEsCisgICAgICAxMCwgMTUsICA5LCAxMiwgMTIsIDE0LCAxMCwgMTAsIDEyLCAxNiwgIDksIDEyLCAxMiwgMTQsIDEwLCAxMCwKKyAgICAgIDE2LCAxNiwgMTIsIDEzLCAxNCwgMTUsIDEyLCAxMSwgIDgsIDE0LCAgOSwgMTIsICA5LCAxMywgMTAsIDExLAorICAgICAgMTAsIDE1LCAxMCwgMTIsIDEwLCAxMywgMTAsIDExLCAxNiwgMTYsIDE0LCAxNCwgMTQsIDE0LCAxMiwgMTEsCisgICAgICAgOCwgMTQsICA5LCAxMiwgIDksIDEzLCAxMCwgMTEsIDEwLCAxNCwgMTAsIDEyLCAxMCwgMTMsIDEwLCAxMCwKKyAgICAgIDE1LCAxNiwgMTMsIDEzLCAxMywgMTQsIDEyLCAxMSwgMTAsIDE1LCAxMCwgMTIsIDEyLCAxNCwgMTAsIDEwLAorICAgICAgMTEsIDE2LCAgOSwgMTIsIDEyLCAxNCwgMTAsIDEwLCAxNCwgMTYsIDExLCAxMiwgMTMsIDE0LCAxMSwgMTAsCisgICAgICAxMSwgMTYsIDExLCAxNCwgIDksIDEzLCAxMCwgMTEsIDEyLCAxNiwgMTIsIDE0LCAxMCwgMTMsIDExLCAxMSwKKyAgICAgIDE2LCAxNiwgMTQsIDE1LCAxMywgMTQsIDEyLCAxMSwgMTEsIDE2LCAxMiwgMTQsIDEwLCAxMywgMTEsIDExLAorICAgICAgMTEsIDE2LCAxMSwgMTMsIDEwLCAxMywgMTAsIDEwLCAxNSwgMTYsIDEzLCAxNCwgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxMywgMTYsIDEyLCAxNCwgMTMsIDE0LCAxMSwgMTAsIDEyLCAxNiwgMTEsIDEzLCAxMiwgMTMsIDEwLCAxMCwKKyAgICAgIDE0LCAxNiwgMTEsIDEyLCAxMSwgMTMsIDEwLCAgOSwgMTAsIDE2LCAxMCwgMTMsIDExLCAxNCwgMTEsIDExLAorICAgICAgMTIsIDE2LCAxMSwgMTMsIDEyLCAxNCwgMTEsIDExLCAxNiwgMTYsIDE0LCAxMywgMTQsIDE1LCAxMiwgMTEsCisgICAgICAxMCwgMTYsIDEwLCAxMywgMTAsIDE0LCAxMSwgMTEsIDEyLCAxNiwgMTEsIDEzLCAxMSwgMTQsIDExLCAxMSwKKyAgICAgIDE2LCAxNiwgMTQsIDEzLCAxNCwgMTQsIDEyLCAxMSwgMTEsIDE1LCAgOSwgMTIsIDExLCAxNCwgMTAsIDEwLAorICAgICAgMTMsIDE2LCAxMCwgMTIsIDEyLCAxNCwgMTAsIDEwLCAxNiwgMTYsIDEzLCAxMywgMTQsIDE0LCAxMSwgMTAsCisgICAgICAxMCwgMTYsIDEwLCAxMywgMTEsIDE0LCAxMSwgMTEsIDEyLCAxNiwgMTEsIDEzLCAxMiwgMTQsIDExLCAxMSwKKyAgICAgIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTQsIDEyLCAxMSwgIDksIDE2LCAxMCwgMTMsIDEwLCAxNCwgMTEsIDExLAorICAgICAgMTEsIDE1LCAxMSwgMTIsIDExLCAxMywgMTEsIDExLCAxNiwgMTYsIDEzLCAxMywgMTQsIDE0LCAxMiwgMTAsCisgICAgICAxMCwgMTUsICA5LCAxMiwgMTEsIDE0LCAxMCwgMTAsIDExLCAxNiwgIDksIDExLCAxMSwgMTMsIDEwLCAgOSwKKyAgICAgIDE1LCAxNiwgMTEsIDEyLCAxMywgMTQsIDEwLCAgOSwgMTEsIDE2LCAxMSwgMTMsIDEwLCAxMywgMTAsIDEwLAorICAgICAgMTMsIDE2LCAxMiwgMTMsIDExLCAxMywgMTAsIDEwLCAxNiwgMTYsIDE0LCAxNCwgMTMsIDEzLCAxMSwgMTAsCisgICAgICAxMSwgMTYsIDExLCAxMywgMTAsIDEzLCAxMCwgMTAsIDEyLCAxNiwgMTEsIDEzLCAxMCwgMTMsIDEwLCAxMCwKKyAgICAgIDE1LCAxNiwgMTMsIDEzLCAxMiwgMTMsIDExLCAgOSwgMTEsIDE2LCAxMSwgMTIsIDExLCAxMywgMTAsICA5LAorICAgICAgMTEsIDE1LCAxMCwgMTEsIDExLCAxMiwgIDksICA4LCAxMywgMTUsIDEwLCAxMCwgMTAsIDExLCAgOCwgIDcsCisgICAgfSwKKyAgICB7CisgICAgICAgMCwgIDksICAzLCAgOCwgIDUsICA5LCAgNywgIDgsICA1LCAxMSwgIDYsICA5LCAgOCwgMTEsICA4LCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxMCwgIDIsIDEwLCAgNCwgIDksICA3LCAxMCwgIDcsICA4LAorICAgICAgIDcsIDE2LCAgNywgMTAsICA5LCAxMSwgIDgsICA5LCAxNiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMSwgMTAsCisgICAgICAgNywgMTYsICA3LCAxMCwgMTAsIDE2LCAgOCwgIDksIDEwLCAxNiwgIDgsIDEwLCAxMSwgMTYsICA5LCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxMCwgIDMsIDExLCAgNiwgIDksICA2LCAxMSwgIDgsICA4LAorICAgICAgIDcsIDE2LCAgOCwgMTAsICA4LCAxMSwgIDgsICA5LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxMSwgMTAsCisgICAgICAgNSwgMTEsICA3LCAgOSwgIDgsIDExLCAgOCwgIDgsICA3LCAxNiwgIDcsIDEwLCAgOCwgMTEsICA4LCAgOCwKKyAgICAgIDE2LCAxNiwgMTEsIDE2LCAxNiwgMTYsIDEwLCAgOSwgIDksIDE2LCAgOCwgMTEsIDExLCAxNiwgIDksICA5LAorICAgICAgMTAsIDE2LCAgOCwgMTEsIDExLCAxNiwgIDksICA5LCAxNiwgMTYsIDEwLCAxNiwgMTYsIDE2LCAxMCwgIDksCisgICAgICAgOCwgMTYsIDEwLCAxMSwgIDgsIDE2LCAgOSwgIDksIDExLCAxNiwgMTEsIDE2LCAxMCwgMTYsIDEwLCAgOSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxMCwgIDksIDE2LCAxMCwgMTYsIDEwLCAxNiwgIDksICA5LAorICAgICAgMTAsIDE2LCAxMCwgMTYsICA5LCAxNiwgIDksICA5LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMCwgIDksCisgICAgICAxNiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMCwgMTAsIDEzLCAxNiwgMTEsIDE2LCAxMSwgMTYsIDEwLCAgOSwKKyAgICAgIDE2LCAxNiwgMTAsIDExLCAxMSwgMTYsICA5LCAgOCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgfSwKKyAgICB7CisgICAgICAgMSwgMTAsICA2LCAxMCwgIDcsIDExLCAgOSwgMTAsICA4LCAxMiwgIDksIDEyLCAgOSwgMTIsIDEwLCAxMCwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTUsIDEzLCAxMiwgIDUsIDEyLCAgNywgMTAsICA5LCAxMSwgIDksIDEwLAorICAgICAgIDksIDEzLCAgOSwgMTIsIDEwLCAxMywgMTAsIDEwLCAxNiwgMTYsIDE0LCAxNSwgMTQsIDE0LCAxMywgMTIsCisgICAgICAxMCwgMTUsIDEwLCAxMiwgMTIsIDE0LCAxMSwgMTEsIDEyLCAxNiwgMTEsIDEzLCAxMiwgMTQsIDExLCAxMSwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDEzLCAxMiwgIDYsIDEyLCAgOCwgMTEsICA4LCAxMSwgMTAsIDEwLAorICAgICAgIDksIDEzLCAxMCwgMTIsIDEwLCAxMiwgMTAsIDEwLCAxNSwgMTYsIDEzLCAxNSwgMTMsIDE0LCAxMiwgMTIsCisgICAgICAgNywgMTMsICA5LCAxMSwgIDksIDEyLCAxMCwgMTAsICA5LCAxNCwgMTAsIDEyLCAxMCwgMTMsIDEwLCAxMCwKKyAgICAgIDE1LCAxNiwgMTMsIDE1LCAxMywgMTQsIDEyLCAxMSwgMTEsIDE1LCAxMSwgMTMsIDEyLCAxNCwgMTEsIDExLAorICAgICAgMTIsIDE2LCAxMSwgMTMsIDEyLCAxNCwgMTEsIDExLCAxNiwgMTYsIDEzLCAxNSwgMTQsIDE2LCAxMiwgMTEsCisgICAgICAxMCwgMTYsIDEyLCAxNCwgMTAsIDEzLCAxMSwgMTEsIDEyLCAxNiwgMTIsIDE0LCAxMSwgMTMsIDExLCAxMSwKKyAgICAgIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTYsIDEzLCAxMiwgMTEsIDE2LCAxMiwgMTQsIDExLCAxNCwgMTEsIDExLAorICAgICAgMTIsIDE2LCAxMiwgMTQsIDExLCAxNCwgMTEsIDExLCAxNiwgMTYsIDE0LCAxNSwgMTMsIDE1LCAxMiwgMTIsCisgICAgICAxMywgMTYsIDEzLCAxNSwgMTMsIDE1LCAxMiwgMTIsIDEzLCAxNiwgMTIsIDE1LCAxMiwgMTUsIDExLCAxMSwKKyAgICAgIDE2LCAxNiwgMTMsIDE2LCAxMywgMTUsIDEyLCAxMSwgIDQsIDExLCAgNywgMTAsICA3LCAxMSwgIDksIDEwLAorICAgICAgIDksIDEzLCAgOSwgMTIsIDEwLCAxMiwgMTAsIDEwLCAxNSwgMTYsIDE0LCAxNSwgMTQsIDE1LCAxMywgMTIsCisgICAgICAgNiwgMTIsICA3LCAxMSwgIDksIDExLCAgOSwgMTAsICA5LCAxMywgIDksIDEyLCAxMCwgMTIsIDEwLCAxMCwKKyAgICAgIDE1LCAxNiwgMTQsIDE1LCAxNCwgMTUsIDEyLCAxMiwgMTAsIDE1LCAgOSwgMTIsIDEyLCAxMywgMTEsIDExLAorICAgICAgMTIsIDE1LCAxMSwgMTMsIDEyLCAxNCwgMTEsIDExLCAxNiwgMTYsIDEzLCAxNSwgMTQsIDE2LCAxMiwgMTIsCisgICAgICAgNiwgMTIsICA4LCAxMSwgIDgsIDExLCAgOSwgMTAsICA5LCAxNCwgMTAsIDEyLCAxMCwgMTIsIDEwLCAxMCwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxMywgMTQsIDEyLCAxMiwgIDgsIDEzLCAgOSwgMTEsICA5LCAxMiwgMTAsIDEwLAorICAgICAgIDksIDEzLCAgOSwgMTIsICA5LCAxMiwgIDksIDEwLCAxNCwgMTYsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTEsCisgICAgICAxMSwgMTUsIDExLCAxMywgMTEsIDE0LCAxMSwgMTEsIDEyLCAxNiwgMTAsIDEzLCAxMiwgMTMsIDExLCAxMCwKKyAgICAgIDE1LCAxNiwgMTIsIDE1LCAxMywgMTYsIDEyLCAxMSwgMTAsIDE1LCAxMSwgMTMsIDEwLCAxMywgMTEsIDExLAorICAgICAgMTIsIDE2LCAxMiwgMTQsIDExLCAxMywgMTEsIDExLCAxNiwgMTYsIDE0LCAxNSwgMTMsIDE2LCAxMywgMTIsCisgICAgICAxMSwgMTYsIDExLCAxNCwgMTEsIDEzLCAxMSwgMTEsIDEyLCAxNiwgMTIsIDE0LCAxMCwgMTMsIDExLCAxMSwKKyAgICAgIDE1LCAxNiwgMTMsIDE2LCAxMiwgMTQsIDEyLCAxMSwgMTIsIDE2LCAxMiwgMTQsIDEyLCAxNSwgMTEsIDExLAorICAgICAgMTMsIDE2LCAxMiwgMTQsIDEyLCAxNCwgMTEsIDExLCAxNSwgMTYsIDEzLCAxNSwgMTMsIDE1LCAxMSwgMTAsCisgICAgICAgNywgMTMsICA5LCAxMiwgMTAsIDEzLCAxMSwgMTEsIDExLCAxNSwgMTIsIDEzLCAxMiwgMTMsIDExLCAxMSwKKyAgICAgIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE0LCAxMywgIDgsIDEzLCAgOSwgMTIsIDEwLCAxMywgMTEsIDExLAorICAgICAgMTIsIDE1LCAxMSwgMTMsIDEyLCAxMywgMTEsIDExLCAxNiwgMTYsIDE0LCAxNSwgMTUsIDE2LCAxMywgMTIsCisgICAgICAxMSwgMTYsIDExLCAxMywgMTIsIDE0LCAxMSwgMTEsIDEzLCAxNiwgMTIsIDE0LCAxMywgMTUsIDEyLCAxMSwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDEzLCAxMiwgIDksIDE1LCAxMCwgMTMsIDEwLCAxMywgMTEsIDExLAorICAgICAgMTIsIDE1LCAxMSwgMTMsIDExLCAxMywgMTEsIDExLCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTIsCisgICAgICAgOSwgMTQsIDEwLCAxMywgMTAsIDEzLCAxMSwgMTEsIDExLCAxNCwgMTEsIDEzLCAxMSwgMTMsIDExLCAxMSwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEyLCAxMiwgMTEsIDE2LCAxMSwgMTQsIDEyLCAxNCwgMTIsIDExLAorICAgICAgMTIsIDE2LCAxMSwgMTMsIDEzLCAxNCwgMTEsIDExLCAxNiwgMTYsIDEzLCAxNSwgMTQsIDE2LCAxMiwgMTEsCisgICAgICAxMiwgMTYsIDEyLCAxNCwgMTEsIDE0LCAxMSwgMTEsIDEzLCAxNiwgMTMsIDE0LCAxMiwgMTUsIDEyLCAxMSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDEzLCAxMiwgMTIsIDE2LCAxMiwgMTQsIDExLCAxNCwgMTIsIDExLAorICAgICAgMTIsIDE2LCAxMiwgMTUsIDExLCAxNCwgMTEsIDExLCAxNiwgMTYsIDE0LCAxNiwgMTMsIDE1LCAxMiwgMTIsCisgICAgICAxMywgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMiwgMTIsIDEzLCAxNiwgMTIsIDE1LCAxMiwgMTYsIDExLCAxMSwKKyAgICAgIDE0LCAxNiwgMTIsIDE1LCAxMiwgMTUsIDExLCAxMCwgIDksIDE2LCAxMSwgMTQsIDEyLCAxNCwgMTIsIDEyLAorICAgICAgMTMsIDE2LCAxMywgMTUsIDE0LCAxNiwgMTIsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTMsCisgICAgICAxMCwgMTYsIDExLCAxNCwgMTIsIDE0LCAxMiwgMTIsIDEzLCAxNiwgMTMsIDE0LCAxMywgMTYsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDEzLCAxMiwgMTEsIDE2LCAxMSwgMTQsIDEyLCAxNSwgMTIsIDExLAorICAgICAgMTMsIDE2LCAxMiwgMTQsIDEzLCAxNiwgMTIsIDExLCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTIsCisgICAgICAxMSwgMTYsIDExLCAxNCwgMTIsIDE0LCAxMiwgMTIsIDEzLCAxNiwgMTIsIDE1LCAxMywgMTYsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxMywgMTAsIDE2LCAxMSwgMTQsIDExLCAxNSwgMTEsIDExLAorICAgICAgMTMsIDE2LCAxMiwgMTQsIDEyLCAxNCwgMTIsIDExLCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTIsCisgICAgICAxMSwgMTYsIDExLCAxNSwgMTIsIDE1LCAxMiwgMTEsIDEzLCAxNiwgMTEsIDE0LCAxMywgMTUsIDEyLCAxMSwKKyAgICAgIDE2LCAxNiwgMTMsIDE2LCAxNCwgMTYsIDEyLCAxMSwgMTIsIDE2LCAxMiwgMTUsIDExLCAxNSwgMTIsIDExLAorICAgICAgMTQsIDE2LCAxMywgMTUsIDEyLCAxNiwgMTIsIDExLCAxNiwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxMywgMTIsCisgICAgICAxMSwgMTYsIDEyLCAxNSwgMTEsIDE1LCAxMSwgMTEsIDEzLCAxNiwgMTMsIDE2LCAxMSwgMTUsIDExLCAxMSwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxMywgMTUsIDEyLCAxMSwgMTIsIDE2LCAxMiwgMTUsIDEyLCAxNiwgMTEsIDExLAorICAgICAgMTIsIDE2LCAxMSwgMTUsIDEyLCAxNCwgMTEsIDExLCAxMywgMTYsIDEyLCAxMywgMTEsIDEzLCAxMCwgIDksCisgICAgfSwKKyAgfSwKKyAgeworICAgIHsKKyAgICAgICAwLCAxMywgIDYsIDEzLCAgOCwgMTQsIDEyLCAxNiwgIDgsIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTQsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgNCwgMTYsICA3LCAxNCwgMTEsIDE2LCAxMywgMTYsCisgICAgICAgOSwgMTYsIDExLCAxNiwgMTIsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNiwgMTAsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgNSwgMTYsIDEwLCAxNiwgIDgsIDE2LCAxMywgMTYsCisgICAgICAxMCwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA4LCAxNiwgMTAsIDE2LCAxMSwgMTYsIDEzLCAxNiwgMTAsIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTQsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNCwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDExLCAxNiwgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsCisgICAgICAxNCwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgMSwgMTMsICA3LCAxMywgIDgsIDE2LCAxMiwgMTYsCisgICAgICAgOCwgMTYsIDEwLCAxNiwgMTEsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA0LCAxNiwgIDcsIDE0LCAxMCwgMTYsIDEyLCAxNiwgIDksIDE2LCAxMCwgMTYsIDEyLCAxNiwgMTQsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMCwgMTYsICA5LCAxNiwgMTQsIDE2LCAxNCwgMTYsCisgICAgICAxMywgMTYsIDExLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA1LCAxNiwgIDksIDE2LCAgOCwgMTYsIDEyLCAxNiwgIDksIDE2LCAxMSwgMTYsIDExLCAxNiwgMTMsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgNywgMTYsIDEwLCAxNiwgMTEsIDE2LCAxMywgMTYsCisgICAgICAgOSwgMTYsIDExLCAxNiwgMTEsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEyLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTQsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMCwgMTYsIDEzLCAxNiwgMTEsIDE2LCAxNCwgMTYsCisgICAgICAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEyLCAxNiwgMTQsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA0LCAxNiwgIDgsIDE2LCAgOSwgMTYsIDEzLCAxNiwgMTAsIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgNiwgMTYsICA4LCAxNiwgMTEsIDE2LCAxMywgMTYsCisgICAgICAxMCwgMTYsIDExLCAxNiwgMTMsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA5LCAxNiwgIDksIDE2LCAxMywgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTQsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgNiwgMTYsIDEwLCAxNiwgMTAsIDE2LCAxMywgMTYsCisgICAgICAxMCwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA4LCAxNiwgMTAsIDE2LCAxMSwgMTYsIDEzLCAxNiwgMTAsIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTQsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMSwgMTYsIDExLCAxNiwgMTYsIDE2LCAxNCwgMTYsCisgICAgICAxMiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNiwgMTMsIDE2LCAxMCwgMTYsIDEzLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTYsIDEzLCAxNiwgMTIsIDE2LCAxNCwgMTYsCisgICAgICAxMiwgMTYsIDE1LCAxNiwgMTIsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgNiwgMTYsIDEwLCAxNiwgMTAsIDE2LCAxMywgMTYsCisgICAgICAxMSwgMTYsIDExLCAxNiwgMTIsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA4LCAxNiwgIDksIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTEsIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTMsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgOSwgMTYsICA5LCAxNiwgMTIsIDE2LCAxMiwgMTYsCisgICAgICAxMywgMTYsIDExLCAxNiwgMTMsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA4LCAxNiwgMTAsIDE2LCAxMCwgMTYsIDEyLCAxNiwgMTEsIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTMsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgOCwgMTYsIDEwLCAxNiwgMTEsIDE2LCAxMiwgMTYsCisgICAgICAxMCwgMTYsIDExLCAxNiwgMTIsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNiwgMTAsIDE0LCAxMiwgMTYsIDEyLCAxNiwgMTEsIDE2LCAxMCwgMTQsIDEzLCAxNiwgMTIsIDE0LAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAgOSwgMTYsIDEyLCAxNiwgMTAsIDE2LCAxMiwgMTYsCisgICAgICAxMywgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNiwgMTIsIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTEsIDE2LCAxMiwgMTYsIDExLCAxNiwgMTIsIDE1LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMiwgMTMsCisgICAgICAxMiwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxMiwgMTMsIDE2LCAxNiwgMTMsIDE0LCAxMywgMTYsIDEzLCAxMywKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAxMCwgIDUsIDEwLCAgNSwgMTAsICA4LCAxMCwgIDYsIDExLCAgOCwgMTEsICA4LCAxMSwgIDksIDEwLAorICAgICAgMTQsIDE2LCAxMywgMTQsIDEzLCAxNCwgMTIsIDEyLCAgNCwgMTIsICA1LCAxMCwgIDgsIDEyLCAgOSwgMTAsCisgICAgICAgNywgMTIsICA4LCAxMSwgIDksIDEyLCAgOSwgMTAsIDE0LCAxNiwgMTIsIDEzLCAxMywgMTQsIDEyLCAxMiwKKyAgICAgICA5LCAxNiwgIDgsIDEyLCAxMiwgMTQsIDEwLCAxMSwgMTEsIDE2LCAgOSwgMTIsIDEyLCAxNCwgMTEsIDExLAorICAgICAgMTQsIDE2LCAxMiwgMTMsIDE0LCAxNSwgMTIsIDEyLCAgNCwgMTIsICA3LCAxMSwgIDYsIDExLCAgOSwgMTAsCisgICAgICAgOCwgMTIsICA5LCAxMSwgIDgsIDExLCAgOSwgMTAsIDE0LCAxNiwgMTIsIDE0LCAxMywgMTQsIDEyLCAxMiwKKyAgICAgICA3LCAxMywgIDgsIDExLCAgOCwgMTIsICA5LCAxMCwgIDgsIDEzLCAgOCwgMTEsICA5LCAxMiwgIDksIDEwLAorICAgICAgMTQsIDE2LCAxMiwgMTMsIDEyLCAxMywgMTEsIDExLCAxMSwgMTYsIDEwLCAxMiwgMTIsIDE0LCAxMSwgMTEsCisgICAgICAxMiwgMTYsIDEwLCAxMiwgMTIsIDE0LCAxMSwgMTEsIDE2LCAxNiwgMTIsIDEzLCAxNCwgMTUsIDEyLCAxMSwKKyAgICAgIDEwLCAxNiwgMTEsIDE0LCAgOSwgMTMsIDEwLCAxMSwgMTEsIDE2LCAxMiwgMTQsIDEwLCAxMywgMTEsIDExLAorICAgICAgMTUsIDE2LCAxMywgMTQsIDEzLCAxNCwgMTIsIDEyLCAxMSwgMTYsIDEyLCAxNCwgMTAsIDEzLCAxMSwgMTEsCisgICAgICAxMiwgMTYsIDEyLCAxNCwgMTEsIDEzLCAxMSwgMTEsIDE1LCAxNiwgMTMsIDE0LCAxMywgMTQsIDEyLCAxMSwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxMywgMTUsIDEyLCAxMiwgMTQsIDE2LCAxMiwgMTQsIDEzLCAxNSwgMTEsIDExLAorICAgICAgMTYsIDE2LCAxMywgMTQsIDE0LCAxNSwgMTIsIDExLCAgMywgMTEsICA1LCAxMCwgIDYsIDExLCAgOSwgMTAsCisgICAgICAgNywgMTIsICA4LCAxMSwgIDksIDExLCAgOSwgMTAsIDE0LCAxNiwgMTMsIDEzLCAxMywgMTQsIDEyLCAxMiwKKyAgICAgICA1LCAxMiwgIDYsIDEwLCAgOCwgMTIsICA5LCAxMCwgIDgsIDEzLCAgOCwgMTEsICA5LCAxMiwgIDksIDEwLAorICAgICAgMTQsIDE2LCAxMiwgMTMsIDEzLCAxNCwgMTIsIDEyLCAgOSwgMTYsICA4LCAxMSwgMTEsIDE0LCAxMCwgMTEsCisgICAgICAxMSwgMTYsICA5LCAxMiwgMTIsIDE0LCAxMCwgMTEsIDE1LCAxNiwgMTIsIDEzLCAxNCwgMTUsIDEyLCAxMSwKKyAgICAgICA1LCAxMiwgIDcsIDExLCAgNiwgMTEsICA5LCAxMCwgIDgsIDEzLCAgOSwgMTEsICA4LCAxMSwgIDksIDEwLAorICAgICAgMTQsIDE2LCAxMiwgMTQsIDEzLCAxMywgMTIsIDEyLCAgNywgMTMsICA4LCAxMSwgIDgsIDEyLCAgOSwgMTAsCisgICAgICAgOCwgMTIsICA4LCAxMSwgIDksIDEyLCAgOSwgMTAsIDEzLCAxNiwgMTIsIDEzLCAxMiwgMTMsIDExLCAxMSwKKyAgICAgIDEwLCAxNiwgIDksIDEyLCAxMiwgMTQsIDEwLCAxMSwgMTEsIDE1LCAgOSwgMTIsIDEyLCAxNCwgMTAsIDExLAorICAgICAgMTQsIDE2LCAxMSwgMTMsIDEzLCAxNCwgMTEsIDExLCAgOSwgMTYsIDExLCAxNCwgIDgsIDEzLCAxMCwgMTEsCisgICAgICAxMSwgMTYsIDEyLCAxMywgMTAsIDEzLCAxMCwgMTEsIDE2LCAxNiwgMTMsIDE1LCAxMywgMTQsIDEyLCAxMiwKKyAgICAgIDExLCAxNiwgMTEsIDE0LCAxMCwgMTMsIDEwLCAxMSwgMTEsIDE2LCAxMSwgMTMsIDEwLCAxMywgMTAsIDExLAorICAgICAgMTQsIDE2LCAxMywgMTQsIDEyLCAxMywgMTEsIDExLCAxNCwgMTYsIDEyLCAxNCwgMTMsIDE1LCAxMSwgMTEsCisgICAgICAxMywgMTYsIDEyLCAxMywgMTIsIDE0LCAxMSwgMTEsIDE0LCAxNiwgMTIsIDEzLCAxMiwgMTMsIDExLCAxMCwKKyAgICAgICA2LCAxNCwgIDgsIDEyLCAgOSwgMTMsIDEwLCAxMSwgMTAsIDE0LCAxMCwgMTIsIDExLCAxMywgMTEsIDEyLAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEyLCAgNywgMTQsICA4LCAxMiwgIDksIDEzLCAxMCwgMTEsCisgICAgICAxMCwgMTQsIDEwLCAxMiwgMTEsIDEzLCAxMSwgMTEsIDE2LCAxNiwgMTMsIDE0LCAxNCwgMTUsIDEzLCAxMiwKKyAgICAgIDEwLCAxNiwgIDgsIDEyLCAxMiwgMTQsIDEwLCAxMSwgMTIsIDE2LCAxMCwgMTIsIDEzLCAxNSwgMTEsIDExLAorICAgICAgMTYsIDE2LCAxMywgMTQsIDE1LCAxNiwgMTIsIDEyLCAgOCwgMTUsICA5LCAxMywgIDksIDEzLCAxMCwgMTEsCisgICAgICAxMCwgMTUsIDEwLCAxMywgMTAsIDEzLCAxMSwgMTEsIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMiwKKyAgICAgICA4LCAxNSwgIDksIDEyLCAxMCwgMTMsIDEwLCAxMSwgMTAsIDE0LCAxMCwgMTIsIDEwLCAxMywgMTAsIDExLAorICAgICAgMTYsIDE2LCAxMywgMTQsIDEzLCAxNCwgMTIsIDEyLCAxMCwgMTYsIDEwLCAxMywgMTIsIDE1LCAxMSwgMTEsCisgICAgICAxMSwgMTYsICA5LCAxMiwgMTIsIDE0LCAxMSwgMTEsIDE0LCAxNiwgMTEsIDEzLCAxNCwgMTYsIDEyLCAxMSwKKyAgICAgIDEwLCAxNiwgMTIsIDE0LCAgOSwgMTMsIDExLCAxMSwgMTIsIDE2LCAxMiwgMTQsIDExLCAxMywgMTEsIDExLAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNCwgMTMsIDEyLCAxMSwgMTYsIDEyLCAxNCwgMTEsIDE0LCAxMSwgMTEsCisgICAgICAxMSwgMTYsIDEyLCAxNCwgMTAsIDEzLCAxMSwgMTEsIDE1LCAxNiwgMTMsIDE1LCAxMiwgMTQsIDEyLCAxMSwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxMywgMTYsIDEyLCAxMiwgMTIsIDE2LCAxMiwgMTMsIDEyLCAxNCwgMTEsIDExLAorICAgICAgMTQsIDE2LCAxMSwgMTIsIDEyLCAxMywgMTAsIDEwLCAgOSwgMTYsIDEwLCAxNCwgMTEsIDE1LCAxMiwgMTIsCisgICAgICAxMiwgMTYsIDExLCAxMywgMTIsIDE1LCAxMiwgMTIsIDE2LCAxNiwgMTQsIDEzLCAxNSwgMTUsIDEzLCAxMiwKKyAgICAgIDEwLCAxNiwgMTAsIDE0LCAxMSwgMTUsIDExLCAxMiwgMTIsIDE2LCAxMSwgMTMsIDEyLCAxNCwgMTIsIDEyLAorICAgICAgMTYsIDE2LCAxNCwgMTMsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTYsICA5LCAxMiwgMTIsIDE0LCAxMSwgMTEsCisgICAgICAxMywgMTYsIDExLCAxMywgMTMsIDE1LCAxMSwgMTEsIDE2LCAxNiwgMTQsIDE0LCAxNiwgMTYsIDEyLCAxMiwKKyAgICAgIDEwLCAxNiwgMTAsIDE0LCAxMSwgMTQsIDExLCAxMiwgMTIsIDE2LCAxMSwgMTMsIDEyLCAxNCwgMTIsIDEyLAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDE1LCAxNSwgMTMsIDEyLCAxMCwgMTYsIDEwLCAxMywgMTEsIDE0LCAxMSwgMTIsCisgICAgICAxMSwgMTYsIDExLCAxMywgMTEsIDE0LCAxMSwgMTIsIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMiwKKyAgICAgIDExLCAxNiwgMTAsIDEyLCAxMiwgMTUsIDExLCAxMSwgMTIsIDE2LCAgOSwgMTIsIDEyLCAxNCwgMTAsIDExLAorICAgICAgMTYsIDE2LCAxMiwgMTMsIDE0LCAxNSwgMTEsIDExLCAxMSwgMTYsIDEyLCAxNCwgMTAsIDE0LCAxMSwgMTEsCisgICAgICAxMywgMTYsIDEyLCAxNCwgMTIsIDE0LCAxMSwgMTEsIDE2LCAxNiwgMTUsIDE1LCAxNCwgMTUsIDEyLCAxMiwKKyAgICAgIDExLCAxNiwgMTIsIDE0LCAxMSwgMTQsIDExLCAxMSwgMTIsIDE2LCAxMiwgMTQsIDExLCAxMywgMTEsIDExLAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDEzLCAxNCwgMTIsIDExLCAxMiwgMTYsIDExLCAxMywgMTIsIDE0LCAxMCwgMTAsCisgICAgICAxMiwgMTUsIDExLCAxMiwgMTIsIDEzLCAxMCwgMTAsIDE0LCAxNSwgMTEsIDExLCAxMiwgMTIsIDEwLCAgOSwKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgOCwgIDMsICA4LCAgNSwgIDksICA3LCAgOCwgIDUsIDEwLCAgNiwgMTAsICA4LCAxMSwgIDgsICA5LAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTEsIDExLCAgMiwgMTAsICA0LCAgOSwgIDcsIDEwLCAgNywgIDgsCisgICAgICAgNywgMTYsICA3LCAxMCwgIDksIDExLCAgOCwgIDksIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDExLCAxMSwKKyAgICAgICA3LCAxNiwgIDYsIDExLCAxMCwgMTYsICA5LCAxMCwgMTAsIDE2LCAgOSwgMTEsIDExLCAxNiwgIDksIDEwLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAgMywgMTAsICA2LCAgOSwgIDUsIDEwLCAgNywgIDksCisgICAgICAgNywgMTYsICA4LCAxMCwgIDgsIDExLCAgOCwgIDksIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxMSwKKyAgICAgICA1LCAxMSwgIDcsIDEwLCAgOCwgMTEsICA4LCAgOSwgIDcsIDE0LCAgNywgMTAsICA4LCAxMSwgIDgsICA5LAorICAgICAgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTAsIDExLCAgOSwgMTYsICA5LCAxMSwgMTEsIDE2LCAgOSwgMTAsCisgICAgICAxMCwgMTYsICA4LCAxMSwgMTEsIDE2LCAgOSwgMTAsIDE2LCAxNiwgMTEsIDE2LCAxNiwgMTYsIDExLCAxMCwKKyAgICAgICA4LCAxNiwgIDksIDE2LCAgNywgMTYsICA5LCAxMCwgMTEsIDE2LCAxMSwgMTYsIDEwLCAxNiwgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAgOSwgMTYsIDEwLCAxNiwgIDksIDE2LCAgOSwgMTAsCisgICAgICAxMCwgMTYsIDEwLCAxNiwgIDksIDE2LCAgOSwgMTAsIDE2LCAxNiwgMTYsIDE2LCAxMSwgMTYsIDExLCAxMSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEwLCAxMCwgMTEsIDE2LCAxMSwgMTYsIDExLCAxNiwgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxMSwgMTYsIDExLCAxNiwgMTAsICA5LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICB9LAorICAgIHsKKyAgICAgICAxLCAxMCwgIDYsIDEwLCAgNywgMTEsICA5LCAxMCwgIDgsIDEyLCAgOSwgMTIsICA5LCAxMiwgMTAsIDEwLAorICAgICAgMTUsIDE2LCAxNCwgMTUsIDE0LCAxNiwgMTMsIDEyLCAgNSwgMTIsICA3LCAxMSwgIDgsIDExLCAgOSwgMTAsCisgICAgICAgOSwgMTMsICA5LCAxMiwgMTAsIDEyLCAxMCwgMTAsIDE2LCAxNiwgMTQsIDE1LCAxMywgMTYsIDEzLCAxMiwKKyAgICAgIDEwLCAxNSwgMTAsIDEzLCAxMiwgMTQsIDExLCAxMSwgMTIsIDE2LCAxMSwgMTMsIDEyLCAxNCwgMTEsIDExLAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTMsIDEyLCAgNSwgMTIsICA4LCAxMSwgIDcsIDExLCAgOSwgMTAsCisgICAgICAgOSwgMTMsIDEwLCAxMiwgIDksIDEyLCAxMCwgMTAsIDE0LCAxNiwgMTQsIDE1LCAxMywgMTQsIDEzLCAxMiwKKyAgICAgICA3LCAxMywgIDksIDEyLCAgOSwgMTIsIDEwLCAxMCwgIDksIDEzLCAgOSwgMTIsICA5LCAxMiwgMTAsIDEwLAorICAgICAgMTQsIDE2LCAxMywgMTQsIDEzLCAxNSwgMTIsIDEyLCAxMSwgMTYsIDExLCAxMywgMTIsIDE0LCAxMSwgMTEsCisgICAgICAxMiwgMTYsIDExLCAxNCwgMTIsIDE0LCAxMSwgMTEsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEzLCAxMiwKKyAgICAgIDEwLCAxNiwgMTEsIDE0LCAxMCwgMTMsIDExLCAxMSwgMTIsIDE2LCAxMiwgMTQsIDExLCAxMywgMTEsIDExLAorICAgICAgMTUsIDE2LCAxNSwgMTYsIDE0LCAxNiwgMTMsIDEyLCAxMSwgMTYsIDEyLCAxNCwgMTEsIDE0LCAxMSwgMTIsCisgICAgICAxMiwgMTYsIDEyLCAxNCwgMTEsIDE0LCAxMSwgMTEsIDE1LCAxNiwgMTQsIDE2LCAxMywgMTYsIDEzLCAxMiwKKyAgICAgIDEzLCAxNiwgMTMsIDE2LCAxMywgMTYsIDEyLCAxMiwgMTMsIDE2LCAxMywgMTYsIDEzLCAxNiwgMTIsIDEyLAorICAgICAgMTYsIDE2LCAxNCwgMTUsIDE0LCAxNiwgMTMsIDEyLCAgNCwgMTEsICA3LCAxMCwgIDcsIDExLCAgOSwgMTAsCisgICAgICAgOSwgMTMsICA5LCAxMSwgIDksIDEyLCAxMCwgMTAsIDE1LCAxNiwgMTQsIDE1LCAxNCwgMTUsIDEzLCAxMiwKKyAgICAgICA2LCAxMiwgIDcsIDExLCAgOCwgMTEsICA5LCAxMCwgIDksIDEzLCAgOSwgMTIsIDEwLCAxMiwgMTAsIDEwLAorICAgICAgMTUsIDE2LCAxMywgMTQsIDE0LCAxNSwgMTIsIDEyLCAxMCwgMTQsIDEwLCAxMiwgMTIsIDEzLCAxMSwgMTEsCisgICAgICAxMiwgMTYsIDExLCAxMywgMTIsIDE0LCAxMSwgMTEsIDE2LCAxNiwgMTQsIDE1LCAxNSwgMTYsIDEzLCAxMiwKKyAgICAgICA2LCAxMiwgIDgsIDExLCAgOCwgMTEsICA5LCAxMCwgIDksIDEzLCAxMCwgMTIsICA5LCAxMiwgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxNCwgMTUsIDEzLCAxNCwgMTIsIDEyLCAgOCwgMTMsICA5LCAxMSwgIDksIDEyLCAgOSwgMTAsCisgICAgICAgOSwgMTMsICA5LCAxMiwgIDksIDEyLCAgOSwgMTAsIDE0LCAxNiwgMTMsIDE0LCAxMywgMTQsIDEyLCAxMSwKKyAgICAgIDExLCAxNSwgMTEsIDEzLCAxMiwgMTQsIDExLCAxMSwgMTEsIDE2LCAxMCwgMTMsIDEyLCAxNCwgMTEsIDExLAorICAgICAgMTUsIDE2LCAxMywgMTUsIDE0LCAxNiwgMTIsIDExLCAxMCwgMTYsIDEyLCAxMywgMTAsIDEzLCAxMSwgMTEsCisgICAgICAxMSwgMTYsIDEyLCAxNCwgMTAsIDEzLCAxMSwgMTEsIDE2LCAxNiwgMTQsIDE2LCAxMywgMTYsIDEzLCAxMiwKKyAgICAgIDExLCAxNiwgMTIsIDE0LCAxMCwgMTQsIDExLCAxMSwgMTEsIDE2LCAxMiwgMTQsIDEwLCAxMywgMTEsIDExLAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDEyLCAxNSwgMTIsIDExLCAxMywgMTYsIDEzLCAxNSwgMTMsIDE1LCAxMiwgMTIsCisgICAgICAxMywgMTYsIDEyLCAxNSwgMTIsIDE1LCAxMiwgMTEsIDE1LCAxNiwgMTMsIDE2LCAxMywgMTYsIDEyLCAxMSwKKyAgICAgICA4LCAxNCwgIDksIDEyLCAxMCwgMTMsIDExLCAxMSwgMTEsIDE2LCAxMSwgMTMsIDExLCAxMywgMTEsIDExLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDEzLCAgOSwgMTQsIDEwLCAxMiwgMTAsIDEzLCAxMSwgMTEsCisgICAgICAxMSwgMTYsIDExLCAxMywgMTIsIDEzLCAxMSwgMTEsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTYsIDE0LCAxMiwKKyAgICAgIDExLCAxNiwgMTEsIDEzLCAxMiwgMTQsIDEyLCAxMSwgMTMsIDE2LCAxMiwgMTQsIDEzLCAxNCwgMTIsIDExLAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDEzLCAgOSwgMTQsIDEwLCAxMywgMTAsIDEzLCAxMSwgMTEsCisgICAgICAxMSwgMTYsIDExLCAxMywgMTEsIDEzLCAxMSwgMTEsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTUsIDE0LCAxMywKKyAgICAgICA5LCAxNCwgMTAsIDEzLCAxMCwgMTMsIDExLCAxMSwgMTEsIDE1LCAxMSwgMTMsIDExLCAxMywgMTEsIDExLAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTMsIDEyLCAxMiwgMTYsIDEyLCAxNCwgMTMsIDE0LCAxMiwgMTEsCisgICAgICAxMiwgMTYsIDExLCAxNCwgMTIsIDE1LCAxMiwgMTEsIDE2LCAxNiwgMTMsIDE2LCAxNSwgMTYsIDEzLCAxMSwKKyAgICAgIDExLCAxNiwgMTIsIDE0LCAxMSwgMTQsIDEyLCAxMSwgMTMsIDE2LCAxMywgMTUsIDEyLCAxNCwgMTIsIDEyLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDEzLCAxMiwgMTYsIDEzLCAxNSwgMTEsIDE0LCAxMiwgMTIsCisgICAgICAxMiwgMTYsIDEzLCAxNCwgMTEsIDE1LCAxMiwgMTEsIDE2LCAxNiwgMTUsIDE2LCAxMywgMTUsIDEzLCAxMiwKKyAgICAgIDEzLCAxNiwgMTMsIDE1LCAxMywgMTYsIDEyLCAxMiwgMTMsIDE2LCAxMywgMTUsIDEzLCAxNSwgMTIsIDEyLAorICAgICAgMTUsIDE2LCAxMywgMTYsIDEzLCAxNSwgMTEsIDEwLCAxMCwgMTYsIDEyLCAxNCwgMTIsIDE1LCAxMiwgMTIsCisgICAgICAxNCwgMTYsIDEzLCAxNSwgMTMsIDE2LCAxMywgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxMywKKyAgICAgIDEwLCAxNiwgMTIsIDE0LCAxMiwgMTUsIDEyLCAxMiwgMTMsIDE2LCAxMywgMTUsIDEzLCAxNSwgMTMsIDEyLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDEzLCAxMSwgMTYsIDEyLCAxNSwgMTMsIDE2LCAxMiwgMTIsCisgICAgICAxNCwgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMiwgMTIsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTYsIDE0LCAxMiwKKyAgICAgIDExLCAxNiwgMTIsIDE0LCAxMiwgMTYsIDEyLCAxMiwgMTQsIDE2LCAxMywgMTUsIDEzLCAxNSwgMTMsIDEyLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDEzLCAxMSwgMTYsIDEyLCAxNCwgMTIsIDE1LCAxMiwgMTIsCisgICAgICAxMywgMTYsIDEyLCAxNCwgMTIsIDE1LCAxMiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxMiwKKyAgICAgIDEyLCAxNiwgMTIsIDE1LCAxMywgMTYsIDEyLCAxMiwgMTMsIDE2LCAxMiwgMTUsIDEzLCAxNSwgMTIsIDExLAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE1LCAxNiwgMTMsIDEyLCAxMiwgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMiwgMTIsCisgICAgICAxNSwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxMiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxMywKKyAgICAgIDEyLCAxNiwgMTMsIDE1LCAxMiwgMTYsIDEyLCAxMiwgMTMsIDE2LCAxMywgMTUsIDEyLCAxNSwgMTIsIDEyLAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNiwgMTMsIDEyLCAxMywgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMiwgMTIsCisgICAgICAxMywgMTYsIDEyLCAxNiwgMTIsIDE1LCAxMiwgMTIsIDE0LCAxNiwgMTIsIDE0LCAxMiwgMTQsIDExLCAxMCwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDAsIDE2LCAgNiwgMTYsICA4LCAxNiwgMTYsIDE2LCAgOSwgMTYsIDExLCAxNiwgMTIsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA0LCAxNiwgIDcsIDE2LCAxMSwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNiwgMTEsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxMCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA1LCAxNiwgMTAsIDE2LCAgOSwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDgsIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxMCwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTEsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICAxLCAxNiwgIDcsIDE2LCAgOCwgMTYsIDEzLCAxNiwKKyAgICAgICA5LCAxNiwgMTEsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDQsIDE2LCAgNywgMTYsIDExLCAxNiwgMTMsIDE2LCAgOSwgMTYsIDExLCAxNiwgMTMsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA5LCAxNiwgIDksIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEzLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDQsIDE2LCAxMCwgMTYsICA4LCAxNiwgMTYsIDE2LCAxMCwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA3LCAxNiwgMTAsIDE2LCAxMSwgMTYsIDE2LCAxNiwKKyAgICAgICA5LCAxNiwgMTEsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTIsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEwLCAxNiwgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTIsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDQsIDE2LCAgOCwgMTYsIDEwLCAxNiwgMTYsIDE2LCAxMCwgMTYsIDExLCAxNiwgMTIsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA2LCAxNiwgIDgsIDE2LCAxMSwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNiwgMTIsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDksIDE2LCAgOSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA2LCAxNiwgMTAsIDE2LCAxMCwgMTYsIDE2LCAxNiwKKyAgICAgIDExLCAxNiwgMTIsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDgsIDE2LCAxMSwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMCwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEyLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxNiwgMTYsIDEwLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwKKyAgICAgIDEyLCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA2LCAxNiwgMTAsIDE2LCAxMSwgMTYsIDE2LCAxNiwKKyAgICAgIDExLCAxNiwgMTIsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDgsIDE2LCAgOSwgMTYsIDExLCAxNiwgMTMsIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA5LCAxNiwgIDksIDE2LCAxMywgMTYsIDEyLCAxNiwKKyAgICAgIDEzLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDgsIDE2LCAxMCwgMTYsIDEwLCAxNiwgMTQsIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA5LCAxNiwgMTEsIDE2LCAxMSwgMTYsIDEzLCAxNiwKKyAgICAgIDEwLCAxNiwgMTIsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTEsIDE2LCAxMCwgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMywgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA5LCAxNiwgMTIsIDE2LCAxMCwgMTYsIDEzLCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxMywgMTYsIDExLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMywgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDEyLCAxNiwKKyAgICAgIDEzLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIH0sCisgICAgeworICAgICAgIDAsIDEwLCAgNCwgMTAsICA1LCAxMSwgIDksIDExLCAgNiwgMTEsICA4LCAxMSwgIDgsIDEyLCAxMCwgMTIsCisgICAgICAxNSwgMTYsIDEzLCAxNSwgMTQsIDE1LCAxMywgMTQsICA0LCAxMiwgIDUsIDExLCAgOCwgMTIsICA5LCAxMSwKKyAgICAgICA3LCAxMywgIDgsIDEyLCAgOSwgMTMsIDEwLCAxMiwgMTUsIDE2LCAxMywgMTUsIDE0LCAxNiwgMTMsIDE0LAorICAgICAgMTAsIDE2LCAgOSwgMTMsIDEyLCAxNiwgMTEsIDEzLCAxMSwgMTYsIDEwLCAxNCwgMTMsIDE2LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTUsIDE2LCAxNCwgMTUsICA0LCAxMiwgIDcsIDEyLCAgNiwgMTIsICA5LCAxMSwKKyAgICAgICA4LCAxMywgIDksIDEyLCAgOSwgMTIsIDEwLCAxMiwgMTUsIDE2LCAxMywgMTUsIDE0LCAxNSwgMTMsIDE0LAorICAgICAgIDcsIDEzLCAgOCwgMTIsICA5LCAxMywgMTAsIDEyLCAgOCwgMTMsICA5LCAxMiwgIDksIDEzLCAxMCwgMTIsCisgICAgICAxNCwgMTYsIDEzLCAxNSwgMTMsIDE1LCAxMywgMTQsIDEyLCAxNiwgMTEsIDE0LCAxMywgMTYsIDEyLCAxMywKKyAgICAgIDEyLCAxNiwgMTEsIDE0LCAxMywgMTYsIDEyLCAxMywgMTYsIDE2LCAxNCwgMTYsIDE1LCAxNiwgMTQsIDE1LAorICAgICAgMTAsIDE2LCAxMiwgMTYsIDEwLCAxNCwgMTIsIDEzLCAxMiwgMTYsIDEzLCAxNiwgMTEsIDE0LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTUsIDEyLCAxNiwgMTMsIDE2LCAxMSwgMTUsIDEyLCAxMywKKyAgICAgIDEzLCAxNiwgMTMsIDE2LCAxMiwgMTUsIDEyLCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTMsIDE1LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxMywgMTUsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsICAyLCAxMSwgIDUsIDExLCAgNiwgMTEsICA5LCAxMSwKKyAgICAgICA3LCAxMiwgIDgsIDExLCAgOSwgMTIsIDEwLCAxMiwgMTUsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDE0LAorICAgICAgIDQsIDEzLCAgNiwgMTEsICA4LCAxMiwgIDksIDExLCAgOCwgMTMsICA4LCAxMiwgMTAsIDEzLCAxMCwgMTIsCisgICAgICAxNSwgMTYsIDEzLCAxNSwgMTQsIDE1LCAxMywgMTQsICA5LCAxNiwgIDgsIDEzLCAxMiwgMTUsIDExLCAxMiwKKyAgICAgIDExLCAxNiwgMTAsIDE0LCAxMywgMTYsIDEyLCAxMywgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE1LAorICAgICAgIDUsIDEzLCAgOCwgMTIsICA3LCAxMiwgIDksIDExLCAgOCwgMTMsICA5LCAxMiwgIDksIDEyLCAxMCwgMTIsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTQsIDE1LCAxMywgMTMsICA3LCAxMywgIDgsIDEyLCAgOSwgMTMsIDEwLCAxMiwKKyAgICAgICA4LCAxMywgIDgsIDEyLCAgOSwgMTMsIDEwLCAxMiwgMTQsIDE2LCAxMywgMTQsIDEzLCAxNSwgMTIsIDEzLAorICAgICAgMTEsIDE2LCAxMCwgMTQsIDEzLCAxNiwgMTIsIDEzLCAxMSwgMTYsIDEwLCAxMywgMTIsIDE1LCAxMSwgMTMsCisgICAgICAxNCwgMTYsIDEyLCAxNCwgMTQsIDE2LCAxMywgMTQsIDEwLCAxNiwgMTIsIDE1LCAgOSwgMTQsIDExLCAxMywKKyAgICAgIDEyLCAxNiwgMTIsIDE2LCAxMSwgMTQsIDEyLCAxMywgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE1LAorICAgICAgMTEsIDE2LCAxMiwgMTUsIDExLCAxNSwgMTIsIDEzLCAxMiwgMTYsIDEyLCAxNSwgMTEsIDE0LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTMsIDE1LCAxMywgMTQsIDE1LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEzLCAxNCwKKyAgICAgIDE0LCAxNiwgMTMsIDE2LCAxNCwgMTYsIDEzLCAxNCwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTMsIDE0LAorICAgICAgIDcsIDE1LCAgOCwgMTMsICA5LCAxNCwgMTEsIDEzLCAxMCwgMTQsIDEwLCAxMywgMTEsIDE0LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxNSwgMTQsICA3LCAxNiwgIDgsIDEzLCAxMCwgMTQsIDExLCAxMywKKyAgICAgIDExLCAxNSwgMTAsIDEzLCAxMiwgMTQsIDEyLCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LAorICAgICAgMTAsIDE2LCAgOSwgMTMsIDEzLCAxNiwgMTIsIDEzLCAxMywgMTYsIDExLCAxNCwgMTQsIDE2LCAxMywgMTQsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsICA4LCAxNiwgMTAsIDE0LCAgOSwgMTQsIDExLCAxMywKKyAgICAgIDExLCAxNiwgMTEsIDE0LCAxMSwgMTQsIDEyLCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE1LAorICAgICAgIDgsIDE2LCAxMCwgMTQsIDEwLCAxNCwgMTEsIDEzLCAxMCwgMTUsIDEwLCAxNCwgMTEsIDE0LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTUsIDE2LCAxNCwgMTQsIDExLCAxNiwgMTAsIDE0LCAxMywgMTYsIDEyLCAxMywKKyAgICAgIDExLCAxNiwgMTAsIDEzLCAxMywgMTYsIDEyLCAxMywgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTQsIDE0LAorICAgICAgMTEsIDE2LCAxMiwgMTYsIDEwLCAxNSwgMTIsIDEzLCAxNCwgMTYsIDE0LCAxNiwgMTIsIDE2LCAxMywgMTQsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMSwgMTYsIDEyLCAxNCwKKyAgICAgIDEyLCAxNiwgMTMsIDE2LCAxMSwgMTQsIDEyLCAxMywgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE0LAorICAgICAgMTUsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE0LCAxMywgMTYsIDEzLCAxNSwgMTQsIDE2LCAxMywgMTQsCisgICAgICAxNCwgMTYsIDEzLCAxNCwgMTQsIDE1LCAxMywgMTQsICA5LCAxNiwgMTEsIDE2LCAxMiwgMTYsIDEzLCAxNCwKKyAgICAgIDEyLCAxNiwgMTIsIDE1LCAxMywgMTYsIDEzLCAxNCwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTUsIDE1LAorICAgICAgMTAsIDE2LCAxMCwgMTYsIDEyLCAxNiwgMTIsIDE0LCAxMiwgMTYsIDEyLCAxNCwgMTMsIDE2LCAxMywgMTQsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDExLCAxNiwgMTAsIDE0LCAxNCwgMTYsIDEyLCAxMywKKyAgICAgIDE0LCAxNiwgMTIsIDE2LCAxNCwgMTYsIDEzLCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LAorICAgICAgMTAsIDE2LCAxMiwgMTYsIDExLCAxNiwgMTIsIDE0LCAxMywgMTYsIDEyLCAxNSwgMTMsIDE2LCAxMywgMTQsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDEwLCAxNiwgMTEsIDE2LCAxMiwgMTYsIDEyLCAxNCwKKyAgICAgIDEyLCAxNiwgMTIsIDE1LCAxMywgMTYsIDEzLCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE0LAorICAgICAgMTEsIDE2LCAxMCwgMTQsIDE0LCAxNiwgMTIsIDEzLCAxMywgMTYsIDExLCAxNCwgMTQsIDE2LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTQsIDEyLCAxNiwgMTMsIDE2LCAxMSwgMTYsIDEyLCAxNCwKKyAgICAgIDE1LCAxNiwgMTQsIDE2LCAxMywgMTYsIDEzLCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LAorICAgICAgMTIsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTIsIDE0LCAxMywgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMiwgMTMsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTUsIDEzLCAxNiwgMTMsIDE2LCAxNCwgMTYsIDEyLCAxMywKKyAgICAgIDEzLCAxNiwgMTMsIDE0LCAxNCwgMTYsIDEyLCAxMywgMTYsIDE2LCAxNCwgMTQsIDE0LCAxNSwgMTMsIDEzLAorICAgIH0sCisgICAgeworICAgICAgIDAsICA5LCAgMywgIDksICA1LCAgOSwgIDcsICA5LCAgNSwgMTAsICA3LCAxMSwgIDgsIDExLCAgOSwgMTAsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICAyLCAxMSwgIDQsIDEwLCAgNywgMTEsICA4LCAxMCwKKyAgICAgICA3LCAxNiwgIDcsIDExLCAgOSwgMTYsICA5LCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDgsIDE2LCAgNywgMTYsIDExLCAxNiwgMTAsIDExLCAxMSwgMTYsIDEwLCAxNiwgMTYsIDE2LCAxMSwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICAyLCAxMSwgIDYsIDEwLCAgNiwgMTAsICA4LCAxMCwKKyAgICAgICA3LCAxNiwgIDgsIDE2LCAgOCwgMTEsICA5LCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDUsIDEzLCAgNywgMTEsICA4LCAxMSwgIDksIDExLCAgNiwgMTIsICA4LCAxMiwgIDgsIDEyLCAgOSwgMTEsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEwLCAxNiwgMTAsIDE2LCAxMiwgMTYsIDEwLCAxMywKKyAgICAgIDEwLCAxNiwgIDksIDE2LCAxMSwgMTYsIDExLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDgsIDE2LCAxMCwgMTYsICA4LCAxNiwgMTAsIDEyLCAxMSwgMTYsIDEyLCAxNiwgMTAsIDE2LCAxMSwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEwLCAxNiwgMTEsIDE2LCAxMCwgMTYsIDExLCAxNiwKKyAgICAgIDExLCAxNiwgMTIsIDE2LCAxMCwgMTYsIDExLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIH0sCisgICAgeworICAgICAgIDEsIDEwLCAgNSwgMTAsICA2LCAxMCwgIDksIDEwLCAgNywgMTIsICA5LCAxMiwgIDksIDEyLCAxMCwgMTAsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxMywgMTMsICA1LCAxMiwgIDcsIDExLCAgOCwgMTEsICA5LCAxMCwKKyAgICAgICA4LCAxMywgIDksIDEyLCAxMCwgMTIsIDEwLCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsIDEyLAorICAgICAgMTAsIDE2LCAxMCwgMTMsIDEyLCAxNCwgMTIsIDEyLCAxMiwgMTYsIDExLCAxNCwgMTMsIDE1LCAxMiwgMTIsCisgICAgICAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNCwgMTMsICA1LCAxMiwgIDgsIDExLCAgNywgMTEsICA5LCAxMCwKKyAgICAgICA4LCAxMywgMTAsIDEyLCAgOSwgMTIsIDEwLCAxMCwgMTUsIDE2LCAxNCwgMTUsIDE0LCAxNCwgMTMsIDEzLAorICAgICAgIDcsIDEzLCAgOSwgMTIsICA5LCAxMiwgMTAsIDEwLCAgOSwgMTMsIDEwLCAxMywgMTAsIDEzLCAxMCwgMTAsCisgICAgICAxNCwgMTYsIDE0LCAxNSwgMTQsIDE2LCAxMywgMTIsIDExLCAxNiwgMTIsIDE0LCAxMiwgMTUsIDEyLCAxMiwKKyAgICAgIDEyLCAxNiwgMTIsIDE1LCAxMywgMTYsIDEyLCAxMiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDEzLAorICAgICAgMTAsIDE2LCAxMiwgMTQsIDEwLCAxNCwgMTIsIDEyLCAxMiwgMTYsIDEzLCAxNCwgMTEsIDE0LCAxMiwgMTIsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTMsIDExLCAxNiwgMTIsIDE0LCAxMSwgMTQsIDEyLCAxMiwKKyAgICAgIDEyLCAxNiwgMTMsIDE2LCAxMSwgMTUsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDEzLAorICAgICAgMTMsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTMsIDEzLCAxMywgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMywgMTIsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTMsICA0LCAxMSwgIDcsIDEwLCAgNywgMTEsICA5LCAxMCwKKyAgICAgICA4LCAxMiwgIDksIDEyLCAgOSwgMTIsIDEwLCAxMSwgMTUsIDE2LCAxNCwgMTUsIDE0LCAxNiwgMTMsIDEzLAorICAgICAgIDYsIDEyLCAgNywgMTEsICA4LCAxMSwgIDksIDEwLCAgOSwgMTMsICA5LCAxMiwgMTAsIDEyLCAxMCwgMTAsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxMywgMTIsIDEwLCAxNiwgMTAsIDEzLCAxMiwgMTQsIDEyLCAxMSwKKyAgICAgIDEyLCAxNiwgMTEsIDE0LCAxMywgMTQsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTQsIDEzLAorICAgICAgIDYsIDEyLCAgOCwgMTEsICA3LCAxMSwgIDksIDEwLCAgOSwgMTQsIDEwLCAxMiwgIDksIDEyLCAxMCwgMTAsCisgICAgICAxNSwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNCwgMTMsICA3LCAxMywgIDksIDEyLCAgOSwgMTIsIDEwLCAxMCwKKyAgICAgICA5LCAxMywgIDksIDEyLCAgOSwgMTIsIDEwLCAxMCwgMTQsIDE2LCAxMywgMTQsIDE0LCAxNiwgMTIsIDExLAorICAgICAgMTEsIDE2LCAxMSwgMTQsIDEyLCAxNCwgMTIsIDEyLCAxMiwgMTYsIDExLCAxNCwgMTIsIDE0LCAxMiwgMTEsCisgICAgICAxNiwgMTYsIDEzLCAxNiwgMTQsIDE2LCAxMywgMTIsIDEwLCAxNiwgMTIsIDE0LCAxMCwgMTQsIDExLCAxMSwKKyAgICAgIDEyLCAxNiwgMTMsIDE0LCAxMSwgMTQsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsIDEzLAorICAgICAgMTEsIDE2LCAxMiwgMTYsIDExLCAxNCwgMTIsIDEyLCAxMiwgMTYsIDEyLCAxNCwgMTEsIDE0LCAxMiwgMTEsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTMsIDE1LCAxMywgMTIsIDEzLCAxNiwgMTQsIDE2LCAxMywgMTYsIDEzLCAxMiwKKyAgICAgIDEzLCAxNiwgMTMsIDE2LCAxMywgMTYsIDEzLCAxMiwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTIsIDExLAorICAgICAgIDgsIDEzLCAxMCwgMTIsIDEwLCAxMywgMTEsIDExLCAxMSwgMTQsIDEyLCAxNCwgMTIsIDE0LCAxMiwgMTIsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTMsICA5LCAxNCwgMTAsIDEzLCAxMCwgMTMsIDExLCAxMSwKKyAgICAgIDEyLCAxNiwgMTIsIDEzLCAxMiwgMTMsIDEyLCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE0LAorICAgICAgMTIsIDE2LCAxMSwgMTQsIDEzLCAxNSwgMTIsIDEyLCAxMywgMTYsIDEyLCAxNSwgMTQsIDE1LCAxMywgMTIsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTMsICA5LCAxNCwgMTEsIDEzLCAxMCwgMTMsIDExLCAxMSwKKyAgICAgIDExLCAxNiwgMTIsIDE0LCAxMiwgMTQsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLAorICAgICAgMTAsIDE1LCAxMSwgMTMsIDExLCAxNCwgMTIsIDExLCAxMSwgMTYsIDEyLCAxNCwgMTEsIDE0LCAxMiwgMTEsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTIsIDEyLCAxNiwgMTIsIDE0LCAxMywgMTUsIDEzLCAxMiwKKyAgICAgIDEyLCAxNiwgMTIsIDE0LCAxMywgMTUsIDEyLCAxMiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDEyLAorICAgICAgMTIsIDE2LCAxMywgMTYsIDExLCAxNCwgMTIsIDEyLCAxNCwgMTYsIDE0LCAxNiwgMTIsIDE2LCAxMywgMTIsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDEyLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDEzLCAxMiwKKyAgICAgIDEyLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDEyLAorICAgICAgMTQsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTQsIDEzLCAxMywgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMywgMTIsCisgICAgICAxNiwgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMiwgMTEsICA5LCAxNiwgMTIsIDE1LCAxMywgMTYsIDEzLCAxMiwKKyAgICAgIDEzLCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE0LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorICAgICAgMTAsIDE2LCAxMiwgMTUsIDEyLCAxNSwgMTMsIDEyLCAxMywgMTYsIDE0LCAxNiwgMTMsIDE2LCAxMywgMTIsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDEyLCAxNiwgMTIsIDE2LCAxMywgMTYsIDEzLCAxMiwKKyAgICAgIDE0LCAxNiwgMTMsIDE2LCAxNCwgMTYsIDEzLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLAorICAgICAgMTEsIDE2LCAxMiwgMTUsIDEyLCAxNiwgMTMsIDEyLCAxNCwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxMywgMTMsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTMsIDExLCAxNiwgMTIsIDE2LCAxMiwgMTYsIDEzLCAxMiwKKyAgICAgIDEzLCAxNiwgMTMsIDE1LCAxMywgMTYsIDEzLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDEzLAorICAgICAgMTIsIDE2LCAxMiwgMTYsIDEzLCAxNiwgMTMsIDEyLCAxMywgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMywgMTIsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTIsIDEyLCAxNiwgMTQsIDE2LCAxMSwgMTYsIDEzLCAxMiwKKyAgICAgIDE0LCAxNiwgMTQsIDE2LCAxMywgMTYsIDEzLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLAorICAgICAgMTIsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTMsIDEyLCAxMywgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMywgMTIsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTIsIDEzLCAxNiwgMTMsIDE2LCAxMywgMTYsIDEzLCAxMywKKyAgICAgIDEzLCAxNiwgMTIsIDE2LCAxMiwgMTYsIDEyLCAxMiwgMTQsIDE2LCAxMywgMTUsIDEzLCAxNiwgMTIsIDExLAorICAgIH0sCisgIH0sCit9OworCisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ2MzRfdGFibGVfaW50cmFfc2Vjb25kcGF0W05VTV9JTlRSQV9UQUJMRVNdWzJdW09USEVSQkxLX1ZMQ19TSVpFXSA9IHsKKyAgeworICAgIHsKKyAgICAgICAwLCAgNSwgMTAsICAzLCAgNiwgMTAsICA3LCAgOCwgIDksICA0LCAgNiwgMTAsICA2LCAgNywgIDksICA4LAorICAgICAgIDgsICA5LCAgOCwgIDgsICA5LCAgOCwgIDksICA5LCAgOSwgIDksICA4LCAgMywgIDYsIDEwLCAgNCwgIDYsCisgICAgICAxMCwgIDcsICA3LCAgOSwgIDUsICA3LCAxMCwgIDYsICA3LCAgOSwgIDcsICA3LCAgOCwgIDcsICA4LCAgOSwKKyAgICAgICA4LCAgOCwgIDksICA4LCAgOCwgIDcsICA2LCAgOCwgMTAsICA2LCAgOCwgMTAsICA3LCAgOCwgIDksICA3LAorICAgICAgIDgsIDEwLCAgNywgIDgsIDEwLCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOCwgIDgsICA5LCAgOSwgIDgsCisgICAgICAgNywgIDcsICA4LCAgOSwgIDcsICA4LCAgOSwgIDcsICA3LCAgNywgIDgsICA4LCAgOSwgIDcsICA4LCAgOSwKKyAgICAgICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LCAgNiwgIDUsCisgICAgfSwKKyAgICB7CisgICAgICAgMCwgIDUsIDExLCAgMywgIDYsIDExLCAgOCwgIDksIDExLCAgMywgIDYsIDEwLCAgNiwgIDcsIDExLCAgOSwKKyAgICAgICA5LCAxMSwgIDcsICA5LCAxMSwgIDksICA5LCAxMSwgMTAsIDEwLCAxMSwgIDIsICA2LCAxMCwgIDQsICA3LAorICAgICAgMTAsICA3LCAgOSwgMTEsICA0LCAgNywgMTEsICA2LCAgNywgMTAsICA5LCAgOSwgMTEsICA3LCAgOSwgMTEsCisgICAgICAgOCwgIDksIDEwLCAxMCwgMTAsIDEwLCAgNSwgIDgsIDExLCAgNiwgIDgsIDExLCAgOCwgIDksIDExLCAgNiwKKyAgICAgICA4LCAxMSwgIDcsICA4LCAxMSwgIDksICA5LCAxMSwgIDgsIDEwLCAxMSwgIDksICA5LCAxMSwgMTAsIDEwLAorICAgICAgMTAsICA4LCAgOSwgMTEsICA4LCAgOSwgMTEsICA5LCAgOSwgMTAsICA4LCAgOSwgMTEsICA4LCAgOSwgMTEsCisgICAgICAgOSwgIDksIDEwLCAgOCwgIDksIDEwLCAgOSwgIDksIDEwLCAgOSwgIDksICA4LAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAgMCwgIDUsIDEwLCAgNCwgIDYsIDEwLCAgNywgIDgsIDEwLCAgNCwgIDYsIDEwLCAgNiwgIDcsICA5LCAgOCwKKyAgICAgICA4LCAgOSwgIDgsICA4LCAgOSwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDIsICA2LCAxMCwgIDQsICA2LAorICAgICAgMTAsICA3LCAgNywgIDksICA1LCAgNywgMTAsICA2LCAgNywgIDksICA3LCAgNywgIDksICA3LCAgOCwgIDksCisgICAgICAgOCwgIDgsICA5LCAgOSwgIDgsICA4LCAgNiwgIDgsIDEwLCAgNiwgIDgsIDEwLCAgNywgIDgsICA5LCAgNiwKKyAgICAgICA4LCAxMCwgIDcsICA4LCAxMCwgIDgsICA4LCAgOSwgIDgsICA5LCAxMCwgIDgsICA4LCAgOSwgIDksICA5LAorICAgICAgIDgsICA4LCAgOCwgMTAsICA3LCAgOCwgIDksICA3LCAgOCwgIDgsICA3LCAgOCwgMTAsICA3LCAgOCwgIDksCisgICAgICAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOCwgIDgsICA4LCAgNywgIDcsICA2LAorICAgIH0sCisgICAgeworICAgICAgIDAsICA1LCAxMiwgIDQsICA3LCAxMiwgIDgsIDEwLCAxMywgIDQsICA3LCAxMiwgIDYsICA4LCAxMiwgMTAsCisgICAgICAxMCwgMTIsICA4LCAgOSwgMTIsIDEwLCAxMCwgMTIsIDEyLCAxMiwgMTIsICAxLCAgNiwgMTIsICA0LCAgNywKKyAgICAgIDEyLCAgOCwgIDksIDEyLCAgNCwgIDcsIDEyLCAgNiwgIDgsIDExLCAgOSwgMTAsIDEyLCAgOCwgIDksIDEyLAorICAgICAgIDksIDEwLCAxMSwgMTEsIDExLCAxMiwgIDYsICA4LCAxMiwgIDcsICA5LCAxMiwgIDksIDEwLCAxMywgIDYsCisgICAgICAgOSwgMTIsICA4LCAgOSwgMTIsIDEwLCAxMCwgMTIsICA5LCAxMCwgMTIsIDEwLCAxMCwgMTIsIDEyLCAxMiwKKyAgICAgIDEyLCAgOCwgMTAsIDEyLCAgOSwgMTAsIDEyLCAxMCwgMTAsIDEyLCAgOCwgMTAsIDEyLCAgOSwgMTAsIDEyLAorICAgICAgMTAsIDEwLCAxMSwgIDksIDEwLCAxMiwgMTAsIDEwLCAxMSwgMTEsIDEwLCAxMCwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDAsICA1LCAxMCwgIDMsICA2LCAxMCwgIDcsICA4LCAxMSwgIDQsICA2LCAxMCwgIDYsICA3LCAxMCwgIDgsCisgICAgICAgOSwgMTAsICA4LCAgOCwgMTAsICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsICAyLCAgNiwgMTAsICA0LCAgNiwKKyAgICAgIDEwLCAgNywgIDgsIDEwLCAgNCwgIDcsIDEwLCAgNiwgIDcsIDEwLCAgOCwgIDgsIDEwLCAgNywgIDgsIDEwLAorICAgICAgIDgsICA4LCAgOSwgMTAsICA5LCAgOSwgIDUsICA4LCAxMSwgIDYsICA4LCAxMCwgIDcsICA5LCAxMCwgIDYsCisgICAgICAgOCwgMTEsICA3LCAgOCwgMTAsICA4LCAgOCwgMTAsICA4LCAgOSwgMTEsICA5LCAgOSwgMTAsIDEwLCAgOSwKKyAgICAgICA5LCAgOCwgIDksIDEwLCAgOCwgIDksIDEwLCAgOCwgIDksIDEwLCAgOCwgIDksIDEwLCAgOCwgIDgsIDEwLAorICAgICAgIDgsICA4LCAgOSwgIDgsICA5LCAxMCwgIDgsICA4LCAgOSwgIDksICA4LCAgOCwKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgNiwgMTMsICA0LCAgNywgMTQsICA5LCAxMSwgMTQsICAzLCAgNywgMTMsICA3LCAgOCwgMTMsIDExLAorICAgICAgMTEsIDE0LCAgOCwgMTAsIDEzLCAxMCwgMTEsIDEzLCAxMywgMTMsIDE0LCAgMSwgIDYsIDEyLCAgNCwgIDgsCisgICAgICAxMywgIDksIDEwLCAxNSwgIDQsICA4LCAxMywgIDcsICA4LCAxMiwgMTEsIDExLCAxNCwgIDgsIDEwLCAxMywKKyAgICAgIDEwLCAxMCwgMTMsIDEzLCAxMywgMTQsICA1LCAgOSwgMTMsICA3LCAgOSwgMTMsIDEwLCAxMSwgMTQsICA2LAorICAgICAgMTAsIDE0LCAgOCwgMTAsIDE0LCAxMSwgMTEsIDE0LCAgOSwgMTEsIDE0LCAxMSwgMTEsIDEzLCAxMywgMTMsCisgICAgICAxNCwgIDksIDEwLCAxNCwgIDksIDExLCAxMywgMTEsIDEyLCAxNCwgIDksIDExLCAxMywgIDksIDExLCAxNCwKKyAgICAgIDExLCAxMiwgMTMsIDEwLCAxMiwgMTUsIDExLCAxMSwgMTMsIDEzLCAxMiwgMTMsCisgICAgfSwKKyAgfSwKKyAgeworICAgIHsKKyAgICAgICAwLCAgNSwgMTEsICAzLCAgNiwgMTEsICA3LCAgOSwgMTIsICAzLCAgNiwgMTEsICA2LCAgNywgMTEsICA5LAorICAgICAgIDksIDExLCAgOCwgIDksIDExLCAgOSwgIDksIDExLCAxMSwgMTEsIDEyLCAgMiwgIDYsIDExLCAgNCwgIDYsCisgICAgICAxMSwgIDcsICA5LCAxMSwgIDQsICA3LCAxMSwgIDUsICA3LCAxMCwgIDksICA5LCAxMSwgIDcsICA4LCAxMSwKKyAgICAgICA5LCAgOSwgMTAsIDExLCAxMSwgMTEsICA1LCAgOCwgMTEsICA2LCAgOCwgMTEsICA4LCAgOSwgMTIsICA2LAorICAgICAgIDgsIDExLCAgNywgIDgsIDExLCAgOSwgIDksIDExLCAgOCwgIDksIDEyLCAgOSwgIDksIDExLCAxMSwgMTEsCisgICAgICAxMSwgIDgsIDEwLCAxMiwgIDgsIDEwLCAxMSwgIDksIDEwLCAxMiwgIDgsIDEwLCAxMiwgIDgsICA5LCAxMiwKKyAgICAgIDEwLCAxMCwgMTIsICA5LCAxMCwgMTIsICA5LCAgOSwgMTEsIDExLCAxMCwgMTEsCisgICAgfSwKKyAgICB7CisgICAgICAgMCwgIDYsIDEzLCAgMywgIDgsIDE0LCAxMCwgMTIsIDE2LCAgMywgIDgsIDE1LCAgNywgIDksIDE1LCAxMiwKKyAgICAgIDEzLCAxNSwgIDksIDExLCAxNSwgMTEsIDEyLCAxNiwgMTQsIDE2LCAxNiwgIDEsICA3LCAxMywgIDQsICA4LAorICAgICAgMTQsICA5LCAxMSwgMTUsICA0LCAgOCwgMTQsICA3LCAgOSwgMTQsIDEyLCAxMywgMTUsICA4LCAxMCwgMTQsCisgICAgICAxMSwgMTEsIDE0LCAxNiwgMTQsIDE2LCAgNiwgIDksIDE0LCAgNywgMTAsIDE0LCAxMSwgMTMsIDE1LCAgNywKKyAgICAgIDEwLCAxNCwgIDksIDEwLCAxMywgMTIsIDEyLCAxNSwgMTAsIDExLCAxNCwgMTEsIDExLCAxNCwgMTQsIDE0LAorICAgICAgMTYsICA5LCAxMSwgMTQsIDEwLCAxMSwgMTQsIDEzLCAxNCwgMTUsICA5LCAxMiwgMTQsIDEwLCAxMiwgMTYsCisgICAgICAxMywgMTQsIDE2LCAxMCwgMTMsIDE2LCAxMiwgMTIsIDE0LCAxNSwgMTQsIDE1LAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAgMCwgIDYsIDEyLCAgMywgIDcsIDEyLCAgOSwgMTEsIDEzLCAgNCwgIDcsIDEyLCAgNiwgIDgsIDEyLCAxMCwKKyAgICAgIDExLCAxMywgIDgsIDEwLCAxMywgMTAsIDExLCAxMywgMTMsIDEzLCAxNCwgIDEsICA2LCAxMiwgIDQsICA3LAorICAgICAgMTIsICA5LCAxMCwgMTQsICA0LCAgNywgMTIsICA2LCAgNywgMTIsIDEwLCAxMSwgMTMsICA4LCAgOSwgMTMsCisgICAgICAxMCwgMTAsIDEyLCAxMywgMTMsIDE0LCAgNiwgIDksIDEzLCAgNywgIDksIDEzLCAxMCwgMTIsIDE0LCAgNywKKyAgICAgICA5LCAxMywgIDgsIDEwLCAxMywgMTEsIDExLCAxNCwgIDksIDExLCAxMywgMTEsIDExLCAxNCwgMTMsIDEzLAorICAgICAgMTQsIDEwLCAxMiwgMTQsIDEwLCAxMiwgMTQsIDEyLCAxMywgMTUsIDEwLCAxMiwgMTQsIDEwLCAxMiwgMTQsCisgICAgICAxMiwgMTMsIDE1LCAxMSwgMTMsIDE1LCAxMiwgMTIsIDE1LCAxNCwgMTQsIDE0LAorICAgIH0sCisgICAgeworICAgICAgIDAsICA2LCAxNiwgIDMsICA4LCAxNiwgMTAsIDEzLCAxNiwgIDMsICA4LCAxNiwgIDcsICA5LCAxNiwgMTMsCisgICAgICAxNiwgMTYsICA4LCAxMCwgMTYsIDExLCAxMywgMTYsIDE2LCAxNiwgMTYsICAxLCAgNywgMTQsICA0LCAgOCwKKyAgICAgIDE2LCAxMCwgMTIsIDE2LCAgNCwgIDgsIDEzLCAgNywgIDksIDE2LCAxMywgMTQsIDE2LCAgOCwgMTAsIDE2LAorICAgICAgMTEsIDExLCAxNCwgMTYsIDE2LCAxNiwgIDYsICA5LCAxNCwgIDgsIDEwLCAxNCwgMTIsIDE2LCAxNiwgIDYsCisgICAgICAxMCwgMTMsICA5LCAxMSwgMTYsIDEzLCAxNCwgMTYsICA5LCAxMiwgMTYsIDEyLCAxMSwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxMCwgMTIsIDE2LCAxMSwgMTIsIDE2LCAxNiwgMTQsIDE2LCAgOSwgMTIsIDE2LCAxMSwgMTIsIDE2LAorICAgICAgMTYsIDE1LCAxNiwgMTAsIDEzLCAxNiwgMTIsIDEzLCAxNiwgMTYsIDE2LCAxNiwKKyAgICB9LAorICB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnYzNF90YWJsZV9pbnRyYV90aGlyZHBhdFtOVU1fSU5UUkFfVEFCTEVTXVsyXVtPVEhFUkJMS19WTENfU0laRV0gPSB7CisgIHsKKyAgICB7CisgICAgICAgMCwgIDUsIDEwLCAgMywgIDYsIDEwLCAgNywgIDgsIDEwLCAgNCwgIDcsIDEwLCAgNiwgIDcsIDEwLCAgOCwKKyAgICAgICA4LCAxMCwgIDgsICA5LCAxMCwgIDksICA5LCAxMCwgIDksICA5LCAgOSwgIDIsICA2LCAxMCwgIDQsICA3LAorICAgICAgMTAsICA3LCAgOCwgIDksICA1LCAgNywgMTAsICA2LCAgNywgMTAsICA4LCAgOCwgIDksICA4LCAgOSwgMTAsCisgICAgICAgOCwgIDgsICA5LCAgOSwgIDksICA4LCAgNiwgIDgsIDExLCAgNiwgIDgsIDEwLCAgNywgIDgsIDEwLCAgNiwKKyAgICAgICA4LCAxMSwgIDcsICA4LCAxMCwgIDgsICA4LCAgOSwgIDgsICA5LCAxMCwgIDksICA5LCAxMCwgIDksICA5LAorICAgICAgIDksICA3LCAgOCwgMTAsICA3LCAgOCwgMTAsICA3LCAgOCwgIDgsICA3LCAgOCwgMTAsICA3LCAgOCwgIDksCisgICAgICAgNywgIDgsICA4LCAgOCwgIDgsICA5LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LAorICAgIH0sCisgICAgeworICAgICAgIDAsICA0LCAxMCwgIDMsICA2LCAxMCwgIDcsICA4LCAxMSwgIDMsICA2LCAxMCwgIDUsICA3LCAxMCwgIDksCisgICAgICAgOSwgMTEsICA5LCAxMCwgMTEsICA5LCAxMCwgMTEsIDExLCAxMSwgMTEsICAyLCAgNiwgMTAsICA0LCAgNiwKKyAgICAgIDEwLCAgNywgIDgsIDEwLCAgNCwgIDcsIDEwLCAgNiwgIDcsIDEwLCAgOCwgIDksIDEwLCAgOCwgIDksIDExLAorICAgICAgIDksICA5LCAxMSwgMTAsIDEwLCAxMSwgIDYsICA4LCAxMSwgIDYsICA4LCAxMSwgIDgsICA5LCAxMSwgIDcsCisgICAgICAgOSwgMTEsICA3LCAgOCwgMTEsICA5LCAgOSwgMTEsICA5LCAxMCwgMTIsIDEwLCAxMCwgMTIsIDExLCAxMSwKKyAgICAgIDExLCAgOCwgIDksIDExLCAgOCwgIDksIDExLCAgOSwgIDksIDExLCAgOSwgMTAsIDExLCAgOSwgMTAsIDExLAorICAgICAgIDksIDEwLCAxMSwgMTAsIDExLCAxMiwgMTAsIDEwLCAxMiwgMTAsIDEwLCAxMCwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDAsICA1LCAxMCwgIDMsICA2LCAxMCwgIDcsICA4LCAxMCwgIDQsICA3LCAxMCwgIDYsICA3LCAxMCwgIDgsCisgICAgICAgOSwgMTAsICA4LCAgOSwgMTEsICA4LCAgOSwgMTAsIDEwLCAxMCwgMTAsICAyLCAgNiwgMTAsICA0LCAgNiwKKyAgICAgIDEwLCAgNywgIDgsIDEwLCAgNCwgIDcsIDEwLCAgNSwgIDcsIDEwLCAgOCwgIDgsIDEwLCAgOCwgIDksIDEwLAorICAgICAgIDgsICA5LCAxMCwgIDksICA5LCAgOSwgIDUsICA3LCAxMSwgIDYsICA4LCAxMSwgIDcsICA4LCAxMSwgIDYsCisgICAgICAgOCwgMTEsICA3LCAgOCwgMTAsICA4LCAgOSwgMTAsICA4LCAgOSwgMTEsICA5LCAgOSwgMTAsIDEwLCAgOSwKKyAgICAgIDEwLCAgNywgIDgsIDEwLCAgNywgIDgsIDEwLCAgOCwgIDksIDEwLCAgOCwgIDksIDEwLCAgOCwgIDksIDEwLAorICAgICAgIDgsICA4LCAxMCwgIDksICA5LCAxMCwgIDksICA5LCAxMCwgIDksICA5LCAgOSwKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgNSwgMTEsICAzLCAgNiwgMTEsICA4LCAgOSwgMTIsICA0LCAgNywgMTIsICA2LCAgNywgMTIsICA5LAorICAgICAgMTAsIDEzLCAxMCwgMTEsIDEzLCAxMCwgMTEsIDE0LCAxMiwgMTMsIDE0LCAgMSwgIDYsIDExLCAgNCwgIDcsCisgICAgICAxMSwgIDgsICA5LCAxMiwgIDUsICA3LCAxMSwgIDYsICA4LCAxMiwgIDksIDEwLCAxMywgMTAsIDExLCAxNCwKKyAgICAgIDEwLCAxMSwgMTMsIDEyLCAxMiwgMTQsICA2LCAgOCwgMTIsICA3LCAgOSwgMTMsICA5LCAxMCwgMTQsICA3LAorICAgICAgMTAsIDEzLCAgOCwgMTAsIDEyLCAxMSwgMTEsIDEzLCAxMSwgMTMsIDE0LCAxMSwgMTIsIDE0LCAxMywgMTMsCisgICAgICAxNSwgIDksIDEwLCAxMiwgIDksIDExLCAxNCwgMTAsIDExLCAxNCwgMTEsIDExLCAxMywgMTAsIDExLCAxMywKKyAgICAgIDExLCAxMiwgMTQsIDEyLCAxNCwgMTUsIDEzLCAxMywgMTQsIDEzLCAxMywgMTQsCisgICAgfSwKKyAgfSwKKyAgeworICAgIHsKKyAgICAgICAwLCAgNSwgMTEsICAzLCAgNiwgMTEsICA3LCAgOSwgMTEsICA0LCAgNiwgMTEsICA1LCAgNywgMTAsICA5LAorICAgICAgIDksIDExLCAgOCwgIDksIDExLCAgOSwgMTAsIDExLCAxMSwgMTEsIDExLCAgMiwgIDYsIDEwLCAgMywgIDYsCisgICAgICAxMCwgIDcsICA5LCAxMSwgIDQsICA3LCAxMCwgIDUsICA3LCAxMCwgIDgsICA5LCAxMSwgIDgsICA5LCAxMSwKKyAgICAgICA5LCAgOSwgMTEsIDExLCAxMSwgMTEsICA1LCAgOCwgMTEsICA2LCAgOCwgMTEsICA4LCAxMCwgMTIsICA2LAorICAgICAgIDgsIDExLCAgNywgIDgsIDExLCAgOSwgMTAsIDExLCAgOSwgMTAsIDEyLCAgOSwgMTAsIDExLCAxMSwgMTEsCisgICAgICAxMSwgIDgsICA5LCAxMSwgIDgsIDEwLCAxMiwgIDksIDExLCAxMiwgIDgsIDEwLCAxMiwgIDksIDEwLCAxMiwKKyAgICAgIDEwLCAxMSwgMTIsIDEwLCAxMSwgMTIsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsCisgICAgfSwKKyAgICB7CisgICAgICAgMCwgIDUsIDEzLCAgMiwgIDcsIDE2LCAgOSwgMTEsIDE2LCAgNCwgIDgsIDE2LCAgNywgIDksIDE2LCAxMiwKKyAgICAgIDEyLCAxNiwgMTIsIDE2LCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDEsICA2LCAxMywgIDQsICA4LAorICAgICAgMTYsICA5LCAxMSwgMTYsICA2LCAgOSwgMTYsICA3LCAxMCwgMTYsIDEzLCAxMywgMTYsIDEzLCAxNSwgMTYsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgNywgIDksIDE2LCAgOCwgMTEsIDE1LCAxMSwgMTMsIDE2LCAxMCwKKyAgICAgIDEyLCAxNiwgMTAsIDEyLCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDEyLCAxMiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLCAxNCwgMTYsIDEyLCAxMywgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAgMCwgIDYsIDExLCAgMywgIDcsIDExLCAgOCwgMTAsIDEyLCAgNCwgIDcsIDExLCAgNiwgIDgsIDExLCAxMCwKKyAgICAgIDExLCAxMiwgIDksIDEwLCAxMiwgMTAsIDEwLCAxMiwgMTIsIDEyLCAxMywgIDEsICA2LCAxMSwgIDQsICA3LAorICAgICAgMTEsICA4LCAxMCwgMTIsICA0LCAgNywgMTEsICA2LCAgOCwgMTEsIDEwLCAxMCwgMTIsICA5LCAxMCwgMTIsCisgICAgICAxMCwgMTAsIDEyLCAxMywgMTMsIDEzLCAgNiwgIDgsIDEyLCAgNywgMTAsIDEyLCAxMCwgMTIsIDEzLCAgNywKKyAgICAgICA5LCAxMiwgIDgsIDEwLCAxMiwgMTEsIDExLCAxMywgMTEsIDEyLCAxNCwgMTEsIDExLCAxMywgMTMsIDEzLAorICAgICAgMTMsICA5LCAxMSwgMTMsIDEwLCAxMiwgMTQsIDEyLCAxMywgMTUsIDEwLCAxMiwgMTQsIDExLCAxMiwgMTQsCisgICAgICAxMywgMTMsIDE0LCAxMiwgMTMsIDE1LCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LAorICAgIH0sCisgICAgeworICAgICAgIDAsICA1LCAxNiwgIDIsICA2LCAxNiwgMTAsIDE0LCAxNiwgIDQsICA4LCAxNiwgIDcsICA5LCAxNiwgMTEsCisgICAgICAxNiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICAxLCAgNiwgMTIsICA0LCAgOCwKKyAgICAgIDEyLCAxMiwgMTIsIDE2LCAgNiwgIDgsIDE2LCAgOCwgMTAsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNiwgIDcsIDEwLCAxNiwgIDgsIDExLCAxNCwgMTYsIDE2LCAxNiwgMTAsCisgICAgICAxMiwgMTYsIDEwLCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDAsICA1LCAxMSwgIDMsICA2LCAxMSwgMTAsIDEwLCAxMiwgIDMsICA3LCAxMSwgIDYsICA4LCAxMSwgMTEsCisgICAgICAxMSwgMTIsIDEwLCAxMCwgMTIsIDExLCAxMSwgMTMsIDE0LCAxMywgMTQsICAxLCAgNiwgMTEsICA0LCAgNywKKyAgICAgIDExLCAxMCwgMTEsIDEzLCAgNSwgIDcsIDExLCAgNywgIDgsIDExLCAxMSwgMTEsIDEzLCAxMCwgMTEsIDEzLAorICAgICAgMTEsIDExLCAxMiwgMTMsIDEzLCAxNCwgIDcsIDEwLCAxMiwgIDksIDExLCAxMywgMTIsIDEzLCAxNCwgIDksCisgICAgICAxMCwgMTMsICA5LCAxMCwgMTMsIDEyLCAxMSwgMTMsIDEyLCAxMywgMTYsIDEyLCAxMywgMTMsIDE0LCAxNCwKKyAgICAgIDE0LCAxMSwgMTQsIDE2LCAxMiwgMTQsIDE1LCAxNCwgMTMsIDE2LCAxMywgMTMsIDE1LCAxMywgMTQsIDE2LAorICAgICAgMTQsIDEzLCAxNiwgMTMsIDEzLCAxNiwgMTMsIDE0LCAxNSwgMTUsIDE0LCAxNSwKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgNCwgMTYsICAyLCAgNywgMTYsIDEwLCAxNiwgMTYsICA0LCAxMCwgMTYsICA3LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgMSwgIDYsIDEzLCAgNCwgMTEsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgIDYsIDEwLCAxNiwgIDgsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA4LCAxNiwgMTYsIDEwLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEwLAorICAgICAgMTYsIDE2LCAxMCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgfSwKKyAgfSwKK307CisKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnYzNF9pbnRyYV9jb2VmZltOVU1fSU5UUkFfVEFCTEVTXVtDT0VGRl9WTENfU0laRV0gPSB7Cit7CisgIDEsICAzLCAgMywgIDQsICA0LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LCAgOSwgIDksCisgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMiwgMTMsIDE0LCAxNSwgMTUsCit9LAoreworICAxLCAgMiwgIDMsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDksIDEwLCAxMCwgMTAsIDExLAorIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE2LCAxNiwgMTYsIDE2LAorfSwKK3sKKyAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTIsIDEyLCAxMiwKKyAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwKK30sCit7CisgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDEyLCAxMiwgMTIsCisgMTMsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxMiwgMTYsIDE2LCAxNiwgMTYsCit9LAoreworICAxLCAgMiwgIDMsICA0LCAgNSwgIDcsICA3LCAgOCwgIDgsICA5LCAxMCwgMTAsIDEyLCAxMSwgMTMsIDEyLAorIDE1LCAxMywgMTQsIDEzLCAxMiwgMTUsIDE0LCAxMywgMTIsIDEyLCAxMCwgMTEsIDE2LCAxNiwgMTYsIDE2LAorfQorfTsKKworCitzdGF0aWMgY29uc3QgdWludDhfdCBydjM0X2ludGVyX2NicHBhdFtOVU1fSU5URVJfVEFCTEVTXVtDQlBQQVRfVkxDX1NJWkVdID0geworeworICA3LCAgOSwgIDksICA4LCAgOSwgIDgsICA5LCAgOCwgIDksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA0LAorICA3LCAxMCwgMTEsIDEwLCAxMSwgMTAsIDEyLCAxMCwgMTIsIDExLCAxMSwgMTAsIDExLCAxMCwgMTAsICA3LAorIDEwLCAxMSwgMTUsIDEyLCAxNSwgMTIsIDE1LCAxMiwgMTUsIDE0LCAxNCwgMTIsIDE0LCAxMiwgMTQsICA5LAorICA3LCAxMSwgMTAsIDEwLCAxMiwgMTEsIDExLCAxMCwgMTEsIDEyLCAxMCwgMTAsIDExLCAxMCwgMTAsICA3LAorICA4LCAxMiwgMTIsIDExLCAxMywgMTIsIDEyLCAxMCwgMTMsIDEzLCAxMiwgMTAsIDEyLCAxMSwgMTEsICA3LAorIDExLCAxMywgMTUsIDExLCAxNSwgMTMsIDE1LCAxMiwgMTYsIDE0LCAxNCwgMTIsIDE1LCAxMywgMTMsICA5LAorIDEwLCAxNSwgMTEsIDEyLCAxNSwgMTQsIDE0LCAxMiwgMTUsIDE1LCAxMiwgMTIsIDE0LCAxNCwgMTIsICA5LAorIDExLCAxNSwgMTMsIDEyLCAxNiwgMTUsIDE0LCAxMiwgMTUsIDE1LCAxMywgMTIsIDE1LCAxNCwgMTMsICA5LAorIDEzLCAxNSwgMTQsIDEwLCAxNiwgMTUsIDE2LCAxMSwgMTYsIDE2LCAxNSwgMTIsIDE2LCAxNSwgMTUsICA5LAorICA3LCAxMSwgMTEsIDExLCAxMSwgMTAsIDExLCAxMCwgMTEsIDEyLCAxMSwgMTAsIDEwLCAxMCwgMTAsICA3LAorICA5LCAxMiwgMTMsIDEyLCAxMiwgMTEsIDEzLCAxMCwgMTMsIDEzLCAxMiwgMTEsIDEyLCAxMCwgMTEsICA3LAorIDEyLCAxMywgMTYsIDE0LCAxNSwgMTIsIDE2LCAxMiwgMTYsIDE1LCAxNSwgMTMsIDE1LCAxMiwgMTQsICA5LAorICA5LCAxMywgMTMsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTMsIDEzLCAxMiwgMTEsIDEyLCAxMSwgMTEsICA3LAorICA5LCAxMywgMTMsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTMsIDEzLCAxMywgMTEsIDEyLCAxMSwgMTEsICA3LAorIDEyLCAxNCwgMTUsIDEzLCAxNiwgMTMsIDE1LCAxMSwgMTYsIDE0LCAxNSwgMTIsIDE1LCAxMiwgMTMsICA4LAorIDEyLCAxNiwgMTQsIDE0LCAxNiwgMTUsIDE1LCAxMywgMTYsIDE1LCAxNCwgMTMsIDE1LCAxNCwgMTMsICA5LAorIDEyLCAxNSwgMTQsIDEzLCAxNSwgMTQsIDE1LCAxMiwgMTYsIDE1LCAxNCwgMTIsIDE0LCAxMywgMTMsICA4LAorIDEzLCAxNiwgMTYsIDEyLCAxNiwgMTQsIDE2LCAxMSwgMTYsIDE2LCAxNSwgMTIsIDE2LCAxNCwgMTQsICA4LAorIDEwLCAxNSwgMTUsIDE1LCAxMiwgMTIsIDE0LCAxMiwgMTQsIDE1LCAxNSwgMTQsIDEyLCAxMiwgMTMsICA5LAorIDExLCAxNSwgMTYsIDE0LCAxMywgMTIsIDE1LCAxMiwgMTYsIDE1LCAxNSwgMTQsIDE0LCAxMiwgMTMsICA5LAorIDE0LCAxNSwgMTYsIDE2LCAxNSwgMTEsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMiwgMTUsICA5LAorIDEyLCAxNiwgMTYsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTYsIDE2LCAxNSwgMTQsIDE0LCAxMywgMTMsICA5LAorIDEyLCAxNSwgMTUsIDE0LCAxNCwgMTMsIDE1LCAxMiwgMTYsIDE1LCAxNCwgMTMsIDE0LCAxMywgMTMsICA4LAorIDEzLCAxNiwgMTYsIDE1LCAxNiwgMTIsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxMywgMTQsICA4LAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNCwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTQsIDExLAorIDEzLCAxNiwgMTYsIDE1LCAxNiwgMTUsIDE1LCAxMiwgMTYsIDE2LCAxNiwgMTQsIDE1LCAxNCwgMTQsICA5LAorIDE0LCAxNiwgMTYsIDEzLCAxNiwgMTQsIDE2LCAxMCwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNCwgMTQsICA4LAorICA3LCAxMiwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMCwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA3LAorICA5LCAxMywgMTMsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTMsIDEzLCAxMiwgMTEsIDEyLCAxMSwgMTEsICA4LAorIDEyLCAxNCwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxMywgMTYsIDE0LCAxNSwgMTMsIDE1LCAxMywgMTQsICA5LAorICA5LCAxMywgMTIsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTIsIDEzLCAxMSwgMTAsIDEyLCAxMSwgMTEsICA3LAorICA5LCAxMywgMTMsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTMsIDEzLCAxMiwgMTEsIDEyLCAxMSwgMTEsICA3LAorIDEyLCAxNCwgMTYsIDEzLCAxNiwgMTQsIDE1LCAxMiwgMTUsIDE1LCAxNCwgMTIsIDE1LCAxMywgMTMsICA4LAorIDExLCAxNSwgMTMsIDE0LCAxNSwgMTUsIDE0LCAxMywgMTUsIDE1LCAxMiwgMTIsIDE0LCAxNCwgMTIsICA5LAorIDExLCAxNSwgMTQsIDEzLCAxNSwgMTQsIDE0LCAxMiwgMTUsIDE0LCAxMywgMTEsIDE0LCAxMywgMTIsICA4LAorIDEzLCAxNiwgMTUsIDEyLCAxNiwgMTUsIDE2LCAxMiwgMTYsIDE2LCAxNCwgMTEsIDE1LCAxNCwgMTQsICA4LAorICA4LCAxMywgMTMsIDEyLCAxMiwgMTIsIDEzLCAxMSwgMTIsIDEzLCAxMiwgMTEsIDExLCAxMCwgMTAsICA3LAorICA5LCAxMywgMTQsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTMsIDEzLCAxMywgMTEsIDEyLCAxMSwgMTEsICA3LAorIDEyLCAxNCwgMTYsIDE0LCAxNSwgMTMsIDE1LCAxMiwgMTUsIDE1LCAxNSwgMTMsIDE0LCAxMiwgMTMsICA4LAorICA5LCAxMywgMTMsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTMsIDEzLCAxMiwgMTEsIDEyLCAxMSwgMTEsICA3LAorICA5LCAxMywgMTIsIDEyLCAxMywgMTIsIDEyLCAxMCwgMTMsIDEzLCAxMiwgMTAsIDEyLCAxMCwgMTAsICA2LAorIDExLCAxNCwgMTQsIDEyLCAxNCwgMTIsIDE0LCAxMSwgMTQsIDE0LCAxMywgMTEsIDEzLCAxMSwgMTIsICA3LAorIDEyLCAxNiwgMTQsIDE0LCAxNSwgMTUsIDE0LCAxMywgMTUsIDE1LCAxMywgMTIsIDE0LCAxMywgMTIsICA4LAorIDExLCAxNCwgMTMsIDEyLCAxNCwgMTMsIDEzLCAxMSwgMTQsIDE0LCAxMywgMTEsIDEzLCAxMiwgMTEsICA3LAorIDExLCAxNCwgMTQsIDEyLCAxNSwgMTMsIDE0LCAxMSwgMTUsIDE0LCAxMywgMTEsIDE0LCAxMiwgMTIsICA2LAorIDExLCAxNiwgMTUsIDE1LCAxMywgMTQsIDE1LCAxMywgMTQsIDE1LCAxNSwgMTMsIDEyLCAxMiwgMTIsICA5LAorIDEyLCAxNSwgMTUsIDE0LCAxNCwgMTMsIDE1LCAxMiwgMTUsIDE1LCAxNCwgMTMsIDEzLCAxMSwgMTIsICA4LAorIDEzLCAxNiwgMTYsIDE1LCAxNiwgMTMsIDE2LCAxMywgMTYsIDE2LCAxNSwgMTQsIDE0LCAxMiwgMTQsICA4LAorIDExLCAxNiwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTUsIDE1LCAxNCwgMTMsIDEzLCAxMiwgMTIsICA4LAorIDExLCAxNCwgMTQsIDEzLCAxMywgMTIsIDE0LCAxMSwgMTQsIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsICA3LAorIDEyLCAxNCwgMTUsIDEzLCAxNCwgMTIsIDE0LCAxMSwgMTUsIDE0LCAxNCwgMTIsIDEzLCAxMSwgMTIsICA3LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTYsIDE2LCAxNSwgMTQsIDE1LCAxNCwgMTMsICA5LAorIDEyLCAxNSwgMTQsIDEzLCAxNSwgMTMsIDE0LCAxMiwgMTUsIDE1LCAxMywgMTIsIDEzLCAxMiwgMTIsICA3LAorIDExLCAxNSwgMTQsIDEyLCAxNCwgMTMsIDE0LCAxMCwgMTUsIDE0LCAxMywgMTEsIDEzLCAxMSwgMTEsICA1LAorIDEwLCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE1LCAxMywgMTIsIDE0LCAxMiwgMTIsIDEyLCAxMywgMTIsICA5LAorIDEyLCAxNiwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxNCwgMTQsIDE1LCAxNCwgMTMsIDE0LCAxMywgMTMsICA5LAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTUsIDExLAorIDExLCAxNSwgMTUsIDE0LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE1LCAxMiwgMTIsIDEzLCAxMywgMTIsICA5LAorIDEyLCAxNSwgMTUsIDE0LCAxNiwgMTQsIDE1LCAxMywgMTQsIDE0LCAxMywgMTIsIDE0LCAxMywgMTIsICA4LAorIDEzLCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNSwgMTIsIDE2LCAxNCwgMTQsICA5LAorIDEzLCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE2LCAxMSwgMTIsIDE2LCAxNSwgMTIsICA5LAorIDEzLCAxNiwgMTUsIDE0LCAxNiwgMTUsIDE2LCAxNCwgMTUsIDE2LCAxMiwgMTEsIDE1LCAxNCwgMTMsICA4LAorIDEzLCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxMywgMTEsIDE2LCAxNCwgMTQsICA4LAorIDExLCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE1LCAxMywgMTMsIDE1LCAxNCwgMTMsIDEyLCAxMiwgMTIsICA5LAorIDExLCAxNSwgMTYsIDE0LCAxNSwgMTQsIDE1LCAxMywgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTMsICA4LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDE1LCAxMiwgMTQsICA5LAorIDExLCAxNiwgMTUsIDE0LCAxNCwgMTQsIDE1LCAxMywgMTQsIDE0LCAxMywgMTIsIDEzLCAxMiwgMTEsICA4LAorIDExLCAxNCwgMTQsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTMsIDEzLCAxMiwgMTEsIDEyLCAxMSwgMTEsICA3LAorIDEyLCAxNSwgMTUsIDEzLCAxNSwgMTQsIDE1LCAxMiwgMTUsIDE0LCAxNCwgMTEsIDEzLCAxMiwgMTIsICA3LAorIDEzLCAxNiwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTUsIDE2LCAxMiwgMTIsIDE0LCAxNCwgMTIsICA4LAorIDExLCAxNSwgMTQsIDEzLCAxNSwgMTMsIDE0LCAxMiwgMTQsIDE0LCAxMiwgMTEsIDEzLCAxMiwgMTEsICA2LAorIDExLCAxNCwgMTQsIDEyLCAxNSwgMTMsIDE0LCAxMSwgMTUsIDE0LCAxMiwgMTAsIDEzLCAxMSwgMTEsICA1LAorIDEyLCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE2LCAxNSwgMTQsIDE2LCAxNSwgMTUsIDEwLCAxMiwgMTIsICA5LAorIDEzLCAxNiwgMTYsIDE2LCAxNSwgMTQsIDE2LCAxMywgMTUsIDE1LCAxNSwgMTQsIDEyLCAxMSwgMTMsICA4LAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTQsIDE0LCAxMSwgMTQsICA4LAorIDEzLCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTUsIDE2LCAxNCwgMTMsIDEyLCAxMiwgMTEsICA4LAorIDExLCAxNSwgMTUsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTQsIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsICA2LAorIDExLCAxNSwgMTUsIDEzLCAxNSwgMTIsIDE0LCAxMSwgMTQsIDE0LCAxMywgMTEsIDEyLCAxMCwgMTEsICA1LAorIDEzLCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNCwgMTQsIDE0LCAxMywgMTEsICA4LAorIDExLCAxNCwgMTQsIDEzLCAxNCwgMTMsIDE0LCAxMSwgMTQsIDE0LCAxMiwgMTEsIDEyLCAxMSwgMTAsICA1LAorIDEwLCAxMywgMTMsIDExLCAxMywgMTIsIDEzLCAgOSwgMTMsIDEzLCAxMiwgIDksIDEyLCAxMCwgMTAsICAzLAorfSwKK3sKKyAgNSwgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDcsICA3LCAgOCwgIDcsICA3LCAgNywgIDcsICA3LCAgNCwKKyAgNywgIDksIDExLCAgOSwgMTEsICA5LCAxMSwgIDksIDExLCAxMCwgMTAsICA5LCAxMCwgIDksIDEwLCAgNiwKKyAxMSwgMTEsIDE0LCAxMSwgMTQsIDExLCAxNCwgMTEsIDE1LCAxMywgMTQsIDEyLCAxNCwgMTIsIDEzLCAgOSwKKyAgNiwgMTEsIDEwLCAgOSwgMTEsIDEwLCAxMSwgIDksIDExLCAxMSwgIDksICA5LCAxMCwgMTAsICA5LCAgNiwKKyAgOCwgMTEsIDExLCAxMCwgMTIsIDExLCAxMiwgMTAsIDEyLCAxMiwgMTEsIDEwLCAxMiwgMTEsIDExLCAgNywKKyAxMSwgMTMsIDE0LCAxMSwgMTUsIDEzLCAxNSwgMTEsIDE1LCAxNCwgMTQsIDEyLCAxNCwgMTMsIDEzLCAgOSwKKyAxMCwgMTQsIDExLCAxMSwgMTUsIDE0LCAxMywgMTIsIDE0LCAxNCwgMTEsIDExLCAxNCwgMTMsIDEyLCAgOSwKKyAxMSwgMTQsIDEzLCAxMSwgMTUsIDE0LCAxNCwgMTEsIDE1LCAxNSwgMTMsIDExLCAxNCwgMTQsIDEzLCAgOSwKKyAxMiwgMTQsIDE0LCAxMCwgMTYsIDE1LCAxNiwgMTEsIDE2LCAxNiwgMTUsIDExLCAxNiwgMTUsIDE0LCAgOSwKKyAgNiwgMTAsIDExLCAxMCwgMTAsICA5LCAxMSwgIDksIDEwLCAxMSwgMTAsIDEwLCAgOSwgIDksICA5LCAgNiwKKyAgOSwgMTIsIDEyLCAxMSwgMTIsIDEwLCAxMiwgMTAsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTAsIDExLCAgNywKKyAxMiwgMTMsIDE1LCAxMywgMTQsIDExLCAxNSwgMTEsIDE1LCAxNSwgMTQsIDEzLCAxNCwgMTIsIDE0LCAgOSwKKyAgOSwgMTIsIDEyLCAxMSwgMTIsIDExLCAxMiwgMTEsIDEyLCAxMywgMTEsIDExLCAxMiwgMTEsIDExLCAgNywKKyAgOSwgMTIsIDEyLCAxMSwgMTMsIDExLCAxMiwgMTAsIDEzLCAxMywgMTIsIDExLCAxMiwgMTEsIDExLCAgNywKKyAxMiwgMTQsIDE1LCAxMiwgMTUsIDEyLCAxNCwgMTEsIDE1LCAxNSwgMTQsIDEyLCAxNCwgMTMsIDEzLCAgOCwKKyAxMiwgMTUsIDE0LCAxMywgMTUsIDE0LCAxNCwgMTMsIDE2LCAxNiwgMTQsIDEzLCAxNSwgMTQsIDEzLCAgOSwKKyAxMiwgMTUsIDE0LCAxMywgMTUsIDE0LCAxNCwgMTIsIDE1LCAxNSwgMTMsIDEyLCAxNCwgMTMsIDEzLCAgOSwKKyAxMywgMTUsIDE1LCAxMiwgMTYsIDE0LCAxNSwgMTEsIDE2LCAxNiwgMTUsIDEyLCAxNSwgMTQsIDE0LCAgOSwKKyAxMCwgMTQsIDE0LCAxNCwgMTIsIDExLCAxMywgMTIsIDE0LCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEyLCAgOSwKKyAxMiwgMTQsIDE1LCAxNCwgMTMsIDExLCAxNCwgMTIsIDE1LCAxNSwgMTUsIDE0LCAxMywgMTEsIDEzLCAgOSwKKyAxMywgMTUsIDE2LCAxNSwgMTQsIDExLCAxNiwgMTEsIDE2LCAxNiwgMTYsIDE0LCAxNSwgMTIsIDE1LCAgOSwKKyAxMiwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTMsIDEzLCAgOSwKKyAxMiwgMTUsIDE1LCAxNCwgMTQsIDEzLCAxNCwgMTIsIDE1LCAxNSwgMTQsIDEzLCAxNCwgMTMsIDEzLCAgOSwKKyAxMywgMTUsIDE2LCAxNCwgMTUsIDEzLCAxNiwgMTEsIDE2LCAxNiwgMTUsIDE0LCAxNSwgMTMsIDE0LCAgOSwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxMSwKKyAxNCwgMTYsIDE2LCAxNCwgMTYsIDE1LCAxNSwgMTIsIDE2LCAxNiwgMTYsIDE0LCAxNSwgMTQsIDE0LCAgOSwKKyAxNCwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTEsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE0LCAgOSwKKyAgNiwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTAsIDEwLCAxMSwgIDksICA5LCAgOSwgIDksICA5LCAgNiwKKyAgOSwgMTIsIDEyLCAxMSwgMTMsIDExLCAxMywgMTEsIDEyLCAxMiwgMTEsIDExLCAxMiwgMTEsIDExLCAgNywKKyAxMiwgMTQsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTMsIDE1LCAxNCwgMTUsIDEyLCAxNSwgMTMsIDE0LCAgOSwKKyAgOCwgMTIsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMiwgMTAsIDEwLCAxMSwgMTEsIDEwLCAgNywKKyAgOSwgMTIsIDEyLCAxMSwgMTMsIDEyLCAxMywgMTEsIDEzLCAxMiwgMTEsIDEwLCAxMiwgMTEsIDExLCAgNywKKyAxMiwgMTQsIDE1LCAxMiwgMTUsIDE0LCAxNSwgMTIsIDE1LCAxNCwgMTQsIDEyLCAxNCwgMTMsIDEzLCAgOSwKKyAxMSwgMTUsIDEzLCAxMywgMTUsIDE0LCAxNCwgMTMsIDE0LCAxNSwgMTEsIDExLCAxNCwgMTQsIDEyLCAgOSwKKyAxMSwgMTQsIDEzLCAxMiwgMTUsIDE0LCAxNCwgMTIsIDE0LCAxNCwgMTIsIDExLCAxNCwgMTMsIDEyLCAgOCwKKyAxMywgMTUsIDE1LCAxMiwgMTYsIDE1LCAxNSwgMTIsIDE1LCAxNSwgMTQsIDExLCAxNSwgMTQsIDE0LCAgOCwKKyAgOCwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMiwgMTEsIDExLCAxMiwgMTEsIDExLCAxMCwgMTAsIDEwLCAgNywKKyAgOSwgMTMsIDEzLCAxMiwgMTMsIDExLCAxMywgMTEsIDEyLCAxMywgMTIsIDExLCAxMSwgMTAsIDExLCAgNywKKyAxMiwgMTQsIDE1LCAxNCwgMTUsIDEzLCAxNSwgMTIsIDE1LCAxNCwgMTQsIDEzLCAxNCwgMTIsIDEzLCAgOSwKKyAgOSwgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDEyLCAxMywgMTEsIDExLCAxMSwgMTEsIDEwLCAgNywKKyAgOSwgMTIsIDEyLCAxMSwgMTIsIDExLCAxMiwgMTAsIDEyLCAxMiwgMTEsIDEwLCAxMSwgMTAsIDEwLCAgNywKKyAxMSwgMTMsIDE0LCAxMiwgMTQsIDEyLCAxNCwgMTEsIDE0LCAxMywgMTMsIDExLCAxMywgMTEsIDEyLCAgNywKKyAxMiwgMTUsIDE0LCAxMywgMTUsIDE0LCAxNCwgMTMsIDE1LCAxNSwgMTMsIDEyLCAxMywgMTMsIDEyLCAgOSwKKyAxMSwgMTQsIDEzLCAxMiwgMTQsIDEzLCAxMywgMTEsIDE0LCAxNCwgMTIsIDExLCAxMywgMTIsIDExLCAgNywKKyAxMSwgMTQsIDE0LCAxMiwgMTQsIDEzLCAxNCwgMTEsIDE0LCAxNCwgMTMsIDExLCAxMywgMTIsIDEyLCAgNywKKyAxMSwgMTUsIDE1LCAxNCwgMTMsIDEzLCAxNCwgMTMsIDE0LCAxNSwgMTQsIDEzLCAxMSwgMTEsIDEyLCAgOSwKKyAxMiwgMTUsIDE1LCAxNCwgMTQsIDEyLCAxNCwgMTIsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTEsIDEyLCAgOCwKKyAxMywgMTYsIDE2LCAxNSwgMTUsIDEyLCAxNiwgMTMsIDE2LCAxNSwgMTUsIDE0LCAxNCwgMTIsIDE0LCAgOSwKKyAxMiwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDE1LCAxNSwgMTQsIDEzLCAxMiwgMTIsIDEyLCAgOSwKKyAxMSwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMywgMTEsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTEsIDExLCAgNywKKyAxMiwgMTQsIDE1LCAxMywgMTQsIDEyLCAxNCwgMTEsIDE1LCAxNCwgMTMsIDEyLCAxMywgMTEsIDEyLCAgNywKKyAxMywgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNSwgMTQsIDE2LCAxNiwgMTUsIDE0LCAxNCwgMTQsIDEyLCAgOSwKKyAxMiwgMTUsIDE0LCAxMywgMTQsIDEzLCAxNCwgMTIsIDE1LCAxNCwgMTMsIDEyLCAxMywgMTIsIDEyLCAgOCwKKyAxMiwgMTQsIDE0LCAxMywgMTUsIDEzLCAxNCwgMTEsIDE0LCAxNCwgMTMsIDEyLCAxMywgMTIsIDEyLCAgNiwKKyAxMCwgMTQsIDE0LCAxMywgMTQsIDE0LCAxNCwgMTMsIDEyLCAxMywgMTIsIDEyLCAxMiwgMTIsIDExLCAgOSwKKyAxMiwgMTUsIDE1LCAxNCwgMTUsIDE0LCAxNiwgMTQsIDE0LCAxNCwgMTMsIDEyLCAxNCwgMTMsIDEzLCAgOSwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxMSwKKyAxMSwgMTUsIDE0LCAxNCwgMTUsIDE0LCAxNCwgMTQsIDEzLCAxNCwgMTEsIDEyLCAxMywgMTMsIDEyLCAgOSwKKyAxMiwgMTUsIDE0LCAxNCwgMTUsIDE0LCAxNSwgMTMsIDE0LCAxNCwgMTMsIDEyLCAxNCwgMTMsIDEzLCAgOSwKKyAxMywgMTYsIDE2LCAxNCwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxNSwgMTUsIDEyLCAxNiwgMTQsIDE0LCAgOSwKKyAxMywgMTYsIDE0LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE0LCAxNiwgMTEsIDEyLCAxNSwgMTQsIDEyLCAgOSwKKyAxMywgMTYsIDE1LCAxNCwgMTYsIDE1LCAxNiwgMTQsIDE1LCAxNSwgMTIsIDExLCAxNSwgMTQsIDEzLCAgOSwKKyAxNCwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTMsIDExLCAxNiwgMTQsIDE0LCAgOSwKKyAxMSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxNCwgMTMsIDEzLCAxMSwgMTEsIDExLCAgOSwKKyAxMiwgMTUsIDE1LCAxNCwgMTUsIDE0LCAxNSwgMTMsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTIsIDEyLCAgOSwKKyAxMywgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxNSwgMTIsIDE0LCAgOSwKKyAxMSwgMTUsIDE0LCAxNCwgMTUsIDE0LCAxNCwgMTMsIDE0LCAxNCwgMTIsIDEyLCAxMiwgMTIsIDExLCAgOCwKKyAxMSwgMTQsIDE0LCAxMywgMTQsIDEzLCAxMywgMTIsIDEzLCAxMywgMTIsIDExLCAxMiwgMTEsIDExLCAgNywKKyAxMiwgMTQsIDE1LCAxMywgMTUsIDEzLCAxNCwgMTMsIDE0LCAxNCwgMTMsIDEyLCAxMywgMTIsIDEyLCAgOCwKKyAxMywgMTYsIDE1LCAxNSwgMTYsIDE1LCAxNSwgMTQsIDE1LCAxNiwgMTIsIDEyLCAxNCwgMTQsIDExLCAgOSwKKyAxMiwgMTUsIDE0LCAxMywgMTUsIDEzLCAxNCwgMTIsIDE0LCAxNCwgMTIsIDExLCAxMywgMTIsIDExLCAgNywKKyAxMiwgMTQsIDE0LCAxMywgMTUsIDEzLCAxNCwgMTIsIDE1LCAxNCwgMTMsIDEwLCAxMywgMTIsIDEyLCAgNiwKKyAxMiwgMTYsIDE2LCAxNSwgMTQsIDE0LCAxNSwgMTQsIDEzLCAxNSwgMTQsIDE0LCAxMCwgMTEsIDExLCAgOSwKKyAxMywgMTYsIDE2LCAxNSwgMTUsIDE0LCAxNSwgMTQsIDE1LCAxNSwgMTUsIDE0LCAxMiwgMTEsIDEyLCAgOCwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNSwgMTUsIDE0LCAxNCwgMTEsIDE0LCAgOCwKKyAxMiwgMTYsIDE2LCAxNSwgMTUsIDE0LCAxNSwgMTQsIDE0LCAxNiwgMTQsIDE0LCAxMiwgMTIsIDExLCAgOCwKKyAxMSwgMTQsIDE0LCAxMywgMTQsIDEzLCAxNCwgMTIsIDE0LCAxNCwgMTMsIDEyLCAxMiwgMTEsIDExLCAgNywKKyAxMiwgMTQsIDE1LCAxMywgMTQsIDEzLCAxNCwgMTIsIDE0LCAxNCwgMTMsIDEyLCAxMywgMTEsIDEyLCAgNiwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTQsIDE2LCAxNiwgMTQsIDEzLCAxMywgMTMsIDExLCAgOCwKKyAxMiwgMTUsIDE1LCAxMywgMTUsIDEzLCAxNCwgMTIsIDE0LCAxNCwgMTMsIDEyLCAxMywgMTIsIDEwLCAgNiwKKyAxMSwgMTQsIDEzLCAxMiwgMTQsIDEyLCAxMywgMTAsIDE0LCAxMywgMTIsIDEwLCAxMiwgMTAsIDEwLCAgNCwKK30sCit7CisgIDQsICA2LCAgNiwgIDYsICA2LCAgNiwgIDcsICA2LCAgNiwgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDMsCisgIDYsICA5LCAxMCwgIDksIDEwLCAgOSwgMTEsICA5LCAxMCwgMTAsIDEwLCAgOSwgMTAsICA5LCAxMCwgIDYsCisgMTAsIDExLCAxNCwgMTEsIDE0LCAxMSwgMTQsIDExLCAxNCwgMTMsIDE0LCAxMSwgMTQsIDExLCAxMywgIDksCisgIDYsIDEwLCAgOSwgIDksIDEwLCAxMCwgMTAsICA5LCAxMCwgMTEsICA5LCAgOSwgMTAsIDEwLCAgOSwgIDYsCisgIDgsIDExLCAxMSwgIDksIDEyLCAxMSwgMTIsIDEwLCAxMiwgMTIsIDExLCAxMCwgMTIsIDExLCAxMSwgIDcsCisgMTEsIDEzLCAxNCwgMTEsIDE1LCAxMywgMTUsIDExLCAxNSwgMTQsIDE0LCAxMSwgMTUsIDEzLCAxNCwgIDksCisgMTAsIDEzLCAxMSwgMTEsIDE0LCAxNCwgMTMsIDExLCAxNCwgMTQsIDExLCAxMSwgMTMsIDEzLCAxMSwgIDksCisgMTEsIDE0LCAxMiwgMTEsIDE1LCAxNCwgMTQsIDExLCAxNSwgMTUsIDEzLCAxMSwgMTQsIDE0LCAxMywgIDksCisgMTIsIDE0LCAxMywgMTAsIDE2LCAxNSwgMTYsIDExLCAxNiwgMTYsIDE0LCAxMSwgMTYsIDE0LCAxNCwgIDksCisgIDYsIDEwLCAxMCwgMTAsICA5LCAgOSwgMTAsICA5LCAxMCwgMTEsIDEwLCAxMCwgIDksICA5LCAgOSwgIDYsCisgIDgsIDExLCAxMiwgMTEsIDExLCAxMCwgMTIsIDEwLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDEwLCAxMSwgIDcsCisgMTEsIDEzLCAxNSwgMTMsIDE0LCAxMSwgMTUsIDExLCAxNSwgMTQsIDE0LCAxMywgMTQsIDEyLCAxNCwgIDksCisgIDgsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMiwgMTMsIDExLCAxMSwgMTEsIDExLCAxMSwgIDgsCisgIDksIDEyLCAxMiwgMTEsIDEyLCAxMiwgMTMsIDExLCAxMywgMTMsIDEyLCAxMSwgMTIsIDExLCAxMSwgIDgsCisgMTEsIDE0LCAxNSwgMTMsIDE0LCAxMywgMTUsIDExLCAxNSwgMTUsIDE0LCAxMywgMTUsIDEzLCAxNCwgIDksCisgMTIsIDE2LCAxNCwgMTQsIDE1LCAxNSwgMTQsIDEyLCAxNSwgMTYsIDE0LCAxMywgMTQsIDE0LCAxMywgMTAsCisgMTEsIDE1LCAxNCwgMTMsIDE1LCAxNCwgMTUsIDEyLCAxNSwgMTYsIDE0LCAxMywgMTUsIDE0LCAxMywgIDksCisgMTMsIDE1LCAxNSwgMTIsIDE2LCAxNSwgMTYsIDEyLCAxNiwgMTYsIDE1LCAxMywgMTUsIDE0LCAxNCwgIDksCisgMTAsIDE0LCAxNCwgMTQsIDExLCAxMSwgMTMsIDExLCAxNCwgMTQsIDE0LCAxMywgMTEsIDExLCAxMSwgIDksCisgMTEsIDE0LCAxNSwgMTQsIDEzLCAxMSwgMTQsIDEyLCAxNSwgMTUsIDE1LCAxNCwgMTMsIDExLCAxMywgIDksCisgMTMsIDE0LCAxNiwgMTUsIDE0LCAxMSwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNCwgMTUsIDEyLCAxNSwgMTAsCisgMTIsIDE2LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDEyLCAxNiwgMTYsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTAsCisgMTIsIDE1LCAxNSwgMTQsIDE0LCAxMywgMTQsIDEyLCAxNSwgMTYsIDE0LCAxNCwgMTQsIDEzLCAxMywgIDksCisgMTMsIDE2LCAxNiwgMTQsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNCwgMTYsIDEzLCAxNSwgMTAsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTEsCisgMTMsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNCwgMTAsCisgMTQsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNSwgMTAsCisgIDYsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDEwLCAgOSwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDYsCisgIDksIDEyLCAxMiwgMTEsIDEyLCAxMSwgMTMsIDExLCAxMiwgMTIsIDExLCAxMCwgMTIsIDExLCAxMSwgIDgsCisgMTIsIDE0LCAxNSwgMTQsIDE1LCAxNCwgMTYsIDEzLCAxNSwgMTQsIDE0LCAxMiwgMTUsIDEzLCAxNCwgMTAsCisgIDgsIDEyLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTIsIDEwLCAxMCwgMTEsIDExLCAxMCwgIDcsCisgIDksIDEyLCAxMiwgMTEsIDEzLCAxMiwgMTMsIDExLCAxMiwgMTMsIDExLCAxMCwgMTIsIDEyLCAxMSwgIDgsCisgMTEsIDE0LCAxNCwgMTMsIDE1LCAxNCwgMTUsIDEzLCAxNSwgMTQsIDE0LCAxMiwgMTUsIDEzLCAxNCwgIDksCisgMTEsIDE1LCAxMiwgMTMsIDE1LCAxNSwgMTQsIDEzLCAxNCwgMTUsIDExLCAxMSwgMTQsIDE0LCAxMiwgIDksCisgMTEsIDE0LCAxMywgMTMsIDE1LCAxNCwgMTUsIDEzLCAxNSwgMTUsIDEzLCAxMSwgMTUsIDE0LCAxMywgIDksCisgMTMsIDE1LCAxNSwgMTIsIDE2LCAxNSwgMTYsIDEzLCAxNiwgMTUsIDE0LCAxMSwgMTYsIDE1LCAxNCwgIDksCisgIDgsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTIsIDExLCAxMSwgMTIsIDExLCAxMSwgIDksIDEwLCAxMCwgIDcsCisgIDksIDEyLCAxMywgMTIsIDEyLCAxMSwgMTMsIDExLCAxMiwgMTMsIDEyLCAxMiwgMTEsIDExLCAxMSwgIDgsCisgMTIsIDE0LCAxNSwgMTQsIDE1LCAxMywgMTYsIDEzLCAxNSwgMTQsIDE1LCAxMywgMTQsIDEyLCAxNCwgIDksCisgIDksIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEyLCAxMiwgMTMsIDExLCAxMSwgMTEsIDExLCAxMCwgIDgsCisgIDksIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDExLCAxMiwgMTMsIDExLCAxMSwgMTIsIDExLCAxMSwgIDcsCisgMTEsIDEzLCAxNCwgMTMsIDE0LCAxMywgMTUsIDEyLCAxNCwgMTQsIDE0LCAxMiwgMTQsIDEyLCAxMywgIDgsCisgMTIsIDE1LCAxNCwgMTQsIDE1LCAxNSwgMTQsIDEzLCAxNSwgMTYsIDEzLCAxMywgMTQsIDE0LCAxMiwgIDksCisgMTEsIDE0LCAxMywgMTMsIDE0LCAxNCwgMTQsIDEyLCAxNCwgMTUsIDEzLCAxMiwgMTQsIDEzLCAxMiwgIDgsCisgMTEsIDE0LCAxNCwgMTMsIDE1LCAxNCwgMTUsIDEyLCAxNSwgMTUsIDE0LCAxMiwgMTQsIDEzLCAxMywgIDgsCisgMTEsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTQsIDEzLCAxMywgMTQsIDE0LCAxMywgMTEsIDExLCAxMSwgIDksCisgMTEsIDE1LCAxNSwgMTQsIDE0LCAxMywgMTUsIDEzLCAxNCwgMTUsIDE0LCAxNCwgMTMsIDExLCAxMywgIDksCisgMTMsIDE2LCAxNiwgMTYsIDE1LCAxMywgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNSwgMTUsIDEyLCAxNSwgMTAsCisgMTEsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDEzLCAxNSwgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMiwgIDksCisgMTEsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTQsIDEyLCAxNCwgMTQsIDEzLCAxMywgMTMsIDEyLCAxMiwgIDgsCisgMTIsIDE1LCAxNSwgMTQsIDE1LCAxMywgMTUsIDEyLCAxNSwgMTUsIDE0LCAxMywgMTQsIDEyLCAxMywgIDgsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxMywgMTAsCisgMTIsIDE1LCAxNSwgMTQsIDE1LCAxNCwgMTUsIDEzLCAxNSwgMTYsIDE0LCAxMywgMTQsIDE0LCAxMywgIDksCisgMTIsIDE1LCAxNSwgMTQsIDE1LCAxNCwgMTUsIDEyLCAxNSwgMTUsIDE0LCAxMywgMTQsIDEzLCAxMywgIDgsCisgMTAsIDE0LCAxMywgMTMsIDE0LCAxMywgMTQsIDEzLCAxMSwgMTMsIDExLCAxMSwgMTEsIDExLCAxMSwgIDksCisgMTIsIDE1LCAxNiwgMTQsIDE1LCAxNCwgMTYsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTQsIDEzLCAxMywgMTAsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTEsCisgMTEsIDE1LCAxNCwgMTQsIDE1LCAxNCwgMTUsIDE0LCAxMywgMTQsIDExLCAxMiwgMTMsIDEzLCAxMSwgIDksCisgMTIsIDE1LCAxNSwgMTQsIDE1LCAxNSwgMTYsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTQsIDEzLCAxMywgIDksCisgMTMsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTUsIDE1LCAxMiwgMTYsIDE0LCAxNSwgMTAsCisgMTIsIDE2LCAxNCwgMTUsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMTYsIDExLCAxMiwgMTQsIDE1LCAxMiwgIDksCisgMTMsIDE2LCAxNSwgMTQsIDE2LCAxNiwgMTYsIDE0LCAxNSwgMTYsIDEzLCAxMiwgMTUsIDE1LCAxMywgIDksCisgMTQsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE0LCAxMiwgMTYsIDE1LCAxNSwgMTAsCisgMTEsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTQsIDEzLCAxMywgMTEsIDExLCAxMSwgIDksCisgMTEsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTYsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMywgIDksCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxNCwgMTUsIDEzLCAxNSwgMTAsCisgMTEsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTUsIDE0LCAxNCwgMTUsIDEzLCAxMywgMTIsIDEzLCAxMSwgIDksCisgMTEsIDE0LCAxNCwgMTMsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTQsIDEzLCAxMiwgMTMsIDEyLCAxMiwgIDgsCisgMTIsIDE1LCAxNSwgMTQsIDE2LCAxNCwgMTYsIDE0LCAxNSwgMTUsIDE1LCAxMywgMTQsIDEzLCAxNCwgIDksCisgMTMsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTYsIDEzLCAxMywgMTQsIDE0LCAxMiwgIDksCisgMTIsIDE1LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDEzLCAxNCwgMTUsIDEzLCAxMiwgMTQsIDEzLCAxMiwgIDgsCisgMTIsIDE1LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDEzLCAxNSwgMTUsIDE0LCAxMiwgMTQsIDEzLCAxMywgIDgsCisgMTIsIDE2LCAxNSwgMTUsIDEzLCAxNCwgMTUsIDE0LCAxMywgMTUsIDE0LCAxNCwgMTAsIDExLCAxMSwgIDksCisgMTIsIDE2LCAxNiwgMTUsIDE1LCAxNCwgMTYsIDE0LCAxNSwgMTUsIDE1LCAxNCwgMTMsIDEyLCAxMywgIDksCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxNSwgMTQsIDEyLCAxNSwgMTAsCisgMTIsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNSwgMTYsIDE0LCAxNCwgMTIsIDEzLCAxMSwgIDksCisgMTEsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTUsIDEzLCAxNCwgMTUsIDE0LCAxMywgMTMsIDEyLCAxMiwgIDgsCisgMTIsIDE1LCAxNSwgMTQsIDE1LCAxNCwgMTUsIDEzLCAxNSwgMTUsIDE0LCAxMywgMTQsIDEyLCAxMywgIDgsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE0LCAxNCwgMTQsIDE0LCAxMSwgIDksCisgMTIsIDE1LCAxNSwgMTQsIDE1LCAxNSwgMTUsIDEzLCAxNSwgMTUsIDE0LCAxMywgMTQsIDEzLCAxMiwgIDgsCisgMTEsIDE0LCAxNCwgMTMsIDE0LCAxMywgMTQsIDEyLCAxMywgMTQsIDEzLCAxMiwgMTMsIDEyLCAxMiwgIDcsCit9LAoreworICAyLCAgNiwgIDYsICA1LCAgNiwgIDYsICA3LCAgNiwgIDYsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICAzLAorICA2LCAgOSwgMTAsICA5LCAxMCwgIDksIDExLCAgOSwgMTAsIDEwLCAxMCwgIDksIDEwLCAgOSwgMTAsICA3LAorIDEwLCAxMSwgMTQsIDExLCAxNCwgMTEsIDE0LCAxMSwgMTQsIDEzLCAxNCwgMTIsIDE0LCAxMiwgMTMsICA5LAorICA2LCAxMCwgIDksICA5LCAxMCwgMTAsIDEwLCAgOSwgMTAsIDExLCAgOSwgIDksIDEwLCAxMCwgIDksICA3LAorICA4LCAxMSwgMTEsICA5LCAxMiwgMTEsIDEyLCAxMCwgMTIsIDEyLCAxMSwgMTAsIDEyLCAxMSwgMTEsICA4LAorIDExLCAxMywgMTQsIDExLCAxNiwgMTMsIDE1LCAxMiwgMTYsIDE0LCAxNCwgMTIsIDE1LCAxMywgMTQsIDEwLAorIDEwLCAxMywgMTEsIDExLCAxNCwgMTQsIDEzLCAxMSwgMTMsIDE0LCAxMSwgMTEsIDEzLCAxMywgMTEsICA5LAorIDExLCAxMywgMTMsIDExLCAxNSwgMTQsIDE0LCAxMiwgMTUsIDE1LCAxMywgMTIsIDE1LCAxNCwgMTMsIDEwLAorIDEyLCAxNCwgMTQsIDExLCAxNiwgMTUsIDE2LCAxMiwgMTYsIDE2LCAxNSwgMTIsIDE2LCAxNSwgMTUsIDEwLAorICA2LCAxMCwgMTAsIDEwLCAgOSwgIDksIDEwLCAgOSwgMTAsIDExLCAxMCwgMTAsICA5LCAgOSwgIDksICA3LAorICA4LCAxMSwgMTIsIDExLCAxMSwgMTAsIDEyLCAxMCwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMCwgMTEsICA4LAorIDEyLCAxMywgMTYsIDEzLCAxNCwgMTEsIDE2LCAxMiwgMTYsIDE1LCAxNSwgMTMsIDE0LCAxMiwgMTQsIDEwLAorICA5LCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTEsICA4LAorIDEwLCAxMywgMTMsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTQsIDE0LCAxMywgMTIsIDEzLCAxMiwgMTIsICA5LAorIDEyLCAxNCwgMTYsIDEzLCAxNSwgMTMsIDE1LCAxMiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNCwgMTQsIDEwLAorIDEyLCAxNiwgMTQsIDE0LCAxNiwgMTUsIDE0LCAxMywgMTYsIDE2LCAxNCwgMTQsIDE1LCAxNSwgMTMsIDExLAorIDEyLCAxNiwgMTUsIDE0LCAxNiwgMTUsIDE1LCAxMiwgMTYsIDE2LCAxNSwgMTQsIDE2LCAxNSwgMTQsIDEwLAorIDE0LCAxNiwgMTYsIDE0LCAxNiwgMTUsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTUsIDExLAorIDEwLCAxNCwgMTQsIDEzLCAxMSwgMTEsIDEzLCAxMiwgMTQsIDE0LCAxMywgMTMsIDExLCAxMSwgMTIsICA5LAorIDEyLCAxNCwgMTYsIDE0LCAxMywgMTEsIDE0LCAxMiwgMTYsIDE1LCAxNSwgMTQsIDE0LCAxMiwgMTMsIDEwLAorIDEzLCAxNCwgMTYsIDE1LCAxNCwgMTEsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywgMTUsIDExLAorIDEyLCAxNiwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTYsIDE2LCAxNSwgMTUsIDE0LCAxNCwgMTMsIDExLAorIDEzLCAxNiwgMTYsIDE1LCAxNCwgMTQsIDE1LCAxMywgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNCwgMTQsIDExLAorIDE0LCAxNiwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTUsIDExLAorIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDEyLAorIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDEyLAorIDE1LCAxNiwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLAorICA2LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMCwgIDksIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA3LAorICA5LCAxMiwgMTMsIDEyLCAxMywgMTIsIDE0LCAxMiwgMTIsIDEyLCAxMiwgMTEsIDEyLCAxMSwgMTEsICA4LAorIDEyLCAxNCwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNCwgMTUsIDE0LCAxNSwgMTMsIDE2LCAxMywgMTQsIDExLAorICA4LCAxMiwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDEyLCAxMCwgMTAsIDExLCAxMSwgMTAsICA4LAorIDEwLCAxMywgMTMsIDEyLCAxNCwgMTMsIDE0LCAxMiwgMTMsIDEzLCAxMiwgMTEsIDEzLCAxMiwgMTIsICA5LAorIDEyLCAxNSwgMTUsIDEzLCAxNiwgMTUsIDE2LCAxNCwgMTYsIDE1LCAxNSwgMTIsIDE2LCAxNCwgMTUsIDEwLAorIDExLCAxNSwgMTMsIDEzLCAxNiwgMTUsIDE0LCAxMywgMTQsIDE1LCAxMSwgMTIsIDE0LCAxNCwgMTIsIDEwLAorIDEyLCAxNiwgMTQsIDEzLCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE1LCAxMywgMTIsIDE1LCAxNSwgMTQsIDEwLAorIDE0LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNSwgMTMsIDE2LCAxNiwgMTUsIDExLAorICA4LCAxMiwgMTIsIDEyLCAxMSwgMTEsIDEyLCAxMSwgMTEsIDEyLCAxMSwgMTEsICA5LCAxMCwgMTAsICA4LAorIDEwLCAxMywgMTQsIDEzLCAxMywgMTIsIDE0LCAxMiwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMSwgMTIsICA5LAorIDEzLCAxNSwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE1LCAxNiwgMTQsIDE1LCAxMywgMTUsIDExLAorIDEwLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTMsIDE0LCAxMiwgMTIsIDEyLCAxMiwgMTEsICA5LAorIDEwLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxMiwgMTMsIDE0LCAxMywgMTIsIDEyLCAxMiwgMTIsICA5LAorIDEyLCAxNSwgMTUsIDE0LCAxNiwgMTQsIDE2LCAxMywgMTYsIDE1LCAxNSwgMTMsIDE1LCAxMywgMTQsIDEwLAorIDEzLCAxNiwgMTUsIDE1LCAxNiwgMTYsIDE1LCAxNCwgMTYsIDE2LCAxMywgMTQsIDE1LCAxNSwgMTIsIDEwLAorIDEyLCAxNiwgMTQsIDE0LCAxNiwgMTYsIDE1LCAxMywgMTYsIDE2LCAxNCwgMTMsIDE1LCAxNCwgMTMsIDEwLAorIDEzLCAxNiwgMTYsIDE0LCAxNiwgMTUsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNSwgMTUsIDEwLAorIDExLCAxNSwgMTUsIDE0LCAxMywgMTMsIDE0LCAxMywgMTMsIDE1LCAxNCwgMTQsIDExLCAxMiwgMTIsIDEwLAorIDEyLCAxNSwgMTYsIDE1LCAxNCwgMTMsIDE2LCAxNCwgMTYsIDE1LCAxNiwgMTQsIDEzLCAxMiwgMTMsIDEwLAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDExLAorIDEyLCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNCwgMTUsIDE2LCAxNCwgMTQsIDEzLCAxNCwgMTIsIDEwLAorIDEyLCAxNiwgMTYsIDE1LCAxNSwgMTQsIDE2LCAxMywgMTYsIDE2LCAxNSwgMTQsIDE0LCAxMywgMTMsIDEwLAorIDEzLCAxNiwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTUsIDEwLAorIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDEyLAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTQsIDExLAorIDE0LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTQsIDEwLAorIDEwLCAxNCwgMTMsIDEzLCAxMywgMTMsIDE0LCAxMywgMTEsIDEzLCAxMSwgMTEsIDExLCAxMSwgMTEsICA5LAorIDEyLCAxNSwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDE0LCAxMywgMTQsIDExLAorIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEyLAorIDExLCAxNSwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNCwgMTMsIDE0LCAxMSwgMTIsIDEzLCAxMywgMTIsIDEwLAorIDEzLCAxNiwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxMywgMTIsIDE1LCAxNCwgMTMsIDEwLAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDEyLAorIDEzLCAxNiwgMTQsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTQsIDE2LCAxMSwgMTIsIDE1LCAxNSwgMTIsIDEwLAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTMsIDE2LCAxNiwgMTQsIDExLAorIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDExLAorIDExLCAxNSwgMTUsIDE0LCAxMywgMTQsIDE0LCAxNCwgMTMsIDE0LCAxMywgMTMsIDExLCAxMiwgMTEsIDEwLAorIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDEzLCAxMiwgMTQsIDEwLAorIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTYsIDEyLAorIDEyLCAxNiwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTQsIDE1LCAxMywgMTMsIDEzLCAxMywgMTIsIDEwLAorIDEyLCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE2LCAxNCwgMTQsIDE1LCAxNCwgMTMsIDE0LCAxMywgMTMsIDEwLAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTUsIDExLAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTQsIDE1LCAxNSwgMTIsIDExLAorIDEzLCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNCwgMTMsIDE2LCAxNCwgMTMsIDEwLAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTUsIDEwLAorIDEyLCAxNiwgMTYsIDE1LCAxNCwgMTUsIDE2LCAxNCwgMTMsIDE1LCAxNCwgMTQsIDExLCAxMiwgMTIsIDEwLAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDEzLCAxMiwgMTQsIDExLAorIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDExLAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNSwgMTUsIDEzLCAxNCwgMTIsIDExLAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE0LCAxMywgMTMsIDEwLAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNCwgMTQsIDEwLAorIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNiwgMTMsIDExLAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNSwgMTQsIDE1LCAxNCwgMTMsIDEwLAorIDEyLCAxNSwgMTUsIDE0LCAxNSwgMTQsIDE2LCAxNCwgMTQsIDE2LCAxNSwgMTMsIDE0LCAxMywgMTMsICA5LAorfSwKK3sKKyAgMiwgIDUsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA1LCAgNiwgIDUsICA2LCAgNSwgIDYsICA2LCAgNCwKKyAgNiwgIDgsIDEwLCAgOCwgMTAsICA5LCAxMSwgIDksIDEwLCAxMCwgMTAsICA5LCAxMCwgIDksIDEwLCAgOCwKKyAxMCwgMTEsIDEzLCAxMSwgMTMsIDExLCAxNCwgMTEsIDE0LCAxMywgMTMsIDEyLCAxMywgMTIsIDEzLCAxMCwKKyAgNiwgMTAsICA4LCAgOSwgMTAsIDEwLCAxMCwgIDksIDEwLCAxMSwgIDksICA5LCAxMCwgMTAsICA5LCAgNywKKyAgOCwgMTEsIDExLCAxMCwgMTIsIDExLCAxMiwgMTAsIDEyLCAxMiwgMTEsIDEwLCAxMiwgMTIsIDExLCAgOSwKKyAxMSwgMTMsIDE0LCAxMSwgMTUsIDE0LCAxNSwgMTIsIDE2LCAxNCwgMTQsIDEyLCAxNSwgMTQsIDE0LCAxMSwKKyAxMCwgMTMsIDExLCAxMSwgMTQsIDEzLCAxMywgMTIsIDEzLCAxNCwgMTEsIDExLCAxMywgMTMsIDEyLCAxMCwKKyAxMSwgMTQsIDEzLCAxMSwgMTYsIDE0LCAxNCwgMTIsIDE1LCAxNSwgMTQsIDEyLCAxNSwgMTQsIDE0LCAxMSwKKyAxMiwgMTQsIDE0LCAxMSwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE1LCAxMiwKKyAgNiwgMTAsIDEwLCAxMCwgIDgsICA5LCAxMCwgIDksIDEwLCAxMSwgMTAsIDEwLCAgOSwgIDksICA5LCAgOCwKKyAgOCwgMTEsIDEyLCAxMiwgMTEsIDEwLCAxMiwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDEyLCAgOSwKKyAxMSwgMTMsIDE2LCAxNCwgMTQsIDEyLCAxNSwgMTIsIDE2LCAxNSwgMTYsIDE0LCAxNCwgMTMsIDE0LCAxMSwKKyAgOSwgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDExLCAxMCwKKyAxMCwgMTMsIDEzLCAxMiwgMTMsIDEyLCAxMywgMTEsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEyLCAxMCwKKyAxMywgMTQsIDE2LCAxNCwgMTUsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE1LCAxMiwKKyAxMiwgMTYsIDE0LCAxNCwgMTYsIDE1LCAxNCwgMTMsIDE2LCAxNiwgMTQsIDE0LCAxNSwgMTUsIDEzLCAxMiwKKyAxMywgMTYsIDE1LCAxNCwgMTYsIDE2LCAxNSwgMTMsIDE2LCAxNiwgMTUsIDE0LCAxNiwgMTYsIDE0LCAxMiwKKyAxNCwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwKKyAxMCwgMTMsIDE0LCAxMywgMTEsIDExLCAxMywgMTIsIDEzLCAxNCwgMTMsIDEzLCAxMSwgMTIsIDEyLCAxMCwKKyAxMSwgMTQsIDE1LCAxNSwgMTMsIDEyLCAxNCwgMTMsIDE2LCAxNiwgMTYsIDE1LCAxNCwgMTMsIDE0LCAxMSwKKyAxMiwgMTQsIDE2LCAxNiwgMTQsIDEyLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTMsIDE2LCAxMiwKKyAxMiwgMTYsIDE1LCAxNiwgMTQsIDE1LCAxNCwgMTQsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTQsIDEzLCAxMiwKKyAxMywgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE1LCAxMiwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywKKyAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxMywKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywKKyAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywKKyAgNiwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA4LCAxMCwgIDksICA5LCAgOCwgIDksICA5LCAgNywKKyAgOSwgMTIsIDEzLCAxMiwgMTMsIDEyLCAxMywgMTIsIDEyLCAxMiwgMTIsIDExLCAxMiwgMTEsIDEyLCAxMCwKKyAxMiwgMTQsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNSwgMTUsIDE0LCAxNiwgMTQsIDE1LCAxMiwKKyAgOCwgMTIsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMiwgMTAsIDEwLCAxMSwgMTIsIDEwLCAgOSwKKyAxMCwgMTMsIDEzLCAxMiwgMTQsIDEzLCAxNCwgMTIsIDEzLCAxMywgMTIsIDExLCAxMywgMTMsIDEyLCAxMCwKKyAxMywgMTUsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTUsIDEzLCAxNiwgMTUsIDE1LCAxMiwKKyAxMSwgMTUsIDEzLCAxMywgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTEsIDEyLCAxNCwgMTQsIDEyLCAxMSwKKyAxMywgMTYsIDE0LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTMsIDEzLCAxNiwgMTQsIDE0LCAxMSwKKyAxNCwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMiwKKyAgOCwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMiwgMTIsIDExLCAxMiwgMTEsIDExLCAgOSwgMTAsIDEwLCAgOSwKKyAxMCwgMTMsIDE0LCAxMywgMTMsIDEyLCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTEsIDEyLCAxMCwKKyAxMywgMTUsIDE2LCAxNSwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTMsIDE1LCAxMiwKKyAxMCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMCwKKyAxMCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTIsIDEzLCAxNCwgMTMsIDEyLCAxMywgMTIsIDEyLCAxMCwKKyAxMywgMTYsIDE2LCAxNCwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxNiwgMTUsIDE0LCAxNiwgMTQsIDE1LCAxMSwKKyAxMywgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTQsIDE2LCAxNiwgMTQsIDE0LCAxNSwgMTUsIDEzLCAxMiwKKyAxMywgMTYsIDE1LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTQsIDE0LCAxNSwgMTUsIDE0LCAxMSwKKyAxNCwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE1LCAxMiwKKyAxMSwgMTQsIDE1LCAxNCwgMTMsIDEzLCAxNCwgMTQsIDEzLCAxNSwgMTQsIDE0LCAxMSwgMTIsIDEyLCAxMSwKKyAxMywgMTYsIDE2LCAxNiwgMTQsIDE0LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE1LCAxNCwgMTMsIDE0LCAxMiwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxMywKKyAxMywgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTUsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTQsIDEzLCAxMiwKKyAxMywgMTYsIDE2LCAxNSwgMTUsIDE0LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE1LCAxNCwgMTQsIDE0LCAxMSwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxMywKKyAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxMiwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwKKyAgOSwgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTMsIDEwLCAxMiwgMTEsIDEyLCAxMSwgMTIsIDExLCAxMCwKKyAxMiwgMTUsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMTQsIDEzLCAxNCwgMTMsIDE0LCAxMiwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNCwKKyAxMSwgMTUsIDE0LCAxNCwgMTUsIDE0LCAxNSwgMTQsIDEzLCAxNCwgMTEsIDEyLCAxMywgMTMsIDEyLCAxMSwKKyAxMywgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTQsIDEzLCAxNiwgMTUsIDE0LCAxMiwKKyAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywKKyAxMiwgMTYsIDE0LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTEsIDEzLCAxNSwgMTYsIDEzLCAxMiwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE0LCAxNiwgMTYsIDE1LCAxMiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywKKyAxMSwgMTUsIDE0LCAxNCwgMTMsIDE0LCAxNSwgMTQsIDEyLCAxNCwgMTMsIDEzLCAxMSwgMTIsIDEyLCAxMSwKKyAxMywgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTMsIDE0LCAxMiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywKKyAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE0LCAxNiwgMTMsIDE0LCAxMywgMTQsIDEzLCAxMSwKKyAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNiwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxMSwKKyAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE1LCAxNiwgMTYsIDEzLCAxMiwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE0LCAxNiwgMTYsIDE1LCAxMiwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwKKyAxMSwgMTYsIDE2LCAxNSwgMTMsIDE1LCAxNiwgMTUsIDEzLCAxNSwgMTUsIDE1LCAxMSwgMTIsIDEyLCAxMSwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTQsIDE1LCAxMiwKKyAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxMywKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTQsIDEzLCAxMiwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTQsIDE0LCAxMiwKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMiwKKyAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE0LCAxMywKKyAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxMiwKKyAxMiwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNiwgMTQsIDE0LCAxNiwgMTUsIDE0LCAxNCwgMTUsIDE0LCAxMSwKK30sCit7CisgIDEsICA1LCAgNSwgIDYsICA1LCAgNiwgIDcsICA3LCAgNSwgIDcsICA2LCAgNywgIDUsICA2LCAgNiwgIDYsCisgIDYsICA5LCAxMCwgIDksIDEwLCAgOSwgMTEsIDEwLCAxMSwgMTEsIDExLCAxMCwgMTEsIDEwLCAxMSwgIDksCisgMTAsIDExLCAxNCwgMTIsIDE0LCAxMiwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMywgMTQsIDEzLCAxNiwgMTIsCisgIDYsIDEwLCAgOSwgIDksIDEwLCAxMSwgMTEsIDEwLCAxMCwgMTEsICA5LCAxMCwgMTAsIDExLCAxMCwgIDksCisgIDgsIDExLCAxMSwgMTAsIDEzLCAxMiwgMTMsIDEyLCAxMywgMTMsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTEsCisgMTEsIDEzLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTMsCisgMTAsIDE0LCAxMSwgMTIsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTYsIDEyLCAxMywgMTQsIDE2LCAxMywgMTIsCisgMTEsIDE0LCAxMywgMTIsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE0LCAxNCwgMTYsIDE2LCAxNiwgMTMsCisgMTIsIDE0LCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgIDYsIDEwLCAxMCwgMTEsICA5LCAgOSwgMTEsIDEwLCAxMCwgMTEsIDExLCAxMSwgIDksIDEwLCAxMCwgIDksCisgIDksIDEyLCAxMywgMTIsIDEyLCAxMSwgMTMsIDEyLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMywgMTEsCisgMTIsIDEzLCAxNiwgMTYsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsCisgIDksIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTEsCisgMTAsIDE0LCAxNCwgMTMsIDE0LCAxMywgMTQsIDEzLCAxNiwgMTYsIDE0LCAxNSwgMTQsIDE0LCAxNCwgMTIsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTAsIDE0LCAxNCwgMTYsIDExLCAxMiwgMTQsIDEzLCAxNCwgMTYsIDE2LCAxNiwgMTIsIDEzLCAxMywgMTIsCisgMTIsIDE2LCAxNiwgMTYsIDEzLCAxMywgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgIDYsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAgOSwgMTEsICA5LCAxMCwgIDksIDEwLCAxMCwgIDksCisgIDksIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDEzLCAxMiwgMTMsIDEzLCAxMiwgMTMsIDEyLCAxMywgMTEsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgIDgsIDEzLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMSwgMTMsIDEwLCAxMiwgMTIsIDEzLCAxMiwgMTEsCisgMTAsIDE0LCAxMywgMTMsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTIsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTEsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDEyLCAxMywgMTYsIDE2LCAxNCwgMTMsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgIDgsIDEzLCAxMywgMTMsIDExLCAxMiwgMTMsIDEzLCAxMSwgMTMsIDEyLCAxMywgMTAsIDEyLCAxMiwgMTEsCisgMTAsIDE0LCAxNiwgMTYsIDE0LCAxMywgMTYsIDE0LCAxNCwgMTYsIDE2LCAxNCwgMTMsIDEzLCAxNCwgMTIsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTAsIDE2LCAxNCwgMTYsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTYsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTIsCisgMTAsIDE0LCAxNCwgMTQsIDE0LCAxNiwgMTYsIDE0LCAxNCwgMTYsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTIsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTEsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTIsIDE0LCAxNCwgMTMsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgIDksIDE0LCAxMywgMTQsIDEzLCAxNCwgMTYsIDE2LCAxMSwgMTMsIDEyLCAxMywgMTEsIDEzLCAxMiwgMTIsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTEsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDEyLCAxMywgMTQsIDE2LCAxMywgMTMsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNCwgMTQsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTEsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTIsIDEzLCAxMywgMTMsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTQsCisgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTEsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNCwgMTQsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsCit9LAoreworICAxLCAgNSwgIDUsICA2LCAgNSwgIDYsICA3LCAgOCwgIDUsICA3LCAgNiwgIDgsICA2LCAgNywgIDcsICA3LAorICA1LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDEyLCAxMSwgMTAsIDExLCAxMSwgMTEsIDEwLCAxMSwgMTIsIDEwLAorICA5LCAxMSwgMTMsIDEyLCAxMywgMTIsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxMywgMTYsIDEzLAorICA1LCAxMCwgIDksIDEwLCAxMCwgMTEsIDExLCAxMSwgMTAsIDExLCAgOSwgMTEsIDEwLCAxMSwgMTEsIDEwLAorICA4LCAxMSwgMTEsIDExLCAxMiwgMTMsIDEzLCAxMywgMTIsIDEzLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEyLAorIDExLCAxMywgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICA5LCAxNCwgMTEsIDEyLCAxNCwgMTYsIDEzLCAxNCwgMTMsIDE2LCAxMiwgMTQsIDE2LCAxNiwgMTMsIDEzLAorIDExLCAxNiwgMTMsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDExLCAxNCwgMTQsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICA1LCAxMCwgMTEsIDExLCAgOSwgMTAsIDExLCAxMSwgMTAsIDEyLCAxMSwgMTIsICA5LCAxMSwgMTEsIDExLAorICA4LCAxMiwgMTMsIDEzLCAxMSwgMTEsIDE0LCAxMywgMTMsIDE0LCAxMywgMTYsIDEyLCAxMiwgMTMsIDEyLAorIDExLCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICA5LCAxMywgMTIsIDEzLCAxMiwgMTMsIDEzLCAxNCwgMTMsIDE2LCAxMywgMTYsIDEzLCAxNiwgMTMsIDEzLAorIDEwLCAxNCwgMTMsIDE0LCAxMywgMTMsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICA5LCAxNCwgMTYsIDE2LCAxMSwgMTIsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDEyLCAxNCwgMTMsIDEzLAorIDExLCAxNiwgMTYsIDE2LCAxMywgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEyLCAxNiwgMTYsIDE2LCAxNCwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICA1LCAxMCwgMTAsIDExLCAxMCwgMTEsIDEyLCAxMiwgIDgsIDExLCAxMCwgMTEsICA5LCAxMSwgMTEsIDExLAorICA5LCAxMiwgMTMsIDEzLCAxMywgMTMsIDE2LCAxNiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTYsIDEzLAorIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICA4LCAxMywgMTEsIDEzLCAxMiwgMTMsIDEzLCAxNCwgMTEsIDEzLCAxMCwgMTMsIDEyLCAxNCwgMTIsIDEyLAorIDEwLCAxNCwgMTMsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTYsIDE0LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDExLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICA4LCAxMywgMTMsIDEzLCAxMSwgMTMsIDE0LCAxNiwgMTEsIDEzLCAxMywgMTQsIDEwLCAxMiwgMTIsIDEyLAorIDEwLCAxNCwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDEzLCAxMywgMTYsIDE0LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEwLCAxNiwgMTQsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMywgMTYsIDEzLCAxNiwgMTMsIDE0LAorIDEwLCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDEzLAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEwLCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICA5LCAxNCwgMTMsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTAsIDE0LCAxMiwgMTQsIDExLCAxMywgMTMsIDEzLAorIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDExLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTIsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDExLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEwLCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDExLCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorIDEwLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LAorfQorfTsKKworCitzdGF0aWMgY29uc3QgdWludDhfdCBydjM0X2ludGVyX2NicFtOVU1fSU5URVJfVEFCTEVTXVs0XVtDQlBfVkxDX1NJWkVdID0geworeworIHsgMCwgIDYsICA2LCAgMywgIDYsICA0LCAgNSwgIDMsICA2LCAgNSwgIDQsICAzLCAgMywgIDQsICA0LCAgMyB9LAorIHsgMCwgIDYsICA2LCAgNCwgIDYsICA0LCAgNSwgIDMsICA2LCAgNSwgIDQsICAzLCAgNCwgIDQsICA0LCAgMiB9LAorIHsgMCwgIDcsICA3LCAgNCwgIDcsICA1LCAgNSwgIDQsICA3LCAgNSwgIDUsICA0LCAgNSwgIDQsICA0LCAgMSB9LAorIHsgMCwgIDcsICA3LCAgNSwgIDcsICA1LCAgNiwgIDQsICA3LCAgNiwgIDUsICAzLCAgNSwgIDQsICA0LCAgMSB9Cit9LAoreworIHsgMCwgIDYsICA2LCAgMywgIDYsICAzLCAgNSwgIDQsICA2LCAgNSwgIDMsICA0LCAgMywgIDQsICA0LCAgMyB9LAorIHsgMCwgIDYsICA2LCAgNCwgIDYsICA0LCAgNCwgIDQsICA2LCAgNCwgIDQsICAzLCAgNCwgIDQsICA0LCAgMiB9LAorIHsgMCwgIDYsICA2LCAgNCwgIDYsICA0LCAgNSwgIDQsICA2LCAgNSwgIDQsICAzLCAgNCwgIDQsICAzLCAgMiB9LAorIHsgMCwgIDcsICA3LCAgNSwgIDcsICA1LCAgNiwgIDQsICA3LCAgNiwgIDUsICAzLCAgNSwgIDQsICA0LCAgMSB9Cit9LAoreworIHsgMCwgIDYsICA2LCAgMywgIDYsICAzLCAgNSwgIDQsICA2LCAgNSwgIDMsICA0LCAgMywgIDQsICA0LCAgMyB9LAorIHsgMCwgIDUsICA1LCAgMywgIDUsICA0LCAgNSwgIDQsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsICA0LCAgMiB9LAorIHsgMCwgIDYsICA2LCAgNCwgIDYsICA0LCAgNSwgIDMsICA2LCAgNSwgIDQsICAzLCAgNCwgIDQsICA0LCAgMiB9LAorIHsgMCwgIDcsICA3LCAgNSwgIDcsICA1LCAgNiwgIDQsICA3LCAgNiwgIDUsICAzLCAgNSwgIDQsICA0LCAgMSB9Cit9LAoreworIHsgMCwgIDYsICA2LCAgMywgIDYsICAzLCAgNSwgIDQsICA2LCAgNSwgIDMsICA0LCAgMywgIDQsICA0LCAgMyB9LAorIHsgMCwgIDUsICA1LCAgMywgIDUsICA0LCAgNSwgIDQsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsICA0LCAgMiB9LAorIHsgMCwgIDYsICA2LCAgNCwgIDYsICA0LCAgNSwgIDMsICA2LCAgNSwgIDQsICAzLCAgNCwgIDQsICA0LCAgMiB9LAorIHsgMCwgIDcsICA3LCAgNCwgIDcsICA1LCAgNiwgIDQsICA3LCAgNiwgIDUsICA0LCAgNCwgIDQsICA0LCAgMSB9Cit9LAoreworIHsgMCwgIDUsICA1LCAgMywgIDUsICAzLCAgNSwgIDQsICA1LCAgNSwgIDMsICA0LCAgMywgIDQsICA0LCAgNCB9LAorIHsgMCwgIDUsICA1LCAgMywgIDUsICA0LCAgNSwgIDQsICA1LCAgNSwgIDMsICA0LCAgMywgIDQsICA0LCAgMyB9LAorIHsgMCwgIDYsICA2LCAgNCwgIDYsICA0LCAgNSwgIDQsICA2LCAgNSwgIDQsICAzLCAgNCwgIDQsICAzLCAgMiB9LAorIHsgMCwgIDcsICA3LCAgNCwgIDcsICA1LCAgNiwgIDQsICA3LCAgNiwgIDUsICA0LCAgNCwgIDQsICA0LCAgMSB9Cit9LAoreworIHsgMCwgIDUsICA1LCAgMywgIDUsICAzLCAgNSwgIDQsICA1LCAgNSwgIDMsICA0LCAgMywgIDQsICA0LCAgNCB9LAorIHsgMCwgIDUsICA1LCAgMywgIDUsICA0LCAgNSwgIDQsICA1LCAgNSwgIDMsICA0LCAgMywgIDQsICA0LCAgMyB9LAorIHsgMCwgIDUsICA1LCAgMywgIDUsICA0LCAgNCwgIDQsICA1LCAgNCwgIDQsICA0LCAgMywgIDQsICA0LCAgMyB9LAorIHsgMCwgIDYsICA2LCAgNCwgIDYsICA0LCAgNSwgIDQsICA2LCAgNSwgIDQsICAzLCAgNCwgIDQsICAzLCAgMiB9Cit9LAoreworIHsgMCwgIDQsICA0LCAgMywgIDQsICAzLCAgNSwgIDUsICA0LCAgNSwgIDMsICA1LCAgMywgIDUsICA0LCAgNSB9LAorIHsgMCwgIDQsICA0LCAgMywgIDQsICA0LCAgNSwgIDQsICA0LCAgNSwgIDMsICA1LCAgMywgIDUsICA0LCAgNCB9LAorIHsgMCwgIDQsICA0LCAgMywgIDQsICA0LCAgNSwgIDQsICA0LCAgNSwgIDQsICA0LCAgMywgIDQsICA0LCAgNCB9LAorIHsgMCwgIDQsICA0LCAgMywgIDUsICA0LCAgNSwgIDQsICA1LCAgNSwgIDQsICA0LCAgMywgIDQsICA0LCAgMyB9Cit9Cit9OworCisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ2MzRfdGFibGVfaW50ZXJfZmlyc3RwYXRbTlVNX0lOVEVSX1RBQkxFU11bMl1bRklSU1RCTEtfVkxDX1NJWkVdID0geworICB7CisgICAgeworICAgICAgIDAsICA3LCAgNSwgIDcsICA1LCAgNywgIDYsICA2LCAgNywgMTAsICA3LCAgOSwgIDgsICA5LCAgOCwgIDcsCisgICAgICAxMiwgMTQsIDExLCAxMiwgMTIsIDEyLCAxMSwgIDksICA2LCAgOSwgIDYsICA4LCAgNywgIDksICA3LCAgNywKKyAgICAgICA4LCAxMSwgIDgsICA5LCAgOSwgMTAsICA5LCAgOCwgMTMsIDE1LCAxMiwgMTIsIDEyLCAxMywgMTEsICA5LAorICAgICAgMTAsIDEzLCAgOSwgMTAsIDExLCAxMiwgIDksICA4LCAxMiwgMTQsIDEwLCAxMSwgMTIsIDEzLCAxMCwgIDksCisgICAgICAxNiwgMTYsIDEyLCAxMiwgMTQsIDEzLCAxMSwgIDksICA2LCAgOSwgIDcsICA5LCAgNywgIDksICA4LCAgNywKKyAgICAgICA5LCAxMSwgIDksIDEwLCAgOSwgMTAsICA5LCAgOCwgMTQsIDE2LCAxMiwgMTIsIDEzLCAxMywgMTEsICA5LAorICAgICAgIDgsIDExLCAgOCwgMTAsICA5LCAxMCwgIDksICA4LCAxMCwgMTMsIDEwLCAxMSwgMTAsIDExLCAgOSwgIDgsCisgICAgICAxNCwgMTYsIDEyLCAxMiwgMTMsIDEzLCAxMSwgIDksIDEyLCAxNCwgMTAsIDExLCAxMiwgMTMsIDEwLCAgOSwKKyAgICAgIDEzLCAxNiwgMTEsIDEyLCAxMywgMTMsIDEwLCAgOSwgMTYsIDE2LCAxMywgMTIsIDE0LCAxNCwgMTEsICA5LAorICAgICAgMTEsIDEzLCAxMSwgMTIsIDEwLCAxMSwgMTAsICA5LCAxMywgMTQsIDEyLCAxMiwgMTEsIDEyLCAxMCwgIDksCisgICAgICAxNiwgMTYsIDEzLCAxMywgMTMsIDEzLCAxMSwgIDksIDEyLCAxNSwgMTIsIDEyLCAxMSwgMTIsIDEwLCAgOSwKKyAgICAgIDEzLCAxNiwgMTMsIDEzLCAxMiwgMTIsIDExLCAgOSwgMTYsIDE2LCAxNCwgMTMsIDEzLCAxMywgMTEsICA5LAorICAgICAgMTQsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTEsICA5LCAxNiwgMTYsIDEzLCAxMywgMTQsIDE0LCAxMSwgIDksCisgICAgICAxNiwgMTYsIDEzLCAxMywgMTQsIDEzLCAxMSwgIDgsICA0LCAgOSwgIDYsICA4LCAgNiwgIDksICA3LCAgNywKKyAgICAgICA4LCAxMSwgIDgsICA5LCAgOSwgMTAsICA4LCAgOCwgMTMsIDE1LCAxMiwgMTIsIDEzLCAxMywgMTEsICA5LAorICAgICAgIDcsIDEwLCAgNywgIDksICA4LCAxMCwgIDgsICA4LCAgOSwgMTIsICA5LCAxMCwgMTAsIDExLCAgOSwgIDgsCisgICAgICAxNCwgMTYsIDEyLCAxMiwgMTMsIDEzLCAxMSwgIDksIDExLCAxMywgIDksIDEwLCAxMSwgMTIsICA5LCAgOCwKKyAgICAgIDEyLCAxNCwgMTAsIDExLCAxMiwgMTMsIDEwLCAgOSwgMTYsIDE2LCAxMywgMTIsIDE0LCAxNCwgMTEsICA5LAorICAgICAgIDcsIDEwLCAgOCwgIDksICA4LCAxMCwgIDgsICA4LCAxMCwgMTIsIDEwLCAxMSwgMTAsIDExLCAgOSwgIDgsCisgICAgICAxNCwgMTYsIDEzLCAxMywgMTMsIDEzLCAxMSwgIDksICA5LCAxMiwgIDksIDEwLCAgOSwgMTEsICA5LCAgOCwKKyAgICAgIDExLCAxMywgMTAsIDExLCAxMCwgMTEsIDEwLCAgOSwgMTUsIDE2LCAxMywgMTMsIDEzLCAxMywgMTEsICA5LAorICAgICAgMTIsIDE0LCAxMSwgMTEsIDEyLCAxMywgMTAsICA5LCAxMywgMTYsIDExLCAxMiwgMTMsIDEzLCAxMCwgIDksCisgICAgICAxNiwgMTYsIDEyLCAxMiwgMTQsIDEzLCAxMSwgIDgsIDExLCAxNCwgMTEsIDEyLCAxMCwgMTEsIDEwLCAgOSwKKyAgICAgIDEzLCAxNSwgMTIsIDEzLCAxMSwgMTIsIDEwLCAgOSwgMTYsIDE2LCAxNCwgMTMsIDEzLCAxMywgMTEsICA5LAorICAgICAgMTIsIDE1LCAxMiwgMTMsIDExLCAxMiwgMTAsICA5LCAxMywgMTYsIDEzLCAxMywgMTIsIDEyLCAxMSwgIDksCisgICAgICAxNiwgMTYsIDE0LCAxMywgMTMsIDEzLCAxMSwgIDksIDE1LCAxNiwgMTMsIDEzLCAxMywgMTMsIDExLCAgOSwKKyAgICAgIDE2LCAxNiwgMTMsIDEzLCAxMywgMTMsIDExLCAgOSwgMTYsIDE2LCAxMywgMTIsIDEzLCAxMywgMTAsICA3LAorICAgICAgIDgsIDExLCAgOCwgMTAsICA5LCAxMSwgIDksICA5LCAxMCwgMTMsIDEwLCAxMSwgMTEsIDEyLCAxMCwgIDksCisgICAgICAxNSwgMTYsIDEzLCAxMywgMTQsIDE0LCAxMiwgMTAsICA5LCAxMiwgIDksIDExLCAxMCwgMTEsICA5LCAgOSwKKyAgICAgIDEyLCAxNCwgMTEsIDExLCAxMSwgMTIsIDEwLCAgOSwgMTYsIDE2LCAxMywgMTMsIDE0LCAxNCwgMTIsIDEwLAorICAgICAgMTIsIDE0LCAxMCwgMTEsIDEyLCAxMywgMTAsICA5LCAxNCwgMTYsIDExLCAxMiwgMTMsIDE0LCAxMCwgIDksCisgICAgICAxNiwgMTYsIDEzLCAxMywgMTUsIDE0LCAxMSwgIDksICA5LCAxMiwgMTAsIDExLCAgOSwgMTEsIDEwLCAgOSwKKyAgICAgIDEyLCAxNCwgMTEsIDEyLCAxMSwgMTIsIDEwLCAgOSwgMTYsIDE2LCAxNCwgMTMsIDE0LCAxNCwgMTIsIDEwLAorICAgICAgMTEsIDE0LCAxMCwgMTIsIDExLCAxMiwgMTAsICA5LCAxMiwgMTUsIDExLCAxMiwgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxMywgMTQsIDE0LCAxMiwgMTAsIDEzLCAxNiwgMTEsIDEyLCAxMywgMTQsIDExLCAgOSwKKyAgICAgIDE0LCAxNiwgMTIsIDEyLCAxMywgMTQsIDExLCAgOSwgMTYsIDE2LCAxMywgMTMsIDE0LCAxNCwgMTEsICA5LAorICAgICAgMTIsIDE1LCAxMiwgMTMsIDEwLCAxMiwgMTAsICA5LCAxNCwgMTYsIDEzLCAxMywgMTEsIDEyLCAxMSwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxNCwgMTQsIDEzLCAxMiwgIDksIDEzLCAxNiwgMTMsIDEzLCAxMiwgMTMsIDExLCAxMCwKKyAgICAgIDE0LCAxNiwgMTMsIDEzLCAxMiwgMTMsIDExLCAxMCwgMTYsIDE2LCAxNCwgMTQsIDEzLCAxMywgMTIsICA5LAorICAgICAgMTUsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTEsICA5LCAxNiwgMTYsIDEzLCAxMywgMTMsIDE0LCAxMSwgIDksCisgICAgICAxNiwgMTYsIDEzLCAxMiwgMTMsIDEzLCAxMCwgIDgsIDEwLCAxMywgMTAsIDExLCAxMCwgMTIsIDEwLCAgOSwKKyAgICAgIDEyLCAxNCwgMTEsIDEyLCAxMiwgMTMsIDExLCAxMCwgMTYsIDE2LCAxMywgMTMsIDE0LCAxNCwgMTIsICA5LAorICAgICAgMTEsIDE0LCAxMCwgMTEsIDExLCAxMiwgMTAsICA5LCAxMywgMTYsIDExLCAxMiwgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxMywgMTQsIDE0LCAxMiwgIDksIDEyLCAxNSwgMTAsIDExLCAxMiwgMTMsICA5LCAgOCwKKyAgICAgIDE0LCAxNiwgMTEsIDExLCAxMywgMTQsIDEwLCAgOCwgMTYsIDE2LCAxMiwgMTIsIDE0LCAxNCwgMTAsICA4LAorICAgICAgMTEsIDE0LCAxMSwgMTIsIDExLCAxMiwgMTAsICA5LCAxMywgMTYsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTAsCisgICAgICAxNiwgMTYsIDE0LCAxMywgMTQsIDE0LCAxMiwgIDksIDEyLCAxNSwgMTEsIDEyLCAxMSwgMTMsIDEwLCAxMCwKKyAgICAgIDEzLCAxNiwgMTIsIDEzLCAxMiwgMTMsIDExLCAxMCwgMTYsIDE2LCAxNCwgMTMsIDE0LCAxNCwgMTIsICA5LAorICAgICAgMTMsIDE2LCAxMSwgMTEsIDEzLCAxMywgMTAsICA4LCAxNCwgMTYsIDExLCAxMiwgMTMsIDE0LCAxMCwgIDgsCisgICAgICAxNiwgMTYsIDEyLCAxMiwgMTQsIDE0LCAxMCwgIDgsIDEyLCAxNSwgMTIsIDEzLCAxMCwgMTEsIDEwLCAgOSwKKyAgICAgIDE0LCAxNiwgMTMsIDEzLCAxMSwgMTIsIDEwLCAgOSwgMTYsIDE2LCAxNCwgMTMsIDEzLCAxMywgMTEsICA4LAorICAgICAgMTMsIDE2LCAxMiwgMTMsIDExLCAxMiwgMTAsICA5LCAxNCwgMTYsIDEzLCAxMywgMTIsIDEyLCAxMCwgIDksCisgICAgICAxNiwgMTYsIDE0LCAxMywgMTMsIDEyLCAxMCwgIDgsIDE0LCAxNiwgMTIsIDEyLCAxMiwgMTMsIDEwLCAgOCwKKyAgICAgIDE0LCAxNiwgMTIsIDEyLCAxMiwgMTMsIDEwLCAgNywgMTYsIDE2LCAxMSwgMTEsIDEyLCAxMSwgIDgsICA1LAorICAgIH0sCisgICAgeworICAgICAgIDAsICA3LCAgNCwgIDgsICA1LCAgOCwgIDcsICA4LCAgNiwgMTAsICA3LCAxMCwgIDgsIDEwLCAgOSwgIDksCisgICAgICAxMywgMTYsIDEyLCAxMywgMTMsIDE0LCAxMiwgMTIsICA0LCAxMCwgIDYsICA5LCAgOCwgMTEsICA4LCAgOSwKKyAgICAgICA4LCAxMiwgIDgsIDExLCAxMCwgMTIsIDEwLCAxMCwgMTQsIDE2LCAxMiwgMTMsIDE0LCAxNSwgMTIsIDEyLAorICAgICAgIDksIDE0LCAgOSwgMTEsIDEyLCAxNCwgMTEsIDExLCAxMSwgMTUsIDEwLCAxMiwgMTMsIDE0LCAxMSwgMTEsCisgICAgICAxNSwgMTYsIDEzLCAxNCwgMTUsIDE2LCAxMywgMTIsICA1LCAxMCwgIDcsIDEwLCAgNywgMTAsICA5LCAgOSwKKyAgICAgICA4LCAxMiwgIDksIDExLCAxMCwgMTEsIDEwLCAxMCwgMTQsIDE2LCAxMywgMTQsIDE0LCAxNCwgMTIsIDEyLAorICAgICAgIDgsIDEyLCAgOCwgMTEsIDEwLCAxMiwgMTAsIDEwLCAxMCwgMTQsIDEwLCAxMiwgMTEsIDEzLCAxMCwgMTEsCisgICAgICAxNSwgMTYsIDEzLCAxNCwgMTQsIDE1LCAxMywgMTIsIDExLCAxNiwgMTAsIDEyLCAxMywgMTUsIDExLCAxMSwKKyAgICAgIDEzLCAxNiwgMTEsIDEzLCAxNCwgMTUsIDEyLCAxMiwgMTYsIDE2LCAxNCwgMTQsIDE2LCAxNiwgMTMsIDEyLAorICAgICAgMTEsIDE1LCAxMSwgMTMsIDExLCAxMywgMTEsIDExLCAxMywgMTYsIDEyLCAxNCwgMTIsIDEzLCAxMiwgMTIsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTUsIDE1LCAxMywgMTIsIDEyLCAxNiwgMTIsIDE0LCAxMiwgMTQsIDEyLCAxMiwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxMywgMTQsIDEyLCAxMiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDEyLAorICAgICAgMTQsIDE2LCAxMywgMTQsIDE1LCAxNiwgMTMsIDEyLCAxNiwgMTYsIDE0LCAxNSwgMTYsIDE2LCAxMywgMTIsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxMywgMTIsICAyLCAgOSwgIDUsICA4LCAgNiwgIDksICA4LCAgOSwKKyAgICAgICA3LCAxMSwgIDgsIDEwLCAgOSwgMTEsICA5LCAxMCwgMTMsIDE2LCAxMiwgMTMsIDE0LCAxNCwgMTIsIDEyLAorICAgICAgIDUsIDExLCAgNiwgMTAsICA5LCAxMSwgIDksICA5LCAgOSwgMTMsICA5LCAxMSwgMTAsIDEyLCAxMCwgMTAsCisgICAgICAxNCwgMTYsIDEyLCAxNCwgMTQsIDE1LCAxMiwgMTIsICA5LCAxNCwgIDksIDExLCAxMiwgMTQsIDEwLCAxMSwKKyAgICAgIDExLCAxNiwgMTAsIDEyLCAxMywgMTQsIDExLCAxMSwgMTYsIDE2LCAxMywgMTQsIDE1LCAxNiwgMTMsIDEyLAorICAgICAgIDYsIDExLCAgNywgMTAsICA4LCAxMSwgIDksICA5LCAgOSwgMTMsICA5LCAxMSwgMTAsIDEyLCAxMCwgMTAsCisgICAgICAxNCwgMTYsIDEzLCAxNCwgMTQsIDE0LCAxMiwgMTIsICA4LCAxMywgIDgsIDExLCAxMCwgMTIsIDEwLCAxMCwKKyAgICAgIDEwLCAxMywgMTAsIDEyLCAxMSwgMTMsIDEwLCAxMSwgMTQsIDE2LCAxMywgMTQsIDE0LCAxNSwgMTIsIDEyLAorICAgICAgMTEsIDE1LCAxMCwgMTIsIDEzLCAxNSwgMTEsIDExLCAxMiwgMTYsIDExLCAxMywgMTMsIDE1LCAxMiwgMTEsCisgICAgICAxNiwgMTYsIDEzLCAxNCwgMTUsIDE2LCAxMywgMTIsIDExLCAxNSwgMTEsIDEzLCAxMCwgMTMsIDExLCAxMSwKKyAgICAgIDEzLCAxNiwgMTIsIDE0LCAxMiwgMTMsIDEyLCAxMSwgMTYsIDE2LCAxNCwgMTUsIDE1LCAxNSwgMTMsIDEyLAorICAgICAgMTIsIDE2LCAxMiwgMTMsIDEyLCAxNCwgMTIsIDEyLCAxMywgMTYsIDEyLCAxNCwgMTMsIDE0LCAxMiwgMTIsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTUsIDE1LCAxMywgMTIsIDE0LCAxNiwgMTMsIDE0LCAxNSwgMTYsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTMsIDE0LCAxNSwgMTYsIDEyLCAxMiwgMTYsIDE2LCAxNCwgMTUsIDE2LCAxNiwgMTMsIDEyLAorICAgICAgIDYsIDEyLCAgNywgMTAsICA5LCAxMiwgIDksIDEwLCAgOSwgMTMsICA5LCAxMiwgMTEsIDEzLCAxMSwgMTEsCisgICAgICAxNCwgMTYsIDEzLCAxNCwgMTUsIDE1LCAxMywgMTIsICA4LCAxMywgIDgsIDExLCAxMCwgMTMsIDEwLCAxMCwKKyAgICAgIDEwLCAxNCwgMTAsIDEyLCAxMiwgMTQsIDExLCAxMSwgMTUsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTMsIDEyLAorICAgICAgMTAsIDE1LCAgOSwgMTIsIDEyLCAxNSwgMTEsIDExLCAxMiwgMTYsIDExLCAxMywgMTQsIDE2LCAxMiwgMTIsCisgICAgICAxNiwgMTYsIDE0LCAxNCwgMTYsIDE2LCAxMywgMTIsICA4LCAxMywgIDksIDExLCAxMCwgMTIsIDEwLCAxMSwKKyAgICAgIDExLCAxNCwgMTEsIDEyLCAxMSwgMTMsIDExLCAxMSwgMTYsIDE2LCAxNCwgMTUsIDE1LCAxNiwgMTMsIDEyLAorICAgICAgMTAsIDE0LCAxMCwgMTIsIDExLCAxMywgMTEsIDExLCAxMSwgMTUsIDExLCAxMywgMTIsIDE0LCAxMSwgMTEsCisgICAgICAxNSwgMTYsIDEzLCAxNCwgMTUsIDE2LCAxMywgMTIsIDEyLCAxNiwgMTEsIDEzLCAxMywgMTYsIDEyLCAxMiwKKyAgICAgIDEzLCAxNiwgMTEsIDEzLCAxNCwgMTYsIDEyLCAxMiwgMTYsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTMsIDEyLAorICAgICAgMTIsIDE2LCAxMiwgMTQsIDExLCAxMywgMTEsIDExLCAxMywgMTYsIDEzLCAxNCwgMTIsIDE0LCAxMiwgMTIsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTMsIDEzLCAxNiwgMTIsIDE0LCAxMiwgMTQsIDEyLCAxMiwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxMywgMTQsIDEyLCAxMiwgMTYsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTMsIDEyLAorICAgICAgMTUsIDE2LCAxMywgMTUsIDE1LCAxNiwgMTMsIDEyLCAxNSwgMTYsIDEzLCAxNSwgMTQsIDE2LCAxMywgMTIsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTUsIDE2LCAxMywgMTEsICA4LCAxMywgIDgsIDExLCAxMCwgMTMsIDEwLCAxMSwKKyAgICAgIDExLCAxNSwgMTAsIDEyLCAxMiwgMTQsIDExLCAxMSwgMTUsIDE2LCAxMywgMTQsIDE1LCAxNSwgMTMsIDEyLAorICAgICAgIDksIDE0LCAgOSwgMTIsIDExLCAxNCwgMTAsIDExLCAxMSwgMTYsIDEwLCAxMiwgMTMsIDE0LCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDEzLCAxNCwgMTUsIDE2LCAxMywgMTIsIDExLCAxNSwgIDksIDEyLCAxMiwgMTQsIDEwLCAxMCwKKyAgICAgIDEyLCAxNiwgMTEsIDEyLCAxNCwgMTUsIDExLCAxMSwgMTYsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTIsIDExLAorICAgICAgIDksIDE0LCAxMCwgMTIsIDExLCAxMywgMTEsIDExLCAxMiwgMTYsIDExLCAxMywgMTIsIDE0LCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDE0LCAxNCwgMTUsIDE1LCAxMywgMTIsIDEwLCAxNSwgMTAsIDEyLCAxMiwgMTQsIDExLCAxMSwKKyAgICAgIDEyLCAxNiwgMTEsIDEzLCAxMywgMTQsIDExLCAxMSwgMTYsIDE2LCAxNCwgMTQsIDE1LCAxNiwgMTMsIDEyLAorICAgICAgMTIsIDE2LCAxMCwgMTIsIDEzLCAxNSwgMTEsIDExLCAxMywgMTYsIDExLCAxMywgMTQsIDE1LCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDEzLCAxMywgMTUsIDE2LCAxMiwgMTEsIDEyLCAxNiwgMTEsIDEzLCAxMCwgMTMsIDExLCAxMSwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxMiwgMTQsIDExLCAxMSwgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNSwgMTMsIDExLAorICAgICAgMTMsIDE2LCAxMiwgMTQsIDEyLCAxNCwgMTEsIDExLCAxMywgMTYsIDEyLCAxNCwgMTIsIDE0LCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTQsIDE0LCAxMiwgMTEsIDE0LCAxNiwgMTIsIDEzLCAxMywgMTUsIDExLCAxMSwKKyAgICAgIDE0LCAxNiwgMTIsIDEzLCAxMywgMTQsIDExLCAxMSwgMTUsIDE2LCAxMiwgMTMsIDEzLCAxMywgMTAsICA5LAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAgMCwgIDcsICA0LCAgNywgIDUsICA3LCAgNiwgIDYsICA2LCAxMCwgIDcsICA4LCAgOCwgIDksICA4LCAgNywKKyAgICAgIDEzLCAxNCwgMTEsIDEyLCAxMiwgMTIsIDExLCAgOSwgIDUsICA5LCAgNiwgIDgsICA3LCAgOSwgIDcsICA3LAorICAgICAgIDgsIDExLCAgOCwgIDksICA5LCAxMCwgIDksICA4LCAxMywgMTYsIDEyLCAxMiwgMTIsIDEzLCAxMSwgIDksCisgICAgICAxMCwgMTMsICA4LCAxMCwgMTEsIDEyLCAgOSwgIDksIDEyLCAxNCwgMTAsIDExLCAxMiwgMTMsIDEwLCAgOSwKKyAgICAgIDE1LCAxNiwgMTIsIDEyLCAxNCwgMTQsIDExLCAgOSwgIDYsIDEwLCAgNywgIDksICA3LCAgOSwgIDgsICA3LAorICAgICAgIDgsIDExLCAgOSwgMTAsICA5LCAxMCwgIDksICA4LCAxNCwgMTYsIDEyLCAxMiwgMTMsIDEyLCAxMSwgIDksCisgICAgICAgOCwgMTEsICA4LCAxMCwgIDksIDEwLCAgOSwgIDgsIDEwLCAxMywgMTAsIDExLCAxMCwgMTEsICA5LCAgOSwKKyAgICAgIDE0LCAxNiwgMTIsIDEyLCAxMywgMTMsIDExLCAgOSwgMTIsIDE1LCAxMCwgMTEsIDEyLCAxMywgMTAsICA5LAorICAgICAgMTMsIDE2LCAxMSwgMTIsIDEzLCAxMywgMTAsICA5LCAxNiwgMTYsIDEyLCAxMywgMTQsIDE0LCAxMSwgIDksCisgICAgICAxMCwgMTQsIDExLCAxMiwgIDksIDExLCAxMCwgIDksIDEyLCAxNSwgMTIsIDEzLCAxMSwgMTIsIDExLCAgOSwKKyAgICAgIDE2LCAxNiwgMTMsIDEzLCAxMywgMTMsIDExLCAgOSwgMTIsIDE1LCAxMiwgMTMsIDExLCAxMiwgMTEsICA5LAorICAgICAgMTMsIDE2LCAxMiwgMTMsIDEyLCAxMywgMTEsIDEwLCAxNiwgMTYsIDEzLCAxMywgMTMsIDEzLCAxMSwgIDksCisgICAgICAxNCwgMTYsIDEzLCAxMywgMTMsIDE0LCAxMSwgMTAsIDE2LCAxNiwgMTMsIDEzLCAxMywgMTQsIDExLCAxMCwKKyAgICAgIDE2LCAxNiwgMTMsIDEzLCAxNCwgMTQsIDExLCAgOSwgIDQsICA5LCAgNiwgIDgsICA2LCAgOSwgIDcsICA3LAorICAgICAgIDgsIDExLCAgOCwgIDksICA5LCAxMCwgIDksICA4LCAxMywgMTUsIDEyLCAxMiwgMTMsIDEzLCAxMSwgIDksCisgICAgICAgNiwgMTAsICA3LCAgOSwgIDgsIDEwLCAgOCwgIDgsICA5LCAxMiwgIDksIDEwLCAxMCwgMTEsICA5LCAgOCwKKyAgICAgIDE0LCAxNiwgMTIsIDEyLCAxMywgMTMsIDExLCAxMCwgMTAsIDEzLCAgOCwgMTAsIDExLCAxMiwgIDksICA5LAorICAgICAgMTIsIDE1LCAxMCwgMTEsIDEyLCAxMywgMTAsICA5LCAxNiwgMTYsIDEyLCAxMiwgMTQsIDE0LCAxMSwgIDksCisgICAgICAgNywgMTEsICA4LCAgOSwgIDcsIDEwLCAgOCwgIDgsICA5LCAxMiwgMTAsIDExLCAgOSwgMTEsICA5LCAgOSwKKyAgICAgIDE0LCAxNiwgMTIsIDEzLCAxMywgMTMsIDExLCAxMCwgIDksIDEyLCAgOSwgMTAsICA5LCAxMSwgIDksICA5LAorICAgICAgMTAsIDEzLCAxMCwgMTEsIDEwLCAxMSwgMTAsICA5LCAxNCwgMTYsIDEyLCAxMywgMTMsIDEzLCAxMSwgIDksCisgICAgICAxMiwgMTUsIDEwLCAxMSwgMTIsIDEzLCAxMCwgIDksIDEzLCAxNiwgMTEsIDEyLCAxMywgMTMsIDEwLCAgOSwKKyAgICAgIDE2LCAxNiwgMTIsIDEyLCAxNCwgMTQsIDExLCAgOSwgMTAsIDE0LCAxMSwgMTIsICA5LCAxMSwgMTAsICA5LAorICAgICAgMTIsIDE2LCAxMiwgMTMsIDExLCAxMiwgMTEsICA5LCAxNiwgMTYsIDE0LCAxNCwgMTMsIDEzLCAxMSwgIDksCisgICAgICAxMiwgMTYsIDEyLCAxMywgMTEsIDEyLCAxMCwgMTAsIDEzLCAxNiwgMTIsIDEzLCAxMSwgMTIsIDExLCAxMCwKKyAgICAgIDE2LCAxNiwgMTMsIDEzLCAxMywgMTMsIDExLCAgOSwgMTQsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTEsICA5LAorICAgICAgMTUsIDE2LCAxMywgMTMsIDEzLCAxNCwgMTEsICA5LCAxNiwgMTYsIDEzLCAxMywgMTMsIDEzLCAxMCwgIDgsCisgICAgICAgNywgMTEsICA4LCAxMCwgIDksIDExLCAgOSwgIDksIDEwLCAxMywgMTAsIDExLCAxMSwgMTIsIDEwLCAxMCwKKyAgICAgIDE1LCAxNiwgMTMsIDEzLCAxNCwgMTQsIDEyLCAxMCwgIDksIDEzLCAgOSwgMTEsIDEwLCAxMiwgMTAsICA5LAorICAgICAgMTEsIDE0LCAxMCwgMTIsIDEyLCAxMywgMTAsIDEwLCAxNiwgMTYsIDEzLCAxMywgMTQsIDE0LCAxMiwgMTAsCisgICAgICAxMSwgMTUsICA5LCAxMSwgMTIsIDEzLCAxMCwgIDksIDEzLCAxNiwgMTEsIDEyLCAxMywgMTQsIDExLCAxMCwKKyAgICAgIDE2LCAxNiwgMTMsIDEzLCAxNSwgMTUsIDExLCAxMCwgIDksIDEzLCAxMCwgMTEsICA5LCAxMSwgMTAsICA5LAorICAgICAgMTEsIDE0LCAxMSwgMTIsIDExLCAxMiwgMTEsIDEwLCAxNiwgMTYsIDE0LCAxNCwgMTQsIDE0LCAxMiwgMTAsCisgICAgICAxMCwgMTQsIDEwLCAxMiwgMTEsIDEyLCAxMCwgMTAsIDEyLCAxNSwgMTEsIDEyLCAxMiwgMTMsIDExLCAxMCwKKyAgICAgIDE2LCAxNiwgMTMsIDEzLCAxNCwgMTQsIDEyLCAxMCwgMTMsIDE2LCAxMSwgMTIsIDEzLCAxNCwgMTEsIDEwLAorICAgICAgMTMsIDE2LCAxMSwgMTIsIDEzLCAxNCwgMTEsIDEwLCAxNiwgMTYsIDEyLCAxMywgMTQsIDE0LCAxMSwgIDksCisgICAgICAxMSwgMTUsIDEyLCAxMywgMTAsIDEyLCAxMCwgMTAsIDEzLCAxNiwgMTMsIDE0LCAxMSwgMTMsIDExLCAxMCwKKyAgICAgIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTQsIDEyLCAxMCwgMTMsIDE2LCAxMywgMTMsIDExLCAxMywgMTEsIDEwLAorICAgICAgMTQsIDE2LCAxMywgMTQsIDEyLCAxMywgMTEsIDEwLCAxNiwgMTYsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTAsCisgICAgICAxNSwgMTYsIDEzLCAxNCwgMTQsIDE0LCAxMSwgMTAsIDE1LCAxNiwgMTMsIDEzLCAxMywgMTQsIDExLCAxMCwKKyAgICAgIDE2LCAxNiwgMTIsIDEzLCAxMywgMTMsIDEwLCAgOCwgIDksIDEzLCAxMCwgMTEsIDEwLCAxMiwgMTAsIDEwLAorICAgICAgMTIsIDE1LCAxMSwgMTIsIDEyLCAxMywgMTEsIDEwLCAxNiwgMTYsIDE0LCAxMywgMTQsIDE0LCAxMiwgMTAsCisgICAgICAxMCwgMTQsIDEwLCAxMiwgMTEsIDEzLCAxMCwgMTAsIDEzLCAxNiwgMTEsIDEyLCAxMiwgMTQsIDExLCAxMCwKKyAgICAgIDE2LCAxNiwgMTMsIDEzLCAxNCwgMTQsIDEyLCAxMCwgMTIsIDE2LCAgOSwgMTEsIDEyLCAxNCwgMTAsICA5LAorICAgICAgMTMsIDE2LCAxMCwgMTIsIDEzLCAxNCwgMTAsICA5LCAxNiwgMTYsIDEyLCAxMiwgMTQsIDE0LCAxMSwgIDksCisgICAgICAxMCwgMTQsIDExLCAxMiwgMTAsIDEyLCAxMCwgMTAsIDEzLCAxNiwgMTIsIDEzLCAxMiwgMTMsIDExLCAxMCwKKyAgICAgIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTQsIDEyLCAxMCwgMTEsIDE2LCAxMSwgMTIsIDExLCAxMywgMTEsIDEwLAorICAgICAgMTMsIDE2LCAxMiwgMTMsIDEyLCAxNCwgMTEsIDEwLCAxNiwgMTYsIDE0LCAxNCwgMTQsIDE0LCAxMiwgMTAsCisgICAgICAxMywgMTYsIDExLCAxMiwgMTMsIDE0LCAxMCwgIDksIDE0LCAxNiwgMTEsIDEyLCAxMywgMTQsIDEwLCAgOSwKKyAgICAgIDE2LCAxNiwgMTIsIDEyLCAxNCwgMTQsIDEwLCAgOCwgMTIsIDE2LCAxMiwgMTMsIDEwLCAxMiwgMTAsICA5LAorICAgICAgMTQsIDE2LCAxMywgMTMsIDExLCAxMiwgMTEsICA5LCAxNiwgMTYsIDE0LCAxNCwgMTMsIDEzLCAxMSwgIDksCisgICAgICAxMywgMTYsIDEyLCAxMywgMTEsIDEyLCAxMCwgIDksIDE0LCAxNiwgMTMsIDEzLCAxMSwgMTMsIDExLCAgOSwKKyAgICAgIDE2LCAxNiwgMTQsIDE0LCAxMywgMTMsIDExLCAgOSwgMTQsIDE2LCAxMiwgMTMsIDEyLCAxMywgMTAsICA4LAorICAgICAgMTQsIDE2LCAxMiwgMTIsIDEyLCAxMywgMTAsICA4LCAxNSwgMTYsIDExLCAxMSwgMTEsIDEyLCAgOSwgIDYsCisgICAgfSwKKyAgICB7CisgICAgICAgMCwgIDcsICA0LCAgNywgIDUsICA4LCAgNywgIDgsICA1LCAxMCwgIDcsIDEwLCAgOCwgMTAsICA5LCAxMCwKKyAgICAgIDEzLCAxNiwgMTIsIDE0LCAxNCwgMTQsIDEzLCAxMiwgIDQsIDEwLCAgNiwgIDksICA4LCAxMSwgIDksICA5LAorICAgICAgIDgsIDEyLCAgOCwgMTEsIDEwLCAxMiwgMTAsIDEwLCAxNCwgMTYsIDEzLCAxNCwgMTQsIDE1LCAxMywgMTIsCisgICAgICAgOSwgMTQsICA5LCAxMiwgMTIsIDE0LCAxMSwgMTEsIDEyLCAxNiwgMTEsIDEzLCAxMywgMTUsIDEyLCAxMiwKKyAgICAgIDE1LCAxNiwgMTQsIDE1LCAxNSwgMTYsIDEzLCAxMywgIDUsIDEwLCAgNywgMTAsICA3LCAxMCwgIDksICA5LAorICAgICAgIDgsIDEyLCAgOSwgMTEsICA5LCAxMSwgMTAsIDEwLCAxNCwgMTYsIDEzLCAxNCwgMTQsIDE1LCAxMywgMTIsCisgICAgICAgNywgMTIsICA4LCAxMSwgMTAsIDEyLCAxMCwgMTAsIDEwLCAxMywgMTAsIDEyLCAxMSwgMTMsIDExLCAxMSwKKyAgICAgIDE1LCAxNiwgMTMsIDE1LCAxNCwgMTYsIDEzLCAxMywgMTEsIDE2LCAxMSwgMTMsIDEzLCAxNiwgMTIsIDEyLAorICAgICAgMTMsIDE2LCAxMiwgMTQsIDE0LCAxNiwgMTIsIDEyLCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTMsCisgICAgICAxMSwgMTUsIDEyLCAxNCwgMTEsIDEzLCAxMSwgMTIsIDEzLCAxNiwgMTIsIDE0LCAxMiwgMTQsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEzLCAxMywgMTMsIDE2LCAxMiwgMTQsIDEyLCAxNCwgMTIsIDEyLAorICAgICAgMTQsIDE2LCAxMywgMTUsIDEzLCAxNSwgMTMsIDEzLCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTMsCisgICAgICAxNSwgMTYsIDEzLCAxNiwgMTUsIDE2LCAxMywgMTMsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE0LCAxMywKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxMywgIDIsICA5LCAgNSwgIDgsICA2LCAgOSwgIDgsICA5LAorICAgICAgIDcsIDExLCAgOCwgMTAsICA5LCAxMSwgIDksIDEwLCAxNCwgMTYsIDEzLCAxNCwgMTQsIDE1LCAxMywgMTIsCisgICAgICAgNSwgMTEsICA2LCAxMCwgIDksIDExLCAgOSwgMTAsICA4LCAxMywgIDksIDExLCAxMSwgMTIsIDEwLCAxMSwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxNCwgMTYsIDEzLCAxMywgIDksIDE1LCAgOSwgMTIsIDEyLCAxNCwgMTEsIDExLAorICAgICAgMTIsIDE2LCAxMSwgMTMsIDEzLCAxNSwgMTIsIDEyLCAxNiwgMTYsIDE0LCAxNSwgMTYsIDE2LCAxNCwgMTMsCisgICAgICAgNiwgMTEsICA3LCAxMCwgIDgsIDExLCAgOSwgMTAsICA5LCAxMywgIDksIDEyLCAxMCwgMTIsIDEwLCAxMSwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxNCwgMTUsIDEzLCAxMywgIDgsIDEyLCAgOCwgMTEsIDEwLCAxMiwgMTAsIDExLAorICAgICAgIDksIDEzLCAxMCwgMTIsIDExLCAxMywgMTEsIDExLCAxNCwgMTYsIDEzLCAxNCwgMTQsIDE2LCAxMywgMTMsCisgICAgICAxMiwgMTYsIDExLCAxMywgMTMsIDE1LCAxMiwgMTIsIDEzLCAxNiwgMTEsIDEzLCAxNCwgMTYsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTQsIDE1LCAxNiwgMTYsIDEzLCAxMywgMTEsIDE1LCAxMSwgMTQsIDEwLCAxMywgMTEsIDEyLAorICAgICAgMTMsIDE2LCAxMywgMTUsIDEyLCAxNCwgMTIsIDEyLCAxNiwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxNCwgMTMsCisgICAgICAxMiwgMTYsIDEyLCAxNCwgMTIsIDE0LCAxMiwgMTIsIDEzLCAxNiwgMTMsIDE1LCAxMywgMTQsIDEyLCAxMywKKyAgICAgIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTYsIDEzLCAxMywgMTUsIDE2LCAxMywgMTYsIDE1LCAxNiwgMTMsIDEzLAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTMsIDEzLCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNCwgMTMsCisgICAgICAgNSwgMTIsICA3LCAxMCwgIDksIDEyLCAxMCwgMTAsICA5LCAxMywgIDksIDEyLCAxMSwgMTMsIDExLCAxMSwKKyAgICAgIDE1LCAxNiwgMTMsIDE0LCAxNSwgMTUsIDEzLCAxMywgIDcsIDEzLCAgOCwgMTEsIDEwLCAxMywgMTAsIDExLAorICAgICAgMTAsIDE0LCAxMCwgMTIsIDEyLCAxNCwgMTEsIDEyLCAxNiwgMTYsIDE0LCAxNSwgMTYsIDE2LCAxNCwgMTMsCisgICAgICAxMCwgMTYsICA5LCAxMiwgMTMsIDE1LCAxMSwgMTIsIDEzLCAxNiwgMTEsIDEzLCAxNCwgMTYsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE0LCAxMywgIDgsIDEzLCAgOSwgMTIsICA5LCAxMiwgMTAsIDExLAorICAgICAgMTEsIDE1LCAxMSwgMTMsIDExLCAxMywgMTEsIDEyLCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTMsCisgICAgICAgOSwgMTQsIDEwLCAxMiwgMTEsIDEzLCAxMSwgMTIsIDExLCAxNSwgMTEsIDEzLCAxMiwgMTQsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxMywgMTIsIDE2LCAxMSwgMTQsIDE0LCAxNiwgMTIsIDEyLAorICAgICAgMTMsIDE2LCAxMiwgMTQsIDE0LCAxNiwgMTMsIDEzLCAxNiwgMTYsIDEzLCAxNSwgMTYsIDE2LCAxNCwgMTMsCisgICAgICAxMSwgMTYsIDEyLCAxNCwgMTAsIDEzLCAxMiwgMTIsIDEzLCAxNiwgMTMsIDE1LCAxMiwgMTQsIDEyLCAxMywKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMTMsIDE2LCAxMywgMTUsIDEyLCAxNSwgMTIsIDEzLAorICAgICAgMTMsIDE2LCAxMywgMTUsIDEyLCAxNSwgMTMsIDEzLCAxNiwgMTYsIDE1LCAxNiwgMTQsIDE2LCAxNCwgMTMsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTMsIDE1LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxMywKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDEzLCAxMiwgIDgsIDE0LCAgOSwgMTIsIDEwLCAxNCwgMTEsIDEyLAorICAgICAgMTEsIDE2LCAxMCwgMTMsIDEyLCAxNCwgMTIsIDEyLCAxNiwgMTYsIDE0LCAxNSwgMTUsIDE2LCAxNCwgMTMsCisgICAgICAgOSwgMTUsICA5LCAxMiwgMTIsIDE0LCAxMSwgMTIsIDEyLCAxNiwgMTEsIDEzLCAxMywgMTUsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTQsIDE1LCAxNiwgMTYsIDE0LCAxMywgMTEsIDE2LCAgOSwgMTIsIDEzLCAxNSwgMTEsIDExLAorICAgICAgMTMsIDE2LCAxMSwgMTMsIDE0LCAxNiwgMTIsIDEyLCAxNiwgMTYsIDE0LCAxNCwgMTYsIDE2LCAxMywgMTIsCisgICAgICAgOSwgMTUsIDEwLCAxMywgMTEsIDE0LCAxMSwgMTIsIDEyLCAxNiwgMTEsIDE0LCAxMiwgMTQsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE0LCAxMywgMTAsIDE2LCAxMCwgMTMsIDEyLCAxNSwgMTIsIDEyLAorICAgICAgMTIsIDE2LCAxMiwgMTQsIDEzLCAxNSwgMTIsIDEyLCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNCwgMTMsCisgICAgICAxMiwgMTYsIDExLCAxMywgMTMsIDE2LCAxMiwgMTIsIDEzLCAxNiwgMTEsIDEzLCAxNCwgMTYsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTMsIDE0LCAxNiwgMTYsIDEzLCAxMiwgMTEsIDE2LCAxMiwgMTQsIDEwLCAxMywgMTEsIDEyLAorICAgICAgMTMsIDE2LCAxMywgMTUsIDEyLCAxNCwgMTIsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywgMTIsCisgICAgICAxMiwgMTYsIDEyLCAxNSwgMTIsIDE0LCAxMiwgMTIsIDEzLCAxNiwgMTMsIDE1LCAxMiwgMTQsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTUsIDEzLCAxMiwgMTQsIDE2LCAxMywgMTQsIDEzLCAxNiwgMTIsIDEyLAorICAgICAgMTMsIDE2LCAxMiwgMTQsIDEzLCAxNSwgMTIsIDEyLCAxNCwgMTYsIDEyLCAxMywgMTMsIDE0LCAxMSwgMTAsCisgICAgfSwKKyAgfSwKKyAgeworICAgIHsKKyAgICAgICAwLCAgNywgIDQsICA3LCAgNSwgIDcsICA2LCAgNiwgIDYsIDEwLCAgNywgIDgsICA4LCAgOSwgIDgsICA4LAorICAgICAgMTMsIDE0LCAxMSwgMTIsIDEyLCAxMiwgMTEsIDEwLCAgNSwgIDksICA2LCAgOCwgIDcsICA5LCAgNywgIDcsCisgICAgICAgOCwgMTEsICA4LCAgOSwgIDksIDEwLCAgOSwgIDgsIDEzLCAxNiwgMTIsIDEyLCAxMywgMTMsIDExLCAxMCwKKyAgICAgIDEwLCAxNCwgIDgsIDEwLCAxMSwgMTMsICA5LCAgOSwgMTIsIDE1LCAxMCwgMTEsIDEyLCAxMywgMTAsIDEwLAorICAgICAgMTYsIDE2LCAxMiwgMTMsIDE0LCAxNCwgMTEsIDEwLCAgNSwgMTAsICA3LCAgOSwgIDYsICA5LCAgOCwgIDgsCisgICAgICAgOCwgMTEsICA5LCAxMCwgIDksIDEwLCAgOSwgIDgsIDE0LCAxNiwgMTIsIDEyLCAxMywgMTMsIDExLCAxMCwKKyAgICAgICA4LCAxMiwgIDgsIDEwLCAgOSwgMTAsICA5LCAgOSwgMTAsIDEzLCAgOSwgMTEsIDEwLCAxMSwgIDksICA5LAorICAgICAgMTQsIDE2LCAxMiwgMTMsIDEzLCAxMywgMTEsIDEwLCAxMiwgMTYsIDEwLCAxMiwgMTIsIDEzLCAxMCwgMTAsCisgICAgICAxMywgMTYsIDExLCAxMiwgMTMsIDE0LCAxMSwgMTAsIDE2LCAxNiwgMTIsIDEzLCAxNCwgMTQsIDExLCAxMCwKKyAgICAgIDEwLCAxNCwgMTEsIDEzLCAgOSwgMTEsIDEwLCAxMCwgMTIsIDE2LCAxMiwgMTMsIDExLCAxMiwgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxMywgMTQsIDEzLCAxMywgMTIsIDEwLCAxMiwgMTYsIDEyLCAxMywgMTEsIDEzLCAxMSwgMTAsCisgICAgICAxMywgMTYsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTMsIDE0LCAxMywgMTQsIDEyLCAxMCwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxMywgMTQsIDEyLCAxMSwgMTYsIDE2LCAxMywgMTQsIDE0LCAxNSwgMTIsIDExLAorICAgICAgMTYsIDE2LCAxMywgMTQsIDE0LCAxNCwgMTEsIDEwLCAgMywgIDksICA1LCAgOCwgIDYsICA5LCAgNywgIDcsCisgICAgICAgOCwgMTEsICA4LCAxMCwgIDksIDEwLCAgOSwgIDgsIDE0LCAxNSwgMTIsIDEyLCAxMywgMTMsIDExLCAxMCwKKyAgICAgICA2LCAxMSwgIDYsICA5LCAgOCwgMTAsICA4LCAgOCwgIDksIDEyLCAgOSwgMTAsIDEwLCAxMSwgIDksICA5LAorICAgICAgMTQsIDE2LCAxMiwgMTMsIDEzLCAxMywgMTEsIDEwLCAxMCwgMTQsICA4LCAxMSwgMTIsIDEzLCAgOSwgIDksCisgICAgICAxMiwgMTYsIDEwLCAxMSwgMTIsIDEzLCAxMCwgMTAsIDE2LCAxNiwgMTIsIDEzLCAxNCwgMTQsIDExLCAxMCwKKyAgICAgICA2LCAxMSwgIDgsIDEwLCAgNywgMTAsICA4LCAgOCwgIDksIDEyLCAxMCwgMTEsICA5LCAxMSwgIDksICA5LAorICAgICAgMTQsIDE2LCAxMiwgMTMsIDEzLCAxMywgMTIsIDEwLCAgOSwgMTIsICA5LCAxMSwgIDksIDExLCAgOSwgIDksCisgICAgICAxMCwgMTMsIDEwLCAxMSwgMTAsIDEyLCAxMCwgIDksIDE0LCAxNiwgMTIsIDEzLCAxMywgMTMsIDExLCAxMCwKKyAgICAgIDEyLCAxNiwgMTAsIDEyLCAxMiwgMTQsIDEwLCAxMCwgMTMsIDE2LCAxMCwgMTIsIDEzLCAxNCwgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxMiwgMTMsIDE0LCAxNCwgMTEsIDEwLCAxMCwgMTUsIDExLCAxMywgIDksIDExLCAxMCwgMTAsCisgICAgICAxMiwgMTYsIDEyLCAxMywgMTEsIDEyLCAxMSwgMTAsIDE2LCAxNiwgMTQsIDE0LCAxMywgMTQsIDEyLCAxMCwKKyAgICAgIDEyLCAxNiwgMTIsIDEzLCAxMSwgMTMsIDExLCAxMCwgMTMsIDE2LCAxMiwgMTMsIDExLCAxMywgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxMywgMTQsIDEzLCAxMywgMTIsIDEwLCAxNCwgMTYsIDEzLCAxNCwgMTQsIDE0LCAxMSwgMTEsCisgICAgICAxNSwgMTYsIDEzLCAxNCwgMTMsIDE0LCAxMSwgMTAsIDE2LCAxNiwgMTMsIDEzLCAxMywgMTQsIDExLCAgOSwKKyAgICAgICA3LCAxMiwgIDgsIDExLCAgOSwgMTEsICA5LCAxMCwgMTAsIDE0LCAxMCwgMTIsIDExLCAxMiwgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxMywgMTMsIDE0LCAxNCwgMTIsIDExLCAgOSwgMTMsICA5LCAxMSwgMTAsIDEyLCAxMCwgMTAsCisgICAgICAxMSwgMTUsIDEwLCAxMiwgMTIsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTMsIDE0LCAxNCwgMTQsIDEyLCAxMSwKKyAgICAgIDExLCAxNiwgIDksIDExLCAxMiwgMTQsIDEwLCAxMCwgMTMsIDE2LCAxMCwgMTIsIDEzLCAxNCwgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTIsIDExLCAgOSwgMTMsIDEwLCAxMiwgIDksIDEyLCAxMCwgMTAsCisgICAgICAxMSwgMTUsIDExLCAxMywgMTEsIDEzLCAxMSwgMTEsIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMSwKKyAgICAgIDEwLCAxNCwgMTAsIDEyLCAxMSwgMTMsIDExLCAxMCwgMTIsIDE2LCAxMSwgMTMsIDEyLCAxMywgMTEsIDExLAorICAgICAgMTYsIDE2LCAxMywgMTQsIDE0LCAxNCwgMTIsIDExLCAxMywgMTYsIDExLCAxMywgMTMsIDE0LCAxMSwgMTEsCisgICAgICAxMywgMTYsIDExLCAxMywgMTMsIDE0LCAxMSwgMTEsIDE2LCAxNiwgMTIsIDEzLCAxNCwgMTUsIDEyLCAxMCwKKyAgICAgIDExLCAxNiwgMTIsIDE0LCAxMCwgMTIsIDExLCAxMCwgMTMsIDE2LCAxMywgMTQsIDExLCAxMywgMTEsIDExLAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNCwgMTMsIDExLCAxMywgMTYsIDEzLCAxNCwgMTIsIDEzLCAxMSwgMTEsCisgICAgICAxMywgMTYsIDEzLCAxNCwgMTIsIDEzLCAxMSwgMTEsIDE2LCAxNiwgMTQsIDE0LCAxMywgMTQsIDEyLCAxMSwKKyAgICAgIDE1LCAxNiwgMTMsIDE0LCAxNCwgMTYsIDEyLCAxMSwgMTQsIDE2LCAxMywgMTQsIDEzLCAxNCwgMTIsIDExLAorICAgICAgMTYsIDE2LCAxMiwgMTMsIDEzLCAxNCwgMTEsICA5LCAgOSwgMTQsIDEwLCAxMiwgMTAsIDEzLCAxMSwgMTEsCisgICAgICAxMiwgMTYsIDEyLCAxMywgMTIsIDE0LCAxMiwgMTEsIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMSwKKyAgICAgIDEwLCAxNiwgMTAsIDEzLCAxMiwgMTQsIDExLCAxMSwgMTMsIDE2LCAxMiwgMTMsIDEzLCAxNCwgMTIsIDExLAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDE1LCAxNSwgMTMsIDExLCAxMiwgMTYsICA5LCAxMiwgMTMsIDE0LCAxMCwgMTAsCisgICAgICAxNCwgMTYsIDExLCAxMiwgMTMsIDE1LCAxMSwgMTAsIDE2LCAxNiwgMTMsIDEzLCAxNSwgMTYsIDExLCAxMCwKKyAgICAgIDEwLCAxNiwgMTEsIDEzLCAxMSwgMTMsIDExLCAxMSwgMTMsIDE2LCAxMiwgMTQsIDEyLCAxNCwgMTIsIDExLAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDExLCAxMSwgMTYsIDExLCAxMywgMTIsIDE0LCAxMSwgMTEsCisgICAgICAxMywgMTYsIDEyLCAxNCwgMTMsIDE0LCAxMiwgMTEsIDE2LCAxNiwgMTQsIDE0LCAxNCwgMTUsIDEzLCAxMSwKKyAgICAgIDEzLCAxNiwgMTEsIDEzLCAxMywgMTQsIDExLCAxMCwgMTQsIDE2LCAxMSwgMTMsIDEzLCAxNCwgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxMiwgMTMsIDE0LCAxNSwgMTEsICA5LCAxMiwgMTYsIDEyLCAxNCwgMTAsIDEzLCAxMSwgMTAsCisgICAgICAxNCwgMTYsIDEzLCAxNCwgMTEsIDEzLCAxMSwgMTAsIDE2LCAxNiwgMTQsIDE1LCAxMywgMTQsIDEyLCAxMCwKKyAgICAgIDEzLCAxNiwgMTMsIDE0LCAxMSwgMTMsIDExLCAxMCwgMTQsIDE2LCAxMywgMTQsIDEyLCAxMywgMTEsIDEwLAorICAgICAgMTYsIDE2LCAxNCwgMTQsIDEzLCAxMywgMTEsIDEwLCAxNCwgMTYsIDEyLCAxMywgMTMsIDE0LCAxMSwgIDksCisgICAgICAxNCwgMTYsIDEyLCAxMywgMTIsIDEzLCAxMCwgIDksIDE0LCAxNiwgMTEsIDExLCAxMiwgMTIsICA5LCAgNywKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgNywgIDMsICA4LCAgNSwgIDgsICA3LCAgOSwgIDUsIDEwLCAgNywgMTAsICA4LCAxMSwgMTAsIDEwLAorICAgICAgMTQsIDE2LCAxNCwgMTUsIDE0LCAxNiwgMTQsIDE0LCAgNCwgMTAsICA2LCAxMCwgIDgsIDExLCAgOSwgMTAsCisgICAgICAgOCwgMTIsICA5LCAxMSwgMTAsIDEyLCAxMSwgMTEsIDE1LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxNCwKKyAgICAgIDEwLCAxNiwgMTAsIDEzLCAxMywgMTYsIDEyLCAxMywgMTMsIDE2LCAxMiwgMTQsIDE0LCAxNiwgMTMsIDEzLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE1LCAgNCwgMTAsICA3LCAxMCwgIDcsIDEwLCAgOSwgMTAsCisgICAgICAgOCwgMTIsICA5LCAxMiwgMTAsIDEyLCAxMSwgMTIsIDE0LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxNCwKKyAgICAgICA4LCAxMiwgIDksIDEyLCAxMCwgMTMsIDExLCAxMiwgMTAsIDE0LCAxMSwgMTMsIDExLCAxNCwgMTIsIDEzLAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE1LCAxMiwgMTYsIDEyLCAxNCwgMTQsIDE2LCAxMywgMTQsCisgICAgICAxNCwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNCwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDExLCAxNiwgMTIsIDE2LCAxMSwgMTQsIDEzLCAxMywgMTMsIDE2LCAxMywgMTYsIDEzLCAxNSwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMywgMTQsCisgICAgICAxNCwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNCwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgMiwgIDksICA1LCAgOSwgIDYsIDEwLCAgOCwgMTAsCisgICAgICAgNywgMTEsICA4LCAxMSwgIDksIDEyLCAxMCwgMTEsIDE0LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxNCwKKyAgICAgICA1LCAxMSwgIDYsIDEwLCAgOSwgMTIsIDEwLCAxMSwgIDksIDEzLCAgOSwgMTIsIDExLCAxMywgMTEsIDEyLAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE0LCAxMCwgMTYsICA5LCAxMywgMTMsIDE2LCAxMiwgMTMsCisgICAgICAxMywgMTYsIDEyLCAxNCwgMTQsIDE2LCAxMywgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgICA1LCAxMSwgIDgsIDExLCAgNywgMTEsIDEwLCAxMSwgIDksIDEzLCAxMCwgMTMsIDEwLCAxMywgMTEsIDEyLAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE0LCAgOCwgMTMsICA5LCAxMiwgMTAsIDEzLCAxMSwgMTIsCisgICAgICAxMCwgMTQsIDEwLCAxMywgMTEsIDE0LCAxMiwgMTIsIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxNCwKKyAgICAgIDEyLCAxNiwgMTIsIDE0LCAxNCwgMTYsIDEzLCAxNCwgMTQsIDE2LCAxMiwgMTYsIDE1LCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxMSwgMTYsIDEyLCAxNiwgMTAsIDE0LCAxMiwgMTMsCisgICAgICAxMywgMTYsIDE0LCAxNiwgMTMsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwKKyAgICAgIDEzLCAxNiwgMTMsIDE2LCAxMywgMTYsIDEzLCAxNCwgMTQsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwKKyAgICAgICA1LCAxMywgIDcsIDEyLCAgOSwgMTMsIDExLCAxMiwgMTAsIDE0LCAxMCwgMTMsIDExLCAxMywgMTIsIDEzLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAgNywgMTQsICA4LCAxMiwgMTEsIDE0LCAxMSwgMTIsCisgICAgICAxMSwgMTYsIDExLCAxMywgMTMsIDE2LCAxMywgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDExLCAxNiwgMTAsIDE0LCAxNCwgMTYsIDEyLCAxMywgMTMsIDE2LCAxMiwgMTUsIDE2LCAxNiwgMTQsIDE0LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgOCwgMTQsIDEwLCAxMywgIDksIDEzLCAxMSwgMTIsCisgICAgICAxMSwgMTYsIDEyLCAxNCwgMTIsIDE0LCAxMywgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNiwgMTEsIDE0LCAxMiwgMTQsIDEyLCAxMywgMTEsIDE2LCAxMiwgMTQsIDEyLCAxNSwgMTMsIDEzLAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTUsIDE2LCAxNCwgMTQsCisgICAgICAxMywgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNCwgMTQsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE0LCAxNiwKKyAgICAgIDExLCAxNiwgMTMsIDE2LCAxMCwgMTQsIDEyLCAxMywgMTQsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTQsIDE0LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNCwgMTUsCisgICAgICAxMywgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNCwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTUsIDE2LAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE0LCAgOCwgMTYsIDEwLCAxNCwgMTEsIDE2LCAxMiwgMTMsCisgICAgICAxMiwgMTYsIDEyLCAxNCwgMTMsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgIDEwLCAxNiwgMTAsIDE0LCAxMiwgMTYsIDEyLCAxMywgMTMsIDE2LCAxMiwgMTUsIDE0LCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxMSwgMTYsIDEwLCAxMywgMTMsIDE2LCAxMiwgMTMsCisgICAgICAxNCwgMTYsIDEyLCAxNCwgMTUsIDE2LCAxMywgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNCwKKyAgICAgIDEwLCAxNiwgMTEsIDE0LCAxMSwgMTYsIDEyLCAxMywgMTMsIDE2LCAxMywgMTYsIDEzLCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxMSwgMTYsIDEyLCAxNCwgMTMsIDE2LCAxMywgMTQsCisgICAgICAxMywgMTYsIDEzLCAxNiwgMTQsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwKKyAgICAgIDEzLCAxNiwgMTIsIDE0LCAxNCwgMTYsIDEzLCAxMywgMTMsIDE2LCAxMiwgMTUsIDE0LCAxNiwgMTMsIDEzLAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDEzLCAxMSwgMTYsIDEyLCAxNiwgMTEsIDE1LCAxMiwgMTMsCisgICAgICAxNCwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNCwKKyAgICAgIDEyLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDEzLCAxNCwgMTMsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE0LCAxNCwgMTYsIDEzLCAxNiwgMTQsIDE2LCAxMywgMTMsCisgICAgICAxMywgMTYsIDEzLCAxNiwgMTQsIDE2LCAxMywgMTMsIDE1LCAxNiwgMTMsIDE0LCAxMywgMTUsIDEyLCAxMiwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDAsICA3LCAgNCwgIDYsICA0LCAgNywgIDYsICA3LCAgNiwgIDksICA3LCAgOCwgIDcsICA5LCAgOCwgIDgsCisgICAgICAxMywgMTQsIDEyLCAxMiwgMTIsIDEzLCAxMSwgMTEsICA1LCAgOSwgIDUsICA4LCAgNywgIDksICA3LCAgOCwKKyAgICAgICA4LCAxMSwgIDgsIDEwLCAgOSwgMTAsICA5LCAgOSwgMTMsIDE1LCAxMiwgMTMsIDEyLCAxMywgMTEsIDExLAorICAgICAgIDksIDE0LCAgOCwgMTEsIDExLCAxMywgMTAsIDEwLCAxMSwgMTUsIDEwLCAxMiwgMTIsIDEzLCAxMCwgMTEsCisgICAgICAxNCwgMTYsIDEyLCAxMywgMTQsIDE0LCAxMiwgMTEsICA1LCAgOSwgIDcsICA5LCAgNiwgIDksICA4LCAgOCwKKyAgICAgICA4LCAxMSwgIDgsIDEwLCAgOCwgMTAsICA5LCAgOSwgMTMsIDE2LCAxMiwgMTMsIDEzLCAxMywgMTEsIDExLAorICAgICAgIDcsIDExLCAgOCwgMTAsICA5LCAxMSwgIDksICA5LCAgOSwgMTMsICA5LCAxMSwgMTAsIDExLCAxMCwgMTAsCisgICAgICAxNCwgMTYsIDEyLCAxMywgMTMsIDEzLCAxMiwgMTEsIDExLCAxNiwgMTAsIDEyLCAxMiwgMTQsIDExLCAxMSwKKyAgICAgIDEzLCAxNiwgMTEsIDEzLCAxMywgMTQsIDExLCAxMSwgMTYsIDE2LCAxMywgMTQsIDE0LCAxNSwgMTIsIDExLAorICAgICAgMTAsIDE1LCAxMSwgMTMsICA5LCAxMiwgMTAsIDEwLCAxMiwgMTYsIDEyLCAxMywgMTEsIDEyLCAxMSwgMTEsCisgICAgICAxNSwgMTYsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTEsIDEyLCAxNiwgMTIsIDE0LCAxMSwgMTMsIDExLCAxMSwKKyAgICAgIDEzLCAxNiwgMTIsIDE0LCAxMiwgMTMsIDEyLCAxMSwgMTYsIDE2LCAxMywgMTQsIDE0LCAxNCwgMTIsIDExLAorICAgICAgMTQsIDE2LCAxMywgMTQsIDE0LCAxNSwgMTIsIDEyLCAxNiwgMTYsIDEzLCAxNCwgMTQsIDE2LCAxMiwgMTIsCisgICAgICAxNiwgMTYsIDE0LCAxNCwgMTQsIDE1LCAxMiwgMTEsICAzLCAgOSwgIDUsICA4LCAgNiwgIDksICA3LCAgOCwKKyAgICAgICA3LCAxMSwgIDgsIDEwLCAgOSwgMTAsICA5LCAgOSwgMTMsIDE0LCAxMiwgMTMsIDEzLCAxMywgMTIsIDExLAorICAgICAgIDYsIDExLCAgNiwgIDksICA4LCAxMCwgIDgsICA5LCAgOSwgMTIsICA4LCAxMCwgMTAsIDExLCAgOSwgMTAsCisgICAgICAxNCwgMTYsIDEyLCAxMywgMTMsIDE0LCAxMiwgMTEsICA5LCAxNCwgIDgsIDExLCAxMSwgMTMsIDEwLCAxMCwKKyAgICAgIDEyLCAxNiwgMTAsIDEyLCAxMiwgMTQsIDExLCAxMSwgMTYsIDE2LCAxMiwgMTMsIDE0LCAxNSwgMTIsIDExLAorICAgICAgIDYsIDExLCAgOCwgMTAsICA3LCAxMCwgIDgsICA5LCAgOSwgMTIsICA5LCAxMSwgIDksIDExLCAxMCwgMTAsCisgICAgICAxNCwgMTYsIDEzLCAxMywgMTMsIDE0LCAxMiwgMTEsICA4LCAxMiwgIDksIDExLCAgOSwgMTEsICA5LCAxMCwKKyAgICAgIDEwLCAxMywgIDksIDExLCAxMCwgMTIsIDEwLCAxMCwgMTQsIDE2LCAxMiwgMTMsIDEzLCAxNCwgMTIsIDExLAorICAgICAgMTIsIDE2LCAxMCwgMTIsIDEyLCAxNCwgMTEsIDExLCAxMiwgMTYsIDEwLCAxMiwgMTMsIDE0LCAxMSwgMTEsCisgICAgICAxNSwgMTYsIDEyLCAxMywgMTQsIDE0LCAxMSwgMTEsIDEwLCAxNSwgMTEsIDEzLCAgOSwgMTIsIDEwLCAxMCwKKyAgICAgIDEyLCAxNiwgMTIsIDE0LCAxMSwgMTMsIDExLCAxMSwgMTYsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTIsIDExLAorICAgICAgMTIsIDE2LCAxMiwgMTQsIDExLCAxMywgMTEsIDExLCAxMywgMTYsIDEyLCAxNCwgMTEsIDEzLCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTEsIDE0LCAxNiwgMTMsIDE0LCAxNCwgMTUsIDEyLCAxMSwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxMywgMTUsIDEyLCAxMSwgMTYsIDE2LCAxMywgMTQsIDEzLCAxNCwgMTEsIDEwLAorICAgICAgIDYsIDEzLCAgOCwgMTEsICA5LCAxMiwgMTAsIDEwLCAxMCwgMTQsIDEwLCAxMiwgMTEsIDEzLCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDEzLCAxNCwgMTQsIDE0LCAxMywgMTIsICA4LCAxNCwgIDgsIDEyLCAxMCwgMTMsIDEwLCAxMSwKKyAgICAgIDExLCAxNSwgMTAsIDEyLCAxMiwgMTMsIDExLCAxMSwgMTYsIDE2LCAxNCwgMTQsIDE1LCAxNiwgMTMsIDEyLAorICAgICAgMTEsIDE2LCAgOSwgMTIsIDEyLCAxNCwgMTEsIDExLCAxMywgMTYsIDExLCAxMywgMTMsIDE2LCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDEzLCAxNCwgMTYsIDE2LCAxMywgMTIsICA4LCAxNCwgMTAsIDEyLCAgOSwgMTIsIDEwLCAxMSwKKyAgICAgIDExLCAxNSwgMTEsIDEzLCAxMSwgMTMsIDExLCAxMSwgMTYsIDE2LCAxNCwgMTUsIDE0LCAxNSwgMTMsIDEyLAorICAgICAgMTAsIDE1LCAxMCwgMTMsIDExLCAxMywgMTEsIDExLCAxMSwgMTUsIDExLCAxMywgMTIsIDEzLCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDEzLCAxNSwgMTQsIDE1LCAxMywgMTIsIDEyLCAxNiwgMTEsIDEzLCAxMywgMTUsIDExLCAxMSwKKyAgICAgIDEzLCAxNiwgMTEsIDEzLCAxMywgMTUsIDExLCAxMSwgMTYsIDE2LCAxMiwgMTQsIDE0LCAxNiwgMTIsIDExLAorICAgICAgMTEsIDE2LCAxMiwgMTQsIDEwLCAxMywgMTEsIDExLCAxMywgMTYsIDEzLCAxNSwgMTIsIDE0LCAxMiwgMTIsCisgICAgICAxNiwgMTYsIDE1LCAxNiwgMTQsIDE1LCAxMywgMTIsIDEyLCAxNiwgMTMsIDE0LCAxMiwgMTQsIDEyLCAxMiwKKyAgICAgIDEzLCAxNiwgMTMsIDE0LCAxMiwgMTQsIDEyLCAxMiwgMTYsIDE2LCAxNCwgMTUsIDEzLCAxNCwgMTIsIDEyLAorICAgICAgMTUsIDE2LCAxMywgMTUsIDE0LCAxNiwgMTIsIDEyLCAxNCwgMTYsIDEzLCAxNCwgMTMsIDE1LCAxMiwgMTIsCisgICAgICAxNSwgMTYsIDEyLCAxMywgMTMsIDE0LCAxMSwgMTAsICA5LCAxNSwgMTAsIDEzLCAxMSwgMTQsIDExLCAxMiwKKyAgICAgIDEyLCAxNiwgMTIsIDE0LCAxMiwgMTQsIDEyLCAxMiwgMTYsIDE2LCAxNCwgMTQsIDE0LCAxNSwgMTMsIDEyLAorICAgICAgMTAsIDE2LCAxMCwgMTMsIDEyLCAxNCwgMTIsIDEyLCAxMywgMTYsIDEyLCAxNCwgMTMsIDE1LCAxMiwgMTIsCisgICAgICAxNiwgMTYsIDE0LCAxNCwgMTUsIDE2LCAxMywgMTIsIDExLCAxNiwgIDksIDEyLCAxMywgMTUsIDExLCAxMSwKKyAgICAgIDE0LCAxNiwgMTEsIDEzLCAxNCwgMTYsIDExLCAxMSwgMTYsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTIsIDExLAorICAgICAgMTAsIDE2LCAxMSwgMTQsIDExLCAxNCwgMTIsIDEyLCAxMywgMTYsIDEzLCAxNCwgMTIsIDE0LCAxMiwgMTIsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTUsIDE1LCAxMywgMTIsIDExLCAxNiwgMTIsIDE0LCAxMiwgMTUsIDEyLCAxMiwKKyAgICAgIDEzLCAxNiwgMTIsIDE0LCAxMywgMTUsIDEyLCAxMiwgMTYsIDE2LCAxNCwgMTUsIDE1LCAxNiwgMTMsIDEyLAorICAgICAgMTIsIDE2LCAxMSwgMTMsIDEzLCAxNSwgMTEsIDExLCAxMywgMTYsIDExLCAxMywgMTMsIDE1LCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDEyLCAxMywgMTQsIDE2LCAxMiwgMTAsIDExLCAxNiwgMTIsIDE0LCAxMCwgMTMsIDExLCAxMSwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxMiwgMTQsIDExLCAxMSwgMTYsIDE2LCAxNSwgMTYsIDE0LCAxNCwgMTIsIDExLAorICAgICAgMTIsIDE2LCAxMywgMTQsIDExLCAxNCwgMTEsIDExLCAxMywgMTYsIDEzLCAxNCwgMTIsIDE0LCAxMSwgMTEsCisgICAgICAxNiwgMTYsIDE0LCAxNSwgMTMsIDE0LCAxMiwgMTEsIDE0LCAxNiwgMTIsIDE0LCAxMywgMTQsIDExLCAxMCwKKyAgICAgIDEzLCAxNiwgMTIsIDEzLCAxMiwgMTQsIDExLCAxMCwgMTQsIDE2LCAxMSwgMTIsIDEyLCAxMiwgMTAsICA4LAorICAgIH0sCisgICAgeworICAgICAgIDAsICA4LCAgNCwgIDksICA1LCAgOSwgIDgsIDEwLCAgNiwgMTEsICA4LCAxMSwgIDksIDEyLCAxMSwgMTIsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA0LCAxMSwgIDYsIDExLCAgOSwgMTIsIDEwLCAxMiwKKyAgICAgICA5LCAxMywgMTAsIDEzLCAxMSwgMTYsIDEyLCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTEsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA0LCAxMSwgIDgsIDEyLCAgNywgMTIsIDEwLCAxMiwKKyAgICAgICA4LCAxMywgMTAsIDEzLCAxMCwgMTMsIDEyLCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDgsIDEzLCAxMCwgMTQsIDExLCAxNiwgMTIsIDE0LCAxMSwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxMywgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTIsIDE2LCAxNCwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICAxLCAxMCwgIDUsIDEwLCAgNywgMTEsICA5LCAxMSwKKyAgICAgICA4LCAxMiwgIDksIDEyLCAxMCwgMTMsIDEyLCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDUsIDEyLCAgNywgMTIsIDEwLCAxMywgMTEsIDEyLCAgOSwgMTYsIDEwLCAxMywgMTIsIDE2LCAxMywgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTAsIDE2LCAxNiwgMTYsIDE0LCAxNiwKKyAgICAgIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDYsIDEyLCAgOSwgMTMsICA4LCAxMiwgMTEsIDEzLCAxMCwgMTYsIDExLCAxNiwgMTEsIDE2LCAxMywgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA5LCAxNiwgMTAsIDE0LCAxMSwgMTYsIDEyLCAxNiwKKyAgICAgIDEwLCAxNiwgMTEsIDE2LCAxMiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTQsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTQsIDE2LCAxMSwgMTYsIDE0LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDYsIDE2LCAgOSwgMTMsIDEwLCAxNiwgMTIsIDE0LCAxMSwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxMywgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA4LCAxNiwgIDksIDE0LCAxMiwgMTYsIDEzLCAxNiwKKyAgICAgIDEyLCAxNiwgMTIsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTIsIDE2LCAxMCwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA4LCAxNiwgMTEsIDE2LCAxMCwgMTYsIDEyLCAxNiwKKyAgICAgIDEyLCAxNiwgMTMsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxMiwgMTYsIDEzLCAxNiwgMTQsIDE2LCAxMSwgMTYsIDEzLCAxNiwgMTMsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTIsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA4LCAxNiwgMTEsIDE2LCAxMiwgMTYsIDEzLCAxNiwKKyAgICAgIDEzLCAxNiwgMTMsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxMSwgMTYsIDEzLCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTAsIDE2LCAxNiwgMTYsIDEzLCAxNiwKKyAgICAgIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTMsIDE2LCAxNCwgMTYsIDE2LCAxNiwKKyAgICAgIDEzLCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTMsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTMsIDE2LCAxMSwgMTYsIDEzLCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTMsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE1LAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAgMCwgIDcsICAzLCAgNywgIDQsICA3LCAgNiwgIDcsICA2LCAgOSwgIDcsICA5LCAgNywgIDksICA4LCAgOSwKKyAgICAgIDEzLCAxNCwgMTIsIDEzLCAxMywgMTMsIDEyLCAxMiwgIDQsICA5LCAgNSwgIDksICA3LCAgOSwgIDgsICA5LAorICAgICAgIDcsIDExLCAgOCwgMTAsICA5LCAxMSwgIDksIDEwLCAxMywgMTYsIDEyLCAxNCwgMTMsIDE0LCAxMiwgMTIsCisgICAgICAgOSwgMTQsICA4LCAxMiwgMTIsIDE0LCAxMCwgMTEsIDExLCAxNiwgMTAsIDEzLCAxMywgMTQsIDExLCAxMiwKKyAgICAgIDE1LCAxNiwgMTMsIDE0LCAxNCwgMTYsIDEyLCAxMiwgIDUsIDEwLCAgNywgIDksICA2LCAgOSwgIDgsICA5LAorICAgICAgIDgsIDExLCAgOCwgMTEsICA4LCAxMCwgIDksIDEwLCAxNCwgMTYsIDEyLCAxNCwgMTMsIDE0LCAxMiwgMTIsCisgICAgICAgNywgMTIsICA4LCAxMSwgIDksIDExLCAgOSwgMTAsICA5LCAxMywgIDksIDEyLCAxMCwgMTIsIDEwLCAxMSwKKyAgICAgIDE0LCAxNiwgMTIsIDE0LCAxMywgMTQsIDEyLCAxMiwgMTIsIDE2LCAxMSwgMTMsIDEzLCAxNSwgMTEsIDEyLAorICAgICAgMTMsIDE2LCAxMSwgMTQsIDEzLCAxNSwgMTIsIDEyLCAxNSwgMTYsIDEzLCAxNSwgMTQsIDE2LCAxMywgMTMsCisgICAgICAxMCwgMTUsIDEyLCAxNCwgIDksIDEzLCAxMSwgMTIsIDEyLCAxNiwgMTIsIDE0LCAxMSwgMTMsIDEyLCAxMiwKKyAgICAgIDE1LCAxNiwgMTMsIDE1LCAxNCwgMTUsIDEzLCAxMywgMTIsIDE2LCAxMiwgMTQsIDEyLCAxNCwgMTIsIDEyLAorICAgICAgMTMsIDE2LCAxMywgMTQsIDEyLCAxNCwgMTIsIDEyLCAxNiwgMTYsIDE0LCAxNSwgMTQsIDE2LCAxMywgMTMsCisgICAgICAxNSwgMTYsIDEzLCAxNSwgMTQsIDE2LCAxMiwgMTMsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEzLCAxMywKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDEzLCAxMywgIDMsICA5LCAgNSwgIDksICA2LCAgOSwgIDgsICA5LAorICAgICAgIDcsIDExLCAgOCwgMTAsICA5LCAxMSwgIDksIDEwLCAxNCwgMTUsIDEzLCAxNCwgMTMsIDE0LCAxMiwgMTIsCisgICAgICAgNSwgMTEsICA2LCAxMCwgIDgsIDExLCAgOSwgMTAsICA5LCAxMiwgIDksIDExLCAxMCwgMTIsIDEwLCAxMSwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxNCwgMTUsIDEzLCAxMywgIDksIDE1LCAgOCwgMTIsIDEyLCAxNCwgMTAsIDExLAorICAgICAgMTIsIDE2LCAxMCwgMTMsIDEzLCAxNSwgMTEsIDEyLCAxNSwgMTYsIDEzLCAxNCwgMTQsIDE2LCAxMywgMTMsCisgICAgICAgNiwgMTEsICA4LCAxMSwgIDcsIDEwLCAgOSwgMTAsICA5LCAxMywgMTAsIDEyLCAgOSwgMTIsIDEwLCAxMSwKKyAgICAgIDE0LCAxNiwgMTMsIDE0LCAxNCwgMTQsIDEzLCAxMywgIDgsIDEzLCAgOSwgMTIsICA5LCAxMiwgMTAsIDExLAorICAgICAgIDksIDEzLCAgOSwgMTIsIDEwLCAxMiwgMTAsIDExLCAxNCwgMTYsIDEyLCAxNCwgMTMsIDE0LCAxMiwgMTIsCisgICAgICAxMiwgMTYsIDExLCAxMywgMTMsIDE1LCAxMSwgMTIsIDEyLCAxNiwgMTEsIDEzLCAxMywgMTUsIDExLCAxMiwKKyAgICAgIDE0LCAxNiwgMTIsIDE0LCAxNCwgMTUsIDEyLCAxMiwgMTAsIDE1LCAxMSwgMTQsICA5LCAxMywgMTEsIDEyLAorICAgICAgMTIsIDE2LCAxMiwgMTQsIDExLCAxNCwgMTIsIDEyLCAxNiwgMTYsIDE0LCAxNiwgMTQsIDE1LCAxMywgMTMsCisgICAgICAxMiwgMTYsIDEyLCAxNCwgMTEsIDE0LCAxMiwgMTIsIDEyLCAxNiwgMTMsIDE0LCAxMSwgMTQsIDEyLCAxMiwKKyAgICAgIDE1LCAxNiwgMTQsIDE1LCAxMywgMTUsIDEyLCAxMywgMTQsIDE2LCAxMywgMTUsIDE0LCAxNiwgMTMsIDEzLAorICAgICAgMTQsIDE2LCAxMywgMTUsIDE0LCAxNiwgMTIsIDEzLCAxNSwgMTYsIDEzLCAxNSwgMTMsIDE1LCAxMiwgMTIsCisgICAgICAgNiwgMTMsICA4LCAxMiwgIDksIDEyLCAxMCwgMTEsIDEwLCAxNCwgMTEsIDEzLCAxMSwgMTMsIDEyLCAxMiwKKyAgICAgIDE1LCAxNiwgMTQsIDE1LCAxNSwgMTUsIDE0LCAxMywgIDgsIDE0LCAgOSwgMTIsIDExLCAxMywgMTEsIDEyLAorICAgICAgMTEsIDE1LCAxMSwgMTMsIDEyLCAxNCwgMTIsIDEyLCAxNiwgMTYsIDE0LCAxNSwgMTUsIDE2LCAxNCwgMTQsCisgICAgICAxMCwgMTYsICA5LCAxMywgMTIsIDE1LCAxMSwgMTIsIDEzLCAxNiwgMTEsIDE0LCAxMywgMTYsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTQsIDE1LCAxNiwgMTYsIDEzLCAxMywgIDgsIDE0LCAxMCwgMTMsICA5LCAxMywgMTEsIDEyLAorICAgICAgMTEsIDE1LCAxMiwgMTQsIDExLCAxNCwgMTIsIDEyLCAxNiwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxNCwgMTQsCisgICAgICAxMCwgMTUsIDEwLCAxMywgMTEsIDE0LCAxMSwgMTIsIDExLCAxNSwgMTEsIDE0LCAxMiwgMTQsIDEyLCAxMiwKKyAgICAgIDE1LCAxNiwgMTQsIDE1LCAxNCwgMTYsIDEzLCAxMywgMTIsIDE2LCAxMSwgMTQsIDEzLCAxNiwgMTIsIDEyLAorICAgICAgMTIsIDE2LCAxMSwgMTQsIDEzLCAxNSwgMTIsIDEyLCAxNSwgMTYsIDEyLCAxNCwgMTUsIDE2LCAxMywgMTMsCisgICAgICAxMSwgMTYsIDEyLCAxNCwgMTAsIDE0LCAxMSwgMTIsIDEzLCAxNiwgMTMsIDE2LCAxMiwgMTQsIDEyLCAxMywKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE0LCAxMywgMTIsIDE2LCAxMywgMTUsIDEyLCAxNCwgMTIsIDEzLAorICAgICAgMTMsIDE2LCAxMywgMTUsIDEyLCAxNCwgMTIsIDEzLCAxNiwgMTYsIDE0LCAxNiwgMTMsIDE1LCAxMywgMTMsCisgICAgICAxNSwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxMywgMTMsIDE0LCAxNiwgMTMsIDE1LCAxMywgMTYsIDEzLCAxMywKKyAgICAgIDE0LCAxNiwgMTIsIDE0LCAxMywgMTQsIDEyLCAxMiwgIDksIDE2LCAxMSwgMTQsIDExLCAxNSwgMTIsIDEzLAorICAgICAgMTMsIDE2LCAxMiwgMTQsIDEyLCAxNSwgMTMsIDEzLCAxNiwgMTYsIDE0LCAxNSwgMTUsIDE1LCAxNCwgMTMsCisgICAgICAxMSwgMTYsIDExLCAxNCwgMTIsIDE2LCAxMiwgMTMsIDEzLCAxNiwgMTIsIDE0LCAxMywgMTYsIDEzLCAxMywKKyAgICAgIDE2LCAxNiwgMTQsIDE1LCAxNiwgMTYsIDE0LCAxMywgMTEsIDE2LCAxMCwgMTMsIDEzLCAxNiwgMTEsIDEyLAorICAgICAgMTQsIDE2LCAxMSwgMTQsIDE0LCAxNiwgMTIsIDEyLCAxNiwgMTYsIDE0LCAxNCwgMTYsIDE2LCAxMywgMTIsCisgICAgICAxMSwgMTYsIDEyLCAxNCwgMTEsIDE1LCAxMiwgMTMsIDEzLCAxNiwgMTMsIDE1LCAxMywgMTYsIDEzLCAxMywKKyAgICAgIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTYsIDE0LCAxMywgMTEsIDE2LCAxMiwgMTUsIDEyLCAxNiwgMTIsIDEzLAorICAgICAgMTMsIDE2LCAxMywgMTUsIDEzLCAxNiwgMTMsIDEzLCAxNiwgMTYsIDE1LCAxNiwgMTUsIDE2LCAxNCwgMTMsCisgICAgICAxMiwgMTYsIDExLCAxNCwgMTMsIDE2LCAxMiwgMTIsIDEzLCAxNiwgMTEsIDE0LCAxMywgMTYsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTMsIDE0LCAxNSwgMTYsIDEyLCAxMiwgMTEsIDE2LCAxMiwgMTQsIDEwLCAxNCwgMTEsIDEyLAorICAgICAgMTQsIDE2LCAxMywgMTUsIDEyLCAxNSwgMTIsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE1LCAxMywgMTIsCisgICAgICAxMiwgMTYsIDEzLCAxNSwgMTIsIDE0LCAxMiwgMTIsIDEzLCAxNiwgMTMsIDE1LCAxMiwgMTQsIDEyLCAxMiwKKyAgICAgIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTUsIDEyLCAxMiwgMTQsIDE2LCAxMywgMTUsIDEzLCAxNiwgMTEsIDEyLAorICAgICAgMTMsIDE2LCAxMiwgMTQsIDEzLCAxNSwgMTEsIDExLCAxNCwgMTYsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTAsCisgICAgfSwKKyAgICB7CisgICAgICAgMCwgIDgsICA0LCAgOSwgIDUsIDEwLCAgOSwgMTEsICA1LCAxMSwgIDksIDEyLCAgOSwgMTMsIDEyLCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDQsIDExLCAgNiwgMTIsICA5LCAxMywgMTEsIDEzLAorICAgICAgIDksIDE2LCAxMCwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDQsIDEyLCAgOCwgMTMsICA3LCAxMiwgMTEsIDE2LAorICAgICAgIDgsIDE2LCAxMSwgMTYsIDExLCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAgOCwgMTYsIDEwLCAxNiwgMTEsIDE2LCAxMywgMTYsIDExLCAxNiwgMTIsIDE2LCAxMywgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDEsIDEwLCAgNiwgMTEsICA3LCAxMiwgMTAsIDEzLAorICAgICAgIDcsIDEyLCAxMCwgMTMsIDEwLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAgNSwgMTMsICA3LCAxMiwgMTAsIDE2LCAxMiwgMTYsIDEwLCAxNiwgMTEsIDE2LCAxMiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAgNSwgMTMsICA5LCAxNiwgIDgsIDE2LCAxMiwgMTYsICA5LCAxNiwgMTIsIDE2LCAxMSwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDksIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTMsIDE2LAorICAgICAgMTAsIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAgNiwgMTYsICA5LCAxNiwgMTAsIDE2LCAxMywgMTYsIDExLCAxNiwgMTIsIDE2LCAxMywgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDgsIDE2LCAgOSwgMTYsIDEyLCAxNiwgMTMsIDE2LAorICAgICAgMTIsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMSwgMTYsIDEwLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDgsIDE2LCAxMSwgMTYsIDExLCAxNiwgMTMsIDE2LAorICAgICAgMTIsIDE2LCAxMywgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMCwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDcsIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTYsIDE2LAorICAgICAgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMCwgMTYsIDExLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxMCwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMCwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMywgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxMywgMTYsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgfSwKKyAgfSwKKyAgeworICAgIHsKKyAgICAgICAwLCAgNywgIDQsICA4LCAgNCwgIDgsICA3LCAgOCwgIDYsIDEwLCAgNywgMTAsICA4LCAxMCwgIDksIDEwLAorICAgICAgMTMsIDE2LCAxMywgMTUsIDEzLCAxNSwgMTMsIDE0LCAgNCwgMTAsICA1LCAxMCwgIDcsIDEwLCAgOSwgMTAsCisgICAgICAgNywgMTIsICA4LCAxMSwgIDksIDEyLCAxMCwgMTEsIDEzLCAxNiwgMTMsIDE1LCAxMywgMTYsIDEzLCAxNCwKKyAgICAgICA5LCAxNiwgIDksIDEzLCAxMiwgMTYsIDExLCAxMywgMTEsIDE2LCAxMSwgMTQsIDEzLCAxNiwgMTIsIDE0LAorICAgICAgMTUsIDE2LCAxNCwgMTYsIDE1LCAxNiwgMTQsIDE0LCAgNCwgMTAsICA3LCAxMCwgIDYsIDEwLCAgOSwgMTAsCisgICAgICAgOCwgMTIsICA5LCAxMiwgIDksIDExLCAxMCwgMTIsIDEzLCAxNiwgMTMsIDE2LCAxNCwgMTYsIDEzLCAxNCwKKyAgICAgICA3LCAxMiwgIDgsIDEyLCAgOSwgMTIsIDEwLCAxMiwgIDksIDEzLCAxMCwgMTMsIDEwLCAxMywgMTEsIDEyLAorICAgICAgMTQsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTMsIDE0LCAxMiwgMTYsIDExLCAxNCwgMTMsIDE2LCAxMiwgMTQsCisgICAgICAxMywgMTYsIDEyLCAxNiwgMTQsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxNCwKKyAgICAgIDEwLCAxNiwgMTIsIDE1LCAxMCwgMTQsIDEyLCAxMywgMTIsIDE2LCAxMywgMTYsIDEyLCAxNCwgMTMsIDE0LAorICAgICAgMTUsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTQsIDE0LCAxMiwgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMywgMTQsCisgICAgICAxMywgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxNSwKKyAgICAgIDE1LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDEzLCAxNSwgMTYsIDE2LCAxNCwgMTYsIDE1LCAxNiwgMTQsIDE1LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAgMiwgIDksICA1LCAxMCwgIDYsIDEwLCAgOCwgMTAsCisgICAgICAgNywgMTEsICA4LCAxMSwgIDksIDExLCAxMCwgMTEsIDE0LCAxNiwgMTMsIDE1LCAxNCwgMTUsIDE0LCAxNCwKKyAgICAgICA1LCAxMSwgIDYsIDExLCAgOCwgMTIsICA5LCAxMSwgIDgsIDEzLCAgOSwgMTIsIDEwLCAxMywgMTEsIDEyLAorICAgICAgMTQsIDE2LCAxMywgMTUsIDE0LCAxNiwgMTQsIDE0LCAgOSwgMTYsICA4LCAxMywgMTIsIDE2LCAxMSwgMTMsCisgICAgICAxMiwgMTYsIDExLCAxNCwgMTMsIDE2LCAxMiwgMTMsIDE2LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxNSwKKyAgICAgICA1LCAxMiwgIDgsIDExLCAgNywgMTEsICA5LCAxMSwgIDksIDEzLCAxMCwgMTMsIDEwLCAxMywgMTEsIDEyLAorICAgICAgMTQsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTQsIDE1LCAgOCwgMTMsICA5LCAxMywgMTAsIDEzLCAxMSwgMTIsCisgICAgICAgOSwgMTMsIDEwLCAxMywgMTAsIDEzLCAxMSwgMTMsIDEzLCAxNiwgMTMsIDE1LCAxMywgMTYsIDEzLCAxNCwKKyAgICAgIDEyLCAxNiwgMTEsIDE0LCAxMywgMTYsIDEyLCAxNCwgMTIsIDE2LCAxMSwgMTQsIDEzLCAxNiwgMTIsIDE0LAorICAgICAgMTQsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTMsIDE0LCAxMCwgMTYsIDEyLCAxNSwgIDksIDE0LCAxMSwgMTMsCisgICAgICAxMiwgMTYsIDEzLCAxNiwgMTIsIDE1LCAxMiwgMTQsIDE2LCAxNiwgMTUsIDE2LCAxNSwgMTYsIDE0LCAxNCwKKyAgICAgIDEyLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDEyLCAxNCwgMTIsIDE2LCAxMywgMTYsIDEyLCAxNSwgMTMsIDE0LAorICAgICAgMTUsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTQsIDE0LCAxNSwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNCwgMTUsCisgICAgICAxNCwgMTYsIDEzLCAxNiwgMTQsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDEzLCAxNCwKKyAgICAgICA2LCAxNCwgIDksIDEzLCAgOSwgMTQsIDExLCAxMiwgMTAsIDE0LCAxMSwgMTMsIDExLCAxNCwgMTIsIDEzLAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNiwgMTQsIDE1LCAgOCwgMTUsICA5LCAxMywgMTEsIDE0LCAxMSwgMTMsCisgICAgICAxMSwgMTYsIDExLCAxNCwgMTIsIDE1LCAxMiwgMTQsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE1LCAxNiwKKyAgICAgIDEwLCAxNiwgIDksIDE0LCAxMiwgMTYsIDEyLCAxMywgMTMsIDE2LCAxMSwgMTUsIDE0LCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTUsIDE2LCAgOCwgMTUsIDEwLCAxMywgMTAsIDE0LCAxMSwgMTMsCisgICAgICAxMSwgMTYsIDEyLCAxNCwgMTIsIDE0LCAxMiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwKKyAgICAgIDEwLCAxNiwgMTEsIDE0LCAxMSwgMTUsIDEyLCAxMywgMTEsIDE2LCAxMSwgMTQsIDEyLCAxNSwgMTIsIDE0LAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE1LCAxNiwgMTQsIDE1LCAxMiwgMTYsIDExLCAxNSwgMTMsIDE2LCAxMywgMTQsCisgICAgICAxMiwgMTYsIDExLCAxNCwgMTMsIDE2LCAxMywgMTQsIDE1LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE0LCAxNSwKKyAgICAgIDEwLCAxNiwgMTIsIDE1LCAxMCwgMTUsIDEyLCAxMywgMTMsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxMiwgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMywgMTQsCisgICAgICAxMiwgMTYsIDEzLCAxNiwgMTIsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTUsIDE2LCAxNCwgMTYsIDE0LCAxNSwKKyAgICAgIDE1LCAxNiwgMTQsIDE2LCAxNSwgMTYsIDE0LCAxNSwgMTQsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTMsIDE0LAorICAgICAgMTQsIDE2LCAxMywgMTUsIDE0LCAxNiwgMTMsIDE0LCAgOSwgMTYsIDExLCAxNiwgMTEsIDE2LCAxMiwgMTQsCisgICAgICAxMywgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE1LCAxNSwKKyAgICAgIDExLCAxNiwgMTEsIDE2LCAxMiwgMTYsIDEzLCAxNCwgMTMsIDE2LCAxMiwgMTYsIDEzLCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxMSwgMTYsIDEwLCAxNSwgMTMsIDE2LCAxMiwgMTMsCisgICAgICAxNCwgMTYsIDEyLCAxNiwgMTQsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE0LCAxNCwKKyAgICAgIDExLCAxNiwgMTIsIDE2LCAxMSwgMTYsIDEzLCAxNCwgMTMsIDE2LCAxMywgMTYsIDEzLCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxMSwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxMywgMTQsCisgICAgICAxMywgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE1LCAxNCwKKyAgICAgIDEyLCAxNiwgMTIsIDE1LCAxMywgMTYsIDEyLCAxNCwgMTMsIDE2LCAxMiwgMTYsIDE0LCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTQsIDE0LCAxMSwgMTYsIDEyLCAxNiwgMTEsIDE2LCAxMiwgMTQsCisgICAgICAxNCwgMTYsIDE0LCAxNiwgMTIsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNCwKKyAgICAgIDEyLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDEyLCAxNCwgMTMsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTMsIDE0LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNiwgMTQsIDE0LCAxNCwgMTYsIDEzLCAxNiwgMTQsIDE2LCAxMiwgMTQsCisgICAgICAxMywgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMiwgMTMsIDE1LCAxNiwgMTMsIDE0LCAxNCwgMTUsIDEzLCAxMywKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgOCwgIDQsIDEwLCAgNSwgMTEsIDEwLCAxNiwgIDUsIDEyLCAgOSwgMTYsIDEwLCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgNCwgMTIsICA3LCAxMiwgIDksIDE2LCAxMiwgMTYsCisgICAgICAgOSwgMTYsIDExLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEyLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgNCwgMTIsICA5LCAxNiwgIDgsIDE2LCAxMiwgMTYsCisgICAgICAgOCwgMTYsIDExLCAxNiwgMTEsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA4LCAxNiwgMTEsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgMSwgMTEsICA2LCAxMiwgIDcsIDE2LCAxMSwgMTYsCisgICAgICAgNywgMTYsIDEwLCAxNiwgMTEsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA1LCAxNiwgIDcsIDE2LCAxMCwgMTYsIDEyLCAxNiwgIDksIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMSwgMTYsIDExLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA1LCAxNiwgMTAsIDE2LCAgOCwgMTYsIDEyLCAxNiwgIDksIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgOSwgMTYsIDExLCAxNiwgMTIsIDE2LCAxNiwgMTYsCisgICAgICAxMCwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA1LCAxNiwgIDksIDE2LCAxMCwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgOCwgMTYsICA5LCAxNiwgMTIsIDE2LCAxNiwgMTYsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDExLCAxNiwgMTAsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgOCwgMTYsIDExLCAxNiwgMTEsIDE2LCAxNiwgMTYsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDExLCAxNiwgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgNiwgMTYsIDEwLCAxNiwgMTIsIDE2LCAxNiwgMTYsCisgICAgICAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA5LCAxNiwgMTAsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMSwgMTYsICA5LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICA5LCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEzLCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTEsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDAsICA4LCAgNCwgMTAsICA1LCAgOSwgIDgsIDEwLCAgNiwgMTEsICA4LCAxMiwgIDgsIDExLCAxMCwgMTMsCisgICAgICAxNCwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNiwgMTYsICAzLCAxMSwgIDUsIDExLCAgOCwgMTIsIDEwLCAxMiwKKyAgICAgICA3LCAxMiwgIDksIDEzLCAxMCwgMTMsIDExLCAxMywgMTQsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDksIDE2LCAgOSwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxMSwgMTYsIDExLCAxNiwgMTQsIDE2LCAxMywgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA0LCAxMSwgIDcsIDEyLCAgNiwgMTEsIDEwLCAxMiwKKyAgICAgICA4LCAxMywgIDksIDEzLCAgOSwgMTMsIDExLCAxNCwgMTMsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTYsIDE2LAorICAgICAgIDcsIDEzLCAgOSwgMTMsICA5LCAxMywgMTEsIDEzLCAgOSwgMTQsIDEwLCAxNiwgMTEsIDE2LCAxMiwgMTYsCisgICAgICAxNSwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxNCwgMTYsIDEzLCAxNiwKKyAgICAgIDEzLCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxMiwgMTYsIDEwLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDEzLCAxNiwgMTIsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMywgMTYsIDE0LCAxNiwKKyAgICAgIDEzLCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICAyLCAxMCwgIDUsIDExLCAgNiwgMTEsICA5LCAxMSwKKyAgICAgICA3LCAxMiwgIDksIDEzLCAgOSwgMTMsIDExLCAxMywgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDQsIDEyLCAgNiwgMTIsICA4LCAxMywgMTAsIDEzLCAgOCwgMTMsICA5LCAxMywgMTEsIDE2LCAxMiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA5LCAxNiwgIDgsIDE2LCAxMiwgMTYsIDEyLCAxNiwKKyAgICAgIDEyLCAxNiwgMTEsIDE2LCAxMywgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDUsIDEyLCAgOCwgMTMsICA3LCAxMywgMTAsIDEzLCAgOCwgMTQsIDEwLCAxNCwgMTAsIDE0LCAxMiwgMTQsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA3LCAxNCwgIDksIDE2LCAxMCwgMTYsIDExLCAxNCwKKyAgICAgICA4LCAxNCwgMTAsIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTEsIDE2LCAxMSwgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTQsIDE2LCAxNCwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA5LCAxNiwgMTIsIDE2LCAxMCwgMTYsIDEyLCAxNiwKKyAgICAgIDEyLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTIsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTQsIDE2LCAxMiwgMTYsIDEzLCAxNiwgMTIsIDE2LCAxNCwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDYsIDE2LCAgOCwgMTYsICA5LCAxNiwgMTEsIDEzLCAxMCwgMTYsIDExLCAxNiwgMTEsIDE2LCAxMywgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA3LCAxNiwgIDksIDE2LCAxMCwgMTYsIDEyLCAxNiwKKyAgICAgIDExLCAxNiwgMTEsIDE2LCAxMiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAgOSwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMywgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA3LCAxNiwgMTAsIDE2LCAgOSwgMTYsIDEyLCAxNiwKKyAgICAgIDExLCAxNiwgMTIsIDE2LCAxMiwgMTYsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDksIDE2LCAxMSwgMTYsIDExLCAxNiwgMTIsIDE2LCAxMSwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMywgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxNCwgMTYsIDE0LCAxNiwKKyAgICAgIDEyLCAxNiwgMTIsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxMiwgMTYsIDEwLCAxNiwgMTMsIDE2LCAxMywgMTYsIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMiwgMTYsIDE0LCAxNiwKKyAgICAgIDEyLCAxNiwgMTQsIDE2LCAxMywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA5LCAxNiwgMTEsIDE2LCAxMSwgMTYsIDEzLCAxNiwKKyAgICAgIDEyLCAxNiwgMTMsIDE2LCAxMywgMTYsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxMSwgMTYsIDEzLCAxNiwgMTMsIDE2LCAxMywgMTYsIDEzLCAxNiwgMTQsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTEsIDE2LCAxNCwgMTYsIDEzLCAxNiwKKyAgICAgIDE0LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTMsIDE2LCAxMywgMTYsIDEzLCAxNiwgMTMsIDE2LCAxNCwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTIsIDE2LCAxMywgMTYsIDE0LCAxNiwKKyAgICAgIDEzLCAxNiwgMTMsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTIsIDE2LCAxMiwgMTYsIDE0LCAxNiwgMTQsIDE2LCAxNCwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTMsIDE2LCAxMSwgMTYsIDE0LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTIsIDE2LCAxNCwgMTYsIDEzLCAxNiwgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIH0sCisgICAgeworICAgICAgIDAsIDEwLCAgNCwgMTIsICA1LCAxNiwgMTEsIDE2LCAgNiwgMTYsIDEwLCAxNiwgMTEsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICAzLCAxNiwgIDcsIDE2LCAxMCwgMTYsIDE2LCAxNiwKKyAgICAgICA5LCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA0LCAxNiwgMTAsIDE2LCAgOSwgMTYsIDE2LCAxNiwKKyAgICAgICA5LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDksIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICAxLCAxNiwgIDYsIDE2LCAgOCwgMTYsIDE2LCAxNiwKKyAgICAgICA4LCAxNiwgMTEsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDUsIDE2LCAgOCwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMCwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTEsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDUsIDE2LCAxMSwgMTYsICA5LCAxNiwgMTYsIDE2LCAxMCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA5LCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDEwLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDUsIDE2LCAgOSwgMTYsIDExLCAxNiwgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA4LCAxNiwgMTAsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTIsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA4LCAxNiwgMTYsIDE2LCAxMSwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTIsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA2LCAxNiwgMTEsIDE2LCAxNSwgMTYsIDE2LCAxNiwKKyAgICAgIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgIDksIDE2LCAxMCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxNiwgIDksIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTAsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIH0sCisgIH0sCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBydjM0X3RhYmxlX2ludGVyX3NlY29uZHBhdFtOVU1fSU5URVJfVEFCTEVTXVsyXVtPVEhFUkJMS19WTENfU0laRV0gPSB7CisgIHsKKyAgICB7CisgICAgICAgMCwgIDQsICA4LCAgMywgIDYsICA4LCAgNiwgIDcsICA4LCAgNCwgIDYsICA4LCAgNiwgIDcsICA4LCAgNywKKyAgICAgICA4LCAgOCwgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDMsICA2LCAgOCwgIDQsICA2LAorICAgICAgIDksICA3LCAgNywgIDgsICA1LCAgNywgIDksICA2LCAgNywgIDksICA4LCAgOCwgIDgsICA3LCAgOCwgIDgsCisgICAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNiwgIDgsICA5LCAgNywgIDgsICA5LCAgNywgIDgsICA5LCAgNywKKyAgICAgICA4LCAgOSwgIDcsICA4LCAgOSwgIDgsICA4LCAgOSwgIDgsICA4LCAgOSwgIDgsICA5LCAgOSwgIDgsICA4LAorICAgICAgIDgsICA4LCAgOSwgIDksICA4LCAgOSwgIDksICA3LCAgOCwgIDgsICA4LCAgOSwgIDksICA4LCAgOSwgIDksCisgICAgICAgOCwgIDgsICA4LCAgNywgIDgsICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA2LAorICAgIH0sCisgICAgeworICAgICAgIDAsICA0LCAgOSwgIDMsICA2LCAgOSwgIDcsICA4LCAxMCwgIDMsICA2LCAgOSwgIDUsICA3LCAxMCwgIDksCisgICAgICAgOSwgMTAsICA3LCAgOCwgMTAsICA4LCAgOSwgMTAsIDEwLCAxMCwgMTAsICAyLCAgNiwgIDksICA0LCAgNywKKyAgICAgIDEwLCAgOCwgIDksIDEwLCAgNCwgIDcsIDEwLCAgNiwgIDcsIDEwLCAgOSwgIDksIDEwLCAgNywgIDgsIDEwLAorICAgICAgIDgsICA5LCAxMCwgMTAsIDEwLCAxMCwgIDYsICA4LCAxMCwgIDcsICA5LCAxMSwgIDksIDEwLCAxMSwgIDcsCisgICAgICAgOSwgMTEsICA4LCAgOSwgMTEsIDEwLCAxMCwgMTEsICA4LCAgOSwgMTEsICA5LCAxMCwgMTEsIDExLCAxMSwKKyAgICAgIDEwLCAgOCwgMTAsIDExLCAgOSwgMTAsIDExLCAgOSwgMTAsIDExLCAgOCwgMTAsIDExLCAgOSwgMTAsIDExLAorICAgICAgMTAsIDEwLCAxMSwgIDgsIDEwLCAxMSwgIDksIDEwLCAxMCwgMTAsIDEwLCAgOSwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDAsICA0LCAgOCwgIDMsICA2LCAgOCwgIDYsICA3LCAgOSwgIDQsICA2LCAgOCwgIDUsICA3LCAgOCwgIDgsCisgICAgICAgOCwgIDksICA3LCAgNywgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDgsICAzLCAgNiwgIDgsICA0LCAgNiwKKyAgICAgICA5LCAgNywgIDcsICA5LCAgNSwgIDYsICA5LCAgNiwgIDcsICA5LCAgOCwgIDgsICA5LCAgNywgIDgsICA4LAorICAgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDYsICA4LCAgOSwgIDcsICA4LCAxMCwgIDcsICA4LCAgOSwgIDcsCisgICAgICAgOCwgMTAsICA3LCAgOCwgMTAsICA4LCAgOCwgIDksICA3LCAgOCwgIDksICA4LCAgOSwgIDksICA5LCAgOSwKKyAgICAgICA4LCAgNywgIDksIDEwLCAgOCwgIDksIDEwLCAgOCwgIDgsICA4LCAgOCwgIDksIDEwLCAgOCwgIDksICA5LAorICAgICAgIDgsICA4LCAgOCwgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNiwKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgNCwgIDksICAzLCAgNiwgMTAsICA4LCAgOSwgMTEsICAzLCAgNSwgIDksICA1LCAgNywgMTAsICA5LAorICAgICAgMTAsIDExLCAgNywgIDgsIDEwLCAgOSwgIDksIDExLCAxMSwgMTEsIDEyLCAgMiwgIDUsIDEwLCAgNCwgIDcsCisgICAgICAxMCwgIDgsICA5LCAxMSwgIDQsICA2LCAxMCwgIDYsICA3LCAxMCwgIDksIDEwLCAxMSwgIDcsICA5LCAxMCwKKyAgICAgICA5LCAgOSwgMTEsIDExLCAxMSwgMTEsICA2LCAgOCwgMTEsICA3LCAgOSwgMTEsICA5LCAxMCwgMTIsICA3LAorICAgICAgIDksIDExLCAgOCwgIDksIDEyLCAxMCwgMTAsIDEyLCAgOCwgMTAsIDExLCAxMCwgMTAsIDExLCAxMiwgMTEsCisgICAgICAxMSwgIDgsIDEwLCAxMiwgIDksIDExLCAxMiwgMTAsIDExLCAxMiwgIDksIDEwLCAxMiwgMTAsIDExLCAxMiwKKyAgICAgIDExLCAxMSwgMTIsICA5LCAxMCwgMTIsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTAsCisgICAgfSwKKyAgfSwKKyAgeworICAgIHsKKyAgICAgICAwLCAgNCwgIDgsICAzLCAgNiwgIDksICA3LCAgOCwgIDksICA0LCAgNiwgIDgsICA1LCAgNywgIDksICA4LAorICAgICAgIDksICA5LCAgNywgIDgsICA5LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgMiwgIDYsICA5LCAgNCwgIDYsCisgICAgICAgOSwgIDcsICA4LCAxMCwgIDUsICA3LCAgOSwgIDYsICA3LCAgOSwgIDgsICA4LCAgOSwgIDcsICA4LCAgOSwKKyAgICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA2LCAgOCwgMTAsICA3LCAgOCwgMTAsICA4LCAgOSwgMTAsICA2LAorICAgICAgIDgsIDEwLCAgOCwgIDgsIDEwLCAgOSwgIDksIDEwLCAgOCwgIDksIDEwLCAgOSwgIDksIDEwLCAxMCwgMTAsCisgICAgICAgOSwgIDgsICA5LCAxMCwgIDgsICA5LCAxMCwgIDgsICA5LCAxMCwgIDgsICA5LCAxMCwgIDksICA5LCAxMCwKKyAgICAgICA5LCAgOSwgIDksICA4LCAgOSwgIDksICA4LCAgOSwgIDksICA5LCAgOSwgIDgsCisgICAgfSwKKyAgICB7CisgICAgICAgMCwgIDQsIDEwLCAgMywgIDYsIDEwLCAgOCwgMTAsIDEyLCAgMiwgIDYsIDEwLCAgNiwgIDgsIDExLCAxMCwKKyAgICAgIDExLCAxMiwgIDcsICA5LCAxMSwgIDksIDEwLCAxMiwgMTIsIDEzLCAxMywgIDIsICA2LCAxMCwgIDQsICA3LAorICAgICAgMTEsICA5LCAxMCwgMTMsICA0LCAgNywgMTEsICA3LCAgOCwgMTEsIDEwLCAxMSwgMTIsICA4LCAgOSwgMTIsCisgICAgICAxMCwgMTAsIDEyLCAxMiwgMTIsIDEzLCAgNiwgIDksIDEyLCAgOCwgMTAsIDEzLCAxMCwgMTIsIDE0LCAgNywKKyAgICAgIDEwLCAxMywgIDksIDEwLCAxMywgMTEsIDExLCAxMywgIDksIDExLCAxMywgMTEsIDExLCAxMywgMTMsIDEzLAorICAgICAgMTMsICA5LCAxMSwgMTMsIDEwLCAxMiwgMTQsIDExLCAxMiwgMTQsICA5LCAxMSwgMTQsIDExLCAxMiwgMTQsCisgICAgICAxMiwgMTIsIDE0LCAgOSwgMTIsIDEzLCAxMSwgMTIsIDEzLCAxMywgMTIsIDEyLAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAgMCwgIDQsICA5LCAgMywgIDYsICA5LCAgNywgIDgsIDEwLCAgMywgIDYsICA5LCAgNiwgIDcsICA5LCAgOSwKKyAgICAgICA5LCAxMCwgIDcsICA4LCAgOSwgIDgsICA5LCAxMCwgMTAsIDEwLCAxMSwgIDIsICA2LCAgOSwgIDQsICA3LAorICAgICAgMTAsICA3LCAgOSwgMTAsICA0LCAgNywgMTAsICA2LCAgNywgMTAsICA5LCAgOSwgMTAsICA3LCAgOCwgMTAsCisgICAgICAgOCwgIDksIDEwLCAxMCwgMTAsIDEwLCAgNiwgIDgsIDExLCAgNywgIDksIDExLCAgOCwgMTAsIDExLCAgNiwKKyAgICAgICA5LCAxMSwgIDgsICA5LCAxMSwgIDksICA5LCAxMSwgIDgsICA5LCAxMSwgIDksIDEwLCAxMSwgMTEsIDEwLAorICAgICAgMTAsICA4LCAxMCwgMTEsICA5LCAxMCwgMTEsICA5LCAxMCwgMTEsICA4LCAxMCwgMTEsICA5LCAxMCwgMTEsCisgICAgICAxMCwgMTAsIDExLCAgOCwgMTAsIDExLCAgOSwgMTAsIDExLCAxMCwgMTAsIDEwLAorICAgIH0sCisgICAgeworICAgICAgIDAsICA0LCAxMiwgIDMsICA3LCAxMiwgMTAsIDExLCAxNCwgIDMsICA2LCAxMiwgIDcsICA5LCAxMywgMTIsCisgICAgICAxMywgMTQsICA4LCAxMSwgMTMsIDExLCAxMiwgMTQsIDE0LCAxNCwgMTQsICAxLCAgNywgMTIsICA1LCAgOCwKKyAgICAgIDEzLCAxMCwgMTIsIDE0LCAgNCwgIDgsIDEzLCAgOCwgIDksIDEzLCAxMiwgMTMsIDE0LCAgOSwgMTEsIDE0LAorICAgICAgMTEsIDEyLCAxNCwgMTQsIDE0LCAxNCwgIDcsIDEwLCAxNCwgIDksIDExLCAxNCwgMTEsIDEzLCAxNiwgIDgsCisgICAgICAxMSwgMTQsIDEwLCAxMiwgMTQsIDEzLCAxMywgMTYsIDEwLCAxMiwgMTUsIDEyLCAxMywgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxMCwgMTMsIDE1LCAxMiwgMTMsIDE0LCAxMywgMTUsIDE1LCAxMCwgMTMsIDE1LCAxMiwgMTMsIDE1LAorICAgICAgMTMsIDE0LCAxNSwgMTAsIDEzLCAxNCwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxNCwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDAsICA0LCAgOSwgIDMsICA2LCAxMCwgIDcsICA5LCAxMSwgIDMsICA1LCAgOSwgIDUsICA3LCAxMCwgIDksCisgICAgICAxMCwgMTIsICA3LCAgOCwgMTAsICA5LCAxMCwgMTEsIDExLCAxMiwgMTIsICAyLCAgNiwgMTAsICA0LCAgNywKKyAgICAgIDEwLCAgNywgIDksIDEyLCAgNCwgIDcsIDEwLCAgNiwgIDcsIDExLCAgOSwgMTAsIDEyLCAgNywgIDksIDExLAorICAgICAgIDksICA5LCAxMSwgMTEsIDExLCAxMiwgIDUsICA4LCAxMSwgIDcsICA5LCAxMiwgIDksIDEwLCAxMywgIDYsCisgICAgICAgOSwgMTIsICA4LCAgOSwgMTIsIDEwLCAxMCwgMTIsICA4LCAxMCwgMTIsIDEwLCAxMCwgMTIsIDEyLCAxMiwKKyAgICAgIDEyLCAgOCwgMTAsIDEyLCAgOSwgMTEsIDEzLCAxMCwgMTEsIDEzLCAgOSwgMTEsIDEzLCAxMCwgMTEsIDEzLAorICAgICAgMTEsIDExLCAxMywgIDksIDExLCAxMiwgMTAsIDExLCAxMiwgMTEsIDExLCAxMiwKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgNCwgMTIsICAzLCAgNywgMTMsIDEwLCAxMiwgMTUsICAzLCAgNywgMTMsICA3LCAgOSwgMTQsIDEyLAorICAgICAgMTIsIDEzLCAgOCwgMTEsIDE0LCAxMSwgMTMsIDE1LCAxNSwgMTQsIDE0LCAgMSwgIDYsIDEzLCAgNSwgIDgsCisgICAgICAxMywgMTAsIDEzLCAxNSwgIDQsICA4LCAxMywgIDgsICA5LCAxNCwgMTMsIDEzLCAxNSwgIDgsIDExLCAxNCwKKyAgICAgIDEyLCAxMiwgMTUsIDE1LCAxNCwgMTQsICA3LCAxMCwgMTMsICA5LCAxMSwgMTMsIDEyLCAxNCwgMTYsICA4LAorICAgICAgMTEsIDE0LCAxMCwgMTIsIDE1LCAxMywgMTMsIDE2LCAxMCwgMTIsIDE1LCAxMiwgMTMsIDE1LCAxNSwgMTQsCisgICAgICAxNSwgMTEsIDEyLCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxNSwgMTAsIDEyLCAxNCwgMTIsIDEzLCAxNSwKKyAgICAgIDE0LCAxNSwgMTUsIDEwLCAxMywgMTMsIDEyLCAxMywgMTUsIDE0LCAxNCwgMTUsCisgICAgfSwKKyAgfSwKKyAgeworICAgIHsKKyAgICAgICAwLCAgNSwgMTAsICAzLCAgNywgMTEsICA5LCAxMSwgMTQsICAzLCAgNywgMTEsICA3LCAgOCwgMTIsIDExLAorICAgICAgMTIsIDE0LCAgNywgIDksIDEyLCAxMCwgMTEsIDE0LCAxMywgMTQsIDE2LCAgMSwgIDcsIDExLCAgNSwgIDgsCisgICAgICAxMiwgIDksIDExLCAxNSwgIDQsICA4LCAxMiwgIDcsICA5LCAxMywgMTEsIDEyLCAxNSwgIDgsIDEwLCAxMywKKyAgICAgIDEwLCAxMSwgMTQsIDE0LCAxNCwgMTYsICA2LCAgOSwgMTMsICA4LCAxMSwgMTQsIDEwLCAxMywgMTYsICA3LAorICAgICAgMTAsIDE0LCAgOSwgMTEsIDE1LCAxMiwgMTMsIDE2LCAgOSwgMTEsIDE1LCAxMiwgMTIsIDE1LCAxNCwgMTQsCisgICAgICAxNiwgMTAsIDEyLCAxNCwgMTEsIDEzLCAxNSwgMTIsIDE0LCAxNiwgMTAsIDEyLCAxNSwgMTEsIDEzLCAxNiwKKyAgICAgIDEzLCAxNCwgMTYsIDEwLCAxMywgMTYsIDEyLCAxMywgMTUsIDE0LCAxNSwgMTYsCisgICAgfSwKKyAgICB7CisgICAgICAgMCwgIDUsIDE2LCAgMywgIDgsIDE0LCAxMSwgMTMsIDE0LCAgMiwgIDgsIDE0LCAgOCwgMTAsIDE2LCAxMywKKyAgICAgIDEzLCAxNCwgIDksIDEzLCAxNiwgMTIsIDEzLCAxNiwgMTYsIDE0LCAxNiwgIDEsICA3LCAxNCwgIDYsIDEwLAorICAgICAgMTQsIDEyLCAxNiwgMTYsICA1LCAgOSwgMTQsICA5LCAxMSwgMTYsIDE1LCAxNiwgMTYsIDEwLCAxMiwgMTYsCisgICAgICAxMywgMTMsIDE2LCAxNiwgMTQsIDE2LCAgOCwgMTEsIDE0LCAxMSwgMTMsIDE0LCAxNCwgMTQsIDE2LCAgOCwKKyAgICAgIDEyLCAxNCwgMTEsIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTAsIDEyLCAxNSwgMTMsIDE0LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDExLCAxNCwgMTQsIDE0LCAxNSwgMTYsIDE2LCAxNSwgMTYsIDEwLCAxMywgMTYsIDEzLCAxNCwgMTQsCisgICAgICAxNiwgMTYsIDE2LCAxMCwgMTMsIDE2LCAxMywgMTQsIDE2LCAxNiwgMTYsIDE2LAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAgMCwgIDUsIDExLCAgMywgIDcsIDEzLCAgOSwgMTIsIDE2LCAgMywgIDcsIDEyLCAgNiwgIDksIDE0LCAxMSwKKyAgICAgIDEzLCAxNiwgIDcsIDEwLCAxNiwgMTEsIDEyLCAxNiwgMTYsIDE2LCAxNiwgIDEsICA2LCAxMiwgIDUsICA5LAorICAgICAgMTYsICA5LCAxMywgMTYsICA0LCAgOCwgMTYsICA3LCAxMCwgMTYsIDEyLCAxNSwgMTYsICA3LCAxMSwgMTYsCisgICAgICAxMSwgMTIsIDE2LCAxNiwgMTYsIDE2LCAgNiwgMTAsIDE1LCAgOCwgMTEsIDE2LCAxMSwgMTQsIDE2LCAgNywKKyAgICAgIDExLCAxNiwgMTAsIDEyLCAxNiwgMTMsIDE2LCAxNiwgIDksIDEzLCAxNiwgMTMsIDE0LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDEwLCAxMiwgMTYsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDExLCAxMywgMTYsIDEzLCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIH0sCisgICAgeworICAgICAgIDAsICA1LCAxNiwgIDMsICA4LCAxNiwgMTIsIDEyLCAxNiwgIDIsICA4LCAxNiwgIDgsIDEwLCAxNiwgMTMsCisgICAgICAxMywgMTYsICA5LCAxMywgMTYsIDEyLCAxMywgMTYsIDE2LCAxNiwgMTYsICAxLCAgOCwgMTYsICA2LCAxMCwKKyAgICAgIDE2LCAxMiwgMTYsIDE2LCAgNSwgIDksIDE2LCAgOSwgMTEsIDE2LCAxMywgMTYsIDE2LCAgOSwgMTIsIDE0LAorICAgICAgMTIsIDEyLCAxNiwgMTYsIDE2LCAxNiwgIDgsIDExLCAxMywgMTEsIDEyLCAxNiwgMTQsIDE2LCAxNiwgIDgsCisgICAgICAxMiwgMTYsIDExLCAxMywgMTYsIDE2LCAxNSwgMTYsICA5LCAxMywgMTQsIDEyLCAxMywgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxMCwgMTIsIDEzLCAxNCwgMTMsIDE2LCAxNiwgMTYsIDE2LCAgOSwgMTMsIDE2LCAxMywgMTIsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTAsIDEyLCAxNiwgMTQsIDE1LCAxNiwgMTYsIDE2LCAxNiwKKyAgICB9LAorICB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnYzNF90YWJsZV9pbnRlcl90aGlyZHBhdFtOVU1fSU5URVJfVEFCTEVTXVsyXVtPVEhFUkJMS19WTENfU0laRV0gPSB7CisgIHsKKyAgICB7CisgICAgICAgMCwgIDUsICA4LCAgMywgIDYsICA5LCAgNiwgIDcsICA5LCAgNCwgIDYsICA5LCAgNiwgIDcsICA5LCAgOCwKKyAgICAgICA4LCAgOSwgIDcsICA4LCAgOSwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDIsICA2LCAgOSwgIDQsICA3LAorICAgICAgIDksICA3LCAgOCwgIDksICA1LCAgNywgIDksICA2LCAgNywgIDksICA4LCAgOCwgIDksICA3LCAgOCwgIDksCisgICAgICAgOCwgIDksICA5LCAgOSwgIDksICA4LCAgNSwgIDgsIDEwLCAgNiwgIDgsIDEwLCAgOCwgIDksICA5LCAgNywKKyAgICAgICA4LCAxMCwgIDcsICA5LCAxMCwgIDgsICA5LCAgOSwgIDgsICA5LCAxMCwgIDksICA5LCAxMCwgIDksICA5LAorICAgICAgIDksICA3LCAgOSwgMTAsICA4LCAgOSwgMTAsICA4LCAgOCwgIDksICA4LCAgOSwgMTAsICA4LCAgOSwgMTAsCisgICAgICAgOCwgIDgsICA5LCAgOCwgIDksICA5LCAgOCwgIDksICA5LCAgOCwgIDgsICA3LAorICAgIH0sCisgICAgeworICAgICAgIDAsICA0LCAgOSwgIDIsICA2LCAxMCwgIDcsICA4LCAxMCwgIDMsICA2LCAxMCwgIDYsICA3LCAxMCwgIDksCisgICAgICAgOSwgMTAsICA4LCAgOSwgMTEsICA5LCAxMCwgMTEsIDEwLCAxMSwgMTEsICAyLCAgNiwgMTAsICA0LCAgNywKKyAgICAgIDEwLCAgOCwgIDksIDEwLCAgNSwgIDcsIDEwLCAgNywgIDgsIDEwLCAgOSwgIDksIDEwLCAgOSwgMTAsIDExLAorICAgICAgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgIDYsICA5LCAxMSwgIDcsICA5LCAxMSwgIDksIDEwLCAxMiwgIDgsCisgICAgICAgOSwgMTEsICA4LCAxMCwgMTEsIDEwLCAxMCwgMTEsIDEwLCAxMSwgMTIsIDExLCAxMSwgMTIsIDExLCAxMSwKKyAgICAgIDExLCAgOSwgMTEsIDEyLCAxMCwgMTEsIDEyLCAxMCwgMTEsIDEyLCAxMCwgMTEsIDEyLCAxMCwgMTEsIDEyLAorICAgICAgMTEsIDExLCAxMiwgMTEsIDEyLCAxMiwgMTEsIDEyLCAxMiwgMTIsIDExLCAxMSwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDAsICA0LCAgOSwgIDMsICA2LCAgOSwgIDYsICA4LCAgOSwgIDQsICA2LCAgOSwgIDUsICA3LCAgOSwgIDgsCisgICAgICAgOCwgIDksICA3LCAgOCwgMTAsICA4LCAgOSwgMTAsICA5LCAgOSwgIDksICAyLCAgNiwgIDksICA0LCAgNywKKyAgICAgICA5LCAgNywgIDgsICA5LCAgNSwgIDcsICA5LCAgNiwgIDcsIDEwLCAgOCwgIDksICA5LCAgNywgIDksIDEwLAorICAgICAgIDgsICA5LCAxMCwgIDksICA5LCAgOSwgIDUsICA4LCAxMCwgIDYsICA4LCAxMCwgIDgsICA5LCAxMCwgIDcsCisgICAgICAgOCwgMTAsICA3LCAgOSwgMTEsICA5LCAgOSwgMTAsICA4LCAgOSwgMTAsICA5LCAxMCwgMTAsIDEwLCAxMCwKKyAgICAgICA5LCAgNywgIDksIDEwLCAgOCwgIDksIDExLCAgOCwgIDksIDEwLCAgOCwgIDksIDExLCAgOCwgIDksIDExLAorICAgICAgIDksICA5LCAxMCwgIDksICA5LCAxMCwgIDksICA5LCAxMCwgIDksICA5LCAgOCwKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgNCwgIDksICAyLCAgNSwgMTAsICA3LCAgOCwgMTEsICAzLCAgNiwgMTAsICA2LCAgNywgMTAsICA5LAorICAgICAgMTAsIDExLCAgOCwgIDksIDExLCAgOSwgMTAsIDExLCAxMSwgMTEsIDEyLCAgMiwgIDYsIDEwLCAgNCwgIDcsCisgICAgICAxMCwgIDgsICA5LCAxMSwgIDUsICA3LCAxMCwgIDYsICA4LCAxMCwgIDksIDEwLCAxMSwgIDksIDEwLCAxMiwKKyAgICAgIDEwLCAxMCwgMTIsIDExLCAxMiwgMTIsICA2LCAgOSwgMTEsICA4LCAgOSwgMTIsICA5LCAxMSwgMTMsICA4LAorICAgICAgMTAsIDEyLCAgOSwgMTAsIDEyLCAxMSwgMTEsIDEyLCAxMCwgMTIsIDEzLCAxMSwgMTIsIDEzLCAxMywgMTIsCisgICAgICAxMywgMTAsIDExLCAxMywgMTAsIDEyLCAxMywgMTEsIDEyLCAxMywgMTEsIDEyLCAxMywgMTEsIDEyLCAxMywKKyAgICAgIDEyLCAxMiwgMTMsIDEyLCAxMywgMTQsIDEzLCAxMywgMTQsIDEzLCAxMywgMTMsCisgICAgfSwKKyAgfSwKKyAgeworICAgIHsKKyAgICAgICAwLCAgNCwgIDksICAzLCAgNiwgIDksICA3LCAgOCwgMTAsICAzLCAgNiwgIDksICA1LCAgNywgMTAsICA4LAorICAgICAgIDksIDEwLCAgNywgIDksIDEwLCAgOCwgIDksIDEwLCAxMCwgMTAsIDEwLCAgMiwgIDYsICA5LCAgNCwgIDcsCisgICAgICAxMCwgIDcsICA5LCAxMCwgIDQsICA3LCAxMCwgIDYsICA4LCAxMCwgIDgsICA5LCAxMCwgIDgsICA5LCAxMCwKKyAgICAgICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsICA1LCAgOCwgMTEsICA3LCAgOSwgMTEsICA4LCAxMCwgMTEsICA3LAorICAgICAgIDksIDExLCAgOCwgIDksIDExLCAgOSwgMTAsIDExLCAgOSwgMTAsIDExLCAxMCwgMTAsIDExLCAxMSwgMTEsCisgICAgICAxMSwgIDgsIDEwLCAxMSwgIDksIDEwLCAxMSwgIDksIDEwLCAxMSwgIDksIDEwLCAxMiwgIDksIDEwLCAxMiwKKyAgICAgIDEwLCAxMSwgMTEsICA5LCAxMCwgMTEsIDEwLCAxMSwgMTEsIDEwLCAxMCwgMTAsCisgICAgfSwKKyAgICB7CisgICAgICAgMCwgIDQsIDEwLCAgMywgIDYsIDExLCAgOCwgMTAsIDEyLCAgMywgIDYsIDExLCAgNiwgIDgsIDExLCAxMCwKKyAgICAgIDExLCAxMywgIDksIDEwLCAxMywgMTEsIDEyLCAxNCwgMTMsIDEzLCAxNCwgIDEsICA2LCAxMCwgIDUsICA4LAorICAgICAgMTIsICA5LCAxMCwgMTMsICA1LCAgOCwgMTEsICA3LCAgOSwgMTIsIDExLCAxMSwgMTMsIDEwLCAxMiwgMTMsCisgICAgICAxMSwgMTIsIDE0LCAxNCwgMTMsIDE1LCAgNywgMTAsIDEyLCAgOSwgMTEsIDE0LCAxMSwgMTIsIDE1LCAgOSwKKyAgICAgIDExLCAxMywgMTAsIDExLCAxNCwgMTIsIDEyLCAxNCwgMTIsIDE0LCAxNiwgMTMsIDEzLCAxNiwgMTQsIDE0LAorICAgICAgMTYsIDEyLCAxMywgMTUsIDEyLCAxNCwgMTUsIDEzLCAxNCwgMTYsIDEzLCAxNCwgMTYsIDE0LCAxNCwgMTYsCisgICAgICAxNCwgMTUsIDE2LCAxNCwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNSwgMTUsIDE2LAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAgMCwgIDQsICA5LCAgMiwgIDYsICA5LCAgNywgIDksIDExLCAgMywgIDYsIDEwLCAgNiwgIDcsIDEwLCAgOSwKKyAgICAgIDEwLCAxMSwgIDcsICA5LCAxMCwgIDksIDEwLCAxMSwgMTEsIDExLCAxMiwgIDIsICA2LCAxMCwgIDQsICA3LAorICAgICAgMTAsICA4LCAgOSwgMTEsICA1LCAgNywgMTAsICA3LCAgOCwgMTAsICA5LCAxMCwgMTEsICA4LCAgOSwgMTEsCisgICAgICAgOSwgMTAsIDExLCAxMSwgMTIsIDExLCAgNiwgIDksIDExLCAgNywgMTAsIDEyLCAgOSwgMTEsIDEyLCAgNywKKyAgICAgIDEwLCAxMiwgIDksIDEwLCAxMiwgMTEsIDExLCAxMiwgIDksIDExLCAxMiwgMTAsIDExLCAxMiwgMTIsIDEyLAorICAgICAgMTIsICA5LCAxMSwgMTIsICA5LCAxMSwgMTMsIDExLCAxMiwgMTMsICA5LCAxMSwgMTMsIDEwLCAxMiwgMTMsCisgICAgICAxMSwgMTIsIDEzLCAxMSwgMTIsIDEzLCAxMSwgMTIsIDEzLCAxMiwgMTMsIDEyLAorICAgIH0sCisgICAgeworICAgICAgIDAsICA0LCAxMSwgIDIsICA2LCAxMiwgIDksIDExLCAxNiwgIDQsICA3LCAxMiwgIDcsICA5LCAxNSwgMTEsCisgICAgICAxMiwgMTYsIDEwLCAxMSwgMTYsIDExLCAxMywgMTYsIDE2LCAxNiwgMTYsICAxLCAgNiwgMTEsICA1LCAgOCwKKyAgICAgIDE2LCAgOSwgMTIsIDE2LCAgNiwgIDksIDE1LCAgOCwgMTAsIDE2LCAxMiwgMTMsIDE2LCAxMiwgMTQsIDE2LAorICAgICAgMTIsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDgsIDExLCAxNCwgMTAsIDEyLCAxNiwgMTIsIDE2LCAxNiwgMTAsCisgICAgICAxMywgMTYsIDEyLCAxNiwgMTYsIDEzLCAxNCwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxMywgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTQsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICB9LAorICB9LAorICB7CisgICAgeworICAgICAgIDAsICA1LCAgOSwgIDMsICA2LCAxMCwgIDgsIDEwLCAxMiwgIDMsICA2LCAxMCwgIDYsICA4LCAxMCwgMTAsCisgICAgICAxMSwgMTIsICA4LCAgOSwgMTEsIDEwLCAxMCwgMTIsIDEzLCAxMywgMTMsICAxLCAgNiwgMTAsICA1LCAgOCwKKyAgICAgIDExLCAgOSwgMTEsIDEzLCAgNSwgIDgsIDExLCAgNywgIDksIDExLCAxMSwgMTEsIDEzLCAgOCwgIDksIDExLAorICAgICAgMTAsIDEwLCAxMiwgMTMsIDEzLCAxNCwgIDYsICA5LCAxMiwgIDgsIDExLCAxMywgMTEsIDEzLCAxNSwgIDgsCisgICAgICAxMCwgMTMsIDEwLCAxMSwgMTMsIDEyLCAxMywgMTUsIDEwLCAxMiwgMTMsIDEyLCAxMiwgMTMsIDE0LCAxNCwKKyAgICAgIDE0LCAgOSwgMTIsIDE0LCAxMSwgMTMsIDE1LCAxMywgMTUsIDE2LCAxMSwgMTMsIDE1LCAxMiwgMTQsIDE1LAorICAgICAgMTQsIDE1LCAxNiwgMTMsIDE0LCAxNSwgMTQsIDE0LCAxNSwgMTUsIDE2LCAxNiwKKyAgICB9LAorICAgIHsKKyAgICAgICAwLCAgNCwgMTYsICAyLCAgNywgMTYsIDEwLCAxMywgMTYsICAzLCAgOCwgMTYsICA3LCAxMCwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxMiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgMSwgIDcsIDE2LCAgNiwgIDksCisgICAgICAxNiwgMTAsIDE2LCAxNiwgIDcsIDEyLCAxNiwgIDksIDEzLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICA5LCAxNiwgMTYsIDExLCAxMywgMTYsIDE2LCAxNiwgMTYsIDEyLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgfSwKKyAgfSwKKyAgeworICAgIHsKKyAgICAgICAwLCAgNCwgIDksICAzLCAgNiwgMTEsICA5LCAxMiwgMTYsICAzLCAgNiwgMTAsICA2LCAgOCwgMTEsIDEyLAorICAgICAgMTMsIDE2LCAgOCwgIDksIDEyLCAxMCwgMTEsIDEzLCAxNiwgMTYsIDE2LCAgMSwgIDYsIDEwLCAgNSwgIDgsCisgICAgICAxMiwgMTAsIDEzLCAxNiwgIDUsICA4LCAxMSwgIDgsICA5LCAxMywgMTMsIDE0LCAxNiwgIDksIDEwLCAxNCwKKyAgICAgIDExLCAxMiwgMTUsIDE2LCAxNiwgMTYsICA2LCAxMCwgMTMsICA5LCAxMiwgMTYsIDE0LCAxNiwgMTYsICA5LAorICAgICAgMTIsIDE0LCAxMSwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxMiwgMTQsIDE2LCAxNCwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTEsIDE2LCAxNiwgMTMsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTIsIDE2LCAxNiwgMTMsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgfSwKKyAgICB7CisgICAgICAgMCwgIDQsIDE2LCAgMiwgIDgsIDE2LCAxMCwgMTYsIDE2LCAgMywgIDksIDE2LCAgOCwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDEsICA3LCAxNiwgIDUsIDEwLAorICAgICAgMTYsIDE2LCAxNiwgMTYsICA3LCAxNiwgMTYsIDExLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMCwgMTUsIDE2LCAxMCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIH0sCisgIH0sCisgIHsKKyAgICB7CisgICAgICAgMCwgIDMsICA5LCAgMywgIDcsIDExLCAxMSwgMTUsIDE2LCAgMywgIDYsIDExLCAgNywgIDksIDEyLCAxNiwKKyAgICAgIDE2LCAxNiwgIDgsIDEwLCAxNiwgMTEsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDEsICA2LCAxMSwgIDYsICA5LAorICAgICAgMTUsIDE2LCAxNiwgMTYsICA1LCAgOCwgMTYsICA5LCAxMSwgMTYsIDE2LCAxNiwgMTYsIDEwLCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgNywgMTEsIDE2LCAxMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxMSwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIH0sCisgICAgeworICAgICAgIDAsICA0LCAxNiwgIDIsICA4LCAxNiwgMTYsIDE2LCAxNiwgIDMsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsICAxLCAgNywgMTYsICA1LCAxMiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAgNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDksIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICB9LAorICB9LAorfTsKKworCitzdGF0aWMgY29uc3QgdWludDhfdCBydjM0X2ludGVyX2NvZWZmW05VTV9JTlRFUl9UQUJMRVNdW0NPRUZGX1ZMQ19TSVpFXSA9IHsKK3sKKyAgMSwgIDIsICA0LCAgNCwgIDUsICA1LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDksICA5LCAxMCwKKyAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsIDExLCAxMSwgMTEsIDEzLCAxNCwgMTUsIDE2LCAxNiwKK30sCit7CisgIDEsICAyLCAgMywgIDUsICA1LCAgNiwgIDYsICA3LCAgNywgIDgsICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsCisgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMiwgMTIsIDEzLCAxNCwgMTYsIDE2LCAxNiwgMTYsCit9LAoreworICAxLCAgMiwgIDMsICA0LCAgNiwgIDYsICA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDEyLAorIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTQsIDE0LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorfSwKK3sKKyAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwKKyAxMywgMTMsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKK30sCit7CisgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMywgMTQsIDE1LCAxNiwgMTYsCisgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCit9LAoreworICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgMTAsIDEwLCAxMSwgMTEsIDEzLCAxMiwgMTIsIDEzLAorIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorfSwKK3sKKyAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsIDEwLCAxMCwgMTAsIDExLCAxNCwgMTMsIDE1LCAxNiwKKyAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwKK30KK307CisKKyNlbmRpZiAvKiBBVkNPREVDX1JWMzRWTENfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcnY0MC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnY0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0M2ZkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9ydjQwLmMKQEAgLTAsMCArMSw1ODUgQEAKKy8qCisgKiBSVjQwIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJWNDAgZGVjb2RlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKworI2luY2x1ZGUgInJ2MzQuaCIKKyNpbmNsdWRlICJydjQwdmxjMi5oIgorI2luY2x1ZGUgInJ2NDBkYXRhLmgiCisKK3N0YXRpYyBWTEMgYWljX3RvcF92bGM7CitzdGF0aWMgVkxDIGFpY19tb2RlMV92bGNbQUlDX01PREUxX05VTV0sIGFpY19tb2RlMl92bGNbQUlDX01PREUyX05VTV07CitzdGF0aWMgVkxDIHB0eXBlX3ZsY1tOVU1fUFRZUEVfVkxDU10sIGJ0eXBlX3ZsY1tOVU1fQlRZUEVfVkxDU107CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IG1vZGUyX29mZnNbXSA9IHsKKyAgICAgICAwLCAgNjE0LCAxMjIyLCAxNzk0LCAyNDEwLCAgMzAxNCwgIDM1ODYsICA0MjAyLCAgNDc5MiwgNTM4MiwgNTk2NiwgNjU0MiwKKyAgICA3MTM4LCA3NzE2LCA4MjkyLCA4ODY0LCA5NDQ0LCAxMDAzMCwgMTA2NDIsIDExMjEyLCAxMTgxNAorfTsKKworLyoqCisgKiBJbml0aWFsaXplIGFsbCB0YWJsZXMuCisgKi8KK3N0YXRpYyBhdl9jb2xkIHZvaWQgcnY0MF9pbml0X3RhYmxlcyh2b2lkKQoreworICAgIGludCBpOworICAgIHN0YXRpYyBWTENfVFlQRSBhaWNfdGFibGVbMSA8PCBBSUNfVE9QX0JJVFNdWzJdOworICAgIHN0YXRpYyBWTENfVFlQRSBhaWNfbW9kZTFfdGFibGVbQUlDX01PREUxX05VTSA8PCBBSUNfTU9ERTFfQklUU11bMl07CisgICAgc3RhdGljIFZMQ19UWVBFIGFpY19tb2RlMl90YWJsZVsxMTgxNF1bMl07CisgICAgc3RhdGljIFZMQ19UWVBFIHB0eXBlX3RhYmxlW05VTV9QVFlQRV9WTENTIDw8IFBUWVBFX1ZMQ19CSVRTXVsyXTsKKyAgICBzdGF0aWMgVkxDX1RZUEUgYnR5cGVfdGFibGVbTlVNX0JUWVBFX1ZMQ1MgPDwgQlRZUEVfVkxDX0JJVFNdWzJdOworCisgICAgYWljX3RvcF92bGMudGFibGUgPSBhaWNfdGFibGU7CisgICAgYWljX3RvcF92bGMudGFibGVfYWxsb2NhdGVkID0gMSA8PCBBSUNfVE9QX0JJVFM7CisgICAgaW5pdF92bGMoJmFpY190b3BfdmxjLCBBSUNfVE9QX0JJVFMsIEFJQ19UT1BfU0laRSwKKyAgICAgICAgICAgICBydjQwX2FpY190b3BfdmxjX2JpdHMsICAxLCAxLAorICAgICAgICAgICAgIHJ2NDBfYWljX3RvcF92bGNfY29kZXMsIDEsIDEsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBBSUNfTU9ERTFfTlVNOyBpKyspeworICAgICAgICAvLyBFdmVyeSB0ZW50aCBWTEMgdGFibGUgaXMgZW1wdHkKKyAgICAgICAgaWYoKGkgJSAxMCkgPT0gOSkgY29udGludWU7CisgICAgICAgIGFpY19tb2RlMV92bGNbaV0udGFibGUgPSAmYWljX21vZGUxX3RhYmxlW2kgPDwgQUlDX01PREUxX0JJVFNdOworICAgICAgICBhaWNfbW9kZTFfdmxjW2ldLnRhYmxlX2FsbG9jYXRlZCA9IDEgPDwgQUlDX01PREUxX0JJVFM7CisgICAgICAgIGluaXRfdmxjKCZhaWNfbW9kZTFfdmxjW2ldLCBBSUNfTU9ERTFfQklUUywgQUlDX01PREUxX1NJWkUsCisgICAgICAgICAgICAgICAgIGFpY19tb2RlMV92bGNfYml0c1tpXSwgIDEsIDEsCisgICAgICAgICAgICAgICAgIGFpY19tb2RlMV92bGNfY29kZXNbaV0sIDEsIDEsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICB9CisgICAgZm9yKGkgPSAwOyBpIDwgQUlDX01PREUyX05VTTsgaSsrKXsKKyAgICAgICAgYWljX21vZGUyX3ZsY1tpXS50YWJsZSA9ICZhaWNfbW9kZTJfdGFibGVbbW9kZTJfb2Zmc1tpXV07CisgICAgICAgIGFpY19tb2RlMl92bGNbaV0udGFibGVfYWxsb2NhdGVkID0gbW9kZTJfb2Zmc1tpICsgMV0gLSBtb2RlMl9vZmZzW2ldOworICAgICAgICBpbml0X3ZsYygmYWljX21vZGUyX3ZsY1tpXSwgQUlDX01PREUyX0JJVFMsIEFJQ19NT0RFMl9TSVpFLAorICAgICAgICAgICAgICAgICBhaWNfbW9kZTJfdmxjX2JpdHNbaV0sICAxLCAxLAorICAgICAgICAgICAgICAgICBhaWNfbW9kZTJfdmxjX2NvZGVzW2ldLCAyLCAyLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgfQorICAgIGZvcihpID0gMDsgaSA8IE5VTV9QVFlQRV9WTENTOyBpKyspeworICAgICAgICBwdHlwZV92bGNbaV0udGFibGUgPSAmcHR5cGVfdGFibGVbaSA8PCBQVFlQRV9WTENfQklUU107CisgICAgICAgIHB0eXBlX3ZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSAxIDw8IFBUWVBFX1ZMQ19CSVRTOworICAgICAgICBmZl9pbml0X3ZsY19zcGFyc2UoJnB0eXBlX3ZsY1tpXSwgUFRZUEVfVkxDX0JJVFMsIFBUWVBFX1ZMQ19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0eXBlX3ZsY19iaXRzW2ldLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHlwZV92bGNfY29kZXNbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHR5cGVfdmxjX3N5bXMsICAgICAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgfQorICAgIGZvcihpID0gMDsgaSA8IE5VTV9CVFlQRV9WTENTOyBpKyspeworICAgICAgICBidHlwZV92bGNbaV0udGFibGUgPSAmYnR5cGVfdGFibGVbaSA8PCBCVFlQRV9WTENfQklUU107CisgICAgICAgIGJ0eXBlX3ZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSAxIDw8IEJUWVBFX1ZMQ19CSVRTOworICAgICAgICBmZl9pbml0X3ZsY19zcGFyc2UoJmJ0eXBlX3ZsY1tpXSwgQlRZUEVfVkxDX0JJVFMsIEJUWVBFX1ZMQ19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0eXBlX3ZsY19iaXRzW2ldLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHlwZV92bGNfY29kZXNbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnR5cGVfdmxjX3N5bXMsICAgICAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgfQorfQorCisvKioKKyAqIEdldCBzdG9yZWQgZGltZW5zaW9uIGZyb20gYml0c3RyZWFtLgorICoKKyAqIElmIHRoZSB3aWR0aC9oZWlnaHQgaXMgdGhlIHN0YW5kYXJkIG9uZSB0aGVuIGl0J3MgY29kZWQgYXMgYSAzLWJpdCBpbmRleC4KKyAqIE90aGVyd2lzZSBpdCBpcyBjb2RlZCBhcyBlc2NhcGVkIDgtYml0IHBvcnRpb25zLgorICovCitzdGF0aWMgaW50IGdldF9kaW1lbnNpb24oR2V0Qml0Q29udGV4dCAqZ2IsIGNvbnN0IGludCAqZGltKQoreworICAgIGludCB0ICAgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgaW50IHZhbCA9IGRpbVt0XTsKKyAgICBpZih2YWwgPCAwKQorICAgICAgICB2YWwgPSBkaW1bZ2V0X2JpdHMxKGdiKSAtIHZhbF07CisgICAgaWYoIXZhbCl7CisgICAgICAgIGRveworICAgICAgICAgICAgdCA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIHZhbCArPSB0IDw8IDI7CisgICAgICAgIH13aGlsZSh0ID09IDB4RkYpOworICAgIH0KKyAgICByZXR1cm4gdmFsOworfQorCisvKioKKyAqIEdldCBlbmNvZGVkIHBpY3R1cmUgc2l6ZSAtIHVzdWFsbHkgdGhpcyBpcyBjYWxsZWQgZnJvbSBydjQwX3BhcnNlX3NsaWNlX2hlYWRlci4KKyAqLworc3RhdGljIHZvaWQgcnY0MF9wYXJzZV9waWN0dXJlX3NpemUoR2V0Qml0Q29udGV4dCAqZ2IsIGludCAqdywgaW50ICpoKQoreworICAgICp3ID0gZ2V0X2RpbWVuc2lvbihnYiwgcnY0MF9zdGFuZGFyZF93aWR0aHMpOworICAgICpoID0gZ2V0X2RpbWVuc2lvbihnYiwgcnY0MF9zdGFuZGFyZF9oZWlnaHRzKTsKK30KKworc3RhdGljIGludCBydjQwX3BhcnNlX3NsaWNlX2hlYWRlcihSVjM0RGVjQ29udGV4dCAqciwgR2V0Qml0Q29udGV4dCAqZ2IsIFNsaWNlSW5mbyAqc2kpCit7CisgICAgaW50IG1iX2JpdHM7CisgICAgaW50IHcgPSByLT5zLndpZHRoLCBoID0gci0+cy5oZWlnaHQ7CisgICAgaW50IG1iX3NpemU7CisKKyAgICBtZW1zZXQoc2ksIDAsIHNpemVvZihTbGljZUluZm8pKTsKKyAgICBpZihnZXRfYml0czEoZ2IpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc2ktPnR5cGUgPSBnZXRfYml0cyhnYiwgMik7CisgICAgaWYoc2ktPnR5cGUgPT0gMSkgc2ktPnR5cGUgPSAwOworICAgIHNpLT5xdWFudCA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICBpZihnZXRfYml0cyhnYiwgMikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzaS0+dmxjX3NldCA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICBza2lwX2JpdHMxKGdiKTsKKyAgICBzaS0+cHRzID0gZ2V0X2JpdHMoZ2IsIDEzKTsKKyAgICBpZighc2ktPnR5cGUgfHwgIWdldF9iaXRzMShnYikpCisgICAgICAgIHJ2NDBfcGFyc2VfcGljdHVyZV9zaXplKGdiLCAmdywgJmgpOworICAgIGlmKGF2X2ltYWdlX2NoZWNrX3NpemUodywgaCwgMCwgci0+cy5hdmN0eCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc2ktPndpZHRoICA9IHc7CisgICAgc2ktPmhlaWdodCA9IGg7CisgICAgbWJfc2l6ZSA9ICgodyArIDE1KSA+PiA0KSAqICgoaCArIDE1KSA+PiA0KTsKKyAgICBtYl9iaXRzID0gZmZfcnYzNF9nZXRfc3RhcnRfb2Zmc2V0KGdiLCBtYl9zaXplKTsKKyAgICBzaS0+c3RhcnQgPSBnZXRfYml0cyhnYiwgbWJfYml0cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgNHg0IGludHJhIHR5cGVzIGFycmF5LgorICovCitzdGF0aWMgaW50IHJ2NDBfZGVjb2RlX2ludHJhX3R5cGVzKFJWMzREZWNDb250ZXh0ICpyLCBHZXRCaXRDb250ZXh0ICpnYiwgaW50OF90ICpkc3QpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmci0+czsKKyAgICBpbnQgaSwgaiwgaywgdjsKKyAgICBpbnQgQSwgQiwgQzsKKyAgICBpbnQgcGF0dGVybjsKKyAgICBpbnQ4X3QgKnB0cjsKKworICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKywgZHN0ICs9IHItPmludHJhX3R5cGVzX3N0cmlkZSl7CisgICAgICAgIGlmKCFpICYmIHMtPmZpcnN0X3NsaWNlX2xpbmUpeworICAgICAgICAgICAgcGF0dGVybiA9IGdldF92bGMyKGdiLCBhaWNfdG9wX3ZsYy50YWJsZSwgQUlDX1RPUF9CSVRTLCAxKTsKKyAgICAgICAgICAgIGRzdFswXSA9IChwYXR0ZXJuID4+IDIpICYgMjsKKyAgICAgICAgICAgIGRzdFsxXSA9IChwYXR0ZXJuID4+IDEpICYgMjsKKyAgICAgICAgICAgIGRzdFsyXSA9ICBwYXR0ZXJuICAgICAgICYgMjsKKyAgICAgICAgICAgIGRzdFszXSA9IChwYXR0ZXJuIDw8IDEpICYgMjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHB0ciA9IGRzdDsKKyAgICAgICAgZm9yKGogPSAwOyBqIDwgNDsgaisrKXsKKyAgICAgICAgICAgIC8qIENvZWZmaWNpZW50cyBhcmUgcmVhZCB1c2luZyBWTEMgY2hvc2VuIGJ5IHRoZSBwcmVkaWN0aW9uIHBhdHRlcm4KKyAgICAgICAgICAgICAqIFRoZSBmaXJzdCBvbmUgKHVzZWQgZm9yIHJldHJpZXZpbmcgYSBwYWlyIG9mIGNvZWZmaWNpZW50cykgaXMKKyAgICAgICAgICAgICAqIGNvbnN0cnVjdGVkIGZyb20gdGhlIHRvcCwgdG9wIHJpZ2h0IGFuZCBsZWZ0IGNvZWZmaWNpZW50cworICAgICAgICAgICAgICogVGhlIHNlY29uZCBvbmUgKHVzZWQgZm9yIHJldHJpZXZpbmcgb25seSBvbmUgY29lZmZpY2llbnQpIGlzCisgICAgICAgICAgICAgKiB0b3AgKyAxMCAqIGxlZnQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEEgPSBwdHJbLXItPmludHJhX3R5cGVzX3N0cmlkZSArIDFdOyAvLyBpdCB3b24ndCBiZSB1c2VkIGZvciB0aGUgbGFzdCBjb2VmZmljaWVudCBpbiBhIHJvdworICAgICAgICAgICAgQiA9IHB0clstci0+aW50cmFfdHlwZXNfc3RyaWRlXTsKKyAgICAgICAgICAgIEMgPSBwdHJbLTFdOworICAgICAgICAgICAgcGF0dGVybiA9IEEgKyAoQiA8PCA0KSArIChDIDw8IDgpOworICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgTU9ERTJfUEFUVEVSTlNfTlVNOyBrKyspCisgICAgICAgICAgICAgICAgaWYocGF0dGVybiA9PSBydjQwX2FpY190YWJsZV9pbmRleFtrXSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZihqIDwgMyAmJiBrIDwgTU9ERTJfUEFUVEVSTlNfTlVNKXsgLy9wYXR0ZXJuIGlzIGZvdW5kLCBkZWNvZGluZyAyIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgIHYgPSBnZXRfdmxjMihnYiwgYWljX21vZGUyX3ZsY1trXS50YWJsZSwgQUlDX01PREUyX0JJVFMsIDIpOworICAgICAgICAgICAgICAgICpwdHIrKyA9IHYvOTsKKyAgICAgICAgICAgICAgICAqcHRyKysgPSB2JTk7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgaWYoQiAhPSAtMSAmJiBDICE9IC0xKQorICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0X3ZsYzIoZ2IsIGFpY19tb2RlMV92bGNbQiArIEMqMTBdLnRhYmxlLCBBSUNfTU9ERTFfQklUUywgMSk7CisgICAgICAgICAgICAgICAgZWxzZXsgLy8gdHJpY2t5IGRlY29kaW5nCisgICAgICAgICAgICAgICAgICAgIHYgPSAwOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goQyl7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgLTE6IC8vIGNvZGUgMCAtPiAxLCAxIC0+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEIgPCAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnZXRfYml0czEoZ2IpIF4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICAwOgorICAgICAgICAgICAgICAgICAgICBjYXNlICAyOiAvLyBjb2RlIDAgLT4gMiwgMSAtPiAwCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gKGdldF9iaXRzMShnYikgXiAxKSA8PCAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnB0cisrID0gdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgbWFjcm9ibG9jayBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIGludCBydjQwX2RlY29kZV9tYl9pbmZvKFJWMzREZWNDb250ZXh0ICpyKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnItPnM7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+Z2I7CisgICAgaW50IHEsIGk7CisgICAgaW50IHByZXZfdHlwZSA9IDA7CisgICAgaW50IG1iX3BvcyA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOworCisgICAgaWYoIXItPnMubWJfc2tpcF9ydW4pIHsKKyAgICAgICAgci0+cy5tYl9za2lwX3J1biA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYikgKyAxOworICAgICAgICBpZihyLT5zLm1iX3NraXBfcnVuID4gKHVuc2lnbmVkKXMtPm1iX251bSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZigtLXItPnMubWJfc2tpcF9ydW4pCisgICAgICAgICByZXR1cm4gUlYzNF9NQl9TS0lQOworCisgICAgaWYoci0+YXZhaWxfY2FjaGVbNi00XSl7CisgICAgICAgIGludCBibG9ja3NbUlYzNF9NQl9UWVBFU10gPSB7MH07CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGlmKHItPmF2YWlsX2NhY2hlWzYtMV0pCisgICAgICAgICAgICBibG9ja3Nbci0+bWJfdHlwZVttYl9wb3MgLSAxXV0rKzsKKyAgICAgICAgYmxvY2tzW3ItPm1iX3R5cGVbbWJfcG9zIC0gcy0+bWJfc3RyaWRlXV0rKzsKKyAgICAgICAgaWYoci0+YXZhaWxfY2FjaGVbNi0yXSkKKyAgICAgICAgICAgIGJsb2Nrc1tyLT5tYl90eXBlW21iX3BvcyAtIHMtPm1iX3N0cmlkZSArIDFdXSsrOworICAgICAgICBpZihyLT5hdmFpbF9jYWNoZVs2LTVdKQorICAgICAgICAgICAgYmxvY2tzW3ItPm1iX3R5cGVbbWJfcG9zIC0gcy0+bWJfc3RyaWRlIC0gMV1dKys7CisgICAgICAgIGZvcihpID0gMDsgaSA8IFJWMzRfTUJfVFlQRVM7IGkrKyl7CisgICAgICAgICAgICBpZihibG9ja3NbaV0gPiBjb3VudCl7CisgICAgICAgICAgICAgICAgY291bnQgPSBibG9ja3NbaV07CisgICAgICAgICAgICAgICAgcHJldl90eXBlID0gaTsKKyAgICAgICAgICAgICAgICBpZihjb3VudD4xKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoci0+YXZhaWxfY2FjaGVbNi0xXSkKKyAgICAgICAgcHJldl90eXBlID0gci0+bWJfdHlwZVttYl9wb3MgLSAxXTsKKworICAgIGlmKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCl7CisgICAgICAgIHByZXZfdHlwZSA9IGJsb2NrX251bV90b19wdHlwZV92bGNfbnVtW3ByZXZfdHlwZV07CisgICAgICAgIHEgPSBnZXRfdmxjMihnYiwgcHR5cGVfdmxjW3ByZXZfdHlwZV0udGFibGUsIFBUWVBFX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgaWYocSA8IFBCVFlQRV9FU0NBUEUpCisgICAgICAgICAgICByZXR1cm4gcTsKKyAgICAgICAgcSA9IGdldF92bGMyKGdiLCBwdHlwZV92bGNbcHJldl90eXBlXS50YWJsZSwgUFRZUEVfVkxDX0JJVFMsIDEpOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkRxdWFudCBmb3IgUC1mcmFtZVxuIik7CisgICAgfWVsc2V7CisgICAgICAgIHByZXZfdHlwZSA9IGJsb2NrX251bV90b19idHlwZV92bGNfbnVtW3ByZXZfdHlwZV07CisgICAgICAgIHEgPSBnZXRfdmxjMihnYiwgYnR5cGVfdmxjW3ByZXZfdHlwZV0udGFibGUsIEJUWVBFX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgaWYocSA8IFBCVFlQRV9FU0NBUEUpCisgICAgICAgICAgICByZXR1cm4gcTsKKyAgICAgICAgcSA9IGdldF92bGMyKGdiLCBidHlwZV92bGNbcHJldl90eXBlXS50YWJsZSwgQlRZUEVfVkxDX0JJVFMsIDEpOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkRxdWFudCBmb3IgQi1mcmFtZVxuIik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitlbnVtIFJWNDBCbG9ja1Bvc3sKKyAgICBQT1NfQ1VSLAorICAgIFBPU19UT1AsCisgICAgUE9TX0xFRlQsCisgICAgUE9TX0JPVFRPTSwKK307CisKKyNkZWZpbmUgTUFTS19DVVIgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1BU0tfUklHSFQgICAgICAgIDB4MDAwOAorI2RlZmluZSBNQVNLX0JPVFRPTSAgICAgICAweDAwMTAKKyNkZWZpbmUgTUFTS19UT1AgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIE1BU0tfWV9UT1BfUk9XICAgIDB4MDAwRgorI2RlZmluZSBNQVNLX1lfTEFTVF9ST1cgICAweEYwMDAKKyNkZWZpbmUgTUFTS19ZX0xFRlRfQ09MICAgMHgxMTExCisjZGVmaW5lIE1BU0tfWV9SSUdIVF9DT0wgIDB4ODg4OAorI2RlZmluZSBNQVNLX0NfVE9QX1JPVyAgICAweDAwMDMKKyNkZWZpbmUgTUFTS19DX0xBU1RfUk9XICAgMHgwMDBDCisjZGVmaW5lIE1BU0tfQ19MRUZUX0NPTCAgIDB4MDAwNQorI2RlZmluZSBNQVNLX0NfUklHSFRfQ09MICAweDAwMEEKKworc3RhdGljIGNvbnN0IGludCBuZWlnaGJvdXJfb2Zmc194WzRdID0geyAwLCAgMCwgLTEsIDAgfTsKK3N0YXRpYyBjb25zdCBpbnQgbmVpZ2hib3VyX29mZnNfeVs0XSA9IHsgMCwgLTEsICAwLCAxIH07CisKK3N0YXRpYyB2b2lkIHJ2NDBfYWRhcHRpdmVfbG9vcF9maWx0ZXIoUlYzNERTUENvbnRleHQgKnJkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGRtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGltX3ExLCBpbnQgbGltX3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgYmV0YTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHJvbWEsIGludCBlZGdlLCBpbnQgZGlyKQoreworICAgIGludCBmaWx0ZXJfcDEsIGZpbHRlcl9xMTsKKyAgICBpbnQgc3Ryb25nOworICAgIGludCBsaW1zOworCisgICAgc3Ryb25nID0gcmRzcC0+cnY0MF9sb29wX2ZpbHRlcl9zdHJlbmd0aFtkaXJdKHNyYywgc3RyaWRlLCBiZXRhLCBiZXRhMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSwgJmZpbHRlcl9wMSwgJmZpbHRlcl9xMSk7CisKKyAgICBsaW1zID0gZmlsdGVyX3AxICsgZmlsdGVyX3ExICsgKChsaW1fcTEgKyBsaW1fcDEpID4+IDEpICsgMTsKKworICAgIGlmIChzdHJvbmcpIHsKKyAgICAgICAgcmRzcC0+cnY0MF9zdHJvbmdfbG9vcF9maWx0ZXJbZGlyXShzcmMsIHN0cmlkZSwgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltcywgZG1vZGUsIGNocm9tYSk7CisgICAgfSBlbHNlIGlmIChmaWx0ZXJfcDEgJiBmaWx0ZXJfcTEpIHsKKyAgICAgICAgcmRzcC0+cnY0MF93ZWFrX2xvb3BfZmlsdGVyW2Rpcl0oc3JjLCBzdHJpZGUsIDEsIDEsIGFscGhhLCBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1zLCBsaW1fcTEsIGxpbV9wMSk7CisgICAgfSBlbHNlIGlmIChmaWx0ZXJfcDEgfCBmaWx0ZXJfcTEpIHsKKyAgICAgICAgcmRzcC0+cnY0MF93ZWFrX2xvb3BfZmlsdGVyW2Rpcl0oc3JjLCBzdHJpZGUsIGZpbHRlcl9wMSwgZmlsdGVyX3ExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSwgYmV0YSwgbGltcyA+PiAxLCBsaW1fcTEgPj4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltX3AxID4+IDEpOworICAgIH0KK30KKworLyoqCisgKiBSVjQwIGxvb3AgZmlsdGVyaW5nIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHJ2NDBfbG9vcF9maWx0ZXIoUlYzNERlY0NvbnRleHQgKnIsIGludCByb3cpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmci0+czsKKyAgICBpbnQgbWJfcG9zLCBtYl94OworICAgIGludCBpLCBqLCBrOworICAgIHVpbnQ4X3QgKlksICpDOworICAgIGludCBhbHBoYSwgYmV0YSwgYmV0YVksIGJldGFDOworICAgIGludCBxOworICAgIGludCBtYnR5cGVbNF07ICAgLy8vPCBjdXJyZW50IG1hY3JvYmxvY2sgYW5kIGl0cyBuZWlnaGJvdXJzIHR5cGVzCisgICAgLyoqCisgICAgICogZmxhZ3MgaW5kaWNhdGluZyB0aGF0IG1hY3JvYmxvY2sgY2FuIGJlIGZpbHRlcmVkIHdpdGggc3Ryb25nIGZpbHRlcgorICAgICAqIGl0IGlzIHNldCBvbmx5IGZvciBpbnRyYSBjb2RlZCBNQiBhbmQgTUIgd2l0aCBEQ3MgY29kZWQgc2VwYXJhdGVseQorICAgICAqLworICAgIGludCBtYl9zdHJvbmdbNF07CisgICAgaW50IGNsaXBbNF07ICAgICAvLy88IE1CIGZpbHRlciBjbGlwcGluZyB2YWx1ZSBjYWxjdWxhdGVkIGZyb20gZmlsdGVyaW5nIHN0cmVuZ3RoCisgICAgLyoqCisgICAgICogY29kZWQgYmxvY2sgcGF0dGVybnMgZm9yIGx1bWEgcGFydCBvZiBjdXJyZW50IG1hY3JvYmxvY2sgYW5kIGl0cyBuZWlnaGJvdXJzCisgICAgICogRm9ybWF0OgorICAgICAqIExTQiBjb3JyZXNwb25kcyB0byB0aGUgdG9wIGxlZnQgYmxvY2ssCisgICAgICogZWFjaCBuaWJibGUgcmVwcmVzZW50cyBvbmUgcm93IG9mIHN1YmJsb2Nrcy4KKyAgICAgKi8KKyAgICBpbnQgY2JwWzRdOworICAgIC8qKgorICAgICAqIGNvZGVkIGJsb2NrIHBhdHRlcm5zIGZvciBjaHJvbWEgcGFydCBvZiBjdXJyZW50IG1hY3JvYmxvY2sgYW5kIGl0cyBuZWlnaGJvdXJzCisgICAgICogRm9ybWF0IGlzIHRoZSBzYW1lIGFzIGZvciBsdW1hIHdpdGggdHdvIHN1YmJsb2NrcyBpbiBhIHJvdy4KKyAgICAgKi8KKyAgICBpbnQgdXZjYnBbNF1bMl07CisgICAgLyoqCisgICAgICogVGhpcyBtYXNrIHJlcHJlc2VudHMgdGhlIHBhdHRlcm4gb2YgbHVtYSBzdWJibG9ja3MgdGhhdCBzaG91bGQgYmUgZmlsdGVyZWQKKyAgICAgKiBpbiBhZGRpdGlvbiB0byB0aGUgY29kZWQgb25lcyBiZWNhdXNlIHRoZXkgbGllIGF0IHRoZSBlZGdlIG9mCisgICAgICogOHg4IGJsb2NrIHdpdGggZGlmZmVyZW50IGVub3VnaCBtb3Rpb24gdmVjdG9ycworICAgICAqLworICAgIHVuc2lnbmVkIG12bWFza3NbNF07CisKKyAgICBtYl9wb3MgPSByb3cgKiBzLT5tYl9zdHJpZGU7CisgICAgZm9yKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKywgbWJfcG9zKyspeworICAgICAgICBpbnQgbWJ0eXBlID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bWJfdHlwZVttYl9wb3NdOworICAgICAgICBpZihJU19JTlRSQShtYnR5cGUpIHx8IElTX1NFUEFSQVRFX0RDKG1idHlwZSkpCisgICAgICAgICAgICByLT5jYnBfbHVtYSAgW21iX3Bvc10gPSByLT5kZWJsb2NrX2NvZWZzW21iX3Bvc10gPSAweEZGRkY7CisgICAgICAgIGlmKElTX0lOVFJBKG1idHlwZSkpCisgICAgICAgICAgICByLT5jYnBfY2hyb21hW21iX3Bvc10gPSAweEZGOworICAgIH0KKyAgICBtYl9wb3MgPSByb3cgKiBzLT5tYl9zdHJpZGU7CisgICAgZm9yKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKywgbWJfcG9zKyspeworICAgICAgICBpbnQgeV9oX2RlYmxvY2ssIHlfdl9kZWJsb2NrOworICAgICAgICBpbnQgY192X2RlYmxvY2tbMl0sIGNfaF9kZWJsb2NrWzJdOworICAgICAgICBpbnQgY2xpcF9sZWZ0OworICAgICAgICBpbnQgYXZhaWxbNF07CisgICAgICAgIHVuc2lnbmVkIHlfdG9fZGVibG9jazsKKyAgICAgICAgaW50IGNfdG9fZGVibG9ja1syXTsKKworICAgICAgICBxID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+cXNjYWxlX3RhYmxlW21iX3Bvc107CisgICAgICAgIGFscGhhID0gcnY0MF9hbHBoYV90YWJbcV07CisgICAgICAgIGJldGEgID0gcnY0MF9iZXRhX3RhYiBbcV07CisgICAgICAgIGJldGFZID0gYmV0YUMgPSBiZXRhICogMzsKKyAgICAgICAgaWYocy0+d2lkdGggKiBzLT5oZWlnaHQgPD0gMTc2KjE0NCkKKyAgICAgICAgICAgIGJldGFZICs9IGJldGE7CisKKyAgICAgICAgYXZhaWxbMF0gPSAxOworICAgICAgICBhdmFpbFsxXSA9IHJvdzsKKyAgICAgICAgYXZhaWxbMl0gPSBtYl94OworICAgICAgICBhdmFpbFszXSA9IHJvdyA8IHMtPm1iX2hlaWdodCAtIDE7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKyl7CisgICAgICAgICAgICBpZihhdmFpbFtpXSl7CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IG1iX3BvcyArIG5laWdoYm91cl9vZmZzX3hbaV0gKyBuZWlnaGJvdXJfb2Zmc195W2ldKnMtPm1iX3N0cmlkZTsKKyAgICAgICAgICAgICAgICBtdm1hc2tzW2ldID0gci0+ZGVibG9ja19jb2Vmc1twb3NdOworICAgICAgICAgICAgICAgIG1idHlwZSBbaV0gPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5tYl90eXBlW3Bvc107CisgICAgICAgICAgICAgICAgY2JwICAgIFtpXSA9IHItPmNicF9sdW1hW3Bvc107CisgICAgICAgICAgICAgICAgdXZjYnBbaV1bMF0gPSByLT5jYnBfY2hyb21hW3Bvc10gJiAweEY7CisgICAgICAgICAgICAgICAgdXZjYnBbaV1bMV0gPSByLT5jYnBfY2hyb21hW3Bvc10gPj4gNDsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIG12bWFza3NbaV0gPSAwOworICAgICAgICAgICAgICAgIG1idHlwZSBbaV0gPSBtYnR5cGVbMF07CisgICAgICAgICAgICAgICAgY2JwICAgIFtpXSA9IDA7CisgICAgICAgICAgICAgICAgdXZjYnBbaV1bMF0gPSB1dmNicFtpXVsxXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYl9zdHJvbmdbaV0gPSBJU19JTlRSQShtYnR5cGVbaV0pIHx8IElTX1NFUEFSQVRFX0RDKG1idHlwZVtpXSk7CisgICAgICAgICAgICBjbGlwW2ldID0gcnY0MF9maWx0ZXJfY2xpcF90YmxbbWJfc3Ryb25nW2ldICsgMV1bcV07CisgICAgICAgIH0KKyAgICAgICAgeV90b19kZWJsb2NrID0gIG12bWFza3NbUE9TX0NVUl0KKyAgICAgICAgICAgICAgICAgICAgIHwgKG12bWFza3NbUE9TX0JPVFRPTV0gPDwgMTYpOworICAgICAgICAvKiBUaGlzIHBhdHRlcm4gY29udGFpbnMgYml0cyBzaWduYWxsaW5nIHRoYXQgaG9yaXpvbnRhbCBlZGdlcyBvZgorICAgICAgICAgKiB0aGUgY3VycmVudCBibG9jayBjYW4gYmUgZmlsdGVyZWQuCisgICAgICAgICAqIFRoYXQgaGFwcGVucyB3aGVuIGVpdGhlciBvZiBhZGphY2VudCBzdWJibG9ja3MgaXMgY29kZWQgb3IgbGllcyBvbgorICAgICAgICAgKiB0aGUgZWRnZSBvZiA4eDggYmxvY2tzIHdpdGggbW90aW9uIHZlY3RvcnMgZGlmZmVyaW5nIGJ5IG1vcmUgdGhhbgorICAgICAgICAgKiAzLzQgcGVsIGluIGFueSBjb21wb25lbnQgKGFueSBlZGdlIG9yaWVudGF0aW9uIGZvciBzb21lIHJlYXNvbikuCisgICAgICAgICAqLworICAgICAgICB5X2hfZGVibG9jayA9ICAgeV90b19kZWJsb2NrCisgICAgICAgICAgICAgICAgICAgIHwgKChjYnBbUE9TX0NVUl0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAgNCkgJiB+TUFTS19ZX1RPUF9ST1cpCisgICAgICAgICAgICAgICAgICAgIHwgKChjYnBbUE9TX1RPUF0gICAgICAgICYgTUFTS19ZX0xBU1RfUk9XKSA+PiAxMik7CisgICAgICAgIC8qIFRoaXMgcGF0dGVybiBjb250YWlucyBiaXRzIHNpZ25hbGxpbmcgdGhhdCB2ZXJ0aWNhbCBlZGdlcyBvZgorICAgICAgICAgKiB0aGUgY3VycmVudCBibG9jayBjYW4gYmUgZmlsdGVyZWQuCisgICAgICAgICAqIFRoYXQgaGFwcGVucyB3aGVuIGVpdGhlciBvZiBhZGphY2VudCBzdWJibG9ja3MgaXMgY29kZWQgb3IgbGllcyBvbgorICAgICAgICAgKiB0aGUgZWRnZSBvZiA4eDggYmxvY2tzIHdpdGggbW90aW9uIHZlY3RvcnMgZGlmZmVyaW5nIGJ5IG1vcmUgdGhhbgorICAgICAgICAgKiAzLzQgcGVsIGluIGFueSBjb21wb25lbnQgKGFueSBlZGdlIG9yaWVudGF0aW9uIGZvciBzb21lIHJlYXNvbikuCisgICAgICAgICAqLworICAgICAgICB5X3ZfZGVibG9jayA9ICAgeV90b19kZWJsb2NrCisgICAgICAgICAgICAgICAgICAgIHwgKChjYnBbUE9TX0NVUl0gICAgICAgICAgICAgICAgICAgICAgPDwgMSkgJiB+TUFTS19ZX0xFRlRfQ09MKQorICAgICAgICAgICAgICAgICAgICB8ICgoY2JwW1BPU19MRUZUXSAmIE1BU0tfWV9SSUdIVF9DT0wpID4+IDMpOworICAgICAgICBpZighbWJfeCkKKyAgICAgICAgICAgIHlfdl9kZWJsb2NrICY9IH5NQVNLX1lfTEVGVF9DT0w7CisgICAgICAgIGlmKCFyb3cpCisgICAgICAgICAgICB5X2hfZGVibG9jayAmPSB+TUFTS19ZX1RPUF9ST1c7CisgICAgICAgIGlmKHJvdyA9PSBzLT5tYl9oZWlnaHQgLSAxIHx8IChtYl9zdHJvbmdbUE9TX0NVUl0gfCBtYl9zdHJvbmdbUE9TX0JPVFRPTV0pKQorICAgICAgICAgICAgeV9oX2RlYmxvY2sgJj0gfihNQVNLX1lfVE9QX1JPVyA8PCAxNik7CisgICAgICAgIC8qIENhbGN1bGF0aW5nIGNocm9tYSBwYXR0ZXJucyBpcyBzaW1pbGFyIGFuZCBlYXNpZXIgc2luY2UgdGhlcmUgaXMKKyAgICAgICAgICogbm8gbW90aW9uIHZlY3RvciBwYXR0ZXJuIGZvciB0aGVtLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKXsKKyAgICAgICAgICAgIGNfdG9fZGVibG9ja1tpXSA9ICh1dmNicFtQT1NfQk9UVE9NXVtpXSA8PCA0KSB8IHV2Y2JwW1BPU19DVVJdW2ldOworICAgICAgICAgICAgY192X2RlYmxvY2tbaV0gPSAgIGNfdG9fZGVibG9ja1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHV2Y2JwW1BPU19DVVJdIFtpXSAgICAgICAgICAgICAgICAgICAgICAgPDwgMSkgJiB+TUFTS19DX0xFRlRfQ09MKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHV2Y2JwW1BPU19MRUZUXVtpXSAgICYgTUFTS19DX1JJR0hUX0NPTCkgPj4gMSk7CisgICAgICAgICAgICBjX2hfZGVibG9ja1tpXSA9ICAgY190b19kZWJsb2NrW2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodXZjYnBbUE9TX1RPUF1baV0gICAgJiBNQVNLX0NfTEFTVF9ST1cpICA+PiAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgKHV2Y2JwW1BPU19DVVJdW2ldICAgICAgICAgICAgICAgICAgICAgICAgPDwgMik7CisgICAgICAgICAgICBpZighbWJfeCkKKyAgICAgICAgICAgICAgICBjX3ZfZGVibG9ja1tpXSAmPSB+TUFTS19DX0xFRlRfQ09MOworICAgICAgICAgICAgaWYoIXJvdykKKyAgICAgICAgICAgICAgICBjX2hfZGVibG9ja1tpXSAmPSB+TUFTS19DX1RPUF9ST1c7CisgICAgICAgICAgICBpZihyb3cgPT0gcy0+bWJfaGVpZ2h0IC0gMSB8fCAobWJfc3Ryb25nW1BPU19DVVJdIHwgbWJfc3Ryb25nW1BPU19CT1RUT01dKSkKKyAgICAgICAgICAgICAgICBjX2hfZGVibG9ja1tpXSAmPSB+KE1BU0tfQ19UT1BfUk9XIDw8IDQpOworICAgICAgICB9CisKKyAgICAgICAgZm9yKGogPSAwOyBqIDwgMTY7IGogKz0gNCl7CisgICAgICAgICAgICBZID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVswXSArIG1iX3gqMTYgKyAocm93KjE2ICsgaikgKiBzLT5saW5lc2l6ZTsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKywgWSArPSA0KXsKKyAgICAgICAgICAgICAgICBpbnQgaWogPSBpICsgajsKKyAgICAgICAgICAgICAgICBpbnQgY2xpcF9jdXIgPSB5X3RvX2RlYmxvY2sgJiAoTUFTS19DVVIgPDwgaWopID8gY2xpcFtQT1NfQ1VSXSA6IDA7CisgICAgICAgICAgICAgICAgaW50IGRpdGhlciA9IGogPyBpaiA6IGkqNDsKKworICAgICAgICAgICAgICAgIC8vIGlmIGJvdHRvbSBibG9jayBpcyBjb2RlZCB0aGVuIHdlIGNhbiBmaWx0ZXIgaXRzIHRvcCBlZGdlCisgICAgICAgICAgICAgICAgLy8gKG9yIGJvdHRvbSBlZGdlIG9mIHRoaXMgYmxvY2ssIHdoaWNoIGlzIHRoZSBzYW1lKQorICAgICAgICAgICAgICAgIGlmKHlfaF9kZWJsb2NrICYgKE1BU0tfQk9UVE9NIDw8IGlqKSl7CisgICAgICAgICAgICAgICAgICAgIHJ2NDBfYWRhcHRpdmVfbG9vcF9maWx0ZXIoJnItPnJkc3AsIFkrNCpzLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lc2l6ZSwgZGl0aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfdG9fZGVibG9jayAmIChNQVNLX0JPVFRPTSA8PCBpaikgPyBjbGlwW1BPU19DVVJdIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX2N1ciwgYWxwaGEsIGJldGEsIGJldGFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgbGVmdCBibG9jayBlZGdlIGluIG9yZGluYXJ5IG1vZGUgKHdpdGggbG93IGZpbHRlcmluZyBzdHJlbmd0aCkKKyAgICAgICAgICAgICAgICBpZih5X3ZfZGVibG9jayAmIChNQVNLX0NVUiA8PCBpaikgJiYgKGkgfHwgIShtYl9zdHJvbmdbUE9TX0NVUl0gfCBtYl9zdHJvbmdbUE9TX0xFRlRdKSkpeworICAgICAgICAgICAgICAgICAgICBpZighaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfbGVmdCA9IG12bWFza3NbUE9TX0xFRlRdICYgKE1BU0tfUklHSFQgPDwgaikgPyBjbGlwW1BPU19MRUZUXSA6IDA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfbGVmdCA9IHlfdG9fZGVibG9jayAmIChNQVNLX0NVUiA8PCAoaWotMSkpID8gY2xpcFtQT1NfQ1VSXSA6IDA7CisgICAgICAgICAgICAgICAgICAgIHJ2NDBfYWRhcHRpdmVfbG9vcF9maWx0ZXIoJnItPnJkc3AsIFksIHMtPmxpbmVzaXplLCBkaXRoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9jdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLCBiZXRhLCBiZXRhWSwgMCwgMCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGZpbHRlciB0b3AgZWRnZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIHdoZW4gZmlsdGVyaW5nIHN0cmVuZ3RoIGlzIGhpZ2gKKyAgICAgICAgICAgICAgICBpZighaiAmJiB5X2hfZGVibG9jayAmIChNQVNLX0NVUiA8PCBpKSAmJiAobWJfc3Ryb25nW1BPU19DVVJdIHwgbWJfc3Ryb25nW1BPU19UT1BdKSl7CisgICAgICAgICAgICAgICAgICAgIHJ2NDBfYWRhcHRpdmVfbG9vcF9maWx0ZXIoJnItPnJkc3AsIFksIHMtPmxpbmVzaXplLCBkaXRoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX2N1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12bWFza3NbUE9TX1RPUF0gJiAoTUFTS19UT1AgPDwgaSkgPyBjbGlwW1BPU19UT1BdIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLCBiZXRhLCBiZXRhWSwgMCwgMSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGZpbHRlciBsZWZ0IGJsb2NrIGVkZ2UgaW4gZWRnZSBtb2RlICh3aXRoIGhpZ2ggZmlsdGVyaW5nIHN0cmVuZ3RoKQorICAgICAgICAgICAgICAgIGlmKHlfdl9kZWJsb2NrICYgKE1BU0tfQ1VSIDw8IGlqKSAmJiAhaSAmJiAobWJfc3Ryb25nW1BPU19DVVJdIHwgbWJfc3Ryb25nW1BPU19MRUZUXSkpeworICAgICAgICAgICAgICAgICAgICBjbGlwX2xlZnQgPSBtdm1hc2tzW1BPU19MRUZUXSAmIChNQVNLX1JJR0hUIDw8IGopID8gY2xpcFtQT1NfTEVGVF0gOiAwOworICAgICAgICAgICAgICAgICAgICBydjQwX2FkYXB0aXZlX2xvb3BfZmlsdGVyKCZyLT5yZHNwLCBZLCBzLT5saW5lc2l6ZSwgZGl0aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9jdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSwgYmV0YSwgYmV0YVksIDAsIDEsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IoayA9IDA7IGsgPCAyOyBrKyspeworICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgMjsgaisrKXsKKyAgICAgICAgICAgICAgICBDID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVtrICsgMV0gKyBtYl94KjggKyAocm93KjggKyBqKjQpICogcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAyOyBpKyssIEMgKz0gNCl7CisgICAgICAgICAgICAgICAgICAgIGludCBpaiA9IGkgKyBqKjI7CisgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2N1ciA9IGNfdG9fZGVibG9ja1trXSAmIChNQVNLX0NVUiA8PCBpaikgPyBjbGlwW1BPU19DVVJdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgaWYoY19oX2RlYmxvY2tba10gJiAoTUFTS19DVVIgPDwgKGlqKzIpKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9ib3QgPSBjX3RvX2RlYmxvY2tba10gJiAoTUFTS19DVVIgPDwgKGlqKzIpKSA/IGNsaXBbUE9TX0NVUl0gOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgcnY0MF9hZGFwdGl2ZV9sb29wX2ZpbHRlcigmci0+cmRzcCwgQys0KnMtPnV2bGluZXNpemUsIHMtPnV2bGluZXNpemUsIGkqOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX2JvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX2N1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSwgYmV0YSwgYmV0YUMsIDEsIDAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKChjX3ZfZGVibG9ja1trXSAmIChNQVNLX0NVUiA8PCBpaikpICYmIChpIHx8ICEobWJfc3Ryb25nW1BPU19DVVJdIHwgbWJfc3Ryb25nW1BPU19MRUZUXSkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfbGVmdCA9IHV2Y2JwW1BPU19MRUZUXVtrXSAmIChNQVNLX0NVUiA8PCAoMipqKzEpKSA/IGNsaXBbUE9TX0xFRlRdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX2xlZnQgPSBjX3RvX2RlYmxvY2tba10gICAgJiAoTUFTS19DVVIgPDwgKGlqLTEpKSAgPyBjbGlwW1BPU19DVVJdICA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBydjQwX2FkYXB0aXZlX2xvb3BfZmlsdGVyKCZyLT5yZHNwLCBDLCBzLT51dmxpbmVzaXplLCBqKjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9jdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLCBiZXRhLCBiZXRhQywgMSwgMCwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIWogJiYgY19oX2RlYmxvY2tba10gJiAoTUFTS19DVVIgPDwgaWopICYmIChtYl9zdHJvbmdbUE9TX0NVUl0gfCBtYl9zdHJvbmdbUE9TX1RPUF0pKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCA9IHV2Y2JwW1BPU19UT1BdW2tdICYgKE1BU0tfQ1VSIDw8IChpaisyKSkgPyBjbGlwW1BPU19UT1BdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ2NDBfYWRhcHRpdmVfbG9vcF9maWx0ZXIoJnItPnJkc3AsIEMsIHMtPnV2bGluZXNpemUsIGkqOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX2N1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSwgYmV0YSwgYmV0YUMsIDEsIDEsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKGNfdl9kZWJsb2NrW2tdICYgKE1BU0tfQ1VSIDw8IGlqKSAmJiAhaSAmJiAobWJfc3Ryb25nW1BPU19DVVJdIHwgbWJfc3Ryb25nW1BPU19MRUZUXSkpeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9sZWZ0ID0gdXZjYnBbUE9TX0xFRlRdW2tdICYgKE1BU0tfQ1VSIDw8ICgyKmorMSkpID8gY2xpcFtQT1NfTEVGVF0gOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgcnY0MF9hZGFwdGl2ZV9sb29wX2ZpbHRlcigmci0+cmRzcCwgQywgcy0+dXZsaW5lc2l6ZSwgaio4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSwgYmV0YSwgYmV0YUMsIDEsIDEsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEluaXRpYWxpemUgZGVjb2Rlci4KKyAqLworc3RhdGljIGF2X2NvbGQgaW50IHJ2NDBfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFJWMzREZWNDb250ZXh0ICpyID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgci0+cnYzMCA9IDA7CisgICAgaWYgKChyZXQgPSBmZl9ydjM0X2RlY29kZV9pbml0KGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmKCFhaWNfdG9wX3ZsYy5iaXRzKQorICAgICAgICBydjQwX2luaXRfdGFibGVzKCk7CisgICAgci0+cGFyc2Vfc2xpY2VfaGVhZGVyID0gcnY0MF9wYXJzZV9zbGljZV9oZWFkZXI7CisgICAgci0+ZGVjb2RlX2ludHJhX3R5cGVzID0gcnY0MF9kZWNvZGVfaW50cmFfdHlwZXM7CisgICAgci0+ZGVjb2RlX21iX2luZm8gICAgID0gcnY0MF9kZWNvZGVfbWJfaW5mbzsKKyAgICByLT5sb29wX2ZpbHRlciAgICAgICAgPSBydjQwX2xvb3BfZmlsdGVyOworICAgIHItPmx1bWFfZGNfcXVhbnRfaSA9IHJ2NDBfbHVtYV9kY19xdWFudFswXTsKKyAgICByLT5sdW1hX2RjX3F1YW50X3AgPSBydjQwX2x1bWFfZGNfcXVhbnRbMV07CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfcnY0MF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAicnY0MCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsVmlkZW8gNC4wIiksCisgICAgLnR5cGUgICAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUlY0MCwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKFJWMzREZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gcnY0MF9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICAgICAgID0gZmZfcnYzNF9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICAgICAgICAgPSBmZl9ydjM0X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9ERUxBWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5mbHVzaCAgICAgICAgICAgICAgICAgPSBmZl9tcGVnX2ZsdXNoLAorICAgIC5waXhfZm10cyAgICAgICAgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorICAgIC5pbml0X3RocmVhZF9jb3B5ICAgICAgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChmZl9ydjM0X2RlY29kZV9pbml0X3RocmVhZF9jb3B5KSwKKyAgICAudXBkYXRlX3RocmVhZF9jb250ZXh0ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoZmZfcnYzNF9kZWNvZGVfdXBkYXRlX3RocmVhZF9jb250ZXh0KSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ydjQwZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnY0MGRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmY5ZjkxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnY0MGRhdGEuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIFJlYWxWaWRlbyA0IGRlY29kZXIKKyAqIGNvcHlyaWdodCAoYykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIG1pc2NlbGxhbmVvdXMgUlY0MCB0YWJsZXMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfUlY0MERBVEFfSAorI2RlZmluZSBBVkNPREVDX1JWNDBEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIHN0YW5kYXJkIHdpZHRocyBhbmQgaGVpZ2h0cyBjb2RlZCBpbiBSVjQwCisgKi8KKy8vQHsKK3N0YXRpYyBjb25zdCBpbnQgcnY0MF9zdGFuZGFyZF93aWR0aHNbXSAgID0geyAxNjAsIDE3MiwgMjQwLCAzMjAsIDM1MiwgNjQwLCA3MDQsIDB9Oworc3RhdGljIGNvbnN0IGludCBydjQwX3N0YW5kYXJkX2hlaWdodHNbXSAgPSB7IDEyMCwgMTMyLCAxNDQsIDI0MCwgMjg4LCA0ODAsIC04LCAtMTAsIDE4MCwgMzYwLCA1NzYsIDB9OworLy9AfQorCisjZGVmaW5lIE1PREUyX1BBVFRFUk5TX05VTSAyMAorLyoqCisgKiBpbnRyYSB0eXBlcyB0YWJsZQorICoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgYWN0dWFsbHkgY29kZWQgMy10dXBsZXMKKyAqIHVzZWQgZm9yIGRldGVjdGluZyBzdGFuZGFyZCBibG9jayBjb25maWd1cmF0aW9ucy4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IHJ2NDBfYWljX3RhYmxlX2luZGV4W01PREUyX1BBVFRFUk5TX05VTV0gPSB7CisgMHgwMDAsIDB4MTAwLCAweDIwMCwKKyAweDAxMSwgMHgxMTEsIDB4MjExLCAweDUxMSwgMHg2MTEsCisgMHgwMjIsIDB4MTIyLCAweDIyMiwgMHg3MjIsCisgMHgyNzIsIDB4MjI3LAorIDB4ODIyLCAweDI4MiwgMHgyMjgsCisgMHgxMTIsIDB4MTE2LCAweDIyMQorfTsKKworLyoqCisgKiBsdW1hIHF1YW50aXplciB2YWx1ZXMKKyAqIFRoZSBzZWNvbmQgdGFibGUgaXMgdXNlZCBmb3IgaW50ZXIgYmxvY2tzLgorICovCitzdGF0aWMgY29uc3QgdWludDhfdCBydjQwX2x1bWFfZGNfcXVhbnRbMl1bMzJdID0geworIHsgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAxNiwgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMiwgMjIsIDIyLCAyMiB9LAorIHsgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCB9Cit9OworCisvKioKKyAqIEBuYW1lIENvZWZmaWNpZW50cyB1c2VkIGJ5IHRoZSBSVjQwIGxvb3AgZmlsdGVyCisgKiBAeworICovCisKKy8qKiBhbHBoYSBwYXJhbWV0ZXIgZm9yIFJWNDAgbG9vcCBmaWx0ZXIgLSBhbG1vc3QgdGhlIHNhbWUgYXMgaW4gSlZULUEwMDNyMSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnY0MF9hbHBoYV90YWJbMzJdID0geworICAgIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LAorICAgIDEyOCwgMTI4LCAxMjIsICA5NiwgIDc1LCAgNTksICA0NywgIDM3LAorICAgICAyOSwgIDIzLCAgMTgsICAxNSwgIDEzLCAgMTEsICAxMCwgICA5LAorICAgICAgOCwgICA3LCAgIDYsICAgNSwgICA0LCAgIDMsICAgMiwgICAxCit9OworLyoqIGJldGEgcGFyYW1ldGVyIGZvciBSVjQwIGxvb3AgZmlsdGVyIC0gYWxtb3N0IHRoZSBzYW1lIGFzIGluIEpWVC1BMDAzcjEgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHJ2NDBfYmV0YV90YWJbMzJdID0geworICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDMsICAzLCAgMywgIDQsICA0LCAgNCwgIDYsICA2LAorICAgICA2LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3Cit9OworLyoqIGNsaXAgdGFibGUgZm9yIFJWNDAgbG9vcCBmaWx0ZXIgLSB0aGUgc2FtZSBhcyBpbiBKVlQtQTAwM3IxICovCitzdGF0aWMgY29uc3QgdWludDhfdCBydjQwX2ZpbHRlcl9jbGlwX3RibFszXVszMl0gPSB7CisgICAgeworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCisgICAgfSwKKyAgICB7CisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDUsIDUKKyAgICB9LAorICAgIHsKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgICAgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgNCwgNCwgNSwgNSwgNSwgNywgOCwgOQorICAgIH0KK307CisvKiogQH0gKi8gLy8gZW5kIGxvb3BmaWx0ZXIgZ3JvdXAKKworI2VuZGlmIC8qIEFWQ09ERUNfUlY0MERBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvcnY0MGRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnY0MGRzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjBlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9ydjQwZHNwLmMKQEAgLTAsMCArMSw3MDkgQEAKKy8qCisgKiBSVjQwIGRlY29kZXIgbW90aW9uIGNvbXBlbnNhdGlvbiBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJWNDAgZGVjb2RlciBtb3Rpb24gY29tcGVuc2F0aW9uIGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJoMjY0cXBlbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJwaXhlbHMuaCIKKyNpbmNsdWRlICJybmRfYXZnLmgiCisjaW5jbHVkZSAicnYzNGRzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorCisjZGVmaW5lIFJWNDBfTE9XUEFTUyhPUE5BTUUsIE9QKSBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnY0MF9xcGVsOF9oX2xvd3Bhc3ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaCwgY29uc3QgaW50IEMxLCBjb25zdCBpbnQgQzIsIGNvbnN0IGludCBTSElGVCl7XAorICAgIGNvbnN0IHVpbnQ4X3QgKmNtID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7XAorICAgIGludCBpO1wKKyAgICBmb3IoaSA9IDA7IGkgPCBoOyBpKyspXAorICAgIHtcCisgICAgICAgIE9QKGRzdFswXSwgKHNyY1stMl0gKyBzcmNbIDNdIC0gNSooc3JjWy0xXStzcmNbMl0pICsgc3JjWzBdKkMxICsgc3JjWzFdKkMyICsgKDE8PChTSElGVC0xKSkpID4+IFNISUZUKTtcCisgICAgICAgIE9QKGRzdFsxXSwgKHNyY1stMV0gKyBzcmNbIDRdIC0gNSooc3JjWyAwXStzcmNbM10pICsgc3JjWzFdKkMxICsgc3JjWzJdKkMyICsgKDE8PChTSElGVC0xKSkpID4+IFNISUZUKTtcCisgICAgICAgIE9QKGRzdFsyXSwgKHNyY1sgMF0gKyBzcmNbIDVdIC0gNSooc3JjWyAxXStzcmNbNF0pICsgc3JjWzJdKkMxICsgc3JjWzNdKkMyICsgKDE8PChTSElGVC0xKSkpID4+IFNISUZUKTtcCisgICAgICAgIE9QKGRzdFszXSwgKHNyY1sgMV0gKyBzcmNbIDZdIC0gNSooc3JjWyAyXStzcmNbNV0pICsgc3JjWzNdKkMxICsgc3JjWzRdKkMyICsgKDE8PChTSElGVC0xKSkpID4+IFNISUZUKTtcCisgICAgICAgIE9QKGRzdFs0XSwgKHNyY1sgMl0gKyBzcmNbIDddIC0gNSooc3JjWyAzXStzcmNbNl0pICsgc3JjWzRdKkMxICsgc3JjWzVdKkMyICsgKDE8PChTSElGVC0xKSkpID4+IFNISUZUKTtcCisgICAgICAgIE9QKGRzdFs1XSwgKHNyY1sgM10gKyBzcmNbIDhdIC0gNSooc3JjWyA0XStzcmNbN10pICsgc3JjWzVdKkMxICsgc3JjWzZdKkMyICsgKDE8PChTSElGVC0xKSkpID4+IFNISUZUKTtcCisgICAgICAgIE9QKGRzdFs2XSwgKHNyY1sgNF0gKyBzcmNbIDldIC0gNSooc3JjWyA1XStzcmNbOF0pICsgc3JjWzZdKkMxICsgc3JjWzddKkMyICsgKDE8PChTSElGVC0xKSkpID4+IFNISUZUKTtcCisgICAgICAgIE9QKGRzdFs3XSwgKHNyY1sgNV0gKyBzcmNbMTBdIC0gNSooc3JjWyA2XStzcmNbOV0pICsgc3JjWzddKkMxICsgc3JjWzhdKkMyICsgKDE8PChTSElGVC0xKSkpID4+IFNISUZUKTtcCisgICAgICAgIGRzdCArPSBkc3RTdHJpZGU7XAorICAgICAgICBzcmMgKz0gc3JjU3RyaWRlO1wKKyAgICB9XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBydjQwX3FwZWw4X3ZfbG93cGFzcyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHcsIGNvbnN0IGludCBDMSwgY29uc3QgaW50IEMyLCBjb25zdCBpbnQgU0hJRlQpe1wKKyAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QO1wKKyAgICBpbnQgaTtcCisgICAgZm9yKGkgPSAwOyBpIDwgdzsgaSsrKVwKKyAgICB7XAorICAgICAgICBjb25zdCBpbnQgc3JjQiAgPSBzcmNbLTIqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmNBICA9IHNyY1stMSpzcmNTdHJpZGVdO1wKKyAgICAgICAgY29uc3QgaW50IHNyYzAgID0gc3JjWzAgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjMSAgPSBzcmNbMSAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmMyICA9IHNyY1syICpzcmNTdHJpZGVdO1wKKyAgICAgICAgY29uc3QgaW50IHNyYzMgID0gc3JjWzMgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjNCAgPSBzcmNbNCAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM1ICA9IHNyY1s1ICpzcmNTdHJpZGVdO1wKKyAgICAgICAgY29uc3QgaW50IHNyYzYgID0gc3JjWzYgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjNyAgPSBzcmNbNyAqc3JjU3RyaWRlXTtcCisgICAgICAgIGNvbnN0IGludCBzcmM4ICA9IHNyY1s4ICpzcmNTdHJpZGVdO1wKKyAgICAgICAgY29uc3QgaW50IHNyYzkgID0gc3JjWzkgKnNyY1N0cmlkZV07XAorICAgICAgICBjb25zdCBpbnQgc3JjMTAgPSBzcmNbMTAqc3JjU3RyaWRlXTtcCisgICAgICAgIE9QKGRzdFswKmRzdFN0cmlkZV0sIChzcmNCICsgc3JjMyAgLSA1KihzcmNBK3NyYzIpICsgc3JjMCpDMSArIHNyYzEqQzIgKyAoMTw8KFNISUZULTEpKSkgPj4gU0hJRlQpO1wKKyAgICAgICAgT1AoZHN0WzEqZHN0U3RyaWRlXSwgKHNyY0EgKyBzcmM0ICAtIDUqKHNyYzArc3JjMykgKyBzcmMxKkMxICsgc3JjMipDMiArICgxPDwoU0hJRlQtMSkpKSA+PiBTSElGVCk7XAorICAgICAgICBPUChkc3RbMipkc3RTdHJpZGVdLCAoc3JjMCArIHNyYzUgIC0gNSooc3JjMStzcmM0KSArIHNyYzIqQzEgKyBzcmMzKkMyICsgKDE8PChTSElGVC0xKSkpID4+IFNISUZUKTtcCisgICAgICAgIE9QKGRzdFszKmRzdFN0cmlkZV0sIChzcmMxICsgc3JjNiAgLSA1KihzcmMyK3NyYzUpICsgc3JjMypDMSArIHNyYzQqQzIgKyAoMTw8KFNISUZULTEpKSkgPj4gU0hJRlQpO1wKKyAgICAgICAgT1AoZHN0WzQqZHN0U3RyaWRlXSwgKHNyYzIgKyBzcmM3ICAtIDUqKHNyYzMrc3JjNikgKyBzcmM0KkMxICsgc3JjNSpDMiArICgxPDwoU0hJRlQtMSkpKSA+PiBTSElGVCk7XAorICAgICAgICBPUChkc3RbNSpkc3RTdHJpZGVdLCAoc3JjMyArIHNyYzggIC0gNSooc3JjNCtzcmM3KSArIHNyYzUqQzEgKyBzcmM2KkMyICsgKDE8PChTSElGVC0xKSkpID4+IFNISUZUKTtcCisgICAgICAgIE9QKGRzdFs2KmRzdFN0cmlkZV0sIChzcmM0ICsgc3JjOSAgLSA1KihzcmM1K3NyYzgpICsgc3JjNipDMSArIHNyYzcqQzIgKyAoMTw8KFNISUZULTEpKSkgPj4gU0hJRlQpO1wKKyAgICAgICAgT1AoZHN0WzcqZHN0U3RyaWRlXSwgKHNyYzUgKyBzcmMxMCAtIDUqKHNyYzYrc3JjOSkgKyBzcmM3KkMxICsgc3JjOCpDMiArICgxPDwoU0hJRlQtMSkpKSA+PiBTSElGVCk7XAorICAgICAgICBkc3QrKztcCisgICAgICAgIHNyYysrO1wKKyAgICB9XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBydjQwX3FwZWwxNl92X2xvd3Bhc3ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdywgY29uc3QgaW50IEMxLCBjb25zdCBpbnQgQzIsIGNvbnN0IGludCBTSElGVCl7XAorICAgIE9QTkFNRSAjIyBydjQwX3FwZWw4X3ZfbG93cGFzcyhkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCA4LCBDMSwgQzIsIFNISUZUKTtcCisgICAgT1BOQU1FICMjIHJ2NDBfcXBlbDhfdl9sb3dwYXNzKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIDgsIEMxLCBDMiwgU0hJRlQpO1wKKyAgICBzcmMgKz0gOCpzcmNTdHJpZGU7XAorICAgIGRzdCArPSA4KmRzdFN0cmlkZTtcCisgICAgT1BOQU1FICMjIHJ2NDBfcXBlbDhfdl9sb3dwYXNzKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIHctOCwgQzEsIEMyLCBTSElGVCk7XAorICAgIE9QTkFNRSAjIyBydjQwX3FwZWw4X3ZfbG93cGFzcyhkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCB3LTgsIEMxLCBDMiwgU0hJRlQpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnY0MF9xcGVsMTZfaF9sb3dwYXNzKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGgsIGNvbnN0IGludCBDMSwgY29uc3QgaW50IEMyLCBjb25zdCBpbnQgU0hJRlQpe1wKKyAgICBPUE5BTUUgIyMgcnY0MF9xcGVsOF9oX2xvd3Bhc3MoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgOCwgQzEsIEMyLCBTSElGVCk7XAorICAgIE9QTkFNRSAjIyBydjQwX3FwZWw4X2hfbG93cGFzcyhkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCA4LCBDMSwgQzIsIFNISUZUKTtcCisgICAgc3JjICs9IDgqc3JjU3RyaWRlO1wKKyAgICBkc3QgKz0gOCpkc3RTdHJpZGU7XAorICAgIE9QTkFNRSAjIyBydjQwX3FwZWw4X2hfbG93cGFzcyhkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCBoLTgsIEMxLCBDMiwgU0hJRlQpO1wKKyAgICBPUE5BTUUgIyMgcnY0MF9xcGVsOF9oX2xvd3Bhc3MoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgaC04LCBDMSwgQzIsIFNISUZUKTtcCit9XAorXAorCisjZGVmaW5lIFJWNDBfTUMoT1BOQU1FLCBTSVpFKSBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnY0MF9xcGVsICMjIFNJWkUgIyMgX21jMTBfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIE9QTkFNRSAjIyBydjQwX3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzKGRzdCwgc3JjLCBzdHJpZGUsIHN0cmlkZSwgU0laRSwgNTIsIDIwLCA2KTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2NDBfcXBlbCAjIyBTSVpFICMjIF9tYzMwX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBPUE5BTUUgIyMgcnY0MF9xcGVsICMjIFNJWkUgIyMgX2hfbG93cGFzcyhkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUsIFNJWkUsIDIwLCA1MiwgNik7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBydjQwX3FwZWwgIyMgU0laRSAjIyBfbWMwMV9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgT1BOQU1FICMjIHJ2NDBfcXBlbCAjIyBTSVpFICMjIF92X2xvd3Bhc3MoZHN0LCBzcmMsIHN0cmlkZSwgc3RyaWRlLCBTSVpFLCA1MiwgMjAsIDYpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnY0MF9xcGVsICMjIFNJWkUgIyMgX21jMTFfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIHVpbnQ4X3QgZnVsbFtTSVpFKihTSVpFKzUpXTtcCisgICAgdWludDhfdCAqIGNvbnN0IGZ1bGxfbWlkID0gZnVsbCArIFNJWkUqMjtcCisgICAgcHV0X3J2NDBfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3MoZnVsbCwgc3JjIC0gMipzdHJpZGUsIFNJWkUsIHN0cmlkZSwgU0laRSs1LCA1MiwgMjAsIDYpO1wKKyAgICBPUE5BTUUgIyMgcnY0MF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzcyhkc3QsIGZ1bGxfbWlkLCBzdHJpZGUsIFNJWkUsIFNJWkUsIDUyLCAyMCwgNik7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBydjQwX3FwZWwgIyMgU0laRSAjIyBfbWMyMV9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgdWludDhfdCBmdWxsW1NJWkUqKFNJWkUrNSldO1wKKyAgICB1aW50OF90ICogY29uc3QgZnVsbF9taWQgPSBmdWxsICsgU0laRSoyO1wKKyAgICBwdXRfcnY0MF9xcGVsICMjIFNJWkUgIyMgX2hfbG93cGFzcyhmdWxsLCBzcmMgLSAyKnN0cmlkZSwgU0laRSwgc3RyaWRlLCBTSVpFKzUsIDIwLCAyMCwgNSk7XAorICAgIE9QTkFNRSAjIyBydjQwX3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzKGRzdCwgZnVsbF9taWQsIHN0cmlkZSwgU0laRSwgU0laRSwgNTIsIDIwLCA2KTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2NDBfcXBlbCAjIyBTSVpFICMjIF9tYzMxX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICB1aW50OF90IGZ1bGxbU0laRSooU0laRSs1KV07XAorICAgIHVpbnQ4X3QgKiBjb25zdCBmdWxsX21pZCA9IGZ1bGwgKyBTSVpFKjI7XAorICAgIHB1dF9ydjQwX3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzKGZ1bGwsIHNyYyAtIDIqc3RyaWRlLCBTSVpFLCBzdHJpZGUsIFNJWkUrNSwgMjAsIDUyLCA2KTtcCisgICAgT1BOQU1FICMjIHJ2NDBfcXBlbCAjIyBTSVpFICMjIF92X2xvd3Bhc3MoZHN0LCBmdWxsX21pZCwgc3RyaWRlLCBTSVpFLCBTSVpFLCA1MiwgMjAsIDYpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnY0MF9xcGVsICMjIFNJWkUgIyMgX21jMTJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIHVpbnQ4X3QgZnVsbFtTSVpFKihTSVpFKzUpXTtcCisgICAgdWludDhfdCAqIGNvbnN0IGZ1bGxfbWlkID0gZnVsbCArIFNJWkUqMjtcCisgICAgcHV0X3J2NDBfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3MoZnVsbCwgc3JjIC0gMipzdHJpZGUsIFNJWkUsIHN0cmlkZSwgU0laRSs1LCA1MiwgMjAsIDYpO1wKKyAgICBPUE5BTUUgIyMgcnY0MF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzcyhkc3QsIGZ1bGxfbWlkLCBzdHJpZGUsIFNJWkUsIFNJWkUsIDIwLCAyMCwgNSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBydjQwX3FwZWwgIyMgU0laRSAjIyBfbWMyMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgdWludDhfdCBmdWxsW1NJWkUqKFNJWkUrNSldO1wKKyAgICB1aW50OF90ICogY29uc3QgZnVsbF9taWQgPSBmdWxsICsgU0laRSoyO1wKKyAgICBwdXRfcnY0MF9xcGVsICMjIFNJWkUgIyMgX2hfbG93cGFzcyhmdWxsLCBzcmMgLSAyKnN0cmlkZSwgU0laRSwgc3RyaWRlLCBTSVpFKzUsIDIwLCAyMCwgNSk7XAorICAgIE9QTkFNRSAjIyBydjQwX3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzKGRzdCwgZnVsbF9taWQsIHN0cmlkZSwgU0laRSwgU0laRSwgMjAsIDIwLCA1KTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2NDBfcXBlbCAjIyBTSVpFICMjIF9tYzMyX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICB1aW50OF90IGZ1bGxbU0laRSooU0laRSs1KV07XAorICAgIHVpbnQ4X3QgKiBjb25zdCBmdWxsX21pZCA9IGZ1bGwgKyBTSVpFKjI7XAorICAgIHB1dF9ydjQwX3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzKGZ1bGwsIHNyYyAtIDIqc3RyaWRlLCBTSVpFLCBzdHJpZGUsIFNJWkUrNSwgMjAsIDUyLCA2KTtcCisgICAgT1BOQU1FICMjIHJ2NDBfcXBlbCAjIyBTSVpFICMjIF92X2xvd3Bhc3MoZHN0LCBmdWxsX21pZCwgc3RyaWRlLCBTSVpFLCBTSVpFLCAyMCwgMjAsIDUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnY0MF9xcGVsICMjIFNJWkUgIyMgX21jMDNfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIE9QTkFNRSAjIyBydjQwX3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzKGRzdCwgc3JjLCBzdHJpZGUsIHN0cmlkZSwgU0laRSwgMjAsIDUyLCA2KTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2NDBfcXBlbCAjIyBTSVpFICMjIF9tYzEzX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICB1aW50OF90IGZ1bGxbU0laRSooU0laRSs1KV07XAorICAgIHVpbnQ4X3QgKiBjb25zdCBmdWxsX21pZCA9IGZ1bGwgKyBTSVpFKjI7XAorICAgIHB1dF9ydjQwX3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzKGZ1bGwsIHNyYyAtIDIqc3RyaWRlLCBTSVpFLCBzdHJpZGUsIFNJWkUrNSwgNTIsIDIwLCA2KTtcCisgICAgT1BOQU1FICMjIHJ2NDBfcXBlbCAjIyBTSVpFICMjIF92X2xvd3Bhc3MoZHN0LCBmdWxsX21pZCwgc3RyaWRlLCBTSVpFLCBTSVpFLCAyMCwgNTIsIDYpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnY0MF9xcGVsICMjIFNJWkUgIyMgX21jMjNfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIHVpbnQ4X3QgZnVsbFtTSVpFKihTSVpFKzUpXTtcCisgICAgdWludDhfdCAqIGNvbnN0IGZ1bGxfbWlkID0gZnVsbCArIFNJWkUqMjtcCisgICAgcHV0X3J2NDBfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3MoZnVsbCwgc3JjIC0gMipzdHJpZGUsIFNJWkUsIHN0cmlkZSwgU0laRSs1LCAyMCwgMjAsIDUpO1wKKyAgICBPUE5BTUUgIyMgcnY0MF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzcyhkc3QsIGZ1bGxfbWlkLCBzdHJpZGUsIFNJWkUsIFNJWkUsIDIwLCA1MiwgNik7XAorfVwKK1wKKworI2RlZmluZSBvcF9hdmcoYSwgYikgIGEgPSAoKChhKStjbVtiXSsxKT4+MSkKKyNkZWZpbmUgb3BfcHV0KGEsIGIpICBhID0gY21bYl0KKworUlY0MF9MT1dQQVNTKHB1dF8gICAgICAgLCBvcF9wdXQpCitSVjQwX0xPV1BBU1MoYXZnXyAgICAgICAsIG9wX2F2ZykKKworI3VuZGVmIG9wX2F2ZworI3VuZGVmIG9wX3B1dAorCitSVjQwX01DKHB1dF8sIDgpCitSVjQwX01DKHB1dF8sIDE2KQorUlY0MF9NQyhhdmdfLCA4KQorUlY0MF9NQyhhdmdfLCAxNikKKworI2RlZmluZSBQSVhPUDIoT1BOQU1FLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGlubGluZSB2b2lkIE9QTkFNRSAjIyBfcGl4ZWxzOF94eTJfOF9jKHVpbnQ4X3QgKmJsb2NrLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKSAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEZJWE1FIEhJR0ggQklUIERFUFRIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCB1aW50MzJfdCBhID0gQVZfUk4zMihwaXhlbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCB1aW50MzJfdCBiID0gQVZfUk4zMihwaXhlbHMgKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MzJfdCBsMCA9IChhICYgMHgwMzAzMDMwM1VMKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIChiICYgMHgwMzAzMDMwM1VMKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyMDIwMlVMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MzJfdCBoMCA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MzJfdCBsMSwgaDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSArPSAyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDMyX3QgYSA9IEFWX1JOMzIocGl4ZWxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDMyX3QgYiA9IEFWX1JOMzIocGl4ZWxzICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbDEgPSAoYSAmIDB4MDMwMzAzMDNVTCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAoYiAmIDB4MDMwMzAzMDNVTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaDEgPSAoKGEgJiAweEZDRkNGQ0ZDVUwpID4+IDIpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAoKGIgJiAweEZDRkNGQ0ZDVUwpID4+IDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgT1AoKigodWludDMyX3QgKikgYmxvY2spLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgaDAgKyBoMSArICgoKGwwICsgbDEpID4+IDIpICYgMHgwRjBGMEYwRlVMKSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYmxvY2sgICs9IGxpbmVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYSA9IEFWX1JOMzIocGl4ZWxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYiA9IEFWX1JOMzIocGl4ZWxzICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbDAgPSAoYSAmIDB4MDMwMzAzMDNVTCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAoYiAmIDB4MDMwMzAzMDNVTCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMjAyMDJVTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaDAgPSAoKGEgJiAweEZDRkNGQ0ZDVUwpID4+IDIpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAoKGIgJiAweEZDRkNGQ0ZDVUwpID4+IDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgT1AoKigodWludDMyX3QgKikgYmxvY2spLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgaDAgKyBoMSArICgoKGwwICsgbDEpID4+IDIpICYgMHgwRjBGMEYwRlVMKSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYmxvY2sgICs9IGxpbmVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwaXhlbHMgKz0gNCAtIGxpbmVfc2l6ZSAqIChoICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBibG9jayAgKz0gNCAtIGxpbmVfc2l6ZSAqIGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorQ0FMTF8yWF9QSVhFTFMoT1BOQU1FICMjIF9waXhlbHMxNl94eTJfOF9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgT1BOQU1FICMjIF9waXhlbHM4X3h5Ml84X2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIG9wX2F2ZyhhLCBiKSBhID0gcm5kX2F2ZzMyKGEsIGIpCisjZGVmaW5lIG9wX3B1dChhLCBiKSBhID0gYgorUElYT1AyKGF2Zywgb3BfYXZnKQorUElYT1AyKHB1dCwgb3BfcHV0KQorI3VuZGVmIG9wX2F2ZworI3VuZGVmIG9wX3B1dAorCitzdGF0aWMgdm9pZCBwdXRfcnY0MF9xcGVsMTZfbWMzM19jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHB1dF9waXhlbHMxNl94eTJfOF9jKGRzdCwgc3JjLCBzdHJpZGUsIDE2KTsKK30KK3N0YXRpYyB2b2lkIGF2Z19ydjQwX3FwZWwxNl9tYzMzX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgYXZnX3BpeGVsczE2X3h5Ml84X2MoZHN0LCBzcmMsIHN0cmlkZSwgMTYpOworfQorc3RhdGljIHZvaWQgcHV0X3J2NDBfcXBlbDhfbWMzM19jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHB1dF9waXhlbHM4X3h5Ml84X2MoZHN0LCBzcmMsIHN0cmlkZSwgOCk7Cit9CitzdGF0aWMgdm9pZCBhdmdfcnY0MF9xcGVsOF9tYzMzX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgYXZnX3BpeGVsczhfeHkyXzhfYyhkc3QsIHNyYywgc3RyaWRlLCA4KTsKK30KKworc3RhdGljIGNvbnN0IGludCBydjQwX2JpYXNbNF1bNF0gPSB7CisgICAgeyAgMCwgMTYsIDMyLCAxNiB9LAorICAgIHsgMzIsIDI4LCAzMiwgMjggfSwKKyAgICB7ICAwLCAzMiwgMTYsIDMyIH0sCisgICAgeyAzMiwgMjgsIDMyLCAyOCB9Cit9OworCisjZGVmaW5lIFJWNDBfQ0hST01BX01DKE9QTkFNRSwgT1ApXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2NDBfY2hyb21hX21jNF9jKHVpbnQ4X3QgKmRzdC8qYWxpZ24gOCovLCB1aW50OF90ICpzcmMvKmFsaWduIDEqLywgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSl7XAorICAgIGNvbnN0IGludCBBID0gKDgteCkgKiAoOC15KTtcCisgICAgY29uc3QgaW50IEIgPSAoICB4KSAqICg4LXkpO1wKKyAgICBjb25zdCBpbnQgQyA9ICg4LXgpICogKCAgeSk7XAorICAgIGNvbnN0IGludCBEID0gKCAgeCkgKiAoICB5KTtcCisgICAgaW50IGk7XAorICAgIGludCBiaWFzID0gcnY0MF9iaWFzW3k+PjFdW3g+PjFdO1wKKyAgICBcCisgICAgYXZfYXNzZXJ0Mih4PDggJiYgeTw4ICYmIHg+PTAgJiYgeT49MCk7XAorXAorICAgIGlmKEQpe1wKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgaDsgaSsrKXtcCisgICAgICAgICAgICBPUChkc3RbMF0sIChBKnNyY1swXSArIEIqc3JjWzFdICsgQypzcmNbc3RyaWRlKzBdICsgRCpzcmNbc3RyaWRlKzFdICsgYmlhcykpO1wKKyAgICAgICAgICAgIE9QKGRzdFsxXSwgKEEqc3JjWzFdICsgQipzcmNbMl0gKyBDKnNyY1tzdHJpZGUrMV0gKyBEKnNyY1tzdHJpZGUrMl0gKyBiaWFzKSk7XAorICAgICAgICAgICAgT1AoZHN0WzJdLCAoQSpzcmNbMl0gKyBCKnNyY1szXSArIEMqc3JjW3N0cmlkZSsyXSArIEQqc3JjW3N0cmlkZSszXSArIGJpYXMpKTtcCisgICAgICAgICAgICBPUChkc3RbM10sIChBKnNyY1szXSArIEIqc3JjWzRdICsgQypzcmNbc3RyaWRlKzNdICsgRCpzcmNbc3RyaWRlKzRdICsgYmlhcykpO1wKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7XAorICAgICAgICAgICAgc3JjICs9IHN0cmlkZTtcCisgICAgICAgIH1cCisgICAgfWVsc2V7XAorICAgICAgICBjb25zdCBpbnQgRSA9IEIgKyBDO1wKKyAgICAgICAgY29uc3QgaW50IHN0ZXAgPSBDID8gc3RyaWRlIDogMTtcCisgICAgICAgIGZvcihpID0gMDsgaSA8IGg7IGkrKyl7XAorICAgICAgICAgICAgT1AoZHN0WzBdLCAoQSpzcmNbMF0gKyBFKnNyY1tzdGVwKzBdICsgYmlhcykpO1wKKyAgICAgICAgICAgIE9QKGRzdFsxXSwgKEEqc3JjWzFdICsgRSpzcmNbc3RlcCsxXSArIGJpYXMpKTtcCisgICAgICAgICAgICBPUChkc3RbMl0sIChBKnNyY1syXSArIEUqc3JjW3N0ZXArMl0gKyBiaWFzKSk7XAorICAgICAgICAgICAgT1AoZHN0WzNdLCAoQSpzcmNbM10gKyBFKnNyY1tzdGVwKzNdICsgYmlhcykpO1wKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7XAorICAgICAgICAgICAgc3JjICs9IHN0cmlkZTtcCisgICAgICAgIH1cCisgICAgfVwKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnY0MF9jaHJvbWFfbWM4X2ModWludDhfdCAqZHN0LyphbGlnbiA4Ki8sIHVpbnQ4X3QgKnNyYy8qYWxpZ24gMSovLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KXtcCisgICAgY29uc3QgaW50IEEgPSAoOC14KSAqICg4LXkpO1wKKyAgICBjb25zdCBpbnQgQiA9ICggIHgpICogKDgteSk7XAorICAgIGNvbnN0IGludCBDID0gKDgteCkgKiAoICB5KTtcCisgICAgY29uc3QgaW50IEQgPSAoICB4KSAqICggIHkpO1wKKyAgICBpbnQgaTtcCisgICAgaW50IGJpYXMgPSBydjQwX2JpYXNbeT4+MV1beD4+MV07XAorICAgIFwKKyAgICBhdl9hc3NlcnQyKHg8OCAmJiB5PDggJiYgeD49MCAmJiB5Pj0wKTtcCitcCisgICAgaWYoRCl7XAorICAgICAgICBmb3IoaSA9IDA7IGkgPCBoOyBpKyspe1wKKyAgICAgICAgICAgIE9QKGRzdFswXSwgKEEqc3JjWzBdICsgQipzcmNbMV0gKyBDKnNyY1tzdHJpZGUrMF0gKyBEKnNyY1tzdHJpZGUrMV0gKyBiaWFzKSk7XAorICAgICAgICAgICAgT1AoZHN0WzFdLCAoQSpzcmNbMV0gKyBCKnNyY1syXSArIEMqc3JjW3N0cmlkZSsxXSArIEQqc3JjW3N0cmlkZSsyXSArIGJpYXMpKTtcCisgICAgICAgICAgICBPUChkc3RbMl0sIChBKnNyY1syXSArIEIqc3JjWzNdICsgQypzcmNbc3RyaWRlKzJdICsgRCpzcmNbc3RyaWRlKzNdICsgYmlhcykpO1wKKyAgICAgICAgICAgIE9QKGRzdFszXSwgKEEqc3JjWzNdICsgQipzcmNbNF0gKyBDKnNyY1tzdHJpZGUrM10gKyBEKnNyY1tzdHJpZGUrNF0gKyBiaWFzKSk7XAorICAgICAgICAgICAgT1AoZHN0WzRdLCAoQSpzcmNbNF0gKyBCKnNyY1s1XSArIEMqc3JjW3N0cmlkZSs0XSArIEQqc3JjW3N0cmlkZSs1XSArIGJpYXMpKTtcCisgICAgICAgICAgICBPUChkc3RbNV0sIChBKnNyY1s1XSArIEIqc3JjWzZdICsgQypzcmNbc3RyaWRlKzVdICsgRCpzcmNbc3RyaWRlKzZdICsgYmlhcykpO1wKKyAgICAgICAgICAgIE9QKGRzdFs2XSwgKEEqc3JjWzZdICsgQipzcmNbN10gKyBDKnNyY1tzdHJpZGUrNl0gKyBEKnNyY1tzdHJpZGUrN10gKyBiaWFzKSk7XAorICAgICAgICAgICAgT1AoZHN0WzddLCAoQSpzcmNbN10gKyBCKnNyY1s4XSArIEMqc3JjW3N0cmlkZSs3XSArIEQqc3JjW3N0cmlkZSs4XSArIGJpYXMpKTtcCisgICAgICAgICAgICBkc3QgKz0gc3RyaWRlO1wKKyAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7XAorICAgICAgICB9XAorICAgIH1lbHNle1wKKyAgICAgICAgY29uc3QgaW50IEUgPSBCICsgQztcCisgICAgICAgIGNvbnN0IGludCBzdGVwID0gQyA/IHN0cmlkZSA6IDE7XAorICAgICAgICBmb3IoaSA9IDA7IGkgPCBoOyBpKyspe1wKKyAgICAgICAgICAgIE9QKGRzdFswXSwgKEEqc3JjWzBdICsgRSpzcmNbc3RlcCswXSArIGJpYXMpKTtcCisgICAgICAgICAgICBPUChkc3RbMV0sIChBKnNyY1sxXSArIEUqc3JjW3N0ZXArMV0gKyBiaWFzKSk7XAorICAgICAgICAgICAgT1AoZHN0WzJdLCAoQSpzcmNbMl0gKyBFKnNyY1tzdGVwKzJdICsgYmlhcykpO1wKKyAgICAgICAgICAgIE9QKGRzdFszXSwgKEEqc3JjWzNdICsgRSpzcmNbc3RlcCszXSArIGJpYXMpKTtcCisgICAgICAgICAgICBPUChkc3RbNF0sIChBKnNyY1s0XSArIEUqc3JjW3N0ZXArNF0gKyBiaWFzKSk7XAorICAgICAgICAgICAgT1AoZHN0WzVdLCAoQSpzcmNbNV0gKyBFKnNyY1tzdGVwKzVdICsgYmlhcykpO1wKKyAgICAgICAgICAgIE9QKGRzdFs2XSwgKEEqc3JjWzZdICsgRSpzcmNbc3RlcCs2XSArIGJpYXMpKTtcCisgICAgICAgICAgICBPUChkc3RbN10sIChBKnNyY1s3XSArIEUqc3JjW3N0ZXArN10gKyBiaWFzKSk7XAorICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTtcCisgICAgICAgICAgICBzcmMgKz0gc3RyaWRlO1wKKyAgICAgICAgfVwKKyAgICB9XAorfQorCisjZGVmaW5lIG9wX2F2ZyhhLCBiKSBhID0gKCgoYSkrKChiKT4+NikrMSk+PjEpCisjZGVmaW5lIG9wX3B1dChhLCBiKSBhID0gKChiKT4+NikKKworUlY0MF9DSFJPTUFfTUMocHV0Xywgb3BfcHV0KQorUlY0MF9DSFJPTUFfTUMoYXZnXywgb3BfYXZnKQorCisjZGVmaW5lIFJWNDBfV0VJR0hUX0ZVTkMoc2l6ZSkgXAorc3RhdGljIHZvaWQgcnY0MF93ZWlnaHRfZnVuY19ybmRfICMjIHNpemUgKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjMSwgdWludDhfdCAqc3JjMiwgaW50IHcxLCBpbnQgdzIsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBpbnQgaSwgajtcCitcCisgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykge1wKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKylcCisgICAgICAgICAgICBkc3RbaV0gPSAoKCh3MiAqIHNyYzFbaV0pID4+IDkpICsgKCh3MSAqIHNyYzJbaV0pID4+IDkpICsgMHgxMCkgPj4gNTtcCisgICAgICAgIHNyYzEgKz0gc3RyaWRlO1wKKyAgICAgICAgc3JjMiArPSBzdHJpZGU7XAorICAgICAgICBkc3QgICs9IHN0cmlkZTtcCisgICAgfVwKK31cCitzdGF0aWMgdm9pZCBydjQwX3dlaWdodF9mdW5jX25vcm5kXyAjIyBzaXplICh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYzEsIHVpbnQ4X3QgKnNyYzIsIGludCB3MSwgaW50IHcyLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgaW50IGksIGo7XAorXAorICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHtcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspXAorICAgICAgICAgICAgZHN0W2ldID0gKHcyICogc3JjMVtpXSArIHcxICogc3JjMltpXSArIDB4MTApID4+IDU7XAorICAgICAgICBzcmMxICs9IHN0cmlkZTtcCisgICAgICAgIHNyYzIgKz0gc3RyaWRlO1wKKyAgICAgICAgZHN0ICArPSBzdHJpZGU7XAorICAgIH1cCit9CisKK1JWNDBfV0VJR0hUX0ZVTkMoMTYpCitSVjQwX1dFSUdIVF9GVU5DKDgpCisKKy8qKgorICogZGl0aGVyIHZhbHVlcyBmb3IgZGVibG9ja2luZyBmaWx0ZXIgLSBsZWZ0L3RvcCB2YWx1ZXMKKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnY0MF9kaXRoZXJfbFsxNl0gPSB7CisgICAgMHg0MCwgMHg1MCwgMHgyMCwgMHg2MCwgMHgzMCwgMHg1MCwgMHg0MCwgMHgzMCwKKyAgICAweDUwLCAweDQwLCAweDUwLCAweDMwLCAweDYwLCAweDIwLCAweDUwLCAweDQwCit9OworCisvKioKKyAqIGRpdGhlciB2YWx1ZXMgZm9yIGRlYmxvY2tpbmcgZmlsdGVyIC0gcmlnaHQvYm90dG9tIHZhbHVlcworICovCitzdGF0aWMgY29uc3QgdWludDhfdCBydjQwX2RpdGhlcl9yWzE2XSA9IHsKKyAgICAweDQwLCAweDMwLCAweDYwLCAweDIwLCAweDUwLCAweDMwLCAweDMwLCAweDQwLAorICAgIDB4NDAsIDB4NDAsIDB4NTAsIDB4MzAsIDB4MjAsIDB4NjAsIDB4MzAsIDB4NDAKK307CisKKyNkZWZpbmUgQ0xJUF9TWU1NKGEsIGIpIGF2X2NsaXAoYSwgLShiKSwgYikKKy8qKgorICogd2Vha2VyIGRlYmxvY2tpbmcgdmVyeSBzaW1pbGFyIHRvIHRoZSBvbmUgZGVzY3JpYmVkIGluIDQuNC4yIG9mIEpWVC1BMDAzcjEKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBydjQwX3dlYWtfbG9vcF9maWx0ZXIodWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZpbHRlcl9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmaWx0ZXJfcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsaW1fcDBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsaW1fcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGltX3AxKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmNtID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IGksIHQsIHUsIGRpZmY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBzcmMgKz0gc3RyaWRlKSB7CisgICAgICAgIGludCBkaWZmX3AxcDAgPSBzcmNbLTIqc3RlcF0gLSBzcmNbLTEqc3RlcF07CisgICAgICAgIGludCBkaWZmX3ExcTAgPSBzcmNbIDEqc3RlcF0gLSBzcmNbIDAqc3RlcF07CisgICAgICAgIGludCBkaWZmX3AxcDIgPSBzcmNbLTIqc3RlcF0gLSBzcmNbLTMqc3RlcF07CisgICAgICAgIGludCBkaWZmX3ExcTIgPSBzcmNbIDEqc3RlcF0gLSBzcmNbIDIqc3RlcF07CisKKyAgICAgICAgdCA9IHNyY1swKnN0ZXBdIC0gc3JjWy0xKnN0ZXBdOworICAgICAgICBpZiAoIXQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICB1ID0gKGFscGhhICogRkZBQlModCkpID4+IDc7CisgICAgICAgIGlmICh1ID4gMyAtIChmaWx0ZXJfcDEgJiYgZmlsdGVyX3ExKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHQgPDw9IDI7CisgICAgICAgIGlmIChmaWx0ZXJfcDEgJiYgZmlsdGVyX3ExKQorICAgICAgICAgICAgdCArPSBzcmNbLTIqc3RlcF0gLSBzcmNbMSpzdGVwXTsKKworICAgICAgICBkaWZmID0gQ0xJUF9TWU1NKCh0ICsgNCkgPj4gMywgbGltX3AwcTApOworICAgICAgICBzcmNbLTEqc3RlcF0gPSBjbVtzcmNbLTEqc3RlcF0gKyBkaWZmXTsKKyAgICAgICAgc3JjWyAwKnN0ZXBdID0gY21bc3JjWyAwKnN0ZXBdIC0gZGlmZl07CisKKyAgICAgICAgaWYgKGZpbHRlcl9wMSAmJiBGRkFCUyhkaWZmX3AxcDIpIDw9IGJldGEpIHsKKyAgICAgICAgICAgIHQgPSAoZGlmZl9wMXAwICsgZGlmZl9wMXAyIC0gZGlmZikgPj4gMTsKKyAgICAgICAgICAgIHNyY1stMipzdGVwXSA9IGNtW3NyY1stMipzdGVwXSAtIENMSVBfU1lNTSh0LCBsaW1fcDEpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWx0ZXJfcTEgJiYgRkZBQlMoZGlmZl9xMXEyKSA8PSBiZXRhKSB7CisgICAgICAgICAgICB0ID0gKGRpZmZfcTFxMCArIGRpZmZfcTFxMiArIGRpZmYpID4+IDE7CisgICAgICAgICAgICBzcmNbIDEqc3RlcF0gPSBjbVtzcmNbIDEqc3RlcF0gLSBDTElQX1NZTU0odCwgbGltX3ExKV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJ2NDBfaF93ZWFrX2xvb3BfZmlsdGVyKHVpbnQ4X3QgKnNyYywgY29uc3QgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmaWx0ZXJfcDEsIGNvbnN0IGludCBmaWx0ZXJfcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYWxwaGEsIGNvbnN0IGludCBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxpbV9wMHEwLCBjb25zdCBpbnQgbGltX3ExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxpbV9wMSkKK3sKKyAgICBydjQwX3dlYWtfbG9vcF9maWx0ZXIoc3JjLCBzdHJpZGUsIDEsIGZpbHRlcl9wMSwgZmlsdGVyX3ExLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSwgYmV0YSwgbGltX3AwcTAsIGxpbV9xMSwgbGltX3AxKTsKK30KKworc3RhdGljIHZvaWQgcnY0MF92X3dlYWtfbG9vcF9maWx0ZXIodWludDhfdCAqc3JjLCBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZpbHRlcl9wMSwgY29uc3QgaW50IGZpbHRlcl9xMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBhbHBoYSwgY29uc3QgaW50IGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGltX3AwcTAsIGNvbnN0IGludCBsaW1fcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGltX3AxKQoreworICAgIHJ2NDBfd2Vha19sb29wX2ZpbHRlcihzcmMsIDEsIHN0cmlkZSwgZmlsdGVyX3AxLCBmaWx0ZXJfcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLCBiZXRhLCBsaW1fcDBxMCwgbGltX3ExLCBsaW1fcDEpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHJ2NDBfc3Ryb25nX2xvb3BfZmlsdGVyKHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNocm9tYSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKywgc3JjICs9IHN0cmlkZSl7CisgICAgICAgIGludCBzZmxhZywgcDAsIHEwLCBwMSwgcTE7CisgICAgICAgIGludCB0ID0gc3JjWzAqc3RlcF0gLSBzcmNbLTEqc3RlcF07CisKKyAgICAgICAgaWYgKCF0KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgc2ZsYWcgPSAoYWxwaGEgKiBGRkFCUyh0KSkgPj4gNzsKKyAgICAgICAgaWYgKHNmbGFnID4gMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHAwID0gKDI1KnNyY1stMypzdGVwXSArIDI2KnNyY1stMipzdGVwXSArIDI2KnNyY1stMSpzdGVwXSArCisgICAgICAgICAgICAgIDI2KnNyY1sgMCpzdGVwXSArIDI1KnNyY1sgMSpzdGVwXSArCisgICAgICAgICAgICAgIHJ2NDBfZGl0aGVyX2xbZG1vZGUgKyBpXSkgPj4gNzsKKworICAgICAgICBxMCA9ICgyNSpzcmNbLTIqc3RlcF0gKyAyNipzcmNbLTEqc3RlcF0gKyAyNipzcmNbIDAqc3RlcF0gKworICAgICAgICAgICAgICAyNipzcmNbIDEqc3RlcF0gKyAyNSpzcmNbIDIqc3RlcF0gKworICAgICAgICAgICAgICBydjQwX2RpdGhlcl9yW2Rtb2RlICsgaV0pID4+IDc7CisKKyAgICAgICAgaWYgKHNmbGFnKSB7CisgICAgICAgICAgICBwMCA9IGF2X2NsaXAocDAsIHNyY1stMSpzdGVwXSAtIGxpbXMsIHNyY1stMSpzdGVwXSArIGxpbXMpOworICAgICAgICAgICAgcTAgPSBhdl9jbGlwKHEwLCBzcmNbIDAqc3RlcF0gLSBsaW1zLCBzcmNbIDAqc3RlcF0gKyBsaW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIHAxID0gKDI1KnNyY1stNCpzdGVwXSArIDI2KnNyY1stMypzdGVwXSArIDI2KnNyY1stMipzdGVwXSArIDI2KnAwICsKKyAgICAgICAgICAgICAgMjUqc3JjWyAwKnN0ZXBdICsgcnY0MF9kaXRoZXJfbFtkbW9kZSArIGldKSA+PiA3OworICAgICAgICBxMSA9ICgyNSpzcmNbLTEqc3RlcF0gKyAyNipxMCArIDI2KnNyY1sgMSpzdGVwXSArIDI2KnNyY1sgMipzdGVwXSArCisgICAgICAgICAgICAgIDI1KnNyY1sgMypzdGVwXSArIHJ2NDBfZGl0aGVyX3JbZG1vZGUgKyBpXSkgPj4gNzsKKworICAgICAgICBpZiAoc2ZsYWcpIHsKKyAgICAgICAgICAgIHAxID0gYXZfY2xpcChwMSwgc3JjWy0yKnN0ZXBdIC0gbGltcywgc3JjWy0yKnN0ZXBdICsgbGltcyk7CisgICAgICAgICAgICBxMSA9IGF2X2NsaXAocTEsIHNyY1sgMSpzdGVwXSAtIGxpbXMsIHNyY1sgMSpzdGVwXSArIGxpbXMpOworICAgICAgICB9CisKKyAgICAgICAgc3JjWy0yKnN0ZXBdID0gcDE7CisgICAgICAgIHNyY1stMSpzdGVwXSA9IHAwOworICAgICAgICBzcmNbIDAqc3RlcF0gPSBxMDsKKyAgICAgICAgc3JjWyAxKnN0ZXBdID0gcTE7CisKKyAgICAgICAgaWYoIWNocm9tYSl7CisgICAgICAgICAgICBzcmNbLTMqc3RlcF0gPSAoMjUqc3JjWy0xKnN0ZXBdICsgMjYqc3JjWy0yKnN0ZXBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MSpzcmNbLTMqc3RlcF0gKyAyNipzcmNbLTQqc3RlcF0gKyA2NCkgPj4gNzsKKyAgICAgICAgICAgIHNyY1sgMipzdGVwXSA9ICgyNSpzcmNbIDAqc3RlcF0gKyAyNipzcmNbIDEqc3RlcF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxKnNyY1sgMipzdGVwXSArIDI2KnNyY1sgMypzdGVwXSArIDY0KSA+PiA3OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBydjQwX2hfc3Ryb25nX2xvb3BfZmlsdGVyKHVpbnQ4X3QgKnNyYywgY29uc3QgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGFscGhhLCBjb25zdCBpbnQgbGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRtb2RlLCBjb25zdCBpbnQgY2hyb21hKQoreworICAgIHJ2NDBfc3Ryb25nX2xvb3BfZmlsdGVyKHNyYywgc3RyaWRlLCAxLCBhbHBoYSwgbGltcywgZG1vZGUsIGNocm9tYSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ2NDBfdl9zdHJvbmdfbG9vcF9maWx0ZXIodWludDhfdCAqc3JjLCBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYWxwaGEsIGNvbnN0IGludCBsaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZG1vZGUsIGNvbnN0IGludCBjaHJvbWEpCit7CisgICAgcnY0MF9zdHJvbmdfbG9vcF9maWx0ZXIoc3JjLCAxLCBzdHJpZGUsIGFscGhhLCBsaW1zLCBkbW9kZSwgY2hyb21hKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHJ2NDBfbG9vcF9maWx0ZXJfc3RyZW5ndGgodWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmV0YSwgaW50IGJldGEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnAxLCBpbnQgKnExKQoreworICAgIGludCBzdW1fcDFwMCA9IDAsIHN1bV9xMXEwID0gMCwgc3VtX3AxcDIgPSAwLCBzdW1fcTFxMiA9IDA7CisgICAgaW50IHN0cm9uZzAgPSAwLCBzdHJvbmcxID0gMDsKKyAgICB1aW50OF90ICpwdHI7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwLCBwdHIgPSBzcmM7IGkgPCA0OyBpKyssIHB0ciArPSBzdHJpZGUpIHsKKyAgICAgICAgc3VtX3AxcDAgKz0gcHRyWy0yKnN0ZXBdIC0gcHRyWy0xKnN0ZXBdOworICAgICAgICBzdW1fcTFxMCArPSBwdHJbIDEqc3RlcF0gLSBwdHJbIDAqc3RlcF07CisgICAgfQorCisgICAgKnAxID0gRkZBQlMoc3VtX3AxcDApIDwgKGJldGEgPDwgMik7CisgICAgKnExID0gRkZBQlMoc3VtX3ExcTApIDwgKGJldGEgPDwgMik7CisKKyAgICBpZighKnAxICYmICEqcTEpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFlZGdlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaSA9IDAsIHB0ciA9IHNyYzsgaSA8IDQ7IGkrKywgcHRyICs9IHN0cmlkZSkgeworICAgICAgICBzdW1fcDFwMiArPSBwdHJbLTIqc3RlcF0gLSBwdHJbLTMqc3RlcF07CisgICAgICAgIHN1bV9xMXEyICs9IHB0clsgMSpzdGVwXSAtIHB0clsgMipzdGVwXTsKKyAgICB9CisKKyAgICBzdHJvbmcwID0gKnAxICYmIChGRkFCUyhzdW1fcDFwMikgPCBiZXRhMik7CisgICAgc3Ryb25nMSA9ICpxMSAmJiAoRkZBQlMoc3VtX3ExcTIpIDwgYmV0YTIpOworCisgICAgcmV0dXJuIHN0cm9uZzAgJiYgc3Ryb25nMTsKK30KKworc3RhdGljIGludCBydjQwX2hfbG9vcF9maWx0ZXJfc3RyZW5ndGgodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEsIGludCBiZXRhMiwgaW50IGVkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnAxLCBpbnQgKnExKQoreworICAgIHJldHVybiBydjQwX2xvb3BfZmlsdGVyX3N0cmVuZ3RoKHNyYywgc3RyaWRlLCAxLCBiZXRhLCBiZXRhMiwgZWRnZSwgcDEsIHExKTsKK30KKworc3RhdGljIGludCBydjQwX3ZfbG9vcF9maWx0ZXJfc3RyZW5ndGgodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEsIGludCBiZXRhMiwgaW50IGVkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnAxLCBpbnQgKnExKQoreworICAgIHJldHVybiBydjQwX2xvb3BfZmlsdGVyX3N0cmVuZ3RoKHNyYywgMSwgc3RyaWRlLCBiZXRhLCBiZXRhMiwgZWRnZSwgcDEsIHExKTsKK30KKworYXZfY29sZCB2b2lkIGZmX3J2NDBkc3BfaW5pdChSVjM0RFNQQ29udGV4dCAqYykKK3sKKyAgICBIMjY0UXBlbENvbnRleHQgcXBlbDsKKworICAgIGZmX3J2MzRkc3BfaW5pdChjKTsKKyAgICBmZl9oMjY0cXBlbF9pbml0KCZxcGVsLCA4KTsKKworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWyAwXSA9IHFwZWwucHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWzBdOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWyAxXSA9IHB1dF9ydjQwX3FwZWwxNl9tYzEwX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bIDJdID0gcXBlbC5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bMl07CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bIDNdID0gcHV0X3J2NDBfcXBlbDE2X21jMzBfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsgNF0gPSBwdXRfcnY0MF9xcGVsMTZfbWMwMV9jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWyA1XSA9IHB1dF9ydjQwX3FwZWwxNl9tYzExX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bIDZdID0gcHV0X3J2NDBfcXBlbDE2X21jMjFfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsgN10gPSBwdXRfcnY0MF9xcGVsMTZfbWMzMV9jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWyA4XSA9IHFwZWwucHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdWzhdOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWyA5XSA9IHB1dF9ydjQwX3FwZWwxNl9tYzEyX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMTBdID0gcHV0X3J2NDBfcXBlbDE2X21jMjJfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsxMV0gPSBwdXRfcnY0MF9xcGVsMTZfbWMzMl9jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzEyXSA9IHB1dF9ydjQwX3FwZWwxNl9tYzAzX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMTNdID0gcHV0X3J2NDBfcXBlbDE2X21jMTNfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsxNF0gPSBwdXRfcnY0MF9xcGVsMTZfbWMyM19jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzE1XSA9IHB1dF9ydjQwX3FwZWwxNl9tYzMzX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bIDBdID0gcXBlbC5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bMF07CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bIDFdID0gYXZnX3J2NDBfcXBlbDE2X21jMTBfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsgMl0gPSBxcGVsLmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVsyXTsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsgM10gPSBhdmdfcnY0MF9xcGVsMTZfbWMzMF9jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWyA0XSA9IGF2Z19ydjQwX3FwZWwxNl9tYzAxX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bIDVdID0gYXZnX3J2NDBfcXBlbDE2X21jMTFfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsgNl0gPSBhdmdfcnY0MF9xcGVsMTZfbWMyMV9jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWyA3XSA9IGF2Z19ydjQwX3FwZWwxNl9tYzMxX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bIDhdID0gcXBlbC5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1bOF07CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bIDldID0gYXZnX3J2NDBfcXBlbDE2X21jMTJfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsxMF0gPSBhdmdfcnY0MF9xcGVsMTZfbWMyMl9jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzExXSA9IGF2Z19ydjQwX3FwZWwxNl9tYzMyX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMTJdID0gYXZnX3J2NDBfcXBlbDE2X21jMDNfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsxM10gPSBhdmdfcnY0MF9xcGVsMTZfbWMxM19jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzE0XSA9IGF2Z19ydjQwX3FwZWwxNl9tYzIzX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMTVdID0gYXZnX3J2NDBfcXBlbDE2X21jMzNfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsgMF0gPSBxcGVsLnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVswXTsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsgMV0gPSBwdXRfcnY0MF9xcGVsOF9tYzEwX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bIDJdID0gcXBlbC5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMl07CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bIDNdID0gcHV0X3J2NDBfcXBlbDhfbWMzMF9jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWyA0XSA9IHB1dF9ydjQwX3FwZWw4X21jMDFfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsgNV0gPSBwdXRfcnY0MF9xcGVsOF9tYzExX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bIDZdID0gcHV0X3J2NDBfcXBlbDhfbWMyMV9jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWyA3XSA9IHB1dF9ydjQwX3FwZWw4X21jMzFfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsgOF0gPSBxcGVsLnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVs4XTsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsgOV0gPSBwdXRfcnY0MF9xcGVsOF9tYzEyX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bMTBdID0gcHV0X3J2NDBfcXBlbDhfbWMyMl9jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzExXSA9IHB1dF9ydjQwX3FwZWw4X21jMzJfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsxMl0gPSBwdXRfcnY0MF9xcGVsOF9tYzAzX2M7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bMTNdID0gcHV0X3J2NDBfcXBlbDhfbWMxM19jOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzE0XSA9IHB1dF9ydjQwX3FwZWw4X21jMjNfYzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsxNV0gPSBwdXRfcnY0MF9xcGVsOF9tYzMzX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bIDBdID0gcXBlbC5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bMF07CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bIDFdID0gYXZnX3J2NDBfcXBlbDhfbWMxMF9jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWyAyXSA9IHFwZWwuYXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdWzJdOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWyAzXSA9IGF2Z19ydjQwX3FwZWw4X21jMzBfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsgNF0gPSBhdmdfcnY0MF9xcGVsOF9tYzAxX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bIDVdID0gYXZnX3J2NDBfcXBlbDhfbWMxMV9jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWyA2XSA9IGF2Z19ydjQwX3FwZWw4X21jMjFfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsgN10gPSBhdmdfcnY0MF9xcGVsOF9tYzMxX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bIDhdID0gcXBlbC5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1bOF07CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bIDldID0gYXZnX3J2NDBfcXBlbDhfbWMxMl9jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzEwXSA9IGF2Z19ydjQwX3FwZWw4X21jMjJfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsxMV0gPSBhdmdfcnY0MF9xcGVsOF9tYzMyX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMTJdID0gYXZnX3J2NDBfcXBlbDhfbWMwM19jOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzEzXSA9IGF2Z19ydjQwX3FwZWw4X21jMTNfYzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsxNF0gPSBhdmdfcnY0MF9xcGVsOF9tYzIzX2M7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMTVdID0gYXZnX3J2NDBfcXBlbDhfbWMzM19jOworCisgICAgYy0+cHV0X2Nocm9tYV9waXhlbHNfdGFiWzBdID0gcHV0X3J2NDBfY2hyb21hX21jOF9jOworICAgIGMtPnB1dF9jaHJvbWFfcGl4ZWxzX3RhYlsxXSA9IHB1dF9ydjQwX2Nocm9tYV9tYzRfYzsKKyAgICBjLT5hdmdfY2hyb21hX3BpeGVsc190YWJbMF0gPSBhdmdfcnY0MF9jaHJvbWFfbWM4X2M7CisgICAgYy0+YXZnX2Nocm9tYV9waXhlbHNfdGFiWzFdID0gYXZnX3J2NDBfY2hyb21hX21jNF9jOworCisgICAgYy0+cnY0MF93ZWlnaHRfcGl4ZWxzX3RhYlswXVswXSA9IHJ2NDBfd2VpZ2h0X2Z1bmNfcm5kXzE2OworICAgIGMtPnJ2NDBfd2VpZ2h0X3BpeGVsc190YWJbMF1bMV0gPSBydjQwX3dlaWdodF9mdW5jX3JuZF84OworICAgIGMtPnJ2NDBfd2VpZ2h0X3BpeGVsc190YWJbMV1bMF0gPSBydjQwX3dlaWdodF9mdW5jX25vcm5kXzE2OworICAgIGMtPnJ2NDBfd2VpZ2h0X3BpeGVsc190YWJbMV1bMV0gPSBydjQwX3dlaWdodF9mdW5jX25vcm5kXzg7CisKKyAgICBjLT5ydjQwX3dlYWtfbG9vcF9maWx0ZXJbMF0gICAgID0gcnY0MF9oX3dlYWtfbG9vcF9maWx0ZXI7CisgICAgYy0+cnY0MF93ZWFrX2xvb3BfZmlsdGVyWzFdICAgICA9IHJ2NDBfdl93ZWFrX2xvb3BfZmlsdGVyOworICAgIGMtPnJ2NDBfc3Ryb25nX2xvb3BfZmlsdGVyWzBdICAgPSBydjQwX2hfc3Ryb25nX2xvb3BfZmlsdGVyOworICAgIGMtPnJ2NDBfc3Ryb25nX2xvb3BfZmlsdGVyWzFdICAgPSBydjQwX3Zfc3Ryb25nX2xvb3BfZmlsdGVyOworICAgIGMtPnJ2NDBfbG9vcF9maWx0ZXJfc3RyZW5ndGhbMF0gPSBydjQwX2hfbG9vcF9maWx0ZXJfc3RyZW5ndGg7CisgICAgYy0+cnY0MF9sb29wX2ZpbHRlcl9zdHJlbmd0aFsxXSA9IHJ2NDBfdl9sb29wX2ZpbHRlcl9zdHJlbmd0aDsKKworICAgIGlmIChBUkNIX0FBUkNINjQpCisgICAgICAgIGZmX3J2NDBkc3BfaW5pdF9hYXJjaDY0KGMpOworICAgIGlmIChBUkNIX0FSTSkKKyAgICAgICAgZmZfcnY0MGRzcF9pbml0X2FybShjKTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX3J2NDBkc3BfaW5pdF94ODYoYyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9ydjQwdmxjMi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnY0MHZsYzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTExOWExCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvcnY0MHZsYzIuaApAQCAtMCwwICsxLDcwNiBAQAorLyoKKyAqIFJlYWxWaWRlbyA0IGRlY29kZXIKKyAqIGNvcHlyaWdodCAoYykgMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJWNDAgVkxDIHRhYmxlcyB1c2VkIGZvciBtYWNyb2Jsb2NrIGluZm9ybWF0aW9uIGRlY29kaW5nCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1JWNDBWTEMyX0gKKyNkZWZpbmUgQVZDT0RFQ19SVjQwVkxDMl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBjb2RlcyB1c2VkIGZvciB0aGUgZmlyc3QgZm91ciBibG9jayB0eXBlcworICovCisvL0B7CisjZGVmaW5lIEFJQ19UT1BfQklUUyAgOAorI2RlZmluZSBBSUNfVE9QX1NJWkUgMTYKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ2NDBfYWljX3RvcF92bGNfY29kZXNbQUlDX1RPUF9TSVpFXSA9IHsKKyAweDAxLCAweDA1LCAweDAxLCAweDAwLCAweDAzLCAweDNELCAweDFELCAweDAyLAorIDB4MDQsIDB4M0MsIDB4M0YsIDB4MUMsIDB4MEQsIDB4M0UsIDB4MEMsIDB4MDEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ2NDBfYWljX3RvcF92bGNfYml0c1tBSUNfVE9QX1NJWkVdID0geworIDEsIDQsIDUsIDUsIDUsIDcsIDYsIDUsIDQsIDcsIDcsIDYsIDUsIDcsIDUsIDMKK307CisvL0B9CisKKy8qKgorICogY29kZXMgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgYSBwYWlyIG9mIGJsb2NrIHR5cGVzCisgKi8KKy8vQHsKKyNkZWZpbmUgQUlDX01PREUyX05VTSAgMjAKKyNkZWZpbmUgQUlDX01PREUyX1NJWkUgODEKKyNkZWZpbmUgQUlDX01PREUyX0JJVFMgIDkKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGFpY19tb2RlMl92bGNfY29kZXNbQUlDX01PREUyX05VTV1bQUlDX01PREUyX1NJWkVdID0geworeyAweDAwMDEsIDB4MDAwMSwgMHgwMDA1LCAweDAxRjUsIDB4MDAxMSwgMHgwMDQ5LCAweDAwMDAsIDB4MDA0OCwgMHgwMDRCLAorICAweDAwMzUsIDB4MDAwMywgMHgwMDM0LCAweDAzQzksIDB4MDFGNCwgMHgwMEM5LCAweDAwNEEsIDB4MEZEOSwgMHgwM0M4LAorICAweDAwMTAsIDB4MDAzNywgMHgwMDAxLCAweDAwQzgsIDB4MDA3NSwgMHgwMUY3LCAweDAwQ0IsIDB4MDA3NCwgMHgwMDAyLAorICAweDAxRjYsIDB4MDBDQSwgMHgwMUYxLCAweDAxRjAsIDB4MUY4MSwgMHgwN0Y5LCAweDFGODAsIDB4MUY4MywgMHgwN0Y4LAorICAweDAwNzcsIDB4MDBGNSwgMHgwMDM2LCAweDA3RkIsIDB4MDA3NiwgMHgxRjgyLCAweDAwRjQsIDB4MDBGNywgMHgwN0ZBLAorICAweDAwNzEsIDB4MDBGNiwgMHgwM0NCLCAweDAzQ0EsIDB4MEZEOCwgMHgwMEYxLCAweDAzRjUsIDB4MUY4RCwgMHgwN0U1LAorICAweDAwMTMsIDB4MDAzMSwgMHgwMEYwLCAweDBGREIsIDB4MDBGMywgMHgwN0U0LCAweDAwMzAsIDB4MDFGMywgMHgwN0U3LAorICAweDAzRjQsIDB4MDdFNiwgMHgwMDcwLCAweDNGMTksIDB4MDFGMiwgMHgzRjE4LCAweDBGREEsIDB4MDAzMywgMHgwN0UxLAorICAweDAxRkQsIDB4MDFGQywgMHgwMDczLCAweDAxRkYsIDB4MEZDNSwgMHgwRkM0LCAweDBGQzcsIDB4MDNGNywgMHgwMDcyLCB9LAoreyAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDAwNzksIDB4MDAwNSwgMHgwMDBELCAweDAwMUQsIDB4MDA3OCwgMHgwMDY5LAorICAweDAwMDQsIDB4MDAwMSwgMHgwMDA3LCAweDAwNjgsIDB4MDAxQywgMHgwMDFGLCAweDAwMDQsIDB4MDA2QiwgMHgwMDBDLAorICAweDAwMDQsIDB4MDAxRSwgMHgwMDA2LCAweDAwNkEsIDB4MDAxNSwgMHgwMDBGLCAweDAwMTQsIDB4MDAxNywgMHgwMDA3LAorICAweDAwMTYsIDB4MDAwRSwgMHgwMDExLCAweDAwMDksIDB4MDBEMSwgMHgwMEQwLCAweDAxODEsIDB4MDBEMywgMHgwMDdCLAorICAweDAwMTAsIDB4MDAxMywgMHgwMDA0LCAweDAwRDIsIDB4MDAwNywgMHgwMzE5LCAweDAwMDgsIDB4MDA3QSwgMHgwMERELAorICAweDAwMTksIDB4MDAwNiwgMHgwMDBCLCAweDAwNjUsIDB4MDBEQywgMHgwMDEyLCAweDAwNjQsIDB4MDE4MCwgMHgwMERGLAorICAweDAwMDYsIDB4MDAxOCwgMHgwMDAxLCAweDAwREUsIDB4MDAxRCwgMHgwMEQ5LCAweDAwMUIsIDB4MDA2NywgMHgwMDBBLAorICAweDAwRDgsIDB4MDBEQiwgMHgwMDFDLCAweDAzMTgsIDB4MDBEQSwgMHgwNjM1LCAweDAxODMsIDB4MDAwMCwgMHgwMEM1LAorICAweDAwNjYsIDB4MDA2MSwgMHgwMDM1LCAweDAwQzQsIDB4MDE4MiwgMHgwNjM0LCAweDAzMUIsIDB4MDBDNywgMHgwMDFGLCB9LAoreyAweDAwMDUsIDB4MDAwMSwgMHgwMDFELCAweDAxQzEsIDB4MDAzNSwgMHgwMEYxLCAweDAwNkQsIDB4MDBGMCwgMHgwMDQ5LAorICAweDAwMDAsIDB4MDAwNCwgMHgwMDAzLCAweDAwRjMsIDB4MDA0OCwgMHgwMDM0LCAweDAwNkMsIDB4MDFDMCwgMHgwMUMzLAorICAweDAwMDcsIDB4MDAwNiwgMHgwMDAxLCAweDAwNkYsIDB4MDAwMiwgMHgwMDRCLCAweDAwNkUsIDB4MDAxQywgMHgwMDA1LAorICAweDAwNjksIDB4MDA2OCwgMHgwMDZCLCAweDAwMzcsIDB4MDFDMiwgMHgwMEYyLCAweDAzOTUsIDB4MDFDRCwgMHgwMEZELAorICAweDAwNkEsIDB4MDAzNiwgMHgwMDE1LCAweDAxQ0MsIDB4MDAxNCwgMHgwMzk0LCAweDAwNEEsIDB4MDBGQywgMHgwMEZGLAorICAweDAwMTcsIDB4MDAzMSwgMHgwMEZFLCAweDAxQ0YsIDB4MDM5NywgMHgwMEY5LCAweDAxQ0UsIDB4MDcyNSwgMHgwMzk2LAorICAweDAwMTYsIDB4MDAzMCwgMHgwMDc1LCAweDA3MjQsIDB4MDBGOCwgMHgwNzI3LCAweDAwMzMsIDB4MDM5MSwgMHgwMzkwLAorICAweDAwMTEsIDB4MDAzMiwgMHgwMDFGLCAweDAwRkIsIDB4MDA3NCwgMHgwNzI2LCAweDAwRkEsIDB4MDAxRSwgMHgwMDc3LAorICAweDAwMTksIDB4MDAxOCwgMHgwMDA0LCAweDAwMTAsIDB4MDAzRCwgMHgwMDc2LCAweDAwNzEsIDB4MDAxMywgMHgwMDAxLCB9LAoreyAweDAwMEQsIDB4MDAxOSwgMHgwMDExLCAweDAwMTUsIDB4MDA2MSwgMHgwMDE5LCAweDAwMTQsIDB4MDFBRCwgMHgwMDYwLAorICAweDAwMTgsIDB4MDAwMSwgMHgwMDA1LCAweDAwMUIsIDB4MDAxMCwgMHgwMDE5LCAweDAwMDUsIDB4MDAxNywgMHgwMDE4LAorICAweDAwMTYsIDB4MDAwNCwgMHgwMDA0LCAweDAwMTMsIDB4MDAwQywgMHgwMDEyLCAweDAwMUEsIDB4MDAxOCwgMHgwMDA1LAorICAweDAwMEYsIDB4MDAxQiwgMHgwMDA0LCAweDAwMUQsIDB4MDAxMSwgMHgwMDFDLCAweDAwMTAsIDB4MDAwRSwgMHgwMDFCLAorICAweDAwMTMsIDB4MDAxRiwgMHgwMDFBLCAweDAwMjksIDB4MDAwNSwgMHgwMDYzLCAweDAwMUUsIDB4MDAwOSwgMHgwMDYyLAorICAweDAwMDgsIDB4MDAwNywgMHgwMDA3LCAweDAwMTksIDB4MDAwNCwgMHgwMDFBLCAweDAwMTgsIDB4MDA2RCwgMHgwMDA3LAorICAweDAwMUIsIDB4MDAwNywgMHgwMDFBLCAweDAwNkMsIDB4MDAwNiwgMHgwMDEyLCAweDAwMDUsIDB4MDA2RiwgMHgwMDBCLAorICAweDAwNkUsIDB4MDA2OSwgMHgwMDFELCAweDAzNTksIDB4MDAyOCwgMHgwMDJCLCAweDAwMkEsIDB4MDAxQywgMHgwMEQ1LAorICAweDAzNTgsIDB4MDAxRiwgMHgwMDAxLCAweDAwMUUsIDB4MDA2OCwgMHgwMEQ0LCAweDAwRDcsIDB4MDAxOSwgMHgwMDAwLCB9LAoreyAweDAwQjksIDB4MDA2MSwgMHgwMDYwLCAweDAwQjgsIDB4MDJCNSwgMHgwMUFELCAweDAwQkIsIDB4MEFGNSwgMHgwMTUxLAorICAweDAwMDEsIDB4MDAwMSwgMHgwMDA1LCAweDAwMDAsIDB4MDAwMywgMHgwMDA1LCAweDAwMDQsIDB4MDA2MywgMHgwMDI1LAorICAweDAwQkEsIDB4MDAwNCwgMHgwMDA3LCAweDAwNjIsIDB4MDBBNSwgMHgwMDI0LCAweDAwNkQsIDB4MDAwMiwgMHgwMDZDLAorICAweDAyQjQsIDB4MDAwRCwgMHgwMDZGLCAweDAwMjcsIDB4MDBBNCwgMHgwMDI2LCAweDAxQUMsIDB4MDE1MCwgMHgwMUFGLAorICAweDAxQUUsIDB4MDAyMSwgMHgwMDZFLCAweDAyQjcsIDB4MDAyMCwgMHgwMTUzLCAweDAwMjMsIDB4MDBBNywgMHgwMTUyLAorICAweDAwQTYsIDB4MDAwNiwgMHgwMDBDLCAweDAwMjIsIDB4MDFBOSwgMHgwMDE5LCAweDAwMkQsIDB4MDJCNiwgMHgwMUE4LAorICAweDAwMEYsIDB4MDAwNywgMHgwMDBFLCAweDAwQTEsIDB4MDA2OSwgMHgwMDJDLCAweDAwMDEsIDB4MDFBQiwgMHgwMEEwLAorICAweDAyQjEsIDB4MDBBMywgMHgwMDJGLCAweDBBRjQsIDB4MDJCMCwgMHgwQUY3LCAweDAyQjMsIDB4MDA2OCwgMHgwMTVELAorICAweDBBRjYsIDB4MDFBQSwgMHgwMDU1LCAweDAxNUMsIDB4MDJCMiwgMHgwNTc5LCAweDA1NzgsIDB4MDE1RiwgMHgwMEEyLCB9LAoreyAweDA5MDUsIDB4MDEzRCwgMHgwMTNDLCAweDA5MDQsIDB4MTIxRCwgMHgwNDlELCAweDA0OUMsIDB4MjQzRCwgMHgwOTA3LAorICAweDAwRUQsIDB4MDAwMSwgMHgwMDE1LCAweDAwNDEsIDB4MDEzRiwgMHgwMDMxLCAweDAwMTQsIDB4MDI1RCwgMHgwMjVDLAorICAweDAxM0UsIDB4MDAwRCwgMHgwMDAwLCAweDAwNDAsIDB4MDEzOSwgMHgwMDQzLCAweDAwMzAsIDB4MDAxNywgMHgwMDMzLAorICAweDA5MDYsIDB4MDAzMiwgMHgwMDQyLCAweDAwRUMsIDB4MDI1RiwgMHgwMEVGLCAweDAyNUUsIDB4MDQ5RiwgMHgwMTM4LAorICAweDA5MDEsIDB4MDEzQiwgMHgwMjU5LCAweDEyMUMsIDB4MDQ5RSwgMHgwOTAwLCAweDAyNTgsIDB4MjQzQywgMHgxMjFGLAorICAweDA5MDMsIDB4MDAzRCwgMHgwMEVFLCAweDAyNUIsIDB4MDI1QSwgMHgwMDRELCAweDAxM0EsIDB4MDkwMiwgMHgwMjQ1LAorICAweDAwRTksIDB4MDAxNiwgMHgwMEU4LCAweDA0OTksIDB4MDEyNSwgMHgwMjQ0LCAweDAwNEMsIDB4MDQ5OCwgMHgwOTBELAorICAweDAwRUIsIDB4MDAzQywgMHgwMDExLCAweDA0OUIsIDB4MDQ5QSwgMHgwNDg1LCAweDAwRUEsIDB4MDAzRiwgMHgwMTI0LAorICAweDA5MEMsIDB4MDAzRSwgMHgwMDM5LCAweDAwOTUsIDB4MDI0NywgMHgwMjQ2LCAweDA0ODQsIDB4MDA5NCwgMHgwMDM4LCB9LAoreyAweDBGMDksIDB4MDBDRCwgMHgwMUZELCAweDA3OTEsIDB4MUU2RCwgMHgwNzkwLCAweDAzRDksIDB4M0NEMSwgMHgzQ0QwLAorICAweDAwNzUsIDB4MDAwMSwgMHgwMDAxLCAweDAwMzUsIDB4MDBDQywgMHgwMDExLCAweDAwMDAsIDB4MDNEOCwgMHgwMUZDLAorICAweDAzREIsIDB4MDAxMCwgMHgwMDAzLCAweDAwQ0YsIDB4MDNEQSwgMHgwMENFLCAweDAwNzQsIDB4MDAzNCwgMHgwMDc3LAorICAweDA3OTMsIDB4MDAxMywgMHgwMDc2LCAweDAwNzEsIDB4MDNDNSwgMHgwMDcwLCAweDAxRkYsIDB4MDc5MiwgMHgwMUZFLAorICAweDAxRjksIDB4MDAzNywgMHgwMEM5LCAweDBGMDgsIDB4MDFGOCwgMHgwM0M0LCAweDAwQzgsIDB4MEYwQiwgMHgwNzlELAorICAweDAzQzcsIDB4MDAwMSwgMHgwMDEyLCAweDAwNzMsIDB4MDBDQiwgMHgwMDA1LCAweDAwMzYsIDB4MDNDNiwgMHgwMDcyLAorICAweDAwN0QsIDB4MDAwMiwgMHgwMENBLCAweDA3OUMsIDB4MDFGQiwgMHgwMEY1LCAweDAwMzEsIDB4MDc5RiwgMHgwRjBBLAorICAweDBGMzUsIDB4MDc5RSwgMHgwMUZBLCAweDFFNkMsIDB4MUU2RiwgMHgzQ0QzLCAweDA3OTksIDB4MDNDMSwgMHgxRTZFLAorICAweDNDRDIsIDB4MDAzMCwgMHgwMEY0LCAweDAwN0MsIDB4MDNDMCwgMHgwM0MzLCAweDA3OTgsIDB4MDFFNSwgMHgwMEY3LCB9LAoreyAweDAxQTUsIDB4MDAwMSwgMHgwMDFELCAweDAwMjEsIDB4MDBBMSwgMHgwMDBELCAweDAwNjEsIDB4MDZCOSwgMHgwMEEwLAorICAweDAwNjAsIDB4MDAwMSwgMHgwMDA1LCAweDAwMEMsIDB4MDAyMCwgMHgwMDFDLCAweDAwMDQsIDB4MDFBNCwgMHgwMUE3LAorICAweDAwQTMsIDB4MDAxRiwgMHgwMDFFLCAweDAwMjMsIDB4MDAyMiwgMHgwMDJELCAweDAwMkMsIDB4MDA2MywgMHgwMDYyLAorICAweDFBODEsIDB4MDFBNiwgMHgwMUExLCAweDA2QjgsIDB4MDZCQiwgMHgwMEEyLCAweDA2QkEsIDB4MEQ1OSwgMHgwNkE1LAorICAweDAxQTAsIDB4MDAwRiwgMHgwMDZELCAweDA2QTQsIDB4MDAyRiwgMHgwMEFELCAweDAwNkMsIDB4MDZBNywgMHgwMEFDLAorICAweDBENTgsIDB4MDAwRSwgMHgwMUEzLCAweDAwQUYsIDB4MDBBRSwgMHgwMDZGLCAweDAxQTIsIDB4MEQ1QiwgMHgwMEE5LAorICAweDAwMTksIDB4MDAwMSwgMHgwMDA5LCAweDAwQTgsIDB4MDA2RSwgMHgwMDJFLCAweDAwMDAsIDB4MDFBRCwgMHgwMEFCLAorICAweDAwQUEsIDB4MDM1NSwgMHgwMDI5LCAweDFBODAsIDB4MUE4MywgMHgxQTgyLCAweDAzNTQsIDB4MDFBQywgMHgwRDVBLAorICAweDFBOEQsIDB4MDFBRiwgMHgwMzU3LCAweDBENDUsIDB4MEQ0NCwgMHgwRDQ3LCAweDFBOEMsIDB4MDZBNiwgMHgwNkExLCB9LAoreyAweDAwMDEsIDB4MDAxMSwgMHgwMDA1LCAweDA3NzUsIDB4MDBGOSwgMHgwMEY4LCAweDAwMzEsIDB4MDAzMCwgMHgwMDQ5LAorICAweDAwRkIsIDB4MDAxMCwgMHgwMDMzLCAweDBFQzksIDB4MDM4RCwgMHgwMzhDLCAweDAwRkEsIDB4MDM4RiwgMHgwNzc0LAorICAweDAwNDgsIDB4MDAzMiwgMHgwMDAwLCAweDAxRDUsIDB4MDBFNSwgMHgwMzhFLCAweDAwRTQsIDB4MDAxMywgMHgwMDBELAorICAweDAzODksIDB4MDc3NywgMHgwMzg4LCAweDAzOEIsIDB4MURGOSwgMHgwRUM4LCAweDNCQzksIDB4MURGOCwgMHgwMzhBLAorICAweDAzQjUsIDB4MDc3NiwgMHgwMEU3LCAweDNCQzgsIDB4MDFENCwgMHgzQkNCLCAweDBFQ0IsIDB4MDc3MSwgMHgwRUNBLAorICAweDAxRDcsIDB4MDNCNCwgMHgwMUQ2LCAweDFERkIsIDB4MEVGNSwgMHgwNzcwLCAweDBFRjQsIDB4M0JDQSwgMHgwNzczLAorICAweDAwRTYsIDB4MDNCNywgMHgwMDRCLCAweDFERkEsIDB4MDNCNiwgMHgwRUY3LCAweDAwRTEsIDB4MEVGNiwgMHgwRUYxLAorICAweDAzQjEsIDB4MDFEMSwgMHgwMDNELCAweDBFRjAsIDB4MDc3MiwgMHgwNzdELCAweDA3N0MsIDB4MDAzQywgMHgwMUQwLAorICAweDAzQjAsIDB4MDFEMywgMHgwMDNGLCAweDAzQjMsIDB4MDFEMiwgMHgwRUYzLCAweDA3N0YsIDB4MDBFMCwgMHgwMDRBLCB9LAoreyAweDAwMTUsIDB4MDA0OSwgMHgwMDE0LCAweDA3RDEsIDB4MDNGRCwgMHgwM0ZDLCAweDAxQzEsIDB4MDFDMCwgMHgwMEYxLAorICAweDAwMTcsIDB4MDAwMSwgMHgwMDAxLCAweDAxQzMsIDB4MDA0OCwgMHgwMDRCLCAweDAwMTYsIDB4MDAzMSwgMHgwMUMyLAorICAweDAwNEEsIDB4MDAxMSwgMHgwMDAwLCAweDAxQ0QsIDB4MDBGMCwgMHgwMUNDLCAweDAwNzUsIDB4MDAxMCwgMHgwMDBELAorICAweDAzRkYsIDB4MDFDRiwgMHgwMUNFLCAweDA3RDAsIDB4MEY4MSwgMHgwN0QzLCAweDFGMUQsIDB4MEY4MCwgMHgwN0QyLAorICAweDAxQzksIDB4MDNGRSwgMHgwMDc0LCAweDA3REQsIDB4MDBGMywgMHgxRjFDLCAweDA3REMsIDB4MDNGOSwgMHgwN0RGLAorICAweDAwRjIsIDB4MDBGRCwgMHgwMDc3LCAweDA3REUsIDB4MDdEOSwgMHgwMUM4LCAweDA3RDgsIDB4MEY4MywgMHgwM0Y4LAorICAweDAwMzAsIDB4MDA3NiwgMHgwMDEzLCAweDBGODIsIDB4MDBGQywgMHgwM0ZCLCAweDAwMzMsIDB4MDNGQSwgMHgwM0U1LAorICAweDAzRTQsIDB4MDFDQiwgMHgwMDMyLCAweDFGMUYsIDB4MDNFNywgMHgwN0RCLCAweDA3REEsIDB4MDAzRCwgMHgwMUNBLAorICAweDA3QzUsIDB4MDNFNiwgMHgwMDcxLCAweDBGOEQsIDB4MDdDNCwgMHgxRjFFLCAweDBGOEMsIDB4MDNFMSwgMHgwMUY1LCB9LAoreyAweDAwMTksIDB4MDA2NSwgMHgwMDE4LCAweDAzNTEsIDB4MDM1MCwgMHgwMzUzLCAweDAwMjEsIDB4MDAyMCwgMHgwMDY0LAorICAweDAwMUQsIDB4MDAwNSwgMHgwMDA1LCAweDAxQTUsIDB4MDAyMywgMHgwMDY3LCAweDAwMDUsIDB4MDA2NiwgMHgwMDIyLAorICAweDAwMUIsIDB4MDAwNCwgMHgwMDAxLCAweDAwMDQsIDB4MDAxQywgMHgwMDYxLCAweDAwMUEsIDB4MDAwNSwgMHgwMDA0LAorICAweDAwMDcsIDB4MDAyRCwgMHgwMDA2LCAweDAwMkMsIDB4MDFBNCwgMHgwMDJGLCAweDAzNTIsIDB4MDM1RCwgMHgwMDYwLAorICAweDAwMDEsIDB4MDAyRSwgMHgwMDFGLCAweDAzNUMsIDB4MDAwMCwgMHgwNkIxLCAweDAxQTcsIDB4MDAyOSwgMHgwMUE2LAorICAweDAwMjgsIDB4MDA2MywgMHgwMDYyLCAweDAzNUYsIDB4MDFBMSwgMHgwMDJCLCAweDA2QjAsIDB4MDZCMywgMHgwMUEwLAorICAweDAwMDMsIDB4MDA2RCwgMHgwMDFFLCAweDAzNUUsIDB4MDA2QywgMHgwNkIyLCAweDAwMDIsIDB4MDFBMywgMHgwMUEyLAorICAweDAwMEQsIDB4MDAwNSwgMHgwMDA3LCAweDAxQUQsIDB4MDA2RiwgMHgwMDJBLCAweDAwNkUsIDB4MDAwNCwgMHgwMDA0LAorICAweDAwMEMsIDB4MDAwNywgMHgwMDA2LCAweDAwMEYsIDB4MDAwRSwgMHgwMEQ1LCAweDAwMDksIDB4MDAwNiwgMHgwMDA3LCB9LAoreyAweDAwNjUsIDB4MDE4MSwgMHgwMDY0LCAweDM2QzksIDB4MDZENSwgMHgwREI1LCAweDAzNzksIDB4MDE4MCwgMHgwMTgzLAorICAweDAwRDUsIDB4MDAxRCwgMHgwMDFDLCAweDBEQjQsIDB4MDE4MiwgMHgwMzc4LCAweDAwRDQsIDB4MDBENywgMHgwNkQ0LAorICAweDAwNjcsIDB4MDAxRiwgMHgwMDAxLCAweDAwRDYsIDB4MDBEMSwgMHgwMThELCAweDAwNjYsIDB4MDAwMSwgMHgwMDAwLAorICAweDAzN0IsIDB4MDZENywgMHgwMzdBLCAweDBEQjcsIDB4MzZDOCwgMHgwNkQ2LCAweDBEQjYsIDB4MUI3OSwgMHgwREIxLAorICAweDAxOEMsIDB4MDM2NSwgMHgwMEQwLCAweDFCNzgsIDB4MDBEMywgMHgxQjdCLCAweDAzNjQsIDB4MDZEMSwgMHgwNkQwLAorICAweDAxOEYsIDB4MDE4RSwgMHgwMEQyLCAweDM2Q0IsIDB4MDM2NywgMHgwMzY2LCAweDA2RDMsIDB4MERCMCwgMHgwNkQyLAorICAweDAzNjEsIDB4MDZERCwgMHgwMTg5LCAweDM2Q0EsIDB4MDM2MCwgMHgzNkY1LCAweDAxODgsIDB4MERCMywgMHgzNkY0LAorICAweDAwMDksIDB4MDAwOCwgMHgwMDA1LCAweDA2REMsIDB4MDBERCwgMHgwMThCLCAweDAwREMsIDB4MDAwNCwgMHgwMDBCLAorICAweDAxOEEsIDB4MDA2MSwgMHgwMDAzLCAweDAzNjMsIDB4MDBERiwgMHgwNkRGLCAweDAzNjIsIDB4MDAwQSwgMHgwMDFFLCB9LAoreyAweDAwMUQsIDB4MDA2MSwgMHgwMDBELCAweDBENTUsIDB4MDZCOSwgMHgwNkI4LCAweDAxQTUsIDB4MDAyMSwgMHgwMDIwLAorICAweDAwMjMsIDB4MDAwQywgMHgwMDYwLCAweDBENTQsIDB4MDBBRCwgMHgwMEFDLCAweDAwMjIsIDB4MDBBRiwgMHgwNkJCLAorICAweDAwMEYsIDB4MDAxQywgMHgwMDAxLCAweDAwMkQsIDB4MDA2MywgMHgwMUE0LCAweDAwMEUsIDB4MDAwMSwgMHgwMDA1LAorICAweDAxQTcsIDB4MDZCQSwgMHgwMUE2LCAweDA2QTUsIDB4MEQ1NywgMHgwRDU2LCAweDFBQkQsIDB4MEQ1MSwgMHgwMEFFLAorICAweDAwMkMsIDB4MDBBOSwgMHgwMDJGLCAweDBENTAsIDB4MDFBMSwgMHgxQUJDLCAweDA2QTQsIDB4MDZBNywgMHgwNkE2LAorICAweDAwQTgsIDB4MDZBMSwgMHgwMUEwLCAweDFBQkYsIDB4MEQ1MywgMHgwNkEwLCAweDBENTIsIDB4MUFCRSwgMHgwNkEzLAorICAweDAwNjIsIDB4MDAyRSwgMHgwMDA5LCAweDBENUQsIDB4MDFBMywgMHgwRDVDLCAweDAwNkQsIDB4MDBBQiwgMHgwNkEyLAorICAweDAwNkMsIDB4MDAxRiwgMHgwMDAxLCAweDA2QUQsIDB4MDAyOSwgMHgwMUEyLCAweDAwMjgsIDB4MDAwNCwgMHgwMDFFLAorICAweDAxQUQsIDB4MDA2RiwgMHgwMDAwLCAweDAxQUMsIDB4MDFBRiwgMHgwNkFDLCAweDAwQUEsIDB4MDA2RSwgMHgwMDE5LCB9LAoreyAweDAwMTksIDB4MDA3RCwgMHgwMDE4LCAweDAxQjUsIDB4MDAwRCwgMHgwMUI0LCAweDAwN0MsIDB4MDA3RiwgMHgwMUI3LAorICAweDAwMEMsIDB4MDAxQiwgMHgwMDFBLCAweDAxQjYsIDB4MDAwRiwgMHgwMEQ1LCAweDAwMTksIDB4MDA3RSwgMHgwMEQ0LAorICAweDAwMTgsIDB4MDAxQiwgMHgwMDAxLCAweDAwMEUsIDB4MDAxMSwgMHgwMDA5LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LAorICAweDAwRDcsIDB4MDFCMSwgMHgwMDA4LCAweDAxQjAsIDB4MDA3OSwgMHgwNkZELCAweDAzNzEsIDB4MDM3MCwgMHgwMEQ2LAorICAweDAwNzgsIDB4MDFCMywgMHgwMDEwLCAweDAzNzMsIDB4MDAxMywgMHgwNkZDLCAweDAwN0IsIDB4MDA3QSwgMHgwMEQxLAorICAweDAwRDAsIDB4MDBEMywgMHgwMDY1LCAweDAzNzIsIDB4MDZGRiwgMHgwMDY0LCAweDA2RkUsIDB4MDM3RCwgMHgwMEQyLAorICAweDAwREQsIDB4MDA2NywgMHgwMDA0LCAweDAzN0MsIDB4MDAxMiwgMHgwMUIyLCAweDAwMDcsIDB4MDA2NiwgMHgwMUJELAorICAweDAwMDYsIDB4MDA2MSwgMHgwMDA0LCAweDAxQkMsIDB4MDAxQSwgMHgwMDYwLCAweDAwMUQsIDB4MDAwNCwgMHgwMDFDLAorICAweDAwNjMsIDB4MDAwMSwgMHgwMDA3LCAweDAwMEIsIDB4MDAwMCwgMHgwMDYyLCAweDAwMEEsIDB4MDAwNSwgMHgwMDA3LCB9LAoreyAweDAwNjksIDB4MDA0NSwgMHgwMDY4LCAweDA0QkQsIDB4MDI1NSwgMHgwNEJDLCAweDAwRTUsIDB4MDBFNCwgMHgwMDMxLAorICAweDAwMzAsIDB4MDAxOSwgMHgwMDAxLCAweDAxMjEsIDB4MDBFNywgMHgwMEU2LCAweDAwMzMsIDB4MDBFMSwgMHgwMEUwLAorICAweDAwNkIsIDB4MDAxOCwgMHgwMDAxLCAweDAwNDQsIDB4MDAzMiwgMHgwMDQ3LCAweDAwNkEsIDB4MDAxQiwgMHgwMDA1LAorICAweDAwM0QsIDB4MDA0NiwgMHgwMDE1LCAweDAwNDEsIDB4MDEyMCwgMHgwMTIzLCAweDA0QkYsIDB4MDEyMiwgMHgwMDQwLAorICAweDAwM0MsIDB4MDBFMywgMHgwMDE0LCAweDAyNTQsIDB4MDA0MywgMHgwOTc1LCAweDAxMkQsIDB4MDBFMiwgMHgwMEVELAorICAweDAwNDIsIDB4MDBFQywgMHgwMDRELCAweDAyNTcsIDB4MDI1NiwgMHgwMjUxLCAweDA0QkUsIDB4MDk3NCwgMHgwMjUwLAorICAweDAwRUYsIDB4MDBFRSwgMHgwMDRDLCAweDA0QjksIDB4MDEyQywgMHgwNEI4LCAweDAwNEYsIDB4MDRCQiwgMHgwMjUzLAorICAweDAwM0YsIDB4MDAxNywgMHgwMDAxLCAweDAyNTIsIDB4MDBFOSwgMHgwMEU4LCAweDAwRUIsIDB4MDAwMCwgMHgwMDAzLAorICAweDAwMTYsIDB4MDAwMiwgMHgwMDA0LCAweDAwNEUsIDB4MDAzRSwgMHgwMEVBLCAweDAwNDksIDB4MDAwRCwgMHgwMDA3LCB9LAoreyAweDAwMEQsIDB4MDFCRCwgMHgwMDBDLCAweDBEMzEsIDB4MEQzMCwgMHgwRDMzLCAweDAzNTksIDB4MDM1OCwgMHgwMDJELAorICAweDAwNjUsIDB4MDAxRCwgMHgwMDFDLCAweDBEMzIsIDB4MDM1QiwgMHgwMzVBLCAweDAwMkMsIDB4MDFCQywgMHgwMzQ1LAorICAweDAwMEYsIDB4MDAxRiwgMHgwMDAxLCAweDAwMkYsIDB4MDA2NCwgMHgwMUJGLCAweDAwNjcsIDB4MDAwMSwgMHgwMDA1LAorICAweDAwNjYsIDB4MDAyRSwgMHgwMDYxLCAweDAwMjksIDB4MDY5NSwgMHgwNjk0LCAweDA2OTcsIDB4MDY5NiwgMHgwMDYwLAorICAweDAxQkUsIDB4MEQzRCwgMHgwMDI4LCAweDFBNDksIDB4MDM0NCwgMHgxQTQ4LCAweDFBNEIsIDB4MEQzQywgMHgwNjkxLAorICAweDAwMkIsIDB4MDFCOSwgMHgwMDJBLCAweDBEM0YsIDB4MDY5MCwgMHgwMzQ3LCAweDBEM0UsIDB4MUE0QSwgMHgwMzQ2LAorICAweDAwRDUsIDB4MDM0MSwgMHgwMDYzLCAweDBEMzksIDB4MDM0MCwgMHgwRDM4LCAweDAxQjgsIDB4MEQzQiwgMHgwRDNBLAorICAweDAwRDQsIDB4MDA2MiwgMHgwMDAwLCAweDA2OTMsIDB4MDFCQiwgMHgwMzQzLCAweDAzNDIsIDB4MDAxRSwgMHgwMDBFLAorICAweDAwNkQsIDB4MDAwOSwgMHgwMDAxLCAweDAwNkMsIDB4MDBENywgMHgwMzRELCAweDAxQkEsIDB4MDAwOCwgMHgwMDA0LCB9LAoreyAweDAwNzUsIDB4MDBDRCwgMHgwMDM1LCAweDAzQzEsIDB4MDNDMCwgMHgwN0Y5LCAweDAzQzMsIDB4MUY4RCwgMHgwMENDLAorICAweDAwNzQsIDB4MDAxMSwgMHgwMDEwLCAweDAzQzIsIDB4MEZEOSwgMHgwMUYxLCAweDAwQ0YsIDB4MDNDRCwgMHgwMENFLAorICAweDAwMzQsIDB4MDAwMSwgMHgwMDAxLCAweDAwMzcsIDB4MDBDOSwgMHgwMEM4LCAweDAwMzYsIDB4MDAwMCwgMHgwMDAxLAorICAweDBGRDgsIDB4MDNDQywgMHgwMENCLCAweDAxRjAsIDB4MDdGOCwgMHgwM0NGLCAweDA3RkIsIDB4MDdGQSwgMHgwMENBLAorICAweDAxRjMsIDB4MDNDRSwgMHgwMEY1LCAweDBGREIsIDB4MDBGNCwgMHgwN0U1LCAweDA3RTQsIDB4MDdFNywgMHgwMUYyLAorICAweDA3RTYsIDB4MDNDOSwgMHgwMUZELCAweDBGREEsIDB4MUY4QywgMHgwN0UxLCAweDFGOEYsIDB4MUY4RSwgMHgwM0M4LAorICAweDAzQ0IsIDB4MDA3NywgMHgwMDc2LCAweDBGQzUsIDB4MDNDQSwgMHgwN0UwLCAweDAwRjcsIDB4MEZDNCwgMHgwM0Y1LAorICAweDAwRjYsIDB4MDFGQywgMHgwMDAzLCAweDAzRjQsIDB4MDA3MSwgMHgwM0Y3LCAweDAwRjEsIDB4MDAxMywgMHgwMDMxLAorICAweDAwMzAsIDB4MDA3MCwgMHgwMDA1LCAweDAwMTIsIDB4MDA3MywgMHgwMUZGLCAweDAwNzIsIDB4MDA3RCwgMHgwMDAyLCB9LAoreyAweDAwNjEsIDB4MDA1NSwgMHgwMDYwLCAweDAyQzksIDB4MDJDOCwgMHgwMkNCLCAweDAxNzEsIDB4MDBCNSwgMHgwMDU0LAorICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwNTcsIDB4MDAwMSwgMHgwMDYzLCAweDAwMUQsIDB4MDA2MiwgMHgwMDM5LAorICAweDAwNkQsIDB4MDAwMCwgMHgwMDA1LCAweDAwMzgsIDB4MDA1NiwgMHgwMEI0LCAweDAwNkMsIDB4MDAwMywgMHgwMDFDLAorICAweDAwNkYsIDB4MDAzQiwgMHgwMDAyLCAweDAwM0EsIDB4MDE3MCwgMHgwMEI3LCAweDAxNzMsIDB4MDA1MSwgMHgwMDZFLAorICAweDAwMjUsIDB4MDA1MCwgMHgwMDY5LCAweDAyQ0EsIDB4MDAyNCwgMHgwMDI3LCAweDAxNzIsIDB4MDBCNiwgMHgwMEIxLAorICAweDAwMEQsIDB4MDAwQywgMHgwMDFGLCAweDAxN0QsIDB4MDAyNiwgMHgwMDY4LCAweDAwNTMsIDB4MDE3QywgMHgwMDZCLAorICAweDAwMUUsIDB4MDAwRiwgMHgwMDA0LCAweDAxN0YsIDB4MDA2QSwgMHgwMkY1LCAweDAwMTksIDB4MDAyMSwgMHgwMDUyLAorICAweDAyRjQsIDB4MDJGNywgMHgwMDIwLCAweDBCQ0QsIDB4MDVFNSwgMHgwNUU0LCAweDBCQ0MsIDB4MDAyMywgMHgwMEIwLAorICAweDAyRjYsIDB4MDBCMywgMHgwMDIyLCAweDAyRjEsIDB4MDJGMCwgMHgwQkNGLCAweDBCQ0UsIDB4MDE3RSwgMHgwMDVELCB9LAoreyAweDAwQkQsIDB4MDAyNSwgMHgwMUExLCAweDAxNTksIDB4MDI5OSwgMHgwMEJDLCAweDAwMjQsIDB4MDUwNSwgMHgwNTA0LAorICAweDAxQTAsIDB4MDAwMSwgMHgwMDFELCAweDAwNkQsIDB4MDAxQywgMHgwMDAxLCAweDAwMDUsIDB4MDAyNywgMHgwMUEzLAorICAweDAxNTgsIDB4MDAxRiwgMHgwMDFFLCAweDAxQTIsIDB4MDAyNiwgMHgwMDIxLCAweDAwMEQsIDB4MDAyMCwgMHgwMDIzLAorICAweDAyOTgsIDB4MDA2QywgMHgwMDIyLCAweDAwQkYsIDB4MDBCRSwgMHgwMUFELCAweDAwMkQsIDB4MDI5QiwgMHgwMEI5LAorICAweDAxQUMsIDB4MDBCOCwgMHgwMUFGLCAweDAyOUEsIDB4MDA2RiwgMHgwMTVCLCAweDAwNkUsIDB4MDI4NSwgMHgwMjg0LAorICAweDAxQUUsIDB4MDAxOSwgMHgwMDJDLCAweDAxQTksIDB4MDFBOCwgMHgwMDBDLCAweDAwMEYsIDB4MDE1QSwgMHgwMEJCLAorICAweDAwMEUsIDB4MDAwMCwgMHgwMDY5LCAweDAxQUIsIDB4MDAxOCwgMHgwMUFBLCAweDAwMDQsIDB4MDA1NSwgMHgwMEJBLAorICAweDA1MDcsIDB4MDE0NSwgMHgwMDU0LCAweDA1MDYsIDB4MDBBNSwgMHgwNTAxLCAweDAwQTQsIDB4MDA1NywgMHgwNTAwLAorICAweDBBMDUsIDB4MDE0NCwgMHgwMEE3LCAweDAyODcsIDB4MDI4NiwgMHgwNTAzLCAweDAxNDcsIDB4MEEwNCwgMHgwMTQ2LCB9LAoreyAweDA3NTksIDB4MDA0MSwgMHgwMEU1LCAweDAzQkQsIDB4MEU5RCwgMHgwMTJELCAweDAxMkMsIDB4M0ExRCwgMHgwM0JDLAorICAweDAxMkYsIDB4MDAwRCwgMHgwMDQwLCAweDAwRTQsIDB4MDNCRiwgMHgwMDQzLCAweDAwNDIsIDB4MDc1OCwgMHgwM0JFLAorICAweDAwRTcsIDB4MDAwMSwgMHgwMDAwLCAweDAwM0QsIDB4MDBFNiwgMHgwMDE1LCAweDAwMTQsIDB4MDAxNywgMHgwMDNDLAorICAweDc0M0QsIDB4MDEyRSwgMHgwM0I5LCAweDAzQjgsIDB4MEU5QywgMHgwM0JCLCAweDA3NUIsIDB4M0ExQywgMHgwRTlGLAorICAweDAxMjksIDB4MDBFMSwgMHgwMTI4LCAweDBFOUUsIDB4MDEyQiwgMHgwNzVBLCAweDAwRTAsIDB4MEU5OSwgMHgwNzQ1LAorICAweDNBMUYsIDB4MDNCQSwgMHgwNzQ0LCAweDBFOTgsIDB4MUQwRCwgMHgwM0E1LCAweDBFOUIsIDB4NzQzQywgMHgwRTlBLAorICAweDAxMkEsIDB4MDA0RCwgMHgwMEUzLCAweDBFODUsIDB4MDFENSwgMHgwRTg0LCAweDAwNEMsIDB4MDc0NywgMHgxRDBDLAorICAweDAxRDQsIDB4MDAzRiwgMHgwMDE2LCAweDA3NDYsIDB4MDNBNCwgMHgwNzQxLCAweDAwNEYsIDB4MDAzRSwgMHgwMUQ3LAorICAweDA3NDAsIDB4MDAwQywgMHgwMDExLCAweDAwNEUsIDB4MDBFMiwgMHgwMEVELCAweDAwRUMsIDB4MDA0OSwgMHgwMDQ4LCB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWljX21vZGUyX3ZsY19iaXRzW0FJQ19NT0RFMl9OVU1dW0FJQ19NT0RFMl9TSVpFXSA9IHsKK3sgIDEsICA1LCAgNCwgMTAsICA2LCAgOCwgIDUsICA4LCAgOCwKKyAgIDcsICA1LCAgNywgMTEsIDEwLCAgOSwgIDgsIDEzLCAxMSwKKyAgIDYsICA3LCAgMywgIDksICA4LCAxMCwgIDksICA4LCAgNSwKKyAgMTAsICA5LCAxMCwgMTAsIDE0LCAxMiwgMTQsIDE0LCAxMiwKKyAgIDgsICA5LCAgNywgMTIsICA4LCAxNCwgIDksICA5LCAxMiwKKyAgIDgsICA5LCAxMSwgMTEsIDEzLCAgOSwgMTEsIDE0LCAxMiwKKyAgIDYsICA3LCAgOSwgMTMsICA5LCAxMiwgIDcsIDEwLCAxMiwKKyAgMTEsIDEyLCAgOCwgMTUsIDEwLCAxNSwgMTMsICA3LCAxMiwKKyAgMTAsIDEwLCAgOCwgMTAsIDEzLCAxMywgMTMsIDExLCAgOCwgfSwKK3sgIDQsICA2LCAgNSwgMTEsICA4LCAxMCwgIDcsIDExLCAgOSwKKyAgIDQsICAxLCAgNCwgIDksICA3LCAgNywgIDUsICA5LCAxMCwKKyAgIDYsICA3LCAgNCwgIDksICA5LCAxMCwgIDksICA5LCAgNiwKKyAgIDksIDEwLCAgOSwgMTAsIDEyLCAxMiwgMTMsIDEyLCAxMSwKKyAgIDksICA5LCAgOCwgMTIsICA4LCAxNCwgMTAsIDExLCAxMiwKKyAgIDcsICA4LCAxMCwgMTEsIDEyLCAgOSwgMTEsIDEzLCAxMiwKKyAgIDYsICA3LCAgOCwgMTIsICA5LCAxMiwgIDcsIDExLCAxMCwKKyAgMTIsIDEyLCAgOSwgMTQsIDEyLCAxNSwgMTMsICA4LCAxMiwKKyAgMTEsIDExLCAxMCwgMTIsIDEzLCAxNSwgMTQsIDEyLCAgOSwgfSwKK3sgIDUsICA3LCAgNiwgMTIsICA5LCAxMSwgIDgsIDExLCAxMCwKKyAgIDcsICA1LCAgNywgMTEsIDEwLCAgOSwgIDgsIDEyLCAxMiwKKyAgIDUsICA1LCAgMSwgIDgsICA3LCAxMCwgIDgsICA2LCAgNCwKKyAgIDgsICA4LCAgOCwgIDksIDEyLCAxMSwgMTMsIDEyLCAxMSwKKyAgIDgsICA5LCAgOCwgMTIsICA4LCAxMywgMTAsIDExLCAxMSwKKyAgIDgsICA5LCAxMSwgMTIsIDEzLCAxMSwgMTIsIDE0LCAxMywKKyAgIDgsICA5LCAxMCwgMTQsIDExLCAxNCwgIDksIDEzLCAxMywKKyAgIDgsICA5LCAgNiwgMTEsIDEwLCAxNCwgMTEsICA2LCAxMCwKKyAgIDYsICA2LCAgNCwgIDgsICA5LCAxMCwgMTAsICA4LCAgNSwgfSwKK3sgMTEsICA3LCAgOCwgMTAsIDEyLCAgOSwgMTAsIDE0LCAxMiwKKyAgIDcsICAxLCAgNSwgIDcsICA4LCAgNiwgIDQsIDEwLCAgOSwKKyAgMTAsICA1LCAgNCwgIDgsIDExLCAgOCwgIDcsICA2LCAgNywKKyAgMTEsICA2LCAgNywgIDgsIDEwLCAgOCwgMTAsIDExLCAgOSwKKyAgMTAsICA4LCAgOSwgMTMsICA5LCAxMiwgIDgsIDExLCAxMiwKKyAgMTEsICA0LCAgNywgIDgsICA5LCAgNiwgIDgsIDEyLCAgOSwKKyAgIDgsICA1LCAgOCwgMTIsICA5LCAxMCwgIDYsIDEyLCAxMSwKKyAgMTIsIDEyLCAxMCwgMTUsIDEzLCAxMywgMTMsIDEwLCAxMywKKyAgMTUsIDEwLCAgOSwgMTAsIDEyLCAxMywgMTMsIDEwLCAgOSwgfSwKK3sgMTEsICA4LCAgOCwgMTEsIDEzLCAxMCwgMTEsIDE1LCAxMiwKKyAgIDcsICAxLCAgNCwgIDcsICA3LCAgNSwgIDQsICA4LCAgOSwKKyAgMTEsICA1LCAgNSwgIDgsIDExLCAgOSwgIDgsICA3LCAgOCwKKyAgMTMsICA3LCAgOCwgIDksIDExLCAgOSwgMTAsIDEyLCAxMCwKKyAgMTAsICA5LCAgOCwgMTMsICA5LCAxMiwgIDksIDExLCAxMiwKKyAgMTEsICA1LCAgNywgIDksIDEwLCAgNiwgIDksIDEzLCAxMCwKKyAgIDcsICA0LCAgNywgMTEsICA4LCAgOSwgIDUsIDEwLCAxMSwKKyAgMTMsIDExLCAgOSwgMTUsIDEzLCAxNSwgMTMsICA4LCAxMiwKKyAgMTUsIDEwLCAxMCwgMTIsIDEzLCAxNCwgMTQsIDEyLCAxMSwgfSwKK3sgMTIsICA5LCAgOSwgMTIsIDEzLCAxMSwgMTEsIDE0LCAxMiwKKyAgIDgsICAyLCAgNSwgIDcsICA5LCAgNiwgIDUsIDEwLCAxMCwKKyAgIDksICA0LCAgMiwgIDcsICA5LCAgNywgIDYsICA1LCAgNiwKKyAgMTIsICA2LCAgNywgIDgsIDEwLCAgOCwgMTAsIDExLCAgOSwKKyAgMTIsICA5LCAxMCwgMTMsIDExLCAxMiwgMTAsIDE0LCAxMywKKyAgMTIsICA2LCAgOCwgMTAsIDEwLCAgNywgIDksIDEyLCAxMCwKKyAgIDgsICA1LCAgOCwgMTEsICA5LCAxMCwgIDcsIDExLCAxMiwKKyAgIDgsICA2LCAgNSwgMTEsIDExLCAxMSwgIDgsICA2LCAgOSwKKyAgMTIsICA2LCAgNiwgIDgsIDEwLCAxMCwgMTEsICA4LCAgNiwgfSwKK3sgMTMsICA5LCAxMCwgMTIsIDE0LCAxMiwgMTEsIDE1LCAxNSwKKyAgIDgsICAxLCAgNSwgIDcsICA5LCAgNiwgIDUsIDExLCAxMCwKKyAgMTEsICA2LCAgNSwgIDksIDExLCAgOSwgIDgsICA3LCAgOCwKKyAgMTIsICA2LCAgOCwgIDgsIDExLCAgOCwgMTAsIDEyLCAxMCwKKyAgMTAsICA3LCAgOSwgMTMsIDEwLCAxMSwgIDksIDEzLCAxMiwKKyAgMTEsICAzLCAgNiwgIDgsICA5LCAgNCwgIDcsIDExLCAgOCwKKyAgIDgsICA1LCAgOSwgMTIsIDEwLCAgOSwgIDcsIDEyLCAxMywKKyAgMTMsIDEyLCAxMCwgMTQsIDE0LCAxNSwgMTIsIDExLCAxNCwKKyAgMTUsICA3LCAgOSwgIDgsIDExLCAxMSwgMTIsIDEwLCAgOSwgfSwKK3sgMTAsICA1LCAgNiwgIDksIDExLCAgNywgIDgsIDEyLCAxMSwKKyAgIDgsICAxLCAgNCwgIDcsICA5LCAgNiwgIDQsIDEwLCAxMCwKKyAgMTEsICA2LCAgNiwgIDksICA5LCAgOSwgIDksICA4LCAgOCwKKyAgMTQsIDEwLCAxMCwgMTIsIDEyLCAxMSwgMTIsIDEzLCAxMiwKKyAgMTAsICA3LCAgOCwgMTIsICA5LCAxMSwgIDgsIDEyLCAxMSwKKyAgMTMsICA3LCAxMCwgMTEsIDExLCAgOCwgMTAsIDEzLCAxMSwKKyAgIDYsICAzLCAgNywgMTEsICA4LCAgOSwgIDUsIDEwLCAxMSwKKyAgMTEsIDExLCAgOSwgMTQsIDE0LCAxNCwgMTEsIDEwLCAxMywKKyAgMTQsIDEwLCAxMSwgMTMsIDEzLCAxMywgMTQsIDEyLCAxMiwgfSwKK3sgIDIsICA1LCAgMywgMTEsICA4LCAgOCwgIDYsICA2LCAgNywKKyAgIDgsICA1LCAgNiwgMTIsIDEwLCAxMCwgIDgsIDEwLCAxMSwKKyAgIDcsICA2LCAgMiwgIDksICA4LCAxMCwgIDgsICA1LCAgNCwKKyAgMTAsIDExLCAxMCwgMTAsIDEzLCAxMiwgMTQsIDEzLCAxMCwKKyAgMTAsIDExLCAgOCwgMTQsICA5LCAxNCwgMTIsIDExLCAxMiwKKyAgIDksIDEwLCAgOSwgMTMsIDEyLCAxMSwgMTIsIDE0LCAxMSwKKyAgIDgsIDEwLCAgNywgMTMsIDEwLCAxMiwgIDgsIDEyLCAxMiwKKyAgMTAsICA5LCAgNiwgMTIsIDExLCAxMSwgMTEsICA2LCAgOSwKKyAgMTAsICA5LCAgNiwgMTAsICA5LCAxMiwgMTEsICA4LCAgNywgfSwKK3sgIDYsICA4LCAgNiwgMTIsIDExLCAxMSwgMTAsIDEwLCAgOSwKKyAgIDYsICAxLCAgMywgMTAsICA4LCAgOCwgIDYsICA3LCAxMCwKKyAgIDgsICA2LCAgMywgMTAsICA5LCAxMCwgIDgsICA2LCAgNSwKKyAgMTEsIDEwLCAxMCwgMTIsIDEzLCAxMiwgMTQsIDEzLCAxMiwKKyAgMTAsIDExLCAgOCwgMTIsICA5LCAxNCwgMTIsIDExLCAxMiwKKyAgIDksICA5LCAgOCwgMTIsIDEyLCAxMCwgMTIsIDEzLCAxMSwKKyAgIDcsICA4LCAgNiwgMTMsICA5LCAxMSwgIDcsIDExLCAxMSwKKyAgMTEsIDEwLCAgNywgMTQsIDExLCAxMiwgMTIsICA3LCAxMCwKKyAgMTIsIDExLCAgOCwgMTMsIDEyLCAxNCwgMTMsIDExLCAxMCwgfSwKK3sgIDcsIDEwLCAgNywgMTMsIDEzLCAxMywgMTEsIDExLCAxMCwKKyAgIDgsICA1LCAgNiwgMTIsIDExLCAxMCwgIDksIDEwLCAxMSwKKyAgIDcsICA1LCAgMSwgIDksICA4LCAxMCwgIDcsICA0LCAgNCwKKyAgIDksIDExLCAgOSwgMTEsIDEyLCAxMSwgMTMsIDEzLCAxMCwKKyAgIDksIDExLCAgOCwgMTMsICA5LCAxNCwgMTIsIDExLCAxMiwKKyAgMTEsIDEwLCAxMCwgMTMsIDEyLCAxMSwgMTQsIDE0LCAxMiwKKyAgIDksIDEwLCAgOCwgMTMsIDEwLCAxNCwgIDksIDEyLCAxMiwKKyAgIDksICA3LCAgNCwgMTIsIDEwLCAxMSwgMTAsICA2LCAgNywKKyAgIDksICA3LCAgNCwgIDksICA5LCAxMSwgIDksICA3LCAgNSwgfSwKK3sgIDcsICA5LCAgNywgMTQsIDExLCAxMiwgMTAsICA5LCAgOSwKKyAgIDgsICA1LCAgNSwgMTIsICA5LCAxMCwgIDgsICA4LCAxMSwKKyAgIDcsICA1LCAgMiwgIDgsICA4LCAgOSwgIDcsICA0LCAgNCwKKyAgMTAsIDExLCAxMCwgMTIsIDE0LCAxMSwgMTIsIDEzLCAxMiwKKyAgIDksIDEwLCAgOCwgMTMsICA4LCAxMywgMTAsIDExLCAxMSwKKyAgIDksICA5LCAgOCwgMTQsIDEwLCAxMCwgMTEsIDEyLCAxMSwKKyAgMTAsIDExLCAgOSwgMTQsIDEwLCAxNCwgIDksIDEyLCAxNCwKKyAgIDYsICA2LCAgMywgMTEsICA4LCAgOSwgIDgsICAzLCAgNiwKKyAgIDksICA3LCAgNCwgMTAsICA4LCAxMSwgMTAsICA2LCAgNSwgfSwKK3sgIDYsICA4LCAgNywgMTMsIDEyLCAxMiwgMTAsICA5LCAgOSwKKyAgIDksICA3LCAgOCwgMTMsIDExLCAxMSwgIDksIDExLCAxMiwKKyAgIDcsICA2LCAgMSwgIDksICA4LCAxMCwgIDcsICA1LCAgNCwKKyAgMTAsIDEyLCAxMCwgMTIsIDEzLCAxMywgMTQsIDEzLCAxMSwKKyAgIDksIDExLCAgOSwgMTMsIDEwLCAxNCwgMTIsIDEyLCAxMiwKKyAgMTEsIDEyLCAxMCwgMTQsIDEzLCAxMiwgMTMsIDE0LCAxMiwKKyAgIDgsICA5LCAgNywgMTMsIDEwLCAxMywgIDgsIDExLCAxMiwKKyAgIDgsICA2LCAgMywgMTIsICA5LCAxMCwgIDksICA0LCAgNiwKKyAgMTAsICA4LCAgNSwgMTAsIDEwLCAxMiwgMTEsICA4LCAgNiwgfSwKK3sgIDcsIDEwLCAgNywgMTIsICA5LCAxMiwgMTAsIDEwLCAxMiwKKyAgIDksICA3LCAgNywgMTIsICA5LCAxMSwgIDYsIDEwLCAxMSwKKyAgIDYsICA2LCAgMSwgIDksICA4LCAgOSwgIDcsICA0LCAgNSwKKyAgMTEsIDEyLCAgOSwgMTIsIDEwLCAxNCwgMTMsIDEzLCAxMSwKKyAgMTAsIDEyLCAgOCwgMTMsICA4LCAxNCwgMTAsIDEwLCAxMSwKKyAgMTEsIDExLCAxMCwgMTMsIDE0LCAxMCwgMTQsIDEzLCAxMSwKKyAgMTEsIDEwLCAgNywgMTMsICA4LCAxMiwgIDcsIDEwLCAxMiwKKyAgIDcsIDEwLCAgNCwgMTIsICA2LCAxMCwgIDgsICA1LCAgOCwKKyAgMTAsICA3LCAgNCwgIDksICA3LCAxMCwgIDksICA2LCAgNSwgfSwKK3sgIDcsICA5LCAgNywgMTMsIDEyLCAxMywgMTAsIDEwLCAgOCwKKyAgIDgsICA1LCAgNiwgMTEsIDEwLCAxMCwgIDgsIDEwLCAxMCwKKyAgIDcsICA1LCAgMiwgIDksICA4LCAgOSwgIDcsICA1LCAgMywKKyAgIDgsICA5LCAgNywgIDksIDExLCAxMSwgMTMsIDExLCAgOSwKKyAgIDgsIDEwLCAgNywgMTIsICA5LCAxNCwgMTEsIDEwLCAxMCwKKyAgIDksIDEwLCAgOSwgMTIsIDEyLCAxMiwgMTMsIDE0LCAxMiwKKyAgMTAsIDEwLCAgOSwgMTMsIDExLCAxMywgIDksIDEzLCAxMiwKKyAgIDgsICA3LCAgNCwgMTIsIDEwLCAxMCwgMTAsICA2LCAgNiwKKyAgIDcsICA2LCAgMywgIDksICA4LCAxMCwgIDksICA2LCAgMywgfSwKK3sgIDcsIDEwLCAgNywgMTMsIDEzLCAxMywgMTEsIDExLCAgOSwKKyAgIDgsICA2LCAgNiwgMTMsIDExLCAxMSwgIDksIDEwLCAxMSwKKyAgIDcsICA2LCAgMSwgIDksICA4LCAxMCwgIDgsICA1LCAgNCwKKyAgIDgsICA5LCAgOCwgIDksIDEyLCAxMiwgMTIsIDEyLCAgOCwKKyAgMTAsIDEzLCAgOSwgMTQsIDExLCAxNCwgMTQsIDEzLCAxMiwKKyAgIDksIDEwLCAgOSwgMTMsIDEyLCAxMSwgMTMsIDE0LCAxMSwKKyAgIDksIDExLCAgOCwgMTMsIDExLCAxMywgMTAsIDEzLCAxMywKKyAgIDksICA4LCAgNSwgMTIsIDEwLCAxMSwgMTEsICA2LCAgNywKKyAgIDgsICA3LCAgMywgIDgsICA5LCAxMSwgMTAsICA3LCAgNCwgfSwKK3sgIDgsICA5LCAgNywgMTEsIDExLCAxMiwgMTEsIDE0LCAgOSwKKyAgIDgsICA2LCAgNiwgMTEsIDEzLCAxMCwgIDksIDExLCAgOSwKKyAgIDcsICA1LCAgMSwgIDcsICA5LCAgOSwgIDcsICA1LCAgMywKKyAgMTMsIDExLCAgOSwgMTAsIDEyLCAxMSwgMTIsIDEyLCAgOSwKKyAgMTAsIDExLCAgOSwgMTMsICA5LCAxMiwgMTIsIDEyLCAxMCwKKyAgMTIsIDExLCAxMCwgMTMsIDE0LCAxMiwgMTQsIDE0LCAxMSwKKyAgMTEsICA4LCAgOCwgMTMsIDExLCAxMiwgIDksIDEzLCAxMSwKKyAgIDksIDEwLCAgNSwgMTEsICA4LCAxMSwgIDksICA2LCAgNywKKyAgIDcsICA4LCAgNCwgIDYsICA4LCAxMCwgIDgsICA4LCAgNSwgfSwKK3sgIDgsIDEwLCAgOCwgMTMsIDEzLCAxMywgMTIsIDExLCAxMCwKKyAgIDUsICAxLCAgMywgMTAsICA3LCAgOCwgIDYsICA4LCAgOSwKKyAgIDgsICA3LCAgNCwgIDksIDEwLCAxMSwgIDgsICA3LCAgNiwKKyAgIDgsICA5LCAgNywgIDksIDEyLCAxMSwgMTIsIDEwLCAgOCwKKyAgIDksIDEwLCAgOCwgMTMsICA5LCAgOSwgMTIsIDExLCAxMSwKKyAgIDcsICA3LCAgNiwgMTIsICA5LCAgOCwgMTAsIDEyLCAgOCwKKyAgIDYsICA3LCAgNCwgMTIsICA4LCAxMywgIDYsICA5LCAxMCwKKyAgMTMsIDEzLCAgOSwgMTUsIDE0LCAxNCwgMTUsICA5LCAxMSwKKyAgMTMsIDExLCAgOSwgMTMsIDEzLCAxNSwgMTUsIDEyLCAxMCwgfSwKK3sgMTAsICA4LCAgOSwgMTEsIDEyLCAxMCwgIDgsIDEzLCAxMywKKyAgIDksICAyLCAgNSwgIDcsICA1LCAgNCwgIDMsICA4LCAgOSwKKyAgMTEsICA1LCAgNSwgIDksICA4LCAgOCwgIDYsICA4LCAgOCwKKyAgMTIsICA3LCAgOCwgMTAsIDEwLCAgOSwgIDgsIDEyLCAxMCwKKyAgIDksIDEwLCAgOSwgMTIsICA3LCAxMSwgIDcsIDEyLCAxMiwKKyAgIDksICA1LCAgOCwgIDksICA5LCAgNiwgIDYsIDExLCAxMCwKKyAgIDYsICA0LCAgNywgIDksICA1LCAgOSwgIDMsICA5LCAxMCwKKyAgMTMsIDExLCAgOSwgMTMsIDEwLCAxMywgMTAsICA5LCAxMywKKyAgMTQsIDExLCAxMCwgMTIsIDEyLCAxMywgMTEsIDE0LCAxMSwgfSwKK3sgMTEsICA3LCAgOCwgMTAsIDEyLCAgOSwgIDksIDE0LCAxMCwKKyAgIDksICA0LCAgNywgIDgsIDEwLCAgNywgIDcsIDExLCAxMCwKKyAgIDgsICAyLCAgMiwgIDYsICA4LCAgNSwgIDUsICA1LCAgNiwKKyAgMTUsICA5LCAxMCwgMTAsIDEyLCAxMCwgMTEsIDE0LCAxMiwKKyAgIDksICA4LCAgOSwgMTIsICA5LCAxMSwgIDgsIDEyLCAxMSwKKyAgMTQsIDEwLCAxMSwgMTIsIDEzLCAxMCwgMTIsIDE1LCAxMiwKKyAgIDksICA3LCAgOCwgMTIsICA5LCAxMiwgIDcsIDExLCAxMywKKyAgIDksICA2LCAgNSwgMTEsIDEwLCAxMSwgIDcsICA2LCAgOSwKKyAgMTEsICA0LCAgNSwgIDcsICA4LCAgOCwgIDgsICA3LCAgNywgfSwKK307CisvL0B9CisKKy8qKgorICogQ29kZXMgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgYmxvY2sgdHlwZQorICovCisvL0B7CisjZGVmaW5lIEFJQ19NT0RFMV9OVU0gIDkwCisjZGVmaW5lIEFJQ19NT0RFMV9TSVpFICA5CisjZGVmaW5lIEFJQ19NT0RFMV9CSVRTICA3CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFpY19tb2RlMV92bGNfY29kZXNbQUlDX01PREUxX05VTV1bQUlDX01PREUxX1NJWkVdID0geworIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgxMSwgMHgwMCwgMHgwOSwgMHgwMywgMHgxMCwgMHgwNSx9LAorIHsgMHgwOSwgMHgwMSwgMHgwMSwgMHgwNSwgMHgxMSwgMHgwMCwgMHgwMywgMHgyMSwgMHgyMCx9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgxMSwgMHgwOSwgMHgxMCwgMHgwNSwgMHgwMCwgMHgwMyx9LAorIHsgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMywgMHgyMSwgMHgwNSwgMHgwOSwgMHgyMCwgMHgxMSx9LAorIHsgMHgwMSwgMHgwOSwgMHgwMCwgMHgyOSwgMHgwOCwgMHgxNSwgMHgwMywgMHgwQiwgMHgyOCx9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMywgMHgwMix9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwNSwgMHgwMCwgMHgwMywgMHgwMSwgMHgwOSwgMHgwOCx9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwOSwgMHgwMSwgMHgwOCwgMHgwMCwgMHgwMywgMHgwNSx9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwNSwgMHgxMSwgMHgwOSwgMHgxMCwgMHgwMyx9LAorIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9LAorCisgeyAweDAxLCAweDAxLCAweDAxLCAweDA1LCAweDAxLCAweDAwLCAweDAzLCAweDA5LCAweDA4LH0sCisgeyAweDA5LCAweDAxLCAweDAxLCAweDA1LCAweDExLCAweDAwLCAweDAzLCAweDIxLCAweDIwLH0sCisgeyAweDAxLCAweDAxLCAweDAxLCAweDBELCAweDA1LCAweDA0LCAweDAwLCAweDA3LCAweDBDLH0sCisgeyAweDAxLCAweDAxLCAweDAwLCAweDA1LCAweDExLCAweDAzLCAweDA5LCAweDIxLCAweDIwLH0sCisgeyAweDA1LCAweDAxLCAweDAxLCAweDExLCAweDAwLCAweDA5LCAweDAzLCAweDIxLCAweDIwLH0sCisgeyAweDA5LCAweDAxLCAweDAxLCAweDAwLCAweDA1LCAweDAxLCAweDAzLCAweDExLCAweDEwLH0sCisgeyAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDAzLCAweDAyLH0sCisgeyAweDAxLCAweDAxLCAweDAxLCAweDA5LCAweDAwLCAweDA1LCAweDAxLCAweDAzLCAweDA4LH0sCisgeyAweDAxLCAweDAxLCAweDAxLCAweDA5LCAweDExLCAweDA1LCAweDAwLCAweDEwLCAweDAzLH0sCisgeyAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH0sCisKKyB7IDB4MDEsIDB4MDAsIDB4MDEsIDB4MDksIDB4MDgsIDB4MTUsIDB4MTQsIDB4MEIsIDB4MDMsfSwKKyB7IDB4MEQsIDB4MDEsIDB4MDEsIDB4MDUsIDB4MEMsIDB4MDQsIDB4MDEsIDB4MDAsIDB4MDcsfSwKKyB7IDB4MDEsIDB4MDEsIDB4MDEsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MDMsIDB4MDEsIDB4MDEsfSwKKyB7IDB4MDUsIDB4MDEsIDB4MDEsIDB4MDQsIDB4MTksIDB4MDcsIDB4MTgsIDB4MEQsIDB4MDAsfSwKKyB7IDB4MTEsIDB4MDksIDB4MDEsIDB4MjEsIDB4MDUsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDMsfSwKKyB7IDB4NDEsIDB4MDEsIDB4MDAsIDB4MDUsIDB4NDAsIDB4MDMsIDB4MDksIDB4MjEsIDB4MTEsfSwKKyB7IDB4MjksIDB4MDEsIDB4MDAsIDB4MjgsIDB4MDksIDB4MTUsIDB4MDMsIDB4MDgsIDB4MEIsfSwKKyB7IDB4MDEsIDB4MDAsIDB4MDEsIDB4MTEsIDB4MDksIDB4MTAsIDB4MDUsIDB4MDEsIDB4MDMsfSwKKyB7IDB4MDUsIDB4MDEsIDB4MDEsIDB4MDQsIDB4MEQsIDB4MEMsIDB4MDcsIDB4MDAsIDB4MDEsfSwKKyB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfSwKKworIHsgMHgwMSwgMHgwMCwgMHgwMywgMHgwNSwgMHgxMSwgMHgxMCwgMHgyNSwgMHgyNCwgMHgxMyx9LAorIHsgMHgyMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgxMSwgMHgwMywgMHgwNSwgMHgyMCwgMHgwOSx9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwOSwgMHgxMSwgMHgxMCwgMHgwNSwgMHgwMyx9LAorIHsgMHgyMSwgMHgwNSwgMHgwMSwgMHgwMSwgMHgwOSwgMHgwMCwgMHgxMSwgMHgyMCwgMHgwMyx9LAorIHsgMHgwNSwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMSwgMHgxOSwgMHgwNywgMHgxOCwgMHgwRCx9LAorIHsgMHgxMSwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwOSwgMHgwMSwgMHgwMywgMHgxMCwgMHgwNSx9LAorIHsgMHgxRCwgMHgwMSwgMHgwNSwgMHgwRCwgMHgwQywgMHgwNCwgMHgwMCwgMHgxQywgMHgwRix9LAorIHsgMHgwNSwgMHgxOSwgMHgwMSwgMHgwNCwgMHgwMCwgMHgxOCwgMHgxQiwgMHgxQSwgMHgwNyx9LAorIHsgMHgwOSwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwNSwgMHgwMywgMHgxMSwgMHgxMCwgMHgwMSx9LAorIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9LAorCisgeyAweDAxLCAweDAwLCAweDAzLCAweDQxLCAweDA1LCAweDQwLCAweDA5LCAweDExLCAweDIxLH0sCisgeyAweDA1LCAweDAxLCAweDAxLCAweDE5LCAweDA0LCAweDA3LCAweDAwLCAweDE4LCAweDBELH0sCisgeyAweDAxLCAweDAxLCAweDAxLCAweDA1LCAweDAxLCAweDA0LCAweDAxLCAweDAwLCAweDAzLH0sCisgeyAweDAxLCAweDA1LCAweDAwLCAweDBELCAweDAxLCAweDA0LCAweDA3LCAweDE5LCAweDE4LH0sCisgeyAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAxLCAweDAzLCAweDAyLH0sCisgeyAweDMxLCAweDAxLCAweDA1LCAweDE5LCAweDA0LCAweDA3LCAweDAwLCAweDMwLCAweDBELH0sCisgeyAweDAxLCAweDAwLCAweDAzLCAweDExLCAweDAxLCAweDA1LCAweDAxLCAweDA5LCAweDEwLH0sCisgeyAweDAxLCAweDA1LCAweDAxLCAweDExLCAweDAxLCAweDEwLCAweDAwLCAweDAzLCAweDA5LH0sCisgeyAweDAxLCAweDA5LCAweDAwLCAweDI5LCAweDAzLCAweDA4LCAweDI4LCAweDE1LCAweDBCLH0sCisgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH0sCisKKyB7IDB4MDEsIDB4MDEsIDB4MDAsIDB4MDksIDB4MTUsIDB4MDMsIDB4MDgsIDB4MTQsIDB4MEIsfSwKKyB7IDB4MTEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDksIDB4MDEsIDB4MDMsIDB4MTAsIDB4MDUsfSwKKyB7IDB4MDEsIDB4MDAsIDB4MDMsIDB4MjUsIDB4MTEsIDB4MDUsIDB4MTAsIDB4MjQsIDB4MTMsfSwKKyB7IDB4MTEsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDksIDB4MDEsIDB4MDUsIDB4MTAsIDB4MDMsfSwKKyB7IDB4MDUsIDB4MDEsIDB4MDAsIDB4MEQsIDB4MEMsIDB4MDQsIDB4MEYsIDB4MUQsIDB4MUMsfSwKKyB7IDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDMsIDB4MDIsfSwKKyB7IDB4MjEsIDB4MDEsIDB4MDUsIDB4MDksIDB4MTEsIDB4MDAsIDB4MDMsIDB4NDEsIDB4NDAsfSwKKyB7IDB4MDUsIDB4MDEsIDB4MDAsIDB4MUQsIDB4MUMsIDB4MEQsIDB4MEMsIDB4MEYsIDB4MDQsfSwKKyB7IDB4MDUsIDB4MDEsIDB4MDAsIDB4MEQsIDB4MzEsIDB4MDQsIDB4MTksIDB4MzAsIDB4MDcsfSwKKyB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfSwKKworIHsgMHgwMSwgMHgwMSwgMHgwMCwgMHgyMSwgMHgwNSwgMHgxMSwgMHgwMywgMHgwOSwgMHgyMCx9LAorIHsgMHgwMSwgMHgwMSwgMHgwMCwgMHgxMSwgMHgwMywgMHgwNSwgMHgwMSwgMHgwOSwgMHgxMCx9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMywgMHgwMix9LAorIHsgMHgwNSwgMHgwMSwgMHgwNCwgMHgxOSwgMHgwNywgMHgwRCwgMHgwMCwgMHgzMSwgMHgzMCx9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMywgMHgwMix9LAorIHsgMHgwNSwgMHgwMSwgMHgwMSwgMHgxMSwgMHgwOSwgMHgwMCwgMHgwMywgMHgyMSwgMHgyMCx9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMywgMHgwMix9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMywgMHgwMSwgMHgwMSwgMHgwMix9LAorIHsgMHgwOSwgMHgwMSwgMHgwMCwgMHgyOSwgMHgwOCwgMHgxNSwgMHgwMywgMHgyOCwgMHgwQix9LAorIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9LAorCisgeyAweDAxLCAweDAxLCAweDAxLCAweDA1LCAweDAxLCAweDA0LCAweDAwLCAweDAxLCAweDAzLH0sCisgeyAweDA5LCAweDAxLCAweDAwLCAweDI5LCAweDI4LCAweDE1LCAweDA4LCAweDAzLCAweDBCLH0sCisgeyAweDAxLCAweDAwLCAweDAxLCAweDExLCAweDA1LCAweDEwLCAweDA5LCAweDAxLCAweDAzLH0sCisgeyAweDA1LCAweDA0LCAweDAxLCAweDFELCAweDBELCAweDBDLCAweDFDLCAweDAwLCAweDBGLH0sCisgeyAweDA5LCAweDExLCAweDAxLCAweDQxLCAweDAwLCAweDQwLCAweDA1LCAweDAzLCAweDIxLH0sCisgeyAweDBELCAweDA1LCAweDAxLCAweDFELCAweDFDLCAweDBDLCAweDA0LCAweDAwLCAweDBGLH0sCisgeyAweDQxLCAweDA5LCAweDAxLCAweDQwLCAweDAwLCAweDExLCAweDA1LCAweDAzLCAweDIxLH0sCisgeyAweDAxLCAweDAxLCAweDAxLCAweDA1LCAweDAxLCAweDA0LCAweDAwLCAweDAxLCAweDAzLH0sCisgeyAweDA1LCAweDA0LCAweDAxLCAweDBELCAweDAxLCAweDBDLCAweDA3LCAweDAxLCAweDAwLH0sCisgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH0sCisKKyB7IDB4MDUsIDB4MDQsIDB4MDEsIDB4MDcsIDB4MTksIDB4MzEsIDB4MzAsIDB4MEQsIDB4MDAsfSwKKyB7IDB4MjEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MTEsIDB4MDksIDB4MjAsIDB4MDUsIDB4MDMsfSwKKyB7IDB4MDUsIDB4MDEsIDB4MDEsIDB4MDQsIDB4MDcsIDB4MEQsIDB4MEMsIDB4MDAsIDB4MDEsfSwKKyB7IDB4MjEsIDB4MDksIDB4MDEsIDB4MDAsIDB4MjAsIDB4MDUsIDB4MjMsIDB4MjIsIDB4MDMsfSwKKyB7IDB4MzEsIDB4MEQsIDB4MDEsIDB4MTksIDB4MDUsIDB4MzAsIDB4MDQsIDB4MDcsIDB4MDAsfSwKKyB7IDB4MzEsIDB4MDUsIDB4MDEsIDB4MDQsIDB4MTksIDB4MDAsIDB4MEQsIDB4MzAsIDB4MDcsfSwKKyB7IDB4MzEsIDB4MDEsIDB4MDAsIDB4MEQsIDB4MDUsIDB4MTksIDB4MDQsIDB4MzAsIDB4MDcsfSwKKyB7IDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDIsIDB4MDEsIDB4MDEsfSwKKyB7IDB4MDEsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDUsIDB4MDksIDB4MDgsIDB4MDMsIDB4MDEsfSwKKyB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFpY19tb2RlMV92bGNfYml0c1tBSUNfTU9ERTFfTlVNXVtBSUNfTU9ERTFfU0laRV0gPSB7CisgeyAgMSwgIDQsICAyLCAgNywgIDQsICA2LCAgNCwgIDcsICA1LH0sCisgeyAgNSwgIDEsICAzLCAgNCwgIDYsICAzLCAgMywgIDcsICA3LH0sCisgeyAgMSwgIDQsICAyLCAgNywgIDYsICA3LCAgNSwgIDQsICA0LH0sCisgeyAgMSwgIDMsICAzLCAgMywgIDcsICA0LCAgNSwgIDcsICA2LH0sCisgeyAgMiwgIDQsICAyLCAgNiwgIDQsICA1LCAgMiwgIDQsICA2LH0sCisgeyAgNywgIDIsICAzLCAgNCwgIDcsICAxLCAgNSwgIDcsICA3LH0sCisgeyAgNSwgIDEsICAzLCAgNiwgIDUsICA1LCAgMiwgIDcsICA3LH0sCisgeyAgMiwgIDUsICAxLCAgNywgIDMsICA3LCAgNSwgIDUsICA2LH0sCisgeyAgMiwgIDQsICAxLCAgNCwgIDUsICA3LCAgNiwgIDcsICA0LH0sCisgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLH0sCisKKyB7ICAyLCAgMSwgIDMsICA2LCAgNSwgIDUsICA1LCAgNywgIDcsfSwKKyB7ICA1LCAgMSwgIDMsICA0LCAgNiwgIDMsICAzLCAgNywgIDcsfSwKKyB7ICA0LCAgMSwgIDIsICA2LCAgNSwgIDUsICA0LCAgNSwgIDYsfSwKKyB7ICAzLCAgMSwgIDMsICA0LCAgNiwgIDMsICA1LCAgNywgIDcsfSwKKyB7ICA0LCAgMSwgIDMsICA2LCAgMywgIDUsICAzLCAgNywgIDcsfSwKKyB7ICA2LCAgMSwgIDQsICA0LCAgNSwgIDIsICA0LCAgNywgIDcsfSwKKyB7ICA3LCAgMSwgIDUsICA3LCAgNCwgIDMsICAyLCAgNywgIDcsfSwKKyB7ICA1LCAgMywgIDIsICA3LCAgNSwgIDYsICAxLCAgNSwgIDcsfSwKKyB7ICA0LCAgMSwgIDIsICA2LCAgNywgIDUsICA0LCAgNywgIDQsfSwKKyB7ICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsfSwKKworIHsgIDMsICAzLCAgMSwgIDUsICA1LCAgNiwgIDYsICA1LCAgMyx9LAorIHsgIDYsICAyLCAgMSwgIDUsICA2LCAgNSwgIDQsICA0LCAgNSx9LAorIHsgIDYsICA0LCAgMSwgIDcsICA2LCAgNywgIDYsICAzLCAgMix9LAorIHsgIDQsICAzLCAgMSwgIDQsICA2LCAgNCwgIDYsICA1LCAgMyx9LAorIHsgIDYsICA1LCAgMSwgIDcsICA0LCAgNywgIDMsICAzLCAgMyx9LAorIHsgIDcsICAyLCAgMiwgIDMsICA3LCAgMiwgIDQsICA2LCAgNSx9LAorIHsgIDYsICAyLCAgMiwgIDYsICA0LCAgNSwgIDIsICA0LCAgNCx9LAorIHsgIDQsICA0LCAgMSwgIDcsICA2LCAgNywgIDUsICAyLCAgNCx9LAorIHsgIDUsICA0LCAgMSwgIDUsICA2LCAgNiwgIDUsICA0LCAgMix9LAorIHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCx9LAorCisgeyAgMiwgIDIsICAyLCAgMywgIDUsICA1LCAgNiwgIDYsICA1LH0sCisgeyAgNywgIDEsICAzLCAgMywgIDYsICAzLCAgNCwgIDcsICA1LH0sCisgeyAgMiwgIDQsICAxLCAgNCwgIDYsICA3LCAgNywgIDUsICA0LH0sCisgeyAgNywgIDQsICAzLCAgMSwgIDUsICAzLCAgNiwgIDcsICAzLH0sCisgeyAgNCwgIDMsICAzLCAgNCwgIDEsICA2LCAgNCwgIDYsICA1LH0sCisgeyAgNywgIDQsICA0LCAgMiwgIDYsICAxLCAgNCwgIDcsICA1LH0sCisgeyAgNSwgIDIsICAzLCAgNCwgIDQsICAzLCAgMiwgIDUsICA0LH0sCisgeyAgMywgIDUsICAyLCAgMywgIDIsICA1LCAgNSwgIDUsICAzLH0sCisgeyAgNiwgIDQsICA0LCAgMiwgIDUsICA0LCAgNywgIDcsICAxLH0sCisgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLH0sCisKKyB7ICAyLCAgMiwgIDIsICA3LCAgMywgIDcsICA0LCAgNSwgIDYsfSwKKyB7ICA0LCAgMSwgIDMsICA2LCAgNCwgIDQsICAzLCAgNiwgIDUsfSwKKyB7ICAyLCAgNCwgIDEsICA3LCAgMywgIDcsICA2LCAgNiwgIDYsfSwKKyB7ICAzLCAgNCwgIDMsICA1LCAgMSwgIDQsICA0LCAgNiwgIDYsfSwKKyB7ICA0LCAgNSwgIDIsICA3LCAgMSwgIDcsICAzLCAgNywgIDcsfSwKKyB7ICA2LCAgMiwgIDMsICA1LCAgMywgIDMsICAyLCAgNiwgIDQsfSwKKyB7ICA0LCAgNCwgIDQsICA3LCAgMiwgIDUsICAxLCAgNiwgIDcsfSwKKyB7ICA0LCAgNSwgIDIsICA3LCAgMSwgIDcsICA0LCAgNCwgIDYsfSwKKyB7ICAyLCAgNCwgIDIsICA2LCAgMiwgIDQsICA2LCAgNSwgIDQsfSwKKyB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsfSwKKworIHsgIDEsICAzLCAgMywgIDUsICA2LCAgMywgIDUsICA2LCAgNSx9LAorIHsgIDcsICAxLCAgNCwgIDQsICA2LCAgMiwgIDQsICA3LCAgNSx9LAorIHsgIDIsICAyLCAgMiwgIDYsICA1LCAgMywgIDUsICA2LCAgNSx9LAorIHsgIDcsICA0LCAgNCwgIDIsICA2LCAgMSwgIDUsICA3LCAgNCx9LAorIHsgIDMsICAyLCAgMiwgIDQsICA0LCAgMywgIDQsICA1LCAgNSx9LAorIHsgIDcsICAyLCAgNSwgIDMsICA3LCAgMSwgIDQsICA3LCAgNyx9LAorIHsgIDYsICAyLCAgMywgIDQsICA1LCAgMiwgIDIsICA3LCAgNyx9LAorIHsgIDMsICAyLCAgMiwgIDUsICA1LCAgNCwgIDQsICA0LCAgMyx9LAorIHsgIDMsICAyLCAgMiwgIDQsICA2LCAgMywgIDUsICA2LCAgMyx9LAorIHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCx9LAorCisgeyAgMSwgIDMsICAzLCAgNywgIDQsICA2LCAgMywgIDUsICA3LH0sCisgeyAgNCwgIDEsICA0LCAgNywgIDQsICA1LCAgMiwgIDYsICA3LH0sCisgeyAgMiwgIDQsICAxLCAgNywgIDUsICA3LCAgMywgIDcsICA3LH0sCisgeyAgMywgIDIsICAzLCAgNSwgIDMsICA0LCAgMiwgIDYsICA2LH0sCisgeyAgMywgIDUsICA0LCAgNywgIDIsICA3LCAgMSwgIDcsICA3LH0sCisgeyAgNCwgIDEsICAzLCAgNiwgIDUsICAzLCAgMywgIDcsICA3LH0sCisgeyAgNCwgIDIsICA1LCAgNywgIDMsICA3LCAgMSwgIDcsICA3LH0sCisgeyAgNywgIDQsICAxLCAgNywgIDMsICA3LCAgMiwgIDUsICA3LH0sCisgeyAgNCwgIDIsICAyLCAgNiwgIDQsICA1LCAgMiwgIDYsICA0LH0sCisgeyAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLH0sCisKKyB7ICAzLCAgNCwgIDEsICA3LCAgNiwgIDcsICA2LCAgMiwgIDYsfSwKKyB7ICA0LCAgMiwgIDIsICA2LCAgNiwgIDUsICA0LCAgMiwgIDQsfSwKKyB7ICA0LCAgNCwgIDEsICA3LCAgNSwgIDcsICA2LCAgMiwgIDQsfSwKKyB7ICAzLCAgMywgIDIsICA1LCAgNCwgIDQsICA1LCAgMiwgIDQsfSwKKyB7ICA0LCAgNSwgIDIsICA3LCAgMiwgIDcsICAzLCAgMiwgIDYsfSwKKyB7ICA0LCAgMywgIDIsICA1LCAgNSwgIDQsICAzLCAgMiwgIDQsfSwKKyB7ICA3LCAgNCwgIDIsICA3LCAgMiwgIDUsICAzLCAgMiwgIDYsfSwKKyB7ICA0LCAgNiwgIDIsICA3LCAgMywgIDcsICA2LCAgMSwgIDYsfSwKKyB7ICA1LCAgNSwgIDEsICA2LCAgNCwgIDYsICA1LCAgMiwgIDQsfSwKKyB7ICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsfSwKKworIHsgIDMsICAzLCAgMiwgIDMsICA1LCAgNiwgIDYsICA0LCAgMix9LAorIHsgIDcsICAxLCAgMywgIDMsICA2LCAgNSwgIDcsICA0LCAgMyx9LAorIHsgIDUsICA0LCAgMSwgIDUsICA1LCAgNiwgIDYsICA0LCAgMix9LAorIHsgIDYsICA0LCAgMiwgIDIsICA2LCAgMywgIDYsICA2LCAgMix9LAorIHsgIDYsICA0LCAgMiwgIDUsICAzLCAgNiwgIDMsICAzLCAgMix9LAorIHsgIDYsICAzLCAgMiwgIDMsICA1LCAgMiwgIDQsICA2LCAgMyx9LAorIHsgIDYsICAyLCAgMiwgIDQsICAzLCAgNSwgIDMsICA2LCAgMyx9LAorIHsgIDcsICA1LCAgMSwgIDcsICA0LCAgNywgIDcsICAzLCAgMix9LAorIHsgIDUsICA1LCAgMiwgIDMsICA2LCAgNywgIDcsICA1LCAgMSx9LAorIHsgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCx9LAorfTsKKworLy9AfQorCisjZGVmaW5lIFBCVFlQRV9FU0NBUEUgMHhGRgorCisvKiogdGFibGVzIHVzZWQgZm9yIFAtZnJhbWUgbWFjcm9ibG9jayB0eXBlIGRlY29kaW5nICovCisvL0B7CisjZGVmaW5lIE5VTV9QVFlQRV9WTENTIDcKKyNkZWZpbmUgUFRZUEVfVkxDX1NJWkUgOAorI2RlZmluZSBQVFlQRV9WTENfQklUUyA3CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHB0eXBlX3ZsY19jb2Rlc1tOVU1fUFRZUEVfVkxDU11bUFRZUEVfVkxDX1NJWkVdID0geworIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCB9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCB9LAorIHsgMHgwRCwgMHgwNSwgMHgwMSwgMHgwNCwgMHgwMSwgMHgwMCwgMHgwNywgMHgwQyB9LAorIHsgMHgwOSwgMHgxMSwgMHgwMSwgMHgwMCwgMHgwNSwgMHgwMywgMHgyMSwgMHgyMCB9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCB9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCB9LAorIHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBwdHlwZV92bGNfYml0c1tOVU1fUFRZUEVfVkxDU11bUFRZUEVfVkxDX1NJWkVdID0geworIHsgMSwgMiwgMywgNiwgNSwgNCwgNywgNyB9LAorIHsgMywgMSwgMiwgNywgNiwgNSwgNCwgNyB9LAorIHsgNSwgNCwgMSwgNCwgMywgMywgNCwgNSB9LAorIHsgNCwgNSwgMiwgMiwgMywgMiwgNiwgNiB9LAorIHsgNSwgNiwgMSwgNCwgMiwgMywgNywgNyB9LAorIHsgNSwgNiwgMSwgNCwgMywgMiwgNywgNyB9LAorIHsgNiwgMywgMiwgNywgNSwgNCwgMSwgNyB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBwdHlwZV92bGNfc3ltc1tQVFlQRV9WTENfU0laRV0gPSB7CisgMCwgMSwgMiwgMywgOCwgOSwgMTEsIFBCVFlQRV9FU0NBUEUKK307CisKKy8qKiByZXZlcnNlIG9mIHB0eXBlX3ZsY19zeW1zICovCitzdGF0aWMgY29uc3QgdWludDhfdCBibG9ja19udW1fdG9fcHR5cGVfdmxjX251bVsxMl0gPSB7CisgMCwgMSwgMiwgMywgMCwgMCwgMiwgMCwgNCwgNSwgMCwgNgorfTsKKy8vQH0KKworLyoqIHRhYmxlcyB1c2VkIGZvciBQLWZyYW1lIG1hY3JvYmxvY2sgdHlwZSBkZWNvZGluZyAqLworLy9AeworI2RlZmluZSBOVU1fQlRZUEVfVkxDUyA2CisjZGVmaW5lIEJUWVBFX1ZMQ19TSVpFIDcKKyNkZWZpbmUgQlRZUEVfVkxDX0JJVFMgNgorCitzdGF0aWMgY29uc3QgdWludDhfdCBidHlwZV92bGNfY29kZXNbTlVNX0JUWVBFX1ZMQ1NdW0JUWVBFX1ZMQ19TSVpFXSA9IHsKKyB7IDB4MDEsIDB4MDUsIDB4MDAsIDB4MDMsIDB4MTEsIDB4MDksIDB4MTAgfSwKKyB7IDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAgfSwKKyB7IDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAgfSwKKyB7IDB4MDksIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDUsIDB4MDMsIDB4MDggfSwKKyB7IDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAgfSwKKyB7IDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnR5cGVfdmxjX2JpdHNbTlVNX0JUWVBFX1ZMQ1NdW1BUWVBFX1ZMQ19TSVpFXSA9IHsKKyB7IDIsIDMsIDIsIDIsIDUsIDQsIDUgfSwKKyB7IDQsIDEsIDMsIDIsIDYsIDUsIDYgfSwKKyB7IDYsIDQsIDEsIDIsIDUsIDMsIDYgfSwKKyB7IDUsIDMsIDMsIDEsIDQsIDMsIDUgfSwKKyB7IDYsIDUsIDMsIDIsIDQsIDEsIDYgfSwKKyB7IDYsIDUsIDMsIDEsIDQsIDIsIDYgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnR5cGVfdmxjX3N5bXNbQlRZUEVfVkxDX1NJWkVdID0geworIDAsIDEsIDQsIDUsIDEwLCA3LCBQQlRZUEVfRVNDQVBFCit9OworCisvKiogcmV2ZXJzZSBvZiBidHlwZV92bGNfc3ltcyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmxvY2tfbnVtX3RvX2J0eXBlX3ZsY19udW1bMTJdID0geworIDAsIDEsIDAsIDAsIDIsIDMsIDAsIDUsIDAsIDAsIDQsIDAKK307CisvL0B9CisjZW5kaWYgLyogQVZDT0RFQ19SVjQwVkxDMl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zMzAybS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvczMwMm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjM5YTBmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvczMwMm0uYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIFNNUFRFIDMwMk0gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA4IExhdXJlbnQgQWltYXIgPGZlbnJpckB2aWRlb2xhbi5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZS5jb3VkdXJpZXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisKKyNkZWZpbmUgQUVTM19IRUFERVJfTEVOIDQKKworc3RhdGljIGludCBzMzAybV9wYXJzZV9mcmFtZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUpCit7CisgICAgdWludDMyX3QgaDsKKyAgICBpbnQgZnJhbWVfc2l6ZSwgY2hhbm5lbHMsIGJpdHM7CisKKyAgICBpZiAoYnVmX3NpemUgPD0gQUVTM19IRUFERVJfTEVOKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZnJhbWUgaXMgdG9vIHNob3J0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBRVMzIGhlYWRlciA6CisgICAgICogc2l6ZTogICAgICAgICAgICAxNgorICAgICAqIG51bWJlciBjaGFubmVscyAgIDIKKyAgICAgKiBjaGFubmVsX2lkICAgICAgICA4CisgICAgICogYml0cyBwZXIgc2FtcGxlcyAgMgorICAgICAqIGFsaWdubWVudHMgICAgICAgIDQKKyAgICAgKi8KKworICAgIGggPSBBVl9SQjMyKGJ1Zik7CisgICAgZnJhbWVfc2l6ZSA9ICAoaCA+PiAxNikgJiAweGZmZmY7CisgICAgY2hhbm5lbHMgICA9ICgoaCA+PiAxNCkgJiAweDAwMDMpICogMiArICAyOworICAgIGJpdHMgICAgICAgPSAoKGggPj4gIDQpICYgMHgwMDAzKSAqIDQgKyAxNjsKKworICAgIGlmIChBRVMzX0hFQURFUl9MRU4gKyBmcmFtZV9zaXplICE9IGJ1Zl9zaXplIHx8IGJpdHMgPiAyNCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImZyYW1lIGhhcyBpbnZhbGlkIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIFNldCBvdXRwdXQgcHJvcGVydGllcyAqLworICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gYml0czsKKyAgICBpZiAoYml0cyA+IDE2KQorICAgICAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzMyOworICAgIGVsc2UKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKworICAgIGF2Y3R4LT5jaGFubmVscyAgICA9IGNoYW5uZWxzOworICAgIHN3aXRjaChjaGFubmVscykgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9RVUFEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSyB8IEFWX0NIX0xBWU9VVF9TVEVSRU9fRE9XTk1JWDsKKyAgICB9CisgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgYXZjdHgtPmJpdF9yYXRlICAgID0gNDgwMDAgKiBhdmN0eC0+Y2hhbm5lbHMgKiAoYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgKyA0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgMzIgKiAoNDgwMDAgLyAoYnVmX3NpemUgKiA4IC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICsgNCkpKSk7CisKKyAgICByZXR1cm4gZnJhbWVfc2l6ZTsKK30KKworc3RhdGljIGludCBzMzAybV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBpbnQgYmxvY2tfc2l6ZSwgcmV0OworCisgICAgaW50IGZyYW1lX3NpemUgPSBzMzAybV9wYXJzZV9mcmFtZV9oZWFkZXIoYXZjdHgsIGJ1ZiwgYnVmX3NpemUpOworICAgIGlmIChmcmFtZV9zaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIGZyYW1lX3NpemU7CisKKyAgICBidWZfc2l6ZSAtPSBBRVMzX0hFQURFUl9MRU47CisgICAgYnVmICAgICAgKz0gQUVTM19IRUFERVJfTEVOOworCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBibG9ja19zaXplID0gKGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICsgNCkgLyA0OworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gMiAqIChidWZfc2l6ZSAvIGJsb2NrX3NpemUpIC8gYXZjdHgtPmNoYW5uZWxzOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBidWZfc2l6ZSA9IChmcmFtZS0+bmJfc2FtcGxlcyAqIGF2Y3R4LT5jaGFubmVscyAvIDIpICogYmxvY2tfc2l6ZTsKKworICAgIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAyNCkgeworICAgICAgICB1aW50MzJfdCAqbyA9ICh1aW50MzJfdCAqKWZyYW1lLT5kYXRhWzBdOworICAgICAgICBmb3IgKDsgYnVmX3NpemUgPiA2OyBidWZfc2l6ZSAtPSA3KSB7CisgICAgICAgICAgICAqbysrID0gKGZmX3JldmVyc2VbYnVmWzJdXSAgICAgICAgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAoZmZfcmV2ZXJzZVtidWZbMV1dICAgICAgICA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgIChmZl9yZXZlcnNlW2J1ZlswXV0gICAgICAgIDw8ICA4KTsKKyAgICAgICAgICAgICpvKysgPSAoZmZfcmV2ZXJzZVtidWZbNl0gJiAweGYwXSA8PCAyOCkgfAorICAgICAgICAgICAgICAgICAgIChmZl9yZXZlcnNlW2J1Zls1XV0gICAgICAgIDw8IDIwKSB8CisgICAgICAgICAgICAgICAgICAgKGZmX3JldmVyc2VbYnVmWzRdXSAgICAgICAgPDwgMTIpIHwKKyAgICAgICAgICAgICAgICAgICAoZmZfcmV2ZXJzZVtidWZbM10gJiAweDBmXSA8PCAgNCk7CisgICAgICAgICAgICBidWYgKz0gNzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMjApIHsKKyAgICAgICAgdWludDMyX3QgKm8gPSAodWludDMyX3QgKilmcmFtZS0+ZGF0YVswXTsKKyAgICAgICAgZm9yICg7IGJ1Zl9zaXplID4gNTsgYnVmX3NpemUgLT0gNikgeworICAgICAgICAgICAgKm8rKyA9IChmZl9yZXZlcnNlW2J1ZlsyXSAmIDB4ZjBdIDw8IDI4KSB8CisgICAgICAgICAgICAgICAgICAgKGZmX3JldmVyc2VbYnVmWzFdXSAgICAgICAgPDwgMjApIHwKKyAgICAgICAgICAgICAgICAgICAoZmZfcmV2ZXJzZVtidWZbMF1dICAgICAgICA8PCAxMik7CisgICAgICAgICAgICAqbysrID0gKGZmX3JldmVyc2VbYnVmWzVdICYgMHhmMF0gPDwgMjgpIHwKKyAgICAgICAgICAgICAgICAgICAoZmZfcmV2ZXJzZVtidWZbNF1dICAgICAgICA8PCAyMCkgfAorICAgICAgICAgICAgICAgICAgIChmZl9yZXZlcnNlW2J1ZlszXV0gICAgICAgIDw8IDEyKTsKKyAgICAgICAgICAgIGJ1ZiArPSA2OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDE2X3QgKm8gPSAodWludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKyAgICAgICAgZm9yICg7IGJ1Zl9zaXplID4gNDsgYnVmX3NpemUgLT0gNSkgeworICAgICAgICAgICAgKm8rKyA9IChmZl9yZXZlcnNlW2J1ZlsxXV0gICAgICAgIDw8ICA4KSB8CisgICAgICAgICAgICAgICAgICAgIGZmX3JldmVyc2VbYnVmWzBdXTsKKyAgICAgICAgICAgICpvKysgPSAoZmZfcmV2ZXJzZVtidWZbNF0gJiAweGYwXSA8PCAxMikgfAorICAgICAgICAgICAgICAgICAgIChmZl9yZXZlcnNlW2J1ZlszXV0gICAgICAgIDw8ICA0KSB8CisgICAgICAgICAgICAgICAgICAgKGZmX3JldmVyc2VbYnVmWzJdXSAgICAgICAgPj4gIDQpOworICAgICAgICAgICAgYnVmICs9IDU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfczMwMm1fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiczMwMm0iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTTVBURSAzMDJNIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1MzMDJNLAorICAgIC5kZWNvZGUgICAgICAgICA9IHMzMDJtX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3MzMDJtZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9zMzAybWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MGFjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zMzAybWVuYy5jCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogU01QVEUgMzAyTSBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgRGFycnlsIFdhbGxhY2UgPHdhbGxhY2RqQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorCisjZGVmaW5lIEFFUzNfSEVBREVSX0xFTiA0CisKK3R5cGVkZWYgc3RydWN0IFMzMDJNRW5jQ29udGV4dCB7CisgICAgdWludDhfdCBmcmFtaW5nX2luZGV4OyAvKiBTZXQgZm9yIGV2ZW4gY2hhbm5lbHMgb24gbXVsdGlwbGUgb2YgMTkyIHNhbXBsZXMgKi8KK30gUzMwMk1FbmNDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgczMwMm1fZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFMzMDJNRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzICYgMSB8fCBhdmN0eC0+Y2hhbm5lbHMgPiA4KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkVuY29kaW5nICVkIGNoYW5uZWwocykgaXMgbm90IGFsbG93ZWQuIE9ubHkgMiwgNCwgNiBhbmQgOCBjaGFubmVscyBhcmUgc3VwcG9ydGVkLlxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgc3dpdGNoIChhdmN0eC0+c2FtcGxlX2ZtdCkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6CisgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzI6CisgICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+IDIwKSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPiAyNCkKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZW5jb2RpbmcgYXMgMjQgYml0cy1wZXItc2FtcGxlXG4iKTsKKyAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMjQ7CisgICAgICAgIH0gZWxzZSBpZiAoIWF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKSB7CisgICAgICAgICAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDI0OworICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlIDw9IDIwKSB7CisgICAgICAgICAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDIwOworICAgICAgICB9CisgICAgfQorCisgICAgYXZjdHgtPmZyYW1lX3NpemUgPSAwOworICAgIGF2Y3R4LT5iaXRfcmF0ZSAgID0gNDgwMDAgKiBhdmN0eC0+Y2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgKyA0KTsKKyAgICBzLT5mcmFtaW5nX2luZGV4ICA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzMzAybV9lbmNvZGUyX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIFMzMDJNRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgaW50IGJ1Zl9zaXplID0gQUVTM19IRUFERVJfTEVOICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZS0+bmJfc2FtcGxlcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSArIDQpKSAvIDg7CisgICAgaW50IHJldCwgYywgY2hhbm5lbHM7CisgICAgdWludDhfdCAqbzsKKyAgICBQdXRCaXRDb250ZXh0IHBiOworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgYnVmX3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBvID0gYXZwa3QtPmRhdGE7CisgICAgaW5pdF9wdXRfYml0cygmcGIsIG8sIGJ1Zl9zaXplICogOCk7CisgICAgcHV0X2JpdHMoJnBiLCAxNiwgYnVmX3NpemUgLSBBRVMzX0hFQURFUl9MRU4pOworICAgIHB1dF9iaXRzKCZwYiwgMiwgKGF2Y3R4LT5jaGFubmVscyAtIDIpID4+IDEpOyAgIC8vIG51bWJlciBvZiBjaGFubmVscworICAgIHB1dF9iaXRzKCZwYiwgOCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5uZWwgSUQKKyAgICBwdXRfYml0cygmcGIsIDIsIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSAtIDE2KSAvIDQpOyAvLyBiaXRzIHBlciBzYW1wbGVzICgwID0gMTZiaXQsIDEgPSAyMGJpdCwgMiA9IDI0Yml0KQorICAgIHB1dF9iaXRzKCZwYiwgNCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsaWdubWVudHMKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworICAgIG8gKz0gQUVTM19IRUFERVJfTEVOOworCisgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDI0KSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90ICpzYW1wbGVzID0gKHVpbnQzMl90ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGZyYW1lLT5uYl9zYW1wbGVzOyBjKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdnVjZiA9IHMtPmZyYW1pbmdfaW5kZXggPT0gMCA/IDB4MTA6IDA7CisKKyAgICAgICAgICAgIGZvciAoY2hhbm5lbHMgPSAwOyBjaGFubmVscyA8IGF2Y3R4LT5jaGFubmVsczsgY2hhbm5lbHMgKz0gMikgeworICAgICAgICAgICAgICAgIG9bMF0gPSBmZl9yZXZlcnNlWyhzYW1wbGVzWzBdICYgMHgwMDAwRkYwMCkgPj4gOF07CisgICAgICAgICAgICAgICAgb1sxXSA9IGZmX3JldmVyc2VbKHNhbXBsZXNbMF0gJiAweDAwRkYwMDAwKSA+PiAxNl07CisgICAgICAgICAgICAgICAgb1syXSA9IGZmX3JldmVyc2VbKHNhbXBsZXNbMF0gJiAweEZGMDAwMDAwKSA+PiAyNF07CisgICAgICAgICAgICAgICAgb1szXSA9IGZmX3JldmVyc2VbKHNhbXBsZXNbMV0gJiAweDAwMDAwRjAwKSA+PiA0XSB8IHZ1Y2Y7CisgICAgICAgICAgICAgICAgb1s0XSA9IGZmX3JldmVyc2VbKHNhbXBsZXNbMV0gJiAweDAwMEZGMDAwKSA+PiAxMl07CisgICAgICAgICAgICAgICAgb1s1XSA9IGZmX3JldmVyc2VbKHNhbXBsZXNbMV0gJiAweDBGRjAwMDAwKSA+PiAyMF07CisgICAgICAgICAgICAgICAgb1s2XSA9IGZmX3JldmVyc2VbKHNhbXBsZXNbMV0gJiAweEYwMDAwMDAwKSA+PiAyOF07CisgICAgICAgICAgICAgICAgbyArPSA3OworICAgICAgICAgICAgICAgIHNhbXBsZXMgKz0gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+ZnJhbWluZ19pbmRleCsrOworICAgICAgICAgICAgaWYgKHMtPmZyYW1pbmdfaW5kZXggPj0gMTkyKQorICAgICAgICAgICAgICAgIHMtPmZyYW1pbmdfaW5kZXggPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAyMCkgeworICAgICAgICBjb25zdCB1aW50MzJfdCAqc2FtcGxlcyA9ICh1aW50MzJfdCAqKWZyYW1lLT5kYXRhWzBdOworCisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBmcmFtZS0+bmJfc2FtcGxlczsgYysrKSB7CisgICAgICAgICAgICB1aW50OF90IHZ1Y2YgPSBzLT5mcmFtaW5nX2luZGV4ID09IDAgPyAweDgwOiAwOworCisgICAgICAgICAgICBmb3IgKGNoYW5uZWxzID0gMDsgY2hhbm5lbHMgPCBhdmN0eC0+Y2hhbm5lbHM7IGNoYW5uZWxzICs9IDIpIHsKKyAgICAgICAgICAgICAgICBvWzBdID0gZmZfcmV2ZXJzZVsgKHNhbXBsZXNbMF0gJiAweDAwMEZGMDAwKSA+PiAxMl07CisgICAgICAgICAgICAgICAgb1sxXSA9IGZmX3JldmVyc2VbIChzYW1wbGVzWzBdICYgMHgwRkYwMDAwMCkgPj4gMjBdOworICAgICAgICAgICAgICAgIG9bMl0gPSBmZl9yZXZlcnNlWygoc2FtcGxlc1swXSAmIDB4RjAwMDAwMDApID4+IDI4KSB8IHZ1Y2ZdOworICAgICAgICAgICAgICAgIG9bM10gPSBmZl9yZXZlcnNlWyAoc2FtcGxlc1sxXSAmIDB4MDAwRkYwMDApID4+IDEyXTsKKyAgICAgICAgICAgICAgICBvWzRdID0gZmZfcmV2ZXJzZVsgKHNhbXBsZXNbMV0gJiAweDBGRjAwMDAwKSA+PiAyMF07CisgICAgICAgICAgICAgICAgb1s1XSA9IGZmX3JldmVyc2VbIChzYW1wbGVzWzFdICYgMHhGMDAwMDAwMCkgPj4gMjhdOworICAgICAgICAgICAgICAgIG8gKz0gNjsKKyAgICAgICAgICAgICAgICBzYW1wbGVzICs9IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHMtPmZyYW1pbmdfaW5kZXgrKzsKKyAgICAgICAgICAgIGlmIChzLT5mcmFtaW5nX2luZGV4ID49IDE5MikKKyAgICAgICAgICAgICAgICBzLT5mcmFtaW5nX2luZGV4ID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNhbXBsZXMgPSAodWludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgZnJhbWUtPm5iX3NhbXBsZXM7IGMrKykgeworICAgICAgICAgICAgdWludDhfdCB2dWNmID0gcy0+ZnJhbWluZ19pbmRleCA9PSAwID8gMHgxMCA6IDA7CisKKyAgICAgICAgICAgIGZvciAoY2hhbm5lbHMgPSAwOyBjaGFubmVscyA8IGF2Y3R4LT5jaGFubmVsczsgY2hhbm5lbHMgKz0gMikgeworICAgICAgICAgICAgICAgIG9bMF0gPSBmZl9yZXZlcnNlWyBzYW1wbGVzWzBdICYgMHhGRl07CisgICAgICAgICAgICAgICAgb1sxXSA9IGZmX3JldmVyc2VbKHNhbXBsZXNbMF0gJiAweEZGMDApID4+ICA4XTsKKyAgICAgICAgICAgICAgICBvWzJdID0gZmZfcmV2ZXJzZVsoc2FtcGxlc1sxXSAmIDB4MEYpICAgPDwgIDRdIHwgdnVjZjsKKyAgICAgICAgICAgICAgICBvWzNdID0gZmZfcmV2ZXJzZVsoc2FtcGxlc1sxXSAmIDB4MEZGMCkgPj4gIDRdOworICAgICAgICAgICAgICAgIG9bNF0gPSBmZl9yZXZlcnNlWyhzYW1wbGVzWzFdICYgMHhGMDAwKSA+PiAxMl07CisgICAgICAgICAgICAgICAgbyArPSA1OworICAgICAgICAgICAgICAgIHNhbXBsZXMgKz0gMjsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5mcmFtaW5nX2luZGV4Kys7CisgICAgICAgICAgICBpZiAocy0+ZnJhbWluZ19pbmRleCA+PSAxOTIpCisgICAgICAgICAgICAgICAgcy0+ZnJhbWluZ19pbmRleCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfczMwMm1fZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgID0gInMzMDJtIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNNUFRFIDMwMk0iKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TMzAyTSwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKFMzMDJNRW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgICA9IHMzMDJtX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICAgICAgICAgPSBzMzAybV9lbmNvZGUyX2ZyYW1lLAorICAgIC5zYW1wbGVfZm10cyAgICAgICAgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5jYXBhYmlsaXRpZXMgICAgICAgICAgPSBDT0RFQ19DQVBfVkFSSUFCTEVfRlJBTUVfU0laRSB8IENPREVDX0NBUF9FWFBFUklNRU5UQUwsCisgICAgLnN1cHBvcnRlZF9zYW1wbGVyYXRlcyA9IChjb25zdCBpbnRbXSkgeyA0ODAwMCwgMCB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3MzdGMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3MzdGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzQzZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvczN0Yy5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBTMyBUZXh0dXJlIENvbXByZXNzaW9uIChTM1RDKSBkZWNvZGluZyBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwNyBieSBJdm8gdmFuIFBvb3J0ZW4KKyAqCisgKiBzZWUgYWxzbzogaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9UzNUQworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJzM3RjLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkeHQxX2RlY29kZV9waXhlbHMoR2V0Qnl0ZUNvbnRleHQgKmdiLCB1aW50MzJfdCAqZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHFzdHJpZGUsIHVuc2lnbmVkIGludCBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBhbHBoYSkgeworICAgIHVuc2lnbmVkIGludCB4LCB5LCBjMCwgYzEsIGEgPSAoIWZsYWcgKiAyNTV1KSA8PCAyNDsKKyAgICB1bnNpZ25lZCBpbnQgcmIwLCByYjEsIHJiMiwgcmIzLCBnMCwgZzEsIGcyLCBnMzsKKyAgICB1aW50MzJfdCBjb2xvcnNbNF0sIHBpeGVsczsKKworICAgIGMwID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgIGMxID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworCisgICAgcmIwICA9IChjMDw8MyB8IGMwPDw4KSAmIDB4ZjgwMGY4OworICAgIHJiMSAgPSAoYzE8PDMgfCBjMTw8OCkgJiAweGY4MDBmODsKKyAgICByYjAgKz0gICAgICAgIChyYjA+PjUpICYgMHgwNzAwMDc7CisgICAgcmIxICs9ICAgICAgICAocmIxPj41KSAmIDB4MDcwMDA3OworICAgIGcwICAgPSAgICAgICAgKGMwIDw8NSkgJiAweDAwZmMwMDsKKyAgICBnMSAgID0gICAgICAgIChjMSA8PDUpICYgMHgwMGZjMDA7CisgICAgZzAgICs9ICAgICAgICAoZzAgPj42KSAmIDB4MDAwMzAwOworICAgIGcxICArPSAgICAgICAgKGcxID4+NikgJiAweDAwMDMwMDsKKworICAgIGNvbG9yc1swXSA9IHJiMCArIGcwICsgYTsKKyAgICBjb2xvcnNbMV0gPSByYjEgKyBnMSArIGE7CisKKyAgICBpZiAoYzAgPiBjMSB8fCBmbGFnKSB7CisgICAgICAgIHJiMiA9ICgoKDIqcmIwK3JiMSkgKiAyMSkgPj4gNikgJiAweGZmMDBmZjsKKyAgICAgICAgcmIzID0gKCgoMipyYjErcmIwKSAqIDIxKSA+PiA2KSAmIDB4ZmYwMGZmOworICAgICAgICBnMiAgPSAoKCgyKmcwICtnMSApICogMjEpID4+IDYpICYgMHgwMGZmMDA7CisgICAgICAgIGczICA9ICgoKDIqZzEgK2cwICkgKiAyMSkgPj4gNikgJiAweDAwZmYwMDsKKyAgICAgICAgY29sb3JzWzNdID0gcmIzICsgZzMgKyBhOworICAgIH0gZWxzZSB7CisgICAgICAgIHJiMiA9ICgocmIwK3JiMSkgPj4gMSkgJiAweGZmMDBmZjsKKyAgICAgICAgZzIgID0gKChnMCArZzEgKSA+PiAxKSAmIDB4MDBmZjAwOworICAgICAgICBjb2xvcnNbM10gPSAwOworICAgIH0KKworICAgIGNvbG9yc1syXSA9IHJiMiArIGcyICsgYTsKKworICAgIHBpeGVscyA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiKTsKKyAgICBmb3IgKHk9MDsgeTw0OyB5KyspIHsKKyAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKSB7CisgICAgICAgICAgICBhICAgICAgICA9IChhbHBoYSAmIDB4MGYpIDw8IDI4OworICAgICAgICAgICAgYSAgICAgICArPSBhID4+IDQ7CisgICAgICAgICAgICBkW3hdICAgICA9IGEgKyBjb2xvcnNbcGl4ZWxzJjNdOworICAgICAgICAgICAgcGl4ZWxzID4+PSAyOworICAgICAgICAgICAgYWxwaGEgID4+PSA0OworICAgICAgICB9CisgICAgICAgIGQgKz0gcXN0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfZGVjb2RlX2R4dDEoR2V0Qnl0ZUNvbnRleHQgKmdiLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCB3LCBjb25zdCB1bnNpZ25lZCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHN0cmlkZSkgeworICAgIHVuc2lnbmVkIGludCBieCwgYnksIHFzdHJpZGUgPSBzdHJpZGUvNDsKKyAgICB1aW50MzJfdCAqZCA9ICh1aW50MzJfdCAqKSBkc3Q7CisKKyAgICBmb3IgKGJ5PTA7IGJ5IDwgaC80OyBieSsrLCBkICs9IHN0cmlkZS13KQorICAgICAgICBmb3IgKGJ4ID0gMDsgYnggPCB3IC8gNDsgYngrKywgZCArPSA0KQorICAgICAgICAgICAgZHh0MV9kZWNvZGVfcGl4ZWxzKGdiLCBkLCBxc3RyaWRlLCAwLCAwTEwpOworfQorCit2b2lkIGZmX2RlY29kZV9keHQzKEdldEJ5dGVDb250ZXh0ICpnYiwgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgdywgY29uc3QgdW5zaWduZWQgaW50IGgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzdHJpZGUpIHsKKyAgICB1bnNpZ25lZCBpbnQgYngsIGJ5LCBxc3RyaWRlID0gc3RyaWRlLzQ7CisgICAgdWludDMyX3QgKmQgPSAodWludDMyX3QgKikgZHN0OworCisgICAgZm9yIChieT0wOyBieSA8IGgvNDsgYnkrKywgZCArPSBzdHJpZGUtdykKKyAgICAgICAgZm9yIChieCA9IDA7IGJ4IDwgdyAvIDQ7IGJ4KyssIGQgKz0gNCkKKyAgICAgICAgICAgIGR4dDFfZGVjb2RlX3BpeGVscyhnYiwgZCwgcXN0cmlkZSwgMSwgYnl0ZXN0cmVhbTJfZ2V0X2xlNjQoZ2IpKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3MzdGMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3MzdGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDc3YjNhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvczN0Yy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBTMyBUZXh0dXJlIENvbXByZXNzaW9uIChTM1RDKSBkZWNvZGluZyBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwNyBieSBJdm8gdmFuIFBvb3J0ZW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1MzVENfSAorI2RlZmluZSBBVkNPREVDX1MzVENfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisKKyNkZWZpbmUgRkZfUzNUQ19EWFQxICAgIDB4MzE1NDU4NDQKKyNkZWZpbmUgRkZfUzNUQ19EWFQzICAgIDB4MzM1NDU4NDQKKworLyoqCisgKiBEZWNvZGUgRFhUMSBlbmNvZGVkIGRhdGEgdG8gUkdCMzIKKyAqIEBwYXJhbSBnYiBHZXRCeXRlQ29udGV4dAorICogQHBhcmFtIGRzdCBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBwYXJhbSB3IHdpZHRoIG9mIG91dHB1dCBpbWFnZQorICogQHBhcmFtIGggaGVpZ2h0IG9mIG91dHB1dCBpbWFnZQorICogQHBhcmFtIHN0cmlkZSBsaW5lIHNpemUgb2Ygb3V0cHV0IGltYWdlCisgKi8KK3ZvaWQgZmZfZGVjb2RlX2R4dDEoR2V0Qnl0ZUNvbnRleHQgKmdiLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCB3LCBjb25zdCB1bnNpZ25lZCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHN0cmlkZSk7CisvKioKKyAqIERlY29kZSBEWFQzIGVuY29kZWQgZGF0YSB0byBSR0IzMgorICogQHBhcmFtIGdiIEdldEJ5dGVDb250ZXh0CisgKiBAcGFyYW0gZHN0IGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHBhcmFtIHcgd2lkdGggb2Ygb3V0cHV0IGltYWdlCisgKiBAcGFyYW0gaCBoZWlnaHQgb2Ygb3V0cHV0IGltYWdlCisgKiBAcGFyYW0gc3RyaWRlIGxpbmUgc2l6ZSBvZiBvdXRwdXQgaW1hZ2UKKyAqLwordm9pZCBmZl9kZWNvZGVfZHh0MyhHZXRCeXRlQ29udGV4dCAqZ2IsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHcsIGNvbnN0IHVuc2lnbmVkIGludCBoLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgc3RyaWRlKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfUzNUQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zYW1pZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9zYW1pZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwNWY5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NhbWlkZWMuYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU0FNSSBzdWJ0aXRsZSBkZWNvZGVyCisgKiBAc2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczk3MTMyNy5hc3B4CisgKi8KKworI2luY2x1ZGUgImFzcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQlByaW50IHNvdXJjZTsKKyAgICBBVkJQcmludCBjb250ZW50OworICAgIEFWQlByaW50IGZ1bGw7Cit9IFNBTUlDb250ZXh0OworCitzdGF0aWMgaW50IHNhbWlfcGFyYWdyYXBoX3RvX2FzcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgICBTQU1JQ29udGV4dCAqc2FtaSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldCA9IDA7CisgICAgY2hhciAqdGFnID0gTlVMTDsKKyAgICBjaGFyICpkdXBzcmMgPSBhdl9zdHJkdXAoc3JjKTsKKyAgICBjaGFyICpwID0gZHVwc3JjOworCisgICAgYXZfYnByaW50X2NsZWFyKCZzYW1pLT5jb250ZW50KTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNoYXIgKnNhdmVwdHIgPSBOVUxMOworICAgICAgICBpbnQgcHJldl9jaHJfaXNfc3BhY2UgPSAwOworICAgICAgICBBVkJQcmludCAqZHN0ID0gJnNhbWktPmNvbnRlbnQ7CisKKyAgICAgICAgLyogcGFyc2UgJiBleHRyYWN0IHBhcmFncmFwaCB0YWcgKi8KKyAgICAgICAgcCA9IGF2X3N0cmlzdHIocCwgIjxQIik7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAocFsyXSAhPSAnPicgJiYgIWF2X2lzc3BhY2UocFsyXSkpIHsgLy8gYXZvaWQgY29uZnVzaW9uIHdpdGggdGFncyBzdWNoIGFzIDxQUkU+CisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHN0LT5sZW4pIC8vIGFkZCBhIHNlcGFyYXRvciB3aXRoIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGggaWYgdGhlcmUgd2FzIG9uZQorICAgICAgICAgICAgYXZfYnByaW50Zihkc3QsICJcXE4iKTsKKyAgICAgICAgdGFnID0gYXZfc3RydG9rKHAsICI+IiwgJnNhdmVwdHIpOworICAgICAgICBpZiAoIXRhZyB8fCAhc2F2ZXB0cikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwID0gc2F2ZXB0cjsKKworICAgICAgICAvKiBjaGVjayBpZiB0aGUgY3VycmVudCBwYXJhZ3JhcGggaXMgdGhlICJzb3VyY2UiIChzcGVha2VyIG5hbWUpICovCisgICAgICAgIGlmIChhdl9zdHJpc3RyKHRhZywgIklEPVNvdXJjZSIpIHx8IGF2X3N0cmlzdHIodGFnLCAiSUQ9XCJTb3VyY2VcIiIpKSB7CisgICAgICAgICAgICBkc3QgPSAmc2FtaS0+c291cmNlOworICAgICAgICAgICAgYXZfYnByaW50X2NsZWFyKGRzdCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiBlbXB0eSBldmVudCAtPiBza2lwIHN1YnRpdGxlICovCisgICAgICAgIHdoaWxlIChhdl9pc3NwYWNlKCpwKSkKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgaWYgKCFzdHJuY21wKHAsICImbmJzcDsiLCA2KSkgeworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGV4dHJhY3QgdGhlIHRleHQsIHN0cmlwcGluZyBtb3N0IG9mIHRoZSB0YWdzICovCisgICAgICAgIHdoaWxlICgqcCkgeworICAgICAgICAgICAgaWYgKCpwID09ICc8JykgeworICAgICAgICAgICAgICAgIGlmICghYXZfc3RybmNhc2VjbXAocCwgIjxQIiwgMikgJiYgKHBbMl0gPT0gJz4nIHx8IGF2X2lzc3BhY2UocFsyXSkpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoIWF2X3N0cm5jYXNlY21wKHAsICI8QlIiLCAzKSkKKyAgICAgICAgICAgICAgICAgICAgYXZfYnByaW50Zihkc3QsICJcXE4iKTsKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgd2hpbGUgKCpwICYmICpwICE9ICc+JykKKyAgICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgIGlmICghKnApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnPicpCisgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYXZfaXNzcGFjZSgqcCkpCisgICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdCwgKnAsIDEpOworICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZfY2hyX2lzX3NwYWNlKQorICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICcgJywgMSk7CisgICAgICAgICAgICBwcmV2X2Nocl9pc19zcGFjZSA9IGF2X2lzc3BhY2UoKnApOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfYnByaW50X2NsZWFyKCZzYW1pLT5mdWxsKTsKKyAgICBpZiAoc2FtaS0+c291cmNlLmxlbikKKyAgICAgICAgYXZfYnByaW50Zigmc2FtaS0+ZnVsbCwgIntcXGkxfSVze1xcaTB9XFxOIiwgc2FtaS0+c291cmNlLnN0cik7CisgICAgYXZfYnByaW50Zigmc2FtaS0+ZnVsbCwgIiVzIiwgc2FtaS0+Y29udGVudC5zdHIpOworCitlbmQ6CisgICAgYXZfZnJlZShkdXBzcmMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2FtaV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9zdWJfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKKyAgICBjb25zdCBjaGFyICpwdHIgPSBhdnBrdC0+ZGF0YTsKKyAgICBTQU1JQ29udGV4dCAqc2FtaSA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAocHRyICYmIGF2cGt0LT5zaXplID4gMCAmJiAhc2FtaV9wYXJhZ3JhcGhfdG9fYXNzKGF2Y3R4LCBwdHIpKSB7CisgICAgICAgIGludCB0c19zdGFydCAgICAgPSBhdl9yZXNjYWxlX3EoYXZwa3QtPnB0cywgYXZjdHgtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsMTAwfSk7CisgICAgICAgIGludCB0c19kdXJhdGlvbiAgPSBhdnBrdC0+ZHVyYXRpb24gIT0gLTEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKGF2cGt0LT5kdXJhdGlvbiwgYXZjdHgtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsMTAwfSkgOiAtMTsKKyAgICAgICAgaW50IHJldCA9IGZmX2Fzc19hZGRfcmVjdF9icHJpbnQoc3ViLCAmc2FtaS0+ZnVsbCwgdHNfc3RhcnQsIHRzX2R1cmF0aW9uKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICAqZ290X3N1Yl9wdHIgPSBzdWItPm51bV9yZWN0cyA+IDA7CisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgc2FtaV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTQU1JQ29udGV4dCAqc2FtaSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYXZfYnByaW50X2luaXQoJnNhbWktPnNvdXJjZSwgIDAsIDIwNDgpOworICAgIGF2X2JwcmludF9pbml0KCZzYW1pLT5jb250ZW50LCAwLCAyMDQ4KTsKKyAgICBhdl9icHJpbnRfaW5pdCgmc2FtaS0+ZnVsbCwgICAgMCwgMjA0OCk7CisgICAgcmV0dXJuIGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXJfZGVmYXVsdChhdmN0eCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBzYW1pX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTQU1JQ29udGV4dCAqc2FtaSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZzYW1pLT5zb3VyY2UsICBOVUxMKTsKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJnNhbWktPmNvbnRlbnQsIE5VTEwpOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmc2FtaS0+ZnVsbCwgICAgTlVMTCk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfc2FtaV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzYW1pIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU0FNSSBzdWJ0aXRsZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TQU1JLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTQU1JQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gc2FtaV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHNhbWlfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gc2FtaV9kZWNvZGVfZnJhbWUsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc2FubS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2FubS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNWVjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zYW5tLmMKQEAgLTAsMCArMSwxNTI4IEBACisvKgorICogTHVjYXNBcnRzIFNtdXNoIHZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBDeXJpbCBab3JpbgorICogQ29weXJpZ2h0IChjKSAyMDExIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJjb3B5X2Jsb2NrLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBOR0xZUEhTIDI1NgorI2RlZmluZSBHTFlQSF9DT09SRF9WRUNUX1NJWkUgMTYKKyNkZWZpbmUgUEFMRVRURV9TSVpFIDI1NgorI2RlZmluZSBQQUxFVFRFX0RFTFRBIDc2OAorCitzdGF0aWMgY29uc3QgaW50OF90IGdseXBoNF94W0dMWVBIX0NPT1JEX1ZFQ1RfU0laRV0gPSB7CisgICAgMCwgMSwgMiwgMywgMywgMywgMywgMiwgMSwgMCwgMCwgMCwgMSwgMiwgMiwgMQorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBnbHlwaDRfeVtHTFlQSF9DT09SRF9WRUNUX1NJWkVdID0geworICAgIDAsIDAsIDAsIDAsIDEsIDIsIDMsIDMsIDMsIDMsIDIsIDEsIDEsIDEsIDIsIDIKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgZ2x5cGg4X3hbR0xZUEhfQ09PUkRfVkVDVF9TSVpFXSA9IHsKKyAgICAwLCAyLCA1LCA3LCA3LCA3LCA3LCA3LCA3LCA1LCAyLCAwLCAwLCAwLCAwLCAwCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGdseXBoOF95W0dMWVBIX0NPT1JEX1ZFQ1RfU0laRV0gPSB7CisgICAgMCwgMCwgMCwgMCwgMSwgMywgNCwgNiwgNywgNywgNywgNywgNiwgNCwgMywgMQorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBtb3Rpb25fdmVjdG9yc1syNTZdWzJdID0geworICAgIHsgICAwLCAgIDAgfSwgeyAgLTEsIC00MyB9LCB7ICAgNiwgLTQzIH0sIHsgIC05LCAtNDIgfSwgeyAgMTMsIC00MSB9LAorICAgIHsgLTE2LCAtNDAgfSwgeyAgMTksIC0zOSB9LCB7IC0yMywgLTM2IH0sIHsgIDI2LCAtMzQgfSwgeyAgLTIsIC0zMyB9LAorICAgIHsgICA0LCAtMzMgfSwgeyAtMjksIC0zMiB9LCB7ICAtOSwgLTMyIH0sIHsgIDExLCAtMzEgfSwgeyAtMTYsIC0yOSB9LAorICAgIHsgIDMyLCAtMjkgfSwgeyAgMTgsIC0yOCB9LCB7IC0zNCwgLTI2IH0sIHsgLTIyLCAtMjUgfSwgeyAgLTEsIC0yNSB9LAorICAgIHsgICAzLCAtMjUgfSwgeyAgLTcsIC0yNCB9LCB7ICAgOCwgLTI0IH0sIHsgIDI0LCAtMjMgfSwgeyAgMzYsIC0yMyB9LAorICAgIHsgLTEyLCAtMjIgfSwgeyAgMTMsIC0yMSB9LCB7IC0zOCwgLTIwIH0sIHsgICAwLCAtMjAgfSwgeyAtMjcsIC0xOSB9LAorICAgIHsgIC00LCAtMTkgfSwgeyAgIDQsIC0xOSB9LCB7IC0xNywgLTE4IH0sIHsgIC04LCAtMTcgfSwgeyAgIDgsIC0xNyB9LAorICAgIHsgIDE4LCAtMTcgfSwgeyAgMjgsIC0xNyB9LCB7ICAzOSwgLTE3IH0sIHsgLTEyLCAtMTUgfSwgeyAgMTIsIC0xNSB9LAorICAgIHsgLTIxLCAtMTQgfSwgeyAgLTEsIC0xNCB9LCB7ICAgMSwgLTE0IH0sIHsgLTQxLCAtMTMgfSwgeyAgLTUsIC0xMyB9LAorICAgIHsgICA1LCAtMTMgfSwgeyAgMjEsIC0xMyB9LCB7IC0zMSwgLTEyIH0sIHsgLTE1LCAtMTEgfSwgeyAgLTgsIC0xMSB9LAorICAgIHsgICA4LCAtMTEgfSwgeyAgMTUsIC0xMSB9LCB7ICAtMiwgLTEwIH0sIHsgICAxLCAtMTAgfSwgeyAgMzEsIC0xMCB9LAorICAgIHsgLTIzLCAgLTkgfSwgeyAtMTEsICAtOSB9LCB7ICAtNSwgIC05IH0sIHsgICA0LCAgLTkgfSwgeyAgMTEsICAtOSB9LAorICAgIHsgIDQyLCAgLTkgfSwgeyAgIDYsICAtOCB9LCB7ICAyNCwgIC04IH0sIHsgLTE4LCAgLTcgfSwgeyAgLTcsICAtNyB9LAorICAgIHsgIC0zLCAgLTcgfSwgeyAgLTEsICAtNyB9LCB7ICAgMiwgIC03IH0sIHsgIDE4LCAgLTcgfSwgeyAtNDMsICAtNiB9LAorICAgIHsgLTEzLCAgLTYgfSwgeyAgLTQsICAtNiB9LCB7ICAgNCwgIC02IH0sIHsgICA4LCAgLTYgfSwgeyAtMzMsICAtNSB9LAorICAgIHsgIC05LCAgLTUgfSwgeyAgLTIsICAtNSB9LCB7ICAgMCwgIC01IH0sIHsgICAyLCAgLTUgfSwgeyAgIDUsICAtNSB9LAorICAgIHsgIDEzLCAgLTUgfSwgeyAtMjUsICAtNCB9LCB7ICAtNiwgIC00IH0sIHsgIC0zLCAgLTQgfSwgeyAgIDMsICAtNCB9LAorICAgIHsgICA5LCAgLTQgfSwgeyAtMTksICAtMyB9LCB7ICAtNywgIC0zIH0sIHsgIC00LCAgLTMgfSwgeyAgLTIsICAtMyB9LAorICAgIHsgIC0xLCAgLTMgfSwgeyAgIDAsICAtMyB9LCB7ICAgMSwgIC0zIH0sIHsgICAyLCAgLTMgfSwgeyAgIDQsICAtMyB9LAorICAgIHsgICA2LCAgLTMgfSwgeyAgMzMsICAtMyB9LCB7IC0xNCwgIC0yIH0sIHsgLTEwLCAgLTIgfSwgeyAgLTUsICAtMiB9LAorICAgIHsgIC0zLCAgLTIgfSwgeyAgLTIsICAtMiB9LCB7ICAtMSwgIC0yIH0sIHsgICAwLCAgLTIgfSwgeyAgIDEsICAtMiB9LAorICAgIHsgICAyLCAgLTIgfSwgeyAgIDMsICAtMiB9LCB7ICAgNSwgIC0yIH0sIHsgICA3LCAgLTIgfSwgeyAgMTQsICAtMiB9LAorICAgIHsgIDE5LCAgLTIgfSwgeyAgMjUsICAtMiB9LCB7ICA0MywgIC0yIH0sIHsgIC03LCAgLTEgfSwgeyAgLTMsICAtMSB9LAorICAgIHsgIC0yLCAgLTEgfSwgeyAgLTEsICAtMSB9LCB7ICAgMCwgIC0xIH0sIHsgICAxLCAgLTEgfSwgeyAgIDIsICAtMSB9LAorICAgIHsgICAzLCAgLTEgfSwgeyAgMTAsICAtMSB9LCB7ICAtNSwgICAwIH0sIHsgIC0zLCAgIDAgfSwgeyAgLTIsICAgMCB9LAorICAgIHsgIC0xLCAgIDAgfSwgeyAgIDEsICAgMCB9LCB7ICAgMiwgICAwIH0sIHsgICAzLCAgIDAgfSwgeyAgIDUsICAgMCB9LAorICAgIHsgICA3LCAgIDAgfSwgeyAtMTAsICAgMSB9LCB7ICAtNywgICAxIH0sIHsgIC0zLCAgIDEgfSwgeyAgLTIsICAgMSB9LAorICAgIHsgIC0xLCAgIDEgfSwgeyAgIDAsICAgMSB9LCB7ICAgMSwgICAxIH0sIHsgICAyLCAgIDEgfSwgeyAgIDMsICAgMSB9LAorICAgIHsgLTQzLCAgIDIgfSwgeyAtMjUsICAgMiB9LCB7IC0xOSwgICAyIH0sIHsgLTE0LCAgIDIgfSwgeyAgLTUsICAgMiB9LAorICAgIHsgIC0zLCAgIDIgfSwgeyAgLTIsICAgMiB9LCB7ICAtMSwgICAyIH0sIHsgICAwLCAgIDIgfSwgeyAgIDEsICAgMiB9LAorICAgIHsgICAyLCAgIDIgfSwgeyAgIDMsICAgMiB9LCB7ICAgNSwgICAyIH0sIHsgICA3LCAgIDIgfSwgeyAgMTAsICAgMiB9LAorICAgIHsgIDE0LCAgIDIgfSwgeyAtMzMsICAgMyB9LCB7ICAtNiwgICAzIH0sIHsgIC00LCAgIDMgfSwgeyAgLTIsICAgMyB9LAorICAgIHsgIC0xLCAgIDMgfSwgeyAgIDAsICAgMyB9LCB7ICAgMSwgICAzIH0sIHsgICAyLCAgIDMgfSwgeyAgIDQsICAgMyB9LAorICAgIHsgIDE5LCAgIDMgfSwgeyAgLTksICAgNCB9LCB7ICAtMywgICA0IH0sIHsgICAzLCAgIDQgfSwgeyAgIDcsICAgNCB9LAorICAgIHsgIDI1LCAgIDQgfSwgeyAtMTMsICAgNSB9LCB7ICAtNSwgICA1IH0sIHsgIC0yLCAgIDUgfSwgeyAgIDAsICAgNSB9LAorICAgIHsgICAyLCAgIDUgfSwgeyAgIDUsICAgNSB9LCB7ICAgOSwgICA1IH0sIHsgIDMzLCAgIDUgfSwgeyAgLTgsICAgNiB9LAorICAgIHsgIC00LCAgIDYgfSwgeyAgIDQsICAgNiB9LCB7ICAxMywgICA2IH0sIHsgIDQzLCAgIDYgfSwgeyAtMTgsICAgNyB9LAorICAgIHsgIC0yLCAgIDcgfSwgeyAgIDAsICAgNyB9LCB7ICAgMiwgICA3IH0sIHsgICA3LCAgIDcgfSwgeyAgMTgsICAgNyB9LAorICAgIHsgLTI0LCAgIDggfSwgeyAgLTYsICAgOCB9LCB7IC00MiwgICA5IH0sIHsgLTExLCAgIDkgfSwgeyAgLTQsICAgOSB9LAorICAgIHsgICA1LCAgIDkgfSwgeyAgMTEsICAgOSB9LCB7ICAyMywgICA5IH0sIHsgLTMxLCAgMTAgfSwgeyAgLTEsICAxMCB9LAorICAgIHsgICAyLCAgMTAgfSwgeyAtMTUsICAxMSB9LCB7ICAtOCwgIDExIH0sIHsgICA4LCAgMTEgfSwgeyAgMTUsICAxMSB9LAorICAgIHsgIDMxLCAgMTIgfSwgeyAtMjEsICAxMyB9LCB7ICAtNSwgIDEzIH0sIHsgICA1LCAgMTMgfSwgeyAgNDEsICAxMyB9LAorICAgIHsgIC0xLCAgMTQgfSwgeyAgIDEsICAxNCB9LCB7ICAyMSwgIDE0IH0sIHsgLTEyLCAgMTUgfSwgeyAgMTIsICAxNSB9LAorICAgIHsgLTM5LCAgMTcgfSwgeyAtMjgsICAxNyB9LCB7IC0xOCwgIDE3IH0sIHsgIC04LCAgMTcgfSwgeyAgIDgsICAxNyB9LAorICAgIHsgIDE3LCAgMTggfSwgeyAgLTQsICAxOSB9LCB7ICAgMCwgIDE5IH0sIHsgICA0LCAgMTkgfSwgeyAgMjcsICAxOSB9LAorICAgIHsgIDM4LCAgMjAgfSwgeyAtMTMsICAyMSB9LCB7ICAxMiwgIDIyIH0sIHsgLTM2LCAgMjMgfSwgeyAtMjQsICAyMyB9LAorICAgIHsgIC04LCAgMjQgfSwgeyAgIDcsICAyNCB9LCB7ICAtMywgIDI1IH0sIHsgICAxLCAgMjUgfSwgeyAgMjIsICAyNSB9LAorICAgIHsgIDM0LCAgMjYgfSwgeyAtMTgsICAyOCB9LCB7IC0zMiwgIDI5IH0sIHsgIDE2LCAgMjkgfSwgeyAtMTEsICAzMSB9LAorICAgIHsgICA5LCAgMzIgfSwgeyAgMjksICAzMiB9LCB7ICAtNCwgIDMzIH0sIHsgICAyLCAgMzMgfSwgeyAtMjYsICAzNCB9LAorICAgIHsgIDIzLCAgMzYgfSwgeyAtMTksICAzOSB9LCB7ICAxNiwgIDQwIH0sIHsgLTEzLCAgNDEgfSwgeyAgIDksICA0MiB9LAorICAgIHsgIC02LCAgNDMgfSwgeyAgIDEsICA0MyB9LCB7ICAgMCwgICAwIH0sIHsgICAwLCAgIDAgfSwgeyAgIDAsICAgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBjMzdfbXZbXSA9IHsKKyAgICAwLCAgIDAsICAgMSwgICAwLCAgIDIsICAgMCwgICAzLCAgIDAsICAgNSwgICAwLAorICAgIDgsICAgMCwgIDEzLCAgIDAsICAyMSwgICAwLCAgLTEsICAgMCwgIC0yLCAgIDAsCisgICAtMywgICAwLCAgLTUsICAgMCwgIC04LCAgIDAsIC0xMywgICAwLCAtMTcsICAgMCwKKyAgLTIxLCAgIDAsICAgMCwgICAxLCAgIDEsICAgMSwgICAyLCAgIDEsICAgMywgICAxLAorICAgIDUsICAgMSwgICA4LCAgIDEsICAxMywgICAxLCAgMjEsICAgMSwgIC0xLCAgIDEsCisgICAtMiwgICAxLCAgLTMsICAgMSwgIC01LCAgIDEsICAtOCwgICAxLCAtMTMsICAgMSwKKyAgLTE3LCAgIDEsIC0yMSwgICAxLCAgIDAsICAgMiwgICAxLCAgIDIsICAgMiwgICAyLAorICAgIDMsICAgMiwgICA1LCAgIDIsICAgOCwgICAyLCAgMTMsICAgMiwgIDIxLCAgIDIsCisgICAtMSwgICAyLCAgLTIsICAgMiwgIC0zLCAgIDIsICAtNSwgICAyLCAgLTgsICAgMiwKKyAgLTEzLCAgIDIsIC0xNywgICAyLCAtMjEsICAgMiwgICAwLCAgIDMsICAgMSwgICAzLAorICAgIDIsICAgMywgICAzLCAgIDMsICAgNSwgICAzLCAgIDgsICAgMywgIDEzLCAgIDMsCisgICAyMSwgICAzLCAgLTEsICAgMywgIC0yLCAgIDMsICAtMywgICAzLCAgLTUsICAgMywKKyAgIC04LCAgIDMsIC0xMywgICAzLCAtMTcsICAgMywgLTIxLCAgIDMsICAgMCwgICA1LAorICAgIDEsICAgNSwgICAyLCAgIDUsICAgMywgICA1LCAgIDUsICAgNSwgICA4LCAgIDUsCisgICAxMywgICA1LCAgMjEsICAgNSwgIC0xLCAgIDUsICAtMiwgICA1LCAgLTMsICAgNSwKKyAgIC01LCAgIDUsICAtOCwgICA1LCAtMTMsICAgNSwgLTE3LCAgIDUsIC0yMSwgICA1LAorICAgIDAsICAgOCwgICAxLCAgIDgsICAgMiwgICA4LCAgIDMsICAgOCwgICA1LCAgIDgsCisgICAgOCwgICA4LCAgMTMsICAgOCwgIDIxLCAgIDgsICAtMSwgICA4LCAgLTIsICAgOCwKKyAgIC0zLCAgIDgsICAtNSwgICA4LCAgLTgsICAgOCwgLTEzLCAgIDgsIC0xNywgICA4LAorICAtMjEsICAgOCwgICAwLCAgMTMsICAgMSwgIDEzLCAgIDIsICAxMywgICAzLCAgMTMsCisgICAgNSwgIDEzLCAgIDgsICAxMywgIDEzLCAgMTMsICAyMSwgIDEzLCAgLTEsICAxMywKKyAgIC0yLCAgMTMsICAtMywgIDEzLCAgLTUsICAxMywgIC04LCAgMTMsIC0xMywgIDEzLAorICAtMTcsICAxMywgLTIxLCAgMTMsICAgMCwgIDIxLCAgIDEsICAyMSwgICAyLCAgMjEsCisgICAgMywgIDIxLCAgIDUsICAyMSwgICA4LCAgMjEsICAxMywgIDIxLCAgMjEsICAyMSwKKyAgIC0xLCAgMjEsICAtMiwgIDIxLCAgLTMsICAyMSwgIC01LCAgMjEsICAtOCwgIDIxLAorICAtMTMsICAyMSwgLTE3LCAgMjEsIC0yMSwgIDIxLCAgIDAsICAtMSwgICAxLCAgLTEsCisgICAgMiwgIC0xLCAgIDMsICAtMSwgICA1LCAgLTEsICAgOCwgIC0xLCAgMTMsICAtMSwKKyAgIDIxLCAgLTEsICAtMSwgIC0xLCAgLTIsICAtMSwgIC0zLCAgLTEsICAtNSwgIC0xLAorICAgLTgsICAtMSwgLTEzLCAgLTEsIC0xNywgIC0xLCAtMjEsICAtMSwgICAwLCAgLTIsCisgICAgMSwgIC0yLCAgIDIsICAtMiwgICAzLCAgLTIsICAgNSwgIC0yLCAgIDgsICAtMiwKKyAgIDEzLCAgLTIsICAyMSwgIC0yLCAgLTEsICAtMiwgIC0yLCAgLTIsICAtMywgIC0yLAorICAgLTUsICAtMiwgIC04LCAgLTIsIC0xMywgIC0yLCAtMTcsICAtMiwgLTIxLCAgLTIsCisgICAgMCwgIC0zLCAgIDEsICAtMywgICAyLCAgLTMsICAgMywgIC0zLCAgIDUsICAtMywKKyAgICA4LCAgLTMsICAxMywgIC0zLCAgMjEsICAtMywgIC0xLCAgLTMsICAtMiwgIC0zLAorICAgLTMsICAtMywgIC01LCAgLTMsICAtOCwgIC0zLCAtMTMsICAtMywgLTE3LCAgLTMsCisgIC0yMSwgIC0zLCAgIDAsICAtNSwgICAxLCAgLTUsICAgMiwgIC01LCAgIDMsICAtNSwKKyAgICA1LCAgLTUsICAgOCwgIC01LCAgMTMsICAtNSwgIDIxLCAgLTUsICAtMSwgIC01LAorICAgLTIsICAtNSwgIC0zLCAgLTUsICAtNSwgIC01LCAgLTgsICAtNSwgLTEzLCAgLTUsCisgIC0xNywgIC01LCAtMjEsICAtNSwgICAwLCAgLTgsICAgMSwgIC04LCAgIDIsICAtOCwKKyAgICAzLCAgLTgsICAgNSwgIC04LCAgIDgsICAtOCwgIDEzLCAgLTgsICAyMSwgIC04LAorICAgLTEsICAtOCwgIC0yLCAgLTgsICAtMywgIC04LCAgLTUsICAtOCwgIC04LCAgLTgsCisgIC0xMywgIC04LCAtMTcsICAtOCwgLTIxLCAgLTgsICAgMCwgLTEzLCAgIDEsIC0xMywKKyAgICAyLCAtMTMsICAgMywgLTEzLCAgIDUsIC0xMywgICA4LCAtMTMsICAxMywgLTEzLAorICAgMjEsIC0xMywgIC0xLCAtMTMsICAtMiwgLTEzLCAgLTMsIC0xMywgIC01LCAtMTMsCisgICAtOCwgLTEzLCAtMTMsIC0xMywgLTE3LCAtMTMsIC0yMSwgLTEzLCAgIDAsIC0xNywKKyAgICAxLCAtMTcsICAgMiwgLTE3LCAgIDMsIC0xNywgICA1LCAtMTcsICAgOCwgLTE3LAorICAgMTMsIC0xNywgIDIxLCAtMTcsICAtMSwgLTE3LCAgLTIsIC0xNywgIC0zLCAtMTcsCisgICAtNSwgLTE3LCAgLTgsIC0xNywgLTEzLCAtMTcsIC0xNywgLTE3LCAtMjEsIC0xNywKKyAgICAwLCAtMjEsICAgMSwgLTIxLCAgIDIsIC0yMSwgICAzLCAtMjEsICAgNSwgLTIxLAorICAgIDgsIC0yMSwgIDEzLCAtMjEsICAyMSwgLTIxLCAgLTEsIC0yMSwgIC0yLCAtMjEsCisgICAtMywgLTIxLCAgLTUsIC0yMSwgIC04LCAtMjEsIC0xMywgLTIxLCAtMTcsIC0yMSwKKyAgICAwLCAgIDAsICAtOCwgLTI5LCAgIDgsIC0yOSwgLTE4LCAtMjUsICAxNywgLTI1LAorICAgIDAsIC0yMywgIC02LCAtMjIsICAgNiwgLTIyLCAtMTMsIC0xOSwgIDEyLCAtMTksCisgICAgMCwgLTE4LCAgMjUsIC0xOCwgLTI1LCAtMTcsICAtNSwgLTE3LCAgIDUsIC0xNywKKyAgLTEwLCAtMTUsICAxMCwgLTE1LCAgIDAsIC0xNCwgIC00LCAtMTMsICAgNCwgLTEzLAorICAgMTksIC0xMywgLTE5LCAtMTIsICAtOCwgLTExLCAgLTIsIC0xMSwgICAwLCAtMTEsCisgICAgMiwgLTExLCAgIDgsIC0xMSwgLTE1LCAtMTAsICAtNCwgLTEwLCAgIDQsIC0xMCwKKyAgIDE1LCAtMTAsICAtNiwgIC05LCAgLTEsICAtOSwgICAxLCAgLTksICAgNiwgIC05LAorICAtMjksICAtOCwgLTExLCAgLTgsICAtOCwgIC04LCAgLTMsICAtOCwgICAzLCAgLTgsCisgICAgOCwgIC04LCAgMTEsICAtOCwgIDI5LCAgLTgsICAtNSwgIC03LCAgLTIsICAtNywKKyAgICAwLCAgLTcsICAgMiwgIC03LCAgIDUsICAtNywgLTIyLCAgLTYsICAtOSwgIC02LAorICAgLTYsICAtNiwgIC0zLCAgLTYsICAtMSwgIC02LCAgIDEsICAtNiwgICAzLCAgLTYsCisgICAgNiwgIC02LCAgIDksICAtNiwgIDIyLCAgLTYsIC0xNywgIC01LCAgLTcsICAtNSwKKyAgIC00LCAgLTUsICAtMiwgIC01LCAgIDAsICAtNSwgICAyLCAgLTUsICAgNCwgIC01LAorICAgIDcsICAtNSwgIDE3LCAgLTUsIC0xMywgIC00LCAtMTAsICAtNCwgIC01LCAgLTQsCisgICAtMywgIC00LCAgLTEsICAtNCwgICAwLCAgLTQsICAgMSwgIC00LCAgIDMsICAtNCwKKyAgICA1LCAgLTQsICAxMCwgIC00LCAgMTMsICAtNCwgIC04LCAgLTMsICAtNiwgIC0zLAorICAgLTQsICAtMywgIC0zLCAgLTMsICAtMiwgIC0zLCAgLTEsICAtMywgICAwLCAgLTMsCisgICAgMSwgIC0zLCAgIDIsICAtMywgICA0LCAgLTMsICAgNiwgIC0zLCAgIDgsICAtMywKKyAgLTExLCAgLTIsICAtNywgIC0yLCAgLTUsICAtMiwgIC0zLCAgLTIsICAtMiwgIC0yLAorICAgLTEsICAtMiwgICAwLCAgLTIsICAgMSwgIC0yLCAgIDIsICAtMiwgICAzLCAgLTIsCisgICAgNSwgIC0yLCAgIDcsICAtMiwgIDExLCAgLTIsICAtOSwgIC0xLCAgLTYsICAtMSwKKyAgIC00LCAgLTEsICAtMywgIC0xLCAgLTIsICAtMSwgIC0xLCAgLTEsICAgMCwgIC0xLAorICAgIDEsICAtMSwgICAyLCAgLTEsICAgMywgIC0xLCAgIDQsICAtMSwgICA2LCAgLTEsCisgICAgOSwgIC0xLCAtMzEsICAgMCwgLTIzLCAgIDAsIC0xOCwgICAwLCAtMTQsICAgMCwKKyAgLTExLCAgIDAsICAtNywgICAwLCAgLTUsICAgMCwgIC00LCAgIDAsICAtMywgICAwLAorICAgLTIsICAgMCwgIC0xLCAgIDAsICAgMCwgLTMxLCAgIDEsICAgMCwgICAyLCAgIDAsCisgICAgMywgICAwLCAgIDQsICAgMCwgICA1LCAgIDAsICAgNywgICAwLCAgMTEsICAgMCwKKyAgIDE0LCAgIDAsICAxOCwgICAwLCAgMjMsICAgMCwgIDMxLCAgIDAsICAtOSwgICAxLAorICAgLTYsICAgMSwgIC00LCAgIDEsICAtMywgICAxLCAgLTIsICAgMSwgIC0xLCAgIDEsCisgICAgMCwgICAxLCAgIDEsICAgMSwgICAyLCAgIDEsICAgMywgICAxLCAgIDQsICAgMSwKKyAgICA2LCAgIDEsICAgOSwgICAxLCAtMTEsICAgMiwgIC03LCAgIDIsICAtNSwgICAyLAorICAgLTMsICAgMiwgIC0yLCAgIDIsICAtMSwgICAyLCAgIDAsICAgMiwgICAxLCAgIDIsCisgICAgMiwgICAyLCAgIDMsICAgMiwgICA1LCAgIDIsICAgNywgICAyLCAgMTEsICAgMiwKKyAgIC04LCAgIDMsICAtNiwgICAzLCAgLTQsICAgMywgIC0yLCAgIDMsICAtMSwgICAzLAorICAgIDAsICAgMywgICAxLCAgIDMsICAgMiwgICAzLCAgIDMsICAgMywgICA0LCAgIDMsCisgICAgNiwgICAzLCAgIDgsICAgMywgLTEzLCAgIDQsIC0xMCwgICA0LCAgLTUsICAgNCwKKyAgIC0zLCAgIDQsICAtMSwgICA0LCAgIDAsICAgNCwgICAxLCAgIDQsICAgMywgICA0LAorICAgIDUsICAgNCwgIDEwLCAgIDQsICAxMywgICA0LCAtMTcsICAgNSwgIC03LCAgIDUsCisgICAtNCwgICA1LCAgLTIsICAgNSwgICAwLCAgIDUsICAgMiwgICA1LCAgIDQsICAgNSwKKyAgICA3LCAgIDUsICAxNywgICA1LCAtMjIsICAgNiwgIC05LCAgIDYsICAtNiwgICA2LAorICAgLTMsICAgNiwgIC0xLCAgIDYsICAgMSwgICA2LCAgIDMsICAgNiwgICA2LCAgIDYsCisgICAgOSwgICA2LCAgMjIsICAgNiwgIC01LCAgIDcsICAtMiwgICA3LCAgIDAsICAgNywKKyAgICAyLCAgIDcsICAgNSwgICA3LCAtMjksICAgOCwgLTExLCAgIDgsICAtOCwgICA4LAorICAgLTMsICAgOCwgICAzLCAgIDgsICAgOCwgICA4LCAgMTEsICAgOCwgIDI5LCAgIDgsCisgICAtNiwgICA5LCAgLTEsICAgOSwgICAxLCAgIDksICAgNiwgICA5LCAtMTUsICAxMCwKKyAgIC00LCAgMTAsICAgNCwgIDEwLCAgMTUsICAxMCwgIC04LCAgMTEsICAtMiwgIDExLAorICAgIDAsICAxMSwgICAyLCAgMTEsICAgOCwgIDExLCAgMTksICAxMiwgLTE5LCAgMTMsCisgICAtNCwgIDEzLCAgIDQsICAxMywgICAwLCAgMTQsIC0xMCwgIDE1LCAgMTAsICAxNSwKKyAgIC01LCAgMTcsICAgNSwgIDE3LCAgMjUsICAxNywgLTI1LCAgMTgsICAgMCwgIDE4LAorICAtMTIsICAxOSwgIDEzLCAgMTksICAtNiwgIDIyLCAgIDYsICAyMiwgICAwLCAgMjMsCisgIC0xNywgIDI1LCAgMTgsICAyNSwgIC04LCAgMjksICAgOCwgIDI5LCAgIDAsICAzMSwKKyAgICAwLCAgIDAsICAtNiwgLTIyLCAgIDYsIC0yMiwgLTEzLCAtMTksICAxMiwgLTE5LAorICAgIDAsIC0xOCwgIC01LCAtMTcsICAgNSwgLTE3LCAtMTAsIC0xNSwgIDEwLCAtMTUsCisgICAgMCwgLTE0LCAgLTQsIC0xMywgICA0LCAtMTMsICAxOSwgLTEzLCAtMTksIC0xMiwKKyAgIC04LCAtMTEsICAtMiwgLTExLCAgIDAsIC0xMSwgICAyLCAtMTEsICAgOCwgLTExLAorICAtMTUsIC0xMCwgIC00LCAtMTAsICAgNCwgLTEwLCAgMTUsIC0xMCwgIC02LCAgLTksCisgICAtMSwgIC05LCAgIDEsICAtOSwgICA2LCAgLTksIC0xMSwgIC04LCAgLTgsICAtOCwKKyAgIC0zLCAgLTgsICAgMCwgIC04LCAgIDMsICAtOCwgICA4LCAgLTgsICAxMSwgIC04LAorICAgLTUsICAtNywgIC0yLCAgLTcsICAgMCwgIC03LCAgIDIsICAtNywgICA1LCAgLTcsCisgIC0yMiwgIC02LCAgLTksICAtNiwgIC02LCAgLTYsICAtMywgIC02LCAgLTEsICAtNiwKKyAgICAxLCAgLTYsICAgMywgIC02LCAgIDYsICAtNiwgICA5LCAgLTYsICAyMiwgIC02LAorICAtMTcsICAtNSwgIC03LCAgLTUsICAtNCwgIC01LCAgLTIsICAtNSwgIC0xLCAgLTUsCisgICAgMCwgIC01LCAgIDEsICAtNSwgICAyLCAgLTUsICAgNCwgIC01LCAgIDcsICAtNSwKKyAgIDE3LCAgLTUsIC0xMywgIC00LCAtMTAsICAtNCwgIC01LCAgLTQsICAtMywgIC00LAorICAgLTIsICAtNCwgIC0xLCAgLTQsICAgMCwgIC00LCAgIDEsICAtNCwgICAyLCAgLTQsCisgICAgMywgIC00LCAgIDUsICAtNCwgIDEwLCAgLTQsICAxMywgIC00LCAgLTgsICAtMywKKyAgIC02LCAgLTMsICAtNCwgIC0zLCAgLTMsICAtMywgIC0yLCAgLTMsICAtMSwgIC0zLAorICAgIDAsICAtMywgICAxLCAgLTMsICAgMiwgIC0zLCAgIDMsICAtMywgICA0LCAgLTMsCisgICAgNiwgIC0zLCAgIDgsICAtMywgLTExLCAgLTIsICAtNywgIC0yLCAgLTUsICAtMiwKKyAgIC00LCAgLTIsICAtMywgIC0yLCAgLTIsICAtMiwgIC0xLCAgLTIsICAgMCwgIC0yLAorICAgIDEsICAtMiwgICAyLCAgLTIsICAgMywgIC0yLCAgIDQsICAtMiwgICA1LCAgLTIsCisgICAgNywgIC0yLCAgMTEsICAtMiwgIC05LCAgLTEsICAtNiwgIC0xLCAgLTUsICAtMSwKKyAgIC00LCAgLTEsICAtMywgIC0xLCAgLTIsICAtMSwgIC0xLCAgLTEsICAgMCwgIC0xLAorICAgIDEsICAtMSwgICAyLCAgLTEsICAgMywgIC0xLCAgIDQsICAtMSwgICA1LCAgLTEsCisgICAgNiwgIC0xLCAgIDksICAtMSwgLTIzLCAgIDAsIC0xOCwgICAwLCAtMTQsICAgMCwKKyAgLTExLCAgIDAsICAtNywgICAwLCAgLTUsICAgMCwgIC00LCAgIDAsICAtMywgICAwLAorICAgLTIsICAgMCwgIC0xLCAgIDAsICAgMCwgLTIzLCAgIDEsICAgMCwgICAyLCAgIDAsCisgICAgMywgICAwLCAgIDQsICAgMCwgICA1LCAgIDAsICAgNywgICAwLCAgMTEsICAgMCwKKyAgIDE0LCAgIDAsICAxOCwgICAwLCAgMjMsICAgMCwgIC05LCAgIDEsICAtNiwgICAxLAorICAgLTUsICAgMSwgIC00LCAgIDEsICAtMywgICAxLCAgLTIsICAgMSwgIC0xLCAgIDEsCisgICAgMCwgICAxLCAgIDEsICAgMSwgICAyLCAgIDEsICAgMywgICAxLCAgIDQsICAgMSwKKyAgICA1LCAgIDEsICAgNiwgICAxLCAgIDksICAgMSwgLTExLCAgIDIsICAtNywgICAyLAorICAgLTUsICAgMiwgIC00LCAgIDIsICAtMywgICAyLCAgLTIsICAgMiwgIC0xLCAgIDIsCisgICAgMCwgICAyLCAgIDEsICAgMiwgICAyLCAgIDIsICAgMywgICAyLCAgIDQsICAgMiwKKyAgICA1LCAgIDIsICAgNywgICAyLCAgMTEsICAgMiwgIC04LCAgIDMsICAtNiwgICAzLAorICAgLTQsICAgMywgIC0zLCAgIDMsICAtMiwgICAzLCAgLTEsICAgMywgICAwLCAgIDMsCisgICAgMSwgICAzLCAgIDIsICAgMywgICAzLCAgIDMsICAgNCwgICAzLCAgIDYsICAgMywKKyAgICA4LCAgIDMsIC0xMywgICA0LCAtMTAsICAgNCwgIC01LCAgIDQsICAtMywgICA0LAorICAgLTIsICAgNCwgIC0xLCAgIDQsICAgMCwgICA0LCAgIDEsICAgNCwgICAyLCAgIDQsCisgICAgMywgICA0LCAgIDUsICAgNCwgIDEwLCAgIDQsICAxMywgICA0LCAtMTcsICAgNSwKKyAgIC03LCAgIDUsICAtNCwgICA1LCAgLTIsICAgNSwgIC0xLCAgIDUsICAgMCwgICA1LAorICAgIDEsICAgNSwgICAyLCAgIDUsICAgNCwgICA1LCAgIDcsICAgNSwgIDE3LCAgIDUsCisgIC0yMiwgICA2LCAgLTksICAgNiwgIC02LCAgIDYsICAtMywgICA2LCAgLTEsICAgNiwKKyAgICAxLCAgIDYsICAgMywgICA2LCAgIDYsICAgNiwgICA5LCAgIDYsICAyMiwgICA2LAorICAgLTUsICAgNywgIC0yLCAgIDcsICAgMCwgICA3LCAgIDIsICAgNywgICA1LCAgIDcsCisgIC0xMSwgICA4LCAgLTgsICAgOCwgIC0zLCAgIDgsICAgMCwgICA4LCAgIDMsICAgOCwKKyAgICA4LCAgIDgsICAxMSwgICA4LCAgLTYsICAgOSwgIC0xLCAgIDksICAgMSwgICA5LAorICAgIDYsICAgOSwgLTE1LCAgMTAsICAtNCwgIDEwLCAgIDQsICAxMCwgIDE1LCAgMTAsCisgICAtOCwgIDExLCAgLTIsICAxMSwgICAwLCAgMTEsICAgMiwgIDExLCAgIDgsICAxMSwKKyAgIDE5LCAgMTIsIC0xOSwgIDEzLCAgLTQsICAxMywgICA0LCAgMTMsICAgMCwgIDE0LAorICAtMTAsICAxNSwgIDEwLCAgMTUsICAtNSwgIDE3LCAgIDUsICAxNywgICAwLCAgMTgsCisgIC0xMiwgIDE5LCAgMTMsICAxOSwgIC02LCAgMjIsICAgNiwgIDIyLCAgIDAsICAyMywKK307CisKK3R5cGVkZWYgc3RydWN0IFNBTk1WaWRlb0NvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKworICAgIGludCB2ZXJzaW9uLCBzdWJ2ZXJzaW9uOworICAgIHVpbnQzMl90IHBhbFtQQUxFVFRFX1NJWkVdOworICAgIGludDE2X3QgZGVsdGFfcGFsW1BBTEVUVEVfREVMVEFdOworCisgICAgaW50IHBpdGNoOworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBhbGlnbmVkX3dpZHRoLCBhbGlnbmVkX2hlaWdodDsKKyAgICBpbnQgcHJldl9zZXE7CisKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICB1aW50MTZfdCAqZnJtMCwgKmZybTEsICpmcm0yOworICAgIHVpbnQ4X3QgKnN0b3JlZF9mcmFtZTsKKyAgICB1aW50MzJfdCBmcm0wX3NpemUsIGZybTFfc2l6ZSwgZnJtMl9zaXplOworICAgIHVpbnQzMl90IHN0b3JlZF9mcmFtZV9zaXplOworCisgICAgdWludDhfdCAqcmxlX2J1ZjsKKyAgICB1bnNpZ25lZCBpbnQgcmxlX2J1Zl9zaXplOworCisgICAgaW50IHJvdGF0ZV9jb2RlOworCisgICAgbG9uZyBucGl4ZWxzLCBidWZfc2l6ZTsKKworICAgIHVpbnQxNl90IGNvZGVib29rWzI1Nl07CisgICAgdWludDE2X3Qgc21hbGxfY29kZWJvb2tbNF07CisKKyAgICBpbnQ4X3QgcDR4NGdseXBoc1tOR0xZUEhTXVsxNl07CisgICAgaW50OF90IHA4eDhnbHlwaHNbTkdMWVBIU11bNjRdOworfSBTQU5NVmlkZW9Db250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBTQU5NRnJhbWVIZWFkZXIgeworICAgIGludCBzZXFfbnVtLCBjb2RlYywgcm90YXRlX2NvZGUsIHJsZV9vdXRwdXRfc2l6ZTsKKworICAgIHVpbnQxNl90IGJnX2NvbG9yOworICAgIHVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Cit9IFNBTk1GcmFtZUhlYWRlcjsKKworZW51bSBHbHlwaEVkZ2UgeworICAgIExFRlRfRURHRSwKKyAgICBUT1BfRURHRSwKKyAgICBSSUdIVF9FREdFLAorICAgIEJPVFRPTV9FREdFLAorICAgIE5PX0VER0UKK307CisKK2VudW0gR2x5cGhEaXIgeworICAgIERJUl9MRUZULAorICAgIERJUl9VUCwKKyAgICBESVJfUklHSFQsCisgICAgRElSX0RPV04sCisgICAgTk9fRElSCit9OworCisvKioKKyAqIFJldHVybiBlbnVtIEdseXBoRWRnZSBvZiBib3ggd2hlcmUgcG9pbnQgKHgsIHkpIGxpZXMuCisgKgorICogQHBhcmFtIHggeCBwb2ludCBjb29yZGluYXRlCisgKiBAcGFyYW0geSB5IHBvaW50IGNvb3JkaW5hdGUKKyAqIEBwYXJhbSBlZGdlX3NpemUgYm94IHdpZHRoL2hlaWdodC4KKyAqLworc3RhdGljIGVudW0gR2x5cGhFZGdlIHdoaWNoX2VkZ2UoaW50IHgsIGludCB5LCBpbnQgZWRnZV9zaXplKQoreworICAgIGNvbnN0IGludCBlZGdlX21heCA9IGVkZ2Vfc2l6ZSAtIDE7CisKKyAgICBpZiAoIXkpCisgICAgICAgIHJldHVybiBCT1RUT01fRURHRTsKKyAgICBlbHNlIGlmICh5ID09IGVkZ2VfbWF4KQorICAgICAgICByZXR1cm4gVE9QX0VER0U7CisgICAgZWxzZSBpZiAoIXgpCisgICAgICAgIHJldHVybiBMRUZUX0VER0U7CisgICAgZWxzZSBpZiAoeCA9PSBlZGdlX21heCkKKyAgICAgICAgcmV0dXJuIFJJR0hUX0VER0U7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTk9fRURHRTsKK30KKworc3RhdGljIGVudW0gR2x5cGhEaXIgd2hpY2hfZGlyZWN0aW9uKGVudW0gR2x5cGhFZGdlIGVkZ2UwLCBlbnVtIEdseXBoRWRnZSBlZGdlMSkKK3sKKyAgICBpZiAoKGVkZ2UwID09IExFRlRfRURHRSAmJiBlZGdlMSA9PSBSSUdIVF9FREdFKSB8fAorICAgICAgICAoZWRnZTEgPT0gTEVGVF9FREdFICYmIGVkZ2UwID09IFJJR0hUX0VER0UpIHx8CisgICAgICAgIChlZGdlMCA9PSBCT1RUT01fRURHRSAmJiBlZGdlMSAhPSBUT1BfRURHRSkgfHwKKyAgICAgICAgKGVkZ2UxID09IEJPVFRPTV9FREdFICYmIGVkZ2UwICE9IFRPUF9FREdFKSkKKyAgICAgICAgcmV0dXJuIERJUl9VUDsKKyAgICBlbHNlIGlmICgoZWRnZTAgPT0gVE9QX0VER0UgJiYgZWRnZTEgIT0gQk9UVE9NX0VER0UpIHx8CisgICAgICAgICAgICAgKGVkZ2UxID09IFRPUF9FREdFICYmIGVkZ2UwICE9IEJPVFRPTV9FREdFKSkKKyAgICAgICAgcmV0dXJuIERJUl9ET1dOOworICAgIGVsc2UgaWYgKChlZGdlMCA9PSBMRUZUX0VER0UgJiYgZWRnZTEgIT0gUklHSFRfRURHRSkgfHwKKyAgICAgICAgICAgICAoZWRnZTEgPT0gTEVGVF9FREdFICYmIGVkZ2UwICE9IFJJR0hUX0VER0UpKQorICAgICAgICByZXR1cm4gRElSX0xFRlQ7CisgICAgZWxzZSBpZiAoKGVkZ2UwID09IFRPUF9FREdFICYmIGVkZ2UxID09IEJPVFRPTV9FREdFKSB8fAorICAgICAgICAgICAgIChlZGdlMSA9PSBUT1BfRURHRSAmJiBlZGdlMCA9PSBCT1RUT01fRURHRSkgfHwKKyAgICAgICAgICAgICAoZWRnZTAgPT0gUklHSFRfRURHRSAmJiBlZGdlMSAhPSBMRUZUX0VER0UpIHx8CisgICAgICAgICAgICAgKGVkZ2UxID09IFJJR0hUX0VER0UgJiYgZWRnZTAgIT0gTEVGVF9FREdFKSkKKyAgICAgICAgcmV0dXJuIERJUl9SSUdIVDsKKworICAgIHJldHVybiBOT19ESVI7Cit9CisKKy8qIEludGVycG9sYXRlIHR3byBwb2ludHMuICovCitzdGF0aWMgdm9pZCBpbnRlcnBfcG9pbnQoaW50OF90ICpwb2ludHMsIGludCB4MCwgaW50IHkwLCBpbnQgeDEsIGludCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zLCBpbnQgbnBvaW50cykKK3sKKyAgICBpZiAobnBvaW50cykgeworICAgICAgICBwb2ludHNbMF0gPSAoeDAgKiBwb3MgKyB4MSAqIChucG9pbnRzIC0gcG9zKSArIChucG9pbnRzID4+IDEpKSAvIG5wb2ludHM7CisgICAgICAgIHBvaW50c1sxXSA9ICh5MCAqIHBvcyArIHkxICogKG5wb2ludHMgLSBwb3MpICsgKG5wb2ludHMgPj4gMSkpIC8gbnBvaW50czsKKyAgICB9IGVsc2UgeworICAgICAgICBwb2ludHNbMF0gPSB4MDsKKyAgICAgICAgcG9pbnRzWzFdID0geTA7CisgICAgfQorfQorCisvKioKKyAqIENvbnN0cnVjdCBnbHlwaHMgYnkgaXRlcmF0aW5nIHRocm91Z2ggdmVjdG9yIGNvb3JkaW5hdGVzLgorICoKKyAqIEBwYXJhbSBwZ2x5cGhzIHBvaW50ZXIgdG8gdGFibGUgd2hlcmUgZ2x5cGhzIGFyZSBzdG9yZWQKKyAqIEBwYXJhbSB4dmVjIHBvaW50ZXIgdG8geCBjb21wb25lbnQgb2YgdmVjdG9yIGNvb3JkaW5hdGVzCisgKiBAcGFyYW0geXZlYyBwb2ludGVyIHRvIHkgY29tcG9uZW50IG9mIHZlY3RvciBjb29yZGluYXRlcworICogQHBhcmFtIHNpZGVfbGVuZ3RoIGdseXBoIHdpZHRoL2hlaWdodC4KKyAqLworc3RhdGljIHZvaWQgbWFrZV9nbHlwaHMoaW50OF90ICpwZ2x5cGhzLCBjb25zdCBpbnQ4X3QgKnh2ZWMsIGNvbnN0IGludDhfdCAqeXZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzaWRlX2xlbmd0aCkKK3sKKyAgICBjb25zdCBpbnQgZ2x5cGhfc2l6ZSA9IHNpZGVfbGVuZ3RoICogc2lkZV9sZW5ndGg7CisgICAgaW50OF90ICpwZ2x5cGggPSBwZ2x5cGhzOworCisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IEdMWVBIX0NPT1JEX1ZFQ1RfU0laRTsgaSsrKSB7CisgICAgICAgIGludCB4MCA9IHh2ZWNbaV07CisgICAgICAgIGludCB5MCA9IHl2ZWNbaV07CisgICAgICAgIGVudW0gR2x5cGhFZGdlIGVkZ2UwID0gd2hpY2hfZWRnZSh4MCwgeTAsIHNpZGVfbGVuZ3RoKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgR0xZUEhfQ09PUkRfVkVDVF9TSVpFOyBqKyssIHBnbHlwaCArPSBnbHlwaF9zaXplKSB7CisgICAgICAgICAgICBpbnQgeDEgPSB4dmVjW2pdOworICAgICAgICAgICAgaW50IHkxID0geXZlY1tqXTsKKyAgICAgICAgICAgIGVudW0gR2x5cGhFZGdlIGVkZ2UxID0gd2hpY2hfZWRnZSh4MSwgeTEsIHNpZGVfbGVuZ3RoKTsKKyAgICAgICAgICAgIGVudW0gR2x5cGhEaXIgZGlyID0gd2hpY2hfZGlyZWN0aW9uKGVkZ2UwLCBlZGdlMSk7CisgICAgICAgICAgICBpbnQgbnBvaW50cyA9IEZGTUFYKEZGQUJTKHgxIC0geDApLCBGRkFCUyh5MSAtIHkwKSk7CisgICAgICAgICAgICBpbnQgaXBvaW50OworCisgICAgICAgICAgICBmb3IgKGlwb2ludCA9IDA7IGlwb2ludCA8PSBucG9pbnRzOyBpcG9pbnQrKykgeworICAgICAgICAgICAgICAgIGludDhfdCBwb2ludFsyXTsKKyAgICAgICAgICAgICAgICBpbnQgaXJvdywgaWNvbDsKKworICAgICAgICAgICAgICAgIGludGVycF9wb2ludChwb2ludCwgeDAsIHkwLCB4MSwgeTEsIGlwb2ludCwgbnBvaW50cyk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGRpcikgeworICAgICAgICAgICAgICAgIGNhc2UgRElSX1VQOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGlyb3cgPSBwb2ludFsxXTsgaXJvdyA+PSAwOyBpcm93LS0pCisgICAgICAgICAgICAgICAgICAgICAgICBwZ2x5cGhbcG9pbnRbMF0gKyBpcm93ICogc2lkZV9sZW5ndGhdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJUl9ET1dOOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGlyb3cgPSBwb2ludFsxXTsgaXJvdyA8IHNpZGVfbGVuZ3RoOyBpcm93KyspCisgICAgICAgICAgICAgICAgICAgICAgICBwZ2x5cGhbcG9pbnRbMF0gKyBpcm93ICogc2lkZV9sZW5ndGhdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJUl9MRUZUOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGljb2wgPSBwb2ludFswXTsgaWNvbCA+PSAwOyBpY29sLS0pCisgICAgICAgICAgICAgICAgICAgICAgICBwZ2x5cGhbaWNvbCArIHBvaW50WzFdICogc2lkZV9sZW5ndGhdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJUl9SSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpY29sID0gcG9pbnRbMF07IGljb2wgPCBzaWRlX2xlbmd0aDsgaWNvbCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcGdseXBoW2ljb2wgKyBwb2ludFsxXSAqIHNpZGVfbGVuZ3RoXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaW5pdF9zaXplcyhTQU5NVmlkZW9Db250ZXh0ICpjdHgsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBjdHgtPndpZHRoICAgPSB3aWR0aDsKKyAgICBjdHgtPmhlaWdodCAgPSBoZWlnaHQ7CisgICAgY3R4LT5ucGl4ZWxzID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICBjdHgtPmFsaWduZWRfd2lkdGggID0gRkZBTElHTih3aWR0aCwgOCk7CisgICAgY3R4LT5hbGlnbmVkX2hlaWdodCA9IEZGQUxJR04oaGVpZ2h0LCA4KTsKKworICAgIGN0eC0+YnVmX3NpemUgPSBjdHgtPmFsaWduZWRfd2lkdGggKiBjdHgtPmFsaWduZWRfaGVpZ2h0ICogc2l6ZW9mKGN0eC0+ZnJtMFswXSk7CisgICAgY3R4LT5waXRjaCAgICA9IHdpZHRoOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2J1ZmZlcnMoU0FOTVZpZGVvQ29udGV4dCAqY3R4KQoreworICAgIGF2X2ZyZWVwKCZjdHgtPmZybTApOworICAgIGF2X2ZyZWVwKCZjdHgtPmZybTEpOworICAgIGF2X2ZyZWVwKCZjdHgtPmZybTIpOworICAgIGF2X2ZyZWVwKCZjdHgtPnN0b3JlZF9mcmFtZSk7CisgICAgYXZfZnJlZXAoJmN0eC0+cmxlX2J1Zik7CisgICAgY3R4LT5mcm0wX3NpemUgPQorICAgIGN0eC0+ZnJtMV9zaXplID0KKyAgICBjdHgtPmZybTJfc2l6ZSA9IDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0X2J1ZmZlcnMoU0FOTVZpZGVvQ29udGV4dCAqY3R4KQoreworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmY3R4LT5mcm0wLCAmY3R4LT5mcm0wX3NpemUsIGN0eC0+YnVmX3NpemUpOworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmY3R4LT5mcm0xLCAmY3R4LT5mcm0xX3NpemUsIGN0eC0+YnVmX3NpemUpOworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmY3R4LT5mcm0yLCAmY3R4LT5mcm0yX3NpemUsIGN0eC0+YnVmX3NpemUpOworICAgIGlmICghY3R4LT52ZXJzaW9uKQorICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmN0eC0+c3RvcmVkX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+c3RvcmVkX2ZyYW1lX3NpemUsIGN0eC0+YnVmX3NpemUpOworCisgICAgaWYgKCFjdHgtPmZybTAgfHwgIWN0eC0+ZnJtMSB8fCAhY3R4LT5mcm0yIHx8CisgICAgICAgICghY3R4LT5zdG9yZWRfZnJhbWUgJiYgIWN0eC0+dmVyc2lvbikpIHsKKyAgICAgICAgZGVzdHJveV9idWZmZXJzKGN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJvdGF0ZV9idWZzKFNBTk1WaWRlb0NvbnRleHQgKmN0eCwgaW50IHJvdGF0ZV9jb2RlKQoreworICAgIGlmIChyb3RhdGVfY29kZSA9PSAyKQorICAgICAgICBGRlNXQVAodWludDE2X3QqLCBjdHgtPmZybTEsIGN0eC0+ZnJtMik7CisgICAgRkZTV0FQKHVpbnQxNl90KiwgY3R4LT5mcm0yLCBjdHgtPmZybTApOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNBTk1WaWRlb0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBjdHgtPmF2Y3R4ICAgPSBhdmN0eDsKKyAgICBjdHgtPnZlcnNpb24gPSAhYXZjdHgtPmV4dHJhZGF0YV9zaXplOworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBjdHgtPnZlcnNpb24gPyBBVl9QSVhfRk1UX1JHQjU2NSA6IEFWX1BJWF9GTVRfUEFMODsKKworICAgIGluaXRfc2l6ZXMoY3R4LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworICAgIGlmIChpbml0X2J1ZmZlcnMoY3R4KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgYnVmZmVycy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIG1ha2VfZ2x5cGhzKGN0eC0+cDR4NGdseXBoc1swXSwgZ2x5cGg0X3gsIGdseXBoNF95LCA0KTsKKyAgICBtYWtlX2dseXBocyhjdHgtPnA4eDhnbHlwaHNbMF0sIGdseXBoOF94LCBnbHlwaDhfeSwgOCk7CisKKyAgICBpZiAoIWN0eC0+dmVyc2lvbikgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMTAyNikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJOb3QgZW5vdWdoIGV4dHJhZGF0YS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPnN1YnZlcnNpb24gPSBBVl9STDE2KGF2Y3R4LT5leHRyYWRhdGEpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUEFMRVRURV9TSVpFOyBpKyspCisgICAgICAgICAgICBjdHgtPnBhbFtpXSA9IDB4RkZVIDw8IDI0IHwgQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhICsgMiArIGkgKiA0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNBTk1WaWRlb0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBkZXN0cm95X2J1ZmZlcnMoY3R4KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJsZV9kZWNvZGUoU0FOTVZpZGVvQ29udGV4dCAqY3R4LCB1aW50OF90ICpkc3QsIGNvbnN0IGludCBvdXRfc2l6ZSkKK3sKKyAgICBpbnQgb3Bjb2RlLCBjb2xvciwgcnVuX2xlbiwgbGVmdCA9IG91dF9zaXplOworCisgICAgd2hpbGUgKGxlZnQgPiAwKSB7CisgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgtPmdiKTsKKyAgICAgICAgcnVuX2xlbiA9IChvcGNvZGUgPj4gMSkgKyAxOworICAgICAgICBpZiAocnVuX2xlbiA+IGxlZnQgfHwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2IpIDw9IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBpZiAob3Bjb2RlICYgMSkgeworICAgICAgICAgICAgY29sb3IgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nYik7CisgICAgICAgICAgICBtZW1zZXQoZHN0LCBjb2xvciwgcnVuX2xlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2IpIDwgcnVuX2xlbikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXJ1KCZjdHgtPmdiLCBkc3QsIHJ1bl9sZW4pOworICAgICAgICB9CisKKyAgICAgICAgZHN0ICArPSBydW5fbGVuOworICAgICAgICBsZWZ0IC09IHJ1bl9sZW47CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2xkX2NvZGVjMShTQU5NVmlkZW9Db250ZXh0ICpjdHgsIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICB1aW50OF90ICpkc3QgPSAoKHVpbnQ4X3QgKiljdHgtPmZybTApICsgbGVmdCArIHRvcCAqIGN0eC0+cGl0Y2g7CisgICAgaW50IGksIGosIGxlbiwgZmxhZywgY29kZSwgdmFsLCBwb3MsIGVuZDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBwb3MgPSAwOworCisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikgPCAyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgbGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZjdHgtPmdiKTsKKyAgICAgICAgZW5kID0gYnl0ZXN0cmVhbTJfdGVsbCgmY3R4LT5nYikgKyBsZW47CisKKyAgICAgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX3RlbGwoJmN0eC0+Z2IpIDwgZW5kKSB7CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2IpIDwgMikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmY3R4LT5nYik7CisgICAgICAgICAgICBmbGFnID0gY29kZSAmIDE7CisgICAgICAgICAgICBjb2RlID0gKGNvZGUgPj4gMSkgKyAxOworICAgICAgICAgICAgaWYgKHBvcyArIGNvZGUgPiB3aWR0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGlmIChmbGFnKSB7CisgICAgICAgICAgICAgICAgdmFsID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgtPmdiKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsKQorICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZHN0ICsgcG9zLCB2YWwsIGNvZGUpOworICAgICAgICAgICAgICAgIHBvcyArPSBjb2RlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2IpIDwgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGU7IGorKykgeworICAgICAgICAgICAgICAgICAgICB2YWwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmN0eC0+Z2IpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3Bvc10gPSB2YWw7CisgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gY3R4LT5waXRjaDsKKyAgICB9CisgICAgY3R4LT5yb3RhdGVfY29kZSA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvZGVjMzdfbXYodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBpbnQgeCwgaW50IHkpCit7CisgICAgaW50IHBvcywgaSwgajsKKworICAgIHBvcyA9IHggKyB5ICogc3RyaWRlOworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgaWYgKChwb3MgKyBpKSA8IDAgfHwgKHBvcyArIGkpID49IGhlaWdodCAqIHN0cmlkZSkKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRzdFtpXSA9IHNyY1tpXTsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBwb3MgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGludCBvbGRfY29kZWMzNyhTQU5NVmlkZW9Db250ZXh0ICpjdHgsIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IHN0cmlkZSA9IGN0eC0+cGl0Y2g7CisgICAgaW50IGksIGosIGssIHQ7CisgICAgdWludDhfdCAqZHN0LCAqcHJldjsKKyAgICBpbnQgc2tpcF9ydW4gPSAwOworICAgIGludCBjb21wciA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgtPmdiKTsKKyAgICBpbnQgbXZvZmYgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nYik7CisgICAgaW50IHNlcSAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmN0eC0+Z2IpOworICAgIHVpbnQzMl90IGRlY29kZWRfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZjdHgtPmdiKTsKKyAgICBpbnQgZmxhZ3M7CisKKyAgICBieXRlc3RyZWFtMl9za2lwKCZjdHgtPmdiLCA0KTsKKyAgICBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgtPmdiKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZjdHgtPmdiLCAzKTsKKworICAgIGlmIChkZWNvZGVkX3NpemUgPiBjdHgtPmhlaWdodCAqIHN0cmlkZSAtIGxlZnQgLSB0b3AgKiBzdHJpZGUpIHsKKyAgICAgICAgZGVjb2RlZF9zaXplID0gY3R4LT5oZWlnaHQgKiBzdHJpZGUgLSBsZWZ0IC0gdG9wICogc3RyaWRlOworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJEZWNvZGVkIHNpemUgaXMgdG9vIGxhcmdlLlxuIik7CisgICAgfQorCisgICAgY3R4LT5yb3RhdGVfY29kZSA9IDA7CisKKyAgICBpZiAoKChzZXEgJiAxKSB8fCAhKGZsYWdzICYgMSkpICYmIChjb21wciAmJiBjb21wciAhPSAyKSkKKyAgICAgICAgcm90YXRlX2J1ZnMoY3R4LCAxKTsKKworICAgIGRzdCAgPSAoKHVpbnQ4X3QqKWN0eC0+ZnJtMCkgKyBsZWZ0ICsgdG9wICogc3RyaWRlOworICAgIHByZXYgPSAoKHVpbnQ4X3QqKWN0eC0+ZnJtMikgKyBsZWZ0ICsgdG9wICogc3RyaWRlOworCisgICAgaWYgKG12b2ZmID4gMikgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBtb3Rpb24gYmFzZSB2YWx1ZSAlZC5cbiIsIG12b2ZmKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3dpdGNoIChjb21wcikgeworICAgIGNhc2UgMDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZjdHgtPmdiLCBkc3QsIHdpZHRoKTsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGN0eC0+ZnJtMSwgMCwgY3R4LT5oZWlnaHQgKiBzdHJpZGUpOworICAgICAgICBtZW1zZXQoY3R4LT5mcm0yLCAwLCBjdHgtPmhlaWdodCAqIHN0cmlkZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKHJsZV9kZWNvZGUoY3R4LCBkc3QsIGRlY29kZWRfc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgbWVtc2V0KGN0eC0+ZnJtMSwgMCwgY3R4LT5mcm0xX3NpemUpOworICAgICAgICBtZW1zZXQoY3R4LT5mcm0yLCAwLCBjdHgtPmZybTJfc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICBjYXNlIDQ6CisgICAgICAgIGlmIChmbGFncyAmIDQpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGogKz0gNCkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSA0KSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlOworICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcF9ydW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfcnVuLS07CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X2Jsb2NrNChkc3QgKyBpLCBwcmV2ICsgaSwgc3RyaWRlLCBzdHJpZGUsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSA8IDEpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmY3R4LT5nYik7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4RkY6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2IpIDwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXJ1KCZjdHgtPmdiLCBkc3QgKyBpICsgayAqIHN0cmlkZSwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweEZFOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSA8IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChkc3QgKyBpICsgayAqIHN0cmlkZSwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgtPmdiKSwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweEZEOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSA8IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICB0ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGRzdCArIGkgKyBrICogc3RyaWRlLCB0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXByID09IDQgJiYgIWNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2IpIDwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9ydW4gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmN0eC0+Z2IpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIC09IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteCwgbXk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteCA9IGMzN19tdlsobXZvZmYgKiAyNTUgKyBjb2RlKSAqIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ID0gYzM3X212Wyhtdm9mZiAqIDI1NSArIGNvZGUpICogMiArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjMzdfbXYoZHN0ICsgaSwgcHJldiArIGkgKyBteCArIG15ICogc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5oZWlnaHQsIHN0cmlkZSwgaSArIG14LCBqICsgbXkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdCAgKz0gc3RyaWRlICogNDsKKyAgICAgICAgICAgICAgICBwcmV2ICs9IHN0cmlkZSAqIDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqICs9IDQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29kZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBfcnVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwX3J1bi0tOworICAgICAgICAgICAgICAgICAgICAgICAgY29weV9ibG9jazQoZHN0ICsgaSwgcHJldiArIGksIHN0cmlkZSwgc3RyaWRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nYik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDB4RkYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikgPCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcnUoJmN0eC0+Z2IsIGRzdCArIGkgKyBrICogc3RyaWRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wciA9PSA0ICYmICFjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2IpIDwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfcnVuID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgtPmdiKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpIC09IDQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXgsIG15OworCisgICAgICAgICAgICAgICAgICAgICAgICBteCA9IGMzN19tdlsobXZvZmYgKiAyNTUgKyBjb2RlKSAqIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgbXkgPSBjMzdfbXZbKG12b2ZmICogMjU1ICsgY29kZSkgKiAyICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYzM3X212KGRzdCArIGksIHByZXYgKyBpICsgbXggKyBteSAqIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5oZWlnaHQsIHN0cmlkZSwgaSArIG14LCBqICsgbXkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdCAgKz0gc3RyaWRlICogNDsKKyAgICAgICAgICAgICAgICBwcmV2ICs9IHN0cmlkZSAqIDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoY3R4LT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1YmNvZGVjIDM3IGNvbXByZXNzaW9uICVkIiwgY29tcHIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19ibG9jayhTQU5NVmlkZW9Db250ZXh0ICpjdHgsIHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqcHJldjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHJldjIsIGludCBzdHJpZGUsIGludCB0YmwsIGludCBzaXplKQoreworICAgIGludCBjb2RlLCBrLCB0OworICAgIHVpbnQ4X3QgY29sb3JzWzJdOworICAgIGludDhfdCAqcGdseXBoOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSA8IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmY3R4LT5nYik7CisgICAgaWYgKGNvZGUgPj0gMHhGOCkgeworICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSAweEZGOgorICAgICAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikgPCA0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBkc3RbMF0gICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmN0eC0+Z2IpOworICAgICAgICAgICAgICAgIGRzdFsxXSAgICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmY3R4LT5nYik7CisgICAgICAgICAgICAgICAgZHN0WzAgKyBzdHJpZGVdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgtPmdiKTsKKyAgICAgICAgICAgICAgICBkc3RbMSArIHN0cmlkZV0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmN0eC0+Z2IpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaXplID4+PSAxOworICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzX2Jsb2NrKGN0eCwgZHN0LCBwcmV2MSwgcHJldjIsIHN0cmlkZSwgdGJsLCBzaXplKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NfYmxvY2soY3R4LCBkc3QgKyBzaXplLCBwcmV2MSArIHNpemUsIHByZXYyICsgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHRibCwgc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGRzdCAgICs9IHNpemUgKiBzdHJpZGU7CisgICAgICAgICAgICAgICAgcHJldjEgKz0gc2l6ZSAqIHN0cmlkZTsKKyAgICAgICAgICAgICAgICBwcmV2MiArPSBzaXplICogc3RyaWRlOworICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzX2Jsb2NrKGN0eCwgZHN0LCBwcmV2MSwgcHJldjIsIHN0cmlkZSwgdGJsLCBzaXplKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NfYmxvY2soY3R4LCBkc3QgKyBzaXplLCBwcmV2MSArIHNpemUsIHByZXYyICsgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHRibCwgc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhGRToKKyAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikgPCAxKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICB0ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgtPmdiKTsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzaXplOyBrKyspCisgICAgICAgICAgICAgICAgbWVtc2V0KGRzdCArIGsgKiBzdHJpZGUsIHQsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhGRDoKKyAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikgPCAzKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBjb2RlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgtPmdiKTsKKyAgICAgICAgICAgIHBnbHlwaCA9IChzaXplID09IDgpID8gY3R4LT5wOHg4Z2x5cGhzW2NvZGVdIDogY3R4LT5wNHg0Z2x5cGhzW2NvZGVdOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcnUoJmN0eC0+Z2IsIGNvbG9ycywgMik7CisKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzaXplOyBrKyspCisgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IHNpemU7IHQrKykKKyAgICAgICAgICAgICAgICAgICAgZHN0W3QgKyBrICogc3RyaWRlXSA9IGNvbG9yc1shKnBnbHlwaCsrXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4RkM6CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc2l6ZTsgaysrKQorICAgICAgICAgICAgICAgIG1lbWNweShkc3QgKyBrICogc3RyaWRlLCBwcmV2MSArIGsgKiBzdHJpZGUsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrID0gYnl0ZXN0cmVhbTJfdGVsbCgmY3R4LT5nYik7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZjdHgtPmdiLCB0YmwgKyAoY29kZSAmIDcpLCBTRUVLX1NFVCk7CisgICAgICAgICAgICB0ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmN0eC0+Z2IpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2VlaygmY3R4LT5nYiwgaywgU0VFS19TRVQpOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNpemU7IGsrKykKKyAgICAgICAgICAgICAgICBtZW1zZXQoZHN0ICsgayAqIHN0cmlkZSwgdCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgbXggPSBtb3Rpb25fdmVjdG9yc1tjb2RlXVswXTsKKyAgICAgICAgaW50IG15ID0gbW90aW9uX3ZlY3RvcnNbY29kZV1bMV07CisgICAgICAgIGludCBpbmRleCA9IHByZXYyIC0gKGNvbnN0IHVpbnQ4X3QgKiljdHgtPmZybTI7CisKKyAgICAgICAgYXZfYXNzZXJ0MihpbmRleCA+PSAwICYmIGluZGV4IDwgKGN0eC0+YnVmX3NpemUgPj4gMSkpOworCisgICAgICAgIGlmIChpbmRleCA8IC1teCAtIG15ICogc3RyaWRlIHx8CisgICAgICAgICAgICAoY3R4LT5idWZfc2l6ZSA+PiAxKSAtIGluZGV4IDwgbXggKyBzaXplICsgKG15ICsgc2l6ZSAtIDEpICogc3RyaWRlKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTVYgaXMgaW52YWxpZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc2l6ZTsgaysrKQorICAgICAgICAgICAgbWVtY3B5KGRzdCArIGsgKiBzdHJpZGUsIHByZXYyICsgbXggKyAobXkgKyBrKSAqIHN0cmlkZSwgc2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2xkX2NvZGVjNDcoU0FOTVZpZGVvQ29udGV4dCAqY3R4LCBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIHVpbnQzMl90IGRlY29kZWRfc2l6ZTsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc3RyaWRlICAgICA9IGN0eC0+cGl0Y2g7CisgICAgdWludDhfdCAqZHN0ICAgPSAodWludDhfdCAqKWN0eC0+ZnJtMCArIGxlZnQgKyB0b3AgKiBzdHJpZGU7CisgICAgdWludDhfdCAqcHJldjEgPSAodWludDhfdCAqKWN0eC0+ZnJtMTsKKyAgICB1aW50OF90ICpwcmV2MiA9ICh1aW50OF90ICopY3R4LT5mcm0yOworICAgIGludCB0YmxfcG9zID0gYnl0ZXN0cmVhbTJfdGVsbCgmY3R4LT5nYik7CisgICAgaW50IHNlcSAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmY3R4LT5nYik7CisgICAgaW50IGNvbXByICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nYik7CisgICAgaW50IG5ld19yb3QgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nYik7CisgICAgaW50IHNraXAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmY3R4LT5nYik7CisKKyAgICBieXRlc3RyZWFtMl9za2lwKCZjdHgtPmdiLCA5KTsKKyAgICBkZWNvZGVkX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmY3R4LT5nYik7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmY3R4LT5nYiwgOCk7CisKKyAgICBpZiAoZGVjb2RlZF9zaXplID4gY3R4LT5oZWlnaHQgKiBzdHJpZGUgLSBsZWZ0IC0gdG9wICogc3RyaWRlKSB7CisgICAgICAgIGRlY29kZWRfc2l6ZSA9IGN0eC0+aGVpZ2h0ICogc3RyaWRlIC0gbGVmdCAtIHRvcCAqIHN0cmlkZTsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRGVjb2RlZCBzaXplIGlzIHRvbyBsYXJnZS5cbiIpOworICAgIH0KKworICAgIGlmIChza2lwICYgMSkKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmY3R4LT5nYiwgMHg4MDgwKTsKKyAgICBpZiAoIXNlcSkgeworICAgICAgICBjdHgtPnByZXZfc2VxID0gLTE7CisgICAgICAgIG1lbXNldChwcmV2MSwgMCwgY3R4LT5oZWlnaHQgKiBzdHJpZGUpOworICAgICAgICBtZW1zZXQocHJldjIsIDAsIGN0eC0+aGVpZ2h0ICogc3RyaWRlKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvbXByKSB7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2IpIDwgd2lkdGggKiBoZWlnaHQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVydSgmY3R4LT5nYiwgZHN0LCB3aWR0aCk7CisgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSA8ICgod2lkdGggKyAxKSA+PiAxKSAqICgoaGVpZ2h0ICsgMSkgPj4gMSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaiArPSAyKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgIGRzdFtpXSA9CisgICAgICAgICAgICAgICAgZHN0W2kgKyAxXSA9CisgICAgICAgICAgICAgICAgZHN0W3N0cmlkZSArIGldID0KKyAgICAgICAgICAgICAgICBkc3Rbc3RyaWRlICsgaSArIDFdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgtPmdiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGUgKiAyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKHNlcSA9PSBjdHgtPnByZXZfc2VxICsgMSkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaiArPSA4KSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDgpCisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzX2Jsb2NrKGN0eCwgZHN0ICsgaSwgcHJldjEgKyBpLCBwcmV2MiArIGksIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJsX3BvcyArIDgsIDgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZHN0ICAgKz0gc3RyaWRlICogODsKKyAgICAgICAgICAgICAgICBwcmV2MSArPSBzdHJpZGUgKiA4OworICAgICAgICAgICAgICAgIHByZXYyICs9IHN0cmlkZSAqIDg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBtZW1jcHkoY3R4LT5mcm0wLCBjdHgtPmZybTIsIGN0eC0+cGl0Y2ggKiBjdHgtPmhlaWdodCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgbWVtY3B5KGN0eC0+ZnJtMCwgY3R4LT5mcm0xLCBjdHgtPnBpdGNoICogY3R4LT5oZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIGlmIChybGVfZGVjb2RlKGN0eCwgZHN0LCBkZWNvZGVkX3NpemUpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGN0eC0+YXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJjb2RlYyA0NyBjb21wcmVzc2lvbiAlZCIsIGNvbXByKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAoc2VxID09IGN0eC0+cHJldl9zZXEgKyAxKQorICAgICAgICBjdHgtPnJvdGF0ZV9jb2RlID0gbmV3X3JvdDsKKyAgICBlbHNlCisgICAgICAgIGN0eC0+cm90YXRlX2NvZGUgPSAwOworICAgIGN0eC0+cHJldl9zZXEgPSBzZXE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2ZyYW1lX29iaihTQU5NVmlkZW9Db250ZXh0ICpjdHgpCit7CisgICAgdWludDE2X3QgY29kZWMgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmN0eC0+Z2IpOworICAgIHVpbnQxNl90IGxlZnQgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZjdHgtPmdiKTsKKyAgICB1aW50MTZfdCB0b3AgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmY3R4LT5nYik7CisgICAgdWludDE2X3QgdyAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmN0eC0+Z2IpOworICAgIHVpbnQxNl90IGggICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZjdHgtPmdiKTsKKworICAgIGlmICghdyB8fCAhaCkgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGltZW5zaW9ucyBhcmUgaW52YWxpZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT53aWR0aCA8IGxlZnQgKyB3IHx8IGN0eC0+aGVpZ2h0IDwgdG9wICsgaCkgeworICAgICAgICBpbnQgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoY3R4LT5hdmN0eCwgRkZNQVgobGVmdCArIHcsIGN0eC0+d2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNQVgodG9wICsgaCwgY3R4LT5oZWlnaHQpKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpbml0X3NpemVzKGN0eCwgRkZNQVgobGVmdCArIHcsIGN0eC0+d2lkdGgpLAorICAgICAgICAgICAgICAgICAgIEZGTUFYKHRvcCArIGgsIGN0eC0+aGVpZ2h0KSk7CisgICAgICAgIGlmIChpbml0X2J1ZmZlcnMoY3R4KSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHJlc2l6aW5nIGJ1ZmZlcnMuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmY3R4LT5nYiwgNCk7CisKKyAgICBzd2l0Y2ggKGNvZGVjKSB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuIG9sZF9jb2RlYzEoY3R4LCB0b3AsIGxlZnQsIHcsIGgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM3OgorICAgICAgICByZXR1cm4gb2xkX2NvZGVjMzcoY3R4LCB0b3AsIGxlZnQsIHcsIGgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ3OgorICAgICAgICByZXR1cm4gb2xkX2NvZGVjNDcoY3R4LCB0b3AsIGxlZnQsIHcsIGgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoY3R4LT5hdmN0eCwgIlN1YmNvZGVjICVkIiwgY29kZWMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV8wKFNBTk1WaWRlb0NvbnRleHQgKmN0eCkKK3sKKyAgICB1aW50MTZfdCAqZnJtID0gY3R4LT5mcm0wOworICAgIGludCB4LCB5OworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSA8IGN0eC0+d2lkdGggKiBjdHgtPmhlaWdodCAqIDIpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkluc3VmZmljaWVudCBkYXRhIGZvciByYXcgZnJhbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGZvciAoeSA9IDA7IHkgPCBjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBjdHgtPndpZHRoOyB4KyspCisgICAgICAgICAgICBmcm1beF0gPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmN0eC0+Z2IpOworICAgICAgICBmcm0gKz0gY3R4LT5waXRjaDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25vcChTQU5NVmlkZW9Db250ZXh0ICpjdHgpCit7CisgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGN0eC0+YXZjdHgsICJVbmtub3duL3Vuc3VwcG9ydGVkIGNvbXByZXNzaW9uIHR5cGUiKTsKKyAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfYmxvY2sodWludDE2X3QgKnBkZXN0LCB1aW50MTZfdCAqcHNyYywgaW50IGJsb2NrX3NpemUsIGludCBwaXRjaCkKK3sKKyAgICB1aW50OF90ICpkc3QgPSAodWludDhfdCAqKXBkZXN0OworICAgIHVpbnQ4X3QgKnNyYyA9ICh1aW50OF90ICopcHNyYzsKKyAgICBpbnQgc3RyaWRlID0gcGl0Y2ggKiAyOworCisgICAgc3dpdGNoIChibG9ja19zaXplKSB7CisgICAgY2FzZSAyOgorICAgICAgICBjb3B5X2Jsb2NrNChkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUsIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGNvcHlfYmxvY2s4KGRzdCwgc3JjLCBzdHJpZGUsIHN0cmlkZSwgNCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgY29weV9ibG9jazE2KGRzdCwgc3JjLCBzdHJpZGUsIHN0cmlkZSwgOCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsbF9ibG9jayh1aW50MTZfdCAqcGRlc3QsIHVpbnQxNl90IGNvbG9yLCBpbnQgYmxvY2tfc2l6ZSwgaW50IHBpdGNoKQoreworICAgIGludCB4LCB5OworCisgICAgcGl0Y2ggLT0gYmxvY2tfc2l6ZTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgYmxvY2tfc2l6ZTsgeSsrLCBwZGVzdCArPSBwaXRjaCkKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGJsb2NrX3NpemU7IHgrKykKKyAgICAgICAgICAgICpwZGVzdCsrID0gY29sb3I7Cit9CisKK3N0YXRpYyBpbnQgZHJhd19nbHlwaChTQU5NVmlkZW9Db250ZXh0ICpjdHgsIHVpbnQxNl90ICpkc3QsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmZ19jb2xvciwgdWludDE2X3QgYmdfY29sb3IsIGludCBibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCkKK3sKKyAgICBpbnQ4X3QgKnBnbHlwaDsKKyAgICB1aW50MTZfdCBjb2xvcnNbMl0gPSB7IGZnX2NvbG9yLCBiZ19jb2xvciB9OworICAgIGludCB4LCB5OworCisgICAgaWYgKGluZGV4ID49IE5HTFlQSFMpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIklnbm9yaW5nIG5vbmV4aXN0ZW50IGdseXBoICMldS5cbiIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcGdseXBoID0gYmxvY2tfc2l6ZSA9PSA4ID8gY3R4LT5wOHg4Z2x5cGhzW2luZGV4XSA6IGN0eC0+cDR4NGdseXBoc1tpbmRleF07CisgICAgcGl0Y2ggLT0gYmxvY2tfc2l6ZTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBibG9ja19zaXplOyB5KyssIGRzdCArPSBwaXRjaCkKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGJsb2NrX3NpemU7IHgrKykKKyAgICAgICAgICAgICpkc3QrKyA9IGNvbG9yc1sqcGdseXBoKytdOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wY29kZV8weGY3KFNBTk1WaWRlb0NvbnRleHQgKmN0eCwgaW50IGN4LCBpbnQgY3ksIGludCBibG9ja19zaXplLCBpbnQgcGl0Y2gpCit7CisgICAgdWludDE2X3QgKmRzdCA9IGN0eC0+ZnJtMCArIGN4ICsgY3kgKiBjdHgtPnBpdGNoOworCisgICAgaWYgKGJsb2NrX3NpemUgPT0gMikgeworICAgICAgICB1aW50MzJfdCBpbmRpY2VzOworCisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikgPCA0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaW5kaWNlcyAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMnUoJmN0eC0+Z2IpOworICAgICAgICBkc3RbMF0gICAgICAgICA9IGN0eC0+Y29kZWJvb2tbaW5kaWNlcyAmIDB4RkZdOworICAgICAgICBpbmRpY2VzICAgICAgPj49IDg7CisgICAgICAgIGRzdFsxXSAgICAgICAgID0gY3R4LT5jb2RlYm9va1tpbmRpY2VzICYgMHhGRl07CisgICAgICAgIGluZGljZXMgICAgICA+Pj0gODsKKyAgICAgICAgZHN0W3BpdGNoXSAgICAgPSBjdHgtPmNvZGVib29rW2luZGljZXMgJiAweEZGXTsKKyAgICAgICAgaW5kaWNlcyAgICAgID4+PSA4OworICAgICAgICBkc3RbcGl0Y2ggKyAxXSA9IGN0eC0+Y29kZWJvb2tbaW5kaWNlcyAmIDB4RkZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQxNl90IGZnY29sb3IsIGJnY29sb3I7CisgICAgICAgIGludCBnbHlwaDsKKworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2IpIDwgMykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGdseXBoICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmN0eC0+Z2IpOworICAgICAgICBiZ2NvbG9yID0gY3R4LT5jb2RlYm9va1tieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmN0eC0+Z2IpXTsKKyAgICAgICAgZmdjb2xvciA9IGN0eC0+Y29kZWJvb2tbYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgtPmdiKV07CisKKyAgICAgICAgZHJhd19nbHlwaChjdHgsIGRzdCwgZ2x5cGgsIGZnY29sb3IsIGJnY29sb3IsIGJsb2NrX3NpemUsIHBpdGNoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Bjb2RlXzB4ZjgoU0FOTVZpZGVvQ29udGV4dCAqY3R4LCBpbnQgY3gsIGludCBjeSwgaW50IGJsb2NrX3NpemUsIGludCBwaXRjaCkKK3sKKyAgICB1aW50MTZfdCAqZHN0ID0gY3R4LT5mcm0wICsgY3ggKyBjeSAqIGN0eC0+cGl0Y2g7CisKKyAgICBpZiAoYmxvY2tfc2l6ZSA9PSAyKSB7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikgPCA4KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgZHN0WzBdICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmN0eC0+Z2IpOworICAgICAgICBkc3RbMV0gICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmY3R4LT5nYik7CisgICAgICAgIGRzdFtwaXRjaF0gICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZjdHgtPmdiKTsKKyAgICAgICAgZHN0W3BpdGNoICsgMV0gPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmN0eC0+Z2IpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQxNl90IGZnY29sb3IsIGJnY29sb3I7CisgICAgICAgIGludCBnbHlwaDsKKworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2IpIDwgNSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGdseXBoICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmN0eC0+Z2IpOworICAgICAgICBiZ2NvbG9yID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZjdHgtPmdiKTsKKyAgICAgICAgZmdjb2xvciA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmY3R4LT5nYik7CisKKyAgICAgICAgZHJhd19nbHlwaChjdHgsIGRzdCwgZ2x5cGgsIGZnY29sb3IsIGJnY29sb3IsIGJsb2NrX3NpemUsIHBpdGNoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ29vZF9tdmVjKFNBTk1WaWRlb0NvbnRleHQgKmN0eCwgaW50IGN4LCBpbnQgY3ksIGludCBteCwgaW50IG15LAorICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3NpemUpCit7CisgICAgaW50IHN0YXJ0X3BvcyA9IGN4ICsgbXggKyAoY3kgKyBteSkgKiBjdHgtPnBpdGNoOworICAgIGludCBlbmRfcG9zID0gc3RhcnRfcG9zICsgKGJsb2NrX3NpemUgLSAxKSAqIChjdHgtPnBpdGNoICsgMSk7CisKKyAgICBpbnQgZ29vZCA9IHN0YXJ0X3BvcyA+PSAwICYmIGVuZF9wb3MgPCAoY3R4LT5idWZfc2l6ZSA+PiAxKTsKKworICAgIGlmICghZ29vZCkKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJZ25vcmluZyBpbnZhbGlkIG1vdGlvbiB2ZWN0b3IgKCVpLCAlaSktPigldSwgJXUpLCBibG9jayBzaXplID0gJXVcbiIsCisgICAgICAgICAgICAgICBjeCArIG14LCBjeSArIG15LCBjeCwgY3ksIGJsb2NrX3NpemUpOworCisgICAgcmV0dXJuIGdvb2Q7Cit9CisKK3N0YXRpYyBpbnQgY29kZWMyc3ViYmxvY2soU0FOTVZpZGVvQ29udGV4dCAqY3R4LCBpbnQgY3gsIGludCBjeSwgaW50IGJsa19zaXplKQoreworICAgIGludDE2X3QgbXgsIG15LCBpbmRleDsKKyAgICBpbnQgb3Bjb2RlOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSA8IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgb3Bjb2RlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgtPmdiKTsKKworICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgZGVmYXVsdDoKKyAgICAgICAgbXggPSBtb3Rpb25fdmVjdG9yc1tvcGNvZGVdWzBdOworICAgICAgICBteSA9IG1vdGlvbl92ZWN0b3JzW29wY29kZV1bMV07CisKKyAgICAgICAgaWYgKGdvb2RfbXZlYyhjdHgsIGN4LCBjeSwgbXgsIG15LCBibGtfc2l6ZSkpIHsKKyAgICAgICAgICAgIGNvcHlfYmxvY2soY3R4LT5mcm0wICsgY3ggICAgICArIGN0eC0+cGl0Y2ggKiAgY3ksCisgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZnJtMiArIGN4ICsgbXggKyBjdHgtPnBpdGNoICogKGN5ICsgbXkpLAorICAgICAgICAgICAgICAgICAgICAgICBibGtfc2l6ZSwgY3R4LT5waXRjaCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweEY1OgorICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2IpIDwgMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpbmRleCA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmY3R4LT5nYik7CisKKyAgICAgICAgbXggPSBpbmRleCAlIGN0eC0+d2lkdGg7CisgICAgICAgIG15ID0gaW5kZXggLyBjdHgtPndpZHRoOworCisgICAgICAgIGlmIChnb29kX212ZWMoY3R4LCBjeCwgY3ksIG14LCBteSwgYmxrX3NpemUpKSB7CisgICAgICAgICAgICBjb3B5X2Jsb2NrKGN0eC0+ZnJtMCArIGN4ICAgICAgKyBjdHgtPnBpdGNoICogIGN5LAorICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmZybTIgKyBjeCArIG14ICsgY3R4LT5waXRjaCAqIChjeSArIG15KSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmxrX3NpemUsIGN0eC0+cGl0Y2gpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhGNjoKKyAgICAgICAgY29weV9ibG9jayhjdHgtPmZybTAgKyBjeCArIGN0eC0+cGl0Y2ggKiBjeSwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmZybTEgKyBjeCArIGN0eC0+cGl0Y2ggKiBjeSwKKyAgICAgICAgICAgICAgICAgICBibGtfc2l6ZSwgY3R4LT5waXRjaCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhGNzoKKyAgICAgICAgb3Bjb2RlXzB4ZjcoY3R4LCBjeCwgY3ksIGJsa19zaXplLCBjdHgtPnBpdGNoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4Rjg6CisgICAgICAgIG9wY29kZV8weGY4KGN0eCwgY3gsIGN5LCBibGtfc2l6ZSwgY3R4LT5waXRjaCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhGOToKKyAgICBjYXNlIDB4RkE6CisgICAgY2FzZSAweEZCOgorICAgIGNhc2UgMHhGQzoKKyAgICAgICAgZmlsbF9ibG9jayhjdHgtPmZybTAgKyBjeCArIGN5ICogY3R4LT5waXRjaCwKKyAgICAgICAgICAgICAgICAgICBjdHgtPnNtYWxsX2NvZGVib29rW29wY29kZSAtIDB4ZjldLCBibGtfc2l6ZSwgY3R4LT5waXRjaCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhGRDoKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSA8IDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZmlsbF9ibG9jayhjdHgtPmZybTAgKyBjeCArIGN5ICogY3R4LT5waXRjaCwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmNvZGVib29rW2J5dGVzdHJlYW0yX2dldF9ieXRldSgmY3R4LT5nYildLCBibGtfc2l6ZSwgY3R4LT5waXRjaCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhGRToKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSA8IDIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZmlsbF9ibG9jayhjdHgtPmZybTAgKyBjeCArIGN5ICogY3R4LT5waXRjaCwKKyAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmN0eC0+Z2IpLCBibGtfc2l6ZSwgY3R4LT5waXRjaCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhGRjoKKyAgICAgICAgaWYgKGJsa19zaXplID09IDIpIHsKKyAgICAgICAgICAgIG9wY29kZV8weGY4KGN0eCwgY3gsIGN5LCBibGtfc2l6ZSwgY3R4LT5waXRjaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibGtfc2l6ZSA+Pj0gMTsKKyAgICAgICAgICAgIGlmIChjb2RlYzJzdWJibG9jayhjdHgsIGN4LCBjeSwgYmxrX3NpemUpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaWYgKGNvZGVjMnN1YmJsb2NrKGN0eCwgY3ggKyBibGtfc2l6ZSwgY3ksIGJsa19zaXplKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGlmIChjb2RlYzJzdWJibG9jayhjdHgsIGN4LCBjeSArIGJsa19zaXplLCBibGtfc2l6ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAoY29kZWMyc3ViYmxvY2soY3R4LCBjeCArIGJsa19zaXplLCBjeSArIGJsa19zaXplLCBibGtfc2l6ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV8yKFNBTk1WaWRlb0NvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQgY3gsIGN5LCByZXQ7CisKKyAgICBmb3IgKGN5ID0gMDsgY3kgPCBjdHgtPmFsaWduZWRfaGVpZ2h0OyBjeSArPSA4KQorICAgICAgICBmb3IgKGN4ID0gMDsgY3ggPCBjdHgtPmFsaWduZWRfd2lkdGg7IGN4ICs9IDgpCisgICAgICAgICAgICBpZiAocmV0ID0gY29kZWMyc3ViYmxvY2soY3R4LCBjeCwgY3ksIDgpKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfMyhTQU5NVmlkZW9Db250ZXh0ICpjdHgpCit7CisgICAgbWVtY3B5KGN0eC0+ZnJtMCwgY3R4LT5mcm0yLCBjdHgtPmZybTJfc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlXzQoU0FOTVZpZGVvQ29udGV4dCAqY3R4KQoreworICAgIG1lbWNweShjdHgtPmZybTAsIGN0eC0+ZnJtMSwgY3R4LT5mcm0xX3NpemUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV81KFNBTk1WaWRlb0NvbnRleHQgKmN0eCkKK3sKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIHVpbnQxNl90ICpmcm07CisgICAgaW50IG5waXhlbHM7CisjZW5kaWYKKyAgICB1aW50OF90ICpkc3QgPSAodWludDhfdCopY3R4LT5mcm0wOworCisgICAgaWYgKHJsZV9kZWNvZGUoY3R4LCBkc3QsIGN0eC0+YnVmX3NpemUpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgbnBpeGVscyA9IGN0eC0+bnBpeGVsczsKKyAgICBmcm0gPSBjdHgtPmZybTA7CisgICAgd2hpbGUgKG5waXhlbHMtLSkgeworICAgICAgICAqZnJtID0gYXZfYnN3YXAxNigqZnJtKTsKKyAgICAgICAgZnJtKys7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfNihTQU5NVmlkZW9Db250ZXh0ICpjdHgpCit7CisgICAgaW50IG5waXhlbHMgPSBjdHgtPm5waXhlbHM7CisgICAgdWludDE2X3QgKmZybSA9IGN0eC0+ZnJtMDsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikgPCBucGl4ZWxzKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnN1ZmZpY2llbnQgZGF0YSBmb3IgZnJhbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHdoaWxlIChucGl4ZWxzLS0pCisgICAgICAgICpmcm0rKyA9IGN0eC0+Y29kZWJvb2tbYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgtPmdiKV07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfOChTQU5NVmlkZW9Db250ZXh0ICpjdHgpCit7CisgICAgdWludDE2X3QgKnBkZXN0ID0gY3R4LT5mcm0wOworICAgIHVpbnQ4X3QgKnJzcmM7CisgICAgbG9uZyBucGl4ZWxzID0gY3R4LT5ucGl4ZWxzOworCisgICAgYXZfZmFzdF9tYWxsb2MoJmN0eC0+cmxlX2J1ZiwgJmN0eC0+cmxlX2J1Zl9zaXplLCBucGl4ZWxzKTsKKyAgICBpZiAoIWN0eC0+cmxlX2J1ZikgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUkxFIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICByc3JjID0gY3R4LT5ybGVfYnVmOworCisgICAgaWYgKHJsZV9kZWNvZGUoY3R4LCByc3JjLCBucGl4ZWxzKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB3aGlsZSAobnBpeGVscy0tKQorICAgICAgICAqcGRlc3QrKyA9IGN0eC0+Y29kZWJvb2tbKnJzcmMrK107CisKKyAgICByZXR1cm4gMDsKK30KKwordHlwZWRlZiBpbnQgKCpmcm1fZGVjb2RlcikoU0FOTVZpZGVvQ29udGV4dCAqY3R4KTsKKworc3RhdGljIGNvbnN0IGZybV9kZWNvZGVyIHYxX2RlY29kZXJzW10gPSB7CisgICAgZGVjb2RlXzAsIGRlY29kZV9ub3AsIGRlY29kZV8yLCBkZWNvZGVfMywgZGVjb2RlXzQsIGRlY29kZV81LAorICAgIGRlY29kZV82LCBkZWNvZGVfbm9wLCBkZWNvZGVfOAorfTsKKworc3RhdGljIGludCByZWFkX2ZyYW1lX2hlYWRlcihTQU5NVmlkZW9Db250ZXh0ICpjdHgsIFNBTk1GcmFtZUhlYWRlciAqaGRyKQoreworICAgIGludCBpLCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSkgPCA1NjApIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIklucHV0IGZyYW1lIHRvbyBzaG9ydCAoJWQgYnl0ZXMpLlxuIiwKKyAgICAgICAgICAgICAgIHJldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBieXRlc3RyZWFtMl9za2lwKCZjdHgtPmdiLCA4KTsgLy8gc2tpcCBwYWQKKworICAgIGhkci0+d2lkdGggID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzJ1KCZjdHgtPmdiKTsKKyAgICBoZHItPmhlaWdodCA9IGJ5dGVzdHJlYW0yX2dldF9sZTMydSgmY3R4LT5nYik7CisKKyAgICBpZiAoaGRyLT53aWR0aCAhPSBjdHgtPndpZHRoIHx8IGhkci0+aGVpZ2h0ICE9IGN0eC0+aGVpZ2h0KSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGN0eC0+YXZjdHgsICJWYXJpYWJsZSBzaXplIGZyYW1lcyIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaGRyLT5zZXFfbnVtICAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmY3R4LT5nYik7CisgICAgaGRyLT5jb2RlYyAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmY3R4LT5nYik7CisgICAgaGRyLT5yb3RhdGVfY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmY3R4LT5nYik7CisKKyAgICBieXRlc3RyZWFtMl9za2lwKCZjdHgtPmdiLCA0KTsgLy8gc2tpcCBwYWQKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGN0eC0+c21hbGxfY29kZWJvb2tbaV0gPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmN0eC0+Z2IpOworICAgIGhkci0+YmdfY29sb3IgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmN0eC0+Z2IpOworCisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmY3R4LT5nYiwgMik7IC8vIHNraXAgcGFkCisKKyAgICBoZHItPnJsZV9vdXRwdXRfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMydSgmY3R4LT5nYik7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBjdHgtPmNvZGVib29rW2ldID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZjdHgtPmdiKTsKKworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmN0eC0+Z2IsIDgpOyAvLyBza2lwIHBhZAorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfZnJhbWUodWludDE2X3QgKnBidWYsIGludCBidWZfc2l6ZSwgdWludDE2X3QgY29sb3IpCit7CisgICAgd2hpbGUgKGJ1Zl9zaXplLS0pCisgICAgICAgICpwYnVmKysgPSBjb2xvcjsKK30KKworc3RhdGljIGludCBjb3B5X291dHB1dChTQU5NVmlkZW9Db250ZXh0ICpjdHgsIFNBTk1GcmFtZUhlYWRlciAqaGRyKQoreworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSAodWludDhfdCopIGN0eC0+ZnJtMDsKKyAgICBpbnQgcmV0LCBkc3RwaXRjaCwgaGVpZ2h0ID0gY3R4LT5oZWlnaHQ7CisgICAgaW50IHNyY3BpdGNoID0gY3R4LT5waXRjaCAqIChoZHIgPyBzaXplb2YoY3R4LT5mcm0wWzBdKSA6IDEpOworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGN0eC0+YXZjdHgsIGN0eC0+ZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBkc3QgICAgICA9IGN0eC0+ZnJhbWUtPmRhdGFbMF07CisgICAgZHN0cGl0Y2ggPSBjdHgtPmZyYW1lLT5saW5lc2l6ZVswXTsKKworICAgIHdoaWxlIChoZWlnaHQtLSkgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHNyY3BpdGNoKTsKKyAgICAgICAgc3JjICs9IHNyY3BpdGNoOworICAgICAgICBkc3QgKz0gZHN0cGl0Y2g7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBTQU5NVmlkZW9Db250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCByZXQ7CisKKyAgICBjdHgtPmZyYW1lID0gZGF0YTsKKyAgICBieXRlc3RyZWFtMl9pbml0KCZjdHgtPmdiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisKKyAgICBpZiAoIWN0eC0+dmVyc2lvbikgeworICAgICAgICBpbnQgdG9fc3RvcmUgPSAwOworCisgICAgICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikgPj0gOCkgeworICAgICAgICAgICAgdWludDMyX3Qgc2lnLCBzaXplOworICAgICAgICAgICAgaW50IHBvczsKKworICAgICAgICAgICAgc2lnICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmY3R4LT5nYik7CisgICAgICAgICAgICBzaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZjdHgtPmdiKTsKKyAgICAgICAgICAgIHBvcyAgPSBieXRlc3RyZWFtMl90ZWxsKCZjdHgtPmdiKTsKKworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSA8IHNpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29ycmVjdCBjaHVuayBzaXplICUiUFJJdTMyIi5cbiIsIHNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChzaWcpIHsKKyAgICAgICAgICAgIGNhc2UgTUtCRVRBRygnTicsICdQJywgJ0EnLCAnTCcpOgorICAgICAgICAgICAgICAgIGlmIChzaXplICE9IFBBTEVUVEVfU0laRSAqIDMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IHBhbGV0dGUgYmxvY2sgc2l6ZSAlIlBSSXUzMiIuXG4iLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQQUxFVFRFX1NJWkU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5wYWxbaV0gPSAweEZGVSA8PCAyNCB8IGJ5dGVzdHJlYW0yX2dldF9iZTI0dSgmY3R4LT5nYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1LQkVUQUcoJ0YnLCAnTycsICdCJywgJ0onKToKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDE2KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID0gcHJvY2Vzc19mcmFtZV9vYmooY3R4KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUtCRVRBRygnWCcsICdQJywgJ0EnLCAnTCcpOgorICAgICAgICAgICAgICAgIGlmIChzaXplID09IDYgfHwgc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdG1wWzNdOworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUEFMRVRURV9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdCA9IChjdHgtPnBhbFtpXSA+PiAoMTYgLSBqICogOCkpICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBbal0gPSBhdl9jbGlwX3VpbnQ4KCh0ICogMTI5ICsgY3R4LT5kZWx0YV9wYWxbaSAqIDMgKyBqXSkgPj4gNyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBhbFtpXSA9IDB4RkZVIDw8IDI0IHwgQVZfUkIyNCh0bXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBQQUxFVFRFX0RFTFRBICogMiArIDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvcnJlY3QgcGFsZXR0ZSBjaGFuZ2UgYmxvY2sgc2l6ZSAlIlBSSXUzMiIuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmN0eC0+Z2IsIDQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUEFMRVRURV9ERUxUQTsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5kZWx0YV9wYWxbaV0gPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmN0eC0+Z2IpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSBQQUxFVFRFX0RFTFRBICogNSArIDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQQUxFVFRFX1NJWkU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBhbFtpXSA9IDB4RkZVIDw8IDI0IHwgYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZjdHgtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChjdHgtPnBhbCwgMCwgc2l6ZW9mKGN0eC0+cGFsKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1LQkVUQUcoJ1MnLCAnVCcsICdPJywgJ1InKToKKyAgICAgICAgICAgICAgICB0b19zdG9yZSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1LQkVUQUcoJ0YnLCAnVCcsICdDJywgJ0gnKToKKyAgICAgICAgICAgICAgICBtZW1jcHkoY3R4LT5mcm0wLCBjdHgtPnN0b3JlZF9mcmFtZSwgY3R4LT5idWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmN0eC0+Z2IsIHNpemUpOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93bi91bnN1cHBvcnRlZCBjaHVuayAlIlBSSXgzMiIuXG4iLCBzaWcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZjdHgtPmdiLCBwb3MgKyBzaXplLCBTRUVLX1NFVCk7CisgICAgICAgICAgICBpZiAoc2l6ZSAmIDEpCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmY3R4LT5nYiwgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvX3N0b3JlKQorICAgICAgICAgICAgbWVtY3B5KGN0eC0+c3RvcmVkX2ZyYW1lLCBjdHgtPmZybTAsIGN0eC0+YnVmX3NpemUpOworICAgICAgICBpZiAoKHJldCA9IGNvcHlfb3V0cHV0KGN0eCwgTlVMTCkpKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgbWVtY3B5KGN0eC0+ZnJhbWUtPmRhdGFbMV0sIGN0eC0+cGFsLCAxMDI0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBTQU5NRnJhbWVIZWFkZXIgaGVhZGVyOworCisgICAgICAgIGlmICgocmV0ID0gcmVhZF9mcmFtZV9oZWFkZXIoY3R4LCAmaGVhZGVyKSkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGN0eC0+cm90YXRlX2NvZGUgPSBoZWFkZXIucm90YXRlX2NvZGU7CisgICAgICAgIGlmICgoY3R4LT5mcmFtZS0+a2V5X2ZyYW1lID0gIWhlYWRlci5zZXFfbnVtKSkgeworICAgICAgICAgICAgY3R4LT5mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgICAgICBmaWxsX2ZyYW1lKGN0eC0+ZnJtMSwgY3R4LT5ucGl4ZWxzLCBoZWFkZXIuYmdfY29sb3IpOworICAgICAgICAgICAgZmlsbF9mcmFtZShjdHgtPmZybTIsIGN0eC0+bnBpeGVscywgaGVhZGVyLmJnX2NvbG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN0eC0+ZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhlYWRlci5jb2RlYyA8IEZGX0FSUkFZX0VMRU1TKHYxX2RlY29kZXJzKSkgeworICAgICAgICAgICAgaWYgKChyZXQgPSB2MV9kZWNvZGVyc1toZWFkZXIuY29kZWNdKGN0eCkpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJTdWJjb2RlYyAlZDogZXJyb3IgZGVjb2RpbmcgZnJhbWUuXG4iLCBoZWFkZXIuY29kZWMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJTdWJjb2RlYyAlZCIsIGhlYWRlci5jb2RlYyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldCA9IGNvcHlfb3V0cHV0KGN0eCwgJmhlYWRlcikpKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKGN0eC0+cm90YXRlX2NvZGUpCisgICAgICAgIHJvdGF0ZV9idWZzKGN0eCwgY3R4LT5yb3RhdGVfY29kZSk7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gcGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX3Nhbm1fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic2FubSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkx1Y2FzQXJ0cyBTQU5NL1NtdXNoIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NBTk0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNBTk1WaWRlb0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc2JyLmggYi9mZm1wZWcvbGliYXZjb2RlYy9zYnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjhmY2NkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2JyLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBSb2JlcnQgU3dhaW4gKCByb2Igb3BlbmRvdCBjbCApCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgICAgICBBbGV4IENvbnZlcnNlIDxhbGV4LmNvbnZlcnNlQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcworICogQGF1dGhvciBSb2JlcnQgU3dhaW4gKCByb2Igb3BlbmRvdCBjbCApCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NCUl9ICisjZGVmaW5lIEFWQ09ERUNfU0JSX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgImFhY3BzLmgiCisjaW5jbHVkZSAic2JyZHNwLmgiCisKK3R5cGVkZWYgc3RydWN0IEFBQ0NvbnRleHQgQUFDQ29udGV4dDsKKworLyoqCisgKiBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIGhlYWRlciAtIHNwZWN0cnVtIHBhcmFtZXRlcnMgdGhhdCBpbnZva2UgYSByZXNldCBpZiB0aGV5IGRpZmZlciBmcm9tIHRoZSBwcmV2aW91cyBoZWFkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IFNwZWN0cnVtUGFyYW1ldGVycyB7CisgICAgdWludDhfdCBic19zdGFydF9mcmVxOworICAgIHVpbnQ4X3QgYnNfc3RvcF9mcmVxOworICAgIHVpbnQ4X3QgYnNfeG92ZXJfYmFuZDsKKworICAgIC8qKgorICAgICAqIEBuYW1lIFZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggYnNfaGVhZGVyX2V4dHJhXzEKKyAgICAgKiBAeworICAgICAqLworICAgIHVpbnQ4X3QgYnNfZnJlcV9zY2FsZTsKKyAgICB1aW50OF90IGJzX2FsdGVyX3NjYWxlOworICAgIHVpbnQ4X3QgYnNfbm9pc2VfYmFuZHM7CisgICAgLyoqIEB9ICovCit9IFNwZWN0cnVtUGFyYW1ldGVyczsKKworI2RlZmluZSBTQlJfU1lOVEhFU0lTX0JVRl9TSVpFICgoMTI4MC0xMjgpKjIpCisKKy8qKgorICogU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBwZXIgY2hhbm5lbCBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0IFNCUkRhdGEgeworICAgIC8qKgorICAgICAqIEBuYW1lIE1haW4gYml0c3RyZWFtIGRhdGEgdmFyaWFibGVzCisgICAgICogQHsKKyAgICAgKi8KKyAgICB1bnNpZ25lZCAgICAgICAgICAgYnNfZnJhbWVfY2xhc3M7CisgICAgdW5zaWduZWQgICAgICAgICAgIGJzX2FkZF9oYXJtb25pY19mbGFnOworICAgIHVuc2lnbmVkICAgICAgICAgICBic19udW1fZW52OworICAgIHVpbnQ4X3QgICAgICAgICAgICBic19mcmVxX3Jlc1s3XTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgYnNfbnVtX25vaXNlOworICAgIHVpbnQ4X3QgICAgICAgICAgICBic19kZl9lbnZbNV07CisgICAgdWludDhfdCAgICAgICAgICAgIGJzX2RmX25vaXNlWzJdOworICAgIHVpbnQ4X3QgICAgICAgICAgICBic19pbnZmX21vZGVbMl1bNV07CisgICAgdWludDhfdCAgICAgICAgICAgIGJzX2FkZF9oYXJtb25pY1s0OF07CisgICAgdW5zaWduZWQgICAgICAgICAgIGJzX2FtcF9yZXM7CisgICAgLyoqIEB9ICovCisKKyAgICAvKioKKyAgICAgKiBAbmFtZSBTdGF0ZSB2YXJpYWJsZXMKKyAgICAgKiBAeworICAgICAqLworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHN5bnRoZXNpc19maWx0ZXJiYW5rX3NhbXBsZXMpW1NCUl9TWU5USEVTSVNfQlVGX1NJWkVdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGFuYWx5c2lzX2ZpbHRlcmJhbmtfc2FtcGxlcykgWzEzMTJdOworICAgIGludCAgICAgICAgICAgICAgICBzeW50aGVzaXNfZmlsdGVyYmFua19zYW1wbGVzX29mZnNldDsKKyAgICAvLy9sX0FQcmV2IGFuZCBsX0EKKyAgICBpbnQgICAgICAgICAgICAgICAgZV9hWzJdOworICAgIC8vL0NoaXJwIGZhY3RvcnMKKyAgICBmbG9hdCAgICAgICAgICAgICAgYndfYXJyYXlbNV07CisgICAgLy8vUU1GIHZhbHVlcyBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsCisgICAgZmxvYXQgICAgICAgICAgICAgIFdbMl1bMzJdWzMyXVsyXTsKKyAgICAvLy9RTUYgb3V0cHV0IG9mIHRoZSBIRiBhZGp1c3RvcgorICAgIGludCAgICAgICAgICAgICAgICBZcG9zOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIFkpWzJdWzM4XVs2NF1bMl07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBmbG9hdCwgZ190ZW1wKVs0Ml1bNDhdOworICAgIGZsb2F0ICAgICAgICAgICAgICBxX3RlbXBbNDJdWzQ4XTsKKyAgICB1aW50OF90ICAgICAgICAgICAgc19pbmRleG1hcHBlZFs4XVs0OF07CisgICAgLy8vRW52ZWxvcGUgc2NhbGVmYWN0b3JzCisgICAgZmxvYXQgICAgICAgICAgICAgIGVudl9mYWNzWzZdWzQ4XTsKKyAgICAvLy9Ob2lzZSBzY2FsZWZhY3RvcnMKKyAgICBmbG9hdCAgICAgICAgICAgICAgbm9pc2VfZmFjc1szXVs1XTsKKyAgICAvLy9FbnZlbG9wZSB0aW1lIGJvcmRlcnMKKyAgICB1aW50OF90ICAgICAgICAgICAgdF9lbnZbOF07CisgICAgLy8vRW52ZWxvcGUgdGltZSBib3JkZXIgb2YgdGhlIGxhc3QgZW52ZWxvcGUgb2YgdGhlIHByZXZpb3VzIGZyYW1lCisgICAgdWludDhfdCAgICAgICAgICAgIHRfZW52X251bV9lbnZfb2xkOworICAgIC8vL05vaXNlIHRpbWUgYm9yZGVycworICAgIHVpbnQ4X3QgICAgICAgICAgICB0X3FbM107CisgICAgdW5zaWduZWQgICAgICAgICAgIGZfaW5kZXhub2lzZTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgZl9pbmRleHNpbmU7CisgICAgLyoqIEB9ICovCit9IFNCUkRhdGE7CisKK3R5cGVkZWYgc3RydWN0IFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uOworCisvKioKKyAqIGFhY3NiciBmdW5jdGlvbnMgcG9pbnRlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQUFDU0JSQ29udGV4dCB7CisgICAgaW50ICgqc2JyX2xmX2dlbikoQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgWF9sb3dbMzJdWzQwXVsyXSwgY29uc3QgZmxvYXQgV1syXVszMl1bMzJdWzJdLAorICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfaWR4KTsKKyAgICB2b2lkICgqc2JyX2hmX2Fzc2VtYmxlKShmbG9hdCBZMVszOF1bNjRdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IFhfaGlnaFs2NF1bNDBdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsIFNCUkRhdGEgKmNoX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGVfYVsyXSk7CisgICAgaW50ICgqc2JyX3hfZ2VuKShTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyLCBmbG9hdCBYWzJdWzM4XVs2NF0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBZMFszOF1bNjRdWzJdLCBjb25zdCBmbG9hdCBZMVszOF1bNjRdWzJdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgWF9sb3dbMzJdWzQwXVsyXSwgaW50IGNoKTsKKyAgICB2b2lkICgqc2JyX2hmX2ludmVyc2VfZmlsdGVyKShTQlJEU1BDb250ZXh0ICpkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKCphbHBoYTApWzJdLCBmbG9hdCAoKmFscGhhMSlbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgWF9sb3dbMzJdWzQwXVsyXSwgaW50IGswKTsKK30gQUFDU0JSQ29udGV4dDsKKworLyoqCisgKiBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uCisgKi8KK3N0cnVjdCBTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiB7CisgICAgaW50ICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlOworICAgIGludCAgICAgICAgICAgICAgICBzdGFydDsKKyAgICBpbnQgICAgICAgICAgICAgICAgcmVzZXQ7CisgICAgU3BlY3RydW1QYXJhbWV0ZXJzIHNwZWN0cnVtX3BhcmFtczsKKyAgICBpbnQgICAgICAgICAgICAgICAgYnNfYW1wX3Jlc19oZWFkZXI7CisgICAgLyoqCisgICAgICogQG5hbWUgVmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBic19oZWFkZXJfZXh0cmFfMgorICAgICAqIEB7CisgICAgICovCisgICAgdW5zaWduZWQgICAgICAgICAgIGJzX2xpbWl0ZXJfYmFuZHM7CisgICAgdW5zaWduZWQgICAgICAgICAgIGJzX2xpbWl0ZXJfZ2FpbnM7CisgICAgdW5zaWduZWQgICAgICAgICAgIGJzX2ludGVycG9sX2ZyZXE7CisgICAgdW5zaWduZWQgICAgICAgICAgIGJzX3Ntb290aGluZ19tb2RlOworICAgIC8qKiBAfSAqLworICAgIHVuc2lnbmVkICAgICAgICAgICBic19jb3VwbGluZzsKKyAgICB1bnNpZ25lZCAgICAgICAgICAga1s1XTsgLy8vPCBrMCwgazEsIGsyCisgICAgLy8va3gnLCBhbmQga3ggcmVzcGVjdGl2ZWx5LCBreCBpcyB0aGUgZmlyc3QgUU1GIHN1YmJhbmQgd2hlcmUgU0JSIGlzIHVzZWQuCisgICAgLy8va3gnIGlzIGl0cyB2YWx1ZSBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZQorICAgIHVuc2lnbmVkICAgICAgICAgICBreFsyXTsKKyAgICAvLy9NJyBhbmQgTSByZXNwZWN0aXZlbHksIE0gaXMgdGhlIG51bWJlciBvZiBRTUYgc3ViYmFuZHMgdGhhdCB1c2UgU0JSLgorICAgIHVuc2lnbmVkICAgICAgICAgICBtWzJdOworICAgIHVuc2lnbmVkICAgICAgICAgICBreF9hbmRfbV9wdXNoZWQ7CisgICAgLy8vVGhlIG51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMgaW4gZl9tYXN0ZXIKKyAgICB1bnNpZ25lZCAgICAgICAgICAgbl9tYXN0ZXI7CisgICAgU0JSRGF0YSAgICAgICAgICAgIGRhdGFbMl07CisgICAgUFNDb250ZXh0ICAgICAgICAgIHBzOworICAgIC8vL05fTG93IGFuZCBOX0hpZ2ggcmVzcGVjdGl2ZWx5LCB0aGUgbnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kcyBmb3IgbG93IGFuZCBoaWdoIHJlc29sdXRpb24KKyAgICB1bnNpZ25lZCAgICAgICAgICAgblsyXTsKKyAgICAvLy9OdW1iZXIgb2Ygbm9pc2UgZmxvb3IgYmFuZHMKKyAgICB1bnNpZ25lZCAgICAgICAgICAgbl9xOworICAgIC8vL051bWJlciBvZiBsaW1pdGVyIGJhbmRzCisgICAgdW5zaWduZWQgICAgICAgICAgIG5fbGltOworICAgIC8vL1RoZSBtYXN0ZXIgUU1GIGZyZXF1ZW5jeSBncm91cGluZworICAgIHVpbnQxNl90ICAgICAgICAgICBmX21hc3Rlcls0OV07CisgICAgLy8vRnJlcXVlbmN5IGJvcmRlcnMgZm9yIGxvdyByZXNvbHV0aW9uIFNCUgorICAgIHVpbnQxNl90ICAgICAgICAgICBmX3RhYmxlbG93WzI1XTsKKyAgICAvLy9GcmVxdWVuY3kgYm9yZGVycyBmb3IgaGlnaCByZXNvbHV0aW9uIFNCUgorICAgIHVpbnQxNl90ICAgICAgICAgICBmX3RhYmxlaGlnaFs0OV07CisgICAgLy8vRnJlcXVlbmN5IGJvcmRlcnMgZm9yIG5vaXNlIGZsb29ycworICAgIHVpbnQxNl90ICAgICAgICAgICBmX3RhYmxlbm9pc2VbNl07CisgICAgLy8vRnJlcXVlbmN5IGJvcmRlcnMgZm9yIHRoZSBsaW1pdGVyCisgICAgdWludDE2X3QgICAgICAgICAgIGZfdGFibGVsaW1bMzBdOworICAgIHVuc2lnbmVkICAgICAgICAgICBudW1fcGF0Y2hlczsKKyAgICB1aW50OF90ICAgICAgICAgICAgcGF0Y2hfbnVtX3N1YmJhbmRzWzZdOworICAgIHVpbnQ4X3QgICAgICAgICAgICBwYXRjaF9zdGFydF9zdWJiYW5kWzZdOworICAgIC8vL1FNRiBsb3cgZnJlcXVlbmN5IGlucHV0IHRvIHRoZSBIRiBnZW5lcmF0b3IKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBYX2xvdylbMzJdWzQwXVsyXTsKKyAgICAvLy9RTUYgb3V0cHV0IG9mIHRoZSBIRiBnZW5lcmF0b3IKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBYX2hpZ2gpWzY0XVs0MF1bMl07CisgICAgLy8vUU1GIHZhbHVlcyBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBYKVsyXVsyXVszOF1bNjRdOworICAgIC8vL1plcm90aCBjb2VmZmljaWVudCB1c2VkIHRvIGZpbHRlciB0aGUgc3ViYmFuZCBzaWduYWxzCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBmbG9hdCwgYWxwaGEwKVs2NF1bMl07CisgICAgLy8vRmlyc3QgY29lZmZpY2llbnQgdXNlZCB0byBmaWx0ZXIgdGhlIHN1YmJhbmQgc2lnbmFscworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIGFscGhhMSlbNjRdWzJdOworICAgIC8vL0RlcXVhbnRpemVkIGVudmVsb3BlIHNjYWxlZmFjdG9ycywgcmVtYXBwZWQKKyAgICBmbG9hdCAgICAgICAgICAgICAgZV9vcmlnbWFwcGVkWzddWzQ4XTsKKyAgICAvLy9EZXF1YW50aXplZCBub2lzZSBzY2FsZWZhY3RvcnMsIHJlbWFwcGVkCisgICAgZmxvYXQgICAgICAgICAgICAgIHFfbWFwcGVkWzddWzQ4XTsKKyAgICAvLy9TaW51c29pZGFsIHByZXNlbmNlLCByZW1hcHBlZAorICAgIHVpbnQ4X3QgICAgICAgICAgICBzX21hcHBlZFs3XVs0OF07CisgICAgLy8vRXN0aW1hdGVkIGVudmVsb3BlCisgICAgZmxvYXQgICAgICAgICAgICAgIGVfY3Vycls3XVs0OF07CisgICAgLy8vQW1wbGl0dWRlIGFkanVzdGVkIG5vaXNlIHNjYWxlZmFjdG9ycworICAgIGZsb2F0ICAgICAgICAgICAgICBxX21bN11bNDhdOworICAgIC8vL1NpbnVzb2lkYWwgbGV2ZWxzCisgICAgZmxvYXQgICAgICAgICAgICAgIHNfbVs3XVs0OF07CisgICAgZmxvYXQgICAgICAgICAgICAgIGdhaW5bN11bNDhdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHFtZl9maWx0ZXJfc2NyYXRjaClbNV1bNjRdOworICAgIEZGVENvbnRleHQgICAgICAgICBtZGN0X2FuYTsKKyAgICBGRlRDb250ZXh0ICAgICAgICAgbWRjdDsKKyAgICBTQlJEU1BDb250ZXh0ICAgICAgZHNwOworICAgIEFBQ1NCUkNvbnRleHQgICAgICBjOworfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfU0JSX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NicmRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2JyZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmMDUzYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NicmRzcC5jCkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogQUFDIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24gZGVjb2RpbmcgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBSb2JlcnQgU3dhaW4gKCByb2Igb3BlbmRvdCBjbCApCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBBbGV4IENvbnZlcnNlIDxhbGV4LmNvbnZlcnNlQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGZsb2F0LmgiCisjaW5jbHVkZSAic2JyZHNwLmgiCisKK3N0YXRpYyB2b2lkIHNicl9zdW02NHg1X2MoZmxvYXQgKnopCit7CisgICAgaW50IGs7CisgICAgZm9yIChrID0gMDsgayA8IDY0OyBrKyspIHsKKyAgICAgICAgZmxvYXQgZiA9IHpba10gKyB6W2sgKyA2NF0gKyB6W2sgKyAxMjhdICsgeltrICsgMTkyXSArIHpbayArIDI1Nl07CisgICAgICAgIHpba10gPSBmOworICAgIH0KK30KKworc3RhdGljIGZsb2F0IHNicl9zdW1fc3F1YXJlX2MoZmxvYXQgKCp4KVsyXSwgaW50IG4pCit7CisgICAgZmxvYXQgc3VtMCA9IDAuMGYsIHN1bTEgPSAwLjBmOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkgKz0gMikKKyAgICB7CisgICAgICAgIHN1bTAgKz0geFtpICsgMF1bMF0gKiB4W2kgKyAwXVswXTsKKyAgICAgICAgc3VtMSArPSB4W2kgKyAwXVsxXSAqIHhbaSArIDBdWzFdOworICAgICAgICBzdW0wICs9IHhbaSArIDFdWzBdICogeFtpICsgMV1bMF07CisgICAgICAgIHN1bTEgKz0geFtpICsgMV1bMV0gKiB4W2kgKyAxXVsxXTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VtMCArIHN1bTE7Cit9CisKK3N0YXRpYyB2b2lkIHNicl9uZWdfb2RkXzY0X2MoZmxvYXQgKngpCit7CisgICAgdW5pb24gYXZfaW50ZmxvYXQzMiAqeGkgPSAodW5pb24gYXZfaW50ZmxvYXQzMiopIHg7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMTsgaSA8IDY0OyBpICs9IDQpIHsKKyAgICAgICAgeGlbaSArIDBdLmkgXj0gMVUgPDwgMzE7CisgICAgICAgIHhpW2kgKyAyXS5pIF49IDFVIDw8IDMxOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2JyX3FtZl9wcmVfc2h1ZmZsZV9jKGZsb2F0ICp6KQoreworICAgIHVuaW9uIGF2X2ludGZsb2F0MzIgKnppID0gKHVuaW9uIGF2X2ludGZsb2F0MzIqKSB6OworICAgIGludCBrOworICAgIHppWzY0XS5pID0gemlbMF0uaTsKKyAgICB6aVs2NV0uaSA9IHppWzFdLmk7CisgICAgZm9yIChrID0gMTsgayA8IDMxOyBrICs9IDIpIHsKKyAgICAgICAgemlbNjQgKyAyICogayArIDBdLmkgPSB6aVs2NCAtIGtdLmkgXiAoMVUgPDwgMzEpOworICAgICAgICB6aVs2NCArIDIgKiBrICsgMV0uaSA9IHppWyBrICsgMV0uaTsKKyAgICAgICAgemlbNjQgKyAyICogayArIDJdLmkgPSB6aVs2MyAtIGtdLmkgXiAoMVUgPDwgMzEpOworICAgICAgICB6aVs2NCArIDIgKiBrICsgM10uaSA9IHppWyBrICsgMl0uaTsKKyAgICB9CisKKyAgICB6aVs2NCArIDIgKiAzMSArIDBdLmkgPSB6aVs2NCAtIDMxXS5pIF4gKDFVIDw8IDMxKTsKKyAgICB6aVs2NCArIDIgKiAzMSArIDFdLmkgPSB6aVszMSArICAxXS5pOworfQorCitzdGF0aWMgdm9pZCBzYnJfcW1mX3Bvc3Rfc2h1ZmZsZV9jKGZsb2F0IFdbMzJdWzJdLCBjb25zdCBmbG9hdCAqeikKK3sKKyAgICBjb25zdCB1bmlvbiBhdl9pbnRmbG9hdDMyICp6aSA9IChjb25zdCB1bmlvbiBhdl9pbnRmbG9hdDMyKikgejsKKyAgICB1bmlvbiBhdl9pbnRmbG9hdDMyICpXaSAgICAgICA9ICh1bmlvbiBhdl9pbnRmbG9hdDMyKikgVzsKKyAgICBpbnQgazsKKyAgICBmb3IgKGsgPSAwOyBrIDwgMzI7IGsgKz0gMikgeworICAgICAgICBXaVsyICogayArIDBdLmkgPSB6aVs2MyAtIGtdLmkgXiAoMVUgPDwgMzEpOworICAgICAgICBXaVsyICogayArIDFdLmkgPSB6aVsgayArIDBdLmk7CisgICAgICAgIFdpWzIgKiBrICsgMl0uaSA9IHppWzYyIC0ga10uaSBeICgxVSA8PCAzMSk7CisgICAgICAgIFdpWzIgKiBrICsgM10uaSA9IHppWyBrICsgMV0uaTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNicl9xbWZfZGVpbnRfbmVnX2MoZmxvYXQgKnYsIGNvbnN0IGZsb2F0ICpzcmMpCit7CisgICAgY29uc3QgdW5pb24gYXZfaW50ZmxvYXQzMiAqc2kgPSAoY29uc3QgdW5pb24gYXZfaW50ZmxvYXQzMiopc3JjOworICAgIHVuaW9uIGF2X2ludGZsb2F0MzIgKnZpID0gKHVuaW9uIGF2X2ludGZsb2F0MzIqKXY7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgICAgdmlbICAgICBpXS5pID0gc2lbNjMgLSAyICogaSAgICBdLmk7CisgICAgICAgIHZpWzYzIC0gaV0uaSA9IHNpWzYzIC0gMiAqIGkgLSAxXS5pIF4gKDFVIDw8IDMxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNicl9xbWZfZGVpbnRfYmZseV9jKGZsb2F0ICp2LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgdlsgICAgICBpXSA9IHNyYzBbaV0gLSBzcmMxWzYzIC0gaV07CisgICAgICAgIHZbMTI3IC0gaV0gPSBzcmMwW2ldICsgc3JjMVs2MyAtIGldOworICAgIH0KK30KKworCisjaWYgMAorICAgIC8qIFRoaXMgY29kZSBpcyBzbG93ZXIgYmVjYXVzZSBpdCBtdWx0aXBsaWVzIG1lbW9yeSBhY2Nlc3Nlcy4KKyAgICAgKiBJdCBpcyBsZWZ0IGZvciBlZHVjYXRpb25hbCBwdXJwb3NlcyBhbmQgYmVjYXVzZSBpdCBtYXkgb2ZmZXIKKyAgICAgKiBhIGJldHRlciByZWZlcmVuY2UgZm9yIHdyaXRpbmcgYXJjaC1zcGVjaWZpYyBEU1AgZnVuY3Rpb25zLiAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBhdXRvY29ycmVsYXRlKGNvbnN0IGZsb2F0IHhbNDBdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHBoaVszXVsyXVsyXSwgaW50IGxhZykKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCByZWFsX3N1bSA9IDAuMGY7CisgICAgZmxvYXQgaW1hZ19zdW0gPSAwLjBmOworICAgIGlmIChsYWcpIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDM4OyBpKyspIHsKKyAgICAgICAgICAgIHJlYWxfc3VtICs9IHhbaV1bMF0gKiB4W2krbGFnXVswXSArIHhbaV1bMV0gKiB4W2krbGFnXVsxXTsKKyAgICAgICAgICAgIGltYWdfc3VtICs9IHhbaV1bMF0gKiB4W2krbGFnXVsxXSAtIHhbaV1bMV0gKiB4W2krbGFnXVswXTsKKyAgICAgICAgfQorICAgICAgICBwaGlbMi1sYWddWzFdWzBdID0gcmVhbF9zdW0gKyB4WyAwXVswXSAqIHhbbGFnXVswXSArIHhbIDBdWzFdICogeFtsYWddWzFdOworICAgICAgICBwaGlbMi1sYWddWzFdWzFdID0gaW1hZ19zdW0gKyB4WyAwXVswXSAqIHhbbGFnXVsxXSAtIHhbIDBdWzFdICogeFtsYWddWzBdOworICAgICAgICBpZiAobGFnID09IDEpIHsKKyAgICAgICAgICAgIHBoaVswXVswXVswXSA9IHJlYWxfc3VtICsgeFszOF1bMF0gKiB4WzM5XVswXSArIHhbMzhdWzFdICogeFszOV1bMV07CisgICAgICAgICAgICBwaGlbMF1bMF1bMV0gPSBpbWFnX3N1bSArIHhbMzhdWzBdICogeFszOV1bMV0gLSB4WzM4XVsxXSAqIHhbMzldWzBdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDM4OyBpKyspIHsKKyAgICAgICAgICAgIHJlYWxfc3VtICs9IHhbaV1bMF0gKiB4W2ldWzBdICsgeFtpXVsxXSAqIHhbaV1bMV07CisgICAgICAgIH0KKyAgICAgICAgcGhpWzJdWzFdWzBdID0gcmVhbF9zdW0gKyB4WyAwXVswXSAqIHhbIDBdWzBdICsgeFsgMF1bMV0gKiB4WyAwXVsxXTsKKyAgICAgICAgcGhpWzFdWzBdWzBdID0gcmVhbF9zdW0gKyB4WzM4XVswXSAqIHhbMzhdWzBdICsgeFszOF1bMV0gKiB4WzM4XVsxXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNicl9hdXRvY29ycmVsYXRlX2MoY29uc3QgZmxvYXQgeFs0MF1bMl0sIGZsb2F0IHBoaVszXVsyXVsyXSkKK3sKKyAgICBhdXRvY29ycmVsYXRlKHgsIHBoaSwgMCk7CisgICAgYXV0b2NvcnJlbGF0ZSh4LCBwaGksIDEpOworICAgIGF1dG9jb3JyZWxhdGUoeCwgcGhpLCAyKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBzYnJfYXV0b2NvcnJlbGF0ZV9jKGNvbnN0IGZsb2F0IHhbNDBdWzJdLCBmbG9hdCBwaGlbM11bMl1bMl0pCit7CisgICAgZmxvYXQgcmVhbF9zdW0yID0geFswXVswXSAqIHhbMl1bMF0gKyB4WzBdWzFdICogeFsyXVsxXTsKKyAgICBmbG9hdCBpbWFnX3N1bTIgPSB4WzBdWzBdICogeFsyXVsxXSAtIHhbMF1bMV0gKiB4WzJdWzBdOworICAgIGZsb2F0IHJlYWxfc3VtMSA9IDAuMGYsIGltYWdfc3VtMSA9IDAuMGYsIHJlYWxfc3VtMCA9IDAuMGY7CisgICAgaW50ICAgaTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgMzg7IGkrKykgeworICAgICAgICByZWFsX3N1bTAgKz0geFtpXVswXSAqIHhbaSAgICBdWzBdICsgeFtpXVsxXSAqIHhbaSAgICBdWzFdOworICAgICAgICByZWFsX3N1bTEgKz0geFtpXVswXSAqIHhbaSArIDFdWzBdICsgeFtpXVsxXSAqIHhbaSArIDFdWzFdOworICAgICAgICBpbWFnX3N1bTEgKz0geFtpXVswXSAqIHhbaSArIDFdWzFdIC0geFtpXVsxXSAqIHhbaSArIDFdWzBdOworICAgICAgICByZWFsX3N1bTIgKz0geFtpXVswXSAqIHhbaSArIDJdWzBdICsgeFtpXVsxXSAqIHhbaSArIDJdWzFdOworICAgICAgICBpbWFnX3N1bTIgKz0geFtpXVswXSAqIHhbaSArIDJdWzFdIC0geFtpXVsxXSAqIHhbaSArIDJdWzBdOworICAgIH0KKyAgICBwaGlbMiAtIDJdWzFdWzBdID0gcmVhbF9zdW0yOworICAgIHBoaVsyIC0gMl1bMV1bMV0gPSBpbWFnX3N1bTI7CisgICAgcGhpWzIgICAgXVsxXVswXSA9IHJlYWxfc3VtMCArIHhbIDBdWzBdICogeFsgMF1bMF0gKyB4WyAwXVsxXSAqIHhbIDBdWzFdOworICAgIHBoaVsxICAgIF1bMF1bMF0gPSByZWFsX3N1bTAgKyB4WzM4XVswXSAqIHhbMzhdWzBdICsgeFszOF1bMV0gKiB4WzM4XVsxXTsKKyAgICBwaGlbMiAtIDFdWzFdWzBdID0gcmVhbF9zdW0xICsgeFsgMF1bMF0gKiB4WyAxXVswXSArIHhbIDBdWzFdICogeFsgMV1bMV07CisgICAgcGhpWzIgLSAxXVsxXVsxXSA9IGltYWdfc3VtMSArIHhbIDBdWzBdICogeFsgMV1bMV0gLSB4WyAwXVsxXSAqIHhbIDFdWzBdOworICAgIHBoaVswICAgIF1bMF1bMF0gPSByZWFsX3N1bTEgKyB4WzM4XVswXSAqIHhbMzldWzBdICsgeFszOF1bMV0gKiB4WzM5XVsxXTsKKyAgICBwaGlbMCAgICBdWzBdWzFdID0gaW1hZ19zdW0xICsgeFszOF1bMF0gKiB4WzM5XVsxXSAtIHhbMzhdWzFdICogeFszOV1bMF07CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc2JyX2hmX2dlbl9jKGZsb2F0ICgqWF9oaWdoKVsyXSwgY29uc3QgZmxvYXQgKCpYX2xvdylbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgYWxwaGEwWzJdLCBjb25zdCBmbG9hdCBhbHBoYTFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYncsIGludCBzdGFydCwgaW50IGVuZCkKK3sKKyAgICBmbG9hdCBhbHBoYVs0XTsKKyAgICBpbnQgaTsKKworICAgIGFscGhhWzBdID0gYWxwaGExWzBdICogYncgKiBidzsKKyAgICBhbHBoYVsxXSA9IGFscGhhMVsxXSAqIGJ3ICogYnc7CisgICAgYWxwaGFbMl0gPSBhbHBoYTBbMF0gKiBidzsKKyAgICBhbHBoYVszXSA9IGFscGhhMFsxXSAqIGJ3OworCisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworICAgICAgICBYX2hpZ2hbaV1bMF0gPQorICAgICAgICAgICAgWF9sb3dbaSAtIDJdWzBdICogYWxwaGFbMF0gLQorICAgICAgICAgICAgWF9sb3dbaSAtIDJdWzFdICogYWxwaGFbMV0gKworICAgICAgICAgICAgWF9sb3dbaSAtIDFdWzBdICogYWxwaGFbMl0gLQorICAgICAgICAgICAgWF9sb3dbaSAtIDFdWzFdICogYWxwaGFbM10gKworICAgICAgICAgICAgWF9sb3dbaV1bMF07CisgICAgICAgIFhfaGlnaFtpXVsxXSA9CisgICAgICAgICAgICBYX2xvd1tpIC0gMl1bMV0gKiBhbHBoYVswXSArCisgICAgICAgICAgICBYX2xvd1tpIC0gMl1bMF0gKiBhbHBoYVsxXSArCisgICAgICAgICAgICBYX2xvd1tpIC0gMV1bMV0gKiBhbHBoYVsyXSArCisgICAgICAgICAgICBYX2xvd1tpIC0gMV1bMF0gKiBhbHBoYVszXSArCisgICAgICAgICAgICBYX2xvd1tpXVsxXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNicl9oZl9nX2ZpbHRfYyhmbG9hdCAoKlkpWzJdLCBjb25zdCBmbG9hdCAoKlhfaGlnaClbNDBdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpnX2ZpbHQsIGludCBtX21heCwgaW50cHRyX3QgaXhoKQoreworICAgIGludCBtOworCisgICAgZm9yIChtID0gMDsgbSA8IG1fbWF4OyBtKyspIHsKKyAgICAgICAgWVttXVswXSA9IFhfaGlnaFttXVtpeGhdWzBdICogZ19maWx0W21dOworICAgICAgICBZW21dWzFdID0gWF9oaWdoW21dW2l4aF1bMV0gKiBnX2ZpbHRbbV07CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHNicl9oZl9hcHBseV9ub2lzZShmbG9hdCAoKlkpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpxX2ZpbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBwaGlfc2lnbjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBwaGlfc2lnbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbV9tYXgpCit7CisgICAgaW50IG07CisKKyAgICBmb3IgKG0gPSAwOyBtIDwgbV9tYXg7IG0rKykgeworICAgICAgICBmbG9hdCB5MCA9IFlbbV1bMF07CisgICAgICAgIGZsb2F0IHkxID0gWVttXVsxXTsKKyAgICAgICAgbm9pc2UgPSAobm9pc2UgKyAxKSAmIDB4MWZmOworICAgICAgICBpZiAoc19tW21dKSB7CisgICAgICAgICAgICB5MCArPSBzX21bbV0gKiBwaGlfc2lnbjA7CisgICAgICAgICAgICB5MSArPSBzX21bbV0gKiBwaGlfc2lnbjE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB5MCArPSBxX2ZpbHRbbV0gKiBmZl9zYnJfbm9pc2VfdGFibGVbbm9pc2VdWzBdOworICAgICAgICAgICAgeTEgKz0gcV9maWx0W21dICogZmZfc2JyX25vaXNlX3RhYmxlW25vaXNlXVsxXTsKKyAgICAgICAgfQorICAgICAgICBZW21dWzBdID0geTA7CisgICAgICAgIFlbbV1bMV0gPSB5MTsKKyAgICAgICAgcGhpX3NpZ24xID0gLXBoaV9zaWduMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNicl9oZl9hcHBseV9ub2lzZV8wKGZsb2F0ICgqWSlbMl0sIGNvbnN0IGZsb2F0ICpzX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqcV9maWx0LCBpbnQgbm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga3gsIGludCBtX21heCkKK3sKKyAgICBzYnJfaGZfYXBwbHlfbm9pc2UoWSwgc19tLCBxX2ZpbHQsIG5vaXNlLCAxLjAsIDAuMCwgbV9tYXgpOworfQorCitzdGF0aWMgdm9pZCBzYnJfaGZfYXBwbHlfbm9pc2VfMShmbG9hdCAoKlkpWzJdLCBjb25zdCBmbG9hdCAqc19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdCwgaW50IG5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGt4LCBpbnQgbV9tYXgpCit7CisgICAgZmxvYXQgcGhpX3NpZ24gPSAxIC0gMiAqIChreCAmIDEpOworICAgIHNicl9oZl9hcHBseV9ub2lzZShZLCBzX20sIHFfZmlsdCwgbm9pc2UsIDAuMCwgcGhpX3NpZ24sIG1fbWF4KTsKK30KKworc3RhdGljIHZvaWQgc2JyX2hmX2FwcGx5X25vaXNlXzIoZmxvYXQgKCpZKVsyXSwgY29uc3QgZmxvYXQgKnNfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpxX2ZpbHQsIGludCBub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBreCwgaW50IG1fbWF4KQoreworICAgIHNicl9oZl9hcHBseV9ub2lzZShZLCBzX20sIHFfZmlsdCwgbm9pc2UsIC0xLjAsIDAuMCwgbV9tYXgpOworfQorCitzdGF0aWMgdm9pZCBzYnJfaGZfYXBwbHlfbm9pc2VfMyhmbG9hdCAoKlkpWzJdLCBjb25zdCBmbG9hdCAqc19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdCwgaW50IG5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGt4LCBpbnQgbV9tYXgpCit7CisgICAgZmxvYXQgcGhpX3NpZ24gPSAxIC0gMiAqIChreCAmIDEpOworICAgIHNicl9oZl9hcHBseV9ub2lzZShZLCBzX20sIHFfZmlsdCwgbm9pc2UsIDAuMCwgLXBoaV9zaWduLCBtX21heCk7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9zYnJkc3BfaW5pdChTQlJEU1BDb250ZXh0ICpzKQoreworICAgIHMtPnN1bTY0eDUgPSBzYnJfc3VtNjR4NV9jOworICAgIHMtPnN1bV9zcXVhcmUgPSBzYnJfc3VtX3NxdWFyZV9jOworICAgIHMtPm5lZ19vZGRfNjQgPSBzYnJfbmVnX29kZF82NF9jOworICAgIHMtPnFtZl9wcmVfc2h1ZmZsZSA9IHNicl9xbWZfcHJlX3NodWZmbGVfYzsKKyAgICBzLT5xbWZfcG9zdF9zaHVmZmxlID0gc2JyX3FtZl9wb3N0X3NodWZmbGVfYzsKKyAgICBzLT5xbWZfZGVpbnRfbmVnID0gc2JyX3FtZl9kZWludF9uZWdfYzsKKyAgICBzLT5xbWZfZGVpbnRfYmZseSA9IHNicl9xbWZfZGVpbnRfYmZseV9jOworICAgIHMtPmF1dG9jb3JyZWxhdGUgPSBzYnJfYXV0b2NvcnJlbGF0ZV9jOworICAgIHMtPmhmX2dlbiA9IHNicl9oZl9nZW5fYzsKKyAgICBzLT5oZl9nX2ZpbHQgPSBzYnJfaGZfZ19maWx0X2M7CisKKyAgICBzLT5oZl9hcHBseV9ub2lzZVswXSA9IHNicl9oZl9hcHBseV9ub2lzZV8wOworICAgIHMtPmhmX2FwcGx5X25vaXNlWzFdID0gc2JyX2hmX2FwcGx5X25vaXNlXzE7CisgICAgcy0+aGZfYXBwbHlfbm9pc2VbMl0gPSBzYnJfaGZfYXBwbHlfbm9pc2VfMjsKKyAgICBzLT5oZl9hcHBseV9ub2lzZVszXSA9IHNicl9oZl9hcHBseV9ub2lzZV8zOworCisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl9zYnJkc3BfaW5pdF9hcm0ocyk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9zYnJkc3BfaW5pdF94ODYocyk7CisgICAgaWYgKEFSQ0hfTUlQUykKKyAgICAgICAgZmZfc2JyZHNwX2luaXRfbWlwcyhzKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NicmRzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2JyZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxYmNkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NicmRzcC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFucyBSdWxsZ2FyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfU0JSRFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19TQlJEU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IFNCUkRTUENvbnRleHQgeworICAgIHZvaWQgKCpzdW02NHg1KShmbG9hdCAqeik7CisgICAgZmxvYXQgKCpzdW1fc3F1YXJlKShmbG9hdCAoKngpWzJdLCBpbnQgbik7CisgICAgdm9pZCAoKm5lZ19vZGRfNjQpKGZsb2F0ICp4KTsKKyAgICB2b2lkICgqcW1mX3ByZV9zaHVmZmxlKShmbG9hdCAqeik7CisgICAgdm9pZCAoKnFtZl9wb3N0X3NodWZmbGUpKGZsb2F0IFdbMzJdWzJdLCBjb25zdCBmbG9hdCAqeik7CisgICAgdm9pZCAoKnFtZl9kZWludF9uZWcpKGZsb2F0ICp2LCBjb25zdCBmbG9hdCAqc3JjKTsKKyAgICB2b2lkICgqcW1mX2RlaW50X2JmbHkpKGZsb2F0ICp2LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEpOworICAgIHZvaWQgKCphdXRvY29ycmVsYXRlKShjb25zdCBmbG9hdCB4WzQwXVsyXSwgZmxvYXQgcGhpWzNdWzJdWzJdKTsKKyAgICB2b2lkICgqaGZfZ2VuKShmbG9hdCAoKlhfaGlnaClbMl0sIGNvbnN0IGZsb2F0ICgqWF9sb3cpWzJdLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGFscGhhMFsyXSwgY29uc3QgZmxvYXQgYWxwaGExWzJdLAorICAgICAgICAgICAgICAgICAgIGZsb2F0IGJ3LCBpbnQgc3RhcnQsIGludCBlbmQpOworICAgIHZvaWQgKCpoZl9nX2ZpbHQpKGZsb2F0ICgqWSlbMl0sIGNvbnN0IGZsb2F0ICgqWF9oaWdoKVs0MF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmdfZmlsdCwgaW50IG1fbWF4LCBpbnRwdHJfdCBpeGgpOworICAgIHZvaWQgKCpoZl9hcHBseV9ub2lzZVs0XSkoZmxvYXQgKCpZKVsyXSwgY29uc3QgZmxvYXQgKnNfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpxX2ZpbHQsIGludCBub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBreCwgaW50IG1fbWF4KTsKK30gU0JSRFNQQ29udGV4dDsKKworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX3Nicl9ub2lzZV90YWJsZVtdWzJdOworCit2b2lkIGZmX3NicmRzcF9pbml0KFNCUkRTUENvbnRleHQgKnMpOwordm9pZCBmZl9zYnJkc3BfaW5pdF9hcm0oU0JSRFNQQ29udGV4dCAqcyk7Cit2b2lkIGZmX3NicmRzcF9pbml0X3g4NihTQlJEU1BDb250ZXh0ICpzKTsKK3ZvaWQgZmZfc2JyZHNwX2luaXRfbWlwcyhTQlJEU1BDb250ZXh0ICpzKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfU0JSRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NnaS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2dpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjODkxZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NnaS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBTR0kgaW1hZ2UgZW5jb2RlcgorICogWGlhb2h1aSBTdW4gPHRqbmtzeGhAaG90bWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19TR0lfSAorI2RlZmluZSBBVkNPREVDX1NHSV9ICisKKy8qKgorICogU0dJIGltYWdlIGZpbGUgc2lnbmF0dXJlCisgKi8KKyNkZWZpbmUgU0dJX01BR0lDIDQ3NAorCisjZGVmaW5lIFNHSV9IRUFERVJfU0laRSA1MTIKKworI2RlZmluZSBTR0lfR1JBWVNDQUxFIDEKKyNkZWZpbmUgU0dJX1JHQiAzCisjZGVmaW5lIFNHSV9SR0JBIDQKKworI2VuZGlmIC8qIEFWQ09ERUNfU0dJX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NnaWRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2dpZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkYmY3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NnaWRlYy5jCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogU0dJIGltYWdlIGRlY29kZXIKKyAqIFRvZGQgS2lyYnkgPGRvdWJsZXNob3RAcGFjYmVsbC5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic2dpLmgiCisKK3R5cGVkZWYgc3RydWN0IFNnaVN0YXRlIHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgdW5zaWduZWQgaW50IHdpZHRoOworICAgIHVuc2lnbmVkIGludCBoZWlnaHQ7CisgICAgdW5zaWduZWQgaW50IGRlcHRoOworICAgIHVuc2lnbmVkIGludCBieXRlc19wZXJfY2hhbm5lbDsKKyAgICBpbnQgbGluZXNpemU7CisgICAgR2V0Qnl0ZUNvbnRleHQgZzsKK30gU2dpU3RhdGU7CisKKy8qKgorICogRXhwYW5kIGFuIFJMRSByb3cgaW50byBhIGNoYW5uZWwuCisgKiBAcGFyYW0gcyB0aGUgY3VycmVudCBpbWFnZSBzdGF0ZQorICogQHBhcmFtIG91dF9idWYgUG9pbnRzIHRvIG9uZSBsaW5lIGFmdGVyIHRoZSBvdXRwdXQgYnVmZmVyLgorICogQHBhcmFtIGxlbiBsZW5ndGggb2Ygb3V0X2J1ZiBpbiBieXRlcworICogQHBhcmFtIHBpeGVsc3RyaWRlIHBpeGVsIHN0cmlkZSBvZiBpbnB1dCBidWZmZXIKKyAqIEByZXR1cm4gc2l6ZSBvZiBvdXRwdXQgaW4gYnl0ZXMsIGVsc2UgcmV0dXJuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgZXhwYW5kX3JsZV9yb3c4KFNnaVN0YXRlICpzLCB1aW50OF90ICpvdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHBpeGVsc3RyaWRlKQoreworICAgIHVuc2lnbmVkIGNoYXIgcGl4ZWwsIGNvdW50OworICAgIHVuc2lnbmVkIGNoYXIgKm9yaWcgPSBvdXRfYnVmOworICAgIHVpbnQ4X3QgKm91dF9lbmQgPSBvdXRfYnVmICsgbGVuOworCisgICAgd2hpbGUgKG91dF9idWYgPCBvdXRfZW5kKSB7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPCAxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHBpeGVsID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKTsKKyAgICAgICAgaWYgKCEoY291bnQgPSAocGl4ZWwgJiAweDdmKSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvdy4gKi8KKyAgICAgICAgaWYgKG91dF9lbmQgLSBvdXRfYnVmIDw9IHBpeGVsc3RyaWRlICogKGNvdW50IC0gMSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwaXhlbCBjb3VudC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGl4ZWwgJiAweDgwKSB7CisgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICAgICAgICAgICpvdXRfYnVmID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpOworICAgICAgICAgICAgICAgIG91dF9idWYgKz0gcGl4ZWxzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwaXhlbCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKTsKKworICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICAgICAgICAqb3V0X2J1ZiA9IHBpeGVsOworICAgICAgICAgICAgICAgIG91dF9idWYgKz0gcGl4ZWxzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChvdXRfYnVmIC0gb3JpZykgLyBwaXhlbHN0cmlkZTsKK30KKworc3RhdGljIGludCBleHBhbmRfcmxlX3JvdzE2KFNnaVN0YXRlICpzLCB1aW50MTZfdCAqb3V0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgcGl4ZWxzdHJpZGUpCit7CisgICAgdW5zaWduZWQgc2hvcnQgcGl4ZWw7CisgICAgdW5zaWduZWQgY2hhciBjb3VudDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqb3JpZyA9IG91dF9idWY7CisgICAgdWludDE2X3QgKm91dF9lbmQgPSBvdXRfYnVmICsgbGVuOworCisgICAgd2hpbGUgKG91dF9idWYgPCBvdXRfZW5kKSB7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPCAyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHBpeGVsID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZzLT5nKTsKKyAgICAgICAgaWYgKCEoY291bnQgPSAocGl4ZWwgJiAweDdmKSkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBDaGVjayBmb3IgYnVmZmVyIG92ZXJmbG93LiAqLworICAgICAgICBpZiAob3V0X2VuZCAtIG91dF9idWYgPD0gcGl4ZWxzdHJpZGUgKiAoY291bnQgLSAxKSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBpeGVsIGNvdW50LlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwaXhlbCAmIDB4ODApIHsKKyAgICAgICAgICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBieXRlc3RyZWFtMl9nZXRfbmUxNigmcy0+Zyk7CisgICAgICAgICAgICAgICAgQVZfV04xNkEob3V0X2J1ZiwgcGl4ZWwpOworICAgICAgICAgICAgICAgIG91dF9idWYgKz0gcGl4ZWxzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwaXhlbCA9IGJ5dGVzdHJlYW0yX2dldF9uZTE2KCZzLT5nKTsKKworICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICAgICAgICBBVl9XTjE2QShvdXRfYnVmLCBwaXhlbCk7CisgICAgICAgICAgICAgICAgb3V0X2J1ZiArPSBwaXhlbHN0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKG91dF9idWYgLSBvcmlnKSAvIHBpeGVsc3RyaWRlOworfQorCisKKy8qKgorICogUmVhZCBhIHJ1biBsZW5ndGggZW5jb2RlZCBTR0kgaW1hZ2UuCisgKiBAcGFyYW0gb3V0X2J1ZiBvdXRwdXQgYnVmZmVyCisgKiBAcGFyYW0gcyB0aGUgY3VycmVudCBpbWFnZSBzdGF0ZQorICogQHJldHVybiAwIGlmIG5vIGVycm9yLCBlbHNlIHJldHVybiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHJlYWRfcmxlX3NnaSh1aW50OF90ICpvdXRfYnVmLCBTZ2lTdGF0ZSAqcykKK3sKKyAgICB1aW50OF90ICpkZXN0X3JvdzsKKyAgICB1bnNpZ25lZCBpbnQgbGVuID0gcy0+aGVpZ2h0ICogcy0+ZGVwdGggKiA0OworICAgIEdldEJ5dGVDb250ZXh0IGdfdGFibGUgPSBzLT5nOworICAgIHVuc2lnbmVkIGludCB5LCB6OworICAgIHVuc2lnbmVkIGludCBzdGFydF9vZmZzZXQ7CisgICAgaW50IGxpbmVzaXplLCByZXQ7CisKKyAgICAvKiBzaXplIG9mICBSTEUgb2Zmc2V0IGFuZCBsZW5ndGggdGFibGVzICovCisgICAgaWYgKGxlbiAqIDIgPiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZm9yICh6ID0gMDsgeiA8IHMtPmRlcHRoOyB6KyspIHsKKyAgICAgICAgZGVzdF9yb3cgPSBvdXRfYnVmOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGxpbmVzaXplID0gcy0+d2lkdGggKiBzLT5kZXB0aDsKKyAgICAgICAgICAgIGRlc3Rfcm93IC09IHMtPmxpbmVzaXplOworICAgICAgICAgICAgc3RhcnRfb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdfdGFibGUpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2Vlaygmcy0+Zywgc3RhcnRfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICBpZiAocy0+Ynl0ZXNfcGVyX2NoYW5uZWwgPT0gMSkKKyAgICAgICAgICAgICAgICByZXQgPSBleHBhbmRfcmxlX3JvdzgocywgZGVzdF9yb3cgKyB6LCBsaW5lc2l6ZSwgcy0+ZGVwdGgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IGV4cGFuZF9ybGVfcm93MTYocywgKHVpbnQxNl90ICopZGVzdF9yb3cgKyB6LCBsaW5lc2l6ZSwgcy0+ZGVwdGgpOworICAgICAgICAgICAgaWYgKHJldCAhPSBzLT53aWR0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWFkIGFuIHVuY29tcHJlc3NlZCBTR0kgaW1hZ2UuCisgKiBAcGFyYW0gb3V0X2J1ZiBvdXRwdXQgYnVmZmVyCisgKiBAcGFyYW0gcyB0aGUgY3VycmVudCBpbWFnZSBzdGF0ZQorICogQHJldHVybiAwIGlmIHJlYWQgc3VjY2VzcywgZWxzZSByZXR1cm4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCByZWFkX3VuY29tcHJlc3NlZF9zZ2kodW5zaWduZWQgY2hhciAqb3V0X2J1ZiwgU2dpU3RhdGUgKnMpCit7CisgICAgaW50IHgsIHksIHo7CisgICAgdW5zaWduZWQgaW50IG9mZnNldCA9IHMtPmhlaWdodCAqIHMtPndpZHRoICogcy0+Ynl0ZXNfcGVyX2NoYW5uZWw7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ3BbNF07CisgICAgdWludDhfdCAqb3V0X2VuZDsKKworICAgIC8qIFRlc3QgYnVmZmVyIHNpemUuICovCisgICAgaWYgKG9mZnNldCAqIHMtPmRlcHRoID4gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIENyZWF0ZSBhIHJlYWRlciBmb3IgZWFjaCBwbGFuZSAqLworICAgIGZvciAoeiA9IDA7IHogPCBzLT5kZXB0aDsgeisrKSB7CisgICAgICAgIGdwW3pdID0gcy0+ZzsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ3Bbel0sIHogKiBvZmZzZXQpOworICAgIH0KKworICAgIGZvciAoeSA9IHMtPmhlaWdodCAtIDE7IHkgPj0gMDsgeS0tKSB7CisgICAgICAgIG91dF9lbmQgPSBvdXRfYnVmICsgKHkgKiBzLT5saW5lc2l6ZSk7CisgICAgICAgIGlmIChzLT5ieXRlc19wZXJfY2hhbm5lbCA9PSAxKSB7CisgICAgICAgICAgICBmb3IgKHggPSBzLT53aWR0aDsgeCA+IDA7IHgtLSkKKyAgICAgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgcy0+ZGVwdGg7IHorKykKKyAgICAgICAgICAgICAgICAgICAgKm91dF9lbmQrKyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ3Bbel0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDE2X3QgKm91dDE2ID0gKHVpbnQxNl90ICopb3V0X2VuZDsKKyAgICAgICAgICAgIGZvciAoeCA9IHMtPndpZHRoOyB4ID4gMDsgeC0tKQorICAgICAgICAgICAgICAgIGZvciAoeiA9IDA7IHogPCBzLT5kZXB0aDsgeisrKQorICAgICAgICAgICAgICAgICAgICAqb3V0MTYrKyA9IGJ5dGVzdHJlYW0yX2dldF9uZTE2dSgmZ3Bbel0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBTZ2lTdGF0ZSAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqcCA9IGRhdGE7CisgICAgdW5zaWduZWQgaW50IGRpbWVuc2lvbiwgcmxlOworICAgIGludCByZXQgPSAwOworICAgIHVpbnQ4X3QgKm91dF9idWYsICpvdXRfZW5kOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+ZywgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpIDwgU0dJX0hFQURFUl9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYnVmX3NpemUgdG9vIHNtYWxsICglZClcbiIsIGF2cGt0LT5zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogVGVzdCBmb3IgU0dJIG1hZ2ljLiAqLworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYmUxNnUoJnMtPmcpICE9IFNHSV9NQUdJQykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJhZCBtYWdpYyBudW1iZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBybGUgICAgICAgICAgICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Zyk7CisgICAgcy0+Ynl0ZXNfcGVyX2NoYW5uZWwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmcpOworICAgIGRpbWVuc2lvbiAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZzLT5nKTsKKyAgICBzLT53aWR0aCAgICAgICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmcy0+Zyk7CisgICAgcy0+aGVpZ2h0ICAgICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJnMtPmcpOworICAgIHMtPmRlcHRoICAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZzLT5nKTsKKworICAgIGlmIChzLT5ieXRlc19wZXJfY2hhbm5lbCAhPSAxICYmIHMtPmJ5dGVzX3Blcl9jaGFubmVsICE9IDIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3cm9uZyBjaGFubmVsIG51bWJlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciBzdXBwb3J0ZWQgaW1hZ2UgZGltZW5zaW9ucy4gKi8KKyAgICBpZiAoZGltZW5zaW9uICE9IDIgJiYgZGltZW5zaW9uICE9IDMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3cm9uZyBkaW1lbnNpb24gbnVtYmVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHMtPmRlcHRoID09IFNHSV9HUkFZU0NBTEUpIHsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBzLT5ieXRlc19wZXJfY2hhbm5lbCA9PSAyID8gQVZfUElYX0ZNVF9HUkFZMTZCRSA6IEFWX1BJWF9GTVRfR1JBWTg7CisgICAgfSBlbHNlIGlmIChzLT5kZXB0aCA9PSBTR0lfUkdCKSB7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gcy0+Ynl0ZXNfcGVyX2NoYW5uZWwgPT0gMiA/IEFWX1BJWF9GTVRfUkdCNDhCRSA6IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgfSBlbHNlIGlmIChzLT5kZXB0aCA9PSBTR0lfUkdCQSkgeworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IHMtPmJ5dGVzX3Blcl9jaGFubmVsID09IDIgPyBBVl9QSVhfRk1UX1JHQkE2NEJFIDogQVZfUElYX0ZNVF9SR0JBOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAid3JvbmcgcGljdHVyZSBmb3JtYXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgcy0+d2lkdGgsIHMtPmhlaWdodCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHAsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwLT5rZXlfZnJhbWUgPSAxOworICAgIG91dF9idWYgPSBwLT5kYXRhWzBdOworCisgICAgb3V0X2VuZCA9IG91dF9idWYgKyBwLT5saW5lc2l6ZVswXSAqIHMtPmhlaWdodDsKKworICAgIHMtPmxpbmVzaXplID0gcC0+bGluZXNpemVbMF07CisKKyAgICAvKiBTa2lwIGhlYWRlci4gKi8KKyAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nLCBTR0lfSEVBREVSX1NJWkUsIFNFRUtfU0VUKTsKKyAgICBpZiAocmxlKSB7CisgICAgICAgIHJldCA9IHJlYWRfcmxlX3NnaShvdXRfZW5kLCBzKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSByZWFkX3VuY29tcHJlc3NlZF9zZ2kob3V0X2J1Ziwgcyk7CisgICAgfQorICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBzZ2lfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNnaVN0YXRlICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9zZ2lfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic2dpIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU0dJIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NHSSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU2dpU3RhdGUpLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBzZ2lfZGVjb2RlX2luaXQsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zZ2llbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NnaWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDI2YWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zZ2llbmMuYwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIFNHSSBpbWFnZSBlbmNvZGVyCisgKiBUb2RkIEtpcmJ5IDxkb3VibGVzaG90QHBhY2JlbGwubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInNnaS5oIgorI2luY2x1ZGUgInJsZS5oIgorCisjZGVmaW5lIFNHSV9TSU5HTEVfQ0hBTiAyCisjZGVmaW5lIFNHSV9NVUxUSV9DSEFOIDMKKworc3RhdGljIGF2X2NvbGQgaW50IGVuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpZiAoYXZjdHgtPndpZHRoID4gNjU1MzUgfHwgYXZjdHgtPmhlaWdodCA+IDY1NTM1KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHJlc29sdXRpb24gJWR4JWQuXG4iLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNHSSBkb2VzIG5vdCBzdXBwb3J0IHJlc29sdXRpb25zIGFib3ZlIDY1NTM1eDY1NTM1XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWF2Y3R4LT5jb2RlZF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIGNvbnN0IEFWRnJhbWUgKiBjb25zdCBwID0gZnJhbWU7CisgICAgdWludDhfdCAqb2Zmc2V0dGFiLCAqbGVuZ3RodGFiLCAqaW5fYnVmLCAqZW5jb2RlX2J1ZiwgKmJ1ZjsKKyAgICBpbnQgeCwgeSwgeiwgbGVuZ3RoLCB0YWJsZXNpemUsIHJldDsKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGRpbWVuc2lvbjsKKyAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfcGVyX2NoYW5uZWwsIHBpeG1heCwgcHV0X2JlOworICAgIHVuc2lnbmVkIGNoYXIgKmVuZF9idWY7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKworICAgIHdpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICBoZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworICAgIGJ5dGVzX3Blcl9jaGFubmVsID0gMTsKKyAgICBwaXhtYXggPSAweEZGOworICAgIHB1dF9iZSA9IEhBVkVfQklHRU5ESUFOOworCisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICAgICAgZGltZW5zaW9uID0gU0dJX1NJTkdMRV9DSEFOOworICAgICAgICBkZXB0aCAgICAgPSBTR0lfR1JBWVNDQUxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIGRpbWVuc2lvbiA9IFNHSV9NVUxUSV9DSEFOOworICAgICAgICBkZXB0aCAgICAgPSBTR0lfUkdCOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICAgICAgZGltZW5zaW9uID0gU0dJX01VTFRJX0NIQU47CisgICAgICAgIGRlcHRoICAgICA9IFNHSV9SR0JBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2TEU6CisgICAgICAgIHB1dF9iZSA9ICFIQVZFX0JJR0VORElBTjsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2QkU6CisgICAgICAgIGF2Y3R4LT5jb2Rlcl90eXBlID0gRkZfQ09ERVJfVFlQRV9SQVc7CisgICAgICAgIGJ5dGVzX3Blcl9jaGFubmVsID0gMjsKKyAgICAgICAgcGl4bWF4ID0gMHhGRkZGOworICAgICAgICBkaW1lbnNpb24gPSBTR0lfU0lOR0xFX0NIQU47CisgICAgICAgIGRlcHRoICAgICA9IFNHSV9HUkFZU0NBTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OExFOgorICAgICAgICBwdXRfYmUgPSAhSEFWRV9CSUdFTkRJQU47CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4QkU6CisgICAgICAgIGF2Y3R4LT5jb2Rlcl90eXBlID0gRkZfQ09ERVJfVFlQRV9SQVc7CisgICAgICAgIGJ5dGVzX3Blcl9jaGFubmVsID0gMjsKKyAgICAgICAgcGl4bWF4ID0gMHhGRkZGOworICAgICAgICBkaW1lbnNpb24gPSBTR0lfTVVMVElfQ0hBTjsKKyAgICAgICAgZGVwdGggICAgID0gU0dJX1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NExFOgorICAgICAgICBwdXRfYmUgPSAhSEFWRV9CSUdFTkRJQU47CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NEJFOgorICAgICAgICBhdmN0eC0+Y29kZXJfdHlwZSA9IEZGX0NPREVSX1RZUEVfUkFXOworICAgICAgICBieXRlc19wZXJfY2hhbm5lbCA9IDI7CisgICAgICAgIHBpeG1heCA9IDB4RkZGRjsKKyAgICAgICAgZGltZW5zaW9uID0gU0dJX01VTFRJX0NIQU47CisgICAgICAgIGRlcHRoICAgICA9IFNHSV9SR0JBOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB0YWJsZXNpemUgPSBkZXB0aCAqIGhlaWdodCAqIDQ7CisgICAgbGVuZ3RoID0gU0dJX0hFQURFUl9TSVpFOworICAgIGlmIChhdmN0eC0+Y29kZXJfdHlwZSA9PSBGRl9DT0RFUl9UWVBFX1JBVykKKyAgICAgICAgbGVuZ3RoICs9IGRlcHRoICogaGVpZ2h0ICogd2lkdGg7CisgICAgZWxzZSAvLyBhc3N1bWUgZmZfcmxfZW5jb2RlKCkgcHJvZHVjZXMgYXQgbW9zdCAyeCBzaXplIG9mIGlucHV0CisgICAgICAgIGxlbmd0aCArPSB0YWJsZXNpemUgKiAyICsgZGVwdGggKiBoZWlnaHQgKiAoMiAqIHdpZHRoICsgMSk7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgYnl0ZXNfcGVyX2NoYW5uZWwgKiBsZW5ndGgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgYnVmICAgICA9IHBrdC0+ZGF0YTsKKyAgICBlbmRfYnVmID0gcGt0LT5kYXRhICsgcGt0LT5zaXplOworCisgICAgLyogRW5jb2RlIGhlYWRlci4gKi8KKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZidWYsIFNHSV9NQUdJQyk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCBhdmN0eC0+Y29kZXJfdHlwZSAhPSBGRl9DT0RFUl9UWVBFX1JBVyk7IC8qIFJMRSAxIC0gVkVSQkFUSU0gMCovCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCBieXRlc19wZXJfY2hhbm5lbCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmYnVmLCBkaW1lbnNpb24pOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1Ziwgd2lkdGgpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgaGVpZ2h0KTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZidWYsIGRlcHRoKTsKKworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgMEwpOyAvKiBwaXhtaW4gKi8KKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIHBpeG1heCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCAwTCk7IC8qIGR1bW15ICovCisKKyAgICAvKiBuYW1lICovCisgICAgbWVtc2V0KGJ1ZiwgMCwgU0dJX0hFQURFUl9TSVpFKTsKKyAgICBidWYgKz0gODA7CisKKyAgICAvKiBjb2xvcm1hcCAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgMEwpOworCisgICAgLyogVGhlIHJlc3Qgb2YgdGhlIDUxMiBieXRlIGhlYWRlciBpcyB1bnVzZWQuICovCisgICAgYnVmICs9IDQwNDsKKyAgICBvZmZzZXR0YWIgPSBidWY7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVyX3R5cGUgIT0gRkZfQ09ERVJfVFlQRV9SQVcpIHsKKyAgICAgICAgLyogU2tpcCBSTEUgb2Zmc2V0IHRhYmxlLiAqLworICAgICAgICBidWYgKz0gdGFibGVzaXplOworICAgICAgICBsZW5ndGh0YWIgPSBidWY7CisKKyAgICAgICAgLyogU2tpcCBSTEUgbGVuZ3RoIHRhYmxlLiAqLworICAgICAgICBidWYgKz0gdGFibGVzaXplOworCisgICAgICAgIC8qIE1ha2UgYW4gaW50ZXJtZWRpYXRlIGNvbnNlY3V0aXZlIGJ1ZmZlci4gKi8KKyAgICAgICAgaWYgKCEoZW5jb2RlX2J1ZiA9IGF2X21hbGxvYyh3aWR0aCkpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGZvciAoeiA9IDA7IHogPCBkZXB0aDsgeisrKSB7CisgICAgICAgICAgICBpbl9idWYgPSBwLT5kYXRhWzBdICsgcC0+bGluZXNpemVbMF0gKiAoaGVpZ2h0IC0gMSkgKyB6OworCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZvZmZzZXR0YWIsIGJ1ZiAtIHBrdC0+ZGF0YSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2J1Zlt4XSA9IGluX2J1ZltkZXB0aCAqIHhdOworCisgICAgICAgICAgICAgICAgaWYgKChsZW5ndGggPSBmZl9ybGVfZW5jb2RlKGJ1ZiwgZW5kX2J1ZiAtIGJ1ZiAtIDEsIGVuY29kZV9idWYsIDEsIHdpZHRoLCAwLCAwLCAweDgwLCAwKSkgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUoZW5jb2RlX2J1Zik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBidWYgKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmbGVuZ3RodGFiLCBsZW5ndGggKyAxKTsKKyAgICAgICAgICAgICAgICBpbl9idWYgLT0gcC0+bGluZXNpemVbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmVlKGVuY29kZV9idWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoeiA9IDA7IHogPCBkZXB0aDsgeisrKSB7CisgICAgICAgICAgICBpbl9idWYgPSBwLT5kYXRhWzBdICsgcC0+bGluZXNpemVbMF0gKiAoaGVpZ2h0IC0gMSkgKyB6ICogYnl0ZXNfcGVyX2NoYW5uZWw7CisKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aCAqIGRlcHRoOyB4ICs9IGRlcHRoKQorICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNfcGVyX2NoYW5uZWwgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCBpbl9idWZbeF0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB1dF9iZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgKCh1aW50MTZfdCAqKWluX2J1ZilbeF0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZidWYsICgodWludDE2X3QgKilpbl9idWYpW3hdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW5fYnVmIC09IHAtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogdG90YWwgbGVuZ3RoICovCisgICAgcGt0LT5zaXplICAgPSBidWYgLSBwa3QtPmRhdGE7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfc2dpX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICA9ICJzZ2kiLAorICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU0dJIGltYWdlIiksCisgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU0dJLAorICAgIC5pbml0ICAgICAgPSBlbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgID0gZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgPSBlbmNvZGVfY2xvc2UsCisgICAgLnBpeF9mbXRzICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeworICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX1JHQkEsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCNDhMRSwgQVZfUElYX0ZNVF9SR0I0OEJFLAorICAgICAgICBBVl9QSVhfRk1UX1JHQkE2NExFLCBBVl9QSVhfRk1UX1JHQkE2NEJFLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNkxFLCBBVl9QSVhfRk1UX0dSQVkxNkJFLCBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NnaXJsZWRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2dpcmxlZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkMDEyZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NnaXJsZWRlYy5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogU2lsaWNvbiBHcmFwaGljcyBSTEUgOC1iaXQgdmlkZW8gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU2lsaWNvbiBHcmFwaGljcyBSTEUgOC1iaXQgdmlkZW8gZGVjb2RlcgorICogQG5vdGUgRGF0YSBpcyBwYWNrZWQgaW4gcmJnMzIzIHdpdGggcmxlLCBjb250YWluZWQgaW4gbXYgb3IgbW92LgorICogVGhlIGFsZ29yaXRobSBhbmQgcGl4Zm10IGFyZSBzdWJ0bHkgZGlmZmVyZW50IGZyb20gU0dJIGltYWdlcy4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IFNHSVJMRUNvbnRleHQgeworICAgIEFWRnJhbWUgKmZyYW1lOworfSBTR0lSTEVDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgc2dpcmxlX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTR0lSTEVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSODsKKyAgICBzLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDb252ZXJ0IFNHSSBSQkczMjMgcGl4ZWwgaW50byBBVl9QSVhfRk1UX0JHUjgKKyAqIFNHSSBSR0IgZGF0YSBpcyBwYWNrZWQgYXMgOGJwcCwgKG1zYikzUiAyQiAzRyhsc2IpCisgKi8KKyNkZWZpbmUgUkJHMzIzX1RPX0JHUjgoeCkgKCgoKHgpIDw8IDMpICYgMHhDMCkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPDwgMykgJiAweDM4KSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiA1KSAmIDcpKQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgcmJnMzIzX3RvX2JncjgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzaXplKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIGRzdFtpXSA9IFJCRzMyM19UT19CR1I4KHNyY1tpXSk7Cit9CisKKy8qKgorICogQHBhcmFtW291dF0gZHN0IERlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHBhcmFtW2luXSBzcmMgIFNvdXJjZSBidWZmZXIKKyAqIEBwYXJhbSBzcmNfc2l6ZSBTb3VyY2UgYnVmZmVyIHNpemUgKGJ5dGVzKQorICogQHBhcmFtIHdpZHRoICAgIFdpZHRoIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciAocGl4ZWxzKQorICogQHBhcmFtIGhlaWdodCAgIEhlaWdodCBvZiBkZXN0aW5hdGlvbiBidWZmZXIgKHBpeGVscykKKyAqIEBwYXJhbSBsaW5lc2l6ZSBMaW5lIHNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyIChieXRlcykKKyAqCisgKiBAcmV0dXJuIDwwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3NnaXJsZTgoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHB0cmRpZmZfdCBsaW5lc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpzcmNfZW5kID0gc3JjICsgc3JjX3NpemU7CisgICAgaW50IHggPSAwLCB5ID0gMDsKKworI2RlZmluZSBJTkNfWFkobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHggKz0gbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh4ID49IHdpZHRoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB5Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoeSA+PSBoZWlnaHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICAgIHdoaWxlIChzcmNfZW5kIC0gc3JjID49IDIpIHsKKyAgICAgICAgdWludDhfdCB2ID0gKnNyYysrOworICAgICAgICBpZiAodiA+IDAgJiYgdiA8IDB4QzApIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gRkZNSU4odiwgd2lkdGggLSB4KTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDw9IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG1lbXNldChkc3QgKyB5ICogbGluZXNpemUgKyB4LCBSQkczMjNfVE9fQkdSOCgqc3JjKSwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBJTkNfWFkobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB2IC09IGxlbmd0aDsKKyAgICAgICAgICAgIH0gd2hpbGUgKHYgPiAwKTsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9IGVsc2UgaWYgKHYgPj0gMHhDMSkgeworICAgICAgICAgICAgdiAtPSAweEMwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBGRk1JTjModiwgd2lkdGggLSB4LCBzcmNfZW5kIC0gc3JjKTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2VuZCAtIHNyYyA8IGxlbmd0aCB8fCBsZW5ndGggPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcmJnMzIzX3RvX2JncjgoZHN0ICsgeSAqIGxpbmVzaXplICsgeCwgc3JjLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIElOQ19YWShsZW5ndGgpOworICAgICAgICAgICAgICAgIHNyYyArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgdiAgIC09IGxlbmd0aDsKKyAgICAgICAgICAgIH0gd2hpbGUgKHYgPiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIm9wY29kZSAlZCIsIHYpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNnaXJsZV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgU0dJUkxFQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGRlY29kZV9zZ2lybGU4KGF2Y3R4LCBzLT5mcmFtZS0+ZGF0YVswXSwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWUgPSAxOworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgc2dpcmxlX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNHSVJMRUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfc2dpcmxlX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInNnaXJsZSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNpbGljb24gR3JhcGhpY3MgUkxFIDgtYml0IHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NHSVJMRSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU0dJUkxFQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gc2dpcmxlX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHNnaXJsZV9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHNnaXJsZV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zaDQvUkVBRE1FIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2g0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGQ2MWZlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2g0L1JFQURNRQpAQCAtMCwwICsxLDYgQEAKK1NINCBvcHRpbWl6YXRpb25zIGhhdmUgYmVlbiByZW1vdmVkIGluCitjb21taXQgZDYwOTZhNjc0MjI1MzQ5MTg0MDVhYmI0NmRhZmJiYWM0NjA4Y2JjMworVGhlIGxhc3QgcmV2aXNzaW9uIHdpdGggdGhlIG9wdGltaXphdGlvbnMgaXMgY2JmYzkwNDZlMWM3ZTI5NWI3NGYyNTI5MDJhZTZmMjU1ZWVmNGU3OAorCitJZiB5b3Ugd2FudCB0byBtYWludGFpbiB0aGVzZSAob3Igb3RoZXIpIFNINCBvcHRpbWl6YXRpb25zIGluIGZmbXBlZywgdGhlbiBwbGVhc2UKK2NvbnRhY3QgZmZtcGVnLWRldmVsQGZmbXBlZy5vcmcKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Nob3J0ZW4uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Nob3J0ZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzljYzA2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2hvcnRlbi5jCkBAIC0wLDAgKzEsNjgyIEBACisvKgorICogU2hvcnRlbiBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSmVmZiBNdWl6ZWxhYXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU2hvcnRlbiBkZWNvZGVyCisgKiBAYXV0aG9yIEplZmYgTXVpemVsYWFyCisgKgorICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBNQVhfQ0hBTk5FTFMgOAorI2RlZmluZSBNQVhfQkxPQ0tTSVpFIDY1NTM1CisKKyNkZWZpbmUgT1VUX0JVRkZFUl9TSVpFIDE2Mzg0CisKKyNkZWZpbmUgVUxPTkdTSVpFIDIKKworI2RlZmluZSBXQVZFX0ZPUk1BVF9QQ00gMHgwMDAxCisKKyNkZWZpbmUgREVGQVVMVF9CTE9DS19TSVpFIDI1NgorCisjZGVmaW5lIFRZUEVTSVpFIDQKKyNkZWZpbmUgQ0hBTlNJWkUgMAorI2RlZmluZSBMUENRU0laRSAyCisjZGVmaW5lIEVORVJHWVNJWkUgMworI2RlZmluZSBCSVRTSElGVFNJWkUgMgorCisjZGVmaW5lIFRZUEVfUzggICAgMQorI2RlZmluZSBUWVBFX1U4ICAgIDIKKyNkZWZpbmUgVFlQRV9TMTZITCAzCisjZGVmaW5lIFRZUEVfVTE2SEwgNAorI2RlZmluZSBUWVBFX1MxNkxIIDUKKyNkZWZpbmUgVFlQRV9VMTZMSCA2CisKKyNkZWZpbmUgTldSQVAgMworI2RlZmluZSBOU0tJUFNJWkUgMQorCisjZGVmaW5lIExQQ1FVQU5UIDUKKyNkZWZpbmUgVjJMUENRT0ZGU0VUICgxIDw8IExQQ1FVQU5UKQorCisjZGVmaW5lIEZOU0laRSAyCisjZGVmaW5lIEZOX0RJRkYwICAgICAgICAwCisjZGVmaW5lIEZOX0RJRkYxICAgICAgICAxCisjZGVmaW5lIEZOX0RJRkYyICAgICAgICAyCisjZGVmaW5lIEZOX0RJRkYzICAgICAgICAzCisjZGVmaW5lIEZOX1FVSVQgICAgICAgICA0CisjZGVmaW5lIEZOX0JMT0NLU0laRSAgICA1CisjZGVmaW5lIEZOX0JJVFNISUZUICAgICA2CisjZGVmaW5lIEZOX1FMUEMgICAgICAgICA3CisjZGVmaW5lIEZOX1pFUk8gICAgICAgICA4CisjZGVmaW5lIEZOX1ZFUkJBVElNICAgICA5CisKKy8qKiBpbmRpY2F0ZXMgaWYgdGhlIEZOXyogY29tbWFuZCBpcyBhdWRpbyBvciBub24tYXVkaW8gKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGlzX2F1ZGlvX2NvbW1hbmRbMTBdID0geyAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAwIH07CisKKyNkZWZpbmUgVkVSQkFUSU1fQ0tTSVpFX1NJWkUgNQorI2RlZmluZSBWRVJCQVRJTV9CWVRFX1NJWkUgOAorI2RlZmluZSBDQU5PTklDQUxfSEVBREVSX1NJWkUgNDQKKwordHlwZWRlZiBzdHJ1Y3QgU2hvcnRlbkNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworCisgICAgaW50IG1pbl9mcmFtZXNpemUsIG1heF9mcmFtZXNpemU7CisgICAgdW5zaWduZWQgY2hhbm5lbHM7CisKKyAgICBpbnQzMl90ICpkZWNvZGVkW01BWF9DSEFOTkVMU107CisgICAgaW50MzJfdCAqZGVjb2RlZF9iYXNlW01BWF9DSEFOTkVMU107CisgICAgaW50MzJfdCAqb2Zmc2V0W01BWF9DSEFOTkVMU107CisgICAgaW50ICpjb2VmZnM7CisgICAgdWludDhfdCAqYml0c3RyZWFtOworICAgIGludCBiaXRzdHJlYW1fc2l6ZTsKKyAgICBpbnQgYml0c3RyZWFtX2luZGV4OworICAgIHVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYml0c3RyZWFtX3NpemU7CisgICAgaW50IGhlYWRlcl9zaXplOworICAgIHVpbnQ4X3QgaGVhZGVyW09VVF9CVUZGRVJfU0laRV07CisgICAgaW50IHZlcnNpb247CisgICAgaW50IGN1cl9jaGFuOworICAgIGludCBiaXRzaGlmdDsKKyAgICBpbnQgbm1lYW47CisgICAgaW50IGludGVybmFsX2Z0eXBlOworICAgIGludCBud3JhcDsKKyAgICBpbnQgYmxvY2tzaXplOworICAgIGludCBiaXRpbmRleDsKKyAgICBpbnQzMl90IGxwY3FvZmZzZXQ7CisgICAgaW50IGdvdF9oZWFkZXI7CisgICAgaW50IGdvdF9xdWl0X2NvbW1hbmQ7Cit9IFNob3J0ZW5Db250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgc2hvcnRlbl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU2hvcnRlbkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHMtPmF2Y3R4ICAgICAgICAgID0gYXZjdHg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGxvY2F0ZV9idWZmZXJzKFNob3J0ZW5Db250ZXh0ICpzKQoreworICAgIGludCBpLCBjaGFuLCBlcnI7CisKKyAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgcy0+Y2hhbm5lbHM7IGNoYW4rKykgeworICAgICAgICBpZiAoRkZNQVgoMSwgcy0+bm1lYW4pID49IFVJTlRfTUFYIC8gc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm5tZWFuIHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+YmxvY2tzaXplICsgcy0+bndyYXAgPj0gVUlOVF9NQVggLyBzaXplb2YoaW50MzJfdCkgfHwKKyAgICAgICAgICAgIHMtPmJsb2Nrc2l6ZSArIHMtPm53cmFwIDw9ICh1bnNpZ25lZClzLT5ud3JhcCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgInMtPmJsb2Nrc2l6ZSArIHMtPm53cmFwIHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZXJyID0gYXZfcmVhbGxvY3AoJnMtPm9mZnNldFtjaGFuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MzJfdCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUFYKDEsIHMtPm5tZWFuKSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmcy0+ZGVjb2RlZF9iYXNlW2NoYW5dLCAocy0+YmxvY2tzaXplICsgcy0+bndyYXApICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yocy0+ZGVjb2RlZF9iYXNlWzBdWzBdKSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ud3JhcDsgaSsrKQorICAgICAgICAgICAgcy0+ZGVjb2RlZF9iYXNlW2NoYW5dW2ldID0gMDsKKyAgICAgICAgcy0+ZGVjb2RlZFtjaGFuXSA9IHMtPmRlY29kZWRfYmFzZVtjaGFuXSArIHMtPm53cmFwOworICAgIH0KKworICAgIGlmICgoZXJyID0gYXZfcmVhbGxvY3AoJnMtPmNvZWZmcywgcy0+bndyYXAgKiBzaXplb2YoKnMtPmNvZWZmcykpKSA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X3VpbnQoU2hvcnRlbkNvbnRleHQgKnMsIGludCBrKQoreworICAgIGlmIChzLT52ZXJzaW9uICE9IDApCisgICAgICAgIGsgPSBnZXRfdXJfZ29sb21iX3Nob3J0ZW4oJnMtPmdiLCBVTE9OR1NJWkUpOworICAgIHJldHVybiBnZXRfdXJfZ29sb21iX3Nob3J0ZW4oJnMtPmdiLCBrKTsKK30KKworc3RhdGljIHZvaWQgZml4X2JpdHNoaWZ0KFNob3J0ZW5Db250ZXh0ICpzLCBpbnQzMl90ICpidWZmZXIpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAocy0+Yml0c2hpZnQgIT0gMCkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmJsb2Nrc2l6ZTsgaSsrKQorICAgICAgICAgICAgYnVmZmVyW2ldIDw8PSBzLT5iaXRzaGlmdDsKK30KKworc3RhdGljIGludCBpbml0X29mZnNldChTaG9ydGVuQ29udGV4dCAqcykKK3sKKyAgICBpbnQzMl90IG1lYW4gPSAwOworICAgIGludCBjaGFuLCBpOworICAgIGludCBuYmxvY2sgPSBGRk1BWCgxLCBzLT5ubWVhbik7CisgICAgLyogaW5pdGlhbGlzZSBvZmZzZXQgKi8KKyAgICBzd2l0Y2ggKHMtPmludGVybmFsX2Z0eXBlKSB7CisgICAgY2FzZSBUWVBFX1U4OgorICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfVThQOworICAgICAgICBtZWFuID0gMHg4MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX1MxNkhMOgorICAgIGNhc2UgVFlQRV9TMTZMSDoKKyAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNlA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5rbm93biBhdWRpbyB0eXBlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBzLT5jaGFubmVsczsgY2hhbisrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJsb2NrOyBpKyspCisgICAgICAgICAgICBzLT5vZmZzZXRbY2hhbl1baV0gPSBtZWFuOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV93YXZlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFkZXJfc2l6ZSkKK3sKKyAgICBpbnQgbGVuLCBicHM7CisgICAgc2hvcnQgd2F2ZV9mb3JtYXQ7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgaGVhZGVyLCBoZWFkZXJfc2l6ZSk7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKSAhPSBNS1RBRygnUicsICdJJywgJ0YnLCAnRicpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibWlzc2luZyBSSUZGIHRhZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCA0KTsgLyogY2h1bmsgc2l6ZSAqLworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYikgIT0gTUtUQUcoJ1cnLCAnQScsICdWJywgJ0UnKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1pc3NpbmcgV0FWRSB0YWdcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKSAhPSBNS1RBRygnZicsICdtJywgJ3QnLCAnICcpKSB7CisgICAgICAgIGxlbiA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCBsZW4pOworICAgICAgICBpZiAobGVuIDwgMCB8fCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgMTYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibm8gZm10IGNodW5rIGZvdW5kXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorICAgIGxlbiA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisKKyAgICBpZiAobGVuIDwgMTYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmbXQgY2h1bmsgd2FzIHRvbyBzaG9ydFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHdhdmVfZm9ybWF0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKworICAgIHN3aXRjaCAod2F2ZV9mb3JtYXQpIHsKKyAgICBjYXNlIFdBVkVfRk9STUFUX1BDTToKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCB3YXZlIGZvcm1hdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDIpOyAvLyBza2lwIGNoYW5uZWxzICAgIChhbHJlYWR5IGdvdCBmcm9tIHNob3J0ZW4gaGVhZGVyKQorICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDQpOyAvLyBza2lwIGJpdCByYXRlICAgIChyZXByZXNlbnRzIG9yaWdpbmFsIHVuY29tcHJlc3NlZCBiaXQgcmF0ZSkKKyAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgMik7IC8vIHNraXAgYmxvY2sgYWxpZ24gKG5vdCBuZWVkZWQpCisgICAgYnBzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKyAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYnBzOworCisgICAgaWYgKGJwcyAhPSAxNiAmJiBicHMgIT0gOCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIG51bWJlciBvZiBiaXRzIHBlciBzYW1wbGU6ICVkXG4iLCBicHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGxlbiAtPSAxNjsKKyAgICBpZiAobGVuID4gMCkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIiVkIGhlYWRlciBieXRlcyB1bnBhcnNlZFxuIiwgbGVuKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgaW50IGZpeGVkX2NvZWZmc1tdWzNdID0geworICAgIHsgMCwgIDAsICAwIH0sCisgICAgeyAxLCAgMCwgIDAgfSwKKyAgICB7IDIsIC0xLCAgMCB9LAorICAgIHsgMywgLTMsICAxIH0KK307CisKK3N0YXRpYyBpbnQgZGVjb2RlX3N1YmZyYW1lX2xwYyhTaG9ydGVuQ29udGV4dCAqcywgaW50IGNvbW1hbmQsIGludCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXNpZHVhbF9zaXplLCBpbnQzMl90IGNvZmZzZXQpCit7CisgICAgaW50IHByZWRfb3JkZXIsIHN1bSwgcXNoaWZ0LCBpbml0X3N1bSwgaSwgajsKKyAgICBjb25zdCBpbnQgKmNvZWZmczsKKworICAgIGlmIChjb21tYW5kID09IEZOX1FMUEMpIHsKKyAgICAgICAgLyogcmVhZC92YWxpZGF0ZSBwcmVkaWN0aW9uIG9yZGVyICovCisgICAgICAgIHByZWRfb3JkZXIgPSBnZXRfdXJfZ29sb21iX3Nob3J0ZW4oJnMtPmdiLCBMUENRU0laRSk7CisgICAgICAgIGlmIChwcmVkX29yZGVyID4gcy0+bndyYXApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBwcmVkX29yZGVyICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHByZWRfb3JkZXIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICAvKiByZWFkIExQQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHByZWRfb3JkZXI7IGkrKykKKyAgICAgICAgICAgIHMtPmNvZWZmc1tpXSA9IGdldF9zcl9nb2xvbWJfc2hvcnRlbigmcy0+Z2IsIExQQ1FVQU5UKTsKKyAgICAgICAgY29lZmZzID0gcy0+Y29lZmZzOworCisgICAgICAgIHFzaGlmdCA9IExQQ1FVQU5UOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGZpeGVkIExQQyBjb2VmZnMgKi8KKyAgICAgICAgcHJlZF9vcmRlciA9IGNvbW1hbmQ7CisgICAgICAgIGlmIChwcmVkX29yZGVyID49IEZGX0FSUkFZX0VMRU1TKGZpeGVkX2NvZWZmcykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBwcmVkX29yZGVyICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHByZWRfb3JkZXIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgY29lZmZzICAgICA9IGZpeGVkX2NvZWZmc1twcmVkX29yZGVyXTsKKyAgICAgICAgcXNoaWZ0ICAgICA9IDA7CisgICAgfQorCisgICAgLyogc3VidHJhY3Qgb2Zmc2V0IGZyb20gcHJldmlvdXMgc2FtcGxlcyB0byB1c2UgaW4gcHJlZGljdGlvbiAqLworICAgIGlmIChjb21tYW5kID09IEZOX1FMUEMgJiYgY29mZnNldCkKKyAgICAgICAgZm9yIChpID0gLXByZWRfb3JkZXI7IGkgPCAwOyBpKyspCisgICAgICAgICAgICBzLT5kZWNvZGVkW2NoYW5uZWxdW2ldIC09IGNvZmZzZXQ7CisKKyAgICAvKiBkZWNvZGUgcmVzaWR1YWwgYW5kIGRvIExQQyBwcmVkaWN0aW9uICovCisgICAgaW5pdF9zdW0gPSBwcmVkX29yZGVyID8gKGNvbW1hbmQgPT0gRk5fUUxQQyA/IHMtPmxwY3FvZmZzZXQgOiAwKSA6IGNvZmZzZXQ7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPmJsb2Nrc2l6ZTsgaSsrKSB7CisgICAgICAgIHN1bSA9IGluaXRfc3VtOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcHJlZF9vcmRlcjsgaisrKQorICAgICAgICAgICAgc3VtICs9IGNvZWZmc1tqXSAqIHMtPmRlY29kZWRbY2hhbm5lbF1baSAtIGogLSAxXTsKKyAgICAgICAgcy0+ZGVjb2RlZFtjaGFubmVsXVtpXSA9IGdldF9zcl9nb2xvbWJfc2hvcnRlbigmcy0+Z2IsIHJlc2lkdWFsX3NpemUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdW0gPj4gcXNoaWZ0KTsKKyAgICB9CisKKyAgICAvKiBhZGQgb2Zmc2V0IHRvIGN1cnJlbnQgc2FtcGxlcyAqLworICAgIGlmIChjb21tYW5kID09IEZOX1FMUEMgJiYgY29mZnNldCkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmJsb2Nrc2l6ZTsgaSsrKQorICAgICAgICAgICAgcy0+ZGVjb2RlZFtjaGFubmVsXVtpXSArPSBjb2Zmc2V0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXIoU2hvcnRlbkNvbnRleHQgKnMpCit7CisgICAgaW50IGksIHJldDsKKyAgICBpbnQgbWF4bmxwYyA9IDA7CisgICAgLyogc2hvcnRlbiBzaWduYXR1cmUgKi8KKyAgICBpZiAoZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIDMyKSAhPSBBVl9SQjMyKCJhamtnIikpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaXNzaW5nIHNob3J0ZW4gbWFnaWMgJ2Fqa2cnXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+bHBjcW9mZnNldCAgICAgPSAwOworICAgIHMtPmJsb2Nrc2l6ZSAgICAgID0gREVGQVVMVF9CTE9DS19TSVpFOworICAgIHMtPm5tZWFuICAgICAgICAgID0gLTE7CisgICAgcy0+dmVyc2lvbiAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgIHMtPmludGVybmFsX2Z0eXBlID0gZ2V0X3VpbnQocywgVFlQRVNJWkUpOworCisgICAgcy0+Y2hhbm5lbHMgPSBnZXRfdWludChzLCBDSEFOU0laRSk7CisgICAgaWYgKCFzLT5jaGFubmVscykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGNoYW5uZWxzIHJlcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChzLT5jaGFubmVscyA+IE1BWF9DSEFOTkVMUykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInRvbyBtYW55IGNoYW5uZWxzOiAlZFxuIiwgcy0+Y2hhbm5lbHMpOworICAgICAgICBzLT5jaGFubmVscyA9IDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzLT5hdmN0eC0+Y2hhbm5lbHMgPSBzLT5jaGFubmVsczsKKworICAgIC8qIGdldCBibG9ja3NpemUgaWYgdmVyc2lvbiA+IDAgKi8KKyAgICBpZiAocy0+dmVyc2lvbiA+IDApIHsKKyAgICAgICAgaW50IHNraXBfYnl0ZXM7CisgICAgICAgIHVuc2lnbmVkIGJsb2Nrc2l6ZTsKKworICAgICAgICBibG9ja3NpemUgPSBnZXRfdWludChzLCBhdl9sb2cyKERFRkFVTFRfQkxPQ0tfU0laRSkpOworICAgICAgICBpZiAoIWJsb2Nrc2l6ZSB8fCBibG9ja3NpemUgPiBNQVhfQkxPQ0tTSVpFKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBvciB1bnN1cHBvcnRlZCBibG9jayBzaXplOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBibG9ja3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBzLT5ibG9ja3NpemUgPSBibG9ja3NpemU7CisKKyAgICAgICAgbWF4bmxwYyAgPSBnZXRfdWludChzLCBMUENRU0laRSk7CisgICAgICAgIHMtPm5tZWFuID0gZ2V0X3VpbnQocywgMCk7CisKKyAgICAgICAgc2tpcF9ieXRlcyA9IGdldF91aW50KHMsIE5TS0lQU0laRSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBza2lwX2J5dGVzOyBpKyspCisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA4KTsKKyAgICB9CisgICAgcy0+bndyYXAgPSBGRk1BWChOV1JBUCwgbWF4bmxwYyk7CisKKyAgICBpZiAoKHJldCA9IGFsbG9jYXRlX2J1ZmZlcnMocykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gaW5pdF9vZmZzZXQocykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChzLT52ZXJzaW9uID4gMSkKKyAgICAgICAgcy0+bHBjcW9mZnNldCA9IFYyTFBDUU9GRlNFVDsKKworICAgIGlmIChnZXRfdXJfZ29sb21iX3Nob3J0ZW4oJnMtPmdiLCBGTlNJWkUpICE9IEZOX1ZFUkJBVElNKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIm1pc3NpbmcgdmVyYmF0aW0gc2VjdGlvbiBhdCBiZWdpbm5pbmcgb2Ygc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+aGVhZGVyX3NpemUgPSBnZXRfdXJfZ29sb21iX3Nob3J0ZW4oJnMtPmdiLCBWRVJCQVRJTV9DS1NJWkVfU0laRSk7CisgICAgaWYgKHMtPmhlYWRlcl9zaXplID49IE9VVF9CVUZGRVJfU0laRSB8fAorICAgICAgICBzLT5oZWFkZXJfc2l6ZSA8IENBTk9OSUNBTF9IRUFERVJfU0laRSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImhlYWRlciBpcyB3cm9uZyBzaXplOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHMtPmhlYWRlcl9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmhlYWRlcl9zaXplOyBpKyspCisgICAgICAgIHMtPmhlYWRlcltpXSA9IChjaGFyKWdldF91cl9nb2xvbWJfc2hvcnRlbigmcy0+Z2IsIFZFUkJBVElNX0JZVEVfU0laRSk7CisKKyAgICBpZiAoKHJldCA9IGRlY29kZV93YXZlX2hlYWRlcihzLT5hdmN0eCwgcy0+aGVhZGVyLCBzLT5oZWFkZXJfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHMtPmN1cl9jaGFuID0gMDsKKyAgICBzLT5iaXRzaGlmdCA9IDA7CisKKyAgICBzLT5nb3RfaGVhZGVyID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3J0ZW5fZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBTaG9ydGVuQ29udGV4dCAqcyAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCBpbnB1dF9idWZfc2l6ZSA9IDA7CisgICAgaW50IHJldDsKKworICAgIC8qIGFsbG9jYXRlIGludGVybmFsIGJpdHN0cmVhbSBidWZmZXIgKi8KKyAgICBpZiAocy0+bWF4X2ZyYW1lc2l6ZSA9PSAwKSB7CisgICAgICAgIHZvaWQgKnRtcF9wdHI7CisgICAgICAgIHMtPm1heF9mcmFtZXNpemUgPSA4MTkyOyAvLyBzaG91bGQgaG9wZWZ1bGx5IGJlIGVub3VnaCBmb3IgdGhlIGZpcnN0IGhlYWRlcgorICAgICAgICB0bXBfcHRyID0gYXZfZmFzdF9yZWFsbG9jKHMtPmJpdHN0cmVhbSwgJnMtPmFsbG9jYXRlZF9iaXRzdHJlYW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYXhfZnJhbWVzaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIGlmICghdG1wX3B0cikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBhbGxvY2F0aW5nIGJpdHN0cmVhbSBidWZmZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQodG1wX3B0ciwgMCwgcy0+YWxsb2NhdGVkX2JpdHN0cmVhbV9zaXplKTsKKyAgICAgICAgcy0+Yml0c3RyZWFtID0gdG1wX3B0cjsKKyAgICB9CisKKyAgICAvKiBhcHBlbmQgY3VycmVudCBwYWNrZXQgZGF0YSB0byBiaXRzdHJlYW0gYnVmZmVyICovCisgICAgaWYgKDEgJiYgcy0+bWF4X2ZyYW1lc2l6ZSkgeyAvL0ZJWE1FIHRydW5jYXRlZAorICAgICAgICBidWZfc2l6ZSAgICAgICA9IEZGTUlOKGJ1Zl9zaXplLCBzLT5tYXhfZnJhbWVzaXplIC0gcy0+Yml0c3RyZWFtX3NpemUpOworICAgICAgICBpbnB1dF9idWZfc2l6ZSA9IGJ1Zl9zaXplOworCisgICAgICAgIGlmIChzLT5iaXRzdHJlYW1faW5kZXggKyBzLT5iaXRzdHJlYW1fc2l6ZSArIGJ1Zl9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSA+CisgICAgICAgICAgICBzLT5hbGxvY2F0ZWRfYml0c3RyZWFtX3NpemUpIHsKKyAgICAgICAgICAgIG1lbW1vdmUocy0+Yml0c3RyZWFtLCAmcy0+Yml0c3RyZWFtW3MtPmJpdHN0cmVhbV9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgIHMtPmJpdHN0cmVhbV9zaXplKTsKKyAgICAgICAgICAgIHMtPmJpdHN0cmVhbV9pbmRleCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZikKKyAgICAgICAgICAgIG1lbWNweSgmcy0+Yml0c3RyZWFtW3MtPmJpdHN0cmVhbV9pbmRleCArIHMtPmJpdHN0cmVhbV9zaXplXSwgYnVmLAorICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplKTsKKyAgICAgICAgYnVmICAgICAgICAgICAgICAgPSAmcy0+Yml0c3RyZWFtW3MtPmJpdHN0cmVhbV9pbmRleF07CisgICAgICAgIGJ1Zl9zaXplICAgICAgICAgKz0gcy0+Yml0c3RyZWFtX3NpemU7CisgICAgICAgIHMtPmJpdHN0cmVhbV9zaXplID0gYnVmX3NpemU7CisKKyAgICAgICAgLyogZG8gbm90IGRlY29kZSB1bnRpbCBidWZmZXIgaGFzIGF0IGxlYXN0IG1heF9mcmFtZXNpemUgYnl0ZXMgb3IKKyAgICAgICAgICogdGhlIGVuZCBvZiB0aGUgZmlsZSBoYXMgYmVlbiByZWFjaGVkICovCisgICAgICAgIGlmIChidWZfc2l6ZSA8IHMtPm1heF9mcmFtZXNpemUgJiYgYXZwa3QtPmRhdGEpIHsKKyAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dF9idWZfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBpbml0IGFuZCBwb3NpdGlvbiBiaXRzdHJlYW0gcmVhZGVyICovCisgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1ZiwgYnVmX3NpemUgKiA4KTsKKyAgICBza2lwX2JpdHMoJnMtPmdiLCBzLT5iaXRpbmRleCk7CisKKyAgICAvKiBwcm9jZXNzIGhlYWRlciBvciBuZXh0IHN1YmJsb2NrICovCisgICAgaWYgKCFzLT5nb3RfaGVhZGVyKSB7CisgICAgICAgIGlmICgocmV0ID0gcmVhZF9oZWFkZXIocykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgZ290byBmaW5pc2hfZnJhbWU7CisgICAgfQorCisgICAgLyogaWYgcXVpdCBjb21tYW5kIHdhcyByZWFkIHByZXZpb3VzbHksIGRvbid0IGRlY29kZSBhbnl0aGluZyAqLworICAgIGlmIChzLT5nb3RfcXVpdF9jb21tYW5kKSB7CisgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgcmV0dXJuIGF2cGt0LT5zaXplOworICAgIH0KKworICAgIHMtPmN1cl9jaGFuID0gMDsKKyAgICB3aGlsZSAocy0+Y3VyX2NoYW4gPCBzLT5jaGFubmVscykgeworICAgICAgICB1bnNpZ25lZCBjbWQ7CisgICAgICAgIGludCBsZW47CisKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8IDMgKyBGTlNJWkUpIHsKKyAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY21kID0gZ2V0X3VyX2dvbG9tYl9zaG9ydGVuKCZzLT5nYiwgRk5TSVpFKTsKKworICAgICAgICBpZiAoY21kID4gRk5fVkVSQkFUSU0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5rbm93biBzaG9ydGVuIGZ1bmN0aW9uICVkXG4iLCBjbWQpOworICAgICAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzX2F1ZGlvX2NvbW1hbmRbY21kXSkgeworICAgICAgICAgICAgLyogcHJvY2VzcyBub24tYXVkaW8gY29tbWFuZCAqLworICAgICAgICAgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgICAgIGNhc2UgRk5fVkVSQkFUSU06CisgICAgICAgICAgICAgICAgbGVuID0gZ2V0X3VyX2dvbG9tYl9zaG9ydGVuKCZzLT5nYiwgVkVSQkFUSU1fQ0tTSVpFX1NJWkUpOworICAgICAgICAgICAgICAgIHdoaWxlIChsZW4tLSkKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3VyX2dvbG9tYl9zaG9ydGVuKCZzLT5nYiwgVkVSQkFUSU1fQllURV9TSVpFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRk5fQklUU0hJRlQ6IHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBiaXRzaGlmdCA9IGdldF91cl9nb2xvbWJfc2hvcnRlbigmcy0+Z2IsIEJJVFNISUZUU0laRSk7CisgICAgICAgICAgICAgICAgaWYgKGJpdHNoaWZ0ID4gMzEpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJiaXRzaGlmdCAlZCBpcyBpbnZhbGlkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c2hpZnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+Yml0c2hpZnQgPSBiaXRzaGlmdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRk5fQkxPQ0tTSVpFOiB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgYmxvY2tzaXplID0gZ2V0X3VpbnQocywgYXZfbG9nMihzLT5ibG9ja3NpemUpKTsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2tzaXplID4gcy0+YmxvY2tzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluY3JlYXNpbmcgYmxvY2sgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWJsb2Nrc2l6ZSB8fCBibG9ja3NpemUgPiBNQVhfQkxPQ0tTSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBvciB1bnN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmxvY2sgc2l6ZTogJWRcbiIsIGJsb2Nrc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPmJsb2Nrc2l6ZSA9IGJsb2Nrc2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRk5fUVVJVDoKKyAgICAgICAgICAgICAgICBzLT5nb3RfcXVpdF9jb21tYW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbWQgPT0gRk5fQkxPQ0tTSVpFIHx8IGNtZCA9PSBGTl9RVUlUKSB7CisgICAgICAgICAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogcHJvY2VzcyBhdWRpbyBjb21tYW5kICovCisgICAgICAgICAgICBpbnQgcmVzaWR1YWxfc2l6ZSA9IDA7CisgICAgICAgICAgICBpbnQgY2hhbm5lbCA9IHMtPmN1cl9jaGFuOworICAgICAgICAgICAgaW50MzJfdCBjb2Zmc2V0OworCisgICAgICAgICAgICAvKiBnZXQgUmljZSBjb2RlIGZvciByZXNpZHVhbCBkZWNvZGluZyAqLworICAgICAgICAgICAgaWYgKGNtZCAhPSBGTl9aRVJPKSB7CisgICAgICAgICAgICAgICAgcmVzaWR1YWxfc2l6ZSA9IGdldF91cl9nb2xvbWJfc2hvcnRlbigmcy0+Z2IsIEVORVJHWVNJWkUpOworICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYSBoYWNrIGFzIHZlcnNpb24gMCBkaWZmZXJlZCBpbiB0aGUgZGVmaW5pdGlvbgorICAgICAgICAgICAgICAgICAqIG9mIGdldF9zcl9nb2xvbWJfc2hvcnRlbigpLiAqLworICAgICAgICAgICAgICAgIGlmIChzLT52ZXJzaW9uID09IDApCisgICAgICAgICAgICAgICAgICAgIHJlc2lkdWFsX3NpemUtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2FsY3VsYXRlIHNhbXBsZSBvZmZzZXQgdXNpbmcgbWVhbnMgZnJvbSBwcmV2aW91cyBibG9ja3MgKi8KKyAgICAgICAgICAgIGlmIChzLT5ubWVhbiA9PSAwKQorICAgICAgICAgICAgICAgIGNvZmZzZXQgPSBzLT5vZmZzZXRbY2hhbm5lbF1bMF07CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHN1bSA9IChzLT52ZXJzaW9uIDwgMikgPyAwIDogcy0+bm1lYW4gLyAyOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ubWVhbjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzdW0gKz0gcy0+b2Zmc2V0W2NoYW5uZWxdW2ldOworICAgICAgICAgICAgICAgIGNvZmZzZXQgPSBzdW0gLyBzLT5ubWVhbjsKKyAgICAgICAgICAgICAgICBpZiAocy0+dmVyc2lvbiA+PSAyKQorICAgICAgICAgICAgICAgICAgICBjb2Zmc2V0ID0gcy0+Yml0c2hpZnQgPT0gMCA/IGNvZmZzZXQgOiBjb2Zmc2V0ID4+IHMtPmJpdHNoaWZ0IC0gMSA+PiAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBkZWNvZGUgc2FtcGxlcyBmb3IgdGhpcyBjaGFubmVsICovCisgICAgICAgICAgICBpZiAoY21kID09IEZOX1pFUk8pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YmxvY2tzaXplOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHMtPmRlY29kZWRbY2hhbm5lbF1baV0gPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9zdWJmcmFtZV9scGMocywgY21kLCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpZHVhbF9zaXplLCBjb2Zmc2V0KSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB1cGRhdGUgbWVhbnMgd2l0aCBpbmZvIGZyb20gdGhlIGN1cnJlbnQgYmxvY2sgKi8KKyAgICAgICAgICAgIGlmIChzLT5ubWVhbiA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHN1bSA9IChzLT52ZXJzaW9uIDwgMikgPyAwIDogcy0+YmxvY2tzaXplIC8gMjsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YmxvY2tzaXplOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHN1bSArPSBzLT5kZWNvZGVkW2NoYW5uZWxdW2ldOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHMtPm5tZWFuOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHMtPm9mZnNldFtjaGFubmVsXVtpIC0gMV0gPSBzLT5vZmZzZXRbY2hhbm5lbF1baV07CisKKyAgICAgICAgICAgICAgICBpZiAocy0+dmVyc2lvbiA8IDIpCisgICAgICAgICAgICAgICAgICAgIHMtPm9mZnNldFtjaGFubmVsXVtzLT5ubWVhbiAtIDFdID0gc3VtIC8gcy0+YmxvY2tzaXplOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcy0+b2Zmc2V0W2NoYW5uZWxdW3MtPm5tZWFuIC0gMV0gPSAoc3VtIC8gcy0+YmxvY2tzaXplKSA8PCBzLT5iaXRzaGlmdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY29weSB3cmFwIHNhbXBsZXMgZm9yIHVzZSB3aXRoIG5leHQgYmxvY2sgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IC1zLT5ud3JhcDsgaSA8IDA7IGkrKykKKyAgICAgICAgICAgICAgICBzLT5kZWNvZGVkW2NoYW5uZWxdW2ldID0gcy0+ZGVjb2RlZFtjaGFubmVsXVtpICsgcy0+YmxvY2tzaXplXTsKKworICAgICAgICAgICAgLyogc2hpZnQgc2FtcGxlcyB0byBhZGQgaW4gdW51c2VkIHplcm8gYml0cyB3aGljaCB3ZXJlIHJlbW92ZWQKKyAgICAgICAgICAgICAqIGR1cmluZyBlbmNvZGluZyAqLworICAgICAgICAgICAgZml4X2JpdHNoaWZ0KHMsIHMtPmRlY29kZWRbY2hhbm5lbF0pOworCisgICAgICAgICAgICAvKiBpZiB0aGlzIGlzIHRoZSBsYXN0IGNoYW5uZWwgaW4gdGhlIGJsb2NrLCBvdXRwdXQgdGhlIHNhbXBsZXMgKi8KKyAgICAgICAgICAgIHMtPmN1cl9jaGFuKys7CisgICAgICAgICAgICBpZiAocy0+Y3VyX2NoYW4gPT0gcy0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpzYW1wbGVzX3U4OworICAgICAgICAgICAgICAgIGludDE2X3QgKnNhbXBsZXNfczE2OworICAgICAgICAgICAgICAgIGludCBjaGFuOworCisgICAgICAgICAgICAgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IHMtPmJsb2Nrc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IHMtPmNoYW5uZWxzOyBjaGFuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlc191OCAgPSAoKHVpbnQ4X3QgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGEpW2NoYW5dOworICAgICAgICAgICAgICAgICAgICBzYW1wbGVzX3MxNiA9ICgoaW50MTZfdCAqKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YSlbY2hhbl07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ibG9ja3NpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzLT5pbnRlcm5hbF9mdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1U4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzYW1wbGVzX3U4KysgPSBhdl9jbGlwX3VpbnQ4KHMtPmRlY29kZWRbY2hhbl1baV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1MxNkhMOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1MxNkxIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzYW1wbGVzX3MxNisrID0gYXZfY2xpcF9pbnQxNihzLT5kZWNvZGVkW2NoYW5dW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+Y3VyX2NoYW4gPCBzLT5jaGFubmVscykKKyAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworCitmaW5pc2hfZnJhbWU6CisgICAgcy0+Yml0aW5kZXggPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpIC0gOCAqIChnZXRfYml0c19jb3VudCgmcy0+Z2IpIC8gOCk7CisgICAgaSAgICAgICAgICAgPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpIC8gODsKKyAgICBpZiAoaSA+IGJ1Zl9zaXplKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAib3ZlcnJlYWQ6ICVkXG4iLCBpIC0gYnVmX3NpemUpOworICAgICAgICBzLT5iaXRzdHJlYW1fc2l6ZSAgPSAwOworICAgICAgICBzLT5iaXRzdHJlYW1faW5kZXggPSAwOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKHMtPmJpdHN0cmVhbV9zaXplKSB7CisgICAgICAgIHMtPmJpdHN0cmVhbV9pbmRleCArPSBpOworICAgICAgICBzLT5iaXRzdHJlYW1fc2l6ZSAgLT0gaTsKKyAgICAgICAgcmV0dXJuIGlucHV0X2J1Zl9zaXplOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gaTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHNob3J0ZW5fZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTaG9ydGVuQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICBzLT5kZWNvZGVkW2ldID0gTlVMTDsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmRlY29kZWRfYmFzZVtpXSk7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5vZmZzZXRbaV0pOworICAgIH0KKyAgICBhdl9mcmVlcCgmcy0+Yml0c3RyZWFtKTsKKyAgICBhdl9mcmVlcCgmcy0+Y29lZmZzKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3Nob3J0ZW5fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic2hvcnRlbiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNob3J0ZW4iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU0hPUlRFTiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU2hvcnRlbkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHNob3J0ZW5fZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gc2hvcnRlbl9kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gc2hvcnRlbl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RFTEFZIHwgQ09ERUNfQ0FQX0RSMSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfUzE2UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfVThQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc2ltcGxlX2lkY3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NpbXBsZV9pZGN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViNjI3OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NpbXBsZV9pZGN0LmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBTaW1wbGUgSURDVAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBzaW1wbGVpZGN0IGluIEMuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgInNpbXBsZV9pZGN0LmgiCisKKyNkZWZpbmUgQklUX0RFUFRIIDgKKyNpbmNsdWRlICJzaW1wbGVfaWRjdF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCAxMAorI2luY2x1ZGUgInNpbXBsZV9pZGN0X3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKKyNkZWZpbmUgQklUX0RFUFRIIDEyCisjaW5jbHVkZSAic2ltcGxlX2lkY3RfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKworLyogMng0eDggaWRjdCAqLworCisjZGVmaW5lIENOX1NISUZUIDEyCisjZGVmaW5lIENfRklYKHgpICgoaW50KSgoeCkgKiAoMSA8PCBDTl9TSElGVCkgKyAwLjUpKQorI2RlZmluZSBDMSBDX0ZJWCgwLjY1MzI4MTQ4MjQpCisjZGVmaW5lIEMyIENfRklYKDAuMjcwNTk4MDUwMSkKKworLyogcm93IGlkY3QgaXMgbXVsdGlwbGUgYnkgMTYgKiBzcXJ0KDIuMCksIGNvbCBpZGN0NCBpcyBub3JtYWxpemVkLAorICAgYW5kIHRoZSBidXR0ZXJmbHkgbXVzdCBiZSBtdWx0aXBsaWVkIGJ5IDAuNSAqIHNxcnQoMi4wKSAqLworI2RlZmluZSBDX1NISUZUICg0KzErMTIpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGN0NGNvbF9wdXQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgY29uc3QgaW50MTZfdCAqY29sKQoreworICAgIGludCBjMCwgYzEsIGMyLCBjMywgYTAsIGExLCBhMiwgYTM7CisKKyAgICBhMCA9IGNvbFs4KjBdOworICAgIGExID0gY29sWzgqMl07CisgICAgYTIgPSBjb2xbOCo0XTsKKyAgICBhMyA9IGNvbFs4KjZdOworICAgIGMwID0gKChhMCArIGEyKSA8PCAoQ05fU0hJRlQgLSAxKSkgKyAoMSA8PCAoQ19TSElGVCAtIDEpKTsKKyAgICBjMiA9ICgoYTAgLSBhMikgPDwgKENOX1NISUZUIC0gMSkpICsgKDEgPDwgKENfU0hJRlQgLSAxKSk7CisgICAgYzEgPSBhMSAqIEMxICsgYTMgKiBDMjsKKyAgICBjMyA9IGExICogQzIgLSBhMyAqIEMxOworICAgIGRlc3RbMF0gPSBhdl9jbGlwX3VpbnQ4KChjMCArIGMxKSA+PiBDX1NISUZUKTsKKyAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF91aW50OCgoYzIgKyBjMykgPj4gQ19TSElGVCk7CisgICAgZGVzdCArPSBsaW5lX3NpemU7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfdWludDgoKGMyIC0gYzMpID4+IENfU0hJRlQpOworICAgIGRlc3QgKz0gbGluZV9zaXplOworICAgIGRlc3RbMF0gPSBhdl9jbGlwX3VpbnQ4KChjMCAtIGMxKSA+PiBDX1NISUZUKTsKK30KKworI2RlZmluZSBCRihrKSBcCit7XAorICAgIGludCBhMCwgYTE7XAorICAgIGEwID0gcHRyW2tdO1wKKyAgICBhMSA9IHB0cls4ICsga107XAorICAgIHB0cltrXSA9IGEwICsgYTE7XAorICAgIHB0cls4ICsga10gPSBhMCAtIGExO1wKK30KKworLyogb25seSB1c2VkIGJ5IERWIGNvZGVjLiBUaGUgaW5wdXQgbXVzdCBiZSBpbnRlcmxhY2VkLiAxMjggaXMgYWRkZWQKKyAgIHRvIHRoZSBwaXhlbHMgYmVmb3JlIGNsYW1waW5nIHRvIGF2b2lkIHN5c3RlbWF0aWMgZXJyb3IKKyAgICgxMDI0KnNxcnQoMikpIG9mZnNldCB3b3VsZCBiZSBuZWVkZWQgb3RoZXJ3aXNlLiAqLworLyogWFhYOiBJIHRoaW5rIGEgMS4wL3NxcnQoMikgbm9ybWFsaXphdGlvbiBzaG91bGQgYmUgbmVlZGVkIHRvCisgICBjb21wZW5zYXRlIHRoZSBleHRyYSBidXR0ZXJmbHkgc3RhZ2UgLSBJIGRvbid0IGhhdmUgdGhlIGZ1bGwgRFYKKyAgIHNwZWNpZmljYXRpb24gKi8KK3ZvaWQgZmZfc2ltcGxlX2lkY3QyNDhfcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBpOworICAgIGludDE2X3QgKnB0cjsKKworICAgIC8qIGJ1dHRlcmZseSAqLworICAgIHB0ciA9IGJsb2NrOworICAgIGZvcihpPTA7aTw0O2krKykgeworICAgICAgICBCRigwKTsKKyAgICAgICAgQkYoMSk7CisgICAgICAgIEJGKDIpOworICAgICAgICBCRigzKTsKKyAgICAgICAgQkYoNCk7CisgICAgICAgIEJGKDUpOworICAgICAgICBCRig2KTsKKyAgICAgICAgQkYoNyk7CisgICAgICAgIHB0ciArPSAyICogODsKKyAgICB9CisKKyAgICAvKiBJRENUOCBvbiBlYWNoIGxpbmUgKi8KKyAgICBmb3IoaT0wOyBpPDg7IGkrKykgeworICAgICAgICBpZGN0Um93Q29uZERDXzgoYmxvY2sgKyBpKjgsIDApOworICAgIH0KKworICAgIC8qIElEQ1Q0IGFuZCBzdG9yZSAqLworICAgIGZvcihpPTA7aTw4O2krKykgeworICAgICAgICBpZGN0NGNvbF9wdXQoZGVzdCArIGksIDIgKiBsaW5lX3NpemUsIGJsb2NrICsgaSk7CisgICAgICAgIGlkY3Q0Y29sX3B1dChkZXN0ICsgbGluZV9zaXplICsgaSwgMiAqIGxpbmVfc2l6ZSwgYmxvY2sgKyA4ICsgaSk7CisgICAgfQorfQorCisvKiA4eDQgJiA0eDggV01WMiBJRENUICovCisjdW5kZWYgQ05fU0hJRlQKKyN1bmRlZiBDX1NISUZUCisjdW5kZWYgQ19GSVgKKyN1bmRlZiBDMQorI3VuZGVmIEMyCisjZGVmaW5lIENOX1NISUZUIDEyCisjZGVmaW5lIENfRklYKHgpICgoaW50KSgoeCkgKiAxLjQxNDIxMzU2MiAqICgxIDw8IENOX1NISUZUKSArIDAuNSkpCisjZGVmaW5lIEMxIENfRklYKDAuNjUzMjgxNDgyNCkKKyNkZWZpbmUgQzIgQ19GSVgoMC4yNzA1OTgwNTAxKQorI2RlZmluZSBDMyBDX0ZJWCgwLjUpCisjZGVmaW5lIENfU0hJRlQgKDQrMSsxMikKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGN0NGNvbF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgY29uc3QgaW50MTZfdCAqY29sKQoreworICAgIGludCBjMCwgYzEsIGMyLCBjMywgYTAsIGExLCBhMiwgYTM7CisKKyAgICBhMCA9IGNvbFs4KjBdOworICAgIGExID0gY29sWzgqMV07CisgICAgYTIgPSBjb2xbOCoyXTsKKyAgICBhMyA9IGNvbFs4KjNdOworICAgIGMwID0gKGEwICsgYTIpKkMzICsgKDEgPDwgKENfU0hJRlQgLSAxKSk7CisgICAgYzIgPSAoYTAgLSBhMikqQzMgKyAoMSA8PCAoQ19TSElGVCAtIDEpKTsKKyAgICBjMSA9IGExICogQzEgKyBhMyAqIEMyOworICAgIGMzID0gYTEgKiBDMiAtIGEzICogQzE7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfdWludDgoZGVzdFswXSArICgoYzAgKyBjMSkgPj4gQ19TSElGVCkpOworICAgIGRlc3QgKz0gbGluZV9zaXplOworICAgIGRlc3RbMF0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMF0gKyAoKGMyICsgYzMpID4+IENfU0hJRlQpKTsKKyAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF91aW50OChkZXN0WzBdICsgKChjMiAtIGMzKSA+PiBDX1NISUZUKSk7CisgICAgZGVzdCArPSBsaW5lX3NpemU7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfdWludDgoZGVzdFswXSArICgoYzAgLSBjMSkgPj4gQ19TSElGVCkpOworfQorCisjZGVmaW5lIFJOX1NISUZUIDE1CisjZGVmaW5lIFJfRklYKHgpICgoaW50KSgoeCkgKiAxLjQxNDIxMzU2MiAqICgxIDw8IFJOX1NISUZUKSArIDAuNSkpCisjZGVmaW5lIFIxIFJfRklYKDAuNjUzMjgxNDgyNCkKKyNkZWZpbmUgUjIgUl9GSVgoMC4yNzA1OTgwNTAxKQorI2RlZmluZSBSMyBSX0ZJWCgwLjUpCisjZGVmaW5lIFJfU0hJRlQgMTEKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGN0NHJvdyhpbnQxNl90ICpyb3cpCit7CisgICAgaW50IGMwLCBjMSwgYzIsIGMzLCBhMCwgYTEsIGEyLCBhMzsKKworICAgIGEwID0gcm93WzBdOworICAgIGExID0gcm93WzFdOworICAgIGEyID0gcm93WzJdOworICAgIGEzID0gcm93WzNdOworICAgIGMwID0gKGEwICsgYTIpKlIzICsgKDEgPDwgKFJfU0hJRlQgLSAxKSk7CisgICAgYzIgPSAoYTAgLSBhMikqUjMgKyAoMSA8PCAoUl9TSElGVCAtIDEpKTsKKyAgICBjMSA9IGExICogUjEgKyBhMyAqIFIyOworICAgIGMzID0gYTEgKiBSMiAtIGEzICogUjE7CisgICAgcm93WzBdPSAoYzAgKyBjMSkgPj4gUl9TSElGVDsKKyAgICByb3dbMV09IChjMiArIGMzKSA+PiBSX1NISUZUOworICAgIHJvd1syXT0gKGMyIC0gYzMpID4+IFJfU0hJRlQ7CisgICAgcm93WzNdPSAoYzAgLSBjMSkgPj4gUl9TSElGVDsKK30KKwordm9pZCBmZl9zaW1wbGVfaWRjdDg0X2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIElEQ1Q4IG9uIGVhY2ggbGluZSAqLworICAgIGZvcihpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgIGlkY3RSb3dDb25kRENfOChibG9jayArIGkqOCwgMCk7CisgICAgfQorCisgICAgLyogSURDVDQgYW5kIHN0b3JlICovCisgICAgZm9yKGk9MDtpPDg7aSsrKSB7CisgICAgICAgIGlkY3Q0Y29sX2FkZChkZXN0ICsgaSwgbGluZV9zaXplLCBibG9jayArIGkpOworICAgIH0KK30KKwordm9pZCBmZl9zaW1wbGVfaWRjdDQ4X2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIElEQ1Q0IG9uIGVhY2ggbGluZSAqLworICAgIGZvcihpPTA7IGk8ODsgaSsrKSB7CisgICAgICAgIGlkY3Q0cm93KGJsb2NrICsgaSo4KTsKKyAgICB9CisKKyAgICAvKiBJRENUOCBhbmQgc3RvcmUgKi8KKyAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7CisgICAgICAgIGlkY3RTcGFyc2VDb2xBZGRfOChkZXN0ICsgaSwgbGluZV9zaXplLCBibG9jayArIGkpOworICAgIH0KK30KKwordm9pZCBmZl9zaW1wbGVfaWRjdDQ0X2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIElEQ1Q0IG9uIGVhY2ggbGluZSAqLworICAgIGZvcihpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgIGlkY3Q0cm93KGJsb2NrICsgaSo4KTsKKyAgICB9CisKKyAgICAvKiBJRENUNCBhbmQgc3RvcmUgKi8KKyAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7CisgICAgICAgIGlkY3Q0Y29sX2FkZChkZXN0ICsgaSwgbGluZV9zaXplLCBibG9jayArIGkpOworICAgIH0KK30KKwordm9pZCBmZl9wcm9yZXNfaWRjdChpbnQxNl90ICpibG9jaywgY29uc3QgaW50MTZfdCAqcW1hdCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICBibG9ja1tpXSAqPSBxbWF0W2ldOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgaWRjdFJvd0NvbmREQ18xMChibG9jayArIGkqOCwgMik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGJsb2NrW2ldICs9IDgxOTI7CisgICAgICAgIGlkY3RTcGFyc2VDb2xfMTAoYmxvY2sgKyBpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zaW1wbGVfaWRjdC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2ltcGxlX2lkY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTRlMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2ltcGxlX2lkY3QuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogU2ltcGxlIElEQ1QKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogc2ltcGxlIGlkY3QgaGVhZGVyLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19TSU1QTEVfSURDVF9ICisjZGVmaW5lIEFWQ09ERUNfU0lNUExFX0lEQ1RfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfcHV0XzgodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdF9hZGRfOCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0XzgoaW50MTZfdCAqYmxvY2spOworCit2b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF8xMCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF8xMCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0XzEwKGludDE2X3QgKmJsb2NrKTsKKwordm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfMTIodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdF9hZGRfMTIodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdF8xMihpbnQxNl90ICpibG9jayk7CisKKy8qKgorICogU3BlY2lhbCB2ZXJzaW9uIG9mIGZmX3NpbXBsZV9pZGN0XzEwKCkgd2hpY2ggZG9lcyBkZXF1YW50aXphdGlvbgorICogYW5kIHNjYWxlcyBieSBhIGZhY3RvciBvZiAyIG1vcmUgYmV0d2VlbiB0aGUgdHdvIElEQ1RzIHRvIGFjY291bnQKKyAqIGZvciBsYXJnZXIgc2NhbGUgb2YgaW5wdXQgY29lZmZpY2llbnRzLgorICovCit2b2lkIGZmX3Byb3Jlc19pZGN0KGludDE2X3QgKmJsb2NrLCBjb25zdCBpbnQxNl90ICpxbWF0KTsKKwordm9pZCBmZl9zaW1wbGVfaWRjdDI0OF9wdXQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworCit2b2lkIGZmX3NpbXBsZV9pZGN0ODRfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3Q0OF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdDQ0X2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1NJTVBMRV9JRENUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NpbXBsZV9pZGN0X3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9zaW1wbGVfaWRjdF90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OWRiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zaW1wbGVfaWRjdF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICogU2ltcGxlIElEQ1QKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogc2ltcGxlaWRjdCBpbiBDLgorICovCisKKy8qCisgIGJhc2VkIHVwb24gc29tZSBvdXRjb21tZW50ZWQgYyBjb2RlIGZyb20gbXBlZzJkZWMgKGlkY3RfbW14LmMKKyAgd3JpdHRlbiBieSBBYXJvbiBIb2x0em1hbiA8YWhvbHR6bWFAZXNzLmVuZ3IudXZpYy5jYT4pCisgKi8KKworI2luY2x1ZGUgInNpbXBsZV9pZGN0LmgiCisKKyNpbmNsdWRlICJiaXRfZGVwdGhfdGVtcGxhdGUuYyIKKworI3VuZGVmIFcxCisjdW5kZWYgVzIKKyN1bmRlZiBXMworI3VuZGVmIFc0CisjdW5kZWYgVzUKKyN1bmRlZiBXNgorI3VuZGVmIFc3CisjdW5kZWYgUk9XX1NISUZUCisjdW5kZWYgQ09MX1NISUZUCisjdW5kZWYgRENfU0hJRlQKKyN1bmRlZiBNVUwKKyN1bmRlZiBNQUMKKworI2lmIEJJVF9ERVBUSCA9PSA4CisKKyNkZWZpbmUgVzEgIDIyNzI1ICAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBXMiAgMjE0MDcgIC8vY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41CisjZGVmaW5lIFczICAxOTI2NiAgLy9jb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUKKyNkZWZpbmUgVzQgIDE2MzgzICAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBXNSAgMTI4NzMgIC8vY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41CisjZGVmaW5lIFc2ICA4ODY3ICAgLy9jb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUKKyNkZWZpbmUgVzcgIDQ1MjAgICAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorCisjZGVmaW5lIFJPV19TSElGVCAxMQorI2RlZmluZSBDT0xfU0hJRlQgMjAKKyNkZWZpbmUgRENfU0hJRlQgMworCisjZGVmaW5lIE1VTChhLCBiKSAgICBNVUwxNihhLCBiKQorI2RlZmluZSBNQUMoYSwgYiwgYykgTUFDMTYoYSwgYiwgYykKKworI2VsaWYgQklUX0RFUFRIID09IDEwIHx8IEJJVF9ERVBUSCA9PSAxMgorCisjaWYgQklUX0RFUFRIID09IDEwCisjZGVmaW5lIFcxICgyMjcyNSo0KSAgLy8gOTA5MDEKKyNkZWZpbmUgVzIgKDIxNDA3KjQpIC8vICA4NTYyNworI2RlZmluZSBXMyAoMTkyNjUqNCkgLy8gIDc3MDYyCisjZGVmaW5lIFc0ICgxNjM4NCo0KSAvLyAgNjU1MzUKKyNkZWZpbmUgVzUgKDEyODczKjQpIC8vICA1MTQ5MQorI2RlZmluZSBXNiAoIDg4NjcqNCkgLy8gIDM1NDY4CisjZGVmaW5lIFc3ICggNDUyMCo0KSAvLyAgMTgwODEKKworI2RlZmluZSBST1dfU0hJRlQgMTUKKyNkZWZpbmUgQ09MX1NISUZUIDIwCisjZGVmaW5lIERDX1NISUZUIDEKKyNlbHNlCisjZGVmaW5lIFcxIDQ1NDUxCisjZGVmaW5lIFcyIDQyODEzCisjZGVmaW5lIFczIDM4NTMxCisjZGVmaW5lIFc0IDMyNzY3CisjZGVmaW5lIFc1IDI1NzQ2CisjZGVmaW5lIFc2IDE3NzM0CisjZGVmaW5lIFc3IDkwNDEKKworI2RlZmluZSBST1dfU0hJRlQgMTYKKyNkZWZpbmUgQ09MX1NISUZUIDE3CisjZGVmaW5lIERDX1NISUZUIC0xCisjZW5kaWYKKworI2RlZmluZSBNVUwoYSwgYikgICAgKChhKSAqIChiKSkKKyNkZWZpbmUgTUFDKGEsIGIsIGMpICgoYSkgKz0gKGIpICogKGMpKQorCisjZWxzZQorCisjZXJyb3IgIlVuc3VwcG9ydGVkIGJpdGRlcHRoIgorCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIEZVTkMoaWRjdFJvd0NvbmREQykoaW50MTZfdCAqcm93LCBpbnQgZXh0cmFfc2hpZnQpCit7CisgICAgaW50IGEwLCBhMSwgYTIsIGEzLCBiMCwgYjEsIGIyLCBiMzsKKworI2lmIEhBVkVfRkFTVF82NEJJVAorI2RlZmluZSBST1cwX01BU0sgKDB4ZmZmZkxMIDw8IDQ4ICogSEFWRV9CSUdFTkRJQU4pCisgICAgaWYgKCgoKCh1aW50NjRfdCAqKXJvdylbMF0gJiB+Uk9XMF9NQVNLKSB8ICgodWludDY0X3QgKilyb3cpWzFdKSA9PSAwKSB7CisgICAgICAgIHVpbnQ2NF90IHRlbXA7CisgICAgICAgIGlmIChEQ19TSElGVCAtIGV4dHJhX3NoaWZ0ID49IDApIHsKKyAgICAgICAgICAgIHRlbXAgPSAocm93WzBdICogKDEgPDwgKERDX1NISUZUIC0gZXh0cmFfc2hpZnQpKSkgJiAweGZmZmY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZW1wID0gKChyb3dbMF0gKyAoMTw8KGV4dHJhX3NoaWZ0IC0gRENfU0hJRlQtMSkpKSA+PiAoZXh0cmFfc2hpZnQgLSBEQ19TSElGVCkpICYgMHhmZmZmOworICAgICAgICB9CisgICAgICAgIHRlbXAgKz0gdGVtcCAqICgxIDw8IDE2KTsKKyAgICAgICAgdGVtcCArPSB0ZW1wICogKCh1aW50NjRfdCkgMSA8PCAzMik7CisgICAgICAgICgodWludDY0X3QgKilyb3cpWzBdID0gdGVtcDsKKyAgICAgICAgKCh1aW50NjRfdCAqKXJvdylbMV0gPSB0ZW1wOworICAgICAgICByZXR1cm47CisgICAgfQorI2Vsc2UKKyAgICBpZiAoISgoKHVpbnQzMl90Kilyb3cpWzFdIHwKKyAgICAgICAgICAoKHVpbnQzMl90Kilyb3cpWzJdIHwKKyAgICAgICAgICAoKHVpbnQzMl90Kilyb3cpWzNdIHwKKyAgICAgICAgICByb3dbMV0pKSB7CisgICAgICAgIHVpbnQzMl90IHRlbXA7CisgICAgICAgIGlmIChEQ19TSElGVCAtIGV4dHJhX3NoaWZ0ID49IDApIHsKKyAgICAgICAgICAgIHRlbXAgPSAocm93WzBdICogKDEgPDwgKERDX1NISUZUIC0gZXh0cmFfc2hpZnQpKSkgJiAweGZmZmY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZW1wID0gKChyb3dbMF0gKyAoMTw8KGV4dHJhX3NoaWZ0IC0gRENfU0hJRlQtMSkpKSA+PiAoZXh0cmFfc2hpZnQgLSBEQ19TSElGVCkpICYgMHhmZmZmOworICAgICAgICB9CisgICAgICAgIHRlbXAgKz0gdGVtcCAqICgxIDw8IDE2KTsKKyAgICAgICAgKCh1aW50MzJfdCopcm93KVswXT0oKHVpbnQzMl90Kilyb3cpWzFdID0KKyAgICAgICAgICAgICgodWludDMyX3QqKXJvdylbMl09KCh1aW50MzJfdCopcm93KVszXSA9IHRlbXA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIGEwID0gKFc0ICogcm93WzBdKSArICgxIDw8IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCAtIDEpKTsKKyAgICBhMSA9IGEwOworICAgIGEyID0gYTA7CisgICAgYTMgPSBhMDsKKworICAgIGEwICs9IFcyICogcm93WzJdOworICAgIGExICs9IFc2ICogcm93WzJdOworICAgIGEyIC09IFc2ICogcm93WzJdOworICAgIGEzIC09IFcyICogcm93WzJdOworCisgICAgYjAgPSBNVUwoVzEsIHJvd1sxXSk7CisgICAgTUFDKGIwLCBXMywgcm93WzNdKTsKKyAgICBiMSA9IE1VTChXMywgcm93WzFdKTsKKyAgICBNQUMoYjEsIC1XNywgcm93WzNdKTsKKyAgICBiMiA9IE1VTChXNSwgcm93WzFdKTsKKyAgICBNQUMoYjIsIC1XMSwgcm93WzNdKTsKKyAgICBiMyA9IE1VTChXNywgcm93WzFdKTsKKyAgICBNQUMoYjMsIC1XNSwgcm93WzNdKTsKKworICAgIGlmIChBVl9STjY0QShyb3cgKyA0KSkgeworICAgICAgICBhMCArPSAgIFc0KnJvd1s0XSArIFc2KnJvd1s2XTsKKyAgICAgICAgYTEgKz0gLSBXNCpyb3dbNF0gLSBXMipyb3dbNl07CisgICAgICAgIGEyICs9IC0gVzQqcm93WzRdICsgVzIqcm93WzZdOworICAgICAgICBhMyArPSAgIFc0KnJvd1s0XSAtIFc2KnJvd1s2XTsKKworICAgICAgICBNQUMoYjAsICBXNSwgcm93WzVdKTsKKyAgICAgICAgTUFDKGIwLCAgVzcsIHJvd1s3XSk7CisKKyAgICAgICAgTUFDKGIxLCAtVzEsIHJvd1s1XSk7CisgICAgICAgIE1BQyhiMSwgLVc1LCByb3dbN10pOworCisgICAgICAgIE1BQyhiMiwgIFc3LCByb3dbNV0pOworICAgICAgICBNQUMoYjIsICBXMywgcm93WzddKTsKKworICAgICAgICBNQUMoYjMsICBXMywgcm93WzVdKTsKKyAgICAgICAgTUFDKGIzLCAtVzEsIHJvd1s3XSk7CisgICAgfQorCisgICAgcm93WzBdID0gKGEwICsgYjApID4+IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCk7CisgICAgcm93WzddID0gKGEwIC0gYjApID4+IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCk7CisgICAgcm93WzFdID0gKGExICsgYjEpID4+IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCk7CisgICAgcm93WzZdID0gKGExIC0gYjEpID4+IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCk7CisgICAgcm93WzJdID0gKGEyICsgYjIpID4+IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCk7CisgICAgcm93WzVdID0gKGEyIC0gYjIpID4+IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCk7CisgICAgcm93WzNdID0gKGEzICsgYjMpID4+IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCk7CisgICAgcm93WzRdID0gKGEzIC0gYjMpID4+IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCk7Cit9CisKKyNkZWZpbmUgSURDVF9DT0xTIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhMCA9IFc0ICogKGNvbFs4KjBdICsgKCgxPDwoQ09MX1NISUZULTEpKS9XNCkpOyBcCisgICAgICAgIGExID0gYTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYTIgPSBhMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhMyA9IGEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYTAgKz0gIFcyKmNvbFs4KjJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhMSArPSAgVzYqY29sWzgqMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEyICs9IC1XNipjb2xbOCoyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYTMgKz0gLVcyKmNvbFs4KjJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIwID0gTVVMKFcxLCBjb2xbOCoxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYjEgPSBNVUwoVzMsIGNvbFs4KjFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiMiA9IE1VTChXNSwgY29sWzgqMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGIzID0gTVVMKFc3LCBjb2xbOCoxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNQUMoYjAsICBXMywgY29sWzgqM10pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1BQyhiMSwgLVc3LCBjb2xbOCozXSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUFDKGIyLCAtVzEsIGNvbFs4KjNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNQUMoYjMsIC1XNSwgY29sWzgqM10pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGNvbFs4KjRdKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYTAgKz0gIFc0KmNvbFs4KjRdOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhMSArPSAtVzQqY29sWzgqNF07ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGEyICs9IC1XNCpjb2xbOCo0XTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYTMgKz0gIFc0KmNvbFs4KjRdOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoY29sWzgqNV0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNQUMoYjAsICBXNSwgY29sWzgqNV0pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1BQyhiMSwgLVcxLCBjb2xbOCo1XSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUFDKGIyLCAgVzcsIGNvbFs4KjVdKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNQUMoYjMsICBXMywgY29sWzgqNV0pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChjb2xbOCo2XSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGEwICs9ICBXNipjb2xbOCo2XTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYTEgKz0gLVcyKmNvbFs4KjZdOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhMiArPSAgVzIqY29sWzgqNl07ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGEzICs9IC1XNipjb2xbOCo2XTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGNvbFs4KjddKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUFDKGIwLCAgVzcsIGNvbFs4KjddKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNQUMoYjEsIC1XNSwgY29sWzgqN10pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1BQyhiMiwgIFczLCBjb2xbOCo3XSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUFDKGIzLCAtVzEsIGNvbFs4KjddKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgRlVOQyhpZGN0U3BhcnNlQ29sUHV0KShwaXhlbCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmNvbCkKK3sKKyAgICBpbnQgYTAsIGExLCBhMiwgYTMsIGIwLCBiMSwgYjIsIGIzOworCisgICAgSURDVF9DT0xTOworCisgICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGEwICsgYjApID4+IENPTF9TSElGVCk7CisgICAgZGVzdCArPSBsaW5lX3NpemU7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGExICsgYjEpID4+IENPTF9TSElGVCk7CisgICAgZGVzdCArPSBsaW5lX3NpemU7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGEyICsgYjIpID4+IENPTF9TSElGVCk7CisgICAgZGVzdCArPSBsaW5lX3NpemU7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGEzICsgYjMpID4+IENPTF9TSElGVCk7CisgICAgZGVzdCArPSBsaW5lX3NpemU7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGEzIC0gYjMpID4+IENPTF9TSElGVCk7CisgICAgZGVzdCArPSBsaW5lX3NpemU7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGEyIC0gYjIpID4+IENPTF9TSElGVCk7CisgICAgZGVzdCArPSBsaW5lX3NpemU7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGExIC0gYjEpID4+IENPTF9TSElGVCk7CisgICAgZGVzdCArPSBsaW5lX3NpemU7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGEwIC0gYjApID4+IENPTF9TSElGVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBGVU5DKGlkY3RTcGFyc2VDb2xBZGQpKHBpeGVsICpkZXN0LCBpbnQgbGluZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqY29sKQoreworICAgIGludCBhMCwgYTEsIGEyLCBhMywgYjAsIGIxLCBiMiwgYjM7CisKKyAgICBJRENUX0NPTFM7CisKKyAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbChkZXN0WzBdICsgKChhMCArIGIwKSA+PiBDT0xfU0hJRlQpKTsKKyAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbChkZXN0WzBdICsgKChhMSArIGIxKSA+PiBDT0xfU0hJRlQpKTsKKyAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbChkZXN0WzBdICsgKChhMiArIGIyKSA+PiBDT0xfU0hJRlQpKTsKKyAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbChkZXN0WzBdICsgKChhMyArIGIzKSA+PiBDT0xfU0hJRlQpKTsKKyAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbChkZXN0WzBdICsgKChhMyAtIGIzKSA+PiBDT0xfU0hJRlQpKTsKKyAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbChkZXN0WzBdICsgKChhMiAtIGIyKSA+PiBDT0xfU0hJRlQpKTsKKyAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbChkZXN0WzBdICsgKChhMSAtIGIxKSA+PiBDT0xfU0hJRlQpKTsKKyAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbChkZXN0WzBdICsgKChhMCAtIGIwKSA+PiBDT0xfU0hJRlQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEZVTkMoaWRjdFNwYXJzZUNvbCkoaW50MTZfdCAqY29sKQoreworICAgIGludCBhMCwgYTEsIGEyLCBhMywgYjAsIGIxLCBiMiwgYjM7CisKKyAgICBJRENUX0NPTFM7CisKKyAgICBjb2xbMCBdID0gKChhMCArIGIwKSA+PiBDT0xfU0hJRlQpOworICAgIGNvbFs4IF0gPSAoKGExICsgYjEpID4+IENPTF9TSElGVCk7CisgICAgY29sWzE2XSA9ICgoYTIgKyBiMikgPj4gQ09MX1NISUZUKTsKKyAgICBjb2xbMjRdID0gKChhMyArIGIzKSA+PiBDT0xfU0hJRlQpOworICAgIGNvbFszMl0gPSAoKGEzIC0gYjMpID4+IENPTF9TSElGVCk7CisgICAgY29sWzQwXSA9ICgoYTIgLSBiMikgPj4gQ09MX1NISUZUKTsKKyAgICBjb2xbNDhdID0gKChhMSAtIGIxKSA+PiBDT0xfU0hJRlQpOworICAgIGNvbFs1Nl0gPSAoKGEwIC0gYjApID4+IENPTF9TSElGVCk7Cit9CisKK3ZvaWQgRlVOQyhmZl9zaW1wbGVfaWRjdF9wdXQpKHVpbnQ4X3QgKmRlc3RfLCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBwaXhlbCAqZGVzdCA9IChwaXhlbCAqKWRlc3RfOworICAgIGludCBpOworCisgICAgbGluZV9zaXplIC89IHNpemVvZihwaXhlbCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBGVU5DKGlkY3RSb3dDb25kREMpKGJsb2NrICsgaSo4LCAwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIEZVTkMoaWRjdFNwYXJzZUNvbFB1dCkoZGVzdCArIGksIGxpbmVfc2l6ZSwgYmxvY2sgKyBpKTsKK30KKwordm9pZCBGVU5DKGZmX3NpbXBsZV9pZGN0X2FkZCkodWludDhfdCAqZGVzdF8sIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIHBpeGVsICpkZXN0ID0gKHBpeGVsICopZGVzdF87CisgICAgaW50IGk7CisKKyAgICBsaW5lX3NpemUgLz0gc2l6ZW9mKHBpeGVsKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIEZVTkMoaWRjdFJvd0NvbmREQykoYmxvY2sgKyBpKjgsIDApOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgRlVOQyhpZGN0U3BhcnNlQ29sQWRkKShkZXN0ICsgaSwgbGluZV9zaXplLCBibG9jayArIGkpOworfQorCit2b2lkIEZVTkMoZmZfc2ltcGxlX2lkY3QpKGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgRlVOQyhpZGN0Um93Q29uZERDKShibG9jayArIGkqOCwgMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBGVU5DKGlkY3RTcGFyc2VDb2wpKGJsb2NrICsgaSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zaW5ld2luLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9zaW5ld2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhMGU5NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NpbmV3aW4uYwpAQCAtMCwwICsxLDIwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJzaW5ld2luLmgiCisjaW5jbHVkZSAic2luZXdpbl90YWJsZWdlbi5oIgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc2luZXdpbi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2luZXdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjhmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zaW5ld2luLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBSb2JlcnQgU3dhaW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NJTkVXSU5fSAorI2RlZmluZSBBVkNPREVDX1NJTkVXSU5fSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaWYgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKKyMgICBkZWZpbmUgU0lORVRBQkxFX0NPTlNUIGNvbnN0CisjZWxzZQorIyAgIGRlZmluZSBTSU5FVEFCTEVfQ09OU1QKKyNlbmRpZgorCisjZGVmaW5lIFNJTkVUQUJMRShzaXplKSBcCisgICAgU0lORVRBQkxFX0NPTlNUIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGZmX3NpbmVfIyNzaXplKVtzaXplXQorCisvKioKKyAqIEdlbmVyYXRlIGEgc2luZSB3aW5kb3cuCisgKiBAcGFyYW0gICB3aW5kb3cgIHBvaW50ZXIgdG8gaGFsZiB3aW5kb3cKKyAqIEBwYXJhbSAgIG4gICAgICAgc2l6ZSBvZiBoYWxmIHdpbmRvdworICovCit2b2lkIGZmX3NpbmVfd2luZG93X2luaXQoZmxvYXQgKndpbmRvdywgaW50IG4pOworCisvKioKKyAqIGluaXRpYWxpemUgdGhlIHNwZWNpZmllZCBlbnRyeSBvZiBmZl9zaW5lX3dpbmRvd3MKKyAqLwordm9pZCBmZl9pbml0X2ZmX3NpbmVfd2luZG93cyhpbnQgaW5kZXgpOworCitleHRlcm4gU0lORVRBQkxFKCAgMzIpOworZXh0ZXJuIFNJTkVUQUJMRSggIDY0KTsKK2V4dGVybiBTSU5FVEFCTEUoIDEyOCk7CitleHRlcm4gU0lORVRBQkxFKCAyNTYpOworZXh0ZXJuIFNJTkVUQUJMRSggNTEyKTsKK2V4dGVybiBTSU5FVEFCTEUoMTAyNCk7CitleHRlcm4gU0lORVRBQkxFKDIwNDgpOworZXh0ZXJuIFNJTkVUQUJMRSg0MDk2KTsKK2V4dGVybiBTSU5FVEFCTEUoODE5Mik7CisKK2V4dGVybiBTSU5FVEFCTEVfQ09OU1QgZmxvYXQgKiBjb25zdCBmZl9zaW5lX3dpbmRvd3NbMTRdOworCisjZW5kaWYgLyogQVZDT0RFQ19TSU5FV0lOX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NpbmV3aW5fdGFibGVnZW4uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NpbmV3aW5fdGFibGVnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjFhZTNlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2luZXdpbl90YWJsZWdlbi5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBHZW5lcmF0ZSBhIGhlYWRlciBmaWxlIGZvciBoYXJkY29kZWQgc2luZSB3aW5kb3dzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMgMAorI2RlZmluZSBTSU5FVEFCTEVfQ09OU1QKKyNkZWZpbmUgU0lORVRBQkxFKHNpemUpIFwKKyAgICBmbG9hdCBmZl9zaW5lXyMjc2l6ZVtzaXplXQorI2RlZmluZSBGRl9BUlJBWV9FTEVNUyhhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisjaW5jbHVkZSAic2luZXdpbl90YWJsZWdlbi5oIgorI2luY2x1ZGUgInRhYmxlcHJpbnQuaCIKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIHdyaXRlX2ZpbGVoZWFkZXIoKTsKKworICAgIGZvciAoaSA9IDU7IGkgPD0gMTM7IGkrKykgeworICAgICAgICBmZl9pbml0X2ZmX3NpbmVfd2luZG93cyhpKTsKKyAgICAgICAgcHJpbnRmKCJTSU5FVEFCTEUoJTRpKSA9IHtcbiIsIDEgPDwgaSk7CisgICAgICAgIHdyaXRlX2Zsb2F0X2FycmF5KGZmX3NpbmVfd2luZG93c1tpXSwgMSA8PCBpKTsKKyAgICAgICAgcHJpbnRmKCJ9O1xuIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zaW5ld2luX3RhYmxlZ2VuLmggYi9mZm1wZWcvbGliYXZjb2RlYy9zaW5ld2luX3RhYmxlZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5YzRmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NpbmV3aW5fdGFibGVnZW4uaApAQCAtMCwwICsxLDY3IEBACisvKgorICogSGVhZGVyIGZpbGUgZm9yIGhhcmRjb2RlZCBzaW5lIHdpbmRvd3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NJTkVXSU5fVEFCTEVHRU5fSAorI2RlZmluZSBBVkNPREVDX1NJTkVXSU5fVEFCTEVHRU5fSAorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvLyBkbyBub3QgdXNlIGxpYmF2dXRpbC9saWJtLmggc2luY2UgdGhpcyBpcyBjb21waWxlZCBib3RoCisvLyBmb3IgdGhlIGhvc3QgYW5kIHRoZSB0YXJnZXQgYW5kIGNvbmZpZy5oIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSB0YXJnZXQKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKyNpZiAhQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKK1NJTkVUQUJMRSggIDMyKTsKK1NJTkVUQUJMRSggIDY0KTsKK1NJTkVUQUJMRSggMTI4KTsKK1NJTkVUQUJMRSggMjU2KTsKK1NJTkVUQUJMRSggNTEyKTsKK1NJTkVUQUJMRSgxMDI0KTsKK1NJTkVUQUJMRSgyMDQ4KTsKK1NJTkVUQUJMRSg0MDk2KTsKK1NJTkVUQUJMRSg4MTkyKTsKKyNlbHNlCisjaW5jbHVkZSAibGliYXZjb2RlYy9zaW5ld2luX3RhYmxlcy5oIgorI2VuZGlmCisKK1NJTkVUQUJMRV9DT05TVCBmbG9hdCAqIGNvbnN0IGZmX3NpbmVfd2luZG93c1tdID0geworICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIC8vIHVudXNlZAorICAgIGZmX3NpbmVfMzIgLCBmZl9zaW5lXzY0ICwKKyAgICBmZl9zaW5lXzEyOCwgZmZfc2luZV8yNTYsIGZmX3NpbmVfNTEyLCBmZl9zaW5lXzEwMjQsIGZmX3NpbmVfMjA0OCwgZmZfc2luZV80MDk2LCBmZl9zaW5lXzgxOTIKK307CisKKy8vIEdlbmVyYXRlIGEgc2luZSB3aW5kb3cuCithdl9jb2xkIHZvaWQgZmZfc2luZV93aW5kb3dfaW5pdChmbG9hdCAqd2luZG93LCBpbnQgbikgeworICAgIGludCBpOworICAgIGZvcihpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgd2luZG93W2ldID0gc2luZigoaSArIDAuNSkgKiAoTV9QSSAvICgyLjAgKiBuKSkpOworfQorCithdl9jb2xkIHZvaWQgZmZfaW5pdF9mZl9zaW5lX3dpbmRvd3MoaW50IGluZGV4KSB7CisgICAgYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBGRl9BUlJBWV9FTEVNUyhmZl9zaW5lX3dpbmRvd3MpKTsKKyNpZiAhQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKKyAgICBmZl9zaW5lX3dpbmRvd19pbml0KGZmX3NpbmVfd2luZG93c1tpbmRleF0sIDEgPDwgaW5kZXgpOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBBVkNPREVDX1NJTkVXSU5fVEFCTEVHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc2lwci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2lwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYjk0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zaXByLmMKQEAgLTAsMCArMSw1NzQgQEAKKy8qCisgKiBTSVBSIC8gQUNFTFAuTkVUIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICogQ29weXJpZ2h0IChjKSAyMDA5IFZpdG9yIFNlc3NhaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgImxzcC5oIgorI2luY2x1ZGUgImFjZWxwX3ZlY3RvcnMuaCIKKyNpbmNsdWRlICJhY2VscF9waXRjaF9kZWxheS5oIgorI2luY2x1ZGUgImFjZWxwX2ZpbHRlcnMuaCIKKyNpbmNsdWRlICJjZWxwX2ZpbHRlcnMuaCIKKworI2RlZmluZSBNQVhfU1VCRlJBTUVfQ09VTlQgICA1CisKKyNpbmNsdWRlICJzaXByLmgiCisjaW5jbHVkZSAic2lwcmRhdGEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKm1vZGVfbmFtZTsKKyAgICB1aW50MTZfdCBiaXRzX3Blcl9mcmFtZTsKKyAgICB1aW50OF90IHN1YmZyYW1lX2NvdW50OworICAgIHVpbnQ4X3QgZnJhbWVzX3Blcl9wYWNrZXQ7CisgICAgZmxvYXQgcGl0Y2hfc2hhcnBfZmFjdG9yOworCisgICAgLyogYml0c3RyZWFtIHBhcmFtZXRlcnMgKi8KKyAgICB1aW50OF90IG51bWJlcl9vZl9mY19pbmRleGVzOworICAgIHVpbnQ4X3QgbWFfcHJlZGljdG9yX2JpdHM7ICAvLy88IHNpemUgaW4gYml0cyBvZiB0aGUgc3dpdGNoZWQgTUEgcHJlZGljdG9yCisKKyAgICAvKiogc2l6ZSBpbiBiaXRzIG9mIHRoZSBpLXRoIHN0YWdlIHZlY3RvciBvZiBxdWFudGl6ZXIgKi8KKyAgICB1aW50OF90IHZxX2luZGV4ZXNfYml0c1s1XTsKKworICAgIC8qKiBzaXplIGluIGJpdHMgb2YgdGhlIGFkYXB0aXZlLWNvZGVib29rIGluZGV4IGZvciBldmVyeSBzdWJmcmFtZSAqLworICAgIHVpbnQ4X3QgcGl0Y2hfZGVsYXlfYml0c1s1XTsKKworICAgIHVpbnQ4X3QgZ3BfaW5kZXhfYml0czsKKyAgICB1aW50OF90IGZjX2luZGV4X2JpdHNbMTBdOyAvLy88IHNpemUgaW4gYml0cyBvZiB0aGUgZml4ZWQgY29kZWJvb2sgaW5kZXhlcworICAgIHVpbnQ4X3QgZ2NfaW5kZXhfYml0czsgICAgIC8vLzwgc2l6ZSBpbiBiaXRzIG9mIHRoZSBnYWluICBjb2RlYm9vayBpbmRleGVzCit9IFNpcHJNb2RlUGFyYW07CisKK3N0YXRpYyBjb25zdCBTaXByTW9kZVBhcmFtIG1vZGVzW01PREVfQ09VTlRdID0geworICAgIFtNT0RFXzE2a10gPSB7CisgICAgICAgIC5tb2RlX25hbWUgICAgICAgICAgPSAiMTZrIiwKKyAgICAgICAgLmJpdHNfcGVyX2ZyYW1lICAgICA9IDE2MCwKKyAgICAgICAgLnN1YmZyYW1lX2NvdW50ICAgICA9IFNVQkZSQU1FX0NPVU5UXzE2aywKKyAgICAgICAgLmZyYW1lc19wZXJfcGFja2V0ICA9IDEsCisgICAgICAgIC5waXRjaF9zaGFycF9mYWN0b3IgPSAwLjAwLAorCisgICAgICAgIC5udW1iZXJfb2ZfZmNfaW5kZXhlcyA9IDEwLAorICAgICAgICAubWFfcHJlZGljdG9yX2JpdHMgICAgPSAxLAorICAgICAgICAudnFfaW5kZXhlc19iaXRzICAgICAgPSB7NywgOCwgNywgNywgN30sCisgICAgICAgIC5waXRjaF9kZWxheV9iaXRzICAgICA9IHs5LCA2fSwKKyAgICAgICAgLmdwX2luZGV4X2JpdHMgICAgICAgID0gNCwKKyAgICAgICAgLmZjX2luZGV4X2JpdHMgICAgICAgID0gezQsIDUsIDQsIDUsIDQsIDUsIDQsIDUsIDQsIDV9LAorICAgICAgICAuZ2NfaW5kZXhfYml0cyAgICAgICAgPSA1CisgICAgfSwKKworICAgIFtNT0RFXzhrNV0gPSB7CisgICAgICAgIC5tb2RlX25hbWUgICAgICAgICAgPSAiOGs1IiwKKyAgICAgICAgLmJpdHNfcGVyX2ZyYW1lICAgICA9IDE1MiwKKyAgICAgICAgLnN1YmZyYW1lX2NvdW50ICAgICA9IDMsCisgICAgICAgIC5mcmFtZXNfcGVyX3BhY2tldCAgPSAxLAorICAgICAgICAucGl0Y2hfc2hhcnBfZmFjdG9yID0gMC44LAorCisgICAgICAgIC5udW1iZXJfb2ZfZmNfaW5kZXhlcyA9IDMsCisgICAgICAgIC5tYV9wcmVkaWN0b3JfYml0cyAgICA9IDAsCisgICAgICAgIC52cV9pbmRleGVzX2JpdHMgICAgICA9IHs2LCA3LCA3LCA3LCA1fSwKKyAgICAgICAgLnBpdGNoX2RlbGF5X2JpdHMgICAgID0gezgsIDUsIDV9LAorICAgICAgICAuZ3BfaW5kZXhfYml0cyAgICAgICAgPSAwLAorICAgICAgICAuZmNfaW5kZXhfYml0cyAgICAgICAgPSB7OSwgOSwgOX0sCisgICAgICAgIC5nY19pbmRleF9iaXRzICAgICAgICA9IDcKKyAgICB9LAorCisgICAgW01PREVfNms1XSA9IHsKKyAgICAgICAgLm1vZGVfbmFtZSAgICAgICAgICA9ICI2azUiLAorICAgICAgICAuYml0c19wZXJfZnJhbWUgICAgID0gMjMyLAorICAgICAgICAuc3ViZnJhbWVfY291bnQgICAgID0gMywKKyAgICAgICAgLmZyYW1lc19wZXJfcGFja2V0ICA9IDIsCisgICAgICAgIC5waXRjaF9zaGFycF9mYWN0b3IgPSAwLjgsCisKKyAgICAgICAgLm51bWJlcl9vZl9mY19pbmRleGVzID0gMywKKyAgICAgICAgLm1hX3ByZWRpY3Rvcl9iaXRzICAgID0gMCwKKyAgICAgICAgLnZxX2luZGV4ZXNfYml0cyAgICAgID0gezYsIDcsIDcsIDcsIDV9LAorICAgICAgICAucGl0Y2hfZGVsYXlfYml0cyAgICAgPSB7OCwgNSwgNX0sCisgICAgICAgIC5ncF9pbmRleF9iaXRzICAgICAgICA9IDAsCisgICAgICAgIC5mY19pbmRleF9iaXRzICAgICAgICA9IHs1LCA1LCA1fSwKKyAgICAgICAgLmdjX2luZGV4X2JpdHMgICAgICAgID0gNworICAgIH0sCisKKyAgICBbTU9ERV81azBdID0geworICAgICAgICAubW9kZV9uYW1lICAgICAgICAgID0gIjVrMCIsCisgICAgICAgIC5iaXRzX3Blcl9mcmFtZSAgICAgPSAyOTYsCisgICAgICAgIC5zdWJmcmFtZV9jb3VudCAgICAgPSA1LAorICAgICAgICAuZnJhbWVzX3Blcl9wYWNrZXQgID0gMiwKKyAgICAgICAgLnBpdGNoX3NoYXJwX2ZhY3RvciA9IDAuODUsCisKKyAgICAgICAgLm51bWJlcl9vZl9mY19pbmRleGVzID0gMSwKKyAgICAgICAgLm1hX3ByZWRpY3Rvcl9iaXRzICAgID0gMCwKKyAgICAgICAgLnZxX2luZGV4ZXNfYml0cyAgICAgID0gezYsIDcsIDcsIDcsIDV9LAorICAgICAgICAucGl0Y2hfZGVsYXlfYml0cyAgICAgPSB7OCwgNSwgOCwgNSwgNX0sCisgICAgICAgIC5ncF9pbmRleF9iaXRzICAgICAgICA9IDAsCisgICAgICAgIC5mY19pbmRleF9iaXRzICAgICAgICA9IHsxMH0sCisgICAgICAgIC5nY19pbmRleF9iaXRzICAgICAgICA9IDcKKyAgICB9Cit9OworCitjb25zdCBmbG9hdCBmZl9wb3dfMF81W10gPSB7CisgICAgMS4wLygxIDw8ICAxKSwgMS4wLygxIDw8ICAyKSwgMS4wLygxIDw8ICAzKSwgMS4wLygxIDw8ICA0KSwKKyAgICAxLjAvKDEgPDwgIDUpLCAxLjAvKDEgPDwgIDYpLCAxLjAvKDEgPDwgIDcpLCAxLjAvKDEgPDwgIDgpLAorICAgIDEuMC8oMSA8PCAgOSksIDEuMC8oMSA8PCAxMCksIDEuMC8oMSA8PCAxMSksIDEuMC8oMSA8PCAxMiksCisgICAgMS4wLygxIDw8IDEzKSwgMS4wLygxIDw8IDE0KSwgMS4wLygxIDw8IDE1KSwgMS4wLygxIDw8IDE2KQorfTsKKworc3RhdGljIHZvaWQgZGVxdWFudChmbG9hdCAqb3V0LCBjb25zdCBpbnQgKmlkeCwgY29uc3QgZmxvYXQgKiBjb25zdCBjYnNbXSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgc3RyaWRlICA9IDI7CisgICAgaW50IG51bV92ZWMgPSA1OworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV92ZWM7IGkrKykKKyAgICAgICAgbWVtY3B5KG91dCArIHN0cmlkZSppLCBjYnNbaV0gKyBzdHJpZGUqaWR4W2ldLCBzdHJpZGUqc2l6ZW9mKGZsb2F0KSk7CisKK30KKworc3RhdGljIHZvaWQgbHNmX2RlY29kZV9mcChmbG9hdCAqbHNmbmV3LCBmbG9hdCAqbHNmX2hpc3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpcHJQYXJhbWV0ZXJzICpwYXJtKQoreworICAgIGludCBpOworICAgIGZsb2F0IGxzZl90bXBbTFBfRklMVEVSX09SREVSXTsKKworICAgIGRlcXVhbnQobHNmX3RtcCwgcGFybS0+dnFfaW5kZXhlcywgbHNmX2NvZGVib29rcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBfRklMVEVSX09SREVSOyBpKyspCisgICAgICAgIGxzZm5ld1tpXSA9IGxzZl9oaXN0b3J5W2ldICogMC4zMyArIGxzZl90bXBbaV0gKyBtZWFuX2xzZltpXTsKKworICAgIGZmX3NvcnRfbmVhcmx5X3NvcnRlZF9mbG9hdHMobHNmbmV3LCBMUF9GSUxURVJfT1JERVIgLSAxKTsKKworICAgIC8qIE5vdGUgdGhhdCBhIG1pbmltdW0gZGlzdGFuY2UgaXMgbm90IGVuZm9yY2VkIGJldHdlZW4gdGhlIGxhc3QgdmFsdWUgYW5kCisgICAgICAgdGhlIHByZXZpb3VzIG9uZSwgY29udHJhcnkgdG8gd2hhdCBpcyBkb25lIGluIGZmX2FjZWxwX3Jlb3JkZXJfbHNmKCkgKi8KKyAgICBmZl9zZXRfbWluX2Rpc3RfbHNmKGxzZm5ldywgTFNGUV9ESUZGX01JTiwgTFBfRklMVEVSX09SREVSIC0gMSk7CisgICAgbHNmbmV3WzldID0gRkZNSU4obHNmbmV3W0xQX0ZJTFRFUl9PUkRFUiAtIDFdLCAxLjMgKiBNX1BJKTsKKworICAgIG1lbWNweShsc2ZfaGlzdG9yeSwgbHNmX3RtcCwgTFBfRklMVEVSX09SREVSICogc2l6ZW9mKCpsc2ZfaGlzdG9yeSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IExQX0ZJTFRFUl9PUkRFUiAtIDE7IGkrKykKKyAgICAgICAgbHNmbmV3W2ldID0gY29zKGxzZm5ld1tpXSk7CisgICAgbHNmbmV3W0xQX0ZJTFRFUl9PUkRFUiAtIDFdICo9IDYuMTUzODQ4IC8gTV9QSTsKK30KKworLyoqIEFwcGx5IHBpdGNoIGxhZyB0byB0aGUgZml4ZWQgdmVjdG9yIChBTVIgc2VjdGlvbiA2LjEuMikuICovCitzdGF0aWMgdm9pZCBwaXRjaF9zaGFycGVuaW5nKGludCBwaXRjaF9sYWdfaW50LCBmbG9hdCBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZml4ZWRfdmVjdG9yKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gcGl0Y2hfbGFnX2ludDsgaSA8IFNVQkZSX1NJWkU7IGkrKykKKyAgICAgICAgZml4ZWRfdmVjdG9yW2ldICs9IGJldGEgKiBmaXhlZF92ZWN0b3JbaSAtIHBpdGNoX2xhZ19pbnRdOworfQorCisvKioKKyAqIEV4dHJhY3QgZGVjb2RpbmcgcGFyYW1ldGVycyBmcm9tIHRoZSBpbnB1dCBiaXRzdHJlYW0uCisgKiBAcGFyYW0gcGFybXMgICAgICAgICAgcGFyYW1ldGVycyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwZ2IgICAgICAgICAgICBwb2ludGVyIHRvIGluaXRpYWxpemVkIEdldEJpdENvbnRleHQgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9wYXJhbWV0ZXJzKFNpcHJQYXJhbWV0ZXJzKiBwYXJtcywgR2V0Qml0Q29udGV4dCAqcGdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2lwck1vZGVQYXJhbSAqcCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGlmIChwLT5tYV9wcmVkaWN0b3JfYml0cykKKyAgICAgICAgcGFybXMtPm1hX3ByZWRfc3dpdGNoICAgICAgID0gZ2V0X2JpdHMocGdiLCBwLT5tYV9wcmVkaWN0b3JfYml0cyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICBwYXJtcy0+dnFfaW5kZXhlc1tpXSAgICAgICAgPSBnZXRfYml0cyhwZ2IsIHAtPnZxX2luZGV4ZXNfYml0c1tpXSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+c3ViZnJhbWVfY291bnQ7IGkrKykgeworICAgICAgICBwYXJtcy0+cGl0Y2hfZGVsYXlbaV0gICAgICAgPSBnZXRfYml0cyhwZ2IsIHAtPnBpdGNoX2RlbGF5X2JpdHNbaV0pOworICAgICAgICBpZiAocC0+Z3BfaW5kZXhfYml0cykKKyAgICAgICAgICAgIHBhcm1zLT5ncF9pbmRleFtpXSAgICAgID0gZ2V0X2JpdHMocGdiLCBwLT5ncF9pbmRleF9iaXRzKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcC0+bnVtYmVyX29mX2ZjX2luZGV4ZXM7IGorKykKKyAgICAgICAgICAgIHBhcm1zLT5mY19pbmRleGVzW2ldW2pdID0gZ2V0X2JpdHMocGdiLCBwLT5mY19pbmRleF9iaXRzW2pdKTsKKworICAgICAgICBwYXJtcy0+Z2NfaW5kZXhbaV0gICAgICAgICAgPSBnZXRfYml0cyhwZ2IsIHAtPmdjX2luZGV4X2JpdHMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2lwcl9kZWNvZGVfbHAoZmxvYXQgKmxzZm5ldywgY29uc3QgZmxvYXQgKmxzZm9sZCwgZmxvYXQgKkF6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9zdWJmcikKK3sKKyAgICBkb3VibGUgbHNmaW50W0xQX0ZJTFRFUl9PUkRFUl07CisgICAgaW50IGksajsKKyAgICBmbG9hdCB0LCB0MCA9IDEuMCAvIG51bV9zdWJmcjsKKworICAgIHQgPSB0MCAqIDAuNTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N1YmZyOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IExQX0ZJTFRFUl9PUkRFUjsgaisrKQorICAgICAgICAgICAgbHNmaW50W2pdID0gbHNmb2xkW2pdICogKDEgLSB0KSArIHQgKiBsc2ZuZXdbal07CisKKyAgICAgICAgZmZfYW1yd2JfbHNwMmxwYyhsc2ZpbnQsIEF6LCBMUF9GSUxURVJfT1JERVIpOworICAgICAgICBBeiArPSBMUF9GSUxURVJfT1JERVI7CisgICAgICAgIHQgKz0gdDA7CisgICAgfQorfQorCisvKioKKyAqIEV2YWx1YXRlIHRoZSBhZGFwdGl2ZSBpbXB1bHNlIHJlc3BvbnNlLgorICovCitzdGF0aWMgdm9pZCBldmFsX2lyKGNvbnN0IGZsb2F0ICpBeiwgaW50IHBpdGNoX2xhZywgZmxvYXQgKmZyZXEsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHBpdGNoX3NoYXJwX2ZhY3RvcikKK3sKKyAgICBmbG9hdCB0bXAxW1NVQkZSX1NJWkUrMV0sIHRtcDJbTFBfRklMVEVSX09SREVSKzFdOworICAgIGludCBpOworCisgICAgdG1wMVswXSA9IDEuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgICAgdG1wMVtpKzFdID0gQXpbaV0gKiBmZl9wb3dfMF81NVtpXTsKKyAgICAgICAgdG1wMltpICBdID0gQXpbaV0gKiBmZl9wb3dfMF83IFtpXTsKKyAgICB9CisgICAgbWVtc2V0KHRtcDEgKyAxMSwgMCwgMzcgKiBzaXplb2YoZmxvYXQpKTsKKworICAgIGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYoZnJlcSwgdG1wMiwgdG1wMSwgU1VCRlJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQX0ZJTFRFUl9PUkRFUik7CisKKyAgICBwaXRjaF9zaGFycGVuaW5nKHBpdGNoX2xhZywgcGl0Y2hfc2hhcnBfZmFjdG9yLCBmcmVxKTsKK30KKworLyoqCisgKiBFdmFsdWF0ZSB0aGUgY29udm9sdXRpb24gb2YgYSB2ZWN0b3Igd2l0aCBhIHNwYXJzZSB2ZWN0b3IuCisgKi8KK3N0YXRpYyB2b2lkIGNvbnZvbHV0ZV93aXRoX3NwYXJzZShmbG9hdCAqb3V0LCBjb25zdCBBTVJGaXhlZCAqcHVsc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzaGFwZSwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIG1lbXNldChvdXQsIDAsIGxlbmd0aCpzaXplb2YoZmxvYXQpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcHVsc2VzLT5uOyBpKyspCisgICAgICAgIGZvciAoaiA9IHB1bHNlcy0+eFtpXTsgaiA8IGxlbmd0aDsgaisrKQorICAgICAgICAgICAgb3V0W2pdICs9IHB1bHNlcy0+eVtpXSAqIHNoYXBlW2ogLSBwdWxzZXMtPnhbaV1dOworfQorCisvKioKKyAqIEFwcGx5IHBvc3RmaWx0ZXIsIHZlcnkgc2ltaWxhciB0byBBTVIgb25lLgorICovCitzdGF0aWMgdm9pZCBwb3N0ZmlsdGVyXzVrMChTaXByQ29udGV4dCAqY3R4LCBjb25zdCBmbG9hdCAqbHBjLCBmbG9hdCAqc2FtcGxlcykKK3sKKyAgICBmbG9hdCBidWZbU1VCRlJfU0laRSArIExQX0ZJTFRFUl9PUkRFUl07CisgICAgZmxvYXQgKnBvbGVfb3V0ID0gYnVmICsgTFBfRklMVEVSX09SREVSOworICAgIGZsb2F0IGxwY19uW0xQX0ZJTFRFUl9PUkRFUl07CisgICAgZmxvYXQgbHBjX2RbTFBfRklMVEVSX09SREVSXTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgICAgICBscGNfZFtpXSA9IGxwY1tpXSAqIGZmX3Bvd18wXzc1W2ldOworICAgICAgICBscGNfbltpXSA9IGxwY1tpXSAqIGZmX3Bvd18wXzUgW2ldOworICAgIH07CisKKyAgICBtZW1jcHkocG9sZV9vdXQgLSBMUF9GSUxURVJfT1JERVIsIGN0eC0+cG9zdGZpbHRlcl9tZW0sCisgICAgICAgICAgIExQX0ZJTFRFUl9PUkRFUipzaXplb2YoZmxvYXQpKTsKKworICAgIGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYocG9sZV9vdXQsIGxwY19kLCBzYW1wbGVzLCBTVUJGUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBfRklMVEVSX09SREVSKTsKKworICAgIG1lbWNweShjdHgtPnBvc3RmaWx0ZXJfbWVtLCBwb2xlX291dCArIFNVQkZSX1NJWkUgLSBMUF9GSUxURVJfT1JERVIsCisgICAgICAgICAgIExQX0ZJTFRFUl9PUkRFUipzaXplb2YoZmxvYXQpKTsKKworICAgIGZmX3RpbHRfY29tcGVuc2F0aW9uKCZjdHgtPnRpbHRfbWVtLCAwLjQsIHBvbGVfb3V0LCBTVUJGUl9TSVpFKTsKKworICAgIG1lbWNweShwb2xlX291dCAtIExQX0ZJTFRFUl9PUkRFUiwgY3R4LT5wb3N0ZmlsdGVyX21lbTVrMCwKKyAgICAgICAgICAgTFBfRklMVEVSX09SREVSKnNpemVvZigqcG9sZV9vdXQpKTsKKworICAgIG1lbWNweShjdHgtPnBvc3RmaWx0ZXJfbWVtNWswLCBwb2xlX291dCArIFNVQkZSX1NJWkUgLSBMUF9GSUxURVJfT1JERVIsCisgICAgICAgICAgIExQX0ZJTFRFUl9PUkRFUipzaXplb2YoKnBvbGVfb3V0KSk7CisKKyAgICBmZl9jZWxwX2xwX3plcm9fc3ludGhlc2lzX2ZpbHRlcmYoc2FtcGxlcywgbHBjX24sIHBvbGVfb3V0LCBTVUJGUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUF9GSUxURVJfT1JERVIpOworCit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9maXhlZF9zcGFyc2UoQU1SRml4ZWQgKmZpeGVkX3NwYXJzZSwgY29uc3QgaW50MTZfdCAqcHVsc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXByTW9kZSBtb2RlLCBpbnQgbG93X2dhaW4pCit7CisgICAgaW50IGk7CisKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIE1PREVfNms1OgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBmaXhlZF9zcGFyc2UtPnhbaV0gPSAzICogKHB1bHNlc1tpXSAmIDB4ZikgKyBpOworICAgICAgICAgICAgZml4ZWRfc3BhcnNlLT55W2ldID0gcHVsc2VzW2ldICYgMHgxMCA/IC0xIDogMTsKKyAgICAgICAgfQorICAgICAgICBmaXhlZF9zcGFyc2UtPm4gPSAzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfOGs1OgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBmaXhlZF9zcGFyc2UtPnhbMippICAgIF0gPSAzICogKChwdWxzZXNbaV0gPj4gNCkgJiAweGYpICsgaTsKKyAgICAgICAgICAgIGZpeGVkX3NwYXJzZS0+eFsyKmkgKyAxXSA9IDMgKiAoIHB1bHNlc1tpXSAgICAgICAmIDB4ZikgKyBpOworCisgICAgICAgICAgICBmaXhlZF9zcGFyc2UtPnlbMippICAgIF0gPSAocHVsc2VzW2ldICYgMHgxMDApID8gLTEuMDogMS4wOworCisgICAgICAgICAgICBmaXhlZF9zcGFyc2UtPnlbMippICsgMV0gPQorICAgICAgICAgICAgICAgIChmaXhlZF9zcGFyc2UtPnhbMippICsgMV0gPCBmaXhlZF9zcGFyc2UtPnhbMippXSkgPworICAgICAgICAgICAgICAgIC1maXhlZF9zcGFyc2UtPnlbMippICAgIF0gOiBmaXhlZF9zcGFyc2UtPnlbMippXTsKKyAgICAgICAgfQorCisgICAgICAgIGZpeGVkX3NwYXJzZS0+biA9IDY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV81azA6CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGxvd19nYWluKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKHB1bHNlc1swXSAmIDB4MjAwKSA/IDIgOiAwOworICAgICAgICAgICAgaW50IHZhbCA9IHB1bHNlc1swXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9ICh2YWwgJiAweDcpICogNiArIDQgLSBpKjI7CisKKyAgICAgICAgICAgICAgICBmaXhlZF9zcGFyc2UtPnlbaV0gPSAob2Zmc2V0ICsgaW5kZXgpICYgMHgzID8gLTEgOiAxOworICAgICAgICAgICAgICAgIGZpeGVkX3NwYXJzZS0+eFtpXSA9IGluZGV4OworCisgICAgICAgICAgICAgICAgdmFsID4+PSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZml4ZWRfc3BhcnNlLT5uID0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBwdWxzZV9zdWJzZXQgPSAocHVsc2VzWzBdID4+IDgpICYgMTsKKworICAgICAgICAgICAgZml4ZWRfc3BhcnNlLT54WzBdID0gKChwdWxzZXNbMF0gPj4gNCkgJiAxNSkgKiAzICsgcHVsc2Vfc3Vic2V0OworICAgICAgICAgICAgZml4ZWRfc3BhcnNlLT54WzFdID0gKCBwdWxzZXNbMF0gICAgICAgJiAxNSkgKiAzICsgcHVsc2Vfc3Vic2V0ICsgMTsKKworICAgICAgICAgICAgZml4ZWRfc3BhcnNlLT55WzBdID0gcHVsc2VzWzBdICYgMHgyMDAgPyAtMSA6IDE7CisgICAgICAgICAgICBmaXhlZF9zcGFyc2UtPnlbMV0gPSAtZml4ZWRfc3BhcnNlLT55WzBdOworICAgICAgICAgICAgZml4ZWRfc3BhcnNlLT5uID0gMjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9mcmFtZShTaXByQ29udGV4dCAqY3R4LCBTaXByUGFyYW1ldGVycyAqcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRfZGF0YSkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc3ViZnJhbWVfY291bnQgPSBtb2Rlc1tjdHgtPm1vZGVdLnN1YmZyYW1lX2NvdW50OworICAgIGludCBmcmFtZV9zaXplID0gc3ViZnJhbWVfY291bnQgKiBTVUJGUl9TSVpFOworICAgIGZsb2F0IEF6W0xQX0ZJTFRFUl9PUkRFUiAqIE1BWF9TVUJGUkFNRV9DT1VOVF07CisgICAgZmxvYXQgKmV4Y2l0YXRpb247CisgICAgZmxvYXQgaXJfYnVmW1NVQkZSX1NJWkUgKyBMUF9GSUxURVJfT1JERVJdOworICAgIGZsb2F0IGxzZl9uZXdbTFBfRklMVEVSX09SREVSXTsKKyAgICBmbG9hdCAqaW1wdWxzZV9yZXNwb25zZSA9IGlyX2J1ZiArIExQX0ZJTFRFUl9PUkRFUjsKKyAgICBmbG9hdCAqc3ludGggPSBjdHgtPnN5bnRoX2J1ZiArIDE2OyAvLyAxNiBpbnN0ZWFkIG9mIExQX0ZJTFRFUl9PUkRFUiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnkgYWxpZ25tZW50CisgICAgaW50IHQwX2ZpcnN0ID0gMDsKKyAgICBBTVJGaXhlZCBmaXhlZF9jYjsKKworICAgIG1lbXNldChpcl9idWYsIDAsIExQX0ZJTFRFUl9PUkRFUiAqIHNpemVvZihmbG9hdCkpOworICAgIGxzZl9kZWNvZGVfZnAobHNmX25ldywgY3R4LT5sc2ZfaGlzdG9yeSwgcGFyYW1zKTsKKworICAgIHNpcHJfZGVjb2RlX2xwKGxzZl9uZXcsIGN0eC0+bHNwX2hpc3RvcnksIEF6LCBzdWJmcmFtZV9jb3VudCk7CisKKyAgICBtZW1jcHkoY3R4LT5sc3BfaGlzdG9yeSwgbHNmX25ldywgTFBfRklMVEVSX09SREVSICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICBleGNpdGF0aW9uID0gY3R4LT5leGNpdGF0aW9uICsgUElUQ0hfREVMQVlfTUFYICsgTF9JTlRFUlBPTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzdWJmcmFtZV9jb3VudDsgaSsrKSB7CisgICAgICAgIGZsb2F0ICpwQXogPSBBeiArIGkqTFBfRklMVEVSX09SREVSOworICAgICAgICBmbG9hdCBmaXhlZF92ZWN0b3JbU1VCRlJfU0laRV07CisgICAgICAgIGludCBUMCxUMF9mcmFjOworICAgICAgICBmbG9hdCBwaXRjaF9nYWluLCBnYWluX2NvZGUsIGF2Z19lbmVyZ3k7CisKKyAgICAgICAgZmZfZGVjb2RlX3BpdGNoX2xhZygmVDAsICZUMF9mcmFjLCBwYXJhbXMtPnBpdGNoX2RlbGF5W2ldLCB0MF9maXJzdCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm1vZGUgPT0gTU9ERV81azAsIDYpOworCisgICAgICAgIGlmIChpID09IDAgfHwgKGkgPT0gMiAmJiBjdHgtPm1vZGUgPT0gTU9ERV81azApKQorICAgICAgICAgICAgdDBfZmlyc3QgPSBUMDsKKworICAgICAgICBmZl9hY2VscF9pbnRlcnBvbGF0ZWYoZXhjaXRhdGlvbiwgZXhjaXRhdGlvbiAtIFQwICsgKFQwX2ZyYWMgPD0gMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9iNjBfc2luYywgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiAoKDIgKyBUMF9mcmFjKSUzICsgMSksIExQX0ZJTFRFUl9PUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQkZSX1NJWkUpOworCisgICAgICAgIGRlY29kZV9maXhlZF9zcGFyc2UoJmZpeGVkX2NiLCBwYXJhbXMtPmZjX2luZGV4ZXNbaV0sIGN0eC0+bW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBhc3RfcGl0Y2hfZ2FpbiA8IDAuOCk7CisKKyAgICAgICAgZXZhbF9pcihwQXosIFQwLCBpbXB1bHNlX3Jlc3BvbnNlLCBtb2Rlc1tjdHgtPm1vZGVdLnBpdGNoX3NoYXJwX2ZhY3Rvcik7CisKKyAgICAgICAgY29udm9sdXRlX3dpdGhfc3BhcnNlKGZpeGVkX3ZlY3RvciwgJmZpeGVkX2NiLCBpbXB1bHNlX3Jlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCRlJfU0laRSk7CisKKyAgICAgICAgYXZnX2VuZXJneSA9ICgwLjAxICsgYXZwcml2X3NjYWxhcnByb2R1Y3RfZmxvYXRfYyhmaXhlZF92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQkZSX1NJWkUpKSAvCisgICAgICAgICAgICAgICAgICAgICBTVUJGUl9TSVpFOworCisgICAgICAgIGN0eC0+cGFzdF9waXRjaF9nYWluID0gcGl0Y2hfZ2FpbiA9IGdhaW5fY2JbcGFyYW1zLT5nY19pbmRleFtpXV1bMF07CisKKyAgICAgICAgZ2Fpbl9jb2RlID0gZmZfYW1yX3NldF9maXhlZF9nYWluKGdhaW5fY2JbcGFyYW1zLT5nY19pbmRleFtpXV1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfZW5lcmd5LCBjdHgtPmVuZXJneV9oaXN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQgLSAxNS4wLygwLjA1Kk1fTE4xMC9NX0xOMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkKTsKKworICAgICAgICBmZl93ZWlnaHRlZF92ZWN0b3Jfc3VtZihleGNpdGF0aW9uLCBleGNpdGF0aW9uLCBmaXhlZF92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoX2dhaW4sIGdhaW5fY29kZSwgU1VCRlJfU0laRSk7CisKKyAgICAgICAgcGl0Y2hfZ2FpbiAqPSAwLjUgKiBwaXRjaF9nYWluOworICAgICAgICBwaXRjaF9nYWluID0gRkZNSU4ocGl0Y2hfZ2FpbiwgMC40KTsKKworICAgICAgICBjdHgtPmdhaW5fbWVtID0gMC43ICogY3R4LT5nYWluX21lbSArIDAuMyAqIHBpdGNoX2dhaW47CisgICAgICAgIGN0eC0+Z2Fpbl9tZW0gPSBGRk1JTihjdHgtPmdhaW5fbWVtLCBwaXRjaF9nYWluKTsKKyAgICAgICAgZ2Fpbl9jb2RlICo9IGN0eC0+Z2Fpbl9tZW07CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFNVQkZSX1NJWkU7IGorKykKKyAgICAgICAgICAgIGZpeGVkX3ZlY3RvcltqXSA9IGV4Y2l0YXRpb25bal0gLSBnYWluX2NvZGUgKiBmaXhlZF92ZWN0b3Jbal07CisKKyAgICAgICAgaWYgKGN0eC0+bW9kZSA9PSBNT0RFXzVrMCkgeworICAgICAgICAgICAgcG9zdGZpbHRlcl81azAoY3R4LCBwQXosIGZpeGVkX3ZlY3Rvcik7CisKKyAgICAgICAgICAgIGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYoY3R4LT5wb3N0ZmlsdGVyX3N5bjVrMCArIExQX0ZJTFRFUl9PUkRFUiArIGkqU1VCRlJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF6LCBleGNpdGF0aW9uLCBTVUJGUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUF9GSUxURVJfT1JERVIpOworICAgICAgICB9CisKKyAgICAgICAgZmZfY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZihzeW50aCArIGkqU1VCRlJfU0laRSwgcEF6LCBmaXhlZF92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCRlJfU0laRSwgTFBfRklMVEVSX09SREVSKTsKKworICAgICAgICBleGNpdGF0aW9uICs9IFNVQkZSX1NJWkU7CisgICAgfQorCisgICAgbWVtY3B5KHN5bnRoIC0gTFBfRklMVEVSX09SREVSLCBzeW50aCArIGZyYW1lX3NpemUgLSBMUF9GSUxURVJfT1JERVIsCisgICAgICAgICAgIExQX0ZJTFRFUl9PUkRFUiAqIHNpemVvZihmbG9hdCkpOworCisgICAgaWYgKGN0eC0+bW9kZSA9PSBNT0RFXzVrMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ViZnJhbWVfY291bnQ7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgZW5lcmd5ID0gYXZwcml2X3NjYWxhcnByb2R1Y3RfZmxvYXRfYyhjdHgtPnBvc3RmaWx0ZXJfc3luNWswICsgTFBfRklMVEVSX09SREVSICsgaSAqIFNVQkZSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cG9zdGZpbHRlcl9zeW41azAgKyBMUF9GSUxURVJfT1JERVIgKyBpICogU1VCRlJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCRlJfU0laRSk7CisgICAgICAgICAgICBmZl9hZGFwdGl2ZV9nYWluX2NvbnRyb2woJnN5bnRoW2kgKiBTVUJGUl9TSVpFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ludGhbaSAqIFNVQkZSX1NJWkVdLCBlbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCRlJfU0laRSwgMC45LCAmY3R4LT5wb3N0ZmlsdGVyX2FnYyk7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoY3R4LT5wb3N0ZmlsdGVyX3N5bjVrMCwgY3R4LT5wb3N0ZmlsdGVyX3N5bjVrMCArIGZyYW1lX3NpemUsCisgICAgICAgICAgICAgICBMUF9GSUxURVJfT1JERVIqc2l6ZW9mKGZsb2F0KSk7CisgICAgfQorICAgIG1lbW1vdmUoY3R4LT5leGNpdGF0aW9uLCBleGNpdGF0aW9uIC0gUElUQ0hfREVMQVlfTUFYIC0gTF9JTlRFUlBPTCwKKyAgICAgICAgICAgKFBJVENIX0RFTEFZX01BWCArIExfSU5URVJQT0wpICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICBmZl9hY2VscF9hcHBseV9vcmRlcl8yX3RyYW5zZmVyX2Z1bmN0aW9uKG91dF9kYXRhLCBzeW50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdFsyXSkgey0xLjk5OTk3ICAgLCAxLjAwMDAwMDAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXRbMl0pIHstMS45MzMwNzM1MiwgMC45MzU4OTE5ODZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45Mzk4MDU4MDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmhpZ2hwYXNzX2ZpbHRfbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfc2l6ZSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBzaXByX2RlY29kZXJfaW5pdChBVkNvZGVjQ29udGV4dCAqIGF2Y3R4KQoreworICAgIFNpcHJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgc3dpdGNoIChhdmN0eC0+YmxvY2tfYWxpZ24pIHsKKyAgICBjYXNlIDIwOiBjdHgtPm1vZGUgPSBNT0RFXzE2azsgYnJlYWs7CisgICAgY2FzZSAxOTogY3R4LT5tb2RlID0gTU9ERV84azU7IGJyZWFrOworICAgIGNhc2UgMjk6IGN0eC0+bW9kZSA9IE1PREVfNms1OyBicmVhazsKKyAgICBjYXNlIDM3OiBjdHgtPm1vZGUgPSBNT0RFXzVrMDsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgICAgICAoYXZjdHgtPmJpdF9yYXRlID4gMTIyMDApIGN0eC0+bW9kZSA9IE1PREVfMTZrOworICAgICAgICBlbHNlIGlmIChhdmN0eC0+Yml0X3JhdGUgPiA3NTAwICkgY3R4LT5tb2RlID0gTU9ERV84azU7CisgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA+IDU3NTAgKSBjdHgtPm1vZGUgPSBNT0RFXzZrNTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bW9kZSA9IE1PREVfNWswOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkludmFsaWQgYmxvY2tfYWxpZ246ICVkLiBNb2RlICVzIGd1ZXNzZWQgYmFzZWQgb24gYml0cmF0ZTogJWRcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+YmxvY2tfYWxpZ24sIG1vZGVzW2N0eC0+bW9kZV0ubW9kZV9uYW1lLCBhdmN0eC0+Yml0X3JhdGUpOworICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiTW9kZTogJXNcbiIsIG1vZGVzW2N0eC0+bW9kZV0ubW9kZV9uYW1lKTsKKworICAgIGlmIChjdHgtPm1vZGUgPT0gTU9ERV8xNmspIHsKKyAgICAgICAgZmZfc2lwcl9pbml0XzE2ayhjdHgpOworICAgICAgICBjdHgtPmRlY29kZV9mcmFtZSA9IGZmX3NpcHJfZGVjb2RlX2ZyYW1lXzE2azsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPmRlY29kZV9mcmFtZSA9IGRlY29kZV9mcmFtZTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBfRklMVEVSX09SREVSOyBpKyspCisgICAgICAgIGN0eC0+bHNwX2hpc3RvcnlbaV0gPSBjb3MoKGkrMSkgKiBNX1BJIC8gKExQX0ZJTFRFUl9PUkRFUiArIDEpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGN0eC0+ZW5lcmd5X2hpc3RvcnlbaV0gPSAtMTQ7CisKKyAgICBhdmN0eC0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIGF2Y3R4LT5zYW1wbGVfZm10ICAgICA9IEFWX1NBTVBMRV9GTVRfRkxUOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lwcl9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBTaXByQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWY9YXZwa3QtPmRhdGE7CisgICAgU2lwclBhcmFtZXRlcnMgcGFybTsKKyAgICBjb25zdCBTaXByTW9kZVBhcmFtICptb2RlX3BhciA9ICZtb2Rlc1tjdHgtPm1vZGVdOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgZmxvYXQgKnNhbXBsZXM7CisgICAgaW50IHN1YmZyYW1lX3NpemUgPSBjdHgtPm1vZGUgPT0gTU9ERV8xNmsgPyBMX1NVQkZSXzE2ayA6IFNVQkZSX1NJWkU7CisgICAgaW50IGksIHJldDsKKworICAgIGN0eC0+YXZjdHggPSBhdmN0eDsKKyAgICBpZiAoYXZwa3QtPnNpemUgPCAobW9kZV9wYXItPmJpdHNfcGVyX2ZyYW1lID4+IDMpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkVycm9yIHByb2Nlc3NpbmcgcGFja2V0OiBwYWNrZXQgc2l6ZSAoJWQpIHRvbyBzbWFsbFxuIiwKKyAgICAgICAgICAgICAgIGF2cGt0LT5zaXplKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBtb2RlX3Bhci0+ZnJhbWVzX3Blcl9wYWNrZXQgKiBzdWJmcmFtZV9zaXplICoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfcGFyLT5zdWJmcmFtZV9jb3VudDsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHNhbXBsZXMgPSAoZmxvYXQgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIG1vZGVfcGFyLT5iaXRzX3Blcl9mcmFtZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW9kZV9wYXItPmZyYW1lc19wZXJfcGFja2V0OyBpKyspIHsKKyAgICAgICAgZGVjb2RlX3BhcmFtZXRlcnMoJnBhcm0sICZnYiwgbW9kZV9wYXIpOworCisgICAgICAgIGN0eC0+ZGVjb2RlX2ZyYW1lKGN0eCwgJnBhcm0sIHNhbXBsZXMpOworCisgICAgICAgIHNhbXBsZXMgKz0gc3ViZnJhbWVfc2l6ZSAqIG1vZGVfcGFyLT5zdWJmcmFtZV9jb3VudDsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gbW9kZV9wYXItPmJpdHNfcGVyX2ZyYW1lID4+IDM7Cit9CisKK0FWQ29kZWMgZmZfc2lwcl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzaXByIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVhbEF1ZGlvIFNJUFIgLyBBQ0VMUC5ORVQiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU0lQUiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU2lwckNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHNpcHJfZGVjb2Rlcl9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IHNpcHJfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc2lwci5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvc2lwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjdmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zaXByLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBTSVBSIC8gQUNFTFAuTkVUIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICogQ29weXJpZ2h0IChjKSAyMDA5IFZpdG9yIFNlc3NhaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfU0lQUl9ICisjZGVmaW5lIEFWQ09ERUNfU0lQUl9ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYWNlbHBfcGl0Y2hfZGVsYXkuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNkZWZpbmUgTFBfRklMVEVSX09SREVSXzE2ayAgMTYKKyNkZWZpbmUgTF9TVUJGUl8xNmsgICAgICAgICAgODAKKyNkZWZpbmUgUElUQ0hfTUlOICAgICAgICAgICAgMzAKKyNkZWZpbmUgUElUQ0hfTUFYICAgICAgICAgICAgMjgxCisKKyNkZWZpbmUgTFNGUV9ESUZGX01JTiAgICAgICAgKDAuMDEyNSAqIE1fUEkpCisKKyNkZWZpbmUgTFBfRklMVEVSX09SREVSICAgICAgMTAKKworLyoqIE51bWJlciBvZiBwYXN0IHNhbXBsZXMgbmVlZGVkIGZvciBleGNpdGF0aW9uIGludGVycG9sYXRpb24gKi8KKyNkZWZpbmUgTF9JTlRFUlBPTCAgICAgICAgICAgKExQX0ZJTFRFUl9PUkRFUiArIDEpCisKKy8qKiAgU3ViZnJhbWUgc2l6ZSBmb3IgYWxsIG1vZGVzIGV4Y2VwdCAxNmsgKi8KKyNkZWZpbmUgU1VCRlJfU0laRSAgICAgICAgICAgNDgKKworI2RlZmluZSBTVUJGUkFNRV9DT1VOVF8xNmsgICAyCisKK3R5cGVkZWYgZW51bSB7CisgICAgTU9ERV8xNmssCisgICAgTU9ERV84azUsCisgICAgTU9ERV82azUsCisgICAgTU9ERV81azAsCisgICAgTU9ERV9DT1VOVAorfSBTaXByTW9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgU2lwclBhcmFtZXRlcnMgeworICAgIGludCBtYV9wcmVkX3N3aXRjaDsgICAgICAgIC8vLzwgc3dpdGNoZWQgbW92aW5nIGF2ZXJhZ2UgcHJlZGljdG9yCisgICAgaW50IHZxX2luZGV4ZXNbNV07CisgICAgaW50IHBpdGNoX2RlbGF5WzVdOyAgICAgICAgLy8vPCBwaXRjaCBkZWxheQorICAgIGludCBncF9pbmRleFs1XTsgICAgICAgICAgIC8vLzwgYWRhcHRpdmUtY29kZWJvb2sgZ2FpbiBpbmRleGVzCisgICAgaW50MTZfdCBmY19pbmRleGVzWzVdWzEwXTsgLy8vPCBmaXhlZC1jb2RlYm9vayBpbmRleGVzCisgICAgaW50IGdjX2luZGV4WzVdOyAgICAgICAgICAgLy8vPCBmaXhlZC1jb2RlYm9vayBnYWluIGluZGV4ZXMKK30gU2lwclBhcmFtZXRlcnM7CisKK3R5cGVkZWYgc3RydWN0IFNpcHJDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisKKyAgICBTaXByTW9kZSBtb2RlOworCisgICAgZmxvYXQgcGFzdF9waXRjaF9nYWluOworICAgIGZsb2F0IGxzZl9oaXN0b3J5W0xQX0ZJTFRFUl9PUkRFUl8xNmtdOworCisgICAgZmxvYXQgZXhjaXRhdGlvbltMX0lOVEVSUE9MICsgUElUQ0hfTUFYICsgMiAqIExfU1VCRlJfMTZrXTsKKworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgZmxvYXQsIHN5bnRoX2J1ZilbTFBfRklMVEVSX09SREVSICsgNSpTVUJGUl9TSVpFICsgNl07CisKKyAgICBmbG9hdCBsc3BfaGlzdG9yeVtMUF9GSUxURVJfT1JERVJdOworICAgIGZsb2F0IGdhaW5fbWVtOworICAgIGZsb2F0IGVuZXJneV9oaXN0b3J5WzRdOworICAgIGZsb2F0IGhpZ2hwYXNzX2ZpbHRfbWVtWzJdOworICAgIGZsb2F0IHBvc3RmaWx0ZXJfbWVtW1BJVENIX0RFTEFZX01BWCArIExQX0ZJTFRFUl9PUkRFUl07CisKKyAgICAvKiA1azAgKi8KKyAgICBmbG9hdCB0aWx0X21lbTsKKyAgICBmbG9hdCBwb3N0ZmlsdGVyX2FnYzsKKyAgICBmbG9hdCBwb3N0ZmlsdGVyX21lbTVrMFtQSVRDSF9ERUxBWV9NQVggKyBMUF9GSUxURVJfT1JERVJdOworICAgIGZsb2F0IHBvc3RmaWx0ZXJfc3luNWswW0xQX0ZJTFRFUl9PUkRFUiArIFNVQkZSX1NJWkUqNV07CisKKyAgICAvKiAxNmsgKi8KKyAgICBpbnQgcGl0Y2hfbGFnX3ByZXY7CisgICAgZmxvYXQgaWlyX21lbVtMUF9GSUxURVJfT1JERVJfMTZrKzFdOworICAgIGZsb2F0IGZpbHRfYnVmWzJdW0xQX0ZJTFRFUl9PUkRFUl8xNmsrMV07CisgICAgZmxvYXQgKmZpbHRfbWVtWzJdOworICAgIGZsb2F0IG1lbV9wcmVlbXBoW0xQX0ZJTFRFUl9PUkRFUl8xNmtdOworICAgIGZsb2F0IHN5bnRoW0xQX0ZJTFRFUl9PUkRFUl8xNmtdOworICAgIGRvdWJsZSBsc3BfaGlzdG9yeV8xNmtbMTZdOworCisgICAgdm9pZCAoKmRlY29kZV9mcmFtZSkoc3RydWN0IFNpcHJDb250ZXh0ICpjdHgsIFNpcHJQYXJhbWV0ZXJzICpwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm91dF9kYXRhKTsKK30gU2lwckNvbnRleHQ7CisKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9wb3dfMF81WzE2XTsKKwordm9pZCBmZl9zaXByX2luaXRfMTZrKFNpcHJDb250ZXh0ICpjdHgpOworCit2b2lkIGZmX3NpcHJfZGVjb2RlX2ZyYW1lXzE2ayhTaXByQ29udGV4dCAqY3R4LCBTaXByUGFyYW1ldGVycyAqcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm91dF9kYXRhKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfU0lQUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zaXByMTZrLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9zaXByMTZrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4ZjY4NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NpcHIxNmsuYwpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIFNJUFIgZGVjb2RlciBmb3IgdGhlIDE2ayBtb2RlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFZsYWRpbWlyIFZvcm9zaGlsb3YKKyAqIENvcHlyaWdodCAoYykgMjAwOSBWaXRvciBTZXNzYWsKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgInNpcHIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibHNwLmgiCisjaW5jbHVkZSAiYWNlbHBfdmVjdG9ycy5oIgorI2luY2x1ZGUgImFjZWxwX3BpdGNoX2RlbGF5LmgiCisjaW5jbHVkZSAiYWNlbHBfZmlsdGVycy5oIgorI2luY2x1ZGUgImNlbHBfZmlsdGVycy5oIgorCisjaW5jbHVkZSAic2lwcjE2a2RhdGEuaCIKKworLyoqCisgKiBDb252ZXJ0IGFuIGxzZiB2ZWN0b3IgaW50byBhbiBsc3AgdmVjdG9yLgorICoKKyAqIEBwYXJhbSBsc2YgICAgICAgICAgICAgICBpbnB1dCBsc2YgdmVjdG9yCisgKiBAcGFyYW0gbHNwICAgICAgICAgICAgICAgb3V0cHV0IGxzcCB2ZWN0b3IKKyAqLworc3RhdGljIHZvaWQgbHNmMmxzcChjb25zdCBmbG9hdCAqbHNmLCBkb3VibGUgKmxzcCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMUF9GSUxURVJfT1JERVJfMTZrOyBpKyspCisgICAgICAgIGxzcFtpXSA9IGNvc2YobHNmW2ldKTsKK30KKworc3RhdGljIHZvaWQgZGVxdWFudChmbG9hdCAqb3V0LCBjb25zdCBpbnQgKmlkeCwgY29uc3QgZmxvYXQgKiBjb25zdCBjYnNbXSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIG1lbWNweShvdXQgKyAzKmksIGNic1tpXSArIDMqaWR4W2ldLCAzKnNpemVvZihmbG9hdCkpOworCisgICAgbWVtY3B5KG91dCArIDEyLCBjYnNbNF0gKyA0KmlkeFs0XSwgNCpzaXplb2YoZmxvYXQpKTsKK30KKworc3RhdGljIHZvaWQgbHNmX2RlY29kZV9mcF8xNmsoZmxvYXQqIGxzZl9oaXN0b3J5LCBmbG9hdCogaXNwX25ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogcGFybSwgaW50IG1hX3ByZWQpCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgaXNwX3FbTFBfRklMVEVSX09SREVSXzE2a107CisKKyAgICBkZXF1YW50KGlzcF9xLCBwYXJtLCBsc2ZfY29kZWJvb2tzXzE2ayk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBfRklMVEVSX09SREVSXzE2azsgaSsrKSB7CisgICAgICAgIGlzcF9uZXdbaV0gPSAoMSAtIHF1W21hX3ByZWRdKSAqIGlzcF9xW2ldCisgICAgICAgICAgICAgICAgICAgICsgICAgIHF1W21hX3ByZWRdICAqIGxzZl9oaXN0b3J5W2ldCisgICAgICAgICAgICAgICAgICAgICsgbWVhbl9sc2ZfMTZrW2ldOworICAgIH0KKworICAgIG1lbWNweShsc2ZfaGlzdG9yeSwgaXNwX3EsIExQX0ZJTFRFUl9PUkRFUl8xNmsgKiBzaXplb2YoZmxvYXQpKTsKK30KKworc3RhdGljIGludCBkZWNfZGVsYXkzXzFzdChpbnQgaW5kZXgpCit7CisgICAgaWYgKGluZGV4IDwgMzkwKSB7CisgICAgICAgIHJldHVybiBpbmRleCArIDg4OworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gMyAqIGluZGV4IC0gNjkwOworfQorCitzdGF0aWMgaW50IGRlY19kZWxheTNfMm5kKGludCBpbmRleCwgaW50IHBpdF9taW4sIGludCBwaXRfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfbGFnX3ByZXYpCit7CisgICAgaWYgKGluZGV4IDwgNjIpIHsKKyAgICAgICAgaW50IHBpdGNoX2RlbGF5X21pbiA9IGF2X2NsaXAocGl0Y2hfbGFnX3ByZXYgLSAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0X21pbiwgcGl0X21heCAtIDE5KTsKKyAgICAgICAgcmV0dXJuIDMgKiBwaXRjaF9kZWxheV9taW4gKyBpbmRleCAtIDI7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiAzICogcGl0Y2hfbGFnX3ByZXY7Cit9CisKK3N0YXRpYyB2b2lkIHBvc3RmaWx0ZXIoZmxvYXQgKm91dF9kYXRhLCBmbG9hdCogc3ludGgsIGZsb2F0KiBpaXJfbWVtLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmlsdF9tZW1bMl0sIGZsb2F0KiBtZW1fcHJlZW1waCkKK3sKKyAgICBmbG9hdCBidWZbMzAgKyBMUF9GSUxURVJfT1JERVJfMTZrXTsKKyAgICBmbG9hdCAqdG1wYnVmID0gYnVmICsgTFBfRklMVEVSX09SREVSXzE2azsKKyAgICBmbG9hdCBzOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IExQX0ZJTFRFUl9PUkRFUl8xNms7IGkrKykKKyAgICAgICAgZmlsdF9tZW1bMF1baV0gPSBpaXJfbWVtW2ldICogZmZfcG93XzBfNVtpXTsKKworICAgIG1lbWNweSh0bXBidWYgLSBMUF9GSUxURVJfT1JERVJfMTZrLCBtZW1fcHJlZW1waCwKKyAgICAgICAgICAgTFBfRklMVEVSX09SREVSXzE2aypzaXplb2YoKmJ1ZikpOworCisgICAgZmZfY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZih0bXBidWYsIGZpbHRfbWVtWzFdLCBzeW50aCwgMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUF9GSUxURVJfT1JERVJfMTZrKTsKKworICAgIG1lbWNweShzeW50aCAtIExQX0ZJTFRFUl9PUkRFUl8xNmssIG1lbV9wcmVlbXBoLAorICAgICAgICAgICBMUF9GSUxURVJfT1JERVJfMTZrICogc2l6ZW9mKCpzeW50aCkpOworCisgICAgZmZfY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZihzeW50aCwgZmlsdF9tZW1bMF0sIHN5bnRoLCAzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQX0ZJTFRFUl9PUkRFUl8xNmspOworCisgICAgbWVtY3B5KG91dF9kYXRhICsgMzAgLSBMUF9GSUxURVJfT1JERVJfMTZrLAorICAgICAgICAgICBzeW50aCAgICArIDMwIC0gTFBfRklMVEVSX09SREVSXzE2aywKKyAgICAgICAgICAgTFBfRklMVEVSX09SREVSXzE2ayAqIHNpemVvZigqc3ludGgpKTsKKworICAgIGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYob3V0X2RhdGEgKyAzMCwgZmlsdF9tZW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aCArIDMwLCAyICogTF9TVUJGUl8xNmsgLSAzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQX0ZJTFRFUl9PUkRFUl8xNmspOworCisKKyAgICBtZW1jcHkobWVtX3ByZWVtcGgsIG91dF9kYXRhICsgMipMX1NVQkZSXzE2ayAtIExQX0ZJTFRFUl9PUkRFUl8xNmssCisgICAgICAgICAgIExQX0ZJTFRFUl9PUkRFUl8xNmsgKiBzaXplb2YoKnN5bnRoKSk7CisKKyAgICBGRlNXQVAoZmxvYXQgKiwgZmlsdF9tZW1bMF0sIGZpbHRfbWVtWzFdKTsKKyAgICBmb3IgKGkgPSAwLCBzID0gMDsgaSA8IDMwOyBpKyssIHMgKz0gMS4wLzMwKQorICAgICAgICBvdXRfZGF0YVtpXSA9IHRtcGJ1ZltpXSArIHMgKiAoc3ludGhbaV0gLSB0bXBidWZbaV0pOworfQorCisvKioKKyAqIEZsb2F0aW5nIHBvaW50IHZlcnNpb24gb2YgZmZfYWNlbHBfbHBfZGVjb2RlKCkuCisgKi8KK3N0YXRpYyB2b2lkIGFjZWxwX2xwX2RlY29kZWYoZmxvYXQgKmxwXzFzdCwgZmxvYXQgKmxwXzJuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlICpsc3BfMm5kLCBjb25zdCBkb3VibGUgKmxzcF9wcmV2KQoreworICAgIGRvdWJsZSBsc3BfMXN0W0xQX0ZJTFRFUl9PUkRFUl8xNmtdOworICAgIGludCBpOworCisgICAgLyogTFNQIHZhbHVlcyBmb3IgZmlyc3Qgc3ViZnJhbWUgKDMuMi41IG9mIEcuNzI5LCBFcXVhdGlvbiAyNCkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBfRklMVEVSX09SREVSXzE2azsgaSsrKQorICAgICAgICBsc3BfMXN0W2ldID0gKGxzcF8ybmRbaV0gKyBsc3BfcHJldltpXSkgKiAwLjU7CisKKyAgICBmZl9hY2VscF9sc3BkMmxwYyhsc3BfMXN0LCBscF8xc3QsIExQX0ZJTFRFUl9PUkRFUl8xNmsgPj4gMSk7CisKKyAgICAvKiBMU1AgdmFsdWVzIGZvciBzZWNvbmQgc3ViZnJhbWUgKDMuMi41IG9mIEcuNzI5KSAqLworICAgIGZmX2FjZWxwX2xzcGQybHBjKGxzcF8ybmQsIGxwXzJuZCwgTFBfRklMVEVSX09SREVSXzE2ayA+PiAxKTsKK30KKworLyoqCisgKiBGbG9hdGluZyBwb2ludCB2ZXJzaW9uIG9mIGZmX2FjZWxwX2RlY29kZV9nYWluX2NvZGUoKS4KKyAqLworc3RhdGljIGZsb2F0IGFjZWxwX2RlY29kZV9nYWluX2NvZGVmKGZsb2F0IGdhaW5fY29ycl9mYWN0b3IsIGNvbnN0IGZsb2F0ICpmY192LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1yX2VuZXJneSwgY29uc3QgZmxvYXQgKnF1YW50X2VuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbWFfcHJlZGljdGlvbl9jb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViZnJhbWVfc2l6ZSwgaW50IG1hX3ByZWRfb3JkZXIpCit7CisgICAgbXJfZW5lcmd5ICs9IGF2cHJpdl9zY2FsYXJwcm9kdWN0X2Zsb2F0X2MocXVhbnRfZW5lcmd5LCBtYV9wcmVkaWN0aW9uX2NvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hX3ByZWRfb3JkZXIpOworCisgICAgbXJfZW5lcmd5ID0gZ2Fpbl9jb3JyX2ZhY3RvciAqIGV4cChNX0xOMTAgLyAyMC4gKiBtcl9lbmVyZ3kpIC8KKyAgICAgICAgc3FydCgoMC4wMSArIGF2cHJpdl9zY2FsYXJwcm9kdWN0X2Zsb2F0X2MoZmNfdiwgZmNfdiwgc3ViZnJhbWVfc2l6ZSkpKTsKKyAgICByZXR1cm4gbXJfZW5lcmd5OworfQorCisjZGVmaW5lIERJVklERV9CWV8zKHgpICgoeCkgKiAxMDkyMyA+PiAxNSkKKwordm9pZCBmZl9zaXByX2RlY29kZV9mcmFtZV8xNmsoU2lwckNvbnRleHQgKmN0eCwgU2lwclBhcmFtZXRlcnMgKnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRfZGF0YSkKK3sKKyAgICBpbnQgZnJhbWVfc2l6ZSA9IFNVQkZSQU1FX0NPVU5UXzE2ayAqIExfU1VCRlJfMTZrOworICAgIGZsb2F0ICpzeW50aCA9IGN0eC0+c3ludGhfYnVmICsgTFBfRklMVEVSX09SREVSXzE2azsKKyAgICBmbG9hdCBsc2ZfbmV3W0xQX0ZJTFRFUl9PUkRFUl8xNmtdOworICAgIGRvdWJsZSBsc3BfbmV3W0xQX0ZJTFRFUl9PUkRFUl8xNmtdOworICAgIGZsb2F0IEF6WzJdW0xQX0ZJTFRFUl9PUkRFUl8xNmtdOworICAgIGZsb2F0IGZpeGVkX3ZlY3RvcltMX1NVQkZSXzE2a107CisgICAgZmxvYXQgcGl0Y2hfZmFjLCBnYWluX2NvZGU7CisKKyAgICBpbnQgaTsKKyAgICBpbnQgcGl0Y2hfZGVsYXlfM3g7CisKKyAgICBmbG9hdCAqZXhjaXRhdGlvbiA9IGN0eC0+ZXhjaXRhdGlvbiArIDI5MjsKKworICAgIGxzZl9kZWNvZGVfZnBfMTZrKGN0eC0+bHNmX2hpc3RvcnksIGxzZl9uZXcsIHBhcmFtcy0+dnFfaW5kZXhlcywKKyAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPm1hX3ByZWRfc3dpdGNoKTsKKworICAgIGZmX3NldF9taW5fZGlzdF9sc2YobHNmX25ldywgTFNGUV9ESUZGX01JTiAvIDIsIExQX0ZJTFRFUl9PUkRFUl8xNmspOworCisgICAgbHNmMmxzcChsc2ZfbmV3LCBsc3BfbmV3KTsKKworICAgIGFjZWxwX2xwX2RlY29kZWYoQXpbMF0sIEF6WzFdLCBsc3BfbmV3LCBjdHgtPmxzcF9oaXN0b3J5XzE2ayk7CisKKyAgICBtZW1jcHkoY3R4LT5sc3BfaGlzdG9yeV8xNmssIGxzcF9uZXcsIExQX0ZJTFRFUl9PUkRFUl8xNmsgKiBzaXplb2YoZG91YmxlKSk7CisKKyAgICBtZW1jcHkoc3ludGggLSBMUF9GSUxURVJfT1JERVJfMTZrLCBjdHgtPnN5bnRoLAorICAgICAgICAgICBMUF9GSUxURVJfT1JERVJfMTZrICogc2l6ZW9mKCpzeW50aCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IFNVQkZSQU1FX0NPVU5UXzE2azsgaSsrKSB7CisgICAgICAgIGludCBpX3N1YmZyID0gaSAqIExfU1VCRlJfMTZrOworICAgICAgICBBTVJGaXhlZCBmOworICAgICAgICBmbG9hdCBnYWluX2NvcnJfZmFjdG9yOworICAgICAgICBpbnQgcGl0Y2hfZGVsYXlfaW50OworICAgICAgICBpbnQgcGl0Y2hfZGVsYXlfZnJhYzsKKworICAgICAgICBpZiAoIWkpIHsKKyAgICAgICAgICAgIHBpdGNoX2RlbGF5XzN4ID0gZGVjX2RlbGF5M18xc3QocGFyYW1zLT5waXRjaF9kZWxheVtpXSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcGl0Y2hfZGVsYXlfM3ggPSBkZWNfZGVsYXkzXzJuZChwYXJhbXMtPnBpdGNoX2RlbGF5W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVRDSF9NSU4sIFBJVENIX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5waXRjaF9sYWdfcHJldik7CisKKyAgICAgICAgcGl0Y2hfZmFjID0gZ2Fpbl9waXRjaF9jYl8xNmtbcGFyYW1zLT5ncF9pbmRleFtpXV07CisgICAgICAgIGYucGl0Y2hfZmFjID0gRkZNSU4ocGl0Y2hfZmFjLCAxLjApOworICAgICAgICBmLnBpdGNoX2xhZyA9IERJVklERV9CWV8zKHBpdGNoX2RlbGF5XzN4KzEpOworICAgICAgICBjdHgtPnBpdGNoX2xhZ19wcmV2ID0gZi5waXRjaF9sYWc7CisKKyAgICAgICAgcGl0Y2hfZGVsYXlfaW50ICA9IERJVklERV9CWV8zKHBpdGNoX2RlbGF5XzN4ICsgMik7CisgICAgICAgIHBpdGNoX2RlbGF5X2ZyYWMgPSBwaXRjaF9kZWxheV8zeCArIDIgLSAzKnBpdGNoX2RlbGF5X2ludDsKKworICAgICAgICBmZl9hY2VscF9pbnRlcnBvbGF0ZWYoJmV4Y2l0YXRpb25baV9zdWJmcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhjaXRhdGlvbltpX3N1YmZyXSAtIHBpdGNoX2RlbGF5X2ludCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5jX3dpbiwgMywgcGl0Y2hfZGVsYXlfZnJhYyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUF9GSUxURVJfT1JERVIsIExfU1VCRlJfMTZrKTsKKworCisgICAgICAgIG1lbXNldChmaXhlZF92ZWN0b3IsIDAsIHNpemVvZihmaXhlZF92ZWN0b3IpKTsKKworICAgICAgICBmZl9kZWNvZGVfMTBfcHVsc2VzXzM1Yml0cyhwYXJhbXMtPmZjX2luZGV4ZXNbaV0sICZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9mY180cHVsc2VzXzhiaXRzX3RyYWNrc18xMywgNSwgNCk7CisKKyAgICAgICAgZmZfc2V0X2ZpeGVkX3ZlY3RvcihmaXhlZF92ZWN0b3IsICZmLCAxLjAsIExfU1VCRlJfMTZrKTsKKworICAgICAgICBnYWluX2NvcnJfZmFjdG9yID0gZ2Fpbl9jYl8xNmtbcGFyYW1zLT5nY19pbmRleFtpXV07CisgICAgICAgIGdhaW5fY29kZSA9IGdhaW5fY29ycl9mYWN0b3IgKgorICAgICAgICAgICAgYWNlbHBfZGVjb2RlX2dhaW5fY29kZWYoc3FydChMX1NVQkZSXzE2ayksIGZpeGVkX3ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5LjAgLSAxNS4wLygwLjA1Kk1fTE4xMC9NX0xOMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkXzE2aywgY3R4LT5lbmVyZ3lfaGlzdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExfU1VCRlJfMTZrLCAyKTsKKworICAgICAgICBjdHgtPmVuZXJneV9oaXN0b3J5WzFdID0gY3R4LT5lbmVyZ3lfaGlzdG9yeVswXTsKKyAgICAgICAgY3R4LT5lbmVyZ3lfaGlzdG9yeVswXSA9IDIwLjAgKiBsb2cxMGYoZ2Fpbl9jb3JyX2ZhY3Rvcik7CisKKyAgICAgICAgZmZfd2VpZ2h0ZWRfdmVjdG9yX3N1bWYoJmV4Y2l0YXRpb25baV9zdWJmcl0sICZleGNpdGF0aW9uW2lfc3ViZnJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF92ZWN0b3IsIHBpdGNoX2ZhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl9jb2RlLCBMX1NVQkZSXzE2ayk7CisKKyAgICAgICAgZmZfY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZihzeW50aCArIGlfc3ViZnIsIEF6W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleGNpdGF0aW9uW2lfc3ViZnJdLCBMX1NVQkZSXzE2aywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUF9GSUxURVJfT1JERVJfMTZrKTsKKworICAgIH0KKyAgICBtZW1jcHkoY3R4LT5zeW50aCwgc3ludGggKyBmcmFtZV9zaXplIC0gTFBfRklMVEVSX09SREVSXzE2aywKKyAgICAgICAgICAgTFBfRklMVEVSX09SREVSXzE2ayAqIHNpemVvZigqc3ludGgpKTsKKworICAgIG1lbW1vdmUoY3R4LT5leGNpdGF0aW9uLCBjdHgtPmV4Y2l0YXRpb24gKyAyICogTF9TVUJGUl8xNmssCisgICAgICAgICAgICAoTF9JTlRFUlBPTCtQSVRDSF9NQVgpICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICBwb3N0ZmlsdGVyKG91dF9kYXRhLCBzeW50aCwgY3R4LT5paXJfbWVtLCBjdHgtPmZpbHRfbWVtLCBjdHgtPm1lbV9wcmVlbXBoKTsKKworICAgIG1lbWNweShjdHgtPmlpcl9tZW0sIEF6WzFdLCBMUF9GSUxURVJfT1JERVJfMTZrICogc2l6ZW9mKGZsb2F0KSk7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9zaXByX2luaXRfMTZrKFNpcHJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBfRklMVEVSX09SREVSXzE2azsgaSsrKQorICAgICAgICBjdHgtPmxzcF9oaXN0b3J5XzE2a1tpXSA9IGNvcygoaSArIDEpICogTV9QSS8oTFBfRklMVEVSX09SREVSXzE2ayArIDEpKTsKKworICAgIGN0eC0+ZmlsdF9tZW1bMF0gPSBjdHgtPmZpbHRfYnVmWzBdOworICAgIGN0eC0+ZmlsdF9tZW1bMV0gPSBjdHgtPmZpbHRfYnVmWzFdOworCisgICAgY3R4LT5waXRjaF9sYWdfcHJldiA9IDE4MDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NpcHIxNmtkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9zaXByMTZrZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTY1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zaXByMTZrZGF0YS5oCkBAIC0wLDAgKzEsNTMzIEBACisvKgorICogU0lQUiBkZWNvZGVyIGZvciB0aGUgMTZrIG1vZGUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICogQ29weXJpZ2h0IChjKSAyMDA5IFZpdG9yIFNlc3NhaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfU0lQUjE2S0RBVEFfSAorI2RlZmluZSBBVkNPREVDX1NJUFIxNktEQVRBX0gKKworc3RhdGljIGNvbnN0IGZsb2F0IHByZWRfMTZrWzJdID0gezAuOCwgMC42fTsKK3N0YXRpYyBjb25zdCBmbG9hdCBxdVsyXSA9IHsgMC4xMiwgMC41fTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGdhaW5fY2JfMTZrWzMyXSA9IHsKKyAgICAwLjA3NDk5LCAgMC4xMDU5MywgIDAuMTQxMjUsICAwLjE4ODM2LAorICAgIDAuMjM3MTQsICAwLjI4MTg0LCAgMC4zMjczNCwgIDAuMzc1ODQsCisgICAgMC40MjE3MCwgIDAuNDczMTUsICAwLjUzMDg4LCAgMC41OTU2NiwKKyAgICAwLjY2ODM0LCAgMC43NDk4OSwgIDAuODQxNDAsICAwLjk0NDA2LAorICAgIDEuMDU5MjUsICAxLjE4ODUwLCAgMS4zMzM1MiwgIDEuNDk2MjQsCisgICAgMS42Nzg4MCwgIDEuODgzNjUsICAyLjExMzQ5LCAgMi4zNzEzNywKKyAgICAyLjY2MDczLCAgMy4wNTQ5MiwgIDMuNTQ4MTMsICA0LjIxNjk3LAorICAgIDUuMzA4ODQsICA3LjA3OTQ2LCAgOS40NDA2MSwgMTMuMzM1MjEsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgZ2Fpbl9waXRjaF9jYl8xNmtbMTZdID0geworICAgIDAuMDAsIDAuMiwgMC40MCwgMC41LCAwLjYwLCAwLjcsIDAuNzUsIDAuOCwKKyAgICAwLjg1LCAwLjksIDAuOTUsIDEuMCwgMS4wNSwgMS4xLCAxLjE1LCAxLjIsCit9OworCisKK3N0YXRpYyBjb25zdCBmbG9hdCBtZWFuX2xzZl8xNmtbMTZdID0geworICAgIDAuMTMxNTU0LCAgMC4yNDY2MTUsICAwLjQzNTg5NiwgIDAuNjQ0NDE5LAorICAgIDAuODI3ODEwLCAgMS4wMTc4NzYsICAxLjE5ODkxMCwgIDEuMzc5MTU5LAorICAgIDEuNTYyMTU3LCAgMS43MzY5MDgsICAxLjk0MDcxOSwgIDIuMTMxOTYzLAorICAgIDIuMzQ3MTYyLCAgMi41MjE1MjEsICAyLjcxNzg3MCwgIDIuODQ3MDY4Cit9OworCisvKioKKyAqIEhhbW1pbmcgd2luZG93ZWQgc2luYyBmdW5jdGlvbiwgbGlrZSBpbiBBTVIKKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IHNpbmNfd2luWzQwXSA9IHsKKyAgICAgMC44NzQ0NzUsICAwLjc1NTEwMSwgIDAuNDU1OTYyLCAgMC4xMTg4MDcsIC0wLjExNDIyMywgLTAuMTc2Nzc4LAorICAgIC0wLjEwMTkyMywgIDAuMDE1NTUzLCAgMC4wODY1NTUsICAwLjA3ODE5MywgIDAuMDE4NjYwLCAtMC4wMzc1MTMsCisgICAgLTAuMDUyNzMzLCAtMC4wMjc0NTksICAwLjAwOTk2NywgIDAuMDMwMjc4LCAgMC4wMjQwNTAsICAwLjAwMzA1NSwKKyAgICAtMC4wMTM4NjIsIC0wLjAxNjE2MiwgLTAuMDA2NzI1LCAgMC4wMDQyMTIsICAwLjAwODYzNCwgIDAuMDA1NzIxLAorICAgIC0wLjAwMDAwMCwgLTAuMDAzNzEwLCAtMC4wMDM2OTAsIC0wLjAwMTIyOCwgIDAuMDAxNDA5LCAgMC4wMDI2MTAsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgbHNmX2NiMV8xNmtbMTI4XVszXSA9IHsKKyAgICB7LTAuMDg5OTkwLCAtMC4xNzI0ODUsIC0wLjIwMzM5MX0sIHstMC4wOTQ3MTAsIC0wLjE3ODY4NywgLTAuMTM0NDgzfSwKKyAgICB7LTAuMDU2Mzk4LCAtMC4xMzE5NTIsIC0wLjE1NDUwMH0sIHstMC4wNTEzNjIsIC0wLjEyODEzOCwgLTAuMTk4NTQ5fSwKKyAgICB7LTAuMDYxNzAwLCAtMC4xNDI4MzAsIC0wLjI1MTYyM30sIHstMC4wNDE1MTIsIC0wLjExNTYzNywgLTAuMjI5NDIwfSwKKyAgICB7LTAuMDM2NTQ0LCAtMC4xMDc1MTIsIC0wLjE3MzEyNX0sIHstMC4wMjQxNTgsIC0wLjA4ODQ1MCwgLTAuMjA0MTQ0fSwKKyAgICB7LTAuMDM4NjkwLCAtMC4xMDMzNjgsIC0wLjEzMjY3NH0sIHstMC4wNTY5NTQsIC0wLjEyODQ3MiwgLTAuMTA0NjY5fSwKKyAgICB7LTAuMDIwOTYzLCAtMC4wNzY3ODUsIC0wLjE2MzE5OX0sIHstMC4wMTI5NTIsIC0wLjA3NzI0OSwgLTAuMTI4Mzg1fSwKKyAgICB7LTAuMDMyNzg3LCAtMC4wOTcwNDQsIC0wLjA5Mzk2N30sIHstMC4wMzUyMTQsIC0wLjA1MzgzOCwgLTAuMTExOTQwfSwKKyAgICB7LTAuMDEzODUwLCAtMC4wMzY5MjYsIC0wLjEzOTMyOH0sIHstMC4wMDQ5NTYsIC0wLjA2NTA5MiwgLTAuMDg3NzA5fSwKKyAgICB7LTAuMDY1MzU0LCAtMC4wNjU1OTUsIC0wLjA3OTA2NH0sIHstMC4wMjM2MjcsIC0wLjA4MTQ1NywgLTAuMDU0MTk1fSwKKyAgICB7LTAuMDI3MzM1LCAtMC4wMzUyNDQsIC0wLjA2ODAzNH0sIHsgMC4wMTY1NTUsIC0wLjA0NzA3NSwgLTAuMTI4Mjg2fSwKKyAgICB7IDAuMDIxMDY2LCAtMC4wMzcyNTIsIC0wLjA5MjA0MX0sIHsgMC4wMTQ2ODEsIC0wLjA0MzA0NCwgLTAuMDU3NzM5fSwKKyAgICB7LTAuMDA4NDkzLCAtMC4wMDgxNDMsIC0wLjEwMjQ4Nn0sIHstMC4wMDIzMDMsIC0wLjA2MTU0MCwgLTAuMDIyOTUyfSwKKyAgICB7LTAuMDA2MDYxLCAtMC4wMTQyNzgsIC0wLjAzMzY1Mn0sIHstMC4wMDUyNzYsICAwLjAxMTI0NiwgLTAuMDYyNzYyfSwKKyAgICB7IDAuMDQzNDExLCAtMC4wMDYzMDMsIC0wLjA2MzczMH0sIHsgMC4wMzU4ODUsIC0wLjAxMDA1MiwgLTAuMTE1MjkwfSwKKyAgICB7IDAuMDMwNjI4LCAtMC4wMzE1MzgsIC0wLjAxNzgwN30sIHsgMC4wMjIzNDUsICAwLjAyODIxMCwgLTAuMDMyMzM1fSwKKyAgICB7IDAuMDI2NTM1LCAgMC4wMjc1MzYsIC0wLjA5MTE1MH0sIHstMC4wMDMzNjUsIC0wLjAwODA3NywgIDAuMDE1Njg3fSwKKyAgICB7LTAuMDI2MDEzLCAgMC4wMTc0OTMsIC0wLjAxMDM1NX0sIHsgMC4wNTkwNjksICAwLjAxMDYzNCwgLTAuMDA3NTMwfSwKKyAgICB7IDAuMDQ0MDM4LCAtMC4wMTk0MjQsICAwLjAzMDQ1M30sIHstMC4wMzYwNjUsIC0wLjAzNDIxNSwgLTAuMDA3NzU4fSwKKyAgICB7IDAuMDIyNDg2LCAgMC4wNDI1NDMsICAwLjAyNzg3MH0sIHstMC4wNDk5ODUsIC0wLjAxNjA4NSwgIDAuMDIxNzY4fSwKKyAgICB7LTAuMDIxNzE1LCAgMC4wMjExNjgsICAwLjA1MjA3Nn0sIHstMC4wMDQyNDMsIC0wLjA2MTIyOCwgIDAuMDI3NjQwfSwKKyAgICB7LTAuMDMzOTUwLCAtMC4wMTcyODcsICAwLjA2NDY1Nn0sIHsgMC4wMTYxNTEsICAwLjAwMDcyNywgIDAuMDYyNzU3fSwKKyAgICB7LTAuMDYzNDU2LCAtMC4wNDMxNTIsICAwLjA1NjcwN30sIHstMC4wNjc3MTUsICAwLjAwNjEyNiwgIDAuMDU4MTc4fSwKKyAgICB7LTAuMDM4OTMxLCAgMC4wNTE2NzMsICAwLjAzMDYzNn0sIHstMC4wNzMwMTcsIC0wLjA3NDcxNiwgIDAuMDI2Mzg3fSwKKyAgICB7LTAuMDM5ODkzLCAtMC4xMDQ2MjksICAwLjAzOTYxNn0sIHstMC4wNzMxNzksIC0wLjA3NDYwMSwgIDAuMDgyMDY5fSwKKyAgICB7LTAuMDY2MTU0LCAtMC4wMjcxODAsICAwLjA5OTQzOX0sIHstMC4wNzUxNjcsIC0wLjEyMTE0OSwgIDAuMDcxOTM4fSwKKyAgICB7LTAuMDMwMzgyLCAtMC4wOTI1ODIsICAwLjA5MTA2N30sIHstMC4wODQ1MTksIC0wLjEzNzU0MiwgIDAuMDIzNjI2fSwKKyAgICB7LTAuMDYwOTU2LCAtMC4xMjEyNTksIC0wLjAxNTI2NH0sIHstMC4wMzAwNjksIC0wLjA5MzgyMywgLTAuMDA4NjkyfSwKKyAgICB7LTAuMDYzNTY0LCAtMC4wNjUyMjUsIC0wLjAyNTgyMH0sIHstMC4wNTIwNzQsIC0wLjExNzU5NSwgLTAuMDU5Njg5fSwKKyAgICB7LTAuMDkxNjUyLCAtMC4xNjUxNzMsIC0wLjA0NTU3M30sIHstMC4wNzAxNjcsIC0wLjEyMTM0MiwgIDAuMTMxNzA3fSwKKyAgICB7LTAuMDYxMDI0LCAtMC4wMDU4MzMsIC0wLjA1MTAzNX0sIHsgMC4wMDc4MzcsIC0wLjA1MTgxNiwgIDAuMDc0NTc1fSwKKyAgICB7LTAuMDcwNjQzLCAtMC4wNTM5MjcsICAwLjE0OTQ5OH0sIHstMC4wMTQzNTgsIC0wLjA2NjY4MSwgIDAuMTM5NzA4fSwKKyAgICB7LTAuMDU4MTg2LCAgMC4wMjk1NzYsICAwLjA5MjkyM30sIHstMC4wMjMzNzEsICAwLjAwNzA1OCwgIDAuMTEyNDg0fSwKKyAgICB7LTAuMDU3OTY5LCAgMC4wMjI3ODYsICAwLjE0ODQyMH0sIHsgMC4wMjk0MzksIC0wLjAxNzY3MywgIDAuMTIxNDIzfSwKKyAgICB7LTAuMDE1ODExLCAgMC4wNTY3ODUsICAwLjA5MTU5NH0sIHsgMC4wMDQzNDcsICAwLjA1NjY4MCwgIDAuMTM3ODQ4fSwKKyAgICB7LTAuMDA0NDY0LCAgMC4wMDIzNDIsICAwLjE4NDAxM30sIHsgMC4wMjk2NjAsICAwLjA0Njg3MCwgIDAuMDgyNjU0fSwKKyAgICB7IDAuMDU5NDA4LCAgMC4wMDEwMTYsICAwLjA4NjA2M30sIHsgMC4wNTUyNjMsICAwLjAyNzU3NCwgIDAuMTU1MDM3fSwKKyAgICB7IDAuMDYyMTY2LCAgMC4wNjQzMjMsICAwLjExNzM3MX0sIHsgMC4wMjI5NjcsICAwLjEwMDA1MCwgIDAuMDc3MjI3fSwKKyAgICB7IDAuMDQxNzk1LCAgMC4wOTYzNDMsICAwLjE3MDQyMX0sIHsgMC4wNTMxODksICAwLjEyMjkzMSwgIDAuMTE4NTQ5fSwKKyAgICB7IDAuMDk0MjQ3LCAgMC4wOTQ0NDgsICAwLjA3ODM5NX0sIHsgMC4wODI0MDcsICAwLjAzMzQwOCwgIDAuMDQxMDg1fSwKKyAgICB7IDAuMDk2ODIwLCAgMC4xMTU5NjAsICAwLjE0OTQzM30sIHsgMC4wNjc4MDQsICAwLjEyMTg0OSwgIDAuMDI1MzM2fSwKKyAgICB7LTAuMDA4NDIxLCAgMC4xMDQzMTYsICAwLjAzMjMxNH0sIHsgMC4wMzEwMTMsICAwLjA3MzIxOCwgLTAuMDA0ODk5fSwKKyAgICB7IDAuMDg1MDc5LCAgMC4wNjAzMjMsIC0wLjAwOTY4N30sIHsgMC4wMjgxNzQsICAwLjA5Mjc2NiwgLTAuMDU1NTkwfSwKKyAgICB7IDAuMDcwMTMzLCAgMC4wMzkxNjAsIC0wLjA2MTAzNX0sIHstMC4wMzkyMTEsICAwLjA3MjUxNywgLTAuMDI4NzU2fSwKKyAgICB7IDAuMTI5Njg2LCAgMC4xMDAyMzMsIC0wLjA0Njk5OH0sIHsgMC4xNTQxODksICAwLjEwNzYxNiwgIDAuMDIyNzkxfSwKKyAgICB7LTAuMDQ5MzMxLCAgMC4wOTQxODQsICAwLjA4Nzk4NH0sIHstMC4wMTMxNzksICAwLjEyNjU1MiwgIDAuMTI1MDk5fSwKKyAgICB7LTAuMDU4NzE2LCAgMC4wOTg1MjQsICAwLjE1MDg4Nn0sIHstMC4wMjI3NTMsICAwLjA4MDAxMSwgIDAuMTkxMTI3fSwKKyAgICB7IDAuMDEzNDUxLCAgMC4xNjQ1OTMsICAwLjE1Mzc2OH0sIHsgMC4wNzQ4MTgsICAwLjE4MTIxNCwgIDAuMTA4MjExfSwKKyAgICB7IDAuMDkxMzIzLCAgMC4xNjkyNDksICAwLjE2ODQ2MH0sIHsgMC4wMzM4ODUsICAwLjE1NTUxNiwgIDAuMjEzNzQ1fSwKKyAgICB7LTAuMDMyMTI4LCAgMC4yMjcyMzgsICAwLjEzNTgxNX0sIHstMC4wNTkxNzYsICAwLjE2ODk4MCwgIDAuMjI5MTEwfSwKKyAgICB7IDAuMDMzOTE3LCAgMC4yMjk3NTMsICAwLjIyMjI2NH0sIHsgMC4wODI3MDIsICAwLjExNjM3MCwgIDAuMjI0Njk3fSwKKyAgICB7IDAuMTI3NzM3LCAgMC4xODY2NTgsICAwLjIxMjc4M30sIHsgMC4wNDc1MjgsICAwLjA2MzkyMCwgIDAuMjE2ODU2fSwKKyAgICB7LTAuMDAyNDQ2LCAgMC4xMTQxNzQsICAwLjI2MzI4OX0sIHstMC4wNzc3ODMsICAwLjA4MjUyMywgIDAuMjQ5Njk3fSwKKyAgICB7IDAuMDEwMDIzLCAgMC4wMjQyNjcsICAwLjI1Njg3NH0sIHsgMC4wNTMxOTAsICAwLjExMTQyMiwgIDAuMzEwNDA3fSwKKyAgICB7LTAuMDc4ODA0LCAgMC4wMDQ0NDQsICAwLjIyNDA3OH0sIHstMC4wNTUyNTMsIC0wLjA1OTE4MCwgIDAuMjE3ODkyfSwKKyAgICB7LTAuMDY1MzcxLCAgMC4wMDgxMjQsICAwLjMzMzQwNX0sIHstMC4wNzYxODgsIC0wLjA5ODc2NywgIDAuMjg2OTgzfSwKKyAgICB7LTAuMDcxOTExLCAtMC4xMTU4MDQsICAwLjE5ODAzMX0sIHstMC4wNjI0NzMsICAwLjE4MzYzOSwgIDAuMzcwMTYyfSwKKyAgICB7LTAuMDQyNjY2LCAgMC4yNTUyMTAsICAwLjI2MjcyMH0sIHsgMC4wMTE5OTksICAwLjIxNzUzMCwgIDAuMzE4MjkxfSwKKyAgICB7LTAuMDQyMTQ0LCAgMC4zMjIwODcsICAwLjMyNjM4N30sIHsgMC4wOTA2NjMsICAwLjIwNTgzNSwgIDAuMjk0Nzg0fSwKKyAgICB7IDAuMDU4MjE4LCAgMC4yOTM2NDksICAwLjI3NzkyN30sIHsgMC4xNTc1MDYsICAwLjI4Mjg3MCwgIDAuMjk0NjEwfSwKKyAgICB7IDAuMTE4MjQ4LCAgMC4yNjEwMDcsICAwLjE0ODYxNH0sIHsgMC4wNjUyNjEsICAwLjMzMjM2MiwgIDAuNDExOTEyfSwKKyAgICB7IDAuMTQxMjY5LCAgMC40NTE4NTAsICAwLjMxNTcyNn0sIHsgMC4wMDE3MDYsICAwLjQ1NjMwMSwgIDAuMzU3NTkwfSwKKyAgICB7LTAuMDUyOTQ3LCAgMC4zNTY1NTksICAwLjQ1Njk0NH0sIHsgMC4yNDc3MDcsICAwLjI2MzgzNywgIDAuMTUyNTkxfSwKKyAgICB7IDAuMzA2ODQ3LCAgMC40MTczNzMsICAwLjI1ODU1M30sIHsgMC4xNjYzNDcsICAwLjE0OTIyMiwgIDAuMTE4OTczfSwKKyAgICB7IDAuMzc5NzA5LCAgMC4yOTIxNzIsICAwLjEzOTg3NX0sIHsgMC4wMTAxNzEsIC0wLjA1NTE3MCwgLTAuMTc0NTIzfQorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGxzZl9jYjJfMTZrWzI1Nl1bM10gPSB7CisgICAgey0wLjIxMzAxMSwgLTAuMjkzMzg1LCAtMC4zMzA1OTd9LCB7LTAuMjEyNTgyLCAtMC4yNDA5OTIsIC0wLjMzODIzOX0sCisgICAgey0wLjIyMzM3MywgLTAuMzA2MjE0LCAtMC4yNzcxOTJ9LCB7LTAuMjMxMTM4LCAtMC4yODc3MjksIC0wLjIyOTQxMn0sCisgICAgey0wLjIzODQ2NiwgLTAuMjI4NTcxLCAtMC4yNjA5NTR9LCB7LTAuMTQwOTMxLCAtMC4yNDcwMTgsIC0wLjI1ODU2Nn0sCisgICAgey0wLjEzNjIzOSwgLTAuMjQ5NjY5LCAtMC4zNTAxNDN9LCB7LTAuMTQ5NzM4LCAtMC4xOTI5NzAsIC0wLjI4MTQ3NX0sCisgICAgey0wLjE2NzA1OCwgLTAuMjYxMDUyLCAtMC4xOTYzMDF9LCB7LTAuMTc3MDQ5LCAtMC4yMDEzMjQsIC0wLjIwNzg5N30sCisgICAgey0wLjExNjkxNSwgLTAuMjAwNjI5LCAtMC4yMTI1MjZ9LCB7LTAuMTYyMjQ3LCAtMC4xNDM4MDUsIC0wLjI0NTA5M30sCisgICAgey0wLjA4MjA0MiwgLTAuMTkxODQyLCAtMC4yNjYzMzh9LCB7LTAuMDk4ODQ2LCAtMC4yMDg1MTEsIC0wLjMyMDQ4MX0sCisgICAgey0wLjExMzUxMCwgLTAuMTUyNDcwLCAtMC4yMjI0NzR9LCB7LTAuMDY2MTk3LCAtMC4xNzkxMTIsIC0wLjIwNzgxM30sCisgICAgey0wLjEyOTQ5MCwgLTAuMTY5MzIwLCAtMC4xNTUyMzh9LCB7LTAuMDc4ODQzLCAtMC4xOTAyOTIsIC0wLjE1NTE3Mn0sCisgICAgey0wLjA4Nzc5MCwgLTAuMTQ3NzI5LCAtMC4xNjkzNTF9LCB7LTAuMTQxMDM3LCAtMC4xMjcyMDcsIC0wLjE3NzkxMH0sCisgICAgey0wLjEyNjUyNSwgLTAuMjIzOTYxLCAtMC4xNTM2Mzl9LCB7LTAuMTAxNDY0LCAtMC4xODk5NTMsIC0wLjExNDU1OX0sCisgICAgey0wLjEwMjQ1MCwgLTAuMTA2MzAzLCAtMC4xNTExNzF9LCB7LTAuMTAzMjA4LCAtMC4xNDQ0NTcsIC0wLjEwNTM3OH0sCisgICAgey0wLjE3MDc5NCwgLTAuMTQwNTI1LCAtMC4xMzY0Mjh9LCB7LTAuMTY4NjQxLCAtMC4yMDMwNjQsIC0wLjEzNTM2OH0sCisgICAgey0wLjEzODE5MywgLTAuMTE2MDQyLCAtMC4xMTE5MDV9LCB7LTAuMTQ1MDg1LCAtMC4xNjg1ODEsIC0wLjA5MjYxM30sCisgICAgey0wLjEyNjM3OSwgLTAuMjIwNDMxLCAtMC4wOTEzMjd9LCB7LTAuMjEyOTM0LCAtMC4xODQ3OTcsIC0wLjEwMTYzMn0sCisgICAgey0wLjE5MzcxMSwgLTAuMTQwNTU2LCAtMC4wNzgzMDR9LCB7LTAuMTczNjc0LCAtMC4xOTcyNzYsIC0wLjA2MDE0MH0sCisgICAgey0wLjE5Nzg5NywgLTAuMjQxOTA3LCAtMC4wOTE5OTd9LCB7LTAuMTU2MDM3LCAtMC4yNTg1MTksIC0wLjExMTYyOH0sCisgICAgey0wLjI0MTk2NCwgLTAuMTkxMTI0LCAtMC4wNjMxNDB9LCB7LTAuMjYxMzQwLCAtMC4yNDA4NDcsIC0wLjEwMzEzMn0sCisgICAgey0wLjIyMTYyMSwgLTAuMjQyOTcyLCAtMC4wNDEyNTV9LCB7LTAuMjI0MTY2LCAtMC4yMzI3NDIsIC0wLjE2MTU2OH0sCisgICAgey0wLjIwMzU5MSwgLTAuMjk0NDcwLCAtMC4xMjYwMzV9LCB7LTAuMjA5NTQwLCAtMC4zMDMxNDksIC0wLjA1MzE3MH0sCisgICAgey0wLjI1Mzg1OSwgLTAuMjk1MDY2LCAtMC4xNTYwNTB9LCB7LTAuMjc4MTQzLCAtMC4zMzExMDUsIC0wLjA4NTIzN30sCisgICAgey0wLjMwMDI3MywgLTAuMTk4NzUwLCAtMC4wOTQ4MzR9LCB7LTAuMjYwNDc3LCAtMC4xNjk3MTMsIC0wLjEzMjQ3Nn0sCisgICAgey0wLjIxMTg4OSwgLTAuMTcyNDU0LCAtMC4xNjQyODF9LCB7LTAuMjI4MzcwLCAtMC4xMjIxNDksIC0wLjEyNDE3OH0sCisgICAgey0wLjI1NDYyOSwgLTAuMTM1NjY4LCAtMC4wODE2OTJ9LCB7LTAuMjYzODEzLCAtMC4xNTQ5MjgsIC0wLjIxMzU5Nn0sCisgICAgey0wLjMwODIyNCwgLTAuMTA2ODc3LCAtMC4wODQ0MDR9LCB7LTAuMjQyNjQ0LCAtMC4wODI4NjIsIC0wLjA4NTgzNX0sCisgICAgey0wLjI1MjA4NCwgLTAuMDY0ODg4LCAtMC4xNDY0OTh9LCB7LTAuMTk4MTYyLCAtMC4xMDU3MjEsIC0wLjE4ODg4N30sCisgICAgey0wLjE4OTIzOCwgLTAuMDg4MDI4LCAtMC4xMDk3MzZ9LCB7LTAuMTk3NTk4LCAtMC4wOTk4MzEsIC0wLjA0NDAzMH0sCisgICAgey0wLjI2OTAxNywgLTAuMTA1OTkxLCAtMC4wMjE1MTN9LCB7LTAuMjMxMzQ5LCAtMC4wNTg4MjUsIC0wLjA0MTQwN30sCisgICAgey0wLjIyNTU4OSwgLTAuMDI3NTAxLCAtMC4wODcxNjB9LCB7LTAuMTYwMzQ3LCAtMC4wNTgzNDEsIC0wLjA3OTc4OX0sCisgICAgey0wLjE1ODcyOSwgLTAuMTA4OTUxLCAtMC4wNjcyNjJ9LCB7LTAuMTcwNDgzLCAtMC4wNTMwMjMsIC0wLjAxNzU2MX0sCisgICAgey0wLjE3NTIwNywgLTAuMDEzNjQ5LCAtMC4wNDk1MTN9LCB7LTAuMTU2MDA0LCAtMC4xMDgzNzgsIC0wLjAwNDA1Mn0sCisgICAgey0wLjIxOTk1OCwgLTAuMDgyMzYyLCAgMC4wMTQ5NTB9LCB7LTAuMjE3Nzg1LCAtMC4wMTI5ODEsIC0wLjAwOTQxMH0sCisgICAgey0wLjEyMzI5MCwgLTAuMDQwODQ5LCAtMC4wNDA5MTB9LCB7LTAuMTE5ODYxLCAtMC4wOTUwNzgsIC0wLjA2MDI0Nn0sCisgICAgey0wLjExNzUzNywgLTAuMDY1NDc5LCAgMC4wMDI5Njh9LCB7LTAuMTAzMjMxLCAtMC4xMTMyOTgsIC0wLjAyMzI4Mn0sCisgICAgey0wLjEzNjM2NSwgLTAuMTQ5NTI0LCAtMC4wNTEzODd9LCB7LTAuMTE5MzMyLCAtMC4xNjQ0MDAsIC0wLjAwOTEwM30sCisgICAgey0wLjEwNDUyMiwgLTAuMDYwOTQ4LCAtMC4wODMwNTZ9LCB7LTAuMDcxNDYxLCAtMC4wNzA3ODcsIC0wLjAzNzM0N30sCisgICAgey0wLjA4MTExNiwgLTAuMTQ5MDE1LCAtMC4wNTY3NDB9LCB7LTAuMDY5NTYxLCAtMC4xMDgwOTksIC0wLjA2OTE2N30sCisgICAgey0wLjA1NTYyNCwgLTAuMTE3MzY5LCAtMC4wMjUwOTF9LCB7LTAuMDkxOTQxLCAtMC4xOTAwOTEsIC0wLjA2MDAyMH0sCisgICAgey0wLjA3MjAwMywgLTAuMTY4NDMzLCAtMC4wMDY1NDB9LCB7LTAuMDMzMzA1LCAtMC4xNTQ0MjcsIC0wLjA1NDYwOH0sCisgICAgey0wLjA2Mjk4OCwgLTAuMTI3MDkzLCAtMC4xMDgzMDd9LCB7LTAuMDU2NjkwLCAtMC4xNzA4MTMsIC0wLjEwMjgzNH0sCisgICAgey0wLjAxODI3MywgLTAuMTI3ODYzLCAtMC4wOTQ5OTh9LCB7LTAuMDU2MjM5LCAtMC4xMjM2NzgsIC0wLjE0NjI2Mn0sCisgICAgey0wLjAyMzQ0MiwgLTAuMTU0NjE3LCAtMC4xMzc0MTd9LCB7LTAuMDUxOTAzLCAtMC4wNzgzNzksIC0wLjA5MzM5NX0sCisgICAgey0wLjAxNDU5OSwgLTAuMTA0NDEyLCAtMC4xMzU5NTl9LCB7LTAuMDUxNTgyLCAtMC4wODEyODAsIC0wLjE0MDY0M30sCisgICAgey0wLjA5MjcyNywgLTAuMDkxOTMwLCAtMC4xMDc4MTZ9LCB7LTAuMDI0ODE0LCAtMC4xNDA5OTMsIC0wLjE4MzI0M30sCisgICAgey0wLjA2NDMwNywgLTAuMTEzMDI0LCAtMC4xOTQ3ODh9LCB7LTAuMDAwMTE4LCAtMC4wOTg4NTgsIC0wLjE5NTMzNn0sCisgICAgey0wLjAyODA5MCwgLTAuMDQ4MjU4LCAtMC4xNjQxMDF9LCB7LTAuMDkzNDE0LCAtMC4wNTU5NjksIC0wLjE3Mjc0M30sCisgICAgey0wLjExNDQ0NSwgLTAuMTA0MzM2LCAtMC4yMTUyMDR9LCB7LTAuMDQ4NTE4LCAtMC4xMzIwNjMsIC0wLjI0Mjk5MX0sCisgICAgey0wLjE1OTYyMCwgLTAuMDYwMjQwLCAtMC4xNzg1OTJ9LCB7LTAuMTM1NzI4LCAtMC4wNjc0NzMsIC0wLjEzMTg3Nn0sCisgICAgey0wLjA3ODQ2NCwgLTAuMDM4MDQwLCAtMC4xMjUxMDV9LCB7LTAuMDExMDYxLCAtMC4wNjQwMTEsIC0wLjEwMjQ5Nn0sCisgICAgey0wLjAzMzg4NywgLTAuMDI2NDg1LCAtMC4xMDk0OTN9LCB7LTAuMTI5MTI4LCAtMC4wMTQyMTYsIC0wLjExMTMyOX0sCisgICAgey0wLjE5MDY4NywgLTAuMDMwNjYwLCAtMC4xMzU4MjV9LCB7LTAuMDgyMDM3LCAgMC4wMTA5OTcsIC0wLjEwMDE2N30sCisgICAgey0wLjE4MzQwMywgIDAuMDAxNjUxLCAtMC4wOTg5NjJ9LCB7LTAuMDc0Nzc1LCAtMC4wMzAzMzUsIC0wLjA2MjIxN30sCisgICAgey0wLjAzMTc1OSwgLTAuMDUwNTUxLCAtMC4wNTk0MjB9LCB7LTAuMDUxNDM5LCAgMC4wMTA4MjcsIC0wLjA1MjE0OH0sCisgICAgey0wLjEyNjc0NCwgIDAuMDA4Njg5LCAtMC4wNDc3ODV9LCB7LTAuMTQ1OTE2LCAgMC4wNDIwMTksIC0wLjA3NzQzMX0sCisgICAgey0wLjA5MzU1MiwgIDAuMDU0MTQzLCAtMC4wNjA0NzN9LCB7LTAuMDkwNjYwLCAgMC4wMTI4NjgsIC0wLjAxODE5NX0sCisgICAgey0wLjA3OTc4MywgLTAuMDMzMDcxLCAgMC4wMDE0ODJ9LCB7LTAuMDMzMDEwLCAtMC4wMjIzMzEsIC0wLjAxNDUwNn0sCisgICAgey0wLjAwNDc5OCwgLTAuMDE3MzM5LCAtMC4wNjAxMjB9LCB7LTAuMDI1MDIxLCAgMC4wMjYzOTAsIC0wLjAwMzI2M30sCisgICAgey0wLjAwMTQzNywgIDAuMDI1OTk0LCAtMC4wNDA4OTJ9LCB7LTAuMDc0ODIxLCAgMC4wMTkwMDUsICAwLjAyNzU0OX0sCisgICAgey0wLjAzMDgxMSwgLTAuMDEyMTE0LCAgMC4wMzQyODR9LCB7IDAuMDA2Nzg1LCAgMC4wMDQ2MTgsICAwLjAxODcxN30sCisgICAgeyAwLjAxMzM5MiwgLTAuMDMyNTk3LCAtMC4wMjM3MzF9LCB7IDAuMDM1OTk0LCAgMC4wMDU5NjMsIC0wLjAxMTc1N30sCisgICAgeyAwLjAwODA3MSwgLTAuMDQ1NzUwLCAgMC4wMjQ4ODl9LCB7IDAuMDEzMDU1LCAgMC4wMTcwNDAsICAwLjA1NDEyMX0sCisgICAgey0wLjAxMjk4OSwgIDAuMDQ0ODY0LCAgMC4wMzYzMjd9LCB7IDAuMDI1MDU0LCAgMC4wNDcxMzcsICAwLjAwOTk3NH0sCisgICAgeyAwLjA1MzgwMSwgIDAuMDI0MTc4LCAgMC4wMzE3NzR9LCB7IDAuMDU2NDQyLCAtMC4wMzA2NDcsICAwLjAyMTI5MX0sCisgICAgeyAwLjAzMjI0NywgIDAuMDUyNjgwLCAgMC4wNDk4ODZ9LCB7IDAuMDM1MzY5LCAgMC4wOTAyMDcsICAwLjAzMTM5NH0sCisgICAgeyAwLjA2NDcyMCwgIDAuMDcwMzkwLCAgMC4wNDA5Mzh9LCB7IDAuMDIyMTEyLCAgMC4wNTQ4MzQsICAwLjA5MTA1OX0sCisgICAgeyAwLjA0MTc2NSwgIDAuMDg2MjQ4LCAgMC4wNzAxOTZ9LCB7IDAuMDcwNjQ1LCAgMC4wNjA4NTIsICAwLjA3ODgyNX0sCisgICAgeyAwLjA1ODUwNiwgIDAuMDE2OTIwLCAgMC4wODE2MTJ9LCB7IDAuMDAwMDA5LCAgMC4wODY1MDAsICAwLjA1OTg0OX0sCisgICAgeyAwLjA3MTI1MywgIDAuMTA3MzkyLCAgMC4wNTkwNDZ9LCB7IDAuMDk0NzAyLCAgMC4wOTYxNjAsICAwLjA5MDk4Mn0sCisgICAgeyAwLjA0NzYzOSwgIDAuMTEwODc3LCAgMC4xMTEyMjd9LCB7IDAuMTIyNDQ0LCAgMC4wOTA5MDksICAwLjA1NzM5Nn0sCisgICAgeyAwLjEwMTkxNiwgIDAuMDUyMjk5LCAgMC4wMjk5MDl9LCB7IDAuMDc2NTYwLCAgMC4wODYwOTQsIC0wLjAwNzI1Mn0sCisgICAgeyAwLjEyMzQxMSwgIDAuMDMwNzY5LCAgMC4wODI3NDl9LCB7IDAuMTM1NTc5LCAgMC4xMDMwMjIsICAwLjAwOTU0MH0sCisgICAgeyAwLjEyMDU3NiwgIDAuMDY1Mjg0LCAtMC4wMjQwOTV9LCB7IDAuMDc3NDgzLCAgMC4wMjg1MjYsIC0wLjAxMjM2OX0sCisgICAgeyAwLjEyODc0NywgIDAuMDE3OTAxLCAtMC4wMDM4NzR9LCB7IDAuMTU4MjU0LCAgMC4wNDY5NjIsICAwLjAyOTU3N30sCisgICAgeyAwLjEwMjI4NywgLTAuMDAyMjExLCAgMC4wMzczMjl9LCB7IDAuMDg5NjU0LCAtMC4wMjEzNzIsIC0wLjAwNjg1N30sCisgICAgeyAwLjEzNzkxNywgIDAuMDI3MjI4LCAtMC4wNTMyMjN9LCB7IDAuMDk4NzI4LCAtMC4wMTIxOTIsIC0wLjA0ODUxOH0sCisgICAgeyAwLjA4Mzk3NCwgIDAuMDM2MTUzLCAtMC4wNjIyNjZ9LCB7IDAuMDQ4MjMwLCAtMC4wMTAyNDEsIC0wLjA1MjI5M30sCisgICAgeyAwLjExMDEzNSwgIDAuMDA3NzE1LCAtMC4wOTUyMzN9LCB7IDAuMDY4Mjk0LCAtMC4wMTQzMTcsIC0wLjEwNDAyOX0sCisgICAgeyAwLjA2MzkwOSwgLTAuMDU2NDE2LCAtMC4wNjMwMjN9LCB7IDAuMDU5MTMzLCAtMC4wNDQ2NzUsIC0wLjAyMzc4MH0sCisgICAgeyAwLjAzMDc0OCwgIDAuMDIxODQ1LCAtMC4wODYzMzJ9LCB7IDAuMDIzOTk0LCAtMC4wNDU1NzQsIC0wLjA3NjIzMn0sCisgICAgeyAwLjA1MjE0NywgLTAuMDU5ODI1LCAtMC4xMDk2Njd9LCB7IDAuMDEzMDg3LCAtMC4wMjA0MjAsIC0wLjEyMTk0NX0sCisgICAgeyAwLjAxODE2MywgLTAuMDk2NzY1LCAtMC4wODg3NTh9LCB7IDAuMDIwMTk2LCAtMC4wNzY0NzAsIC0wLjA0ODExMn0sCisgICAgeyAwLjAyMDI4MiwgLTAuMDg0MjA0LCAtMC4xMzU1MzV9LCB7IDAuMDQwMDc2LCAtMC4wNTM0NjQsIC0wLjE2MTk0OX0sCisgICAgey0wLjAxNzc5NiwgLTAuMTAzMDcwLCAtMC4wNTk1NTl9LCB7LTAuMDE2NDg0LCAtMC4wNzAxMzgsIC0wLjAxNjg2Nn0sCisgICAgeyAwLjAwNDg0OSwgLTAuMTEyNDgxLCAtMC4wMTc3MzF9LCB7IDAuMDQwMTYwLCAtMC4wNzM4NzMsIC0wLjAwNTMyN30sCisgICAgeyAwLjAwMjIwMiwgLTAuMDk0NzIzLCAgMC4wNDUzNjZ9LCB7LTAuMDU2OTE4LCAtMC4wODE1NzgsICAwLjAxNzg3NX0sCisgICAgey0wLjAzMTA5OSwgLTAuMTQxNzA4LCAgMC4wMDkxODZ9LCB7LTAuMTAyODAyLCAtMC4xMjI2NzUsICAwLjAzMDA2MH0sCisgICAgey0wLjA2MTcxNywgLTAuMTQ1MTE2LCAgMC4wNzY2ODB9LCB7LTAuMDczNjA3LCAtMC4wNTA0NjQsICAwLjA3Mjg1M30sCisgICAgey0wLjExNzQwMywgLTAuMTk0OTIxLCAgMC4wNDAxMDF9LCB7LTAuMTg1MjM2LCAtMC4xMzM2MjAsICAwLjA0NTkzOX0sCisgICAgey0wLjE2MDE3NCwgLTAuMDU3MjI2LCAgMC4wNTY2NDF9LCB7LTAuMTc4NDg5LCAtMC4xNzM0MzUsIC0wLjAwNzgwNn0sCisgICAgey0wLjE5OTkxNiwgLTAuMjA0ODY2LCAgMC4wNDczNDJ9LCB7LTAuMTUyMzM3LCAtMC4yNDk2NTEsICAwLjAzNDY1Nn0sCisgICAgey0wLjE4NTYzNywgLTAuMjMwOTQyLCAtMC4wMDIwNzJ9LCB7LTAuMTIyNTQ4LCAtMC4yMTUyMDksIC0wLjAyNDU1Mn0sCisgICAgey0wLjI0OTU3OCwgLTAuMjA5NzE0LCAgMC4wMDk0NzB9LCB7LTAuMTYwMTA4LCAtMC4yNTc3MDIsIC0wLjA0MDk5Mn0sCisgICAgey0wLjIxNjY5NCwgLTAuMjg5MzUzLCAgMC4wMjcxODJ9LCB7LTAuMjI2MzkwLCAtMC4xNDc4NDQsIC0wLjAyMjc0Mn0sCisgICAgey0wLjI4ODczNywgLTAuMjcyMTUwLCAtMC4wMTM5NDh9LCB7LTAuMjYyNTU0LCAtMC4yMzcwMzUsICAwLjA3MjQ3M30sCisgICAgey0wLjMwNjI2NywgLTAuMTg4MzM1LCAtMC4wMzI4OTR9LCB7LTAuMjU5NjY2LCAtMC4zNDU4MTYsICAwLjAyNDEzOH0sCisgICAgey0wLjI3MTA5MywgLTAuMTM3MTQzLCAgMC4wNDA0MDR9LCB7LTAuMjAxMzE3LCAtMC4yODY3ODIsICAwLjEwNzYxNX0sCisgICAgey0wLjIzNTcyNSwgLTAuMTYzMzk2LCAgMC4xMTM4NDR9LCB7LTAuMTU5OTg4LCAtMC4yMDk3ODgsICAwLjExMjE0MH0sCisgICAgey0wLjI2Mjk4NSwgLTAuMDU2NzQxLCAgMC4wOTM1MDZ9LCB7LTAuMjc3MjI2LCAtMC4wMzczMDYsICAwLjAxNjAwOH0sCisgICAgey0wLjI5MzQ4NiwgLTAuMDQwNDIyLCAtMC4wNjIwMTh9LCB7LTAuMjE0OTIxLCAgMC4wMjI5MDAsICAwLjA1NTI5NX0sCisgICAgey0wLjI1Mzg4OSwgIDAuMDU4NTc1LCAtMC4wMDAxNTF9LCB7LTAuMjQ2Njg5LCAgMC4wMjQyNDIsIC0wLjA1ODQ4OH0sCisgICAgey0wLjE0Mzc5MCwgIDAuMDA2NzY3LCAgMC4wMTQwNjF9LCB7LTAuMTg3MDc3LCAgMC4wNDg4ODIsIC0wLjAzNTYyNX0sCisgICAgey0wLjE5NjM2OSwgIDAuMTEyMDg1LCAgMC4wMzE1NDZ9LCB7LTAuMTI0MjY0LCAgMC4wODYxOTcsIC0wLjAyMDgwMH0sCisgICAgey0wLjEyNjI0OSwgIDAuMDE2OTYwLCAgMC4wOTU3NDF9LCB7LTAuMDc5ODE2LCAgMC4wODAzOTgsICAwLjA1MTAzOH0sCisgICAgey0wLjA1NjI2OSwgIDAuMDc1MzgwLCAtMC4wMjgyNjJ9LCB7LTAuMTIwNDkzLCAgMC4xNDg0OTUsICAwLjAyODQzMH0sCisgICAgey0wLjE2MTc1MCwgIDAuMTAxMjkwLCAgMC4xMTc4MDZ9LCB7LTAuMDAzMjQ3LCAgMC4wODMzOTMsIC0wLjAxNzA2MX0sCisgICAgey0wLjAzNDAwNywgIDAuMTQyNTQyLCAgMC4wMDc0MDJ9LCB7LTAuMDM3NjE4LCAgMC4wMjU4NzEsICAwLjA4OTQ5Nn0sCisgICAgey0wLjA4MjgxOSwgIDAuMTg0NDM1LCAgMC4wNzMyMjR9LCB7IDAuMDA2NDQ4LCAgMC4xNjcwMTUsICAwLjA4MDU0OH0sCisgICAgeyAwLjAzNTMxNSwgIDAuMTQ0MDIyLCAgMC4wMDMyMTh9LCB7LTAuMDIzNDU5LCAgMC4wODgxNDcsICAwLjE1MjYwNH0sCisgICAgeyAwLjAwNjI0NywgLTAuMDI0MDk5LCAgMC4wNzc3OTJ9LCB7IDAuMDM5ODk0LCAgMC4wNTc1ODYsIC0wLjA0MjQ1NX0sCisgICAgey0wLjAyMDQxNywgIDAuMDM1NDAwLCAtMC4wOTM5NzF9LCB7IDAuMDc1NDY1LCAgMC4wNTIwNjMsICAwLjE0NTU4Mn0sCisgICAgeyAwLjA3ODAyNywgIDAuMTg0NzIwLCAgMC4wOTIwOTZ9LCB7IDAuMTA3Mjk1LCAgMC4xNDgzODAsICAwLjAyMjI2NH0sCisgICAgeyAwLjA2NjkyOCwgLTAuMDUyODMxLCAgMC4wNjUxMDh9LCB7IDAuMDkzMjk1LCAgMC4xMTgxNTcsICAwLjE0OTgxNX0sCisgICAgeyAwLjExOTM3MywgIDAuMTM3MTE0LCAgMC4wOTk1MzZ9LCB7IDAuMTM4NjUzLCAgMC4wNzU1MDksICAwLjEyMTU0NX0sCisgICAgeyAwLjE3NDAyNSwgIDAuMDc3NTMxLCAgMC4wNzcxNjl9LCB7IDAuMTY1ODM5LCAgMC4xNTAwODAsICAwLjEzMzQyM30sCisgICAgeyAwLjE3MzI3NiwgIDAuMTU1ODg3LCAgMC4wNDgxNTB9LCB7IDAuMTYyOTEwLCAgMC4wOTU4OTgsICAwLjE3MTg5Nn0sCisgICAgeyAwLjIxNDU3NywgIDAuMTEyODg4LCAgMC4xMTU1Nzl9LCB7IDAuMjA0NzU1LCAgMC4xMDYzOTIsICAwLjAzMjMzN30sCisgICAgeyAwLjE3ODg1MywgIDAuMjA1MDM0LCAgMC4xMTQ3NjB9LCB7IDAuMTc3NDAxLCAgMC4wNzA1MDQsIC0wLjAxMzc3OH0sCisgICAgeyAwLjI0MTYyNCwgIDAuMTY2OTIxLCAgMC4wNjYwODd9LCB7IDAuMjE5NTk1LCAgMC4xODM1NTMsICAwLjE3MjMzMn0sCisgICAgeyAwLjEyMzY3MSwgIDAuMTcwODQyLCAgMC4xNjcyMTZ9LCB7IDAuMTc3MTA0LCAgMC4yNDAxOTcsICAwLjE4NjM1OX0sCisgICAgeyAwLjI3MjAwMywgIDAuMjIwMjE0LCAgMC4xMjYwNzN9LCB7IDAuMDkzNzQ4LCAgMC4yMzU4NDMsICAwLjE2MDk5OH0sCisgICAgeyAwLjE0MTUxMCwgIDAuMTkwMDEyLCAgMC4yNDA0MTZ9LCB7IDAuMDQ2ODc4LCAgMC4xNjg5ODQsICAwLjE5MDQxMn0sCisgICAgeyAwLjA5NDg5OCwgIDAuMTA3MDM4LCAgMC4yMzUwMDN9LCB7IDAuMTA4NTkyLCAgMC4yNjk1MzYsICAwLjI2MjUyOH0sCisgICAgey0wLjAyNzc1NCwgIDAuMjM0MzU1LCAgMC4xMzQ1NDR9LCB7IDAuMjY1MTI3LCAgMC4yNjc1NDAsICAwLjE5OTA0MX0sCisgICAgeyAwLjE5OTUyMywgIDAuMjkxNTA3LCAgMC4yNjUxNzF9LCB7IDAuMjY2MTc3LCAgMC4yMDkzMzksICAwLjM1MDM2OX0sCisgICAgeyAwLjMyMjE1OSwgIDAuMzQ0Nzk0LCAgMC4yNzA4MjN9LCB7IDAuMzk5OTU3LCAgMC4yNjQwNjUsICAwLjExMDM4N30sCisgICAgeyAwLjI3NzgxNywgIDAuMTI3NDA3LCAtMC4wMzU2MjV9LCB7LTAuMTc3MDM4LCAgMC4yMDgxNTUsICAwLjExOTA3N30sCisgICAgeyAwLjA0OTA3NSwgLTAuMDc2Mjk0LCAgMC4xNDU3MTF9LCB7IDAuMTg3MjQ2LCAgMC4wNDI4NjUsIC0wLjEyNzA5N30sCisgICAgeyAwLjExNzg4NSwgLTAuMDIzNDg5LCAtMC4xMzg2NTh9LCB7LTAuMjg0MjU2LCAgMC4wNjgxNTMsICAwLjEyNDI1OX0KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBsc2ZfY2IzXzE2a1sxMjhdWzNdID0geworICAgIHstMC4yMjM0MTIsIC0wLjIzNjMwMCwgLTAuMTg4MDY3fSwgey0wLjIwMjI4NiwgLTAuMjE4NzExLCAtMC4xMDI5NDd9LAorICAgIHstMC4yNTE2NTIsIC0wLjE2MTAyMCwgLTAuMTI1MjgwfSwgey0wLjE2OTIyMywgLTAuMTM4MTU1LCAtMC4xNDA0MzB9LAorICAgIHstMC4xNzY0MjcsIC0wLjE0NjYyOCwgLTAuMjIyNjMyfSwgey0wLjEyMDU4NCwgLTAuMTg3Mjc2LCAtMC4xODAxNjR9LAorICAgIHstMC4xOTU1NTksIC0wLjA3NDIyNSwgLTAuMTY5MTA5fSwgey0wLjE0NDU1MSwgLTAuMTQyNzc0LCAtMC4wNzMzNDB9LAorICAgIHstMC4xMTEwMDEsIC0wLjExMTMxMCwgLTAuMTMwNjk2fSwgey0wLjA5NTIyMSwgLTAuMTc0Njg0LCAtMC4xMTE4NDF9LAorICAgIHstMC4xMTIxNTgsIC0wLjEwMzA0OSwgLTAuMTk1MTMwfSwgey0wLjA1OTk4OSwgLTAuMTQyMTcwLCAtMC4xNTc4NTB9LAorICAgIHstMC4xMjc1OTgsIC0wLjA1MTc1OSwgLTAuMTUzMTA5fSwgey0wLjA2Mzc1MywgLTAuMDY3ODk4LCAtMC4xNjQxMTd9LAorICAgIHstMC4xNDE3NTMsIC0wLjA2ODI3NCwgLTAuMDkxOTk5fSwgey0wLjA2MDQ4MiwgLTAuMTAxMDU0LCAtMC4wOTk0NzV9LAorICAgIHstMC4xMDQ2OTksIC0wLjEwNDQ1NiwgLTAuMDY2NDk2fSwgey0wLjA3MzY0OSwgLTAuMDUyNjE0LCAtMC4wOTE2MTJ9LAorICAgIHstMC4wODgyNjgsIC0wLjAxOTA3MiwgLTAuMTI5OTU2fSwgey0wLjAxODgzNywgLTAuMTA0MTE1LCAtMC4xMjc4Mzd9LAorICAgIHstMC4wMjE2MzAsIC0wLjAzMzA1NSwgLTAuMTI5ODY4fSwgey0wLjA4Mzc2OCwgLTAuMDQ3NTQ5LCAtMC4wNDE0MDd9LAorICAgIHstMC4wNTU4OTIsIC0wLjEwODUyNiwgLTAuMDQzMjAwfSwgey0wLjAyNzgxNiwgLTAuMDYyNDk5LCAtMC4wNDgxOTB9LAorICAgIHstMC4wMDIyNDgsIC0wLjExMDQyOCwgLTAuMDYyODY4fSwgeyAwLjAwMTI3MCwgLTAuMDMzMjQ1LCAtMC4wNzI0MDR9LAorICAgIHstMC4wNDI3NDcsIC0wLjAxMzgzNSwgLTAuMDMzODI5fSwgey0wLjAzNzYxNSwgLTAuMTQ3ODMzLCAtMC4wODM5MTJ9LAorICAgIHstMC4wNDUwMjMsICAwLjAwNjAxMSwgLTAuMDkyMTgyfSwgey0wLjA1MDQxMSwgLTAuMDgxODMyLCAgMC4wMDU3ODd9LAorICAgIHsgMC4wMDAzNTcsIC0wLjEwNDI4MiwgLTAuMDA5NDI4fSwgey0wLjAwMzg5MywgLTAuMDQ3ODkyLCAtMC4wMDE1MDZ9LAorICAgIHstMC4wNDAwNzcsIC0wLjE0NzExMCwgLTAuMDA5MDY1fSwgey0wLjA2MDg1OCwgLTAuMDMwOTcyLCAgMC4wMTI5OTl9LAorICAgIHstMC4wMTQ2NzQsICAwLjAwMTM3MCwgIDAuMDA1NTU0fSwgey0wLjEwMTM2MiwgLTAuMTI2MDYxLCAtMC4wMDE4OTh9LAorICAgIHstMC4xMDI1MTksIC0wLjAwMDM5MCwgLTAuMDE1NzIxfSwgey0wLjEzMjY4NywgLTAuMDY5NjA4LCAtMC4wMTk5Mjh9LAorICAgIHstMC4xMDIyMjcsIC0wLjA3NjEzMSwgIDAuMDQzMzA2fSwgey0wLjA1NTE5MywgIDAuMDI3MDAxLCAgMC4wMTE4NTd9LAorICAgIHstMC4xNTY0MjcsIC0wLjAxNjYyOSwgIDAuMDE3NDgwfSwgey0wLjA3ODczNiwgIDAuMDAyODA5LCAgMC4wNTc5Nzl9LAorICAgIHstMC4xNTc3ODksIC0wLjAxNjY5MywgLTAuMDU1MDczfSwgey0wLjE3OTM5NywgLTAuMDk1NTIwLCAgMC4wMjIwNjV9LAorICAgIHstMC4xMTAyMTksICAwLjAxMDQwOCwgLTAuMDgxOTI3fSwgey0wLjEyNTM5MiwgIDAuMDQ5MTExLCAgMC4wNDQ1OTV9LAorICAgIHstMC4xMTI1MjgsICAwLjA2MzE3MywgLTAuMDI0OTU0fSwgey0wLjE4NTUyNSwgIDAuMDUzMDkzLCAtMC4wMzIxMDJ9LAorICAgIHstMC4xNzY4ODcsIC0wLjAxOTM3OSwgLTAuMTE1MTI1fSwgey0wLjI0OTcwNiwgLTAuMDE3NjY0LCAtMC4wNTkxODh9LAorICAgIHstMC4yMDAyNDMsIC0wLjEwMzMxMSwgLTAuMDY2ODQ2fSwgey0wLjA1NTQwNCwgIDAuMDQ1MTA2LCAtMC4wNDY5OTF9LAorICAgIHstMC4wMDA1NDQsICAwLjAyMjY5MCwgLTAuMDQ0ODMxfSwgeyAwLjAyMjI5OCwgLTAuMDE2MzY3LCAtMC4wMjI1MDl9LAorICAgIHsgMC4wMjgyNzgsICAwLjAxNzU4NSwgLTAuMTAwNjEyfSwgeyAwLjA2MTc4MSwgLTAuMDIwODI2LCAtMC4wNjgxOTB9LAorICAgIHsgMC4wMjkxNTcsIC0wLjA3NDQ3NywgLTAuMDk4ODk4fSwgeyAwLjA0MzA3MywgLTAuMDY3MjM0LCAtMC4wMzIyOTN9LAorICAgIHsgMC4wNjAxNTcsICAwLjAzNDYzNiwgLTAuMDM0ODg1fSwgeyAwLjA3MTE1MywgLTAuMDEzODgxLCAtMC4wMDkwMzZ9LAorICAgIHsgMC4wNTQxOTYsIC0wLjAyOTk4OSwgLTAuMTMxMTM5fSwgeyAwLjAzMDE5MywgIDAuMDI0OTc2LCAgMC4wMDk4NjF9LAorICAgIHsgMC4wNTU5NDMsIC0wLjA0NTMwNCwgIDAuMDMxOTI3fSwgeyAwLjAzMzIxNywgLTAuMDAyNDE4LCAgMC4wMzgxNjV9LAorICAgIHsgMC4wNjM4MTQsICAwLjA0NTYyNSwgIDAuMDI1MzA5fSwgeyAwLjAzMzY4OSwgIDAuMDM4ODE5LCAgMC4wNDk3MDB9LAorICAgIHsgMC4wNzM1ODIsICAwLjAyODUyNywgIDAuMDYwMjAwfSwgey0wLjAwNzk1NywgIDAuMDIyNTMxLCAgMC4wNDM2ODd9LAorICAgIHstMC4wMDA5ODQsICAwLjA1NDUxOCwgIDAuMDE4NzQyfSwgeyAwLjA1NzAwNCwgIDAuMDYwOTE2LCAgMC4wNjA1NzN9LAorICAgIHsgMC4wMDk4ODMsICAwLjAxNTIzOCwgIDAuMDgwMjExfSwgeyAwLjAyMjc0MiwgIDAuMDcwODMyLCAgMC4wNjg4NTV9LAorICAgIHsgMC4wNTMwMDEsICAwLjAyOTc5MCwgIDAuMDkxNDQ2fSwgey0wLjA0MjQ0NywgIDAuMDYwMzc5LCAgMC4wNjE0NjJ9LAorICAgIHsgMC4wNzY4MjYsICAwLjA2MjQ2OCwgIDAuMDg5NjUzfSwgeyAwLjAzOTA2NSwgIDAuMDY5NzY4LCAgMC4xMTkxMjh9LAorICAgIHsgMC4wNjQxNDUsICAwLjA5NTM1MywgIDAuMDcxNjIxfSwgeyAwLjA5NDQxMSwgIDAuMDY5NTI3LCAgMC4wNTQxOTd9LAorICAgIHsgMC4wNDI4MTIsICAwLjA5MzA2MCwgIDAuMDI3OTgwfSwgeyAwLjA5NDc5MSwgIDAuMDk5MTg5LCAgMC4xMDExMTJ9LAorICAgIHsgMC4xMTc2MTEsICAwLjA0ODYwMSwgIDAuMDkzMTExfSwgeyAwLjExOTk1MSwgIDAuMTIyNzU4LCAgMC4wNTE1NDZ9LAorICAgIHsgMC4xMDM1NTgsICAwLjA4NTI0NSwgLTAuMDEwNzAwfSwgeyAwLjE1MDEyNiwgIDAuMDU5NzY2LCAgMC4wMjAyODB9LAorICAgIHsgMC4xMDgwNjYsICAwLjAxNzE3MCwgIDAuMDA4NjA2fSwgeyAwLjEwODQyMiwgIDAuMDIzMjUzLCAtMC4wNjM5NDJ9LAorICAgIHsgMC4wMTk2NTIsICAwLjA3MjI4NCwgLTAuMDMwMzMxfSwgeyAwLjE5MjcxOSwgIDAuMDc1NjI0LCAgMC4wNzExNTZ9LAorICAgIHsgMC4yMjExNDAsICAwLjA2OTE5MSwgLTAuMDM1MDg1fSwgeyAwLjE4ODM2NywgIDAuMTI2MjAwLCAgMC4wMzUyMjV9LAorICAgIHsgMC4xODU3NjAsICAwLjA0MzUzNywgLTAuMTAxNzE0fSwgey0wLjA0MjUxOCwgIDAuMDk5NjQ2LCAgMC4wMDMyNDR9LAorICAgIHstMC4wMTUzMDgsIC0wLjAyNzUyMSwgIDAuMDQ2MDA2fSwgeyAwLjAzNDA4NiwgLTAuMDQ1Nzc3LCAgMC4wOTU5ODl9LAorICAgIHsgMC4wMDcxNzQsIC0wLjA5MzM1OCwgIDAuMDQ2NDU5fSwgey0wLjA1MTI0OCwgLTAuMDYyMDk1LCAgMC4wODMxNjF9LAorICAgIHstMC4wNDU2MjYsIC0wLjEzMzMwMSwgIDAuMDUyOTk3fSwgey0wLjAzNzg0MCwgIDAuMDI0MDQyLCAgMC4xMzEwOTd9LAorICAgIHstMC4wMjAyMTcsIC0wLjExNTk0MiwgIDAuMTI2MTcwfSwgey0wLjEzNDU1MCwgLTAuMDM2MjkxLCAgMC4xMTEzMjJ9LAorICAgIHstMC4xMTA1NzYsIC0wLjE2MDAyNCwgIDAuMDkxODQxfSwgey0wLjA5MzMwOCwgLTAuMTg0OTU4LCAgMC4wMTM5Mzl9LAorICAgIHstMC4wODI3MzUsIC0wLjE2NzQxNywgLTAuMDUxNzI1fSwgey0wLjE2OTkzNCwgLTAuMTczMDAzLCAtMC4wMDcxNTV9LAorICAgIHstMC4xMjgyNDQsIC0wLjIxMzEyMywgLTAuMDUzMzM3fSwgey0wLjA3OTg1MiwgLTAuMTU0MTE2LCAtMC4yNDY1NDZ9LAorICAgIHstMC4wMzIyNDIsIC0wLjEwODc1NiwgLTAuMjA0MTMzfSwgey0wLjE0MDExNywgLTAuMTk5NDk1LCAtMC4yODQ1MDV9LAorICAgIHsgMC4wMTA4NDIsIC0wLjA3NDk3OSwgLTAuMTY2MzMzfSwgey0wLjA5MzMxMywgIDAuMTQ1MDA2LCAgMC4wMzQxMTB9LAorICAgIHstMC4wMzkyMzYsICAwLjExMzIxMywgIDAuMTExMDUzfSwgeyAwLjA0MDYxMywgLTAuMDMxNzgzLCAgMC4xNzQwNTh9LAorICAgIHstMC4xNjQyMzIsICAwLjEzMTQyMSwgIDAuMTQ5ODQyfSwgeyAwLjAyNjg5MywgIDAuMTA3MjgxLCAgMC4xNzkyOTd9LAorICAgIHsgMC4wNDcwODYsICAwLjE1ODYwNiwgIDAuMTAzMjY3fSwgey0wLjA3MDU2NywgIDAuMjEwNDU5LCAgMC4xMzQ3MzR9LAorICAgIHsgMC4wOTQzOTIsICAwLjEzNzA1MCwgIDAuMTY2ODkyfSwgeyAwLjA4NjAzOSwgIDAuMDYzNjU3LCAgMC4xNjg4MjV9LAorICAgIHsgMC4xNTkzNzEsICAwLjEyMDg5NywgIDAuMTU0MzU3fSwgeyAwLjE0NzEwMSwgIDAuMTYwNjg0LCAgMC4xMTQ4ODJ9LAorICAgIHsgMC4xMjAxNTgsICAwLjE5OTY1MCwgIDAuMTgwOTQ4fSwgeyAwLjE5MTQxNywgIDAuMTc0NTAwLCAgMC4xNzA3MzR9LAorICAgIHsgMC4xNTkxNTMsICAwLjE0MjE2NSwgIDAuMjMzMzQ3fSwgeyAwLjIzMjAwMiwgIDAuMTUwMTgxLCAgMC4xMDI3MzZ9LAorICAgIHsgMC4xODgyOTksICAwLjIyMTczOCwgIDAuMjI4NzQ4fSwgeyAwLjI1Njc4NiwgIDAuMjA5Njg1LCAgMC4xNjE1MzR9LAorICAgIHsgMC4yNTc4NjEsICAwLjI0Nzc5MywgIDAuMjUwNTE2fSwgey0wLjE2NDQ2MSwgLTAuMDAwMTQzLCAgMC4yMzI0NjF9Cit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgbHNmX2NiNF8xNmtbMTI4XVszXSA9IHsKKyAgICB7LTAuMTkzMzY5LCAtMC4zMDQ2NDMsIC0wLjI1Mzc3N30sIHstMC4xNjQxMjUsIC0wLjI3Nzc4NiwgLTAuMTUzMTE2fSwKKyAgICB7LTAuMTM1NjgxLCAtMC4yMDkxMjAsIC0wLjIxMTcyNH0sIHstMC4xMjE4MjIsIC0wLjIxNTczNCwgLTAuMjkyMjA3fSwKKyAgICB7LTAuMTk4NzgxLCAtMC4xNjE2NzQsIC0wLjI0MjUzOH0sIHstMC4xNjQxNDcsIC0wLjE4MDU3MCwgLTAuMTM4MDcwfSwKKyAgICB7LTAuMDk1OTE1LCAtMC4xOTg2OTUsIC0wLjE1NDMwOX0sIHstMC4yNDgzODYsIC0wLjIzNDQ2MiwgLTAuMTM2OTg0fSwKKyAgICB7LTAuMTY0OTY4LCAtMC4xMDgzMTgsIC0wLjE3NTYzNX0sIHstMC4xMjQxNzEsIC0wLjExMTgwOSwgLTAuMjI0NDAyfSwKKyAgICB7LTAuMDY3Mzk4LCAtMC4xNTcwMTcsIC0wLjE5NTc1OX0sIHstMC4wOTAxMzIsIC0wLjExOTE3NCwgLTAuMTY1MjUzfSwKKyAgICB7LTAuMDk5NDYwLCAtMC4xNDY4OTUsIC0wLjEwNjc5OX0sIHstMC4xNDE0OTMsIC0wLjEwODEwMywgLTAuMTA4ODgwfSwKKyAgICB7LTAuMDg1MDg4LCAtMC4wOTgzNDAsIC0wLjEwOTk1M30sIHstMC4xMDU1MjYsIC0wLjA1NDQ2MywgLTAuMTU0MzE1fSwKKyAgICB7LTAuMDQwNDgwLCAtMC4xNDQyODUsIC0wLjEyNDA0Mn0sIHstMC4wNDA5NjksIC0wLjA4NDAzOSwgLTAuMTQyODgwfSwKKyAgICB7LTAuMDQ5MDgyLCAtMC4xMTg1NTMsIC0wLjA2NjY4Nn0sIHstMC4wOTYzMzYsIC0wLjA4NzUxNSwgLTAuMDU1NzQxfSwKKyAgICB7LTAuMDU4NjA1LCAtMC4wNTkzMjcsIC0wLjA4OTI3NX0sIHstMC4xMjE4NDIsIC0wLjA1ODY4MSwgLTAuMDg2OTQ5fSwKKyAgICB7LTAuMDUzNzkyLCAtMC4wMjIwMjUsIC0wLjEyNDQ1MX0sIHstMC4wMzY3NDQsIC0wLjA2ODg5MSwgLTAuMDQ1ODY1fSwKKyAgICB7IDAuMDAzOTAwLCAtMC4wOTgyMzcsIC0wLjA5MTE1OH0sIHstMC4wMDE2NjQsIC0wLjA0NTA4OSwgLTAuMDgxMzUzfSwKKyAgICB7LTAuMDcyODI5LCAtMC4wMzQwODcsIC0wLjAzODQxNn0sIHstMC4xMDA4MjIsIC0wLjAwNzMzMCwgLTAuMDg4NzE1fSwKKyAgICB7LTAuMDM1OTExLCAtMC4wMDU4NjQsIC0wLjA2MjU3N30sIHstMC4wMjAyMDUsIC0wLjAyNjU0NywgLTAuMDE5NjM0fSwKKyAgICB7IDAuMDA0MjkxLCAtMC4wNDEyOTAsIC0wLjEzODE4MX0sIHsgMC4wMjM0MDQsIC0wLjAxMDkzMiwgLTAuMDQ0OTA0fSwKKyAgICB7IDAuMDEzNTU3LCAgMC4wMTQ4MjMsIC0wLjA5Mjk0M30sIHsgMC4wNTk2NzMsIC0wLjAzMTAyNCwgLTAuMDk1NzM5fSwKKyAgICB7IDAuMDIxMTMwLCAtMC4wODA2MDcsIC0wLjAzNDU5NH0sIHsgMC4wMjQ2NTUsIC0wLjAzNTU2NCwgIDAuMDAzMjQzfSwKKyAgICB7IDAuMDE3MTA2LCAgMC4wMDY5NTIsIC0wLjAwMDMwOH0sIHsgMC4wNzUyMDgsIC0wLjAzMDkxMCwgLTAuMDMxMTgxfSwKKyAgICB7IDAuMDI0OTY1LCAgMC4wNDg2MzIsIC0wLjAzOTQ0OH0sIHsgMC4wNTcwMjgsICAwLjAyMTU0NywgLTAuMDA5NDE4fSwKKyAgICB7LTAuMDE4NTc3LCAgMC4wMjM2OTcsIC0wLjAwOTc1OX0sIHsgMC4wMjQwNzcsICAwLjAzMzA1MywgIDAuMDI0MzI0fSwKKyAgICB7IDAuMDM3MDUyLCAtMC4wMDM0MzYsICAwLjA0NDUzMH0sIHstMC4wMTI4NzEsIC0wLjAwNzE3OSwgIDAuMDMxNzk1fSwKKyAgICB7IDAuMDc3ODc3LCAgMC4wMjE1NDcsICAwLjAyMzEzMX0sIHsgMC4wNTMzNjUsICAwLjA1MjA3OCwgIDAuMDI5NDMzfSwKKyAgICB7IDAuMDExNDI5LCAgMC4wNzA0MjYsICAwLjAyODczNH0sIHstMC4wMDE4MjcsICAwLjAzMzExNSwgIDAuMDYxNTA1fSwKKyAgICB7LTAuMDQ0ODcwLCAgMC4wMzg1NjgsICAwLjAyNjIzOX0sIHsgMC4wNjE2MzMsICAwLjAzNDc5OSwgIDAuMDU5Nzg0fSwKKyAgICB7IDAuMDM0MjYxLCAgMC4wNjAzNDIsICAwLjA2NTE4NX0sIHsgMC4wNTg5ODEsICAwLjA4MjQ4MSwgIDAuMDQ3MjUyfSwKKyAgICB7IDAuMDkwMDA4LCAgMC4wNjU5NDIsICAwLjA0NDQ3MH0sIHsgMC4wNjY5NjEsICAwLjA3MzcyOCwgLTAuMDAwNDI4fSwKKyAgICB7IDAuMDc0NzYzLCAgMC4wNjAyOTMsICAwLjA4NTYzMn0sIHsgMC4wNjYzNjYsICAwLjEwMzM3NSwgIDAuMDc5NjQyfSwKKyAgICB7IDAuMTIyMjk3LCAgMC4wMzY1NTgsICAwLjA1ODc0NX0sIHsgMC4xMTEwNDIsICAwLjA5MjA5MywgIDAuMDg1NDEyfSwKKyAgICB7IDAuMDk5MjQzLCAgMC4xMTU0NzYsICAwLjAzOTI1NH0sIHsgMC4wMTk5NzMsICAwLjEyMjg0NCwgIDAuMDUwMjU1fSwKKyAgICB7IDAuMTU5NTcxLCAgMC4wOTg5NjUsICAwLjA1MTc0MH0sIHsgMC4xMzc2MjQsICAwLjA3MjQwNSwgLTAuMDA2OTIyfSwKKyAgICB7IDAuMTMwMjQwLCAgMC4xNDYwOTEsICAwLjA4OTY5OH0sIHsgMC4xMzgzMzUsICAwLjA5Mjk2OCwgIDAuMTM2MTkzfSwKKyAgICB7IDAuMDY2MDMxLCAgMC4xNDkzMDQsICAwLjEyNTQ3Nn0sIHsgMC4yMDI3NDksICAwLjE0NTc1MSwgIDAuMDc3MTIyfSwKKyAgICB7IDAuMDAyMjI0LCAgMC4wODI4MTEsICAwLjEzMTIwMH0sIHsgMC4xMjQ0NzYsICAwLjE3ODA3MywgIDAuMTYyMzM2fSwKKyAgICB7IDAuMTc0NzIyLCAgMC4xOTAyOTgsICAwLjEyNzEwNn0sIHsgMC4yMDIxOTMsICAwLjE1MzU2OSwgIDAuMTYzODQwfSwKKyAgICB7IDAuMjQyNjA0LCAgMC4xOTc3OTYsICAwLjEzNjkyOX0sIHsgMC4xODU4MDksICAwLjIyOTM0OCwgIDAuMTkzMzUzfSwKKyAgICB7LTAuMDU4ODE0LCAgMC4xOTUxNzgsICAwLjE0MTgyMX0sIHsgMC4yNTM2NDYsICAwLjI0NzE3NSwgIDAuMjA1NzY2fSwKKyAgICB7IDAuMDYxNDMzLCAtMC4wMjU1NDIsICAwLjExOTMxMX0sIHstMC4wNTc4MTYsICAwLjA4MjQ0NSwgIDAuMDczMjQzfSwKKyAgICB7LTAuMDY5MjM5LCAgMC4xNDg2NzgsICAwLjAzMTE0Nn0sIHstMC4wMzAyMTcsIC0wLjAwODUwMywgIDAuMTA2MTk0fSwKKyAgICB7LTAuMDI2NzA4LCAgMC4wODc0NjksIC0wLjAwOTU4OX0sIHstMC4wOTA0MTgsICAwLjAwMDI2NSwgIDAuMDU2ODA3fSwKKyAgICB7LTAuMDUwNjA3LCAtMC4wMTkzODMsICAwLjAxMDQ5NH0sIHstMC4wNzkzOTcsICAwLjAwODIzMywgLTAuMDExNDY5fSwKKyAgICB7LTAuMDcyNjM0LCAtMC4wNjExNjUsICAwLjA0NjkxN30sIHstMC4wNzU3NDEsIC0wLjA3MjM0MywgLTAuMDA3NTU3fSwKKyAgICB7LTAuMDI1MTYyLCAtMC4wNzMzNjMsICAwLjAwNTE3M30sIHstMC4xMjMzNzEsIC0wLjA0MTI1NywgLTAuMDA4Mzc1fSwKKyAgICB7LTAuMTM5OTA0LCAgMC4wMTgyODUsICAwLjAwOTkyMH0sIHstMC4xNDM0MjEsIC0wLjEwNDIzOCwgIDAuMDMzNDU3fSwKKyAgICB7LTAuMTAwOTIzLCAtMC4xMzQ0MDAsIC0wLjAyMzI1N30sIHstMC4xNTc3OTEsIC0wLjA5NTA0MiwgLTAuMDM2OTU5fSwKKyAgICB7LTAuMjE5ODkwLCAtMC4wNzg2MzcsICAwLjAwMTgxNX0sIHstMC4xODM2MDcsIC0wLjAyMzA1MywgLTAuMDQzNjc4fSwKKyAgICB7LTAuMTQ1MzAzLCAtMC4xNTg5MjMsIC0wLjA1OTA0NX0sIHstMC4xOTc2MTUsIC0wLjE2NTE5OSwgIDAuMDI4MDk5fSwKKyAgICB7LTAuMjI1MTMxLCAtMC4xNjc3NTYsIC0wLjA1NjQwMX0sIHstMC4yMTY1NzIsIC0wLjEwNDc1MSwgLTAuMTAyOTY0fSwKKyAgICB7LTAuMTcxMzM2LCAtMC4yNDE5NjcsIC0wLjA2MzQwNH0sIHstMC4xMzQwMzUsIC0wLjIwNTYxNCwgIDAuMDExODMxfSwKKyAgICB7LTAuMjk3MTE2LCAtMC4yMTExNzMsIC0wLjAxNTM1Mn0sIHstMC4wODY0NjQsIC0wLjIwMDU5MiwgLTAuMDcwNDU0fSwKKyAgICB7LTAuMjE3Nzc3LCAtMC4yNzg0MDMsICAwLjAzMDM5OH0sIHstMC4yMzYyNDgsIC0wLjMyMzY5NCwgLTAuMDg3NTg4fSwKKyAgICB7LTAuMjIyMDc0LCAtMC4yMTA3ODUsICAwLjEwNjIxMH0sIHstMC4yODM0MDAsIC0wLjA5NzA3NywgIDAuMDQxMzAzfSwKKyAgICB7LTAuMDc4NDE3LCAtMC4xNTQ0NjQsICAwLjA2Mjk1Nn0sIHstMC4yMTQ0MTcsIC0wLjEwMDY5NSwgIDAuMTIxOTA5fSwKKyAgICB7LTAuMTc4NTc2LCAtMC4wMjg4NDcsICAwLjA2MTA0Mn0sIHstMC4wMzc5OTksIC0wLjE0NDIzMywgLTAuMDEwNTQ2fSwKKyAgICB7LTAuMDg2Njk1LCAtMC4wNzA5OTYsICAwLjEyNTI4Mn0sIHsgMC4wMTA3ODgsIC0wLjA4NTAwNiwgIDAuMDU4NTI3fSwKKyAgICB7LTAuMTU0MDE1LCAgMC4wNjY1NjAsICAwLjA3MTAzOH0sIHstMC4xNDM1MDMsICAwLjAzMzI2MCwgIDAuMTU0MzkzfSwKKyAgICB7LTAuMTM0MDY5LCAgMC4wMzI0MjAsIC0wLjA1NjI5M30sIHstMC4xMTA4NTEsICAwLjA4NjkwOCwgIDAuMDAzOTIwfSwKKyAgICB7LTAuMDU3MjU0LCAgMC4wNDc2NzQsIC0wLjA1NTU3MX0sIHstMC4yMTQyMDYsICAwLjA2ODc4NCwgLTAuMDA0NzM1fSwKKyAgICB7LTAuMjU3MjY0LCAgMC4wNTA0NjgsICAwLjA4MTcwMn0sIHstMC4yOTE4MzQsICAwLjAwNDEyMCwgLTAuMDIyMzY2fSwKKyAgICB7LTAuMTczMzA5LCAtMC4wMjkwODEsIC0wLjExNTkwMX0sIHstMC4yMDc2MjIsICAwLjE2ODY2NCwgIDAuMTM2MDMwfSwKKyAgICB7IDAuMDkwNTQxLCAgMC4wMzI3NTQsIC0wLjA1NzMzMH0sIHsgMC4xNDAyMTksIC0wLjAwMDczNSwgLTAuMDE1NjMzfSwKKyAgICB7IDAuMTM2Njk3LCAtMC4wMTcxNjMsIC0wLjEwMDkwOX0sIHsgMC4wMjk4MzgsIC0wLjA4OTUxNSwgLTAuMTQ3MTMwfSwKKyAgICB7LTAuMDU1MzY3LCAtMC4wNzI2ODMsIC0wLjIxNDAxNX0sIHsgMC4wNDg2ODAsIC0wLjA1NzYzMywgLTAuMjEyNDI5fSwKKyAgICB7LTAuMDEzMTM0LCAtMC4xMTM4OTgsIC0wLjE5NjQwM30sIHstMC4wNzE3MDIsIC0wLjE1OTQwOCwgLTAuMjU0ODk1fQorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGxzZl9jYjVfMTZrWzEyOF1bNF0gPSB7CisgICAgey0wLjIwMTI3NywgLTAuMjc4Njc5LCAtMC4xNzMyNjIsIC0wLjE5ODU4MH0sCisgICAgey0wLjIxNDY2NywgLTAuMTUxOTIyLCAtMC4xMTc1NTEsIC0wLjE5MjcxM30sCisgICAgey0wLjE2MDk2MiwgLTAuMjA3NzI4LCAtMC4xMjQ3NTAsIC0wLjEyOTc0OX0sCisgICAgey0wLjEzMTA0MywgLTAuMTM3ODE4LCAtMC4xNTUyODEsIC0wLjE2NjMwOH0sCisgICAgey0wLjE3OTEzNCwgLTAuMTY5NjAyLCAtMC4xNjUyMjMsIC0wLjA2NjI5M30sCisgICAgey0wLjEzNjQ3NCwgLTAuMTc3MDM1LCAtMC4yNTAxMjcsIC0wLjEzNDM3MH0sCisgICAgey0wLjA2Njk3MCwgLTAuMTQ2Mjc0LCAtMC4xNzA2MzgsIC0wLjEzNDQzNn0sCisgICAgey0wLjA4MzI4OCwgLTAuMTY1ODYwLCAtMC4xMDM0MzcsIC0wLjE0MDM2MX0sCisgICAgey0wLjEzMDQ3NCwgLTAuMTE5MzE3LCAtMC4xMjQzOTMsIC0wLjA4NjQwOH0sCisgICAgey0wLjEyNzYwOSwgLTAuMTM0NDE1LCAtMC4wNzM1OTIsIC0wLjExNjEwM30sCisgICAgey0wLjExMzAyNywgLTAuMDkxNzU2LCAtMC4xMDc3ODYsIC0wLjEzMTkzNX0sCisgICAgey0wLjEyNTUzMCwgLTAuMTgyMTUyLCAtMC4wOTM3OTYsIC0wLjA0NTA4OH0sCisgICAgey0wLjA3NzEyMiwgLTAuMTM4MDUyLCAtMC4xNjYyNzEsIC0wLjAzODg4Nn0sCisgICAgey0wLjA3MzAyNywgLTAuMTA2ODQ1LCAtMC4wNjcwNzMsIC0wLjExMzkxMH0sCisgICAgey0wLjA0OTE0NiwgLTAuMTA3MDE5LCAtMC4xMTI1MzEsIC0wLjA2MzM4OH0sCisgICAgey0wLjEwMTUzOSwgLTAuMTE5NTg2LCAtMC4wNTAyOTcsIC0wLjA0MDY3MH0sCisgICAgey0wLjEwNzc4NCwgLTAuMDY2OTEzLCAtMC4wODA5OTMsIC0wLjA1MjM1Mn0sCisgICAgey0wLjE1MjE1NSwgLTAuMTAzMDEwLCAtMC4wOTA0NjEsIC0wLjAxNTUyNn0sCisgICAgey0wLjE1MzA4NywgLTAuMDg3NjU2LCAtMC4wMjk4ODksIC0wLjAzNzM2N30sCisgICAgey0wLjIxNTI4MSwgLTAuMTM4MDYyLCAtMC4wODkxNjIsIC0wLjA1MDgzOX0sCisgICAgey0wLjA1MzM1MCwgLTAuMDYwMTY5LCAtMC4wNjM0NTksIC0wLjAyNDQ5OX0sCisgICAgey0wLjA1MTY3NCwgLTAuMDc2MzU1LCAtMC4wMzM3MzMsIC0wLjA3NzIxMX0sCisgICAgey0wLjA0NTA0NywgLTAuMTA3MDA2LCAtMC4wMjA4ODAsIC0wLjAyNDUyNX0sCisgICAgey0wLjA4MzAwMywgLTAuMDYzNjcyLCAtMC4wMTMyNDMsIC0wLjAyODMyNH0sCisgICAgey0wLjEwNDEwNCwgLTAuMDc1NDUwLCAtMC4wMzI3NDYsICAwLjAyNDQ4MH0sCisgICAgey0wLjA4NTY5NSwgLTAuMDE5NTAyLCAtMC4wNDUxMjEsIC0wLjAyNTAxNn0sCisgICAgey0wLjEyMzEyMCwgLTAuMDMwODQ0LCAtMC4wMDM1MzMsIC0wLjAxNjIyNH0sCisgICAgey0wLjAyNTU2OCwgLTAuMDQ5MTcyLCAtMC4wMDM5MTEsIC0wLjAyNzUyMn0sCisgICAgey0wLjAzOTAyOSwgLTAuMDE5ODU3LCAtMC4wNDMyMTEsIC0wLjA1ODA4N30sCisgICAgey0wLjA0MDEyMiwgLTAuMDIzMDY3LCAtMC4wMDEzNTYsICAwLjAwODYwN30sCisgICAgey0wLjA2MzM1MSwgLTAuMDAxNzc2LCAgMC4wMTYwMTUsIC0wLjAyNzA4OH0sCisgICAgey0wLjA2ODExMCwgLTAuMDM4ODM4LCAgMC4wNDI1MjUsICAwLjAwMTA3Nn0sCisgICAgey0wLjA0MzYyMywgLTAuMDIwNzM2LCAtMC4wNDc4NjIsICAwLjAzNzcxMH0sCisgICAgey0wLjA0MTA1MiwgIDAuMDIxOTU0LCAtMC4wMjU2NjAsICAwLjAwMDc1OH0sCisgICAgey0wLjAxMzAzNSwgIDAuMDAyNTgzLCAtMC4wMDgyMzMsIC0wLjAzNzMwMH0sCisgICAgey0wLjAwNTUyMywgLTAuMDE0NjcwLCAgMC4wMTk2NTEsIC0wLjAxMjY2N30sCisgICAgey0wLjAwNDQwOSwgLTAuMDE0NDM3LCAtMC4wNTk0MTIsIC0wLjAxOTcwMX0sCisgICAgeyAwLjAyNDk0NiwgLTAuMDExNjYzLCAtMC4wMTQzNTEsIC0wLjAyODc2Mn0sCisgICAgeyAwLjAxMjY2MCwgIDAuMDE4NDg5LCAtMC4wMTAyMDUsICAwLjAxMjY5NX0sCisgICAgey0wLjAwNDQyMywgIDAuMDE3ODI3LCAgMC4wNDA1NDQsICAwLjAwMzYyOX0sCisgICAgeyAwLjAyMDY4NCwgIDAuMDI2NzQzLCAgMC4wMDc3NTIsIC0wLjAyNTU5NX0sCisgICAgeyAwLjAzMjA3MSwgIDAuMDAwMDQzLCAgMC4wMjYxODgsIC0wLjAwNjQ0NH0sCisgICAgeyAwLjA1ODc5MywgIDAuMDE1ODIwLCAtMC4wMDExMTksIC0wLjAxNzQxNX0sCisgICAgeyAwLjAyMDE1NiwgLTAuMDQ3NTkwLCAgMC4wMDQyMjcsICAwLjAwODY3MH0sCisgICAgeyAwLjA1NDc3MCwgIDAuMDMyMTM1LCAgMC4wMjk3NzAsIC0wLjAwOTc2N30sCisgICAgeyAwLjAzMDg4NCwgIDAuMDQ3NzU3LCAgMC4wMzMwNjgsICAwLjAwNjg2Nn0sCisgICAgeyAwLjA2MjAzOSwgIDAuMDExNjQ2LCAgMC4wNTYwMzcsICAwLjAxNjg1OX0sCisgICAgeyAwLjAxMzc5OCwgLTAuMDI4MTk2LCAgMC4wNjA3MTAsICAwLjAxNDI5OX0sCisgICAgeyAwLjEwMDA0MywgIDAuMDQxNDQ1LCAgMC4wMjMzNzksIC0wLjAxNDg4OX0sCisgICAgeyAwLjA2MjcyOCwgLTAuMDQyODIxLCAgMC4wMDIxODAsIC0wLjA1NTM4MH0sCisgICAgeyAwLjA2MTY2MywgIDAuMDE4NzY3LCAtMC4wMTU1NzEsIC0wLjA3NDA5NX0sCisgICAgeyAwLjA2Mjk4MCwgIDAuMDgwNDk3LCAgMC4wMTE4MDgsIC0wLjAzMTc4N30sCisgICAgeyAwLjA4NDk2NCwgIDAuMDQzMTAwLCAtMC4wMjU4NzcsICAwLjAyMDMwOX0sCisgICAgeyAwLjAxNDcwNywgIDAuMDM1NDIxLCAtMC4wNDE0NDAsIC0wLjA1MzM3M30sCisgICAgeyAwLjA4MTI2OCwgIDAuMDA1NzkxLCAtMC4wNjYyOTAsIC0wLjAzOTgyNX0sCisgICAgeyAwLjAxNzY5MSwgLTAuMDIwNDAxLCAtMC4wNDA1MTMsIC0wLjA4Mzk2MH0sCisgICAgeyAwLjEyMDg3NCwgIDAuMDU1NzUzLCAtMC4wMjU5ODgsIC0wLjA1OTU1Mn0sCisgICAgeyAwLjA3OTkxMiwgIDAuMDA3ODk0LCAtMC4wODUzODAsIC0wLjExNDU4N30sCisgICAgeyAwLjAzNjg1NiwgLTAuMDM5MzMxLCAtMC4xMDQyMzcsIC0wLjA2OTExNn0sCisgICAgeyAwLjAwODUyNiwgLTAuMDY0MjczLCAtMC4wNDgzMTIsIC0wLjAzODU5NX0sCisgICAgeyAwLjAzMzQ2MSwgLTAuMDI4OTU2LCAtMC4wNjY1MDUsICAwLjAzODcyMn0sCisgICAgey0wLjA0MjA2NCwgLTAuMDQzOTg5LCAtMC4xMDA2NTMsIC0wLjA3MTU1MH0sCisgICAgey0wLjAxNTM0MiwgLTAuMDY0ODUwLCAtMC4wNjU2NzUsIC0wLjEyMjc2OX0sCisgICAgey0wLjAwNjU4MSwgLTAuMDA0OTE5LCAtMC4xMTM1NjQsIC0wLjE0NTc1M30sCisgICAgeyAwLjAwODI3MywgLTAuMDcwNzAyLCAtMC4xNjQ5OTgsIC0wLjA5NTU0MX0sCisgICAgey0wLjAwMTY5OCwgLTAuMDYzNzQ0LCAtMC4xMjk5NzEsIC0wLjAxMTE2Mn0sCisgICAgey0wLjA0ODQ3MSwgLTAuMDg3NTAwLCAtMC4xMTEwMDYsIC0wLjE2MTgyM30sCisgICAgey0wLjAzMjE5MywgLTAuMDkxOTU1LCAtMC4wODA2NDIsICAwLjAxMjI4OH0sCisgICAgey0wLjA5NTg3MywgLTAuMDE1OTg2LCAtMC4wNzI3MjIsIC0wLjEwMTc0NX0sCisgICAgey0wLjA3OTQ3NywgLTAuMDgyMDYwLCAtMC4yMDMwMDgsIC0wLjEwMDI5N30sCisgICAgey0wLjAyMzg4MywgLTAuMDY0MDIyLCAtMC4xNjgzNDEsIC0wLjIxMTczOX0sCisgICAgey0wLjA3MDUzMCwgLTAuMTAzNTQ3LCAtMC4xMjM4NTgsICAwLjA1NTA0OX0sCisgICAgey0wLjAzMzUwMywgLTAuMDc2ODEyLCAtMC4wMTYyODcsICAwLjA0NDE1OX0sCisgICAgey0wLjA4ODQyNywgLTAuMTYxNjgyLCAtMC4wNTg1NzksICAwLjAxMzg3M30sCisgICAgey0wLjA4MzA2OCwgLTAuMTY4MjIyLCAtMC4wMTY3NzMsIC0wLjA4MDIwOX0sCisgICAgey0wLjA4MDU0OCwgLTAuMTM5MDkwLCAgMC4wMzA1NDQsICAwLjAwNzE3MX0sCisgICAgey0wLjExNzQ4MiwgLTAuMDgzNzE4LCAgMC4wMjcwNzQsIC0wLjAwMzY3NH0sCisgICAgey0wLjE2MzA4NSwgLTAuMTU2ODU2LCAtMC4wMTI2MTgsIC0wLjAyMjMyOX0sCisgICAgey0wLjE3NjU0MCwgLTAuMTEzMDQyLCAtMC4wMjAxNDgsICAwLjA1MTc3MH0sCisgICAgey0wLjE1Mzg5MSwgLTAuMTk5MjkzLCAtMC4wNDMyNDQsICAwLjAyODMzMX0sCisgICAgey0wLjEwNzgyMiwgLTAuMTUwNjE1LCAgMC4wMTY0MzAsICAwLjA5MjkxOX0sCisgICAgey0wLjEzNzY3NiwgLTAuMTgzMjI0LCAgMC4wNjYwMjYsICAwLjAyOTM0M30sCisgICAgey0wLjE5MTEwNiwgLTAuMDk5MjUwLCAgMC4wNDUzNzAsICAwLjAwNDA4NH0sCisgICAgey0wLjIzNzA0MiwgLTAuMTMwODE1LCAtMC4wMjI1NDMsIC0wLjAyOTQyOH0sCisgICAgey0wLjIwMTAxNCwgLTAuMDUzNTkxLCAtMC4wMDczMDUsIC0wLjAzMzU0N30sCisgICAgey0wLjI0OTI4NiwgLTAuMjI4NDA4LCAgMC4wMDUwMDIsICAwLjAwNzE0Nn0sCisgICAgey0wLjIwNjUwOSwgLTAuMjExOTk4LCAtMC4wNjEzNTIsIC0wLjA0NzIzM30sCisgICAgey0wLjI1NTcwMiwgLTAuMTM1MTE0LCAgMC4wNzYzNzUsICAwLjAzNjYzMH0sCisgICAgey0wLjI5NjI3MSwgLTAuMDczOTQ2LCAtMC4wMDcyNzMsIC0wLjAxOTYwMX0sCisgICAgey0wLjMwMjkxNywgLTAuMTc1MTExLCAtMC4wNzAwMjQsIC0wLjA0MzkwNX0sCisgICAgey0wLjIzOTI3NSwgLTAuMDQzOTYyLCAtMC4wODQ5ODIsIC0wLjA2NzQ0Nn0sCisgICAgey0wLjI1NDU4MywgLTAuMjk0NzIwLCAtMC4wODg3NjIsIC0wLjA3MDQ1MX0sCisgICAgey0wLjIwNTU4MywgLTAuMjM4OTk2LCAtMC4xMjQ3NTMsICAwLjAzMzA3Nn0sCisgICAgey0wLjIwNTU4MywgLTAuMjE1ODgyLCAtMC4wMjg0NzIsICAwLjExODY3OX0sCisgICAgey0wLjE1MzY0MCwgLTAuMjA0NDY0LCAtMC4wMzk2NTQsIC0wLjEzNDQ0MX0sCisgICAgey0wLjE0NTkyOSwgLTAuMTkxOTcwLCAtMC4xNzUzMDgsICAwLjAyMTM2Nn0sCisgICAgey0wLjE0OTM0OCwgLTAuMjEyNTY5LCAtMC4xMTgzMjQsICAwLjEwMzgxMn0sCisgICAgey0wLjE2NjM5NywgLTAuMjIwNTgxLCAtMC4yNjUyNjAsIC0wLjAyOTExM30sCisgICAgey0wLjE2NDE3MSwgLTAuMjMxMjYyLCAtMC4yNTg4MjgsICAwLjA2MTQyN30sCisgICAgey0wLjIwMDE5OCwgLTAuMjYzNDUzLCAtMC4yMTIwMTYsICAwLjExNTM1OX0sCisgICAgey0wLjEzMDA4OCwgLTAuMjEyMTY4LCAtMC4yMDIzNjgsICAwLjExODU2M30sCisgICAgey0wLjIwNjM4NywgLTAuMDc4MDc1LCAtMC4yMjc4NTYsIC0wLjExMTE2NX0sCisgICAgey0wLjEyOTYwNSwgLTAuMTc2ODQ4LCAtMC4yNDE1ODQsIC0wLjI1OTkwMH0sCisgICAgey0wLjE3NjgyNiwgLTAuMDQ1OTAxLCAtMC4xNDE3MTIsIC0wLjIwOTM0NX0sCisgICAgey0wLjM1MTE3MywgLTAuMDMxMDk3LCAtMC4xMzM5MzUsIC0wLjE4MjQxMn0sCisgICAgey0wLjE2NDIzMiwgIDAuMDI3MDA2LCAtMC4wMTQwMzksIC0wLjA1MzU2N30sCisgICAgey0wLjE3MTAzNywgLTAuMDI1OTI0LCAgMC4wMzA5NzIsICAwLjAxNzMyOX0sCisgICAgey0wLjA4MDg2MiwgLTAuMDIxNTc3LCAgMC4wMDc2NTIsICAwLjA2Mzk2OH0sCisgICAgey0wLjA2MTc4OCwgIDAuMDQyMDI0LCAtMC4wMTg3ODMsIC0wLjA1Nzk3OX0sCisgICAgey0wLjExMDMxMSwgIDAuMDU0NzYwLCAgMC4wMzE0NDYsIC0wLjAwNjcxMH0sCisgICAgey0wLjEzNjYzNywgIDAuMDIyMTcxLCAgMC4wODQ5OTEsICAwLjAyODAzOX0sCisgICAgey0wLjI1NDQ3MSwgLTAuMDA0Mzc2LCAgMC4wNzgwMzQsICAwLjAzMzY0OX0sCisgICAgey0wLjIzNDQ2NCwgIDAuMDg4MTU3LCAgMC4wNDA5OTksICAwLjAwMjYzOX0sCisgICAgey0wLjAzNzA5NSwgIDAuMDU5NDQzLCAgMC4wNzIxODAsICAwLjAxNTAyN30sCisgICAgey0wLjA0Njg0MSwgLTAuMDA0ODEzLCAgMC4wODgyNjYsICAwLjAzODc4Nn0sCisgICAgey0wLjA4Njc4MiwgIDAuMTIwMTAwLCAgMC4wODI2NTUsICAwLjAyMDI3MX0sCisgICAgey0wLjExODM2MSwgLTAuMDY5MjQyLCAgMC4wOTQ4NjcsICAwLjAzOTIwMH0sCisgICAgey0wLjAyMzM0MiwgLTAuMDg0MzAzLCAgMC4wNTI2ODQsICAwLjAxNzA5M30sCisgICAgey0wLjAxNDE5NCwgIDAuMDAxMDEyLCAgMC4wMTE5NDYsICAwLjA3NDEyNX0sCisgICAgey0wLjAxNTM0MiwgIDAuMDc2Mzk2LCAgMC4wMjIzNjUsIC0wLjAyODAwMX0sCisgICAgeyAwLjAyNzcwNiwgIDAuMDM3MDQ3LCAgMC4xMDc1NzMsICAwLjA2MDgxNX0sCisgICAgeyAwLjAzMDYxNSwgIDAuMDQwNjY0LCAgMC4wMTA0NjcsICAwLjA3NDI4OX0sCisgICAgeyAwLjAzODY0NiwgIDAuMTE1NTg0LCAgMC4wNjk2MjcsICAwLjAwNzY0Mn0sCisgICAgeyAwLjA5NjQ2MywgIDAuMDY5ODE4LCAgMC4wNjI0OTQsICAwLjAxNTQxM30sCisgICAgeyAwLjA1NDgzNCwgIDAuMDY1MjMyLCAgMC4wNTQyODYsICAwLjExMDA4OH0sCisgICAgeyAwLjE1MjMxMiwgIDAuMDkyMzcxLCAgMC4wMjY0MjAsIC0wLjAxMzE4NH0sCisgICAgeyAwLjE0NDI2NCwgIDAuMTIzNDM4LCAgMC4wODAxMzEsICAwLjAyMzIzM30sCisgICAgeyAwLjEyNDQwNSwgIDAuMDA5OTQzLCAtMC4xNDg0NzcsIC0wLjIwNTE4NH0KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCAqIGNvbnN0IGxzZl9jb2RlYm9va3NfMTZrW10gPSB7CisgICAgbHNmX2NiMV8xNmtbMF0sIGxzZl9jYjJfMTZrWzBdLCBsc2ZfY2IzXzE2a1swXSwgbHNmX2NiNF8xNmtbMF0sCisgICAgbHNmX2NiNV8xNmtbMF0KK307CisKKyNlbmRpZiAvKiBBVkNPREVDX1NJUFIxNktEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NpcHJkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy9zaXByZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYmMxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zaXByZGF0YS5oCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogU0lQUiAvIEFDRUxQLk5FVCBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFZsYWRpbWlyIFZvcm9zaGlsb3YKKyAqIENvcHlyaWdodCAoYykgMjAwOSBWaXRvciBTZXNzYWsKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NJUFJEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19TSVBSREFUQV9ICisKK3N0YXRpYyBjb25zdCBmbG9hdCBtZWFuX2xzZlsxMF0gPSB7CisgICAgMC4yOTcxNTEsICAwLjQ1MjMwOCwgIDAuNzY1NDQzLCAgMS4xMzQ4MDMsICAxLjQyMTEyNSwKKyAgICAxLjc3MzgyMiwgIDIuMDQ5MTczLCAgMi4zNzU5MTQsICAyLjU4NTA5NywgIDAuMDc1NzU2Cit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgbHNmX2NiMVs2NF1bMl0gPSB7CisgICAgeyAwLjAwNzU4NywgLTAuMDA1ODQzfSwgeyAwLjA0MjE2MywgLTAuMDI4MDQ4fSwgey0wLjAxNzE0NywgLTAuMDYwNzA1fSwKKyAgICB7IDAuMDEzNzczLCAtMC4wMzgxMDh9LCB7LTAuMDQxNTYzLCAtMC4wNzg1NzF9LCB7LTAuMDc2OTI4LCAtMC4xMTkzNDN9LAorICAgIHsgMC4wMTI2NTQsICAwLjE3NjAwNX0sIHsgMC4wNTk3MzcsICAwLjE1Njg2OX0sIHsgMC4xNzE3NjcsICAwLjIzMTgzN30sCisgICAgeyAwLjExNDAzMCwgIDAuMjQyMDQ3fSwgeyAwLjE2ODk3NywgIDAuMjgzMTAxfSwgeyAwLjE0NjIxMCwgIDAuMzk3OTYxfSwKKyAgICB7IDAuMjQ5NDQ2LCAgMC4yNjg0MjF9LCB7IDAuMTM3MDc0LCAgMC4xODY3MjR9LCB7LTAuMDU3NzM2LCAtMC4xMzU2Mzh9LAorICAgIHstMC4xMDk2NjQsIC0wLjEyNDYxMX0sIHstMC4wMjEyMzQsIC0wLjAzMTE3NH0sIHstMC4wMTM5OTAsIC0wLjA5MTgxOX0sCisgICAgey0wLjA0MDA0NiwgLTAuMTExNDI2fSwgey0wLjAxNjgzMCwgIDAuMDU1MzYxfSwgeyAwLjA1NzgxNSwgIDAuMDcxNjA2fSwKKyAgICB7IDAuMDYwNjcwLCAgMC4xMTQ0MzZ9LCB7IDAuMTA2Njk1LCAgMC4xNDA4Mzh9LCB7IDAuMDkzNjAxLCAgMC4wOTI3OTN9LAorICAgIHsgMC4wMzk1OTMsICAwLjAwNjE0Mn0sIHstMC4wNjY1ODksIC0wLjA5MjQ2M30sIHstMC4xMDI1ODksIC0wLjE3MTM4MH0sCisgICAgey0wLjA1OTYyMSwgLTAuMDUwNjcxfSwgeyAwLjE2NjEzMSwgIDAuMTM5NzczfSwgeyAwLjIxMzA2OSwgIDAuMTkwNzYxfSwKKyAgICB7IDAuMDYxODIwLCAgMC4wMzc2NjF9LCB7IDAuMTM2NDcxLCAgMC4wOTA4MjN9LCB7LTAuMDE5Nzg5LCAgMC4wMTM1MTV9LAorICAgIHsgMC4wMjIyODAsICAwLjA3OTQ3M30sIHsgMC4yMTUyODEsICAwLjQ2MTk1OX0sIHsgMC4yMDY0OTcsICAwLjM0MDA3N30sCisgICAgeyAwLjAxMjI0OSwgLTAuMDY1NTk2fSwgeyAwLjA5MTM0NSwgIDAuMTkwODcxfSwgeyAwLjAxOTUwNiwgIDAuMDM3MjY2fSwKKyAgICB7LTAuMDUwNzAyLCAtMC4wMTMyMjN9LCB7LTAuMDU3MzM0LCAgMC4wMjg5NDN9LCB7IDAuMjkxNTEyLCAgMC4zNzE0MTV9LAorICAgIHstMC4wNTM0NjcsICAwLjA4NDE2MH0sIHsgMC4wMjUzNzIsICAwLjM3NTMxMH0sIHsgMC4yNjk5OTUsICAwLjU2NjUyMH0sCisgICAgey0wLjA5NTI1OSwgLTAuMDEyMzUzfSwgeyAwLjA1MDQ3OSwgIDAuMjEyODkzfSwgeyAwLjEwMTIxOSwgIDAuMDQ5MzIwfSwKKyAgICB7IDAuMDcyNDI2LCAgMC4yODMzNjJ9LCB7LTAuMDg0MTE2LCAtMC4xNTA1NDJ9LCB7LTAuMDMxNDg1LCAgMC4xNDQ5MjJ9LAorICAgIHsgMC4wMTI3MTQsICAwLjI1NjkxMH0sIHstMC4wMDk1MjgsICAwLjEwMjc2OH0sIHstMC4wMzk1NzIsICAwLjIwNDk2N30sCisgICAgey0wLjA5ODgwMCwgIDAuMDU1MDM4fSwgeyAwLjAyMDcxOSwgIDAuMTI4Mzg3fSwgey0wLjA0NTU1OSwgLTAuMTc4MzczfSwKKyAgICB7LTAuMDgyMzM4LCAgMC4xMzY5MzN9LCB7LTAuMDU4MjcwLCAgMC4yOTI4MDZ9LCB7IDAuMDg0MjQyLCAgMC41MDUxMTJ9LAorICAgIHsgMC4xMjE4MjUsICAwLjMyNjM4Nn0sIHstMC4xMDI2NTgsIC0wLjA2OTM0MX0sIHsgMC4wNzE2NzUsICAwLjAwNDc0NH0sCisgICAgey0wLjExNzc2MywgLTAuMjAyNjA4fQorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGxzZl9jYjJbMTI4XVsyXSA9IHsKKyAgICB7IDAuMDI1NDEyLCAgMC4wMDYwOTV9LCB7LTAuMDY5ODAzLCAgMC4wMTA2NTB9LCB7LTAuMTc1OTU3LCAtMC4xODU4MDB9LAorICAgIHstMC4xMzkyOTgsIC0wLjA0ODAxM30sIHstMC4xNTYxNTAsIC0wLjEyOTY4OH0sIHstMC4xNjA1MjMsICAwLjA2ODAyMn0sCisgICAgeyAwLjE5OTY4MywgIDAuMjU5OTgyfSwgeyAwLjI1ODAzOCwgIDAuMjM2MTQ3fSwgeyAwLjM2NzA4OSwgIDAuMzA0NzE2fSwKKyAgICB7IDAuMjUxNzY0LCAgMC4zMDU4NTN9LCB7IDAuMzk0MzE0LCAgMC4zODIxNTN9LCB7IDAuNDQ4NTc5LCAgMC4zMzc0Mzh9LAorICAgIHsgMC4zMjMyODYsICAwLjQyNTU2M30sIHsgMC4wMTUzNjksICAwLjEyMzgyMH0sIHstMC4wMjY3NzAsICAwLjA4Mzg4MX0sCisgICAgey0wLjExMjE2MSwgLTAuMDk3OTkzfSwgey0wLjIyMTg0NywgLTAuMTYxMzExfSwgey0wLjA1MDAxNCwgLTAuMDkyODYyfSwKKyAgICB7LTAuMjE0OTYwLCAtMC4zOTg0OTh9LCB7LTAuMTE0MDYyLCAtMC4yNDEzODF9LCB7IDAuMTM3OTUwLCAgMC4xMzg4NTJ9LAorICAgIHsgMC4wMzE1MjksICAwLjA2NTcxOX0sIHsgMC4yMDg3MzQsICAwLjA4NDc2MH0sIHsgMC4xNTc4NjIsICAwLjA1NzUzNX0sCisgICAgeyAwLjEyNDc1MCwgIDAuMDExOTIyfSwgey0wLjAzNTIyNywgLTAuMTU0Mzk3fSwgey0wLjEwNTUyMywgLTAuMjkxNDI3fSwKKyAgICB7LTAuMDczNDg4LCAtMC4yMDE5NDh9LCB7LTAuMjI0MTg0LCAtMC4yNzMyOTB9LCB7LTAuMTY4MDE5LCAtMC4yNDAyOTd9LAorICAgIHstMC4yNzE1OTEsIC0wLjM4NDY4Mn0sIHstMC4xMjQ3ODQsICAwLjAxNDI1M30sIHsgMC4wMDQyMTAsIC0wLjExMDQxOH0sCisgICAgeyAwLjA3NDI3MCwgLTAuMDE0MjcyfSwgeyAwLjA1MzA1OCwgLTAuMDY4NjcyfSwgey0wLjA5MDA5OCwgLTAuMTQ1MDE5fSwKKyAgICB7IDAuMzAzMjE0LCAgMC4yMTAzMjN9LCB7IDAuNDEzNDQzLCAgMC4yNzIwMDJ9LCB7IDAuMzU2OTA0LCAgMC4yMzA2NDZ9LAorICAgIHstMC4wMzUxODYsIC0wLjAyODU3OX0sIHstMC4xMTc1NTgsICAwLjExNTEwNX0sIHstMC4xNTkyMjUsICAwLjIxODM4NX0sCisgICAgey0wLjIzMDE3OCwgIDAuMTcyOTAxfSwgey0wLjIxNjE0OCwgLTAuMTEwMTk1fSwgeyAwLjMwOTQ0NCwgIDAuMTAxNTA4fSwKKyAgICB7IDAuMjUwNDg5LCAgMC4xMTgzMzh9LCB7IDAuMjkzMzI0LCAgMC4xNTEyMDV9LCB7LTAuMDIzNjM0LCAgMC4wMzMwODR9LAorICAgIHsgMC4wNzY3MDgsICAwLjExNDAyNH0sIHsgMC4xMjMxMTksICAwLjA4NzcwNH0sIHstMC4wNjAyNjUsICAwLjEyNjU0M30sCisgICAgey0wLjIyMzc2NiwgLTAuMDIxOTAzfSwgey0wLjI0MTk4NywgLTAuMzI4MDg5fSwgeyAwLjIwNTU5OCwgIDAuMTQ3OTI1fSwKKyAgICB7LTAuMDg3MDEwLCAgMC4wNjQ2MDF9LCB7LTAuMjg3ODkyLCAtMC4yODYwOTl9LCB7LTAuMTc5NDUxLCAtMC4zNTA3ODF9LAorICAgIHstMC4yMTk1NzIsICAwLjA0MzgxNn0sIHstMC4yMTcyNjMsICAwLjI0NTU1MH0sIHstMC4yODY3NDMsIC0wLjE4MDk4MX0sCisgICAgeyAwLjE3MjY1OSwgIDAuMTEyNjIwfSwgey0wLjEwNTQyMiwgIDAuMTc2ODU2fSwgeyAwLjAwNjE3NiwgLTAuMDUxNDkxfSwKKyAgICB7IDAuMDk5ODAyLCAgMC4xNzYzMjJ9LCB7LTAuMTg2NjIwLCAtMC4wNjg5ODB9LCB7IDAuMTY0Njg5LCAgMC4xODUwMTh9LAorICAgIHsgMC41MTk4NzcsICAwLjM3NjExMX0sIHsgMC41MjE5NDEsICAwLjUzMzczMX0sIHsgMC40NzMzNzUsICAwLjQzOTUzNH0sCisgICAgeyAwLjIxNDIzNSwgIDAuMjAyNDc2fSwgeyAwLjU3OTIxNSwgIDAuNDY2OTY5fSwgeyAwLjMxMDQxNCwgIDAuMjcxMDU3fSwKKyAgICB7IDAuMjU3NDUwLCAgMC4wNTg5Mzl9LCB7IDAuMDIzOTM2LCAtMC4xNjk0NjR9LCB7LTAuMjY4ODE3LCAtMC4wNjQ1MzF9LAorICAgIHstMC4xNzQxODIsIC0wLjAwMDE5OH0sIHstMC4yNjg0MDUsIC0wLjIzNDUyOX0sIHstMC4yOTY1MjIsICAwLjI0NzE0MH0sCisgICAgeyAwLjExNTk1MCwgLTAuMDcyMTk0fSwgey0wLjMwMzY2NiwgIDAuMTQ5MDg0fSwgey0wLjM0Nzc2MiwgLTAuMDExMDAyfSwKKyAgICB7LTAuMjIzODI5LCAtMC4yMTQxMzd9LCB7LTAuMjc4OTU4LCAtMC40NTc5NzV9LCB7IDAuMTM1NTAwLCAgMC4yMzg0NjZ9LAorICAgIHsgMC4zMTI3MzAsICAwLjM0Mjc2MH0sIHsgMC4wNzE3NTQsIC0wLjEyNTkxMn0sIHsgMC40ODU5MzgsICAwLjI2MDQyOX0sCisgICAgeyAwLjAzNzUzNiwgIDAuMTc5NzcxfSwgeyAwLjM5MTQ5MywgIDAuMTU2OTM4fSwgeyAwLjM5NzMyMCwgIDAuNDg0NDQ2fSwKKyAgICB7LTAuMzA4NjMwLCAtMC4zNDI0MTh9LCB7LTAuMjY5NTk5LCAtMC4xMjg0NTN9LCB7LTAuMDg2NjgzLCAtMC4wNDM4NjN9LAorICAgIHsgMC40MjExMTUsICAwLjIxMzUyMX0sIHsgMC4wODI0MTcsICAwLjA0OTAwNn0sIHstMC4wODc4NzMsICAwLjIzODEyNn0sCisgICAgeyAwLjMzODg5OSwgIDAuMTY2MTMxfSwgey0wLjE2Njk4OCwgIDAuMTQ3MTA1fSwgey0wLjE2NzIxNCwgLTAuMjk0MDc1fSwKKyAgICB7IDAuNTg4NzA2LCAgMC4zMjgzMDN9LCB7IDAuMjA3MjcwLCAgMC4wMTc2NzF9LCB7LTAuMTQxNjU4LCAgMC4yOTExNDd9LAorICAgIHstMC4xNDA4NTAsICAwLjM3NDMyMX0sIHsgMC4wMjgxODAsICAwLjMyMjUxMH0sIHstMC4yMjk4NTgsICAwLjMyODAzNn0sCisgICAgey0wLjA2MDc0MywgLTAuMjYwOTE2fSwgey0wLjAxMTEzMSwgIDAuMjQ2NDQyfSwgey0wLjA1ODE1MSwgIDAuMzEwNzYwfSwKKyAgICB7LTAuMTI3NTM2LCAtMC4xODY0MzJ9LCB7LTAuMTI4NTIzLCAtMC4zMzQ4ODR9LCB7LTAuMjgzODk5LCAgMC4wNzc3Mjl9LAorICAgIHstMC4wMzE1OTUsICAwLjE4MTAxNX0sIHstMC4zMjkzMzAsIC0wLjEwODYzMH0sIHstMC4yMTU3MzksICAwLjEwNzQ1OH0sCisgICAgeyAwLjE3NTczNCwgIDAuMzI3MTM0fSwgeyAwLjI1NTgwMSwgIDAuMTc2MDc3fSwgeyAwLjIyODI2NSwgIDAuMzk2ODU5fSwKKyAgICB7LTAuMzcwOTA5LCAtMC4xODUwODF9LCB7LTAuMzU1MTM4LCAtMC4zMDA0MDV9LCB7IDAuMDYxNjY5LCAgMC4yNDI2MTZ9LAorICAgIHsgMC4xMDQ0ODksICAwLjMwNzk5NX0sIHstMC4zMjAwMjEsIC0wLjIzNDAwMn0sIHsgMC4wNzczNDksICAwLjQxNjI4Nn0sCisgICAgey0wLjMzOTQ3MSwgLTAuNDA3NjA5fSwgey0wLjAxOTM4NCwgLTAuMjE1MTExfSwgeyAwLjE2ODIyOSwgLTAuMDMyNDUzfSwKKyAgICB7LTAuMDQwMTQwLCAgMC4zOTk2NTh9LCB7LTAuMjc1MTQxLCAgMC4wMDgyMTh9Cit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgbHNmX2NiM1sxMjhdWzJdID0geworICAgIHsgMC4wMjQ2MDgsICAwLjAwNjE5OH0sIHstMC4yMTY2MTYsIC0wLjM5ODE2OX0sIHstMC4wODk2MDEsIC0wLjIwMTM3MH0sCisgICAgey0wLjEyMTg3OCwgLTAuMzA1MjgxfSwgeyAwLjAzNzkxMywgIDAuMDU5MzIwfSwgeyAwLjI0NTEyNiwgIDAuMjQ0MDg5fSwKKyAgICB7IDAuMjY2ODUzLCAgMC4xODI0NzZ9LCB7IDAuMzE5MzYyLCAgMC4yMDM0ODF9LCB7IDAuMzQ5OTQ1LCAgMC4yNTI2NDR9LAorICAgIHsgMC4zOTM4NDksICAwLjI3OTI3Mn0sIHsgMC40NDU3MDcsICAwLjI1ODA2M30sIHsgMC4zODczMjEsICAwLjIwMDg1NX0sCisgICAgey0wLjAzODgxOCwgIDAuMTI5NjAzfSwgey0wLjAwOTUxMCwgIDAuMDc2NDQxfSwgey0wLjAyMzg5MiwgLTAuMDI4MTk5fSwKKyAgICB7LTAuMTE3MTM0LCAtMC4xNDU5OTB9LCB7LTAuMTg2NTg1LCAtMC4wNTI4ODZ9LCB7LTAuMDM0MjUwLCAtMC4wODQ1NDd9LAorICAgIHstMC4wODc0NDMsIC0wLjA5NTQyNn0sIHstMC40NTMzMjIsIC0wLjE3NDQ5M30sIHstMC4zNjM5NzUsIC0wLjE0ODE4Nn0sCisgICAgey0wLjMzNDQxMywgLTAuMjAyNDc5fSwgey0wLjIyMTMxMywgLTAuMTgxMzIwfSwgey0wLjEzMTE0NiwgLTAuMDUwNjExfSwKKyAgICB7LTAuMTA0NzA2LCAgMC4xMTUxMzl9LCB7IDAuMTkyNzY1LCAgMC4yNzU0MTd9LCB7IDAuMDE0MTg0LCAgMC4xOTQyNTF9LAorICAgIHsgMC4xNTQyMTUsICAwLjIyNjk0OX0sIHsgMC4wODQwMzEsICAwLjIyMTc1OX0sIHsgMC4xODk0MzgsICAwLjE2NDU2Nn0sCisgICAgeyAwLjEzMDczNywgIDAuMTcwOTYyfSwgey0wLjA2NjgxNSwgIDAuMDYyOTU0fSwgey0wLjE3NzE3NiwgLTAuMTQ1MTY3fSwKKyAgICB7LTAuMjQ3NjA4LCAtMC4xMjk3Njd9LCB7LTAuMTg3ODg2LCAtMC4yOTM3MjB9LCB7LTAuMjQ0MDM2LCAtMC4zNDQ2NTV9LAorICAgIHstMC4yMDMwNjMsIC0wLjIzNDk0N30sIHstMC4yOTI3MTUsIC0wLjE1ODQyMX0sIHsgMC4wNjQ5OTAsIC0wLjAyODE2NH0sCisgICAgeyAwLjE0NzY2NCwgIDAuMDg1OTk1fSwgeyAwLjEwNzk3NywgIDAuMDAyMjUzfSwgeyAwLjA3MTI4NiwgIDAuMDI3NTMzfSwKKyAgICB7IDAuMDIxMDE3LCAtMC4wNDk4MDd9LCB7LTAuMjcyMDU2LCAtMC4yMTc4NTd9LCB7LTAuMDY1NTk2LCAgMC4wMDgzNzV9LAorICAgIHstMC4xNTA4MTgsIC0wLjE5NTUxNH0sIHstMC4wMTI3NjcsIC0wLjE1MDc4N30sIHsgMC4yMzg1NDEsICAwLjEzNjYwNn0sCisgICAgeyAwLjI5MTc0MSwgIDAuMTE0MDI0fSwgeyAwLjIwMjY3NywgIDAuMTAzNzAxfSwgeyAwLjE0MDk4NSwgIDAuMDM3NzU5fSwKKyAgICB7LTAuMjU3MzQ3LCAtMC40NDIzODN9LCB7LTAuMzIwNjY2LCAtMC4zMTk3NDJ9LCB7LTAuNDg4NzI1LCAtMC42MDM2NjB9LAorICAgIHstMC4zMTkxNzAsIC0wLjQ2OTgwNn0sIHsgMC4wMTQ5NzAsIC0wLjEwMTA3NH0sIHsgMC4xMDIyMDksICAwLjA2Njc5MH0sCisgICAgey0wLjA3NjIwMiwgLTAuMDQ0ODg0fSwgeyAwLjA3Mzg2OCwgIDAuMTUyNTY1fSwgeyAwLjA3MDc1NSwgLTAuMDkxMzU4fSwKKyAgICB7LTAuMDE2NzUxLCAgMC4wMjcyMTZ9LCB7IDAuMDcxMjAxLCAgMC4wOTY5ODF9LCB7LTAuMDYwOTc1LCAtMC4xNDU2Mzh9LAorICAgIHsgMC4xMTQxNTYsICAwLjExNzU4N30sIHstMC4yODQ3NTcsIC0wLjAyOTEwMX0sIHstMC4yNTMwMDUsIC0wLjA3MzY0NX0sCisgICAgey0wLjIwNDAyOCwgLTAuMDk4NDkyfSwgey0wLjExNDUwOCwgIDAuMDAxMjE5fSwgey0wLjIyNTI4NCwgLTAuMDExOTk4fSwKKyAgICB7LTAuMjM1NjcwLCAgMC4wODQzMzB9LCB7IDAuMTYxOTIxLCAgMC4xMjgzMzR9LCB7IDAuMDI1NzE3LCAgMC4xMTk0NTZ9LAorICAgIHstMC4yNTUyOTIsIC0wLjI4MTQ3MX0sIHstMC4zOTI4MDMsIC0wLjA5NTgwOX0sIHsgMC4wMzkyMjksIC0wLjE1MjExMH0sCisgICAgey0wLjMxMDkwNSwgLTAuMDk5MjMzfSwgey0wLjI2ODc3MywgIDAuMDMyMzA4fSwgey0wLjM0MDE1MCwgIDAuMDEzMTI5fSwKKyAgICB7LTAuMzQ0ODkwLCAtMC4wNDUxNTd9LCB7LTAuMTg4NDIzLCAgMC4yNjU2MDN9LCB7LTAuMTY4MjM1LCAtMC4wMDA5MzZ9LAorICAgIHsgMC4wMDA0NjIsICAwLjI5NzAwMH0sIHsgMC4yNjM2NzQsICAwLjM3MTIxNH0sIHstMC4xNDY3OTcsIC0wLjA5ODIyNX0sCisgICAgey0wLjM4NjU1NywgLTAuMjgyNDI2fSwgey0wLjA3MDk0MCwgLTAuMjU1NTUwfSwgeyAwLjI5MzI1OCwgIDAuMjUyNzg1fSwKKyAgICB7IDAuNDA4MzMyLCAgMC4zODc3NTF9LCB7LTAuMzgxOTE0LCAtMC4zNTg5MTh9LCB7LTAuNDYzNjIxLCAtMC4zMTU1NjB9LAorICAgIHstMC4zMjM2ODEsIC0wLjI1ODQ2NX0sIHsgMC4yNTAwNTUsICAwLjA3MTE5NX0sIHstMC40MDUyNTYsIC0wLjQyOTc1NH0sCisgICAgey0wLjEzNTc0OCwgLTAuMjUxMjc0fSwgeyAwLjE4NjgyNywgIDAuMDYwMTc3fSwgeyAwLjExNjc0MiwgLTAuMDUzNTI2fSwKKyAgICB7LTAuNDAzMzIxLCAtMC4yMjAzMzl9LCB7LTAuNDE0MTQ0LCAtMC4wMjExMDh9LCB7LTAuNDE2ODc3LCAgMC4wNTAxODR9LAorICAgIHstMC40NzAwODMsIC0wLjA3OTU2NH0sIHstMC4zMTU1NTQsICAwLjIxOTIxN30sIHstMC4yNzMxODMsICAwLjEzODQzN30sCisgICAgeyAwLjI1MzIzMSwgIDAuMzA2Mzc0fSwgeyAwLjE3NzgwMiwgIDAuMzQ2Mjk4fSwgeyAwLjIxMDM1OCwgIDAuMjA3Njk3fSwKKyAgICB7LTAuMzIzNDgwLCAgMC4wNzc1MTl9LCB7LTAuMTkzMTM2LCAgMC4wNDgxNzB9LCB7IDAuMTE0NDkyLCAgMC4yOTI3Nzh9LAorICAgIHstMC4xMzA3NjYsICAwLjA1NjY3N30sIHstMC4xNzE1NzIsIC0wLjM0OTI2N30sIHstMC4zNzAwNzYsIC0wLjUzNjM5Mn0sCisgICAgey0wLjMxMTEwOSwgLTAuMzg5OTUzfSwgeyAwLjMzNDkyOCwgIDAuMzY3NjY0fSwgeyAwLjM1MTI0NiwgIDAuNDM4NjY0fSwKKyAgICB7IDAuNTE4ODAzLCAgMC4zMzEyNTN9LCB7IDAuNDM3MDYxLCAgMC4zMjcyNTd9LCB7IDAuMzE4OTA2LCAgMC4zMDczODl9LAorICAgIHstMC4wMjU5NzIsIC0wLjIwNjc1OH0sIHsgMC4zNzMyNzgsICAwLjMyNTQzOH0sIHsgMC40NzM0ODgsICAwLjM4OTQ0MX0sCisgICAgeyAwLjQ3ODU1MywgIDAuNDc3OTkwfSwgeyAwLjMzMjc4MywgIDAuMTUzODI1fSwgeyAwLjIxMjA5OCwgIDAuNDUyMzM2fSwKKyAgICB7IDAuMTYxNTIyLCAtMC4wMTEyMTJ9LCB7IDAuMjA5MzY4LCAgMC4wMjA2ODd9LCB7LTAuMDg2MjYyLCAgMC4yMDQ0OTN9LAorICAgIHstMC4zODg2NDMsICAwLjEzMzY0MH0sIHstMC4xNzcwMTYsICAwLjEzNDQwNH0KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBsc2ZfY2I0WzEyOF1bMl0gPSB7CisgICAgey0wLjAwMzU5NCwgLTAuMDIyNDQ3fSwgeyAwLjA3MDY1MSwgIDAuMDI4MzM0fSwgey0wLjI5MDM3NCwgLTAuMDE4MzQ3fSwKKyAgICB7LTAuMjI0NDk1LCAtMC4zNzAzMTJ9LCB7LTAuMjY5NTU1LCAtMC4xMzEyMjd9LCB7LTAuMTIyNzE0LCAtMC4yNjc3MzN9LAorICAgIHsgMC4xNzMzMjUsICAwLjEzODY5OH0sIHsgMC4xNjE5NDYsICAwLjAyMDY4N30sIHsgMC4xMTE3MDYsICAwLjAyMjUxMH0sCisgICAgeyAwLjA5NzYzOCwgIDAuMDU2MDQ5fSwgeyAwLjEzOTc1NCwgIDAuMDU5OTIwfSwgeyAwLjA1NjU0OSwgLTAuMDUwNTg2fSwKKyAgICB7IDAuMDM2MzAxLCAgMC4wMjE1MDF9LCB7LTAuMDY2MzQ3LCAgMC4wMTIzMjR9LCB7LTAuMDY2OTcyLCAgMC4wOTYxMzZ9LAorICAgIHstMC4xMjAwNjIsIC0wLjA4NDIwMX0sIHsgMC4wMTEyMjUsICAwLjA0NzQyNX0sIHstMC4wMTI4NDYsIC0wLjA2NzM5MH0sCisgICAgey0wLjExNjIwMSwgIDAuMTIyODc0fSwgey0wLjAyNzgxOSwgIDAuMDM1NDUzfSwgey0wLjAyNDc0MywgIDAuMDcyODM1fSwKKyAgICB7LTAuMDM0MDYxLCAtMC4wMDEzMTB9LCB7IDAuMDc3NDY5LCAgMC4wODE2MDl9LCB7IDAuMTI4MzQ3LCAgMC4xMzk1ODR9LAorICAgIHsgMC4xODM0MTYsICAwLjA4NjU2M30sIHstMC4xNTU4MzksIC0wLjA1Mzc3NX0sIHstMC4xOTA0MDMsIC0wLjAxODYzOX0sCisgICAgey0wLjIwMjU0OCwgLTAuMDYyODQxfSwgey0wLjM3MzczMywgLTAuMjc1MDk0fSwgey0wLjM5NDI2MCwgLTAuMTg2NTEzfSwKKyAgICB7LTAuNDY1NzAwLCAtMC4yMjAwMzF9LCB7IDAuMDY0NDAwLCAtMC4wOTU4MjV9LCB7LTAuMjYyMDUzLCAtMC4xOTk4Mzd9LAorICAgIHstMC4xNjcyMzMsIC0wLjA5NDQwMn0sIHsgMC4wNDg2MDAsICAwLjA1NzU2N30sIHstMC4wMDcxMjIsICAwLjE2ODUwNn0sCisgICAgeyAwLjA1MDkzOCwgIDAuMTU2NDUxfSwgey0wLjA2MDgyOCwgIDAuMTQ3MDgzfSwgey0wLjE3MTg4OSwgIDAuMTk1ODIyfSwKKyAgICB7LTAuMjE4OTM0LCAgMC4xMzg0MzF9LCB7LTAuMjcwNTMyLCAgMC4xOTU3NzV9LCB7LTAuNDA1ODE4LCAgMC4wNzU2NDN9LAorICAgIHstMC40NDAxODcsICAwLjE5MzM4N30sIHstMC40ODQ5NjgsICAwLjE1NzYwN30sIHstMC40ODA1NjAsICAwLjA2NzIzMH0sCisgICAgey0wLjQzNjc1NywgLTAuMTExODQ3fSwgey0wLjA0MDczMSwgLTAuMDQwMzYzfSwgey0wLjIwMjMxOSwgLTAuMTcwNDU3fSwKKyAgICB7LTAuMTU4NTE1LCAtMC4xMzQ1NTF9LCB7LTAuMzU2NzA5LCAtMC4zNzg1NDl9LCB7LTAuMjY4ODIwLCAtMC4yODk4MzF9LAorICAgIHstMC4xODg0ODYsIC0wLjI4OTMwNn0sIHstMC4xNDgxMzksIC0wLjE3NzYxNn0sIHstMC4wNzE1OTEsIC0wLjE5MTEyOH0sCisgICAgey0wLjA1MjI3MCwgLTAuMTUwNTg5fSwgey0wLjAyMDU0MywgLTAuMTE2MjIwfSwgeyAwLjAzOTU4NCwgLTAuMDEyNTkyfSwKKyAgICB7LTAuMjY4MjI2LCAgMC4wNDI3MDR9LCB7LTAuMjA5NzU1LCAgMC4wNjk0MjN9LCB7LTAuMTY4OTY0LCAgMC4xMjQ1MDR9LAorICAgIHstMC4zNjMyNDAsICAwLjE4ODI2Nn0sIHstMC41MjQ5MzUsIC0wLjAyNTAxMH0sIHstMC4xMDU4OTQsIC0wLjAwMjY5OX0sCisgICAgey0wLjI1MTgzMCwgLTAuMDYyMDE4fSwgey0wLjMxMDQ4MCwgLTAuMDgyMzI1fSwgeyAwLjAxNDY1MiwgIDAuMDgzMTI3fSwKKyAgICB7LTAuMTM2NTEyLCAgMC4wMzMxMTZ9LCB7LTAuMDczNzU1LCAtMC4wMjUyMzZ9LCB7IDAuMTEwNzY2LCAgMC4wOTU5NTR9LAorICAgIHsgMC4wMDI4NzgsICAwLjAxMTgzOH0sIHstMC4wNzQ5NzcsIC0wLjI0NDU4Nn0sIHstMC4wNDcwMjMsIC0wLjA4MTMzOX0sCisgICAgey0wLjE4MzI0OSwgIDAuMDI5NTI1fSwgeyAwLjI2MzQzNSwgIDAuMjA2OTM0fSwgey0wLjE1NjcyMSwgLTAuMjI5OTkzfSwKKyAgICB7LTAuMTEyMjI0LCAtMC4yMDg5NDF9LCB7LTAuMTE2NTM0LCAtMC4xMjMxOTF9LCB7LTAuMDczOTg4LCAtMC4xMTE2Njh9LAorICAgIHsgMC4wMjk0ODQsIC0wLjEzNzU3M30sIHstMC4wMDk4MDIsIC0wLjE2MTY4NX0sIHstMC4wMjMyNzMsICAwLjExNDA0M30sCisgICAgey0wLjMzMjY1MSwgIDAuMDQ5MDcyfSwgey0wLjM5NDAwOSwgIDAuMDE4NjA4fSwgey0wLjQzMzU0MywgLTAuMDM1MzE4fSwKKyAgICB7LTAuMzY4NDU5LCAtMC4xMDgwMjR9LCB7LTAuMzUwMjE1LCAtMC4wMzc2MTd9LCB7LTAuMzIxMTQwLCAtMC4xNzg1Mzd9LAorICAgIHsgMC4wMjAzMDcsIC0wLjA0ODQ4N30sIHstMC4yMTA1MTIsIC0wLjIzMjI3NH0sIHstMC4wODIxNDAsIC0wLjA2NTQ0M30sCisgICAgeyAwLjA4MTk2MSwgLTAuMDA5MzQwfSwgeyAwLjE0Njc5NCwgIDAuMTAxOTczfSwgeyAwLjIxMzk5OSwgIDAuMTI0Njg3fSwKKyAgICB7IDAuMTAwMjE3LCAtMC4wNTQwOTV9LCB7LTAuMTE0NDExLCAtMC4wNDE0MDN9LCB7LTAuMDk3NjMxLCAgMC4wMzcwNjF9LAorICAgIHstMC4wOTk2NTEsIC0wLjE1Nzk3OH0sIHstMC4yMTU3OTAsIC0wLjExNjU1MH0sIHstMC4xMDcxMDAsICAwLjA3NjMwMH0sCisgICAgeyAwLjA4NDY1MywgIDAuMTI2MDg4fSwgeyAwLjI0NjQzOSwgIDAuMDkxNDQyfSwgeyAwLjE2MDA3NywgIDAuMTg4NTM2fSwKKyAgICB7IDAuMjczOTAwLCAgMC4yNzkxOTB9LCB7IDAuMzIwNDE3LCAgMC4yMzI1NTB9LCB7IDAuMTMyNzEwLCAtMC4wMTg5ODh9LAorICAgIHsgMC4wMTg5NTAsIC0wLjA5MTY4MX0sIHstMC4wMzIwNzMsIC0wLjIwMjkwNn0sIHsgMC4yMTI3ODksICAwLjE3ODE4OH0sCisgICAgeyAwLjIwODU4MCwgIDAuMjM5NzI2fSwgeyAwLjA0OTQyMCwgIDAuMDk5ODQwfSwgey0wLjE0NTY5NSwgLTAuMDEwNjE5fSwKKyAgICB7LTAuMTMyNTI1LCAtMC4zMjI2NjB9LCB7IDAuMDE5NjY2LCAgMC4xMjY2MDN9LCB7IDAuMjYwODA5LCAgMC4xNDc3Mjd9LAorICAgIHstMC4yMzI3OTUsIC0wLjAwMTA5MH0sIHstMC4wNDk4MjYsICAwLjIyNTk4N30sIHstMC4xNTQ3NzQsICAwLjA3NjYxNH0sCisgICAgeyAwLjA0NTAzMiwgIDAuMjIxMzk3fSwgeyAwLjMyMTAxNCwgIDAuMTYxNjMyfSwgey0wLjA2MjM3OSwgIDAuMDUzNTg2fSwKKyAgICB7IDAuMTMyMjUyLCAgMC4yNDY2NzV9LCB7IDAuMzkyNjI3LCAgMC4yNzE5MDV9LCB7LTAuMjY0NTg1LCAgMC4xMDIzNDR9LAorICAgIHstMC4zMjcyMDAsICAwLjEyMTYyNH0sIHstMC4zOTk2NDIsICAwLjEyNDQ0NX0sIHstMC4xMDgzMzUsICAwLjE3OTE3MX0sCisgICAgeyAwLjEwMDM3NCwgIDAuMTgyNzMxfSwgeyAwLjIwMzg1MiwgIDAuMDQ5NTA1fQorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGxzZl9jYjVbMzJdWzJdID0geworICAgIHstMC4wNDc3MDUsICAwLjAwODAwMn0sIHsgMC4wMTEzMzIsICAwLjA2NTAyOH0sIHstMC4wMjE3OTYsIC0wLjAzNDc3N30sCisgICAgey0wLjE0NzM5NCwgLTAuMDAxMjQxfSwgey0wLjAwMTU3NywgIDAuMDIwNTk5fSwgey0wLjA4MzgyNywgLTAuMDI4OTc1fSwKKyAgICB7LTAuMTc3NzA3LCAgMC4wNjYwNDZ9LCB7LTAuMDQzMjQxLCAtMC4xNjUxNDR9LCB7IDAuMDUzMzIyLCAgMC4wOTY1MTl9LAorICAgIHstMC4wOTc2ODgsICAwLjEwNjQ4NH0sIHstMC4wMjMzOTIsICAwLjExMTIzNH0sIHstMC4xNDY3NDcsIC0wLjE1OTM2MH0sCisgICAgeyAwLjAyNzI0MSwgLTAuMDExODA2fSwgey0wLjA0MzE1NiwgIDAuMDU3NjY3fSwgeyAwLjAxOTUxNiwgLTAuMDYyMTE2fSwKKyAgICB7IDAuMDI1OTkwLCAgMC4xNjI1MzN9LCB7IDAuMDkxODg4LCAgMC4wMDk3MjB9LCB7LTAuMDk4NTExLCAgMC4wMzY0MTR9LAorICAgIHsgMC4wMTM3MjIsIC0wLjExNjUxMn0sIHsgMC4wNTQ4MzMsIC0wLjE4MDk3NX0sIHsgMC4xMTk0OTcsICAwLjEyODc3NH0sCisgICAgeyAwLjExODM3OCwgLTAuMTI1OTk3fSwgeyAwLjA2NTg4MiwgLTAuMDMwOTMyfSwgeyAwLjEyMDU4MSwgLTAuMDM5OTY0fSwKKyAgICB7LTAuMDUwNTYxLCAtMC4wODg1Nzd9LCB7IDAuMDUwMTM0LCAgMC4wMzMxOTR9LCB7LTAuMTI5NjU0LCAtMC4wNzUxMTJ9LAorICAgIHstMC4yMjUzMzQsIC0wLjA0MDIzNH0sIHsgMC4wNzA2MjksIC0wLjA4NDQ1NX0sIHsgMC4wOTU1MDgsICAwLjA2MzU0OH0sCisgICAgeyAwLjE1MDUxNCwgIDAuMDM0MzY2fSwgeyAwLjE4NjA5MiwgLTAuMDY5MjcyfQorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0ICogY29uc3QgbHNmX2NvZGVib29rc1tdID0geworICAgIGxzZl9jYjFbMF0sIGxzZl9jYjJbMF0sIGxzZl9jYjNbMF0sIGxzZl9jYjRbMF0sIGxzZl9jYjVbMF0KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBnYWluX2NiWzEyOF1bMl0gPSB7CisgICAgezAuMDM1MjMwLCAwLjE2MTU0MH0sIHswLjA0OTIyMywgMC40NDgzNTl9LCB7MC4wNTc0NDMsIDAuODA5MDQzfSwKKyAgICB7MC4wNzI0MzQsIDEuNzYwMzA2fSwgezAuMTExNDkxLCAwLjU2NjQxOH0sIHswLjExMjgyMCwgMS4wOTg1MjR9LAorICAgIHswLjE0MzQ5MywgMC43MjY4NTZ9LCB7MC4xNDQ4NDAsIDAuMzQ3ODAwfSwgezAuMTgwMzQxLCAxLjA1MDAxMH0sCisgICAgezAuMTg4MTcxLCAyLjE5NzI1Nn0sIHswLjE4OTc3MSwgMC4yNTY5NDd9LCB7MC4xOTgyNjAsIDAuNDg0Njc4fSwKKyAgICB7MC4yMTA2MjIsIDAuNzU1ODI1fSwgezAuMjIwNjk0LCAwLjU5MDc4OH0sIHswLjIzNzA2MiwgMS4zMjIyMTR9LAorICAgIHswLjI1NTE3NSwgMC4zMzg3MTB9LCB7MC4yOTg5ODAsIDAuOTE5MDUxfSwgezAuMzE0NjI3LCAwLjUyMDk2MX0sCisgICAgezAuMzM3MTA2LCAxLjQ2OTg2M30sIHswLjM0MTQyMiwgMi44MDQ1NDZ9LCB7MC4zNjMyNTcsIDAuNzM2MjIyfSwKKyAgICB7MC4zNjM4ODEsIDAuMzY3NjQwfSwgezAuMzY5ODUwLCAxLjkzNzkzNH0sIHswLjM3MDEzNiwgMS4wNzUyMDF9LAorICAgIHswLjM5NzE1MiwgMC41NDk0MTB9LCB7MC40MjY1NTcsIDAuODc2MDE1fSwgezAuNDUwNjg2LCAwLjIxNTU4OH0sCisgICAgezAuNDY4MTE2LCAwLjY3MTg0OH0sIHswLjQ3MDQ5NSwgMS4yNDIwMzR9LCB7MC40NzQxODAsIDEuNzM5ODQ1fSwKKyAgICB7MC40ODQ4NzUsIDAuNDkwNTY0fSwgezAuNDk4OTE3LCAwLjk3MTIzOH0sIHswLjUzMDk5NiwgMC43ODU3NjV9LAorICAgIHswLjUzOTc2OCwgMi4xMzA2ODl9LCB7MC41NDYwMjEsIDAuNTg5NTQ0fSwgezAuNTQ2NjMyLCAzLjA1MDg0Nn0sCisgICAgezAuNTUyMzM2LCAwLjM4OTc3NX0sIHswLjU1NjMwMiwgMS40MDAxMDN9LCB7MC41NTk2ODgsIDEuMTA1NDIxfSwKKyAgICB7MC41NzQxNDAsIDAuNjY3NTEzfSwgezAuNTk1NTQ3LCAwLjgyODk0M30sIHswLjU5Nzc3MSwgMC40OTY5Mjl9LAorICAgIHswLjYxNzA3OSwgMS44NjMwNzV9LCB7MC42MTk2NTcsIDEuMjIxNzEzfSwgezAuNjIxMTcyLCAwLjk1MDI3NX0sCisgICAgezAuNjI4NDI2LCAwLjYzMDc2Nn0sIHswLjYyODY4OSwgNC4yNDIxNjR9LCB7MC42NDA4OTksIDEuNTI5ODQ2fSwKKyAgICB7MC42NDU4MTMsIDAuMzMxMTI3fSwgezAuNjUzMDU2LCAwLjc0ODE2OH0sIHswLjY2MjkwOSwgMS4wNzc0Mzh9LAorICAgIHswLjY2OTUwNSwgMi42MzExMTR9LCB7MC42ODE1NzAsIDEuODM5Mjk4fSwgezAuNjg3ODQ0LCAwLjkwMzQwMH0sCisgICAgezAuNjg4NjYwLCAxLjI3MDgzMH0sIHswLjY5NTA3MCwgMC41NzgyMjd9LCB7MC42OTc5MjYsIDAuNDI4NDQwfSwKKyAgICB7MC43MTU0NTQsIDAuODEyMzU1fSwgezAuNzI5OTgxLCAxLjUzOTM1N30sIHswLjczNzQzNCwgMS4xMDY3NjV9LAorICAgIHswLjc0MDI0MSwgMi4wMzMzNzR9LCB7MC43NDA4NzEsIDAuNTY4NDYwfSwgezAuNzUyNjg5LCAwLjY5ODQ2MX0sCisgICAgezAuNzU2NTg3LCAwLjg5MzA3OH0sIHswLjc2Nzc5NywgMC40OTkyNDZ9LCB7MC43Njg1MTYsIDMuNzEyNDM0fSwKKyAgICB7MC43NzMxNTMsIDEuMzMyMzYwfSwgezAuNzg2MTI1LCAxLjA0Mjk5Nn0sIHswLjc4ODc5MiwgMC4yMzgzODh9LAorICAgIHswLjc5MDg2MSwgMi4yNzMyMjl9LCB7MC43OTUzMzgsIDEuNTgyNzY3fSwgezAuODA5NjIxLCAwLjU5NTUwMX0sCisgICAgezAuODIxMDMyLCAwLjc1NjQ2MH0sIHswLjgyNDU5MCwgMC45MjI5MjV9LCB7MC44MjYwMTksIDEuMTg2NzkzfSwKKyAgICB7MC44Mjc0MjYsIDEuODg1MDc2fSwgezAuODMwMDgwLCA2LjA4ODY2Nn0sIHswLjgzNzAyOCwgMi44MTk5OTN9LAorICAgIHswLjg0NTU2MSwgMS40OTA2MjN9LCB7MC44NDgzMjMsIDAuNDEwNDM2fSwgezAuODU2NTIyLCAwLjcyOTcyNX0sCisgICAgezAuODYyNjM2LCAwLjk2Njg4MH0sIHswLjg3NDU2MSwgMS42ODE2NjB9LCB7MC44NzQ3NTEsIDEuMTc3NjMwfSwKKyAgICB7MC44NzkyODksIDIuMzAxMzAwfSwgezAuODg2NjcxLCAwLjYxMzA2OH0sIHswLjg5NjcyOSwgMC43ODEwOTd9LAorICAgIHswLjkwNDc3NywgMy40ODQxMTF9LCB7MC45MDYwOTgsIDEuMzMwODkyfSwgezAuOTE5MTgyLCAxLjg3NzIwM30sCisgICAgezAuOTE5OTAxLCAwLjU2OTUxMX0sIHswLjkyMTc3MiwgMS4wMzQxMjZ9LCB7MC45MjI0MzksIDAuMzc2MDAwfSwKKyAgICB7MC45MzQyMjEsIDEuNDg1MjE0fSwgezAuOTM4ODQyLCAwLjg2OTEzNX0sIHswLjkzOTE2NiwgMi4zNzgyOTR9LAorICAgIHswLjk1ODkzMywgMS4xMjI3MjJ9LCB7MC45NTkwNDIsIDAuNjk0MDk4fSwgezAuOTYwOTk1LCAxLjc0MzQzMH0sCisgICAgezAuOTcwNzYzLCAyLjg4NDg5N30sIHswLjk4Mjg4MSwgMC44MTQ1MDZ9LCB7MC45OTAxNDEsIDEuMzMwMDIyfSwKKyAgICB7MC45OTY0NDcsIDEuODIzMzgxfSwgezEuMDAwMDEzLCAwLjk2NzQ5OH0sIHsxLjAwMDc0MywgMC40ODA1OTd9LAorICAgIHsxLjAwODAyMCwgNS4wOTUyMjZ9LCB7MS4wMTM4ODMsIDIuMTA1NDM1fSwgezEuMDI2NDM4LCAwLjY5MTMxMn0sCisgICAgezEuMDI3MzYxLCAxLjU1ODE2OX0sIHsxLjAzMDEyMywgMy41ODY1MjZ9LCB7MS4wMzM5MTYsIDEuMTE4MDM2fSwKKyAgICB7MS4wMzkzMTUsIDIuNTQzMzYwfSwgezEuMDY4NTk2LCAwLjgzNjM4MH0sIHsxLjA4MTAyMywgMS4zMTg3Njh9LAorICAgIHsxLjA5MzE1MCwgMi4yNjc4NDN9LCB7MS4wOTU2MDcsIDEuNzEyMzgzfSwgezEuMTAyODE2LCAxLjAzNzMzNH0sCisgICAgezEuMTAzMjMxLCAzLjUzNjI5Mn0sIHsxLjEwNzMyMCwgMC41MDg2MTV9LCB7MS4xNTAwMDAsIDcuOTk5MDAwfSwKKyAgICB7MS4xNTY3MzEsIDEuMjM2NzcyfSwgezEuMTY4NDI4LCAyLjI2ODA4NH0sIHsxLjE4NDEzMCwgMC43NzU4Mzl9LAorICAgIHsxLjIxMDYwOSwgMS41MTE4NDB9LCB7MS4yMjA2NjMsIDQuMzY1NjgzfSwgezEuMjI0MDE2LCAwLjk4MzE3OX0sCisgICAgezEuMjUyMjM2LCAyLjc3ODUzNX0sIHsxLjMwMTE3NiwgMS45MjMxMjZ9Cit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcHJlZFs0XSA9IHsKKyAgICAwLjIwMCwgMC4zMzQsIDAuNTA0LCAwLjY5MQorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfU0lQUkRBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc21hY2tlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvc21hY2tlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTM4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zbWFja2VyLmMKQEAgLTAsMCArMSw4MjcgQEAKKy8qCisgKiBTbWFja2VyIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNtYWNrZXIgZGVjb2RlcgorICovCisKKy8qCisgKiBCYXNlZCBvbiBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1TbWFja2VyCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorCisjZGVmaW5lIFNNS1RSRUVfQklUUyA5CisjZGVmaW5lIFNNS19OT0RFIDB4ODAwMDAwMDAKKworLyoKKyAqIERlY29kZXIgY29udGV4dAorICovCit0eXBlZGVmIHN0cnVjdCBTbWFja1ZDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAqcGljOworCisgICAgaW50ICptbWFwX3RibCwgKm1jbHJfdGJsLCAqZnVsbF90YmwsICp0eXBlX3RibDsKKyAgICBpbnQgbW1hcF9sYXN0WzNdLCBtY2xyX2xhc3RbM10sIGZ1bGxfbGFzdFszXSwgdHlwZV9sYXN0WzNdOworfSBTbWFja1ZDb250ZXh0OworCisvKioKKyAqIENvbnRleHQgdXNlZCBmb3IgY29kZSByZWNvbnN0cnVjdGluZworICovCit0eXBlZGVmIHN0cnVjdCBIdWZmQ29udGV4dCB7CisgICAgaW50IGxlbmd0aDsKKyAgICBpbnQgbWF4bGVuZ3RoOworICAgIGludCBjdXJyZW50OworICAgIHVpbnQzMl90ICpiaXRzOworICAgIGludCAqbGVuZ3RoczsKKyAgICBpbnQgKnZhbHVlczsKK30gSHVmZkNvbnRleHQ7CisKKy8qIGNvbW1vbiBwYXJhbWV0ZXJzIHVzZWQgZm9yIGRlY29kZV9iaWd0cmVlICovCit0eXBlZGVmIHN0cnVjdCBEQkN0eCB7CisgICAgVkxDICp2MSwgKnYyOworICAgIGludCAqcmVjb2RlMSwgKnJlY29kZTI7CisgICAgaW50IGVzY2FwZXNbM107CisgICAgaW50ICpsYXN0OworICAgIGludCBsY3VyOworfSBEQkN0eDsKKworLyogcG9zc2libGUgcnVucyBvZiBibG9ja3MgKi8KK3N0YXRpYyBjb25zdCBpbnQgYmxvY2tfcnVuc1s2NF0gPSB7CisgICAgICAxLCAgICAyLCAgICAzLCAgICA0LCAgICA1LCAgICA2LCAgICA3LCAgICA4LAorICAgICAgOSwgICAxMCwgICAxMSwgICAxMiwgICAxMywgICAxNCwgICAxNSwgICAxNiwKKyAgICAgMTcsICAgMTgsICAgMTksICAgMjAsICAgMjEsICAgMjIsICAgMjMsICAgMjQsCisgICAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLAorICAgICAzMywgICAzNCwgICAzNSwgICAzNiwgICAzNywgICAzOCwgICAzOSwgICA0MCwKKyAgICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsCisgICAgIDQ5LCAgIDUwLCAgIDUxLCAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LAorICAgICA1NywgICA1OCwgICA1OSwgIDEyOCwgIDI1NiwgIDUxMiwgMTAyNCwgMjA0OCB9OworCitlbnVtIFNta0Jsb2NrVHlwZXMgeworICAgIFNNS19CTEtfTU9OTyA9IDAsCisgICAgU01LX0JMS19GVUxMID0gMSwKKyAgICBTTUtfQkxLX1NLSVAgPSAyLAorICAgIFNNS19CTEtfRklMTCA9IDMgfTsKKworLyoqCisgKiBEZWNvZGUgbG9jYWwgZnJhbWUgdHJlZQorICovCitzdGF0aWMgaW50IHNtYWNrZXJfZGVjb2RlX3RyZWUoR2V0Qml0Q29udGV4dCAqZ2IsIEh1ZmZDb250ZXh0ICpoYywgdWludDMyX3QgcHJlZml4LCBpbnQgbGVuZ3RoKQoreworICAgIGlmKGxlbmd0aCA+IDMyIHx8IGxlbmd0aCA+IDMqU01LVFJFRV9CSVRTKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJsZW5ndGggdG9vIGxvbmdcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYoIWdldF9iaXRzMShnYikpeyAvL0xlYWYKKyAgICAgICAgaWYoaGMtPmN1cnJlbnQgPj0gaGMtPmxlbmd0aCl7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVHJlZSBzaXplIGV4Y2VlZGVkIVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZihsZW5ndGgpeworICAgICAgICAgICAgaGMtPmJpdHNbaGMtPmN1cnJlbnRdID0gcHJlZml4OworICAgICAgICAgICAgaGMtPmxlbmd0aHNbaGMtPmN1cnJlbnRdID0gbGVuZ3RoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGMtPmJpdHNbaGMtPmN1cnJlbnRdID0gMDsKKyAgICAgICAgICAgIGhjLT5sZW5ndGhzW2hjLT5jdXJyZW50XSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaGMtPnZhbHVlc1toYy0+Y3VycmVudF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIGhjLT5jdXJyZW50Kys7CisgICAgICAgIGlmKGhjLT5tYXhsZW5ndGggPCBsZW5ndGgpCisgICAgICAgICAgICBoYy0+bWF4bGVuZ3RoID0gbGVuZ3RoOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeyAvL05vZGUKKyAgICAgICAgaW50IHI7CisgICAgICAgIGxlbmd0aCsrOworICAgICAgICByID0gc21hY2tlcl9kZWNvZGVfdHJlZShnYiwgaGMsIHByZWZpeCwgbGVuZ3RoKTsKKyAgICAgICAgaWYocikKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICByZXR1cm4gc21hY2tlcl9kZWNvZGVfdHJlZShnYiwgaGMsIHByZWZpeCB8ICgxIDw8IChsZW5ndGggLSAxKSksIGxlbmd0aCk7CisgICAgfQorfQorCisvKioKKyAqIERlY29kZSBoZWFkZXIgdHJlZQorICovCitzdGF0aWMgaW50IHNtYWNrZXJfZGVjb2RlX2JpZ3RyZWUoR2V0Qml0Q29udGV4dCAqZ2IsIEh1ZmZDb250ZXh0ICpoYywgREJDdHggKmN0eCkKK3sKKyAgICBpZiAoaGMtPmN1cnJlbnQgKyAxID49IGhjLT5sZW5ndGgpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlRyZWUgc2l6ZSBleGNlZWRlZCFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYoIWdldF9iaXRzMShnYikpeyAvL0xlYWYKKyAgICAgICAgaW50IHZhbCwgaTEsIGkyOworICAgICAgICBpMSA9IGN0eC0+djEtPnRhYmxlID8gZ2V0X3ZsYzIoZ2IsIGN0eC0+djEtPnRhYmxlLCBTTUtUUkVFX0JJVFMsIDMpIDogMDsKKyAgICAgICAgaTIgPSBjdHgtPnYyLT50YWJsZSA/IGdldF92bGMyKGdiLCBjdHgtPnYyLT50YWJsZSwgU01LVFJFRV9CSVRTLCAzKSA6IDA7CisgICAgICAgIGlmIChpMSA8IDAgfHwgaTIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHZhbCA9IGN0eC0+cmVjb2RlMVtpMV0gfCAoY3R4LT5yZWNvZGUyW2kyXSA8PCA4KTsKKyAgICAgICAgaWYodmFsID09IGN0eC0+ZXNjYXBlc1swXSkgeworICAgICAgICAgICAgY3R4LT5sYXN0WzBdID0gaGMtPmN1cnJlbnQ7CisgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICB9IGVsc2UgaWYodmFsID09IGN0eC0+ZXNjYXBlc1sxXSkgeworICAgICAgICAgICAgY3R4LT5sYXN0WzFdID0gaGMtPmN1cnJlbnQ7CisgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICB9IGVsc2UgaWYodmFsID09IGN0eC0+ZXNjYXBlc1syXSkgeworICAgICAgICAgICAgY3R4LT5sYXN0WzJdID0gaGMtPmN1cnJlbnQ7CisgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaGMtPnZhbHVlc1toYy0+Y3VycmVudCsrXSA9IHZhbDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsgLy9Ob2RlCisgICAgICAgIGludCByID0gMCwgcl9uZXcsIHQ7CisKKyAgICAgICAgdCA9IGhjLT5jdXJyZW50Kys7CisgICAgICAgIHIgPSBzbWFja2VyX2RlY29kZV9iaWd0cmVlKGdiLCBoYywgY3R4KTsKKyAgICAgICAgaWYociA8IDApCisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgaGMtPnZhbHVlc1t0XSA9IFNNS19OT0RFIHwgcjsKKyAgICAgICAgcisrOworICAgICAgICByX25ldyA9IHNtYWNrZXJfZGVjb2RlX2JpZ3RyZWUoZ2IsIGhjLCBjdHgpOworICAgICAgICBpZiAocl9uZXcgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJfbmV3OworICAgICAgICByZXR1cm4gciArIHJfbmV3OworICAgIH0KK30KKworLyoqCisgKiBTdG9yZSBsYXJnZSB0cmVlIGFzIEZGbXBlZydzIHZsYyBjb2RlcworICovCitzdGF0aWMgaW50IHNtYWNrZXJfZGVjb2RlX2hlYWRlcl90cmVlKFNtYWNrVkNvbnRleHQgKnNtaywgR2V0Qml0Q29udGV4dCAqZ2IsIGludCAqKnJlY29kZXMsIGludCAqbGFzdCwgaW50IHNpemUpCit7CisgICAgaW50IHJlczsKKyAgICBIdWZmQ29udGV4dCBodWZmOworICAgIEh1ZmZDb250ZXh0IHRtcDEsIHRtcDI7CisgICAgVkxDIHZsY1syXSA9IHsgeyAwIH0gfTsKKyAgICBpbnQgZXNjYXBlc1szXTsKKyAgICBEQkN0eCBjdHg7CisgICAgaW50IGVyciA9IDA7CisKKyAgICBpZihzaXplID49IFVJTlRfTUFYPj40KXsgLy8gKCgoc2l6ZSArIDMpID4+IDIpICsgMykgPDwgMiBtdXN0IG5vdCBvdmVyZmxvdworICAgICAgICBhdl9sb2coc21rLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic2l6ZSB0b28gbGFyZ2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB0bXAxLmxlbmd0aCA9IDI1NjsKKyAgICB0bXAxLm1heGxlbmd0aCA9IDA7CisgICAgdG1wMS5jdXJyZW50ID0gMDsKKyAgICB0bXAxLmJpdHMgPSBhdl9tYWxsb2N6KDI1NiAqIDQpOworICAgIHRtcDEubGVuZ3RocyA9IGF2X21hbGxvY3ooMjU2ICogc2l6ZW9mKGludCkpOworICAgIHRtcDEudmFsdWVzID0gYXZfbWFsbG9jeigyNTYgKiBzaXplb2YoaW50KSk7CisKKyAgICB0bXAyLmxlbmd0aCA9IDI1NjsKKyAgICB0bXAyLm1heGxlbmd0aCA9IDA7CisgICAgdG1wMi5jdXJyZW50ID0gMDsKKyAgICB0bXAyLmJpdHMgPSBhdl9tYWxsb2N6KDI1NiAqIDQpOworICAgIHRtcDIubGVuZ3RocyA9IGF2X21hbGxvY3ooMjU2ICogc2l6ZW9mKGludCkpOworICAgIHRtcDIudmFsdWVzID0gYXZfbWFsbG9jeigyNTYgKiBzaXplb2YoaW50KSk7CisgICAgaWYgKCF0bXAxLmJpdHMgfHwgIXRtcDEubGVuZ3RocyB8fCAhdG1wMS52YWx1ZXMgfHwKKyAgICAgICAgIXRtcDIuYml0cyB8fCAhdG1wMi5sZW5ndGhzIHx8ICF0bXAyLnZhbHVlcykgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICByZXMgPSBzbWFja2VyX2RlY29kZV90cmVlKGdiLCAmdG1wMSwgMCwgMCk7CisgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHNraXBfYml0czEoZ2IpOworICAgICAgICBpZih0bXAxLmN1cnJlbnQgPiAxKSB7CisgICAgICAgICAgICByZXMgPSBpbml0X3ZsYygmdmxjWzBdLCBTTUtUUkVFX0JJVFMsIHRtcDEubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgdG1wMS5sZW5ndGhzLCBzaXplb2YoaW50KSwgc2l6ZW9mKGludCksCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAxLmJpdHMsIHNpemVvZih1aW50MzJfdCksIHNpemVvZih1aW50MzJfdCksIElOSVRfVkxDX0xFKTsKKyAgICAgICAgICAgIGlmKHJlcyA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coc21rLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGJ1aWxkIFZMQyB0YWJsZVxuIik7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCF2bGNbMF0udGFibGUpIHsKKyAgICAgICAgYXZfbG9nKHNtay0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlNraXBwaW5nIGxvdyBieXRlcyB0cmVlXG4iKTsKKyAgICB9CisgICAgaWYoZ2V0X2JpdHMxKGdiKSl7CisgICAgICAgIHJlcyA9IHNtYWNrZXJfZGVjb2RlX3RyZWUoZ2IsICZ0bXAyLCAwLCAwKTsKKyAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc2tpcF9iaXRzMShnYik7CisgICAgICAgIGlmKHRtcDIuY3VycmVudCA+IDEpIHsKKyAgICAgICAgICAgIHJlcyA9IGluaXRfdmxjKCZ2bGNbMV0sIFNNS1RSRUVfQklUUywgdG1wMi5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAyLmxlbmd0aHMsIHNpemVvZihpbnQpLCBzaXplb2YoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIuYml0cywgc2l6ZW9mKHVpbnQzMl90KSwgc2l6ZW9mKHVpbnQzMl90KSwgSU5JVF9WTENfTEUpOworICAgICAgICAgICAgaWYocmVzIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzbWstPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYnVpbGQgVkxDIHRhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXZsY1sxXS50YWJsZSkgeworICAgICAgICBhdl9sb2coc21rLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2tpcHBpbmcgaGlnaCBieXRlcyB0cmVlXG4iKTsKKyAgICB9CisKKyAgICBlc2NhcGVzWzBdICA9IGdldF9iaXRzKGdiLCAxNik7CisgICAgZXNjYXBlc1sxXSAgPSBnZXRfYml0cyhnYiwgMTYpOworICAgIGVzY2FwZXNbMl0gID0gZ2V0X2JpdHMoZ2IsIDE2KTsKKworICAgIGxhc3RbMF0gPSBsYXN0WzFdID0gbGFzdFsyXSA9IC0xOworCisgICAgY3R4LmVzY2FwZXNbMF0gPSBlc2NhcGVzWzBdOworICAgIGN0eC5lc2NhcGVzWzFdID0gZXNjYXBlc1sxXTsKKyAgICBjdHguZXNjYXBlc1syXSA9IGVzY2FwZXNbMl07CisgICAgY3R4LnYxID0gJnZsY1swXTsKKyAgICBjdHgudjIgPSAmdmxjWzFdOworICAgIGN0eC5yZWNvZGUxID0gdG1wMS52YWx1ZXM7CisgICAgY3R4LnJlY29kZTIgPSB0bXAyLnZhbHVlczsKKyAgICBjdHgubGFzdCA9IGxhc3Q7CisKKyAgICBodWZmLmxlbmd0aCA9ICgoc2l6ZSArIDMpID4+IDIpICsgNDsKKyAgICBodWZmLm1heGxlbmd0aCA9IDA7CisgICAgaHVmZi5jdXJyZW50ID0gMDsKKyAgICBodWZmLnZhbHVlcyA9IGF2X21hbGxvY3pfYXJyYXkoaHVmZi5sZW5ndGgsIHNpemVvZihpbnQpKTsKKyAgICBpZiAoIWh1ZmYudmFsdWVzKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoc21hY2tlcl9kZWNvZGVfYmlndHJlZShnYiwgJmh1ZmYsICZjdHgpIDwgMCkKKyAgICAgICAgZXJyID0gLTE7CisgICAgc2tpcF9iaXRzMShnYik7CisgICAgaWYoY3R4Lmxhc3RbMF0gPT0gLTEpIGN0eC5sYXN0WzBdID0gaHVmZi5jdXJyZW50Kys7CisgICAgaWYoY3R4Lmxhc3RbMV0gPT0gLTEpIGN0eC5sYXN0WzFdID0gaHVmZi5jdXJyZW50Kys7CisgICAgaWYoY3R4Lmxhc3RbMl0gPT0gLTEpIGN0eC5sYXN0WzJdID0gaHVmZi5jdXJyZW50Kys7CisgICAgaWYgKGN0eC5sYXN0WzBdID49IGh1ZmYubGVuZ3RoIHx8CisgICAgICAgIGN0eC5sYXN0WzFdID49IGh1ZmYubGVuZ3RoIHx8CisgICAgICAgIGN0eC5sYXN0WzJdID49IGh1ZmYubGVuZ3RoKSB7CisgICAgICAgIGF2X2xvZyhzbWstPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJIdWZmbWFuIGNvZGVzIG91dCBvZiByYW5nZVxuIik7CisgICAgICAgIGVyciA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgKnJlY29kZXMgPSBodWZmLnZhbHVlczsKKworZXJyb3I6CisgICAgaWYodmxjWzBdLnRhYmxlKQorICAgICAgICBmZl9mcmVlX3ZsYygmdmxjWzBdKTsKKyAgICBpZih2bGNbMV0udGFibGUpCisgICAgICAgIGZmX2ZyZWVfdmxjKCZ2bGNbMV0pOworICAgIGF2X2ZyZWUodG1wMS5iaXRzKTsKKyAgICBhdl9mcmVlKHRtcDEubGVuZ3Rocyk7CisgICAgYXZfZnJlZSh0bXAxLnZhbHVlcyk7CisgICAgYXZfZnJlZSh0bXAyLmJpdHMpOworICAgIGF2X2ZyZWUodG1wMi5sZW5ndGhzKTsKKyAgICBhdl9mcmVlKHRtcDIudmFsdWVzKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2hlYWRlcl90cmVlcyhTbWFja1ZDb250ZXh0ICpzbWspIHsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBtbWFwX3NpemUsIG1jbHJfc2l6ZSwgZnVsbF9zaXplLCB0eXBlX3NpemUsIHJldDsKKworICAgIG1tYXBfc2l6ZSA9IEFWX1JMMzIoc21rLT5hdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBtY2xyX3NpemUgPSBBVl9STDMyKHNtay0+YXZjdHgtPmV4dHJhZGF0YSArIDQpOworICAgIGZ1bGxfc2l6ZSA9IEFWX1JMMzIoc21rLT5hdmN0eC0+ZXh0cmFkYXRhICsgOCk7CisgICAgdHlwZV9zaXplID0gQVZfUkwzMihzbWstPmF2Y3R4LT5leHRyYWRhdGEgKyAxMik7CisKKyAgICBpbml0X2dldF9iaXRzOCgmZ2IsIHNtay0+YXZjdHgtPmV4dHJhZGF0YSArIDE2LCBzbWstPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAtIDE2KTsKKworICAgIGlmKCFnZXRfYml0czEoJmdiKSkgeworICAgICAgICBhdl9sb2coc21rLT5hdmN0eCwgQVZfTE9HX0lORk8sICJTa2lwcGluZyBNTUFQIHRyZWVcbiIpOworICAgICAgICBzbWstPm1tYXBfdGJsID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICogMik7CisgICAgICAgIGlmICghc21rLT5tbWFwX3RibCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHNtay0+bW1hcF90YmxbMF0gPSAwOworICAgICAgICBzbWstPm1tYXBfbGFzdFswXSA9IHNtay0+bW1hcF9sYXN0WzFdID0gc21rLT5tbWFwX2xhc3RbMl0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IHNtYWNrZXJfZGVjb2RlX2hlYWRlcl90cmVlKHNtaywgJmdiLCAmc21rLT5tbWFwX3RibCwgc21rLT5tbWFwX2xhc3QsIG1tYXBfc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYoIWdldF9iaXRzMSgmZ2IpKSB7CisgICAgICAgIGF2X2xvZyhzbWstPmF2Y3R4LCBBVl9MT0dfSU5GTywgIlNraXBwaW5nIE1DTFIgdHJlZVxuIik7CisgICAgICAgIHNtay0+bWNscl90YmwgPSBhdl9tYWxsb2Moc2l6ZW9mKGludCkgKiAyKTsKKyAgICAgICAgaWYgKCFzbWstPm1jbHJfdGJsKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgc21rLT5tY2xyX3RibFswXSA9IDA7CisgICAgICAgIHNtay0+bWNscl9sYXN0WzBdID0gc21rLT5tY2xyX2xhc3RbMV0gPSBzbWstPm1jbHJfbGFzdFsyXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gc21hY2tlcl9kZWNvZGVfaGVhZGVyX3RyZWUoc21rLCAmZ2IsICZzbWstPm1jbHJfdGJsLCBzbWstPm1jbHJfbGFzdCwgbWNscl9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZighZ2V0X2JpdHMxKCZnYikpIHsKKyAgICAgICAgYXZfbG9nKHNtay0+YXZjdHgsIEFWX0xPR19JTkZPLCAiU2tpcHBpbmcgRlVMTCB0cmVlXG4iKTsKKyAgICAgICAgc21rLT5mdWxsX3RibCA9IGF2X21hbGxvYyhzaXplb2YoaW50KSAqIDIpOworICAgICAgICBpZiAoIXNtay0+ZnVsbF90YmwpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBzbWstPmZ1bGxfdGJsWzBdID0gMDsKKyAgICAgICAgc21rLT5mdWxsX2xhc3RbMF0gPSBzbWstPmZ1bGxfbGFzdFsxXSA9IHNtay0+ZnVsbF9sYXN0WzJdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBzbWFja2VyX2RlY29kZV9oZWFkZXJfdHJlZShzbWssICZnYiwgJnNtay0+ZnVsbF90YmwsIHNtay0+ZnVsbF9sYXN0LCBmdWxsX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmKCFnZXRfYml0czEoJmdiKSkgeworICAgICAgICBhdl9sb2coc21rLT5hdmN0eCwgQVZfTE9HX0lORk8sICJTa2lwcGluZyBUWVBFIHRyZWVcbiIpOworICAgICAgICBzbWstPnR5cGVfdGJsID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICogMik7CisgICAgICAgIGlmICghc21rLT50eXBlX3RibCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHNtay0+dHlwZV90YmxbMF0gPSAwOworICAgICAgICBzbWstPnR5cGVfbGFzdFswXSA9IHNtay0+dHlwZV9sYXN0WzFdID0gc21rLT50eXBlX2xhc3RbMl0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IHNtYWNrZXJfZGVjb2RlX2hlYWRlcl90cmVlKHNtaywgJmdiLCAmc21rLT50eXBlX3RibCwgc21rLT50eXBlX2xhc3QsIHR5cGVfc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBsYXN0X3Jlc2V0KGludCAqcmVjb2RlLCBpbnQgKmxhc3QpIHsKKyAgICByZWNvZGVbbGFzdFswXV0gPSByZWNvZGVbbGFzdFsxXV0gPSByZWNvZGVbbGFzdFsyXV0gPSAwOworfQorCisvKiBnZXQgY29kZSBhbmQgdXBkYXRlIGhpc3RvcnkgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBzbWtfZ2V0X2NvZGUoR2V0Qml0Q29udGV4dCAqZ2IsIGludCAqcmVjb2RlLCBpbnQgKmxhc3QpIHsKKyAgICByZWdpc3RlciBpbnQgKnRhYmxlID0gcmVjb2RlOworICAgIGludCB2OworCisgICAgd2hpbGUoKnRhYmxlICYgU01LX05PREUpIHsKKyAgICAgICAgaWYoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgICAgIHRhYmxlICs9ICgqdGFibGUpICYgKH5TTUtfTk9ERSk7CisgICAgICAgIHRhYmxlKys7CisgICAgfQorICAgIHYgPSAqdGFibGU7CisKKyAgICBpZih2ICE9IHJlY29kZVtsYXN0WzBdXSkgeworICAgICAgICByZWNvZGVbbGFzdFsyXV0gPSByZWNvZGVbbGFzdFsxXV07CisgICAgICAgIHJlY29kZVtsYXN0WzFdXSA9IHJlY29kZVtsYXN0WzBdXTsKKyAgICAgICAgcmVjb2RlW2xhc3RbMF1dID0gdjsKKyAgICB9CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgU21hY2tWQ29udGV4dCAqIGNvbnN0IHNtayA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqb3V0OworICAgIHVpbnQzMl90ICpwYWw7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2IyOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGJsb2NrcywgYmxrLCBidywgYmg7CisgICAgaW50IGksIHJldDsKKyAgICBpbnQgc3RyaWRlOworICAgIGludCBmbGFnczsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8PSA3NjkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIHNtay0+cGljKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogbWFrZSB0aGUgcGFsZXR0ZSBhdmFpbGFibGUgb24gdGhlIHdheSBvdXQgKi8KKyAgICBwYWwgPSAodWludDMyX3QqKXNtay0+cGljLT5kYXRhWzFdOworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiMiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IyKTsKKyAgICBzbWstPnBpYy0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IGZsYWdzICYgMTsKKyAgICBzbWstPnBpYy0+a2V5X2ZyYW1lID0gISEoZmxhZ3MgJiAyKTsKKyAgICBpZiAoc21rLT5waWMtPmtleV9mcmFtZSkKKyAgICAgICAgc21rLT5waWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGVsc2UKKyAgICAgICAgc21rLT5waWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworCisgICAgZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICpwYWwrKyA9IDB4RkZVIDw8IDI0IHwgYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZnYjIpOworCisgICAgbGFzdF9yZXNldChzbWstPm1tYXBfdGJsLCBzbWstPm1tYXBfbGFzdCk7CisgICAgbGFzdF9yZXNldChzbWstPm1jbHJfdGJsLCBzbWstPm1jbHJfbGFzdCk7CisgICAgbGFzdF9yZXNldChzbWstPmZ1bGxfdGJsLCBzbWstPmZ1bGxfbGFzdCk7CisgICAgbGFzdF9yZXNldChzbWstPnR5cGVfdGJsLCBzbWstPnR5cGVfbGFzdCk7CisgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIGF2cGt0LT5kYXRhICsgNzY5LCBhdnBrdC0+c2l6ZSAtIDc2OSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGJsayA9IDA7CisgICAgYncgPSBhdmN0eC0+d2lkdGggPj4gMjsKKyAgICBiaCA9IGF2Y3R4LT5oZWlnaHQgPj4gMjsKKyAgICBibG9ja3MgPSBidyAqIGJoOworICAgIHN0cmlkZSA9IHNtay0+cGljLT5saW5lc2l6ZVswXTsKKyAgICB3aGlsZShibGsgPCBibG9ja3MpIHsKKyAgICAgICAgaW50IHR5cGUsIHJ1biwgbW9kZTsKKyAgICAgICAgdWludDE2X3QgcGl4OworCisgICAgICAgIHR5cGUgPSBzbWtfZ2V0X2NvZGUoJmdiLCBzbWstPnR5cGVfdGJsLCBzbWstPnR5cGVfbGFzdCk7CisgICAgICAgIHJ1biA9IGJsb2NrX3J1bnNbKHR5cGUgPj4gMikgJiAweDNGXTsKKyAgICAgICAgc3dpdGNoKHR5cGUgJiAzKXsKKyAgICAgICAgY2FzZSBTTUtfQkxLX01PTk86CisgICAgICAgICAgICB3aGlsZShydW4tLSAmJiBibGsgPCBibG9ja3MpeworICAgICAgICAgICAgICAgIGludCBjbHIsIG1hcDsKKyAgICAgICAgICAgICAgICBpbnQgaGksIGxvOworICAgICAgICAgICAgICAgIGNsciA9IHNta19nZXRfY29kZSgmZ2IsIHNtay0+bWNscl90YmwsIHNtay0+bWNscl9sYXN0KTsKKyAgICAgICAgICAgICAgICBtYXAgPSBzbWtfZ2V0X2NvZGUoJmdiLCBzbWstPm1tYXBfdGJsLCBzbWstPm1tYXBfbGFzdCk7CisgICAgICAgICAgICAgICAgb3V0ID0gc21rLT5waWMtPmRhdGFbMF0gKyAoYmxrIC8gYncpICogKHN0cmlkZSAqIDQpICsgKGJsayAlIGJ3KSAqIDQ7CisgICAgICAgICAgICAgICAgaGkgPSBjbHIgPj4gODsKKyAgICAgICAgICAgICAgICBsbyA9IGNsciAmIDB4RkY7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKG1hcCAmIDEpIG91dFswXSA9IGhpOyBlbHNlIG91dFswXSA9IGxvOworICAgICAgICAgICAgICAgICAgICBpZihtYXAgJiAyKSBvdXRbMV0gPSBoaTsgZWxzZSBvdXRbMV0gPSBsbzsKKyAgICAgICAgICAgICAgICAgICAgaWYobWFwICYgNCkgb3V0WzJdID0gaGk7IGVsc2Ugb3V0WzJdID0gbG87CisgICAgICAgICAgICAgICAgICAgIGlmKG1hcCAmIDgpIG91dFszXSA9IGhpOyBlbHNlIG91dFszXSA9IGxvOworICAgICAgICAgICAgICAgICAgICBtYXAgPj49IDQ7CisgICAgICAgICAgICAgICAgICAgIG91dCArPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJsaysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU01LX0JMS19GVUxMOgorICAgICAgICAgICAgbW9kZSA9IDA7CisgICAgICAgICAgICBpZihhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdTJywgJ00nLCAnSycsICc0JykpIHsgLy8gSW4gY2FzZSBvZiBTbWFja2VyIHY0IHdlIGhhdmUgdGhyZWUgbW9kZXMKKyAgICAgICAgICAgICAgICBpZihnZXRfYml0czEoJmdiKSkgbW9kZSA9IDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZihnZXRfYml0czEoJmdiKSkgbW9kZSA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZShydW4tLSAmJiBibGsgPCBibG9ja3MpeworICAgICAgICAgICAgICAgIG91dCA9IHNtay0+cGljLT5kYXRhWzBdICsgKGJsayAvIGJ3KSAqIChzdHJpZGUgKiA0KSArIChibGsgJSBidykgKiA0OworICAgICAgICAgICAgICAgIHN3aXRjaChtb2RlKXsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ID0gc21rX2dldF9jb2RlKCZnYiwgc21rLT5mdWxsX3RibCwgc21rLT5mdWxsX2xhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgQVZfV0wxNihvdXQrMixwaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ID0gc21rX2dldF9jb2RlKCZnYiwgc21rLT5mdWxsX3RibCwgc21rLT5mdWxsX2xhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgQVZfV0wxNihvdXQscGl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBwaXggPSBzbWtfZ2V0X2NvZGUoJmdiLCBzbWstPmZ1bGxfdGJsLCBzbWstPmZ1bGxfbGFzdCk7CisgICAgICAgICAgICAgICAgICAgIG91dFswXSA9IG91dFsxXSA9IHBpeCAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgIG91dFsyXSA9IG91dFszXSA9IHBpeCA+PiA4OworICAgICAgICAgICAgICAgICAgICBvdXQgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICBvdXRbMF0gPSBvdXRbMV0gPSBwaXggJiAweEZGOworICAgICAgICAgICAgICAgICAgICBvdXRbMl0gPSBvdXRbM10gPSBwaXggPj4gODsKKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ID0gc21rX2dldF9jb2RlKCZnYiwgc21rLT5mdWxsX3RibCwgc21rLT5mdWxsX2xhc3QpOworICAgICAgICAgICAgICAgICAgICBvdXRbMF0gPSBvdXRbMV0gPSBwaXggJiAweEZGOworICAgICAgICAgICAgICAgICAgICBvdXRbMl0gPSBvdXRbM10gPSBwaXggPj4gODsKKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgb3V0WzBdID0gb3V0WzFdID0gcGl4ICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgb3V0WzJdID0gb3V0WzNdID0gcGl4ID4+IDg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwaXgxLCBwaXgyOworICAgICAgICAgICAgICAgICAgICAgICAgcGl4MiA9IHNta19nZXRfY29kZSgmZ2IsIHNtay0+ZnVsbF90YmwsIHNtay0+ZnVsbF9sYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeDEgPSBzbWtfZ2V0X2NvZGUoJmdiLCBzbWstPmZ1bGxfdGJsLCBzbWstPmZ1bGxfbGFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTDE2KG91dCxwaXgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dMMTYob3V0KzIscGl4Mik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgQVZfV0wxNihvdXQscGl4MSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTDE2KG91dCsyLHBpeDIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmxrKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTTUtfQkxLX1NLSVA6CisgICAgICAgICAgICB3aGlsZShydW4tLSAmJiBibGsgPCBibG9ja3MpCisgICAgICAgICAgICAgICAgYmxrKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTTUtfQkxLX0ZJTEw6CisgICAgICAgICAgICBtb2RlID0gdHlwZSA+PiA4OworICAgICAgICAgICAgd2hpbGUocnVuLS0gJiYgYmxrIDwgYmxvY2tzKXsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2w7CisgICAgICAgICAgICAgICAgb3V0ID0gc21rLT5waWMtPmRhdGFbMF0gKyAoYmxrIC8gYncpICogKHN0cmlkZSAqIDQpICsgKGJsayAlIGJ3KSAqIDQ7CisgICAgICAgICAgICAgICAgY29sID0gbW9kZSAqIDB4MDEwMTAxMDE7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICooKHVpbnQzMl90KilvdXQpID0gY29sOworICAgICAgICAgICAgICAgICAgICBvdXQgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBibGsrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzbWstPnBpYykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgLyogYWx3YXlzIHJlcG9ydCB0aGF0IHRoZSBidWZmZXIgd2FzIGNvbXBsZXRlbHkgY29uc3VtZWQgKi8KKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKKworCisvKgorICoKKyAqIFVuaW5pdCBzbWFja2VyIGRlY29kZXIKKyAqCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTbWFja1ZDb250ZXh0ICogY29uc3Qgc21rID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZzbWstPm1tYXBfdGJsKTsKKyAgICBhdl9mcmVlcCgmc21rLT5tY2xyX3RibCk7CisgICAgYXZfZnJlZXAoJnNtay0+ZnVsbF90YmwpOworICAgIGF2X2ZyZWVwKCZzbWstPnR5cGVfdGJsKTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnNtay0+cGljKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qCisgKgorICogSW5pdCBzbWFja2VyIGRlY29kZXIKKyAqCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU21hY2tWQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBjLT5hdmN0eCA9IGF2Y3R4OworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICBjLT5waWMgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYy0+cGljKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogZGVjb2RlIGh1ZmZtYW4gdHJlZXMgZnJvbSBleHRyYWRhdGEgKi8KKyAgICBpZihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCAxNil7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXh0cmFkYXRhIG1pc3NpbmchXG4iKTsKKyAgICAgICAgZGVjb2RlX2VuZChhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0ID0gZGVjb2RlX2hlYWRlcl90cmVlcyhjKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBkZWNvZGVfZW5kKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgYXZfY29sZCBpbnQgc21rYV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA8IDEgfHwgYXZjdHgtPmNoYW5uZWxzID4gMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gKGF2Y3R4LT5jaGFubmVscz09MikgPyBBVl9DSF9MQVlPVVRfU1RFUkVPIDogQVZfQ0hfTEFZT1VUX01PTk87CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDggPyBBVl9TQU1QTEVfRk1UX1U4IDogQVZfU0FNUExFX0ZNVF9TMTY7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgU21hY2tlciBhdWRpbyBkYXRhCisgKi8KK3N0YXRpYyBpbnQgc21rYV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgSHVmZkNvbnRleHQgaFs0XSA9IHsgeyAwIH0gfTsKKyAgICBWTEMgdmxjWzRdICAgICAgID0geyB7IDAgfSB9OworICAgIGludDE2X3QgKnNhbXBsZXM7CisgICAgdWludDhfdCAqc2FtcGxlczg7CisgICAgaW50IHZhbDsKKyAgICBpbnQgaSwgcmVzLCByZXQ7CisgICAgaW50IHVucF9zaXplOworICAgIGludCBiaXRzLCBzdGVyZW87CisgICAgaW50IHByZWRbMl0gPSB7MCwgMH07CisKKyAgICBpZiAoYnVmX3NpemUgPD0gNCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBhY2tldCBpcyB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHVucF9zaXplID0gQVZfUkwzMihidWYpOworCisgICAgaWYgKHVucF9zaXplID4gKDFVPDwyNCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwYWNrZXQgaXMgdG9vIGJpZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBidWYgKyA0LCBidWZfc2l6ZSAtIDQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZighZ2V0X2JpdHMxKCZnYikpeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiU291bmQ6IG5vIGRhdGFcbiIpOworICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBzdGVyZW8gPSBnZXRfYml0czEoJmdiKTsKKyAgICBiaXRzID0gZ2V0X2JpdHMxKCZnYik7CisgICAgaWYgKHN0ZXJlbyBeIChhdmN0eC0+Y2hhbm5lbHMgIT0gMSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJjaGFubmVscyBtaXNtYXRjaFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmIChiaXRzID09IChhdmN0eC0+c2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1U4KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInNhbXBsZSBmb3JtYXQgbWlzbWF0Y2hcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSB1bnBfc2l6ZSAvIChhdmN0eC0+Y2hhbm5lbHMgKiAoYml0cyArIDEpKTsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHNhbXBsZXMgID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKyAgICBzYW1wbGVzOCA9ICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF07CisKKyAgICAvLyBJbml0aWFsaXplCisgICAgZm9yKGkgPSAwOyBpIDwgKDEgPDwgKGJpdHMgKyBzdGVyZW8pKTsgaSsrKSB7CisgICAgICAgIGhbaV0ubGVuZ3RoID0gMjU2OworICAgICAgICBoW2ldLm1heGxlbmd0aCA9IDA7CisgICAgICAgIGhbaV0uY3VycmVudCA9IDA7CisgICAgICAgIGhbaV0uYml0cyA9IGF2X21hbGxvY3ooMjU2ICogNCk7CisgICAgICAgIGhbaV0ubGVuZ3RocyA9IGF2X21hbGxvY3ooMjU2ICogc2l6ZW9mKGludCkpOworICAgICAgICBoW2ldLnZhbHVlcyA9IGF2X21hbGxvY3ooMjU2ICogc2l6ZW9mKGludCkpOworICAgICAgICBpZiAoIWhbaV0uYml0cyB8fCAhaFtpXS5sZW5ndGhzIHx8ICFoW2ldLnZhbHVlcykgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBza2lwX2JpdHMxKCZnYik7CisgICAgICAgIGlmIChzbWFja2VyX2RlY29kZV90cmVlKCZnYiwgJmhbaV0sIDAsIDApIDwgMCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc2tpcF9iaXRzMSgmZ2IpOworICAgICAgICBpZihoW2ldLmN1cnJlbnQgPiAxKSB7CisgICAgICAgICAgICByZXMgPSBpbml0X3ZsYygmdmxjW2ldLCBTTUtUUkVFX0JJVFMsIGhbaV0ubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBoW2ldLmxlbmd0aHMsIHNpemVvZihpbnQpLCBzaXplb2YoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgaFtpXS5iaXRzLCBzaXplb2YodWludDMyX3QpLCBzaXplb2YodWludDMyX3QpLCBJTklUX1ZMQ19MRSk7CisgICAgICAgICAgICBpZihyZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYnVpbGQgVkxDIHRhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogdGhpcyBjb2RlYyByZWxpZXMgb24gd3JhcGFyb3VuZCBpbnN0ZWFkIG9mIGNsaXBwaW5nIGF1ZGlvICovCisgICAgaWYoYml0cykgeyAvL2RlY29kZSAxNi1iaXQgZGF0YQorICAgICAgICBmb3IoaSA9IHN0ZXJlbzsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICBwcmVkW2ldID0gc2lnbl9leHRlbmQoYXZfYnN3YXAxNihnZXRfYml0cygmZ2IsIDE2KSksIDE2KTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDw9IHN0ZXJlbzsgaSsrKQorICAgICAgICAgICAgKnNhbXBsZXMrKyA9IHByZWRbaV07CisgICAgICAgIGZvcig7IGkgPCB1bnBfc2l6ZSAvIDI7IGkrKykgeworICAgICAgICAgICAgaWYoZ2V0X2JpdHNfbGVmdCgmZ2IpPDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZihpICYgc3RlcmVvKSB7CisgICAgICAgICAgICAgICAgaWYodmxjWzJdLnRhYmxlKQorICAgICAgICAgICAgICAgICAgICByZXMgPSBnZXRfdmxjMigmZ2IsIHZsY1syXS50YWJsZSwgU01LVFJFRV9CSVRTLCAzKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHZsY1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgID0gaFsyXS52YWx1ZXNbcmVzXTsKKyAgICAgICAgICAgICAgICBpZih2bGNbM10udGFibGUpCisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGdldF92bGMyKCZnYiwgdmxjWzNdLnRhYmxlLCBTTUtUUkVFX0JJVFMsIDMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdmxjXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbCB8PSBoWzNdLnZhbHVlc1tyZXNdIDw8IDg7CisgICAgICAgICAgICAgICAgcHJlZFsxXSArPSBzaWduX2V4dGVuZCh2YWwsIDE2KTsKKyAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gcHJlZFsxXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYodmxjWzBdLnRhYmxlKQorICAgICAgICAgICAgICAgICAgICByZXMgPSBnZXRfdmxjMigmZ2IsIHZsY1swXS50YWJsZSwgU01LVFJFRV9CSVRTLCAzKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHZsY1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgID0gaFswXS52YWx1ZXNbcmVzXTsKKyAgICAgICAgICAgICAgICBpZih2bGNbMV0udGFibGUpCisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGdldF92bGMyKCZnYiwgdmxjWzFdLnRhYmxlLCBTTUtUUkVFX0JJVFMsIDMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdmxjXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbCB8PSBoWzFdLnZhbHVlc1tyZXNdIDw8IDg7CisgICAgICAgICAgICAgICAgcHJlZFswXSArPSBzaWduX2V4dGVuZCh2YWwsIDE2KTsKKyAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gcHJlZFswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vOC1iaXQgZGF0YQorICAgICAgICBmb3IoaSA9IHN0ZXJlbzsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICBwcmVkW2ldID0gZ2V0X2JpdHMoJmdiLCA4KTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDw9IHN0ZXJlbzsgaSsrKQorICAgICAgICAgICAgKnNhbXBsZXM4KysgPSBwcmVkW2ldOworICAgICAgICBmb3IoOyBpIDwgdW5wX3NpemU7IGkrKykgeworICAgICAgICAgICAgaWYoZ2V0X2JpdHNfbGVmdCgmZ2IpPDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZihpICYgc3RlcmVvKXsKKyAgICAgICAgICAgICAgICBpZih2bGNbMV0udGFibGUpCisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGdldF92bGMyKCZnYiwgdmxjWzFdLnRhYmxlLCBTTUtUUkVFX0JJVFMsIDMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdmxjXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZWRbMV0gKz0gc2lnbl9leHRlbmQoaFsxXS52YWx1ZXNbcmVzXSwgOCk7CisgICAgICAgICAgICAgICAgKnNhbXBsZXM4KysgPSBwcmVkWzFdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZih2bGNbMF0udGFibGUpCisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGdldF92bGMyKCZnYiwgdmxjWzBdLnRhYmxlLCBTTUtUUkVFX0JJVFMsIDMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdmxjXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZWRbMF0gKz0gc2lnbl9leHRlbmQoaFswXS52YWx1ZXNbcmVzXSwgOCk7CisgICAgICAgICAgICAgICAgKnNhbXBsZXM4KysgPSBwcmVkWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworICAgIHJldCA9IGJ1Zl9zaXplOworCitlcnJvcjoKKyAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaWYodmxjW2ldLnRhYmxlKQorICAgICAgICAgICAgZmZfZnJlZV92bGMoJnZsY1tpXSk7CisgICAgICAgIGF2X2ZyZWUoaFtpXS5iaXRzKTsKKyAgICAgICAgYXZfZnJlZShoW2ldLmxlbmd0aHMpOworICAgICAgICBhdl9mcmVlKGhbaV0udmFsdWVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitBVkNvZGVjIGZmX3NtYWNrZXJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic21hY2t2aWQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTbWFja2VyIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NNQUNLVklERU8sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNtYWNrVkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OworCitBVkNvZGVjIGZmX3NtYWNrYXVkX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInNtYWNrYXVkIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU21hY2tlciBhdWRpbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TTUFDS0FVRElPLAorICAgIC5pbml0ICAgICAgICAgICA9IHNta2FfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gc21rYV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zbWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NtYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjcxYjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zbWMuYwpAQCAtMCwwICsxLDQ3NiBAQAorLyoKKyAqIFF1aWNrdGltZSBHcmFwaGljcyAoU01DKSBWaWRlbyBEZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFFUIFNNQyBWaWRlbyBEZWNvZGVyIGJ5IE1pa2UgTWVsYW5zb24gKG1lbGFuc29uQHBjaXN5cy5uZXQpCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgU01DIGZvcm1hdCwgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzLworICoKKyAqIFRoZSBTTUMgZGVjb2RlciBvdXRwdXRzIFBBTDggY29sb3JzcGFjZSBkYXRhLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBDUEFJUiAyCisjZGVmaW5lIENRVUFEIDQKKyNkZWZpbmUgQ09DVEVUIDgKKworI2RlZmluZSBDT0xPUlNfUEVSX1RBQkxFIDI1NgorCit0eXBlZGVmIHN0cnVjdCBTbWNDb250ZXh0IHsKKworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBVkZyYW1lICpmcmFtZTsKKworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgLyogU01DIGNvbG9yIHRhYmxlcyAqLworICAgIHVuc2lnbmVkIGNoYXIgY29sb3JfcGFpcnNbQ09MT1JTX1BFUl9UQUJMRSAqIENQQUlSXTsKKyAgICB1bnNpZ25lZCBjaGFyIGNvbG9yX3F1YWRzW0NPTE9SU19QRVJfVEFCTEUgKiBDUVVBRF07CisgICAgdW5zaWduZWQgY2hhciBjb2xvcl9vY3RldHNbQ09MT1JTX1BFUl9UQUJMRSAqIENPQ1RFVF07CisKKyAgICB1aW50MzJfdCBwYWxbMjU2XTsKK30gU21jQ29udGV4dDsKKworI2RlZmluZSBHRVRfQkxPQ0tfQ09VTlQoKSBcCisgIChvcGNvZGUgJiAweDEwKSA/ICgxICsgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKSkgOiAxICsgKG9wY29kZSAmIDB4MEYpOworCisjZGVmaW5lIEFEVkFOQ0VfQkxPQ0soKSBcCit7IFwKKyAgICBwaXhlbF9wdHIgKz0gNDsgXAorICAgIGlmIChwaXhlbF9wdHIgPj0gd2lkdGgpIFwKKyAgICB7IFwKKyAgICAgICAgcGl4ZWxfcHRyID0gMDsgXAorICAgICAgICByb3dfcHRyICs9IHN0cmlkZSAqIDQ7IFwKKyAgICB9IFwKKyAgICB0b3RhbF9ibG9ja3MtLTsgXAorICAgIGlmICh0b3RhbF9ibG9ja3MgPCAwICsgISFuX2Jsb2NrcykgXAorICAgIHsgXAorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAid2FybmluZzogYmxvY2sgY291bnRlciBqdXN0IHdlbnQgbmVnYXRpdmUgKHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4pXG4iKTsgXAorICAgICAgICByZXR1cm47IFwKKyAgICB9IFwKK30KKworc3RhdGljIHZvaWQgc21jX2RlY29kZV9zdHJlYW0oU21jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgd2lkdGggPSBzLT5hdmN0eC0+d2lkdGg7CisgICAgaW50IGhlaWdodCA9IHMtPmF2Y3R4LT5oZWlnaHQ7CisgICAgaW50IHN0cmlkZSA9IHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICBpbnQgaTsKKyAgICBpbnQgY2h1bmtfc2l6ZTsKKyAgICBpbnQgYnVmX3NpemUgPSBieXRlc3RyZWFtMl9zaXplKCZzLT5nYik7CisgICAgdW5zaWduZWQgY2hhciBvcGNvZGU7CisgICAgaW50IG5fYmxvY2tzOworICAgIHVuc2lnbmVkIGludCBjb2xvcl9mbGFnczsKKyAgICB1bnNpZ25lZCBpbnQgY29sb3JfZmxhZ3NfYTsKKyAgICB1bnNpZ25lZCBpbnQgY29sb3JfZmxhZ3NfYjsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ19tYXNrOworCisgICAgdW5zaWduZWQgY2hhciAqcGl4ZWxzID0gcy0+ZnJhbWUtPmRhdGFbMF07CisKKyAgICBpbnQgaW1hZ2Vfc2l6ZSA9IGhlaWdodCAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICBpbnQgcm93X3B0ciA9IDA7CisgICAgaW50IHBpeGVsX3B0ciA9IDA7CisgICAgaW50IHBpeGVsX3gsIHBpeGVsX3k7CisgICAgaW50IHJvd19pbmMgPSBzdHJpZGUgLSA0OworICAgIGludCBibG9ja19wdHI7CisgICAgaW50IHByZXZfYmxvY2tfcHRyOworICAgIGludCBwcmV2X2Jsb2NrX3B0cjEsIHByZXZfYmxvY2tfcHRyMjsKKyAgICBpbnQgcHJldl9ibG9ja19mbGFnOworICAgIGludCB0b3RhbF9ibG9ja3M7CisgICAgaW50IGNvbG9yX3RhYmxlX2luZGV4OyAgLyogaW5kZXhlcyB0byBjb2xvciBwYWlyLCBxdWFkLCBvciBvY3RldCB0YWJsZXMgKi8KKyAgICBpbnQgcGl4ZWw7CisKKyAgICBpbnQgY29sb3JfcGFpcl9pbmRleCA9IDA7CisgICAgaW50IGNvbG9yX3F1YWRfaW5kZXggPSAwOworICAgIGludCBjb2xvcl9vY3RldF9pbmRleCA9IDA7CisKKyAgICAvKiBtYWtlIHRoZSBwYWxldHRlIGF2YWlsYWJsZSAqLworICAgIG1lbWNweShzLT5mcmFtZS0+ZGF0YVsxXSwgcy0+cGFsLCBBVlBBTEVUVEVfU0laRSk7CisKKyAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgMSk7CisgICAgY2h1bmtfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0KCZzLT5nYik7CisgICAgaWYgKGNodW5rX3NpemUgIT0gYnVmX3NpemUpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJ3YXJuaW5nOiBNT1YgY2h1bmsgc2l6ZSAhPSBlbmNvZGVkIGNodW5rIHNpemUgKCVkICE9ICVkKTsgdXNpbmcgTU9WIGNodW5rIHNpemVcbiIsCisgICAgICAgICAgICBjaHVua19zaXplLCBidWZfc2l6ZSk7CisKKyAgICBjaHVua19zaXplID0gYnVmX3NpemU7CisgICAgdG90YWxfYmxvY2tzID0gKChzLT5hdmN0eC0+d2lkdGggKyAzKSAvIDQpICogKChzLT5hdmN0eC0+aGVpZ2h0ICsgMykgLyA0KTsKKworICAgIC8qIHRyYXZlcnNlIHRocm91Z2ggdGhlIGJsb2NrcyAqLworICAgIHdoaWxlICh0b3RhbF9ibG9ja3MpIHsKKyAgICAgICAgLyogc2FuaXR5IGNoZWNrcyAqLworICAgICAgICAvKiBtYWtlIHN1cmUgdGhlIHJvdyBwb2ludGVyIGhhc24ndCBnb25lIHdpbGQgKi8KKyAgICAgICAgaWYgKHJvd19wdHIgPj0gaW1hZ2Vfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIlNNQyBkZWNvZGVyIGp1c3Qgd2VudCBvdXQgb2YgYm91bmRzIChyb3cgcHRyID0gJWQsIGhlaWdodCA9ICVkKVxuIiwKKyAgICAgICAgICAgICAgICByb3dfcHRyLCBpbWFnZV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlICYgMHhGMCkgeworICAgICAgICAvKiBza2lwIG4gYmxvY2tzICovCisgICAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgY2FzZSAweDEwOgorICAgICAgICAgICAgbl9ibG9ja3MgPSBHRVRfQkxPQ0tfQ09VTlQoKTsKKyAgICAgICAgICAgIHdoaWxlIChuX2Jsb2Nrcy0tKSB7CisgICAgICAgICAgICAgICAgQURWQU5DRV9CTE9DSygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogcmVwZWF0IGxhc3QgYmxvY2sgbiB0aW1lcyAqLworICAgICAgICBjYXNlIDB4MjA6CisgICAgICAgIGNhc2UgMHgzMDoKKyAgICAgICAgICAgIG5fYmxvY2tzID0gR0VUX0JMT0NLX0NPVU5UKCk7CisKKyAgICAgICAgICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgICAgICAgICAgaWYgKChyb3dfcHRyID09IDApICYmIChwaXhlbF9wdHIgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiZW5jb3VudGVyZWQgcmVwZWF0IGJsb2NrIG9wY29kZSAoJTAyWCkgYnV0IG5vIGJsb2NrcyByZW5kZXJlZCB5ZXRcbiIsCisgICAgICAgICAgICAgICAgICAgIG9wY29kZSAmIDB4RjApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZmlndXJlIG91dCB3aGVyZSB0aGUgcHJldmlvdXMgYmxvY2sgc3RhcnRlZCAqLworICAgICAgICAgICAgaWYgKHBpeGVsX3B0ciA9PSAwKQorICAgICAgICAgICAgICAgIHByZXZfYmxvY2tfcHRyMSA9CisgICAgICAgICAgICAgICAgICAgIChyb3dfcHRyIC0gcy0+YXZjdHgtPndpZHRoICogNCkgKyBzLT5hdmN0eC0+d2lkdGggLSA0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByZXZfYmxvY2tfcHRyMSA9IHJvd19wdHIgKyBwaXhlbF9wdHIgLSA0OworCisgICAgICAgICAgICB3aGlsZSAobl9ibG9ja3MtLSkgeworICAgICAgICAgICAgICAgIGJsb2NrX3B0ciA9IHJvd19wdHIgKyBwaXhlbF9wdHI7CisgICAgICAgICAgICAgICAgcHJldl9ibG9ja19wdHIgPSBwcmV2X2Jsb2NrX3B0cjE7CisgICAgICAgICAgICAgICAgZm9yIChwaXhlbF95ID0gMDsgcGl4ZWxfeSA8IDQ7IHBpeGVsX3krKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHBpeGVsX3ggPSAwOyBwaXhlbF94IDwgNDsgcGl4ZWxfeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNbYmxvY2tfcHRyKytdID0gcGl4ZWxzW3ByZXZfYmxvY2tfcHRyKytdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJsb2NrX3B0ciArPSByb3dfaW5jOworICAgICAgICAgICAgICAgICAgICBwcmV2X2Jsb2NrX3B0ciArPSByb3dfaW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBRFZBTkNFX0JMT0NLKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiByZXBlYXQgcHJldmlvdXMgcGFpciBvZiBibG9ja3MgbiB0aW1lcyAqLworICAgICAgICBjYXNlIDB4NDA6CisgICAgICAgIGNhc2UgMHg1MDoKKyAgICAgICAgICAgIG5fYmxvY2tzID0gR0VUX0JMT0NLX0NPVU5UKCk7CisgICAgICAgICAgICBuX2Jsb2NrcyAqPSAyOworCisgICAgICAgICAgICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgICAgICAgICAgIGlmICgocm93X3B0ciA9PSAwKSAmJiAocGl4ZWxfcHRyIDwgMiAqIDQpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgImVuY291bnRlcmVkIHJlcGVhdCBibG9jayBvcGNvZGUgKCUwMlgpIGJ1dCBub3QgZW5vdWdoIGJsb2NrcyByZW5kZXJlZCB5ZXRcbiIsCisgICAgICAgICAgICAgICAgICAgIG9wY29kZSAmIDB4RjApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZmlndXJlIG91dCB3aGVyZSB0aGUgcHJldmlvdXMgMiBibG9ja3Mgc3RhcnRlZCAqLworICAgICAgICAgICAgaWYgKHBpeGVsX3B0ciA9PSAwKQorICAgICAgICAgICAgICAgIHByZXZfYmxvY2tfcHRyMSA9IChyb3dfcHRyIC0gcy0+YXZjdHgtPndpZHRoICogNCkgKworICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+d2lkdGggLSA0ICogMjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBpeGVsX3B0ciA9PSA0KQorICAgICAgICAgICAgICAgIHByZXZfYmxvY2tfcHRyMSA9IChyb3dfcHRyIC0gcy0+YXZjdHgtPndpZHRoICogNCkgKyByb3dfaW5jOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByZXZfYmxvY2tfcHRyMSA9IHJvd19wdHIgKyBwaXhlbF9wdHIgLSA0ICogMjsKKworICAgICAgICAgICAgaWYgKHBpeGVsX3B0ciA9PSAwKQorICAgICAgICAgICAgICAgIHByZXZfYmxvY2tfcHRyMiA9IChyb3dfcHRyIC0gcy0+YXZjdHgtPndpZHRoICogNCkgKyByb3dfaW5jOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByZXZfYmxvY2tfcHRyMiA9IHJvd19wdHIgKyBwaXhlbF9wdHIgLSA0OworCisgICAgICAgICAgICBwcmV2X2Jsb2NrX2ZsYWcgPSAwOworICAgICAgICAgICAgd2hpbGUgKG5fYmxvY2tzLS0pIHsKKyAgICAgICAgICAgICAgICBibG9ja19wdHIgPSByb3dfcHRyICsgcGl4ZWxfcHRyOworICAgICAgICAgICAgICAgIGlmIChwcmV2X2Jsb2NrX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIHByZXZfYmxvY2tfcHRyID0gcHJldl9ibG9ja19wdHIyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJldl9ibG9ja19wdHIgPSBwcmV2X2Jsb2NrX3B0cjE7CisgICAgICAgICAgICAgICAgcHJldl9ibG9ja19mbGFnID0gIXByZXZfYmxvY2tfZmxhZzsKKworICAgICAgICAgICAgICAgIGZvciAocGl4ZWxfeSA9IDA7IHBpeGVsX3kgPCA0OyBwaXhlbF95KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwaXhlbF94ID0gMDsgcGl4ZWxfeCA8IDQ7IHBpeGVsX3grKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2Jsb2NrX3B0cisrXSA9IHBpeGVsc1twcmV2X2Jsb2NrX3B0cisrXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBibG9ja19wdHIgKz0gcm93X2luYzsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9ibG9ja19wdHIgKz0gcm93X2luYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQURWQU5DRV9CTE9DSygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogMS1jb2xvciBibG9jayBlbmNvZGluZyAqLworICAgICAgICBjYXNlIDB4NjA6CisgICAgICAgIGNhc2UgMHg3MDoKKyAgICAgICAgICAgIG5fYmxvY2tzID0gR0VUX0JMT0NLX0NPVU5UKCk7CisgICAgICAgICAgICBwaXhlbCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisKKyAgICAgICAgICAgIHdoaWxlIChuX2Jsb2Nrcy0tKSB7CisgICAgICAgICAgICAgICAgYmxvY2tfcHRyID0gcm93X3B0ciArIHBpeGVsX3B0cjsKKyAgICAgICAgICAgICAgICBmb3IgKHBpeGVsX3kgPSAwOyBwaXhlbF95IDwgNDsgcGl4ZWxfeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAocGl4ZWxfeCA9IDA7IHBpeGVsX3ggPCA0OyBwaXhlbF94KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1tibG9ja19wdHIrK10gPSBwaXhlbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBibG9ja19wdHIgKz0gcm93X2luYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQURWQU5DRV9CTE9DSygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogMi1jb2xvciBibG9jayBlbmNvZGluZyAqLworICAgICAgICBjYXNlIDB4ODA6CisgICAgICAgIGNhc2UgMHg5MDoKKyAgICAgICAgICAgIG5fYmxvY2tzID0gKG9wY29kZSAmIDB4MEYpICsgMTsKKworICAgICAgICAgICAgLyogZmlndXJlIG91dCB3aGljaCBjb2xvciBwYWlyIHRvIHVzZSB0byBwYWludCB0aGUgMi1jb2xvciBibG9jayAqLworICAgICAgICAgICAgaWYgKChvcGNvZGUgJiAweEYwKSA9PSAweDgwKSB7CisgICAgICAgICAgICAgICAgLyogZmV0Y2ggdGhlIG5leHQgMiBjb2xvcnMgZnJvbSBieXRlc3RyZWFtIGFuZCBzdG9yZSBpbiBuZXh0CisgICAgICAgICAgICAgICAgICogYXZhaWxhYmxlIGVudHJ5IGluIHRoZSBjb2xvciBwYWlyIHRhYmxlICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IENQQUlSOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICBjb2xvcl90YWJsZV9pbmRleCA9IENQQUlSICogY29sb3JfcGFpcl9pbmRleCArIGk7CisgICAgICAgICAgICAgICAgICAgIHMtPmNvbG9yX3BhaXJzW2NvbG9yX3RhYmxlX2luZGV4XSA9IHBpeGVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiB0aGlzIGlzIHRoZSBiYXNlIGluZGV4IHRvIHVzZSBmb3IgdGhpcyBibG9jayAqLworICAgICAgICAgICAgICAgIGNvbG9yX3RhYmxlX2luZGV4ID0gQ1BBSVIgKiBjb2xvcl9wYWlyX2luZGV4OworICAgICAgICAgICAgICAgIGNvbG9yX3BhaXJfaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAvKiB3cmFwYXJvdW5kICovCisgICAgICAgICAgICAgICAgaWYgKGNvbG9yX3BhaXJfaW5kZXggPT0gQ09MT1JTX1BFUl9UQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgY29sb3JfcGFpcl9pbmRleCA9IDA7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBjb2xvcl90YWJsZV9pbmRleCA9IENQQUlSICogYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKworICAgICAgICAgICAgd2hpbGUgKG5fYmxvY2tzLS0pIHsKKyAgICAgICAgICAgICAgICBjb2xvcl9mbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZzLT5nYik7CisgICAgICAgICAgICAgICAgZmxhZ19tYXNrID0gMHg4MDAwOworICAgICAgICAgICAgICAgIGJsb2NrX3B0ciA9IHJvd19wdHIgKyBwaXhlbF9wdHI7CisgICAgICAgICAgICAgICAgZm9yIChwaXhlbF95ID0gMDsgcGl4ZWxfeSA8IDQ7IHBpeGVsX3krKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHBpeGVsX3ggPSAwOyBwaXhlbF94IDwgNDsgcGl4ZWxfeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JfZmxhZ3MgJiBmbGFnX21hc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSBjb2xvcl90YWJsZV9pbmRleCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSBjb2xvcl90YWJsZV9pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfbWFzayA+Pj0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1tibG9ja19wdHIrK10gPSBzLT5jb2xvcl9wYWlyc1twaXhlbF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfcHRyICs9IHJvd19pbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFEVkFOQ0VfQkxPQ0soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIDQtY29sb3IgYmxvY2sgZW5jb2RpbmcgKi8KKyAgICAgICAgY2FzZSAweEEwOgorICAgICAgICBjYXNlIDB4QjA6CisgICAgICAgICAgICBuX2Jsb2NrcyA9IChvcGNvZGUgJiAweDBGKSArIDE7CisKKyAgICAgICAgICAgIC8qIGZpZ3VyZSBvdXQgd2hpY2ggY29sb3IgcXVhZCB0byB1c2UgdG8gcGFpbnQgdGhlIDQtY29sb3IgYmxvY2sgKi8KKyAgICAgICAgICAgIGlmICgob3Bjb2RlICYgMHhGMCkgPT0gMHhBMCkgeworICAgICAgICAgICAgICAgIC8qIGZldGNoIHRoZSBuZXh0IDQgY29sb3JzIGZyb20gYnl0ZXN0cmVhbSBhbmQgc3RvcmUgaW4gbmV4dAorICAgICAgICAgICAgICAgICAqIGF2YWlsYWJsZSBlbnRyeSBpbiB0aGUgY29sb3IgcXVhZCB0YWJsZSAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBDUVVBRDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgY29sb3JfdGFibGVfaW5kZXggPSBDUVVBRCAqIGNvbG9yX3F1YWRfaW5kZXggKyBpOworICAgICAgICAgICAgICAgICAgICBzLT5jb2xvcl9xdWFkc1tjb2xvcl90YWJsZV9pbmRleF0gPSBwaXhlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogdGhpcyBpcyB0aGUgYmFzZSBpbmRleCB0byB1c2UgZm9yIHRoaXMgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBjb2xvcl90YWJsZV9pbmRleCA9IENRVUFEICogY29sb3JfcXVhZF9pbmRleDsKKyAgICAgICAgICAgICAgICBjb2xvcl9xdWFkX2luZGV4Kys7CisgICAgICAgICAgICAgICAgLyogd3JhcGFyb3VuZCAqLworICAgICAgICAgICAgICAgIGlmIChjb2xvcl9xdWFkX2luZGV4ID09IENPTE9SU19QRVJfVEFCTEUpCisgICAgICAgICAgICAgICAgICAgIGNvbG9yX3F1YWRfaW5kZXggPSAwOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgY29sb3JfdGFibGVfaW5kZXggPSBDUVVBRCAqIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisKKyAgICAgICAgICAgIHdoaWxlIChuX2Jsb2Nrcy0tKSB7CisgICAgICAgICAgICAgICAgY29sb3JfZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Z2IpOworICAgICAgICAgICAgICAgIC8qIGZsYWcgbWFzayBhY3R1YWxseSBhY3RzIGFzIGEgYml0IHNoaWZ0IGNvdW50IGhlcmUgKi8KKyAgICAgICAgICAgICAgICBmbGFnX21hc2sgPSAzMDsKKyAgICAgICAgICAgICAgICBibG9ja19wdHIgPSByb3dfcHRyICsgcGl4ZWxfcHRyOworICAgICAgICAgICAgICAgIGZvciAocGl4ZWxfeSA9IDA7IHBpeGVsX3kgPCA0OyBwaXhlbF95KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwaXhlbF94ID0gMDsgcGl4ZWxfeCA8IDQ7IHBpeGVsX3grKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSBjb2xvcl90YWJsZV9pbmRleCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb2xvcl9mbGFncyA+PiBmbGFnX21hc2spICYgMHgwMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX21hc2sgLT0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1tibG9ja19wdHIrK10gPSBzLT5jb2xvcl9xdWFkc1twaXhlbF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfcHRyICs9IHJvd19pbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFEVkFOQ0VfQkxPQ0soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIDgtY29sb3IgYmxvY2sgZW5jb2RpbmcgKi8KKyAgICAgICAgY2FzZSAweEMwOgorICAgICAgICBjYXNlIDB4RDA6CisgICAgICAgICAgICBuX2Jsb2NrcyA9IChvcGNvZGUgJiAweDBGKSArIDE7CisKKyAgICAgICAgICAgIC8qIGZpZ3VyZSBvdXQgd2hpY2ggY29sb3Igb2N0ZXQgdG8gdXNlIHRvIHBhaW50IHRoZSA4LWNvbG9yIGJsb2NrICovCisgICAgICAgICAgICBpZiAoKG9wY29kZSAmIDB4RjApID09IDB4QzApIHsKKyAgICAgICAgICAgICAgICAvKiBmZXRjaCB0aGUgbmV4dCA4IGNvbG9ycyBmcm9tIGJ5dGVzdHJlYW0gYW5kIHN0b3JlIGluIG5leHQKKyAgICAgICAgICAgICAgICAgKiBhdmFpbGFibGUgZW50cnkgaW4gdGhlIGNvbG9yIG9jdGV0IHRhYmxlICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IENPQ1RFVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgY29sb3JfdGFibGVfaW5kZXggPSBDT0NURVQgKiBjb2xvcl9vY3RldF9pbmRleCArIGk7CisgICAgICAgICAgICAgICAgICAgIHMtPmNvbG9yX29jdGV0c1tjb2xvcl90YWJsZV9pbmRleF0gPSBwaXhlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogdGhpcyBpcyB0aGUgYmFzZSBpbmRleCB0byB1c2UgZm9yIHRoaXMgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBjb2xvcl90YWJsZV9pbmRleCA9IENPQ1RFVCAqIGNvbG9yX29jdGV0X2luZGV4OworICAgICAgICAgICAgICAgIGNvbG9yX29jdGV0X2luZGV4Kys7CisgICAgICAgICAgICAgICAgLyogd3JhcGFyb3VuZCAqLworICAgICAgICAgICAgICAgIGlmIChjb2xvcl9vY3RldF9pbmRleCA9PSBDT0xPUlNfUEVSX1RBQkxFKQorICAgICAgICAgICAgICAgICAgICBjb2xvcl9vY3RldF9pbmRleCA9IDA7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBjb2xvcl90YWJsZV9pbmRleCA9IENPQ1RFVCAqIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisKKyAgICAgICAgICAgIHdoaWxlIChuX2Jsb2Nrcy0tKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgIEZvciB0aGlzIGlucHV0IG9mIDYgaGV4IGJ5dGVzOgorICAgICAgICAgICAgICAgICAgICAwMSAyMyA0NSA2NyA4OSBBQgorICAgICAgICAgICAgICAgICAgTWFuZ2xlIGl0IHRvIHRoaXMgb3V0cHV0OgorICAgICAgICAgICAgICAgICAgICBmbGFnc19hID0geHgwMTI0NTYsIGZsYWdzX2IgPSB4eDg5QTM3QgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyogYnVpbGQgdGhlIGNvbG9yIGZsYWdzICovCisgICAgICAgICAgICAgICAgaW50IHZhbDEgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmcy0+Z2IpOworICAgICAgICAgICAgICAgIGludCB2YWwyID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBpbnQgdmFsMyA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZzLT5nYik7CisgICAgICAgICAgICAgICAgY29sb3JfZmxhZ3NfYSA9ICgodmFsMSAmIDB4RkZGMCkgPDwgOCkgfCAodmFsMiA+PiA0KTsKKyAgICAgICAgICAgICAgICBjb2xvcl9mbGFnc19iID0gKCh2YWwzICYgMHhGRkYwKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICgodmFsMSAmIDB4MEYpIDw8IDgpIHwgKCh2YWwyICYgMHgwRikgPDwgNCkgfCAodmFsMyAmIDB4MEYpOworCisgICAgICAgICAgICAgICAgY29sb3JfZmxhZ3MgPSBjb2xvcl9mbGFnc19hOworICAgICAgICAgICAgICAgIC8qIGZsYWcgbWFzayBhY3R1YWxseSBhY3RzIGFzIGEgYml0IHNoaWZ0IGNvdW50IGhlcmUgKi8KKyAgICAgICAgICAgICAgICBmbGFnX21hc2sgPSAyMTsKKyAgICAgICAgICAgICAgICBibG9ja19wdHIgPSByb3dfcHRyICsgcGl4ZWxfcHRyOworICAgICAgICAgICAgICAgIGZvciAocGl4ZWxfeSA9IDA7IHBpeGVsX3kgPCA0OyBwaXhlbF95KyspIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVsb2FkIGZsYWdzIGF0IHRoaXJkIHJvdyAoaXRlcmF0aW9uIHBpeGVsX3kgPT0gMikgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsX3kgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfZmxhZ3MgPSBjb2xvcl9mbGFnc19iOworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ19tYXNrID0gMjE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChwaXhlbF94ID0gMDsgcGl4ZWxfeCA8IDQ7IHBpeGVsX3grKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSBjb2xvcl90YWJsZV9pbmRleCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb2xvcl9mbGFncyA+PiBmbGFnX21hc2spICYgMHgwNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX21hc2sgLT0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1tibG9ja19wdHIrK10gPSBzLT5jb2xvcl9vY3RldHNbcGl4ZWxdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJsb2NrX3B0ciArPSByb3dfaW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBRFZBTkNFX0JMT0NLKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiAxNi1jb2xvciBibG9jayBlbmNvZGluZyAoZXZlcnkgcGl4ZWwgaXMgYSBkaWZmZXJlbnQgY29sb3IpICovCisgICAgICAgIGNhc2UgMHhFMDoKKyAgICAgICAgICAgIG5fYmxvY2tzID0gKG9wY29kZSAmIDB4MEYpICsgMTsKKworICAgICAgICAgICAgd2hpbGUgKG5fYmxvY2tzLS0pIHsKKyAgICAgICAgICAgICAgICBibG9ja19wdHIgPSByb3dfcHRyICsgcGl4ZWxfcHRyOworICAgICAgICAgICAgICAgIGZvciAocGl4ZWxfeSA9IDA7IHBpeGVsX3kgPCA0OyBwaXhlbF95KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwaXhlbF94ID0gMDsgcGl4ZWxfeCA8IDQ7IHBpeGVsX3grKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2Jsb2NrX3B0cisrXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfcHRyICs9IHJvd19pbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFEVkFOQ0VfQkxPQ0soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHhGMDoKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIjB4RjAgb3Bjb2RlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHNtY19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU21jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworCisgICAgcy0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+ZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbWNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBTbWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgTlVMTCk7CisgICAgaW50IHJldDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmdiLCBidWYsIGJ1Zl9zaXplKTsKKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChwYWwpIHsKKyAgICAgICAgcy0+ZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgICAgICBtZW1jcHkocy0+cGFsLCBwYWwsIEFWUEFMRVRURV9TSVpFKTsKKyAgICB9CisKKyAgICBzbWNfZGVjb2RlX3N0cmVhbShzKTsKKworICAgICpnb3RfZnJhbWUgICAgICA9IDE7CisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBhbHdheXMgcmVwb3J0IHRoYXQgdGhlIGJ1ZmZlciB3YXMgY29tcGxldGVseSBjb25zdW1lZCAqLworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHNtY19kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTbWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3NtY19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzbWMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJRdWlja1RpbWUgR3JhcGhpY3MgKFNNQykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU01DLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTbWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBzbWNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gc21jX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gc21jX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NtdmpwZWdkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NtdmpwZWdkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzVjOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc212anBlZ2RlYy5jCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogU01WIEpQRUcgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEzIEFzaCBIdWdoZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU01WIEpQRUcgZGVjb2Rlci4KKyAqLworCisvLyAjZGVmaW5lIERFQlVHCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJtanBlZ2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IFNNVkpwZWdEZWNvZGVDb250ZXh0IHsKKyAgICBNSnBlZ0RlY29kZUNvbnRleHQganBnOworICAgIEFWRnJhbWUgKnBpY3R1cmVbMl07IC8qIHBpY3R1cmVzIGFycmF5ICovCisgICAgQVZDb2RlY0NvbnRleHQqIGF2Y3R4OworICAgIGludCBmcmFtZXNfcGVyX2pwZWc7CisgICAgaW50IG1qcGVnX2RhdGFfc2l6ZTsKK30gU01WSnBlZ0RlY29kZUNvbnRleHQ7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbXZfaW1nX3BudF9wbGFuZSh1aW50OF90ICAgICAgKipkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xpbmVzaXplLCBpbnQgaGVpZ2h0LCBpbnQgbmxpbmVzKQoreworICAgIGlmICghZHN0IHx8ICFzcmMpCisgICAgICAgIHJldHVybjsKKyAgICBzcmMgKz0gKG5saW5lcykgKiBzcmNfbGluZXNpemUgKiBoZWlnaHQ7CisgICAgKmRzdCA9IHNyYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNtdl9pbWdfcG50KHVpbnQ4X3QgKmRzdF9kYXRhWzRdLCB1aW50OF90ICpzcmNfZGF0YVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3JjX2xpbmVzaXplc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmxpbmVzKQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4X2ZtdCk7CisgICAgaW50IGksIHBsYW5lc19uYiA9IDA7CisKKyAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChpID0gMDsgaSA8IGRlc2MtPm5iX2NvbXBvbmVudHM7IGkrKykKKyAgICAgICAgcGxhbmVzX25iID0gRkZNQVgocGxhbmVzX25iLCBkZXNjLT5jb21wW2ldLnBsYW5lICsgMSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzX25iOyBpKyspIHsKKyAgICAgICAgaW50IGggPSBoZWlnaHQ7CisgICAgICAgIGlmIChpID09IDEgfHwgaSA9PSAyKSB7CisgICAgICAgICAgICBoID0gRkZfQ0VJTF9SU0hJRlQoaGVpZ2h0LCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICAgICAgfQorICAgICAgICBzbXZfaW1nX3BudF9wbGFuZSgmZHN0X2RhdGFbaV0sIHNyY19kYXRhW2ldLAorICAgICAgICAgICAgc3JjX2xpbmVzaXplc1tpXSwgaCwgbmxpbmVzKTsKKyAgICB9CisgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCB8fAorICAgICAgICBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwpCisgICAgICAgIGRzdF9kYXRhWzFdID0gc3JjX2RhdGFbMV07Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBzbXZqcGVnX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNNVkpwZWdEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNSnBlZ0RlY29kZUNvbnRleHQgKmpwZyA9ICZzLT5qcGc7CisgICAgaW50IHJldDsKKworICAgIGpwZy0+cGljdHVyZV9wdHIgPSBOVUxMOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnBpY3R1cmVbMF0pOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnBpY3R1cmVbMV0pOworICAgIHJldCA9IGF2Y29kZWNfY2xvc2Uocy0+YXZjdHgpOworICAgIGF2X2ZyZWVwKCZzLT5hdmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHNtdmpwZWdfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNNVkpwZWdEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkNvZGVjICpjb2RlYzsKKyAgICBBVkRpY3Rpb25hcnkgKnRocmVhZF9vcHQgPSBOVUxMOworICAgIGludCByZXQgPSAwOworCisgICAgcy0+ZnJhbWVzX3Blcl9qcGVnID0gMDsKKworICAgIHMtPnBpY3R1cmVbMF0gPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+cGljdHVyZVswXSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPnBpY3R1cmVbMV0gPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+cGljdHVyZVsxXSkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5waWN0dXJlWzBdKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBzLT5qcGcucGljdHVyZV9wdHIgICAgICA9IHMtPnBpY3R1cmVbMF07CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDQpCisgICAgICAgIHMtPmZyYW1lc19wZXJfanBlZyA9IEFWX1JMMzIoYXZjdHgtPmV4dHJhZGF0YSk7CisKKyAgICBpZiAocy0+ZnJhbWVzX3Blcl9qcGVnIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBmcmFtZXMgcGVyIGpwZWcuXG4iKTsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgfQorCisgICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihBVl9DT0RFQ19JRF9NSlBFRyk7CisgICAgaWYgKCFjb2RlYykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1KUEVHIGNvZGVjIG5vdCBmb3VuZFxuIik7CisgICAgICAgIHJldCA9IC0xOworICAgIH0KKworICAgIHMtPmF2Y3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0Myhjb2RlYyk7CisKKyAgICBhdl9kaWN0X3NldCgmdGhyZWFkX29wdCwgInRocmVhZHMiLCAiMSIsIDApOworICAgIHMtPmF2Y3R4LT5yZWZjb3VudGVkX2ZyYW1lcyA9IDE7CisgICAgcy0+YXZjdHgtPmZsYWdzID0gYXZjdHgtPmZsYWdzOworICAgIHMtPmF2Y3R4LT5pZGN0X2FsZ28gPSBhdmN0eC0+aWRjdF9hbGdvOworICAgIGlmIChmZl9jb2RlY19vcGVuMl9yZWN1cnNpdmUocy0+YXZjdHgsIGNvZGVjLCAmdGhyZWFkX29wdCkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTUpQRUcgY29kZWMgZmFpbGVkIHRvIG9wZW5cbiIpOworICAgICAgICByZXQgPSAtMTsKKyAgICB9CisgICAgYXZfZGljdF9mcmVlKCZ0aHJlYWRfb3B0KTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBzbXZqcGVnX2RlY29kZV9lbmQoYXZjdHgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc212anBlZ19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworICAgIFNNVkpwZWdEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lKiBtanBlZ19kYXRhID0gcy0+cGljdHVyZVswXTsKKyAgICBpbnQgaSwgY3VyX2ZyYW1lID0gMCwgcmV0ID0gMDsKKworICAgIGN1cl9mcmFtZSA9IGF2cGt0LT5wdHMgJSBzLT5mcmFtZXNfcGVyX2pwZWc7CisKKyAgICAvKiBBcmUgd2UgYXQgdGhlIHN0YXJ0IG9mIGEgYmxvY2s/ICovCisgICAgaWYgKCFjdXJfZnJhbWUpIHsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYobWpwZWdfZGF0YSk7CisgICAgICAgIHJldCA9IGF2Y29kZWNfZGVjb2RlX3ZpZGVvMihzLT5hdmN0eCwgbWpwZWdfZGF0YSwgJnMtPm1qcGVnX2RhdGFfc2l6ZSwgYXZwa3QpOworICAgIH0gZWxzZSBpZiAoIXMtPm1qcGVnX2RhdGFfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHMtPmF2Y3R4LT5waXhfZm10KTsKKyAgICBpZiAoZGVzYyAmJiBtanBlZ19kYXRhLT5oZWlnaHQgJSAocy0+ZnJhbWVzX3Blcl9qcGVnIDw8IGRlc2MtPmxvZzJfY2hyb21hX2gpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBoZWlnaHRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKnVzZSB0aGUgbGFzdCBsb3QuLi4gKi8KKyAgICAqZGF0YV9zaXplID0gcy0+bWpwZWdfZGF0YV9zaXplOworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBzLT5hdmN0eC0+cGl4X2ZtdDsKKworICAgIC8qIFdlIHNob3VsZG4ndCBnZXQgaGVyZSBpZiBmcmFtZXNfcGVyX2pwZWcgPD0gMCBiZWNhdXNlIHRoaXMgd2FzIHJlamVjdGVkCisgICAgICAgaW4gaW5pdCAqLworICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBtanBlZ19kYXRhLT53aWR0aCwgbWpwZWdfZGF0YS0+aGVpZ2h0IC8gcy0+ZnJhbWVzX3Blcl9qcGVnKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBkaW1lbnNpb25zXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoKmRhdGFfc2l6ZSkgeworICAgICAgICBzLT5waWN0dXJlWzFdLT5leHRlbmRlZF9kYXRhID0gTlVMTDsKKyAgICAgICAgcy0+cGljdHVyZVsxXS0+d2lkdGggICAgICAgICA9IGF2Y3R4LT53aWR0aDsKKyAgICAgICAgcy0+cGljdHVyZVsxXS0+aGVpZ2h0ICAgICAgICA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgICAgIHMtPnBpY3R1cmVbMV0tPmZvcm1hdCAgICAgICAgPSBhdmN0eC0+cGl4X2ZtdDsKKyAgICAgICAgLyogZmZfaW5pdF9idWZmZXJfaW5mbyhhdmN0eCwgJnMtPnBpY3R1cmVbMV0pOyAqLworICAgICAgICBzbXZfaW1nX3BudChzLT5waWN0dXJlWzFdLT5kYXRhLCBtanBlZ19kYXRhLT5kYXRhLCBtanBlZ19kYXRhLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgY3VyX2ZyYW1lKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEFWX05VTV9EQVRBX1BPSU5URVJTOyBpKyspCisgICAgICAgICAgICBzLT5waWN0dXJlWzFdLT5saW5lc2l6ZVtpXSA9IG1qcGVnX2RhdGEtPmxpbmVzaXplW2ldOworCisgICAgICAgIHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5waWN0dXJlWzFdKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBzbXZqcGVnZGVjX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlNNVkpQRUcgZGVjb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfc212anBlZ19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzbXZqcGVnIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU01WIEpQRUciKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU01WSlBFRywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU01WSnBlZ0RlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHNtdmpwZWdfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gc212anBlZ19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHNtdmpwZWdfZGVjb2RlX2ZyYW1lLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZzbXZqcGVnZGVjX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Nub3cuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Nub3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2RiM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc25vdy5jCkBAIC0wLDAgKzEsNzI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50bWF0aC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1lX2NtcC5oIgorI2luY2x1ZGUgInNub3dfZHd0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzbm93LmgiCisjaW5jbHVkZSAic25vd2RhdGEuaCIKKworI2luY2x1ZGUgInJhbmdlY29kZXIuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAiaDI2My5oIgorCisKK3ZvaWQgZmZfc25vd19pbm5lcl9hZGRfeWJsb2NrKGNvbnN0IHVpbnQ4X3QgKm9ibWMsIGNvbnN0IGludCBvYm1jX3N0cmlkZSwgdWludDhfdCAqICogYmxvY2ssIGludCBiX3csIGludCBiX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IHNyY19zdHJpZGUsIHNsaWNlX2J1ZmZlciAqIHNiLCBpbnQgYWRkLCB1aW50OF90ICogZHN0OCl7CisgICAgaW50IHksIHg7CisgICAgSURXVEVMRU0gKiBkc3Q7CisgICAgZm9yKHk9MDsgeTxiX2g7IHkrKyl7CisgICAgICAgIC8vRklYTUUgdWdseSBtaXN1c2Ugb2Ygb2JtY19zdHJpZGUKKyAgICAgICAgY29uc3QgdWludDhfdCAqb2JtYzE9IG9ibWMgKyB5Km9ibWNfc3RyaWRlOworICAgICAgICBjb25zdCB1aW50OF90ICpvYm1jMj0gb2JtYzErIChvYm1jX3N0cmlkZT4+MSk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm9ibWMzPSBvYm1jMSsgb2JtY19zdHJpZGUqKG9ibWNfc3RyaWRlPj4xKTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqb2JtYzQ9IG9ibWMzKyAob2JtY19zdHJpZGU+PjEpOworICAgICAgICBkc3QgPSBzbGljZV9idWZmZXJfZ2V0X2xpbmUoc2IsIHNyY195ICsgeSk7CisgICAgICAgIGZvcih4PTA7IHg8Yl93OyB4KyspeworICAgICAgICAgICAgaW50IHY9ICAgb2JtYzFbeF0gKiBibG9ja1szXVt4ICsgeSpzcmNfc3RyaWRlXQorICAgICAgICAgICAgICAgICAgICArb2JtYzJbeF0gKiBibG9ja1syXVt4ICsgeSpzcmNfc3RyaWRlXQorICAgICAgICAgICAgICAgICAgICArb2JtYzNbeF0gKiBibG9ja1sxXVt4ICsgeSpzcmNfc3RyaWRlXQorICAgICAgICAgICAgICAgICAgICArb2JtYzRbeF0gKiBibG9ja1swXVt4ICsgeSpzcmNfc3RyaWRlXTsKKworICAgICAgICAgICAgdiA8PD0gOCAtIExPRzJfT0JNQ19NQVg7CisgICAgICAgICAgICBpZihGUkFDX0JJVFMgIT0gOCl7CisgICAgICAgICAgICAgICAgdiA+Pj0gOCAtIEZSQUNfQklUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGFkZCl7CisgICAgICAgICAgICAgICAgdiArPSBkc3RbeCArIHNyY194XTsKKyAgICAgICAgICAgICAgICB2ID0gKHYgKyAoMTw8KEZSQUNfQklUUy0xKSkpID4+IEZSQUNfQklUUzsKKyAgICAgICAgICAgICAgICBpZih2Jih+MjU1KSkgdj0gfih2Pj4zMSk7CisgICAgICAgICAgICAgICAgZHN0OFt4ICsgeSpzcmNfc3RyaWRlXSA9IHY7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBkc3RbeCArIHNyY194XSAtPSB2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitpbnQgZmZfc25vd19nZXRfYnVmZmVyKFNub3dDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgcmV0LCBpOworICAgIGludCBlZGdlc19uZWVkZWQgPSBhdl9jb2RlY19pc19lbmNvZGVyKHMtPmF2Y3R4LT5jb2RlYyk7CisKKyAgICBmcmFtZS0+d2lkdGggID0gcy0+YXZjdHgtPndpZHRoIDsKKyAgICBmcmFtZS0+aGVpZ2h0ID0gcy0+YXZjdHgtPmhlaWdodDsKKyAgICBpZiAoZWRnZXNfbmVlZGVkKSB7CisgICAgICAgIGZyYW1lLT53aWR0aCAgKz0gMiAqIEVER0VfV0lEVEg7CisgICAgICAgIGZyYW1lLT5oZWlnaHQgKz0gMiAqIEVER0VfV0lEVEg7CisgICAgfQorICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihzLT5hdmN0eCwgZnJhbWUsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKGVkZ2VzX25lZWRlZCkgeworICAgICAgICBmb3IgKGkgPSAwOyBmcmFtZS0+ZGF0YVtpXTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKEVER0VfV0lEVEggPj4gKGkgPyBzLT5jaHJvbWFfdl9zaGlmdCA6IDApKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmxpbmVzaXplW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRURHRV9XSURUSCA+PiAoaSA/IHMtPmNocm9tYV9oX3NoaWZ0IDogMCkpOworICAgICAgICAgICAgZnJhbWUtPmRhdGFbaV0gKz0gb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGZyYW1lLT53aWR0aCAgPSBzLT5hdmN0eC0+d2lkdGg7CisgICAgICAgIGZyYW1lLT5oZWlnaHQgPSBzLT5hdmN0eC0+aGVpZ2h0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX3Nub3dfcmVzZXRfY29udGV4dHMoU25vd0NvbnRleHQgKnMpeyAvL0ZJWE1FIGJldHRlciBpbml0aWFsIGNvbnRleHRzCisgICAgaW50IHBsYW5lX2luZGV4LCBsZXZlbCwgb3JpZW50YXRpb247CisKKyAgICBmb3IocGxhbmVfaW5kZXg9MDsgcGxhbmVfaW5kZXg8MzsgcGxhbmVfaW5kZXgrKyl7CisgICAgICAgIGZvcihsZXZlbD0wOyBsZXZlbDxNQVhfREVDT01QT1NJVElPTlM7IGxldmVsKyspeworICAgICAgICAgICAgZm9yKG9yaWVudGF0aW9uPWxldmVsID8gMTowOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKKyAgICAgICAgICAgICAgICBtZW1zZXQocy0+cGxhbmVbcGxhbmVfaW5kZXhdLmJhbmRbbGV2ZWxdW29yaWVudGF0aW9uXS5zdGF0ZSwgTUlEX1NUQVRFLCBzaXplb2Yocy0+cGxhbmVbcGxhbmVfaW5kZXhdLmJhbmRbbGV2ZWxdW29yaWVudGF0aW9uXS5zdGF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1lbXNldChzLT5oZWFkZXJfc3RhdGUsIE1JRF9TVEFURSwgc2l6ZW9mKHMtPmhlYWRlcl9zdGF0ZSkpOworICAgIG1lbXNldChzLT5ibG9ja19zdGF0ZSwgTUlEX1NUQVRFLCBzaXplb2Yocy0+YmxvY2tfc3RhdGUpKTsKK30KKworaW50IGZmX3Nub3dfYWxsb2NfYmxvY2tzKFNub3dDb250ZXh0ICpzKXsKKyAgICBpbnQgdz0gRkZfQ0VJTF9SU0hJRlQocy0+YXZjdHgtPndpZHRoLCAgTE9HMl9NQl9TSVpFKTsKKyAgICBpbnQgaD0gRkZfQ0VJTF9SU0hJRlQocy0+YXZjdHgtPmhlaWdodCwgTE9HMl9NQl9TSVpFKTsKKworICAgIHMtPmJfd2lkdGggPSB3OworICAgIHMtPmJfaGVpZ2h0PSBoOworCisgICAgYXZfZnJlZShzLT5ibG9jayk7CisgICAgcy0+YmxvY2s9IGF2X21hbGxvY3pfYXJyYXkodyAqIGgsICBzaXplb2YoQmxvY2tOb2RlKSA8PCAocy0+YmxvY2tfbWF4X2RlcHRoKjIpKTsKKyAgICBpZiAoIXMtPmJsb2NrKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgaW5pdF9xZXhwKHZvaWQpeworICAgIGludCBpOworICAgIGRvdWJsZSB2PTEyODsKKworICAgIGZvcihpPTA7IGk8UVJPT1Q7IGkrKyl7CisgICAgICAgIGZmX3FleHBbaV09IGxyaW50Zih2KTsKKyAgICAgICAgdiAqPSBwb3coMiwgMS4wIC8gUVJPT1QpOworICAgIH0KK30KK3N0YXRpYyB2b2lkIG1jX2Jsb2NrKFBsYW5lICpwLCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGJfdywgaW50IGJfaCwgaW50IGR4LCBpbnQgZHkpeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHdlaWdodFs2NF09eworICAgIDgsNyw2LDUsNCwzLDIsMSwKKyAgICA3LDcsMCwwLDAsMCwwLDEsCisgICAgNiwwLDYsMCwwLDAsMiwwLAorICAgIDUsMCwwLDUsMCwzLDAsMCwKKyAgICA0LDAsMCwwLDQsMCwwLDAsCisgICAgMywwLDAsNSwwLDMsMCwwLAorICAgIDIsMCw2LDAsMCwwLDIsMCwKKyAgICAxLDcsMCwwLDAsMCwwLDEsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJyYW5lWzI1Nl09eworICAgIDB4MDAsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDExLDB4MTIsMHgxMiwweDEyLDB4MTIsMHgxMiwweDEyLDB4MTIsCisgICAgMHgwNCwweDA1LDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweDQxLDB4MTUsMHgxNiwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg1MiwKKyAgICAweDA0LDB4Y2MsMHgwNSwweGNjLDB4Y2MsMHhjYywweDQxLDB4Y2MsMHgxNSwweGNjLDB4MTYsMHhjYywweGNjLDB4Y2MsMHg1MiwweGNjLAorICAgIDB4MDQsMHhjYywweGNjLDB4MDUsMHhjYywweDQxLDB4Y2MsMHhjYywweDE1LDB4Y2MsMHhjYywweDE2LDB4Y2MsMHg1MiwweGNjLDB4Y2MsCisgICAgMHgwNCwweGNjLDB4Y2MsMHhjYywweDQxLDB4Y2MsMHhjYywweGNjLDB4MTUsMHhjYywweGNjLDB4Y2MsMHgxNiwweGNjLDB4Y2MsMHhjYywKKyAgICAweDA0LDB4Y2MsMHhjYywweDQxLDB4Y2MsMHgwNSwweGNjLDB4Y2MsMHgxNSwweGNjLDB4Y2MsMHg1MiwweGNjLDB4MTYsMHhjYywweGNjLAorICAgIDB4MDQsMHhjYywweDQxLDB4Y2MsMHhjYywweGNjLDB4MDUsMHhjYywweDE1LDB4Y2MsMHg1MiwweGNjLDB4Y2MsMHhjYywweDE2LDB4Y2MsCisgICAgMHgwNCwweDQxLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweDA1LDB4MTUsMHg1MiwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHgxNiwKKyAgICAweDQ0LDB4NDUsMHg0NSwweDQ1LDB4NDUsMHg0NSwweDQ1LDB4NDUsMHg1NSwweDU2LDB4NTYsMHg1NiwweDU2LDB4NTYsMHg1NiwweDU2LAorICAgIDB4NDgsMHg0OSwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg4NSwweDU5LDB4NUEsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4OTYsCisgICAgMHg0OCwweGNjLDB4NDksMHhjYywweGNjLDB4Y2MsMHg4NSwweGNjLDB4NTksMHhjYywweDVBLDB4Y2MsMHhjYywweGNjLDB4OTYsMHhjYywKKyAgICAweDQ4LDB4Y2MsMHhjYywweDQ5LDB4Y2MsMHg4NSwweGNjLDB4Y2MsMHg1OSwweGNjLDB4Y2MsMHg1QSwweGNjLDB4OTYsMHhjYywweGNjLAorICAgIDB4NDgsMHhjYywweGNjLDB4Y2MsMHg0OSwweGNjLDB4Y2MsMHhjYywweDU5LDB4Y2MsMHhjYywweGNjLDB4OTYsMHhjYywweGNjLDB4Y2MsCisgICAgMHg0OCwweGNjLDB4Y2MsMHg4NSwweGNjLDB4NDksMHhjYywweGNjLDB4NTksMHhjYywweGNjLDB4OTYsMHhjYywweDVBLDB4Y2MsMHhjYywKKyAgICAweDQ4LDB4Y2MsMHg4NSwweGNjLDB4Y2MsMHhjYywweDQ5LDB4Y2MsMHg1OSwweGNjLDB4OTYsMHhjYywweGNjLDB4Y2MsMHg1QSwweGNjLAorICAgIDB4NDgsMHg4NSwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg0OSwweDU5LDB4OTYsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4NUEsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG5lZWRzWzE2XT17CisgICAgMCwxLDAsMCwKKyAgICAyLDQsMiwwLAorICAgIDAsMSwwLDAsCisgICAgMTUKKyAgICB9OworCisgICAgaW50IHgsIHksIGIsIHIsIGw7CisgICAgaW50MTZfdCB0bXBJdCAgIFs2NCooMzIrSFRBUFNfTUFYKV07CisgICAgdWludDhfdCB0bXAydFszXVs2NCooMzIrSFRBUFNfTUFYKV07CisgICAgaW50MTZfdCAqdG1wST0gdG1wSXQ7CisgICAgdWludDhfdCAqdG1wMj0gdG1wMnRbMF07CisgICAgY29uc3QgdWludDhfdCAqaHBlbFsxMV07CisgICAgYXZfYXNzZXJ0MihkeDwxNiAmJiBkeTwxNik7CisgICAgcj0gYnJhbmVbZHggKyAxNipkeV0mMTU7CisgICAgbD0gYnJhbmVbZHggKyAxNipkeV0+PjQ7CisKKyAgICBiPSBuZWVkc1tsXSB8IG5lZWRzW3JdOworICAgIGlmKHAgJiYgIXAtPmRpYWdfbWMpCisgICAgICAgIGI9IDE1OworCisgICAgaWYoYiY1KXsKKyAgICAgICAgZm9yKHk9MDsgeSA8IGJfaCtIVEFQU19NQVgtMTsgeSsrKXsKKyAgICAgICAgICAgIGZvcih4PTA7IHggPCBiX3c7IHgrKyl7CisgICAgICAgICAgICAgICAgaW50IGFfMT1zcmNbeCArIEhUQVBTX01BWC8yLTRdOworICAgICAgICAgICAgICAgIGludCBhMD0gc3JjW3ggKyBIVEFQU19NQVgvMi0zXTsKKyAgICAgICAgICAgICAgICBpbnQgYTE9IHNyY1t4ICsgSFRBUFNfTUFYLzItMl07CisgICAgICAgICAgICAgICAgaW50IGEyPSBzcmNbeCArIEhUQVBTX01BWC8yLTFdOworICAgICAgICAgICAgICAgIGludCBhMz0gc3JjW3ggKyBIVEFQU19NQVgvMiswXTsKKyAgICAgICAgICAgICAgICBpbnQgYTQ9IHNyY1t4ICsgSFRBUFNfTUFYLzIrMV07CisgICAgICAgICAgICAgICAgaW50IGE1PSBzcmNbeCArIEhUQVBTX01BWC8yKzJdOworICAgICAgICAgICAgICAgIGludCBhNj0gc3JjW3ggKyBIVEFQU19NQVgvMiszXTsKKyAgICAgICAgICAgICAgICBpbnQgYW09MDsKKyAgICAgICAgICAgICAgICBpZighcCB8fCBwLT5mYXN0X21jKXsKKyAgICAgICAgICAgICAgICAgICAgYW09IDIwKihhMithMykgLSA1KihhMSthNCkgKyAoYTArYTUpOworICAgICAgICAgICAgICAgICAgICB0bXBJW3hdPSBhbTsKKyAgICAgICAgICAgICAgICAgICAgYW09IChhbSsxNik+PjU7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGFtPSBwLT5oY29lZmZbMF0qKGEyK2EzKSArIHAtPmhjb2VmZlsxXSooYTErYTQpICsgcC0+aGNvZWZmWzJdKihhMCthNSkgKyBwLT5oY29lZmZbM10qKGFfMSthNik7CisgICAgICAgICAgICAgICAgICAgIHRtcElbeF09IGFtOworICAgICAgICAgICAgICAgICAgICBhbT0gKGFtKzMyKT4+NjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihhbSYofjI1NSkpIGFtPSB+KGFtPj4zMSk7CisgICAgICAgICAgICAgICAgdG1wMlt4XT0gYW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXBJKz0gNjQ7CisgICAgICAgICAgICB0bXAyKz0gNjQ7CisgICAgICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgICAgIHNyYyAtPSBzdHJpZGUqeTsKKyAgICB9CisgICAgc3JjICs9IEhUQVBTX01BWC8yIC0gMTsKKyAgICB0bXAyPSB0bXAydFsxXTsKKworICAgIGlmKGImMil7CisgICAgICAgIGZvcih5PTA7IHkgPCBiX2g7IHkrKyl7CisgICAgICAgICAgICBmb3IoeD0wOyB4IDwgYl93KzE7IHgrKyl7CisgICAgICAgICAgICAgICAgaW50IGFfMT1zcmNbeCArIChIVEFQU19NQVgvMi00KSpzdHJpZGVdOworICAgICAgICAgICAgICAgIGludCBhMD0gc3JjW3ggKyAoSFRBUFNfTUFYLzItMykqc3RyaWRlXTsKKyAgICAgICAgICAgICAgICBpbnQgYTE9IHNyY1t4ICsgKEhUQVBTX01BWC8yLTIpKnN0cmlkZV07CisgICAgICAgICAgICAgICAgaW50IGEyPSBzcmNbeCArIChIVEFQU19NQVgvMi0xKSpzdHJpZGVdOworICAgICAgICAgICAgICAgIGludCBhMz0gc3JjW3ggKyAoSFRBUFNfTUFYLzIrMCkqc3RyaWRlXTsKKyAgICAgICAgICAgICAgICBpbnQgYTQ9IHNyY1t4ICsgKEhUQVBTX01BWC8yKzEpKnN0cmlkZV07CisgICAgICAgICAgICAgICAgaW50IGE1PSBzcmNbeCArIChIVEFQU19NQVgvMisyKSpzdHJpZGVdOworICAgICAgICAgICAgICAgIGludCBhNj0gc3JjW3ggKyAoSFRBUFNfTUFYLzIrMykqc3RyaWRlXTsKKyAgICAgICAgICAgICAgICBpbnQgYW09MDsKKyAgICAgICAgICAgICAgICBpZighcCB8fCBwLT5mYXN0X21jKQorICAgICAgICAgICAgICAgICAgICBhbT0gKDIwKihhMithMykgLSA1KihhMSthNCkgKyAoYTArYTUpICsgMTYpPj41OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYW09IChwLT5oY29lZmZbMF0qKGEyK2EzKSArIHAtPmhjb2VmZlsxXSooYTErYTQpICsgcC0+aGNvZWZmWzJdKihhMCthNSkgKyBwLT5oY29lZmZbM10qKGFfMSthNikgKyAzMik+PjY7CisKKyAgICAgICAgICAgICAgICBpZihhbSYofjI1NSkpIGFtPSB+KGFtPj4zMSk7CisgICAgICAgICAgICAgICAgdG1wMlt4XT0gYW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICAgICAgdG1wMis9IDY0OworICAgICAgICB9CisgICAgICAgIHNyYyAtPSBzdHJpZGUqeTsKKyAgICB9CisgICAgc3JjICs9IHN0cmlkZSooSFRBUFNfTUFYLzIgLSAxKTsKKyAgICB0bXAyPSB0bXAydFsyXTsKKyAgICB0bXBJPSB0bXBJdDsKKyAgICBpZihiJjQpeworICAgICAgICBmb3IoeT0wOyB5IDwgYl9oOyB5KyspeworICAgICAgICAgICAgZm9yKHg9MDsgeCA8IGJfdzsgeCsrKXsKKyAgICAgICAgICAgICAgICBpbnQgYV8xPXRtcElbeCArIChIVEFQU19NQVgvMi00KSo2NF07CisgICAgICAgICAgICAgICAgaW50IGEwPSB0bXBJW3ggKyAoSFRBUFNfTUFYLzItMykqNjRdOworICAgICAgICAgICAgICAgIGludCBhMT0gdG1wSVt4ICsgKEhUQVBTX01BWC8yLTIpKjY0XTsKKyAgICAgICAgICAgICAgICBpbnQgYTI9IHRtcElbeCArIChIVEFQU19NQVgvMi0xKSo2NF07CisgICAgICAgICAgICAgICAgaW50IGEzPSB0bXBJW3ggKyAoSFRBUFNfTUFYLzIrMCkqNjRdOworICAgICAgICAgICAgICAgIGludCBhND0gdG1wSVt4ICsgKEhUQVBTX01BWC8yKzEpKjY0XTsKKyAgICAgICAgICAgICAgICBpbnQgYTU9IHRtcElbeCArIChIVEFQU19NQVgvMisyKSo2NF07CisgICAgICAgICAgICAgICAgaW50IGE2PSB0bXBJW3ggKyAoSFRBUFNfTUFYLzIrMykqNjRdOworICAgICAgICAgICAgICAgIGludCBhbT0wOworICAgICAgICAgICAgICAgIGlmKCFwIHx8IHAtPmZhc3RfbWMpCisgICAgICAgICAgICAgICAgICAgIGFtPSAoMjAqKGEyK2EzKSAtIDUqKGExK2E0KSArIChhMCthNSkgKyA1MTIpPj4xMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGFtPSAocC0+aGNvZWZmWzBdKihhMithMykgKyBwLT5oY29lZmZbMV0qKGExK2E0KSArIHAtPmhjb2VmZlsyXSooYTArYTUpICsgcC0+aGNvZWZmWzNdKihhXzErYTYpICsgMjA0OCk+PjEyOworICAgICAgICAgICAgICAgIGlmKGFtJih+MjU1KSkgYW09IH4oYW0+PjMxKTsKKyAgICAgICAgICAgICAgICB0bXAyW3hdPSBhbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcEkrPSA2NDsKKyAgICAgICAgICAgIHRtcDIrPSA2NDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGhwZWxbIDBdPSBzcmM7CisgICAgaHBlbFsgMV09IHRtcDJ0WzBdICsgNjQqKEhUQVBTX01BWC8yLTEpOworICAgIGhwZWxbIDJdPSBzcmMgKyAxOworCisgICAgaHBlbFsgNF09IHRtcDJ0WzFdOworICAgIGhwZWxbIDVdPSB0bXAydFsyXTsKKyAgICBocGVsWyA2XT0gdG1wMnRbMV0gKyAxOworCisgICAgaHBlbFsgOF09IHNyYyArIHN0cmlkZTsKKyAgICBocGVsWyA5XT0gaHBlbFsxXSArIDY0OworICAgIGhwZWxbMTBdPSBocGVsWzhdICsgMTsKKworI2RlZmluZSBNQ19TVFJJREUoeCkgKG5lZWRzW3hdID8gNjQgOiBzdHJpZGUpCisKKyAgICBpZihiPT0xNSl7CisgICAgICAgIGludCBkeHkgPSBkeCAvIDggKyBkeSAvIDggKiA0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxID0gaHBlbFtkeHkgICAgXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiA9IGhwZWxbZHh5ICsgMV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzMgPSBocGVsW2R4eSArIDRdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmM0ID0gaHBlbFtkeHkgKyA1XTsKKyAgICAgICAgaW50IHN0cmlkZTEgPSBNQ19TVFJJREUoZHh5KTsKKyAgICAgICAgaW50IHN0cmlkZTIgPSBNQ19TVFJJREUoZHh5ICsgMSk7CisgICAgICAgIGludCBzdHJpZGUzID0gTUNfU1RSSURFKGR4eSArIDQpOworICAgICAgICBpbnQgc3RyaWRlNCA9IE1DX1NUUklERShkeHkgKyA1KTsKKyAgICAgICAgZHgmPTc7CisgICAgICAgIGR5Jj03OworICAgICAgICBmb3IoeT0wOyB5IDwgYl9oOyB5KyspeworICAgICAgICAgICAgZm9yKHg9MDsgeCA8IGJfdzsgeCsrKXsKKyAgICAgICAgICAgICAgICBkc3RbeF09ICgoOC1keCkqKDgtZHkpKnNyYzFbeF0gKyBkeCooOC1keSkqc3JjMlt4XSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoOC1keCkqICAgZHkgKnNyYzNbeF0gKyBkeCogICBkeSAqc3JjNFt4XSszMik+PjY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMxKz1zdHJpZGUxOworICAgICAgICAgICAgc3JjMis9c3RyaWRlMjsKKyAgICAgICAgICAgIHNyYzMrPXN0cmlkZTM7CisgICAgICAgICAgICBzcmM0Kz1zdHJpZGU0OworICAgICAgICAgICAgZHN0ICs9c3RyaWRlOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzE9IGhwZWxbbF07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzI9IGhwZWxbcl07CisgICAgICAgIGludCBzdHJpZGUxID0gTUNfU1RSSURFKGwpOworICAgICAgICBpbnQgc3RyaWRlMiA9IE1DX1NUUklERShyKTsKKyAgICAgICAgaW50IGE9IHdlaWdodFsoKGR4JjcpICsgKDgqKGR5JjcpKSldOworICAgICAgICBpbnQgYj0gOC1hOworICAgICAgICBmb3IoeT0wOyB5IDwgYl9oOyB5KyspeworICAgICAgICAgICAgZm9yKHg9MDsgeCA8IGJfdzsgeCsrKXsKKyAgICAgICAgICAgICAgICBkc3RbeF09IChhKnNyYzFbeF0gKyBiKnNyYzJbeF0gKyA0KT4+MzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyYzErPXN0cmlkZTE7CisgICAgICAgICAgICBzcmMyKz1zdHJpZGUyOworICAgICAgICAgICAgZHN0ICs9c3RyaWRlOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZmX3Nub3dfcHJlZF9ibG9jayhTbm93Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCB1aW50OF90ICp0bXAsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBzeCwgaW50IHN5LCBpbnQgYl93LCBpbnQgYl9oLCBjb25zdCBCbG9ja05vZGUgKmJsb2NrLCBpbnQgcGxhbmVfaW5kZXgsIGludCB3LCBpbnQgaCl7CisgICAgaWYoYmxvY2stPnR5cGUgJiBCTE9DS19JTlRSQSl7CisgICAgICAgIGludCB4LCB5OworICAgICAgICBjb25zdCB1bnNpZ25lZCBjb2xvciAgPSBibG9jay0+Y29sb3JbcGxhbmVfaW5kZXhdOworICAgICAgICBjb25zdCB1bnNpZ25lZCBjb2xvcjQgPSBjb2xvcioweDAxMDEwMTAxOworICAgICAgICBpZihiX3c9PTMyKXsKKyAgICAgICAgICAgIGZvcih5PTA7IHkgPCBiX2g7IHkrKyl7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopJmRzdFswICsgeSpzdHJpZGVdPSBjb2xvcjQ7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopJmRzdFs0ICsgeSpzdHJpZGVdPSBjb2xvcjQ7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopJmRzdFs4ICsgeSpzdHJpZGVdPSBjb2xvcjQ7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopJmRzdFsxMisgeSpzdHJpZGVdPSBjb2xvcjQ7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopJmRzdFsxNisgeSpzdHJpZGVdPSBjb2xvcjQ7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopJmRzdFsyMCsgeSpzdHJpZGVdPSBjb2xvcjQ7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopJmRzdFsyNCsgeSpzdHJpZGVdPSBjb2xvcjQ7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopJmRzdFsyOCsgeSpzdHJpZGVdPSBjb2xvcjQ7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNlIGlmKGJfdz09MTYpeworICAgICAgICAgICAgZm9yKHk9MDsgeSA8IGJfaDsgeSsrKXsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KikmZHN0WzAgKyB5KnN0cmlkZV09IGNvbG9yNDsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KikmZHN0WzQgKyB5KnN0cmlkZV09IGNvbG9yNDsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KikmZHN0WzggKyB5KnN0cmlkZV09IGNvbG9yNDsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KikmZHN0WzEyKyB5KnN0cmlkZV09IGNvbG9yNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2UgaWYoYl93PT04KXsKKyAgICAgICAgICAgIGZvcih5PTA7IHkgPCBiX2g7IHkrKyl7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopJmRzdFswICsgeSpzdHJpZGVdPSBjb2xvcjQ7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopJmRzdFs0ICsgeSpzdHJpZGVdPSBjb2xvcjQ7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNlIGlmKGJfdz09NCl7CisgICAgICAgICAgICBmb3IoeT0wOyB5IDwgYl9oOyB5KyspeworICAgICAgICAgICAgICAgICoodWludDMyX3QqKSZkc3RbMCArIHkqc3RyaWRlXT0gY29sb3I0OworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGZvcih5PTA7IHkgPCBiX2g7IHkrKyl7CisgICAgICAgICAgICAgICAgZm9yKHg9MDsgeCA8IGJfdzsgeCsrKXsKKyAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyB5KnN0cmlkZV09IGNvbG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICB1aW50OF90ICpzcmM9IHMtPmxhc3RfcGljdHVyZVtibG9jay0+cmVmXS0+ZGF0YVtwbGFuZV9pbmRleF07CisgICAgICAgIGNvbnN0IGludCBzY2FsZT0gcGxhbmVfaW5kZXggPyAgKDIqcy0+bXZfc2NhbGUpPj5zLT5jaHJvbWFfaF9zaGlmdCA6IDIqcy0+bXZfc2NhbGU7CisgICAgICAgIGludCBteD0gYmxvY2stPm14KnNjYWxlOworICAgICAgICBpbnQgbXk9IGJsb2NrLT5teSpzY2FsZTsKKyAgICAgICAgY29uc3QgaW50IGR4PSBteCYxNTsKKyAgICAgICAgY29uc3QgaW50IGR5PSBteSYxNTsKKyAgICAgICAgY29uc3QgaW50IHRhYl9pbmRleD0gMyAtIChiX3c+PjIpICsgKGJfdz4+NCk7CisgICAgICAgIHN4ICs9IChteD4+NCkgLSAoSFRBUFNfTUFYLzItMSk7CisgICAgICAgIHN5ICs9IChteT4+NCkgLSAoSFRBUFNfTUFYLzItMSk7CisgICAgICAgIHNyYyArPSBzeCArIHN5KnN0cmlkZTsKKyAgICAgICAgaWYoICAgKHVuc2lnbmVkKXN4ID49IEZGTUFYKHcgLSBiX3cgLSAoSFRBUFNfTUFYLTIpLCAwKQorICAgICAgICAgICB8fCAodW5zaWduZWQpc3kgPj0gRkZNQVgoaCAtIGJfaCAtIChIVEFQU19NQVgtMiksIDApKXsKKyAgICAgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh0bXAgKyBNQl9TSVpFLCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYl93K0hUQVBTX01BWC0xLCBiX2grSFRBUFNfTUFYLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3gsIHN5LCB3LCBoKTsKKyAgICAgICAgICAgIHNyYz0gdG1wICsgTUJfU0laRTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Fzc2VydDIocy0+Y2hyb21hX2hfc2hpZnQgPT0gcy0+Y2hyb21hX3Zfc2hpZnQpOyAvLyBvbmx5IG9uZSBtdl9zY2FsZQorCisgICAgICAgIGF2X2Fzc2VydDIoKHRhYl9pbmRleD49MCAmJiB0YWJfaW5kZXg8NCkgfHwgYl93PT0zMik7CisgICAgICAgIGlmKCAgICAoZHgmMykgfHwgKGR5JjMpCisgICAgICAgICAgICB8fCAhKGJfdyA9PSBiX2ggfHwgMipiX3cgPT0gYl9oIHx8IGJfdyA9PSAyKmJfaCkKKyAgICAgICAgICAgIHx8IChiX3cmKGJfdy0xKSkKKyAgICAgICAgICAgIHx8IGJfdyA9PSAxCisgICAgICAgICAgICB8fCBiX2ggPT0gMQorICAgICAgICAgICAgfHwgIXMtPnBsYW5lW3BsYW5lX2luZGV4XS5mYXN0X21jICkKKyAgICAgICAgICAgIG1jX2Jsb2NrKCZzLT5wbGFuZVtwbGFuZV9pbmRleF0sIGRzdCwgc3JjLCBzdHJpZGUsIGJfdywgYl9oLCBkeCwgZHkpOworICAgICAgICBlbHNlIGlmKGJfdz09MzIpeworICAgICAgICAgICAgaW50IHk7CisgICAgICAgICAgICBmb3IoeT0wOyB5PGJfaDsgeSs9MTYpeworICAgICAgICAgICAgICAgIHMtPmgyNjRxcGVsLnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVtkeSsoZHg+PjIpXShkc3QgKyB5KnN0cmlkZSwgc3JjICsgMyArICh5KzMpKnN0cmlkZSxzdHJpZGUpOworICAgICAgICAgICAgICAgIHMtPmgyNjRxcGVsLnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVtkeSsoZHg+PjIpXShkc3QgKyAxNiArIHkqc3RyaWRlLCBzcmMgKyAxOSArICh5KzMpKnN0cmlkZSxzdHJpZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZSBpZihiX3c9PWJfaCkKKyAgICAgICAgICAgIHMtPmgyNjRxcGVsLnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlt0YWJfaW5kZXggIF1bZHkrKGR4Pj4yKV0oZHN0LHNyYyArIDMgKyAzKnN0cmlkZSxzdHJpZGUpOworICAgICAgICBlbHNlIGlmKGJfdz09MipiX2gpeworICAgICAgICAgICAgcy0+aDI2NHFwZWwucHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiW3RhYl9pbmRleCsxXVtkeSsoZHg+PjIpXShkc3QgICAgLHNyYyArIDMgICAgICAgKyAzKnN0cmlkZSxzdHJpZGUpOworICAgICAgICAgICAgcy0+aDI2NHFwZWwucHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiW3RhYl9pbmRleCsxXVtkeSsoZHg+PjIpXShkc3QrYl9oLHNyYyArIDMgKyBiX2ggKyAzKnN0cmlkZSxzdHJpZGUpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGF2X2Fzc2VydDIoMipiX3c9PWJfaCk7CisgICAgICAgICAgICBzLT5oMjY0cXBlbC5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbdGFiX2luZGV4ICBdW2R5KyhkeD4+MildKGRzdCAgICAgICAgICAgLHNyYyArIDMgKyAzKnN0cmlkZSAgICAgICAgICAgLHN0cmlkZSk7CisgICAgICAgICAgICBzLT5oMjY0cXBlbC5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbdGFiX2luZGV4ICBdW2R5KyhkeD4+MildKGRzdCtiX3cqc3RyaWRlLHNyYyArIDMgKyAzKnN0cmlkZStiX3cqc3RyaWRlLHN0cmlkZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNkZWZpbmUgbWNhKGR4LGR5LGJfdylcCitzdGF0aWMgdm9pZCBtY19ibG9ja19ocGVsICMjIGR4ICMjIGR5ICMjIGJfdyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpe1wKKyAgICBhdl9hc3NlcnQyKGg9PWJfdyk7XAorICAgIG1jX2Jsb2NrKE5VTEwsIGRzdCwgc3JjLShIVEFQU19NQVgvMi0xKS0oSFRBUFNfTUFYLzItMSkqc3RyaWRlLCBzdHJpZGUsIGJfdywgYl93LCBkeCwgZHkpO1wKK30KKworbWNhKCAwLCAwLDE2KQorbWNhKCA4LCAwLDE2KQorbWNhKCAwLCA4LDE2KQorbWNhKCA4LCA4LDE2KQorbWNhKCAwLCAwLDgpCittY2EoIDgsIDAsOCkKK21jYSggMCwgOCw4KQorbWNhKCA4LCA4LDgpCisKK2F2X2NvbGQgaW50IGZmX3Nub3dfY29tbW9uX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KXsKKyAgICBTbm93Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGksIGo7CisKKyAgICBzLT5hdmN0eD0gYXZjdHg7CisgICAgcy0+bWF4X3JlZl9mcmFtZXM9MTsgLy9qdXN0IG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBpbnZhbGlkIHZhbHVlIGluIGNhc2Ugb2Ygbm8gaW5pdGlhbCBrZXlmcmFtZQorCisgICAgZmZfbWVfY21wX2luaXQoJnMtPm1lY2MsIGF2Y3R4KTsKKyAgICBmZl9ocGVsZHNwX2luaXQoJnMtPmhkc3AsIGF2Y3R4LT5mbGFncyk7CisgICAgZmZfdmlkZW9kc3BfaW5pdCgmcy0+dmRzcCwgOCk7CisgICAgZmZfZHd0X2luaXQoJnMtPmR3dCk7CisgICAgZmZfaDI2NHFwZWxfaW5pdCgmcy0+aDI2NHFwZWwsIDgpOworCisjZGVmaW5lIG1jZihkeCxkeSlcCisgICAgcy0+cWRzcC5wdXRfcXBlbF9waXhlbHNfdGFiICAgICAgIFswXVtkeStkeC80XT1cCisgICAgcy0+cWRzcC5wdXRfbm9fcm5kX3FwZWxfcGl4ZWxzX3RhYlswXVtkeStkeC80XT1cCisgICAgICAgIHMtPmgyNjRxcGVsLnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVtkeStkeC80XTtcCisgICAgcy0+cWRzcC5wdXRfcXBlbF9waXhlbHNfdGFiICAgICAgIFsxXVtkeStkeC80XT1cCisgICAgcy0+cWRzcC5wdXRfbm9fcm5kX3FwZWxfcGl4ZWxzX3RhYlsxXVtkeStkeC80XT1cCisgICAgICAgIHMtPmgyNjRxcGVsLnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVtkeStkeC80XTsKKworICAgIG1jZiggMCwgMCkKKyAgICBtY2YoIDQsIDApCisgICAgbWNmKCA4LCAwKQorICAgIG1jZigxMiwgMCkKKyAgICBtY2YoIDAsIDQpCisgICAgbWNmKCA0LCA0KQorICAgIG1jZiggOCwgNCkKKyAgICBtY2YoMTIsIDQpCisgICAgbWNmKCAwLCA4KQorICAgIG1jZiggNCwgOCkKKyAgICBtY2YoIDgsIDgpCisgICAgbWNmKDEyLCA4KQorICAgIG1jZiggMCwxMikKKyAgICBtY2YoIDQsMTIpCisgICAgbWNmKCA4LDEyKQorICAgIG1jZigxMiwxMikKKworI2RlZmluZSBtY2ZoKGR4LGR5KVwKKyAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiICAgICAgIFswXVtkeS80K2R4LzhdPVwKKyAgICBzLT5oZHNwLnB1dF9ub19ybmRfcGl4ZWxzX3RhYlswXVtkeS80K2R4LzhdPVwKKyAgICAgICAgbWNfYmxvY2tfaHBlbCAjIyBkeCAjIyBkeSAjIyAxNjtcCisgICAgcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYiAgICAgICBbMV1bZHkvNCtkeC84XT1cCisgICAgcy0+aGRzcC5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bZHkvNCtkeC84XT1cCisgICAgICAgIG1jX2Jsb2NrX2hwZWwgIyMgZHggIyMgZHkgIyMgODsKKworICAgIG1jZmgoMCwgMCkKKyAgICBtY2ZoKDgsIDApCisgICAgbWNmaCgwLCA4KQorICAgIG1jZmgoOCwgOCkKKworICAgIGluaXRfcWV4cCgpOworCisvLyAgICBkZWMgKz0gRkZNQVgocy0+Y2hyb21hX2hfc2hpZnQsIHMtPmNocm9tYV92X3NoaWZ0KTsKKworICAgIHdpZHRoPSBzLT5hdmN0eC0+d2lkdGg7CisgICAgaGVpZ2h0PSBzLT5hdmN0eC0+aGVpZ2h0OworCisgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oYXZjdHgsIHMtPnNwYXRpYWxfaWR3dF9idWZmZXIsIHdpZHRoLCBoZWlnaHQgKiBzaXplb2YoSURXVEVMRU0pLCBmYWlsKTsKKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhhdmN0eCwgcy0+c3BhdGlhbF9kd3RfYnVmZmVyLCAgd2lkdGgsIGhlaWdodCAqIHNpemVvZihEV1RFTEVNKSwgIGZhaWwpOyAvL0ZJWE1FIHRoaXMgZG9lcyBub3QgYmVsb25nIGhlcmUKKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhhdmN0eCwgcy0+dGVtcF9kd3RfYnVmZmVyLCAgICAgd2lkdGgsIHNpemVvZihEV1RFTEVNKSwgIGZhaWwpOworICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGF2Y3R4LCBzLT50ZW1wX2lkd3RfYnVmZmVyLCAgICB3aWR0aCwgc2l6ZW9mKElEV1RFTEVNKSwgZmFpbCk7CisgICAgRkZfQUxMT0NfQVJSQVlfT1JfR09UTyhhdmN0eCwgIHMtPnJ1bl9idWZmZXIsICAgICAgICAgICgod2lkdGggKyAxKSA+PiAxKSwgKChoZWlnaHQgKyAxKSA+PiAxKSAqIHNpemVvZigqcy0+cnVuX2J1ZmZlciksIGZhaWwpOworCisgICAgZm9yKGk9MDsgaTxNQVhfUkVGX0ZSQU1FUzsgaSsrKSB7CisgICAgICAgIGZvcihqPTA7IGo8TUFYX1JFRl9GUkFNRVM7IGorKykKKyAgICAgICAgICAgIGZmX3NjYWxlX212X3JlZltpXVtqXSA9IDI1NiooaSsxKS8oaisxKTsKKyAgICAgICAgcy0+bGFzdF9waWN0dXJlW2ldID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFzLT5sYXN0X3BpY3R1cmVbaV0pCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcy0+bWNvbmx5X3BpY3R1cmUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIHMtPmN1cnJlbnRfcGljdHVyZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5tY29ubHlfcGljdHVyZSB8fCAhcy0+Y3VycmVudF9waWN0dXJlKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworaW50IGZmX3Nub3dfY29tbW9uX2luaXRfYWZ0ZXJfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkgeworICAgIFNub3dDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcGxhbmVfaW5kZXgsIGxldmVsLCBvcmllbnRhdGlvbjsKKyAgICBpbnQgcmV0LCBlbXVfYnVmX3NpemU7CisKKyAgICBpZighcy0+c2NyYXRjaGJ1ZikgeworICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIocy0+YXZjdHgsIHMtPm1jb25seV9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGF2Y3R4LCBzLT5zY3JhdGNoYnVmLCBGRk1BWChzLT5tY29ubHlfcGljdHVyZS0+bGluZXNpemVbMF0sIDIqYXZjdHgtPndpZHRoKzI1NiksIDcqTUJfU0laRSwgZmFpbCk7CisgICAgICAgIGVtdV9idWZfc2l6ZSA9IEZGTUFYKHMtPm1jb25seV9waWN0dXJlLT5saW5lc2l6ZVswXSwgMiphdmN0eC0+d2lkdGgrMjU2KSAqICgyICogTUJfU0laRSArIEhUQVBTX01BWCAtIDEpOworICAgICAgICBGRl9BTExPQ19PUl9HT1RPKGF2Y3R4LCBzLT5lbXVfZWRnZV9idWZmZXIsIGVtdV9idWZfc2l6ZSwgZmFpbCk7CisgICAgfQorCisgICAgaWYocy0+bWNvbmx5X3BpY3R1cmUtPmZvcm1hdCAhPSBhdmN0eC0+cGl4X2ZtdCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBpeGVsIGZvcm1hdCBjaGFuZ2VkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZm9yKHBsYW5lX2luZGV4PTA7IHBsYW5lX2luZGV4IDwgcy0+bmJfcGxhbmVzOyBwbGFuZV9pbmRleCsrKXsKKyAgICAgICAgaW50IHc9IHMtPmF2Y3R4LT53aWR0aDsKKyAgICAgICAgaW50IGg9IHMtPmF2Y3R4LT5oZWlnaHQ7CisKKyAgICAgICAgaWYocGxhbmVfaW5kZXgpeworICAgICAgICAgICAgdz4+PSBzLT5jaHJvbWFfaF9zaGlmdDsKKyAgICAgICAgICAgIGg+Pj0gcy0+Y2hyb21hX3Zfc2hpZnQ7CisgICAgICAgIH0KKyAgICAgICAgcy0+cGxhbmVbcGxhbmVfaW5kZXhdLndpZHRoID0gdzsKKyAgICAgICAgcy0+cGxhbmVbcGxhbmVfaW5kZXhdLmhlaWdodD0gaDsKKworICAgICAgICBmb3IobGV2ZWw9cy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50LTE7IGxldmVsPj0wOyBsZXZlbC0tKXsKKyAgICAgICAgICAgIGZvcihvcmllbnRhdGlvbj1sZXZlbCA/IDEgOiAwOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKKyAgICAgICAgICAgICAgICBTdWJCYW5kICpiPSAmcy0+cGxhbmVbcGxhbmVfaW5kZXhdLmJhbmRbbGV2ZWxdW29yaWVudGF0aW9uXTsKKworICAgICAgICAgICAgICAgIGItPmJ1Zj0gcy0+c3BhdGlhbF9kd3RfYnVmZmVyOworICAgICAgICAgICAgICAgIGItPmxldmVsPSBsZXZlbDsKKyAgICAgICAgICAgICAgICBiLT5zdHJpZGU9IHMtPnBsYW5lW3BsYW5lX2luZGV4XS53aWR0aCA8PCAocy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50IC0gbGV2ZWwpOworICAgICAgICAgICAgICAgIGItPndpZHRoID0gKHcgKyAhKG9yaWVudGF0aW9uJjEpKT4+MTsKKyAgICAgICAgICAgICAgICBiLT5oZWlnaHQ9IChoICsgIShvcmllbnRhdGlvbj4xKSk+PjE7CisKKyAgICAgICAgICAgICAgICBiLT5zdHJpZGVfbGluZSA9IDEgPDwgKHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCAtIGxldmVsKTsKKyAgICAgICAgICAgICAgICBiLT5idWZfeF9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIGItPmJ1Zl95X29mZnNldCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZihvcmllbnRhdGlvbiYxKXsKKyAgICAgICAgICAgICAgICAgICAgYi0+YnVmICs9ICh3KzEpPj4xOworICAgICAgICAgICAgICAgICAgICBiLT5idWZfeF9vZmZzZXQgPSAodysxKT4+MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYob3JpZW50YXRpb24+MSl7CisgICAgICAgICAgICAgICAgICAgIGItPmJ1ZiArPSBiLT5zdHJpZGU+PjE7CisgICAgICAgICAgICAgICAgICAgIGItPmJ1Zl95X29mZnNldCA9IGItPnN0cmlkZV9saW5lID4+IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGItPmlidWY9IHMtPnNwYXRpYWxfaWR3dF9idWZmZXIgKyAoYi0+YnVmIC0gcy0+c3BhdGlhbF9kd3RfYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIGlmKGxldmVsKQorICAgICAgICAgICAgICAgICAgICBiLT5wYXJlbnQ9ICZzLT5wbGFuZVtwbGFuZV9pbmRleF0uYmFuZFtsZXZlbC0xXVtvcmllbnRhdGlvbl07CisgICAgICAgICAgICAgICAgLy9GSVhNRSBhdm9pZCB0aGlzIHJlYWxsb2MKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmYi0+eF9jb2VmZik7CisgICAgICAgICAgICAgICAgYi0+eF9jb2VmZj1hdl9tYWxsb2N6X2FycmF5KCgoYi0+d2lkdGgrMSkgKiBiLT5oZWlnaHQrMSksIHNpemVvZih4X2FuZF9jb2VmZikpOworICAgICAgICAgICAgICAgIGlmICghYi0+eF9jb2VmZikKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdz0gKHcrMSk+PjE7CisgICAgICAgICAgICBoPSAoaCsxKT4+MTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCisjZGVmaW5lIFVTRV9IQUxGUEVMX1BMQU5FIDAKKworc3RhdGljIGludCBoYWxmcGVsX2ludGVycG9sKFNub3dDb250ZXh0ICpzLCB1aW50OF90ICpoYWxmcGVsWzRdWzRdLCBBVkZyYW1lICpmcmFtZSl7CisgICAgaW50IHAseCx5OworCisgICAgZm9yKHA9MDsgcCA8IHMtPm5iX3BsYW5lczsgcCsrKXsKKyAgICAgICAgaW50IGlzX2Nocm9tYT0gISFwOworICAgICAgICBpbnQgdz0gaXNfY2hyb21hID8gcy0+YXZjdHgtPndpZHRoID4+cy0+Y2hyb21hX2hfc2hpZnQgOiBzLT5hdmN0eC0+d2lkdGg7CisgICAgICAgIGludCBoPSBpc19jaHJvbWEgPyBzLT5hdmN0eC0+aGVpZ2h0Pj5zLT5jaHJvbWFfdl9zaGlmdCA6IHMtPmF2Y3R4LT5oZWlnaHQ7CisgICAgICAgIGludCBscz0gZnJhbWUtPmxpbmVzaXplW3BdOworICAgICAgICB1aW50OF90ICpzcmM9IGZyYW1lLT5kYXRhW3BdOworCisgICAgICAgIGhhbGZwZWxbMV1bcF0gPSAodWludDhfdCopIGF2X21hbGxvYyhscyAqIChoICsgMiAqIEVER0VfV0lEVEgpKSArIEVER0VfV0lEVEggKiAoMSArIGxzKTsKKyAgICAgICAgaGFsZnBlbFsyXVtwXSA9ICh1aW50OF90KikgYXZfbWFsbG9jKGxzICogKGggKyAyICogRURHRV9XSURUSCkpICsgRURHRV9XSURUSCAqICgxICsgbHMpOworICAgICAgICBoYWxmcGVsWzNdW3BdID0gKHVpbnQ4X3QqKSBhdl9tYWxsb2MobHMgKiAoaCArIDIgKiBFREdFX1dJRFRIKSkgKyBFREdFX1dJRFRIICogKDEgKyBscyk7CisgICAgICAgIGlmICghaGFsZnBlbFsxXVtwXSB8fCAhaGFsZnBlbFsyXVtwXSB8fCAhaGFsZnBlbFszXVtwXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgaGFsZnBlbFswXVtwXT0gc3JjOworICAgICAgICBmb3IoeT0wOyB5PGg7IHkrKyl7CisgICAgICAgICAgICBmb3IoeD0wOyB4PHc7IHgrKyl7CisgICAgICAgICAgICAgICAgaW50IGk9IHkqbHMgKyB4OworCisgICAgICAgICAgICAgICAgaGFsZnBlbFsxXVtwXVtpXT0gKDIwKihzcmNbaV0gKyBzcmNbaSsxXSkgLSA1KihzcmNbaS0xXSArIHNyY1tpKzJdKSArIChzcmNbaS0yXSArIHNyY1tpKzNdKSArIDE2ICk+PjU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yKHk9MDsgeTxoOyB5KyspeworICAgICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICAgICAgICAgIGludCBpPSB5KmxzICsgeDsKKworICAgICAgICAgICAgICAgIGhhbGZwZWxbMl1bcF1baV09ICgyMCooc3JjW2ldICsgc3JjW2krbHNdKSAtIDUqKHNyY1tpLWxzXSArIHNyY1tpKzIqbHNdKSArIChzcmNbaS0yKmxzXSArIHNyY1tpKzMqbHNdKSArIDE2ICk+PjU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3JjPSBoYWxmcGVsWzFdW3BdOworICAgICAgICBmb3IoeT0wOyB5PGg7IHkrKyl7CisgICAgICAgICAgICBmb3IoeD0wOyB4PHc7IHgrKyl7CisgICAgICAgICAgICAgICAgaW50IGk9IHkqbHMgKyB4OworCisgICAgICAgICAgICAgICAgaGFsZnBlbFszXVtwXVtpXT0gKDIwKihzcmNbaV0gKyBzcmNbaStsc10pIC0gNSooc3JjW2ktbHNdICsgc3JjW2krMipsc10pICsgKHNyY1tpLTIqbHNdICsgc3JjW2krMypsc10pICsgMTYgKT4+NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisvL0ZJWE1FIGJvcmRlciEKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfc25vd19yZWxlYXNlX2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU25vd0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgaWYocy0+bGFzdF9waWN0dXJlW3MtPm1heF9yZWZfZnJhbWVzLTFdLT5kYXRhWzBdKXsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+bGFzdF9waWN0dXJlW3MtPm1heF9yZWZfZnJhbWVzLTFdKTsKKyAgICAgICAgZm9yKGk9MDsgaTw5OyBpKyspCisgICAgICAgICAgICBpZihzLT5oYWxmcGVsX3BsYW5lW3MtPm1heF9yZWZfZnJhbWVzLTFdWzEraS8zXVtpJTNdKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZShzLT5oYWxmcGVsX3BsYW5lW3MtPm1heF9yZWZfZnJhbWVzLTFdWzEraS8zXVtpJTNdIC0gRURHRV9XSURUSCooMStzLT5jdXJyZW50X3BpY3R1cmUtPmxpbmVzaXplW2klM10pKTsKKyAgICAgICAgICAgICAgICBzLT5oYWxmcGVsX3BsYW5lW3MtPm1heF9yZWZfZnJhbWVzLTFdWzEraS8zXVtpJTNdID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBmZl9zbm93X2ZyYW1lX3N0YXJ0KFNub3dDb250ZXh0ICpzKXsKKyAgIEFWRnJhbWUgKnRtcDsKKyAgIGludCBpLCByZXQ7CisKKyAgICBmZl9zbm93X3JlbGVhc2VfYnVmZmVyKHMtPmF2Y3R4KTsKKworICAgIHRtcD0gcy0+bGFzdF9waWN0dXJlW3MtPm1heF9yZWZfZnJhbWVzLTFdOworICAgIGZvcihpPXMtPm1heF9yZWZfZnJhbWVzLTE7IGk+MDsgaS0tKQorICAgICAgICBzLT5sYXN0X3BpY3R1cmVbaV0gPSBzLT5sYXN0X3BpY3R1cmVbaS0xXTsKKyAgICBtZW1tb3ZlKHMtPmhhbGZwZWxfcGxhbmUrMSwgcy0+aGFsZnBlbF9wbGFuZSwgKHMtPm1heF9yZWZfZnJhbWVzLTEpKnNpemVvZih2b2lkKikqNCo0KTsKKyAgICBpZihVU0VfSEFMRlBFTF9QTEFORSAmJiBzLT5jdXJyZW50X3BpY3R1cmUtPmRhdGFbMF0pIHsKKyAgICAgICAgaWYoKHJldCA9IGhhbGZwZWxfaW50ZXJwb2wocywgcy0+aGFsZnBlbF9wbGFuZVswXSwgcy0+Y3VycmVudF9waWN0dXJlKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcy0+bGFzdF9waWN0dXJlWzBdID0gcy0+Y3VycmVudF9waWN0dXJlOworICAgIHMtPmN1cnJlbnRfcGljdHVyZSA9IHRtcDsKKworICAgIGlmKHMtPmtleWZyYW1lKXsKKyAgICAgICAgcy0+cmVmX2ZyYW1lcz0gMDsKKyAgICB9ZWxzZXsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPTA7IGk8cy0+bWF4X3JlZl9mcmFtZXMgJiYgcy0+bGFzdF9waWN0dXJlW2ldLT5kYXRhWzBdOyBpKyspCisgICAgICAgICAgICBpZihpICYmIHMtPmxhc3RfcGljdHVyZVtpLTFdLT5rZXlfZnJhbWUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHMtPnJlZl9mcmFtZXM9IGk7CisgICAgICAgIGlmKHMtPnJlZl9mcmFtZXM9PTApeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LEFWX0xPR19FUlJPUiwgIk5vIHJlZmVyZW5jZSBmcmFtZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGlmICgocmV0ID0gZmZfc25vd19nZXRfYnVmZmVyKHMsIHMtPmN1cnJlbnRfcGljdHVyZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHMtPmN1cnJlbnRfcGljdHVyZS0+a2V5X2ZyYW1lPSBzLT5rZXlmcmFtZTsKKworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIHZvaWQgZmZfc25vd19jb21tb25fZW5kKFNub3dDb250ZXh0ICpzKQoreworICAgIGludCBwbGFuZV9pbmRleCwgbGV2ZWwsIG9yaWVudGF0aW9uLCBpOworCisgICAgYXZfZnJlZXAoJnMtPnNwYXRpYWxfZHd0X2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPnRlbXBfZHd0X2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPnNwYXRpYWxfaWR3dF9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZzLT50ZW1wX2lkd3RfYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmcy0+cnVuX2J1ZmZlcik7CisKKyAgICBzLT5tLm1lLnRlbXA9IE5VTEw7CisgICAgYXZfZnJlZXAoJnMtPm0ubWUuc2NyYXRjaHBhZCk7CisgICAgYXZfZnJlZXAoJnMtPm0ubWUubWFwKTsKKyAgICBhdl9mcmVlcCgmcy0+bS5tZS5zY29yZV9tYXApOworICAgIGF2X2ZyZWVwKCZzLT5tLm9ibWNfc2NyYXRjaHBhZCk7CisKKyAgICBhdl9mcmVlcCgmcy0+YmxvY2spOworICAgIGF2X2ZyZWVwKCZzLT5zY3JhdGNoYnVmKTsKKyAgICBhdl9mcmVlcCgmcy0+ZW11X2VkZ2VfYnVmZmVyKTsKKworICAgIGZvcihpPTA7IGk8TUFYX1JFRl9GUkFNRVM7IGkrKyl7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5yZWZfbXZzW2ldKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnJlZl9zY29yZXNbaV0pOworICAgICAgICBpZihzLT5sYXN0X3BpY3R1cmVbaV0gJiYgcy0+bGFzdF9waWN0dXJlW2ldLT5kYXRhWzBdKSB7CisgICAgICAgICAgICBhdl9hc3NlcnQwKHMtPmxhc3RfcGljdHVyZVtpXS0+ZGF0YVswXSAhPSBzLT5jdXJyZW50X3BpY3R1cmUtPmRhdGFbMF0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmxhc3RfcGljdHVyZVtpXSk7CisgICAgfQorCisgICAgZm9yKHBsYW5lX2luZGV4PTA7IHBsYW5lX2luZGV4IDwgcy0+bmJfcGxhbmVzOyBwbGFuZV9pbmRleCsrKXsKKyAgICAgICAgZm9yKGxldmVsPXMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudC0xOyBsZXZlbD49MDsgbGV2ZWwtLSl7CisgICAgICAgICAgICBmb3Iob3JpZW50YXRpb249bGV2ZWwgPyAxIDogMDsgb3JpZW50YXRpb248NDsgb3JpZW50YXRpb24rKyl7CisgICAgICAgICAgICAgICAgU3ViQmFuZCAqYj0gJnMtPnBsYW5lW3BsYW5lX2luZGV4XS5iYW5kW2xldmVsXVtvcmllbnRhdGlvbl07CisKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmYi0+eF9jb2VmZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+bWNvbmx5X3BpY3R1cmUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmN1cnJlbnRfcGljdHVyZSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zbm93LmggYi9mZm1wZWcvbGliYXZjb2RlYy9zbm93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxZmNhMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Nub3cuaApAQCAtMCwwICsxLDcxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJvYmVydCBFZGVsZSA8eWFydHJlYm9AZWFydGhsaW5rLm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NOT1dfSAorI2RlZmluZSBBVkNPREVDX1NOT1dfSAorCisjaW5jbHVkZSAiaHBlbGRzcC5oIgorI2luY2x1ZGUgIm1lX2NtcC5oIgorI2luY2x1ZGUgInFwZWxkc3AuaCIKKyNpbmNsdWRlICJzbm93X2R3dC5oIgorCisjaW5jbHVkZSAicmFuZ2Vjb2Rlci5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKworI2RlZmluZSBGRl9NUFZfT0ZGU0VUKHgpIChvZmZzZXRvZihNcGVnRW5jQ29udGV4dCwgeCkgKyBvZmZzZXRvZihTbm93Q29udGV4dCwgbSkpCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAiaDI2NHFwZWwuaCIKKworI2RlZmluZSBNSURfU1RBVEUgMTI4CisKKyNkZWZpbmUgTUFYX1BMQU5FUyA0CisjZGVmaW5lIFFTSElGVCA1CisjZGVmaW5lIFFST09UICgxPDxRU0hJRlQpCisjZGVmaW5lIExPU1NMRVNTX1FMT0cgLTEyOAorI2RlZmluZSBGUkFDX0JJVFMgNAorI2RlZmluZSBNQVhfUkVGX0ZSQU1FUyA4CisKKyNkZWZpbmUgTE9HMl9PQk1DX01BWCA4CisjZGVmaW5lIE9CTUNfTUFYICgxPDwoTE9HMl9PQk1DX01BWCkpCit0eXBlZGVmIHN0cnVjdCBCbG9ja05vZGV7CisgICAgaW50MTZfdCBteDsKKyAgICBpbnQxNl90IG15OworICAgIHVpbnQ4X3QgcmVmOworICAgIHVpbnQ4X3QgY29sb3JbM107CisgICAgdWludDhfdCB0eXBlOworLy8jZGVmaW5lIFRZUEVfU1BMSVQgICAgMQorI2RlZmluZSBCTE9DS19JTlRSQSAgIDEKKyNkZWZpbmUgQkxPQ0tfT1BUICAgICAyCisvLyNkZWZpbmUgVFlQRV9OT0NPTE9SICA0CisgICAgdWludDhfdCBsZXZlbDsgLy9GSVhNRSBtZXJnZSBpbnRvIHR5cGU/Cit9QmxvY2tOb2RlOworCitzdGF0aWMgY29uc3QgQmxvY2tOb2RlIG51bGxfYmxvY2s9IHsgLy9GSVhNRSBhZGQgYm9yZGVyIG1heWJlCisgICAgLmNvbG9yPSB7MTI4LDEyOCwxMjh9LAorICAgIC5teD0gMCwKKyAgICAubXk9IDAsCisgICAgLnJlZj0gMCwKKyAgICAudHlwZT0gMCwKKyAgICAubGV2ZWw9IDAsCit9OworCisjZGVmaW5lIExPRzJfTUJfU0laRSA0CisjZGVmaW5lIE1CX1NJWkUgKDE8PExPRzJfTUJfU0laRSkKKyNkZWZpbmUgRU5DT0RFUl9FWFRSQV9CSVRTIDQKKyNkZWZpbmUgSFRBUFNfTUFYIDgKKwordHlwZWRlZiBzdHJ1Y3QgeF9hbmRfY29lZmZ7CisgICAgaW50MTZfdCB4OworICAgIHVpbnQxNl90IGNvZWZmOworfSB4X2FuZF9jb2VmZjsKKwordHlwZWRlZiBzdHJ1Y3QgU3ViQmFuZHsKKyAgICBpbnQgbGV2ZWw7CisgICAgaW50IHN0cmlkZTsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgcWxvZzsgICAgICAgIC8vLzwgbG9nKHFzY2FsZSkvbG9nWzJeKDEvNildCisgICAgRFdURUxFTSAqYnVmOworICAgIElEV1RFTEVNICppYnVmOworICAgIGludCBidWZfeF9vZmZzZXQ7CisgICAgaW50IGJ1Zl95X29mZnNldDsKKyAgICBpbnQgc3RyaWRlX2xpbmU7IC8vLzwgU3RyaWRlIG1lYXN1cmVkIGluIGxpbmVzLCBub3QgcGl4ZWxzLgorICAgIHhfYW5kX2NvZWZmICogeF9jb2VmZjsKKyAgICBzdHJ1Y3QgU3ViQmFuZCAqcGFyZW50OworICAgIHVpbnQ4X3Qgc3RhdGVbLyo3KjIqLyA3ICsgNTEyXVszMl07Cit9U3ViQmFuZDsKKwordHlwZWRlZiBzdHJ1Y3QgUGxhbmV7CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgU3ViQmFuZCBiYW5kW01BWF9ERUNPTVBPU0lUSU9OU11bNF07CisKKyAgICBpbnQgaHRhcHM7CisgICAgaW50OF90IGhjb2VmZltIVEFQU19NQVgvMl07CisgICAgaW50IGRpYWdfbWM7CisgICAgaW50IGZhc3RfbWM7CisKKyAgICBpbnQgbGFzdF9odGFwczsKKyAgICBpbnQ4X3QgbGFzdF9oY29lZmZbSFRBUFNfTUFYLzJdOworICAgIGludCBsYXN0X2RpYWdfbWM7Cit9UGxhbmU7CisKK3R5cGVkZWYgc3RydWN0IFNub3dDb250ZXh0eworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBSYW5nZUNvZGVyIGM7CisgICAgTUVDbXBDb250ZXh0IG1lY2M7CisgICAgSHBlbERTUENvbnRleHQgaGRzcDsKKyAgICBRcGVsRFNQQ29udGV4dCBxZHNwOworICAgIFZpZGVvRFNQQ29udGV4dCB2ZHNwOworICAgIEgyNjRRcGVsQ29udGV4dCBoMjY0cXBlbDsKKyAgICBNcGVndmlkZW9FbmNEU1BDb250ZXh0IG1wdmVuY2RzcDsKKyAgICBTbm93RFdUQ29udGV4dCBkd3Q7CisgICAgY29uc3QgQVZGcmFtZSAqbmV3X3BpY3R1cmU7CisgICAgQVZGcmFtZSAqaW5wdXRfcGljdHVyZTsgICAgICAgICAgICAgIC8vLzwgbmV3X3BpY3R1cmUgd2l0aCB0aGUgaW50ZXJuYWwgbGluZXNpemVzCisgICAgQVZGcmFtZSAqY3VycmVudF9waWN0dXJlOworICAgIEFWRnJhbWUgKmxhc3RfcGljdHVyZVtNQVhfUkVGX0ZSQU1FU107CisgICAgdWludDhfdCAqaGFsZnBlbF9wbGFuZVtNQVhfUkVGX0ZSQU1FU11bNF1bNF07CisgICAgQVZGcmFtZSAqbWNvbmx5X3BpY3R1cmU7CisvLyAgICAgdWludDhfdCBxX2NvbnRleHRbMTZdOworICAgIHVpbnQ4X3QgaGVhZGVyX3N0YXRlWzMyXTsKKyAgICB1aW50OF90IGJsb2NrX3N0YXRlWzEyOCArIDMyKjEyOF07CisgICAgaW50IGtleWZyYW1lOworICAgIGludCBhbHdheXNfcmVzZXQ7CisgICAgaW50IHZlcnNpb247CisgICAgaW50IHNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlOworICAgIGludCBsYXN0X3NwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlOworICAgIGludCB0ZW1wb3JhbF9kZWNvbXBvc2l0aW9uX3R5cGU7CisgICAgaW50IHNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudDsKKyAgICBpbnQgbGFzdF9zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQ7CisgICAgaW50IHRlbXBvcmFsX2RlY29tcG9zaXRpb25fY291bnQ7CisgICAgaW50IG1heF9yZWZfZnJhbWVzOworICAgIGludCByZWZfZnJhbWVzOworICAgIGludDE2X3QgKCpyZWZfbXZzW01BWF9SRUZfRlJBTUVTXSlbMl07CisgICAgdWludDMyX3QgKnJlZl9zY29yZXNbTUFYX1JFRl9GUkFNRVNdOworICAgIERXVEVMRU0gKnNwYXRpYWxfZHd0X2J1ZmZlcjsKKyAgICBEV1RFTEVNICp0ZW1wX2R3dF9idWZmZXI7CisgICAgSURXVEVMRU0gKnNwYXRpYWxfaWR3dF9idWZmZXI7CisgICAgSURXVEVMRU0gKnRlbXBfaWR3dF9idWZmZXI7CisgICAgaW50ICpydW5fYnVmZmVyOworICAgIGludCBjb2xvcnNwYWNlX3R5cGU7CisgICAgaW50IGNocm9tYV9oX3NoaWZ0OworICAgIGludCBjaHJvbWFfdl9zaGlmdDsKKyAgICBpbnQgc3BhdGlhbF9zY2FsYWJpbGl0eTsKKyAgICBpbnQgcWxvZzsKKyAgICBpbnQgbGFzdF9xbG9nOworICAgIGludCBsYW1iZGE7CisgICAgaW50IGxhbWJkYTI7CisgICAgaW50IHBhc3MxX3JjOworICAgIGludCBtdl9zY2FsZTsKKyAgICBpbnQgbGFzdF9tdl9zY2FsZTsKKyAgICBpbnQgcWJpYXM7CisgICAgaW50IGxhc3RfcWJpYXM7CisjZGVmaW5lIFFCSUFTX1NISUZUIDMKKyAgICBpbnQgYl93aWR0aDsKKyAgICBpbnQgYl9oZWlnaHQ7CisgICAgaW50IGJsb2NrX21heF9kZXB0aDsKKyAgICBpbnQgbGFzdF9ibG9ja19tYXhfZGVwdGg7CisgICAgaW50IG5iX3BsYW5lczsKKyAgICBQbGFuZSBwbGFuZVtNQVhfUExBTkVTXTsKKyAgICBCbG9ja05vZGUgKmJsb2NrOworI2RlZmluZSBNRV9DQUNIRV9TSVpFIDEwMjQKKyAgICB1bnNpZ25lZCBtZV9jYWNoZVtNRV9DQUNIRV9TSVpFXTsKKyAgICB1bnNpZ25lZCBtZV9jYWNoZV9nZW5lcmF0aW9uOworICAgIHNsaWNlX2J1ZmZlciBzYjsKKyAgICBpbnQgbWVtY19vbmx5OworICAgIGludCBub19iaXRzdHJlYW07CisKKyAgICBNcGVnRW5jQ29udGV4dCBtOyAvLyBuZWVkZWQgZm9yIG1vdGlvbiBlc3RpbWF0aW9uLCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGFueXRoaW5nIGVsc2UsIHRoZSBpZGVhIGlzIHRvIGV2ZW50dWFsbHkgbWFrZSB0aGUgbW90aW9uIGVzdGltYXRpb24gaW5kZXBlbmRlbnQgb2YgTXBlZ0VuY0NvbnRleHQsIHNvIHRoaXMgd2lsbCBiZSByZW1vdmVkIHRoZW4gKEZJWE1FL1hYWCkKKworICAgIHVpbnQ4X3QgKnNjcmF0Y2hidWY7CisgICAgdWludDhfdCAqZW11X2VkZ2VfYnVmZmVyOworfVNub3dDb250ZXh0OworCisvKiBUYWJsZXMgKi8KK2V4dGVybiBjb25zdCB1aW50OF90ICogY29uc3QgZmZfb2JtY190YWJbNF07CitleHRlcm4gdWludDhfdCBmZl9xZXhwW1FST09UXTsKK2V4dGVybiBpbnQgZmZfc2NhbGVfbXZfcmVmW01BWF9SRUZfRlJBTUVTXVtNQVhfUkVGX0ZSQU1FU107CisKKy8qIEMgYml0cyB1c2VkIGJ5IG1teC9zc2UyL2FsdGl2ZWMgKi8KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBzbm93X2ludGVybGVhdmVfbGluZV9oZWFkZXIoaW50ICogaSwgaW50IHdpZHRoLCBJRFdURUxFTSAqIGxvdywgSURXVEVMRU0gKiBoaWdoKXsKKyAgICAoKmkpID0gKHdpZHRoKSAtIDI7CisKKyAgICBpZiAod2lkdGggJiAxKXsKKyAgICAgICAgbG93WygqaSkrMV0gPSBsb3dbKCgqaSkrMSk+PjFdOworICAgICAgICAoKmkpLS07CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHNub3dfaW50ZXJsZWF2ZV9saW5lX2Zvb3RlcihpbnQgKiBpLCBJRFdURUxFTSAqIGxvdywgSURXVEVMRU0gKiBoaWdoKXsKKyAgICBmb3IgKDsgKCppKT49MDsgKCppKS09Mil7CisgICAgICAgIGxvd1soKmkpKzFdID0gaGlnaFsoKmkpPj4xXTsKKyAgICAgICAgbG93WyppXSA9IGxvd1soKmkpPj4xXTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgc25vd19ob3Jpem9udGFsX2NvbXBvc2VfbGlmdF9sZWFkX291dChpbnQgaSwgSURXVEVMRU0gKiBkc3QsIElEV1RFTEVNICogc3JjLCBJRFdURUxFTSAqIHJlZiwgaW50IHdpZHRoLCBpbnQgdywgaW50IGxpZnRfaGlnaCwgaW50IG11bCwgaW50IGFkZCwgaW50IHNoaWZ0KXsKKyAgICBmb3IoOyBpPHc7IGkrKyl7CisgICAgICAgIGRzdFtpXSA9IHNyY1tpXSAtICgobXVsICogKHJlZltpXSArIHJlZltpICsgMV0pICsgYWRkKSA+PiBzaGlmdCk7CisgICAgfQorCisgICAgaWYoKHdpZHRoXmxpZnRfaGlnaCkmMSl7CisgICAgICAgIGRzdFt3XSA9IHNyY1t3XSAtICgobXVsICogMiAqIHJlZlt3XSArIGFkZCkgPj4gc2hpZnQpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBzbm93X2hvcml6b250YWxfY29tcG9zZV9saWZ0U19sZWFkX291dChpbnQgaSwgSURXVEVMRU0gKiBkc3QsIElEV1RFTEVNICogc3JjLCBJRFdURUxFTSAqIHJlZiwgaW50IHdpZHRoLCBpbnQgdyl7CisgICAgICAgIGZvcig7IGk8dzsgaSsrKXsKKyAgICAgICAgICAgIGRzdFtpXSA9IHNyY1tpXSArICgocmVmW2ldICsgcmVmWyhpKzEpXStXX0JPICsgNCAqIHNyY1tpXSkgPj4gV19CUyk7CisgICAgICAgIH0KKworICAgICAgICBpZih3aWR0aCYxKXsKKyAgICAgICAgICAgIGRzdFt3XSA9IHNyY1t3XSArICgoMiAqIHJlZlt3XSArIFdfQk8gKyA0ICogc3JjW3ddKSA+PiBXX0JTKTsKKyAgICAgICAgfQorfQorCisvKiBjb21tb24gY29kZSAqLworCitpbnQgZmZfc25vd19jb21tb25faW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworaW50IGZmX3Nub3dfY29tbW9uX2luaXRfYWZ0ZXJfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cit2b2lkIGZmX3Nub3dfY29tbW9uX2VuZChTbm93Q29udGV4dCAqcyk7Cit2b2lkIGZmX3Nub3dfcmVsZWFzZV9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK3ZvaWQgZmZfc25vd19yZXNldF9jb250ZXh0cyhTbm93Q29udGV4dCAqcyk7CitpbnQgZmZfc25vd19hbGxvY19ibG9ja3MoU25vd0NvbnRleHQgKnMpOworaW50IGZmX3Nub3dfZnJhbWVfc3RhcnQoU25vd0NvbnRleHQgKnMpOwordm9pZCBmZl9zbm93X3ByZWRfYmxvY2soU25vd0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqdG1wLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN4LCBpbnQgc3ksIGludCBiX3csIGludCBiX2gsIGNvbnN0IEJsb2NrTm9kZSAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhbmVfaW5kZXgsIGludCB3LCBpbnQgaCk7CitpbnQgZmZfc25vd19nZXRfYnVmZmVyKFNub3dDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSk7CisvKiBjb21tb24gaW5saW5lIGZ1bmN0aW9ucyAqLworLy9YWFggZG91YmxlY2hlY2sgYWxsIG9mIHRoZW0gc2hvdWxkIHN0YXkgaW5saW5lZAorCitzdGF0aWMgaW5saW5lIHZvaWQgc25vd19zZXRfYmxvY2tzKFNub3dDb250ZXh0ICpzLCBpbnQgbGV2ZWwsIGludCB4LCBpbnQgeSwgaW50IGwsIGludCBjYiwgaW50IGNyLCBpbnQgbXgsIGludCBteSwgaW50IHJlZiwgaW50IHR5cGUpeworICAgIGNvbnN0IGludCB3PSBzLT5iX3dpZHRoIDw8IHMtPmJsb2NrX21heF9kZXB0aDsKKyAgICBjb25zdCBpbnQgcmVtX2RlcHRoPSBzLT5ibG9ja19tYXhfZGVwdGggLSBsZXZlbDsKKyAgICBjb25zdCBpbnQgaW5kZXg9ICh4ICsgeSp3KSA8PCByZW1fZGVwdGg7CisgICAgY29uc3QgaW50IGJsb2NrX3c9IDE8PHJlbV9kZXB0aDsKKyAgICBCbG9ja05vZGUgYmxvY2s7CisgICAgaW50IGksajsKKworICAgIGJsb2NrLmNvbG9yWzBdPSBsOworICAgIGJsb2NrLmNvbG9yWzFdPSBjYjsKKyAgICBibG9jay5jb2xvclsyXT0gY3I7CisgICAgYmxvY2subXg9IG14OworICAgIGJsb2NrLm15PSBteTsKKyAgICBibG9jay5yZWY9IHJlZjsKKyAgICBibG9jay50eXBlPSB0eXBlOworICAgIGJsb2NrLmxldmVsPSBsZXZlbDsKKworICAgIGZvcihqPTA7IGo8YmxvY2tfdzsgaisrKXsKKyAgICAgICAgZm9yKGk9MDsgaTxibG9ja193OyBpKyspeworICAgICAgICAgICAgcy0+YmxvY2tbaW5kZXggKyBpICsgaip3XT0gYmxvY2s7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVkX212KFNub3dDb250ZXh0ICpzLCBpbnQgKm14LCBpbnQgKm15LCBpbnQgcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2tOb2RlICpsZWZ0LCBjb25zdCBCbG9ja05vZGUgKnRvcCwgY29uc3QgQmxvY2tOb2RlICp0cil7CisgICAgaWYocy0+cmVmX2ZyYW1lcyA9PSAxKXsKKyAgICAgICAgKm14ID0gbWlkX3ByZWQobGVmdC0+bXgsIHRvcC0+bXgsIHRyLT5teCk7CisgICAgICAgICpteSA9IG1pZF9wcmVkKGxlZnQtPm15LCB0b3AtPm15LCB0ci0+bXkpOworICAgIH1lbHNleworICAgICAgICBjb25zdCBpbnQgKnNjYWxlID0gZmZfc2NhbGVfbXZfcmVmW3JlZl07CisgICAgICAgICpteCA9IG1pZF9wcmVkKChsZWZ0LT5teCAqIHNjYWxlW2xlZnQtPnJlZl0gKyAxMjgpID4+OCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHRvcCAtPm14ICogc2NhbGVbdG9wIC0+cmVmXSArIDEyOCkgPj44LAorICAgICAgICAgICAgICAgICAgICAgICAodHIgIC0+bXggKiBzY2FsZVt0ciAgLT5yZWZdICsgMTI4KSA+PjgpOworICAgICAgICAqbXkgPSBtaWRfcHJlZCgobGVmdC0+bXkgKiBzY2FsZVtsZWZ0LT5yZWZdICsgMTI4KSA+PjgsCisgICAgICAgICAgICAgICAgICAgICAgICh0b3AgLT5teSAqIHNjYWxlW3RvcCAtPnJlZl0gKyAxMjgpID4+OCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHRyICAtPm15ICogc2NhbGVbdHIgIC0+cmVmXSArIDEyOCkgPj44KTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBzYW1lX2Jsb2NrKEJsb2NrTm9kZSAqYSwgQmxvY2tOb2RlICpiKXsKKyAgICBpZigoYS0+dHlwZSZCTE9DS19JTlRSQSkgJiYgKGItPnR5cGUmQkxPQ0tfSU5UUkEpKXsKKyAgICAgICAgcmV0dXJuICEoKGEtPmNvbG9yWzBdIC0gYi0+Y29sb3JbMF0pIHwgKGEtPmNvbG9yWzFdIC0gYi0+Y29sb3JbMV0pIHwgKGEtPmNvbG9yWzJdIC0gYi0+Y29sb3JbMl0pKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcmV0dXJuICEoKGEtPm14IC0gYi0+bXgpIHwgKGEtPm15IC0gYi0+bXkpIHwgKGEtPnJlZiAtIGItPnJlZikgfCAoKGEtPnR5cGUgXiBiLT50eXBlKSZCTE9DS19JTlRSQSkpOworICAgIH0KK30KKworLy9GSVhNRSBuYW1lIGNsZWFudXAgKGJfdywgYmxvY2tfdywgYl93aWR0aCBzdHVmZikKKy8vWFhYIHNob3VsZCB3ZSByZWFsbHkgaW5saW5lIGl0Pworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBhZGRfeWJsb2NrKFNub3dDb250ZXh0ICpzLCBpbnQgc2xpY2VkLCBzbGljZV9idWZmZXIgKnNiLCBJRFdURUxFTSAqZHN0LCB1aW50OF90ICpkc3Q4LCBjb25zdCB1aW50OF90ICpvYm1jLCBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IGJfdywgaW50IGJfaCwgaW50IHcsIGludCBoLCBpbnQgZHN0X3N0cmlkZSwgaW50IHNyY19zdHJpZGUsIGludCBvYm1jX3N0cmlkZSwgaW50IGJfeCwgaW50IGJfeSwgaW50IGFkZCwgaW50IG9mZnNldF9kc3QsIGludCBwbGFuZV9pbmRleCl7CisgICAgY29uc3QgaW50IGJfd2lkdGggPSBzLT5iX3dpZHRoICA8PCBzLT5ibG9ja19tYXhfZGVwdGg7CisgICAgY29uc3QgaW50IGJfaGVpZ2h0PSBzLT5iX2hlaWdodCA8PCBzLT5ibG9ja19tYXhfZGVwdGg7CisgICAgY29uc3QgaW50IGJfc3RyaWRlPSBiX3dpZHRoOworICAgIEJsb2NrTm9kZSAqbHQ9ICZzLT5ibG9ja1tiX3ggKyBiX3kqYl9zdHJpZGVdOworICAgIEJsb2NrTm9kZSAqcnQ9IGx0KzE7CisgICAgQmxvY2tOb2RlICpsYj0gbHQrYl9zdHJpZGU7CisgICAgQmxvY2tOb2RlICpyYj0gbGIrMTsKKyAgICB1aW50OF90ICpibG9ja1s0XTsKKyAgICBpbnQgdG1wX3N0ZXA9IHNyY19zdHJpZGUgPj0gNypNQl9TSVpFID8gTUJfU0laRSA6IE1CX1NJWkUqc3JjX3N0cmlkZTsKKyAgICB1aW50OF90ICp0bXAgPSBzLT5zY3JhdGNoYnVmOworICAgIHVpbnQ4X3QgKnB0bXA7CisgICAgaW50IHgseTsKKworICAgIGlmKGJfeDwwKXsKKyAgICAgICAgbHQ9IHJ0OworICAgICAgICBsYj0gcmI7CisgICAgfWVsc2UgaWYoYl94ICsgMSA+PSBiX3dpZHRoKXsKKyAgICAgICAgcnQ9IGx0OworICAgICAgICByYj0gbGI7CisgICAgfQorICAgIGlmKGJfeTwwKXsKKyAgICAgICAgbHQ9IGxiOworICAgICAgICBydD0gcmI7CisgICAgfWVsc2UgaWYoYl95ICsgMSA+PSBiX2hlaWdodCl7CisgICAgICAgIGxiPSBsdDsKKyAgICAgICAgcmI9IHJ0OworICAgIH0KKworICAgIGlmKHNyY194PDApeyAvL0ZJWE1FIG1lcmdlIHdpdGggcHJldiAmIGFsd2F5cyByb3VuZCBpbnRlcm5hbCB3aWR0aCB1cCB0byAqMTYKKyAgICAgICAgb2JtYyAtPSBzcmNfeDsKKyAgICAgICAgYl93ICs9IHNyY194OworICAgICAgICBpZighc2xpY2VkICYmICFvZmZzZXRfZHN0KQorICAgICAgICAgICAgZHN0IC09IHNyY194OworICAgICAgICBzcmNfeD0wOworICAgIH0KKyAgICBpZihzcmNfeCArIGJfdyA+IHcpeworICAgICAgICBiX3cgPSB3IC0gc3JjX3g7CisgICAgfQorICAgIGlmKHNyY195PDApeworICAgICAgICBvYm1jIC09IHNyY195Km9ibWNfc3RyaWRlOworICAgICAgICBiX2ggKz0gc3JjX3k7CisgICAgICAgIGlmKCFzbGljZWQgJiYgIW9mZnNldF9kc3QpCisgICAgICAgICAgICBkc3QgLT0gc3JjX3kqZHN0X3N0cmlkZTsKKyAgICAgICAgc3JjX3k9MDsKKyAgICB9CisgICAgaWYoc3JjX3kgKyBiX2g+IGgpeworICAgICAgICBiX2ggPSBoIC0gc3JjX3k7CisgICAgfQorCisgICAgaWYoYl93PD0wIHx8IGJfaDw9MCkgcmV0dXJuOworCisgICAgYXZfYXNzZXJ0MihzcmNfc3RyaWRlID4gMipNQl9TSVpFICsgNSk7CisKKyAgICBpZighc2xpY2VkICYmIG9mZnNldF9kc3QpCisgICAgICAgIGRzdCArPSBzcmNfeCArIHNyY195KmRzdF9zdHJpZGU7CisgICAgZHN0OCs9IHNyY194ICsgc3JjX3kqc3JjX3N0cmlkZTsKKy8vICAgIHNyYyArPSBzcmNfeCArIHNyY195KnNyY19zdHJpZGU7CisKKyAgICBwdG1wPSB0bXAgKyAzKnRtcF9zdGVwOworICAgIGJsb2NrWzBdPSBwdG1wOworICAgIHB0bXArPXRtcF9zdGVwOworICAgIGZmX3Nub3dfcHJlZF9ibG9jayhzLCBibG9ja1swXSwgdG1wLCBzcmNfc3RyaWRlLCBzcmNfeCwgc3JjX3ksIGJfdywgYl9oLCBsdCwgcGxhbmVfaW5kZXgsIHcsIGgpOworCisgICAgaWYoc2FtZV9ibG9jayhsdCwgcnQpKXsKKyAgICAgICAgYmxvY2tbMV09IGJsb2NrWzBdOworICAgIH1lbHNleworICAgICAgICBibG9ja1sxXT0gcHRtcDsKKyAgICAgICAgcHRtcCs9dG1wX3N0ZXA7CisgICAgICAgIGZmX3Nub3dfcHJlZF9ibG9jayhzLCBibG9ja1sxXSwgdG1wLCBzcmNfc3RyaWRlLCBzcmNfeCwgc3JjX3ksIGJfdywgYl9oLCBydCwgcGxhbmVfaW5kZXgsIHcsIGgpOworICAgIH0KKworICAgIGlmKHNhbWVfYmxvY2sobHQsIGxiKSl7CisgICAgICAgIGJsb2NrWzJdPSBibG9ja1swXTsKKyAgICB9ZWxzZSBpZihzYW1lX2Jsb2NrKHJ0LCBsYikpeworICAgICAgICBibG9ja1syXT0gYmxvY2tbMV07CisgICAgfWVsc2V7CisgICAgICAgIGJsb2NrWzJdPSBwdG1wOworICAgICAgICBwdG1wKz10bXBfc3RlcDsKKyAgICAgICAgZmZfc25vd19wcmVkX2Jsb2NrKHMsIGJsb2NrWzJdLCB0bXAsIHNyY19zdHJpZGUsIHNyY194LCBzcmNfeSwgYl93LCBiX2gsIGxiLCBwbGFuZV9pbmRleCwgdywgaCk7CisgICAgfQorCisgICAgaWYoc2FtZV9ibG9jayhsdCwgcmIpICl7CisgICAgICAgIGJsb2NrWzNdPSBibG9ja1swXTsKKyAgICB9ZWxzZSBpZihzYW1lX2Jsb2NrKHJ0LCByYikpeworICAgICAgICBibG9ja1szXT0gYmxvY2tbMV07CisgICAgfWVsc2UgaWYoc2FtZV9ibG9jayhsYiwgcmIpKXsKKyAgICAgICAgYmxvY2tbM109IGJsb2NrWzJdOworICAgIH1lbHNleworICAgICAgICBibG9ja1szXT0gcHRtcDsKKyAgICAgICAgZmZfc25vd19wcmVkX2Jsb2NrKHMsIGJsb2NrWzNdLCB0bXAsIHNyY19zdHJpZGUsIHNyY194LCBzcmNfeSwgYl93LCBiX2gsIHJiLCBwbGFuZV9pbmRleCwgdywgaCk7CisgICAgfQorICAgIGlmKHNsaWNlZCl7CisgICAgICAgIHMtPmR3dC5pbm5lcl9hZGRfeWJsb2NrKG9ibWMsIG9ibWNfc3RyaWRlLCBibG9jaywgYl93LCBiX2gsIHNyY194LHNyY195LCBzcmNfc3RyaWRlLCBzYiwgYWRkLCBkc3Q4KTsKKyAgICB9ZWxzZXsKKyAgICAgICAgZm9yKHk9MDsgeTxiX2g7IHkrKyl7CisgICAgICAgICAgICAvL0ZJWE1FIHVnbHkgbWlzdXNlIG9mIG9ibWNfc3RyaWRlCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpvYm1jMT0gb2JtYyArIHkqb2JtY19zdHJpZGU7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpvYm1jMj0gb2JtYzErIChvYm1jX3N0cmlkZT4+MSk7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpvYm1jMz0gb2JtYzErIG9ibWNfc3RyaWRlKihvYm1jX3N0cmlkZT4+MSk7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpvYm1jND0gb2JtYzMrIChvYm1jX3N0cmlkZT4+MSk7CisgICAgICAgICAgICBmb3IoeD0wOyB4PGJfdzsgeCsrKXsKKyAgICAgICAgICAgICAgICBpbnQgdj0gICBvYm1jMVt4XSAqIGJsb2NrWzNdW3ggKyB5KnNyY19zdHJpZGVdCisgICAgICAgICAgICAgICAgICAgICAgICArb2JtYzJbeF0gKiBibG9ja1syXVt4ICsgeSpzcmNfc3RyaWRlXQorICAgICAgICAgICAgICAgICAgICAgICAgK29ibWMzW3hdICogYmxvY2tbMV1beCArIHkqc3JjX3N0cmlkZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICtvYm1jNFt4XSAqIGJsb2NrWzBdW3ggKyB5KnNyY19zdHJpZGVdOworCisgICAgICAgICAgICAgICAgdiA8PD0gOCAtIExPRzJfT0JNQ19NQVg7CisgICAgICAgICAgICAgICAgaWYoRlJBQ19CSVRTICE9IDgpeworICAgICAgICAgICAgICAgICAgICB2ID4+PSA4IC0gRlJBQ19CSVRTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihhZGQpeworICAgICAgICAgICAgICAgICAgICB2ICs9IGRzdFt4ICsgeSpkc3Rfc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgdiA9ICh2ICsgKDE8PChGUkFDX0JJVFMtMSkpKSA+PiBGUkFDX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIGlmKHYmKH4yNTUpKSB2PSB+KHY+PjMxKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0OFt4ICsgeSpzcmNfc3RyaWRlXSA9IHY7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpkc3Rfc3RyaWRlXSAtPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBwcmVkaWN0X3NsaWNlKFNub3dDb250ZXh0ICpzLCBJRFdURUxFTSAqYnVmLCBpbnQgcGxhbmVfaW5kZXgsIGludCBhZGQsIGludCBtYl95KXsKKyAgICBQbGFuZSAqcD0gJnMtPnBsYW5lW3BsYW5lX2luZGV4XTsKKyAgICBjb25zdCBpbnQgbWJfdz0gcy0+Yl93aWR0aCAgPDwgcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIGNvbnN0IGludCBtYl9oPSBzLT5iX2hlaWdodCA8PCBzLT5ibG9ja19tYXhfZGVwdGg7CisgICAgaW50IHgsIHksIG1iX3g7CisgICAgaW50IGJsb2NrX3NpemUgPSBNQl9TSVpFID4+IHMtPmJsb2NrX21heF9kZXB0aDsKKyAgICBpbnQgYmxvY2tfdyAgICA9IHBsYW5lX2luZGV4ID8gYmxvY2tfc2l6ZT4+cy0+Y2hyb21hX2hfc2hpZnQgOiBibG9ja19zaXplOworICAgIGludCBibG9ja19oICAgID0gcGxhbmVfaW5kZXggPyBibG9ja19zaXplPj5zLT5jaHJvbWFfdl9zaGlmdCA6IGJsb2NrX3NpemU7CisgICAgY29uc3QgdWludDhfdCAqb2JtYyAgPSBwbGFuZV9pbmRleCA/IGZmX29ibWNfdGFiW3MtPmJsb2NrX21heF9kZXB0aCtzLT5jaHJvbWFfaF9zaGlmdF0gOiBmZl9vYm1jX3RhYltzLT5ibG9ja19tYXhfZGVwdGhdOworICAgIGNvbnN0IGludCBvYm1jX3N0cmlkZT0gcGxhbmVfaW5kZXggPyAoMipibG9ja19zaXplKT4+cy0+Y2hyb21hX2hfc2hpZnQgOiAyKmJsb2NrX3NpemU7CisgICAgaW50IHJlZl9zdHJpZGU9IHMtPmN1cnJlbnRfcGljdHVyZS0+bGluZXNpemVbcGxhbmVfaW5kZXhdOworICAgIHVpbnQ4X3QgKmRzdDg9IHMtPmN1cnJlbnRfcGljdHVyZS0+ZGF0YVtwbGFuZV9pbmRleF07CisgICAgaW50IHc9IHAtPndpZHRoOworICAgIGludCBoPSBwLT5oZWlnaHQ7CisgICAgYXZfYXNzZXJ0MihzLT5jaHJvbWFfaF9zaGlmdCA9PSBzLT5jaHJvbWFfdl9zaGlmdCk7IC8vIG9ibWMgcGFyYW1zIGFzc3VtZSBzcXVhcmVzCisgICAgaWYocy0+a2V5ZnJhbWUgfHwgKHMtPmF2Y3R4LT5kZWJ1ZyY1MTIpKXsKKyAgICAgICAgaWYobWJfeT09bWJfaCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZihhZGQpeworICAgICAgICAgICAgZm9yKHk9YmxvY2tfaCptYl95OyB5PEZGTUlOKGgsYmxvY2tfaCoobWJfeSsxKSk7IHkrKyl7CisgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICAgICAgICAgICAgICBpbnQgdj0gYnVmW3ggKyB5KnddICsgKDEyODw8RlJBQ19CSVRTKSArICgxPDwoRlJBQ19CSVRTLTEpKTsKKyAgICAgICAgICAgICAgICAgICAgdiA+Pj0gRlJBQ19CSVRTOworICAgICAgICAgICAgICAgICAgICBpZih2Jih+MjU1KSkgdj0gfih2Pj4zMSk7CisgICAgICAgICAgICAgICAgICAgIGRzdDhbeCArIHkqcmVmX3N0cmlkZV09IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGZvcih5PWJsb2NrX2gqbWJfeTsgeTxGRk1JTihoLGJsb2NrX2gqKG1iX3krMSkpOyB5KyspeworICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8dzsgeCsrKXsKKyAgICAgICAgICAgICAgICAgICAgYnVmW3ggKyB5KnddLT0gMTI4PDxGUkFDX0JJVFM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcihtYl94PTA7IG1iX3g8PW1iX3c7IG1iX3grKyl7CisgICAgICAgIGFkZF95YmxvY2socywgMCwgTlVMTCwgYnVmLCBkc3Q4LCBvYm1jLAorICAgICAgICAgICAgICAgICAgIGJsb2NrX3cqbWJfeCAtIGJsb2NrX3cvMiwKKyAgICAgICAgICAgICAgICAgICBibG9ja19oKm1iX3kgLSBibG9ja19oLzIsCisgICAgICAgICAgICAgICAgICAgYmxvY2tfdywgYmxvY2tfaCwKKyAgICAgICAgICAgICAgICAgICB3LCBoLAorICAgICAgICAgICAgICAgICAgIHcsIHJlZl9zdHJpZGUsIG9ibWNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIG1iX3ggLSAxLCBtYl95IC0gMSwKKyAgICAgICAgICAgICAgICAgICBhZGQsIDEsIHBsYW5lX2luZGV4KTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcHJlZGljdF9wbGFuZShTbm93Q29udGV4dCAqcywgSURXVEVMRU0gKmJ1ZiwgaW50IHBsYW5lX2luZGV4LCBpbnQgYWRkKXsKKyAgICBjb25zdCBpbnQgbWJfaD0gcy0+Yl9oZWlnaHQgPDwgcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIGludCBtYl95OworICAgIGZvcihtYl95PTA7IG1iX3k8PW1iX2g7IG1iX3krKykKKyAgICAgICAgcHJlZGljdF9zbGljZShzLCBidWYsIHBsYW5lX2luZGV4LCBhZGQsIG1iX3kpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2Jsb2NrcyhTbm93Q29udGV4dCAqcywgaW50IGxldmVsLCBpbnQgeCwgaW50IHksIGludCBsLCBpbnQgY2IsIGludCBjciwgaW50IG14LCBpbnQgbXksIGludCByZWYsIGludCB0eXBlKXsKKyAgICBjb25zdCBpbnQgdz0gcy0+Yl93aWR0aCA8PCBzLT5ibG9ja19tYXhfZGVwdGg7CisgICAgY29uc3QgaW50IHJlbV9kZXB0aD0gcy0+YmxvY2tfbWF4X2RlcHRoIC0gbGV2ZWw7CisgICAgY29uc3QgaW50IGluZGV4PSAoeCArIHkqdykgPDwgcmVtX2RlcHRoOworICAgIGNvbnN0IGludCBibG9ja193PSAxPDxyZW1fZGVwdGg7CisgICAgY29uc3QgaW50IGJsb2NrX2g9IDE8PHJlbV9kZXB0aDsgLy9GSVhNRSAidyE9aCIKKyAgICBCbG9ja05vZGUgYmxvY2s7CisgICAgaW50IGksajsKKworICAgIGJsb2NrLmNvbG9yWzBdPSBsOworICAgIGJsb2NrLmNvbG9yWzFdPSBjYjsKKyAgICBibG9jay5jb2xvclsyXT0gY3I7CisgICAgYmxvY2subXg9IG14OworICAgIGJsb2NrLm15PSBteTsKKyAgICBibG9jay5yZWY9IHJlZjsKKyAgICBibG9jay50eXBlPSB0eXBlOworICAgIGJsb2NrLmxldmVsPSBsZXZlbDsKKworICAgIGZvcihqPTA7IGo8YmxvY2tfaDsgaisrKXsKKyAgICAgICAgZm9yKGk9MDsgaTxibG9ja193OyBpKyspeworICAgICAgICAgICAgcy0+YmxvY2tbaW5kZXggKyBpICsgaip3XT0gYmxvY2s7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3JlZihNb3Rpb25Fc3RDb250ZXh0ICpjLCB1aW50OF90ICpzcmNbM10sIHVpbnQ4X3QgKnJlZlszXSwgdWludDhfdCAqcmVmMlszXSwgaW50IHgsIGludCB5LCBpbnQgcmVmX2luZGV4KXsKKyAgICBTbm93Q29udGV4dCAqcyA9IGMtPmF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgaW50IG9mZnNldFszXT0geworICAgICAgICAgIHkqYy0+ICBzdHJpZGUgKyB4LAorICAgICAgICAoKHkqYy0+dXZzdHJpZGUgKyB4KT4+cy0+Y2hyb21hX2hfc2hpZnQpLAorICAgICAgICAoKHkqYy0+dXZzdHJpZGUgKyB4KT4+cy0+Y2hyb21hX2hfc2hpZnQpLAorICAgIH07CisgICAgaW50IGk7CisgICAgZm9yKGk9MDsgaTwzOyBpKyspeworICAgICAgICBjLT5zcmNbMF1baV09IHNyYyBbaV07CisgICAgICAgIGMtPnJlZlswXVtpXT0gcmVmIFtpXSArIG9mZnNldFtpXTsKKyAgICB9CisgICAgYXZfYXNzZXJ0MighcmVmX2luZGV4KTsKK30KKworCisvKiBiaXRzdHJlYW0gZnVuY3Rpb25zICovCisKK2V4dGVybiBjb25zdCBpbnQ4X3QgZmZfcXVhbnQzYkFbMjU2XTsKKworI2RlZmluZSBRRVhQU0hJRlQgKDctRlJBQ19CSVRTKzgpIC8vRklYTUUgdHJ5IHRvIGNoYW5nZSB0aGlzIHRvIDAKKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9zeW1ib2woUmFuZ2VDb2RlciAqYywgdWludDhfdCAqc3RhdGUsIGludCB2LCBpbnQgaXNfc2lnbmVkKXsKKyAgICBpbnQgaTsKKworICAgIGlmKHYpeworICAgICAgICBjb25zdCBpbnQgYT0gRkZBQlModik7CisgICAgICAgIGNvbnN0IGludCBlPSBhdl9sb2cyKGEpOworICAgICAgICBjb25zdCBpbnQgZWw9IEZGTUlOKGUsIDEwKTsKKyAgICAgICAgcHV0X3JhYyhjLCBzdGF0ZSswLCAwKTsKKworICAgICAgICBmb3IoaT0wOyBpPGVsOyBpKyspeworICAgICAgICAgICAgcHV0X3JhYyhjLCBzdGF0ZSsxK2ksIDEpOyAgLy8xLi4xMAorICAgICAgICB9CisgICAgICAgIGZvcig7IGk8ZTsgaSsrKXsKKyAgICAgICAgICAgIHB1dF9yYWMoYywgc3RhdGUrMSs5LCAxKTsgIC8vMS4uMTAKKyAgICAgICAgfQorICAgICAgICBwdXRfcmFjKGMsIHN0YXRlKzErRkZNSU4oaSw5KSwgMCk7CisKKyAgICAgICAgZm9yKGk9ZS0xOyBpPj1lbDsgaS0tKXsKKyAgICAgICAgICAgIHB1dF9yYWMoYywgc3RhdGUrMjIrOSwgKGE+PmkpJjEpOyAvLzIyLi4zMQorICAgICAgICB9CisgICAgICAgIGZvcig7IGk+PTA7IGktLSl7CisgICAgICAgICAgICBwdXRfcmFjKGMsIHN0YXRlKzIyK2ksIChhPj5pKSYxKTsgLy8yMi4uMzEKKyAgICAgICAgfQorCisgICAgICAgIGlmKGlzX3NpZ25lZCkKKyAgICAgICAgICAgIHB1dF9yYWMoYywgc3RhdGUrMTEgKyBlbCwgdiA8IDApOyAvLzExLi4yMQorICAgIH1lbHNleworICAgICAgICBwdXRfcmFjKGMsIHN0YXRlKzAsIDEpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3N5bWJvbChSYW5nZUNvZGVyICpjLCB1aW50OF90ICpzdGF0ZSwgaW50IGlzX3NpZ25lZCl7CisgICAgaWYoZ2V0X3JhYyhjLCBzdGF0ZSswKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZXsKKyAgICAgICAgaW50IGksIGUsIGE7CisgICAgICAgIGU9IDA7CisgICAgICAgIHdoaWxlKGdldF9yYWMoYywgc3RhdGUrMSArIEZGTUlOKGUsOSkpKXsgLy8xLi4xMAorICAgICAgICAgICAgZSsrOworICAgICAgICB9CisKKyAgICAgICAgYT0gMTsKKyAgICAgICAgZm9yKGk9ZS0xOyBpPj0wOyBpLS0peworICAgICAgICAgICAgYSArPSBhICsgZ2V0X3JhYyhjLCBzdGF0ZSsyMiArIEZGTUlOKGksOSkpOyAvLzIyLi4zMQorICAgICAgICB9CisKKyAgICAgICAgZT0gLShpc19zaWduZWQgJiYgZ2V0X3JhYyhjLCBzdGF0ZSsxMSArIEZGTUlOKGUsMTApKSk7IC8vMTEuLjIxCisgICAgICAgIHJldHVybiAoYV5lKS1lOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9zeW1ib2wyKFJhbmdlQ29kZXIgKmMsIHVpbnQ4X3QgKnN0YXRlLCBpbnQgdiwgaW50IGxvZzIpeworICAgIGludCBpOworICAgIGludCByPSBsb2cyPj0wID8gMTw8bG9nMiA6IDE7CisKKyAgICBhdl9hc3NlcnQyKHY+PTApOworICAgIGF2X2Fzc2VydDIobG9nMj49LTQpOworCisgICAgd2hpbGUodiA+PSByKXsKKyAgICAgICAgcHV0X3JhYyhjLCBzdGF0ZSs0K2xvZzIsIDEpOworICAgICAgICB2IC09IHI7CisgICAgICAgIGxvZzIrKzsKKyAgICAgICAgaWYobG9nMj4wKSByKz1yOworICAgIH0KKyAgICBwdXRfcmFjKGMsIHN0YXRlKzQrbG9nMiwgMCk7CisKKyAgICBmb3IoaT1sb2cyLTE7IGk+PTA7IGktLSl7CisgICAgICAgIHB1dF9yYWMoYywgc3RhdGUrMzEtaSwgKHY+PmkpJjEpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3N5bWJvbDIoUmFuZ2VDb2RlciAqYywgdWludDhfdCAqc3RhdGUsIGludCBsb2cyKXsKKyAgICBpbnQgaTsKKyAgICBpbnQgcj0gbG9nMj49MCA/IDE8PGxvZzIgOiAxOworICAgIGludCB2PTA7CisKKyAgICBhdl9hc3NlcnQyKGxvZzI+PS00KTsKKworICAgIHdoaWxlKGxvZzI8MjggJiYgZ2V0X3JhYyhjLCBzdGF0ZSs0K2xvZzIpKXsKKyAgICAgICAgdis9IHI7CisgICAgICAgIGxvZzIrKzsKKyAgICAgICAgaWYobG9nMj4wKSByKz1yOworICAgIH0KKworICAgIGZvcihpPWxvZzItMTsgaT49MDsgaS0tKXsKKyAgICAgICAgdis9IGdldF9yYWMoYywgc3RhdGUrMzEtaSk8PGk7CisgICAgfQorCisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bnBhY2tfY29lZmZzKFNub3dDb250ZXh0ICpzLCBTdWJCYW5kICpiLCBTdWJCYW5kICogcGFyZW50LCBpbnQgb3JpZW50YXRpb24peworICAgIGNvbnN0IGludCB3PSBiLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaD0gYi0+aGVpZ2h0OworICAgIGludCB4LHk7CisKKyAgICBpbnQgcnVuLCBydW5zOworICAgIHhfYW5kX2NvZWZmICp4Yz0gYi0+eF9jb2VmZjsKKyAgICB4X2FuZF9jb2VmZiAqcHJldl94Yz0gTlVMTDsKKyAgICB4X2FuZF9jb2VmZiAqcHJldjJfeGM9IHhjOworICAgIHhfYW5kX2NvZWZmICpwYXJlbnRfeGM9IHBhcmVudCA/IHBhcmVudC0+eF9jb2VmZiA6IE5VTEw7CisgICAgeF9hbmRfY29lZmYgKnByZXZfcGFyZW50X3hjPSBwYXJlbnRfeGM7CisKKyAgICBydW5zPSBnZXRfc3ltYm9sMigmcy0+YywgYi0+c3RhdGVbMzBdLCAwKTsKKyAgICBpZihydW5zLS0gPiAwKSBydW49IGdldF9zeW1ib2wyKCZzLT5jLCBiLT5zdGF0ZVsxXSwgMyk7CisgICAgZWxzZSAgICAgICAgICAgcnVuPSBJTlRfTUFYOworCisgICAgZm9yKHk9MDsgeTxoOyB5KyspeworICAgICAgICBpbnQgdj0wOworICAgICAgICBpbnQgbHQ9MCwgdD0wLCBydD0wOworCisgICAgICAgIGlmKHkgJiYgcHJldl94Yy0+eCA9PSAwKXsKKyAgICAgICAgICAgIHJ0PSBwcmV2X3hjLT5jb2VmZjsKKyAgICAgICAgfQorICAgICAgICBmb3IoeD0wOyB4PHc7IHgrKyl7CisgICAgICAgICAgICBpbnQgcD0wOworICAgICAgICAgICAgY29uc3QgaW50IGw9IHY7CisKKyAgICAgICAgICAgIGx0PSB0OyB0PSBydDsKKworICAgICAgICAgICAgaWYoeSl7CisgICAgICAgICAgICAgICAgaWYocHJldl94Yy0+eCA8PSB4KQorICAgICAgICAgICAgICAgICAgICBwcmV2X3hjKys7CisgICAgICAgICAgICAgICAgaWYocHJldl94Yy0+eCA9PSB4ICsgMSkKKyAgICAgICAgICAgICAgICAgICAgcnQ9IHByZXZfeGMtPmNvZWZmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcnQ9MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBhcmVudF94Yyl7CisgICAgICAgICAgICAgICAgaWYoeD4+MSA+IHBhcmVudF94Yy0+eCl7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudF94YysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZih4Pj4xID09IHBhcmVudF94Yy0+eCl7CisgICAgICAgICAgICAgICAgICAgIHA9IHBhcmVudF94Yy0+Y29lZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoLypsbHwqL2x8bHR8dHxydHxwKXsKKyAgICAgICAgICAgICAgICBpbnQgY29udGV4dD0gYXZfbG9nMigvKkZGQUJTKGxsKSArICovMyoobD4+MSkgKyAobHQ+PjEpICsgKHQmfjEpICsgKHJ0Pj4xKSArIChwPj4xKSk7CisKKyAgICAgICAgICAgICAgICB2PWdldF9yYWMoJnMtPmMsICZiLT5zdGF0ZVswXVtjb250ZXh0XSk7CisgICAgICAgICAgICAgICAgaWYodil7CisgICAgICAgICAgICAgICAgICAgIHY9IDIqKGdldF9zeW1ib2wyKCZzLT5jLCBiLT5zdGF0ZVtjb250ZXh0ICsgMl0sIGNvbnRleHQtNCkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgdis9Z2V0X3JhYygmcy0+YywgJmItPnN0YXRlWzBdWzE2ICsgMSArIDMgKyBmZl9xdWFudDNiQVtsJjB4RkZdICsgMypmZl9xdWFudDNiQVt0JjB4RkZdXSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludDE2X3QpdiAhPSB2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvZWZmaWNpZW50IGRhbWFnZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeGMtPng9eDsKKyAgICAgICAgICAgICAgICAgICAgKHhjKyspLT5jb2VmZj0gdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBpZighcnVuKXsKKyAgICAgICAgICAgICAgICAgICAgaWYocnVucy0tID4gMCkgcnVuPSBnZXRfc3ltYm9sMigmcy0+YywgYi0+c3RhdGVbMV0sIDMpOworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICBydW49IElOVF9NQVg7CisgICAgICAgICAgICAgICAgICAgIHY9IDIqKGdldF9zeW1ib2wyKCZzLT5jLCBiLT5zdGF0ZVswICsgMl0sIDAtNCkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgdis9Z2V0X3JhYygmcy0+YywgJmItPnN0YXRlWzBdWzE2ICsgMSArIDNdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50MTZfdCl2ICE9IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29lZmZpY2llbnQgZGFtYWdlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHhjLT54PXg7CisgICAgICAgICAgICAgICAgICAgICh4YysrKS0+Y29lZmY9IHY7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhfcnVuOworICAgICAgICAgICAgICAgICAgICBydW4tLTsKKyAgICAgICAgICAgICAgICAgICAgdj0wOworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKHJ1biA+PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoeSkgbWF4X3J1bj0gRkZNSU4ocnVuLCBwcmV2X3hjLT54IC0geCAtIDIpOworICAgICAgICAgICAgICAgICAgICBlbHNlICBtYXhfcnVuPSBGRk1JTihydW4sIHcteC0xKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocGFyZW50X3hjKQorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3J1bj0gRkZNSU4obWF4X3J1biwgMipwYXJlbnRfeGMtPnggLSB4IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIobWF4X3J1biA+PSAwICYmIG1heF9ydW4gPD0gcnVuKTsKKworICAgICAgICAgICAgICAgICAgICB4Kz0gbWF4X3J1bjsKKyAgICAgICAgICAgICAgICAgICAgcnVuLT0gbWF4X3J1bjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKHhjKyspLT54PSB3KzE7IC8vZW5kIG1hcmtlcgorICAgICAgICBwcmV2X3hjPSBwcmV2Ml94YzsKKyAgICAgICAgcHJldjJfeGM9IHhjOworCisgICAgICAgIGlmKHBhcmVudF94Yyl7CisgICAgICAgICAgICBpZih5JjEpeworICAgICAgICAgICAgICAgIHdoaWxlKHBhcmVudF94Yy0+eCAhPSBwYXJlbnQtPndpZHRoKzEpCisgICAgICAgICAgICAgICAgICAgIHBhcmVudF94YysrOworICAgICAgICAgICAgICAgIHBhcmVudF94YysrOworICAgICAgICAgICAgICAgIHByZXZfcGFyZW50X3hjPSBwYXJlbnRfeGM7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBwYXJlbnRfeGM9IHByZXZfcGFyZW50X3hjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKHhjKyspLT54PSB3KzE7IC8vZW5kIG1hcmtlcgorfQorCisjZW5kaWYgLyogQVZDT0RFQ19TTk9XX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Nub3dfZHd0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy9zbm93X2R3dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODkwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zbm93X2R3dC5jCkBAIC0wLDAgKzEsODY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBEYXZpZCBDb25yYWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgIm1lX2NtcC5oIgorI2luY2x1ZGUgInNub3dfZHd0LmgiCisKK2ludCBmZl9zbGljZV9idWZmZXJfaW5pdChzbGljZV9idWZmZXIgKmJ1ZiwgaW50IGxpbmVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9hbGxvY2F0ZWRfbGluZXMsIGludCBsaW5lX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIElEV1RFTEVNICpiYXNlX2J1ZmZlcikKK3sKKyAgICBpbnQgaTsKKworICAgIGJ1Zi0+YmFzZV9idWZmZXIgPSBiYXNlX2J1ZmZlcjsKKyAgICBidWYtPmxpbmVfY291bnQgID0gbGluZV9jb3VudDsKKyAgICBidWYtPmxpbmVfd2lkdGggID0gbGluZV93aWR0aDsKKyAgICBidWYtPmRhdGFfY291bnQgID0gbWF4X2FsbG9jYXRlZF9saW5lczsKKyAgICBidWYtPmxpbmUgICAgICAgID0gYXZfbWFsbG9jel9hcnJheShsaW5lX2NvdW50LCBzaXplb2YoSURXVEVMRU0gKikpOworICAgIGlmICghYnVmLT5saW5lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGJ1Zi0+ZGF0YV9zdGFjayAgPSBhdl9tYWxsb2NfYXJyYXkobWF4X2FsbG9jYXRlZF9saW5lcywgc2l6ZW9mKElEV1RFTEVNICopKTsKKyAgICBpZiAoIWJ1Zi0+ZGF0YV9zdGFjaykgeworICAgICAgICBhdl9mcmVlcCgmYnVmLT5saW5lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X2FsbG9jYXRlZF9saW5lczsgaSsrKSB7CisgICAgICAgIGJ1Zi0+ZGF0YV9zdGFja1tpXSA9IGF2X21hbGxvY19hcnJheShsaW5lX3dpZHRoLCBzaXplb2YoSURXVEVMRU0pKTsKKyAgICAgICAgaWYgKCFidWYtPmRhdGFfc3RhY2tbaV0pIHsKKyAgICAgICAgICAgIGZvciAoaS0tOyBpID49MDsgaS0tKQorICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZidWYtPmRhdGFfc3RhY2tbaV0pOworICAgICAgICAgICAgYXZfZnJlZXAoJmJ1Zi0+ZGF0YV9zdGFjayk7CisgICAgICAgICAgICBhdl9mcmVlcCgmYnVmLT5saW5lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWYtPmRhdGFfc3RhY2tfdG9wID0gbWF4X2FsbG9jYXRlZF9saW5lcyAtIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK0lEV1RFTEVNICpmZl9zbGljZV9idWZmZXJfbG9hZF9saW5lKHNsaWNlX2J1ZmZlciAqYnVmLCBpbnQgbGluZSkKK3sKKyAgICBJRFdURUxFTSAqYnVmZmVyOworCisgICAgYXZfYXNzZXJ0MChidWYtPmRhdGFfc3RhY2tfdG9wID49IDApOworLy8gIGF2X2Fzc2VydDEoIWJ1Zi0+bGluZVtsaW5lXSk7CisgICAgaWYgKGJ1Zi0+bGluZVtsaW5lXSkKKyAgICAgICAgcmV0dXJuIGJ1Zi0+bGluZVtsaW5lXTsKKworICAgIGJ1ZmZlciA9IGJ1Zi0+ZGF0YV9zdGFja1tidWYtPmRhdGFfc3RhY2tfdG9wXTsKKyAgICBidWYtPmRhdGFfc3RhY2tfdG9wLS07CisgICAgYnVmLT5saW5lW2xpbmVdID0gYnVmZmVyOworCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKwordm9pZCBmZl9zbGljZV9idWZmZXJfcmVsZWFzZShzbGljZV9idWZmZXIgKmJ1ZiwgaW50IGxpbmUpCit7CisgICAgSURXVEVMRU0gKmJ1ZmZlcjsKKworICAgIGF2X2Fzc2VydDEobGluZSA+PSAwICYmIGxpbmUgPCBidWYtPmxpbmVfY291bnQpOworICAgIGF2X2Fzc2VydDEoYnVmLT5saW5lW2xpbmVdKTsKKworICAgIGJ1ZmZlciA9IGJ1Zi0+bGluZVtsaW5lXTsKKyAgICBidWYtPmRhdGFfc3RhY2tfdG9wKys7CisgICAgYnVmLT5kYXRhX3N0YWNrW2J1Zi0+ZGF0YV9zdGFja190b3BdID0gYnVmZmVyOworICAgIGJ1Zi0+bGluZVtsaW5lXSAgICAgICAgICAgICAgICAgICAgICA9IE5VTEw7Cit9CisKK3ZvaWQgZmZfc2xpY2VfYnVmZmVyX2ZsdXNoKHNsaWNlX2J1ZmZlciAqYnVmKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBidWYtPmxpbmVfY291bnQ7IGkrKykKKyAgICAgICAgaWYgKGJ1Zi0+bGluZVtpXSkKKyAgICAgICAgICAgIGZmX3NsaWNlX2J1ZmZlcl9yZWxlYXNlKGJ1ZiwgaSk7Cit9CisKK3ZvaWQgZmZfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koc2xpY2VfYnVmZmVyICpidWYpCit7CisgICAgaW50IGk7CisgICAgZmZfc2xpY2VfYnVmZmVyX2ZsdXNoKGJ1Zik7CisKKyAgICBmb3IgKGkgPSBidWYtPmRhdGFfY291bnQgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgYXZfZnJlZXAoJmJ1Zi0+ZGF0YV9zdGFja1tpXSk7CisgICAgYXZfZnJlZXAoJmJ1Zi0+ZGF0YV9zdGFjayk7CisgICAgYXZfZnJlZXAoJmJ1Zi0+bGluZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1pcnJvcihpbnQgdiwgaW50IG0pCit7CisgICAgd2hpbGUgKCh1bnNpZ25lZCl2ID4gKHVuc2lnbmVkKW0pIHsKKyAgICAgICAgdiA9IC12OworICAgICAgICBpZiAodiA8IDApCisgICAgICAgICAgICB2ICs9IDIgKiBtOworICAgIH0KKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBsaWZ0KERXVEVMRU0gKmRzdCwgRFdURUxFTSAqc3JjLCBEV1RFTEVNICpyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdGVwLCBpbnQgc3JjX3N0ZXAsIGludCByZWZfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBtdWwsIGludCBhZGQsIGludCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlnaHBhc3MsIGludCBpbnZlcnNlKQoreworICAgIGNvbnN0IGludCBtaXJyb3JfbGVmdCAgPSAhaGlnaHBhc3M7CisgICAgY29uc3QgaW50IG1pcnJvcl9yaWdodCA9ICh3aWR0aCAmIDEpIF4gaGlnaHBhc3M7CisgICAgY29uc3QgaW50IHcgICAgICAgICAgICA9ICh3aWR0aCA+PiAxKSAtIDEgKyAoaGlnaHBhc3MgJiB3aWR0aCk7CisgICAgaW50IGk7CisKKyNkZWZpbmUgTElGVChzcmMsIHJlZiwgaW52KSAoKHNyYykgKyAoKGludikgPyAtKHJlZikgOiArKHJlZikpKQorICAgIGlmIChtaXJyb3JfbGVmdCkgeworICAgICAgICBkc3RbMF0gPSBMSUZUKHNyY1swXSwgKChtdWwgKiAyICogcmVmWzBdICsgYWRkKSA+PiBzaGlmdCksIGludmVyc2UpOworICAgICAgICBkc3QgICArPSBkc3Rfc3RlcDsKKyAgICAgICAgc3JjICAgKz0gc3JjX3N0ZXA7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykKKyAgICAgICAgZHN0W2kgKiBkc3Rfc3RlcF0gPSBMSUZUKHNyY1tpICogc3JjX3N0ZXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtdWwgKiAocmVmW2kgKiByZWZfc3RlcF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmWyhpICsgMSkgKiByZWZfc3RlcF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkKSA+PiBzaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlKTsKKworICAgIGlmIChtaXJyb3JfcmlnaHQpCisgICAgICAgIGRzdFt3ICogZHN0X3N0ZXBdID0gTElGVChzcmNbdyAqIHNyY19zdGVwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobXVsICogMiAqIHJlZlt3ICogcmVmX3N0ZXBdICsgYWRkKSA+PiBzaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBsaWZ0UyhEV1RFTEVNICpkc3QsIERXVEVMRU0gKnNyYywgRFdURUxFTSAqcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0ZXAsIGludCBzcmNfc3RlcCwgaW50IHJlZl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBtdWwsIGludCBhZGQsIGludCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2hwYXNzLCBpbnQgaW52ZXJzZSkKK3sKKyAgICBjb25zdCBpbnQgbWlycm9yX2xlZnQgID0gIWhpZ2hwYXNzOworICAgIGNvbnN0IGludCBtaXJyb3JfcmlnaHQgPSAod2lkdGggJiAxKSBeIGhpZ2hwYXNzOworICAgIGNvbnN0IGludCB3ICAgICAgICAgICAgPSAod2lkdGggPj4gMSkgLSAxICsgKGhpZ2hwYXNzICYgd2lkdGgpOworICAgIGludCBpOworCisgICAgYXZfYXNzZXJ0MShzaGlmdCA9PSA0KTsKKyNkZWZpbmUgTElGVFMoc3JjLCByZWYsIGludikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKGludikgPyAoc3JjKSArICgoKHJlZikgKyA0ICogKHNyYykpID4+IHNoaWZ0KSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgOiAtKCgtMTYgKiAoc3JjKSArIChyZWYpICsgYWRkIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICA0ICsgMSArICg1IDw8IDI1KSkgLyAoNSAqIDQpIC0gKDEgPDwgMjMpKSkKKyAgICBpZiAobWlycm9yX2xlZnQpIHsKKyAgICAgICAgZHN0WzBdID0gTElGVFMoc3JjWzBdLCBtdWwgKiAyICogcmVmWzBdICsgYWRkLCBpbnZlcnNlKTsKKyAgICAgICAgZHN0ICAgKz0gZHN0X3N0ZXA7CisgICAgICAgIHNyYyAgICs9IHNyY19zdGVwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspCisgICAgICAgIGRzdFtpICogZHN0X3N0ZXBdID0gTElGVFMoc3JjW2kgKiBzcmNfc3RlcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsICogKHJlZltpICogcmVmX3N0ZXBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmWyhpICsgMSkgKiByZWZfc3RlcF0pICsgYWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2UpOworCisgICAgaWYgKG1pcnJvcl9yaWdodCkKKyAgICAgICAgZHN0W3cgKiBkc3Rfc3RlcF0gPSBMSUZUUyhzcmNbdyAqIHNyY19zdGVwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwgKiAyICogcmVmW3cgKiByZWZfc3RlcF0gKyBhZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGhvcml6b250YWxfZGVjb21wb3NlNTNpKERXVEVMRU0gKmIsIERXVEVMRU0gKnRlbXAsIGludCB3aWR0aCkKK3sKKyAgICBjb25zdCBpbnQgd2lkdGgyID0gd2lkdGggPj4gMTsKKyAgICBpbnQgeDsKKyAgICBjb25zdCBpbnQgdzIgPSAod2lkdGggKyAxKSA+PiAxOworCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoMjsgeCsrKSB7CisgICAgICAgIHRlbXBbeF0gICAgICA9IGJbMiAqIHhdOworICAgICAgICB0ZW1wW3ggKyB3Ml0gPSBiWzIgKiB4ICsgMV07CisgICAgfQorICAgIGlmICh3aWR0aCAmIDEpCisgICAgICAgIHRlbXBbeF0gPSBiWzIgKiB4XTsKKyAgICBsaWZ0KGIgKyB3MiwgdGVtcCArIHcyLCB0ZW1wLCAgIDEsIDEsIDEsIHdpZHRoLCAtMSwgMCwgMSwgMSwgMCk7CisgICAgbGlmdChiLCAgICAgIHRlbXAsICAgICAgYiArIHcyLCAxLCAxLCAxLCB3aWR0aCwgIDEsIDIsIDIsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCB2ZXJ0aWNhbF9kZWNvbXBvc2U1M2lIMChEV1RFTEVNICpiMCwgRFdURUxFTSAqYjEsIERXVEVMRU0gKmIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIGIxW2ldIC09IChiMFtpXSArIGIyW2ldKSA+PiAxOworfQorCitzdGF0aWMgdm9pZCB2ZXJ0aWNhbF9kZWNvbXBvc2U1M2lMMChEV1RFTEVNICpiMCwgRFdURUxFTSAqYjEsIERXVEVMRU0gKmIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIGIxW2ldICs9IChiMFtpXSArIGIyW2ldICsgMikgPj4gMjsKK30KKworc3RhdGljIHZvaWQgc3BhdGlhbF9kZWNvbXBvc2U1M2koRFdURUxFTSAqYnVmZmVyLCBEV1RFTEVNICp0ZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKQoreworICAgIGludCB5OworICAgIERXVEVMRU0gKmIwID0gYnVmZmVyICsgbWlycm9yKC0yIC0gMSwgaGVpZ2h0IC0gMSkgKiBzdHJpZGU7CisgICAgRFdURUxFTSAqYjEgPSBidWZmZXIgKyBtaXJyb3IoLTIsICAgICBoZWlnaHQgLSAxKSAqIHN0cmlkZTsKKworICAgIGZvciAoeSA9IC0yOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgRFdURUxFTSAqYjIgPSBidWZmZXIgKyBtaXJyb3IoeSArIDEsIGhlaWdodCAtIDEpICogc3RyaWRlOworICAgICAgICBEV1RFTEVNICpiMyA9IGJ1ZmZlciArIG1pcnJvcih5ICsgMiwgaGVpZ2h0IC0gMSkgKiBzdHJpZGU7CisKKyAgICAgICAgaWYgKHkgKyAxIDwgKHVuc2lnbmVkKWhlaWdodCkKKyAgICAgICAgICAgIGhvcml6b250YWxfZGVjb21wb3NlNTNpKGIyLCB0ZW1wLCB3aWR0aCk7CisgICAgICAgIGlmICh5ICsgMiA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgICAgICBob3Jpem9udGFsX2RlY29tcG9zZTUzaShiMywgdGVtcCwgd2lkdGgpOworCisgICAgICAgIGlmICh5ICsgMSA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgICAgICB2ZXJ0aWNhbF9kZWNvbXBvc2U1M2lIMChiMSwgYjIsIGIzLCB3aWR0aCk7CisgICAgICAgIGlmICh5ICsgMCA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgICAgICB2ZXJ0aWNhbF9kZWNvbXBvc2U1M2lMMChiMCwgYjEsIGIyLCB3aWR0aCk7CisKKyAgICAgICAgYjAgPSBiMjsKKyAgICAgICAgYjEgPSBiMzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhvcml6b250YWxfZGVjb21wb3NlOTdpKERXVEVMRU0gKmIsIERXVEVMRU0gKnRlbXAsIGludCB3aWR0aCkKK3sKKyAgICBjb25zdCBpbnQgdzIgPSAod2lkdGggKyAxKSA+PiAxOworCisgICAgbGlmdCh0ZW1wICsgdzIsIGIgKyAxLCBiLCAgICAgICAgIDEsIDIsIDIsIHdpZHRoLCBXX0FNLCBXX0FPLCBXX0FTLCAxLCAxKTsKKyAgICBsaWZ0Uyh0ZW1wLCAgICAgYiwgICAgIHRlbXAgKyB3MiwgMSwgMiwgMSwgd2lkdGgsIFdfQk0sIFdfQk8sIFdfQlMsIDAsIDApOworICAgIGxpZnQoYiArIHcyLCB0ZW1wICsgdzIsIHRlbXAsICAgICAxLCAxLCAxLCB3aWR0aCwgV19DTSwgV19DTywgV19DUywgMSwgMCk7CisgICAgbGlmdChiLCAgICAgIHRlbXAsICAgICAgYiArIHcyLCAgIDEsIDEsIDEsIHdpZHRoLCBXX0RNLCBXX0RPLCBXX0RTLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgdmVydGljYWxfZGVjb21wb3NlOTdpSDAoRFdURUxFTSAqYjAsIERXVEVMRU0gKmIxLCBEV1RFTEVNICpiMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorICAgICAgICBiMVtpXSAtPSAoV19BTSAqIChiMFtpXSArIGIyW2ldKSArIFdfQU8pID4+IFdfQVM7Cit9CisKK3N0YXRpYyB2b2lkIHZlcnRpY2FsX2RlY29tcG9zZTk3aUgxKERXVEVMRU0gKmIwLCBEV1RFTEVNICpiMSwgRFdURUxFTSAqYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgYjFbaV0gKz0gKFdfQ00gKiAoYjBbaV0gKyBiMltpXSkgKyBXX0NPKSA+PiBXX0NTOworfQorCitzdGF0aWMgdm9pZCB2ZXJ0aWNhbF9kZWNvbXBvc2U5N2lMMChEV1RFTEVNICpiMCwgRFdURUxFTSAqYjEsIERXVEVMRU0gKmIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIGIxW2ldID0gKDE2ICogNCAqIGIxW2ldIC0gNCAqIChiMFtpXSArIGIyW2ldKSArIFdfQk8gKiA1ICsgKDUgPDwgMjcpKSAvCisgICAgICAgICAgICAgICAgKDUgKiAxNikgLSAoMSA8PCAyMyk7Cit9CisKK3N0YXRpYyB2b2lkIHZlcnRpY2FsX2RlY29tcG9zZTk3aUwxKERXVEVMRU0gKmIwLCBEV1RFTEVNICpiMSwgRFdURUxFTSAqYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgYjFbaV0gKz0gKFdfRE0gKiAoYjBbaV0gKyBiMltpXSkgKyBXX0RPKSA+PiBXX0RTOworfQorCitzdGF0aWMgdm9pZCBzcGF0aWFsX2RlY29tcG9zZTk3aShEV1RFTEVNICpidWZmZXIsIERXVEVMRU0gKnRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpCit7CisgICAgaW50IHk7CisgICAgRFdURUxFTSAqYjAgPSBidWZmZXIgKyBtaXJyb3IoLTQgLSAxLCBoZWlnaHQgLSAxKSAqIHN0cmlkZTsKKyAgICBEV1RFTEVNICpiMSA9IGJ1ZmZlciArIG1pcnJvcigtNCwgICAgIGhlaWdodCAtIDEpICogc3RyaWRlOworICAgIERXVEVMRU0gKmIyID0gYnVmZmVyICsgbWlycm9yKC00ICsgMSwgaGVpZ2h0IC0gMSkgKiBzdHJpZGU7CisgICAgRFdURUxFTSAqYjMgPSBidWZmZXIgKyBtaXJyb3IoLTQgKyAyLCBoZWlnaHQgLSAxKSAqIHN0cmlkZTsKKworICAgIGZvciAoeSA9IC00OyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgRFdURUxFTSAqYjQgPSBidWZmZXIgKyBtaXJyb3IoeSArIDMsIGhlaWdodCAtIDEpICogc3RyaWRlOworICAgICAgICBEV1RFTEVNICpiNSA9IGJ1ZmZlciArIG1pcnJvcih5ICsgNCwgaGVpZ2h0IC0gMSkgKiBzdHJpZGU7CisKKyAgICAgICAgaWYgKHkgKyAzIDwgKHVuc2lnbmVkKWhlaWdodCkKKyAgICAgICAgICAgIGhvcml6b250YWxfZGVjb21wb3NlOTdpKGI0LCB0ZW1wLCB3aWR0aCk7CisgICAgICAgIGlmICh5ICsgNCA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgICAgICBob3Jpem9udGFsX2RlY29tcG9zZTk3aShiNSwgdGVtcCwgd2lkdGgpOworCisgICAgICAgIGlmICh5ICsgMyA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgICAgICB2ZXJ0aWNhbF9kZWNvbXBvc2U5N2lIMChiMywgYjQsIGI1LCB3aWR0aCk7CisgICAgICAgIGlmICh5ICsgMiA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgICAgICB2ZXJ0aWNhbF9kZWNvbXBvc2U5N2lMMChiMiwgYjMsIGI0LCB3aWR0aCk7CisgICAgICAgIGlmICh5ICsgMSA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgICAgICB2ZXJ0aWNhbF9kZWNvbXBvc2U5N2lIMShiMSwgYjIsIGIzLCB3aWR0aCk7CisgICAgICAgIGlmICh5ICsgMCA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgICAgICB2ZXJ0aWNhbF9kZWNvbXBvc2U5N2lMMShiMCwgYjEsIGIyLCB3aWR0aCk7CisKKyAgICAgICAgYjAgPSBiMjsKKyAgICAgICAgYjEgPSBiMzsKKyAgICAgICAgYjIgPSBiNDsKKyAgICAgICAgYjMgPSBiNTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfc3BhdGlhbF9kd3QoRFdURUxFTSAqYnVmZmVyLCBEV1RFTEVNICp0ZW1wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCB0eXBlLCBpbnQgZGVjb21wb3NpdGlvbl9jb3VudCkKK3sKKyAgICBpbnQgbGV2ZWw7CisKKyAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZWNvbXBvc2l0aW9uX2NvdW50OyBsZXZlbCsrKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIERXVF85NzoKKyAgICAgICAgICAgIHNwYXRpYWxfZGVjb21wb3NlOTdpKGJ1ZmZlciwgdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID4+IGxldmVsLCBoZWlnaHQgPj4gbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUgPDwgbGV2ZWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFdUXzUzOgorICAgICAgICAgICAgc3BhdGlhbF9kZWNvbXBvc2U1M2koYnVmZmVyLCB0ZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPj4gbGV2ZWwsIGhlaWdodCA+PiBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSA8PCBsZXZlbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaG9yaXpvbnRhbF9jb21wb3NlNTNpKElEV1RFTEVNICpiLCBJRFdURUxFTSAqdGVtcCwgaW50IHdpZHRoKQoreworICAgIGNvbnN0IGludCB3aWR0aDIgPSB3aWR0aCA+PiAxOworICAgIGNvbnN0IGludCB3MiAgICAgPSAod2lkdGggKyAxKSA+PiAxOworICAgIGludCB4OworCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoMjsgeCsrKSB7CisgICAgICAgIHRlbXBbMiAqIHhdICAgICA9IGJbeF07CisgICAgICAgIHRlbXBbMiAqIHggKyAxXSA9IGJbeCArIHcyXTsKKyAgICB9CisgICAgaWYgKHdpZHRoICYgMSkKKyAgICAgICAgdGVtcFsyICogeF0gPSBiW3hdOworCisgICAgYlswXSA9IHRlbXBbMF0gLSAoKHRlbXBbMV0gKyAxKSA+PiAxKTsKKyAgICBmb3IgKHggPSAyOyB4IDwgd2lkdGggLSAxOyB4ICs9IDIpIHsKKyAgICAgICAgYlt4XSAgICAgPSB0ZW1wW3hdICAgICAtICgodGVtcFt4IC0gMV0gKyB0ZW1wW3ggKyAxXSArIDIpID4+IDIpOworICAgICAgICBiW3ggLSAxXSA9IHRlbXBbeCAtIDFdICsgKChiW3ggLSAyXSAgICArIGJbeF0gICAgICAgICsgMSkgPj4gMSk7CisgICAgfQorICAgIGlmICh3aWR0aCAmIDEpIHsKKyAgICAgICAgYlt4XSAgICAgPSB0ZW1wW3hdICAgICAtICgodGVtcFt4IC0gMV0gICAgICsgMSkgPj4gMSk7CisgICAgICAgIGJbeCAtIDFdID0gdGVtcFt4IC0gMV0gKyAoKGJbeCAtIDJdICsgYlt4XSArIDEpID4+IDEpOworICAgIH0gZWxzZQorICAgICAgICBiW3ggLSAxXSA9IHRlbXBbeCAtIDFdICsgYlt4IC0gMl07Cit9CisKK3N0YXRpYyB2b2lkIHZlcnRpY2FsX2NvbXBvc2U1M2lIMChJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgSURXVEVMRU0gKmIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorICAgICAgICBiMVtpXSArPSAoYjBbaV0gKyBiMltpXSkgPj4gMTsKK30KKworc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZTUzaUwwKElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBJRFdURUxFTSAqYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIGIxW2ldIC09IChiMFtpXSArIGIyW2ldICsgMikgPj4gMjsKK30KKworc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wb3NlNTNpX2J1ZmZlcmVkX2luaXQoRFdUQ29tcG9zZSAqY3MsIHNsaWNlX2J1ZmZlciAqc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlX2xpbmUpCit7CisgICAgY3MtPmIwID0gc2xpY2VfYnVmZmVyX2dldF9saW5lKHNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXJyb3IoLTEgLSAxLCBoZWlnaHQgLSAxKSAqIHN0cmlkZV9saW5lKTsKKyAgICBjcy0+YjEgPSBzbGljZV9idWZmZXJfZ2V0X2xpbmUoc2IsIG1pcnJvcigtMSwgaGVpZ2h0IC0gMSkgKiBzdHJpZGVfbGluZSk7CisgICAgY3MtPnkgID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcG9zZTUzaV9pbml0KERXVENvbXBvc2UgKmNzLCBJRFdURUxFTSAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IHN0cmlkZSkKK3sKKyAgICBjcy0+YjAgPSBidWZmZXIgKyBtaXJyb3IoLTEgLSAxLCBoZWlnaHQgLSAxKSAqIHN0cmlkZTsKKyAgICBjcy0+YjEgPSBidWZmZXIgKyBtaXJyb3IoLTEsICAgICBoZWlnaHQgLSAxKSAqIHN0cmlkZTsKKyAgICBjcy0+eSAgPSAtMTsKK30KKworc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wb3NlNTNpX2R5X2J1ZmZlcmVkKERXVENvbXBvc2UgKmNzLCBzbGljZV9idWZmZXIgKnNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEV1RFTEVNICp0ZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlX2xpbmUpCit7CisgICAgaW50IHkgPSBjcy0+eTsKKworICAgIElEV1RFTEVNICpiMCA9IGNzLT5iMDsKKyAgICBJRFdURUxFTSAqYjEgPSBjcy0+YjE7CisgICAgSURXVEVMRU0gKmIyID0gc2xpY2VfYnVmZmVyX2dldF9saW5lKHNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXJyb3IoeSArIDEsIGhlaWdodCAtIDEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlX2xpbmUpOworICAgIElEV1RFTEVNICpiMyA9IHNsaWNlX2J1ZmZlcl9nZXRfbGluZShzYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlycm9yKHkgKyAyLCBoZWlnaHQgLSAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZV9saW5lKTsKKworICAgIGlmICh5ICsgMSA8ICh1bnNpZ25lZCloZWlnaHQgJiYgeSA8ICh1bnNpZ25lZCloZWlnaHQpIHsKKyAgICAgICAgaW50IHg7CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGIyW3hdIC09IChiMVt4XSArIGIzW3hdICsgMikgPj4gMjsKKyAgICAgICAgICAgIGIxW3hdICs9IChiMFt4XSArIGIyW3hdKSAgICAgPj4gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh5ICsgMSA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgICAgICB2ZXJ0aWNhbF9jb21wb3NlNTNpTDAoYjEsIGIyLCBiMywgd2lkdGgpOworICAgICAgICBpZiAoeSArIDAgPCAodW5zaWduZWQpaGVpZ2h0KQorICAgICAgICAgICAgdmVydGljYWxfY29tcG9zZTUzaUgwKGIwLCBiMSwgYjIsIHdpZHRoKTsKKyAgICB9CisKKyAgICBpZiAoeSAtIDEgPCAodW5zaWduZWQpaGVpZ2h0KQorICAgICAgICBob3Jpem9udGFsX2NvbXBvc2U1M2koYjAsIHRlbXAsIHdpZHRoKTsKKyAgICBpZiAoeSArIDAgPCAodW5zaWduZWQpaGVpZ2h0KQorICAgICAgICBob3Jpem9udGFsX2NvbXBvc2U1M2koYjEsIHRlbXAsIHdpZHRoKTsKKworICAgIGNzLT5iMCAgPSBiMjsKKyAgICBjcy0+YjEgID0gYjM7CisgICAgY3MtPnkgICs9IDI7Cit9CisKK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcG9zZTUzaV9keShEV1RDb21wb3NlICpjcywgSURXVEVMRU0gKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRFdURUxFTSAqdGVtcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCit7CisgICAgaW50IHkgICAgICAgID0gY3MtPnk7CisgICAgSURXVEVMRU0gKmIwID0gY3MtPmIwOworICAgIElEV1RFTEVNICpiMSA9IGNzLT5iMTsKKyAgICBJRFdURUxFTSAqYjIgPSBidWZmZXIgKyBtaXJyb3IoeSArIDEsIGhlaWdodCAtIDEpICogc3RyaWRlOworICAgIElEV1RFTEVNICpiMyA9IGJ1ZmZlciArIG1pcnJvcih5ICsgMiwgaGVpZ2h0IC0gMSkgKiBzdHJpZGU7CisKKyAgICBpZiAoeSArIDEgPCAodW5zaWduZWQpaGVpZ2h0KQorICAgICAgICB2ZXJ0aWNhbF9jb21wb3NlNTNpTDAoYjEsIGIyLCBiMywgd2lkdGgpOworICAgIGlmICh5ICsgMCA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgIHZlcnRpY2FsX2NvbXBvc2U1M2lIMChiMCwgYjEsIGIyLCB3aWR0aCk7CisKKyAgICBpZiAoeSAtIDEgPCAodW5zaWduZWQpaGVpZ2h0KQorICAgICAgICBob3Jpem9udGFsX2NvbXBvc2U1M2koYjAsIHRlbXAsIHdpZHRoKTsKKyAgICBpZiAoeSArIDAgPCAodW5zaWduZWQpaGVpZ2h0KQorICAgICAgICBob3Jpem9udGFsX2NvbXBvc2U1M2koYjEsIHRlbXAsIHdpZHRoKTsKKworICAgIGNzLT5iMCAgPSBiMjsKKyAgICBjcy0+YjEgID0gYjM7CisgICAgY3MtPnkgICs9IDI7Cit9CisKK3ZvaWQgZmZfc25vd19ob3Jpem9udGFsX2NvbXBvc2U5N2koSURXVEVMRU0gKmIsIElEV1RFTEVNICp0ZW1wLCBpbnQgd2lkdGgpCit7CisgICAgY29uc3QgaW50IHcyID0gKHdpZHRoICsgMSkgPj4gMTsKKyAgICBpbnQgeDsKKworICAgIHRlbXBbMF0gPSBiWzBdIC0gKCgzICogYlt3Ml0gKyAyKSA+PiAyKTsKKyAgICBmb3IgKHggPSAxOyB4IDwgKHdpZHRoID4+IDEpOyB4KyspIHsKKyAgICAgICAgdGVtcFsyICogeF0gICAgID0gYlt4XSAtICgoMyAqIChiW3ggKyB3MiAtIDFdICsgYlt4ICsgdzJdKSArIDQpID4+IDMpOworICAgICAgICB0ZW1wWzIgKiB4IC0gMV0gPSBiW3ggKyB3MiAtIDFdIC0gdGVtcFsyICogeCAtIDJdIC0gdGVtcFsyICogeF07CisgICAgfQorICAgIGlmICh3aWR0aCAmIDEpIHsKKyAgICAgICAgdGVtcFsyICogeF0gICAgID0gYlt4XSAtICgoMyAqIGJbeCArIHcyIC0gMV0gKyAyKSA+PiAyKTsKKyAgICAgICAgdGVtcFsyICogeCAtIDFdID0gYlt4ICsgdzIgLSAxXSAtIHRlbXBbMiAqIHggLSAyXSAtIHRlbXBbMiAqIHhdOworICAgIH0gZWxzZQorICAgICAgICB0ZW1wWzIgKiB4IC0gMV0gPSBiW3ggKyB3MiAtIDFdIC0gMiAqIHRlbXBbMiAqIHggLSAyXTsKKworICAgIGJbMF0gPSB0ZW1wWzBdICsgKCgyICogdGVtcFswXSArIHRlbXBbMV0gKyA0KSA+PiAzKTsKKyAgICBmb3IgKHggPSAyOyB4IDwgd2lkdGggLSAxOyB4ICs9IDIpIHsKKyAgICAgICAgYlt4XSAgICAgPSB0ZW1wW3hdICsgKCg0ICogdGVtcFt4XSArIHRlbXBbeCAtIDFdICsgdGVtcFt4ICsgMV0gKyA4KSA+PiA0KTsKKyAgICAgICAgYlt4IC0gMV0gPSB0ZW1wW3ggLSAxXSArICgoMyAqIChiW3ggLSAyXSArIGJbeF0pKSA+PiAxKTsKKyAgICB9CisgICAgaWYgKHdpZHRoICYgMSkgeworICAgICAgICBiW3hdICAgICA9IHRlbXBbeF0gKyAoKDIgKiB0ZW1wW3hdICsgdGVtcFt4IC0gMV0gKyA0KSA+PiAzKTsKKyAgICAgICAgYlt4IC0gMV0gPSB0ZW1wW3ggLSAxXSArICgoMyAqIChiW3ggLSAyXSArIGJbeF0pKSA+PiAxKTsKKyAgICB9IGVsc2UKKyAgICAgICAgYlt4IC0gMV0gPSB0ZW1wW3ggLSAxXSArIDMgKiBiW3ggLSAyXTsKK30KKworc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZTk3aUgwKElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBJRFdURUxFTSAqYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIGIxW2ldICs9IChXX0FNICogKGIwW2ldICsgYjJbaV0pICsgV19BTykgPj4gV19BUzsKK30KKworc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZTk3aUgxKElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBJRFdURUxFTSAqYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIGIxW2ldIC09IChXX0NNICogKGIwW2ldICsgYjJbaV0pICsgV19DTykgPj4gV19DUzsKK30KKworc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZTk3aUwwKElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBJRFdURUxFTSAqYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIGIxW2ldICs9IChXX0JNICogKGIwW2ldICsgYjJbaV0pICsgNCAqIGIxW2ldICsgV19CTykgPj4gV19CUzsKK30KKworc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZTk3aUwxKElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBJRFdURUxFTSAqYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIGIxW2ldIC09IChXX0RNICogKGIwW2ldICsgYjJbaV0pICsgV19ETykgPj4gV19EUzsKK30KKwordm9pZCBmZl9zbm93X3ZlcnRpY2FsX2NvbXBvc2U5N2koSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEV1RFTEVNICpiMywgSURXVEVMRU0gKmI0LCBJRFdURUxFTSAqYjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBiNFtpXSAtPSAoV19ETSAqIChiM1tpXSArIGI1W2ldKSArIFdfRE8pID4+IFdfRFM7CisgICAgICAgIGIzW2ldIC09IChXX0NNICogKGIyW2ldICsgYjRbaV0pICsgV19DTykgPj4gV19DUzsKKyAgICAgICAgYjJbaV0gKz0gKFdfQk0gKiAoYjFbaV0gKyBiM1tpXSkgKyA0ICogYjJbaV0gKyBXX0JPKSA+PiBXX0JTOworICAgICAgICBiMVtpXSArPSAoV19BTSAqIChiMFtpXSArIGIyW2ldKSArIFdfQU8pID4+IFdfQVM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBvc2U5N2lfYnVmZmVyZWRfaW5pdChEV1RDb21wb3NlICpjcywgc2xpY2VfYnVmZmVyICpzYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBzdHJpZGVfbGluZSkKK3sKKyAgICBjcy0+YjAgPSBzbGljZV9idWZmZXJfZ2V0X2xpbmUoc2IsIG1pcnJvcigtMyAtIDEsIGhlaWdodCAtIDEpICogc3RyaWRlX2xpbmUpOworICAgIGNzLT5iMSA9IHNsaWNlX2J1ZmZlcl9nZXRfbGluZShzYiwgbWlycm9yKC0zLCAgICAgaGVpZ2h0IC0gMSkgKiBzdHJpZGVfbGluZSk7CisgICAgY3MtPmIyID0gc2xpY2VfYnVmZmVyX2dldF9saW5lKHNiLCBtaXJyb3IoLTMgKyAxLCBoZWlnaHQgLSAxKSAqIHN0cmlkZV9saW5lKTsKKyAgICBjcy0+YjMgPSBzbGljZV9idWZmZXJfZ2V0X2xpbmUoc2IsIG1pcnJvcigtMyArIDIsIGhlaWdodCAtIDEpICogc3RyaWRlX2xpbmUpOworICAgIGNzLT55ICA9IC0zOworfQorCitzdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBvc2U5N2lfaW5pdChEV1RDb21wb3NlICpjcywgSURXVEVMRU0gKmJ1ZmZlciwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCit7CisgICAgY3MtPmIwID0gYnVmZmVyICsgbWlycm9yKC0zIC0gMSwgaGVpZ2h0IC0gMSkgKiBzdHJpZGU7CisgICAgY3MtPmIxID0gYnVmZmVyICsgbWlycm9yKC0zLCAgICAgaGVpZ2h0IC0gMSkgKiBzdHJpZGU7CisgICAgY3MtPmIyID0gYnVmZmVyICsgbWlycm9yKC0zICsgMSwgaGVpZ2h0IC0gMSkgKiBzdHJpZGU7CisgICAgY3MtPmIzID0gYnVmZmVyICsgbWlycm9yKC0zICsgMiwgaGVpZ2h0IC0gMSkgKiBzdHJpZGU7CisgICAgY3MtPnkgID0gLTM7Cit9CisKK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcG9zZTk3aV9keV9idWZmZXJlZChTbm93RFdUQ29udGV4dCAqZHNwLCBEV1RDb21wb3NlICpjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZV9idWZmZXIgKiBzYiwgSURXVEVMRU0gKnRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGVfbGluZSkKK3sKKyAgICBpbnQgeSA9IGNzLT55OworCisgICAgSURXVEVMRU0gKmIwID0gY3MtPmIwOworICAgIElEV1RFTEVNICpiMSA9IGNzLT5iMTsKKyAgICBJRFdURUxFTSAqYjIgPSBjcy0+YjI7CisgICAgSURXVEVMRU0gKmIzID0gY3MtPmIzOworICAgIElEV1RFTEVNICpiNCA9IHNsaWNlX2J1ZmZlcl9nZXRfbGluZShzYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlycm9yKHkgKyAzLCBoZWlnaHQgLSAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZV9saW5lKTsKKyAgICBJRFdURUxFTSAqYjUgPSBzbGljZV9idWZmZXJfZ2V0X2xpbmUoc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcnJvcih5ICsgNCwgaGVpZ2h0IC0gMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGVfbGluZSk7CisKKyAgICBpZiAoeSA+IDAgJiYgeSArIDQgPCBoZWlnaHQpIHsKKyAgICAgICAgZHNwLT52ZXJ0aWNhbF9jb21wb3NlOTdpKGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIHdpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoeSArIDMgPCAodW5zaWduZWQpaGVpZ2h0KQorICAgICAgICAgICAgdmVydGljYWxfY29tcG9zZTk3aUwxKGIzLCBiNCwgYjUsIHdpZHRoKTsKKyAgICAgICAgaWYgKHkgKyAyIDwgKHVuc2lnbmVkKWhlaWdodCkKKyAgICAgICAgICAgIHZlcnRpY2FsX2NvbXBvc2U5N2lIMShiMiwgYjMsIGI0LCB3aWR0aCk7CisgICAgICAgIGlmICh5ICsgMSA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgICAgICB2ZXJ0aWNhbF9jb21wb3NlOTdpTDAoYjEsIGIyLCBiMywgd2lkdGgpOworICAgICAgICBpZiAoeSArIDAgPCAodW5zaWduZWQpaGVpZ2h0KQorICAgICAgICAgICAgdmVydGljYWxfY29tcG9zZTk3aUgwKGIwLCBiMSwgYjIsIHdpZHRoKTsKKyAgICB9CisKKyAgICBpZiAoeSAtIDEgPCAodW5zaWduZWQpaGVpZ2h0KQorICAgICAgICBkc3AtPmhvcml6b250YWxfY29tcG9zZTk3aShiMCwgdGVtcCwgd2lkdGgpOworICAgIGlmICh5ICsgMCA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgIGRzcC0+aG9yaXpvbnRhbF9jb21wb3NlOTdpKGIxLCB0ZW1wLCB3aWR0aCk7CisKKyAgICBjcy0+YjAgID0gYjI7CisgICAgY3MtPmIxICA9IGIzOworICAgIGNzLT5iMiAgPSBiNDsKKyAgICBjcy0+YjMgID0gYjU7CisgICAgY3MtPnkgICs9IDI7Cit9CisKK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcG9zZTk3aV9keShEV1RDb21wb3NlICpjcywgSURXVEVMRU0gKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRFdURUxFTSAqdGVtcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCit7CisgICAgaW50IHkgICAgICAgID0gY3MtPnk7CisgICAgSURXVEVMRU0gKmIwID0gY3MtPmIwOworICAgIElEV1RFTEVNICpiMSA9IGNzLT5iMTsKKyAgICBJRFdURUxFTSAqYjIgPSBjcy0+YjI7CisgICAgSURXVEVMRU0gKmIzID0gY3MtPmIzOworICAgIElEV1RFTEVNICpiNCA9IGJ1ZmZlciArIG1pcnJvcih5ICsgMywgaGVpZ2h0IC0gMSkgKiBzdHJpZGU7CisgICAgSURXVEVMRU0gKmI1ID0gYnVmZmVyICsgbWlycm9yKHkgKyA0LCBoZWlnaHQgLSAxKSAqIHN0cmlkZTsKKworICAgIGlmICh5ICsgMyA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgIHZlcnRpY2FsX2NvbXBvc2U5N2lMMShiMywgYjQsIGI1LCB3aWR0aCk7CisgICAgaWYgKHkgKyAyIDwgKHVuc2lnbmVkKWhlaWdodCkKKyAgICAgICAgdmVydGljYWxfY29tcG9zZTk3aUgxKGIyLCBiMywgYjQsIHdpZHRoKTsKKyAgICBpZiAoeSArIDEgPCAodW5zaWduZWQpaGVpZ2h0KQorICAgICAgICB2ZXJ0aWNhbF9jb21wb3NlOTdpTDAoYjEsIGIyLCBiMywgd2lkdGgpOworICAgIGlmICh5ICsgMCA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgIHZlcnRpY2FsX2NvbXBvc2U5N2lIMChiMCwgYjEsIGIyLCB3aWR0aCk7CisKKyAgICBpZiAoeSAtIDEgPCAodW5zaWduZWQpaGVpZ2h0KQorICAgICAgICBmZl9zbm93X2hvcml6b250YWxfY29tcG9zZTk3aShiMCwgdGVtcCwgd2lkdGgpOworICAgIGlmICh5ICsgMCA8ICh1bnNpZ25lZCloZWlnaHQpCisgICAgICAgIGZmX3Nub3dfaG9yaXpvbnRhbF9jb21wb3NlOTdpKGIxLCB0ZW1wLCB3aWR0aCk7CisKKyAgICBjcy0+YjAgID0gYjI7CisgICAgY3MtPmIxICA9IGIzOworICAgIGNzLT5iMiAgPSBiNDsKKyAgICBjcy0+YjMgID0gYjU7CisgICAgY3MtPnkgICs9IDI7Cit9CisKK3ZvaWQgZmZfc3BhdGlhbF9pZHd0X2J1ZmZlcmVkX2luaXQoRFdUQ29tcG9zZSAqY3MsIHNsaWNlX2J1ZmZlciAqc2IsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IHN0cmlkZV9saW5lLCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY29tcG9zaXRpb25fY291bnQpCit7CisgICAgaW50IGxldmVsOworICAgIGZvciAobGV2ZWwgPSBkZWNvbXBvc2l0aW9uX2NvdW50IC0gMTsgbGV2ZWwgPj0gMDsgbGV2ZWwtLSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBEV1RfOTc6CisgICAgICAgICAgICBzcGF0aWFsX2NvbXBvc2U5N2lfYnVmZmVyZWRfaW5pdChjcyArIGxldmVsLCBzYiwgaGVpZ2h0ID4+IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlX2xpbmUgPDwgbGV2ZWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFdUXzUzOgorICAgICAgICAgICAgc3BhdGlhbF9jb21wb3NlNTNpX2J1ZmZlcmVkX2luaXQoY3MgKyBsZXZlbCwgc2IsIGhlaWdodCA+PiBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZV9saW5lIDw8IGxldmVsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZmX3NwYXRpYWxfaWR3dF9idWZmZXJlZF9zbGljZShTbm93RFdUQ29udGV4dCAqZHNwLCBEV1RDb21wb3NlICpjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlX2J1ZmZlciAqc2xpY2VfYnVmLCBJRFdURUxFTSAqdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZV9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGludCBkZWNvbXBvc2l0aW9uX2NvdW50LCBpbnQgeSkKK3sKKyAgICBjb25zdCBpbnQgc3VwcG9ydCA9IHR5cGUgPT0gMSA/IDMgOiA1OworICAgIGludCBsZXZlbDsKKyAgICBpZiAodHlwZSA9PSAyKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGxldmVsID0gZGVjb21wb3NpdGlvbl9jb3VudCAtIDE7IGxldmVsID49IDA7IGxldmVsLS0pCisgICAgICAgIHdoaWxlIChjc1tsZXZlbF0ueSA8PSBGRk1JTigoeSA+PiBsZXZlbCkgKyBzdXBwb3J0LCBoZWlnaHQgPj4gbGV2ZWwpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRFdUXzk3OgorICAgICAgICAgICAgICAgIHNwYXRpYWxfY29tcG9zZTk3aV9keV9idWZmZXJlZChkc3AsIGNzICsgbGV2ZWwsIHNsaWNlX2J1ZiwgdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPj4gbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA+PiBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlX2xpbmUgPDwgbGV2ZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEV1RfNTM6CisgICAgICAgICAgICAgICAgc3BhdGlhbF9jb21wb3NlNTNpX2R5X2J1ZmZlcmVkKGNzICsgbGV2ZWwsIHNsaWNlX2J1ZiwgdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPj4gbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA+PiBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlX2xpbmUgPDwgbGV2ZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZmX3NwYXRpYWxfaWR3dF9pbml0KERXVENvbXBvc2UgKmNzLCBJRFdURUxFTSAqYnVmZmVyLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNvbXBvc2l0aW9uX2NvdW50KQoreworICAgIGludCBsZXZlbDsKKyAgICBmb3IgKGxldmVsID0gZGVjb21wb3NpdGlvbl9jb3VudCAtIDE7IGxldmVsID49IDA7IGxldmVsLS0pIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgRFdUXzk3OgorICAgICAgICAgICAgc3BhdGlhbF9jb21wb3NlOTdpX2luaXQoY3MgKyBsZXZlbCwgYnVmZmVyLCBoZWlnaHQgPj4gbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUgPDwgbGV2ZWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFdUXzUzOgorICAgICAgICAgICAgc3BhdGlhbF9jb21wb3NlNTNpX2luaXQoY3MgKyBsZXZlbCwgYnVmZmVyLCBoZWlnaHQgPj4gbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUgPDwgbGV2ZWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZmX3NwYXRpYWxfaWR3dF9zbGljZShEV1RDb21wb3NlICpjcywgSURXVEVMRU0gKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRFdURUxFTSAqdGVtcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNvbXBvc2l0aW9uX2NvdW50LCBpbnQgeSkKK3sKKyAgICBjb25zdCBpbnQgc3VwcG9ydCA9IHR5cGUgPT0gMSA/IDMgOiA1OworICAgIGludCBsZXZlbDsKKyAgICBpZiAodHlwZSA9PSAyKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGxldmVsID0gZGVjb21wb3NpdGlvbl9jb3VudCAtIDE7IGxldmVsID49IDA7IGxldmVsLS0pCisgICAgICAgIHdoaWxlIChjc1tsZXZlbF0ueSA8PSBGRk1JTigoeSA+PiBsZXZlbCkgKyBzdXBwb3J0LCBoZWlnaHQgPj4gbGV2ZWwpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRFdUXzk3OgorICAgICAgICAgICAgICAgIHNwYXRpYWxfY29tcG9zZTk3aV9keShjcyArIGxldmVsLCBidWZmZXIsIHRlbXAsIHdpZHRoID4+IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPj4gbGV2ZWwsIHN0cmlkZSA8PCBsZXZlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERXVF81MzoKKyAgICAgICAgICAgICAgICBzcGF0aWFsX2NvbXBvc2U1M2lfZHkoY3MgKyBsZXZlbCwgYnVmZmVyLCB0ZW1wLCB3aWR0aCA+PiBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID4+IGxldmVsLCBzdHJpZGUgPDwgbGV2ZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3ZvaWQgZmZfc3BhdGlhbF9pZHd0KElEV1RFTEVNICpidWZmZXIsIElEV1RFTEVNICp0ZW1wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgdHlwZSwgaW50IGRlY29tcG9zaXRpb25fY291bnQpCit7CisgICAgRFdUQ29tcG9zZSBjc1tNQVhfREVDT01QT1NJVElPTlNdOworICAgIGludCB5OworICAgIGZmX3NwYXRpYWxfaWR3dF9pbml0KGNzLCBidWZmZXIsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2l0aW9uX2NvdW50KTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDQpCisgICAgICAgIGZmX3NwYXRpYWxfaWR3dF9zbGljZShjcywgYnVmZmVyLCB0ZW1wLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2l0aW9uX2NvdW50LCB5KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd19jKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwgcHRyZGlmZl90IGxpbmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCB0eXBlKQoreworICAgIGludCBzLCBpLCBqOworICAgIGNvbnN0IGludCBkZWNfY291bnQgPSB3ID09IDggPyAzIDogNDsKKyAgICBpbnQgdG1wWzMyICogMzJdLCB0bXAyWzMyXTsKKyAgICBpbnQgbGV2ZWwsIG9yaTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHNjYWxlWzJdWzJdWzRdWzRdID0geworICAgICAgICB7CisgICAgICAgICAgICB7IC8vIDkvNyA4eDggZGVjPTMKKyAgICAgICAgICAgICAgICB7IDI2OCwgMjM5LCAyMzksIDIxMyB9LAorICAgICAgICAgICAgICAgIHsgMCwgICAyMjQsIDIyNCwgMTUyIH0sCisgICAgICAgICAgICAgICAgeyAwLCAgIDEzNSwgMTM1LCAxMTAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7IC8vIDkvNyAxNngxNiBvciAzMngzMiBkZWM9NAorICAgICAgICAgICAgICAgIHsgMzQ0LCAzMTAsIDMxMCwgMjgwIH0sCisgICAgICAgICAgICAgICAgeyAwLCAgIDMyMCwgMzIwLCAyMjggfSwKKyAgICAgICAgICAgICAgICB7IDAsICAgMTc1LCAxNzUsIDEzNiB9LAorICAgICAgICAgICAgICAgIHsgMCwgICAxMjksIDEyOSwgMTAyIH0sCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgLy8gNS8zIDh4OCBkZWM9MworICAgICAgICAgICAgICAgIHsgMjc1LCAyNDUsIDI0NSwgMjE4IH0sCisgICAgICAgICAgICAgICAgeyAwLCAgIDIzMCwgMjMwLCAxNTYgfSwKKyAgICAgICAgICAgICAgICB7IDAsICAgMTM4LCAxMzgsIDExMyB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsgLy8gNS8zIDE2eDE2IG9yIDMyeDMyIGRlYz00CisgICAgICAgICAgICAgICAgeyAzNTIsIDMxNywgMzE3LCAyODYgfSwKKyAgICAgICAgICAgICAgICB7IDAsICAgMzI4LCAzMjgsIDIzMyB9LAorICAgICAgICAgICAgICAgIHsgMCwgICAxODAsIDE4MCwgMTQwIH0sCisgICAgICAgICAgICAgICAgeyAwLCAgIDEzMiwgMTMyLCAxMDUgfSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgICAgIHRtcFszMiAqIGkgKyBqICsgMF0gPSAocGl4MVtqICsgMF0gLSBwaXgyW2ogKyAwXSkgPDwgNDsKKyAgICAgICAgICAgIHRtcFszMiAqIGkgKyBqICsgMV0gPSAocGl4MVtqICsgMV0gLSBwaXgyW2ogKyAxXSkgPDwgNDsKKyAgICAgICAgICAgIHRtcFszMiAqIGkgKyBqICsgMl0gPSAocGl4MVtqICsgMl0gLSBwaXgyW2ogKyAyXSkgPDwgNDsKKyAgICAgICAgICAgIHRtcFszMiAqIGkgKyBqICsgM10gPSAocGl4MVtqICsgM10gLSBwaXgyW2ogKyAzXSkgPDwgNDsKKyAgICAgICAgfQorICAgICAgICBwaXgxICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgcGl4MiArPSBsaW5lX3NpemU7CisgICAgfQorCisgICAgZmZfc3BhdGlhbF9kd3QodG1wLCB0bXAyLCB3LCBoLCAzMiwgdHlwZSwgZGVjX2NvdW50KTsKKworICAgIHMgPSAwOworICAgIGF2X2Fzc2VydDEodyA9PSBoKTsKKyAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZWNfY291bnQ7IGxldmVsKyspCisgICAgICAgIGZvciAob3JpID0gbGV2ZWwgPyAxIDogMDsgb3JpIDwgNDsgb3JpKyspIHsKKyAgICAgICAgICAgIGludCBzaXplICAgPSB3ID4+IChkZWNfY291bnQgLSBsZXZlbCk7CisgICAgICAgICAgICBpbnQgc3ggICAgID0gKG9yaSAmIDEpID8gc2l6ZSA6IDA7CisgICAgICAgICAgICBpbnQgc3RyaWRlID0gMzIgPDwgKGRlY19jb3VudCAtIGxldmVsKTsKKyAgICAgICAgICAgIGludCBzeSAgICAgPSAob3JpICYgMikgPyBzdHJpZGUgPj4gMSA6IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IHRtcFtzeCArIHN5ICsgaSAqIHN0cmlkZSArIGpdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVt0eXBlXVtkZWNfY291bnQgLSAzXVtsZXZlbF1bb3JpXTsKKyAgICAgICAgICAgICAgICAgICAgcyArPSBGRkFCUyh2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBhdl9hc3NlcnQxKHMgPj0gMCk7CisgICAgcmV0dXJuIHMgPj4gOTsKK30KKworc3RhdGljIGludCB3NTNfOF9jKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgcmV0dXJuIHdfYyh2LCBwaXgxLCBwaXgyLCBsaW5lX3NpemUsIDgsIGgsIDEpOworfQorCitzdGF0aWMgaW50IHc5N184X2Moc3RydWN0IE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICByZXR1cm4gd19jKHYsIHBpeDEsIHBpeDIsIGxpbmVfc2l6ZSwgOCwgaCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdzUzXzE2X2Moc3RydWN0IE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICByZXR1cm4gd19jKHYsIHBpeDEsIHBpeDIsIGxpbmVfc2l6ZSwgMTYsIGgsIDEpOworfQorCitzdGF0aWMgaW50IHc5N18xNl9jKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgcmV0dXJuIHdfYyh2LCBwaXgxLCBwaXgyLCBsaW5lX3NpemUsIDE2LCBoLCAwKTsKK30KKworaW50IGZmX3c1M18zMl9jKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgcmV0dXJuIHdfYyh2LCBwaXgxLCBwaXgyLCBsaW5lX3NpemUsIDMyLCBoLCAxKTsKK30KKworaW50IGZmX3c5N18zMl9jKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgcmV0dXJuIHdfYyh2LCBwaXgxLCBwaXgyLCBsaW5lX3NpemUsIDMyLCBoLCAwKTsKK30KKwordm9pZCBmZl9kc3B1dGlsX2luaXRfZHd0KE1FQ21wQ29udGV4dCAqYykKK3sKKyAgICBjLT53NTNbMF0gPSB3NTNfMTZfYzsKKyAgICBjLT53NTNbMV0gPSB3NTNfOF9jOworICAgIGMtPnc5N1swXSA9IHc5N18xNl9jOworICAgIGMtPnc5N1sxXSA9IHc5N184X2M7Cit9CisKK3ZvaWQgZmZfZHd0X2luaXQoU25vd0RXVENvbnRleHQgKmMpCit7CisgICAgYy0+dmVydGljYWxfY29tcG9zZTk3aSAgID0gZmZfc25vd192ZXJ0aWNhbF9jb21wb3NlOTdpOworICAgIGMtPmhvcml6b250YWxfY29tcG9zZTk3aSA9IGZmX3Nub3dfaG9yaXpvbnRhbF9jb21wb3NlOTdpOworICAgIGMtPmlubmVyX2FkZF95YmxvY2sgICAgICA9IGZmX3Nub3dfaW5uZXJfYWRkX3libG9jazsKKworICAgIGlmIChIQVZFX01NWCkKKyAgICAgICAgZmZfZHd0X2luaXRfeDg2KGMpOworfQorCisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Nub3dfZHd0LmggYi9mZm1wZWcvbGliYXZjb2RlYy9zbm93X2R3dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDc1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zbm93X2R3dC5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NOT1dfRFdUX0gKKyNkZWZpbmUgQVZDT0RFQ19TTk9XX0RXVF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBpbnQgRFdURUxFTTsKK3R5cGVkZWYgc2hvcnQgSURXVEVMRU07CisKKyNkZWZpbmUgTUFYX0RFQ09NUE9TSVRJT05TIDgKKwordHlwZWRlZiBzdHJ1Y3QgRFdUQ29tcG9zZSB7CisgICAgSURXVEVMRU0gKmIwOworICAgIElEV1RFTEVNICpiMTsKKyAgICBJRFdURUxFTSAqYjI7CisgICAgSURXVEVMRU0gKmIzOworICAgIGludCB5OworfSBEV1RDb21wb3NlOworCisvKiogVXNlZCB0byBtaW5pbWl6ZSB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGluIG9yZGVyIHRvCisgKiAgb3B0aW1pemUgY2FjaGUgcGVyZm9ybWFuY2UuICoqLwordHlwZWRlZiBzdHJ1Y3Qgc2xpY2VfYnVmZmVyX3MgeworICAgIElEV1RFTEVNICoqbGluZTsgICAvLy88IEZvciB1c2UgYnkgaWR3dCBhbmQgcHJlZGljdF9zbGljZXMuCisgICAgSURXVEVMRU0gKipkYXRhX3N0YWNrOyAgIC8vLzwgVXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMuCisgICAgaW50IGRhdGFfc3RhY2tfdG9wOworICAgIGludCBsaW5lX2NvdW50OworICAgIGludCBsaW5lX3dpZHRoOworICAgIGludCBkYXRhX2NvdW50OworICAgIElEV1RFTEVNICpiYXNlX2J1ZmZlcjsgIC8vLzwgQnVmZmVyIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMgY2FjaGluZy4KK30gc2xpY2VfYnVmZmVyOworCitzdHJ1Y3QgU25vd0RXVENvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFNub3dEV1RDb250ZXh0IHsKKyAgICB2b2lkICgqdmVydGljYWxfY29tcG9zZTk3aSkoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURXVEVMRU0gKmIzLCBJRFdURUxFTSAqYjQsIElEV1RFTEVNICpiNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKTsKKyAgICB2b2lkICgqaG9yaXpvbnRhbF9jb21wb3NlOTdpKShJRFdURUxFTSAqYiwgSURXVEVMRU0gKnRlbXAsIGludCB3aWR0aCk7CisgICAgdm9pZCAoKmlubmVyX2FkZF95YmxvY2spKGNvbnN0IHVpbnQ4X3QgKm9ibWMsIGNvbnN0IGludCBvYm1jX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKmJsb2NrLCBpbnQgYl93LCBpbnQgYl9oLCBpbnQgc3JjX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfeSwgaW50IHNyY19zdHJpZGUsIHNsaWNlX2J1ZmZlciAqc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGQsIHVpbnQ4X3QgKmRzdDgpOworfSBTbm93RFdUQ29udGV4dDsKKworCisjZGVmaW5lIERXVF85NyAwCisjZGVmaW5lIERXVF81MyAxCisKKyNkZWZpbmUgbGlmdFMgbGlmdAorI2RlZmluZSBXX0FNIDMKKyNkZWZpbmUgV19BTyAwCisjZGVmaW5lIFdfQVMgMQorCisjdW5kZWYgbGlmdFMKKyNkZWZpbmUgV19CTSAxCisjZGVmaW5lIFdfQk8gOAorI2RlZmluZSBXX0JTIDQKKworI2RlZmluZSBXX0NNIDEKKyNkZWZpbmUgV19DTyAwCisjZGVmaW5lIFdfQ1MgMAorCisjZGVmaW5lIFdfRE0gMworI2RlZmluZSBXX0RPIDQKKyNkZWZpbmUgV19EUyAzCisKKyNkZWZpbmUgc2xpY2VfYnVmZmVyX2dldF9saW5lKHNsaWNlX2J1ZiwgbGluZV9udW0pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChzbGljZV9idWYpLT5saW5lW2xpbmVfbnVtXSA/IChzbGljZV9idWYpLT5saW5lW2xpbmVfbnVtXSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmZl9zbGljZV9idWZmZXJfbG9hZF9saW5lKChzbGljZV9idWYpLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGluZV9udW0pKSkKKworaW50IGZmX3NsaWNlX2J1ZmZlcl9pbml0KHNsaWNlX2J1ZmZlciAqYnVmLCBpbnQgbGluZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2FsbG9jYXRlZF9saW5lcywgaW50IGxpbmVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgSURXVEVMRU0gKmJhc2VfYnVmZmVyKTsKK3ZvaWQgZmZfc2xpY2VfYnVmZmVyX3JlbGVhc2Uoc2xpY2VfYnVmZmVyICpidWYsIGludCBsaW5lKTsKK3ZvaWQgZmZfc2xpY2VfYnVmZmVyX2ZsdXNoKHNsaWNlX2J1ZmZlciAqYnVmKTsKK3ZvaWQgZmZfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koc2xpY2VfYnVmZmVyICpidWYpOworSURXVEVMRU0gKmZmX3NsaWNlX2J1ZmZlcl9sb2FkX2xpbmUoc2xpY2VfYnVmZmVyICpidWYsIGludCBsaW5lKTsKKwordm9pZCBmZl9zbm93X3ZlcnRpY2FsX2NvbXBvc2U5N2koSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEV1RFTEVNICpiMywgSURXVEVMRU0gKmI0LCBJRFdURUxFTSAqYjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOwordm9pZCBmZl9zbm93X2hvcml6b250YWxfY29tcG9zZTk3aShJRFdURUxFTSAqYiwgSURXVEVMRU0gKnRlbXAsIGludCB3aWR0aCk7Cit2b2lkIGZmX3Nub3dfaW5uZXJfYWRkX3libG9jayhjb25zdCB1aW50OF90ICpvYm1jLCBjb25zdCBpbnQgb2JtY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqYmxvY2ssIGludCBiX3csIGludCBiX2gsIGludCBzcmNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfeSwgaW50IHNyY19zdHJpZGUsIHNsaWNlX2J1ZmZlciAqc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkLCB1aW50OF90ICpkc3Q4KTsKKworaW50IGZmX3c1M18zMl9jKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOworaW50IGZmX3c5N18zMl9jKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOworCit2b2lkIGZmX3NwYXRpYWxfZHd0KGludCAqYnVmZmVyLCBpbnQgKnRlbXAsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGludCBkZWNvbXBvc2l0aW9uX2NvdW50KTsKKwordm9pZCBmZl9zcGF0aWFsX2lkd3RfYnVmZmVyZWRfaW5pdChEV1RDb21wb3NlICpjcywgc2xpY2VfYnVmZmVyICpzYiwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlX2xpbmUsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjb21wb3NpdGlvbl9jb3VudCk7Cit2b2lkIGZmX3NwYXRpYWxfaWR3dF9idWZmZXJlZF9zbGljZShTbm93RFdUQ29udGV4dCAqZHNwLCBEV1RDb21wb3NlICpjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlX2J1ZmZlciAqc2xpY2VfYnVmLCBJRFdURUxFTSAqdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZV9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGludCBkZWNvbXBvc2l0aW9uX2NvdW50LCBpbnQgeSk7Cit2b2lkIGZmX3NwYXRpYWxfaWR3dChJRFdURUxFTSAqYnVmZmVyLCBJRFdURUxFTSAqdGVtcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHR5cGUsIGludCBkZWNvbXBvc2l0aW9uX2NvdW50KTsKKwordm9pZCBmZl9kd3RfaW5pdChTbm93RFdUQ29udGV4dCAqYyk7Cit2b2lkIGZmX2R3dF9pbml0X3g4NihTbm93RFdUQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0RXVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zbm93ZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvc25vd2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTBmZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc25vd2RhdGEuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJvYmVydCBFZGVsZSA8eWFydHJlYm9AZWFydGhsaW5rLm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NOT1dEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19TTk9XREFUQV9ICisKKyNpbmNsdWRlICJzbm93LmgiCisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9ibWMzMlsxMDI0XT17CisgIDAsICAwLCAgMCwgIDAsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICAwLCAgMCwgIDAsICAwLAorICAwLCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAxMiwgMTIsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjAsIDI0LCAyNCwgMjAsIDIwLCAyMCwgMTYsIDE2LCAxNiwgMTIsIDEyLCAgOCwgIDgsICA4LCAgNCwgIDQsICA0LCAgMCwKKyAgMCwgIDQsICA4LCAgOCwgMTIsIDEyLCAxNiwgMjAsIDIwLCAyNCwgMjgsIDI4LCAzMiwgMzIsIDM2LCA0MCwgNDAsIDM2LCAzMiwgMzIsIDI4LCAyOCwgMjQsIDIwLCAyMCwgMTYsIDEyLCAxMiwgIDgsICA4LCAgNCwgIDAsCisgIDAsICA0LCAgOCwgMTIsIDE2LCAyMCwgMjQsIDI4LCAyOCwgMzIsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDU2LCA1MiwgNDgsIDQ0LCA0MCwgMzYsIDMyLCAyOCwgMjgsIDI0LCAyMCwgMTYsIDEyLCAgOCwgIDQsICAwLAorICA0LCAgOCwgMTIsIDE2LCAyMCwgMjQsIDI4LCAzMiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDY4LCA2OCwgNjQsIDYwLCA1NiwgNTIsIDQ4LCA0NCwgNDAsIDMyLCAyOCwgMjQsIDIwLCAxNiwgMTIsICA4LCAgNCwKKyAgNCwgIDgsIDEyLCAyMCwgMjQsIDMyLCAzNiwgNDAsIDQ4LCA1MiwgNTYsIDY0LCA2OCwgNzYsIDgwLCA4NCwgODQsIDgwLCA3NiwgNjgsIDY0LCA1NiwgNTIsIDQ4LCA0MCwgMzYsIDMyLCAyNCwgMjAsIDEyLCAgOCwgIDQsCisgIDQsICA4LCAxNiwgMjQsIDI4LCAzNiwgNDQsIDQ4LCA1NiwgNjAsIDY4LCA3NiwgODAsIDg4LCA5NiwxMDAsMTAwLCA5NiwgODgsIDgwLCA3NiwgNjgsIDYwLCA1NiwgNDgsIDQ0LCAzNiwgMjgsIDI0LCAxNiwgIDgsICA0LAorICA0LCAxMiwgMjAsIDI4LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDcyLCA4MCwgODgsIDkyLDEwMCwxMDgsMTE2LDExNiwxMDgsMTAwLCA5MiwgODgsIDgwLCA3MiwgNjQsIDU2LCA0OCwgNDAsIDMyLCAyOCwgMjAsIDEyLCAgNCwKKyAgNCwgMTIsIDIwLCAyOCwgNDAsIDQ4LCA1NiwgNjQsIDcyLCA4MCwgODgsIDk2LDEwOCwxMTYsMTI0LDEzMiwxMzIsMTI0LDExNiwxMDgsIDk2LCA4OCwgODAsIDcyLCA2NCwgNTYsIDQ4LCA0MCwgMjgsIDIwLCAxMiwgIDQsCisgIDQsIDE2LCAyNCwgMzIsIDQ0LCA1MiwgNjAsIDcyLCA4MCwgOTIsMTAwLDEwOCwxMjAsMTI4LDEzNiwxNDgsMTQ4LDEzNiwxMjgsMTIwLDEwOCwxMDAsIDkyLCA4MCwgNzIsIDYwLCA1MiwgNDQsIDMyLCAyNCwgMTYsICA0LAorICA0LCAxNiwgMjgsIDM2LCA0OCwgNTYsIDY4LCA4MCwgODgsMTAwLDExMiwxMjAsMTMyLDE0MCwxNTIsMTY0LDE2NCwxNTIsMTQwLDEzMiwxMjAsMTEyLDEwMCwgODgsIDgwLCA2OCwgNTYsIDQ4LCAzNiwgMjgsIDE2LCAgNCwKKyAgNCwgMTYsIDI4LCA0MCwgNTIsIDY0LCA3NiwgODgsIDk2LDEwOCwxMjAsMTMyLDE0NCwxNTYsMTY4LDE4MCwxODAsMTY4LDE1NiwxNDQsMTMyLDEyMCwxMDgsIDk2LCA4OCwgNzYsIDY0LCA1MiwgNDAsIDI4LCAxNiwgIDQsCisgIDgsIDIwLCAzMiwgNDQsIDU2LCA2OCwgODAsIDkyLDEwOCwxMjAsMTMyLDE0NCwxNTYsMTY4LDE4MCwxOTIsMTkyLDE4MCwxNjgsMTU2LDE0NCwxMzIsMTIwLDEwOCwgOTIsIDgwLCA2OCwgNTYsIDQ0LCAzMiwgMjAsICA4LAorICA4LCAyMCwgMzIsIDQ4LCA2MCwgNzYsIDg4LDEwMCwxMTYsMTI4LDE0MCwxNTYsMTY4LDE4NCwxOTYsMjA4LDIwOCwxOTYsMTg0LDE2OCwxNTYsMTQwLDEyOCwxMTYsMTAwLCA4OCwgNzYsIDYwLCA0OCwgMzIsIDIwLCAgOCwKKyAgOCwgMjAsIDM2LCA1MiwgNjQsIDgwLCA5NiwxMDgsMTI0LDEzNiwxNTIsMTY4LDE4MCwxOTYsMjEyLDIyNCwyMjQsMjEyLDE5NiwxODAsMTY4LDE1MiwxMzYsMTI0LDEwOCwgOTYsIDgwLCA2NCwgNTIsIDM2LCAyMCwgIDgsCisgIDgsIDI0LCA0MCwgNTYsIDY4LCA4NCwxMDAsMTE2LDEzMiwxNDgsMTY0LDE4MCwxOTIsMjA4LDIyNCwyNDAsMjQwLDIyNCwyMDgsMTkyLDE4MCwxNjQsMTQ4LDEzMiwxMTYsMTAwLCA4NCwgNjgsIDU2LCA0MCwgMjQsICA4LAorICA4LCAyNCwgNDAsIDU2LCA2OCwgODQsMTAwLDExNiwxMzIsMTQ4LDE2NCwxODAsMTkyLDIwOCwyMjQsMjQwLDI0MCwyMjQsMjA4LDE5MiwxODAsMTY0LDE0OCwxMzIsMTE2LDEwMCwgODQsIDY4LCA1NiwgNDAsIDI0LCAgOCwKKyAgOCwgMjAsIDM2LCA1MiwgNjQsIDgwLCA5NiwxMDgsMTI0LDEzNiwxNTIsMTY4LDE4MCwxOTYsMjEyLDIyNCwyMjQsMjEyLDE5NiwxODAsMTY4LDE1MiwxMzYsMTI0LDEwOCwgOTYsIDgwLCA2NCwgNTIsIDM2LCAyMCwgIDgsCisgIDgsIDIwLCAzMiwgNDgsIDYwLCA3NiwgODgsMTAwLDExNiwxMjgsMTQwLDE1NiwxNjgsMTg0LDE5NiwyMDgsMjA4LDE5NiwxODQsMTY4LDE1NiwxNDAsMTI4LDExNiwxMDAsIDg4LCA3NiwgNjAsIDQ4LCAzMiwgMjAsICA4LAorICA4LCAyMCwgMzIsIDQ0LCA1NiwgNjgsIDgwLCA5MiwxMDgsMTIwLDEzMiwxNDQsMTU2LDE2OCwxODAsMTkyLDE5MiwxODAsMTY4LDE1NiwxNDQsMTMyLDEyMCwxMDgsIDkyLCA4MCwgNjgsIDU2LCA0NCwgMzIsIDIwLCAgOCwKKyAgNCwgMTYsIDI4LCA0MCwgNTIsIDY0LCA3NiwgODgsIDk2LDEwOCwxMjAsMTMyLDE0NCwxNTYsMTY4LDE4MCwxODAsMTY4LDE1NiwxNDQsMTMyLDEyMCwxMDgsIDk2LCA4OCwgNzYsIDY0LCA1MiwgNDAsIDI4LCAxNiwgIDQsCisgIDQsIDE2LCAyOCwgMzYsIDQ4LCA1NiwgNjgsIDgwLCA4OCwxMDAsMTEyLDEyMCwxMzIsMTQwLDE1MiwxNjQsMTY0LDE1MiwxNDAsMTMyLDEyMCwxMTIsMTAwLCA4OCwgODAsIDY4LCA1NiwgNDgsIDM2LCAyOCwgMTYsICA0LAorICA0LCAxNiwgMjQsIDMyLCA0NCwgNTIsIDYwLCA3MiwgODAsIDkyLDEwMCwxMDgsMTIwLDEyOCwxMzYsMTQ4LDE0OCwxMzYsMTI4LDEyMCwxMDgsMTAwLCA5MiwgODAsIDcyLCA2MCwgNTIsIDQ0LCAzMiwgMjQsIDE2LCAgNCwKKyAgNCwgMTIsIDIwLCAyOCwgNDAsIDQ4LCA1NiwgNjQsIDcyLCA4MCwgODgsIDk2LDEwOCwxMTYsMTI0LDEzMiwxMzIsMTI0LDExNiwxMDgsIDk2LCA4OCwgODAsIDcyLCA2NCwgNTYsIDQ4LCA0MCwgMjgsIDIwLCAxMiwgIDQsCisgIDQsIDEyLCAyMCwgMjgsIDMyLCA0MCwgNDgsIDU2LCA2NCwgNzIsIDgwLCA4OCwgOTIsMTAwLDEwOCwxMTYsMTE2LDEwOCwxMDAsIDkyLCA4OCwgODAsIDcyLCA2NCwgNTYsIDQ4LCA0MCwgMzIsIDI4LCAyMCwgMTIsICA0LAorICA0LCAgOCwgMTYsIDI0LCAyOCwgMzYsIDQ0LCA0OCwgNTYsIDYwLCA2OCwgNzYsIDgwLCA4OCwgOTYsMTAwLDEwMCwgOTYsIDg4LCA4MCwgNzYsIDY4LCA2MCwgNTYsIDQ4LCA0NCwgMzYsIDI4LCAyNCwgMTYsICA4LCAgNCwKKyAgNCwgIDgsIDEyLCAyMCwgMjQsIDMyLCAzNiwgNDAsIDQ4LCA1MiwgNTYsIDY0LCA2OCwgNzYsIDgwLCA4NCwgODQsIDgwLCA3NiwgNjgsIDY0LCA1NiwgNTIsIDQ4LCA0MCwgMzYsIDMyLCAyNCwgMjAsIDEyLCAgOCwgIDQsCisgIDQsICA4LCAxMiwgMTYsIDIwLCAyNCwgMjgsIDMyLCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgNjgsIDY4LCA2NCwgNjAsIDU2LCA1MiwgNDgsIDQ0LCA0MCwgMzIsIDI4LCAyNCwgMjAsIDE2LCAxMiwgIDgsICA0LAorICAwLCAgNCwgIDgsIDEyLCAxNiwgMjAsIDI0LCAyOCwgMjgsIDMyLCAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA1NiwgNTIsIDQ4LCA0NCwgNDAsIDM2LCAzMiwgMjgsIDI4LCAyNCwgMjAsIDE2LCAxMiwgIDgsICA0LCAgMCwKKyAgMCwgIDQsICA4LCAgOCwgMTIsIDEyLCAxNiwgMjAsIDIwLCAyNCwgMjgsIDI4LCAzMiwgMzIsIDM2LCA0MCwgNDAsIDM2LCAzMiwgMzIsIDI4LCAyOCwgMjQsIDIwLCAyMCwgMTYsIDEyLCAxMiwgIDgsICA4LCAgNCwgIDAsCisgIDAsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMjAsIDIwLCAyMCwgMjQsIDI0LCAyMCwgMjAsIDIwLCAxNiwgMTYsIDE2LCAxMiwgMTIsICA4LCAgOCwgIDgsICA0LCAgNCwgIDQsICAwLAorICAwLCAgMCwgIDAsICAwLCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgMCwgIDAsICAwLCAgMCwKKyAvL2Vycm9yOjAuMDAwMDIwCit9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb2JtYzE2WzI1Nl09eworICAwLCAgNCwgIDQsICA4LCAgOCwgMTIsIDEyLCAxNiwgMTYsIDEyLCAxMiwgIDgsICA4LCAgNCwgIDQsICAwLAorICA0LCAgOCwgMTYsIDIwLCAyOCwgMzIsIDQwLCA0NCwgNDQsIDQwLCAzMiwgMjgsIDIwLCAxNiwgIDgsICA0LAorICA0LCAxNiwgMjQsIDM2LCA0NCwgNTYsIDY0LCA3NiwgNzYsIDY0LCA1NiwgNDQsIDM2LCAyNCwgMTYsICA0LAorICA4LCAyMCwgMzYsIDQ4LCA2NCwgNzYsIDkyLDEwNCwxMDQsIDkyLCA3NiwgNjQsIDQ4LCAzNiwgMjAsICA4LAorICA4LCAyOCwgNDQsIDY0LCA4MCwxMDAsMTE2LDEzNiwxMzYsMTE2LDEwMCwgODAsIDY0LCA0NCwgMjgsICA4LAorIDEyLCAzMiwgNTYsIDc2LDEwMCwxMjAsMTQ0LDE2NCwxNjQsMTQ0LDEyMCwxMDAsIDc2LCA1NiwgMzIsIDEyLAorIDEyLCA0MCwgNjQsIDkyLDExNiwxNDQsMTY4LDE5NiwxOTYsMTY4LDE0NCwxMTYsIDkyLCA2NCwgNDAsIDEyLAorIDE2LCA0NCwgNzYsMTA0LDEzNiwxNjQsMTk2LDIyNCwyMjQsMTk2LDE2NCwxMzYsMTA0LCA3NiwgNDQsIDE2LAorIDE2LCA0NCwgNzYsMTA0LDEzNiwxNjQsMTk2LDIyNCwyMjQsMTk2LDE2NCwxMzYsMTA0LCA3NiwgNDQsIDE2LAorIDEyLCA0MCwgNjQsIDkyLDExNiwxNDQsMTY4LDE5NiwxOTYsMTY4LDE0NCwxMTYsIDkyLCA2NCwgNDAsIDEyLAorIDEyLCAzMiwgNTYsIDc2LDEwMCwxMjAsMTQ0LDE2NCwxNjQsMTQ0LDEyMCwxMDAsIDc2LCA1NiwgMzIsIDEyLAorICA4LCAyOCwgNDQsIDY0LCA4MCwxMDAsMTE2LDEzNiwxMzYsMTE2LDEwMCwgODAsIDY0LCA0NCwgMjgsICA4LAorICA4LCAyMCwgMzYsIDQ4LCA2NCwgNzYsIDkyLDEwNCwxMDQsIDkyLCA3NiwgNjQsIDQ4LCAzNiwgMjAsICA4LAorICA0LCAxNiwgMjQsIDM2LCA0NCwgNTYsIDY0LCA3NiwgNzYsIDY0LCA1NiwgNDQsIDM2LCAyNCwgMTYsICA0LAorICA0LCAgOCwgMTYsIDIwLCAyOCwgMzIsIDQwLCA0NCwgNDQsIDQwLCAzMiwgMjgsIDIwLCAxNiwgIDgsICA0LAorICAwLCAgNCwgIDQsICA4LCAgOCwgMTIsIDEyLCAxNiwgMTYsIDEyLCAxMiwgIDgsICA4LCAgNCwgIDQsICAwLAorLy9lcnJvcjowLjAwMDAxNQorfTsKKworLy9saW5lYXIgKjY0CitzdGF0aWMgY29uc3QgdWludDhfdCBvYm1jOFs2NF09eworICA0LCAxMiwgMjAsIDI4LCAyOCwgMjAsIDEyLCAgNCwKKyAxMiwgMzYsIDYwLCA4NCwgODQsIDYwLCAzNiwgMTIsCisgMjAsIDYwLDEwMCwxNDAsMTQwLDEwMCwgNjAsIDIwLAorIDI4LCA4NCwxNDAsMTk2LDE5NiwxNDAsIDg0LCAyOCwKKyAyOCwgODQsMTQwLDE5NiwxOTYsMTQwLCA4NCwgMjgsCisgMjAsIDYwLDEwMCwxNDAsMTQwLDEwMCwgNjAsIDIwLAorIDEyLCAzNiwgNjAsIDg0LCA4NCwgNjAsIDM2LCAxMiwKKyAgNCwgMTIsIDIwLCAyOCwgMjgsIDIwLCAxMiwgIDQsCisvL2Vycm9yOjAuMDAwMDAwCit9OworCisvL2xpbmVhciAqNjQKK3N0YXRpYyBjb25zdCB1aW50OF90IG9ibWM0WzE2XT17CisgMTYsIDQ4LCA0OCwgMTYsCisgNDgsMTQ0LDE0NCwgNDgsCisgNDgsMTQ0LDE0NCwgNDgsCisgMTYsIDQ4LCA0OCwgMTYsCisvL2Vycm9yOjAuMDAwMDAwCit9OworCitjb25zdCBpbnQ4X3QgZmZfcXVhbnQzYkFbMjU2XT17CisgMCwgMCwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwKKyAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLAorIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsCisgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwKKyAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLAorIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsCisgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwKKyAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLAorIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsCisgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwKKyAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLAorIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsCisgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwKKyAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLCAxLC0xLAorIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsIDEsLTEsCisgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwgMSwtMSwKK307CisKK2NvbnN0IHVpbnQ4X3QgKiBjb25zdCBmZl9vYm1jX3RhYls0XT0geworICAgIG9ibWMzMiwgb2JtYzE2LCBvYm1jOCwgb2JtYzQKK307CisKKy8qIHJ1bnRpbWUgZ2VuZXJhdGVkIHRhYmxlcyAqLwordWludDhfdCBmZl9xZXhwW1FST09UXTsKK2ludCBmZl9zY2FsZV9tdl9yZWZbTUFYX1JFRl9GUkFNRVNdW01BWF9SRUZfRlJBTUVTXTsKKworCisjZW5kaWYgLyogQVZDT0RFQ19TTk9XX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Nub3dkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Nub3dkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjcxNTdiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc25vd2RlYy5jCkBAIC0wLDAgKzEsNjA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50bWF0aC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInNub3dfZHd0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzbm93LmgiCisKKyNpbmNsdWRlICJyYW5nZWNvZGVyLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAiaDI2My5oIgorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHByZWRpY3Rfc2xpY2VfYnVmZmVyZWQoU25vd0NvbnRleHQgKnMsIHNsaWNlX2J1ZmZlciAqIHNiLCBJRFdURUxFTSAqIG9sZF9idWZmZXIsIGludCBwbGFuZV9pbmRleCwgaW50IGFkZCwgaW50IG1iX3kpeworICAgIFBsYW5lICpwPSAmcy0+cGxhbmVbcGxhbmVfaW5kZXhdOworICAgIGNvbnN0IGludCBtYl93PSBzLT5iX3dpZHRoICA8PCBzLT5ibG9ja19tYXhfZGVwdGg7CisgICAgY29uc3QgaW50IG1iX2g9IHMtPmJfaGVpZ2h0IDw8IHMtPmJsb2NrX21heF9kZXB0aDsKKyAgICBpbnQgeCwgeSwgbWJfeDsKKyAgICBpbnQgYmxvY2tfc2l6ZSA9IE1CX1NJWkUgPj4gcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIGludCBibG9ja193ICAgID0gcGxhbmVfaW5kZXggPyBibG9ja19zaXplPj5zLT5jaHJvbWFfaF9zaGlmdCA6IGJsb2NrX3NpemU7CisgICAgaW50IGJsb2NrX2ggICAgPSBwbGFuZV9pbmRleCA/IGJsb2NrX3NpemU+PnMtPmNocm9tYV92X3NoaWZ0IDogYmxvY2tfc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpvYm1jICA9IHBsYW5lX2luZGV4ID8gZmZfb2JtY190YWJbcy0+YmxvY2tfbWF4X2RlcHRoK3MtPmNocm9tYV9oX3NoaWZ0XSA6IGZmX29ibWNfdGFiW3MtPmJsb2NrX21heF9kZXB0aF07CisgICAgaW50IG9ibWNfc3RyaWRlPSBwbGFuZV9pbmRleCA/ICgyKmJsb2NrX3NpemUpPj5zLT5jaHJvbWFfaF9zaGlmdCA6IDIqYmxvY2tfc2l6ZTsKKyAgICBpbnQgcmVmX3N0cmlkZT0gcy0+Y3VycmVudF9waWN0dXJlLT5saW5lc2l6ZVtwbGFuZV9pbmRleF07CisgICAgdWludDhfdCAqZHN0OD0gcy0+Y3VycmVudF9waWN0dXJlLT5kYXRhW3BsYW5lX2luZGV4XTsKKyAgICBpbnQgdz0gcC0+d2lkdGg7CisgICAgaW50IGg9IHAtPmhlaWdodDsKKworICAgIGlmKHMtPmtleWZyYW1lIHx8IChzLT5hdmN0eC0+ZGVidWcmNTEyKSl7CisgICAgICAgIGlmKG1iX3k9PW1iX2gpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYoYWRkKXsKKyAgICAgICAgICAgIGZvcih5PWJsb2NrX2gqbWJfeTsgeTxGRk1JTihoLGJsb2NrX2gqKG1iX3krMSkpOyB5KyspeworLy8gICAgICAgICAgICAgICAgRFdURUxFTSAqIGxpbmUgPSBzbGljZV9idWZmZXJfZ2V0X2xpbmUoc2IsIHkpOworICAgICAgICAgICAgICAgIElEV1RFTEVNICogbGluZSA9IHNiLT5saW5lW3ldOworICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8dzsgeCsrKXsKKy8vICAgICAgICAgICAgICAgICAgICBpbnQgdj0gYnVmW3ggKyB5KnddICsgKDEyODw8RlJBQ19CSVRTKSArICgxPDwoRlJBQ19CSVRTLTEpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHY9IGxpbmVbeF0gKyAoMTI4PDxGUkFDX0JJVFMpICsgKDE8PChGUkFDX0JJVFMtMSkpOworICAgICAgICAgICAgICAgICAgICB2ID4+PSBGUkFDX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIGlmKHYmKH4yNTUpKSB2PSB+KHY+PjMxKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0OFt4ICsgeSpyZWZfc3RyaWRlXT0gdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZm9yKHk9YmxvY2tfaCptYl95OyB5PEZGTUlOKGgsYmxvY2tfaCoobWJfeSsxKSk7IHkrKyl7CisvLyAgICAgICAgICAgICAgICBEV1RFTEVNICogbGluZSA9IHNsaWNlX2J1ZmZlcl9nZXRfbGluZShzYiwgeSk7CisgICAgICAgICAgICAgICAgSURXVEVMRU0gKiBsaW5lID0gc2ItPmxpbmVbeV07CisgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICAgICAgICAgICAgICBsaW5lW3hdIC09IDEyOCA8PCBGUkFDX0JJVFM7CisvLyAgICAgICAgICAgICAgICAgICAgYnVmW3ggKyB5KnddLT0gMTI4PDxGUkFDX0JJVFM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcihtYl94PTA7IG1iX3g8PW1iX3c7IG1iX3grKyl7CisgICAgICAgIGFkZF95YmxvY2socywgMSwgc2IsIG9sZF9idWZmZXIsIGRzdDgsIG9ibWMsCisgICAgICAgICAgICAgICAgICAgYmxvY2tfdyptYl94IC0gYmxvY2tfdy8yLAorICAgICAgICAgICAgICAgICAgIGJsb2NrX2gqbWJfeSAtIGJsb2NrX2gvMiwKKyAgICAgICAgICAgICAgICAgICBibG9ja193LCBibG9ja19oLAorICAgICAgICAgICAgICAgICAgIHcsIGgsCisgICAgICAgICAgICAgICAgICAgdywgcmVmX3N0cmlkZSwgb2JtY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgbWJfeCAtIDEsIG1iX3kgLSAxLAorICAgICAgICAgICAgICAgICAgIGFkZCwgMCwgcGxhbmVfaW5kZXgpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlY29kZV9zdWJiYW5kX3NsaWNlX2J1ZmZlcmVkKFNub3dDb250ZXh0ICpzLCBTdWJCYW5kICpiLCBzbGljZV9idWZmZXIgKiBzYiwgaW50IHN0YXJ0X3ksIGludCBoLCBpbnQgc2F2ZV9zdGF0ZVsxXSl7CisgICAgY29uc3QgaW50IHc9IGItPndpZHRoOworICAgIGludCB5OworICAgIGNvbnN0IGludCBxbG9nPSBhdl9jbGlwKHMtPnFsb2cgKyBiLT5xbG9nLCAwLCBRUk9PVCoxNik7CisgICAgaW50IHFtdWw9IGZmX3FleHBbcWxvZyYoUVJPT1QtMSldPDwocWxvZz4+UVNISUZUKTsKKyAgICBpbnQgcWFkZD0gKHMtPnFiaWFzKnFtdWwpPj5RQklBU19TSElGVDsKKyAgICBpbnQgbmV3X2luZGV4ID0gMDsKKworICAgIGlmKGItPmlidWYgPT0gcy0+c3BhdGlhbF9pZHd0X2J1ZmZlciB8fCBzLT5xbG9nID09IExPU1NMRVNTX1FMT0cpeworICAgICAgICBxYWRkPSAwOworICAgICAgICBxbXVsPSAxPDxRRVhQU0hJRlQ7CisgICAgfQorCisgICAgLyogSWYgd2UgYXJlIG9uIHRoZSBzZWNvbmQgb3IgbGF0ZXIgc2xpY2UsIHJlc3RvcmUgb3VyIGluZGV4LiAqLworICAgIGlmIChzdGFydF95ICE9IDApCisgICAgICAgIG5ld19pbmRleCA9IHNhdmVfc3RhdGVbMF07CisKKworICAgIGZvcih5PXN0YXJ0X3k7IHk8aDsgeSsrKXsKKyAgICAgICAgaW50IHggPSAwOworICAgICAgICBpbnQgdjsKKyAgICAgICAgSURXVEVMRU0gKiBsaW5lID0gc2xpY2VfYnVmZmVyX2dldF9saW5lKHNiLCB5ICogYi0+c3RyaWRlX2xpbmUgKyBiLT5idWZfeV9vZmZzZXQpICsgYi0+YnVmX3hfb2Zmc2V0OworICAgICAgICBtZW1zZXQobGluZSwgMCwgYi0+d2lkdGgqc2l6ZW9mKElEV1RFTEVNKSk7CisgICAgICAgIHYgPSBiLT54X2NvZWZmW25ld19pbmRleF0uY29lZmY7CisgICAgICAgIHggPSBiLT54X2NvZWZmW25ld19pbmRleCsrXS54OworICAgICAgICB3aGlsZSh4IDwgdyl7CisgICAgICAgICAgICByZWdpc3RlciBpbnQgdD0gKCAodj4+MSkqcW11bCArIHFhZGQpPj5RRVhQU0hJRlQ7CisgICAgICAgICAgICByZWdpc3RlciBpbnQgdT0gLSh2JjEpOworICAgICAgICAgICAgbGluZVt4XSA9ICh0XnUpIC0gdTsKKworICAgICAgICAgICAgdiA9IGItPnhfY29lZmZbbmV3X2luZGV4XS5jb2VmZjsKKyAgICAgICAgICAgIHggPSBiLT54X2NvZWZmW25ld19pbmRleCsrXS54OworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2F2ZSBvdXIgdmFyaWFibGVzIGZvciB0aGUgbmV4dCBzbGljZS4gKi8KKyAgICBzYXZlX3N0YXRlWzBdID0gbmV3X2luZGV4OworCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW50IGRlY29kZV9xX2JyYW5jaChTbm93Q29udGV4dCAqcywgaW50IGxldmVsLCBpbnQgeCwgaW50IHkpeworICAgIGNvbnN0IGludCB3PSBzLT5iX3dpZHRoIDw8IHMtPmJsb2NrX21heF9kZXB0aDsKKyAgICBjb25zdCBpbnQgcmVtX2RlcHRoPSBzLT5ibG9ja19tYXhfZGVwdGggLSBsZXZlbDsKKyAgICBjb25zdCBpbnQgaW5kZXg9ICh4ICsgeSp3KSA8PCByZW1fZGVwdGg7CisgICAgaW50IHRyeD0gKHgrMSk8PHJlbV9kZXB0aDsKKyAgICBjb25zdCBCbG9ja05vZGUgKmxlZnQgID0geCA/ICZzLT5ibG9ja1tpbmRleC0xXSA6ICZudWxsX2Jsb2NrOworICAgIGNvbnN0IEJsb2NrTm9kZSAqdG9wICAgPSB5ID8gJnMtPmJsb2NrW2luZGV4LXddIDogJm51bGxfYmxvY2s7CisgICAgY29uc3QgQmxvY2tOb2RlICp0bCAgICA9IHkgJiYgeCA/ICZzLT5ibG9ja1tpbmRleC13LTFdIDogbGVmdDsKKyAgICBjb25zdCBCbG9ja05vZGUgKnRyICAgID0geSAmJiB0cng8dyAmJiAoKHgmMSk9PTAgfHwgbGV2ZWw9PTApID8gJnMtPmJsb2NrW2luZGV4LXcrKDE8PHJlbV9kZXB0aCldIDogdGw7IC8vRklYTUUgdXNlIGx0CisgICAgaW50IHNfY29udGV4dD0gMipsZWZ0LT5sZXZlbCArIDIqdG9wLT5sZXZlbCArIHRsLT5sZXZlbCArIHRyLT5sZXZlbDsKKyAgICBpbnQgcmVzOworCisgICAgaWYocy0+a2V5ZnJhbWUpeworICAgICAgICBzZXRfYmxvY2tzKHMsIGxldmVsLCB4LCB5LCBudWxsX2Jsb2NrLmNvbG9yWzBdLCBudWxsX2Jsb2NrLmNvbG9yWzFdLCBudWxsX2Jsb2NrLmNvbG9yWzJdLCBudWxsX2Jsb2NrLm14LCBudWxsX2Jsb2NrLm15LCBudWxsX2Jsb2NrLnJlZiwgQkxPQ0tfSU5UUkEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZihsZXZlbD09cy0+YmxvY2tfbWF4X2RlcHRoIHx8IGdldF9yYWMoJnMtPmMsICZzLT5ibG9ja19zdGF0ZVs0ICsgc19jb250ZXh0XSkpeworICAgICAgICBpbnQgdHlwZSwgbXgsIG15OworICAgICAgICBpbnQgbCA9IGxlZnQtPmNvbG9yWzBdOworICAgICAgICBpbnQgY2I9IGxlZnQtPmNvbG9yWzFdOworICAgICAgICBpbnQgY3I9IGxlZnQtPmNvbG9yWzJdOworICAgICAgICBpbnQgcmVmID0gMDsKKyAgICAgICAgaW50IHJlZl9jb250ZXh0PSBhdl9sb2cyKDIqbGVmdC0+cmVmKSArIGF2X2xvZzIoMip0b3AtPnJlZik7CisgICAgICAgIGludCBteF9jb250ZXh0PSBhdl9sb2cyKDIqRkZBQlMobGVmdC0+bXggLSB0b3AtPm14KSkgKyAwKmF2X2xvZzIoMipGRkFCUyh0ci0+bXggLSB0b3AtPm14KSk7CisgICAgICAgIGludCBteV9jb250ZXh0PSBhdl9sb2cyKDIqRkZBQlMobGVmdC0+bXkgLSB0b3AtPm15KSkgKyAwKmF2X2xvZzIoMipGRkFCUyh0ci0+bXkgLSB0b3AtPm15KSk7CisKKyAgICAgICAgdHlwZT0gZ2V0X3JhYygmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzEgKyBsZWZ0LT50eXBlICsgdG9wLT50eXBlXSkgPyBCTE9DS19JTlRSQSA6IDA7CisKKyAgICAgICAgaWYodHlwZSl7CisgICAgICAgICAgICBwcmVkX212KHMsICZteCwgJm15LCAwLCBsZWZ0LCB0b3AsIHRyKTsKKyAgICAgICAgICAgIGwgKz0gZ2V0X3N5bWJvbCgmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzMyXSwgMSk7CisgICAgICAgICAgICBpZiAocy0+bmJfcGxhbmVzID4gMikgeworICAgICAgICAgICAgICAgIGNiKz0gZ2V0X3N5bWJvbCgmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzY0XSwgMSk7CisgICAgICAgICAgICAgICAgY3IrPSBnZXRfc3ltYm9sKCZzLT5jLCAmcy0+YmxvY2tfc3RhdGVbOTZdLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpZihzLT5yZWZfZnJhbWVzID4gMSkKKyAgICAgICAgICAgICAgICByZWY9IGdldF9zeW1ib2woJnMtPmMsICZzLT5ibG9ja19zdGF0ZVsxMjggKyAxMDI0ICsgMzIqcmVmX2NvbnRleHRdLCAwKTsKKyAgICAgICAgICAgIGlmIChyZWYgPj0gcy0+cmVmX2ZyYW1lcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCByZWZcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJlZF9tdihzLCAmbXgsICZteSwgcmVmLCBsZWZ0LCB0b3AsIHRyKTsKKyAgICAgICAgICAgIG14Kz0gZ2V0X3N5bWJvbCgmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzEyOCArIDMyKihteF9jb250ZXh0ICsgMTYqISFyZWYpXSwgMSk7CisgICAgICAgICAgICBteSs9IGdldF9zeW1ib2woJnMtPmMsICZzLT5ibG9ja19zdGF0ZVsxMjggKyAzMioobXlfY29udGV4dCArIDE2KiEhcmVmKV0sIDEpOworICAgICAgICB9CisgICAgICAgIHNldF9ibG9ja3MocywgbGV2ZWwsIHgsIHksIGwsIGNiLCBjciwgbXgsIG15LCByZWYsIHR5cGUpOworICAgIH1lbHNleworICAgICAgICBpZiAoKHJlcyA9IGRlY29kZV9xX2JyYW5jaChzLCBsZXZlbCsxLCAyKngrMCwgMip5KzApKSA8IDAgfHwKKyAgICAgICAgICAgIChyZXMgPSBkZWNvZGVfcV9icmFuY2gocywgbGV2ZWwrMSwgMip4KzEsIDIqeSswKSkgPCAwIHx8CisgICAgICAgICAgICAocmVzID0gZGVjb2RlX3FfYnJhbmNoKHMsIGxldmVsKzEsIDIqeCswLCAyKnkrMSkpIDwgMCB8fAorICAgICAgICAgICAgKHJlcyA9IGRlY29kZV9xX2JyYW5jaChzLCBsZXZlbCsxLCAyKngrMSwgMip5KzEpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVxdWFudGl6ZV9zbGljZV9idWZmZXJlZChTbm93Q29udGV4dCAqcywgc2xpY2VfYnVmZmVyICogc2IsIFN1YkJhbmQgKmIsIElEV1RFTEVNICpzcmMsIGludCBzdHJpZGUsIGludCBzdGFydF95LCBpbnQgZW5kX3kpeworICAgIGNvbnN0IGludCB3PSBiLT53aWR0aDsKKyAgICBjb25zdCBpbnQgcWxvZz0gYXZfY2xpcChzLT5xbG9nICsgYi0+cWxvZywgMCwgUVJPT1QqMTYpOworICAgIGNvbnN0IGludCBxbXVsPSBmZl9xZXhwW3Fsb2cmKFFST09ULTEpXTw8KHFsb2c+PlFTSElGVCk7CisgICAgY29uc3QgaW50IHFhZGQ9IChzLT5xYmlhcypxbXVsKT4+UUJJQVNfU0hJRlQ7CisgICAgaW50IHgseTsKKworICAgIGlmKHMtPnFsb2cgPT0gTE9TU0xFU1NfUUxPRykgcmV0dXJuOworCisgICAgZm9yKHk9c3RhcnRfeTsgeTxlbmRfeTsgeSsrKXsKKy8vICAgICAgICBEV1RFTEVNICogbGluZSA9IHNsaWNlX2J1ZmZlcl9nZXRfbGluZV9mcm9tX2FkZHJlc3Moc2IsIHNyYyArICh5ICogc3RyaWRlKSk7CisgICAgICAgIElEV1RFTEVNICogbGluZSA9IHNsaWNlX2J1ZmZlcl9nZXRfbGluZShzYiwgKHkgKiBiLT5zdHJpZGVfbGluZSkgKyBiLT5idWZfeV9vZmZzZXQpICsgYi0+YnVmX3hfb2Zmc2V0OworICAgICAgICBmb3IoeD0wOyB4PHc7IHgrKyl7CisgICAgICAgICAgICBpbnQgaT0gbGluZVt4XTsKKyAgICAgICAgICAgIGlmKGk8MCl7CisgICAgICAgICAgICAgICAgbGluZVt4XT0gLSgoLWkqcW11bCArIHFhZGQpPj4oUUVYUFNISUZUKSk7IC8vRklYTUUgdHJ5IGRpZmZlcmVudCBiaWFzCisgICAgICAgICAgICB9ZWxzZSBpZihpPjApeworICAgICAgICAgICAgICAgIGxpbmVbeF09ICAoKCBpKnFtdWwgKyBxYWRkKT4+KFFFWFBTSElGVCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3JyZWxhdGVfc2xpY2VfYnVmZmVyZWQoU25vd0NvbnRleHQgKnMsIHNsaWNlX2J1ZmZlciAqIHNiLCBTdWJCYW5kICpiLCBJRFdURUxFTSAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaW52ZXJzZSwgaW50IHVzZV9tZWRpYW4sIGludCBzdGFydF95LCBpbnQgZW5kX3kpeworICAgIGNvbnN0IGludCB3PSBiLT53aWR0aDsKKyAgICBpbnQgeCx5OworCisgICAgSURXVEVMRU0gKiBsaW5lPTA7IC8vIHNpbGVuY2Ugc2lsbHkgImNvdWxkIGJlIHVzZWQgd2l0aG91dCBoYXZpbmcgYmVlbiBpbml0aWFsaXplZCIgd2FybmluZworICAgIElEV1RFTEVNICogcHJldjsKKworICAgIGlmIChzdGFydF95ICE9IDApCisgICAgICAgIGxpbmUgPSBzbGljZV9idWZmZXJfZ2V0X2xpbmUoc2IsICgoc3RhcnRfeSAtIDEpICogYi0+c3RyaWRlX2xpbmUpICsgYi0+YnVmX3lfb2Zmc2V0KSArIGItPmJ1Zl94X29mZnNldDsKKworICAgIGZvcih5PXN0YXJ0X3k7IHk8ZW5kX3k7IHkrKyl7CisgICAgICAgIHByZXYgPSBsaW5lOworLy8gICAgICAgIGxpbmUgPSBzbGljZV9idWZmZXJfZ2V0X2xpbmVfZnJvbV9hZGRyZXNzKHNiLCBzcmMgKyAoeSAqIHN0cmlkZSkpOworICAgICAgICBsaW5lID0gc2xpY2VfYnVmZmVyX2dldF9saW5lKHNiLCAoeSAqIGItPnN0cmlkZV9saW5lKSArIGItPmJ1Zl95X29mZnNldCkgKyBiLT5idWZfeF9vZmZzZXQ7CisgICAgICAgIGZvcih4PTA7IHg8dzsgeCsrKXsKKyAgICAgICAgICAgIGlmKHgpeworICAgICAgICAgICAgICAgIGlmKHVzZV9tZWRpYW4peworICAgICAgICAgICAgICAgICAgICBpZih5ICYmIHgrMTx3KSBsaW5lW3hdICs9IG1pZF9wcmVkKGxpbmVbeCAtIDFdLCBwcmV2W3hdLCBwcmV2W3ggKyAxXSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgIGxpbmVbeF0gKz0gbGluZVt4IC0gMV07CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGlmKHkpIGxpbmVbeF0gKz0gbWlkX3ByZWQobGluZVt4IC0gMV0sIHByZXZbeF0sIGxpbmVbeCAtIDFdICsgcHJldlt4XSAtIHByZXZbeCAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgbGluZVt4XSArPSBsaW5lW3ggLSAxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBpZih5KSBsaW5lW3hdICs9IHByZXZbeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9xbG9ncyhTbm93Q29udGV4dCAqcyl7CisgICAgaW50IHBsYW5lX2luZGV4LCBsZXZlbCwgb3JpZW50YXRpb247CisKKyAgICBmb3IocGxhbmVfaW5kZXg9MDsgcGxhbmVfaW5kZXggPCBzLT5uYl9wbGFuZXM7IHBsYW5lX2luZGV4KyspeworICAgICAgICBmb3IobGV2ZWw9MDsgbGV2ZWw8cy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50OyBsZXZlbCsrKXsKKyAgICAgICAgICAgIGZvcihvcmllbnRhdGlvbj1sZXZlbCA/IDE6MDsgb3JpZW50YXRpb248NDsgb3JpZW50YXRpb24rKyl7CisgICAgICAgICAgICAgICAgaW50IHE7CisgICAgICAgICAgICAgICAgaWYgICAgIChwbGFuZV9pbmRleD09MikgcT0gcy0+cGxhbmVbMV0uYmFuZFtsZXZlbF1bb3JpZW50YXRpb25dLnFsb2c7CisgICAgICAgICAgICAgICAgZWxzZSBpZihvcmllbnRhdGlvbj09MikgcT0gcy0+cGxhbmVbcGxhbmVfaW5kZXhdLmJhbmRbbGV2ZWxdWzFdLnFsb2c7CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgcT0gZ2V0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCAxKTsKKyAgICAgICAgICAgICAgICBzLT5wbGFuZVtwbGFuZV9pbmRleF0uYmFuZFtsZXZlbF1bb3JpZW50YXRpb25dLnFsb2c9IHE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNkZWZpbmUgR0VUX1MoZHN0LCBjaGVjaykgXAorICAgIHRtcD0gZ2V0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCAwKTtcCisgICAgaWYoIShjaGVjaykpe1wKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciAiICNkc3QgIiBpcyAlZFxuIiwgdG1wKTtcCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBO1wKKyAgICB9XAorICAgIGRzdD0gdG1wOworCitzdGF0aWMgaW50IGRlY29kZV9oZWFkZXIoU25vd0NvbnRleHQgKnMpeworICAgIGludCBwbGFuZV9pbmRleCwgdG1wOworICAgIHVpbnQ4X3Qga3N0YXRlWzMyXTsKKworICAgIG1lbXNldChrc3RhdGUsIE1JRF9TVEFURSwgc2l6ZW9mKGtzdGF0ZSkpOworCisgICAgcy0+a2V5ZnJhbWU9IGdldF9yYWMoJnMtPmMsIGtzdGF0ZSk7CisgICAgaWYocy0+a2V5ZnJhbWUgfHwgcy0+YWx3YXlzX3Jlc2V0KXsKKyAgICAgICAgZmZfc25vd19yZXNldF9jb250ZXh0cyhzKTsKKyAgICAgICAgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGU9CisgICAgICAgIHMtPnFsb2c9CisgICAgICAgIHMtPnFiaWFzPQorICAgICAgICBzLT5tdl9zY2FsZT0KKyAgICAgICAgcy0+YmxvY2tfbWF4X2RlcHRoPSAwOworICAgIH0KKyAgICBpZihzLT5rZXlmcmFtZSl7CisgICAgICAgIEdFVF9TKHMtPnZlcnNpb24sIHRtcCA8PSAwVSkKKyAgICAgICAgcy0+YWx3YXlzX3Jlc2V0PSBnZXRfcmFjKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUpOworICAgICAgICBzLT50ZW1wb3JhbF9kZWNvbXBvc2l0aW9uX3R5cGU9IGdldF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMCk7CisgICAgICAgIHMtPnRlbXBvcmFsX2RlY29tcG9zaXRpb25fY291bnQ9IGdldF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMCk7CisgICAgICAgIEdFVF9TKHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCwgMCA8IHRtcCAmJiB0bXAgPD0gTUFYX0RFQ09NUE9TSVRJT05TKQorICAgICAgICBzLT5jb2xvcnNwYWNlX3R5cGU9IGdldF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMCk7CisgICAgICAgIGlmIChzLT5jb2xvcnNwYWNlX3R5cGUgPT0gMSkgeworICAgICAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQ9IEFWX1BJWF9GTVRfR1JBWTg7CisgICAgICAgICAgICBzLT5uYl9wbGFuZXMgPSAxOworICAgICAgICB9IGVsc2UgaWYocy0+Y29sb3JzcGFjZV90eXBlID09IDApIHsKKyAgICAgICAgICAgIHMtPmNocm9tYV9oX3NoaWZ0PSBnZXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIDApOworICAgICAgICAgICAgcy0+Y2hyb21hX3Zfc2hpZnQ9IGdldF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMCk7CisKKyAgICAgICAgICAgIGlmKHMtPmNocm9tYV9oX3NoaWZ0ID09IDEgJiYgcy0+Y2hyb21hX3Zfc2hpZnQ9PTEpeworICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10PSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgICAgICB9ZWxzZSBpZihzLT5jaHJvbWFfaF9zaGlmdCA9PSAwICYmIHMtPmNocm9tYV92X3NoaWZ0PT0wKXsKKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdD0gQVZfUElYX0ZNVF9ZVVY0NDRQOworICAgICAgICAgICAgfWVsc2UgaWYocy0+Y2hyb21hX2hfc2hpZnQgPT0gMiAmJiBzLT5jaHJvbWFfdl9zaGlmdD09Mil7CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQ9IEFWX1BJWF9GTVRfWVVWNDEwUDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGNvbG9yIHN1YnNhbXBsZSBtb2RlICVkICVkXG4iLCBzLT5jaHJvbWFfaF9zaGlmdCwgcy0+Y2hyb21hX3Zfc2hpZnQpOworICAgICAgICAgICAgICAgIHMtPmNocm9tYV9oX3NoaWZ0ID0gcy0+Y2hyb21hX3Zfc2hpZnQgPSAxOworICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10PSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5uYl9wbGFuZXMgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGNvbG9yIHNwYWNlXG4iKTsKKyAgICAgICAgICAgIHMtPmNocm9tYV9oX3NoaWZ0ID0gcy0+Y2hyb21hX3Zfc2hpZnQgPSAxOworICAgICAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQ9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKworICAgICAgICBzLT5zcGF0aWFsX3NjYWxhYmlsaXR5PSBnZXRfcmFjKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUpOworLy8gICAgICAgIHMtPnJhdGVfc2NhbGFiaWxpdHk9IGdldF9yYWMoJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSk7CisgICAgICAgIEdFVF9TKHMtPm1heF9yZWZfZnJhbWVzLCB0bXAgPCAodW5zaWduZWQpTUFYX1JFRl9GUkFNRVMpCisgICAgICAgIHMtPm1heF9yZWZfZnJhbWVzKys7CisKKyAgICAgICAgZGVjb2RlX3Fsb2dzKHMpOworICAgIH0KKworICAgIGlmKCFzLT5rZXlmcmFtZSl7CisgICAgICAgIGlmKGdldF9yYWMoJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSkpeworICAgICAgICAgICAgZm9yKHBsYW5lX2luZGV4PTA7IHBsYW5lX2luZGV4PEZGTUlOKHMtPm5iX3BsYW5lcywgMik7IHBsYW5lX2luZGV4KyspeworICAgICAgICAgICAgICAgIGludCBodGFwcywgaSwgc3VtPTA7CisgICAgICAgICAgICAgICAgUGxhbmUgKnA9ICZzLT5wbGFuZVtwbGFuZV9pbmRleF07CisgICAgICAgICAgICAgICAgcC0+ZGlhZ19tYz0gZ2V0X3JhYygmcy0+Yywgcy0+aGVhZGVyX3N0YXRlKTsKKyAgICAgICAgICAgICAgICBodGFwcz0gZ2V0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCAwKSoyICsgMjsKKyAgICAgICAgICAgICAgICBpZigodW5zaWduZWQpaHRhcHMgPiBIVEFQU19NQVggfHwgaHRhcHM9PTApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHAtPmh0YXBzPSBodGFwczsKKyAgICAgICAgICAgICAgICBmb3IoaT0gaHRhcHMvMjsgaTsgaS0tKXsKKyAgICAgICAgICAgICAgICAgICAgcC0+aGNvZWZmW2ldPSBnZXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIDApICogKDEtMiooaSYxKSk7CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSBwLT5oY29lZmZbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHAtPmhjb2VmZlswXT0gMzItc3VtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+cGxhbmVbMl0uZGlhZ19tYz0gcy0+cGxhbmVbMV0uZGlhZ19tYzsKKyAgICAgICAgICAgIHMtPnBsYW5lWzJdLmh0YXBzICA9IHMtPnBsYW5lWzFdLmh0YXBzOworICAgICAgICAgICAgbWVtY3B5KHMtPnBsYW5lWzJdLmhjb2VmZiwgcy0+cGxhbmVbMV0uaGNvZWZmLCBzaXplb2Yocy0+cGxhbmVbMV0uaGNvZWZmKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoZ2V0X3JhYygmcy0+Yywgcy0+aGVhZGVyX3N0YXRlKSl7CisgICAgICAgICAgICBHRVRfUyhzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQsIDAgPCB0bXAgJiYgdG1wIDw9IE1BWF9ERUNPTVBPU0lUSU9OUykKKyAgICAgICAgICAgIGRlY29kZV9xbG9ncyhzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlKz0gZ2V0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCAxKTsKKyAgICBpZihzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZSA+IDFVKXsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZSAlZCBub3Qgc3VwcG9ydGVkXG4iLCBzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZihGRk1JTihzLT5hdmN0eC0+IHdpZHRoPj5zLT5jaHJvbWFfaF9zaGlmdCwKKyAgICAgICAgICAgICBzLT5hdmN0eC0+aGVpZ2h0Pj5zLT5jaHJvbWFfdl9zaGlmdCkgPj4gKHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudC0xKSA8PSAxKXsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQgJWQgdG9vIGxhcmdlIGZvciBzaXplXG4iLCBzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKworICAgIHMtPnFsb2cgICAgICAgICAgICs9IGdldF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMSk7CisgICAgcy0+bXZfc2NhbGUgICAgICAgKz0gZ2V0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCAxKTsKKyAgICBzLT5xYmlhcyAgICAgICAgICArPSBnZXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIDEpOworICAgIHMtPmJsb2NrX21heF9kZXB0aCs9IGdldF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMSk7CisgICAgaWYocy0+YmxvY2tfbWF4X2RlcHRoID4gMSB8fCBzLT5ibG9ja19tYXhfZGVwdGggPCAwKXsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJibG9ja19tYXhfZGVwdGg9ICVkIGlzIHRvbyBsYXJnZVxuIiwgcy0+YmxvY2tfbWF4X2RlcHRoKTsKKyAgICAgICAgcy0+YmxvY2tfbWF4X2RlcHRoPSAwOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9zbm93X2NvbW1vbl9pbml0KGF2Y3R4KSkgPCAwKSB7CisgICAgICAgIGZmX3Nub3dfY29tbW9uX2VuZChhdmN0eC0+cHJpdl9kYXRhKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYmxvY2tzKFNub3dDb250ZXh0ICpzKXsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgdz0gcy0+Yl93aWR0aDsKKyAgICBpbnQgaD0gcy0+Yl9oZWlnaHQ7CisgICAgaW50IHJlczsKKworICAgIGZvcih5PTA7IHk8aDsgeSsrKXsKKyAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICAgICAgaWYgKChyZXMgPSBkZWNvZGVfcV9icmFuY2gocywgMCwgeCwgeSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIFNub3dDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBSYW5nZUNvZGVyICogY29uc3QgYz0gJnMtPmM7CisgICAgaW50IGJ5dGVzX3JlYWQ7CisgICAgQVZGcmFtZSAqcGljdHVyZSA9IGRhdGE7CisgICAgaW50IGxldmVsLCBvcmllbnRhdGlvbiwgcGxhbmVfaW5kZXg7CisgICAgaW50IHJlczsKKworICAgIGZmX2luaXRfcmFuZ2VfZGVjb2RlcihjLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBmZl9idWlsZF9yYWNfc3RhdGVzKGMsIDAuMDUqKDFMTDw8MzIpLCAyNTYtOCk7CisKKyAgICBzLT5jdXJyZW50X3BpY3R1cmUtPnBpY3RfdHlwZT0gQVZfUElDVFVSRV9UWVBFX0k7IC8vRklYTUUgSSB2cy4gUAorICAgIGlmICgocmVzID0gZGVjb2RlX2hlYWRlcihzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworICAgIGlmICgocmVzPWZmX3Nub3dfY29tbW9uX2luaXRfYWZ0ZXJfaGVhZGVyKGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgLy8gcmVhbGxvYyBzbGljZSBidWZmZXIgZm9yIHRoZSBjYXNlIHRoYXQgc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50IGNoYW5nZWQKKyAgICBmZl9zbGljZV9idWZmZXJfZGVzdHJveSgmcy0+c2IpOworICAgIGlmICgocmVzID0gZmZfc2xpY2VfYnVmZmVyX2luaXQoJnMtPnNiLCBzLT5wbGFuZVswXS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUJfU0laRSA+PiBzLT5ibG9ja19tYXhfZGVwdGgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCAqIDExICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBsYW5lWzBdLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3BhdGlhbF9pZHd0X2J1ZmZlcikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIGZvcihwbGFuZV9pbmRleD0wOyBwbGFuZV9pbmRleCA8IHMtPm5iX3BsYW5lczsgcGxhbmVfaW5kZXgrKyl7CisgICAgICAgIFBsYW5lICpwPSAmcy0+cGxhbmVbcGxhbmVfaW5kZXhdOworICAgICAgICBwLT5mYXN0X21jPSBwLT5kaWFnX21jICYmIHAtPmh0YXBzPT02ICYmIHAtPmhjb2VmZlswXT09NDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwLT5oY29lZmZbMV09PS0xMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHAtPmhjb2VmZlsyXT09MjsKKyAgICB9CisKKyAgICBmZl9zbm93X2FsbG9jX2Jsb2NrcyhzKTsKKworICAgIGlmKChyZXMgPSBmZl9zbm93X2ZyYW1lX3N0YXJ0KHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXM7CisgICAgLy9rZXlmcmFtZSBmbGFnIGR1cGxpY2F0aW9uIG1lc3MgRklYTUUKKyAgICBpZihhdmN0eC0+ZGVidWcmRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJrZXlmcmFtZTolZCBxbG9nOiVkIHFiaWFzOiAlZCBtdnNjYWxlOiAlZCAiCisgICAgICAgICAgICAgICAiZGVjb21wb3NpdGlvbl90eXBlOiVkIGRlY29tcG9zaXRpb25fY291bnQ6JWRcbiIsCisgICAgICAgICAgICAgICBzLT5rZXlmcmFtZSwgcy0+cWxvZywgcy0+cWJpYXMsIHMtPm12X3NjYWxlLAorICAgICAgICAgICAgICAgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGUsCisgICAgICAgICAgICAgICBzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQKKyAgICAgICAgICAgICAgKTsKKworICAgIGlmICgocmVzID0gZGVjb2RlX2Jsb2NrcyhzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgZm9yKHBsYW5lX2luZGV4PTA7IHBsYW5lX2luZGV4IDwgcy0+bmJfcGxhbmVzOyBwbGFuZV9pbmRleCsrKXsKKyAgICAgICAgUGxhbmUgKnA9ICZzLT5wbGFuZVtwbGFuZV9pbmRleF07CisgICAgICAgIGludCB3PSBwLT53aWR0aDsKKyAgICAgICAgaW50IGg9IHAtPmhlaWdodDsKKyAgICAgICAgaW50IHgsIHk7CisgICAgICAgIGludCBkZWNvZGVfc3RhdGVbTUFYX0RFQ09NUE9TSVRJT05TXVs0XVsxXTsgLyogU3RvcmVkIHN0YXRlIGluZm8gZm9yIHVucGFja19jb2VmZnMuIDEgdmFyaWFibGUgcGVyIGluc3RhbmNlLiAqLworCisgICAgICAgIGlmKHMtPmF2Y3R4LT5kZWJ1ZyYyMDQ4KXsKKyAgICAgICAgICAgIG1lbXNldChzLT5zcGF0aWFsX2R3dF9idWZmZXIsIDAsIHNpemVvZihEV1RFTEVNKSp3KmgpOworICAgICAgICAgICAgcHJlZGljdF9wbGFuZShzLCBzLT5zcGF0aWFsX2lkd3RfYnVmZmVyLCBwbGFuZV9pbmRleCwgMSk7CisKKyAgICAgICAgICAgIGZvcih5PTA7IHk8aDsgeSsrKXsKKyAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PHc7IHgrKyl7CisgICAgICAgICAgICAgICAgICAgIGludCB2PSBzLT5jdXJyZW50X3BpY3R1cmUtPmRhdGFbcGxhbmVfaW5kZXhdW3kqcy0+Y3VycmVudF9waWN0dXJlLT5saW5lc2l6ZVtwbGFuZV9pbmRleF0gKyB4XTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWNvbmx5X3BpY3R1cmUtPmRhdGFbcGxhbmVfaW5kZXhdW3kqcy0+bWNvbmx5X3BpY3R1cmUtPmxpbmVzaXplW3BsYW5lX2luZGV4XSArIHhdPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgZm9yKGxldmVsPTA7IGxldmVsPHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudDsgbGV2ZWwrKyl7CisgICAgICAgICAgICBmb3Iob3JpZW50YXRpb249bGV2ZWwgPyAxIDogMDsgb3JpZW50YXRpb248NDsgb3JpZW50YXRpb24rKyl7CisgICAgICAgICAgICAgICAgU3ViQmFuZCAqYj0gJnAtPmJhbmRbbGV2ZWxdW29yaWVudGF0aW9uXTsKKyAgICAgICAgICAgICAgICB1bnBhY2tfY29lZmZzKHMsIGIsIGItPnBhcmVudCwgb3JpZW50YXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgIGNvbnN0IGludCBtYl9oPSBzLT5iX2hlaWdodCA8PCBzLT5ibG9ja19tYXhfZGVwdGg7CisgICAgICAgIGNvbnN0IGludCBibG9ja19zaXplID0gTUJfU0laRSA+PiBzLT5ibG9ja19tYXhfZGVwdGg7CisgICAgICAgIGNvbnN0IGludCBibG9ja19oICAgID0gcGxhbmVfaW5kZXggPyBibG9ja19zaXplPj5zLT5jaHJvbWFfdl9zaGlmdCA6IGJsb2NrX3NpemU7CisgICAgICAgIGludCBtYl95OworICAgICAgICBEV1RDb21wb3NlIGNzW01BWF9ERUNPTVBPU0lUSU9OU107CisgICAgICAgIGludCB5ZD0wLCB5cT0wOworICAgICAgICBpbnQgeTsKKyAgICAgICAgaW50IGVuZF95OworCisgICAgICAgIGZmX3NwYXRpYWxfaWR3dF9idWZmZXJlZF9pbml0KGNzLCAmcy0+c2IsIHcsIGgsIDEsIHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQpOworICAgICAgICBmb3IobWJfeT0wOyBtYl95PD1tYl9oOyBtYl95KyspeworCisgICAgICAgICAgICBpbnQgc2xpY2Vfc3RhcnR5ID0gYmxvY2tfaCptYl95OworICAgICAgICAgICAgaW50IHNsaWNlX2ggPSBibG9ja19oKihtYl95KzEpOworCisgICAgICAgICAgICBpZiAoIShzLT5rZXlmcmFtZSB8fCBzLT5hdmN0eC0+ZGVidWcmNTEyKSl7CisgICAgICAgICAgICAgICAgc2xpY2Vfc3RhcnR5ID0gRkZNQVgoMCwgc2xpY2Vfc3RhcnR5IC0gKGJsb2NrX2ggPj4gMSkpOworICAgICAgICAgICAgICAgIHNsaWNlX2ggLT0gKGJsb2NrX2ggPj4gMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihsZXZlbD0wOyBsZXZlbDxzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQ7IGxldmVsKyspeworICAgICAgICAgICAgICAgIGZvcihvcmllbnRhdGlvbj1sZXZlbCA/IDEgOiAwOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKKyAgICAgICAgICAgICAgICAgICAgU3ViQmFuZCAqYj0gJnAtPmJhbmRbbGV2ZWxdW29yaWVudGF0aW9uXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3k7CisgICAgICAgICAgICAgICAgICAgIGludCBlbmRfeTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG91cl9tYl9zdGFydCA9IG1iX3k7CisgICAgICAgICAgICAgICAgICAgIGludCBvdXJfbWJfZW5kID0gKG1iX3kgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGV4dHJhPSAzOworICAgICAgICAgICAgICAgICAgICBzdGFydF95ID0gKG1iX3kgPyAoKGJsb2NrX2ggKiBvdXJfbWJfc3RhcnQpID4+IChzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQgLSBsZXZlbCkpICsgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50IC0gbGV2ZWwgKyBleHRyYTogMCk7CisgICAgICAgICAgICAgICAgICAgIGVuZF95ID0gKCgoYmxvY2tfaCAqIG91cl9tYl9lbmQpID4+IChzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQgLSBsZXZlbCkpICsgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50IC0gbGV2ZWwgKyBleHRyYSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHMtPmtleWZyYW1lIHx8IHMtPmF2Y3R4LT5kZWJ1ZyY1MTIpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3kgPSBGRk1BWCgwLCBzdGFydF95IC0gKGJsb2NrX2ggPj4gKDErcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50IC0gbGV2ZWwpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmRfeSA9IEZGTUFYKDAsIGVuZF95IC0gKGJsb2NrX2ggPj4gKDErcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50IC0gbGV2ZWwpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfeSA9IEZGTUlOKGItPmhlaWdodCwgc3RhcnRfeSk7CisgICAgICAgICAgICAgICAgICAgIGVuZF95ID0gRkZNSU4oYi0+aGVpZ2h0LCBlbmRfeSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0X3kgIT0gZW5kX3kpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IDApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YkJhbmQgKiBjb3JyZWxhdGVfYmFuZCA9ICZwLT5iYW5kWzBdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3JyZWxhdGVfZW5kX3kgPSBGRk1JTihiLT5oZWlnaHQsIGVuZF95ICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcnJlbGF0ZV9zdGFydF95ID0gRkZNSU4oYi0+aGVpZ2h0LCAoc3RhcnRfeSA/IHN0YXJ0X3kgKyAxIDogMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9zdWJiYW5kX3NsaWNlX2J1ZmZlcmVkKHMsIGNvcnJlbGF0ZV9iYW5kLCAmcy0+c2IsIGNvcnJlbGF0ZV9zdGFydF95LCBjb3JyZWxhdGVfZW5kX3ksIGRlY29kZV9zdGF0ZVswXVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRlX3NsaWNlX2J1ZmZlcmVkKHMsICZzLT5zYiwgY29ycmVsYXRlX2JhbmQsIGNvcnJlbGF0ZV9iYW5kLT5pYnVmLCBjb3JyZWxhdGVfYmFuZC0+c3RyaWRlLCAxLCAwLCBjb3JyZWxhdGVfc3RhcnRfeSwgY29ycmVsYXRlX2VuZF95KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXF1YW50aXplX3NsaWNlX2J1ZmZlcmVkKHMsICZzLT5zYiwgY29ycmVsYXRlX2JhbmQsIGNvcnJlbGF0ZV9iYW5kLT5pYnVmLCBjb3JyZWxhdGVfYmFuZC0+c3RyaWRlLCBzdGFydF95LCBlbmRfeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3N1YmJhbmRfc2xpY2VfYnVmZmVyZWQocywgYiwgJnMtPnNiLCBzdGFydF95LCBlbmRfeSwgZGVjb2RlX3N0YXRlW2xldmVsXVtvcmllbnRhdGlvbl0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoOyB5ZDxzbGljZV9oOyB5ZCs9NCl7CisgICAgICAgICAgICAgICAgZmZfc3BhdGlhbF9pZHd0X2J1ZmZlcmVkX3NsaWNlKCZzLT5kd3QsIGNzLCAmcy0+c2IsIHMtPnRlbXBfaWR3dF9idWZmZXIsIHcsIGgsIDEsIHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQsIHlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYocy0+cWxvZyA9PSBMT1NTTEVTU19RTE9HKXsKKyAgICAgICAgICAgICAgICBmb3IoOyB5cTxzbGljZV9oICYmIHlxPGg7IHlxKyspeworICAgICAgICAgICAgICAgICAgICBJRFdURUxFTSAqIGxpbmUgPSBzbGljZV9idWZmZXJfZ2V0X2xpbmUoJnMtPnNiLCB5cSk7CisgICAgICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8dzsgeCsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVbeF0gPDw9IEZSQUNfQklUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJlZGljdF9zbGljZV9idWZmZXJlZChzLCAmcy0+c2IsIHMtPnNwYXRpYWxfaWR3dF9idWZmZXIsIHBsYW5lX2luZGV4LCAxLCBtYl95KTsKKworICAgICAgICAgICAgeSA9IEZGTUlOKHAtPmhlaWdodCwgc2xpY2Vfc3RhcnR5KTsKKyAgICAgICAgICAgIGVuZF95ID0gRkZNSU4ocC0+aGVpZ2h0LCBzbGljZV9oKTsKKyAgICAgICAgICAgIHdoaWxlKHkgPCBlbmRfeSkKKyAgICAgICAgICAgICAgICBmZl9zbGljZV9idWZmZXJfcmVsZWFzZSgmcy0+c2IsIHkrKyk7CisgICAgICAgIH0KKworICAgICAgICBmZl9zbGljZV9idWZmZXJfZmx1c2goJnMtPnNiKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgZW1tc19jKCk7CisKKyAgICBmZl9zbm93X3JlbGVhc2VfYnVmZmVyKGF2Y3R4KTsKKworICAgIGlmKCEocy0+YXZjdHgtPmRlYnVnJjIwNDgpKQorICAgICAgICByZXMgPSBhdl9mcmFtZV9yZWYocGljdHVyZSwgcy0+Y3VycmVudF9waWN0dXJlKTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IGF2X2ZyYW1lX3JlZihwaWN0dXJlLCBzLT5tY29ubHlfcGljdHVyZSk7CisKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgYnl0ZXNfcmVhZD0gYy0+Ynl0ZXN0cmVhbSAtIGMtPmJ5dGVzdHJlYW1fc3RhcnQ7CisgICAgaWYoYnl0ZXNfcmVhZCA9PTApIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgYXQgZW5kIG9mIGZyYW1lXG4iKTsgLy9GSVhNRQorCisgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTbm93Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmZl9zbGljZV9idWZmZXJfZGVzdHJveSgmcy0+c2IpOworCisgICAgZmZfc25vd19jb21tb25fZW5kKHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfc25vd19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzbm93IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU25vdyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TTk9XLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTbm93Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSAvKnwgQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCovLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Nub3dlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Nub3dlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmM4OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc25vd2VuYy5jCkBAIC0wLDAgKzEsMjAyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludG1hdGguaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInNub3dfZHd0LmgiCisjaW5jbHVkZSAic25vdy5oIgorCisjaW5jbHVkZSAicmFuZ2Vjb2Rlci5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKworI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgImgyNjMuaCIKKworc3RhdGljIGF2X2NvbGQgaW50IGVuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTbm93Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHBsYW5lX2luZGV4LCByZXQ7CisgICAgaW50IGk7CisKKyAgICBpZihhdmN0eC0+cHJlZGljdGlvbl9tZXRob2QgPT0gRFdUXzk3CisgICAgICAgJiYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUVNDQUxFKQorICAgICAgICYmIGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSA9PSAwKXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGUgOS83IHdhdmVsZXQgaXMgaW5jb21wYXRpYmxlIHdpdGggbG9zc2xlc3MgbW9kZS5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGU9IGF2Y3R4LT5wcmVkaWN0aW9uX21ldGhvZDsgLy9GSVhNRSBhZGQgZGVjb3JyZWxhdG9yIHR5cGUgciB0cmFuc2Zvcm1fdHlwZQorCisgICAgcy0+bXZfc2NhbGUgICAgICAgPSAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RUEVMKSA/IDIgOiA0OworICAgIHMtPmJsb2NrX21heF9kZXB0aD0gKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfNE1WICkgPyAxIDogMDsKKworICAgIGZvcihwbGFuZV9pbmRleD0wOyBwbGFuZV9pbmRleDwzOyBwbGFuZV9pbmRleCsrKXsKKyAgICAgICAgcy0+cGxhbmVbcGxhbmVfaW5kZXhdLmRpYWdfbWM9IDE7CisgICAgICAgIHMtPnBsYW5lW3BsYW5lX2luZGV4XS5odGFwcz0gNjsKKyAgICAgICAgcy0+cGxhbmVbcGxhbmVfaW5kZXhdLmhjb2VmZlswXT0gIDQwOworICAgICAgICBzLT5wbGFuZVtwbGFuZV9pbmRleF0uaGNvZWZmWzFdPSAtMTA7CisgICAgICAgIHMtPnBsYW5lW3BsYW5lX2luZGV4XS5oY29lZmZbMl09ICAgMjsKKyAgICAgICAgcy0+cGxhbmVbcGxhbmVfaW5kZXhdLmZhc3RfbWM9IDE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9zbm93X2NvbW1vbl9pbml0KGF2Y3R4KSkgPCAwKSB7CisgICAgICAgIGZmX3Nub3dfY29tbW9uX2VuZChhdmN0eC0+cHJpdl9kYXRhKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZmZfbXBlZ3ZpZGVvZW5jZHNwX2luaXQoJnMtPm1wdmVuY2RzcCwgYXZjdHgpOworCisgICAgZmZfc25vd19hbGxvY19ibG9ja3Mocyk7CisKKyAgICBzLT52ZXJzaW9uPTA7CisKKyAgICBzLT5tLmF2Y3R4ICAgPSBhdmN0eDsKKyAgICBzLT5tLmZsYWdzICAgPSBhdmN0eC0+ZmxhZ3M7CisgICAgcy0+bS5iaXRfcmF0ZT0gYXZjdHgtPmJpdF9yYXRlOworCisgICAgcy0+bS5tZS50ZW1wICAgICAgPQorICAgIHMtPm0ubWUuc2NyYXRjaHBhZD0gYXZfbWFsbG9jel9hcnJheSgoYXZjdHgtPndpZHRoKzY0KSwgMioxNioyKnNpemVvZih1aW50OF90KSk7CisgICAgcy0+bS5tZS5tYXAgICAgICAgPSBhdl9tYWxsb2N6KE1FX01BUF9TSVpFKnNpemVvZih1aW50MzJfdCkpOworICAgIHMtPm0ubWUuc2NvcmVfbWFwID0gYXZfbWFsbG9jeihNRV9NQVBfU0laRSpzaXplb2YodWludDMyX3QpKTsKKyAgICBzLT5tLm9ibWNfc2NyYXRjaHBhZD0gYXZfbWFsbG9jeihNQl9TSVpFKk1CX1NJWkUqMTIqc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgaWYgKCFzLT5tLm1lLnNjcmF0Y2hwYWQgfHwgIXMtPm0ubWUubWFwIHx8ICFzLT5tLm1lLnNjb3JlX21hcCB8fCAhcy0+bS5vYm1jX3NjcmF0Y2hwYWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmZl9oMjYzX2VuY29kZV9pbml0KCZzLT5tKTsgLy9tdl9wZW5hbHR5CisKKyAgICBzLT5tYXhfcmVmX2ZyYW1lcyA9IEZGTUFYKEZGTUlOKGF2Y3R4LT5yZWZzLCBNQVhfUkVGX0ZSQU1FUyksIDEpOworCisgICAgaWYoYXZjdHgtPmZsYWdzJkNPREVDX0ZMQUdfUEFTUzEpeworICAgICAgICBpZighYXZjdHgtPnN0YXRzX291dCkKKyAgICAgICAgICAgIGF2Y3R4LT5zdGF0c19vdXQgPSBhdl9tYWxsb2N6KDI1Nik7CisKKyAgICAgICAgaWYgKCFhdmN0eC0+c3RhdHNfb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgaWYoKGF2Y3R4LT5mbGFncyZDT0RFQ19GTEFHX1BBU1MyKSB8fCAhKGF2Y3R4LT5mbGFncyZDT0RFQ19GTEFHX1FTQ0FMRSkpeworICAgICAgICBpZihmZl9yYXRlX2NvbnRyb2xfaW5pdCgmcy0+bSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzLT5wYXNzMV9yYz0gIShhdmN0eC0+ZmxhZ3MgJiAoQ09ERUNfRkxBR19RU0NBTEV8Q09ERUNfRkxBR19QQVNTMikpOworCisgICAgc3dpdGNoKGF2Y3R4LT5waXhfZm10KXsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKy8vICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorLy8gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQxMVA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQxMFA6CisgICAgICAgIHMtPm5iX3BsYW5lcyA9IDM7CisgICAgICAgIHMtPmNvbG9yc3BhY2VfdHlwZT0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgICAgICBzLT5uYl9wbGFuZXMgPSAxOworICAgICAgICBzLT5jb2xvcnNwYWNlX3R5cGUgPSAxOworICAgICAgICBicmVhazsKKy8qICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjoKKyAgICAgICAgcy0+Y29sb3JzcGFjZT0gMTsKKyAgICAgICAgYnJlYWs7Ki8KKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBpeGVsIGZvcm1hdCBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmN0eC0+cGl4X2ZtdCwgJnMtPmNocm9tYV9oX3NoaWZ0LCAmcy0+Y2hyb21hX3Zfc2hpZnQpOworCisgICAgZmZfc2V0X2NtcCgmcy0+bWVjYywgcy0+bWVjYy5tZV9jbXAsIHMtPmF2Y3R4LT5tZV9jbXApOworICAgIGZmX3NldF9jbXAoJnMtPm1lY2MsIHMtPm1lY2MubWVfc3ViX2NtcCwgcy0+YXZjdHgtPm1lX3N1Yl9jbXApOworCisgICAgcy0+aW5wdXRfcGljdHVyZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5pbnB1dF9waWN0dXJlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKChyZXQgPSBmZl9zbm93X2dldF9idWZmZXIocywgcy0+aW5wdXRfcGljdHVyZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmKHMtPmF2Y3R4LT5tZV9tZXRob2QgPT0gTUVfSVRFUil7CisgICAgICAgIGludCBzaXplPSBzLT5iX3dpZHRoICogcy0+Yl9oZWlnaHQgPDwgMipzLT5ibG9ja19tYXhfZGVwdGg7CisgICAgICAgIGZvcihpPTA7IGk8cy0+bWF4X3JlZl9mcmFtZXM7IGkrKyl7CisgICAgICAgICAgICBzLT5yZWZfbXZzW2ldPSBhdl9tYWxsb2N6X2FycmF5KHNpemUsIHNpemVvZihpbnQxNl90WzJdKSk7CisgICAgICAgICAgICBzLT5yZWZfc2NvcmVzW2ldPSBhdl9tYWxsb2N6X2FycmF5KHNpemUsIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICAgICAgaWYgKCFzLT5yZWZfbXZzW2ldIHx8ICFzLT5yZWZfc2NvcmVzW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLy9uZWFyIGNvcHkgJiBwYXN0ZSBmcm9tIGRzcHV0aWwsIEZJWE1FCitzdGF0aWMgaW50IHBpeF9zdW0odWludDhfdCAqIHBpeCwgaW50IGxpbmVfc2l6ZSwgaW50IHcsIGludCBoKQoreworICAgIGludCBzLCBpLCBqOworCisgICAgcyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKSB7CisgICAgICAgICAgICBzICs9IHBpeFswXTsKKyAgICAgICAgICAgIHBpeCArKzsKKyAgICAgICAgfQorICAgICAgICBwaXggKz0gbGluZV9zaXplIC0gdzsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKKy8vbmVhciBjb3B5ICYgcGFzdGUgZnJvbSBkc3B1dGlsLCBGSVhNRQorc3RhdGljIGludCBwaXhfbm9ybTEodWludDhfdCAqIHBpeCwgaW50IGxpbmVfc2l6ZSwgaW50IHcpCit7CisgICAgaW50IHMsIGksIGo7CisgICAgdWludDMyX3QgKnNxID0gZmZfc3F1YXJlX3RhYiArIDI1NjsKKworICAgIHMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGogKyspIHsKKyAgICAgICAgICAgIHMgKz0gc3FbcGl4WzBdXTsKKyAgICAgICAgICAgIHBpeCArKzsKKyAgICAgICAgfQorICAgICAgICBwaXggKz0gbGluZV9zaXplIC0gdzsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9wZW5hbHR5X2ZhY3RvcihpbnQgbGFtYmRhLCBpbnQgbGFtYmRhMiwgaW50IHR5cGUpeworICAgIHN3aXRjaCh0eXBlJjB4RkYpeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBGRl9DTVBfU0FEOgorICAgICAgICByZXR1cm4gbGFtYmRhPj5GRl9MQU1CREFfU0hJRlQ7CisgICAgY2FzZSBGRl9DTVBfRENUOgorICAgICAgICByZXR1cm4gKDMqbGFtYmRhKT4+KEZGX0xBTUJEQV9TSElGVCsxKTsKKyAgICBjYXNlIEZGX0NNUF9XNTM6CisgICAgICAgIHJldHVybiAoNCpsYW1iZGEpPj4oRkZfTEFNQkRBX1NISUZUKTsKKyAgICBjYXNlIEZGX0NNUF9XOTc6CisgICAgICAgIHJldHVybiAoMipsYW1iZGEpPj4oRkZfTEFNQkRBX1NISUZUKTsKKyAgICBjYXNlIEZGX0NNUF9TQVREOgorICAgIGNhc2UgRkZfQ01QX0RDVDI2NDoKKyAgICAgICAgcmV0dXJuICgyKmxhbWJkYSk+PkZGX0xBTUJEQV9TSElGVDsKKyAgICBjYXNlIEZGX0NNUF9SRDoKKyAgICBjYXNlIEZGX0NNUF9QU05SOgorICAgIGNhc2UgRkZfQ01QX1NTRToKKyAgICBjYXNlIEZGX0NNUF9OU1NFOgorICAgICAgICByZXR1cm4gbGFtYmRhMj4+RkZfTEFNQkRBX1NISUZUOworICAgIGNhc2UgRkZfQ01QX0JJVDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisvL0ZJWE1FIGNvcHkmcGFzdGUKKyNkZWZpbmUgUF9MRUZUIFBbMV0KKyNkZWZpbmUgUF9UT1AgUFsyXQorI2RlZmluZSBQX1RPUFJJR0hUIFBbM10KKyNkZWZpbmUgUF9NRURJQU4gUFs0XQorI2RlZmluZSBQX01WMSBQWzldCisjZGVmaW5lIEZMQUdfUVBFTCAgIDEgLy9tdXN0IGJlIDEKKworc3RhdGljIGludCBlbmNvZGVfcV9icmFuY2goU25vd0NvbnRleHQgKnMsIGludCBsZXZlbCwgaW50IHgsIGludCB5KXsKKyAgICB1aW50OF90IHBfYnVmZmVyWzEwMjRdOworICAgIHVpbnQ4X3QgaV9idWZmZXJbMTAyNF07CisgICAgdWludDhfdCBwX3N0YXRlW3NpemVvZihzLT5ibG9ja19zdGF0ZSldOworICAgIHVpbnQ4X3QgaV9zdGF0ZVtzaXplb2Yocy0+YmxvY2tfc3RhdGUpXTsKKyAgICBSYW5nZUNvZGVyIHBjLCBpYzsKKyAgICB1aW50OF90ICpwYmJhaz0gcy0+Yy5ieXRlc3RyZWFtOworICAgIHVpbnQ4X3QgKnBiYmFrX3N0YXJ0PSBzLT5jLmJ5dGVzdHJlYW1fc3RhcnQ7CisgICAgaW50IHNjb3JlLCBzY29yZTIsIGlzY29yZSwgaV9sZW4sIHBfbGVuLCBibG9ja19zLCBzdW0sIGJhc2VfYml0czsKKyAgICBjb25zdCBpbnQgdz0gcy0+Yl93aWR0aCAgPDwgcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIGNvbnN0IGludCBoPSBzLT5iX2hlaWdodCA8PCBzLT5ibG9ja19tYXhfZGVwdGg7CisgICAgY29uc3QgaW50IHJlbV9kZXB0aD0gcy0+YmxvY2tfbWF4X2RlcHRoIC0gbGV2ZWw7CisgICAgY29uc3QgaW50IGluZGV4PSAoeCArIHkqdykgPDwgcmVtX2RlcHRoOworICAgIGNvbnN0IGludCBibG9ja193PSAxPDwoTE9HMl9NQl9TSVpFIC0gbGV2ZWwpOworICAgIGludCB0cng9ICh4KzEpPDxyZW1fZGVwdGg7CisgICAgaW50IHRyeT0gKHkrMSk8PHJlbV9kZXB0aDsKKyAgICBjb25zdCBCbG9ja05vZGUgKmxlZnQgID0geCA/ICZzLT5ibG9ja1tpbmRleC0xXSA6ICZudWxsX2Jsb2NrOworICAgIGNvbnN0IEJsb2NrTm9kZSAqdG9wICAgPSB5ID8gJnMtPmJsb2NrW2luZGV4LXddIDogJm51bGxfYmxvY2s7CisgICAgY29uc3QgQmxvY2tOb2RlICpyaWdodCA9IHRyeDx3ID8gJnMtPmJsb2NrW2luZGV4KzFdIDogJm51bGxfYmxvY2s7CisgICAgY29uc3QgQmxvY2tOb2RlICpib3R0b209IHRyeTxoID8gJnMtPmJsb2NrW2luZGV4K3ddIDogJm51bGxfYmxvY2s7CisgICAgY29uc3QgQmxvY2tOb2RlICp0bCAgICA9IHkgJiYgeCA/ICZzLT5ibG9ja1tpbmRleC13LTFdIDogbGVmdDsKKyAgICBjb25zdCBCbG9ja05vZGUgKnRyICAgID0geSAmJiB0cng8dyAmJiAoKHgmMSk9PTAgfHwgbGV2ZWw9PTApID8gJnMtPmJsb2NrW2luZGV4LXcrKDE8PHJlbV9kZXB0aCldIDogdGw7IC8vRklYTUUgdXNlIGx0CisgICAgaW50IHBsID0gbGVmdC0+Y29sb3JbMF07CisgICAgaW50IHBjYj0gbGVmdC0+Y29sb3JbMV07CisgICAgaW50IHBjcj0gbGVmdC0+Y29sb3JbMl07CisgICAgaW50IHBteCwgcG15OworICAgIGludCBteD0wLCBteT0wOworICAgIGludCBsLGNyLGNiOworICAgIGNvbnN0IGludCBzdHJpZGU9IHMtPmN1cnJlbnRfcGljdHVyZS0+bGluZXNpemVbMF07CisgICAgY29uc3QgaW50IHV2c3RyaWRlPSBzLT5jdXJyZW50X3BpY3R1cmUtPmxpbmVzaXplWzFdOworICAgIHVpbnQ4X3QgKmN1cnJlbnRfZGF0YVszXT0geyBzLT5pbnB1dF9waWN0dXJlLT5kYXRhWzBdICsgKHggKyB5KiAgc3RyaWRlKSpibG9ja193LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnB1dF9waWN0dXJlLT5kYXRhWzFdICsgKCh4KmJsb2NrX3cpPj5zLT5jaHJvbWFfaF9zaGlmdCkgKyAoKHkqdXZzdHJpZGUqYmxvY2tfdyk+PnMtPmNocm9tYV92X3NoaWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfcGljdHVyZS0+ZGF0YVsyXSArICgoeCpibG9ja193KT4+cy0+Y2hyb21hX2hfc2hpZnQpICsgKCh5KnV2c3RyaWRlKmJsb2NrX3cpPj5zLT5jaHJvbWFfdl9zaGlmdCl9OworICAgIGludCBQWzEwXVsyXTsKKyAgICBpbnQxNl90IGxhc3RfbXZbM11bMl07CisgICAgaW50IHFwZWw9ICEhKHMtPmF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUVBFTCk7IC8vdW51c2VkCisgICAgY29uc3QgaW50IHNoaWZ0PSAxK3FwZWw7CisgICAgTW90aW9uRXN0Q29udGV4dCAqYz0gJnMtPm0ubWU7CisgICAgaW50IHJlZl9jb250ZXh0PSBhdl9sb2cyKDIqbGVmdC0+cmVmKSArIGF2X2xvZzIoMip0b3AtPnJlZik7CisgICAgaW50IG14X2NvbnRleHQ9IGF2X2xvZzIoMipGRkFCUyhsZWZ0LT5teCAtIHRvcC0+bXgpKTsKKyAgICBpbnQgbXlfY29udGV4dD0gYXZfbG9nMigyKkZGQUJTKGxlZnQtPm15IC0gdG9wLT5teSkpOworICAgIGludCBzX2NvbnRleHQ9IDIqbGVmdC0+bGV2ZWwgKyAyKnRvcC0+bGV2ZWwgKyB0bC0+bGV2ZWwgKyB0ci0+bGV2ZWw7CisgICAgaW50IHJlZiwgYmVzdF9yZWYsIHJlZl9zY29yZSwgcmVmX214LCByZWZfbXk7CisKKyAgICBhdl9hc3NlcnQwKHNpemVvZihzLT5ibG9ja19zdGF0ZSkgPj0gMjU2KTsKKyAgICBpZihzLT5rZXlmcmFtZSl7CisgICAgICAgIHNldF9ibG9ja3MocywgbGV2ZWwsIHgsIHksIHBsLCBwY2IsIHBjciwgMCwgMCwgMCwgQkxPQ0tfSU5UUkEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKy8vICAgIGNsaXAgcHJlZGljdG9ycyAvIGVkZ2UgPworCisgICAgUF9MRUZUWzBdPSBsZWZ0LT5teDsKKyAgICBQX0xFRlRbMV09IGxlZnQtPm15OworICAgIFBfVE9QIFswXT0gdG9wLT5teDsKKyAgICBQX1RPUCBbMV09IHRvcC0+bXk7CisgICAgUF9UT1BSSUdIVFswXT0gdHItPm14OworICAgIFBfVE9QUklHSFRbMV09IHRyLT5teTsKKworICAgIGxhc3RfbXZbMF1bMF09IHMtPmJsb2NrW2luZGV4XS5teDsKKyAgICBsYXN0X212WzBdWzFdPSBzLT5ibG9ja1tpbmRleF0ubXk7CisgICAgbGFzdF9tdlsxXVswXT0gcmlnaHQtPm14OworICAgIGxhc3RfbXZbMV1bMV09IHJpZ2h0LT5teTsKKyAgICBsYXN0X212WzJdWzBdPSBib3R0b20tPm14OworICAgIGxhc3RfbXZbMl1bMV09IGJvdHRvbS0+bXk7CisKKyAgICBzLT5tLm1iX3N0cmlkZT0yOworICAgIHMtPm0ubWJfeD0KKyAgICBzLT5tLm1iX3k9IDA7CisgICAgYy0+c2tpcD0gMDsKKworICAgIGF2X2Fzc2VydDEoYy0+ICBzdHJpZGUgPT0gICBzdHJpZGUpOworICAgIGF2X2Fzc2VydDEoYy0+dXZzdHJpZGUgPT0gdXZzdHJpZGUpOworCisgICAgYy0+cGVuYWx0eV9mYWN0b3IgICAgPSBnZXRfcGVuYWx0eV9mYWN0b3Iocy0+bGFtYmRhLCBzLT5sYW1iZGEyLCBjLT5hdmN0eC0+bWVfY21wKTsKKyAgICBjLT5zdWJfcGVuYWx0eV9mYWN0b3I9IGdldF9wZW5hbHR5X2ZhY3RvcihzLT5sYW1iZGEsIHMtPmxhbWJkYTIsIGMtPmF2Y3R4LT5tZV9zdWJfY21wKTsKKyAgICBjLT5tYl9wZW5hbHR5X2ZhY3RvciA9IGdldF9wZW5hbHR5X2ZhY3RvcihzLT5sYW1iZGEsIHMtPmxhbWJkYTIsIGMtPmF2Y3R4LT5tYl9jbXApOworICAgIGMtPmN1cnJlbnRfbXZfcGVuYWx0eT0gYy0+bXZfcGVuYWx0eVtzLT5tLmZfY29kZT0xXSArIE1BWF9NVjsKKworICAgIGMtPnhtaW4gPSAtIHgqYmxvY2tfdyAtIDE2KzM7CisgICAgYy0+eW1pbiA9IC0geSpibG9ja193IC0gMTYrMzsKKyAgICBjLT54bWF4ID0gLSAoeCsxKSpibG9ja193ICsgKHc8PChMT0cyX01CX1NJWkUgLSBzLT5ibG9ja19tYXhfZGVwdGgpKSArIDE2LTM7CisgICAgYy0+eW1heCA9IC0gKHkrMSkqYmxvY2tfdyArIChoPDwoTE9HMl9NQl9TSVpFIC0gcy0+YmxvY2tfbWF4X2RlcHRoKSkgKyAxNi0zOworCisgICAgaWYoUF9MRUZUWzBdICAgICA+IChjLT54bWF4PDxzaGlmdCkpIFBfTEVGVFswXSAgICA9IChjLT54bWF4PDxzaGlmdCk7CisgICAgaWYoUF9MRUZUWzFdICAgICA+IChjLT55bWF4PDxzaGlmdCkpIFBfTEVGVFsxXSAgICA9IChjLT55bWF4PDxzaGlmdCk7CisgICAgaWYoUF9UT1BbMF0gICAgICA+IChjLT54bWF4PDxzaGlmdCkpIFBfVE9QWzBdICAgICA9IChjLT54bWF4PDxzaGlmdCk7CisgICAgaWYoUF9UT1BbMV0gICAgICA+IChjLT55bWF4PDxzaGlmdCkpIFBfVE9QWzFdICAgICA9IChjLT55bWF4PDxzaGlmdCk7CisgICAgaWYoUF9UT1BSSUdIVFswXSA8IChjLT54bWluPDxzaGlmdCkpIFBfVE9QUklHSFRbMF09IChjLT54bWluPDxzaGlmdCk7CisgICAgaWYoUF9UT1BSSUdIVFswXSA+IChjLT54bWF4PDxzaGlmdCkpIFBfVE9QUklHSFRbMF09IChjLT54bWF4PDxzaGlmdCk7IC8vZHVlIHRvIHBteCBubyBjbGlwCisgICAgaWYoUF9UT1BSSUdIVFsxXSA+IChjLT55bWF4PDxzaGlmdCkpIFBfVE9QUklHSFRbMV09IChjLT55bWF4PDxzaGlmdCk7CisKKyAgICBQX01FRElBTlswXT0gbWlkX3ByZWQoUF9MRUZUWzBdLCBQX1RPUFswXSwgUF9UT1BSSUdIVFswXSk7CisgICAgUF9NRURJQU5bMV09IG1pZF9wcmVkKFBfTEVGVFsxXSwgUF9UT1BbMV0sIFBfVE9QUklHSFRbMV0pOworCisgICAgaWYgKCF5KSB7CisgICAgICAgIGMtPnByZWRfeD0gUF9MRUZUWzBdOworICAgICAgICBjLT5wcmVkX3k9IFBfTEVGVFsxXTsKKyAgICB9IGVsc2UgeworICAgICAgICBjLT5wcmVkX3ggPSBQX01FRElBTlswXTsKKyAgICAgICAgYy0+cHJlZF95ID0gUF9NRURJQU5bMV07CisgICAgfQorCisgICAgc2NvcmU9IElOVF9NQVg7CisgICAgYmVzdF9yZWY9IDA7CisgICAgZm9yKHJlZj0wOyByZWY8cy0+cmVmX2ZyYW1lczsgcmVmKyspeworICAgICAgICBpbml0X3JlZihjLCBjdXJyZW50X2RhdGEsIHMtPmxhc3RfcGljdHVyZVtyZWZdLT5kYXRhLCBOVUxMLCBibG9ja193KngsIGJsb2NrX3cqeSwgMCk7CisKKyAgICAgICAgcmVmX3Njb3JlPSBmZl9lcHpzX21vdGlvbl9zZWFyY2goJnMtPm0sICZyZWZfbXgsICZyZWZfbXksIFAsIDAsIC8qcmVmX2luZGV4Ki8gMCwgbGFzdF9tdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE2KT4+c2hpZnQsIGxldmVsLUxPRzJfTUJfU0laRSs0LCBibG9ja193KTsKKworICAgICAgICBhdl9hc3NlcnQyKHJlZl9teCA+PSBjLT54bWluKTsKKyAgICAgICAgYXZfYXNzZXJ0MihyZWZfbXggPD0gYy0+eG1heCk7CisgICAgICAgIGF2X2Fzc2VydDIocmVmX215ID49IGMtPnltaW4pOworICAgICAgICBhdl9hc3NlcnQyKHJlZl9teSA8PSBjLT55bWF4KTsKKworICAgICAgICByZWZfc2NvcmU9IGMtPnN1Yl9tb3Rpb25fc2VhcmNoKCZzLT5tLCAmcmVmX214LCAmcmVmX215LCByZWZfc2NvcmUsIDAsIDAsIGxldmVsLUxPRzJfTUJfU0laRSs0LCBibG9ja193KTsKKyAgICAgICAgcmVmX3Njb3JlPSBmZl9nZXRfbWJfc2NvcmUoJnMtPm0sIHJlZl9teCwgcmVmX215LCAwLCAwLCBsZXZlbC1MT0cyX01CX1NJWkUrNCwgYmxvY2tfdywgMCk7CisgICAgICAgIHJlZl9zY29yZSs9IDIqYXZfbG9nMigyKnJlZikqYy0+cGVuYWx0eV9mYWN0b3I7CisgICAgICAgIGlmKHMtPnJlZl9tdnNbcmVmXSl7CisgICAgICAgICAgICBzLT5yZWZfbXZzW3JlZl1baW5kZXhdWzBdPSByZWZfbXg7CisgICAgICAgICAgICBzLT5yZWZfbXZzW3JlZl1baW5kZXhdWzFdPSByZWZfbXk7CisgICAgICAgICAgICBzLT5yZWZfc2NvcmVzW3JlZl1baW5kZXhdPSByZWZfc2NvcmU7CisgICAgICAgIH0KKyAgICAgICAgaWYoc2NvcmUgPiByZWZfc2NvcmUpeworICAgICAgICAgICAgc2NvcmU9IHJlZl9zY29yZTsKKyAgICAgICAgICAgIGJlc3RfcmVmPSByZWY7CisgICAgICAgICAgICBteD0gcmVmX214OworICAgICAgICAgICAgbXk9IHJlZl9teTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvL0ZJWE1FIGlmIG1iX2NtcCAhPSBTU0UgdGhlbiBpbnRyYSBjYW5ub3QgYmUgY29tcGFyZWQgY3VycmVudGx5IGFuZCBtYl9wZW5hbHR5IHZzLiBsYW1iZGEyCisKKyAgLy8gIHN1YnBlbCBzZWFyY2gKKyAgICBiYXNlX2JpdHM9IGdldF9yYWNfY291bnQoJnMtPmMpIC0gOCoocy0+Yy5ieXRlc3RyZWFtIC0gcy0+Yy5ieXRlc3RyZWFtX3N0YXJ0KTsKKyAgICBwYz0gcy0+YzsKKyAgICBwYy5ieXRlc3RyZWFtX3N0YXJ0PQorICAgIHBjLmJ5dGVzdHJlYW09IHBfYnVmZmVyOyAvL0ZJWE1FIGVuZC9zdGFydD8gYW5kIGF0IHRoZSBvdGhlciBzdG9vCisgICAgbWVtY3B5KHBfc3RhdGUsIHMtPmJsb2NrX3N0YXRlLCBzaXplb2Yocy0+YmxvY2tfc3RhdGUpKTsKKworICAgIGlmKGxldmVsIT1zLT5ibG9ja19tYXhfZGVwdGgpCisgICAgICAgIHB1dF9yYWMoJnBjLCAmcF9zdGF0ZVs0ICsgc19jb250ZXh0XSwgMSk7CisgICAgcHV0X3JhYygmcGMsICZwX3N0YXRlWzEgKyBsZWZ0LT50eXBlICsgdG9wLT50eXBlXSwgMCk7CisgICAgaWYocy0+cmVmX2ZyYW1lcyA+IDEpCisgICAgICAgIHB1dF9zeW1ib2woJnBjLCAmcF9zdGF0ZVsxMjggKyAxMDI0ICsgMzIqcmVmX2NvbnRleHRdLCBiZXN0X3JlZiwgMCk7CisgICAgcHJlZF9tdihzLCAmcG14LCAmcG15LCBiZXN0X3JlZiwgbGVmdCwgdG9wLCB0cik7CisgICAgcHV0X3N5bWJvbCgmcGMsICZwX3N0YXRlWzEyOCArIDMyKihteF9jb250ZXh0ICsgMTYqISFiZXN0X3JlZildLCBteCAtIHBteCwgMSk7CisgICAgcHV0X3N5bWJvbCgmcGMsICZwX3N0YXRlWzEyOCArIDMyKihteV9jb250ZXh0ICsgMTYqISFiZXN0X3JlZildLCBteSAtIHBteSwgMSk7CisgICAgcF9sZW49IHBjLmJ5dGVzdHJlYW0gLSBwYy5ieXRlc3RyZWFtX3N0YXJ0OworICAgIHNjb3JlICs9IChzLT5sYW1iZGEyKihnZXRfcmFjX2NvdW50KCZwYyktYmFzZV9iaXRzKSk+PkZGX0xBTUJEQV9TSElGVDsKKworICAgIGJsb2NrX3M9IGJsb2NrX3cqYmxvY2tfdzsKKyAgICBzdW0gPSBwaXhfc3VtKGN1cnJlbnRfZGF0YVswXSwgc3RyaWRlLCBibG9ja193LCBibG9ja193KTsKKyAgICBsPSAoc3VtICsgYmxvY2tfcy8yKS9ibG9ja19zOworICAgIGlzY29yZSA9IHBpeF9ub3JtMShjdXJyZW50X2RhdGFbMF0sIHN0cmlkZSwgYmxvY2tfdykgLSAyKmwqc3VtICsgbCpsKmJsb2NrX3M7CisKKyAgICBpZiAocy0+bmJfcGxhbmVzID4gMikgeworICAgICAgICBibG9ja19zPSBibG9ja193KmJsb2NrX3c+PihzLT5jaHJvbWFfaF9zaGlmdCArIHMtPmNocm9tYV92X3NoaWZ0KTsKKyAgICAgICAgc3VtID0gcGl4X3N1bShjdXJyZW50X2RhdGFbMV0sIHV2c3RyaWRlLCBibG9ja193Pj5zLT5jaHJvbWFfaF9zaGlmdCwgYmxvY2tfdz4+cy0+Y2hyb21hX3Zfc2hpZnQpOworICAgICAgICBjYj0gKHN1bSArIGJsb2NrX3MvMikvYmxvY2tfczsKKyAgICAvLyAgICBpc2NvcmUgKz0gcGl4X25vcm0xKCZjdXJyZW50X21iWzFdWzBdLCB1dnN0cmlkZSwgYmxvY2tfdz4+MSkgLSAyKmNiKnN1bSArIGNiKmNiKmJsb2NrX3M7CisgICAgICAgIHN1bSA9IHBpeF9zdW0oY3VycmVudF9kYXRhWzJdLCB1dnN0cmlkZSwgYmxvY2tfdz4+cy0+Y2hyb21hX2hfc2hpZnQsIGJsb2NrX3c+PnMtPmNocm9tYV92X3NoaWZ0KTsKKyAgICAgICAgY3I9IChzdW0gKyBibG9ja19zLzIpL2Jsb2NrX3M7CisgICAgLy8gICAgaXNjb3JlICs9IHBpeF9ub3JtMSgmY3VycmVudF9tYlsyXVswXSwgdXZzdHJpZGUsIGJsb2NrX3c+PjEpIC0gMipjcipzdW0gKyBjcipjcipibG9ja19zOworICAgIH1lbHNlCisgICAgICAgIGNiID0gY3IgPSAwOworCisgICAgaWM9IHMtPmM7CisgICAgaWMuYnl0ZXN0cmVhbV9zdGFydD0KKyAgICBpYy5ieXRlc3RyZWFtPSBpX2J1ZmZlcjsgLy9GSVhNRSBlbmQvc3RhcnQ/IGFuZCBhdCB0aGUgb3RoZXIgc3RvbworICAgIG1lbWNweShpX3N0YXRlLCBzLT5ibG9ja19zdGF0ZSwgc2l6ZW9mKHMtPmJsb2NrX3N0YXRlKSk7CisgICAgaWYobGV2ZWwhPXMtPmJsb2NrX21heF9kZXB0aCkKKyAgICAgICAgcHV0X3JhYygmaWMsICZpX3N0YXRlWzQgKyBzX2NvbnRleHRdLCAxKTsKKyAgICBwdXRfcmFjKCZpYywgJmlfc3RhdGVbMSArIGxlZnQtPnR5cGUgKyB0b3AtPnR5cGVdLCAxKTsKKyAgICBwdXRfc3ltYm9sKCZpYywgJmlfc3RhdGVbMzJdLCAgbC1wbCAsIDEpOworICAgIGlmIChzLT5uYl9wbGFuZXMgPiAyKSB7CisgICAgICAgIHB1dF9zeW1ib2woJmljLCAmaV9zdGF0ZVs2NF0sIGNiLXBjYiwgMSk7CisgICAgICAgIHB1dF9zeW1ib2woJmljLCAmaV9zdGF0ZVs5Nl0sIGNyLXBjciwgMSk7CisgICAgfQorICAgIGlfbGVuPSBpYy5ieXRlc3RyZWFtIC0gaWMuYnl0ZXN0cmVhbV9zdGFydDsKKyAgICBpc2NvcmUgKz0gKHMtPmxhbWJkYTIqKGdldF9yYWNfY291bnQoJmljKS1iYXNlX2JpdHMpKT4+RkZfTEFNQkRBX1NISUZUOworCisgICAgYXZfYXNzZXJ0MShpc2NvcmUgPCAyNTUqMjU1KjI1NiArIHMtPmxhbWJkYTIqMTApOworICAgIGF2X2Fzc2VydDEoaXNjb3JlID49IDApOworICAgIGF2X2Fzc2VydDEobD49MCAmJiBsPD0yNTUpOworICAgIGF2X2Fzc2VydDEocGw+PTAgJiYgcGw8PTI1NSk7CisKKyAgICBpZihsZXZlbD09MCl7CisgICAgICAgIGludCB2YXJjPSBpc2NvcmUgPj4gODsKKyAgICAgICAgaW50IHZhcmQ9IHNjb3JlID4+IDg7CisgICAgICAgIGlmICh2YXJkIDw9IDY0IHx8IHZhcmQgPCB2YXJjKQorICAgICAgICAgICAgYy0+c2NlbmVfY2hhbmdlX3Njb3JlKz0gZmZfc3FydCh2YXJkKSAtIGZmX3NxcnQodmFyYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGMtPnNjZW5lX2NoYW5nZV9zY29yZSs9IHMtPm0ucXNjYWxlOworICAgIH0KKworICAgIGlmKGxldmVsIT1zLT5ibG9ja19tYXhfZGVwdGgpeworICAgICAgICBwdXRfcmFjKCZzLT5jLCAmcy0+YmxvY2tfc3RhdGVbNCArIHNfY29udGV4dF0sIDApOworICAgICAgICBzY29yZTIgPSBlbmNvZGVfcV9icmFuY2gocywgbGV2ZWwrMSwgMip4KzAsIDIqeSswKTsKKyAgICAgICAgc2NvcmUyKz0gZW5jb2RlX3FfYnJhbmNoKHMsIGxldmVsKzEsIDIqeCsxLCAyKnkrMCk7CisgICAgICAgIHNjb3JlMis9IGVuY29kZV9xX2JyYW5jaChzLCBsZXZlbCsxLCAyKngrMCwgMip5KzEpOworICAgICAgICBzY29yZTIrPSBlbmNvZGVfcV9icmFuY2gocywgbGV2ZWwrMSwgMip4KzEsIDIqeSsxKTsKKyAgICAgICAgc2NvcmUyKz0gcy0+bGFtYmRhMj4+RkZfTEFNQkRBX1NISUZUOyAvL0ZJWE1FIGV4YWN0IHNwbGl0IG92ZXJoZWFkCisKKyAgICAgICAgaWYoc2NvcmUyIDwgc2NvcmUgJiYgc2NvcmUyIDwgaXNjb3JlKQorICAgICAgICAgICAgcmV0dXJuIHNjb3JlMjsKKyAgICB9CisKKyAgICBpZihpc2NvcmUgPCBzY29yZSl7CisgICAgICAgIHByZWRfbXYocywgJnBteCwgJnBteSwgMCwgbGVmdCwgdG9wLCB0cik7CisgICAgICAgIG1lbWNweShwYmJhaywgaV9idWZmZXIsIGlfbGVuKTsKKyAgICAgICAgcy0+Yz0gaWM7CisgICAgICAgIHMtPmMuYnl0ZXN0cmVhbV9zdGFydD0gcGJiYWtfc3RhcnQ7CisgICAgICAgIHMtPmMuYnl0ZXN0cmVhbT0gcGJiYWsgKyBpX2xlbjsKKyAgICAgICAgc2V0X2Jsb2NrcyhzLCBsZXZlbCwgeCwgeSwgbCwgY2IsIGNyLCBwbXgsIHBteSwgMCwgQkxPQ0tfSU5UUkEpOworICAgICAgICBtZW1jcHkocy0+YmxvY2tfc3RhdGUsIGlfc3RhdGUsIHNpemVvZihzLT5ibG9ja19zdGF0ZSkpOworICAgICAgICByZXR1cm4gaXNjb3JlOworICAgIH1lbHNleworICAgICAgICBtZW1jcHkocGJiYWssIHBfYnVmZmVyLCBwX2xlbik7CisgICAgICAgIHMtPmM9IHBjOworICAgICAgICBzLT5jLmJ5dGVzdHJlYW1fc3RhcnQ9IHBiYmFrX3N0YXJ0OworICAgICAgICBzLT5jLmJ5dGVzdHJlYW09IHBiYmFrICsgcF9sZW47CisgICAgICAgIHNldF9ibG9ja3MocywgbGV2ZWwsIHgsIHksIHBsLCBwY2IsIHBjciwgbXgsIG15LCBiZXN0X3JlZiwgMCk7CisgICAgICAgIG1lbWNweShzLT5ibG9ja19zdGF0ZSwgcF9zdGF0ZSwgc2l6ZW9mKHMtPmJsb2NrX3N0YXRlKSk7CisgICAgICAgIHJldHVybiBzY29yZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9xX2JyYW5jaDIoU25vd0NvbnRleHQgKnMsIGludCBsZXZlbCwgaW50IHgsIGludCB5KXsKKyAgICBjb25zdCBpbnQgdz0gcy0+Yl93aWR0aCAgPDwgcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIGNvbnN0IGludCByZW1fZGVwdGg9IHMtPmJsb2NrX21heF9kZXB0aCAtIGxldmVsOworICAgIGNvbnN0IGludCBpbmRleD0gKHggKyB5KncpIDw8IHJlbV9kZXB0aDsKKyAgICBpbnQgdHJ4PSAoeCsxKTw8cmVtX2RlcHRoOworICAgIEJsb2NrTm9kZSAqYj0gJnMtPmJsb2NrW2luZGV4XTsKKyAgICBjb25zdCBCbG9ja05vZGUgKmxlZnQgID0geCA/ICZzLT5ibG9ja1tpbmRleC0xXSA6ICZudWxsX2Jsb2NrOworICAgIGNvbnN0IEJsb2NrTm9kZSAqdG9wICAgPSB5ID8gJnMtPmJsb2NrW2luZGV4LXddIDogJm51bGxfYmxvY2s7CisgICAgY29uc3QgQmxvY2tOb2RlICp0bCAgICA9IHkgJiYgeCA/ICZzLT5ibG9ja1tpbmRleC13LTFdIDogbGVmdDsKKyAgICBjb25zdCBCbG9ja05vZGUgKnRyICAgID0geSAmJiB0cng8dyAmJiAoKHgmMSk9PTAgfHwgbGV2ZWw9PTApID8gJnMtPmJsb2NrW2luZGV4LXcrKDE8PHJlbV9kZXB0aCldIDogdGw7IC8vRklYTUUgdXNlIGx0CisgICAgaW50IHBsID0gbGVmdC0+Y29sb3JbMF07CisgICAgaW50IHBjYj0gbGVmdC0+Y29sb3JbMV07CisgICAgaW50IHBjcj0gbGVmdC0+Y29sb3JbMl07CisgICAgaW50IHBteCwgcG15OworICAgIGludCByZWZfY29udGV4dD0gYXZfbG9nMigyKmxlZnQtPnJlZikgKyBhdl9sb2cyKDIqdG9wLT5yZWYpOworICAgIGludCBteF9jb250ZXh0PSBhdl9sb2cyKDIqRkZBQlMobGVmdC0+bXggLSB0b3AtPm14KSkgKyAxNiohIWItPnJlZjsKKyAgICBpbnQgbXlfY29udGV4dD0gYXZfbG9nMigyKkZGQUJTKGxlZnQtPm15IC0gdG9wLT5teSkpICsgMTYqISFiLT5yZWY7CisgICAgaW50IHNfY29udGV4dD0gMipsZWZ0LT5sZXZlbCArIDIqdG9wLT5sZXZlbCArIHRsLT5sZXZlbCArIHRyLT5sZXZlbDsKKworICAgIGlmKHMtPmtleWZyYW1lKXsKKyAgICAgICAgc2V0X2Jsb2NrcyhzLCBsZXZlbCwgeCwgeSwgcGwsIHBjYiwgcGNyLCAwLCAwLCAwLCBCTE9DS19JTlRSQSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihsZXZlbCE9cy0+YmxvY2tfbWF4X2RlcHRoKXsKKyAgICAgICAgaWYoc2FtZV9ibG9jayhiLGIrMSkgJiYgc2FtZV9ibG9jayhiLGIrdykgJiYgc2FtZV9ibG9jayhiLGIrdysxKSl7CisgICAgICAgICAgICBwdXRfcmFjKCZzLT5jLCAmcy0+YmxvY2tfc3RhdGVbNCArIHNfY29udGV4dF0sIDEpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHB1dF9yYWMoJnMtPmMsICZzLT5ibG9ja19zdGF0ZVs0ICsgc19jb250ZXh0XSwgMCk7CisgICAgICAgICAgICBlbmNvZGVfcV9icmFuY2gyKHMsIGxldmVsKzEsIDIqeCswLCAyKnkrMCk7CisgICAgICAgICAgICBlbmNvZGVfcV9icmFuY2gyKHMsIGxldmVsKzEsIDIqeCsxLCAyKnkrMCk7CisgICAgICAgICAgICBlbmNvZGVfcV9icmFuY2gyKHMsIGxldmVsKzEsIDIqeCswLCAyKnkrMSk7CisgICAgICAgICAgICBlbmNvZGVfcV9icmFuY2gyKHMsIGxldmVsKzEsIDIqeCsxLCAyKnkrMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoYi0+dHlwZSAmIEJMT0NLX0lOVFJBKXsKKyAgICAgICAgcHJlZF9tdihzLCAmcG14LCAmcG15LCAwLCBsZWZ0LCB0b3AsIHRyKTsKKyAgICAgICAgcHV0X3JhYygmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzEgKyAobGVmdC0+dHlwZSYxKSArICh0b3AtPnR5cGUmMSldLCAxKTsKKyAgICAgICAgcHV0X3N5bWJvbCgmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzMyXSwgYi0+Y29sb3JbMF0tcGwgLCAxKTsKKyAgICAgICAgaWYgKHMtPm5iX3BsYW5lcyA+IDIpIHsKKyAgICAgICAgICAgIHB1dF9zeW1ib2woJnMtPmMsICZzLT5ibG9ja19zdGF0ZVs2NF0sIGItPmNvbG9yWzFdLXBjYiwgMSk7CisgICAgICAgICAgICBwdXRfc3ltYm9sKCZzLT5jLCAmcy0+YmxvY2tfc3RhdGVbOTZdLCBiLT5jb2xvclsyXS1wY3IsIDEpOworICAgICAgICB9CisgICAgICAgIHNldF9ibG9ja3MocywgbGV2ZWwsIHgsIHksIGItPmNvbG9yWzBdLCBiLT5jb2xvclsxXSwgYi0+Y29sb3JbMl0sIHBteCwgcG15LCAwLCBCTE9DS19JTlRSQSk7CisgICAgfWVsc2V7CisgICAgICAgIHByZWRfbXYocywgJnBteCwgJnBteSwgYi0+cmVmLCBsZWZ0LCB0b3AsIHRyKTsKKyAgICAgICAgcHV0X3JhYygmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzEgKyAobGVmdC0+dHlwZSYxKSArICh0b3AtPnR5cGUmMSldLCAwKTsKKyAgICAgICAgaWYocy0+cmVmX2ZyYW1lcyA+IDEpCisgICAgICAgICAgICBwdXRfc3ltYm9sKCZzLT5jLCAmcy0+YmxvY2tfc3RhdGVbMTI4ICsgMTAyNCArIDMyKnJlZl9jb250ZXh0XSwgYi0+cmVmLCAwKTsKKyAgICAgICAgcHV0X3N5bWJvbCgmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzEyOCArIDMyKm14X2NvbnRleHRdLCBiLT5teCAtIHBteCwgMSk7CisgICAgICAgIHB1dF9zeW1ib2woJnMtPmMsICZzLT5ibG9ja19zdGF0ZVsxMjggKyAzMipteV9jb250ZXh0XSwgYi0+bXkgLSBwbXksIDEpOworICAgICAgICBzZXRfYmxvY2tzKHMsIGxldmVsLCB4LCB5LCBwbCwgcGNiLCBwY3IsIGItPm14LCBiLT5teSwgYi0+cmVmLCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2RjKFNub3dDb250ZXh0ICpzLCBpbnQgbWJfeCwgaW50IG1iX3ksIGludCBwbGFuZV9pbmRleCl7CisgICAgaW50IGksIHgyLCB5MjsKKyAgICBQbGFuZSAqcD0gJnMtPnBsYW5lW3BsYW5lX2luZGV4XTsKKyAgICBjb25zdCBpbnQgYmxvY2tfc2l6ZSA9IE1CX1NJWkUgPj4gcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIGNvbnN0IGludCBibG9ja193ICAgID0gcGxhbmVfaW5kZXggPyBibG9ja19zaXplPj5zLT5jaHJvbWFfaF9zaGlmdCA6IGJsb2NrX3NpemU7CisgICAgY29uc3QgaW50IGJsb2NrX2ggICAgPSBwbGFuZV9pbmRleCA/IGJsb2NrX3NpemU+PnMtPmNocm9tYV92X3NoaWZ0IDogYmxvY2tfc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpvYm1jICA9IHBsYW5lX2luZGV4ID8gZmZfb2JtY190YWJbcy0+YmxvY2tfbWF4X2RlcHRoK3MtPmNocm9tYV9oX3NoaWZ0XSA6IGZmX29ibWNfdGFiW3MtPmJsb2NrX21heF9kZXB0aF07CisgICAgY29uc3QgaW50IG9ibWNfc3RyaWRlPSBwbGFuZV9pbmRleCA/ICgyKmJsb2NrX3NpemUpPj5zLT5jaHJvbWFfaF9zaGlmdCA6IDIqYmxvY2tfc2l6ZTsKKyAgICBjb25zdCBpbnQgcmVmX3N0cmlkZT0gcy0+Y3VycmVudF9waWN0dXJlLT5saW5lc2l6ZVtwbGFuZV9pbmRleF07CisgICAgdWludDhfdCAqc3JjPSBzLT4gaW5wdXRfcGljdHVyZS0+ZGF0YVtwbGFuZV9pbmRleF07CisgICAgSURXVEVMRU0gKmRzdD0gKElEV1RFTEVNKilzLT5tLm9ibWNfc2NyYXRjaHBhZCArIHBsYW5lX2luZGV4KmJsb2NrX3NpemUqYmxvY2tfc2l6ZSo0OyAvL0ZJWE1FIGNoYW5nZSB0byB1bnNpZ25lZAorICAgIGNvbnN0IGludCBiX3N0cmlkZSA9IHMtPmJfd2lkdGggPDwgcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIGNvbnN0IGludCB3PSBwLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaD0gcC0+aGVpZ2h0OworICAgIGludCBpbmRleD0gbWJfeCArIG1iX3kqYl9zdHJpZGU7CisgICAgQmxvY2tOb2RlICpiPSAmcy0+YmxvY2tbaW5kZXhdOworICAgIEJsb2NrTm9kZSBiYWNrdXA9ICpiOworICAgIGludCBhYj0wOworICAgIGludCBhYT0wOworCisgICAgYXZfYXNzZXJ0MihzLT5jaHJvbWFfaF9zaGlmdCA9PSBzLT5jaHJvbWFfdl9zaGlmdCk7IC8vb2JtYyBzdHVmZiBhYm92ZQorCisgICAgYi0+dHlwZXw9IEJMT0NLX0lOVFJBOworICAgIGItPmNvbG9yW3BsYW5lX2luZGV4XT0gMDsKKyAgICBtZW1zZXQoZHN0LCAwLCBvYm1jX3N0cmlkZSpvYm1jX3N0cmlkZSpzaXplb2YoSURXVEVMRU0pKTsKKworICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgaW50IG1iX3gyPSBtYl94ICsgKGkgJjEpIC0gMTsKKyAgICAgICAgaW50IG1iX3kyPSBtYl95ICsgKGk+PjEpIC0gMTsKKyAgICAgICAgaW50IHg9IGJsb2NrX3cqbWJfeDIgKyBibG9ja193LzI7CisgICAgICAgIGludCB5PSBibG9ja19oKm1iX3kyICsgYmxvY2tfaC8yOworCisgICAgICAgIGFkZF95YmxvY2socywgMCwgTlVMTCwgZHN0ICsgKGkmMSkqYmxvY2tfdyArIChpPj4xKSpvYm1jX3N0cmlkZSpibG9ja19oLCBOVUxMLCBvYm1jLAorICAgICAgICAgICAgICAgICAgICB4LCB5LCBibG9ja193LCBibG9ja19oLCB3LCBoLCBvYm1jX3N0cmlkZSwgcmVmX3N0cmlkZSwgb2JtY19zdHJpZGUsIG1iX3gyLCBtYl95MiwgMCwgMCwgcGxhbmVfaW5kZXgpOworCisgICAgICAgIGZvcih5Mj0gRkZNQVgoeSwgMCk7IHkyPEZGTUlOKGgsIHkrYmxvY2tfaCk7IHkyKyspeworICAgICAgICAgICAgZm9yKHgyPSBGRk1BWCh4LCAwKTsgeDI8RkZNSU4odywgeCtibG9ja193KTsgeDIrKyl7CisgICAgICAgICAgICAgICAgaW50IGluZGV4PSB4Mi0oYmxvY2tfdyptYl94IC0gYmxvY2tfdy8yKSArICh5Mi0oYmxvY2tfaCptYl95IC0gYmxvY2tfaC8yKSkqb2JtY19zdHJpZGU7CisgICAgICAgICAgICAgICAgaW50IG9ibWNfdj0gb2JtY1tpbmRleF07CisgICAgICAgICAgICAgICAgaW50IGQ7CisgICAgICAgICAgICAgICAgaWYoeTwwKSBvYm1jX3YgKz0gb2JtY1tpbmRleCArIGJsb2NrX2gqb2JtY19zdHJpZGVdOworICAgICAgICAgICAgICAgIGlmKHg8MCkgb2JtY192ICs9IG9ibWNbaW5kZXggKyBibG9ja193XTsKKyAgICAgICAgICAgICAgICBpZih5K2Jsb2NrX2g+aCkgb2JtY192ICs9IG9ibWNbaW5kZXggLSBibG9ja19oKm9ibWNfc3RyaWRlXTsKKyAgICAgICAgICAgICAgICBpZih4K2Jsb2NrX3c+dykgb2JtY192ICs9IG9ibWNbaW5kZXggLSBibG9ja193XTsKKyAgICAgICAgICAgICAgICAvL0ZJWE1FIHByZWNhbGN1bGF0ZSB0aGlzIG9yIHNpbXBsaWZ5IGl0IHNvbWVob3cgZWxzZQorCisgICAgICAgICAgICAgICAgZCA9IC1kc3RbaW5kZXhdICsgKDE8PChGUkFDX0JJVFMtMSkpOworICAgICAgICAgICAgICAgIGRzdFtpbmRleF0gPSBkOworICAgICAgICAgICAgICAgIGFiICs9IChzcmNbeDIgKyB5MipyZWZfc3RyaWRlXSAtIChkPj5GUkFDX0JJVFMpKSAqIG9ibWNfdjsKKyAgICAgICAgICAgICAgICBhYSArPSBvYm1jX3YgKiBvYm1jX3Y7IC8vRklYTUUgcHJlY2FsY3VsYXRlIHRoaXMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAqYj0gYmFja3VwOworCisgICAgcmV0dXJuIGF2X2NsaXAoIFJPVU5ERURfRElWKGFiPDxMT0cyX09CTUNfTUFYLCBhYSksIDAsIDI1NSk7IC8vRklYTUUgd2Ugc2hvdWxkIG5vdCBuZWVkIGNsaXBwaW5nCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9ibG9ja19iaXRzKFNub3dDb250ZXh0ICpzLCBpbnQgeCwgaW50IHksIGludCB3KXsKKyAgICBjb25zdCBpbnQgYl9zdHJpZGUgPSBzLT5iX3dpZHRoIDw8IHMtPmJsb2NrX21heF9kZXB0aDsKKyAgICBjb25zdCBpbnQgYl9oZWlnaHQgPSBzLT5iX2hlaWdodDw8IHMtPmJsb2NrX21heF9kZXB0aDsKKyAgICBpbnQgaW5kZXg9IHggKyB5KmJfc3RyaWRlOworICAgIGNvbnN0IEJsb2NrTm9kZSAqYiAgICAgPSAmcy0+YmxvY2tbaW5kZXhdOworICAgIGNvbnN0IEJsb2NrTm9kZSAqbGVmdCAgPSB4ID8gJnMtPmJsb2NrW2luZGV4LTFdIDogJm51bGxfYmxvY2s7CisgICAgY29uc3QgQmxvY2tOb2RlICp0b3AgICA9IHkgPyAmcy0+YmxvY2tbaW5kZXgtYl9zdHJpZGVdIDogJm51bGxfYmxvY2s7CisgICAgY29uc3QgQmxvY2tOb2RlICp0bCAgICA9IHkgJiYgeCA/ICZzLT5ibG9ja1tpbmRleC1iX3N0cmlkZS0xXSA6IGxlZnQ7CisgICAgY29uc3QgQmxvY2tOb2RlICp0ciAgICA9IHkgJiYgeCt3PGJfc3RyaWRlID8gJnMtPmJsb2NrW2luZGV4LWJfc3RyaWRlK3ddIDogdGw7CisgICAgaW50IGRteCwgZG15OworLy8gIGludCBteF9jb250ZXh0PSBhdl9sb2cyKDIqRkZBQlMobGVmdC0+bXggLSB0b3AtPm14KSk7CisvLyAgaW50IG15X2NvbnRleHQ9IGF2X2xvZzIoMipGRkFCUyhsZWZ0LT5teSAtIHRvcC0+bXkpKTsKKworICAgIGlmKHg8MCB8fCB4Pj1iX3N0cmlkZSB8fCB5Pj1iX2hlaWdodCkKKyAgICAgICAgcmV0dXJuIDA7CisvKgorMSAgICAgICAgICAgIDAgICAgICAwCiswMVggICAgICAgICAgMS0yICAgIDEKKzAwMVhYICAgICAgICAzLTYgICAgMi0zCiswMDAxWFhYICAgICAgNy0xNCAgIDQtNworMDAwMDFYWFhYICAgMTUtMzAgICA4LTE1CisqLworLy9GSVhNRSB0cnkgYWNjdXJhdGUgcmF0ZQorLy9GSVhNRSBpbnRyYSBhbmQgaW50ZXIgcHJlZGljdG9ycyBpZiBzdXJyb3VuZGluZyBibG9ja3MgYXJlIG5vdCB0aGUgc2FtZSB0eXBlCisgICAgaWYoYi0+dHlwZSAmIEJMT0NLX0lOVFJBKXsKKyAgICAgICAgcmV0dXJuIDMrMiooIGF2X2xvZzIoMipGRkFCUyhsZWZ0LT5jb2xvclswXSAtIGItPmNvbG9yWzBdKSkKKyAgICAgICAgICAgICAgICAgICArIGF2X2xvZzIoMipGRkFCUyhsZWZ0LT5jb2xvclsxXSAtIGItPmNvbG9yWzFdKSkKKyAgICAgICAgICAgICAgICAgICArIGF2X2xvZzIoMipGRkFCUyhsZWZ0LT5jb2xvclsyXSAtIGItPmNvbG9yWzJdKSkpOworICAgIH1lbHNleworICAgICAgICBwcmVkX212KHMsICZkbXgsICZkbXksIGItPnJlZiwgbGVmdCwgdG9wLCB0cik7CisgICAgICAgIGRteC09IGItPm14OworICAgICAgICBkbXktPSBiLT5teTsKKyAgICAgICAgcmV0dXJuIDIqKDEgKyBhdl9sb2cyKDIqRkZBQlMoZG14KSkgLy9GSVhNRSBraWxsIHRoZSAyKiBjYW4gYmUgbWVyZ2VkIGluIGxhbWJkYQorICAgICAgICAgICAgICAgICAgICArIGF2X2xvZzIoMipGRkFCUyhkbXkpKQorICAgICAgICAgICAgICAgICAgICArIGF2X2xvZzIoMipiLT5yZWYpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Jsb2NrX3JkKFNub3dDb250ZXh0ICpzLCBpbnQgbWJfeCwgaW50IG1iX3ksIGludCBwbGFuZV9pbmRleCwgdWludDhfdCAoKm9ibWNfZWRnZWQpW01CX1NJWkUgKiAyXSl7CisgICAgUGxhbmUgKnA9ICZzLT5wbGFuZVtwbGFuZV9pbmRleF07CisgICAgY29uc3QgaW50IGJsb2NrX3NpemUgPSBNQl9TSVpFID4+IHMtPmJsb2NrX21heF9kZXB0aDsKKyAgICBjb25zdCBpbnQgYmxvY2tfdyAgICA9IHBsYW5lX2luZGV4ID8gYmxvY2tfc2l6ZT4+cy0+Y2hyb21hX2hfc2hpZnQgOiBibG9ja19zaXplOworICAgIGNvbnN0IGludCBibG9ja19oICAgID0gcGxhbmVfaW5kZXggPyBibG9ja19zaXplPj5zLT5jaHJvbWFfdl9zaGlmdCA6IGJsb2NrX3NpemU7CisgICAgY29uc3QgaW50IG9ibWNfc3RyaWRlPSBwbGFuZV9pbmRleCA/ICgyKmJsb2NrX3NpemUpPj5zLT5jaHJvbWFfaF9zaGlmdCA6IDIqYmxvY2tfc2l6ZTsKKyAgICBjb25zdCBpbnQgcmVmX3N0cmlkZT0gcy0+Y3VycmVudF9waWN0dXJlLT5saW5lc2l6ZVtwbGFuZV9pbmRleF07CisgICAgdWludDhfdCAqZHN0PSBzLT5jdXJyZW50X3BpY3R1cmUtPmRhdGFbcGxhbmVfaW5kZXhdOworICAgIHVpbnQ4X3QgKnNyYz0gcy0+ICBpbnB1dF9waWN0dXJlLT5kYXRhW3BsYW5lX2luZGV4XTsKKyAgICBJRFdURUxFTSAqcHJlZD0gKElEV1RFTEVNKilzLT5tLm9ibWNfc2NyYXRjaHBhZCArIHBsYW5lX2luZGV4KmJsb2NrX3NpemUqYmxvY2tfc2l6ZSo0OworICAgIHVpbnQ4X3QgKmN1ciA9IHMtPnNjcmF0Y2hidWY7CisgICAgdWludDhfdCAqdG1wID0gcy0+ZW11X2VkZ2VfYnVmZmVyOworICAgIGNvbnN0IGludCBiX3N0cmlkZSA9IHMtPmJfd2lkdGggPDwgcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIGNvbnN0IGludCBiX2hlaWdodCA9IHMtPmJfaGVpZ2h0PDwgcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIGNvbnN0IGludCB3PSBwLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaD0gcC0+aGVpZ2h0OworICAgIGludCBkaXN0b3J0aW9uOworICAgIGludCByYXRlPSAwOworICAgIGNvbnN0IGludCBwZW5hbHR5X2ZhY3Rvcj0gZ2V0X3BlbmFsdHlfZmFjdG9yKHMtPmxhbWJkYSwgcy0+bGFtYmRhMiwgcy0+YXZjdHgtPm1lX2NtcCk7CisgICAgaW50IHN4PSBibG9ja193Km1iX3ggLSBibG9ja193LzI7CisgICAgaW50IHN5PSBibG9ja19oKm1iX3kgLSBibG9ja19oLzI7CisgICAgaW50IHgwPSBGRk1BWCgwLC1zeCk7CisgICAgaW50IHkwPSBGRk1BWCgwLC1zeSk7CisgICAgaW50IHgxPSBGRk1JTihibG9ja193KjIsIHctc3gpOworICAgIGludCB5MT0gRkZNSU4oYmxvY2tfaCoyLCBoLXN5KTsKKyAgICBpbnQgaSx4LHk7CisKKyAgICBhdl9hc3NlcnQyKHMtPmNocm9tYV9oX3NoaWZ0ID09IHMtPmNocm9tYV92X3NoaWZ0KTsgLy9vYm1jIGFuZCBzcXVhcmUgYXNzdW10aW9ucyBiZWxvdyBjaGNraW5oZyBvbmx5IGJsb2NrX3cKKworICAgIGZmX3Nub3dfcHJlZF9ibG9jayhzLCBjdXIsIHRtcCwgcmVmX3N0cmlkZSwgc3gsIHN5LCBibG9ja193KjIsIGJsb2NrX2gqMiwgJnMtPmJsb2NrW21iX3ggKyBtYl95KmJfc3RyaWRlXSwgcGxhbmVfaW5kZXgsIHcsIGgpOworCisgICAgZm9yKHk9eTA7IHk8eTE7IHkrKyl7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm9ibWMxPSBvYm1jX2VkZ2VkW3ldOworICAgICAgICBjb25zdCBJRFdURUxFTSAqcHJlZDEgPSBwcmVkICsgeSpvYm1jX3N0cmlkZTsKKyAgICAgICAgdWludDhfdCAqY3VyMSA9IGN1ciArIHkqcmVmX3N0cmlkZTsKKyAgICAgICAgdWludDhfdCAqZHN0MSA9IGRzdCArIHN4ICsgKHN5K3kpKnJlZl9zdHJpZGU7CisgICAgICAgIGZvcih4PXgwOyB4PHgxOyB4KyspeworI2lmIEZSQUNfQklUUyA+PSBMT0cyX09CTUNfTUFYCisgICAgICAgICAgICBpbnQgdiA9IChjdXIxW3hdICogb2JtYzFbeF0pIDw8IChGUkFDX0JJVFMgLSBMT0cyX09CTUNfTUFYKTsKKyNlbHNlCisgICAgICAgICAgICBpbnQgdiA9IChjdXIxW3hdICogb2JtYzFbeF0gKyAoMTw8KExPRzJfT0JNQ19NQVggLSBGUkFDX0JJVFMtMSkpKSA+PiAoTE9HMl9PQk1DX01BWCAtIEZSQUNfQklUUyk7CisjZW5kaWYKKyAgICAgICAgICAgIHYgPSAodiArIHByZWQxW3hdKSA+PiBGUkFDX0JJVFM7CisgICAgICAgICAgICBpZih2Jih+MjU1KSkgdj0gfih2Pj4zMSk7CisgICAgICAgICAgICBkc3QxW3hdID0gdjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvcHkgdGhlIHJlZ2lvbnMgd2hlcmUgb2JtY1tdID0gKHVpbnQ4X3QpMjU2ICovCisgICAgaWYoTE9HMl9PQk1DX01BWCA9PSA4CisgICAgICAgICYmIChtYl94ID09IDAgfHwgbWJfeCA9PSBiX3N0cmlkZS0xKQorICAgICAgICAmJiAobWJfeSA9PSAwIHx8IG1iX3kgPT0gYl9oZWlnaHQtMSkpeworICAgICAgICBpZihtYl94ID09IDApCisgICAgICAgICAgICB4MSA9IGJsb2NrX3c7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHgwID0gYmxvY2tfdzsKKyAgICAgICAgaWYobWJfeSA9PSAwKQorICAgICAgICAgICAgeTEgPSBibG9ja19oOworICAgICAgICBlbHNlCisgICAgICAgICAgICB5MCA9IGJsb2NrX2g7CisgICAgICAgIGZvcih5PXkwOyB5PHkxOyB5KyspCisgICAgICAgICAgICBtZW1jcHkoZHN0ICsgc3greDAgKyAoc3kreSkqcmVmX3N0cmlkZSwgY3VyICsgeDAgKyB5KnJlZl9zdHJpZGUsIHgxLXgwKTsKKyAgICB9CisKKyAgICBpZihibG9ja193PT0xNil7CisgICAgICAgIC8qIEZJWE1FIHJlYXJyYW5nZSBkc3B1dGlsIHRvIGZpdCAzMngzMiBjbXAgZnVuY3Rpb25zICovCisgICAgICAgIC8qIEZJWE1FIGNoZWNrIGFsaWdubWVudCBvZiB0aGUgY21wIHdhdmVsZXQgdnMgdGhlIGVuY29kaW5nIHdhdmVsZXQgKi8KKyAgICAgICAgLyogRklYTUUgY21wcyBvdmVybGFwIGJ1dCBkbyBub3QgY292ZXIgdGhlIHdhdmVsZXQncyB3aG9sZSBzdXBwb3J0LgorICAgICAgICAgKiBTbyBpbXByb3ZpbmcgdGhlIHNjb3JlIG9mIG9uZSBibG9jayBpcyBub3Qgc3RyaWN0bHkgZ3VhcmFudGVlZAorICAgICAgICAgKiB0byBpbXByb3ZlIHRoZSBzY29yZSBvZiB0aGUgd2hvbGUgZnJhbWUsIHRodXMgaXRlcmF0aXZlIG1vdGlvbgorICAgICAgICAgKiBlc3RpbWF0aW9uIGRvZXMgbm90IGFsd2F5cyBjb252ZXJnZS4gKi8KKyAgICAgICAgaWYocy0+YXZjdHgtPm1lX2NtcCA9PSBGRl9DTVBfVzk3KQorICAgICAgICAgICAgZGlzdG9ydGlvbiA9IGZmX3c5N18zMl9jKCZzLT5tLCBzcmMgKyBzeCArIHN5KnJlZl9zdHJpZGUsIGRzdCArIHN4ICsgc3kqcmVmX3N0cmlkZSwgcmVmX3N0cmlkZSwgMzIpOworICAgICAgICBlbHNlIGlmKHMtPmF2Y3R4LT5tZV9jbXAgPT0gRkZfQ01QX1c1MykKKyAgICAgICAgICAgIGRpc3RvcnRpb24gPSBmZl93NTNfMzJfYygmcy0+bSwgc3JjICsgc3ggKyBzeSpyZWZfc3RyaWRlLCBkc3QgKyBzeCArIHN5KnJlZl9zdHJpZGUsIHJlZl9zdHJpZGUsIDMyKTsKKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIGRpc3RvcnRpb24gPSAwOworICAgICAgICAgICAgZm9yKGk9MDsgaTw0OyBpKyspeworICAgICAgICAgICAgICAgIGludCBvZmYgPSBzeCsxNiooaSYxKSArIChzeSsxNiooaT4+MSkpKnJlZl9zdHJpZGU7CisgICAgICAgICAgICAgICAgZGlzdG9ydGlvbiArPSBzLT5tZWNjLm1lX2NtcFswXSgmcy0+bSwgc3JjICsgb2ZmLCBkc3QgKyBvZmYsIHJlZl9zdHJpZGUsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBhdl9hc3NlcnQyKGJsb2NrX3c9PTgpOworICAgICAgICBkaXN0b3J0aW9uID0gcy0+bWVjYy5tZV9jbXBbMF0oJnMtPm0sIHNyYyArIHN4ICsgc3kqcmVmX3N0cmlkZSwgZHN0ICsgc3ggKyBzeSpyZWZfc3RyaWRlLCByZWZfc3RyaWRlLCBibG9ja193KjIpOworICAgIH0KKworICAgIGlmKHBsYW5lX2luZGV4PT0wKXsKKyAgICAgICAgZm9yKGk9MDsgaTw0OyBpKyspeworLyogLi5SUnIKKyAqIC5SWHguCisgKiByeHguLgorICovCisgICAgICAgICAgICByYXRlICs9IGdldF9ibG9ja19iaXRzKHMsIG1iX3ggKyAoaSYxKSAtIChpPj4xKSwgbWJfeSArIChpPj4xKSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYobWJfeCA9PSBiX3N0cmlkZS0yKQorICAgICAgICAgICAgcmF0ZSArPSBnZXRfYmxvY2tfYml0cyhzLCBtYl94ICsgMSwgbWJfeSArIDEsIDEpOworICAgIH0KKyAgICByZXR1cm4gZGlzdG9ydGlvbiArIHJhdGUqcGVuYWx0eV9mYWN0b3I7Cit9CisKK3N0YXRpYyBpbnQgZ2V0XzRibG9ja19yZChTbm93Q29udGV4dCAqcywgaW50IG1iX3gsIGludCBtYl95LCBpbnQgcGxhbmVfaW5kZXgpeworICAgIGludCBpLCB5MjsKKyAgICBQbGFuZSAqcD0gJnMtPnBsYW5lW3BsYW5lX2luZGV4XTsKKyAgICBjb25zdCBpbnQgYmxvY2tfc2l6ZSA9IE1CX1NJWkUgPj4gcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIGNvbnN0IGludCBibG9ja193ICAgID0gcGxhbmVfaW5kZXggPyBibG9ja19zaXplPj5zLT5jaHJvbWFfaF9zaGlmdCA6IGJsb2NrX3NpemU7CisgICAgY29uc3QgaW50IGJsb2NrX2ggICAgPSBwbGFuZV9pbmRleCA/IGJsb2NrX3NpemU+PnMtPmNocm9tYV92X3NoaWZ0IDogYmxvY2tfc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpvYm1jICA9IHBsYW5lX2luZGV4ID8gZmZfb2JtY190YWJbcy0+YmxvY2tfbWF4X2RlcHRoK3MtPmNocm9tYV9oX3NoaWZ0XSA6IGZmX29ibWNfdGFiW3MtPmJsb2NrX21heF9kZXB0aF07CisgICAgY29uc3QgaW50IG9ibWNfc3RyaWRlPSBwbGFuZV9pbmRleCA/ICgyKmJsb2NrX3NpemUpPj5zLT5jaHJvbWFfaF9zaGlmdCA6IDIqYmxvY2tfc2l6ZTsKKyAgICBjb25zdCBpbnQgcmVmX3N0cmlkZT0gcy0+Y3VycmVudF9waWN0dXJlLT5saW5lc2l6ZVtwbGFuZV9pbmRleF07CisgICAgdWludDhfdCAqZHN0PSBzLT5jdXJyZW50X3BpY3R1cmUtPmRhdGFbcGxhbmVfaW5kZXhdOworICAgIHVpbnQ4X3QgKnNyYz0gcy0+IGlucHV0X3BpY3R1cmUtPmRhdGFbcGxhbmVfaW5kZXhdOworICAgIC8vRklYTUUgemVyb19kc3QgaXMgY29uc3QgYnV0IGFkZF95YmxvY2sgY2hhbmdlcyBkc3QgaWYgYWRkIGlzIDAgKHRoaXMgaXMgbmV2ZXIgdGhlIGNhc2UgZm9yIGRzdD16ZXJvX2RzdAorICAgIC8vIGNvbnN0IGhhcyBvbmx5IGJlZW4gcmVtb3ZlZCBmcm9tIHplcm9fZHN0IHRvIHN1cHByZXNzIGEgd2FybmluZworICAgIHN0YXRpYyBJRFdURUxFTSB6ZXJvX2RzdFs0MDk2XTsgLy9GSVhNRQorICAgIGNvbnN0IGludCBiX3N0cmlkZSA9IHMtPmJfd2lkdGggPDwgcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIGNvbnN0IGludCB3PSBwLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaD0gcC0+aGVpZ2h0OworICAgIGludCBkaXN0b3J0aW9uPSAwOworICAgIGludCByYXRlPSAwOworICAgIGNvbnN0IGludCBwZW5hbHR5X2ZhY3Rvcj0gZ2V0X3BlbmFsdHlfZmFjdG9yKHMtPmxhbWJkYSwgcy0+bGFtYmRhMiwgcy0+YXZjdHgtPm1lX2NtcCk7CisKKyAgICBhdl9hc3NlcnQyKHMtPmNocm9tYV9oX3NoaWZ0ID09IHMtPmNocm9tYV92X3NoaWZ0KTsgLy9vYm1jIGFuZCBzcXVhcmUgYXNzdW10aW9ucyBiZWxvdworCisgICAgZm9yKGk9MDsgaTw5OyBpKyspeworICAgICAgICBpbnQgbWJfeDI9IG1iX3ggKyAoaSUzKSAtIDE7CisgICAgICAgIGludCBtYl95Mj0gbWJfeSArIChpLzMpIC0gMTsKKyAgICAgICAgaW50IHg9IGJsb2NrX3cqbWJfeDIgKyBibG9ja193LzI7CisgICAgICAgIGludCB5PSBibG9ja19oKm1iX3kyICsgYmxvY2tfaC8yOworCisgICAgICAgIGFkZF95YmxvY2socywgMCwgTlVMTCwgemVyb19kc3QsIGRzdCwgb2JtYywKKyAgICAgICAgICAgICAgICAgICB4LCB5LCBibG9ja193LCBibG9ja19oLCB3LCBoLCAvKmRzdF9zdHJpZGUqLzAsIHJlZl9zdHJpZGUsIG9ibWNfc3RyaWRlLCBtYl94MiwgbWJfeTIsIDEsIDEsIHBsYW5lX2luZGV4KTsKKworICAgICAgICAvL0ZJWE1FIGZpbmQgYSBjbGVhbmVyL3NpbXBsZXIgd2F5IHRvIHNraXAgdGhlIG91dHNpZGUgc3R1ZmYKKyAgICAgICAgZm9yKHkyPSB5OyB5MjwwOyB5MisrKQorICAgICAgICAgICAgbWVtY3B5KGRzdCArIHggKyB5MipyZWZfc3RyaWRlLCBzcmMgKyB4ICsgeTIqcmVmX3N0cmlkZSwgYmxvY2tfdyk7CisgICAgICAgIGZvcih5Mj0gaDsgeTI8eStibG9ja19oOyB5MisrKQorICAgICAgICAgICAgbWVtY3B5KGRzdCArIHggKyB5MipyZWZfc3RyaWRlLCBzcmMgKyB4ICsgeTIqcmVmX3N0cmlkZSwgYmxvY2tfdyk7CisgICAgICAgIGlmKHg8MCl7CisgICAgICAgICAgICBmb3IoeTI9IHk7IHkyPHkrYmxvY2tfaDsgeTIrKykKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0ICsgeCArIHkyKnJlZl9zdHJpZGUsIHNyYyArIHggKyB5MipyZWZfc3RyaWRlLCAteCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoeCtibG9ja193ID4gdyl7CisgICAgICAgICAgICBmb3IoeTI9IHk7IHkyPHkrYmxvY2tfaDsgeTIrKykKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0ICsgdyArIHkyKnJlZl9zdHJpZGUsIHNyYyArIHcgKyB5MipyZWZfc3RyaWRlLCB4K2Jsb2NrX3cgLSB3KTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Fzc2VydDEoYmxvY2tfdz09IDggfHwgYmxvY2tfdz09MTYpOworICAgICAgICBkaXN0b3J0aW9uICs9IHMtPm1lY2MubWVfY21wW2Jsb2NrX3c9PThdKCZzLT5tLCBzcmMgKyB4ICsgeSpyZWZfc3RyaWRlLCBkc3QgKyB4ICsgeSpyZWZfc3RyaWRlLCByZWZfc3RyaWRlLCBibG9ja19oKTsKKyAgICB9CisKKyAgICBpZihwbGFuZV9pbmRleD09MCl7CisgICAgICAgIEJsb2NrTm9kZSAqYj0gJnMtPmJsb2NrW21iX3grbWJfeSpiX3N0cmlkZV07CisgICAgICAgIGludCBtZXJnZWQ9IHNhbWVfYmxvY2soYixiKzEpICYmIHNhbWVfYmxvY2soYixiK2Jfc3RyaWRlKSAmJiBzYW1lX2Jsb2NrKGIsYitiX3N0cmlkZSsxKTsKKworLyogLi5SUlJyCisgKiAuUlhYeC4KKyAqIC5SWFh4LgorICogcnh4eC4KKyAqLworICAgICAgICBpZihtZXJnZWQpCisgICAgICAgICAgICByYXRlID0gZ2V0X2Jsb2NrX2JpdHMocywgbWJfeCwgbWJfeSwgMik7CisgICAgICAgIGZvcihpPW1lcmdlZD80OjA7IGk8OTsgaSsrKXsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgZHh5WzldWzJdID0ge3swLDB9LHsxLDB9LHswLDF9LHsxLDF9LHsyLDB9LHsyLDF9LHstMSwyfSx7MCwyfSx7MSwyfX07CisgICAgICAgICAgICByYXRlICs9IGdldF9ibG9ja19iaXRzKHMsIG1iX3ggKyBkeHlbaV1bMF0sIG1iX3kgKyBkeHlbaV1bMV0sIDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkaXN0b3J0aW9uICsgcmF0ZSpwZW5hbHR5X2ZhY3RvcjsKK30KKworc3RhdGljIGludCBlbmNvZGVfc3ViYmFuZF9jMHJ1bihTbm93Q29udGV4dCAqcywgU3ViQmFuZCAqYiwgY29uc3QgSURXVEVMRU0gKnNyYywgY29uc3QgSURXVEVMRU0gKnBhcmVudCwgaW50IHN0cmlkZSwgaW50IG9yaWVudGF0aW9uKXsKKyAgICBjb25zdCBpbnQgdz0gYi0+d2lkdGg7CisgICAgY29uc3QgaW50IGg9IGItPmhlaWdodDsKKyAgICBpbnQgeCwgeTsKKworICAgIGlmKDEpeworICAgICAgICBpbnQgcnVuPTA7CisgICAgICAgIGludCAqcnVucyA9IHMtPnJ1bl9idWZmZXI7CisgICAgICAgIGludCBydW5faW5kZXg9MDsKKyAgICAgICAgaW50IG1heF9pbmRleDsKKworICAgICAgICBmb3IoeT0wOyB5PGg7IHkrKyl7CisgICAgICAgICAgICBmb3IoeD0wOyB4PHc7IHgrKyl7CisgICAgICAgICAgICAgICAgaW50IHYsIHA9MDsKKyAgICAgICAgICAgICAgICBpbnQgLypsbD0wLCAqL2w9MCwgbHQ9MCwgdD0wLCBydD0wOworICAgICAgICAgICAgICAgIHY9IHNyY1t4ICsgeSpzdHJpZGVdOworCisgICAgICAgICAgICAgICAgaWYoeSl7CisgICAgICAgICAgICAgICAgICAgIHQ9IHNyY1t4ICsgKHktMSkqc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoeCl7CisgICAgICAgICAgICAgICAgICAgICAgICBsdD0gc3JjW3ggLSAxICsgKHktMSkqc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih4ICsgMSA8IHcpeworICAgICAgICAgICAgICAgICAgICAgICAgcnQ9IHNyY1t4ICsgMSArICh5LTEpKnN0cmlkZV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoeCl7CisgICAgICAgICAgICAgICAgICAgIGw9IHNyY1t4IC0gMSArIHkqc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgLyppZih4ID4gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihvcmllbnRhdGlvbj09MSkgbGw9IHNyY1t5ICsgKHgtMikqc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICBsbD0gc3JjW3ggLSAyICsgeSpzdHJpZGVdOworICAgICAgICAgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYocGFyZW50KXsKKyAgICAgICAgICAgICAgICAgICAgaW50IHB4PSB4Pj4xOworICAgICAgICAgICAgICAgICAgICBpbnQgcHk9IHk+PjE7CisgICAgICAgICAgICAgICAgICAgIGlmKHB4PGItPnBhcmVudC0+d2lkdGggJiYgcHk8Yi0+cGFyZW50LT5oZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICBwPSBwYXJlbnRbcHggKyBweSoyKnN0cmlkZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCEoLypsbHwqL2x8bHR8dHxydHxwKSl7CisgICAgICAgICAgICAgICAgICAgIGlmKHYpeworICAgICAgICAgICAgICAgICAgICAgICAgcnVuc1tydW5faW5kZXgrK109IHJ1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bj0wOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1heF9pbmRleD0gcnVuX2luZGV4OworICAgICAgICBydW5zW3J1bl9pbmRleCsrXT0gcnVuOworICAgICAgICBydW5faW5kZXg9MDsKKyAgICAgICAgcnVuPSBydW5zW3J1bl9pbmRleCsrXTsKKworICAgICAgICBwdXRfc3ltYm9sMigmcy0+YywgYi0+c3RhdGVbMzBdLCBtYXhfaW5kZXgsIDApOworICAgICAgICBpZihydW5faW5kZXggPD0gbWF4X2luZGV4KQorICAgICAgICAgICAgcHV0X3N5bWJvbDIoJnMtPmMsIGItPnN0YXRlWzFdLCBydW4sIDMpOworCisgICAgICAgIGZvcih5PTA7IHk8aDsgeSsrKXsKKyAgICAgICAgICAgIGlmKHMtPmMuYnl0ZXN0cmVhbV9lbmQgLSBzLT5jLmJ5dGVzdHJlYW0gPCB3KjQwKXsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVuY29kZWQgZnJhbWUgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoeD0wOyB4PHc7IHgrKyl7CisgICAgICAgICAgICAgICAgaW50IHYsIHA9MDsKKyAgICAgICAgICAgICAgICBpbnQgLypsbD0wLCAqL2w9MCwgbHQ9MCwgdD0wLCBydD0wOworICAgICAgICAgICAgICAgIHY9IHNyY1t4ICsgeSpzdHJpZGVdOworCisgICAgICAgICAgICAgICAgaWYoeSl7CisgICAgICAgICAgICAgICAgICAgIHQ9IHNyY1t4ICsgKHktMSkqc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoeCl7CisgICAgICAgICAgICAgICAgICAgICAgICBsdD0gc3JjW3ggLSAxICsgKHktMSkqc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih4ICsgMSA8IHcpeworICAgICAgICAgICAgICAgICAgICAgICAgcnQ9IHNyY1t4ICsgMSArICh5LTEpKnN0cmlkZV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoeCl7CisgICAgICAgICAgICAgICAgICAgIGw9IHNyY1t4IC0gMSArIHkqc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgLyppZih4ID4gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihvcmllbnRhdGlvbj09MSkgbGw9IHNyY1t5ICsgKHgtMikqc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICBsbD0gc3JjW3ggLSAyICsgeSpzdHJpZGVdOworICAgICAgICAgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYocGFyZW50KXsKKyAgICAgICAgICAgICAgICAgICAgaW50IHB4PSB4Pj4xOworICAgICAgICAgICAgICAgICAgICBpbnQgcHk9IHk+PjE7CisgICAgICAgICAgICAgICAgICAgIGlmKHB4PGItPnBhcmVudC0+d2lkdGggJiYgcHk8Yi0+cGFyZW50LT5oZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICBwPSBwYXJlbnRbcHggKyBweSoyKnN0cmlkZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKC8qbGx8Ki9sfGx0fHR8cnR8cCl7CisgICAgICAgICAgICAgICAgICAgIGludCBjb250ZXh0PSBhdl9sb2cyKC8qRkZBQlMobGwpICsgKi8zKkZGQUJTKGwpICsgRkZBQlMobHQpICsgMipGRkFCUyh0KSArIEZGQUJTKHJ0KSArIEZGQUJTKHApKTsKKworICAgICAgICAgICAgICAgICAgICBwdXRfcmFjKCZzLT5jLCAmYi0+c3RhdGVbMF1bY29udGV4dF0sICEhdik7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGlmKCFydW4peworICAgICAgICAgICAgICAgICAgICAgICAgcnVuPSBydW5zW3J1bl9pbmRleCsrXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYocnVuX2luZGV4IDw9IG1heF9pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRfc3ltYm9sMigmcy0+YywgYi0+c3RhdGVbMV0sIHJ1biwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKHYpOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bi0tOworICAgICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0Mighdik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYodil7CisgICAgICAgICAgICAgICAgICAgIGludCBjb250ZXh0PSBhdl9sb2cyKC8qRkZBQlMobGwpICsgKi8zKkZGQUJTKGwpICsgRkZBQlMobHQpICsgMipGRkFCUyh0KSArIEZGQUJTKHJ0KSArIEZGQUJTKHApKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGwyPSAyKkZGQUJTKGwpICsgKGw8MCk7CisgICAgICAgICAgICAgICAgICAgIGludCB0Mj0gMipGRkFCUyh0KSArICh0PDApOworCisgICAgICAgICAgICAgICAgICAgIHB1dF9zeW1ib2wyKCZzLT5jLCBiLT5zdGF0ZVtjb250ZXh0ICsgMl0sIEZGQUJTKHYpLTEsIGNvbnRleHQtNCk7CisgICAgICAgICAgICAgICAgICAgIHB1dF9yYWMoJnMtPmMsICZiLT5zdGF0ZVswXVsxNiArIDEgKyAzICsgZmZfcXVhbnQzYkFbbDImMHhGRl0gKyAzKmZmX3F1YW50M2JBW3QyJjB4RkZdXSwgdjwwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3N1YmJhbmQoU25vd0NvbnRleHQgKnMsIFN1YkJhbmQgKmIsIGNvbnN0IElEV1RFTEVNICpzcmMsIGNvbnN0IElEV1RFTEVNICpwYXJlbnQsIGludCBzdHJpZGUsIGludCBvcmllbnRhdGlvbil7CisvLyAgICBlbmNvZGVfc3ViYmFuZF9xdHJlZShzLCBiLCBzcmMsIHBhcmVudCwgc3RyaWRlLCBvcmllbnRhdGlvbik7CisvLyAgICBlbmNvZGVfc3ViYmFuZF96MHJ1bihzLCBiLCBzcmMsIHBhcmVudCwgc3RyaWRlLCBvcmllbnRhdGlvbik7CisgICAgcmV0dXJuIGVuY29kZV9zdWJiYW5kX2MwcnVuKHMsIGIsIHNyYywgcGFyZW50LCBzdHJpZGUsIG9yaWVudGF0aW9uKTsKKy8vICAgIGVuY29kZV9zdWJiYW5kX2R6cihzLCBiLCBzcmMsIHBhcmVudCwgc3RyaWRlLCBvcmllbnRhdGlvbik7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBjaGVja19ibG9jayhTbm93Q29udGV4dCAqcywgaW50IG1iX3gsIGludCBtYl95LCBpbnQgcFszXSwgaW50IGludHJhLCB1aW50OF90ICgqb2JtY19lZGdlZClbTUJfU0laRSAqIDJdLCBpbnQgKmJlc3RfcmQpeworICAgIGNvbnN0IGludCBiX3N0cmlkZT0gcy0+Yl93aWR0aCA8PCBzLT5ibG9ja19tYXhfZGVwdGg7CisgICAgQmxvY2tOb2RlICpibG9jaz0gJnMtPmJsb2NrW21iX3ggKyBtYl95ICogYl9zdHJpZGVdOworICAgIEJsb2NrTm9kZSBiYWNrdXA9ICpibG9jazsKKyAgICB1bnNpZ25lZCB2YWx1ZTsKKyAgICBpbnQgcmQsIGluZGV4OworCisgICAgYXZfYXNzZXJ0MihtYl94Pj0wICYmIG1iX3k+PTApOworICAgIGF2X2Fzc2VydDIobWJfeDxiX3N0cmlkZSk7CisKKyAgICBpZihpbnRyYSl7CisgICAgICAgIGJsb2NrLT5jb2xvclswXSA9IHBbMF07CisgICAgICAgIGJsb2NrLT5jb2xvclsxXSA9IHBbMV07CisgICAgICAgIGJsb2NrLT5jb2xvclsyXSA9IHBbMl07CisgICAgICAgIGJsb2NrLT50eXBlIHw9IEJMT0NLX0lOVFJBOworICAgIH1lbHNleworICAgICAgICBpbmRleD0gKHBbMF0gKyAzMSpwWzFdKSAmIChNRV9DQUNIRV9TSVpFLTEpOworICAgICAgICB2YWx1ZT0gcy0+bWVfY2FjaGVfZ2VuZXJhdGlvbiArIChwWzBdPj4xMCkgKyAocFsxXTw8NikgKyAoYmxvY2stPnJlZjw8MTIpOworICAgICAgICBpZihzLT5tZV9jYWNoZVtpbmRleF0gPT0gdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcy0+bWVfY2FjaGVbaW5kZXhdPSB2YWx1ZTsKKworICAgICAgICBibG9jay0+bXg9IHBbMF07CisgICAgICAgIGJsb2NrLT5teT0gcFsxXTsKKyAgICAgICAgYmxvY2stPnR5cGUgJj0gfkJMT0NLX0lOVFJBOworICAgIH0KKworICAgIHJkPSBnZXRfYmxvY2tfcmQocywgbWJfeCwgbWJfeSwgMCwgb2JtY19lZGdlZCk7CisKKy8vRklYTUUgY2hyb21hCisgICAgaWYocmQgPCAqYmVzdF9yZCl7CisgICAgICAgICpiZXN0X3JkPSByZDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfWVsc2V7CisgICAgICAgICpibG9jaz0gYmFja3VwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIHNwZWNpYWwgY2FzZSBmb3IgaW50WzJdIGFyZ3Mgd2UgZGlzY2FyZCBhZnRlcndhcmRzLAorICogZml4ZXMgY29tcGlsYXRpb24gcHJvYmxlbSB3aXRoIGdjYyAyLjk1ICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgY2hlY2tfYmxvY2tfaW50ZXIoU25vd0NvbnRleHQgKnMsIGludCBtYl94LCBpbnQgbWJfeSwgaW50IHAwLCBpbnQgcDEsIHVpbnQ4X3QgKCpvYm1jX2VkZ2VkKVtNQl9TSVpFICogMl0sIGludCAqYmVzdF9yZCl7CisgICAgaW50IHBbMl0gPSB7cDAsIHAxfTsKKyAgICByZXR1cm4gY2hlY2tfYmxvY2socywgbWJfeCwgbWJfeSwgcCwgMCwgb2JtY19lZGdlZCwgYmVzdF9yZCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBjaGVja180YmxvY2tfaW50ZXIoU25vd0NvbnRleHQgKnMsIGludCBtYl94LCBpbnQgbWJfeSwgaW50IHAwLCBpbnQgcDEsIGludCByZWYsIGludCAqYmVzdF9yZCl7CisgICAgY29uc3QgaW50IGJfc3RyaWRlPSBzLT5iX3dpZHRoIDw8IHMtPmJsb2NrX21heF9kZXB0aDsKKyAgICBCbG9ja05vZGUgKmJsb2NrPSAmcy0+YmxvY2tbbWJfeCArIG1iX3kgKiBiX3N0cmlkZV07CisgICAgQmxvY2tOb2RlIGJhY2t1cFs0XTsKKyAgICB1bnNpZ25lZCB2YWx1ZTsKKyAgICBpbnQgcmQsIGluZGV4OworCisgICAgLyogV2UgZG9uJ3QgaW5pdGlhbGl6ZSBiYWNrdXBbXSBkdXJpbmcgdmFyaWFibGUgZGVjbGFyYXRpb24sIGJlY2F1c2UKKyAgICAgKiB0aGF0IGZhaWxzIHRvIGNvbXBpbGUgb24gTVNWQzogImNhbm5vdCBjb252ZXJ0IGZyb20gJ0Jsb2NrTm9kZScgdG8KKyAgICAgKiAnaW50MTZfdCciLiAqLworICAgIGJhY2t1cFswXSA9IGJsb2NrWzBdOworICAgIGJhY2t1cFsxXSA9IGJsb2NrWzFdOworICAgIGJhY2t1cFsyXSA9IGJsb2NrW2Jfc3RyaWRlXTsKKyAgICBiYWNrdXBbM10gPSBibG9ja1tiX3N0cmlkZSArIDFdOworCisgICAgYXZfYXNzZXJ0MihtYl94Pj0wICYmIG1iX3k+PTApOworICAgIGF2X2Fzc2VydDIobWJfeDxiX3N0cmlkZSk7CisgICAgYXZfYXNzZXJ0MigoKG1iX3h8bWJfeSkmMSkgPT0gMCk7CisKKyAgICBpbmRleD0gKHAwICsgMzEqcDEpICYgKE1FX0NBQ0hFX1NJWkUtMSk7CisgICAgdmFsdWU9IHMtPm1lX2NhY2hlX2dlbmVyYXRpb24gKyAocDA+PjEwKSArIChwMTw8NikgKyAoYmxvY2stPnJlZjw8MTIpOworICAgIGlmKHMtPm1lX2NhY2hlW2luZGV4XSA9PSB2YWx1ZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcy0+bWVfY2FjaGVbaW5kZXhdPSB2YWx1ZTsKKworICAgIGJsb2NrLT5teD0gcDA7CisgICAgYmxvY2stPm15PSBwMTsKKyAgICBibG9jay0+cmVmPSByZWY7CisgICAgYmxvY2stPnR5cGUgJj0gfkJMT0NLX0lOVFJBOworICAgIGJsb2NrWzFdPSBibG9ja1tiX3N0cmlkZV09IGJsb2NrW2Jfc3RyaWRlKzFdPSAqYmxvY2s7CisKKyAgICByZD0gZ2V0XzRibG9ja19yZChzLCBtYl94LCBtYl95LCAwKTsKKworLy9GSVhNRSBjaHJvbWEKKyAgICBpZihyZCA8ICpiZXN0X3JkKXsKKyAgICAgICAgKmJlc3RfcmQ9IHJkOworICAgICAgICByZXR1cm4gMTsKKyAgICB9ZWxzZXsKKyAgICAgICAgYmxvY2tbMF09IGJhY2t1cFswXTsKKyAgICAgICAgYmxvY2tbMV09IGJhY2t1cFsxXTsKKyAgICAgICAgYmxvY2tbYl9zdHJpZGVdPSBiYWNrdXBbMl07CisgICAgICAgIGJsb2NrW2Jfc3RyaWRlKzFdPSBiYWNrdXBbM107CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaXRlcmF0aXZlX21lKFNub3dDb250ZXh0ICpzKXsKKyAgICBpbnQgcGFzcywgbWJfeCwgbWJfeTsKKyAgICBjb25zdCBpbnQgYl93aWR0aCA9IHMtPmJfd2lkdGggIDw8IHMtPmJsb2NrX21heF9kZXB0aDsKKyAgICBjb25zdCBpbnQgYl9oZWlnaHQ9IHMtPmJfaGVpZ2h0IDw8IHMtPmJsb2NrX21heF9kZXB0aDsKKyAgICBjb25zdCBpbnQgYl9zdHJpZGU9IGJfd2lkdGg7CisgICAgaW50IGNvbG9yWzNdOworCisgICAgeworICAgICAgICBSYW5nZUNvZGVyIHIgPSBzLT5jOworICAgICAgICB1aW50OF90IHN0YXRlW3NpemVvZihzLT5ibG9ja19zdGF0ZSldOworICAgICAgICBtZW1jcHkoc3RhdGUsIHMtPmJsb2NrX3N0YXRlLCBzaXplb2Yocy0+YmxvY2tfc3RhdGUpKTsKKyAgICAgICAgZm9yKG1iX3k9IDA7IG1iX3k8cy0+Yl9oZWlnaHQ7IG1iX3krKykKKyAgICAgICAgICAgIGZvcihtYl94PSAwOyBtYl94PHMtPmJfd2lkdGg7IG1iX3grKykKKyAgICAgICAgICAgICAgICBlbmNvZGVfcV9icmFuY2gocywgMCwgbWJfeCwgbWJfeSk7CisgICAgICAgIHMtPmMgPSByOworICAgICAgICBtZW1jcHkocy0+YmxvY2tfc3RhdGUsIHN0YXRlLCBzaXplb2Yocy0+YmxvY2tfc3RhdGUpKTsKKyAgICB9CisKKyAgICBmb3IocGFzcz0wOyBwYXNzPDI1OyBwYXNzKyspeworICAgICAgICBpbnQgY2hhbmdlPSAwOworCisgICAgICAgIGZvcihtYl95PSAwOyBtYl95PGJfaGVpZ2h0OyBtYl95KyspeworICAgICAgICAgICAgZm9yKG1iX3g9IDA7IG1iX3g8Yl93aWR0aDsgbWJfeCsrKXsKKyAgICAgICAgICAgICAgICBpbnQgZGlhX2NoYW5nZSwgaSwgaiwgcmVmOworICAgICAgICAgICAgICAgIGludCBiZXN0X3JkPSBJTlRfTUFYLCByZWZfcmQ7CisgICAgICAgICAgICAgICAgQmxvY2tOb2RlIGJhY2t1cCwgcmVmX2I7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGluZGV4PSBtYl94ICsgbWJfeSAqIGJfc3RyaWRlOworICAgICAgICAgICAgICAgIEJsb2NrTm9kZSAqYmxvY2s9ICZzLT5ibG9ja1tpbmRleF07CisgICAgICAgICAgICAgICAgQmxvY2tOb2RlICp0YiA9ICAgICAgICAgICAgICAgICAgIG1iX3kgICAgICAgICAgICA/ICZzLT5ibG9ja1tpbmRleC1iX3N0cmlkZSAgXSA6IE5VTEw7CisgICAgICAgICAgICAgICAgQmxvY2tOb2RlICpsYiA9IG1iX3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZzLT5ibG9ja1tpbmRleCAgICAgICAgIC0xXSA6IE5VTEw7CisgICAgICAgICAgICAgICAgQmxvY2tOb2RlICpyYiA9IG1iX3grMTxiX3dpZHRoICAgICAgICAgICAgICAgICAgICA/ICZzLT5ibG9ja1tpbmRleCAgICAgICAgICsxXSA6IE5VTEw7CisgICAgICAgICAgICAgICAgQmxvY2tOb2RlICpiYiA9ICAgICAgICAgICAgICAgICAgIG1iX3krMTxiX2hlaWdodCA/ICZzLT5ibG9ja1tpbmRleCtiX3N0cmlkZSAgXSA6IE5VTEw7CisgICAgICAgICAgICAgICAgQmxvY2tOb2RlICp0bGI9IG1iX3ggICAgICAgICAgICYmIG1iX3kgICAgICAgICAgICA/ICZzLT5ibG9ja1tpbmRleC1iX3N0cmlkZS0xXSA6IE5VTEw7CisgICAgICAgICAgICAgICAgQmxvY2tOb2RlICp0cmI9IG1iX3grMTxiX3dpZHRoICYmIG1iX3kgICAgICAgICAgICA/ICZzLT5ibG9ja1tpbmRleC1iX3N0cmlkZSsxXSA6IE5VTEw7CisgICAgICAgICAgICAgICAgQmxvY2tOb2RlICpibGI9IG1iX3ggICAgICAgICAgICYmIG1iX3krMTxiX2hlaWdodCA/ICZzLT5ibG9ja1tpbmRleCtiX3N0cmlkZS0xXSA6IE5VTEw7CisgICAgICAgICAgICAgICAgQmxvY2tOb2RlICpicmI9IG1iX3grMTxiX3dpZHRoICYmIG1iX3krMTxiX2hlaWdodCA/ICZzLT5ibG9ja1tpbmRleCtiX3N0cmlkZSsxXSA6IE5VTEw7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGJfdz0gKE1CX1NJWkUgPj4gcy0+YmxvY2tfbWF4X2RlcHRoKTsKKyAgICAgICAgICAgICAgICB1aW50OF90IG9ibWNfZWRnZWRbTUJfU0laRSAqIDJdW01CX1NJWkUgKiAyXTsKKworICAgICAgICAgICAgICAgIGlmKHBhc3MgJiYgKGJsb2NrLT50eXBlICYgQkxPQ0tfT1BUKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgYmxvY2stPnR5cGUgfD0gQkxPQ0tfT1BUOworCisgICAgICAgICAgICAgICAgYmFja3VwPSAqYmxvY2s7CisKKyAgICAgICAgICAgICAgICBpZighcy0+bWVfY2FjaGVfZ2VuZXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPm1lX2NhY2hlLCAwLCBzaXplb2Yocy0+bWVfY2FjaGUpKTsKKyAgICAgICAgICAgICAgICBzLT5tZV9jYWNoZV9nZW5lcmF0aW9uICs9IDE8PDIyOworCisgICAgICAgICAgICAgICAgLy9GSVhNRSBwcmVjYWxjdWxhdGUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB4LCB5OworICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYl93ICogMjsgeSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG9ibWNfZWRnZWRbeV0sIGZmX29ibWNfdGFiW3MtPmJsb2NrX21heF9kZXB0aF0gKyB5ICogYl93ICogMiwgYl93ICogMik7CisgICAgICAgICAgICAgICAgICAgIGlmKG1iX3g9PTApCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoeT0wOyB5PGJfdyoyOyB5KyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG9ibWNfZWRnZWRbeV0sIG9ibWNfZWRnZWRbeV1bMF0gKyBvYm1jX2VkZ2VkW3ldW2Jfdy0xXSwgYl93KTsKKyAgICAgICAgICAgICAgICAgICAgaWYobWJfeD09Yl9zdHJpZGUtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcih5PTA7IHk8Yl93KjI7IHkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQob2JtY19lZGdlZFt5XStiX3csIG9ibWNfZWRnZWRbeV1bYl93XSArIG9ibWNfZWRnZWRbeV1bYl93KjItMV0sIGJfdyk7CisgICAgICAgICAgICAgICAgICAgIGlmKG1iX3k9PTApeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDxiX3cqMjsgeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ibWNfZWRnZWRbMF1beF0gKz0gb2JtY19lZGdlZFtiX3ctMV1beF07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoeT0xOyB5PGJfdzsgeSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShvYm1jX2VkZ2VkW3ldLCBvYm1jX2VkZ2VkWzBdLCBiX3cqMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYobWJfeT09Yl9oZWlnaHQtMSl7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PGJfdyoyOyB4KyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JtY19lZGdlZFtiX3cqMi0xXVt4XSArPSBvYm1jX2VkZ2VkW2Jfd11beF07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoeT1iX3c7IHk8Yl93KjItMTsgeSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShvYm1jX2VkZ2VkW3ldLCBvYm1jX2VkZ2VkW2JfdyoyLTFdLCBiX3cqMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL3NraXAgc3R1ZmYgb3V0c2lkZSB0aGUgcGljdHVyZQorICAgICAgICAgICAgICAgIGlmKG1iX3g9PTAgfHwgbWJfeT09MCB8fCBtYl94PT1iX3dpZHRoLTEgfHwgbWJfeT09Yl9oZWlnaHQtMSl7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYz0gcy0+ICBpbnB1dF9waWN0dXJlLT5kYXRhWzBdOworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3Q9IHMtPmN1cnJlbnRfcGljdHVyZS0+ZGF0YVswXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0cmlkZT0gcy0+Y3VycmVudF9waWN0dXJlLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJsb2NrX3c9IE1CX1NJWkUgPj4gcy0+YmxvY2tfbWF4X2RlcHRoOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmxvY2tfaD0gTUJfU0laRSA+PiBzLT5ibG9ja19tYXhfZGVwdGg7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzeD0gYmxvY2tfdyptYl94IC0gYmxvY2tfdy8yOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3k9IGJsb2NrX2gqbWJfeSAtIGJsb2NrX2gvMjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHc9IHMtPnBsYW5lWzBdLndpZHRoOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaD0gcy0+cGxhbmVbMF0uaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBpbnQgeTsKKworICAgICAgICAgICAgICAgICAgICBmb3IoeT1zeTsgeTwwOyB5KyspCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0ICsgc3ggKyB5KnN0cmlkZSwgc3JjICsgc3ggKyB5KnN0cmlkZSwgYmxvY2tfdyoyKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKHk9aDsgeTxzeStibG9ja19oKjI7IHkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QgKyBzeCArIHkqc3RyaWRlLCBzcmMgKyBzeCArIHkqc3RyaWRlLCBibG9ja193KjIpOworICAgICAgICAgICAgICAgICAgICBpZihzeDwwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcih5PXN5OyB5PHN5K2Jsb2NrX2gqMjsgeSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QgKyBzeCArIHkqc3RyaWRlLCBzcmMgKyBzeCArIHkqc3RyaWRlLCAtc3gpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHN4K2Jsb2NrX3cqMiA+IHcpeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHk9c3k7IHk8c3krYmxvY2tfaCoyOyB5KyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCArIHcgKyB5KnN0cmlkZSwgc3JjICsgdyArIHkqc3RyaWRlLCBzeCtibG9ja193KjIgLSB3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGludHJhKGJsYWNrKSA9IG5laWdoYm9ycycgY29udHJpYnV0aW9uIHRvIHRoZSBjdXJyZW50IGJsb2NrCisgICAgICAgICAgICAgICAgZm9yKGk9MDsgaSA8IHMtPm5iX3BsYW5lczsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjb2xvcltpXT0gZ2V0X2RjKHMsIG1iX3gsIG1iX3ksIGkpOworCisgICAgICAgICAgICAgICAgLy8gZ2V0IHByZXZpb3VzIHNjb3JlIChjYW5ub3QgYmUgY2FjaGVkIGR1ZSB0byBPQk1DKQorICAgICAgICAgICAgICAgIGlmKHBhc3MgPiAwICYmIChibG9jay0+dHlwZSZCTE9DS19JTlRSQSkpeworICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwWzNdPSB7YmxvY2stPmNvbG9yWzBdLCBibG9jay0+Y29sb3JbMV0sIGJsb2NrLT5jb2xvclsyXX07CisgICAgICAgICAgICAgICAgICAgIGNoZWNrX2Jsb2NrKHMsIG1iX3gsIG1iX3ksIGNvbG9yMCwgMSwgb2JtY19lZGdlZCwgJmJlc3RfcmQpOworICAgICAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgICAgIGNoZWNrX2Jsb2NrX2ludGVyKHMsIG1iX3gsIG1iX3ksIGJsb2NrLT5teCwgYmxvY2stPm15LCBvYm1jX2VkZ2VkLCAmYmVzdF9yZCk7CisKKyAgICAgICAgICAgICAgICByZWZfYj0gKmJsb2NrOworICAgICAgICAgICAgICAgIHJlZl9yZD0gYmVzdF9yZDsKKyAgICAgICAgICAgICAgICBmb3IocmVmPTA7IHJlZiA8IHMtPnJlZl9mcmFtZXM7IHJlZisrKXsKKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAoKm12cilbMl09ICZzLT5yZWZfbXZzW3JlZl1baW5kZXhdOworICAgICAgICAgICAgICAgICAgICBpZihzLT5yZWZfc2NvcmVzW3JlZl1baW5kZXhdID4gcy0+cmVmX3Njb3Jlc1tyZWZfYi5yZWZdW2luZGV4XSozLzIpIC8vRklYTUUgdHVuZSB0aHJlc2hvbGQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBibG9jay0+cmVmPSByZWY7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfcmQ9IElOVF9NQVg7CisKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfYmxvY2tfaW50ZXIocywgbWJfeCwgbWJfeSwgbXZyWzBdWzBdLCBtdnJbMF1bMV0sIG9ibWNfZWRnZWQsICZiZXN0X3JkKTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfYmxvY2tfaW50ZXIocywgbWJfeCwgbWJfeSwgMCwgMCwgb2JtY19lZGdlZCwgJmJlc3RfcmQpOworICAgICAgICAgICAgICAgICAgICBpZih0YikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2Jsb2NrX2ludGVyKHMsIG1iX3gsIG1iX3ksIG12clstYl9zdHJpZGVdWzBdLCBtdnJbLWJfc3RyaWRlXVsxXSwgb2JtY19lZGdlZCwgJmJlc3RfcmQpOworICAgICAgICAgICAgICAgICAgICBpZihsYikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2Jsb2NrX2ludGVyKHMsIG1iX3gsIG1iX3ksIG12clstMV1bMF0sIG12clstMV1bMV0sIG9ibWNfZWRnZWQsICZiZXN0X3JkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocmIpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19ibG9ja19pbnRlcihzLCBtYl94LCBtYl95LCBtdnJbMV1bMF0sIG12clsxXVsxXSwgb2JtY19lZGdlZCwgJmJlc3RfcmQpOworICAgICAgICAgICAgICAgICAgICBpZihiYikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2Jsb2NrX2ludGVyKHMsIG1iX3gsIG1iX3ksIG12cltiX3N0cmlkZV1bMF0sIG12cltiX3N0cmlkZV1bMV0sIG9ibWNfZWRnZWQsICZiZXN0X3JkKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBmdWxscGVsIE1FICovCisgICAgICAgICAgICAgICAgICAgIC8vRklYTUUgYXZvaWQgc3VicGVsIGludGVycG9sYXRpb24gLyByb3VuZCB0byBuZWFyZXN0IGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgZG97CisgICAgICAgICAgICAgICAgICAgICAgICBkaWFfY2hhbmdlPTA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPEZGTUFYKHMtPmF2Y3R4LT5kaWFfc2l6ZSwgMSk7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDsgajxpOyBqKyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFfY2hhbmdlIHw9IGNoZWNrX2Jsb2NrX2ludGVyKHMsIG1iX3gsIG1iX3ksIGJsb2NrLT5teCs0KihpLWopLCBibG9jay0+bXkrKDQqaiksIG9ibWNfZWRnZWQsICZiZXN0X3JkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhX2NoYW5nZSB8PSBjaGVja19ibG9ja19pbnRlcihzLCBtYl94LCBtYl95LCBibG9jay0+bXgtNCooaS1qKSwgYmxvY2stPm15LSg0KmopLCBvYm1jX2VkZ2VkLCAmYmVzdF9yZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYV9jaGFuZ2UgfD0gY2hlY2tfYmxvY2tfaW50ZXIocywgbWJfeCwgbWJfeSwgYmxvY2stPm14KzQqKGktaiksIGJsb2NrLT5teS0oNCpqKSwgb2JtY19lZGdlZCwgJmJlc3RfcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFfY2hhbmdlIHw9IGNoZWNrX2Jsb2NrX2ludGVyKHMsIG1iX3gsIG1iX3ksIGJsb2NrLT5teC00KihpLWopLCBibG9jay0+bXkrKDQqaiksIG9ibWNfZWRnZWQsICZiZXN0X3JkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH13aGlsZShkaWFfY2hhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VicGVsIE1FICovCisgICAgICAgICAgICAgICAgICAgIGRveworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBzcXVhcmVbOF1bMl09IHt7KzEsIDB9LHstMSwgMH0seyAwLCsxfSx7IDAsLTF9LHsrMSwrMX0sey0xLC0xfSx7KzEsLTF9LHstMSwrMX0sfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpYV9jaGFuZ2U9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8ODsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYV9jaGFuZ2UgfD0gY2hlY2tfYmxvY2tfaW50ZXIocywgbWJfeCwgbWJfeSwgYmxvY2stPm14K3NxdWFyZVtpXVswXSwgYmxvY2stPm15K3NxdWFyZVtpXVsxXSwgb2JtY19lZGdlZCwgJmJlc3RfcmQpOworICAgICAgICAgICAgICAgICAgICB9d2hpbGUoZGlhX2NoYW5nZSk7CisgICAgICAgICAgICAgICAgICAgIC8vRklYTUUgb3IgdHJ5IHRoZSBzdGFuZGFyZCAyIHBhc3MgcXBlbCBvciBzaW1pbGFyCisKKyAgICAgICAgICAgICAgICAgICAgbXZyWzBdWzBdPSBibG9jay0+bXg7CisgICAgICAgICAgICAgICAgICAgIG12clswXVsxXT0gYmxvY2stPm15OworICAgICAgICAgICAgICAgICAgICBpZihyZWZfcmQgPiBiZXN0X3JkKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9yZD0gYmVzdF9yZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9iPSAqYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmVzdF9yZD0gcmVmX3JkOworICAgICAgICAgICAgICAgICpibG9jaz0gcmVmX2I7CisgICAgICAgICAgICAgICAgY2hlY2tfYmxvY2socywgbWJfeCwgbWJfeSwgY29sb3IsIDEsIG9ibWNfZWRnZWQsICZiZXN0X3JkKTsKKyAgICAgICAgICAgICAgICAvL0ZJWE1FIFJEIHN0eWxlIGNvbG9yIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgIGlmKCFzYW1lX2Jsb2NrKGJsb2NrLCAmYmFja3VwKSl7CisgICAgICAgICAgICAgICAgICAgIGlmKHRiICkgdGIgLT50eXBlICY9IH5CTE9DS19PUFQ7CisgICAgICAgICAgICAgICAgICAgIGlmKGxiICkgbGIgLT50eXBlICY9IH5CTE9DS19PUFQ7CisgICAgICAgICAgICAgICAgICAgIGlmKHJiICkgcmIgLT50eXBlICY9IH5CTE9DS19PUFQ7CisgICAgICAgICAgICAgICAgICAgIGlmKGJiICkgYmIgLT50eXBlICY9IH5CTE9DS19PUFQ7CisgICAgICAgICAgICAgICAgICAgIGlmKHRsYikgdGxiLT50eXBlICY9IH5CTE9DS19PUFQ7CisgICAgICAgICAgICAgICAgICAgIGlmKHRyYikgdHJiLT50eXBlICY9IH5CTE9DS19PUFQ7CisgICAgICAgICAgICAgICAgICAgIGlmKGJsYikgYmxiLT50eXBlICY9IH5CTE9DS19PUFQ7CisgICAgICAgICAgICAgICAgICAgIGlmKGJyYikgYnJiLT50eXBlICY9IH5CTE9DS19PUFQ7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZSArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJwYXNzOiVkIGNoYW5nZWQ6JWRcbiIsIHBhc3MsIGNoYW5nZSk7CisgICAgICAgIGlmKCFjaGFuZ2UpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZihzLT5ibG9ja19tYXhfZGVwdGggPT0gMSl7CisgICAgICAgIGludCBjaGFuZ2U9IDA7CisgICAgICAgIGZvcihtYl95PSAwOyBtYl95PGJfaGVpZ2h0OyBtYl95Kz0yKXsKKyAgICAgICAgICAgIGZvcihtYl94PSAwOyBtYl94PGJfd2lkdGg7IG1iX3grPTIpeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGludCBiZXN0X3JkLCBpbml0X3JkOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleD0gbWJfeCArIG1iX3kgKiBiX3N0cmlkZTsKKyAgICAgICAgICAgICAgICBCbG9ja05vZGUgKmJbNF07CisKKyAgICAgICAgICAgICAgICBiWzBdPSAmcy0+YmxvY2tbaW5kZXhdOworICAgICAgICAgICAgICAgIGJbMV09IGJbMF0rMTsKKyAgICAgICAgICAgICAgICBiWzJdPSBiWzBdK2Jfc3RyaWRlOworICAgICAgICAgICAgICAgIGJbM109IGJbMl0rMTsKKyAgICAgICAgICAgICAgICBpZihzYW1lX2Jsb2NrKGJbMF0sIGJbMV0pICYmCisgICAgICAgICAgICAgICAgICAgc2FtZV9ibG9jayhiWzBdLCBiWzJdKSAmJgorICAgICAgICAgICAgICAgICAgIHNhbWVfYmxvY2soYlswXSwgYlszXSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYoIXMtPm1lX2NhY2hlX2dlbmVyYXRpb24pCisgICAgICAgICAgICAgICAgICAgIG1lbXNldChzLT5tZV9jYWNoZSwgMCwgc2l6ZW9mKHMtPm1lX2NhY2hlKSk7CisgICAgICAgICAgICAgICAgcy0+bWVfY2FjaGVfZ2VuZXJhdGlvbiArPSAxPDwyMjsKKworICAgICAgICAgICAgICAgIGluaXRfcmQ9IGJlc3RfcmQ9IGdldF80YmxvY2tfcmQocywgbWJfeCwgbWJfeSwgMCk7CisKKyAgICAgICAgICAgICAgICAvL0ZJWE1FIG1vcmUgbXVsdGlyZWYgc2VhcmNoPworICAgICAgICAgICAgICAgIGNoZWNrXzRibG9ja19pbnRlcihzLCBtYl94LCBtYl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYlswXS0+bXggKyBiWzFdLT5teCArIGJbMl0tPm14ICsgYlszXS0+bXggKyAyKSA+PiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYlswXS0+bXkgKyBiWzFdLT5teSArIGJbMl0tPm15ICsgYlszXS0+bXkgKyAyKSA+PiAyLCAwLCAmYmVzdF9yZCk7CisKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYoIShiW2ldLT50eXBlJkJMT0NLX0lOVFJBKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrXzRibG9ja19pbnRlcihzLCBtYl94LCBtYl95LCBiW2ldLT5teCwgYltpXS0+bXksIGJbaV0tPnJlZiwgJmJlc3RfcmQpOworCisgICAgICAgICAgICAgICAgaWYoaW5pdF9yZCAhPSBiZXN0X3JkKQorICAgICAgICAgICAgICAgICAgICBjaGFuZ2UrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInBhc3M6NG12IGNoYW5nZWQ6JWRcbiIsIGNoYW5nZSo0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9ibG9ja3MoU25vd0NvbnRleHQgKnMsIGludCBzZWFyY2gpeworICAgIGludCB4LCB5OworICAgIGludCB3PSBzLT5iX3dpZHRoOworICAgIGludCBoPSBzLT5iX2hlaWdodDsKKworICAgIGlmKHMtPmF2Y3R4LT5tZV9tZXRob2QgPT0gTUVfSVRFUiAmJiAhcy0+a2V5ZnJhbWUgJiYgc2VhcmNoKQorICAgICAgICBpdGVyYXRpdmVfbWUocyk7CisKKyAgICBmb3IoeT0wOyB5PGg7IHkrKyl7CisgICAgICAgIGlmKHMtPmMuYnl0ZXN0cmVhbV9lbmQgLSBzLT5jLmJ5dGVzdHJlYW0gPCB3Kk1CX1NJWkUqTUJfU0laRSozKXsgLy9GSVhNRSBuaWNlciBsaW1pdAorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlbmNvZGVkIGZyYW1lIHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICAgICAgaWYocy0+YXZjdHgtPm1lX21ldGhvZCA9PSBNRV9JVEVSIHx8ICFzZWFyY2gpCisgICAgICAgICAgICAgICAgZW5jb2RlX3FfYnJhbmNoMihzLCAwLCB4LCB5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlbmNvZGVfcV9icmFuY2ggKHMsIDAsIHgsIHkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBxdWFudGl6ZShTbm93Q29udGV4dCAqcywgU3ViQmFuZCAqYiwgSURXVEVMRU0gKmRzdCwgRFdURUxFTSAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgYmlhcyl7CisgICAgY29uc3QgaW50IHc9IGItPndpZHRoOworICAgIGNvbnN0IGludCBoPSBiLT5oZWlnaHQ7CisgICAgY29uc3QgaW50IHFsb2c9IGF2X2NsaXAocy0+cWxvZyArIGItPnFsb2csIDAsIFFST09UKjE2KTsKKyAgICBjb25zdCBpbnQgcW11bD0gZmZfcWV4cFtxbG9nJihRUk9PVC0xKV08PCgocWxvZz4+UVNISUZUKSArIEVOQ09ERVJfRVhUUkFfQklUUyk7CisgICAgaW50IHgseSwgdGhyZXMxLCB0aHJlczI7CisKKyAgICBpZihzLT5xbG9nID09IExPU1NMRVNTX1FMT0cpeworICAgICAgICBmb3IoeT0wOyB5PGg7IHkrKykKKyAgICAgICAgICAgIGZvcih4PTA7IHg8dzsgeCsrKQorICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdPSBzcmNbeCArIHkqc3RyaWRlXTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJpYXM9IGJpYXMgPyAwIDogKDMqcW11bCk+PjM7CisgICAgdGhyZXMxPSAoKHFtdWwgLSBiaWFzKT4+UUVYUFNISUZUKSAtIDE7CisgICAgdGhyZXMyPSAyKnRocmVzMTsKKworICAgIGlmKCFiaWFzKXsKKyAgICAgICAgZm9yKHk9MDsgeTxoOyB5KyspeworICAgICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICAgICAgICAgIGludCBpPSBzcmNbeCArIHkqc3RyaWRlXTsKKworICAgICAgICAgICAgICAgIGlmKCh1bnNpZ25lZCkoaSt0aHJlczEpID4gdGhyZXMyKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoaT49MCl7CisgICAgICAgICAgICAgICAgICAgICAgICBpPDw9IFFFWFBTSElGVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkvPSBxbXVsOyAvL0ZJWE1FIG9wdGltaXplCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeCArIHkqc3RyaWRlXT0gIGk7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgaT0gLWk7CisgICAgICAgICAgICAgICAgICAgICAgICBpPDw9IFFFWFBTSElGVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkvPSBxbXVsOyAvL0ZJWE1FIG9wdGltaXplCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeCArIHkqc3RyaWRlXT0gLWk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICBkc3RbeCArIHkqc3RyaWRlXT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBmb3IoeT0wOyB5PGg7IHkrKyl7CisgICAgICAgICAgICBmb3IoeD0wOyB4PHc7IHgrKyl7CisgICAgICAgICAgICAgICAgaW50IGk9IHNyY1t4ICsgeSpzdHJpZGVdOworCisgICAgICAgICAgICAgICAgaWYoKHVuc2lnbmVkKShpK3RocmVzMSkgPiB0aHJlczIpeworICAgICAgICAgICAgICAgICAgICBpZihpPj0wKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGk8PD0gUUVYUFNISUZUOworICAgICAgICAgICAgICAgICAgICAgICAgaT0gKGkgKyBiaWFzKSAvIHFtdWw7IC8vRklYTUUgb3B0aW1pemUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdPSAgaTsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBpPSAtaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGk8PD0gUUVYUFNISUZUOworICAgICAgICAgICAgICAgICAgICAgICAgaT0gKGkgKyBiaWFzKSAvIHFtdWw7IC8vRklYTUUgb3B0aW1pemUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdPSAtaTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZXF1YW50aXplKFNub3dDb250ZXh0ICpzLCBTdWJCYW5kICpiLCBJRFdURUxFTSAqc3JjLCBpbnQgc3RyaWRlKXsKKyAgICBjb25zdCBpbnQgdz0gYi0+d2lkdGg7CisgICAgY29uc3QgaW50IGg9IGItPmhlaWdodDsKKyAgICBjb25zdCBpbnQgcWxvZz0gYXZfY2xpcChzLT5xbG9nICsgYi0+cWxvZywgMCwgUVJPT1QqMTYpOworICAgIGNvbnN0IGludCBxbXVsPSBmZl9xZXhwW3Fsb2cmKFFST09ULTEpXTw8KHFsb2c+PlFTSElGVCk7CisgICAgY29uc3QgaW50IHFhZGQ9IChzLT5xYmlhcypxbXVsKT4+UUJJQVNfU0hJRlQ7CisgICAgaW50IHgseTsKKworICAgIGlmKHMtPnFsb2cgPT0gTE9TU0xFU1NfUUxPRykgcmV0dXJuOworCisgICAgZm9yKHk9MDsgeTxoOyB5KyspeworICAgICAgICBmb3IoeD0wOyB4PHc7IHgrKyl7CisgICAgICAgICAgICBpbnQgaT0gc3JjW3ggKyB5KnN0cmlkZV07CisgICAgICAgICAgICBpZihpPDApeworICAgICAgICAgICAgICAgIHNyY1t4ICsgeSpzdHJpZGVdPSAtKCgtaSpxbXVsICsgcWFkZCk+PihRRVhQU0hJRlQpKTsgLy9GSVhNRSB0cnkgZGlmZmVyZW50IGJpYXMKKyAgICAgICAgICAgIH1lbHNlIGlmKGk+MCl7CisgICAgICAgICAgICAgICAgc3JjW3ggKyB5KnN0cmlkZV09ICAoKCBpKnFtdWwgKyBxYWRkKT4+KFFFWFBTSElGVCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvcnJlbGF0ZShTbm93Q29udGV4dCAqcywgU3ViQmFuZCAqYiwgSURXVEVMRU0gKnNyYywgaW50IHN0cmlkZSwgaW50IGludmVyc2UsIGludCB1c2VfbWVkaWFuKXsKKyAgICBjb25zdCBpbnQgdz0gYi0+d2lkdGg7CisgICAgY29uc3QgaW50IGg9IGItPmhlaWdodDsKKyAgICBpbnQgeCx5OworCisgICAgZm9yKHk9aC0xOyB5Pj0wOyB5LS0peworICAgICAgICBmb3IoeD13LTE7IHg+PTA7IHgtLSl7CisgICAgICAgICAgICBpbnQgaT0geCArIHkqc3RyaWRlOworCisgICAgICAgICAgICBpZih4KXsKKyAgICAgICAgICAgICAgICBpZih1c2VfbWVkaWFuKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoeSAmJiB4KzE8dykgc3JjW2ldIC09IG1pZF9wcmVkKHNyY1tpIC0gMV0sIHNyY1tpIC0gc3RyaWRlXSwgc3JjW2kgLSBzdHJpZGUgKyAxXSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgIHNyY1tpXSAtPSBzcmNbaSAtIDFdOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBpZih5KSBzcmNbaV0gLT0gbWlkX3ByZWQoc3JjW2kgLSAxXSwgc3JjW2kgLSBzdHJpZGVdLCBzcmNbaSAtIDFdICsgc3JjW2kgLSBzdHJpZGVdIC0gc3JjW2kgLSAxIC0gc3RyaWRlXSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgIHNyY1tpXSAtPSBzcmNbaSAtIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKHkpIHNyY1tpXSAtPSBzcmNbaSAtIHN0cmlkZV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcnJlbGF0ZShTbm93Q29udGV4dCAqcywgU3ViQmFuZCAqYiwgSURXVEVMRU0gKnNyYywgaW50IHN0cmlkZSwgaW50IGludmVyc2UsIGludCB1c2VfbWVkaWFuKXsKKyAgICBjb25zdCBpbnQgdz0gYi0+d2lkdGg7CisgICAgY29uc3QgaW50IGg9IGItPmhlaWdodDsKKyAgICBpbnQgeCx5OworCisgICAgZm9yKHk9MDsgeTxoOyB5KyspeworICAgICAgICBmb3IoeD0wOyB4PHc7IHgrKyl7CisgICAgICAgICAgICBpbnQgaT0geCArIHkqc3RyaWRlOworCisgICAgICAgICAgICBpZih4KXsKKyAgICAgICAgICAgICAgICBpZih1c2VfbWVkaWFuKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoeSAmJiB4KzE8dykgc3JjW2ldICs9IG1pZF9wcmVkKHNyY1tpIC0gMV0sIHNyY1tpIC0gc3RyaWRlXSwgc3JjW2kgLSBzdHJpZGUgKyAxXSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgIHNyY1tpXSArPSBzcmNbaSAtIDFdOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBpZih5KSBzcmNbaV0gKz0gbWlkX3ByZWQoc3JjW2kgLSAxXSwgc3JjW2kgLSBzdHJpZGVdLCBzcmNbaSAtIDFdICsgc3JjW2kgLSBzdHJpZGVdIC0gc3JjW2kgLSAxIC0gc3RyaWRlXSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgIHNyY1tpXSArPSBzcmNbaSAtIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKHkpIHNyY1tpXSArPSBzcmNbaSAtIHN0cmlkZV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9xbG9ncyhTbm93Q29udGV4dCAqcyl7CisgICAgaW50IHBsYW5lX2luZGV4LCBsZXZlbCwgb3JpZW50YXRpb247CisKKyAgICBmb3IocGxhbmVfaW5kZXg9MDsgcGxhbmVfaW5kZXg8RkZNSU4ocy0+bmJfcGxhbmVzLCAyKTsgcGxhbmVfaW5kZXgrKyl7CisgICAgICAgIGZvcihsZXZlbD0wOyBsZXZlbDxzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQ7IGxldmVsKyspeworICAgICAgICAgICAgZm9yKG9yaWVudGF0aW9uPWxldmVsID8gMTowOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKKyAgICAgICAgICAgICAgICBpZihvcmllbnRhdGlvbj09MikgY29udGludWU7CisgICAgICAgICAgICAgICAgcHV0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCBzLT5wbGFuZVtwbGFuZV9pbmRleF0uYmFuZFtsZXZlbF1bb3JpZW50YXRpb25dLnFsb2csIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfaGVhZGVyKFNub3dDb250ZXh0ICpzKXsKKyAgICBpbnQgcGxhbmVfaW5kZXgsIGk7CisgICAgdWludDhfdCBrc3RhdGVbMzJdOworCisgICAgbWVtc2V0KGtzdGF0ZSwgTUlEX1NUQVRFLCBzaXplb2Yoa3N0YXRlKSk7CisKKyAgICBwdXRfcmFjKCZzLT5jLCBrc3RhdGUsIHMtPmtleWZyYW1lKTsKKyAgICBpZihzLT5rZXlmcmFtZSB8fCBzLT5hbHdheXNfcmVzZXQpeworICAgICAgICBmZl9zbm93X3Jlc2V0X2NvbnRleHRzKHMpOworICAgICAgICBzLT5sYXN0X3NwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlPQorICAgICAgICBzLT5sYXN0X3Fsb2c9CisgICAgICAgIHMtPmxhc3RfcWJpYXM9CisgICAgICAgIHMtPmxhc3RfbXZfc2NhbGU9CisgICAgICAgIHMtPmxhc3RfYmxvY2tfbWF4X2RlcHRoPSAwOworICAgICAgICBmb3IocGxhbmVfaW5kZXg9MDsgcGxhbmVfaW5kZXg8MjsgcGxhbmVfaW5kZXgrKyl7CisgICAgICAgICAgICBQbGFuZSAqcD0gJnMtPnBsYW5lW3BsYW5lX2luZGV4XTsKKyAgICAgICAgICAgIHAtPmxhc3RfaHRhcHM9MDsKKyAgICAgICAgICAgIHAtPmxhc3RfZGlhZ19tYz0wOworICAgICAgICAgICAgbWVtc2V0KHAtPmxhc3RfaGNvZWZmLCAwLCBzaXplb2YocC0+bGFzdF9oY29lZmYpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihzLT5rZXlmcmFtZSl7CisgICAgICAgIHB1dF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgcy0+dmVyc2lvbiwgMCk7CisgICAgICAgIHB1dF9yYWMoJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgcy0+YWx3YXlzX3Jlc2V0KTsKKyAgICAgICAgcHV0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCBzLT50ZW1wb3JhbF9kZWNvbXBvc2l0aW9uX3R5cGUsIDApOworICAgICAgICBwdXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIHMtPnRlbXBvcmFsX2RlY29tcG9zaXRpb25fY291bnQsIDApOworICAgICAgICBwdXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCwgMCk7CisgICAgICAgIHB1dF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgcy0+Y29sb3JzcGFjZV90eXBlLCAwKTsKKyAgICAgICAgaWYgKHMtPm5iX3BsYW5lcyA+IDIpIHsKKyAgICAgICAgICAgIHB1dF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgcy0+Y2hyb21hX2hfc2hpZnQsIDApOworICAgICAgICAgICAgcHV0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCBzLT5jaHJvbWFfdl9zaGlmdCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgcHV0X3JhYygmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCBzLT5zcGF0aWFsX3NjYWxhYmlsaXR5KTsKKy8vICAgICAgICBwdXRfcmFjKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIHMtPnJhdGVfc2NhbGFiaWxpdHkpOworICAgICAgICBwdXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIHMtPm1heF9yZWZfZnJhbWVzLTEsIDApOworCisgICAgICAgIGVuY29kZV9xbG9ncyhzKTsKKyAgICB9CisKKyAgICBpZighcy0+a2V5ZnJhbWUpeworICAgICAgICBpbnQgdXBkYXRlX21jPTA7CisgICAgICAgIGZvcihwbGFuZV9pbmRleD0wOyBwbGFuZV9pbmRleDxGRk1JTihzLT5uYl9wbGFuZXMsIDIpOyBwbGFuZV9pbmRleCsrKXsKKyAgICAgICAgICAgIFBsYW5lICpwPSAmcy0+cGxhbmVbcGxhbmVfaW5kZXhdOworICAgICAgICAgICAgdXBkYXRlX21jIHw9IHAtPmxhc3RfaHRhcHMgICAhPSBwLT5odGFwczsKKyAgICAgICAgICAgIHVwZGF0ZV9tYyB8PSBwLT5sYXN0X2RpYWdfbWMgIT0gcC0+ZGlhZ19tYzsKKyAgICAgICAgICAgIHVwZGF0ZV9tYyB8PSAhIW1lbWNtcChwLT5sYXN0X2hjb2VmZiwgcC0+aGNvZWZmLCBzaXplb2YocC0+aGNvZWZmKSk7CisgICAgICAgIH0KKyAgICAgICAgcHV0X3JhYygmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCB1cGRhdGVfbWMpOworICAgICAgICBpZih1cGRhdGVfbWMpeworICAgICAgICAgICAgZm9yKHBsYW5lX2luZGV4PTA7IHBsYW5lX2luZGV4PEZGTUlOKHMtPm5iX3BsYW5lcywgMik7IHBsYW5lX2luZGV4KyspeworICAgICAgICAgICAgICAgIFBsYW5lICpwPSAmcy0+cGxhbmVbcGxhbmVfaW5kZXhdOworICAgICAgICAgICAgICAgIHB1dF9yYWMoJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgcC0+ZGlhZ19tYyk7CisgICAgICAgICAgICAgICAgcHV0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCBwLT5odGFwcy8yLTEsIDApOworICAgICAgICAgICAgICAgIGZvcihpPSBwLT5odGFwcy8yOyBpOyBpLS0pCisgICAgICAgICAgICAgICAgICAgIHB1dF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgRkZBQlMocC0+aGNvZWZmW2ldKSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYocy0+bGFzdF9zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQgIT0gcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50KXsKKyAgICAgICAgICAgIHB1dF9yYWMoJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMSk7CisgICAgICAgICAgICBwdXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCwgMCk7CisgICAgICAgICAgICBlbmNvZGVfcWxvZ3Mocyk7CisgICAgICAgIH1lbHNlCisgICAgICAgICAgICBwdXRfcmFjKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIDApOworICAgIH0KKworICAgIHB1dF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGUgLSBzLT5sYXN0X3NwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCAxKTsKKyAgICBwdXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIHMtPnFsb2cgICAgICAgICAgICAtIHMtPmxhc3RfcWxvZyAgICAsIDEpOworICAgIHB1dF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgcy0+bXZfc2NhbGUgICAgICAgIC0gcy0+bGFzdF9tdl9zY2FsZSwgMSk7CisgICAgcHV0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCBzLT5xYmlhcyAgICAgICAgICAgLSBzLT5sYXN0X3FiaWFzICAgLCAxKTsKKyAgICBwdXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIHMtPmJsb2NrX21heF9kZXB0aCAtIHMtPmxhc3RfYmxvY2tfbWF4X2RlcHRoLCAxKTsKKworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfbGFzdF9oZWFkZXJfdmFsdWVzKFNub3dDb250ZXh0ICpzKXsKKyAgICBpbnQgcGxhbmVfaW5kZXg7CisKKyAgICBpZighcy0+a2V5ZnJhbWUpeworICAgICAgICBmb3IocGxhbmVfaW5kZXg9MDsgcGxhbmVfaW5kZXg8MjsgcGxhbmVfaW5kZXgrKyl7CisgICAgICAgICAgICBQbGFuZSAqcD0gJnMtPnBsYW5lW3BsYW5lX2luZGV4XTsKKyAgICAgICAgICAgIHAtPmxhc3RfZGlhZ19tYz0gcC0+ZGlhZ19tYzsKKyAgICAgICAgICAgIHAtPmxhc3RfaHRhcHMgID0gcC0+aHRhcHM7CisgICAgICAgICAgICBtZW1jcHkocC0+bGFzdF9oY29lZmYsIHAtPmhjb2VmZiwgc2l6ZW9mKHAtPmhjb2VmZikpOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+bGFzdF9zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZSAgPSBzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZTsKKyAgICBzLT5sYXN0X3Fsb2cgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPnFsb2c7CisgICAgcy0+bGFzdF9xYmlhcyAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5xYmlhczsKKyAgICBzLT5sYXN0X212X3NjYWxlICAgICAgICAgICAgICAgICAgICA9IHMtPm12X3NjYWxlOworICAgIHMtPmxhc3RfYmxvY2tfbWF4X2RlcHRoICAgICAgICAgICAgID0gcy0+YmxvY2tfbWF4X2RlcHRoOworICAgIHMtPmxhc3Rfc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50ID0gcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50OworfQorCitzdGF0aWMgaW50IHFzY2FsZTJxbG9nKGludCBxc2NhbGUpeworICAgIHJldHVybiByaW50KFFST09UKmxvZzIocXNjYWxlIC8gKGZsb2F0KUZGX1FQMkxBTUJEQSkpCisgICAgICAgICAgICsgNjEqUVJPT1QvODsgLy8vPCA2NCA+IDYwCit9CisKK3N0YXRpYyBpbnQgcmF0ZWNvbnRyb2xfMXBhc3MoU25vd0NvbnRleHQgKnMsIEFWRnJhbWUgKnBpY3QpCit7CisgICAgLyogRXN0aW1hdGUgdGhlIGZyYW1lJ3MgY29tcGxleGl0eSBhcyBhIHN1bSBvZiB3ZWlnaHRlZCBkd3QgY29lZmZpY2llbnRzLgorICAgICAqIEZJWE1FIHdlIGtub3cgZXhhY3QgbXYgYml0cyBhdCB0aGlzIHBvaW50LAorICAgICAqIGJ1dCByYXRlY29udHJvbCBpc24ndCBzZXQgdXAgdG8gaW5jbHVkZSB0aGVtLiAqLworICAgIHVpbnQzMl90IGNvZWZfc3VtPSAwOworICAgIGludCBsZXZlbCwgb3JpZW50YXRpb24sIGRlbHRhX3Fsb2c7CisKKyAgICBmb3IobGV2ZWw9MDsgbGV2ZWw8cy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50OyBsZXZlbCsrKXsKKyAgICAgICAgZm9yKG9yaWVudGF0aW9uPWxldmVsID8gMSA6IDA7IG9yaWVudGF0aW9uPDQ7IG9yaWVudGF0aW9uKyspeworICAgICAgICAgICAgU3ViQmFuZCAqYj0gJnMtPnBsYW5lWzBdLmJhbmRbbGV2ZWxdW29yaWVudGF0aW9uXTsKKyAgICAgICAgICAgIElEV1RFTEVNICpidWY9IGItPmlidWY7CisgICAgICAgICAgICBjb25zdCBpbnQgdz0gYi0+d2lkdGg7CisgICAgICAgICAgICBjb25zdCBpbnQgaD0gYi0+aGVpZ2h0OworICAgICAgICAgICAgY29uc3QgaW50IHN0cmlkZT0gYi0+c3RyaWRlOworICAgICAgICAgICAgY29uc3QgaW50IHFsb2c9IGF2X2NsaXAoMipRUk9PVCArIGItPnFsb2csIDAsIFFST09UKjE2KTsKKyAgICAgICAgICAgIGNvbnN0IGludCBxbXVsPSBmZl9xZXhwW3Fsb2cmKFFST09ULTEpXTw8KHFsb2c+PlFTSElGVCk7CisgICAgICAgICAgICBjb25zdCBpbnQgcWRpdj0gKDE8PDE2KS9xbXVsOworICAgICAgICAgICAgaW50IHgsIHk7CisgICAgICAgICAgICAvL0ZJWE1FIHRoaXMgaXMgdWdseQorICAgICAgICAgICAgZm9yKHk9MDsgeTxoOyB5KyspCisgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspCisgICAgICAgICAgICAgICAgICAgIGJ1Zlt4K3kqc3RyaWRlXT0gYi0+YnVmW3greSpzdHJpZGVdOworICAgICAgICAgICAgaWYob3JpZW50YXRpb249PTApCisgICAgICAgICAgICAgICAgZGVjb3JyZWxhdGUocywgYiwgYnVmLCBzdHJpZGUsIDEsIDApOworICAgICAgICAgICAgZm9yKHk9MDsgeTxoOyB5KyspCisgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspCisgICAgICAgICAgICAgICAgICAgIGNvZWZfc3VtKz0gYWJzKGJ1Zlt4K3kqc3RyaWRlXSkgKiBxZGl2ID4+IDE2OworICAgICAgICB9CisgICAgfQorCisgICAgLyogdWdseSwgcmF0ZWNvbnRyb2wganVzdCB0YWtlcyBhIHNxcnQgYWdhaW4gKi8KKyAgICBhdl9hc3NlcnQwKGNvZWZfc3VtIDwgSU5UX01BWCk7CisgICAgY29lZl9zdW0gPSAodWludDY0X3QpY29lZl9zdW0gKiBjb2VmX3N1bSA+PiAxNjsKKworICAgIGlmKHBpY3QtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSl7CisgICAgICAgIHMtPm0uY3VycmVudF9waWN0dXJlLm1iX3Zhcl9zdW09IGNvZWZfc3VtOworICAgICAgICBzLT5tLmN1cnJlbnRfcGljdHVyZS5tY19tYl92YXJfc3VtPSAwOworICAgIH1lbHNleworICAgICAgICBzLT5tLmN1cnJlbnRfcGljdHVyZS5tY19tYl92YXJfc3VtPSBjb2VmX3N1bTsKKyAgICAgICAgcy0+bS5jdXJyZW50X3BpY3R1cmUubWJfdmFyX3N1bT0gMDsKKyAgICB9CisKKyAgICBwaWN0LT5xdWFsaXR5PSBmZl9yYXRlX2VzdGltYXRlX3FzY2FsZSgmcy0+bSwgMSk7CisgICAgaWYgKHBpY3QtPnF1YWxpdHkgPCAwKQorICAgICAgICByZXR1cm4gSU5UX01JTjsKKyAgICBzLT5sYW1iZGE9IHBpY3QtPnF1YWxpdHkgKiAzLzI7CisgICAgZGVsdGFfcWxvZz0gcXNjYWxlMnFsb2cocGljdC0+cXVhbGl0eSkgLSBzLT5xbG9nOworICAgIHMtPnFsb2crPSBkZWx0YV9xbG9nOworICAgIHJldHVybiBkZWx0YV9xbG9nOworfQorCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVfdmlzdWFsX3dlaWdodChTbm93Q29udGV4dCAqcywgUGxhbmUgKnApeworICAgIGludCB3aWR0aCA9IHAtPndpZHRoOworICAgIGludCBoZWlnaHQ9IHAtPmhlaWdodDsKKyAgICBpbnQgbGV2ZWwsIG9yaWVudGF0aW9uLCB4LCB5OworCisgICAgZm9yKGxldmVsPTA7IGxldmVsPHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudDsgbGV2ZWwrKyl7CisgICAgICAgIGZvcihvcmllbnRhdGlvbj1sZXZlbCA/IDEgOiAwOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKKyAgICAgICAgICAgIFN1YkJhbmQgKmI9ICZwLT5iYW5kW2xldmVsXVtvcmllbnRhdGlvbl07CisgICAgICAgICAgICBJRFdURUxFTSAqaWJ1Zj0gYi0+aWJ1ZjsKKyAgICAgICAgICAgIGludDY0X3QgZXJyb3I9MDsKKworICAgICAgICAgICAgbWVtc2V0KHMtPnNwYXRpYWxfaWR3dF9idWZmZXIsIDAsIHNpemVvZigqcy0+c3BhdGlhbF9pZHd0X2J1ZmZlcikqd2lkdGgqaGVpZ2h0KTsKKyAgICAgICAgICAgIGlidWZbYi0+d2lkdGgvMiArIGItPmhlaWdodC8yKmItPnN0cmlkZV09IDI1NioxNjsKKyAgICAgICAgICAgIGZmX3NwYXRpYWxfaWR3dChzLT5zcGF0aWFsX2lkd3RfYnVmZmVyLCBzLT50ZW1wX2lkd3RfYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGUsIHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCk7CisgICAgICAgICAgICBmb3IoeT0wOyB5PGhlaWdodDsgeSsrKXsKKyAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PHdpZHRoOyB4KyspeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGQ9IHMtPnNwYXRpYWxfaWR3dF9idWZmZXJbeCArIHkqd2lkdGhdKjE2OworICAgICAgICAgICAgICAgICAgICBlcnJvciArPSBkKmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiLT5xbG9nPSAoaW50KShsb2coMzUyMjU2LjAvc3FydChlcnJvcikpIC8gbG9nKHBvdygyLjAsIDEuMC9RUk9PVCkpKzAuNSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpY3QsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBTbm93Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgUmFuZ2VDb2RlciAqIGNvbnN0IGM9ICZzLT5jOworICAgIEFWRnJhbWUgKnBpYyA9IHBpY3Q7CisgICAgY29uc3QgaW50IHdpZHRoPSBzLT5hdmN0eC0+d2lkdGg7CisgICAgY29uc3QgaW50IGhlaWdodD0gcy0+YXZjdHgtPmhlaWdodDsKKyAgICBpbnQgbGV2ZWwsIG9yaWVudGF0aW9uLCBwbGFuZV9pbmRleCwgaSwgeSwgcmV0OworICAgIHVpbnQ4X3QgcmNfaGVhZGVyX2Jha1tzaXplb2Yocy0+aGVhZGVyX3N0YXRlKV07CisgICAgdWludDhfdCByY19ibG9ja19iYWtbc2l6ZW9mKHMtPmJsb2NrX3N0YXRlKV07CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgcy0+Yl93aWR0aCpzLT5iX2hlaWdodCpNQl9TSVpFKk1CX1NJWkUqMyArIEZGX01JTl9CVUZGRVJfU0laRSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZmX2luaXRfcmFuZ2VfZW5jb2RlcihjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgZmZfYnVpbGRfcmFjX3N0YXRlcyhjLCAwLjA1KigxTEw8PDMyKSwgMjU2LTgpOworCisgICAgZm9yKGk9MDsgaSA8IHMtPm5iX3BsYW5lczsgaSsrKXsKKyAgICAgICAgaW50IGhzaGlmdD0gaSA/IHMtPmNocm9tYV9oX3NoaWZ0IDogMDsKKyAgICAgICAgaW50IHZzaGlmdD0gaSA/IHMtPmNocm9tYV92X3NoaWZ0IDogMDsKKyAgICAgICAgZm9yKHk9MDsgeTwoaGVpZ2h0Pj52c2hpZnQpOyB5KyspCisgICAgICAgICAgICBtZW1jcHkoJnMtPmlucHV0X3BpY3R1cmUtPmRhdGFbaV1beSAqIHMtPmlucHV0X3BpY3R1cmUtPmxpbmVzaXplW2ldXSwKKyAgICAgICAgICAgICAgICAgICAmcGljdC0+ZGF0YVtpXVt5ICogcGljdC0+bGluZXNpemVbaV1dLAorICAgICAgICAgICAgICAgICAgIHdpZHRoPj5oc2hpZnQpOworICAgICAgICBzLT5tcHZlbmNkc3AuZHJhd19lZGdlcyhzLT5pbnB1dF9waWN0dXJlLT5kYXRhW2ldLCBzLT5pbnB1dF9waWN0dXJlLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPj4gaHNoaWZ0LCBoZWlnaHQgPj4gdnNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREdFX1dJRFRIID4+IGhzaGlmdCwgRURHRV9XSURUSCA+PiB2c2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVER0VfVE9QIHwgRURHRV9CT1RUT00pOworCisgICAgfQorICAgIGVtbXNfYygpOworICAgIHMtPm5ld19waWN0dXJlID0gcGljdDsKKworICAgIHMtPm0ucGljdHVyZV9udW1iZXI9IGF2Y3R4LT5mcmFtZV9udW1iZXI7CisgICAgaWYoYXZjdHgtPmZsYWdzJkNPREVDX0ZMQUdfUEFTUzIpeworICAgICAgICBzLT5tLnBpY3RfdHlwZSA9IHBpYy0+cGljdF90eXBlID0gcy0+bS5yY19jb250ZXh0LmVudHJ5W2F2Y3R4LT5mcmFtZV9udW1iZXJdLm5ld19waWN0X3R5cGU7CisgICAgICAgIHMtPmtleWZyYW1lID0gcGljLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIGlmKCEoYXZjdHgtPmZsYWdzJkNPREVDX0ZMQUdfUVNDQUxFKSkgeworICAgICAgICAgICAgcGljLT5xdWFsaXR5ID0gZmZfcmF0ZV9lc3RpbWF0ZV9xc2NhbGUoJnMtPm0sIDApOworICAgICAgICAgICAgaWYgKHBpYy0+cXVhbGl0eSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIHMtPmtleWZyYW1lPSBhdmN0eC0+Z29wX3NpemU9PTAgfHwgYXZjdHgtPmZyYW1lX251bWJlciAlIGF2Y3R4LT5nb3Bfc2l6ZSA9PSAwOworICAgICAgICBzLT5tLnBpY3RfdHlwZSA9IHBpYy0+cGljdF90eXBlID0gcy0+a2V5ZnJhbWUgPyBBVl9QSUNUVVJFX1RZUEVfSSA6IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgIH0KKworICAgIGlmKHMtPnBhc3MxX3JjICYmIGF2Y3R4LT5mcmFtZV9udW1iZXIgPT0gMCkKKyAgICAgICAgcGljLT5xdWFsaXR5ID0gMipGRl9RUDJMQU1CREE7CisgICAgaWYgKHBpYy0+cXVhbGl0eSkgeworICAgICAgICBzLT5xbG9nICAgPSBxc2NhbGUycWxvZyhwaWMtPnF1YWxpdHkpOworICAgICAgICBzLT5sYW1iZGEgPSBwaWMtPnF1YWxpdHkgKiAzLzI7CisgICAgfQorICAgIGlmIChzLT5xbG9nIDwgMCB8fCAoIXBpYy0+cXVhbGl0eSAmJiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpKSkgeworICAgICAgICBzLT5xbG9nPSBMT1NTTEVTU19RTE9HOworICAgICAgICBzLT5sYW1iZGEgPSAwOworICAgIH0vL2Vsc2Uga2VlcCBwcmV2aW91cyBmcmFtZSdzIHFsb2cgdW50aWwgYWZ0ZXIgbW90aW9uIGVzdGltYXRpb24KKworICAgIGlmIChzLT5jdXJyZW50X3BpY3R1cmUtPmRhdGFbMF0gJiYgIShzLT5hdmN0eC0+ZmxhZ3MmQ09ERUNfRkxBR19FTVVfRURHRSkpIHsKKyAgICAgICAgaW50IHcgPSBzLT5hdmN0eC0+d2lkdGg7CisgICAgICAgIGludCBoID0gcy0+YXZjdHgtPmhlaWdodDsKKworICAgICAgICBzLT5tcHZlbmNkc3AuZHJhd19lZGdlcyhzLT5jdXJyZW50X3BpY3R1cmUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS0+bGluZXNpemVbMF0sIHcgICAsIGggICAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVER0VfV0lEVEggICwgRURHRV9XSURUSCAgLCBFREdFX1RPUCB8IEVER0VfQk9UVE9NKTsKKyAgICAgICAgaWYgKHMtPmN1cnJlbnRfcGljdHVyZS0+ZGF0YVsyXSkgeworICAgICAgICAgICAgcy0+bXB2ZW5jZHNwLmRyYXdfZWRnZXMocy0+Y3VycmVudF9waWN0dXJlLT5kYXRhWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLT5saW5lc2l6ZVsxXSwgdz4+cy0+Y2hyb21hX2hfc2hpZnQsIGg+PnMtPmNocm9tYV92X3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURHRV9XSURUSD4+cy0+Y2hyb21hX2hfc2hpZnQsIEVER0VfV0lEVEg+PnMtPmNocm9tYV92X3NoaWZ0LCBFREdFX1RPUCB8IEVER0VfQk9UVE9NKTsKKyAgICAgICAgICAgIHMtPm1wdmVuY2RzcC5kcmF3X2VkZ2VzKHMtPmN1cnJlbnRfcGljdHVyZS0+ZGF0YVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS0+bGluZXNpemVbMl0sIHc+PnMtPmNocm9tYV9oX3NoaWZ0LCBoPj5zLT5jaHJvbWFfdl9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVER0VfV0lEVEg+PnMtPmNocm9tYV9oX3NoaWZ0LCBFREdFX1dJRFRIPj5zLT5jaHJvbWFfdl9zaGlmdCwgRURHRV9UT1AgfCBFREdFX0JPVFRPTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmZl9zbm93X2ZyYW1lX3N0YXJ0KHMpOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZT0gcy0+Y3VycmVudF9waWN0dXJlOworCisgICAgcy0+bS5jdXJyZW50X3BpY3R1cmVfcHRyPSAmcy0+bS5jdXJyZW50X3BpY3R1cmU7CisgICAgcy0+bS5jdXJyZW50X3BpY3R1cmUuZiA9IHMtPmN1cnJlbnRfcGljdHVyZTsKKyAgICBzLT5tLmN1cnJlbnRfcGljdHVyZS5mLT5wdHMgPSBwaWN0LT5wdHM7CisgICAgaWYocGljLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApeworICAgICAgICBpbnQgYmxvY2tfd2lkdGggPSAod2lkdGggKzE1KT4+NDsKKyAgICAgICAgaW50IGJsb2NrX2hlaWdodD0gKGhlaWdodCsxNSk+PjQ7CisgICAgICAgIGludCBzdHJpZGU9IHMtPmN1cnJlbnRfcGljdHVyZS0+bGluZXNpemVbMF07CisKKyAgICAgICAgYXZfYXNzZXJ0MChzLT5jdXJyZW50X3BpY3R1cmUtPmRhdGFbMF0pOworICAgICAgICBhdl9hc3NlcnQwKHMtPmxhc3RfcGljdHVyZVswXS0+ZGF0YVswXSk7CisKKyAgICAgICAgcy0+bS5hdmN0eD0gcy0+YXZjdHg7CisgICAgICAgIHMtPm0uICAgbGFzdF9waWN0dXJlLmYgPSBzLT5sYXN0X3BpY3R1cmVbMF07CisgICAgICAgIHMtPm0uICAgIG5ld19waWN0dXJlLmYgPSBzLT5pbnB1dF9waWN0dXJlOworICAgICAgICBzLT5tLiAgIGxhc3RfcGljdHVyZV9wdHI9ICZzLT5tLiAgIGxhc3RfcGljdHVyZTsKKyAgICAgICAgcy0+bS5saW5lc2l6ZSA9IHN0cmlkZTsKKyAgICAgICAgcy0+bS51dmxpbmVzaXplPSBzLT5jdXJyZW50X3BpY3R1cmUtPmxpbmVzaXplWzFdOworICAgICAgICBzLT5tLndpZHRoID0gd2lkdGg7CisgICAgICAgIHMtPm0uaGVpZ2h0PSBoZWlnaHQ7CisgICAgICAgIHMtPm0ubWJfd2lkdGggPSBibG9ja193aWR0aDsKKyAgICAgICAgcy0+bS5tYl9oZWlnaHQ9IGJsb2NrX2hlaWdodDsKKyAgICAgICAgcy0+bS5tYl9zdHJpZGU9ICAgcy0+bS5tYl93aWR0aCsxOworICAgICAgICBzLT5tLmI4X3N0cmlkZT0gMipzLT5tLm1iX3dpZHRoKzE7CisgICAgICAgIHMtPm0uZl9jb2RlPTE7CisgICAgICAgIHMtPm0ucGljdF90eXBlID0gcGljLT5waWN0X3R5cGU7CisgICAgICAgIHMtPm0ubWVfbWV0aG9kPSBzLT5hdmN0eC0+bWVfbWV0aG9kOworICAgICAgICBzLT5tLm1lLnNjZW5lX2NoYW5nZV9zY29yZT0wOworICAgICAgICBzLT5tLmZsYWdzPSBzLT5hdmN0eC0+ZmxhZ3M7CisgICAgICAgIHMtPm0ucXVhcnRlcl9zYW1wbGU9IChzLT5hdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FQRUwpIT0wOworICAgICAgICBzLT5tLm91dF9mb3JtYXQ9IEZNVF9IMjYzOworICAgICAgICBzLT5tLnVucmVzdHJpY3RlZF9tdj0gMTsKKworICAgICAgICBzLT5tLmxhbWJkYSA9IHMtPmxhbWJkYTsKKyAgICAgICAgcy0+bS5xc2NhbGU9IChzLT5tLmxhbWJkYSoxMzkgKyBGRl9MQU1CREFfU0NBTEUqNjQpID4+IChGRl9MQU1CREFfU0hJRlQgKyA3KTsKKyAgICAgICAgcy0+bGFtYmRhMj0gcy0+bS5sYW1iZGEyPSAocy0+bS5sYW1iZGEqcy0+bS5sYW1iZGEgKyBGRl9MQU1CREFfU0NBTEUvMikgPj4gRkZfTEFNQkRBX1NISUZUOworCisgICAgICAgIHMtPm0ubWVjYz0gcy0+bWVjYzsgLy9tb3ZlCisgICAgICAgIHMtPm0ucWRzcD0gcy0+cWRzcDsgLy9tb3ZlCisgICAgICAgIHMtPm0uaGRzcCA9IHMtPmhkc3A7CisgICAgICAgIGZmX2luaXRfbWUoJnMtPm0pOworICAgICAgICBzLT5oZHNwID0gcy0+bS5oZHNwOworICAgICAgICBzLT5tZWNjPSBzLT5tLm1lY2M7CisgICAgfQorCisgICAgaWYocy0+cGFzczFfcmMpeworICAgICAgICBtZW1jcHkocmNfaGVhZGVyX2Jhaywgcy0+aGVhZGVyX3N0YXRlLCBzaXplb2Yocy0+aGVhZGVyX3N0YXRlKSk7CisgICAgICAgIG1lbWNweShyY19ibG9ja19iYWssIHMtPmJsb2NrX3N0YXRlLCBzaXplb2Yocy0+YmxvY2tfc3RhdGUpKTsKKyAgICB9CisKK3JlZG9fZnJhbWU6CisKKyAgICBzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQ9IDU7CisKKyAgICB3aGlsZSggICAhKHdpZHRoID4+KHMtPmNocm9tYV9oX3NoaWZ0ICsgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50KSkKKyAgICAgICAgICB8fCAhKGhlaWdodD4+KHMtPmNocm9tYV92X3NoaWZ0ICsgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50KSkpCisgICAgICAgIHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudC0tOworCisgICAgaWYgKHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVzb2x1dGlvbiB0b28gbG93XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzLT5tLnBpY3RfdHlwZSA9IHBpYy0+cGljdF90eXBlOworICAgIHMtPnFiaWFzID0gcGljLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AgPyAyIDogMDsKKworICAgIGZmX3Nub3dfY29tbW9uX2luaXRfYWZ0ZXJfaGVhZGVyKGF2Y3R4KTsKKworICAgIGlmKHMtPmxhc3Rfc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50ICE9IHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCl7CisgICAgICAgIGZvcihwbGFuZV9pbmRleD0wOyBwbGFuZV9pbmRleCA8IHMtPm5iX3BsYW5lczsgcGxhbmVfaW5kZXgrKyl7CisgICAgICAgICAgICBjYWxjdWxhdGVfdmlzdWFsX3dlaWdodChzLCAmcy0+cGxhbmVbcGxhbmVfaW5kZXhdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVuY29kZV9oZWFkZXIocyk7CisgICAgcy0+bS5taXNjX2JpdHMgPSA4KihzLT5jLmJ5dGVzdHJlYW0gLSBzLT5jLmJ5dGVzdHJlYW1fc3RhcnQpOworICAgIGVuY29kZV9ibG9ja3MocywgMSk7CisgICAgcy0+bS5tdl9iaXRzID0gOCoocy0+Yy5ieXRlc3RyZWFtIC0gcy0+Yy5ieXRlc3RyZWFtX3N0YXJ0KSAtIHMtPm0ubWlzY19iaXRzOworCisgICAgZm9yKHBsYW5lX2luZGV4PTA7IHBsYW5lX2luZGV4IDwgcy0+bmJfcGxhbmVzOyBwbGFuZV9pbmRleCsrKXsKKyAgICAgICAgUGxhbmUgKnA9ICZzLT5wbGFuZVtwbGFuZV9pbmRleF07CisgICAgICAgIGludCB3PSBwLT53aWR0aDsKKyAgICAgICAgaW50IGg9IHAtPmhlaWdodDsKKyAgICAgICAgaW50IHgsIHk7CisvLyAgICAgICAgaW50IGJpdHM9IHB1dF9iaXRzX2NvdW50KCZzLT5jLnBiKTsKKworICAgICAgICBpZiAoIXMtPm1lbWNfb25seSkgeworICAgICAgICAgICAgLy9GSVhNRSBvcHRpbWl6ZQorICAgICAgICAgICAgaWYocGljdC0+ZGF0YVtwbGFuZV9pbmRleF0pIC8vRklYTUUgZ3JheSBoYWNrCisgICAgICAgICAgICAgICAgZm9yKHk9MDsgeTxoOyB5KyspeworICAgICAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PHc7IHgrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zcGF0aWFsX2lkd3RfYnVmZmVyW3kqdyArIHhdPSBwaWN0LT5kYXRhW3BsYW5lX2luZGV4XVt5KnBpY3QtPmxpbmVzaXplW3BsYW5lX2luZGV4XSArIHhdPDxGUkFDX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmVkaWN0X3BsYW5lKHMsIHMtPnNwYXRpYWxfaWR3dF9idWZmZXIsIHBsYW5lX2luZGV4LCAwKTsKKworICAgICAgICAgICAgaWYoICAgcGxhbmVfaW5kZXg9PTAKKyAgICAgICAgICAgICAgICYmIHBpYy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QCisgICAgICAgICAgICAgICAmJiAhKGF2Y3R4LT5mbGFncyZDT0RFQ19GTEFHX1BBU1MyKQorICAgICAgICAgICAgICAgJiYgcy0+bS5tZS5zY2VuZV9jaGFuZ2Vfc2NvcmUgPiBzLT5hdmN0eC0+c2NlbmVjaGFuZ2VfdGhyZXNob2xkKXsKKyAgICAgICAgICAgICAgICBmZl9pbml0X3JhbmdlX2VuY29kZXIoYywgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgICAgICAgICAgICAgIGZmX2J1aWxkX3JhY19zdGF0ZXMoYywgMC4wNSooMUxMPDwzMiksIDI1Ni04KTsKKyAgICAgICAgICAgICAgICBwaWMtPnBpY3RfdHlwZT0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgICAgICAgICAgcy0+a2V5ZnJhbWU9MTsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUtPmtleV9mcmFtZT0xOworICAgICAgICAgICAgICAgIGdvdG8gcmVkb19mcmFtZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYocy0+cWxvZyA9PSBMT1NTTEVTU19RTE9HKXsKKyAgICAgICAgICAgICAgICBmb3IoeT0wOyB5PGg7IHkrKyl7CisgICAgICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8dzsgeCsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNwYXRpYWxfZHd0X2J1ZmZlclt5KncgKyB4XT0gKHMtPnNwYXRpYWxfaWR3dF9idWZmZXJbeSp3ICsgeF0gKyAoMTw8KEZSQUNfQklUUy0xKSktMSk+PkZSQUNfQklUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGZvcih5PTA7IHk8aDsgeSsrKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3BhdGlhbF9kd3RfYnVmZmVyW3kqdyArIHhdPXMtPnNwYXRpYWxfaWR3dF9idWZmZXJbeSp3ICsgeF08PEVOQ09ERVJfRVhUUkFfQklUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmZfc3BhdGlhbF9kd3Qocy0+c3BhdGlhbF9kd3RfYnVmZmVyLCBzLT50ZW1wX2R3dF9idWZmZXIsIHcsIGgsIHcsIHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQpOworCisgICAgICAgICAgICBpZihzLT5wYXNzMV9yYyAmJiBwbGFuZV9pbmRleD09MCl7CisgICAgICAgICAgICAgICAgaW50IGRlbHRhX3Fsb2cgPSByYXRlY29udHJvbF8xcGFzcyhzLCBwaWMpOworICAgICAgICAgICAgICAgIGlmIChkZWx0YV9xbG9nIDw9IElOVF9NSU4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBpZihkZWx0YV9xbG9nKXsKKyAgICAgICAgICAgICAgICAgICAgLy9yZW9yZGVyaW5nIHFsb2cgaW4gdGhlIGJpdHN0cmVhbSB3b3VsZCBlbGltaW5hdGUgdGhpcyByZXNldAorICAgICAgICAgICAgICAgICAgICBmZl9pbml0X3JhbmdlX2VuY29kZXIoYywgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkocy0+aGVhZGVyX3N0YXRlLCByY19oZWFkZXJfYmFrLCBzaXplb2Yocy0+aGVhZGVyX3N0YXRlKSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5ibG9ja19zdGF0ZSwgcmNfYmxvY2tfYmFrLCBzaXplb2Yocy0+YmxvY2tfc3RhdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2hlYWRlcihzKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2Jsb2NrcyhzLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihsZXZlbD0wOyBsZXZlbDxzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQ7IGxldmVsKyspeworICAgICAgICAgICAgICAgIGZvcihvcmllbnRhdGlvbj1sZXZlbCA/IDEgOiAwOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKKyAgICAgICAgICAgICAgICAgICAgU3ViQmFuZCAqYj0gJnAtPmJhbmRbbGV2ZWxdW29yaWVudGF0aW9uXTsKKworICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZShzLCBiLCBiLT5pYnVmLCBiLT5idWYsIGItPnN0cmlkZSwgcy0+cWJpYXMpOworICAgICAgICAgICAgICAgICAgICBpZihvcmllbnRhdGlvbj09MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29ycmVsYXRlKHMsIGIsIGItPmlidWYsIGItPnN0cmlkZSwgcGljLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPm5vX2JpdHN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlX3N1YmJhbmQocywgYiwgYi0+aWJ1ZiwgYi0+cGFyZW50ID8gYi0+cGFyZW50LT5pYnVmIDogTlVMTCwgYi0+c3RyaWRlLCBvcmllbnRhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoYi0+cGFyZW50PT1OVUxMIHx8IGItPnBhcmVudC0+c3RyaWRlID09IGItPnN0cmlkZSoyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYob3JpZW50YXRpb249PTApCisgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGUocywgYiwgYi0+aWJ1ZiwgYi0+c3RyaWRlLCAxLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihsZXZlbD0wOyBsZXZlbDxzLT5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQ7IGxldmVsKyspeworICAgICAgICAgICAgICAgIGZvcihvcmllbnRhdGlvbj1sZXZlbCA/IDEgOiAwOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKKyAgICAgICAgICAgICAgICAgICAgU3ViQmFuZCAqYj0gJnAtPmJhbmRbbGV2ZWxdW29yaWVudGF0aW9uXTsKKworICAgICAgICAgICAgICAgICAgICBkZXF1YW50aXplKHMsIGIsIGItPmlidWYsIGItPnN0cmlkZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmZl9zcGF0aWFsX2lkd3Qocy0+c3BhdGlhbF9pZHd0X2J1ZmZlciwgcy0+dGVtcF9pZHd0X2J1ZmZlciwgdywgaCwgdywgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGUsIHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCk7CisgICAgICAgICAgICBpZihzLT5xbG9nID09IExPU1NMRVNTX1FMT0cpeworICAgICAgICAgICAgICAgIGZvcih5PTA7IHk8aDsgeSsrKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3BhdGlhbF9pZHd0X2J1ZmZlclt5KncgKyB4XTw8PUZSQUNfQklUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZWRpY3RfcGxhbmUocywgcy0+c3BhdGlhbF9pZHd0X2J1ZmZlciwgcGxhbmVfaW5kZXgsIDEpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8vTUUvTUMgb25seQorICAgICAgICAgICAgaWYocGljLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpeworICAgICAgICAgICAgICAgIGZvcih5PTA7IHk8aDsgeSsrKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLT5kYXRhW3BsYW5lX2luZGV4XVt5KnMtPmN1cnJlbnRfcGljdHVyZS0+bGluZXNpemVbcGxhbmVfaW5kZXhdICsgeF09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC0+ZGF0YVtwbGFuZV9pbmRleF1beSpwaWN0LT5saW5lc2l6ZVtwbGFuZV9pbmRleF0gKyB4XTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIG1lbXNldChzLT5zcGF0aWFsX2lkd3RfYnVmZmVyLCAwLCBzaXplb2YoSURXVEVMRU0pKncqaCk7CisgICAgICAgICAgICAgICAgcHJlZGljdF9wbGFuZShzLCBzLT5zcGF0aWFsX2lkd3RfYnVmZmVyLCBwbGFuZV9pbmRleCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYocy0+YXZjdHgtPmZsYWdzJkNPREVDX0ZMQUdfUFNOUil7CisgICAgICAgICAgICBpbnQ2NF90IGVycm9yPSAwOworCisgICAgICAgICAgICBpZihwaWN0LT5kYXRhW3BsYW5lX2luZGV4XSkgLy9GSVhNRSBncmF5IGhhY2sKKyAgICAgICAgICAgICAgICBmb3IoeT0wOyB5PGg7IHkrKyl7CisgICAgICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8dzsgeCsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkPSBzLT5jdXJyZW50X3BpY3R1cmUtPmRhdGFbcGxhbmVfaW5kZXhdW3kqcy0+Y3VycmVudF9waWN0dXJlLT5saW5lc2l6ZVtwbGFuZV9pbmRleF0gKyB4XSAtIHBpY3QtPmRhdGFbcGxhbmVfaW5kZXhdW3kqcGljdC0+bGluZXNpemVbcGxhbmVfaW5kZXhdICsgeF07CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciArPSBkKmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5hdmN0eC0+ZXJyb3JbcGxhbmVfaW5kZXhdICs9IGVycm9yOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLT5lcnJvcltwbGFuZV9pbmRleF0gPSBlcnJvcjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgdXBkYXRlX2xhc3RfaGVhZGVyX3ZhbHVlcyhzKTsKKworICAgIGZmX3Nub3dfcmVsZWFzZV9idWZmZXIoYXZjdHgpOworCisgICAgcy0+Y3VycmVudF9waWN0dXJlLT5jb2RlZF9waWN0dXJlX251bWJlciA9IGF2Y3R4LT5mcmFtZV9udW1iZXI7CisgICAgcy0+Y3VycmVudF9waWN0dXJlLT5waWN0X3R5cGUgPSBwaWN0LT5waWN0X3R5cGU7CisgICAgcy0+Y3VycmVudF9waWN0dXJlLT5xdWFsaXR5ID0gcGljdC0+cXVhbGl0eTsKKyAgICBzLT5tLmZyYW1lX2JpdHMgPSA4KihzLT5jLmJ5dGVzdHJlYW0gLSBzLT5jLmJ5dGVzdHJlYW1fc3RhcnQpOworICAgIHMtPm0ucF90ZXhfYml0cyA9IHMtPm0uZnJhbWVfYml0cyAtIHMtPm0ubWlzY19iaXRzIC0gcy0+bS5tdl9iaXRzOworICAgIHMtPm0uY3VycmVudF9waWN0dXJlLmYtPmRpc3BsYXlfcGljdHVyZV9udW1iZXIgPQorICAgIHMtPm0uY3VycmVudF9waWN0dXJlLmYtPmNvZGVkX3BpY3R1cmVfbnVtYmVyICAgPSBhdmN0eC0+ZnJhbWVfbnVtYmVyOworICAgIHMtPm0uY3VycmVudF9waWN0dXJlLmYtPnF1YWxpdHkgICAgICAgICAgICAgICAgPSBwaWMtPnF1YWxpdHk7CisgICAgcy0+bS50b3RhbF9iaXRzICs9IDgqKHMtPmMuYnl0ZXN0cmVhbSAtIHMtPmMuYnl0ZXN0cmVhbV9zdGFydCk7CisgICAgaWYocy0+cGFzczFfcmMpCisgICAgICAgIGlmIChmZl9yYXRlX2VzdGltYXRlX3FzY2FsZSgmcy0+bSwgMCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIGlmKGF2Y3R4LT5mbGFncyZDT0RFQ19GTEFHX1BBU1MxKQorICAgICAgICBmZl93cml0ZV9wYXNzMV9zdGF0cygmcy0+bSk7CisgICAgcy0+bS5sYXN0X3BpY3RfdHlwZSA9IHMtPm0ucGljdF90eXBlOworICAgIGF2Y3R4LT5mcmFtZV9iaXRzID0gcy0+bS5mcmFtZV9iaXRzOworICAgIGF2Y3R4LT5tdl9iaXRzID0gcy0+bS5tdl9iaXRzOworICAgIGF2Y3R4LT5taXNjX2JpdHMgPSBzLT5tLm1pc2NfYml0czsKKyAgICBhdmN0eC0+cF90ZXhfYml0cyA9IHMtPm0ucF90ZXhfYml0czsKKworICAgIGVtbXNfYygpOworCisgICAgcGt0LT5zaXplID0gZmZfcmFjX3Rlcm1pbmF0ZShjKTsKKyAgICBpZiAoYXZjdHgtPmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWUpCisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU25vd0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmZfc25vd19jb21tb25fZW5kKHMpOworICAgIGZmX3JhdGVfY29udHJvbF91bmluaXQoJnMtPm0pOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmlucHV0X3BpY3R1cmUpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+c3RhdHNfb3V0KTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTbm93Q29udGV4dCwgeCkKKyNkZWZpbmUgVkUgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICBGRl9NUFZfQ09NTU9OX09QVFMKKyAgICB7ICJtZW1jX29ubHkiLCAgICAgICJPbmx5IGRvIE1FL01DIChJIGZyYW1lcyAtPiByZWYsIFAgZnJhbWUgLT4gTUUrTUMpLiIsICAgT0ZGU0VUKG1lbWNfb25seSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgIm5vX2JpdHN0cmVhbSIsICAgIlNraXAgZmluYWwgYml0c3RyZWFtIHdyaXRlb3V0LiIsICAgICAgICAgICAgICAgICAgICBPRkZTRVQobm9fYml0c3RyZWFtKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBzbm93ZW5jX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gInNub3cgZW5jb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX3Nub3dfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic25vdyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNub3ciKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU05PVywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU25vd0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGVuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGVuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBlbmNvZGVfZW5kLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MTBQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJnNub3dlbmNfY2xhc3MsCit9OworCisKKyNpZmRlZiBURVNUCisjdW5kZWYgbWFsbG9jCisjdW5kZWYgZnJlZQorI3VuZGVmIHByaW50ZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorCitpbnQgbWFpbih2b2lkKXsKKyNkZWZpbmUgd2lkdGggIDI1NgorI2RlZmluZSBoZWlnaHQgMjU2CisgICAgaW50IGJ1ZmZlclsyXVt3aWR0aCpoZWlnaHRdOworICAgIFNub3dDb250ZXh0IHM7CisgICAgaW50IGk7CisgICAgQVZMRkcgcHJuZzsKKyAgICBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudD02OworICAgIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGU9MTsKKworICAgIHMudGVtcF9kd3RfYnVmZmVyICA9IGF2X21hbGxvY3ood2lkdGggKiBzaXplb2YoRFdURUxFTSkpOworICAgIHMudGVtcF9pZHd0X2J1ZmZlciA9IGF2X21hbGxvY3ood2lkdGggKiBzaXplb2YoSURXVEVMRU0pKTsKKworICAgIGF2X2xmZ19pbml0KCZwcm5nLCAxKTsKKworICAgIHByaW50ZigidGVzdGluZyA1LzMgRFdUXG4iKTsKKyAgICBmb3IoaT0wOyBpPHdpZHRoKmhlaWdodDsgaSsrKQorICAgICAgICBidWZmZXJbMF1baV0gPSBidWZmZXJbMV1baV0gPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDU0MzIxIC0gMTIzNDU7CisKKyAgICBmZl9zcGF0aWFsX2R3dChidWZmZXJbMF0sIHMudGVtcF9kd3RfYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZSwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQpOworICAgIGZmX3NwYXRpYWxfaWR3dCgoSURXVEVMRU0qKWJ1ZmZlclswXSwgcy50ZW1wX2lkd3RfYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZSwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQpOworCisgICAgZm9yKGk9MDsgaTx3aWR0aCpoZWlnaHQ7IGkrKykKKyAgICAgICAgaWYoYnVmZmVyWzBdW2ldIT0gYnVmZmVyWzFdW2ldKSBwcmludGYoImZzY2s6ICU2ZCAlMTJkICU3ZFxuIixpLCBidWZmZXJbMF1baV0sIGJ1ZmZlclsxXVtpXSk7CisKKyAgICBwcmludGYoInRlc3RpbmcgOS83IERXVFxuIik7CisgICAgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZT0wOworICAgIGZvcihpPTA7IGk8d2lkdGgqaGVpZ2h0OyBpKyspCisgICAgICAgIGJ1ZmZlclswXVtpXSA9IGJ1ZmZlclsxXVtpXSA9IGF2X2xmZ19nZXQoJnBybmcpICUgNTQzMjEgLSAxMjM0NTsKKworICAgIGZmX3NwYXRpYWxfZHd0KGJ1ZmZlclswXSwgcy50ZW1wX2R3dF9idWZmZXIsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCk7CisgICAgZmZfc3BhdGlhbF9pZHd0KChJRFdURUxFTSopYnVmZmVyWzBdLCBzLnRlbXBfaWR3dF9idWZmZXIsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCk7CisKKyAgICBmb3IoaT0wOyBpPHdpZHRoKmhlaWdodDsgaSsrKQorICAgICAgICBpZihGRkFCUyhidWZmZXJbMF1baV0gLSBidWZmZXJbMV1baV0pPjIwKSBwcmludGYoImZzY2s6ICU2ZCAlMTJkICU3ZFxuIixpLCBidWZmZXJbMF1baV0sIGJ1ZmZlclsxXVtpXSk7CisKKyAgICB7CisgICAgaW50IGxldmVsLCBvcmllbnRhdGlvbiwgeCwgeTsKKyAgICBpbnQ2NF90IGVycm9yc1s4XVs0XTsKKyAgICBpbnQ2NF90IGc9MDsKKworICAgICAgICBtZW1zZXQoZXJyb3JzLCAwLCBzaXplb2YoZXJyb3JzKSk7CisgICAgICAgIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50PTM7CisgICAgICAgIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGU9MDsKKyAgICAgICAgZm9yKGxldmVsPTA7IGxldmVsPHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50OyBsZXZlbCsrKXsKKyAgICAgICAgICAgIGZvcihvcmllbnRhdGlvbj1sZXZlbCA/IDEgOiAwOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKKyAgICAgICAgICAgICAgICBpbnQgdz0gd2lkdGggID4+IChzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudC1sZXZlbCk7CisgICAgICAgICAgICAgICAgaW50IGg9IGhlaWdodCA+PiAocy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQtbGV2ZWwpOworICAgICAgICAgICAgICAgIGludCBzdHJpZGU9IHdpZHRoICA8PCAocy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQtbGV2ZWwpOworICAgICAgICAgICAgICAgIERXVEVMRU0gKmJ1Zj0gYnVmZmVyWzBdOworICAgICAgICAgICAgICAgIGludDY0X3QgZXJyb3I9MDsKKworICAgICAgICAgICAgICAgIGlmKG9yaWVudGF0aW9uJjEpIGJ1Zis9dzsKKyAgICAgICAgICAgICAgICBpZihvcmllbnRhdGlvbj4xKSBidWYrPXN0cmlkZT4+MTsKKworICAgICAgICAgICAgICAgIG1lbXNldChidWZmZXJbMF0sIDAsIHNpemVvZihpbnQpKndpZHRoKmhlaWdodCk7CisgICAgICAgICAgICAgICAgYnVmW3cvMiArIGgvMipzdHJpZGVdPSAyNTYqMjU2OworICAgICAgICAgICAgICAgIGZmX3NwYXRpYWxfaWR3dCgoSURXVEVMRU0qKWJ1ZmZlclswXSwgcy50ZW1wX2lkd3RfYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZSwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQpOworICAgICAgICAgICAgICAgIGZvcih5PTA7IHk8aGVpZ2h0OyB5KyspeworICAgICAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PHdpZHRoOyB4KyspeworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkPSBidWZmZXJbMF1beCArIHkqd2lkdGhdOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgKz0gZCpkOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoRkZBQlMod2lkdGgvMi14KTw5ICYmIEZGQUJTKGhlaWdodC8yLXkpPDkgJiYgbGV2ZWw9PTIpIHByaW50ZigiJTgiUFJJZDY0IiAiLCBkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihGRkFCUyhoZWlnaHQvMi15KTw5ICYmIGxldmVsPT0yKSBwcmludGYoIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVycm9yPSAoaW50KShzcXJ0KGVycm9yKSswLjUpOworICAgICAgICAgICAgICAgIGVycm9yc1tsZXZlbF1bb3JpZW50YXRpb25dPSBlcnJvcjsKKyAgICAgICAgICAgICAgICBpZihnKSBnPWF2X2djZChnLCBlcnJvcik7CisgICAgICAgICAgICAgICAgZWxzZSBnPSBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGYoInN0YXRpYyBpbnQgY29uc3QgdmlzdWFsX3dlaWdodFtdWzRdPXtcbiIpOworICAgICAgICBmb3IobGV2ZWw9MDsgbGV2ZWw8cy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQ7IGxldmVsKyspeworICAgICAgICAgICAgcHJpbnRmKCIgIHsiKTsKKyAgICAgICAgICAgIGZvcihvcmllbnRhdGlvbj0wOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKKyAgICAgICAgICAgICAgICBwcmludGYoIiU4IlBSSWQ2NCIsIiwgZXJyb3JzW2xldmVsXVtvcmllbnRhdGlvbl0vZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoIn0sXG4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIn07XG4iKTsKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxldmVsPTI7CisgICAgICAgICAgICBpbnQgdz0gd2lkdGggID4+IChzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudC1sZXZlbCk7CisgICAgICAgICAgICAvL2ludCBoPSBoZWlnaHQgPj4gKHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50LWxldmVsKTsKKyAgICAgICAgICAgIGludCBzdHJpZGU9IHdpZHRoICA8PCAocy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQtbGV2ZWwpOworICAgICAgICAgICAgRFdURUxFTSAqYnVmPSBidWZmZXJbMF07CisgICAgICAgICAgICBpbnQ2NF90IGVycm9yPTA7CisKKyAgICAgICAgICAgIGJ1Zis9dzsKKyAgICAgICAgICAgIGJ1Zis9c3RyaWRlPj4xOworCisgICAgICAgICAgICBtZW1zZXQoYnVmZmVyWzBdLCAwLCBzaXplb2YoaW50KSp3aWR0aCpoZWlnaHQpOworICAgICAgICAgICAgZm9yKHk9MDsgeTxoZWlnaHQ7IHkrKyl7CisgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDx3aWR0aDsgeCsrKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRhYls0XT17MCwyLDMsMX07CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclswXVt4K3dpZHRoKnldPSAyNTYqMjU2KnRhYlsoeCYxKSArIDIqKHkmMSldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZmX3NwYXRpYWxfZHd0KGJ1ZmZlclswXSwgcy50ZW1wX2R3dF9idWZmZXIsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCk7CisgICAgICAgICAgICBmb3IoeT0wOyB5PGhlaWdodDsgeSsrKXsKKyAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PHdpZHRoOyB4KyspeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGQ9IGJ1ZmZlclswXVt4ICsgeSp3aWR0aF07CisgICAgICAgICAgICAgICAgICAgIGVycm9yICs9IGQqZDsKKyAgICAgICAgICAgICAgICAgICAgaWYoRkZBQlMod2lkdGgvMi14KTw5ICYmIEZGQUJTKGhlaWdodC8yLXkpPDkpIHByaW50ZigiJTgiUFJJZDY0IiAiLCBkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoRkZBQlMoaGVpZ2h0LzIteSk8OSkgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc29uaWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NvbmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlNTczYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NvbmljLmMKQEAgLTAsMCArMSwxMDk0IEBACisvKgorICogU2ltcGxlIGZyZWUgbG9zc2xlc3MvbG9zc3kgYXVkaW8gY29kZWMKKyAqIENvcHlyaWdodCAoYykgMjAwNCBBbGV4IEJlcmVnc3phc3ppCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyYW5nZWNvZGVyLmgiCisKKworLyoqCisgKiBAZmlsZQorICogU2ltcGxlIGZyZWUgbG9zc2xlc3MvbG9zc3kgYXVkaW8gY29kZWMKKyAqIEJhc2VkIG9uIFBhdWwgRnJhbmNpcyBIYXJyaXNvbidzIEJvbmsgKGh0dHA6Ly93d3cubG9nYXJpdGhtaWMubmV0L3BmaC9ib25rKQorICogV3JpdHRlbiBhbmQgZGVzaWduZWQgYnkgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRPRE86CisgKiAgLSBDQUJBQyBwdXQvZ2V0X3N5bWJvbAorICogIC0gaW5kZXBlbmRlbnQgcXVhbnRpemVyIGZvciBjaGFubmVscworICogIC0gPjIgY2hhbm5lbHMgc3VwcG9ydAorICogIC0gbW9yZSBkZWNvcnJlbGF0aW9uIHR5cGVzCisgKiAgLSBtb3JlIHRhcF9xdWFudCB0ZXN0cworICogIC0gc2VsZWN0YWJsZSBpbnRsaXN0IHdyaXRlcnMvcmVhZGVycyAoYm9uay1zdHlsZSwgZ29sb21iLCBjYWJhYykKKyAqLworCisjZGVmaW5lIE1BWF9DSEFOTkVMUyAyCisKKyNkZWZpbmUgTUlEX1NJREUgMAorI2RlZmluZSBMRUZUX1NJREUgMQorI2RlZmluZSBSSUdIVF9TSURFIDIKKwordHlwZWRlZiBzdHJ1Y3QgU29uaWNDb250ZXh0IHsKKyAgICBpbnQgdmVyc2lvbjsKKyAgICBpbnQgbWlub3JfdmVyc2lvbjsKKyAgICBpbnQgbG9zc2xlc3MsIGRlY29ycmVsYXRpb247CisKKyAgICBpbnQgbnVtX3RhcHMsIGRvd25zYW1wbGluZzsKKyAgICBkb3VibGUgcXVhbnRpemF0aW9uOworCisgICAgaW50IGNoYW5uZWxzLCBzYW1wbGVyYXRlLCBibG9ja19hbGlnbiwgZnJhbWVfc2l6ZTsKKworICAgIGludCAqdGFwX3F1YW50OworICAgIGludCAqaW50X3NhbXBsZXM7CisgICAgaW50ICpjb2RlZF9zYW1wbGVzW01BWF9DSEFOTkVMU107CisKKyAgICAvLyBmb3IgZW5jb2RpbmcKKyAgICBpbnQgKnRhaWw7CisgICAgaW50IHRhaWxfc2l6ZTsKKyAgICBpbnQgKndpbmRvdzsKKyAgICBpbnQgd2luZG93X3NpemU7CisKKyAgICAvLyBmb3IgZGVjb2RpbmcKKyAgICBpbnQgKnByZWRpY3Rvcl9rOworICAgIGludCAqcHJlZGljdG9yX3N0YXRlW01BWF9DSEFOTkVMU107Cit9IFNvbmljQ29udGV4dDsKKworI2RlZmluZSBMQVRUSUNFX1NISUZUICAgMTAKKyNkZWZpbmUgU0FNUExFX1NISUZUICAgIDQKKyNkZWZpbmUgTEFUVElDRV9GQUNUT1IgICgxIDw8IExBVFRJQ0VfU0hJRlQpCisjZGVmaW5lIFNBTVBMRV9GQUNUT1IgICAoMSA8PCBTQU1QTEVfU0hJRlQpCisKKyNkZWZpbmUgQkFTRV9RVUFOVCAgICAgIDAuNgorI2RlZmluZSBSQVRFX1ZBUklBVElPTiAgMy4wCisKK3N0YXRpYyBpbmxpbmUgaW50IHNoaWZ0KGludCBhLGludCBiKQoreworICAgIHJldHVybiAoYSsoMTw8KGItMSkpKSA+PiBiOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaGlmdF9kb3duKGludCBhLGludCBiKQoreworICAgIHJldHVybiAoYT4+YikrKGE8MCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2ZsYXR0ZW4gdm9pZCBwdXRfc3ltYm9sKFJhbmdlQ29kZXIgKmMsIHVpbnQ4X3QgKnN0YXRlLCBpbnQgdiwgaW50IGlzX3NpZ25lZCwgdWludDY0X3QgcmNfc3RhdFsyNTZdWzJdLCB1aW50NjRfdCByY19zdGF0MlszMl1bMl0peworICAgIGludCBpOworCisjZGVmaW5lIHB1dF9yYWMoQyxTLEIpIFwKK2Rve1wKKyAgICBpZihyY19zdGF0KXtcCisgICAgICAgIHJjX3N0YXRbKihTKV1bQl0rKztcCisgICAgICAgIHJjX3N0YXQyWyhTKS1zdGF0ZV1bQl0rKztcCisgICAgfVwKKyAgICBwdXRfcmFjKEMsUyxCKTtcCit9d2hpbGUoMCkKKworICAgIGlmKHYpeworICAgICAgICBjb25zdCBpbnQgYT0gRkZBQlModik7CisgICAgICAgIGNvbnN0IGludCBlPSBhdl9sb2cyKGEpOworICAgICAgICBwdXRfcmFjKGMsIHN0YXRlKzAsIDApOworICAgICAgICBpZihlPD05KXsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8ZTsgaSsrKXsKKyAgICAgICAgICAgICAgICBwdXRfcmFjKGMsIHN0YXRlKzEraSwgMSk7ICAvLzEuLjEwCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXRfcmFjKGMsIHN0YXRlKzEraSwgMCk7CisKKyAgICAgICAgICAgIGZvcihpPWUtMTsgaT49MDsgaS0tKXsKKyAgICAgICAgICAgICAgICBwdXRfcmFjKGMsIHN0YXRlKzIyK2ksIChhPj5pKSYxKTsgLy8yMi4uMzEKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoaXNfc2lnbmVkKQorICAgICAgICAgICAgICAgIHB1dF9yYWMoYywgc3RhdGUrMTEgKyBlLCB2IDwgMCk7IC8vMTEuLjIxCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZm9yKGk9MDsgaTxlOyBpKyspeworICAgICAgICAgICAgICAgIHB1dF9yYWMoYywgc3RhdGUrMStGRk1JTihpLDkpLCAxKTsgIC8vMS4uMTAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1dF9yYWMoYywgc3RhdGUrMSs5LCAwKTsKKworICAgICAgICAgICAgZm9yKGk9ZS0xOyBpPj0wOyBpLS0peworICAgICAgICAgICAgICAgIHB1dF9yYWMoYywgc3RhdGUrMjIrRkZNSU4oaSw5KSwgKGE+PmkpJjEpOyAvLzIyLi4zMQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihpc19zaWduZWQpCisgICAgICAgICAgICAgICAgcHV0X3JhYyhjLCBzdGF0ZSsxMSArIDEwLCB2IDwgMCk7IC8vMTEuLjIxCisgICAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgICAgcHV0X3JhYyhjLCBzdGF0ZSswLCAxKTsKKyAgICB9CisjdW5kZWYgcHV0X3JhYworfQorCitzdGF0aWMgaW5saW5lIGF2X2ZsYXR0ZW4gaW50IGdldF9zeW1ib2woUmFuZ2VDb2RlciAqYywgdWludDhfdCAqc3RhdGUsIGludCBpc19zaWduZWQpeworICAgIGlmKGdldF9yYWMoYywgc3RhdGUrMCkpCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2V7CisgICAgICAgIGludCBpLCBlLCBhOworICAgICAgICBlPSAwOworICAgICAgICB3aGlsZShnZXRfcmFjKGMsIHN0YXRlKzEgKyBGRk1JTihlLDkpKSl7IC8vMS4uMTAKKyAgICAgICAgICAgIGUrKzsKKyAgICAgICAgfQorCisgICAgICAgIGE9IDE7CisgICAgICAgIGZvcihpPWUtMTsgaT49MDsgaS0tKXsKKyAgICAgICAgICAgIGEgKz0gYSArIGdldF9yYWMoYywgc3RhdGUrMjIgKyBGRk1JTihpLDkpKTsgLy8yMi4uMzEKKyAgICAgICAgfQorCisgICAgICAgIGU9IC0oaXNfc2lnbmVkICYmIGdldF9yYWMoYywgc3RhdGUrMTEgKyBGRk1JTihlLCAxMCkpKTsgLy8xMS4uMjEKKyAgICAgICAgcmV0dXJuIChhXmUpLWU7CisgICAgfQorfQorCisjaWYgMQorc3RhdGljIGlubGluZSBpbnQgaW50bGlzdF93cml0ZShSYW5nZUNvZGVyICpjLCB1aW50OF90ICpzdGF0ZSwgaW50ICpidWYsIGludCBlbnRyaWVzLCBpbnQgYmFzZV8yX3BhcnQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQorICAgICAgICBwdXRfc3ltYm9sKGMsIHN0YXRlLCBidWZbaV0sIDEsIE5VTEwsIE5VTEwpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGludGxpc3RfcmVhZChSYW5nZUNvZGVyICpjLCB1aW50OF90ICpzdGF0ZSwgaW50ICpidWYsIGludCBlbnRyaWVzLCBpbnQgYmFzZV8yX3BhcnQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQorICAgICAgICBidWZbaV0gPSBnZXRfc3ltYm9sKGMsIHN0YXRlLCAxKTsKKworICAgIHJldHVybiAxOworfQorI2VsaWYgMQorc3RhdGljIGlubGluZSBpbnQgaW50bGlzdF93cml0ZShQdXRCaXRDb250ZXh0ICpwYiwgaW50ICpidWYsIGludCBlbnRyaWVzLCBpbnQgYmFzZV8yX3BhcnQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQorICAgICAgICBzZXRfc2VfZ29sb21iKHBiLCBidWZbaV0pOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGludGxpc3RfcmVhZChHZXRCaXRDb250ZXh0ICpnYiwgaW50ICpidWYsIGludCBlbnRyaWVzLCBpbnQgYmFzZV8yX3BhcnQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQorICAgICAgICBidWZbaV0gPSBnZXRfc2VfZ29sb21iKGdiKTsKKworICAgIHJldHVybiAxOworfQorCisjZWxzZQorCisjZGVmaW5lIEFEQVBUX0xFVkVMIDgKKworc3RhdGljIGludCBiaXRzX3RvX3N0b3JlKHVpbnQ2NF90IHgpCit7CisgICAgaW50IHJlcyA9IDA7CisKKyAgICB3aGlsZSh4KQorICAgIHsKKyAgICAgICAgcmVzKys7CisgICAgICAgIHggPj49IDE7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3VpbnRfbWF4KFB1dEJpdENvbnRleHQgKnBiLCB1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGludCBtYXgpCit7CisgICAgaW50IGksIGJpdHM7CisKKyAgICBpZiAoIW1heCkKKyAgICAgICAgcmV0dXJuOworCisgICAgYml0cyA9IGJpdHNfdG9fc3RvcmUobWF4KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBiaXRzLTE7IGkrKykKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIHZhbHVlICYgKDEgPDwgaSkpOworCisgICAgaWYgKCAodmFsdWUgfCAoMSA8PCAoYml0cy0xKSkpIDw9IG1heCkKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIHZhbHVlICYgKDEgPDwgKGJpdHMtMSkpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCByZWFkX3VpbnRfbWF4KEdldEJpdENvbnRleHQgKmdiLCBpbnQgbWF4KQoreworICAgIGludCBpLCBiaXRzLCB2YWx1ZSA9IDA7CisKKyAgICBpZiAoIW1heCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBiaXRzID0gYml0c190b19zdG9yZShtYXgpOworCisgICAgZm9yIChpID0gMDsgaSA8IGJpdHMtMTsgaSsrKQorICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgICAgIHZhbHVlICs9IDEgPDwgaTsKKworICAgIGlmICggKHZhbHVlIHwgKDE8PChiaXRzLTEpKSkgPD0gbWF4KQorICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgICAgIHZhbHVlICs9IDEgPDwgKGJpdHMtMSk7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgaW50bGlzdF93cml0ZShQdXRCaXRDb250ZXh0ICpwYiwgaW50ICpidWYsIGludCBlbnRyaWVzLCBpbnQgYmFzZV8yX3BhcnQpCit7CisgICAgaW50IGksIGosIHggPSAwLCBsb3dfYml0cyA9IDAsIG1heCA9IDA7CisgICAgaW50IHN0ZXAgPSAyNTYsIHBvcyA9IDAsIGRvbWluYW50ID0gMCwgYW55ID0gMDsKKyAgICBpbnQgKmNvcHksICpiaXRzOworCisgICAgY29weSA9IGF2X2NhbGxvYyhlbnRyaWVzLCBzaXplb2YoKmNvcHkpKTsKKyAgICBpZiAoIWNvcHkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoYmFzZV8yX3BhcnQpCisgICAgeworICAgICAgICBpbnQgZW5lcmd5ID0gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQorICAgICAgICAgICAgZW5lcmd5ICs9IGFicyhidWZbaV0pOworCisgICAgICAgIGxvd19iaXRzID0gYml0c190b19zdG9yZShlbmVyZ3kgLyAoZW50cmllcyAqIDIpKTsKKyAgICAgICAgaWYgKGxvd19iaXRzID4gMTUpCisgICAgICAgICAgICBsb3dfYml0cyA9IDE1OworCisgICAgICAgIHB1dF9iaXRzKHBiLCA0LCBsb3dfYml0cyk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHB1dF9iaXRzKHBiLCBsb3dfYml0cywgYWJzKGJ1ZltpXSkpOworICAgICAgICBjb3B5W2ldID0gYWJzKGJ1ZltpXSkgPj4gbG93X2JpdHM7CisgICAgICAgIGlmIChjb3B5W2ldID4gbWF4KQorICAgICAgICAgICAgbWF4ID0gYWJzKGNvcHlbaV0pOworICAgIH0KKworICAgIGJpdHMgPSBhdl9jYWxsb2MoZW50cmllcyptYXgsIHNpemVvZigqYml0cykpOworICAgIGlmICghYml0cykKKyAgICB7CisgICAgICAgIGF2X2ZyZWUoY29weSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8PSBtYXg7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBlbnRyaWVzOyBqKyspCisgICAgICAgICAgICBpZiAoY29weVtqXSA+PSBpKQorICAgICAgICAgICAgICAgIGJpdHNbeCsrXSA9IGNvcHlbal0gPiBpOworICAgIH0KKworICAgIC8vIHN0b3JlIGJpdHN0cmVhbQorICAgIHdoaWxlIChwb3MgPCB4KQorICAgIHsKKyAgICAgICAgaW50IHN0ZXBsZXQgPSBzdGVwID4+IDg7CisKKyAgICAgICAgaWYgKHBvcyArIHN0ZXBsZXQgPiB4KQorICAgICAgICAgICAgc3RlcGxldCA9IHggLSBwb3M7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0ZXBsZXQ7IGkrKykKKyAgICAgICAgICAgIGlmIChiaXRzW2krcG9zXSAhPSBkb21pbmFudCkKKyAgICAgICAgICAgICAgICBhbnkgPSAxOworCisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCBhbnkpOworCisgICAgICAgIGlmICghYW55KQorICAgICAgICB7CisgICAgICAgICAgICBwb3MgKz0gc3RlcGxldDsKKyAgICAgICAgICAgIHN0ZXAgKz0gc3RlcCAvIEFEQVBUX0xFVkVMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGludGVybG9wZXIgPSAwOworCisgICAgICAgICAgICB3aGlsZSAoKChwb3MgKyBpbnRlcmxvcGVyKSA8IHgpICYmIChiaXRzW3BvcyArIGludGVybG9wZXJdID09IGRvbWluYW50KSkKKyAgICAgICAgICAgICAgICBpbnRlcmxvcGVyKys7CisKKyAgICAgICAgICAgIC8vIG5vdGUgY2hhbmdlCisgICAgICAgICAgICB3cml0ZV91aW50X21heChwYiwgaW50ZXJsb3BlciwgKHN0ZXAgPj4gOCkgLSAxKTsKKworICAgICAgICAgICAgcG9zICs9IGludGVybG9wZXIgKyAxOworICAgICAgICAgICAgc3RlcCAtPSBzdGVwIC8gQURBUFRfTEVWRUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RlcCA8IDI1NikKKyAgICAgICAgeworICAgICAgICAgICAgc3RlcCA9IDY1NTM2IC8gc3RlcDsKKyAgICAgICAgICAgIGRvbWluYW50ID0gIWRvbWluYW50OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gc3RvcmUgc2lnbnMKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQorICAgICAgICBpZiAoYnVmW2ldKQorICAgICAgICAgICAgcHV0X2JpdHMocGIsIDEsIGJ1ZltpXSA8IDApOworCisgICAgYXZfZnJlZShiaXRzKTsKKyAgICBhdl9mcmVlKGNvcHkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50bGlzdF9yZWFkKEdldEJpdENvbnRleHQgKmdiLCBpbnQgKmJ1ZiwgaW50IGVudHJpZXMsIGludCBiYXNlXzJfcGFydCkKK3sKKyAgICBpbnQgaSwgbG93X2JpdHMgPSAwLCB4ID0gMDsKKyAgICBpbnQgbl96ZXJvcyA9IDAsIHN0ZXAgPSAyNTYsIGRvbWluYW50ID0gMDsKKyAgICBpbnQgcG9zID0gMCwgbGV2ZWwgPSAwOworICAgIGludCAqYml0cyA9IGF2X2NhbGxvYyhlbnRyaWVzLCBzaXplb2YoKmJpdHMpKTsKKworICAgIGlmICghYml0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChiYXNlXzJfcGFydCkKKyAgICB7CisgICAgICAgIGxvd19iaXRzID0gZ2V0X2JpdHMoZ2IsIDQpOworCisgICAgICAgIGlmIChsb3dfYml0cykKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspCisgICAgICAgICAgICAgICAgYnVmW2ldID0gZ2V0X2JpdHMoZ2IsIGxvd19iaXRzKTsKKyAgICB9CisKKy8vICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgImVudHJpZXM6ICVkLCBsb3cgYml0czogJWRcbiIsIGVudHJpZXMsIGxvd19iaXRzKTsKKworICAgIHdoaWxlIChuX3plcm9zIDwgZW50cmllcykKKyAgICB7CisgICAgICAgIGludCBzdGVwbGV0ID0gc3RlcCA+PiA4OworCisgICAgICAgIGlmICghZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0ZXBsZXQ7IGkrKykKKyAgICAgICAgICAgICAgICBiaXRzW3grK10gPSBkb21pbmFudDsKKworICAgICAgICAgICAgaWYgKCFkb21pbmFudCkKKyAgICAgICAgICAgICAgICBuX3plcm9zICs9IHN0ZXBsZXQ7CisKKyAgICAgICAgICAgIHN0ZXAgKz0gc3RlcCAvIEFEQVBUX0xFVkVMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFjdHVhbF9ydW4gPSByZWFkX3VpbnRfbWF4KGdiLCBzdGVwbGV0LTEpOworCisvLyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgImFjdHVhbCBydW46ICVkXG4iLCBhY3R1YWxfcnVuKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFjdHVhbF9ydW47IGkrKykKKyAgICAgICAgICAgICAgICBiaXRzW3grK10gPSBkb21pbmFudDsKKworICAgICAgICAgICAgYml0c1t4KytdID0gIWRvbWluYW50OworCisgICAgICAgICAgICBpZiAoIWRvbWluYW50KQorICAgICAgICAgICAgICAgIG5femVyb3MgKz0gYWN0dWFsX3J1bjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuX3plcm9zKys7CisKKyAgICAgICAgICAgIHN0ZXAgLT0gc3RlcCAvIEFEQVBUX0xFVkVMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0ZXAgPCAyNTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZXAgPSA2NTUzNiAvIHN0ZXA7CisgICAgICAgICAgICBkb21pbmFudCA9ICFkb21pbmFudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHJlY29uc3RydWN0IHVuc2lnbmVkIHZhbHVlcworICAgIG5femVyb3MgPSAwOworICAgIGZvciAoaSA9IDA7IG5femVyb3MgPCBlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICB3aGlsZSgxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zID49IGVudHJpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9zID0gMDsKKyAgICAgICAgICAgICAgICBsZXZlbCArPSAxIDw8IGxvd19iaXRzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVmW3Bvc10gPj0gbGV2ZWwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHBvcysrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJpdHNbaV0pCisgICAgICAgICAgICBidWZbcG9zXSArPSAxIDw8IGxvd19iaXRzOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuX3plcm9zKys7CisKKyAgICAgICAgcG9zKys7CisgICAgfQorICAgIGF2X2ZyZWUoYml0cyk7CisKKyAgICAvLyByZWFkIHNpZ25zCisgICAgZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykKKyAgICAgICAgaWYgKGJ1ZltpXSAmJiBnZXRfYml0czEoZ2IpKQorICAgICAgICAgICAgYnVmW2ldID0gLWJ1ZltpXTsKKworLy8gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiemVyb3M6ICVkIHBvczogJWRcbiIsIG5femVyb3MsIHBvcyk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwcmVkaWN0b3JfaW5pdF9zdGF0ZShpbnQgKmssIGludCAqc3RhdGUsIGludCBvcmRlcikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IG9yZGVyLTI7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgICAgaW50IGosIHAsIHggPSBzdGF0ZVtpXTsKKworICAgICAgICBmb3IgKGogPSAwLCBwID0gaSsxOyBwIDwgb3JkZXI7IGorKyxwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgdG1wID0geCArIHNoaWZ0X2Rvd24oa1tqXSAqIHN0YXRlW3BdLCBMQVRUSUNFX1NISUZUKTsKKyAgICAgICAgICAgIHN0YXRlW3BdICs9IHNoaWZ0X2Rvd24oa1tqXSp4LCBMQVRUSUNFX1NISUZUKTsKKyAgICAgICAgICAgIHggPSB0bXA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcHJlZGljdG9yX2NhbGNfZXJyb3IoaW50ICprLCBpbnQgKnN0YXRlLCBpbnQgb3JkZXIsIGludCBlcnJvcikKK3sKKyAgICBpbnQgaSwgeCA9IGVycm9yIC0gc2hpZnRfZG93bihrW29yZGVyLTFdICogc3RhdGVbb3JkZXItMV0sIExBVFRJQ0VfU0hJRlQpOworCisjaWYgMQorICAgIGludCAqa19wdHIgPSAmKGtbb3JkZXItMl0pLAorICAgICAgICAqc3RhdGVfcHRyID0gJihzdGF0ZVtvcmRlci0yXSk7CisgICAgZm9yIChpID0gb3JkZXItMjsgaSA+PSAwOyBpLS0sIGtfcHRyLS0sIHN0YXRlX3B0ci0tKQorICAgIHsKKyAgICAgICAgaW50IGtfdmFsdWUgPSAqa19wdHIsIHN0YXRlX3ZhbHVlID0gKnN0YXRlX3B0cjsKKyAgICAgICAgeCAtPSBzaGlmdF9kb3duKGtfdmFsdWUgKiBzdGF0ZV92YWx1ZSwgTEFUVElDRV9TSElGVCk7CisgICAgICAgIHN0YXRlX3B0clsxXSA9IHN0YXRlX3ZhbHVlICsgc2hpZnRfZG93bihrX3ZhbHVlICogeCwgTEFUVElDRV9TSElGVCk7CisgICAgfQorI2Vsc2UKKyAgICBmb3IgKGkgPSBvcmRlci0yOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICAgIHggLT0gc2hpZnRfZG93bihrW2ldICogc3RhdGVbaV0sIExBVFRJQ0VfU0hJRlQpOworICAgICAgICBzdGF0ZVtpKzFdID0gc3RhdGVbaV0gKyBzaGlmdF9kb3duKGtbaV0gKiB4LCBMQVRUSUNFX1NISUZUKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIGRvbid0IGRyaWZ0IHRvbyBmYXIsIHRvIGF2b2lkIG92ZXJmbG93cworICAgIGlmICh4ID4gIChTQU1QTEVfRkFDVE9SPDwxNikpIHggPSAgKFNBTVBMRV9GQUNUT1I8PDE2KTsKKyAgICBpZiAoeCA8IC0oU0FNUExFX0ZBQ1RPUjw8MTYpKSB4ID0gLShTQU1QTEVfRkFDVE9SPDwxNik7CisKKyAgICBzdGF0ZVswXSA9IHg7CisKKyAgICByZXR1cm4geDsKK30KKworI2lmIENPTkZJR19TT05JQ19FTkNPREVSIHx8IENPTkZJR19TT05JQ19MU19FTkNPREVSCisvLyBIZWF2aWx5IG1vZGlmaWVkIExldmluc29uLUR1cmJpbiBhbGdvcml0aG0gd2hpY2gKKy8vIGNvcGVzIGJldHRlciB3aXRoIHF1YW50aXphdGlvbiwgYW5kIGNhbGN1bGF0ZXMgdGhlCisvLyBhY3R1YWwgd2hpdGVuZWQgcmVzdWx0IGFzIGl0IGdvZXMuCisKK3N0YXRpYyB2b2lkIG1vZGlmaWVkX2xldmluc29uX2R1cmJpbihpbnQgKndpbmRvdywgaW50IHdpbmRvd19lbnRyaWVzLAorICAgICAgICBpbnQgKm91dCwgaW50IG91dF9lbnRyaWVzLCBpbnQgY2hhbm5lbHMsIGludCAqdGFwX3F1YW50KQoreworICAgIGludCBpOworICAgIGludCAqc3RhdGUgPSBhdl9jYWxsb2Mod2luZG93X2VudHJpZXMsIHNpemVvZigqc3RhdGUpKTsKKworICAgIG1lbWNweShzdGF0ZSwgd2luZG93LCA0KiB3aW5kb3dfZW50cmllcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3V0X2VudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIGludCBzdGVwID0gKGkrMSkqY2hhbm5lbHMsIGssIGo7CisgICAgICAgIGRvdWJsZSB4eCA9IDAuMCwgeHkgPSAwLjA7CisjaWYgMQorICAgICAgICBpbnQgKnhfcHRyID0gJih3aW5kb3dbc3RlcF0pOworICAgICAgICBpbnQgKnN0YXRlX3B0ciA9ICYoc3RhdGVbMF0pOworICAgICAgICBqID0gd2luZG93X2VudHJpZXMgLSBzdGVwOworICAgICAgICBmb3IgKDtqPjA7ai0tLHhfcHRyKyssc3RhdGVfcHRyKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB4X3ZhbHVlID0gKnhfcHRyOworICAgICAgICAgICAgZG91YmxlIHN0YXRlX3ZhbHVlID0gKnN0YXRlX3B0cjsKKyAgICAgICAgICAgIHh4ICs9IHN0YXRlX3ZhbHVlKnN0YXRlX3ZhbHVlOworICAgICAgICAgICAgeHkgKz0geF92YWx1ZSpzdGF0ZV92YWx1ZTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgZm9yIChqID0gMDsgaiA8PSAod2luZG93X2VudHJpZXMgLSBzdGVwKTsgaisrKTsKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHN0ZXB2YWwgPSB3aW5kb3dbc3RlcCtqXTsKKyAgICAgICAgICAgIGRvdWJsZSBzdGF0ZXZhbCA9IHdpbmRvd1tqXTsKKy8vICAgICAgICAgICAgeHggKz0gKGRvdWJsZSl3aW5kb3dbal0qKGRvdWJsZSl3aW5kb3dbal07CisvLyAgICAgICAgICAgIHh5ICs9IChkb3VibGUpd2luZG93W3N0ZXAral0qKGRvdWJsZSl3aW5kb3dbal07CisgICAgICAgICAgICB4eCArPSBzdGF0ZXZhbCpzdGF0ZXZhbDsKKyAgICAgICAgICAgIHh5ICs9IHN0ZXB2YWwqc3RhdGV2YWw7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoeHggPT0gMC4wKQorICAgICAgICAgICAgayA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGsgPSAoaW50KShmbG9vcigteHkveHggKiAoZG91YmxlKUxBVFRJQ0VfRkFDVE9SIC8gKGRvdWJsZSkodGFwX3F1YW50W2ldKSArIDAuNSkpOworCisgICAgICAgIGlmIChrID4gKExBVFRJQ0VfRkFDVE9SL3RhcF9xdWFudFtpXSkpCisgICAgICAgICAgICBrID0gTEFUVElDRV9GQUNUT1IvdGFwX3F1YW50W2ldOworICAgICAgICBpZiAoLWsgPiAoTEFUVElDRV9GQUNUT1IvdGFwX3F1YW50W2ldKSkKKyAgICAgICAgICAgIGsgPSAtKExBVFRJQ0VfRkFDVE9SL3RhcF9xdWFudFtpXSk7CisKKyAgICAgICAgb3V0W2ldID0gazsKKyAgICAgICAgayAqPSB0YXBfcXVhbnRbaV07CisKKyNpZiAxCisgICAgICAgIHhfcHRyID0gJih3aW5kb3dbc3RlcF0pOworICAgICAgICBzdGF0ZV9wdHIgPSAmKHN0YXRlWzBdKTsKKyAgICAgICAgaiA9IHdpbmRvd19lbnRyaWVzIC0gc3RlcDsKKyAgICAgICAgZm9yICg7aj4wO2otLSx4X3B0cisrLHN0YXRlX3B0cisrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeF92YWx1ZSA9ICp4X3B0cjsKKyAgICAgICAgICAgIGludCBzdGF0ZV92YWx1ZSA9ICpzdGF0ZV9wdHI7CisgICAgICAgICAgICAqeF9wdHIgPSB4X3ZhbHVlICsgc2hpZnRfZG93bihrKnN0YXRlX3ZhbHVlLExBVFRJQ0VfU0hJRlQpOworICAgICAgICAgICAgKnN0YXRlX3B0ciA9IHN0YXRlX3ZhbHVlICsgc2hpZnRfZG93bihrKnhfdmFsdWUsIExBVFRJQ0VfU0hJRlQpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBmb3IgKGo9MDsgaiA8PSAod2luZG93X2VudHJpZXMgLSBzdGVwKTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3RlcHZhbCA9IHdpbmRvd1tzdGVwK2pdOworICAgICAgICAgICAgaW50IHN0YXRldmFsPXN0YXRlW2pdOworICAgICAgICAgICAgd2luZG93W3N0ZXAral0gKz0gc2hpZnRfZG93bihrICogc3RhdGV2YWwsIExBVFRJQ0VfU0hJRlQpOworICAgICAgICAgICAgc3RhdGVbal0gKz0gc2hpZnRfZG93bihrICogc3RlcHZhbCwgTEFUVElDRV9TSElGVCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIGF2X2ZyZWUoc3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjb2RlX3NhbXBsZXJhdGUoaW50IHNhbXBsZXJhdGUpCit7CisgICAgc3dpdGNoIChzYW1wbGVyYXRlKQorICAgIHsKKyAgICAgICAgY2FzZSA0NDEwMDogcmV0dXJuIDA7CisgICAgICAgIGNhc2UgMjIwNTA6IHJldHVybiAxOworICAgICAgICBjYXNlIDExMDI1OiByZXR1cm4gMjsKKyAgICAgICAgY2FzZSA5NjAwMDogcmV0dXJuIDM7CisgICAgICAgIGNhc2UgNDgwMDA6IHJldHVybiA0OworICAgICAgICBjYXNlIDMyMDAwOiByZXR1cm4gNTsKKyAgICAgICAgY2FzZSAyNDAwMDogcmV0dXJuIDY7CisgICAgICAgIGNhc2UgMTYwMDA6IHJldHVybiA3OworICAgICAgICBjYXNlIDgwMDA6IHJldHVybiA4OworICAgIH0KKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgc29uaWNfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNvbmljQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBpbnQgaTsKKworICAgIHMtPnZlcnNpb24gPSAyOworCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IE1BWF9DSEFOTkVMUykKKyAgICB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBtb25vIGFuZCBzdGVyZW8gc3RyZWFtcyBhcmUgc3VwcG9ydGVkIGJ5IG5vd1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7IC8qIG9ubHkgc3RlcmVvIG9yIG1vbm8gZm9yIG5vdyAqLworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPT0gMikKKyAgICAgICAgcy0+ZGVjb3JyZWxhdGlvbiA9IE1JRF9TSURFOworICAgIGVsc2UKKyAgICAgICAgcy0+ZGVjb3JyZWxhdGlvbiA9IDM7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9TT05JQ19MUykKKyAgICB7CisgICAgICAgIHMtPmxvc3NsZXNzID0gMTsKKyAgICAgICAgcy0+bnVtX3RhcHMgPSAzMjsKKyAgICAgICAgcy0+ZG93bnNhbXBsaW5nID0gMTsKKyAgICAgICAgcy0+cXVhbnRpemF0aW9uID0gMC4wOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzLT5udW1fdGFwcyA9IDEyODsKKyAgICAgICAgcy0+ZG93bnNhbXBsaW5nID0gMjsKKyAgICAgICAgcy0+cXVhbnRpemF0aW9uID0gMS4wOworICAgIH0KKworICAgIC8vIG1heCB0YXAgMjA0OAorICAgIGlmIChzLT5udW1fdGFwcyA8IDMyIHx8IHMtPm51bV90YXBzID4gMTAyNCB8fCBzLT5udW1fdGFwcyAlIDMyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgdGFwc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8vIGdlbmVyYXRlIHRhcHMKKyAgICBzLT50YXBfcXVhbnQgPSBhdl9jYWxsb2Mocy0+bnVtX3RhcHMsIHNpemVvZigqcy0+dGFwX3F1YW50KSk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV90YXBzOyBpKyspCisgICAgICAgIHMtPnRhcF9xdWFudFtpXSA9IGZmX3NxcnQoaSsxKTsKKworICAgIHMtPmNoYW5uZWxzID0gYXZjdHgtPmNoYW5uZWxzOworICAgIHMtPnNhbXBsZXJhdGUgPSBhdmN0eC0+c2FtcGxlX3JhdGU7CisKKyAgICBzLT5ibG9ja19hbGlnbiA9IDIwNDhMTCpzLT5zYW1wbGVyYXRlLyg0NDEwMCpzLT5kb3duc2FtcGxpbmcpOworICAgIHMtPmZyYW1lX3NpemUgPSBzLT5jaGFubmVscypzLT5ibG9ja19hbGlnbipzLT5kb3duc2FtcGxpbmc7CisKKyAgICBzLT50YWlsX3NpemUgPSBzLT5udW1fdGFwcypzLT5jaGFubmVsczsKKyAgICBzLT50YWlsID0gYXZfY2FsbG9jKHMtPnRhaWxfc2l6ZSwgc2l6ZW9mKCpzLT50YWlsKSk7CisgICAgaWYgKCFzLT50YWlsKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+cHJlZGljdG9yX2sgPSBhdl9jYWxsb2Mocy0+bnVtX3RhcHMsIHNpemVvZigqcy0+cHJlZGljdG9yX2spICk7CisgICAgaWYgKCFzLT5wcmVkaWN0b3JfaykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsczsgaSsrKQorICAgIHsKKyAgICAgICAgcy0+Y29kZWRfc2FtcGxlc1tpXSA9IGF2X2NhbGxvYyhzLT5ibG9ja19hbGlnbiwgc2l6ZW9mKCoqcy0+Y29kZWRfc2FtcGxlcykpOworICAgICAgICBpZiAoIXMtPmNvZGVkX3NhbXBsZXNbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHMtPmludF9zYW1wbGVzID0gYXZfY2FsbG9jKHMtPmZyYW1lX3NpemUsIHNpemVvZigqcy0+aW50X3NhbXBsZXMpKTsKKworICAgIHMtPndpbmRvd19zaXplID0gKCgyKnMtPnRhaWxfc2l6ZSkrcy0+ZnJhbWVfc2l6ZSk7CisgICAgcy0+d2luZG93ID0gYXZfY2FsbG9jKHMtPndpbmRvd19zaXplLCBzaXplb2YoKnMtPndpbmRvdykpOworICAgIGlmICghcy0+d2luZG93KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3ooMTYpOworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgYXZjdHgtPmV4dHJhZGF0YSwgMTYqOCk7CisKKyAgICBwdXRfYml0cygmcGIsIDIsIHMtPnZlcnNpb24pOyAvLyB2ZXJzaW9uCisgICAgaWYgKHMtPnZlcnNpb24gPj0gMSkKKyAgICB7CisgICAgICAgIGlmIChzLT52ZXJzaW9uID49IDIpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgcy0+dmVyc2lvbik7CisgICAgICAgICAgICBwdXRfYml0cygmcGIsIDgsIHMtPm1pbm9yX3ZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIHB1dF9iaXRzKCZwYiwgMiwgcy0+Y2hhbm5lbHMpOworICAgICAgICBwdXRfYml0cygmcGIsIDQsIGNvZGVfc2FtcGxlcmF0ZShzLT5zYW1wbGVyYXRlKSk7CisgICAgfQorICAgIHB1dF9iaXRzKCZwYiwgMSwgcy0+bG9zc2xlc3MpOworICAgIGlmICghcy0+bG9zc2xlc3MpCisgICAgICAgIHB1dF9iaXRzKCZwYiwgMywgU0FNUExFX1NISUZUKTsgLy8gWFhYIEZJWE1FOiBzYW1wbGUgcHJlY2lzaW9uCisgICAgcHV0X2JpdHMoJnBiLCAyLCBzLT5kZWNvcnJlbGF0aW9uKTsKKyAgICBwdXRfYml0cygmcGIsIDIsIHMtPmRvd25zYW1wbGluZyk7CisgICAgcHV0X2JpdHMoJnBiLCA1LCAocy0+bnVtX3RhcHMgPj4gNSktMSk7IC8vIDMyLi4xMDI0CisgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgLy8gWFhYIEZJWE1FOiBubyBjdXN0b20gdGFwIHF1YW50IHRhYmxlCisKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHB1dF9iaXRzX2NvdW50KCZwYikvODsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJTb25pYzogdmVyOiAlZC4lZCBsczogJWQgZHI6ICVkIHRhcHM6ICVkIGJsb2NrOiAlZCBmcmFtZTogJWQgZG93bnNhbXA6ICVkXG4iLAorICAgICAgICBzLT52ZXJzaW9uLCBzLT5taW5vcl92ZXJzaW9uLCBzLT5sb3NzbGVzcywgcy0+ZGVjb3JyZWxhdGlvbiwgcy0+bnVtX3RhcHMsIHMtPmJsb2NrX2FsaWduLCBzLT5mcmFtZV9zaXplLCBzLT5kb3duc2FtcGxpbmcpOworCisgICAgYXZjdHgtPmZyYW1lX3NpemUgPSBzLT5ibG9ja19hbGlnbipzLT5kb3duc2FtcGxpbmc7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHNvbmljX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU29uaWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsczsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmcy0+Y29kZWRfc2FtcGxlc1tpXSk7CisKKyAgICBhdl9mcmVlcCgmcy0+cHJlZGljdG9yX2spOworICAgIGF2X2ZyZWVwKCZzLT50YWlsKTsKKyAgICBhdl9mcmVlcCgmcy0+dGFwX3F1YW50KTsKKyAgICBhdl9mcmVlcCgmcy0+d2luZG93KTsKKyAgICBhdl9mcmVlcCgmcy0+aW50X3NhbXBsZXMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29uaWNfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCit7CisgICAgU29uaWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBSYW5nZUNvZGVyIGM7CisgICAgaW50IGksIGosIGNoLCBxdWFudCA9IDAsIHggPSAwOworICAgIGludCByZXQ7CisgICAgY29uc3Qgc2hvcnQgKnNhbXBsZXMgPSAoY29uc3QgaW50MTZfdCopZnJhbWUtPmRhdGFbMF07CisgICAgdWludDhfdCBzdGF0ZVszMl07CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBzLT5mcmFtZV9zaXplICogNSArIDEwMDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZl9pbml0X3JhbmdlX2VuY29kZXIoJmMsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisgICAgZmZfYnVpbGRfcmFjX3N0YXRlcygmYywgMC4wNSooMUxMPDwzMiksIDI1Ni04KTsKKyAgICBtZW1zZXQoc3RhdGUsIDEyOCwgc2l6ZW9mKHN0YXRlKSk7CisKKyAgICAvLyBzaG9ydCAtPiBpbnRlcm5hbAorICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZV9zaXplOyBpKyspCisgICAgICAgIHMtPmludF9zYW1wbGVzW2ldID0gc2FtcGxlc1tpXTsKKworICAgIGlmICghcy0+bG9zc2xlc3MpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZV9zaXplOyBpKyspCisgICAgICAgICAgICBzLT5pbnRfc2FtcGxlc1tpXSA9IHMtPmludF9zYW1wbGVzW2ldIDw8IFNBTVBMRV9TSElGVDsKKworICAgIHN3aXRjaChzLT5kZWNvcnJlbGF0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBNSURfU0lERToKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZV9zaXplOyBpICs9IHMtPmNoYW5uZWxzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMtPmludF9zYW1wbGVzW2ldICs9IHMtPmludF9zYW1wbGVzW2krMV07CisgICAgICAgICAgICAgICAgcy0+aW50X3NhbXBsZXNbaSsxXSAtPSBzaGlmdChzLT5pbnRfc2FtcGxlc1tpXSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMRUZUX1NJREU6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZnJhbWVfc2l6ZTsgaSArPSBzLT5jaGFubmVscykKKyAgICAgICAgICAgICAgICBzLT5pbnRfc2FtcGxlc1tpKzFdIC09IHMtPmludF9zYW1wbGVzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUklHSFRfU0lERToKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZV9zaXplOyBpICs9IHMtPmNoYW5uZWxzKQorICAgICAgICAgICAgICAgIHMtPmludF9zYW1wbGVzW2ldIC09IHMtPmludF9zYW1wbGVzW2krMV07CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBtZW1zZXQocy0+d2luZG93LCAwLCA0KiBzLT53aW5kb3dfc2l6ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+dGFpbF9zaXplOyBpKyspCisgICAgICAgIHMtPndpbmRvd1t4KytdID0gcy0+dGFpbFtpXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZV9zaXplOyBpKyspCisgICAgICAgIHMtPndpbmRvd1t4KytdID0gcy0+aW50X3NhbXBsZXNbaV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+dGFpbF9zaXplOyBpKyspCisgICAgICAgIHMtPndpbmRvd1t4KytdID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT50YWlsX3NpemU7IGkrKykKKyAgICAgICAgcy0+dGFpbFtpXSA9IHMtPmludF9zYW1wbGVzW3MtPmZyYW1lX3NpemUgLSBzLT50YWlsX3NpemUgKyBpXTsKKworICAgIC8vIGdlbmVyYXRlIHRhcHMKKyAgICBtb2RpZmllZF9sZXZpbnNvbl9kdXJiaW4ocy0+d2luZG93LCBzLT53aW5kb3dfc2l6ZSwKKyAgICAgICAgICAgICAgICBzLT5wcmVkaWN0b3Jfaywgcy0+bnVtX3RhcHMsIHMtPmNoYW5uZWxzLCBzLT50YXBfcXVhbnQpOworICAgIGlmICgocmV0ID0gaW50bGlzdF93cml0ZSgmYywgc3RhdGUsIHMtPnByZWRpY3Rvcl9rLCBzLT5udW1fdGFwcywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmNoYW5uZWxzOyBjaCsrKQorICAgIHsKKyAgICAgICAgeCA9IHMtPnRhaWxfc2l6ZStjaDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmJsb2NrX2FsaWduOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPmRvd25zYW1wbGluZzsgaisrLCB4ICs9IHMtPmNoYW5uZWxzKQorICAgICAgICAgICAgICAgIHN1bSArPSBzLT53aW5kb3dbeF07CisgICAgICAgICAgICBzLT5jb2RlZF9zYW1wbGVzW2NoXVtpXSA9IHN1bTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNpbXBsZSByYXRlIGNvbnRyb2wgY29kZQorICAgIGlmICghcy0+bG9zc2xlc3MpCisgICAgeworICAgICAgICBkb3VibGUgZW5lcmd5MSA9IDAuMCwgZW5lcmd5MiA9IDAuMDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ibG9ja19hbGlnbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBzYW1wbGUgPSBzLT5jb2RlZF9zYW1wbGVzW2NoXVtpXTsKKyAgICAgICAgICAgICAgICBlbmVyZ3kyICs9IHNhbXBsZSpzYW1wbGU7CisgICAgICAgICAgICAgICAgZW5lcmd5MSArPSBmYWJzKHNhbXBsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbmVyZ3kyID0gc3FydChlbmVyZ3kyLyhzLT5jaGFubmVscypzLT5ibG9ja19hbGlnbikpOworICAgICAgICBlbmVyZ3kxID0gTV9TUVJUMiplbmVyZ3kxLyhzLT5jaGFubmVscypzLT5ibG9ja19hbGlnbik7CisKKyAgICAgICAgLy8gaW5jcmVhc2UgYml0cmF0ZSB3aGVuIHNhbXBsZXMgYXJlIGxpa2UgYSBnYXVzc2lhbiBkaXN0cmlidXRpb24KKyAgICAgICAgLy8gcmVkdWNlIGJpdHJhdGUgd2hlbiBzYW1wbGVzIGFyZSBsaWtlIGEgdHdvLXRhaWxlZCBleHBvbmVudGlhbCBkaXN0cmlidXRpb24KKworICAgICAgICBpZiAoZW5lcmd5MiA+IGVuZXJneTEpCisgICAgICAgICAgICBlbmVyZ3kyICs9IChlbmVyZ3kyLWVuZXJneTEpKlJBVEVfVkFSSUFUSU9OOworCisgICAgICAgIHF1YW50ID0gKGludCkoQkFTRV9RVUFOVCpzLT5xdWFudGl6YXRpb24qZW5lcmd5Mi9TQU1QTEVfRkFDVE9SKTsKKy8vICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInF1YW50OiAlZCBlbmVyZ3k6ICVmIC8gJWZcbiIsIHF1YW50LCBlbmVyZ3kxLCBlbmVyZ3kyKTsKKworICAgICAgICBxdWFudCA9IGF2X2NsaXAocXVhbnQsIDEsIDY1NTM0KTsKKworICAgICAgICBwdXRfc3ltYm9sKCZjLCBzdGF0ZSwgcXVhbnQsIDAsIE5VTEwsIE5VTEwpOworCisgICAgICAgIHF1YW50ICo9IFNBTVBMRV9GQUNUT1I7CisgICAgfQorCisgICAgLy8gd3JpdGUgb3V0IGNvZGVkIHNhbXBsZXMKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5jaGFubmVsczsgY2grKykKKyAgICB7CisgICAgICAgIGlmICghcy0+bG9zc2xlc3MpCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YmxvY2tfYWxpZ247IGkrKykKKyAgICAgICAgICAgICAgICBzLT5jb2RlZF9zYW1wbGVzW2NoXVtpXSA9IFJPVU5ERURfRElWKHMtPmNvZGVkX3NhbXBsZXNbY2hdW2ldLCBxdWFudCk7CisKKyAgICAgICAgaWYgKChyZXQgPSBpbnRsaXN0X3dyaXRlKCZjLCBzdGF0ZSwgcy0+Y29kZWRfc2FtcGxlc1tjaF0sIHMtPmJsb2NrX2FsaWduLCAxKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKy8vICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAidXNlZCBieXRlczogJWRcbiIsIChwdXRfYml0c19jb3VudCgmcGIpKzcpLzgpOworCisgICAgYXZwa3QtPnNpemUgPSBmZl9yYWNfdGVybWluYXRlKCZjKTsKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworCit9CisjZW5kaWYgLyogQ09ORklHX1NPTklDX0VOQ09ERVIgfHwgQ09ORklHX1NPTklDX0xTX0VOQ09ERVIgKi8KKworI2lmIENPTkZJR19TT05JQ19ERUNPREVSCitzdGF0aWMgY29uc3QgaW50IHNhbXBsZXJhdGVfdGFibGVbXSA9CisgICAgeyA0NDEwMCwgMjIwNTAsIDExMDI1LCA5NjAwMCwgNDgwMDAsIDMyMDAwLCAyNDAwMCwgMTYwMDAsIDgwMDAgfTsKKworc3RhdGljIGF2X2NvbGQgaW50IHNvbmljX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTb25pY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGk7CisKKyAgICBzLT5jaGFubmVscyA9IGF2Y3R4LT5jaGFubmVsczsKKyAgICBzLT5zYW1wbGVyYXRlID0gYXZjdHgtPnNhbXBsZV9yYXRlOworCisgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKQorICAgIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyBtYW5kYXRvcnkgaGVhZGVycyBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaW5pdF9nZXRfYml0czgoJmdiLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgcy0+dmVyc2lvbiA9IGdldF9iaXRzKCZnYiwgMik7CisgICAgaWYgKHMtPnZlcnNpb24gPj0gMikgeworICAgICAgICBzLT52ZXJzaW9uICAgICAgID0gZ2V0X2JpdHMoJmdiLCA4KTsKKyAgICAgICAgcy0+bWlub3JfdmVyc2lvbiA9IGdldF9iaXRzKCZnYiwgOCk7CisgICAgfQorICAgIGlmIChzLT52ZXJzaW9uICE9IDIpCisgICAgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIFNvbmljIHZlcnNpb24sIHBsZWFzZSByZXBvcnRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAocy0+dmVyc2lvbiA+PSAxKQorICAgIHsKKyAgICAgICAgcy0+Y2hhbm5lbHMgPSBnZXRfYml0cygmZ2IsIDIpOworICAgICAgICBzLT5zYW1wbGVyYXRlID0gc2FtcGxlcmF0ZV90YWJsZVtnZXRfYml0cygmZ2IsIDQpXTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIlNvbmljdjIgY2hhbnM6ICVkIHNhbXByYXRlOiAlZFxuIiwKKyAgICAgICAgICAgIHMtPmNoYW5uZWxzLCBzLT5zYW1wbGVyYXRlKTsKKyAgICB9CisKKyAgICBpZiAocy0+Y2hhbm5lbHMgPiBNQVhfQ0hBTk5FTFMpCisgICAgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9ubHkgbW9ubyBhbmQgc3RlcmVvIHN0cmVhbXMgYXJlIHN1cHBvcnRlZCBieSBub3dcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5sb3NzbGVzcyA9IGdldF9iaXRzMSgmZ2IpOworICAgIGlmICghcy0+bG9zc2xlc3MpCisgICAgICAgIHNraXBfYml0cygmZ2IsIDMpOyAvLyBYWFggRklYTUUKKyAgICBzLT5kZWNvcnJlbGF0aW9uID0gZ2V0X2JpdHMoJmdiLCAyKTsKKyAgICBpZiAocy0+ZGVjb3JyZWxhdGlvbiAhPSAzICYmIHMtPmNoYW5uZWxzICE9IDIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGRlY29ycmVsYXRpb24gJWRcbiIsIHMtPmRlY29ycmVsYXRpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5kb3duc2FtcGxpbmcgPSBnZXRfYml0cygmZ2IsIDIpOworICAgIGlmICghcy0+ZG93bnNhbXBsaW5nKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBkb3duc2FtcGxpbmcgdmFsdWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5udW1fdGFwcyA9IChnZXRfYml0cygmZ2IsIDUpKzEpPDw1OworICAgIGlmIChnZXRfYml0czEoJmdiKSkgLy8gWFhYIEZJWE1FCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJDdXN0b20gcXVhbnQgdGFibGVcbiIpOworCisgICAgcy0+YmxvY2tfYWxpZ24gPSAyMDQ4TEwqcy0+c2FtcGxlcmF0ZS8oNDQxMDAqcy0+ZG93bnNhbXBsaW5nKTsKKyAgICBzLT5mcmFtZV9zaXplID0gcy0+Y2hhbm5lbHMqcy0+YmxvY2tfYWxpZ24qcy0+ZG93bnNhbXBsaW5nOworLy8gICAgYXZjdHgtPmZyYW1lX3NpemUgPSBzLT5ibG9ja19hbGlnbjsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJTb25pYzogdmVyOiAlZC4lZCBsczogJWQgZHI6ICVkIHRhcHM6ICVkIGJsb2NrOiAlZCBmcmFtZTogJWQgZG93bnNhbXA6ICVkXG4iLAorICAgICAgICBzLT52ZXJzaW9uLCBzLT5taW5vcl92ZXJzaW9uLCBzLT5sb3NzbGVzcywgcy0+ZGVjb3JyZWxhdGlvbiwgcy0+bnVtX3RhcHMsIHMtPmJsb2NrX2FsaWduLCBzLT5mcmFtZV9zaXplLCBzLT5kb3duc2FtcGxpbmcpOworCisgICAgLy8gZ2VuZXJhdGUgdGFwcworICAgIHMtPnRhcF9xdWFudCA9IGF2X2NhbGxvYyhzLT5udW1fdGFwcywgc2l6ZW9mKCpzLT50YXBfcXVhbnQpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX3RhcHM7IGkrKykKKyAgICAgICAgcy0+dGFwX3F1YW50W2ldID0gZmZfc3FydChpKzEpOworCisgICAgcy0+cHJlZGljdG9yX2sgPSBhdl9jYWxsb2Mocy0+bnVtX3RhcHMsIHNpemVvZigqcy0+cHJlZGljdG9yX2spKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsczsgaSsrKQorICAgIHsKKyAgICAgICAgcy0+cHJlZGljdG9yX3N0YXRlW2ldID0gYXZfY2FsbG9jKHMtPm51bV90YXBzLCBzaXplb2YoKipzLT5wcmVkaWN0b3Jfc3RhdGUpKTsKKyAgICAgICAgaWYgKCFzLT5wcmVkaWN0b3Jfc3RhdGVbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsczsgaSsrKQorICAgIHsKKyAgICAgICAgcy0+Y29kZWRfc2FtcGxlc1tpXSA9IGF2X2NhbGxvYyhzLT5ibG9ja19hbGlnbiwgc2l6ZW9mKCoqcy0+Y29kZWRfc2FtcGxlcykpOworICAgICAgICBpZiAoIXMtPmNvZGVkX3NhbXBsZXNbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBzLT5pbnRfc2FtcGxlcyA9IGF2X2NhbGxvYyhzLT5mcmFtZV9zaXplLCBzaXplb2YoKnMtPmludF9zYW1wbGVzKSk7CisKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzE2OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgc29uaWNfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTb25pY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgYXZfZnJlZXAoJnMtPmludF9zYW1wbGVzKTsKKyAgICBhdl9mcmVlcCgmcy0+dGFwX3F1YW50KTsKKyAgICBhdl9mcmVlcCgmcy0+cHJlZGljdG9yX2spOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmNoYW5uZWxzOyBpKyspCisgICAgeworICAgICAgICBhdl9mcmVlcCgmcy0+cHJlZGljdG9yX3N0YXRlW2ldKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmNvZGVkX3NhbXBsZXNbaV0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbmljX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBTb25pY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFJhbmdlQ29kZXIgYzsKKyAgICB1aW50OF90IHN0YXRlWzMyXTsKKyAgICBpbnQgaSwgcXVhbnQsIGNoLCBqLCByZXQ7CisgICAgaW50MTZfdCAqc2FtcGxlczsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisKKyAgICBpZiAoYnVmX3NpemUgPT0gMCkgcmV0dXJuIDA7CisKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IHMtPmZyYW1lX3NpemUgLyBhdmN0eC0+Y2hhbm5lbHM7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzYW1wbGVzID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKworLy8gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiYnVmX3NpemU6ICVkXG4iLCBidWZfc2l6ZSk7CisKKyAgICBtZW1zZXQoc3RhdGUsIDEyOCwgc2l6ZW9mKHN0YXRlKSk7CisgICAgZmZfaW5pdF9yYW5nZV9kZWNvZGVyKCZjLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBmZl9idWlsZF9yYWNfc3RhdGVzKCZjLCAwLjA1KigxTEw8PDMyKSwgMjU2LTgpOworCisgICAgaW50bGlzdF9yZWFkKCZjLCBzdGF0ZSwgcy0+cHJlZGljdG9yX2ssIHMtPm51bV90YXBzLCAwKTsKKworICAgIC8vIGRlcXVhbnRpemUKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX3RhcHM7IGkrKykKKyAgICAgICAgcy0+cHJlZGljdG9yX2tbaV0gKj0gcy0+dGFwX3F1YW50W2ldOworCisgICAgaWYgKHMtPmxvc3NsZXNzKQorICAgICAgICBxdWFudCA9IDE7CisgICAgZWxzZQorICAgICAgICBxdWFudCA9IGdldF9zeW1ib2woJmMsIHN0YXRlLCAwKSAqIFNBTVBMRV9GQUNUT1I7CisKKy8vICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgInF1YW50OiAlZFxuIiwgcXVhbnQpOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspCisgICAgeworICAgICAgICBpbnQgeCA9IGNoOworCisgICAgICAgIHByZWRpY3Rvcl9pbml0X3N0YXRlKHMtPnByZWRpY3Rvcl9rLCBzLT5wcmVkaWN0b3Jfc3RhdGVbY2hdLCBzLT5udW1fdGFwcyk7CisKKyAgICAgICAgaW50bGlzdF9yZWFkKCZjLCBzdGF0ZSwgcy0+Y29kZWRfc2FtcGxlc1tjaF0sIHMtPmJsb2NrX2FsaWduLCAxKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YmxvY2tfYWxpZ247IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPmRvd25zYW1wbGluZyAtIDE7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzLT5pbnRfc2FtcGxlc1t4XSA9IHByZWRpY3Rvcl9jYWxjX2Vycm9yKHMtPnByZWRpY3Rvcl9rLCBzLT5wcmVkaWN0b3Jfc3RhdGVbY2hdLCBzLT5udW1fdGFwcywgMCk7CisgICAgICAgICAgICAgICAgeCArPSBzLT5jaGFubmVsczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+aW50X3NhbXBsZXNbeF0gPSBwcmVkaWN0b3JfY2FsY19lcnJvcihzLT5wcmVkaWN0b3Jfaywgcy0+cHJlZGljdG9yX3N0YXRlW2NoXSwgcy0+bnVtX3RhcHMsIHMtPmNvZGVkX3NhbXBsZXNbY2hdW2ldICogcXVhbnQpOworICAgICAgICAgICAgeCArPSBzLT5jaGFubmVsczsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fdGFwczsgaSsrKQorICAgICAgICAgICAgcy0+cHJlZGljdG9yX3N0YXRlW2NoXVtpXSA9IHMtPmludF9zYW1wbGVzW3MtPmZyYW1lX3NpemUgLSBzLT5jaGFubmVscyArIGNoIC0gaSpzLT5jaGFubmVsc107CisgICAgfQorCisgICAgc3dpdGNoKHMtPmRlY29ycmVsYXRpb24pCisgICAgeworICAgICAgICBjYXNlIE1JRF9TSURFOgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmZyYW1lX3NpemU7IGkgKz0gcy0+Y2hhbm5lbHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcy0+aW50X3NhbXBsZXNbaSsxXSArPSBzaGlmdChzLT5pbnRfc2FtcGxlc1tpXSwgMSk7CisgICAgICAgICAgICAgICAgcy0+aW50X3NhbXBsZXNbaV0gLT0gcy0+aW50X3NhbXBsZXNbaSsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExFRlRfU0lERToKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZV9zaXplOyBpICs9IHMtPmNoYW5uZWxzKQorICAgICAgICAgICAgICAgIHMtPmludF9zYW1wbGVzW2krMV0gKz0gcy0+aW50X3NhbXBsZXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSSUdIVF9TSURFOgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmZyYW1lX3NpemU7IGkgKz0gcy0+Y2hhbm5lbHMpCisgICAgICAgICAgICAgICAgcy0+aW50X3NhbXBsZXNbaV0gKz0gcy0+aW50X3NhbXBsZXNbaSsxXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghcy0+bG9zc2xlc3MpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZV9zaXplOyBpKyspCisgICAgICAgICAgICBzLT5pbnRfc2FtcGxlc1tpXSA9IHNoaWZ0KHMtPmludF9zYW1wbGVzW2ldLCBTQU1QTEVfU0hJRlQpOworCisgICAgLy8gaW50ZXJuYWwgLT4gc2hvcnQKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZnJhbWVfc2l6ZTsgaSsrKQorICAgICAgICBzYW1wbGVzW2ldID0gYXZfY2xpcF9pbnQxNihzLT5pbnRfc2FtcGxlc1tpXSk7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK0FWQ29kZWMgZmZfc29uaWNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic29uaWMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTb25pYyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TT05JQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU29uaWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBzb25pY19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBzb25pY19kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gc29uaWNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfRVhQRVJJTUVOVEFMLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfU09OSUNfREVDT0RFUiAqLworCisjaWYgQ09ORklHX1NPTklDX0VOQ09ERVIKK0FWQ29kZWMgZmZfc29uaWNfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic29uaWMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTb25pYyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TT05JQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU29uaWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBzb25pY19lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBzb25pY19lbmNvZGVfZnJhbWUsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRVhQRVJJTUVOVEFMLAorICAgIC5jbG9zZSAgICAgICAgICA9IHNvbmljX2VuY29kZV9jbG9zZSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19TT05JQ19MU19FTkNPREVSCitBVkNvZGVjIGZmX3NvbmljX2xzX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInNvbmljbHMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTb25pYyBsb3NzbGVzcyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TT05JQ19MUywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU29uaWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBzb25pY19lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBzb25pY19lbmNvZGVfZnJhbWUsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRVhQRVJJTUVOVEFMLAorICAgIC5jbG9zZSAgICAgICAgICA9IHNvbmljX2VuY29kZV9jbG9zZSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NwNXguaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3NwNXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Q2ZThkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3A1eC5oCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogU3VucGx1cyBKUEVHIHRhYmxlcworICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfU1A1WF9ICisjZGVmaW5lIEFWQ09ERUNfU1A1WF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3A1eF9kYXRhX3NvZltdID0KK3sKKyAgICAweEZGLCAweEMwLCAgICAgICAvKiBTT0YgKi8KKyAgICAweDAwLCAweDExLCAgICAgICAvKiBsZW4gKi8KKyAgICAweDA4LCAgICAgICAgICAgICAvKiBiaXRzICovCisgICAgMHgwMCwgMHhmMCwgICAgICAgLyogaGVpZ2h0IChkZWZhdWx0OiAyNDApICovCisgICAgMHgwMSwgMHg0MCwgICAgICAgLyogd2lkdGggKGRlZmF1bHQ6IDI0MCkgKi8KKyAgICAweDAzLCAgICAgICAgICAgICAvKiBuYiBjb21wb25lbnRzICovCisgICAgMHgwMSwgMHgyMiwgMHgwMCwgLyogMjEgdnMgMjIgPyAqLworICAgIDB4MDIsIDB4MTEsIDB4MDEsCisgICAgMHgwMywgMHgxMSwgMHgwMQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3A1eF9kYXRhX3Nvc1tdID0KK3sKKyAgICAweEZGLCAweERBLCAgICAgICAvKiBTT1MgKi8KKyAgICAweDAwLCAweDBDLCAgICAgICAvKiBsZW4gKi8KKyAgICAweDAzLCAgICAgICAgICAgICAvKiBuYiBjb21wb25lbnRzICovCisgICAgMHgwMSwgMHgwMCwKKyAgICAweDAyLCAweDExLAorICAgIDB4MDMsIDB4MTEsCisgICAgMHgwMCwgICAgICAgICAgICAgLyogU3MgKi8KKyAgICAweDNGLCAgICAgICAgICAgICAvKiBTZSAqLworICAgIDB4MDAgICAgICAgICAgICAgIC8qIEFoL0FsICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzcDV4X2RhdGFfZHF0W10gPQoreworICAgIDB4RkYsIDB4REIsIC8qIERRVCAqLworICAgIDB4MDAsIDB4ODQsIC8qIGxlbiAqLworICAgIDB4MDAsCisgICAgMHgwNSwgMHgwMywgMHgwNCwgMHgwNCwgMHgwNCwgMHgwMywgMHgwNSwgMHgwNCwKKyAgICAweDA0LCAweDA0LCAweDA2LCAweDA1LCAweDA1LCAweDA2LCAweDA4LCAweDBELAorICAgIDB4MDgsIDB4MDgsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MTAsIDB4MEMsIDB4MEMsCisgICAgMHgwQSwgMHgwRCwgMHgxNCwgMHgxMSwgMHgxNSwgMHgxNCwgMHgxMywgMHgxMSwKKyAgICAweDEzLCAweDEzLCAweDE2LCAweDE4LCAweDFGLCAweDFBLCAweDE2LCAweDE3LAorICAgIDB4MUUsIDB4MTcsIDB4MTMsIDB4MTMsIDB4MUIsIDB4MjUsIDB4MUMsIDB4MUUsCisgICAgMHgyMCwgMHgyMSwgMHgyMywgMHgyMywgMHgyMywgMHgxNSwgMHgxQSwgMHgyNywKKyAgICAweDI5LCAweDI2LCAweDIyLCAweDI5LCAweDFGLCAweDIyLCAweDIzLCAweDIyLAorICAgIDB4MDEsCisgICAgMHgwNSwgMHgwNiwgMHgwNiwgMHgwOCwgMHgwNywgMHgwOCwgMHgxMCwgMHgwOCwKKyAgICAweDA4LCAweDEwLCAweDIyLCAweDE2LCAweDEzLCAweDE2LCAweDIyLCAweDIyLAorICAgIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsCisgICAgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwKKyAgICAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLAorICAgIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsCisgICAgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwKKyAgICAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzcDV4X2RhdGFfZGh0W10gPSB7CisgICAgMHhGRiwgMHhDNCwgLyogREhUICovCisgICAgMHgwMSwgMHhBMiwgLyogbGVuICovCisgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKyAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsCisgICAgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwMSwgMHgwMCwgMHgwMywKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCisgICAgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwKKyAgICAweDBBLCAweDBCLCAweDEwLCAweDAwLCAweDAyLCAweDAxLCAweDAzLCAweDAzLAorICAgIDB4MDIsIDB4MDQsIDB4MDMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MDQsIDB4MDAsCisgICAgMHgwMCwgMHgwMSwgMHg3RCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwKKyAgICAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLCAweDQxLCAweDA2LCAweDEzLAorICAgIDB4NTEsIDB4NjEsIDB4MDcsIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsCisgICAgMHg5MSwgMHhBMSwgMHgwOCwgMHgyMywgMHg0MiwgMHhCMSwgMHhDMSwgMHgxNSwKKyAgICAweDUyLCAweEQxLCAweEYwLCAweDI0LCAweDMzLCAweDYyLCAweDcyLCAweDgyLAorICAgIDB4MDksIDB4MEEsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MUEsIDB4MjUsCisgICAgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgzNCwgMHgzNSwgMHgzNiwKKyAgICAweDM3LCAweDM4LCAweDM5LCAweDNBLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LAorICAgIDB4NDcsIDB4NDgsIDB4NDksIDB4NEEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsCisgICAgMHg1NywgMHg1OCwgMHg1OSwgMHg1QSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwKKyAgICAweDY3LCAweDY4LCAweDY5LCAweDZBLCAweDczLCAweDc0LCAweDc1LCAweDc2LAorICAgIDB4NzcsIDB4NzgsIDB4NzksIDB4N0EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsCisgICAgMHg4NywgMHg4OCwgMHg4OSwgMHg4QSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwKKyAgICAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlBLCAweEEyLCAweEEzLCAweEE0LAorICAgIDB4QTUsIDB4QTYsIDB4QTcsIDB4QTgsIDB4QTksIDB4QUEsIDB4QjIsIDB4QjMsCisgICAgMHhCNCwgMHhCNSwgMHhCNiwgMHhCNywgMHhCOCwgMHhCOSwgMHhCQSwgMHhDMiwKKyAgICAweEMzLCAweEM0LCAweEM1LCAweEM2LCAweEM3LCAweEM4LCAweEM5LCAweENBLAorICAgIDB4RDIsIDB4RDMsIDB4RDQsIDB4RDUsIDB4RDYsIDB4RDcsIDB4RDgsIDB4RDksCisgICAgMHhEQSwgMHhFMSwgMHhFMiwgMHhFMywgMHhFNCwgMHhFNSwgMHhFNiwgMHhFNywKKyAgICAweEU4LCAweEU5LCAweEVBLCAweEYxLCAweEYyLCAweEYzLCAweEY0LCAweEY1LAorICAgIDB4RjYsIDB4RjcsIDB4RjgsIDB4RjksIDB4RkEsIDB4MTEsIDB4MDAsIDB4MDIsCisgICAgMHgwMSwgMHgwMiwgMHgwNCwgMHgwNCwgMHgwMywgMHgwNCwgMHgwNywgMHgwNSwKKyAgICAweDA0LCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDc3LCAweDAwLCAweDAxLAorICAgIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsIDB4MzEsIDB4MDYsCisgICAgMHgxMiwgMHg0MSwgMHg1MSwgMHgwNywgMHg2MSwgMHg3MSwgMHgxMywgMHgyMiwKKyAgICAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLCAweEExLCAweEIxLAorICAgIDB4QzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4RjAsIDB4MTUsIDB4NjIsCisgICAgMHg3MiwgMHhEMSwgMHgwQSwgMHgxNiwgMHgyNCwgMHgzNCwgMHhFMSwgMHgyNSwKKyAgICAweEYxLCAweDE3LCAweDE4LCAweDE5LCAweDFBLCAweDI2LCAweDI3LCAweDI4LAorICAgIDB4MjksIDB4MkEsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsCisgICAgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0QSwKKyAgICAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVBLAorICAgIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NkEsCisgICAgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3QSwKKyAgICAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LAorICAgIDB4OEEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsCisgICAgMHg5OSwgMHg5QSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNSwgMHhBNiwgMHhBNywKKyAgICAweEE4LCAweEE5LCAweEFBLCAweEIyLCAweEIzLCAweEI0LCAweEI1LCAweEI2LAorICAgIDB4QjcsIDB4QjgsIDB4QjksIDB4QkEsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsCisgICAgMHhDNiwgMHhDNywgMHhDOCwgMHhDOSwgMHhDQSwgMHhEMiwgMHhEMywgMHhENCwKKyAgICAweEQ1LCAweEQ2LCAweEQ3LCAweEQ4LCAweEQ5LCAweERBLCAweEUyLCAweEUzLAorICAgIDB4RTQsIDB4RTUsIDB4RTYsIDB4RTcsIDB4RTgsIDB4RTksIDB4RUEsIDB4RjIsCisgICAgMHhGMywgMHhGNCwgMHhGNSwgMHhGNiwgMHhGNywgMHhGOCwgMHhGOSwgMHhGQQorfTsKKworCitzdGF0aWMgY29uc3QgdWludDhfdCBzcDV4X3F1YW50X3RhYmxlWzIwXVs2NF09Cit7CisgICAgLyogaW5kZXggMCwgUTUwICovCisgICAgeyAgMTYsIDExLCAxMiwgMTQsIDEyLCAxMCwgMTYsIDE0LCAxMywgMTQsIDE4LCAxNywgMTYsIDE5LCAyNCwgNDAsCisgICAgICAgMjYsIDI0LCAyMiwgMjIsIDI0LCA0OSwgMzUsIDM3LCAyOSwgNDAsIDU4LCA1MSwgNjEsIDYwLCA1NywgNTEsCisgICAgICAgNTYsIDU1LCA2NCwgNzIsIDkyLCA3OCwgNjQsIDY4LCA4NywgNjksIDU1LCA1NiwgODAsMTA5LCA4MSwgODcsCisgICAgICAgOTUsIDk4LDEwMywxMDQsMTAzLCA2MiwgNzcsMTEzLDEyMSwxMTIsMTAwLDEyMCwgOTIsMTAxLDEwMywgOTkgfSwKKyAgICB7ICAxNywgMTgsIDE4LCAyNCwgMjEsIDI0LCA0NywgMjYsIDI2LCA0NywgOTksIDY2LCA1NiwgNjYsIDk5LCA5OSwKKyAgICAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgICAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgICAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSB9LAorCisgICAgLyogaW5kZXggMSwgUTcwICovCisgICAgeyAgMTAsICA3LCAgNywgIDgsICA3LCAgNiwgMTAsICA4LCAgOCwgIDgsIDExLCAxMCwgMTAsIDExLCAxNCwgMjQsCisgICAgICAgMTYsIDE0LCAxMywgMTMsIDE0LCAyOSwgMjEsIDIyLCAxNywgMjQsIDM1LCAzMSwgMzcsIDM2LCAzNCwgMzEsCisgICAgICAgMzQsIDMzLCAzOCwgNDMsIDU1LCA0NywgMzgsIDQxLCA1MiwgNDEsIDMzLCAzNCwgNDgsIDY1LCA0OSwgNTIsCisgICAgICAgNTcsIDU5LCA2MiwgNjIsIDYyLCAzNywgNDYsIDY4LCA3MywgNjcsIDYwLCA3MiwgNTUsIDYxLCA2MiwgNTkgfSwKKyAgICB7ICAxMCwgMTEsIDExLCAxNCwgMTMsIDE0LCAyOCwgMTYsIDE2LCAyOCwgNTksIDQwLCAzNCwgNDAsIDU5LCA1OSwKKyAgICAgICA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwKKyAgICAgICA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwKKyAgICAgICA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSB9LAorCisgICAgLyogaW5kZXggMiwgUTgwICovCisgICAgeyAgIDYsICA0LCAgNSwgIDYsICA1LCAgNCwgIDYsICA2LCAgNSwgIDYsICA3LCAgNywgIDYsICA4LCAxMCwgMTYsCisgICAgICAgMTAsIDEwLCAgOSwgIDksIDEwLCAyMCwgMTQsIDE1LCAxMiwgMTYsIDIzLCAyMCwgMjQsIDI0LCAyMywgMjAsCisgICAgICAgMjIsIDIyLCAyNiwgMjksIDM3LCAzMSwgMjYsIDI3LCAzNSwgMjgsIDIyLCAyMiwgMzIsIDQ0LCAzMiwgMzUsCisgICAgICAgMzgsIDM5LCA0MSwgNDIsIDQxLCAyNSwgMzEsIDQ1LCA0OCwgNDUsIDQwLCA0OCwgMzcsIDQwLCA0MSwgNDAgfSwKKyAgICB7ICAgNywgIDcsICA3LCAxMCwgIDgsIDEwLCAxOSwgMTAsIDEwLCAxOSwgNDAsIDI2LCAyMiwgMjYsIDQwLCA0MCwKKyAgICAgICA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwKKyAgICAgICA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwKKyAgICAgICA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCB9LAorCisgICAgLyogaW5kZXggMywgUTg1ICovCisgICAgeyAgIDUsICAzLCAgNCwgIDQsICA0LCAgMywgIDUsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA2LCAgNywgMTIsCisgICAgICAgIDgsICA3LCAgNywgIDcsICA3LCAxNSwgMTEsIDExLCAgOSwgMTIsIDE3LCAxNSwgMTgsIDE4LCAxNywgMTUsCisgICAgICAgMTcsIDE3LCAxOSwgMjIsIDI4LCAyMywgMTksIDIwLCAyNiwgMjEsIDE3LCAxNywgMjQsIDMzLCAyNCwgMjYsCisgICAgICAgMjksIDI5LCAzMSwgMzEsIDMxLCAxOSwgMjMsIDM0LCAzNiwgMzQsIDMwLCAzNiwgMjgsIDMwLCAzMSwgMzAgfSwKKyAgICB7ICAgNSwgIDUsICA1LCAgNywgIDYsICA3LCAxNCwgIDgsICA4LCAxNCwgMzAsIDIwLCAxNywgMjAsIDMwLCAzMCwKKyAgICAgICAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwKKyAgICAgICAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwKKyAgICAgICAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCB9LAorCisgICAgLyogaW5kZXggNCwgUTkwICovCisgICAgeyAgIDMsICAyLCAgMiwgIDMsICAyLCAgMiwgIDMsICAzLCAgMywgIDMsICA0LCAgMywgIDMsICA0LCAgNSwgIDgsCisgICAgICAgIDUsICA1LCAgNCwgIDQsICA1LCAxMCwgIDcsICA3LCAgNiwgIDgsIDEyLCAxMCwgMTIsIDEyLCAxMSwgMTAsCisgICAgICAgMTEsIDExLCAxMywgMTQsIDE4LCAxNiwgMTMsIDE0LCAxNywgMTQsIDExLCAxMSwgMTYsIDIyLCAxNiwgMTcsCisgICAgICAgMTksIDIwLCAyMSwgMjEsIDIxLCAxMiwgMTUsIDIzLCAyNCwgMjIsIDIwLCAyNCwgMTgsIDIwLCAyMSwgMjAgfSwKKyAgICB7ICAgMywgIDQsICA0LCAgNSwgIDQsICA1LCAgOSwgIDUsICA1LCAgOSwgMjAsIDEzLCAxMSwgMTMsIDIwLCAyMCwKKyAgICAgICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwKKyAgICAgICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwKKyAgICAgICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCB9LAorCisgICAgLyogaW5kZXggNSwgUTYwICovCisgICAgeyAgMTMsICA5LCAxMCwgMTEsIDEwLCAgOCwgMTMsIDExLCAxMCwgMTEsIDE0LCAxNCwgMTMsIDE1LCAxOSwgMzIsCisgICAgICAgMjEsIDE5LCAxOCwgMTgsIDE5LCAzOSwgMjgsIDMwLCAyMywgMzIsIDQ2LCA0MSwgNDksIDQ4LCA0NiwgNDEsCisgICAgICAgNDUsIDQ0LCA1MSwgNTgsIDc0LCA2MiwgNTEsIDU0LCA3MCwgNTUsIDQ0LCA0NSwgNjQsIDg3LCA2NSwgNzAsCisgICAgICAgNzYsIDc4LCA4MiwgODMsIDgyLCA1MCwgNjIsIDkwLCA5NywgOTAsIDgwLCA5NiwgNzQsIDgxLCA4MiwgNzkgfSwKKyAgICB7ICAxNCwgMTQsIDE0LCAxOSwgMTcsIDE5LCAzOCwgMjEsIDIxLCAzOCwgNzksIDUzLCA0NSwgNTMsIDc5LCA3OSwKKyAgICAgICA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwKKyAgICAgICA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwKKyAgICAgICA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSB9LAorCisgICAgLyogaW5kZXggNiwgUTI1ICovCisgICAgeyAgMzIsIDIyLCAyNCwgMjgsIDI0LCAyMCwgMzIsIDI4LCAyNiwgMjgsIDM2LCAzNCwgMzIsIDM4LCA0OCwgODAsCisgICAgICAgNTIsIDQ4LCA0NCwgNDQsIDQ4LCA5OCwgNzAsIDc0LCA1OCwgODAsMTE2LDEwMiwxMjIsMTIwLDExNCwxMDIsCisgICAgICAxMTIsMTEwLDEyOCwxNDQsMTg0LDE1NiwxMjgsMTM2LDE3NCwxMzgsMTEwLDExMiwxNjAsMjE4LDE2MiwxNzQsCisgICAgICAxOTAsMTk2LDIwNiwyMDgsMjA2LDEyNCwxNTQsMjI2LDI0MiwyMjQsMjAwLDI0MCwxODQsMjAyLDIwNiwxOTggfSwKKyAgICB7ICAzNCwgMzYsIDM2LCA0OCwgNDIsIDQ4LCA5NCwgNTIsIDUyLCA5NCwxOTgsMTMyLDExMiwxMzIsMTk4LDE5OCwKKyAgICAgIDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCwKKyAgICAgIDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCwKKyAgICAgIDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCwxOTgsMTk4LDE5OCB9LAorCisgICAgLyogaW5kZXggNywgUTk1ICovCisgICAgeyAgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsICAxLCAgMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMiwgIDQsCisgICAgICAgIDMsICAyLCAgMiwgIDIsICAyLCAgNSwgIDQsICA0LCAgMywgIDQsICA2LCAgNSwgIDYsICA2LCAgNiwgIDUsCisgICAgICAgIDYsICA2LCAgNiwgIDcsICA5LCAgOCwgIDYsICA3LCAgOSwgIDcsICA2LCAgNiwgIDgsIDExLCAgOCwgIDksCisgICAgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAgNiwgIDgsIDExLCAxMiwgMTEsIDEwLCAxMiwgIDksIDEwLCAxMCwgMTAgfSwKKyAgICB7ICAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgNSwgIDMsICAzLCAgNSwgMTAsICA3LCAgNiwgIDcsIDEwLCAxMCwKKyAgICAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCB9LAorCisgICAgLyogaW5kZXggOCwgUTkzICovCisgICAgeyAgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgIDIsICAyLCAgMiwgIDIsICAzLCAgMiwgIDIsICAzLCAgMywgIDYsCisgICAgICAgIDQsICAzLCAgMywgIDMsICAzLCAgNywgIDUsICA1LCAgNCwgIDYsICA4LCAgNywgIDksICA4LCAgOCwgIDcsCisgICAgICAgIDgsICA4LCAgOSwgMTAsIDEzLCAxMSwgIDksIDEwLCAxMiwgMTAsICA4LCAgOCwgMTEsIDE1LCAxMSwgMTIsCisgICAgICAgMTMsIDE0LCAxNCwgMTUsIDE0LCAgOSwgMTEsIDE2LCAxNywgMTYsIDE0LCAxNywgMTMsIDE0LCAxNCwgMTQgfSwKKyAgICB7ICAgMiwgIDMsICAzLCAgMywgIDMsICAzLCAgNywgIDQsICA0LCAgNywgMTQsICA5LCAgOCwgIDksIDE0LCAxNCwKKyAgICAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCB9LAorCisgICAgLyogaW5kZXggOSwgUTQwICovCisgICAgeyAgMjAsIDE0LCAxNSwgMTgsIDE1LCAxMywgMjAsIDE4LCAxNiwgMTgsIDIzLCAyMSwgMjAsIDI0LCAzMCwgNTAsCisgICAgICAgMzMsIDMwLCAyOCwgMjgsIDMwLCA2MSwgNDQsIDQ2LCAzNiwgNTAsIDczLCA2NCwgNzYsIDc1LCA3MSwgNjQsCisgICAgICAgNzAsIDY5LCA4MCwgOTAsMTE1LCA5OCwgODAsIDg1LDEwOSwgODYsIDY5LCA3MCwxMDAsMTM2LDEwMSwxMDksCisgICAgICAxMTksMTIzLDEyOSwxMzAsMTI5LCA3OCwgOTYsMTQxLDE1MSwxNDAsMTI1LDE1MCwxMTUsMTI2LDEyOSwxMjQgfSwKKyAgICB7ICAyMSwgMjMsIDIzLCAzMCwgMjYsIDMwLCA1OSwgMzMsIDMzLCA1OSwxMjQsIDgzLCA3MCwgODMsMTI0LDEyNCwKKyAgICAgIDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwKKyAgICAgIDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwKKyAgICAgIDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCB9Cit9OworCisjZW5kaWYgLyogQVZDT0RFQ19TUDVYX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3NwNXhkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NwNXhkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDk2MTk4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3A1eGRlYy5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogU3VucGx1cyBKUEVHIGRlY29kZXIgKFNQNVgpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTdW5wbHVzIEpQRUcgZGVjb2RlciAoU1A1WCkuCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtanBlZy5oIgorI2luY2x1ZGUgIm1qcGVnZGVjLmgiCisjaW5jbHVkZSAic3A1eC5oIgorCisKK3N0YXRpYyBpbnQgc3A1eF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgQVZQYWNrZXQgYXZwa3RfcmVjb2RlZDsKKyAgICBjb25zdCBpbnQgcXNjYWxlID0gNTsKKyAgICB1aW50OF90ICpyZWNvZGVkOworICAgIGludCBpID0gMCwgaiA9IDA7CisKKyAgICBpZiAoIWF2Y3R4LT53aWR0aCB8fCAhYXZjdHgtPmhlaWdodCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmVjb2RlZCA9IGF2X21hbGxvY3ooYnVmX3NpemUgKyAxMDI0KTsKKyAgICBpZiAoIXJlY29kZWQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIFNPSSAqLworICAgIHJlY29kZWRbaisrXSA9IDB4RkY7CisgICAgcmVjb2RlZFtqKytdID0gMHhEODsKKworICAgIG1lbWNweShyZWNvZGVkK2osICZzcDV4X2RhdGFfZHF0WzBdLCBzaXplb2Yoc3A1eF9kYXRhX2RxdCkpOworICAgIG1lbWNweShyZWNvZGVkK2orNSwgJnNwNXhfcXVhbnRfdGFibGVbcXNjYWxlICogMl0sIDY0KTsKKyAgICBtZW1jcHkocmVjb2RlZCtqKzcwLCAmc3A1eF9xdWFudF90YWJsZVsocXNjYWxlICogMikgKyAxXSwgNjQpOworICAgIGogKz0gc2l6ZW9mKHNwNXhfZGF0YV9kcXQpOworCisgICAgbWVtY3B5KHJlY29kZWQraiwgJnNwNXhfZGF0YV9kaHRbMF0sIHNpemVvZihzcDV4X2RhdGFfZGh0KSk7CisgICAgaiArPSBzaXplb2Yoc3A1eF9kYXRhX2RodCk7CisKKyAgICBtZW1jcHkocmVjb2RlZCtqLCAmc3A1eF9kYXRhX3NvZlswXSwgc2l6ZW9mKHNwNXhfZGF0YV9zb2YpKTsKKyAgICBBVl9XQjE2KHJlY29kZWQrais1LCBhdmN0eC0+Y29kZWRfaGVpZ2h0KTsKKyAgICBBVl9XQjE2KHJlY29kZWQrais3LCBhdmN0eC0+Y29kZWRfd2lkdGgpOworICAgIGogKz0gc2l6ZW9mKHNwNXhfZGF0YV9zb2YpOworCisgICAgbWVtY3B5KHJlY29kZWQraiwgJnNwNXhfZGF0YV9zb3NbMF0sIHNpemVvZihzcDV4X2RhdGFfc29zKSk7CisgICAgaiArPSBzaXplb2Yoc3A1eF9kYXRhX3Nvcyk7CisKKyAgICBpZihhdmN0eC0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX0FNVikKKyAgICAgICAgZm9yIChpID0gMjsgaSA8IGJ1Zl9zaXplLTIgJiYgaiA8IGJ1Zl9zaXplKzEwMjQtMjsgaSsrKQorICAgICAgICAgICAgcmVjb2RlZFtqKytdID0gYnVmW2ldOworICAgIGVsc2UKKyAgICBmb3IgKGkgPSAxNDsgaSA8IGJ1Zl9zaXplICYmIGogPCBidWZfc2l6ZSsxMDI0LTM7IGkrKykKKyAgICB7CisgICAgICAgIHJlY29kZWRbaisrXSA9IGJ1ZltpXTsKKyAgICAgICAgaWYgKGJ1ZltpXSA9PSAweGZmKQorICAgICAgICAgICAgcmVjb2RlZFtqKytdID0gMDsKKyAgICB9CisKKyAgICAvKiBFT0kgKi8KKyAgICByZWNvZGVkW2orK10gPSAweEZGOworICAgIHJlY29kZWRbaisrXSA9IDB4RDk7CisKKyAgICBhdl9pbml0X3BhY2tldCgmYXZwa3RfcmVjb2RlZCk7CisgICAgYXZwa3RfcmVjb2RlZC5kYXRhID0gcmVjb2RlZDsKKyAgICBhdnBrdF9yZWNvZGVkLnNpemUgPSBqOworICAgIGkgPSBmZl9tanBlZ19kZWNvZGVfZnJhbWUoYXZjdHgsIGRhdGEsIGdvdF9mcmFtZSwgJmF2cGt0X3JlY29kZWQpOworCisgICAgYXZfZnJlZShyZWNvZGVkKTsKKworICAgIHJldHVybiBpIDwgMCA/IGkgOiBhdnBrdC0+c2l6ZTsKK30KKworI2lmIENPTkZJR19TUDVYX0RFQ09ERVIKK0FWQ29kZWMgZmZfc3A1eF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzcDV4IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3VucGx1cyBKUEVHIChTUDVYKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TUDVYLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNSnBlZ0RlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX21qcGVnX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX21qcGVnX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gc3A1eF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAubWF4X2xvd3JlcyAgICAgPSAzLAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19BTVZfREVDT0RFUgorQVZDb2RlYyBmZl9hbXZfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYW12IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQU1WIFZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FNViwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTUpwZWdEZWNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9tanBlZ19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl9tanBlZ19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHNwNXhfZGVjb2RlX2ZyYW1lLAorICAgIC5tYXhfbG93cmVzICAgICA9IDMsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zcGFyYy9SRUFETUUgYi9mZm1wZWcvbGliYXZjb2RlYy9zcGFyYy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmMjM0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NwYXJjL1JFQURNRQpAQCAtMCwwICsxLDYgQEAKK1NQQVJDIG9wdGltaXphdGlvbnMgaGF2ZSBiZWVuIHJlbW92ZWQgaW4KK2NvbW1pdCBiNGRkNDI0ZDk2ZjA5ZjliYWZiODhlNDdmMzdkZjY1ZGM0NTI5MTQzCitUaGUgbGFzdCByZXZpc3Npb24gd2l0aCB0aGUgb3B0aW1pemF0aW9ucyBpcyBmYjFiNzBjMWVkNTA5NTFjNWZjMWEzMDljM2M0NDZiMmVhYWY1NjRiCisKK0lmIHlvdSB3YW50IHRvIG1haW50YWluIHRoZXNlIChvciBvdGhlcikgU1BBUkMgb3B0aW1pemF0aW9ucyBpbiBmZm1wZWcsIHRoZW4gcGxlYXNlCitjb250YWN0IGZmbXBlZy1kZXZlbEBmZm1wZWcub3JnCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zcnRkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3NydGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMGM5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zcnRkZWMuYwpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIFN1YlJpcCBzdWJ0aXRsZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYXNzLmgiCisKK3N0YXRpYyBpbnQgaHRtbF9jb2xvcl9wYXJzZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICB1aW50OF90IHJnYmFbNF07CisgICAgaWYgKGF2X3BhcnNlX2NvbG9yKHJnYmEsIHN0ciwgc3RyY3NwbihzdHIsICJcIiA+IiksIGF2Y3R4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gcmdiYVswXSB8IHJnYmFbMV0gPDwgOCB8IHJnYmFbMl0gPDwgMTY7Cit9CisKK2VudW0geworICAgIFBBUkFNX1VOS05PV04gPSAtMSwKKyAgICBQQVJBTV9TSVpFLAorICAgIFBBUkFNX0NPTE9SLAorICAgIFBBUkFNX0ZBQ0UsCisgICAgUEFSQU1fTlVNQkVSCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciB0YWdbMTI4XTsKKyAgICBjaGFyIHBhcmFtW1BBUkFNX05VTUJFUl1bMTI4XTsKK30gU3J0U3RhY2s7CisKK3N0YXRpYyB2b2lkIHJzdHJpcF9zcGFjZXNfYnVmKEFWQlByaW50ICpidWYpCit7CisgICAgd2hpbGUgKGJ1Zi0+bGVuID4gMCAmJiBidWYtPnN0cltidWYtPmxlbiAtIDFdID09ICcgJykKKyAgICAgICAgYnVmLT5zdHJbLS1idWYtPmxlbl0gPSAwOworfQorCitzdGF0aWMgdm9pZCBzcnRfdG9fYXNzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZCUHJpbnQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW4sIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikKK3sKKyAgICBjaGFyICpwYXJhbSwgYnVmZmVyWzEyOF0sIHRtcFsxMjhdOworICAgIGludCBsZW4sIHRhZ19jbG9zZSwgc3B0ciA9IDEsIGxpbmVfc3RhcnQgPSAxLCBhbiA9IDAsIGVuZCA9IDA7CisgICAgU3J0U3RhY2sgc3RhY2tbMTZdOworCisgICAgc3RhY2tbMF0udGFnWzBdID0gMDsKKyAgICBzdHJjcHkoc3RhY2tbMF0ucGFyYW1bUEFSQU1fU0laRV0sICAie1xcZnN9Iik7CisgICAgc3RyY3B5KHN0YWNrWzBdLnBhcmFtW1BBUkFNX0NPTE9SXSwgIntcXGN9Iik7CisgICAgc3RyY3B5KHN0YWNrWzBdLnBhcmFtW1BBUkFNX0ZBQ0VdLCAgIntcXGZufSIpOworCisgICAgaWYgKHgxID49IDAgJiYgeTEgPj0gMCkgeworICAgICAgICBpZiAoeDIgPj0gMCAmJiB5MiA+PSAwICYmICh4MiAhPSB4MSB8fCB5MiAhPSB5MSkpCisgICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIntcXGFuMX17XFxtb3ZlKCVkLCVkLCVkLCVkKX0iLCB4MSwgeTEsIHgyLCB5Mik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2X2JwcmludGYoZHN0LCAie1xcYW4xfXtcXHBvcyglZCwlZCl9IiwgeDEsIHkxKTsKKyAgICB9CisKKyAgICBmb3IgKDsgIWVuZCAmJiAqaW47IGluKyspIHsKKyAgICAgICAgc3dpdGNoICgqaW4pIHsKKyAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgIGlmIChsaW5lX3N0YXJ0KSB7CisgICAgICAgICAgICAgICAgZW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJzdHJpcF9zcGFjZXNfYnVmKGRzdCk7CisgICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIlxcTiIpOworICAgICAgICAgICAgbGluZV9zdGFydCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICBpZiAoIWxpbmVfc3RhcnQpCisgICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdCwgKmluLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd7JzogICAgLyogc2tpcCBhbGwge1x4eHh9IHN1YnN0cmluZ3MgZXhjZXB0IGZvciB7XGFuJWR9CisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxsIG1pY3JvZHZkIGxpa2Ugc3R5bGVzIHN1Y2ggYXMge1k6eHh4fSAqLworICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgIGFuICs9IHNzY2FuZihpbiwgIntcXGFuJSoxdX0lbiIsICZsZW4pID49IDAgJiYgbGVuID4gMDsKKyAgICAgICAgICAgIGlmICgoYW4gIT0gMSAmJiAobGVuID0gMCwgc3NjYW5mKGluLCAie1xcJSpbXn1dfSVuIiwgJmxlbikgPj0gMCAmJiBsZW4gPiAwKSkgfHwKKyAgICAgICAgICAgICAgICAobGVuID0gMCwgc3NjYW5mKGluLCAieyUqMVtDY0Zmb1BTc1l5XTolKltefV19JW4iLCAmbGVuKSA+PSAwICYmIGxlbiA+IDApKSB7CisgICAgICAgICAgICAgICAgaW4gKz0gbGVuIC0gMTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICppbiwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgICB0YWdfY2xvc2UgPSBpblsxXSA9PSAnLyc7CisgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgaWYgKHNzY2FuZihpbit0YWdfY2xvc2UrMSwgIiUxMjdbXj5dPiVuIiwgYnVmZmVyLCAmbGVuKSA+PSAxICYmIGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtID0gc3RyY2hyKGJ1ZmZlciwgJyAnKSkpCisgICAgICAgICAgICAgICAgICAgICpwYXJhbSsrID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoKCF0YWdfY2xvc2UgJiYgc3B0ciA8IEZGX0FSUkFZX0VMRU1TKHN0YWNrKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKCB0YWdfY2xvc2UgJiYgc3B0ciA+IDAgJiYgIXN0cmNtcChzdGFja1tzcHRyLTFdLnRhZywgYnVmZmVyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGksIGosIHVua25vd24gPSAwOworICAgICAgICAgICAgICAgICAgICBpbiArPSBsZW4gKyB0YWdfY2xvc2U7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGFnX2Nsb3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHN0YWNrK3NwdHIsIDAsIHNpemVvZigqc3RhY2spKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoYnVmZmVyLCAiZm9udCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnX2Nsb3NlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPVBBUkFNX05VTUJFUi0xOyBpPj0wOyBpLS0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tzcHRyLTFdLnBhcmFtW2ldWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPXNwdHItMjsgaj49MDsgai0tKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tqXS5wYXJhbVtpXVswXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIiVzIiwgc3RhY2tbal0ucGFyYW1baV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAocGFyYW0sICJzaXplPSIsIDUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmb250X3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSArPSA1ICsgKHBhcmFtWzVdID09ICciJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKHBhcmFtLCAiJXUiLCAmZm9udF9zaXplKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoc3RhY2tbc3B0cl0ucGFyYW1bUEFSQU1fU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RhY2tbMF0ucGFyYW1bUEFSQU1fU0laRV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIntcXGZzJXV9IiwgZm9udF9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChwYXJhbSwgImNvbG9yPSIsIDYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSArPSA2ICsgKHBhcmFtWzZdID09ICciJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihzdGFja1tzcHRyXS5wYXJhbVtQQVJBTV9DT0xPUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdGFja1swXS5wYXJhbVtQQVJBTV9DT0xPUl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie1xcYyZIJVgmfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxfY29sb3JfcGFyc2UoYXZjdHgsIHBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAocGFyYW0sICJmYWNlPSIsIDUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSArPSA1ICsgKHBhcmFtWzVdID09ICciJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdHJjc3BuKHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVstMV0gPT0gJyInID8gIlwiIiA6IiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkodG1wLCBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oc2l6ZW9mKHRtcCksIGxlbisxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSArPSBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihzdGFja1tzcHRyXS5wYXJhbVtQQVJBTV9GQUNFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdGFja1swXS5wYXJhbVtQQVJBTV9GQUNFXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie1xcZm4lc30iLCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGFyYW0gPSBzdHJjaHIocGFyYW0sICcgJykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8UEFSQU1fTlVNQkVSOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tzcHRyXS5wYXJhbVtpXVswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoZHN0LCAiJXMiLCBzdGFja1tzcHRyXS5wYXJhbVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJ1ZmZlclsxXSAmJiBzdHJzcG4oYnVmZmVyLCAiYmlzdSIpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoZHN0LCAie1xcJWMlZH0iLCBidWZmZXJbMF0sICF0YWdfY2xvc2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiPC8lcz4iLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWdfY2xvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwdHItLTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1bmtub3duICYmICFzdHJzdHIoaW4sIHRtcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluIC09IGxlbiArIHRhZ19jbG9zZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICppbiwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfc3RybGNweShzdGFja1tzcHRyKytdLnRhZywgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RhY2tbMF0udGFnKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICppbiwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKmluICE9ICcgJyAmJiAqaW4gIT0gJ1xyJyAmJiAqaW4gIT0gJ1xuJykKKyAgICAgICAgICAgIGxpbmVfc3RhcnQgPSAwOworICAgIH0KKworICAgIHdoaWxlIChkc3QtPmxlbiA+PSAyICYmICFzdHJuY21wKCZkc3QtPnN0cltkc3QtPmxlbiAtIDJdLCAiXFxOIiwgMikpCisgICAgICAgIGRzdC0+bGVuIC09IDI7CisgICAgZHN0LT5zdHJbZHN0LT5sZW5dID0gMDsKKyAgICByc3RyaXBfc3BhY2VzX2J1Zihkc3QpOworfQorCitzdGF0aWMgaW50IHNydF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X3N1Yl9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVlN1YnRpdGxlICpzdWIgPSBkYXRhOworICAgIEFWQlByaW50IGJ1ZmZlcjsKKyAgICBpbnQgdHNfc3RhcnQsIHRzX2VuZCwgeDEgPSAtMSwgeTEgPSAtMSwgeDIgPSAtMSwgeTIgPSAtMTsKKyAgICBpbnQgc2l6ZSwgcmV0OworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfU1VCVElUTEVfUE9TSVRJT04sICZzaXplKTsKKworICAgIGlmIChwICYmIHNpemUgPT0gMTYpIHsKKyAgICAgICAgeDEgPSBBVl9STDMyKHAgICAgICk7CisgICAgICAgIHkxID0gQVZfUkwzMihwICsgIDQpOworICAgICAgICB4MiA9IEFWX1JMMzIocCArICA4KTsKKyAgICAgICAgeTIgPSBBVl9STDMyKHAgKyAxMik7CisgICAgfQorCisgICAgaWYgKGF2cGt0LT5zaXplIDw9IDApCisgICAgICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKKworICAgIGF2X2JwcmludF9pbml0KCZidWZmZXIsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisKKyAgICAgICAgLy8gVE9ETzogcmVpbmRlbnQKKyAgICAgICAgICAgIC8vIERvIGZpbmFsIGRpdmlkZS1ieS0xMCBvdXRzaWRlIHJlc2NhbGUgdG8gZm9yY2Ugcm91bmRpbmcgZG93bi4KKyAgICAgICAgICAgIHRzX3N0YXJ0ID0gYXZfcmVzY2FsZV9xKGF2cGt0LT5wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsMTAwfSk7CisgICAgICAgICAgICB0c19lbmQgICA9IGF2X3Jlc2NhbGVfcShhdnBrdC0+cHRzICsgYXZwa3QtPmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLDEwMH0pOworCisgICAgc3J0X3RvX2FzcyhhdmN0eCwgJmJ1ZmZlciwgYXZwa3QtPmRhdGEsIHgxLCB5MSwgeDIsIHkyKTsKKyAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3RfYnByaW50KHN1YiwgJmJ1ZmZlciwgdHNfc3RhcnQsIHRzX2VuZC10c19zdGFydCk7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWZmZXIsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9zdWJfcHRyID0gc3ViLT5udW1fcmVjdHMgPiAwOworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworI2lmIENPTkZJR19TUlRfREVDT0RFUgorLyogZGVwcmVjYXRlZCBkZWNvZGVyICovCitBVkNvZGVjIGZmX3NydF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAic3J0IiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlN1YlJpcCBzdWJ0aXRsZSIpLAorICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NVQlJJUCwKKyAgICAuaW5pdCAgICAgICAgID0gZmZfYXNzX3N1YnRpdGxlX2hlYWRlcl9kZWZhdWx0LAorICAgIC5kZWNvZGUgICAgICAgPSBzcnRfZGVjb2RlX2ZyYW1lLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1NVQlJJUF9ERUNPREVSCitBVkNvZGVjIGZmX3N1YnJpcF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAic3VicmlwIiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlN1YlJpcCBzdWJ0aXRsZSIpLAorICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NVQlJJUCwKKyAgICAuaW5pdCAgICAgICAgID0gZmZfYXNzX3N1YnRpdGxlX2hlYWRlcl9kZWZhdWx0LAorICAgIC5kZWNvZGUgICAgICAgPSBzcnRfZGVjb2RlX2ZyYW1lLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc3J0ZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9zcnRlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjg3OTcwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3J0ZW5jLmMKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiBTdWJSaXAgc3VidGl0bGUgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEwICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImFzc19zcGxpdC5oIgorI2luY2x1ZGUgImFzcy5oIgorCisKKyNkZWZpbmUgU1JUX1NUQUNLX1NJWkUgNjQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBU1NTcGxpdENvbnRleHQgKmFzc19jdHg7CisgICAgQVZCUHJpbnQgYnVmZmVyOworICAgIGNoYXIgc3RhY2tbU1JUX1NUQUNLX1NJWkVdOworICAgIGludCBzdGFja19wdHI7CisgICAgaW50IGFsaWdubWVudF9hcHBsaWVkOworfSBTUlRDb250ZXh0OworCisKKyNpZmRlZiBfX0dOVUNfXworX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDMpKSkKKyNlbmRpZgorc3RhdGljIHZvaWQgc3J0X3ByaW50KFNSVENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnN0ciwgLi4uKQoreworICAgIHZhX2xpc3QgdmFyZ3M7CisgICAgdmFfc3RhcnQodmFyZ3MsIHN0cik7CisgICAgYXZfdmJwcmludGYoJnMtPmJ1ZmZlciwgc3RyLCB2YXJncyk7CisgICAgdmFfZW5kKHZhcmdzKTsKK30KKworc3RhdGljIGludCBzcnRfc3RhY2tfcHVzaChTUlRDb250ZXh0ICpzLCBjb25zdCBjaGFyIGMpCit7CisgICAgaWYgKHMtPnN0YWNrX3B0ciA+PSBTUlRfU1RBQ0tfU0laRSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHMtPnN0YWNrW3MtPnN0YWNrX3B0cisrXSA9IGM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyIHNydF9zdGFja19wb3AoU1JUQ29udGV4dCAqcykKK3sKKyAgICBpZiAocy0+c3RhY2tfcHRyIDw9IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzLT5zdGFja1stLXMtPnN0YWNrX3B0cl07Cit9CisKK3N0YXRpYyBpbnQgc3J0X3N0YWNrX2ZpbmQoU1JUQ29udGV4dCAqcywgY29uc3QgY2hhciBjKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IHMtPnN0YWNrX3B0ci0xOyBpID49IDA7IGktLSkKKyAgICAgICAgaWYgKHMtPnN0YWNrW2ldID09IGMpCisgICAgICAgICAgICBicmVhazsKKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgc3J0X2Nsb3NlX3RhZyhTUlRDb250ZXh0ICpzLCBjaGFyIHRhZykKK3sKKyAgICBzcnRfcHJpbnQocywgIjwvJWMlcz4iLCB0YWcsIHRhZyA9PSAnZicgPyAib250IiA6ICIiKTsKK30KKworc3RhdGljIHZvaWQgc3J0X3N0YWNrX3B1c2hfcG9wKFNSVENvbnRleHQgKnMsIGNvbnN0IGNoYXIgYywgaW50IGNsb3NlKQoreworICAgIGlmIChjbG9zZSkgeworICAgICAgICBpbnQgaSA9IGMgPyBzcnRfc3RhY2tfZmluZChzLCBjKSA6IDA7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgd2hpbGUgKHMtPnN0YWNrX3B0ciAhPSBpKQorICAgICAgICAgICAgc3J0X2Nsb3NlX3RhZyhzLCBzcnRfc3RhY2tfcG9wKHMpKTsKKyAgICB9IGVsc2UgaWYgKHNydF9zdGFja19wdXNoKHMsIGMpIDwgMCkKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ0YWcgc3RhY2sgb3ZlcmZsb3dcbiIpOworfQorCitzdGF0aWMgdm9pZCBzcnRfc3R5bGVfYXBwbHkoU1JUQ29udGV4dCAqcywgY29uc3QgY2hhciAqc3R5bGUpCit7CisgICAgQVNTU3R5bGUgKnN0ID0gZmZfYXNzX3N0eWxlX2dldChzLT5hc3NfY3R4LCBzdHlsZSk7CisgICAgaWYgKHN0KSB7CisgICAgICAgIGludCBjID0gc3QtPnByaW1hcnlfY29sb3IgJiAweEZGRkZGRjsKKyAgICAgICAgaWYgKHN0LT5mb250X25hbWUgJiYgc3RyY21wKHN0LT5mb250X25hbWUsIEFTU19ERUZBVUxUX0ZPTlQpIHx8CisgICAgICAgICAgICBzdC0+Zm9udF9zaXplICE9IEFTU19ERUZBVUxUX0ZPTlRfU0laRSB8fAorICAgICAgICAgICAgYyAhPSBBU1NfREVGQVVMVF9DT0xPUikgeworICAgICAgICAgICAgc3J0X3ByaW50KHMsICI8Zm9udCIpOworICAgICAgICAgICAgaWYgKHN0LT5mb250X25hbWUgJiYgc3RyY21wKHN0LT5mb250X25hbWUsIEFTU19ERUZBVUxUX0ZPTlQpKQorICAgICAgICAgICAgICAgIHNydF9wcmludChzLCAiIGZhY2U9XCIlc1wiIiwgc3QtPmZvbnRfbmFtZSk7CisgICAgICAgICAgICBpZiAoc3QtPmZvbnRfc2l6ZSAhPSBBU1NfREVGQVVMVF9GT05UX1NJWkUpCisgICAgICAgICAgICAgICAgc3J0X3ByaW50KHMsICIgc2l6ZT1cIiVkXCIiLCBzdC0+Zm9udF9zaXplKTsKKyAgICAgICAgICAgIGlmIChjICE9IEFTU19ERUZBVUxUX0NPTE9SKQorICAgICAgICAgICAgICAgIHNydF9wcmludChzLCAiIGNvbG9yPVwiIyUwNnhcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjICYgMHhGRjAwMDApID4+IDE2IHwgYyAmIDB4RkYwMCB8IChjICYgMHhGRikgPDwgMTYpOworICAgICAgICAgICAgc3J0X3ByaW50KHMsICI+Iik7CisgICAgICAgICAgICBzcnRfc3RhY2tfcHVzaChzLCAnZicpOworICAgICAgICB9CisgICAgICAgIGlmIChzdC0+Ym9sZCAhPSBBU1NfREVGQVVMVF9CT0xEKSB7CisgICAgICAgICAgICBzcnRfcHJpbnQocywgIjxiPiIpOworICAgICAgICAgICAgc3J0X3N0YWNrX3B1c2gocywgJ2InKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3QtPml0YWxpYyAhPSBBU1NfREVGQVVMVF9JVEFMSUMpIHsKKyAgICAgICAgICAgIHNydF9wcmludChzLCAiPGk+Iik7CisgICAgICAgICAgICBzcnRfc3RhY2tfcHVzaChzLCAnaScpOworICAgICAgICB9CisgICAgICAgIGlmIChzdC0+dW5kZXJsaW5lICE9IEFTU19ERUZBVUxUX1VOREVSTElORSkgeworICAgICAgICAgICAgc3J0X3ByaW50KHMsICI8dT4iKTsKKyAgICAgICAgICAgIHNydF9zdGFja19wdXNoKHMsICd1Jyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0LT5hbGlnbm1lbnQgIT0gQVNTX0RFRkFVTFRfQUxJR05NRU5UKSB7CisgICAgICAgICAgICBzcnRfcHJpbnQocywgIntcXGFuJWR9Iiwgc3QtPmFsaWdubWVudCk7CisgICAgICAgICAgICBzLT5hbGlnbm1lbnRfYXBwbGllZCA9IDE7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IHNydF9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU1JUQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBzLT5hc3NfY3R4ID0gZmZfYXNzX3NwbGl0KGF2Y3R4LT5zdWJ0aXRsZV9oZWFkZXIpOworICAgIGF2X2JwcmludF9pbml0KCZzLT5idWZmZXIsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgcmV0dXJuIHMtPmFzc19jdHggPyAwIDogQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworc3RhdGljIHZvaWQgc3J0X3RleHRfY2Iodm9pZCAqcHJpdiwgY29uc3QgY2hhciAqdGV4dCwgaW50IGxlbikKK3sKKyAgICBTUlRDb250ZXh0ICpzID0gcHJpdjsKKyAgICBhdl9icHJpbnRfYXBwZW5kX2RhdGEoJnMtPmJ1ZmZlciwgdGV4dCwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgc3J0X25ld19saW5lX2NiKHZvaWQgKnByaXYsIGludCBmb3JjZWQpCit7CisgICAgc3J0X3ByaW50KHByaXYsICJcclxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHNydF9zdHlsZV9jYih2b2lkICpwcml2LCBjaGFyIHN0eWxlLCBpbnQgY2xvc2UpCit7CisgICAgc3J0X3N0YWNrX3B1c2hfcG9wKHByaXYsIHN0eWxlLCBjbG9zZSk7CisgICAgaWYgKCFjbG9zZSkKKyAgICAgICAgc3J0X3ByaW50KHByaXYsICI8JWM+Iiwgc3R5bGUpOworfQorCitzdGF0aWMgdm9pZCBzcnRfY29sb3JfY2Iodm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGNvbG9yLCB1bnNpZ25lZCBpbnQgY29sb3JfaWQpCit7CisgICAgaWYgKGNvbG9yX2lkID4gMSkKKyAgICAgICAgcmV0dXJuOworICAgIHNydF9zdGFja19wdXNoX3BvcChwcml2LCAnZicsIGNvbG9yID09IDB4RkZGRkZGRkYpOworICAgIGlmIChjb2xvciAhPSAweEZGRkZGRkZGKQorICAgICAgICBzcnRfcHJpbnQocHJpdiwgIjxmb250IGNvbG9yPVwiIyUwNnhcIj4iLAorICAgICAgICAgICAgICAoY29sb3IgJiAweEZGMDAwMCkgPj4gMTYgfCBjb2xvciAmIDB4RkYwMCB8IChjb2xvciAmIDB4RkYpIDw8IDE2KTsKK30KKworc3RhdGljIHZvaWQgc3J0X2ZvbnRfbmFtZV9jYih2b2lkICpwcml2LCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIHNydF9zdGFja19wdXNoX3BvcChwcml2LCAnZicsICFuYW1lKTsKKyAgICBpZiAobmFtZSkKKyAgICAgICAgc3J0X3ByaW50KHByaXYsICI8Zm9udCBmYWNlPVwiJXNcIj4iLCBuYW1lKTsKK30KKworc3RhdGljIHZvaWQgc3J0X2ZvbnRfc2l6ZV9jYih2b2lkICpwcml2LCBpbnQgc2l6ZSkKK3sKKyAgICBzcnRfc3RhY2tfcHVzaF9wb3AocHJpdiwgJ2YnLCBzaXplIDwgMCk7CisgICAgaWYgKHNpemUgPj0gMCkKKyAgICAgICAgc3J0X3ByaW50KHByaXYsICI8Zm9udCBzaXplPVwiJWRcIj4iLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgc3J0X2FsaWdubWVudF9jYih2b2lkICpwcml2LCBpbnQgYWxpZ25tZW50KQoreworICAgIFNSVENvbnRleHQgKnMgPSBwcml2OworICAgIGlmICghcy0+YWxpZ25tZW50X2FwcGxpZWQgJiYgYWxpZ25tZW50ID49IDApIHsKKyAgICAgICAgc3J0X3ByaW50KHMsICJ7XFxhbiVkfSIsIGFsaWdubWVudCk7CisgICAgICAgIHMtPmFsaWdubWVudF9hcHBsaWVkID0gMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNydF9jYW5jZWxfb3ZlcnJpZGVzX2NiKHZvaWQgKnByaXYsIGNvbnN0IGNoYXIgKnN0eWxlKQoreworICAgIHNydF9zdGFja19wdXNoX3BvcChwcml2LCAwLCAxKTsKKyAgICBzcnRfc3R5bGVfYXBwbHkocHJpdiwgc3R5bGUpOworfQorCitzdGF0aWMgdm9pZCBzcnRfbW92ZV9jYih2b2lkICpwcml2LCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdDEsIGludCB0MikKK3sKKyAgICAvLyBUT0RPOiBhZGQgYSBBVl9QS1RfREFUQV9TVUJUSVRMRV9QT1NJVElPTiBzaWRlIGRhdGEgd2hlbiBhIG5ldyBzdWJ0aXRsZXMKKyAgICAvLyBlbmNvZGluZyBBUEkgcGFzc2luZyB0aGUgQVZQYWNrZXQgaXMgYXZhaWxhYmxlLgorfQorCitzdGF0aWMgdm9pZCBzcnRfZW5kX2NiKHZvaWQgKnByaXYpCit7CisgICAgc3J0X3N0YWNrX3B1c2hfcG9wKHByaXYsIDAsIDEpOworfQorCitzdGF0aWMgY29uc3QgQVNTQ29kZXNDYWxsYmFja3Mgc3J0X2NhbGxiYWNrcyA9IHsKKyAgICAudGV4dCAgICAgICAgICAgICA9IHNydF90ZXh0X2NiLAorICAgIC5uZXdfbGluZSAgICAgICAgID0gc3J0X25ld19saW5lX2NiLAorICAgIC5zdHlsZSAgICAgICAgICAgID0gc3J0X3N0eWxlX2NiLAorICAgIC5jb2xvciAgICAgICAgICAgID0gc3J0X2NvbG9yX2NiLAorICAgIC5mb250X25hbWUgICAgICAgID0gc3J0X2ZvbnRfbmFtZV9jYiwKKyAgICAuZm9udF9zaXplICAgICAgICA9IHNydF9mb250X3NpemVfY2IsCisgICAgLmFsaWdubWVudCAgICAgICAgPSBzcnRfYWxpZ25tZW50X2NiLAorICAgIC5jYW5jZWxfb3ZlcnJpZGVzID0gc3J0X2NhbmNlbF9vdmVycmlkZXNfY2IsCisgICAgLm1vdmUgICAgICAgICAgICAgPSBzcnRfbW92ZV9jYiwKKyAgICAuZW5kICAgICAgICAgICAgICA9IHNydF9lbmRfY2IsCit9OworCitzdGF0aWMgaW50IHNydF9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1ZnNpemUsIGNvbnN0IEFWU3VidGl0bGUgKnN1YikKK3sKKyAgICBTUlRDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBU1NEaWFsb2cgKmRpYWxvZzsKKyAgICBpbnQgaSwgbnVtOworCisgICAgYXZfYnByaW50X2NsZWFyKCZzLT5idWZmZXIpOworCisgICAgZm9yIChpPTA7IGk8c3ViLT5udW1fcmVjdHM7IGkrKykgeworCisgICAgICAgIGlmIChzdWItPnJlY3RzW2ldLT50eXBlICE9IFNVQlRJVExFX0FTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IFNVQlRJVExFX0FTUyB0eXBlIHN1cHBvcnRlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgfQorCisgICAgICAgIGRpYWxvZyA9IGZmX2Fzc19zcGxpdF9kaWFsb2cocy0+YXNzX2N0eCwgc3ViLT5yZWN0c1tpXS0+YXNzLCAwLCAmbnVtKTsKKyAgICAgICAgZm9yICg7IGRpYWxvZyAmJiBudW0tLTsgZGlhbG9nKyspIHsKKyAgICAgICAgICAgIHMtPmFsaWdubWVudF9hcHBsaWVkID0gMDsKKyAgICAgICAgICAgIHNydF9zdHlsZV9hcHBseShzLCBkaWFsb2ctPnN0eWxlKTsKKyAgICAgICAgICAgIGZmX2Fzc19zcGxpdF9vdmVycmlkZV9jb2Rlcygmc3J0X2NhbGxiYWNrcywgcywgZGlhbG9nLT50ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKCZzLT5idWZmZXIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmICghcy0+YnVmZmVyLmxlbikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocy0+YnVmZmVyLmxlbiA+IGJ1ZnNpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCdWZmZXIgdG9vIHNtYWxsIGZvciBBU1MgZXZlbnQuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZW1jcHkoYnVmLCBzLT5idWZmZXIuc3RyLCBzLT5idWZmZXIubGVuKTsKKworICAgIHJldHVybiBzLT5idWZmZXIubGVuOworfQorCitzdGF0aWMgaW50IHNydF9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNSVENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGZmX2Fzc19zcGxpdF9mcmVlKHMtPmFzc19jdHgpOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmcy0+YnVmZmVyLCBOVUxMKTsKKyAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19TUlRfRU5DT0RFUgorLyogZGVwcmVjYXRlZCBlbmNvZGVyICovCitBVkNvZGVjIGZmX3NydF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzcnQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTdWJSaXAgc3VidGl0bGUiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU1VCUklQLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTUlRDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBzcnRfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZV9zdWIgICAgID0gc3J0X2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBzcnRfZW5jb2RlX2Nsb3NlLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1NVQlJJUF9FTkNPREVSCitBVkNvZGVjIGZmX3N1YnJpcF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzdWJyaXAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTdWJSaXAgc3VidGl0bGUiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU1VCUklQLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTUlRDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBzcnRfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZV9zdWIgICAgID0gc3J0X2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBzcnRfZW5jb2RlX2Nsb3NlLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc3RhcnRjb2RlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9zdGFydGNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDBiYmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3RhcnRjb2RlLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDEwIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFjY2VsZXJhdGVkIHN0YXJ0IGNvZGUgc2VhcmNoIGZ1bmN0aW9uIGZvciBzdGFydCBjb2RlcyBjb21tb24gdG8KKyAqIE1QRUctMS8yLzQgdmlkZW8sIFZDLTEsIEguMjY0LzUKKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaW5jbHVkZSAic3RhcnRjb2RlLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKK2ludCBmZl9zdGFydGNvZGVfZmluZF9jYW5kaWRhdGVfYyhjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIGludCBpID0gMDsKKyNpZiBIQVZFX0ZBU1RfVU5BTElHTkVECisgICAgLyogd2UgY2hlY2sgaSA8IHNpemUgaW5zdGVhZCBvZiBpICsgMyAvIDcgYmVjYXVzZSBpdCBpcworICAgICAqIHNpbXBsZXIgYW5kIHRoZXJlIG11c3QgYmUgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRQorICAgICAqIGJ5dGVzIGF0IHRoZSBlbmQuCisgICAgICovCisjaWYgSEFWRV9GQVNUXzY0QklUCisgICAgd2hpbGUgKGkgPCBzaXplICYmCisgICAgICAgICAgICAhKCh+Kihjb25zdCB1aW50NjRfdCAqKShidWYgKyBpKSAmCisgICAgICAgICAgICAgICAgICAgICgqKGNvbnN0IHVpbnQ2NF90ICopKGJ1ZiArIGkpIC0gMHgwMTAxMDEwMTAxMDEwMTAxVUxMKSkgJgorICAgICAgICAgICAgICAgICAgICAweDgwODA4MDgwODA4MDgwODBVTEwpKQorICAgICAgICBpICs9IDg7CisjZWxzZQorICAgIHdoaWxlIChpIDwgc2l6ZSAmJgorICAgICAgICAgICAgISgofiooY29uc3QgdWludDMyX3QgKikoYnVmICsgaSkgJgorICAgICAgICAgICAgICAgICAgICAoKihjb25zdCB1aW50MzJfdCAqKShidWYgKyBpKSAtIDB4MDEwMTAxMDFVKSkgJgorICAgICAgICAgICAgICAgICAgICAweDgwODA4MDgwVSkpCisgICAgICAgIGkgKz0gNDsKKyNlbmRpZgorI2VuZGlmCisgICAgZm9yICg7IGkgPCBzaXplOyBpKyspCisgICAgICAgIGlmICghYnVmW2ldKQorICAgICAgICAgICAgYnJlYWs7CisgICAgcmV0dXJuIGk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zdGFydGNvZGUuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3N0YXJ0Y29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYTAyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zdGFydGNvZGUuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFjY2VsZXJhdGVkIHN0YXJ0IGNvZGUgc2VhcmNoIGZ1bmN0aW9uIGZvciBzdGFydCBjb2RlcyBjb21tb24gdG8KKyAqIE1QRUctMS8yLzQgdmlkZW8sIFZDLTEsIEguMjY0LzUKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfU1RBUlRDT0RFX0gKKyNkZWZpbmUgQVZDT0RFQ19TVEFSVENPREVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2ludCBmZl9zdGFydGNvZGVfZmluZF9jYW5kaWRhdGVfYyhjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfU1RBUlRDT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3N1YnZpZXdlcmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3Vidmlld2VyZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwODgyOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3N1YnZpZXdlcmRlYy5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQ2zDqW1lbnQgQsWTc2NoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFN1YlZpZXdlciBzdWJ0aXRsZSBkZWNvZGVyCisgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N1YlZpZXdlcgorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYXNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorCitzdGF0aWMgaW50IHN1YnZpZXdlcl9ldmVudF90b19hc3MoQVZCUHJpbnQgKmJ1ZiwgY29uc3QgY2hhciAqcCkKK3sKKyAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgaWYgKCFzdHJuY21wKHAsICJbYnJdIiwgNCkpIHsKKyAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiXFxOIik7CisgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocFswXSA9PSAnXG4nICYmIHBbMV0pCisgICAgICAgICAgICAgICAgYXZfYnByaW50ZihidWYsICJcXE4iKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpwICE9ICdcbicgJiYgKnAgIT0gJ1xyJykKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnVmLCAqcCwgMSk7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJ2aWV3ZXJfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9zdWJfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKKyAgICBjb25zdCBjaGFyICpwdHIgPSBhdnBrdC0+ZGF0YTsKKyAgICBBVkJQcmludCBidWY7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgIC8vIG5vdGU6IG5vIG5lZWQgdG8gcmVzY2FsZSBwdHMgJiBkdXJhdGlvbiBzaW5jZSB0aGV5IGFyZSBpbiB0aGUgc2FtZQorICAgIC8vIHRpbWViYXNlIGFzIEFTUyAoMS8xMDApCisgICAgaWYgKHB0ciAmJiBhdnBrdC0+c2l6ZSA+IDAgJiYgIXN1YnZpZXdlcl9ldmVudF90b19hc3MoJmJ1ZiwgcHRyKSkKKyAgICAgICAgcmV0ID0gZmZfYXNzX2FkZF9yZWN0X2JwcmludChzdWIsICZidWYsIGF2cGt0LT5wdHMsIGF2cGt0LT5kdXJhdGlvbik7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgICpnb3Rfc3ViX3B0ciA9IHN1Yi0+bnVtX3JlY3RzID4gMDsKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfc3Vidmlld2VyX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInN1YnZpZXdlciIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlN1YlZpZXdlciBzdWJ0aXRsZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TVUJWSUVXRVIsCisgICAgLmRlY29kZSAgICAgICAgID0gc3Vidmlld2VyX2RlY29kZV9mcmFtZSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9hc3Nfc3VidGl0bGVfaGVhZGVyX2RlZmF1bHQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc3VucmFzdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3VucmFzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTE4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zdW5yYXN0LmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBTdW4gUmFzdGVyZmlsZSAoLnN1bi8ucmFzL2ltezEsOCwyNH0vLnN1bnJhcykgaW1hZ2UgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IEl2byB2YW4gUG9vcnRlbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdW5yYXN0LmgiCisKK3N0YXRpYyBpbnQgc3VucmFzdF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiAgICAgICA9IGF2cGt0LT5kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgICA9IGF2cGt0LT5kYXRhICsgYXZwa3QtPnNpemU7CisgICAgQVZGcmFtZSAqIGNvbnN0IHAgICAgICAgID0gZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgdywgaCwgZGVwdGgsIHR5cGUsIG1hcHR5cGUsIG1hcGxlbmd0aCwgc3RyaWRlLCB4LCB5LCBsZW4sIGFsZW47CisgICAgdWludDhfdCAqcHRyLCAqcHRyMiA9IE5VTEw7CisgICAgY29uc3QgdWludDhfdCAqYnVmc3RhcnQgPSBidWY7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8IDMyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChBVl9SQjMyKGJ1ZikgIT0gUkFTX01BR0lDKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidGhpcyBpcyBub3Qgc3VucmFzIGVuY29kZWQgZGF0YVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHcgICAgICAgICA9IEFWX1JCMzIoYnVmICsgNCk7CisgICAgaCAgICAgICAgID0gQVZfUkIzMihidWYgKyA4KTsKKyAgICBkZXB0aCAgICAgPSBBVl9SQjMyKGJ1ZiArIDEyKTsKKyAgICB0eXBlICAgICAgPSBBVl9SQjMyKGJ1ZiArIDIwKTsKKyAgICBtYXB0eXBlICAgPSBBVl9SQjMyKGJ1ZiArIDI0KTsKKyAgICBtYXBsZW5ndGggPSBBVl9SQjMyKGJ1ZiArIDI4KTsKKyAgICBidWYgICAgICArPSAzMjsKKworICAgIGlmICh0eXBlID09IFJUX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJUSUZGL0lGRi9FWFBFUklNRU5UQUwgKGNvbXByZXNzaW9uKSB0eXBlIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgaWYgKHR5cGUgPiBSVF9GT1JNQVRfSUZGKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCAoY29tcHJlc3Npb24pIHR5cGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKG1hcHR5cGUgPT0gUk1UX1JBVykgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJVbmtub3duIGNvbG9ybWFwIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAobWFwdHlwZSA+IFJNVF9SQVcpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGNvbG9ybWFwIHR5cGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAodHlwZSA9PSBSVF9GT1JNQVRfVElGRiB8fCB0eXBlID09IFJUX0ZPUk1BVF9JRkYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCAoY29tcHJlc3Npb24pIHR5cGVcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc3dpdGNoIChkZXB0aCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IG1hcGxlbmd0aCA/IEFWX1BJWF9GTVRfUEFMOCA6IEFWX1BJWF9GTVRfTU9OT1dISVRFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gbWFwbGVuZ3RoID8gQVZfUElYX0ZNVF9QQUw4IDogQVZfUElYX0ZNVF9OT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gbWFwbGVuZ3RoID8gQVZfUElYX0ZNVF9QQUw4IDogQVZfUElYX0ZNVF9HUkFZODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSAodHlwZSA9PSBSVF9GT1JNQVRfUkdCKSA/IEFWX1BJWF9GTVRfUkdCMjQgOiBBVl9QSVhfRk1UX0JHUjI0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9ICh0eXBlID09IFJUX0ZPUk1BVF9SR0IpID8gQVZfUElYX0ZNVF8wUkdCIDogQVZfUElYX0ZNVF8wQkdSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgZGVwdGhcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHcsIGgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICBpZiAoYnVmX2VuZCAtIGJ1ZiA8IG1hcGxlbmd0aCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoZGVwdGggPiA4ICYmIG1hcGxlbmd0aCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAidXNlbGVzcyBjb2xvcm1hcCBmb3VuZCBvciBmaWxlIGlzIGNvcnJ1cHRlZCwgdHJ5aW5nIHRvIHJlY292ZXJcbiIpOworCisgICAgfSBlbHNlIGlmIChtYXBsZW5ndGgpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGxlbiA9IG1hcGxlbmd0aCAvIDM7CisKKyAgICAgICAgaWYgKG1hcGxlbmd0aCAlIDMgfHwgbWFwbGVuZ3RoID4gNzY4KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiaW52YWxpZCBjb2xvcm1hcCBsZW5ndGhcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBwdHIgPSBwLT5kYXRhWzFdOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgbGVuOyB4KyssIHB0ciArPSA0KQorICAgICAgICAgICAgKih1aW50MzJfdCAqKXB0ciA9ICgweEZGVTw8MjQpICsgKGJ1Zlt4XTw8MTYpICsgKGJ1ZltsZW4reF08PDgpICsgYnVmW2xlbitsZW4reF07CisgICAgfQorCisgICAgYnVmICs9IG1hcGxlbmd0aDsKKworICAgIGlmIChtYXBsZW5ndGggJiYgZGVwdGggPCA4KSB7CisgICAgICAgIHB0ciA9IHB0cjIgPSBhdl9tYWxsb2MoKHcgKyAxNSkgKiBoKTsKKyAgICAgICAgaWYgKCFwdHIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBzdHJpZGUgPSAodyArIDE1ID4+IDMpICogZGVwdGg7CisgICAgfSBlbHNlIHsKKyAgICBwdHIgICAgPSBwLT5kYXRhWzBdOworICAgIHN0cmlkZSA9IHAtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIC8qIHNjYW5saW5lcyBhcmUgYWxpZ25lZCBvbiAxNiBiaXQgYm91bmRhcmllcyAqLworICAgIGxlbiAgPSAoZGVwdGggKiB3ICsgNykgPj4gMzsKKyAgICBhbGVuID0gbGVuICsgKGxlbiAmIDEpOworCisgICAgaWYgKHR5cGUgPT0gUlRfQllURV9FTkNPREVEKSB7CisgICAgICAgIGludCB2YWx1ZSwgcnVuOworICAgICAgICB1aW50OF90ICplbmQgPSBwdHIgKyBoICogc3RyaWRlOworCisgICAgICAgIHggPSAwOworICAgICAgICB3aGlsZSAocHRyICE9IGVuZCAmJiBidWYgPCBidWZfZW5kKSB7CisgICAgICAgICAgICBydW4gPSAxOworICAgICAgICAgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPCAxKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBpZiAoKHZhbHVlID0gKmJ1ZisrKSA9PSBSTEVfVFJJR0dFUikgeworICAgICAgICAgICAgICAgIHJ1biA9ICpidWYrKyArIDE7CisgICAgICAgICAgICAgICAgaWYgKHJ1biAhPSAxKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICpidWYrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChydW4tLSkgeworICAgICAgICAgICAgICAgIGlmICh4IDwgbGVuKQorICAgICAgICAgICAgICAgICAgICBwdHJbeF0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoKyt4ID49IGFsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHB0ciArPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPCBsZW4pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtZW1jcHkocHRyLCBidWYsIGxlbik7CisgICAgICAgICAgICBwdHIgKz0gc3RyaWRlOworICAgICAgICAgICAgYnVmICs9IGFsZW47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCAmJiBkZXB0aCA8IDgpIHsKKyAgICAgICAgdWludDhfdCAqcHRyX2ZyZWUgPSBwdHIyOworICAgICAgICBwdHIgPSBwLT5kYXRhWzBdOworICAgICAgICBmb3IgKHk9MDsgeTxoOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAodyArIDcgPj4gMykgKiBkZXB0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyWzgqeF0gICA9IHB0cjJbeF0gPj4gNzsKKyAgICAgICAgICAgICAgICAgICAgcHRyWzgqeCsxXSA9IHB0cjJbeF0gPj4gNiAmIDE7CisgICAgICAgICAgICAgICAgICAgIHB0cls4KngrMl0gPSBwdHIyW3hdID4+IDUgJiAxOworICAgICAgICAgICAgICAgICAgICBwdHJbOCp4KzNdID0gcHRyMlt4XSA+PiA0ICYgMTsKKyAgICAgICAgICAgICAgICAgICAgcHRyWzgqeCs0XSA9IHB0cjJbeF0gPj4gMyAmIDE7CisgICAgICAgICAgICAgICAgICAgIHB0cls4KngrNV0gPSBwdHIyW3hdID4+IDIgJiAxOworICAgICAgICAgICAgICAgICAgICBwdHJbOCp4KzZdID0gcHRyMlt4XSA+PiAxICYgMTsKKyAgICAgICAgICAgICAgICAgICAgcHRyWzgqeCs3XSA9IHB0cjJbeF0gICAgICAmIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyWzIqeF0gICA9IHB0cjJbeF0gPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgcHRyWzIqeCsxXSA9IHB0cjJbeF0gJiAweEY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRyICArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIHB0cjIgKz0gKHcgKyAxNSA+PiAzKSAqIGRlcHRoOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVwKCZwdHJfZnJlZSk7CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYnVmIC0gYnVmc3RhcnQ7Cit9CisKK0FWQ29kZWMgZmZfc3VucmFzdF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzdW5yYXN0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3VuIFJhc3RlcmZpbGUgaW1hZ2UiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU1VOUkFTVCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBzdW5yYXN0X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3N1bnJhc3QuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3N1bnJhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTYyZTYzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3VucmFzdC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBTdW4gUmFzdGVyZmlsZSBJbWFnZSBGb3JtYXQKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJdm8gdmFuIFBvb3J0ZW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NVTlJBU1RfSAorI2RlZmluZSBBVkNPREVDX1NVTlJBU1RfSAorCisjZGVmaW5lIFJBU19NQUdJQyAweDU5YTY2YTk1CisKKyNkZWZpbmUgUk1UX05PTkUgICAgICAwCisjZGVmaW5lIFJNVF9FUVVBTF9SR0IgMQorI2RlZmluZSBSTVRfUkFXICAgICAgIDIgLy8vPCB0aGUgZGF0YSBsYXlvdXQgb2YgdGhpcyBtYXAgdHlwZSBpcyB1bmtub3duCisKKy8qIFRoZSBPbGQgYW5kIFN0YW5kYXJkIGZvcm1hdCB0eXBlcyBpbmRpY2F0ZSB0aGF0IHRoZSBpbWFnZSBkYXRhIGlzCisgKiB1bmNvbXByZXNzZWQuIFRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGZvcm1hdHMuICovCisjZGVmaW5lIFJUX09MRCAgICAgICAgICAwCisjZGVmaW5lIFJUX1NUQU5EQVJEICAgICAxCisKKy8qIFRoZSBCeXRlLUVuY29kZWQgZm9ybWF0IHR5cGUgaW5kaWNhdGVzIHRoYXQgdGhlIGltYWdlIGRhdGEgaXMgY29tcHJlc3NlZAorICogdXNpbmcgYSBydW4tbGVuZ3RoIGVuY29kaW5nIHNjaGVtZS4gKi8KKyNkZWZpbmUgUlRfQllURV9FTkNPREVEIDIKKyNkZWZpbmUgUkxFX1RSSUdHRVIgMHg4MAorCisvKiBUaGUgUkdCIGZvcm1hdCB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBpbWFnZSBpcyB1bmNvbXByZXNzZWQgd2l0aCByZXZlcnNlCisgKiBjb21wb25lbnQgb3JkZXIgZnJvbSBPbGQgYW5kIFN0YW5kYXJkIChSR0IgdnMgQkdSKS4gKi8KKyNkZWZpbmUgUlRfRk9STUFUX1JHQiAgIDMKKworLyogVGhlIFRJRkYgYW5kIElGRiBmb3JtYXQgdHlwZXMgaW5kaWNhdGUgdGhhdCB0aGUgcmFzdGVyIGZpbGUgd2FzIG9yaWdpbmFsbHkKKyAqIGNvbnZlcnRlZCBmcm9tIGVpdGhlciBvZiB0aGVzZSBmaWxlIGZvcm1hdHMuIFdlIGRvIG5vdCBoYXZlIGFueSBzYW1wbGVzIG9yCisgKiBkb2N1bWVudGF0aW9uIG9mIHRoZSBmb3JtYXQgZGV0YWlscy4gKi8KKyNkZWZpbmUgUlRfRk9STUFUX1RJRkYgIDQKKyNkZWZpbmUgUlRfRk9STUFUX0lGRiAgIDUKKworLyogVGhlIEV4cGVyaW1lbnRhbCBmb3JtYXQgdHlwZSBpcyBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBhbmQgaXMgZ2VuZXJhbGx5IGFuCisgKiBpbmRpY2F0aW9uIHRoYXQgdGhlIGltYWdlIGZpbGUgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgU3VuIFJhc3RlciBmaWxlCisgKiBmb3JtYXQgc3BlY2lmaWNhdGlvbi4gKi8KKyNkZWZpbmUgUlRfRVhQRVJJTUVOVEFMIDB4ZmZmZgorCisjZW5kaWYgLyogQVZDT0RFQ19TVU5SQVNUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3N1bnJhc3RlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3N1bnJhc3RlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmY4Yzg1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3VucmFzdGVuYy5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogU3VuIFJhc3RlcmZpbGUgKC5zdW4vLnJhcy9pbXsxLDgsMjR9Ly5zdW5yYXMpIGltYWdlIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBBbmVlc2ggRG9ncmEgKGxpb25hbmVlc2gpIDxsaW9uYW5lZXNoQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdW5yYXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IFNVTlJBU1RDb250ZXh0IHsKKyAgICBQdXRCeXRlQ29udGV4dCBwOworICAgIGludCBkZXB0aDsgICAgICAvLy88IGRlcHRoIG9mIHBpeGVsCisgICAgaW50IGxlbmd0aDsgICAgIC8vLzwgbGVuZ3RoIChieXRlcykgb2YgaW1hZ2UKKyAgICBpbnQgdHlwZTsgICAgICAgLy8vPCB0eXBlIG9mIGZpbGUKKyAgICBpbnQgbWFwdHlwZTsgICAgLy8vPCB0eXBlIG9mIGNvbG9ybWFwCisgICAgaW50IG1hcGxlbmd0aDsgIC8vLzwgbGVuZ3RoIChieXRlcykgb2YgY29sb3JtYXAKKyAgICBpbnQgc2l6ZTsKK30gU1VOUkFTVENvbnRleHQ7CisKK3N0YXRpYyB2b2lkIHN1bnJhc3RfaW1hZ2Vfd3JpdGVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTVU5SQVNUQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBieXRlc3RyZWFtMl9wdXRfYmUzMnUoJnMtPnAsIFJBU19NQUdJQyk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMzJ1KCZzLT5wLCBhdmN0eC0+d2lkdGgpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTMydSgmcy0+cCwgYXZjdHgtPmhlaWdodCk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMzJ1KCZzLT5wLCBzLT5kZXB0aCk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMzJ1KCZzLT5wLCBzLT5sZW5ndGgpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTMydSgmcy0+cCwgcy0+dHlwZSk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMzJ1KCZzLT5wLCBzLT5tYXB0eXBlKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfYmUzMnUoJnMtPnAsIHMtPm1hcGxlbmd0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHN1bnJhc3RfaW1hZ2Vfd3JpdGVfaW1hZ2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpwYWxldHRlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSkKK3sKKyAgICBTVU5SQVNUQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqcHRyOworICAgIGludCBsZW4sIGFsZW4sIHgsIHk7CisKKyAgICBpZiAocy0+bWFwbGVuZ3RoKSB7ICAgICAvLyBwYWxldHRpemVkCisgICAgICAgIFB1dEJ5dGVDb250ZXh0IHBiX3IsIHBiX2c7CisgICAgICAgIGludCBsZW4gPSBzLT5tYXBsZW5ndGggLyAzOworCisgICAgICAgIHBiX3IgPSBzLT5wOworICAgICAgICBieXRlc3RyZWFtMl9za2lwX3AoJnMtPnAsIGxlbik7CisgICAgICAgIHBiX2cgPSBzLT5wOworICAgICAgICBieXRlc3RyZWFtMl9za2lwX3AoJnMtPnAsIGxlbik7CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGxlbjsgeCsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBwaXhlbCA9IHBhbGV0dGVfZGF0YVt4XTsKKworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGV1KCZwYl9yLCAocGl4ZWwgPj4gMTYpICYgMHhGRik7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZXUoJnBiX2csIChwaXhlbCA+PiA4KSAgJiAweEZGKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRldSgmcy0+cCwgIHBpeGVsICAgICAgICAmIDB4RkYpOworICAgICAgICB9CisgICAgfQorCisgICAgbGVuICA9IChzLT5kZXB0aCAqIGF2Y3R4LT53aWR0aCArIDcpID4+IDM7CisgICAgYWxlbiA9IGxlbiArIChsZW4gJiAxKTsKKyAgICBwdHIgID0gcGl4ZWxzOworCisgICAgIGlmIChzLT50eXBlID09IFJUX0JZVEVfRU5DT0RFRCkgeworICAgICAgICB1aW50OF90IHZhbHVlLCB2YWx1ZTI7CisgICAgICAgIGludCBydW47CisKKyAgICAgICAgcHRyID0gcGl4ZWxzOworCisjZGVmaW5lIEdFVF9WQUxVRSB5ID49IGF2Y3R4LT5oZWlnaHQgPyAwIDogeCA+PSBsZW4gPyBwdHJbbGVuLTFdIDogcHRyW3hdCisKKyAgICAgICAgeCA9IDAsIHkgPSAwOworICAgICAgICB2YWx1ZTIgPSBHRVRfVkFMVUU7CisgICAgICAgIHdoaWxlICh5IDwgYXZjdHgtPmhlaWdodCkgeworICAgICAgICAgICAgcnVuID0gMTsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUyOworICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgaWYgKHggPj0gYWxlbikgeworICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgIHB0ciArPSBsaW5lc2l6ZSwgeSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YWx1ZTIgPSBHRVRfVkFMVUU7CisgICAgICAgICAgICB3aGlsZSAodmFsdWUyID09IHZhbHVlICYmIHJ1biA8IDI1NiAmJiB5IDwgYXZjdHgtPmhlaWdodCkgeworICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgICAgICBydW4rKzsKKyAgICAgICAgICAgICAgICBpZiAoeCA+PSBhbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgICAgICBwdHIgKz0gbGluZXNpemUsIHkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdWUyID0gR0VUX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocnVuID4gMiB8fCB2YWx1ZSA9PSBSTEVfVFJJR0dFUikgeworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRldSgmcy0+cCwgUkxFX1RSSUdHRVIpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRldSgmcy0+cCwgcnVuIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKHJ1biA+IDEpCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRldSgmcy0+cCwgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChydW4gPT0gMSkgeworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRldSgmcy0+cCwgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMTZ1KCZzLT5wLCAodmFsdWUgPDwgOCkgfCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1cGRhdGUgZGF0YSBsZW5ndGggZm9yIGhlYWRlcgorICAgICAgICBzLT5sZW5ndGggPSBieXRlc3RyZWFtMl90ZWxsX3AoJnMtPnApIC0gMzIgLSBzLT5tYXBsZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J1ZmZlcigmcy0+cCwgcHRyLCBsZW4pOworICAgICAgICAgICAgaWYgKGxlbiA8IGFsZW4pCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGV1KCZzLT5wLCAwKTsKKyAgICAgICAgICAgIHB0ciArPSBsaW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IHN1bnJhc3RfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNVTlJBU1RDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVyX3R5cGUpIHsKKyAgICBjYXNlIEZGX0NPREVSX1RZUEVfUkxFOgorICAgICAgICBzLT50eXBlID0gUlRfQllURV9FTkNPREVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZGX0NPREVSX1RZUEVfUkFXOgorICAgICAgICBzLT50eXBlID0gUlRfU1RBTkRBUkQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBjb2Rlcl90eXBlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzLT5tYXB0eXBlICAgICAgICAgICAgICAgICAgICA9IFJNVF9OT05FOworICAgIHMtPm1hcGxlbmd0aCAgICAgICAgICAgICAgICAgID0gMDsKKworICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfTU9OT1dISVRFOgorICAgICAgICBzLT5kZXB0aCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9QQUw4IDoKKyAgICAgICAgcy0+bWFwdHlwZSAgID0gUk1UX0VRVUFMX1JHQjsKKyAgICAgICAgcy0+bWFwbGVuZ3RoID0gMyAqIDI1NjsKKyAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgICAgICBzLT5kZXB0aCA9IDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IyNDoKKyAgICAgICAgcy0+ZGVwdGggPSAyNDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgIH0KKyAgICBzLT5sZW5ndGggPSBhdmN0eC0+aGVpZ2h0ICogKEZGQUxJR04oYXZjdHgtPndpZHRoICogcy0+ZGVwdGgsIDE2KSA+PiAzKTsKKyAgICBzLT5zaXplICAgPSAzMiArIHMtPm1hcGxlbmd0aCArCisgICAgICAgICAgICAgICAgcy0+bGVuZ3RoICogKHMtPnR5cGUgPT0gUlRfQllURV9FTkNPREVEID8gMiA6IDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VucmFzdF9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCAgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBTVU5SQVNUQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIHMtPnNpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0X3dyaXRlcigmcy0+cCwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICBzdW5yYXN0X2ltYWdlX3dyaXRlX2hlYWRlcihhdmN0eCk7CisgICAgc3VucmFzdF9pbWFnZV93cml0ZV9pbWFnZShhdmN0eCwgZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDMyX3QgKilmcmFtZS0+ZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgLy8gdXBkYXRlIGRhdGEgbGVuZ3RoIGluIGhlYWRlciBhZnRlciBSTEUKKyAgICBpZiAocy0+dHlwZSA9PSBSVF9CWVRFX0VOQ09ERUQpCisgICAgICAgIEFWX1dCMzIoJmF2cGt0LT5kYXRhWzE2XSwgcy0+bGVuZ3RoKTsKKworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgYXZwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICBhdnBrdC0+c2l6ZSA9IGJ5dGVzdHJlYW0yX3RlbGxfcCgmcy0+cCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBzdW5yYXN0X2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWQ29kZWNEZWZhdWx0IHN1bnJhc3RfZGVmYXVsdHNbXSA9IHsKKyAgICAgeyAiY29kZXIiLCAicmxlIiB9LAorICAgICB7IE5VTEwgfSwKK307CisKK0FWQ29kZWMgZmZfc3VucmFzdF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzdW5yYXN0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3VuIFJhc3RlcmZpbGUgaW1hZ2UiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU1VOUkFTVCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU1VOUkFTVENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHN1bnJhc3RfZW5jb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gc3VucmFzdF9lbmNvZGVfY2xvc2UsCisgICAgLmVuY29kZTIgICAgICAgID0gc3VucmFzdF9lbmNvZGVfZnJhbWUsCisgICAgLmRlZmF1bHRzICAgICAgID0gc3VucmFzdF9kZWZhdWx0cywKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX0JHUjI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1BBTDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTU9OT1dISVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zdnExLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9zdnExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5YjBiZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3N2cTEuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogU1ZRMSBkZWNvZGVyCisgKiBwb3J0ZWQgdG8gTVBsYXllciBieSBBcnBpIDxhcnBpQHRob3QuYmFua2kuaHU+CisgKiBwb3J0ZWQgdG8gbGliYXZjb2RlYyBieSBOaWNrIEt1cnNoZXYgPG5pY2tvbHNfa0BtYWlsLnJ1PgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgWGluZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogU1ZRMSBFbmNvZGVyIChjKSAyMDA0IE1pa2UgTWVsYW5zb24gPG1lbGFuc29uQHBjaXN5cy5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNvcmVuc29uIFZlY3RvciBRdWFudGl6ZXIgIzEgKFNWUTEpIHZpZGVvIGNvZGVjLgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb2YgdGhlIFNWUTEgYWxnb3JpdGhtLCB2aXNpdDoKKyAqICAgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvCisgKi8KKworI2luY2x1ZGUgInN2cTEuaCIKKyNpbmNsdWRlICJzdnExX2NiLmgiCisjaW5jbHVkZSAic3ZxMV92bGMuaCIKKworLyogc3RhbmRhcmQgdmlkZW8gc2l6ZXMgKi8KK2NvbnN0IHVpbnQxNl90IGZmX3N2cTFfZnJhbWVfc2l6ZV90YWJsZVs3XVsyXSA9IHsKKyAgICB7IDE2MCwgMTIwIH0sIHsgMTI4LCAgOTYgfSwgeyAxNzYsIDE0NCB9LCB7IDM1MiwgMjg4IH0sCisgICAgeyA3MDQsIDU3NiB9LCB7IDI0MCwgMTgwIH0sIHsgMzIwLCAyNDAgfQorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3N2cTEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3N2cTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGQ2MWQxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBTVlExIGRlY29kZXIKKyAqIHBvcnRlZCB0byBNUGxheWVyIGJ5IEFycGkgPGFycGlAdGhvdC5iYW5raS5odT4KKyAqIHBvcnRlZCB0byBsaWJhdmNvZGVjIGJ5IE5pY2sgS3Vyc2hldiA8bmlja29sc19rQG1haWwucnU+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBYaW5lIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBTVlExIEVuY29kZXIgKGMpIDIwMDQgTWlrZSBNZWxhbnNvbiA8bWVsYW5zb25AcGNpc3lzLm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU29yZW5zb24gVmVjdG9yIFF1YW50aXplciAjMSAoU1ZRMSkgdmlkZW8gY29kZWMuCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvZiB0aGUgU1ZRMSBhbGdvcml0aG0sIHZpc2l0OgorICogICBodHRwOi8vd3d3LnBjaXN5cy5uZXQvfm1lbGFuc29uL2NvZGVjcy8KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfU1ZRMV9ICisjZGVmaW5lIEFWQ09ERUNfU1ZRMV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBTVlExX0JMT0NLX1NLSVAgICAgICAgICAwCisjZGVmaW5lIFNWUTFfQkxPQ0tfSU5URVIgICAgICAgIDEKKyNkZWZpbmUgU1ZRMV9CTE9DS19JTlRFUl80ViAgICAgMgorI2RlZmluZSBTVlExX0JMT0NLX0lOVFJBICAgICAgICAzCisKK3VpbnQxNl90IGZmX3N2cTFfcGFja2V0X2NoZWNrc3VtKGNvbnN0IHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGVuZ3RoLCBpbnQgdmFsdWUpOworCitleHRlcm4gY29uc3QgaW50OF90ICpjb25zdCBmZl9zdnExX2ludGVyX2NvZGVib29rc1s2XTsKK2V4dGVybiBjb25zdCBpbnQ4X3QgKmNvbnN0IGZmX3N2cTFfaW50cmFfY29kZWJvb2tzWzZdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9zdnExX2Jsb2NrX3R5cGVfdmxjWzRdWzJdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfc3ZxMV9pbnRyYV9tdWx0aXN0YWdlX3ZsY1s2XVs4XVsyXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3N2cTFfaW50ZXJfbXVsdGlzdGFnZV92bGNbNl1bOF1bMl07CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfc3ZxMV9pbnRyYV9tZWFuX3ZsY1syNTZdWzJdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3N2cTFfaW50ZXJfbWVhbl92bGNbNTEyXVsyXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3N2cTFfZnJhbWVfc2l6ZV90YWJsZVs3XVsyXTsKKworI2VuZGlmIC8qIEFWQ09ERUNfU1ZRMV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zdnExMy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODIxYTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMTMuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogU1ZRMS9TVlEzIGRlY29kZXIgY29tbW9uIGNvZGUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAic3ZxMS5oIgorCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2hlY2tzdW1fdGFibGVbMjU2XSA9IHsKKyAgICAweDAwMDAsIDB4MTAyMSwgMHgyMDQyLCAweDMwNjMsIDB4NDA4NCwgMHg1MEE1LCAweDYwQzYsIDB4NzBFNywKKyAgICAweDgxMDgsIDB4OTEyOSwgMHhBMTRBLCAweEIxNkIsIDB4QzE4QywgMHhEMUFELCAweEUxQ0UsIDB4RjFFRiwKKyAgICAweDEyMzEsIDB4MDIxMCwgMHgzMjczLCAweDIyNTIsIDB4NTJCNSwgMHg0Mjk0LCAweDcyRjcsIDB4NjJENiwKKyAgICAweDkzMzksIDB4ODMxOCwgMHhCMzdCLCAweEEzNUEsIDB4RDNCRCwgMHhDMzlDLCAweEYzRkYsIDB4RTNERSwKKyAgICAweDI0NjIsIDB4MzQ0MywgMHgwNDIwLCAweDE0MDEsIDB4NjRFNiwgMHg3NEM3LCAweDQ0QTQsIDB4NTQ4NSwKKyAgICAweEE1NkEsIDB4QjU0QiwgMHg4NTI4LCAweDk1MDksIDB4RTVFRSwgMHhGNUNGLCAweEM1QUMsIDB4RDU4RCwKKyAgICAweDM2NTMsIDB4MjY3MiwgMHgxNjExLCAweDA2MzAsIDB4NzZENywgMHg2NkY2LCAweDU2OTUsIDB4NDZCNCwKKyAgICAweEI3NUIsIDB4QTc3QSwgMHg5NzE5LCAweDg3MzgsIDB4RjdERiwgMHhFN0ZFLCAweEQ3OUQsIDB4QzdCQywKKyAgICAweDQ4QzQsIDB4NThFNSwgMHg2ODg2LCAweDc4QTcsIDB4MDg0MCwgMHgxODYxLCAweDI4MDIsIDB4MzgyMywKKyAgICAweEM5Q0MsIDB4RDlFRCwgMHhFOThFLCAweEY5QUYsIDB4ODk0OCwgMHg5OTY5LCAweEE5MEEsIDB4QjkyQiwKKyAgICAweDVBRjUsIDB4NEFENCwgMHg3QUI3LCAweDZBOTYsIDB4MUE3MSwgMHgwQTUwLCAweDNBMzMsIDB4MkExMiwKKyAgICAweERCRkQsIDB4Q0JEQywgMHhGQkJGLCAweEVCOUUsIDB4OUI3OSwgMHg4QjU4LCAweEJCM0IsIDB4QUIxQSwKKyAgICAweDZDQTYsIDB4N0M4NywgMHg0Q0U0LCAweDVDQzUsIDB4MkMyMiwgMHgzQzAzLCAweDBDNjAsIDB4MUM0MSwKKyAgICAweEVEQUUsIDB4RkQ4RiwgMHhDREVDLCAweEREQ0QsIDB4QUQyQSwgMHhCRDBCLCAweDhENjgsIDB4OUQ0OSwKKyAgICAweDdFOTcsIDB4NkVCNiwgMHg1RUQ1LCAweDRFRjQsIDB4M0UxMywgMHgyRTMyLCAweDFFNTEsIDB4MEU3MCwKKyAgICAweEZGOUYsIDB4RUZCRSwgMHhERkRELCAweENGRkMsIDB4QkYxQiwgMHhBRjNBLCAweDlGNTksIDB4OEY3OCwKKyAgICAweDkxODgsIDB4ODFBOSwgMHhCMUNBLCAweEExRUIsIDB4RDEwQywgMHhDMTJELCAweEYxNEUsIDB4RTE2RiwKKyAgICAweDEwODAsIDB4MDBBMSwgMHgzMEMyLCAweDIwRTMsIDB4NTAwNCwgMHg0MDI1LCAweDcwNDYsIDB4NjA2NywKKyAgICAweDgzQjksIDB4OTM5OCwgMHhBM0ZCLCAweEIzREEsIDB4QzMzRCwgMHhEMzFDLCAweEUzN0YsIDB4RjM1RSwKKyAgICAweDAyQjEsIDB4MTI5MCwgMHgyMkYzLCAweDMyRDIsIDB4NDIzNSwgMHg1MjE0LCAweDYyNzcsIDB4NzI1NiwKKyAgICAweEI1RUEsIDB4QTVDQiwgMHg5NUE4LCAweDg1ODksIDB4RjU2RSwgMHhFNTRGLCAweEQ1MkMsIDB4QzUwRCwKKyAgICAweDM0RTIsIDB4MjRDMywgMHgxNEEwLCAweDA0ODEsIDB4NzQ2NiwgMHg2NDQ3LCAweDU0MjQsIDB4NDQwNSwKKyAgICAweEE3REIsIDB4QjdGQSwgMHg4Nzk5LCAweDk3QjgsIDB4RTc1RiwgMHhGNzdFLCAweEM3MUQsIDB4RDczQywKKyAgICAweDI2RDMsIDB4MzZGMiwgMHgwNjkxLCAweDE2QjAsIDB4NjY1NywgMHg3Njc2LCAweDQ2MTUsIDB4NTYzNCwKKyAgICAweEQ5NEMsIDB4Qzk2RCwgMHhGOTBFLCAweEU5MkYsIDB4OTlDOCwgMHg4OUU5LCAweEI5OEEsIDB4QTlBQiwKKyAgICAweDU4NDQsIDB4NDg2NSwgMHg3ODA2LCAweDY4MjcsIDB4MThDMCwgMHgwOEUxLCAweDM4ODIsIDB4MjhBMywKKyAgICAweENCN0QsIDB4REI1QywgMHhFQjNGLCAweEZCMUUsIDB4OEJGOSwgMHg5QkQ4LCAweEFCQkIsIDB4QkI5QSwKKyAgICAweDRBNzUsIDB4NUE1NCwgMHg2QTM3LCAweDdBMTYsIDB4MEFGMSwgMHgxQUQwLCAweDJBQjMsIDB4M0E5MiwKKyAgICAweEZEMkUsIDB4RUQwRiwgMHhERDZDLCAweENENEQsIDB4QkRBQSwgMHhBRDhCLCAweDlERTgsIDB4OERDOSwKKyAgICAweDdDMjYsIDB4NkMwNywgMHg1QzY0LCAweDRDNDUsIDB4M0NBMiwgMHgyQzgzLCAweDFDRTAsIDB4MENDMSwKKyAgICAweEVGMUYsIDB4RkYzRSwgMHhDRjVELCAweERGN0MsIDB4QUY5QiwgMHhCRkJBLCAweDhGRDksIDB4OUZGOCwKKyAgICAweDZFMTcsIDB4N0UzNiwgMHg0RTU1LCAweDVFNzQsIDB4MkU5MywgMHgzRUIyLCAweDBFRDEsIDB4MUVGMAorfTsKKwordWludDE2X3QgZmZfc3ZxMV9wYWNrZXRfY2hlY2tzdW0gKGNvbnN0IHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxlbmd0aCwgaW50IHZhbHVlKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICB2YWx1ZSA9IGNoZWNrc3VtX3RhYmxlW2RhdGFbaV0gXiAodmFsdWUgPj4gOCldIF4gKCh2YWx1ZSAmIDB4RkYpIDw8IDgpOworCisgICAgcmV0dXJuIHZhbHVlOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMV9jYi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMV9jYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDg1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zdnExX2NiLmgKQEAgLTAsMCArMSwxNTI1IEBACisvKgorICogU1ZRMSBkZWNvZGVyCisgKiBwb3J0ZWQgdG8gTVBsYXllciBieSBBcnBpIDxhcnBpQHRob3QuYmFua2kuaHU+CisgKiBwb3J0ZWQgdG8gbGliYXZjb2RlYyBieSBOaWNrIEt1cnNoZXYgPG5pY2tvbHNfa0BtYWlsLnJ1PgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgWGluZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHN2cTEgY29kZSBib29rcy4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfU1ZRMV9DQl9ICisjZGVmaW5lIEFWQ09ERUNfU1ZRMV9DQl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworLyogNngxNi1lbnRyeSBjb2RlYm9vayBmb3IgaW50ZXItY29kZWQgNHgyIHZlY3RvcnMgKi8KK0RFQ0xBUkVfQUxJR05FRCg0LCBzdGF0aWMgY29uc3QgaW50OF90LCBzdnExX2ludGVyX2NvZGVib29rXzR4MilbNzY4XSA9IHsKKyAgICA3LCAgMiwgLTYsIC03LCAgNywgIDMsIC0zLCAtNCwgLTcsIC0yLCAgNywgIDgsIC04LCAtNCwgIDMsICA0LAorICAgMTksIDE3LCAgOSwgIDMsLTE0LC0xNiwtMTIsIC04LC0xOCwtMTYsIC04LCAtMywgMTEsIDE0LCAxMiwgIDgsCisgICAgNywtMTYsLTEwLCAyMCwgIDcsLTE3LC0xMCwgMjAsIC02LCAxOCwgIDgsLTIxLCAtNywgMTgsICA5LC0yMCwKKyAgIDI1LCAgMywtMjAsLTE0LCAyOSwgIDcsLTE4LC0xMywtMjksIC00LCAyMSwgMTQsLTMxLCAtNiwgMjAsIDE0LAorICAtMTksLTI2LC0yOCwtMjQsIDMxLCAzMiwgMjIsIDEwLCAxNSwgMjQsIDMxLCAyOCwtMzIsLTMyLC0yMiwtMTMsCisgICAgMiwgLTgsLTIzLC0yNiwgLTksICAzLCAyNywgMzUsICAzLCAxMSwgMjEsIDIxLCAgOCwgLTQsLTI3LC0zNCwKKyAgLTMwLC0zMSwgMTIsIDQ3LC0yOSwtMzAsIDEzLCA0NywgMzgsIDMwLC0xNywtNDYsIDM0LCAyNiwtMTksLTQ2LAorICAtNDIsLTUwLC01MSwtNDMsIDM0LCA0OCwgNTUsIDQ4LCA0OCwgNTQsIDUxLCA0MiwtNDQsLTUyLC01MywtNDcsCisgICAgNCwgIDUsICAwLCAtNiwgLTIsIC0yLCAgMCwgIDEsLTExLCAtNiwgLTEsIC0yLCAgMSwgIDgsICA5LCAgMSwKKyAgICAwLCAgMSwgLTYsICA1LCAgOCwgIDEsLTEyLCAgMiwgIDcsLTE0LCAtNywgIDgsICA1LCAtOCwgIDAsICA4LAorICAgIDEsICA0LCAxMSwgIDgsLTEyLCAtOCwgIDAsIC01LCAtMSwgIDEsICAwLCAgNCwtMTUsIC04LCAgMywgMTYsCisgICAxNywgIDgsIC00LCAtNiwgIDksIC00LC0xMywgLTgsICAyLCAgNiwgIDEsLTE4LCAtMSwgMTEsIDExLC0xMiwKKyAgICA2LCAgMCwgIDIsICAwLCAxNCwgIDYsIC03LC0yMSwgIDEsIC0xLC0xMywtMjAsICAxLCAgMSwgMTAsIDIxLAorICAtMjIsIC01LCAgNywgMTMsLTExLCAtMSwgIDQsIDEyLCAtNywgIDAsIDE0LCAxOSwgLTQsICAzLCAtNSwtMTksCisgIC0yNiwtMTQsIDEwLCAxNSwgMTgsICA0LCAtNiwgLTIsIDI1LCAxOSwgLTUsLTE4LC0yMCwgLTcsICA0LCAgMiwKKyAgLTEzLCAtNiwgLTEsIC00LCAyNSwgMzcsIC0yLC0zNSwgIDUsICA0LCAgMSwgIDEsLTIxLC0zNiwgIDIsIDQzLAorICAgIDIsIC0yLCAtMSwgIDMsICA4LCAtMiwgLTYsIC0xLCAtMiwgLTMsICAyLCAxMiwgLTUsIC0yLCAtMiwgLTEsCisgICAtMywgLTEsIC0xLCAtNSwgLTEsICA3LCAgOCwgLTIsICAyLCAgNywgIDUsIC0zLCAgMSwgIDEsIC0zLCAtOCwKKyAgIC0zLCAtMSwgLTMsIC0yLCAtMiwgLTMsICAyLCAxMywgMTUsICAwLC0xMSwgLTYsICAzLCAgMCwgIDAsICAwLAorICAgLTYsIC05LCAtNSwgLTQsIDE4LCAgNCwgIDEsICAzLCAxMiwgIDMsICAwLCAgNCwtMTYsIC0zLCAgMywgLTMsCisgIC0xNywgIDMsIDE4LCAgMiwgLTEsIC0zLCAtMSwgLTEsIC02LCAxNiwgLTgsICAwLCAtOSwgMTQsIC03LCAgMCwKKyAgICAzLC0xMywgMTQsIC01LCAgMywtMTMsIDE0LCAtNCwgLTcsIDIwLCAxNCwtMjMsICA4LCAtNywgLTgsICA0LAorICAgIDgsLTE1LC0xOSwgMTYsLTEwLCAxMywgMTEsIC0zLCAgOSwgLTEsICAxLCAyNiwgIDUsLTE1LC0yNywgIDIsCisgIC0yMCwgIDcsIDE2LCAtNCwtNDAsICA5LCAzMSwgIDEsIDI2LC0xMiwtMzAsIC03LCA0MCwgLTIsLTE5LCAgNCwKKyAgICA2LCAgMCwgIDAsICAwLCAtNiwgLTIsICAxLCAgMiwgIDAsIC0xLCAgMCwgLTYsICA5LCAgMCwgLTIsIC0xLAorICAgLTcsICA4LCAgMiwgLTMsIC0xLCAgMiwgLTMsICAyLCAgNywgLTQsIC0yLCAgNCwgIDIsICAwLCAgMCwgLTYsCisgICAtMywgLTIsICA5LCAgMiwgLTIsIC0xLCAgMCwgLTQsIC0zLCAtMywgIDAsIC0zLCAtNiwgIDIsIDEwLCAgNCwKKyAgICAzLCAgMCwtMTAsICA4LCAgMCwgIDAsIC00LCAgNCwgLTEsICAxLCAgNCwgIDIsICAzLCAtNywgLTksICA3LAorICAgIDIsICAxLCAtOSwgLTQsIC0xLCAxMiwgIDAsICAwLCAgMywgLTEsICA3LCAtNCwgIDMsLTE0LCAgNCwgIDIsCisgIC0xMiwgLTksICAxLCAxMSwgIDIsICA1LCAgMSwgIDAsICAzLCAgMSwgIDAsICAyLCAgMCwgIDgsICA2LC0xOSwKKyAgIC02LC0xMCwgLTcsIC00LCAgOSwgIDcsICA1LCAgNywgIDYsIDIxLCAgMywgLTMsLTExLCAtOSwgLTUsIC0yLAorICAgLTQsIC05LC0xNiwgLTEsIC0yLCAtNSwgIDEsIDM2LCAgOCwgMTEsIDE5LCAgMCwgIDIsICA1LCAtNCwtNDEsCisgICAtMSwgLTEsIC0yLCAtMSwgLTIsIC0yLCAgMSwgIDYsICAwLCAgNCwgIDEsIC04LCAgMSwgIDEsICAxLCAgMCwKKyAgIC0yLCAtMywgIDQsICAwLCAgMiwgLTEsICAzLCAtMywgIDEsICAzLCAtNCwgIDEsIC0xLCAgMywgIDAsIC01LAorICAgIDMsICA0LCAgMiwgIDMsIC0yLCAtMywgLTYsIC0xLCAtMiwgLTMsIC0yLCAgMiwgLTQsICA4LCAgMSwgIDAsCisgICAtNywgIDQsICAyLCAgNiwgLTcsIC0xLCAgMSwgIDAsIC0yLCAgMiwgLTQsICAxLCAgOCwgLTYsICAyLCAtMSwKKyAgIC02LCAgMiwgIDAsICAyLCAgNSwgIDQsIC04LCAtMSwgLTEsLTExLCAgMCwgIDksICAwLCAtMiwgIDIsICAyLAorICAgMTcsIC01LCAtNCwgLTEsIC0xLCAtNCwgLTIsIC0yLCAgMCwtMTMsICA5LCAtMywgLTEsIDEyLCAtNywgIDIsCisgICAgMCwgLTIsIC01LCAgMiwgLTcsIC01LCAyMCwgLTMsICA3LCAgNywgLTEsLTMwLCAgMywgIDUsICA4LCAgMSwKKyAgIC02LCAgMywgLTEsIC00LCAgMiwgLTIsLTExLCAxOCwgIDAsIC03LCAgMywgMTQsIDIwLCAtMywtMTgsIC05LAorICAgIDcsIC0yLCAgMCwgLTEsIC0yLCAgMCwgIDAsIC0xLCAtNCwgLTEsICAxLCAgMCwgLTIsICAyLCAgMCwgIDQsCisgICAgMSwgLTMsICAyLCAgMSwgIDMsICAxLCAtNSwgIDEsIC0zLCAgMCwgLTEsIC0yLCAgNywgIDEsICAwLCAtMywKKyAgICAyLCAgNSwgIDAsIC0yLCAgMiwgLTUsIC0xLCAgMSwgLTEsIC0yLCAgNCwgLTEsICAwLCAtMywgIDUsICAwLAorICAgIDAsICAzLCAtMSwgLTIsIC00LCAgMSwgIDUsIC0xLCAtMSwgIDAsIC0xLCAgOSwgLTEsIC0yLCAtMSwgLTEsCisgICAtMiwgIDUsICA1LCAtMSwgLTIsICAyLCAtMywgLTIsICAxLCAgMiwtMTEsICAxLCAgMiwgIDEsICAzLCAgMiwKKyAgICAyLC0xMCwgLTEsIC0yLCAgNCwgIDIsICA0LCAgMSwgIDQsICA1LCAtNSwgIDEsICAwLCAgNiwtMTEsICAxLAorICAgIDEsICAwLCAgNiwgIDYsICAwLCAgMiwgIDEsLTE1LCAgNywgIDMsICA1LCAgOSwtMzAsICAyLCAgMiwgIDIsCisgIC0zNCwgIDEsICA5LCAgMiwgIDUsICA4LCAgOCwgIDIsICA3LCAgMiwgIDYsICA2LCAgMiwtMjcsICAxLCAgNAorfTsKKworLyogNngxNi1lbnRyeSBjb2RlYm9vayBmb3IgaW50ZXItY29kZWQgNHg0IHZlY3RvcnMgKi8KK0RFQ0xBUkVfQUxJR05FRCg0LCBzdGF0aWMgY29uc3QgaW50OF90LCBzdnExX2ludGVyX2NvZGVib29rXzR4NClbMTUzNl0gPSB7CisgICAgNCwgIDAsIC02LCAtNywgLTQsIC04LC0xMywgLTksIC04LCAtOCwgLTEsICA2LCAtMiwgIDUsIDIyLCAyNywKKyAgLTE2LCAtNywgMTEsIDEwLC0xOCwgLTcsIDEzLCAxMCwtMTUsIC00LCAxMiwgIDgsIC05LCAtMSwgIDksICA1LAorICAgLTIsICAyLCAxNSwtMTYsIC0zLCAgMiwgMTksLTE5LCAtMywgIDIsIDE5LC0xOSwgLTIsICAzLCAxNSwtMTQsCisgICAxNywgMjIsIDIyLCAxNiwgLTYsIC03LCAtNSwgLTIsLTEyLC0xNiwtMTYsLTEyLCAgMSwgIDEsIC0xLCAtMywKKyAgIDExLC0xNywgIDAsICA4LCAxNCwtMjEsIC0xLCAgOSwgMTQsLTIxLCAtMiwgIDgsIDExLC0xNiwgLTIsICA2LAorICAgIDcsIC0yLC0xNiwgMTEsICA5LCAtMiwtMjEsIDE0LCAxMCwgLTEsLTIyLCAxNCwgIDgsIC0xLC0xOCwgMTAsCisgIC0xMCwgMTYsICAzLCAtOSwtMTMsIDIwLCAgNCwtMTEsLTE0LCAyMSwgIDQsLTEwLC0xMSwgMTYsICAzLCAtOCwKKyAgIDExLCAgNCwgLTksIC05LCAxNSwgIDYsLTEyLC0xNCwgMTcsICA4LC0xMiwtMTQsIDE2LCAxMCwgLTcsLTExLAorICAgIDQsIDEwLCAxNCwgMTMsIC0xLCAgNywgMTUsIDE2LC0xMiwgLTcsICAzLCAgOCwtMjAsLTIzLC0xOCwtMTAsCisgIC0xMCwtMTgsLTI2LC0yNSwgIDQsICAxLCAtNiwtMTEsIDEzLCAxNSwgMTEsICAzLCAxMiwgMTUsIDEzLCAgOCwKKyAgLTE2LC0xOSwtMTYsLTExLCAgNywgMTIsIDE1LCAxMSwgMTEsIDE2LCAxNiwgMTEsIC02LCAtOSwtMTEsLTEwLAorICAgMTgsIDE5LCAxMiwgIDUsIDE4LCAxNiwgIDUsIC00LCAgNiwgIDAsLTEwLC0xNSwgLTksLTE3LC0yMywtMjIsCisgIC0xMCwtMTQsIC0xLCAyMSwtMTEsLTE3LCAgMCwgMjksLTExLC0xNiwgIDEsIDMwLC0xMCwtMTQsICAwLCAyMywKKyAgLTE2LC0xNywtMTIsIC02LC0xOSwtMTksLTE0LCAtNywgLTMsIC0xLCAgMSwgIDIsIDI3LCAzNSwgMjksIDE5LAorICAtMzcsIC04LCAyMywgMjMsLTQyLCAtOSwgMjgsIDI5LC00MywtMTAsIDI2LCAyOCwtMzgsLTExLCAxOSwgMjIsCisgICAzMiwgMTYsLTE2LC0zMywgMzksIDIwLC0xOCwtMzcsIDM4LCAxOSwtMTksLTM4LCAzMiwgMTUsLTE3LC0zNCwKKyAgIDI0LCAgOSwgLTYsIC00LCAtMSwtMTAsIC02LCAgMywgLTgsIC05LCAtMSwgIDMsICAzLCAgNywgIDIsIC02LAorICAgLTEsIC0zLCAtMSwgIDAsIC0xLCAgNCwgIDIsIC03LCAtMywgMTEsICAzLC0xNiwgIDEsIDIwLCAgOSwtMTgsCisgICAtMywgLTgsICA2LCAxMiwgLTUsLTEwLCAgNywgMTMsIC02LCAtOSwgIDUsICA3LCAtNSwgLTUsICAyLCAtMSwKKyAgIC04LCAxMiwgLTMsIC0xLC0xMCwgMTUsIC0zLCAgMSwtMTEsIDEzLCAtNCwgIDEsLTExLCAgOCwgLTMsICAyLAorICAgIDksICA2LCAtNSwtMTIsICAzLCAgMCwgLTgsLTEzLCAtNCwgLTQsIC0xLCAtMSwgLTQsICAxLCAxNSwgMTgsCisgICAgOSwgMTMsIDE0LCAxMiwgIDQsICAzLCAtMSwgLTIsIC0yLCAtNSwgLTgsIC01LCAtNywtMTEsIC05LCAtNCwKKyAgICA3LCAtNSwgLTcsIC00LCAxNCwgLTIsIC03LCAtNCwgMTcsICAwLCAtOCwgLTUsIDE1LCAgMSwgLTcsIC01LAorICAtMTAsIC0xLCAgNiwgIDQsLTE1LCAtOSwgIDIsICA0LCAgMiwgLTEsIC0zLCAgMCwgMjUsIDEzLCAtOCwtMTAsCisgICAgNywgMTEsIC0zLC0xNiwgIDcsIDExLCAtMywtMTUsICA2LCAgNywgLTIsIC05LCAgNCwgIDIsIC0zLCAtNSwKKyAgIC03LCAtMSwgLTEsICAwLCAtOSwgLTIsICAyLCAgNiwtMTIsIC00LCAgNiwgMTQsLTEzLCAtNiwgIDgsIDE5LAorICAtMTgsLTE4LC0xMSwgLTUsIC0zLCAgMCwgIDMsICA0LCAgNiwgIDgsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsCisgICAtNSwgIDMsIDEzLC0xMCwgLTYsICAxLCAxNSwgLTksIC02LCAtMywgMTUsIC02LCAtNiwgLTYsIDEwLCAtMywKKyAgICA5LCAgMSwgLTksIC05LCAxMSwgIDksICA2LCAgNSwgIDAsICAzLCAgOCwgIDcsLTE1LC0xNCwgLTYsIC01LAorICAtMTEsIC02LCAxMSwgMTksIC0yLCAtNSwgLTksIC04LCAgNiwgIDIsIC05LC0xMCwgIDYsICA1LCAgNCwgIDUsCisgICAtNywgLTMsICA4LCAxNSwgLTEsICAzLCAxMCwgMTUsICA1LCAgNSwgLTEsIC0yLCAgNCwgLTIsLTIxLC0yNSwKKyAgICA2LCAtNiwgLTYsICA1LCAgOCwgLTksIC03LCAgOSwgIDgsLTEyLCAtNywgMTMsICA0LC0xNCwgLTcsIDE0LAorICAgLTQsIC0zLCAgMSwgIDEsIC0zLCAtNSwgLTIsIC0zLCAgNywgIDAsIC0yLCAtNCwgMjAsICA3LCAtNCwgLTQsCisgICAtMywtMjAsIC02LCAxMCwgIDYsICAwLCAgMCwgIDEsICA1LCAgOCwgIDUsIC0xLCAtMywgIDAsICAwLCAtMiwKKyAgIDEzLCAgNiwgLTEsICAyLCAgNSwgIDMsICAyLCAgMywgLTMsICAwLCAgMywgIDAsLTE2LCAtOCwgLTIsIC01LAorICAgLTIsIC03LCAtNiwgIDAsIC0zLCAtNiwgLTMsICAxLCAtNSwgLTEsICAyLCAtMSwgLTEsIDEyLCAxNiwgIDUsCisgICAtNywgIDEsICA5LCAgOCwtMTAsIC0yLCAgNSwgIDMsIC02LCAgMiwgIDcsICAzLCAtNCwgIDAsIC0xLCAtNywKKyAgICAzLCAgNCwgLTksLTI0LCAgMCwgIDIsICA2LCAgMywgLTEsIC0xLCAgNCwgIDcsICA1LCAgMywgLTEsIC0yLAorICAgIDMsICA2LCAtOSwgIDIsICAxLCAgNiwtMTMsICAxLCAgMSwgIDgsLTEwLCAgMiwgIDEsICA4LCAtNywgIDEsCisgICAtMywgLTMsICAyLCAyMiwgLTIsIC0zLCAtNSwgMTIsIC0yLCAtMywtMTAsICAyLCAtMywgLTEsIC00LCAgMiwKKyAgIDExLCAxMiwgIDgsICAyLCAtNSwgLTUsIC01LCAtOCwgLTYsIC00LCAgMCwgLTMsIC0yLCAtMSwgIDMsICAzLAorICAgMTIsIC02LCAtMiwgLTEsIDEyLCAtOCwgLTIsIC0yLCAgOSwgLTcsICAwLCAtMywgIDQsIC02LCAgMiwgLTIsCisgIC0xOSwgIDEsIDEyLCAtMywgLTQsICA0LCAgNSwgLTQsICA2LCAgMSwgLTIsIC0xLCAgNCwgLTQsIC0yLCAgNywKKyAgIC0zLCAtNCwgLTcsIC04LCAtNCwgLTQsIC0yLCAgMCwgLTEsICAyLCAxNCwgMTYsIC00LCAtMiwgIDQsICA0LAorICAgLTEsICA3LCAgMiwgLTUsIC0yLCAgMCwgLTEsICAxLCAgNCwgLTMsIC0xLCAxMywgIDYsLTEyLC0xNCwgIDgsCisgICAtMSwgIDUsICA0LCAtNSwgLTIsICA1LCAgMywgLTksIC0yLCAgNywgIDQsLTEyLCAtMSwgIDcsICA0LCAtOSwKKyAgIC02LCAtMywgIDEsICAxLCAxMSwgMTEsICAwLCAtNiwgIDYsICA0LCAtMiwgLTcsLTEyLC0xMCwgIDMsIDEwLAorICAgLTIsIC0zLCAtMywgLTIsICA2LCAxMSwgMTQsIDEwLCAtOSwtMTEsLTEwLC0xMCwgIDIsICAyLCAgMywgIDIsCisgICAtNywgLTUsIC03LCAtMSwgLTEsICAyLCAgMCwgIDcsIC0xLCAgMSwgIDAsICA5LCAgMywgIDQsIC01LCAtMSwKKyAgIDEwLCAtMSwtMTUsIC0xLCAgNCwgIDEsIC01LCAgMiwgLTMsICAxLCAtMSwgIDEsIC0zLCAgMSwgIDQsICA0LAorICAgIDIsIC0xLCAgNCwgMTAsICA2LCAgMiwgLTEsICAwLCAgMiwgIDIsIC03LC0xMiwgLTQsICAyLCAgMCwgLTMsCisgICAtMSwgLTQsIC0xLCAtOCwgIDMsIC0xLCAgMiwgLTksICA0LCAgMCwgIDUsIC01LCAgMiwgIDAsICA4LCAgMywKKyAgICAzLCAgMiwgIDEsICAxLCAgNCwgLTIsICAwLCAgMywgIDIsIC0xLCAgNCwgIDEsICAwLCAgNiwgLTEsLTI1LAorICAgLTEsIC0yLCAtMiwgLTQsIC0zLCAgMCwgLTEsIC00LCAtMSwgLTEsIC00LCAgMiwgIDAsIC02LCAgMiwgMjUsCisgIC0xMSwgLTEsICA1LCAgMCwgIDcsICAwLCAtMiwgIDIsIDEwLCAtMSwgLTMsICA0LCAtNSwgLTUsIC0yLCAtMSwKKyAgICAwLCAgNiwgIDMsIC0xLCAtMiwgLTEsIC0xLCAgMSwgLTEsIC03LC0xMiwgLTUsICA4LCAgNiwgIDIsICA0LAorICAgIDIsICA2LCAtMSwgLTYsICA5LCAxMCwgLTEsIC00LCAgMSwgIDAsIC00LCAgMCwgIDMsIC0yLCAtOSwgLTUsCisgICAtNCwgIDMsICA0LCAgMCwgLTQsICAzLCAgMywgIDAsLTExLCAgMCwgIDMsICAyLC0xMSwgIDMsICA3LCAgMiwKKyAgICAyLCAtNCwgIDcsICAzLCAgMSwgLTgsICA3LCAgMSwgLTEsLTEyLCAgNCwgIDEsICAzLCAtOSwgIDIsICAyLAorICAgIDIsIC0yLCAtMiwgIDksLTE3LCAtMywgIDMsICAxLCAtNCwgIDcsICAxLCAtNiwgIDUsICA0LCAtMSwgIDMsCisgICAtMSwgIDIsICAwLCAtNCwgLTcsICA4LCAxMiwgLTEsIC0yLCAgNSwgIDQsIC01LCAgMywgLTUsIC04LCAtMiwKKyAgICAwLCAgMCwgLTUsIC0yLCAtMiwgLTgsICAzLCAyNywgLTEsIC00LCAtMywgIDYsIC0zLCAgMSwgLTIsIC03LAorICAgIDQsICA0LCAgMSwgLTEsIC03LC0xMCwgLTcsIC0zLCAxMCwgMTAsICA1LCAgMywgLTIsIC0yLCAtNCwgLTMsCisgICAgMCwgIDEsICA1LCAgNywgIDQsIC0yLC0xNiwtMjAsICAwLCAgNCwgIDcsICA4LCAgMiwgIDAsIC0yLCAtMSwKKyAgIC0yLCAgMSwgIDMsIDE3LCAtMywgIDEsIC0yLCAtMSwgLTEsIC0yLCAtMSwgLTIsIC0xLCAtNSwgLTEsICAwLAorICAgIDUsIC0zLCAgMSwgIDAsICA2LCAtMiwgIDAsICAwLCAtMSwgLTIsICAwLCAtMywtMTEsICAxLCAgOCwgLTEsCisgICAgMywgIDAsICAwLCAgMCwgIDAsICAyLCAgNCwgIDEsICAyLCAgMCwgIDYsICAxLCAtMiwtMTgsIC0zLCAgMiwKKyAgLTE0LCAgMCwgIDYsICAxLCAtNSwgLTIsIC0xLCAgMSwgLTEsICAxLCAgMCwgIDEsICAxLCAgNywgIDQsICAwLAorICAgLTEsICAwLCAgMSwgLTQsICAxLCAgOCwgIDMsIC00LCAtMywgIDQsICAxLCAgMywgLTYsICAxLCAtNCwgIDEsCisgICAgMSwtMTIsICAzLCAgMywgLTEsLTEwLCAgMCwgLTEsICAyLCAgMCwgIDIsICAxLCAgMywgIDIsICAyLCAgNCwKKyAgICAzLCAgMCwgIDAsICAzLCAgMiwgIDAsIC0yLCAgMSwgIDUsICAyLCAtNSwgIDAsICA2LCAtMSwtMTQsIC0xLAorICAgLTIsIC02LCAtMywgLTMsICAyLCAtMSwgIDQsICA1LCAgNiwgLTEsIC0yLCAgMCwgIDQsICA0LCAtMSwgLTUsCisgICAtNCwgIDEsLTExLCAgMCwgLTEsICAyLCAtNCwgIDEsICAyLCAtMywgIDMsIC0xLCAgMSwgLTIsIDE1LCAgMCwKKyAgICAxLCAtMSwgIDAsIC0yLCAgMSwgLTQsIC03LCAgMSwgLTIsIC02LCAtMSwgMjEsIC0yLCAgMiwgLTEsICAxLAorICAgMjEsIC0xLCAtMiwgIDAsIC0xLCAtMywgIDEsIC0yLCAtOSwgLTIsICAyLCAtMSwgIDIsICAxLCAtNCwgLTEsCisgICAgMSwgIDgsICAyLCAtNiwtMTAsIC0xLCAgNCwgIDAsIC00LCAtMywgIDMsICAzLCAgNSwgIDAsIC0xLCAtMSwKKyAgICAzLCAgMiwgIDEsIC0yLCAtMiwgLTIsICA0LCAgMywgIDUsICAyLCAtNCwtMTcsICAwLCAtMiwgIDQsICAzLAorICAgLTcsIC00LCAgMCwgIDMsICA5LCAgOSwgIDIsIC0xLC0xMSwgLTYsICAwLCAtMSwgIDUsICAxLCAgMCwgIDEsCisgICAgMCwgMTcsICA1LC0xMSwgIDMsIC0yLCAtNiwgIDAsICAyLCAtMiwgLTQsICAxLCAtNCwgIDEsICAyLCAtMSwKKyAgIC01LCAtMSwgLTUsIC0zLCAtMywgIDUsIC0zLCAtMiwgIDQsIDE2LCAgMiwgLTUsIC0yLCAgNSwgLTEsIC0xLAorICAgIDAsICAwLCAtNCwgIDEsIC0xLCAgMiwgIDUsIDExLCAtMSwgLTEsIC0yLCAgMSwgLTQsIC0yLCAtMywgLTEsCisgICAtNSwgLTEsIDEwLCAgMCwgIDYsICAxLCAgMCwgLTMsICAwLCAtNCwgIDEsICAwLCAtMiwgLTQsICAzLCAtMSwKKyAgICA2LCAgOSwgIDMsICAwLCAtMiwgIDEsIC0yLCAgMCwgLTIsIC0zLCAtMiwgLTIsICAxLCAgMCwgIDEsIC02LAorICAgIDEsICAwLCAgMiwgIDEsIC0xLCAgMywgLTIsICAxLCAgMCwgLTEsLTE1LCAgMCwgLTEsICA1LCAgMiwgIDYsCisgICAgMiwgIDAsICAyLCAgMiwgIDAsLTEyLCAtNCwgIDYsICAwLCAgMSwgIDQsIC0xLCAgMSwgIDIsICAxLCAtNCwKKyAgICAxLCAtMiwgLTcsICAwLCAgMCwgIDAsICAwLCAtMSwgLTUsICAyLCAxMSwgIDMsICAxLCAgMywgIDAsIC02LAorICAgIDAsIC0zLCAtOSwgLTQsICAxLCAgMywgLTEsICAwLCAgNCwgIDEsIC0yLCAgMCwgIDcsIC0zLCAtMSwgIDYsCisgICAgMSwgLTIsICA2LCAgMiwgIDAsIC0xLCAgMywgLTIsIC0yLCAgNCwgIDAsICAyLCAtMSwgIDIsLTE0LCAgMiwKKyAgICAyLCAgMiwgIDAsIC0xLCAtMiwgIDMsIC0zLC0xNCwgIDAsICAyLCAgMywgLTMsICA1LCAgMSwgIDMsICAyLAorICAgIDEsIC0zLCAgNCwtMTQsICAxLCAtMiwgMTEsIC0xLCAgMCwgLTEsICAzLCAgMCwgLTEsICAxLCAgMCwgIDIsCisgICAtMiwgIDMsIC0zLCAgMiwgLTQsIC0xLCAtNCwgIDMsIC0xLCAgMiwgIDEsICAzLCAtNiwgLTIsICAyLCAgNywKKyAgIC0yLCAgMSwgIDIsICAwLCAtMiwgIDAsICAwLCAtMSwgMTIsICA1LCAtMSwgIDIsIC04LCAtMSwgIDEsIC03LAorICAgIDIsIC0yLCAtNCwgIDIsIDExLCAgMCwtMTEsIC0yLCAgMywgIDEsIC0zLCAtMSwgIDAsICAzLCAgMSwgLTEsCisgICAgMCwgIDMsICAwLCAtMiwgIDAsIC02LCAtMSwgLTMsIDEyLCAtNywgLTIsICAwLCAgNywgLTIsICAxLCAgMSwKKyAgICAxLCAgMiwgIDIsICAyLCAtMSwgIDIsICAwLCAgMiwtMjMsICAwLCAgNCwgIDAsICAzLCAgMiwgIDEsICAzLAorICAgLTQsIC01LCAtMSwgIDUsIC0zLCAgNSwgMTAsIC0xLCAgMCwgIDAsICAzLCAtNCwgIDEsIC0xLCAgMiwgLTUKK307CisKKy8qIDZ4MTYtZW50cnkgY29kZWJvb2sgZm9yIGludGVyLWNvZGVkIDh4NCB2ZWN0b3JzICovCitERUNMQVJFX0FMSUdORUQoNCwgc3RhdGljIGNvbnN0IGludDhfdCwgc3ZxMV9pbnRlcl9jb2RlYm9va184eDQpWzMwNzJdID0geworICAgIDksICA4LCAgNCwgIDAsIC0zLCAtNCwgLTQsIC0zLCAgOSwgIDgsICA0LCAtMSwgLTQsIC01LCAtNSwgLTMsCisgICAgOCwgIDcsICAzLCAtMiwgLTUsIC01LCAtNSwgLTQsICA2LCAgNCwgIDEsIC0yLCAtNCwgLTUsIC00LCAtMywKKyAgLTEyLC0xNCwtMTEsIC00LCAgMSwgIDUsICA2LCAgNiwgLTgsLTEwLCAtNywgLTUsIC0yLCAgMSwgIDEsICAxLAorICAgIDUsICA0LCAgMywgIDEsICAwLCAgMCwgLTEsIC0xLCAxMywgMTMsICA5LCAgNiwgIDMsICAwLCAtMSwgLTIsCisgICAtNCwgLTQsIC0zLCAtMSwgIDEsICA0LCAgOCwgMTEsIC01LCAtNiwgLTQsIC0yLCAgMCwgIDMsICA4LCAxMiwKKyAgIC03LCAtNywgLTYsIC00LCAtMiwgIDIsICA3LCAxMCwgLTcsIC03LCAtNSwgLTQsIC0yLCAgMSwgIDUsICA4LAorICAgLTMsIC0yLCAtMSwgIDEsICAzLCAgNiwgIDcsICA2LCAgMiwgIDMsICA1LCAgNywgIDgsICA4LCAgNiwgIDQsCisgICAgNCwgIDUsICA0LCAgMywgIDEsIC0yLCAtNiwgLTcsICAxLCAgMCwgLTIsIC03LC0xMCwtMTQsLTE3LC0xNiwKKyAgIC01LCAtNCwgIDEsICA4LCAgOSwgIDMsIC0zLCAtNywgLTcsIC02LCAgMSwgMTEsIDEyLCAgNSwgLTMsIC04LAorICAgLTgsIC03LCAgMCwgIDksIDExLCAgNSwgLTMsIC03LCAtOCwgLTYsIC0xLCAgNSwgIDgsICA0LCAtMiwgLTYsCisgICAtNCwgLTUsIC03LCAtOCwgLTksIC05LCAtOCwgLTYsIC00LCAtNSwgLTYsIC03LCAtNywgLTYsIC00LCAtMiwKKyAgICAwLCAgMSwgIDIsICAzLCAgNSwgIDgsIDEwLCAgOSwgIDEsICAyLCAgMywgIDYsICA5LCAxMiwgMTQsIDEzLAorICAgIDUsICA2LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAgNSwgIDYsICA3LCAgNywgIDYsICA2LCAgNiwgIDQsCisgICAtMSwgIDAsICAxLCAgMSwgIDMsICA1LCAgNSwgIDUsLTEzLC0xNiwtMTcsLTE3LC0xNCwtMTAsIC02LCAtNCwKKyAgICA5LCAxMSwgMTMsIDE2LCAxNSwgMTMsIDEyLCAxMCwgLTQsIC01LCAtNiwgLTcsIC03LCAtNywgLTYsIC01LAorICAgLTYsIC02LCAtNywgLTcsIC03LCAtNywgLTYsIC01LCAtMiwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsCisgIC0xMSwtMTMsLTE1LC0xNiwtMTYsLTE0LC0xMiwtMTAsICAyLCAgMywgIDQsICA1LCAgNCwgIDMsICAzLCAgMywKKyAgICA2LCAgNywgIDgsICA4LCAgOCwgIDcsICA2LCAgNSwgIDMsICA0LCAgMywgIDMsICAzLCAgMywgIDMsICAzLAorICAgIDMsICA0LCAgNCwgIDEsIC0yLCAtNywtMTMsLTE3LCAgNSwgIDcsICA3LCAgNSwgIDEsIC01LC0xMywtMTksCisgICAgNiwgIDgsICA5LCAgOCwgIDUsIC0xLCAtOSwtMTYsICA2LCAgOCwgMTAsIDEwLCAgNywgIDIsIC00LC0xMSwKKyAgIDE4LCAgOSwgLTEsLTEwLC0xMywgLTksIC00LCAgMCwgMjIsIDEyLCAtMSwtMTIsLTE1LC0xMCwgLTQsICAyLAorICAgMjMsIDEzLCAgMCwtMTAsLTEzLCAtOSwgLTMsICAyLCAyMCwgMTIsICAyLCAtNiwgLTksIC02LCAtMiwgIDIsCisgICAtNiwgLTYsIC02LCAtNywgLTcsIC03LCAtNywgLTYsIC02LCAtNywgLTgsIC04LCAtOSwgLTksIC05LCAtOCwKKyAgIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgMTIsIDE1LCAxOCwgMjEsIDIxLCAxOSwgMTcsIDE0LAorICAgMTQsIDE2LCAxOCwgMTgsIDE4LCAxNiwgMTUsIDEzLCAgNSwgIDYsICA2LCAgNSwgIDUsICA0LCAgNCwgIDMsCisgICAtNiwgLTcsIC05LC0xMCwtMTAsLTEwLCAtOSwgLTcsLTEwLC0xMSwtMTMsLTE0LC0xNCwtMTMsLTEyLC0xMCwKKyAgLTI3LC0xNywgLTQsICA1LCAgOSwgMTAsIDEwLCAgNywtMzIsLTE5LCAtMywgIDcsIDExLCAxMiwgMTEsICA4LAorICAtMzAsLTE2LCAtMiwgIDgsIDEyLCAxMiwgMTAsICA3LC0yMywtMTIsICAwLCAgNywgMTAsIDExLCAgOSwgIDYsCisgICAxNiwgMTcsIDE2LCAxMiwgIDYsIC0xLCAtOCwtMTIsIDE3LCAxOCwgMTUsIDEwLCAgMSwgLTgsLTE1LC0xOCwKKyAgIDE1LCAxNCwgMTAsICA0LCAtNSwtMTQsLTIwLC0yMywgMTAsICA4LCAgNCwgLTEsIC05LC0xNiwtMjEsLTIyLAorICAtMTAsLTEyLC0xMiwtMTEsIC01LCAgNCwgMTQsIDIwLC0xMSwtMTMsLTE1LC0xMiwgLTQsICA3LCAxOSwgMjcsCisgIC0xMSwtMTMsLTE0LC0xMSwgLTMsICA4LCAyMSwgMjgsLTEwLC0xMSwtMTIsIC05LCAtMiwgIDgsIDE4LCAyNSwKKyAgIC0xLCAtMSwgLTEsICAxLCAgNCwgIDYsICA2LCAgNSwgIDAsICAwLCAgMCwgIDIsICA0LCAgMywgIDEsIC0yLAorICAgIDAsICAwLCAgMiwgIDQsICA0LCAtMSwgLTcsLTEwLCAgMCwgIDAsICAzLCAgNSwgIDMsIC0zLC0xMSwtMTUsCisgIC0xNCwtMTMsIC04LCAtMSwgIDMsICAzLCAtMSwgLTQsIC01LCAtNCwgLTEsICA0LCAgOCwgIDgsICAzLCAgMCwKKyAgICAzLCAgMiwgIDIsICAzLCAgNCwgIDUsICAzLCAgMSwgIDUsICAzLCAgMCwgLTIsIC0yLCAtMSwgLTEsIC0xLAorICAgIDksICAxLCAtNiwgLTYsIC01LCAtMywgLTIsIC0xLCAxMiwgIDEsIC02LCAtNiwgLTQsIC0yLCAtMSwgIDAsCisgICAxNCwgIDQsIC00LCAtNCwgLTIsIC0yLCAtMSwgLTEsIDE0LCAgNiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICA0LCAgNiwgIDgsIDEwLCAxMSwgIDksICA3LCAgNSwgLTEsIC0xLCAtMSwgIDAsICAwLCAtMSwgLTEsIC0yLAorICAgLTIsIC00LCAtNCwgLTUsIC01LCAtNSwgLTUsIC00LCAtMiwgLTMsIC0zLCAtNCwgLTQsIC0zLCAtMiwgLTEsCisgICAgMiwgIDMsICA0LCAgNCwgIDMsICAxLCAgMCwgIDAsIC0xLCAgMSwgIDQsICA1LCAgNiwgIDUsICA0LCAgMywKKyAgIC04LCAtNiwgLTIsICAyLCAgMywgIDQsICA0LCAgMywtMTQsLTEzLCAtOSwgLTUsIC0yLCAtMSwgIDAsICAwLAorICAgLTMsIC00LCAtNSwgLTQsICAwLCAgNywgMTIsIDEzLCAtMywgLTQsIC01LCAtNSwgLTIsICA0LCAgOSwgMTAsCisgICAtMiwgLTMsIC00LCAtNSwgLTQsIC0xLCAgMywgIDQsIC0xLCAtMSwgLTIsIC0zLCAtMywgLTIsICAwLCAgMSwKKyAgICA5LCAgNSwgLTIsIC04LC0xMSwtMTAsIC03LCAtNCwgMTIsIDEwLCAgNiwgIDIsICAwLCAtMSwgIDAsICAwLAorICAgIDIsICAyLCAgMywgIDQsICAzLCAgMSwgIDEsICAxLCAtOSwgLTgsIC00LCAgMCwgIDEsICAyLCAgMSwgIDAsCisgICAgNiwgIDgsICA4LCAgNSwgIDEsIC01LC0xMSwtMTMsICAwLCAgMSwgIDIsICAyLCAtMSwgLTQsIC04LC0xMSwKKyAgIC0zLCAtMiwgIDEsICAzLCAgMywgIDEsIC0xLCAtNCwgLTIsIC0xLCAgMiwgIDUsICA2LCAgNiwgIDQsICAxLAorICAgIDMsICA0LCAgNSwgIDUsICA0LCAgMSwgLTMsIC02LCAgNSwgIDYsICA0LCAgMiwgIDIsICAyLCAgMCwgLTMsCisgICAgNiwgIDUsICAwLCAtNSwgLTUsIC0yLCAtMSwgLTIsICA3LCAgNCwgLTMsLTExLC0xMiwgLTcsIC0zLCAtMiwKKyAgICAxLCAgMCwgLTEsIC0xLCAtMSwgIDAsICAwLCAgMCwgIDIsICAzLCAgNCwgIDQsICA1LCAgNSwgIDQsICAzLAorICAgLTcsIC05LCAtOSwtMTAsLTEwLCAtOSwgLTcsIC02LCAgMywgIDQsICA1LCAgNiwgIDUsICA1LCAgNSwgIDUsCisgICAtNywgLTcsIC03LCAtNywgLTYsIC02LCAtNSwgLTQsIC01LCAtNCwgLTMsIC0xLCAtMSwgLTEsICAwLCAgMCwKKyAgIC0zLCAtMiwgIDEsICA0LCAgNSwgIDUsICA1LCAgNSwgLTIsIC0xLCAgMywgIDYsICA5LCAxMCwgMTAsICA5LAorICAtMTQsICAxLCAxMCwgIDMsIC0yLCAgMCwgIDEsICAxLC0xNiwgIDIsIDEzLCAgMywgLTMsIC0xLCAgMSwgIDAsCisgIC0xNSwgIDIsIDEyLCAgMywgLTQsIC0yLCAgMSwgIDEsLTEwLCAgMywgMTAsICAyLCAtMywgLTEsICAxLCAgMSwKKyAgICAwLCAgMSwgIDQsICAyLCAtNSwtMTAsIC0zLCAxMSwgLTEsICAxLCAgNCwgIDIsIC02LC0xMywgLTIsIDE1LAorICAgLTEsICAwLCAgMywgIDEsIC02LC0xMiwgLTEsIDE1LCAtMSwgIDEsICAyLCAgMSwgLTQsIC04LCAgMCwgMTEsCisgICAxMCwgIDUsIC0yLCAtMiwgIDIsICA1LCAgMSwgLTQsICA3LCAgMCwgLTgsIC02LCAgMSwgIDUsICAyLCAtNCwKKyAgICAyLCAtNSwtMTIsIC03LCAgMiwgIDcsICA0LCAtMSwgLTEsIC03LC0xMCwgLTQsICA0LCAgOSwgIDcsICAyLAorICAgLTUsIC01LCAtNCwgLTYsIC02LCAtNSwgLTUsIC0zLCAtMSwgLTIsIC0yLCAtNCwgLTUsIC02LCAtNSwgLTQsCisgICAgNiwgIDcsICA3LCAgNCwgIDAsIC0yLCAtMywgLTMsIDEzLCAxNCwgMTMsIDEwLCAgNSwgIDEsIC0xLCAtMiwKKyAgICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgLTUsIC02LCAtOCwgLTksIC05LCAtOCwgLTcsIC02LAorICAgIDcsICA5LCAxMCwgMTEsIDExLCAgOSwgIDcsICA1LCAtMSwgLTIsIC0zLCAtMywgLTQsIC00LCAtNCwgLTMsCisgICAtMSwgLTEsICAwLCAgMCwgIDAsICAwLCAtMSwgLTEsIC0zLCAtMywgLTQsIC01LCAtNCwgLTMsIC0zLCAtMiwKKyAgICAyLCAgMSwgLTEsIC0zLCAtMywgLTIsIC0xLCAgMCwgMTIsIDEyLCAgOCwgIDMsICAxLCAgMCwgIDAsICAxLAorICAgLTYsIC04LCAtOCwgLTYsIC0yLCAgMiwgIDYsICA4LCAgMSwgIDEsIC0xLCAtMiwgIDAsICAzLCAgNSwgIDcsCisgICAgMywgIDMsICAxLCAtMSwgLTEsICAwLCAgMCwgIDIsICAwLCAgMSwgIDAsIC0xLCAtMSwgLTEsIC0yLCAtMSwKKyAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAyLCAgNCwgIDIsICAxLCAgMywgIDQsICAzLCAgMSwgIDAsICAyLAorICAgIDIsICAxLCAgMCwgIDAsIC0xLCAtMSwgIDAsICAzLCAgNSwgIDEsIC02LC0xMiwtMTMsIC04LCAtMSwgIDQsCisgICAtMiwgIDAsIC0xLCAtMiwgLTEsICAwLCAgMiwgIDMsIC02LCAtMywgLTIsICAwLCAgMSwgIDEsICAxLCAgMSwKKyAgIC05LCAtNSwgIDAsICA0LCAgNSwgIDMsICAxLCAgMCwgLTgsIC0zLCAgMywgIDcsICA4LCAgNCwgIDEsICAwLAorICAgIDEsICAyLCAgMiwgIDMsICAzLCAgMSwgLTEsIC0zLCAgNCwgIDUsICA1LCAgNiwgIDYsICA1LCAgMiwgIDAsCisgICAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAtMiwgLTQsIC0zLCAtMywgLTQsIC0zLCAtMywgLTQsIC03LCAtOCwKKyAgIDE0LCAxMiwgIDYsIC0xLCAtMywgLTMsICAwLCAgMCwgIDcsICA1LCAgMSwgLTMsIC01LCAtNCwgLTIsIC0xLAorICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTEsIC0xLCAtNiwgLTQsIC0xLCAgMSwgIDEsICAxLCAgMCwgLTEsCisgICAgMiwgIDIsICAxLCAtMywgLTYsIC03LCAtNiwgLTMsICAxLCAgMCwgLTEsIC0zLCAtMiwgIDEsICA0LCAgNiwKKyAgICAwLCAgMCwgIDEsICAyLCAgNCwgIDcsICA4LCAgNywgIDAsICAwLCAgMCwgIDAsIC0xLCAtNCwgLTcsIC04LAorICAgIDAsICAyLCAgMSwgLTIsIC0zLCAtMywgLTIsIC0xLCAtMSwgIDEsICAwLCAtMywgLTUsIC0yLCAgMCwgIDIsCisgICAtMiwgLTEsIC0yLCAtNSwgLTQsICAxLCAgNiwgIDksIC0zLCAtMiwgLTMsIC00LCAtMiwgIDUsIDExLCAxMywKKyAgIC00LCAtMiwgIDIsICA2LCAgNCwgLTMsLTEwLC0xNCwgLTIsIC0xLCAgMSwgIDQsICA0LCAgMSwgLTEsIC0yLAorICAgIDAsICAwLCAtMSwgLTIsIC0yLCAgMCwgIDQsICA2LCAgMiwgIDIsICAwLCAtMywgLTMsICAwLCAgNSwgIDksCisgICAtNCwgLTQsIC0yLCAgMSwgIDYsICA5LCAgMywgLTcsIC0yLCAtMiwgLTIsIC0xLCAgNCwgIDgsICAwLC0xMSwKKyAgICAxLCAgMSwgIDAsICAwLCAgMiwgIDYsIC0xLC0xMCwgIDIsICAyLCAgMSwgIDAsICAyLCAgNCwgIDAsIC03LAorICAgLTEsIC0yLCAtMywgLTYsIC03LCAtOCwgLTgsIC04LCAgMiwgIDMsICAzLCAgMSwgLTEsIC0yLCAtMywgLTQsCisgICAgNSwgIDUsICA1LCAgNCwgIDMsICAyLCAgMCwgLTEsICAzLCAgMywgIDMsICAzLCAgMiwgIDIsICAxLCAgMSwKKyAgICAzLCAgMywgIDIsIC0yLCAtMywgIDAsICA3LCAxMCwgIDEsICAyLCAgMiwgLTIsIC01LCAtNCwgIDAsICAzLAorICAgIDAsICAzLCAgNCwgIDIsIC0zLCAtNSwgLTYsIC00LCAgMCwgIDIsICA0LCAgNCwgIDEsIC00LCAtNywgLTcsCisgICAgMiwgIDQsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsIC00LCAtNCwgLTMsIC01LCAtNSwgLTMsIC0zLCAtMiwKKyAgIC0zLCAtNCwgLTQsIC01LCAtNCwgLTIsIC0yLCAtMiwgIDEsICAxLCAgMCwgIDAsICAyLCAgNCwgIDUsICA0LAorICAgLTIsICAwLCAgMywgIDQsICA0LCAgMywgIDIsICAyLCAtOSwgLTcsIC00LCAgMCwgIDMsICA2LCAgNiwgIDYsCisgICAtNSwgLTUsIC0zLCAtMiwgIDAsICAxLCAgMywgIDQsICA1LCAgNSwgIDIsIC0yLCAtNCwgLTYsIC01LCAtMywKKyAgICAxLCAtNiwgLTQsICA3LCAgNSwgLTIsIC0yLCAgMSwgIDUsIC01LCAtNCwgIDYsICA0LCAtNSwgLTQsICAxLAorICAgIDUsIC01LCAtNCwgIDYsICA0LCAtNSwgLTMsICAxLCAgMSwgLTcsIC0zLCAgOCwgIDcsIC0xLCAtMywgIDEsCisgICAtOCwgLTcsIC00LCAgMCwgIDIsICA0LCAgNSwgIDUsICA1LCAgNiwgIDUsICAyLCAtMSwgLTUsIC03LCAtNywKKyAgICA1LCAgNiwgIDQsICAxLCAtMywgLTUsIC02LCAtNSwgLTcsIC03LCAtNSwgLTIsICAxLCAgNiwgIDksIDEwLAorICAgIDYsICAzLCAgMCwgIDEsICAzLCAgMCwgLTgsLTE0LCAgMywgIDAsIC0xLCAgMSwgIDQsICAzLCAgMCwgLTQsCisgICAgMSwgIDAsICAwLCAgMSwgIDIsICAxLCAgMSwgIDEsIC0xLCAtMSwgIDEsICAyLCAgMSwgLTEsIC0xLCAgMCwKKyAgICAxLCAgMSwgIDEsICAxLCAgMCwgLTIsIC0zLCAgMCwgIDEsICAyLCAgMSwgIDAsIC0yLCAtOCwgLTksIC00LAorICAgIDEsICAzLCAgMywgIDIsICAxLCAtMywgLTMsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgNCwgIDgsCisgICAgMiwgIDUsICA5LCAgNywgIDIsIC0xLCAtMSwgIDEsIC00LCAtMSwgIDEsICAwLCAtMywgLTQsIC0xLCAgMiwKKyAgIC0zLCAgMCwgIDMsICAzLCAgMCwgLTEsICAwLCAgMiwgLTQsIC0xLCAgMSwgIDEsIC0yLCAtNCwgLTUsIC00LAorICAgIDEsIC0xLCAtMiwgLTIsIC0xLCAgMiwgIDQsICA1LCAgMiwgIDEsICAxLCAgMCwgLTEsIC0xLCAgMCwgIDAsCisgICAgMiwgIDMsICA0LCAgNSwgIDQsICAyLCAgMSwgIDAsIC05LCAtOSwgLTYsIC0zLCAtMSwgLTEsIC0xLCAtMSwKKyAgIC02LCAtNiwgIDQsICA3LCAgMCwgLTIsIC0xLCAtMiwgLTEsIC0yLCAgNSwgIDYsIC0xLCAtMiwgIDAsIC0xLAorICAgIDQsIC0xLCAgMSwgIDAsIC00LCAtMiwgIDAsIC0yLCAgNywgIDEsIC0xLCAtMiwgLTMsICAxLCAgMywgIDEsCisgICAgNCwgIDIsICAxLCAgMywgIDMsICAxLCAgMSwgIDIsICAyLCAtMiwgLTQsICAwLCAgMywgIDEsICAwLCAgMCwKKyAgICAxLCAtNCwgLTgsIC00LCAgMSwgIDIsICAxLCAgMCwgIDIsIC0zLCAtOSwgLTYsICAwLCAgMywgIDMsICAyLAorICAgLTEsIC0xLCAgMCwgLTEsIC0xLCAgMCwgIDEsICAyLCAgMywgIDEsIC00LCAtOCwgLTcsIC0zLCAgMSwgIDIsCisgICAgMiwgLTEsIC0zLCAtMiwgLTEsICAwLCAgMSwgIDAsIC0xLCAgMCwgIDUsIDExLCAgOSwgIDMsIC0xLCAtMywKKyAgIC0xLCAtMiwgLTIsIC0xLCAgMSwgIDEsICAxLCAgMSwgIDAsIC0xLCAgMCwgIDMsICA2LCAgNiwgIDUsICA1LAorICAgIDIsICAxLCAtMSwgLTEsIC0yLCAtNSwgLTYsIC00LCAgMiwgIDIsICAyLCAgMSwgLTEsIC00LCAtNSwgLTUsCisgICAtMSwgLTMsIC02LCAtNywgLTYsIC00LCAtMSwgIDEsICA1LCAgNSwgIDMsICA0LCAgNCwgIDMsICA0LCAgNSwKKyAgIC0xLCAtMiwgLTMsIC0yLCAtMiwgLTIsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDIsICAzLAorICAgLTYsIC02LCAtNCwgLTEsICAyLCAgMiwgIDIsICAyLCAtNiwgLTcsIC01LCAtMiwgIDAsIC0xLCAtMSwgIDAsCisgICAgMiwgIDIsICAyLCAgNCwgIDQsICAzLCAgMywgIDQsICAyLCAgMSwgIDAsIC0xLCAgMCwgIDAsICAyLCAgNCwKKyAgIDEyLCAgNSwgLTUsIC04LCAtNSwgIDAsICAyLCAgMiwgIDIsIC0zLCAtNiwgLTMsICAwLCAgMCwgLTEsIC0yLAorICAgLTIsIC0zLCAtMSwgIDMsICA0LCAgMSwgLTIsIC0zLCAgMiwgIDIsICAzLCAgNCwgIDMsICAxLCAtMSwgLTEsCisgICAgMywgIDIsICAxLCAgMCwgIDEsICA0LCAgMywgIDAsICA0LCAgMywgIDAsIC01LCAtNiwgIDAsICAzLCAgMywKKyAgICAyLCAgMywgIDEsIC03LC0xMiwgLTYsICAxLCAgMywgIDEsICAzLCAgNCwgLTEsIC02LCAtNCwgIDAsICAxLAorICAgLTksIC00LCAgMiwgIDYsICA3LCAgNCwgIDEsICAwLCAtNywgLTEsICA0LCAgNiwgIDQsICAwLCAtMywgLTMsCisgICAtNiwgIDAsICA0LCAgNCwgIDEsIC0yLCAtMywgLTIsIC00LCAgMSwgIDMsICAyLCAgMCwgLTIsIC0xLCAgMCwKKyAgICAwLCAgNSwgIDIsIC01LCAtMywgIDMsICAxLCAtNCwgLTIsICA0LCAgMiwgLTYsIC0zLCAgNiwgIDQsIC0zLAorICAgLTEsICA1LCAgMywgLTUsIC0xLCAgNywgIDMsIC00LCAtMSwgIDIsICAwLCAtNiwgLTMsICA1LCAgMywgLTMsCisgICAtOCwgLTMsICAzLCAgNSwgIDMsICAxLCAtMiwgLTIsICAyLCAgNCwgIDQsIC0yLCAtNCwgLTMsICAxLCAgMywKKyAgICAyLCAgMSwgLTMsIC01LCAtMywgIDMsICA0LCAgMywgLTUsIC02LCAtNSwgIDMsIDEwLCAgOCwgLTEsIC01LAorICAgIDAsICAzLCAgMiwgLTQsIC05LCAtNywgIDAsICA2LCAtNSwgLTEsICA1LCAgNywgIDQsIC0xLCAtMywgLTMsCisgICAtNSwgLTUsIC0yLCAgMywgIDYsICA1LCAtMSwgLTQsICA5LCAgNiwgIDAsIC00LCAtMiwgIDEsICAxLCAtMSwKKyAgIC0xLCAtMSwgLTEsICAxLCAgMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAtMSwgLTEsICAwLAorICAgIDIsICAxLCAtMiwgLTEsICAxLCAgMSwgIDAsICAwLCAxMiwgIDgsICAyLCAtMSwgLTEsIC00LCAtNywgLTcsCisgICAgMiwgIDEsICAzLCAgNiwgIDcsICA0LCAgMiwgIDAsICAxLCAgMCwgLTEsICAwLCAtMSwgLTQsIC03LCAtOCwKKyAgICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsIC0xLCAtMywgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsIC0yLAorICAgLTEsICAwLCAgMSwgIDEsICAwLCAgMCwgLTEsIC0yLCAgMCwgIDAsIC0xLCAtMywgLTQsIC0zLCAtMSwgIDEsCisgICAtMSwgIDAsICAwLCAgMCwgIDEsICA0LCAxMCwgMTIsIC0xLCAgMCwgLTIsIC0yLCAtMywgLTMsIC0xLCAgMSwKKyAgIC0zLCAtMSwgLTIsIC00LCAgMiwgIDksICA5LCAgNywgLTMsICAwLCAtMSwgLTMsICAwLCAgMiwgLTEsICAxLAorICAgLTEsICAxLCAtMiwgLTMsICAwLCAtMSwgLTMsICAwLCAgMCwgIDAsIC0zLCAtMiwgIDAsIC0xLCAtMSwgIDEsCisgICAtMSwgLTIsIC0xLCAtMSwgLTIsIC0xLCAtMSwgLTIsICAyLCAtMSwgLTIsIC0xLCAgMCwgIDEsICAwLCAtMiwKKyAgICAzLCAtMSwgLTIsICAyLCAgNSwgIDMsIC0xLCAtMywgIDEsIC01LCAtNSwgIDEsICA2LCAgNiwgIDIsICAwLAorICAgIDEsICAyLCAgMCwgLTEsICAwLCAgMSwgIDAsIC0yLCAtNSwgLTMsIC0xLCAgMCwgIDEsICAyLCAgMSwgLTIsCisgICAtNywgLTUsIC0yLCAtMiwgLTIsIC0yLCAgMCwgIDEsIC0xLCAgMCwgIDEsICAxLCAgMCwgIDMsICA5LCAxMiwKKyAgICAwLCAgNiwgIDUsICAxLCAtMiwgLTMsICAwLCAgMywgIDAsICA2LCAgNSwgIDEsICAxLCAgMSwgIDIsICAzLAorICAgLTUsIC0yLCAtMiwgLTMsICAwLCAgMCwgIDAsICAwLCAtNiwgLTMsIC0zLCAtMiwgIDAsICAwLCAtMSwgLTIsCisgICAgNCwgIDQsICAyLCAgMSwgIDAsIC0xLCAtMSwgIDAsIC0yLCAtMiwgIDAsICAxLCAgMiwgIDEsICAxLCAgMCwKKyAgICAyLCAgMiwgIDEsIC0xLCAtMywgLTUsIC05LC0xMCwgIDIsICAxLCAtMSwgLTEsICAxLCAgNCwgIDQsICAxLAorICAgIDQsICAwLCAtMiwgLTIsIC0yLCAtMiwgLTEsICAwLCAgNywgIDEsIC00LCAtMywgLTIsICAwLCAgMSwgIDEsCisgICAxMCwgIDUsIC0xLCAtMiwgIDAsICAxLCAgMSwgIDAsICA1LCAgMSwgLTMsIC00LCAtMywgLTEsIC0xLCAtMiwKKyAgICAyLCAgMSwgLTEsIC0zLCAtMywgIDEsICAxLCAtMSwgLTIsIC0xLCAgMywgIDAsIC0xLCAgMSwgIDEsICAwLAorICAgLTMsICAxLCAgNywgIDIsIC0zLCAtMiwgLTEsICAwLCAtMiwgIDQsICA4LCAtMSwgLTgsIC01LCAgMCwgIDIsCisgICAtNCwgLTEsICAxLCAgMiwgIDEsIC0zLCAtNCwgLTIsIC01LCAtMywgLTIsICAxLCAgNCwgIDQsICA0LCAgNiwKKyAgIC0zLCAtMiwgLTQsIC0zLCAgMCwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDEsICAyLCAgMSwgLTEsIC0xLAorICAgLTQsIC0xLCAgMCwgLTEsIC0zLCAtMywgLTEsIC0xLCAgMSwgIDQsICA0LCAgMiwgIDAsIC0xLCAtMiwgLTMsCisgICAgNCwgIDYsICA1LCAgMywgIDIsICAxLCAtMiwgLTQsICAwLCAgMSwgIDEsICAxLCAgMSwgLTEsIC00LCAtNiwKKyAgICAxLCAgMiwgIDIsIC0xLCAtNiwgLTUsIC0xLCAgMiwgLTMsIC0yLCAgMSwgIDEsIC00LCAtMywgIDIsICA1LAorICAgLTIsIC0xLCAgMiwgIDIsIC0zLCAtNCwgIDAsICAzLCAtMiwgLTIsICAyLCAgNiwgIDUsICAyLCAgMSwgIDIsCisgICAgMiwgLTMsIC0zLCAgMCwgIDAsICAyLCAgMywgIDEsICAzLCAtMSwgIDEsICAzLCAgMSwgIDIsIC0xLCAtNSwKKyAgIC01LCAtNywgLTQsIC0yLCAgMSwgIDgsICA4LCAgMSwgLTEsICAwLCAgMiwgIDAsIC0zLCAgMCwgIDEsIC0zLAorICAgLTIsIC01LCAtNSwgLTIsIC0zLCAtMSwgIDAsIC0yLCAtMSwgLTQsICAwLCAgNCwgIDAsICAyLCAgNCwgIDAsCisgICAgMCwgIDAsICA4LCAxMCwgIDIsICAxLCAgMywgLTEsIC00LCAtMywgIDIsICAzLCAtMywgLTMsICAxLCAtMSwKKyAgICAxLCAtMiwgLTQsICAyLCAgNywgIDMsIC0yLCAtMSwgIDYsICA0LCAtMiwgLTEsICAyLCAgMCwgLTEsICAzLAorICAgIDEsICAxLCAtMiwgLTIsIC0yLCAtNSwgLTMsICA0LCAtNiwgLTIsICAxLCAgMSwgLTEsIC00LCAtMiwgIDQsCisgICAtMiwgLTEsIC0yLCAtMiwgIDAsICAxLCAgMCwgLTIsIC0xLCAgMSwgIDAsIC0xLCAgMCwgIDAsIC0xLCAtMywKKyAgICAwLCAgMSwgLTIsIC00LCAtMywgLTEsICAwLCAgMCwgIDYsICA4LCAgNSwgIDAsICAwLCAgMSwgIDIsICAzLAorICAgLTIsIC0yLCAgMiwgIDUsICAyLCAgMCwgIDAsICAxLCAgMiwgLTIsIC0yLCAtMSwgLTEsICAxLCAgMiwgIDQsCisgICAgMiwgLTEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDEsIC04LCAtNywgLTEsICAxLCAtMSwgLTEsICAxLCAgMywKKyAgICAwLCAgMywgIDYsICAyLCAtMiwgIDEsICAyLCAgMCwtMTAsIC03LCAtMSwgIDAsIC0zLCAtMSwgIDIsICAxLAorICAgIDAsICAwLCAgMiwgIDIsICAxLCAgMSwgIDEsIC0xLCAgMywgIDAsIC0yLCAtMiwgIDAsICAyLCAgMSwgIDAsCisgICAgOCwgIDEsICAwLCAgMCwgLTIsIC0zLCAtMSwgIDAsICAyLCAtMiwgIDIsICA1LCAgMSwgLTIsIC0xLCAgMSwKKyAgIC0zLCAtNiwgLTMsIC0xLCAtMywgLTMsIC0xLCAgMiwgIDIsICAwLCAgMSwgIDIsICAyLCAgMSwgIDAsICAwLAorICAgIDEsIC0xLCAtMSwgLTIsIC0xLCAgMCwgIDEsICAwLCAxNSwgIDksICAyLCAtMSwgLTIsIC0zLCAtMywgLTMsCisgICAgMCwgLTMsIC0yLCAgMCwgIDAsIC0xLCAtMSwgLTEsICAxLCAgMCwgIDEsICAwLCAgMCwgLTEsIC0xLCAtMSwKKyAgICAwLCAgMiwgIDIsIC0yLCAtMywgLTMsIC03LCAtOCwgIDAsICAyLCAgMiwgIDAsICAxLCAgMiwgIDEsICAxLAorICAgIDEsICAyLCAgMiwgIDIsICAzLCAgMSwgIDAsICAzLCAgMSwgIDAsIC0xLCAtMiwgLTEsIC0yLCAgMCwgIDUsCisgIC0xMSwgLTYsIC0xLCAgMSwgIDIsICAzLCAgMSwgLTMsICAxLCAgNCwgIDMsIC0xLCAtMiwgIDEsICAyLCAtMSwKKyAgICAyLCAgMiwgIDEsIC0xLCAtMiwgIDAsICAxLCAtMSwgIDAsICAwLCAtMSwgLTEsICAwLCAgMiwgIDMsICAyLAorICAgIDEsICAxLCAgMiwgIDEsIC0xLCAgMSwgIDAsIC00LCAgMCwgIDAsICAwLCAtMiwgLTIsICAyLCAgNCwgLTIsCisgICAtMiwgLTMsICAwLCAgMCwgLTEsICAyLCAgMSwgLTYsICAwLCAgMiwgIDUsICA1LCAgMywgIDIsIC0xLCAtNywKKyAgICA0LCAgMiwgIDAsICAwLCAgMywgIDMsICAxLCAtMSwgIDAsIC0xLCAtMSwgIDMsICA2LCAgNCwgIDEsIC0xLAorICAgLTIsIC0yLCAgMCwgIDIsICAyLCAgMCwgLTIsIC0yLCAtMSwgIDAsIC0xLCAtNSwgLTcsIC01LCAtMSwgIDEsCisgICAgNSwgLTEsIC0yLCAgMCwgIDIsICA0LCAgMiwgLTUsICAwLCAtNSwgLTIsICAyLCAgMSwgIDIsICAwLCAtNiwKKyAgICA2LCAgMSwgIDAsICAxLCAtMiwgLTEsICA0LCAgMiwgIDIsIC0zLCAtMywgIDAsIC0xLCAtMiwgIDAsICAwLAorICAgIDEsIC0xLCAgMCwgIDIsICAwLCAgMCwgIDYsIDExLCAgMiwgLTEsIC0xLCAgMCwgLTMsIC0yLCAgMywgIDUsCisgICAgMCwgLTIsIC0xLCAgMCwgLTEsICAwLCAgMCwgLTMsICAxLCAtMSwgLTEsIC0xLCAtMiwgLTEsIC0zLCAtNywKKyAgICAxLCAgMSwgLTIsIC0yLCAgMSwgIDMsICAxLCAtMiwgLTEsICAyLCAgMCwgLTEsIC0xLCAgMSwgIDAsICAwLAorICAgLTQsICAyLCAgMywgLTEsIC0yLCAtMiwgIDAsICAxLC0xMSwgLTIsICA0LCAgNSwgIDYsICAyLCAtMSwgLTIsCisgICAtNiwgLTIsICAxLCAtMSwgLTMsIC00LCAgMSwgIDksIC0zLCAgMCwgIDMsICAzLCAgMiwgLTMsIC0zLCAgMywKKyAgICAxLCAgMSwgIDAsICAwLCAgMSwgLTEsIC0yLCAgMywgIDIsICAwLCAtMywgLTMsICAwLCAtMSwgLTEsICAzLAorICAgIDEsIC0xLCAtMywgIDEsICAyLCAtNiwgLTQsICA2LCAgMCwgLTIsIC01LCAtMiwgIDAsIC0zLCAtMiwgIDMsCisgICAgMiwgIDIsICAxLCAtMiwgLTIsICAxLCAgMiwgLTEsIC0xLCAgMSwgIDEsIC0yLCAtMSwgIDYsICA3LCAtMSwKKyAgICAxLCAgMCwgLTQsIC0yLCAgMSwgLTIsIC0zLCAgMSwgLTQsICAwLCAtMywgLTIsICAyLCAgMCwgLTMsICAwLAorICAgLTMsICA0LCAgMywgIDEsICA4LCAgNywgIDAsIC0xLCAtMywgIDQsICAxLCAtNCwgIDIsICAzLCAtMiwgLTMsCisgICAtMywgIDYsICAxLCAtNCwgIDEsICAxLCAtMSwgLTEsIC0yLCAgNCwgLTMsIC0zLCAgMywgIDAsIC0xLCAtMSwKKyAgICAxLCAgMiwgLTQsICAyLCAgNCwgLTMsIC0xLCAgMiwgIDMsIC0xLCAtNCwgIDUsICA0LCAtNiwgLTMsICAyCit9OworCisvKiA2eDE2LWVudHJ5IGNvZGVib29rIGZvciBpbnRlci1jb2RlZCA4eDggdmVjdG9ycyAqLworREVDTEFSRV9BTElHTkVEKDQsIHN0YXRpYyBjb25zdCBpbnQ4X3QsIHN2cTFfaW50ZXJfY29kZWJvb2tfOHg4KVs2MTQ0XSA9IHsKKyAgIC00LCAtMywgIDQsICA1LCAgMiwgIDEsICAxLCAgMCwgLTUsIC0zLCAgNSwgIDUsICAyLCAgMSwgIDAsICAwLAorICAgLTYsIC00LCAgNSwgIDUsICAyLCAgMSwgIDAsICAwLCAtNywgLTQsICA0LCAgNSwgIDIsICAxLCAgMCwgIDAsCisgICAtOCwgLTUsICAzLCAgNCwgIDIsICAxLCAgMCwgIDAsIC04LCAtNiwgIDMsICA0LCAgMSwgIDEsICAxLCAgMCwKKyAgIC04LCAtNiwgIDIsICA0LCAgMiwgIDEsICAxLCAgMCwgLTgsIC02LCAgMiwgIDQsICAxLCAgMSwgIDEsICAxLAorICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsCisgICAtMiwgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0yLCAtMywgLTMsIC0zLCAtMywgLTMsIC00LCAtMywKKyAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTMsIC0zLCAtMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgLTEsIC0xLAorICAgIDQsICA1LCAgNSwgIDUsICA0LCAgMywgIDMsICAyLCAgNywgIDcsICA4LCAgOCwgIDgsICA3LCAgNiwgIDUsCisgICAgMiwgIDEsICAyLCAgNCwgIDQsICAwLCAtNCwgLTYsICAxLCAgMSwgIDIsICA1LCAgNSwgIDEsIC01LCAtNywKKyAgICAxLCAgMiwgIDEsICA0LCAgNSwgIDEsIC01LCAtOCwgIDEsICAxLCAgMSwgIDUsICA1LCAgMCwgLTYsIC04LAorICAgIDAsICAxLCAgMSwgIDUsICA2LCAgMSwgLTYsIC05LCAgMCwgIDAsICAxLCAgNCwgIDUsICAwLCAtNSwgLTgsCisgICAgMCwgIDAsICAxLCAgNCwgIDUsICAwLCAtNSwgLTcsICAwLCAgMCwgIDEsICA0LCAgNCwgIDEsIC00LCAtNywKKyAgICAxLCAgMiwgIDMsICAwLCAtMywgLTQsIC0zLCAtMSwgIDEsICAzLCAgNCwgIDAsIC0zLCAtNCwgLTMsIC0xLAorICAgIDIsICA0LCAgNSwgIDEsIC0zLCAtNCwgLTMsIC0yLCAgMiwgIDUsICA2LCAgMSwgLTMsIC01LCAtNCwgLTIsCisgICAgMywgIDYsICA2LCAgMSwgLTMsIC01LCAtNCwgLTIsICAzLCAgNiwgIDYsICAxLCAtMywgLTUsIC00LCAtMiwKKyAgICAzLCAgNiwgIDYsICAxLCAtMywgLTUsIC00LCAtMiwgIDMsICA1LCAgNSwgIDEsIC0zLCAtNCwgLTQsIC0yLAorICAgIDIsICAyLCAgMiwgIDIsICAxLCAgMCwgIDAsIC0xLCAgNCwgIDQsICA0LCAgMywgIDIsICAxLCAgMSwgIDAsCisgICAgNCwgIDUsICA0LCAgNCwgIDMsICAzLCAgMiwgIDEsICA0LCAgNCwgIDQsICA0LCAgNCwgIDMsICAyLCAgMiwKKyAgICAyLCAgMywgIDMsICAzLCAgMywgIDMsICAyLCAgMSwgLTEsIC0xLCAtMSwgLTEsICAwLCAgMCwgIDAsICAwLAorICAgLTUsIC02LCAtNiwgLTUsIC01LCAtNCwgLTMsIC0zLCAtNywgLTksIC05LCAtOCwgLTcsIC02LCAtNiwgLTUsCisgICAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsICAzLCAgMywgIDMsICAzLCAgMiwKKyAgICAwLCAtMSwgLTEsIC0xLCAtMiwgLTIsIC0xLCAtMSwgLTMsIC01LCAtNiwgLTYsIC02LCAtNiwgLTUsIC00LAorICAgLTMsIC01LCAtNiwgLTcsIC02LCAtNiwgLTUsIC00LCAtMSwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgLTEsCisgICAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywKKyAgICAyLCAgMSwgLTIsIC01LCAtNCwgIDAsICAyLCAgNSwgIDIsICAxLCAtMiwgLTYsIC01LCAgMCwgIDMsICA1LAorICAgIDIsICAxLCAtMiwgLTYsIC02LCAtMSwgIDMsICA2LCAgMywgIDIsIC0yLCAtNywgLTYsICAwLCAgNCwgIDcsCisgICAgMiwgIDEsIC0yLCAtNywgLTUsICAwLCAgNSwgIDcsICAyLCAgMSwgLTIsIC02LCAtNSwgIDAsICA0LCAgNywKKyAgICAyLCAgMSwgLTIsIC02LCAtNCwgIDAsICA0LCAgNiwgIDEsICAxLCAtMiwgLTUsIC00LCAgMCwgIDMsICA2LAorICAtMTAsIC05LCAtNiwgLTQsIC0xLCAgMiwgIDMsICAyLC0xMCwgLTksIC01LCAtMywgIDAsICA0LCAgNCwgIDMsCisgICAtOSwgLTcsIC0zLCAtMSwgIDIsICA1LCAgNSwgIDMsIC03LCAtNSwgLTIsICAwLCAgMywgIDUsICA1LCAgMywKKyAgIC02LCAtMywgIDAsICAxLCAgNCwgIDYsICA1LCAgMywgLTQsIC0yLCAgMSwgIDIsICAzLCAgNSwgIDQsICAyLAorICAgLTIsICAwLCAgMSwgIDIsICAyLCAgNCwgIDMsICAxLCAtMSwgIDEsICAyLCAgMiwgIDIsICAzLCAgMywgIDEsCisgICAtNCwgLTUsIC01LCAtNiwgLTYsIC02LCAtNiwgLTUsIC0zLCAtMywgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwKKyAgICAwLCAgMCwgIDAsICAwLCAtMSwgLTEsIC0xLCAtMSwgIDUsICA1LCAgNiwgIDUsICA1LCAgNCwgIDMsICAyLAorICAgIDUsICA2LCAgNywgIDcsICA3LCAgNiwgIDUsICA0LCAgMywgIDMsICA0LCAgNCwgIDQsICA0LCAgMywgIDIsCisgICAgMCwgLTEsICAwLCAgMCwgLTEsIC0xLCAgMCwgLTEsIC0zLCAtMywgLTQsIC00LCAtNCwgLTQsIC0zLCAtMywKKyAgICAxLCAtMiwgLTUsICAxLCAgNSwgIDQsICAyLCAgMCwgIDEsIC0zLCAtNiwgIDEsICA2LCAgNSwgIDIsICAwLAorICAgIDAsIC00LCAtNywgIDAsICA2LCAgNiwgIDIsICAxLCAtMSwgLTUsIC05LCAtMSwgIDYsICA2LCAgMywgIDEsCisgICAtMSwgLTYsLTEwLCAtMiwgIDYsICA2LCAgMywgIDEsIC0xLCAtNiwgLTksIC0yLCAgNSwgIDYsICAzLCAgMSwKKyAgIC0yLCAtNiwgLTksIC0yLCAgNSwgIDUsICAzLCAgMSwgLTIsIC02LCAtNywgLTIsICA0LCAgNCwgIDIsICAxLAorICAgLTUsIC03LCAtOCwgLTksIC05LCAtOCwgLTcsIC02LCAtNSwgLTYsIC02LCAtNywgLTcsIC02LCAtNiwgLTUsCisgICAtMywgLTMsIC0zLCAtNCwgLTUsIC01LCAtNCwgLTQsIC0xLCAgMCwgIDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAwLCAgMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgIDIsICAzLCAgNCwgIDUsICA1LCAgNSwgIDUsICA0LAorICAgIDMsICA0LCAgNSwgIDYsICA4LCAgOCwgIDgsICA3LCAgMywgIDQsICA1LCAgNiwgIDcsICA3LCAgNywgIDYsCisgICAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMCwgIDksICAzLCAgNCwgIDYsICA3LCAgOCwgIDksICA5LCAgOCwKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA1LCAgNSwgLTEsIC0yLCAtMSwgLTEsICAwLCAgMSwgIDIsICAyLAorICAgLTIsIC0zLCAtMywgLTMsIC0zLCAtMiwgLTEsICAwLCAtMywgLTQsIC01LCAtNSwgLTUsIC01LCAtNSwgLTQsCisgICAtNCwgLTUsIC01LCAtNiwgLTcsIC03LCAtNiwgLTUsIC0zLCAtNCwgLTUsIC02LCAtNywgLTcsIC02LCAtNiwKKyAgIDEzLCAgNywgIDAsIC0zLCAtMywgLTQsIC00LCAtNSwgMTQsICA3LCAgMCwgLTMsIC0zLCAtNCwgLTQsIC00LAorICAgMTUsICA4LCAtMSwgLTQsIC00LCAtNCwgLTUsIC00LCAxNSwgIDgsIC0xLCAtNCwgLTQsIC01LCAtNCwgLTMsCisgICAxNSwgIDcsIC0xLCAtNCwgLTUsIC01LCAtNSwgLTQsIDE0LCAgNywgLTEsIC00LCAtNCwgLTQsIC00LCAtMywKKyAgIDEyLCAgNiwgLTEsIC00LCAtNCwgLTQsIC00LCAtMywgMTEsICA1LCAtMSwgLTQsIC00LCAtNCwgLTQsIC0zLAorICAtMTcsIC00LCAgNSwgIDQsICA0LCAgNCwgIDMsICAzLC0xOCwgLTUsICA1LCAgNCwgIDQsICA0LCAgMywgIDMsCisgIC0xOSwgLTUsICA2LCAgNCwgIDQsICA0LCAgMywgIDIsLTIwLCAtNSwgIDYsICA0LCAgNCwgIDQsICAzLCAgMywKKyAgLTIwLCAtNCwgIDYsICA0LCAgNCwgIDUsICAzLCAgMywtMTksIC01LCAgNiwgIDQsICA0LCAgNSwgIDMsICAzLAorICAtMTgsIC00LCAgNSwgIDQsICA0LCAgNCwgIDMsICAyLC0xNywgLTUsICA0LCAgMywgIDQsICA0LCAgMywgIDMsCisgICAtNiwgLTYsIC02LCAtNCwgLTIsICAxLCAgNiwgMTEsIC02LCAtNywgLTcsIC00LCAtMiwgIDIsICA4LCAxMywKKyAgIC04LCAtOCwgLTcsIC00LCAtMiwgIDMsICA5LCAxNCwgLTgsIC04LCAtNywgLTUsIC0xLCAgNCwgMTAsIDE2LAorICAgLTgsIC04LCAtNywgLTUsIC0xLCAgNCwgMTAsIDE3LCAtOCwgLTgsIC03LCAtNCwgIDAsICA1LCAxMCwgMTYsCisgICAtOCwgLTgsIC02LCAtMywgIDAsICA0LCAgOSwgMTUsIC03LCAtNywgLTUsIC0zLCAgMCwgIDQsICA4LCAxMiwKKyAgICA4LCAgNywgIDcsICA1LCAgMiwgLTIsIC04LC0xNCwgIDgsICA4LCAgNywgIDUsICAyLCAtMiwgLTgsLTE1LAorICAgIDgsICA4LCAgNywgIDUsICAxLCAtMywgLTksLTE2LCAgOCwgIDgsICA3LCAgNSwgIDEsIC0zLC0xMCwtMTcsCisgICAgOCwgIDksICA4LCAgNSwgIDEsIC0zLC0xMCwtMTcsICA4LCAgOCwgIDcsICA0LCAgMSwgLTQsLTEwLC0xNiwKKyAgICA3LCAgNywgIDcsICA0LCAgMSwgLTMsIC05LC0xNCwgIDYsICA3LCAgNiwgIDMsICAwLCAtMywgLTksLTEzLAorICAgIDUsICAxLCAtNCwgLTQsIC0zLCAtMSwgIDAsICAwLCAgNywgIDIsIC0zLCAtMywgLTIsIC0xLCAgMSwgIDAsCisgICAgNywgIDEsIC0zLCAtMywgLTEsICAwLCAgMSwgIDEsICA2LCAgMSwgLTMsIC0yLCAtMSwgIDEsICAxLCAgMCwKKyAgICA2LCAgMCwgLTQsIC0yLCAtMSwgIDAsICAxLCAgMCwgIDUsICAwLCAtNCwgLTMsIC0xLCAgMCwgIDAsIC0xLAorICAgIDUsICAwLCAtMywgLTEsICAwLCAgMCwgIDAsIC0yLCAgNCwgIDEsIC0yLCAtMSwgIDAsICAxLCAgMCwgLTEsCisgICAgMiwgIDIsICAxLCAgMSwgLTIsIC02LCAtOCwgLTgsICAxLCAgMSwgIDEsICAxLCAtMiwgLTUsIC04LCAtOCwKKyAgICAxLCAgMSwgIDEsICAwLCAtMSwgLTMsIC01LCAtNSwgIDAsICAwLCAgMCwgIDAsIC0xLCAtMSwgLTEsIC0yLAorICAgIDAsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDEsICAyLCAgMywgIDIsCisgICAgMiwgIDEsICAxLCAgMSwgIDIsICAzLCAgNCwgIDMsICAzLCAgMywgIDMsICAzLCAgNCwgIDQsICA1LCAgNCwKKyAgIC00LCAtNCwgLTMsIC0yLCAgMCwgIDAsICAxLCAgMSwgLTQsIC00LCAtMywgLTIsIC0xLCAgMCwgIDAsICAxLAorICAgLTIsIC0yLCAtMiwgLTEsIC0xLCAtMSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsCisgICAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgIDEsICAzLCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgMywKKyAgICAxLCAgMSwgIDEsICAzLCAgMywgIDQsICAzLCAgMywgLTUsIC02LCAtNSwgLTQsIC0zLCAtMywgLTIsIC0yLAorICAgLTQsIC0yLCAtMSwgLTEsIC0xLCAtMSwgIDAsICAxLCAtNCwgLTIsIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDEsCisgICAtMywgLTIsIC0xLCAtMSwgLTEsICAwLCAgMSwgIDIsIC00LCAtMywgLTIsIC0xLCAtMSwgIDEsICAzLCAgMywKKyAgIC00LCAtMywgLTMsIC0xLCAtMSwgIDEsICA0LCAgNSwgLTQsIC0zLCAtMiwgLTIsIC0xLCAgMSwgIDQsICA3LAorICAgLTIsIC0yLCAtMSwgLTEsICAwLCAgMiwgIDYsICA4LCAtMSwgIDAsICAwLCAgMSwgIDEsICA0LCAgNywgIDgsCisgICAtMywgLTMsIC0zLCAtMiwgLTIsIC0xLCAtMSwgIDAsIC0xLCAtMSwgIDAsICAxLCAgMiwgIDIsICAzLCAgMywKKyAgICAwLCAgMSwgIDIsICA0LCAgNSwgIDYsICA2LCAgNSwgLTEsICAwLCAgMiwgIDMsICA1LCAgNiwgIDUsICAzLAorICAgLTEsIC0xLCAgMCwgIDIsICAzLCAgMywgIDIsICAxLCAtMiwgLTIsIC0xLCAgMCwgLTEsIC0zLCAtNCwgLTQsCisgICAgMCwgIDAsIC0xLCAtMSwgLTIsIC00LCAtOCwgLTcsICAxLCAgMiwgIDEsICAwLCAtMSwgLTQsIC02LCAtNywKKyAgIC0yLCAgNCwgIDEsIC02LCAgMCwgIDMsICAwLCAgMCwgLTIsICA1LCAgMSwgLTcsICAwLCAgMywgIDAsICAwLAorICAgLTMsICA1LCAgMSwgLTgsICAwLCAgMywgLTEsIC0xLCAtMiwgIDYsICAxLCAtOSwgIDAsICAzLCAgMCwgLTEsCisgICAtMiwgIDYsICAyLCAtOCwgIDAsICA0LCAgMCwgLTEsIC0zLCAgNSwgIDEsIC03LCAgMSwgIDQsICAwLCAgMCwKKyAgIC0yLCAgNCwgIDEsIC03LCAgMCwgIDQsICAxLCAgMCwgLTEsICA0LCAgMSwgLTYsICAwLCAgMywgIDEsICAwLAorICAgIDAsICAwLCAgMCwgIDMsICA0LCAgNSwgIDQsICAxLCAgMSwgIDEsICAxLCAgMiwgIDMsICAzLCAgMiwgIDAsCisgICAgMiwgIDIsICAxLCAgMiwgIDIsICAxLCAtMSwgLTIsICA0LCAgMywgIDEsICAxLCAgMCwgLTEsIC0zLCAtNSwKKyAgICA1LCAgMywgIDEsIC0xLCAtMiwgLTMsIC00LCAtNiwgIDUsICAzLCAgMCwgLTIsIC0zLCAtNSwgLTYsIC03LAorICAgIDQsICAzLCAgMCwgLTIsIC0zLCAtNCwgLTUsIC01LCAgNCwgIDMsICAwLCAtMSwgLTIsIC0yLCAtMywgLTMsCisgICAgMCwgIDAsICAwLCAgMCwgLTEsIC01LCAtMiwgIDYsICAwLCAgMCwgIDAsICAxLCAtMSwgLTYsIC0yLCAgOCwKKyAgICAwLCAgMCwgIDAsICAyLCAgMCwgLTYsIC0zLCAgOSwgIDAsIC0xLCAgMCwgIDIsICAwLCAtNywgLTIsIDEwLAorICAgIDAsIC0xLCAgMCwgIDIsIC0xLCAtOCwgLTMsIDEwLCAgMCwgLTEsIC0xLCAgMiwgLTEsIC03LCAtMywgIDksCisgICAgMCwgLTEsICAwLCAgMSwgLTEsIC02LCAtMywgIDgsICAwLCAgMCwgIDAsICAxLCAgMCwgLTUsIC0yLCAgNywKKyAgICAyLCAgMywgIDMsICAyLCAgMSwgIDAsIC0xLCAtMSwgIDMsICA0LCAgMywgIDIsICAxLCAgMCwgLTEsIC0yLAorICAgIDMsICA0LCAgNCwgIDIsICAxLCAtMSwgLTIsIC0zLCAgMiwgIDMsICAzLCAgMiwgIDAsIC0xLCAtMiwgLTMsCisgICAtMSwgIDAsICAxLCAgMSwgIDAsIC0xLCAtMiwgLTIsIC01LCAtNCwgLTMsIC0xLCAgMCwgIDEsICAxLCAgMSwKKyAgIC04LCAtOCwgLTUsIC0xLCAgMSwgIDMsICA0LCAgMywtMTAsIC05LCAtNSwgIDAsICAzLCAgNSwgIDYsICA1LAorICAgLTUsIC0xLCAgNCwgIDUsICAzLCAgMSwgIDAsICAwLCAtNiwgLTEsICA0LCAgNSwgIDIsICAwLCAtMSwgLTIsCisgICAtNiwgLTEsICA1LCAgNCwgIDIsIC0xLCAtMiwgLTIsIC03LCAtMSwgIDQsICA0LCAgMSwgLTIsIC0zLCAtMywKKyAgIC02LCAtMSwgIDUsICA0LCAgMSwgLTIsIC0zLCAtMywgLTUsICAwLCAgNCwgIDQsICAxLCAtMSwgLTIsIC0yLAorICAgLTQsICAwLCAgNSwgIDQsICAxLCAtMSwgLTEsIC0yLCAtMywgIDEsICA0LCAgMywgIDEsIC0xLCAtMSwgLTIsCisgICAtMiwgLTMsIC0yLCAgMSwgIDQsICA2LCAgNSwgIDMsIC0zLCAtNCwgLTQsICAwLCAgMywgIDUsICA0LCAgMiwKKyAgIC0zLCAtNSwgLTUsIC0xLCAgMiwgIDQsICAzLCAgMSwgLTQsIC02LCAtNCwgLTEsICAyLCAgNCwgIDIsIC0xLAorICAgLTIsIC00LCAtMywgIDEsICAyLCAgNCwgIDIsIC0xLCAtMiwgLTQsIC0yLCAgMSwgIDMsICAzLCAgMSwgLTIsCisgICAtMiwgLTMsIC0yLCAgMSwgIDMsICAzLCAgMSwgLTIsIC0yLCAtMiwgLTEsICAxLCAgMywgIDMsICAwLCAtMiwKKyAgIC00LCAtNCwgLTMsIC0yLCAtMSwgIDIsICA1LCAgNywgLTQsIC00LCAtMywgLTMsIC0yLCAgMSwgIDUsICA3LAorICAgLTIsIC0zLCAtMiwgLTMsIC0zLCAtMSwgIDMsICA1LCAtMSwgLTEsICAwLCAtMiwgLTMsIC0yLCAgMiwgIDQsCisgICAgMSwgIDEsICAxLCAtMSwgLTQsIC0zLCAgMSwgIDMsICA0LCAgMywgIDIsIC0xLCAtNCwgLTMsIC0xLCAgMSwKKyAgICA2LCAgNCwgIDMsICAwLCAtMywgLTMsIC0yLCAgMCwgIDYsICA1LCAgMywgIDEsIC0yLCAtMywgLTIsIC0xLAorICAgMTIsIDExLCAgOCwgIDQsICAwLCAtMiwgLTIsIC0xLCAxMCwgIDksICA2LCAgMiwgLTEsIC0yLCAtMSwgIDAsCisgICAgNCwgIDMsICAyLCAgMCwgLTEsIC0xLCAgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMiwgIDAsICAxLCAgMiwKKyAgIC0zLCAtNSwgLTQsIC0yLCAtMiwgIDAsICAyLCAgMywgLTUsIC01LCAtNCwgLTIsIC0xLCAgMCwgIDEsICAyLAorICAgLTUsIC01LCAtNCwgLTIsIC0xLCAgMCwgIDEsICAxLCAtNCwgLTQsIC0zLCAtMiwgLTIsIC0xLCAgMCwgIDAsCisgICAgMywgIDMsICAyLCAtMSwgLTMsIC00LCAtMywgLTIsICAzLCAgMiwgIDAsIC0yLCAtNCwgLTQsIC0zLCAtMiwKKyAgICAyLCAgMiwgIDEsIC0xLCAtMywgLTUsIC00LCAtMywgIDMsICAzLCAgMywgIDEsIC0yLCAtMywgLTMsIC0zLAorICAgIDQsICA0LCAgNCwgIDMsICAwLCAtMiwgLTIsIC0yLCAgNSwgIDUsICA1LCAgMywgIDAsIC0xLCAtMiwgLTIsCisgICAgNSwgIDUsICA0LCAgMiwgLTEsIC0yLCAtMywgLTIsICAzLCAgMywgIDMsICAwLCAtMiwgLTQsIC00LCAtNCwKKyAgIC0xLCAtMSwgIDQsIC0yLCAtMiwgIDYsICAyLCAtNSwgLTEsICAwLCAgNCwgLTIsIC0zLCAgNiwgIDIsIC02LAorICAgLTEsICAwLCAgNCwgLTIsIC0zLCAgNywgIDMsIC03LCAtMSwgLTEsICA0LCAtMywgLTQsICA4LCAgMywgLTcsCisgICAgMCwgLTEsICA0LCAtMywgLTQsICA3LCAgMywgLTYsIC0xLCAtMSwgIDQsIC0zLCAtNCwgIDcsICAzLCAtNiwKKyAgIC0xLCAtMSwgIDMsIC0zLCAtNCwgIDYsICAzLCAtNiwgLTEsICAwLCAgMywgLTIsIC0zLCAgNiwgIDMsIC01LAorICAgIDEsIC0yLCAtNywgIDIsICA1LCAtMiwgLTEsICAxLCAgMSwgLTIsIC04LCAgMywgIDYsIC0zLCAtMSwgIDIsCisgICAgMiwgLTIsIC05LCAgNCwgIDcsIC00LCAtMiwgIDIsICAzLCAtMSwgLTksICA1LCAgNywgLTQsIC0xLCAgMywKKyAgICAzLCAtMSwgLTksICA0LCAgNywgLTQsIC0yLCAgMiwgIDMsIC0xLCAtNywgIDQsICA2LCAtNCwgLTIsICAxLAorICAgIDIsICAwLCAtNiwgIDQsICA2LCAtNCwgLTEsICAxLCAgMiwgIDAsIC01LCAgMywgIDQsIC0zLCAtMSwgIDEsCisgICAtMiwgIDIsICAyLCAgMCwgIDAsIC0xLCAtMywgLTQsIC0yLCAgMiwgIDIsICAxLCAgMSwgIDAsIC0yLCAtNCwKKyAgIC0yLCAgMiwgIDIsICAyLCAgMiwgIDEsIC0xLCAtMiwgLTMsICAyLCAgMywgIDMsICA0LCAgMiwgIDAsIC0yLAorICAgLTMsICAyLCAgMywgIDIsICA0LCAgMiwgIDAsIC0zLCAtNCwgIDEsICAyLCAgMSwgIDIsICAxLCAtMSwgLTMsCisgICAtNSwgIDAsICAxLCAgMCwgIDEsICAxLCAtMiwgLTMsIC00LCAgMCwgIDAsICAwLCAgMSwgIDAsIC0yLCAtMywKKyAgICAwLCAgMCwgLTEsIC0yLCAtMiwgIDIsICA3LCAgOCwgIDAsICAwLCAtMSwgLTMsIC0yLCAgMSwgIDYsICA3LAorICAgIDAsICAxLCAtMSwgLTMsIC0zLCAgMCwgIDQsICA1LCAgMCwgIDEsICAwLCAtMSwgLTEsICAwLCAgMSwgIDMsCisgICAgMCwgIDIsICAxLCAgMSwgIDAsIC0xLCAgMCwgIDEsIC0yLCAgMCwgIDEsICAyLCAgMSwgIDAsIC0xLCAtMSwKKyAgIC01LCAtMiwgIDAsICAxLCAgMSwgIDAsIC0zLCAtMywgLTYsIC00LCAtMSwgIDEsICAxLCAtMSwgLTMsIC00LAorICAgLTQsIC0yLCAgMiwgIDUsICA2LCAgNCwgIDMsICAyLCAtNSwgLTMsICAxLCAgNCwgIDQsICAyLCAgMCwgIDAsCisgICAtNCwgLTIsICAwLCAgMiwgIDEsIC0xLCAtMiwgLTIsIC0yLCAtMSwgIDAsICAxLCAgMCwgLTIsIC0zLCAtMiwKKyAgIC0yLCAgMCwgIDAsICAwLCAtMSwgLTEsIC0yLCAtMSwgLTIsIC0xLCAtMSwgIDAsICAwLCAgMCwgIDEsICAyLAorICAgLTIsIC0yLCAtMSwgLTEsICAwLCAgMSwgIDMsICA0LCAtMiwgLTMsIC0yLCAtMSwgIDAsICAyLCAgNCwgIDUsCisgICAgMiwgIDEsIC0yLCAtMiwgLTEsICAwLCAgMSwgIDAsICAxLCAgMCwgLTMsIC0zLCAtMSwgIDAsICAxLCAgMCwKKyAgICAwLCAtMSwgLTMsIC0zLCAtMSwgIDEsICAxLCAgMSwgIDAsICAwLCAtMywgLTEsICAxLCAgMiwgIDMsICAzLAorICAgIDAsIC0xLCAtMywgLTEsICAxLCAgMywgIDMsICAzLCAtMiwgLTIsIC00LCAtMiwgIDEsICAzLCAgNCwgIDQsCisgICAtMywgLTMsIC00LCAtMiwgIDEsICAzLCAgMywgIDQsIC0yLCAtMywgLTUsIC0yLCAgMSwgIDIsICAzLCAgMywKKyAgICA0LCAgNSwgIDMsICA0LCAgNCwgIDQsICA0LCAgNSwgIDMsICAzLCAgMSwgIDAsICAwLCAgMCwgIDAsICAxLAorICAgIDEsICAxLCAtMSwgLTIsIC0zLCAtNCwgLTMsIC0yLCAgMiwgIDIsICAwLCAtMiwgLTIsIC00LCAtMywgLTIsCisgICAgMiwgIDMsICAxLCAtMSwgLTEsIC0zLCAtMywgLTIsICAxLCAgMiwgIDAsICAwLCAtMSwgLTIsIC0yLCAtMSwKKyAgICAwLCAgMSwgIDAsIC0xLCAtMSwgLTMsIC0yLCAtMSwgIDEsICAxLCAgMCwgLTEsIC0xLCAtMiwgLTIsIC0yLAorICAgLTIsIC0xLCAtMSwgIDAsICAxLCAgMiwgIDEsICAwLCAgMSwgIDIsICAzLCAgNSwgIDYsICA1LCAgNSwgIDMsCisgICAgMSwgIDIsICAzLCAgNCwgIDUsICA1LCAgNCwgIDMsIC0yLCAtMiwgLTMsIC0zLCAtMiwgLTEsICAwLCAgMCwKKyAgIC0zLCAtMywgLTQsIC01LCAtNCwgLTMsIC0yLCAtMSwgLTEsIC0xLCAtMiwgLTIsIC0yLCAtMSwgIDAsICAwLAorICAgIDAsICAxLCAgMCwgLTEsIC0xLCAgMCwgIDAsICAxLCAtMSwgIDAsIC0xLCAtMiwgLTMsIC0yLCAtMiwgLTEsCisgICAgNywgIDcsICA2LCAgNSwgIDQsICAyLCAtMSwgLTIsICAzLCAgMywgIDIsICAyLCAgMSwgIDAsIC0yLCAtMywKKyAgICAwLCAtMSwgLTEsIC0xLCAgMCwgLTEsIC0yLCAtMiwgLTEsIC0zLCAtMiwgLTEsICAwLCAgMCwgIDAsICAxLAorICAgIDAsIC0yLCAtMiwgLTEsIC0xLCAgMSwgIDIsICAyLCAgMywgIDEsIC0xLCAtMSwgLTEsICAxLCAgMiwgIDIsCisgICAgMywgIDEsIC0yLCAtMywgLTIsIC0xLCAgMSwgIDIsICAxLCAtMiwgLTUsIC02LCAtNSwgLTMsIC0yLCAgMCwKKyAgICAwLCAtMSwgLTIsIC0zLCAtMSwgIDAsIC0yLCAtMiwgIDAsICAwLCAtMSwgLTEsICAwLCAgMSwgLTEsIC0yLAorICAgIDAsICAwLCAtMiwgLTEsICAwLCAgMCwgIDAsIC0yLCAtMSwgLTIsIC0zLCAtMywgLTIsIC0xLCAtMywgLTMsCisgICAtMSwgLTIsIC0zLCAtMywgLTIsIC0yLCAtMywgLTQsICAyLCAgMiwgIDAsICAwLCAgMCwgIDAsIC0xLCAtMiwKKyAgICA1LCAgNSwgIDMsICAyLCAgMiwgIDIsICAwLCAtMSwgIDgsICA4LCAgNiwgIDUsICA0LCAgNCwgIDIsICAxLAorICAgLTcsIC04LCAtNiwgLTMsIC0xLCAtMSwgLTIsIC0xLCAtNSwgLTUsIC0zLCAgMCwgIDIsICAxLCAgMCwgIDAsCisgICAtMSwgLTEsICAwLCAgMywgIDQsICAzLCAgMSwgIDEsICAyLCAgMSwgIDEsICAzLCAgNCwgIDMsICAyLCAgMiwKKyAgICAzLCAgMiwgIDAsICAyLCAgMywgIDIsICAxLCAgMiwgIDQsICAyLCAtMSwgLTEsICAwLCAgMSwgIDEsICAxLAorICAgIDMsICAyLCAtMiwgLTMsIC0yLCAtMSwgIDAsICAxLCAgMywgIDEsIC0zLCAtNCwgLTMsIC0yLCAgMCwgIDEsCisgICAtNCwgLTIsIC0xLCAgMiwgIDMsICAzLCAgMSwgIDAsIC03LCAtNSwgLTQsIC0yLCAgMCwgIDAsIC0xLCAtMiwKKyAgIC02LCAtNSwgLTUsIC00LCAtMiwgLTIsIC0yLCAtMywgLTEsICAwLCAtMSwgLTEsICAwLCAgMCwgIDAsIC0xLAorICAgIDIsICAzLCAgMiwgIDIsICAyLCAgMiwgIDEsICAwLCAgMywgIDUsICA0LCAgMywgIDEsICAwLCAgMSwgIDAsCisgICAgMywgIDQsICAzLCAgMiwgIDAsIC0xLCAtMSwgLTEsICA1LCAgNSwgIDMsICAxLCAgMCwgLTEsIC0xLCAtMSwKKyAgICAxLCAgMSwgIDAsIC0xLCAtMywgLTUsIC02LCAtNCwgIDEsICAxLCAgMCwgIDAsICAwLCAtMywgLTMsIC0xLAorICAgIDAsIC0xLCAtMSwgIDAsICAxLCAgMCwgIDEsICAzLCAtMiwgLTIsIC0zLCAtMSwgIDIsICAyLCAgNCwgIDcsCisgICAtMiwgLTIsIC0yLCAgMCwgIDIsICAyLCAgMywgIDYsIC0xLCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLCAgMywKKyAgICAwLCAgMywgIDMsICAzLCAgMSwgLTIsIC0zLCAtMSwgIDEsICAzLCAgNCwgIDMsICAwLCAtMywgLTUsIC00LAorICAgIDAsICAyLCAgMCwgLTEsIC0zLCAtNCwgLTIsIC0yLCAgMSwgIDQsICAyLCAgMCwgLTIsIC0zLCAtMiwgLTEsCisgICAgMywgIDYsICAzLCAgMSwgLTIsIC0yLCAgMCwgLTEsICA0LCAgNywgIDQsICAxLCAtMiwgLTMsIC0xLCAgMCwKKyAgICAzLCAgNiwgIDMsICAwLCAtMywgLTMsIC0xLCAgMCwgIDEsICAzLCAgMCwgLTEsIC0zLCAtMiwgIDEsICAxLAorICAgIDAsICAxLCAtMSwgLTIsIC0zLCAtMSwgIDIsICAyLCAtMiwgLTEsIC0zLCAtMywgLTMsIC0xLCAgMSwgIDIsCisgICAgMywgIDEsIC0xLCAgMCwgIDEsICAwLCAgMCwgIDAsICAyLCAtMSwgLTIsIC0xLCAgMSwgIDAsIC0xLCAtMSwKKyAgICAxLCAtMSwgLTIsICAwLCAgMSwgIDAsIC0yLCAtMywgIDAsIC0yLCAtMSwgIDEsICAzLCAgMSwgLTMsIC01LAorICAgIDAsIC0yLCAtMSwgIDIsICA1LCAgMiwgLTMsIC01LCAgMCwgLTIsIC0xLCAgNCwgIDYsICAzLCAtMiwgLTUsCisgICAgMCwgLTIsICAwLCAgNCwgIDcsICA0LCAtMiwgLTQsICAwLCAtMiwgIDAsICA0LCAgNiwgIDQsIC0yLCAtNCwKKyAgIC0yLCAtMiwgLTMsIC00LCAtMywgLTIsIC0xLCAgMCwgIDEsICAxLCAgMCwgLTEsIC0xLCAtMSwgIDAsICAxLAorICAgIDMsICAzLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDEsICAwLCAgMCwgIDEsCisgICAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLCAtMSwgLTEsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtMywKKyAgIC0zLCAtMywgLTIsIC0zLCAtMiwgLTEsIC0xLCAgMCwgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LAorICAgLTEsIC0yLCAgNywgLTIsIC00LCAtMSwgLTEsICAwLCAtMSwgLTIsICA5LCAtMSwgLTQsIC0xLCAtMSwgIDAsCisgICAtMSwgLTMsIDEwLCAtMSwgLTQsIC0xLCAtMSwgIDEsIC0xLCAtMywgMTAsIC0yLCAtMywgLTEsIC0xLCAgMiwKKyAgIC0xLCAtMiwgMTAsIC0yLCAtNCwgLTEsIC0xLCAgMiwgLTEsIC0yLCAgOSwgLTIsIC00LCAtMSwgLTEsICAyLAorICAgLTEsIC0yLCAgOCwgLTIsIC00LCAgMCwgLTEsICAxLCAgMCwgLTIsICA3LCAtMiwgLTMsIC0xLCAgMCwgIDIsCisgICAgMywgLTQsICAxLCAgMywgLTMsIC0yLCAgMSwgIDAsICAzLCAtNSwgIDEsICA0LCAtMywgLTIsICAxLCAgMCwKKyAgICAzLCAtNiwgIDIsICA1LCAtMywgLTEsICAzLCAgMCwgIDMsIC02LCAgMiwgIDUsIC0zLCAtMSwgIDIsICAwLAorICAgIDMsIC02LCAgMSwgIDUsIC00LCAtMiwgIDMsICAwLCAgMywgLTYsICAxLCAgNSwgLTMsIC0yLCAgMiwgIDAsCisgICAgMiwgLTYsICAxLCAgNCwgLTMsIC0xLCAgMSwgIDAsICAyLCAtNiwgIDEsICA0LCAtMiwgLTEsICAxLCAgMCwKKyAgICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMiwgIDAsIC0xLCAgMSwgIDEsICAxLCAgMCwgIDAsICAyLAorICAgIDAsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAyLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAtMSwgIDAsCisgICAgMSwgIDAsICAxLCAgMCwgIDAsIC0xLCAtMiwgLTEsICAzLCAgMSwgIDEsICAwLCAgMCwgLTIsIC00LCAtMywKKyAgICA1LCAgMywgIDIsICAxLCAgMCwgLTMsIC01LCAtNCwgIDUsICA0LCAgMiwgIDAsIC0xLCAtNCwgLTUsIC01LAorICAgIDEsICAwLCAtMSwgLTIsIC0yLCAtMywgLTYsIC05LCAgMiwgIDAsIC0xLCAtMSwgIDAsICAwLCAtMywgLTYsCisgICAgMSwgIDAsICAwLCAtMSwgIDAsICAwLCAtMiwgLTUsICAyLCAgMSwgIDEsICAxLCAgMSwgIDIsIC0xLCAtMywKKyAgICAxLCAgMSwgIDIsICAxLCAgMiwgIDIsICAxLCAtMSwgIDEsICAxLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgIDAsICAwLCAgMiwgIDEsICAwLCAgMCwgIDIsICAyLCAgMCwgIDEsICAyLCAgMiwgIDAsICAwLCAgMiwgIDIsCisgICAtNCwgLTMsICAwLCAgMSwgIDQsICA2LCAgNCwgIDMsIC0zLCAtMiwgIDAsICAwLCAgMiwgIDQsICAxLCAgMCwKKyAgIC0xLCAtMSwgIDAsICAwLCAgMSwgIDEsIC0yLCAtMywgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgLTMsIC01LAorICAgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgLTMsIC01LCAtMSwgIDAsICAwLCAtMSwgIDEsICAxLCAtMiwgLTQsCisgICAtMSwgIDAsICAwLCAtMSwgIDEsICAyLCAgMCwgLTIsIC0xLCAgMCwgIDAsICAwLCAgMiwgIDMsICAxLCAgMCwKKyAgIC0xLCAgMCwgIDMsICA0LCAgMCwgLTQsIC01LCAtNSwgIDAsICAwLCAgNCwgIDUsICAyLCAtMiwgLTMsIC0yLAorICAgIDAsIC0xLCAgMiwgIDQsICAyLCAtMSwgLTEsICAwLCAgMCwgLTIsIC0xLCAgMSwgIDAsIC0yLCAgMCwgIDEsCisgICAgMSwgLTIsIC0yLCAgMCwgIDAsIC0xLCAtMSwgIDEsICAxLCAtMiwgLTMsICAwLCAgMSwgIDAsIC0xLCAgMCwKKyAgICAxLCAtMiwgLTIsICAxLCAgMywgIDEsICAwLCAgMCwgIDEsIC0yLCAtMSwgIDIsICA0LCAgMiwgIDAsICAwLAorICAgIDEsICAyLCAgMywgIDIsICAwLCAgMiwgIDIsICAxLCAtMSwgIDAsICAxLCAgMCwgLTMsICAxLCAgMSwgIDEsCisgICAtMSwgIDAsICAwLCAtMiwgLTQsICAwLCAgMiwgIDEsIC0xLCAgMiwgIDIsIC0xLCAtNSwgIDAsICAyLCAgMSwKKyAgIC0xLCAgMywgIDQsIC0xLCAtNSwgIDAsICAyLCAgMSwgLTIsICAyLCAgNCwgIDAsIC00LCAtMSwgIDAsICAwLAorICAgLTQsICAwLCAgMiwgIDAsIC00LCAtMiwgIDAsICAwLCAtNSwgLTEsICAyLCAgMSwgLTIsICAxLCAgMywgIDIsCisgICAgMSwgIDAsICAxLCAgMCwgIDEsICAyLCAtMSwgLTIsICAyLCAgMCwgLTEsIC0yLCAgMSwgIDMsICAwLCAtMSwKKyAgICAzLCAgMCwgLTIsIC00LCAgMCwgIDMsICAxLCAgMCwgIDUsICAxLCAtMywgLTUsIC0yLCAgMiwgIDEsICAxLAorICAgIDYsICAxLCAtMiwgLTUsIC0yLCAgMSwgIDAsICAxLCAgNSwgIDEsIC0xLCAtNSwgLTIsICAwLCAtMSwgIDAsCisgICAgMywgIDAsIC0yLCAtNCwgLTIsICAwLCAtMSwgIDAsICAxLCAtMSwgIDAsIC0yLCAgMCwgIDEsICAwLCAgMSwKKyAgICAxLCAgMSwgIDIsICAzLCAgMiwgIDEsICAxLCAgMiwgLTEsIC0xLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLAorICAgLTQsIC0zLCAgMCwgIDAsICAxLCAgMSwgIDEsICAyLCAtNCwgLTMsICAwLCAgMiwgIDIsICAyLCAgMywgIDIsCisgICAtNSwgLTQsICAwLCAgMSwgIDEsICAxLCAgMSwgIDIsIC01LCAtNCwgLTEsIC0xLCAtMiwgLTIsIC0xLCAgMCwKKyAgIC0zLCAtMiwgIDAsICAwLCAtMiwgLTMsIC0yLCAtMSwgIDIsICAzLCAgNCwgIDQsICAyLCAgMCwgIDAsICAwLAorICAgLTQsIC0yLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAtMywgLTEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsCisgICAtMiwgIDAsICAyLCAgMiwgIDAsICAwLCAgMCwgIDIsIC0xLCAgMSwgIDIsICAxLCAtMSwgIDAsICAzLCAgNSwKKyAgICAwLCAgMiwgIDEsIC0xLCAtMiwgIDAsICA1LCAgNiwgIDAsICAxLCAgMCwgLTMsIC0zLCAgMCwgIDQsICA2LAorICAgIDEsICAxLCAtMiwgLTQsIC00LCAtMywgIDEsICAyLCAgMSwgIDAsIC0yLCAtNCwgLTUsIC00LCAtMiwgIDAsCisgICAtMSwgLTMsIC0zLCAtMywgLTMsIC0yLCAtMSwgLTEsICAzLCAgMiwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwKKyAgICA1LCAgNCwgIDMsICAyLCAgMSwgIDEsICAyLCAgMiwgIDIsICAxLCAgMCwgLTIsIC0yLCAtMiwgLTEsIC0xLAorICAgIDAsICAwLCAgMCwgLTEsIC0yLCAtMiwgLTIsIC0yLCAgMCwgIDEsICAzLCAgMywgIDIsICAxLCAtMSwgLTEsCisgICAgMCwgIDEsICAzLCAgNCwgIDMsICAyLCAgMSwgLTEsIC00LCAtMywgLTEsICAxLCAgMCwgLTIsIC0zLCAtMywKKyAgIC0zLCAtNCwgLTcsIC04LCAtNywgLTQsIC0xLCAgMiwgIDAsIC0xLCAtMywgLTQsIC00LCAtMiwgIDAsICAyLAorICAgIDEsICAwLCAgMCwgLTEsIC0zLCAtMiwgIDAsICAyLCAgMiwgIDEsICAxLCAgMCwgLTEsIC0xLCAgMCwgIDIsCisgICAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAwLCAgMCwgIDEsICAyLCAgMywgIDMsICAyLCAgMiwgIDAsICAwLCAgMSwgIDMsICA0LCAgNCwgIDMsICAyLAorICAgIDMsICAzLCAgMywgIDAsIC0xLCAgMCwgIDEsICAyLCAgMSwgIDEsICAxLCAtMSwgLTIsIC0xLCAtMSwgIDEsCisgICAtMiwgLTIsIC0xLCAtMywgLTMsIC0yLCAtMiwgIDAsIC00LCAtNCwgLTIsIC0yLCAtMiwgLTIsIC0zLCAgMCwKKyAgIC00LCAtNCwgLTEsICAxLCAgMSwgIDAsIC0xLCAgMiwgLTMsIC0xLCAgMiwgIDMsICA0LCAgMywgIDMsICA1LAorICAgLTIsICAwLCAgMiwgIDMsICAzLCAgMywgIDMsICAzLCAtMiwgLTIsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsCisgICAgMCwgIDIsICAxLCAtMSwgLTMsIC0xLCAgMywgLTIsIC0xLCAgMCwgLTEsIC0xLCAtMywgIDAsICA0LCAtMiwKKyAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgIDEsICA1LCAtMiwgLTMsIC0yLCAtMywgLTEsIC0yLCAgMSwgIDQsIC0zLAorICAgLTIsICAwLCAtMSwgIDAsIC0xLCAgMCwgIDMsIC01LCAgMSwgIDIsICAxLCAgMiwgIDAsICAwLCAgMiwgLTUsCisgICAgMiwgIDQsICAyLCAgMywgIDEsICAxLCAgMywgLTMsICAxLCAgMiwgIDEsICAxLCAgMCwgIDEsICA0LCAtMiwKKyAgICA0LCAtMywgLTQsIC0xLCAgMywgIDMsICAxLCAgMywgIDQsIC00LCAtNCwgLTEsICAzLCAgMiwgIDAsICAyLAorICAgIDQsIC0zLCAtNCwgIDAsICAyLCAgMiwgLTEsICAxLCAgNCwgLTMsIC0yLCAgMSwgIDIsICAxLCAtMiwgIDAsCisgICAgMiwgLTQsIC0yLCAgMSwgIDIsICAwLCAtMywgIDAsICAyLCAtMywgLTIsICAwLCAgMSwgIDAsIC0yLCAgMiwKKyAgICAzLCAtMSwgLTEsICAwLCAgMCwgIDAsICAwLCAgMywgIDIsIC0yLCAtMiwgLTIsIC0xLCAtMSwgLTEsICAyLAorICAgIDIsICAyLCAgMywgIDQsICAzLCAgMSwgIDAsIC0xLCAgMSwgIDAsICAxLCAgMiwgIDEsIC0xLCAtMiwgLTIsCisgICAgMiwgIDEsICAyLCAgMSwgIDEsICAwLCAtMSwgLTEsICA0LCAgMywgIDQsICAzLCAgMiwgIDEsICAxLCAgMSwKKyAgICAzLCAgMiwgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgLTEsIC0yLCAtMSwgIDAsIC0xLCAtMSwgLTEsIC0xLAorICAgLTMsIC0zLCAtMiwgLTEsIC0yLCAtMiwgLTIsIC0yLCAtNCwgLTQsIC0zLCAtMywgLTQsIC00LCAtMywgLTMsCisgICAgMiwgIDEsIC0xLCAtMywgLTQsIC0yLCAgMywgIDQsICAyLCAgMiwgIDEsIC0xLCAtMywgLTIsICAxLCAgMiwKKyAgICAxLCAgMiwgIDMsICAzLCAgMCwgLTIsIC0xLCAtMiwgLTEsICAwLCAgMiwgIDQsICAyLCAgMCwgLTEsIC0zLAorICAgLTIsIC0yLCAgMCwgIDMsICAzLCAgMiwgIDAsIC0zLCAgMCwgLTIsIC0zLCAtMSwgIDEsICAyLCAgMiwgLTEsCisgICAgMywgLTEsIC00LCAtNSwgLTMsICAwLCAgMiwgIDAsICA2LCAgMywgLTIsIC02LCAtNSwgIDAsICAzLCAgMSwKKyAgIC0yLCAgMywgLTIsICAwLCAgMywgLTIsIC0yLCAgMSwgLTMsICA0LCAtMywgIDAsICAzLCAtMiwgLTEsICAyLAorICAgLTMsICA1LCAtMywgIDAsICA0LCAtMiwgLTEsICAyLCAtMiwgIDQsIC00LCAtMSwgIDMsIC0zLCAtMiwgIDIsCisgICAtMywgIDQsIC0zLCAgMCwgIDMsIC0zLCAtMSwgIDIsIC0yLCAgNSwgLTIsICAwLCAgMywgLTMsIC0xLCAgMiwKKyAgIC0yLCAgNCwgLTMsICAxLCAgMywgLTIsIC0xLCAgMiwgLTIsICAzLCAtMiwgIDEsICAzLCAtMiwgIDAsICAyLAorICAgIDEsICAwLCAgMCwgLTEsICAxLCAgMiwgLTQsIC0xLCAgMiwgIDAsICAwLCAtMSwgIDEsICAyLCAtNCwgLTIsCisgICAgMSwgIDEsICAxLCAtMSwgIDIsICA0LCAtMiwgIDAsICAwLCAtMSwgIDEsIC0xLCAgMiwgIDUsIC0xLCAgMSwKKyAgICAwLCAtMSwgIDAsIC0yLCAgMSwgIDUsIC0xLCAgMSwgIDAsIC0xLCAtMSwgLTIsICAwLCAgMywgLTMsIC0xLAorICAgIDEsICAxLCAgMCwgLTIsICAwLCAgMywgLTMsIC0xLCAgMSwgIDEsICAwLCAtMywgIDAsICAzLCAtMiwgIDAsCisgICAgMSwgIDAsIC0xLCAgMSwgIDEsICAyLCAgNCwgIDUsICAxLCAgMCwgLTEsICAxLCAgMSwgIDEsICA1LCAgNywKKyAgICAwLCAgMCwgLTIsIC0xLCAtMSwgIDAsICAzLCAgNSwgIDAsIC0xLCAtMiwgLTEsIC0xLCAtMSwgIDIsICAzLAorICAgIDAsIC0xLCAtMywgLTEsIC0xLCAtMSwgIDEsICAyLCAtMSwgLTIsIC00LCAtMiwgLTIsIC0yLCAgMCwgIDAsCisgICAtMSwgLTIsIC0yLCAtMSwgLTIsIC0yLCAgMCwgIDAsICAwLCAtMSwgLTEsICAwLCAtMSwgLTEsICAwLCAgMCwKKyAgICAzLCAgMywgIDAsIC0xLCAtMSwgIDEsICA0LCAgNCwgIDIsICAzLCAgMCwgLTIsIC0yLCAgMCwgIDEsICAxLAorICAgIDIsICAzLCAgMSwgLTEsIC0xLCAgMCwgIDEsICAwLCAgMSwgIDIsICAwLCAtMSwgLTEsIC0xLCAgMCwgLTIsCisgICAgMCwgIDEsICAwLCAtMSwgLTIsIC0xLCAgMCwgLTIsICAwLCAgMSwgIDAsIC0xLCAtMiwgLTEsICAxLCAgMCwKKyAgICAxLCAgMSwgLTEsIC0zLCAtNCwgLTMsICAxLCAgMywgIDEsICAyLCAtMSwgLTMsIC01LCAtNCwgIDEsICAzLAorICAgLTMsIC0yLCAgMCwgIDEsICAxLCAgMSwgIDAsIC0yLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAtMSwgLTMsCisgICAgMSwgIDIsICAxLCAgMSwgIDAsIC0xLCAtMSwgLTIsICAwLCAtMSwgLTMsIC0xLCAtMSwgLTEsICAwLCAtMSwKKyAgICAwLCAtMywgLTYsIC0zLCAtMiwgLTEsICAxLCAgMSwgIDIsIC0xLCAtNCwgLTMsIC0yLCAgMCwgIDIsICAyLAorICAgIDUsICA0LCAgMSwgIDEsICAwLCAgMSwgIDMsICAyLCAgNSwgIDQsICAyLCAgMSwgIDAsIC0xLCAgMCwgIDEsCisgICAtMiwgIDAsIC0yLCAtNSwgLTYsIC0zLCAgMCwgIDAsIC0yLCAgMCwgIDEsICAwLCAtMSwgIDEsICAyLCAgMiwKKyAgIC0yLCAgMCwgIDEsICAzLCAgMiwgIDIsICAyLCAgMSwgLTIsICAwLCAgMiwgIDQsICAzLCAgMiwgIDEsICAxLAorICAgLTIsICAwLCAgMiwgIDMsICAyLCAgMCwgLTEsICAwLCAtMywgLTEsICAxLCAgMSwgIDAsIC0xLCAtMSwgIDEsCisgICAtNCwgLTEsICAxLCAgMCwgLTEsIC0yLCAgMCwgIDIsIC00LCAtMSwgIDAsIC0xLCAtMSwgLTIsICAxLCAgNCwKKyAgIC0zLCAgMCwgIDAsIC0xLCAgMSwgIDEsICAxLCAgMCwgLTMsICAxLCAgMCwgLTEsICAwLCAgMCwgLTEsIC0xLAorICAgLTEsICAzLCAgMywgIDAsICAxLCAgMCwgIDAsICAxLCAtMywgIDIsICAyLCAtMiwgLTEsICAwLCAgMCwgIDEsCisgICAtNSwgIDAsICAwLCAtMiwgLTEsICAxLCAgMCwgIDIsIC03LCAtMiwgIDEsICAwLCAgMSwgIDIsICAyLCAgMiwKKyAgIC01LCAgMCwgIDMsICAyLCAgMywgIDMsICAyLCAgMiwgLTMsICAyLCAgNCwgIDEsICAwLCAgMCwgLTIsIC0zLAorICAgIDUsICAyLCAtMiwgLTIsICAwLCAtMSwgLTEsIC0xLCAgMiwgLTEsIC00LCAtMywgLTEsIC0yLCAtMSwgLTEsCisgICAgMCwgLTIsIC0yLCAgMSwgIDIsIC0xLCAgMCwgIDEsIC0xLCAtMiwgLTEsICAzLCAgMywgLTEsICAwLCAgMiwKKyAgICAxLCAgMCwgIDAsICAzLCAgMywgLTIsIC0xLCAgMiwgIDIsICAxLCAgMSwgIDMsICAyLCAtMiwgLTIsICAwLAorICAgIDEsICAwLCAtMSwgIDEsICAxLCAtMywgLTMsIC0yLCAgMSwgIDAsICAxLCAgMiwgIDMsICAwLCAgMCwgIDAsCisgICAtNCwgLTUsIC0zLCAgMCwgIDEsIC0xLCAtMiwgLTEsIC0yLCAtMywgLTEsICAxLCAgMiwgIDAsICAwLCAgMCwKKyAgICAxLCAgMSwgIDIsICAxLCAgMiwgIDEsICAxLCAgMSwgIDMsICA0LCAgMywgIDEsICAwLCAtMiwgLTEsIC0xLAorICAgIDMsICAzLCAgMiwgIDAsIC0yLCAtMywgLTMsIC0yLCAgMSwgIDEsICAwLCAtMSwgLTIsIC00LCAtMiwgLTIsCisgICAgMiwgIDEsICAwLCAgMCwgIDAsIC0xLCAgMCwgIDEsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMywKKyAgICAwLCAgMCwgIDAsIC0xLCAtMiwgLTEsICAxLCAgMCwgLTIsIC0xLCAtMSwgLTIsIC0zLCAtMiwgIDAsICAwLAorICAgLTEsICAwLCAgMCwgLTEsIC0yLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAtMSwgLTEsICAxLCAgMywgIDEsCisgICAgMiwgIDIsICAwLCAtMiwgLTEsICAyLCAgMywgIDAsICAzLCAgMSwgLTEsIC0xLCAgMSwgIDQsICAyLCAtMiwKKyAgICAyLCAgMCwgLTMsIC0xLCAgMywgIDUsICAwLCAtNSwgIDEsIC0xLCAtMiwgIDAsICAzLCAgMywgLTEsIC02LAorICAgLTEsICAwLCAgMywgIDQsICAyLCAgMCwgIDEsICAyLCAtMiwgLTEsICAwLCAgMSwgLTEsIC0yLCAgMCwgIDEsCisgICAtMiwgLTMsIC0yLCAtMywgLTYsIC03LCAtNiwgLTMsICAyLCAgMiwgIDMsICAxLCAtMSwgLTIsIC0zLCAtMiwKKyAgICAyLCAgMiwgIDMsICAxLCAgMCwgIDAsICAwLCAgMCwgIDIsICAxLCAgMSwgIDAsICAxLCAgMSwgIDAsICAxLAorICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAyLCAgMSwgIDAsIC0xLCAgMCwgIDAsICAyLCAgMiwgIDEsCisgICAgMSwgIDEsICAzLCAgMSwgLTEsIC0xLCAtMSwgIDEsIC0yLCAtMSwgIDAsICAwLCAtMiwgLTIsIC0xLCAgMiwKKyAgIC0yLCAtMiwgIDEsICAxLCAgMSwgIDAsICAxLCAgMywgLTIsIC0yLCAgMCwgLTEsICAwLCAtMSwgIDAsICAyLAorICAgIDAsICAwLCAgMSwgIDAsIC0xLCAtMSwgLTIsICAxLCAgMywgIDIsICAyLCAgMSwgIDAsIC0yLCAtMiwgIDEsCisgICAgNSwgIDMsICAzLCAgMiwgIDEsICAxLCAgMSwgIDQsICAwLCAtMywgLTQsIC01LCAtNCwgLTMsIC0xLCAgMSwKKyAgIC02LCAtNCwgLTEsICAyLCAgMiwgIDAsICAwLCAtMSwgLTQsIC0yLCAgMSwgIDMsICAzLCAgMiwgIDIsICAwLAorICAgLTMsIC0yLCAtMSwgIDIsICAzLCAgMywgIDIsICAwLCAtMywgLTIsIC0yLCAgMSwgIDIsICAxLCAgMSwgLTEsCisgICAtMiwgLTIsIC0yLCAgMCwgIDIsICAyLCAgMSwgLTEsIC0xLCAtMSwgLTEsICAxLCAgMiwgIDMsICAyLCAgMCwKKyAgIC0xLCAtMSwgLTIsICAxLCAgMiwgIDIsICAyLCAtMSwgIDAsIC0xLCAtMiwgIDAsICAyLCAgMSwgIDAsIC0xLAorICAgIDYsICA0LCAgMiwgIDEsICAwLCAgMCwgIDAsICAxLCAgNCwgIDIsIC0xLCAtMiwgLTIsIC0yLCAtMSwgLTEsCisgICAgMiwgIDEsIC0xLCAtMiwgLTIsIC0yLCAtMiwgLTEsICAyLCAgMiwgIDAsIC0yLCAtMiwgLTIsIC0xLCAgMCwKKyAgICAwLCAgMCwgLTEsIC0yLCAtMiwgLTEsICAwLCAgMSwgLTMsIC0zLCAtMiwgLTEsIC0xLCAtMiwgLTEsICAwLAorICAgLTMsIC0yLCAgMiwgIDMsICAyLCAgMCwgLTEsIC0yLCAtMiwgIDAsICA0LCAgNSwgIDUsICAyLCAgMCwgLTEsCisgICAgNSwgIDQsICAyLCAgMCwgLTEsIC0yLCAtMSwgLTEsICA0LCAgMywgIDIsICAxLCAgMCwgLTEsICAwLCAtMSwKKyAgICAxLCAgMSwgIDAsICAxLCAgMSwgIDAsICAxLCAtMSwgLTIsIC0xLCAtMSwgIDAsICAwLCAtMiwgLTIsIC0zLAorICAgLTEsICAwLCAgMCwgIDAsIC0xLCAtMywgLTMsIC01LCAgMCwgIDEsICAxLCAtMSwgLTEsIC0yLCAtMiwgLTMsCisgICAtMSwgLTEsIC0xLCAtMiwgLTEsICAxLCAgMywgIDEsIC0xLCAtMiwgLTIsIC0xLCAgMiwgIDUsICA2LCAgNSwKKyAgIC0zLCAtMywgLTIsICAxLCAgMSwgLTIsIC0xLCAtMSwgIDEsICAyLCAgMywgIDQsICAxLCAtMywgLTEsIC0zLAorICAgIDMsICAyLCAgMCwgIDEsIC0xLCAtMywgLTEsIC0zLCAgMSwgIDAsIC0xLCAgMCwgLTEsIC0xLCAgMSwgIDAsCisgICAgMSwgIDEsICAwLCAgMSwgIDIsICAyLCAgNSwgIDMsICAxLCAgMSwgIDEsICAyLCAgMiwgIDIsICAzLCAgMCwKKyAgIC0zLCAtMSwgLTIsIC0yLCAtMywgLTMsIC0xLCAtMywgLTEsICAxLCAgMSwgIDAsIC0xLCAtMSwgIDAsIC0yLAorICAgIDIsICAwLCAtMiwgLTIsICAyLCAgNCwgIDEsIC0yLCAgMSwgIDAsIC0yLCAtMSwgIDMsICA1LCAgMiwgLTEsCisgICAtMSwgLTIsIC0zLCAtMiwgIDEsICAzLCAgMSwgLTIsIC0xLCAtMiwgLTEsIC0xLCAgMCwgIDIsICAxLCAtMSwKKyAgICAwLCAgMCwgIDEsICAxLCAgMSwgIDIsICAyLCAgMCwgIDAsICAxLCAgNCwgIDQsICAyLCAgMiwgIDMsICAxLAorICAgLTIsIC0xLCAgMiwgIDEsIC0yLCAtMywgLTIsIC0zLCAtMSwgIDAsICAxLCAgMCwgLTMsIC00LCAtNCwgLTUsCisgICAgNCwgIDAsIC0zLCAtNCwgLTQsIC00LCAtMiwgLTEsICA1LCAgMCwgLTEsICAwLCAtMSwgLTMsIC0yLCAtMSwKKyAgICA0LCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsIC0zLCAtMiwgLTEsICAwLCAgMCwgIDEsICAwLAorICAgIDAsIC0yLCAgMCwgIDAsICAxLCAgMSwgIDIsICAxLCAgMiwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsCisgICAgMiwgIDAsIC0xLCAtMSwgIDEsICAxLCAgMSwgIDAsICAxLCAtMSwgLTIsIC0yLCAgMCwgIDIsICAyLCAgMiwKKyAgIC0zLCAtNSwgLTIsICAwLCAtMSwgLTMsIC0zLCAgMCwgIDAsIC0yLCAgMCwgIDIsICAyLCAgMCwgIDAsICAzLAorICAgIDIsIC0xLCAtMiwgIDAsICAwLCAtMSwgLTEsICAyLCAgNSwgIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgIDIsCisgICAgNSwgIDIsICAwLCAtMSwgLTEsICAwLCAtMSwgIDIsICAyLCAgMSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMiwKKyAgIC0xLCAtMSwgIDEsICAxLCAgMiwgIDIsICAxLCAgMiwgLTMsIC0yLCAgMCwgIDAsICAwLCAgMCwgLTIsIC0xLAorICAgIDAsICAzLCAgMiwgIDAsIC0yLCAtMywgLTMsIC0zLCAgMCwgIDMsICAzLCAgMSwgIDAsICAwLCAgMSwgIDIsCisgICAtMSwgIDAsIC0xLCAtMiwgLTEsIC0xLCAgMSwgIDMsIC0xLCAgMCwgLTEsIC0yLCAtMSwgLTEsICAwLCAgMiwKKyAgIC0xLCAgMCwgLTEsIC0yLCAgMCwgIDAsIC0xLCAgMiwgLTEsICAwLCAtMSwgLTIsIC0xLCAtMSwgLTIsICAxLAorICAgIDAsICAxLCAgMCwgLTMsIC0xLCAtMSwgLTEsICAyLCAgNSwgIDUsICAyLCAtMSwgLTEsIC0xLCAgMSwgIDMsCisgICAgMCwgIDAsICAxLCAtMSwgLTMsIC0yLCAgMCwgIDIsICAxLCAgMSwgIDMsICAwLCAtMiwgLTIsICAwLCAgMSwKKyAgICAxLCAgMSwgIDMsICAxLCAgMCwgIDAsIC0xLCAtMSwgIDAsIC0xLCAgMiwgIDEsICAxLCAgMCwgLTEsIC0zLAorICAgLTEsIC0yLCAgMSwgIDEsICAxLCAgMCwgLTIsIC00LCAtMSwgIDAsICAyLCAgMSwgIDEsICAwLCAtMSwgLTMsCisgICAgMSwgIDEsICAzLCAgMiwgIDEsICAwLCAtMiwgLTMsICAyLCAgMiwgIDQsICAyLCAgMSwgLTEsIC0yLCAtNCwKKyAgICAxLCAgMiwgIDIsICAyLCAgMCwgLTIsICAwLCAgMiwgLTEsIC0xLCAtMiwgLTMsIC00LCAtNSwgLTMsICAxLAorICAgIDAsICAxLCAgMSwgIDAsIC0xLCAtMSwgLTEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDIsCisgICAgMCwgIDEsICAxLCAgMiwgIDEsICAxLCAgMSwgIDIsIC0xLCAtMSwgIDAsICAyLCAgMiwgIDIsICAyLCAgMywKKyAgIC0yLCAtNCwgLTQsIC0xLCAtMiwgLTIsIC0yLCAgMCwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAxLAorICAgIDAsIC0xLCAtMywgLTIsICAwLCAgMiwgIDIsICAxLCAgMCwgLTEsIC0yLCAtMywgIDAsICAxLCAgMSwgIDIsCisgICAgMSwgIDAsIC0yLCAtMywgLTEsICAwLCAgMCwgIDEsIC0xLCAgMCwgLTEsIC0yLCAgMCwgIDAsIC0xLCAgMCwKKyAgIC0xLCAgMSwgIDEsICAwLCAgMiwgIDIsICAwLCAgMCwgIDAsICAyLCAgMywgIDEsICAzLCAgNSwgIDMsICAyLAorICAgLTEsICAxLCAgMSwgLTIsICAwLCAgMywgIDEsICAxLCAtMSwgIDAsICAwLCAtNCwgLTQsIC0xLCAtMSwgLTEsCisgICAtMSwgIDEsICAxLCAgMCwgIDEsICAyLCAgMSwgIDIsIC0zLCAgMCwgIDEsICAwLCAgMSwgIDEsICAwLCAgMiwKKyAgIC01LCAtMywgLTEsIC0xLCAgMCwgIDEsICAwLCAgMSwgLTQsIC0zLCAtMiwgLTMsIC0yLCAtMSwgLTEsICAwLAorICAgIDAsICAwLCAtMSwgLTIsIC0yLCAtMiwgLTIsICAwLCAgMywgIDQsICAyLCAgMCwgIDAsICAwLCAgMCwgIDEsCisgICAgMiwgIDEsICAwLCAgMCwgIDAsICAwLCAtMSwgIDAsICAwLCAgMSwgIDIsICAzLCAgNCwgIDQsICAzLCAgMiwKKyAgIC0xLCAgNCwgIDcsICA0LCAgMCwgIDAsICAwLCAgMCwgLTEsICA0LCAgNiwgIDMsICAwLCAgMSwgIDEsICAxLAorICAgIDAsICAzLCAgNCwgIDAsIC0xLCAgMCwgIDAsICAxLCAgMCwgIDEsICAxLCAtMiwgLTEsICAwLCAtMSwgLTEsCisgICAtMSwgIDAsIC0xLCAtMSwgLTEsICAwLCAgMCwgIDAsIC0xLCAtMSwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgIC0xLCAtMywgLTMsICAwLCAgMSwgLTEsIC0yLCAtMSwgLTMsIC00LCAtNCwgLTIsIC0xLCAtMiwgLTIsIC0xLAorICAgIDIsICAyLCAgMSwgIDAsICAxLCAgMSwgIDAsIC0zLCAtMiwgLTEsICAwLCAgMCwgIDEsICAxLCAgMCwgLTMsCisgICAtMiwgLTEsICAwLCAgMSwgIDIsICAxLCAgMSwgLTIsICAxLCAgMiwgIDIsICAyLCAgMywgIDMsICAyLCAtMSwKKyAgICAxLCAgMiwgIDEsICAwLCAgMSwgIDEsICAyLCAtMSwgIDAsICAxLCAtMiwgLTQsIC0yLCAgMCwgIDEsIC0xLAorICAgIDEsICAxLCAtMSwgLTMsIC0yLCAgMCwgLTEsIC0zLCAgMSwgIDIsICAwLCAtMSwgIDAsICAxLCAtMSwgLTQsCisgICAtMSwgLTEsIC0yLCAtMiwgIDAsICAzLCAgNCwgIDMsICAxLCAgMSwgLTEsIC0zLCAtMiwgIDAsICAwLCAgMCwKKyAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDEsIC0xLCAtMSwgIDEsICAxLCAgMSwgIDMsICAzLCAgMCwgLTIsIC0yLAorICAgIDAsIC0xLCAtMSwgLTEsICAwLCAtMiwgLTEsIC0xLCAtMSwgLTMsIC00LCAtMywgLTIsIC0yLCAgMCwgIDIsCisgICAtMSwgLTEsICAwLCAgMSwgIDIsICAyLCAgMywgIDUsIC0yLCAtMSwgLTEsICAwLCAgMCwgIDAsICAwLCAgMSwKKyAgIC0yLCAtMywgIDIsICAwLCAgMCwgIDEsICAxLCAtMSwgLTEsIC00LCAgMSwgLTIsIC0xLCAgMiwgIDIsICAwLAorICAgIDEsIC00LCAgMCwgLTIsIC0yLCAgMSwgIDEsIC0xLCAgMiwgLTMsICAxLCAtMSwgLTEsICAxLCAgMSwgLTEsCisgICAgMywgLTIsICAzLCAgMSwgIDAsICAxLCAgMSwgLTEsICAxLCAtMywgIDIsICAxLCAgMCwgIDEsICAwLCAtMSwKKyAgIC0xLCAtNSwgIDEsICAwLCAtMSwgIDAsICAxLCAgMSwgIDAsIC0zLCAgMywgIDMsICAxLCAgMiwgIDMsICAzLAorICAgIDAsIC0xLCAtMiwgIDEsICA1LCAgNSwgIDIsIC0xLCAgMSwgLTEsIC0yLCAtMSwgIDEsICAxLCAtMiwgLTUsCisgICAgMSwgIDEsIC0xLCAtMiwgLTEsIC0xLCAtMSwgLTMsICAxLCAgMSwgLTEsIC0xLCAtMSwgIDIsICA0LCAgMywKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIDAsICA0LCAgMywgLTEsIC0xLCAgMCwgIDEsIC0xLCAtMywgLTEsIC0xLAorICAgIDAsICAwLCAgMCwgIDIsICAyLCAgMCwgIDAsIC0xLCAgMCwgLTIsIC0zLCAgMCwgIDEsICAxLCAgMywgIDIsCisgICAgMiwgIDMsICAyLCAgMSwgIDAsICAwLCAtMiwgLTIsICAyLCAgMywgIDAsICAxLCAgMSwgIDMsICAzLCAgMiwKKyAgICAwLCAgMCwgLTMsIC0xLCAtMSwgIDIsICAyLCAgMywgLTIsIC0yLCAtMywgIDEsICAxLCAgMiwgIDEsICAxLAorICAgLTIsIC0xLCAtMiwgIDIsICAxLCAgMSwgLTEsIC0yLCAgMCwgIDEsICAwLCAgMiwgIDAsICAwLCAtMiwgLTIsCisgICAgMCwgIDEsICAwLCAgMiwgIDAsICAwLCAtMiwgLTIsIC0zLCAtMiwgLTIsICAwLCAtMSwgLTIsIC0yLCAtMywKKyAgICAwLCAgMSwgLTEsICAzLCAtMSwgIDEsICAzLCAtMSwgIDAsICAxLCAtMSwgIDMsIC0xLCAtMSwgIDIsIC0zLAorICAgIDEsICAxLCAtMiwgIDMsIC0xLCAtMywgIDAsIC0zLCAgMiwgIDIsIC0yLCAgMywgIDAsIC0yLCAgMSwgLTIsCisgICAgMSwgIDEsIC0zLCAgMywgLTEsIC0yLCAgMSwgLTMsICAxLCAgMSwgLTMsICAzLCAgMCwgLTEsICAxLCAtMiwKKyAgICAxLCAgMiwgLTEsICA0LCAgMCwgLTEsICAxLCAtMiwgIDAsICAxLCAtMSwgIDMsIC0xLCAtMywgIDAsIC0zLAorICAgLTMsIC0zLCAtMSwgIDEsICAyLCAgMSwgLTEsIC0yLCAtMiwgLTIsICAwLCAgMiwgIDEsICAwLCAtMiwgLTIsCisgICAtMywgLTIsICAxLCAgMiwgIDEsIC0xLCAtMiwgLTEsIC0zLCAtMiwgIDIsICA0LCAgMCwgLTIsIC0yLCAgMSwKKyAgIC0zLCAtMSwgIDIsICA0LCAgMCwgLTIsIC0yLCAgMiwgLTEsICAxLCAgNCwgIDMsIC0xLCAtMywgLTIsICAyLAorICAgIDAsICAyLCAgNCwgIDIsIC0xLCAtMiwgLTEsICAyLCAgMCwgIDEsICAyLCAgMCwgLTEsICAwLCAgMSwgIDMsCisgICAgMywgIDAsIC01LCAgMSwgIDQsICAwLCAgMCwgIDEsICAxLCAtMiwgLTUsICAyLCAgNSwgLTEsIC0yLCAgMSwKKyAgIC0xLCAgMCwgIDAsICAzLCAgMywgIDEsICAwLCAtMSwgLTIsICAzLCAgNCwgLTIsIC0zLCAtMSwgIDAsIC0yLAorICAgLTMsICAzLCAgNSwgLTMsIC0zLCAgMCwgIDAsIC0yLCAtMSwgIDMsICAyLCAtMiwgLTIsICAyLCAgMiwgLTEsCisgICAgMiwgIDAsICAwLCAtMSwgIDAsICAwLCAgMCwgIDAsICAwLCAtMywgLTIsICAxLCAgMywgIDAsIC0yLCAtMgorfTsKKworLyogbGlzdCBvZiBjb2RlYm9va3MgZm9yIGludGVyLWNvZGVkIHZlY3RvcnMgKi8KK2NvbnN0IGludDhfdCogY29uc3QgZmZfc3ZxMV9pbnRlcl9jb2RlYm9va3NbNl0gPSB7CisgICAgc3ZxMV9pbnRlcl9jb2RlYm9va180eDIsIHN2cTFfaW50ZXJfY29kZWJvb2tfNHg0LAorICAgIHN2cTFfaW50ZXJfY29kZWJvb2tfOHg0LCBzdnExX2ludGVyX2NvZGVib29rXzh4OCwKKyAgICBOVUxMLCBOVUxMLAorfTsKKworLyogNngxNi1lbnRyeSBjb2RlYm9vayBmb3IgaW50cmEtY29kZWQgNHgyIHZlY3RvcnMgKi8KK0RFQ0xBUkVfQUxJR05FRCg0LCBzdGF0aWMgY29uc3QgaW50OF90LCBzdnExX2ludHJhX2NvZGVib29rXzR4MilbNzY4XSA9IHsKKyAgIDEyLCAxMywgMTMsIDExLCAtNywtMTAsLTE1LC0xNywtMTYsLTE1LC0xMiwtMTAsIDExLCAxNSwgMTUsIDEyLAorICAgIDIsIDE3LCAyMCwgMTUsLTQ1LC0yNCwgIDIsIDEzLCAyMSwgMjAsIC02LC0zNiwgMTIsIDE2LCAtMSwtMjcsCisgIC0xOCwtMjEsIDEwLCA0NSwtMTEsLTIwLCAtNywgMjEsIDQzLCAtOCwtMjgsICAwLCAzMywtMTYsLTI4LCAgMywKKyAgLTEyLC0xOCwtMTgsIC02LC0yMCwtMTAsIDI4LCA1NSwgLTUsLTE4LC0yMSwtMTgsIDU2LCAzMCwgLTYsLTIwLAorICAtMzQsIDI3LCAyOSwtMjIsLTMwLCAyOSwgMjYsLTI1LCAzMCwgMzQsIDMzLCAyNiwtMjUsLTMxLC0zNSwtMzMsCisgIC0zMSwtMzUsLTM2LC0zMiwgMjksIDM2LCAzNywgMzEsLTcxLC0xMiwgMzgsIDM0LC02MywgLTEsIDQyLCAzMywKKyAgIDU4LCAzNywtMzEsLTYwLCA1NSwgMzQsLTMzLC02MSwtNTcsLTU3LCAyMiwgOTMsLTU3LC01OCwgMjEsIDkzLAorICAgNTksIDY5LCA3MCwgNjIsLTYzLC02OCwtNjgsLTYwLC02NCwtNzEsLTcxLC02NCwgNjMsIDczLCA3MiwgNjIsCisgICAtMiwgIDAsICA3LCAxNSwtMTEsLTEwLCAtMywgIDUsIC01LCAtOCwtMTAsLTEwLCAgMSwgIDksIDE0LCAgOSwKKyAgIDE1LCAgOCwgLTQsLTExLCAxMiwgIDIsLTExLC0xMiwgLTgsICAwLCAxOSwgMjgsICA0LCAtMSwtMTUsLTI2LAorICAtMTUsIDI3LCAgMiwtMTQsLTE0LCAyMiwgIDEsIC05LCAtNCwgLTYsLTEzLC0xMCwgLTYsLTE0LCAgNiwgNDcsCisgIC0zNSwtMjAsICA2LCAyMywgIDYsICA5LCAgNiwgIDQsIC02LCAgMiwgMjMsLTIyLCAtNywgIDQsIDI4LC0yMSwKKyAgIDIwLC0yMiwgLTIsICA2LCAyMiwtMjgsIC01LCAgOCwtMTAsLTE4LC0xNiwtMTIsIDM2LCAxOSwgIDIsIC0xLAorICAgLTMsICAwLCAgNCwgIDgsLTQ1LC0xMCwgMjMsIDIzLCA0MCwgMTUsLTIwLC0zNSwgLTQsIC0xLCAgNCwgIDEsCisgICAgOSwgLTUsLTMzLCAyNCwgIDgsICAzLC0yNiwgMTksIC0xLCAgNCwgIDYsIC0zLCAzMiwgMjUsLTEzLC00OSwKKyAgIDI0LCAyNCwgMTUsICA3LC0xNywtMjcsLTE5LCAtNywtNDcsICAwLCAzOSwgMjQsLTIxLCAtNiwgIDcsICA0LAorICAgLTEsICAwLC0xMCwtMTMsICAxLCAgMSwgIDUsIDE2LCAyMCwgIDUsIC0zLCAtOSwgLTEsIC00LCAtMiwgLTYsCisgIC0xNywgLTcsICAxLCAgNCwgMTIsICA3LCAgMCwgIDAsICAzLCAgMCwgMTIsIDExLCAtMywgIDEsICAwLC0yMywKKyAgICA0LCAxNywgLTYsICAwLCAgNiwgIDMsLTI1LCAgMCwtMTcsIDEwLCAgOCwgIDUsLTE0LCAgNCwgIDEsICA0LAorICAgMTMsIDEwLCAgNCwgIDIsLTIzLCAtOSwgIDEsICAyLCAgMywgLTMsICAxLCAgNywgIDEsLTIzLCAtNywgMjAsCisgICAtNywtMTgsICAyLCAxMiwgLTUsIC00LCAxMCwgIDksICA0LCAxMCwgIDcsLTI0LCAgNiwgIDMsICA0LC0xMCwKKyAgIDIyLC0xNCwtMjIsICA2LCAgMCwgIDUsICA1LCAtMSwgLTQsICAzLC0xMSwgLTQsIC03LCAzMSwgIDcsLTE0LAorICAgLTUsLTE2LCAtMSwgNDIsIC00LCAtMiwgLTksIC01LCAgNSwgLTgsIC02LCAtMywgNDIsIC00LC0yMSwgLTUsCisgIC0xOCwgMTIsIDIwLC0xMiwgMTMsLTEzLC0xMCwgIDcsIC04LCAtOSwgLTIsLTE4LC0xNiwgIDYsIDQwLCAgOCwKKyAgIDEwLCAtMSwgIDAsICA0LCAtMywgIDQsIC0xLC0xMywgLTIsICA2LCAgMSwtMTUsICA1LCAgMywgIDEsICAyLAorICAgLTQsIC0yLCAgMSwgIDMsIDE1LCAgMCwgLTksIC00LCAtMywgLTQsIC00LCAtNCwgLTMsICA1LCAxNiwgLTMsCisgICAgMiwgMTMsICAzLCAgNCwgLTMsIC04LC0xMCwgIDAsIC02LCAtMiwgLTQsIC0xLCAtMiwgLTMsIC02LCAyMywKKyAgICA2LCAtNiwgIDcsICAxLCAgNCwtMTgsICA1LCAgMSwgLTEsICAxLC0xNSwgMTQsIC01LCAgNiwgLTQsICA0LAorICAgIDIsICAyLCAgMiwgIDYsLTI0LCAgMiwgIDcsICAzLC0yNiwgIDAsICAzLCAgMywgIDUsICA3LCAgMSwgIDYsCisgICAxNCwgLTIsLTE4LCAtMywgIDcsICA1LCAtNCwgIDIsIC02LCAgMywgMzIsICAxLCAtNiwgLTYsIC02LC0xMiwKKyAgICA1LC0zNiwgIDcsICA2LCAgOSwgLTEsIDExLCAgMCwgIDQsICA0LCAgNSwgIDMsICA0LCAxNSwgIDMsLTM4LAorICAgMTAsIDIzLCAtNSwtNDIsICAwLCAgNCwgIDQsICA0LCAyMywgMTcsIC02LC0xMywtMTMsLTM3LCAgMSwgMjksCisgICAgNSwtMTQsIC0xLCAgMSwgIDUsICAwLCAgMywgIDEsICAwLCAgNCwgLTUsICAyLCAgOCwgIDAsICAwLC0xMCwKKyAgICA0LCAgNywgLTIsIC0zLC0xMCwgIDMsICAxLCAgMSwtMTIsIC0xLCAxMywgIDMsICAwLCAtMSwgIDEsIC0zLAorICAgIDAsIC0xLCAgMywgIDEsIC02LCAtOSwgIDMsICA5LCAtNiwgIDEsIC00LCAtNiwgIDgsIC0xLCAgMCwgIDgsCisgICAtMywgLTMsICAwLCAxOCwgLTUsIC0xLCAtNCwgLTEsIC04LCAtMiwgIDMsIC00LCAgMCwgMTcsIC0xLCAtNSwKKyAgICA1LCAtMiwgIDksLTEwLCAgMSwgLTUsICA2LCAtNSwgIDQsICAyLCAgMiwgIDMsIDEwLC0xNCwgLTgsICAxLAorICAgLTEsIC0yLC0xOCwgLTEsIC0xLCAyMCwgIDEsICAyLCAtMSwgIDEsIC05LCAgMSwgLTEsIC05LCAyMiwgLTQsCisgICAgNiwgLTQsICA4LCAtMywgLTEsICA3LC0xOSwgIDUsIC03LCAzMSwgLTQsIC00LCAtNiwgIDAsIC01LCAtNSwKKyAgIC03LCAtOCwtMTksIC00LCAgMSwgIDEsICA0LCAzMiwgMzgsIC0xLCAtOCwgIDQsIC03LCAtOCwgLTYsLTEyLAorICAgLTEsICAwLCAtNywgIDEsIC0xLCAgOSwgLTEsICAwLCAgOSwgLTEsIC0xLCAgMCwgIDIsIC02LCAgMSwgLTMsCisgIC0xMiwgIDAsICAyLCAgMSwgIDEsICAxLCAgOCwgIDAsICA5LCAgMSwgIDAsICAyLCAtMiwgIDEsLTExLCAgMCwKKyAgICAwLCAgOCwgIDIsLTEwLCAtMSwgIDIsIC0xLCAgMCwgLTIsIC00LCAgMCwgLTUsIC0yLCAtMSwgLTEsIDE0LAorICAgLTMsICA3LCAtMSwgIDUsICAwLC0xMCwgIDEsICAxLCAtMSwgLTUsIDE0LCAtMSwgLTIsICAxLCAtMywgLTIsCisgICAtNiwgIDAsICAwLCAgNiwgIDIsICAzLCAtOSwgIDQsICA0LCAtNSwgLTEsIC0xLCAtNywgIDMsICA4LCAtMSwKKyAgICAyLCAtNCwgLTEsLTExLCAxMSwgIDIsICAxLCAgMCwgLTEsICAyLCAgMywgIDksICAwLCAgMiwgIDAsLTE1LAorICAgIDMsICA1LC0yMCwgIDMsICAzLCAtMSwgIDMsICAzLCAgMSwgLTEsIDE2LCAgMSwgIDIsLTI5LCAgOSwgIDIsCisgIC0xMywgLTYsIC0xLCAtMywgMzYsIC0xLCAtOCwgLTMsICAyLCAgNSwgIDQsICAyLC0zNywgIDksIDExLCAgMworfTsKKworLyogNngxNi1lbnRyeSBjb2RlYm9vayBmb3IgaW50cmEtY29kZWQgNHg0IHZlY3RvcnMgKi8KK0RFQ0xBUkVfQUxJR05FRCg0LCBzdGF0aWMgY29uc3QgaW50OF90LCBzdnExX2ludHJhX2NvZGVib29rXzR4NClbMTUzNl0gPSB7CisgIC0xMSwgLTMsICAzLCAgNiwtMTAsIC0xLCAgNSwgIDcsIC05LCAtMSwgIDYsICA3LCAtOSwgLTEsICA0LCAgNiwKKyAgICA1LCAgNywgIDAsLTE0LCAgNiwgIDksICAyLC0xNSwgIDYsICA5LCAgMiwtMTUsICA0LCAgNiwgIDAsLTE0LAorICAgMTYsICAzLCAtNSwgLTYsIDE2LCAgMSwgLTgsIC04LCAxNCwgLTEsIC05LCAtOSwgMTIsICAwLCAtOCwgLTgsCisgICAgOCwgMTIsIDE2LCAxNywgLTIsICAyLCAgNiwgIDksLTEwLCAtOCwgLTQsICAwLC0xNSwtMTQsLTExLCAtNywKKyAgIC03LC0xMCwgLTIsIDE2LCAtNywtMTEsIC0zLCAxOCwgLTcsLTExLCAtMSwgMjAsIC02LCAtOCwgIDEsIDE5LAorICAgLTksLTEzLC0xNiwtMTcsICAyLCAtMiwgLTcsIC05LCAxMSwgIDgsICA0LCAtMSwgMTYsIDE1LCAxMSwgIDcsCisgIC0yMiwgLTIsIDEzLCAxNSwtMjQsIC0yLCAxNCwgMTYsLTI1LCAtNCwgMTMsIDE1LC0yNSwgLTYsIDEwLCAxMywKKyAgIDI2LCAyNiwgMjIsIDE2LCAxNywgMTUsICA5LCAgMywgLTIsIC02LC0xMSwtMTQsLTIwLC0yNSwtMjgsLTI4LAorICAtMjcsLTI3LC0yNSwtMjEsLTE2LC0xNSwtMTEsIC03LCAgMywgIDgsIDEyLCAxMywgMjMsIDI4LCAzMSwgMzAsCisgICAyMCwgMTYsIC03LC0zMywgMjIsIDE5LCAtNiwtMzUsIDIyLCAxOSwgLTYsLTM0LCAyMCwgMTcsIC02LC0zMiwKKyAgLTIwLC0yMCwgIDIsIDM4LC0yMSwtMjIsICAyLCA0MCwtMjEsLTIyLCAgMiwgNDAsLTIwLC0yMCwgIDMsIDM4LAorICAtNDcsIC00LCAyNCwgMjYsLTUwLCAtMywgMjYsIDI3LC01MCwgLTMsIDI2LCAyNywtNDcsIC00LCAyNCwgMjYsCisgICA0NSwgIDYsLTIzLC0yNywgNDgsICA1LC0yNSwtMjgsIDQ4LCAgNSwtMjYsLTI4LCA0NCwgIDYsLTI0LC0yNywKKyAgLTMwLC0zNiwtMTAsIDc2LC0zMSwtMzcsLTExLCA3OCwtMzEsLTM3LC0xMSwgNzgsLTMxLC0zNiwtMTAsIDc3LAorICAtNTMsLTMyLCAzNSwgNTIsLTU0LC0zNCwgMzYsIDUyLC01NCwtMzQsIDM2LCA1MiwtNTMsLTMzLCAzNCwgNTEsCisgIC05MywtMzQsIDYyLCA2NSwtOTMsLTM0LCA2MiwgNjYsLTkzLC0zNCwgNjIsIDY1LC05MywtMzQsIDYwLCA2NCwKKyAgIC03LCAgMCwgIDIsICAyLCAtOCwgLTEsICAzLCAgMywgLTgsICAwLCAgNCwgIDUsIC02LCAgMSwgIDUsICA1LAorICAgIDMsICA3LCAxMSwgMTEsICAyLCAgMiwgIDMsICAzLCAgMSwgLTIsIC02LCAtNywgIDEsIC01LC0xMSwtMTMsCisgICAgMywgLTIsIC00LCAtMywgIDcsICAwLCAtNSwgLTUsIDEyLCAgNCwgLTUsIC03LCAxNCwgIDYsIC00LCAtNywKKyAgIDE4LCAxNCwgIDMsIC0yLCAgNiwgIDQsICAwLCAtMywgLTgsIC01LCAtMiwgIDAsLTE2LC0xMSwgLTIsICAyLAorICAgLTgsIC02LCAgNywgMTgsIC03LCAtOCwgIDIsIDEzLCAtNCwgLTYsIC0yLCAgNiwgIDAsIC00LCAtMywgIDEsCisgICAgMSwgLTMsLTEzLC0xOCwgIDAsIC0xLCAtNSwgLTcsIC0xLCAgMSwgIDYsICA3LCAtMiwgIDQsIDE1LCAxNywKKyAgLTE1LC0xNCwgLTcsIC0yLCAtNiwgLTUsIC0xLCAgMCwgIDYsICA2LCAgMywgIDEsIDE1LCAxMywgIDYsICAxLAorICAgIDIsIC0yLC0xMSwgMTAsICAyLCAtMSwtMTIsIDExLCAgMywgLTEsLTEyLCAxMSwgIDIsIC0yLC0xMSwgMTEsCisgICAtOSwgMTQsIC0xLCAtNSwgLTksIDE1LCAtMiwgLTUsIC04LCAxNiwgLTIsIC01LCAtNywgMTUsIC0xLCAtNCwKKyAgICAyLCAgNiwgIDgsICA4LCAtMiwgIDMsICA5LCAxMiwtMTEsIC01LCAgNCwgMTAsLTE5LC0xNiwgLTgsICAwLAorICAgMTQsICA4LCAtNywtMTUsIDEyLCAgNywgLTcsLTE0LCAgOCwgIDUsIC00LCAtOSwgIDUsICAzLCAtMSwgLTQsCisgICAxMiwtMTQsIC0yLCAgMiwgMTMsLTE1LCAtMSwgIDMsIDE0LC0xNSwgLTEsICAzLCAxMywtMTQsIC0xLCAgMywKKyAgICAwLCAgNiwgMTAsLTEzLCAgMCwgIDYsIDEwLC0xNSwgIDAsICA3LCAgOSwtMTcsICAxLCAgNiwgIDgsLTE2LAorICAgLTgsIC01LCAxNSwgLTIsIC04LCAtNiwgMTcsIC0yLCAtOCwgLTYsIDE2LCAtMywgLTgsIC01LCAxNSwgLTIsCisgICAtOSwtMTEsLTExLC0xMCwgIDksIDEwLCAgOSwgIDgsICA4LCAxMCwgMTAsICA5LCAtOCwgLTksIC04LCAtNywKKyAgICA5LCAxMCwgIDksICA3LCAtOCwtMTAsLTEwLC0xMCwgLTcsLTEwLC0xMSwtMTEsIDExLCAxMiwgMTEsICA4LAorICAgIDAsIDEwLCAgNywgIDAsICAwLCAgNywgIDAsIC02LCAgMCwgIDIsIC01LCAtNiwgLTIsIC0xLCAtNCwgLTEsCisgICAgNSwgIDAsIC02LCAtOSwgIDIsICAyLCAgMiwgIDEsIC0yLCAgMCwgIDUsICA3LCAtNiwgLTUsICAxLCAgNCwKKyAgICAzLCAtOCwgIDIsIC0xLCAgNCwgLTksICAzLCAgMCwgIDUsIC03LCAgMywgIDAsICA3LCAtNSwgIDMsICAwLAorICAgLTUsIC0zLCAgMiwgIDksIC02LCAtMywgIDEsICA4LCAtNiwgLTMsICAxLCAgNywgLTUsIC0yLCAgMCwgIDQsCisgICAxMywgIDgsICAzLCAgMSwgLTMsIC01LCAtNCwgLTEsIC04LCAtNywgLTMsICAwLCAtMSwgIDEsICAzLCAgMiwKKyAgICAzLCAgMiwgLTUsLTEyLCAgNCwgIDMsIC0yLCAtOSwgIDMsICA0LCAgMSwgLTQsICAzLCAgNSwgIDQsIC0xLAorICAgLTksIC04LCAtNCwgIDAsICA4LCAgNiwgIDIsICAwLCAxMCwgIDgsICAzLCAgMCwgLTYsIC01LCAtMywgLTEsCisgICAtMywgLTksLTEyLCAtNSwgIDAsIC0zLCAtNSwgIDAsICAyLCAgMywgIDIsICA0LCAgNSwgIDgsICA3LCAgNiwKKyAgIC0xLCAtMiwgIDUsIDEyLCAtMSwgLTEsICA1LCAgOSwgIDIsICAxLCAtMSwgLTIsICAyLCAtMSwtMTEsLTE3LAorICAgLTcsICAzLCAgMywgLTEsIC05LCAgMywgIDQsIC0xLC0xMCwgIDQsICA2LCAtMSwgLTksICA1LCAgNywgIDAsCisgIC0xOCwgLTcsICAyLCAgMiwgLTgsICAxLCAgNSwgIDMsICAzLCAgNCwgIDEsICAwLCAgOSwgIDUsIC0yLCAtMywKKyAgIC0yLCAgMCwgIDYsICA4LCAtNCwgLTUsIC01LCAtMywgIDEsIC0yLCAtNiwgLTgsIDEwLCAgOSwgIDMsIC0xLAorICAgIDAsIC0yLCAtMiwgIDAsICAwLCAtNCwgLTUsICAwLCAtMiwgLTgsIC00LCAgOCwgLTUsIC03LCAgNiwgMjQsCisgICAgOSwgIDEsIC03LCAgMSwgIDksICAxLCAtOCwgIDEsICA4LCAgMCwtMTAsICAxLCAgOCwgLTEsLTExLCAtMSwKKyAgICA4LCAgOCwgIDYsICAzLCAgNSwgIDQsICAzLCAgMiwgLTIsIC0zLCAtMSwgIDAsLTEwLC0xMywgLTgsIC00LAorICAgIDAsICA0LCAgMiwgLTMsICAwLCAgNiwgIDMsIC01LCAgMywgMTAsICAyLC0xMiwgIDUsIDEwLCAtNCwtMjIsCisgICAgMCwgLTQsIC0xLCAgMywgIDEsIC00LCAtMSwgIDUsICAxLCAtNSwgIDAsICA4LCAtMSwgLTYsIC0yLCAgNywKKyAgIC0xLCAtMSwgLTIsIC00LCAtMSwgLTIsIC00LCAtNiwgLTEsIC0xLCAtMSwgLTIsICAxLCAgNSwgMTAsICA5LAorICAgMTAsICAzLCAgMCwgLTIsICA2LCAtMSwgLTIsIC01LCAgMywgLTEsIC0yLCAtNiwgIDIsICAwLCAgMCwgLTUsCisgICAgNiwgIDMsICAwLCAgMCwgIDYsICAzLCAgMSwgIDEsICA0LCAtMiwgLTIsICAxLCAgMCwgLTksIC05LCAtMiwKKyAgLTExLCAtMywgIDEsICAyLCAtNiwgIDIsICA0LCAgNSwgLTMsICAyLCAgMywgIDQsIC0yLCAgMSwgIDEsICAyLAorICAgLTYsIC00LCAtMSwgLTIsICAyLCAtMSwgLTEsIC0yLCAxMCwgIDIsIC0yLCAtMiwgMTEsICAyLCAtNCwgLTEsCisgICAgNiwgIDAsIC0yLCAgMiwgIDMsICAzLCAgMCwgIDAsIC02LCAgMywgIDMsICAwLC0xNywgLTEsICA1LCAgMCwKKyAgIC0xLCAgNCwgMTAsIDExLCAtMywgLTIsICAwLCAgMSwgLTMsIC00LCAtNSwgLTMsIC0xLCAtMiwgLTIsIC0xLAorICAgIDIsIC0zLCAtOSwtMTIsICAzLCAgMywgIDMsICAyLCAgMiwgIDIsICA0LCAgNCwgIDIsICAxLCAtMSwgLTIsCisgICAtMiwgIDksICA1LC0xMCwgLTMsICA1LCAgNSwgLTUsIC0yLCAgMSwgIDIsICAwLCAtMSwgLTIsIC0yLCAgMSwKKyAgIC0yLCAtMywgIDcsIC0yLCAtMSwgLTMsICA3LCAtMywgLTEsIC0yLCAgOCwgLTQsIC0yLCAtMiwgIDcsIC0zLAorICAgIDEsIC04LCAtMywgMTIsICAyLCAtMiwgLTIsICA0LCAgMSwgIDMsICAwLCAtNSwgLTEsICA1LCAgMiwgLTcsCisgICAtMSwgIDMsICAxLCAtNSwgLTcsIC0yLCAgMywgIDEsIC0yLCAtNywgLTIsICAyLCAyMCwgIDMsIC01LCAtMSwKKyAgICA1LCAgMCwgLTMsIC0yLCAtNywgLTcsICAwLCAgNiwgLTYsICAwLCAgNywgIDYsICAyLCAgNiwgIDAsIC03LAorICAgLTIsICA2LCAtNywgIDEsIC0yLCAgNywgLTgsICAzLCAtMiwgIDcsIC03LCAgMywgLTEsICA3LCAtNiwgIDIsCisgICAtNSwgLTIsICA1LCAgNywgIDQsICAxLCAtNCwgLTgsICA2LCAgMywgLTIsIC01LCAtNywgLTUsICAzLCAgNywKKyAgIC0xLCAtMSwgIDYsICA1LCAgMCwgLTEsICAxLCAtNCwgIDIsICAxLCAgMCwgLTcsICAxLCAgMCwgIDAsIC00LAorICAgLTgsICAwLCAgMywgIDEsIC0yLCAgMSwgLTEsIC0xLCAgMSwgLTEsIC0zLCAgMSwgIDEsIC0yLCAgMSwgIDksCisgICAgNSwgIDIsIC0zLCAtNCwgLTEsICAwLCAtMSwgLTMsIC0zLCAgMSwgIDMsICAxLCAtNCwgIDAsICA0LCAgMiwKKyAgICAyLCAtMiwgLTIsIDEyLCAgMCwgLTIsIC01LCAgMywgLTEsICAwLCAtMywgIDEsIC0zLCAtMSwgLTIsICAxLAorICAgIDEsICA1LCAgMywgIDAsIC02LCAtNCwgLTIsICAxLCAgMCwgLTIsIC0yLCAgMiwgIDYsICAxLCAtNCwgLTEsCisgICAtMywgLTUsIC01LCAtMSwgIDMsICA1LCAgNSwgIDQsICAwLCAgMywgIDEsIC0xLCAtMiwgIDEsIC0yLCAtMywKKyAgICAyLCAtNCwgLTUsIC0zLCAgNCwgLTIsIC0zLCAtMiwgIDYsICAwLCAtMSwgLTEsICA3LCAgMSwgIDAsICAwLAorICAgLTMsIC0yLCAtMiwgIDAsIC0yLCAtMywgLTUsIC0xLCAtMiwgIDIsICAwLCAtMSwgLTEsIDExLCAgOSwgLTEsCisgICAgMCwgIDEsIC0xLC0xMCwgLTEsICAxLCAgMCwgLTYsICAxLCAgMCwgIDEsICA0LCAgMiwgLTUsIC0xLCAxMywKKyAgIC0yLCAgNCwgIDUsICAwLCAtNSwgIDEsICA2LCAgMywgLTYsIC0yLCAgMywgIDIsIC01LCAtMiwgIDAsIC0yLAorICAgLTEsICAxLCAgMSwgLTIsIC0xLCAtMiwgIDAsICAyLCAgNSwgIDUsICA1LCAgNywgIDAsIC00LCAtOCwgLTcsCisgICAgMCwgIDIsIC0xLCAtNSwgLTEsICAyLCAgMiwgLTMsICAwLCAgNSwgIDMsIC01LCAgMywgIDgsICAyLC0xMiwKKyAgICA4LCAgNCwgIDAsIC0yLCAxMCwgLTEsIC00LCAtMSwgIDMsIC02LCAtMywgIDAsIC00LCAtNSwgIDAsICAwLAorICAgIDAsLTEwLCAtNCwgIDIsIC0xLCAtNiwgIDMsICA1LCAtMSwgLTMsICA2LCAgNCwgIDAsIC0yLCAgNCwgIDIsCisgICAgMCwgIDgsICAxLCAtMSwgIDAsIDExLCAgMSwgLTMsIC0xLCAgNiwgLTIsIC00LCAtMywgLTIsIC03LCAtNCwKKyAgICAwLCAtMSwgLTEsIC0xLCAgNCwgIDUsICA2LCAgNSwgLTUsIC05LCAtOCwgLTUsICAyLCAgMiwgIDMsICAyLAorICAgIDAsICAyLCAgNiwgIDEsICAyLCAgMCwgIDMsICAwLCAgMSwgLTIsIC0xLCAtMiwgIDAsIC0xLCAtMywgLTYsCisgICAgMCwgIDAsICAyLCAgMCwgIDQsICAwLCAgMiwgIDEsICA1LCAtMiwgIDAsICAwLCAtMiwgLTksIC0xLCAgMiwKKyAgICAwLCAgMSwgIDAsLTEwLCAtMSwgIDEsICA4LCAgMCwgLTEsIC0yLCAgNCwgIDAsICAxLCAtMSwgIDIsIC0xLAorICAgLTMsIC0yLCAgMiwgLTEsIC0zLCAtMSwgIDIsIC0zLCAgMCwgLTEsICAxLCAgMCwgIDgsICAxLCAtMSwgIDMsCisgICAgMCwgIDEsICAxLCAgMiwgIDAsIC00LCAtMiwgIDAsIC0xLCAtNSwgIDEsIC0xLCAtMiwgLTEsIDExLCAgMiwKKyAgICAxLCAgNSwgLTIsIC0yLCAgMCwgIDIsIC00LCAgMCwgLTIsICAxLCAtNSwgIDEsICAwLCAgNSwgIDAsICAxLAorICAgLTUsIC0zLCAgMCwgIDYsIC00LCAgMiwgIDAsICAwLCAtMywgIDUsICAxLCAgMCwgLTMsICAzLCAgMCwgIDAsCisgICAgMywgLTIsIC0zLCAgMSwgIDEsIC00LCAgMCwgIDgsIC0yLCAtMywgLTIsICAzLCAgMSwgIDIsIC0xLCAtMSwKKyAgICAxLCAgMSwgIDAsICAyLCAgMiwgIDAsICAxLCAgNiwgIDEsIC0xLCAgMiwgIDEsICAwLCAgMywgIDAsLTE5LAorICAgIDEsIC0zLCAtMiwgIDIsICA2LCAgNSwgLTIsIC03LCAtMywgIDEsICAzLCAgMSwgLTEsIC0xLCAgMCwgIDIsCisgICAtOCwgLTEsIC0xLCAtNCwgIDEsICAxLCAtMSwgIDIsICA0LCAgMywgIDIsICAzLCAtNSwgIDEsICAzLCAgMCwKKyAgICAwLCAgMiwgLTEsICAxLCAtMywgIDAsICAwLCAgNSwgLTUsIC0yLCAgMCwgIDgsIC00LCAtNCwgLTQsICA2LAorICAgIDEsICAyLCAgMSwgIDIsICAyLCAgMiwgLTMsICAyLCAgNCwgIDAsIC05LCAgMCwgIDcsICAwLC0xMSwgIDEsCisgICAgMCwgIDAsICAwLCAtMiwgIDMsICAzLCAtMSwgLTYsICA0LCAgMywgLTMsLTEwLCAtMSwgIDIsICA2LCAgMiwKKyAgICA3LCAtMiwgLTMsICA1LCAtNCwgIDAsICAzLCAtMSwgLTQsICAyLCAgMSwgLTcsICAyLCAtMSwgLTEsICAzLAorICAgIDMsICAyLCAgMiwgIDIsIC01LCAtNywgLTcsIC01LCAgNSwgIDYsICA0LCAgMiwgLTIsIC0xLCAgMCwgIDEKK307CisKKy8qIDZ4MTYtZW50cnkgY29kZWJvb2sgZm9yIGludHJhLWNvZGVkIDh4NCB2ZWN0b3JzICovCitERUNMQVJFX0FMSUdORUQoNCwgc3RhdGljIGNvbnN0IGludDhfdCwgc3ZxMV9pbnRyYV9jb2RlYm9va184eDQpWzMwNzJdID0geworICAgIDUsICA2LCAgNiwgIDYsICA3LCAgNywgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMiwgIDMsCisgICAtMywgLTQsIC00LCAtNSwgLTUsIC00LCAtMywgLTIsIC00LCAtNCwgLTQsIC01LCAtNCwgLTQsIC0zLCAtMywKKyAgICAxLCAgMiwgIDIsICAyLCAgMiwgIDMsICAzLCAgMywgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA1LAorICAgLTEsICAwLCAgMSwgIDEsICAyLCAgMywgIDQsICA0LCAtOSwtMTAsIC05LCAtOSwgLTgsIC03LCAtNiwgLTUsCisgICAtNCwgLTQsIC01LCAtNiwgLTYsIC03LCAtNywgLTcsICAwLCAtMSwgLTIsIC0yLCAtMywgLTMsIC00LCAtNCwKKyAgICA0LCAgNCwgIDMsICAzLCAgMiwgIDEsICAxLCAgMCwgIDcsICA3LCAgNywgIDYsICA2LCAgNSwgIDQsICA0LAorICAgIDIsICA0LCAgNSwgIDYsICA0LCAgMSwgLTMsIC02LCAgMywgIDQsICA1LCAgNSwgIDQsICAwLCAtNSwgLTgsCisgICAgMiwgIDMsICA0LCAgNCwgIDIsIC0yLCAtNywtMTAsICAyLCAgMiwgIDIsICAxLCAgMCwgLTQsIC05LC0xMiwKKyAgIC05LCAtNywgLTMsICAxLCAgNCwgIDQsICAzLCAgMywtMTAsIC03LCAtMiwgIDMsICA1LCAgNSwgIDMsICAzLAorICAgLTksIC02LCAtMiwgIDMsICA2LCAgNSwgIDQsICAzLCAtOCwgLTYsIC0xLCAgMywgIDQsICA0LCAgMywgIDIsCisgICAtNSwgLTUsIC01LCAtNSwgLTMsICAxLCAgNCwgIDcsIC01LCAtNSwgLTUsIC00LCAtMiwgIDEsICA2LCAgOCwKKyAgIC00LCAtNSwgLTQsIC0zLCAtMSwgIDMsICA4LCAxMCwgLTMsIC00LCAtMywgLTIsICAxLCAgNSwgIDksIDExLAorICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtNCwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTQsCisgICAtMywgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTMsICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDEwLCAxMCwKKyAgICA3LCAgNCwgIDEsIC0yLCAtNCwgLTYsIC05LC0xMCwgIDksICA3LCAgMywgIDAsIC0yLCAtNCwgLTgsIC05LAorICAgMTEsICA4LCAgNCwgIDIsICAwLCAtMywgLTYsIC04LCAxMSwgIDksICA1LCAgMywgIDEsIC0yLCAtNSwgLTcsCisgIC0xMywtMTMsLTEzLC0xMiwtMTEsLTEwLCAtOCwgLTgsICAwLCAgMSwgIDIsICAzLCAgNCwgIDQsICA0LCAgMywKKyAgICAzLCAgNCwgIDUsICA2LCAgNiwgIDYsICA1LCAgNCwgIDMsICA0LCAgNCwgIDQsICAzLCAgMywgIDMsICAyLAorICAgMTAsIDEwLCAxMSwgMTAsICA5LCAgOSwgIDgsICA3LCAgNiwgIDYsICA2LCAgNiwgIDUsICA0LCAgMywgIDIsCisgICAgMCwgIDAsICAwLCAtMSwgLTIsIC0zLCAtNCwgLTQsLTEwLC0xMCwtMTEsLTEyLC0xMywtMTQsLTE0LC0xNCwKKyAgIDE2LCAxNiwgMTcsIDE2LCAxNSwgMTMsIDEyLCAxMSwgLTEsIC0yLCAtMywgLTQsIC00LCAtNCwgLTQsIC0zLAorICAgLTQsIC01LCAtNiwgLTYsIC02LCAtNiwgLTYsIC02LCAtNSwgLTYsIC02LCAtNiwgLTYsIC02LCAtNSwgLTUsCisgIC0xMywtMTMsLTEzLC0xMiwtMTEsLTEwLCAtOCwgLTYsIC05LCAtOCwgLTcsIC02LCAtNCwgLTIsICAwLCAgMSwKKyAgIC0yLCAtMSwgIDEsICAzLCAgNSwgIDcsICA4LCAgOSwgIDUsICA3LCAgOSwgMTEsIDEzLCAxNCwgMTUsIDE1LAorICAgMTYsIDE0LCAxMSwgIDcsICAyLCAtMywgLTcsIC05LCAxNCwgMTIsICA4LCAgMywgLTEsIC02LCAtOSwtMTEsCisgICAxMSwgIDksICA0LCAgMCwgLTQsIC04LC0xMSwtMTMsICA4LCAgNSwgIDEsIC0zLCAtNiwtMTAsLTEyLC0xNCwKKyAgLTE4LC0xNSwgLTksIC0zLCAgMSwgIDYsICA5LCAxMSwtMTcsLTEzLCAtNywgLTEsICAzLCAgNywgMTEsIDEyLAorICAtMTUsLTExLCAtNSwgIDEsICA1LCAgOSwgMTIsIDEzLC0xMywgLTksIC0zLCAgMiwgIDUsICA5LCAxMSwgMTMsCisgICAyMiwgMjEsIDE5LCAxNSwgMTAsICAzLCAtNCwgLTksIDIwLCAxOCwgMTUsICA5LCAgMiwgLTUsLTEyLC0xNywKKyAgIDE2LCAxMywgIDgsICAxLCAtNywtMTQsLTIwLC0yNCwgMTAsICA2LCAtMSwgLTgsLTE1LC0yMSwtMjUsLTI3LAorICAtMjUsLTIzLC0yMCwtMTQsIC03LCAgMSwgIDksIDE0LC0yMywtMjEsLTE2LCAtOSwgIDAsICA5LCAxNiwgMjEsCisgIC0yMCwtMTYsLTEwLCAtMSwgIDgsIDE2LCAyMiwgMjUsLTE1LC0xMSwgLTMsICA2LCAxNCwgMjAsIDI1LCAyNywKKyAgIC00LCAtMiwgIDAsICAxLCAgMiwgIDIsICAyLCAgMiwgLTUsIC0yLCAgMCwgIDIsICAzLCAgMywgIDMsICAzLAorICAgLTYsIC00LCAtMSwgIDEsICAyLCAgMywgIDMsICAzLCAtNywgLTUsIC0yLCAgMCwgIDEsICAxLCAgMiwgIDIsCisgICAgMiwgIDEsICAxLCAgMSwgIDEsICAwLCAtMiwgLTMsICAzLCAgMywgIDIsICAxLCAgMCwgLTEsIC0zLCAtNCwKKyAgICA0LCAgMywgIDIsICAxLCAgMCwgLTIsIC00LCAtNiwgIDUsICA0LCAgMywgIDEsIC0xLCAtMywgLTUsIC02LAorICAgIDUsICA2LCAgNiwgIDQsICAyLCAgMCwgLTIsIC0zLCAgMywgIDQsICA0LCAgNCwgIDMsICAxLCAgMCwgLTEsCisgICAtMiwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTIsIC01LCAtNCwgLTMsIC0yLCAtMiwgLTIsIC0zLCAtMywKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTMsIC00LCAtNCwgLTQsIC0zLCAtMywgLTMsIC0zLAorICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0yLCAgNSwgIDYsICA2LCAgNiwgIDYsICA1LCAgNCwgIDMsCisgICAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNiwgIDcsICAwLCAtMSwgLTEsIC0xLCAtMSwgIDAsICAxLCAgMiwKKyAgIC0yLCAtMywgLTMsIC0zLCAtMywgLTIsIC0xLCAgMCwgLTMsIC0zLCAtNCwgLTQsIC00LCAtMywgLTIsIC0xLAorICAgIDAsIC0yLCAtNCwgLTQsIC0yLCAgMCwgIDIsICAzLCAgMCwgLTIsIC0zLCAtMywgLTEsICAyLCAgNCwgIDUsCisgICAtMSwgLTIsIC00LCAtMywgIDAsICAzLCAgNSwgIDYsIC0yLCAtMywgLTQsIC0zLCAtMSwgIDIsICA0LCAgNSwKKyAgICA5LCAgNCwgIDAsIC0zLCAtMywgLTEsICAwLCAgMSwgIDgsICA0LCAtMSwgLTQsIC0zLCAtMSwgIDEsICAyLAorICAgIDYsICAyLCAtMywgLTUsIC00LCAtMiwgIDAsICAxLCAgNSwgIDEsIC0zLCAtNCwgLTQsIC0yLCAgMCwgIDEsCisgICAgNSwgIDMsICAxLCAtMSwgLTQsIC04LC0xMCwtMTAsICAzLCAgMywgIDIsICAxLCAgMCwgLTIsIC0zLCAtNCwKKyAgICAxLCAgMSwgIDEsICAyLCAgMywgIDIsICAxLCAgMCwgLTEsICAwLCAgMSwgIDIsICAzLCAgNCwgIDMsICAyLAorICAgIDAsICAxLCAgMiwgIDIsICAxLCAtMSwgLTMsIC0zLCAgMCwgIDEsICAxLCAgMSwgLTEsIC0yLCAtNCwgLTMsCisgICAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMSwgIDIsIC00LCAtNCwgLTMsICAwLCAgMywgIDcsIDEyLCAxNCwKKyAgIC01LCAtNSwgLTYsIC02LCAtNiwgLTYsIC02LCAtNSwgIDIsICAyLCAgMiwgIDEsICAwLCAgMCwgIDAsICAwLAorICAgIDQsICA0LCAgMywgIDIsICAxLCAgMCwgIDAsICAwLCAgNiwgIDYsICA1LCAgNCwgIDIsICAyLCAgMSwgIDEsCisgICAtNywgLTcsIC02LCAtMywgIDAsICA0LCAgNywgIDgsIC0xLCAtMiwgLTMsIC0zLCAtMiwgLTEsICAxLCAgMiwKKyAgICAzLCAgMywgIDEsIC0xLCAtMiwgLTIsIC0yLCAtMSwgIDYsICA2LCAgNCwgIDIsICAwLCAtMiwgLTIsIC0yLAorICAgLTYsIC01LCAtMiwgIDIsICA1LCAgOSwgMTEsIDEyLCAtNCwgLTQsIC0yLCAgMCwgIDIsICA0LCAgNSwgIDYsCisgICAtMywgLTIsIC0yLCAtMiwgLTIsIC0xLCAgMCwgIDEsIC0yLCAtMiwgLTIsIC0zLCAtMywgLTMsIC0zLCAtMiwKKyAgIC03LCAtMywgIDEsICAzLCAgMywgIDAsIC0zLCAtNSwgLTYsIC0yLCAgMywgIDUsICA0LCAgMSwgLTMsIC01LAorICAgLTUsIC0xLCAgNCwgIDYsICA1LCAgMiwgLTMsIC00LCAtNCwgIDAsICA1LCAgNywgIDYsICAzLCAtMSwgLTMsCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0yLCAtMiwgLTMsIC0zLCAtMywgLTMsIC0yLCAtMSwKKyAgICA2LCAgNywgIDgsICA5LCAgOSwgIDgsICA3LCAgNiwgLTQsIC00LCAtNSwgLTUsIC02LCAtNiwgLTUsIC00LAorICAgLTksIC04LCAtNiwgLTQsICAwLCAgMywgIDYsICA2LCAtNSwgLTQsIC0xLCAgMywgIDUsICA2LCAgNSwgIDMsCisgICAgMSwgIDMsICA2LCAgNiwgIDQsICAxLCAtMiwgLTUsICA2LCAgNywgIDUsICAxLCAtMywgLTcsLTEwLC0xMSwKKyAgIDEwLCAgOSwgIDUsICAxLCAtMywgLTYsIC02LCAtNCwgIDUsICAzLCAtMSwgLTUsIC02LCAtNSwgLTIsICAyLAorICAgLTIsIC00LCAtNiwgLTYsIC00LCAgMSwgIDYsIDEwLCAtNiwgLTcsIC03LCAtNCwgIDEsICA3LCAxMSwgMTIsCisgICAgNiwgIDUsICAzLCAgMiwgIDAsICAwLCAgMCwgIDAsICAyLCAgMSwgLTEsIC0yLCAtMywgLTIsIC0xLCAtMSwKKyAgICAwLCAtMSwgLTIsIC00LCAtNCwgLTIsIC0xLCAgMSwgIDAsICAwLCAtMSwgLTIsIC0xLCAgMCwgIDIsICAzLAorICAgIDAsIC0xLCAtMiwgLTIsIC0yLCAtMiwgLTEsIC0xLCAgNSwgIDQsICAyLCAgMSwgIDAsICAwLCAgMCwgIDAsCisgICAgNiwgIDUsICAzLCAgMSwgIDAsICAwLCAgMCwgIDAsICAyLCAgMCwgLTIsIC00LCAtNCwgLTMsIC0yLCAtMiwKKyAgIC03LCAtNCwgIDAsICAyLCAgMiwgIDIsICAyLCAgMSwgLTcsIC0zLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgLTQsIC0xLCAgMSwgIDEsICAwLCAgMCwgIDAsICAxLCAtMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMywgIDMsCisgICAtMiwgIDAsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsIC0xLCAgMSwgIDIsICAyLCAgMSwgIDAsICAwLCAtMSwKKyAgICAwLCAgMiwgIDQsICAyLCAgMCwgLTEsIC0yLCAtMywgIDEsICAyLCAgMywgIDEsIC0yLCAtNCwgLTYsIC02LAorICAgIDEsICAyLCAgMiwgIDQsICA1LCAgNiwgIDQsICAxLCAgMCwgLTEsIC0xLCAtMSwgIDAsICAwLCAtMiwgLTQsCisgICAgMCwgIDAsIC0xLCAtMiwgLTIsIC0yLCAtNCwgLTYsICAyLCAgMSwgIDAsICAwLCAgMSwgIDEsIC0xLCAtMywKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsICAzLCAgMywgIDAsICAwLCAgMSwgIDAsICAxLCAgMiwgIDQsICA0LAorICAgLTEsIC0xLCAtMSwgLTEsICAwLCAgMSwgIDIsICAzLCAtNCwgLTQsIC01LCAtNSwgLTUsIC0zLCAtMSwgIDAsCisgICAtNiwgLTUsIC01LCAtNCwgLTMsIC0yLCAtMSwgLTEsIC0xLCAgMCwgIDAsICAxLCAgMSwgIDIsICAzLCAgMywKKyAgICAwLCAgMSwgIDEsICAxLCAgMiwgIDIsICAzLCAgNCwgIDAsICAwLCAtMSwgLTEsICAwLCAgMSwgIDIsICAzLAorICAgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgLTEsIC0xLCAgMSwgIDMsICAzLCAgMiwgIDEsIC0xLCAtMiwgLTIsCisgICAtMiwgIDAsICAyLCAgMiwgIDIsICAyLCAgMSwgIDEsIC05LCAtOCwgLTQsIC0yLCAgMSwgIDMsICAzLCAgMywKKyAgIC0xLCAtMSwgLTEsIC0yLCAtMywgLTMsIC0zLCAtNCwgIDAsICAwLCAgMCwgLTEsIC0yLCAtMiwgLTMsIC0zLAorICAgIDIsICAyLCAgMiwgIDAsIC0xLCAtMSwgLTEsIC0xLCAgNSwgIDUsICA0LCAgMywgIDIsICAyLCAgMiwgIDIsCisgICAgNiwgIDMsIC0xLCAtNCwgLTMsIC0xLCAgMSwgIDEsICAyLCAtMSwgLTMsIC00LCAtMSwgIDIsICAyLCAgMCwKKyAgIC0xLCAtMiwgLTIsICAxLCAgNCwgIDQsICAxLCAtMywgLTIsIC0xLCAgMSwgIDQsICA2LCAgMywgLTMsIC04LAorICAgIDMsICAzLCAgMiwgIDEsIC0xLCAtMiwgLTIsIC0yLCAtNCwgLTQsIC0yLCAtMSwgIDEsICAzLCAgNCwgIDQsCisgICAtNCwgLTUsIC01LCAtNCwgLTIsICAwLCAgMiwgIDIsICA3LCAgNywgIDQsICAxLCAtMSwgLTIsIC0zLCAtMiwKKyAgIC0xLCAgMSwgIDMsICAwLCAtNCwgLTYsICAwLCAgNiwgLTIsICAxLCAgNCwgIDEsIC00LCAtNiwgLTEsICA3LAorICAgLTMsICAxLCAgNCwgIDIsIC0zLCAtNiwgLTEsICA2LCAtMiwgIDAsICAzLCAgMiwgLTIsIC01LCAtMSwgIDQsCisgICAgMSwgLTEsIC0yLCAgMSwgIDQsICA0LCAtMSwgLTcsICAxLCAtMSwgLTQsIC0xLCAgNSwgIDYsICAwLCAtNiwKKyAgICAzLCAgMCwgLTQsIC0zLCAgMywgIDYsICAyLCAtNCwgIDMsICAwLCAtNSwgLTQsICAxLCAgNCwgIDEsIC0zLAorICAgIDIsICAyLCAgMywgIDMsICAzLCAgMywgIDIsICAyLCAtNCwgLTUsIC02LCAtNywgLTcsIC03LCAtNywgLTYsCisgICAgMSwgIDIsICAzLCAgMywgIDMsICAzLCAgMiwgIDIsICAwLCAgMCwgIDEsICAxLCAgMSwgIDIsICAyLCAgMSwKKyAgICAzLCAtMywgLTMsICAzLCAgNCwgLTIsIC0yLCAgMiwgIDMsIC00LCAtNCwgIDQsICA0LCAtNCwgLTQsICAyLAorICAgIDQsIC00LCAtNCwgIDQsICA0LCAtNCwgLTMsICAzLCAgMywgLTMsIC00LCAgMywgIDMsIC0zLCAtMywgIDMsCisgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgLTEsICA2LCAgNywgIDgsICA4LCAgOCwgIDcsICA2LCAgNSwKKyAgIC01LCAtNiwgLTcsIC03LCAtOCwgLTcsIC02LCAtNSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDEsICAxLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwgIDAsICAwLCAtMSwgIDAsICAwLCAgMCwgIDAsIC0xLCAgMCwgIDAsCisgICAtMiwgLTMsIC0yLCAtMiwgLTIsIC0zLCAtMywgLTMsICAyLCAgMywgIDUsICA2LCAgNCwgIDIsICAxLCAgMCwKKyAgICA4LCAgNiwgIDIsICAwLCAgMCwgIDAsICAwLCAgMCwgIDQsICAxLCAgMCwgIDAsICAwLCAtMSwgLTEsIC0xLAorICAgIDEsIC0xLCAgMCwgIDAsICAwLCAtMSwgLTIsIC0zLCAtMiwgLTIsIC0xLCAgMCwgIDAsIC0yLCAtNCwgLTUsCisgICAgMywgIDEsIC0xLCAtMiwgLTMsIC00LCAtNSwgLTUsICAyLCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwKKyAgICAwLCAtMSwgLTEsICAwLCAgMiwgIDIsICAyLCAgMiwgLTEsIC0yLCAtMSwgIDEsICAyLCAgMiwgIDIsICAyLAorICAgIDAsIC0xLCAtMiwgLTEsIC0xLCAtMSwgLTEsICAwLCAtMSwgLTIsIC0yLCAtMSwgLTEsICAwLCAgMCwgIDEsCisgICAgMiwgIDEsICAxLCAgMiwgIDIsICAxLCAgMSwgIDAsICA2LCAgNSwgIDMsICAxLCAgMCwgLTIsIC00LCAtNCwKKyAgIC0zLCAtMiwgLTEsICAwLCAgMSwgIDEsICAwLCAtMSwgIDAsICAxLCAgMywgIDQsICA1LCAgNSwgIDMsICAxLAorICAgLTEsIC0xLCAtMSwgIDAsICAxLCAgMCwgLTEsIC0yLCAtMiwgLTIsIC0yLCAtMSwgIDAsIC0xLCAtMiwgLTMsCisgICAgMCwgLTEsIC0yLCAtMiwgLTEsIC0xLCAgMCwgIDIsICAxLCAtMSwgLTIsIC0xLCAtMSwgLTEsICAwLCAgMiwKKyAgICAxLCAgMCwgLTIsIC0yLCAtMiwgLTIsICAxLCAgNSwgIDEsIC0xLCAtMiwgLTIsIC0yLCAgMCwgIDUsIDEwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDAsICAwLCAgMSwgIDIsCisgICAgMSwgIDIsICAyLCAgMywgIDQsICA0LCAgNiwgIDUsIC0zLCAtMywgLTMsIC0yLCAtMiwgLTMsIC0zLCAtMywKKyAgICAxLCAtMSwgLTIsIC0yLCAgMCwgIDMsICA1LCAgNywgIDIsICAwLCAtMiwgLTMsIC0yLCAgMCwgIDIsICAzLAorICAgIDMsICAxLCAtMiwgLTMsIC0zLCAtMiwgLTEsIC0xLCAgMywgIDEsICAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgMSwgIDMsICA1LCAgNCwgIDIsIC0xLCAtMywgLTQsIC0zLCAtMiwgIDEsICAyLCAgMSwgIDAsIC0xLCAtMiwKKyAgIC01LCAtMywgIDAsICAyLCAgMiwgIDEsICAwLCAgMCwgLTMsIC0xLCAgMSwgIDIsICAyLCAgMSwgIDAsICAwLAorICAgIDAsIC0xLCAtMSwgLTEsICAxLCAgMiwgIDMsICA0LCAtMywgLTQsIC00LCAtMywgLTEsICAwLCAgMCwgIDEsCisgICAtMiwgLTMsIC0yLCAtMSwgIDEsICAxLCAgMSwgIDEsIC0yLCAtMiwgIDAsICAzLCAgNCwgIDQsICAzLCAgMiwKKyAgIC00LCAtNCwgLTMsIC0yLCAtMSwgIDEsICAyLCAgMywgIDAsICAxLCAgMSwgIDEsIC0xLCAtMiwgLTMsIC0zLAorICAgIDMsICA0LCAgNSwgIDQsICAyLCAtMSwgLTMsIC0zLCAtMiwgLTIsICAwLCAgMiwgIDIsICAyLCAgMSwgIDAsCisgICAtNCwgIDAsICA1LCAgNywgIDQsIC0xLCAtNCwgLTQsIC0xLCAgMiwgIDQsICAzLCAgMCwgLTMsIC0zLCAtMiwKKyAgICAyLCAgMSwgIDAsIC0xLCAtMiwgLTIsICAwLCAgMSwgIDAsICAwLCAtMSwgLTIsIC0yLCAtMSwgIDEsICAyLAorICAgLTQsIC0zLCAtMiwgLTEsICAwLCAgMSwgIDIsICAyLCAxMCwgIDksICA1LCAgMCwgLTMsIC00LCAtMywgLTIsCisgICAgMSwgLTEsIC0yLCAtMiwgLTEsICAwLCAgMCwgIDAsIC0yLCAtMiwgLTEsICAxLCAgMSwgIDEsICAwLCAtMSwKKyAgIC01LCAtMywgIDAsICAzLCAgNCwgIDIsICAwLCAtMiwgLTIsIC0xLCAgMCwgIDEsICAxLCAgMCwgLTEsIC0xLAorICAgIDMsICAyLCAtMSwgLTIsIC0yLCAtMSwgIDEsICAxLCAgNywgIDUsIC0xLCAtNSwgLTYsIC0yLCAgMiwgIDQsCisgICAtMiwgIDMsICAzLCAtMywgLTQsICAxLCAgMiwgLTIsIC0zLCAgMywgIDQsIC0zLCAtNCwgIDIsICAzLCAtMiwKKyAgIC0zLCAgMywgIDQsIC0zLCAtNCwgIDIsICAzLCAtMiwgLTQsICAyLCAgNCwgLTIsIC0zLCAgMSwgIDIsIC0xLAorICAgIDQsICAzLCAtMSwgLTMsIC0zLCAtMSwgIDEsICAyLCAtNCwgLTYsIC00LCAgMCwgIDQsICA1LCAgNCwgIDEsCisgICAgMCwgIDIsICA1LCAgNiwgIDIsIC0zLCAtNSwgLTQsICAxLCAgMSwgLTEsIC0zLCAtNSwgLTIsICAyLCAgNCwKKyAgIC0xLCAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgLTEsICAwLCAgMSwgIDEsICAwLCAtMSwgLTEsIC0xLAorICAgLTEsICAwLCAgMSwgIDIsICAyLCAgMSwgLTEsIC0yLCAtMywgLTIsIC0xLCAgMCwgIDAsIC0xLCAtMiwgLTMsCisgICAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDIsICAxLCAgMCwgLTEsICAwLCAgMCwgIDEsICAxLCAgMCwKKyAgICAxLCAtMiwgLTQsIC0xLCAgMSwgIDIsICAxLCAgMCwgIDEsIC00LCAtNywgLTMsICAxLCAgMywgIDIsICAxLAorICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsIC0xLCAgMSwgIDEsICAxLCAgMCwgIDEsICAyLCAgMiwgIDAsCisgICAgMSwgIDEsICAwLCAgMCwgIDAsICAyLCAgMCwgLTMsICAzLCAgMiwgIDAsIC0xLCAtMSwgLTIsIC02LCAtOSwKKyAgICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMiwgIDEsICAwLCAgMCwgIDAsIC0xLCAtMSwgIDAsICAyLAorICAgIDAsICAxLCAgMSwgIDEsIC0xLCAtMywgLTIsICAwLCAtNywgLTUsICAxLCAgNiwgIDYsICAyLCAtMSwgLTEsCisgICAgMywgIDEsIC0xLCAtMywgLTQsIC0yLCAgMSwgIDQsICAyLCAgMCwgLTIsIC0zLCAtNCwgLTMsIC0xLCAgMiwKKyAgICAyLCAgMiwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLAorICAgLTEsICAxLCAgMSwgLTIsIC01LCAtNiwgLTQsIC0xLCAtMSwgIDEsICA0LCAgMywgIDIsICAwLCAgMSwgIDIsCisgICAtMSwgIDAsICAyLCAgMywgIDEsICAwLCAgMCwgIDEsIC0xLCAgMCwgIDEsICAwLCAgMCwgLTEsIC0xLCAgMCwKKyAgICAwLCAgMSwgIDIsICAyLCAgMCwgLTIsIC0xLCAgMSwgLTIsIC0xLCAtMSwgLTIsIC0xLCAgMiwgIDYsICA4LAorICAgLTEsIC0xLCAtMiwgLTMsIC0yLCAgMCwgIDEsICAyLCAtMSwgIDAsICAwLCAtMSwgLTEsICAwLCAtMSwgLTEsCisgICAgMiwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgLTEsIC0xLCAgMSwKKyAgIC0xLCAgMCwgIDIsICAyLCAtMSwgLTMsIC0yLCAgMywgIDAsICAyLCAgMywgIDAsIC01LCAtNywgLTIsICA0LAorICAgLTEsICAwLCAgMCwgIDAsIC0xLCAtMiwgLTMsIC0zLCAtMSwgIDAsIC0xLCAtMiwgLTIsIC0yLCAtMiwgLTIsCisgICAgMSwgIDEsICAwLCAgMCwgIDEsICAyLCAgMCwgLTEsICAxLCAgMiwgIDEsICAyLCAgNSwgIDYsICAyLCAgMCwKKyAgIC0yLCAtNCwgLTMsICAwLCAgMiwgIDIsICAwLCAtMywgIDMsICAxLCAgMCwgIDEsICAyLCAgMSwgLTIsIC0zLAorICAgIDMsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLCAgMSwgLTEsIC0yLCAtMiwgLTEsICAxLCAgMywgIDMsCisgICAgMywgIDIsICAxLCAgMiwgIDQsICAzLCAgMSwgLTIsIC0yLCAtNCwgLTQsIC0zLCAtMSwgIDAsIC0yLCAtMywKKyAgICAxLCAgMCwgLTEsIC0xLCAgMCwgIDEsICAwLCAtMSwgIDMsICAyLCAgMCwgIDAsICAwLCAgMSwgIDEsICAwLAorICAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMiwgIDMsICAzLCAgMiwgIDIsICAyLCAgMSwgIDEsCisgICAgMCwgLTEsIC0yLCAtMywgLTUsIC01LCAtNSwgLTQsICAxLCAgMSwgIDAsIC0xLCAgMCwgIDEsICAzLCAgMywKKyAgIC05LCAtNiwgLTIsICAwLCAgMSwgIDEsICAyLCAgMiwgLTYsIC0yLCAgMSwgIDIsICAxLCAgMSwgIDAsICAxLAorICAgLTIsICAxLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMCwgIDIsICAyLCAgMSwgIDAsICAxLCAgMSwgIDEsCisgICAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwgLTMsIC0yLCAgMCwKKyAgIC0zLCAtMywgLTMsIC0yLCAtMSwgIDMsICA3LCAgOSwgIDEsICAyLCAgMiwgIDIsICAwLCAtMiwgLTQsIC0zLAorICAgIDIsICAwLCAtMiwgLTEsICAzLCAgNCwgLTEsIC02LCAgMSwgIDAsIC0yLCAtMywgLTEsICAzLCAgMywgIDAsCisgICAgMCwgIDMsICAzLCAgMCwgLTIsIC0xLCAgMSwgIDEsIC02LCAtMSwgIDMsICAyLCAtMSwgLTIsICAwLCAgMSwKKyAgICA1LCAgMywgIDAsIC0yLCAtMywgIDAsICAyLCAgMSwgIDEsICAxLCAgMiwgIDIsICAwLCAtMiwgLTQsIC03LAorICAgLTMsIC0yLCAgMSwgIDIsICAyLCAgMSwgLTEsIC00LCAgMiwgIDIsICAwLCAtMiwgLTIsICAwLCAgMiwgIDIsCisgICAgMCwgIDAsIC0yLCAtMywgLTIsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAyLCAgMiwKKyAgIC0yLCAtMSwgIDAsICAxLCAgMCwgIDEsICAyLCAgMywgLTQsIC0yLCAgMCwgIDAsIC0xLCAgMCwgIDIsICAzLAorICAgLTIsIC0yLCAtMiwgLTEsIC0xLCAgMCwgIDIsICA0LCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLCAgMCwgIDEsCisgICAgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDAsICA2LCAgNCwgIDIsICAwLCAtMSwgLTIsIC0xLCAtMSwKKyAgICAwLCAgMSwgIDEsICAxLCAgMSwgLTEsIC01LC0xMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsIC00LAorICAgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsIC0xLCAgMiwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsCisgICAtMywgIDEsICA0LCAgMywgIDMsICAxLCAtMSwgIDAsIC00LCAgMCwgIDEsICAwLCAtMSwgIDAsICAwLCAgMCwKKyAgIC01LCAgMCwgIDIsICAxLCAgMSwgIDEsICAwLCAtMSwgLTEsICAyLCAgMSwgLTIsIC0yLCAtMSwgIDAsIC0xLAorICAgIDIsICA0LCAgNSwgIDMsICAwLCAtMSwgIDEsICAyLCAgMCwgIDAsICAxLCAgMCwgLTIsIC0yLCAtMSwgLTEsCisgICAtMiwgLTIsIC0yLCAtMiwgLTMsIC0yLCAtMSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAxLCAgMiwKKyAgICAwLCAtMiwgLTIsIC0zLCAtMSwgIDIsICAyLCAtMSwgIDEsICAwLCAgMCwgIDAsICAxLCAgNSwgIDMsIC0yLAorICAgLTEsIC0xLCAgMCwgLTEsICAwLCAgMiwgIDAsIC01LCAtMSwgIDAsICAxLCAgMCwgIDAsICAyLCAgMiwgLTIsCisgICAgMywgIDEsIC0xLCAtMSwgIDAsICAxLCAgMSwgIDIsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgLTEwLCAtOCwgLTIsICAxLCAgMiwgIDEsICAxLCAgMSwgLTEsICAxLCAgMiwgIDEsICAwLCAgMCwgIDAsICAwLAorICAgLTEsIC0xLCAgMCwgIDEsICAyLCAgMiwgIDIsICAxLCAtMSwgLTEsIC0xLCAgMCwgLTEsIC0zLCAtNSwgLTQsCisgICAgMSwgIDEsICAyLCAgMSwgIDEsICAwLCAgMCwgIDIsIC0xLCAtMiwgLTEsIC0xLCAtMSwgIDAsICAyLCAgNCwKKyAgIC0zLCAtNywgLTUsICAwLCAgMiwgIDAsICAwLCAgMCwgIDMsIC0xLCAtMiwgIDEsICAyLCAgMSwgIDEsICAyLAorICAgIDEsIC0yLCAtMSwgIDEsICAyLCAgMSwgIDAsICAxLCAgMCwgLTEsICAwLCAgMywgIDIsIC0xLCAtMSwgLTEsCisgICAgMiwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsIC05LCAtNywgLTIsICAzLCAgMywgIDIsICAxLCAgMSwKKyAgICAzLCAgMiwgIDAsIC0yLCAtMiwgLTEsICAxLCAgMSwgIDAsIC0xLCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLAorICAgLTIsIC0xLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMSwgIDIsICAxLCAtMiwgLTQsIC0zLCAgMSwgIDIsCisgICAgMSwgIDIsICAxLCAtMiwgLTMsICAwLCAgMywgIDEsIC0xLCAtMSwgIDAsICAwLCAgMSwgIDMsICAwLCAtNCwKKyAgICAyLCAgMCwgLTEsICAxLCAgMiwgLTIsIC0yLCAgMywgIDIsICAwLCAtMSwgIDIsICAzLCAtMiwgLTQsICAxLAorICAgIDAsICAxLCAgMSwgIDEsICAyLCAtMiwgLTYsIC0yLCAtMSwgIDAsICAwLCAgMCwgIDIsICAwLCAtMiwgLTEsCisgICAtMSwgLTEsICAxLCAgMiwgIDEsIC0yLCAtMywgLTIsICAzLCAtMSwgLTIsIC0xLCAtMSwgIDAsICAxLCAgMiwKKyAgIDEwLCAgNCwgIDAsICAwLCAtMSwgLTIsIC0yLCAtMSwgIDMsIC0xLCAtMiwgLTEsICAwLCAtMSwgLTEsICAwLAorICAgLTUsICAyLCAgNywgIDEsIC00LCAtMiwgIDEsICAwLCAtMiwgIDIsICAzLCAtMSwgLTMsICAwLCAgMiwgIDAsCisgICAgMiwgIDEsICAwLCAgMCwgIDEsICAxLCAtMSwgLTIsICAxLCAtMiwgLTIsIC0xLCAtMSwgLTIsICAwLCAgMCwKKyAgICAwLCAgMywgLTIsIC03LCAtMSwgIDMsICAwLCAgMCwgIDEsICAzLCAtMywgLTUsICAyLCAgMywgLTEsICAwLAorICAgIDAsICAyLCAtMiwgLTIsICA0LCAgMiwgLTIsICAwLCAtMSwgIDEsIC0xLCAgMCwgIDIsIC0xLCAtMiwgIDEsCisgICAgNCwgIDAsIC0zLCAtNCwgLTIsICAxLCAgMiwgIDEsICAwLCAgMCwgIDMsICA1LCAgMywgIDEsIC0xLCAtMiwKKyAgICAxLCAgMSwgIDEsIC0xLCAtMywgLTEsICAxLCAgMSwgIDEsIC0xLCAtMiwgLTIsICAwLCAgMCwgLTEsIC0yCit9OworCisvKiA2eDE2LWVudHJ5IGNvZGVib29rIGZvciBpbnRyYS1jb2RlZCA4eDggdmVjdG9ycyAqLworREVDTEFSRV9BTElHTkVEKDQsIHN0YXRpYyBjb25zdCBpbnQ4X3QsIHN2cTFfaW50cmFfY29kZWJvb2tfOHg4KVs2MTQ0XSA9IHsKKyAgICA0LCAgNCwgIDMsICAyLCAgMiwgIDEsICAwLCAtMSwgIDQsICAzLCAgMywgIDIsICAxLCAgMCwgLTEsIC0xLAorICAgIDMsICAzLCAgMiwgIDIsICAxLCAgMCwgLTEsIC0yLCAgMywgIDIsICAyLCAgMSwgIDAsIC0xLCAtMiwgLTMsCisgICAgMiwgIDIsICAxLCAgMCwgLTEsIC0xLCAtMiwgLTMsICAyLCAgMSwgIDAsICAwLCAtMSwgLTIsIC0zLCAtNCwKKyAgICAxLCAgMCwgIDAsIC0xLCAtMiwgLTMsIC00LCAtNCwgIDAsICAwLCAtMSwgLTIsIC0yLCAtMywgLTQsIC00LAorICAgIDIsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMywgIDMsCisgICAgMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTIsIC0yLCAtNSwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTMsCisgICAtNCwgLTIsIC0xLCAgMCwgIDEsICAyLCAgMiwgIDMsIC00LCAtMiwgLTEsICAwLCAgMSwgIDIsICAzLCAgMywKKyAgIC00LCAtMywgLTEsICAwLCAgMSwgIDIsICAzLCAgMywgLTQsIC0zLCAtMSwgIDAsICAxLCAgMiwgIDMsICAzLAorICAgLTUsIC0zLCAtMSwgIDAsICAxLCAgMiwgIDMsICAzLCAtNSwgLTMsIC0xLCAgMCwgIDEsICAyLCAgMywgIDMsCisgICAtNSwgLTMsIC0xLCAgMCwgIDEsICAxLCAgMiwgIDMsIC01LCAtMywgLTIsIC0xLCAgMCwgIDEsICAyLCAgMywKKyAgICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywgIDIsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA0LAorICAgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAyLCAtMiwgLTIsIC0yLCAtMiwgLTEsIC0xLCAtMSwgIDAsCisgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwKKyAgIC0xLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0yLCAtMiwgLTIsIC0yLAorICAgIDUsICAzLCAgMSwgLTEsIC0yLCAtMywgLTMsIC0zLCAgNSwgIDMsICAxLCAtMSwgLTIsIC0zLCAtMywgLTMsCisgICAgNSwgIDMsICAxLCAtMSwgLTIsIC0zLCAtMywgLTMsICA1LCAgMywgIDEsIC0xLCAtMiwgLTMsIC0zLCAtMywKKyAgICA1LCAgNCwgIDEsICAwLCAtMiwgLTMsIC0zLCAtMywgIDYsICA0LCAgMiwgIDAsIC0yLCAtMiwgLTMsIC0zLAorICAgIDYsICA0LCAgMiwgIDAsIC0xLCAtMiwgLTIsIC0zLCAgNiwgIDQsICAyLCAgMSwgLTEsIC0yLCAtMiwgLTIsCisgICAtMSwgIDEsICAzLCAgMywgIDIsICAwLCAtMywgLTYsIC0xLCAgMSwgIDMsICA0LCAgMywgIDAsIC0zLCAtNiwKKyAgIC0xLCAgMSwgIDQsICA0LCAgMywgIDEsIC0zLCAtNiwgLTEsICAxLCAgMywgIDQsICAzLCAgMSwgLTMsIC02LAorICAgLTIsICAxLCAgMywgIDQsICAzLCAgMSwgLTMsIC02LCAtMiwgIDEsICAzLCAgNCwgIDMsICAxLCAtMywgLTcsCisgICAtMiwgIDEsICAzLCAgMywgIDIsICAwLCAtMywgLTcsIC0yLCAgMCwgIDIsICAzLCAgMiwgIDAsIC0zLCAtNiwKKyAgIDEwLCAgOSwgIDgsICA2LCAgNiwgIDUsICA0LCAgNCwgIDYsICA1LCAgNCwgIDMsICAyLCAgMiwgIDIsICAxLAorICAgIDIsICAxLCAgMCwgLTEsIC0yLCAtMiwgLTIsIC0xLCAtMSwgLTIsIC0zLCAtNCwgLTQsIC00LCAtNCwgLTMsCisgICAtMiwgLTMsIC00LCAtNCwgLTUsIC00LCAtNCwgLTMsIC0yLCAtMiwgLTMsIC0zLCAtMywgLTMsIC0yLCAtMiwKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAyLAorICAgLTIsIC0xLCAgMSwgIDIsICA0LCAgNSwgIDcsICA4LCAtMywgLTIsICAwLCAgMSwgIDMsICA1LCAgNywgIDgsCisgICAtNCwgLTMsIC0xLCAgMCwgIDIsICA0LCAgNiwgIDcsIC01LCAtNCwgLTIsIC0xLCAgMSwgIDMsICA1LCAgNywKKyAgIC02LCAtNSwgLTMsIC0yLCAgMCwgIDIsICA0LCAgNiwgLTYsIC01LCAtNCwgLTIsIC0xLCAgMSwgIDMsICA1LAorICAgLTcsIC02LCAtNSwgLTMsIC0yLCAgMCwgIDIsICAzLCAtOCwgLTcsIC01LCAtNCwgLTMsIC0xLCAgMSwgIDIsCisgICAxMSwgIDksICA3LCAgNSwgIDMsICAxLCAtMSwgLTEsIDEwLCAgOCwgIDYsICAzLCAgMSwgIDAsIC0yLCAtMiwKKyAgICA5LCAgNywgIDUsICAyLCAgMCwgLTIsIC0zLCAtNCwgIDgsICA2LCAgMywgIDEsIC0xLCAtMywgLTQsIC00LAorICAgIDYsICA0LCAgMiwgLTEsIC0zLCAtNCwgLTUsIC01LCAgNSwgIDMsICAwLCAtMiwgLTQsIC01LCAtNiwgLTYsCisgICAgMywgIDEsIC0xLCAtMywgLTUsIC02LCAtNywgLTcsICAyLCAgMCwgLTIsIC00LCAtNiwgLTYsIC03LCAtNywKKyAgICA1LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDMsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LAorICAgIDAsICAyLCAgMiwgIDMsICA0LCAgNCwgIDQsICA1LCAtMiwgLTEsICAwLCAgMSwgIDIsICAyLCAgMywgIDMsCisgICAtNCwgLTMsIC0yLCAtMSwgIDAsICAxLCAgMSwgIDIsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTIsIC0xLCAgMCwKKyAgIC04LCAtNywgLTYsIC02LCAtNSwgLTQsIC0zLCAtMywtMTAsIC05LCAtOCwgLTgsIC03LCAtNiwgLTYsIC01LAorICAgIDYsICA1LCAgMywgIDEsIC0xLCAtMywgLTYsIC04LCAgNiwgIDUsICA0LCAgMiwgLTEsIC0zLCAtNiwgLTgsCisgICAgNiwgIDUsICA0LCAgMiwgIDAsIC0zLCAtNiwgLTgsICA2LCAgNSwgIDQsICAyLCAgMCwgLTMsIC02LCAtOCwKKyAgICA2LCAgNiwgIDQsICAyLCAgMCwgLTMsIC02LCAtOCwgIDYsICA1LCAgNCwgIDIsICAwLCAtMywgLTYsIC04LAorICAgIDYsICA1LCAgNCwgIDIsICAwLCAtMywgLTYsIC04LCAgNiwgIDUsICA0LCAgMiwgLTEsIC0zLCAtNSwgLTgsCisgICAxMSwgMTAsICA5LCAgOCwgIDcsICA2LCAgNSwgIDQsICA4LCAgOCwgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwKKyAgICA2LCAgNSwgIDQsICA0LCAgMiwgIDIsICAxLCAgMCwgIDMsICAzLCAgMiwgIDEsICAwLCAgMCwgLTEsIC0yLAorICAgIDEsICAxLCAgMCwgLTEsIC0yLCAtMiwgLTMsIC0zLCAtMSwgLTEsIC0yLCAtMywgLTQsIC00LCAtNSwgLTUsCisgICAtMywgLTQsIC00LCAtNSwgLTYsIC02LCAtNywgLTcsIC01LCAtNSwgLTYsIC03LCAtOCwgLTgsIC04LCAtOCwKKyAgLTE0LC0xMywtMTIsLTExLCAtOSwgLTcsIC02LCAtNCwtMTIsLTExLC0xMCwgLTksIC03LCAtNSwgLTMsIC0xLAorICAtMTAsIC05LCAtNywgLTYsIC0zLCAtMiwgIDAsICAyLCAtOCwgLTYsIC00LCAtMiwgIDAsICAyLCAgNCwgIDUsCisgICAtNSwgLTMsICAwLCAgMiwgIDQsICA1LCAgNywgIDgsIC0yLCAgMCwgIDIsICA0LCAgNiwgIDgsICA5LCAxMCwKKyAgICAwLCAgMywgIDUsICA3LCAgOCwgMTAsIDExLCAxMiwgIDMsICA1LCAgNywgIDgsIDEwLCAxMSwgMTIsIDEyLAorICAtMTksLTE5LC0xOCwtMTgsLTE3LC0xNiwtMTUsLTE0LC0xNSwtMTUsLTE0LC0xMywtMTIsLTExLC0xMCwgLTksCisgIC0xMSwtMTAsIC05LCAtOCwgLTYsIC01LCAtNCwgLTMsIC02LCAtNSwgLTMsIC0yLCAtMSwgIDAsICAxLCAgMiwKKyAgIC0xLCAgMCwgIDIsICAzLCAgNCwgIDUsICA2LCAgNiwgIDQsICA2LCAgNywgIDgsICA5LCAxMCwgMTAsIDEwLAorICAgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxMiwgMTQsIDE0LCAxNSwgMTYsIDE2LCAxNiwgMTYsCisgICAyMiwgMjEsIDE5LCAxNywgMTQsIDExLCAgOSwgIDUsIDIwLCAxOSwgMTcsIDE0LCAxMSwgIDgsICA0LCAgMSwKKyAgIDE3LCAxNSwgMTMsIDEwLCAgNiwgIDMsICAwLCAtNCwgMTMsIDExLCAgOCwgIDUsICAxLCAtMiwgLTUsIC05LAorICAgIDksICA2LCAgMywgLTEsIC00LCAtNywtMTEsLTEzLCAgNCwgIDAsIC0zLCAtNiwgLTksLTEyLC0xNSwtMTcsCisgICAtMiwgLTUsIC04LC0xMSwtMTQsLTE2LC0xOCwtMjAsIC04LC0xMCwtMTMsLTE2LC0xNywtMTksLTIxLC0yMiwKKyAgIDE3LCAxOCwgMTgsIDE4LCAxNywgMTYsIDE2LCAxNCwgMTYsIDE2LCAxNSwgMTUsIDE0LCAxMywgMTIsIDExLAorICAgMTIsIDEyLCAxMSwgMTAsICA5LCAgOCwgIDcsICA1LCAgNywgIDYsICA2LCAgNCwgIDMsICAyLCAgMSwgLTEsCisgICAgMSwgIDAsIC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC01LCAtNiwgLTcsIC04LCAtOSwtMTAsLTExLC0xMiwKKyAgLTExLC0xMiwtMTMsLTE0LC0xNSwtMTYsLTE2LC0xNywtMTYsLTE3LC0xNywtMTgsLTE5LC0yMCwtMjAsLTIwLAorICAgIDAsICAwLCAgMCwgIDAsIC0xLCAtMSwgLTIsIC0zLCAgMSwgIDAsICAwLCAgMCwgIDAsIC0xLCAtMiwgLTMsCisgICAgMSwgIDEsICAwLCAgMCwgLTEsIC0xLCAtMiwgLTIsICAxLCAgMSwgIDEsICAwLCAgMCwgLTEsIC0xLCAtMiwKKyAgICAyLCAgMSwgIDEsICAxLCAgMCwgLTEsIC0xLCAtMiwgIDIsICAyLCAgMSwgIDEsICAwLCAgMCwgLTEsIC0yLAorICAgIDIsICAyLCAgMSwgIDEsICAxLCAgMCwgLTEsIC0xLCAgMiwgIDIsICAxLCAgMSwgIDEsICAwLCAgMCwgLTIsCisgICAgMCwgLTEsIC0xLCAgMCwgIDAsICAxLCAgMiwgIDMsICAwLCAtMSwgLTEsICAwLCAgMSwgIDEsICAyLCAgMiwKKyAgIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDEsICAyLCAgMiwgLTEsIC0xLCAtMiwgLTEsICAwLCAgMSwgIDEsICAyLAorICAgLTEsIC0yLCAtMiwgLTEsICAwLCAgMCwgIDEsICAyLCAtMSwgLTIsIC0yLCAtMiwgLTEsICAwLCAgMSwgIDIsCisgICAtMSwgLTEsIC0yLCAtMSwgIDAsICAwLCAgMSwgIDIsIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDEsICAxLCAgMiwKKyAgICAzLCAgMiwgIDIsICAyLCAgMSwgIDEsICAwLCAgMCwgIDMsICAyLCAgMiwgIDIsICAyLCAgMSwgIDAsICAwLAorICAgIDIsICAyLCAgMiwgIDEsICAxLCAgMSwgIDAsICAwLCAgMiwgIDIsICAxLCAgMSwgIDEsICAwLCAgMCwgLTEsCisgICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAtMSwgLTEsICAwLCAgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0zLCAtMywgLTMsIC0yLCAtMiwgLTIsIC0yLAorICAgIDUsICAyLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLCAgNCwgIDIsICAwLCAtMSwgLTEsIC0xLCAgMCwgLTEsCisgICAgNCwgIDEsIC0xLCAtMSwgLTIsIC0xLCAtMSwgLTEsICA0LCAgMSwgLTEsIC0xLCAtMiwgLTEsIC0xLCAtMSwKKyAgICA0LCAgMSwgLTEsIC0yLCAtMiwgLTEsIC0xLCAtMSwgIDQsICAxLCAtMSwgLTIsIC0yLCAtMSwgLTEsIC0xLAorICAgIDQsICAxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgNCwgIDIsICAwLCAtMSwgIDAsICAwLCAgMCwgLTEsCisgICAtMiwgLTEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsIC0zLCAtMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgIC0zLCAtMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgLTMsIC0xLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgLTMsIC0yLCAgMCwgIDEsICAyLCAgMiwgIDEsICAxLCAtNCwgLTIsICAwLCAgMSwgIDIsICAyLCAgMiwgIDIsCisgICAtNSwgLTMsIC0xLCAgMSwgIDEsICAyLCAgMSwgIDIsIC01LCAtMywgLTIsICAwLCAgMSwgIDEsICAxLCAgMSwKKyAgICAzLCAgMywgIDEsICAwLCAtMiwgLTQsIC00LCAtNSwgIDMsICAzLCAgMiwgIDAsIC0xLCAtMiwgLTMsIC00LAorICAgIDIsICAyLCAgMSwgIDEsICAwLCAtMSwgLTIsIC0yLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsCisgICAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsIC0yLCAtMSwgLTEsICAwLCAgMCwgIDEsICAyLCAgMiwKKyAgIC0zLCAtMiwgLTIsIC0xLCAgMCwgIDEsICAyLCAgMywgLTMsIC0zLCAtMiwgLTEsICAwLCAgMSwgIDIsICAzLAorICAgLTMsIC0zLCAtMywgLTMsIC0zLCAtMiwgLTIsIC0yLCAtMywgLTMsIC0yLCAtMiwgLTIsIC0xLCAtMSwgLTEsCisgICAtMiwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAyLCAgMiwgIDIsICAyLAorICAgIDEsICAxLCAgMSwgIDIsICAyLCAgMywgIDMsICAzLCAgMiwgIDIsICAyLCAgMiwgIDMsICAzLCAgMywgIDMsCisgICAtOCwgLTcsIC01LCAtMywgLTIsIC0xLCAgMCwgLTEsIC00LCAtMywgLTEsICAwLCAgMSwgIDIsICAxLCAgMSwKKyAgIC0xLCAgMSwgIDIsICAzLCAgMywgIDIsICAyLCAgMSwgIDEsICAyLCAgMywgIDMsICAyLCAgMiwgIDEsICAwLAorICAgIDIsICAzLCAgMywgIDIsICAxLCAgMCwgIDAsIC0xLCAgMSwgIDIsICAxLCAgMCwgLTEsIC0xLCAtMSwgLTEsCisgICAgMSwgIDEsICAwLCAtMSwgLTEsIC0yLCAtMiwgLTEsICAxLCAgMSwgIDAsICAwLCAtMSwgLTEsICAwLCAtMSwKKyAgIC00LCAtMywgLTIsICAwLCAgMSwgIDIsICAzLCAgMywgLTQsIC0zLCAtMiwgIDAsICAxLCAgMiwgIDIsICAyLAorICAgLTMsIC0zLCAtMiwgLTEsICAwLCAgMSwgIDEsICAxLCAtMiwgLTIsIC0yLCAtMSwgLTEsICAwLCAgMCwgIDAsCisgICAgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsICAyLCAgMSwgIDEsICAwLCAgMCwgLTEsIC0xLCAtMiwKKyAgICAzLCAgMywgIDMsICAxLCAgMCwgLTEsIC0yLCAtMiwgIDUsICA0LCAgNCwgIDIsICAxLCAgMCwgLTEsIC0yLAorICAgIDAsICAwLCAgMCwgIDAsICAxLCAgMiwgIDMsICAzLCAgMCwgLTEsICAwLCAgMCwgIDEsICAyLCAgMywgIDMsCisgICAgMCwgLTEsICAwLCAgMCwgIDEsICAyLCAgMywgIDIsICAwLCAgMCwgIDAsICAxLCAgMSwgIDIsICAyLCAgMiwKKyAgICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDIsICAyLCAgMiwgIDEsICAwLCAgMCwgLTEsIC0yLAorICAgIDIsICAxLCAgMCwgIDAsIC0yLCAtMywgLTUsIC02LCAgMCwgLTEsIC0xLCAtMywgLTUsIC02LCAtOCwgLTksCisgICAtMiwgIDAsICAxLCAgMiwgIDIsICAxLCAtMSwgLTQsIC0yLCAgMCwgIDIsICAyLCAgMiwgIDEsIC0xLCAtNCwKKyAgIC0yLCAgMCwgIDIsICAyLCAgMiwgIDEsIC0xLCAtMywgLTIsICAwLCAgMiwgIDIsICAyLCAgMSwgLTEsIC0zLAorICAgLTIsIC0xLCAgMiwgIDIsICAyLCAgMSwgLTEsIC0zLCAtMiwgLTEsICAxLCAgMiwgIDIsICAxLCAtMSwgLTMsCisgICAtMywgLTEsICAxLCAgMiwgIDIsICAxLCAtMSwgLTMsIC0yLCAtMSwgIDEsICAyLCAgMiwgIDEsIC0xLCAtMywKKyAgIC0xLCAgMSwgIDEsIC0xLCAtMywgLTMsICAwLCAgNCwgLTEsICAxLCAgMSwgLTEsIC0zLCAtMywgIDAsICA0LAorICAgLTEsICAxLCAgMSwgIDAsIC0zLCAtMywgIDAsICA0LCAtMSwgIDEsICAyLCAgMCwgLTMsIC0zLCAgMCwgIDUsCisgICAgMCwgIDEsICAyLCAgMCwgLTMsIC00LCAgMCwgIDQsICAwLCAgMSwgIDIsICAwLCAtMywgLTQsICAwLCAgNSwKKyAgICAwLCAgMSwgIDIsICAwLCAtMywgLTMsICAwLCAgNCwgIDAsICAxLCAgMiwgLTEsIC0yLCAtMiwgIDAsICA0LAorICAgIDYsICA2LCAgNSwgIDYsICA1LCAgNSwgIDUsICA1LCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTIsIC0yLCAtMiwKKyAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLAorICAgLTEsIC0xLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAwLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgIC0xLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0yLAorICAgLTMsIC00LCAtNCwgLTMsIC0zLCAtMywgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTEsIC0xLCAgMCwgIDAsCisgICAgMCwgIDEsICAxLCAgMSwgIDIsICAyLCAgMywgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNiwKKyAgICA0LCAgMSwgLTIsIC0zLCAtMywgLTEsICAxLCAgMywgIDQsICAxLCAtMiwgLTQsIC0zLCAtMSwgIDEsICAzLAorICAgIDUsICAxLCAtMiwgLTQsIC0zLCAtMSwgIDEsICA0LCAgNSwgIDEsIC0yLCAtMywgLTMsIC0xLCAgMiwgIDQsCisgICAgNSwgIDEsIC0yLCAtMywgLTMsIC0xLCAgMiwgIDQsICA0LCAgMCwgLTMsIC00LCAtMywgLTEsICAyLCAgNCwKKyAgICA0LCAgMCwgLTMsIC0zLCAtMywgLTEsICAxLCAgMywgIDMsICAwLCAtMiwgLTMsIC0yLCAtMSwgIDEsICAzLAorICAgLTMsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTIsCisgICAgMiwgIDEsICAxLCAgMiwgIDIsICAxLCAgMSwgIDEsICAzLCAgMywgIDMsICA0LCAgNCwgIDMsICAzLCAgMywKKyAgICAzLCAgMywgIDMsICA0LCAgNCwgIDQsICAzLCAgMywgIDEsICAyLCAgMSwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgLTIsIC0yLCAtMiwgLTEsIC0xLCAtMSwgIDAsICAwLCAtNCwgLTQsIC00LCAtNCwgLTMsIC0zLCAtMywgLTMsCisgICAtMSwgLTIsIC0zLCAtMywgLTIsIC0yLCAtMSwgIDAsICAwLCAtMSwgLTIsIC0yLCAtMiwgLTEsICAwLCAgMSwKKyAgICAyLCAgMSwgLTEsIC0xLCAtMSwgLTEsICAwLCAgMSwgIDMsICAxLCAgMCwgLTEsIC0xLCAgMCwgIDAsICAxLAorICAgIDMsICAyLCAgMCwgLTEsICAwLCAgMCwgIDAsICAxLCAgMywgIDEsICAwLCAtMSwgIDAsICAwLCAgMCwgIDEsCisgICAgMywgIDEsICAwLCAtMSwgIDAsICAwLCAgMCwgIDEsICAyLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwKKyAgICAwLCAgMCwgIDAsICAxLCAgMSwgIDIsICAzLCAgNCwgIDAsICAwLCAtMSwgIDAsICAwLCAgMCwgIDIsICAzLAorICAgIDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgIDAsICAxLCAgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgIDAsCisgICAgMCwgIDAsIC0xLCAtMSwgLTEsIC0yLCAtMiwgLTEsICAxLCAgMCwgIDAsIC0xLCAtMSwgLTIsIC0yLCAtMSwKKyAgICAyLCAgMiwgIDEsICAwLCAtMSwgLTEsIC0xLCAtMSwgIDMsICAzLCAgMiwgIDEsICAwLCAtMSwgLTEsICAwLAorICAgIDEsICAwLCAgMSwgIDAsICAwLCAtMSwgLTIsIC0xLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLCAtMiwgLTEsCisgICAgMCwgLTEsICAwLCAgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgIC0xLCAtMSwgLTEsICAwLCAgMCwgIDAsICAxLCAgMSwgLTEsIC0xLCAtMSwgIDAsICAxLCAgMSwgIDIsICAzLAorICAgLTIsIC0yLCAtMSwgIDAsICAxLCAgMiwgIDMsICA0LCAtMiwgLTIsIC0xLCAgMCwgIDEsICAyLCAgNCwgIDUsCisgICAtMywgLTEsICAxLCAgMCwgIDAsIC0xLCAgMCwgIDEsIC0zLCAgMCwgIDEsICAwLCAtMSwgLTEsICAwLCAgMiwKKyAgIC0zLCAgMCwgIDEsICAwLCAtMSwgLTEsICAwLCAgMiwgLTIsICAxLCAgMiwgIDAsIC0xLCAtMSwgIDAsICAyLAorICAgLTIsICAxLCAgMiwgIDAsIC0xLCAtMSwgIDAsICAyLCAtMiwgIDEsICAyLCAgMCwgLTEsIC0xLCAgMCwgIDIsCisgICAtMSwgIDIsICAyLCAgMCwgLTEsIC0xLCAgMCwgIDIsIC0xLCAgMSwgIDEsICAwLCAtMSwgLTEsIC0xLCAgMSwKKyAgIC0yLCAtMiwgLTEsICAxLCAgMywgIDQsICAzLCAgMSwgLTIsIC0yLCAtMSwgIDAsICAyLCAgMywgIDIsICAwLAorICAgLTIsIC0yLCAtMSwgIDAsICAxLCAgMiwgIDEsIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDEsICAyLCAgMSwgLTEsCisgICAtMSwgLTEsIC0xLCAgMCwgIDEsICAxLCAgMCwgLTIsICAwLCAtMSwgLTEsICAwLCAgMSwgIDEsICAwLCAtMSwKKyAgICAwLCAtMSwgLTEsICAwLCAgMSwgIDEsICAxLCAtMSwgIDAsIC0xLCAtMSwgIDAsICAwLCAgMSwgIDAsIC0xLAorICAgLTIsIC0xLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAtMiwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAtMiwgLTEsIC0xLCAgMCwgLTEsIC0xLCAtMiwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTIsIC0yLCAtMywKKyAgIC0xLCAgMCwgIDEsICAxLCAgMCwgLTEsIC0yLCAtMiwgIDEsICAyLCAgMywgIDMsICAyLCAgMSwgIDAsICAwLAorICAgIDEsICAyLCAgMywgIDMsICAzLCAgMiwgIDEsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsCisgICAgMCwgLTEsIC0xLCAtMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLAorICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAtMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwgIDAsCisgICAtMywgLTIsIC0xLCAtMSwgLTEsIC0xLCAgMCwgLTEsIC01LCAtNSwgLTQsIC0zLCAtMiwgLTIsIC0yLCAtMSwKKyAgICAxLCAgMSwgIDEsICAxLCAgMiwgIDEsICAwLCAtMSwgIDEsICAxLCAgMSwgIDIsICAxLCAgMSwgIDAsIC0xLAorICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsIC0yLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgLTIsCisgICAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAtMSwgLTMsICAxLCAgMSwgIDAsICAwLCAgMCwgLTEsIC0yLCAtMywKKyAgICAxLCAgMSwgIDAsICAwLCAtMSwgLTEsIC0yLCAtNCwgIDEsICAwLCAgMCwgLTEsIC0yLCAtMiwgLTMsIC00LAorICAgIDgsICA3LCAgNSwgIDMsICAyLCAgMSwgIDEsICAxLCAgMiwgIDEsICAwLCAgMCwgLTEsIC0xLCAtMiwgLTEsCisgICAtMSwgLTEsIC0xLCAtMiwgLTIsIC0yLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgMCwgLTEsIC0xLCAgMCwKKyAgICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLAorICAgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLCAtMiwgLTIsIC0xLCAtMSwgLTEsIC0yLCAtMiwgLTEsCisgICAgOSwgIDQsICAwLCAtMiwgLTIsIC0yLCAtMSwgLTEsICA3LCAgMiwgLTEsIC0yLCAtMiwgLTEsICAwLCAgMCwKKyAgICA0LCAgMCwgLTIsIC0yLCAtMSwgIDAsICAxLCAgMSwgIDEsIC0yLCAtMiwgLTIsIC0xLCAgMCwgIDEsICAxLAorICAgLTEsIC0yLCAtMiwgLTEsICAwLCAgMSwgIDEsICAxLCAtMSwgLTIsIC0xLCAgMCwgIDEsICAxLCAgMSwgIDAsCisgICAtMSwgLTEsICAwLCAgMSwgIDEsICAxLCAgMCwgLTEsICAwLCAtMSwgIDAsICAxLCAgMCwgIDAsIC0xLCAtMSwKKyAgICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAyLCAgMiwgIDIsICAxLCAgMCwgIDAsICAwLAorICAgIDIsICAyLCAgMiwgIDIsICAxLCAgMCwgLTEsIC0xLCAgMSwgIDEsICAxLCAgMCwgLTEsIC0yLCAtMiwgLTIsCisgICAgMCwgIDAsICAwLCAtMSwgLTIsIC0zLCAtMiwgLTIsIC0xLCAtMSwgLTEsIC0yLCAtMiwgLTIsIC0xLCAgMCwKKyAgIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDAsICAxLCAgMiwgLTEsIC0xLCAtMSwgIDAsICAxLCAgMiwgIDMsICA0LAorICAgLTEsIC0xLCAgMCwgIDAsIC0xLCAtMiwgLTMsIC0zLCAtMSwgLTEsICAwLCAgMCwgIDAsIC0xLCAtMSwgLTEsCisgICAtMiwgLTIsIC0xLCAgMCwgIDEsICAxLCAgMSwgIDEsIC0yLCAtMiwgLTIsICAwLCAgMSwgIDIsICAzLCAgMywKKyAgIC0xLCAtMSwgLTEsICAwLCAgMSwgIDMsICAzLCAgMywgIDEsICAwLCAgMCwgIDAsICAxLCAgMSwgIDIsICAyLAorICAgIDIsICAyLCAgMSwgIDAsICAwLCAtMSwgLTEsIC0xLCAgMywgIDIsICAxLCAgMCwgLTEsIC0yLCAtMywgLTMsCisgICAtMSwgLTEsIC0xLCAtMiwgLTIsIC0zLCAtNCwgLTUsICAwLCAgMCwgIDAsIC0xLCAtMSwgLTMsIC0zLCAtNCwKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgLTEsIC0yLCAtMywgIDIsICAyLCAgMiwgIDEsICAxLCAgMCwgLTEsIC0xLAorICAgIDIsICAyLCAgMiwgIDIsICAxLCAgMSwgIDAsIC0xLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAgMCwgIDAsCisgICAgMSwgIDEsICAyLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAwLCAtMSwKKyAgIC0yLCAgMiwgIDMsICAxLCAtMSwgIDEsICAxLCAtMSwgLTMsICAyLCAgMywgIDAsIC0xLCAgMSwgIDEsIC0xLAorICAgLTMsICAyLCAgMywgIDAsIC0xLCAgMSwgIDEsIC0xLCAtNCwgIDIsICAzLCAgMCwgLTEsICAxLCAgMSwgLTIsCisgICAtNCwgIDEsICAzLCAgMCwgLTEsICAxLCAgMSwgLTIsIC00LCAgMSwgIDMsIC0xLCAtMiwgIDEsICAxLCAtMiwKKyAgIC0zLCAgMSwgIDIsICAwLCAtMSwgIDEsICAxLCAtMiwgLTMsICAxLCAgMiwgIDAsIC0xLCAgMSwgIDEsIC0xLAorICAgLTEsIC0xLCAtMSwgLTIsIC0yLCAtMiwgLTIsIC0yLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsCisgICAgMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAwLCAgMCwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwKKyAgIC0yLCAtMiwgLTEsIC0xLCAtMSwgIDAsICAwLCAgMCwgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0yLAorICAgLTEsIC0xLCAtMSwgLTEsIC0yLCAtMiwgLTIsIC0yLCAgNCwgIDQsICA0LCAgNCwgIDQsICAzLCAgMywgIDIsCisgICAtMywgLTMsIC0yLCAtMSwgIDAsICAxLCAgMiwgIDUsIC0zLCAtMywgLTMsIC0yLCAtMSwgIDEsICAzLCAgNiwKKyAgIC0zLCAtMywgLTIsIC0yLCAgMCwgIDIsICAzLCAgNSwgLTMsIC0yLCAtMiwgLTIsICAwLCAgMSwgIDMsICA1LAorICAgLTIsIC0yLCAtMiwgLTEsIC0xLCAgMSwgIDMsICA1LCAtMiwgLTIsIC0xLCAtMSwgIDAsICAxLCAgMiwgIDQsCisgICAtMSwgLTEsIC0xLCAtMSwgIDAsICAxLCAgMSwgIDQsIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDEsICAyLCAgMywKKyAgICAwLCAtMSwgIDAsICAxLCAgMSwgIDAsIC0xLCAtMSwgIDAsICAwLCAgMCwgIDEsICAyLCAgMCwgLTEsIC0xLAorICAgIDEsICAwLCAtMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMSwgLTEsIC0yLCAtMSwgIDAsICAwLCAgMCwgIDAsCisgICAgMSwgLTIsIC0zLCAtMSwgIDAsICAwLCAgMCwgIDEsICAxLCAtMSwgLTMsIC0yLCAgMCwgIDEsICAxLCAgMiwKKyAgICAxLCAtMSwgLTIsIC0xLCAgMCwgIDEsICAxLCAgMiwgIDIsICAwLCAtMSwgIDAsICAxLCAgMSwgIDIsICAyLAorICAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAyLCAtMSwgIDAsICAwLCAtMSwgIDAsICAwLCAgMCwgIDEsCisgICAtMywgLTIsIC0xLCAtMSwgLTEsICAwLCAgMSwgIDEsIC00LCAtMiwgLTEsICAwLCAgMCwgIDEsICAxLCAgMSwKKyAgIC0zLCAtMiwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgLTMsIC0xLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLAorICAgLTEsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsIC0xLCAgMCwgIDEsICAyLCAgMiwgIDEsICAwLCAgMCwgLTEsCisgICAtNCwgLTQsIC00LCAtMywgLTIsIC0xLCAtMSwgLTEsIC0yLCAtMiwgLTIsIC0xLCAgMCwgIDAsICAwLCAgMCwKKyAgIC0xLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgIDAsICAwLCAgMSwgIDEsICAyLCAgMiwgIDEsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsCisgICAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsIC0xLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwKKyAgICAxLCAgMiwgIDIsICAyLCAgMSwgLTEsIC0yLCAtNCwgIDEsICAxLCAgMiwgIDIsICAxLCAgMCwgLTIsIC00LAorICAgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgLTEsIC0zLCAtMSwgIDAsICAxLCAgMSwgIDAsICAwLCAtMSwgLTIsCisgICAtMSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgLTEsIC0yLCAtMSwgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwKKyAgIC0xLCAtMSwgIDAsICAxLCAgMSwgIDAsICAwLCAgMCwgLTEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLAorICAgIDIsICAyLCAgMCwgLTEsIC0yLCAtMSwgLTEsIC0yLCAgMSwgIDEsIC0xLCAtMiwgLTIsIC0xLCAtMSwgLTIsCisgICAgMSwgIDEsIC0xLCAtMiwgLTIsICAwLCAgMCwgLTEsICAxLCAgMSwgIDAsIC0yLCAtMSwgIDEsICAxLCAgMCwKKyAgICAxLCAgMSwgIDAsIC0xLCAtMSwgIDEsICAyLCAgMSwgIDEsICAxLCAgMCwgLTEsIC0xLCAgMSwgIDIsICAxLAorICAgIDEsICAxLCAgMCwgLTEsIC0xLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAtMSwgIDAsICAxLCAgMSwgIDEsCisgICAgMCwgIDAsIC0xLCAtMiwgLTQsIC00LCAtNCwgLTQsICAzLCAgMywgIDMsICAyLCAgMSwgIDAsICAwLCAgMCwKKyAgICAzLCAgMywgIDMsICAzLCAgMiwgIDIsICAyLCAgMiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLAorICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsICAwLCAgMCwgLTEsICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLCAgMCwKKyAgIC0xLCAtMSwgIDAsIC0xLCAtMSwgIDEsICAyLCAtMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMiwgIDMsIC0xLAorICAgIDEsICAxLCAgMCwgLTEsIC0xLCAgMSwgIDMsIC0xLCAgMSwgIDEsICAwLCAtMiwgLTIsICAwLCAgMSwgLTIsCisgICAgMSwgIDAsICAwLCAtMiwgLTIsICAwLCAgMSwgLTMsICAwLCAgMCwgIDAsICAwLCAtMSwgIDEsICAxLCAtMywKKyAgICAwLCAgMSwgIDEsICAwLCAgMSwgIDIsICAxLCAtMywgLTEsICAwLCAgMSwgIDEsICAxLCAgMiwgIDEsIC00LAorICAgLTQsIC0zLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAtNCwgLTIsICAwLCAgMSwgIDEsICAxLCAgMCwgLTEsCisgICAtMywgLTEsICAxLCAgMSwgIDEsICAwLCAtMSwgLTEsIC0xLCAgMSwgIDEsICAxLCAgMSwgIDAsIC0xLCAgMCwKKyAgICAxLCAgMiwgIDIsICAxLCAgMCwgLTEsICAwLCAgMCwgIDIsICAyLCAgMSwgIDAsIC0xLCAtMSwgIDAsICAxLAorICAgIDIsICAxLCAgMCwgLTEsIC0yLCAtMSwgIDAsICAxLCAgMiwgIDIsICAwLCAtMSwgLTIsIC0xLCAgMSwgIDEsCisgICAgMSwgIDEsICAwLCAgMCwgLTEsIC0xLCAtMSwgLTEsICAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgIDAsICAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIDEsICAwLCAgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgMiwgIDEsICAwLCAgMCwgLTEsIC0xLCAtMSwgLTEsCisgICAgNSwgIDMsICAyLCAgMSwgIDAsICAwLCAgMCwgIDAsICA2LCAgNSwgIDMsICAyLCAgMSwgIDAsICAwLCAgMCwKKyAgICA0LCAgNCwgIDMsICAxLCAgMCwgIDAsICAwLCAgMSwgIDMsICAzLCAgMiwgIDEsICAwLCAgMCwgIDAsICAxLAorICAgIDIsICAyLCAgMSwgIDAsIC0xLCAtMSwgIDAsICAxLCAgMCwgIDAsICAwLCAtMSwgLTEsIC0xLCAgMCwgIDEsCisgICAgMCwgIDAsIC0xLCAtMSwgLTIsIC0xLCAgMCwgIDIsICAwLCAtMSwgLTEsIC0yLCAtMiwgLTIsICAwLCAgMSwKKyAgICAwLCAtMSwgLTEsIC0yLCAtMiwgLTIsIC0xLCAgMCwgIDAsICAwLCAtMSwgLTIsIC0yLCAtMiwgLTEsICAwLAorICAgIDAsICAwLCAtMSwgLTEsIC0xLCAgMCwgIDIsICAzLCAgMCwgLTEsIC0yLCAtMiwgLTEsIC0xLCAgMSwgIDIsCisgICAgMSwgIDAsIC0xLCAtMSwgLTEsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIC0xLCAtMSwKKyAgICAxLCAgMiwgIDEsICAwLCAgMCwgLTEsIC0xLCAtMSwgLTEsICAwLCAgMCwgIDAsIC0xLCAtMSwgLTEsIC0xLAorICAgLTMsIC0yLCAtMSwgLTEsICAwLCAgMSwgIDEsICAyLCAtNCwgLTMsIC0xLCAgMSwgIDIsICAzLCAgNSwgIDUsCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAwLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLCAgMSwgLTEsIC0xLCAtMiwgLTIsIC0yLCAtMSwgLTEsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAzLCAgMywgIDMsCisgICAgMSwgIDEsICAxLCAgMSwgIDIsICAyLCAgMSwgIDEsIC00LCAtMywgLTQsIC00LCAtNCwgLTQsIC0zLCAtMywKKyAgIC0xLCAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgMywgLTEsIC0xLCAtMSwgLTEsICAwLCAgMCwgIDAsICAwLAorICAgIDAsICAwLCAtMSwgLTIsIC0yLCAtMywgLTMsIC0yLCAgMywgIDIsICAxLCAgMCwgLTEsIC0yLCAtMiwgLTIsCisgICAgNCwgIDMsICAyLCAgMSwgIDEsICAwLCAgMCwgIDAsICAyLCAgMiwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwKKyAgICAwLCAtMSwgLTEsIC0xLCAtMSwgIDAsICAwLCAgMSwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgIDAsICAwLAorICAgIDEsIC0xLCAgMCwgIDIsICAxLCAtMiwgLTEsICAxLCAgMSwgLTEsICAwLCAgMiwgIDEsIC0yLCAtMiwgIDEsCisgICAgMSwgLTEsICAwLCAgMywgIDIsIC0yLCAtMSwgIDEsICAwLCAtMiwgIDAsICAzLCAgMiwgLTIsIC0yLCAgMSwKKyAgICAwLCAtMiwgIDAsICAzLCAgMiwgLTIsIC0yLCAgMSwgIDAsIC0yLCAgMCwgIDMsICAxLCAtMiwgLTEsICAxLAorICAgIDAsIC0yLCAgMCwgIDIsICAxLCAtMiwgLTIsICAxLCAgMCwgLTEsICAwLCAgMiwgIDEsIC0yLCAtMSwgIDEsCisgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgMiwgIDIsICAwLCAgMSwgIDEsICAyLCAgMywgIDMsICAyLCAgMSwKKyAgICAwLCAgMCwgIDEsICAyLCAgMiwgIDIsICAyLCAgMSwgLTEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgLTEsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTEsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwKKyAgICAwLCAgMCwgLTEsIC0yLCAtMSwgIDAsICAzLCAgNSwgIDAsICAwLCAtMSwgLTEsIC0xLCAgMCwgIDIsICA0LAorICAgIDEsICAxLCAgMCwgIDAsIC0xLCAtMSwgIDEsICAyLCAgMSwgIDIsICAxLCAgMSwgIDAsIC0xLCAtMSwgIDAsCisgICAgMCwgIDEsICAyLCAgMSwgIDAsIC0xLCAtMiwgLTIsIC0xLCAgMCwgIDEsICAyLCAgMSwgIDAsIC0zLCAtMywKKyAgIC0yLCAtMSwgIDEsICAyLCAgMiwgIDAsIC0yLCAtNCwgLTIsIC0xLCAgMCwgIDIsICAyLCAgMSwgLTEsIC0zLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAtMSwgLTEsIC0xLCAtMSwgIDAsICAwLCAgMCwgIDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgMCwKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAtMSwgLTEsICAwLAorICAgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwgIDAsICAxLCAgMywgIDMsICAzLCAgNCwgIDMsICAzLCAgMywgIDMsCisgICAgNSwgIDEsIC0yLCAtMiwgIDAsICAwLCAgMCwgLTEsICA0LCAtMSwgLTMsIC0xLCAgMCwgIDAsICAwLCAtMSwKKyAgICAzLCAtMSwgLTEsICAwLCAgMSwgIDEsICAwLCAtMSwgIDIsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsIC0yLAorICAgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsIC0yLCAgMCwgLTEsIC0xLCAtMSwgIDAsICAwLCAgMCwgLTEsCisgICAgMCwgLTEsIC0xLCAtMSwgLTEsICAwLCAgMCwgLTEsICAyLCAgMSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwKKyAgICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAwLAorICAgIDEsIC0xLCAtMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMiwgIDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgIDAsCisgICAgMywgIDEsIC0xLCAtMSwgLTIsIC0yLCAtMiwgLTEsICA0LCAgMiwgIDEsICAwLCAtMSwgLTIsIC0yLCAtMSwKKyAgICAyLCAgMSwgIDAsICAwLCAtMSwgLTEsICAwLCAgMCwgIDAsIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDEsICAxLAorICAgIDAsICAxLCAgMiwgIDIsICAyLCAgMSwgLTEsIC0zLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAtMSwgLTIsCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwgLTEsICAwLCAgMCwgLTEsICAwLCAgMCwgIDEsICAxLCAgMCwKKyAgICAwLCAgMCwgLTEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLAorICAgIDAsICAwLCAgMSwgIDEsICAyLCAgMSwgLTEsIC0zLCAgMCwgIDAsICAwLCAgMSwgIDEsIC0xLCAtNCwgLTUsCisgICAtMiwgLTIsIC0yLCAtMSwgIDAsICAyLCAgMiwgIDIsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsIC0yLCAtMywgIDAsICAwLCAgMSwgIDEsICAwLCAtMSwgLTMsIC00LAorICAgLTEsIC0xLCAgMCwgIDEsICAwLCAgMCwgLTIsIC0zLCAtMSwgLTEsICAwLCAgMSwgIDEsICAxLCAgMCwgLTEsCisgICAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwKKyAgICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMiwgIDEsICAyLCAgMCwgIDAsICAwLCAgMCwgLTEsICAxLAorICAgIDAsICAyLCAgMCwgLTEsICAxLCAgMCwgLTEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDIsICAxLCAgMCwgIDEsCisgICAgMCwgIDEsIC0xLCAgMCwgIDIsICAyLCAgMCwgIDEsIC0xLCAgMCwgLTEsIC0xLCAgMiwgIDEsICAxLCAgMiwKKyAgIC0yLCAtMiwgLTMsIC0yLCAgMCwgIDEsICAxLCAgMSwgLTIsIC0yLCAtMywgLTMsIC0xLCAtMSwgLTEsICAwLAorICAgLTMsIC0xLCAgMCwgIDEsICAyLCAgMSwgIDEsICAwLCAtMywgLTEsICAwLCAgMSwgIDIsICAxLCAgMSwgIDEsCisgICAtMiwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgIC0yLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLCAgMCwgLTIsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLAorICAgLTMsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAtNSwgLTIsICAwLCAgMSwgIDIsICAyLCAgMSwgIDIsCisgICAtMiwgLTEsIC0xLCAgMCwgIDAsICAxLCAgMiwgIDMsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAgMiwKKyAgICAwLCAgMCwgIDEsICAwLCAtMSwgLTEsICAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0yLCAtMiwgLTEsICAwLAorICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgIDAsICAxLCAgMCwgIDAsICAwLCAtMSwgIDAsICAxLCAgMiwgIDIsCisgICAgMiwgIDEsICAwLCAgMCwgIDAsICAxLCAgMiwgIDIsICAyLCAgMSwgIDAsIC0xLCAtMSwgLTEsICAwLCAgMCwKKyAgICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsIC0xLCAtNCwgLTEsIC0xLCAgMCwgIDEsICAxLCAgMSwgIDAsIC0zLAorICAgLTIsIC0xLCAgMCwgIDAsICAxLCAgMiwgIDIsIC0yLCAtMSwgIDAsICAwLCAgMCwgIDAsICAyLCAgMywgLTEsCisgICAtMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMiwgIDAsICAwLCAgMCwgLTEsIC0yLCAtMSwgIDEsICAxLCAgMCwKKyAgICAwLCAgMCwgLTEsIC0yLCAtMiwgIDAsICAyLCAgMSwgIDAsICAwLCAtMSwgLTIsIC0xLCAgMSwgIDIsICAyLAorICAgIDEsICAwLCAgMCwgIDAsIC0yLCAtMywgLTIsIC0zLCAgMCwgIDAsICAxLCAgMCwgLTIsIC0yLCAtMSwgLTEsCisgICAgMCwgLTEsICAxLCAgMSwgLTEsIC0xLCAgMCwgIDAsICAwLCAtMSwgIDEsICAxLCAtMSwgLTEsICAwLCAgMCwKKyAgICAwLCAgMSwgIDIsICAxLCAtMSwgLTEsICAwLCAgMSwgIDEsICAyLCAgMywgIDIsICAwLCAgMCwgIDEsICAyLAorICAgLTEsICAwLCAgMiwgIDEsICAwLCAgMCwgIDIsICAzLCAtMiwgLTEsICAwLCAgMCwgLTEsICAwLCAgMSwgIDIsCisgICAgMSwgIDEsICAwLCAtMSwgLTIsIC0yLCAtMSwgIDEsICAxLCAgMSwgIDEsIC0xLCAtMiwgLTIsICAwLCAgMiwKKyAgICAxLCAgMSwgIDEsIC0xLCAtMSwgLTEsICAwLCAgMiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAyLAorICAgLTEsIC0xLCAtMSwgIDAsICAwLCAgMCwgIDEsICAyLCAtMSwgLTIsIC0xLCAgMSwgIDEsICAxLCAgMCwgIDAsCisgICAtMSwgLTIsIC0xLCAgMSwgIDIsICAyLCAgMCwgLTEsIC0xLCAtMiwgLTEsICAyLCAgMiwgIDIsICAwLCAtMSwKKyAgIC0xLCAtMSwgLTEsIC0yLCAtMSwgLTEsICAwLCAgMSwgIDAsICAwLCAtMSwgLTEsIC0xLCAgMCwgIDEsICAyLAorICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAyLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDEsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgLTEsIC0xLCAtMSwKKyAgICAxLCAgMiwgIDEsICAwLCAtMSwgLTIsIC0yLCAtMywgIDIsICAyLCAgMSwgIDAsIC0yLCAtMywgLTQsIC00LAorICAgLTQsIC0yLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAtMiwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgMCwgIDEsICAxLCAtMiwgLTIsIC0xLCAgMCwgIDEsICAyLCAgMiwgIDEsIC0yLCAtMiwgLTEsICAxLCAgMiwKKyAgICAxLCAgMiwgIDEsIC0yLCAtMiwgLTEsICAxLCAgMiwgLTEsICAxLCAgMSwgLTEsIC0xLCAtMSwgIDAsICAxLAorICAgLTIsICAwLCAgMSwgIDEsICAwLCAtMSwgLTEsICAwLCAtMiwgIDAsICAyLCAgMiwgIDEsIC0xLCAtMSwgIDAsCisgICAgMSwgIDEsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsIC0yLCAtMywgLTMsIC0yLCAtMiwgLTEsICAwLCAgMCwKKyAgIC0zLCAtNCwgLTMsIC0yLCAtMSwgIDAsICAwLCAgMCwgLTEsIC0xLCAgMCwgIDEsICAyLCAgMywgIDIsICAxLAorICAgIDAsICAxLCAgMiwgIDMsICAzLCAgMywgIDIsICAxLCAgMSwgIDEsICAxLCAgMiwgIDEsICAwLCAgMCwgLTEsCisgICAgMCwgIDAsICAwLCAgMCwgLTEsIC0xLCAtMSwgLTEsICAwLCAtMSwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAxLCAgMSwgIDAsICAwLCAtMSwgLTEsICAwLCAgMiwgIDAsICAwLCAgMSwgIDAsIC0xLCAtMSwgIDEsICAxLAorICAgLTIsIC0xLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAtMywgLTMsICAwLCAgMiwgIDIsICAxLCAgMSwgIDAsCisgICAtMiwgLTIsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLCAtMSwKKyAgICAzLCAgMSwgLTEsIC0zLCAtMiwgLTEsICAwLCAgMSwgIDQsICAyLCAtMSwgLTMsIC0zLCAtMSwgIDEsICAyLAorICAgIDAsICAwLCAgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgMSwgIDIsICAxLCAgMCwgIDAsICAwLCAtMSwgLTEsCisgICAgMiwgIDMsICAzLCAgMiwgIDEsICAwLCAtMSwgLTEsICAzLCAgNCwgIDQsICAyLCAgMSwgIDAsIC0xLCAtMiwKKyAgICAzLCAgMywgIDIsICAxLCAgMCwgLTEsIC0yLCAtMiwgIDEsICAxLCAgMCwgLTEsIC0xLCAtMiwgLTIsIC0zLAorICAgIDAsICAwLCAgMCwgLTEsIC0xLCAtMiwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0yLCAtMiwgLTEsCisgICAgMSwgIDIsICAyLCAgMiwgIDIsICAxLCAgMiwgIDIsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsIC0xLCAtMiwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgLTEsIC00LAorICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgLTIsIC01LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwgLTQsCisgICAgMSwgIDAsIC0xLCAgMCwgIDAsICAwLCAtMSwgLTMsICAwLCAtMSwgLTEsICAwLCAgMSwgIDEsICAxLCAtMSwKKyAgIC0yLCAtMSwgIDAsICAwLCAtMSwgLTEsIC0xLCAtMiwgLTEsICAwLCAgMCwgIDAsIC0xLCAtMSwgLTIsIC0yLAorICAgIDAsICAxLCAgMSwgIDAsIC0xLCAtMSwgLTEsIC0yLCAgMCwgIDEsICAxLCAgMCwgIDAsICAwLCAtMSwgLTEsCisgICAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDAsICAwLCAgMSwgIDIsICAyLCAgMSwKKyAgICAxLCAgMSwgIDAsICAwLCAgMSwgIDIsICAyLCAgMSwgIDEsICAxLCAgMCwgLTEsICAwLCAgMSwgIDEsICAwLAorICAgIDQsICAyLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgNCwgIDIsICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsCisgICAgMywgIDEsICAwLCAgMCwgLTEsIC0xLCAtMSwgIDAsICAxLCAgMCwgIDAsIC0xLCAtMSwgLTIsIC0xLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAtMSwgLTEsIC0xLCAgMCwgLTEsIC0xLCAgMCwgIDAsIC0xLCAtMSwgIDAsICAxLAorICAgLTIsIC0xLCAgMCwgLTEsIC0xLCAgMCwgIDAsICAxLCAtMiwgLTIsIC0xLCAtMiwgLTEsICAwLCAgMCwgIDEsCisgICAgMCwgIDEsICAxLCAgMSwgIDIsICAxLCAgMCwgLTEsIC0xLCAtMSwgLTEsICAwLCAgMCwgLTEsIC0yLCAtMiwKKyAgIC0xLCAgMCwgLTEsICAwLCAgMCwgLTEsIC0yLCAtMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAyLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDIsICAzLCAtMSwgIDAsIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDMsCisgICAtMSwgIDAsICAwLCAtMSwgLTEsIC0yLCAgMCwgIDMsICAwLCAgMCwgIDAsICAwLCAtMSwgLTEsICAxLCAgNCwKKyAgICAyLCAgMiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAtMSwgLTIsIC0xLCAtMiwgLTEsICAxLAorICAgLTEsIC0xLCAtMiwgLTIsIC0yLCAtMywgLTIsICAwLCAtMSwgIDAsIC0xLCAtMSwgLTEsIC0yLCAtMSwgIDEsCisgICAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAyLCAgMiwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwKKyAgICAyLCAgMiwgIDAsICAwLCAgMCwgIDAsIC0xLCAtMSwgIDIsICAyLCAgMCwgIDAsICAxLCAgMCwgLTEsIC0xLAorICAgLTEsICAwLCAgMSwgIDEsICAwLCAtMSwgLTEsIC0xLCAgMSwgIDIsICAzLCAgMiwgIDEsICAwLCAgMCwgIDAsCisgICAgMCwgIDEsICAxLCAgMSwgIDAsIC0xLCAgMCwgIDAsIC0yLCAtMiwgLTEsICAwLCAgMSwgIDAsICAwLCAgMCwKKyAgIC0yLCAtMiwgLTEsICAyLCAgMiwgIDIsICAxLCAgMCwgLTIsIC0xLCAgMCwgIDEsICAxLCAgMCwgIDAsIC0xLAorICAgLTEsIC0xLCAgMCwgIDAsIC0xLCAtMiwgLTEsIC0yLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsCisgICAtMywgLTMsIC0zLCAtMiwgLTEsIC0xLCAtMiwgLTIsIC0xLCAtMSwgIDAsICAxLCAgMiwgIDEsICAwLCAgMCwKKyAgICAxLCAgMSwgIDEsICAyLCAgMiwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgLTEsICAxLAorICAgIDEsICAwLCAtMSwgLTEsICAwLCAgMCwgLTEsICAxLCAgMCwgLTEsIC0xLCAtMSwgIDAsIC0xLCAtMSwgIDEsCisgICAgMSwgIDAsIC0xLCAgMCwgIDAsIC0xLCAgMCwgIDIsICAyLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAgMiwKKyAgICAxLCAgMCwgLTIsIC0xLCAgMCwgIDEsICAxLCAgMCwgIDIsICAwLCAtMSwgLTEsICAwLCAgMSwgIDEsICAwLAorICAgIDEsICAwLCAtMiwgLTEsICAwLCAgMSwgIDAsIC0xLCAgMSwgIDAsIC0xLCAtMSwgIDAsICAxLCAgMCwgLTEsCisgICAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsIC0yLCAgMSwgIDIsICAxLCAgMCwgIDAsICAwLCAgMSwKKyAgIC01LCAgMCwgIDIsICAxLCAgMCwgLTEsICAwLCAgMSwgLTYsIC0xLCAgMiwgIDEsICAwLCAtMSwgIDAsICAwLAorICAgIDUsICAzLCAgMCwgLTEsIC0yLCAtMSwgLTEsIC0xLCAgMSwgIDEsICAwLCAtMSwgLTEsICAwLCAtMSwgLTEsCisgICAtMSwgIDAsICAxLCAgMSwgIDIsICAyLCAgMSwgIDAsIC0yLCAtMSwgIDAsICAxLCAgMiwgIDEsICAxLCAgMSwKKyAgIC0yLCAtMSwgLTEsIC0xLCAgMCwgLTEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDAsIC0xLCAtMSwgIDAsICAwLAorICAgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAtMywgLTIsICAwLCAgMSwgIDEsICAwLCAgMCwgLTEsCisgICAtMSwgIDAsICAxLCAgMCwgLTEsICAwLCAgMiwgIDMsIC0xLCAgMCwgIDAsIC0yLCAtNCwgLTIsIC0xLCAgMCwKKyAgICAwLCAgMSwgIDEsICAwLCAtMiwgLTEsICAwLCAtMSwgIDEsICAyLCAgMywgIDEsICAwLCAgMSwgIDEsICAwLAorICAgLTEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAtMiwgLTMsIC0yLCAgMCwgIDAsICAwLCAgMSwgIDAsCisgICAtMSwgLTIsIC0yLCAgMCwgIDEsICAwLCAgMCwgLTEsICAzLCAgMSwgIDAsICAwLCAgMSwgIDAsIC0xLCAtMSwKKyAgIC0yLCAtMSwgIDAsICAwLCAtMSwgLTEsICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLAorICAgLTEsIC0xLCAtMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgLTIsIC0zLCAtMSwgIDEsICAwLCAgMCwgIDAsCisgICAgMSwgLTEsIC0zLCAtMSwgIDEsICAxLCAgMCwgLTEsICAzLCAgMSwgLTEsICAxLCAgMiwgIDIsICAwLCAtMSwKKyAgICAzLCAgMSwgIDAsICAxLCAgMiwgIDEsICAxLCAgMCwgIDAsIC0yLCAtMiwgLTEsIC0xLCAgMCwgIDAsICAwLAorICAgIDEsICAwLCAtMSwgLTEsICAxLCAgMiwgIDEsICAwLCAgMCwgLTEsIC0yLCAtMSwgIDEsICAyLCAgMiwgIDEsCisgICAtMSwgLTEsIC0xLCAgMCwgIDAsICAxLCAgMiwgIDAsIC0yLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAtMSwKKyAgIC0xLCAgMCwgIDEsICAwLCAtMSwgLTEsIC0xLCAtMSwgIDAsICAxLCAgMSwgIDIsICAwLCAtMiwgLTEsICAwLAorICAgIDEsICAyLCAgMiwgIDIsICAxLCAtMSwgLTEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsIC0yLCAtMiwgLTEsCisgICAgMCwgIDAsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTIsICAwLCAgMCwgLTEsICAwLCAgMSwgIDIsICAyLCAgMSwKKyAgICAwLCAgMCwgLTEsIC0xLCAgMCwgIDEsICAyLCAgMiwgIDEsICAxLCAtMSwgLTIsIC0xLCAtMSwgLTEsIC0xLAorICAgIDIsICAyLCAgMSwgIDAsICAwLCAtMSwgLTIsIC0yLCAgMSwgIDIsICAyLCAgMSwgIDAsICAwLCAtMiwgLTIsCisgICAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgLTEsICAwLCAtMSwgLTEsIC0xLCAgMiwgIDMsICAyLCAgMSwKKyAgICAwLCAtMiwgIDEsICAyLCAtMSwgIDAsICAwLCAgMSwgLTEsIC0yLCAgMiwgIDMsIC0xLCAgMCwgIDAsICAwLAorICAgIDAsIC0yLCAgMiwgIDMsIC0xLCAtMSwgIDAsICAwLCAgMCwgLTEsICAzLCAgMiwgLTIsICAwLCAgMSwgIDAsCisgICAgMCwgLTEsICAzLCAgMSwgLTIsICAwLCAgMSwgIDAsICAwLCAtMSwgIDIsICAxLCAtMSwgIDEsICAwLCAtMSwKKyAgICAwLCAgMCwgIDEsIC0xLCAtMiwgIDAsICAwLCAtMSwgIDEsICAwLCAgMCwgLTIsIC0yLCAtMSwgLTEsIC0xLAorICAgIDEsICAxLCAgMSwgIDEsICAxLCAtMSwgLTEsIC0yLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMiwgIDMsICAxLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAxLCAgMiwKKyAgICAwLCAtMSwgLTEsIC0yLCAtMSwgIDAsICAxLCAgMiwgLTIsIC0yLCAtMiwgLTIsIC0xLCAgMCwgIDEsICAxLAorICAgLTEsIC0xLCAtMSwgLTEsICAwLCAgMCwgIDAsIC0xLCAgMiwgIDIsICAyLCAgMCwgLTEsIC0xLCAtMiwgLTQsCisgICAtMSwgLTIsIC0xLCAtMSwgIDAsICAxLCAgMiwgIDMsIC0xLCAtMSwgLTEsIC0xLCAgMCwgIDEsICAyLCAgMywKKyAgICAxLCAgMCwgLTEsICAwLCAtMSwgIDAsICAxLCAgMiwgIDEsICAwLCAgMCwgIDAsIC0xLCAgMCwgIDIsICAyLAorICAgIDEsICAwLCAtMSwgLTEsIC0yLCAgMCwgIDEsICAyLCAgMCwgLTIsIC0yLCAtMiwgLTMsIC0xLCAgMCwgIDEsCisgICAgMCwgLTIsIC0yLCAtMiwgLTIsIC0xLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAyLCAgMgorfTsKKworLyogbGlzdCBvZiBjb2RlYm9va3MgZm9yIGludHJhLWNvZGVkIHZlY3RvcnMgKi8KK2NvbnN0IGludDhfdCogY29uc3QgZmZfc3ZxMV9pbnRyYV9jb2RlYm9va3NbNl0gPSB7CisgICAgc3ZxMV9pbnRyYV9jb2RlYm9va180eDIsIHN2cTFfaW50cmFfY29kZWJvb2tfNHg0LAorICAgIHN2cTFfaW50cmFfY29kZWJvb2tfOHg0LCBzdnExX2ludHJhX2NvZGVib29rXzh4OCwKKyAgICBOVUxMLCBOVUxMLAorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfU1ZRMV9DQl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zdnExX3ZsYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMV92bGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQyOThkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMV92bGMuaApAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NWUTFfVkxDX0gKKyNkZWZpbmUgQVZDT0RFQ19TVlExX1ZMQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogdmFsdWVzIGluIHRoaXMgdGFibGUgcmFuZ2UgZnJvbSAwLi4zOyBhZGp1c3QgcmV0cmlldmVkIHZhbHVlIGJ5ICswICovCitjb25zdCB1aW50OF90IGZmX3N2cTFfYmxvY2tfdHlwZV92bGNbNF1bMl0gPSB7CisgICAgLyogeyBjb2RlLCBsZW5ndGggfSAqLworICAgIHsgMHgxLCAxIH0sICB7IDB4MSwgMiB9LCAgeyAweDEsIDMgfSwgIHsgMHgwLCAzIH0KK307CisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gLTEuLjY7IGFkanVzdCByZXRyaWV2ZWQgdmFsdWUgYnkgLTEgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfc3ZxMV9pbnRyYV9tdWx0aXN0YWdlX3ZsY1s2XVs4XVsyXSA9IHsKKyAgICAvKiB7IGNvZGUsIGxlbmd0aCB9ICovCisgICAgeyB7IDB4MSwgNSB9LCAgeyAweDEsIDEgfSwgIHsgMHgzLCAzIH0sICB7IDB4MiwgMyB9LAorICAgICAgeyAweDMsIDQgfSwgIHsgMHgyLCA0IH0sICB7IDB4MCwgNSB9LCAgeyAweDEsIDQgfSB9LAorICAgIHsgeyAweDEsIDQgfSwgIHsgMHgzLCAyIH0sICB7IDB4NSwgMyB9LCAgeyAweDQsIDMgfSwKKyAgICAgIHsgMHgzLCAzIH0sICB7IDB4MiwgMyB9LCAgeyAweDAsIDQgfSwgIHsgMHgxLCAzIH0gfSwKKyAgICB7IHsgMHgxLCA1IH0sICB7IDB4MSwgMSB9LCAgeyAweDMsIDMgfSwgIHsgMHgwLCA1IH0sCisgICAgICB7IDB4MywgNCB9LCAgeyAweDIsIDMgfSwgIHsgMHgyLCA0IH0sICB7IDB4MSwgNCB9IH0sCisgICAgeyB7IDB4MSwgNiB9LCAgeyAweDEsIDEgfSwgIHsgMHgxLCAyIH0sICB7IDB4MCwgNiB9LAorICAgICAgeyAweDMsIDQgfSwgIHsgMHgyLCA0IH0sICB7IDB4MSwgNSB9LCAgeyAweDEsIDQgfSB9LAorICAgIHsgeyAweDEsIDYgfSwgIHsgMHgxLCAxIH0sICB7IDB4MSwgMiB9LCAgeyAweDMsIDUgfSwKKyAgICAgIHsgMHgyLCA1IH0sICB7IDB4MCwgNiB9LCAgeyAweDEsIDUgfSwgIHsgMHgxLCAzIH0gfSwKKyAgICB7IHsgMHgxLCA3IH0sICB7IDB4MSwgMSB9LCAgeyAweDEsIDIgfSwgIHsgMHgxLCAzIH0sCisgICAgICB7IDB4MSwgNCB9LCAgeyAweDEsIDYgfSwgIHsgMHgwLCA3IH0sICB7IDB4MSwgNSB9IH0KK307CisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gLTEuLjY7IGFkanVzdCByZXRyaWV2ZWQgdmFsdWUgYnkgLTEgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfc3ZxMV9pbnRlcl9tdWx0aXN0YWdlX3ZsY1s2XVs4XVsyXSA9IHsKKyAgICAvKiB7IGNvZGUsIGxlbmd0aCB9ICovCisgICAgeyB7IDB4MywgMiB9LCAgeyAweDUsIDMgfSwgIHsgMHg0LCAzIH0sICB7IDB4MywgMyB9LAorICAgICAgeyAweDIsIDMgfSwgIHsgMHgxLCAzIH0sICB7IDB4MSwgNCB9LCAgeyAweDAsIDQgfSB9LAorICAgIHsgeyAweDMsIDIgfSwgIHsgMHg1LCAzIH0sICB7IDB4NCwgMyB9LCAgeyAweDMsIDMgfSwKKyAgICAgIHsgMHgyLCAzIH0sICB7IDB4MSwgMyB9LCAgeyAweDEsIDQgfSwgIHsgMHgwLCA0IH0gfSwKKyAgICB7IHsgMHgxLCAxIH0sICB7IDB4MywgMyB9LCAgeyAweDIsIDMgfSwgIHsgMHgzLCA0IH0sCisgICAgICB7IDB4MiwgNCB9LCAgeyAweDEsIDQgfSwgIHsgMHgxLCA1IH0sICB7IDB4MCwgNSB9IH0sCisgICAgeyB7IDB4MSwgMSB9LCAgeyAweDMsIDMgfSwgIHsgMHgyLCAzIH0sICB7IDB4MywgNCB9LAorICAgICAgeyAweDIsIDQgfSwgIHsgMHgxLCA0IH0sICB7IDB4MSwgNSB9LCAgeyAweDAsIDUgfSB9LAorICAgIHsgeyAweDEsIDEgfSwgIHsgMHgzLCAzIH0sICB7IDB4MiwgMyB9LCAgeyAweDMsIDQgfSwKKyAgICAgIHsgMHgyLCA0IH0sICB7IDB4MSwgNCB9LCAgeyAweDEsIDUgfSwgIHsgMHgwLCA1IH0gfSwKKyAgICB7IHsgMHgxLCAxIH0sICB7IDB4MSwgMiB9LCAgeyAweDEsIDMgfSwgIHsgMHgzLCA1IH0sCisgICAgICB7IDB4MiwgNSB9LCAgeyAweDEsIDUgfSwgIHsgMHgxLCA2IH0sICB7IDB4MCwgNiB9IH0KK307CisKKy8qIHZhbHVlcyBpbiB0aGlzIHRhYmxlIHJhbmdlIGZyb20gMC4uMjU1OyBhZGp1c3QgcmV0cmlldmVkIHZhbHVlIGJ5ICswICovCitjb25zdCB1aW50MTZfdCBmZl9zdnExX2ludHJhX21lYW5fdmxjWzI1Nl1bMl0gPSB7CisgICAgLyogeyBjb2RlLCBsZW5ndGggfSAqLworICAgIHsgMHgzNywgIDYgfSwgIHsgMHg1NiwgIDcgfSwgIHsgMHgwMSwgMTcgfSwgIHsgMHgwMSwgMjAgfSwKKyAgICB7IDB4MDIsIDIwIH0sICB7IDB4MDMsIDIwIH0sICB7IDB4MDAsIDIwIH0sICB7IDB4MDQsIDIwIH0sCisgICAgeyAweDA1LCAyMCB9LCAgeyAweDAzLCAxOSB9LCAgeyAweDE1LCAxMSB9LCAgeyAweDQyLCAgOSB9LAorICAgIHsgMHgxNCwgMTEgfSwgIHsgMHgwMywgMTQgfSwgIHsgMHgwMiwgMTQgfSwgIHsgMHgwMSwgMTUgfSwKKyAgICB7IDB4MDEsIDE2IH0sICB7IDB4MDEsIDEyIH0sICB7IDB4MkIsIDEwIH0sICB7IDB4MTgsIDExIH0sCisgICAgeyAweDBDLCAxMSB9LCAgeyAweDQxLCAgOSB9LCAgeyAweDc4LCAgOCB9LCAgeyAweDZDLCAgOCB9LAorICAgIHsgMHg1NSwgIDcgfSwgIHsgMHgwRiwgIDQgfSwgIHsgMHgwRSwgIDQgfSwgIHsgMHgzNCwgIDYgfSwKKyAgICB7IDB4NTEsICA3IH0sICB7IDB4NzIsICA4IH0sICB7IDB4NkUsICA4IH0sICB7IDB4NDAsICA5IH0sCisgICAgeyAweDNGLCAgOSB9LCAgeyAweDNFLCAgOSB9LCAgeyAweDNELCAgOSB9LCAgeyAweDNDLCAgOSB9LAorICAgIHsgMHgzQiwgIDkgfSwgIHsgMHgzQSwgIDkgfSwgIHsgMHgzOSwgIDkgfSwgIHsgMHgzOCwgIDkgfSwKKyAgICB7IDB4MzcsICA5IH0sICB7IDB4NDMsICA5IH0sICB7IDB4NDYsICA5IH0sICB7IDB4NDcsICA5IH0sCisgICAgeyAweDQ1LCAgOSB9LCAgeyAweDQ0LCAgOSB9LCAgeyAweDQ5LCAgOSB9LCAgeyAweDQ4LCAgOSB9LAorICAgIHsgMHg0QSwgIDggfSwgIHsgMHg3OSwgIDggfSwgIHsgMHg3NiwgIDggfSwgIHsgMHg3NywgIDggfSwKKyAgICB7IDB4NzEsICA4IH0sICB7IDB4NzUsICA4IH0sICB7IDB4NzQsICA4IH0sICB7IDB4NzMsICA4IH0sCisgICAgeyAweDZBLCAgOCB9LCAgeyAweDU1LCAgOCB9LCAgeyAweDcwLCAgOCB9LCAgeyAweDZGLCAgOCB9LAorICAgIHsgMHg1MiwgIDggfSwgIHsgMHg2RCwgIDggfSwgIHsgMHg0QywgIDggfSwgIHsgMHg2QiwgIDggfSwKKyAgICB7IDB4NDAsICA3IH0sICB7IDB4NjksICA4IH0sICB7IDB4NjgsICA4IH0sICB7IDB4NjcsICA4IH0sCisgICAgeyAweDY2LCAgOCB9LCAgeyAweDY1LCAgOCB9LCAgeyAweDY0LCAgOCB9LCAgeyAweDYzLCAgOCB9LAorICAgIHsgMHg2MiwgIDggfSwgIHsgMHg2MSwgIDggfSwgIHsgMHg2MCwgIDggfSwgIHsgMHg1RiwgIDggfSwKKyAgICB7IDB4NUUsICA4IH0sICB7IDB4NUQsICA4IH0sICB7IDB4NUMsICA4IH0sICB7IDB4NUIsICA4IH0sCisgICAgeyAweDVBLCAgOCB9LCAgeyAweDU5LCAgOCB9LCAgeyAweDU4LCAgOCB9LCAgeyAweDU3LCAgOCB9LAorICAgIHsgMHg1NiwgIDggfSwgIHsgMHgzRCwgIDcgfSwgIHsgMHg1NCwgIDggfSwgIHsgMHg1MywgIDggfSwKKyAgICB7IDB4M0YsICA3IH0sICB7IDB4NTEsICA4IH0sICB7IDB4NTAsICA4IH0sICB7IDB4NEYsICA4IH0sCisgICAgeyAweDRFLCAgOCB9LCAgeyAweDRELCAgOCB9LCAgeyAweDQxLCAgNyB9LCAgeyAweDRCLCAgOCB9LAorICAgIHsgMHg1MywgIDcgfSwgIHsgMHgzRSwgIDcgfSwgIHsgMHg0OCwgIDggfSwgIHsgMHg0RiwgIDcgfSwKKyAgICB7IDB4NTIsICA3IH0sICB7IDB4NDUsICA4IH0sICB7IDB4NTAsICA3IH0sICB7IDB4NDMsICA4IH0sCisgICAgeyAweDQyLCAgOCB9LCAgeyAweDQxLCAgOCB9LCAgeyAweDQyLCAgNyB9LCAgeyAweDQzLCAgNyB9LAorICAgIHsgMHgzRSwgIDggfSwgIHsgMHg0NCwgIDcgfSwgIHsgMHgzQywgIDggfSwgIHsgMHg0NSwgIDcgfSwKKyAgICB7IDB4NDYsICA3IH0sICB7IDB4NDcsICA3IH0sICB7IDB4NDgsICA3IH0sICB7IDB4NDksICA3IH0sCisgICAgeyAweDRBLCAgNyB9LCAgeyAweDRCLCAgNyB9LCAgeyAweDRDLCAgNyB9LCAgeyAweDRELCAgNyB9LAorICAgIHsgMHg0RSwgIDcgfSwgIHsgMHg1OCwgIDcgfSwgIHsgMHg1OSwgIDcgfSwgIHsgMHg1QSwgIDcgfSwKKyAgICB7IDB4NUIsICA3IH0sICB7IDB4NUMsICA3IH0sICB7IDB4NUQsICA3IH0sICB7IDB4NDQsICA4IH0sCisgICAgeyAweDQ5LCAgOCB9LCAgeyAweDI5LCAgOCB9LCAgeyAweDNGLCAgOCB9LCAgeyAweDNELCAgOCB9LAorICAgIHsgMHgzQiwgIDggfSwgIHsgMHgyQywgIDggfSwgIHsgMHgyOCwgIDggfSwgIHsgMHgyNSwgIDggfSwKKyAgICB7IDB4MjYsICA4IH0sICB7IDB4NUUsICA3IH0sICB7IDB4NTcsICA3IH0sICB7IDB4NTQsICA3IH0sCisgICAgeyAweDVGLCAgNyB9LCAgeyAweDYyLCAgNyB9LCAgeyAweDYzLCAgNyB9LCAgeyAweDY0LCAgNyB9LAorICAgIHsgMHg2MSwgIDcgfSwgIHsgMHg2NSwgIDcgfSwgIHsgMHg2NywgIDcgfSwgIHsgMHg2NiwgIDcgfSwKKyAgICB7IDB4MzUsICA2IH0sICB7IDB4MzYsICA2IH0sICB7IDB4NjAsICA3IH0sICB7IDB4MzksICA4IH0sCisgICAgeyAweDNBLCAgOCB9LCAgeyAweDM4LCAgOCB9LCAgeyAweDM3LCAgOCB9LCAgeyAweDM2LCAgOCB9LAorICAgIHsgMHgzNSwgIDggfSwgIHsgMHgzNCwgIDggfSwgIHsgMHgzMywgIDggfSwgIHsgMHgzMiwgIDggfSwKKyAgICB7IDB4MzEsICA4IH0sICB7IDB4MzAsICA4IH0sICB7IDB4MkQsICA4IH0sICB7IDB4MkIsICA4IH0sCisgICAgeyAweDJBLCAgOCB9LCAgeyAweDI3LCAgOCB9LCAgeyAweDQwLCAgOCB9LCAgeyAweDQ2LCAgOCB9LAorICAgIHsgMHg0NywgIDggfSwgIHsgMHgyNiwgIDkgfSwgIHsgMHgyNSwgIDkgfSwgIHsgMHgyNCwgIDkgfSwKKyAgICB7IDB4MjMsICA5IH0sICB7IDB4MjIsICA5IH0sICB7IDB4MkUsICA4IH0sICB7IDB4MkYsICA4IH0sCisgICAgeyAweDFGLCAgOSB9LCAgeyAweDM2LCAgOSB9LCAgeyAweDFELCAgOSB9LCAgeyAweDIxLCAgOSB9LAorICAgIHsgMHgxQiwgIDkgfSwgIHsgMHgxQywgIDkgfSwgIHsgMHgxOSwgIDkgfSwgIHsgMHgxQSwgIDkgfSwKKyAgICB7IDB4MTgsICA5IH0sICB7IDB4MTcsICA5IH0sICB7IDB4MTYsICA5IH0sICB7IDB4MUUsICA5IH0sCisgICAgeyAweDIwLCAgOSB9LCAgeyAweDI3LCAgOSB9LCAgeyAweDI4LCAgOSB9LCAgeyAweDI5LCAgOSB9LAorICAgIHsgMHgyQSwgIDkgfSwgIHsgMHgyQiwgIDkgfSwgIHsgMHgyQywgIDkgfSwgIHsgMHgyRCwgIDkgfSwKKyAgICB7IDB4MkUsICA5IH0sICB7IDB4MkYsICA5IH0sICB7IDB4MzAsICA5IH0sICB7IDB4MzUsICA5IH0sCisgICAgeyAweDMxLCAgOSB9LCAgeyAweDMyLCAgOSB9LCAgeyAweDMzLCAgOSB9LCAgeyAweDM0LCAgOSB9LAorICAgIHsgMHgxOSwgMTAgfSwgIHsgMHgyQSwgMTAgfSwgIHsgMHgxNywgMTAgfSwgIHsgMHgxNiwgMTAgfSwKKyAgICB7IDB4MTUsIDEwIH0sICB7IDB4MjgsIDEwIH0sICB7IDB4MjYsIDEwIH0sICB7IDB4MjUsIDEwIH0sCisgICAgeyAweDIyLCAxMCB9LCAgeyAweDIxLCAxMCB9LCAgeyAweDE4LCAxMCB9LCAgeyAweDE0LCAxMCB9LAorICAgIHsgMHgyOSwgMTAgfSwgIHsgMHgxMiwgMTAgfSwgIHsgMHgwRCwgMTAgfSwgIHsgMHgwRSwgMTAgfSwKKyAgICB7IDB4MEYsIDEwIH0sICB7IDB4MTAsIDEwIH0sICB7IDB4MTEsIDEwIH0sICB7IDB4MUEsIDEwIH0sCisgICAgeyAweDFCLCAxMCB9LCAgeyAweDFDLCAxMCB9LCAgeyAweDFELCAxMCB9LCAgeyAweDFFLCAxMCB9LAorICAgIHsgMHgxRiwgMTAgfSwgIHsgMHgyMCwgMTAgfSwgIHsgMHgxMywgMTAgfSwgIHsgMHgyMywgMTAgfSwKKyAgICB7IDB4MjQsIDEwIH0sICB7IDB4MDksIDExIH0sICB7IDB4MDgsIDExIH0sICB7IDB4MDcsIDExIH0sCisgICAgeyAweDI3LCAxMCB9LCAgeyAweDA1LCAxMSB9LCAgeyAweDBCLCAxMSB9LCAgeyAweDA2LCAxMSB9LAorICAgIHsgMHgwNCwgMTEgfSwgIHsgMHgwMywgMTEgfSwgIHsgMHgwMiwgMTEgfSwgIHsgMHgwMSwgMTEgfSwKKyAgICB7IDB4MEEsIDExIH0sICB7IDB4MTYsIDExIH0sICB7IDB4MTksIDExIH0sICB7IDB4MTcsIDExIH0sCisgICAgeyAweDBELCAxMSB9LCAgeyAweDBFLCAxMSB9LCAgeyAweDBGLCAxMSB9LCAgeyAweDEwLCAxMSB9LAorICAgIHsgMHgxMSwgMTEgfSwgIHsgMHgxMiwgMTEgfSwgIHsgMHgxMywgMTEgfSwgIHsgMHgwMSwgMTQgfQorfTsKKworLyogdmFsdWVzIGluIHRoaXMgdGFibGUgcmFuZ2UgZnJvbSAtMjU2Li4yNTU7IGFkanVzdCByZXRyaWV2ZWQgdmFsdWUgYnkgLTI1NiAqLworY29uc3QgdWludDE2X3QgZmZfc3ZxMV9pbnRlcl9tZWFuX3ZsY1s1MTJdWzJdID0geworICAgIC8qIHsgY29kZSwgbGVuZ3RoIH0gKi8KKyAgICB7IDB4NUEsIDIyIH0sICB7IDB4RDQsIDIyIH0sICB7IDB4RDUsIDIyIH0sICB7IDB4RDYsIDIyIH0sCisgICAgeyAweEQ3LCAyMiB9LCAgeyAweEQ4LCAyMiB9LCAgeyAweEQ5LCAyMiB9LCAgeyAweERBLCAyMiB9LAorICAgIHsgMHhEQiwgMjIgfSwgIHsgMHhEQywgMjIgfSwgIHsgMHhERCwgMjIgfSwgIHsgMHhERSwgMjIgfSwKKyAgICB7IDB4REYsIDIyIH0sICB7IDB4RTAsIDIyIH0sICB7IDB4RTEsIDIyIH0sICB7IDB4RTIsIDIyIH0sCisgICAgeyAweEUzLCAyMiB9LCAgeyAweEU0LCAyMiB9LCAgeyAweEU1LCAyMiB9LCAgeyAweEU2LCAyMiB9LAorICAgIHsgMHhFOCwgMjIgfSwgIHsgMHhDQiwgMjIgfSwgIHsgMHhFOSwgMjIgfSwgIHsgMHhFQSwgMjIgfSwKKyAgICB7IDB4RTcsIDIyIH0sICB7IDB4RUMsIDIyIH0sICB7IDB4RUQsIDIyIH0sICB7IDB4RUUsIDIyIH0sCisgICAgeyAweEVGLCAyMiB9LCAgeyAweEYwLCAyMiB9LCAgeyAweEYxLCAyMiB9LCAgeyAweEYyLCAyMiB9LAorICAgIHsgMHhGMywgMjIgfSwgIHsgMHhGNCwgMjIgfSwgIHsgMHhGNSwgMjIgfSwgIHsgMHhGNiwgMjIgfSwKKyAgICB7IDB4RjcsIDIyIH0sICB7IDB4RjgsIDIyIH0sICB7IDB4MTAyLDIyIH0sICB7IDB4RUIsIDIyIH0sCisgICAgeyAweEY5LCAyMiB9LCAgeyAweEZDLCAyMiB9LCAgeyAweEZELCAyMiB9LCAgeyAweEZFLCAyMiB9LAorICAgIHsgMHgxMDAsMjIgfSwgIHsgMHg1QywgMjIgfSwgIHsgMHg2MCwgMjIgfSwgIHsgMHgxMDEsMjIgfSwKKyAgICB7IDB4NzEsIDIyIH0sICB7IDB4MTA0LDIyIH0sICB7IDB4MTA1LDIyIH0sICB7IDB4RkIsIDIyIH0sCisgICAgeyAweEZGLCAyMiB9LCAgeyAweDg2LCAyMSB9LCAgeyAweEZBLCAyMiB9LCAgeyAweDdDLCAyMiB9LAorICAgIHsgMHg3NSwgMjIgfSwgIHsgMHgxMDMsMjIgfSwgIHsgMHg3OCwgMjIgfSwgIHsgMHhEMywgMjIgfSwKKyAgICB7IDB4N0IsIDIyIH0sICB7IDB4ODIsIDIyIH0sICB7IDB4RDIsIDIyIH0sICB7IDB4RDEsIDIyIH0sCisgICAgeyAweEQwLCAyMiB9LCAgeyAweENGLCAyMiB9LCAgeyAweENFLCAyMiB9LCAgeyAweENELCAyMiB9LAorICAgIHsgMHhDQywgMjIgfSwgIHsgMHhDMywgMjIgfSwgIHsgMHhDQSwgMjIgfSwgIHsgMHhDOSwgMjIgfSwKKyAgICB7IDB4QzgsIDIyIH0sICB7IDB4QzcsIDIyIH0sICB7IDB4QzYsIDIyIH0sICB7IDB4QzUsIDIyIH0sCisgICAgeyAweDhCLCAyMiB9LCAgeyAweEM0LCAyMiB9LCAgeyAweEMyLCAyMiB9LCAgeyAweEMxLCAyMiB9LAorICAgIHsgMHhDMCwgMjIgfSwgIHsgMHhCRiwgMjIgfSwgIHsgMHhCRSwgMjIgfSwgIHsgMHhCRCwgMjIgfSwKKyAgICB7IDB4QkMsIDIyIH0sICB7IDB4QkIsIDIyIH0sICB7IDB4QkEsIDIyIH0sICB7IDB4QjksIDIyIH0sCisgICAgeyAweDYxLCAyMiB9LCAgeyAweDg0LCAyMiB9LCAgeyAweDg1LCAyMiB9LCAgeyAweDg2LCAyMiB9LAorICAgIHsgMHg4NywgMjIgfSwgIHsgMHg4OCwgMjIgfSwgIHsgMHg4OSwgMjIgfSwgIHsgMHg4QSwgMjIgfSwKKyAgICB7IDB4OEMsIDIyIH0sICB7IDB4OEQsIDIyIH0sICB7IDB4OEUsIDIyIH0sICB7IDB4OEYsIDIyIH0sCisgICAgeyAweDkwLCAyMiB9LCAgeyAweDkxLCAyMiB9LCAgeyAweDkyLCAyMiB9LCAgeyAweDkzLCAyMiB9LAorICAgIHsgMHg5NCwgMjIgfSwgIHsgMHg5NSwgMjIgfSwgIHsgMHg5NiwgMjIgfSwgIHsgMHg5NywgMjIgfSwKKyAgICB7IDB4OTgsIDIyIH0sICB7IDB4OTksIDIyIH0sICB7IDB4OUEsIDIyIH0sICB7IDB4OUIsIDIyIH0sCisgICAgeyAweDlDLCAyMiB9LCAgeyAweDlELCAyMiB9LCAgeyAweDlFLCAyMiB9LCAgeyAweDlGLCAyMiB9LAorICAgIHsgMHhBMCwgMjIgfSwgIHsgMHhBMSwgMjIgfSwgIHsgMHhBMiwgMjIgfSwgIHsgMHhBMywgMjIgfSwKKyAgICB7IDB4QTQsIDIyIH0sICB7IDB4QTUsIDIyIH0sICB7IDB4QTYsIDIyIH0sICB7IDB4QTcsIDIyIH0sCisgICAgeyAweEE4LCAyMiB9LCAgeyAweEE5LCAyMiB9LCAgeyAweEFBLCAyMiB9LCAgeyAweEFCLCAyMiB9LAorICAgIHsgMHg3RiwgMjIgfSwgIHsgMHg4RiwgMjEgfSwgIHsgMHhBQywgMjIgfSwgIHsgMHhBRCwgMjIgfSwKKyAgICB7IDB4QUUsIDIyIH0sICB7IDB4QUYsIDIyIH0sICB7IDB4QjAsIDIyIH0sICB7IDB4QjEsIDIyIH0sCisgICAgeyAweDUzLCAyMCB9LCAgeyAweDkwLCAyMSB9LCAgeyAweEIyLCAyMiB9LCAgeyAweDkxLCAyMSB9LAorICAgIHsgMHhCMywgMjIgfSwgIHsgMHhCNCwgMjIgfSwgIHsgMHg1NCwgMjAgfSwgIHsgMHhCNSwgMjIgfSwKKyAgICB7IDB4QjYsIDIyIH0sICB7IDB4OEMsIDIxIH0sICB7IDB4MzQsIDE5IH0sICB7IDB4M0QsIDE4IH0sCisgICAgeyAweDU1LCAyMCB9LCAgeyAweEI3LCAyMiB9LCAgeyAweEI4LCAyMiB9LCAgeyAweDhCLCAyMSB9LAorICAgIHsgMHg1NiwgMjAgfSwgIHsgMHgzRCwgMTkgfSwgIHsgMHg1NywgMjAgfSwgIHsgMHg1OCwgMjAgfSwKKyAgICB7IDB4NDAsIDE5IH0sICB7IDB4NDMsIDE5IH0sICB7IDB4NDcsIDE5IH0sICB7IDB4MkEsIDE4IH0sCisgICAgeyAweDJFLCAxOSB9LCAgeyAweDJDLCAxOCB9LCAgeyAweDQ2LCAxOSB9LCAgeyAweDU5LCAyMCB9LAorICAgIHsgMHg0OSwgMTkgfSwgIHsgMHgyRCwgMTkgfSwgIHsgMHgzOCwgMTggfSwgIHsgMHgzNiwgMTggfSwKKyAgICB7IDB4MzksIDE4IH0sICB7IDB4NDUsIDE5IH0sICB7IDB4MjgsIDE4IH0sICB7IDB4MzAsIDE4IH0sCisgICAgeyAweDM1LCAxOCB9LCAgeyAweDIwLCAxNyB9LCAgeyAweDQ0LCAxOSB9LCAgeyAweDMyLCAxOCB9LAorICAgIHsgMHgzMSwgMTggfSwgIHsgMHgxRiwgMTcgfSwgIHsgMHgyRiwgMTggfSwgIHsgMHgyRSwgMTggfSwKKyAgICB7IDB4MkQsIDE4IH0sICB7IDB4MjEsIDE3IH0sICB7IDB4MjIsIDE3IH0sICB7IDB4MjMsIDE3IH0sCisgICAgeyAweDI0LCAxNyB9LCAgeyAweDI3LCAxNiB9LCAgeyAweDIzLCAxNiB9LCAgeyAweDIwLCAxNiB9LAorICAgIHsgMHgxRCwgMTYgfSwgIHsgMHgyNSwgMTYgfSwgIHsgMHgxRSwgMTYgfSwgIHsgMHgyNCwgMTYgfSwKKyAgICB7IDB4MkEsIDE2IH0sICB7IDB4MjYsIDE2IH0sICB7IDB4MjEsIDE1IH0sICB7IDB4MjksIDE2IH0sCisgICAgeyAweDIyLCAxNSB9LCAgeyAweDIzLCAxNSB9LCAgeyAweDI0LCAxNSB9LCAgeyAweDFCLCAxNSB9LAorICAgIHsgMHgxQSwgMTUgfSwgIHsgMHgxRCwgMTUgfSwgIHsgMHgxRiwgMTUgfSwgIHsgMHgyNywgMTUgfSwKKyAgICB7IDB4MTcsIDE0IH0sICB7IDB4MTgsIDE0IH0sICB7IDB4MTksIDE0IH0sICB7IDB4MUIsIDE0IH0sCisgICAgeyAweDFDLCAxNCB9LCAgeyAweDFFLCAxNCB9LCAgeyAweDI1LCAxNCB9LCAgeyAweDIwLCAxNCB9LAorICAgIHsgMHgyMSwgMTQgfSwgIHsgMHgxMywgMTMgfSwgIHsgMHgxNCwgMTMgfSwgIHsgMHgxNSwgMTMgfSwKKyAgICB7IDB4MTYsIDEzIH0sICB7IDB4MTcsIDEzIH0sICB7IDB4MTgsIDEzIH0sICB7IDB4MTksIDEzIH0sCisgICAgeyAweDFBLCAxMyB9LCAgeyAweDE4LCAxMiB9LCAgeyAweDE3LCAxMiB9LCAgeyAweDE1LCAxMiB9LAorICAgIHsgMHgxNCwgMTIgfSwgIHsgMHgxMywgMTIgfSwgIHsgMHgxMiwgMTIgfSwgIHsgMHgwRiwgMTEgfSwKKyAgICB7IDB4MTAsIDExIH0sICB7IDB4MTIsIDExIH0sICB7IDB4MTMsIDExIH0sICB7IDB4MUIsIDExIH0sCisgICAgeyAweDFBLCAxMSB9LCAgeyAweDBFLCAxMCB9LCAgeyAweDEzLCAxMCB9LCAgeyAweDBGLCAxMCB9LAorICAgIHsgMHgxMCwgMTAgfSwgIHsgMHgxMSwgMTAgfSwgIHsgMHgxMiwgMTAgfSwgIHsgMHgwRCwgIDkgfSwKKyAgICB7IDB4MTQsICA5IH0sICB7IDB4MTUsICA5IH0sICB7IDB4MEMsICA5IH0sICB7IDB4MTMsICA5IH0sCisgICAgeyAweDBGLCAgOCB9LCAgeyAweDBFLCAgOCB9LCAgeyAweDEwLCAgOCB9LCAgeyAweDExLCAgOCB9LAorICAgIHsgMHgwQywgIDcgfSwgIHsgMHgwOSwgIDcgfSwgIHsgMHgwQSwgIDcgfSwgIHsgMHgwOCwgIDYgfSwKKyAgICB7IDB4MDksICA2IH0sICB7IDB4MDksICA1IH0sICB7IDB4MDgsICA1IH0sICB7IDB4MDUsICA0IH0sCisgICAgeyAweDAxLCAgMSB9LCAgeyAweDAzLCAgMyB9LCAgeyAweDA3LCAgNSB9LCAgeyAweDA2LCAgNSB9LAorICAgIHsgMHgwQiwgIDYgfSwgIHsgMHgwQSwgIDYgfSwgIHsgMHgwRSwgIDcgfSwgIHsgMHgwRiwgIDcgfSwKKyAgICB7IDB4MEIsICA3IH0sICB7IDB4MEQsICA3IH0sICB7IDB4MEIsICA4IH0sICB7IDB4MEQsICA4IH0sCisgICAgeyAweDBDLCAgOCB9LCAgeyAweDBGLCAgOSB9LCAgeyAweDEwLCAgOSB9LCAgeyAweDExLCAgOSB9LAorICAgIHsgMHgwRSwgIDkgfSwgIHsgMHgxMiwgIDkgfSwgIHsgMHgxNywgMTAgfSwgIHsgMHgxNCwgMTAgfSwKKyAgICB7IDB4MTYsIDEwIH0sICB7IDB4MTUsIDEwIH0sICB7IDB4MTksIDExIH0sICB7IDB4MTgsIDExIH0sCisgICAgeyAweDE3LCAxMSB9LCAgeyAweDE2LCAxMSB9LCAgeyAweDE1LCAxMSB9LCAgeyAweDE0LCAxMSB9LAorICAgIHsgMHgxMSwgMTEgfSwgIHsgMHgxOSwgMTIgfSwgIHsgMHgxQSwgMTIgfSwgIHsgMHgxNiwgMTIgfSwKKyAgICB7IDB4MUQsIDEyIH0sICB7IDB4MUIsIDEyIH0sICB7IDB4MUMsIDEyIH0sICB7IDB4MjAsIDEzIH0sCisgICAgeyAweDFDLCAxMyB9LCAgeyAweDIzLCAxMyB9LCAgeyAweDIyLCAxMyB9LCAgeyAweDIxLCAxMyB9LAorICAgIHsgMHgxRiwgMTMgfSwgIHsgMHgxRSwgMTMgfSwgIHsgMHgxQiwgMTMgfSwgIHsgMHgxRCwgMTMgfSwKKyAgICB7IDB4MjQsIDE0IH0sICB7IDB4MTYsIDE0IH0sICB7IDB4MUEsIDE0IH0sICB7IDB4MjIsIDE0IH0sCisgICAgeyAweDFELCAxNCB9LCAgeyAweDFGLCAxNCB9LCAgeyAweDE1LCAxNCB9LCAgeyAweDIzLCAxNCB9LAorICAgIHsgMHgxOCwgMTUgfSwgIHsgMHgyMCwgMTUgfSwgIHsgMHgyOSwgMTUgfSwgIHsgMHgyOCwgMTUgfSwKKyAgICB7IDB4MjYsIDE1IH0sICB7IDB4MjUsIDE1IH0sICB7IDB4MTksIDE1IH0sICB7IDB4MUMsIDE1IH0sCisgICAgeyAweDFFLCAxNSB9LCAgeyAweDE3LCAxNSB9LCAgeyAweDJDLCAxNiB9LCAgeyAweDJCLCAxNiB9LAorICAgIHsgMHgxQywgMTYgfSwgIHsgMHgyMSwgMTYgfSwgIHsgMHgyRCwgMTYgfSwgIHsgMHgyOCwgMTYgfSwKKyAgICB7IDB4MUYsIDE2IH0sICB7IDB4MUIsIDE2IH0sICB7IDB4MUEsIDE2IH0sICB7IDB4MjIsIDE2IH0sCisgICAgeyAweDJELCAxNyB9LCAgeyAweDMyLCAxNyB9LCAgeyAweDJDLCAxNyB9LCAgeyAweDI3LCAxNyB9LAorICAgIHsgMHgzMSwgMTcgfSwgIHsgMHgzMywgMTcgfSwgIHsgMHgyRiwgMTcgfSwgIHsgMHgyQiwgMTcgfSwKKyAgICB7IDB4MzcsIDE4IH0sICB7IDB4MkEsIDE3IH0sICB7IDB4MkUsIDE3IH0sICB7IDB4MzAsIDE3IH0sCisgICAgeyAweDI5LCAxNyB9LCAgeyAweDI4LCAxNyB9LCAgeyAweDI2LCAxNyB9LCAgeyAweDI1LCAxNyB9LAorICAgIHsgMHgyRiwgMTkgfSwgIHsgMHgzMywgMTggfSwgIHsgMHgzNCwgMTggfSwgIHsgMHgzMCwgMTkgfSwKKyAgICB7IDB4M0EsIDE4IH0sICB7IDB4M0IsIDE4IH0sICB7IDB4MzEsIDE5IH0sICB7IDB4M0MsIDE4IH0sCisgICAgeyAweDJCLCAxOCB9LCAgeyAweDI5LCAxOCB9LCAgeyAweDQ4LCAxOSB9LCAgeyAweDI3LCAxOCB9LAorICAgIHsgMHg0MiwgMTkgfSwgIHsgMHg0MSwgMTkgfSwgIHsgMHgyNiwgMTggfSwgIHsgMHg1MiwgMjAgfSwKKyAgICB7IDB4NTEsIDIwIH0sICB7IDB4M0YsIDE5IH0sICB7IDB4M0UsIDE5IH0sICB7IDB4MzksIDE5IH0sCisgICAgeyAweDNDLCAxOSB9LCAgeyAweDNCLCAxOSB9LCAgeyAweDNBLCAxOSB9LCAgeyAweDI1LCAxOCB9LAorICAgIHsgMHgzOCwgMTkgfSwgIHsgMHg1MCwgMjAgfSwgIHsgMHgzNywgMTkgfSwgIHsgMHgzNiwgMTkgfSwKKyAgICB7IDB4ODcsIDIxIH0sICB7IDB4NEYsIDIwIH0sICB7IDB4MzUsIDE5IH0sICB7IDB4NEUsIDIwIH0sCisgICAgeyAweDMzLCAxOSB9LCAgeyAweDMyLCAxOSB9LCAgeyAweDRELCAyMCB9LCAgeyAweDRDLCAyMCB9LAorICAgIHsgMHg4MywgMjIgfSwgIHsgMHg0QiwgMjAgfSwgIHsgMHg4MSwgMjIgfSwgIHsgMHg4MCwgMjIgfSwKKyAgICB7IDB4OEUsIDIxIH0sICB7IDB4N0UsIDIyIH0sICB7IDB4N0QsIDIyIH0sICB7IDB4ODQsIDIxIH0sCisgICAgeyAweDhELCAyMSB9LCAgeyAweDdBLCAyMiB9LCAgeyAweDc5LCAyMiB9LCAgeyAweDRBLCAyMCB9LAorICAgIHsgMHg3NywgMjIgfSwgIHsgMHg3NiwgMjIgfSwgIHsgMHg4OSwgMjEgfSwgIHsgMHg3NCwgMjIgfSwKKyAgICB7IDB4NzMsIDIyIH0sICB7IDB4NzIsIDIyIH0sICB7IDB4NDksIDIwIH0sICB7IDB4NzAsIDIyIH0sCisgICAgeyAweDZGLCAyMiB9LCAgeyAweDZFLCAyMiB9LCAgeyAweDZELCAyMiB9LCAgeyAweDZDLCAyMiB9LAorICAgIHsgMHg2QiwgMjIgfSwgIHsgMHg2QSwgMjIgfSwgIHsgMHg2OSwgMjIgfSwgIHsgMHg2OCwgMjIgfSwKKyAgICB7IDB4NjcsIDIyIH0sICB7IDB4NjYsIDIyIH0sICB7IDB4NjUsIDIyIH0sICB7IDB4NjQsIDIyIH0sCisgICAgeyAweDYzLCAyMiB9LCAgeyAweDYyLCAyMiB9LCAgeyAweDhBLCAyMSB9LCAgeyAweDg4LCAyMSB9LAorICAgIHsgMHg1RiwgMjIgfSwgIHsgMHg1RSwgMjIgfSwgIHsgMHg1RCwgMjIgfSwgIHsgMHg4NSwgMjEgfSwKKyAgICB7IDB4NUIsIDIyIH0sICB7IDB4ODMsIDIxIH0sICB7IDB4NTksIDIyIH0sICB7IDB4NTgsIDIyIH0sCisgICAgeyAweDU3LCAyMiB9LCAgeyAweDU2LCAyMiB9LCAgeyAweDU1LCAyMiB9LCAgeyAweDU0LCAyMiB9LAorICAgIHsgMHg1MywgMjIgfSwgIHsgMHg1MiwgMjIgfSwgIHsgMHg1MSwgMjIgfSwgIHsgMHg1MCwgMjIgfSwKKyAgICB7IDB4NEYsIDIyIH0sICB7IDB4NEUsIDIyIH0sICB7IDB4NEQsIDIyIH0sICB7IDB4NEMsIDIyIH0sCisgICAgeyAweDRCLCAyMiB9LCAgeyAweDRBLCAyMiB9LCAgeyAweDQ5LCAyMiB9LCAgeyAweDQ4LCAyMiB9LAorICAgIHsgMHg0NywgMjIgfSwgIHsgMHg0NiwgMjIgfSwgIHsgMHg0NSwgMjIgfSwgIHsgMHg0NCwgMjIgfSwKKyAgICB7IDB4NDMsIDIyIH0sICB7IDB4NDIsIDIyIH0sICB7IDB4NDEsIDIyIH0sICB7IDB4NDAsIDIyIH0sCisgICAgeyAweDNGLCAyMiB9LCAgeyAweDNFLCAyMiB9LCAgeyAweDNELCAyMiB9LCAgeyAweDNDLCAyMiB9LAorICAgIHsgMHgzQiwgMjIgfSwgIHsgMHgzQSwgMjIgfSwgIHsgMHgzOSwgMjIgfSwgIHsgMHgzOCwgMjIgfSwKKyAgICB7IDB4MzcsIDIyIH0sICB7IDB4MzYsIDIyIH0sICB7IDB4MzUsIDIyIH0sICB7IDB4MzQsIDIyIH0sCisgICAgeyAweDMzLCAyMiB9LCAgeyAweDMyLCAyMiB9LCAgeyAweDMxLCAyMiB9LCAgeyAweDMwLCAyMiB9LAorICAgIHsgMHgyRiwgMjIgfSwgIHsgMHgyRSwgMjIgfSwgIHsgMHgyRCwgMjIgfSwgIHsgMHgyQywgMjIgfSwKKyAgICB7IDB4MkIsIDIyIH0sICB7IDB4MkEsIDIyIH0sICB7IDB4MjksIDIyIH0sICB7IDB4MjgsIDIyIH0sCisgICAgeyAweDI3LCAyMiB9LCAgeyAweDI2LCAyMiB9LCAgeyAweDI1LCAyMiB9LCAgeyAweDI0LCAyMiB9LAorICAgIHsgMHgyMywgMjIgfSwgIHsgMHgyMiwgMjIgfSwgIHsgMHgyMSwgMjIgfSwgIHsgMHgyMCwgMjIgfSwKKyAgICB7IDB4MUYsIDIyIH0sICB7IDB4MUUsIDIyIH0sICB7IDB4MUQsIDIyIH0sICB7IDB4MUMsIDIyIH0sCisgICAgeyAweDFCLCAyMiB9LCAgeyAweDFBLCAyMiB9LCAgeyAweDE5LCAyMiB9LCAgeyAweDE4LCAyMiB9LAorICAgIHsgMHgxNywgMjIgfSwgIHsgMHgxNiwgMjIgfSwgIHsgMHgxNSwgMjIgfSwgIHsgMHgxNCwgMjIgfSwKKyAgICB7IDB4MTMsIDIyIH0sICB7IDB4MTIsIDIyIH0sICB7IDB4MTEsIDIyIH0sICB7IDB4MTAsIDIyIH0sCisgICAgeyAweDBGLCAyMiB9LCAgeyAweDBFLCAyMiB9LCAgeyAweDBELCAyMiB9LCAgeyAweDBDLCAyMiB9LAorICAgIHsgMHgwQiwgMjIgfSwgIHsgMHgwQSwgMjIgfSwgIHsgMHgwOSwgMjIgfSwgIHsgMHgwOCwgMjIgfSwKKyAgICB7IDB4MDcsIDIyIH0sICB7IDB4MDYsIDIyIH0sICB7IDB4MDUsIDIyIH0sICB7IDB4MDQsIDIyIH0sCisgICAgeyAweDAzLCAyMiB9LCAgeyAweDAyLCAyMiB9LCAgeyAweDAxLCAyMiB9LCAgeyAweDAwLCAyMiB9Cit9OworCisjZW5kaWYgLyogQVZDT0RFQ19TVlExX1ZMQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zdnExZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9zdnExZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyYjYxOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3N2cTFkZWMuYwpAQCAtMCwwICsxLDg0NyBAQAorLyoKKyAqIFNWUTEgZGVjb2RlcgorICogcG9ydGVkIHRvIE1QbGF5ZXIgYnkgQXJwaSA8YXJwaUB0aG90LmJhbmtpLmh1PgorICogcG9ydGVkIHRvIGxpYmF2Y29kZWMgYnkgTmljayBLdXJzaGV2IDxuaWNrb2xzX2tAbWFpbC5ydT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFhpbmUgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFNWUTEgRW5jb2RlciAoYykgMjAwNCBNaWtlIE1lbGFuc29uIDxtZWxhbnNvbkBwY2lzeXMubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTb3JlbnNvbiBWZWN0b3IgUXVhbnRpemVyICMxIChTVlExKSB2aWRlbyBjb2RlYy4KKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9mIHRoZSBTVlExIGFsZ29yaXRobSwgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzLworICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJoMjYzLmgiCisjaW5jbHVkZSAiaHBlbGRzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgInN2cTEuaCIKKworI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGFzc2VydC5oPgorCitzdGF0aWMgVkxDIHN2cTFfYmxvY2tfdHlwZTsKK3N0YXRpYyBWTEMgc3ZxMV9tb3Rpb25fY29tcG9uZW50Oworc3RhdGljIFZMQyBzdnExX2ludHJhX211bHRpc3RhZ2VbNl07CitzdGF0aWMgVkxDIHN2cTFfaW50ZXJfbXVsdGlzdGFnZVs2XTsKK3N0YXRpYyBWTEMgc3ZxMV9pbnRyYV9tZWFuOworc3RhdGljIFZMQyBzdnExX2ludGVyX21lYW47CisKKy8qIG1vdGlvbiB2ZWN0b3IgKHByZWRpY3Rpb24pICovCit0eXBlZGVmIHN0cnVjdCBzdnExX3Btdl9zIHsKKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKK30gc3ZxMV9wbXY7CisKK3R5cGVkZWYgc3RydWN0IFNWUTFDb250ZXh0IHsKKyAgICBIcGVsRFNQQ29udGV4dCBoZHNwOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgQVZGcmFtZSAqcHJldjsKKworICAgIHVpbnQ4X3QgKnBrdF9zd2FwcGVkOworICAgIGludCBwa3Rfc3dhcHBlZF9hbGxvY2F0ZWQ7CisKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgZnJhbWVfY29kZTsKKyAgICBpbnQgbm9ucmVmOyAgICAgICAgIC8vIDEgaWYgdGhlIGN1cnJlbnQgZnJhbWUgd29uJ3QgYmUgcmVmZXJlbmNlZAorfSBTVlExQ29udGV4dDsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3RyaW5nX3RhYmxlWzI1Nl0gPSB7CisgICAgMHgwMCwgMHhENSwgMHg3RiwgMHhBQSwgMHhGRSwgMHgyQiwgMHg4MSwgMHg1NCwKKyAgICAweDI5LCAweEZDLCAweDU2LCAweDgzLCAweEQ3LCAweDAyLCAweEE4LCAweDdELAorICAgIDB4NTIsIDB4ODcsIDB4MkQsIDB4RjgsIDB4QUMsIDB4NzksIDB4RDMsIDB4MDYsCisgICAgMHg3QiwgMHhBRSwgMHgwNCwgMHhEMSwgMHg4NSwgMHg1MCwgMHhGQSwgMHgyRiwKKyAgICAweEE0LCAweDcxLCAweERCLCAweDBFLCAweDVBLCAweDhGLCAweDI1LCAweEYwLAorICAgIDB4OEQsIDB4NTgsIDB4RjIsIDB4MjcsIDB4NzMsIDB4QTYsIDB4MEMsIDB4RDksCisgICAgMHhGNiwgMHgyMywgMHg4OSwgMHg1QywgMHgwOCwgMHhERCwgMHg3NywgMHhBMiwKKyAgICAweERGLCAweDBBLCAweEEwLCAweDc1LCAweDIxLCAweEY0LCAweDVFLCAweDhCLAorICAgIDB4OUQsIDB4NDgsIDB4RTIsIDB4MzcsIDB4NjMsIDB4QjYsIDB4MUMsIDB4QzksCisgICAgMHhCNCwgMHg2MSwgMHhDQiwgMHgxRSwgMHg0QSwgMHg5RiwgMHgzNSwgMHhFMCwKKyAgICAweENGLCAweDFBLCAweEIwLCAweDY1LCAweDMxLCAweEU0LCAweDRFLCAweDlCLAorICAgIDB4RTYsIDB4MzMsIDB4OTksIDB4NEMsIDB4MTgsIDB4Q0QsIDB4NjcsIDB4QjIsCisgICAgMHgzOSwgMHhFQywgMHg0NiwgMHg5MywgMHhDNywgMHgxMiwgMHhCOCwgMHg2RCwKKyAgICAweDEwLCAweEM1LCAweDZGLCAweEJBLCAweEVFLCAweDNCLCAweDkxLCAweDQ0LAorICAgIDB4NkIsIDB4QkUsIDB4MTQsIDB4QzEsIDB4OTUsIDB4NDAsIDB4RUEsIDB4M0YsCisgICAgMHg0MiwgMHg5NywgMHgzRCwgMHhFOCwgMHhCQywgMHg2OSwgMHhDMywgMHgxNiwKKyAgICAweEVGLCAweDNBLCAweDkwLCAweDQ1LCAweDExLCAweEM0LCAweDZFLCAweEJCLAorICAgIDB4QzYsIDB4MTMsIDB4QjksIDB4NkMsIDB4MzgsIDB4RUQsIDB4NDcsIDB4OTIsCisgICAgMHhCRCwgMHg2OCwgMHhDMiwgMHgxNywgMHg0MywgMHg5NiwgMHgzQywgMHhFOSwKKyAgICAweDk0LCAweDQxLCAweEVCLCAweDNFLCAweDZBLCAweEJGLCAweDE1LCAweEMwLAorICAgIDB4NEIsIDB4OUUsIDB4MzQsIDB4RTEsIDB4QjUsIDB4NjAsIDB4Q0EsIDB4MUYsCisgICAgMHg2MiwgMHhCNywgMHgxRCwgMHhDOCwgMHg5QywgMHg0OSwgMHhFMywgMHgzNiwKKyAgICAweDE5LCAweENDLCAweDY2LCAweEIzLCAweEU3LCAweDMyLCAweDk4LCAweDRELAorICAgIDB4MzAsIDB4RTUsIDB4NEYsIDB4OUEsIDB4Q0UsIDB4MUIsIDB4QjEsIDB4NjQsCisgICAgMHg3MiwgMHhBNywgMHgwRCwgMHhEOCwgMHg4QywgMHg1OSwgMHhGMywgMHgyNiwKKyAgICAweDVCLCAweDhFLCAweDI0LCAweEYxLCAweEE1LCAweDcwLCAweERBLCAweDBGLAorICAgIDB4MjAsIDB4RjUsIDB4NUYsIDB4OEEsIDB4REUsIDB4MEIsIDB4QTEsIDB4NzQsCisgICAgMHgwOSwgMHhEQywgMHg3NiwgMHhBMywgMHhGNywgMHgyMiwgMHg4OCwgMHg1RCwKKyAgICAweEQ2LCAweDAzLCAweEE5LCAweDdDLCAweDI4LCAweEZELCAweDU3LCAweDgyLAorICAgIDB4RkYsIDB4MkEsIDB4ODAsIDB4NTUsIDB4MDEsIDB4RDQsIDB4N0UsIDB4QUIsCisgICAgMHg4NCwgMHg1MSwgMHhGQiwgMHgyRSwgMHg3QSwgMHhBRiwgMHgwNSwgMHhEMCwKKyAgICAweEFELCAweDc4LCAweEQyLCAweDA3LCAweDUzLCAweDg2LCAweDJDLCAweEY5Cit9OworCisjZGVmaW5lIFNWUTFfUFJPQ0VTU19WRUNUT1IoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICg7IGxldmVsID4gMDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIHByb2Nlc3MgbmV4dCBkZXB0aCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpID09IG0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtID0gbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoLS1sZXZlbCA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIGRpdmlkZSBibG9jayBpZiBuZXh0IGJpdCBzZXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghZ2V0X2JpdHMxKGJpdGJ1ZikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIGFkZCBjaGlsZCBub2RlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxpc3RbbisrXSA9IGxpc3RbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxpc3RbbisrXSA9IGxpc3RbaV0gKyAoKChsZXZlbCAmIDEpID8gcGl0Y2ggOiAxKSA8PCAoKGxldmVsID4+IDEpICsgMSkpO1wKKyAgICB9CisKKyNkZWZpbmUgU1ZRMV9BRERfQ09ERUJPT0soKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBhZGQgY29kZWJvb2sgZW50cmllcyB0byB2ZWN0b3IgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGogPSAwOyBqIDwgc3RhZ2VzOyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbjMgID0gY29kZWJvb2tbZW50cmllc1tqXV0gXiAweDgwODA4MDgwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbjEgKz0gKG4zICYgMHhGRjAwRkYwMCkgPj4gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbjIgKz0gIG4zICYgMHgwMEZGMDBGRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBjbGlwIHRvIFswLi4yNTVdICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobjEgJiAweEZGMDBGRjAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbjMgID0gKG4xID4+IDE1ICAmIDB4MDAwMTAwMDEgfCAweDAxMDAwMTAwKSAtIDB4MDAwMTAwMDE7ICAgICAgIFwKKyAgICAgICAgbjEgKz0gMHg3RjAwN0YwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbjEgfD0gKH5uMSA+PiAxNSAmIDB4MDAwMTAwMDEgfCAweDAxMDAwMTAwKSAtIDB4MDAwMTAwMDE7ICAgICAgIFwKKyAgICAgICAgbjEgJj0gbjMgJiAweDAwRkYwMEZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobjIgJiAweEZGMDBGRjAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbjMgID0gKG4yID4+IDE1ICAmIDB4MDAwMTAwMDEgfCAweDAxMDAwMTAwKSAtIDB4MDAwMTAwMDE7ICAgICAgIFwKKyAgICAgICAgbjIgKz0gMHg3RjAwN0YwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbjIgfD0gKH5uMiA+PiAxNSAmIDB4MDAwMTAwMDEgfCAweDAxMDAwMTAwKSAtIDB4MDAwMTAwMDE7ICAgICAgIFwKKyAgICAgICAgbjIgJj0gbjMgJiAweDAwRkYwMEZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgU1ZRMV9DQUxDX0NPREVCT09LX0VOVFJJRVMoY2Jvb2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb2RlYm9vayA9IChjb25zdCB1aW50MzJfdCAqKWNib29rW2xldmVsXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3RhZ2VzID4gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYml0X2NhY2hlID0gZ2V0X2JpdHMoYml0YnVmLCA0ICogc3RhZ2VzKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBjYWxjdWxhdGUgY29kZWJvb2sgZW50cmllcyBmb3IgdGhpcyB2ZWN0b3IgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGogPSAwOyBqIDwgc3RhZ2VzOyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZW50cmllc1tqXSA9ICgoKGJpdF9jYWNoZSA+PiAoNCAqIChzdGFnZXMgLSBqIC0gMSkpKSAmIDB4RikgKyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAxNiAqIGopIDw8IChsZXZlbCArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZWFuIC09IHN0YWdlcyAqIDEyODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuNCAgICA9IChtZWFuIDw8IDE2KSArIG1lYW47CisKK3N0YXRpYyBpbnQgc3ZxMV9kZWNvZGVfYmxvY2tfaW50cmEoR2V0Qml0Q29udGV4dCAqYml0YnVmLCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCkKK3sKKyAgICB1aW50MzJfdCBiaXRfY2FjaGU7CisgICAgdWludDhfdCAqbGlzdFs2M107CisgICAgdWludDMyX3QgKmRzdDsKKyAgICBjb25zdCB1aW50MzJfdCAqY29kZWJvb2s7CisgICAgaW50IGVudHJpZXNbNl07CisgICAgaW50IGksIGosIG0sIG47CisgICAgaW50IG1lYW4sIHN0YWdlczsKKyAgICB1bnNpZ25lZCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBsZXZlbDsKKyAgICB1aW50MzJfdCBuMSwgbjIsIG4zLCBuNDsKKworICAgIC8qIGluaXRpYWxpemUgbGlzdCBmb3IgYnJlYWR0aCBmaXJzdCBwcm9jZXNzaW5nIG9mIHZlY3RvcnMgKi8KKyAgICBsaXN0WzBdID0gcGl4ZWxzOworCisgICAgLyogcmVjdXJzaXZlbHkgcHJvY2VzcyB2ZWN0b3IgKi8KKyAgICBmb3IgKGkgPSAwLCBtID0gMSwgbiA9IDEsIGxldmVsID0gNTsgaSA8IG47IGkrKykgeworICAgICAgICBTVlExX1BST0NFU1NfVkVDVE9SKCk7CisKKyAgICAgICAgLyogZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgdmVjdG9yIHNpemUgKi8KKyAgICAgICAgZHN0ICAgID0gKHVpbnQzMl90ICopbGlzdFtpXTsKKyAgICAgICAgd2lkdGggID0gMSA8PCAoKDQgKyBsZXZlbCkgLyAyKTsKKyAgICAgICAgaGVpZ2h0ID0gMSA8PCAoKDMgKyBsZXZlbCkgLyAyKTsKKworICAgICAgICAvKiBnZXQgbnVtYmVyIG9mIHN0YWdlcyAoLTEgc2tpcHMgdmVjdG9yLCAwIGZvciBtZWFuIG9ubHkpICovCisgICAgICAgIHN0YWdlcyA9IGdldF92bGMyKGJpdGJ1Ziwgc3ZxMV9pbnRyYV9tdWx0aXN0YWdlW2xldmVsXS50YWJsZSwgMywgMykgLSAxOworCisgICAgICAgIGlmIChzdGFnZXMgPT0gLTEpIHsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKyAgICAgICAgICAgICAgICBtZW1zZXQoJmRzdFt5ICogKHBpdGNoIC8gNCldLCAwLCB3aWR0aCk7CisgICAgICAgICAgICBjb250aW51ZTsgICAvKiBza2lwIHZlY3RvciAqLworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YWdlcyA+IDAgJiYgbGV2ZWwgPj0gNCkgeworICAgICAgICAgICAgYXZfZGxvZyhOVUxMLAorICAgICAgICAgICAgICAgICAgICAiRXJyb3IgKHN2cTFfZGVjb2RlX2Jsb2NrX2ludHJhKTogaW52YWxpZCB2ZWN0b3I6IHN0YWdlcz0laSBsZXZlbD0laVxuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhZ2VzLCBsZXZlbCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgIC8qIGludmFsaWQgdmVjdG9yICovCisgICAgICAgIH0KKworICAgICAgICBtZWFuID0gZ2V0X3ZsYzIoYml0YnVmLCBzdnExX2ludHJhX21lYW4udGFibGUsIDgsIDMpOworCisgICAgICAgIGlmIChzdGFnZXMgPT0gMCkgeworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorICAgICAgICAgICAgICAgIG1lbXNldCgmZHN0W3kgKiAocGl0Y2ggLyA0KV0sIG1lYW4sIHdpZHRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNWUTFfQ0FMQ19DT0RFQk9PS19FTlRSSUVTKGZmX3N2cTFfaW50cmFfY29kZWJvb2tzKTsKKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoIC8gNDsgeCsrLCBjb2RlYm9vaysrKSB7CisgICAgICAgICAgICAgICAgICAgIG4xID0gbjQ7CisgICAgICAgICAgICAgICAgICAgIG4yID0gbjQ7CisgICAgICAgICAgICAgICAgICAgIFNWUTFfQUREX0NPREVCT09LKCkKKyAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9IG4xIDw8IDggfCBuMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHN0ICs9IHBpdGNoIC8gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN2cTFfZGVjb2RlX2Jsb2NrX25vbl9pbnRyYShHZXRCaXRDb250ZXh0ICpiaXRidWYsIHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCkKK3sKKyAgICB1aW50MzJfdCBiaXRfY2FjaGU7CisgICAgdWludDhfdCAqbGlzdFs2M107CisgICAgdWludDMyX3QgKmRzdDsKKyAgICBjb25zdCB1aW50MzJfdCAqY29kZWJvb2s7CisgICAgaW50IGVudHJpZXNbNl07CisgICAgaW50IGksIGosIG0sIG47CisgICAgaW50IG1lYW4sIHN0YWdlczsKKyAgICBpbnQgeCwgeSwgd2lkdGgsIGhlaWdodCwgbGV2ZWw7CisgICAgdWludDMyX3QgbjEsIG4yLCBuMywgbjQ7CisKKyAgICAvKiBpbml0aWFsaXplIGxpc3QgZm9yIGJyZWFkdGggZmlyc3QgcHJvY2Vzc2luZyBvZiB2ZWN0b3JzICovCisgICAgbGlzdFswXSA9IHBpeGVsczsKKworICAgIC8qIHJlY3Vyc2l2ZWx5IHByb2Nlc3MgdmVjdG9yICovCisgICAgZm9yIChpID0gMCwgbSA9IDEsIG4gPSAxLCBsZXZlbCA9IDU7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgU1ZRMV9QUk9DRVNTX1ZFQ1RPUigpOworCisgICAgICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHZlY3RvciBzaXplICovCisgICAgICAgIGRzdCAgICA9ICh1aW50MzJfdCAqKWxpc3RbaV07CisgICAgICAgIHdpZHRoICA9IDEgPDwgKCg0ICsgbGV2ZWwpIC8gMik7CisgICAgICAgIGhlaWdodCA9IDEgPDwgKCgzICsgbGV2ZWwpIC8gMik7CisKKyAgICAgICAgLyogZ2V0IG51bWJlciBvZiBzdGFnZXMgKC0xIHNraXBzIHZlY3RvciwgMCBmb3IgbWVhbiBvbmx5KSAqLworICAgICAgICBzdGFnZXMgPSBnZXRfdmxjMihiaXRidWYsIHN2cTFfaW50ZXJfbXVsdGlzdGFnZVtsZXZlbF0udGFibGUsIDMsIDIpIC0gMTsKKworICAgICAgICBpZiAoc3RhZ2VzID09IC0xKQorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAvKiBza2lwIHZlY3RvciAqLworCisgICAgICAgIGlmICgoc3RhZ2VzID4gMCkgJiYgKGxldmVsID49IDQpKSB7CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICJFcnJvciAoc3ZxMV9kZWNvZGVfYmxvY2tfbm9uX2ludHJhKTogaW52YWxpZCB2ZWN0b3I6IHN0YWdlcz0laSBsZXZlbD0laVxuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhZ2VzLCBsZXZlbCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgIC8qIGludmFsaWQgdmVjdG9yICovCisgICAgICAgIH0KKworICAgICAgICBtZWFuID0gZ2V0X3ZsYzIoYml0YnVmLCBzdnExX2ludGVyX21lYW4udGFibGUsIDksIDMpIC0gMjU2OworCisgICAgICAgIFNWUTFfQ0FMQ19DT0RFQk9PS19FTlRSSUVTKGZmX3N2cTFfaW50ZXJfY29kZWJvb2tzKTsKKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aCAvIDQ7IHgrKywgY29kZWJvb2srKykgeworICAgICAgICAgICAgICAgIG4zID0gZHN0W3hdOworICAgICAgICAgICAgICAgIC8qIGFkZCBtZWFuIHZhbHVlIHRvIHZlY3RvciAqLworICAgICAgICAgICAgICAgIG4xID0gbjQgKyAoKG4zICYgMHhGRjAwRkYwMCkgPj4gOCk7CisgICAgICAgICAgICAgICAgbjIgPSBuNCArICAobjMgJiAweDAwRkYwMEZGKTsKKyAgICAgICAgICAgICAgICBTVlExX0FERF9DT0RFQk9PSygpCisgICAgICAgICAgICAgICAgLyogc3RvcmUgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgZHN0W3hdID0gbjEgPDwgOCB8IG4yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICs9IHBpdGNoIC8gNDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdnExX2RlY29kZV9tb3Rpb25fdmVjdG9yKEdldEJpdENvbnRleHQgKmJpdGJ1Ziwgc3ZxMV9wbXYgKm12LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2cTFfcG12ICoqcG12KQoreworICAgIGludCBkaWZmOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAvKiBnZXQgbW90aW9uIGNvZGUgKi8KKyAgICAgICAgZGlmZiA9IGdldF92bGMyKGJpdGJ1Ziwgc3ZxMV9tb3Rpb25fY29tcG9uZW50LnRhYmxlLCA3LCAyKTsKKyAgICAgICAgaWYgKGRpZmYgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGVsc2UgaWYgKGRpZmYpIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoYml0YnVmKSkKKyAgICAgICAgICAgICAgICBkaWZmID0gLWRpZmY7CisgICAgICAgIH0KKworICAgICAgICAvKiBhZGQgbWVkaWFuIG9mIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9ycyBhbmQgY2xpcCByZXN1bHQgKi8KKyAgICAgICAgaWYgKGkgPT0gMSkKKyAgICAgICAgICAgIG12LT55ID0gc2lnbl9leHRlbmQoZGlmZiArIG1pZF9wcmVkKHBtdlswXS0+eSwgcG12WzFdLT55LCBwbXZbMl0tPnkpLCA2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbXYtPnggPSBzaWduX2V4dGVuZChkaWZmICsgbWlkX3ByZWQocG12WzBdLT54LCBwbXZbMV0tPngsIHBtdlsyXS0+eCksIDYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdnExX3NraXBfYmxvY2sodWludDhfdCAqY3VycmVudCwgdWludDhfdCAqcHJldmlvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLCBpbnQgeCwgaW50IHkpCit7CisgICAgdWludDhfdCAqc3JjOworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBpbnQgaTsKKworICAgIHNyYyA9ICZwcmV2aW91c1t4ICsgeSAqIHBpdGNoXTsKKyAgICBkc3QgPSBjdXJyZW50OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCAxNik7CisgICAgICAgIHNyYyArPSBwaXRjaDsKKyAgICAgICAgZHN0ICs9IHBpdGNoOworICAgIH0KK30KKworc3RhdGljIGludCBzdnExX21vdGlvbl9pbnRlcl9ibG9jayhIcGVsRFNQQ29udGV4dCAqaGRzcCwgR2V0Qml0Q29udGV4dCAqYml0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpjdXJyZW50LCB1aW50OF90ICpwcmV2aW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLCBzdnExX3BtdiAqbW90aW9uLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICB1aW50OF90ICpzcmM7CisgICAgdWludDhfdCAqZHN0OworICAgIHN2cTFfcG12IG12OworICAgIHN2cTFfcG12ICpwbXZbM107CisgICAgaW50IHJlc3VsdDsKKworICAgIC8qIHByZWRpY3QgYW5kIGRlY29kZSBtb3Rpb24gdmVjdG9yICovCisgICAgcG12WzBdID0gJm1vdGlvblswXTsKKyAgICBpZiAoeSA9PSAwKSB7CisgICAgICAgIHBtdlsxXSA9CisgICAgICAgIHBtdlsyXSA9IHBtdlswXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwbXZbMV0gPSAmbW90aW9uW3ggLyA4ICsgMl07CisgICAgICAgIHBtdlsyXSA9ICZtb3Rpb25beCAvIDggKyA0XTsKKyAgICB9CisKKyAgICByZXN1bHQgPSBzdnExX2RlY29kZV9tb3Rpb25fdmVjdG9yKGJpdGJ1ZiwgJm12LCBwbXYpOworICAgIGlmIChyZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBtb3Rpb25bMF0ueCAgICAgICAgID0KKyAgICBtb3Rpb25beCAvIDggKyAyXS54ID0KKyAgICBtb3Rpb25beCAvIDggKyAzXS54ID0gbXYueDsKKyAgICBtb3Rpb25bMF0ueSAgICAgICAgID0KKyAgICBtb3Rpb25beCAvIDggKyAyXS55ID0KKyAgICBtb3Rpb25beCAvIDggKyAzXS55ID0gbXYueTsKKworICAgIG12LnggPSBhdl9jbGlwKG12LngsIC0yICogeCwgMiAqICh3aWR0aCAgLSB4IC0gMTYpKTsKKyAgICBtdi55ID0gYXZfY2xpcChtdi55LCAtMiAqIHksIDIgKiAoaGVpZ2h0IC0geSAtIDE2KSk7CisKKyAgICBzcmMgPSAmcHJldmlvdXNbKHggKyAobXYueCA+PiAxKSkgKyAoeSArIChtdi55ID4+IDEpKSAqIHBpdGNoXTsKKyAgICBkc3QgPSBjdXJyZW50OworCisgICAgaGRzcC0+cHV0X3BpeGVsc190YWJbMF1bKG12LnkgJiAxKSA8PCAxIHwgKG12LnggJiAxKV0oZHN0LCBzcmMsIHBpdGNoLCAxNik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdnExX21vdGlvbl9pbnRlcl80dl9ibG9jayhIcGVsRFNQQ29udGV4dCAqaGRzcCwgR2V0Qml0Q29udGV4dCAqYml0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpjdXJyZW50LCB1aW50OF90ICpwcmV2aW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLCBzdnExX3BtdiAqbW90aW9uLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICB1aW50OF90ICpzcmM7CisgICAgdWludDhfdCAqZHN0OworICAgIHN2cTFfcG12IG12OworICAgIHN2cTFfcG12ICpwbXZbNF07CisgICAgaW50IGksIHJlc3VsdDsKKworICAgIC8qIHByZWRpY3QgYW5kIGRlY29kZSBtb3Rpb24gdmVjdG9yICgwKSAqLworICAgIHBtdlswXSA9ICZtb3Rpb25bMF07CisgICAgaWYgKHkgPT0gMCkgeworICAgICAgICBwbXZbMV0gPQorICAgICAgICBwbXZbMl0gPSBwbXZbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcG12WzFdID0gJm1vdGlvblsoeCAvIDgpICsgMl07CisgICAgICAgIHBtdlsyXSA9ICZtb3Rpb25bKHggLyA4KSArIDRdOworICAgIH0KKworICAgIHJlc3VsdCA9IHN2cTFfZGVjb2RlX21vdGlvbl92ZWN0b3IoYml0YnVmLCAmbXYsIHBtdik7CisgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIC8qIHByZWRpY3QgYW5kIGRlY29kZSBtb3Rpb24gdmVjdG9yICgxKSAqLworICAgIHBtdlswXSA9ICZtdjsKKyAgICBpZiAoeSA9PSAwKSB7CisgICAgICAgIHBtdlsxXSA9CisgICAgICAgIHBtdlsyXSA9IHBtdlswXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwbXZbMV0gPSAmbW90aW9uWyh4IC8gOCkgKyAzXTsKKyAgICB9CisgICAgcmVzdWx0ID0gc3ZxMV9kZWNvZGVfbW90aW9uX3ZlY3RvcihiaXRidWYsICZtb3Rpb25bMF0sIHBtdik7CisgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIC8qIHByZWRpY3QgYW5kIGRlY29kZSBtb3Rpb24gdmVjdG9yICgyKSAqLworICAgIHBtdlsxXSA9ICZtb3Rpb25bMF07CisgICAgcG12WzJdID0gJm1vdGlvblsoeCAvIDgpICsgMV07CisKKyAgICByZXN1bHQgPSBzdnExX2RlY29kZV9tb3Rpb25fdmVjdG9yKGJpdGJ1ZiwgJm1vdGlvblsoeCAvIDgpICsgMl0sIHBtdik7CisgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIC8qIHByZWRpY3QgYW5kIGRlY29kZSBtb3Rpb24gdmVjdG9yICgzKSAqLworICAgIHBtdlsyXSA9ICZtb3Rpb25bKHggLyA4KSArIDJdOworICAgIHBtdlszXSA9ICZtb3Rpb25bKHggLyA4KSArIDNdOworCisgICAgcmVzdWx0ID0gc3ZxMV9kZWNvZGVfbW90aW9uX3ZlY3RvcihiaXRidWYsIHBtdlszXSwgcG12KTsKKyAgICBpZiAocmVzdWx0KQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgLyogZm9ybSBwcmVkaWN0aW9ucyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaW50IG12eCA9IHBtdltpXS0+eCArIChpICAmIDEpICogMTY7CisgICAgICAgIGludCBtdnkgPSBwbXZbaV0tPnkgKyAoaSA+PiAxKSAqIDE2OworCisgICAgICAgIC8vIEZJWE1FOiBjbGlwcGluZyBvciBwYWRkaW5nPworICAgICAgICBtdnggPSBhdl9jbGlwKG12eCwgLTIgKiB4LCAyICogKHdpZHRoICAtIHggLSA4KSk7CisgICAgICAgIG12eSA9IGF2X2NsaXAobXZ5LCAtMiAqIHksIDIgKiAoaGVpZ2h0IC0geSAtIDgpKTsKKworICAgICAgICBzcmMgPSAmcHJldmlvdXNbKHggKyAobXZ4ID4+IDEpKSArICh5ICsgKG12eSA+PiAxKSkgKiBwaXRjaF07CisgICAgICAgIGRzdCA9IGN1cnJlbnQ7CisKKyAgICAgICAgaGRzcC0+cHV0X3BpeGVsc190YWJbMV1bKChtdnkgJiAxKSA8PCAxKSB8IChtdnggJiAxKV0oZHN0LCBzcmMsIHBpdGNoLCA4KTsKKworICAgICAgICAvKiBzZWxlY3QgbmV4dCBibG9jayAqLworICAgICAgICBpZiAoaSAmIDEpCisgICAgICAgICAgICBjdXJyZW50ICs9IDggKiAocGl0Y2ggLSAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3VycmVudCArPSA4OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN2cTFfZGVjb2RlX2RlbHRhX2Jsb2NrKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgSHBlbERTUENvbnRleHQgKmhkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmJpdGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqY3VycmVudCwgdWludDhfdCAqcHJldmlvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwgc3ZxMV9wbXYgKm1vdGlvbiwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgdWludDMyX3QgYmxvY2tfdHlwZTsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIC8qIGdldCBibG9jayB0eXBlICovCisgICAgYmxvY2tfdHlwZSA9IGdldF92bGMyKGJpdGJ1Ziwgc3ZxMV9ibG9ja190eXBlLnRhYmxlLCAyLCAyKTsKKworICAgIC8qIHJlc2V0IG1vdGlvbiB2ZWN0b3JzICovCisgICAgaWYgKGJsb2NrX3R5cGUgPT0gU1ZRMV9CTE9DS19TS0lQIHx8IGJsb2NrX3R5cGUgPT0gU1ZRMV9CTE9DS19JTlRSQSkgeworICAgICAgICBtb3Rpb25bMF0ueCAgICAgICAgID0KKyAgICAgICAgbW90aW9uWzBdLnkgICAgICAgICA9CisgICAgICAgIG1vdGlvblt4IC8gOCArIDJdLnggPQorICAgICAgICBtb3Rpb25beCAvIDggKyAyXS55ID0KKyAgICAgICAgbW90aW9uW3ggLyA4ICsgM10ueCA9CisgICAgICAgIG1vdGlvblt4IC8gOCArIDNdLnkgPSAwOworICAgIH0KKworICAgIHN3aXRjaCAoYmxvY2tfdHlwZSkgeworICAgIGNhc2UgU1ZRMV9CTE9DS19TS0lQOgorICAgICAgICBzdnExX3NraXBfYmxvY2soY3VycmVudCwgcHJldmlvdXMsIHBpdGNoLCB4LCB5KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNWUTFfQkxPQ0tfSU5URVI6CisgICAgICAgIHJlc3VsdCA9IHN2cTFfbW90aW9uX2ludGVyX2Jsb2NrKGhkc3AsIGJpdGJ1ZiwgY3VycmVudCwgcHJldmlvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoLCBtb3Rpb24sIHgsIHksIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gMCkgeworICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgIkVycm9yIGluIHN2cTFfbW90aW9uX2ludGVyX2Jsb2NrICVpXG4iLCByZXN1bHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gc3ZxMV9kZWNvZGVfYmxvY2tfbm9uX2ludHJhKGJpdGJ1ZiwgY3VycmVudCwgcGl0Y2gpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU1ZRMV9CTE9DS19JTlRFUl80VjoKKyAgICAgICAgcmVzdWx0ID0gc3ZxMV9tb3Rpb25faW50ZXJfNHZfYmxvY2soaGRzcCwgYml0YnVmLCBjdXJyZW50LCBwcmV2aW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2gsIG1vdGlvbiwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiRXJyb3IgaW4gc3ZxMV9tb3Rpb25faW50ZXJfNHZfYmxvY2sgJWlcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBzdnExX2RlY29kZV9ibG9ja19ub25faW50cmEoYml0YnVmLCBjdXJyZW50LCBwaXRjaCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVlExX0JMT0NLX0lOVFJBOgorICAgICAgICByZXN1bHQgPSBzdnExX2RlY29kZV9ibG9ja19pbnRyYShiaXRidWYsIGN1cnJlbnQsIHBpdGNoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgc3ZxMV9wYXJzZV9zdHJpbmcoR2V0Qml0Q29udGV4dCAqYml0YnVmLCB1aW50OF90IG91dFsyNTddKQoreworICAgIHVpbnQ4X3Qgc2VlZDsKKyAgICBpbnQgaTsKKworICAgIG91dFswXSA9IGdldF9iaXRzKGJpdGJ1ZiwgOCk7CisgICAgc2VlZCAgID0gc3RyaW5nX3RhYmxlW291dFswXV07CisKKyAgICBmb3IgKGkgPSAxOyBpIDw9IG91dFswXTsgaSsrKSB7CisgICAgICAgIG91dFtpXSA9IGdldF9iaXRzKGJpdGJ1ZiwgOCkgXiBzZWVkOworICAgICAgICBzZWVkICAgPSBzdHJpbmdfdGFibGVbb3V0W2ldIF4gc2VlZF07CisgICAgfQorICAgIG91dFtpXSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgc3ZxMV9kZWNvZGVfZnJhbWVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgU1ZRMUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJpdENvbnRleHQgKmJpdGJ1ZiA9ICZzLT5nYjsKKyAgICBpbnQgZnJhbWVfc2l6ZV9jb2RlOworICAgIGludCB3aWR0aCAgPSBzLT53aWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gcy0+aGVpZ2h0OworCisgICAgc2tpcF9iaXRzKGJpdGJ1ZiwgOCk7IC8qIHRlbXBvcmFsX3JlZmVyZW5jZSAqLworCisgICAgLyogZnJhbWUgdHlwZSAqLworICAgIHMtPm5vbnJlZiA9IDA7CisgICAgc3dpdGNoIChnZXRfYml0cyhiaXRidWYsIDIpKSB7CisgICAgY2FzZSAwOgorICAgICAgICBmcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgcy0+bm9ucmVmID0gMTsKKyAgICBjYXNlIDE6CisgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGZyYW1lIHR5cGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGZyYW1lLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgLyogdW5rbm93biBmaWVsZHMgKi8KKyAgICAgICAgaWYgKHMtPmZyYW1lX2NvZGUgPT0gMHg1MCB8fCBzLT5mcmFtZV9jb2RlID09IDB4NjApIHsKKyAgICAgICAgICAgIGludCBjc3VtID0gZ2V0X2JpdHMoYml0YnVmLCAxNik7CisKKyAgICAgICAgICAgIGNzdW0gPSBmZl9zdnExX3BhY2tldF9jaGVja3N1bShiaXRidWYtPmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRidWYtPnNpemVfaW5fYml0cyA+PiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdW0pOworCisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiJXMgY2hlY2tzdW0gKCUwMngpIGZvciBwYWNrZXQgZGF0YVxuIiwKKyAgICAgICAgICAgICAgICAgICAgKGNzdW0gPT0gMCkgPyAiY29ycmVjdCIgOiAiaW5jb3JyZWN0IiwgY3N1bSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHMtPmZyYW1lX2NvZGUgXiAweDEwKSA+PSAweDUwKSB7CisgICAgICAgICAgICB1aW50OF90IG1zZ1syNTddOworCisgICAgICAgICAgICBzdnExX3BhcnNlX3N0cmluZyhiaXRidWYsIG1zZyk7CisKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgImVtYmVkZGVkIG1lc3NhZ2U6XG4lc1xuIiwgKChjaGFyICopbXNnKSArIDEpOworICAgICAgICB9CisKKyAgICAgICAgc2tpcF9iaXRzKGJpdGJ1ZiwgMik7CisgICAgICAgIHNraXBfYml0cyhiaXRidWYsIDIpOworICAgICAgICBza2lwX2JpdHMxKGJpdGJ1Zik7CisKKyAgICAgICAgLyogbG9hZCBmcmFtZSBzaXplICovCisgICAgICAgIGZyYW1lX3NpemVfY29kZSA9IGdldF9iaXRzKGJpdGJ1ZiwgMyk7CisKKyAgICAgICAgaWYgKGZyYW1lX3NpemVfY29kZSA9PSA3KSB7CisgICAgICAgICAgICAvKiBsb2FkIHdpZHRoLCBoZWlnaHQgKDEyIGJpdHMgZWFjaCkgKi8KKyAgICAgICAgICAgIHdpZHRoICA9IGdldF9iaXRzKGJpdGJ1ZiwgMTIpOworICAgICAgICAgICAgaGVpZ2h0ID0gZ2V0X2JpdHMoYml0YnVmLCAxMik7CisKKyAgICAgICAgICAgIGlmICghd2lkdGggfHwgIWhlaWdodCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGdldCB3aWR0aCwgaGVpZ2h0IGZyb20gdGFibGUgKi8KKyAgICAgICAgICAgIHdpZHRoICA9IGZmX3N2cTFfZnJhbWVfc2l6ZV90YWJsZVtmcmFtZV9zaXplX2NvZGVdWzBdOworICAgICAgICAgICAgaGVpZ2h0ID0gZmZfc3ZxMV9mcmFtZV9zaXplX3RhYmxlW2ZyYW1lX3NpemVfY29kZV1bMV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1bmtub3duIGZpZWxkcyAqLworICAgIGlmIChnZXRfYml0czEoYml0YnVmKSkgeworICAgICAgICBza2lwX2JpdHMxKGJpdGJ1Zik7ICAgIC8qIHVzZSBwYWNrZXQgY2hlY2tzdW0gaWYgKDEpICovCisgICAgICAgIHNraXBfYml0czEoYml0YnVmKTsgICAgLyogY29tcG9uZW50IGNoZWNrc3VtcyBhZnRlciBpbWFnZSBkYXRhIGlmICgxKSAqLworCisgICAgICAgIGlmIChnZXRfYml0cyhiaXRidWYsIDIpICE9IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHMxKGJpdGJ1ZikpIHsKKyAgICAgICAgc2tpcF9iaXRzMShiaXRidWYpOworICAgICAgICBza2lwX2JpdHMoYml0YnVmLCA0KTsKKyAgICAgICAgc2tpcF9iaXRzMShiaXRidWYpOworICAgICAgICBza2lwX2JpdHMoYml0YnVmLCAyKTsKKworICAgICAgICBpZiAoc2tpcF8xc3RvcF84ZGF0YV9iaXRzKGJpdGJ1ZikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+d2lkdGggID0gd2lkdGg7CisgICAgcy0+aGVpZ2h0ID0gaGVpZ2h0OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN2cTFfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBTVlExQ29udGV4dCAgICAgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgICAgICAgKmN1ciA9IGRhdGE7CisgICAgdWludDhfdCAqY3VycmVudDsKKyAgICBpbnQgcmVzdWx0LCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworICAgIHN2cTFfcG12ICpwbXY7CisKKyAgICAvKiBpbml0aWFsaXplIGJpdCBidWZmZXIgKi8KKyAgICBpbml0X2dldF9iaXRzOCgmcy0+Z2IsIGJ1ZiwgYnVmX3NpemUpOworCisgICAgLyogZGVjb2RlIGZyYW1lIGhlYWRlciAqLworICAgIHMtPmZyYW1lX2NvZGUgPSBnZXRfYml0cygmcy0+Z2IsIDIyKTsKKworICAgIGlmICgocy0+ZnJhbWVfY29kZSAmIH4weDcwKSB8fCAhKHMtPmZyYW1lX2NvZGUgJiAweDYwKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiBzd2FwIHNvbWUgaGVhZGVyIGJ5dGVzICh3aHk/KSAqLworICAgIGlmIChzLT5mcmFtZV9jb2RlICE9IDB4MjApIHsKKyAgICAgICAgdWludDMyX3QgKnNyYzsKKworICAgICAgICBpZiAoYnVmX3NpemUgPCA5ICogNCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnB1dCBwYWNrZXQgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZzLT5wa3Rfc3dhcHBlZCwgJnMtPnBrdF9zd2FwcGVkX2FsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUpOworICAgICAgICBpZiAoIXMtPnBrdF9zd2FwcGVkKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBtZW1jcHkocy0+cGt0X3N3YXBwZWQsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICBidWYgPSBzLT5wa3Rfc3dhcHBlZDsKKyAgICAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1ZiwgYnVmX3NpemUgKiA4KTsKKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMjIpOworCisgICAgICAgIHNyYyA9ICh1aW50MzJfdCAqKShzLT5wa3Rfc3dhcHBlZCArIDQpOworCisgICAgICAgIGlmIChidWZfc2l6ZSA8IDM2KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIHNyY1tpXSA9ICgoc3JjW2ldIDw8IDE2KSB8IChzcmNbaV0gPj4gMTYpKSBeIHNyY1s3IC0gaV07CisgICAgfQorCisgICAgcmVzdWx0ID0gc3ZxMV9kZWNvZGVfZnJhbWVfaGVhZGVyKGF2Y3R4LCBjdXIpOworICAgIGlmIChyZXN1bHQgIT0gMCkgeworICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiRXJyb3IgaW4gc3ZxMV9kZWNvZGVfZnJhbWVfaGVhZGVyICVpXG4iLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHJlc3VsdCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBzLT53aWR0aCwgcy0+aGVpZ2h0KTsKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGlmICgoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiAmJiBzLT5ub25yZWYpIHx8CisgICAgICAgIChhdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfTk9OS0VZICYmCisgICAgICAgICBjdXItPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkgfHwKKyAgICAgICAgYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX0FMTCkKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworCisgICAgcmVzdWx0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgY3VyLCBzLT5ub25yZWYgPyAwIDogQVZfR0VUX0JVRkZFUl9GTEFHX1JFRik7CisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBwbXYgPSBhdl9tYWxsb2MoKEZGQUxJR04ocy0+d2lkdGgsIDE2KSAvIDggKyAzKSAqIHNpemVvZigqcG12KSk7CisgICAgaWYgKCFwbXYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBkZWNvZGUgeSwgdSBhbmQgdiBjb21wb25lbnRzICovCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBpbnQgbGluZXNpemUgPSBjdXItPmxpbmVzaXplW2ldOworICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICB3aWR0aCAgICA9IEZGQUxJR04ocy0+d2lkdGgsICAxNik7CisgICAgICAgICAgICBoZWlnaHQgICA9IEZGQUxJR04ocy0+aGVpZ2h0LCAxNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd2lkdGggICAgPSBGRkFMSUdOKHMtPndpZHRoICAvIDQsIDE2KTsKKyAgICAgICAgICAgIGhlaWdodCAgID0gRkZBTElHTihzLT5oZWlnaHQgLyA0LCAxNik7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50ID0gY3VyLT5kYXRhW2ldOworCisgICAgICAgIGlmIChjdXItPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICAgICAgLyoga2V5ZnJhbWUgKi8KKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMTYpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3ZxMV9kZWNvZGVfYmxvY2tfaW50cmEoJnMtPmdiLCAmY3VycmVudFt4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gc3ZxMV9kZWNvZGVfYmxvY2sgJWkgKGtleWZyYW1lKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VycmVudCArPSAxNiAqIGxpbmVzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZGVsdGEgZnJhbWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnByZXZpb3VzID0gcy0+cHJldi0+ZGF0YVtpXTsKKyAgICAgICAgICAgIGlmICghcHJldmlvdXMgfHwKKyAgICAgICAgICAgICAgICBzLT5wcmV2LT53aWR0aCAhPSBzLT53aWR0aCB8fCBzLT5wcmV2LT5oZWlnaHQgIT0gcy0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIHJlZmVyZW5jZSBmcmFtZS5cbiIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbXNldChwbXYsIDAsICgod2lkdGggLyA4KSArIDMpICogc2l6ZW9mKHN2cTFfcG12KSk7CisKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMTYpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3ZxMV9kZWNvZGVfZGVsdGFfYmxvY2soYXZjdHgsICZzLT5oZHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Z2IsICZjdXJyZW50W3hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cywgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtdiwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGluIHN2cTFfZGVjb2RlX2RlbHRhX2Jsb2NrICVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwbXZbMF0ueCAgICAgPQorICAgICAgICAgICAgICAgICAgICBwbXZbMF0ueSA9IDA7CisKKyAgICAgICAgICAgICAgICBjdXJyZW50ICs9IDE2ICogbGluZXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXMtPm5vbnJlZikgeworICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5wcmV2KTsKKyAgICAgICAgcmVzdWx0ID0gYXZfZnJhbWVfcmVmKHMtPnByZXYsIGN1cik7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgcmVzdWx0ICAgICA9IGJ1Zl9zaXplOworCitlcnI6CisgICAgYXZfZnJlZShwbXYpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBzdnExX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTVlExQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisgICAgaW50IG9mZnNldCA9IDA7CisKKyAgICBzLT5wcmV2ID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPnByZXYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT53aWR0aCAgICAgICAgICAgID0gYXZjdHgtPndpZHRoICArIDMgJiB+MzsKKyAgICBzLT5oZWlnaHQgICAgICAgICAgID0gYXZjdHgtPmhlaWdodCArIDMgJiB+MzsKKyAgICBhdmN0eC0+cGl4X2ZtdCAgICAgID0gQVZfUElYX0ZNVF9ZVVY0MTBQOworCisgICAgZmZfaHBlbGRzcF9pbml0KCZzLT5oZHNwLCBhdmN0eC0+ZmxhZ3MpOworCisgICAgSU5JVF9WTENfU1RBVElDKCZzdnExX2Jsb2NrX3R5cGUsIDIsIDQsCisgICAgICAgICAgICAgICAgICAgICZmZl9zdnExX2Jsb2NrX3R5cGVfdmxjWzBdWzFdLCAyLCAxLAorICAgICAgICAgICAgICAgICAgICAmZmZfc3ZxMV9ibG9ja190eXBlX3ZsY1swXVswXSwgMiwgMSwgNik7CisKKyAgICBJTklUX1ZMQ19TVEFUSUMoJnN2cTFfbW90aW9uX2NvbXBvbmVudCwgNywgMzMsCisgICAgICAgICAgICAgICAgICAgICZmZl9tdnRhYlswXVsxXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgJmZmX212dGFiWzBdWzBdLCAyLCAxLCAxNzYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBzaXplc1syXVs2XSA9IHsgeyAxNCwgMTAsIDE0LCAxOCwgMTYsIDE4IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDEwLCAxMCwgMTQsIDE0LCAxNCwgMTYgfSB9OworICAgICAgICBzdGF0aWMgVkxDX1RZUEUgdGFibGVbMTY4XVsyXTsKKyAgICAgICAgc3ZxMV9pbnRyYV9tdWx0aXN0YWdlW2ldLnRhYmxlICAgICAgICAgICA9ICZ0YWJsZVtvZmZzZXRdOworICAgICAgICBzdnExX2ludHJhX211bHRpc3RhZ2VbaV0udGFibGVfYWxsb2NhdGVkID0gc2l6ZXNbMF1baV07CisgICAgICAgIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSBzaXplc1swXVtpXTsKKyAgICAgICAgaW5pdF92bGMoJnN2cTFfaW50cmFfbXVsdGlzdGFnZVtpXSwgMywgOCwKKyAgICAgICAgICAgICAgICAgJmZmX3N2cTFfaW50cmFfbXVsdGlzdGFnZV92bGNbaV1bMF1bMV0sIDIsIDEsCisgICAgICAgICAgICAgICAgICZmZl9zdnExX2ludHJhX211bHRpc3RhZ2VfdmxjW2ldWzBdWzBdLCAyLCAxLAorICAgICAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgICAgIHN2cTFfaW50ZXJfbXVsdGlzdGFnZVtpXS50YWJsZSAgICAgICAgICAgPSAmdGFibGVbb2Zmc2V0XTsKKyAgICAgICAgc3ZxMV9pbnRlcl9tdWx0aXN0YWdlW2ldLnRhYmxlX2FsbG9jYXRlZCA9IHNpemVzWzFdW2ldOworICAgICAgICBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gc2l6ZXNbMV1baV07CisgICAgICAgIGluaXRfdmxjKCZzdnExX2ludGVyX211bHRpc3RhZ2VbaV0sIDMsIDgsCisgICAgICAgICAgICAgICAgICZmZl9zdnExX2ludGVyX211bHRpc3RhZ2VfdmxjW2ldWzBdWzFdLCAyLCAxLAorICAgICAgICAgICAgICAgICAmZmZfc3ZxMV9pbnRlcl9tdWx0aXN0YWdlX3ZsY1tpXVswXVswXSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgIH0KKworICAgIElOSVRfVkxDX1NUQVRJQygmc3ZxMV9pbnRyYV9tZWFuLCA4LCAyNTYsCisgICAgICAgICAgICAgICAgICAgICZmZl9zdnExX2ludHJhX21lYW5fdmxjWzBdWzFdLCA0LCAyLAorICAgICAgICAgICAgICAgICAgICAmZmZfc3ZxMV9pbnRyYV9tZWFuX3ZsY1swXVswXSwgNCwgMiwgNjMyKTsKKworICAgIElOSVRfVkxDX1NUQVRJQygmc3ZxMV9pbnRlcl9tZWFuLCA5LCA1MTIsCisgICAgICAgICAgICAgICAgICAgICZmZl9zdnExX2ludGVyX21lYW5fdmxjWzBdWzFdLCA0LCAyLAorICAgICAgICAgICAgICAgICAgICAmZmZfc3ZxMV9pbnRlcl9tZWFuX3ZsY1swXVswXSwgNCwgMiwgMTQzNCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHN2cTFfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU1ZRMUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+cHJldik7CisgICAgYXZfZnJlZXAoJnMtPnBrdF9zd2FwcGVkKTsKKyAgICBzLT5wa3Rfc3dhcHBlZF9hbGxvY2F0ZWQgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN2cTFfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNWUTFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX3VucmVmKHMtPnByZXYpOworfQorCitBVkNvZGVjIGZmX3N2cTFfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic3ZxMSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNvcmVuc29uIFZlY3RvciBRdWFudGl6ZXIgMSAvIFNvcmVuc29uIFZpZGVvIDEgLyBTVlExIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NWUTEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNWUTFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBzdnExX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHN2cTFfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBzdnExX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5mbHVzaCAgICAgICAgICA9IHN2cTFfZmx1c2gsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMWVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMGQ3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zdnExZW5jLmMKQEAgLTAsMCArMSw2MzggQEAKKy8qCisgKiBTVlExIEVuY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBNaWtlIE1lbGFuc29uIDxtZWxhbnNvbkBwY2lzeXMubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTb3JlbnNvbiBWZWN0b3IgUXVhbnRpemVyICMxIChTVlExKSB2aWRlbyBjb2RlYy4KKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9mIHRoZSBTVlExIGFsZ29yaXRobSwgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzLworICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaHBlbGRzcC5oIgorI2luY2x1ZGUgIm1lX2NtcC5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgImgyNjMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1wZWd1dGlscy5oIgorI2luY2x1ZGUgInN2cTEuaCIKKyNpbmNsdWRlICJzdnExZW5jLmgiCisjaW5jbHVkZSAic3ZxMWVuY19jYi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorCisKK3N0YXRpYyB2b2lkIHN2cTFfd3JpdGVfaGVhZGVyKFNWUTFFbmNDb250ZXh0ICpzLCBpbnQgZnJhbWVfdHlwZSkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIGZyYW1lIGNvZGUgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDIyLCAweDIwKTsKKworICAgIC8qIHRlbXBvcmFsIHJlZmVyZW5jZSAoc3VyZSBob3BlIHRoaXMgaXMgYSAiZG9uJ3QgY2FyZSIpICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCA4LCAweDAwKTsKKworICAgIC8qIGZyYW1lIHR5cGUgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDIsIGZyYW1lX3R5cGUgLSAxKTsKKworICAgIGlmIChmcmFtZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgIC8qIG5vIGNoZWNrc3VtIHNpbmNlIGZyYW1lIGNvZGUgaXMgMHgyMCAqLworICAgICAgICAvKiBubyBlbWJlZGRlZCBzdHJpbmcgZWl0aGVyICovCisgICAgICAgIC8qIG91dHB1dCA1IHVua25vd24gYml0cyAoMiArIDIgKyAxKSAqLworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIDIpOyAvKiAyIG5lZWRlZCBieSBxdWlja3RpbWUgZGVjb2RlciAqLworCisgICAgICAgIGkgPSBmZl9tYXRjaF8ydWludDE2KCh2b2lkKilmZl9zdnExX2ZyYW1lX3NpemVfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0FSUkFZX0VMRU1TKGZmX3N2cTFfZnJhbWVfc2l6ZV90YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lX3dpZHRoLCBzLT5mcmFtZV9oZWlnaHQpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDMsIGkpOworCisgICAgICAgIGlmIChpID09IDcpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMTIsIHMtPmZyYW1lX3dpZHRoKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMTIsIHMtPmZyYW1lX2hlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBubyBjaGVja3N1bSBvciBleHRyYSBkYXRhIChuZXh0IDIgYml0cyBnZXQgMCkgKi8KKyAgICBwdXRfYml0cygmcy0+cGIsIDIsIDApOworfQorCisjZGVmaW5lIFFVQUxJVFlfVEhSRVNIT0xEICAgIDEwMAorI2RlZmluZSBUSFJFU0hPTERfTVVMVElQTElFUiAwLjYKKworc3RhdGljIGludCBzc2RfaW50OF92c19pbnQxNl9jKGNvbnN0IGludDhfdCAqcGl4MSwgY29uc3QgaW50MTZfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBzaXplKQoreworICAgIGludCBzY29yZSA9IDAsIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICBzY29yZSArPSAocGl4MVtpXSAtIHBpeDJbaV0pICogKHBpeDFbaV0gLSBwaXgyW2ldKTsKKyAgICByZXR1cm4gc2NvcmU7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2Jsb2NrKFNWUTFFbmNDb250ZXh0ICpzLCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlY29kZWQsIGludCBzdHJpZGUsIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2hvbGQsIGludCBsYW1iZGEsIGludCBpbnRyYSkKK3sKKyAgICBpbnQgY291bnQsIHksIHgsIGksIGosIHNwbGl0LCBiZXN0X21lYW4sIGJlc3Rfc2NvcmUsIGJlc3RfY291bnQ7CisgICAgaW50IGJlc3RfdmVjdG9yWzZdOworICAgIGludCBibG9ja19zdW1bN10gPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgdyAgICAgICAgICAgID0gMiA8PCAobGV2ZWwgKyAyID4+IDEpOworICAgIGludCBoICAgICAgICAgICAgPSAyIDw8IChsZXZlbCArIDEgPj4gMSk7CisgICAgaW50IHNpemUgICAgICAgICA9IHcgKiBoOworICAgIGludDE2X3QgKCpibG9jaylbMjU2XSA9IHMtPmVuY29kZWRfYmxvY2tfbGV2ZWxzW2xldmVsXTsKKyAgICBjb25zdCBpbnQ4X3QgKmNvZGVib29rX3N1bSwgKmNvZGVib29rOworICAgIGNvbnN0IHVpbnQxNl90KCptZWFuX3ZsYylbMl07CisgICAgY29uc3QgdWludDhfdCgqbXVsdGlzdGFnZV92bGMpWzJdOworCisgICAgYmVzdF9zY29yZSA9IDA7CisgICAgLy8gRklYTUU6IE9wdGltaXplLCB0aGlzIGRvZXMgbm90IG5lZWQgdG8gYmUgZG9uZSBtdWx0aXBsZSB0aW1lcy4KKyAgICBpZiAoaW50cmEpIHsKKyAgICAgICAgY29kZWJvb2tfc3VtICAgPSBzdnExX2ludHJhX2NvZGVib29rX3N1bVtsZXZlbF07CisgICAgICAgIGNvZGVib29rICAgICAgID0gZmZfc3ZxMV9pbnRyYV9jb2RlYm9va3NbbGV2ZWxdOworICAgICAgICBtZWFuX3ZsYyAgICAgICA9IGZmX3N2cTFfaW50cmFfbWVhbl92bGM7CisgICAgICAgIG11bHRpc3RhZ2VfdmxjID0gZmZfc3ZxMV9pbnRyYV9tdWx0aXN0YWdlX3ZsY1tsZXZlbF07CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IHNyY1t4ICsgeSAqIHN0cmlkZV07CisgICAgICAgICAgICAgICAgYmxvY2tbMF1beCArIHcgKiB5XSA9IHY7CisgICAgICAgICAgICAgICAgYmVzdF9zY29yZSAgICAgICAgICs9IHYgKiB2OworICAgICAgICAgICAgICAgIGJsb2NrX3N1bVswXSAgICAgICArPSB2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZWJvb2tfc3VtICAgPSBzdnExX2ludGVyX2NvZGVib29rX3N1bVtsZXZlbF07CisgICAgICAgIGNvZGVib29rICAgICAgID0gZmZfc3ZxMV9pbnRlcl9jb2RlYm9va3NbbGV2ZWxdOworICAgICAgICBtZWFuX3ZsYyAgICAgICA9IGZmX3N2cTFfaW50ZXJfbWVhbl92bGMgKyAyNTY7CisgICAgICAgIG11bHRpc3RhZ2VfdmxjID0gZmZfc3ZxMV9pbnRlcl9tdWx0aXN0YWdlX3ZsY1tsZXZlbF07CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IHNyY1t4ICsgeSAqIHN0cmlkZV0gLSByZWZbeCArIHkgKiBzdHJpZGVdOworICAgICAgICAgICAgICAgIGJsb2NrWzBdW3ggKyB3ICogeV0gPSB2OworICAgICAgICAgICAgICAgIGJlc3Rfc2NvcmUgICAgICAgICArPSB2ICogdjsKKyAgICAgICAgICAgICAgICBibG9ja19zdW1bMF0gICAgICAgKz0gdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJlc3RfY291bnQgID0gMDsKKyAgICBiZXN0X3Njb3JlIC09IChpbnQpKCh1bnNpZ25lZClibG9ja19zdW1bMF0gKiBibG9ja19zdW1bMF0gPj4gKGxldmVsICsgMykpOworICAgIGJlc3RfbWVhbiAgID0gYmxvY2tfc3VtWzBdICsgKHNpemUgPj4gMSkgPj4gKGxldmVsICsgMyk7CisKKyAgICBpZiAobGV2ZWwgPCA0KSB7CisgICAgICAgIGZvciAoY291bnQgPSAxOyBjb3VudCA8IDc7IGNvdW50KyspIHsKKyAgICAgICAgICAgIGludCBiZXN0X3ZlY3Rvcl9zY29yZSA9IElOVF9NQVg7CisgICAgICAgICAgICBpbnQgYmVzdF92ZWN0b3Jfc3VtICAgPSAtOTk5LCBiZXN0X3ZlY3Rvcl9tZWFuID0gLTk5OTsKKyAgICAgICAgICAgIGNvbnN0IGludCBzdGFnZSAgICAgICA9IGNvdW50IC0gMTsKKyAgICAgICAgICAgIGNvbnN0IGludDhfdCAqdmVjdG9yOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBzdW0gPSBjb2RlYm9va19zdW1bc3RhZ2UgKiAxNiArIGldOworICAgICAgICAgICAgICAgIGludCBzcXIsIGRpZmYsIHNjb3JlOworCisgICAgICAgICAgICAgICAgdmVjdG9yID0gY29kZWJvb2sgKyBzdGFnZSAqIHNpemUgKiAxNiArIGkgKiBzaXplOworICAgICAgICAgICAgICAgIHNxciAgICA9IHMtPnNzZF9pbnQ4X3ZzX2ludDE2KHZlY3RvciwgYmxvY2tbc3RhZ2VdLCBzaXplKTsKKyAgICAgICAgICAgICAgICBkaWZmICAgPSBibG9ja19zdW1bc3RhZ2VdIC0gc3VtOworICAgICAgICAgICAgICAgIHNjb3JlICA9IHNxciAtIChkaWZmICogKGludDY0X3QpZGlmZiA+PiAobGV2ZWwgKyAzKSk7IC8vIEZJWE1FOiA2NGJpdCBzbG9vb3cKKyAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPCBiZXN0X3ZlY3Rvcl9zY29yZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbWVhbiA9IGRpZmYgKyAoc2l6ZSA+PiAxKSA+PiAobGV2ZWwgKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihtZWFuID4gLTMwMCAmJiBtZWFuIDwgMzAwKTsKKyAgICAgICAgICAgICAgICAgICAgbWVhbiAgICAgICAgICAgICAgID0gYXZfY2xpcChtZWFuLCBpbnRyYSA/IDAgOiAtMjU2LCAyNTUpOworICAgICAgICAgICAgICAgICAgICBiZXN0X3ZlY3Rvcl9zY29yZSAgPSBzY29yZTsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF92ZWN0b3Jbc3RhZ2VdID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF92ZWN0b3Jfc3VtICAgID0gc3VtOworICAgICAgICAgICAgICAgICAgICBiZXN0X3ZlY3Rvcl9tZWFuICAgPSBtZWFuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2Fzc2VydDAoYmVzdF92ZWN0b3JfbWVhbiAhPSAtOTk5KTsKKyAgICAgICAgICAgIHZlY3RvciA9IGNvZGVib29rICsgc3RhZ2UgKiBzaXplICogMTYgKyBiZXN0X3ZlY3RvcltzdGFnZV0gKiBzaXplOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykKKyAgICAgICAgICAgICAgICBibG9ja1tzdGFnZSArIDFdW2pdID0gYmxvY2tbc3RhZ2VdW2pdIC0gdmVjdG9yW2pdOworICAgICAgICAgICAgYmxvY2tfc3VtW3N0YWdlICsgMV0gPSBibG9ja19zdW1bc3RhZ2VdIC0gYmVzdF92ZWN0b3Jfc3VtOworICAgICAgICAgICAgYmVzdF92ZWN0b3Jfc2NvcmUgICArPSBsYW1iZGEgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKzEgKyA0ICogY291bnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlzdGFnZV92bGNbMSArIGNvdW50XVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtZWFuX3ZsY1tiZXN0X3ZlY3Rvcl9tZWFuXVsxXSk7CisKKyAgICAgICAgICAgIGlmIChiZXN0X3ZlY3Rvcl9zY29yZSA8IGJlc3Rfc2NvcmUpIHsKKyAgICAgICAgICAgICAgICBiZXN0X3Njb3JlID0gYmVzdF92ZWN0b3Jfc2NvcmU7CisgICAgICAgICAgICAgICAgYmVzdF9jb3VudCA9IGNvdW50OworICAgICAgICAgICAgICAgIGJlc3RfbWVhbiAgPSBiZXN0X3ZlY3Rvcl9tZWFuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3BsaXQgPSAwOworICAgIGlmIChiZXN0X3Njb3JlID4gdGhyZXNob2xkICYmIGxldmVsKSB7CisgICAgICAgIGludCBzY29yZSAgPSAwOworICAgICAgICBpbnQgb2Zmc2V0ID0gbGV2ZWwgJiAxID8gc3RyaWRlICogaCAvIDIgOiB3IC8gMjsKKyAgICAgICAgUHV0Qml0Q29udGV4dCBiYWNrdXBbNl07CisKKyAgICAgICAgZm9yIChpID0gbGV2ZWwgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIGJhY2t1cFtpXSA9IHMtPnJlb3JkZXJfcGJbaV07CisgICAgICAgIHNjb3JlICs9IGVuY29kZV9ibG9jayhzLCBzcmMsIHJlZiwgZGVjb2RlZCwgc3RyaWRlLCBsZXZlbCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPj4gMSwgbGFtYmRhLCBpbnRyYSk7CisgICAgICAgIHNjb3JlICs9IGVuY29kZV9ibG9jayhzLCBzcmMgKyBvZmZzZXQsIHJlZiArIG9mZnNldCwgZGVjb2RlZCArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgbGV2ZWwgLSAxLCB0aHJlc2hvbGQgPj4gMSwgbGFtYmRhLCBpbnRyYSk7CisgICAgICAgIHNjb3JlICs9IGxhbWJkYTsKKworICAgICAgICBpZiAoc2NvcmUgPCBiZXN0X3Njb3JlKSB7CisgICAgICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7CisgICAgICAgICAgICBzcGxpdCAgICAgID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IGxldmVsIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgcy0+cmVvcmRlcl9wYltpXSA9IGJhY2t1cFtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobGV2ZWwgPiAwKQorICAgICAgICBwdXRfYml0cygmcy0+cmVvcmRlcl9wYltsZXZlbF0sIDEsIHNwbGl0KTsKKworICAgIGlmICghc3BsaXQpIHsKKyAgICAgICAgYXZfYXNzZXJ0MShiZXN0X21lYW4gPj0gMCAmJiBiZXN0X21lYW4gPCAyNTYgfHwgIWludHJhKTsKKyAgICAgICAgYXZfYXNzZXJ0MShiZXN0X21lYW4gPj0gLTI1NiAmJiBiZXN0X21lYW4gPCAyNTYpOworICAgICAgICBhdl9hc3NlcnQxKGJlc3RfY291bnQgPj0gMCAmJiBiZXN0X2NvdW50IDwgNyk7CisgICAgICAgIGF2X2Fzc2VydDEobGV2ZWwgPCA0IHx8IGJlc3RfY291bnQgPT0gMCk7CisKKyAgICAgICAgLyogb3V0cHV0IHRoZSBlbmNvZGluZyAqLworICAgICAgICBwdXRfYml0cygmcy0+cmVvcmRlcl9wYltsZXZlbF0sCisgICAgICAgICAgICAgICAgIG11bHRpc3RhZ2VfdmxjWzEgKyBiZXN0X2NvdW50XVsxXSwKKyAgICAgICAgICAgICAgICAgbXVsdGlzdGFnZV92bGNbMSArIGJlc3RfY291bnRdWzBdKTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnJlb3JkZXJfcGJbbGV2ZWxdLCBtZWFuX3ZsY1tiZXN0X21lYW5dWzFdLAorICAgICAgICAgICAgICAgICBtZWFuX3ZsY1tiZXN0X21lYW5dWzBdKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmVzdF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBhdl9hc3NlcnQyKGJlc3RfdmVjdG9yW2ldID49IDAgJiYgYmVzdF92ZWN0b3JbaV0gPCAxNik7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cmVvcmRlcl9wYltsZXZlbF0sIDQsIGJlc3RfdmVjdG9yW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgICAgIGRlY29kZWRbeCArIHkgKiBzdHJpZGVdID0gc3JjW3ggKyB5ICogc3RyaWRlXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1tiZXN0X2NvdW50XVt4ICsgdyAqIHldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfbWVhbjsKKyAgICB9CisKKyAgICByZXR1cm4gYmVzdF9zY29yZTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9ibG9ja19pbmRleChNcGVnRW5jQ29udGV4dCAqcyl7CisgICAgcy0+YmxvY2tfaW5kZXhbMF09IHMtPmI4X3N0cmlkZSoocy0+bWJfeSoyICAgICkgICAgICsgcy0+bWJfeCoyOworICAgIHMtPmJsb2NrX2luZGV4WzFdPSBzLT5iOF9zdHJpZGUqKHMtPm1iX3kqMiAgICApICsgMSArIHMtPm1iX3gqMjsKKyAgICBzLT5ibG9ja19pbmRleFsyXT0gcy0+Yjhfc3RyaWRlKihzLT5tYl95KjIgKyAxKSAgICAgKyBzLT5tYl94KjI7CisgICAgcy0+YmxvY2tfaW5kZXhbM109IHMtPmI4X3N0cmlkZSoocy0+bWJfeSoyICsgMSkgKyAxICsgcy0+bWJfeCoyOworICAgIHMtPmJsb2NrX2luZGV4WzRdPSBzLT5tYl9zdHJpZGUqKHMtPm1iX3kgKyAxKSAgICAgICAgICAgICAgICArIHMtPmI4X3N0cmlkZSpzLT5tYl9oZWlnaHQqMiArIHMtPm1iX3g7CisgICAgcy0+YmxvY2tfaW5kZXhbNV09IHMtPm1iX3N0cmlkZSoocy0+bWJfeSArIHMtPm1iX2hlaWdodCArIDIpICsgcy0+Yjhfc3RyaWRlKnMtPm1iX2hlaWdodCoyICsgcy0+bWJfeDsKK30KKworc3RhdGljIGludCBzdnExX2VuY29kZV9wbGFuZShTVlExRW5jQ29udGV4dCAqcywgaW50IHBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzcmNfcGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnJlZl9wbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGVjb2RlZF9wbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3JjX3N0cmlkZSwgaW50IHN0cmlkZSkKK3sKKyAgICBjb25zdCBBVkZyYW1lICpmID0gcy0+YXZjdHgtPmNvZGVkX2ZyYW1lOworICAgIGludCB4LCB5OworICAgIGludCBpOworICAgIGludCBibG9ja193aWR0aCwgYmxvY2tfaGVpZ2h0OworICAgIGludCBsZXZlbDsKKyAgICBpbnQgdGhyZXNob2xkWzZdOworICAgIHVpbnQ4X3QgKnNyYyAgICAgPSBzLT5zY3JhdGNoYnVmICsgc3RyaWRlICogMzI7CisgICAgY29uc3QgaW50IGxhbWJkYSA9IChmLT5xdWFsaXR5ICogZi0+cXVhbGl0eSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgKDIgKiBGRl9MQU1CREFfU0hJRlQpOworCisgICAgLyogZmlndXJlIG91dCB0aGUgYWNjZXB0YWJsZSBsZXZlbCB0aHJlc2hvbGRzIGluIGFkdmFuY2UgKi8KKyAgICB0aHJlc2hvbGRbNV0gPSBRVUFMSVRZX1RIUkVTSE9MRDsKKyAgICBmb3IgKGxldmVsID0gNDsgbGV2ZWwgPj0gMDsgbGV2ZWwtLSkKKyAgICAgICAgdGhyZXNob2xkW2xldmVsXSA9IHRocmVzaG9sZFtsZXZlbCArIDFdICogVEhSRVNIT0xEX01VTFRJUExJRVI7CisKKyAgICBibG9ja193aWR0aCAgPSAod2lkdGggICsgMTUpIC8gMTY7CisgICAgYmxvY2tfaGVpZ2h0ID0gKGhlaWdodCArIDE1KSAvIDE2OworCisgICAgaWYgKGYtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkgeworICAgICAgICBzLT5tLmF2Y3R4ICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+YXZjdHg7CisgICAgICAgIHMtPm0uY3VycmVudF9waWN0dXJlX3B0ciAgICAgICAgICAgPSAmcy0+bS5jdXJyZW50X3BpY3R1cmU7CisgICAgICAgIHMtPm0ubGFzdF9waWN0dXJlX3B0ciAgICAgICAgICAgICAgPSAmcy0+bS5sYXN0X3BpY3R1cmU7CisgICAgICAgIHMtPm0ubGFzdF9waWN0dXJlLmYtPmRhdGFbMF0gICAgICAgID0gcmVmX3BsYW5lOworICAgICAgICBzLT5tLmxpbmVzaXplICAgICAgICAgICAgICAgICAgICAgID0KKyAgICAgICAgcy0+bS5sYXN0X3BpY3R1cmUuZi0+bGluZXNpemVbMF0gICAgPQorICAgICAgICBzLT5tLm5ld19waWN0dXJlLmYtPmxpbmVzaXplWzBdICAgICA9CisgICAgICAgIHMtPm0uY3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWzBdID0gc3RyaWRlOworICAgICAgICBzLT5tLndpZHRoICAgICAgICAgICAgICAgICAgICAgICAgID0gd2lkdGg7CisgICAgICAgIHMtPm0uaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgPSBoZWlnaHQ7CisgICAgICAgIHMtPm0ubWJfd2lkdGggICAgICAgICAgICAgICAgICAgICAgPSBibG9ja193aWR0aDsKKyAgICAgICAgcy0+bS5tYl9oZWlnaHQgICAgICAgICAgICAgICAgICAgICA9IGJsb2NrX2hlaWdodDsKKyAgICAgICAgcy0+bS5tYl9zdHJpZGUgICAgICAgICAgICAgICAgICAgICA9IHMtPm0ubWJfd2lkdGggKyAxOworICAgICAgICBzLT5tLmI4X3N0cmlkZSAgICAgICAgICAgICAgICAgICAgID0gMiAqIHMtPm0ubWJfd2lkdGggKyAxOworICAgICAgICBzLT5tLmZfY29kZSAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKKyAgICAgICAgcy0+bS5waWN0X3R5cGUgICAgICAgICAgICAgICAgICAgICA9IGYtPnBpY3RfdHlwZTsKKyAgICAgICAgcy0+bS5tZV9tZXRob2QgICAgICAgICAgICAgICAgICAgICA9IHMtPmF2Y3R4LT5tZV9tZXRob2Q7CisgICAgICAgIHMtPm0ubWUuc2NlbmVfY2hhbmdlX3Njb3JlICAgICAgICAgPSAwOworICAgICAgICBzLT5tLmZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+YXZjdHgtPmZsYWdzOworICAgICAgICAvLyBzLT5tLm91dF9mb3JtYXQgICAgICAgICAgICAgICAgICAgID0gRk1UX0gyNjM7CisgICAgICAgIC8vIHMtPm0udW5yZXN0cmljdGVkX212ICAgICAgICAgICAgICAgPSAxOworICAgICAgICBzLT5tLmxhbWJkYSAgICAgICAgICAgICAgICAgICAgICAgID0gZi0+cXVhbGl0eTsKKyAgICAgICAgcy0+bS5xc2NhbGUgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPm0ubGFtYmRhICogMTM5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0xBTUJEQV9TQ0FMRSAqIDY0ID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9MQU1CREFfU0hJRlQgKyA3OworICAgICAgICBzLT5tLmxhbWJkYTIgICAgICAgICAgICAgICAgICAgICAgID0gcy0+bS5sYW1iZGEgKiBzLT5tLmxhbWJkYSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9MQU1CREFfU0NBTEUgLyAyID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9MQU1CREFfU0hJRlQ7CisKKyAgICAgICAgaWYgKCFzLT5tb3Rpb25fdmFsOFtwbGFuZV0pIHsKKyAgICAgICAgICAgIHMtPm1vdGlvbl92YWw4W3BsYW5lXSAgPSBhdl9tYWxsb2N6KChzLT5tLmI4X3N0cmlkZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaGVpZ2h0ICogMiArIDIpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgcy0+bW90aW9uX3ZhbDE2W3BsYW5lXSA9IGF2X21hbGxvY3ooKHMtPm0ubWJfc3RyaWRlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2tfaGVpZ2h0ICsgMikgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPm0ubWJfdHlwZSA9IHMtPm1iX3R5cGU7CisKKyAgICAgICAgLy8gZHVtbWllcywgdG8gYXZvaWQgc2VnZmF1bHRzCisgICAgICAgIHMtPm0uY3VycmVudF9waWN0dXJlLm1iX21lYW4gICA9ICh1aW50OF90ICopcy0+ZHVtbXk7CisgICAgICAgIHMtPm0uY3VycmVudF9waWN0dXJlLm1iX3ZhciAgICA9ICh1aW50MTZfdCAqKXMtPmR1bW15OworICAgICAgICBzLT5tLmN1cnJlbnRfcGljdHVyZS5tY19tYl92YXIgPSAodWludDE2X3QgKilzLT5kdW1teTsKKyAgICAgICAgcy0+bS5jdXJyZW50X3BpY3R1cmUubWJfdHlwZSA9IHMtPmR1bW15OworCisgICAgICAgIHMtPm0uY3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF0gICA9IHMtPm1vdGlvbl92YWw4W3BsYW5lXSArIDI7CisgICAgICAgIHMtPm0ucF9tdl90YWJsZSAgICAgICAgICAgICAgICAgICAgICA9IHMtPm1vdGlvbl92YWwxNltwbGFuZV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tLm1iX3N0cmlkZSArIDE7CisgICAgICAgIHMtPm0ubWVjYyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPm1lY2M7IC8vIG1vdmUKKyAgICAgICAgZmZfaW5pdF9tZSgmcy0+bSk7CisKKyAgICAgICAgcy0+bS5tZS5kaWFfc2l6ZSAgICAgID0gcy0+YXZjdHgtPmRpYV9zaXplOworICAgICAgICBzLT5tLmZpcnN0X3NsaWNlX2xpbmUgPSAxOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYmxvY2tfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIHMtPm0ubmV3X3BpY3R1cmUuZi0+ZGF0YVswXSA9IHNyYyAtIHkgKiAxNiAqIHN0cmlkZTsgLy8gdWdseQorICAgICAgICAgICAgcy0+bS5tYl95ICAgICAgICAgICAgICAgICAgPSB5OworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTYgJiYgaSArIDE2ICogeSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZzcmNbaSAqIHN0cmlkZV0sICZzcmNfcGxhbmVbKGkgKyAxNiAqIHkpICogc3JjX3N0cmlkZV0sCisgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSB3aWR0aDsgeCA8IDE2ICogYmxvY2tfd2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgc3JjW2kgKiBzdHJpZGUgKyB4XSA9IHNyY1tpICogc3RyaWRlICsgeCAtIDFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICg7IGkgPCAxNiAmJiBpICsgMTYgKiB5IDwgMTYgKiBibG9ja19oZWlnaHQ7IGkrKykKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnNyY1tpICogc3RyaWRlXSwgJnNyY1soaSAtIDEpICogc3RyaWRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgMTYgKiBibG9ja193aWR0aCk7CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBibG9ja193aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgcy0+bS5tYl94ID0geDsKKyAgICAgICAgICAgICAgICBpbml0X2Jsb2NrX2luZGV4KCZzLT5tKTsKKworICAgICAgICAgICAgICAgIGZmX2VzdGltYXRlX3BfZnJhbWVfbW90aW9uKCZzLT5tLCB4LCB5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPm0uZmlyc3Rfc2xpY2VfbGluZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBmZl9maXhfbG9uZ19wX212cygmcy0+bSk7CisgICAgICAgIGZmX2ZpeF9sb25nX212cygmcy0+bSwgTlVMTCwgMCwgcy0+bS5wX212X3RhYmxlLCBzLT5tLmZfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTkRJREFURV9NQl9UWVBFX0lOVEVSLCAwKTsKKyAgICB9CisKKyAgICBzLT5tLmZpcnN0X3NsaWNlX2xpbmUgPSAxOworICAgIGZvciAoeSA9IDA7IHkgPCBibG9ja19oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTYgJiYgaSArIDE2ICogeSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBtZW1jcHkoJnNyY1tpICogc3RyaWRlXSwgJnNyY19wbGFuZVsoaSArIDE2ICogeSkgKiBzcmNfc3RyaWRlXSwKKyAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICAgICAgICBmb3IgKHggPSB3aWR0aDsgeCA8IDE2ICogYmxvY2tfd2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICBzcmNbaSAqIHN0cmlkZSArIHhdID0gc3JjW2kgKiBzdHJpZGUgKyB4IC0gMV07CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IGkgPCAxNiAmJiBpICsgMTYgKiB5IDwgMTYgKiBibG9ja19oZWlnaHQ7IGkrKykKKyAgICAgICAgICAgIG1lbWNweSgmc3JjW2kgKiBzdHJpZGVdLCAmc3JjWyhpIC0gMSkgKiBzdHJpZGVdLCAxNiAqIGJsb2NrX3dpZHRoKTsKKworICAgICAgICBzLT5tLm1iX3kgPSB5OworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYmxvY2tfd2lkdGg7IHgrKykgeworICAgICAgICAgICAgdWludDhfdCByZW9yZGVyX2J1ZmZlclsyXVs2XVs3ICogMzJdOworICAgICAgICAgICAgaW50IGNvdW50WzJdWzZdOworICAgICAgICAgICAgaW50IG9mZnNldCAgICAgICA9IHkgKiAxNiAqIHN0cmlkZSArIHggKiAxNjsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRlY29kZWQgPSBkZWNvZGVkX3BsYW5lICsgb2Zmc2V0OworICAgICAgICAgICAgdWludDhfdCAqcmVmICAgICA9IHJlZl9wbGFuZSArIG9mZnNldDsKKyAgICAgICAgICAgIGludCBzY29yZVs0XSAgICAgPSB7IDAsIDAsIDAsIDAgfSwgYmVzdDsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnRlbXAgICAgPSBzLT5zY3JhdGNoYnVmOworCisgICAgICAgICAgICBpZiAocy0+cGIuYnVmX2VuZCAtIHMtPnBiLmJ1ZiAtCisgICAgICAgICAgICAgICAgKHB1dF9iaXRzX2NvdW50KCZzLT5wYikgPj4gMykgPCAzMDAwKSB7IC8vIEZJWE1FOiBjaGVjayBzaXplCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlbmNvZGVkIGZyYW1lIHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5tLm1iX3ggPSB4OworICAgICAgICAgICAgaW5pdF9ibG9ja19pbmRleCgmcy0+bSk7CisKKyAgICAgICAgICAgIGlmIChmLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgfHwKKyAgICAgICAgICAgICAgICAocy0+bS5tYl90eXBlW3ggKyB5ICogcy0+bS5tYl9zdHJpZGVdICYKKyAgICAgICAgICAgICAgICAgQ0FORElEQVRFX01CX1RZUEVfSU5UUkEpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaW5pdF9wdXRfYml0cygmcy0+cmVvcmRlcl9wYltpXSwgcmVvcmRlcl9idWZmZXJbMF1baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAqIDMyKTsKKyAgICAgICAgICAgICAgICBpZiAoZi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZsYyA9IGZmX3N2cTFfYmxvY2tfdHlwZV92bGNbU1ZRMV9CTE9DS19JTlRSQV07CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5yZW9yZGVyX3BiWzVdLCB2bGNbMV0sIHZsY1swXSk7CisgICAgICAgICAgICAgICAgICAgIHNjb3JlWzBdID0gdmxjWzFdICogbGFtYmRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY29yZVswXSArPSBlbmNvZGVfYmxvY2socywgc3JjICsgMTYgKiB4LCBOVUxMLCB0ZW1wLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDY0LCBsYW1iZGEsIDEpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnRbMF1baV0gPSBwdXRfYml0c19jb3VudCgmcy0+cmVvcmRlcl9wYltpXSk7CisgICAgICAgICAgICAgICAgICAgIGZsdXNoX3B1dF9iaXRzKCZzLT5yZW9yZGVyX3BiW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBzY29yZVswXSA9IElOVF9NQVg7CisKKyAgICAgICAgICAgIGJlc3QgPSAwOworCisgICAgICAgICAgICBpZiAoZi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdmxjID0gZmZfc3ZxMV9ibG9ja190eXBlX3ZsY1tTVlExX0JMT0NLX0lOVEVSXTsKKyAgICAgICAgICAgICAgICBpbnQgbXgsIG15LCBwcmVkX3gsIHByZWRfeSwgZHh5OworICAgICAgICAgICAgICAgIGludDE2X3QgKm1vdGlvbl9wdHI7CisKKyAgICAgICAgICAgICAgICBtb3Rpb25fcHRyID0gZmZfaDI2M19wcmVkX21vdGlvbigmcy0+bSwgMCwgMCwgJnByZWRfeCwgJnByZWRfeSk7CisgICAgICAgICAgICAgICAgaWYgKHMtPm0ubWJfdHlwZVt4ICsgeSAqIHMtPm0ubWJfc3RyaWRlXSAmCisgICAgICAgICAgICAgICAgICAgIENBTkRJREFURV9NQl9UWVBFX0lOVEVSKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3B1dF9iaXRzKCZzLT5yZW9yZGVyX3BiW2ldLCByZW9yZGVyX2J1ZmZlclsxXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAqIDMyKTsKKworICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cmVvcmRlcl9wYls1XSwgdmxjWzFdLCB2bGNbMF0pOworCisgICAgICAgICAgICAgICAgICAgIHMtPm0ucGIgPSBzLT5yZW9yZGVyX3BiWzVdOworICAgICAgICAgICAgICAgICAgICBteCAgICAgID0gbW90aW9uX3B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgbXkgICAgICA9IG1vdGlvbl9wdHJbMV07CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDEobXggICAgID49IC0zMiAmJiBteCAgICAgPD0gMzEpOworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQxKG15ICAgICA+PSAtMzIgJiYgbXkgICAgIDw9IDMxKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MShwcmVkX3ggPj0gLTMyICYmIHByZWRfeCA8PSAzMSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDEocHJlZF95ID49IC0zMiAmJiBwcmVkX3kgPD0gMzEpOworICAgICAgICAgICAgICAgICAgICBmZl9oMjYzX2VuY29kZV9tb3Rpb24oJnMtPm0sIG14IC0gcHJlZF94LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgZmZfaDI2M19lbmNvZGVfbW90aW9uKCZzLT5tLCBteSAtIHByZWRfeSwgMSk7CisgICAgICAgICAgICAgICAgICAgIHMtPnJlb3JkZXJfcGJbNV0gPSBzLT5tLnBiOworICAgICAgICAgICAgICAgICAgICBzY29yZVsxXSAgICAgICAgKz0gbGFtYmRhICogcHV0X2JpdHNfY291bnQoJnMtPnJlb3JkZXJfcGJbNV0pOworCisgICAgICAgICAgICAgICAgICAgIGR4eSA9IChteCAmIDEpICsgMiAqIChteSAmIDEpOworCisgICAgICAgICAgICAgICAgICAgIHMtPmhkc3AucHV0X3BpeGVsc190YWJbMF1bZHh5XSh0ZW1wICsgMTYqc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmICsgKG14ID4+IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSAqIChteSA+PiAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgMTYpOworCisgICAgICAgICAgICAgICAgICAgIHNjb3JlWzFdICs9IGVuY29kZV9ibG9jayhzLCBzcmMgKyAxNiAqIHgsIHRlbXAgKyAxNipzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzdHJpZGUsIDUsIDY0LCBsYW1iZGEsIDApOworICAgICAgICAgICAgICAgICAgICBiZXN0ICAgICAgPSBzY29yZVsxXSA8PSBzY29yZVswXTsKKworICAgICAgICAgICAgICAgICAgICB2bGMgICAgICAgPSBmZl9zdnExX2Jsb2NrX3R5cGVfdmxjW1NWUTFfQkxPQ0tfU0tJUF07CisgICAgICAgICAgICAgICAgICAgIHNjb3JlWzJdICA9IHMtPm1lY2Muc3NlWzBdKE5VTEwsIHNyYyArIDE2ICogeCwgcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgc2NvcmVbMl0gKz0gdmxjWzFdICogbGFtYmRhOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcmVbMl0gPCBzY29yZVtiZXN0XSAmJiBteCA9PSAwICYmIG15ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYlswXVswXShkZWNvZGVkLCByZWYsIHN0cmlkZSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCB2bGNbMV0sIHZsY1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYmVzdCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50WzFdW2ldID0gcHV0X2JpdHNfY291bnQoJnMtPnJlb3JkZXJfcGJbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hfcHV0X2JpdHMoJnMtPnJlb3JkZXJfcGJbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3B0clswXSAgICAgICAgICAgICAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgIG1vdGlvbl9wdHJbMV0gICAgICAgICAgICAgICAgICAgICAgPQorICAgICAgICAgICAgICAgICAgICBtb3Rpb25fcHRyWzJdICAgICAgICAgICAgICAgICAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3B0clszXSAgICAgICAgICAgICAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgIG1vdGlvbl9wdHJbMCArIDIgKiBzLT5tLmI4X3N0cmlkZV0gPQorICAgICAgICAgICAgICAgICAgICBtb3Rpb25fcHRyWzEgKyAyICogcy0+bS5iOF9zdHJpZGVdID0KKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3B0clsyICsgMiAqIHMtPm0uYjhfc3RyaWRlXSA9CisgICAgICAgICAgICAgICAgICAgIG1vdGlvbl9wdHJbMyArIDIgKiBzLT5tLmI4X3N0cmlkZV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+cmRfdG90YWwgKz0gc2NvcmVbYmVzdF07CisKKyAgICAgICAgICAgIGlmIChiZXN0ICE9IDIpCisgICAgICAgICAgICBmb3IgKGkgPSA1OyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICBhdnByaXZfY29weV9iaXRzKCZzLT5wYiwgcmVvcmRlcl9idWZmZXJbYmVzdF1baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudFtiZXN0XVtpXSk7CisgICAgICAgICAgICBpZiAoYmVzdCA9PSAwKQorICAgICAgICAgICAgICAgIHMtPmhkc3AucHV0X3BpeGVsc190YWJbMF1bMF0oZGVjb2RlZCwgdGVtcCwgc3RyaWRlLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgcy0+bS5maXJzdF9zbGljZV9saW5lID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBzdnExX2VuY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNWUTFFbmNDb250ZXh0ICpjb25zdCBzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUkQ6ICVmXG4iLAorICAgICAgICAgICBzLT5yZF90b3RhbCAvIChkb3VibGUpKGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5mcmFtZV9udW1iZXIpKTsKKworICAgIHMtPm0ubWJfdHlwZSA9IE5VTEw7CisgICAgZmZfbXB2X2NvbW1vbl9lbmQoJnMtPm0pOworCisgICAgYXZfZnJlZXAoJnMtPm0ubWUuc2NyYXRjaHBhZCk7CisgICAgYXZfZnJlZXAoJnMtPm0ubWUubWFwKTsKKyAgICBhdl9mcmVlcCgmcy0+bS5tZS5zY29yZV9tYXApOworICAgIGF2X2ZyZWVwKCZzLT5tYl90eXBlKTsKKyAgICBhdl9mcmVlcCgmcy0+ZHVtbXkpOworICAgIGF2X2ZyZWVwKCZzLT5zY3JhdGNoYnVmKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJnMtPm1vdGlvbl92YWw4W2ldKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPm1vdGlvbl92YWwxNltpXSk7CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+Y3VycmVudF9waWN0dXJlKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5sYXN0X3BpY3R1cmUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHN2cTFfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNWUTFFbmNDb250ZXh0ICpjb25zdCBzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgZmZfaHBlbGRzcF9pbml0KCZzLT5oZHNwLCBhdmN0eC0+ZmxhZ3MpOworICAgIGZmX21lX2NtcF9pbml0KCZzLT5tZWNjLCBhdmN0eCk7CisgICAgZmZfbXBlZ3ZpZGVvZW5jZHNwX2luaXQoJnMtPm0ubXB2ZW5jZHNwLCBhdmN0eCk7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIHMtPmN1cnJlbnRfcGljdHVyZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgcy0+bGFzdF9waWN0dXJlICAgID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWF2Y3R4LT5jb2RlZF9mcmFtZSB8fCAhcy0+Y3VycmVudF9waWN0dXJlIHx8ICFzLT5sYXN0X3BpY3R1cmUpIHsKKyAgICAgICAgc3ZxMV9lbmNvZGVfZW5kKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBzLT5mcmFtZV93aWR0aCAgPSBhdmN0eC0+d2lkdGg7CisgICAgcy0+ZnJhbWVfaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKworICAgIHMtPnlfYmxvY2tfd2lkdGggID0gKHMtPmZyYW1lX3dpZHRoICArIDE1KSAvIDE2OworICAgIHMtPnlfYmxvY2tfaGVpZ2h0ID0gKHMtPmZyYW1lX2hlaWdodCArIDE1KSAvIDE2OworCisgICAgcy0+Y19ibG9ja193aWR0aCAgPSAocy0+ZnJhbWVfd2lkdGggIC8gNCArIDE1KSAvIDE2OworICAgIHMtPmNfYmxvY2tfaGVpZ2h0ID0gKHMtPmZyYW1lX2hlaWdodCAvIDQgKyAxNSkgLyAxNjsKKworICAgIHMtPmF2Y3R4ICAgICAgICAgICAgICAgPSBhdmN0eDsKKyAgICBzLT5tLmF2Y3R4ICAgICAgICAgICAgID0gYXZjdHg7CisKKyAgICBpZiAoKHJldCA9IGZmX21wdl9jb21tb25faW5pdCgmcy0+bSkpIDwgMCkgeworICAgICAgICBzdnExX2VuY29kZV9lbmQoYXZjdHgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHMtPm0ucGljdHVyZV9zdHJ1Y3R1cmUgPSBQSUNUX0ZSQU1FOworICAgIHMtPm0ubWUudGVtcCAgICAgICAgICAgPQorICAgIHMtPm0ubWUuc2NyYXRjaHBhZCAgICAgPSBhdl9tYWxsb2N6KChhdmN0eC0+d2lkdGggKyA2NCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiAxNiAqIDIgKiBzaXplb2YodWludDhfdCkpOworICAgIHMtPm0ubWUubWFwICAgICAgICAgICAgPSBhdl9tYWxsb2N6KE1FX01BUF9TSVpFICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgcy0+bS5tZS5zY29yZV9tYXAgICAgICA9IGF2X21hbGxvY3ooTUVfTUFQX1NJWkUgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICBzLT5tYl90eXBlICAgICAgICAgICAgID0gYXZfbWFsbG9jeigocy0+eV9ibG9ja193aWR0aCArIDEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT55X2Jsb2NrX2hlaWdodCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgcy0+ZHVtbXkgICAgICAgICAgICAgICA9IGF2X21hbGxvY3ooKHMtPnlfYmxvY2tfd2lkdGggKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+eV9ibG9ja19oZWlnaHQgKiBzaXplb2YoaW50MzJfdCkpOworICAgIHMtPnNzZF9pbnQ4X3ZzX2ludDE2ICAgPSBzc2RfaW50OF92c19pbnQxNl9jOworCisgICAgaWYgKEFSQ0hfUFBDKQorICAgICAgICBmZl9zdnExZW5jX2luaXRfcHBjKHMpOworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfc3ZxMWVuY19pbml0X3g4NihzKTsKKworICAgIGZmX2gyNjNfZW5jb2RlX2luaXQoJnMtPm0pOyAvLyBtdl9wZW5hbHR5CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdnExX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpY3QsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBTVlExRW5jQ29udGV4dCAqY29uc3QgcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqY29uc3QgcCAgICAgICAgPSBhdmN0eC0+Y29kZWRfZnJhbWU7CisgICAgaW50IGksIHJldDsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBzLT55X2Jsb2NrX3dpZHRoICogcy0+eV9ibG9ja19oZWlnaHQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTUJfQllURVMqMyArIEZGX01JTl9CVUZGRVJfU0laRSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1lVVjQxMFApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCFzLT5jdXJyZW50X3BpY3R1cmUtPmRhdGFbMF0pIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBzLT5jdXJyZW50X3BpY3R1cmUsIDApKTwgMCB8fAorICAgICAgICAgICAgKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHMtPmxhc3RfcGljdHVyZSwgMCkpICAgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHMtPnNjcmF0Y2hidWYgPSBhdl9tYWxsb2Mocy0+Y3VycmVudF9waWN0dXJlLT5saW5lc2l6ZVswXSAqIDE2ICogMyk7CisgICAgfQorCisgICAgRkZTV0FQKEFWRnJhbWUqLCBzLT5jdXJyZW50X3BpY3R1cmUsIHMtPmxhc3RfcGljdHVyZSk7CisKKyAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworCisgICAgcC0+cGljdF90eXBlID0gYXZjdHgtPmdvcF9zaXplICYmIGF2Y3R4LT5mcmFtZV9udW1iZXIgJSBhdmN0eC0+Z29wX3NpemUgPworICAgICAgICAgICAgICAgICAgIEFWX1BJQ1RVUkVfVFlQRV9QIDogQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcC0+a2V5X2ZyYW1lID0gcC0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIHAtPnF1YWxpdHkgICA9IHBpY3QtPnF1YWxpdHk7CisKKyAgICBzdnExX3dyaXRlX2hlYWRlcihzLCBwLT5waWN0X3R5cGUpOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGlmIChzdnExX2VuY29kZV9wbGFuZShzLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC0+ZGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfcGljdHVyZS0+ZGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS0+ZGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lX3dpZHRoICAvIChpID8gNCA6IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWVfaGVpZ2h0IC8gKGkgPyA0IDogMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS0+bGluZXNpemVbaV0pIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vIGF2cHJpdl9hbGlnbl9wdXRfYml0cygmcy0+cGIpOworICAgIHdoaWxlIChwdXRfYml0c19jb3VudCgmcy0+cGIpICYgMzEpCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7CisKKyAgICBmbHVzaF9wdXRfYml0cygmcy0+cGIpOworCisgICAgcGt0LT5zaXplID0gcHV0X2JpdHNfY291bnQoJnMtPnBiKSAvIDg7CisgICAgaWYgKHAtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkKKyAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfc3ZxMV9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzdnExIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU29yZW5zb24gVmVjdG9yIFF1YW50aXplciAxIC8gU29yZW5zb24gVmlkZW8gMSAvIFNWUTEiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU1ZRMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU1ZRMUVuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHN2cTFfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gc3ZxMV9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gc3ZxMV9lbmNvZGVfZW5kLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeyBBVl9QSVhfRk1UX1lVVjQxMFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3N2cTFlbmMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3N2cTFlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTc0ODg1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMWVuYy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBTVlExIGVuY29kZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NWUTFFTkNfSAorI2RlZmluZSBBVkNPREVDX1NWUTFFTkNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJocGVsZHNwLmgiCisjaW5jbHVkZSAibWVfY21wLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgU1ZRMUVuY0NvbnRleHQgeworICAgIC8qIEZJWE1FOiBOZWVkZWQgZm9yIG1vdGlvbiBlc3RpbWF0aW9uLCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGFueXRoaW5nCisgICAgICogZWxzZSwgdGhlIGlkZWEgaXMgdG8gbWFrZSB0aGUgbW90aW9uIGVzdGltYXRpb24gZXZlbnR1YWxseSBpbmRlcGVuZGVudAorICAgICAqIG9mIE1wZWdFbmNDb250ZXh0LCBzbyB0aGlzIHdpbGwgYmUgcmVtb3ZlZCB0aGVuLiAqLworICAgIE1wZWdFbmNDb250ZXh0IG07CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIE1FQ21wQ29udGV4dCBtZWNjOworICAgIEhwZWxEU1BDb250ZXh0IGhkc3A7CisgICAgQVZGcmFtZSAqY3VycmVudF9waWN0dXJlOworICAgIEFWRnJhbWUgKmxhc3RfcGljdHVyZTsKKyAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIEdldEJpdENvbnRleHQgZ2I7CisKKyAgICAvKiB3aHkgb29oIHdoeSB0aGlzIHNpY2sgYnJlYWR0aCBmaXJzdCBvcmRlciwKKyAgICAgKiBldmVyeXRoaW5nIGlzIHNsb3dlciBhbmQgbW9yZSBjb21wbGV4ICovCisgICAgUHV0Qml0Q29udGV4dCByZW9yZGVyX3BiWzZdOworCisgICAgaW50IGZyYW1lX3dpZHRoOworICAgIGludCBmcmFtZV9oZWlnaHQ7CisKKyAgICAvKiBZIHBsYW5lIGJsb2NrIGRpbWVuc2lvbnMgKi8KKyAgICBpbnQgeV9ibG9ja193aWR0aDsKKyAgICBpbnQgeV9ibG9ja19oZWlnaHQ7CisKKyAgICAvKiBVICYgViBwbGFuZSAoQyBwbGFuZXMpIGJsb2NrIGRpbWVuc2lvbnMgKi8KKyAgICBpbnQgY19ibG9ja193aWR0aDsKKyAgICBpbnQgY19ibG9ja19oZWlnaHQ7CisKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGVuY29kZWRfYmxvY2tfbGV2ZWxzKVs2XVs3XVsyNTZdOworCisgICAgdWludDE2X3QgKm1iX3R5cGU7CisgICAgdWludDMyX3QgKmR1bW15OworICAgIGludDE2X3QgKCptb3Rpb25fdmFsOFszXSlbMl07CisgICAgaW50MTZfdCAoKm1vdGlvbl92YWwxNlszXSlbMl07CisKKyAgICBpbnQ2NF90IHJkX3RvdGFsOworCisgICAgdWludDhfdCAqc2NyYXRjaGJ1ZjsKKworICAgIGludCAoKnNzZF9pbnQ4X3ZzX2ludDE2KShjb25zdCBpbnQ4X3QgKnBpeDEsIGNvbnN0IGludDE2X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHNpemUpOworfSBTVlExRW5jQ29udGV4dDsKKwordm9pZCBmZl9zdnExZW5jX2luaXRfcHBjKFNWUTFFbmNDb250ZXh0ICpjKTsKK3ZvaWQgZmZfc3ZxMWVuY19pbml0X3g4NihTVlExRW5jQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1NWUTFFTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMWVuY19jYi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3ZxMWVuY19jYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZGI0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy9zdnExZW5jX2NiLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIFNWUTEgRW5jb2RlcgorICogQ29weXJpZ2h0IChDKSAyMDA0IE1pa2UgTWVsYW5zb24gPG1lbGFuc29uQHBjaXN5cy5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHN2cTEgY29kZSBib29rcy4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfU1ZRMUVOQ19DQl9ICisjZGVmaW5lIEFWQ09ERUNfU1ZRMUVOQ19DQl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RhdGljIGNvbnN0IGludDhfdCBzdnExX2ludGVyX2NvZGVib29rX3N1bVs0XVsxNio2XSA9IHsKKyAgICB7IC0xLCAgMSwgLTIsICAwLCAgMSwgLTEsIC0xLCAtMSwgLTIsIC0xLCAgMSwgLTEsIC0xLCAgMCwgLTEsIC0xLAorICAgICAgIDAsIC0xLCAtMSwgLTEsIC0xLCAgMCwgLTEsICAwLCAgMCwgIDAsIC0zLCAgMSwgLTEsICAwLCAgMSwgLTEsCisgICAgICAgMSwgLTEsICAyLCAgMiwgIDEsICAxLCAgMiwgIDAsICAwLCAgMCwgLTEsICAxLCAgMSwgIDAsICAwLCAgMCwKKyAgICAgICAxLCAtMSwgIDAsICAxLCAtMSwgIDEsICAxLCAgMCwgIDEsICAwLCAtMSwgIDEsICAxLCAgMCwgIDAsICAwLAorICAgICAgLTIsICAwLCAgMCwgLTIsICAwLCAgMCwgLTIsICAwLCAtMiwgLTEsIC0yLCAtMSwgIDAsICAwLCAtMSwgIDAsCisgICAgICAgMSwgIDAsICAxLCAtMSwgIDIsICAyLCAgMSwgIDIsICAyLCAgMSwgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgfSwKKyAgICB7IC0yLCAgMSwgLTEsIC0xLCAgMSwgIDAsICAxLCAtMSwgLTEsIC0xLCAgMSwgLTEsICAwLCAtMSwgIDAsIC0xLAorICAgICAgIDAsICAwLCAgMCwgLTIsICAwLCAgMSwgIDAsIC0xLCAtMSwgIDAsICAyLCAtMywgIDEsIC0yLCAgMywgLTEsCisgICAgICAgMiwgIDAsICAyLCAgMSwgIDEsIC0xLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMiwgLTIsICAxLCAgMCwKKyAgICAgIC0yLCAtMSwgIDIsIC0yLCAtMiwgIDAsIC0zLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTIsIC0zLAorICAgICAgIDEsIC0yLCAtMiwgLTEsICAxLCAtMSwgLTEsICAxLCAtMSwgIDEsICAxLCAgMCwgLTIsICAwLCAgMSwgIDEsCisgICAgICAgMSwgIDEsICAyLCAgMSwgIDAsICAwLCAtMSwgIDAsICAwLCAgMSwgIDAsICAxLCAtMSwgIDEsICAwLCAgMiwgfSwKKyAgICB7ICAwLCAgMCwgIDAsIC0zLCAgMSwgIDEsICAxLCAtMywgIDAsIC0xLCAgMCwgLTMsICAxLCAtMywgIDAsIC0yLAorICAgICAgIDEsICAyLCAtMSwgLTMsICAwLCAtMywgIDEsIC0xLCAgMCwgLTEsICAwLCAgMCwgIDEsICAyLCAgMSwgIDEsCisgICAgICAtMSwgIDIsIC0zLCAgMywgIDEsICAwLCAtNSwgIDEsICAwLCAtMSwgLTMsICAxLCAgMCwgIDIsICAwLCAtMywKKyAgICAgICA0LCAgMiwgIDAsIC0yLCAgMSwgLTIsICAzLCAtMiwgIDEsICAxLCAgMCwgLTEsICAyLCAgNSwgIDMsICAxLAorICAgICAgLTEsICAwLCAgMiwgLTMsIC0yLCAgMCwgIDAsIC0yLCAgMiwgLTMsIC0xLCAtMSwgIDIsICAxLCAgMCwgLTIsCisgICAgICAgMywgLTEsICAxLCAtMSwgIDIsICA0LCAgMCwgIDEsICAwLCAgMSwgIDAsIC0xLCAtMywgLTIsIC0xLCAgMCwgfSwKKyAgICB7ICAwLCAgMiwgLTEsIC0xLCAgMiwgLTQsIC0yLCAgMywgIDAsIC0xLCAtNSwgIDEsICAwLCAgMSwgIDAsICA2LAorICAgICAgLTIsICAyLCAgMCwgIDEsICAxLCAtMSwgLTEsIC0yLCAgMSwgLTIsIC0xLCAgMCwgIDIsIC0yLCAtMiwgLTEsCisgICAgICAtNCwgIDIsIC0xLCAtMywgLTEsIC0yLCAgMiwgLTEsICAyLCAtMSwgIDIsICAwLCAgMywgLTMsIC0zLCAgMCwKKyAgICAgIC0zLCAgMCwgIDAsIC0yLCAgNCwgLTQsICAwLCAtMSwgIDQsICAwLCAtMiwgLTIsICAzLCAtMiwgIDAsICA0LAorICAgICAgIDUsICAwLCAgMSwgIDAsIC0zLCAgMywgIDMsICAyLCAgMCwgIDAsICAxLCAgMiwgLTUsIC0yLCAtMywgIDAsCisgICAgICAtMywgIDIsIC0yLCAgMiwgLTIsICA0LCAgNywgLTMsICA0LCAgMiwgIDMsICAyLCAtMSwgIDAsIC0zLCAgMSwgfQorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBzdnExX2ludHJhX2NvZGVib29rX3N1bVs0XVsxNio2XSA9IHsKKyAgICB7ICAwLCAgMCwgIDAsIC0xLCAtMSwgLTEsIC0xLCAtMiwgIDAsIC0xLCAtMSwgIDAsIC0xLCAgMCwgIDEsICAwLAorICAgICAgIDEsICAwLCAtMSwgIDEsICAwLCAgMCwgLTEsICAxLCAtMSwgIDAsICAwLCAgMCwgLTEsICAxLCAgMCwgIDAsCisgICAgICAtMSwgIDAsICAwLCAgMSwgLTEsICAxLCAgMCwgLTEsIC0xLCAgMCwgIDEsICAxLCAgMCwgIDAsIC0xLCAgMSwKKyAgICAgICAwLCAgMSwgIDAsICAwLCAgMSwgLTEsICAwLCAgMCwgIDAsIC0xLCAgMSwgIDAsICAxLCAgMCwgLTIsICAxLAorICAgICAgIDAsIC0xLCAgMSwgIDAsICAwLCAgMCwgIDEsICAwLCAtMSwgIDAsICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsCisgICAgICAgMCwgIDEsICAxLCAgMCwgIDAsIC0xLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAtMSwgIDEsICAxLCAtMSwgfSwKKyAgICB7IC0xLCAtMiwgIDAsIC0xLCAgMSwgIDAsIC0xLCAgMCwgLTEsIC00LCAtMSwgLTIsIC0xLCAtMiwgIDEsIC0yLAorICAgICAgIDAsICAwLCAgNCwgLTIsIC0xLCAgMSwgIDEsICAwLCAgMiwgIDEsICAxLCAgMCwgIDIsICAwLCAgMCwgIDAsCisgICAgICAgMSwgIDEsICAwLCAtMSwgLTEsIC0xLCAgMSwgIDAsIC0xLCAtMywgLTMsICAxLCAtMSwgIDEsIC0yLCAtMSwKKyAgICAgICAxLCAtMSwgIDAsICAxLCAgMiwgIDEsIC0xLCAtMSwgIDEsICAxLCAgMSwgIDIsICAxLCAgMCwgIDEsIC0yLAorICAgICAgLTIsICAwLCAtMSwgLTIsIC0yLCAgMCwgLTEsIC0xLCAtMSwgIDAsICAxLCAgMCwgLTEsIC0xLCAgMCwgLTEsCisgICAgICAgMCwgIDIsICAxLCAgMiwgIDIsICAxLCAtMSwgIDEsICAwLCAgMiwgIDAsIC0xLCAgMSwgIDAsICAwLCAgMCwgfSwKKyAgICB7IC0yLCAgMCwgLTEsIC0xLCAgMSwgIDEsIC0yLCAgMCwgLTIsICAwLCAgMSwgLTIsIC0yLCAgMSwgLTEsIC0xLAorICAgICAgIDMsIC0yLCAgMCwgLTMsIC00LCAtMywgIDIsICAxLCAgMCwgIDMsIC0yLCAgMiwgIDMsICAyLCAgMiwgLTEsCisgICAgICAtMywgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDEsIC0yLCAgMSwgLTIsIC0yLCAtMSwgLTIsIC0yLCAgMiwKKyAgICAgICAwLCAtNCwgIDAsICAyLCAtMSwgIDAsICAyLCAgMiwgIDIsICAxLCAgMCwgLTEsIC0xLCAgMSwgLTMsICAyLAorICAgICAgIDIsICAxLCAgMCwgIDMsICAxLCAtMSwgIDEsICAzLCAgMSwgIDAsICAxLCAgMSwgIDIsIC0xLCAgMSwgLTEsCisgICAgICAtMiwgLTEsICAwLCAtMSwgIDEsIC0xLCAgMSwgLTIsIC0yLCAtMSwgLTEsIC0zLCAgMSwgLTQsIC0zLCAgMSwgfSwKKyAgICB7IC0yLCAgMCwgLTIsICAzLCAtMSwgLTEsICAwLCAgMiwgIDIsIC0xLCAtMywgIDIsICAxLCAgMCwgLTIsIC0xLAorICAgICAgLTMsIC0yLCAtMiwgIDEsICAyLCAtMywgIDAsICAxLCAtNSwgLTIsIC0zLCAgMCwgLTIsIC0xLCAgMiwgIDAsCisgICAgICAtMSwgLTEsICAwLCAtMiwgIDEsICAzLCAtNywgLTIsIC0yLCAtMSwgIDIsIC0xLCAgMCwgIDMsICAxLCAgMywKKyAgICAgICAxLCAgMCwgIDAsICAxLCAgMiwgIDMsICAxLCAgMiwgIDAsIC0yLCAtMiwgIDEsICAxLCAgMiwgIDIsICAzLAorICAgICAgIDQsICAxLCAtMSwgIDIsIC0yLCAgNCwgIDAsICAwLCAgMCwgIDQsICAyLCAgMCwgLTIsIC0yLCAgMiwgLTQsCisgICAgICAtMSwgIDUsIC0yLCAtMiwgLTMsICAyLCAtMywgLTEsICAzLCAtMywgIDAsICA0LCAgMywgIDAsICAxLCAtMiwgfQorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfU1ZRMUVOQ19DQl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zdnEzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy9zdnEzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1OTMyOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3N2cTMuYwpAQCAtMCwwICsxLDEzODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBIb3cgdG8gdXNlIHRoaXMgZGVjb2RlcjoKKyAqIFNWUTMgZGF0YSBpcyB0cmFuc3BvcnRlZCB3aXRoaW4gQXBwbGUgUXVpY2t0aW1lIGZpbGVzLiBRdWlja3RpbWUgZmlsZXMKKyAqIGhhdmUgc3RzZCBhdG9tcyB0byBkZXNjcmliZSBtZWRpYSB0cmFrIHByb3BlcnRpZXMuIEEgc3RzZCBhdG9tIGZvciBhCisgKiB2aWRlbyB0cmFrIGNvbnRhaW5zIDEgb3IgbW9yZSBJbWFnZURlc2NyaXB0aW9uIGF0b21zLiBUaGVzZSBhdG9tcyBiZWdpbgorICogd2l0aCB0aGUgNC1ieXRlIGxlbmd0aCBvZiB0aGUgYXRvbSBmb2xsb3dlZCBieSB0aGUgY29kZWMgZm91cmNjLiBTb21lCisgKiBkZWNvZGVycyBuZWVkIGluZm9ybWF0aW9uIGluIHRoaXMgYXRvbSB0byBvcGVyYXRlIGNvcnJlY3RseS4gU3VjaAorICogaXMgdGhlIGNhc2Ugd2l0aCBTVlEzLiBJbiBvcmRlciB0byBnZXQgdGhlIGJlc3QgdXNlIG91dCBvZiB0aGlzIGRlY29kZXIsCisgKiB0aGUgY2FsbGluZyBhcHAgbXVzdCBtYWtlIHRoZSBTVlEzIEltYWdlRGVzY3JpcHRpb24gYXRvbSBhdmFpbGFibGUKKyAqIHZpYSB0aGUgQVZDb2RlY0NvbnRleHQncyBleHRyYWRhdGFbX3NpemVdIGZpZWxkOgorICoKKyAqIEFWQ29kZWNDb250ZXh0LmV4dHJhZGF0YSA9IHBvaW50ZXIgdG8gSW1hZ2VEZXNjcmlwdGlvbiwgZmlyc3QgY2hhcmFjdGVycworICogYXJlIGV4cGVjdGVkIHRvIGJlICdTJywgJ1YnLCAnUScsIGFuZCAnMycsIE5PVCB0aGUgNC1ieXRlIGF0b20gbGVuZ3RoCisgKiBBVkNvZGVjQ29udGV4dC5leHRyYWRhdGFfc2l6ZSA9IHNpemUgb2YgSW1hZ2VEZXNjcmlwdGlvbiBhdG9tIG1lbW9yeQorICogYnVmZmVyICh3aGljaCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBJbWFnZURlc2NyaXB0aW9uIGF0b20gc2l6ZSBmaWVsZAorICogZnJvbSB0aGUgUVQgZmlsZSwgbWludXMgNCBieXRlcyBzaW5jZSB0aGUgbGVuZ3RoIGlzIG1pc3NpbmcpCisgKgorICogWW91IHdpbGwga25vdyB5b3UgaGF2ZSB0aGVzZSBwYXJhbWV0ZXJzIHBhc3NlZCBjb3JyZWN0bHkgd2hlbiB0aGUgZGVjb2RlcgorICogY29ycmVjdGx5IGRlY29kZXMgdGhpcyBmaWxlOgorICogIGh0dHA6Ly9zYW1wbGVzLm1wbGF5ZXJocS5odS9WLWNvZGVjcy9TVlEzL1ZlcnRpY2FsNDAwa2JpdC5zb3JlbnNvbjMubW92CisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1wZWd1dGlscy5oIgorI2luY2x1ZGUgImgyNjQuaCIKKworI2luY2x1ZGUgImgyNjRkYXRhLmgiIC8vIEZJWE1FIEZJWE1FIEZJWE1FCisKKyNpbmNsdWRlICJoMjY0X212cHJlZC5oIgorI2luY2x1ZGUgImdvbG9tYi5oIgorI2luY2x1ZGUgImhwZWxkc3AuaCIKKyNpbmNsdWRlICJyZWN0YW5nbGUuaCIKKyNpbmNsdWRlICJ0cGVsZHNwLmgiCisjaW5jbHVkZSAidmRwYXVfaW50ZXJuYWwuaCIKKworI2lmIENPTkZJR19aTElCCisjaW5jbHVkZSA8emxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzdnExLmgiCisjaW5jbHVkZSAic3ZxMy5oIgorCisvKioKKyAqIEBmaWxlCisgKiBzdnEzIGRlY29kZXIuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEgyNjRDb250ZXh0IGg7CisgICAgSHBlbERTUENvbnRleHQgaGRzcDsKKyAgICBUcGVsRFNQQ29udGV4dCB0ZHNwOworICAgIEgyNjRQaWN0dXJlICpjdXJfcGljOworICAgIEgyNjRQaWN0dXJlICpuZXh0X3BpYzsKKyAgICBIMjY0UGljdHVyZSAqbGFzdF9waWM7CisgICAgaW50IGhhbGZwZWxfZmxhZzsKKyAgICBpbnQgdGhpcmRwZWxfZmxhZzsKKyAgICBpbnQgdW5rbm93bl9mbGFnOworICAgIGludCBuZXh0X3NsaWNlX2luZGV4OworICAgIHVpbnQzMl90IHdhdGVybWFya19rZXk7CisgICAgdWludDhfdCAqYnVmOworICAgIGludCBidWZfc2l6ZTsKKyAgICBpbnQgYWRhcHRpdmVfcXVhbnQ7CisgICAgaW50IG5leHRfcF9mcmFtZV9kYW1hZ2VkOworICAgIGludCBoX2VkZ2VfcG9zOworICAgIGludCB2X2VkZ2VfcG9zOworICAgIGludCBsYXN0X2ZyYW1lX291dHB1dDsKK30gU1ZRM0NvbnRleHQ7CisKKyNkZWZpbmUgRlVMTFBFTF9NT0RFICAxCisjZGVmaW5lIEhBTEZQRUxfTU9ERSAgMgorI2RlZmluZSBUSElSRFBFTF9NT0RFIDMKKyNkZWZpbmUgUFJFRElDVF9NT0RFICA0CisKKy8qIGR1YWwgc2NhbiAoZnJvbSBzb21lIG9sZGVyIGgyNjQgZHJhZnQpCisgKiBvLS0+by0tPm8gICBvCisgKiAgICAgICAgIHwgIC98CisgKiBvICAgbyAgIG8gLyBvCisgKiB8IC8gfCAgIHwvICB8CisgKiBvICAgbyAgIG8gICBvCisgKiAgIC8KKyAqIG8tLT5vLS0+by0tPm8KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3ZxM19zY2FuWzE2XSA9IHsKKyAgICAwICsgMCAqIDQsIDEgKyAwICogNCwgMiArIDAgKiA0LCAyICsgMSAqIDQsCisgICAgMiArIDIgKiA0LCAzICsgMCAqIDQsIDMgKyAxICogNCwgMyArIDIgKiA0LAorICAgIDAgKyAxICogNCwgMCArIDIgKiA0LCAxICsgMSAqIDQsIDEgKyAyICogNCwKKyAgICAwICsgMyAqIDQsIDEgKyAzICogNCwgMiArIDMgKiA0LCAzICsgMyAqIDQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBsdW1hX2RjX3ppZ3phZ19zY2FuWzE2XSA9IHsKKyAgICAwICogMTYgKyAwICogNjQsIDEgKiAxNiArIDAgKiA2NCwgMiAqIDE2ICsgMCAqIDY0LCAwICogMTYgKyAyICogNjQsCisgICAgMyAqIDE2ICsgMCAqIDY0LCAwICogMTYgKyAxICogNjQsIDEgKiAxNiArIDEgKiA2NCwgMiAqIDE2ICsgMSAqIDY0LAorICAgIDEgKiAxNiArIDIgKiA2NCwgMiAqIDE2ICsgMiAqIDY0LCAzICogMTYgKyAyICogNjQsIDAgKiAxNiArIDMgKiA2NCwKKyAgICAzICogMTYgKyAxICogNjQsIDEgKiAxNiArIDMgKiA2NCwgMiAqIDE2ICsgMyAqIDY0LCAzICogMTYgKyAzICogNjQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzdnEzX3ByZWRfMFsyNV1bMl0gPSB7CisgICAgeyAwLCAwIH0sCisgICAgeyAxLCAwIH0sIHsgMCwgMSB9LAorICAgIHsgMCwgMiB9LCB7IDEsIDEgfSwgeyAyLCAwIH0sCisgICAgeyAzLCAwIH0sIHsgMiwgMSB9LCB7IDEsIDIgfSwgeyAwLCAzIH0sCisgICAgeyAwLCA0IH0sIHsgMSwgMyB9LCB7IDIsIDIgfSwgeyAzLCAxIH0sIHsgNCwgMCB9LAorICAgIHsgNCwgMSB9LCB7IDMsIDIgfSwgeyAyLCAzIH0sIHsgMSwgNCB9LAorICAgIHsgMiwgNCB9LCB7IDMsIDMgfSwgeyA0LCAyIH0sCisgICAgeyA0LCAzIH0sIHsgMywgNCB9LAorICAgIHsgNCwgNCB9Cit9OworCitzdGF0aWMgY29uc3QgaW50OF90IHN2cTNfcHJlZF8xWzZdWzZdWzVdID0geworICAgIHsgeyAyLCAtMSwgLTEsIC0xLCAtMSB9LCB7IDIsIDEsIC0xLCAtMSwgLTEgfSwgeyAxLCAyLCAtMSwgLTEsIC0xIH0sCisgICAgICB7IDIsICAxLCAtMSwgLTEsIC0xIH0sIHsgMSwgMiwgLTEsIC0xLCAtMSB9LCB7IDEsIDIsIC0xLCAtMSwgLTEgfSB9LAorICAgIHsgeyAwLCAgMiwgLTEsIC0xLCAtMSB9LCB7IDAsIDIsICAxLCAgNCwgIDMgfSwgeyAwLCAxLCAgMiwgIDQsICAzIH0sCisgICAgICB7IDAsICAyLCAgMSwgIDQsICAzIH0sIHsgMiwgMCwgIDEsICAzLCAgNCB9LCB7IDAsIDQsICAyLCAgMSwgIDMgfSB9LAorICAgIHsgeyAyLCAgMCwgLTEsIC0xLCAtMSB9LCB7IDIsIDEsICAwLCAgNCwgIDMgfSwgeyAxLCAyLCAgNCwgIDAsICAzIH0sCisgICAgICB7IDIsICAxLCAgMCwgIDQsICAzIH0sIHsgMiwgMSwgIDQsICAzLCAgMCB9LCB7IDEsIDIsICA0LCAgMCwgIDMgfSB9LAorICAgIHsgeyAyLCAgMCwgLTEsIC0xLCAtMSB9LCB7IDIsIDAsICAxLCAgNCwgIDMgfSwgeyAxLCAyLCAgMCwgIDQsICAzIH0sCisgICAgICB7IDIsICAxLCAgMCwgIDQsICAzIH0sIHsgMiwgMSwgIDMsICA0LCAgMCB9LCB7IDIsIDQsICAxLCAgMCwgIDMgfSB9LAorICAgIHsgeyAwLCAgMiwgLTEsIC0xLCAtMSB9LCB7IDAsIDIsICAxLCAgMywgIDQgfSwgeyAxLCAyLCAgMywgIDAsICA0IH0sCisgICAgICB7IDIsICAwLCAgMSwgIDMsICA0IH0sIHsgMiwgMSwgIDMsICAwLCAgNCB9LCB7IDIsIDAsICA0LCAgMywgIDEgfSB9LAorICAgIHsgeyAwLCAgMiwgLTEsIC0xLCAtMSB9LCB7IDAsIDIsICA0LCAgMSwgIDMgfSwgeyAxLCA0LCAgMiwgIDAsICAzIH0sCisgICAgICB7IDQsICAyLCAgMCwgIDEsICAzIH0sIHsgMiwgMCwgIDEsICA0LCAgMyB9LCB7IDQsIDIsICAxLCAgMCwgIDMgfSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgdWludDhfdCBydW47CisgICAgdWludDhfdCBsZXZlbDsKK30gc3ZxM19kY3RfdGFibGVzWzJdWzE2XSA9IHsKKyAgICB7IHsgMCwgMCB9LCB7IDAsIDEgfSwgeyAxLCAxIH0sIHsgMiwgMSB9LCB7IDAsIDIgfSwgeyAzLCAxIH0sIHsgNCwgMSB9LCB7IDUsIDEgfSwKKyAgICAgIHsgMCwgMyB9LCB7IDEsIDIgfSwgeyAyLCAyIH0sIHsgNiwgMSB9LCB7IDcsIDEgfSwgeyA4LCAxIH0sIHsgOSwgMSB9LCB7IDAsIDQgfSB9LAorICAgIHsgeyAwLCAwIH0sIHsgMCwgMSB9LCB7IDEsIDEgfSwgeyAwLCAyIH0sIHsgMiwgMSB9LCB7IDAsIDMgfSwgeyAwLCA0IH0sIHsgMCwgNSB9LAorICAgICAgeyAzLCAxIH0sIHsgNCwgMSB9LCB7IDEsIDIgfSwgeyAxLCAzIH0sIHsgMCwgNiB9LCB7IDAsIDcgfSwgeyAwLCA4IH0sIHsgMCwgOSB9IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBzdnEzX2RlcXVhbnRfY29lZmZbMzJdID0geworICAgICAzODgxLCAgNDM1MSwgIDQ4OTAsICA1NDgxLCAgIDYxNTQsICAgNjkxNCwgICA3NzYxLCAgIDg3MTgsCisgICAgIDk3ODEsIDEwOTg3LCAxMjMzOSwgMTM4MjgsICAxNTUyMywgIDE3NDM1LCAgMTk1NjEsICAyMTg3MywKKyAgICAyNDU1MiwgMjc2NTYsIDMwODQ3LCAzNDg3MCwgIDM4ODA3LCAgNDM3NDcsICA0OTEwMywgIDU0NjgzLAorICAgIDYxNjk0LCA2ODc0NSwgNzc2MTUsIDg5MTEzLCAxMDAyNTMsIDEwOTM2NiwgMTI2NjM1LCAxNDE1MzMKK307CisKK3N0YXRpYyBpbnQgc3ZxM19kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK3ZvaWQgZmZfc3ZxM19sdW1hX2RjX2RlcXVhbnRfaWRjdF9jKGludDE2X3QgKm91dHB1dCwgaW50MTZfdCAqaW5wdXQsIGludCBxcCkKK3sKKyAgICBjb25zdCBpbnQgcW11bCA9IHN2cTNfZGVxdWFudF9jb2VmZltxcF07CisjZGVmaW5lIHN0cmlkZSAxNgorICAgIGludCBpOworICAgIGludCB0ZW1wWzE2XTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCB4X29mZnNldFs0XSA9IHsgMCwgMSAqIHN0cmlkZSwgNCAqIHN0cmlkZSwgNSAqIHN0cmlkZSB9OworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBjb25zdCBpbnQgejAgPSAxMyAqIChpbnB1dFs0ICogaSArIDBdICsgICAgICBpbnB1dFs0ICogaSArIDJdKTsKKyAgICAgICAgY29uc3QgaW50IHoxID0gMTMgKiAoaW5wdXRbNCAqIGkgKyAwXSAtICAgICAgaW5wdXRbNCAqIGkgKyAyXSk7CisgICAgICAgIGNvbnN0IGludCB6MiA9ICA3ICogIGlucHV0WzQgKiBpICsgMV0gLSAxNyAqIGlucHV0WzQgKiBpICsgM107CisgICAgICAgIGNvbnN0IGludCB6MyA9IDE3ICogIGlucHV0WzQgKiBpICsgMV0gKyAgNyAqIGlucHV0WzQgKiBpICsgM107CisKKyAgICAgICAgdGVtcFs0ICogaSArIDBdID0gejAgKyB6MzsKKyAgICAgICAgdGVtcFs0ICogaSArIDFdID0gejEgKyB6MjsKKyAgICAgICAgdGVtcFs0ICogaSArIDJdID0gejEgLSB6MjsKKyAgICAgICAgdGVtcFs0ICogaSArIDNdID0gejAgLSB6MzsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBvZmZzZXQgPSB4X29mZnNldFtpXTsKKyAgICAgICAgY29uc3QgaW50IHowICAgICA9IDEzICogKHRlbXBbNCAqIDAgKyBpXSArICAgICAgdGVtcFs0ICogMiArIGldKTsKKyAgICAgICAgY29uc3QgaW50IHoxICAgICA9IDEzICogKHRlbXBbNCAqIDAgKyBpXSAtICAgICAgdGVtcFs0ICogMiArIGldKTsKKyAgICAgICAgY29uc3QgaW50IHoyICAgICA9ICA3ICogIHRlbXBbNCAqIDEgKyBpXSAtIDE3ICogdGVtcFs0ICogMyArIGldOworICAgICAgICBjb25zdCBpbnQgejMgICAgID0gMTcgKiAgdGVtcFs0ICogMSArIGldICsgIDcgKiB0ZW1wWzQgKiAzICsgaV07CisKKyAgICAgICAgb3V0cHV0W3N0cmlkZSAqICAwICsgb2Zmc2V0XSA9ICh6MCArIHozKSAqIHFtdWwgKyAweDgwMDAwID4+IDIwOworICAgICAgICBvdXRwdXRbc3RyaWRlICogIDIgKyBvZmZzZXRdID0gKHoxICsgejIpICogcW11bCArIDB4ODAwMDAgPj4gMjA7CisgICAgICAgIG91dHB1dFtzdHJpZGUgKiAgOCArIG9mZnNldF0gPSAoejEgLSB6MikgKiBxbXVsICsgMHg4MDAwMCA+PiAyMDsKKyAgICAgICAgb3V0cHV0W3N0cmlkZSAqIDEwICsgb2Zmc2V0XSA9ICh6MCAtIHozKSAqIHFtdWwgKyAweDgwMDAwID4+IDIwOworICAgIH0KK30KKyN1bmRlZiBzdHJpZGUKKwordm9pZCBmZl9zdnEzX2FkZF9pZGN0X2ModWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBxcCwgaW50IGRjKQoreworICAgIGNvbnN0IGludCBxbXVsID0gc3ZxM19kZXF1YW50X2NvZWZmW3FwXTsKKyAgICBpbnQgaTsKKworICAgIGlmIChkYykgeworICAgICAgICBkYyAgICAgICA9IDEzICogMTMgKiAoZGMgPT0gMSA/IDE1MzggKiBibG9ja1swXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHFtdWwgKiAoYmxvY2tbMF0gPj4gMykgLyAyKTsKKyAgICAgICAgYmxvY2tbMF0gPSAwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IHowID0gMTMgKiAoYmxvY2tbMCArIDQgKiBpXSArICAgICAgYmxvY2tbMiArIDQgKiBpXSk7CisgICAgICAgIGNvbnN0IGludCB6MSA9IDEzICogKGJsb2NrWzAgKyA0ICogaV0gLSAgICAgIGJsb2NrWzIgKyA0ICogaV0pOworICAgICAgICBjb25zdCBpbnQgejIgPSAgNyAqICBibG9ja1sxICsgNCAqIGldIC0gMTcgKiBibG9ja1szICsgNCAqIGldOworICAgICAgICBjb25zdCBpbnQgejMgPSAxNyAqICBibG9ja1sxICsgNCAqIGldICsgIDcgKiBibG9ja1szICsgNCAqIGldOworCisgICAgICAgIGJsb2NrWzAgKyA0ICogaV0gPSB6MCArIHozOworICAgICAgICBibG9ja1sxICsgNCAqIGldID0gejEgKyB6MjsKKyAgICAgICAgYmxvY2tbMiArIDQgKiBpXSA9IHoxIC0gejI7CisgICAgICAgIGJsb2NrWzMgKyA0ICogaV0gPSB6MCAtIHozOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IHowID0gMTMgKiAoYmxvY2tbaSArIDQgKiAwXSArICAgICAgYmxvY2tbaSArIDQgKiAyXSk7CisgICAgICAgIGNvbnN0IGludCB6MSA9IDEzICogKGJsb2NrW2kgKyA0ICogMF0gLSAgICAgIGJsb2NrW2kgKyA0ICogMl0pOworICAgICAgICBjb25zdCBpbnQgejIgPSAgNyAqICBibG9ja1tpICsgNCAqIDFdIC0gMTcgKiBibG9ja1tpICsgNCAqIDNdOworICAgICAgICBjb25zdCBpbnQgejMgPSAxNyAqICBibG9ja1tpICsgNCAqIDFdICsgIDcgKiBibG9ja1tpICsgNCAqIDNdOworICAgICAgICBjb25zdCBpbnQgcnIgPSAoZGMgKyAweDgwMDAwKTsKKworICAgICAgICBkc3RbaSArIHN0cmlkZSAqIDBdID0gYXZfY2xpcF91aW50OChkc3RbaSArIHN0cmlkZSAqIDBdICsgKCh6MCArIHozKSAqIHFtdWwgKyByciA+PiAyMCkpOworICAgICAgICBkc3RbaSArIHN0cmlkZSAqIDFdID0gYXZfY2xpcF91aW50OChkc3RbaSArIHN0cmlkZSAqIDFdICsgKCh6MSArIHoyKSAqIHFtdWwgKyByciA+PiAyMCkpOworICAgICAgICBkc3RbaSArIHN0cmlkZSAqIDJdID0gYXZfY2xpcF91aW50OChkc3RbaSArIHN0cmlkZSAqIDJdICsgKCh6MSAtIHoyKSAqIHFtdWwgKyByciA+PiAyMCkpOworICAgICAgICBkc3RbaSArIHN0cmlkZSAqIDNdID0gYXZfY2xpcF91aW50OChkc3RbaSArIHN0cmlkZSAqIDNdICsgKCh6MCAtIHozKSAqIHFtdWwgKyByciA+PiAyMCkpOworICAgIH0KKworICAgIG1lbXNldChibG9jaywgMCwgMTYgKiBzaXplb2YoaW50MTZfdCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdnEzX2RlY29kZV9ibG9jayhHZXRCaXRDb250ZXh0ICpnYiwgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGNvbnN0IGludCB0eXBlKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICpjb25zdCBzY2FuX3BhdHRlcm5zWzRdID0KKyAgICB7IGx1bWFfZGNfemlnemFnX3NjYW4sIHppZ3phZ19zY2FuLCBzdnEzX3NjYW4sIGNocm9tYV9kY19zY2FuIH07CisKKyAgICBpbnQgcnVuLCBsZXZlbCwgc2lnbiwgbGltaXQ7CisgICAgdW5zaWduZWQgdmxjOworICAgIGNvbnN0IGludCBpbnRyYSAgICAgICAgICAgPSAzICogdHlwZSA+PiAyOworICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IHNjYW4gPSBzY2FuX3BhdHRlcm5zW3R5cGVdOworCisgICAgZm9yIChsaW1pdCA9ICgxNiA+PiBpbnRyYSk7IGluZGV4IDwgMTY7IGluZGV4ID0gbGltaXQsIGxpbWl0ICs9IDgpIHsKKyAgICAgICAgZm9yICg7ICh2bGMgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpKSAhPSAwOyBpbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoKGludDMyX3QpdmxjIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIHNpZ24gICAgID0gKHZsYyAmIDEpID8gMCA6IC0xOworICAgICAgICAgICAgdmxjICAgICAgPSB2bGMgKyAxID4+IDE7CisKKyAgICAgICAgICAgIGlmICh0eXBlID09IDMpIHsKKyAgICAgICAgICAgICAgICBpZiAodmxjIDwgMykgeworICAgICAgICAgICAgICAgICAgICBydW4gICA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gdmxjOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmxjIDwgNCkgeworICAgICAgICAgICAgICAgICAgICBydW4gICA9IDE7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBydW4gICA9IHZsYyAmIDB4MzsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAodmxjICsgOSA+PiAyKSAtIHJ1bjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh2bGMgPCAxNlUpIHsKKyAgICAgICAgICAgICAgICAgICAgcnVuICAgPSBzdnEzX2RjdF90YWJsZXNbaW50cmFdW3ZsY10ucnVuOworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHN2cTNfZGN0X3RhYmxlc1tpbnRyYV1bdmxjXS5sZXZlbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGludHJhKSB7CisgICAgICAgICAgICAgICAgICAgIHJ1biAgID0gdmxjICYgMHg3OworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9ICh2bGMgPj4gMykgKyAoKHJ1biA9PSAwKSA/IDggOiAoKHJ1biA8IDIpID8gMiA6ICgocnVuIDwgNSkgPyAwIDogLTEpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcnVuICAgPSB2bGMgJiAweEY7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKHZsYyA+PiA0KSArICgocnVuID09IDApID8gNCA6ICgocnVuIDwgMykgPyAyIDogKChydW4gPCAxMCkgPyAxIDogMCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKChpbmRleCArPSBydW4pID49IGxpbWl0KQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgYmxvY2tbc2NhbltpbmRleF1dID0gKGxldmVsIF4gc2lnbikgLSBzaWduOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUgIT0gMikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN2cTNfbWNfZGlyX3BhcnQoU1ZRM0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteCwgaW50IG15LCBpbnQgZHh5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRoaXJkcGVsLCBpbnQgZGlyLCBpbnQgYXZnKQoreworICAgIEgyNjRDb250ZXh0ICpoID0gJnMtPmg7CisgICAgY29uc3QgSDI2NFBpY3R1cmUgKnBpYyA9IChkaXIgPT0gMCkgPyBzLT5sYXN0X3BpYyA6IHMtPm5leHRfcGljOworICAgIHVpbnQ4X3QgKnNyYywgKmRlc3Q7CisgICAgaW50IGksIGVtdSA9IDA7CisgICAgaW50IGJsb2Nrc2l6ZSA9IDIgLSAod2lkdGggPj4gMyk7IC8vIDE2LT4wLCA4LT4xLCA0LT4yCisKKyAgICBteCArPSB4OworICAgIG15ICs9IHk7CisKKyAgICBpZiAobXggPCAwIHx8IG14ID49IHMtPmhfZWRnZV9wb3MgLSB3aWR0aCAgLSAxIHx8CisgICAgICAgIG15IDwgMCB8fCBteSA+PSBzLT52X2VkZ2VfcG9zIC0gaGVpZ2h0IC0gMSkgeworICAgICAgICBlbXUgPSAxOworICAgICAgICBteCA9IGF2X2NsaXAobXgsIC0xNiwgcy0+aF9lZGdlX3BvcyAtIHdpZHRoICArIDE1KTsKKyAgICAgICAgbXkgPSBhdl9jbGlwKG15LCAtMTYsIHMtPnZfZWRnZV9wb3MgLSBoZWlnaHQgKyAxNSk7CisgICAgfQorCisgICAgLyogZm9ybSBjb21wb25lbnQgcHJlZGljdGlvbnMgKi8KKyAgICBkZXN0ID0gaC0+Y3VyX3BpYy5mLmRhdGFbMF0gKyB4ICsgeSAqIGgtPmxpbmVzaXplOworICAgIHNyYyAgPSBwaWMtPmYuZGF0YVswXSArIG14ICsgbXkgKiBoLT5saW5lc2l6ZTsKKworICAgIGlmIChlbXUpIHsKKyAgICAgICAgaC0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGgtPmVkZ2VfZW11X2J1ZmZlciwgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bGluZXNpemUsIGgtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggKyAxLCBoZWlnaHQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXgsIG15LCBzLT5oX2VkZ2VfcG9zLCBzLT52X2VkZ2VfcG9zKTsKKyAgICAgICAgc3JjID0gaC0+ZWRnZV9lbXVfYnVmZmVyOworICAgIH0KKyAgICBpZiAodGhpcmRwZWwpCisgICAgICAgIChhdmcgPyBzLT50ZHNwLmF2Z190cGVsX3BpeGVsc190YWIKKyAgICAgICAgICAgICA6IHMtPnRkc3AucHV0X3RwZWxfcGl4ZWxzX3RhYilbZHh5XShkZXN0LCBzcmMsIGgtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworICAgIGVsc2UKKyAgICAgICAgKGF2ZyA/IHMtPmhkc3AuYXZnX3BpeGVsc190YWIKKyAgICAgICAgICAgICA6IHMtPmhkc3AucHV0X3BpeGVsc190YWIpW2Jsb2Nrc2l6ZV1bZHh5XShkZXN0LCBzcmMsIGgtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisKKyAgICBpZiAoIShoLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgbXggICAgID0gbXggKyAobXggPCAoaW50KSB4KSA+PiAxOworICAgICAgICBteSAgICAgPSBteSArIChteSA8IChpbnQpIHkpID4+IDE7CisgICAgICAgIHdpZHRoICA9IHdpZHRoICA+PiAxOworICAgICAgICBoZWlnaHQgPSBoZWlnaHQgPj4gMTsKKyAgICAgICAgYmxvY2tzaXplKys7CisKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgZGVzdCA9IGgtPmN1cl9waWMuZi5kYXRhW2ldICsgKHggPj4gMSkgKyAoeSA+PiAxKSAqIGgtPnV2bGluZXNpemU7CisgICAgICAgICAgICBzcmMgID0gcGljLT5mLmRhdGFbaV0gKyBteCArIG15ICogaC0+dXZsaW5lc2l6ZTsKKworICAgICAgICAgICAgaWYgKGVtdSkgeworICAgICAgICAgICAgICAgIGgtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhoLT5lZGdlX2VtdV9idWZmZXIsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+dXZsaW5lc2l6ZSwgaC0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggKyAxLCBoZWlnaHQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteCwgbXksIChzLT5oX2VkZ2VfcG9zID4+IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT52X2VkZ2VfcG9zID4+IDEpOworICAgICAgICAgICAgICAgIHNyYyA9IGgtPmVkZ2VfZW11X2J1ZmZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlyZHBlbCkKKyAgICAgICAgICAgICAgICAoYXZnID8gcy0+dGRzcC5hdmdfdHBlbF9waXhlbHNfdGFiCisgICAgICAgICAgICAgICAgICAgICA6IHMtPnRkc3AucHV0X3RwZWxfcGl4ZWxzX3RhYilbZHh5XShkZXN0LCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT51dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKGF2ZyA/IHMtPmhkc3AuYXZnX3BpeGVsc190YWIKKyAgICAgICAgICAgICAgICAgICAgIDogcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYilbYmxvY2tzaXplXVtkeHldKGRlc3QsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBzdnEzX21jX2RpcihTVlEzQ29udGV4dCAqcywgaW50IHNpemUsIGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgaW50IGF2ZykKK3sKKyAgICBpbnQgaSwgaiwgaywgbXgsIG15LCBkeCwgZHksIHgsIHk7CisgICAgSDI2NENvbnRleHQgKmggICAgICAgICAgPSAmcy0+aDsKKyAgICBjb25zdCBpbnQgcGFydF93aWR0aCAgICA9ICgoc2l6ZSAmIDUpID09IDQpID8gNCA6IDE2ID4+IChzaXplICYgMSk7CisgICAgY29uc3QgaW50IHBhcnRfaGVpZ2h0ICAgPSAxNiA+PiAoKHVuc2lnbmVkKShzaXplICsgMSkgLyAzKTsKKyAgICBjb25zdCBpbnQgZXh0cmFfd2lkdGggICA9IChtb2RlID09IFBSRURJQ1RfTU9ERSkgPyAtMTYgKiA2IDogMDsKKyAgICBjb25zdCBpbnQgaF9lZGdlX3BvcyAgICA9IDYgKiAocy0+aF9lZGdlX3BvcyAtIHBhcnRfd2lkdGgpICAtIGV4dHJhX3dpZHRoOworICAgIGNvbnN0IGludCB2X2VkZ2VfcG9zICAgID0gNiAqIChzLT52X2VkZ2VfcG9zIC0gcGFydF9oZWlnaHQpIC0gZXh0cmFfd2lkdGg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gcGFydF9oZWlnaHQpCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaiArPSBwYXJ0X3dpZHRoKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgYl94eSA9ICg0ICogaC0+bWJfeCArIChqID4+IDIpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0ICogaC0+bWJfeSArIChpID4+IDIpKSAqIGgtPmJfc3RyaWRlOworICAgICAgICAgICAgaW50IGR4eTsKKyAgICAgICAgICAgIHggPSAxNiAqIGgtPm1iX3ggKyBqOworICAgICAgICAgICAgeSA9IDE2ICogaC0+bWJfeSArIGk7CisgICAgICAgICAgICBrID0gKGogPj4gMiAmIDEpICsgKGkgPj4gMSAmIDIpICsKKyAgICAgICAgICAgICAgICAoaiA+PiAxICYgNCkgKyAoaSAgICAgICYgOCk7CisKKyAgICAgICAgICAgIGlmIChtb2RlICE9IFBSRURJQ1RfTU9ERSkgeworICAgICAgICAgICAgICAgIHByZWRfbW90aW9uKGgsIGssIHBhcnRfd2lkdGggPj4gMiwgZGlyLCAxLCAmbXgsICZteSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG14ID0gcy0+bmV4dF9waWMtPm1vdGlvbl92YWxbMF1bYl94eV1bMF0gPDwgMTsKKyAgICAgICAgICAgICAgICBteSA9IHMtPm5leHRfcGljLT5tb3Rpb25fdmFsWzBdW2JfeHldWzFdIDw8IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoZGlyID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbXggPSBteCAqIGgtPmZyYW1lX251bV9vZmZzZXQgLworICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCArIDEgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgbXkgPSBteSAqIGgtPmZyYW1lX251bV9vZmZzZXQgLworICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCArIDEgPj4gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBteCA9IG14ICogKGgtPmZyYW1lX251bV9vZmZzZXQgLSBoLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgKyAxID4+IDE7CisgICAgICAgICAgICAgICAgICAgIG15ID0gbXkgKiAoaC0+ZnJhbWVfbnVtX29mZnNldCAtIGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCkgLworICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCArIDEgPj4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNsaXAgbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIHRvIGZyYW1lIGJvcmRlciAqLworICAgICAgICAgICAgbXggPSBhdl9jbGlwKG14LCBleHRyYV93aWR0aCAtIDYgKiB4LCBoX2VkZ2VfcG9zIC0gNiAqIHgpOworICAgICAgICAgICAgbXkgPSBhdl9jbGlwKG15LCBleHRyYV93aWR0aCAtIDYgKiB5LCB2X2VkZ2VfcG9zIC0gNiAqIHkpOworCisgICAgICAgICAgICAvKiBnZXQgKG9wdGlvbmFsKSBtb3Rpb24gdmVjdG9yIGRpZmZlcmVudGlhbCAqLworICAgICAgICAgICAgaWYgKG1vZGUgPT0gUFJFRElDVF9NT0RFKSB7CisgICAgICAgICAgICAgICAgZHggPSBkeSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGR5ID0gc3ZxM19nZXRfc2VfZ29sb21iKCZoLT5nYik7CisgICAgICAgICAgICAgICAgZHggPSBzdnEzX2dldF9zZV9nb2xvbWIoJmgtPmdiKTsKKworICAgICAgICAgICAgICAgIGlmIChkeCA9PSBJTlZBTElEX1ZMQyB8fCBkeSA9PSBJTlZBTElEX1ZMQykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgTVYgdmxjXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY29tcHV0ZSBtb3Rpb24gdmVjdG9yICovCisgICAgICAgICAgICBpZiAobW9kZSA9PSBUSElSRFBFTF9NT0RFKSB7CisgICAgICAgICAgICAgICAgaW50IGZ4LCBmeTsKKyAgICAgICAgICAgICAgICBteCAgPSAobXggKyAxID4+IDEpICsgZHg7CisgICAgICAgICAgICAgICAgbXkgID0gKG15ICsgMSA+PiAxKSArIGR5OworICAgICAgICAgICAgICAgIGZ4ICA9ICh1bnNpZ25lZCkobXggKyAweDMwMDApIC8gMyAtIDB4MTAwMDsKKyAgICAgICAgICAgICAgICBmeSAgPSAodW5zaWduZWQpKG15ICsgMHgzMDAwKSAvIDMgLSAweDEwMDA7CisgICAgICAgICAgICAgICAgZHh5ID0gKG14IC0gMyAqIGZ4KSArIDQgKiAobXkgLSAzICogZnkpOworCisgICAgICAgICAgICAgICAgc3ZxM19tY19kaXJfcGFydChzLCB4LCB5LCBwYXJ0X3dpZHRoLCBwYXJ0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4LCBmeSwgZHh5LCAxLCBkaXIsIGF2Zyk7CisgICAgICAgICAgICAgICAgbXggKz0gbXg7CisgICAgICAgICAgICAgICAgbXkgKz0gbXk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gSEFMRlBFTF9NT0RFIHx8IG1vZGUgPT0gUFJFRElDVF9NT0RFKSB7CisgICAgICAgICAgICAgICAgbXggID0gKHVuc2lnbmVkKShteCArIDEgKyAweDMwMDApIC8gMyArIGR4IC0gMHgxMDAwOworICAgICAgICAgICAgICAgIG15ICA9ICh1bnNpZ25lZCkobXkgKyAxICsgMHgzMDAwKSAvIDMgKyBkeSAtIDB4MTAwMDsKKyAgICAgICAgICAgICAgICBkeHkgPSAobXggJiAxKSArIDIgKiAobXkgJiAxKTsKKworICAgICAgICAgICAgICAgIHN2cTNfbWNfZGlyX3BhcnQocywgeCwgeSwgcGFydF93aWR0aCwgcGFydF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteCA+PiAxLCBteSA+PiAxLCBkeHksIDAsIGRpciwgYXZnKTsKKyAgICAgICAgICAgICAgICBteCAqPSAzOworICAgICAgICAgICAgICAgIG15ICo9IDM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG14ID0gKHVuc2lnbmVkKShteCArIDMgKyAweDYwMDApIC8gNiArIGR4IC0gMHgxMDAwOworICAgICAgICAgICAgICAgIG15ID0gKHVuc2lnbmVkKShteSArIDMgKyAweDYwMDApIC8gNiArIGR5IC0gMHgxMDAwOworCisgICAgICAgICAgICAgICAgc3ZxM19tY19kaXJfcGFydChzLCB4LCB5LCBwYXJ0X3dpZHRoLCBwYXJ0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14LCBteSwgMCwgMCwgZGlyLCBhdmcpOworICAgICAgICAgICAgICAgIG14ICo9IDY7CisgICAgICAgICAgICAgICAgbXkgKj0gNjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogdXBkYXRlIG12X2NhY2hlICovCisgICAgICAgICAgICBpZiAobW9kZSAhPSBQUkVESUNUX01PREUpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG12ID0gcGFjazE2dG8zMihteCwgbXkpOworCisgICAgICAgICAgICAgICAgaWYgKHBhcnRfaGVpZ2h0ID09IDggJiYgaSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEoaC0+bXZfY2FjaGVbZGlyXVtzY2FuOFtrXSArIDEgKiA4XSwgbXYpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0X3dpZHRoID09IDggJiYgaiA8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQShoLT5tdl9jYWNoZVtkaXJdW3NjYW44W2tdICsgMSArIDEgKiA4XSwgbXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGFydF93aWR0aCA9PSA4ICYmIGogPCA4KQorICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQShoLT5tdl9jYWNoZVtkaXJdW3NjYW44W2tdICsgMV0sIG12KTsKKyAgICAgICAgICAgICAgICBpZiAocGFydF93aWR0aCA9PSA0IHx8IHBhcnRfaGVpZ2h0ID09IDQpCisgICAgICAgICAgICAgICAgICAgIEFWX1dOMzJBKGgtPm12X2NhY2hlW2Rpcl1bc2Nhbjhba11dLCBtdik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHdyaXRlIGJhY2sgbW90aW9uIHZlY3RvcnMgKi8KKyAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKGgtPmN1cl9waWMubW90aW9uX3ZhbFtkaXJdW2JfeHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydF93aWR0aCA+PiAyLCBwYXJ0X2hlaWdodCA+PiAyLCBoLT5iX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2sxNnRvMzIobXgsIG15KSwgNCk7CisgICAgICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN2cTNfZGVjb2RlX21iKFNWUTNDb250ZXh0ICpzLCB1bnNpZ25lZCBpbnQgbWJfdHlwZSkKK3sKKyAgICBIMjY0Q29udGV4dCAqaCA9ICZzLT5oOworICAgIGludCBpLCBqLCBrLCBtLCBkaXIsIG1vZGU7CisgICAgaW50IGNicCA9IDA7CisgICAgdWludDMyX3QgdmxjOworICAgIGludDhfdCAqdG9wLCAqbGVmdDsKKyAgICBjb25zdCBpbnQgbWJfeHkgICAgICAgICA9IGgtPm1iX3h5OworICAgIGNvbnN0IGludCBiX3h5ICAgICAgICAgID0gNCAqIGgtPm1iX3ggKyA0ICogaC0+bWJfeSAqIGgtPmJfc3RyaWRlOworCisgICAgaC0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlICAgICAgPSAoaC0+bWJfeSA9PSAwKSA/IDB4MzNGRiA6IDB4RkZGRjsKKyAgICBoLT5sZWZ0X3NhbXBsZXNfYXZhaWxhYmxlICAgICA9IChoLT5tYl94ID09IDApID8gMHg1RjVGIDogMHhGRkZGOworICAgIGgtPnRvcHJpZ2h0X3NhbXBsZXNfYXZhaWxhYmxlID0gMHhGRkZGOworCisgICAgaWYgKG1iX3R5cGUgPT0gMCkgeyAgICAgICAgICAgLyogU0tJUCAqLworICAgICAgICBpZiAoaC0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QIHx8CisgICAgICAgICAgICBzLT5uZXh0X3BpYy0+bWJfdHlwZVttYl94eV0gPT0gLTEpIHsKKyAgICAgICAgICAgIHN2cTNfbWNfZGlyX3BhcnQocywgMTYgKiBoLT5tYl94LCAxNiAqIGgtPm1iX3ksIDE2LCAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCk7CisKKyAgICAgICAgICAgIGlmIChoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgICAgICAgICAgc3ZxM19tY19kaXJfcGFydChzLCAxNiAqIGgtPm1iX3gsIDE2ICogaC0+bWJfeSwgMTYsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMSwgMSk7CisKKyAgICAgICAgICAgIG1iX3R5cGUgPSBNQl9UWVBFX1NLSVA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYl90eXBlID0gRkZNSU4ocy0+bmV4dF9waWMtPm1iX3R5cGVbbWJfeHldLCA2KTsKKyAgICAgICAgICAgIGlmIChzdnEzX21jX2RpcihzLCBtYl90eXBlLCBQUkVESUNUX01PREUsIDAsIDApIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoc3ZxM19tY19kaXIocywgbWJfdHlwZSwgUFJFRElDVF9NT0RFLCAxLCAxKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBtYl90eXBlID0gTUJfVFlQRV8xNngxNjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobWJfdHlwZSA8IDgpIHsgICAgIC8qIElOVEVSICovCisgICAgICAgIGlmIChzLT50aGlyZHBlbF9mbGFnICYmIHMtPmhhbGZwZWxfZmxhZyA9PSAhZ2V0X2JpdHMxKCZoLT5nYikpCisgICAgICAgICAgICBtb2RlID0gVEhJUkRQRUxfTU9ERTsKKyAgICAgICAgZWxzZSBpZiAocy0+aGFsZnBlbF9mbGFnICYmCisgICAgICAgICAgICAgICAgIHMtPnRoaXJkcGVsX2ZsYWcgPT0gIWdldF9iaXRzMSgmaC0+Z2IpKQorICAgICAgICAgICAgbW9kZSA9IEhBTEZQRUxfTU9ERTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbW9kZSA9IEZVTExQRUxfTU9ERTsKKworICAgICAgICAvKiBmaWxsIGNhY2hlcyAqLworICAgICAgICAvKiBub3RlIHJlZl9jYWNoZSBzaG91bGQgY29udGFpbiBoZXJlOgorICAgICAgICAgKiAgPz8/Pz8/Pz8KKyAgICAgICAgICogID8/PzExMTExCisgICAgICAgICAqICBOPz8xMTExMQorICAgICAgICAgKiAgTj8/MTExMTEKKyAgICAgICAgICogIE4/PzExMTExCisgICAgICAgICAqLworCisgICAgICAgIGZvciAobSA9IDA7IG0gPCAyOyBtKyspIHsKKyAgICAgICAgICAgIGlmIChoLT5tYl94ID4gMCAmJiBoLT5pbnRyYTR4NF9wcmVkX21vZGVbaC0+bWIyYnJfeHlbbWJfeHkgLSAxXSArIDZdICE9IC0xKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTMyKGgtPm12X2NhY2hlW21dW3NjYW44WzBdIC0gMSArIGkgKiA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmN1cl9waWMubW90aW9uX3ZhbFttXVtiX3h5IC0gMSArIGkgKiBoLT5iX3N0cmlkZV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBBVl9aRVJPMzIoaC0+bXZfY2FjaGVbbV1bc2NhbjhbMF0gLSAxICsgaSAqIDhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoLT5tYl95ID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShoLT5tdl9jYWNoZVttXVtzY2FuOFswXSAtIDEgKiA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgaC0+Y3VyX3BpYy5tb3Rpb25fdmFsW21dW2JfeHkgLSBoLT5iX3N0cmlkZV0sCisgICAgICAgICAgICAgICAgICAgICAgIDQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJmgtPnJlZl9jYWNoZVttXVtzY2FuOFswXSAtIDEgKiA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGgtPmludHJhNHg0X3ByZWRfbW9kZVtoLT5tYjJicl94eVttYl94eSAtIGgtPm1iX3N0cmlkZV1dID09IC0xKSA/IFBBUlRfTk9UX0FWQUlMQUJMRSA6IDEsIDQpOworCisgICAgICAgICAgICAgICAgaWYgKGgtPm1iX3ggPCBoLT5tYl93aWR0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTMyKGgtPm12X2NhY2hlW21dW3NjYW44WzBdICsgNCAtIDEgKiA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmN1cl9waWMubW90aW9uX3ZhbFttXVtiX3h5IC0gaC0+Yl9zdHJpZGUgKyA0XSk7CisgICAgICAgICAgICAgICAgICAgIGgtPnJlZl9jYWNoZVttXVtzY2FuOFswXSArIDQgLSAxICogOF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGgtPmludHJhNHg0X3ByZWRfbW9kZVtoLT5tYjJicl94eVttYl94eSAtIGgtPm1iX3N0cmlkZSArIDFdICsgNl0gPT0gLTEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoLT5pbnRyYTR4NF9wcmVkX21vZGVbaC0+bWIyYnJfeHlbbWJfeHkgLSBoLT5tYl9zdHJpZGVdXSA9PSAtMSkgPyBQQVJUX05PVF9BVkFJTEFCTEUgOiAxOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBoLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gKyA0IC0gMSAqIDhdID0gUEFSVF9OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgICAgIGlmIChoLT5tYl94ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIoaC0+bXZfY2FjaGVbbV1bc2NhbjhbMF0gLSAxIC0gMSAqIDhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+Y3VyX3BpYy5tb3Rpb25fdmFsW21dW2JfeHkgLSBoLT5iX3N0cmlkZSAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgaC0+cmVmX2NhY2hlW21dW3NjYW44WzBdIC0gMSAtIDEgKiA4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaC0+aW50cmE0eDRfcHJlZF9tb2RlW2gtPm1iMmJyX3h5W21iX3h5IC0gaC0+bWJfc3RyaWRlIC0gMV0gKyAzXSA9PSAtMSkgPyBQQVJUX05PVF9BVkFJTEFCTEUgOiAxOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBoLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gLSAxIC0gMSAqIDhdID0gUEFSVF9OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbWVtc2V0KCZoLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gLSAxICogOCAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICBQQVJUX05PVF9BVkFJTEFCTEUsIDgpOworCisgICAgICAgICAgICBpZiAoaC0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogZGVjb2RlIG1vdGlvbiB2ZWN0b3IocykgYW5kIGZvcm0gcHJlZGljdGlvbihzKSAqLworICAgICAgICBpZiAoaC0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB7CisgICAgICAgICAgICBpZiAoc3ZxM19tY19kaXIocywgbWJfdHlwZSAtIDEsIG1vZGUsIDAsIDApIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAvKiBBVl9QSUNUVVJFX1RZUEVfQiAqLworICAgICAgICAgICAgaWYgKG1iX3R5cGUgIT0gMikgeworICAgICAgICAgICAgICAgIGlmIChzdnEzX21jX2RpcihzLCAwLCBtb2RlLCAwLCAwKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGgtPmN1cl9waWMubW90aW9uX3ZhbFswXVtiX3h5ICsgaSAqIGgtPmJfc3RyaWRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYl90eXBlICE9IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3ZxM19tY19kaXIocywgMCwgbW9kZSwgMSwgbWJfdHlwZSA9PSAzKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGgtPmN1cl9waWMubW90aW9uX3ZhbFsxXVtiX3h5ICsgaSAqIGgtPmJfc3RyaWRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1iX3R5cGUgPSBNQl9UWVBFXzE2eDE2OworICAgIH0gZWxzZSBpZiAobWJfdHlwZSA9PSA4IHx8IG1iX3R5cGUgPT0gMzMpIHsgICAvKiBJTlRSQTR4NCAqLworICAgICAgICBtZW1zZXQoaC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlLCAtMSwgOCAqIDUgKiBzaXplb2YoaW50OF90KSk7CisKKyAgICAgICAgaWYgKG1iX3R5cGUgPT0gOCkgeworICAgICAgICAgICAgaWYgKGgtPm1iX3ggPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW3NjYW44WzBdIC0gMSArIGkgKiA4XSA9IGgtPmludHJhNHg0X3ByZWRfbW9kZVtoLT5tYjJicl94eVttYl94eSAtIDFdICsgNiAtIGldOworICAgICAgICAgICAgICAgIGlmIChoLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbMF0gLSAxXSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgaC0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSA9IDB4NUY1RjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoLT5tYl95ID4gMCkgeworICAgICAgICAgICAgICAgIGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs0ICsgOCAqIDBdID0gaC0+aW50cmE0eDRfcHJlZF9tb2RlW2gtPm1iMmJyX3h5W21iX3h5IC0gaC0+bWJfc3RyaWRlXSArIDBdOworICAgICAgICAgICAgICAgIGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs1ICsgOCAqIDBdID0gaC0+aW50cmE0eDRfcHJlZF9tb2RlW2gtPm1iMmJyX3h5W21iX3h5IC0gaC0+bWJfc3RyaWRlXSArIDFdOworICAgICAgICAgICAgICAgIGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs2ICsgOCAqIDBdID0gaC0+aW50cmE0eDRfcHJlZF9tb2RlW2gtPm1iMmJyX3h5W21iX3h5IC0gaC0+bWJfc3RyaWRlXSArIDJdOworICAgICAgICAgICAgICAgIGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs3ICsgOCAqIDBdID0gaC0+aW50cmE0eDRfcHJlZF9tb2RlW2gtPm1iMmJyX3h5W21iX3h5IC0gaC0+bWJfc3RyaWRlXSArIDNdOworCisgICAgICAgICAgICAgICAgaWYgKGgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs0ICsgOCAqIDBdID09IC0xKQorICAgICAgICAgICAgICAgICAgICBoLT50b3Bfc2FtcGxlc19hdmFpbGFibGUgPSAweDMzRkY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGRlY29kZSBwcmVkaWN0aW9uIGNvZGVzIGZvciBsdW1hIGJsb2NrcyAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICB2bGMgPSBzdnEzX2dldF91ZV9nb2xvbWIoJmgtPmdiKTsKKworICAgICAgICAgICAgICAgIGlmICh2bGMgPj0gMjVVKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImx1bWEgcHJlZGljdGlvbjolIlBSSXUzMiJcbiIsIHZsYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsZWZ0ID0gJmgtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtzY2FuOFtpXSAtIDFdOworICAgICAgICAgICAgICAgIHRvcCAgPSAmaC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW3NjYW44W2ldIC0gOF07CisKKyAgICAgICAgICAgICAgICBsZWZ0WzFdID0gc3ZxM19wcmVkXzFbdG9wWzBdICsgMV1bbGVmdFswXSArIDFdW3N2cTNfcHJlZF8wW3ZsY11bMF1dOworICAgICAgICAgICAgICAgIGxlZnRbMl0gPSBzdnEzX3ByZWRfMVt0b3BbMV0gKyAxXVtsZWZ0WzFdICsgMV1bc3ZxM19wcmVkXzBbdmxjXVsxXV07CisKKyAgICAgICAgICAgICAgICBpZiAobGVmdFsxXSA9PSAtMSB8fCBsZWZ0WzJdID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAid2VpcmQgcHJlZGljdGlvblxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAgIC8qIG1iX3R5cGUgPT0gMzMsIERDXzEyOF9QUkVEIGJsb2NrIHR5cGUgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgbWVtc2V0KCZoLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbMF0gKyA4ICogaV0sIERDX1BSRUQsIDQpOworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVfYmFja19pbnRyYV9wcmVkX21vZGUoaCk7CisKKyAgICAgICAgaWYgKG1iX3R5cGUgPT0gOCkgeworICAgICAgICAgICAgZmZfaDI2NF9jaGVja19pbnRyYTR4NF9wcmVkX21vZGUoaCk7CisKKyAgICAgICAgICAgIGgtPnRvcF9zYW1wbGVzX2F2YWlsYWJsZSAgPSAoaC0+bWJfeSA9PSAwKSA/IDB4MzNGRiA6IDB4RkZGRjsKKyAgICAgICAgICAgIGgtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgPSAoaC0+bWJfeCA9PSAwKSA/IDB4NUY1RiA6IDB4RkZGRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgbWVtc2V0KCZoLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbMF0gKyA4ICogaV0sIERDXzEyOF9QUkVELCA0KTsKKworICAgICAgICAgICAgaC0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlICA9IDB4MzNGRjsKKyAgICAgICAgICAgIGgtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgPSAweDVGNUY7CisgICAgICAgIH0KKworICAgICAgICBtYl90eXBlID0gTUJfVFlQRV9JTlRSQTR4NDsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBJTlRSQTE2eDE2ICovCisgICAgICAgIGRpciA9IGlfbWJfdHlwZV9pbmZvW21iX3R5cGUgLSA4XS5wcmVkX21vZGU7CisgICAgICAgIGRpciA9IChkaXIgPj4gMSkgXiAzICogKGRpciAmIDEpIF4gMTsKKworICAgICAgICBpZiAoKGgtPmludHJhMTZ4MTZfcHJlZF9tb2RlID0gZmZfaDI2NF9jaGVja19pbnRyYV9wcmVkX21vZGUoaCwgZGlyLCAwKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImZmX2gyNjRfY2hlY2tfaW50cmFfcHJlZF9tb2RlIDwgMFxuIik7CisgICAgICAgICAgICByZXR1cm4gaC0+aW50cmExNngxNl9wcmVkX21vZGU7CisgICAgICAgIH0KKworICAgICAgICBjYnAgICAgID0gaV9tYl90eXBlX2luZm9bbWJfdHlwZSAtIDhdLmNicDsKKyAgICAgICAgbWJfdHlwZSA9IE1CX1RZUEVfSU5UUkExNngxNjsKKyAgICB9CisKKyAgICBpZiAoIUlTX0lOVEVSKG1iX3R5cGUpICYmIGgtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgbWVtc2V0KGgtPmN1cl9waWMubW90aW9uX3ZhbFswXVtiX3h5ICsgaSAqIGgtPmJfc3RyaWRlXSwKKyAgICAgICAgICAgICAgICAgICAwLCA0ICogMiAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIGlmIChoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgbWVtc2V0KGgtPmN1cl9waWMubW90aW9uX3ZhbFsxXVtiX3h5ICsgaSAqIGgtPmJfc3RyaWRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgNCAqIDIgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICB9CisgICAgfQorICAgIGlmICghSVNfSU5UUkE0eDQobWJfdHlwZSkpIHsKKyAgICAgICAgbWVtc2V0KGgtPmludHJhNHg0X3ByZWRfbW9kZSArIGgtPm1iMmJyX3h5W21iX3h5XSwgRENfUFJFRCwgOCk7CisgICAgfQorICAgIGlmICghSVNfU0tJUChtYl90eXBlKSB8fCBoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgbWVtc2V0KGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlICsgOCwgMCwgMTQgKiA4ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICB9CisKKyAgICBpZiAoIUlTX0lOVFJBMTZ4MTYobWJfdHlwZSkgJiYKKyAgICAgICAgKCFJU19TS0lQKG1iX3R5cGUpIHx8IGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikpIHsKKyAgICAgICAgaWYgKCh2bGMgPSBzdnEzX2dldF91ZV9nb2xvbWIoJmgtPmdiKSkgPj0gNDhVKXsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2JwX3ZsYz0lIlBSSXUzMiJcbiIsIHZsYyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBjYnAgPSBJU19JTlRSQShtYl90eXBlKSA/IGdvbG9tYl90b19pbnRyYTR4NF9jYnBbdmxjXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdvbG9tYl90b19pbnRlcl9jYnBbdmxjXTsKKyAgICB9CisgICAgaWYgKElTX0lOVFJBMTZ4MTYobWJfdHlwZSkgfHwKKyAgICAgICAgKGgtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSAmJiBzLT5hZGFwdGl2ZV9xdWFudCAmJiBjYnApKSB7CisgICAgICAgIGgtPnFzY2FsZSArPSBzdnEzX2dldF9zZV9nb2xvbWIoJmgtPmdiKTsKKworICAgICAgICBpZiAoaC0+cXNjYWxlID4gMzF1KSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInFzY2FsZTolZFxuIiwgaC0+cXNjYWxlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoSVNfSU5UUkExNngxNihtYl90eXBlKSkgeworICAgICAgICBBVl9aRVJPMTI4KGgtPm1iX2x1bWFfZGNbMF0gKyAwKTsKKyAgICAgICAgQVZfWkVSTzEyOChoLT5tYl9sdW1hX2RjWzBdICsgOCk7CisgICAgICAgIGlmIChzdnEzX2RlY29kZV9ibG9jaygmaC0+Z2IsIGgtPm1iX2x1bWFfZGNbMF0sIDAsIDEpKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiZXJyb3Igd2hpbGUgZGVjb2RpbmcgaW50cmEgbHVtYSBkY1xuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2JwKSB7CisgICAgICAgIGNvbnN0IGludCBpbmRleCA9IElTX0lOVFJBMTZ4MTYobWJfdHlwZSkgPyAxIDogMDsKKyAgICAgICAgY29uc3QgaW50IHR5cGUgID0gKChoLT5xc2NhbGUgPCAyNCAmJiBJU19JTlRSQTR4NChtYl90eXBlKSkgPyAyIDogMSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIGlmICgoY2JwICYgKDEgPDwgaSkpKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBrID0gaW5kZXggPyAoMSAqIChqICYgMSkgKyAyICogKGkgJiAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogKGogJiAyKSArIDQgKiAoaSAmIDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoNCAqIGkgKyBqKTsKKyAgICAgICAgICAgICAgICAgICAgaC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2Nhbjhba11dID0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZxM19kZWNvZGVfYmxvY2soJmgtPmdiLCAmaC0+bWJbMTYgKiBrXSwgaW5kZXgsIHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3Igd2hpbGUgZGVjb2RpbmcgYmxvY2tcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIGlmICgoY2JwICYgMHgzMCkpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCAzOyArK2kpCisgICAgICAgICAgICAgICAgaWYgKHN2cTNfZGVjb2RlX2Jsb2NrKCZoLT5nYiwgJmgtPm1iWzE2ICogMTYgKiBpXSwgMCwgMykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3Igd2hpbGUgZGVjb2RpbmcgY2hyb21hIGRjIGJsb2NrXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChjYnAgJiAweDIwKSkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYgKiBpICsgajsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W2tdXSA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdnEzX2RlY29kZV9ibG9jaygmaC0+Z2IsICZoLT5tYlsxNiAqIGtdLCAxLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3Igd2hpbGUgZGVjb2RpbmcgY2hyb21hIGFjIGJsb2NrXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBoLT5jYnAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNicDsKKyAgICBoLT5jdXJfcGljLm1iX3R5cGVbbWJfeHldID0gbWJfdHlwZTsKKworICAgIGlmIChJU19JTlRSQShtYl90eXBlKSkKKyAgICAgICAgaC0+Y2hyb21hX3ByZWRfbW9kZSA9IGZmX2gyNjRfY2hlY2tfaW50cmFfcHJlZF9tb2RlKGgsIERDX1BSRUQ4eDgsIDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3ZxM19kZWNvZGVfc2xpY2VfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTVlEzQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgSDI2NENvbnRleHQgKmggICAgPSAmcy0+aDsKKyAgICBjb25zdCBpbnQgbWJfeHkgICA9IGgtPm1iX3h5OworICAgIGludCBpLCBoZWFkZXI7CisgICAgdW5zaWduZWQgc2xpY2VfaWQ7CisKKyAgICBoZWFkZXIgPSBnZXRfYml0cygmaC0+Z2IsIDgpOworCisgICAgaWYgKCgoaGVhZGVyICYgMHg5RikgIT0gMSAmJiAoaGVhZGVyICYgMHg5RikgIT0gMikgfHwgKGhlYWRlciAmIDB4NjApID09IDApIHsKKyAgICAgICAgLyogVE9ETzogd2hhdD8gKi8KKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBzbGljZSBoZWFkZXIgKCUwMlgpXG4iLCBoZWFkZXIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IGhlYWRlciA+PiA1ICYgMzsKKworICAgICAgICBzLT5uZXh0X3NsaWNlX2luZGV4ID0gZ2V0X2JpdHNfY291bnQoJmgtPmdiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICogc2hvd19iaXRzKCZoLT5nYiwgOCAqIGxlbmd0aCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAqIGxlbmd0aDsKKworICAgICAgICBpZiAocy0+bmV4dF9zbGljZV9pbmRleCA+IGgtPmdiLnNpemVfaW5fYml0cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJzbGljZSBhZnRlciBiaXRzdHJlYW0gZW5kXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGgtPmdiLnNpemVfaW5fYml0cyA9IHMtPm5leHRfc2xpY2VfaW5kZXggLSA4ICogKGxlbmd0aCAtIDEpOworICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCA4KTsKKworICAgICAgICBpZiAocy0+d2F0ZXJtYXJrX2tleSkgeworICAgICAgICAgICAgdWludDMyX3QgaGVhZGVyID0gQVZfUkwzMigmaC0+Z2IuYnVmZmVyWyhnZXRfYml0c19jb3VudCgmaC0+Z2IpID4+IDMpICsgMV0pOworICAgICAgICAgICAgQVZfV0wzMigmaC0+Z2IuYnVmZmVyWyhnZXRfYml0c19jb3VudCgmaC0+Z2IpID4+IDMpICsgMV0sCisgICAgICAgICAgICAgICAgICAgIGhlYWRlciBeIHMtPndhdGVybWFya19rZXkpOworICAgICAgICB9CisgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICBtZW1tb3ZlKCh1aW50OF90ICopICZoLT5nYi5idWZmZXJbZ2V0X2JpdHNfY291bnQoJmgtPmdiKSA+PiAzXSwKKyAgICAgICAgICAgICAgICAgICAgJmgtPmdiLmJ1ZmZlcltoLT5nYi5zaXplX2luX2JpdHMgPj4gM10sIGxlbmd0aCAtIDEpOworICAgICAgICB9CisgICAgICAgIHNraXBfYml0c19sb25nKCZoLT5nYiwgMCk7CisgICAgfQorCisgICAgaWYgKChzbGljZV9pZCA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmaC0+Z2IpKSA+PSAzKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBzbGljZSB0eXBlICV1IFxuIiwgc2xpY2VfaWQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaC0+c2xpY2VfdHlwZSA9IGdvbG9tYl90b19waWN0X3R5cGVbc2xpY2VfaWRdOworCisgICAgaWYgKChoZWFkZXIgJiAweDlGKSA9PSAyKSB7CisgICAgICAgIGkgICAgICAgICAgICAgID0gKGgtPm1iX251bSA8IDY0KSA/IDYgOiAoMSArIGF2X2xvZzIoaC0+bWJfbnVtIC0gMSkpOworICAgICAgICBoLT5tYl9za2lwX3J1biA9IGdldF9iaXRzKCZoLT5nYiwgaSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5tYl95ICogaC0+bWJfd2lkdGggKyBoLT5tYl94KTsKKyAgICB9IGVsc2UgeworICAgICAgICBza2lwX2JpdHMxKCZoLT5nYik7CisgICAgICAgIGgtPm1iX3NraXBfcnVuID0gMDsKKyAgICB9CisKKyAgICBoLT5zbGljZV9udW0gICAgICA9IGdldF9iaXRzKCZoLT5nYiwgOCk7CisgICAgaC0+cXNjYWxlICAgICAgICAgPSBnZXRfYml0cygmaC0+Z2IsIDUpOworICAgIHMtPmFkYXB0aXZlX3F1YW50ID0gZ2V0X2JpdHMxKCZoLT5nYik7CisKKyAgICAvKiB1bmtub3duIGZpZWxkcyAqLworICAgIHNraXBfYml0czEoJmgtPmdiKTsKKworICAgIGlmIChzLT51bmtub3duX2ZsYWcpCisgICAgICAgIHNraXBfYml0czEoJmgtPmdiKTsKKworICAgIHNraXBfYml0czEoJmgtPmdiKTsKKyAgICBza2lwX2JpdHMoJmgtPmdiLCAyKTsKKworICAgIGlmIChza2lwXzFzdG9wXzhkYXRhX2JpdHMoJmgtPmdiKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLyogcmVzZXQgaW50cmEgcHJlZGljdG9ycyBhbmQgaW52YWxpZGF0ZSBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZXMgKi8KKyAgICBpZiAoaC0+bWJfeCA+IDApIHsKKyAgICAgICAgbWVtc2V0KGgtPmludHJhNHg0X3ByZWRfbW9kZSArIGgtPm1iMmJyX3h5W21iX3h5IC0gMV0gKyAzLAorICAgICAgICAgICAgICAgLTEsIDQgKiBzaXplb2YoaW50OF90KSk7CisgICAgICAgIG1lbXNldChoLT5pbnRyYTR4NF9wcmVkX21vZGUgKyBoLT5tYjJicl94eVttYl94eSAtIGgtPm1iX3hdLAorICAgICAgICAgICAgICAgLTEsIDggKiBzaXplb2YoaW50OF90KSAqIGgtPm1iX3gpOworICAgIH0KKyAgICBpZiAoaC0+bWJfeSA+IDApIHsKKyAgICAgICAgbWVtc2V0KGgtPmludHJhNHg0X3ByZWRfbW9kZSArIGgtPm1iMmJyX3h5W21iX3h5IC0gaC0+bWJfc3RyaWRlXSwKKyAgICAgICAgICAgICAgIC0xLCA4ICogc2l6ZW9mKGludDhfdCkgKiAoaC0+bWJfd2lkdGggLSBoLT5tYl94KSk7CisKKyAgICAgICAgaWYgKGgtPm1iX3ggPiAwKQorICAgICAgICAgICAgaC0+aW50cmE0eDRfcHJlZF9tb2RlW2gtPm1iMmJyX3h5W21iX3h5IC0gaC0+bWJfc3RyaWRlIC0gMV0gKyAzXSA9IC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgc3ZxM19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU1ZRM0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEgyNjRDb250ZXh0ICpoID0gJnMtPmg7CisgICAgaW50IG07CisgICAgdW5zaWduZWQgY2hhciAqZXh0cmFkYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKmV4dHJhZGF0YV9lbmQ7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgaW50IG1hcmtlcl9mb3VuZCA9IDA7CisgICAgaW50IHJldDsKKworICAgIHMtPmN1cl9waWMgID0gYXZfbWFsbG9jeihzaXplb2YoKnMtPmN1cl9waWMpKTsKKyAgICBzLT5sYXN0X3BpYyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzLT5sYXN0X3BpYykpOworICAgIHMtPm5leHRfcGljID0gYXZfbWFsbG9jeihzaXplb2YoKnMtPm5leHRfcGljKSk7CisgICAgaWYgKCFzLT5uZXh0X3BpYyB8fCAhcy0+bGFzdF9waWMgfHwgIXMtPmN1cl9waWMpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9oMjY0X2RlY29kZV9pbml0KGF2Y3R4KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBmZl9ocGVsZHNwX2luaXQoJnMtPmhkc3AsIGF2Y3R4LT5mbGFncyk7CisgICAgZmZfdHBlbGRzcF9pbml0KCZzLT50ZHNwKTsKKworICAgIGgtPmZsYWdzICAgICAgICAgICA9IGF2Y3R4LT5mbGFnczsKKyAgICBoLT5pc19jb21wbGV4ICAgICAgPSAxOworICAgIGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA9IDE7CisgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBQSUNUX0ZSQU1FOworICAgIGF2Y3R4LT5waXhfZm10ICAgICA9IEFWX1BJWF9GTVRfWVVWSjQyMFA7CisgICAgYXZjdHgtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfSlBFRzsKKworICAgIGgtPmNocm9tYV9xcFswXSA9IGgtPmNocm9tYV9xcFsxXSA9IDQ7CisgICAgaC0+Y2hyb21hX3hfc2hpZnQgPSBoLT5jaHJvbWFfeV9zaGlmdCA9IDE7CisKKyAgICBzLT5oYWxmcGVsX2ZsYWcgID0gMTsKKyAgICBzLT50aGlyZHBlbF9mbGFnID0gMTsKKyAgICBzLT51bmtub3duX2ZsYWcgID0gMDsKKworICAgIC8qIHByb3dsIGZvciB0aGUgIlNFUUgiIG1hcmtlciBpbiB0aGUgZXh0cmFkYXRhICovCisgICAgZXh0cmFkYXRhICAgICA9ICh1bnNpZ25lZCBjaGFyICopYXZjdHgtPmV4dHJhZGF0YTsKKyAgICBleHRyYWRhdGFfZW5kID0gYXZjdHgtPmV4dHJhZGF0YSArIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZTsKKyAgICBpZiAoZXh0cmFkYXRhKSB7CisgICAgICAgIGZvciAobSA9IDA7IG0gKyA4IDwgYXZjdHgtPmV4dHJhZGF0YV9zaXplOyBtKyspIHsKKyAgICAgICAgICAgIGlmICghbWVtY21wKGV4dHJhZGF0YSwgIlNFUUgiLCA0KSkgeworICAgICAgICAgICAgICAgIG1hcmtlcl9mb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHRyYWRhdGErKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIGEgbWF0Y2ggd2FzIGZvdW5kLCBwYXJzZSB0aGUgZXh0cmEgZGF0YSAqLworICAgIGlmIChtYXJrZXJfZm91bmQpIHsKKyAgICAgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICAgICAgaW50IGZyYW1lX3NpemVfY29kZTsKKworICAgICAgICBzaXplID0gQVZfUkIzMigmZXh0cmFkYXRhWzRdKTsKKyAgICAgICAgaWYgKHNpemUgPiBleHRyYWRhdGFfZW5kIC0gZXh0cmFkYXRhIC0gOCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgZXh0cmFkYXRhICsgOCwgc2l6ZSAqIDgpOworCisgICAgICAgIC8qICdmcmFtZSBzaXplIGNvZGUnIGFuZCBvcHRpb25hbCAnd2lkdGgsIGhlaWdodCcgKi8KKyAgICAgICAgZnJhbWVfc2l6ZV9jb2RlID0gZ2V0X2JpdHMoJmdiLCAzKTsKKyAgICAgICAgc3dpdGNoIChmcmFtZV9zaXplX2NvZGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgYXZjdHgtPndpZHRoICA9IDE2MDsKKyAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSAxMjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgYXZjdHgtPndpZHRoICA9IDEyODsKKyAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSAgOTY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgYXZjdHgtPndpZHRoICA9IDE3NjsKKyAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSAxNDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgYXZjdHgtPndpZHRoICA9IDM1MjsKKyAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSAyODg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgYXZjdHgtPndpZHRoICA9IDcwNDsKKyAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSA1NzY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgYXZjdHgtPndpZHRoICA9IDI0MDsKKyAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSAxODA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgYXZjdHgtPndpZHRoICA9IDMyMDsKKyAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSAyNDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgYXZjdHgtPndpZHRoICA9IGdldF9iaXRzKCZnYiwgMTIpOworICAgICAgICAgICAgYXZjdHgtPmhlaWdodCA9IGdldF9iaXRzKCZnYiwgMTIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzLT5oYWxmcGVsX2ZsYWcgID0gZ2V0X2JpdHMxKCZnYik7CisgICAgICAgIHMtPnRoaXJkcGVsX2ZsYWcgPSBnZXRfYml0czEoJmdiKTsKKworICAgICAgICAvKiB1bmtub3duIGZpZWxkcyAqLworICAgICAgICBza2lwX2JpdHMxKCZnYik7CisgICAgICAgIHNraXBfYml0czEoJmdiKTsKKyAgICAgICAgc2tpcF9iaXRzMSgmZ2IpOworICAgICAgICBza2lwX2JpdHMxKCZnYik7CisKKyAgICAgICAgaC0+bG93X2RlbGF5ID0gZ2V0X2JpdHMxKCZnYik7CisKKyAgICAgICAgLyogdW5rbm93biBmaWVsZCAqLworICAgICAgICBza2lwX2JpdHMxKCZnYik7CisKKyAgICAgICAgaWYgKHNraXBfMXN0b3BfOGRhdGFfYml0cygmZ2IpIDwgMCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHMtPnVua25vd25fZmxhZyAgPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgYXZjdHgtPmhhc19iX2ZyYW1lcyA9ICFoLT5sb3dfZGVsYXk7CisgICAgICAgIGlmIChzLT51bmtub3duX2ZsYWcpIHsKKyNpZiBDT05GSUdfWkxJQgorICAgICAgICAgICAgdW5zaWduZWQgd2F0ZXJtYXJrX3dpZHRoICA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmZ2IpOworICAgICAgICAgICAgdW5zaWduZWQgd2F0ZXJtYXJrX2hlaWdodCA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmZ2IpOworICAgICAgICAgICAgaW50IHUxICAgICAgICAgICAgICAgICAgICA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmZ2IpOworICAgICAgICAgICAgaW50IHUyICAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzKCZnYiwgOCk7CisgICAgICAgICAgICBpbnQgdTMgICAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoJmdiLCAyKTsKKyAgICAgICAgICAgIGludCB1NCAgICAgICAgICAgICAgICAgICAgPSBzdnEzX2dldF91ZV9nb2xvbWIoJmdiKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmX2xlbiAgICAgPSB3YXRlcm1hcmtfd2lkdGggKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWFya19oZWlnaHQgKiA0OworICAgICAgICAgICAgaW50IG9mZnNldCAgICAgICAgICAgICAgICA9IGdldF9iaXRzX2NvdW50KCZnYikgKyA3ID4+IDM7CisgICAgICAgICAgICB1aW50OF90ICpidWY7CisKKyAgICAgICAgICAgIGlmICh3YXRlcm1hcmtfaGVpZ2h0IDw9IDAgfHwKKyAgICAgICAgICAgICAgICAodWludDY0X3Qpd2F0ZXJtYXJrX3dpZHRoICogNCA+IFVJTlRfTUFYIC8gd2F0ZXJtYXJrX2hlaWdodCkgeworICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmID0gYXZfbWFsbG9jKGJ1Zl9sZW4pOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJ3YXRlcm1hcmsgc2l6ZTogJXV4JXVcbiIsCisgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXJrX3dpZHRoLCB3YXRlcm1hcmtfaGVpZ2h0KTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJ1MTogJXggdTI6ICV4IHUzOiAleCBjb21wcmVzc2VkIGRhdGEgc2l6ZTogJWQgb2Zmc2V0OiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICB1MSwgdTIsIHUzLCB1NCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGlmICh1bmNvbXByZXNzKGJ1ZiwgJmJ1Zl9sZW4sIGV4dHJhZGF0YSArIDggKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC0gb2Zmc2V0KSAhPSBaX09LKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgdW5jb21wcmVzcyB3YXRlcm1hcmsgbG9nb1xuIik7CisgICAgICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPndhdGVybWFya19rZXkgPSBmZl9zdnExX3BhY2tldF9jaGVja3N1bShidWYsIGJ1Zl9sZW4sIDApOworICAgICAgICAgICAgcy0+d2F0ZXJtYXJrX2tleSA9IHMtPndhdGVybWFya19rZXkgPDwgMTYgfCBzLT53YXRlcm1hcmtfa2V5OworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgIndhdGVybWFyayBrZXkgJSMiUFJJeDMyIlxuIiwgcy0+d2F0ZXJtYXJrX2tleSk7CisgICAgICAgICAgICBhdl9mcmVlKGJ1Zik7CisjZWxzZQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgInRoaXMgc3ZxMyBmaWxlIGNvbnRhaW5zIHdhdGVybWFyayB3aGljaCBuZWVkIHpsaWIgc3VwcG9ydCBjb21waWxlZCBpblxuIik7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgaC0+d2lkdGggID0gYXZjdHgtPndpZHRoOworICAgIGgtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgaC0+bWJfd2lkdGggID0gKGgtPndpZHRoICsgMTUpIC8gMTY7CisgICAgaC0+bWJfaGVpZ2h0ID0gKGgtPmhlaWdodCArIDE1KSAvIDE2OworICAgIGgtPm1iX3N0cmlkZSA9IGgtPm1iX3dpZHRoICsgMTsKKyAgICBoLT5tYl9udW0gICAgPSBoLT5tYl93aWR0aCAqIGgtPm1iX2hlaWdodDsKKyAgICBoLT5iX3N0cmlkZSA9IDQgKiBoLT5tYl93aWR0aDsKKyAgICBzLT5oX2VkZ2VfcG9zID0gaC0+bWJfd2lkdGggKiAxNjsKKyAgICBzLT52X2VkZ2VfcG9zID0gaC0+bWJfaGVpZ2h0ICogMTY7CisKKyAgICBpZiAoKHJldCA9IGZmX2gyNjRfYWxsb2NfdGFibGVzKGgpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJzdnEzIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgc3ZxM19kZWNvZGVfZW5kKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BpY3R1cmUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBIMjY0UGljdHVyZSAqcGljKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZwaWMtPm1vdGlvbl92YWxfYnVmW2ldKTsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZwaWMtPnJlZl9pbmRleF9idWZbaV0pOworICAgIH0KKyAgICBhdl9idWZmZXJfdW5yZWYoJnBpYy0+bWJfdHlwZV9idWYpOworCisgICAgYXZfZnJhbWVfdW5yZWYoJnBpYy0+Zik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEgyNjRQaWN0dXJlICpwaWMpCit7CisgICAgU1ZRM0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEgyNjRDb250ZXh0ICpoID0gJnMtPmg7CisgICAgY29uc3QgaW50IGJpZ19tYl9udW0gICAgPSBoLT5tYl9zdHJpZGUgKiAoaC0+bWJfaGVpZ2h0ICsgMSkgKyAxOworICAgIGNvbnN0IGludCBtYl9hcnJheV9zaXplID0gaC0+bWJfc3RyaWRlICogaC0+bWJfaGVpZ2h0OworICAgIGNvbnN0IGludCBiNF9zdHJpZGUgICAgID0gaC0+bWJfd2lkdGggKiA0ICsgMTsKKyAgICBjb25zdCBpbnQgYjRfYXJyYXlfc2l6ZSA9IGI0X3N0cmlkZSAqIGgtPm1iX2hlaWdodCAqIDQ7CisgICAgaW50IHJldDsKKworICAgIGlmICghcGljLT5tb3Rpb25fdmFsX2J1ZlswXSkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBwaWMtPm1iX3R5cGVfYnVmID0gYXZfYnVmZmVyX2FsbG9jeigoYmlnX21iX251bSArIGgtPm1iX3N0cmlkZSkgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgaWYgKCFwaWMtPm1iX3R5cGVfYnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcGljLT5tYl90eXBlID0gKHVpbnQzMl90KilwaWMtPm1iX3R5cGVfYnVmLT5kYXRhICsgMiAqIGgtPm1iX3N0cmlkZSArIDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgcGljLT5tb3Rpb25fdmFsX2J1ZltpXSA9IGF2X2J1ZmZlcl9hbGxvY3ooMiAqIChiNF9hcnJheV9zaXplICsgNCkgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgcGljLT5yZWZfaW5kZXhfYnVmW2ldICA9IGF2X2J1ZmZlcl9hbGxvY3ooNCAqIG1iX2FycmF5X3NpemUpOworICAgICAgICAgICAgaWYgKCFwaWMtPm1vdGlvbl92YWxfYnVmW2ldIHx8ICFwaWMtPnJlZl9pbmRleF9idWZbaV0pIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwaWMtPm1vdGlvbl92YWxbaV0gPSAoaW50MTZfdCAoKilbMl0pcGljLT5tb3Rpb25fdmFsX2J1ZltpXS0+ZGF0YSArIDQ7CisgICAgICAgICAgICBwaWMtPnJlZl9pbmRleFtpXSAgPSBwaWMtPnJlZl9pbmRleF9idWZbaV0tPmRhdGE7CisgICAgICAgIH0KKyAgICB9CisgICAgcGljLT5yZWZlcmVuY2UgPSAhKGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQik7CisKKyAgICByZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCAmcGljLT5mLAorICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5yZWZlcmVuY2UgPyBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGIDogMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmICghaC0+ZWRnZV9lbXVfYnVmZmVyKSB7CisgICAgICAgIGgtPmVkZ2VfZW11X2J1ZmZlciA9IGF2X21hbGxvY3oocGljLT5mLmxpbmVzaXplWzBdICogMTcpOworICAgICAgICBpZiAoIWgtPmVkZ2VfZW11X2J1ZmZlcikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaC0+bGluZXNpemUgICA9IHBpYy0+Zi5saW5lc2l6ZVswXTsKKyAgICBoLT51dmxpbmVzaXplID0gcGljLT5mLmxpbmVzaXplWzFdOworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGZyZWVfcGljdHVyZShhdmN0eCwgcGljKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN2cTNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBTVlEzQ29udGV4dCAqcyAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEgyNjRDb250ZXh0ICpoICAgICA9ICZzLT5oOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIGludCBsZWZ0OworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICBpbnQgcmV0LCBtLCBpOworCisgICAgLyogc3BlY2lhbCBjYXNlIGZvciBsYXN0IHBpY3R1cmUgKi8KKyAgICBpZiAoYnVmX3NpemUgPT0gMCkgeworICAgICAgICBpZiAocy0+bmV4dF9waWMtPmYuZGF0YVswXSAmJiAhaC0+bG93X2RlbGF5ICYmICFzLT5sYXN0X2ZyYW1lX291dHB1dCkgeworICAgICAgICAgICAgcmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsICZzLT5uZXh0X3BpYy0+Zik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcy0+bGFzdF9mcmFtZV9vdXRwdXQgPSAxOworICAgICAgICAgICAgKmdvdF9mcmFtZSAgICAgICAgICA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaC0+bWJfeCA9IGgtPm1iX3kgPSBoLT5tYl94eSA9IDA7CisKKyAgICBpZiAocy0+d2F0ZXJtYXJrX2tleSkgeworICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnMtPmJ1ZiwgJnMtPmJ1Zl9zaXplLCBidWZfc2l6ZSk7CisgICAgICAgIGlmICghcy0+YnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KHMtPmJ1ZiwgYXZwa3QtPmRhdGEsIGJ1Zl9zaXplKTsKKyAgICAgICAgYnVmID0gcy0+YnVmOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIH0KKworICAgIGluaXRfZ2V0X2JpdHMoJmgtPmdiLCBidWYsIDggKiBidWZfc2l6ZSk7CisKKyAgICBpZiAoc3ZxM19kZWNvZGVfc2xpY2VfaGVhZGVyKGF2Y3R4KSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaC0+cGljdF90eXBlID0gaC0+c2xpY2VfdHlwZTsKKworICAgIGlmIChoLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgIEZGU1dBUChIMjY0UGljdHVyZSosIHMtPm5leHRfcGljLCBzLT5sYXN0X3BpYyk7CisKKyAgICBhdl9mcmFtZV91bnJlZigmcy0+Y3VyX3BpYy0+Zik7CisKKyAgICAvKiBmb3Igc2tpcHBpbmcgdGhlIGZyYW1lICovCisgICAgcy0+Y3VyX3BpYy0+Zi5waWN0X3R5cGUgPSBoLT5waWN0X3R5cGU7CisgICAgcy0+Y3VyX3BpYy0+Zi5rZXlfZnJhbWUgPSAoaC0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKTsKKworICAgIHJldCA9IGdldF9idWZmZXIoYXZjdHgsIHMtPmN1cl9waWMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaC0+Y3VyX3BpY19wdHIgPSBzLT5jdXJfcGljOworICAgIGF2X2ZyYW1lX3VucmVmKCZoLT5jdXJfcGljLmYpOworICAgIG1lbWNweSgmaC0+Y3VyX3BpYy50ZiwgJnMtPmN1cl9waWMtPnRmLCBzaXplb2YoaC0+Y3VyX3BpYykgLSBvZmZzZXRvZihIMjY0UGljdHVyZSwgdGYpKTsKKyAgICByZXQgPSBhdl9mcmFtZV9yZWYoJmgtPmN1cl9waWMuZiwgJnMtPmN1cl9waWMtPmYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgaC0+YmxvY2tfb2Zmc2V0W2ldICAgICAgICAgICA9ICg0ICogKChzY2FuOFtpXSAtIHNjYW44WzBdKSAmIDcpKSArIDQgKiBoLT5saW5lc2l6ZSAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgPj4gMyk7CisgICAgICAgIGgtPmJsb2NrX29mZnNldFs0OCArIGldICAgICAgPSAoNCAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgJiA3KSkgKyA4ICogaC0+bGluZXNpemUgKiAoKHNjYW44W2ldIC0gc2NhbjhbMF0pID4+IDMpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBoLT5ibG9ja19vZmZzZXRbMTYgKyBpXSAgICAgID0KKyAgICAgICAgaC0+YmxvY2tfb2Zmc2V0WzMyICsgaV0gICAgICA9ICg0ICogKChzY2FuOFtpXSAtIHNjYW44WzBdKSAmIDcpKSArIDQgKiBoLT51dmxpbmVzaXplICogKChzY2FuOFtpXSAtIHNjYW44WzBdKSA+PiAzKTsKKyAgICAgICAgaC0+YmxvY2tfb2Zmc2V0WzQ4ICsgMTYgKyBpXSA9CisgICAgICAgIGgtPmJsb2NrX29mZnNldFs0OCArIDMyICsgaV0gPSAoNCAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgJiA3KSkgKyA4ICogaC0+dXZsaW5lc2l6ZSAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgPj4gMyk7CisgICAgfQorCisgICAgaWYgKGgtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICBpZiAoIXMtPmxhc3RfcGljLT5mLmRhdGFbMF0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyByZWZlcmVuY2UgZnJhbWUuXG4iKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKCZzLT5sYXN0X3BpYy0+Zik7CisgICAgICAgICAgICByZXQgPSBnZXRfYnVmZmVyKGF2Y3R4LCBzLT5sYXN0X3BpYyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgbWVtc2V0KHMtPmxhc3RfcGljLT5mLmRhdGFbMF0sIDAsIGF2Y3R4LT5oZWlnaHQgKiBzLT5sYXN0X3BpYy0+Zi5saW5lc2l6ZVswXSk7CisgICAgICAgICAgICBtZW1zZXQocy0+bGFzdF9waWMtPmYuZGF0YVsxXSwgMHg4MCwgKGF2Y3R4LT5oZWlnaHQgLyAyKSAqCisgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9waWMtPmYubGluZXNpemVbMV0pOworICAgICAgICAgICAgbWVtc2V0KHMtPmxhc3RfcGljLT5mLmRhdGFbMl0sIDB4ODAsIChhdmN0eC0+aGVpZ2h0IC8gMikgKgorICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfcGljLT5mLmxpbmVzaXplWzJdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgIXMtPm5leHRfcGljLT5mLmRhdGFbMF0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyByZWZlcmVuY2UgZnJhbWUuXG4iKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKCZzLT5uZXh0X3BpYy0+Zik7CisgICAgICAgICAgICByZXQgPSBnZXRfYnVmZmVyKGF2Y3R4LCBzLT5uZXh0X3BpYyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgbWVtc2V0KHMtPm5leHRfcGljLT5mLmRhdGFbMF0sIDAsIGF2Y3R4LT5oZWlnaHQgKiBzLT5uZXh0X3BpYy0+Zi5saW5lc2l6ZVswXSk7CisgICAgICAgICAgICBtZW1zZXQocy0+bmV4dF9waWMtPmYuZGF0YVsxXSwgMHg4MCwgKGF2Y3R4LT5oZWlnaHQgLyAyKSAqCisgICAgICAgICAgICAgICAgICAgcy0+bmV4dF9waWMtPmYubGluZXNpemVbMV0pOworICAgICAgICAgICAgbWVtc2V0KHMtPm5leHRfcGljLT5mLmRhdGFbMl0sIDB4ODAsIChhdmN0eC0+aGVpZ2h0IC8gMikgKgorICAgICAgICAgICAgICAgICAgIHMtPm5leHRfcGljLT5mLmxpbmVzaXplWzJdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pCisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgIiVjIGhwZWw6JWQsIHRwZWw6JWQgYXFwOiVkIHFwOiVkLCBzbGljZV9udW06JTAyWFxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihoLT5waWN0X3R5cGUpLAorICAgICAgICAgICAgICAgcy0+aGFsZnBlbF9mbGFnLCBzLT50aGlyZHBlbF9mbGFnLAorICAgICAgICAgICAgICAgcy0+YWRhcHRpdmVfcXVhbnQsIGgtPnFzY2FsZSwgaC0+c2xpY2VfbnVtKTsKKworICAgIGlmIChhdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfTk9OUkVGICYmIGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiB8fAorICAgICAgICBhdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfTk9OS0VZICYmIGgtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSB8fAorICAgICAgICBhdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfQUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzLT5uZXh0X3BfZnJhbWVfZGFtYWdlZCkgeworICAgICAgICBpZiAoaC0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPm5leHRfcF9mcmFtZV9kYW1hZ2VkID0gMDsKKyAgICB9CisKKyAgICBpZiAoaC0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIGgtPmZyYW1lX251bV9vZmZzZXQgPSBoLT5zbGljZV9udW0gLSBoLT5wcmV2X2ZyYW1lX251bTsKKworICAgICAgICBpZiAoaC0+ZnJhbWVfbnVtX29mZnNldCA8IDApCisgICAgICAgICAgICBoLT5mcmFtZV9udW1fb2Zmc2V0ICs9IDI1NjsKKyAgICAgICAgaWYgKGgtPmZyYW1lX251bV9vZmZzZXQgPT0gMCB8fAorICAgICAgICAgICAgaC0+ZnJhbWVfbnVtX29mZnNldCA+PSBoLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgaW4gQi1mcmFtZSBwaWN0dXJlIGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGgtPnByZXZfZnJhbWVfbnVtICAgICAgICA9IGgtPmZyYW1lX251bTsKKyAgICAgICAgaC0+ZnJhbWVfbnVtICAgICAgICAgICAgID0gaC0+c2xpY2VfbnVtOworICAgICAgICBoLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgPSBoLT5mcmFtZV9udW0gLSBoLT5wcmV2X2ZyYW1lX251bTsKKworICAgICAgICBpZiAoaC0+cHJldl9mcmFtZV9udW1fb2Zmc2V0IDwgMCkKKyAgICAgICAgICAgIGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCArPSAyNTY7CisgICAgfQorCisgICAgZm9yIChtID0gMDsgbSA8IDI7IG0rKykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBmb3IgKGogPSAtMTsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgICAgICBoLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gKyA4ICogaSArIGpdID0gMTsKKyAgICAgICAgICAgIGlmIChpIDwgMykKKyAgICAgICAgICAgICAgICBoLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gKyA4ICogaSArIGpdID0gUEFSVF9OT1RfQVZBSUxBQkxFOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChoLT5tYl95ID0gMDsgaC0+bWJfeSA8IGgtPm1iX2hlaWdodDsgaC0+bWJfeSsrKSB7CisgICAgICAgIGZvciAoaC0+bWJfeCA9IDA7IGgtPm1iX3ggPCBoLT5tYl93aWR0aDsgaC0+bWJfeCsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBtYl90eXBlOworICAgICAgICAgICAgaC0+bWJfeHkgPSBoLT5tYl94ICsgaC0+bWJfeSAqIGgtPm1iX3N0cmlkZTsKKworICAgICAgICAgICAgaWYgKChnZXRfYml0c19jb3VudCgmaC0+Z2IpICsgNykgPj0gaC0+Z2Iuc2l6ZV9pbl9iaXRzICYmCisgICAgICAgICAgICAgICAgKChnZXRfYml0c19jb3VudCgmaC0+Z2IpICYgNykgPT0gMCB8fAorICAgICAgICAgICAgICAgICBzaG93X2JpdHMoJmgtPmdiLCAtZ2V0X2JpdHNfY291bnQoJmgtPmdiKSAmIDcpID09IDApKSB7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgcy0+bmV4dF9zbGljZV9pbmRleCAtIGdldF9iaXRzX2NvdW50KCZoLT5nYikpOworICAgICAgICAgICAgICAgIGgtPmdiLnNpemVfaW5fYml0cyA9IDggKiBidWZfc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmIChzdnEzX2RlY29kZV9zbGljZV9oZWFkZXIoYXZjdHgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiBzdXBwb3J0IHMtPm1iX3NraXBfcnVuICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1iX3R5cGUgPSBzdnEzX2dldF91ZV9nb2xvbWIoJmgtPmdiKTsKKworICAgICAgICAgICAgaWYgKGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkKKyAgICAgICAgICAgICAgICBtYl90eXBlICs9IDg7CisgICAgICAgICAgICBlbHNlIGlmIChoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgbWJfdHlwZSA+PSA0KQorICAgICAgICAgICAgICAgIG1iX3R5cGUgKz0gNDsKKyAgICAgICAgICAgIGlmIChtYl90eXBlID4gMzMgfHwgc3ZxM19kZWNvZGVfbWIocywgbWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHdoaWxlIGRlY29kaW5nIE1CICVkICVkXG4iLCBoLT5tYl94LCBoLT5tYl95KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtYl90eXBlICE9IDAgfHwgaC0+Y2JwKQorICAgICAgICAgICAgICAgIGZmX2gyNjRfaGxfZGVjb2RlX21iKGgpOworCisgICAgICAgICAgICBpZiAoaC0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CICYmICFoLT5sb3dfZGVsYXkpCisgICAgICAgICAgICAgICAgaC0+Y3VyX3BpYy5tYl90eXBlW2gtPm1iX3ggKyBoLT5tYl95ICogaC0+bWJfc3RyaWRlXSA9CisgICAgICAgICAgICAgICAgICAgIChoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AgJiYgbWJfdHlwZSA8IDgpID8gKG1iX3R5cGUgLSAxKSA6IC0xOworICAgICAgICB9CisKKyAgICAgICAgZmZfZHJhd19ob3Jpel9iYW5kKGF2Y3R4LCAmcy0+Y3VyX3BpYy0+ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfcGljLT5mLmRhdGFbMF0gPyAmcy0+bGFzdF9waWMtPmYgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgKiBoLT5tYl95LCAxNiwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5sb3dfZGVsYXkpOworICAgIH0KKworICAgIGxlZnQgPSBidWZfc2l6ZSo4IC0gZ2V0X2JpdHNfY291bnQoJmgtPmdiKTsKKworICAgIGlmIChoLT5tYl95ICE9IGgtPm1iX2hlaWdodCB8fCBoLT5tYl94ICE9IGgtPm1iX3dpZHRoKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJmcmFtZSBudW0gJWQgaW5jb21wbGV0ZSBwaWMgeCAlZCB5ICVkIGxlZnQgJWRcbiIsIGF2Y3R4LT5mcmFtZV9udW1iZXIsIGgtPm1iX3ksIGgtPm1iX3gsIGxlZnQpOworICAgICAgICAvL2F2X2hleF9kdW1wKHN0ZGVyciwgYnVmK2J1Zl9zaXplLTgsIDgpOworICAgIH0KKworICAgIGlmIChsZWZ0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImZyYW1lIG51bSAlZCBsZWZ0ICVkXG4iLCBhdmN0eC0+ZnJhbWVfbnVtYmVyLCBsZWZ0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgfHwgaC0+bG93X2RlbGF5KQorICAgICAgICByZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgJnMtPmN1cl9waWMtPmYpOworICAgIGVsc2UgaWYgKHMtPmxhc3RfcGljLT5mLmRhdGFbMF0pCisgICAgICAgIHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCAmcy0+bGFzdF9waWMtPmYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogRG8gbm90IG91dHB1dCB0aGUgbGFzdCBwaWMgYWZ0ZXIgc2Vla2luZy4gKi8KKyAgICBpZiAocy0+bGFzdF9waWMtPmYuZGF0YVswXSB8fCBoLT5sb3dfZGVsYXkpCisgICAgICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgaWYgKGgtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICBGRlNXQVAoSDI2NFBpY3R1cmUqLCBzLT5jdXJfcGljLCBzLT5uZXh0X3BpYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoJnMtPmN1cl9waWMtPmYpOworICAgIH0KKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHN2cTNfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU1ZRM0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEgyNjRDb250ZXh0ICpoID0gJnMtPmg7CisKKyAgICBmcmVlX3BpY3R1cmUoYXZjdHgsIHMtPmN1cl9waWMpOworICAgIGZyZWVfcGljdHVyZShhdmN0eCwgcy0+bmV4dF9waWMpOworICAgIGZyZWVfcGljdHVyZShhdmN0eCwgcy0+bGFzdF9waWMpOworICAgIGF2X2ZyZWVwKCZzLT5jdXJfcGljKTsKKyAgICBhdl9mcmVlcCgmcy0+bmV4dF9waWMpOworICAgIGF2X2ZyZWVwKCZzLT5sYXN0X3BpYyk7CisKKyAgICBhdl9mcmFtZV91bnJlZigmaC0+Y3VyX3BpYy5mKTsKKworICAgIGZmX2gyNjRfZnJlZV9jb250ZXh0KGgpOworCisgICAgYXZfZnJlZXAoJnMtPmJ1Zik7CisgICAgcy0+YnVmX3NpemUgPSAwOworICAgIGF2X2ZyZWVwKCZoLT5lZGdlX2VtdV9idWZmZXIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfc3ZxM19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzdnEzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU29yZW5zb24gVmVjdG9yIFF1YW50aXplciAzIC8gU29yZW5zb24gVmlkZW8gMyAvIFNWUTMiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU1ZRMywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU1ZRM0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHN2cTNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gc3ZxM19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHN2cTNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfAorICAgICAgICAgICAgICAgICAgICAgIENPREVDX0NBUF9EUjEgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgIENPREVDX0NBUF9ERUxBWSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9ZVVZKNDIwUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy9zdnEzLmggYi9mZm1wZWcvbGliYXZjb2RlYy9zdnEzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwN2E4YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3N2cTMuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19TVlEzX0gKKyNkZWZpbmUgQVZDT0RFQ19TVlEzX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIGZmX3N2cTNfbHVtYV9kY19kZXF1YW50X2lkY3RfYyhpbnQxNl90ICpvdXRwdXQsIGludDE2X3QgKmlucHV0LCBpbnQgcXApOwordm9pZCBmZl9zdnEzX2FkZF9pZGN0X2ModWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwgaW50IHFwLCBpbnQgZGMpOworCisjZW5kaWYgLyogQVZDT0RFQ19TVlEzX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3N5bnRoX2ZpbHRlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3ludGhfZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ5ZmZlNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3N5bnRoX2ZpbHRlci5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDggTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgInN5bnRoX2ZpbHRlci5oIgorCitzdGF0aWMgdm9pZCBzeW50aF9maWx0ZXJfZmxvYXQoRkZUQ29udGV4dCAqaW1kY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqc3ludGhfYnVmX3B0ciwgaW50ICpzeW50aF9idWZfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3ludGhfYnVmMlszMl0sIGNvbnN0IGZsb2F0IHdpbmRvd1s1MTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3V0WzMyXSwgY29uc3QgZmxvYXQgaW5bMzJdLCBmbG9hdCBzY2FsZSkKK3sKKyAgICBmbG9hdCAqc3ludGhfYnVmPSBzeW50aF9idWZfcHRyICsgKnN5bnRoX2J1Zl9vZmZzZXQ7CisgICAgaW50IGksIGo7CisKKyAgICBpbWRjdC0+aW1kY3RfaGFsZihpbWRjdCwgc3ludGhfYnVmLCBpbik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKyl7CisgICAgICAgIGZsb2F0IGE9IHN5bnRoX2J1ZjJbaSAgICAgXTsKKyAgICAgICAgZmxvYXQgYj0gc3ludGhfYnVmMltpICsgMTZdOworICAgICAgICBmbG9hdCBjPSAwOworICAgICAgICBmbG9hdCBkPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNTEyIC0gKnN5bnRoX2J1Zl9vZmZzZXQ7IGogKz0gNjQpeworICAgICAgICAgICAgYSArPSB3aW5kb3dbaSArIGogICAgIF0qKC1zeW50aF9idWZbMTUgLSBpICsgaiAgICAgIF0pOworICAgICAgICAgICAgYiArPSB3aW5kb3dbaSArIGogKyAxNl0qKCBzeW50aF9idWZbICAgICBpICsgaiAgICAgIF0pOworICAgICAgICAgICAgYyArPSB3aW5kb3dbaSArIGogKyAzMl0qKCBzeW50aF9idWZbMTYgKyBpICsgaiAgICAgIF0pOworICAgICAgICAgICAgZCArPSB3aW5kb3dbaSArIGogKyA0OF0qKCBzeW50aF9idWZbMzEgLSBpICsgaiAgICAgIF0pOworICAgICAgICB9CisgICAgICAgIGZvciAoICAgICA7IGogPCA1MTI7IGogKz0gNjQpeworICAgICAgICAgICAgYSArPSB3aW5kb3dbaSArIGogICAgIF0qKC1zeW50aF9idWZbMTUgLSBpICsgaiAtIDUxMl0pOworICAgICAgICAgICAgYiArPSB3aW5kb3dbaSArIGogKyAxNl0qKCBzeW50aF9idWZbICAgICBpICsgaiAtIDUxMl0pOworICAgICAgICAgICAgYyArPSB3aW5kb3dbaSArIGogKyAzMl0qKCBzeW50aF9idWZbMTYgKyBpICsgaiAtIDUxMl0pOworICAgICAgICAgICAgZCArPSB3aW5kb3dbaSArIGogKyA0OF0qKCBzeW50aF9idWZbMzEgLSBpICsgaiAtIDUxMl0pOworICAgICAgICB9CisgICAgICAgIG91dFtpICAgICBdID0gYSpzY2FsZTsKKyAgICAgICAgb3V0W2kgKyAxNl0gPSBiKnNjYWxlOworICAgICAgICBzeW50aF9idWYyW2kgICAgIF0gPSBjOworICAgICAgICBzeW50aF9idWYyW2kgKyAxNl0gPSBkOworICAgIH0KKyAgICAqc3ludGhfYnVmX29mZnNldD0gKCpzeW50aF9idWZfb2Zmc2V0IC0gMzIpJjUxMTsKK30KKworYXZfY29sZCB2b2lkIGZmX3N5bnRoX2ZpbHRlcl9pbml0KFN5bnRoRmlsdGVyQ29udGV4dCAqYykKK3sKKyAgICBjLT5zeW50aF9maWx0ZXJfZmxvYXQgPSBzeW50aF9maWx0ZXJfZmxvYXQ7CisKKyAgICBpZiAoQVJDSF9BUk0pIGZmX3N5bnRoX2ZpbHRlcl9pbml0X2FybShjKTsKKyAgICBpZiAoQVJDSF9YODYpIGZmX3N5bnRoX2ZpbHRlcl9pbml0X3g4NihjKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3N5bnRoX2ZpbHRlci5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvc3ludGhfZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzZmQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3N5bnRoX2ZpbHRlci5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDggTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NZTlRIX0ZJTFRFUl9ICisjZGVmaW5lIEFWQ09ERUNfU1lOVEhfRklMVEVSX0gKKworI2luY2x1ZGUgImZmdC5oIgorCit0eXBlZGVmIHN0cnVjdCBTeW50aEZpbHRlckNvbnRleHQgeworICAgIHZvaWQgKCpzeW50aF9maWx0ZXJfZmxvYXQpKEZGVENvbnRleHQgKmltZGN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpzeW50aF9idWZfcHRyLCBpbnQgKnN5bnRoX2J1Zl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3ludGhfYnVmMlszMl0sIGNvbnN0IGZsb2F0IHdpbmRvd1s1MTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG91dFszMl0sIGNvbnN0IGZsb2F0IGluWzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSk7Cit9IFN5bnRoRmlsdGVyQ29udGV4dDsKKwordm9pZCBmZl9zeW50aF9maWx0ZXJfaW5pdChTeW50aEZpbHRlckNvbnRleHQgKmMpOwordm9pZCBmZl9zeW50aF9maWx0ZXJfaW5pdF9hcm0oU3ludGhGaWx0ZXJDb250ZXh0ICpjKTsKK3ZvaWQgZmZfc3ludGhfZmlsdGVyX2luaXRfeDg2KFN5bnRoRmlsdGVyQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1NZTlRIX0ZJTFRFUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90YWJsZXByaW50LmggYi9mZm1wZWcvbGliYXZjb2RlYy90YWJsZXByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwNzkxMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RhYmxlcHJpbnQuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIEdlbmVyYXRlIGEgZmlsZSBmb3IgaGFyZGNvZGVkIHRhYmxlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBSZWltYXIgRMO2ZmZpbmdlciA8UmVpbWFyLkRvZWZmaW5nZXJAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVEFCTEVQUklOVF9ICisjZGVmaW5lIEFWQ09ERUNfVEFCTEVQUklOVF9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKKyNkZWZpbmUgV1JJVEVfMURfRlVOQ19BUkdWKHR5cGUsIGxpbmVicmssIGZtdHN0ciwgLi4uKVwKK3ZvaWQgd3JpdGVfIyN0eXBlIyNfYXJyYXkoY29uc3QgdHlwZSAqZGF0YSwgaW50IGxlbilcCit7XAorICAgIGludCBpO1wKKyAgICBwcmludGYoIiAgICIpO1wKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKSB7XAorICAgICAgIHByaW50ZigiICJmbXRzdHIiLCIsIF9fVkFfQVJHU19fKTtcCisgICAgICAgaWYgKChpICYgbGluZWJyaykgPT0gbGluZWJyaykgcHJpbnRmKCJcbiAgICIpO1wKKyAgICB9XAorICAgIHByaW50ZigiICJmbXRzdHIiXG4iLCBfX1ZBX0FSR1NfXyk7XAorfQorCisjZGVmaW5lIFdSSVRFXzFEX0ZVTkModHlwZSwgZm10c3RyLCBsaW5lYnJrKVwKKyAgICBXUklURV8xRF9GVU5DX0FSR1YodHlwZSwgbGluZWJyaywgZm10c3RyLCBkYXRhW2ldKQorCisjZGVmaW5lIFdSSVRFXzJEX0ZVTkModHlwZSlcCit2b2lkIHdyaXRlXyMjdHlwZSMjXzJkX2FycmF5KGNvbnN0IHZvaWQgKmFyZywgaW50IGxlbiwgaW50IGxlbjIpXAore1wKKyAgICBjb25zdCB0eXBlICpkYXRhID0gYXJnO1wKKyAgICBpbnQgaTtcCisgICAgcHJpbnRmKCIgICAge1xuIik7XAorICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1wKKyAgICAgICAgd3JpdGVfIyN0eXBlIyNfYXJyYXkoZGF0YSArIGkgKiBsZW4yLCBsZW4yKTtcCisgICAgICAgIHByaW50ZihpID09IGxlbiAtIDEgPyAiICAgIH1cbiIgOiAiICAgIH0sIHtcbiIpO1wKKyAgICB9XAorfQorCisvKioKKyAqIEBuYW1lIFByZWRlZmluZWQgZnVuY3Rpb25zIGZvciBwcmludGluZyB0YWJsZXMKKyAqCisgKiBAeworICovCit2b2lkIHdyaXRlX2ludDhfdF9hcnJheSAgICAgKGNvbnN0IGludDhfdCAgICosIGludCk7Cit2b2lkIHdyaXRlX3VpbnQ4X3RfYXJyYXkgICAgKGNvbnN0IHVpbnQ4X3QgICosIGludCk7Cit2b2lkIHdyaXRlX3VpbnQxNl90X2FycmF5ICAgKGNvbnN0IHVpbnQxNl90ICosIGludCk7Cit2b2lkIHdyaXRlX3VpbnQzMl90X2FycmF5ICAgKGNvbnN0IHVpbnQzMl90ICosIGludCk7Cit2b2lkIHdyaXRlX2Zsb2F0X2FycmF5ICAgICAgKGNvbnN0IGZsb2F0ICAgICosIGludCk7Cit2b2lkIHdyaXRlX2ludDhfdF8yZF9hcnJheSAgKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwordm9pZCB3cml0ZV91aW50OF90XzJkX2FycmF5IChjb25zdCB2b2lkICosIGludCwgaW50KTsKK3ZvaWQgd3JpdGVfdWludDMyX3RfMmRfYXJyYXkoY29uc3Qgdm9pZCAqLCBpbnQsIGludCk7Cit2b2lkIHdyaXRlX2Zsb2F0XzJkX2FycmF5ICAgKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOworLyoqIEB9ICovIC8vIGVuZCBvZiBwcmludGZ1bmNzIGdyb3VwCisKKy8qCisgKiBNU1ZDIGRvZXNuJ3QgaGF2ZSAlenUsIHNpbmNlIGl0IHdhcyBpbnRyb2R1Y2VkIGluIEM5OSwKKyAqIGJ1dCBoYXMgaXRzIG93biAlSXUgZm9yIHByaW50aW5nIHNpemVfdCB2YWx1ZXMuCisgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBGTVQgIkl1IgorI2Vsc2UKKyNkZWZpbmUgRk1UICJ6dSIKKyNlbmRpZgorCisjZGVmaW5lIFdSSVRFX0FSUkFZX0FMSUdORUQocHJlZml4LCBhbGlnbiwgdHlwZSwgbmFtZSkgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBzaXplX3QgYXJyYXlfc2l6ZSA9IEZGX0FSUkFZX0VMRU1TKG5hbWUpOyBcCisgICAgICAgIHByaW50ZihwcmVmaXgiIERFQ0xBUkVfQUxJR05FRCgiI2FsaWduIiwgIiAgICAgIFwKKyAgICAgICAgICAgICAgICN0eXBlIiwgIiNuYW1lIilbJSJGTVQiXSA9IHtcbiIsICAgICAgICAgXAorICAgICAgICAgICAgICAgYXJyYXlfc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdyaXRlXyMjdHlwZSMjX2FycmF5KG5hbWUsIGFycmF5X3NpemUpOyAgICAgICAgIFwKKyAgICAgICAgcHJpbnRmKCJ9O1xuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBXUklURV9BUlJBWShwcmVmaXgsIHR5cGUsIG5hbWUpICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFycmF5X3NpemUgPSBGRl9BUlJBWV9FTEVNUyhuYW1lKTsgXAorICAgICAgICBwcmludGYocHJlZml4IiAiI3R5cGUiICIjbmFtZSJbJSJGTVQiXSA9IHtcbiIsICBcCisgICAgICAgICAgICAgICBhcnJheV9zaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd3JpdGVfIyN0eXBlIyNfYXJyYXkobmFtZSwgYXJyYXlfc2l6ZSk7ICAgICAgICAgXAorICAgICAgICBwcmludGYoIn07XG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIFdSSVRFXzJEX0FSUkFZKHByZWZpeCwgdHlwZSwgbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHNpemVfdCBhcnJheV9zaXplMSA9IEZGX0FSUkFZX0VMRU1TKG5hbWUpOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHNpemVfdCBhcnJheV9zaXplMiA9IEZGX0FSUkFZX0VMRU1TKG5hbWVbMF0pOyAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ZihwcmVmaXgiICIjdHlwZSIgIiNuYW1lIlslIkZNVCJdWyUiRk1UIl0gPSB7XG4iLCAgICAgICAgICBcCisgICAgICAgICAgICAgICBhcnJheV9zaXplMSwgYXJyYXlfc2l6ZTIgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdyaXRlXyMjdHlwZSMjXzJkX2FycmF5KG5hbWUsIGFycmF5X3NpemUxLCBhcnJheV9zaXplMik7ICAgICAgICBcCisgICAgICAgIHByaW50ZigifTtcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorCisKK1dSSVRFXzFEX0ZVTkMoaW50OF90LCAgICIlMyJQUklpOCwgMTUpCitXUklURV8xRF9GVU5DKHVpbnQ4X3QsICAiMHglMDIiUFJJeDgsIDE1KQorV1JJVEVfMURfRlVOQyh1aW50MTZfdCwgIjB4JTA4IlBSSXgxNiwgNykKK1dSSVRFXzFEX0ZVTkModWludDMyX3QsICIweCUwOCJQUkl4MzIsIDcpCitXUklURV8xRF9GVU5DKGZsb2F0LCAgICAiJS4xOGUiLCAzKQorCitXUklURV8yRF9GVU5DKGludDhfdCkKK1dSSVRFXzJEX0ZVTkModWludDhfdCkKK1dSSVRFXzJEX0ZVTkModWludDMyX3QpCitXUklURV8yRF9GVU5DKGZsb2F0KQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZmlsZWhlYWRlcih2b2lkKQoreworICAgIHByaW50ZigiLyogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gKi9cbiIpOworICAgIHByaW50ZigiI2luY2x1ZGUgPHN0ZGludC5oPlxuIik7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX1RBQkxFUFJJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdGFrLmMgYi9mZm1wZWcvbGliYXZjb2RlYy90YWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDQxY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGFrLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBUQUsgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAidGFrLmgiCisKK3N0YXRpYyBjb25zdCBpbnQ2NF90IHRha19jaGFubmVsX2xheW91dHNbXSA9IHsKKyAgICAwLAorICAgIEFWX0NIX0ZST05UX0xFRlQsCisgICAgQVZfQ0hfRlJPTlRfUklHSFQsCisgICAgQVZfQ0hfRlJPTlRfQ0VOVEVSLAorICAgIEFWX0NIX0xPV19GUkVRVUVOQ1ksCisgICAgQVZfQ0hfQkFDS19MRUZULAorICAgIEFWX0NIX0JBQ0tfUklHSFQsCisgICAgQVZfQ0hfRlJPTlRfTEVGVF9PRl9DRU5URVIsCisgICAgQVZfQ0hfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSLAorICAgIEFWX0NIX0JBQ0tfQ0VOVEVSLAorICAgIEFWX0NIX1NJREVfTEVGVCwKKyAgICBBVl9DSF9TSURFX1JJR0hULAorICAgIEFWX0NIX1RPUF9DRU5URVIsCisgICAgQVZfQ0hfVE9QX0ZST05UX0xFRlQsCisgICAgQVZfQ0hfVE9QX0ZST05UX0NFTlRFUiwKKyAgICBBVl9DSF9UT1BfRlJPTlRfUklHSFQsCisgICAgQVZfQ0hfVE9QX0JBQ0tfTEVGVCwKKyAgICBBVl9DSF9UT1BfQkFDS19DRU5URVIsCisgICAgQVZfQ0hfVE9QX0JBQ0tfUklHSFQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgZnJhbWVfZHVyYXRpb25fdHlwZV9xdWFudHNbXSA9IHsKKyAgICAzLCA0LCA2LCA4LCA0MDk2LCA4MTkyLCAxNjM4NCwgNTEyLCAxMDI0LCAyMDQ4LAorfTsKKworc3RhdGljIGludCB0YWtfZ2V0X25iX3NhbXBsZXMoaW50IHNhbXBsZV9yYXRlLCBlbnVtIFRBS0ZyYW1lU2l6ZVR5cGUgdHlwZSkKK3sKKyAgICBpbnQgbmJfc2FtcGxlcywgbWF4X25iX3NhbXBsZXM7CisKKyAgICBpZiAodHlwZSA8PSBUQUtfRlNUXzI1MG1zKSB7CisgICAgICAgIG5iX3NhbXBsZXMgICAgID0gc2FtcGxlX3JhdGUgKiBmcmFtZV9kdXJhdGlvbl90eXBlX3F1YW50c1t0eXBlXSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgIFRBS19GUkFNRV9EVVJBVElPTl9RVUFOVF9TSElGVDsKKyAgICAgICAgbWF4X25iX3NhbXBsZXMgPSAxNjM4NDsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPCBGRl9BUlJBWV9FTEVNUyhmcmFtZV9kdXJhdGlvbl90eXBlX3F1YW50cykpIHsKKyAgICAgICAgbmJfc2FtcGxlcyAgICAgPSBmcmFtZV9kdXJhdGlvbl90eXBlX3F1YW50c1t0eXBlXTsKKyAgICAgICAgbWF4X25iX3NhbXBsZXMgPSBzYW1wbGVfcmF0ZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfZHVyYXRpb25fdHlwZV9xdWFudHNbVEFLX0ZTVF8yNTBtc10gPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUQUtfRlJBTUVfRFVSQVRJT05fUVVBTlRfU0hJRlQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKG5iX3NhbXBsZXMgPD0gMCB8fCBuYl9zYW1wbGVzID4gbWF4X25iX3NhbXBsZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0dXJuIG5iX3NhbXBsZXM7Cit9CisKK2ludCBmZl90YWtfY2hlY2tfY3JjKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1Zl9zaXplKQoreworICAgIHVpbnQzMl90IGNyYywgQ1JDOworCisgICAgaWYgKGJ1Zl9zaXplIDwgNCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgYnVmX3NpemUgLT0gMzsKKworICAgIENSQyA9IEFWX1JCMjQoYnVmICsgYnVmX3NpemUpOworICAgIGNyYyA9IGF2X2NyYyhhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18yNF9JRUVFKSwgMHhDRTA0QjdVLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBpZiAoQ1JDICE9IGNyYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBhdnByaXZfdGFrX3BhcnNlX3N0cmVhbWluZm8oR2V0Qml0Q29udGV4dCAqZ2IsIFRBS1N0cmVhbUluZm8gKnMpCit7CisgICAgdWludDY0X3QgY2hhbm5lbF9tYXNrID0gMDsKKyAgICBpbnQgZnJhbWVfdHlwZSwgaTsKKworICAgIHMtPmNvZGVjID0gZ2V0X2JpdHMoZ2IsIFRBS19FTkNPREVSX0NPREVDX0JJVFMpOworICAgIHNraXBfYml0cyhnYiwgVEFLX0VOQ09ERVJfUFJPRklMRV9CSVRTKTsKKworICAgIGZyYW1lX3R5cGUgPSBnZXRfYml0cyhnYiwgVEFLX1NJWkVfRlJBTUVfRFVSQVRJT05fQklUUyk7CisgICAgcy0+c2FtcGxlcyA9IGdldF9iaXRzNjQoZ2IsIFRBS19TSVpFX1NBTVBMRVNfTlVNX0JJVFMpOworCisgICAgcy0+ZGF0YV90eXBlICAgPSBnZXRfYml0cyhnYiwgVEFLX0ZPUk1BVF9EQVRBX1RZUEVfQklUUyk7CisgICAgcy0+c2FtcGxlX3JhdGUgPSBnZXRfYml0cyhnYiwgVEFLX0ZPUk1BVF9TQU1QTEVfUkFURV9CSVRTKSArCisgICAgICAgICAgICAgICAgICAgICBUQUtfU0FNUExFX1JBVEVfTUlOOworICAgIHMtPmJwcyAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIFRBS19GT1JNQVRfQlBTX0JJVFMpICsKKyAgICAgICAgICAgICAgICAgICAgIFRBS19CUFNfTUlOOworICAgIHMtPmNoYW5uZWxzICAgID0gZ2V0X2JpdHMoZ2IsIFRBS19GT1JNQVRfQ0hBTk5FTF9CSVRTKSArCisgICAgICAgICAgICAgICAgICAgICBUQUtfQ0hBTk5FTFNfTUlOOworCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgc2tpcF9iaXRzKGdiLCBUQUtfRk9STUFUX1ZBTElEX0JJVFMpOworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSBnZXRfYml0cyhnYiwgVEFLX0ZPUk1BVF9DSF9MQVlPVVRfQklUUyk7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBGRl9BUlJBWV9FTEVNUyh0YWtfY2hhbm5lbF9sYXlvdXRzKSkKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXNrIHw9IHRha19jaGFubmVsX2xheW91dHNbdmFsdWVdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcy0+Y2hfbGF5b3V0ICAgICA9IGNoYW5uZWxfbWFzazsKKyAgICBzLT5mcmFtZV9zYW1wbGVzID0gdGFrX2dldF9uYl9zYW1wbGVzKHMtPnNhbXBsZV9yYXRlLCBmcmFtZV90eXBlKTsKK30KKworaW50IGZmX3Rha19kZWNvZGVfZnJhbWVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFLU3RyZWFtSW5mbyAqdGksIGludCBsb2dfbGV2ZWxfb2Zmc2V0KQoreworICAgIGlmIChnZXRfYml0cyhnYiwgVEFLX0ZSQU1FX0hFQURFUl9TWU5DX0lEX0JJVFMpICE9IFRBS19GUkFNRV9IRUFERVJfU1lOQ19JRCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiArIGxvZ19sZXZlbF9vZmZzZXQsICJtaXNzaW5nIHN5bmMgaWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB0aS0+ZmxhZ3MgICAgID0gZ2V0X2JpdHMoZ2IsIFRBS19GUkFNRV9IRUFERVJfRkxBR1NfQklUUyk7CisgICAgdGktPmZyYW1lX251bSA9IGdldF9iaXRzKGdiLCBUQUtfRlJBTUVfSEVBREVSX05PX0JJVFMpOworCisgICAgaWYgKHRpLT5mbGFncyAmIFRBS19GUkFNRV9GTEFHX0lTX0xBU1QpIHsKKyAgICAgICAgdGktPmxhc3RfZnJhbWVfc2FtcGxlcyA9IGdldF9iaXRzKGdiLCBUQUtfRlJBTUVfSEVBREVSX1NBTVBMRV9DT1VOVF9CSVRTKSArIDE7CisgICAgICAgIHNraXBfYml0cyhnYiwgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGktPmxhc3RfZnJhbWVfc2FtcGxlcyA9IDA7CisgICAgfQorCisgICAgaWYgKHRpLT5mbGFncyAmIFRBS19GUkFNRV9GTEFHX0hBU19JTkZPKSB7CisgICAgICAgIGF2cHJpdl90YWtfcGFyc2Vfc3RyZWFtaW5mbyhnYiwgdGkpOworCisgICAgICAgIGlmIChnZXRfYml0cyhnYiwgNikpCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDI1KTsKKyAgICAgICAgYWxpZ25fZ2V0X2JpdHMoZ2IpOworICAgIH0KKworICAgIGlmICh0aS0+ZmxhZ3MgJiBUQUtfRlJBTUVfRkxBR19IQVNfTUVUQURBVEEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc2tpcF9iaXRzKGdiLCAyNCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Rhay5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGFrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlMmRhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Rhay5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogVEFLIGRlY29kZXIvZGVtdXhlciBjb21tb24gY29kZQorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUQUsgKFRvbSdzIGxvc3NsZXNzIEF1ZGlvIEtvbXByZXNzb3IpIGRlY29kZXIvZGVtdXhlciBjb21tb24gZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1RBS19ICisjZGVmaW5lIEFWQ09ERUNfVEFLX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKworI2RlZmluZSBUQUtfRk9STUFUX0RBVEFfVFlQRV9CSVRTICAgICAgICAgICAgICAgMworI2RlZmluZSBUQUtfRk9STUFUX1NBTVBMRV9SQVRFX0JJVFMgICAgICAgICAgICAxOAorI2RlZmluZSBUQUtfRk9STUFUX0JQU19CSVRTICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBUQUtfRk9STUFUX0NIQU5ORUxfQklUUyAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUQUtfRk9STUFUX1ZBTElEX0JJVFMgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBUQUtfRk9STUFUX0NIX0xBWU9VVF9CSVRTICAgICAgICAgICAgICAgNgorI2RlZmluZSBUQUtfU0laRV9GUkFNRV9EVVJBVElPTl9CSVRTICAgICAgICAgICAgNAorI2RlZmluZSBUQUtfU0laRV9TQU1QTEVTX05VTV9CSVRTICAgICAgICAgICAgICAzNQorI2RlZmluZSBUQUtfTEFTVF9GUkFNRV9QT1NfQklUUyAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBUQUtfTEFTVF9GUkFNRV9TSVpFX0JJVFMgICAgICAgICAgICAgICAyNAorI2RlZmluZSBUQUtfRU5DT0RFUl9DT0RFQ19CSVRTICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBUQUtfRU5DT0RFUl9QUk9GSUxFX0JJVFMgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUQUtfRU5DT0RFUl9WRVJTSU9OX0JJVFMgICAgICAgICAgICAgICAyNAorI2RlZmluZSBUQUtfU0FNUExFX1JBVEVfTUlOICAgICAgICAgICAgICAgICAgNjAwMAorI2RlZmluZSBUQUtfQ0hBTk5FTFNfTUlOICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUQUtfQlBTX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBUQUtfRlJBTUVfSEVBREVSX0ZMQUdTX0JJVFMgICAgICAgICAgICAgMworI2RlZmluZSBUQUtfRlJBTUVfSEVBREVSX1NZTkNfSUQgICAgICAgICAgIDB4QTBGRgorI2RlZmluZSBUQUtfRlJBTUVfSEVBREVSX1NZTkNfSURfQklUUyAgICAgICAgICAxNgorI2RlZmluZSBUQUtfRlJBTUVfSEVBREVSX1NBTVBMRV9DT1VOVF9CSVRTICAgICAxNAorI2RlZmluZSBUQUtfRlJBTUVfSEVBREVSX05PX0JJVFMgICAgICAgICAgICAgICAyMQorI2RlZmluZSBUQUtfRlJBTUVfRFVSQVRJT05fUVVBTlRfU0hJRlQgICAgICAgICAgNQorI2RlZmluZSBUQUtfQ1JDMjRfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAyNAorCisKKyNkZWZpbmUgVEFLX0ZSQU1FX0ZMQUdfSVNfTEFTVCAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgVEFLX0ZSQU1FX0ZMQUdfSEFTX0lORk8gICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgVEFLX0ZSQU1FX0ZMQUdfSEFTX01FVEFEQVRBICAgICAgICAgICAweDQKKworI2RlZmluZSBUQUtfTUFYX0NIQU5ORUxTICAgICAgICAgICAgICAgKDEgPDwgVEFLX0ZPUk1BVF9DSEFOTkVMX0JJVFMpCisKKyNkZWZpbmUgVEFLX01JTl9GUkFNRV9IRUFERVJfQklUUyAgICAgIChUQUtfRlJBTUVfSEVBREVSX1NZTkNfSURfQklUUyArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUtfRlJBTUVfSEVBREVSX0ZMQUdTX0JJVFMgICArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUtfRlJBTUVfSEVBREVSX05PX0JJVFMgICAgICArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUtfQ1JDMjRfQklUUykKKworI2RlZmluZSBUQUtfTUlOX0ZSQU1FX0hFQURFUl9MQVNUX0JJVFMgKFRBS19NSU5fRlJBTUVfSEVBREVSX0JJVFMgKyAyICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBS19GUkFNRV9IRUFERVJfU0FNUExFX0NPVU5UX0JJVFMpCisKKyNkZWZpbmUgVEFLX0VOQ09ERVJfQklUUyAgICAgICAgICAgICAgIChUQUtfRU5DT0RFUl9DT0RFQ19CSVRTICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBS19FTkNPREVSX1BST0ZJTEVfQklUUykKKworI2RlZmluZSBUQUtfU0laRV9CSVRTICAgICAgICAgICAgICAgICAgKFRBS19TSVpFX1NBTVBMRVNfTlVNX0JJVFMgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFLX1NJWkVfRlJBTUVfRFVSQVRJT05fQklUUykKKworI2RlZmluZSBUQUtfRk9STUFUX0JJVFMgICAgICAgICAgICAgICAgKFRBS19GT1JNQVRfREFUQV9UWVBFX0JJVFMgICArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUtfRk9STUFUX1NBTVBMRV9SQVRFX0JJVFMgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFLX0ZPUk1BVF9CUFNfQklUUyAgICAgICAgICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBS19GT1JNQVRfQ0hBTk5FTF9CSVRTICsgMSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUtfRk9STUFUX1ZBTElEX0JJVFMgICArIDEgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFLX0ZPUk1BVF9DSF9MQVlPVVRfQklUUyAgICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBS19NQVhfQ0hBTk5FTFMpCisKKyNkZWZpbmUgVEFLX1NUUkVBTUlORk9fQklUUyAgICAgICAgICAgIChUQUtfRU5DT0RFUl9CSVRTICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBS19TSVpFX0JJVFMgICAgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFLX0ZPUk1BVF9CSVRTKQorCisjZGVmaW5lIFRBS19NQVhfRlJBTUVfSEVBREVSX0JJVFMgICAgICAoVEFLX01JTl9GUkFNRV9IRUFERVJfTEFTVF9CSVRTICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBS19TVFJFQU1JTkZPX0JJVFMgKyAzMSkKKworI2RlZmluZSBUQUtfU1RSRUFNSU5GT19CWVRFUyAgICAgICAgICAgKChUQUtfU1RSRUFNSU5GT19CSVRTICAgICAgICsgNykgLyA4KQorI2RlZmluZSBUQUtfTUFYX0ZSQU1FX0hFQURFUl9CWVRFUyAgICAgKChUQUtfTUFYX0ZSQU1FX0hFQURFUl9CSVRTICsgNykgLyA4KQorI2RlZmluZSBUQUtfTUlOX0ZSQU1FX0hFQURFUl9CWVRFUyAgICAgKChUQUtfTUlOX0ZSQU1FX0hFQURFUl9CSVRTICsgNykgLyA4KQorCitlbnVtIFRBS0NvZGVjVHlwZSB7CisgICAgVEFLX0NPREVDX01PTk9fU1RFUkVPICA9IDIsCisgICAgVEFLX0NPREVDX01VTFRJQ0hBTk5FTCA9IDQsCit9OworCitlbnVtIFRBS01ldGFEYXRhVHlwZSB7CisgICAgVEFLX01FVEFEQVRBX0VORCA9IDAsCisgICAgVEFLX01FVEFEQVRBX1NUUkVBTUlORk8sCisgICAgVEFLX01FVEFEQVRBX1NFRUtUQUJMRSwKKyAgICBUQUtfTUVUQURBVEFfU0lNUExFX1dBVkVfREFUQSwKKyAgICBUQUtfTUVUQURBVEFfRU5DT0RFUiwKKyAgICBUQUtfTUVUQURBVEFfUEFERElORywKKyAgICBUQUtfTUVUQURBVEFfTUQ1LAorICAgIFRBS19NRVRBREFUQV9MQVNUX0ZSQU1FLAorfTsKKworZW51bSBUQUtGcmFtZVNpemVUeXBlIHsKKyAgICBUQUtfRlNUXzk0bXMgPSAwLAorICAgIFRBS19GU1RfMTI1bXMsCisgICAgVEFLX0ZTVF8xODhtcywKKyAgICBUQUtfRlNUXzI1MG1zLAorICAgIFRBS19GU1RfNDA5NiwKKyAgICBUQUtfRlNUXzgxOTIsCisgICAgVEFLX0ZTVF8xNjM4NCwKKyAgICBUQUtfRlNUXzUxMiwKKyAgICBUQUtfRlNUXzEwMjQsCisgICAgVEFLX0ZTVF8yMDQ4LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgVEFLU3RyZWFtSW5mbyB7CisgICAgaW50ICAgICAgICAgICAgICAgZmxhZ3M7CisgICAgZW51bSBUQUtDb2RlY1R5cGUgY29kZWM7CisgICAgaW50ICAgICAgICAgICAgICAgZGF0YV90eXBlOworICAgIGludCAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlOworICAgIGludCAgICAgICAgICAgICAgIGNoYW5uZWxzOworICAgIGludCAgICAgICAgICAgICAgIGJwczsKKyAgICBpbnQgICAgICAgICAgICAgICBmcmFtZV9udW07CisgICAgaW50ICAgICAgICAgICAgICAgZnJhbWVfc2FtcGxlczsKKyAgICBpbnQgICAgICAgICAgICAgICBsYXN0X2ZyYW1lX3NhbXBsZXM7CisgICAgdWludDY0X3QgICAgICAgICAgY2hfbGF5b3V0OworICAgIGludDY0X3QgICAgICAgICAgIHNhbXBsZXM7Cit9IFRBS1N0cmVhbUluZm87CisKK2ludCBmZl90YWtfY2hlY2tfY3JjKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1Zl9zaXplKTsKKworLyoqCisgKiBQYXJzZSB0aGUgU3RyZWFtaW5mbyBtZXRhZGF0YSBibG9jay4KKyAqIEBwYXJhbVtpbl0gIGdiIHBvaW50ZXIgdG8gR2V0Qml0Q29udGV4dAorICogQHBhcmFtW291dF0gcyAgc3RvcmFnZSBmb3IgcGFyc2VkIGluZm9ybWF0aW9uCisgKi8KK3ZvaWQgYXZwcml2X3Rha19wYXJzZV9zdHJlYW1pbmZvKEdldEJpdENvbnRleHQgKmdiLCBUQUtTdHJlYW1JbmZvICpzKTsKKworLyoqCisgKiBWYWxpZGF0ZSBhbmQgZGVjb2RlIGEgZnJhbWUgaGVhZGVyLgorICogQHBhcmFtICAgICAgYXZjdHggICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgdG8gdXNlIGFzIGF2X2xvZygpIGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gIGdiICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgZnJvbSB3aGljaCB0byByZWFkIGZyYW1lIGhlYWRlcgorICogQHBhcmFtW291dF0gcyAgICAgICAgICAgICAgICAgZnJhbWUgaW5mb3JtYXRpb24KKyAqIEBwYXJhbSAgICAgIGxvZ19sZXZlbF9vZmZzZXQgIGxvZyBsZXZlbCBvZmZzZXQsIGNhbiBiZSB1c2VkIHRvIHNpbGVuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIG1lc3NhZ2VzLgorICogQHJldHVybiBub24temVybyBvbiBlcnJvciwgMCBpZiBPSworICovCitpbnQgZmZfdGFrX2RlY29kZV9mcmFtZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUtTdHJlYW1JbmZvICpzLCBpbnQgbG9nX2xldmVsX29mZnNldCk7CisjZW5kaWYgLyogQVZDT0RFQ19UQUtfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdGFrX3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGFrX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODQ2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy90YWtfcGFyc2VyLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBUQUsgcGFyc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUQUsgcGFyc2VyCisgKiovCisKKyNpbmNsdWRlICJ0YWsuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVEFLUGFyc2VDb250ZXh0IHsKKyAgICBQYXJzZUNvbnRleHQgIHBjOworICAgIFRBS1N0cmVhbUluZm8gdGk7CisgICAgaW50ICAgICAgICAgICBpbmRleDsKK30gVEFLUGFyc2VDb250ZXh0OworCitzdGF0aWMgaW50IHRha19wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgVEFLUGFyc2VDb250ZXh0ICp0ID0gcy0+cHJpdl9kYXRhOworICAgIFBhcnNlQ29udGV4dCAqcGMgICA9ICZ0LT5wYzsKKyAgICBpbnQgbmV4dCAgICAgICAgICAgPSBFTkRfTk9UX0ZPVU5EOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGNvbnN1bWVkID0gMDsKKyAgICBpbnQgbmVlZGVkICAgPSBidWZfc2l6ZSA/IFRBS19NQVhfRlJBTUVfSEVBREVSX0JZVEVTIDogODsKKworICAgIGlmIChzLT5mbGFncyAmIFBBUlNFUl9GTEFHX0NPTVBMRVRFX0ZSQU1FUykgeworICAgICAgICBUQUtTdHJlYW1JbmZvIHRpOworICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgIGlmICghZmZfdGFrX2RlY29kZV9mcmFtZV9oZWFkZXIoYXZjdHgsICZnYiwgJnRpLCAxMjcpKQorICAgICAgICAgICAgcy0+ZHVyYXRpb24gPSB0LT50aS5sYXN0X2ZyYW1lX3NhbXBsZXMgPyB0LT50aS5sYXN0X2ZyYW1lX3NhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdC0+dGkuZnJhbWVfc2FtcGxlczsKKyAgICAgICAgKnBvdXRidWYgICAgICA9IGJ1ZjsKKyAgICAgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgd2hpbGUgKGJ1Zl9zaXplIHx8IHQtPmluZGV4ICsgbmVlZGVkIDw9IHBjLT5pbmRleCkgeworICAgICAgICBpZiAoYnVmX3NpemUgJiYgdC0+aW5kZXggKyBUQUtfTUFYX0ZSQU1FX0hFQURFUl9CWVRFUyA+IHBjLT5pbmRleCkgeworICAgICAgICAgICAgaW50IHRtcF9idWZfc2l6ZSAgICAgICA9IEZGTUlOKDIgKiBUQUtfTUFYX0ZSQU1FX0hFQURFUl9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSk7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0bXBfYnVmID0gYnVmOworCisgICAgICAgICAgICBpZiAoZmZfY29tYmluZV9mcmFtZShwYywgRU5EX05PVF9GT1VORCwgJnRtcF9idWYsICZ0bXBfYnVmX3NpemUpICE9IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBjb25zdW1lZCArPSB0bXBfYnVmX3NpemU7CisgICAgICAgICAgICBidWYgICAgICArPSB0bXBfYnVmX3NpemU7CisgICAgICAgICAgICBidWZfc2l6ZSAtPSB0bXBfYnVmX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKDsgdC0+aW5kZXggKyBuZWVkZWQgPD0gcGMtPmluZGV4OyB0LT5pbmRleCsrKSB7CisgICAgICAgICAgICBpZiAocGMtPmJ1ZmZlclsgdC0+aW5kZXggICAgIF0gPT0gMHhGRiAmJgorICAgICAgICAgICAgICAgIHBjLT5idWZmZXJbIHQtPmluZGV4ICsgMSBdID09IDB4QTApIHsKKyAgICAgICAgICAgICAgICBUQUtTdHJlYW1JbmZvIHRpOworCisgICAgICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIHBjLT5idWZmZXIgKyB0LT5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggKiAocGMtPmluZGV4IC0gdC0+aW5kZXgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZmX3Rha19kZWNvZGVfZnJhbWVfaGVhZGVyKGF2Y3R4LCAmZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPyAmdGkgOiAmdC0+dGksIDEyNykgJiYKKyAgICAgICAgICAgICAgICAgICAgIWZmX3Rha19jaGVja19jcmMocGMtPmJ1ZmZlciArIHQtPmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0c19jb3VudCgmZ2IpIC8gOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYy0+ZnJhbWVfc3RhcnRfZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kdXJhdGlvbiAgICAgICAgICAgPSB0LT50aS5sYXN0X2ZyYW1lX3NhbXBsZXMgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+dGkubGFzdF9mcmFtZV9zYW1wbGVzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnRpLmZyYW1lX3NhbXBsZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5rZXlfZnJhbWUgICAgICAgICAgPSAhISh0LT50aS5mbGFncyAmIFRBS19GUkFNRV9GTEFHX0hBU19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ICAgICAgICAgICAgICAgICAgPSB0LT5pbmRleCAtIHBjLT5pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPmluZGV4ICAgICAgICAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorZm91bmQ6CisKKyAgICBpZiAoY29uc3VtZWQgJiYgIWJ1Zl9zaXplICYmIG5leHQgPT0gRU5EX05PVF9GT1VORCB8fAorICAgICAgICBmZl9jb21iaW5lX2ZyYW1lKHBjLCBuZXh0LCAmYnVmLCAmYnVmX3NpemUpIDwgMCkgeworICAgICAgICAqcG91dGJ1ZiAgICAgID0gTlVMTDsKKyAgICAgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBidWZfc2l6ZSArIGNvbnN1bWVkOworICAgIH0KKworICAgIGlmIChuZXh0ICE9IEVORF9OT1RfRk9VTkQpIHsKKyAgICAgICAgbmV4dCAgICAgICAgKz0gY29uc3VtZWQ7CisgICAgICAgIHBjLT5vdmVycmVhZCA9IEZGTUFYKDAsIC1uZXh0KTsKKyAgICB9CisKKyAgICAqcG91dGJ1ZiAgICAgID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gbmV4dDsKK30KKworQVZDb2RlY1BhcnNlciBmZl90YWtfcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfVEFLIH0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFRBS1BhcnNlQ29udGV4dCksCisgICAgLnBhcnNlcl9wYXJzZSAgID0gdGFrX3BhcnNlLAorICAgIC5wYXJzZXJfY2xvc2UgICA9IGZmX3BhcnNlX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3Rha2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGFrZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxMGEwMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Rha2RlYy5jCkBAIC0wLDAgKzEsOTQ3IEBACisvKgorICogVEFLIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVEFLIChUb20ncyBsb3NzbGVzcyBBdWRpbyBLb21wcmVzc29yKSBkZWNvZGVyCisgKiBAYXV0aG9yIFBhdWwgQiBNYWhvbAorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAidGFrLmgiCisjaW5jbHVkZSAiYXVkaW9kc3AuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorCisjZGVmaW5lIE1BWF9TVUJGUkFNRVMgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXggbnVtYmVyIG9mIHN1YmZyYW1lcyBwZXIgY2hhbm5lbAorI2RlZmluZSBNQVhfUFJFRElDVE9SUyAgMjU2CisKK3R5cGVkZWYgc3RydWN0IE1DRFBhcmFtIHsKKyAgICBpbnQ4X3QgcHJlc2VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGRlY29ycmVsYXRpb24gcGFyYW1ldGVyIGF2YWlsYWJpbGl0eSBmb3IgdGhpcyBjaGFubmVsCisgICAgaW50OF90IGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbmRleCBpbnRvIGFycmF5IG9mIGRlY29ycmVsYXRpb24gdHlwZXMKKyAgICBpbnQ4X3QgY2hhbjE7CisgICAgaW50OF90IGNoYW4yOworfSBNQ0RQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgVEFLRGVjQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwYXJlbnQgQVZDb2RlY0NvbnRleHQKKyAgICBBdWRpb0RTUENvbnRleHQgYWRzcDsKKyAgICBUQUtTdHJlYW1JbmZvICAgdGk7CisgICAgR2V0Qml0Q29udGV4dCAgIGdiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBiaXRzdHJlYW0gcmVhZGVyIGluaXRpYWxpemVkIHRvIHN0YXJ0IGF0IHRoZSBjdXJyZW50IGZyYW1lCisKKyAgICBpbnQgICAgICAgICAgICAgdXZhbDsKKyAgICBpbnQgICAgICAgICAgICAgbmJfc2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBjdXJyZW50IGZyYW1lCisgICAgdWludDhfdCAgICAgICAgKmRlY29kZV9idWZmZXI7CisgICAgdW5zaWduZWQgaW50ICAgIGRlY29kZV9idWZmZXJfc2l6ZTsKKyAgICBpbnQzMl90ICAgICAgICAqZGVjb2RlZFtUQUtfTUFYX0NIQU5ORUxTXTsgICAgICAvLy88IGRlY29kZWQgc2FtcGxlcyBmb3IgZWFjaCBjaGFubmVsCisKKyAgICBpbnQ4X3QgICAgICAgICAgbHBjX21vZGVbVEFLX01BWF9DSEFOTkVMU107CisgICAgaW50OF90ICAgICAgICAgIHNhbXBsZV9zaGlmdFtUQUtfTUFYX0NIQU5ORUxTXTsgLy8vPCBzaGlmdCBhcHBsaWVkIHRvIGV2ZXJ5IHNhbXBsZSBpbiB0aGUgY2hhbm5lbAorICAgIGludDE2X3QgICAgICAgICBwcmVkaWN0b3JzW01BWF9QUkVESUNUT1JTXTsKKyAgICBpbnQgICAgICAgICAgICAgbmJfc3ViZnJhbWVzOyAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBzdWJmcmFtZXMgaW4gdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBpbnQxNl90ICAgICAgICAgc3ViZnJhbWVfbGVuW01BWF9TVUJGUkFNRVNdOyAgICAvLy88IHN1YmZyYW1lIGxlbmd0aCBpbiBzYW1wbGVzCisgICAgaW50ICAgICAgICAgICAgIHN1YmZyYW1lX3NjYWxlOworCisgICAgaW50OF90ICAgICAgICAgIGRtb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjaGFubmVsIGRlY29ycmVsYXRpb24gdHlwZSBpbiB0aGUgY3VycmVudCBmcmFtZQorCisgICAgTUNEUGFyYW0gICAgICAgIG1jZHBhcmFtc1tUQUtfTUFYX0NIQU5ORUxTXTsgICAgLy8vPCBtdWx0aWNoYW5uZWwgZGVjb3JyZWxhdGlvbiBwYXJhbWV0ZXJzCisKKyAgICBpbnQ4X3QgICAgICAgICAgY29kaW5nX21vZGVbMTI4XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGZpbHRlcilbTUFYX1BSRURJQ1RPUlNdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgcmVzaWR1ZXMpWzU0NF07Cit9IFRBS0RlY0NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbWNfZG1vZGVzW10gPSB7IDEsIDMsIDQsIDYsIH07CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBwcmVkaWN0b3Jfc2l6ZXNbXSA9IHsKKyAgICA0LCA4LCAxMiwgMTYsIDI0LCAzMiwgNDgsIDY0LCA4MCwgOTYsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBDUGFyYW0geworICAgIGludCBpbml0OworICAgIGludCBlc2NhcGU7CisgICAgaW50IHNjYWxlOworICAgIGludCBhZXNjYXBlOworICAgIGludCBiaWFzOworfSB4Y29kZXNbNTBdID0geworICAgIHsgMHgwMSwgMHgwMDAwMDAxLCAweDAwMDAwMDEsIDB4MDAwMDAwMywgMHgwMDAwMDA4IH0sCisgICAgeyAweDAyLCAweDAwMDAwMDMsIDB4MDAwMDAwMSwgMHgwMDAwMDA3LCAweDAwMDAwMDYgfSwKKyAgICB7IDB4MDMsIDB4MDAwMDAwNSwgMHgwMDAwMDAyLCAweDAwMDAwMEUsIDB4MDAwMDAwRCB9LAorICAgIHsgMHgwMywgMHgwMDAwMDAzLCAweDAwMDAwMDMsIDB4MDAwMDAwRCwgMHgwMDAwMDE4IH0sCisgICAgeyAweDA0LCAweDAwMDAwMEIsIDB4MDAwMDAwNCwgMHgwMDAwMDFDLCAweDAwMDAwMTkgfSwKKyAgICB7IDB4MDQsIDB4MDAwMDAwNiwgMHgwMDAwMDA2LCAweDAwMDAwMUEsIDB4MDAwMDAzMCB9LAorICAgIHsgMHgwNSwgMHgwMDAwMDE2LCAweDAwMDAwMDgsIDB4MDAwMDAzOCwgMHgwMDAwMDMyIH0sCisgICAgeyAweDA1LCAweDAwMDAwMEMsIDB4MDAwMDAwQywgMHgwMDAwMDM0LCAweDAwMDAwNjAgfSwKKyAgICB7IDB4MDYsIDB4MDAwMDAyQywgMHgwMDAwMDEwLCAweDAwMDAwNzAsIDB4MDAwMDA2NCB9LAorICAgIHsgMHgwNiwgMHgwMDAwMDE4LCAweDAwMDAwMTgsIDB4MDAwMDA2OCwgMHgwMDAwMEMwIH0sCisgICAgeyAweDA3LCAweDAwMDAwNTgsIDB4MDAwMDAyMCwgMHgwMDAwMEUwLCAweDAwMDAwQzggfSwKKyAgICB7IDB4MDcsIDB4MDAwMDAzMCwgMHgwMDAwMDMwLCAweDAwMDAwRDAsIDB4MDAwMDE4MCB9LAorICAgIHsgMHgwOCwgMHgwMDAwMEIwLCAweDAwMDAwNDAsIDB4MDAwMDFDMCwgMHgwMDAwMTkwIH0sCisgICAgeyAweDA4LCAweDAwMDAwNjAsIDB4MDAwMDA2MCwgMHgwMDAwMUEwLCAweDAwMDAzMDAgfSwKKyAgICB7IDB4MDksIDB4MDAwMDE2MCwgMHgwMDAwMDgwLCAweDAwMDAzODAsIDB4MDAwMDMyMCB9LAorICAgIHsgMHgwOSwgMHgwMDAwMEMwLCAweDAwMDAwQzAsIDB4MDAwMDM0MCwgMHgwMDAwNjAwIH0sCisgICAgeyAweDBBLCAweDAwMDAyQzAsIDB4MDAwMDEwMCwgMHgwMDAwNzAwLCAweDAwMDA2NDAgfSwKKyAgICB7IDB4MEEsIDB4MDAwMDE4MCwgMHgwMDAwMTgwLCAweDAwMDA2ODAsIDB4MDAwMEMwMCB9LAorICAgIHsgMHgwQiwgMHgwMDAwNTgwLCAweDAwMDAyMDAsIDB4MDAwMEUwMCwgMHgwMDAwQzgwIH0sCisgICAgeyAweDBCLCAweDAwMDAzMDAsIDB4MDAwMDMwMCwgMHgwMDAwRDAwLCAweDAwMDE4MDAgfSwKKyAgICB7IDB4MEMsIDB4MDAwMEIwMCwgMHgwMDAwNDAwLCAweDAwMDFDMDAsIDB4MDAwMTkwMCB9LAorICAgIHsgMHgwQywgMHgwMDAwNjAwLCAweDAwMDA2MDAsIDB4MDAwMUEwMCwgMHgwMDAzMDAwIH0sCisgICAgeyAweDBELCAweDAwMDE2MDAsIDB4MDAwMDgwMCwgMHgwMDAzODAwLCAweDAwMDMyMDAgfSwKKyAgICB7IDB4MEQsIDB4MDAwMEMwMCwgMHgwMDAwQzAwLCAweDAwMDM0MDAsIDB4MDAwNjAwMCB9LAorICAgIHsgMHgwRSwgMHgwMDAyQzAwLCAweDAwMDEwMDAsIDB4MDAwNzAwMCwgMHgwMDA2NDAwIH0sCisgICAgeyAweDBFLCAweDAwMDE4MDAsIDB4MDAwMTgwMCwgMHgwMDA2ODAwLCAweDAwMEMwMDAgfSwKKyAgICB7IDB4MEYsIDB4MDAwNTgwMCwgMHgwMDAyMDAwLCAweDAwMEUwMDAsIDB4MDAwQzgwMCB9LAorICAgIHsgMHgwRiwgMHgwMDAzMDAwLCAweDAwMDMwMDAsIDB4MDAwRDAwMCwgMHgwMDE4MDAwIH0sCisgICAgeyAweDEwLCAweDAwMEIwMDAsIDB4MDAwNDAwMCwgMHgwMDFDMDAwLCAweDAwMTkwMDAgfSwKKyAgICB7IDB4MTAsIDB4MDAwNjAwMCwgMHgwMDA2MDAwLCAweDAwMUEwMDAsIDB4MDAzMDAwMCB9LAorICAgIHsgMHgxMSwgMHgwMDE2MDAwLCAweDAwMDgwMDAsIDB4MDAzODAwMCwgMHgwMDMyMDAwIH0sCisgICAgeyAweDExLCAweDAwMEMwMDAsIDB4MDAwQzAwMCwgMHgwMDM0MDAwLCAweDAwNjAwMDAgfSwKKyAgICB7IDB4MTIsIDB4MDAyQzAwMCwgMHgwMDEwMDAwLCAweDAwNzAwMDAsIDB4MDA2NDAwMCB9LAorICAgIHsgMHgxMiwgMHgwMDE4MDAwLCAweDAwMTgwMDAsIDB4MDA2ODAwMCwgMHgwMEMwMDAwIH0sCisgICAgeyAweDEzLCAweDAwNTgwMDAsIDB4MDAyMDAwMCwgMHgwMEUwMDAwLCAweDAwQzgwMDAgfSwKKyAgICB7IDB4MTMsIDB4MDAzMDAwMCwgMHgwMDMwMDAwLCAweDAwRDAwMDAsIDB4MDE4MDAwMCB9LAorICAgIHsgMHgxNCwgMHgwMEIwMDAwLCAweDAwNDAwMDAsIDB4MDFDMDAwMCwgMHgwMTkwMDAwIH0sCisgICAgeyAweDE0LCAweDAwNjAwMDAsIDB4MDA2MDAwMCwgMHgwMUEwMDAwLCAweDAzMDAwMDAgfSwKKyAgICB7IDB4MTUsIDB4MDE2MDAwMCwgMHgwMDgwMDAwLCAweDAzODAwMDAsIDB4MDMyMDAwMCB9LAorICAgIHsgMHgxNSwgMHgwMEMwMDAwLCAweDAwQzAwMDAsIDB4MDM0MDAwMCwgMHgwNjAwMDAwIH0sCisgICAgeyAweDE2LCAweDAyQzAwMDAsIDB4MDEwMDAwMCwgMHgwNzAwMDAwLCAweDA2NDAwMDAgfSwKKyAgICB7IDB4MTYsIDB4MDE4MDAwMCwgMHgwMTgwMDAwLCAweDA2ODAwMDAsIDB4MEMwMDAwMCB9LAorICAgIHsgMHgxNywgMHgwNTgwMDAwLCAweDAyMDAwMDAsIDB4MEUwMDAwMCwgMHgwQzgwMDAwIH0sCisgICAgeyAweDE3LCAweDAzMDAwMDAsIDB4MDMwMDAwMCwgMHgwRDAwMDAwLCAweDE4MDAwMDAgfSwKKyAgICB7IDB4MTgsIDB4MEIwMDAwMCwgMHgwNDAwMDAwLCAweDFDMDAwMDAsIDB4MTkwMDAwMCB9LAorICAgIHsgMHgxOCwgMHgwNjAwMDAwLCAweDA2MDAwMDAsIDB4MUEwMDAwMCwgMHgzMDAwMDAwIH0sCisgICAgeyAweDE5LCAweDE2MDAwMDAsIDB4MDgwMDAwMCwgMHgzODAwMDAwLCAweDMyMDAwMDAgfSwKKyAgICB7IDB4MTksIDB4MEMwMDAwMCwgMHgwQzAwMDAwLCAweDM0MDAwMDAsIDB4NjAwMDAwMCB9LAorICAgIHsgMHgxQSwgMHgyQzAwMDAwLCAweDEwMDAwMDAsIDB4NzAwMDAwMCwgMHg2NDAwMDAwIH0sCisgICAgeyAweDFBLCAweDE4MDAwMDAsIDB4MTgwMDAwMCwgMHg2ODAwMDAwLCAweEMwMDAwMDAgfSwKK307CisKK3N0YXRpYyBpbnQgc2V0X2Jwc19wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHN3aXRjaCAoYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUpIHsKKyAgICBjYXNlIDg6CisgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9VOFA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTZQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0OgorICAgICAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzMyUDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkL3Vuc3VwcG9ydGVkIGJpdHMgcGVyIHNhbXBsZTogJWRcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfc2FtcGxlX3JhdGVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBUQUtEZWNDb250ZXh0ICpzICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHNoaWZ0ICAgICAgICAgPSAzIC0gKGF2Y3R4LT5zYW1wbGVfcmF0ZSAvIDExMDI1KTsKKyAgICBzaGlmdCAgICAgICAgICAgICA9IEZGTUFYKDAsIHNoaWZ0KTsKKyAgICBzLT51dmFsICAgICAgICAgICA9IEZGQUxJR04oYXZjdHgtPnNhbXBsZV9yYXRlICsgNTExID4+IDksIDQpIDw8IHNoaWZ0OworICAgIHMtPnN1YmZyYW1lX3NjYWxlID0gRkZBTElHTihhdmN0eC0+c2FtcGxlX3JhdGUgKyA1MTEgPj4gOSwgNCkgPDwgMTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHRha19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVEFLRGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmZl9hdWRpb2RzcF9pbml0KCZzLT5hZHNwKTsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworCisgICAgc2V0X3NhbXBsZV9yYXRlX3BhcmFtcyhhdmN0eCk7CisKKyAgICByZXR1cm4gc2V0X2Jwc19wYXJhbXMoYXZjdHgpOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfbHBjKGludDMyX3QgKmNvZWZmcywgaW50IG1vZGUsIGludCBsZW5ndGgpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAobGVuZ3RoIDwgMikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1vZGUgPT0gMSkgeworICAgICAgICBpbnQgYTEgPSAqY29lZmZzKys7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLSAxID4+IDE7IGkrKykgeworICAgICAgICAgICAgKmNvZWZmcyAgICs9IGExOworICAgICAgICAgICAgY29lZmZzWzFdICs9ICpjb2VmZnM7CisgICAgICAgICAgICBhMSAgICAgICAgID0gY29lZmZzWzFdOworICAgICAgICAgICAgY29lZmZzICAgICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbmd0aCAtIDEgJiAxKQorICAgICAgICAgICAgKmNvZWZmcyArPSBhMTsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMikgeworICAgICAgICBpbnQgYTEgICAgPSBjb2VmZnNbMV07CisgICAgICAgIGludCBhMiAgICA9IGExICsgKmNvZWZmczsKKyAgICAgICAgY29lZmZzWzFdID0gYTI7CisgICAgICAgIGlmIChsZW5ndGggPiAyKSB7CisgICAgICAgICAgICBjb2VmZnMgKz0gMjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLSAyID4+IDE7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBhMyAgICA9ICpjb2VmZnMgKyBhMTsKKyAgICAgICAgICAgICAgICBpbnQgYTQgICAgPSBhMyArIGEyOworICAgICAgICAgICAgICAgICpjb2VmZnMgICA9IGE0OworICAgICAgICAgICAgICAgIGExICAgICAgICA9IGNvZWZmc1sxXSArIGEzOworICAgICAgICAgICAgICAgIGEyICAgICAgICA9IGExICsgYTQ7CisgICAgICAgICAgICAgICAgY29lZmZzWzFdID0gYTI7CisgICAgICAgICAgICAgICAgY29lZmZzICAgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW5ndGggJiAxKQorICAgICAgICAgICAgICAgICpjb2VmZnMgKz0gYTEgKyBhMjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobW9kZSA9PSAzKSB7CisgICAgICAgIGludCBhMSAgICA9IGNvZWZmc1sxXTsKKyAgICAgICAgaW50IGEyICAgID0gYTEgKyAqY29lZmZzOworICAgICAgICBjb2VmZnNbMV0gPSBhMjsKKyAgICAgICAgaWYgKGxlbmd0aCA+IDIpIHsKKyAgICAgICAgICAgIGludCBhMyAgPSBjb2VmZnNbMl07CisgICAgICAgICAgICBpbnQgYTQgID0gYTMgKyBhMTsKKyAgICAgICAgICAgIGludCBhNSAgPSBhNCArIGEyOworICAgICAgICAgICAgY29lZmZzICs9IDM7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoIC0gMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgYTMgICAgICs9ICpjb2VmZnM7CisgICAgICAgICAgICAgICAgYTQgICAgICs9IGEzOworICAgICAgICAgICAgICAgIGE1ICAgICArPSBhNDsKKyAgICAgICAgICAgICAgICAqY29lZmZzID0gYTU7CisgICAgICAgICAgICAgICAgY29lZmZzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3NlZ21lbnQoVEFLRGVjQ29udGV4dCAqcywgaW50OF90IG1vZGUsIGludDMyX3QgKmRlY29kZWQsIGludCBsZW4pCit7CisgICAgc3RydWN0IENQYXJhbSBjb2RlOworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOworICAgIGludCBpOworCisgICAgaWYgKCFtb2RlKSB7CisgICAgICAgIG1lbXNldChkZWNvZGVkLCAwLCBsZW4gKiBzaXplb2YoKmRlY29kZWQpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKG1vZGUgPiBGRl9BUlJBWV9FTEVNUyh4Y29kZXMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBjb2RlID0geGNvZGVzW21vZGUgLSAxXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpbnQgeCA9IGdldF9iaXRzX2xvbmcoZ2IsIGNvZGUuaW5pdCk7CisgICAgICAgIGlmICh4ID49IGNvZGUuZXNjYXBlICYmIGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIHggfD0gMSA8PCBjb2RlLmluaXQ7CisgICAgICAgICAgICBpZiAoeCA+PSBjb2RlLmFlc2NhcGUpIHsKKyAgICAgICAgICAgICAgICBpbnQgc2NhbGUgPSBnZXRfdW5hcnkoZ2IsIDEsIDkpOworICAgICAgICAgICAgICAgIGlmIChzY2FsZSA9PSA5KSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzY2FsZV9iaXRzID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGVfYml0cyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2FsZV9iaXRzID09IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9iaXRzICs9IGdldF9iaXRzKGdiLCA1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGVfYml0cyA+IDI5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gZ2V0X2JpdHNfbG9uZyhnYiwgc2NhbGVfYml0cykgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgeCAgICArPSBjb2RlLnNjYWxlICogc2NhbGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeCArPSBjb2RlLmJpYXM7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHggKz0gY29kZS5zY2FsZSAqIHNjYWxlIC0gY29kZS5lc2NhcGU7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB4IC09IGNvZGUuZXNjYXBlOworICAgICAgICB9CisgICAgICAgIGRlY29kZWRbaV0gPSAoeCA+PiAxKSBeIC0oeCAmIDEpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9yZXNpZHVlcyhUQUtEZWNDb250ZXh0ICpzLCBpbnQzMl90ICpkZWNvZGVkLCBpbnQgbGVuZ3RoKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOworICAgIGludCBpLCBtb2RlLCByZXQ7CisKKyAgICBpZiAobGVuZ3RoID4gcy0+bmJfc2FtcGxlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBpbnQgd2xlbmd0aCwgcnZhbDsKKworICAgICAgICB3bGVuZ3RoID0gbGVuZ3RoIC8gcy0+dXZhbDsKKworICAgICAgICBydmFsID0gbGVuZ3RoIC0gKHdsZW5ndGggKiBzLT51dmFsKTsKKworICAgICAgICBpZiAocnZhbCA8IHMtPnV2YWwgLyAyKQorICAgICAgICAgICAgcnZhbCArPSBzLT51dmFsOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3bGVuZ3RoKys7CisKKyAgICAgICAgaWYgKHdsZW5ndGggPD0gMSB8fCB3bGVuZ3RoID4gMTI4KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgcy0+Y29kaW5nX21vZGVbMF0gPSBtb2RlID0gZ2V0X2JpdHMoZ2IsIDYpOworCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCB3bGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjID0gZ2V0X3VuYXJ5KGdiLCAxLCA2KTsKKworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgbW9kZSA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNhc2UgMzogeworICAgICAgICAgICAgICAgIC8qIG1vZGUgKz0gc2lnbiA/ICgxIC0gYykgOiAoYyAtIDEpICovCisgICAgICAgICAgICAgICAgaW50IHNpZ24gPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIG1vZGUgICAgKz0gKC1zaWduIF4gKGMgLSAxKSkgKyBzaWduOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIG1vZGUrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBtb2RlLS07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5jb2RpbmdfbW9kZVtpXSA9IG1vZGU7CisgICAgICAgIH0KKworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCB3bGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgbGVuID0gMDsKKworICAgICAgICAgICAgbW9kZSA9IHMtPmNvZGluZ19tb2RlW2ldOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChpID49IHdsZW5ndGggLSAxKQorICAgICAgICAgICAgICAgICAgICBsZW4gKz0gcnZhbDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGxlbiArPSBzLT51dmFsOworICAgICAgICAgICAgICAgIGkrKzsKKworICAgICAgICAgICAgICAgIGlmIChpID09IHdsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSB3aGlsZSAocy0+Y29kaW5nX21vZGVbaV0gPT0gbW9kZSk7CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX3NlZ21lbnQocywgbW9kZSwgZGVjb2RlZCwgbGVuKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBkZWNvZGVkICs9IGxlbjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1vZGUgPSBnZXRfYml0cyhnYiwgNik7CisgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX3NlZ21lbnQocywgbW9kZSwgZGVjb2RlZCwgbGVuZ3RoKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfYml0c19lc2M0KEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGlmIChnZXRfYml0czEoZ2IpKQorICAgICAgICByZXR1cm4gZ2V0X2JpdHMoZ2IsIDQpICsgMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9zdWJmcmFtZShUQUtEZWNDb250ZXh0ICpzLCBpbnQzMl90ICpkZWNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmZyYW1lX3NpemUsIGludCBwcmV2X3N1YmZyYW1lX3NpemUpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+Z2I7CisgICAgaW50IHgsIHksIGksIGosIHJldCA9IDA7CisgICAgaW50IGRzaGlmdCwgc2l6ZSwgZmlsdGVyX3F1YW50LCBmaWx0ZXJfb3JkZXI7CisgICAgaW50IHRmaWx0ZXJbTUFYX1BSRURJQ1RPUlNdOworCisgICAgaWYgKCFnZXRfYml0czEoZ2IpKQorICAgICAgICByZXR1cm4gZGVjb2RlX3Jlc2lkdWVzKHMsIGRlY29kZWQsIHN1YmZyYW1lX3NpemUpOworCisgICAgZmlsdGVyX29yZGVyID0gcHJlZGljdG9yX3NpemVzW2dldF9iaXRzKGdiLCA0KV07CisKKyAgICBpZiAocHJldl9zdWJmcmFtZV9zaXplID4gMCAmJiBnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGlmIChmaWx0ZXJfb3JkZXIgPiBwcmV2X3N1YmZyYW1lX3NpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBkZWNvZGVkICAgICAgIC09IGZpbHRlcl9vcmRlcjsKKyAgICAgICAgc3ViZnJhbWVfc2l6ZSArPSBmaWx0ZXJfb3JkZXI7CisKKyAgICAgICAgaWYgKGZpbHRlcl9vcmRlciA+IHN1YmZyYW1lX3NpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgbHBjX21vZGU7CisKKyAgICAgICAgaWYgKGZpbHRlcl9vcmRlciA+IHN1YmZyYW1lX3NpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBscGNfbW9kZSA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgaWYgKGxwY19tb2RlID4gMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX3Jlc2lkdWVzKHMsIGRlY29kZWQsIGZpbHRlcl9vcmRlcikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKGxwY19tb2RlKQorICAgICAgICAgICAgZGVjb2RlX2xwYyhkZWNvZGVkLCBscGNfbW9kZSwgZmlsdGVyX29yZGVyKTsKKyAgICB9CisKKyAgICBkc2hpZnQgPSBnZXRfYml0c19lc2M0KGdiKTsKKyAgICBzaXplICAgPSBnZXRfYml0czEoZ2IpICsgNjsKKworICAgIGZpbHRlcl9xdWFudCA9IDEwOworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGZpbHRlcl9xdWFudCAtPSBnZXRfYml0cyhnYiwgMykgKyAxOworICAgICAgICBpZiAoZmlsdGVyX3F1YW50IDwgMykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPnByZWRpY3RvcnNbMF0gPSBnZXRfc2JpdHMoZ2IsIDEwKTsKKyAgICBzLT5wcmVkaWN0b3JzWzFdID0gZ2V0X3NiaXRzKGdiLCAxMCk7CisgICAgcy0+cHJlZGljdG9yc1syXSA9IGdldF9zYml0cyhnYiwgc2l6ZSkgPDwgKDEwIC0gc2l6ZSk7CisgICAgcy0+cHJlZGljdG9yc1szXSA9IGdldF9zYml0cyhnYiwgc2l6ZSkgPDwgKDEwIC0gc2l6ZSk7CisgICAgaWYgKGZpbHRlcl9vcmRlciA+IDQpIHsKKyAgICAgICAgaW50IHRtcCA9IHNpemUgLSBnZXRfYml0czEoZ2IpOworCisgICAgICAgIGZvciAoaSA9IDQ7IGkgPCBmaWx0ZXJfb3JkZXI7IGkrKykgeworICAgICAgICAgICAgaWYgKCEoaSAmIDMpKQorICAgICAgICAgICAgICAgIHggPSB0bXAgLSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICBzLT5wcmVkaWN0b3JzW2ldID0gZ2V0X3NiaXRzKGdiLCB4KSA8PCAoMTAgLSBzaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRmaWx0ZXJbMF0gPSBzLT5wcmVkaWN0b3JzWzBdIDw8IDY7CisgICAgZm9yIChpID0gMTsgaSA8IGZpbHRlcl9vcmRlcjsgaSsrKSB7CisgICAgICAgIGludDMyX3QgKnAxID0gJnRmaWx0ZXJbMF07CisgICAgICAgIGludDMyX3QgKnAyID0gJnRmaWx0ZXJbaSAtIDFdOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAoaSArIDEpIC8gMjsgaisrKSB7CisgICAgICAgICAgICB4ICAgICA9ICpwMSArIChzLT5wcmVkaWN0b3JzW2ldICogKnAyICsgMjU2ID4+IDkpOworICAgICAgICAgICAgKnAyICArPSBzLT5wcmVkaWN0b3JzW2ldICogKnAxICsgMjU2ID4+IDk7CisgICAgICAgICAgICAqcDErKyA9IHg7CisgICAgICAgICAgICBwMi0tOworICAgICAgICB9CisKKyAgICAgICAgdGZpbHRlcltpXSA9IHMtPnByZWRpY3RvcnNbaV0gPDwgNjsKKyAgICB9CisKKyAgICB4ID0gMSA8PCAoMzIgLSAoMTUgLSBmaWx0ZXJfcXVhbnQpKTsKKyAgICB5ID0gMSA8PCAoKDE1IC0gZmlsdGVyX3F1YW50KSAtIDEpOworICAgIGZvciAoaSA9IDAsIGogPSBmaWx0ZXJfb3JkZXIgLSAxOyBpIDwgZmlsdGVyX29yZGVyIC8gMjsgaSsrLCBqLS0pIHsKKyAgICAgICAgcy0+ZmlsdGVyW2pdID0geCAtICgodGZpbHRlcltpXSArIHkpID4+ICgxNSAtIGZpbHRlcl9xdWFudCkpOworICAgICAgICBzLT5maWx0ZXJbaV0gPSB4IC0gKCh0ZmlsdGVyW2pdICsgeSkgPj4gKDE1IC0gZmlsdGVyX3F1YW50KSk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBkZWNvZGVfcmVzaWR1ZXMocywgJmRlY29kZWRbZmlsdGVyX29yZGVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJmcmFtZV9zaXplIC0gZmlsdGVyX29yZGVyKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcl9vcmRlcjsgaSsrKQorICAgICAgICBzLT5yZXNpZHVlc1tpXSA9ICpkZWNvZGVkKysgPj4gZHNoaWZ0OworCisgICAgeSAgICA9IEZGX0FSUkFZX0VMRU1TKHMtPnJlc2lkdWVzKSAtIGZpbHRlcl9vcmRlcjsKKyAgICB4ICAgID0gc3ViZnJhbWVfc2l6ZSAtIGZpbHRlcl9vcmRlcjsKKyAgICB3aGlsZSAoeCA+IDApIHsKKyAgICAgICAgaW50IHRtcCA9IEZGTUlOKHksIHgpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0bXA7IGkrKykgeworICAgICAgICAgICAgaW50IHYgPSAxIDw8IChmaWx0ZXJfcXVhbnQgLSAxKTsKKworICAgICAgICAgICAgaWYgKGZpbHRlcl9vcmRlciAmIC0xNikKKyAgICAgICAgICAgICAgICB2ICs9IHMtPmFkc3Auc2NhbGFycHJvZHVjdF9pbnQxNigmcy0+cmVzaWR1ZXNbaV0sIHMtPmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfb3JkZXIgJiAtMTYpOworICAgICAgICAgICAgZm9yIChqID0gZmlsdGVyX29yZGVyICYgLTE2OyBqIDwgZmlsdGVyX29yZGVyOyBqICs9IDQpIHsKKyAgICAgICAgICAgICAgICB2ICs9IHMtPnJlc2lkdWVzW2kgKyBqICsgM10gKiBzLT5maWx0ZXJbaiArIDNdICsKKyAgICAgICAgICAgICAgICAgICAgIHMtPnJlc2lkdWVzW2kgKyBqICsgMl0gKiBzLT5maWx0ZXJbaiArIDJdICsKKyAgICAgICAgICAgICAgICAgICAgIHMtPnJlc2lkdWVzW2kgKyBqICsgMV0gKiBzLT5maWx0ZXJbaiArIDFdICsKKyAgICAgICAgICAgICAgICAgICAgIHMtPnJlc2lkdWVzW2kgKyBqICAgIF0gKiBzLT5maWx0ZXJbaiAgICBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdiA9IChhdl9jbGlwKHYgPj4gZmlsdGVyX3F1YW50LCAtODE5MiwgODE5MSkgPDwgZHNoaWZ0KSAtICpkZWNvZGVkOworICAgICAgICAgICAgKmRlY29kZWQrKyA9IHY7CisgICAgICAgICAgICBzLT5yZXNpZHVlc1tmaWx0ZXJfb3JkZXIgKyBpXSA9IHYgPj4gZHNoaWZ0OworICAgICAgICB9CisKKyAgICAgICAgeCAtPSB0bXA7CisgICAgICAgIGlmICh4ID4gMCkKKyAgICAgICAgICAgIG1lbWNweShzLT5yZXNpZHVlcywgJnMtPnJlc2lkdWVzW3ldLCAyICogZmlsdGVyX29yZGVyKTsKKyAgICB9CisKKyAgICBlbW1zX2MoKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jaGFubmVsKFRBS0RlY0NvbnRleHQgKnMsIGludCBjaGFuKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPmF2Y3R4OworICAgIEdldEJpdENvbnRleHQgKmdiICAgICA9ICZzLT5nYjsKKyAgICBpbnQzMl90ICpkZWNvZGVkICAgICAgPSBzLT5kZWNvZGVkW2NoYW5dOworICAgIGludCBsZWZ0ICAgICAgICAgICAgICA9IHMtPm5iX3NhbXBsZXMgLSAxOworICAgIGludCBpID0gMCwgcmV0LCBwcmV2ID0gMDsKKworICAgIHMtPnNhbXBsZV9zaGlmdFtjaGFuXSA9IGdldF9iaXRzX2VzYzQoZ2IpOworICAgIGlmIChzLT5zYW1wbGVfc2hpZnRbY2hhbl0gPj0gYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgKmRlY29kZWQrKyA9IGdldF9zYml0cyhnYiwgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgLSBzLT5zYW1wbGVfc2hpZnRbY2hhbl0pOworICAgIHMtPmxwY19tb2RlW2NoYW5dID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgIHMtPm5iX3N1YmZyYW1lcyAgID0gZ2V0X2JpdHMoZ2IsIDMpICsgMTsKKworICAgIGlmIChzLT5uYl9zdWJmcmFtZXMgPiAxKSB7CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IChzLT5uYl9zdWJmcmFtZXMgLSAxKSAqIDYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBmb3IgKDsgaSA8IHMtPm5iX3N1YmZyYW1lcyAtIDE7IGkrKykgeworICAgICAgICAgICAgaW50IHYgPSBnZXRfYml0cyhnYiwgNik7CisKKyAgICAgICAgICAgIHMtPnN1YmZyYW1lX2xlbltpXSA9ICh2IC0gcHJldikgKiBzLT5zdWJmcmFtZV9zY2FsZTsKKyAgICAgICAgICAgIGlmIChzLT5zdWJmcmFtZV9sZW5baV0gPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgbGVmdCAtPSBzLT5zdWJmcmFtZV9sZW5baV07CisgICAgICAgICAgICBwcmV2ICA9IHY7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGVmdCA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHMtPnN1YmZyYW1lX2xlbltpXSA9IGxlZnQ7CisKKyAgICBwcmV2ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3ViZnJhbWVzOyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfc3ViZnJhbWUocywgZGVjb2RlZCwgcy0+c3ViZnJhbWVfbGVuW2ldLCBwcmV2KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZGVjb2RlZCArPSBzLT5zdWJmcmFtZV9sZW5baV07CisgICAgICAgIHByZXYgICAgID0gcy0+c3ViZnJhbWVfbGVuW2ldOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29ycmVsYXRlKFRBS0RlY0NvbnRleHQgKnMsIGludCBjMSwgaW50IGMyLCBpbnQgbGVuZ3RoKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOworICAgIGludDMyX3QgKnAxICAgICAgID0gcy0+ZGVjb2RlZFtjMV0gKyAxOworICAgIGludDMyX3QgKnAyICAgICAgID0gcy0+ZGVjb2RlZFtjMl0gKyAxOworICAgIGludCBpOworICAgIGludCBkc2hpZnQsIGRmYWN0b3I7CisKKyAgICBzd2l0Y2ggKHMtPmRtb2RlKSB7CisgICAgY2FzZSAxOiAvKiBsZWZ0L3NpZGUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IGEgPSBwMVtpXTsKKyAgICAgICAgICAgIGludDMyX3QgYiA9IHAyW2ldOworICAgICAgICAgICAgcDJbaV0gICAgID0gYSArIGI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvKiBzaWRlL3JpZ2h0ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBhID0gcDFbaV07CisgICAgICAgICAgICBpbnQzMl90IGIgPSBwMltpXTsKKyAgICAgICAgICAgIHAxW2ldICAgICA9IGIgLSBhOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLyogc2lkZS9taWQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IGEgPSBwMVtpXTsKKyAgICAgICAgICAgIGludDMyX3QgYiA9IHAyW2ldOworICAgICAgICAgICAgYSAgICAgICAgLT0gYiA+PiAxOworICAgICAgICAgICAgcDFbaV0gICAgID0gYTsKKyAgICAgICAgICAgIHAyW2ldICAgICA9IGEgKyBiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDogLyogc2lkZS9sZWZ0IHdpdGggc2NhbGUgZmFjdG9yICovCisgICAgICAgIEZGU1dBUChpbnQzMl90KiwgcDEsIHAyKTsKKyAgICBjYXNlIDU6IC8qIHNpZGUvcmlnaHQgd2l0aCBzY2FsZSBmYWN0b3IgKi8KKyAgICAgICAgZHNoaWZ0ICA9IGdldF9iaXRzX2VzYzQoZ2IpOworICAgICAgICBkZmFjdG9yID0gZ2V0X3NiaXRzKGdiLCAxMCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBhID0gcDFbaV07CisgICAgICAgICAgICBpbnQzMl90IGIgPSBwMltpXTsKKyAgICAgICAgICAgIGIgICAgICAgICA9IGRmYWN0b3IgKiAoYiA+PiBkc2hpZnQpICsgMTI4ID4+IDggPDwgZHNoaWZ0OworICAgICAgICAgICAgcDFbaV0gICAgID0gYiAtIGE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICBGRlNXQVAoaW50MzJfdCosIHAxLCBwMik7CisgICAgY2FzZSA3OiB7CisgICAgICAgIGludCBsZW5ndGgyLCBvcmRlcl9oYWxmLCBmaWx0ZXJfb3JkZXIsIGR2YWwxLCBkdmFsMjsKKyAgICAgICAgaW50IHRtcCwgeCwgY29kZV9zaXplOworCisgICAgICAgIGlmIChsZW5ndGggPCAyNTYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBkc2hpZnQgICAgICAgPSBnZXRfYml0c19lc2M0KGdiKTsKKyAgICAgICAgZmlsdGVyX29yZGVyID0gOCA8PCBnZXRfYml0czEoZ2IpOworICAgICAgICBkdmFsMSAgICAgICAgPSBnZXRfYml0czEoZ2IpOworICAgICAgICBkdmFsMiAgICAgICAgPSBnZXRfYml0czEoZ2IpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJfb3JkZXI7IGkrKykgeworICAgICAgICAgICAgaWYgKCEoaSAmIDMpKQorICAgICAgICAgICAgICAgIGNvZGVfc2l6ZSA9IDE0IC0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgcy0+ZmlsdGVyW2ldID0gZ2V0X3NiaXRzKGdiLCBjb2RlX3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgb3JkZXJfaGFsZiA9IGZpbHRlcl9vcmRlciAvIDI7CisgICAgICAgIGxlbmd0aDIgICAgPSBsZW5ndGggLSAoZmlsdGVyX29yZGVyIC0gMSk7CisKKyAgICAgICAgLyogZGVjb3JyZWxhdGUgYmVnaW5uaW5nIHNhbXBsZXMgKi8KKyAgICAgICAgaWYgKGR2YWwxKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXJfaGFsZjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBhID0gcDFbaV07CisgICAgICAgICAgICAgICAgaW50MzJfdCBiID0gcDJbaV07CisgICAgICAgICAgICAgICAgcDFbaV0gICAgID0gYSArIGI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBkZWNvcnJlbGF0ZSBlbmRpbmcgc2FtcGxlcyAqLworICAgICAgICBpZiAoZHZhbDIpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IGxlbmd0aDIgKyBvcmRlcl9oYWxmOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGEgPSBwMVtpXTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGIgPSBwMltpXTsKKyAgICAgICAgICAgICAgICBwMVtpXSAgICAgPSBhICsgYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcl9vcmRlcjsgaSsrKQorICAgICAgICAgICAgcy0+cmVzaWR1ZXNbaV0gPSAqcDIrKyA+PiBkc2hpZnQ7CisKKyAgICAgICAgcDEgKz0gb3JkZXJfaGFsZjsKKyAgICAgICAgeCA9IEZGX0FSUkFZX0VMRU1TKHMtPnJlc2lkdWVzKSAtIGZpbHRlcl9vcmRlcjsKKyAgICAgICAgZm9yICg7IGxlbmd0aDIgPiAwOyBsZW5ndGgyIC09IHRtcCkgeworICAgICAgICAgICAgdG1wID0gRkZNSU4obGVuZ3RoMiwgeCk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0bXA7IGkrKykKKyAgICAgICAgICAgICAgICBzLT5yZXNpZHVlc1tmaWx0ZXJfb3JkZXIgKyBpXSA9ICpwMisrID4+IGRzaGlmdDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRtcDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHYgPSAxIDw8IDk7CisKKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyX29yZGVyID09IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIHYgKz0gcy0+YWRzcC5zY2FsYXJwcm9kdWN0X2ludDE2KCZzLT5yZXNpZHVlc1tpXSwgcy0+ZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfb3JkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHYgKz0gcy0+cmVzaWR1ZXNbaSArIDddICogcy0+ZmlsdGVyWzddICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZXNpZHVlc1tpICsgNl0gKiBzLT5maWx0ZXJbNl0gKworICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlc2lkdWVzW2kgKyA1XSAqIHMtPmZpbHRlcls1XSArCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVzaWR1ZXNbaSArIDRdICogcy0+ZmlsdGVyWzRdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZXNpZHVlc1tpICsgM10gKiBzLT5maWx0ZXJbM10gKworICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlc2lkdWVzW2kgKyAyXSAqIHMtPmZpbHRlclsyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVzaWR1ZXNbaSArIDFdICogcy0+ZmlsdGVyWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZXNpZHVlc1tpICAgIF0gKiBzLT5maWx0ZXJbMF07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdiA9IChhdl9jbGlwKHYgPj4gMTAsIC04MTkyLCA4MTkxKSA8PCBkc2hpZnQpIC0gKnAxOworICAgICAgICAgICAgICAgICpwMSsrID0gdjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KHMtPnJlc2lkdWVzLCAmcy0+cmVzaWR1ZXNbdG1wXSwgMiAqIGZpbHRlcl9vcmRlcik7CisgICAgICAgIH0KKworICAgICAgICBlbW1zX2MoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRha19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBUQUtEZWNDb250ZXh0ICpzICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgPSBkYXRhOworICAgIFRocmVhZEZyYW1lIHRmcmFtZSA9IHsgLmYgPSBkYXRhIH07CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+Z2I7CisgICAgaW50IGNoYW4sIGksIHJldCwgaHNpemU7CisKKyAgICBpZiAocGt0LT5zaXplIDwgVEFLX01JTl9GUkFNRV9IRUFERVJfQllURVMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOChnYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3Rha19kZWNvZGVfZnJhbWVfaGVhZGVyKGF2Y3R4LCBnYiwgJnMtPnRpLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaHNpemUgPSBnZXRfYml0c19jb3VudChnYikgLyA4OworICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgKEFWX0VGX0NSQ0NIRUNLfEFWX0VGX0NPTVBMSUFOVCkpIHsKKyAgICAgICAgaWYgKGZmX3Rha19jaGVja19jcmMocGt0LT5kYXRhLCBoc2l6ZSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ1JDIGVycm9yXG4iKTsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT50aS5jb2RlYyAhPSBUQUtfQ09ERUNfTU9OT19TVEVSRU8gJiYKKyAgICAgICAgcy0+dGkuY29kZWMgIT0gVEFLX0NPREVDX01VTFRJQ0hBTk5FTCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGNvZGVjOiAlZFxuIiwgcy0+dGkuY29kZWMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIGlmIChzLT50aS5kYXRhX3R5cGUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAlZFxuIiwgcy0+dGkuZGF0YV90eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChzLT50aS5jb2RlYyA9PSBUQUtfQ09ERUNfTU9OT19TVEVSRU8gJiYgcy0+dGkuY2hhbm5lbHMgPiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAlZFxuIiwgcy0+dGkuY2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKHMtPnRpLmNoYW5uZWxzID4gNikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHM6ICVkXG4iLCBzLT50aS5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzLT50aS5mcmFtZV9zYW1wbGVzIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZC9pbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBzLT50aS5icHM7CisgICAgaWYgKChyZXQgPSBzZXRfYnBzX3BhcmFtcyhhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAocy0+dGkuc2FtcGxlX3JhdGUgIT0gYXZjdHgtPnNhbXBsZV9yYXRlKSB7CisgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IHMtPnRpLnNhbXBsZV9yYXRlOworICAgICAgICBzZXRfc2FtcGxlX3JhdGVfcGFyYW1zKGF2Y3R4KTsKKyAgICB9CisgICAgaWYgKHMtPnRpLmNoX2xheW91dCkKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gcy0+dGkuY2hfbGF5b3V0OworICAgIGF2Y3R4LT5jaGFubmVscyA9IHMtPnRpLmNoYW5uZWxzOworCisgICAgcy0+bmJfc2FtcGxlcyA9IHMtPnRpLmxhc3RfZnJhbWVfc2FtcGxlcyA/IHMtPnRpLmxhc3RfZnJhbWVfc2FtcGxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzLT50aS5mcmFtZV9zYW1wbGVzOworCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBzLT5uYl9zYW1wbGVzOworICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZ0ZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChhdmN0eCk7CisKKyAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPD0gMTYpIHsKKyAgICAgICAgaW50IGJ1Zl9zaXplID0gYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoTlVMTCwgYXZjdHgtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMlAsIDApOworICAgICAgICBhdl9mYXN0X21hbGxvYygmcy0+ZGVjb2RlX2J1ZmZlciwgJnMtPmRlY29kZV9idWZmZXJfc2l6ZSwgYnVmX3NpemUpOworICAgICAgICBpZiAoIXMtPmRlY29kZV9idWZmZXIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICByZXQgPSBhdl9zYW1wbGVzX2ZpbGxfYXJyYXlzKCh1aW50OF90ICoqKXMtPmRlY29kZWQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVjb2RlX2J1ZmZlciwgYXZjdHgtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5iX3NhbXBsZXMsIEFWX1NBTVBMRV9GTVRfUzMyUCwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgYXZjdHgtPmNoYW5uZWxzOyBjaGFuKyspCisgICAgICAgICAgICBzLT5kZWNvZGVkW2NoYW5dID0gKGludDMyX3QgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaGFuXTsKKyAgICB9CisKKyAgICBpZiAocy0+bmJfc2FtcGxlcyA8IDE2KSB7CisgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBhdmN0eC0+Y2hhbm5lbHM7IGNoYW4rKykgeworICAgICAgICAgICAgaW50MzJfdCAqZGVjb2RlZCA9IHMtPmRlY29kZWRbY2hhbl07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc2FtcGxlczsgaSsrKQorICAgICAgICAgICAgICAgIGRlY29kZWRbaV0gPSBnZXRfc2JpdHMoZ2IsIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzLT50aS5jb2RlYyA9PSBUQUtfQ09ERUNfTU9OT19TVEVSRU8pIHsKKyAgICAgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBhdmN0eC0+Y2hhbm5lbHM7IGNoYW4rKykKKyAgICAgICAgICAgICAgICBpZiAocmV0ID0gZGVjb2RlX2NoYW5uZWwocywgY2hhbikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPT0gMikgeworICAgICAgICAgICAgICAgIHMtPm5iX3N1YmZyYW1lcyA9IGdldF9iaXRzKGdiLCAxKSArIDE7CisgICAgICAgICAgICAgICAgaWYgKHMtPm5iX3N1YmZyYW1lcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+c3ViZnJhbWVfbGVuWzFdID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHMtPmRtb2RlID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPSBkZWNvcnJlbGF0ZShzLCAwLCAxLCBzLT5uYl9zYW1wbGVzIC0gMSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+dGkuY29kZWMgPT0gVEFLX0NPREVDX01VTFRJQ0hBTk5FTCkgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgICAgICBpbnQgY2hfbWFzayA9IDA7CisKKyAgICAgICAgICAgICAgICBjaGFuID0gZ2V0X2JpdHMoZ2IsIDQpICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbiA+IGF2Y3R4LT5jaGFubmVscykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuYml0ID0gZ2V0X2JpdHMoZ2IsIDQpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChuYml0ID49IGF2Y3R4LT5jaGFubmVscykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjaF9tYXNrICYgMSA8PCBuYml0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICAgICAgcy0+bWNkcGFyYW1zW2ldLnByZXNlbnQgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bWNkcGFyYW1zW2ldLnByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1jZHBhcmFtc1tpXS5pbmRleCA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1jZHBhcmFtc1tpXS5jaGFuMiA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tY2RwYXJhbXNbaV0uaW5kZXggPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmJpdCA9PSBzLT5tY2RwYXJhbXNbaV0uY2hhbjIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaF9tYXNrICYgMSA8PCBzLT5tY2RwYXJhbXNbaV0uY2hhbjIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoX21hc2sgfD0gMSA8PCBzLT5tY2RwYXJhbXNbaV0uY2hhbjI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoY2hfbWFzayAmIDEgPDwgcy0+bWNkcGFyYW1zW2ldLmNoYW4yKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMtPm1jZHBhcmFtc1tpXS5jaGFuMSA9IG5iaXQ7CisKKyAgICAgICAgICAgICAgICAgICAgY2hfbWFzayB8PSAxIDw8IG5iaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFuID0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWNkcGFyYW1zW2ldLnByZXNlbnQgPSAwOworICAgICAgICAgICAgICAgICAgICBzLT5tY2RwYXJhbXNbaV0uY2hhbjEgICA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPm1jZHBhcmFtc1tpXS5wcmVzZW50ICYmIHMtPm1jZHBhcmFtc1tpXS5pbmRleCA9PSAxKQorICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID0gZGVjb2RlX2NoYW5uZWwocywgcy0+bWNkcGFyYW1zW2ldLmNoYW4yKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgICAgICBpZiAocmV0ID0gZGVjb2RlX2NoYW5uZWwocywgcy0+bWNkcGFyYW1zW2ldLmNoYW4xKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgIGlmIChzLT5tY2RwYXJhbXNbaV0ucHJlc2VudCkgeworICAgICAgICAgICAgICAgICAgICBzLT5kbW9kZSA9IG1jX2Rtb2Rlc1tzLT5tY2RwYXJhbXNbaV0uaW5kZXhdOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID0gZGVjb3JyZWxhdGUocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1jZHBhcmFtc1tpXS5jaGFuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1jZHBhcmFtc1tpXS5jaGFuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5iX3NhbXBsZXMgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IGF2Y3R4LT5jaGFubmVsczsgY2hhbisrKSB7CisgICAgICAgICAgICBpbnQzMl90ICpkZWNvZGVkID0gcy0+ZGVjb2RlZFtjaGFuXTsKKworICAgICAgICAgICAgaWYgKHMtPmxwY19tb2RlW2NoYW5dKQorICAgICAgICAgICAgICAgIGRlY29kZV9scGMoZGVjb2RlZCwgcy0+bHBjX21vZGVbY2hhbl0sIHMtPm5iX3NhbXBsZXMpOworCisgICAgICAgICAgICBpZiAocy0+c2FtcGxlX3NoaWZ0W2NoYW5dID4gMCkKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc2FtcGxlczsgaSsrKQorICAgICAgICAgICAgICAgICAgICBkZWNvZGVkW2ldIDw8PSBzLT5zYW1wbGVfc2hpZnRbY2hhbl07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhbGlnbl9nZXRfYml0cyhnYik7CisgICAgc2tpcF9iaXRzKGdiLCAyNCk7CisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgMCkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJvdmVycmVhZFxuIik7CisgICAgZWxzZSBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPiAwKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInVuZGVycmVhZFxuIik7CisKKyAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9DUkNDSEVDSyB8IEFWX0VGX0NPTVBMSUFOVCkpIHsKKyAgICAgICAgaWYgKGZmX3Rha19jaGVja19jcmMocGt0LT5kYXRhICsgaHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzX2NvdW50KGdiKSAvIDggLSBoc2l6ZSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ1JDIGVycm9yXG4iKTsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvbnZlcnQgdG8gb3V0cHV0IGJ1ZmZlciAqLworICAgIHN3aXRjaCAoYXZjdHgtPnNhbXBsZV9mbXQpIHsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfVThQOgorICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgYXZjdHgtPmNoYW5uZWxzOyBjaGFuKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnNhbXBsZXMgPSAodWludDhfdCAqKWZyYW1lLT5leHRlbmRlZF9kYXRhW2NoYW5dOworICAgICAgICAgICAgaW50MzJfdCAqZGVjb2RlZCA9IHMtPmRlY29kZWRbY2hhbl07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc2FtcGxlczsgaSsrKQorICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBkZWNvZGVkW2ldICsgMHg4MDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2UDoKKyAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IGF2Y3R4LT5jaGFubmVsczsgY2hhbisrKSB7CisgICAgICAgICAgICBpbnQxNl90ICpzYW1wbGVzID0gKGludDE2X3QgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaGFuXTsKKyAgICAgICAgICAgIGludDMyX3QgKmRlY29kZWQgPSBzLT5kZWNvZGVkW2NoYW5dOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3NhbXBsZXM7IGkrKykKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldID0gZGVjb2RlZFtpXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyUDoKKyAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IGF2Y3R4LT5jaGFubmVsczsgY2hhbisrKSB7CisgICAgICAgICAgICBpbnQzMl90ICpzYW1wbGVzID0gKGludDMyX3QgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaGFuXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zYW1wbGVzOyBpKyspCisgICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA8PD0gODsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gcGt0LT5zaXplOworfQorCitzdGF0aWMgaW50IGluaXRfdGhyZWFkX2NvcHkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRBS0RlY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3RocmVhZF9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkNvZGVjQ29udGV4dCAqc3JjKQoreworICAgIFRBS0RlY0NvbnRleHQgKnRzcmMgPSBzcmMtPnByaXZfZGF0YTsKKyAgICBUQUtEZWNDb250ZXh0ICp0ZHN0ID0gZHN0LT5wcml2X2RhdGE7CisKKyAgICBpZiAoZHN0ID09IHNyYykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbWVtY3B5KCZ0ZHN0LT50aSwgJnRzcmMtPnRpLCBzaXplb2YoVEFLU3RyZWFtSW5mbykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdGFrX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVEFLRGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmcy0+ZGVjb2RlX2J1ZmZlcik7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl90YWtfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJ0YWsiLAorICAgIC5sb25nX25hbWUgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRBSyAoVG9tJ3MgbG9zc2xlc3MgQXVkaW8gS29tcHJlc3NvcikiKSwKKyAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1RBSywKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihUQUtEZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICA9IHRha19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IHRha19kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgICAgPSB0YWtfZGVjb2RlX2ZyYW1lLAorICAgIC5pbml0X3RocmVhZF9jb3B5ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoaW5pdF90aHJlYWRfY29weSksCisgICAgLnVwZGF0ZV90aHJlYWRfY29udGV4dCA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKHVwZGF0ZV90aHJlYWRfY29udGV4dCksCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCisgICAgLnNhbXBsZV9mbXRzICAgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfVThQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzMyUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdGFyZ2EuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RhcmdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjOWI1NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RhcmdhLmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBUYXJnYSAoLnRnYSkgaW1hZ2UgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA2IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidGFyZ2EuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVGFyZ2FDb250ZXh0IHsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKK30gVGFyZ2FDb250ZXh0OworCitzdGF0aWMgdWludDhfdCAqYWR2YW5jZV9saW5lKHVpbnQ4X3QgKnN0YXJ0LCB1aW50OF90ICpsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgKnksIGludCBoLCBpbnQgaW50ZXJsZWF2ZSkKK3sKKyAgICAqeSArPSBpbnRlcmxlYXZlOworCisgICAgaWYgKCp5IDwgaCkgeworICAgICAgICByZXR1cm4gbGluZSArIGludGVybGVhdmUgKiBzdHJpZGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnkgPSAoKnkgKyAxKSAmIChpbnRlcmxlYXZlIC0gMSk7CisgICAgICAgIGlmICgqeSAmJiAqeSA8IGgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGFydCArICp5ICogc3RyaWRlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdGFyZ2FfZGVjb2RlX3JsZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFRhcmdhQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzdGFydCwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicHAsIGludCBpbnRlcmxlYXZlKQoreworICAgIGludCB4LCB5OworICAgIGludCBkZXB0aCA9IChicHAgKyAxKSA+PiAzOworICAgIGludCB0eXBlLCBjb3VudDsKKyAgICB1aW50OF90ICpsaW5lID0gc3RhcnQ7CisgICAgdWludDhfdCAqZHN0ICA9IGxpbmU7CisKKyAgICB4ID0geSA9IGNvdW50ID0gMDsKKyAgICB3aGlsZSAoZHN0KSB7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpIDw9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJSYW4gb3VmIG9mIGRhdGEgYmVmb3JlIGVuZC1vZi1pbWFnZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICB0eXBlICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Z2IpOworICAgICAgICBjb3VudCA9ICh0eXBlICYgMHg3RikgKyAxOworICAgICAgICB0eXBlICY9IDB4ODA7CisgICAgICAgIGlmICghdHlwZSkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBuICA9IEZGTUlOKGNvdW50LCB3IC0geCk7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcy0+Z2IsIGRzdCwgbiAqIGRlcHRoKTsKKyAgICAgICAgICAgICAgICBjb3VudCAtPSBuOworICAgICAgICAgICAgICAgIGRzdCAgICs9IG4gKiBkZXB0aDsKKyAgICAgICAgICAgICAgICB4ICAgICArPSBuOworICAgICAgICAgICAgICAgIGlmICh4ID09IHcpIHsKKyAgICAgICAgICAgICAgICAgICAgeCAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgIGRzdCA9IGxpbmUgPSBhZHZhbmNlX2xpbmUoc3RhcnQsIGxpbmUsIHN0cmlkZSwgJnksIGgsIGludGVybGVhdmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKGRzdCAmJiBjb3VudCA+IDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCB0bXBbNF07CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZzLT5nYiwgdG1wLCBkZXB0aCk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IG4gID0gRkZNSU4oY291bnQsIHcgLSB4KTsKKyAgICAgICAgICAgICAgICBjb3VudCAtPSBuOworICAgICAgICAgICAgICAgIHggICAgICs9IG47CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCB0bXAsIGRlcHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0ICs9IGRlcHRoOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gdykgeworICAgICAgICAgICAgICAgICAgICB4ICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZHN0ID0gbGluZSA9IGFkdmFuY2VfbGluZShzdGFydCwgbGluZSwgc3RyaWRlLCAmeSwgaCwgaW50ZXJsZWF2ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoZHN0ICYmIGNvdW50ID4gMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY291bnQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWNrZXQgd2VudCBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFRhcmdhQ29udGV4dCAqIGNvbnN0IHMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKiBjb25zdCBwID0gZGF0YTsKKyAgICB1aW50OF90ICpkc3Q7CisgICAgaW50IHN0cmlkZTsKKyAgICBpbnQgaWRsZW4sIHBhbCwgY29tcHIsIHksIHcsIGgsIGJwcCwgZmxhZ3MsIHJldDsKKyAgICBpbnQgZmlyc3RfY2xyLCBjb2xvcnMsIGNzaXplOworICAgIGludCBpbnRlcmxlYXZlOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+Z2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisKKyAgICAvKiBwYXJzZSBpbWFnZSBoZWFkZXIgKi8KKyAgICBpZGxlbiAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgIHBhbCAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgY29tcHIgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICBmaXJzdF9jbHIgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+Z2IpOworICAgIGNvbG9ycyAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5nYik7CisgICAgY3NpemUgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgNCk7IC8qIDI6IHgsIDI6IHkgKi8KKyAgICB3ICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+Z2IpOworICAgIGggICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5nYik7CisgICAgYnBwICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpIDw9IGlkbGVuKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIGRhdGEgdG8gcmVhZCBoZWFkZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmbGFncyAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworCisgICAgaWYgKCFwYWwgJiYgKGZpcnN0X2NsciB8fCBjb2xvcnMgfHwgY3NpemUpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJGaWxlIHdpdGhvdXQgY29sb3JtYXAgaGFzIGNvbG9ybWFwIGluZm9ybWF0aW9uIHNldC5cbiIpOworICAgICAgICAvLyBzcGVjaWZpY2F0aW9uIHNheXMgd2Ugc2hvdWxkIGlnbm9yZSB0aG9zZSB2YWx1ZSBpbiB0aGlzIGNhc2UKKyAgICAgICAgZmlyc3RfY2xyID0gY29sb3JzID0gY3NpemUgPSAwOworICAgIH0KKworICAgIC8vIHNraXAgaWRlbnRpZmllciBpZiBhbnkKKyAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgaWRsZW4pOworCisgICAgc3dpdGNoIChicHApIHsKKyAgICBjYXNlIDg6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gKChjb21wciAmICh+VEdBX1JMRSkpID09IFRHQV9CVykgPyBBVl9QSVhfRk1UX0dSQVk4IDogQVZfUElYX0ZNVF9QQUw4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE1OgorICAgIGNhc2UgMTY6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSQTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCaXQgZGVwdGggJWkgaXMgbm90IHN1cHBvcnRlZFxuIiwgYnBwKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGNvbG9ycyAmJiAoY29sb3JzICsgZmlyc3RfY2xyKSA+IDI1NikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29ycmVjdCBwYWxldHRlOiAlaSBjb2xvcnMgd2l0aCBvZmZzZXQgJWlcbiIsIGNvbG9ycywgZmlyc3RfY2xyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgdywgaCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcCwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIGlmIChmbGFncyAmIFRHQV9UT1BUT0JPVFRPTSkgeworICAgICAgICBkc3QgPSBwLT5kYXRhWzBdOworICAgICAgICBzdHJpZGUgPSBwLT5saW5lc2l6ZVswXTsKKyAgICB9IGVsc2UgeyAvL2ltYWdlIGlzIHVwc2lkZS1kb3duCisgICAgICAgIGRzdCA9IHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSAqIChoIC0gMSk7CisgICAgICAgIHN0cmlkZSA9IC1wLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICBpbnRlcmxlYXZlID0gZmxhZ3MgJiBUR0FfSU5URVJMRUFWRTIgPyAyIDoKKyAgICAgICAgICAgICAgICAgZmxhZ3MgJiBUR0FfSU5URVJMRUFWRTQgPyA0IDogMTsKKworICAgIGlmIChjb2xvcnMpIHsKKyAgICAgICAgaW50IHBhbF9zaXplLCBwYWxfc2FtcGxlX3NpemU7CisKKyAgICAgICAgc3dpdGNoIChjc2l6ZSkgeworICAgICAgICBjYXNlIDMyOiBwYWxfc2FtcGxlX3NpemUgPSA0OyBicmVhazsKKyAgICAgICAgY2FzZSAyNDogcGFsX3NhbXBsZV9zaXplID0gMzsgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgIGNhc2UgMTU6IHBhbF9zYW1wbGVfc2l6ZSA9IDI7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWxldHRlIGVudHJ5IHNpemUgJWkgYml0cyBpcyBub3Qgc3VwcG9ydGVkXG4iLCBjc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBwYWxfc2l6ZSA9IGNvbG9ycyAqIHBhbF9zYW1wbGVfc2l6ZTsKKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ICE9IEFWX1BJWF9GTVRfUEFMOCkgLy9zaG91bGQgbm90IG9jY3VyIGJ1dCBza2lwIHBhbGV0dGUgYW55d2F5CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgcGFsX3NpemUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCB0OworICAgICAgICAgICAgdWludDMyX3QgKnBhbCA9ICgodWludDMyX3QgKilwLT5kYXRhWzFdKSArIGZpcnN0X2NscjsKKworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCBwYWxfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBkYXRhIHRvIHJlYWQgcGFsZXR0ZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHBhbF9zYW1wbGVfc2l6ZSkgeworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGZvciAodCA9IDA7IHQgPCBjb2xvcnM7IHQrKykKKyAgICAgICAgICAgICAgICAgICAgKnBhbCsrID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzJ1KCZzLT5nYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgLyogUkdCMjQgKi8KKyAgICAgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgY29sb3JzOyB0KyspCisgICAgICAgICAgICAgICAgICAgICpwYWwrKyA9ICgweGZmVTw8MjQpIHwgYnl0ZXN0cmVhbTJfZ2V0X2xlMjR1KCZzLT5nYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgLyogUkdCNTU1ICovCisgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IGNvbG9yczsgdCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHYgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9ICgodiAmIDB4N0MwMCkgPDwgIDkpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDNFMCkgPDwgIDYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDAxRikgPDwgIDMpOworICAgICAgICAgICAgICAgICAgICAvKiBsZWZ0IGJpdCByZXBsaWNhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICB2IHw9ICh2ICYgMHhFMEUwRTBVKSA+PiA1OworICAgICAgICAgICAgICAgICAgICAqcGFsKysgPSAoMHhmZlU8PDI0KSB8IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcC0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGNvbXByICYgKH5UR0FfUkxFKSkgPT0gVEdBX05PREFUQSkgeworICAgICAgICBtZW1zZXQocC0+ZGF0YVswXSwgMCwgcC0+bGluZXNpemVbMF0gKiBoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY29tcHIgJiBUR0FfUkxFKSB7CisgICAgICAgICAgICBpbnQgcmVzID0gdGFyZ2FfZGVjb2RlX3JsZShhdmN0eCwgcywgZHN0LCB3LCBoLCBzdHJpZGUsIGJwcCwgaW50ZXJsZWF2ZSk7CisgICAgICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IGltZ19zaXplID0gdyAqICgoYnBwICsgMSkgPj4gMyk7CisgICAgICAgICAgICB1aW50OF90ICpsaW5lOworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCBpbWdfc2l6ZSAqIGgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggZGF0YSBhdmFpbGFibGUgZm9yIGltYWdlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGluZSA9IGRzdDsKKyAgICAgICAgICAgIHkgPSAwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJnMtPmdiLCBsaW5lLCBpbWdfc2l6ZSk7CisgICAgICAgICAgICAgICAgbGluZSA9IGFkdmFuY2VfbGluZShkc3QsIGxpbmUsIHN0cmlkZSwgJnksIGgsIGludGVybGVhdmUpOworICAgICAgICAgICAgfSB3aGlsZSAobGluZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBUR0FfUklHSFRUT0xFRlQpIHsgLy8gcmlnaHQtdG8tbGVmdCwgbmVlZHMgaG9yaXpvbnRhbCBmbGlwCisgICAgICAgIGludCB4OworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICB2b2lkICpsaW5lID0gJnAtPmRhdGFbMF1beSAqIHAtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3ID4+IDE7IHgrKykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYnBwKSB7CisgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQzMl90LCAoKHVpbnQzMl90ICopbGluZSlbeF0sICgodWludDMyX3QgKilsaW5lKVt3IC0geCAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QsICgodWludDhfdCAqKWxpbmUpWzMgKiB4ICAgIF0sICgodWludDhfdCAqKWxpbmUpWzMgKiB3IC0gMyAqIHggLSAzXSk7CisgICAgICAgICAgICAgICAgICAgIEZGU1dBUCh1aW50OF90LCAoKHVpbnQ4X3QgKilsaW5lKVszICogeCArIDFdLCAoKHVpbnQ4X3QgKilsaW5lKVszICogdyAtIDMgKiB4IC0gMl0pOworICAgICAgICAgICAgICAgICAgICBGRlNXQVAodWludDhfdCwgKCh1aW50OF90ICopbGluZSlbMyAqIHggKyAyXSwgKCh1aW50OF90ICopbGluZSlbMyAqIHcgLSAzICogeCAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQxNl90LCAoKHVpbnQxNl90ICopbGluZSlbeF0sICgodWludDE2X3QgKilsaW5lKVt3IC0geCAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICBGRlNXQVAodWludDhfdCwgKCh1aW50OF90ICopbGluZSlbeF0sICgodWludDhfdCAqKWxpbmUpW3cgLSB4IC0gMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX3RhcmdhX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInRhcmdhIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVHJ1ZXZpc2lvbiBUYXJnYSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9UQVJHQSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVGFyZ2FDb250ZXh0KSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90YXJnYS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGFyZ2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmY1MjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGFyZ2EuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19UQVJHQV9ICisjZGVmaW5lIEFWQ09ERUNfVEFSR0FfSAorCisvKioKKyAqIEBmaWxlCisgKiB0YXJnYSBmaWxlIGNvbW1vbiBkZWZpbml0aW9ucworICoKKyAqIEJhc2VkIG9uOgorICogaHR0cDovL3d3dy5nYW1lcnMub3JnL2RFbmdpbmUvcXVha2UzL1RHQS50eHQKKyAqCisgKiBhbmQgb3RoZXIgc3BlY3MgeW91IGNhbiBmaW5kIHJlZmVyZW5jZWQgZm9yIGV4YW1wbGUgaW46CisgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RydWV2aXNpb25fVEdBCisgKi8KKworZW51bSBUYXJnYUNvbXByIHsKKyAgICBUR0FfTk9EQVRBID0gMCwgLy8gbm8gaW1hZ2UgZGF0YQorICAgIFRHQV9QQUwgICAgPSAxLCAvLyBwYWxldHRpemVkCisgICAgVEdBX1JHQiAgICA9IDIsIC8vIHRydWUtY29sb3IKKyAgICBUR0FfQlcgICAgID0gMywgLy8gYmxhY2sgJiB3aGl0ZSBvciBncmF5c2NhbGUKKyAgICBUR0FfUkxFICAgID0gOCwgLy8gZmxhZyBwb2ludGluZyB0aGF0IGRhdGEgaXMgUkxFLWNvZGVkCit9OworCitlbnVtIFRhcmdhRmxhZ3MgeworICAgIFRHQV9SSUdIVFRPTEVGVCA9IDB4MTAsIC8vIHJpZ2h0LXRvLWxlZnQgKGZsaXBwZWQgaG9yaXpvbnRhbGx5KQorICAgIFRHQV9UT1BUT0JPVFRPTSA9IDB4MjAsIC8vIHRvcC10by1ib3R0b20gKE5PVCBmbGlwcGVkIHZlcnRpY2FsbHkpCisgICAgVEdBX0lOVEVSTEVBVkUyID0gMHg0MCwgLy8gMi13YXkgaW50ZXJsZWF2ZSwgb2RkIHRoZW4gZXZlbiBsaW5lcworICAgIFRHQV9JTlRFUkxFQVZFNCA9IDB4ODAsIC8vIDQtd2F5IGludGVybGVhdmUKK307CisKKyNlbmRpZiAvKiBBVkNPREVDX1RBUkdBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3RhcmdhX3kyMTZkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RhcmdhX3kyMTZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjRlZWFhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGFyZ2FfeTIxNmRlYy5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBQaW5uYWNsZSBUQVJHQSBDaW5lV2F2ZSBZVVYxNiBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQ2FybCBFdWdlbiBIb3lvcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCB5MjE2X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+cGl4X2ZtdCAgICAgICAgICAgICA9IEFWX1BJWF9GTVRfWVVWNDIyUDE2OworICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB5MjE2X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqcGljID0gZGF0YTsKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKHVpbnQxNl90ICopYXZwa3QtPmRhdGE7CisgICAgdWludDE2X3QgKnksICp1LCAqdiwgYWxpZ25lZF93aWR0aCA9IEZGQUxJR04oYXZjdHgtPndpZHRoLCA0KTsKKyAgICBpbnQgaSwgaiwgcmV0OworCisgICAgaWYgKGF2cGt0LT5zaXplIDwgNCAqIGF2Y3R4LT5oZWlnaHQgKiBhbGlnbmVkX3dpZHRoKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGlucHV0IGRhdGEuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpYywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBpYy0+a2V5X2ZyYW1lID0gMTsKKyAgICBwaWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgeSA9ICh1aW50MTZfdCAqKXBpYy0+ZGF0YVswXTsKKyAgICB1ID0gKHVpbnQxNl90ICopcGljLT5kYXRhWzFdOworICAgIHYgPSAodWludDE2X3QgKilwaWMtPmRhdGFbMl07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBhdmN0eC0+d2lkdGggPj4gMTsgaisrKSB7CisgICAgICAgICAgICB1WyAgICBqICAgIF0gPSBzcmNbNCAqIGogICAgXSA8PCAyIHwgc3JjWzQgKiBqICAgIF0gPj4gMTQ7CisgICAgICAgICAgICB5WzIgKiBqICAgIF0gPSBzcmNbNCAqIGogKyAxXSA8PCAyIHwgc3JjWzQgKiBqICsgMV0gPj4gMTQ7CisgICAgICAgICAgICB2WyAgICBqICAgIF0gPSBzcmNbNCAqIGogKyAyXSA8PCAyIHwgc3JjWzQgKiBqICsgMl0gPj4gMTQ7CisgICAgICAgICAgICB5WzIgKiBqICsgMV0gPSBzcmNbNCAqIGogKyAzXSA8PCAyIHwgc3JjWzQgKiBqICsgM10gPj4gMTQ7CisgICAgICAgIH0KKworICAgICAgICB5ICs9IHBpYy0+bGluZXNpemVbMF0gPj4gMTsKKyAgICAgICAgdSArPSBwaWMtPmxpbmVzaXplWzFdID4+IDE7CisgICAgICAgIHYgKz0gcGljLT5saW5lc2l6ZVsyXSA+PiAxOworICAgICAgICBzcmMgKz0gYWxpZ25lZF93aWR0aCA8PCAxOworICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX3RhcmdhX3kyMTZfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gInRhcmdhX3kyMTYiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUGlubmFjbGUgVEFSR0EgQ2luZVdhdmUgWVVWMTYiKSwKKyAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9UQVJHQV9ZMjE2LAorICAgIC5pbml0ICAgICAgICAgPSB5MjE2X2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgPSB5MjE2X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90YXJnYWVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGFyZ2FlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQ4M2VjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGFyZ2FlbmMuYwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIFRhcmdhICgudGdhKSBpbWFnZSBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQm9iYnkgQmluZ2hhbQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJybGUuaCIKKyNpbmNsdWRlICJ0YXJnYS5oIgorCisvKioKKyAqIFJMRSBjb21wcmVzcyB0aGUgaW1hZ2UsIHdpdGggbWF4aW11bSBzaXplIG9mIG91dF9zaXplCisgKiBAcGFyYW0gb3V0YnVmIE91dHB1dCBidWZmZXIKKyAqIEBwYXJhbSBvdXRfc2l6ZSBNYXhpbXVtIG91dHB1dCBzaXplCisgKiBAcGFyYW0gcGljIEltYWdlIHRvIGNvbXByZXNzCisgKiBAcGFyYW0gYnBwIEJ5dGVzIHBlciBwaXhlbAorICogQHBhcmFtIHcgSW1hZ2Ugd2lkdGgKKyAqIEBwYXJhbSBoIEltYWdlIGhlaWdodAorICogQHJldHVybiBTaXplIG9mIG91dHB1dCBpbiBieXRlcywgb3IgLTEgaWYgbGFyZ2VyIHRoYW4gb3V0X3NpemUKKyAqLworc3RhdGljIGludCB0YXJnYV9lbmNvZGVfcmxlKHVpbnQ4X3QgKm91dGJ1ZiwgaW50IG91dF9zaXplLCBjb25zdCBBVkZyYW1lICpwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwcCwgaW50IHcsIGludCBoKQoreworICAgIGludCB5LHJldDsKKyAgICB1aW50OF90ICpvdXQ7CisKKyAgICBvdXQgPSBvdXRidWY7CisKKyAgICBmb3IoeSA9IDA7IHkgPCBoOyB5ICsrKSB7CisgICAgICAgIHJldCA9IGZmX3JsZV9lbmNvZGUob3V0LCBvdXRfc2l6ZSwgcGljLT5kYXRhWzBdICsgcGljLT5saW5lc2l6ZVswXSAqIHksIGJwcCwgdywgMHg3ZiwgMCwgLTEsIDApOworICAgICAgICBpZihyZXQgPT0gLTEpeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG91dCs9IHJldDsKKyAgICAgICAgb3V0X3NpemUgLT0gcmV0OworICAgIH0KKworICAgIHJldHVybiBvdXQgLSBvdXRidWY7Cit9CisKK3N0YXRpYyBpbnQgdGFyZ2FfZW5jb2RlX25vcm1hbCh1aW50OF90ICpvdXRidWYsIGNvbnN0IEFWRnJhbWUgKnBpYywgaW50IGJwcCwgaW50IHcsIGludCBoKQoreworICAgIGludCBpLCBuID0gYnBwICogdzsKKyAgICB1aW50OF90ICpvdXQgPSBvdXRidWY7CisgICAgdWludDhfdCAqcHRyID0gcGljLT5kYXRhWzBdOworCisgICAgZm9yKGk9MDsgaSA8IGg7IGkrKykgeworICAgICAgICBtZW1jcHkob3V0LCBwdHIsIG4pOworICAgICAgICBvdXQgKz0gbjsKKyAgICAgICAgcHRyICs9IHBpYy0+bGluZXNpemVbMF07CisgICAgfQorCisgICAgcmV0dXJuIG91dCAtIG91dGJ1ZjsKK30KKworc3RhdGljIGludCB0YXJnYV9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcCwgaW50ICpnb3RfcGFja2V0KQoreworICAgIGludCBicHAsIHBpY3NpemUsIGRhdGFzaXplID0gLTEsIHJldCwgaTsKKyAgICB1aW50OF90ICpvdXQ7CisKKyAgICBpZihhdmN0eC0+d2lkdGggPiAweGZmZmYgfHwgYXZjdHgtPmhlaWdodCA+IDB4ZmZmZikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImltYWdlIGRpbWVuc2lvbnMgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcGljc2l6ZSA9IGF2cGljdHVyZV9nZXRfc2l6ZShhdmN0eC0+cGl4X2ZtdCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgcGljc2l6ZSArIDQ1KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogemVybyBvdXQgdGhlIGhlYWRlciBhbmQgb25seSBzZXQgYXBwbGljYWJsZSBmaWVsZHMgKi8KKyAgICBtZW1zZXQocGt0LT5kYXRhLCAwLCAxMik7CisgICAgQVZfV0wxNihwa3QtPmRhdGErMTIsIGF2Y3R4LT53aWR0aCk7CisgICAgQVZfV0wxNihwa3QtPmRhdGErMTQsIGF2Y3R4LT5oZWlnaHQpOworICAgIC8qIGltYWdlIGRlc2NyaXB0b3IgYnl0ZTogb3JpZ2luIGlzIGFsd2F5cyB0b3AtbGVmdCwgYml0cyAwLTMgc3BlY2lmeSBhbHBoYSAqLworICAgIHBrdC0+ZGF0YVsxN10gPSAweDIwIHwgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfQkdSQSA/IDggOiAwKTsKKworICAgIG91dCA9IHBrdC0+ZGF0YSArIDE4OyAgLyogc2tpcCBwYXN0IHRoZSBoZWFkZXIgd2Ugd3JpdGUgKi8KKworICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdl9nZXRfYml0c19wZXJfcGl4ZWwoYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCkpOworICAgIHN3aXRjaChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9QQUw4OiB7CisgICAgICAgIGludCBwYWxfYnBwID0gMjQ7IC8qIE9ubHkgd3JpdGUgMzJiaXQgcGFsZXR0ZSBpZiB0aGVyZSBpcyB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICAgICAgaWYgKEFWX1JOMzIocC0+ZGF0YVsxXSArIDQgKiBpKSA+PiAyNCAhPSAweEZGKSB7CisgICAgICAgICAgICAgICAgcGFsX2JwcCA9IDMyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBwa3QtPmRhdGFbMV0gID0gMTsgICAgICAgICAgLyogcGFsZXR0ZSBwcmVzZW50ICovCisgICAgICAgIHBrdC0+ZGF0YVsyXSAgPSBUR0FfUEFMOyAgICAvKiB1bmNvbXByZXNzZWQgcGFsZXR0aXNlZCBpbWFnZSAqLworICAgICAgICBwa3QtPmRhdGFbNl0gID0gMTsgICAgICAgICAgLyogcGFsZXR0ZSBjb250YWlucyAyNTYgZW50cmllcyAqLworICAgICAgICBwa3QtPmRhdGFbN10gID0gcGFsX2JwcDsgICAgLyogcGFsZXR0ZSBjb250YWlucyBwYWxfYnBwIGJpdCBlbnRyaWVzICovCisgICAgICAgIHBrdC0+ZGF0YVsxNl0gPSA4OyAgICAgICAgICAvKiBicHAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICAgICAgaWYgKHBhbF9icHAgPT0gMzIpIHsKKyAgICAgICAgICAgICAgICBBVl9XTDMyKHBrdC0+ZGF0YSArIDE4ICsgNCAqIGksICoodWludDMyX3QgKikocC0+ZGF0YVsxXSArIGkgKiA0KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVZfV0wyNChwa3QtPmRhdGEgKyAxOCArIDMgKiBpLCAqKHVpbnQzMl90ICopKHAtPmRhdGFbMV0gKyBpICogNCkpOworICAgICAgICAgICAgfQorICAgICAgICBvdXQgKz0gMzIgKiBwYWxfYnBwOyAgICAgICAgLyogc2tpcCBwYXN0IHRoZSBwYWxldHRlIHdlIGp1c3Qgb3V0cHV0ICovCisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgICAgICBwa3QtPmRhdGFbMl0gID0gVEdBX0JXOyAgICAgLyogdW5jb21wcmVzc2VkIGdyYXlzY2FsZSBpbWFnZSAqLworICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMHgyODsKKyAgICAgICAgcGt0LT5kYXRhWzE2XSA9IDg7ICAgICAgICAgIC8qIGJwcCAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTU1TEU6CisgICAgICAgIHBrdC0+ZGF0YVsyXSAgPSBUR0FfUkdCOyAgICAvKiB1bmNvbXByZXNzZWQgdHJ1ZS1jb2xvciBpbWFnZSAqLworICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0KKyAgICAgICAgcGt0LT5kYXRhWzE2XSA9IDE2OyAgICAgICAgIC8qIGJwcCAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgICAgIHBrdC0+ZGF0YVsyXSAgPSBUR0FfUkdCOyAgICAvKiB1bmNvbXByZXNzZWQgdHJ1ZS1jb2xvciBpbWFnZSAqLworICAgICAgICBwa3QtPmRhdGFbMTZdID0gMjQ7ICAgICAgICAgLyogYnBwICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBOgorICAgICAgICBwa3QtPmRhdGFbMl0gID0gVEdBX1JHQjsgICAgLyogdW5jb21wcmVzc2VkIHRydWUtY29sb3IgaW1hZ2UgKi8KKyAgICAgICAgcGt0LT5kYXRhWzE2XSA9IDMyOyAgICAgICAgIC8qIGJwcCAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBpeGVsIGZvcm1hdCAnJXMnIG5vdCBzdXBwb3J0ZWQuXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShhdmN0eC0+cGl4X2ZtdCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBicHAgPSBwa3QtPmRhdGFbMTZdID4+IDM7CisKKyAgICAvKiB0cnkgUkxFIGNvbXByZXNzaW9uICovCisgICAgaWYgKGF2Y3R4LT5jb2Rlcl90eXBlICE9IEZGX0NPREVSX1RZUEVfUkFXKQorICAgICAgICBkYXRhc2l6ZSA9IHRhcmdhX2VuY29kZV9ybGUob3V0LCBwaWNzaXplLCBwLCBicHAsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisKKyAgICAvKiBpZiB0aGF0IHdvcmtlZCB3ZWxsLCBtYXJrIHRoZSBwaWN0dXJlIGFzIFJMRSBjb21wcmVzc2VkICovCisgICAgaWYoZGF0YXNpemUgPj0gMCkKKyAgICAgICAgcGt0LT5kYXRhWzJdIHw9IFRHQV9STEU7CisKKyAgICAvKiBpZiBSTEUgZGlkbid0IG1ha2UgaXQgc21hbGxlciwgZ28gYmFjayB0byBubyBjb21wcmVzc2lvbiAqLworICAgIGVsc2UgZGF0YXNpemUgPSB0YXJnYV9lbmNvZGVfbm9ybWFsKG91dCwgcCwgYnBwLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworCisgICAgb3V0ICs9IGRhdGFzaXplOworCisgICAgLyogVGhlIHN0YW5kYXJkIHJlY29tbWVuZHMgaW5jbHVkaW5nIHRoaXMgc2VjdGlvbiwgZXZlbiBpZiB3ZSBkb24ndCB1c2UKKyAgICAgKiBhbnkgb2YgdGhlIGZlYXR1cmVzIGl0IGFmZm9yZHMuIFRPRE86IHRha2UgYWR2YW50YWdlIG9mIHRoZSBwaXhlbAorICAgICAqIGFzcGVjdCByYXRpbyBhbmQgZW5jb2RlciBJRCBmaWVsZHMgYXZhaWxhYmxlPyAqLworICAgIG1lbWNweShvdXQsICJcMFwwXDBcMFwwXDBcMFwwVFJVRVZJU0lPTi1YRklMRS4iLCAyNik7CisKKyAgICBwa3QtPnNpemUgICA9IG91dCArIDI2IC0gcGt0LT5kYXRhOworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdGFyZ2FfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdGFyZ2FfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdl9mcmFtZV9mcmVlKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3RhcmdhX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInRhcmdhIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVHJ1ZXZpc2lvbiBUYXJnYSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9UQVJHQSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB0YXJnYV9lbmNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB0YXJnYV9lbmNvZGVfY2xvc2UsCisgICAgLmVuY29kZTIgICAgICAgID0gdGFyZ2FfZW5jb2RlX2ZyYW1lLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7CisgICAgICAgIEFWX1BJWF9GTVRfQkdSMjQsIEFWX1BJWF9GTVRfQkdSQSwgQVZfUElYX0ZNVF9SR0I1NTVMRSwgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9QQUw4LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3RleHRkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RleHRkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWYwMmEyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGV4dGRlYy5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIENsw6ltZW50IELFk3NjaAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSYXcgc3VidGl0bGVzIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImFzcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBjb25zdCBjaGFyICpsaW5lYnJlYWtzOworICAgIGludCBrZWVwX2Fzc19tYXJrdXA7Cit9IFRleHRDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihUZXh0Q29udGV4dCwgeCkKKyNkZWZpbmUgU0QgQVZfT1BUX0ZMQUdfU1VCVElUTEVfUEFSQU0gfCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJrZWVwX2Fzc19tYXJrdXAiLCAiU2V0IGlmIEFTUyB0YWdzIG11c3QgYmUgZXNjYXBlZCIsIE9GRlNFVChrZWVwX2Fzc19tYXJrdXApLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTB9LCAwLCAxLCAuZmxhZ3M9U0QgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGludCB0ZXh0X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3N1Yl9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBBVkJQcmludCBidWY7CisgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKKyAgICBjb25zdCBjaGFyICpwdHIgPSBhdnBrdC0+ZGF0YTsKKyAgICBjb25zdCBUZXh0Q29udGV4dCAqdGV4dCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgaW50IHRzX3N0YXJ0ICAgICA9IGF2X3Jlc2NhbGVfcShhdnBrdC0+cHRzLCAgICAgIGF2Y3R4LT50aW1lX2Jhc2UsIChBVlJhdGlvbmFsKXsxLDEwMH0pOworICAgIGNvbnN0IGludCB0c19kdXJhdGlvbiAgPSBhdnBrdC0+ZHVyYXRpb24gIT0gLTEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3EoYXZwa3QtPmR1cmF0aW9uLCBhdmN0eC0+dGltZV9iYXNlLCAoQVZSYXRpb25hbCl7MSwxMDB9KSA6IC0xOworCisgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKyAgICBpZiAocHRyICYmIGF2cGt0LT5zaXplID4gMCAmJiAqcHRyKSB7CisgICAgICAgIGZmX2Fzc19icHJpbnRfdGV4dF9ldmVudCgmYnVmLCBwdHIsIGF2cGt0LT5zaXplLCB0ZXh0LT5saW5lYnJlYWtzLCB0ZXh0LT5rZWVwX2Fzc19tYXJrdXApOworICAgICAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3RfYnByaW50KHN1YiwgJmJ1ZiwgdHNfc3RhcnQsIHRzX2R1cmF0aW9uKTsKKyAgICB9CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgICpnb3Rfc3ViX3B0ciA9IHN1Yi0+bnVtX3JlY3RzID4gMDsKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKKyNkZWZpbmUgREVDTEFSRV9DTEFTUyhkZWNuYW1lKSBzdGF0aWMgY29uc3QgQVZDbGFzcyBkZWNuYW1lICMjIF9kZWNvZGVyX2NsYXNzID0geyAgIFwKKyAgICAuY2xhc3NfbmFtZSA9ICNkZWNuYW1lICIgZGVjb2RlciIsICAgICAgXAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsICAgICBcCisgICAgLm9wdGlvbiAgICAgPSBkZWNuYW1lICMjIF9vcHRpb25zLCAgICAgIFwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwgICAgXAorfQorCisjaWYgQ09ORklHX1RFWFRfREVDT0RFUgorI2RlZmluZSB0ZXh0X29wdGlvbnMgb3B0aW9ucworREVDTEFSRV9DTEFTUyh0ZXh0KTsKKworQVZDb2RlYyBmZl90ZXh0X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInRleHQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSYXcgdGV4dCBzdWJ0aXRsZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUZXh0Q29udGV4dCksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1RFWFQsCisgICAgLmRlY29kZSAgICAgICAgID0gdGV4dF9kZWNvZGVfZnJhbWUsCisgICAgLmluaXQgICAgICAgICAgID0gZmZfYXNzX3N1YnRpdGxlX2hlYWRlcl9kZWZhdWx0LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ0ZXh0X2RlY29kZXJfY2xhc3MsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfVlBMQVlFUl9ERUNPREVSIHx8IENPTkZJR19QSlNfREVDT0RFUiB8fCBDT05GSUdfU1VCVklFV0VSMV9ERUNPREVSIHx8IENPTkZJR19TVExfREVDT0RFUgorCitzdGF0aWMgaW50IGxpbmVicmVha19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBUZXh0Q29udGV4dCAqdGV4dCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdGV4dC0+bGluZWJyZWFrcyA9ICJ8IjsKKyAgICByZXR1cm4gZmZfYXNzX3N1YnRpdGxlX2hlYWRlcl9kZWZhdWx0KGF2Y3R4KTsKK30KKworI2lmIENPTkZJR19WUExBWUVSX0RFQ09ERVIKKyNkZWZpbmUgdnBsYXllcl9vcHRpb25zIG9wdGlvbnMKK0RFQ0xBUkVfQ0xBU1ModnBsYXllcik7CisKK0FWQ29kZWMgZmZfdnBsYXllcl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2cGxheWVyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVlBsYXllciBzdWJ0aXRsZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUZXh0Q29udGV4dCksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZQTEFZRVIsCisgICAgLmRlY29kZSAgICAgICAgID0gdGV4dF9kZWNvZGVfZnJhbWUsCisgICAgLmluaXQgICAgICAgICAgID0gbGluZWJyZWFrX2luaXQsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnZwbGF5ZXJfZGVjb2Rlcl9jbGFzcywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19TVExfREVDT0RFUgorI2RlZmluZSBzdGxfb3B0aW9ucyBvcHRpb25zCitERUNMQVJFX0NMQVNTKHN0bCk7CisKK0FWQ29kZWMgZmZfc3RsX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInN0bCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNwcnVjZSBzdWJ0aXRsZSBmb3JtYXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVGV4dENvbnRleHQpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TVEwsCisgICAgLmRlY29kZSAgICAgICAgID0gdGV4dF9kZWNvZGVfZnJhbWUsCisgICAgLmluaXQgICAgICAgICAgID0gbGluZWJyZWFrX2luaXQsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnN0bF9kZWNvZGVyX2NsYXNzLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1BKU19ERUNPREVSCisjZGVmaW5lIHBqc19vcHRpb25zIG9wdGlvbnMKK0RFQ0xBUkVfQ0xBU1MocGpzKTsKKworQVZDb2RlYyBmZl9wanNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicGpzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUEpTIHN1YnRpdGxlIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFRleHRDb250ZXh0KSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUEpTLAorICAgIC5kZWNvZGUgICAgICAgICA9IHRleHRfZGVjb2RlX2ZyYW1lLAorICAgIC5pbml0ICAgICAgICAgICA9IGxpbmVicmVha19pbml0LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZwanNfZGVjb2Rlcl9jbGFzcywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19TVUJWSUVXRVIxX0RFQ09ERVIKKyNkZWZpbmUgc3Vidmlld2VyMV9vcHRpb25zIG9wdGlvbnMKK0RFQ0xBUkVfQ0xBU1Moc3Vidmlld2VyMSk7CisKK0FWQ29kZWMgZmZfc3Vidmlld2VyMV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzdWJ2aWV3ZXIxIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3ViVmlld2VyMSBzdWJ0aXRsZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUZXh0Q29udGV4dCksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NVQlZJRVdFUjEsCisgICAgLmRlY29kZSAgICAgICAgID0gdGV4dF9kZWNvZGVfZnJhbWUsCisgICAgLmluaXQgICAgICAgICAgID0gbGluZWJyZWFrX2luaXQsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnN1YnZpZXdlcjFfZGVjb2Rlcl9jbGFzcywKK307CisjZW5kaWYKKworI2VuZGlmIC8qIHRleHQgc3VidGl0bGVzIHdpdGggJ3wnIGxpbmUgYnJlYWsgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3RocmVhZC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0OGQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RocmVhZC5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEFsZXhhbmRlciBTdHJhbmdlIDxhc3RyYW5nZUBpdGhpbmtzdy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE11bHRpdGhyZWFkaW5nIHN1cHBvcnQgZnVuY3Rpb25zCisgKiBAYXV0aG9yIEFsZXhhbmRlciBTdHJhbmdlIDxhc3RyYW5nZUBpdGhpbmtzdy5jb20+CisgKi8KKworI2lmbmRlZiBBVkNPREVDX1RIUkVBRF9ICisjZGVmaW5lIEFWQ09ERUNfVEhSRUFEX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVGhyZWFkRnJhbWUgeworICAgIEFWRnJhbWUgKmY7CisgICAgQVZDb2RlY0NvbnRleHQgKm93bmVyOworICAgIC8vIHByb2dyZXNzLT5kYXRhIGlzIGFuIGFycmF5IG9mIDIgaW50cyBob2xkaW5nIHByb2dyZXNzIGZvciB0b3AvYm90dG9tCisgICAgLy8gZmllbGRzCisgICAgQVZCdWZmZXJSZWYgKnByb2dyZXNzOworfSBUaHJlYWRGcmFtZTsKKworLyoqCisgKiBXYWl0IGZvciBkZWNvZGluZyB0aHJlYWRzIHRvIGZpbmlzaCBhbmQgcmVzZXQgaW50ZXJuYWwgc3RhdGUuCisgKiBDYWxsZWQgYnkgYXZjb2RlY19mbHVzaF9idWZmZXJzKCkuCisgKgorICogQHBhcmFtIGF2Y3R4IFRoZSBjb250ZXh0LgorICovCit2b2lkIGZmX3RocmVhZF9mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisvKioKKyAqIFN1Ym1pdCBhIG5ldyBmcmFtZSB0byBhIGRlY29kaW5nIHRocmVhZC4KKyAqIFJldHVybnMgdGhlIG5leHQgYXZhaWxhYmxlIGZyYW1lIGluIHBpY3R1cmUuICpnb3RfcGljdHVyZV9wdHIKKyAqIHdpbGwgYmUgMCBpZiBub25lIGlzIGF2YWlsYWJsZS4KKyAqIFRoZSByZXR1cm4gdmFsdWUgb24gc3VjY2VzcyBpcyB0aGUgc2l6ZSBvZiB0aGUgY29uc3VtZWQgcGFja2V0IGZvcgorICogY29tcGF0aWJpbGl0eSB3aXRoIGF2Y29kZWNfZGVjb2RlX3ZpZGVvMigpLiBUaGlzIG1lYW5zIHRoZSBkZWNvZGVyCisgKiBoYXMgdG8gY29uc3VtZSB0aGUgZnVsbCBwYWNrZXQuCisgKgorICogUGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgYXZjb2RlY19kZWNvZGVfdmlkZW8yKCkuCisgKi8KK2ludCBmZl90aHJlYWRfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3BpY3R1cmVfcHRyLCBBVlBhY2tldCAqYXZwa3QpOworCisvKioKKyAqIElmIHRoZSBjb2RlYyBkZWZpbmVzIHVwZGF0ZV90aHJlYWRfY29udGV4dCgpLCBjYWxsIHRoaXMKKyAqIHdoZW4gdGhleSBhcmUgcmVhZHkgZm9yIHRoZSBuZXh0IHRocmVhZCB0byBzdGFydCBkZWNvZGluZworICogdGhlIG5leHQgZnJhbWUuIEFmdGVyIGNhbGxpbmcgaXQsIGRvIG5vdCBjaGFuZ2UgYW55IHZhcmlhYmxlcworICogcmVhZCBieSB0aGUgdXBkYXRlX3RocmVhZF9jb250ZXh0KCkgbWV0aG9kLCBvciBjYWxsIGZmX3RocmVhZF9nZXRfYnVmZmVyKCkuCisgKgorICogQHBhcmFtIGF2Y3R4IFRoZSBjb250ZXh0LgorICovCit2b2lkIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworLyoqCisgKiBOb3RpZnkgbGF0ZXIgZGVjb2RpbmcgdGhyZWFkcyB3aGVuIHBhcnQgb2YgdGhlaXIgcmVmZXJlbmNlIHBpY3R1cmUgaXMgcmVhZHkuCisgKiBDYWxsIHRoaXMgd2hlbiBzb21lIHBhcnQgb2YgdGhlIHBpY3R1cmUgaXMgZmluaXNoZWQgZGVjb2RpbmcuCisgKiBMYXRlciBjYWxscyB3aXRoIGxvd2VyIHZhbHVlcyBvZiBwcm9ncmVzcyBoYXZlIG5vIGVmZmVjdC4KKyAqCisgKiBAcGFyYW0gZiBUaGUgcGljdHVyZSBiZWluZyBkZWNvZGVkLgorICogQHBhcmFtIHByb2dyZXNzIFZhbHVlLCBpbiBhcmJpdHJhcnkgdW5pdHMsIG9mIGhvdyBtdWNoIG9mIHRoZSBwaWN0dXJlIGhhcyBkZWNvZGVkLgorICogQHBhcmFtIGZpZWxkIFRoZSBmaWVsZCBiZWluZyBkZWNvZGVkLCBmb3IgZmllbGQtcGljdHVyZSBjb2RlY3MuCisgKiAwIGZvciB0b3AgZmllbGQgb3IgZnJhbWUgcGljdHVyZXMsIDEgZm9yIGJvdHRvbSBmaWVsZC4KKyAqLwordm9pZCBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKFRocmVhZEZyYW1lICpmLCBpbnQgcHJvZ3Jlc3MsIGludCBmaWVsZCk7CisKKy8qKgorICogV2FpdCBmb3IgZWFybGllciBkZWNvZGluZyB0aHJlYWRzIHRvIGZpbmlzaCByZWZlcmVuY2UgcGljdHVyZXMuCisgKiBDYWxsIHRoaXMgYmVmb3JlIGFjY2Vzc2luZyBzb21lIHBhcnQgb2YgYSBwaWN0dXJlLCB3aXRoIGEgZ2l2ZW4KKyAqIHZhbHVlIGZvciBwcm9ncmVzcywgYW5kIGl0IHdpbGwgcmV0dXJuIGFmdGVyIHRoZSByZXNwb25zaWJsZSBkZWNvZGluZworICogdGhyZWFkIGNhbGxzIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoKSB3aXRoIHRoZSBzYW1lIG9yCisgKiBoaWdoZXIgdmFsdWUgZm9yIHByb2dyZXNzLgorICoKKyAqIEBwYXJhbSBmIFRoZSBwaWN0dXJlIGJlaW5nIHJlZmVyZW5jZWQuCisgKiBAcGFyYW0gcHJvZ3Jlc3MgVmFsdWUsIGluIGFyYml0cmFyeSB1bml0cywgdG8gd2FpdCBmb3IuCisgKiBAcGFyYW0gZmllbGQgVGhlIGZpZWxkIGJlaW5nIHJlZmVyZW5jZWQsIGZvciBmaWVsZC1waWN0dXJlIGNvZGVjcy4KKyAqIDAgZm9yIHRvcCBmaWVsZCBvciBmcmFtZSBwaWN0dXJlcywgMSBmb3IgYm90dG9tIGZpZWxkLgorICovCit2b2lkIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhUaHJlYWRGcmFtZSAqZiwgaW50IHByb2dyZXNzLCBpbnQgZmllbGQpOworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGdldF9mb3JtYXQoKSBmb3IgZnJhbWUtbXVsdGl0aHJlYWRlZCBjb2RlY3MuCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24gaW5zdGVhZCBvZiBhdmN0eC0+Z2V0X2Zvcm1hdCgpLgorICogQ2Fubm90IGJlIGNhbGxlZCBhZnRlciB0aGUgY29kZWMgaGFzIGNhbGxlZCBmZl90aHJlYWRfZmluaXNoX3NldHVwKCkuCisgKgorICogQHBhcmFtIGF2Y3R4IFRoZSBjdXJyZW50IGNvbnRleHQuCisgKiBAcGFyYW0gZm10IFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmb3JtYXRzLgorICovCitlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfdGhyZWFkX2dldF9mb3JtYXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKmZtdCk7CisKKy8qKgorICogV3JhcHBlciBhcm91bmQgZ2V0X2J1ZmZlcigpIGZvciBmcmFtZS1tdWx0aXRocmVhZGVkIGNvZGVjcy4KKyAqIENhbGwgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIGZmX2dldF9idWZmZXIoZikuCisgKiBDYW5ub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBjb2RlYyBoYXMgY2FsbGVkIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoKS4KKyAqCisgKiBAcGFyYW0gYXZjdHggVGhlIGN1cnJlbnQgY29udGV4dC4KKyAqIEBwYXJhbSBmIFRoZSBmcmFtZSB0byB3cml0ZSBpbnRvLgorICovCitpbnQgZmZfdGhyZWFkX2dldF9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBUaHJlYWRGcmFtZSAqZiwgaW50IGZsYWdzKTsKKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCByZWxlYXNlX2J1ZmZlcigpIGZyYW1lLWZvciBtdWx0aXRocmVhZGVkIGNvZGVjcy4KKyAqIENhbGwgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIGF2Y3R4LT5yZWxlYXNlX2J1ZmZlcihmKS4KKyAqIFRoZSBBVkZyYW1lIHdpbGwgYmUgY29waWVkIGFuZCB0aGUgYWN0dWFsIHJlbGVhc2VfYnVmZmVyKCkgY2FsbAorICogd2lsbCBiZSBwZXJmb3JtZWQgbGF0ZXIuIFRoZSBjb250ZW50cyBvZiBkYXRhIHBvaW50ZWQgdG8gYnkgdGhlCisgKiBBVkZyYW1lIHNob3VsZCBub3QgYmUgY2hhbmdlZCB1bnRpbCBmZl90aHJlYWRfZ2V0X2J1ZmZlcigpIGlzIGNhbGxlZAorICogb24gaXQuCisgKgorICogQHBhcmFtIGF2Y3R4IFRoZSBjdXJyZW50IGNvbnRleHQuCisgKiBAcGFyYW0gZiBUaGUgcGljdHVyZSBiZWluZyByZWxlYXNlZC4KKyAqLwordm9pZCBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBUaHJlYWRGcmFtZSAqZik7CisKK2ludCBmZl90aHJlYWRfcmVmX2ZyYW1lKFRocmVhZEZyYW1lICpkc3QsIFRocmVhZEZyYW1lICpzcmMpOworCitpbnQgZmZfdGhyZWFkX2luaXQoQVZDb2RlY0NvbnRleHQgKnMpOwordm9pZCBmZl90aHJlYWRfZnJlZShBVkNvZGVjQ29udGV4dCAqcyk7CisKK2ludCBmZl9hbGxvY19lbnRyaWVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGNvdW50KTsKK3ZvaWQgZmZfcmVzZXRfZW50cmllcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBmaWVsZCwgaW50IHRocmVhZCwgaW50IG4pOwordm9pZCBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgIGludCBmaWVsZCwgaW50IHRocmVhZCwgaW50IHNoaWZ0KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVEhSRUFEX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3RpZXJ0ZXhzZXF2LmMgYi9mZm1wZWcvbGliYXZjb2RlYy90aWVydGV4c2Vxdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNjIyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy90aWVydGV4c2Vxdi5jCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogVGllcnRleCBMaW1pdGVkIFNFUSBWaWRlbyBEZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgR3JlZ29yeSBNb250b2lyIChjeXhAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUaWVydGV4IExpbWl0ZWQgU0VRIHZpZGVvIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3R5cGVkZWYgc3RydWN0IFNlcVZpZGVvQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRnJhbWUgKmZyYW1lOworfSBTZXFWaWRlb0NvbnRleHQ7CisKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlcV91bnBhY2tfcmxlX2Jsb2NrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzdF9zaXplKQoreworICAgIGludCBpLCBsZW4sIHN6OworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGNvZGVfdGFibGVbNjRdOworCisgICAgLyogZ2V0IHRoZSBybGUgY29kZXMgKi8KKyAgICBpbml0X2dldF9iaXRzKCZnYiwgc3JjLCAoc3JjX2VuZCAtIHNyYykgKiA4KTsKKyAgICBmb3IgKGkgPSAwLCBzeiA9IDA7IGkgPCA2NCAmJiBzeiA8IGRzdF9zaXplOyBpKyspIHsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmdiKSA8IDQpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY29kZV90YWJsZVtpXSA9IGdldF9zYml0cygmZ2IsIDQpOworICAgICAgICBzeiArPSBGRkFCUyhjb2RlX3RhYmxlW2ldKTsKKyAgICB9CisgICAgc3JjICs9IChnZXRfYml0c19jb3VudCgmZ2IpICsgNykgLyA4OworCisgICAgLyogZG8gdGhlIHJsZSB1bnBhY2tpbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQgJiYgZHN0X3NpemUgPiAwOyBpKyspIHsKKyAgICAgICAgbGVuID0gY29kZV90YWJsZVtpXTsKKyAgICAgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgICAgIGxlbiA9IC1sZW47CisgICAgICAgICAgICBpZiAoc3JjX2VuZCAtIHNyYyA8IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBtZW1zZXQoZHN0LCAqc3JjKyssIEZGTUlOKGxlbiwgZHN0X3NpemUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzcmNfZW5kIC0gc3JjIDwgbGVuKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBGRk1JTihsZW4sIGRzdF9zaXplKSk7CisgICAgICAgICAgICBzcmMgKz0gbGVuOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBsZW47CisgICAgICAgIGRzdF9zaXplIC09IGxlbjsKKyAgICB9CisgICAgcmV0dXJuIHNyYzsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlcV9kZWNvZGVfb3AxKFNlcVZpZGVvQ29udGV4dCAqc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb2xvcl90YWJsZTsKKyAgICBpbnQgYiwgaSwgbGVuLCBiaXRzOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgdW5zaWduZWQgY2hhciBibG9ja1s4ICogOF07CisKKyAgICBpZiAoc3JjX2VuZCAtIHNyYyA8IDEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxlbiA9ICpzcmMrKzsKKyAgICBpZiAobGVuICYgMHg4MCkgeworICAgICAgICBzd2l0Y2ggKGxlbiAmIDMpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgc3JjID0gc2VxX3VucGFja19ybGVfYmxvY2soc3JjLCBzcmNfZW5kLCBibG9jaywgc2l6ZW9mKGJsb2NrKSk7CisgICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgODsgYisrKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgJmJsb2NrW2IgKiA4XSwgOCk7CisgICAgICAgICAgICAgICAgZHN0ICs9IHNlcS0+ZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHNyYyA9IHNlcV91bnBhY2tfcmxlX2Jsb2NrKHNyYywgc3JjX2VuZCwgYmxvY2ssIHNpemVvZihibG9jaykpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCA4OyBiKyspCisgICAgICAgICAgICAgICAgICAgIGRzdFtiICogc2VxLT5mcmFtZS0+bGluZXNpemVbMF1dID0gYmxvY2tbaSAqIDggKyBiXTsKKyAgICAgICAgICAgICAgICArK2RzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGxlbiA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJpdHMgPSBmZl9sb2cyX3RhYltsZW4gLSAxXSArIDE7CisgICAgICAgIGlmIChzcmNfZW5kIC0gc3JjIDwgbGVuICsgOCAqIGJpdHMpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY29sb3JfdGFibGUgPSBzcmM7CisgICAgICAgIHNyYyArPSBsZW47CisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBzcmMsIGJpdHMgKiA4ICogOCk7IHNyYyArPSBiaXRzICogODsKKyAgICAgICAgZm9yIChiID0gMDsgYiA8IDg7IGIrKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBjb2xvcl90YWJsZVtnZXRfYml0cygmZ2IsIGJpdHMpXTsKKyAgICAgICAgICAgIGRzdCArPSBzZXEtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzcmM7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICpzZXFfZGVjb2RlX29wMihTZXFWaWRlb0NvbnRleHQgKnNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoc3JjX2VuZCAtIHNyYyA8IDggKiA4KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCA4KTsKKyAgICAgICAgc3JjICs9IDg7CisgICAgICAgIGRzdCArPSBzZXEtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICByZXR1cm4gc3JjOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqc2VxX2RlY29kZV9vcDMoU2VxVmlkZW9Db250ZXh0ICpzZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0KQoreworICAgIGludCBwb3MsIG9mZnNldDsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKHNyY19lbmQgLSBzcmMgPCAyKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHBvcyA9ICpzcmMrKzsKKyAgICAgICAgb2Zmc2V0ID0gKChwb3MgPj4gMykgJiA3KSAqIHNlcS0+ZnJhbWUtPmxpbmVzaXplWzBdICsgKHBvcyAmIDcpOworICAgICAgICBkc3Rbb2Zmc2V0XSA9ICpzcmMrKzsKKyAgICB9IHdoaWxlICghKHBvcyAmIDB4ODApKTsKKworICAgIHJldHVybiBzcmM7Cit9CisKK3N0YXRpYyBpbnQgc2VxdmlkZW9fZGVjb2RlKFNlcVZpZGVvQ29udGV4dCAqc2VxLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgZGF0YV9zaXplKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGFfZW5kID0gZGF0YSArIGRhdGFfc2l6ZTsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBmbGFncywgaSwgaiwgeCwgeSwgb3A7CisgICAgdW5zaWduZWQgY2hhciBjWzNdOworICAgIHVuc2lnbmVkIGNoYXIgKmRzdDsKKyAgICB1aW50MzJfdCAqcGFsZXR0ZTsKKworICAgIGZsYWdzID0gKmRhdGErKzsKKworICAgIGlmIChmbGFncyAmIDEpIHsKKyAgICAgICAgcGFsZXR0ZSA9ICh1aW50MzJfdCAqKXNlcS0+ZnJhbWUtPmRhdGFbMV07CisgICAgICAgIGlmIChkYXRhX2VuZCAtIGRhdGEgPCAyNTYgKiAzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKywgZGF0YSsrKQorICAgICAgICAgICAgICAgIGNbal0gPSAoKmRhdGEgPDwgMikgfCAoKmRhdGEgPj4gNCk7CisgICAgICAgICAgICBwYWxldHRlW2ldID0gMHhGRlUgPDwgMjQgfCBBVl9SQjI0KGMpOworICAgICAgICB9CisgICAgICAgIHNlcS0+ZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgIH0KKworICAgIGlmIChmbGFncyAmIDIpIHsKKyAgICAgICAgaWYgKGRhdGFfZW5kIC0gZGF0YSA8IDEyOCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgZGF0YSwgMTI4ICogOCk7IGRhdGEgKz0gMTI4OworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTI4OyB5ICs9IDgpCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgMjU2OyB4ICs9IDgpIHsKKyAgICAgICAgICAgICAgICBkc3QgPSAmc2VxLT5mcmFtZS0+ZGF0YVswXVt5ICogc2VxLT5mcmFtZS0+bGluZXNpemVbMF0gKyB4XTsKKyAgICAgICAgICAgICAgICBvcCA9IGdldF9iaXRzKCZnYiwgMik7CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlcV9kZWNvZGVfb3AxKHNlcSwgZGF0YSwgZGF0YV9lbmQsIGRzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlcV9kZWNvZGVfb3AyKHNlcSwgZGF0YSwgZGF0YV9lbmQsIGRzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlcV9kZWNvZGVfb3AzKHNlcSwgZGF0YSwgZGF0YV9lbmQsIGRzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWRhdGEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHNlcXZpZGVvX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTZXFWaWRlb0NvbnRleHQgKnNlcSA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzZXEtPmF2Y3R4ID0gYXZjdHg7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICBzZXEtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXNlcS0+ZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXF2aWRlb19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgaW50IHJldDsKKworICAgIFNlcVZpZGVvQ29udGV4dCAqc2VxID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzZXEtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHNlcXZpZGVvX2RlY29kZShzZXEsIGJ1ZiwgYnVmX3NpemUpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHNlcS0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgKmdvdF9mcmFtZSAgICAgICA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBzZXF2aWRlb19kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTZXFWaWRlb0NvbnRleHQgKnNlcSA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzZXEtPmZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3RpZXJ0ZXhzZXF2aWRlb19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ0aWVydGV4c2VxdmlkZW8iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUaWVydGV4IExpbWl0ZWQgU0VRIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1RJRVJURVhTRVFWSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU2VxVmlkZW9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBzZXF2aWRlb19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBzZXF2aWRlb19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHNlcXZpZGVvX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3RpZmYuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTE2ZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGlmZi5jCkBAIC0wLDAgKzEsMTM4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFRJRkYgaW1hZ2UgZGVjb2RlcgorICogQGF1dGhvciBLb25zdGFudGluIFNoaXNoa292CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIENPTkZJR19aTElCCisjaW5jbHVkZSA8emxpYi5oPgorI2VuZGlmCisjaWYgQ09ORklHX0xaTUEKKyNkZWZpbmUgTFpNQV9BUElfU1RBVElDCisjaW5jbHVkZSA8bHptYS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImZheGNvbXByLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsencuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAidGlmZi5oIgorI2luY2x1ZGUgInRpZmZfZGF0YS5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCit0eXBlZGVmIHN0cnVjdCBUaWZmQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgdW5zaWduZWQgaW50IGJwcCwgYnBwY291bnQ7CisgICAgdWludDMyX3QgcGFsZXR0ZVsyNTZdOworICAgIGludCBwYWxldHRlX2lzX3NldDsKKyAgICBpbnQgbGU7CisgICAgZW51bSBUaWZmQ29tcHIgY29tcHI7CisgICAgZW51bSBUaWZmUGhvdG9tZXRyaWMgcGhvdG9tZXRyaWM7CisgICAgaW50IHBsYW5hcjsKKyAgICBpbnQgc3Vic2FtcGxpbmdbMl07CisgICAgaW50IGZheF9vcHRzOworICAgIGludCBwcmVkaWN0b3I7CisgICAgaW50IGZpbGxfb3JkZXI7CisgICAgdWludDMyX3QgcmVzWzRdOworCisgICAgaW50IHN0cmlwcywgcnBzLCBzc3R5cGU7CisgICAgaW50IHNvdDsKKyAgICBpbnQgc3RyaXBzaXplc29mZiwgc3RyaXBzaXplLCBzdHJpcG9mZiwgc3RyaXBwb3M7CisgICAgTFpXU3RhdGUgKmx6dzsKKworICAgIHVpbnQ4X3QgKmRlaW52ZXJ0X2J1ZjsKKyAgICBpbnQgZGVpbnZlcnRfYnVmX3NpemU7CisgICAgdWludDhfdCAqeXV2X2xpbmU7CisgICAgdW5zaWduZWQgaW50IHl1dl9saW5lX3NpemU7CisKKyAgICBpbnQgZ2VvdGFnX2NvdW50OworICAgIFRpZmZHZW9UYWcgKmdlb3RhZ3M7Cit9IFRpZmZDb250ZXh0OworCitzdGF0aWMgdm9pZCBmcmVlX2dlb3RhZ3MoVGlmZkNvbnRleHQgKmNvbnN0IHMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPmdlb3RhZ19jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzLT5nZW90YWdzW2ldLnZhbCkKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5nZW90YWdzW2ldLnZhbCk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZzLT5nZW90YWdzKTsKKyAgICBzLT5nZW90YWdfY291bnQgPSAwOworfQorCisjZGVmaW5lIFJFVF9HRU9LRVkoVFlQRSwgYXJyYXksIGVsZW1lbnQpXAorICAgIGlmIChrZXkgPj0gVElGRl8jI1RZUEUjI19LRVlfSURfT0ZGU0VUICYmXAorICAgICAgICBrZXkgLSBUSUZGXyMjVFlQRSMjX0tFWV9JRF9PRkZTRVQgPCBGRl9BUlJBWV9FTEVNUyhmZl90aWZmXyMjYXJyYXkjI19uYW1lX3R5cGVfbWFwKSlcCisgICAgICAgIHJldHVybiBmZl90aWZmXyMjYXJyYXkjI19uYW1lX3R5cGVfbWFwW2tleSAtIFRJRkZfIyNUWVBFIyNfS0VZX0lEX09GRlNFVF0uZWxlbWVudDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9nZW9rZXlfbmFtZShpbnQga2V5KQoreworICAgIFJFVF9HRU9LRVkoVkVSVCwgdmVydCwgbmFtZSk7CisgICAgUkVUX0dFT0tFWShQUk9KLCBwcm9qLCBuYW1lKTsKKyAgICBSRVRfR0VPS0VZKEdFT0csIGdlb2csIG5hbWUpOworICAgIFJFVF9HRU9LRVkoQ09ORiwgY29uZiwgbmFtZSk7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBnZXRfZ2Vva2V5X3R5cGUoaW50IGtleSkKK3sKKyAgICBSRVRfR0VPS0VZKFZFUlQsIHZlcnQsIHR5cGUpOworICAgIFJFVF9HRU9LRVkoUFJPSiwgcHJvaiwgdHlwZSk7CisgICAgUkVUX0dFT0tFWShHRU9HLCBnZW9nLCB0eXBlKTsKKyAgICBSRVRfR0VPS0VZKENPTkYsIGNvbmYsIHR5cGUpOworCisgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKK3N0YXRpYyBpbnQgY21wX2lkX2tleShjb25zdCB2b2lkICppZCwgY29uc3Qgdm9pZCAqaykKK3sKKyAgICByZXR1cm4gKihjb25zdCBpbnQqKWlkIC0gKChjb25zdCBUaWZmR2VvVGFnS2V5TmFtZSopayktPmtleTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNlYXJjaF9rZXl2YWwoY29uc3QgVGlmZkdlb1RhZ0tleU5hbWUgKmtleXMsIGludCBuLCBpbnQgaWQpCit7CisgICAgVGlmZkdlb1RhZ0tleU5hbWUgKnIgPSBic2VhcmNoKCZpZCwga2V5cywgbiwgc2l6ZW9mKGtleXNbMF0pLCBjbXBfaWRfa2V5KTsKKyAgICBpZihyKQorICAgICAgICByZXR1cm4gci0+bmFtZTsKKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciAqZ2V0X2dlb2tleV92YWwoaW50IGtleSwgaW50IHZhbCkKK3sKKyAgICBjaGFyICphcDsKKworICAgIGlmICh2YWwgPT0gVElGRl9HRU9fS0VZX1VOREVGSU5FRCkKKyAgICAgICAgcmV0dXJuIGF2X3N0cmR1cCgidW5kZWZpbmVkIik7CisgICAgaWYgKHZhbCA9PSBUSUZGX0dFT19LRVlfVVNFUl9ERUZJTkVEKQorICAgICAgICByZXR1cm4gYXZfc3RyZHVwKCJVc2VyLURlZmluZWQiKTsKKworI2RlZmluZSBSRVRfR0VPS0VZX1ZBTChUWVBFLCBhcnJheSlcCisgICAgaWYgKHZhbCA+PSBUSUZGXyMjVFlQRSMjX09GRlNFVCAmJlwKKyAgICAgICAgdmFsIC0gVElGRl8jI1RZUEUjI19PRkZTRVQgPCBGRl9BUlJBWV9FTEVNUyhmZl90aWZmXyMjYXJyYXkjI19jb2RlcykpXAorICAgICAgICByZXR1cm4gYXZfc3RyZHVwKGZmX3RpZmZfIyNhcnJheSMjX2NvZGVzW3ZhbCAtIFRJRkZfIyNUWVBFIyNfT0ZGU0VUXSk7CisKKyAgICBzd2l0Y2ggKGtleSkgeworICAgIGNhc2UgVElGRl9HVF9NT0RFTF9UWVBFX0dFT0tFWToKKyAgICAgICAgUkVUX0dFT0tFWV9WQUwoR1RfTU9ERUxfVFlQRSwgZ3RfbW9kZWxfdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9HVF9SQVNURVJfVFlQRV9HRU9LRVk6CisgICAgICAgIFJFVF9HRU9LRVlfVkFMKEdUX1JBU1RFUl9UWVBFLCBndF9yYXN0ZXJfdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9HRU9HX0xJTkVBUl9VTklUU19HRU9LRVk6CisgICAgY2FzZSBUSUZGX1BST0pfTElORUFSX1VOSVRTX0dFT0tFWToKKyAgICBjYXNlIFRJRkZfVkVSVElDQUxfVU5JVFNfR0VPS0VZOgorICAgICAgICBSRVRfR0VPS0VZX1ZBTChMSU5FQVJfVU5JVCwgbGluZWFyX3VuaXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfR0VPR19BTkdVTEFSX1VOSVRTX0dFT0tFWToKKyAgICBjYXNlIFRJRkZfR0VPR19BWklNVVRIX1VOSVRTX0dFT0tFWToKKyAgICAgICAgUkVUX0dFT0tFWV9WQUwoQU5HVUxBUl9VTklULCBhbmd1bGFyX3VuaXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfR0VPR1JBUEhJQ19UWVBFX0dFT0tFWToKKyAgICAgICAgUkVUX0dFT0tFWV9WQUwoR0NTX1RZUEUsIGdjc190eXBlKTsKKyAgICAgICAgUkVUX0dFT0tFWV9WQUwoR0NTRV9UWVBFLCBnY3NlX3R5cGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfR0VPR19HRU9ERVRJQ19EQVRVTV9HRU9LRVk6CisgICAgICAgIFJFVF9HRU9LRVlfVkFMKEdFT0RFVElDX0RBVFVNLCBnZW9kZXRpY19kYXR1bSk7CisgICAgICAgIFJFVF9HRU9LRVlfVkFMKEdFT0RFVElDX0RBVFVNX0UsIGdlb2RldGljX2RhdHVtX2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfR0VPR19FTExJUFNPSURfR0VPS0VZOgorICAgICAgICBSRVRfR0VPS0VZX1ZBTChFTExJUFNPSUQsIGVsbGlwc29pZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9HRU9HX1BSSU1FX01FUklESUFOX0dFT0tFWToKKyAgICAgICAgUkVUX0dFT0tFWV9WQUwoUFJJTUVfTUVSSURJQU4sIHByaW1lX21lcmlkaWFuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUSUZGX1BST0pFQ1RFRF9DU19UWVBFX0dFT0tFWToKKyAgICAgICAgYXAgPSBhdl9zdHJkdXAoc2VhcmNoX2tleXZhbChmZl90aWZmX3Byb2pfY3NfdHlwZV9jb2RlcywgRkZfQVJSQVlfRUxFTVMoZmZfdGlmZl9wcm9qX2NzX3R5cGVfY29kZXMpLCB2YWwpKTsKKyAgICAgICAgaWYoYXApIHJldHVybiBhcDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUSUZGX1BST0pFQ1RJT05fR0VPS0VZOgorICAgICAgICBhcCA9IGF2X3N0cmR1cChzZWFyY2hfa2V5dmFsKGZmX3RpZmZfcHJvamVjdGlvbl9jb2RlcywgRkZfQVJSQVlfRUxFTVMoZmZfdGlmZl9wcm9qZWN0aW9uX2NvZGVzKSwgdmFsKSk7CisgICAgICAgIGlmKGFwKSByZXR1cm4gYXA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9QUk9KX0NPT1JEX1RSQU5TX0dFT0tFWToKKyAgICAgICAgUkVUX0dFT0tFWV9WQUwoQ09PUkRfVFJBTlMsIGNvb3JkX3RyYW5zKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUSUZGX1ZFUlRJQ0FMX0NTX1RZUEVfR0VPS0VZOgorICAgICAgICBSRVRfR0VPS0VZX1ZBTChWRVJUX0NTLCB2ZXJ0X2NzKTsKKyAgICAgICAgUkVUX0dFT0tFWV9WQUwoT1JUSE9fVkVSVF9DUywgb3J0aG9fdmVydF9jcyk7CisgICAgICAgIGJyZWFrOworCisgICAgfQorCisgICAgYXAgPSBhdl9tYWxsb2MoMTQpOworICAgIGlmIChhcCkKKyAgICAgICAgc25wcmludGYoYXAsIDE0LCAiVW5rbm93bi0lZCIsIHZhbCk7CisgICAgcmV0dXJuIGFwOworfQorCitzdGF0aWMgY2hhciAqZG91YmxlczJzdHIoZG91YmxlICpkcCwgaW50IGNvdW50LCBjb25zdCBjaGFyICpzZXApCit7CisgICAgaW50IGk7CisgICAgY2hhciAqYXAsICphcDA7CisgICAgdWludDY0X3QgY29tcG9uZW50X2xlbjsKKyAgICBpZiAoIXNlcCkgc2VwID0gIiwgIjsKKyAgICBjb21wb25lbnRfbGVuID0gMjRMTCArIHN0cmxlbihzZXApOworICAgIGlmIChjb3VudCA+PSAoSU5UX01BWCAtIDEpL2NvbXBvbmVudF9sZW4pCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFwID0gYXZfbWFsbG9jKGNvbXBvbmVudF9sZW4gKiBjb3VudCArIDEpOworICAgIGlmICghYXApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFwMCAgID0gYXA7CisgICAgYXBbMF0gPSAnXDAnOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGwgPSBzbnByaW50ZihhcCwgY29tcG9uZW50X2xlbiwgIiUuMTVnJXMiLCBkcFtpXSwgc2VwKTsKKyAgICAgICAgaWYobCA+PSBjb21wb25lbnRfbGVuKSB7CisgICAgICAgICAgICBhdl9mcmVlKGFwMCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhcCArPSBsOworICAgIH0KKyAgICBhcDBbc3RybGVuKGFwMCkgLSBzdHJsZW4oc2VwKV0gPSAnXDAnOworICAgIHJldHVybiBhcDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX21ldGFkYXRhKGludCBjb3VudCwgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzZXAsIFRpZmZDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgVElGRl9ET1VCTEU6IHJldHVybiBmZl90YWRkX2RvdWJsZXNfbWV0YWRhdGEoY291bnQsIG5hbWUsIHNlcCwgJnMtPmdiLCBzLT5sZSwgYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAoZnJhbWUpKTsKKyAgICBjYXNlIFRJRkZfU0hPUlQgOiByZXR1cm4gZmZfdGFkZF9zaG9ydHNfbWV0YWRhdGEoY291bnQsIG5hbWUsIHNlcCwgJnMtPmdiLCBzLT5sZSwgMCwgYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAoZnJhbWUpKTsKKyAgICBjYXNlIFRJRkZfU1RSSU5HOiByZXR1cm4gZmZfdGFkZF9zdHJpbmdfbWV0YWRhdGEoY291bnQsIG5hbWUsICZzLT5nYiwgcy0+bGUsIGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKGZyYW1lKSk7CisgICAgZGVmYXVsdCAgICAgICAgIDogcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfTsKK30KKworc3RhdGljIHZvaWQgYXZfYWx3YXlzX2lubGluZSBob3Jpem9udGFsX2ZpbGwodW5zaWduZWQgaW50IGJwcCwgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZVB0ciwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjLCBpbnQgd2lkdGgsIGludCBvZmZzZXQpCit7CisgICAgc3dpdGNoIChicHApIHsKKyAgICBjYXNlIDE6CisgICAgICAgIHdoaWxlICgtLXdpZHRoID49IDApIHsKKyAgICAgICAgICAgIGRzdFsod2lkdGgrb2Zmc2V0KSo4KzddID0gKHVzZVB0ciA/IHNyY1t3aWR0aF0gOiBjKSAgICAgICYgMHgxOworICAgICAgICAgICAgZHN0Wyh3aWR0aCtvZmZzZXQpKjgrNl0gPSAodXNlUHRyID8gc3JjW3dpZHRoXSA6IGMpID4+IDEgJiAweDE7CisgICAgICAgICAgICBkc3RbKHdpZHRoK29mZnNldCkqOCs1XSA9ICh1c2VQdHIgPyBzcmNbd2lkdGhdIDogYykgPj4gMiAmIDB4MTsKKyAgICAgICAgICAgIGRzdFsod2lkdGgrb2Zmc2V0KSo4KzRdID0gKHVzZVB0ciA/IHNyY1t3aWR0aF0gOiBjKSA+PiAzICYgMHgxOworICAgICAgICAgICAgZHN0Wyh3aWR0aCtvZmZzZXQpKjgrM10gPSAodXNlUHRyID8gc3JjW3dpZHRoXSA6IGMpID4+IDQgJiAweDE7CisgICAgICAgICAgICBkc3RbKHdpZHRoK29mZnNldCkqOCsyXSA9ICh1c2VQdHIgPyBzcmNbd2lkdGhdIDogYykgPj4gNSAmIDB4MTsKKyAgICAgICAgICAgIGRzdFsod2lkdGgrb2Zmc2V0KSo4KzFdID0gKHVzZVB0ciA/IHNyY1t3aWR0aF0gOiBjKSA+PiA2ICYgMHgxOworICAgICAgICAgICAgZHN0Wyh3aWR0aCtvZmZzZXQpKjgrMF0gPSAodXNlUHRyID8gc3JjW3dpZHRoXSA6IGMpID4+IDc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICB3aGlsZSAoLS13aWR0aCA+PSAwKSB7CisgICAgICAgICAgICBkc3RbKHdpZHRoK29mZnNldCkqNCszXSA9ICh1c2VQdHIgPyBzcmNbd2lkdGhdIDogYykgJiAweDM7CisgICAgICAgICAgICBkc3RbKHdpZHRoK29mZnNldCkqNCsyXSA9ICh1c2VQdHIgPyBzcmNbd2lkdGhdIDogYykgPj4gMiAmIDB4MzsKKyAgICAgICAgICAgIGRzdFsod2lkdGgrb2Zmc2V0KSo0KzFdID0gKHVzZVB0ciA/IHNyY1t3aWR0aF0gOiBjKSA+PiA0ICYgMHgzOworICAgICAgICAgICAgZHN0Wyh3aWR0aCtvZmZzZXQpKjQrMF0gPSAodXNlUHRyID8gc3JjW3dpZHRoXSA6IGMpID4+IDY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICB3aGlsZSAoLS13aWR0aCA+PSAwKSB7CisgICAgICAgICAgICBkc3RbKHdpZHRoK29mZnNldCkqMisxXSA9ICh1c2VQdHIgPyBzcmNbd2lkdGhdIDogYykgJiAweEY7CisgICAgICAgICAgICBkc3RbKHdpZHRoK29mZnNldCkqMiswXSA9ICh1c2VQdHIgPyBzcmNbd2lkdGhdIDogYykgPj4gNDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAodXNlUHRyKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0ICsgb2Zmc2V0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbXNldChkc3QgKyBvZmZzZXQsIGMsIHdpZHRoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBkZWludmVydF9idWZmZXIoVGlmZkNvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNpemUpCit7CisgICAgaW50IGk7CisKKyAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnMtPmRlaW52ZXJ0X2J1ZiwgJnMtPmRlaW52ZXJ0X2J1Zl9zaXplLCBzaXplKTsKKyAgICBpZiAoIXMtPmRlaW52ZXJ0X2J1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICBzLT5kZWludmVydF9idWZbaV0gPSBmZl9yZXZlcnNlW3NyY1tpXV07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdW5wYWNrX3l1dihUaWZmQ29udGV4dCAqcywgQVZGcmFtZSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgbG51bSkKK3sKKyAgICBpbnQgaSwgaiwgazsKKyAgICBpbnQgdyAgICAgICA9IChzLT53aWR0aCAtIDEpIC8gcy0+c3Vic2FtcGxpbmdbMF0gKyAxOworICAgIHVpbnQ4X3QgKnB1ID0gJnAtPmRhdGFbMV1bbG51bSAvIHMtPnN1YnNhbXBsaW5nWzFdICogcC0+bGluZXNpemVbMV1dOworICAgIHVpbnQ4X3QgKnB2ID0gJnAtPmRhdGFbMl1bbG51bSAvIHMtPnN1YnNhbXBsaW5nWzFdICogcC0+bGluZXNpemVbMl1dOworICAgIGlmIChzLT53aWR0aCAlIHMtPnN1YnNhbXBsaW5nWzBdIHx8IHMtPmhlaWdodCAlIHMtPnN1YnNhbXBsaW5nWzFdKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5zdWJzYW1wbGluZ1sxXTsgaisrKQorICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5zdWJzYW1wbGluZ1swXTsgaysrKQorICAgICAgICAgICAgICAgICAgICBwLT5kYXRhWzBdW0ZGTUlOKGxudW0gKyBqLCBzLT5oZWlnaHQtMSkgKiBwLT5saW5lc2l6ZVswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oaSAqIHMtPnN1YnNhbXBsaW5nWzBdICsgaywgcy0+d2lkdGgtMSldID0gKnNyYysrOworICAgICAgICAgICAgKnB1KysgPSAqc3JjKys7CisgICAgICAgICAgICAqcHYrKyA9ICpzcmMrKzsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+c3Vic2FtcGxpbmdbMV07IGorKykKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+c3Vic2FtcGxpbmdbMF07IGsrKykKKyAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVswXVsobG51bSArIGopICogcC0+bGluZXNpemVbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiBzLT5zdWJzYW1wbGluZ1swXSArIGtdID0gKnNyYysrOworICAgICAgICAgICAgKnB1KysgPSAqc3JjKys7CisgICAgICAgICAgICAqcHYrKyA9ICpzcmMrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworI2lmIENPTkZJR19aTElCCitzdGF0aWMgaW50IHRpZmZfdW5jb21wcmVzcyh1aW50OF90ICpkc3QsIHVuc2lnbmVkIGxvbmcgKmxlbiwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCit7CisgICAgel9zdHJlYW0genN0cmVhbSA9IHsgMCB9OworICAgIGludCB6cmV0OworCisgICAgenN0cmVhbS5uZXh0X2luICAgPSAodWludDhfdCAqKXNyYzsKKyAgICB6c3RyZWFtLmF2YWlsX2luICA9IHNpemU7CisgICAgenN0cmVhbS5uZXh0X291dCAgPSBkc3Q7CisgICAgenN0cmVhbS5hdmFpbF9vdXQgPSAqbGVuOworICAgIHpyZXQgICAgICAgICAgICAgID0gaW5mbGF0ZUluaXQoJnpzdHJlYW0pOworICAgIGlmICh6cmV0ICE9IFpfT0spIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkluZmxhdGUgaW5pdCBlcnJvcjogJWRcbiIsIHpyZXQpOworICAgICAgICByZXR1cm4genJldDsKKyAgICB9CisgICAgenJldCA9IGluZmxhdGUoJnpzdHJlYW0sIFpfU1lOQ19GTFVTSCk7CisgICAgaW5mbGF0ZUVuZCgmenN0cmVhbSk7CisgICAgKmxlbiA9IHpzdHJlYW0udG90YWxfb3V0OworICAgIHJldHVybiB6cmV0ID09IFpfU1RSRUFNX0VORCA/IFpfT0sgOiB6cmV0OworfQorCitzdGF0aWMgaW50IHRpZmZfdW5wYWNrX3psaWIoVGlmZkNvbnRleHQgKnMsIEFWRnJhbWUgKnAsIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzaXplLCBpbnQgd2lkdGgsIGludCBsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaXBfc3RhcnQsIGludCBpc195dXYpCit7CisgICAgdWludDhfdCAqemJ1ZjsKKyAgICB1bnNpZ25lZCBsb25nIG91dGxlbjsKKyAgICBpbnQgcmV0LCBsaW5lOworICAgIG91dGxlbiA9IHdpZHRoICogbGluZXM7CisgICAgemJ1ZiAgID0gYXZfbWFsbG9jKG91dGxlbik7CisgICAgaWYgKCF6YnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmIChzLT5maWxsX29yZGVyKSB7CisgICAgICAgIGlmICgocmV0ID0gZGVpbnZlcnRfYnVmZmVyKHMsIHNyYywgc2l6ZSkpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZSh6YnVmKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgc3JjID0gcy0+ZGVpbnZlcnRfYnVmOworICAgIH0KKyAgICByZXQgPSB0aWZmX3VuY29tcHJlc3MoemJ1ZiwgJm91dGxlbiwgc3JjLCBzaXplKTsKKyAgICBpZiAocmV0ICE9IFpfT0spIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5jb21wcmVzc2luZyBmYWlsZWQgKCVsdSBvZiAlbHUpIHdpdGggZXJyb3IgJWRcbiIsIG91dGxlbiwKKyAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXdpZHRoICogbGluZXMsIHJldCk7CisgICAgICAgIGF2X2ZyZWUoemJ1Zik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorICAgIHNyYyA9IHpidWY7CisgICAgZm9yIChsaW5lID0gMDsgbGluZSA8IGxpbmVzOyBsaW5lKyspIHsKKyAgICAgICAgaWYgKHMtPmJwcCA8IDggJiYgcy0+YXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7CisgICAgICAgICAgICBob3Jpem9udGFsX2ZpbGwocy0+YnBwLCBkc3QsIDEsIHNyYywgMCwgd2lkdGgsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzX3l1dikgeworICAgICAgICAgICAgdW5wYWNrX3l1dihzLCBwLCBkc3QsIHN0cmlwX3N0YXJ0ICsgbGluZSk7CisgICAgICAgICAgICBsaW5lICs9IHMtPnN1YnNhbXBsaW5nWzFdIC0gMTsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICBzcmMgKz0gd2lkdGg7CisgICAgfQorICAgIGF2X2ZyZWUoemJ1Zik7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmIENPTkZJR19MWk1BCitzdGF0aWMgaW50IHRpZmZfdW5jb21wcmVzc19sem1hKHVpbnQ4X3QgKmRzdCwgdWludDY0X3QgKmxlbiwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkKK3sKKyAgICBsem1hX3N0cmVhbSBzdHJlYW0gPSBMWk1BX1NUUkVBTV9JTklUOworICAgIGx6bWFfcmV0IHJldDsKKworICAgIHN0cmVhbS5uZXh0X2luICAgPSAodWludDhfdCAqKXNyYzsKKyAgICBzdHJlYW0uYXZhaWxfaW4gID0gc2l6ZTsKKyAgICBzdHJlYW0ubmV4dF9vdXQgID0gZHN0OworICAgIHN0cmVhbS5hdmFpbF9vdXQgPSAqbGVuOworICAgIHJldCAgICAgICAgICAgICAgPSBsem1hX3N0cmVhbV9kZWNvZGVyKCZzdHJlYW0sIFVJTlQ2NF9NQVgsIDApOworICAgIGlmIChyZXQgIT0gTFpNQV9PSykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTFpNQSBpbml0IGVycm9yOiAlZFxuIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0ID0gbHptYV9jb2RlKCZzdHJlYW0sIExaTUFfUlVOKTsKKyAgICBsem1hX2VuZCgmc3RyZWFtKTsKKyAgICAqbGVuID0gc3RyZWFtLnRvdGFsX291dDsKKyAgICByZXR1cm4gcmV0ID09IExaTUFfU1RSRUFNX0VORCA/IExaTUFfT0sgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGlmZl91bnBhY2tfbHptYShUaWZmQ29udGV4dCAqcywgQVZGcmFtZSAqcCwgdWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNpemUsIGludCB3aWR0aCwgaW50IGxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpcF9zdGFydCwgaW50IGlzX3l1dikKK3sKKyAgICB1aW50NjRfdCBvdXRsZW4gPSB3aWR0aCAqIGxpbmVzOworICAgIGludCByZXQsIGxpbmU7CisgICAgdWludDhfdCAqYnVmID0gYXZfbWFsbG9jKG91dGxlbik7CisgICAgaWYgKCFidWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaWYgKHMtPmZpbGxfb3JkZXIpIHsKKyAgICAgICAgaWYgKChyZXQgPSBkZWludmVydF9idWZmZXIocywgc3JjLCBzaXplKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHNyYyA9IHMtPmRlaW52ZXJ0X2J1ZjsKKyAgICB9CisgICAgcmV0ID0gdGlmZl91bmNvbXByZXNzX2x6bWEoYnVmLCAmb3V0bGVuLCBzcmMsIHNpemUpOworICAgIGlmIChyZXQgIT0gTFpNQV9PSykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbmNvbXByZXNzaW5nIGZhaWxlZCAoJSJQUkl1NjQiIG9mICUiUFJJdTY0Iikgd2l0aCBlcnJvciAlZFxuIiwgb3V0bGVuLAorICAgICAgICAgICAgICAgKHVpbnQ2NF90KXdpZHRoICogbGluZXMsIHJldCk7CisgICAgICAgIGF2X2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgc3JjID0gYnVmOworICAgIGZvciAobGluZSA9IDA7IGxpbmUgPCBsaW5lczsgbGluZSsrKSB7CisgICAgICAgIGlmIChzLT5icHAgPCA4ICYmIHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCkgeworICAgICAgICAgICAgaG9yaXpvbnRhbF9maWxsKHMtPmJwcCwgZHN0LCAxLCBzcmMsIDAsIHdpZHRoLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGgpOworICAgICAgICB9CisgICAgICAgIGlmIChpc195dXYpIHsKKyAgICAgICAgICAgIHVucGFja195dXYocywgcCwgZHN0LCBzdHJpcF9zdGFydCArIGxpbmUpOworICAgICAgICAgICAgbGluZSArPSBzLT5zdWJzYW1wbGluZ1sxXSAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgc3JjICs9IHdpZHRoOworICAgIH0KKyAgICBhdl9mcmVlKGJ1Zik7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB0aWZmX3VucGFja19mYXgoVGlmZkNvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNpemUsIGludCB3aWR0aCwgaW50IGxpbmVzKQoreworICAgIGludCBpLCByZXQgPSAwOworICAgIGludCBsaW5lOworICAgIHVpbnQ4X3QgKnNyYzIgPSBhdl9tYWxsb2MoKHVuc2lnbmVkKXNpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICBpZiAoIXNyYzIpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRXJyb3IgYWxsb2NhdGluZyB0ZW1wb3JhcnkgYnVmZmVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgaWYgKHMtPmZheF9vcHRzICYgMikgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJVbmNvbXByZXNzZWQgZmF4IG1vZGUiKTsKKyAgICAgICAgYXZfZnJlZShzcmMyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAoIXMtPmZpbGxfb3JkZXIpIHsKKyAgICAgICAgbWVtY3B5KHNyYzIsIHNyYywgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHNyYzJbaV0gPSBmZl9yZXZlcnNlW3NyY1tpXV07CisgICAgfQorICAgIG1lbXNldChzcmMyICsgc2l6ZSwgMCwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgcmV0ID0gZmZfY2NpdHRfdW5wYWNrKHMtPmF2Y3R4LCBzcmMyLCBzaXplLCBkc3QsIGxpbmVzLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbXByLCBzLT5mYXhfb3B0cyk7CisgICAgaWYgKHMtPmJwcCA8IDggJiYgcy0+YXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KQorICAgICAgICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgbGluZXM7IGxpbmUrKykgeworICAgICAgICAgICAgaG9yaXpvbnRhbF9maWxsKHMtPmJwcCwgZHN0LCAxLCBkc3QsIDAsIHdpZHRoLCAwKTsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICBhdl9mcmVlKHNyYzIpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGlmZl91bnBhY2tfc3RyaXAoVGlmZkNvbnRleHQgKnMsIEFWRnJhbWUgKnAsIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc2l6ZSwgaW50IHN0cmlwX3N0YXJ0LCBpbnQgbGluZXMpCit7CisgICAgUHV0Qnl0ZUNvbnRleHQgcGI7CisgICAgaW50IGMsIGxpbmUsIHBpeGVscywgY29kZSwgcmV0OworICAgIGNvbnN0IHVpbnQ4X3QgKnNzcmMgPSBzcmM7CisgICAgaW50IHdpZHRoID0gKChzLT53aWR0aCAqIHMtPmJwcCkgKyA3KSA+PiAzOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocC0+Zm9ybWF0KTsKKyAgICBpbnQgaXNfeXV2ID0gIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpICYmCisgICAgICAgICAgICAgICAgIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QTEFOQVIpICYmCisgICAgICAgICAgICAgICAgIGRlc2MtPm5iX2NvbXBvbmVudHMgPj0gMzsKKworICAgIGlmIChzLT5wbGFuYXIpCisgICAgICAgIHdpZHRoIC89IHMtPmJwcGNvdW50OworCisgICAgaWYgKHNpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoaXNfeXV2KSB7CisgICAgICAgIGludCBieXRlc19wZXJfcm93ID0gKCgocy0+d2lkdGggLSAxKSAvIHMtPnN1YnNhbXBsaW5nWzBdICsgMSkgKiBzLT5icHAgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN1YnNhbXBsaW5nWzBdICogcy0+c3Vic2FtcGxpbmdbMV0gKyA3KSA+PiAzOworICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnMtPnl1dl9saW5lLCAmcy0+eXV2X2xpbmVfc2l6ZSwgYnl0ZXNfcGVyX3Jvdyk7CisgICAgICAgIGlmIChzLT55dXZfbGluZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0ID0gcy0+eXV2X2xpbmU7CisgICAgICAgIHN0cmlkZSA9IDA7CisKKyAgICAgICAgd2lkdGggPSAocy0+d2lkdGggLSAxKSAvIHMtPnN1YnNhbXBsaW5nWzBdICsgMTsKKyAgICAgICAgd2lkdGggPSB3aWR0aCAqIHMtPnN1YnNhbXBsaW5nWzBdICogcy0+c3Vic2FtcGxpbmdbMV0gKyAyKndpZHRoOworICAgICAgICBhdl9hc3NlcnQwKHdpZHRoIDw9IGJ5dGVzX3Blcl9yb3cpOworICAgICAgICBhdl9hc3NlcnQwKHMtPmJwcCA9PSAyNCk7CisgICAgfQorCisgICAgaWYgKHMtPmNvbXByID09IFRJRkZfREVGTEFURSB8fCBzLT5jb21wciA9PSBUSUZGX0FET0JFX0RFRkxBVEUpIHsKKyNpZiBDT05GSUdfWkxJQgorICAgICAgICByZXR1cm4gdGlmZl91bnBhY2tfemxpYihzLCBwLCBkc3QsIHN0cmlkZSwgc3JjLCBzaXplLCB3aWR0aCwgbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwX3N0YXJ0LCBpc195dXYpOworI2Vsc2UKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiemxpYiBzdXBwb3J0IG5vdCBlbmFibGVkLCAiCisgICAgICAgICAgICAgICAiZGVmbGF0ZSBjb21wcmVzc2lvbiBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyNlbmRpZgorICAgIH0KKyAgICBpZiAocy0+Y29tcHIgPT0gVElGRl9MWk1BKSB7CisjaWYgQ09ORklHX0xaTUEKKyAgICAgICAgcmV0dXJuIHRpZmZfdW5wYWNrX2x6bWEocywgcCwgZHN0LCBzdHJpZGUsIHNyYywgc2l6ZSwgd2lkdGgsIGxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcF9zdGFydCwgaXNfeXV2KTsKKyNlbHNlCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkxaTUEgc3VwcG9ydCBub3QgZW5hYmxlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisjZW5kaWYKKyAgICB9CisgICAgaWYgKHMtPmNvbXByID09IFRJRkZfTFpXKSB7CisgICAgICAgIGlmIChzLT5maWxsX29yZGVyKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGRlaW52ZXJ0X2J1ZmZlcihzLCBzcmMsIHNpemUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHNzcmMgPSBzcmMgPSBzLT5kZWludmVydF9idWY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPiAxICYmICFzcmNbMF0gJiYgKHNyY1sxXSYxKSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbGQgc3R5bGUgTFpXIGlzIHVuc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJldCA9IGZmX2x6d19kZWNvZGVfaW5pdChzLT5sencsIDgsIHNyYywgc2l6ZSwgRkZfTFpXX1RJRkYpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgaW5pdGlhbGl6aW5nIExaVyBkZWNvZGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChsaW5lID0gMDsgbGluZSA8IGxpbmVzOyBsaW5lKyspIHsKKyAgICAgICAgICAgIHBpeGVscyA9IGZmX2x6d19kZWNvZGUocy0+bHp3LCBkc3QsIHdpZHRoKTsKKyAgICAgICAgICAgIGlmIChwaXhlbHMgPCB3aWR0aCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGVjb2RlZCBvbmx5ICVpIGJ5dGVzIG9mICVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5icHAgPCA4ICYmIHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCkKKyAgICAgICAgICAgICAgICBob3Jpem9udGFsX2ZpbGwocy0+YnBwLCBkc3QsIDEsIGRzdCwgMCwgd2lkdGgsIDApOworICAgICAgICAgICAgaWYgKGlzX3l1dikgeworICAgICAgICAgICAgICAgIHVucGFja195dXYocywgcCwgZHN0LCBzdHJpcF9zdGFydCArIGxpbmUpOworICAgICAgICAgICAgICAgIGxpbmUgKz0gcy0+c3Vic2FtcGxpbmdbMV0gLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHMtPmNvbXByID09IFRJRkZfQ0NJVFRfUkxFIHx8CisgICAgICAgIHMtPmNvbXByID09IFRJRkZfRzMgICAgICAgIHx8CisgICAgICAgIHMtPmNvbXByID09IFRJRkZfRzQpIHsKKyAgICAgICAgaWYgKGlzX3l1dikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHJldHVybiB0aWZmX3VucGFja19mYXgocywgZHN0LCBzdHJpZGUsIHNyYywgc2l6ZSwgd2lkdGgsIGxpbmVzKTsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZzLT5nYiwgc3JjLCBzaXplKTsKKyAgICBieXRlc3RyZWFtMl9pbml0X3dyaXRlcigmcGIsIGRzdCwgaXNfeXV2ID8gcy0+eXV2X2xpbmVfc2l6ZSA6IChzdHJpZGUgKiBsaW5lcykpOworCisgICAgZm9yIChsaW5lID0gMDsgbGluZSA8IGxpbmVzOyBsaW5lKyspIHsKKyAgICAgICAgaWYgKHNyYyAtIHNzcmMgPiBzaXplKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlNvdXJjZSBkYXRhIG92ZXJyZWFkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPT0gMCB8fCBieXRlc3RyZWFtMl9nZXRfZW9mKCZwYikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2Vla19wKCZwYiwgc3RyaWRlICogbGluZSwgU0VFS19TRVQpOworICAgICAgICBzd2l0Y2ggKHMtPmNvbXByKSB7CisgICAgICAgIGNhc2UgVElGRl9SQVc6CisgICAgICAgICAgICBpZiAoc3NyYyArIHNpemUgLSBzcmMgPCB3aWR0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgaWYgKCFzLT5maWxsX29yZGVyKSB7CisgICAgICAgICAgICAgICAgaG9yaXpvbnRhbF9maWxsKHMtPmJwcCAqIChzLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIDEsIHNyYywgMCwgd2lkdGgsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gZmZfcmV2ZXJzZVtzcmNbaV1dOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3JjICs9IHdpZHRoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVElGRl9QQUNLQklUUzoKKyAgICAgICAgICAgIGZvciAocGl4ZWxzID0gMDsgcGl4ZWxzIDwgd2lkdGg7KSB7CisgICAgICAgICAgICAgICAgaWYgKHNzcmMgKyBzaXplIC0gc3JjIDwgMikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlJlYWQgd2VudCBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZGUgPSBzLT5maWxsX29yZGVyID8gKGludDhfdCkgZmZfcmV2ZXJzZVsqc3JjKytdOiAoaW50OF90KSAqc3JjKys7CisgICAgICAgICAgICAgICAgaWYgKGNvZGUgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbHMgKyBjb2RlID4gd2lkdGggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzcmMgKyBzaXplIC0gc3JjIDwgY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvcHkgd2VudCBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxfZmlsbChzLT5icHAgKiAocy0+YXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgMSwgc3JjLCAwLCBjb2RlLCBwaXhlbHMpOworICAgICAgICAgICAgICAgICAgICBzcmMgICAgKz0gY29kZTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxzICs9IGNvZGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlICE9IC0xMjgpIHsgLy8gLTEyNy4uLTEKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9ICgtY29kZSkgKyAxOworICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxzICsgY29kZSA+IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVuIHdlbnQgb3V0IG9mIGJvdW5kc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsX2ZpbGwocy0+YnBwICogKHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIDAsIE5VTEwsIGMsIGNvZGUsIHBpeGVscyk7CisgICAgICAgICAgICAgICAgICAgIHBpeGVscyArPSBjb2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5maWxsX29yZGVyKSB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IGZmX3JldmVyc2VbZHN0W2ldXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpc195dXYpIHsKKyAgICAgICAgICAgIHVucGFja195dXYocywgcCwgZHN0LCBzdHJpcF9zdGFydCArIGxpbmUpOworICAgICAgICAgICAgbGluZSArPSBzLT5zdWJzYW1wbGluZ1sxXSAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9pbWFnZShUaWZmQ29udGV4dCAqcywgVGhyZWFkRnJhbWUgKmZyYW1lKQoreworICAgIGludCByZXQ7CisgICAgaW50IGNyZWF0ZV9ncmF5X3BhbGV0dGUgPSAwOworCisgICAgc3dpdGNoIChzLT5wbGFuYXIgKiAxMDAwICsgcy0+YnBwICogMTAgKyBzLT5icHBjb3VudCkgeworICAgIGNhc2UgMTE6CisgICAgICAgIGlmICghcy0+cGFsZXR0ZV9pc19zZXQpIHsKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9NT05PQkxBQ0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgMjE6CisgICAgY2FzZSA0MToKKyAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgICAgIGlmICghcy0+cGFsZXR0ZV9pc19zZXQpIHsKKyAgICAgICAgICAgIGNyZWF0ZV9ncmF5X3BhbGV0dGUgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODE6CisgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gcy0+cGFsZXR0ZV9pc19zZXQgPyBBVl9QSVhfRk1UX1BBTDggOiBBVl9QSVhfRk1UX0dSQVk4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0MzoKKyAgICAgICAgaWYgKHMtPnBob3RvbWV0cmljID09IFRJRkZfUEhPVE9NRVRSSUNfWUNCQ1IpIHsKKyAgICAgICAgICAgIGlmIChzLT5zdWJzYW1wbGluZ1swXSA9PSAxICYmIHMtPnN1YnNhbXBsaW5nWzFdID09IDEpIHsKKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c3Vic2FtcGxpbmdbMF0gPT0gMiAmJiBzLT5zdWJzYW1wbGluZ1sxXSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPnN1YnNhbXBsaW5nWzBdID09IDQgJiYgcy0+c3Vic2FtcGxpbmdbMV0gPT0gMSkgeworICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MTFQOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5zdWJzYW1wbGluZ1swXSA9PSAxICYmIHMtPnN1YnNhbXBsaW5nWzFdID09IDIpIHsKKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQwUDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c3Vic2FtcGxpbmdbMF0gPT0gMiAmJiBzLT5zdWJzYW1wbGluZ1sxXSA9PSAyKSB7CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPnN1YnNhbXBsaW5nWzBdID09IDQgJiYgcy0+c3Vic2FtcGxpbmdbMV0gPT0gNCkgeworICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MTBQOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIFlDYkNyIHN1YnNhbXBsaW5nXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2MToKKyAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBzLT5sZSA/IEFWX1BJWF9GTVRfR1JBWTE2TEUgOiBBVl9QSVhfRk1UX0dSQVkxNkJFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2MjoKKyAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lBODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjI6CisgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gcy0+bGUgPyBBVl9QSVhfRk1UX1lBMTZMRSA6IEFWX1BJWF9GTVRfWUExNkJFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDMyNDoKKyAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQkE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDgzOgorICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IHMtPmxlID8gQVZfUElYX0ZNVF9SR0I0OExFICA6IEFWX1BJWF9GTVRfUkdCNDhCRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2NDQ6CisgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gcy0+bGUgPyBBVl9QSVhfRk1UX1JHQkE2NExFICA6IEFWX1BJWF9GTVRfUkdCQTY0QkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI0MzoKKyAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTMyNDoKKyAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUkFQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE0ODM6CisgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gcy0+bGUgPyBBVl9QSVhfRk1UX0dCUlAxNkxFIDogQVZfUElYX0ZNVF9HQlJQMTZCRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjQ0OgorICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IHMtPmxlID8gQVZfUElYX0ZNVF9HQlJBUDE2TEUgOiBBVl9QSVhfRk1UX0dCUkFQMTZCRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVGhpcyBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCAoYnBwPSVkLCBicHBjb3VudD0lZClcbiIsCisgICAgICAgICAgICAgICBzLT5icHAsIHMtPmJwcGNvdW50KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHMtPnBob3RvbWV0cmljID09IFRJRkZfUEhPVE9NRVRSSUNfWUNCQ1IpIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzLT5hdmN0eC0+cGl4X2ZtdCk7CisgICAgICAgIGlmKChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpIHx8CisgICAgICAgICAgICEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSKSB8fAorICAgICAgICAgICBkZXNjLT5uYl9jb21wb25lbnRzIDwgMykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBZQ2JDciB2YXJpYW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPndpZHRoICE9IHMtPmF2Y3R4LT53aWR0aCB8fCBzLT5oZWlnaHQgIT0gcy0+YXZjdHgtPmhlaWdodCkgeworICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhzLT5hdmN0eCwgcy0+d2lkdGgsIHMtPmhlaWdodCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihzLT5hdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCkgeworICAgICAgICBpZiAoIWNyZWF0ZV9ncmF5X3BhbGV0dGUpCisgICAgICAgICAgICBtZW1jcHkoZnJhbWUtPmYtPmRhdGFbMV0sIHMtPnBhbGV0dGUsIHNpemVvZihzLT5wYWxldHRlKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogbWFrZSBkZWZhdWx0IGdyYXlzY2FsZSBwYWwgKi8KKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgdWludDMyX3QgKnBhbCA9ICh1aW50MzJfdCAqKWZyYW1lLT5mLT5kYXRhWzFdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE8PHMtPmJwcDsgaSsrKQorICAgICAgICAgICAgICAgIHBhbFtpXSA9IDB4RkZVIDw8IDI0IHwgaSAqIDI1NSAvICgoMTw8cy0+YnBwKSAtIDEpICogMHgwMTAxMDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zYXIoVGlmZkNvbnRleHQgKnMsIHVuc2lnbmVkIHRhZywgdW5zaWduZWQgbnVtLCB1bnNpZ25lZCBkZW4pCit7CisgICAgaW50IG9mZnNldCA9IHRhZyA9PSBUSUZGX1lSRVMgPyAyIDogMDsKKyAgICBzLT5yZXNbb2Zmc2V0KytdID0gbnVtOworICAgIHMtPnJlc1tvZmZzZXRdICAgPSBkZW47CisgICAgaWYgKHMtPnJlc1swXSAmJiBzLT5yZXNbMV0gJiYgcy0+cmVzWzJdICYmIHMtPnJlc1szXSkKKyAgICAgICAgYXZfcmVkdWNlKCZzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sICZzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgICBzLT5yZXNbMl0gKiAodWludDY0X3Qpcy0+cmVzWzFdLCBzLT5yZXNbMF0gKiAodWludDY0X3Qpcy0+cmVzWzNdLCBJTlQzMl9NQVgpOworfQorCitzdGF0aWMgaW50IHRpZmZfZGVjb2RlX3RhZyhUaWZmQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgdW5zaWduZWQgdGFnLCB0eXBlLCBjb3VudCwgb2ZmLCB2YWx1ZSA9IDAsIHZhbHVlMiA9IDA7CisgICAgaW50IGksIHN0YXJ0OworICAgIGludCBwb3M7CisgICAgaW50IHJldDsKKyAgICBkb3VibGUgKmRwOworCisgICAgcmV0ID0gZmZfdHJlYWRfdGFnKCZzLT5nYiwgcy0+bGUsICZ0YWcsICZ0eXBlLCAmY291bnQsICZzdGFydCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgb2ZmID0gYnl0ZXN0cmVhbTJfdGVsbCgmcy0+Z2IpOworICAgIGlmIChjb3VudCA9PSAxKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFRJRkZfQllURToKKyAgICAgICAgY2FzZSBUSUZGX1NIT1JUOgorICAgICAgICBjYXNlIFRJRkZfTE9ORzoKKyAgICAgICAgICAgIHZhbHVlID0gZmZfdGdldCgmcy0+Z2IsIHR5cGUsIHMtPmxlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRJRkZfUkFUSU9OQUw6CisgICAgICAgICAgICB2YWx1ZSAgPSBmZl90Z2V0KCZzLT5nYiwgVElGRl9MT05HLCBzLT5sZSk7CisgICAgICAgICAgICB2YWx1ZTIgPSBmZl90Z2V0KCZzLT5nYiwgVElGRl9MT05HLCBzLT5sZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUSUZGX1NUUklORzoKKyAgICAgICAgICAgIGlmIChjb3VudCA8PSA0KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB2YWx1ZSA9IFVJTlRfTUFYOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoICh0YWcpIHsKKyAgICBjYXNlIFRJRkZfV0lEVEg6CisgICAgICAgIHMtPndpZHRoID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9IRUlHSFQ6CisgICAgICAgIHMtPmhlaWdodCA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfQlBQOgorICAgICAgICBpZiAoY291bnQgPiA0VSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlRoaXMgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgKGJwcD0lZCwgJWQgY29tcG9uZW50cylcbiIsCisgICAgICAgICAgICAgICAgICAgdmFsdWUsIGNvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHMtPmJwcGNvdW50ID0gY291bnQ7CisgICAgICAgIGlmIChjb3VudCA9PSAxKQorICAgICAgICAgICAgcy0+YnBwID0gdmFsdWU7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFRJRkZfQllURToKKyAgICAgICAgICAgIGNhc2UgVElGRl9TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgVElGRl9MT05HOgorICAgICAgICAgICAgICAgIHMtPmJwcCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCB0eXBlX3NpemVzW3R5cGVdICogY291bnQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzLT5icHAgKz0gZmZfdGdldCgmcy0+Z2IsIHR5cGUsIHMtPmxlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcy0+YnBwID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmJwcCA+IDY0VSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlRoaXMgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgKGJwcD0lZCwgJWQgY29tcG9uZW50cylcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+YnBwLCBjb3VudCk7CisgICAgICAgICAgICBzLT5icHAgPSAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUSUZGX1NBTVBMRVNfUEVSX1BJWEVMOgorICAgICAgICBpZiAoY291bnQgIT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlNhbXBsZXMgcGVyIHBpeGVsIHJlcXVpcmVzIGEgc2luZ2xlIHZhbHVlLCBtYW55IHByb3ZpZGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSA+IDRVKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiU2FtcGxlcyBwZXIgcGl4ZWwgJWQgaXMgdG9vIGxhcmdlXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+YnBwY291bnQgPT0gMSkKKyAgICAgICAgICAgIHMtPmJwcCAqPSB2YWx1ZTsKKyAgICAgICAgcy0+YnBwY291bnQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUSUZGX0NPTVBSOgorICAgICAgICBzLT5jb21wciAgICAgPSB2YWx1ZTsKKyAgICAgICAgcy0+cHJlZGljdG9yID0gMDsKKyAgICAgICAgc3dpdGNoIChzLT5jb21wcikgeworICAgICAgICBjYXNlIFRJRkZfUkFXOgorICAgICAgICBjYXNlIFRJRkZfUEFDS0JJVFM6CisgICAgICAgIGNhc2UgVElGRl9MWlc6CisgICAgICAgIGNhc2UgVElGRl9DQ0lUVF9STEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUSUZGX0czOgorICAgICAgICBjYXNlIFRJRkZfRzQ6CisgICAgICAgICAgICBzLT5mYXhfb3B0cyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUSUZGX0RFRkxBVEU6CisgICAgICAgIGNhc2UgVElGRl9BRE9CRV9ERUZMQVRFOgorI2lmIENPTkZJR19aTElCCisgICAgICAgICAgICBicmVhazsKKyNlbHNlCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkRlZmxhdGU6IFpMaWIgbm90IGNvbXBpbGVkIGluXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisjZW5kaWYKKyAgICAgICAgY2FzZSBUSUZGX0pQRUc6CisgICAgICAgIGNhc2UgVElGRl9ORVdKUEVHOgorICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocy0+YXZjdHgsICJKUEVHIGNvbXByZXNzaW9uIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIGNhc2UgVElGRl9MWk1BOgorI2lmIENPTkZJR19MWk1BCisgICAgICAgICAgICBicmVhazsKKyNlbHNlCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkxaTUEgbm90IGNvbXBpbGVkIGluXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgJWlcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+Y29tcHIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUSUZGX1JPV1NQRVJTVFJJUDoKKyAgICAgICAgaWYgKCF2YWx1ZSB8fCAodHlwZSA9PSBUSUZGX0xPTkcgJiYgdmFsdWUgPT0gVUlOVF9NQVgpKQorICAgICAgICAgICAgdmFsdWUgPSBzLT5oZWlnaHQ7CisgICAgICAgIHMtPnJwcyA9IEZGTUlOKHZhbHVlLCBzLT5oZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfU1RSSVBfT0ZGUzoKKyAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKKyAgICAgICAgICAgIHMtPnN0cmlwcG9zID0gMDsKKyAgICAgICAgICAgIHMtPnN0cmlwb2ZmID0gdmFsdWU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcy0+c3RyaXBwb3MgPSBvZmY7CisgICAgICAgIHMtPnN0cmlwcyA9IGNvdW50OworICAgICAgICBpZiAocy0+c3RyaXBzID09IDEpCisgICAgICAgICAgICBzLT5ycHMgPSBzLT5oZWlnaHQ7CisgICAgICAgIHMtPnNvdCA9IHR5cGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9TVFJJUF9TSVpFOgorICAgICAgICBpZiAoY291bnQgPT0gMSkgeworICAgICAgICAgICAgcy0+c3RyaXBzaXplc29mZiA9IDA7CisgICAgICAgICAgICBzLT5zdHJpcHNpemUgICAgID0gdmFsdWU7CisgICAgICAgICAgICBzLT5zdHJpcHMgICAgICAgID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnN0cmlwc2l6ZXNvZmYgPSBvZmY7CisgICAgICAgIH0KKyAgICAgICAgcy0+c3RyaXBzID0gY291bnQ7CisgICAgICAgIHMtPnNzdHlwZSA9IHR5cGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9YUkVTOgorICAgIGNhc2UgVElGRl9ZUkVTOgorICAgICAgICBzZXRfc2FyKHMsIHRhZywgdmFsdWUsIHZhbHVlMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9USUxFX0JZVEVfQ09VTlRTOgorICAgIGNhc2UgVElGRl9USUxFX0xFTkdUSDoKKyAgICBjYXNlIFRJRkZfVElMRV9PRkZTRVRTOgorICAgIGNhc2UgVElGRl9USUxFX1dJRFRIOgorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRpbGVkIGltYWdlcyBhcmUgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUSUZGX1BSRURJQ1RPUjoKKyAgICAgICAgcy0+cHJlZGljdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9QSE9UT01FVFJJQzoKKyAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICBjYXNlIFRJRkZfUEhPVE9NRVRSSUNfV0hJVEVfSVNfWkVSTzoKKyAgICAgICAgY2FzZSBUSUZGX1BIT1RPTUVUUklDX0JMQUNLX0lTX1pFUk86CisgICAgICAgIGNhc2UgVElGRl9QSE9UT01FVFJJQ19SR0I6CisgICAgICAgIGNhc2UgVElGRl9QSE9UT01FVFJJQ19QQUxFVFRFOgorICAgICAgICBjYXNlIFRJRkZfUEhPVE9NRVRSSUNfWUNCQ1I6CisgICAgICAgICAgICBzLT5waG90b21ldHJpYyA9IHZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVElGRl9QSE9UT01FVFJJQ19BTFBIQV9NQVNLOgorICAgICAgICBjYXNlIFRJRkZfUEhPVE9NRVRSSUNfU0VQQVJBVEVEOgorICAgICAgICBjYXNlIFRJRkZfUEhPVE9NRVRSSUNfQ0lFX0xBQjoKKyAgICAgICAgY2FzZSBUSUZGX1BIT1RPTUVUUklDX0lDQ19MQUI6CisgICAgICAgIGNhc2UgVElGRl9QSE9UT01FVFJJQ19JVFVfTEFCOgorICAgICAgICBjYXNlIFRJRkZfUEhPVE9NRVRSSUNfQ0ZBOgorICAgICAgICBjYXNlIFRJRkZfUEhPVE9NRVRSSUNfTE9HX0w6CisgICAgICAgIGNhc2UgVElGRl9QSE9UT01FVFJJQ19MT0dfTFVWOgorICAgICAgICBjYXNlIFRJRkZfUEhPVE9NRVRSSUNfTElORUFSX1JBVzoKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24gMHglMDRYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbiAldSBpcyAiCisgICAgICAgICAgICAgICAgICAgInVua25vd25cbiIsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9GSUxMX09SREVSOgorICAgICAgICBpZiAodmFsdWUgPCAxIHx8IHZhbHVlID4gMikgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlVua25vd24gRmlsbE9yZGVyIHZhbHVlICVkLCB0cnlpbmcgZGVmYXVsdCBvbmVcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgIHZhbHVlID0gMTsKKyAgICAgICAgfQorICAgICAgICBzLT5maWxsX29yZGVyID0gdmFsdWUgLSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfUEFMOiB7CisgICAgICAgIEdldEJ5dGVDb250ZXh0IHBhbF9nYlszXTsKKyAgICAgICAgb2ZmID0gdHlwZV9zaXplc1t0eXBlXTsKKyAgICAgICAgaWYgKGNvdW50IC8gMyA+IDI1NiB8fAorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IGNvdW50IC8gMyAqIG9mZiAqIDMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBwYWxfZ2JbMF0gPSBwYWxfZ2JbMV0gPSBwYWxfZ2JbMl0gPSBzLT5nYjsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcGFsX2diWzFdLCBjb3VudCAvIDMgKiBvZmYpOworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZwYWxfZ2JbMl0sIGNvdW50IC8gMyAqIG9mZiAqIDIpOworCisgICAgICAgIG9mZiA9ICh0eXBlX3NpemVzW3R5cGVdIC0gMSkgPDwgMzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50IC8gMzsgaSsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBwID0gMHhGRjAwMDAwMDsKKyAgICAgICAgICAgIHAgfD0gKGZmX3RnZXQoJnBhbF9nYlswXSwgdHlwZSwgcy0+bGUpID4+IG9mZikgPDwgMTY7CisgICAgICAgICAgICBwIHw9IChmZl90Z2V0KCZwYWxfZ2JbMV0sIHR5cGUsIHMtPmxlKSA+PiBvZmYpIDw8IDg7CisgICAgICAgICAgICBwIHw9ICBmZl90Z2V0KCZwYWxfZ2JbMl0sIHR5cGUsIHMtPmxlKSA+PiBvZmY7CisgICAgICAgICAgICBzLT5wYWxldHRlW2ldID0gcDsKKyAgICAgICAgfQorICAgICAgICBzLT5wYWxldHRlX2lzX3NldCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJRkZfUExBTkFSOgorICAgICAgICBzLT5wbGFuYXIgPSB2YWx1ZSA9PSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfWUNCQ1JfU1VCU0FNUExJTkc6CisgICAgICAgIGlmIChjb3VudCAhPSAyKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInN1YnNhbXBsZSBjb3VudCBpbnZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICAgICAgcy0+c3Vic2FtcGxpbmdbaV0gPSBmZl90Z2V0KCZzLT5nYiwgdHlwZSwgcy0+bGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfVDRPUFRJT05TOgorICAgICAgICBpZiAocy0+Y29tcHIgPT0gVElGRl9HMykKKyAgICAgICAgICAgIHMtPmZheF9vcHRzID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9UNk9QVElPTlM6CisgICAgICAgIGlmIChzLT5jb21wciA9PSBUSUZGX0c0KQorICAgICAgICAgICAgcy0+ZmF4X29wdHMgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisjZGVmaW5lIEFERF9NRVRBREFUQShjb3VudCwgbmFtZSwgc2VwKVwKKyAgICBpZiAoKHJldCA9IGFkZF9tZXRhZGF0YShjb3VudCwgdHlwZSwgbmFtZSwgc2VwLCBzLCBmcmFtZSkpIDwgMCkge1wKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIHRlbXBvcmFyeSBidWZmZXJcbiIpO1wKKyAgICAgICAgZ290byBlbmQ7XAorICAgIH0KKyAgICBjYXNlIFRJRkZfTU9ERUxfUElYRUxfU0NBTEU6CisgICAgICAgIEFERF9NRVRBREFUQShjb3VudCwgIk1vZGVsUGl4ZWxTY2FsZVRhZyIsIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfTU9ERUxfVFJBTlNGT1JNQVRJT046CisgICAgICAgIEFERF9NRVRBREFUQShjb3VudCwgIk1vZGVsVHJhbnNmb3JtYXRpb25UYWciLCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUSUZGX01PREVMX1RJRVBPSU5UOgorICAgICAgICBBRERfTUVUQURBVEEoY291bnQsICJNb2RlbFRpZXBvaW50VGFnIiwgTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9HRU9fS0VZX0RJUkVDVE9SWToKKyAgICAgICAgQUREX01FVEFEQVRBKDEsICJHZW9USUZGX1ZlcnNpb24iLCBOVUxMKTsKKyAgICAgICAgQUREX01FVEFEQVRBKDIsICJHZW9USUZGX0tleV9SZXZpc2lvbiIsICIuIik7CisgICAgICAgIHMtPmdlb3RhZ19jb3VudCAgID0gZmZfdGdldF9zaG9ydCgmcy0+Z2IsIHMtPmxlKTsKKyAgICAgICAgaWYgKHMtPmdlb3RhZ19jb3VudCA+IGNvdW50IC8gNCAtIDEpIHsKKyAgICAgICAgICAgIHMtPmdlb3RhZ19jb3VudCA9IGNvdW50IC8gNCAtIDE7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiR2VvVElGRiBrZXkgZGlyZWN0b3J5IGJ1ZmZlciBzaG9ydGVyIHRoYW4gc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IHMtPmdlb3RhZ19jb3VudCAqIHNpemVvZihpbnQxNl90KSAqIDQpIHsKKyAgICAgICAgICAgIHMtPmdlb3RhZ19jb3VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcy0+Z2VvdGFncyA9IGF2X21hbGxvY3pfYXJyYXkocy0+Z2VvdGFnX2NvdW50LCBzaXplb2YoVGlmZkdlb1RhZykpOworICAgICAgICBpZiAoIXMtPmdlb3RhZ3MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYWxsb2NhdGluZyB0ZW1wb3JhcnkgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgIHMtPmdlb3RhZ19jb3VudCA9IDA7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Z2VvdGFnX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHMtPmdlb3RhZ3NbaV0ua2V5ICAgID0gZmZfdGdldF9zaG9ydCgmcy0+Z2IsIHMtPmxlKTsKKyAgICAgICAgICAgIHMtPmdlb3RhZ3NbaV0udHlwZSAgID0gZmZfdGdldF9zaG9ydCgmcy0+Z2IsIHMtPmxlKTsKKyAgICAgICAgICAgIHMtPmdlb3RhZ3NbaV0uY291bnQgID0gZmZfdGdldF9zaG9ydCgmcy0+Z2IsIHMtPmxlKTsKKworICAgICAgICAgICAgaWYgKCFzLT5nZW90YWdzW2ldLnR5cGUpCisgICAgICAgICAgICAgICAgcy0+Z2VvdGFnc1tpXS52YWwgID0gZ2V0X2dlb2tleV92YWwocy0+Z2VvdGFnc1tpXS5rZXksIGZmX3RnZXRfc2hvcnQoJnMtPmdiLCBzLT5sZSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHMtPmdlb3RhZ3NbaV0ub2Zmc2V0ID0gZmZfdGdldF9zaG9ydCgmcy0+Z2IsIHMtPmxlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfR0VPX0RPVUJMRV9QQVJBTVM6CisgICAgICAgIGlmIChjb3VudCA+PSBJTlRfTUFYIC8gc2l6ZW9mKGludDY0X3QpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpIDwgY291bnQgKiBzaXplb2YoaW50NjRfdCkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZHAgPSBhdl9tYWxsb2NfYXJyYXkoY291bnQsIHNpemVvZihkb3VibGUpKTsKKyAgICAgICAgaWYgKCFkcCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIHRlbXBvcmFyeSBidWZmZXJcbiIpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICBkcFtpXSA9IGZmX3RnZXRfZG91YmxlKCZzLT5nYiwgcy0+bGUpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Z2VvdGFnX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5nZW90YWdzW2ldLnR5cGUgPT0gVElGRl9HRU9fRE9VQkxFX1BBUkFNUykgeworICAgICAgICAgICAgICAgIGlmIChzLT5nZW90YWdzW2ldLmNvdW50ID09IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgcy0+Z2VvdGFnc1tpXS5vZmZzZXQgKyBzLT5nZW90YWdzW2ldLmNvdW50ID4gY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgR2VvVElGRiBrZXkgJWRcbiIsIHMtPmdlb3RhZ3NbaV0ua2V5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjaGFyICphcCA9IGRvdWJsZXMyc3RyKCZkcFtzLT5nZW90YWdzW2ldLm9mZnNldF0sIHMtPmdlb3RhZ3NbaV0uY291bnQsICIsICIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgdGVtcG9yYXJ5IGJ1ZmZlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmZHApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzLT5nZW90YWdzW2ldLnZhbCA9IGFwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmZHApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfR0VPX0FTQ0lJX1BBUkFNUzoKKyAgICAgICAgcG9zID0gYnl0ZXN0cmVhbTJfdGVsbCgmcy0+Z2IpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Z2VvdGFnX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5nZW90YWdzW2ldLnR5cGUgPT0gVElGRl9HRU9fQVNDSUlfUEFSQU1TKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmdlb3RhZ3NbaV0uY291bnQgPT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBzLT5nZW90YWdzW2ldLm9mZnNldCArICBzLT5nZW90YWdzW2ldLmNvdW50ID4gY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgR2VvVElGRiBrZXkgJWRcbiIsIHMtPmdlb3RhZ3NbaV0ua2V5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjaGFyICphcDsKKworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nYiwgcG9zICsgcy0+Z2VvdGFnc1tpXS5vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCBzLT5nZW90YWdzW2ldLmNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIGFwID0gYXZfbWFsbG9jKHMtPmdlb3RhZ3NbaV0uY291bnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgdGVtcG9yYXJ5IGJ1ZmZlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXJ1KCZzLT5nYiwgYXAsIHMtPmdlb3RhZ3NbaV0uY291bnQpOworICAgICAgICAgICAgICAgICAgICBhcFtzLT5nZW90YWdzW2ldLmNvdW50IC0gMV0gPSAnXDAnOyAvL3JlcGxhY2UgdGhlICJ8IiBkZWxpbWl0ZXIgd2l0aCBhIDAgYnl0ZQorICAgICAgICAgICAgICAgICAgICBzLT5nZW90YWdzW2ldLnZhbCA9IGFwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfQVJUSVNUOgorICAgICAgICBBRERfTUVUQURBVEEoY291bnQsICJhcnRpc3QiLCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUSUZGX0NPUFlSSUdIVDoKKyAgICAgICAgQUREX01FVEFEQVRBKGNvdW50LCAiY29weXJpZ2h0IiwgTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9EQVRFOgorICAgICAgICBBRERfTUVUQURBVEEoY291bnQsICJkYXRlIiwgTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9ET0NVTUVOVF9OQU1FOgorICAgICAgICBBRERfTUVUQURBVEEoY291bnQsICJkb2N1bWVudF9uYW1lIiwgTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9IT1NUX0NPTVBVVEVSOgorICAgICAgICBBRERfTUVUQURBVEEoY291bnQsICJjb21wdXRlciIsIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRJRkZfSU1BR0VfREVTQ1JJUFRJT046CisgICAgICAgIEFERF9NRVRBREFUQShjb3VudCwgImRlc2NyaXB0aW9uIiwgTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9NQUtFOgorICAgICAgICBBRERfTUVUQURBVEEoY291bnQsICJtYWtlIiwgTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9NT0RFTDoKKyAgICAgICAgQUREX01FVEFEQVRBKGNvdW50LCAibW9kZWwiLCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUSUZGX1BBR0VfTkFNRToKKyAgICAgICAgQUREX01FVEFEQVRBKGNvdW50LCAicGFnZV9uYW1lIiwgTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9QQUdFX05VTUJFUjoKKyAgICAgICAgQUREX01FVEFEQVRBKGNvdW50LCAicGFnZV9udW1iZXIiLCAiIC8gIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElGRl9TT0ZUV0FSRV9OQU1FOgorICAgICAgICBBRERfTUVUQURBVEEoY291bnQsICJzb2Z0d2FyZSIsIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIHRhZyAlZC8wWCUwWFxuIiwKKyAgICAgICAgICAgICAgICAgICB0YWcsIHRhZyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KK2VuZDoKKyAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nYiwgc3RhcnQsIFNFRUtfU0VUKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBUaWZmQ29udGV4dCAqY29uc3QgcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqY29uc3QgcCA9IGRhdGE7CisgICAgVGhyZWFkRnJhbWUgZnJhbWUgPSB7IC5mID0gZGF0YSB9OworICAgIHVuc2lnbmVkIG9mZjsKKyAgICBpbnQgbGUsIHJldCwgcGxhbmUsIHBsYW5lczsKKyAgICBpbnQgaSwgaiwgZW50cmllcywgc3RyaWRlOworICAgIHVuc2lnbmVkIHNvZmYsIHNzaXplOworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBHZXRCeXRlQ29udGV4dCBzdHJpcHNpemVzOworICAgIEdldEJ5dGVDb250ZXh0IHN0cmlwZGF0YTsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworCisgICAgLy8gcGFyc2UgaW1hZ2UgaGVhZGVyCisgICAgaWYgKChyZXQgPSBmZl90ZGVjb2RlX2hlYWRlcigmcy0+Z2IsICZsZSwgJm9mZikpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBUSUZGIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIGlmIChvZmYgPj0gVUlOVF9NQVggLSAxNCB8fCBhdnBrdC0+c2l6ZSA8IG9mZiArIDE0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSUZEIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gaW1hZ2Ugc2l6ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzLT5sZSAgICAgICAgICA9IGxlOworICAgIC8vIFRJRkZfQlBQIGlzIG5vdCBhIHJlcXVpcmVkIHRhZyBhbmQgZGVmYXVsdHMgdG8gMQorICAgIHMtPmJwcGNvdW50ICAgID0gcy0+YnBwID0gMTsKKyAgICBzLT5waG90b21ldHJpYyA9IFRJRkZfUEhPVE9NRVRSSUNfTk9ORTsKKyAgICBzLT5jb21wciAgICAgICA9IFRJRkZfUkFXOworICAgIHMtPmZpbGxfb3JkZXIgID0gMDsKKyAgICBmcmVlX2dlb3RhZ3Mocyk7CisKKyAgICAvLyBSZXNldCB0aGVzZSBvZmZzZXRzIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgd2VyZSBzZXQgdGhpcyBmcmFtZQorICAgIHMtPnN0cmlwc2l6ZXNvZmYgPSBzLT5zdHJpcHBvcyA9IDA7CisgICAgLyogcGFyc2UgaW1hZ2UgZmlsZSBkaXJlY3RvcnkgKi8KKyAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nYiwgb2ZmLCBTRUVLX1NFVCk7CisgICAgZW50cmllcyA9IGZmX3RnZXRfc2hvcnQoJnMtPmdiLCBsZSk7CisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCBlbnRyaWVzICogMTIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSB0aWZmX2RlY29kZV90YWcocywgcCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaTxzLT5nZW90YWdfY291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyICprZXluYW1lID0gZ2V0X2dlb2tleV9uYW1lKHMtPmdlb3RhZ3NbaV0ua2V5KTsKKyAgICAgICAgaWYgKCFrZXluYW1lKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBHZW9USUZGIGtleSAlZFxuIiwgcy0+Z2VvdGFnc1tpXS5rZXkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldF9nZW9rZXlfdHlwZShzLT5nZW90YWdzW2ldLmtleSkgIT0gcy0+Z2VvdGFnc1tpXS50eXBlKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVHlwZSBvZiBHZW9USUZGIGtleSAlZCBpcyB3cm9uZ1xuIiwgcy0+Z2VvdGFnc1tpXS5rZXkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gYXZfZGljdF9zZXQoYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAocCksIGtleW5hbWUsIHMtPmdlb3RhZ3NbaV0udmFsLCAwKTsKKyAgICAgICAgaWYgKHJldDwwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIldyaXRpbmcgbWV0YWRhdGEgd2l0aCBrZXkgJyVzJyBmYWlsZWRcbiIsIGtleW5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcy0+c3RyaXBwb3MgJiYgIXMtPnN0cmlwb2ZmKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW1hZ2UgZGF0YSBpcyBtaXNzaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIC8qIG5vdyB3ZSBoYXZlIHRoZSBkYXRhIGFuZCBtYXkgc3RhcnQgZGVjb2RpbmcgKi8KKyAgICBpZiAoKHJldCA9IGluaXRfaW1hZ2UocywgJmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHMtPnN0cmlwcyA9PSAxICYmICFzLT5zdHJpcHNpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkltYWdlIGRhdGEgc2l6ZSBtaXNzaW5nXG4iKTsKKyAgICAgICAgcy0+c3RyaXBzaXplID0gYXZwa3QtPnNpemUgLSBzLT5zdHJpcG9mZjsKKyAgICB9CisKKyAgICBpZiAocy0+c3RyaXBzaXplc29mZikgeworICAgICAgICBpZiAocy0+c3RyaXBzaXplc29mZiA+PSAodW5zaWduZWQpYXZwa3QtPnNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmc3RyaXBzaXplcywgYXZwa3QtPmRhdGEgKyBzLT5zdHJpcHNpemVzb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF2cGt0LT5zaXplIC0gcy0+c3RyaXBzaXplc29mZik7CisgICAgfQorICAgIGlmIChzLT5zdHJpcHBvcykgeworICAgICAgICBpZiAocy0+c3RyaXBwb3MgPj0gKHVuc2lnbmVkKWF2cGt0LT5zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJnN0cmlwZGF0YSwgYXZwa3QtPmRhdGEgKyBzLT5zdHJpcHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdnBrdC0+c2l6ZSAtIHMtPnN0cmlwcG9zKTsKKyAgICB9CisKKyAgICBpZiAocy0+cnBzIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJycHMgJWQgaW52YWxpZFxuIiwgcy0+cnBzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcGxhbmVzID0gcy0+cGxhbmFyID8gcy0+YnBwY291bnQgOiAxOworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHBsYW5lczsgcGxhbmUrKykgeworICAgICAgICBzdHJpZGUgPSBwLT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIGRzdCAgICA9IHAtPmRhdGFbcGxhbmVdOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5oZWlnaHQ7IGkgKz0gcy0+cnBzKSB7CisgICAgICAgIGlmIChzLT5zdHJpcHNpemVzb2ZmKQorICAgICAgICAgICAgc3NpemUgPSBmZl90Z2V0KCZzdHJpcHNpemVzLCBzLT5zc3R5cGUsIGxlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3NpemUgPSBzLT5zdHJpcHNpemU7CisKKyAgICAgICAgaWYgKHMtPnN0cmlwcG9zKQorICAgICAgICAgICAgc29mZiA9IGZmX3RnZXQoJnN0cmlwZGF0YSwgcy0+c290LCBsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNvZmYgPSBzLT5zdHJpcG9mZjsKKworICAgICAgICBpZiAoc29mZiA+IGF2cGt0LT5zaXplIHx8IHNzaXplID4gYXZwa3QtPnNpemUgLSBzb2ZmKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc3RyaXAgc2l6ZS9vZmZzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSB0aWZmX3VucGFja19zdHJpcChzLCBwLCBkc3QsIHN0cmlkZSwgYXZwa3QtPmRhdGEgKyBzb2ZmLCBzc2l6ZSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihzLT5ycHMsIHMtPmhlaWdodCAtIGkpKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBzLT5ycHMgKiBzdHJpZGU7CisgICAgfQorICAgIGlmIChzLT5wcmVkaWN0b3IgPT0gMikgeworICAgICAgICBpZiAocy0+cGhvdG9tZXRyaWMgPT0gVElGRl9QSE9UT01FVFJJQ19ZQ0JDUikgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJwcmVkaWN0b3IgPT0gMiB3aXRoIFlVViBpcyB1bnN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgICAgIGRzdCAgID0gcC0+ZGF0YVtwbGFuZV07CisgICAgICAgIHNvZmYgID0gcy0+YnBwID4+IDM7CisgICAgICAgIGlmIChzLT5wbGFuYXIpCisgICAgICAgICAgICBzb2ZmICA9IEZGTUFYKHNvZmYgLyBzLT5icHBjb3VudCwgMSk7CisgICAgICAgIHNzaXplID0gcy0+d2lkdGggKiBzb2ZmOworICAgICAgICBpZiAocy0+YXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0I0OExFIHx8CisgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQkE2NExFIHx8CisgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUlAxNkxFIHx8CisgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUkFQMTZMRSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gc29mZjsgaiA8IHNzaXplOyBqICs9IDIpCisgICAgICAgICAgICAgICAgICAgIEFWX1dMMTYoZHN0ICsgaiwgQVZfUkwxNihkc3QgKyBqKSArIEFWX1JMMTYoZHN0ICsgaiAtIHNvZmYpKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCNDhCRSB8fAorICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCQTY0QkUgfHwKKyAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUlAxNkJFIHx8CisgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HQlJBUDE2QkUpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IHNvZmY7IGogPCBzc2l6ZTsgaiArPSAyKQorICAgICAgICAgICAgICAgICAgICBBVl9XQjE2KGRzdCArIGosIEFWX1JCMTYoZHN0ICsgaikgKyBBVl9SQjE2KGRzdCArIGogLSBzb2ZmKSk7CisgICAgICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IHNvZmY7IGogPCBzc2l6ZTsgaisrKQorICAgICAgICAgICAgICAgICAgICBkc3Rbal0gKz0gZHN0W2ogLSBzb2ZmXTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPnBob3RvbWV0cmljID09IFRJRkZfUEhPVE9NRVRSSUNfV0hJVEVfSVNfWkVSTykgeworICAgICAgICBkc3QgPSBwLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcC0+bGluZXNpemVbcGxhbmVdOyBqKyspCisgICAgICAgICAgICAgICAgZHN0W2pdID0gKHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCA/ICgxPDxzLT5icHApIC0gMSA6IDI1NSkgLSBkc3Rbal07CisgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgfQorICAgIH0KKworICAgIGlmIChzLT5wbGFuYXIgJiYgcy0+YnBwY291bnQgPiAyKSB7CisgICAgICAgIEZGU1dBUCh1aW50OF90KiwgcC0+ZGF0YVswXSwgICAgIHAtPmRhdGFbMl0pOworICAgICAgICBGRlNXQVAoaW50LCAgICAgIHAtPmxpbmVzaXplWzBdLCBwLT5saW5lc2l6ZVsyXSk7CisgICAgICAgIEZGU1dBUCh1aW50OF90KiwgcC0+ZGF0YVswXSwgICAgIHAtPmRhdGFbMV0pOworICAgICAgICBGRlNXQVAoaW50LCAgICAgIHAtPmxpbmVzaXplWzBdLCBwLT5saW5lc2l6ZVsxXSk7CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB0aWZmX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRpZmZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHMtPndpZHRoICA9IDA7CisgICAgcy0+aGVpZ2h0ID0gMDsKKyAgICBzLT5zdWJzYW1wbGluZ1swXSA9CisgICAgcy0+c3Vic2FtcGxpbmdbMV0gPSAxOworICAgIHMtPmF2Y3R4ICA9IGF2Y3R4OworICAgIGZmX2x6d19kZWNvZGVfb3Blbigmcy0+bHp3KTsKKyAgICBmZl9jY2l0dF91bnBhY2tfaW5pdCgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB0aWZmX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVGlmZkNvbnRleHQgKmNvbnN0IHMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZnJlZV9nZW90YWdzKHMpOworCisgICAgZmZfbHp3X2RlY29kZV9jbG9zZSgmcy0+bHp3KTsKKyAgICBhdl9mcmVlcCgmcy0+ZGVpbnZlcnRfYnVmKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl90aWZmX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInRpZmYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUSUZGIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1RJRkYsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFRpZmZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB0aWZmX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gdGlmZl9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5pbml0X3RocmVhZF9jb3B5ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQodGlmZl9pbml0KSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdGlmZi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGlmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNjkyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy90aWZmLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUSUZGIHRhYmxlcworICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBUSUZGIGZvcm1hdCwgY2hlY2sgdGhlIG9mZmljaWFsIGRvY3MgYXQ6CisgKiBodHRwOi8vcGFydG5lcnMuYWRvYmUuY29tL3B1YmxpYy9kZXZlbG9wZXIvdGlmZi9pbmRleC5odG1sCisgKiBAYXV0aG9yIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVElGRl9ICisjZGVmaW5lIEFWQ09ERUNfVElGRl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJ0aWZmX2NvbW1vbi5oIgorCisvKiogYWJyaWRnZWQgbGlzdCBvZiBUSUZGIHRhZ3MgKi8KK2VudW0gVGlmZlRhZ3MgeworICAgIFRJRkZfU1VCRklMRSAgICAgICAgICAgID0gMHhmZSwKKyAgICBUSUZGX1dJRFRIICAgICAgICAgICAgICA9IDB4MTAwLAorICAgIFRJRkZfSEVJR0hULAorICAgIFRJRkZfQlBQLAorICAgIFRJRkZfQ09NUFIsCisgICAgVElGRl9QSE9UT01FVFJJQyAgICAgICAgPSAweDEwNiwKKyAgICBUSUZGX0ZJTExfT1JERVIgICAgICAgICA9IDB4MTBBLAorICAgIFRJRkZfRE9DVU1FTlRfTkFNRSAgICAgID0gMHgxMEQsCisgICAgVElGRl9JTUFHRV9ERVNDUklQVElPTiAgPSAweDEwRSwKKyAgICBUSUZGX01BS0UgICAgICAgICAgICAgICA9IDB4MTBGLAorICAgIFRJRkZfTU9ERUwgICAgICAgICAgICAgID0gMHgxMTAsCisgICAgVElGRl9TVFJJUF9PRkZTICAgICAgICAgPSAweDExMSwKKyAgICBUSUZGX1NBTVBMRVNfUEVSX1BJWEVMICA9IDB4MTE1LAorICAgIFRJRkZfUk9XU1BFUlNUUklQICAgICAgID0gMHgxMTYsCisgICAgVElGRl9TVFJJUF9TSVpFLAorICAgIFRJRkZfWFJFUyAgICAgICAgICAgICAgID0gMHgxMUEsCisgICAgVElGRl9ZUkVTICAgICAgICAgICAgICAgPSAweDExQiwKKyAgICBUSUZGX1BMQU5BUiAgICAgICAgICAgICA9IDB4MTFDLAorICAgIFRJRkZfUEFHRV9OQU1FICAgICAgICAgID0gMHgxMUQsCisgICAgVElGRl9YUE9TICAgICAgICAgICAgICAgPSAweDExRSwKKyAgICBUSUZGX1lQT1MgICAgICAgICAgICAgICA9IDB4MTFGLAorICAgIFRJRkZfVDRPUFRJT05TICAgICAgICAgID0gMHgxMjQsCisgICAgVElGRl9UNk9QVElPTlMsCisgICAgVElGRl9SRVNfVU5JVCAgICAgICAgICAgPSAweDEyOCwKKyAgICBUSUZGX1BBR0VfTlVNQkVSICAgICAgICA9IDB4MTI5LAorICAgIFRJRkZfU09GVFdBUkVfTkFNRSAgICAgID0gMHgxMzEsCisgICAgVElGRl9EQVRFICAgICAgICAgICAgICAgPSAweDEzMiwKKyAgICBUSUZGX0FSVElTVCAgICAgICAgICAgICA9IDB4MTNCLAorICAgIFRJRkZfSE9TVF9DT01QVVRFUiAgICAgID0gMHgxM0MsCisgICAgVElGRl9QUkVESUNUT1IgICAgICAgICAgPSAweDEzRCwKKyAgICBUSUZGX1BBTCAgICAgICAgICAgICAgICA9IDB4MTQwLAorICAgIFRJRkZfVElMRV9XSURUSCAgICAgICAgID0gMHgxNDIsCisgICAgVElGRl9USUxFX0xFTkdUSCAgICAgICAgPSAweDE0MywKKyAgICBUSUZGX1RJTEVfT0ZGU0VUUyAgICAgICA9IDB4MTQ0LAorICAgIFRJRkZfVElMRV9CWVRFX0NPVU5UUyAgID0gMHgxNDUsCisgICAgVElGRl9FWFRSQVNBTVBMRVMgICAgICAgPSAweDE1MiwKKyAgICBUSUZGX1lDQkNSX0NPRUZGSUNJRU5UUyA9IDB4MjExLAorICAgIFRJRkZfWUNCQ1JfU1VCU0FNUExJTkcgID0gMHgyMTIsCisgICAgVElGRl9ZQ0JDUl9QT1NJVElPTklORyAgPSAweDIxMywKKyAgICBUSUZGX1JFRkVSRU5DRV9CVyAgICAgICA9IDB4MjE0LAorICAgIFRJRkZfQ09QWVJJR0hUICAgICAgICAgID0gMHg4Mjk4LAorICAgIFRJRkZfTU9ERUxfVElFUE9JTlQgICAgID0gMHg4NDgyLAorICAgIFRJRkZfTU9ERUxfUElYRUxfU0NBTEUgID0gMHg4MzBFLAorICAgIFRJRkZfTU9ERUxfVFJBTlNGT1JNQVRJT049IDB4ODQ4MCwKKyAgICBUSUZGX0dFT19LRVlfRElSRUNUT1JZICA9IDB4ODdBRiwKKyAgICBUSUZGX0dFT19ET1VCTEVfUEFSQU1TICA9IDB4ODdCMCwKKyAgICBUSUZGX0dFT19BU0NJSV9QQVJBTVMgICA9IDB4ODdCMQorfTsKKworLyoqIGxpc3Qgb2YgVElGRiBjb21wcmVzc2lvbiB0eXBlcyAqLworZW51bSBUaWZmQ29tcHIgeworICAgIFRJRkZfUkFXID0gMSwKKyAgICBUSUZGX0NDSVRUX1JMRSwKKyAgICBUSUZGX0czLAorICAgIFRJRkZfRzQsCisgICAgVElGRl9MWlcsCisgICAgVElGRl9KUEVHLAorICAgIFRJRkZfTkVXSlBFRywKKyAgICBUSUZGX0FET0JFX0RFRkxBVEUsCisgICAgVElGRl9QQUNLQklUUyA9IDB4ODAwNSwKKyAgICBUSUZGX0RFRkxBVEUgID0gMHg4MEIyLAorICAgIFRJRkZfTFpNQSAgICAgPSAweDg4NkQsCit9OworCitlbnVtIFRpZmZHZW9UYWdLZXkgeworICAgIFRJRkZfR1RfTU9ERUxfVFlQRV9HRU9LRVkgICAgICAgICAgICAgICAgPSAxMDI0LAorICAgIFRJRkZfR1RfUkFTVEVSX1RZUEVfR0VPS0VZICAgICAgICAgICAgICAgPSAxMDI1LAorICAgIFRJRkZfR1RfQ0lUQVRJT05fR0VPS0VZICAgICAgICAgICAgICAgICAgPSAxMDI2LAorICAgIFRJRkZfR0VPR1JBUEhJQ19UWVBFX0dFT0tFWSAgICAgICAgICAgICAgPSAyMDQ4LAorICAgIFRJRkZfR0VPR19DSVRBVElPTl9HRU9LRVkgICAgICAgICAgICAgICAgPSAyMDQ5LAorICAgIFRJRkZfR0VPR19HRU9ERVRJQ19EQVRVTV9HRU9LRVkgICAgICAgICAgPSAyMDUwLAorICAgIFRJRkZfR0VPR19QUklNRV9NRVJJRElBTl9HRU9LRVkgICAgICAgICAgPSAyMDUxLAorICAgIFRJRkZfR0VPR19MSU5FQVJfVU5JVFNfR0VPS0VZICAgICAgICAgICAgPSAyMDUyLAorICAgIFRJRkZfR0VPR19MSU5FQVJfVU5JVF9TSVpFX0dFT0tFWSAgICAgICAgPSAyMDUzLAorICAgIFRJRkZfR0VPR19BTkdVTEFSX1VOSVRTX0dFT0tFWSAgICAgICAgICAgPSAyMDU0LAorICAgIFRJRkZfR0VPR19BTkdVTEFSX1VOSVRfU0laRV9HRU9LRVkgICAgICAgPSAyMDU1LAorICAgIFRJRkZfR0VPR19FTExJUFNPSURfR0VPS0VZICAgICAgICAgICAgICAgPSAyMDU2LAorICAgIFRJRkZfR0VPR19TRU1JX01BSk9SX0FYSVNfR0VPS0VZICAgICAgICAgPSAyMDU3LAorICAgIFRJRkZfR0VPR19TRU1JX01JTk9SX0FYSVNfR0VPS0VZICAgICAgICAgPSAyMDU4LAorICAgIFRJRkZfR0VPR19JTlZfRkxBVFRFTklOR19HRU9LRVkgICAgICAgICAgPSAyMDU5LAorICAgIFRJRkZfR0VPR19BWklNVVRIX1VOSVRTX0dFT0tFWSAgICAgICAgICAgPSAyMDYwLAorICAgIFRJRkZfR0VPR19QUklNRV9NRVJJRElBTl9MT05HX0dFT0tFWSAgICAgPSAyMDYxLAorICAgIFRJRkZfUFJPSkVDVEVEX0NTX1RZUEVfR0VPS0VZICAgICAgICAgICAgPSAzMDcyLAorICAgIFRJRkZfUENTX0NJVEFUSU9OX0dFT0tFWSAgICAgICAgICAgICAgICAgPSAzMDczLAorICAgIFRJRkZfUFJPSkVDVElPTl9HRU9LRVkgICAgICAgICAgICAgICAgICAgPSAzMDc0LAorICAgIFRJRkZfUFJPSl9DT09SRF9UUkFOU19HRU9LRVkgICAgICAgICAgICAgPSAzMDc1LAorICAgIFRJRkZfUFJPSl9MSU5FQVJfVU5JVFNfR0VPS0VZICAgICAgICAgICAgPSAzMDc2LAorICAgIFRJRkZfUFJPSl9MSU5FQVJfVU5JVF9TSVpFX0dFT0tFWSAgICAgICAgPSAzMDc3LAorICAgIFRJRkZfUFJPSl9TVERfUEFSQUxMRUwxX0dFT0tFWSAgICAgICAgICAgPSAzMDc4LAorICAgIFRJRkZfUFJPSl9TVERfUEFSQUxMRUwyX0dFT0tFWSAgICAgICAgICAgPSAzMDc5LAorICAgIFRJRkZfUFJPSl9OQVRfT1JJR0lOX0xPTkdfR0VPS0VZICAgICAgICAgPSAzMDgwLAorICAgIFRJRkZfUFJPSl9OQVRfT1JJR0lOX0xBVF9HRU9LRVkgICAgICAgICAgPSAzMDgxLAorICAgIFRJRkZfUFJPSl9GQUxTRV9FQVNUSU5HX0dFT0tFWSAgICAgICAgICAgPSAzMDgyLAorICAgIFRJRkZfUFJPSl9GQUxTRV9OT1JUSElOR19HRU9LRVkgICAgICAgICAgPSAzMDgzLAorICAgIFRJRkZfUFJPSl9GQUxTRV9PUklHSU5fTE9OR19HRU9LRVkgICAgICAgPSAzMDg0LAorICAgIFRJRkZfUFJPSl9GQUxTRV9PUklHSU5fTEFUX0dFT0tFWSAgICAgICAgPSAzMDg1LAorICAgIFRJRkZfUFJPSl9GQUxTRV9PUklHSU5fRUFTVElOR19HRU9LRVkgICAgPSAzMDg2LAorICAgIFRJRkZfUFJPSl9GQUxTRV9PUklHSU5fTk9SVEhJTkdfR0VPS0VZICAgPSAzMDg3LAorICAgIFRJRkZfUFJPSl9DRU5URVJfTE9OR19HRU9LRVkgICAgICAgICAgICAgPSAzMDg4LAorICAgIFRJRkZfUFJPSl9DRU5URVJfTEFUX0dFT0tFWSAgICAgICAgICAgICAgPSAzMDg5LAorICAgIFRJRkZfUFJPSl9DRU5URVJfRUFTVElOR19HRU9LRVkgICAgICAgICAgPSAzMDkwLAorICAgIFRJRkZfUFJPSl9DRU5URVJfTk9SVEhJTkdfR0VPS0VZICAgICAgICAgPSAzMDkxLAorICAgIFRJRkZfUFJPSl9TQ0FMRV9BVF9OQVRfT1JJR0lOX0dFT0tFWSAgICAgPSAzMDkyLAorICAgIFRJRkZfUFJPSl9TQ0FMRV9BVF9DRU5URVJfR0VPS0VZICAgICAgICAgPSAzMDkzLAorICAgIFRJRkZfUFJPSl9BWklNVVRIX0FOR0xFX0dFT0tFWSAgICAgICAgICAgPSAzMDk0LAorICAgIFRJRkZfUFJPSl9TVFJBSUdIVF9WRVJUX1BPTEVfTE9OR19HRU9LRVkgPSAzMDk1LAorICAgIFRJRkZfVkVSVElDQUxfQ1NfVFlQRV9HRU9LRVkgICAgICAgICAgICAgPSA0MDk2LAorICAgIFRJRkZfVkVSVElDQUxfQ0lUQVRJT05fR0VPS0VZICAgICAgICAgICAgPSA0MDk3LAorICAgIFRJRkZfVkVSVElDQUxfREFUVU1fR0VPS0VZICAgICAgICAgICAgICAgPSA0MDk4LAorICAgIFRJRkZfVkVSVElDQUxfVU5JVFNfR0VPS0VZICAgICAgICAgICAgICAgPSA0MDk5Cit9OworCitlbnVtIFRpZmZQaG90b21ldHJpYyB7CisgICAgVElGRl9QSE9UT01FVFJJQ19OT05FICAgICAgID0gLTEsCisgICAgVElGRl9QSE9UT01FVFJJQ19XSElURV9JU19aRVJPLCAgICAgIC8qIG1vbm8gb3IgZ3JheXNjYWxlLCAwIGlzIHdoaXRlICovCisgICAgVElGRl9QSE9UT01FVFJJQ19CTEFDS19JU19aRVJPLCAgICAgIC8qIG1vbm8gb3IgZ3JheXNjYWxlLCAwIGlzIGJsYWNrICovCisgICAgVElGRl9QSE9UT01FVFJJQ19SR0IsICAgICAgICAgICAgICAgIC8qIFJHQiBvciBSR0JBKi8KKyAgICBUSUZGX1BIT1RPTUVUUklDX1BBTEVUVEUsICAgICAgICAgICAgLyogVXNlcyBhIHBhbGV0dGUgKi8KKyAgICBUSUZGX1BIT1RPTUVUUklDX0FMUEhBX01BU0ssICAgICAgICAgLyogVHJhbnNwYXJlbmN5IG1hc2sgKi8KKyAgICBUSUZGX1BIT1RPTUVUUklDX1NFUEFSQVRFRCwgICAgICAgICAgLyogQ01ZSyBvciBzb21lIG90aGVyIGluayBzZXQgKi8KKyAgICBUSUZGX1BIT1RPTUVUUklDX1lDQkNSLCAgICAgICAgICAgICAgLyogWUNiQ3IgKi8KKyAgICBUSUZGX1BIT1RPTUVUUklDX0NJRV9MQUIgICAgPSA4LCAgICAgLyogMTk3NiBDSUUgTCphKmIqICovCisgICAgVElGRl9QSE9UT01FVFJJQ19JQ0NfTEFCLCAgICAgICAgICAgIC8qIElDQyBMKmEqYiogKi8KKyAgICBUSUZGX1BIT1RPTUVUUklDX0lUVV9MQUIsICAgICAgICAgICAgLyogSVRVIEwqYSpiKiAqLworICAgIFRJRkZfUEhPVE9NRVRSSUNfQ0ZBICAgICAgICA9IDMyODAzLCAvKiBDb2xvciBGaWx0ZXIgQXJyYXkgKERORykgKi8KKyAgICBUSUZGX1BIT1RPTUVUUklDX0xPR19MICAgICAgPSAzMjg0NCwgLyogQ0lFIExvZzIoTCkgKi8KKyAgICBUSUZGX1BIT1RPTUVUUklDX0xPR19MVVYsICAgICAgICAgICAgLyogQ0lFIExvZyBMKnUqdiogKi8KKyAgICBUSUZGX1BIT1RPTUVUUklDX0xJTkVBUl9SQVcgPSAzNDg5MiwgLyogTGluZWFyIFJhdyAoRE5HKSAqLworfTsKKworZW51bSBUaWZmR2VvVGFnVHlwZSB7CisgICAgR0VPVElGRl9TSE9SVCAgPSAwLAorICAgIEdFT1RJRkZfRE9VQkxFID0gMzQ3MzYsCisgICAgR0VPVElGRl9TVFJJTkcgPSAzNDczNworfTsKKwordHlwZWRlZiBzdHJ1Y3QgVGlmZkdlb1RhZyB7CisgICAgZW51bSBUaWZmR2VvVGFnS2V5IGtleTsKKyAgICBlbnVtIFRpZmZUYWdzIHR5cGU7CisgICAgaW50IGNvdW50OworICAgIGludCBvZmZzZXQ7CisgICAgY2hhciAqdmFsOworfSBUaWZmR2VvVGFnOworCit0eXBlZGVmIHN0cnVjdCBUaWZmR2VvVGFnS2V5TmFtZSB7CisgICAgY29uc3QgZW51bSBUaWZmR2VvVGFnS2V5IGtleTsKKyAgICBjb25zdCBjaGFyICpjb25zdCBuYW1lOworfSBUaWZmR2VvVGFnS2V5TmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgVGlmZkdlb1RhZ05hbWVUeXBlIHsKKyAgICBjb25zdCBjaGFyICpjb25zdCBuYW1lOworICAgIGNvbnN0IGVudW0gVGlmZkdlb1RhZ1R5cGUgdHlwZTsKK30gVGlmZkdlb1RhZ05hbWVUeXBlOworCisjZW5kaWYgLyogQVZDT0RFQ19USUZGX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3RpZmZfY29tbW9uLmMgYi9mZm1wZWcvbGliYXZjb2RlYy90aWZmX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTE5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy90aWZmX2NvbW1vbi5jCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogVElGRiBDb21tb24gUm91dGluZXMKKyAqIENvcHlyaWdodCAoYykgMjAxMyBUaGlsbyBCb3JnbWFubiA8dGhpbG8uYm9yZ21hbm4gX2F0XyBtYWlsLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUSUZGIENvbW1vbiBSb3V0aW5lcworICogQGF1dGhvciBUaGlsbyBCb3JnbWFubiA8dGhpbG8uYm9yZ21hbm4gX2F0XyBtYWlsLmRlPgorICovCisKKyNpbmNsdWRlICJ0aWZmX2NvbW1vbi5oIgorCisKK2ludCBmZl90aXNfaWZkKHVuc2lnbmVkIHRhZykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoaWZkX3RhZ3MpOyBpKyspIHsKKyAgICAgICAgaWYgKGlmZF90YWdzW2ldID09IHRhZykgeworICAgICAgICAgICAgcmV0dXJuIGkgKyAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK3Vuc2lnbmVkIGZmX3RnZXRfc2hvcnQoR2V0Qnl0ZUNvbnRleHQgKmdiLCBpbnQgbGUpCit7CisgICAgcmV0dXJuIGxlID8gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpIDogYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoZ2IpOworfQorCisKK3Vuc2lnbmVkIGZmX3RnZXRfbG9uZyhHZXRCeXRlQ29udGV4dCAqZ2IsIGludCBsZSkKK3sKKyAgICByZXR1cm4gbGUgPyBieXRlc3RyZWFtMl9nZXRfbGUzMihnYikgOiBieXRlc3RyZWFtMl9nZXRfYmUzMihnYik7Cit9CisKKworZG91YmxlIGZmX3RnZXRfZG91YmxlKEdldEJ5dGVDb250ZXh0ICpnYiwgaW50IGxlKQoreworICAgIGF2X2FsaWFzNjQgaSA9IHsgLnU2NCA9IGxlID8gYnl0ZXN0cmVhbTJfZ2V0X2xlNjQoZ2IpIDogYnl0ZXN0cmVhbTJfZ2V0X2JlNjQoZ2IpfTsKKyAgICByZXR1cm4gaS5mNjQ7Cit9CisKKwordW5zaWduZWQgZmZfdGdldChHZXRCeXRlQ29udGV4dCAqZ2IsIGludCB0eXBlLCBpbnQgbGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUSUZGX0JZVEU6ICByZXR1cm4gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgIGNhc2UgVElGRl9TSE9SVDogcmV0dXJuIGZmX3RnZXRfc2hvcnQoZ2IsIGxlKTsKKyAgICBjYXNlIFRJRkZfTE9ORzogIHJldHVybiBmZl90Z2V0X2xvbmcoZ2IsIGxlKTsKKyAgICBkZWZhdWx0OiAgICAgICAgIHJldHVybiBVSU5UX01BWDsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICphdXRvX3NlcChpbnQgY291bnQsIGNvbnN0IGNoYXIgKnNlcCwgaW50IGksIGludCBjb2x1bW5zKQoreworICAgIGlmIChzZXApCisgICAgICAgIHJldHVybiBpID8gc2VwIDogIiI7CisgICAgaWYgKGkgJiYgaSVjb2x1bW5zKSB7CisgICAgICAgIHJldHVybiAiLCAiOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gY29sdW1ucyA8IGNvdW50ID8gIlxuIiA6ICIiOworfQorCitpbnQgZmZfdGFkZF9yYXRpb25hbF9tZXRhZGF0YShpbnQgY291bnQsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJ5dGVDb250ZXh0ICpnYiwgaW50IGxlLCBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSkKK3sKKyAgICBBVkJQcmludCBicDsKKyAgICBjaGFyICphcDsKKyAgICBpbnQzMl90IG5vbSwgZGVub207CisgICAgaW50IGk7CisKKyAgICBpZiAoY291bnQgPj0gSU5UX01BWCAvIHNpemVvZihpbnQ2NF90KSB8fCBjb3VudCA8PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIDwgY291bnQgKiBzaXplb2YoaW50NjRfdCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYXZfYnByaW50X2luaXQoJmJwLCAxMCAqIGNvdW50LCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgbm9tICAgPSBmZl90Z2V0X2xvbmcoZ2IsIGxlKTsKKyAgICAgICAgZGVub20gPSBmZl90Z2V0X2xvbmcoZ2IsIGxlKTsKKyAgICAgICAgYXZfYnByaW50ZigmYnAsICIlcyU3aTolLTdpIiwgYXV0b19zZXAoY291bnQsIHNlcCwgaSwgNCksIG5vbSwgZGVub20pOworICAgIH0KKworICAgIGlmICgoaSA9IGF2X2JwcmludF9maW5hbGl6ZSgmYnAsICZhcCkpKSB7CisgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICBpZiAoIWFwKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsIG5hbWUsIGFwLCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgZmZfdGFkZF9sb25nX21ldGFkYXRhKGludCBjb3VudCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCeXRlQ29udGV4dCAqZ2IsIGludCBsZSwgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEpCit7CisgICAgQVZCUHJpbnQgYnA7CisgICAgY2hhciAqYXA7CisgICAgaW50IGk7CisKKyAgICBpZiAoY291bnQgPj0gSU5UX01BWCAvIHNpemVvZihpbnQzMl90KSB8fCBjb3VudCA8PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIDwgY291bnQgKiBzaXplb2YoaW50MzJfdCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYXZfYnByaW50X2luaXQoJmJwLCAxMCAqIGNvdW50LCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgYXZfYnByaW50ZigmYnAsICIlcyU3aSIsIGF1dG9fc2VwKGNvdW50LCBzZXAsIGksIDgpLCBmZl90Z2V0X2xvbmcoZ2IsIGxlKSk7CisgICAgfQorCisgICAgaWYgKChpID0gYXZfYnByaW50X2ZpbmFsaXplKCZicCwgJmFwKSkpIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIGlmICghYXApIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBhdl9kaWN0X3NldChtZXRhZGF0YSwgbmFtZSwgYXAsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKKworICAgIHJldHVybiAwOworfQorCisKK2ludCBmZl90YWRkX2RvdWJsZXNfbWV0YWRhdGEoaW50IGNvdW50LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJ5dGVDb250ZXh0ICpnYiwgaW50IGxlLCBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSkKK3sKKyAgICBBVkJQcmludCBicDsKKyAgICBjaGFyICphcDsKKyAgICBpbnQgaTsKKworICAgIGlmIChjb3VudCA+PSBJTlRfTUFYIC8gc2l6ZW9mKGludDY0X3QpIHx8IGNvdW50IDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCBjb3VudCAqIHNpemVvZihpbnQ2NF90KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYnAsIDEwICogY291bnQsIDEwMCAqIGNvdW50KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGF2X2JwcmludGYoJmJwLCAiJXMlLjE1ZyIsIGF1dG9fc2VwKGNvdW50LCBzZXAsIGksIDQpLCBmZl90Z2V0X2RvdWJsZShnYiwgbGUpKTsKKyAgICB9CisKKyAgICBpZiAoKGkgPSBhdl9icHJpbnRfZmluYWxpemUoJmJwLCAmYXApKSkgeworICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgaWYgKCFhcCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF2X2RpY3Rfc2V0KG1ldGFkYXRhLCBuYW1lLCBhcCwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IGZmX3RhZGRfc2hvcnRzX21ldGFkYXRhKGludCBjb3VudCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJ5dGVDb250ZXh0ICpnYiwgaW50IGxlLCBpbnQgaXNfc2lnbmVkLCBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSkKK3sKKyAgICBBVkJQcmludCBicDsKKyAgICBjaGFyICphcDsKKyAgICBpbnQgaTsKKworICAgIGlmIChjb3VudCA+PSBJTlRfTUFYIC8gc2l6ZW9mKGludDE2X3QpIHx8IGNvdW50IDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCBjb3VudCAqIHNpemVvZihpbnQxNl90KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYnAsIDEwICogY291bnQsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBpbnQgdiA9IGlzX3NpZ25lZCA/IChpbnQxNl90KWZmX3RnZXRfc2hvcnQoZ2IsIGxlKSA6ICBmZl90Z2V0X3Nob3J0KGdiLCBsZSk7CisgICAgICAgIGF2X2JwcmludGYoJmJwLCAiJXMlNWkiLCBhdXRvX3NlcChjb3VudCwgc2VwLCBpLCA4KSwgdik7CisgICAgfQorCisgICAgaWYgKChpID0gYXZfYnByaW50X2ZpbmFsaXplKCZicCwgJmFwKSkpIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIGlmICghYXApIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBhdl9kaWN0X3NldChtZXRhZGF0YSwgbmFtZSwgYXAsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKKworICAgIHJldHVybiAwOworfQorCisKK2ludCBmZl90YWRkX2J5dGVzX21ldGFkYXRhKGludCBjb3VudCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgKmdiLCBpbnQgbGUsIGludCBpc19zaWduZWQsIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhKQoreworICAgIEFWQlByaW50IGJwOworICAgIGNoYXIgKmFwOworICAgIGludCBpOworCisgICAgaWYgKGNvdW50ID49IElOVF9NQVggLyBzaXplb2YoaW50OF90KSB8fCBjb3VudCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCBjb3VudCAqIHNpemVvZihpbnQ4X3QpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2X2JwcmludF9pbml0KCZicCwgMTAgKiBjb3VudCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGludCB2ID0gaXNfc2lnbmVkID8gKGludDhfdClieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikgOiAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICBhdl9icHJpbnRmKCZicCwgIiVzJTNpIiwgYXV0b19zZXAoY291bnQsIHNlcCwgaSwgMTYpLCB2KTsKKyAgICB9CisKKyAgICBpZiAoKGkgPSBhdl9icHJpbnRfZmluYWxpemUoJmJwLCAmYXApKSkgeworICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgaWYgKCFhcCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF2X2RpY3Rfc2V0KG1ldGFkYXRhLCBuYW1lLCBhcCwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl90YWRkX3N0cmluZ19tZXRhZGF0YShpbnQgY291bnQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgKmdiLCBpbnQgbGUsIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhKQoreworICAgIGNoYXIgKnZhbHVlOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8IGNvdW50IHx8IGNvdW50IDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB2YWx1ZSA9IGF2X21hbGxvYyhjb3VudCArIDEpOworICAgIGlmICghdmFsdWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVydShnYiwgdmFsdWUsIGNvdW50KTsKKyAgICB2YWx1ZVtjb3VudF0gPSAwOworCisgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsIG5hbWUsIHZhbHVlLCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IGZmX3RkZWNvZGVfaGVhZGVyKEdldEJ5dGVDb250ZXh0ICpnYiwgaW50ICpsZSwgaW50ICppZmRfb2Zmc2V0KQoreworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCA4KSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgICpsZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2dShnYik7CisgICAgaWYgKCpsZSA9PSBBVl9SQjE2KCJJSSIpKSB7CisgICAgICAgICpsZSA9IDE7CisgICAgfSBlbHNlIGlmICgqbGUgPT0gQVZfUkIxNigiTU0iKSkgeworICAgICAgICAqbGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChmZl90Z2V0X3Nob3J0KGdiLCAqbGUpICE9IDQyKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgICppZmRfb2Zmc2V0ID0gZmZfdGdldF9sb25nKGdiLCAqbGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IGZmX3RyZWFkX3RhZyhHZXRCeXRlQ29udGV4dCAqZ2IsIGludCBsZSwgdW5zaWduZWQgKnRhZywgdW5zaWduZWQgKnR5cGUsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpjb3VudCwgaW50ICpuZXh0KQoreworICAgIGludCBpZmRfdGFnOworICAgIGludCB2YWxpZF90eXBlOworCisgICAgKnRhZyAgICA9IGZmX3RnZXRfc2hvcnQoZ2IsIGxlKTsKKyAgICAqdHlwZSAgID0gZmZfdGdldF9zaG9ydChnYiwgbGUpOworICAgICpjb3VudCAgPSBmZl90Z2V0X2xvbmcgKGdiLCBsZSk7CisKKyAgICBpZmRfdGFnICAgID0gZmZfdGlzX2lmZCgqdGFnKTsKKyAgICB2YWxpZF90eXBlID0gKnR5cGUgIT0gMCAmJiAqdHlwZSA8IEZGX0FSUkFZX0VMRU1TKHR5cGVfc2l6ZXMpOworCisgICAgKm5leHQgPSBieXRlc3RyZWFtMl90ZWxsKGdiKSArIDQ7CisKKyAgICAvLyBjaGVjayBmb3IgdmFsaWQgdHlwZQorICAgIGlmICghdmFsaWRfdHlwZSkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvLyBzZWVrIHRvIG9mZnNldCBpZiB0aGlzIGlzIGFuIElGRC10YWcgb3IKKyAgICAvLyBpZiBjb3VudCB2YWx1ZXMgZG8gbm90IGZpdCBpbnRvIHRoZSBvZmZzZXQgdmFsdWUKKyAgICBpZiAoaWZkX3RhZyB8fCAoKmNvdW50ID4gNCB8fCAhKHR5cGVfc2l6ZXNbKnR5cGVdICogKCpjb3VudCkgPD0gNCB8fCAqdHlwZSA9PSBUSUZGX1NUUklORykpKSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoZ2IsIGZmX3RnZXRfbG9uZyAoZ2IsIGxlKSwgU0VFS19TRVQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdGlmZl9jb21tb24uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3RpZmZfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1NThjMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RpZmZfY29tbW9uLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBUSUZGIENvbW1vbiBSb3V0aW5lcworICogQ29weXJpZ2h0IChjKSAyMDEzIFRoaWxvIEJvcmdtYW5uIDx0aGlsby5ib3JnbWFubiBfYXRfIG1haWwuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFRJRkYgQ29tbW9uIFJvdXRpbmVzCisgKiBAYXV0aG9yIFRoaWxvIEJvcmdtYW5uIDx0aGlsby5ib3JnbWFubiBfYXRfIG1haWwuZGU+CisgKi8KKworI2lmbmRlZiBBVkNPREVDX1RJRkZfQ09NTU9OX0gKKyNkZWZpbmUgQVZDT0RFQ19USUZGX0NPTU1PTl9ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAidGlmZi5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCisKKy8qKiBkYXRhIHR5cGUgaWRlbnRpZmllcnMgZm9yIFRJRkYgdGFncyAqLworZW51bSBUaWZmVHlwZXMgeworICAgIFRJRkZfQllURSA9IDEsCisgICAgVElGRl9TVFJJTkcsCisgICAgVElGRl9TSE9SVCwKKyAgICBUSUZGX0xPTkcsCisgICAgVElGRl9SQVRJT05BTCwKKyAgICBUSUZGX1NCWVRFLAorICAgIFRJRkZfVU5ERUZJTkVELAorICAgIFRJRkZfU1NIT1JULAorICAgIFRJRkZfU0xPTkcsCisgICAgVElGRl9TUkFUSU9OQUwsCisgICAgVElGRl9GTE9BVCwKKyAgICBUSUZGX0RPVUJMRSwKKyAgICBUSUZGX0lGRAorfTsKKworLyoqIHNpemVzIG9mIHZhcmlvdXMgVElGRiBmaWVsZCB0eXBlcyAoc3RyaW5nIHNpemUgPSAxMDApKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHR5cGVfc2l6ZXNbMTRdID0geworICAgIDAsIDEsIDEwMCwgMiwgNCwgOCwgMSwgMSwgMiwgNCwgOCwgNCwgOCwgNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGlmZF90YWdzW10gPSB7CisgICAgMHg4NzY5LCAvLyBFWElGIElGRAorICAgIDB4ODgyNSwgLy8gR1BTIElGRAorICAgIDB4QTAwNSAgLy8gSW50ZXJvcGVyYWJpbGl0eSBJRkQKK307CisKKworLyoqIFJldHVybnMgYSB2YWx1ZSA+IDAgaWYgdGhlIHRhZyBpcyBhIGtub3duIElGRC10YWcuCisgKiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYXJyYXkgaW5kZXggKyAxIHdpdGhpbiBpZmRfdGFnc1tdLgorICovCitpbnQgZmZfdGlzX2lmZCh1bnNpZ25lZCB0YWcpOworCisvKiogUmVhZHMgYSBzaG9ydCBmcm9tIHRoZSBieXRlc3RyZWFtIHVzaW5nIGdpdmVuIGVuZGlhbm5lc3MuICovCit1bnNpZ25lZCBmZl90Z2V0X3Nob3J0KEdldEJ5dGVDb250ZXh0ICpnYiwgaW50IGxlKTsKKworLyoqIFJlYWRzIGEgbG9uZyBmcm9tIHRoZSBieXRlc3RyZWFtIHVzaW5nIGdpdmVuIGVuZGlhbm5lc3MuICovCit1bnNpZ25lZCBmZl90Z2V0X2xvbmcoR2V0Qnl0ZUNvbnRleHQgKmdiLCBpbnQgbGUpOworCisvKiogUmVhZHMgYSBkb3VibGUgZnJvbSB0aGUgYnl0ZXN0cmVhbSB1c2luZyBnaXZlbiBlbmRpYW5uZXNzLiAqLworZG91YmxlICAgZmZfdGdldF9kb3VibGUoR2V0Qnl0ZUNvbnRleHQgKmdiLCBpbnQgbGUpOworCisvKiogUmVhZHMgYSBieXRlIGZyb20gdGhlIGJ5dGVzdHJlYW0gdXNpbmcgZ2l2ZW4gZW5kaWFubmVzcy4gKi8KK3Vuc2lnbmVkIGZmX3RnZXQoR2V0Qnl0ZUNvbnRleHQgKmdiLCBpbnQgdHlwZSwgaW50IGxlKTsKKworLyoqIFJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW5nIGNvdW50CisgKiAgcmF0aW9uYWwgdmFsdWVzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IuCisgKi8KK2NoYXIgKmZmX3RyYXRpb25hbHMyc3RyKGludCAqcnAsIGludCBjb3VudCwgY29uc3QgY2hhciAqc2VwKTsKKworLyoqIFJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW5nIGNvdW50CisgKiAgbG9uZyB2YWx1ZXMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci4KKyAqLworY2hhciAqZmZfdGxvbmdzMnN0cihpbnQzMl90ICpscCwgaW50IGNvdW50LCBjb25zdCBjaGFyICpzZXApOworCisvKiogUmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgY291bnQKKyAqICBkb3VibGUgdmFsdWVzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IuCisgKi8KK2NoYXIgKmZmX3Rkb3VibGVzMnN0cihkb3VibGUgKmRwLCBpbnQgY291bnQsIGNvbnN0IGNoYXIgKnNlcCk7CisKKy8qKiBSZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgY29udGFpbmluZyBjb3VudAorICogIHNob3J0IHZhbHVlcyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLgorICovCitjaGFyICpmZl90c2hvcnRzMnN0cihpbnQxNl90ICpzcCwgaW50IGNvdW50LCBjb25zdCBjaGFyICpzZXApOworCisvKiogQWRkcyBjb3VudCByYXRpb25hbHMgY29udmVydGVkIHRvIGEgc3RyaW5nCisgKiAgaW50byB0aGUgbWV0YWRhdGEgZGljdGlvbmFyeS4KKyAqLworaW50IGZmX3RhZGRfcmF0aW9uYWxfbWV0YWRhdGEoaW50IGNvdW50LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCeXRlQ29udGV4dCAqZ2IsIGludCBsZSwgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEpOworCisvKiogQWRkcyBjb3VudCBsb25ncyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcKKyAqICBpbnRvIHRoZSBtZXRhZGF0YSBkaWN0aW9uYXJ5LgorICovCitpbnQgZmZfdGFkZF9sb25nX21ldGFkYXRhKGludCBjb3VudCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCeXRlQ29udGV4dCAqZ2IsIGludCBsZSwgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEpOworCisvKiogQWRkcyBjb3VudCBkb3VibGVzIGNvbnZlcnRlZCB0byBhIHN0cmluZworICogIGludG8gdGhlIG1ldGFkYXRhIGRpY3Rpb25hcnkuCisgKi8KK2ludCBmZl90YWRkX2RvdWJsZXNfbWV0YWRhdGEoaW50IGNvdW50LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJ5dGVDb250ZXh0ICpnYiwgaW50IGxlLCBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSk7CisKKy8qKiBBZGRzIGNvdW50IHNob3J0cyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcKKyAqICBpbnRvIHRoZSBtZXRhZGF0YSBkaWN0aW9uYXJ5LgorICovCitpbnQgZmZfdGFkZF9zaG9ydHNfbWV0YWRhdGEoaW50IGNvdW50LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgKmdiLCBpbnQgbGUsIGludCBpc19zaWduZWQsIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhKTsKKworLyoqIEFkZHMgY291bnQgYnl0ZXMgY29udmVydGVkIHRvIGEgc3RyaW5nCisgKiAgaW50byB0aGUgbWV0YWRhdGEgZGljdGlvbmFyeS4KKyAqLworaW50IGZmX3RhZGRfYnl0ZXNfbWV0YWRhdGEoaW50IGNvdW50LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCeXRlQ29udGV4dCAqZ2IsIGludCBsZSwgaW50IGlzX3NpZ25lZCwgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEpOworCisvKiogQWRkcyBhIHN0cmluZyBvZiBjb3VudCBjaGFyYWN0ZXJzCisgKiAgaW50byB0aGUgbWV0YWRhdGEgZGljdGlvbmFyeS4KKyAqLworaW50IGZmX3RhZGRfc3RyaW5nX21ldGFkYXRhKGludCBjb3VudCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCeXRlQ29udGV4dCAqZ2IsIGludCBsZSwgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEpOworCisvKiogRGVjb2RlcyBhIFRJRkYgaGVhZGVyIGZyb20gdGhlIGlucHV0IGJ5dGVzdHJlYW0KKyAqICBhbmQgc2V0cyB0aGUgZW5kaWFubmVzcyBpbiAqbGUgYW5kIHRoZSBvZmZzZXQgdG8KKyAqICB0aGUgZmlyc3QgSUZEIGluICppZmRfb2Zmc2V0IGFjY29yZGluZ2x5LgorICovCitpbnQgZmZfdGRlY29kZV9oZWFkZXIoR2V0Qnl0ZUNvbnRleHQgKmdiLCBpbnQgKmxlLCBpbnQgKmlmZF9vZmZzZXQpOworCisvKiogUmVhZHMgdGhlIGZpcnN0IDMgZmllbGRzIG9mIGEgVElGRiB0YWcsIHdoaWNoIGFyZQorICogIHRoZSB0YWcgaWQsIHRoZSB0YWcgdHlwZSBhbmQgdGhlIGNvdW50IG9mIHZhbHVlcyBmb3IgdGhhdCB0YWcuCisgKiAgQWZ0ZXJ3YXJkcyB0aGUgYnl0ZXN0cmVhbSBpcyBsb2NhdGVkIGF0IHRoZSBmaXJzdCB2YWx1ZSB0byByZWFkIGFuZAorICogICpuZXh0IGhvbGRzIHRoZSBieXRlc3RyZWFtIG9mZnNldCBvZiB0aGUgZm9sbG93aW5nIHRhZy4KKyAqLworaW50IGZmX3RyZWFkX3RhZyhHZXRCeXRlQ29udGV4dCAqZ2IsIGludCBsZSwgdW5zaWduZWQgKnRhZywgdW5zaWduZWQgKnR5cGUsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpjb3VudCwgaW50ICpuZXh0KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVElGRl9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdGlmZl9kYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy90aWZmX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGMyMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdGlmZl9kYXRhLmMKQEAgLTAsMCArMSwxODcwIEBACisvKgorICogVElGRiBkYXRhIHRhYmxlcworICogQ29weXJpZ2h0IChjKSAyMDExIFRob21hcyBLdWVobmVsCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVElGRiBkYXRhIHRhYmxlcworICogQGF1dGhvciBUaG9tYXMgS3VlaG5lbAorICogQHNlZSBHZW9USUZGIHNwZWNpZmljYXRpb24gYXQKKyAqIGh0dHA6Ly93d3cucmVtb3Rlc2Vuc2luZy5vcmcvZ2VvdGlmZi9zcGVjL2dlb3RpZmZob21lLmh0bWwKKyAqLworCisjaW5jbHVkZSAidGlmZl9kYXRhLmgiCisKK2NvbnN0IFRpZmZHZW9UYWdOYW1lVHlwZSBmZl90aWZmX2NvbmZfbmFtZV90eXBlX21hcFtdID0geworICAgIHsiR1RNb2RlbFR5cGVHZW9LZXkiLCAgICAgICAgICAgICAgR0VPVElGRl9TSE9SVCB9LAorICAgIHsiR1RSYXN0ZXJUeXBlR2VvS2V5IiwgICAgICAgICAgICAgR0VPVElGRl9TSE9SVCB9LAorICAgIHsiR1RDaXRhdGlvbkdlb0tleSIsICAgICAgICAgICAgICAgR0VPVElGRl9TVFJJTkd9Cit9OworCitjb25zdCBUaWZmR2VvVGFnTmFtZVR5cGUgZmZfdGlmZl9nZW9nX25hbWVfdHlwZV9tYXBbXSA9IHsKKyAgICB7Ikdlb2dyYXBoaWNUeXBlR2VvS2V5IiwgICAgICAgICAgIEdFT1RJRkZfU0hPUlQgfSwKKyAgICB7Ikdlb2dDaXRhdGlvbkdlb0tleSIsICAgICAgICAgICAgIEdFT1RJRkZfU1RSSU5HfSwKKyAgICB7Ikdlb2dHZW9kZXRpY0RhdHVtR2VvS2V5IiwgICAgICAgIEdFT1RJRkZfU0hPUlQgfSwKKyAgICB7Ikdlb2dQcmltZU1lcmlkaWFuR2VvS2V5IiwgICAgICAgIEdFT1RJRkZfU0hPUlQgfSwKKyAgICB7Ikdlb2dMaW5lYXJVbml0c0dlb0tleSIsICAgICAgICAgIEdFT1RJRkZfU0hPUlQgfSwKKyAgICB7Ikdlb2dMaW5lYXJVbml0U2l6ZUdlb0tleSIsICAgICAgIEdFT1RJRkZfRE9VQkxFfSwKKyAgICB7Ikdlb2dBbmd1bGFyVW5pdHNHZW9LZXkiLCAgICAgICAgIEdFT1RJRkZfU0hPUlQgfSwKKyAgICB7Ikdlb2dBbmd1bGFyVW5pdFNpemVHZW9LZXkiLCAgICAgIEdFT1RJRkZfRE9VQkxFfSwKKyAgICB7Ikdlb2dFbGxpcHNvaWRHZW9LZXkiLCAgICAgICAgICAgIEdFT1RJRkZfU0hPUlQgfSwKKyAgICB7Ikdlb2dTZW1pTWFqb3JBeGlzR2VvS2V5IiwgICAgICAgIEdFT1RJRkZfRE9VQkxFfSwKKyAgICB7Ikdlb2dTZW1pTWlub3JBeGlzR2VvS2V5IiwgICAgICAgIEdFT1RJRkZfRE9VQkxFfSwKKyAgICB7Ikdlb2dJbnZGbGF0dGVuaW5nR2VvS2V5IiwgICAgICAgIEdFT1RJRkZfRE9VQkxFfSwKKyAgICB7Ikdlb2dBemltdXRoVW5pdHNHZW9LZXkiLCAgICAgICAgIEdFT1RJRkZfU0hPUlQgfSwKKyAgICB7Ikdlb2dQcmltZU1lcmlkaWFuTG9uZ0dlb0tleSIsICAgIEdFT1RJRkZfRE9VQkxFfQorfTsKKworY29uc3QgVGlmZkdlb1RhZ05hbWVUeXBlIGZmX3RpZmZfcHJval9uYW1lX3R5cGVfbWFwW10gPSB7CisgICAgeyJQcm9qZWN0ZWRDU1R5cGVHZW9LZXkiLCAgICAgICAgICBHRU9USUZGX1NIT1JUIH0sCisgICAgeyJQQ1NDaXRhdGlvbkdlb0tleSIsICAgICAgICAgICAgICBHRU9USUZGX1NUUklOR30sCisgICAgeyJQcm9qZWN0aW9uR2VvS2V5IiwgICAgICAgICAgICAgICBHRU9USUZGX1NIT1JUIH0sCisgICAgeyJQcm9qQ29vcmRUcmFuc0dlb0tleSIsICAgICAgICAgICBHRU9USUZGX1NIT1JUIH0sCisgICAgeyJQcm9qTGluZWFyVW5pdHNHZW9LZXkiLCAgICAgICAgICBHRU9USUZGX1NIT1JUIH0sCisgICAgeyJQcm9qTGluZWFyVW5pdFNpemVHZW9LZXkiLCAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qU3RkUGFyYWxsZWwxR2VvS2V5IiwgICAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qU3RkUGFyYWxsZWwyR2VvS2V5IiwgICAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qTmF0T3JpZ2luTG9uZ0dlb0tleSIsICAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qTmF0T3JpZ2luTGF0R2VvS2V5IiwgICAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qRmFsc2VFYXN0aW5nR2VvS2V5IiwgICAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qRmFsc2VOb3J0aGluZ0dlb0tleSIsICAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qRmFsc2VPcmlnaW5Mb25nR2VvS2V5IiwgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qRmFsc2VPcmlnaW5MYXRHZW9LZXkiLCAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qRmFsc2VPcmlnaW5FYXN0aW5nR2VvS2V5IiwgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qRmFsc2VPcmlnaW5Ob3J0aGluZ0dlb0tleSIsICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qQ2VudGVyTG9uZ0dlb0tleSIsICAgICAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qQ2VudGVyTGF0R2VvS2V5IiwgICAgICAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qQ2VudGVyRWFzdGluZ0dlb0tleSIsICAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qQ2VudGVyTm9ydGhpbmdHZW9LZXkiLCAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qU2NhbGVBdE5hdE9yaWdpbkdlb0tleSIsICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qU2NhbGVBdENlbnRlckdlb0tleSIsICAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qQXppbXV0aEFuZ2xlR2VvS2V5IiwgICAgICAgICBHRU9USUZGX0RPVUJMRX0sCisgICAgeyJQcm9qU3RyYWlnaHRWZXJ0UG9sZUxvbmdHZW9LZXkiLCBHRU9USUZGX0RPVUJMRX0KK307CisKK2NvbnN0IFRpZmZHZW9UYWdOYW1lVHlwZSBmZl90aWZmX3ZlcnRfbmFtZV90eXBlX21hcFtdID0geworICAgIHsiVmVydGljYWxDU1R5cGVHZW9LZXkiLCAgICAgICAgICAgR0VPVElGRl9TSE9SVCB9LAorICAgIHsiVmVydGljYWxDaXRhdGlvbkdlb0tleSIsICAgICAgICAgR0VPVElGRl9TVFJJTkd9LAorICAgIHsiVmVydGljYWxEYXR1bUdlb0tleSIsICAgICAgICAgICAgR0VPVElGRl9TSE9SVCB9LAorICAgIHsiVmVydGljYWxVbml0c0dlb0tleSIsICAgICAgICAgICAgR0VPVElGRl9TSE9SVCB9Cit9OworCitjb25zdCBjaGFyICpjb25zdCBmZl90aWZmX2d0X21vZGVsX3R5cGVfY29kZXNbXSA9IHsKKyAgICAiTW9kZWxUeXBlUHJvamVjdGVkIiwKKyAgICAiTW9kZWxUeXBlR2VvZ3JhcGhpYyIsCisgICAgIk1vZGVsVHlwZUdlb2NlbnRyaWMiCit9OworCitjb25zdCBjaGFyICpjb25zdCBmZl90aWZmX2d0X3Jhc3Rlcl90eXBlX2NvZGVzW10gPSB7CisgICAgIlJhc3RlclBpeGVsSXNBcmVhIiwKKyAgICAiUmFzdGVyUGl4ZWxJc1BvaW50IgorfTsKKworY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9saW5lYXJfdW5pdF9jb2Rlc1tdID0geworICAgICJMaW5lYXJfTWV0ZXIiLAorICAgICJMaW5lYXJfRm9vdCIsCisgICAgIkxpbmVhcl9Gb290X1VTX1N1cnZleSIsCisgICAgIkxpbmVhcl9Gb290X01vZGlmaWVkX0FtZXJpY2FuIiwKKyAgICAiTGluZWFyX0Zvb3RfQ2xhcmtlIiwKKyAgICAiTGluZWFyX0Zvb3RfSW5kaWFuIiwKKyAgICAiTGluZWFyX0xpbmsiLAorICAgICJMaW5lYXJfTGlua19CZW5vaXQiLAorICAgICJMaW5lYXJfTGlua19TZWFycyIsCisgICAgIkxpbmVhcl9DaGFpbl9CZW5vaXQiLAorICAgICJMaW5lYXJfQ2hhaW5fU2VhcnMiLAorICAgICJMaW5lYXJfWWFyZF9TZWFycyIsCisgICAgIkxpbmVhcl9ZYXJkX0luZGlhbiIsCisgICAgIkxpbmVhcl9GYXRob20iLAorICAgICJMaW5lYXJfTWlsZV9JbnRlcm5hdGlvbmFsX05hdXRpY2FsIgorfTsKKworY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9hbmd1bGFyX3VuaXRfY29kZXNbXSA9IHsKKyAgICAiQW5ndWxhcl9SYWRpYW4iLAorICAgICJBbmd1bGFyX0RlZ3JlZSIsCisgICAgIkFuZ3VsYXJfQXJjX01pbnV0ZSIsCisgICAgIkFuZ3VsYXJfQXJjX1NlY29uZCIsCisgICAgIkFuZ3VsYXJfR3JhZCIsCisgICAgIkFuZ3VsYXJfR29uIiwKKyAgICAiQW5ndWxhcl9ETVMiLAorICAgICJBbmd1bGFyX0RNU19IZW1pc3BoZXJlIgorfTsKKworY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9nY3NfdHlwZV9jb2Rlc1tdID0geworICAgICJHQ1NfQWRpbmRhbiIsCisgICAgIkdDU19BR0Q2NiIsCisgICAgIkdDU19BR0Q4NCIsCisgICAgIkdDU19BaW5fZWxfQWJkIiwKKyAgICAiR0NTX0FmZ29veWUiLAorICAgICJHQ1NfQWdhZGV6IiwKKyAgICAiR0NTX0xpc2JvbiIsCisgICAgIkdDU19BcmF0dSIsCisgICAgIkdDU19BcmNfMTk1MCIsCisgICAgIkdDU19BcmNfMTk2MCIsCisgICAgIkdDU19CYXRhdmlhIiwKKyAgICAiR0NTX0JhcmJhZG9zIiwKKyAgICAiR0NTX0JlZHVhcmFtIiwKKyAgICAiR0NTX0JlaWppbmdfMTk1NCIsCisgICAgIkdDU19CZWxnZV8xOTUwIiwKKyAgICAiR0NTX0Jlcm11ZGFfMTk1NyIsCisgICAgIkdDU19CZXJuXzE4OTgiLAorICAgICJHQ1NfQm9nb3RhIiwKKyAgICAiR0NTX0J1a2l0X1JpbXBhaCIsCisgICAgIkdDU19DYW1hY3VwYSIsCisgICAgIkdDU19DYW1wb19JbmNoYXVzcGUiLAorICAgICJHQ1NfQ2FwZSIsCisgICAgIkdDU19DYXJ0aGFnZSIsCisgICAgIkdDU19DaHVhIiwKKyAgICAiR0NTX0NvcnJlZ29fQWxlZ3JlIiwKKyAgICAiR0NTX0NvdGVfZF9Jdm9pcmUiLAorICAgICJHQ1NfRGVpcl9lel9ab3IiLAorICAgICJHQ1NfRG91YWxhIiwKKyAgICAiR0NTX0VneXB0XzE5MDciLAorICAgICJHQ1NfRUQ1MCIsCisgICAgIkdDU19FRDg3IiwKKyAgICAiR0NTX0ZhaHVkIiwKKyAgICAiR0NTX0dhbmRhamlrYV8xOTcwIiwKKyAgICAiR0NTX0dhcm91YSIsCisgICAgIkdDU19HdXlhbmVfRnJhbmNhaXNlIiwKKyAgICAiR0NTX0h1X1R6dV9TaGFuIiwKKyAgICAiR0NTX0hENzIiLAorICAgICJHQ1NfSUQ3NCIsCisgICAgIkdDU19JbmRpYW5fMTk1NCIsCisgICAgIkdDU19JbmRpYW5fMTk3NSIsCisgICAgIkdDU19KYW1haWNhXzE4NzUiLAorICAgICJHQ1NfSkFENjkiLAorICAgICJHQ1NfS2FsaWFucHVyIiwKKyAgICAiR0NTX0thbmRhd2FsYSIsCisgICAgIkdDU19LZXJ0YXUiLAorICAgICJHQ1NfS09DIiwKKyAgICAiR0NTX0xhX0Nhbm9hIiwKKyAgICAiR0NTX1BTQUQ1NiIsCisgICAgIkdDU19MYWtlIiwKKyAgICAiR0NTX0xlaWdvbiIsCisgICAgIkdDU19MaWJlcmlhXzE5NjQiLAorICAgICJHQ1NfTG9tZSIsCisgICAgIkdDU19MdXpvbl8xOTExIiwKKyAgICAiR0NTX0hpdG9fWFZJSUlfMTk2MyIsCisgICAgIkdDU19IZXJhdF9Ob3J0aCIsCisgICAgIkdDU19NYWhlXzE5NzEiLAorICAgICJHQ1NfTWFrYXNzYXIiLAorICAgICJHQ1NfRVVSRUY4OSIsCisgICAgIkdDU19NYWxvbmdvXzE5ODciLAorICAgICJHQ1NfTWFub2NhIiwKKyAgICAiR0NTX01lcmNoaWNoIiwKKyAgICAiR0NTX01hc3Nhd2EiLAorICAgICJHQ1NfTWlubmEiLAorICAgICJHQ1NfTWhhc3QiLAorICAgICJHQ1NfTW9udGVfTWFyaW8iLAorICAgICJHQ1NfTV9wb3JhbG9rbyIsCisgICAgIkdDU19OQUQyNyIsCisgICAgIkdDU19OQURfTWljaGlnYW4iLAorICAgICJHQ1NfTkFEODMiLAorICAgICJHQ1NfTmFocndhbl8xOTY3IiwKKyAgICAiR0NTX05hcGFyaW1hXzE5NzIiLAorICAgICJHQ1NfR0Q0OSIsCisgICAgIkdDU19OR09fMTk0OCIsCisgICAgIkdDU19EYXR1bV83MyIsCisgICAgIkdDU19OVEYiLAorICAgICJHQ1NfTlNXQ185Wl8yIiwKKyAgICAiR0NTX09TR0JfMTkzNiIsCisgICAgIkdDU19PU0dCNzAiLAorICAgICJHQ1NfT1NfU044MCIsCisgICAgIkdDU19QYWRhbmciLAorICAgICJHQ1NfUGFsZXN0aW5lXzE5MjMiLAorICAgICJHQ1NfUG9pbnRlX05vaXJlIiwKKyAgICAiR0NTX0dEQTk0IiwKKyAgICAiR0NTX1B1bGtvdm9fMTk0MiIsCisgICAgIkdDU19RYXRhciIsCisgICAgIkdDU19RYXRhcl8xOTQ4IiwKKyAgICAiR0NTX1Fvcm5vcSIsCisgICAgIkdDU19Mb21hX1F1aW50YW5hIiwKKyAgICAiR0NTX0FtZXJzZm9vcnQiLAorICAgICJHQ1NfUlQzOCIsCisgICAgIkdDU19TQUQ2OSIsCisgICAgIkdDU19TYXBwZXJfSGlsbF8xOTQzIiwKKyAgICAiR0NTX1NjaHdhcnplY2siLAorICAgICJHQ1NfU2Vnb3JhIiwKKyAgICAiR0NTX1NlcmluZHVuZyIsCisgICAgIkdDU19TdWRhbiIsCisgICAgIkdDU19UYW5hbmFyaXZlIiwKKyAgICAiR0NTX1RpbWJhbGFpXzE5NDgiLAorICAgICJHQ1NfVE02NSIsCisgICAgIkdDU19UTTc1IiwKKyAgICAiR0NTX1Rva3lvIiwKKyAgICAiR0NTX1RyaW5pZGFkXzE5MDMiLAorICAgICJHQ1NfVENfMTk0OCIsCisgICAgIkdDU19Wb2lyb2xfMTg3NSIsCisgICAgIkdDU19Wb2lyb2xfVW5pZmllIiwKKyAgICAiR0NTX0Jlcm5fMTkzOCIsCisgICAgIkdDU19Ob3JkX1NhaGFyYV8xOTU5IiwKKyAgICAiR0NTX1N0b2NraG9sbV8xOTM4IiwKKyAgICAiR0NTX1lhY2FyZSIsCisgICAgIkdDU19Zb2ZmIiwKKyAgICAiR0NTX1phbmRlcmlqIiwKKyAgICAiR0NTX01HSSIsCisgICAgIkdDU19CZWxnZV8xOTcyIiwKKyAgICAiR0NTX0RIRE4iLAorICAgICJHQ1NfQ29uYWtyeV8xOTA1IiwKKyAgICAiR0NTX1dHU183MiIsCisgICAgIkdDU19XR1NfNzJCRSIsCisgICAgIkdDU19XR1NfODQiLAorICAgICJHQ1NfQmVybl8xODk4X0Jlcm4iLAorICAgICJHQ1NfQm9nb3RhX0JvZ290YSIsCisgICAgIkdDU19MaXNib25fTGlzYm9uIiwKKyAgICAiR0NTX01ha2Fzc2FyX0pha2FydGEiLAorICAgICJHQ1NfTUdJX0ZlcnJvIiwKKyAgICAiR0NTX01vbnRlX01hcmlvX1JvbWUiLAorICAgICJHQ1NfTlRGX1BhcmlzIiwKKyAgICAiR0NTX1BhZGFuZ19KYWthcnRhIiwKKyAgICAiR0NTX0JlbGdlXzE5NTBfQnJ1c3NlbHMiLAorICAgICJHQ1NfVGFuYW5hcml2ZV9QYXJpcyIsCisgICAgIkdDU19Wb2lyb2xfMTg3NV9QYXJpcyIsCisgICAgIkdDU19Wb2lyb2xfVW5pZmllX1BhcmlzIiwKKyAgICAiR0NTX0JhdGF2aWFfSmFrYXJ0YSIsCisgICAgIkdDU19BVEZfUGFyaXMiLAorICAgICJHQ1NfTkRHX1BhcmlzIgorfTsKKworY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9nY3NlX3R5cGVfY29kZXNbXSA9IHsKKyAgICAiR0NTRV9BaXJ5MTgzMCIsCisgICAgIkdDU0VfQWlyeU1vZGlmaWVkMTg0OSIsCisgICAgIkdDU0VfQXVzdHJhbGlhbk5hdGlvbmFsU3BoZXJvaWQiLAorICAgICJHQ1NFX0Jlc3NlbDE4NDEiLAorICAgICJHQ1NFX0Jlc3NlbE1vZGlmaWVkIiwKKyAgICAiR0NTRV9CZXNzZWxOYW1pYmlhIiwKKyAgICAiR0NTRV9DbGFya2UxODU4IiwKKyAgICAiR0NTRV9DbGFya2UxODY2IiwKKyAgICAiR0NTRV9DbGFya2UxODY2TWljaGlnYW4iLAorICAgICJHQ1NFX0NsYXJrZTE4ODBfQmVub2l0IiwKKyAgICAiR0NTRV9DbGFya2UxODgwX0lHTiIsCisgICAgIkdDU0VfQ2xhcmtlMTg4MF9SR1MiLAorICAgICJHQ1NFX0NsYXJrZTE4ODBfQXJjIiwKKyAgICAiR0NTRV9DbGFya2UxODgwX1NHQTE5MjIiLAorICAgICJHQ1NFX0V2ZXJlc3QxODMwXzE5MzdBZGp1c3RtZW50IiwKKyAgICAiR0NTRV9FdmVyZXN0MTgzMF8xOTY3RGVmaW5pdGlvbiIsCisgICAgIkdDU0VfRXZlcmVzdDE4MzBfMTk3NURlZmluaXRpb24iLAorICAgICJHQ1NFX0V2ZXJlc3QxODMwTW9kaWZpZWQiLAorICAgICJHQ1NFX0dSUzE5ODAiLAorICAgICJHQ1NFX0hlbG1lcnQxOTA2IiwKKyAgICAiR0NTRV9JbmRvbmVzaWFuTmF0aW9uYWxTcGhlcm9pZCIsCisgICAgIkdDU0VfSW50ZXJuYXRpb25hbDE5MjQiLAorICAgICJHQ1NFX0ludGVybmF0aW9uYWwxOTY3IiwKKyAgICAiR0NTRV9LcmFzc293c2t5MTk0MCIsCisgICAgIkdDU0VfTldMOUQiLAorICAgICJHQ1NFX05XTDEwRCIsCisgICAgIkdDU0VfUGxlc3NpczE4MTciLAorICAgICJHQ1NFX1N0cnV2ZTE4NjAiLAorICAgICJHQ1NFX1dhck9mZmljZSIsCisgICAgIkdDU0VfV0dTODQiLAorICAgICJHQ1NFX0dFTTEwQyIsCisgICAgIkdDU0VfT1NVODZGIiwKKyAgICAiR0NTRV9PU1U5MUEiLAorICAgICJHQ1NFX0NsYXJrZTE4ODAiLAorICAgICJHQ1NFX1NwaGVyZSIKK307CisKK2NvbnN0IGNoYXIgKmNvbnN0IGZmX3RpZmZfZ2VvZGV0aWNfZGF0dW1fY29kZXNbXSA9IHsKKyAgICAiRGF0dW1fQWRpbmRhbiIsCisgICAgIkRhdHVtX0F1c3RyYWxpYW5fR2VvZGV0aWNfRGF0dW1fMTk2NiIsCisgICAgIkRhdHVtX0F1c3RyYWxpYW5fR2VvZGV0aWNfRGF0dW1fMTk4NCIsCisgICAgIkRhdHVtX0Fpbl9lbF9BYmRfMTk3MCIsCisgICAgIkRhdHVtX0FmZ29veWUiLAorICAgICJEYXR1bV9BZ2FkZXoiLAorICAgICJEYXR1bV9MaXNib24iLAorICAgICJEYXR1bV9BcmF0dSIsCisgICAgIkRhdHVtX0FyY18xOTUwIiwKKyAgICAiRGF0dW1fQXJjXzE5NjAiLAorICAgICJEYXR1bV9CYXRhdmlhIiwKKyAgICAiRGF0dW1fQmFyYmFkb3MiLAorICAgICJEYXR1bV9CZWR1YXJhbSIsCisgICAgIkRhdHVtX0JlaWppbmdfMTk1NCIsCisgICAgIkRhdHVtX1Jlc2VhdV9OYXRpb25hbF9CZWxnZV8xOTUwIiwKKyAgICAiRGF0dW1fQmVybXVkYV8xOTU3IiwKKyAgICAiRGF0dW1fQmVybl8xODk4IiwKKyAgICAiRGF0dW1fQm9nb3RhIiwKKyAgICAiRGF0dW1fQnVraXRfUmltcGFoIiwKKyAgICAiRGF0dW1fQ2FtYWN1cGEiLAorICAgICJEYXR1bV9DYW1wb19JbmNoYXVzcGUiLAorICAgICJEYXR1bV9DYXBlIiwKKyAgICAiRGF0dW1fQ2FydGhhZ2UiLAorICAgICJEYXR1bV9DaHVhIiwKKyAgICAiRGF0dW1fQ29ycmVnb19BbGVncmUiLAorICAgICJEYXR1bV9Db3RlX2RfSXZvaXJlIiwKKyAgICAiRGF0dW1fRGVpcl9lel9ab3IiLAorICAgICJEYXR1bV9Eb3VhbGEiLAorICAgICJEYXR1bV9FZ3lwdF8xOTA3IiwKKyAgICAiRGF0dW1fRXVyb3BlYW5fRGF0dW1fMTk1MCIsCisgICAgIkRhdHVtX0V1cm9wZWFuX0RhdHVtXzE5ODciLAorICAgICJEYXR1bV9GYWh1ZCIsCisgICAgIkRhdHVtX0dhbmRhamlrYV8xOTcwIiwKKyAgICAiRGF0dW1fR2Fyb3VhIiwKKyAgICAiRGF0dW1fR3V5YW5lX0ZyYW5jYWlzZSIsCisgICAgIkRhdHVtX0h1X1R6dV9TaGFuIiwKKyAgICAiRGF0dW1fSHVuZ2FyaWFuX0RhdHVtXzE5NzIiLAorICAgICJEYXR1bV9JbmRvbmVzaWFuX0RhdHVtXzE5NzQiLAorICAgICJEYXR1bV9JbmRpYW5fMTk1NCIsCisgICAgIkRhdHVtX0luZGlhbl8xOTc1IiwKKyAgICAiRGF0dW1fSmFtYWljYV8xODc1IiwKKyAgICAiRGF0dW1fSmFtYWljYV8xOTY5IiwKKyAgICAiRGF0dW1fS2FsaWFucHVyIiwKKyAgICAiRGF0dW1fS2FuZGF3YWxhIiwKKyAgICAiRGF0dW1fS2VydGF1IiwKKyAgICAiRGF0dW1fS3V3YWl0X09pbF9Db21wYW55IiwKKyAgICAiRGF0dW1fTGFfQ2Fub2EiLAorICAgICJEYXR1bV9Qcm92aXNpb25hbF9TX0FtZXJpY2FuX0RhdHVtXzE5NTYiLAorICAgICJEYXR1bV9MYWtlIiwKKyAgICAiRGF0dW1fTGVpZ29uIiwKKyAgICAiRGF0dW1fTGliZXJpYV8xOTY0IiwKKyAgICAiRGF0dW1fTG9tZSIsCisgICAgIkRhdHVtX0x1em9uXzE5MTEiLAorICAgICJEYXR1bV9IaXRvX1hWSUlJXzE5NjMiLAorICAgICJEYXR1bV9IZXJhdF9Ob3J0aCIsCisgICAgIkRhdHVtX01haGVfMTk3MSIsCisgICAgIkRhdHVtX01ha2Fzc2FyIiwKKyAgICAiRGF0dW1fRXVyb3BlYW5fUmVmZXJlbmNlX1N5c3RlbV8xOTg5IiwKKyAgICAiRGF0dW1fTWFsb25nb18xOTg3IiwKKyAgICAiRGF0dW1fTWFub2NhIiwKKyAgICAiRGF0dW1fTWVyY2hpY2giLAorICAgICJEYXR1bV9NYXNzYXdhIiwKKyAgICAiRGF0dW1fTWlubmEiLAorICAgICJEYXR1bV9NaGFzdCIsCisgICAgIkRhdHVtX01vbnRlX01hcmlvIiwKKyAgICAiRGF0dW1fTV9wb3JhbG9rbyIsCisgICAgIkRhdHVtX05vcnRoX0FtZXJpY2FuX0RhdHVtXzE5MjciLAorICAgICJEYXR1bV9OQURfTWljaGlnYW4iLAorICAgICJEYXR1bV9Ob3J0aF9BbWVyaWNhbl9EYXR1bV8xOTgzIiwKKyAgICAiRGF0dW1fTmFocndhbl8xOTY3IiwKKyAgICAiRGF0dW1fTmFwYXJpbWFfMTk3MiIsCisgICAgIkRhdHVtX05ld19aZWFsYW5kX0dlb2RldGljX0RhdHVtXzE5NDkiLAorICAgICJEYXR1bV9OR09fMTk0OCIsCisgICAgIkRhdHVtX0RhdHVtXzczIiwKKyAgICAiRGF0dW1fTm91dmVsbGVfVHJpYW5ndWxhdGlvbl9GcmFuY2Fpc2UiLAorICAgICJEYXR1bV9OU1dDXzlaXzIiLAorICAgICJEYXR1bV9PU0dCXzE5MzYiLAorICAgICJEYXR1bV9PU0dCXzE5NzBfU04iLAorICAgICJEYXR1bV9PU19TTl8xOTgwIiwKKyAgICAiRGF0dW1fUGFkYW5nXzE4ODQiLAorICAgICJEYXR1bV9QYWxlc3RpbmVfMTkyMyIsCisgICAgIkRhdHVtX1BvaW50ZV9Ob2lyZSIsCisgICAgIkRhdHVtX0dlb2NlbnRyaWNfRGF0dW1fb2ZfQXVzdHJhbGlhXzE5OTQiLAorICAgICJEYXR1bV9QdWxrb3ZvXzE5NDIiLAorICAgICJEYXR1bV9RYXRhciIsCisgICAgIkRhdHVtX1FhdGFyXzE5NDgiLAorICAgICJEYXR1bV9Rb3Jub3EiLAorICAgICJEYXR1bV9Mb21hX1F1aW50YW5hIiwKKyAgICAiRGF0dW1fQW1lcnNmb29ydCIsCisgICAgIkRhdHVtX1JUMzgiLAorICAgICJEYXR1bV9Tb3V0aF9BbWVyaWNhbl9EYXR1bV8xOTY5IiwKKyAgICAiRGF0dW1fU2FwcGVyX0hpbGxfMTk0MyIsCisgICAgIkRhdHVtX1NjaHdhcnplY2siLAorICAgICJEYXR1bV9TZWdvcmEiLAorICAgICJEYXR1bV9TZXJpbmR1bmciLAorICAgICJEYXR1bV9TdWRhbiIsCisgICAgIkRhdHVtX1RhbmFuYXJpdmVfMTkyNSIsCisgICAgIkRhdHVtX1RpbWJhbGFpXzE5NDgiLAorICAgICJEYXR1bV9UTTY1IiwKKyAgICAiRGF0dW1fVE03NSIsCisgICAgIkRhdHVtX1Rva3lvIiwKKyAgICAiRGF0dW1fVHJpbmlkYWRfMTkwMyIsCisgICAgIkRhdHVtX1RydWNpYWxfQ29hc3RfMTk0OCIsCisgICAgIkRhdHVtX1ZvaXJvbF8xODc1IiwKKyAgICAiRGF0dW1fVm9pcm9sX1VuaWZpZV8xOTYwIiwKKyAgICAiRGF0dW1fQmVybl8xOTM4IiwKKyAgICAiRGF0dW1fTm9yZF9TYWhhcmFfMTk1OSIsCisgICAgIkRhdHVtX1N0b2NraG9sbV8xOTM4IiwKKyAgICAiRGF0dW1fWWFjYXJlIiwKKyAgICAiRGF0dW1fWW9mZiIsCisgICAgIkRhdHVtX1phbmRlcmlqIiwKKyAgICAiRGF0dW1fTWlsaXRhcl9HZW9ncmFwaGlzY2hlX0luc3RpdHV0IiwKKyAgICAiRGF0dW1fUmVzZWF1X05hdGlvbmFsX0JlbGdlXzE5NzIiLAorICAgICJEYXR1bV9EZXV0c2NoZV9IYXVwdGRyZWllY2tzbmV0eiIsCisgICAgIkRhdHVtX0NvbmFrcnlfMTkwNSIsCisgICAgIkRhdHVtX1dHUzcyIiwKKyAgICAiRGF0dW1fV0dTNzJfVHJhbnNpdF9Ccm9hZGNhc3RfRXBoZW1lcmlzIiwKKyAgICAiRGF0dW1fV0dTODQiLAorICAgICJEYXR1bV9BbmNpZW5uZV9Ucmlhbmd1bGF0aW9uX0ZyYW5jYWlzZSIsCisgICAgIkRhdHVtX05vcmRfZGVfR3VlcnJlIgorfTsKKworY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9nZW9kZXRpY19kYXR1bV9lX2NvZGVzW10gPSB7CisgICAgIkRhdHVtRV9BaXJ5MTgzMCIsCisgICAgIkRhdHVtRV9BaXJ5TW9kaWZpZWQxODQ5IiwKKyAgICAiRGF0dW1FX0F1c3RyYWxpYW5OYXRpb25hbFNwaGVyb2lkIiwKKyAgICAiRGF0dW1FX0Jlc3NlbDE4NDEiLAorICAgICJEYXR1bUVfQmVzc2VsTW9kaWZpZWQiLAorICAgICJEYXR1bUVfQmVzc2VsTmFtaWJpYSIsCisgICAgIkRhdHVtRV9DbGFya2UxODU4IiwKKyAgICAiRGF0dW1FX0NsYXJrZTE4NjYiLAorICAgICJEYXR1bUVfQ2xhcmtlMTg2Nk1pY2hpZ2FuIiwKKyAgICAiRGF0dW1FX0NsYXJrZTE4ODBfQmVub2l0IiwKKyAgICAiRGF0dW1FX0NsYXJrZTE4ODBfSUdOIiwKKyAgICAiRGF0dW1FX0NsYXJrZTE4ODBfUkdTIiwKKyAgICAiRGF0dW1FX0NsYXJrZTE4ODBfQXJjIiwKKyAgICAiRGF0dW1FX0NsYXJrZTE4ODBfU0dBMTkyMiIsCisgICAgIkRhdHVtRV9FdmVyZXN0MTgzMF8xOTM3QWRqdXN0bWVudCIsCisgICAgIkRhdHVtRV9FdmVyZXN0MTgzMF8xOTY3RGVmaW5pdGlvbiIsCisgICAgIkRhdHVtRV9FdmVyZXN0MTgzMF8xOTc1RGVmaW5pdGlvbiIsCisgICAgIkRhdHVtRV9FdmVyZXN0MTgzME1vZGlmaWVkIiwKKyAgICAiRGF0dW1FX0dSUzE5ODAiLAorICAgICJEYXR1bUVfSGVsbWVydDE5MDYiLAorICAgICJEYXR1bUVfSW5kb25lc2lhbk5hdGlvbmFsU3BoZXJvaWQiLAorICAgICJEYXR1bUVfSW50ZXJuYXRpb25hbDE5MjQiLAorICAgICJEYXR1bUVfSW50ZXJuYXRpb25hbDE5NjciLAorICAgICJEYXR1bUVfS3Jhc3Nvd3NreTE5NjAiLAorICAgICJEYXR1bUVfTldMOUQiLAorICAgICJEYXR1bUVfTldMMTBEIiwKKyAgICAiRGF0dW1FX1BsZXNzaXMxODE3IiwKKyAgICAiRGF0dW1FX1N0cnV2ZTE4NjAiLAorICAgICJEYXR1bUVfV2FyT2ZmaWNlIiwKKyAgICAiRGF0dW1FX1dHUzg0IiwKKyAgICAiRGF0dW1FX0dFTTEwQyIsCisgICAgIkRhdHVtRV9PU1U4NkYiLAorICAgICJEYXR1bUVfT1NVOTFBIiwKKyAgICAiRGF0dW1FX0NsYXJrZTE4ODAiLAorICAgICJEYXR1bUVfU3BoZXJlIgorfTsKKworY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9lbGxpcHNvaWRfY29kZXNbXSA9IHsKKyAgICAiRWxsaXBzZV9BaXJ5XzE4MzAiLAorICAgICJFbGxpcHNlX0FpcnlfTW9kaWZpZWRfMTg0OSIsCisgICAgIkVsbGlwc2VfQXVzdHJhbGlhbl9OYXRpb25hbF9TcGhlcm9pZCIsCisgICAgIkVsbGlwc2VfQmVzc2VsXzE4NDEiLAorICAgICJFbGxpcHNlX0Jlc3NlbF9Nb2RpZmllZCIsCisgICAgIkVsbGlwc2VfQmVzc2VsX05hbWliaWEiLAorICAgICJFbGxpcHNlX0NsYXJrZV8xODU4IiwKKyAgICAiRWxsaXBzZV9DbGFya2VfMTg2NiIsCisgICAgIkVsbGlwc2VfQ2xhcmtlXzE4NjZfTWljaGlnYW4iLAorICAgICJFbGxpcHNlX0NsYXJrZV8xODgwX0Jlbm9pdCIsCisgICAgIkVsbGlwc2VfQ2xhcmtlXzE4ODBfSUdOIiwKKyAgICAiRWxsaXBzZV9DbGFya2VfMTg4MF9SR1MiLAorICAgICJFbGxpcHNlX0NsYXJrZV8xODgwX0FyYyIsCisgICAgIkVsbGlwc2VfQ2xhcmtlXzE4ODBfU0dBXzE5MjIiLAorICAgICJFbGxpcHNlX0V2ZXJlc3RfMTgzMF8xOTM3X0FkanVzdG1lbnQiLAorICAgICJFbGxpcHNlX0V2ZXJlc3RfMTgzMF8xOTY3X0RlZmluaXRpb24iLAorICAgICJFbGxpcHNlX0V2ZXJlc3RfMTgzMF8xOTc1X0RlZmluaXRpb24iLAorICAgICJFbGxpcHNlX0V2ZXJlc3RfMTgzMF9Nb2RpZmllZCIsCisgICAgIkVsbGlwc2VfR1JTXzE5ODAiLAorICAgICJFbGxpcHNlX0hlbG1lcnRfMTkwNiIsCisgICAgIkVsbGlwc2VfSW5kb25lc2lhbl9OYXRpb25hbF9TcGhlcm9pZCIsCisgICAgIkVsbGlwc2VfSW50ZXJuYXRpb25hbF8xOTI0IiwKKyAgICAiRWxsaXBzZV9JbnRlcm5hdGlvbmFsXzE5NjciLAorICAgICJFbGxpcHNlX0tyYXNzb3dza3lfMTk0MCIsCisgICAgIkVsbGlwc2VfTldMXzlEIiwKKyAgICAiRWxsaXBzZV9OV0xfMTBEIiwKKyAgICAiRWxsaXBzZV9QbGVzc2lzXzE4MTciLAorICAgICJFbGxpcHNlX1N0cnV2ZV8xODYwIiwKKyAgICAiRWxsaXBzZV9XYXJfT2ZmaWNlIiwKKyAgICAiRWxsaXBzZV9XR1NfODQiLAorICAgICJFbGxpcHNlX0dFTV8xMEMiLAorICAgICJFbGxpcHNlX09TVTg2RiIsCisgICAgIkVsbGlwc2VfT1NVOTFBIiwKKyAgICAiRWxsaXBzZV9DbGFya2VfMTg4MCIsCisgICAgIkVsbGlwc2VfU3BoZXJlIgorfTsKKworY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9wcmltZV9tZXJpZGlhbl9jb2Rlc1tdID0geworICAgICJQTV9HcmVlbndpY2giLAorICAgICJQTV9MaXNib24iLAorICAgICJQTV9QYXJpcyIsCisgICAgIlBNX0JvZ290YSIsCisgICAgIlBNX01hZHJpZCIsCisgICAgIlBNX1JvbWUiLAorICAgICJQTV9CZXJuIiwKKyAgICAiUE1fSmFrYXJ0YSIsCisgICAgIlBNX0ZlcnJvIiwKKyAgICAiUE1fQnJ1c3NlbHMiLAorICAgICJQTV9TdG9ja2hvbG0iCit9OworCitjb25zdCBUaWZmR2VvVGFnS2V5TmFtZSBmZl90aWZmX3Byb2pfY3NfdHlwZV9jb2Rlc1tdID0geworICAgIHsyMDEzNywgIlBDU19BZGluZGFuX1VUTV96b25lXzM3TiJ9LAorICAgIHsyMDEzOCwgIlBDU19BZGluZGFuX1VUTV96b25lXzM4TiJ9LAorICAgIHsyMDI0OCwgIlBDU19BR0Q2Nl9BTUdfem9uZV80OCJ9LAorICAgIHsyMDI0OSwgIlBDU19BR0Q2Nl9BTUdfem9uZV80OSJ9LAorICAgIHsyMDI1MCwgIlBDU19BR0Q2Nl9BTUdfem9uZV81MCJ9LAorICAgIHsyMDI1MSwgIlBDU19BR0Q2Nl9BTUdfem9uZV81MSJ9LAorICAgIHsyMDI1MiwgIlBDU19BR0Q2Nl9BTUdfem9uZV81MiJ9LAorICAgIHsyMDI1MywgIlBDU19BR0Q2Nl9BTUdfem9uZV81MyJ9LAorICAgIHsyMDI1NCwgIlBDU19BR0Q2Nl9BTUdfem9uZV81NCJ9LAorICAgIHsyMDI1NSwgIlBDU19BR0Q2Nl9BTUdfem9uZV81NSJ9LAorICAgIHsyMDI1NiwgIlBDU19BR0Q2Nl9BTUdfem9uZV81NiJ9LAorICAgIHsyMDI1NywgIlBDU19BR0Q2Nl9BTUdfem9uZV81NyJ9LAorICAgIHsyMDI1OCwgIlBDU19BR0Q2Nl9BTUdfem9uZV81OCJ9LAorICAgIHsyMDM0OCwgIlBDU19BR0Q4NF9BTUdfem9uZV80OCJ9LAorICAgIHsyMDM0OSwgIlBDU19BR0Q4NF9BTUdfem9uZV80OSJ9LAorICAgIHsyMDM1MCwgIlBDU19BR0Q4NF9BTUdfem9uZV81MCJ9LAorICAgIHsyMDM1MSwgIlBDU19BR0Q4NF9BTUdfem9uZV81MSJ9LAorICAgIHsyMDM1MiwgIlBDU19BR0Q4NF9BTUdfem9uZV81MiJ9LAorICAgIHsyMDM1MywgIlBDU19BR0Q4NF9BTUdfem9uZV81MyJ9LAorICAgIHsyMDM1NCwgIlBDU19BR0Q4NF9BTUdfem9uZV81NCJ9LAorICAgIHsyMDM1NSwgIlBDU19BR0Q4NF9BTUdfem9uZV81NSJ9LAorICAgIHsyMDM1NiwgIlBDU19BR0Q4NF9BTUdfem9uZV81NiJ9LAorICAgIHsyMDM1NywgIlBDU19BR0Q4NF9BTUdfem9uZV81NyJ9LAorICAgIHsyMDM1OCwgIlBDU19BR0Q4NF9BTUdfem9uZV81OCJ9LAorICAgIHsyMDQzNywgIlBDU19BaW5fZWxfQWJkX1VUTV96b25lXzM3TiJ9LAorICAgIHsyMDQzOCwgIlBDU19BaW5fZWxfQWJkX1VUTV96b25lXzM4TiJ9LAorICAgIHsyMDQzOSwgIlBDU19BaW5fZWxfQWJkX1VUTV96b25lXzM5TiJ9LAorICAgIHsyMDQ5OSwgIlBDU19BaW5fZWxfQWJkX0JhaHJhaW5fR3JpZCJ9LAorICAgIHsyMDUzOCwgIlBDU19BZmdvb3llX1VUTV96b25lXzM4TiJ9LAorICAgIHsyMDUzOSwgIlBDU19BZmdvb3llX1VUTV96b25lXzM5TiJ9LAorICAgIHsyMDcwMCwgIlBDU19MaXNib25fUG9ydHVnZXNlX0dyaWQifSwKKyAgICB7MjA4MjIsICJQQ1NfQXJhdHVfVVRNX3pvbmVfMjJTIn0sCisgICAgezIwODIzLCAiUENTX0FyYXR1X1VUTV96b25lXzIzUyJ9LAorICAgIHsyMDgyNCwgIlBDU19BcmF0dV9VVE1fem9uZV8yNFMifSwKKyAgICB7MjA5NzMsICJQQ1NfQXJjXzE5NTBfTG8xMyJ9LAorICAgIHsyMDk3NSwgIlBDU19BcmNfMTk1MF9MbzE1In0sCisgICAgezIwOTc3LCAiUENTX0FyY18xOTUwX0xvMTcifSwKKyAgICB7MjA5NzksICJQQ1NfQXJjXzE5NTBfTG8xOSJ9LAorICAgIHsyMDk4MSwgIlBDU19BcmNfMTk1MF9MbzIxIn0sCisgICAgezIwOTgzLCAiUENTX0FyY18xOTUwX0xvMjMifSwKKyAgICB7MjA5ODUsICJQQ1NfQXJjXzE5NTBfTG8yNSJ9LAorICAgIHsyMDk4NywgIlBDU19BcmNfMTk1MF9MbzI3In0sCisgICAgezIwOTg5LCAiUENTX0FyY18xOTUwX0xvMjkifSwKKyAgICB7MjA5OTEsICJQQ1NfQXJjXzE5NTBfTG8zMSJ9LAorICAgIHsyMDk5MywgIlBDU19BcmNfMTk1MF9MbzMzIn0sCisgICAgezIwOTk1LCAiUENTX0FyY18xOTUwX0xvMzUifSwKKyAgICB7MjExMDAsICJQQ1NfQmF0YXZpYV9ORUlFWiJ9LAorICAgIHsyMTE0OCwgIlBDU19CYXRhdmlhX1VUTV96b25lXzQ4UyJ9LAorICAgIHsyMTE0OSwgIlBDU19CYXRhdmlhX1VUTV96b25lXzQ5UyJ9LAorICAgIHsyMTE1MCwgIlBDU19CYXRhdmlhX1VUTV96b25lXzUwUyJ9LAorICAgIHsyMTQxMywgIlBDU19CZWlqaW5nX0dhdXNzX3pvbmVfMTMifSwKKyAgICB7MjE0MTQsICJQQ1NfQmVpamluZ19HYXVzc196b25lXzE0In0sCisgICAgezIxNDE1LCAiUENTX0JlaWppbmdfR2F1c3Nfem9uZV8xNSJ9LAorICAgIHsyMTQxNiwgIlBDU19CZWlqaW5nX0dhdXNzX3pvbmVfMTYifSwKKyAgICB7MjE0MTcsICJQQ1NfQmVpamluZ19HYXVzc196b25lXzE3In0sCisgICAgezIxNDE4LCAiUENTX0JlaWppbmdfR2F1c3Nfem9uZV8xOCJ9LAorICAgIHsyMTQxOSwgIlBDU19CZWlqaW5nX0dhdXNzX3pvbmVfMTkifSwKKyAgICB7MjE0MjAsICJQQ1NfQmVpamluZ19HYXVzc196b25lXzIwIn0sCisgICAgezIxNDIxLCAiUENTX0JlaWppbmdfR2F1c3Nfem9uZV8yMSJ9LAorICAgIHsyMTQyMiwgIlBDU19CZWlqaW5nX0dhdXNzX3pvbmVfMjIifSwKKyAgICB7MjE0MjMsICJQQ1NfQmVpamluZ19HYXVzc196b25lXzIzIn0sCisgICAgezIxNDczLCAiUENTX0JlaWppbmdfR2F1c3NfMTNOIn0sCisgICAgezIxNDc0LCAiUENTX0JlaWppbmdfR2F1c3NfMTROIn0sCisgICAgezIxNDc1LCAiUENTX0JlaWppbmdfR2F1c3NfMTVOIn0sCisgICAgezIxNDc2LCAiUENTX0JlaWppbmdfR2F1c3NfMTZOIn0sCisgICAgezIxNDc3LCAiUENTX0JlaWppbmdfR2F1c3NfMTdOIn0sCisgICAgezIxNDc4LCAiUENTX0JlaWppbmdfR2F1c3NfMThOIn0sCisgICAgezIxNDc5LCAiUENTX0JlaWppbmdfR2F1c3NfMTlOIn0sCisgICAgezIxNDgwLCAiUENTX0JlaWppbmdfR2F1c3NfMjBOIn0sCisgICAgezIxNDgxLCAiUENTX0JlaWppbmdfR2F1c3NfMjFOIn0sCisgICAgezIxNDgyLCAiUENTX0JlaWppbmdfR2F1c3NfMjJOIn0sCisgICAgezIxNDgzLCAiUENTX0JlaWppbmdfR2F1c3NfMjNOIn0sCisgICAgezIxNTAwLCAiUENTX0JlbGdlX0xhbWJlcnRfNTAifSwKKyAgICB7MjE3OTAsICJQQ1NfQmVybl8xODk4X1N3aXNzX09sZCJ9LAorICAgIHsyMTgxNywgIlBDU19Cb2dvdGFfVVRNX3pvbmVfMTdOIn0sCisgICAgezIxODE4LCAiUENTX0JvZ290YV9VVE1fem9uZV8xOE4ifSwKKyAgICB7MjE4OTEsICJQQ1NfQm9nb3RhX0NvbG9tYmlhXzNXIn0sCisgICAgezIxODkyLCAiUENTX0JvZ290YV9Db2xvbWJpYV9Cb2dvdGEifSwKKyAgICB7MjE4OTMsICJQQ1NfQm9nb3RhX0NvbG9tYmlhXzNFIn0sCisgICAgezIxODk0LCAiUENTX0JvZ290YV9Db2xvbWJpYV82RSJ9LAorICAgIHsyMjAzMiwgIlBDU19DYW1hY3VwYV9VVE1fMzJTIn0sCisgICAgezIyMDMzLCAiUENTX0NhbWFjdXBhX1VUTV8zM1MifSwKKyAgICB7MjIxOTEsICJQQ1NfQ19JbmNoYXVzcGVfQXJnZW50aW5hXzEifSwKKyAgICB7MjIxOTIsICJQQ1NfQ19JbmNoYXVzcGVfQXJnZW50aW5hXzIifSwKKyAgICB7MjIxOTMsICJQQ1NfQ19JbmNoYXVzcGVfQXJnZW50aW5hXzMifSwKKyAgICB7MjIxOTQsICJQQ1NfQ19JbmNoYXVzcGVfQXJnZW50aW5hXzQifSwKKyAgICB7MjIxOTUsICJQQ1NfQ19JbmNoYXVzcGVfQXJnZW50aW5hXzUifSwKKyAgICB7MjIxOTYsICJQQ1NfQ19JbmNoYXVzcGVfQXJnZW50aW5hXzYifSwKKyAgICB7MjIxOTcsICJQQ1NfQ19JbmNoYXVzcGVfQXJnZW50aW5hXzcifSwKKyAgICB7MjIzMzIsICJQQ1NfQ2FydGhhZ2VfVVRNX3pvbmVfMzJOIn0sCisgICAgezIyMzkxLCAiUENTX0NhcnRoYWdlX05vcmRfVHVuaXNpZSJ9LAorICAgIHsyMjM5MiwgIlBDU19DYXJ0aGFnZV9TdWRfVHVuaXNpZSJ9LAorICAgIHsyMjUyMywgIlBDU19Db3JyZWdvX0FsZWdyZV9VVE1fMjNTIn0sCisgICAgezIyNTI0LCAiUENTX0NvcnJlZ29fQWxlZ3JlX1VUTV8yNFMifSwKKyAgICB7MjI4MzIsICJQQ1NfRG91YWxhX1VUTV96b25lXzMyTiJ9LAorICAgIHsyMjk5MiwgIlBDU19FZ3lwdF8xOTA3X1JlZF9CZWx0In0sCisgICAgezIyOTkzLCAiUENTX0VneXB0XzE5MDdfUHVycGxlX0JlbHQifSwKKyAgICB7MjI5OTQsICJQQ1NfRWd5cHRfMTkwN19FeHRfUHVycGxlIn0sCisgICAgezIzMDI4LCAiUENTX0VENTBfVVRNX3pvbmVfMjhOIn0sCisgICAgezIzMDI5LCAiUENTX0VENTBfVVRNX3pvbmVfMjlOIn0sCisgICAgezIzMDMwLCAiUENTX0VENTBfVVRNX3pvbmVfMzBOIn0sCisgICAgezIzMDMxLCAiUENTX0VENTBfVVRNX3pvbmVfMzFOIn0sCisgICAgezIzMDMyLCAiUENTX0VENTBfVVRNX3pvbmVfMzJOIn0sCisgICAgezIzMDMzLCAiUENTX0VENTBfVVRNX3pvbmVfMzNOIn0sCisgICAgezIzMDM0LCAiUENTX0VENTBfVVRNX3pvbmVfMzROIn0sCisgICAgezIzMDM1LCAiUENTX0VENTBfVVRNX3pvbmVfMzVOIn0sCisgICAgezIzMDM2LCAiUENTX0VENTBfVVRNX3pvbmVfMzZOIn0sCisgICAgezIzMDM3LCAiUENTX0VENTBfVVRNX3pvbmVfMzdOIn0sCisgICAgezIzMDM4LCAiUENTX0VENTBfVVRNX3pvbmVfMzhOIn0sCisgICAgezIzMjM5LCAiUENTX0ZhaHVkX1VUTV96b25lXzM5TiJ9LAorICAgIHsyMzI0MCwgIlBDU19GYWh1ZF9VVE1fem9uZV80ME4ifSwKKyAgICB7MjM0MzMsICJQQ1NfR2Fyb3VhX1VUTV96b25lXzMzTiJ9LAorICAgIHsyMzg0NiwgIlBDU19JRDc0X1VUTV96b25lXzQ2TiJ9LAorICAgIHsyMzg0NywgIlBDU19JRDc0X1VUTV96b25lXzQ3TiJ9LAorICAgIHsyMzg0OCwgIlBDU19JRDc0X1VUTV96b25lXzQ4TiJ9LAorICAgIHsyMzg0OSwgIlBDU19JRDc0X1VUTV96b25lXzQ5TiJ9LAorICAgIHsyMzg1MCwgIlBDU19JRDc0X1VUTV96b25lXzUwTiJ9LAorICAgIHsyMzg1MSwgIlBDU19JRDc0X1VUTV96b25lXzUxTiJ9LAorICAgIHsyMzg1MiwgIlBDU19JRDc0X1VUTV96b25lXzUyTiJ9LAorICAgIHsyMzg1MywgIlBDU19JRDc0X1VUTV96b25lXzUzTiJ9LAorICAgIHsyMzg4NiwgIlBDU19JRDc0X1VUTV96b25lXzQ2UyJ9LAorICAgIHsyMzg4NywgIlBDU19JRDc0X1VUTV96b25lXzQ3UyJ9LAorICAgIHsyMzg4OCwgIlBDU19JRDc0X1VUTV96b25lXzQ4UyJ9LAorICAgIHsyMzg4OSwgIlBDU19JRDc0X1VUTV96b25lXzQ5UyJ9LAorICAgIHsyMzg5MCwgIlBDU19JRDc0X1VUTV96b25lXzUwUyJ9LAorICAgIHsyMzg5MSwgIlBDU19JRDc0X1VUTV96b25lXzUxUyJ9LAorICAgIHsyMzg5MiwgIlBDU19JRDc0X1VUTV96b25lXzUyUyJ9LAorICAgIHsyMzg5MywgIlBDU19JRDc0X1VUTV96b25lXzUzUyJ9LAorICAgIHsyMzg5NCwgIlBDU19JRDc0X1VUTV96b25lXzU0UyJ9LAorICAgIHsyMzk0NywgIlBDU19JbmRpYW5fMTk1NF9VVE1fNDdOIn0sCisgICAgezIzOTQ4LCAiUENTX0luZGlhbl8xOTU0X1VUTV80OE4ifSwKKyAgICB7MjQwNDcsICJQQ1NfSW5kaWFuXzE5NzVfVVRNXzQ3TiJ9LAorICAgIHsyNDA0OCwgIlBDU19JbmRpYW5fMTk3NV9VVE1fNDhOIn0sCisgICAgezI0MTAwLCAiUENTX0phbWFpY2FfMTg3NV9PbGRfR3JpZCJ9LAorICAgIHsyNDIwMCwgIlBDU19KQUQ2OV9KYW1haWNhX0dyaWQifSwKKyAgICB7MjQzNzAsICJQQ1NfS2FsaWFucHVyX0luZGlhXzAifSwKKyAgICB7MjQzNzEsICJQQ1NfS2FsaWFucHVyX0luZGlhX0kifSwKKyAgICB7MjQzNzIsICJQQ1NfS2FsaWFucHVyX0luZGlhX0lJYSJ9LAorICAgIHsyNDM3MywgIlBDU19LYWxpYW5wdXJfSW5kaWFfSUlJYSJ9LAorICAgIHsyNDM3NCwgIlBDU19LYWxpYW5wdXJfSW5kaWFfSVZhIn0sCisgICAgezI0MzgyLCAiUENTX0thbGlhbnB1cl9JbmRpYV9JSWIifSwKKyAgICB7MjQzODMsICJQQ1NfS2FsaWFucHVyX0luZGlhX0lJSWIifSwKKyAgICB7MjQzODQsICJQQ1NfS2FsaWFucHVyX0luZGlhX0lWYiJ9LAorICAgIHsyNDUwMCwgIlBDU19LZXJ0YXVfU2luZ2Fwb3JlX0dyaWQifSwKKyAgICB7MjQ1NDcsICJQQ1NfS2VydGF1X1VUTV96b25lXzQ3TiJ9LAorICAgIHsyNDU0OCwgIlBDU19LZXJ0YXVfVVRNX3pvbmVfNDhOIn0sCisgICAgezI0NzIwLCAiUENTX0xhX0Nhbm9hX1VUTV96b25lXzIwTiJ9LAorICAgIHsyNDcyMSwgIlBDU19MYV9DYW5vYV9VVE1fem9uZV8yMU4ifSwKKyAgICB7MjQ4MTgsICJQQ1NfUFNBRDU2X1VUTV96b25lXzE4TiJ9LAorICAgIHsyNDgxOSwgIlBDU19QU0FENTZfVVRNX3pvbmVfMTlOIn0sCisgICAgezI0ODIwLCAiUENTX1BTQUQ1Nl9VVE1fem9uZV8yME4ifSwKKyAgICB7MjQ4MjEsICJQQ1NfUFNBRDU2X1VUTV96b25lXzIxTiJ9LAorICAgIHsyNDg3NywgIlBDU19QU0FENTZfVVRNX3pvbmVfMTdTIn0sCisgICAgezI0ODc4LCAiUENTX1BTQUQ1Nl9VVE1fem9uZV8xOFMifSwKKyAgICB7MjQ4NzksICJQQ1NfUFNBRDU2X1VUTV96b25lXzE5UyJ9LAorICAgIHsyNDg4MCwgIlBDU19QU0FENTZfVVRNX3pvbmVfMjBTIn0sCisgICAgezI0ODkxLCAiUENTX1BTQUQ1Nl9QZXJ1X3dlc3Rfem9uZSJ9LAorICAgIHsyNDg5MiwgIlBDU19QU0FENTZfUGVydV9jZW50cmFsIn0sCisgICAgezI0ODkzLCAiUENTX1BTQUQ1Nl9QZXJ1X2Vhc3Rfem9uZSJ9LAorICAgIHsyNTAwMCwgIlBDU19MZWlnb25fR2hhbmFfR3JpZCJ9LAorICAgIHsyNTIzMSwgIlBDU19Mb21lX1VUTV96b25lXzMxTiJ9LAorICAgIHsyNTM5MSwgIlBDU19MdXpvbl9QaGlsaXBwaW5lc19JIn0sCisgICAgezI1MzkyLCAiUENTX0x1em9uX1BoaWxpcHBpbmVzX0lJIn0sCisgICAgezI1MzkzLCAiUENTX0x1em9uX1BoaWxpcHBpbmVzX0lJSSJ9LAorICAgIHsyNTM5NCwgIlBDU19MdXpvbl9QaGlsaXBwaW5lc19JViJ9LAorICAgIHsyNTM5NSwgIlBDU19MdXpvbl9QaGlsaXBwaW5lc19WIn0sCisgICAgezI1NzAwLCAiUENTX01ha2Fzc2FyX05FSUVaIn0sCisgICAgezI1OTMyLCAiUENTX01hbG9uZ29fMTk4N19VVE1fMzJTIn0sCisgICAgezI2MTkxLCAiUENTX01lcmNoaWNoX05vcmRfTWFyb2MifSwKKyAgICB7MjYxOTIsICJQQ1NfTWVyY2hpY2hfU3VkX01hcm9jIn0sCisgICAgezI2MTkzLCAiUENTX01lcmNoaWNoX1NhaGFyYSJ9LAorICAgIHsyNjIzNywgIlBDU19NYXNzYXdhX1VUTV96b25lXzM3TiJ9LAorICAgIHsyNjMzMSwgIlBDU19NaW5uYV9VVE1fem9uZV8zMU4ifSwKKyAgICB7MjYzMzIsICJQQ1NfTWlubmFfVVRNX3pvbmVfMzJOIn0sCisgICAgezI2MzkxLCAiUENTX01pbm5hX05pZ2VyaWFfV2VzdCJ9LAorICAgIHsyNjM5MiwgIlBDU19NaW5uYV9OaWdlcmlhX01pZF9CZWx0In0sCisgICAgezI2MzkzLCAiUENTX01pbm5hX05pZ2VyaWFfRWFzdCJ9LAorICAgIHsyNjQzMiwgIlBDU19NaGFzdF9VVE1fem9uZV8zMlMifSwKKyAgICB7MjY1OTEsICJQQ1NfTW9udGVfTWFyaW9fSXRhbHlfMSJ9LAorICAgIHsyNjU5MiwgIlBDU19Nb250ZV9NYXJpb19JdGFseV8yIn0sCisgICAgezI2NjMyLCAiUENTX01fcG9yYWxva29fVVRNXzMyTiJ9LAorICAgIHsyNjY5MiwgIlBDU19NX3BvcmFsb2tvX1VUTV8zMlMifSwKKyAgICB7MjY3MDMsICJQQ1NfTkFEMjdfVVRNX3pvbmVfM04ifSwKKyAgICB7MjY3MDQsICJQQ1NfTkFEMjdfVVRNX3pvbmVfNE4ifSwKKyAgICB7MjY3MDUsICJQQ1NfTkFEMjdfVVRNX3pvbmVfNU4ifSwKKyAgICB7MjY3MDYsICJQQ1NfTkFEMjdfVVRNX3pvbmVfNk4ifSwKKyAgICB7MjY3MDcsICJQQ1NfTkFEMjdfVVRNX3pvbmVfN04ifSwKKyAgICB7MjY3MDgsICJQQ1NfTkFEMjdfVVRNX3pvbmVfOE4ifSwKKyAgICB7MjY3MDksICJQQ1NfTkFEMjdfVVRNX3pvbmVfOU4ifSwKKyAgICB7MjY3MTAsICJQQ1NfTkFEMjdfVVRNX3pvbmVfMTBOIn0sCisgICAgezI2NzExLCAiUENTX05BRDI3X1VUTV96b25lXzExTiJ9LAorICAgIHsyNjcxMiwgIlBDU19OQUQyN19VVE1fem9uZV8xMk4ifSwKKyAgICB7MjY3MTMsICJQQ1NfTkFEMjdfVVRNX3pvbmVfMTNOIn0sCisgICAgezI2NzE0LCAiUENTX05BRDI3X1VUTV96b25lXzE0TiJ9LAorICAgIHsyNjcxNSwgIlBDU19OQUQyN19VVE1fem9uZV8xNU4ifSwKKyAgICB7MjY3MTYsICJQQ1NfTkFEMjdfVVRNX3pvbmVfMTZOIn0sCisgICAgezI2NzE3LCAiUENTX05BRDI3X1VUTV96b25lXzE3TiJ9LAorICAgIHsyNjcxOCwgIlBDU19OQUQyN19VVE1fem9uZV8xOE4ifSwKKyAgICB7MjY3MTksICJQQ1NfTkFEMjdfVVRNX3pvbmVfMTlOIn0sCisgICAgezI2NzIwLCAiUENTX05BRDI3X1VUTV96b25lXzIwTiJ9LAorICAgIHsyNjcyMSwgIlBDU19OQUQyN19VVE1fem9uZV8yMU4ifSwKKyAgICB7MjY3MjIsICJQQ1NfTkFEMjdfVVRNX3pvbmVfMjJOIn0sCisgICAgezI2NzI5LCAiUENTX05BRDI3X0FsYWJhbWFfRWFzdCJ9LAorICAgIHsyNjczMCwgIlBDU19OQUQyN19BbGFiYW1hX1dlc3QifSwKKyAgICB7MjY3MzEsICJQQ1NfTkFEMjdfQWxhc2thX3pvbmVfMSJ9LAorICAgIHsyNjczMiwgIlBDU19OQUQyN19BbGFza2Ffem9uZV8yIn0sCisgICAgezI2NzMzLCAiUENTX05BRDI3X0FsYXNrYV96b25lXzMifSwKKyAgICB7MjY3MzQsICJQQ1NfTkFEMjdfQWxhc2thX3pvbmVfNCJ9LAorICAgIHsyNjczNSwgIlBDU19OQUQyN19BbGFza2Ffem9uZV81In0sCisgICAgezI2NzM2LCAiUENTX05BRDI3X0FsYXNrYV96b25lXzYifSwKKyAgICB7MjY3MzcsICJQQ1NfTkFEMjdfQWxhc2thX3pvbmVfNyJ9LAorICAgIHsyNjczOCwgIlBDU19OQUQyN19BbGFza2Ffem9uZV84In0sCisgICAgezI2NzM5LCAiUENTX05BRDI3X0FsYXNrYV96b25lXzkifSwKKyAgICB7MjY3NDAsICJQQ1NfTkFEMjdfQWxhc2thX3pvbmVfMTAifSwKKyAgICB7MjY3NDEsICJQQ1NfTkFEMjdfQ2FsaWZvcm5pYV9JIn0sCisgICAgezI2NzQyLCAiUENTX05BRDI3X0NhbGlmb3JuaWFfSUkifSwKKyAgICB7MjY3NDMsICJQQ1NfTkFEMjdfQ2FsaWZvcm5pYV9JSUkifSwKKyAgICB7MjY3NDQsICJQQ1NfTkFEMjdfQ2FsaWZvcm5pYV9JViJ9LAorICAgIHsyNjc0NSwgIlBDU19OQUQyN19DYWxpZm9ybmlhX1YifSwKKyAgICB7MjY3NDYsICJQQ1NfTkFEMjdfQ2FsaWZvcm5pYV9WSSJ9LAorICAgIHsyNjc0NywgIlBDU19OQUQyN19DYWxpZm9ybmlhX1ZJSSJ9LAorICAgIHsyNjc0OCwgIlBDU19OQUQyN19Bcml6b25hX0Vhc3QifSwKKyAgICB7MjY3NDksICJQQ1NfTkFEMjdfQXJpem9uYV9DZW50cmFsIn0sCisgICAgezI2NzUwLCAiUENTX05BRDI3X0FyaXpvbmFfV2VzdCJ9LAorICAgIHsyNjc1MSwgIlBDU19OQUQyN19BcmthbnNhc19Ob3J0aCJ9LAorICAgIHsyNjc1MiwgIlBDU19OQUQyN19BcmthbnNhc19Tb3V0aCJ9LAorICAgIHsyNjc1MywgIlBDU19OQUQyN19Db2xvcmFkb19Ob3J0aCJ9LAorICAgIHsyNjc1NCwgIlBDU19OQUQyN19Db2xvcmFkb19DZW50cmFsIn0sCisgICAgezI2NzU1LCAiUENTX05BRDI3X0NvbG9yYWRvX1NvdXRoIn0sCisgICAgezI2NzU2LCAiUENTX05BRDI3X0Nvbm5lY3RpY3V0In0sCisgICAgezI2NzU3LCAiUENTX05BRDI3X0RlbGF3YXJlIn0sCisgICAgezI2NzU4LCAiUENTX05BRDI3X0Zsb3JpZGFfRWFzdCJ9LAorICAgIHsyNjc1OSwgIlBDU19OQUQyN19GbG9yaWRhX1dlc3QifSwKKyAgICB7MjY3NjAsICJQQ1NfTkFEMjdfRmxvcmlkYV9Ob3J0aCJ9LAorICAgIHsyNjc2MSwgIlBDU19OQUQyN19IYXdhaWlfem9uZV8xIn0sCisgICAgezI2NzYyLCAiUENTX05BRDI3X0hhd2FpaV96b25lXzIifSwKKyAgICB7MjY3NjMsICJQQ1NfTkFEMjdfSGF3YWlpX3pvbmVfMyJ9LAorICAgIHsyNjc2NCwgIlBDU19OQUQyN19IYXdhaWlfem9uZV80In0sCisgICAgezI2NzY1LCAiUENTX05BRDI3X0hhd2FpaV96b25lXzUifSwKKyAgICB7MjY3NjYsICJQQ1NfTkFEMjdfR2VvcmdpYV9FYXN0In0sCisgICAgezI2NzY3LCAiUENTX05BRDI3X0dlb3JnaWFfV2VzdCJ9LAorICAgIHsyNjc2OCwgIlBDU19OQUQyN19JZGFob19FYXN0In0sCisgICAgezI2NzY5LCAiUENTX05BRDI3X0lkYWhvX0NlbnRyYWwifSwKKyAgICB7MjY3NzAsICJQQ1NfTkFEMjdfSWRhaG9fV2VzdCJ9LAorICAgIHsyNjc3MSwgIlBDU19OQUQyN19JbGxpbm9pc19FYXN0In0sCisgICAgezI2NzcyLCAiUENTX05BRDI3X0lsbGlub2lzX1dlc3QifSwKKyAgICB7MjY3NzMsICJQQ1NfTkFEMjdfSW5kaWFuYV9FYXN0In0sCisgICAgezI2Nzc0LCAiUENTX05BRDI3X0JMTV8xNE5fZmVldCJ9LAorICAgIHsyNjc3NCwgIlBDU19OQUQyN19JbmRpYW5hX1dlc3QifSwKKyAgICB7MjY3NzUsICJQQ1NfTkFEMjdfQkxNXzE1Tl9mZWV0In0sCisgICAgezI2Nzc1LCAiUENTX05BRDI3X0lvd2FfTm9ydGgifSwKKyAgICB7MjY3NzYsICJQQ1NfTkFEMjdfQkxNXzE2Tl9mZWV0In0sCisgICAgezI2Nzc2LCAiUENTX05BRDI3X0lvd2FfU291dGgifSwKKyAgICB7MjY3NzcsICJQQ1NfTkFEMjdfQkxNXzE3Tl9mZWV0In0sCisgICAgezI2Nzc3LCAiUENTX05BRDI3X0thbnNhc19Ob3J0aCJ9LAorICAgIHsyNjc3OCwgIlBDU19OQUQyN19LYW5zYXNfU291dGgifSwKKyAgICB7MjY3NzksICJQQ1NfTkFEMjdfS2VudHVja3lfTm9ydGgifSwKKyAgICB7MjY3ODAsICJQQ1NfTkFEMjdfS2VudHVja3lfU291dGgifSwKKyAgICB7MjY3ODEsICJQQ1NfTkFEMjdfTG91aXNpYW5hX05vcnRoIn0sCisgICAgezI2NzgyLCAiUENTX05BRDI3X0xvdWlzaWFuYV9Tb3V0aCJ9LAorICAgIHsyNjc4MywgIlBDU19OQUQyN19NYWluZV9FYXN0In0sCisgICAgezI2Nzg0LCAiUENTX05BRDI3X01haW5lX1dlc3QifSwKKyAgICB7MjY3ODUsICJQQ1NfTkFEMjdfTWFyeWxhbmQifSwKKyAgICB7MjY3ODYsICJQQ1NfTkFEMjdfTWFzc2FjaHVzZXR0cyJ9LAorICAgIHsyNjc4NywgIlBDU19OQUQyN19NYXNzYWNodXNldHRzX0lzIn0sCisgICAgezI2Nzg4LCAiUENTX05BRDI3X01pY2hpZ2FuX05vcnRoIn0sCisgICAgezI2Nzg5LCAiUENTX05BRDI3X01pY2hpZ2FuX0NlbnRyYWwifSwKKyAgICB7MjY3OTAsICJQQ1NfTkFEMjdfTWljaGlnYW5fU291dGgifSwKKyAgICB7MjY3OTEsICJQQ1NfTkFEMjdfTWlubmVzb3RhX05vcnRoIn0sCisgICAgezI2NzkyLCAiUENTX05BRDI3X01pbm5lc290YV9DZW50In0sCisgICAgezI2NzkzLCAiUENTX05BRDI3X01pbm5lc290YV9Tb3V0aCJ9LAorICAgIHsyNjc5NCwgIlBDU19OQUQyN19NaXNzaXNzaXBwaV9FYXN0In0sCisgICAgezI2Nzk1LCAiUENTX05BRDI3X01pc3Npc3NpcHBpX1dlc3QifSwKKyAgICB7MjY3OTYsICJQQ1NfTkFEMjdfTWlzc291cmlfRWFzdCJ9LAorICAgIHsyNjc5NywgIlBDU19OQUQyN19NaXNzb3VyaV9DZW50cmFsIn0sCisgICAgezI2Nzk4LCAiUENTX05BRDI3X01pc3NvdXJpX1dlc3QifSwKKyAgICB7MjY4MDEsICJQQ1NfTkFEX01pY2hpZ2FuX01pY2hpZ2FuX0Vhc3QifSwKKyAgICB7MjY4MDIsICJQQ1NfTkFEX01pY2hpZ2FuX01pY2hpZ2FuX09sZF9DZW50cmFsIn0sCisgICAgezI2ODAzLCAiUENTX05BRF9NaWNoaWdhbl9NaWNoaWdhbl9XZXN0In0sCisgICAgezI2OTAzLCAiUENTX05BRDgzX1VUTV96b25lXzNOIn0sCisgICAgezI2OTA0LCAiUENTX05BRDgzX1VUTV96b25lXzROIn0sCisgICAgezI2OTA1LCAiUENTX05BRDgzX1VUTV96b25lXzVOIn0sCisgICAgezI2OTA2LCAiUENTX05BRDgzX1VUTV96b25lXzZOIn0sCisgICAgezI2OTA3LCAiUENTX05BRDgzX1VUTV96b25lXzdOIn0sCisgICAgezI2OTA4LCAiUENTX05BRDgzX1VUTV96b25lXzhOIn0sCisgICAgezI2OTA5LCAiUENTX05BRDgzX1VUTV96b25lXzlOIn0sCisgICAgezI2OTEwLCAiUENTX05BRDgzX1VUTV96b25lXzEwTiJ9LAorICAgIHsyNjkxMSwgIlBDU19OQUQ4M19VVE1fem9uZV8xMU4ifSwKKyAgICB7MjY5MTIsICJQQ1NfTkFEODNfVVRNX3pvbmVfMTJOIn0sCisgICAgezI2OTEzLCAiUENTX05BRDgzX1VUTV96b25lXzEzTiJ9LAorICAgIHsyNjkxNCwgIlBDU19OQUQ4M19VVE1fem9uZV8xNE4ifSwKKyAgICB7MjY5MTUsICJQQ1NfTkFEODNfVVRNX3pvbmVfMTVOIn0sCisgICAgezI2OTE2LCAiUENTX05BRDgzX1VUTV96b25lXzE2TiJ9LAorICAgIHsyNjkxNywgIlBDU19OQUQ4M19VVE1fem9uZV8xN04ifSwKKyAgICB7MjY5MTgsICJQQ1NfTkFEODNfVVRNX3pvbmVfMThOIn0sCisgICAgezI2OTE5LCAiUENTX05BRDgzX1VUTV96b25lXzE5TiJ9LAorICAgIHsyNjkyMCwgIlBDU19OQUQ4M19VVE1fem9uZV8yME4ifSwKKyAgICB7MjY5MjEsICJQQ1NfTkFEODNfVVRNX3pvbmVfMjFOIn0sCisgICAgezI2OTIyLCAiUENTX05BRDgzX1VUTV96b25lXzIyTiJ9LAorICAgIHsyNjkyMywgIlBDU19OQUQ4M19VVE1fem9uZV8yM04ifSwKKyAgICB7MjY5MjksICJQQ1NfTkFEODNfQWxhYmFtYV9FYXN0In0sCisgICAgezI2OTMwLCAiUENTX05BRDgzX0FsYWJhbWFfV2VzdCJ9LAorICAgIHsyNjkzMSwgIlBDU19OQUQ4M19BbGFza2Ffem9uZV8xIn0sCisgICAgezI2OTMyLCAiUENTX05BRDgzX0FsYXNrYV96b25lXzIifSwKKyAgICB7MjY5MzMsICJQQ1NfTkFEODNfQWxhc2thX3pvbmVfMyJ9LAorICAgIHsyNjkzNCwgIlBDU19OQUQ4M19BbGFza2Ffem9uZV80In0sCisgICAgezI2OTM1LCAiUENTX05BRDgzX0FsYXNrYV96b25lXzUifSwKKyAgICB7MjY5MzYsICJQQ1NfTkFEODNfQWxhc2thX3pvbmVfNiJ9LAorICAgIHsyNjkzNywgIlBDU19OQUQ4M19BbGFza2Ffem9uZV83In0sCisgICAgezI2OTM4LCAiUENTX05BRDgzX0FsYXNrYV96b25lXzgifSwKKyAgICB7MjY5MzksICJQQ1NfTkFEODNfQWxhc2thX3pvbmVfOSJ9LAorICAgIHsyNjk0MCwgIlBDU19OQUQ4M19BbGFza2Ffem9uZV8xMCJ9LAorICAgIHsyNjk0MSwgIlBDU19OQUQ4M19DYWxpZm9ybmlhXzEifSwKKyAgICB7MjY5NDIsICJQQ1NfTkFEODNfQ2FsaWZvcm5pYV8yIn0sCisgICAgezI2OTQzLCAiUENTX05BRDgzX0NhbGlmb3JuaWFfMyJ9LAorICAgIHsyNjk0NCwgIlBDU19OQUQ4M19DYWxpZm9ybmlhXzQifSwKKyAgICB7MjY5NDUsICJQQ1NfTkFEODNfQ2FsaWZvcm5pYV81In0sCisgICAgezI2OTQ2LCAiUENTX05BRDgzX0NhbGlmb3JuaWFfNiJ9LAorICAgIHsyNjk0OCwgIlBDU19OQUQ4M19Bcml6b25hX0Vhc3QifSwKKyAgICB7MjY5NDksICJQQ1NfTkFEODNfQXJpem9uYV9DZW50cmFsIn0sCisgICAgezI2OTUwLCAiUENTX05BRDgzX0FyaXpvbmFfV2VzdCJ9LAorICAgIHsyNjk1MSwgIlBDU19OQUQ4M19BcmthbnNhc19Ob3J0aCJ9LAorICAgIHsyNjk1MiwgIlBDU19OQUQ4M19BcmthbnNhc19Tb3V0aCJ9LAorICAgIHsyNjk1MywgIlBDU19OQUQ4M19Db2xvcmFkb19Ob3J0aCJ9LAorICAgIHsyNjk1NCwgIlBDU19OQUQ4M19Db2xvcmFkb19DZW50cmFsIn0sCisgICAgezI2OTU1LCAiUENTX05BRDgzX0NvbG9yYWRvX1NvdXRoIn0sCisgICAgezI2OTU2LCAiUENTX05BRDgzX0Nvbm5lY3RpY3V0In0sCisgICAgezI2OTU3LCAiUENTX05BRDgzX0RlbGF3YXJlIn0sCisgICAgezI2OTU4LCAiUENTX05BRDgzX0Zsb3JpZGFfRWFzdCJ9LAorICAgIHsyNjk1OSwgIlBDU19OQUQ4M19GbG9yaWRhX1dlc3QifSwKKyAgICB7MjY5NjAsICJQQ1NfTkFEODNfRmxvcmlkYV9Ob3J0aCJ9LAorICAgIHsyNjk2MSwgIlBDU19OQUQ4M19IYXdhaWlfem9uZV8xIn0sCisgICAgezI2OTYyLCAiUENTX05BRDgzX0hhd2FpaV96b25lXzIifSwKKyAgICB7MjY5NjMsICJQQ1NfTkFEODNfSGF3YWlpX3pvbmVfMyJ9LAorICAgIHsyNjk2NCwgIlBDU19OQUQ4M19IYXdhaWlfem9uZV80In0sCisgICAgezI2OTY1LCAiUENTX05BRDgzX0hhd2FpaV96b25lXzUifSwKKyAgICB7MjY5NjYsICJQQ1NfTkFEODNfR2VvcmdpYV9FYXN0In0sCisgICAgezI2OTY3LCAiUENTX05BRDgzX0dlb3JnaWFfV2VzdCJ9LAorICAgIHsyNjk2OCwgIlBDU19OQUQ4M19JZGFob19FYXN0In0sCisgICAgezI2OTY5LCAiUENTX05BRDgzX0lkYWhvX0NlbnRyYWwifSwKKyAgICB7MjY5NzAsICJQQ1NfTkFEODNfSWRhaG9fV2VzdCJ9LAorICAgIHsyNjk3MSwgIlBDU19OQUQ4M19JbGxpbm9pc19FYXN0In0sCisgICAgezI2OTcyLCAiUENTX05BRDgzX0lsbGlub2lzX1dlc3QifSwKKyAgICB7MjY5NzMsICJQQ1NfTkFEODNfSW5kaWFuYV9FYXN0In0sCisgICAgezI2OTc0LCAiUENTX05BRDgzX0luZGlhbmFfV2VzdCJ9LAorICAgIHsyNjk3NSwgIlBDU19OQUQ4M19Jb3dhX05vcnRoIn0sCisgICAgezI2OTc2LCAiUENTX05BRDgzX0lvd2FfU291dGgifSwKKyAgICB7MjY5NzcsICJQQ1NfTkFEODNfS2Fuc2FzX05vcnRoIn0sCisgICAgezI2OTc4LCAiUENTX05BRDgzX0thbnNhc19Tb3V0aCJ9LAorICAgIHsyNjk3OSwgIlBDU19OQUQ4M19LZW50dWNreV9Ob3J0aCJ9LAorICAgIHsyNjk4MCwgIlBDU19OQUQ4M19LZW50dWNreV9Tb3V0aCJ9LAorICAgIHsyNjk4MSwgIlBDU19OQUQ4M19Mb3Vpc2lhbmFfTm9ydGgifSwKKyAgICB7MjY5ODIsICJQQ1NfTkFEODNfTG91aXNpYW5hX1NvdXRoIn0sCisgICAgezI2OTgzLCAiUENTX05BRDgzX01haW5lX0Vhc3QifSwKKyAgICB7MjY5ODQsICJQQ1NfTkFEODNfTWFpbmVfV2VzdCJ9LAorICAgIHsyNjk4NSwgIlBDU19OQUQ4M19NYXJ5bGFuZCJ9LAorICAgIHsyNjk4NiwgIlBDU19OQUQ4M19NYXNzYWNodXNldHRzIn0sCisgICAgezI2OTg3LCAiUENTX05BRDgzX01hc3NhY2h1c2V0dHNfSXMifSwKKyAgICB7MjY5ODgsICJQQ1NfTkFEODNfTWljaGlnYW5fTm9ydGgifSwKKyAgICB7MjY5ODksICJQQ1NfTkFEODNfTWljaGlnYW5fQ2VudHJhbCJ9LAorICAgIHsyNjk5MCwgIlBDU19OQUQ4M19NaWNoaWdhbl9Tb3V0aCJ9LAorICAgIHsyNjk5MSwgIlBDU19OQUQ4M19NaW5uZXNvdGFfTm9ydGgifSwKKyAgICB7MjY5OTIsICJQQ1NfTkFEODNfTWlubmVzb3RhX0NlbnQifSwKKyAgICB7MjY5OTMsICJQQ1NfTkFEODNfTWlubmVzb3RhX1NvdXRoIn0sCisgICAgezI2OTk0LCAiUENTX05BRDgzX01pc3Npc3NpcHBpX0Vhc3QifSwKKyAgICB7MjY5OTUsICJQQ1NfTkFEODNfTWlzc2lzc2lwcGlfV2VzdCJ9LAorICAgIHsyNjk5NiwgIlBDU19OQUQ4M19NaXNzb3VyaV9FYXN0In0sCisgICAgezI2OTk3LCAiUENTX05BRDgzX01pc3NvdXJpX0NlbnRyYWwifSwKKyAgICB7MjY5OTgsICJQQ1NfTkFEODNfTWlzc291cmlfV2VzdCJ9LAorICAgIHsyNzAzOCwgIlBDU19OYWhyd2FuXzE5NjdfVVRNXzM4TiJ9LAorICAgIHsyNzAzOSwgIlBDU19OYWhyd2FuXzE5NjdfVVRNXzM5TiJ9LAorICAgIHsyNzA0MCwgIlBDU19OYWhyd2FuXzE5NjdfVVRNXzQwTiJ9LAorICAgIHsyNzEyMCwgIlBDU19OYXBhcmltYV9VVE1fMjBOIn0sCisgICAgezI3MjAwLCAiUENTX0dENDlfTlpfTWFwX0dyaWQifSwKKyAgICB7MjcyOTEsICJQQ1NfR0Q0OV9Ob3J0aF9Jc2xhbmRfR3JpZCJ9LAorICAgIHsyNzI5MiwgIlBDU19HRDQ5X1NvdXRoX0lzbGFuZF9HcmlkIn0sCisgICAgezI3NDI5LCAiUENTX0RhdHVtXzczX1VUTV96b25lXzI5TiJ9LAorICAgIHsyNzUwMCwgIlBDU19BVEZfTm9yZF9kZV9HdWVycmUifSwKKyAgICB7Mjc1ODEsICJQQ1NfTlRGX0ZyYW5jZV9JIn0sCisgICAgezI3NTgyLCAiUENTX05URl9GcmFuY2VfSUkifSwKKyAgICB7Mjc1ODMsICJQQ1NfTlRGX0ZyYW5jZV9JSUkifSwKKyAgICB7Mjc1OTEsICJQQ1NfTlRGX05vcmRfRnJhbmNlIn0sCisgICAgezI3NTkyLCAiUENTX05URl9DZW50cmVfRnJhbmNlIn0sCisgICAgezI3NTkzLCAiUENTX05URl9TdWRfRnJhbmNlIn0sCisgICAgezI3NzAwLCAiUENTX0JyaXRpc2hfTmF0aW9uYWxfR3JpZCJ9LAorICAgIHsyODIzMiwgIlBDU19Qb2ludF9Ob2lyZV9VVE1fMzJTIn0sCisgICAgezI4MzQ4LCAiUENTX0dEQTk0X01HQV96b25lXzQ4In0sCisgICAgezI4MzQ5LCAiUENTX0dEQTk0X01HQV96b25lXzQ5In0sCisgICAgezI4MzUwLCAiUENTX0dEQTk0X01HQV96b25lXzUwIn0sCisgICAgezI4MzUxLCAiUENTX0dEQTk0X01HQV96b25lXzUxIn0sCisgICAgezI4MzUyLCAiUENTX0dEQTk0X01HQV96b25lXzUyIn0sCisgICAgezI4MzUzLCAiUENTX0dEQTk0X01HQV96b25lXzUzIn0sCisgICAgezI4MzU0LCAiUENTX0dEQTk0X01HQV96b25lXzU0In0sCisgICAgezI4MzU1LCAiUENTX0dEQTk0X01HQV96b25lXzU1In0sCisgICAgezI4MzU2LCAiUENTX0dEQTk0X01HQV96b25lXzU2In0sCisgICAgezI4MzU3LCAiUENTX0dEQTk0X01HQV96b25lXzU3In0sCisgICAgezI4MzU4LCAiUENTX0dEQTk0X01HQV96b25lXzU4In0sCisgICAgezI4NDA0LCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV80In0sCisgICAgezI4NDA1LCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV81In0sCisgICAgezI4NDA2LCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV82In0sCisgICAgezI4NDA3LCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV83In0sCisgICAgezI4NDA4LCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV84In0sCisgICAgezI4NDA5LCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV85In0sCisgICAgezI4NDEwLCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV8xMCJ9LAorICAgIHsyODQxMSwgIlBDU19QdWxrb3ZvX0dhdXNzX3pvbmVfMTEifSwKKyAgICB7Mjg0MTIsICJQQ1NfUHVsa292b19HYXVzc196b25lXzEyIn0sCisgICAgezI4NDEzLCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV8xMyJ9LAorICAgIHsyODQxNCwgIlBDU19QdWxrb3ZvX0dhdXNzX3pvbmVfMTQifSwKKyAgICB7Mjg0MTUsICJQQ1NfUHVsa292b19HYXVzc196b25lXzE1In0sCisgICAgezI4NDE2LCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV8xNiJ9LAorICAgIHsyODQxNywgIlBDU19QdWxrb3ZvX0dhdXNzX3pvbmVfMTcifSwKKyAgICB7Mjg0MTgsICJQQ1NfUHVsa292b19HYXVzc196b25lXzE4In0sCisgICAgezI4NDE5LCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV8xOSJ9LAorICAgIHsyODQyMCwgIlBDU19QdWxrb3ZvX0dhdXNzX3pvbmVfMjAifSwKKyAgICB7Mjg0MjEsICJQQ1NfUHVsa292b19HYXVzc196b25lXzIxIn0sCisgICAgezI4NDIyLCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV8yMiJ9LAorICAgIHsyODQyMywgIlBDU19QdWxrb3ZvX0dhdXNzX3pvbmVfMjMifSwKKyAgICB7Mjg0MjQsICJQQ1NfUHVsa292b19HYXVzc196b25lXzI0In0sCisgICAgezI4NDI1LCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV8yNSJ9LAorICAgIHsyODQyNiwgIlBDU19QdWxrb3ZvX0dhdXNzX3pvbmVfMjYifSwKKyAgICB7Mjg0MjcsICJQQ1NfUHVsa292b19HYXVzc196b25lXzI3In0sCisgICAgezI4NDI4LCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV8yOCJ9LAorICAgIHsyODQyOSwgIlBDU19QdWxrb3ZvX0dhdXNzX3pvbmVfMjkifSwKKyAgICB7Mjg0MzAsICJQQ1NfUHVsa292b19HYXVzc196b25lXzMwIn0sCisgICAgezI4NDMxLCAiUENTX1B1bGtvdm9fR2F1c3Nfem9uZV8zMSJ9LAorICAgIHsyODQzMiwgIlBDU19QdWxrb3ZvX0dhdXNzX3pvbmVfMzIifSwKKyAgICB7Mjg0NjQsICJQQ1NfUHVsa292b19HYXVzc180TiJ9LAorICAgIHsyODQ2NSwgIlBDU19QdWxrb3ZvX0dhdXNzXzVOIn0sCisgICAgezI4NDY2LCAiUENTX1B1bGtvdm9fR2F1c3NfNk4ifSwKKyAgICB7Mjg0NjcsICJQQ1NfUHVsa292b19HYXVzc183TiJ9LAorICAgIHsyODQ2OCwgIlBDU19QdWxrb3ZvX0dhdXNzXzhOIn0sCisgICAgezI4NDY5LCAiUENTX1B1bGtvdm9fR2F1c3NfOU4ifSwKKyAgICB7Mjg0NzAsICJQQ1NfUHVsa292b19HYXVzc18xME4ifSwKKyAgICB7Mjg0NzEsICJQQ1NfUHVsa292b19HYXVzc18xMU4ifSwKKyAgICB7Mjg0NzIsICJQQ1NfUHVsa292b19HYXVzc18xMk4ifSwKKyAgICB7Mjg0NzMsICJQQ1NfUHVsa292b19HYXVzc18xM04ifSwKKyAgICB7Mjg0NzQsICJQQ1NfUHVsa292b19HYXVzc18xNE4ifSwKKyAgICB7Mjg0NzUsICJQQ1NfUHVsa292b19HYXVzc18xNU4ifSwKKyAgICB7Mjg0NzYsICJQQ1NfUHVsa292b19HYXVzc18xNk4ifSwKKyAgICB7Mjg0NzcsICJQQ1NfUHVsa292b19HYXVzc18xN04ifSwKKyAgICB7Mjg0NzgsICJQQ1NfUHVsa292b19HYXVzc18xOE4ifSwKKyAgICB7Mjg0NzksICJQQ1NfUHVsa292b19HYXVzc18xOU4ifSwKKyAgICB7Mjg0ODAsICJQQ1NfUHVsa292b19HYXVzc18yME4ifSwKKyAgICB7Mjg0ODEsICJQQ1NfUHVsa292b19HYXVzc18yMU4ifSwKKyAgICB7Mjg0ODIsICJQQ1NfUHVsa292b19HYXVzc18yMk4ifSwKKyAgICB7Mjg0ODMsICJQQ1NfUHVsa292b19HYXVzc18yM04ifSwKKyAgICB7Mjg0ODQsICJQQ1NfUHVsa292b19HYXVzc18yNE4ifSwKKyAgICB7Mjg0ODUsICJQQ1NfUHVsa292b19HYXVzc18yNU4ifSwKKyAgICB7Mjg0ODYsICJQQ1NfUHVsa292b19HYXVzc18yNk4ifSwKKyAgICB7Mjg0ODcsICJQQ1NfUHVsa292b19HYXVzc18yN04ifSwKKyAgICB7Mjg0ODgsICJQQ1NfUHVsa292b19HYXVzc18yOE4ifSwKKyAgICB7Mjg0ODksICJQQ1NfUHVsa292b19HYXVzc18yOU4ifSwKKyAgICB7Mjg0OTAsICJQQ1NfUHVsa292b19HYXVzc18zME4ifSwKKyAgICB7Mjg0OTEsICJQQ1NfUHVsa292b19HYXVzc18zMU4ifSwKKyAgICB7Mjg0OTIsICJQQ1NfUHVsa292b19HYXVzc18zMk4ifSwKKyAgICB7Mjg2MDAsICJQQ1NfUWF0YXJfTmF0aW9uYWxfR3JpZCJ9LAorICAgIHsyODk5MSwgIlBDU19SRF9OZXRoZXJsYW5kc19PbGQifSwKKyAgICB7Mjg5OTIsICJQQ1NfUkRfTmV0aGVybGFuZHNfTmV3In0sCisgICAgezI5MTE4LCAiUENTX1NBRDY5X1VUTV96b25lXzE4TiJ9LAorICAgIHsyOTExOSwgIlBDU19TQUQ2OV9VVE1fem9uZV8xOU4ifSwKKyAgICB7MjkxMjAsICJQQ1NfU0FENjlfVVRNX3pvbmVfMjBOIn0sCisgICAgezI5MTIxLCAiUENTX1NBRDY5X1VUTV96b25lXzIxTiJ9LAorICAgIHsyOTEyMiwgIlBDU19TQUQ2OV9VVE1fem9uZV8yMk4ifSwKKyAgICB7MjkxNzcsICJQQ1NfU0FENjlfVVRNX3pvbmVfMTdTIn0sCisgICAgezI5MTc4LCAiUENTX1NBRDY5X1VUTV96b25lXzE4UyJ9LAorICAgIHsyOTE3OSwgIlBDU19TQUQ2OV9VVE1fem9uZV8xOVMifSwKKyAgICB7MjkxODAsICJQQ1NfU0FENjlfVVRNX3pvbmVfMjBTIn0sCisgICAgezI5MTgxLCAiUENTX1NBRDY5X1VUTV96b25lXzIxUyJ9LAorICAgIHsyOTE4MiwgIlBDU19TQUQ2OV9VVE1fem9uZV8yMlMifSwKKyAgICB7MjkxODMsICJQQ1NfU0FENjlfVVRNX3pvbmVfMjNTIn0sCisgICAgezI5MTg0LCAiUENTX1NBRDY5X1VUTV96b25lXzI0UyJ9LAorICAgIHsyOTE4NSwgIlBDU19TQUQ2OV9VVE1fem9uZV8yNVMifSwKKyAgICB7MjkyMjAsICJQQ1NfU2FwcGVyX0hpbGxfVVRNXzIwUyJ9LAorICAgIHsyOTIyMSwgIlBDU19TYXBwZXJfSGlsbF9VVE1fMjFTIn0sCisgICAgezI5MzMzLCAiUENTX1NjaHdhcnplY2tfVVRNXzMzUyJ9LAorICAgIHsyOTYzNSwgIlBDU19TdWRhbl9VVE1fem9uZV8zNU4ifSwKKyAgICB7Mjk2MzYsICJQQ1NfU3VkYW5fVVRNX3pvbmVfMzZOIn0sCisgICAgezI5NzAwLCAiUENTX1RhbmFuYXJpdmVfTGFib3JkZSJ9LAorICAgIHsyOTczOCwgIlBDU19UYW5hbmFyaXZlX1VUTV8zOFMifSwKKyAgICB7Mjk3MzksICJQQ1NfVGFuYW5hcml2ZV9VVE1fMzlTIn0sCisgICAgezI5ODAwLCAiUENTX1RpbWJhbGFpXzE5NDhfQm9ybmVvIn0sCisgICAgezI5ODQ5LCAiUENTX1RpbWJhbGFpXzE5NDhfVVRNXzQ5TiJ9LAorICAgIHsyOTg1MCwgIlBDU19UaW1iYWxhaV8xOTQ4X1VUTV81ME4ifSwKKyAgICB7Mjk5MDAsICJQQ1NfVE02NV9JcmlzaF9OYXRfR3JpZCJ9LAorICAgIHszMDIwMCwgIlBDU19UcmluaWRhZF8xOTAzX1RyaW5pZGFkIn0sCisgICAgezMwMzM5LCAiUENTX1RDXzE5NDhfVVRNX3pvbmVfMzlOIn0sCisgICAgezMwMzQwLCAiUENTX1RDXzE5NDhfVVRNX3pvbmVfNDBOIn0sCisgICAgezMwNDkxLCAiUENTX1ZvaXJvbF9OX0FsZ2VyaWVfYW5jaWVuIn0sCisgICAgezMwNDkyLCAiUENTX1ZvaXJvbF9TX0FsZ2VyaWVfYW5jaWVuIn0sCisgICAgezMwNTkxLCAiUENTX1ZvaXJvbF9VbmlmaWVfTl9BbGdlcmllIn0sCisgICAgezMwNTkyLCAiUENTX1ZvaXJvbF9VbmlmaWVfU19BbGdlcmllIn0sCisgICAgezMwNjAwLCAiUENTX0Jlcm5fMTkzOF9Td2lzc19OZXcifSwKKyAgICB7MzA3MjksICJQQ1NfTm9yZF9TYWhhcmFfVVRNXzI5TiJ9LAorICAgIHszMDczMCwgIlBDU19Ob3JkX1NhaGFyYV9VVE1fMzBOIn0sCisgICAgezMwNzMxLCAiUENTX05vcmRfU2FoYXJhX1VUTV8zMU4ifSwKKyAgICB7MzA3MzIsICJQQ1NfTm9yZF9TYWhhcmFfVVRNXzMyTiJ9LAorICAgIHszMTAyOCwgIlBDU19Zb2ZmX1VUTV96b25lXzI4TiJ9LAorICAgIHszMTEyMSwgIlBDU19aYW5kZXJpal9VVE1fem9uZV8yMU4ifSwKKyAgICB7MzEyOTEsICJQQ1NfTUdJX0F1c3RyaWFfV2VzdCJ9LAorICAgIHszMTI5MiwgIlBDU19NR0lfQXVzdHJpYV9DZW50cmFsIn0sCisgICAgezMxMjkzLCAiUENTX01HSV9BdXN0cmlhX0Vhc3QifSwKKyAgICB7MzEzMDAsICJQQ1NfQmVsZ2VfTGFtYmVydF83MiJ9LAorICAgIHszMTQ5MSwgIlBDU19ESEROX0dlcm1hbnlfem9uZV8xIn0sCisgICAgezMxNDkyLCAiUENTX0RIRE5fR2VybWFueV96b25lXzIifSwKKyAgICB7MzE0OTMsICJQQ1NfREhETl9HZXJtYW55X3pvbmVfMyJ9LAorICAgIHszMTQ5NCwgIlBDU19ESEROX0dlcm1hbnlfem9uZV80In0sCisgICAgezMxNDk1LCAiUENTX0RIRE5fR2VybWFueV96b25lXzUifSwKKyAgICB7MzIwMDEsICJQQ1NfTkFEMjdfTW9udGFuYV9Ob3J0aCJ9LAorICAgIHszMjAwMiwgIlBDU19OQUQyN19Nb250YW5hX0NlbnRyYWwifSwKKyAgICB7MzIwMDMsICJQQ1NfTkFEMjdfTW9udGFuYV9Tb3V0aCJ9LAorICAgIHszMjAwNSwgIlBDU19OQUQyN19OZWJyYXNrYV9Ob3J0aCJ9LAorICAgIHszMjAwNiwgIlBDU19OQUQyN19OZWJyYXNrYV9Tb3V0aCJ9LAorICAgIHszMjAwNywgIlBDU19OQUQyN19OZXZhZGFfRWFzdCJ9LAorICAgIHszMjAwOCwgIlBDU19OQUQyN19OZXZhZGFfQ2VudHJhbCJ9LAorICAgIHszMjAwOSwgIlBDU19OQUQyN19OZXZhZGFfV2VzdCJ9LAorICAgIHszMjAxMCwgIlBDU19OQUQyN19OZXdfSGFtcHNoaXJlIn0sCisgICAgezMyMDExLCAiUENTX05BRDI3X05ld19KZXJzZXkifSwKKyAgICB7MzIwMTIsICJQQ1NfTkFEMjdfTmV3X01leGljb19FYXN0In0sCisgICAgezMyMDEzLCAiUENTX05BRDI3X05ld19NZXhpY29fQ2VudCJ9LAorICAgIHszMjAxNCwgIlBDU19OQUQyN19OZXdfTWV4aWNvX1dlc3QifSwKKyAgICB7MzIwMTUsICJQQ1NfTkFEMjdfTmV3X1lvcmtfRWFzdCJ9LAorICAgIHszMjAxNiwgIlBDU19OQUQyN19OZXdfWW9ya19DZW50cmFsIn0sCisgICAgezMyMDE3LCAiUENTX05BRDI3X05ld19Zb3JrX1dlc3QifSwKKyAgICB7MzIwMTgsICJQQ1NfTkFEMjdfTmV3X1lvcmtfTG9uZ19JcyJ9LAorICAgIHszMjAxOSwgIlBDU19OQUQyN19Ob3J0aF9DYXJvbGluYSJ9LAorICAgIHszMjAyMCwgIlBDU19OQUQyN19Ob3J0aF9EYWtvdGFfTiJ9LAorICAgIHszMjAyMSwgIlBDU19OQUQyN19Ob3J0aF9EYWtvdGFfUyJ9LAorICAgIHszMjAyMiwgIlBDU19OQUQyN19PaGlvX05vcnRoIn0sCisgICAgezMyMDIzLCAiUENTX05BRDI3X09oaW9fU291dGgifSwKKyAgICB7MzIwMjQsICJQQ1NfTkFEMjdfT2tsYWhvbWFfTm9ydGgifSwKKyAgICB7MzIwMjUsICJQQ1NfTkFEMjdfT2tsYWhvbWFfU291dGgifSwKKyAgICB7MzIwMjYsICJQQ1NfTkFEMjdfT3JlZ29uX05vcnRoIn0sCisgICAgezMyMDI3LCAiUENTX05BRDI3X09yZWdvbl9Tb3V0aCJ9LAorICAgIHszMjAyOCwgIlBDU19OQUQyN19QZW5uc3lsdmFuaWFfTiJ9LAorICAgIHszMjAyOSwgIlBDU19OQUQyN19QZW5uc3lsdmFuaWFfUyJ9LAorICAgIHszMjAzMCwgIlBDU19OQUQyN19SaG9kZV9Jc2xhbmQifSwKKyAgICB7MzIwMzEsICJQQ1NfTkFEMjdfU291dGhfQ2Fyb2xpbmFfTiJ9LAorICAgIHszMjAzMywgIlBDU19OQUQyN19Tb3V0aF9DYXJvbGluYV9TIn0sCisgICAgezMyMDM0LCAiUENTX05BRDI3X1NvdXRoX0Rha290YV9OIn0sCisgICAgezMyMDM1LCAiUENTX05BRDI3X1NvdXRoX0Rha290YV9TIn0sCisgICAgezMyMDM2LCAiUENTX05BRDI3X1Rlbm5lc3NlZSJ9LAorICAgIHszMjAzNywgIlBDU19OQUQyN19UZXhhc19Ob3J0aCJ9LAorICAgIHszMjAzOCwgIlBDU19OQUQyN19UZXhhc19Ob3J0aF9DZW4ifSwKKyAgICB7MzIwMzksICJQQ1NfTkFEMjdfVGV4YXNfQ2VudHJhbCJ9LAorICAgIHszMjA0MCwgIlBDU19OQUQyN19UZXhhc19Tb3V0aF9DZW4ifSwKKyAgICB7MzIwNDEsICJQQ1NfTkFEMjdfVGV4YXNfU291dGgifSwKKyAgICB7MzIwNDIsICJQQ1NfTkFEMjdfVXRhaF9Ob3J0aCJ9LAorICAgIHszMjA0MywgIlBDU19OQUQyN19VdGFoX0NlbnRyYWwifSwKKyAgICB7MzIwNDQsICJQQ1NfTkFEMjdfVXRhaF9Tb3V0aCJ9LAorICAgIHszMjA0NSwgIlBDU19OQUQyN19WZXJtb250In0sCisgICAgezMyMDQ2LCAiUENTX05BRDI3X1ZpcmdpbmlhX05vcnRoIn0sCisgICAgezMyMDQ3LCAiUENTX05BRDI3X1ZpcmdpbmlhX1NvdXRoIn0sCisgICAgezMyMDQ4LCAiUENTX05BRDI3X1dhc2hpbmd0b25fTm9ydGgifSwKKyAgICB7MzIwNDksICJQQ1NfTkFEMjdfV2FzaGluZ3Rvbl9Tb3V0aCJ9LAorICAgIHszMjA1MCwgIlBDU19OQUQyN19XZXN0X1ZpcmdpbmlhX04ifSwKKyAgICB7MzIwNTEsICJQQ1NfTkFEMjdfV2VzdF9WaXJnaW5pYV9TIn0sCisgICAgezMyMDUyLCAiUENTX05BRDI3X1dpc2NvbnNpbl9Ob3J0aCJ9LAorICAgIHszMjA1MywgIlBDU19OQUQyN19XaXNjb25zaW5fQ2VuIn0sCisgICAgezMyMDU0LCAiUENTX05BRDI3X1dpc2NvbnNpbl9Tb3V0aCJ9LAorICAgIHszMjA1NSwgIlBDU19OQUQyN19XeW9taW5nX0Vhc3QifSwKKyAgICB7MzIwNTYsICJQQ1NfTkFEMjdfV3lvbWluZ19FX0NlbiJ9LAorICAgIHszMjA1NywgIlBDU19OQUQyN19XeW9taW5nX1dfQ2VuIn0sCisgICAgezMyMDU4LCAiUENTX05BRDI3X1d5b21pbmdfV2VzdCJ9LAorICAgIHszMjA1OSwgIlBDU19OQUQyN19QdWVydG9fUmljbyJ9LAorICAgIHszMjA2MCwgIlBDU19OQUQyN19TdF9Dcm9peCJ9LAorICAgIHszMjEwMCwgIlBDU19OQUQ4M19Nb250YW5hIn0sCisgICAgezMyMTA0LCAiUENTX05BRDgzX05lYnJhc2thIn0sCisgICAgezMyMTA3LCAiUENTX05BRDgzX05ldmFkYV9FYXN0In0sCisgICAgezMyMTA4LCAiUENTX05BRDgzX05ldmFkYV9DZW50cmFsIn0sCisgICAgezMyMTA5LCAiUENTX05BRDgzX05ldmFkYV9XZXN0In0sCisgICAgezMyMTEwLCAiUENTX05BRDgzX05ld19IYW1wc2hpcmUifSwKKyAgICB7MzIxMTEsICJQQ1NfTkFEODNfTmV3X0plcnNleSJ9LAorICAgIHszMjExMiwgIlBDU19OQUQ4M19OZXdfTWV4aWNvX0Vhc3QifSwKKyAgICB7MzIxMTMsICJQQ1NfTkFEODNfTmV3X01leGljb19DZW50In0sCisgICAgezMyMTE0LCAiUENTX05BRDgzX05ld19NZXhpY29fV2VzdCJ9LAorICAgIHszMjExNSwgIlBDU19OQUQ4M19OZXdfWW9ya19FYXN0In0sCisgICAgezMyMTE2LCAiUENTX05BRDgzX05ld19Zb3JrX0NlbnRyYWwifSwKKyAgICB7MzIxMTcsICJQQ1NfTkFEODNfTmV3X1lvcmtfV2VzdCJ9LAorICAgIHszMjExOCwgIlBDU19OQUQ4M19OZXdfWW9ya19Mb25nX0lzIn0sCisgICAgezMyMTE5LCAiUENTX05BRDgzX05vcnRoX0Nhcm9saW5hIn0sCisgICAgezMyMTIwLCAiUENTX05BRDgzX05vcnRoX0Rha290YV9OIn0sCisgICAgezMyMTIxLCAiUENTX05BRDgzX05vcnRoX0Rha290YV9TIn0sCisgICAgezMyMTIyLCAiUENTX05BRDgzX09oaW9fTm9ydGgifSwKKyAgICB7MzIxMjMsICJQQ1NfTkFEODNfT2hpb19Tb3V0aCJ9LAorICAgIHszMjEyNCwgIlBDU19OQUQ4M19Pa2xhaG9tYV9Ob3J0aCJ9LAorICAgIHszMjEyNSwgIlBDU19OQUQ4M19Pa2xhaG9tYV9Tb3V0aCJ9LAorICAgIHszMjEyNiwgIlBDU19OQUQ4M19PcmVnb25fTm9ydGgifSwKKyAgICB7MzIxMjcsICJQQ1NfTkFEODNfT3JlZ29uX1NvdXRoIn0sCisgICAgezMyMTI4LCAiUENTX05BRDgzX1Blbm5zeWx2YW5pYV9OIn0sCisgICAgezMyMTI5LCAiUENTX05BRDgzX1Blbm5zeWx2YW5pYV9TIn0sCisgICAgezMyMTMwLCAiUENTX05BRDgzX1Job2RlX0lzbGFuZCJ9LAorICAgIHszMjEzMywgIlBDU19OQUQ4M19Tb3V0aF9DYXJvbGluYSJ9LAorICAgIHszMjEzNCwgIlBDU19OQUQ4M19Tb3V0aF9EYWtvdGFfTiJ9LAorICAgIHszMjEzNSwgIlBDU19OQUQ4M19Tb3V0aF9EYWtvdGFfUyJ9LAorICAgIHszMjEzNiwgIlBDU19OQUQ4M19UZW5uZXNzZWUifSwKKyAgICB7MzIxMzcsICJQQ1NfTkFEODNfVGV4YXNfTm9ydGgifSwKKyAgICB7MzIxMzgsICJQQ1NfTkFEODNfVGV4YXNfTm9ydGhfQ2VuIn0sCisgICAgezMyMTM5LCAiUENTX05BRDgzX1RleGFzX0NlbnRyYWwifSwKKyAgICB7MzIxNDAsICJQQ1NfTkFEODNfVGV4YXNfU291dGhfQ2VuIn0sCisgICAgezMyMTQxLCAiUENTX05BRDgzX1RleGFzX1NvdXRoIn0sCisgICAgezMyMTQyLCAiUENTX05BRDgzX1V0YWhfTm9ydGgifSwKKyAgICB7MzIxNDMsICJQQ1NfTkFEODNfVXRhaF9DZW50cmFsIn0sCisgICAgezMyMTQ0LCAiUENTX05BRDgzX1V0YWhfU291dGgifSwKKyAgICB7MzIxNDUsICJQQ1NfTkFEODNfVmVybW9udCJ9LAorICAgIHszMjE0NiwgIlBDU19OQUQ4M19WaXJnaW5pYV9Ob3J0aCJ9LAorICAgIHszMjE0NywgIlBDU19OQUQ4M19WaXJnaW5pYV9Tb3V0aCJ9LAorICAgIHszMjE0OCwgIlBDU19OQUQ4M19XYXNoaW5ndG9uX05vcnRoIn0sCisgICAgezMyMTQ5LCAiUENTX05BRDgzX1dhc2hpbmd0b25fU291dGgifSwKKyAgICB7MzIxNTAsICJQQ1NfTkFEODNfV2VzdF9WaXJnaW5pYV9OIn0sCisgICAgezMyMTUxLCAiUENTX05BRDgzX1dlc3RfVmlyZ2luaWFfUyJ9LAorICAgIHszMjE1MiwgIlBDU19OQUQ4M19XaXNjb25zaW5fTm9ydGgifSwKKyAgICB7MzIxNTMsICJQQ1NfTkFEODNfV2lzY29uc2luX0NlbiJ9LAorICAgIHszMjE1NCwgIlBDU19OQUQ4M19XaXNjb25zaW5fU291dGgifSwKKyAgICB7MzIxNTUsICJQQ1NfTkFEODNfV3lvbWluZ19FYXN0In0sCisgICAgezMyMTU2LCAiUENTX05BRDgzX1d5b21pbmdfRV9DZW4ifSwKKyAgICB7MzIxNTcsICJQQ1NfTkFEODNfV3lvbWluZ19XX0NlbiJ9LAorICAgIHszMjE1OCwgIlBDU19OQUQ4M19XeW9taW5nX1dlc3QifSwKKyAgICB7MzIxNjEsICJQQ1NfTkFEODNfUHVlcnRvX1JpY29fVmlyZ2luX0lzIn0sCisgICAgezMyMjAxLCAiUENTX1dHUzcyX1VUTV96b25lXzFOIn0sCisgICAgezMyMjAyLCAiUENTX1dHUzcyX1VUTV96b25lXzJOIn0sCisgICAgezMyMjAzLCAiUENTX1dHUzcyX1VUTV96b25lXzNOIn0sCisgICAgezMyMjA0LCAiUENTX1dHUzcyX1VUTV96b25lXzROIn0sCisgICAgezMyMjA1LCAiUENTX1dHUzcyX1VUTV96b25lXzVOIn0sCisgICAgezMyMjA2LCAiUENTX1dHUzcyX1VUTV96b25lXzZOIn0sCisgICAgezMyMjA3LCAiUENTX1dHUzcyX1VUTV96b25lXzdOIn0sCisgICAgezMyMjA4LCAiUENTX1dHUzcyX1VUTV96b25lXzhOIn0sCisgICAgezMyMjA5LCAiUENTX1dHUzcyX1VUTV96b25lXzlOIn0sCisgICAgezMyMjEwLCAiUENTX1dHUzcyX1VUTV96b25lXzEwTiJ9LAorICAgIHszMjIxMSwgIlBDU19XR1M3Ml9VVE1fem9uZV8xMU4ifSwKKyAgICB7MzIyMTIsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMTJOIn0sCisgICAgezMyMjEzLCAiUENTX1dHUzcyX1VUTV96b25lXzEzTiJ9LAorICAgIHszMjIxNCwgIlBDU19XR1M3Ml9VVE1fem9uZV8xNE4ifSwKKyAgICB7MzIyMTUsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMTVOIn0sCisgICAgezMyMjE2LCAiUENTX1dHUzcyX1VUTV96b25lXzE2TiJ9LAorICAgIHszMjIxNywgIlBDU19XR1M3Ml9VVE1fem9uZV8xN04ifSwKKyAgICB7MzIyMTgsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMThOIn0sCisgICAgezMyMjE5LCAiUENTX1dHUzcyX1VUTV96b25lXzE5TiJ9LAorICAgIHszMjIyMCwgIlBDU19XR1M3Ml9VVE1fem9uZV8yME4ifSwKKyAgICB7MzIyMjEsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMjFOIn0sCisgICAgezMyMjIyLCAiUENTX1dHUzcyX1VUTV96b25lXzIyTiJ9LAorICAgIHszMjIyMywgIlBDU19XR1M3Ml9VVE1fem9uZV8yM04ifSwKKyAgICB7MzIyMjQsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMjROIn0sCisgICAgezMyMjI1LCAiUENTX1dHUzcyX1VUTV96b25lXzI1TiJ9LAorICAgIHszMjIyNiwgIlBDU19XR1M3Ml9VVE1fem9uZV8yNk4ifSwKKyAgICB7MzIyMjcsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMjdOIn0sCisgICAgezMyMjI4LCAiUENTX1dHUzcyX1VUTV96b25lXzI4TiJ9LAorICAgIHszMjIyOSwgIlBDU19XR1M3Ml9VVE1fem9uZV8yOU4ifSwKKyAgICB7MzIyMzAsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMzBOIn0sCisgICAgezMyMjMxLCAiUENTX1dHUzcyX1VUTV96b25lXzMxTiJ9LAorICAgIHszMjIzMiwgIlBDU19XR1M3Ml9VVE1fem9uZV8zMk4ifSwKKyAgICB7MzIyMzMsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMzNOIn0sCisgICAgezMyMjM0LCAiUENTX1dHUzcyX1VUTV96b25lXzM0TiJ9LAorICAgIHszMjIzNSwgIlBDU19XR1M3Ml9VVE1fem9uZV8zNU4ifSwKKyAgICB7MzIyMzYsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMzZOIn0sCisgICAgezMyMjM3LCAiUENTX1dHUzcyX1VUTV96b25lXzM3TiJ9LAorICAgIHszMjIzOCwgIlBDU19XR1M3Ml9VVE1fem9uZV8zOE4ifSwKKyAgICB7MzIyMzksICJQQ1NfV0dTNzJfVVRNX3pvbmVfMzlOIn0sCisgICAgezMyMjQwLCAiUENTX1dHUzcyX1VUTV96b25lXzQwTiJ9LAorICAgIHszMjI0MSwgIlBDU19XR1M3Ml9VVE1fem9uZV80MU4ifSwKKyAgICB7MzIyNDIsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNDJOIn0sCisgICAgezMyMjQzLCAiUENTX1dHUzcyX1VUTV96b25lXzQzTiJ9LAorICAgIHszMjI0NCwgIlBDU19XR1M3Ml9VVE1fem9uZV80NE4ifSwKKyAgICB7MzIyNDUsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNDVOIn0sCisgICAgezMyMjQ2LCAiUENTX1dHUzcyX1VUTV96b25lXzQ2TiJ9LAorICAgIHszMjI0NywgIlBDU19XR1M3Ml9VVE1fem9uZV80N04ifSwKKyAgICB7MzIyNDgsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNDhOIn0sCisgICAgezMyMjQ5LCAiUENTX1dHUzcyX1VUTV96b25lXzQ5TiJ9LAorICAgIHszMjI1MCwgIlBDU19XR1M3Ml9VVE1fem9uZV81ME4ifSwKKyAgICB7MzIyNTEsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNTFOIn0sCisgICAgezMyMjUyLCAiUENTX1dHUzcyX1VUTV96b25lXzUyTiJ9LAorICAgIHszMjI1MywgIlBDU19XR1M3Ml9VVE1fem9uZV81M04ifSwKKyAgICB7MzIyNTQsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNTROIn0sCisgICAgezMyMjU1LCAiUENTX1dHUzcyX1VUTV96b25lXzU1TiJ9LAorICAgIHszMjI1NiwgIlBDU19XR1M3Ml9VVE1fem9uZV81Nk4ifSwKKyAgICB7MzIyNTcsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNTdOIn0sCisgICAgezMyMjU4LCAiUENTX1dHUzcyX1VUTV96b25lXzU4TiJ9LAorICAgIHszMjI1OSwgIlBDU19XR1M3Ml9VVE1fem9uZV81OU4ifSwKKyAgICB7MzIyNjAsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNjBOIn0sCisgICAgezMyMzAxLCAiUENTX1dHUzcyX1VUTV96b25lXzFTIn0sCisgICAgezMyMzAyLCAiUENTX1dHUzcyX1VUTV96b25lXzJTIn0sCisgICAgezMyMzAzLCAiUENTX1dHUzcyX1VUTV96b25lXzNTIn0sCisgICAgezMyMzA0LCAiUENTX1dHUzcyX1VUTV96b25lXzRTIn0sCisgICAgezMyMzA1LCAiUENTX1dHUzcyX1VUTV96b25lXzVTIn0sCisgICAgezMyMzA2LCAiUENTX1dHUzcyX1VUTV96b25lXzZTIn0sCisgICAgezMyMzA3LCAiUENTX1dHUzcyX1VUTV96b25lXzdTIn0sCisgICAgezMyMzA4LCAiUENTX1dHUzcyX1VUTV96b25lXzhTIn0sCisgICAgezMyMzA5LCAiUENTX1dHUzcyX1VUTV96b25lXzlTIn0sCisgICAgezMyMzEwLCAiUENTX1dHUzcyX1VUTV96b25lXzEwUyJ9LAorICAgIHszMjMxMSwgIlBDU19XR1M3Ml9VVE1fem9uZV8xMVMifSwKKyAgICB7MzIzMTIsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMTJTIn0sCisgICAgezMyMzEzLCAiUENTX1dHUzcyX1VUTV96b25lXzEzUyJ9LAorICAgIHszMjMxNCwgIlBDU19XR1M3Ml9VVE1fem9uZV8xNFMifSwKKyAgICB7MzIzMTUsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMTVTIn0sCisgICAgezMyMzE2LCAiUENTX1dHUzcyX1VUTV96b25lXzE2UyJ9LAorICAgIHszMjMxNywgIlBDU19XR1M3Ml9VVE1fem9uZV8xN1MifSwKKyAgICB7MzIzMTgsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMThTIn0sCisgICAgezMyMzE5LCAiUENTX1dHUzcyX1VUTV96b25lXzE5UyJ9LAorICAgIHszMjMyMCwgIlBDU19XR1M3Ml9VVE1fem9uZV8yMFMifSwKKyAgICB7MzIzMjEsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMjFTIn0sCisgICAgezMyMzIyLCAiUENTX1dHUzcyX1VUTV96b25lXzIyUyJ9LAorICAgIHszMjMyMywgIlBDU19XR1M3Ml9VVE1fem9uZV8yM1MifSwKKyAgICB7MzIzMjQsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMjRTIn0sCisgICAgezMyMzI1LCAiUENTX1dHUzcyX1VUTV96b25lXzI1UyJ9LAorICAgIHszMjMyNiwgIlBDU19XR1M3Ml9VVE1fem9uZV8yNlMifSwKKyAgICB7MzIzMjcsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMjdTIn0sCisgICAgezMyMzI4LCAiUENTX1dHUzcyX1VUTV96b25lXzI4UyJ9LAorICAgIHszMjMyOSwgIlBDU19XR1M3Ml9VVE1fem9uZV8yOVMifSwKKyAgICB7MzIzMzAsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMzBTIn0sCisgICAgezMyMzMxLCAiUENTX1dHUzcyX1VUTV96b25lXzMxUyJ9LAorICAgIHszMjMzMiwgIlBDU19XR1M3Ml9VVE1fem9uZV8zMlMifSwKKyAgICB7MzIzMzMsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMzNTIn0sCisgICAgezMyMzM0LCAiUENTX1dHUzcyX1VUTV96b25lXzM0UyJ9LAorICAgIHszMjMzNSwgIlBDU19XR1M3Ml9VVE1fem9uZV8zNVMifSwKKyAgICB7MzIzMzYsICJQQ1NfV0dTNzJfVVRNX3pvbmVfMzZTIn0sCisgICAgezMyMzM3LCAiUENTX1dHUzcyX1VUTV96b25lXzM3UyJ9LAorICAgIHszMjMzOCwgIlBDU19XR1M3Ml9VVE1fem9uZV8zOFMifSwKKyAgICB7MzIzMzksICJQQ1NfV0dTNzJfVVRNX3pvbmVfMzlTIn0sCisgICAgezMyMzQwLCAiUENTX1dHUzcyX1VUTV96b25lXzQwUyJ9LAorICAgIHszMjM0MSwgIlBDU19XR1M3Ml9VVE1fem9uZV80MVMifSwKKyAgICB7MzIzNDIsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNDJTIn0sCisgICAgezMyMzQzLCAiUENTX1dHUzcyX1VUTV96b25lXzQzUyJ9LAorICAgIHszMjM0NCwgIlBDU19XR1M3Ml9VVE1fem9uZV80NFMifSwKKyAgICB7MzIzNDUsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNDVTIn0sCisgICAgezMyMzQ2LCAiUENTX1dHUzcyX1VUTV96b25lXzQ2UyJ9LAorICAgIHszMjM0NywgIlBDU19XR1M3Ml9VVE1fem9uZV80N1MifSwKKyAgICB7MzIzNDgsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNDhTIn0sCisgICAgezMyMzQ5LCAiUENTX1dHUzcyX1VUTV96b25lXzQ5UyJ9LAorICAgIHszMjM1MCwgIlBDU19XR1M3Ml9VVE1fem9uZV81MFMifSwKKyAgICB7MzIzNTEsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNTFTIn0sCisgICAgezMyMzUyLCAiUENTX1dHUzcyX1VUTV96b25lXzUyUyJ9LAorICAgIHszMjM1MywgIlBDU19XR1M3Ml9VVE1fem9uZV81M1MifSwKKyAgICB7MzIzNTQsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNTRTIn0sCisgICAgezMyMzU1LCAiUENTX1dHUzcyX1VUTV96b25lXzU1UyJ9LAorICAgIHszMjM1NiwgIlBDU19XR1M3Ml9VVE1fem9uZV81NlMifSwKKyAgICB7MzIzNTcsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNTdTIn0sCisgICAgezMyMzU4LCAiUENTX1dHUzcyX1VUTV96b25lXzU4UyJ9LAorICAgIHszMjM1OSwgIlBDU19XR1M3Ml9VVE1fem9uZV81OVMifSwKKyAgICB7MzIzNjAsICJQQ1NfV0dTNzJfVVRNX3pvbmVfNjBTIn0sCisgICAgezMyNDAxLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMU4ifSwKKyAgICB7MzI0MDIsICJQQ1NfV0dTNzJCRV9VVE1fem9uZV8yTiJ9LAorICAgIHszMjQwMywgIlBDU19XR1M3MkJFX1VUTV96b25lXzNOIn0sCisgICAgezMyNDA0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNE4ifSwKKyAgICB7MzI0MDUsICJQQ1NfV0dTNzJCRV9VVE1fem9uZV81TiJ9LAorICAgIHszMjQwNiwgIlBDU19XR1M3MkJFX1VUTV96b25lXzZOIn0sCisgICAgezMyNDA3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfN04ifSwKKyAgICB7MzI0MDgsICJQQ1NfV0dTNzJCRV9VVE1fem9uZV84TiJ9LAorICAgIHszMjQwOSwgIlBDU19XR1M3MkJFX1VUTV96b25lXzlOIn0sCisgICAgezMyNDEwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTBOIn0sCisgICAgezMyNDExLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTFOIn0sCisgICAgezMyNDEyLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTJOIn0sCisgICAgezMyNDEzLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTNOIn0sCisgICAgezMyNDE0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTROIn0sCisgICAgezMyNDE1LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTVOIn0sCisgICAgezMyNDE2LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTZOIn0sCisgICAgezMyNDE3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTdOIn0sCisgICAgezMyNDE4LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMThOIn0sCisgICAgezMyNDE5LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTlOIn0sCisgICAgezMyNDIwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjBOIn0sCisgICAgezMyNDIxLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjFOIn0sCisgICAgezMyNDIyLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjJOIn0sCisgICAgezMyNDIzLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjNOIn0sCisgICAgezMyNDI0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjROIn0sCisgICAgezMyNDI1LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjVOIn0sCisgICAgezMyNDI2LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjZOIn0sCisgICAgezMyNDI3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjdOIn0sCisgICAgezMyNDI4LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjhOIn0sCisgICAgezMyNDI5LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjlOIn0sCisgICAgezMyNDMwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzBOIn0sCisgICAgezMyNDMxLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzFOIn0sCisgICAgezMyNDMyLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzJOIn0sCisgICAgezMyNDMzLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzNOIn0sCisgICAgezMyNDM0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzROIn0sCisgICAgezMyNDM1LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzVOIn0sCisgICAgezMyNDM2LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzZOIn0sCisgICAgezMyNDM3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzdOIn0sCisgICAgezMyNDM4LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzhOIn0sCisgICAgezMyNDM5LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzlOIn0sCisgICAgezMyNDQwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDBOIn0sCisgICAgezMyNDQxLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDFOIn0sCisgICAgezMyNDQyLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDJOIn0sCisgICAgezMyNDQzLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDNOIn0sCisgICAgezMyNDQ0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDROIn0sCisgICAgezMyNDQ1LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDVOIn0sCisgICAgezMyNDQ2LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDZOIn0sCisgICAgezMyNDQ3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDdOIn0sCisgICAgezMyNDQ4LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDhOIn0sCisgICAgezMyNDQ5LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDlOIn0sCisgICAgezMyNDUwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTBOIn0sCisgICAgezMyNDUxLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTFOIn0sCisgICAgezMyNDUyLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTJOIn0sCisgICAgezMyNDUzLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTNOIn0sCisgICAgezMyNDU0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTROIn0sCisgICAgezMyNDU1LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTVOIn0sCisgICAgezMyNDU2LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTZOIn0sCisgICAgezMyNDU3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTdOIn0sCisgICAgezMyNDU4LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNThOIn0sCisgICAgezMyNDU5LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTlOIn0sCisgICAgezMyNDYwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNjBOIn0sCisgICAgezMyNTAxLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMVMifSwKKyAgICB7MzI1MDIsICJQQ1NfV0dTNzJCRV9VVE1fem9uZV8yUyJ9LAorICAgIHszMjUwMywgIlBDU19XR1M3MkJFX1VUTV96b25lXzNTIn0sCisgICAgezMyNTA0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNFMifSwKKyAgICB7MzI1MDUsICJQQ1NfV0dTNzJCRV9VVE1fem9uZV81UyJ9LAorICAgIHszMjUwNiwgIlBDU19XR1M3MkJFX1VUTV96b25lXzZTIn0sCisgICAgezMyNTA3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfN1MifSwKKyAgICB7MzI1MDgsICJQQ1NfV0dTNzJCRV9VVE1fem9uZV84UyJ9LAorICAgIHszMjUwOSwgIlBDU19XR1M3MkJFX1VUTV96b25lXzlTIn0sCisgICAgezMyNTEwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTBTIn0sCisgICAgezMyNTExLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTFTIn0sCisgICAgezMyNTEyLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTJTIn0sCisgICAgezMyNTEzLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTNTIn0sCisgICAgezMyNTE0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTRTIn0sCisgICAgezMyNTE1LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTVTIn0sCisgICAgezMyNTE2LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTZTIn0sCisgICAgezMyNTE3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTdTIn0sCisgICAgezMyNTE4LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMThTIn0sCisgICAgezMyNTE5LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMTlTIn0sCisgICAgezMyNTIwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjBTIn0sCisgICAgezMyNTIxLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjFTIn0sCisgICAgezMyNTIyLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjJTIn0sCisgICAgezMyNTIzLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjNTIn0sCisgICAgezMyNTI0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjRTIn0sCisgICAgezMyNTI1LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjVTIn0sCisgICAgezMyNTI2LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjZTIn0sCisgICAgezMyNTI3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjdTIn0sCisgICAgezMyNTI4LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjhTIn0sCisgICAgezMyNTI5LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMjlTIn0sCisgICAgezMyNTMwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzBTIn0sCisgICAgezMyNTMxLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzFTIn0sCisgICAgezMyNTMyLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzJTIn0sCisgICAgezMyNTMzLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzNTIn0sCisgICAgezMyNTM0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzRTIn0sCisgICAgezMyNTM1LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzVTIn0sCisgICAgezMyNTM2LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzZTIn0sCisgICAgezMyNTM3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzdTIn0sCisgICAgezMyNTM4LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzhTIn0sCisgICAgezMyNTM5LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfMzlTIn0sCisgICAgezMyNTQwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDBTIn0sCisgICAgezMyNTQxLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDFTIn0sCisgICAgezMyNTQyLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDJTIn0sCisgICAgezMyNTQzLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDNTIn0sCisgICAgezMyNTQ0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDRTIn0sCisgICAgezMyNTQ1LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDVTIn0sCisgICAgezMyNTQ2LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDZTIn0sCisgICAgezMyNTQ3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDdTIn0sCisgICAgezMyNTQ4LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDhTIn0sCisgICAgezMyNTQ5LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNDlTIn0sCisgICAgezMyNTUwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTBTIn0sCisgICAgezMyNTUxLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTFTIn0sCisgICAgezMyNTUyLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTJTIn0sCisgICAgezMyNTUzLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTNTIn0sCisgICAgezMyNTU0LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTRTIn0sCisgICAgezMyNTU1LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTVTIn0sCisgICAgezMyNTU2LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTZTIn0sCisgICAgezMyNTU3LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTdTIn0sCisgICAgezMyNTU4LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNThTIn0sCisgICAgezMyNTU5LCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNTlTIn0sCisgICAgezMyNTYwLCAiUENTX1dHUzcyQkVfVVRNX3pvbmVfNjBTIn0sCisgICAgezMyNjAxLCAiUENTX1dHUzg0X1VUTV96b25lXzFOIn0sCisgICAgezMyNjAyLCAiUENTX1dHUzg0X1VUTV96b25lXzJOIn0sCisgICAgezMyNjAzLCAiUENTX1dHUzg0X1VUTV96b25lXzNOIn0sCisgICAgezMyNjA0LCAiUENTX1dHUzg0X1VUTV96b25lXzROIn0sCisgICAgezMyNjA1LCAiUENTX1dHUzg0X1VUTV96b25lXzVOIn0sCisgICAgezMyNjA2LCAiUENTX1dHUzg0X1VUTV96b25lXzZOIn0sCisgICAgezMyNjA3LCAiUENTX1dHUzg0X1VUTV96b25lXzdOIn0sCisgICAgezMyNjA4LCAiUENTX1dHUzg0X1VUTV96b25lXzhOIn0sCisgICAgezMyNjA5LCAiUENTX1dHUzg0X1VUTV96b25lXzlOIn0sCisgICAgezMyNjEwLCAiUENTX1dHUzg0X1VUTV96b25lXzEwTiJ9LAorICAgIHszMjYxMSwgIlBDU19XR1M4NF9VVE1fem9uZV8xMU4ifSwKKyAgICB7MzI2MTIsICJQQ1NfV0dTODRfVVRNX3pvbmVfMTJOIn0sCisgICAgezMyNjEzLCAiUENTX1dHUzg0X1VUTV96b25lXzEzTiJ9LAorICAgIHszMjYxNCwgIlBDU19XR1M4NF9VVE1fem9uZV8xNE4ifSwKKyAgICB7MzI2MTUsICJQQ1NfV0dTODRfVVRNX3pvbmVfMTVOIn0sCisgICAgezMyNjE2LCAiUENTX1dHUzg0X1VUTV96b25lXzE2TiJ9LAorICAgIHszMjYxNywgIlBDU19XR1M4NF9VVE1fem9uZV8xN04ifSwKKyAgICB7MzI2MTgsICJQQ1NfV0dTODRfVVRNX3pvbmVfMThOIn0sCisgICAgezMyNjE5LCAiUENTX1dHUzg0X1VUTV96b25lXzE5TiJ9LAorICAgIHszMjYyMCwgIlBDU19XR1M4NF9VVE1fem9uZV8yME4ifSwKKyAgICB7MzI2MjEsICJQQ1NfV0dTODRfVVRNX3pvbmVfMjFOIn0sCisgICAgezMyNjIyLCAiUENTX1dHUzg0X1VUTV96b25lXzIyTiJ9LAorICAgIHszMjYyMywgIlBDU19XR1M4NF9VVE1fem9uZV8yM04ifSwKKyAgICB7MzI2MjQsICJQQ1NfV0dTODRfVVRNX3pvbmVfMjROIn0sCisgICAgezMyNjI1LCAiUENTX1dHUzg0X1VUTV96b25lXzI1TiJ9LAorICAgIHszMjYyNiwgIlBDU19XR1M4NF9VVE1fem9uZV8yNk4ifSwKKyAgICB7MzI2MjcsICJQQ1NfV0dTODRfVVRNX3pvbmVfMjdOIn0sCisgICAgezMyNjI4LCAiUENTX1dHUzg0X1VUTV96b25lXzI4TiJ9LAorICAgIHszMjYyOSwgIlBDU19XR1M4NF9VVE1fem9uZV8yOU4ifSwKKyAgICB7MzI2MzAsICJQQ1NfV0dTODRfVVRNX3pvbmVfMzBOIn0sCisgICAgezMyNjMxLCAiUENTX1dHUzg0X1VUTV96b25lXzMxTiJ9LAorICAgIHszMjYzMiwgIlBDU19XR1M4NF9VVE1fem9uZV8zMk4ifSwKKyAgICB7MzI2MzMsICJQQ1NfV0dTODRfVVRNX3pvbmVfMzNOIn0sCisgICAgezMyNjM0LCAiUENTX1dHUzg0X1VUTV96b25lXzM0TiJ9LAorICAgIHszMjYzNSwgIlBDU19XR1M4NF9VVE1fem9uZV8zNU4ifSwKKyAgICB7MzI2MzYsICJQQ1NfV0dTODRfVVRNX3pvbmVfMzZOIn0sCisgICAgezMyNjM3LCAiUENTX1dHUzg0X1VUTV96b25lXzM3TiJ9LAorICAgIHszMjYzOCwgIlBDU19XR1M4NF9VVE1fem9uZV8zOE4ifSwKKyAgICB7MzI2MzksICJQQ1NfV0dTODRfVVRNX3pvbmVfMzlOIn0sCisgICAgezMyNjQwLCAiUENTX1dHUzg0X1VUTV96b25lXzQwTiJ9LAorICAgIHszMjY0MSwgIlBDU19XR1M4NF9VVE1fem9uZV80MU4ifSwKKyAgICB7MzI2NDIsICJQQ1NfV0dTODRfVVRNX3pvbmVfNDJOIn0sCisgICAgezMyNjQzLCAiUENTX1dHUzg0X1VUTV96b25lXzQzTiJ9LAorICAgIHszMjY0NCwgIlBDU19XR1M4NF9VVE1fem9uZV80NE4ifSwKKyAgICB7MzI2NDUsICJQQ1NfV0dTODRfVVRNX3pvbmVfNDVOIn0sCisgICAgezMyNjQ2LCAiUENTX1dHUzg0X1VUTV96b25lXzQ2TiJ9LAorICAgIHszMjY0NywgIlBDU19XR1M4NF9VVE1fem9uZV80N04ifSwKKyAgICB7MzI2NDgsICJQQ1NfV0dTODRfVVRNX3pvbmVfNDhOIn0sCisgICAgezMyNjQ5LCAiUENTX1dHUzg0X1VUTV96b25lXzQ5TiJ9LAorICAgIHszMjY1MCwgIlBDU19XR1M4NF9VVE1fem9uZV81ME4ifSwKKyAgICB7MzI2NTEsICJQQ1NfV0dTODRfVVRNX3pvbmVfNTFOIn0sCisgICAgezMyNjUyLCAiUENTX1dHUzg0X1VUTV96b25lXzUyTiJ9LAorICAgIHszMjY1MywgIlBDU19XR1M4NF9VVE1fem9uZV81M04ifSwKKyAgICB7MzI2NTQsICJQQ1NfV0dTODRfVVRNX3pvbmVfNTROIn0sCisgICAgezMyNjU1LCAiUENTX1dHUzg0X1VUTV96b25lXzU1TiJ9LAorICAgIHszMjY1NiwgIlBDU19XR1M4NF9VVE1fem9uZV81Nk4ifSwKKyAgICB7MzI2NTcsICJQQ1NfV0dTODRfVVRNX3pvbmVfNTdOIn0sCisgICAgezMyNjU4LCAiUENTX1dHUzg0X1VUTV96b25lXzU4TiJ9LAorICAgIHszMjY1OSwgIlBDU19XR1M4NF9VVE1fem9uZV81OU4ifSwKKyAgICB7MzI2NjAsICJQQ1NfV0dTODRfVVRNX3pvbmVfNjBOIn0sCisgICAgezMyNzAxLCAiUENTX1dHUzg0X1VUTV96b25lXzFTIn0sCisgICAgezMyNzAyLCAiUENTX1dHUzg0X1VUTV96b25lXzJTIn0sCisgICAgezMyNzAzLCAiUENTX1dHUzg0X1VUTV96b25lXzNTIn0sCisgICAgezMyNzA0LCAiUENTX1dHUzg0X1VUTV96b25lXzRTIn0sCisgICAgezMyNzA1LCAiUENTX1dHUzg0X1VUTV96b25lXzVTIn0sCisgICAgezMyNzA2LCAiUENTX1dHUzg0X1VUTV96b25lXzZTIn0sCisgICAgezMyNzA3LCAiUENTX1dHUzg0X1VUTV96b25lXzdTIn0sCisgICAgezMyNzA4LCAiUENTX1dHUzg0X1VUTV96b25lXzhTIn0sCisgICAgezMyNzA5LCAiUENTX1dHUzg0X1VUTV96b25lXzlTIn0sCisgICAgezMyNzEwLCAiUENTX1dHUzg0X1VUTV96b25lXzEwUyJ9LAorICAgIHszMjcxMSwgIlBDU19XR1M4NF9VVE1fem9uZV8xMVMifSwKKyAgICB7MzI3MTIsICJQQ1NfV0dTODRfVVRNX3pvbmVfMTJTIn0sCisgICAgezMyNzEzLCAiUENTX1dHUzg0X1VUTV96b25lXzEzUyJ9LAorICAgIHszMjcxNCwgIlBDU19XR1M4NF9VVE1fem9uZV8xNFMifSwKKyAgICB7MzI3MTUsICJQQ1NfV0dTODRfVVRNX3pvbmVfMTVTIn0sCisgICAgezMyNzE2LCAiUENTX1dHUzg0X1VUTV96b25lXzE2UyJ9LAorICAgIHszMjcxNywgIlBDU19XR1M4NF9VVE1fem9uZV8xN1MifSwKKyAgICB7MzI3MTgsICJQQ1NfV0dTODRfVVRNX3pvbmVfMThTIn0sCisgICAgezMyNzE5LCAiUENTX1dHUzg0X1VUTV96b25lXzE5UyJ9LAorICAgIHszMjcyMCwgIlBDU19XR1M4NF9VVE1fem9uZV8yMFMifSwKKyAgICB7MzI3MjEsICJQQ1NfV0dTODRfVVRNX3pvbmVfMjFTIn0sCisgICAgezMyNzIyLCAiUENTX1dHUzg0X1VUTV96b25lXzIyUyJ9LAorICAgIHszMjcyMywgIlBDU19XR1M4NF9VVE1fem9uZV8yM1MifSwKKyAgICB7MzI3MjQsICJQQ1NfV0dTODRfVVRNX3pvbmVfMjRTIn0sCisgICAgezMyNzI1LCAiUENTX1dHUzg0X1VUTV96b25lXzI1UyJ9LAorICAgIHszMjcyNiwgIlBDU19XR1M4NF9VVE1fem9uZV8yNlMifSwKKyAgICB7MzI3MjcsICJQQ1NfV0dTODRfVVRNX3pvbmVfMjdTIn0sCisgICAgezMyNzI4LCAiUENTX1dHUzg0X1VUTV96b25lXzI4UyJ9LAorICAgIHszMjcyOSwgIlBDU19XR1M4NF9VVE1fem9uZV8yOVMifSwKKyAgICB7MzI3MzAsICJQQ1NfV0dTODRfVVRNX3pvbmVfMzBTIn0sCisgICAgezMyNzMxLCAiUENTX1dHUzg0X1VUTV96b25lXzMxUyJ9LAorICAgIHszMjczMiwgIlBDU19XR1M4NF9VVE1fem9uZV8zMlMifSwKKyAgICB7MzI3MzMsICJQQ1NfV0dTODRfVVRNX3pvbmVfMzNTIn0sCisgICAgezMyNzM0LCAiUENTX1dHUzg0X1VUTV96b25lXzM0UyJ9LAorICAgIHszMjczNSwgIlBDU19XR1M4NF9VVE1fem9uZV8zNVMifSwKKyAgICB7MzI3MzYsICJQQ1NfV0dTODRfVVRNX3pvbmVfMzZTIn0sCisgICAgezMyNzM3LCAiUENTX1dHUzg0X1VUTV96b25lXzM3UyJ9LAorICAgIHszMjczOCwgIlBDU19XR1M4NF9VVE1fem9uZV8zOFMifSwKKyAgICB7MzI3MzksICJQQ1NfV0dTODRfVVRNX3pvbmVfMzlTIn0sCisgICAgezMyNzQwLCAiUENTX1dHUzg0X1VUTV96b25lXzQwUyJ9LAorICAgIHszMjc0MSwgIlBDU19XR1M4NF9VVE1fem9uZV80MVMifSwKKyAgICB7MzI3NDIsICJQQ1NfV0dTODRfVVRNX3pvbmVfNDJTIn0sCisgICAgezMyNzQzLCAiUENTX1dHUzg0X1VUTV96b25lXzQzUyJ9LAorICAgIHszMjc0NCwgIlBDU19XR1M4NF9VVE1fem9uZV80NFMifSwKKyAgICB7MzI3NDUsICJQQ1NfV0dTODRfVVRNX3pvbmVfNDVTIn0sCisgICAgezMyNzQ2LCAiUENTX1dHUzg0X1VUTV96b25lXzQ2UyJ9LAorICAgIHszMjc0NywgIlBDU19XR1M4NF9VVE1fem9uZV80N1MifSwKKyAgICB7MzI3NDgsICJQQ1NfV0dTODRfVVRNX3pvbmVfNDhTIn0sCisgICAgezMyNzQ5LCAiUENTX1dHUzg0X1VUTV96b25lXzQ5UyJ9LAorICAgIHszMjc1MCwgIlBDU19XR1M4NF9VVE1fem9uZV81MFMifSwKKyAgICB7MzI3NTEsICJQQ1NfV0dTODRfVVRNX3pvbmVfNTFTIn0sCisgICAgezMyNzUyLCAiUENTX1dHUzg0X1VUTV96b25lXzUyUyJ9LAorICAgIHszMjc1MywgIlBDU19XR1M4NF9VVE1fem9uZV81M1MifSwKKyAgICB7MzI3NTQsICJQQ1NfV0dTODRfVVRNX3pvbmVfNTRTIn0sCisgICAgezMyNzU1LCAiUENTX1dHUzg0X1VUTV96b25lXzU1UyJ9LAorICAgIHszMjc1NiwgIlBDU19XR1M4NF9VVE1fem9uZV81NlMifSwKKyAgICB7MzI3NTcsICJQQ1NfV0dTODRfVVRNX3pvbmVfNTdTIn0sCisgICAgezMyNzU4LCAiUENTX1dHUzg0X1VUTV96b25lXzU4UyJ9LAorICAgIHszMjc1OSwgIlBDU19XR1M4NF9VVE1fem9uZV81OVMifSwKKyAgICB7MzI3NjAsICJQQ1NfV0dTODRfVVRNX3pvbmVfNjBTIn0KK307CisKK2NvbnN0IFRpZmZHZW9UYWdLZXlOYW1lIGZmX3RpZmZfcHJvamVjdGlvbl9jb2Rlc1tdID0geworICAgIHsxMDEwMSwgIlByb2pfQWxhYmFtYV9DUzI3X0Vhc3QifSwKKyAgICB7MTAxMDIsICJQcm9qX0FsYWJhbWFfQ1MyN19XZXN0In0sCisgICAgezEwMTMxLCAiUHJval9BbGFiYW1hX0NTODNfRWFzdCJ9LAorICAgIHsxMDEzMiwgIlByb2pfQWxhYmFtYV9DUzgzX1dlc3QifSwKKyAgICB7MTAyMDEsICJQcm9qX0FyaXpvbmFfQ29vcmRpbmF0ZV9TeXN0ZW1fZWFzdCJ9LAorICAgIHsxMDIwMiwgIlByb2pfQXJpem9uYV9Db29yZGluYXRlX1N5c3RlbV9DZW50cmFsIn0sCisgICAgezEwMjAzLCAiUHJval9Bcml6b25hX0Nvb3JkaW5hdGVfU3lzdGVtX3dlc3QifSwKKyAgICB7MTAyMzEsICJQcm9qX0FyaXpvbmFfQ1M4M19lYXN0In0sCisgICAgezEwMjMyLCAiUHJval9Bcml6b25hX0NTODNfQ2VudHJhbCJ9LAorICAgIHsxMDIzMywgIlByb2pfQXJpem9uYV9DUzgzX3dlc3QifSwKKyAgICB7MTAzMDEsICJQcm9qX0Fya2Fuc2FzX0NTMjdfTm9ydGgifSwKKyAgICB7MTAzMDIsICJQcm9qX0Fya2Fuc2FzX0NTMjdfU291dGgifSwKKyAgICB7MTAzMzEsICJQcm9qX0Fya2Fuc2FzX0NTODNfTm9ydGgifSwKKyAgICB7MTAzMzIsICJQcm9qX0Fya2Fuc2FzX0NTODNfU291dGgifSwKKyAgICB7MTA0MDEsICJQcm9qX0NhbGlmb3JuaWFfQ1MyN19JIn0sCisgICAgezEwNDAyLCAiUHJval9DYWxpZm9ybmlhX0NTMjdfSUkifSwKKyAgICB7MTA0MDMsICJQcm9qX0NhbGlmb3JuaWFfQ1MyN19JSUkifSwKKyAgICB7MTA0MDQsICJQcm9qX0NhbGlmb3JuaWFfQ1MyN19JViJ9LAorICAgIHsxMDQwNSwgIlByb2pfQ2FsaWZvcm5pYV9DUzI3X1YifSwKKyAgICB7MTA0MDYsICJQcm9qX0NhbGlmb3JuaWFfQ1MyN19WSSJ9LAorICAgIHsxMDQwNywgIlByb2pfQ2FsaWZvcm5pYV9DUzI3X1ZJSSJ9LAorICAgIHsxMDQzMSwgIlByb2pfQ2FsaWZvcm5pYV9DUzgzXzEifSwKKyAgICB7MTA0MzIsICJQcm9qX0NhbGlmb3JuaWFfQ1M4M18yIn0sCisgICAgezEwNDMzLCAiUHJval9DYWxpZm9ybmlhX0NTODNfMyJ9LAorICAgIHsxMDQzNCwgIlByb2pfQ2FsaWZvcm5pYV9DUzgzXzQifSwKKyAgICB7MTA0MzUsICJQcm9qX0NhbGlmb3JuaWFfQ1M4M181In0sCisgICAgezEwNDM2LCAiUHJval9DYWxpZm9ybmlhX0NTODNfNiJ9LAorICAgIHsxMDUwMSwgIlByb2pfQ29sb3JhZG9fQ1MyN19Ob3J0aCJ9LAorICAgIHsxMDUwMiwgIlByb2pfQ29sb3JhZG9fQ1MyN19DZW50cmFsIn0sCisgICAgezEwNTAzLCAiUHJval9Db2xvcmFkb19DUzI3X1NvdXRoIn0sCisgICAgezEwNTMxLCAiUHJval9Db2xvcmFkb19DUzgzX05vcnRoIn0sCisgICAgezEwNTMyLCAiUHJval9Db2xvcmFkb19DUzgzX0NlbnRyYWwifSwKKyAgICB7MTA1MzMsICJQcm9qX0NvbG9yYWRvX0NTODNfU291dGgifSwKKyAgICB7MTA2MDAsICJQcm9qX0Nvbm5lY3RpY3V0X0NTMjcifSwKKyAgICB7MTA2MzAsICJQcm9qX0Nvbm5lY3RpY3V0X0NTODMifSwKKyAgICB7MTA3MDAsICJQcm9qX0RlbGF3YXJlX0NTMjcifSwKKyAgICB7MTA3MzAsICJQcm9qX0RlbGF3YXJlX0NTODMifSwKKyAgICB7MTA5MDEsICJQcm9qX0Zsb3JpZGFfQ1MyN19FYXN0In0sCisgICAgezEwOTAyLCAiUHJval9GbG9yaWRhX0NTMjdfV2VzdCJ9LAorICAgIHsxMDkwMywgIlByb2pfRmxvcmlkYV9DUzI3X05vcnRoIn0sCisgICAgezEwOTMxLCAiUHJval9GbG9yaWRhX0NTODNfRWFzdCJ9LAorICAgIHsxMDkzMiwgIlByb2pfRmxvcmlkYV9DUzgzX1dlc3QifSwKKyAgICB7MTA5MzMsICJQcm9qX0Zsb3JpZGFfQ1M4M19Ob3J0aCJ9LAorICAgIHsxMTAwMSwgIlByb2pfR2VvcmdpYV9DUzI3X0Vhc3QifSwKKyAgICB7MTEwMDIsICJQcm9qX0dlb3JnaWFfQ1MyN19XZXN0In0sCisgICAgezExMDMxLCAiUHJval9HZW9yZ2lhX0NTODNfRWFzdCJ9LAorICAgIHsxMTAzMiwgIlByb2pfR2VvcmdpYV9DUzgzX1dlc3QifSwKKyAgICB7MTExMDEsICJQcm9qX0lkYWhvX0NTMjdfRWFzdCJ9LAorICAgIHsxMTEwMiwgIlByb2pfSWRhaG9fQ1MyN19DZW50cmFsIn0sCisgICAgezExMTAzLCAiUHJval9JZGFob19DUzI3X1dlc3QifSwKKyAgICB7MTExMzEsICJQcm9qX0lkYWhvX0NTODNfRWFzdCJ9LAorICAgIHsxMTEzMiwgIlByb2pfSWRhaG9fQ1M4M19DZW50cmFsIn0sCisgICAgezExMTMzLCAiUHJval9JZGFob19DUzgzX1dlc3QifSwKKyAgICB7MTEyMDEsICJQcm9qX0lsbGlub2lzX0NTMjdfRWFzdCJ9LAorICAgIHsxMTIwMiwgIlByb2pfSWxsaW5vaXNfQ1MyN19XZXN0In0sCisgICAgezExMjMxLCAiUHJval9JbGxpbm9pc19DUzgzX0Vhc3QifSwKKyAgICB7MTEyMzIsICJQcm9qX0lsbGlub2lzX0NTODNfV2VzdCJ9LAorICAgIHsxMTMwMSwgIlByb2pfSW5kaWFuYV9DUzI3X0Vhc3QifSwKKyAgICB7MTEzMDIsICJQcm9qX0luZGlhbmFfQ1MyN19XZXN0In0sCisgICAgezExMzMxLCAiUHJval9JbmRpYW5hX0NTODNfRWFzdCJ9LAorICAgIHsxMTMzMiwgIlByb2pfSW5kaWFuYV9DUzgzX1dlc3QifSwKKyAgICB7MTE0MDEsICJQcm9qX0lvd2FfQ1MyN19Ob3J0aCJ9LAorICAgIHsxMTQwMiwgIlByb2pfSW93YV9DUzI3X1NvdXRoIn0sCisgICAgezExNDMxLCAiUHJval9Jb3dhX0NTODNfTm9ydGgifSwKKyAgICB7MTE0MzIsICJQcm9qX0lvd2FfQ1M4M19Tb3V0aCJ9LAorICAgIHsxMTUwMSwgIlByb2pfS2Fuc2FzX0NTMjdfTm9ydGgifSwKKyAgICB7MTE1MDIsICJQcm9qX0thbnNhc19DUzI3X1NvdXRoIn0sCisgICAgezExNTMxLCAiUHJval9LYW5zYXNfQ1M4M19Ob3J0aCJ9LAorICAgIHsxMTUzMiwgIlByb2pfS2Fuc2FzX0NTODNfU291dGgifSwKKyAgICB7MTE2MDEsICJQcm9qX0tlbnR1Y2t5X0NTMjdfTm9ydGgifSwKKyAgICB7MTE2MDIsICJQcm9qX0tlbnR1Y2t5X0NTMjdfU291dGgifSwKKyAgICB7MTE2MzEsICJQcm9qX0tlbnR1Y2t5X0NTODNfTm9ydGgifSwKKyAgICB7MTE2MzIsICJQcm9qX0tlbnR1Y2t5X0NTODNfU291dGgifSwKKyAgICB7MTE3MDEsICJQcm9qX0xvdWlzaWFuYV9DUzI3X05vcnRoIn0sCisgICAgezExNzAyLCAiUHJval9Mb3Vpc2lhbmFfQ1MyN19Tb3V0aCJ9LAorICAgIHsxMTczMSwgIlByb2pfTG91aXNpYW5hX0NTODNfTm9ydGgifSwKKyAgICB7MTE3MzIsICJQcm9qX0xvdWlzaWFuYV9DUzgzX1NvdXRoIn0sCisgICAgezExODAxLCAiUHJval9NYWluZV9DUzI3X0Vhc3QifSwKKyAgICB7MTE4MDIsICJQcm9qX01haW5lX0NTMjdfV2VzdCJ9LAorICAgIHsxMTgzMSwgIlByb2pfTWFpbmVfQ1M4M19FYXN0In0sCisgICAgezExODMyLCAiUHJval9NYWluZV9DUzgzX1dlc3QifSwKKyAgICB7MTE5MDAsICJQcm9qX01hcnlsYW5kX0NTMjcifSwKKyAgICB7MTE5MzAsICJQcm9qX01hcnlsYW5kX0NTODMifSwKKyAgICB7MTIwMDEsICJQcm9qX01hc3NhY2h1c2V0dHNfQ1MyN19NYWlubGFuZCJ9LAorICAgIHsxMjAwMiwgIlByb2pfTWFzc2FjaHVzZXR0c19DUzI3X0lzbGFuZCJ9LAorICAgIHsxMjAzMSwgIlByb2pfTWFzc2FjaHVzZXR0c19DUzgzX01haW5sYW5kIn0sCisgICAgezEyMDMyLCAiUHJval9NYXNzYWNodXNldHRzX0NTODNfSXNsYW5kIn0sCisgICAgezEyMTAxLCAiUHJval9NaWNoaWdhbl9TdGF0ZV9QbGFuZV9FYXN0In0sCisgICAgezEyMTAyLCAiUHJval9NaWNoaWdhbl9TdGF0ZV9QbGFuZV9PbGRfQ2VudHJhbCJ9LAorICAgIHsxMjEwMywgIlByb2pfTWljaGlnYW5fU3RhdGVfUGxhbmVfV2VzdCJ9LAorICAgIHsxMjExMSwgIlByb2pfTWljaGlnYW5fQ1MyN19Ob3J0aCJ9LAorICAgIHsxMjExMiwgIlByb2pfTWljaGlnYW5fQ1MyN19DZW50cmFsIn0sCisgICAgezEyMTEzLCAiUHJval9NaWNoaWdhbl9DUzI3X1NvdXRoIn0sCisgICAgezEyMTQxLCAiUHJval9NaWNoaWdhbl9DUzgzX05vcnRoIn0sCisgICAgezEyMTQyLCAiUHJval9NaWNoaWdhbl9DUzgzX0NlbnRyYWwifSwKKyAgICB7MTIxNDMsICJQcm9qX01pY2hpZ2FuX0NTODNfU291dGgifSwKKyAgICB7MTIyMDEsICJQcm9qX01pbm5lc290YV9DUzI3X05vcnRoIn0sCisgICAgezEyMjAyLCAiUHJval9NaW5uZXNvdGFfQ1MyN19DZW50cmFsIn0sCisgICAgezEyMjAzLCAiUHJval9NaW5uZXNvdGFfQ1MyN19Tb3V0aCJ9LAorICAgIHsxMjIzMSwgIlByb2pfTWlubmVzb3RhX0NTODNfTm9ydGgifSwKKyAgICB7MTIyMzIsICJQcm9qX01pbm5lc290YV9DUzgzX0NlbnRyYWwifSwKKyAgICB7MTIyMzMsICJQcm9qX01pbm5lc290YV9DUzgzX1NvdXRoIn0sCisgICAgezEyMzAxLCAiUHJval9NaXNzaXNzaXBwaV9DUzI3X0Vhc3QifSwKKyAgICB7MTIzMDIsICJQcm9qX01pc3Npc3NpcHBpX0NTMjdfV2VzdCJ9LAorICAgIHsxMjMzMSwgIlByb2pfTWlzc2lzc2lwcGlfQ1M4M19FYXN0In0sCisgICAgezEyMzMyLCAiUHJval9NaXNzaXNzaXBwaV9DUzgzX1dlc3QifSwKKyAgICB7MTI0MDEsICJQcm9qX01pc3NvdXJpX0NTMjdfRWFzdCJ9LAorICAgIHsxMjQwMiwgIlByb2pfTWlzc291cmlfQ1MyN19DZW50cmFsIn0sCisgICAgezEyNDAzLCAiUHJval9NaXNzb3VyaV9DUzI3X1dlc3QifSwKKyAgICB7MTI0MzEsICJQcm9qX01pc3NvdXJpX0NTODNfRWFzdCJ9LAorICAgIHsxMjQzMiwgIlByb2pfTWlzc291cmlfQ1M4M19DZW50cmFsIn0sCisgICAgezEyNDMzLCAiUHJval9NaXNzb3VyaV9DUzgzX1dlc3QifSwKKyAgICB7MTI1MDEsICJQcm9qX01vbnRhbmFfQ1MyN19Ob3J0aCJ9LAorICAgIHsxMjUwMiwgIlByb2pfTW9udGFuYV9DUzI3X0NlbnRyYWwifSwKKyAgICB7MTI1MDMsICJQcm9qX01vbnRhbmFfQ1MyN19Tb3V0aCJ9LAorICAgIHsxMjUzMCwgIlByb2pfTW9udGFuYV9DUzgzIn0sCisgICAgezEyNjAxLCAiUHJval9OZWJyYXNrYV9DUzI3X05vcnRoIn0sCisgICAgezEyNjAyLCAiUHJval9OZWJyYXNrYV9DUzI3X1NvdXRoIn0sCisgICAgezEyNjMwLCAiUHJval9OZWJyYXNrYV9DUzgzIn0sCisgICAgezEyNzAxLCAiUHJval9OZXZhZGFfQ1MyN19FYXN0In0sCisgICAgezEyNzAyLCAiUHJval9OZXZhZGFfQ1MyN19DZW50cmFsIn0sCisgICAgezEyNzAzLCAiUHJval9OZXZhZGFfQ1MyN19XZXN0In0sCisgICAgezEyNzMxLCAiUHJval9OZXZhZGFfQ1M4M19FYXN0In0sCisgICAgezEyNzMyLCAiUHJval9OZXZhZGFfQ1M4M19DZW50cmFsIn0sCisgICAgezEyNzMzLCAiUHJval9OZXZhZGFfQ1M4M19XZXN0In0sCisgICAgezEyODAwLCAiUHJval9OZXdfSGFtcHNoaXJlX0NTMjcifSwKKyAgICB7MTI4MzAsICJQcm9qX05ld19IYW1wc2hpcmVfQ1M4MyJ9LAorICAgIHsxMjkwMCwgIlByb2pfTmV3X0plcnNleV9DUzI3In0sCisgICAgezEyOTMwLCAiUHJval9OZXdfSmVyc2V5X0NTODMifSwKKyAgICB7MTMwMDEsICJQcm9qX05ld19NZXhpY29fQ1MyN19FYXN0In0sCisgICAgezEzMDAyLCAiUHJval9OZXdfTWV4aWNvX0NTMjdfQ2VudHJhbCJ9LAorICAgIHsxMzAwMywgIlByb2pfTmV3X01leGljb19DUzI3X1dlc3QifSwKKyAgICB7MTMwMzEsICJQcm9qX05ld19NZXhpY29fQ1M4M19FYXN0In0sCisgICAgezEzMDMyLCAiUHJval9OZXdfTWV4aWNvX0NTODNfQ2VudHJhbCJ9LAorICAgIHsxMzAzMywgIlByb2pfTmV3X01leGljb19DUzgzX1dlc3QifSwKKyAgICB7MTMxMDEsICJQcm9qX05ld19Zb3JrX0NTMjdfRWFzdCJ9LAorICAgIHsxMzEwMiwgIlByb2pfTmV3X1lvcmtfQ1MyN19DZW50cmFsIn0sCisgICAgezEzMTAzLCAiUHJval9OZXdfWW9ya19DUzI3X1dlc3QifSwKKyAgICB7MTMxMDQsICJQcm9qX05ld19Zb3JrX0NTMjdfTG9uZ19Jc2xhbmQifSwKKyAgICB7MTMxMzEsICJQcm9qX05ld19Zb3JrX0NTODNfRWFzdCJ9LAorICAgIHsxMzEzMiwgIlByb2pfTmV3X1lvcmtfQ1M4M19DZW50cmFsIn0sCisgICAgezEzMTMzLCAiUHJval9OZXdfWW9ya19DUzgzX1dlc3QifSwKKyAgICB7MTMxMzQsICJQcm9qX05ld19Zb3JrX0NTODNfTG9uZ19Jc2xhbmQifSwKKyAgICB7MTMyMDAsICJQcm9qX05vcnRoX0Nhcm9saW5hX0NTMjcifSwKKyAgICB7MTMyMzAsICJQcm9qX05vcnRoX0Nhcm9saW5hX0NTODMifSwKKyAgICB7MTMzMDEsICJQcm9qX05vcnRoX0Rha290YV9DUzI3X05vcnRoIn0sCisgICAgezEzMzAyLCAiUHJval9Ob3J0aF9EYWtvdGFfQ1MyN19Tb3V0aCJ9LAorICAgIHsxMzMzMSwgIlByb2pfTm9ydGhfRGFrb3RhX0NTODNfTm9ydGgifSwKKyAgICB7MTMzMzIsICJQcm9qX05vcnRoX0Rha290YV9DUzgzX1NvdXRoIn0sCisgICAgezEzNDAxLCAiUHJval9PaGlvX0NTMjdfTm9ydGgifSwKKyAgICB7MTM0MDIsICJQcm9qX09oaW9fQ1MyN19Tb3V0aCJ9LAorICAgIHsxMzQzMSwgIlByb2pfT2hpb19DUzgzX05vcnRoIn0sCisgICAgezEzNDMyLCAiUHJval9PaGlvX0NTODNfU291dGgifSwKKyAgICB7MTM1MDEsICJQcm9qX09rbGFob21hX0NTMjdfTm9ydGgifSwKKyAgICB7MTM1MDIsICJQcm9qX09rbGFob21hX0NTMjdfU291dGgifSwKKyAgICB7MTM1MzEsICJQcm9qX09rbGFob21hX0NTODNfTm9ydGgifSwKKyAgICB7MTM1MzIsICJQcm9qX09rbGFob21hX0NTODNfU291dGgifSwKKyAgICB7MTM2MDEsICJQcm9qX09yZWdvbl9DUzI3X05vcnRoIn0sCisgICAgezEzNjAyLCAiUHJval9PcmVnb25fQ1MyN19Tb3V0aCJ9LAorICAgIHsxMzYzMSwgIlByb2pfT3JlZ29uX0NTODNfTm9ydGgifSwKKyAgICB7MTM2MzIsICJQcm9qX09yZWdvbl9DUzgzX1NvdXRoIn0sCisgICAgezEzNzAxLCAiUHJval9QZW5uc3lsdmFuaWFfQ1MyN19Ob3J0aCJ9LAorICAgIHsxMzcwMiwgIlByb2pfUGVubnN5bHZhbmlhX0NTMjdfU291dGgifSwKKyAgICB7MTM3MzEsICJQcm9qX1Blbm5zeWx2YW5pYV9DUzgzX05vcnRoIn0sCisgICAgezEzNzMyLCAiUHJval9QZW5uc3lsdmFuaWFfQ1M4M19Tb3V0aCJ9LAorICAgIHsxMzgwMCwgIlByb2pfUmhvZGVfSXNsYW5kX0NTMjcifSwKKyAgICB7MTM4MzAsICJQcm9qX1Job2RlX0lzbGFuZF9DUzgzIn0sCisgICAgezEzOTAxLCAiUHJval9Tb3V0aF9DYXJvbGluYV9DUzI3X05vcnRoIn0sCisgICAgezEzOTAyLCAiUHJval9Tb3V0aF9DYXJvbGluYV9DUzI3X1NvdXRoIn0sCisgICAgezEzOTMwLCAiUHJval9Tb3V0aF9DYXJvbGluYV9DUzgzIn0sCisgICAgezE0MDAxLCAiUHJval9Tb3V0aF9EYWtvdGFfQ1MyN19Ob3J0aCJ9LAorICAgIHsxNDAwMiwgIlByb2pfU291dGhfRGFrb3RhX0NTMjdfU291dGgifSwKKyAgICB7MTQwMzEsICJQcm9qX1NvdXRoX0Rha290YV9DUzgzX05vcnRoIn0sCisgICAgezE0MDMyLCAiUHJval9Tb3V0aF9EYWtvdGFfQ1M4M19Tb3V0aCJ9LAorICAgIHsxNDEwMCwgIlByb2pfVGVubmVzc2VlX0NTMjcifSwKKyAgICB7MTQxMzAsICJQcm9qX1Rlbm5lc3NlZV9DUzgzIn0sCisgICAgezE0MjAxLCAiUHJval9UZXhhc19DUzI3X05vcnRoIn0sCisgICAgezE0MjAyLCAiUHJval9UZXhhc19DUzI3X05vcnRoX0NlbnRyYWwifSwKKyAgICB7MTQyMDMsICJQcm9qX1RleGFzX0NTMjdfQ2VudHJhbCJ9LAorICAgIHsxNDIwNCwgIlByb2pfVGV4YXNfQ1MyN19Tb3V0aF9DZW50cmFsIn0sCisgICAgezE0MjA1LCAiUHJval9UZXhhc19DUzI3X1NvdXRoIn0sCisgICAgezE0MjMxLCAiUHJval9UZXhhc19DUzgzX05vcnRoIn0sCisgICAgezE0MjMyLCAiUHJval9UZXhhc19DUzgzX05vcnRoX0NlbnRyYWwifSwKKyAgICB7MTQyMzMsICJQcm9qX1RleGFzX0NTODNfQ2VudHJhbCJ9LAorICAgIHsxNDIzNCwgIlByb2pfVGV4YXNfQ1M4M19Tb3V0aF9DZW50cmFsIn0sCisgICAgezE0MjM1LCAiUHJval9UZXhhc19DUzgzX1NvdXRoIn0sCisgICAgezE0MzAxLCAiUHJval9VdGFoX0NTMjdfTm9ydGgifSwKKyAgICB7MTQzMDIsICJQcm9qX1V0YWhfQ1MyN19DZW50cmFsIn0sCisgICAgezE0MzAzLCAiUHJval9VdGFoX0NTMjdfU291dGgifSwKKyAgICB7MTQzMzEsICJQcm9qX1V0YWhfQ1M4M19Ob3J0aCJ9LAorICAgIHsxNDMzMiwgIlByb2pfVXRhaF9DUzgzX0NlbnRyYWwifSwKKyAgICB7MTQzMzMsICJQcm9qX1V0YWhfQ1M4M19Tb3V0aCJ9LAorICAgIHsxNDQwMCwgIlByb2pfVmVybW9udF9DUzI3In0sCisgICAgezE0NDMwLCAiUHJval9WZXJtb250X0NTODMifSwKKyAgICB7MTQ1MDEsICJQcm9qX1ZpcmdpbmlhX0NTMjdfTm9ydGgifSwKKyAgICB7MTQ1MDIsICJQcm9qX1ZpcmdpbmlhX0NTMjdfU291dGgifSwKKyAgICB7MTQ1MzEsICJQcm9qX1ZpcmdpbmlhX0NTODNfTm9ydGgifSwKKyAgICB7MTQ1MzIsICJQcm9qX1ZpcmdpbmlhX0NTODNfU291dGgifSwKKyAgICB7MTQ2MDEsICJQcm9qX1dhc2hpbmd0b25fQ1MyN19Ob3J0aCJ9LAorICAgIHsxNDYwMiwgIlByb2pfV2FzaGluZ3Rvbl9DUzI3X1NvdXRoIn0sCisgICAgezE0NjMxLCAiUHJval9XYXNoaW5ndG9uX0NTODNfTm9ydGgifSwKKyAgICB7MTQ2MzIsICJQcm9qX1dhc2hpbmd0b25fQ1M4M19Tb3V0aCJ9LAorICAgIHsxNDcwMSwgIlByb2pfV2VzdF9WaXJnaW5pYV9DUzI3X05vcnRoIn0sCisgICAgezE0NzAyLCAiUHJval9XZXN0X1ZpcmdpbmlhX0NTMjdfU291dGgifSwKKyAgICB7MTQ3MzEsICJQcm9qX1dlc3RfVmlyZ2luaWFfQ1M4M19Ob3J0aCJ9LAorICAgIHsxNDczMiwgIlByb2pfV2VzdF9WaXJnaW5pYV9DUzgzX1NvdXRoIn0sCisgICAgezE0ODAxLCAiUHJval9XaXNjb25zaW5fQ1MyN19Ob3J0aCJ9LAorICAgIHsxNDgwMiwgIlByb2pfV2lzY29uc2luX0NTMjdfQ2VudHJhbCJ9LAorICAgIHsxNDgwMywgIlByb2pfV2lzY29uc2luX0NTMjdfU291dGgifSwKKyAgICB7MTQ4MzEsICJQcm9qX1dpc2NvbnNpbl9DUzgzX05vcnRoIn0sCisgICAgezE0ODMyLCAiUHJval9XaXNjb25zaW5fQ1M4M19DZW50cmFsIn0sCisgICAgezE0ODMzLCAiUHJval9XaXNjb25zaW5fQ1M4M19Tb3V0aCJ9LAorICAgIHsxNDkwMSwgIlByb2pfV3lvbWluZ19DUzI3X0Vhc3QifSwKKyAgICB7MTQ5MDIsICJQcm9qX1d5b21pbmdfQ1MyN19FYXN0X0NlbnRyYWwifSwKKyAgICB7MTQ5MDMsICJQcm9qX1d5b21pbmdfQ1MyN19XZXN0X0NlbnRyYWwifSwKKyAgICB7MTQ5MDQsICJQcm9qX1d5b21pbmdfQ1MyN19XZXN0In0sCisgICAgezE0OTMxLCAiUHJval9XeW9taW5nX0NTODNfRWFzdCJ9LAorICAgIHsxNDkzMiwgIlByb2pfV3lvbWluZ19DUzgzX0Vhc3RfQ2VudHJhbCJ9LAorICAgIHsxNDkzMywgIlByb2pfV3lvbWluZ19DUzgzX1dlc3RfQ2VudHJhbCJ9LAorICAgIHsxNDkzNCwgIlByb2pfV3lvbWluZ19DUzgzX1dlc3QifSwKKyAgICB7MTUwMDEsICJQcm9qX0FsYXNrYV9DUzI3XzEifSwKKyAgICB7MTUwMDIsICJQcm9qX0FsYXNrYV9DUzI3XzIifSwKKyAgICB7MTUwMDMsICJQcm9qX0FsYXNrYV9DUzI3XzMifSwKKyAgICB7MTUwMDQsICJQcm9qX0FsYXNrYV9DUzI3XzQifSwKKyAgICB7MTUwMDUsICJQcm9qX0FsYXNrYV9DUzI3XzUifSwKKyAgICB7MTUwMDYsICJQcm9qX0FsYXNrYV9DUzI3XzYifSwKKyAgICB7MTUwMDcsICJQcm9qX0FsYXNrYV9DUzI3XzcifSwKKyAgICB7MTUwMDgsICJQcm9qX0FsYXNrYV9DUzI3XzgifSwKKyAgICB7MTUwMDksICJQcm9qX0FsYXNrYV9DUzI3XzkifSwKKyAgICB7MTUwMTAsICJQcm9qX0FsYXNrYV9DUzI3XzEwIn0sCisgICAgezE1MDMxLCAiUHJval9BbGFza2FfQ1M4M18xIn0sCisgICAgezE1MDMyLCAiUHJval9BbGFza2FfQ1M4M18yIn0sCisgICAgezE1MDMzLCAiUHJval9BbGFza2FfQ1M4M18zIn0sCisgICAgezE1MDM0LCAiUHJval9BbGFza2FfQ1M4M180In0sCisgICAgezE1MDM1LCAiUHJval9BbGFza2FfQ1M4M181In0sCisgICAgezE1MDM2LCAiUHJval9BbGFza2FfQ1M4M182In0sCisgICAgezE1MDM3LCAiUHJval9BbGFza2FfQ1M4M183In0sCisgICAgezE1MDM4LCAiUHJval9BbGFza2FfQ1M4M184In0sCisgICAgezE1MDM5LCAiUHJval9BbGFza2FfQ1M4M185In0sCisgICAgezE1MDQwLCAiUHJval9BbGFza2FfQ1M4M18xMCJ9LAorICAgIHsxNTEwMSwgIlByb2pfSGF3YWlpX0NTMjdfMSJ9LAorICAgIHsxNTEwMiwgIlByb2pfSGF3YWlpX0NTMjdfMiJ9LAorICAgIHsxNTEwMywgIlByb2pfSGF3YWlpX0NTMjdfMyJ9LAorICAgIHsxNTEwNCwgIlByb2pfSGF3YWlpX0NTMjdfNCJ9LAorICAgIHsxNTEwNSwgIlByb2pfSGF3YWlpX0NTMjdfNSJ9LAorICAgIHsxNTEzMSwgIlByb2pfSGF3YWlpX0NTODNfMSJ9LAorICAgIHsxNTEzMiwgIlByb2pfSGF3YWlpX0NTODNfMiJ9LAorICAgIHsxNTEzMywgIlByb2pfSGF3YWlpX0NTODNfMyJ9LAorICAgIHsxNTEzNCwgIlByb2pfSGF3YWlpX0NTODNfNCJ9LAorICAgIHsxNTEzNSwgIlByb2pfSGF3YWlpX0NTODNfNSJ9LAorICAgIHsxNTIwMSwgIlByb2pfUHVlcnRvX1JpY29fQ1MyNyJ9LAorICAgIHsxNTIwMiwgIlByb2pfU3RfQ3JvaXgifSwKKyAgICB7MTUyMzAsICJQcm9qX1B1ZXJ0b19SaWNvX1Zpcmdpbl9JcyJ9LAorICAgIHsxNTkxNCwgIlByb2pfQkxNXzE0Tl9mZWV0In0sCisgICAgezE1OTE1LCAiUHJval9CTE1fMTVOX2ZlZXQifSwKKyAgICB7MTU5MTYsICJQcm9qX0JMTV8xNk5fZmVldCJ9LAorICAgIHsxNTkxNywgIlByb2pfQkxNXzE3Tl9mZWV0In0sCisgICAgezE3MzQ4LCAiUHJval9NYXBfR3JpZF9vZl9BdXN0cmFsaWFfNDgifSwKKyAgICB7MTczNDksICJQcm9qX01hcF9HcmlkX29mX0F1c3RyYWxpYV80OSJ9LAorICAgIHsxNzM1MCwgIlByb2pfTWFwX0dyaWRfb2ZfQXVzdHJhbGlhXzUwIn0sCisgICAgezE3MzUxLCAiUHJval9NYXBfR3JpZF9vZl9BdXN0cmFsaWFfNTEifSwKKyAgICB7MTczNTIsICJQcm9qX01hcF9HcmlkX29mX0F1c3RyYWxpYV81MiJ9LAorICAgIHsxNzM1MywgIlByb2pfTWFwX0dyaWRfb2ZfQXVzdHJhbGlhXzUzIn0sCisgICAgezE3MzU0LCAiUHJval9NYXBfR3JpZF9vZl9BdXN0cmFsaWFfNTQifSwKKyAgICB7MTczNTUsICJQcm9qX01hcF9HcmlkX29mX0F1c3RyYWxpYV81NSJ9LAorICAgIHsxNzM1NiwgIlByb2pfTWFwX0dyaWRfb2ZfQXVzdHJhbGlhXzU2In0sCisgICAgezE3MzU3LCAiUHJval9NYXBfR3JpZF9vZl9BdXN0cmFsaWFfNTcifSwKKyAgICB7MTczNTgsICJQcm9qX01hcF9HcmlkX29mX0F1c3RyYWxpYV81OCJ9LAorICAgIHsxNzQ0OCwgIlByb2pfQXVzdHJhbGlhbl9NYXBfR3JpZF80OCJ9LAorICAgIHsxNzQ0OSwgIlByb2pfQXVzdHJhbGlhbl9NYXBfR3JpZF80OSJ9LAorICAgIHsxNzQ1MCwgIlByb2pfQXVzdHJhbGlhbl9NYXBfR3JpZF81MCJ9LAorICAgIHsxNzQ1MSwgIlByb2pfQXVzdHJhbGlhbl9NYXBfR3JpZF81MSJ9LAorICAgIHsxNzQ1MiwgIlByb2pfQXVzdHJhbGlhbl9NYXBfR3JpZF81MiJ9LAorICAgIHsxNzQ1MywgIlByb2pfQXVzdHJhbGlhbl9NYXBfR3JpZF81MyJ9LAorICAgIHsxNzQ1NCwgIlByb2pfQXVzdHJhbGlhbl9NYXBfR3JpZF81NCJ9LAorICAgIHsxNzQ1NSwgIlByb2pfQXVzdHJhbGlhbl9NYXBfR3JpZF81NSJ9LAorICAgIHsxNzQ1NiwgIlByb2pfQXVzdHJhbGlhbl9NYXBfR3JpZF81NiJ9LAorICAgIHsxNzQ1NywgIlByb2pfQXVzdHJhbGlhbl9NYXBfR3JpZF81NyJ9LAorICAgIHsxNzQ1OCwgIlByb2pfQXVzdHJhbGlhbl9NYXBfR3JpZF81OCJ9LAorICAgIHsxODAzMSwgIlByb2pfQXJnZW50aW5hXzEifSwKKyAgICB7MTgwMzIsICJQcm9qX0FyZ2VudGluYV8yIn0sCisgICAgezE4MDMzLCAiUHJval9BcmdlbnRpbmFfMyJ9LAorICAgIHsxODAzNCwgIlByb2pfQXJnZW50aW5hXzQifSwKKyAgICB7MTgwMzUsICJQcm9qX0FyZ2VudGluYV81In0sCisgICAgezE4MDM2LCAiUHJval9BcmdlbnRpbmFfNiJ9LAorICAgIHsxODAzNywgIlByb2pfQXJnZW50aW5hXzcifSwKKyAgICB7MTgwNTEsICJQcm9qX0NvbG9tYmlhXzNXIn0sCisgICAgezE4MDUyLCAiUHJval9Db2xvbWJpYV9Cb2dvdGEifSwKKyAgICB7MTgwNTMsICJQcm9qX0NvbG9tYmlhXzNFIn0sCisgICAgezE4MDU0LCAiUHJval9Db2xvbWJpYV82RSJ9LAorICAgIHsxODA3MiwgIlByb2pfRWd5cHRfUmVkX0JlbHQifSwKKyAgICB7MTgwNzMsICJQcm9qX0VneXB0X1B1cnBsZV9CZWx0In0sCisgICAgezE4MDc0LCAiUHJval9FeHRlbmRlZF9QdXJwbGVfQmVsdCJ9LAorICAgIHsxODE0MSwgIlByb2pfTmV3X1plYWxhbmRfTm9ydGhfSXNsYW5kX05hdF9HcmlkIn0sCisgICAgezE4MTQyLCAiUHJval9OZXdfWmVhbGFuZF9Tb3V0aF9Jc2xhbmRfTmF0X0dyaWQifSwKKyAgICB7MTk5MDAsICJQcm9qX0JhaHJhaW5fR3JpZCJ9LAorICAgIHsxOTkwNSwgIlByb2pfTmV0aGVybGFuZHNfRV9JbmRpZXNfRXF1YXRvcmlhbCJ9LAorICAgIHsxOTkxMiwgIlByb2pfUlNPX0Jvcm5lbyJ9Cit9OworCitjb25zdCBjaGFyICpjb25zdCBmZl90aWZmX2Nvb3JkX3RyYW5zX2NvZGVzW10gPSB7CisgICAgIkNUX1RyYW5zdmVyc2VNZXJjYXRvciIsCisgICAgIkNUX1RyYW5zdk1lcmNhdG9yX01vZGlmaWVkX0FsYXNrYSIsCisgICAgIkNUX09ibGlxdWVNZXJjYXRvciIsCisgICAgIkNUX09ibGlxdWVNZXJjYXRvcl9MYWJvcmRlIiwKKyAgICAiQ1RfT2JsaXF1ZU1lcmNhdG9yX1Jvc2VubXVuZCIsCisgICAgIkNUX09ibGlxdWVNZXJjYXRvcl9TcGhlcmljYWwiLAorICAgICJDVF9NZXJjYXRvciIsCisgICAgIkNUX0xhbWJlcnRDb25mQ29uaWNfMlNQIiwKKyAgICAiQ1RfTGFtYmVydENvbmZDb25pY19IZWxtZXJ0IiwKKyAgICAiQ1RfTGFtYmVydEF6aW1FcXVhbEFyZWEiLAorICAgICJDVF9BbGJlcnNFcXVhbEFyZWEiLAorICAgICJDVF9BemltdXRoYWxFcXVpZGlzdGFudCIsCisgICAgIkNUX0VxdWlkaXN0YW50Q29uaWMiLAorICAgICJDVF9TdGVyZW9ncmFwaGljIiwKKyAgICAiQ1RfUG9sYXJTdGVyZW9ncmFwaGljIiwKKyAgICAiQ1RfT2JsaXF1ZVN0ZXJlb2dyYXBoaWMiLAorICAgICJDVF9FcXVpcmVjdGFuZ3VsYXIiLAorICAgICJDVF9DYXNzaW5pU29sZG5lciIsCisgICAgIkNUX0dub21vbmljIiwKKyAgICAiQ1RfTWlsbGVyQ3lsaW5kcmljYWwiLAorICAgICJDVF9PcnRob2dyYXBoaWMiLAorICAgICJDVF9Qb2x5Y29uaWMiLAorICAgICJDVF9Sb2JpbnNvbiIsCisgICAgIkNUX1NpbnVzb2lkYWwiLAorICAgICJDVF9WYW5EZXJHcmludGVuIiwKKyAgICAiQ1RfTmV3WmVhbGFuZE1hcEdyaWQiLAorICAgICJDVF9UcmFuc3ZNZXJjYXRvcl9Tb3V0aE9yaWVudGVkIgorfTsKKworY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl92ZXJ0X2NzX2NvZGVzW10gPSB7CisgICAgIlZlcnRDU19BaXJ5XzE4MzBfZWxsaXBzb2lkIiwKKyAgICAiVmVydENTX0FpcnlfTW9kaWZpZWRfMTg0OV9lbGxpcHNvaWQiLAorICAgICJWZXJ0Q1NfQU5TX2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19CZXNzZWxfMTg0MV9lbGxpcHNvaWQiLAorICAgICJWZXJ0Q1NfQmVzc2VsX01vZGlmaWVkX2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19CZXNzZWxfTmFtaWJpYV9lbGxpcHNvaWQiLAorICAgICJWZXJ0Q1NfQ2xhcmtlXzE4NThfZWxsaXBzb2lkIiwKKyAgICAiVmVydENTX0NsYXJrZV8xODY2X2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19DbGFya2VfMTg4MF9CZW5vaXRfZWxsaXBzb2lkIiwKKyAgICAiVmVydENTX0NsYXJrZV8xODgwX0lHTl9lbGxpcHNvaWQiLAorICAgICJWZXJ0Q1NfQ2xhcmtlXzE4ODBfUkdTX2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19DbGFya2VfMTg4MF9BcmNfZWxsaXBzb2lkIiwKKyAgICAiVmVydENTX0NsYXJrZV8xODgwX1NHQV8xOTIyX2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19FdmVyZXN0XzE4MzBfMTkzN19BZGp1c3RtZW50X2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19FdmVyZXN0XzE4MzBfMTk2N19EZWZpbml0aW9uX2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19FdmVyZXN0XzE4MzBfMTk3NV9EZWZpbml0aW9uX2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19FdmVyZXN0XzE4MzBfTW9kaWZpZWRfZWxsaXBzb2lkIiwKKyAgICAiVmVydENTX0dSU18xOTgwX2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19IZWxtZXJ0XzE5MDZfZWxsaXBzb2lkIiwKKyAgICAiVmVydENTX0lOU19lbGxpcHNvaWQiLAorICAgICJWZXJ0Q1NfSW50ZXJuYXRpb25hbF8xOTI0X2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19JbnRlcm5hdGlvbmFsXzE5NjdfZWxsaXBzb2lkIiwKKyAgICAiVmVydENTX0tyYXNzb3dza3lfMTk0MF9lbGxpcHNvaWQiLAorICAgICJWZXJ0Q1NfTldMXzlEX2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19OV0xfMTBEX2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19QbGVzc2lzXzE4MTdfZWxsaXBzb2lkIiwKKyAgICAiVmVydENTX1N0cnV2ZV8xODYwX2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19XYXJfT2ZmaWNlX2VsbGlwc29pZCIsCisgICAgIlZlcnRDU19XR1NfODRfZWxsaXBzb2lkIiwKKyAgICAiVmVydENTX0dFTV8xMENfZWxsaXBzb2lkIiwKKyAgICAiVmVydENTX09TVTg2Rl9lbGxpcHNvaWQiLAorICAgICJWZXJ0Q1NfT1NVOTFBX2VsbGlwc29pZCIKK307CisKK2NvbnN0IGNoYXIgKmNvbnN0IGZmX3RpZmZfb3J0aG9fdmVydF9jc19jb2Rlc1tdID0geworICAgICJWZXJ0Q1NfTmV3bHluIiwKKyAgICAiVmVydENTX05vcnRoX0FtZXJpY2FuX1ZlcnRpY2FsX0RhdHVtXzE5MjkiLAorICAgICJWZXJ0Q1NfTm9ydGhfQW1lcmljYW5fVmVydGljYWxfRGF0dW1fMTk4OCIsCisgICAgIlZlcnRDU19ZZWxsb3dfU2VhXzE5NTYiLAorICAgICJWZXJ0Q1NfQmFsdGljX1NlYSIsCisgICAgIlZlcnRDU19DYXNwaWFuX1NlYSIKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90aWZmX2RhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3RpZmZfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTE1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy90aWZmX2RhdGEuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogVElGRiBkYXRhIHRhYmxlcworICogQ29weXJpZ2h0IChjKSAyMDExIFRob21hcyBLdWVobmVsCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVElGRiBkYXRhIHRhYmxlcworICogQGF1dGhvciBUaG9tYXMgS3VlaG5lbAorICogQHNlZSBHZW9USUZGIHNwZWNpZmljYXRpb24gYXQKKyAqIGh0dHA6Ly93d3cucmVtb3Rlc2Vuc2luZy5vcmcvZ2VvdGlmZi9zcGVjL2dlb3RpZmZob21lLmh0bWwKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVElGRl9EQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19USUZGX0RBVEFfSAorCisjaW5jbHVkZSAidGlmZi5oIgorCisjZGVmaW5lIFRJRkZfQ09ORl9LRVlfSURfT0ZGU0VUIDEwMjQKK2V4dGVybiBjb25zdCBUaWZmR2VvVGFnTmFtZVR5cGUgZmZfdGlmZl9jb25mX25hbWVfdHlwZV9tYXBbM107CisKKyNkZWZpbmUgVElGRl9HRU9HX0tFWV9JRF9PRkZTRVQgMjA0OAorZXh0ZXJuIGNvbnN0IFRpZmZHZW9UYWdOYW1lVHlwZSBmZl90aWZmX2dlb2dfbmFtZV90eXBlX21hcFsxNF07CisKKyNkZWZpbmUgVElGRl9QUk9KX0tFWV9JRF9PRkZTRVQgMzA3MgorZXh0ZXJuIGNvbnN0IFRpZmZHZW9UYWdOYW1lVHlwZSBmZl90aWZmX3Byb2pfbmFtZV90eXBlX21hcFsyNF07CisKKyNkZWZpbmUgVElGRl9WRVJUX0tFWV9JRF9PRkZTRVQgNDA5NgorZXh0ZXJuIGNvbnN0IFRpZmZHZW9UYWdOYW1lVHlwZSBmZl90aWZmX3ZlcnRfbmFtZV90eXBlX21hcFs0XTsKKworI2RlZmluZSBUSUZGX0dFT19LRVlfVU5ERUZJTkVEICAgIDAKKyNkZWZpbmUgVElGRl9HRU9fS0VZX1VTRVJfREVGSU5FRCAzMjc2NworCisjZGVmaW5lIFRJRkZfR1RfTU9ERUxfVFlQRV9PRkZTRVQgMQorZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IGZmX3RpZmZfZ3RfbW9kZWxfdHlwZV9jb2Rlc1szXTsKKworI2RlZmluZSBUSUZGX0dUX1JBU1RFUl9UWVBFX09GRlNFVCAxCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9ndF9yYXN0ZXJfdHlwZV9jb2Rlc1syXTsKKworI2RlZmluZSBUSUZGX0xJTkVBUl9VTklUX09GRlNFVCA5MDAxCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9saW5lYXJfdW5pdF9jb2Rlc1sxNV07CisKKyNkZWZpbmUgVElGRl9BTkdVTEFSX1VOSVRfT0ZGU0VUIDkxMDEKK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBmZl90aWZmX2FuZ3VsYXJfdW5pdF9jb2Rlc1s4XTsKKworI2RlZmluZSBUSUZGX0dDU19UWVBFX09GRlNFVCA0MjAxCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9nY3NfdHlwZV9jb2Rlc1sxMzNdOworCisjZGVmaW5lIFRJRkZfR0NTRV9UWVBFX09GRlNFVCA0MDAxCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9nY3NlX3R5cGVfY29kZXNbMzVdOworCisjZGVmaW5lIFRJRkZfR0VPREVUSUNfREFUVU1fT0ZGU0VUIDYyMDEKK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBmZl90aWZmX2dlb2RldGljX2RhdHVtX2NvZGVzWzEyMF07CisKKyNkZWZpbmUgVElGRl9HRU9ERVRJQ19EQVRVTV9FX09GRlNFVCA2MDAxCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9nZW9kZXRpY19kYXR1bV9lX2NvZGVzWzM1XTsKKworI2RlZmluZSBUSUZGX0VMTElQU09JRF9PRkZTRVQgNzAwMQorZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IGZmX3RpZmZfZWxsaXBzb2lkX2NvZGVzWzM1XTsKKworI2RlZmluZSBUSUZGX1BSSU1FX01FUklESUFOX09GRlNFVCA4OTAxCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9wcmltZV9tZXJpZGlhbl9jb2Rlc1sxMV07CisKK2V4dGVybiBjb25zdCBUaWZmR2VvVGFnS2V5TmFtZSBmZl90aWZmX3Byb2pfY3NfdHlwZV9jb2Rlc1s5NzhdOworCitleHRlcm4gY29uc3QgVGlmZkdlb1RhZ0tleU5hbWUgZmZfdGlmZl9wcm9qZWN0aW9uX2NvZGVzWzI5OF07CisKKyNkZWZpbmUgVElGRl9DT09SRF9UUkFOU19PRkZTRVQgMQorZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IGZmX3RpZmZfY29vcmRfdHJhbnNfY29kZXNbMjddOworCisjZGVmaW5lIFRJRkZfVkVSVF9DU19PRkZTRVQgNTAwMQorZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IGZmX3RpZmZfdmVydF9jc19jb2Rlc1szMl07CisKKyNkZWZpbmUgVElGRl9PUlRIT19WRVJUX0NTX09GRlNFVCA1MTAxCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgZmZfdGlmZl9vcnRob192ZXJ0X2NzX2NvZGVzWzZdOworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90aWZmZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy90aWZmZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIyMTlkYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RpZmZlbmMuYwpAQCAtMCwwICsxLDU2NiBAQAorLyoKKyAqIFRJRkYgaW1hZ2UgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IEJhcnRsb21pZWogV29sb3dpZWMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVElGRiBpbWFnZSBlbmNvZGVyCisgKiBAYXV0aG9yIEJhcnRsb21pZWogV29sb3dpZWMKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgQ09ORklHX1pMSUIKKyNpbmNsdWRlIDx6bGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibHp3LmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJybGUuaCIKKyNpbmNsdWRlICJ0aWZmLmgiCisKKyNkZWZpbmUgVElGRl9NQVhfRU5UUlkgMzIKKworLyoqIHNpemVzIG9mIHZhcmlvdXMgVElGRiBmaWVsZCB0eXBlcyAoc3RyaW5nIHNpemUgPSAxKSovCitzdGF0aWMgY29uc3QgdWludDhfdCB0eXBlX3NpemVzMlsxNF0gPSB7CisgICAgMCwgMSwgMSwgMiwgNCwgOCwgMSwgMSwgMiwgNCwgOCwgNCwgOCwgNAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgVGlmZkVuY29kZXJDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmb3IgcHJpdmF0ZSBvcHRpb25zCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworCisgICAgaW50IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcGljdHVyZSB3aWR0aAorICAgIGludCBoZWlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHBpY3R1cmUgaGVpZ2h0CisgICAgdW5zaWduZWQgaW50IGJwcDsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYml0cyBwZXIgcGl4ZWwKKyAgICBpbnQgY29tcHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjb21wcmVzc2lvbiBsZXZlbAorICAgIGludCBicHBfdGFiX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IGJwcF90YWIgc2l6ZQorICAgIGVudW0gVGlmZlBob3RvbWV0cmljIHBob3RvbWV0cmljX2ludGVycHJldGF0aW9uOyAgLy8vPCBwaG90b21ldHJpYyBpbnRlcnByZXRhdGlvbgorICAgIGludCBzdHJpcHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBzdHJpcHMKKyAgICB1aW50MzJfdCAqc3RyaXBfc2l6ZXM7CisgICAgdW5zaWduZWQgaW50IHN0cmlwX3NpemVzX3NpemU7CisgICAgdWludDMyX3QgKnN0cmlwX29mZnNldHM7CisgICAgdW5zaWduZWQgaW50IHN0cmlwX29mZnNldHNfc2l6ZTsKKyAgICB1aW50OF90ICp5dXZfbGluZTsKKyAgICB1bnNpZ25lZCBpbnQgeXV2X2xpbmVfc2l6ZTsKKyAgICBpbnQgcnBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCByb3cgcGVyIHN0cmlwCisgICAgdWludDhfdCBlbnRyaWVzW1RJRkZfTUFYX0VOVFJZICogMTJdOyAgIC8vLzwgZW50cmllcyBpbiBoZWFkZXIKKyAgICBpbnQgbnVtX2VudHJpZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgZW50cmllcworICAgIHVpbnQ4X3QgKipidWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGFjdHVhbCBwb3NpdGlvbiBpbiBidWZmZXIKKyAgICB1aW50OF90ICpidWZfc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBwb2ludGVyIHRvIGZpcnN0IGJ5dGUgaW4gYnVmZmVyCisgICAgaW50IGJ1Zl9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYnVmZmVyIHNpemUKKyAgICB1aW50MTZfdCBzdWJzYW1wbGluZ1syXTsgICAgICAgICAgICAgICAgLy8vPCBZVVYgc3Vic2FtcGxpbmcgZmFjdG9ycworICAgIHN0cnVjdCBMWldFbmNvZGVTdGF0ZSAqbHp3czsgICAgICAgICAgICAvLy88IExaVyBlbmNvZGUgc3RhdGUKKyAgICB1aW50MzJfdCBkcGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbWFnZSByZXNvbHV0aW9uIGluIERQSQorfSBUaWZmRW5jb2RlckNvbnRleHQ7CisKKy8qKgorICogQ2hlY2sgZnJlZSBzcGFjZSBpbiBidWZmZXIuCisgKgorICogQHBhcmFtIHMgVGlmZiBjb250ZXh0CisgKiBAcGFyYW0gbmVlZCBOZWVkZWQgYnl0ZXMKKyAqIEByZXR1cm4gMCAtIG9rLCAxIC0gbm8gZnJlZSBzcGFjZQorICovCitzdGF0aWMgaW5saW5lIGludCBjaGVja19zaXplKFRpZmZFbmNvZGVyQ29udGV4dCAqcywgdWludDY0X3QgbmVlZCkKK3sKKyAgICBpZiAocy0+YnVmX3NpemUgPCAqcy0+YnVmIC0gcy0+YnVmX3N0YXJ0ICsgbmVlZCkgeworICAgICAgICAqcy0+YnVmID0gcy0+YnVmX3N0YXJ0ICsgcy0+YnVmX3NpemUgKyAxOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkJ1ZmZlciBpcyB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUHV0IG4gdmFsdWVzIHRvIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcCBwb2ludGVyIHRvIHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtIG4gbnVtYmVyIG9mIHZhbHVlcworICogQHBhcmFtIHZhbCBwb2ludGVyIHRvIHZhbHVlcworICogQHBhcmFtIHR5cGUgdHlwZSBvZiB2YWx1ZXMKKyAqIEBwYXJhbSBmbGlwID0gMCAtIG5vcm1hbCBjb3B5LCA+MCAtIGZsaXAKKyAqLworc3RhdGljIHZvaWQgdG5wdXQodWludDhfdCAqKnAsIGludCBuLCBjb25zdCB1aW50OF90ICp2YWwsIGVudW0gVGlmZlR5cGVzIHR5cGUsCisgICAgICAgICAgICAgICAgICBpbnQgZmxpcCkKK3sKKyAgICBpbnQgaTsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIGZsaXAgXj0gKChpbnRbXSkgeyAwLCAwLCAwLCAxLCAzLCAzIH0pW3R5cGVdOworI2VuZGlmCisgICAgZm9yIChpID0gMDsgaSA8IG4gKiB0eXBlX3NpemVzMlt0eXBlXTsgaSsrKQorICAgICAgICAqKCpwKSsrID0gdmFsW2kgXiBmbGlwXTsKK30KKworLyoqCisgKiBBZGQgZW50cnkgdG8gZGlyZWN0b3J5IGluIHRpZmYgaGVhZGVyLgorICoKKyAqIEBwYXJhbSBzIFRpZmYgY29udGV4dAorICogQHBhcmFtIHRhZyB0YWcgdGhhdCBpZGVudGlmaWVzIHRoZSBlbnRyeQorICogQHBhcmFtIHR5cGUgZW50cnkgdHlwZQorICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgdmFsdWVzCisgKiBAcGFyYW0gcHRyX3ZhbCBwb2ludGVyIHRvIHZhbHVlcworICovCitzdGF0aWMgdm9pZCBhZGRfZW50cnkoVGlmZkVuY29kZXJDb250ZXh0ICpzLCBlbnVtIFRpZmZUYWdzIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICBlbnVtIFRpZmZUeXBlcyB0eXBlLCBpbnQgY291bnQsIGNvbnN0IHZvaWQgKnB0cl92YWwpCit7CisgICAgdWludDhfdCAqZW50cmllc19wdHIgPSBzLT5lbnRyaWVzICsgMTIgKiBzLT5udW1fZW50cmllczsKKworICAgIGF2X2Fzc2VydDAocy0+bnVtX2VudHJpZXMgPCBUSUZGX01BWF9FTlRSWSk7CisKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZlbnRyaWVzX3B0ciwgdGFnKTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZlbnRyaWVzX3B0ciwgdHlwZSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmZW50cmllc19wdHIsIGNvdW50KTsKKworICAgIGlmICh0eXBlX3NpemVzW3R5cGVdICogKGludDY0X3QpY291bnQgPD0gNCkgeworICAgICAgICB0bnB1dCgmZW50cmllc19wdHIsIGNvdW50LCBwdHJfdmFsLCB0eXBlLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZlbnRyaWVzX3B0ciwgKnMtPmJ1ZiAtIHMtPmJ1Zl9zdGFydCk7CisgICAgICAgIGNoZWNrX3NpemUocywgY291bnQgKiAoaW50NjRfdCl0eXBlX3NpemVzMlt0eXBlXSk7CisgICAgICAgIHRucHV0KHMtPmJ1ZiwgY291bnQsIHB0cl92YWwsIHR5cGUsIDApOworICAgIH0KKworICAgIHMtPm51bV9lbnRyaWVzKys7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9lbnRyeTEoVGlmZkVuY29kZXJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFRpZmZUYWdzIHRhZywgZW51bSBUaWZmVHlwZXMgdHlwZSwgaW50IHZhbCkKK3sKKyAgICB1aW50MTZfdCB3ICA9IHZhbDsKKyAgICB1aW50MzJfdCBkdyA9IHZhbDsKKyAgICBhZGRfZW50cnkocywgdGFnLCB0eXBlLCAxLCB0eXBlID09IFRJRkZfU0hPUlQgPyAodm9pZCAqKSZ3IDogKHZvaWQgKikmZHcpOworfQorCisvKioKKyAqIEVuY29kZSBvbmUgc3RyaXAgaW4gdGlmZiBmaWxlLgorICoKKyAqIEBwYXJhbSBzIFRpZmYgY29udGV4dAorICogQHBhcmFtIHNyYyBpbnB1dCBidWZmZXIKKyAqIEBwYXJhbSBkc3Qgb3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtIG4gc2l6ZSBvZiBpbnB1dCBidWZmZXIKKyAqIEBwYXJhbSBjb21wciBjb21wcmVzc2lvbiBtZXRob2QKKyAqIEByZXR1cm4gbnVtYmVyIG9mIG91dHB1dCBieXRlcy4gSWYgYW4gb3V0cHV0IGVycm9yIGlzIGVuY291bnRlcmVkLCAtMSBpcyByZXR1cm5lZAorICovCitzdGF0aWMgaW50IGVuY29kZV9zdHJpcChUaWZmRW5jb2RlckNvbnRleHQgKnMsIGNvbnN0IGludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgbiwgaW50IGNvbXByKQoreworICAgIHN3aXRjaCAoY29tcHIpIHsKKyNpZiBDT05GSUdfWkxJQgorICAgIGNhc2UgVElGRl9ERUZMQVRFOgorICAgIGNhc2UgVElGRl9BRE9CRV9ERUZMQVRFOgorICAgIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB6bGVuID0gcy0+YnVmX3NpemUgLSAoKnMtPmJ1ZiAtIHMtPmJ1Zl9zdGFydCk7CisgICAgICAgIGlmIChjb21wcmVzcyhkc3QsICZ6bGVuLCBzcmMsIG4pICE9IFpfT0spIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29tcHJlc3NpbmcgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gemxlbjsKKyAgICB9CisjZW5kaWYKKyAgICBjYXNlIFRJRkZfUkFXOgorICAgICAgICBpZiAoY2hlY2tfc2l6ZShzLCBuKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBuKTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgY2FzZSBUSUZGX1BBQ0tCSVRTOgorICAgICAgICByZXR1cm4gZmZfcmxlX2VuY29kZShkc3QsIHMtPmJ1Zl9zaXplIC0gKCpzLT5idWYgLSBzLT5idWZfc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIDEsIG4sIDIsIDB4ZmYsIC0xLCAwKTsKKyAgICBjYXNlIFRJRkZfTFpXOgorICAgICAgICByZXR1cm4gZmZfbHp3X2VuY29kZShzLT5sendzLCBzcmMsIG4pOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBhY2tfeXV2KFRpZmZFbmNvZGVyQ29udGV4dCAqcywgY29uc3QgQVZGcmFtZSAqcCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IGxudW0pCit7CisgICAgaW50IGksIGosIGs7CisgICAgaW50IHcgICAgICAgPSAocy0+d2lkdGggLSAxKSAvIHMtPnN1YnNhbXBsaW5nWzBdICsgMTsKKyAgICB1aW50OF90ICpwdSA9ICZwLT5kYXRhWzFdW2xudW0gLyBzLT5zdWJzYW1wbGluZ1sxXSAqIHAtPmxpbmVzaXplWzFdXTsKKyAgICB1aW50OF90ICpwdiA9ICZwLT5kYXRhWzJdW2xudW0gLyBzLT5zdWJzYW1wbGluZ1sxXSAqIHAtPmxpbmVzaXplWzJdXTsKKyAgICBpZiAocy0+d2lkdGggJSBzLT5zdWJzYW1wbGluZ1swXSB8fCBzLT5oZWlnaHQgJSBzLT5zdWJzYW1wbGluZ1sxXSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+c3Vic2FtcGxpbmdbMV07IGorKykKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+c3Vic2FtcGxpbmdbMF07IGsrKykKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gcC0+ZGF0YVswXVtGRk1JTihsbnVtICsgaiwgcy0+aGVpZ2h0LTEpICogcC0+bGluZXNpemVbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGkgKiBzLT5zdWJzYW1wbGluZ1swXSArIGssIHMtPndpZHRoLTEpXTsKKyAgICAgICAgICAgICpkc3QrKyA9ICpwdSsrOworICAgICAgICAgICAgKmRzdCsrID0gKnB2Kys7CisgICAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnN1YnNhbXBsaW5nWzFdOyBqKyspCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHMtPnN1YnNhbXBsaW5nWzBdOyBrKyspCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IHAtPmRhdGFbMF1bKGxudW0gKyBqKSAqIHAtPmxpbmVzaXplWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICogcy0+c3Vic2FtcGxpbmdbMF0gKyBrXTsKKyAgICAgICAgICAgICpkc3QrKyA9ICpwdSsrOworICAgICAgICAgICAgKmRzdCsrID0gKnB2Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpY3QsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKKyAgICBUaWZmRW5jb2RlckNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEFWRnJhbWUgKmNvbnN0IHAgPSBwaWN0OworICAgIGludCBpOworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICB1aW50OF90ICpvZmZzZXQ7CisgICAgdWludDMyX3Qgc3RyaXBzOworICAgIGludCBieXRlc19wZXJfcm93OworICAgIHVpbnQzMl90IHJlc1syXSA9IHsgcy0+ZHBpLCAxIH07ICAgIC8vIGltYWdlIHJlc29sdXRpb24gKDcyLzEpCisgICAgdWludDE2X3QgYnBwX3RhYls0XTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgaXNfeXV2ID0gMCwgYWxwaGEgPSAwOworICAgIGludCBzaGlmdF9oLCBzaGlmdF92OworICAgIGludCBwYWNrZXRfc2l6ZTsKKworICAgIHMtPndpZHRoICAgICAgICAgID0gYXZjdHgtPndpZHRoOworICAgIHMtPmhlaWdodCAgICAgICAgID0gYXZjdHgtPmhlaWdodDsKKyAgICBzLT5zdWJzYW1wbGluZ1swXSA9IDE7CisgICAgcy0+c3Vic2FtcGxpbmdbMV0gPSAxOworCisgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9CisgICAgcy0+YnBwICAgICAgICAgID0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGRlc2MpOworICAgIHMtPmJwcF90YWJfc2l6ZSA9IGRlc2MtPm5iX2NvbXBvbmVudHM7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5waXhfZm10KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBOgorICAgICAgICBhbHBoYSA9IDE7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgorICAgICAgICBzLT5waG90b21ldHJpY19pbnRlcnByZXRhdGlvbiA9IFRJRkZfUEhPVE9NRVRSSUNfUkdCOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6CisgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAweDI4OworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZOEE6CisgICAgICAgIGFscGhhID0gYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HUkFZOEE7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxNkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9NT05PQkxBQ0s6CisgICAgICAgIHMtPnBob3RvbWV0cmljX2ludGVycHJldGF0aW9uID0gVElGRl9QSE9UT01FVFJJQ19CTEFDS19JU19aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUEFMODoKKyAgICAgICAgcy0+cGhvdG9tZXRyaWNfaW50ZXJwcmV0YXRpb24gPSBUSUZGX1BIT1RPTUVUUklDX1BBTEVUVEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9NT05PV0hJVEU6CisgICAgICAgIHMtPnBob3RvbWV0cmljX2ludGVycHJldGF0aW9uID0gVElGRl9QSE9UT01FVFJJQ19XSElURV9JU19aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDEwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDExUDoKKyAgICAgICAgYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUoYXZjdHgtPnBpeF9mbXQsICZzaGlmdF9oLCAmc2hpZnRfdik7CisgICAgICAgIHMtPnBob3RvbWV0cmljX2ludGVycHJldGF0aW9uID0gVElGRl9QSE9UT01FVFJJQ19ZQ0JDUjsKKyAgICAgICAgcy0+c3Vic2FtcGxpbmdbMF0gICAgICAgICAgICAgPSAxIDw8IHNoaWZ0X2g7CisgICAgICAgIHMtPnN1YnNhbXBsaW5nWzFdICAgICAgICAgICAgID0gMSA8PCBzaGlmdF92OworICAgICAgICBpc195dXYgICAgICAgICAgICAgICAgICAgICAgICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoaXMgY29sb3JzIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5icHBfdGFiX3NpemU7IGkrKykKKyAgICAgICAgYnBwX3RhYltpXSA9IGRlc2MtPmNvbXBbaV0uZGVwdGhfbWludXMxICsgMTsKKworICAgIGlmIChzLT5jb21wciA9PSBUSUZGX0RFRkxBVEUgICAgICAgfHwKKyAgICAgICAgcy0+Y29tcHIgPT0gVElGRl9BRE9CRV9ERUZMQVRFIHx8CisgICAgICAgIHMtPmNvbXByID09IFRJRkZfTFpXKQorICAgICAgICAvLyBiZXN0IGNob2ljZSBmb3IgREVGTEFURQorICAgICAgICBzLT5ycHMgPSBzLT5oZWlnaHQ7CisgICAgZWxzZQorICAgICAgICAvLyBzdWdnZXN0IHNpemUgb2Ygc3RyaXAKKyAgICAgICAgcy0+cnBzID0gRkZNQVgoODE5MiAvICgoKHMtPndpZHRoICogcy0+YnBwKSA+PiAzKSArIDEpLCAxKTsKKyAgICAvLyByb3VuZCBycHMgdXAKKyAgICBzLT5ycHMgPSAoKHMtPnJwcyAtIDEpIC8gcy0+c3Vic2FtcGxpbmdbMV0gKyAxKSAqIHMtPnN1YnNhbXBsaW5nWzFdOworCisgICAgc3RyaXBzID0gKHMtPmhlaWdodCAtIDEpIC8gcy0+cnBzICsgMTsKKworICAgIGJ5dGVzX3Blcl9yb3cgPSAoKChzLT53aWR0aCAtIDEpIC8gcy0+c3Vic2FtcGxpbmdbMF0gKyAxKSAqIHMtPmJwcCAqCisgICAgICAgICAgICAgICAgICAgICBzLT5zdWJzYW1wbGluZ1swXSAqIHMtPnN1YnNhbXBsaW5nWzFdICsgNykgPj4gMzsKKyAgICBwYWNrZXRfc2l6ZSA9IGF2Y3R4LT5oZWlnaHQgKiBieXRlc19wZXJfcm93ICogMiArCisgICAgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0ICogNCArIEZGX01JTl9CVUZGRVJfU0laRTsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBwYWNrZXRfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwdHIgICAgICAgICAgPSBwa3QtPmRhdGE7CisgICAgcy0+YnVmX3N0YXJ0ID0gcGt0LT5kYXRhOworICAgIHMtPmJ1ZiAgICAgICA9ICZwdHI7CisgICAgcy0+YnVmX3NpemUgID0gcGt0LT5zaXplOworCisgICAgaWYgKGNoZWNrX3NpemUocywgOCkpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIC8vIHdyaXRlIGhlYWRlcgorICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJnB0ciwgMHg0OTQ5KTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZwdHIsIDQyKTsKKworICAgIG9mZnNldCA9IHB0cjsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZwdHIsIDApOworCisgICAgaWYgKHN0cmlwcyA+IElOVF9NQVggLyBGRk1BWChzaXplb2Yocy0+c3RyaXBfc2l6ZXNbMF0pLCBzaXplb2Yocy0+c3RyaXBfb2Zmc2V0c1swXSkpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2N6KCZzLT5zdHJpcF9zaXplcyAgLCAmcy0+c3RyaXBfc2l6ZXNfc2l6ZSAgLCBzaXplb2Yocy0+c3RyaXBfc2l6ZXMgIFswXSkgKiBzdHJpcHMpOworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvY3ooJnMtPnN0cmlwX29mZnNldHMsICZzLT5zdHJpcF9vZmZzZXRzX3NpemUsIHNpemVvZihzLT5zdHJpcF9vZmZzZXRzWzBdKSAqIHN0cmlwcyk7CisKKyAgICBpZiAoIXMtPnN0cmlwX3NpemVzIHx8ICFzLT5zdHJpcF9vZmZzZXRzKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChpc195dXYpIHsKKyAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZzLT55dXZfbGluZSwgJnMtPnl1dl9saW5lX3NpemUsIGJ5dGVzX3Blcl9yb3cpOworICAgICAgICBpZiAocy0+eXV2X2xpbmUgPT0gTlVMTCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeVxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiBDT05GSUdfWkxJQgorICAgIGlmIChzLT5jb21wciA9PSBUSUZGX0RFRkxBVEUgfHwgcy0+Y29tcHIgPT0gVElGRl9BRE9CRV9ERUZMQVRFKSB7CisgICAgICAgIHVpbnQ4X3QgKnpidWY7CisgICAgICAgIGludCB6bGVuLCB6bjsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgemxlbiA9IGJ5dGVzX3Blcl9yb3cgKiBzLT5ycHM7CisgICAgICAgIHpidWYgPSBhdl9tYWxsb2Moemxlbik7CisgICAgICAgIGlmICghemJ1ZikgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHMtPnN0cmlwX29mZnNldHNbMF0gPSBwdHIgLSBwa3QtPmRhdGE7CisgICAgICAgIHpuICAgICAgICAgICAgICAgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+cnBzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChpc195dXYpIHsKKyAgICAgICAgICAgICAgICBwYWNrX3l1dihzLCBwLCBzLT55dXZfbGluZSwgaik7CisgICAgICAgICAgICAgICAgbWVtY3B5KHpidWYgKyB6biwgcy0+eXV2X2xpbmUsIGJ5dGVzX3Blcl9yb3cpOworICAgICAgICAgICAgICAgIGogKz0gcy0+c3Vic2FtcGxpbmdbMV0gLSAxOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbWVtY3B5KHpidWYgKyBqICogYnl0ZXNfcGVyX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVswXSArIGogKiBwLT5saW5lc2l6ZVswXSwgYnl0ZXNfcGVyX3Jvdyk7CisgICAgICAgICAgICB6biArPSBieXRlc19wZXJfcm93OworICAgICAgICB9CisgICAgICAgIHJldCA9IGVuY29kZV9zdHJpcChzLCB6YnVmLCBwdHIsIHpuLCBzLT5jb21wcik7CisgICAgICAgIGF2X2ZyZWUoemJ1Zik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVuY29kZSBzdHJpcCBmYWlsZWRcbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHB0ciAgICAgICAgICAgKz0gcmV0OworICAgICAgICBzLT5zdHJpcF9zaXplc1swXSA9IHB0ciAtIHBrdC0+ZGF0YSAtIHMtPnN0cmlwX29mZnNldHNbMF07CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgaWYgKHMtPmNvbXByID09IFRJRkZfTFpXKSB7CisgICAgICAgIHMtPmx6d3MgPSBhdl9tYWxsb2MoZmZfbHp3X2VuY29kZV9zdGF0ZV9zaXplKTsKKyAgICAgICAgaWYgKCFzLT5sendzKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHMtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIGlmIChzLT5zdHJpcF9zaXplc1tpIC8gcy0+cnBzXSA9PSAwKSB7CisgICAgICAgICAgICBpZiAocy0+Y29tcHIgPT0gVElGRl9MWlcpIHsKKyAgICAgICAgICAgICAgICBmZl9sendfZW5jb2RlX2luaXQocy0+bHp3cywgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5idWZfc2l6ZSAtICgqcy0+YnVmIC0gcy0+YnVmX3N0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIEZGX0xaV19USUZGLCBwdXRfYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5zdHJpcF9vZmZzZXRzW2kgLyBzLT5ycHNdID0gcHRyIC0gcGt0LT5kYXRhOworICAgICAgICB9CisgICAgICAgIGlmIChpc195dXYpIHsKKyAgICAgICAgICAgIHBhY2tfeXV2KHMsIHAsIHMtPnl1dl9saW5lLCBpKTsKKyAgICAgICAgICAgIHJldCA9IGVuY29kZV9zdHJpcChzLCBzLT55dXZfbGluZSwgcHRyLCBieXRlc19wZXJfcm93LCBzLT5jb21wcik7CisgICAgICAgICAgICBpICArPSBzLT5zdWJzYW1wbGluZ1sxXSAtIDE7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0ID0gZW5jb2RlX3N0cmlwKHMsIHAtPmRhdGFbMF0gKyBpICogcC0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLCBieXRlc19wZXJfcm93LCBzLT5jb21wcik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVuY29kZSBzdHJpcCBmYWlsZWRcbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHMtPnN0cmlwX3NpemVzW2kgLyBzLT5ycHNdICs9IHJldDsKKyAgICAgICAgcHRyICAgICAgICAgICAgICAgICAgICAgKz0gcmV0OworICAgICAgICBpZiAocy0+Y29tcHIgPT0gVElGRl9MWlcgJiYKKyAgICAgICAgICAgIChpID09IHMtPmhlaWdodCAtIDEgfHwgaSAlIHMtPnJwcyA9PSBzLT5ycHMgLSAxKSkgeworICAgICAgICAgICAgcmV0ID0gZmZfbHp3X2VuY29kZV9mbHVzaChzLT5sendzLCBmbHVzaF9wdXRfYml0cyk7CisgICAgICAgICAgICBzLT5zdHJpcF9zaXplc1soaSAvIHMtPnJwcyldICs9IHJldDsKKyAgICAgICAgICAgIHB0ciAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gcmV0OworICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5jb21wciA9PSBUSUZGX0xaVykKKyAgICAgICAgYXZfZnJlZXAoJnMtPmx6d3MpOworICAgIH0KKworICAgIHMtPm51bV9lbnRyaWVzID0gMDsKKworICAgIGFkZF9lbnRyeTEocywgVElGRl9TVUJGSUxFLCBUSUZGX0xPTkcsIDApOworICAgIGFkZF9lbnRyeTEocywgVElGRl9XSURUSCwgICBUSUZGX0xPTkcsIHMtPndpZHRoKTsKKyAgICBhZGRfZW50cnkxKHMsIFRJRkZfSEVJR0hULCAgVElGRl9MT05HLCBzLT5oZWlnaHQpOworCisgICAgaWYgKHMtPmJwcF90YWJfc2l6ZSkKKyAgICAgICAgYWRkX2VudHJ5KHMsIFRJRkZfQlBQLCBUSUZGX1NIT1JULCBzLT5icHBfdGFiX3NpemUsIGJwcF90YWIpOworCisgICAgYWRkX2VudHJ5MShzLCBUSUZGX0NPTVBSLCAgICAgICBUSUZGX1NIT1JULCBzLT5jb21wcik7CisgICAgYWRkX2VudHJ5MShzLCBUSUZGX1BIT1RPTUVUUklDLCBUSUZGX1NIT1JULCBzLT5waG90b21ldHJpY19pbnRlcnByZXRhdGlvbik7CisgICAgYWRkX2VudHJ5KHMsICBUSUZGX1NUUklQX09GRlMsICBUSUZGX0xPTkcsICBzdHJpcHMsIHMtPnN0cmlwX29mZnNldHMpOworCisgICAgaWYgKHMtPmJwcF90YWJfc2l6ZSkKKyAgICAgICAgYWRkX2VudHJ5MShzLCBUSUZGX1NBTVBMRVNfUEVSX1BJWEVMLCBUSUZGX1NIT1JULCBzLT5icHBfdGFiX3NpemUpOworCisgICAgYWRkX2VudHJ5MShzLCBUSUZGX1JPV1NQRVJTVFJJUCwgVElGRl9MT05HLCAgICAgcy0+cnBzKTsKKyAgICBhZGRfZW50cnkocywgIFRJRkZfU1RSSVBfU0laRSwgICBUSUZGX0xPTkcsICAgICBzdHJpcHMsIHMtPnN0cmlwX3NpemVzKTsKKyAgICBhZGRfZW50cnkocywgIFRJRkZfWFJFUywgICAgICAgICBUSUZGX1JBVElPTkFMLCAxLCAgICAgIHJlcyk7CisgICAgaWYgKGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA+IDAgJiYKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID4gMCkgeworICAgICAgICBBVlJhdGlvbmFsIHkgPSBhdl9tdWxfcShhdl9tYWtlX3Eocy0+ZHBpLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworICAgICAgICByZXNbMF0gPSB5Lm51bTsKKyAgICAgICAgcmVzWzFdID0geS5kZW47CisgICAgfQorICAgIGFkZF9lbnRyeShzLCAgVElGRl9ZUkVTLCAgICAgICAgIFRJRkZfUkFUSU9OQUwsIDEsICAgICAgcmVzKTsKKyAgICBhZGRfZW50cnkxKHMsIFRJRkZfUkVTX1VOSVQsICAgICBUSUZGX1NIT1JULCAgICAyKTsKKworICAgIGlmICghKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKQorICAgICAgICBhZGRfZW50cnkocywgVElGRl9TT0ZUV0FSRV9OQU1FLCBUSUZGX1NUUklORywKKyAgICAgICAgICAgICAgICAgIHN0cmxlbihMSUJBVkNPREVDX0lERU5UKSArIDEsIExJQkFWQ09ERUNfSURFTlQpOworCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCkgeworICAgICAgICB1aW50MTZfdCBwYWxbMjU2ICogM107CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgICAgdWludDMyX3QgcmdiID0gKih1aW50MzJfdCAqKSAocC0+ZGF0YVsxXSArIGkgKiA0KTsKKyAgICAgICAgICAgIHBhbFtpXSAgICAgICA9ICgocmdiID4+IDE2KSAmIDB4ZmYpICogMjU3OworICAgICAgICAgICAgcGFsW2kgKyAyNTZdID0gKChyZ2IgPj4gIDgpICYgMHhmZikgKiAyNTc7CisgICAgICAgICAgICBwYWxbaSArIDUxMl0gPSAgKHJnYiAgICAgICAgJiAweGZmKSAqIDI1NzsKKyAgICAgICAgfQorICAgICAgICBhZGRfZW50cnkocywgVElGRl9QQUwsIFRJRkZfU0hPUlQsIDI1NiAqIDMsIHBhbCk7CisgICAgfQorICAgIGlmIChhbHBoYSkKKyAgICAgICAgYWRkX2VudHJ5MShzLFRJRkZfRVhUUkFTQU1QTEVTLCAgICAgIFRJRkZfU0hPUlQsICAgICAgICAgICAgMik7CisgICAgaWYgKGlzX3l1dikgeworICAgICAgICAvKiogYWNjb3JkaW5nIHRvIENDSVIgUmVjb21tZW5kYXRpb24gNjAxLjEgKi8KKyAgICAgICAgdWludDMyX3QgcmVmYndbMTJdID0geyAxNSwgMSwgMjM1LCAxLCAxMjgsIDEsIDI0MCwgMSwgMTI4LCAxLCAyNDAsIDEgfTsKKyAgICAgICAgYWRkX2VudHJ5KHMsIFRJRkZfWUNCQ1JfU1VCU0FNUExJTkcsIFRJRkZfU0hPUlQsICAgIDIsIHMtPnN1YnNhbXBsaW5nKTsKKyAgICAgICAgaWYgKGF2Y3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uID09IEFWQ0hST01BX0xPQ19UT1BMRUZUKQorICAgICAgICAgICAgYWRkX2VudHJ5MShzLCBUSUZGX1lDQkNSX1BPU0lUSU9OSU5HLCBUSUZGX1NIT1JULCAyKTsKKyAgICAgICAgYWRkX2VudHJ5KHMsIFRJRkZfUkVGRVJFTkNFX0JXLCAgICAgIFRJRkZfUkFUSU9OQUwsIDYsIHJlZmJ3KTsKKyAgICB9CisgICAgLy8gd3JpdGUgb2Zmc2V0IHRvIGRpcgorICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJm9mZnNldCwgcHRyIC0gcGt0LT5kYXRhKTsKKworICAgIGlmIChjaGVja19zaXplKHMsIDYgKyBzLT5udW1fZW50cmllcyAqIDEyKSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmcHRyLCBzLT5udW1fZW50cmllcyk7ICAvLyB3cml0ZSB0YWcgY291bnQKKyAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnB0ciwgcy0+ZW50cmllcywgcy0+bnVtX2VudHJpZXMgKiAxMik7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmcHRyLCAwKTsKKworICAgIHBrdC0+c2l6ZSAgID0gcHRyIC0gcGt0LT5kYXRhOworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKworZmFpbDoKKyAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVGlmZkVuY29kZXJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRpZmZFbmNvZGVyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworICAgIGF2X2ZyZWVwKCZzLT5zdHJpcF9zaXplcyk7CisgICAgYXZfZnJlZXAoJnMtPnN0cmlwX29mZnNldHMpOworICAgIGF2X2ZyZWVwKCZzLT55dXZfbGluZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVGlmZkVuY29kZXJDb250ZXh0LCB4KQorI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsiZHBpIiwgInNldCB0aGUgaW1hZ2UgcmVzb2x1dGlvbiAoaW4gZHBpKSIsIE9GRlNFVChkcGkpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gNzJ9LCAxLCAweDEwMDAwLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTX0sCisgICAgeyAiY29tcHJlc3Npb25fYWxnbyIsIE5VTEwsIE9GRlNFVChjb21wciksIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSBUSUZGX1BBQ0tCSVRTIH0sIFRJRkZfUkFXLCBUSUZGX0RFRkxBVEUsIFZFLCAiY29tcHJlc3Npb25fYWxnbyIgfSwKKyAgICB7ICJwYWNrYml0cyIsICAgICAgICAgTlVMTCwgMCwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFRJRkZfUEFDS0JJVFMgfSwgMCwgICAgICAgIDAsICAgICAgICAgICAgVkUsICJjb21wcmVzc2lvbl9hbGdvIiB9LAorICAgIHsgInJhdyIsICAgICAgICAgICAgICBOVUxMLCAwLCAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gVElGRl9SQVcgICAgICB9LCAwLCAgICAgICAgMCwgICAgICAgICAgICBWRSwgImNvbXByZXNzaW9uX2FsZ28iIH0sCisgICAgeyAibHp3IiwgICAgICAgICAgICAgIE5VTEwsIDAsICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBUSUZGX0xaVyAgICAgIH0sIDAsICAgICAgICAwLCAgICAgICAgICAgIFZFLCAiY29tcHJlc3Npb25fYWxnbyIgfSwKKyNpZiBDT05GSUdfWkxJQgorICAgIHsgImRlZmxhdGUiLCAgICAgICAgICBOVUxMLCAwLCAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gVElGRl9ERUZMQVRFICB9LCAwLCAgICAgICAgMCwgICAgICAgICAgICBWRSwgImNvbXByZXNzaW9uX2FsZ28iIH0sCisjZW5kaWYKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHRpZmZlbmNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiVElGRiBlbmNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfdGlmZl9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ0aWZmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVElGRiBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9USUZGLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUaWZmRW5jb2RlckNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGVuY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGVuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IENPREVDX0NBUF9JTlRSQV9PTkxZLAorICAgIC5lbmNvZGUyICAgICAgICA9IGVuY29kZV9mcmFtZSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9QQUw4LCBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4QSwgQVZfUElYX0ZNVF9HUkFZMTZMRSwKKyAgICAgICAgQVZfUElYX0ZNVF9NT05PQkxBQ0ssIEFWX1BJWF9GTVRfTU9OT1dISVRFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVY0NDBQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLCBBVl9QSVhfRk1UX1JHQjQ4TEUsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQSwgQVZfUElYX0ZNVF9SR0JBNjRMRSwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmdGlmZmVuY19jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90bXYuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Rtdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MjVhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy90bXYuYwpAQCAtMCwwICsxLDk3IEBACisvKgorICogODA4OGZsZXggVE1WIHZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBEYW5pZWwgVmVya2FtcCA8ZGFuaWVsIGF0IGRydi5udT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogODA4OGZsZXggVE1WIHZpZGVvIGRlY29kZXIKKyAqIEBhdXRob3IgRGFuaWVsIFZlcmthbXAKKyAqIEBzZWUgaHR0cDovL3d3dy5vbGRza29vbC5vcmcvcGMvODA4OF9Db3JydXB0aW9uCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3hnYV9mb250X2RhdGEuaCIKKworI2luY2x1ZGUgImNnYV9kYXRhLmgiCisKK3N0YXRpYyBpbnQgdG12X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IGF2cGt0LT5kYXRhOworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICB1bnNpZ25lZCBjaGFyX2NvbHMgPSBhdmN0eC0+d2lkdGggPj4gMzsKKyAgICB1bnNpZ25lZCBjaGFyX3Jvd3MgPSBhdmN0eC0+aGVpZ2h0ID4+IDM7CisgICAgdW5zaWduZWQgeCwgeSwgZmcsIGJnLCBjOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGF2cGt0LT5zaXplIDwgMipjaGFyX3Jvd3MqY2hhcl9jb2xzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIklucHV0IGJ1ZmZlciB0b28gc21hbGwsIHRydW5jYXRlZCBzYW1wbGU/XG4iKTsKKyAgICAgICAgKmdvdF9mcmFtZSA9IDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICBkc3QgICAgICAgICAgICAgID0gZnJhbWUtPmRhdGFbMF07CisKKyAgICBmcmFtZS0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzFdLCBmZl9jZ2FfcGFsZXR0ZSwgMTYgKiA0KTsKKyAgICBtZW1zZXQoZnJhbWUtPmRhdGFbMV0gKyAxNiAqIDQsIDAsIEFWUEFMRVRURV9TSVpFIC0gMTYgKiA0KTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBjaGFyX3Jvd3M7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgY2hhcl9jb2xzOyB4KyspIHsKKyAgICAgICAgICAgIGMgID0gKnNyYysrOworICAgICAgICAgICAgYmcgPSAqc3JjICA+PiA0OworICAgICAgICAgICAgZmcgPSAqc3JjKysgJiAweEY7CisgICAgICAgICAgICBmZl9kcmF3X3BjX2ZvbnQoZHN0ICsgeCAqIDgsIGZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfY2dhX2ZvbnQsIDgsIGMsIGZnLCBiZyk7CisgICAgICAgIH0KKyAgICAgICAgZHN0ICs9IGZyYW1lLT5saW5lc2l6ZVswXSAqIDg7CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB0bXZfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3Rtdl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ0bXYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCI4MDg4ZmxleCBUTVYiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVE1WLAorICAgIC5pbml0ICAgICAgICAgICA9IHRtdl9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSB0bXZfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdHBlbGRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHBlbGRzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNGZlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy90cGVsZHNwLmMKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiB0aGlyZHBlbCBEU1AgZnVuY3Rpb25zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHRoaXJkcGVsIERTUCBmdW5jdGlvbnMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgInRwZWxkc3AuaCIKKworI2RlZmluZSBCSVRfREVQVEggOAorI2luY2x1ZGUgInBlbF90ZW1wbGF0ZS5jIgorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3RwZWxfcGl4ZWxzX21jMDBfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBzd2l0Y2ggKHdpZHRoKSB7CisgICAgY2FzZSAyOgorICAgICAgICBwdXRfcGl4ZWxzMl84X2MoZHN0LCBzcmMsIHN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBwdXRfcGl4ZWxzNF84X2MoZHN0LCBzcmMsIHN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICBwdXRfcGl4ZWxzOF84X2MoZHN0LCBzcmMsIHN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgICAgcHV0X3BpeGVsczE2XzhfYyhkc3QsIHNyYywgc3RyaWRlLCBoZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdHBlbF9waXhlbHNfbWMxMF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorICAgICAgICAgICAgZHN0W2pdID0gKCgyICogc3JjW2pdICsgc3JjW2ogKyAxXSArIDEpICoKKyAgICAgICAgICAgICAgICAgICAgICA2ODMpID4+IDExOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF90cGVsX3BpeGVsc19tYzIwX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgICAgICBkc3Rbal0gPSAoKHNyY1tqXSArIDIgKiBzcmNbaiArIDFdICsgMSkgKgorICAgICAgICAgICAgICAgICAgICAgIDY4MykgPj4gMTE7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3RwZWxfcGl4ZWxzX21jMDFfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKyAgICAgICAgICAgIGRzdFtqXSA9ICgoMiAqIHNyY1tqXSArIHNyY1tqICsgc3RyaWRlXSArIDEpICoKKyAgICAgICAgICAgICAgICAgICAgICA2ODMpID4+IDExOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF90cGVsX3BpeGVsc19tYzExX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgICAgICBkc3Rbal0gPSAoKDQgKiBzcmNbal0gICAgICAgICAgKyAzICogc3JjW2ogKyAxXSArCisgICAgICAgICAgICAgICAgICAgICAgIDMgKiBzcmNbaiArIHN0cmlkZV0gKyAyICogc3JjW2ogKyBzdHJpZGUgKyAxXSArIDYpICoKKyAgICAgICAgICAgICAgICAgICAgICAyNzMxKSA+PiAxNTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdHBlbF9waXhlbHNfbWMxMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorICAgICAgICAgICAgZHN0W2pdID0gKCgzICogc3JjW2pdICAgICAgICAgICsgMiAqIHNyY1tqICsgMV0gKworICAgICAgICAgICAgICAgICAgICAgICA0ICogc3JjW2ogKyBzdHJpZGVdICsgMyAqIHNyY1tqICsgc3RyaWRlICsgMV0gKyA2KSAqCisgICAgICAgICAgICAgICAgICAgICAgMjczMSkgPj4gMTU7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3RwZWxfcGl4ZWxzX21jMDJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKyAgICAgICAgICAgIGRzdFtqXSA9ICgoc3JjW2pdICsgMiAqIHNyY1tqICsgc3RyaWRlXSArIDEpICoKKyAgICAgICAgICAgICAgICAgICAgICA2ODMpID4+IDExOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF90cGVsX3BpeGVsc19tYzIxX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgICAgICBkc3Rbal0gPSAoKDMgKiBzcmNbal0gICAgICAgICAgKyA0ICogc3JjW2ogKyAxXSArCisgICAgICAgICAgICAgICAgICAgICAgIDIgKiBzcmNbaiArIHN0cmlkZV0gKyAzICogc3JjW2ogKyBzdHJpZGUgKyAxXSArIDYpICoKKyAgICAgICAgICAgICAgICAgICAgICAyNzMxKSA+PiAxNTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdHBlbF9waXhlbHNfbWMyMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorICAgICAgICAgICAgZHN0W2pdID0gKCgyICogc3JjW2pdICAgICAgICAgICsgMyAqIHNyY1tqICsgMV0gKworICAgICAgICAgICAgICAgICAgICAgICAzICogc3JjW2ogKyBzdHJpZGVdICsgNCAqIHNyY1tqICsgc3RyaWRlICsgMV0gKyA2KSAqCisgICAgICAgICAgICAgICAgICAgICAgMjczMSkgPj4gMTU7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXZnX3RwZWxfcGl4ZWxzX21jMDBfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBzd2l0Y2ggKHdpZHRoKSB7CisgICAgY2FzZSAyOgorICAgICAgICBhdmdfcGl4ZWxzMl84X2MoZHN0LCBzcmMsIHN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBhdmdfcGl4ZWxzNF84X2MoZHN0LCBzcmMsIHN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICBhdmdfcGl4ZWxzOF84X2MoZHN0LCBzcmMsIHN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgICAgYXZnX3BpeGVsczE2XzhfYyhkc3QsIHNyYywgc3RyaWRlLCBoZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdmdfdHBlbF9waXhlbHNfbWMxMF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorICAgICAgICAgICAgZHN0W2pdID0gKGRzdFtqXSArCisgICAgICAgICAgICAgICAgICAgICAgKCgoMiAqIHNyY1tqXSArIHNyY1tqICsgMV0gKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICA2ODMpID4+IDExKSArIDEpID4+IDE7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXZnX3RwZWxfcGl4ZWxzX21jMjBfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKyAgICAgICAgICAgIGRzdFtqXSA9IChkc3Rbal0gKworICAgICAgICAgICAgICAgICAgICAgICgoKHNyY1tqXSArIDIgKiBzcmNbaiArIDFdICsgMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgNjgzKSA+PiAxMSkgKyAxKSA+PiAxOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGF2Z190cGVsX3BpeGVsc19tYzAxX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgICAgICBkc3Rbal0gPSAoZHN0W2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAoKCgyICogc3JjW2pdICsgc3JjW2ogKyBzdHJpZGVdICsgMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgNjgzKSA+PiAxMSkgKyAxKSA+PiAxOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGF2Z190cGVsX3BpeGVsc19tYzExX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgICAgICBkc3Rbal0gPSAoZHN0W2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAoKCg0ICogc3JjW2pdICAgICAgICAgICsgMyAqIHNyY1tqICsgMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBzcmNbaiArIHN0cmlkZV0gKyAyICogc3JjW2ogKyBzdHJpZGUgKyAxXSArIDYpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIDI3MzEpID4+IDE1KSArIDEpID4+IDE7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXZnX3RwZWxfcGl4ZWxzX21jMTJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKyAgICAgICAgICAgIGRzdFtqXSA9IChkc3Rbal0gKworICAgICAgICAgICAgICAgICAgICAgICgoKDMgKiBzcmNbal0gICAgICAgICAgKyAyICogc3JjW2ogKyAxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgNCAqIHNyY1tqICsgc3RyaWRlXSArIDMgKiBzcmNbaiArIHN0cmlkZSArIDFdICsgNikgKgorICAgICAgICAgICAgICAgICAgICAgICAgMjczMSkgPj4gMTUpICsgMSkgPj4gMTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdmdfdHBlbF9waXhlbHNfbWMwMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorICAgICAgICAgICAgZHN0W2pdID0gKGRzdFtqXSArCisgICAgICAgICAgICAgICAgICAgICAgKCgoc3JjW2pdICsgMiAqIHNyY1tqICsgc3RyaWRlXSArIDEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIDY4MykgPj4gMTEpICsgMSkgPj4gMTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdmdfdHBlbF9waXhlbHNfbWMyMV9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorICAgICAgICAgICAgZHN0W2pdID0gKGRzdFtqXSArCisgICAgICAgICAgICAgICAgICAgICAgKCgoMyAqIHNyY1tqXSAgICAgICAgICArIDQgKiBzcmNbaiArIDFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAyICogc3JjW2ogKyBzdHJpZGVdICsgMyAqIHNyY1tqICsgc3RyaWRlICsgMV0gKyA2KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAyNzMxKSA+PiAxNSkgKyAxKSA+PiAxOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGF2Z190cGVsX3BpeGVsc19tYzIyX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgICAgICBkc3Rbal0gPSAoZHN0W2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAoKCgyICogc3JjW2pdICAgICAgICAgICsgMyAqIHNyY1tqICsgMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBzcmNbaiArIHN0cmlkZV0gKyA0ICogc3JjW2ogKyBzdHJpZGUgKyAxXSArIDYpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIDI3MzEpID4+IDE1KSArIDEpID4+IDE7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCithdl9jb2xkIHZvaWQgZmZfdHBlbGRzcF9pbml0KFRwZWxEU1BDb250ZXh0ICpjKQoreworICAgIGMtPnB1dF90cGVsX3BpeGVsc190YWJbIDBdID0gcHV0X3RwZWxfcGl4ZWxzX21jMDBfYzsKKyAgICBjLT5wdXRfdHBlbF9waXhlbHNfdGFiWyAxXSA9IHB1dF90cGVsX3BpeGVsc19tYzEwX2M7CisgICAgYy0+cHV0X3RwZWxfcGl4ZWxzX3RhYlsgMl0gPSBwdXRfdHBlbF9waXhlbHNfbWMyMF9jOworICAgIGMtPnB1dF90cGVsX3BpeGVsc190YWJbIDRdID0gcHV0X3RwZWxfcGl4ZWxzX21jMDFfYzsKKyAgICBjLT5wdXRfdHBlbF9waXhlbHNfdGFiWyA1XSA9IHB1dF90cGVsX3BpeGVsc19tYzExX2M7CisgICAgYy0+cHV0X3RwZWxfcGl4ZWxzX3RhYlsgNl0gPSBwdXRfdHBlbF9waXhlbHNfbWMyMV9jOworICAgIGMtPnB1dF90cGVsX3BpeGVsc190YWJbIDhdID0gcHV0X3RwZWxfcGl4ZWxzX21jMDJfYzsKKyAgICBjLT5wdXRfdHBlbF9waXhlbHNfdGFiWyA5XSA9IHB1dF90cGVsX3BpeGVsc19tYzEyX2M7CisgICAgYy0+cHV0X3RwZWxfcGl4ZWxzX3RhYlsxMF0gPSBwdXRfdHBlbF9waXhlbHNfbWMyMl9jOworCisgICAgYy0+YXZnX3RwZWxfcGl4ZWxzX3RhYlsgMF0gPSBhdmdfdHBlbF9waXhlbHNfbWMwMF9jOworICAgIGMtPmF2Z190cGVsX3BpeGVsc190YWJbIDFdID0gYXZnX3RwZWxfcGl4ZWxzX21jMTBfYzsKKyAgICBjLT5hdmdfdHBlbF9waXhlbHNfdGFiWyAyXSA9IGF2Z190cGVsX3BpeGVsc19tYzIwX2M7CisgICAgYy0+YXZnX3RwZWxfcGl4ZWxzX3RhYlsgNF0gPSBhdmdfdHBlbF9waXhlbHNfbWMwMV9jOworICAgIGMtPmF2Z190cGVsX3BpeGVsc190YWJbIDVdID0gYXZnX3RwZWxfcGl4ZWxzX21jMTFfYzsKKyAgICBjLT5hdmdfdHBlbF9waXhlbHNfdGFiWyA2XSA9IGF2Z190cGVsX3BpeGVsc19tYzIxX2M7CisgICAgYy0+YXZnX3RwZWxfcGl4ZWxzX3RhYlsgOF0gPSBhdmdfdHBlbF9waXhlbHNfbWMwMl9jOworICAgIGMtPmF2Z190cGVsX3BpeGVsc190YWJbIDldID0gYXZnX3RwZWxfcGl4ZWxzX21jMTJfYzsKKyAgICBjLT5hdmdfdHBlbF9waXhlbHNfdGFiWzEwXSA9IGF2Z190cGVsX3BpeGVsc19tYzIyX2M7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90cGVsZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy90cGVsZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczMmYxNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RwZWxkc3AuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogdGhpcmRwZWwgRFNQIGZ1bmN0aW9ucworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiB0aGlyZHBlbCBEU1AgZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1RQRUxEU1BfSAorI2RlZmluZSBBVkNPREVDX1RQRUxEU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIGFkZCBhbmQgcHV0IHBpeGVsIChkZWNvZGluZykgKi8KKy8vIGJsb2Nrc2l6ZXMgZm9yIGhwZWxfcGl4ZWxzX2Z1bmMgYXJlIDh4NCw4eDggMTZ4OCAxNngxNgorLy8gaCBmb3IgaHBlbF9waXhlbHNfZnVuYyBpcyBsaW1pdGVkIHRvIHt3aWR0aC8yLCB3aWR0aH0gYnV0IG5ldmVyIGxhcmdlcgorLy8gdGhhbiAxNiBhbmQgbmV2ZXIgc21hbGxlciB0aGFuIDQKK3R5cGVkZWYgdm9pZCAoKnRwZWxfbWNfZnVuYykodWludDhfdCAqYmxvY2sgLyogYWxpZ24gd2lkdGggKDggb3IgMTYpICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMgLyogYWxpZ24gMSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfc2l6ZSwgaW50IHcsIGludCBoKTsKKworLyoqCisgKiB0aGlyZHBlbCBEU1AgY29udGV4dAorICovCit0eXBlZGVmIHN0cnVjdCBUcGVsRFNQQ29udGV4dCB7CisgICAgLyoqCisgICAgICogVGhpcmRwZWwgbW90aW9uIGNvbXBlbnNhdGlvbiB3aXRoIHJvdW5kaW5nIChhICsgYiArIDEpID4+IDEuCisgICAgICogdGhpcyBpcyBhbiBhcnJheVsxMl0gb2YgbW90aW9uIGNvbXBlbnNhdGlvbiBmdW5jdGlvbnMgZm9yIHRoZQorICAgICAqIDkgdGhpcmRwZWwgcG9zaXRpb25zPGJyPgorICAgICAqICpwaXhlbHNfdGFiW3h0aGlyZHBlbCArIDQgKiB5dGhpcmRwZWxdCisgICAgICogQHBhcmFtIGJsb2NrIGRlc3RpbmF0aW9uIHdoZXJlIHRoZSByZXN1bHQgaXMgc3RvcmVkCisgICAgICogQHBhcmFtIHBpeGVscyBzb3VyY2UKKyAgICAgKiBAcGFyYW0gbGluZV9zaXplIG51bWJlciBvZiBieXRlcyBpbiBhIGhvcml6b250YWwgbGluZSBvZiBibG9jaworICAgICAqIEBwYXJhbSBoIGhlaWdodAorICAgICAqLworICAgIHRwZWxfbWNfZnVuYyBwdXRfdHBlbF9waXhlbHNfdGFiWzExXTsgLy8gRklYTUUgaW5kaXZpZHVhbCBmdW5jIHB0ciBwZXIgd2lkdGg/CisgICAgdHBlbF9tY19mdW5jIGF2Z190cGVsX3BpeGVsc190YWJbMTFdOyAvLyBGSVhNRSBpbmRpdmlkdWFsIGZ1bmMgcHRyIHBlciB3aWR0aD8KK30gVHBlbERTUENvbnRleHQ7CisKK3ZvaWQgZmZfdHBlbGRzcF9pbml0KFRwZWxEU1BDb250ZXh0ICpjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVFBFTERTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90cnVlbW90aW9uMS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHJ1ZW1vdGlvbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjBlY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHJ1ZW1vdGlvbjEuYwpAQCAtMCwwICsxLDkxNiBAQAorLyoKKyAqIER1Y2sgVHJ1ZU1vdGlvbiAxLjAgRGVjb2RlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIEFsZXggQmVyZWdzemFzemkgJiBNaWtlIE1lbGFuc29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIER1Y2sgVHJ1ZU1vdGlvbiB2MSBWaWRlbyBEZWNvZGVyIGJ5CisgKiBBbGV4IEJlcmVnc3phc3ppIGFuZAorICogTWlrZSBNZWxhbnNvbiAobWVsYW5zb25AcGNpc3lzLm5ldCkKKyAqCisgKiBUaGUgVHJ1ZU1vdGlvbiB2MSBkZWNvZGVyIHByZXNlbnRseSBvbmx5IGRlY29kZXMgMTYtYml0IFRNMSBkYXRhIGFuZAorICogb3V0cHV0cyBSR0I1NTUgKG9yIFJHQjU2NSkgZGF0YS4gMjQtYml0IFRNMSBkYXRhIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgInRydWVtb3Rpb24xZGF0YS5oIgorCit0eXBlZGVmIHN0cnVjdCBUcnVlTW90aW9uMUNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBVkZyYW1lICpmcmFtZTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKyAgICBpbnQgc2l6ZTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKm1iX2NoYW5nZV9iaXRzOworICAgIGludCBtYl9jaGFuZ2VfYml0c19yb3dfc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICppbmRleF9zdHJlYW07CisgICAgaW50IGluZGV4X3N0cmVhbV9zaXplOworCisgICAgaW50IGZsYWdzOworICAgIGludCB4LCB5LCB3LCBoOworCisgICAgdWludDMyX3QgeV9wcmVkaWN0b3JfdGFibGVbMTAyNF07CisgICAgdWludDMyX3QgY19wcmVkaWN0b3JfdGFibGVbMTAyNF07CisgICAgdWludDMyX3QgZmF0X3lfcHJlZGljdG9yX3RhYmxlWzEwMjRdOworICAgIHVpbnQzMl90IGZhdF9jX3ByZWRpY3Rvcl90YWJsZVsxMDI0XTsKKworICAgIGludCBjb21wcmVzc2lvbjsKKyAgICBpbnQgYmxvY2tfdHlwZTsKKyAgICBpbnQgYmxvY2tfd2lkdGg7CisgICAgaW50IGJsb2NrX2hlaWdodDsKKworICAgIGludDE2X3QgeWR0WzhdOworICAgIGludDE2X3QgY2R0WzhdOworICAgIGludDE2X3QgZmF0X3lkdFs4XTsKKyAgICBpbnQxNl90IGZhdF9jZHRbOF07CisKKyAgICBpbnQgbGFzdF9kZWx0YXNldCwgbGFzdF92ZWN0YWJsZTsKKworICAgIHVuc2lnbmVkIGludCAqdmVydF9wcmVkOworICAgIGludCB2ZXJ0X3ByZWRfc2l6ZTsKKworfSBUcnVlTW90aW9uMUNvbnRleHQ7CisKKyNkZWZpbmUgRkxBR19TUFJJVEUgICAgICAgICAzMgorI2RlZmluZSBGTEFHX0tFWUZSQU1FICAgICAgIDE2CisjZGVmaW5lIEZMQUdfSU5URVJGUkFNRSAgICAgIDgKKyNkZWZpbmUgRkxBR19JTlRFUlBPTEFURUQgICAgNAorCitzdHJ1Y3QgZnJhbWVfaGVhZGVyIHsKKyAgICB1aW50OF90IGhlYWRlcl9zaXplOworICAgIHVpbnQ4X3QgY29tcHJlc3Npb247CisgICAgdWludDhfdCBkZWx0YXNldDsKKyAgICB1aW50OF90IHZlY3RhYmxlOworICAgIHVpbnQxNl90IHlzaXplOworICAgIHVpbnQxNl90IHhzaXplOworICAgIHVpbnQxNl90IGNoZWNrc3VtOworICAgIHVpbnQ4X3QgdmVyc2lvbjsKKyAgICB1aW50OF90IGhlYWRlcl90eXBlOworICAgIHVpbnQ4X3QgZmxhZ3M7CisgICAgdWludDhfdCBjb250cm9sOworICAgIHVpbnQxNl90IHhvZmZzZXQ7CisgICAgdWludDE2X3QgeW9mZnNldDsKKyAgICB1aW50MTZfdCB3aWR0aDsKKyAgICB1aW50MTZfdCBoZWlnaHQ7Cit9OworCisjZGVmaW5lIEFMR09fTk9QICAgICAgICAwCisjZGVmaW5lIEFMR09fUkdCMTZWICAgICAxCisjZGVmaW5lIEFMR09fUkdCMTZIICAgICAyCisjZGVmaW5lIEFMR09fUkdCMjRIICAgICAzCisKKy8qIHRoZXNlIGFyZSB0aGUgdmFyaW91cyBibG9jayBzaXplcyB0aGF0IGNhbiBvY2N1cHkgYSA0eDQgYmxvY2sgKi8KKyNkZWZpbmUgQkxPQ0tfMngyICAwCisjZGVmaW5lIEJMT0NLXzJ4NCAgMQorI2RlZmluZSBCTE9DS180eDIgIDIKKyNkZWZpbmUgQkxPQ0tfNHg0ICAzCisKK3R5cGVkZWYgc3RydWN0IGNvbXBfdHlwZXMgeworICAgIGludCBhbGdvcml0aG07CisgICAgaW50IGJsb2NrX3dpZHRoOyAvLyB2cmVzCisgICAgaW50IGJsb2NrX2hlaWdodDsgLy8gaHJlcworICAgIGludCBibG9ja190eXBlOworfSBjb21wX3R5cGVzOworCisvKiB7IHZhbGlkIGZvciBtZXRhdHlwZSB9LCBhbGdvcml0aG0sIG51bSBvZiBkZWx0YXMsIHZlcnQgcmVzLCBob3JpeiByZXMgKi8KK3N0YXRpYyBjb25zdCBjb21wX3R5cGVzIGNvbXByZXNzaW9uX3R5cGVzWzE3XSA9IHsKKyAgICB7IEFMR09fTk9QLCAgICAwLCAwLCAwIH0sCisKKyAgICB7IEFMR09fUkdCMTZWLCA0LCA0LCBCTE9DS180eDQgfSwKKyAgICB7IEFMR09fUkdCMTZILCA0LCA0LCBCTE9DS180eDQgfSwKKyAgICB7IEFMR09fUkdCMTZWLCA0LCAyLCBCTE9DS180eDIgfSwKKyAgICB7IEFMR09fUkdCMTZILCA0LCAyLCBCTE9DS180eDIgfSwKKworICAgIHsgQUxHT19SR0IxNlYsIDIsIDQsIEJMT0NLXzJ4NCB9LAorICAgIHsgQUxHT19SR0IxNkgsIDIsIDQsIEJMT0NLXzJ4NCB9LAorICAgIHsgQUxHT19SR0IxNlYsIDIsIDIsIEJMT0NLXzJ4MiB9LAorICAgIHsgQUxHT19SR0IxNkgsIDIsIDIsIEJMT0NLXzJ4MiB9LAorCisgICAgeyBBTEdPX05PUCwgICAgNCwgNCwgQkxPQ0tfNHg0IH0sCisgICAgeyBBTEdPX1JHQjI0SCwgNCwgNCwgQkxPQ0tfNHg0IH0sCisgICAgeyBBTEdPX05PUCwgICAgNCwgMiwgQkxPQ0tfNHgyIH0sCisgICAgeyBBTEdPX1JHQjI0SCwgNCwgMiwgQkxPQ0tfNHgyIH0sCisKKyAgICB7IEFMR09fTk9QLCAgICAyLCA0LCBCTE9DS18yeDQgfSwKKyAgICB7IEFMR09fUkdCMjRILCAyLCA0LCBCTE9DS18yeDQgfSwKKyAgICB7IEFMR09fTk9QLCAgICAyLCAyLCBCTE9DS18yeDIgfSwKKyAgICB7IEFMR09fUkdCMjRILCAyLCAyLCBCTE9DS18yeDIgfQorfTsKKworc3RhdGljIHZvaWQgc2VsZWN0X2RlbHRhX3RhYmxlcyhUcnVlTW90aW9uMUNvbnRleHQgKnMsIGludCBkZWx0YV90YWJsZV9pbmRleCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChkZWx0YV90YWJsZV9pbmRleCA+IDMpCisgICAgICAgIHJldHVybjsKKworICAgIG1lbWNweShzLT55ZHQsIHlkdHNbZGVsdGFfdGFibGVfaW5kZXhdLCA4ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICBtZW1jcHkocy0+Y2R0LCBjZHRzW2RlbHRhX3RhYmxlX2luZGV4XSwgOCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgbWVtY3B5KHMtPmZhdF95ZHQsIGZhdF95ZHRzW2RlbHRhX3RhYmxlX2luZGV4XSwgOCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgbWVtY3B5KHMtPmZhdF9jZHQsIGZhdF9jZHRzW2RlbHRhX3RhYmxlX2luZGV4XSwgOCAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAvKiBZIHNraW5ueSBkZWx0YXMgbmVlZCB0byBiZSBoYWx2ZWQgZm9yIHNvbWUgcmVhc29uOyBtYXliZSB0aGUKKyAgICAgKiBza2lubnkgWSBkZWx0YXMgc2hvdWxkIGJlIG1vZGlmaWVkICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICB7CisgICAgICAgIC8qIGRyb3AgdGhlIGxzYiBiZWZvcmUgZGl2aWRpbmcgYnkgMi0tIG5ldCBlZmZlY3Q6IHJvdW5kIGRvd24KKyAgICAgICAgICogd2hlbiBkaXZpZGluZyBhIG5lZ2F0aXZlIG51bWJlciAoZS5nLiwgLTMvMiA9IC0yLCBub3QgLTEpICovCisgICAgICAgIHMtPnlkdFtpXSAmPSAweEZGRkU7CisgICAgICAgIHMtPnlkdFtpXSAvPSAyOworICAgIH0KK30KKworI2lmIEhBVkVfQklHRU5ESUFOCitzdGF0aWMgaW50IG1ha2VfeWR0MTVfZW50cnkoaW50IHAyLCBpbnQgcDEsIGludDE2X3QgKnlkdCkKKyNlbHNlCitzdGF0aWMgaW50IG1ha2VfeWR0MTVfZW50cnkoaW50IHAxLCBpbnQgcDIsIGludDE2X3QgKnlkdCkKKyNlbmRpZgoreworICAgIGludCBsbywgaGk7CisKKyAgICBsbyA9IHlkdFtwMV07CisgICAgbG8gKz0gKGxvIDw8IDUpICsgKGxvIDw8IDEwKTsKKyAgICBoaSA9IHlkdFtwMl07CisgICAgaGkgKz0gKGhpIDw8IDUpICsgKGhpIDw8IDEwKTsKKyAgICByZXR1cm4gKGxvICsgKGhpIDw8IDE2KSkgPDwgMTsKK30KKworc3RhdGljIGludCBtYWtlX2NkdDE1X2VudHJ5KGludCBwMSwgaW50IHAyLCBpbnQxNl90ICpjZHQpCit7CisgICAgaW50IHIsIGIsIGxvOworCisgICAgYiA9IGNkdFtwMl07CisgICAgciA9IGNkdFtwMV0gPDwgMTA7CisgICAgbG8gPSBiICsgcjsKKyAgICByZXR1cm4gKGxvICsgKGxvIDw8IDE2KSkgPDwgMTsKK30KKworI2lmIEhBVkVfQklHRU5ESUFOCitzdGF0aWMgaW50IG1ha2VfeWR0MTZfZW50cnkoaW50IHAyLCBpbnQgcDEsIGludDE2X3QgKnlkdCkKKyNlbHNlCitzdGF0aWMgaW50IG1ha2VfeWR0MTZfZW50cnkoaW50IHAxLCBpbnQgcDIsIGludDE2X3QgKnlkdCkKKyNlbmRpZgoreworICAgIGludCBsbywgaGk7CisKKyAgICBsbyA9IHlkdFtwMV07CisgICAgbG8gKz0gKGxvIDw8IDYpICsgKGxvIDw8IDExKTsKKyAgICBoaSA9IHlkdFtwMl07CisgICAgaGkgKz0gKGhpIDw8IDYpICsgKGhpIDw8IDExKTsKKyAgICByZXR1cm4gKGxvICsgKGhpIDw8IDE2KSkgPDwgMTsKK30KKworc3RhdGljIGludCBtYWtlX2NkdDE2X2VudHJ5KGludCBwMSwgaW50IHAyLCBpbnQxNl90ICpjZHQpCit7CisgICAgaW50IHIsIGIsIGxvOworCisgICAgYiA9IGNkdFtwMl07CisgICAgciA9IGNkdFtwMV0gPDwgMTE7CisgICAgbG8gPSBiICsgcjsKKyAgICByZXR1cm4gKGxvICsgKGxvIDw8IDE2KSkgPDwgMTsKK30KKworc3RhdGljIGludCBtYWtlX3lkdDI0X2VudHJ5KGludCBwMSwgaW50IHAyLCBpbnQxNl90ICp5ZHQpCit7CisgICAgaW50IGxvLCBoaTsKKworICAgIGxvID0geWR0W3AxXTsKKyAgICBoaSA9IHlkdFtwMl07CisgICAgcmV0dXJuIChsbyArIChoaSA8PCA4KSArIChoaSA8PCAxNikpIDw8IDE7Cit9CisKK3N0YXRpYyBpbnQgbWFrZV9jZHQyNF9lbnRyeShpbnQgcDEsIGludCBwMiwgaW50MTZfdCAqY2R0KQoreworICAgIGludCByLCBiOworCisgICAgYiA9IGNkdFtwMl07CisgICAgciA9IGNkdFtwMV08PDE2OworICAgIHJldHVybiAoYityKSA8PCAxOworfQorCitzdGF0aWMgdm9pZCBnZW5fdmVjdG9yX3RhYmxlMTUoVHJ1ZU1vdGlvbjFDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpzZWxfdmVjdG9yX3RhYmxlKQoreworICAgIGludCBsZW4sIGksIGo7CisgICAgdW5zaWduZWQgY2hhciBkZWx0YV9wYWlyOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gNCkKKyAgICB7CisgICAgICAgIGxlbiA9ICpzZWxfdmVjdG9yX3RhYmxlKysgLyAyOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbHRhX3BhaXIgPSAqc2VsX3ZlY3Rvcl90YWJsZSsrOworICAgICAgICAgICAgcy0+eV9wcmVkaWN0b3JfdGFibGVbaStqXSA9IDB4ZmZmZmZmZmUgJgorICAgICAgICAgICAgICAgIG1ha2VfeWR0MTVfZW50cnkoZGVsdGFfcGFpciA+PiA0LCBkZWx0YV9wYWlyICYgMHhmLCBzLT55ZHQpOworICAgICAgICAgICAgcy0+Y19wcmVkaWN0b3JfdGFibGVbaStqXSA9IDB4ZmZmZmZmZmUgJgorICAgICAgICAgICAgICAgIG1ha2VfY2R0MTVfZW50cnkoZGVsdGFfcGFpciA+PiA0LCBkZWx0YV9wYWlyICYgMHhmLCBzLT5jZHQpOworICAgICAgICB9CisgICAgICAgIHMtPnlfcHJlZGljdG9yX3RhYmxlW2krKGotMSldIHw9IDE7CisgICAgICAgIHMtPmNfcHJlZGljdG9yX3RhYmxlW2krKGotMSldIHw9IDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW5fdmVjdG9yX3RhYmxlMTYoVHJ1ZU1vdGlvbjFDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpzZWxfdmVjdG9yX3RhYmxlKQoreworICAgIGludCBsZW4sIGksIGo7CisgICAgdW5zaWduZWQgY2hhciBkZWx0YV9wYWlyOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gNCkKKyAgICB7CisgICAgICAgIGxlbiA9ICpzZWxfdmVjdG9yX3RhYmxlKysgLyAyOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbHRhX3BhaXIgPSAqc2VsX3ZlY3Rvcl90YWJsZSsrOworICAgICAgICAgICAgcy0+eV9wcmVkaWN0b3JfdGFibGVbaStqXSA9IDB4ZmZmZmZmZmUgJgorICAgICAgICAgICAgICAgIG1ha2VfeWR0MTZfZW50cnkoZGVsdGFfcGFpciA+PiA0LCBkZWx0YV9wYWlyICYgMHhmLCBzLT55ZHQpOworICAgICAgICAgICAgcy0+Y19wcmVkaWN0b3JfdGFibGVbaStqXSA9IDB4ZmZmZmZmZmUgJgorICAgICAgICAgICAgICAgIG1ha2VfY2R0MTZfZW50cnkoZGVsdGFfcGFpciA+PiA0LCBkZWx0YV9wYWlyICYgMHhmLCBzLT5jZHQpOworICAgICAgICB9CisgICAgICAgIHMtPnlfcHJlZGljdG9yX3RhYmxlW2krKGotMSldIHw9IDE7CisgICAgICAgIHMtPmNfcHJlZGljdG9yX3RhYmxlW2krKGotMSldIHw9IDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW5fdmVjdG9yX3RhYmxlMjQoVHJ1ZU1vdGlvbjFDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpzZWxfdmVjdG9yX3RhYmxlKQoreworICAgIGludCBsZW4sIGksIGo7CisgICAgdW5zaWduZWQgY2hhciBkZWx0YV9wYWlyOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gNCkKKyAgICB7CisgICAgICAgIGxlbiA9ICpzZWxfdmVjdG9yX3RhYmxlKysgLyAyOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbHRhX3BhaXIgPSAqc2VsX3ZlY3Rvcl90YWJsZSsrOworICAgICAgICAgICAgcy0+eV9wcmVkaWN0b3JfdGFibGVbaStqXSA9IDB4ZmZmZmZmZmUgJgorICAgICAgICAgICAgICAgIG1ha2VfeWR0MjRfZW50cnkoZGVsdGFfcGFpciA+PiA0LCBkZWx0YV9wYWlyICYgMHhmLCBzLT55ZHQpOworICAgICAgICAgICAgcy0+Y19wcmVkaWN0b3JfdGFibGVbaStqXSA9IDB4ZmZmZmZmZmUgJgorICAgICAgICAgICAgICAgIG1ha2VfY2R0MjRfZW50cnkoZGVsdGFfcGFpciA+PiA0LCBkZWx0YV9wYWlyICYgMHhmLCBzLT5jZHQpOworICAgICAgICAgICAgcy0+ZmF0X3lfcHJlZGljdG9yX3RhYmxlW2kral0gPSAweGZmZmZmZmZlICYKKyAgICAgICAgICAgICAgICBtYWtlX3lkdDI0X2VudHJ5KGRlbHRhX3BhaXIgPj4gNCwgZGVsdGFfcGFpciAmIDB4Ziwgcy0+ZmF0X3lkdCk7CisgICAgICAgICAgICBzLT5mYXRfY19wcmVkaWN0b3JfdGFibGVbaStqXSA9IDB4ZmZmZmZmZmUgJgorICAgICAgICAgICAgICAgIG1ha2VfY2R0MjRfZW50cnkoZGVsdGFfcGFpciA+PiA0LCBkZWx0YV9wYWlyICYgMHhmLCBzLT5mYXRfY2R0KTsKKyAgICAgICAgfQorICAgICAgICBzLT55X3ByZWRpY3Rvcl90YWJsZVtpKyhqLTEpXSB8PSAxOworICAgICAgICBzLT5jX3ByZWRpY3Rvcl90YWJsZVtpKyhqLTEpXSB8PSAxOworICAgICAgICBzLT5mYXRfeV9wcmVkaWN0b3JfdGFibGVbaSsoai0xKV0gfD0gMTsKKyAgICAgICAgcy0+ZmF0X2NfcHJlZGljdG9yX3RhYmxlW2krKGotMSldIHw9IDE7CisgICAgfQorfQorCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgZnJvbSB0aGUgYnl0ZXN0cmVhbS4gUmV0dXJucyAtMSBpZgorICogdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGRlY29kaW5nIHRoZSBoZWFkZXIgKi8KK3N0YXRpYyBpbnQgdHJ1ZW1vdGlvbjFfZGVjb2RlX2hlYWRlcihUcnVlTW90aW9uMUNvbnRleHQgKnMpCit7CisgICAgaW50IGksIHJldDsKKyAgICBpbnQgd2lkdGhfc2hpZnQgPSAwOworICAgIGludCBuZXdfcGl4X2ZtdDsKKyAgICBzdHJ1Y3QgZnJhbWVfaGVhZGVyIGhlYWRlcjsKKyAgICB1aW50OF90IGhlYWRlcl9idWZmZXJbMTI4XSA9IHsgMCB9OyAgLyogbG9naWNhbCBtYXhpbXVtIHNpemUgb2YgdGhlIGhlYWRlciAqLworICAgIGNvbnN0IHVpbnQ4X3QgKnNlbF92ZWN0b3JfdGFibGU7CisKKyAgICBoZWFkZXIuaGVhZGVyX3NpemUgPSAoKHMtPmJ1ZlswXSA+PiA1KSB8IChzLT5idWZbMF0gPDwgMykpICYgMHg3ZjsKKyAgICBpZiAocy0+YnVmWzBdIDwgMHgxMCkKKyAgICB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBoZWFkZXIgc2l6ZSAoJWQpXG4iLCBzLT5idWZbMF0pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoaGVhZGVyLmhlYWRlcl9zaXplICsgMSA+IHMtPnNpemUpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnB1dCBwYWNrZXQgdG9vIHNtYWxsLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIHVuc2NyYW1ibGUgdGhlIGhlYWRlciBieXRlcyB3aXRoIGEgWE9SIG9wZXJhdGlvbiAqLworICAgIGZvciAoaSA9IDE7IGkgPCBoZWFkZXIuaGVhZGVyX3NpemU7IGkrKykKKyAgICAgICAgaGVhZGVyX2J1ZmZlcltpIC0gMV0gPSBzLT5idWZbaV0gXiBzLT5idWZbaSArIDFdOworCisgICAgaGVhZGVyLmNvbXByZXNzaW9uID0gaGVhZGVyX2J1ZmZlclswXTsKKyAgICBoZWFkZXIuZGVsdGFzZXQgPSBoZWFkZXJfYnVmZmVyWzFdOworICAgIGhlYWRlci52ZWN0YWJsZSA9IGhlYWRlcl9idWZmZXJbMl07CisgICAgaGVhZGVyLnlzaXplID0gQVZfUkwxNigmaGVhZGVyX2J1ZmZlclszXSk7CisgICAgaGVhZGVyLnhzaXplID0gQVZfUkwxNigmaGVhZGVyX2J1ZmZlcls1XSk7CisgICAgaGVhZGVyLmNoZWNrc3VtID0gQVZfUkwxNigmaGVhZGVyX2J1ZmZlcls3XSk7CisgICAgaGVhZGVyLnZlcnNpb24gPSBoZWFkZXJfYnVmZmVyWzldOworICAgIGhlYWRlci5oZWFkZXJfdHlwZSA9IGhlYWRlcl9idWZmZXJbMTBdOworICAgIGhlYWRlci5mbGFncyA9IGhlYWRlcl9idWZmZXJbMTFdOworICAgIGhlYWRlci5jb250cm9sID0gaGVhZGVyX2J1ZmZlclsxMl07CisKKyAgICAvKiBWZXJzaW9uIDIgKi8KKyAgICBpZiAoaGVhZGVyLnZlcnNpb24gPj0gMikKKyAgICB7CisgICAgICAgIGlmIChoZWFkZXIuaGVhZGVyX3R5cGUgPiAzKQorICAgICAgICB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgaGVhZGVyIHR5cGUgKCVkKVxuIiwgaGVhZGVyLmhlYWRlcl90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9IGVsc2UgaWYgKChoZWFkZXIuaGVhZGVyX3R5cGUgPT0gMikgfHwgKGhlYWRlci5oZWFkZXJfdHlwZSA9PSAzKSkgeworICAgICAgICAgICAgcy0+ZmxhZ3MgPSBoZWFkZXIuZmxhZ3M7CisgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIEZMQUdfSU5URVJGUkFNRSkpCisgICAgICAgICAgICAgICAgcy0+ZmxhZ3MgfD0gRkxBR19LRVlGUkFNRTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzLT5mbGFncyA9IEZMQUdfS0VZRlJBTUU7CisgICAgfSBlbHNlIC8qIFZlcnNpb24gMSAqLworICAgICAgICBzLT5mbGFncyA9IEZMQUdfS0VZRlJBTUU7CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBGTEFHX1NQUklURSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJGcmFtZSB3aXRoIHNwcml0ZSIpOworICAgICAgICAvKiBGSVhNRSBoZWFkZXIud2lkdGgsIGhlaWdodCwgeG9mZnNldCBhbmQgeW9mZnNldCBhcmVuJ3QgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPncgPSBoZWFkZXIueHNpemU7CisgICAgICAgIHMtPmggPSBoZWFkZXIueXNpemU7CisgICAgICAgIGlmIChoZWFkZXIuaGVhZGVyX3R5cGUgPCAyKSB7CisgICAgICAgICAgICBpZiAoKHMtPncgPCAyMTMpICYmIChzLT5oID49IDE3NikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcy0+ZmxhZ3MgfD0gRkxBR19JTlRFUlBPTEFURUQ7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiSW50ZXJwb2xhdGVkIGZyYW1lIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGVhZGVyLmNvbXByZXNzaW9uID49IDE3KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBjb21wcmVzc2lvbiB0eXBlICglZClcbiIsIGhlYWRlci5jb21wcmVzc2lvbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgoaGVhZGVyLmRlbHRhc2V0ICE9IHMtPmxhc3RfZGVsdGFzZXQpIHx8CisgICAgICAgIChoZWFkZXIudmVjdGFibGUgIT0gcy0+bGFzdF92ZWN0YWJsZSkpCisgICAgICAgIHNlbGVjdF9kZWx0YV90YWJsZXMocywgaGVhZGVyLmRlbHRhc2V0KTsKKworICAgIGlmICgoaGVhZGVyLmNvbXByZXNzaW9uICYgMSkgJiYgaGVhZGVyLmhlYWRlcl90eXBlKQorICAgICAgICBzZWxfdmVjdG9yX3RhYmxlID0gcGNfdGJsMjsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGhlYWRlci52ZWN0YWJsZSA+IDAgJiYgaGVhZGVyLnZlY3RhYmxlIDwgNCkKKyAgICAgICAgICAgIHNlbF92ZWN0b3JfdGFibGUgPSB0YWJsZXNbaGVhZGVyLnZlY3RhYmxlIC0gMV07CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHZlY3RvciB0YWJsZSBpZCAoJWQpXG4iLCBoZWFkZXIudmVjdGFibGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29tcHJlc3Npb25fdHlwZXNbaGVhZGVyLmNvbXByZXNzaW9uXS5hbGdvcml0aG0gPT0gQUxHT19SR0IyNEgpIHsKKyAgICAgICAgbmV3X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjMyOworICAgICAgICB3aWR0aF9zaGlmdCA9IDE7CisgICAgfSBlbHNlCisgICAgICAgIG5ld19waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTU7IC8vIFJHQjU2NSBpcyBzdXBwb3J0ZWQgYXMgd2VsbAorCisgICAgcy0+dyA+Pj0gd2lkdGhfc2hpZnQ7CisKKyAgICBpZiAocy0+dyAhPSBzLT5hdmN0eC0+d2lkdGggfHwgcy0+aCAhPSBzLT5hdmN0eC0+aGVpZ2h0IHx8CisgICAgICAgIG5ld19waXhfZm10ICE9IHMtPmF2Y3R4LT5waXhfZm10KSB7CisgICAgICAgIGF2X2ZyYW1lX3VucmVmKHMtPmZyYW1lKTsKKyAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7IDEgPDwgd2lkdGhfc2hpZnQsIDEgfTsKKyAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBuZXdfcGl4X2ZtdDsKKworICAgICAgICBpZiAoKHJldCA9IGZmX3NldF9kaW1lbnNpb25zKHMtPmF2Y3R4LCBzLT53LCBzLT5oKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBmZl9zZXRfc2FyKHMtPmF2Y3R4LCBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyk7CisKKyAgICAgICAgYXZfZmFzdF9tYWxsb2MoJnMtPnZlcnRfcHJlZCwgJnMtPnZlcnRfcHJlZF9zaXplLCBzLT5hdmN0eC0+d2lkdGggKiBzaXplb2YodW5zaWduZWQgaW50KSk7CisgICAgICAgIGlmICghcy0+dmVydF9wcmVkKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICAvKiBUaGVyZSBpcyAxIGNoYW5nZSBiaXQgcGVyIDQgcGl4ZWxzLCBzbyBlYWNoIGNoYW5nZSBieXRlIHJlcHJlc2VudHMKKyAgICAgKiAzMiBwaXhlbHM7IGRpdmlkZSB3aWR0aCBieSA0IHRvIG9idGFpbiB0aGUgbnVtYmVyIG9mIGNoYW5nZSBiaXRzIGFuZAorICAgICAqIHRoZW4gcm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgYnl0ZS4gKi8KKyAgICBzLT5tYl9jaGFuZ2VfYml0c19yb3dfc2l6ZSA9ICgocy0+YXZjdHgtPndpZHRoID4+ICgyIC0gd2lkdGhfc2hpZnQpKSArIDcpID4+IDM7CisKKyAgICBpZiAoKGhlYWRlci5kZWx0YXNldCAhPSBzLT5sYXN0X2RlbHRhc2V0KSB8fCAoaGVhZGVyLnZlY3RhYmxlICE9IHMtPmxhc3RfdmVjdGFibGUpKQorICAgIHsKKyAgICAgICAgaWYgKGNvbXByZXNzaW9uX3R5cGVzW2hlYWRlci5jb21wcmVzc2lvbl0uYWxnb3JpdGhtID09IEFMR09fUkdCMjRIKQorICAgICAgICAgICAgZ2VuX3ZlY3Rvcl90YWJsZTI0KHMsIHNlbF92ZWN0b3JfdGFibGUpOworICAgICAgICBlbHNlCisgICAgICAgIGlmIChzLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjU1NSkKKyAgICAgICAgICAgIGdlbl92ZWN0b3JfdGFibGUxNShzLCBzZWxfdmVjdG9yX3RhYmxlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ2VuX3ZlY3Rvcl90YWJsZTE2KHMsIHNlbF92ZWN0b3JfdGFibGUpOworICAgIH0KKworICAgIC8qIHNldCB1cCBwb2ludGVycyB0byB0aGUgb3RoZXIga2V5IGRhdGEgY2h1bmtzICovCisgICAgcy0+bWJfY2hhbmdlX2JpdHMgPSBzLT5idWYgKyBoZWFkZXIuaGVhZGVyX3NpemU7CisgICAgaWYgKHMtPmZsYWdzICYgRkxBR19LRVlGUkFNRSkgeworICAgICAgICAvKiBubyBjaGFuZ2UgYml0cyBzcGVjaWZpZWQgZm9yIGEga2V5ZnJhbWU7IG9ubHkgaW5kZXggYnl0ZXMgKi8KKyAgICAgICAgcy0+aW5kZXhfc3RyZWFtID0gcy0+bWJfY2hhbmdlX2JpdHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogb25lIGNoYW5nZSBiaXQgcGVyIDR4NCBibG9jayAqLworICAgICAgICBzLT5pbmRleF9zdHJlYW0gPSBzLT5tYl9jaGFuZ2VfYml0cyArCisgICAgICAgICAgICAocy0+bWJfY2hhbmdlX2JpdHNfcm93X3NpemUgKiAocy0+YXZjdHgtPmhlaWdodCA+PiAyKSk7CisgICAgfQorICAgIHMtPmluZGV4X3N0cmVhbV9zaXplID0gcy0+c2l6ZSAtIChzLT5pbmRleF9zdHJlYW0gLSBzLT5idWYpOworCisgICAgcy0+bGFzdF9kZWx0YXNldCA9IGhlYWRlci5kZWx0YXNldDsKKyAgICBzLT5sYXN0X3ZlY3RhYmxlID0gaGVhZGVyLnZlY3RhYmxlOworICAgIHMtPmNvbXByZXNzaW9uID0gaGVhZGVyLmNvbXByZXNzaW9uOworICAgIHMtPmJsb2NrX3dpZHRoID0gY29tcHJlc3Npb25fdHlwZXNbaGVhZGVyLmNvbXByZXNzaW9uXS5ibG9ja193aWR0aDsKKyAgICBzLT5ibG9ja19oZWlnaHQgPSBjb21wcmVzc2lvbl90eXBlc1toZWFkZXIuY29tcHJlc3Npb25dLmJsb2NrX2hlaWdodDsKKyAgICBzLT5ibG9ja190eXBlID0gY29tcHJlc3Npb25fdHlwZXNbaGVhZGVyLmNvbXByZXNzaW9uXS5ibG9ja190eXBlOworCisgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInRhYmxlczogJWQgLyAlZCBjOiVkICVkeCVkIHQ6JWQgJXMlcyVzJXNcbiIsCisgICAgICAgICAgICBzLT5sYXN0X2RlbHRhc2V0LCBzLT5sYXN0X3ZlY3RhYmxlLCBzLT5jb21wcmVzc2lvbiwgcy0+YmxvY2tfd2lkdGgsCisgICAgICAgICAgICBzLT5ibG9ja19oZWlnaHQsIHMtPmJsb2NrX3R5cGUsCisgICAgICAgICAgICBzLT5mbGFncyAmIEZMQUdfS0VZRlJBTUUgPyAiIEtFWSIgOiAiIiwKKyAgICAgICAgICAgIHMtPmZsYWdzICYgRkxBR19JTlRFUkZSQU1FID8gIiBJTlRFUiIgOiAiIiwKKyAgICAgICAgICAgIHMtPmZsYWdzICYgRkxBR19TUFJJVEUgPyAiIFNQUklURSIgOiAiIiwKKyAgICAgICAgICAgIHMtPmZsYWdzICYgRkxBR19JTlRFUlBPTEFURUQgPyAiIElOVEVSUE9MIiA6ICIiKTsKKworICAgIHJldHVybiBoZWFkZXIuaGVhZGVyX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB0cnVlbW90aW9uMV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVHJ1ZU1vdGlvbjFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICAvLyBGSVhNRTogaXQgbWF5IGNoYW5nZSA/CisvLyAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX3NhbXBsZSA9PSAyNCkKKy8vICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisvLyAgICBlbHNlCisvLyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU1NTsKKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogdGhlcmUgaXMgYSB2ZXJ0aWNhbCBwcmVkaWN0b3IgZm9yIGVhY2ggcGl4ZWwgaW4gYSBsaW5lOyBlYWNoIHZlcnRpY2FsCisgICAgICogcHJlZGljdG9yIGlzIDAgdG8gc3RhcnQgd2l0aCAqLworICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT52ZXJ0X3ByZWQsICZzLT52ZXJ0X3ByZWRfc2l6ZSwgcy0+YXZjdHgtPndpZHRoICogc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICAgIGlmICghcy0+dmVydF9wcmVkKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCitCbG9jayBkZWNvZGluZyBvcmRlcjoKKworZHhpOiBZLVkKK2R4aWM6IFktQy1ZCitkeGljMjogWS1DLVktQworCitocmVzLHZyZXMsaSxpJXZyZXMgKDAgPCBpIDwgNCkKKzJ4MiAwOiAwIGR4aWMyCisyeDIgMTogMSBkeGkKKzJ4MiAyOiAwIGR4aWMyCisyeDIgMzogMSBkeGkKKzJ4NCAwOiAwIGR4aWMyCisyeDQgMTogMSBkeGkKKzJ4NCAyOiAyIGR4aQorMng0IDM6IDMgZHhpCis0eDIgMDogMCBkeGljCis0eDIgMTogMSBkeGkKKzR4MiAyOiAwIGR4aWMKKzR4MiAzOiAxIGR4aQorNHg0IDA6IDAgZHhpYworNHg0IDE6IDEgZHhpCis0eDQgMjogMiBkeGkKKzR4NCAzOiAzIGR4aQorKi8KKworI2RlZmluZSBHRVRfTkVYVF9JTkRFWCgpIFwKK3tcCisgICAgaWYgKGluZGV4X3N0cmVhbV9pbmRleCA+PSBzLT5pbmRleF9zdHJlYW1fc2l6ZSkgeyBcCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICIgaGVscCEgdHJ1ZW1vdGlvbjEgZGVjb2RlciB3ZW50IG91dCBvZiBib3VuZHNcbiIpOyBcCisgICAgICAgIHJldHVybjsgXAorICAgIH0gXAorICAgIGluZGV4ID0gcy0+aW5kZXhfc3RyZWFtW2luZGV4X3N0cmVhbV9pbmRleCsrXSAqIDQ7IFwKK30KKworI2RlZmluZSBJTkNfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoaW5kZXggPj0gMTAyMykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgaW5kZXggdmFsdWUuXG4iKTsgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluZGV4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFQUExZX0NfUFJFRElDVE9SKCkgXAorICAgIHByZWRpY3Rvcl9wYWlyID0gcy0+Y19wcmVkaWN0b3JfdGFibGVbaW5kZXhdOyBcCisgICAgaG9yaXpfcHJlZCArPSAocHJlZGljdG9yX3BhaXIgPj4gMSk7IFwKKyAgICBpZiAocHJlZGljdG9yX3BhaXIgJiAxKSB7IFwKKyAgICAgICAgR0VUX05FWFRfSU5ERVgoKSBcCisgICAgICAgIGlmICghaW5kZXgpIHsgXAorICAgICAgICAgICAgR0VUX05FWFRfSU5ERVgoKSBcCisgICAgICAgICAgICBwcmVkaWN0b3JfcGFpciA9IHMtPmNfcHJlZGljdG9yX3RhYmxlW2luZGV4XTsgXAorICAgICAgICAgICAgaG9yaXpfcHJlZCArPSAoKHByZWRpY3Rvcl9wYWlyID4+IDEpICogNSk7IFwKKyAgICAgICAgICAgIGlmIChwcmVkaWN0b3JfcGFpciAmIDEpIFwKKyAgICAgICAgICAgICAgICBHRVRfTkVYVF9JTkRFWCgpIFwKKyAgICAgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgICAgIElOQ19JTkRFWDsgXAorICAgICAgICB9IFwKKyAgICB9IGVsc2UgXAorICAgICAgICBJTkNfSU5ERVg7CisKKyNkZWZpbmUgQVBQTFlfQ19QUkVESUNUT1JfMjQoKSBcCisgICAgcHJlZGljdG9yX3BhaXIgPSBzLT5jX3ByZWRpY3Rvcl90YWJsZVtpbmRleF07IFwKKyAgICBob3Jpel9wcmVkICs9IChwcmVkaWN0b3JfcGFpciA+PiAxKTsgXAorICAgIGlmIChwcmVkaWN0b3JfcGFpciAmIDEpIHsgXAorICAgICAgICBHRVRfTkVYVF9JTkRFWCgpIFwKKyAgICAgICAgaWYgKCFpbmRleCkgeyBcCisgICAgICAgICAgICBHRVRfTkVYVF9JTkRFWCgpIFwKKyAgICAgICAgICAgIHByZWRpY3Rvcl9wYWlyID0gcy0+ZmF0X2NfcHJlZGljdG9yX3RhYmxlW2luZGV4XTsgXAorICAgICAgICAgICAgaG9yaXpfcHJlZCArPSAocHJlZGljdG9yX3BhaXIgPj4gMSk7IFwKKyAgICAgICAgICAgIGlmIChwcmVkaWN0b3JfcGFpciAmIDEpIFwKKyAgICAgICAgICAgICAgICBHRVRfTkVYVF9JTkRFWCgpIFwKKyAgICAgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgICAgIElOQ19JTkRFWDsgXAorICAgICAgICB9IFwKKyAgICB9IGVsc2UgXAorICAgICAgICBJTkNfSU5ERVg7CisKKworI2RlZmluZSBBUFBMWV9ZX1BSRURJQ1RPUigpIFwKKyAgICBwcmVkaWN0b3JfcGFpciA9IHMtPnlfcHJlZGljdG9yX3RhYmxlW2luZGV4XTsgXAorICAgIGhvcml6X3ByZWQgKz0gKHByZWRpY3Rvcl9wYWlyID4+IDEpOyBcCisgICAgaWYgKHByZWRpY3Rvcl9wYWlyICYgMSkgeyBcCisgICAgICAgIEdFVF9ORVhUX0lOREVYKCkgXAorICAgICAgICBpZiAoIWluZGV4KSB7IFwKKyAgICAgICAgICAgIEdFVF9ORVhUX0lOREVYKCkgXAorICAgICAgICAgICAgcHJlZGljdG9yX3BhaXIgPSBzLT55X3ByZWRpY3Rvcl90YWJsZVtpbmRleF07IFwKKyAgICAgICAgICAgIGhvcml6X3ByZWQgKz0gKChwcmVkaWN0b3JfcGFpciA+PiAxKSAqIDUpOyBcCisgICAgICAgICAgICBpZiAocHJlZGljdG9yX3BhaXIgJiAxKSBcCisgICAgICAgICAgICAgICAgR0VUX05FWFRfSU5ERVgoKSBcCisgICAgICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgICAgICBJTkNfSU5ERVg7IFwKKyAgICAgICAgfSBcCisgICAgfSBlbHNlIFwKKyAgICAgICAgSU5DX0lOREVYOworCisjZGVmaW5lIEFQUExZX1lfUFJFRElDVE9SXzI0KCkgXAorICAgIHByZWRpY3Rvcl9wYWlyID0gcy0+eV9wcmVkaWN0b3JfdGFibGVbaW5kZXhdOyBcCisgICAgaG9yaXpfcHJlZCArPSAocHJlZGljdG9yX3BhaXIgPj4gMSk7IFwKKyAgICBpZiAocHJlZGljdG9yX3BhaXIgJiAxKSB7IFwKKyAgICAgICAgR0VUX05FWFRfSU5ERVgoKSBcCisgICAgICAgIGlmICghaW5kZXgpIHsgXAorICAgICAgICAgICAgR0VUX05FWFRfSU5ERVgoKSBcCisgICAgICAgICAgICBwcmVkaWN0b3JfcGFpciA9IHMtPmZhdF95X3ByZWRpY3Rvcl90YWJsZVtpbmRleF07IFwKKyAgICAgICAgICAgIGhvcml6X3ByZWQgKz0gKHByZWRpY3Rvcl9wYWlyID4+IDEpOyBcCisgICAgICAgICAgICBpZiAocHJlZGljdG9yX3BhaXIgJiAxKSBcCisgICAgICAgICAgICAgICAgR0VUX05FWFRfSU5ERVgoKSBcCisgICAgICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgICAgICBJTkNfSU5ERVg7IFwKKyAgICAgICAgfSBcCisgICAgfSBlbHNlIFwKKyAgICAgICAgSU5DX0lOREVYOworCisjZGVmaW5lIE9VVFBVVF9QSVhFTF9QQUlSKCkgXAorICAgICpjdXJyZW50X3BpeGVsX3BhaXIgPSAqdmVydF9wcmVkICsgaG9yaXpfcHJlZDsgXAorICAgICp2ZXJ0X3ByZWQrKyA9ICpjdXJyZW50X3BpeGVsX3BhaXIrKzsKKworc3RhdGljIHZvaWQgdHJ1ZW1vdGlvbjFfZGVjb2RlXzE2Yml0KFRydWVNb3Rpb24xQ29udGV4dCAqcykKK3sKKyAgICBpbnQgeTsKKyAgICBpbnQgcGl4ZWxzX2xlZnQ7ICAvKiByZW1haW5pbmcgcGl4ZWxzIG9uIHRoaXMgbGluZSAqLworICAgIHVuc2lnbmVkIGludCBwcmVkaWN0b3JfcGFpcjsKKyAgICB1bnNpZ25lZCBpbnQgaG9yaXpfcHJlZDsKKyAgICB1bnNpZ25lZCBpbnQgKnZlcnRfcHJlZDsKKyAgICB1bnNpZ25lZCBpbnQgKmN1cnJlbnRfcGl4ZWxfcGFpcjsKKyAgICB1bnNpZ25lZCBjaGFyICpjdXJyZW50X2xpbmUgPSBzLT5mcmFtZS0+ZGF0YVswXTsKKyAgICBpbnQga2V5ZnJhbWUgPSBzLT5mbGFncyAmIEZMQUdfS0VZRlJBTUU7CisKKyAgICAvKiB0aGVzZSB2YXJpYWJsZXMgYXJlIGZvciBtYW5hZ2luZyB0aGUgc3RyZWFtIG9mIG1hY3JvYmxvY2sgY2hhbmdlIGJpdHMgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICptYl9jaGFuZ2VfYml0cyA9IHMtPm1iX2NoYW5nZV9iaXRzOworICAgIHVuc2lnbmVkIGNoYXIgbWJfY2hhbmdlX2J5dGU7CisgICAgdW5zaWduZWQgY2hhciBtYl9jaGFuZ2VfYnl0ZV9tYXNrOworICAgIGludCBtYl9jaGFuZ2VfaW5kZXg7CisKKyAgICAvKiB0aGVzZSB2YXJpYWJsZXMgYXJlIGZvciBtYW5hZ2luZyB0aGUgbWFpbiBpbmRleCBzdHJlYW0gKi8KKyAgICBpbnQgaW5kZXhfc3RyZWFtX2luZGV4ID0gMDsgIC8qIHllcywgdGhlIGluZGV4IGludG8gdGhlIGluZGV4IHN0cmVhbSAqLworICAgIGludCBpbmRleDsKKworICAgIC8qIGNsZWFuIG91dCB0aGUgbGluZSBidWZmZXIgKi8KKyAgICBtZW1zZXQocy0+dmVydF9wcmVkLCAwLCBzLT5hdmN0eC0+d2lkdGggKiBzaXplb2YodW5zaWduZWQgaW50KSk7CisKKyAgICBHRVRfTkVYVF9JTkRFWCgpOworCisgICAgZm9yICh5ID0gMDsgeSA8IHMtPmF2Y3R4LT5oZWlnaHQ7IHkrKykgeworCisgICAgICAgIC8qIHJlLWluaXQgdmFyaWFibGVzIGZvciB0aGUgbmV4dCBsaW5lIGl0ZXJhdGlvbiAqLworICAgICAgICBob3Jpel9wcmVkID0gMDsKKyAgICAgICAgY3VycmVudF9waXhlbF9wYWlyID0gKHVuc2lnbmVkIGludCAqKWN1cnJlbnRfbGluZTsKKyAgICAgICAgdmVydF9wcmVkID0gcy0+dmVydF9wcmVkOworICAgICAgICBtYl9jaGFuZ2VfaW5kZXggPSAwOworICAgICAgICBtYl9jaGFuZ2VfYnl0ZSA9IG1iX2NoYW5nZV9iaXRzW21iX2NoYW5nZV9pbmRleCsrXTsKKyAgICAgICAgbWJfY2hhbmdlX2J5dGVfbWFzayA9IDB4MDE7CisgICAgICAgIHBpeGVsc19sZWZ0ID0gcy0+YXZjdHgtPndpZHRoOworCisgICAgICAgIHdoaWxlIChwaXhlbHNfbGVmdCA+IDApIHsKKworICAgICAgICAgICAgaWYgKGtleWZyYW1lIHx8ICgobWJfY2hhbmdlX2J5dGUgJiBtYl9jaGFuZ2VfYnl0ZV9tYXNrKSA9PSAwKSkgeworCisgICAgICAgICAgICAgICAgc3dpdGNoICh5ICYgMykgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgLyogaWYgbWFjcm9ibG9jayB3aWR0aCBpcyAyLCBhcHBseSBDLVktQy1ZOyBlbHNlCisgICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IEMtWS1ZICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5ibG9ja193aWR0aCA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9DX1BSRURJQ1RPUigpOworICAgICAgICAgICAgICAgICAgICAgICAgQVBQTFlfWV9QUkVESUNUT1IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QSVhFTF9QQUlSKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9DX1BSRURJQ1RPUigpOworICAgICAgICAgICAgICAgICAgICAgICAgQVBQTFlfWV9QUkVESUNUT1IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QSVhFTF9QQUlSKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9DX1BSRURJQ1RPUigpOworICAgICAgICAgICAgICAgICAgICAgICAgQVBQTFlfWV9QUkVESUNUT1IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QSVhFTF9QQUlSKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9ZX1BSRURJQ1RPUigpOworICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1BJWEVMX1BBSVIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIC8qIGFsd2F5cyBhcHBseSAyIFkgcHJlZGljdG9ycyBvbiB0aGVzZSBpdGVyYXRpb25zICovCisgICAgICAgICAgICAgICAgICAgIEFQUExZX1lfUFJFRElDVE9SKCk7CisgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QSVhFTF9QQUlSKCk7CisgICAgICAgICAgICAgICAgICAgIEFQUExZX1lfUFJFRElDVE9SKCk7CisgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QSVhFTF9QQUlSKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGl0ZXJhdGlvbiBtaWdodCBiZSBDLVktQy1ZLCBZLVksIG9yIEMtWS1ZCisgICAgICAgICAgICAgICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgbWFjcm9ibG9jayB0eXBlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5ibG9ja190eXBlID09IEJMT0NLXzJ4MikgeworICAgICAgICAgICAgICAgICAgICAgICAgQVBQTFlfQ19QUkVESUNUT1IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX1lfUFJFRElDVE9SKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBPVVRQVVRfUElYRUxfUEFJUigpOworICAgICAgICAgICAgICAgICAgICAgICAgQVBQTFlfQ19QUkVESUNUT1IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX1lfUFJFRElDVE9SKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBPVVRQVVRfUElYRUxfUEFJUigpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmJsb2NrX3R5cGUgPT0gQkxPQ0tfNHgyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9DX1BSRURJQ1RPUigpOworICAgICAgICAgICAgICAgICAgICAgICAgQVBQTFlfWV9QUkVESUNUT1IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QSVhFTF9QQUlSKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9ZX1BSRURJQ1RPUigpOworICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1BJWEVMX1BBSVIoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX1lfUFJFRElDVE9SKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBPVVRQVVRfUElYRUxfUEFJUigpOworICAgICAgICAgICAgICAgICAgICAgICAgQVBQTFlfWV9QUkVESUNUT1IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QSVhFTF9QQUlSKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgLyogc2tpcCAoY29weSkgZm91ciBwaXhlbHMsIGJ1dCByZWFzc2lnbiB0aGUgaG9yaXpvbnRhbAorICAgICAgICAgICAgICAgICAqIHByZWRpY3RvciAqLworICAgICAgICAgICAgICAgICp2ZXJ0X3ByZWQrKyA9ICpjdXJyZW50X3BpeGVsX3BhaXIrKzsKKyAgICAgICAgICAgICAgICBob3Jpel9wcmVkID0gKmN1cnJlbnRfcGl4ZWxfcGFpciAtICp2ZXJ0X3ByZWQ7CisgICAgICAgICAgICAgICAgKnZlcnRfcHJlZCsrID0gKmN1cnJlbnRfcGl4ZWxfcGFpcisrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgha2V5ZnJhbWUpIHsKKyAgICAgICAgICAgICAgICBtYl9jaGFuZ2VfYnl0ZV9tYXNrIDw8PSAxOworCisgICAgICAgICAgICAgICAgLyogbmV4dCBieXRlICovCisgICAgICAgICAgICAgICAgaWYgKCFtYl9jaGFuZ2VfYnl0ZV9tYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIG1iX2NoYW5nZV9ieXRlID0gbWJfY2hhbmdlX2JpdHNbbWJfY2hhbmdlX2luZGV4KytdOworICAgICAgICAgICAgICAgICAgICBtYl9jaGFuZ2VfYnl0ZV9tYXNrID0gMHgwMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBpeGVsc19sZWZ0IC09IDQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBuZXh0IGNoYW5nZSByb3cgKi8KKyAgICAgICAgaWYgKCgoeSArIDEpICYgMykgPT0gMCkKKyAgICAgICAgICAgIG1iX2NoYW5nZV9iaXRzICs9IHMtPm1iX2NoYW5nZV9iaXRzX3Jvd19zaXplOworCisgICAgICAgIGN1cnJlbnRfbGluZSArPSBzLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0cnVlbW90aW9uMV9kZWNvZGVfMjRiaXQoVHJ1ZU1vdGlvbjFDb250ZXh0ICpzKQoreworICAgIGludCB5OworICAgIGludCBwaXhlbHNfbGVmdDsgIC8qIHJlbWFpbmluZyBwaXhlbHMgb24gdGhpcyBsaW5lICovCisgICAgdW5zaWduZWQgaW50IHByZWRpY3Rvcl9wYWlyOworICAgIHVuc2lnbmVkIGludCBob3Jpel9wcmVkOworICAgIHVuc2lnbmVkIGludCAqdmVydF9wcmVkOworICAgIHVuc2lnbmVkIGludCAqY3VycmVudF9waXhlbF9wYWlyOworICAgIHVuc2lnbmVkIGNoYXIgKmN1cnJlbnRfbGluZSA9IHMtPmZyYW1lLT5kYXRhWzBdOworICAgIGludCBrZXlmcmFtZSA9IHMtPmZsYWdzICYgRkxBR19LRVlGUkFNRTsKKworICAgIC8qIHRoZXNlIHZhcmlhYmxlcyBhcmUgZm9yIG1hbmFnaW5nIHRoZSBzdHJlYW0gb2YgbWFjcm9ibG9jayBjaGFuZ2UgYml0cyAqLworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1iX2NoYW5nZV9iaXRzID0gcy0+bWJfY2hhbmdlX2JpdHM7CisgICAgdW5zaWduZWQgY2hhciBtYl9jaGFuZ2VfYnl0ZTsKKyAgICB1bnNpZ25lZCBjaGFyIG1iX2NoYW5nZV9ieXRlX21hc2s7CisgICAgaW50IG1iX2NoYW5nZV9pbmRleDsKKworICAgIC8qIHRoZXNlIHZhcmlhYmxlcyBhcmUgZm9yIG1hbmFnaW5nIHRoZSBtYWluIGluZGV4IHN0cmVhbSAqLworICAgIGludCBpbmRleF9zdHJlYW1faW5kZXggPSAwOyAgLyogeWVzLCB0aGUgaW5kZXggaW50byB0aGUgaW5kZXggc3RyZWFtICovCisgICAgaW50IGluZGV4OworCisgICAgLyogY2xlYW4gb3V0IHRoZSBsaW5lIGJ1ZmZlciAqLworICAgIG1lbXNldChzLT52ZXJ0X3ByZWQsIDAsIHMtPmF2Y3R4LT53aWR0aCAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKworICAgIEdFVF9ORVhUX0lOREVYKCk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgcy0+YXZjdHgtPmhlaWdodDsgeSsrKSB7CisKKyAgICAgICAgLyogcmUtaW5pdCB2YXJpYWJsZXMgZm9yIHRoZSBuZXh0IGxpbmUgaXRlcmF0aW9uICovCisgICAgICAgIGhvcml6X3ByZWQgPSAwOworICAgICAgICBjdXJyZW50X3BpeGVsX3BhaXIgPSAodW5zaWduZWQgaW50ICopY3VycmVudF9saW5lOworICAgICAgICB2ZXJ0X3ByZWQgPSBzLT52ZXJ0X3ByZWQ7CisgICAgICAgIG1iX2NoYW5nZV9pbmRleCA9IDA7CisgICAgICAgIG1iX2NoYW5nZV9ieXRlID0gbWJfY2hhbmdlX2JpdHNbbWJfY2hhbmdlX2luZGV4KytdOworICAgICAgICBtYl9jaGFuZ2VfYnl0ZV9tYXNrID0gMHgwMTsKKyAgICAgICAgcGl4ZWxzX2xlZnQgPSBzLT5hdmN0eC0+d2lkdGg7CisKKyAgICAgICAgd2hpbGUgKHBpeGVsc19sZWZ0ID4gMCkgeworCisgICAgICAgICAgICBpZiAoa2V5ZnJhbWUgfHwgKChtYl9jaGFuZ2VfYnl0ZSAmIG1iX2NoYW5nZV9ieXRlX21hc2spID09IDApKSB7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHkgJiAzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAvKiBpZiBtYWNyb2Jsb2NrIHdpZHRoIGlzIDIsIGFwcGx5IEMtWS1DLVk7IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICogYXBwbHkgQy1ZLVkgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmJsb2NrX3dpZHRoID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX0NfUFJFRElDVE9SXzI0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9ZX1BSRURJQ1RPUl8yNCgpOworICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1BJWEVMX1BBSVIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX0NfUFJFRElDVE9SXzI0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9ZX1BSRURJQ1RPUl8yNCgpOworICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1BJWEVMX1BBSVIoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX0NfUFJFRElDVE9SXzI0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9ZX1BSRURJQ1RPUl8yNCgpOworICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1BJWEVMX1BBSVIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX1lfUFJFRElDVE9SXzI0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBPVVRQVVRfUElYRUxfUEFJUigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgLyogYWx3YXlzIGFwcGx5IDIgWSBwcmVkaWN0b3JzIG9uIHRoZXNlIGl0ZXJhdGlvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVBQTFlfWV9QUkVESUNUT1JfMjQoKTsKKyAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1BJWEVMX1BBSVIoKTsKKyAgICAgICAgICAgICAgICAgICAgQVBQTFlfWV9QUkVESUNUT1JfMjQoKTsKKyAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1BJWEVMX1BBSVIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgaXRlcmF0aW9uIG1pZ2h0IGJlIEMtWS1DLVksIFktWSwgb3IgQy1ZLVkKKyAgICAgICAgICAgICAgICAgICAgICogZGVwZW5kaW5nIG9uIHRoZSBtYWNyb2Jsb2NrIHR5cGUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmJsb2NrX3R5cGUgPT0gQkxPQ0tfMngyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9DX1BSRURJQ1RPUl8yNCgpOworICAgICAgICAgICAgICAgICAgICAgICAgQVBQTFlfWV9QUkVESUNUT1JfMjQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QSVhFTF9QQUlSKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9DX1BSRURJQ1RPUl8yNCgpOworICAgICAgICAgICAgICAgICAgICAgICAgQVBQTFlfWV9QUkVESUNUT1JfMjQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QSVhFTF9QQUlSKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+YmxvY2tfdHlwZSA9PSBCTE9DS180eDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX0NfUFJFRElDVE9SXzI0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9ZX1BSRURJQ1RPUl8yNCgpOworICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1BJWEVMX1BBSVIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQUExZX1lfUFJFRElDVE9SXzI0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBPVVRQVVRfUElYRUxfUEFJUigpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQVBQTFlfWV9QUkVESUNUT1JfMjQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QSVhFTF9QQUlSKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBUFBMWV9ZX1BSRURJQ1RPUl8yNCgpOworICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1BJWEVMX1BBSVIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIChjb3B5KSBmb3VyIHBpeGVscywgYnV0IHJlYXNzaWduIHRoZSBob3Jpem9udGFsCisgICAgICAgICAgICAgICAgICogcHJlZGljdG9yICovCisgICAgICAgICAgICAgICAgKnZlcnRfcHJlZCsrID0gKmN1cnJlbnRfcGl4ZWxfcGFpcisrOworICAgICAgICAgICAgICAgIGhvcml6X3ByZWQgPSAqY3VycmVudF9waXhlbF9wYWlyIC0gKnZlcnRfcHJlZDsKKyAgICAgICAgICAgICAgICAqdmVydF9wcmVkKysgPSAqY3VycmVudF9waXhlbF9wYWlyKys7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFrZXlmcmFtZSkgeworICAgICAgICAgICAgICAgIG1iX2NoYW5nZV9ieXRlX21hc2sgPDw9IDE7CisKKyAgICAgICAgICAgICAgICAvKiBuZXh0IGJ5dGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIW1iX2NoYW5nZV9ieXRlX21hc2spIHsKKyAgICAgICAgICAgICAgICAgICAgbWJfY2hhbmdlX2J5dGUgPSBtYl9jaGFuZ2VfYml0c1ttYl9jaGFuZ2VfaW5kZXgrK107CisgICAgICAgICAgICAgICAgICAgIG1iX2NoYW5nZV9ieXRlX21hc2sgPSAweDAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGl4ZWxzX2xlZnQgLT0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5leHQgY2hhbmdlIHJvdyAqLworICAgICAgICBpZiAoKCh5ICsgMSkgJiAzKSA9PSAwKQorICAgICAgICAgICAgbWJfY2hhbmdlX2JpdHMgKz0gcy0+bWJfY2hhbmdlX2JpdHNfcm93X3NpemU7CisKKyAgICAgICAgY3VycmVudF9saW5lICs9IHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB9Cit9CisKKworc3RhdGljIGludCB0cnVlbW90aW9uMV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IHJldCwgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBUcnVlTW90aW9uMUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YnVmID0gYnVmOworICAgIHMtPnNpemUgPSBidWZfc2l6ZTsKKworICAgIGlmICgocmV0ID0gdHJ1ZW1vdGlvbjFfZGVjb2RlX2hlYWRlcihzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGNvbXByZXNzaW9uX3R5cGVzW3MtPmNvbXByZXNzaW9uXS5hbGdvcml0aG0gPT0gQUxHT19SR0IyNEgpIHsKKyAgICAgICAgdHJ1ZW1vdGlvbjFfZGVjb2RlXzI0Yml0KHMpOworICAgIH0gZWxzZSBpZiAoY29tcHJlc3Npb25fdHlwZXNbcy0+Y29tcHJlc3Npb25dLmFsZ29yaXRobSAhPSBBTEdPX05PUCkgeworICAgICAgICB0cnVlbW90aW9uMV9kZWNvZGVfMTZiaXQocyk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqZ290X2ZyYW1lICAgICAgPSAxOworCisgICAgLyogcmVwb3J0IHRoYXQgdGhlIGJ1ZmZlciB3YXMgY29tcGxldGVseSBjb25zdW1lZCAqLworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHRydWVtb3Rpb24xX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRydWVNb3Rpb24xQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZSk7CisgICAgYXZfZnJlZXAoJnMtPnZlcnRfcHJlZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl90cnVlbW90aW9uMV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ0cnVlbW90aW9uMSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkR1Y2sgVHJ1ZU1vdGlvbiAxLjAiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVFJVRU1PVElPTjEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFRydWVNb3Rpb24xQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdHJ1ZW1vdGlvbjFfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gdHJ1ZW1vdGlvbjFfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSB0cnVlbW90aW9uMV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90cnVlbW90aW9uMWRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3RydWVtb3Rpb24xZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNTgxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy90cnVlbW90aW9uMWRhdGEuaApAQCAtMCwwICsxLDgzMiBAQAorLyoKKyAqIER1Y2sgVHJ1ZW1vdGlvbiB2MSBEZWNvZGluZyBUYWJsZXMKKyAqCisgKiBEYXRhIGluIHRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBwYXJ0IG9mIFZwVmlzaW9uIGZyb20gT24yIHdoaWNoIGlzCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdQTC4gSXQgaXMgcmVkaXN0cmlidXRlZCB3aXRoIGxpYmF2Y29kZWMgdW5kZXIKKyAqIHRoZSBHTlUgTEdQTCB1c2luZyB0aGUgY29tbW9uIHVuZGVyc3RhbmRpbmcgdGhhdCBkYXRhIHRhYmxlcyBuZWNlc3NhcnkKKyAqIGZvciBkZWNvZGluZyBhbGdvcml0aG1zIGFyZSBub3QgbmVjZXNzYXJpbHkgY29weXJpZ2h0YWJsZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpZm5kZWYgQVZDT0RFQ19UUlVFTU9USU9OMURBVEFfSAorI2RlZmluZSBBVkNPREVDX1RSVUVNT1RJT04xREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogWSBkZWx0YSB0YWJsZXMsIHNraW5ueSBhbmQgZmF0ICovCitzdGF0aWMgY29uc3QgaW50MTZfdCB5ZHQxWzhdID0geyAwLCAtMiwgMiwgLTYsIDYsIC0xMiwgMTIsIC0xMiB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgeWR0Mls4XSA9IHsgMCwgLTIsIDQsIC02LCA4LCAtMTIsIDEyLCAtMTIgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IHlkdDNbOF0gPSB7IDQsIC02LCAyMCwgLTIwLCA0NiwgLTQ2LCA5NCwgLTk0IH07CitzdGF0aWMgY29uc3QgaW50MTZfdCBmYXRfeWR0M1s4XSA9IHsgMCwgLTE1LCA1MCwgLTUwLCAxMTUsIC0xMTUsIDIzNSwgLTIzNSB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgeWR0NFs4XSA9IHsgMCwgLTQsIDQsIC0xNiwgMTYsIC0zNiwgMzYsIC04MCB9OworLyogTk9URTogVGhpcyB0YWJsZSBicmVha3MgdGhlIFsrLC1dIHBhdHRlcm4gdGhhdCB0aGUgcmVzdCBvZiB0aGUKKyAqIHRhYmxlcyBtYWludGFpbi4gSXMgdGhpcyBpbnRlbnRpb25hbD8gKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IGZhdF95ZHQ0WzhdID0geyAwLCA0MCwgODAsIC03NiwgMTYwLCAtMTU0LCAyMzYsIC0yMzYgfTsKKworLyogQyBkZWx0YSB0YWJsZXMsIHNraW5ueSBhbmQgZmF0ICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBjZHQxWzhdID0geyAwLCAtMSwgMSwgLTIsIDMsIC00LCA1LCAtNCB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgY2R0Mls4XSA9IHsgMCwgLTQsIDMsIC0xNiwgMjAsIC0zMiwgMzYsIC0zMiB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgZmF0X2NkdDJbOF0gPSB7IDAsIC0yMCwgMTUsIC04MCwgMTAwLCAtMTYwLCAxODAsIC0xNjAgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNkdDNbOF0gPSB7IDAsIC0yLCAyLCAtOCwgOCwgLTE4LCAxOCwgLTQwIH07CisKKy8qIGFsbCB0aGUgZGVsdGEgdGFibGVzIHRvIGNob29zZSBmcm9tLCBhdCBhbGwgNCBkZWx0YSBsZXZlbHMgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90ICogY29uc3QgeWR0c1tdID0geyB5ZHQxLCB5ZHQyLCB5ZHQzLCB5ZHQ0LCBOVUxMIH07CitzdGF0aWMgY29uc3QgaW50MTZfdCAqIGNvbnN0IGZhdF95ZHRzW10gPSB7IGZhdF95ZHQzLCBmYXRfeWR0MywgZmF0X3lkdDMsIGZhdF95ZHQ0LCBOVUxMIH07CitzdGF0aWMgY29uc3QgaW50MTZfdCAqIGNvbnN0IGNkdHNbXSA9IHsgY2R0MSwgY2R0MSwgY2R0MiwgY2R0MywgTlVMTCB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgKiBjb25zdCBmYXRfY2R0c1tdID0geyBmYXRfY2R0MiwgZmF0X2NkdDIsIGZhdF9jZHQyLCBmYXRfeWR0NCwgTlVMTCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBwY190YmwyW10gPSB7CisweDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4LDB4MTAsMHgwMCwweDAwLDB4MDAsCisweDgsMHgwMSwweDAwLDB4MDAsMHgwMCwKKzB4OCwweDAwLDB4MTAsMHgwMCwweDAwLAorMHg4LDB4MDAsMHgwMSwweDAwLDB4MDAsCisweDgsMHgwMCwweDAwLDB4MTAsMHgwMCwKKzB4OCwweDAwLDB4MDAsMHgwMSwweDAwLAorMHg4LDB4MDAsMHgwMCwweDAwLDB4MTAsCisweDgsMHgwMCwweDAwLDB4MDAsMHgwMSwKKzB4NiwweDAwLDB4MDAsMHgwMCwKKzB4NiwweDEwLDB4MDAsMHgwMCwKKzB4NiwweDAxLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MTAsMHgwMCwKKzB4NiwweDAwLDB4MDEsMHgwMCwKKzB4NiwweDAwLDB4MDAsMHgwMSwKKzB4NiwweDAwLDB4MDAsMHgxMCwKKzB4NiwweDAwLDB4MDAsMHgwMiwKKzB4NiwweDAwLDB4MDAsMHgyMCwKKzB4NiwweDIwLDB4MTAsMHgwMCwKKzB4NiwweDAwLDB4MDIsMHgwMSwKKzB4NiwweDAwLDB4MjAsMHgxMCwKKzB4NiwweDAyLDB4MDEsMHgwMCwKKzB4NiwweDExLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MjAsMHgwMCwKKzB4NiwweDAwLDB4MDIsMHgwMCwKKzB4NiwweDIwLDB4MDAsMHgwMCwKKzB4NiwweDAxLDB4MTAsMHgwMCwKKzB4NiwweDAyLDB4MDAsMHgwMCwKKzB4NiwweDAxLDB4MDAsMHgwMiwKKzB4NiwweDEwLDB4MDAsMHgyMCwKKzB4NiwweDAwLDB4MDEsMHgwMiwKKzB4NiwweDEwLDB4MDEsMHgwMCwKKzB4NiwweDAwLDB4MTAsMHgyMCwKKzB4NiwweDEwLDB4MTAsMHgwMCwKKzB4NiwweDEwLDB4MDAsMHgwMSwKKzB4NiwweDIwLDB4MDAsMHgxMCwKKzB4NiwweDAyLDB4MDAsMHgwMSwKKzB4NiwweDAxLDB4MDEsMHgwMCwKKzB4NiwweDAxLDB4MDAsMHgxMCwKKzB4NiwweDAwLDB4MTEsMHgwMCwKKzB4NiwweDEwLDB4MDAsMHgwMiwKKzB4NiwweDAwLDB4MDEsMHgxMCwKKzB4NiwweDAwLDB4MDAsMHgxMSwKKzB4NiwweDEwLDB4MDAsMHgxMCwKKzB4NiwweDAxLDB4MDAsMHgwMSwKKzB4NiwweDAwLDB4MDAsMHgyMiwKKzB4NiwweDAyLDB4MDEsMHgwMSwKKzB4NiwweDEwLDB4MjAsMHgxMCwKKzB4NiwweDAxLDB4MDIsMHgwMSwKKzB4NiwweDIwLDB4MTAsMHgxMCwKKzB4NiwweDAxLDB4MDAsMHgyMCwKKzB4NiwweDAwLDB4MTAsMHgwMSwKKzB4NiwweDIxLDB4MTAsMHgwMCwKKzB4NiwweDEwLDB4MDIsMHgwMSwKKzB4NiwweDEyLDB4MDEsMHgwMCwKKzB4NiwweDAxLDB4MjAsMHgxMCwKKzB4NiwweDAxLDB4MDIsMHgwMCwKKzB4NiwweDEwLDB4MjAsMHgwMCwKKzB4NiwweDAwLDB4MTAsMHgwMiwKKzB4NiwweDAwLDB4MDEsMHgyMCwKKzB4NiwweDAwLDB4MDIsMHgyMSwKKzB4NiwweDAwLDB4MDIsMHgyMCwKKzB4NiwweDAwLDB4MDAsMHgxMiwKKzB4NiwweDAwLDB4MDAsMHgyMSwKKzB4NiwweDIwLDB4MTEsMHgwMCwKKzB4NiwweDAwLDB4MDEsMHgwMSwKKzB4NiwweDExLDB4MTAsMHgwMCwKKzB4NiwweDAwLDB4MjAsMHgxMiwKKzB4NiwweDAwLDB4MjAsMHgxMSwKKzB4NiwweDIwLDB4MTAsMHgwMiwKKzB4NiwweDAyLDB4MDEsMHgyMCwKKzB4NiwweDAwLDB4MjIsMHgxMSwKKzB4NiwweDAwLDB4MTAsMHgxMCwKKzB4NiwweDAyLDB4MTEsMHgwMCwKKzB4NiwweDAwLDB4MjEsMHgxMCwKKzB4NiwweDAwLDB4MDIsMHgwMywKKzB4NiwweDIwLDB4MTAsMHgwMSwKKzB4NiwweDAwLDB4MTIsMHgwMSwKKzB4NCwweDExLDB4MDAsCisweDQsMHgwMCwweDIyLAorMHg0LDB4MjAsMHgwMCwKKzB4NCwweDAxLDB4MTAsCisweDQsMHgwMiwweDIwLAorMHg0LDB4MDAsMHgyMCwKKzB4NCwweDAyLDB4MDAsCisweDQsMHgxMCwweDAxLAorMHg0LDB4MDAsMHgxMSwKKzB4NCwweDAyLDB4MDEsCisweDQsMHgwMiwweDIxLAorMHg0LDB4MDAsMHgwMiwKKzB4NCwweDIwLDB4MDIsCisweDQsMHgwMSwweDAxLAorMHg0LDB4MTAsMHgxMCwKKzB4NCwweDEwLDB4MDIsCisweDQsMHgyMiwweDAwLAorMHg0LDB4MTAsMHgwMCwKKzB4NCwweDAxLDB4MDAsCisweDQsMHgyMSwweDAwLAorMHg0LDB4MTIsMHgwMCwKKzB4NCwweDAwLDB4MTAsCisweDQsMHgyMCwweDEyLAorMHg0LDB4MDEsMHgxMSwKKzB4NCwweDAwLDB4MDEsCisweDQsMHgwMSwweDAyLAorMHg0LDB4MTEsMHgwMiwKKzB4NCwweDExLDB4MDEsCisweDQsMHgxMCwweDIwLAorMHg0LDB4MjAsMHgwMSwKKzB4NCwweDIyLDB4MTEsCisweDQsMHgwMCwweDEyLAorMHg0LDB4MjAsMHgxMCwKKzB4NCwweDIyLDB4MDEsCisweDQsMHgwMSwweDIwLAorMHg0LDB4MDAsMHgyMSwKKzB4NCwweDEwLDB4MTEsCisweDQsMHgyMSwweDEwLAorMHg0LDB4MTAsMHgyMiwKKzB4NCwweDAyLDB4MDMsCisweDQsMHgxMiwweDAxLAorMHg0LDB4MjAsMHgxMSwKKzB4NCwweDExLDB4MTAsCisweDQsMHgyMCwweDMwLAorMHg0LDB4MTEsMHgyMCwKKzB4NCwweDAyLDB4MTAsCisweDQsMHgyMiwweDEwLAorMHg0LDB4MTEsMHgxMSwKKzB4NCwweDMwLDB4MjAsCisweDQsMHgzMCwweDAwLAorMHg0LDB4MDEsMHgyMiwKKzB4NCwweDAxLDB4MTIsCisweDQsMHgwMiwweDExLAorMHg0LDB4MDMsMHgwMiwKKzB4NCwweDAzLDB4MDAsCisweDQsMHgxMCwweDIxLAorMHg0LDB4MTIsMHgyMCwKKzB4NCwweDAwLDB4MDAsCisweDQsMHgxMiwweDIxLAorMHg0LDB4MjEsMHgxMSwKKzB4NCwweDAyLDB4MjIsCisweDQsMHgxMCwweDEyLAorMHg0LDB4MzEsMHgwMCwKKzB4NCwweDIwLDB4MjAsCisweDQsMHgwMCwweDAzLAorMHg0LDB4MDIsMHgwMiwKKzB4NCwweDIyLDB4MjAsCisweDQsMHgwMSwweDIxLAorMHg0LDB4MjEsMHgwMiwKKzB4NCwweDIxLDB4MTIsCisweDQsMHgxMSwweDIyLAorMHg0LDB4MDAsMHgzMCwKKzB4NCwweDEyLDB4MTEsCisweDQsMHgyMCwweDIyLAorMHg0LDB4MzEsMHgyMCwKKzB4NCwweDIxLDB4MzAsCisweDQsMHgyMiwweDAyLAorMHg0LDB4MjIsMHgyMiwKKzB4NCwweDIwLDB4MzEsCisweDQsMHgxMywweDAyLAorMHg0LDB4MDMsMHgxMCwKKzB4NCwweDExLDB4MTIsCisweDQsMHgwMCwweDEzLAorMHg0LDB4MjEsMHgwMSwKKzB4NCwweDEyLDB4MDMsCisweDQsMHgxMywweDAwLAorMHg0LDB4MTMsMHgxMCwKKzB4NCwweDAyLDB4MTMsCisweDQsMHgzMCwweDAxLAorMHg0LDB4MTIsMHgxMCwKKzB4NCwweDIyLDB4MTMsCisweDQsMHgwMywweDEyLAorMHg0LDB4MzEsMHgwMSwKKzB4NCwweDMwLDB4MjIsCisweDQsMHgwMCwweDMxLAorMHg0LDB4MDEsMHgzMSwKKzB4NCwweDAyLDB4MjMsCisweDQsMHgwMSwweDMwLAorMHg0LDB4MTEsMHgyMSwKKzB4NCwweDIyLDB4MjEsCisweDQsMHgwMSwweDEzLAorMHg0LDB4MTAsMHgwMywKKzB4NCwweDIyLDB4MDMsCisweDQsMHgzMCwweDIxLAorMHg0LDB4MjEsMHgzMSwKKzB4NCwweDMzLDB4MDAsCisweDQsMHgxMywweDEyLAorMHg0LDB4MTEsMHgzMSwKKzB4NCwweDMwLDB4MDIsCisweDQsMHgxMiwweDAyLAorMHg0LDB4MTEsMHgxMywKKzB4NCwweDEyLDB4MjIsCisweDQsMHgyMCwweDMyLAorMHg0LDB4MTAsMHgxMywKKzB4NCwweDIyLDB4MzEsCisweDQsMHgyMSwweDIwLAorMHg0LDB4MDEsMHgzMywKKzB4NCwweDMzLDB4MTAsCisweDQsMHgyMCwweDEzLAorMHg0LDB4MzEsMHgyMiwKKzB4NCwweDEzLDB4MzAsCisweDQsMHgwMSwweDAzLAorMHg0LDB4MTEsMHgzMywKKzB4NCwweDIwLDB4MjEsCisweDQsMHgxMywweDMxLAorMHg0LDB4MDMsMHgyMiwKKzB4NCwweDMxLDB4MDIsCisweDQsMHgwMCwweDI0LAorMHgyLDB4MDAsCisweDIsMHgxMCwKKzB4MiwweDIwLAorMHgyLDB4MzAsCisweDIsMHg0MCwKKzB4MiwweDUwLAorMHgyLDB4NjAsCisweDIsMHgwMSwKKzB4MiwweDExLAorMHgyLDB4MjEsCisweDIsMHgzMSwKKzB4MiwweDQxLAorMHgyLDB4NTEsCisweDIsMHg2MSwKKzB4MiwweDAyLAorMHgyLDB4MTIsCisweDIsMHgyMiwKKzB4MiwweDMyLAorMHgyLDB4NDIsCisweDIsMHg1MiwKKzB4MiwweDYyLAorMHgyLDB4MDMsCisweDIsMHgxMywKKzB4MiwweDIzLAorMHgyLDB4MzMsCisweDIsMHg0MywKKzB4MiwweDUzLAorMHgyLDB4NjMsCisweDIsMHgwNCwKKzB4MiwweDE0LAorMHgyLDB4MjQsCisweDIsMHgzNCwKKzB4MiwweDQ0LAorMHgyLDB4NTQsCisweDIsMHg2NCwKKzB4MiwweDA1LAorMHgyLDB4MTUsCisweDIsMHgyNSwKKzB4MiwweDM1LAorMHgyLDB4NDUsCisweDIsMHg1NSwKKzB4MiwweDY1LAorMHgyLDB4MDYsCisweDIsMHgxNiwKKzB4MiwweDI2LAorMHgyLDB4MzYsCisweDIsMHg0NiwKKzB4MiwweDU2LAorMHgyLDB4NjYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHBjX3RibDNbXSA9IHsKKzB4NiwweDAwLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MDAsMHgwMSwKKzB4NiwweDAwLDB4MDAsMHgxMCwKKzB4NiwweDAwLDB4MDAsMHgxMSwKKzB4NiwweDAwLDB4MDEsMHgwMCwKKzB4NiwweDAwLDB4MDEsMHgwMSwKKzB4NiwweDAwLDB4MDEsMHgxMCwKKzB4NiwweDAwLDB4MDEsMHgxMSwKKzB4NiwweDAwLDB4MTAsMHgwMCwKKzB4NiwweDAwLDB4MTAsMHgwMSwKKzB4NiwweDAwLDB4MTAsMHgxMCwKKzB4NiwweDAwLDB4MTAsMHgxMSwKKzB4NiwweDAwLDB4MTEsMHgwMCwKKzB4NiwweDAwLDB4MTEsMHgwMSwKKzB4NiwweDAwLDB4MTEsMHgxMCwKKzB4NiwweDAwLDB4MTEsMHgxMSwKKzB4NiwweDAxLDB4MDAsMHgwMCwKKzB4NiwweDAxLDB4MDAsMHgwMSwKKzB4NiwweDAxLDB4MDAsMHgxMCwKKzB4NiwweDAxLDB4MDAsMHgxMSwKKzB4NiwweDAxLDB4MDEsMHgwMCwKKzB4NiwweDAxLDB4MDEsMHgwMSwKKzB4NiwweDAxLDB4MDEsMHgxMCwKKzB4NiwweDAxLDB4MDEsMHgxMSwKKzB4NiwweDAxLDB4MTAsMHgwMCwKKzB4NiwweDAxLDB4MTAsMHgwMSwKKzB4NiwweDAxLDB4MTAsMHgxMCwKKzB4NiwweDAxLDB4MTAsMHgxMSwKKzB4NiwweDAxLDB4MTEsMHgwMCwKKzB4NiwweDAxLDB4MTEsMHgwMSwKKzB4NiwweDAxLDB4MTEsMHgxMCwKKzB4NiwweDAxLDB4MTEsMHgxMSwKKzB4NiwweDEwLDB4MDAsMHgwMCwKKzB4NiwweDEwLDB4MDAsMHgwMSwKKzB4NiwweDEwLDB4MDAsMHgxMCwKKzB4NiwweDEwLDB4MDAsMHgxMSwKKzB4NiwweDEwLDB4MDEsMHgwMCwKKzB4NiwweDEwLDB4MDEsMHgwMSwKKzB4NiwweDEwLDB4MDEsMHgxMCwKKzB4NiwweDEwLDB4MDEsMHgxMSwKKzB4NiwweDEwLDB4MTAsMHgwMCwKKzB4NiwweDEwLDB4MTAsMHgwMSwKKzB4NiwweDEwLDB4MTAsMHgxMCwKKzB4NiwweDEwLDB4MTAsMHgxMSwKKzB4NiwweDEwLDB4MTEsMHgwMCwKKzB4NiwweDEwLDB4MTEsMHgwMSwKKzB4NiwweDEwLDB4MTEsMHgxMCwKKzB4NiwweDEwLDB4MTEsMHgxMSwKKzB4NiwweDExLDB4MDAsMHgwMCwKKzB4NiwweDExLDB4MDAsMHgwMSwKKzB4NiwweDExLDB4MDAsMHgxMCwKKzB4NiwweDExLDB4MDAsMHgxMSwKKzB4NiwweDExLDB4MDEsMHgwMCwKKzB4NiwweDExLDB4MDEsMHgwMSwKKzB4NiwweDExLDB4MDEsMHgxMCwKKzB4NiwweDExLDB4MDEsMHgxMSwKKzB4NiwweDExLDB4MTAsMHgwMCwKKzB4NiwweDExLDB4MTAsMHgwMSwKKzB4NiwweDExLDB4MTAsMHgxMCwKKzB4NiwweDExLDB4MTAsMHgxMSwKKzB4NiwweDExLDB4MTEsMHgwMCwKKzB4NiwweDExLDB4MTEsMHgwMSwKKzB4NiwweDExLDB4MTEsMHgxMCwKKzB4NCwweDAwLDB4MDAsCisweDQsMHgwMCwweDAxLAorMHg0LDB4MDAsMHgwMiwKKzB4NCwweDAwLDB4MDMsCisweDQsMHgwMCwweDEwLAorMHg0LDB4MDAsMHgxMSwKKzB4NCwweDAwLDB4MTIsCisweDQsMHgwMCwweDEzLAorMHg0LDB4MDAsMHgyMCwKKzB4NCwweDAwLDB4MjEsCisweDQsMHgwMCwweDIyLAorMHg0LDB4MDAsMHgyMywKKzB4NCwweDAwLDB4MzAsCisweDQsMHgwMCwweDMxLAorMHg0LDB4MDAsMHgzMiwKKzB4NCwweDAwLDB4MzMsCisweDQsMHgwMSwweDAwLAorMHg0LDB4MDEsMHgwMSwKKzB4NCwweDAxLDB4MDIsCisweDQsMHgwMSwweDAzLAorMHg0LDB4MDEsMHgxMCwKKzB4NCwweDAxLDB4MTEsCisweDQsMHgwMSwweDEyLAorMHg0LDB4MDEsMHgxMywKKzB4NCwweDAxLDB4MjAsCisweDQsMHgwMSwweDIxLAorMHg0LDB4MDEsMHgyMiwKKzB4NCwweDAxLDB4MjMsCisweDQsMHgwMSwweDMwLAorMHg0LDB4MDEsMHgzMSwKKzB4NCwweDAxLDB4MzIsCisweDQsMHgwMSwweDMzLAorMHg0LDB4MDIsMHgwMCwKKzB4NCwweDAyLDB4MDEsCisweDQsMHgwMiwweDAyLAorMHg0LDB4MDIsMHgwMywKKzB4NCwweDAyLDB4MTAsCisweDQsMHgwMiwweDExLAorMHg0LDB4MDIsMHgxMiwKKzB4NCwweDAyLDB4MTMsCisweDQsMHgwMiwweDIwLAorMHg0LDB4MDIsMHgyMSwKKzB4NCwweDAyLDB4MjIsCisweDQsMHgwMiwweDIzLAorMHg0LDB4MDIsMHgzMCwKKzB4NCwweDAyLDB4MzEsCisweDQsMHgwMiwweDMyLAorMHg0LDB4MDIsMHgzMywKKzB4NCwweDAzLDB4MDAsCisweDQsMHgwMywweDAxLAorMHg0LDB4MDMsMHgwMiwKKzB4NCwweDAzLDB4MDMsCisweDQsMHgwMywweDEwLAorMHg0LDB4MDMsMHgxMSwKKzB4NCwweDAzLDB4MTIsCisweDQsMHgwMywweDEzLAorMHg0LDB4MDMsMHgyMCwKKzB4NCwweDAzLDB4MjEsCisweDQsMHgwMywweDIyLAorMHg0LDB4MDMsMHgyMywKKzB4NCwweDAzLDB4MzAsCisweDQsMHgwMywweDMxLAorMHg0LDB4MDMsMHgzMiwKKzB4NCwweDAzLDB4MzMsCisweDQsMHgxMCwweDAwLAorMHg0LDB4MTAsMHgwMSwKKzB4NCwweDEwLDB4MDIsCisweDQsMHgxMCwweDAzLAorMHg0LDB4MTAsMHgxMCwKKzB4NCwweDEwLDB4MTEsCisweDQsMHgxMCwweDEyLAorMHg0LDB4MTAsMHgxMywKKzB4NCwweDEwLDB4MjAsCisweDQsMHgxMCwweDIxLAorMHg0LDB4MTAsMHgyMiwKKzB4NCwweDEwLDB4MjMsCisweDQsMHgxMCwweDMwLAorMHg0LDB4MTAsMHgzMSwKKzB4NCwweDEwLDB4MzIsCisweDQsMHgxMCwweDMzLAorMHg0LDB4MTEsMHgwMCwKKzB4NCwweDExLDB4MDEsCisweDQsMHgxMSwweDAyLAorMHg0LDB4MTEsMHgwMywKKzB4NCwweDExLDB4MTAsCisweDQsMHgxMSwweDExLAorMHg0LDB4MTEsMHgxMiwKKzB4NCwweDExLDB4MTMsCisweDQsMHgxMSwweDIwLAorMHg0LDB4MTEsMHgyMSwKKzB4NCwweDExLDB4MjIsCisweDQsMHgxMSwweDIzLAorMHg0LDB4MTEsMHgzMCwKKzB4NCwweDExLDB4MzEsCisweDQsMHgxMSwweDMyLAorMHg0LDB4MTEsMHgzMywKKzB4NCwweDEyLDB4MDAsCisweDQsMHgxMiwweDAxLAorMHg0LDB4MTIsMHgwMiwKKzB4NCwweDEyLDB4MDMsCisweDQsMHgxMiwweDEwLAorMHg0LDB4MTIsMHgxMSwKKzB4NCwweDEyLDB4MTIsCisweDQsMHgxMiwweDEzLAorMHg0LDB4MTIsMHgyMCwKKzB4NCwweDEyLDB4MjEsCisweDQsMHgxMiwweDIyLAorMHg0LDB4MTIsMHgyMywKKzB4NCwweDEyLDB4MzAsCisweDQsMHgxMiwweDMxLAorMHg0LDB4MTIsMHgzMiwKKzB4NCwweDEyLDB4MzMsCisweDQsMHgxMywweDAwLAorMHg0LDB4MTMsMHgwMSwKKzB4NCwweDEzLDB4MDIsCisweDQsMHgxMywweDAzLAorMHg0LDB4MTMsMHgxMCwKKzB4NCwweDEzLDB4MTEsCisweDQsMHgxMywweDEyLAorMHg0LDB4MTMsMHgxMywKKzB4NCwweDEzLDB4MjAsCisweDQsMHgxMywweDIxLAorMHg0LDB4MTMsMHgyMiwKKzB4NCwweDEzLDB4MjMsCisweDQsMHgxMywweDMwLAorMHg0LDB4MTMsMHgzMSwKKzB4NCwweDEzLDB4MzIsCisweDQsMHgxMywweDMzLAorMHgyLDB4MDAsCisweDIsMHgxMCwKKzB4MiwweDIwLAorMHgyLDB4MzAsCisweDIsMHg0MCwKKzB4MiwweDUwLAorMHgyLDB4NjAsCisweDIsMHg3MCwKKzB4MiwweDAxLAorMHgyLDB4MTEsCisweDIsMHgyMSwKKzB4MiwweDMxLAorMHgyLDB4NDEsCisweDIsMHg1MSwKKzB4MiwweDYxLAorMHgyLDB4NzEsCisweDIsMHgwMiwKKzB4MiwweDEyLAorMHgyLDB4MjIsCisweDIsMHgzMiwKKzB4MiwweDQyLAorMHgyLDB4NTIsCisweDIsMHg2MiwKKzB4MiwweDcyLAorMHgyLDB4MDMsCisweDIsMHgxMywKKzB4MiwweDIzLAorMHgyLDB4MzMsCisweDIsMHg0MywKKzB4MiwweDUzLAorMHgyLDB4NjMsCisweDIsMHg3MywKKzB4MiwweDA0LAorMHgyLDB4MTQsCisweDIsMHgyNCwKKzB4MiwweDM0LAorMHgyLDB4NDQsCisweDIsMHg1NCwKKzB4MiwweDY0LAorMHgyLDB4NzQsCisweDIsMHgwNSwKKzB4MiwweDE1LAorMHgyLDB4MjUsCisweDIsMHgzNSwKKzB4MiwweDQ1LAorMHgyLDB4NTUsCisweDIsMHg2NSwKKzB4MiwweDc1LAorMHgyLDB4MDYsCisweDIsMHgxNiwKKzB4MiwweDI2LAorMHgyLDB4MzYsCisweDIsMHg0NiwKKzB4MiwweDU2LAorMHgyLDB4NjYsCisweDIsMHg3NiwKKzB4MiwweDA3LAorMHgyLDB4MTcsCisweDIsMHgyNywKKzB4MiwweDM3LAorMHgyLDB4NDcsCisweDIsMHg1NywKKzB4MiwweDY3LAorMHgyLDB4NzcKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHBjX3RibDRbXSA9IHsKKzB4OCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDgsMHgyMCwweDAwLDB4MDAsMHgwMCwKKzB4OCwweDAwLDB4MDAsMHgwMCwweDAxLAorMHg4LDB4MTAsMHgwMCwweDAwLDB4MDAsCisweDgsMHgwMCwweDAwLDB4MDAsMHgwMiwKKzB4OCwweDAxLDB4MDAsMHgwMCwweDAwLAorMHg4LDB4MDAsMHgwMCwweDAwLDB4MTAsCisweDgsMHgwMiwweDAwLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MDAsMHgwMCwKKzB4NiwweDIwLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MDAsMHgwMSwKKzB4NiwweDEwLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MDAsMHgwMiwKKzB4NiwweDAwLDB4MTAsMHgwMCwKKzB4NiwweDAwLDB4MjAsMHgwMCwKKzB4NiwweDAwLDB4MDIsMHgwMCwKKzB4NiwweDAwLDB4MDEsMHgwMCwKKzB4NiwweDAxLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MDAsMHgyMCwKKzB4NiwweDAyLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MDAsMHgxMCwKKzB4NiwweDEwLDB4MDAsMHgyMCwKKzB4NiwweDAxLDB4MDAsMHgwMiwKKzB4NiwweDIwLDB4MDAsMHgxMCwKKzB4NiwweDAyLDB4MDAsMHgwMSwKKzB4NiwweDIwLDB4MTAsMHgwMCwKKzB4NiwweDAwLDB4MTIsMHgwMCwKKzB4NiwweDAwLDB4MDIsMHgwMSwKKzB4NiwweDAyLDB4MDEsMHgwMCwKKzB4NiwweDAwLDB4MjEsMHgwMCwKKzB4NiwweDAwLDB4MDEsMHgwMiwKKzB4NiwweDAwLDB4MjAsMHgxMCwKKzB4NiwweDAwLDB4MDAsMHgyMSwKKzB4NiwweDAwLDB4MDAsMHgxMiwKKzB4NiwweDAwLDB4MDEsMHgyMCwKKzB4NiwweDEyLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MTAsMHgyMCwKKzB4NiwweDAxLDB4MjAsMHgwMCwKKzB4NiwweDAyLDB4MTAsMHgwMCwKKzB4NiwweDEwLDB4MjAsMHgwMCwKKzB4NiwweDAxLDB4MDIsMHgwMCwKKzB4NiwweDIxLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MDIsMHgxMCwKKzB4NiwweDIwLDB4MDEsMHgwMCwKKzB4NiwweDAwLDB4MjIsMHgwMCwKKzB4NiwweDEwLDB4MDIsMHgwMCwKKzB4NiwweDAwLDB4MTAsMHgwMiwKKzB4NiwweDExLDB4MDAsMHgwMCwKKzB4NiwweDAwLDB4MTEsMHgwMCwKKzB4NiwweDIyLDB4MDAsMHgwMCwKKzB4NiwweDIwLDB4MDAsMHgwMiwKKzB4NiwweDEwLDB4MDAsMHgwMSwKKzB4NiwweDAwLDB4MjAsMHgwMSwKKzB4NiwweDAyLDB4MjAsMHgwMCwKKzB4NiwweDAxLDB4MTAsMHgwMCwKKzB4NiwweDAxLDB4MDAsMHgyMCwKKzB4NiwweDAwLDB4MjAsMHgwMiwKKzB4NiwweDAxLDB4MjAsMHgwMiwKKzB4NiwweDEwLDB4MDEsMHgwMCwKKzB4NiwweDAyLDB4MDAsMHgxMCwKKzB4NiwweDAwLDB4MTAsMHgwMSwKKzB4NiwweDEwLDB4MDEsMHgyMCwKKzB4NiwweDIwLDB4MDIsMHgxMCwKKzB4NiwweDAwLDB4MDAsMHgyMiwKKzB4NiwweDEwLDB4MDAsMHgwMiwKKzB4NiwweDAwLDB4MDIsMHgyMCwKKzB4NiwweDIwLDB4MDIsMHgwMCwKKzB4NiwweDAwLDB4MDAsMHgxMSwKKzB4NiwweDAyLDB4MTAsMHgwMSwKKzB4NiwweDAwLDB4MDEsMHgxMCwKKzB4NiwweDAwLDB4MDIsMHgxMSwKKzB4NCwweDAxLDB4MDIsCisweDQsMHgwMiwweDAxLAorMHg0LDB4MDEsMHgwMCwKKzB4NCwweDEwLDB4MjAsCisweDQsMHgyMCwweDEwLAorMHg0LDB4MjAsMHgwMCwKKzB4NCwweDExLDB4MDAsCisweDQsMHgwMiwweDAwLAorMHg0LDB4MTIsMHgwMCwKKzB4NCwweDAwLDB4MjEsCisweDQsMHgyMiwweDAwLAorMHg0LDB4MDAsMHgxMiwKKzB4NCwweDIxLDB4MDAsCisweDQsMHgwMiwweDExLAorMHg0LDB4MDAsMHgwMSwKKzB4NCwweDEwLDB4MDIsCisweDQsMHgwMiwweDIwLAorMHg0LDB4MjAsMHgxMSwKKzB4NCwweDAxLDB4MTAsCisweDQsMHgyMSwweDEwLAorMHg0LDB4MTAsMHgwMCwKKzB4NCwweDEwLDB4MjIsCisweDQsMHgyMCwweDIwLAorMHg0LDB4MDAsMHgyMiwKKzB4NCwweDAxLDB4MjIsCisweDQsMHgyMCwweDAxLAorMHg0LDB4MDIsMHgwMiwKKzB4NCwweDAwLDB4MjAsCisweDQsMHgwMCwweDEwLAorMHg0LDB4MDAsMHgxMSwKKzB4NCwweDIyLDB4MDEsCisweDQsMHgxMSwweDIwLAorMHg0LDB4MTIsMHgwMSwKKzB4NCwweDEyLDB4MjAsCisweDQsMHgxMSwweDAyLAorMHg0LDB4MTAsMHgxMCwKKzB4NCwweDAxLDB4MDEsCisweDQsMHgwMiwweDIxLAorMHg0LDB4MjAsMHgxMiwKKzB4NCwweDAxLDB4MTIsCisweDQsMHgyMiwweDExLAorMHg0LDB4MjEsMHgxMiwKKzB4NCwweDIyLDB4MTAsCisweDQsMHgyMSwweDAyLAorMHg0LDB4MjAsMHgwMiwKKzB4NCwweDEwLDB4MDEsCisweDQsMHgwMCwweDAyLAorMHg0LDB4MTAsMHgyMSwKKzB4NCwweDAxLDB4MjAsCisweDQsMHgxMSwweDIyLAorMHg0LDB4MTIsMHgyMSwKKzB4NCwweDIyLDB4MjAsCisweDQsMHgwMiwweDEwLAorMHg0LDB4MDIsMHgyMiwKKzB4NCwweDExLDB4MTAsCisweDQsMHgyMiwweDAyLAorMHg0LDB4MjAsMHgyMSwKKzB4NCwweDAxLDB4MTEsCisweDQsMHgxMSwweDAxLAorMHg0LDB4MTAsMHgxMiwKKzB4NCwweDAyLDB4MTIsCisweDQsMHgyMCwweDIyLAorMHg0LDB4MjEsMHgyMCwKKzB4NCwweDAxLDB4MjEsCisweDQsMHgxMiwweDAyLAorMHg0LDB4MjEsMHgxMSwKKzB4NCwweDEyLDB4MjIsCisweDQsMHgxMiwweDEwLAorMHg0LDB4MjIsMHgyMSwKKzB4NCwweDEwLDB4MTEsCisweDQsMHgyMSwweDAxLAorMHg0LDB4MTEsMHgxMiwKKzB4NCwweDEyLDB4MTEsCisweDQsMHg2NiwweDY2LAorMHg0LDB4MjIsMHgyMiwKKzB4NCwweDExLDB4MjEsCisweDQsMHgxMSwweDExLAorMHg0LDB4MjEsMHgyMiwKKzB4NCwweDAwLDB4MDAsCisweDQsMHgyMiwweDEyLAorMHg0LDB4MTIsMHgxMiwKKzB4NCwweDIxLDB4MjEsCisweDQsMHg0MiwweDAwLAorMHg0LDB4MDAsMHgwNCwKKzB4NCwweDQwLDB4MDAsCisweDQsMHgzMCwweDAwLAorMHg0LDB4MzEsMHgwMCwKKzB4NCwweDAwLDB4MDMsCisweDQsMHgwMCwweDE0LAorMHg0LDB4MDAsMHgxMywKKzB4NCwweDAxLDB4MjQsCisweDQsMHgyMCwweDEzLAorMHg0LDB4MDEsMHg0MiwKKzB4NCwweDE0LDB4MjAsCisweDQsMHg0MiwweDAyLAorMHg0LDB4MTMsMHgwMCwKKzB4NCwweDAwLDB4MjQsCisweDQsMHgzMSwweDIwLAorMHg0LDB4MjIsMHgxMywKKzB4NCwweDExLDB4MjQsCisweDQsMHgxMiwweDY2LAorMHg0LDB4MzAsMHgwMSwKKzB4NCwweDAyLDB4MTMsCisweDQsMHgxMiwweDQyLAorMHg0LDB4NDAsMHgxMCwKKzB4NCwweDQwLDB4MDIsCisweDQsMHgwMSwweDA0LAorMHg0LDB4MjQsMHgwMCwKKzB4NCwweDQyLDB4MTAsCisweDQsMHgyMSwweDEzLAorMHg0LDB4MTMsMHgxMiwKKzB4NCwweDMxLDB4MjEsCisweDQsMHgyMSwweDI0LAorMHg0LDB4MDAsMHg0MCwKKzB4NCwweDEwLDB4MjQsCisweDQsMHgxMCwweDQyLAorMHg0LDB4MzIsMHgwMSwKKzB4NCwweDExLDB4NDIsCisweDQsMHgyMCwweDMxLAorMHg0LDB4MTIsMHg0MCwKKzB4MiwweDAwLAorMHgyLDB4MTAsCisweDIsMHgyMCwKKzB4MiwweDMwLAorMHgyLDB4NDAsCisweDIsMHg1MCwKKzB4MiwweDYwLAorMHgyLDB4NzAsCisweDIsMHgwMSwKKzB4MiwweDExLAorMHgyLDB4MjEsCisweDIsMHgzMSwKKzB4MiwweDQxLAorMHgyLDB4NTEsCisweDIsMHg2MSwKKzB4MiwweDcxLAorMHgyLDB4MDIsCisweDIsMHgxMiwKKzB4MiwweDIyLAorMHgyLDB4MzIsCisweDIsMHg0MiwKKzB4MiwweDUyLAorMHgyLDB4NjIsCisweDIsMHg3MiwKKzB4MiwweDAzLAorMHgyLDB4MTMsCisweDIsMHgyMywKKzB4MiwweDMzLAorMHgyLDB4NDMsCisweDIsMHg1MywKKzB4MiwweDYzLAorMHgyLDB4NzMsCisweDIsMHgwNCwKKzB4MiwweDE0LAorMHgyLDB4MjQsCisweDIsMHgzNCwKKzB4MiwweDQ0LAorMHgyLDB4NTQsCisweDIsMHg2NCwKKzB4MiwweDc0LAorMHgyLDB4MDUsCisweDIsMHgxNSwKKzB4MiwweDI1LAorMHgyLDB4MzUsCisweDIsMHg0NSwKKzB4MiwweDU1LAorMHgyLDB4NjUsCisweDIsMHg3NSwKKzB4MiwweDA2LAorMHgyLDB4MTYsCisweDIsMHgyNiwKKzB4MiwweDM2LAorMHgyLDB4NDYsCisweDIsMHg1NiwKKzB4MiwweDY2LAorMHgyLDB4NzYsCisweDIsMHgwNywKKzB4MiwweDE3LAorMHgyLDB4MjcsCisweDIsMHgzNywKKzB4MiwweDQ3LAorMHgyLDB4NTcsCisweDIsMHg2NywKKzB4MiwweDc3Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCAqIGNvbnN0IHRhYmxlc1tdID0geyBwY190YmwyLCBwY190YmwzLCBwY190Ymw0IH07CisKKyNlbmRpZiAvKiBBVkNPREVDX1RSVUVNT1RJT04xREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90cnVlbW90aW9uMi5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHJ1ZW1vdGlvbjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmFhM2M2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHJ1ZW1vdGlvbjIuYwpAQCAtMCwwICsxLDEwMjYgQEAKKy8qCisgKiBEdWNrL09OMiBUcnVlTW90aW9uIDIgRGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA1IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRHVjayBUcnVlTW90aW9uMiBkZWNvZGVyLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBUTTJfRVNDQVBFIDB4ODAwMDAwMDAKKyNkZWZpbmUgVE0yX0RFTFRBUyA2NAorCisvKiBIdWZmbWFuLWNvZGVkIHN0cmVhbXMgb2YgZGlmZmVyZW50IHR5cGVzIG9mIGJsb2NrcyAqLworZW51bSBUTTJfU1RSRUFNUyB7CisgICAgVE0yX0NfSEkgPSAwLAorICAgIFRNMl9DX0xPLAorICAgIFRNMl9MX0hJLAorICAgIFRNMl9MX0xPLAorICAgIFRNMl9VUEQsCisgICAgVE0yX01PVCwKKyAgICBUTTJfVFlQRSwKKyAgICBUTTJfTlVNX1NUUkVBTVMKK307CisKKy8qIEJsb2NrIHR5cGVzICovCitlbnVtIFRNMl9CTE9DS1MgeworICAgIFRNMl9ISV9SRVMgPSAwLAorICAgIFRNMl9NRURfUkVTLAorICAgIFRNMl9MT1dfUkVTLAorICAgIFRNMl9OVUxMX1JFUywKKyAgICBUTTJfVVBEQVRFLAorICAgIFRNMl9TVElMTCwKKyAgICBUTTJfTU9USU9OCit9OworCit0eXBlZGVmIHN0cnVjdCBUTTJDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAqcGljOworCisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBCc3dhcERTUENvbnRleHQgYmRzcDsKKworICAgIHVpbnQ4X3QgKmJ1ZmZlcjsKKyAgICBpbnQgYnVmZmVyX3NpemU7CisKKyAgICAvKiBUTTIgc3RyZWFtcyAqLworICAgIGludCAqdG9rZW5zW1RNMl9OVU1fU1RSRUFNU107CisgICAgaW50IHRva19sZW5zW1RNMl9OVU1fU1RSRUFNU107CisgICAgaW50IHRva19wdHJzW1RNMl9OVU1fU1RSRUFNU107CisgICAgaW50IGRlbHRhc1tUTTJfTlVNX1NUUkVBTVNdW1RNMl9ERUxUQVNdOworICAgIC8qIGZvciBibG9ja3MgZGVjb2RpbmcgKi8KKyAgICBpbnQgRFs0XTsKKyAgICBpbnQgQ0RbNF07CisgICAgaW50ICpsYXN0OworICAgIGludCAqY2xhc3Q7CisKKyAgICAvKiBkYXRhIGZvciBjdXJyZW50IGFuZCBwcmV2aW91cyBmcmFtZSAqLworICAgIGludCAqWTFfYmFzZSwgKlUxX2Jhc2UsICpWMV9iYXNlLCAqWTJfYmFzZSwgKlUyX2Jhc2UsICpWMl9iYXNlOworICAgIGludCAqWTEsICpVMSwgKlYxLCAqWTIsICpVMiwgKlYyOworICAgIGludCB5X3N0cmlkZSwgdXZfc3RyaWRlOworICAgIGludCBjdXI7Cit9IFRNMkNvbnRleHQ7CisKKy8qKgorKiBIdWZmbWFuIGNvZGVzIGZvciBlYWNoIG9mIHN0cmVhbXMKKyovCit0eXBlZGVmIHN0cnVjdCBUTTJDb2RlcyB7CisgICAgVkxDIHZsYzsgLy8vPCB0YWJsZSBmb3IgRkZtcGVnIGJpdHN0cmVhbSByZWFkZXIKKyAgICBpbnQgYml0czsKKyAgICBpbnQgKnJlY29kZTsgLy8vPCB0YWJsZSBmb3IgY29udmVydGluZyBmcm9tIGNvZGUgaW5kZXhlcyB0byB2YWx1ZXMKKyAgICBpbnQgbGVuZ3RoOworfSBUTTJDb2RlczsKKworLyoqCisqIHN0cnVjdHVyZSBmb3IgZ2F0aGVyaW5nIEh1ZmZtYW4gY29kZXMgaW5mb3JtYXRpb24KKyovCit0eXBlZGVmIHN0cnVjdCBUTTJIdWZmIHsKKyAgICBpbnQgdmFsX2JpdHM7IC8vLzwgbGVuZ3RoIG9mIGxpdGVyYWwKKyAgICBpbnQgbWF4X2JpdHM7IC8vLzwgbWF4aW11bSBsZW5ndGggb2YgY29kZQorICAgIGludCBtaW5fYml0czsgLy8vPCBtaW5pbXVtIGxlbmd0aCBvZiBjb2RlCisgICAgaW50IG5vZGVzOyAvLy88IHRvdGFsIG51bWJlciBvZiBub2RlcyBpbiB0cmVlCisgICAgaW50IG51bTsgLy8vPCBjdXJyZW50IG51bWJlciBmaWxsZWQKKyAgICBpbnQgbWF4X251bTsgLy8vPCB0b3RhbCBudW1iZXIgb2YgY29kZXMKKyAgICBpbnQgKm51bXM7IC8vLzwgbGl0ZXJhbHMKKyAgICB1aW50MzJfdCAqYml0czsgLy8vPCBjb2RlcworICAgIGludCAqbGVuczsgLy8vPCBjb2RlbGVuZ3RocworfSBUTTJIdWZmOworCitzdGF0aWMgaW50IHRtMl9yZWFkX3RyZWUoVE0yQ29udGV4dCAqY3R4LCB1aW50MzJfdCBwcmVmaXgsIGludCBsZW5ndGgsIFRNMkh1ZmYgKmh1ZmYpCit7CisgICAgaW50IHJldDsKKyAgICBpZiAobGVuZ3RoID4gaHVmZi0+bWF4X2JpdHMpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRyZWUgZXhjZWVkZWQgaXRzIGdpdmVuIGRlcHRoICglaSlcbiIsCisgICAgICAgICAgICAgICBodWZmLT5tYXhfYml0cyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICghZ2V0X2JpdHMxKCZjdHgtPmdiKSkgeyAvKiBsaXRlcmFsICovCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgbGVuZ3RoID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaHVmZi0+bnVtID49IGh1ZmYtPm1heF9udW0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJUb28gbWFueSBsaXRlcmFsc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBodWZmLT5udW1zW2h1ZmYtPm51bV0gPSBnZXRfYml0c19sb25nKCZjdHgtPmdiLCBodWZmLT52YWxfYml0cyk7CisgICAgICAgIGh1ZmYtPmJpdHNbaHVmZi0+bnVtXSA9IHByZWZpeDsKKyAgICAgICAgaHVmZi0+bGVuc1todWZmLT5udW1dID0gbGVuZ3RoOworICAgICAgICBodWZmLT5udW0rKzsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsgLyogbm9uLXRlcm1pbmFsIG5vZGUgKi8KKyAgICAgICAgaWYgKChyZXQgPSB0bTJfcmVhZF90cmVlKGN0eCwgcHJlZml4IDw8IDEsIGxlbmd0aCArIDEsIGh1ZmYpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IHRtMl9yZWFkX3RyZWUoY3R4LCAocHJlZml4IDw8IDEpIHwgMSwgbGVuZ3RoICsgMSwgaHVmZikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRtMl9idWlsZF9odWZmX3RhYmxlKFRNMkNvbnRleHQgKmN0eCwgVE0yQ29kZXMgKmNvZGUpCit7CisgICAgVE0ySHVmZiBodWZmOworICAgIGludCByZXMgPSAwOworCisgICAgaHVmZi52YWxfYml0cyA9IGdldF9iaXRzKCZjdHgtPmdiLCA1KTsKKyAgICBodWZmLm1heF9iaXRzID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDUpOworICAgIGh1ZmYubWluX2JpdHMgPSBnZXRfYml0cygmY3R4LT5nYiwgNSk7CisgICAgaHVmZi5ub2RlcyAgICA9IGdldF9iaXRzX2xvbmcoJmN0eC0+Z2IsIDE3KTsKKyAgICBodWZmLm51bSAgICAgID0gMDsKKworICAgIC8qIGNoZWNrIGZvciBjb3JyZWN0IGNvZGVzIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoKGh1ZmYudmFsX2JpdHMgPCAxKSB8fCAoaHVmZi52YWxfYml0cyA+IDMyKSB8fAorICAgICAgICAoaHVmZi5tYXhfYml0cyA8IDApIHx8IChodWZmLm1heF9iaXRzID4gMjUpKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgdHJlZSBwYXJhbWV0ZXJzIC0gbGl0ZXJhbCAiCisgICAgICAgICAgICAgICAibGVuZ3RoOiAlaSwgbWF4IGNvZGUgbGVuZ3RoOiAlaVxuIiwgaHVmZi52YWxfYml0cywgaHVmZi5tYXhfYml0cyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoKGh1ZmYubm9kZXMgPD0gMCkgfHwgKGh1ZmYubm9kZXMgPiAweDEwMDAwKSkgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IG51bWJlciBvZiBIdWZmbWFuIHRyZWUgIgorICAgICAgICAgICAgICAgIm5vZGVzOiAlaVxuIiwgaHVmZi5ub2Rlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICAvKiBvbmUtbm9kZSB0cmVlICovCisgICAgaWYgKGh1ZmYubWF4X2JpdHMgPT0gMCkKKyAgICAgICAgaHVmZi5tYXhfYml0cyA9IDE7CisKKyAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgY29kZXMgLSBpdCBpcyBleGFjdGx5IGNlaWwobm9kZXMgLyAyKSBlbnRyaWVzICovCisgICAgaHVmZi5tYXhfbnVtID0gKGh1ZmYubm9kZXMgKyAxKSA+PiAxOworICAgIGh1ZmYubnVtcyAgICA9IGF2X2NhbGxvYyhodWZmLm1heF9udW0sIHNpemVvZihpbnQpKTsKKyAgICBodWZmLmJpdHMgICAgPSBhdl9jYWxsb2MoaHVmZi5tYXhfbnVtLCBzaXplb2YodWludDMyX3QpKTsKKyAgICBodWZmLmxlbnMgICAgPSBhdl9jYWxsb2MoaHVmZi5tYXhfbnVtLCBzaXplb2YoaW50KSk7CisKKyAgICBpZiAoIWh1ZmYubnVtcyB8fCAhaHVmZi5iaXRzIHx8ICFodWZmLmxlbnMpIHsKKyAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmVzID0gdG0yX3JlYWRfdHJlZShjdHgsIDAsIDAsICZodWZmKTsKKworICAgIGlmIChodWZmLm51bSAhPSBodWZmLm1heF9udW0pIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkdvdCBsZXNzIGNvZGVzIHRoYW4gZXhwZWN0ZWQ6ICVpIG9mICVpXG4iLAorICAgICAgICAgICAgICAgaHVmZi5udW0sIGh1ZmYubWF4X251bSk7CisgICAgICAgIHJlcyA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogY29udmVydCBjb2RlcyB0byB2bGNfdGFibGUgKi8KKyAgICBpZiAocmVzID49IDApIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgcmVzID0gaW5pdF92bGMoJmNvZGUtPnZsYywgaHVmZi5tYXhfYml0cywgaHVmZi5tYXhfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICBodWZmLmxlbnMsIHNpemVvZihpbnQpLCBzaXplb2YoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgaHVmZi5iaXRzLCBzaXplb2YodWludDMyX3QpLCBzaXplb2YodWludDMyX3QpLCAwKTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGJ1aWxkIFZMQyB0YWJsZVxuIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29kZS0+Yml0cyA9IGh1ZmYubWF4X2JpdHM7CisgICAgICAgICAgICBjb2RlLT5sZW5ndGggPSBodWZmLm1heF9udW07CisgICAgICAgICAgICBjb2RlLT5yZWNvZGUgPSBhdl9tYWxsb2NfYXJyYXkoY29kZS0+bGVuZ3RoLCBzaXplb2YoaW50KSk7CisgICAgICAgICAgICBpZiAoIWNvZGUtPnJlY29kZSkgeworICAgICAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29kZS0+bGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgY29kZS0+cmVjb2RlW2ldID0gaHVmZi5udW1zW2ldOworICAgICAgICB9CisgICAgfQorZmFpbDoKKyAgICAvKiBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICBhdl9mcmVlKGh1ZmYubnVtcyk7CisgICAgYXZfZnJlZShodWZmLmJpdHMpOworICAgIGF2X2ZyZWUoaHVmZi5sZW5zKTsKKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHRtMl9mcmVlX2NvZGVzKFRNMkNvZGVzICpjb2RlKQoreworICAgIGF2X2ZyZWUoY29kZS0+cmVjb2RlKTsKKyAgICBpZiAoY29kZS0+dmxjLnRhYmxlKQorICAgICAgICBmZl9mcmVlX3ZsYygmY29kZS0+dmxjKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdG0yX2dldF90b2tlbihHZXRCaXRDb250ZXh0ICpnYiwgVE0yQ29kZXMgKmNvZGUpCit7CisgICAgaW50IHZhbDsKKyAgICB2YWwgPSBnZXRfdmxjMihnYiwgY29kZS0+dmxjLnRhYmxlLCBjb2RlLT5iaXRzLCAxKTsKKyAgICBpZih2YWw8MCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBjb2RlLT5yZWNvZGVbdmFsXTsKK30KKworI2RlZmluZSBUTTJfT0xEX0hFQURFUl9NQUdJQyAweDAwMDAwMTAwCisjZGVmaW5lIFRNMl9ORVdfSEVBREVSX01BR0lDIDB4MDAwMDAxMDEKKworc3RhdGljIGlubGluZSBpbnQgdG0yX3JlYWRfaGVhZGVyKFRNMkNvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCAqYnVmKQoreworICAgIHVpbnQzMl90IG1hZ2ljID0gQVZfUkwzMihidWYpOworCisgICAgc3dpdGNoIChtYWdpYykgeworICAgIGNhc2UgVE0yX09MRF9IRUFERVJfTUFHSUM6CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShjdHgtPmF2Y3R4LCAiT2xkIFRNMiBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBUTTJfTkVXX0hFQURFUl9NQUdJQzoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCBhIFRNMiBoZWFkZXI6IDB4JTA4IlBSSVgzMiJcbiIsCisgICAgICAgICAgICAgICBtYWdpYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KK30KKworc3RhdGljIGludCB0bTJfcmVhZF9kZWx0YXMoVE0yQ29udGV4dCAqY3R4LCBpbnQgc3RyZWFtX2lkKQoreworICAgIGludCBkLCBtYjsKKyAgICBpbnQgaSwgdjsKKworICAgIGQgID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDkpOworICAgIG1iID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDUpOworCisgICAgYXZfYXNzZXJ0MihtYiA8IDMyKTsKKyAgICBpZiAoKGQgPCAxKSB8fCAoZCA+IFRNMl9ERUxUQVMpIHx8IChtYiA8IDEpKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgZGVsdGEgdGFibGU6ICVpIGRlbHRhcyB4ICVpIGJpdHNcbiIsIGQsIG1iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGQ7IGkrKykgeworICAgICAgICB2ID0gZ2V0X2JpdHNfbG9uZygmY3R4LT5nYiwgbWIpOworICAgICAgICBpZiAodiAmICgxIDw8IChtYiAtIDEpKSkKKyAgICAgICAgICAgIGN0eC0+ZGVsdGFzW3N0cmVhbV9pZF1baV0gPSB2IC0gKDEgPDwgbWIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjdHgtPmRlbHRhc1tzdHJlYW1faWRdW2ldID0gdjsKKyAgICB9CisgICAgZm9yICg7IGkgPCBUTTJfREVMVEFTOyBpKyspCisgICAgICAgIGN0eC0+ZGVsdGFzW3N0cmVhbV9pZF1baV0gPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG0yX3JlYWRfc3RyZWFtKFRNMkNvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc3RyZWFtX2lkLCBpbnQgYnVmX3NpemUpCit7CisgICAgaW50IGksIHJldDsKKyAgICBpbnQgc2tpcCA9IDA7CisgICAgaW50IGxlbiwgdG9rcywgcG9zOworICAgIFRNMkNvZGVzIGNvZGVzOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgaWYgKGJ1Zl9zaXplIDwgNCkgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibm90IGVub3VnaCBzcGFjZSBmb3IgbGVuIGxlZnRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBnZXQgc3RyZWFtIGxlbmd0aCBpbiBkd29yZHMgKi8KKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmLCBidWZfc2l6ZSk7CisgICAgbGVuICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgc2tpcCA9IGxlbiAqIDQgKyA0OworCisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gNDsKKworICAgIGlmIChsZW4gPj0gSU5UX01BWC80LTEgfHwgbGVuIDwgMCB8fCBza2lwID4gYnVmX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc3RyZWFtIHNpemVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB0b2tzID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKyAgICBpZiAodG9rcyAmIDEpIHsKKyAgICAgICAgbGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKyAgICAgICAgaWYgKGxlbiA9PSBUTTJfRVNDQVBFKSB7CisgICAgICAgICAgICBsZW4gPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICBwb3MgPSBieXRlc3RyZWFtMl90ZWxsKCZnYik7CisgICAgICAgICAgICBpZiAoc2tpcCA8PSBwb3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZjdHgtPmdiLCBidWYgKyBwb3MsIChza2lwIC0gcG9zKSAqIDgpOworICAgICAgICAgICAgaWYgKChyZXQgPSB0bTJfcmVhZF9kZWx0YXMoY3R4LCBzdHJlYW1faWQpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAoKGdldF9iaXRzX2NvdW50KCZjdHgtPmdiKSArIDMxKSA+PiA1KSA8PCAyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBza2lwIHVudXNlZCBmaWVsZHMgKi8KKyAgICBsZW4gPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgIGlmIChsZW4gPT0gVE0yX0VTQ0FQRSkgeyAvKiBzb21lIHVua25vd24gbGVuZ3RoIC0gY291bGQgYmUgZXNjYXBlZCB0b28gKi8KKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDgpOyAvKiB1bnVzZWQgYnkgZGVjb2RlciAqLworICAgIH0gZWxzZSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCA0KTsgLyogdW51c2VkIGJ5IGRlY29kZXIgKi8KKyAgICB9CisKKyAgICBwb3MgPSBieXRlc3RyZWFtMl90ZWxsKCZnYik7CisgICAgaWYgKHNraXAgPD0gcG9zKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpbml0X2dldF9iaXRzKCZjdHgtPmdiLCBidWYgKyBwb3MsIChza2lwIC0gcG9zKSAqIDgpOworICAgIGlmICgocmV0ID0gdG0yX2J1aWxkX2h1ZmZfdGFibGUoY3R4LCAmY29kZXMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsICgoZ2V0X2JpdHNfY291bnQoJmN0eC0+Z2IpICsgMzEpID4+IDUpIDw8IDIpOworCisgICAgdG9rcyA+Pj0gMTsKKyAgICAvKiBjaGVjayBpZiB3ZSBoYXZlIHNhbmUgbnVtYmVyIG9mIHRva2VucyAqLworICAgIGlmICgodG9rcyA8IDApIHx8ICh0b2tzID4gMHhGRkZGRkYpKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgbnVtYmVyIG9mIHRva2VuczogJWlcbiIsIHRva3MpOworICAgICAgICB0bTJfZnJlZV9jb2RlcygmY29kZXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcmV0ID0gYXZfcmVhbGxvY3BfYXJyYXkoJmN0eC0+dG9rZW5zW3N0cmVhbV9pZF0sIHRva3MsIHNpemVvZihpbnQpKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBjdHgtPnRva19sZW5zW3N0cmVhbV9pZF0gPSAwOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBjdHgtPnRva19sZW5zW3N0cmVhbV9pZF0gPSB0b2tzOworICAgIGxlbiA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgcG9zID0gYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpOworICAgICAgICBpZiAoc2tpcCA8PSBwb3MpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaW5pdF9nZXRfYml0cygmY3R4LT5nYiwgYnVmICsgcG9zLCAoc2tpcCAtIHBvcykgKiA4KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva3M7IGkrKykgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmN0eC0+Z2IpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IG51bWJlciBvZiB0b2tlbnM6ICVpXG4iLCB0b2tzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN0eC0+dG9rZW5zW3N0cmVhbV9pZF1baV0gPSB0bTJfZ2V0X3Rva2VuKCZjdHgtPmdiLCAmY29kZXMpOworICAgICAgICAgICAgaWYgKHN0cmVhbV9pZCA8PSBUTTJfTU9UICYmIGN0eC0+dG9rZW5zW3N0cmVhbV9pZF1baV0gPj0gVE0yX0RFTFRBUyB8fCBjdHgtPnRva2Vuc1tzdHJlYW1faWRdW2ldPDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBkZWx0YSB0b2tlbiBpbmRleCAlZCBmb3IgdHlwZSAlZCwgbj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY3R4LT50b2tlbnNbc3RyZWFtX2lkXVtpXSwgc3RyZWFtX2lkLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tzOyBpKyspIHsKKyAgICAgICAgICAgIGN0eC0+dG9rZW5zW3N0cmVhbV9pZF1baV0gPSBjb2Rlcy5yZWNvZGVbMF07CisgICAgICAgICAgICBpZiAoc3RyZWFtX2lkIDw9IFRNMl9NT1QgJiYgY3R4LT50b2tlbnNbc3RyZWFtX2lkXVtpXSA+PSBUTTJfREVMVEFTKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZGVsdGEgdG9rZW4gaW5kZXggJWQgZm9yIHR5cGUgJWQsIG49JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dG9rZW5zW3N0cmVhbV9pZF1baV0sIHN0cmVhbV9pZCwgaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgdG0yX2ZyZWVfY29kZXMoJmNvZGVzKTsKKworICAgIHJldHVybiBza2lwOworfQorCitzdGF0aWMgaW5saW5lIGludCBHRVRfVE9LKFRNMkNvbnRleHQgKmN0eCxpbnQgdHlwZSkKK3sKKyAgICBpZiAoY3R4LT50b2tfcHRyc1t0eXBlXSA+PSBjdHgtPnRva19sZW5zW3R5cGVdKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZWFkIHRva2VuIGZyb20gc3RyZWFtICVpIG91dCBvZiBib3VuZHMgKCVpPj0laSlcbiIsIHR5cGUsIGN0eC0+dG9rX3B0cnNbdHlwZV0sIGN0eC0+dG9rX2xlbnNbdHlwZV0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHR5cGUgPD0gVE0yX01PVCkgeworICAgICAgICBpZiAoY3R4LT50b2tlbnNbdHlwZV1bY3R4LT50b2tfcHRyc1t0eXBlXV0gPj0gVE0yX0RFTFRBUykgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInRva2VuICVkIGlzIHRvbyBsYXJnZVxuIiwgY3R4LT50b2tlbnNbdHlwZV1bY3R4LT50b2tfcHRyc1t0eXBlXV0pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN0eC0+ZGVsdGFzW3R5cGVdW2N0eC0+dG9rZW5zW3R5cGVdW2N0eC0+dG9rX3B0cnNbdHlwZV0rK11dOworICAgIH0KKyAgICByZXR1cm4gY3R4LT50b2tlbnNbdHlwZV1bY3R4LT50b2tfcHRyc1t0eXBlXSsrXTsKK30KKworLyogYmxvY2tzIGRlY29kaW5nIHJvdXRpbmVzICovCisKKy8qIGNvbW1vbiBZLCBVLCBWIHBvaW50ZXJzIGluaXRpYWxpc2F0aW9uICovCisjZGVmaW5lIFRNMl9JTklUX1BPSU5URVJTKCkgXAorICAgIGludCAqbGFzdCwgKmNsYXN0OyBcCisgICAgaW50ICpZLCAqVSwgKlY7XAorICAgIGludCBZc3RyaWRlLCBVc3RyaWRlLCBWc3RyaWRlO1wKK1wKKyAgICBZc3RyaWRlID0gY3R4LT55X3N0cmlkZTtcCisgICAgVnN0cmlkZSA9IGN0eC0+dXZfc3RyaWRlO1wKKyAgICBVc3RyaWRlID0gY3R4LT51dl9zdHJpZGU7XAorICAgIFkgPSAoY3R4LT5jdXI/Y3R4LT5ZMjpjdHgtPlkxKSArIGJ5ICogNCAqIFlzdHJpZGUgKyBieCAqIDQ7XAorICAgIFYgPSAoY3R4LT5jdXI/Y3R4LT5WMjpjdHgtPlYxKSArIGJ5ICogMiAqIFZzdHJpZGUgKyBieCAqIDI7XAorICAgIFUgPSAoY3R4LT5jdXI/Y3R4LT5VMjpjdHgtPlUxKSArIGJ5ICogMiAqIFVzdHJpZGUgKyBieCAqIDI7XAorICAgIGxhc3QgPSBjdHgtPmxhc3QgKyBieCAqIDQ7XAorICAgIGNsYXN0ID0gY3R4LT5jbGFzdCArIGJ4ICogNDsKKworI2RlZmluZSBUTTJfSU5JVF9QT0lOVEVSU18yKCkgXAorICAgIGludCAqWW8sICpVbywgKlZvO1wKKyAgICBpbnQgb1lzdHJpZGUsIG9Vc3RyaWRlLCBvVnN0cmlkZTtcCitcCisgICAgVE0yX0lOSVRfUE9JTlRFUlMoKTtcCisgICAgb1lzdHJpZGUgPSBZc3RyaWRlO1wKKyAgICBvVnN0cmlkZSA9IFZzdHJpZGU7XAorICAgIG9Vc3RyaWRlID0gVXN0cmlkZTtcCisgICAgWW8gPSAoY3R4LT5jdXI/Y3R4LT5ZMTpjdHgtPlkyKSArIGJ5ICogNCAqIG9Zc3RyaWRlICsgYnggKiA0O1wKKyAgICBWbyA9IChjdHgtPmN1cj9jdHgtPlYxOmN0eC0+VjIpICsgYnkgKiAyICogb1ZzdHJpZGUgKyBieCAqIDI7XAorICAgIFVvID0gKGN0eC0+Y3VyP2N0eC0+VTE6Y3R4LT5VMikgKyBieSAqIDIgKiBvVXN0cmlkZSArIGJ4ICogMjsKKworLyogcmVjYWxjdWxhdGUgbGFzdCBhbmQgZGVsdGEgdmFsdWVzIGZvciBuZXh0IGJsb2NrcyAqLworI2RlZmluZSBUTTJfUkVDQUxDX0JMT0NLKENIUiwgc3RyaWRlLCBsYXN0LCBDRCkge1wKKyAgICBDRFswXSA9IENIUlsxXSAtIGxhc3RbMV07XAorICAgIENEWzFdID0gKGludClDSFJbc3RyaWRlICsgMV0gLSAoaW50KUNIUlsxXTtcCisgICAgbGFzdFswXSA9IChpbnQpQ0hSW3N0cmlkZSArIDBdO1wKKyAgICBsYXN0WzFdID0gKGludClDSFJbc3RyaWRlICsgMV07fQorCisvKiBjb21tb24gb3BlcmF0aW9ucyAtIGFkZCBkZWx0YXMgdG8gNHg0IGJsb2NrIG9mIGx1bWEgb3IgMngyIGJsb2NrcyBvZiBjaHJvbWEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0bTJfYXBwbHlfZGVsdGFzKFRNMkNvbnRleHQgKmN0eCwgaW50KiBZLCBpbnQgc3RyaWRlLCBpbnQgKmRlbHRhcywgaW50ICpsYXN0KQoreworICAgIGludCBjdCwgZDsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspeworICAgICAgICBjdCA9IGN0eC0+RFtqXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKyl7CisgICAgICAgICAgICBkICAgICAgICA9IGRlbHRhc1tpICsgaiAqIDRdOworICAgICAgICAgICAgY3QgICAgICArPSBkOworICAgICAgICAgICAgbGFzdFtpXSArPSBjdDsKKyAgICAgICAgICAgIFlbaV0gICAgID0gYXZfY2xpcF91aW50OChsYXN0W2ldKTsKKyAgICAgICAgfQorICAgICAgICBZICAgICAgICArPSBzdHJpZGU7CisgICAgICAgIGN0eC0+RFtqXSA9IGN0OworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRtMl9oaWdoX2Nocm9tYShpbnQgKmRhdGEsIGludCBzdHJpZGUsIGludCAqbGFzdCwgaW50ICpDRCwgaW50ICpkZWx0YXMpCit7CisgICAgaW50IGksIGo7CisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSAgeworICAgICAgICAgICAgQ0Rbal0gICArPSBkZWx0YXNbaSArIGogKiAyXTsKKyAgICAgICAgICAgIGxhc3RbaV0gKz0gQ0Rbal07CisgICAgICAgICAgICBkYXRhW2ldICA9IGxhc3RbaV07CisgICAgICAgIH0KKyAgICAgICAgZGF0YSArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdG0yX2xvd19jaHJvbWEoaW50ICpkYXRhLCBpbnQgc3RyaWRlLCBpbnQgKmNsYXN0LCBpbnQgKkNELCBpbnQgKmRlbHRhcywgaW50IGJ4KQoreworICAgIGludCB0OworICAgIGludCBsOworICAgIGludCBwcmV2OworCisgICAgaWYgKGJ4ID4gMCkKKyAgICAgICAgcHJldiA9IGNsYXN0Wy0zXTsKKyAgICBlbHNlCisgICAgICAgIHByZXYgPSAwOworICAgIHQgICAgICAgID0gKENEWzBdICsgQ0RbMV0pID4+IDE7CisgICAgbCAgICAgICAgPSAocHJldiAtIENEWzBdIC0gQ0RbMV0gKyBjbGFzdFsxXSkgPj4gMTsKKyAgICBDRFsxXSAgICA9IENEWzBdICsgQ0RbMV0gLSB0OworICAgIENEWzBdICAgID0gdDsKKyAgICBjbGFzdFswXSA9IGw7CisKKyAgICB0bTJfaGlnaF9jaHJvbWEoZGF0YSwgc3RyaWRlLCBjbGFzdCwgQ0QsIGRlbHRhcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bTJfaGlfcmVzX2Jsb2NrKFRNMkNvbnRleHQgKmN0eCwgQVZGcmFtZSAqcGljLCBpbnQgYngsIGludCBieSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZGVsdGFzWzE2XTsKKyAgICBUTTJfSU5JVF9QT0lOVEVSUygpOworCisgICAgLyogaGktcmVzIGNocm9tYSAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgZGVsdGFzW2ldICAgICA9IEdFVF9UT0soY3R4LCBUTTJfQ19ISSk7CisgICAgICAgIGRlbHRhc1tpICsgNF0gPSBHRVRfVE9LKGN0eCwgVE0yX0NfSEkpOworICAgIH0KKyAgICB0bTJfaGlnaF9jaHJvbWEoVSwgVXN0cmlkZSwgY2xhc3QsICAgICBjdHgtPkNELCAgICAgZGVsdGFzKTsKKyAgICB0bTJfaGlnaF9jaHJvbWEoViwgVnN0cmlkZSwgY2xhc3QgKyAyLCBjdHgtPkNEICsgMiwgZGVsdGFzICsgNCk7CisKKyAgICAvKiBoaS1yZXMgbHVtYSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICBkZWx0YXNbaV0gPSBHRVRfVE9LKGN0eCwgVE0yX0xfSEkpOworCisgICAgdG0yX2FwcGx5X2RlbHRhcyhjdHgsIFksIFlzdHJpZGUsIGRlbHRhcywgbGFzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bTJfbWVkX3Jlc19ibG9jayhUTTJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKnBpYywgaW50IGJ4LCBpbnQgYnkpCit7CisgICAgaW50IGk7CisgICAgaW50IGRlbHRhc1sxNl07CisgICAgVE0yX0lOSVRfUE9JTlRFUlMoKTsKKworICAgIC8qIGxvdy1yZXMgY2hyb21hICovCisgICAgZGVsdGFzWzBdID0gR0VUX1RPSyhjdHgsIFRNMl9DX0xPKTsKKyAgICBkZWx0YXNbMV0gPSBkZWx0YXNbMl0gPSBkZWx0YXNbM10gPSAwOworICAgIHRtMl9sb3dfY2hyb21hKFUsIFVzdHJpZGUsIGNsYXN0LCBjdHgtPkNELCBkZWx0YXMsIGJ4KTsKKworICAgIGRlbHRhc1swXSA9IEdFVF9UT0soY3R4LCBUTTJfQ19MTyk7CisgICAgZGVsdGFzWzFdID0gZGVsdGFzWzJdID0gZGVsdGFzWzNdID0gMDsKKyAgICB0bTJfbG93X2Nocm9tYShWLCBWc3RyaWRlLCBjbGFzdCArIDIsIGN0eC0+Q0QgKyAyLCBkZWx0YXMsIGJ4KTsKKworICAgIC8qIGhpLXJlcyBsdW1hICovCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGRlbHRhc1tpXSA9IEdFVF9UT0soY3R4LCBUTTJfTF9ISSk7CisKKyAgICB0bTJfYXBwbHlfZGVsdGFzKGN0eCwgWSwgWXN0cmlkZSwgZGVsdGFzLCBsYXN0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRtMl9sb3dfcmVzX2Jsb2NrKFRNMkNvbnRleHQgKmN0eCwgQVZGcmFtZSAqcGljLCBpbnQgYngsIGludCBieSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgdDEsIHQyOworICAgIGludCBkZWx0YXNbMTZdOworICAgIFRNMl9JTklUX1BPSU5URVJTKCk7CisKKyAgICAvKiBsb3ctcmVzIGNocm9tYSAqLworICAgIGRlbHRhc1swXSA9IEdFVF9UT0soY3R4LCBUTTJfQ19MTyk7CisgICAgZGVsdGFzWzFdID0gZGVsdGFzWzJdID0gZGVsdGFzWzNdID0gMDsKKyAgICB0bTJfbG93X2Nocm9tYShVLCBVc3RyaWRlLCBjbGFzdCwgY3R4LT5DRCwgZGVsdGFzLCBieCk7CisKKyAgICBkZWx0YXNbMF0gPSBHRVRfVE9LKGN0eCwgVE0yX0NfTE8pOworICAgIGRlbHRhc1sxXSA9IGRlbHRhc1syXSA9IGRlbHRhc1szXSA9IDA7CisgICAgdG0yX2xvd19jaHJvbWEoViwgVnN0cmlkZSwgY2xhc3QgKyAyLCBjdHgtPkNEICsgMiwgZGVsdGFzLCBieCk7CisKKyAgICAvKiBsb3ctcmVzIGx1bWEgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgZGVsdGFzW2ldID0gMDsKKworICAgIGRlbHRhc1sgMF0gPSBHRVRfVE9LKGN0eCwgVE0yX0xfTE8pOworICAgIGRlbHRhc1sgMl0gPSBHRVRfVE9LKGN0eCwgVE0yX0xfTE8pOworICAgIGRlbHRhc1sgOF0gPSBHRVRfVE9LKGN0eCwgVE0yX0xfTE8pOworICAgIGRlbHRhc1sxMF0gPSBHRVRfVE9LKGN0eCwgVE0yX0xfTE8pOworCisgICAgaWYgKGJ4ID4gMCkKKyAgICAgICAgbGFzdFswXSA9IChsYXN0Wy0xXSAtIGN0eC0+RFswXSAtIGN0eC0+RFsxXSAtIGN0eC0+RFsyXSAtIGN0eC0+RFszXSArIGxhc3RbMV0pID4+IDE7CisgICAgZWxzZQorICAgICAgICBsYXN0WzBdID0gKGxhc3RbMV0gIC0gY3R4LT5EWzBdIC0gY3R4LT5EWzFdIC0gY3R4LT5EWzJdIC0gY3R4LT5EWzNdKT4+IDE7CisgICAgbGFzdFsyXSA9IChsYXN0WzFdICsgbGFzdFszXSkgPj4gMTsKKworICAgIHQxID0gY3R4LT5EWzBdICsgY3R4LT5EWzFdOworICAgIGN0eC0+RFswXSA9IHQxID4+IDE7CisgICAgY3R4LT5EWzFdID0gdDEgLSAodDEgPj4gMSk7CisgICAgdDIgPSBjdHgtPkRbMl0gKyBjdHgtPkRbM107CisgICAgY3R4LT5EWzJdID0gdDIgPj4gMTsKKyAgICBjdHgtPkRbM10gPSB0MiAtICh0MiA+PiAxKTsKKworICAgIHRtMl9hcHBseV9kZWx0YXMoY3R4LCBZLCBZc3RyaWRlLCBkZWx0YXMsIGxhc3QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdG0yX251bGxfcmVzX2Jsb2NrKFRNMkNvbnRleHQgKmN0eCwgQVZGcmFtZSAqcGljLCBpbnQgYngsIGludCBieSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgY3Q7CisgICAgaW50IGxlZnQsIHJpZ2h0LCBkaWZmOworICAgIGludCBkZWx0YXNbMTZdOworICAgIFRNMl9JTklUX1BPSU5URVJTKCk7CisKKyAgICAvKiBudWxsIGNocm9tYSAqLworICAgIGRlbHRhc1swXSA9IGRlbHRhc1sxXSA9IGRlbHRhc1syXSA9IGRlbHRhc1szXSA9IDA7CisgICAgdG0yX2xvd19jaHJvbWEoVSwgVXN0cmlkZSwgY2xhc3QsIGN0eC0+Q0QsIGRlbHRhcywgYngpOworCisgICAgZGVsdGFzWzBdID0gZGVsdGFzWzFdID0gZGVsdGFzWzJdID0gZGVsdGFzWzNdID0gMDsKKyAgICB0bTJfbG93X2Nocm9tYShWLCBWc3RyaWRlLCBjbGFzdCArIDIsIGN0eC0+Q0QgKyAyLCBkZWx0YXMsIGJ4KTsKKworICAgIC8qIG51bGwgbHVtYSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICBkZWx0YXNbaV0gPSAwOworCisgICAgY3QgPSBjdHgtPkRbMF0gKyBjdHgtPkRbMV0gKyBjdHgtPkRbMl0gKyBjdHgtPkRbM107CisKKyAgICBpZiAoYnggPiAwKQorICAgICAgICBsZWZ0ID0gbGFzdFstMV0gLSBjdDsKKyAgICBlbHNlCisgICAgICAgIGxlZnQgPSAwOworCisgICAgcmlnaHQgICA9IGxhc3RbM107CisgICAgZGlmZiAgICA9IHJpZ2h0IC0gbGVmdDsKKyAgICBsYXN0WzBdID0gbGVmdCArIChkaWZmID4+IDIpOworICAgIGxhc3RbMV0gPSBsZWZ0ICsgKGRpZmYgPj4gMSk7CisgICAgbGFzdFsyXSA9IHJpZ2h0IC0gKGRpZmYgPj4gMik7CisgICAgbGFzdFszXSA9IHJpZ2h0OworICAgIHsKKyAgICAgICAgaW50IHRwID0gbGVmdDsKKworICAgICAgICBjdHgtPkRbMF0gPSAodHAgKyAoY3QgPj4gMikpIC0gbGVmdDsKKyAgICAgICAgbGVmdCAgICAgKz0gY3R4LT5EWzBdOworICAgICAgICBjdHgtPkRbMV0gPSAodHAgKyAoY3QgPj4gMSkpIC0gbGVmdDsKKyAgICAgICAgbGVmdCAgICAgKz0gY3R4LT5EWzFdOworICAgICAgICBjdHgtPkRbMl0gPSAoKHRwICsgY3QpIC0gKGN0ID4+IDIpKSAtIGxlZnQ7CisgICAgICAgIGxlZnQgICAgICs9IGN0eC0+RFsyXTsKKyAgICAgICAgY3R4LT5EWzNdID0gKHRwICsgY3QpIC0gbGVmdDsKKyAgICB9CisgICAgdG0yX2FwcGx5X2RlbHRhcyhjdHgsIFksIFlzdHJpZGUsIGRlbHRhcywgbGFzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bTJfc3RpbGxfYmxvY2soVE0yQ29udGV4dCAqY3R4LCBBVkZyYW1lICpwaWMsIGludCBieCwgaW50IGJ5KQoreworICAgIGludCBpLCBqOworICAgIFRNMl9JTklUX1BPSU5URVJTXzIoKTsKKworICAgIC8qIHVwZGF0ZSBjaHJvbWEgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspeworICAgICAgICAgICAgVVtpXSA9IFVvW2ldOworICAgICAgICAgICAgVltpXSA9IFZvW2ldOworICAgICAgICB9CisgICAgICAgIFUgICs9IFVzdHJpZGU7IFYgKz0gVnN0cmlkZTsKKyAgICAgICAgVW8gKz0gb1VzdHJpZGU7IFZvICs9IG9Wc3RyaWRlOworICAgIH0KKyAgICBVIC09IFVzdHJpZGUgKiAyOworICAgIFYgLT0gVnN0cmlkZSAqIDI7CisgICAgVE0yX1JFQ0FMQ19CTE9DSyhVLCBVc3RyaWRlLCBjbGFzdCwgY3R4LT5DRCk7CisgICAgVE0yX1JFQ0FMQ19CTE9DSyhWLCBWc3RyaWRlLCAoY2xhc3QgKyAyKSwgKGN0eC0+Q0QgKyAyKSk7CisKKyAgICAvKiB1cGRhdGUgZGVsdGFzICovCisgICAgY3R4LT5EWzBdID0gWW9bM10gLSBsYXN0WzNdOworICAgIGN0eC0+RFsxXSA9IFlvWzMgKyBvWXN0cmlkZV0gLSBZb1szXTsKKyAgICBjdHgtPkRbMl0gPSBZb1szICsgb1lzdHJpZGUgKiAyXSAtIFlvWzMgKyBvWXN0cmlkZV07CisgICAgY3R4LT5EWzNdID0gWW9bMyArIG9Zc3RyaWRlICogM10gLSBZb1szICsgb1lzdHJpZGUgKiAyXTsKKworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgWVtpXSAgICA9IFlvW2ldOworICAgICAgICAgICAgbGFzdFtpXSA9IFlvW2ldOworICAgICAgICB9CisgICAgICAgIFkgICs9IFlzdHJpZGU7CisgICAgICAgIFlvICs9IG9Zc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRtMl91cGRhdGVfYmxvY2soVE0yQ29udGV4dCAqY3R4LCBBVkZyYW1lICpwaWMsIGludCBieCwgaW50IGJ5KQoreworICAgIGludCBpLCBqOworICAgIGludCBkOworICAgIFRNMl9JTklUX1BPSU5URVJTXzIoKTsKKworICAgIC8qIHVwZGF0ZSBjaHJvbWEgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIFVbaV0gPSBVb1tpXSArIEdFVF9UT0soY3R4LCBUTTJfVVBEKTsKKyAgICAgICAgICAgIFZbaV0gPSBWb1tpXSArIEdFVF9UT0soY3R4LCBUTTJfVVBEKTsKKyAgICAgICAgfQorICAgICAgICBVICArPSBVc3RyaWRlOworICAgICAgICBWICArPSBWc3RyaWRlOworICAgICAgICBVbyArPSBvVXN0cmlkZTsKKyAgICAgICAgVm8gKz0gb1ZzdHJpZGU7CisgICAgfQorICAgIFUgLT0gVXN0cmlkZSAqIDI7CisgICAgViAtPSBWc3RyaWRlICogMjsKKyAgICBUTTJfUkVDQUxDX0JMT0NLKFUsIFVzdHJpZGUsIGNsYXN0LCBjdHgtPkNEKTsKKyAgICBUTTJfUkVDQUxDX0JMT0NLKFYsIFZzdHJpZGUsIChjbGFzdCArIDIpLCAoY3R4LT5DRCArIDIpKTsKKworICAgIC8qIHVwZGF0ZSBkZWx0YXMgKi8KKyAgICBjdHgtPkRbMF0gPSBZb1szXSAtIGxhc3RbM107CisgICAgY3R4LT5EWzFdID0gWW9bMyArIG9Zc3RyaWRlXSAtIFlvWzNdOworICAgIGN0eC0+RFsyXSA9IFlvWzMgKyBvWXN0cmlkZSAqIDJdIC0gWW9bMyArIG9Zc3RyaWRlXTsKKyAgICBjdHgtPkRbM10gPSBZb1szICsgb1lzdHJpZGUgKiAzXSAtIFlvWzMgKyBvWXN0cmlkZSAqIDJdOworCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICBkID0gbGFzdFszXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgWVtpXSAgICA9IFlvW2ldICsgR0VUX1RPSyhjdHgsIFRNMl9VUEQpOworICAgICAgICAgICAgbGFzdFtpXSA9IFlbaV07CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5EW2pdID0gbGFzdFszXSAtIGQ7CisgICAgICAgIFkgICs9IFlzdHJpZGU7CisgICAgICAgIFlvICs9IG9Zc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRtMl9tb3Rpb25fYmxvY2soVE0yQ29udGV4dCAqY3R4LCBBVkZyYW1lICpwaWMsIGludCBieCwgaW50IGJ5KQoreworICAgIGludCBpLCBqOworICAgIGludCBteCwgbXk7CisgICAgVE0yX0lOSVRfUE9JTlRFUlNfMigpOworCisgICAgbXggPSBHRVRfVE9LKGN0eCwgVE0yX01PVCk7CisgICAgbXkgPSBHRVRfVE9LKGN0eCwgVE0yX01PVCk7CisgICAgbXggPSBhdl9jbGlwKG14LCAtKGJ4ICogNCArIDQpLCBjdHgtPmF2Y3R4LT53aWR0aCAgLSBieCAqIDQpOworICAgIG15ID0gYXZfY2xpcChteSwgLShieSAqIDQgKyA0KSwgY3R4LT5hdmN0eC0+aGVpZ2h0IC0gYnkgKiA0KTsKKworICAgIGlmICg0KmJ4K214PDAgfHwgNCpieStteTwwIHx8IDQqYngrbXgrNCA+IGN0eC0+YXZjdHgtPndpZHRoIHx8IDQqYnkrbXkrNCA+IGN0eC0+YXZjdHgtPmhlaWdodCkgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTVYgb3V0IG9mIHBpY3R1cmVcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgWW8gKz0gbXkgKiBvWXN0cmlkZSArIG14OworICAgIFVvICs9IChteSA+PiAxKSAqIG9Vc3RyaWRlICsgKG14ID4+IDEpOworICAgIFZvICs9IChteSA+PiAxKSAqIG9Wc3RyaWRlICsgKG14ID4+IDEpOworCisgICAgLyogY29weSBjaHJvbWEgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIFVbaV0gPSBVb1tpXTsKKyAgICAgICAgICAgIFZbaV0gPSBWb1tpXTsKKyAgICAgICAgfQorICAgICAgICBVICArPSBVc3RyaWRlOworICAgICAgICBWICArPSBWc3RyaWRlOworICAgICAgICBVbyArPSBvVXN0cmlkZTsKKyAgICAgICAgVm8gKz0gb1ZzdHJpZGU7CisgICAgfQorICAgIFUgLT0gVXN0cmlkZSAqIDI7CisgICAgViAtPSBWc3RyaWRlICogMjsKKyAgICBUTTJfUkVDQUxDX0JMT0NLKFUsIFVzdHJpZGUsIGNsYXN0LCBjdHgtPkNEKTsKKyAgICBUTTJfUkVDQUxDX0JMT0NLKFYsIFZzdHJpZGUsIChjbGFzdCArIDIpLCAoY3R4LT5DRCArIDIpKTsKKworICAgIC8qIGNvcHkgbHVtYSAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgWVtpXSA9IFlvW2ldOworICAgICAgICB9CisgICAgICAgIFkgICs9IFlzdHJpZGU7CisgICAgICAgIFlvICs9IG9Zc3RyaWRlOworICAgIH0KKyAgICAvKiBjYWxjdWxhdGUgZGVsdGFzICovCisgICAgWSAtPSBZc3RyaWRlICogNDsKKyAgICBjdHgtPkRbMF0gPSBZWzNdIC0gbGFzdFszXTsKKyAgICBjdHgtPkRbMV0gPSBZWzMgKyBZc3RyaWRlXSAtIFlbM107CisgICAgY3R4LT5EWzJdID0gWVszICsgWXN0cmlkZSAqIDJdIC0gWVszICsgWXN0cmlkZV07CisgICAgY3R4LT5EWzNdID0gWVszICsgWXN0cmlkZSAqIDNdIC0gWVszICsgWXN0cmlkZSAqIDJdOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGxhc3RbaV0gPSBZW2kgKyBZc3RyaWRlICogM107Cit9CisKK3N0YXRpYyBpbnQgdG0yX2RlY29kZV9ibG9ja3MoVE0yQ29udGV4dCAqY3R4LCBBVkZyYW1lICpwKQoreworICAgIGludCBpLCBqOworICAgIGludCB3ID0gY3R4LT5hdmN0eC0+d2lkdGgsIGggPSBjdHgtPmF2Y3R4LT5oZWlnaHQsIGJ3ID0gdyA+PiAyLCBiaCA9IGggPj4gMiwgY3cgPSB3ID4+IDE7CisgICAgaW50IHR5cGU7CisgICAgaW50IGtleWZyYW1lID0gMTsKKyAgICBpbnQgKlksICpVLCAqVjsKKyAgICB1aW50OF90ICpkc3Q7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVE0yX05VTV9TVFJFQU1TOyBpKyspCisgICAgICAgIGN0eC0+dG9rX3B0cnNbaV0gPSAwOworCisgICAgaWYgKGN0eC0+dG9rX2xlbnNbVE0yX1RZUEVdPGJ3KmJoKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LEFWX0xPR19FUlJPUiwiR290ICVpIHRva2VucyBmb3IgJWkgYmxvY2tzXG4iLGN0eC0+dG9rX2xlbnNbVE0yX1RZUEVdLGJ3KmJoKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgbWVtc2V0KGN0eC0+bGFzdCwgMCwgNCAqIGJ3ICogc2l6ZW9mKGludCkpOworICAgIG1lbXNldChjdHgtPmNsYXN0LCAwLCA0ICogYncgKiBzaXplb2YoaW50KSk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgYmg7IGorKykgeworICAgICAgICBtZW1zZXQoY3R4LT5ELCAwLCA0ICogc2l6ZW9mKGludCkpOworICAgICAgICBtZW1zZXQoY3R4LT5DRCwgMCwgNCAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ3OyBpKyspIHsKKyAgICAgICAgICAgIHR5cGUgPSBHRVRfVE9LKGN0eCwgVE0yX1RZUEUpOworICAgICAgICAgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVE0yX0hJX1JFUzoKKyAgICAgICAgICAgICAgICB0bTJfaGlfcmVzX2Jsb2NrKGN0eCwgcCwgaSwgaik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRNMl9NRURfUkVTOgorICAgICAgICAgICAgICAgIHRtMl9tZWRfcmVzX2Jsb2NrKGN0eCwgcCwgaSwgaik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRNMl9MT1dfUkVTOgorICAgICAgICAgICAgICAgIHRtMl9sb3dfcmVzX2Jsb2NrKGN0eCwgcCwgaSwgaik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRNMl9OVUxMX1JFUzoKKyAgICAgICAgICAgICAgICB0bTJfbnVsbF9yZXNfYmxvY2soY3R4LCBwLCBpLCBqKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVE0yX1VQREFURToKKyAgICAgICAgICAgICAgICB0bTJfdXBkYXRlX2Jsb2NrKGN0eCwgcCwgaSwgaik7CisgICAgICAgICAgICAgICAga2V5ZnJhbWUgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUTTJfU1RJTEw6CisgICAgICAgICAgICAgICAgdG0yX3N0aWxsX2Jsb2NrKGN0eCwgcCwgaSwgaik7CisgICAgICAgICAgICAgICAga2V5ZnJhbWUgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUTTJfTU9USU9OOgorICAgICAgICAgICAgICAgIHRtMl9tb3Rpb25fYmxvY2soY3R4LCBwLCBpLCBqKTsKKyAgICAgICAgICAgICAgICBrZXlmcmFtZSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJTa2lwcGluZyB1bmtub3duIGJsb2NrIHR5cGUgJWlcbiIsIHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogY29weSBkYXRhIGZyb20gb3VyIGJ1ZmZlciB0byBBVkZyYW1lICovCisgICAgWSA9IChjdHgtPmN1cj9jdHgtPlkyOmN0eC0+WTEpOworICAgIFUgPSAoY3R4LT5jdXI/Y3R4LT5VMjpjdHgtPlUxKTsKKyAgICBWID0gKGN0eC0+Y3VyP2N0eC0+VjI6Y3R4LT5WMSk7CisgICAgZHN0ID0gcC0+ZGF0YVswXTsKKyAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgICAgIGludCB5ID0gWVtpXSwgdSA9IFVbaSA+PiAxXSwgdiA9IFZbaSA+PiAxXTsKKyAgICAgICAgICAgIGRzdFszKmkrMF0gPSBhdl9jbGlwX3VpbnQ4KHkgKyB2KTsKKyAgICAgICAgICAgIGRzdFszKmkrMV0gPSBhdl9jbGlwX3VpbnQ4KHkpOworICAgICAgICAgICAgZHN0WzMqaSsyXSA9IGF2X2NsaXBfdWludDgoeSArIHUpOworICAgICAgICB9CisKKyAgICAgICAgLyogaG9yaXpvbnRhbCBlZGdlIGV4dGVuc2lvbiAqLworICAgICAgICBZWy00XSAgICA9IFlbLTNdICAgID0gWVstMl0gICAgPSBZWy0xXSA9IFlbMF07CisgICAgICAgIFlbdyArIDNdID0gWVt3ICsgMl0gPSBZW3cgKyAxXSA9IFlbd10gID0gWVt3IC0gMV07CisKKyAgICAgICAgLyogdmVydGljYWwgZWRnZSBleHRlbnNpb24gKi8KKyAgICAgICAgaWYgKGogPT0gMCkgeworICAgICAgICAgICAgbWVtY3B5KFkgLSA0IC0gMSAqIGN0eC0+eV9zdHJpZGUsIFkgLSA0LCBjdHgtPnlfc3RyaWRlKTsKKyAgICAgICAgICAgIG1lbWNweShZIC0gNCAtIDIgKiBjdHgtPnlfc3RyaWRlLCBZIC0gNCwgY3R4LT55X3N0cmlkZSk7CisgICAgICAgICAgICBtZW1jcHkoWSAtIDQgLSAzICogY3R4LT55X3N0cmlkZSwgWSAtIDQsIGN0eC0+eV9zdHJpZGUpOworICAgICAgICAgICAgbWVtY3B5KFkgLSA0IC0gNCAqIGN0eC0+eV9zdHJpZGUsIFkgLSA0LCBjdHgtPnlfc3RyaWRlKTsKKyAgICAgICAgfSBlbHNlIGlmIChqID09IGggLSAxKSB7CisgICAgICAgICAgICBtZW1jcHkoWSAtIDQgKyAxICogY3R4LT55X3N0cmlkZSwgWSAtIDQsIGN0eC0+eV9zdHJpZGUpOworICAgICAgICAgICAgbWVtY3B5KFkgLSA0ICsgMiAqIGN0eC0+eV9zdHJpZGUsIFkgLSA0LCBjdHgtPnlfc3RyaWRlKTsKKyAgICAgICAgICAgIG1lbWNweShZIC0gNCArIDMgKiBjdHgtPnlfc3RyaWRlLCBZIC0gNCwgY3R4LT55X3N0cmlkZSk7CisgICAgICAgICAgICBtZW1jcHkoWSAtIDQgKyA0ICogY3R4LT55X3N0cmlkZSwgWSAtIDQsIGN0eC0+eV9zdHJpZGUpOworICAgICAgICB9CisKKyAgICAgICAgWSArPSBjdHgtPnlfc3RyaWRlOworICAgICAgICBpZiAoaiAmIDEpIHsKKyAgICAgICAgICAgIC8qIGhvcml6b250YWwgZWRnZSBleHRlbnNpb24gKi8KKyAgICAgICAgICAgIFVbLTJdICAgICA9IFVbLTFdID0gVVswXTsKKyAgICAgICAgICAgIFZbLTJdICAgICA9IFZbLTFdID0gVlswXTsKKyAgICAgICAgICAgIFVbY3cgKyAxXSA9IFVbY3ddID0gVVtjdyAtIDFdOworICAgICAgICAgICAgVltjdyArIDFdID0gVltjd10gPSBWW2N3IC0gMV07CisKKyAgICAgICAgICAgIC8qIHZlcnRpY2FsIGVkZ2UgZXh0ZW5zaW9uICovCisgICAgICAgICAgICBpZiAoaiA9PSAxKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KFUgLSAyIC0gMSAqIGN0eC0+dXZfc3RyaWRlLCBVIC0gMiwgY3R4LT51dl9zdHJpZGUpOworICAgICAgICAgICAgICAgIG1lbWNweShWIC0gMiAtIDEgKiBjdHgtPnV2X3N0cmlkZSwgViAtIDIsIGN0eC0+dXZfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoVSAtIDIgLSAyICogY3R4LT51dl9zdHJpZGUsIFUgLSAyLCBjdHgtPnV2X3N0cmlkZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KFYgLSAyIC0gMiAqIGN0eC0+dXZfc3RyaWRlLCBWIC0gMiwgY3R4LT51dl9zdHJpZGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChqID09IGggLSAxKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KFUgLSAyICsgMSAqIGN0eC0+dXZfc3RyaWRlLCBVIC0gMiwgY3R4LT51dl9zdHJpZGUpOworICAgICAgICAgICAgICAgIG1lbWNweShWIC0gMiArIDEgKiBjdHgtPnV2X3N0cmlkZSwgViAtIDIsIGN0eC0+dXZfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoVSAtIDIgKyAyICogY3R4LT51dl9zdHJpZGUsIFUgLSAyLCBjdHgtPnV2X3N0cmlkZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KFYgLSAyICsgMiAqIGN0eC0+dXZfc3RyaWRlLCBWIC0gMiwgY3R4LT51dl9zdHJpZGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBVICs9IGN0eC0+dXZfc3RyaWRlOworICAgICAgICAgICAgViArPSBjdHgtPnV2X3N0cmlkZTsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gcC0+bGluZXNpemVbMF07CisgICAgfQorCisgICAgcmV0dXJuIGtleWZyYW1lOworfQorCitzdGF0aWMgY29uc3QgaW50IHRtMl9zdHJlYW1fb3JkZXJbVE0yX05VTV9TVFJFQU1TXSA9IHsKKyAgICBUTTJfQ19ISSwgVE0yX0NfTE8sIFRNMl9MX0hJLCBUTTJfTF9MTywgVE0yX1VQRCwgVE0yX01PVCwgVE0yX1RZUEUKK307CisKKyNkZWZpbmUgVE0yX0hFQURFUl9TSVpFIDQwCisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFRNMkNvbnRleHQgKiBjb25zdCBsID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgICA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgID0gYXZwa3QtPnNpemUgJiB+MzsKKyAgICBBVkZyYW1lICogY29uc3QgcCAgICA9IGwtPnBpYzsKKyAgICBpbnQgb2Zmc2V0ICAgICAgICAgICA9IFRNMl9IRUFERVJfU0laRTsKKyAgICBpbnQgaSwgdCwgcmV0OworCisgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZsLT5idWZmZXIsICZsLT5idWZmZXJfc2l6ZSwgYnVmX3NpemUpOworICAgIGlmICghbC0+YnVmZmVyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgbC0+YmRzcC5ic3dhcF9idWYoKHVpbnQzMl90ICopIGwtPmJ1ZmZlciwgKGNvbnN0IHVpbnQzMl90ICopIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSA+PiAyKTsKKworICAgIGlmICgocmV0ID0gdG0yX3JlYWRfaGVhZGVyKGwsIGwtPmJ1ZmZlcikpIDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBUTTJfTlVNX1NUUkVBTVM7IGkrKykgeworICAgICAgICBpZiAob2Zmc2V0ID49IGJ1Zl9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm5vIHNwYWNlIGZvciB0bTJfcmVhZF9zdHJlYW1cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICB0ID0gdG0yX3JlYWRfc3RyZWFtKGwsIGwtPmJ1ZmZlciArIG9mZnNldCwgdG0yX3N0cmVhbV9vcmRlcltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSAtIG9mZnNldCk7CisgICAgICAgIGlmICh0IDwgMCkgeworICAgICAgICAgICAgaW50IGogPSB0bTJfc3RyZWFtX29yZGVyW2ldOworICAgICAgICAgICAgbWVtc2V0KGwtPnRva2Vuc1tqXSwgMCwgc2l6ZW9mKCoqbC0+dG9rZW5zKSAqIGwtPnRva19sZW5zW2pdKTsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSB0OworICAgIH0KKyAgICBwLT5rZXlfZnJhbWUgPSB0bTJfZGVjb2RlX2Jsb2NrcyhsLCBwKTsKKyAgICBpZiAocC0+a2V5X2ZyYW1lKQorICAgICAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBlbHNlCisgICAgICAgIHAtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworCisgICAgbC0+Y3VyID0gIWwtPmN1cjsKKyAgICAqZ290X2ZyYW1lICAgICAgPSAxOworICAgIHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBsLT5waWMpOworCisgICAgcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRNMkNvbnRleHQgKiBjb25zdCBsID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgdyA9IGF2Y3R4LT53aWR0aCwgaCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICBpZiAoKGF2Y3R4LT53aWR0aCAmIDMpIHx8IChhdmN0eC0+aGVpZ2h0ICYgMykpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJXaWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgbXVsdGlwbGUgb2YgNFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgbC0+YXZjdHggICAgICAgPSBhdmN0eDsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQ7CisKKyAgICBsLT5waWMgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghbC0+cGljKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZmZfYnN3YXBkc3BfaW5pdCgmbC0+YmRzcCk7CisKKyAgICBsLT5sYXN0ICA9IGF2X21hbGxvY19hcnJheSh3ID4+IDIsIDQgKiBzaXplb2YoKmwtPmxhc3QpICk7CisgICAgbC0+Y2xhc3QgPSBhdl9tYWxsb2NfYXJyYXkodyA+PiAyLCA0ICogc2l6ZW9mKCpsLT5jbGFzdCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IFRNMl9OVU1fU1RSRUFNUzsgaSsrKSB7CisgICAgICAgIGwtPnRva2Vuc1tpXSA9IE5VTEw7CisgICAgICAgIGwtPnRva19sZW5zW2ldID0gMDsKKyAgICB9CisKKyAgICB3ICs9IDg7CisgICAgaCArPSA4OworICAgIGwtPlkxX2Jhc2UgPSBhdl9jYWxsb2ModyAqIGgsIHNpemVvZigqbC0+WTFfYmFzZSkpOworICAgIGwtPlkyX2Jhc2UgPSBhdl9jYWxsb2ModyAqIGgsIHNpemVvZigqbC0+WTJfYmFzZSkpOworICAgIGwtPnlfc3RyaWRlID0gdzsKKyAgICB3ID0gKHcgKyAxKSA+PiAxOworICAgIGggPSAoaCArIDEpID4+IDE7CisgICAgbC0+VTFfYmFzZSA9IGF2X2NhbGxvYyh3ICogaCwgc2l6ZW9mKCpsLT5VMV9iYXNlKSk7CisgICAgbC0+VjFfYmFzZSA9IGF2X2NhbGxvYyh3ICogaCwgc2l6ZW9mKCpsLT5WMV9iYXNlKSk7CisgICAgbC0+VTJfYmFzZSA9IGF2X2NhbGxvYyh3ICogaCwgc2l6ZW9mKCpsLT5VMl9iYXNlKSk7CisgICAgbC0+VjJfYmFzZSA9IGF2X2NhbGxvYyh3ICogaCwgc2l6ZW9mKCpsLT5WMV9iYXNlKSk7CisgICAgbC0+dXZfc3RyaWRlID0gdzsKKyAgICBsLT5jdXIgPSAwOworICAgIGlmICghbC0+WTFfYmFzZSB8fCAhbC0+WTJfYmFzZSB8fCAhbC0+VTFfYmFzZSB8fAorICAgICAgICAhbC0+VjFfYmFzZSB8fCAhbC0+VTJfYmFzZSB8fCAhbC0+VjJfYmFzZSB8fAorICAgICAgICAhbC0+bGFzdCAgICB8fCAhbC0+Y2xhc3QpIHsKKyAgICAgICAgYXZfZnJlZXAoJmwtPlkxX2Jhc2UpOworICAgICAgICBhdl9mcmVlcCgmbC0+WTJfYmFzZSk7CisgICAgICAgIGF2X2ZyZWVwKCZsLT5VMV9iYXNlKTsKKyAgICAgICAgYXZfZnJlZXAoJmwtPlUyX2Jhc2UpOworICAgICAgICBhdl9mcmVlcCgmbC0+VjFfYmFzZSk7CisgICAgICAgIGF2X2ZyZWVwKCZsLT5WMl9iYXNlKTsKKyAgICAgICAgYXZfZnJlZXAoJmwtPmxhc3QpOworICAgICAgICBhdl9mcmVlcCgmbC0+Y2xhc3QpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZsLT5waWMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBsLT5ZMSA9IGwtPlkxX2Jhc2UgKyBsLT55X3N0cmlkZSAgKiA0ICsgNDsKKyAgICBsLT5ZMiA9IGwtPlkyX2Jhc2UgKyBsLT55X3N0cmlkZSAgKiA0ICsgNDsKKyAgICBsLT5VMSA9IGwtPlUxX2Jhc2UgKyBsLT51dl9zdHJpZGUgKiAyICsgMjsKKyAgICBsLT5VMiA9IGwtPlUyX2Jhc2UgKyBsLT51dl9zdHJpZGUgKiAyICsgMjsKKyAgICBsLT5WMSA9IGwtPlYxX2Jhc2UgKyBsLT51dl9zdHJpZGUgKiAyICsgMjsKKyAgICBsLT5WMiA9IGwtPlYyX2Jhc2UgKyBsLT51dl9zdHJpZGUgKiAyICsgMjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVE0yQ29udGV4dCAqIGNvbnN0IGwgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgYXZfZnJlZShsLT5sYXN0KTsKKyAgICBhdl9mcmVlKGwtPmNsYXN0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVE0yX05VTV9TVFJFQU1TOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZsLT50b2tlbnNbaV0pOworICAgIGlmIChsLT5ZMSkgeworICAgICAgICBhdl9mcmVlcCgmbC0+WTFfYmFzZSk7CisgICAgICAgIGF2X2ZyZWVwKCZsLT5VMV9iYXNlKTsKKyAgICAgICAgYXZfZnJlZXAoJmwtPlYxX2Jhc2UpOworICAgICAgICBhdl9mcmVlcCgmbC0+WTJfYmFzZSk7CisgICAgICAgIGF2X2ZyZWVwKCZsLT5VMl9iYXNlKTsKKyAgICAgICAgYXZfZnJlZXAoJmwtPlYyX2Jhc2UpOworICAgIH0KKyAgICBhdl9mcmVlcCgmbC0+YnVmZmVyKTsKKyAgICBsLT5idWZmZXJfc2l6ZSA9IDA7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZsLT5waWMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfdHJ1ZW1vdGlvbjJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidHJ1ZW1vdGlvbjIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEdWNrIFRydWVNb3Rpb24gMi4wIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1RSVUVNT1RJT04yLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUTTJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3RydWVzcGVlY2guYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RydWVzcGVlY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDBhNDVmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHJ1ZXNwZWVjaC5jCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogRFNQIEdyb3VwIFRydWVTcGVlY2ggY29tcGF0aWJsZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJic3dhcGRzcC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgInRydWVzcGVlY2hfZGF0YS5oIgorLyoqCisgKiBAZmlsZQorICogVHJ1ZVNwZWVjaCBkZWNvZGVyLgorICovCisKKy8qKgorICogVHJ1ZVNwZWVjaCBkZWNvZGVyIGNvbnRleHQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJzd2FwRFNQQ29udGV4dCBiZHNwOworICAgIC8qIGlucHV0IGRhdGEgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHVpbnQ4X3QsIGJ1ZmZlcilbMzJdOworICAgIGludDE2X3QgdmVjdG9yWzhdOyAgLy8vPCBpbnB1dCB2ZWN0b3I6IDUvNS80LzQvNC8zLzMvMworICAgIGludCBvZmZzZXQxWzJdOyAgICAgLy8vPCA4LWJpdCB2YWx1ZSwgdXNlZCBpbiBvbmUgY29weWluZyBvZmZzZXQKKyAgICBpbnQgb2Zmc2V0Mls0XTsgICAgIC8vLzwgNy1iaXQgdmFsdWUsIGVuY29kZXMgb2Zmc2V0cyBmb3IgY29weWluZyBhbmQgZm9yIHR3by1wb2ludCBmaWx0ZXIKKyAgICBpbnQgcHVsc2VvZmZbNF07ICAgIC8vLzwgNC1iaXQgb2Zmc2V0IG9mIHB1bHNlIHZhbHVlcyBibG9jaworICAgIGludCBwdWxzZXBvc1s0XTsgICAgLy8vPCAyNy1iaXQgdmFyaWFibGUsIGVuY29kZXMgNyBwdWxzZSBwb3NpdGlvbnMKKyAgICBpbnQgcHVsc2V2YWxbNF07ICAgIC8vLzwgN3gyLWJpdCBwdWxzZSB2YWx1ZXMKKyAgICBpbnQgZmxhZzsgICAgICAgICAgIC8vLzwgMS1iaXQgZmxhZywgc2hvd3MgaG93IHRvIGNob29zZSBmaWx0ZXJzCisgICAgLyogdGVtcG9yYXJ5IGRhdGEgKi8KKyAgICBpbnQgZmlsdGJ1ZlsxNDZdOyAgIC8vIHNvbWUgYmlnIHZlY3RvciB1c2VkIGZvciBzdG9yaW5nIGZpbHRlcnMKKyAgICBpbnQgcHJldmZpbHRbOF07ICAgIC8vIGZpbHRlciBmcm9tIHByZXZpb3VzIGZyYW1lCisgICAgaW50MTZfdCB0bXAxWzhdOyAgICAvLyBjb2VmZmljaWVudHMgZm9yIGFkZGluZyB0byBvdXQKKyAgICBpbnQxNl90IHRtcDJbOF07ICAgIC8vIGNvZWZmaWNpZW50cyBmb3IgYWRkaW5nIHRvIG91dAorICAgIGludDE2X3QgdG1wM1s4XTsgICAgLy8gY29lZmZpY2llbnRzIGZvciBhZGRpbmcgdG8gb3V0CisgICAgaW50MTZfdCBjdmVjdG9yWzhdOyAvLyBjb3JyZWxhdGVkIGlucHV0IHZlY3RvcgorICAgIGludCBmaWx0dmFsOyAgICAgICAgLy8gZ2FpbiB2YWx1ZSBmb3Igb25lIGZ1bmN0aW9uCisgICAgaW50MTZfdCBuZXd2ZWNbNjBdOyAvLyB0bXAgdmVjdG9yCisgICAgaW50MTZfdCBmaWx0ZXJzWzMyXTsgLy8gZmlsdGVycyBmb3IgZXZlcnkgc3ViZnJhbWUKK30gVFNDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgdHJ1ZXNwZWVjaF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqIGF2Y3R4KQoreworICAgIFRTQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiQ2hhbm5lbCBjb3VudCAlZCIsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCAgICAgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKworICAgIGZmX2Jzd2FwZHNwX2luaXQoJmMtPmJkc3ApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRydWVzcGVlY2hfcmVhZF9mcmFtZShUU0NvbnRleHQgKmRlYywgY29uc3QgdWludDhfdCAqaW5wdXQpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKworICAgIGRlYy0+YmRzcC5ic3dhcF9idWYoKHVpbnQzMl90ICopIGRlYy0+YnVmZmVyLCAoY29uc3QgdWludDMyX3QgKikgaW5wdXQsIDgpOworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBkZWMtPmJ1ZmZlciwgMzIgKiA4KTsKKworICAgIGRlYy0+dmVjdG9yWzddID0gdHNfY29kZWJvb2tbN11bZ2V0X2JpdHMoJmdiLCAzKV07CisgICAgZGVjLT52ZWN0b3JbNl0gPSB0c19jb2RlYm9va1s2XVtnZXRfYml0cygmZ2IsIDMpXTsKKyAgICBkZWMtPnZlY3Rvcls1XSA9IHRzX2NvZGVib29rWzVdW2dldF9iaXRzKCZnYiwgMyldOworICAgIGRlYy0+dmVjdG9yWzRdID0gdHNfY29kZWJvb2tbNF1bZ2V0X2JpdHMoJmdiLCA0KV07CisgICAgZGVjLT52ZWN0b3JbM10gPSB0c19jb2RlYm9va1szXVtnZXRfYml0cygmZ2IsIDQpXTsKKyAgICBkZWMtPnZlY3RvclsyXSA9IHRzX2NvZGVib29rWzJdW2dldF9iaXRzKCZnYiwgNCldOworICAgIGRlYy0+dmVjdG9yWzFdID0gdHNfY29kZWJvb2tbMV1bZ2V0X2JpdHMoJmdiLCA1KV07CisgICAgZGVjLT52ZWN0b3JbMF0gPSB0c19jb2RlYm9va1swXVtnZXRfYml0cygmZ2IsIDUpXTsKKyAgICBkZWMtPmZsYWcgICAgICA9IGdldF9iaXRzMSgmZ2IpOworCisgICAgZGVjLT5vZmZzZXQxWzBdID0gZ2V0X2JpdHMoJmdiLCA0KSA8PCA0OworICAgIGRlYy0+b2Zmc2V0MlszXSA9IGdldF9iaXRzKCZnYiwgNyk7CisgICAgZGVjLT5vZmZzZXQyWzJdID0gZ2V0X2JpdHMoJmdiLCA3KTsKKyAgICBkZWMtPm9mZnNldDJbMV0gPSBnZXRfYml0cygmZ2IsIDcpOworICAgIGRlYy0+b2Zmc2V0MlswXSA9IGdldF9iaXRzKCZnYiwgNyk7CisKKyAgICBkZWMtPm9mZnNldDFbMV0gID0gZ2V0X2JpdHMoJmdiLCA0KTsKKyAgICBkZWMtPnB1bHNldmFsWzFdID0gZ2V0X2JpdHMoJmdiLCAxNCk7CisgICAgZGVjLT5wdWxzZXZhbFswXSA9IGdldF9iaXRzKCZnYiwgMTQpOworCisgICAgZGVjLT5vZmZzZXQxWzFdIHw9IGdldF9iaXRzKCZnYiwgNCkgPDwgNDsKKyAgICBkZWMtPnB1bHNldmFsWzNdID0gZ2V0X2JpdHMoJmdiLCAxNCk7CisgICAgZGVjLT5wdWxzZXZhbFsyXSA9IGdldF9iaXRzKCZnYiwgMTQpOworCisgICAgZGVjLT5vZmZzZXQxWzBdIHw9IGdldF9iaXRzMSgmZ2IpOworICAgIGRlYy0+cHVsc2Vwb3NbMF0gPSBnZXRfYml0c19sb25nKCZnYiwgMjcpOworICAgIGRlYy0+cHVsc2VvZmZbMF0gPSBnZXRfYml0cygmZ2IsIDQpOworCisgICAgZGVjLT5vZmZzZXQxWzBdIHw9IGdldF9iaXRzMSgmZ2IpIDw8IDE7CisgICAgZGVjLT5wdWxzZXBvc1sxXSA9IGdldF9iaXRzX2xvbmcoJmdiLCAyNyk7CisgICAgZGVjLT5wdWxzZW9mZlsxXSA9IGdldF9iaXRzKCZnYiwgNCk7CisKKyAgICBkZWMtPm9mZnNldDFbMF0gfD0gZ2V0X2JpdHMxKCZnYikgPDwgMjsKKyAgICBkZWMtPnB1bHNlcG9zWzJdID0gZ2V0X2JpdHNfbG9uZygmZ2IsIDI3KTsKKyAgICBkZWMtPnB1bHNlb2ZmWzJdID0gZ2V0X2JpdHMoJmdiLCA0KTsKKworICAgIGRlYy0+b2Zmc2V0MVswXSB8PSBnZXRfYml0czEoJmdiKSA8PCAzOworICAgIGRlYy0+cHVsc2Vwb3NbM10gPSBnZXRfYml0c19sb25nKCZnYiwgMjcpOworICAgIGRlYy0+cHVsc2VvZmZbM10gPSBnZXRfYml0cygmZ2IsIDQpOworfQorCitzdGF0aWMgdm9pZCB0cnVlc3BlZWNoX2NvcnJlbGF0ZV9maWx0ZXIoVFNDb250ZXh0ICpkZWMpCit7CisgICAgaW50MTZfdCB0bXBbOF07CisgICAgaW50IGksIGo7CisKKyAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspeworICAgICAgICBpZihpID4gMCl7CisgICAgICAgICAgICBtZW1jcHkodG1wLCBkZWMtPmN2ZWN0b3IsIGkgKiBzaXplb2YoKnRtcCkpOworICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgICAgIGRlYy0+Y3ZlY3RvcltqXSA9ICgodG1wW2kgLSBqIC0gMV0gKiBkZWMtPnZlY3RvcltpXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjLT5jdmVjdG9yW2pdIDw8IDE1KSArIDB4NDAwMCkgPj4gMTU7CisgICAgICAgIH0KKyAgICAgICAgZGVjLT5jdmVjdG9yW2ldID0gKDggLSBkZWMtPnZlY3RvcltpXSkgPj4gMzsKKyAgICB9CisgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBkZWMtPmN2ZWN0b3JbaV0gPSAoZGVjLT5jdmVjdG9yW2ldICogdHNfZGVjYXlfOTk0XzEwMDBbaV0pID4+IDE1OworCisgICAgZGVjLT5maWx0dmFsID0gZGVjLT52ZWN0b3JbMF07Cit9CisKK3N0YXRpYyB2b2lkIHRydWVzcGVlY2hfZmlsdGVyc19tZXJnZShUU0NvbnRleHQgKmRlYykKK3sKKyAgICBpbnQgaTsKKworICAgIGlmKCFkZWMtPmZsYWcpeworICAgICAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspeworICAgICAgICAgICAgZGVjLT5maWx0ZXJzW2kgKyAwXSA9IGRlYy0+cHJldmZpbHRbaV07CisgICAgICAgICAgICBkZWMtPmZpbHRlcnNbaSArIDhdID0gZGVjLT5wcmV2ZmlsdFtpXTsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspeworICAgICAgICAgICAgZGVjLT5maWx0ZXJzW2kgKyAwXT0oZGVjLT5jdmVjdG9yW2ldICogMjE4NDYgKyBkZWMtPnByZXZmaWx0W2ldICogMTA5MjMgKyAxNjM4NCkgPj4gMTU7CisgICAgICAgICAgICBkZWMtPmZpbHRlcnNbaSArIDhdPShkZWMtPmN2ZWN0b3JbaV0gKiAxMDkyMyArIGRlYy0+cHJldmZpbHRbaV0gKiAyMTg0NiArIDE2Mzg0KSA+PiAxNTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspeworICAgICAgICBkZWMtPmZpbHRlcnNbaSArIDE2XSA9IGRlYy0+Y3ZlY3RvcltpXTsKKyAgICAgICAgZGVjLT5maWx0ZXJzW2kgKyAyNF0gPSBkZWMtPmN2ZWN0b3JbaV07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0cnVlc3BlZWNoX2FwcGx5X3R3b3BvaW50X2ZpbHRlcihUU0NvbnRleHQgKmRlYywgaW50IHF1YXJ0KQoreworICAgIGludDE2X3QgdG1wWzE0NiArIDYwXSwgKnB0cjAsICpwdHIxOworICAgIGNvbnN0IGludDE2X3QgKmZpbHRlcjsKKyAgICBpbnQgaSwgdCwgb2ZmOworCisgICAgdCA9IGRlYy0+b2Zmc2V0MltxdWFydF07CisgICAgaWYodCA9PSAxMjcpeworICAgICAgICBtZW1zZXQoZGVjLT5uZXd2ZWMsIDAsIDYwICogc2l6ZW9mKCpkZWMtPm5ld3ZlYykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvcihpID0gMDsgaSA8IDE0NjsgaSsrKQorICAgICAgICB0bXBbaV0gPSBkZWMtPmZpbHRidWZbaV07CisgICAgb2ZmID0gKHQgLyAyNSkgKyBkZWMtPm9mZnNldDFbcXVhcnQgPj4gMV0gKyAxODsKKyAgICBvZmYgPSBhdl9jbGlwKG9mZiwgMCwgMTQ1KTsKKyAgICBwdHIwID0gdG1wICsgMTQ1IC0gb2ZmOworICAgIHB0cjEgPSB0bXAgKyAxNDY7CisgICAgZmlsdGVyID0gdHNfb3JkZXIyX2NvZWZmcyArICh0ICUgMjUpICogMjsKKyAgICBmb3IoaSA9IDA7IGkgPCA2MDsgaSsrKXsKKyAgICAgICAgdCA9IChwdHIwWzBdICogZmlsdGVyWzBdICsgcHRyMFsxXSAqIGZpbHRlclsxXSArIDB4MjAwMCkgPj4gMTQ7CisgICAgICAgIHB0cjArKzsKKyAgICAgICAgZGVjLT5uZXd2ZWNbaV0gPSB0OworICAgICAgICBwdHIxW2ldID0gdDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRydWVzcGVlY2hfcGxhY2VfcHVsc2VzKFRTQ29udGV4dCAqZGVjLCBpbnQxNl90ICpvdXQsIGludCBxdWFydCkKK3sKKyAgICBpbnQxNl90IHRtcFs3XTsKKyAgICBpbnQgaSwgaiwgdDsKKyAgICBjb25zdCBpbnQxNl90ICpwdHIxOworICAgIGludDE2X3QgKnB0cjI7CisgICAgaW50IGNvZWY7CisKKyAgICBtZW1zZXQob3V0LCAwLCA2MCAqIHNpemVvZigqb3V0KSk7CisgICAgZm9yKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgICAgICAgIHQgPSBkZWMtPnB1bHNldmFsW3F1YXJ0XSAmIDM7CisgICAgICAgIGRlYy0+cHVsc2V2YWxbcXVhcnRdID4+PSAyOworICAgICAgICB0bXBbNiAtIGldID0gdHNfcHVsc2Vfc2NhbGVzW2RlYy0+cHVsc2VvZmZbcXVhcnRdICogNCArIHRdOworICAgIH0KKworICAgIGNvZWYgPSBkZWMtPnB1bHNlcG9zW3F1YXJ0XSA+PiAxNTsKKyAgICBwdHIxID0gdHNfcHVsc2VfdmFsdWVzICsgMzA7CisgICAgcHRyMiA9IHRtcDsKKyAgICBmb3IoaSA9IDAsIGogPSAzOyAoaSA8IDMwKSAmJiAoaiA+IDApOyBpKyspeworICAgICAgICB0ID0gKnB0cjErKzsKKyAgICAgICAgaWYoY29lZiA+PSB0KQorICAgICAgICAgICAgY29lZiAtPSB0OworICAgICAgICBlbHNleworICAgICAgICAgICAgb3V0W2ldID0gKnB0cjIrKzsKKyAgICAgICAgICAgIHB0cjEgKz0gMzA7CisgICAgICAgICAgICBqLS07CisgICAgICAgIH0KKyAgICB9CisgICAgY29lZiA9IGRlYy0+cHVsc2Vwb3NbcXVhcnRdICYgMHg3RkZGOworICAgIHB0cjEgPSB0c19wdWxzZV92YWx1ZXM7CisgICAgZm9yKGkgPSAzMCwgaiA9IDQ7IChpIDwgNjApICYmIChqID4gMCk7IGkrKyl7CisgICAgICAgIHQgPSAqcHRyMSsrOworICAgICAgICBpZihjb2VmID49IHQpCisgICAgICAgICAgICBjb2VmIC09IHQ7CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICBvdXRbaV0gPSAqcHRyMisrOworICAgICAgICAgICAgcHRyMSArPSAzMDsKKyAgICAgICAgICAgIGotLTsKKyAgICAgICAgfQorICAgIH0KKworfQorCitzdGF0aWMgdm9pZCB0cnVlc3BlZWNoX3VwZGF0ZV9maWx0ZXJzKFRTQ29udGV4dCAqZGVjLCBpbnQxNl90ICpvdXQsIGludCBxdWFydCkKK3sKKyAgICBpbnQgaTsKKworICAgIG1lbW1vdmUoZGVjLT5maWx0YnVmLCAmZGVjLT5maWx0YnVmWzYwXSwgODYgKiBzaXplb2YoKmRlYy0+ZmlsdGJ1ZikpOworICAgIGZvcihpID0gMDsgaSA8IDYwOyBpKyspeworICAgICAgICBkZWMtPmZpbHRidWZbaSArIDg2XSA9IG91dFtpXSArIGRlYy0+bmV3dmVjW2ldIC0gKGRlYy0+bmV3dmVjW2ldID4+IDMpOworICAgICAgICBvdXRbaV0gKz0gZGVjLT5uZXd2ZWNbaV07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0cnVlc3BlZWNoX3N5bnRoKFRTQ29udGV4dCAqZGVjLCBpbnQxNl90ICpvdXQsIGludCBxdWFydCkKK3sKKyAgICBpbnQgaSxrOworICAgIGludCB0WzhdOworICAgIGludDE2X3QgKnB0cjAsICpwdHIxOworCisgICAgcHRyMCA9IGRlYy0+dG1wMTsKKyAgICBwdHIxID0gZGVjLT5maWx0ZXJzICsgcXVhcnQgKiA4OworICAgIGZvcihpID0gMDsgaSA8IDYwOyBpKyspeworICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgZm9yKGsgPSAwOyBrIDwgODsgaysrKQorICAgICAgICAgICAgc3VtICs9IHB0cjBba10gKiBwdHIxW2tdOworICAgICAgICBzdW0gPSAoc3VtICsgKG91dFtpXSA8PCAxMikgKyAweDgwMCkgPj4gMTI7CisgICAgICAgIG91dFtpXSA9IGF2X2NsaXAoc3VtLCAtMHg3RkZFLCAweDdGRkUpOworICAgICAgICBmb3IoayA9IDc7IGsgPiAwOyBrLS0pCisgICAgICAgICAgICBwdHIwW2tdID0gcHRyMFtrIC0gMV07CisgICAgICAgIHB0cjBbMF0gPSBvdXRbaV07CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB0W2ldID0gKHRzX2RlY2F5XzM1XzY0W2ldICogcHRyMVtpXSkgPj4gMTU7CisKKyAgICBwdHIwID0gZGVjLT50bXAyOworICAgIGZvcihpID0gMDsgaSA8IDYwOyBpKyspeworICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgZm9yKGsgPSAwOyBrIDwgODsgaysrKQorICAgICAgICAgICAgc3VtICs9IHB0cjBba10gKiB0W2tdOworICAgICAgICBmb3IoayA9IDc7IGsgPiAwOyBrLS0pCisgICAgICAgICAgICBwdHIwW2tdID0gcHRyMFtrIC0gMV07CisgICAgICAgIHB0cjBbMF0gPSBvdXRbaV07CisgICAgICAgIG91dFtpXSA9ICgob3V0W2ldIDw8IDEyKSAtIHN1bSkgPj4gMTI7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB0W2ldID0gKHRzX2RlY2F5XzNfNFtpXSAqIHB0cjFbaV0pID4+IDE1OworCisgICAgcHRyMCA9IGRlYy0+dG1wMzsKKyAgICBmb3IoaSA9IDA7IGkgPCA2MDsgaSsrKXsKKyAgICAgICAgaW50IHN1bSA9IG91dFtpXSA8PCAxMjsKKyAgICAgICAgZm9yKGsgPSAwOyBrIDwgODsgaysrKQorICAgICAgICAgICAgc3VtICs9IHB0cjBba10gKiB0W2tdOworICAgICAgICBmb3IoayA9IDc7IGsgPiAwOyBrLS0pCisgICAgICAgICAgICBwdHIwW2tdID0gcHRyMFtrIC0gMV07CisgICAgICAgIHB0cjBbMF0gPSBhdl9jbGlwKChzdW0gKyAweDgwMCkgPj4gMTIsIC0weDdGRkUsIDB4N0ZGRSk7CisKKyAgICAgICAgc3VtID0gKChwdHIwWzFdICogKGRlYy0+ZmlsdHZhbCAtIChkZWMtPmZpbHR2YWwgPj4gMikpKSA+PiA0KSArIHN1bTsKKyAgICAgICAgc3VtID0gc3VtIC0gKHN1bSA+PiAzKTsKKyAgICAgICAgb3V0W2ldID0gYXZfY2xpcCgoc3VtICsgMHg4MDApID4+IDEyLCAtMHg3RkZFLCAweDdGRkUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdHJ1ZXNwZWVjaF9zYXZlX3ByZXZ2ZWMoVFNDb250ZXh0ICpjKQoreworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBjLT5wcmV2ZmlsdFtpXSA9IGMtPmN2ZWN0b3JbaV07Cit9CisKK3N0YXRpYyBpbnQgdHJ1ZXNwZWVjaF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIFRTQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpbnQgaSwgajsKKyAgICBpbnQxNl90ICpzYW1wbGVzOworICAgIGludCBpdGVyYXRpb25zLCByZXQ7CisKKyAgICBpdGVyYXRpb25zID0gYnVmX3NpemUgLyAzMjsKKworICAgIGlmICghaXRlcmF0aW9ucykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUb28gc21hbGwgaW5wdXQgYnVmZmVyICglZCBieXRlcyksIG5lZWQgYXQgbGVhc3QgMzIgYnl0ZXNcbiIsIGJ1Zl9zaXplKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBpdGVyYXRpb25zICogMjQwOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgc2FtcGxlcyA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICBtZW1zZXQoc2FtcGxlcywgMCwgaXRlcmF0aW9ucyAqIDI0MCAqIHNpemVvZigqc2FtcGxlcykpOworCisgICAgZm9yKGogPSAwOyBqIDwgaXRlcmF0aW9uczsgaisrKSB7CisgICAgICAgIHRydWVzcGVlY2hfcmVhZF9mcmFtZShjLCBidWYpOworICAgICAgICBidWYgKz0gMzI7CisKKyAgICAgICAgdHJ1ZXNwZWVjaF9jb3JyZWxhdGVfZmlsdGVyKGMpOworICAgICAgICB0cnVlc3BlZWNoX2ZpbHRlcnNfbWVyZ2UoYyk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICB0cnVlc3BlZWNoX2FwcGx5X3R3b3BvaW50X2ZpbHRlcihjLCBpKTsKKyAgICAgICAgICAgIHRydWVzcGVlY2hfcGxhY2VfcHVsc2VzICAoYywgc2FtcGxlcywgaSk7CisgICAgICAgICAgICB0cnVlc3BlZWNoX3VwZGF0ZV9maWx0ZXJzKGMsIHNhbXBsZXMsIGkpOworICAgICAgICAgICAgdHJ1ZXNwZWVjaF9zeW50aCAgICAgICAgIChjLCBzYW1wbGVzLCBpKTsKKyAgICAgICAgICAgIHNhbXBsZXMgKz0gNjA7CisgICAgICAgIH0KKworICAgICAgICB0cnVlc3BlZWNoX3NhdmVfcHJldnZlYyhjKTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK0FWQ29kZWMgZmZfdHJ1ZXNwZWVjaF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ0cnVlc3BlZWNoIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRFNQIEdyb3VwIFRydWVTcGVlY2giKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVFJVRVNQRUVDSCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVFNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB0cnVlc3BlZWNoX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IHRydWVzcGVlY2hfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdHJ1ZXNwZWVjaF9kYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy90cnVlc3BlZWNoX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ViZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHJ1ZXNwZWVjaF9kYXRhLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBEU1AgR3JvdXAgVHJ1ZVNwZWVjaCBjb21wYXRpYmxlIGRlY29kZXIKKyAqIGNvcHlyaWdodCAoYykgMjAwNSBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19UUlVFU1BFRUNIX0RBVEFfSAorI2RlZmluZSBBVkNPREVDX1RSVUVTUEVFQ0hfREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogY29kZWJvb2tzIGZvIGV4cGFuZGluZyBpbnB1dCBmaWx0ZXIgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IHRzX2NiXzBbMzJdID0geworICAgIDB4ODI0MCwgMHg4MzY0LCAweDg0Q0UsIDB4ODY1RCwgMHg4ODA1LCAweDg5REUsIDB4OEJENywgMHg4REY0LAorICAgIDB4OTA1MSwgMHg5MkUyLCAweDk1REUsIDB4OTkwRiwgMHg5QzgxLCAweEEwNzksIDB4QTU0QywgMHhBQUQyLAorICAgIDB4QjE4QSwgMHhCOTBBLCAweEMxMjQsIDB4QzlDQywgMHhEMzM5LCAweERERDMsIDB4RTlENiwgMHhGODkzLAorICAgIDB4MDk2RiwgMHgxQUNBLCAweDI5RUMsIDB4MzgxRiwgMHg0NUY5LCAweDU0NkEsIDB4NjNDMywgMHg3M0I1LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdHNfY2JfMVszMl0gPSB7CisgICAgMHg5RjY1LCAweEI1NkIsIDB4QzU4MywgMHhEMzcxLCAweEUwMTgsIDB4RUJCNCwgMHhGNjFDLCAweEZGNTksCisgICAgMHgwODVCLCAweDExMDYsIDB4MTk1MiwgMHgyMTRBLCAweDI4QzksIDB4MkZGOCwgMHgzNkU2LCAweDNEOTIsCisgICAgMHg0M0RGLCAweDQ5QkIsIDB4NEY0NiwgMHg1NDY3LCAweDU5MzAsIDB4NURBMywgMHg2MUVDLCAweDY1RjksCisgICAgMHg2OUQ0LCAweDZENUEsIDB4NzA5RSwgMHg3M0FELCAweDc2NkIsIDB4NzhGMCwgMHg3QjVBLCAweDdEQTUsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCB0c19jYl8yWzE2XSA9IHsKKyAgICAweDk2RjgsIDB4QTNCNCwgMHhBRjQ1LCAweEJBNTMsIDB4QzRCMSwgMHhDRUNDLCAweEQ4NkYsIDB4RTIxRSwKKyAgICAweEVCRjMsIDB4RjY0MCwgMHgwMEY3LCAweDBDMjAsIDB4MTg4MSwgMHgyNjlBLCAweDM3NkIsIDB4NEQ2MCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHRzX2NiXzNbMTZdID0geworICAgIDB4QzY1NCwgMHhERUYyLCAweEVGQUEsIDB4RkQ5NCwgMHgwOTZBLCAweDE0M0YsIDB4MUU3QiwgMHgyODJDLAorICAgIDB4MzE3NiwgMHgzQTg5LCAweDQzOUYsIDB4NENBMiwgMHg1NTdGLCAweDVFNTAsIDB4NjcxOCwgMHg2RjhELAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdHNfY2JfNFsxNl0gPSB7CisgICAgMHhBQkU3LCAweEJCQTgsIDB4QzgxQywgMHhEMzI2LCAweEREMEUsIDB4RTVENCwgMHhFRTIyLCAweEY2MTgsCisgICAgMHhGRTI4LCAweDA2NEYsIDB4MEVCNywgMHgxN0I4LCAweDIxQUEsIDB4MkQ4QiwgMHgzQkEyLCAweDRERjksCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCB0c19jYl81WzhdID0geworICAgIDB4RDUxQiwgMHhGMTJFLCAweDA0MkUsIDB4MTNDNywgMHgyMjYwLCAweDMxMUIsIDB4NDBERSwgMHg1Mzg1LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdHNfY2JfNls4XSA9IHsKKyAgICAweEI1NTAsIDB4QzgyNSwgMHhEOTgwLCAweEU5OTcsIDB4Rjg4MywgMHgwNzUyLCAweDE4MTEsIDB4MkUxOCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHRzX2NiXzdbOF0gPSB7CisgICAgMHhDRUYwLCAweEU0RjksIDB4RjZCQiwgMHgwNjQ2LCAweDE0RjUsIDB4MjNGRiwgMHgzNTZGLCAweDRBOEQsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCAqIGNvbnN0IHRzX2NvZGVib29rWzhdID0geworICAgIHRzX2NiXzAsIHRzX2NiXzEsIHRzX2NiXzIsIHRzX2NiXzMsIHRzX2NiXzQsIHRzX2NiXzUsIHRzX2NiXzYsIHRzX2NiXzcKK307CisKKy8qIHRhYmxlIHVzZWQgZm9yIGRlY29kaW5nIHB1bHNlIHBvc2l0aW9ucyAqLworc3RhdGljIGNvbnN0IGludDE2X3QgdHNfcHVsc2VfdmFsdWVzWzEyMF0gPSB7CisgICAgMHgwRTQ2LCAweDBDQ0MsIDB4MEI2RCwgMHgwQTI4LCAweDA4RkMsIDB4MDdFOCwgMHgwNkVCLCAweDA2MDQsCisgICAgMHgwNTMyLCAweDA0NzQsIDB4MDNDOSwgMHgwMzMwLCAweDAyQTgsIDB4MDIzMCwgMHgwMUM3LCAweDAxNkMsCisgICAgMHgwMTFFLCAweDAwREMsIDB4MDBBNSwgMHgwMDc4LCAweDAwNTQsIDB4MDAzOCwgMHgwMDIzLCAweDAwMTQsCisgICAgMHgwMDBBLCAweDAwMDQsIDB4MDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKworICAgIDB4MDE5NiwgMHgwMTdBLCAweDAxNUYsIDB4MDE0NSwgMHgwMTJDLCAweDAxMTQsIDB4MDBGRCwgMHgwMEU3LAorICAgIDB4MDBEMiwgMHgwMEJFLCAweDAwQUIsIDB4MDA5OSwgMHgwMDg4LCAweDAwNzgsIDB4MDA2OSwgMHgwMDVCLAorICAgIDB4MDA0RSwgMHgwMDQyLCAweDAwMzcsIDB4MDAyRCwgMHgwMDI0LCAweDAwMUMsIDB4MDAxNSwgMHgwMDBGLAorICAgIDB4MDAwQSwgMHgwMDA2LCAweDAwMDMsIDB4MDAwMSwgMHgwMDAwLCAweDAwMDAsCisKKyAgICAweDAwMUQsIDB4MDAxQywgMHgwMDFCLCAweDAwMUEsIDB4MDAxOSwgMHgwMDE4LCAweDAwMTcsIDB4MDAxNiwKKyAgICAweDAwMTUsIDB4MDAxNCwgMHgwMDEzLCAweDAwMTIsIDB4MDAxMSwgMHgwMDEwLCAweDAwMEYsIDB4MDAwRSwKKyAgICAweDAwMEQsIDB4MDAwQywgMHgwMDBCLCAweDAwMEEsIDB4MDAwOSwgMHgwMDA4LCAweDAwMDcsIDB4MDAwNiwKKyAgICAweDAwMDUsIDB4MDAwNCwgMHgwMDAzLCAweDAwMDIsIDB4MDAwMSwgMHgwMDAwLAorCisgICAgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsCisgICAgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsCisgICAgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsCisgICAgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMQorfTsKKworLyogZmlsdGVyIGZvciBjb3JyZWxhdGVkIGlucHV0IGZpbHRlciAqLworc3RhdGljIGNvbnN0IGludDE2X3QgdHNfZGVjYXlfOTk0XzEwMDBbOF0gPQorICAgIHsgMHg3RjNCLCAweDdFNzgsIDB4N0RCNiwgMHg3Q0Y1LCAweDdDMzUsIDB4N0I3NiwgMHg3QUI4LCAweDc5RkMgfTsKKworLyogdHdvLXBvaW50IGZpbHRlcnMgdGFibGUgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IHRzX29yZGVyMl9jb2VmZnNbMjUgKiAyXSA9IHsKKyAgICAweEVEMkYsIDB4NTIzOSwKKyAgICAweDU0RjEsIDB4RTRBOSwKKyAgICAweDI2MjAsIDB4RUUzRSwKKyAgICAweDA5RDYsIDB4MkM0MCwKKyAgICAweEVGQjUsIDB4MkJFMCwKKworICAgIDB4M0ZFMSwgMHgzMzM5LAorICAgIDB4NDQyRiwgMHhFNkZFLAorICAgIDB4NDQ1OCwgMHhGOURGLAorICAgIDB4RjIzMSwgMHg0M0RCLAorICAgIDB4M0RCMCwgMHhGNzA1LAorCisgICAgMHg0RjdCLCAweEZFRkIsCisgICAgMHgyNkFELCAweDBDREMsCisgICAgMHgzM0MyLCAweDA3MzksCisgICAgMHgxMkJFLCAweDQzQTIsCisgICAgMHgxQkRGLCAweDFGM0UsCisKKyAgICAweDAyMTEsIDB4MDc5NiwKKyAgICAweDJBRUIsIDB4MTYzRiwKKyAgICAweDA1MEQsIDB4M0EzOCwKKyAgICAweDBEMUUsIDB4MEQ3OCwKKyAgICAweDE1MEYsIDB4MzM0NiwKKworICAgIDB4MzhBNCwgMHgwQjdELAorICAgIDB4MkQ1RCwgMHgxRkRGLAorICAgIDB4MTlCNywgMHgyODIyLAorICAgIDB4MEQ5OSwgMHgxRjEyLAorICAgIDB4MTk0QywgMHgwQ0U2Cit9OworCisvKiBwb3NzaWJsZSBwdWxzZSB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IHRzX3B1bHNlX3NjYWxlc1s2NF0gPSB7CisgICAgMHgwMDAyLCAweDAwMDYsIDB4RkZGRSwgMHhGRkZBLAorICAgIDB4MDAwNCwgMHgwMDBDLCAweEZGRkMsIDB4RkZGNCwKKyAgICAweDAwMDYsIDB4MDAxMiwgMHhGRkZBLCAweEZGRUUsCisgICAgMHgwMDBBLCAweDAwMUUsIDB4RkZGNiwgMHhGRkUyLAorICAgIDB4MDAxMCwgMHgwMDMwLCAweEZGRjAsIDB4RkZEMCwKKyAgICAweDAwMTksIDB4MDA0QiwgMHhGRkU3LCAweEZGQjUsCisgICAgMHgwMDI4LCAweDAwNzgsIDB4RkZEOCwgMHhGRjg4LAorICAgIDB4MDA0MCwgMHgwMEMwLCAweEZGQzAsIDB4RkY0MCwKKyAgICAweDAwNjUsIDB4MDEyRiwgMHhGRjlCLCAweEZFRDEsCisgICAgMHgwMEExLCAweDAxRTMsIDB4RkY1RiwgMHhGRTFELAorICAgIDB4MDEwMCwgMHgwMzAwLCAweEZGMDAsIDB4RkQwMCwKKyAgICAweDAxOTYsIDB4MDRDMiwgMHhGRTZBLCAweEZCM0UsCisgICAgMHgwMjg1LCAweDA3OEYsIDB4RkQ3QiwgMHhGODcxLAorICAgIDB4MDQwMCwgMHgwQzAwLCAweEZDMDAsIDB4RjQwMCwKKyAgICAweDA2NTksIDB4MTMwQiwgMHhGOUE3LCAweEVDRjUsCisgICAgMHgwQTE0LCAweDFFM0MsIDB4RjVFQywgMHhFMUM0Cit9OworCisvKiBmaWx0ZXJzIHVzZWQgaW4gZmluYWwgb3V0cHV0IGNhbGN1bGF0aW9ucyAqLworc3RhdGljIGNvbnN0IGludDE2X3QgdHNfZGVjYXlfMzVfNjRbOF0gPQorICAgIHsgMHg0NjY2LCAweDI2QjgsIDB4MTU0QywgMHgwQkI2LCAweDA2NzEsIDB4MDM4QiwgMHgwMUYzLCAweDAxMTIgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IHRzX2RlY2F5XzNfNFs4XSA9CisgICAgeyAweDYwMDAsIDB4NDgwMCwgMHgzNjAwLCAweDI4ODAsIDB4MUU2MCwgMHgxNkM4LCAweDExMTYsIDB4MENEMSB9OworCisjZW5kaWYgLyogQVZDT0RFQ19UUlVFU1BFRUNIX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdHNjYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHNjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGE2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy90c2NjLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBUZWNoU21pdGggQ2FtdGFzaWEgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA0IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVGVjaFNtaXRoIENhbXRhc2lhIGRlY29kZXIKKyAqCisgKiBGb3VyY2M6IFRTQ0MKKyAqCisgKiBDb2RlYyBpcyB2ZXJ5IHNpbXBsZToKKyAqICBpdCBjb2RlcyBwaWN0dXJlIChwaWN0dXJlIGRpZmZlcmVuY2UsIHJlYWxseSkKKyAqICB3aXRoIGFsZ29yaXRobSBhbG1vc3QgaWRlbnRpY2FsIHRvIFdpbmRvd3MgUkxFOCwKKyAqICBvbmx5IHdpdGhvdXQgcGFkZGluZyBhbmQgd2l0aCBncmVhdGVyIHBpeGVsIHNpemVzLAorICogIHRoZW4gdGhpcyBjb2RlZCBwaWN0dXJlIGlzIHBhY2tlZCB3aXRoIFpMaWIKKyAqCisgKiBTdXBwb3J0czogQkdSOCxCR1I1NTUsQkdSMjQgLSBvbmx5IEJHUjggYW5kIEJHUjU1NSB0ZXN0ZWQKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtc3JsZWRlYy5oIgorCisjaW5jbHVkZSA8emxpYi5oPgorCit0eXBlZGVmIHN0cnVjdCBUc2NjQ29udGV4dCB7CisKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAqZnJhbWU7CisKKyAgICAvLyBCaXRzIHBlciBwaXhlbAorICAgIGludCBicHA7CisgICAgLy8gRGVjb21wcmVzc2VkIGRhdGEgc2l6ZQorICAgIHVuc2lnbmVkIGludCBkZWNvbXBfc2l6ZTsKKyAgICAvLyBEZWNvbXByZXNzaW9uIGJ1ZmZlcgorICAgIHVuc2lnbmVkIGNoYXIqIGRlY29tcF9idWY7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgaW50IGhlaWdodDsKKyAgICB6X3N0cmVhbSB6c3RyZWFtOworCisgICAgdWludDMyX3QgcGFsWzI1Nl07Cit9IENhbXRhc2lhQ29udGV4dDsKKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBDYW10YXNpYUNvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGMtPmZyYW1lOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBpbmZsYXRlUmVzZXQoJmMtPnpzdHJlYW0pOworICAgIGlmIChyZXQgIT0gWl9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluZmxhdGUgcmVzZXQgZXJyb3I6ICVkXG4iLCByZXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBjLT56c3RyZWFtLm5leHRfaW4gICA9IGJ1ZjsKKyAgICBjLT56c3RyZWFtLmF2YWlsX2luICA9IGJ1Zl9zaXplOworICAgIGMtPnpzdHJlYW0ubmV4dF9vdXQgPSBjLT5kZWNvbXBfYnVmOworICAgIGMtPnpzdHJlYW0uYXZhaWxfb3V0ID0gYy0+ZGVjb21wX3NpemU7CisgICAgcmV0ID0gaW5mbGF0ZSgmYy0+enN0cmVhbSwgWl9GSU5JU0gpOworICAgIC8vIFpfREFUQV9FUlJPUiBtZWFucyBlbXB0eSBwaWN0dXJlCisgICAgaWYgKChyZXQgIT0gWl9PSykgJiYgKHJldCAhPSBaX1NUUkVBTV9FTkQpICYmIChyZXQgIT0gWl9EQVRBX0VSUk9SKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluZmxhdGUgZXJyb3I6ICVkXG4iLCByZXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworCisgICAgaWYgKHJldCAhPSBaX0RBVEFfRVJST1IpIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmYy0+Z2IsIGMtPmRlY29tcF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZGVjb21wX3NpemUgLSBjLT56c3RyZWFtLmF2YWlsX291dCk7CisgICAgICAgIGZmX21zcmxlX2RlY29kZShhdmN0eCwgKEFWUGljdHVyZSopZnJhbWUsIGMtPmJwcCwgJmMtPmdiKTsKKyAgICB9CisKKyAgICAvKiBtYWtlIHRoZSBwYWxldHRlIGF2YWlsYWJsZSBvbiB0aGUgd2F5IG91dCAqLworICAgIGlmIChjLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIE5VTEwpOworCisgICAgICAgIGlmIChwYWwpIHsKKyAgICAgICAgICAgIGZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKKyAgICAgICAgICAgIG1lbWNweShjLT5wYWwsIHBhbCwgQVZQQUxFVFRFX1NJWkUpOworICAgICAgICB9CisgICAgICAgIG1lbWNweShmcmFtZS0+ZGF0YVsxXSwgYy0+cGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgKmdvdF9mcmFtZSAgICAgID0gMTsKKworICAgIC8qIGFsd2F5cyByZXBvcnQgdGhhdCB0aGUgYnVmZmVyIHdhcyBjb21wbGV0ZWx5IGNvbnN1bWVkICovCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENhbXRhc2lhQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCB6cmV0OyAvLyBabGliIHJldHVybiBjb2RlCisKKyAgICBjLT5hdmN0eCA9IGF2Y3R4OworCisgICAgYy0+aGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKworICAgIC8vIE5lZWRlZCBpZiB6bGliIHVudXNlZCBvciBpbml0IGFib3J0ZWQgYmVmb3JlIGluZmxhdGVJbml0CisgICAgbWVtc2V0KCZjLT56c3RyZWFtLCAwLCBzaXplb2Yoel9zdHJlYW0pKTsKKyAgICBzd2l0Y2goYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSl7CisgICAgY2FzZSAgODogYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7IGJyZWFrOworICAgIGNhc2UgMTY6IGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTU7IGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjI0OworICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6IGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IzMjsgYnJlYWs7CisgICAgZGVmYXVsdDogYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW10YXNpYSBlcnJvcjogdW5rbm93biBkZXB0aCAlaSBicHBcbiIsIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgYy0+YnBwID0gYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAvLyBidWZmZXIgc2l6ZSBmb3IgUkxFICdiZXN0JyBjYXNlIHdoZW4gMi1ieXRlIGNvZGUgcHJlY2VkZXMgZWFjaCBwaXhlbCBhbmQgdGhlcmUgbWF5IGJlIHBhZGRpbmcgYWZ0ZXIgaXQgdG9vCisgICAgYy0+ZGVjb21wX3NpemUgPSAoKChhdmN0eC0+d2lkdGggKiBjLT5icHAgKyA3KSA+PiAzKSArIDMgKiBhdmN0eC0+d2lkdGggKyAyKSAqIGF2Y3R4LT5oZWlnaHQgKyAyOworCisgICAgLyogQWxsb2NhdGUgZGVjb21wcmVzc2lvbiBidWZmZXIgKi8KKyAgICBpZiAoYy0+ZGVjb21wX3NpemUpIHsKKyAgICAgICAgaWYgKCEoYy0+ZGVjb21wX2J1ZiA9IGF2X21hbGxvYyhjLT5kZWNvbXBfc2l6ZSkpKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbid0IGFsbG9jYXRlIGRlY29tcHJlc3Npb24gYnVmZmVyLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgYy0+enN0cmVhbS56YWxsb2MgPSBaX05VTEw7CisgICAgYy0+enN0cmVhbS56ZnJlZSA9IFpfTlVMTDsKKyAgICBjLT56c3RyZWFtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICB6cmV0ID0gaW5mbGF0ZUluaXQoJmMtPnpzdHJlYW0pOworICAgIGlmICh6cmV0ICE9IFpfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmZsYXRlIGluaXQgZXJyb3I6ICVkXG4iLCB6cmV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBjLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENhbXRhc2lhQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmMtPmRlY29tcF9idWYpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmMtPmZyYW1lKTsKKworICAgIGluZmxhdGVFbmQoJmMtPnpzdHJlYW0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfdHNjY19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjYW10YXNpYSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRlY2hTbWl0aCBTY3JlZW4gQ2FwdHVyZSBDb2RlYyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9UU0NDLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihDYW10YXNpYUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdHNjYzIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RzY2MyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyMTBmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RzY2MyLmMKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKiBUZWNoU21pdGggU2NyZWVuIENvZGVjIDIgKGFrYSBEb3JhKSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUZWNoU21pdGggU2NyZWVuIENvZGVjIDIgZGVjb2RlcgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0c2NjMmRhdGEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVFNDQzJDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAgICAgICAqcGljOworICAgIGludCAgICAgICAgICAgIG1iX3dpZHRoLCBtYl9oZWlnaHQ7CisgICAgdWludDhfdCAgICAgICAgKnNsaWNlX3F1YW50czsKKyAgICBpbnQgICAgICAgICAgICBxdWFudFsyXTsKKyAgICBpbnQgICAgICAgICAgICBxWzJdWzNdOworICAgIEdldEJpdENvbnRleHQgIGdiOworCisgICAgVkxDICAgICAgICAgICAgZGNfdmxjLCBuY192bGNbTlVNX1ZMQ19TRVRTXSwgYWNfdmxjW05VTV9WTENfU0VUU107CisgICAgaW50ICAgICAgICAgICAgYmxvY2tbMTZdOworfSBUU0NDMkNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZnJlZV92bGNzKFRTQ0MyQ29udGV4dCAqYykKK3sKKyAgICBpbnQgaTsKKworICAgIGZmX2ZyZWVfdmxjKCZjLT5kY192bGMpOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVkxDX1NFVFM7IGkrKykgeworICAgICAgICBmZl9mcmVlX3ZsYyhjLT5uY192bGMgKyBpKTsKKyAgICAgICAgZmZfZnJlZV92bGMoYy0+YWNfdmxjICsgaSk7CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdF92bGNzKFRTQ0MyQ29udGV4dCAqYykKK3sKKyAgICBpbnQgaSwgcmV0OworCisgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKCZjLT5kY192bGMsIDksIERDX1ZMQ19DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNjYzJfZGNfdmxjX2JpdHMsICAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2NjMl9kY192bGNfY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzY2MyX2RjX3ZsY19zeW1zLCAgMiwgMiwgSU5JVF9WTENfTEUpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1ZMQ19TRVRTOyBpKyspIHsKKyAgICAgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKGMtPm5jX3ZsYyArIGksIDksIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNjYzJfbmNfdmxjX2JpdHNbaV0sICAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNjYzJfbmNfdmxjX2NvZGVzW2ldLCAyLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNjYzJfbmNfdmxjX3N5bXMsICAgICAxLCAxLCBJTklUX1ZMQ19MRSk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIGZyZWVfdmxjcyhjKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKGMtPmFjX3ZsYyArIGksIDksIHRzY2MyX2FjX3ZsY19zaXplc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzY2MyX2FjX3ZsY19iaXRzW2ldLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzY2MyX2FjX3ZsY19jb2Rlc1tpXSwgMiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzY2MyX2FjX3ZsY19zeW1zW2ldLCAgMiwgMiwgSU5JVF9WTENfTEUpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICBmcmVlX3ZsY3MoYyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgREVRVUFOVCh2YWwsIHEpICgoKHEpICogKHZhbCkgKyAweDgwKSA+PiA4KQorI2RlZmluZSBEQ1QxRChkMCwgZDEsIGQyLCBkMywgczAsIHMxLCBzMiwgczMsIE9QKSBcCisgICAgT1AoZDAsIDUgKiAoKHMwKSArIChzMSkgKyAoczIpKSArIDIgKiAoczMpKTsgIFwKKyAgICBPUChkMSwgNSAqICgoczApIC0gKHMyKSAtIChzMykpICsgMiAqIChzMSkpOyAgXAorICAgIE9QKGQyLCA1ICogKChzMCkgLSAoczIpICsgKHMzKSkgLSAyICogKHMxKSk7ICBcCisgICAgT1AoZDMsIDUgKiAoKHMwKSAtIChzMSkgKyAoczIpKSAtIDIgKiAoczMpKTsgIFwKKworI2RlZmluZSBDT0xfT1AoYSwgYikgIGEgPSAoYikKKyNkZWZpbmUgUk9XX09QKGEsIGIpICBhID0gKChiKSArIDB4MjApID4+IDYKKworc3RhdGljIHZvaWQgdHNjYzJfaWRjdDRfcHV0KGludCAqaW4sIGludCBxWzNdLCB1aW50OF90ICpkc3QsIGludCBzdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgaW50IHRibGtbNCAqIDRdOworICAgIGludCB0MCwgdDEsIHQyLCB0MzsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgdDAgPSBERVFVQU5UKHFbMCArIChpICYgMSldLCBpblswICogNCArIGldKTsKKyAgICAgICAgdDEgPSBERVFVQU5UKHFbMSArIChpICYgMSldLCBpblsxICogNCArIGldKTsKKyAgICAgICAgdDIgPSBERVFVQU5UKHFbMCArIChpICYgMSldLCBpblsyICogNCArIGldKTsKKyAgICAgICAgdDMgPSBERVFVQU5UKHFbMSArIChpICYgMSldLCBpblszICogNCArIGldKTsKKyAgICAgICAgRENUMUQodGJsa1swICogNCArIGldLCB0YmxrWzEgKiA0ICsgaV0sCisgICAgICAgICAgICAgIHRibGtbMiAqIDQgKyBpXSwgdGJsa1szICogNCArIGldLAorICAgICAgICAgICAgICB0MCwgdDEsIHQyLCB0MywgQ09MX09QKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBEQ1QxRChkc3RbMF0sIGRzdFsxXSwgZHN0WzJdLCBkc3RbM10sCisgICAgICAgICAgICAgIHRibGtbaSAqIDQgKyAwXSwgdGJsa1tpICogNCArIDFdLAorICAgICAgICAgICAgICB0YmxrW2kgKiA0ICsgMl0sIHRibGtbaSAqIDQgKyAzXSwgUk9XX09QKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdHNjYzJfZGVjb2RlX21iKFRTQ0MyQ29udGV4dCAqYywgaW50ICpxLCBpbnQgdmxjX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IHBsYW5lKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJmMtPmdiOworICAgIGludCBwcmV2X2RjLCBkYywgbmMsIGFjLCBicG9zLCB2YWw7CisgICAgaW50IGksIGosIGssIGw7CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgdmFsID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKywgZHN0ICs9IHN0cmlkZSkKKyAgICAgICAgICAgICAgICBtZW1zZXQoZHN0LCB2YWwsIDE2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDE2ICogOCAqIDgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgICAgICAgICAgICAgIGRzdFtqXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByZXZfZGMgPSAwOworICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgaWYgKCEoaiB8IGspKSB7CisgICAgICAgICAgICAgICAgZGMgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRjID0gZ2V0X3ZsYzIoZ2IsIGMtPmRjX3ZsYy50YWJsZSwgOSwgMik7CisgICAgICAgICAgICAgICAgaWYgKGRjID09IC0xKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBpZiAoZGMgPT0gMHgxMDApCisgICAgICAgICAgICAgICAgICAgIGRjID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGMgICAgICAgICAgPSAoZGMgKyBwcmV2X2RjKSAmIDB4RkY7CisgICAgICAgICAgICBwcmV2X2RjICAgICA9IGRjOworICAgICAgICAgICAgYy0+YmxvY2tbMF0gPSBkYzsKKworICAgICAgICAgICAgbmMgPSBnZXRfdmxjMihnYiwgYy0+bmNfdmxjW3ZsY19zZXRdLnRhYmxlLCA5LCAxKTsKKyAgICAgICAgICAgIGlmIChuYyA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgYnBvcyA9IDE7CisgICAgICAgICAgICBtZW1zZXQoYy0+YmxvY2sgKyAxLCAwLCAxNSAqIHNpemVvZigqYy0+YmxvY2spKTsKKyAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBuYzsgbCsrKSB7CisgICAgICAgICAgICAgICAgYWMgPSBnZXRfdmxjMihnYiwgYy0+YWNfdmxjW3ZsY19zZXRdLnRhYmxlLCA5LCAyKTsKKyAgICAgICAgICAgICAgICBpZiAoYWMgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGlmIChhYyA9PSAweDEwMDApCisgICAgICAgICAgICAgICAgICAgIGFjID0gZ2V0X2JpdHMoZ2IsIDEyKTsKKyAgICAgICAgICAgICAgICBicG9zICs9IGFjICYgMHhGOworICAgICAgICAgICAgICAgIGlmIChicG9zID49IDE2KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB2YWwgPSBzaWduX2V4dGVuZChhYyA+PiA0LCA4KTsKKyAgICAgICAgICAgICAgICBjLT5ibG9ja1t0c2NjMl96aWd6YWdbYnBvcysrXV0gPSB2YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0c2NjMl9pZGN0NF9wdXQoYy0+YmxvY2ssIHEsIGRzdCArIGsgKiA0LCBzdHJpZGUpOworICAgICAgICB9CisgICAgICAgIGRzdCArPSA0ICogc3RyaWRlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0c2NjMl9kZWNvZGVfc2xpY2UoVFNDQzJDb250ZXh0ICpjLCBpbnQgbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIGludCBpLCBtYl94LCBxLCByZXQ7CisgICAgaW50IG9mZjsKKworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmMtPmdiLCBidWYsIGJ1Zl9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IGMtPm1iX3dpZHRoOyBtYl94KyspIHsKKyAgICAgICAgcSA9IGMtPnNsaWNlX3F1YW50c1ttYl94ICsgYy0+bWJfd2lkdGggKiBtYl95XTsKKworICAgICAgICBpZiAocSA9PSAwIHx8IHEgPT0gMykgLy8gc2tpcCBibG9jaworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIG9mZiA9IG1iX3ggKiAxNiArIG1iX3kgKiA4ICogYy0+cGljLT5saW5lc2l6ZVtpXTsKKyAgICAgICAgICAgIHJldCA9IHRzY2MyX2RlY29kZV9tYihjLCBjLT5xW3EgLSAxXSwgYy0+cXVhbnRbcSAtIDFdIC0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5waWMtPmRhdGFbaV0gKyBvZmYsIGMtPnBpYy0+bGluZXNpemVbaV0sIGkpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHNjYzJfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgVFNDQzJDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICB1aW50MzJfdCBmcmFtZV90eXBlLCBzaXplOworICAgIGludCBpLCB2YWwsIGxlbiwgcG9zID0gMDsKKyAgICBpbnQgbnVtX21iID0gYy0+bWJfd2lkdGggKiBjLT5tYl9oZWlnaHQ7CisgICAgaW50IHJldDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBmcmFtZV90eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICBpZiAoZnJhbWVfdHlwZSA+IDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgZnJhbWUgdHlwZSAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICBmcmFtZV90eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIGMtPnBpYykpIDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChmcmFtZV90eXBlID09IDApIHsKKyAgICAgICAgKmdvdF9mcmFtZSAgICAgID0gMTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgYy0+cGljKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCA0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRnJhbWUgaXMgdG9vIHNob3J0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYy0+cXVhbnRbMF0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgIGMtPnF1YW50WzFdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICBpZiAoYy0+cXVhbnRbMF0gPCAyIHx8IGMtPnF1YW50WzBdID4gTlVNX1ZMQ19TRVRTICsgMSB8fAorICAgICAgICBjLT5xdWFudFsxXSA8IDIgfHwgYy0+cXVhbnRbMV0gPiBOVU1fVkxDX1NFVFMgKyAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBxdWFudGlzZXJzICVkIC8gJWRcbiIsCisgICAgICAgICAgICAgICBjLT5xdWFudFswXSwgYy0+cXVhbnRbMV0pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGMtPnFbMF1baV0gPSB0c2NjMl9xdWFudHNbYy0+cXVhbnRbMF0gLSAyXVtpXTsKKyAgICAgICAgYy0+cVsxXVtpXSA9IHRzY2MyX3F1YW50c1tjLT5xdWFudFsxXSAtIDJdW2ldOworICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAxKTsKKworICAgIHNpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2IpOworICAgIGlmIChzaXplID4gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNsaWNlIHByb3BlcnRpZXMgY2h1bmsgaXMgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICB2YWwgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgIGxlbiAgID0gdmFsICYgMHgzRjsKKyAgICAgICAgdmFsID4+PSA2OworICAgICAgICBpZiAocG9zICsgbGVuID4gbnVtX21iKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IHNsaWNlIHByb3BlcnRpZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGMtPnNsaWNlX3F1YW50cyArIHBvcywgdmFsLCBsZW4pOworICAgICAgICBwb3MgKz0gbGVuOworICAgIH0KKyAgICBpZiAocG9zIDwgbnVtX21iKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIGZldyBzbGljZSBwcm9wZXJ0aWVzICglZCAvICVkKVxuIiwKKyAgICAgICAgICAgICAgIHBvcywgbnVtX21iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGMtPm1iX2hlaWdodDsgaSsrKSB7CisgICAgICAgIHNpemUgPSBieXRlc3RyZWFtMl9wZWVrX2J5dGUoJmdiKTsKKyAgICAgICAgaWYgKHNpemUgJiAxKSB7CisgICAgICAgICAgICBzaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSAtIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKSA+PiAxOworICAgICAgICB9CisgICAgICAgIGlmICghc2l6ZSkgeworICAgICAgICAgICAgaW50IHNraXBfcm93ID0gMSwgaiwgb2ZmID0gaSAqIGMtPm1iX3dpZHRoOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGMtPm1iX3dpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYy0+c2xpY2VfcXVhbnRzW29mZiArIGpdID09IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgYy0+c2xpY2VfcXVhbnRzW29mZiArIGpdID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9yb3cgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNraXBfcm93KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJOb24tc2tpcCByb3cgd2l0aCB6ZXJvIHNpemVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNsaWNlIHNpemUgKCUiUFJJdTMyIi8ldSlcbiIsCisgICAgICAgICAgICAgICAgICAgc2l6ZSwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSB0c2NjMl9kZWNvZGVfc2xpY2UoYywgaSwgYnVmICsgYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpLCBzaXplKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBkZWNvZGluZyBzbGljZSAlZFxuIiwgaSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCBzaXplKTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lICAgICAgPSAxOworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIGMtPnBpYykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGFsd2F5cyByZXBvcnQgdGhhdCB0aGUgYnVmZmVyIHdhcyBjb21wbGV0ZWx5IGNvbnN1bWVkICovCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdHNjYzJfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVFNDQzJDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZjLT5waWMpOworICAgIGF2X2ZyZWVwKCZjLT5zbGljZV9xdWFudHMpOworICAgIGZyZWVfdmxjcyhjKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdHNjYzJfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRTQ0MyQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBjLT5hdmN0eCA9IGF2Y3R4OworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisKKyAgICBpZiAoKHJldCA9IGluaXRfdmxjcyhjKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGluaXRpYWxpc2UgVkxDc1xuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYy0+bWJfd2lkdGggICAgID0gRkZBTElHTihhdmN0eC0+d2lkdGgsICAxNikgPj4gNDsKKyAgICBjLT5tYl9oZWlnaHQgICAgPSBGRkFMSUdOKGF2Y3R4LT5oZWlnaHQsICA4KSA+PiAzOworICAgIGMtPnNsaWNlX3F1YW50cyA9IGF2X21hbGxvYyhjLT5tYl93aWR0aCAqIGMtPm1iX2hlaWdodCk7CisgICAgaWYgKCFjLT5zbGljZV9xdWFudHMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgc2xpY2UgaW5mb3JtYXRpb25cbiIpOworICAgICAgICBmcmVlX3ZsY3MoYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgYy0+cGljID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWMtPnBpYykgeworICAgICAgICB0c2NjMl9kZWNvZGVfZW5kKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl90c2NjMl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ0c2NjMiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRlY2hTbWl0aCBTY3JlZW4gQ29kZWMgMiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9UU0NDMiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVFNDQzJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB0c2NjMl9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB0c2NjMl9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHRzY2MyX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3RzY2MyZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHNjYzJkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4NmRhNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3RzY2MyZGF0YS5oCkBAIC0wLDAgKzEsOTM1IEBACisvKgorICogVGVjaFNtaXRoIFNjcmVlbiBDb2RlYyAyIChha2EgRG9yYSkgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1RTQ0MyX0RBVEFfSAorI2RlZmluZSBBVkNPREVDX1RTQ0MyX0RBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRzY2MyX3ppZ3phZ1sxNl0gPSB7CisgICAwLCAgMSwgIDQsICA4LAorICAgNSwgIDIsICAzLCAgNiwKKyAgIDksIDEyLCAxMywgMTAsCisgICA3LCAxMSwgMTQsIDE1Cit9OworCisjZGVmaW5lIE5VTV9WTENfU0VUUyAxMworCitzdGF0aWMgY29uc3QgdWludDE2X3QgdHNjYzJfcXVhbnRzW05VTV9WTENfU0VUU11bM10gPSB7CisgICAgeyAgNjU1LCAgODYxLCAxMTMwIH0sIHsgIDk4MywgMTI5MSwgMTY5NSB9LCB7IDEzMTEsIDE3MjEsIDIyNjAgfSwKKyAgICB7IDE2MzgsIDIxNTEsIDI4MjUgfSwgeyAxOTY2LCAyNTgyLCAzMzkwIH0sIHsgMjI5NCwgMzAxMiwgMzk1NSB9LAorICAgIHsgMjYyMSwgMzQ0MiwgNDUyMCB9LCB7IDI5NDksIDM4NzIsIDUwODUgfSwgeyAzMjc3LCA0MzAzLCA1NjUwIH0sCisgICAgeyAzNjA0LCA0NzMzLCA2MjE1IH0sIHsgMzkzMiwgNTE2MywgNjc4MCB9LCB7IDQyNjAsIDU1OTMsIDczNDUgfSwKKyAgICB7IDQ1ODgsIDYwMjQsIDc5MTAgfSwKK307CisKKyNkZWZpbmUgRENfVkxDX0NPVU5UIDQ3CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB0c2NjMl9kY192bGNfc3ltc1tEQ19WTENfQ09VTlRdID0geworICAgMHgxMDAsIDB4RkYsIDB4RkUsIDB4RkQsIDB4RkMsIDB4RkIsIDB4RkEsIDB4RjksCisgICAgMHhGOCwgMHhGNywgMHhGNiwgMHhGNSwgMHhGNCwgMHhGMywgMHhGMiwgMHhGMSwKKyAgICAweEYwLCAweEVGLCAweEVFLCAweEVELCAweEVDLCAweEVCLCAweEVBLCAweDE3LAorICAgIDB4MTYsIDB4MTUsIDB4MTQsIDB4MTMsIDB4MTIsIDB4MTEsIDB4MTAsIDB4MEYsCisgICAgMHgwRSwgMHgwRCwgMHgwQywgMHgwQiwgMHgwQSwgMHgwOSwgMHgwOCwgMHgwNywKKyAgICAweDA2LCAweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAxLCAweDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHRzY2MyX2RjX3ZsY19jb2Rlc1tEQ19WTENfQ09VTlRdID0geworICAgIDB4MDAwQSwgMHgwMDAwLCAweDAwMDYsIDB4MDAyRSwgMHgwMDAyLCAweDAwMEUsIDB4MDAxQSwgMHgwMDdFLAorICAgIDB4MDA0RSwgMHgwMDVBLCAweDAwRTIsIDB4MDFCRSwgMHgwMUJBLCAweDAwQkEsIDB4MDA3MiwgMHgwMDIyLAorICAgIDB4MDJCRSwgMHgwMEJFLCAweDAzM0EsIDB4MDNGMiwgMHgwMUYyLCAweDAzQTIsIDB4MDEyMiwgMHgwMzIyLAorICAgIDB4MDFBMiwgMHgwMTcyLCAweDAzNzIsIDB4MDEzQSwgMHgwMENFLCAweDAyQ0UsIDB4MDJGRSwgMHgwMEZFLAorICAgIDB4MDBBMiwgMHgwMEYyLCAweDAwM0EsIDB4MDFDRSwgMHgwMUZFLCAweDAwNjIsIDB4MDBEQSwgMHgwMDNFLAorICAgIDB4MDAzMiwgMHgwMDdBLCAweDAwMTIsIDB4MDAxRSwgMHgwMDE2LCAweDAwMDQsIDB4MDAwMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRzY2MyX2RjX3ZsY19iaXRzW0RDX1ZMQ19DT1VOVF0gPSB7CisgICAgIDUsICAzLCAgNSwgIDYsICA2LCAgNywgIDcsICA4LAorICAgICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwKKyAgICAgNywgIDcsICA2LCAgNiwgIDUsICAzLCAgMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRzY2MyX25jX3ZsY19zeW1zWzE2XSA9IHsKKyAgICAweDBGLCAweDBFLCAweDBELCAweDBDLCAweDBCLCAweDBBLCAweDA5LCAweDA4LAorICAgIDB4MDcsIDB4MDYsIDB4MDUsIDB4MDQsIDB4MDMsIDB4MDIsIDB4MDEsIDB4MDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgdHNjYzJfbmNfdmxjX2NvZGVzW05VTV9WTENfU0VUU11bMTZdID0geworICAgIHsgMHgwMDIzLCAweDAwMDMsIDB4MDAzMSwgMHgwMDIxLCAweDAwMTEsIDB4MDA1MywgMHgwMDEzLCAweDAwMDEsCisgICAgICAweDAwMDksIDB4MDAyOSwgMHgwMDMzLCAweDAwMTksIDB4MDAwQiwgMHgwMDA1LCAweDAwMDcsIDB4MDAwMCwgfSwKKyAgICB7IDB4MDAzMCwgMHgwMDIyLCAweDAwMjgsIDB4MDAyMCwgMHgwMDA4LCAweDAwMDAsIDB4MDAzMiwgMHgwMDcyLAorICAgICAgMHgwMDEwLCAweDAwMDIsIDB4MDAxMiwgMHgwMDE4LCAweDAwMEEsIDB4MDAwNCwgMHgwMDA2LCAweDAwMDEsIH0sCisgICAgeyAweDAwMzIsIDB4MDAzOCwgMHgwMDIwLCAweDAwMDgsIDB4MDAwMiwgMHgwMDE4LCAweDAwNzIsIDB4MDAwMCwKKyAgICAgIDB4MDAyOCwgMHgwMDIyLCAweDAwMTIsIDB4MDAxMCwgMHgwMDBBLCAweDAwMDQsIDB4MDAwNiwgMHgwMDAxLCB9LAorICAgIHsgMHgwMDMyLCAweDAwMTAsIDB4MDA3MiwgMHgwMDMwLCAweDAwMjIsIDB4MDAzOCwgMHgwMDA4LCAweDAwMjgsCisgICAgICAweDAwMTgsIDB4MDAwMiwgMHgwMDEyLCAweDAwMDAsIDB4MDAwQSwgMHgwMDA0LCAweDAwMDYsIDB4MDAwMSwgfSwKKyAgICB7IDB4MDAxMiwgMHgwMDUyLCAweDAwMDAsIDB4MDAyMCwgMHgwMDE4LCAweDAwMjIsIDB4MDAwOCwgMHgwMDI4LAorICAgICAgMHgwMDM4LCAweDAwMDIsIDB4MDAzMiwgMHgwMDEwLCAweDAwMEEsIDB4MDAwNCwgMHgwMDA2LCAweDAwMDEsIH0sCisgICAgeyAweDAwMTYsIDB4MDA5NiwgMHgwMDA2LCAweDAwNDYsIDB4MDA1NiwgMHgwMDAyLCAweDAwMzYsIDB4MDA3NiwKKyAgICAgIDB4MDAxMiwgMHgwMDIyLCAweDAwMzIsIDB4MDAyNiwgMHgwMDBBLCAweDAwMEUsIDB4MDAwMCwgMHgwMDAxLCB9LAorICAgIHsgMHgwMDFBLCAweDAwOUEsIDB4MDAzMiwgMHgwMDcyLCAweDAwNUEsIDB4MDA3QSwgMHgwMDNBLCAweDAwMDIsCisgICAgICAweDAwMTIsIDB4MDAyMiwgMHgwMDBBLCAweDAwMkEsIDB4MDAwNiwgMHgwMDBFLCAweDAwMDAsIDB4MDAwMSwgfSwKKyAgICB7IDB4MDAyQSwgMHgwMEFBLCAweDAwMDIsIDB4MDA0MiwgMHgwMDZBLCAweDAwM0EsIDB4MDA3QSwgMHgwMDIyLAorICAgICAgMHgwMDMyLCAweDAwMTIsIDB4MDAwQSwgMHgwMDFBLCAweDAwMDYsIDB4MDAwRSwgMHgwMDAwLCAweDAwMDEsIH0sCisgICAgeyAweDAwNDIsIDB4MDBDMiwgMHgwMDAyLCAweDAwMEEsIDB4MDA0QSwgMHgwMDNBLCAweDAwN0EsIDB4MDAyMiwKKyAgICAgIDB4MDAxMiwgMHgwMDMyLCAweDAwMkEsIDB4MDAxQSwgMHgwMDA2LCAweDAwMEUsIDB4MDAwMCwgMHgwMDAxLCB9LAorICAgIHsgMHgwMEJBLCAweDAxQkEsIDB4MDAzQSwgMHgwMDEyLCAweDAwNTIsIDB4MDA3QSwgMHgwMDAyLCAweDAwMjIsCisgICAgICAweDAwMzIsIDB4MDAwQSwgMHgwMDJBLCAweDAwMUEsIDB4MDAwMCwgMHgwMDA0LCAweDAwMDYsIDB4MDAwMSwgfSwKKyAgICB7IDB4MDBBQSwgMHgwMUFBLCAweDAwMkEsIDB4MDAyMiwgMHgwMDYyLCAweDAwNkEsIDB4MDAwMiwgMHgwMDEyLAorICAgICAgMHgwMDMyLCAweDAwMEEsIDB4MDAxQSwgMHgwMDNBLCAweDAwMDAsIDB4MDAwNCwgMHgwMDA2LCAweDAwMDEsIH0sCisgICAgeyAweDAwQUEsIDB4MDFBQSwgMHgwMDJBLCAweDAwMjIsIDB4MDA2MiwgMHgwMDZBLCAweDAwMDIsIDB4MDAxMiwKKyAgICAgIDB4MDAzMiwgMHgwMDBBLCAweDAwM0EsIDB4MDAxQSwgMHgwMDAwLCAweDAwMDQsIDB4MDAwNiwgMHgwMDAxLCB9LAorICAgIHsgMHgwMDhBLCAweDAxOEEsIDB4MDAwQSwgMHgwMDIyLCAweDAwNjIsIDB4MDA0QSwgMHgwMDAyLCAweDAwMTIsCisgICAgICAweDAwMzIsIDB4MDAyQSwgMHgwMDFBLCAweDAwM0EsIDB4MDAwMCwgMHgwMDA0LCAweDAwMDYsIDB4MDAwMSwgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRzY2MyX25jX3ZsY19iaXRzW05VTV9WTENfU0VUU11bMTZdID0geworICAgIHsgNiwgNiwgNiwgNiwgNiwgNywgNywgNiwgNiwgNiwgNiwgNSwgNCwgMywgMywgMSB9LAorICAgIHsgNiwgNiwgNiwgNiwgNiwgNiwgNywgNywgNiwgNiwgNiwgNSwgNCwgMywgMywgMSB9LAorICAgIHsgNywgNiwgNiwgNiwgNiwgNiwgNywgNiwgNiwgNiwgNiwgNSwgNCwgMywgMywgMSB9LAorICAgIHsgNywgNiwgNywgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNCwgMywgMywgMSB9LAorICAgIHsgNywgNywgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNCwgMywgMywgMSB9LAorICAgIHsgOCwgOCwgNywgNywgNywgNiwgNywgNywgNiwgNiwgNiwgNiwgNCwgNCwgMiwgMSB9LAorICAgIHsgOCwgOCwgNywgNywgNywgNywgNywgNiwgNiwgNiwgNiwgNiwgNCwgNCwgMiwgMSB9LAorICAgIHsgOCwgOCwgNywgNywgNywgNywgNywgNiwgNiwgNiwgNiwgNiwgNCwgNCwgMiwgMSB9LAorICAgIHsgOCwgOCwgNywgNywgNywgNywgNywgNiwgNiwgNiwgNiwgNiwgNCwgNCwgMiwgMSB9LAorICAgIHsgOSwgOSwgOCwgNywgNywgNywgNiwgNiwgNiwgNiwgNiwgNiwgMywgMywgMywgMSB9LAorICAgIHsgOSwgOSwgOCwgNywgNywgNywgNiwgNiwgNiwgNiwgNiwgNiwgMywgMywgMywgMSB9LAorICAgIHsgOSwgOSwgOCwgNywgNywgNywgNiwgNiwgNiwgNiwgNiwgNiwgMywgMywgMywgMSB9LAorICAgIHsgOSwgOSwgOCwgNywgNywgNywgNiwgNiwgNiwgNiwgNiwgNiwgMywgMywgMywgMSB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGFjX3ZsY19kZXNjMF9zeW1zWzE3Ml0gPSB7CisgICAweDEwMDAsIDB4RkY4LCAweEZGNiwgMHhGRjUsIDB4RkY0LCAweEZGMywgMHhGRjIsIDB4RkYxLAorICAgIDB4RkYwLCAweEZFNiwgMHhGRTUsIDB4RkU0LCAweEZFMywgMHhGRTIsIDB4RkUxLCAweEZFMCwKKyAgICAweEZENiwgMHhGRDUsIDB4RkQzLCAweEZEMiwgMHhGRDEsIDB4RkQwLCAweEZDNiwgMHhGQzUsCisgICAgMHhGQzMsIDB4RkMyLCAweEZDMSwgMHhGQzAsIDB4RkI1LCAweEZCMywgMHhGQjIsIDB4RkIxLAorICAgIDB4RkIwLCAweEZBNSwgMHhGQTMsIDB4RkExLCAweEZBMCwgMHhGOTUsIDB4RjkxLCAweEY5MCwKKyAgICAweEY4MywgMHhGODEsIDB4RjgwLCAweEY3MywgMHhGNzEsIDB4RjcwLCAweEY2MSwgMHhGNjAsCisgICAgMHhGNTEsIDB4RjUwLCAweEY0NSwgMHhGNDEsIDB4RjQwLCAweEYzMSwgMHhGMzAsIDB4RjIxLAorICAgIDB4RjIwLCAweEYxMCwgMHhGMDAsIDB4RUYwLCAweEVFMCwgMHhFRDUsIDB4RUQxLCAweEVEMCwKKyAgICAweEVDMCwgMHhFQjAsIDB4RUEwLCAweEU5MCwgMHhFODAsIDB4RTcwLCAweEU2MCwgMHhFNTAsCisgICAgMHhFNDAsIDB4RTMwLCAweEUyMCwgMHhFMTAsIDB4RTAwLCAweERGMCwgMHhERTAsIDB4REQwLAorICAgIDB4REMwLCAweERCMCwgMHhEQTAsIDB4RDkwLCAweEQ4MCwgMHhENjAsIDB4Q0QxLCAweDI4MCwKKyAgICAweDI3MCwgMHgyNjAsIDB4MjUwLCAweDI0MCwgMHgyMzAsIDB4MjIwLCAweDIxMCwgMHgyMDAsCisgICAgMHgxRjAsIDB4MUUwLCAweDFEMCwgMHgxQzAsIDB4MUIwLCAweDFBMSwgMHgxQTAsIDB4MTkwLAorICAgIDB4MTgwLCAweDE3MCwgMHgxNjAsIDB4MTUwLCAweDE0MCwgMHgxMzAsIDB4MTIxLCAweDEyMCwKKyAgICAweDExMSwgMHgxMTAsIDB4MTAxLCAweDEwMCwgMHgwRjEsIDB4MEYwLCAweDBFMSwgMHgwRTAsCisgICAgMHgwRDEsIDB4MEQwLCAweDBDMSwgMHgwQzAsIDB4MEIxLCAweDBCMCwgMHgwQTUsIDB4MEExLAorICAgIDB4MEEwLCAweDA5MSwgMHgwOTAsIDB4MDgxLCAweDA4MCwgMHgwNzUsIDB4MDcxLCAweDA3MCwKKyAgICAweDA2NSwgMHgwNjMsIDB4MDYxLCAweDA2MCwgMHgwNTUsIDB4MDUzLCAweDA1MiwgMHgwNTEsCisgICAgMHgwNTAsIDB4MDQ2LCAweDA0NSwgMHgwNDMsIDB4MDQyLCAweDA0MSwgMHgwNDAsIDB4MDM2LAorICAgIDB4MDM1LCAweDAzMywgMHgwMzIsIDB4MDMxLCAweDAzMCwgMHgwMjYsIDB4MDI1LCAweDAyNCwKKyAgICAweDAyMywgMHgwMjIsIDB4MDIxLCAweDAyMCwgMHgwMTgsIDB4MDE2LCAweDAxNSwgMHgwMTQsCisgICAgMHgwMTMsIDB4MDEyLCAweDAxMSwgMHgwMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfdmxjX2Rlc2MwX2NvZGVzWzE3Ml0gPSB7CisgICAgMHgwMDFGLCAweDBENzEsIDB4MDEzRiwgMHgwMDZDLCAweDAwQTcsIDB4MDA2NywgMHgwMDFDLCAweDAwMDgsCisgICAgMHgwMDA1LCAweDA2RjEsIDB4MDAyQywgMHgwNEJBLCAweDAwNzIsIDB4MDFBQSwgMHgwMDAyLCAweDAwMDYsCisgICAgMHgwNkFDLCAweDAyQUYsIDB4MDZFRiwgMHgwMThGLCAweDAwMEEsIDB4MDAwOSwgMHgwMkFDLCAweDA0MkEsCisgICAgMHgwNkUxLCAweDA2OEYsIDB4MDBCMSwgMHgwMDAwLCAweDAzMTcsIDB4MEMxNywgMHgwNjEyLCAweDAxMEYsCisgICAgMHgwMDExLCAweDBGQkEsIDB4MDAyQSwgMHgwMTcyLCAweDAwMEMsIDB4MDVBQywgMHgwM0Q3LCAweDAwMzcsCisgICAgMHgwRThGLCAweDAyRjIsIDB4MDA0MSwgMHgwQkUxLCAweDA1N0YsIDB4MDA0QSwgMHgwMEFGLCAweDAwNkYsCisgICAgMHgwNkFBLCAweDAwOTcsIDB4MDEwMSwgMHgwMDEyLCAweDAwODEsIDB4MDU3MSwgMHgwMDkyLCAweDBFQUYsCisgICAgMHgwMUJGLCAweDAwRDcsIDB4MDAzMSwgMHgwMDAxLCAweDAxRjIsIDB4MEYxNywgMHgwNTNBLCAweDAwQkYsCisgICAgMHgwMzhGLCAweDAyMTcsIDB4MDM3MSwgMHgwMUYxLCAweDAxQkEsIDB4MDIyQSwgMHgwMkJGLCAweDAyOEYsCisgICAgMHgwMDhGLCAweDAzRjEsIDB4MDBFMSwgMHgwMEJBLCAweDAwRjIsIDB4MEVCRiwgMHgwNkFGLCAweDA0OEYsCisgICAgMHgwRkUxLCAweDAyNzEsIDB4MDdCQSwgMHgwRDNBLCAweDBDMTIsIDB4MDhBQywgMHgwNzE3LCAweDAwQUMsCisgICAgMHgwNDEyLCAweDA5MDEsIDB4MDRFMSwgMHgwN0UxLCAweDA0MTcsIDB4MENBRiwgMHgwNEFDLCAweDAxQUMsCisgICAgMHgwNEYyLCAweDAzQkEsIDB4MDVENywgMHgwN0YxLCAweDAxRDcsIDB4MDRBRiwgMHgwNEVGLCAweDAzQUMsCisgICAgMHgwMEFBLCAweDAxRTEsIDB4MDA3MSwgMHgwMEYxLCAweDAxMkMsIDB4MDNFRiwgMHgwODJBLCAweDAxMTIsCisgICAgMHgwM0UxLCAweDAxRkEsIDB4MERBQywgMHgwMTMxLCAweDBFMTIsIDB4MDAwRiwgMHgwQjE3LCAweDAwN0YsCisgICAgMHgwQUVGLCAweDAwN0EsIDB4MDJBQSwgMHgwMDYxLCAweDA2NzEsIDB4MDAyNywgMHgwMTNBLCAweDA1OEYsCisgICAgMHgwMEZGLCAweDAzM0EsIDB4MDAzMiwgMHgwMzAxLCAweDAwMjEsIDB4MEM4RiwgMHgwMzdGLCAweDAwNzcsCisgICAgMHgwMkYxLCAweDAyRTEsIDB4MDAzQSwgMHgwMDNDLCAweDAyMTIsIDB4MDgxNywgMHgwQ0UxLCAweDAwM0YsCisgICAgMHgwMDA3LCAweDAwMTcsIDB4MDUwMSwgMHgwMkJBLCAweDA2QkYsIDB4MDA1NywgMHgwMDEwLCAweDAyRUYsCisgICAgMHgwMTE3LCAweDAxN0YsIDB4MDBFRiwgMHgwMDZBLCAweDAwMTksIDB4MDE3MSwgMHgwMUVGLCAweDA2QkEsCisgICAgMHgwMTJBLCAweDAwRkEsIDB4MDAyMiwgMHgwMDBFLCAweDBBRTEsIDB4MDFBRiwgMHgwMDUyLCAweDAwMkYsCisgICAgMHgwMDRGLCAweDAwMUEsIDB4MDAwNCwgMHgwMDAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWNfdmxjX2Rlc2MwX2JpdHNbMTcyXSA9IHsKKyAgICAgNiwgMTIsICA5LCAgNywgIDgsICA3LCAgNiwgIDQsCisgICAgIDMsIDExLCAgOSwgMTEsICA5LCAgOSwgIDYsICA0LAorICAgIDExLCAxMSwgMTEsIDExLCAgNywgIDUsIDExLCAxMSwKKyAgICAxMSwgMTIsICA4LCAgNSwgMTIsIDEyLCAxMiwgIDksCisgICAgIDYsIDEyLCAxMiwgIDksICA2LCAxMiwgMTAsICA3LAorICAgIDEyLCAxMCwgIDcsIDEyLCAxMSwgIDcsIDExLCAgOCwKKyAgICAxMSwgIDgsIDEyLCAxMSwgIDgsIDEyLCAgOCwgMTIsCisgICAgIDksICA5LCAgOSwgIDksICA5LCAxMiwgMTIsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsCisgICAgMTIsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMSwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsICA5LCAxMCwgMTIsICA5LAorICAgIDEyLCAgOSwgMTIsICA5LCAxMiwgIDksIDEyLCAgOSwKKyAgICAxMiwgIDgsIDExLCAgOCwgMTEsICA4LCAxMSwgMTEsCisgICAgIDgsIDEwLCAgNywgMTAsICA3LCAxMiwgMTAsICA3LAorICAgIDExLCAxMiwgIDksICA2LCAxMSwgMTIsIDEyLCAgOSwKKyAgICAgNiwgMTIsIDExLCAxMSwgMTIsICA4LCAgNSwgMTIsCisgICAgMTAsIDExLCAxMSwgIDcsICA1LCAxMSwgMTAsIDExLAorICAgICA5LCAgOSwgIDYsICA0LCAxMiwgIDksICA3LCAgOCwKKyAgICAgNywgIDYsICA0LCAgMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzYzFfc3ltc1sxNjldID0geworICAgMHgxMDAwLCAweEZGOCwgMHhGRjYsIDB4RkY1LCAweEZGNCwgMHhGRjMsIDB4RkYyLCAweEZGMSwKKyAgICAweEZGMCwgMHhGRTYsIDB4RkU1LCAweEZFNCwgMHhGRTMsIDB4RkUyLCAweEZFMSwgMHhGRTAsCisgICAgMHhGRDYsIDB4RkQ1LCAweEZEMywgMHhGRDIsIDB4RkQxLCAweEZEMCwgMHhGQzYsIDB4RkM1LAorICAgIDB4RkMzLCAweEZDMiwgMHhGQzEsIDB4RkMwLCAweEZCNiwgMHhGQjUsIDB4RkIzLCAweEZCMiwKKyAgICAweEZCMSwgMHhGQjAsIDB4RkE2LCAweEZBNSwgMHhGQTMsIDB4RkExLCAweEZBMCwgMHhGOTUsCisgICAgMHhGOTMsIDB4RjkxLCAweEY5MCwgMHhGODUsIDB4RjgxLCAweEY4MCwgMHhGNzEsIDB4RjcwLAorICAgIDB4RjYxLCAweEY2MCwgMHhGNTEsIDB4RjUwLCAweEY0NSwgMHhGNDEsIDB4RjQwLCAweEYzMSwKKyAgICAweEYzMCwgMHhGMjEsIDB4RjIwLCAweEYxMSwgMHhGMTAsIDB4RjAxLCAweEYwMCwgMHhFRjEsCisgICAgMHhFRjAsIDB4RUUxLCAweEVFMCwgMHhFRDAsIDB4RUM2LCAweEVDMCwgMHhFQjYsIDB4RUIwLAorICAgIDB4RUEwLCAweEU5MCwgMHhFODAsIDB4RTcwLCAweEU2MCwgMHhFNTAsIDB4RTQwLCAweEUzMywKKyAgICAweEUzMSwgMHhFMzAsIDB4RTIwLCAweEUxMCwgMHhFMDAsIDB4REYwLCAweERFMSwgMHhERTAsCisgICAgMHhEQzAsIDB4REIwLCAweERBMCwgMHgyNTAsIDB4MjQwLCAweDFGMCwgMHgxRTAsIDB4MUQwLAorICAgIDB4MUMwLCAweDFCMCwgMHgxQTAsIDB4MTkwLCAweDE4MCwgMHgxNzAsIDB4MTYwLCAweDE1MCwKKyAgICAweDE0MCwgMHgxMzAsIDB4MTIwLCAweDExMSwgMHgxMTAsIDB4MTAxLCAweDEwMCwgMHgwRjEsCisgICAgMHgwRjAsIDB4MEUxLCAweDBFMCwgMHgwRDEsIDB4MEQwLCAweDBDNiwgMHgwQzEsIDB4MEMwLAorICAgIDB4MEIxLCAweDBCMCwgMHgwQTEsIDB4MEEwLCAweDA5NSwgMHgwOTEsIDB4MDkwLCAweDA4NSwKKyAgICAweDA4MSwgMHgwODAsIDB4MDc1LCAweDA3MSwgMHgwNzAsIDB4MDY1LCAweDA2MywgMHgwNjEsCisgICAgMHgwNjAsIDB4MDU1LCAweDA1MywgMHgwNTIsIDB4MDUxLCAweDA1MCwgMHgwNDYsIDB4MDQ1LAorICAgIDB4MDQzLCAweDA0MiwgMHgwNDEsIDB4MDQwLCAweDAzNiwgMHgwMzUsIDB4MDMzLCAweDAzMiwKKyAgICAweDAzMSwgMHgwMzAsIDB4MDI2LCAweDAyNSwgMHgwMjQsIDB4MDIzLCAweDAyMiwgMHgwMjEsCisgICAgMHgwMjAsIDB4MDE4LCAweDAxNiwgMHgwMTUsIDB4MDE0LCAweDAxMywgMHgwMTIsIDB4MDExLAorICAgIDB4MDEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGFjX3ZsY19kZXNjMV9jb2Rlc1sxNjldID0geworICAgIDB4MDAxOSwgMHgwMjdELCAweDAwODQsIDB4MDA0NCwgMHgwMDlELCAweDAwM0QsIDB4MDAwQSwgMHgwMDAyLAorICAgIDB4MDAwMywgMHgwMEVBLCAweDAyRkQsIDB4MDE3QSwgMHgwMUM2LCAweDAwQjYsIDB4MDAyNiwgMHgwMDBFLAorICAgIDB4MDA5NSwgMHgwMjYwLCAweDAzMkEsIDB4MDM2MCwgMHgwMDA2LCAweDAwMDUsIDB4MDVCNiwgMHgwMzZBLAorICAgIDB4MDZGNiwgMHgwNzA0LCAweDAwRkEsIDB4MDAxMCwgMHgwMjc5LCAweDA0RDQsIDB4MDBGNiwgMHgwNjZBLAorICAgIDB4MDAxRCwgMHgwMDI5LCAweDA1RjksIDB4MDg0NiwgMHgwNEY2LCAweDAxRDQsIDB4MDAzOCwgMHgwNDQ2LAorICAgIDB4MDE2MCwgMHgwMzFELCAweDAwNzUsIDB4MDA1NCwgMHgwMkQ0LCAweDAwNUEsIDB4MDVGRCwgMHgwMDQwLAorICAgIDB4MDZFQSwgMHgwMDU1LCAweDA0NjAsIDB4MDA5QSwgMHgwNTJBLCAweDAwQTAsIDB4MDBEOCwgMHgwMzgwLAorICAgIDB4MDE3RCwgMHgwOTJBLCAweDAwRjksIDB4MEQ3QSwgMHgwMTc5LCAweDAzMDQsIDB4MDAyQSwgMHgwMTA0LAorICAgIDB4MDFBMCwgMHgwNzgwLCAweDAwN0QsIDB4MDNGOSwgMHgwQzQ2LCAweDAzRUEsIDB4MEU2QSwgMHgwMjA0LAorICAgIDB4MDFGRCwgMHgwNTFELCAweDAyQUEsIDB4MDVFQSwgMHgwMEFBLCAweDAwODAsIDB4MDY3RCwgMHgwOUVBLAorICAgIDB4MEM5NSwgMHgwOUY5LCAweDA3QjYsIDB4MERCNiwgMHgwMTJBLCAweDA5MDQsIDB4MDQ1NCwgMHgwRkI2LAorICAgIDB4MDk2MCwgMHgwOEQ0LCAweDA0OTUsIDB4MEY4MCwgMHgwNTYwLCAweDBCMDQsIDB4MDU3QSwgMHgwMDc5LAorICAgIDB4MDc5NSwgMHgwRTdELCAweDAwNjAsIDB4MDc2QSwgMHgwM0I2LCAweDAzOTUsIDB4MDE4MCwgMHgwMkEwLAorICAgIDB4MDA2QSwgMHgwMTk1LCAweDAyOTUsIDB4MDY0NiwgMHgwM0ZELCAweDAxRjksIDB4MDE1NCwgMHgwREY5LAorICAgIDB4MDBDNiwgMHgwRjk1LCAweDAxRjYsIDB4MDQ4MCwgMHgwMDAwLCAweDBBNzksIDB4MDRBQSwgMHgwMEUwLAorICAgIDB4MDI0NiwgMHgwMDFBLCAweDA0NzksIDB4MDAxNSwgMHgwRDYwLCAweDAyODAsIDB4MDAxOCwgMHgwMUVBLAorICAgIDB4MDM3QSwgMHgwMDNBLCAweDAxMUQsIDB4MDBGRCwgMHgwMDM1LCAweDBBN0QsIDB4MDRBMCwgMHgwMTQ2LAorICAgIDB4MDAyNCwgMHgwMUI2LCAweDA1MDQsIDB4MDA0NiwgMHgwMDIwLCAweDAwMDksIDB4MDBENCwgMHgwM0FBLAorICAgIDB4MDY3OSwgMHgwMjZBLCAweDAwMzYsIDB4MDAwOCwgMHgwMkY2LCAweDAxQUEsIDB4MDE2QSwgMHgwMjU0LAorICAgIDB4MDAzOSwgMHgwMDBELCAweDAwMDQsIDB4MDE3NiwgMHgwMkVBLCAweDAwN0EsIDB4MDA3NiwgMHgwMDE2LAorICAgIDB4MDAwMSwgMHgwODc5LCAweDAwNTgsIDB4MDAxNCwgMHgwMEQ1LCAweDAwNUQsIDB4MDAzNCwgMHgwMDBDLAorICAgIDB4MDAwNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFjX3ZsY19kZXNjMV9iaXRzWzE2OV0gPSB7CisgICAgIDYsIDEyLCAgOCwgIDcsICA4LCAgNywgIDYsICA0LAorICAgICAzLCAxMCwgMTAsIDExLCAgOSwgIDksICA2LCAgNCwKKyAgICAxMSwgMTAsIDEwLCAxMCwgIDcsICA1LCAxMiwgMTEsCisgICAgMTEsIDExLCAgOCwgIDUsIDEyLCAxMSwgMTEsIDEyLAorICAgICA5LCAgNiwgMTIsIDEyLCAxMSwgIDksICA2LCAxMiwKKyAgICAxMiwgMTAsICA3LCAxMSwgMTAsICA3LCAxMSwgIDcsCisgICAgMTEsICA4LCAxMSwgIDgsIDExLCAxMSwgIDgsIDExLAorICAgICA5LCAxMiwgIDksIDEyLCAgOSwgMTIsICA5LCAxMiwKKyAgICAgOSwgMTIsIDEwLCAxMCwgMTIsIDEwLCAxMiwgMTAsCisgICAgMTEsIDExLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDExLCAxMCwgMTIsICA5LCAxMiwKKyAgICAgOSwgMTIsICA5LCAxMSwgIDgsIDEyLCAxMSwgIDgsCisgICAgMTEsICA4LCAxMSwgIDgsIDEyLCAxMCwgIDcsIDEyLAorICAgIDEwLCAgNywgMTEsIDEwLCAgNywgMTIsIDExLCAgOSwKKyAgICAgNiwgMTEsIDExLCAxMiwgIDgsICA2LCAxMiwgMTAsCisgICAgMTEsIDExLCAgOCwgIDUsIDExLCAxMCwgMTAsIDEwLAorICAgICA3LCAgNSwgMTAsICA5LCAxMSwgIDksICA5LCAgNiwKKyAgICAgNCwgMTIsICA4LCAgNywgIDgsICA3LCAgNiwgIDQsCisgICAgIDMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfdmxjX2Rlc2MyX3N5bXNbMTY1XSA9IHsKKyAgIDB4MTAwMCwgMHhGRjgsIDB4RkY3LCAweEZGNiwgMHhGRjUsIDB4RkY0LCAweEZGMywgMHhGRjIsCisgICAgMHhGRjEsIDB4RkYwLCAweEZFNiwgMHhGRTUsIDB4RkU0LCAweEZFMywgMHhGRTIsIDB4RkUxLAorICAgIDB4RkUwLCAweEZENiwgMHhGRDUsIDB4RkQzLCAweEZEMiwgMHhGRDEsIDB4RkQwLCAweEZDNiwKKyAgICAweEZDNSwgMHhGQzMsIDB4RkMyLCAweEZDMSwgMHhGQzAsIDB4RkI2LCAweEZCNSwgMHhGQjMsCisgICAgMHhGQjIsIDB4RkIxLCAweEZCMCwgMHhGQTUsIDB4RkEzLCAweEZBMSwgMHhGQTAsIDB4Rjk1LAorICAgIDB4RjkzLCAweEY5MSwgMHhGOTAsIDB4RjgxLCAweEY4MCwgMHhGNzUsIDB4RjcxLCAweEY3MCwKKyAgICAweEY2MSwgMHhGNjAsIDB4RjUxLCAweEY1MCwgMHhGNDEsIDB4RjQwLCAweEYzNiwgMHhGMzEsCisgICAgMHhGMzAsIDB4RjI2LCAweEYyMSwgMHhGMjAsIDB4RjE2LCAweEYxMSwgMHhGMTAsIDB4RjA2LAorICAgIDB4RjAxLCAweEYwMCwgMHhFRjEsIDB4RUYwLCAweEVFMSwgMHhFRTAsIDB4RUQwLCAweEVDMCwKKyAgICAweEVCMywgMHhFQjEsIDB4RUIwLCAweEVBMywgMHhFQTEsIDB4RUEwLCAweEU5MCwgMHhFODEsCisgICAgMHhFODAsIDB4RTcxLCAweEU3MCwgMHhFNjEsIDB4RTYwLCAweEU1MCwgMHhFNDAsIDB4RTMwLAorICAgIDB4RTEwLCAweEUwMCwgMHgyNDEsIDB4MjQwLCAweDIzMSwgMHgxRDAsIDB4MUMwLCAweDFCMywKKyAgICAweDFCMCwgMHgxQTAsIDB4MTkwLCAweDE4MCwgMHgxNzAsIDB4MTYwLCAweDE1MCwgMHgxNDAsCisgICAgMHgxMzAsIDB4MTIwLCAweDExMCwgMHgxMDAsIDB4MEYwLCAweDBFMCwgMHgwRDEsIDB4MEQwLAorICAgIDB4MEMxLCAweDBDMCwgMHgwQjEsIDB4MEIwLCAweDBBNSwgMHgwQTEsIDB4MEEwLCAweDA5NiwKKyAgICAweDA5NSwgMHgwOTEsIDB4MDkwLCAweDA4NiwgMHgwODUsIDB4MDgxLCAweDA4MCwgMHgwNzUsCisgICAgMHgwNzEsIDB4MDcwLCAweDA2NSwgMHgwNjMsIDB4MDYxLCAweDA2MCwgMHgwNTUsIDB4MDUzLAorICAgIDB4MDUyLCAweDA1MSwgMHgwNTAsIDB4MDQ1LCAweDA0MywgMHgwNDIsIDB4MDQxLCAweDA0MCwKKyAgICAweDAzNiwgMHgwMzUsIDB4MDMzLCAweDAzMiwgMHgwMzEsIDB4MDMwLCAweDAyNiwgMHgwMjUsCisgICAgMHgwMjQsIDB4MDIzLCAweDAyMiwgMHgwMjEsIDB4MDIwLCAweDAxOCwgMHgwMTYsIDB4MDE1LAorICAgIDB4MDE0LCAweDAxMywgMHgwMTIsIDB4MDExLCAweDAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzYzJfY29kZXNbMTY1XSA9IHsKKyAgICAweDAwMzQsIDB4MDU5QywgMHgwMjgwLCAweDAwMUMsIDB4MDA0QywgMHgwMEJELCAweDAwMjAsIDB4MDAzQywKKyAgICAweDAwMEEsIDB4MDAwMywgMHgwMEZELCAweDAwOEMsIDB4MDMzMiwgMHgwMUQ1LCAweDAwNTUsIDB4MDAzRSwKKyAgICAweDAwMDEsIDB4MDdFNCwgMHgwMjY0LCAweDAwQjIsIDB4MDBBMiwgMHgwMDVDLCAweDAwMDUsIDB4MDJBMiwKKyAgICAweDAxMUQsIDB4MDEzMiwgMHgwNzZDLCAweDAwMTIsIDB4MDAxOCwgMHgwMUU0LCAweDA1RTQsIDB4MDJCMiwKKyAgICAweDA0MzIsIDB4MDE3RCwgMHgwMDBFLCAweDA1NUQsIDB4MDk1NSwgMHgwMTY0LCAweDAwMjgsIDB4MEQ2MiwKKyAgICAweDBCMjQsIDB4MDJERSwgMHgwMDFFLCAweDAzNDAsIDB4MDAxNCwgMHgwNTU1LCAweDAxODAsIDB4MDBERCwKKyAgICAweDAxQjIsIDB4MDA5MiwgMHgwMzZDLCAweDAwRUMsIDB4MDBFNCwgMHgwMEMwLCAweDBDNjQsIDB4MDk1RCwKKyAgICAweDAxREUsIDB4MEFFNCwgMHgwQzMyLCAweDAxQTIsIDB4MDZFNCwgMHgwODMyLCAweDAxQTQsIDB4MDE1RCwKKyAgICAweDA3MzIsIDB4MDMxRCwgMHgwRjlDLCAweDAzRTIsIDB4MDlFMiwgMHgwMkZELCAweDAyMjQsIDB4MDUxRCwKKyAgICAweDAyRTQsIDB4MDE5QywgMHgwNUIyLCAweDAzNTUsIDB4MDA2NCwgMHgwMTZDLCAweDAzOEMsIDB4MDg4MCwKKyAgICAweDA0ODAsIDB4MDZCMiwgMHgwNTQwLCAweDAwODAsIDB4MDc1RCwgMHgwMTU1LCAweDA0MjQsIDB4MDY4MCwKKyAgICAweDBBNjIsIDB4MEE4MCwgMHgwNzhDLCAweDBEOUMsIDB4MEY4QywgMHgwNTYyLCAweDBGRjIsIDB4MDQ2NCwKKyAgICAweDBCNTUsIDB4MDFFMiwgMHgwMDMyLCAweDA3RjIsIDB4MDE0MCwgMHgwM0U0LCAweDA2NjIsIDB4MDc1NSwKKyAgICAweDAzODAsIDB4MDI2QywgMHgwMjMyLCAweDAwMUQsIDB4MDA0MCwgMHgwMEUyLCAweDAzNUQsIDB4MDBGMiwKKyAgICAweDAxNjIsIDB4MDFGRCwgMHgwM0YyLCAweDAwMEMsIDB4MEVBMiwgMHgwNUYyLCAweDAwNzIsIDB4MDRFNCwKKyAgICAweDBGMzIsIDB4MDE4QywgMHgwMDlELCAweDAzMjQsIDB4MDc5QywgMHgwMDZDLCAweDAwNTQsIDB4MEY1RCwKKyAgICAweDAyMUQsIDB4MDAxNSwgMHgwMDI0LCAweDA2QTIsIDB4MDA5QywgMHgwMDA0LCAweDAwNjIsIDB4MDU2QywKKyAgICAweDAyNjIsIDB4MDAwMCwgMHgwMDJFLCAweDAxRjIsIDB4MDEyNCwgMHgwMzlDLCAweDAwNUUsIDB4MDAxMCwKKyAgICAweDA3MjQsIDB4MDBBNCwgMHgwMERFLCAweDAzNjIsIDB4MDA1MiwgMHgwMDBELCAweDAzQjIsIDB4MDA3RCwKKyAgICAweDA1RTIsIDB4MDBENSwgMHgwMDVELCAweDAwMzUsIDB4MDAwOSwgMHgwOTlDLCAweDAwMjIsIDB4MDAyQywKKyAgICAweDAwM0QsIDB4MDAwOCwgMHgwMDAyLCAweDAwMDYsIDB4MDAwNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFjX3ZsY19kZXNjMl9iaXRzWzE2NV0gPSB7CisgICAgIDYsIDEyLCAxMiwgIDgsICA3LCAgOCwgIDYsICA2LAorICAgICA0LCAgMywgMTAsICA5LCAxMSwgIDksICA5LCAgNiwKKyAgICAgNCwgMTEsIDEwLCAxMCwgMTAsICA3LCAgNSwgMTEsCisgICAgMTEsIDEwLCAxMSwgIDgsICA1LCAxMSwgMTEsIDExLAorICAgIDEyLCAgOSwgIDYsIDExLCAxMiwgIDksICA2LCAxMiwKKyAgICAxMiwgMTAsICA3LCAxMCwgIDcsIDExLCAxMCwgIDgsCisgICAgMTEsICA4LCAxMSwgIDgsIDExLCAgOCwgMTIsIDEyLAorICAgICA5LCAxMiwgMTIsICA5LCAxMSwgMTIsICA5LCAxMiwKKyAgICAxMiwgMTAsIDEyLCAxMCwgMTIsIDEwLCAxMCwgMTEsCisgICAgMTIsIDEyLCAxMSwgMTIsIDExLCAxMSwgMTEsIDEyLAorICAgIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDExLCAxMSwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLAorICAgIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksIDExLCAgOSwKKyAgICAxMSwgIDksIDExLCAgOCwgMTIsIDExLCAgOCwgMTEsCisgICAgMTIsIDEwLCAgOCwgMTIsIDEyLCAxMCwgIDcsIDEyLAorICAgIDEwLCAgNywgMTEsIDEyLCAgOSwgIDYsIDEwLCAxMSwKKyAgICAxMiwgIDgsICA2LCAxMSwgMTAsIDExLCAgOCwgIDUsCisgICAgMTEsICA5LCAxMCwgMTAsICA3LCAgNSwgMTAsICA5LAorICAgIDExLCAgOSwgIDksICA2LCAgNCwgMTIsICA4LCAgNywKKyAgICAgOCwgIDYsICA2LCAgNCwgIDMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfdmxjX2Rlc2MzX3N5bXNbMTYyXSA9IHsKKyAgIDB4MTAwMCwgMHhGRjgsIDB4RkY3LCAweEZGNiwgMHhGRjUsIDB4RkY0LCAweEZGMywgMHhGRjIsCisgICAgMHhGRjEsIDB4RkYwLCAweEZFNiwgMHhGRTUsIDB4RkU0LCAweEZFMywgMHhGRTIsIDB4RkUxLAorICAgIDB4RkUwLCAweEZENiwgMHhGRDUsIDB4RkQ0LCAweEZEMywgMHhGRDIsIDB4RkQxLCAweEZEMCwKKyAgICAweEZDNiwgMHhGQzUsIDB4RkMzLCAweEZDMiwgMHhGQzEsIDB4RkMwLCAweEZCNSwgMHhGQjMsCisgICAgMHhGQjIsIDB4RkIxLCAweEZCMCwgMHhGQTUsIDB4RkEzLCAweEZBMSwgMHhGQTAsIDB4Rjk1LAorICAgIDB4RjkzLCAweEY5MSwgMHhGOTAsIDB4Rjg1LCAweEY4MywgMHhGODEsIDB4RjgwLCAweEY3MSwKKyAgICAweEY3MCwgMHhGNjYsIDB4RjYxLCAweEY2MCwgMHhGNTYsIDB4RjUxLCAweEY1MCwgMHhGNDYsCisgICAgMHhGNDEsIDB4RjQwLCAweEYzNiwgMHhGMzEsIDB4RjMwLCAweEYyNiwgMHhGMjEsIDB4RjIwLAorICAgIDB4RjExLCAweEYxMCwgMHhGMDEsIDB4RjAwLCAweEVGMywgMHhFRjEsIDB4RUYwLCAweEVFMywKKyAgICAweEVFMSwgMHhFRTAsIDB4RUQzLCAweEVEMSwgMHhFRDAsIDB4RUMxLCAweEVDMCwgMHhFQjEsCisgICAgMHhFQjAsIDB4RUEwLCAweEU5MCwgMHhFODAsIDB4RTcwLCAweDFFMSwgMHgxRDEsIDB4MUQwLAorICAgIDB4MUMxLCAweDFCMSwgMHgxQTEsIDB4MTgwLCAweDE3MCwgMHgxNjMsIDB4MTYwLCAweDE1MCwKKyAgICAweDE0MCwgMHgxMzAsIDB4MTIzLCAweDEyMCwgMHgxMTMsIDB4MTEwLCAweDEwMCwgMHgwRjAsCisgICAgMHgwRTAsIDB4MEQxLCAweDBEMCwgMHgwQzEsIDB4MEMwLCAweDBCMSwgMHgwQjAsIDB4MEExLAorICAgIDB4MEEwLCAweDA5NSwgMHgwOTEsIDB4MDkwLCAweDA4NSwgMHgwODEsIDB4MDgwLCAweDA3NiwKKyAgICAweDA3NSwgMHgwNzMsIDB4MDcxLCAweDA3MCwgMHgwNjYsIDB4MDY1LCAweDA2MywgMHgwNjEsCisgICAgMHgwNjAsIDB4MDU1LCAweDA1MywgMHgwNTIsIDB4MDUxLCAweDA1MCwgMHgwNDUsIDB4MDQzLAorICAgIDB4MDQyLCAweDA0MSwgMHgwNDAsIDB4MDM2LCAweDAzNSwgMHgwMzQsIDB4MDMzLCAweDAzMiwKKyAgICAweDAzMSwgMHgwMzAsIDB4MDI2LCAweDAyNSwgMHgwMjQsIDB4MDIzLCAweDAyMiwgMHgwMjEsCisgICAgMHgwMjAsIDB4MDE4LCAweDAxNywgMHgwMTYsIDB4MDE1LCAweDAxNCwgMHgwMTMsIDB4MDEyLAorICAgIDB4MDExLCAweDAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzYzNfY29kZXNbMTYyXSA9IHsKKyAgICAweDAwMUQsIDB4MDg3QywgMHgwQUU4LCAweDAwM0EsIDB4MDAxQywgMHgwMDA4LCAweDAwMEMsIDB4MDAzMiwKKyAgICAweDAwMDYsIDB4MDAwMywgMHgwM0E1LCAweDAxRUMsIDB4MDFBNSwgMHgwMDgwLCAweDAwMzAsIDB4MDAwNSwKKyAgICAweDAwMDEsIDB4MDA0MCwgMHgwM0ZDLCAweDAyRDQsIDB4MDE1NCwgMHgwMkZDLCAweDAwM0MsIDB4MDAxNSwKKyAgICAweDA1MUEsIDB4MDAwMCwgMHgwMkVDLCAweDA3N0MsIDB4MDBEMiwgMHgwMDE4LCAweDAzRTgsIDB4MDRFQywKKyAgICAweDAyN0MsIDB4MDFGQSwgMHgwMDIyLCAweDA3NjUsIDB4MEVBNSwgMHgwMDU0LCAweDAwMTAsIDB4MDhFQywKKyAgICAweDBBQUMsIDB4MDNCQSwgMHgwMDQyLCAweDA2NUQsIDB4MEFENCwgMHgwMDVDLCAweDAwMjgsIDB4MDNDMCwKKyAgICAweDAwRTUsIDB4MDM1QywgMHgwNEZBLCAweDAwREMsIDB4MDZBNSwgMHgwNzVDLCAweDAwQzgsIDB4MDVBNSwKKyAgICAweDA0RDQsIDB4MDBCQSwgMHgwMUMwLCAweDA1RTgsIDB4MDEyQywgMHgwMEU4LCAweDAxQjAsIDB4MDBCMCwKKyAgICAweDAyNUQsIDB4MDAyQywgMHgwQTUyLCAweDAyNUMsIDB4MDFFOCwgMHgwMEZBLCAweDAzNDgsIDB4MDY1MiwKKyAgICAweDBCN0MsIDB4MDM2NSwgMHgwMzFBLCAweDBFNTIsIDB4MDExQSwgMHgwMjAwLCAweDAxQkEsIDB4MDJBQywKKyAgICAweDA2RDQsIDB4MDFGQywgMHgwNUJBLCAweDBERkMsIDB4MDI0OCwgMHgwRUU4LCAweDBCMUEsIDB4MENGQywKKyAgICAweDBGNjUsIDB4MEI1QywgMHgwREMwLCAweDAwN0MsIDB4MDU0OCwgMHgwOEE1LCAweDAwRkMsIDB4MDNCMCwKKyAgICAweDAxNDgsIDB4MDZBQywgMHgwMjUyLCAweDA3MUEsIDB4MDJFOCwgMHgwMjQwLCAweDAwQUMsIDB4MDIxQSwKKyAgICAweDAxNDAsIDB4MDhFOCwgMHgwMUFDLCAweDAwRUMsIDB4MDE1MiwgMHgwMEE1LCAweDAwNjgsIDB4MDAxQSwKKyAgICAweDAwNkMsIDB4MDVDMCwgMHgwMTVDLCAweDAwMjUsIDB4MDVCMCwgMHgwMTdDLCAweDAwMTQsIDB4MDQ3QywKKyAgICAweDAwRDQsIDB4MDZFOCwgMHgwMEMwLCAweDAwMDIsIDB4MEE1RCwgMHgwNEU4LCAweDBBN0MsIDB4MDFENCwKKyAgICAweDAwMjAsIDB4MDRBNSwgMHgwN0IwLCAweDAzN0MsIDB4MDE1RCwgMHgwMDJBLCAweDAwNUQsIDB4MDA0OCwKKyAgICAweDA2N0MsIDB4MDA3QSwgMHgwMDA0LCAweDA0RkMsIDB4MDJGQSwgMHgwNjQ4LCAweDAxMDAsIDB4MDA1MiwKKyAgICAweDAwNUEsIDB4MDAwRCwgMHgwMTY1LCAweDAwNjUsIDB4MDJBNSwgMHgwMDcwLCAweDAwRjAsIDB4MDAzRCwKKyAgICAweDAwMDksIDB4MDVGQywgMHgwRTQ4LCAweDAwOUEsIDB4MDAxMiwgMHgwMERELCAweDAwMzQsIDB4MDAwQSwKKyAgICAweDAwMEUsIDB4MDAwNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFjX3ZsY19kZXNjM19iaXRzWzE2Ml0gPSB7CisgICAgIDcsIDEyLCAxMiwgIDgsICA3LCAgNywgIDYsICA2LAorICAgICA0LCAgMywgMTAsICA5LCAxMSwgIDgsICA4LCAgNiwKKyAgICAgNCwgMTAsIDEwLCAxMiwgIDksIDEwLCAgNywgIDUsCisgICAgMTEsIDEwLCAxMCwgMTEsICA4LCAgNSwgMTAsIDExLAorICAgIDEyLCAgOSwgIDYsIDEyLCAxMiwgIDksICA2LCAxMiwKKyAgICAxMiwgMTAsICA3LCAxMSwgMTIsIDEwLCAgNywgMTAsCisgICAgIDgsIDEyLCAxMSwgIDgsIDEyLCAxMSwgIDgsIDExLAorICAgIDExLCAgOSwgMTEsIDExLCAgOSwgMTIsIDExLCAgOSwKKyAgICAxMiwgIDksIDEyLCAxMCwgMTEsIDExLCAxMCwgMTIsCisgICAgMTIsIDExLCAxMiwgMTIsIDExLCAxMCwgMTEsIDEyLAorICAgIDExLCAxMSwgMTEsIDEyLCAxMSwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTEsIDEyLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMiwgMTEsIDEyLCAxMCwgMTAsIDEwLAorICAgICA5LCAxMiwgIDksIDEyLCAgOSwgMTIsICA4LCAxMCwKKyAgICAgOCwgMTIsIDEwLCAgOCwgMTEsIDEwLCAgNywgMTEsCisgICAgMTEsIDEyLCAgOSwgIDcsIDEyLCAxMSwgMTIsICA5LAorICAgICA2LCAxMSwgMTEsIDEyLCAgOSwgIDYsIDEwLCAxMCwKKyAgICAxMSwgIDgsICA1LCAxMiwgMTAsIDEyLCAgOSwgMTAsCisgICAgIDcsICA1LCAxMCwgIDksIDExLCAgOCwgIDgsICA2LAorICAgICA0LCAxMiwgMTIsICA4LCAgNywgIDgsICA2LCAgNiwKKyAgICAgNCwgIDMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfdmxjX2Rlc2M0X3N5bXNbMTMxXSA9IHsKKyAgIDB4MTAwMCwgMHhGRjYsIDB4RkY1LCAweEZGNCwgMHhGRjMsIDB4RkYyLCAweEZGMSwgMHhGRjAsCisgICAgMHhGRTYsIDB4RkU1LCAweEZFNCwgMHhGRTMsIDB4RkUyLCAweEZFMSwgMHhGRTAsIDB4RkQ2LAorICAgIDB4RkQ1LCAweEZEMywgMHhGRDIsIDB4RkQxLCAweEZEMCwgMHhGQzUsIDB4RkMzLCAweEZDMiwKKyAgICAweEZDMSwgMHhGQzAsIDB4RkI1LCAweEZCMywgMHhGQjEsIDB4RkIwLCAweEZBNSwgMHhGQTMsCisgICAgMHhGQTEsIDB4RkEwLCAweEY5MywgMHhGOTEsIDB4RjkwLCAweEY4MSwgMHhGODAsIDB4Rjc2LAorICAgIDB4RjcxLCAweEY3MCwgMHhGNjYsIDB4RjYxLCAweEY2MCwgMHhGNTYsIDB4RjUxLCAweEY1MCwKKyAgICAweEY0MSwgMHhGNDAsIDB4RjMxLCAweEYzMCwgMHhGMjMsIDB4RjIxLCAweEYyMCwgMHhGMTMsCisgICAgMHhGMTEsIDB4RjEwLCAweEYwMywgMHhGMDEsIDB4RjAwLCAweEVGMSwgMHhFRjAsIDB4RUUwLAorICAgIDB4RUQwLCAweEVDMCwgMHhFQjAsIDB4MTkxLCAweDE4MSwgMHgxODAsIDB4MTcxLCAweDE2MSwKKyAgICAweDE0MCwgMHgxMzAsIDB4MTIzLCAweDEyMCwgMHgxMTAsIDB4MTAwLCAweDBGMywgMHgwRjAsCisgICAgMHgwRTAsIDB4MEQwLCAweDBDMCwgMHgwQjEsIDB4MEIwLCAweDBBMSwgMHgwQTAsIDB4MDkxLAorICAgIDB4MDkwLCAweDA4NSwgMHgwODEsIDB4MDgwLCAweDA3NSwgMHgwNzEsIDB4MDcwLCAweDA2NiwKKyAgICAweDA2NSwgMHgwNjMsIDB4MDYxLCAweDA2MCwgMHgwNTYsIDB4MDU1LCAweDA1MywgMHgwNTEsCisgICAgMHgwNTAsIDB4MDQ1LCAweDA0MywgMHgwNDIsIDB4MDQxLCAweDA0MCwgMHgwMzYsIDB4MDM1LAorICAgIDB4MDMzLCAweDAzMiwgMHgwMzEsIDB4MDMwLCAweDAyNiwgMHgwMjUsIDB4MDI0LCAweDAyMywKKyAgICAweDAyMiwgMHgwMjEsIDB4MDIwLCAweDAxOCwgMHgwMTYsIDB4MDE1LCAweDAxNCwgMHgwMTMsCisgICAgMHgwMTIsIDB4MDExLCAweDAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzYzRfY29kZXNbMTMxXSA9IHsKKyAgICAweDAwNkIsIDB4MDBCRSwgMHgwMDUyLCAweDAwRjMsIDB4MDA1QiwgMHgwMDNBLCAweDAwMDksIDB4MDAwNywKKyAgICAweDAwREEsIDB4MDNGQiwgMHgwMTIzLCAweDAwQjMsIDB4MDFCMywgMHgwMDJFLCAweDAwMDYsIDB4MDMwQSwKKyAgICAweDAwNUEsIDB4MDA0QSwgMHgwMzRBLCAweDAwNzIsIDB4MDAwNSwgMHgwMkRBLCAweDAxNzMsIDB4MDRGQiwKKyAgICAweDAwMzIsIDB4MDAxMywgMHgwMzlCLCAweDBCOUIsIDB4MDExRSwgMHgwMDAyLCAweDAwRkIsIDB4MDIxRSwKKyAgICAweDAwOUIsIDB4MDA3RSwgMHgwRTFBLCAweDAzQ0EsIDB4MDA3QiwgMHgwMkZCLCAweDAwMzMsIDB4MDNBQiwKKyAgICAweDA0NjMsIDB4MDA4QSwgMHgwNzczLCAweDA0MUUsIDB4MDAyQiwgMHgwMzFCLCAweDA2NUEsIDB4MDExQSwKKyAgICAweDA2MEEsIDB4MDFEQSwgMHgwOTYzLCAweDAzMjMsIDB4MEJBQiwgMHgwNTlFLCAweDAxMEEsIDB4MDVBQiwKKyAgICAweDBDRkIsIDB4MDcxQiwgMHgwNzlFLCAweDBGOUUsIDB4MDI2MywgMHgwNzlCLCAweDA1NjMsIDB4MDE5RSwKKyAgICAweDAxQUIsIDB4MEU2MywgMHgwMjlCLCAweDA0Q0EsIDB4MERBQiwgMHgwNjYzLCAweDBCMUIsIDB4MDIwQSwKKyAgICAweDBBMUUsIDB4MDIxQSwgMHgwMDYzLCAweDA2MUUsIDB4MDZGQiwgMHgwMjVBLCAweDAxNjMsIDB4MDU3MywKKyAgICAweDAwMEEsIDB4MDIyMywgMHgwMTFCLCAweDBDMUEsIDB4MDE1QSwgMHgwODYzLCAweDAwQUIsIDB4MDJDQSwKKyAgICAweDAwQjIsIDB4MEEwQSwgMHgwMUNBLCAweDAwQTMsIDB4MEI3MywgMHgwMDIzLCAweDAwMTIsIDB4MDM5RSwKKyAgICAweDAwMUEsIDB4MENDQSwgMHgwMUZCLCAweDAwNUUsIDB4MEE5QiwgMHgwMENBLCAweDAzNzMsIDB4MDA5RSwKKyAgICAweDAwMjIsIDB4MDdBQiwgMHgwMDFFLCAweDBFRkIsIDB4MDA5QSwgMHgwMDBCLCAweDA0MUEsIDB4MDE5QiwKKyAgICAweDAzNjMsIDB4MDE0QSwgMHgwMDZBLCAweDAwMTUsIDB4MDY5QiwgMHgwMDczLCAweDA1MjMsIDB4MDAxQiwKKyAgICAweDAxMkIsIDB4MDAwMywgMHgwMDAxLCAweDA2MUEsIDB4MDAzRSwgMHgwMDJBLCAweDAwRTMsIDB4MDAzQiwKKyAgICAweDAwMEUsIDB4MDAwRCwgMHgwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWNfdmxjX2Rlc2M0X2JpdHNbMTMxXSA9IHsKKyAgICAgNywgIDgsICA3LCAgOCwgIDcsICA2LCAgNCwgIDMsCisgICAgMTAsIDEwLCAxMSwgIDksICA5LCAgNiwgIDQsIDEwLAorICAgIDEwLCAgOSwgMTAsICA3LCAgNSwgMTAsIDExLCAxMiwKKyAgICAgOCwgIDYsIDEyLCAxMiwgIDksICA2LCAxMSwgMTIsCisgICAgMTAsICA3LCAxMiwgMTAsICA4LCAxMSwgIDgsIDEyLAorICAgIDExLCAgOCwgMTEsIDExLCAgOSwgMTIsIDExLCAgOSwKKyAgICAxMSwgIDksIDEyLCAxMCwgMTIsIDExLCAxMCwgMTIsCisgICAgMTIsIDExLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTEsIDEyLCAxMSwgMTIsIDExLCAxMiwgMTEsCisgICAgMTAsIDEwLCAxMCwgMTIsICA5LCAxMiwgIDksIDEwLAorICAgICA4LCAxMiwgMTAsICA4LCAxMiwgMTAsICA3LCAxMSwKKyAgICAxMSwgMTIsIDEwLCAgNywgMTIsIDExLCAxMiwgIDksCisgICAgIDYsIDExLCAxMSwgMTIsICA4LCAgNiwgMTIsIDEwLAorICAgIDEwLCAxMCwgIDcsICA1LCAxMSwgIDksIDExLCAgOSwKKyAgICAgOSwgIDYsICA0LCAxMiwgIDgsICA3LCAgOCwgIDcsCisgICAgIDYsICA0LCAgMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzYzVfc3ltc1sxMzJdID0geworICAgMHgxMDAwLCAweEZGOCwgMHhGRjYsIDB4RkY1LCAweEZGNCwgMHhGRjMsIDB4RkYyLCAweEZGMSwKKyAgICAweEZGMCwgMHhGRTYsIDB4RkU1LCAweEZFNCwgMHhGRTMsIDB4RkUyLCAweEZFMSwgMHhGRTAsCisgICAgMHhGRDYsIDB4RkQ1LCAweEZENCwgMHhGRDMsIDB4RkQyLCAweEZEMSwgMHhGRDAsIDB4RkM1LAorICAgIDB4RkMzLCAweEZDMiwgMHhGQzEsIDB4RkMwLCAweEZCNSwgMHhGQjMsIDB4RkIxLCAweEZCMCwKKyAgICAweEZBMywgMHhGQTEsIDB4RkEwLCAweEY5NiwgMHhGOTMsIDB4RjkxLCAweEY5MCwgMHhGODYsCisgICAgMHhGODUsIDB4RjgxLCAweEY4MCwgMHhGNzYsIDB4Rjc1LCAweEY3MSwgMHhGNzAsIDB4RjY2LAorICAgIDB4RjYxLCAweEY2MCwgMHhGNTEsIDB4RjUwLCAweEY0MywgMHhGNDEsIDB4RjQwLCAweEYzMywKKyAgICAweEYzMSwgMHhGMzAsIDB4RjIzLCAweEYyMSwgMHhGMjAsIDB4RjExLCAweEYxMCwgMHhGMDAsCisgICAgMHhFRjAsIDB4RUUwLCAweEVDMSwgMHhFQzAsIDB4MTUxLCAweDE0MSwgMHgxNDAsIDB4MTMxLAorICAgIDB4MTIxLCAweDEyMCwgMHgxMTEsIDB4MTEwLCAweDEwMywgMHgxMDAsIDB4MEYwLCAweDBFMCwKKyAgICAweDBEMywgMHgwRDAsIDB4MEMzLCAweDBDMSwgMHgwQzAsIDB4MEIxLCAweDBCMCwgMHgwQTEsCisgICAgMHgwQTAsIDB4MDkxLCAweDA5MCwgMHgwODEsIDB4MDgwLCAweDA3NSwgMHgwNzEsIDB4MDcwLAorICAgIDB4MDY1LCAweDA2MSwgMHgwNjAsIDB4MDU2LCAweDA1NSwgMHgwNTMsIDB4MDUyLCAweDA1MSwKKyAgICAweDA1MCwgMHgwNDYsIDB4MDQ1LCAweDA0MywgMHgwNDIsIDB4MDQxLCAweDA0MCwgMHgwMzUsCisgICAgMHgwMzQsIDB4MDMzLCAweDAzMiwgMHgwMzEsIDB4MDMwLCAweDAyNiwgMHgwMjUsIDB4MDI0LAorICAgIDB4MDIzLCAweDAyMiwgMHgwMjEsIDB4MDIwLCAweDAxOCwgMHgwMTYsIDB4MDE1LCAweDAxNCwKKyAgICAweDAxMywgMHgwMTIsIDB4MDExLCAweDAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzYzVfY29kZXNbMTMyXSA9IHsKKyAgICAweDAwMDEsIDB4MEQ2MiwgMHgwMEJELCAweDAwMjIsIDB4MDA5QiwgMHgwMDMyLCAweDAwMTksIDB4MDAwNSwKKyAgICAweDAwMDcsIDB4MDM0RCwgMHgwMDlBLCAweDAxMkIsIDB4MDA1MiwgMHgwMDZCLCAweDAwM0EsIDB4MDAwNiwKKyAgICAweDA2RkQsIDB4MDE3RCwgMHgwODFBLCAweDAzMUIsIDB4MDMxQSwgMHgwMDEyLCAweDAwMTEsIDB4MDIwMiwKKyAgICAweDAwRkQsIDB4MDUxQiwgMHgwMEQyLCAweDAwMUQsIDB4MDExQSwgMHgwNzgyLCAweDAxOEQsIDB4MDA3QiwKKyAgICAweDA2N0QsIDB4MDM3RCwgMHgwMDIxLCAweDBFOEQsIDB4MDU2MiwgMHgwMDhELCAweDAwQkIsIDB4MDUzRCwKKyAgICAweDA4MkEsIDB4MDAwMiwgMHgwMDBELCAweDAzMDIsIDB4MDA3RCwgMHgwNTNCLCAweDAwM0IsIDB4MEE0RCwKKyAgICAweDAyN0QsIDB4MDFGRCwgMHgwNDJBLCAweDAxQzIsIDB4MDQxQSwgMHgwMTgyLCAweDAxNEQsIDB4MDE2MiwKKyAgICAweDAwQzIsIDB4MDMyQSwgMHgwRDlBLCAweDAxMkEsIDB4MDEwMiwgMHgwODdELCAweDA3MkIsIDB4MDM5QSwKKyAgICAweDAzNjIsIDB4MDE5QSwgMHgwQzYyLCAweDA0QzIsIDB4MEQxQiwgMHgwMjhELCAweDA3NjIsIDB4MEU3RCwKKyAgICAweDBFNDEsIDB4MDU5QSwgMHgwMjRELCAweDA5M0IsIDB4MDUyQiwgMHgwMTFCLCAweDA2NEQsIDB4MDEzRCwKKyAgICAweDAzODIsIDB4MDI2MiwgMHgwNjQxLCAweDA0NjIsIDB4MDA0RCwgMHgwQ0MyLCAweDAzM0IsIDB4MDY4RCwKKyAgICAweDAxNDEsIDB4MEQyQiwgMHgwMDFCLCAweDAwNDEsIDB4MDBDMSwgMHgwQzQxLCAweDAxRTIsIDB4MDBFQiwKKyAgICAweDA2MkEsIDB4MDA4MiwgMHgwMDYxLCAweDAyRkQsIDB4MDQ3RCwgMHgwMTNCLCAweDAwMkEsIDB4MDAzRCwKKyAgICAweDAwNUIsIDB4MDIyQSwgMHgwMkMyLCAweDAyNDEsIDB4MDA2MiwgMHgwMEFBLCAweDAwMEIsIDB4MDBFMiwKKyAgICAweDAwMUEsIDB4MDMzRCwgMHgwMjFBLCAweDAwNkEsIDB4MDAwOSwgMHgwMzJCLCAweDAwMkIsIDB4MDRGRCwKKyAgICAweDAwNDIsIDB4MDE2QiwgMHgwMDJELCAweDAwMEUsIDB4MDQ0MSwgMHgwMENELCAweDAwNUEsIDB4MDBBQiwKKyAgICAweDAwMEEsIDB4MDAzOSwgMHgwMDAzLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhY192bGNfZGVzYzVfYml0c1sxMzJdID0geworICAgICA3LCAxMiwgIDgsICA3LCAgOCwgIDYsICA2LCAgNCwKKyAgICAgMywgMTAsICA5LCAxMSwgIDgsICA5LCAgNiwgIDQsCisgICAgMTEsIDEwLCAxMiwgMTAsIDEwLCAgNywgIDUsIDEwLAorICAgIDExLCAxMiwgIDgsICA2LCAxMCwgMTEsICA5LCAgNywKKyAgICAxMiwgMTAsICA3LCAxMiwgMTIsIDEwLCAgOCwgMTEsCisgICAgMTIsIDEwLCAgOCwgMTAsIDEyLCAxMSwgIDksIDEyLAorICAgIDExLCAgOSwgMTEsICA5LCAxMSwgMTAsIDEwLCAxMSwKKyAgICAxMSwgMTAsIDEyLCAxMCwgMTAsIDEyLCAxMSwgMTAsCisgICAgMTEsIDExLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTAsIDEyLCAxMiwgMTAsIDEyLCAxMCwgMTIsCisgICAgIDksIDEyLCAgOSwgMTEsICA4LCAxMiwgIDksICA4LAorICAgIDExLCAgOSwgIDcsIDExLCAxMSwgMTIsIDEyLCAgOSwKKyAgICAgNywgMTEsIDEwLCAxMSwgMTEsICA4LCAgNiwgIDksCisgICAgMTIsIDEwLCAxMCwgIDcsICA1LCAxMSwgIDksIDExLAorICAgICA4LCAgOSwgIDYsICA0LCAxMiwgIDgsICA3LCAgOCwKKyAgICAgNiwgIDYsICA0LCAgMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzYzZfc3ltc1sxMzBdID0geworICAgMHgxMDAwLCAweEZGOCwgMHhGRjcsIDB4RkY2LCAweEZGNSwgMHhGRjQsIDB4RkYzLCAweEZGMiwKKyAgICAweEZGMSwgMHhGRjAsIDB4RkU2LCAweEZFNSwgMHhGRTQsIDB4RkUzLCAweEZFMiwgMHhGRTEsCisgICAgMHhGRTAsIDB4RkQ2LCAweEZENSwgMHhGRDQsIDB4RkQzLCAweEZEMiwgMHhGRDEsIDB4RkQwLAorICAgIDB4RkM1LCAweEZDMywgMHhGQzIsIDB4RkMxLCAweEZDMCwgMHhGQjUsIDB4RkIzLCAweEZCMSwKKyAgICAweEZCMCwgMHhGQTYsIDB4RkEzLCAweEZBMSwgMHhGQTAsIDB4Rjk2LCAweEY5NSwgMHhGOTMsCisgICAgMHhGOTEsIDB4RjkwLCAweEY4NiwgMHhGODUsIDB4RjgxLCAweEY4MCwgMHhGNzYsIDB4RjcxLAorICAgIDB4RjcwLCAweEY2MywgMHhGNjEsIDB4RjYwLCAweEY1MywgMHhGNTEsIDB4RjUwLCAweEY0MywKKyAgICAweEY0MSwgMHhGNDAsIDB4RjMxLCAweEYzMCwgMHhGMjAsIDB4RjEwLCAweEYwMCwgMHhFRjAsCisgICAgMHhFRTEsIDB4MTMxLCAweDEyMSwgMHgxMjAsIDB4MTExLCAweDExMCwgMHgxMDEsIDB4MTAwLAorICAgIDB4MEYxLCAweDBGMCwgMHgwRTMsIDB4MEUxLCAweDBFMCwgMHgwRDEsIDB4MEQwLCAweDBDMywKKyAgICAweDBDMCwgMHgwQjMsIDB4MEIxLCAweDBCMCwgMHgwQTEsIDB4MEEwLCAweDA5MSwgMHgwOTAsCisgICAgMHgwODEsIDB4MDgwLCAweDA3NSwgMHgwNzEsIDB4MDcwLCAweDA2NSwgMHgwNjMsIDB4MDYxLAorICAgIDB4MDYwLCAweDA1NiwgMHgwNTUsIDB4MDUzLCAweDA1MSwgMHgwNTAsIDB4MDQ2LCAweDA0NSwKKyAgICAweDA0MywgMHgwNDIsIDB4MDQxLCAweDA0MCwgMHgwMzYsIDB4MDM1LCAweDAzNCwgMHgwMzMsCisgICAgMHgwMzIsIDB4MDMxLCAweDAzMCwgMHgwMjYsIDB4MDI1LCAweDAyNCwgMHgwMjMsIDB4MDIyLAorICAgIDB4MDIxLCAweDAyMCwgMHgwMTgsIDB4MDE2LCAweDAxNSwgMHgwMTQsIDB4MDEzLCAweDAxMiwKKyAgICAweDAxMSwgMHgwMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfdmxjX2Rlc2M2X2NvZGVzWzEzMF0gPSB7CisgICAgMHgwMDIyLCAweDBCQjIsIDB4MDk0MiwgMHgwMDJCLCAweDAwNzIsIDB4MDAwMiwgMHgwMDFBLCAweDAwMzksCisgICAgMHgwMDBELCAweDAwMDcsIDB4MDA3QiwgMHgwMDhFLCAweDA2REIsIDB4MDBFQSwgMHgwMTVCLCAweDAwMkUsCisgICAgMHgwMDA2LCAweDA5NTksIDB4MDI3QiwgMHgwQTBFLCAweDAxQUIsIDB4MDA4QSwgMHgwMDEyLCAweDAwMUUsCisgICAgMHgwNTc1LCAweDAwNUIsIDB4MDJBQiwgMHgwMEMyLCAweDAwMTUsIDB4MDM2QSwgMHgwNEIyLCAweDAwOTksCisgICAgMHgwMDFCLCAweDA1MTksIDB4MEMxOSwgMHgwMERCLCAweDAwNEUsIDB4MDA0MiwgMHgwMTU5LCAweDAzQjIsCisgICAgMHgwMzBFLCAweDAwRUIsIDB4MDI1MiwgMHgwRUFCLCAweDAxOEEsIDB4MDBFMiwgMHgwNkFCLCAweDAyNDIsCisgICAgMHgwMTdCLCAweDA0NTIsIDB4MDMxOSwgMHgwMTUyLCAweDAyNUIsIDB4MDE2QSwgMHgwMEFCLCAweDAwNTIsCisgICAgMHgwNUIyLCAweDAxMEUsIDB4MDM4RSwgMHgwMjhBLCAweDAzNTksIDB4MDAxOSwgMHgwNzhBLCAweDBDNTIsCisgICAgMHgwRDhFLCAweDBFRDksIDB4MDJEOSwgMHgwNjYyLCAweDAxMTksIDB4MDlCMiwgMHgwQkFCLCAweDBEMTksCisgICAgMHgwQzVCLCAweDAwQjIsIDB4MDU0MiwgMHgwQjhBLCAweDAyQjIsIDB4MDE0MiwgMHgwNjVCLCAweDA1OEUsCisgICAgMHgwMDYyLCAweDAxOEUsIDB4MDM4QSwgMHgwMEQ5LCAweDA0MTksIDB4MDE2MiwgMHgwM0FCLCAweDAwNzUsCisgICAgMHgwN0IyLCAweDAwMzIsIDB4MDIwRSwgMHgwN0FCLCAweDAwNkIsIDB4MDQ1QiwgMHgwMUIyLCAweDAxOTksCisgICAgMHgwMDJBLCAweDAzNzUsIDB4MDc3NSwgMHgwQUFCLCAweDAxRDksIDB4MDAzQiwgMHgwNjBFLCAweDAzNDIsCisgICAgMHgwMTc1LCAweDAyNjIsIDB4MDAwQSwgMHgwMDA1LCAweDA1NTksIDB4MDA2QSwgMHgwRDU5LCAweDAyMTksCisgICAgMHgwMDBFLCAweDAwNEEsIDB4MDAwOSwgMHgwNzE5LCAweDAwNTksIDB4MDJEQiwgMHgwMEQyLCAweDAxREIsCisgICAgMHgwMDI1LCAweDAwMDEsIDB4MDZEOSwgMHgwMEY1LCAweDAwMzUsIDB4MDBGQiwgMHgwMDNBLCAweDAwMEIsCisgICAgMHgwMDAzLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhY192bGNfZGVzYzZfYml0c1sxMzBdID0geworICAgICA3LCAxMiwgMTIsICA4LCAgNywgIDcsICA2LCAgNiwKKyAgICAgNCwgIDMsIDEwLCAgOSwgMTEsICA4LCAgOSwgIDYsCisgICAgIDQsIDEyLCAxMCwgMTIsIDEwLCAxMCwgIDcsICA1LAorICAgIDExLCAxMSwgMTIsICA4LCAgNiwgMTAsIDExLCAgOSwKKyAgICAgNywgMTIsIDEyLCAxMCwgIDcsIDEwLCAxMiwgMTIsCisgICAgMTAsICA4LCAxMCwgMTIsIDEwLCAgOCwgMTIsIDEwLAorICAgICA5LCAxMiwgMTEsICA5LCAxMSwgMTAsIDEwLCAxMSwKKyAgICAxMSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsCisgICAgMTIsIDEyLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMSwgMTEsIDEyLCAxMCwgMTIsIDExLCAxMiwKKyAgICAxMCwgMTEsIDEyLCAxMCwgMTIsICA5LCAxMiwgIDksCisgICAgMTEsICA4LCAxMiwgMTEsICA4LCAxMiwgMTIsICA5LAorICAgICA3LCAxMSwgMTEsIDEyLCAgOSwgIDcsIDExLCAxMCwKKyAgICAxMSwgMTEsICA4LCAgNiwgMTIsICA5LCAxMiwgMTAsCisgICAgMTAsICA3LCAgNSwgMTEsICA5LCAxMSwgIDgsICA5LAorICAgICA2LCAgNCwgMTIsICA4LCAgNywgIDgsICA2LCAgNiwKKyAgICAgNCwgIDIsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfdmxjX2Rlc2M3X3N5bXNbMTI1XSA9IHsKKyAgIDB4MTAwMCwgMHhGRjgsIDB4RkY3LCAweEZGNiwgMHhGRjUsIDB4RkY0LCAweEZGMywgMHhGRjIsCisgICAgMHhGRjEsIDB4RkYwLCAweEZFNiwgMHhGRTUsIDB4RkU0LCAweEZFMywgMHhGRTIsIDB4RkUxLAorICAgIDB4RkUwLCAweEZENSwgMHhGRDQsIDB4RkQzLCAweEZEMiwgMHhGRDEsIDB4RkQwLCAweEZDNSwKKyAgICAweEZDMywgMHhGQzIsIDB4RkMxLCAweEZDMCwgMHhGQjUsIDB4RkIzLCAweEZCMSwgMHhGQjAsCisgICAgMHhGQTYsIDB4RkE1LCAweEZBMywgMHhGQTEsIDB4RkEwLCAweEY5NiwgMHhGOTUsIDB4RjkzLAorICAgIDB4RjkxLCAweEY5MCwgMHhGODYsIDB4RjgxLCAweEY4MCwgMHhGNzMsIDB4RjcxLCAweEY3MCwKKyAgICAweEY2MywgMHhGNjEsIDB4RjYwLCAweEY1MywgMHhGNTEsIDB4RjUwLCAweEY0MSwgMHhGNDAsCisgICAgMHhGMzEsIDB4RjMwLCAweEYyMCwgMHhGMTAsIDB4RjAxLCAweEYwMCwgMHgxMjEsIDB4MTExLAorICAgIDB4MTAxLCAweDEwMCwgMHgwRjEsIDB4MEYwLCAweDBFMSwgMHgwRTAsIDB4MEQxLCAweDBEMCwKKyAgICAweDBDMywgMHgwQzEsIDB4MEMwLCAweDBCMSwgMHgwQjAsIDB4MEEzLCAweDBBMSwgMHgwQTAsCisgICAgMHgwOTMsIDB4MDkxLCAweDA5MCwgMHgwODEsIDB4MDgwLCAweDA3MSwgMHgwNzAsIDB4MDY1LAorICAgIDB4MDYzLCAweDA2MSwgMHgwNjAsIDB4MDU1LCAweDA1MywgMHgwNTIsIDB4MDUxLCAweDA1MCwKKyAgICAweDA0NiwgMHgwNDUsIDB4MDQzLCAweDA0MiwgMHgwNDEsIDB4MDQwLCAweDAzNiwgMHgwMzUsCisgICAgMHgwMzQsIDB4MDMzLCAweDAzMiwgMHgwMzEsIDB4MDMwLCAweDAyNiwgMHgwMjUsIDB4MDI0LAorICAgIDB4MDIzLCAweDAyMiwgMHgwMjEsIDB4MDIwLCAweDAxOCwgMHgwMTcsIDB4MDE2LCAweDAxNSwKKyAgICAweDAxNCwgMHgwMTMsIDB4MDEyLCAweDAxMSwgMHgwMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfdmxjX2Rlc2M3X2NvZGVzWzEyNV0gPSB7CisgICAgMHgwMDUzLCAweDAwOUEsIDB4MEVFMiwgMHgwMEQzLCAweDAwNkEsIDB4MDA1MiwgMHgwMDNBLCAweDAwMzUsCisgICAgMHgwMDBELCAweDAwMDcsIDB4MDA2MiwgMHgwMTI1LCAweDAxNDIsIDB4MDAxOSwgMHgwMUYzLCAweDAwMjksCisgICAgMHgwMDBFLCAweDAwODIsIDB4MEFEQSwgMHgwMkUzLCAweDAwRTIsIDB4MDAyMiwgMHgwMDA2LCAweDAwNjUsCisgICAgMHgwNUUzLCAweDA3NjUsIDB4MDAzMiwgMHgwMDM5LCAweDBGOTksIDB4MDVFMiwgMHgwMDk5LCAweDAwMzMsCisgICAgMHgwMzYyLCAweDA3OTksIDB4MEY2NSwgMHgwMDczLCAweDAwNEEsIDB4MDJBNSwgMHgwMTYyLCAweDA3NDIsCisgICAgMHgwMUE1LCAweDAwRDksIDB4MDM0MiwgMHgwMDVBLCAweDAwQUEsIDB4MEVGMywgMHgwMTgyLCAweDAxREEsCisgICAgMHgwMzgyLCAweDAzNUEsIDB4MDBGMywgMHgwNjczLCAweDAxNjUsIDB4MDBFNSwgMHgwNkYzLCAweDAyMjUsCisgICAgMHgwODQyLCAweDAyNUEsIDB4MDdFMywgMHgwMzk5LCAweDA3QTUsIDB4MDcyQSwgMHgwRjJBLCAweDA5RTMsCisgICAgMHgwMjczLCAweDA0OUEsIDB4MDJFNSwgMHgwQjk5LCAweDAyRTIsIDB4MEU3MywgMHgwNTYyLCAweDAyRjMsCisgICAgMHgwMzJBLCAweDBGNDIsIDB4MDBEQSwgMHgwOTk5LCAweDAxMkEsIDB4MDM2NSwgMHgwMEE1LCAweDAwRTMsCisgICAgMHgwMTk5LCAweDAzRTMsIDB4MDE5QSwgMHgwMUUyLCAweDAxNzMsIDB4MDZFNSwgMHgwMDU5LCAweDAxRTMsCisgICAgMHgwMkRBLCAweDAwMkEsIDB4MDAwQSwgMHgwNkRBLCAweDBGQTUsIDB4MDA0MiwgMHgwMUU1LCAweDAwMTMsCisgICAgMHgwM0UyLCAweDAxNUEsIDB4MDNBNSwgMHgwNDQyLCAweDAwMUEsIDB4MDAwNSwgMHgwNEE1LCAweDAyNjUsCisgICAgMHgwOEE1LCAweDAwMjUsIDB4MDI5QSwgMHgwMDcyLCAweDAwMTYsIDB4MDU5OSwgMHgwMEMyLCAweDAyNDIsCisgICAgMHgwMEIyLCAweDAwMDIsIDB4MDAxNSwgMHgwMDAxLCAweDBCRTMsIDB4MDZFMiwgMHgwMDYzLCAweDAwMjMsCisgICAgMHgwMDEyLCAweDAwMDksIDB4MDAwMywgMHgwMDBCLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhY192bGNfZGVzYzdfYml0c1sxMjVdID0geworICAgICA4LCAxMSwgMTIsICA4LCAgNywgIDcsICA2LCAgNiwKKyAgICAgNCwgIDMsICA5LCAgOSwgMTAsICA4LCAgOSwgIDYsCisgICAgIDQsICA5LCAxMiwgMTAsIDEwLCAgNywgIDUsIDEwLAorICAgIDExLCAxMiwgIDgsICA2LCAxMiwgMTEsICA5LCAgNywKKyAgICAxMCwgMTIsIDEyLCAxMCwgIDcsIDEwLCAxMSwgMTIsCisgICAgMTAsICA4LCAxMSwgMTAsICA4LCAxMiwgMTAsICA5LAorICAgIDEwLCAxMCwgMTAsIDEyLCAxMCwgMTAsIDEyLCAxMCwKKyAgICAxMiwgMTAsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTEsIDExLCAxMSwgMTIsIDExLCAxMiwgMTEsIDExLAorICAgIDExLCAxMiwgMTAsIDEyLCAxMCwgMTEsIDEyLCAxMCwKKyAgICAxMiwgMTIsICA5LCAxMSwgIDksIDExLCAgOCwgMTIsCisgICAgMTIsICA5LCAgNywgMTEsIDEyLCAxMiwgIDksICA3LAorICAgIDEwLCAxMCwgMTEsIDExLCAgOCwgIDYsIDExLCAxMCwKKyAgICAxMiwgMTAsIDEwLCAgNywgIDUsIDExLCAgOCwgMTAsCisgICAgIDgsICA4LCAgNiwgIDQsIDEyLCAxMiwgIDgsICA3LAorICAgICA3LCAgNiwgIDYsICA0LCAgMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzYzhfc3ltc1sxMjFdID0geworICAgMHgxMDAwLCAweEZGOCwgMHhGRjcsIDB4RkY2LCAweEZGNSwgMHhGRjQsIDB4RkYzLCAweEZGMiwKKyAgICAweEZGMSwgMHhGRjAsIDB4RkU2LCAweEZFNSwgMHhGRTQsIDB4RkUzLCAweEZFMiwgMHhGRTEsCisgICAgMHhGRTAsIDB4RkQ1LCAweEZENCwgMHhGRDMsIDB4RkQyLCAweEZEMSwgMHhGRDAsIDB4RkM1LAorICAgIDB4RkMzLCAweEZDMiwgMHhGQzEsIDB4RkMwLCAweEZCNiwgMHhGQjUsIDB4RkIzLCAweEZCMSwKKyAgICAweEZCMCwgMHhGQTYsIDB4RkE1LCAweEZBMywgMHhGQTEsIDB4RkEwLCAweEY5NiwgMHhGOTUsCisgICAgMHhGOTMsIDB4RjkxLCAweEY5MCwgMHhGODYsIDB4RjgzLCAweEY4MSwgMHhGODAsIDB4RjczLAorICAgIDB4RjcxLCAweEY3MCwgMHhGNjMsIDB4RjYxLCAweEY2MCwgMHhGNTEsIDB4RjUwLCAweEY0MSwKKyAgICAweEY0MCwgMHhGMzAsIDB4RjIxLCAweEYyMCwgMHgxMTEsIDB4MTAxLCAweDBGMSwgMHgwRTEsCisgICAgMHgwRTAsIDB4MEQxLCAweDBEMCwgMHgwQzEsIDB4MEMwLCAweDBCMywgMHgwQjEsIDB4MEIwLAorICAgIDB4MEEzLCAweDBBMSwgMHgwQTAsIDB4MDkzLCAweDA5MSwgMHgwOTAsIDB4MDgzLCAweDA4MSwKKyAgICAweDA4MCwgMHgwNzMsIDB4MDcxLCAweDA3MCwgMHgwNjUsIDB4MDYzLCAweDA2MSwgMHgwNjAsCisgICAgMHgwNTUsIDB4MDUzLCAweDA1MSwgMHgwNTAsIDB4MDQ2LCAweDA0NSwgMHgwNDMsIDB4MDQyLAorICAgIDB4MDQxLCAweDA0MCwgMHgwMzYsIDB4MDM1LCAweDAzNCwgMHgwMzMsIDB4MDMyLCAweDAzMSwKKyAgICAweDAzMCwgMHgwMjYsIDB4MDI1LCAweDAyNCwgMHgwMjMsIDB4MDIyLCAweDAyMSwgMHgwMjAsCisgICAgMHgwMTgsIDB4MDE3LCAweDAxNiwgMHgwMTUsIDB4MDE0LCAweDAxMywgMHgwMTIsIDB4MDExLAorICAgIDB4MDEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGFjX3ZsY19kZXNjOF9jb2Rlc1sxMjFdID0geworICAgIDB4MDBGNiwgMHgwNjc2LCAweDBFQjYsIDB4MDBGMywgMHgwMDU2LCAweDAwNkEsIDB4MDAzOSwgMHgwMDAzLAorICAgIDB4MDAwRCwgMHgwMDA3LCAweDAwQTIsIDB4MDE3MywgMHgwMENBLCAweDAwMjUsIDB4MDA4MiwgMHgwMDE5LAorICAgIDB4MDAwMSwgMHgwMEI2LCAweDAyNzYsIDB4MDJFMywgMHgwMEIyLCAweDAwNjIsIDB4MDAxQSwgMHgwMTc1LAorICAgIDB4MDFFMywgMHgwQkU1LCAweDAwNEEsIDB4MDAyOSwgMHgwN0E1LCAweDAwRTMsIDB4MDMwQSwgMHgwMTc2LAorICAgIDB4MDAyMywgMHgwMDQyLCAweDA1Q0EsIDB4MDBBNSwgMHgwMTQyLCAweDAwNTIsIDB4MDRBNSwgMHgwQjAyLAorICAgIDB4MEQyMiwgMHgwMzc1LCAweDAwNjUsIDB4MDUyMiwgMHgwREUzLCAweDAxMEEsIDB4MDBGNSwgMHgwMTM2LAorICAgIDB4MDI3NSwgMHgwMUIyLCAweDAzRjUsIDB4MDNFMywgMHgwMDAyLCAweDA4RTMsIDB4MDFBMiwgMHgwQjM2LAorICAgIDB4MDIwQSwgMHgwMDc2LCAweDBDRTMsIDB4MDdFNSwgMHgwNzBBLCAweDAzQTUsIDB4MDJCNiwgMHgwMDM2LAorICAgIDB4MDFFNSwgMHgwMkE1LCAweDA1RTMsIDB4MDdCNiwgMHgwN0Y1LCAweDA3MzYsIDB4MEJBNSwgMHgwMDc1LAorICAgIDB4MDMwMiwgMHgwRkU1LCAweDAxQjYsIDB4MDEwMiwgMHgwNEUzLCAweDAwMjIsIDB4MDhBNSwgMHgwMUNBLAorICAgIDB4MDBFNSwgMHgwRjBBLCAweDA1RTUsIDB4MDA5NiwgMHgwQTc2LCAweDAzMzYsIDB4MDIzNiwgMHgwMDEyLAorICAgIDB4MDNCNiwgMHgwQkY1LCAweDAwNzMsIDB4MDAzNSwgMHgwMkIyLCAweDAwMEEsIDB4MDQ3NiwgMHgwMTIyLAorICAgIDB4MDAxNiwgMHgwMDA5LCAweDAzMjIsIDB4MDFGNSwgMHgwM0U1LCAweDAxQTUsIDB4MDNDQSwgMHgwMDcyLAorICAgIDB4MDAwNiwgMHgwNkE1LCAweDAwMzIsIDB4MDJDQSwgMHgwMDhBLCAweDAwQzIsIDB4MDAxNSwgMHgwMDBFLAorICAgIDB4MDcwMiwgMHgwNkI2LCAweDAwNjMsIDB4MDAzMywgMHgwMDJBLCAweDAwMDUsIDB4MDAxMywgMHgwMDBCLAorICAgIDB4MDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFjX3ZsY19kZXNjOF9iaXRzWzEyMV0gPSB7CisgICAgIDgsIDExLCAxMiwgIDgsICA3LCAgNywgIDYsICA2LAorICAgICA0LCAgMywgIDksICA5LCAxMCwgIDgsICA4LCAgNiwKKyAgICAgNCwgMTAsIDEyLCAxMCwgMTAsICA3LCAgNSwgMTAsCisgICAgMTEsIDEyLCAgOCwgIDYsIDExLCAxMiwgMTEsICA5LAorICAgICA3LCAgOSwgMTEsIDEyLCAgOSwgIDcsIDExLCAxMiwKKyAgICAxMiwgMTAsICA4LCAxMiwgMTIsIDEwLCAgOSwgMTAsCisgICAgMTAsICA5LCAxMiwgMTAsICA5LCAxMiwgIDksIDEyLAorICAgIDEwLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMCwKKyAgICAxMSwgMTEsIDEyLCAxMSwgMTEsIDExLCAxMiwgMTAsCisgICAgMTIsIDEyLCAxMCwgMTAsIDEyLCAgOSwgMTIsIDExLAorICAgICA5LCAxMiwgMTEsICA4LCAxMiwgMTIsIDEwLCAgNywKKyAgICAxMSwgMTIsICA5LCAgNywgMTAsIDEwLCAxMSwgMTEsCisgICAgIDgsICA2LCAxMCwgMTAsIDEyLCAxMCwgMTAsICA3LAorICAgICA1LCAxMSwgIDgsIDEwLCAgOCwgIDgsICA2LCAgNCwKKyAgICAxMSwgMTIsICA4LCAgNywgIDcsICA2LCAgNiwgIDQsCisgICAgIDIsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfdmxjX2Rlc2M5X3N5bXNbMTE0XSA9IHsKKyAgIDB4MTAwMCwgMHhGRjgsIDB4RkY3LCAweEZGNiwgMHhGRjUsIDB4RkY0LCAweEZGMywgMHhGRjIsCisgICAgMHhGRjEsIDB4RkYwLCAweEZFNiwgMHhGRTUsIDB4RkU0LCAweEZFMywgMHhGRTIsIDB4RkUxLAorICAgIDB4RkUwLCAweEZENSwgMHhGRDQsIDB4RkQzLCAweEZEMiwgMHhGRDEsIDB4RkQwLCAweEZDNSwKKyAgICAweEZDMywgMHhGQzIsIDB4RkMxLCAweEZDMCwgMHhGQjYsIDB4RkI1LCAweEZCMywgMHhGQjIsCisgICAgMHhGQjEsIDB4RkIwLCAweEZBNiwgMHhGQTUsIDB4RkEzLCAweEZBMSwgMHhGQTAsIDB4Rjk2LAorICAgIDB4RjkzLCAweEY5MSwgMHhGOTAsIDB4RjgzLCAweEY4MSwgMHhGODAsIDB4RjczLCAweEY3MSwKKyAgICAweEY3MCwgMHhGNjEsIDB4RjYwLCAweEY1MSwgMHhGNTAsIDB4RjQwLCAweEYzMSwgMHhGMzAsCisgICAgMHhGMjEsIDB4MTIxLCAweDBGMSwgMHgwRTEsIDB4MEQxLCAweDBEMCwgMHgwQzEsIDB4MEMwLAorICAgIDB4MEIxLCAweDBCMCwgMHgwQTMsIDB4MEExLCAweDBBMCwgMHgwOTMsIDB4MDkxLCAweDA5MCwKKyAgICAweDA4MywgMHgwODEsIDB4MDgwLCAweDA3MywgMHgwNzEsIDB4MDcwLCAweDA2NSwgMHgwNjMsCisgICAgMHgwNjEsIDB4MDYwLCAweDA1NSwgMHgwNTMsIDB4MDUxLCAweDA1MCwgMHgwNDUsIDB4MDQzLAorICAgIDB4MDQyLCAweDA0MSwgMHgwNDAsIDB4MDM2LCAweDAzNSwgMHgwMzQsIDB4MDMzLCAweDAzMiwKKyAgICAweDAzMSwgMHgwMzAsIDB4MDI2LCAweDAyNSwgMHgwMjQsIDB4MDIzLCAweDAyMiwgMHgwMjEsCisgICAgMHgwMjAsIDB4MDE4LCAweDAxNywgMHgwMTYsIDB4MDE1LCAweDAxNCwgMHgwMTMsIDB4MDEyLAorICAgIDB4MDExLCAweDAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzYzlfY29kZXNbMTE0XSA9IHsKKyAgICAweDAwNjEsIDB4MDQwMywgMHgwREIxLCAweDAwMTIsIDB4MDA3MSwgMHgwMDU2LCAweDAwMzUsIDB4MDAyMywKKyAgICAweDAwMEQsIDB4MDAwNywgMHgwMjQzLCAweDAxRDMsIDB4MDI2QSwgMHgwMEExLCAweDAwQTIsIDB4MDAxMSwKKyAgICAweDAwMEUsIDB4MDFBQSwgMHgwNTMxLCAweDAwOTMsIDB4MDIyMiwgMHgwMDMyLCAweDAwMDYsIDB4MDdGMiwKKyAgICAweDA0RDMsIDB4MEM0MywgMHgwMDcyLCAweDAwMDEsIDB4MDM0MywgMHgwNUYyLCAweDA0QUEsIDB4MDNGMiwKKyAgICAweDAwMzEsIDB4MDA0NSwgMHgwMTQzLCAweDAwQUEsIDB4MEIzMSwgMHgwMEYyLCAweDAwQzMsIDB4MDY5MywKKyAgICAweDBCRjIsIDB4MDIwMywgMHgwMEUxLCAweDAzQjEsIDB4MDJEMywgMHgwMEIxLCAweDA1NkEsIDB4MDFEMiwKKyAgICAweDAwOEEsIDB4MDQ2QSwgMHgwMUUyLCAweDAwMDMsIDB4MDEwMywgMHgwMUIxLCAweDAyRTIsIDB4MDI5MywKKyAgICAweDAxNkEsIDB4MDRFMiwgMHgwNDQzLCAweDA1MjEsIDB4MDMyMSwgMHgwMDQzLCAweDAwRDMsIDB4MDBFMiwKKyAgICAweDA3MDMsIDB4MDBEMiwgMHgwNzMxLCAweDBBOTMsIDB4MDM5MywgMHgwODAzLCAweDA0MjIsIDB4MDM4MywKKyAgICAweDAxOEEsIDB4MDA2QSwgMHgwMDIxLCAweDA5NkEsIDB4MDMwMywgMHgwMDUyLCAweDBDRTIsIDB4MEQzMSwKKyAgICAweDAzOEEsIDB4MDAxMywgMHgwMUYyLCAweDBFOTMsIDB4MDA4MywgMHgwMDA1LCAweDAyRDIsIDB4MDEyMSwKKyAgICAweDAwMjIsIDB4MDBFQSwgMHgwMDM2LCAweDAxMjIsIDB4MDE5MywgMHgwMzMxLCAweDAxODMsIDB4MDJBQSwKKyAgICAweDAwNEEsIDB4MDAxQSwgMHgwMTMxLCAweDAwMkEsIDB4MDM2QSwgMHgwMDBBLCAweDAwNjIsIDB4MDAyNSwKKyAgICAweDAwMDksIDB4MDZFMiwgMHgwNUIxLCAweDAwNTMsIDB4MDAwMiwgMHgwMDE2LCAweDAwMTUsIDB4MDAzMywKKyAgICAweDAwMEIsIDB4MDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFjX3ZsY19kZXNjOV9iaXRzWzExNF0gPSB7CisgICAgIDgsIDExLCAxMiwgIDcsICA3LCAgNywgIDYsICA2LAorICAgICA0LCAgMywgMTAsICA5LCAxMCwgIDgsICA4LCAgNiwKKyAgICAgNCwgIDksIDEyLCAxMCwgMTAsICA3LCAgNSwgMTEsCisgICAgMTEsIDEyLCAgOCwgIDYsIDEwLCAxMSwgMTEsIDEyLAorICAgICA5LCAgNywgMTAsIDExLCAxMiwgIDksICA4LCAxMiwKKyAgICAxMiwgMTAsICA4LCAxMCwgMTAsICA5LCAxMSwgIDksCisgICAgIDksIDExLCAgOSwgMTIsIDEwLCAxMSwgMTEsIDEyLAorICAgIDEyLCAxMiwgMTIsIDExLCAxMCwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTAsIDExLCAxMiwgMTAsIDEyLCAxMSwgMTAsCisgICAgMTAsIDExLCAgOSwgMTIsIDExLCAgOCwgMTIsIDEyLAorICAgIDEwLCAgOCwgMTEsIDEyLCAgOSwgIDcsIDEwLCAxMSwKKyAgICAxMSwgIDgsICA2LCAgOSwgMTAsIDEyLCAxMCwgMTAsCisgICAgIDcsICA1LCAxMSwgIDgsIDEwLCAgOCwgIDgsICA2LAorICAgICA0LCAxMSwgMTIsICA4LCAgNiwgIDcsICA2LCAgNiwKKyAgICAgNCwgIDIsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfdmxjX2Rlc2NBX3N5bXNbMTEwXSA9IHsKKyAgIDB4MTAwMCwgMHhGRjgsIDB4RkY3LCAweEZGNiwgMHhGRjUsIDB4RkY0LCAweEZGMywgMHhGRjIsCisgICAgMHhGRjEsIDB4RkYwLCAweEZFNiwgMHhGRTUsIDB4RkU0LCAweEZFMywgMHhGRTIsIDB4RkUxLAorICAgIDB4RkUwLCAweEZENSwgMHhGRDQsIDB4RkQzLCAweEZEMiwgMHhGRDEsIDB4RkQwLCAweEZDNiwKKyAgICAweEZDNSwgMHhGQzMsIDB4RkMyLCAweEZDMSwgMHhGQzAsIDB4RkI2LCAweEZCNSwgMHhGQjMsCisgICAgMHhGQjIsIDB4RkIxLCAweEZCMCwgMHhGQTYsIDB4RkE1LCAweEZBMywgMHhGQTEsIDB4RkEwLAorICAgIDB4Rjk2LCAweEY5MywgMHhGOTEsIDB4RjkwLCAweEY4MywgMHhGODEsIDB4RjgwLCAweEY3MywKKyAgICAweEY3MSwgMHhGNzAsIDB4RjYxLCAweEY2MCwgMHhGNTEsIDB4RjUwLCAweEY0MSwgMHhGNDAsCisgICAgMHhGMzEsIDB4MEUxLCAweDBEMSwgMHgwQzEsIDB4MEMwLCAweDBCMSwgMHgwQjAsIDB4MEExLAorICAgIDB4MEEwLCAweDA5MywgMHgwOTEsIDB4MDkwLCAweDA4MywgMHgwODEsIDB4MDgwLCAweDA3MywKKyAgICAweDA3MSwgMHgwNzAsIDB4MDYzLCAweDA2MSwgMHgwNjAsIDB4MDU1LCAweDA1MywgMHgwNTEsCisgICAgMHgwNTAsIDB4MDQ1LCAweDA0NCwgMHgwNDMsIDB4MDQyLCAweDA0MSwgMHgwNDAsIDB4MDM2LAorICAgIDB4MDM1LCAweDAzNCwgMHgwMzMsIDB4MDMyLCAweDAzMSwgMHgwMzAsIDB4MDI2LCAweDAyNSwKKyAgICAweDAyNCwgMHgwMjMsIDB4MDIyLCAweDAyMSwgMHgwMjAsIDB4MDE4LCAweDAxNywgMHgwMTYsCisgICAgMHgwMTUsIDB4MDE0LCAweDAxMywgMHgwMTIsIDB4MDExLCAweDAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzY0FfY29kZXNbMTEwXSA9IHsKKyAgICAweDAwMkEsIDB4MDRDNSwgMHgwMkEzLCAweDAwNEEsIDB4MDAxNSwgMHgwMDA1LCAweDAwMDMsIDB4MDAxMywKKyAgICAweDAwMEQsIDB4MDAwNywgMHgwMTcxLCAweDAwMzIsIDB4MDM3MSwgMHgwMDc2LCAweDAwNDIsIDB4MDAxMSwKKyAgICAweDAwMEUsIDB4MDBBQSwgMHgwNEQ1LCAweDAzQTMsIDB4MDZBMywgMHgwMDYyLCAweDAwMUEsIDB4MDZENSwKKyAgICAweDA3RjIsIDB4MDIyMywgMHgwQ0Q1LCAweDAwNkEsIDB4MDAwMSwgMHgwMEY2LCAweDA2MjMsIDB4MDNGMiwKKyAgICAweDA3RUEsIDB4MDFGMSwgMHgwMDIxLCAweDAzRDUsIDB4MDhDMiwgMHgwN0Y2LCAweDAwRjIsIDB4MDBFMywKKyAgICAweDBGRUEsIDB4MDJDNSwgMHgwMUFBLCAweDAwODIsIDB4MDRBMywgMHgwMEI2LCAweDAwNzEsIDB4MDNCMiwKKyAgICAweDAwMjMsIDB4MDFCNiwgMHgwOEEzLCAweDAwMDIsIDB4MEJCMiwgMHgwMEM1LCAweDAyRUEsIDB4MEMyMywKKyAgICAweDBGRjYsIDB4MDQyMywgMHgwN0IyLCAweDAxQzUsIDB4MDdENSwgMHgwMUVBLCAweDA2RUEsIDB4MDJDMiwKKyAgICAweDAxRjYsIDB4MDFENSwgMHgwMUIyLCAweDAwQjIsIDB4MDRGMSwgMHgwM0VBLCAweDAxQTIsIDB4MDJBMiwKKyAgICAweDAyRDUsIDB4MDEyMywgMHgwMEQ1LCAweDAxRjIsIDB4MDA1NSwgMHgwNUIyLCAweDA0QzIsIDB4MDEwMiwKKyAgICAweDAwNjEsIDB4MDVENSwgMHgwMEMyLCAweDAwRjEsIDB4MDBBMywgMHgwMDQ1LCAweDAwMTYsIDB4MDFBMywKKyAgICAweDAxQzIsIDB4MDhENSwgMHgwM0M1LCAweDAwRUEsIDB4MDAwQSwgMHgwMDA2LCAweDAwQTIsIDB4MDAzNiwKKyAgICAweDAyRjEsIDB4MDA3MiwgMHgwMDIyLCAweDAwMjUsIDB4MDAwOSwgMHgwM0Y2LCAweDBBQTMsIDB4MDA2MywKKyAgICAweDAwMTIsIDB4MDAzMSwgMHgwMDM1LCAweDAwMzMsIDB4MDAwQiwgMHgwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWNfdmxjX2Rlc2NBX2JpdHNbMTEwXSA9IHsKKyAgICAgOCwgMTEsIDEyLCAgNywgIDcsICA3LCAgNiwgIDYsCisgICAgIDQsICAzLCAxMCwgIDgsIDEwLCAgOCwgIDgsICA2LAorICAgICA0LCAgOSwgMTIsIDEwLCAxMSwgIDcsICA1LCAxMSwKKyAgICAxMSwgMTEsIDEyLCAgOCwgIDYsICA5LCAxMSwgMTEsCisgICAgMTIsICA5LCAgNywgMTEsIDEyLCAxMiwgIDksICA4LAorICAgIDEyLCAxMCwgIDksICA4LCAxMSwgIDksICA5LCAxMiwKKyAgICAxMSwgIDksIDEyLCAgOSwgMTIsIDExLCAxMSwgMTIsCisgICAgMTIsIDEyLCAxMSwgMTAsIDExLCAxMCwgMTEsIDEwLAorICAgIDEwLCAxMSwgMTEsICA5LCAxMSwgMTEsICA5LCAxMCwKKyAgICAxMSwgIDksIDEyLCAxMCwgIDgsIDExLCAxMSwgIDksCisgICAgIDcsIDExLCAxMiwgMTEsIDEyLCAgOCwgIDYsIDEwLAorICAgICA5LCAxMiwgMTAsIDEwLCAgNywgIDUsIDEwLCAgOCwKKyAgICAxMCwgIDgsICA4LCAgNiwgIDQsIDExLCAxMiwgIDgsCisgICAgIDYsICA3LCAgNiwgIDYsICA0LCAgMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzY0Jfc3ltc1sxMDFdID0geworICAgMHgxMDAwLCAweEZGOCwgMHhGRjcsIDB4RkY2LCAweEZGNSwgMHhGRjQsIDB4RkYzLCAweEZGMiwKKyAgICAweEZGMSwgMHhGRjAsIDB4RkU2LCAweEZFNSwgMHhGRTQsIDB4RkUzLCAweEZFMiwgMHhGRTEsCisgICAgMHhGRTAsIDB4RkQ1LCAweEZENCwgMHhGRDMsIDB4RkQyLCAweEZEMSwgMHhGRDAsIDB4RkM2LAorICAgIDB4RkM1LCAweEZDMywgMHhGQzIsIDB4RkMxLCAweEZDMCwgMHhGQjYsIDB4RkI1LCAweEZCMywKKyAgICAweEZCMSwgMHhGQjAsIDB4RkE2LCAweEZBMywgMHhGQTEsIDB4RkEwLCAweEY5MywgMHhGOTEsCisgICAgMHhGOTAsIDB4RjgzLCAweEY4MSwgMHhGODAsIDB4RjcxLCAweEY3MCwgMHhGNjEsIDB4RjYwLAorICAgIDB4RjUxLCAweEY1MCwgMHhGNDEsIDB4MEYxLCAweDBEMSwgMHgwQzEsIDB4MEIxLCAweDBCMCwKKyAgICAweDBBMSwgMHgwQTAsIDB4MDkxLCAweDA5MCwgMHgwODMsIDB4MDgxLCAweDA4MCwgMHgwNzMsCisgICAgMHgwNzEsIDB4MDcwLCAweDA2MywgMHgwNjEsIDB4MDYwLCAweDA1NSwgMHgwNTMsIDB4MDUxLAorICAgIDB4MDUwLCAweDA0NSwgMHgwNDMsIDB4MDQyLCAweDA0MSwgMHgwNDAsIDB4MDM2LCAweDAzNSwKKyAgICAweDAzNCwgMHgwMzMsIDB4MDMyLCAweDAzMSwgMHgwMzAsIDB4MDI2LCAweDAyNSwgMHgwMjQsCisgICAgMHgwMjMsIDB4MDIyLCAweDAyMSwgMHgwMjAsIDB4MDE4LCAweDAxNywgMHgwMTYsIDB4MDE1LAorICAgIDB4MDE0LCAweDAxMywgMHgwMTIsIDB4MDExLCAweDAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY192bGNfZGVzY0JfY29kZXNbMTAxXSA9IHsKKyAgICAweDAwRUUsIDB4MDNBNSwgMHgwQjczLCAweDAwNEUsIDB4MDAzNSwgMHgwMDE1LCAweDAwMjMsIDB4MDAxMywKKyAgICAweDAwMEQsIDB4MDAwNywgMHgwNjczLCAweDAxRjMsIDB4MDJGRSwgMHgwMDk2LCAweDAxMzMsIDB4MDAxRSwKKyAgICAweDAwMDEsIDB4MDExNiwgMHgwMEY1LCAweDAzRjUsIDB4MDQ3MywgMHgwMDUyLCAweDAwMUEsIDB4MDFENSwKKyAgICAweDAwMjUsIDB4MDA3MywgMHgwNjMzLCAweDAwODYsIDB4MDAzNiwgMHgwMTJFLCAweDAxNTUsIDB4MDAwNiwKKyAgICAweDAwNTUsIDB4MDAwRSwgMHgwMTA2LCAweDAyM0UsIDB4MDE5MiwgMHgwMDc1LCAweDAxNzMsIDB4MDFBRSwKKyAgICAweDAwRDUsIDB4MDhGNSwgMHgwMDJFLCAweDAxRkUsIDB4MDQwNiwgMHgwMEFFLCAweDBFM0UsIDB4MDIwNiwKKyAgICAweDAxM0UsIDB4MDM3MywgMHgwRDU1LCAweDA2M0UsIDB4MEUzMywgMHgwMzNFLCAweDAxRjUsIDB4MDI3MywKKyAgICAweDAwM0UsIDB4MDZBNSwgMHgwMDkyLCAweDAzRDUsIDB4MDRGNSwgMHgwNTNFLCAweDAwMTYsIDB4MDBGRSwKKyAgICAweDA3QTUsIDB4MDEyNSwgMHgwNTA2LCAweDAyOTIsIDB4MDBCRSwgMHgwNDI1LCAweDBGNzMsIDB4MDJGNSwKKyAgICAweDAwNTYsIDB4MDIzMywgMHgwMkE1LCAweDBDMjUsIDB4MDA3RSwgMHgwMDI2LCAweDAzNTUsIDB4MDAzMywKKyAgICAweDA1NTUsIDB4MDFBNSwgMHgwMzA2LCAweDAwNDYsIDB4MDAwQSwgMHgwMjI1LCAweDAwNkUsIDB4MDBBNSwKKyAgICAweDAwMTIsIDB4MDBGMywgMHgwMDA1LCAweDAwMDksIDB4MDczRSwgMHgwNzczLCAweDAwQjMsIDB4MDAzMiwKKyAgICAweDAwNjUsIDB4MDAwMywgMHgwMDAyLCAweDAwMEIsIDB4MDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFjX3ZsY19kZXNjQl9iaXRzWzEwMV0gPSB7CisgICAgIDgsIDExLCAxMiwgIDcsICA3LCAgNywgIDYsICA2LAorICAgICA0LCAgMywgMTEsICA5LCAxMCwgIDgsICA5LCAgNiwKKyAgICAgNCwgIDksIDEyLCAxMCwgMTEsICA3LCAgNSwgMTAsCisgICAgMTEsIDExLCAxMiwgIDgsICA2LCAgOSwgMTEsIDExLAorICAgICA5LCAgNywgMTEsIDExLCAgOSwgIDgsIDEwLCAgOSwKKyAgICAgOSwgMTIsICA5LCAgOSwgMTEsICA5LCAxMiwgMTAsCisgICAgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTAsIDExLAorICAgIDEwLCAxMSwgMTAsIDEwLCAxMSwgMTEsICA5LCAxMCwKKyAgICAxMSwgIDksIDExLCAxMCwgIDgsIDEyLCAxMiwgMTAsCisgICAgIDcsIDExLCAxMSwgMTIsICA4LCAgNiwgMTAsIDEwLAorICAgIDEyLCAxMCwgMTAsICA3LCAgNSwgMTAsICA4LCAxMCwKKyAgICAgOCwgIDksICA2LCAgNCwgMTEsIDEyLCAgOCwgIDYsCisgICAgIDcsICA2LCAgNSwgIDQsICAyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGFjX3ZsY19kZXNjQ19zeW1zWzk2XSA9IHsKKyAgICAweDEwMDAsIDB4RkY4LCAweEZGNywgMHhGRjYsIDB4RkY1LCAweEZGNCwgMHhGRjMsIDB4RkYyLAorICAgIDB4RkYxLCAweEZGMCwgMHhGRTYsIDB4RkU1LCAweEZFNCwgMHhGRTMsIDB4RkUyLCAweEZFMSwKKyAgICAweEZFMCwgMHhGRDUsIDB4RkQ0LCAweEZEMywgMHhGRDIsIDB4RkQxLCAweEZEMCwgMHhGQzYsCisgICAgMHhGQzUsIDB4RkMzLCAweEZDMiwgMHhGQzEsIDB4RkMwLCAweEZCNiwgMHhGQjUsIDB4RkIzLAorICAgIDB4RkIxLCAweEZCMCwgMHhGQTYsIDB4RkEzLCAweEZBMSwgMHhGQTAsIDB4RjkzLCAweEY5MSwKKyAgICAweEY5MCwgMHhGODEsIDB4RjgwLCAweEY3MSwgMHhGNzAsIDB4RjYxLCAweEY2MCwgMHhGNTEsCisgICAgMHgwRTEsIDB4MEMxLCAweDBCMSwgMHgwQTEsIDB4MEEwLCAweDA5MSwgMHgwOTAsIDB4MDgzLAorICAgIDB4MDgxLCAweDA4MCwgMHgwNzMsIDB4MDcxLCAweDA3MCwgMHgwNjMsIDB4MDYxLCAweDA2MCwKKyAgICAweDA1NSwgMHgwNTMsIDB4MDUxLCAweDA1MCwgMHgwNDUsIDB4MDQzLCAweDA0MiwgMHgwNDEsCisgICAgMHgwNDAsIDB4MDM2LCAweDAzNSwgMHgwMzQsIDB4MDMzLCAweDAzMiwgMHgwMzEsIDB4MDMwLAorICAgIDB4MDI2LCAweDAyNSwgMHgwMjQsIDB4MDIzLCAweDAyMiwgMHgwMjEsIDB4MDIwLCAweDAxOCwKKyAgICAweDAxNywgMHgwMTYsIDB4MDE1LCAweDAxNCwgMHgwMTMsIDB4MDEyLCAweDAxMSwgMHgwMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfdmxjX2Rlc2NDX2NvZGVzWzk2XSA9IHsKKyAgICAweDAwREUsIDB4MDcyRSwgMHgwNTc2LCAweDAwNkUsIDB4MDA3NSwgMHgwMDU1LCAweDAwMTMsIDB4MDAzMywKKyAgICAweDAwMEQsIDB4MDAwNywgMHgwN0QyLCAweDAwNTIsIDB4MDA2NSwgMHgwMENFLCAweDAxODMsIDB4MDAzRSwKKyAgICAweDAwMDEsIDB4MDAyRSwgMHgwRjM1LCAweDAwMDMsIDB4MDI0MywgMHgwMDFBLCAweDAwMDYsIDB4MDFBNSwKKyAgICAweDAwNDMsIDB4MDAxMiwgMHgwRTQzLCAweDAwQjYsIDB4MDAxNiwgMHgwMTM1LCAweDAxNzYsIDB4MDY0MywKKyAgICAweDAwMzUsIDB4MDAxRSwgMHgwNzM1LCAweDAyODMsIDB4MDEyNSwgMHgwMEFFLCAweDAwRDIsIDB4MDE2NSwKKyAgICAweDAxMDMsIDB4MDYwMywgMHgwMEU1LCAweDBDNDMsIDB4MDJCNSwgMHgwNEE1LCAweDAwQTUsIDB4MDQ0MywKKyAgICAweDAyNjUsIDB4MDQ3NiwgMHgwMjEyLCAweDAxMTIsIDB4MDM3NiwgMHgwMTJFLCAweDAyRDIsIDB4MDA4MywKKyAgICAweDA0ODMsIDB4MDE1RSwgMHgwNkE1LCAweDAzMzUsIDB4MDA1RSwgMHgwMDI1LCAweDAxRDIsIDB4MDBGNiwKKyAgICAweDAzRDIsIDB4MDMyRSwgMHgwM0I1LCAweDAwNUEsIDB4MDIwMywgMHgwMkE1LCAweDBCRDIsIDB4MDA0RSwKKyAgICAweDAwMzIsIDB4MDFCNSwgMHgwMEI1LCAweDBBNjUsIDB4MDIyNSwgMHgwMjc2LCAweDAwMEUsIDB4MDAwQSwKKyAgICAweDAzRTUsIDB4MDE0MywgMHgwMUU1LCAweDAwMzYsIDB4MDA5MiwgMHgwMDA1LCAweDAwMDksIDB4MDY2NSwKKyAgICAweDAwNzYsIDB4MDBDMywgMHgwMDNBLCAweDAwMTUsIDB4MDAyMywgMHgwMDAyLCAweDAwMEIsIDB4MDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFjX3ZsY19kZXNjQ19iaXRzWzk2XSA9IHsKKyAgICAgOCwgMTEsIDExLCAgNywgIDcsICA3LCAgNiwgIDYsCisgICAgIDQsICAzLCAxMSwgIDgsIDEwLCAgOCwgIDksICA2LAorICAgICA0LCAgOSwgMTIsIDEwLCAxMSwgIDcsICA1LCAgOSwKKyAgICAxMSwgMTAsIDEyLCAgOCwgIDYsIDEwLCAxMSwgMTIsCisgICAgIDksICA3LCAxMiwgMTAsICA5LCAgOCwgMTAsICA5LAorICAgICA5LCAxMSwgIDksIDEyLCAxMCwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTEsIDEwLCAgOSwgMTAsIDEwLCAxMCwgMTEsCisgICAgMTEsICA5LCAxMSwgMTEsICA5LCAxMCwgMTAsICA4LAorICAgIDEyLCAxMSwgMTAsICA3LCAxMSwgMTEsIDEyLCAgOCwKKyAgICAgNiwgMTAsIDEwLCAxMiwgMTAsIDEwLCAgNywgIDUsCisgICAgMTAsICA5LCAxMCwgIDgsICA4LCAgNiwgIDQsIDExLAorICAgIDExLCAgOCwgIDYsICA3LCAgNiwgIDUsICA0LCAgMiwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgdHNjYzJfYWNfdmxjX3NpemVzW05VTV9WTENfU0VUU10gPSB7CisgICAgMTcyLCAxNjksIDE2NSwgMTYyLCAxMzEsIDEzMiwgMTMwLCAxMjUsIDEyMSwgMTE0LCAxMTAsIDEwMSwgOTYKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCAqdHNjYzJfYWNfdmxjX3N5bXNbTlVNX1ZMQ19TRVRTXSA9IHsKKyAgICBhY192bGNfZGVzYzBfc3ltcywgYWNfdmxjX2Rlc2MxX3N5bXMsIGFjX3ZsY19kZXNjMl9zeW1zLCBhY192bGNfZGVzYzNfc3ltcywKKyAgICBhY192bGNfZGVzYzRfc3ltcywgYWNfdmxjX2Rlc2M1X3N5bXMsIGFjX3ZsY19kZXNjNl9zeW1zLCBhY192bGNfZGVzYzdfc3ltcywKKyAgICBhY192bGNfZGVzYzhfc3ltcywgYWNfdmxjX2Rlc2M5X3N5bXMsIGFjX3ZsY19kZXNjQV9zeW1zLCBhY192bGNfZGVzY0Jfc3ltcywKKyAgICBhY192bGNfZGVzY0Nfc3ltcywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCAqdHNjYzJfYWNfdmxjX2NvZGVzW05VTV9WTENfU0VUU10gPSB7CisgICAgYWNfdmxjX2Rlc2MwX2NvZGVzLCBhY192bGNfZGVzYzFfY29kZXMsIGFjX3ZsY19kZXNjMl9jb2RlcywKKyAgICBhY192bGNfZGVzYzNfY29kZXMsIGFjX3ZsY19kZXNjNF9jb2RlcywgYWNfdmxjX2Rlc2M1X2NvZGVzLAorICAgIGFjX3ZsY19kZXNjNl9jb2RlcywgYWNfdmxjX2Rlc2M3X2NvZGVzLCBhY192bGNfZGVzYzhfY29kZXMsCisgICAgYWNfdmxjX2Rlc2M5X2NvZGVzLCBhY192bGNfZGVzY0FfY29kZXMsIGFjX3ZsY19kZXNjQl9jb2RlcywKKyAgICBhY192bGNfZGVzY0NfY29kZXMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCAqdHNjYzJfYWNfdmxjX2JpdHNbTlVNX1ZMQ19TRVRTXSA9IHsKKyAgICBhY192bGNfZGVzYzBfYml0cywgYWNfdmxjX2Rlc2MxX2JpdHMsIGFjX3ZsY19kZXNjMl9iaXRzLCBhY192bGNfZGVzYzNfYml0cywKKyAgICBhY192bGNfZGVzYzRfYml0cywgYWNfdmxjX2Rlc2M1X2JpdHMsIGFjX3ZsY19kZXNjNl9iaXRzLCBhY192bGNfZGVzYzdfYml0cywKKyAgICBhY192bGNfZGVzYzhfYml0cywgYWNfdmxjX2Rlc2M5X2JpdHMsIGFjX3ZsY19kZXNjQV9iaXRzLCBhY192bGNfZGVzY0JfYml0cywKKyAgICBhY192bGNfZGVzY0NfYml0cywKK307CisKKyNlbmRpZiAvKiBBVkNPREVDX1RTQ0MyX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdHRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy90dGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTU4NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHRhLmMKQEAgLTAsMCArMSw0MzAgQEAKKy8qCisgKiBUVEEgKFRoZSBMb3NzbGVzcyBUcnVlIEF1ZGlvKSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUVEEgKFRoZSBMb3NzbGVzcyBUcnVlIEF1ZGlvKSBkZWNvZGVyCisgKiBAc2VlIGh0dHA6Ly93d3cudHJ1ZS1hdWRpby5jb20vCisgKiBAc2VlIGh0dHA6Ly90dGEuY29yZWNvZGVjLm9yZy8KKyAqIEBhdXRob3IgQWxleCBCZXJlZ3N6YXN6aQorICovCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgInR0YWRhdGEuaCIKKyNpbmNsdWRlICJ0dGFkc3AuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNkZWZpbmUgRk9STUFUX1NJTVBMRSAgICAxCisjZGVmaW5lIEZPUk1BVF9FTkNSWVBURUQgMgorCit0eXBlZGVmIHN0cnVjdCBUVEFDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgY29uc3QgQVZDUkMgKmNyY190YWJsZTsKKworICAgIGludCBmb3JtYXQsIGNoYW5uZWxzLCBicHM7CisgICAgdW5zaWduZWQgZGF0YV9sZW5ndGg7CisgICAgaW50IGZyYW1lX2xlbmd0aCwgbGFzdF9mcmFtZV9sZW5ndGg7CisKKyAgICBpbnQzMl90ICpkZWNvZGVfYnVmZmVyOworCisgICAgdWludDhfdCBjcmNfcGFzc1s4XTsKKyAgICB1aW50OF90ICpwYXNzOworICAgIFRUQUNoYW5uZWwgKmNoX2N0eDsKKyAgICBUVEFEU1BDb250ZXh0IGRzcDsKK30gVFRBQ29udGV4dDsKKworc3RhdGljIGNvbnN0IGludDY0X3QgdHRhX2NoYW5uZWxfbGF5b3V0c1s3XSA9IHsKKyAgICBBVl9DSF9MQVlPVVRfU1RFUkVPLAorICAgIEFWX0NIX0xBWU9VVF9TVEVSRU98QVZfQ0hfTE9XX0ZSRVFVRU5DWSwKKyAgICBBVl9DSF9MQVlPVVRfUVVBRCwKKyAgICAwLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0ssCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDS3xBVl9DSF9CQUNLX0NFTlRFUiwKKyAgICBBVl9DSF9MQVlPVVRfN1BPSU5UMV9XSURFCit9OworCitzdGF0aWMgaW50IHR0YV9jaGVja19jcmMoVFRBQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgdWludDMyX3QgY3JjLCBDUkM7CisKKyAgICBDUkMgPSBBVl9STDMyKGJ1ZiArIGJ1Zl9zaXplKTsKKyAgICBjcmMgPSBhdl9jcmMocy0+Y3JjX3RhYmxlLCAweEZGRkZGRkZGVSwgYnVmLCBidWZfc2l6ZSk7CisgICAgaWYgKENSQyAhPSAoY3JjIF4gMHhGRkZGRkZGRlUpKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ1JDIGVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50NjRfdCB0dGFfY2hlY2tfY3JjNjQodWludDhfdCAqcGFzcykKK3sKKyAgICB1aW50NjRfdCBjcmMgPSBVSU5UNjRfTUFYLCBwb2x5ID0gMHg0MkYwRTFFQkE5RUEzNjkzVTsKKyAgICB1aW50OF90ICplbmQgPSBwYXNzICsgc3RybGVuKHBhc3MpOworICAgIGludCBpOworCisgICAgd2hpbGUgKHBhc3MgPCBlbmQpIHsKKyAgICAgICAgY3JjIF49ICh1aW50NjRfdCkqcGFzcysrIDw8IDU2OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgY3JjID0gKGNyYyA8PCAxKSBeIChwb2x5ICYgKCgoaW50NjRfdCkgY3JjKSA+PiA2MykpOworICAgIH0KKworICAgIHJldHVybiBjcmMgXiBVSU5UNjRfTUFYOworfQorCitzdGF0aWMgaW50IGFsbG9jYXRlX2J1ZmZlcnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRUQUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKHMtPmJwcyA8IDMpIHsKKyAgICAgICAgcy0+ZGVjb2RlX2J1ZmZlciA9IGF2X21hbGxvY3pfYXJyYXkoc2l6ZW9mKGludDMyX3QpKnMtPmZyYW1lX2xlbmd0aCwgcy0+Y2hhbm5lbHMpOworICAgICAgICBpZiAoIXMtPmRlY29kZV9idWZmZXIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0gZWxzZQorICAgICAgICBzLT5kZWNvZGVfYnVmZmVyID0gTlVMTDsKKyAgICBzLT5jaF9jdHggPSBhdl9tYWxsb2NfYXJyYXkoYXZjdHgtPmNoYW5uZWxzLCBzaXplb2YoKnMtPmNoX2N0eCkpOworICAgIGlmICghcy0+Y2hfY3R4KSB7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5kZWNvZGVfYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHR0YV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqIGF2Y3R4KQoreworICAgIFRUQUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IHRvdGFsX2ZyYW1lczsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICAvLyAzMGJ5dGVzIGluY2x1ZGVzIFRUQTEgaGVhZGVyCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDIyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHMtPmNyY190YWJsZSA9IGF2X2NyY19nZXRfdGFibGUoQVZfQ1JDXzMyX0lFRUVfTEUpOworICAgIGluaXRfZ2V0X2JpdHM4KCZnYiwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICBpZiAoc2hvd19iaXRzX2xvbmcoJmdiLCAzMikgPT0gQVZfUkwzMigiVFRBMSIpKSB7CisgICAgICAgIC8qIHNpZ25hdHVyZSAqLworICAgICAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDMyKTsKKworICAgICAgICBzLT5mb3JtYXQgPSBnZXRfYml0cygmZ2IsIDE2KTsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCA+IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmb3JtYXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmZvcm1hdCA9PSBGT1JNQVRfRU5DUllQVEVEKSB7CisgICAgICAgICAgICBpZiAoIXMtPnBhc3MpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgcGFzc3dvcmQgZm9yIGVuY3J5cHRlZCBzdHJlYW0uIFBsZWFzZSB1c2UgdGhlIC1wYXNzd29yZCBvcHRpb25cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBVl9XTDY0KHMtPmNyY19wYXNzLCB0dGFfY2hlY2tfY3JjNjQocy0+cGFzcykpOworICAgICAgICB9CisgICAgICAgIGF2Y3R4LT5jaGFubmVscyA9IHMtPmNoYW5uZWxzID0gZ2V0X2JpdHMoJmdiLCAxNik7CisgICAgICAgIGlmIChzLT5jaGFubmVscyA+IDEgJiYgcy0+Y2hhbm5lbHMgPCA5KQorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gdHRhX2NoYW5uZWxfbGF5b3V0c1tzLT5jaGFubmVscy0yXTsKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBnZXRfYml0cygmZ2IsIDE2KTsKKyAgICAgICAgcy0+YnBzID0gKGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICsgNykgLyA4OworICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBnZXRfYml0c19sb25nKCZnYiwgMzIpOworICAgICAgICBzLT5kYXRhX2xlbmd0aCA9IGdldF9iaXRzX2xvbmcoJmdiLCAzMik7CisgICAgICAgIHNraXBfYml0c19sb25nKCZnYiwgMzIpOyAvLyBDUkMzMiBvZiBoZWFkZXIKKworICAgICAgICBpZiAocy0+Y2hhbm5lbHMgPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVsc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+c2FtcGxlX3JhdGUgPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZXJhdGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2gocy0+YnBzKSB7CisgICAgICAgIGNhc2UgMTogYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1U4OyBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzMyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vY2FzZSA0OiBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzMyOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZC91bnN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0LlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByZXZlbnQgb3ZlcmZsb3cKKyAgICAgICAgaWYgKGF2Y3R4LT5zYW1wbGVfcmF0ZSA+IDB4N0ZGRkZGdSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJzYW1wbGVfcmF0ZSB0b28gbGFyZ2VcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBzLT5mcmFtZV9sZW5ndGggPSAyNTYgKiBhdmN0eC0+c2FtcGxlX3JhdGUgLyAyNDU7CisKKyAgICAgICAgcy0+bGFzdF9mcmFtZV9sZW5ndGggPSBzLT5kYXRhX2xlbmd0aCAlIHMtPmZyYW1lX2xlbmd0aDsKKyAgICAgICAgdG90YWxfZnJhbWVzID0gcy0+ZGF0YV9sZW5ndGggLyBzLT5mcmFtZV9sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAocy0+bGFzdF9mcmFtZV9sZW5ndGggPyAxIDogMCk7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJmb3JtYXQ6ICVkIGNoYW5zOiAlZCBicHM6ICVkIHJhdGU6ICVkIGJsb2NrOiAlZFxuIiwKKyAgICAgICAgICAgIHMtPmZvcm1hdCwgYXZjdHgtPmNoYW5uZWxzLCBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlLCBhdmN0eC0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICBhdmN0eC0+YmxvY2tfYWxpZ24pOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImRhdGFfbGVuZ3RoOiAlZCBmcmFtZV9sZW5ndGg6ICVkIGxhc3Q6ICVkIHRvdGFsOiAlZFxuIiwKKyAgICAgICAgICAgIHMtPmRhdGFfbGVuZ3RoLCBzLT5mcmFtZV9sZW5ndGgsIHMtPmxhc3RfZnJhbWVfbGVuZ3RoLCB0b3RhbF9mcmFtZXMpOworCisgICAgICAgIGlmKHMtPmZyYW1lX2xlbmd0aCA+PSBVSU5UX01BWCAvIChzLT5jaGFubmVscyAqIHNpemVvZihpbnQzMl90KSkpeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmcmFtZV9sZW5ndGggdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJXcm9uZyBleHRyYWRhdGEgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZmX3R0YWRzcF9pbml0KCZzLT5kc3ApOworCisgICAgcmV0dXJuIGFsbG9jYXRlX2J1ZmZlcnMoYXZjdHgpOworfQorCitzdGF0aWMgaW50IHR0YV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lICAgICA9IGRhdGE7CisgICAgVGhyZWFkRnJhbWUgdGZyYW1lID0geyAuZiA9IGRhdGEgfTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBUVEFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBpLCByZXQ7CisgICAgaW50IGN1cl9jaGFuID0gMCwgZnJhbWVsZW4gPSBzLT5mcmFtZV9sZW5ndGg7CisgICAgaW50MzJfdCAqcDsKKworICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfQ1JDQ0hFQ0spIHsKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgNCB8fAorICAgICAgICAgICAgKHR0YV9jaGVja19jcmMocywgYnVmLCBidWZfc2l6ZSAtIDQpICYmIGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gZnJhbWVsZW47CisgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJnRmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8vIGRlY29kZSBkaXJlY3RseSB0byBvdXRwdXQgYnVmZmVyIGZvciAyNC1iaXQgc2FtcGxlIGZvcm1hdAorICAgIGlmIChzLT5icHMgPT0gMykKKyAgICAgICAgcy0+ZGVjb2RlX2J1ZmZlciA9IChpbnQzMl90ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICAvLyBpbml0IHBlciBjaGFubmVsIHN0YXRlcworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgIFRUQUZpbHRlciAqZmlsdGVyID0gJnMtPmNoX2N0eFtpXS5maWx0ZXI7CisgICAgICAgIHMtPmNoX2N0eFtpXS5wcmVkaWN0b3IgPSAwOworICAgICAgICBmZl90dGFfZmlsdGVyX2luaXQoZmlsdGVyLCBmZl90dGFfZmlsdGVyX2NvbmZpZ3Nbcy0+YnBzLTFdKTsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCA9PSBGT1JNQVRfRU5DUllQVEVEKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICAgICAgZmlsdGVyLT5xbVtpXSA9IHNpZ25fZXh0ZW5kKHMtPmNyY19wYXNzW2ldLCA4KTsKKyAgICAgICAgfQorICAgICAgICBmZl90dGFfcmljZV9pbml0KCZzLT5jaF9jdHhbaV0ucmljZSwgMTAsIDEwKTsKKyAgICB9CisKKyAgICBpID0gMDsKKyAgICBmb3IgKHAgPSBzLT5kZWNvZGVfYnVmZmVyOyBwIDwgcy0+ZGVjb2RlX2J1ZmZlciArIChmcmFtZWxlbiAqIHMtPmNoYW5uZWxzKTsgcCsrKSB7CisgICAgICAgIGludDMyX3QgKnByZWRpY3RvciA9ICZzLT5jaF9jdHhbY3VyX2NoYW5dLnByZWRpY3RvcjsKKyAgICAgICAgVFRBRmlsdGVyICpmaWx0ZXIgPSAmcy0+Y2hfY3R4W2N1cl9jaGFuXS5maWx0ZXI7CisgICAgICAgIFRUQVJpY2UgKnJpY2UgPSAmcy0+Y2hfY3R4W2N1cl9jaGFuXS5yaWNlOworICAgICAgICB1aW50MzJfdCB1bmFyeSwgZGVwdGgsIGs7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisKKyAgICAgICAgdW5hcnkgPSBnZXRfdW5hcnkoJmdiLCAwLCBnZXRfYml0c19sZWZ0KCZnYikpOworCisgICAgICAgIGlmICh1bmFyeSA9PSAwKSB7CisgICAgICAgICAgICBkZXB0aCA9IDA7CisgICAgICAgICAgICBrID0gcmljZS0+azA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXB0aCA9IDE7CisgICAgICAgICAgICBrID0gcmljZS0+azE7CisgICAgICAgICAgICB1bmFyeS0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmdiKSA8IGspIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGspIHsKKyAgICAgICAgICAgIGlmIChrID4gTUlOX0NBQ0hFX0JJVFMpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9ICh1bmFyeSA8PCBrKSArIGdldF9iaXRzKCZnYiwgayk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdmFsdWUgPSB1bmFyeTsKKworICAgICAgICAvLyBGSVhNRTogY29weSBwYXN0ZSBmcm9tIG9yaWdpbmFsCisgICAgICAgIHN3aXRjaCAoZGVwdGgpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmljZS0+c3VtMSArPSB2YWx1ZSAtIChyaWNlLT5zdW0xID4+IDQpOworICAgICAgICAgICAgaWYgKHJpY2UtPmsxID4gMCAmJiByaWNlLT5zdW0xIDwgZmZfdHRhX3NoaWZ0XzE2W3JpY2UtPmsxXSkKKyAgICAgICAgICAgICAgICByaWNlLT5rMS0tOworICAgICAgICAgICAgZWxzZSBpZihyaWNlLT5zdW0xID4gZmZfdHRhX3NoaWZ0XzE2W3JpY2UtPmsxICsgMV0pCisgICAgICAgICAgICAgICAgcmljZS0+azErKzsKKyAgICAgICAgICAgIHZhbHVlICs9IGZmX3R0YV9zaGlmdF8xW3JpY2UtPmswXTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJpY2UtPnN1bTAgKz0gdmFsdWUgLSAocmljZS0+c3VtMCA+PiA0KTsKKyAgICAgICAgICAgIGlmIChyaWNlLT5rMCA+IDAgJiYgcmljZS0+c3VtMCA8IGZmX3R0YV9zaGlmdF8xNltyaWNlLT5rMF0pCisgICAgICAgICAgICAgICAgcmljZS0+azAtLTsKKyAgICAgICAgICAgIGVsc2UgaWYocmljZS0+c3VtMCA+IGZmX3R0YV9zaGlmdF8xNltyaWNlLT5rMCArIDFdKQorICAgICAgICAgICAgICAgIHJpY2UtPmswKys7CisgICAgICAgIH0KKworICAgICAgICAvLyBleHRyYWN0IGNvZGVkIHZhbHVlCisgICAgICAgICpwID0gMSArICgodmFsdWUgPj4gMSkgXiAoKHZhbHVlICYgMSkgLSAxKSk7CisKKyAgICAgICAgLy8gcnVuIGh5YnJpZCBmaWx0ZXIKKyAgICAgICAgcy0+ZHNwLnR0YWZpbHRlcl9wcm9jZXNzX2RlYyhmaWx0ZXItPnFtLCBmaWx0ZXItPmR4LCBmaWx0ZXItPmRsLCAmZmlsdGVyLT5lcnJvciwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXItPnNoaWZ0LCBmaWx0ZXItPnJvdW5kKTsKKworICAgICAgICAvLyBmaXhlZCBvcmRlciBwcmVkaWN0aW9uCisjZGVmaW5lIFBSRUQoeCwgaykgKGludDMyX3QpKCgoKHVpbnQ2NF90KSh4KSA8PCAoaykpIC0gKHgpKSA+PiAoaykpCisgICAgICAgIHN3aXRjaCAocy0+YnBzKSB7CisgICAgICAgIGNhc2UgMTogKnAgKz0gUFJFRCgqcHJlZGljdG9yLCA0KTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSAzOiAqcCArPSBQUkVEKCpwcmVkaWN0b3IsIDUpOyBicmVhazsKKyAgICAgICAgY2FzZSA0OiAqcCArPSAgICAgICpwcmVkaWN0b3I7ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqcHJlZGljdG9yID0gKnA7CisKKyAgICAgICAgLy8gZmxpcCBjaGFubmVscworICAgICAgICBpZiAoY3VyX2NoYW4gPCAocy0+Y2hhbm5lbHMtMSkpCisgICAgICAgICAgICBjdXJfY2hhbisrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGRlY29ycmVsYXRlIGluIGNhc2Ugb2YgbXVsdGlwbGUgY2hhbm5lbHMKKyAgICAgICAgICAgIGlmIChzLT5jaGFubmVscyA+IDEpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90ICpyID0gcCAtIDE7CisgICAgICAgICAgICAgICAgZm9yICgqcCArPSAqciAvIDI7IHIgPiBwIC0gcy0+Y2hhbm5lbHM7IHItLSkKKyAgICAgICAgICAgICAgICAgICAgKnIgPSAqKHIgKyAxKSAtICpyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyX2NoYW4gPSAwOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGxhc3QgZnJhbWUKKyAgICAgICAgICAgIGlmIChpID09IHMtPmxhc3RfZnJhbWVfbGVuZ3RoICYmIGdldF9iaXRzX2xlZnQoJmdiKSAvIDggPT0gNCkgeworICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gZnJhbWVsZW4gPSBzLT5sYXN0X2ZyYW1lX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGFsaWduX2dldF9iaXRzKCZnYik7CisgICAgaWYgKGdldF9iaXRzX2xlZnQoJmdiKSA8IDMyKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIHNraXBfYml0c19sb25nKCZnYiwgMzIpOyAvLyBmcmFtZSBjcmMKKworICAgIC8vIGNvbnZlcnQgdG8gb3V0cHV0IGJ1ZmZlcgorICAgIHN3aXRjaCAocy0+YnBzKSB7CisgICAgY2FzZSAxOiB7CisgICAgICAgIHVpbnQ4X3QgKnNhbXBsZXMgPSAodWludDhfdCAqKWZyYW1lLT5kYXRhWzBdOworICAgICAgICBmb3IgKHAgPSBzLT5kZWNvZGVfYnVmZmVyOyBwIDwgcy0+ZGVjb2RlX2J1ZmZlciArIChmcmFtZWxlbiAqIHMtPmNoYW5uZWxzKTsgcCsrKQorICAgICAgICAgICAgKnNhbXBsZXMrKyA9ICpwICsgMHg4MDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIDI6IHsKKyAgICAgICAgaW50MTZfdCAqc2FtcGxlcyA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisgICAgICAgIGZvciAocCA9IHMtPmRlY29kZV9idWZmZXI7IHAgPCBzLT5kZWNvZGVfYnVmZmVyICsgKGZyYW1lbGVuICogcy0+Y2hhbm5lbHMpOyBwKyspCisgICAgICAgICAgICAqc2FtcGxlcysrID0gKnA7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSAzOiB7CisgICAgICAgIC8vIHNoaWZ0IHNhbXBsZXMgZm9yIDI0LWJpdCBzYW1wbGUgZm9ybWF0CisgICAgICAgIGludDMyX3QgKnNhbXBsZXMgPSAoaW50MzJfdCAqKWZyYW1lLT5kYXRhWzBdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVsZW4gKiBzLT5jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgKnNhbXBsZXMrKyA8PD0gODsKKyAgICAgICAgLy8gcmVzZXQgZGVjb2RlIGJ1ZmZlcgorICAgICAgICBzLT5kZWNvZGVfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7CitlcnJvcjoKKyAgICAvLyByZXNldCBkZWNvZGUgYnVmZmVyCisgICAgaWYgKHMtPmJwcyA9PSAzKQorICAgICAgICBzLT5kZWNvZGVfYnVmZmVyID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGluaXRfdGhyZWFkX2NvcHkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRUQUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgcmV0dXJuIGFsbG9jYXRlX2J1ZmZlcnMoYXZjdHgpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdHRhX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpIHsKKyAgICBUVEFDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChzLT5icHMgPCAzKQorICAgICAgICBhdl9mcmVlcCgmcy0+ZGVjb2RlX2J1ZmZlcik7CisgICAgcy0+ZGVjb2RlX2J1ZmZlciA9IE5VTEw7CisgICAgYXZfZnJlZXAoJnMtPmNoX2N0eCk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVFRBQ29udGV4dCwgeCkKKyNkZWZpbmUgREVDIChBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB8IEFWX09QVF9GTEFHX0FVRElPX1BBUkFNKQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJwYXNzd29yZCIsICJTZXQgZGVjb2RpbmcgcGFzc3dvcmQiLCBPRkZTRVQocGFzcyksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBERUMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHR0YV9kZWNvZGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlRUQSBEZWNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfdHRhX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInR0YSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRUQSAoVHJ1ZSBBdWRpbykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVFRBLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUVEFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB0dGFfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gdHRhX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSB0dGFfZGVjb2RlX2ZyYW1lLAorICAgIC5pbml0X3RocmVhZF9jb3B5ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoaW5pdF90aHJlYWRfY29weSksCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ0dGFfZGVjb2Rlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90dGFkYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy90dGFkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3OTNhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3R0YWRhdGEuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogVFRBIChUaGUgTG9zc2xlc3MgVHJ1ZSBBdWRpbykgZGF0YQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidHRhZGF0YS5oIgorCitjb25zdCB1aW50MzJfdCBmZl90dGFfc2hpZnRfMVtdID0geworICAgIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDgsCisgICAgMHgwMDAwMDAxMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA4MCwKKyAgICAweDAwMDAwMTAwLCAweDAwMDAwMjAwLCAweDAwMDAwNDAwLCAweDAwMDAwODAwLAorICAgIDB4MDAwMDEwMDAsIDB4MDAwMDIwMDAsIDB4MDAwMDQwMDAsIDB4MDAwMDgwMDAsCisgICAgMHgwMDAxMDAwMCwgMHgwMDAyMDAwMCwgMHgwMDA0MDAwMCwgMHgwMDA4MDAwMCwKKyAgICAweDAwMTAwMDAwLCAweDAwMjAwMDAwLCAweDAwNDAwMDAwLCAweDAwODAwMDAwLAorICAgIDB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsCisgICAgMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg4MDAwMDAwMCwKKyAgICAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLAorICAgIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAKK307CisKK2NvbnN0IHVpbnQzMl90ICogY29uc3QgZmZfdHRhX3NoaWZ0XzE2ID0gZmZfdHRhX3NoaWZ0XzEgKyA0OworCitjb25zdCB1aW50OF90IGZmX3R0YV9maWx0ZXJfY29uZmlnc1tdID0geyAxMCwgOSwgMTAsIDEyIH07CisKK3ZvaWQgZmZfdHRhX3JpY2VfaW5pdChUVEFSaWNlICpjLCB1aW50MzJfdCBrMCwgdWludDMyX3QgazEpCit7CisgICAgYy0+azAgPSBrMDsKKyAgICBjLT5rMSA9IGsxOworICAgIGMtPnN1bTAgPSBmZl90dGFfc2hpZnRfMTZbazBdOworICAgIGMtPnN1bTEgPSBmZl90dGFfc2hpZnRfMTZbazFdOworfQorCit2b2lkIGZmX3R0YV9maWx0ZXJfaW5pdChUVEFGaWx0ZXIgKmMsIGludDMyX3Qgc2hpZnQpIHsKKyAgICBtZW1zZXQoYywgMCwgc2l6ZW9mKFRUQUZpbHRlcikpOworICAgIGMtPnNoaWZ0ID0gc2hpZnQ7CisgICAgYy0+cm91bmQgPSBmZl90dGFfc2hpZnRfMVtzaGlmdC0xXTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3R0YWRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3R0YWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGM0Y2QwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHRhZGF0YS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBUVEEgKFRoZSBMb3NzbGVzcyBUcnVlIEF1ZGlvKSBkYXRhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19UVEFEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19UVEFEQVRBX0gKKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTUFYX09SREVSIDE2Cit0eXBlZGVmIHN0cnVjdCBUVEFGaWx0ZXIgeworICAgIGludDMyX3Qgc2hpZnQsIHJvdW5kLCBlcnJvcjsKKyAgICBpbnQzMl90IHFtW01BWF9PUkRFUl07CisgICAgaW50MzJfdCBkeFtNQVhfT1JERVJdOworICAgIGludDMyX3QgZGxbTUFYX09SREVSXTsKK30gVFRBRmlsdGVyOworCit0eXBlZGVmIHN0cnVjdCBUVEFSaWNlIHsKKyAgICB1aW50MzJfdCBrMCwgazEsIHN1bTAsIHN1bTE7Cit9IFRUQVJpY2U7CisKK3R5cGVkZWYgc3RydWN0IFRUQUNoYW5uZWwgeworICAgIGludDMyX3QgcHJlZGljdG9yOworICAgIFRUQUZpbHRlciBmaWx0ZXI7CisgICAgVFRBUmljZSByaWNlOworfSBUVEFDaGFubmVsOworCitleHRlcm4gY29uc3QgdWludDMyX3QgZmZfdHRhX3NoaWZ0XzFbXTsKK2V4dGVybiBjb25zdCB1aW50MzJfdCAqIGNvbnN0IGZmX3R0YV9zaGlmdF8xNjsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3R0YV9maWx0ZXJfY29uZmlnc1tdOworCit2b2lkIGZmX3R0YV9yaWNlX2luaXQoVFRBUmljZSAqYywgdWludDMyX3QgazAsIHVpbnQzMl90IGsxKTsKK3ZvaWQgZmZfdHRhX2ZpbHRlcl9pbml0KFRUQUZpbHRlciAqYywgaW50MzJfdCBzaGlmdCk7CisjZW5kaWYgLyogQVZDT0RFQ19UVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3R0YWRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHRhZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiN2FiOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3R0YWRzcC5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInR0YWRzcC5oIgorCitzdGF0aWMgdm9pZCB0dGFmaWx0ZXJfcHJvY2Vzc19kZWNfYyhpbnQzMl90ICpxbSwgaW50MzJfdCAqZHgsIGludDMyX3QgKmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqZXJyb3IsIGludDMyX3QgKmluLCBpbnQzMl90IHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3VuZCkgeworICAgIGlmICgqZXJyb3IgPCAwKSB7CisgICAgICAgIHFtWzBdIC09IGR4WzBdOyBxbVsxXSAtPSBkeFsxXTsgcW1bMl0gLT0gZHhbMl07IHFtWzNdIC09IGR4WzNdOworICAgICAgICBxbVs0XSAtPSBkeFs0XTsgcW1bNV0gLT0gZHhbNV07IHFtWzZdIC09IGR4WzZdOyBxbVs3XSAtPSBkeFs3XTsKKyAgICB9IGVsc2UgaWYgKCplcnJvciA+IDApIHsKKyAgICAgICAgcW1bMF0gKz0gZHhbMF07IHFtWzFdICs9IGR4WzFdOyBxbVsyXSArPSBkeFsyXTsgcW1bM10gKz0gZHhbM107CisgICAgICAgIHFtWzRdICs9IGR4WzRdOyBxbVs1XSArPSBkeFs1XTsgcW1bNl0gKz0gZHhbNl07IHFtWzddICs9IGR4WzddOworICAgIH0KKworICAgIHJvdW5kICs9ICAgIGRsWzBdICogcW1bMF0gKyBkbFsxXSAqIHFtWzFdICsgZGxbMl0gKiBxbVsyXSArIGRsWzNdICogcW1bM10gKworICAgICAgICAgICAgICAgIGRsWzRdICogcW1bNF0gKyBkbFs1XSAqIHFtWzVdICsgZGxbNl0gKiBxbVs2XSArIGRsWzddICogcW1bN107CisKKyAgICBkeFswXSA9IGR4WzFdOyBkeFsxXSA9IGR4WzJdOyBkeFsyXSA9IGR4WzNdOyBkeFszXSA9IGR4WzRdOworICAgIGRsWzBdID0gZGxbMV07IGRsWzFdID0gZGxbMl07IGRsWzJdID0gZGxbM107IGRsWzNdID0gZGxbNF07CisKKyAgICBkeFs0XSA9ICgoZGxbNF0gPj4gMzApIHwgMSk7CisgICAgZHhbNV0gPSAoKGRsWzVdID4+IDMwKSB8IDIpICYgfjE7CisgICAgZHhbNl0gPSAoKGRsWzZdID4+IDMwKSB8IDIpICYgfjE7CisgICAgZHhbN10gPSAoKGRsWzddID4+IDMwKSB8IDQpICYgfjM7CisKKyAgICAqZXJyb3IgPSAqaW47CisgICAgKmluICs9IChyb3VuZCA+PiBzaGlmdCk7CisKKyAgICBkbFs0XSA9IC1kbFs1XTsgZGxbNV0gPSAtZGxbNl07CisgICAgZGxbNl0gPSAqaW4gLSBkbFs3XTsgZGxbN10gPSAqaW47CisgICAgZGxbNV0gKz0gZGxbNl07IGRsWzRdICs9IGRsWzVdOworfQorCithdl9jb2xkIHZvaWQgZmZfdHRhZHNwX2luaXQoVFRBRFNQQ29udGV4dCAqYykKK3sKKyAgICBjLT50dGFmaWx0ZXJfcHJvY2Vzc19kZWMgPSB0dGFmaWx0ZXJfcHJvY2Vzc19kZWNfYzsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfdHRhZHNwX2luaXRfeDg2KGMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdHRhZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy90dGFkc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjkzMGYxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHRhZHNwLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVFRBRFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19UVEFEU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAidHRhZGF0YS5oIgorCit0eXBlZGVmIHN0cnVjdCBUVEFEU1BDb250ZXh0IHsKKyAgICB2b2lkICgqdHRhZmlsdGVyX3Byb2Nlc3NfZGVjKShpbnQzMl90ICpxbSwgaW50MzJfdCAqZHgsIGludDMyX3QgKmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmVycm9yLCBpbnQzMl90ICppbiwgaW50MzJfdCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvdW5kKTsKK30gVFRBRFNQQ29udGV4dDsKKwordm9pZCBmZl90dGFkc3BfaW5pdChUVEFEU1BDb250ZXh0ICpjKTsKK3ZvaWQgZmZfdHRhZHNwX2luaXRfeDg2KFRUQURTUENvbnRleHQgKmMpOworCisjZW5kaWYgLyogQVZDT0RFQ19UVEFEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdHRhZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy90dGFlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Q0MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHRhZW5jLmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBUVEEgKFRoZSBMb3NzbGVzcyBUcnVlIEF1ZGlvKSBlbmNvZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgQklUU1RSRUFNX1dSSVRFUl9MRQorI2luY2x1ZGUgInR0YWRhdGEuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVFRBRW5jQ29udGV4dCB7CisgICAgY29uc3QgQVZDUkMgKmNyY190YWJsZTsKKyAgICBpbnQgYnBzOworICAgIFRUQUNoYW5uZWwgKmNoX2N0eDsKK30gVFRBRW5jQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IHR0YV9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVFRBRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5jcmNfdGFibGUgPSBhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18zMl9JRUVFX0xFKTsKKworICAgIHN3aXRjaCAoYXZjdHgtPnNhbXBsZV9mbXQpIHsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfVTg6CisgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNjoKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSAxNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMjoKKyAgICAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID4gMjQpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZW5jb2RpbmcgYXMgMjQgYml0cy1wZXItc2FtcGxlXG4iKTsKKyAgICAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSAyNDsKKyAgICB9CisKKyAgICBzLT5icHMgPSBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+PiAzOworICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gMjU2ICogYXZjdHgtPnNhbXBsZV9yYXRlIC8gMjQ1OworCisgICAgcy0+Y2hfY3R4ID0gYXZfbWFsbG9jX2FycmF5KGF2Y3R4LT5jaGFubmVscywgc2l6ZW9mKCpzLT5jaF9jdHgpKTsKKyAgICBpZiAoIXMtPmNoX2N0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHRhZmlsdGVyX3Byb2Nlc3MoVFRBRmlsdGVyICpjLCBpbnQzMl90ICppbikKK3sKKyAgICByZWdpc3RlciBpbnQzMl90ICpkbCA9IGMtPmRsLCAqcW0gPSBjLT5xbSwgKmR4ID0gYy0+ZHgsIHN1bSA9IGMtPnJvdW5kOworCisgICAgaWYgKGMtPmVycm9yIDwgMCkgeworICAgICAgICBxbVswXSAtPSBkeFswXTsgcW1bMV0gLT0gZHhbMV07IHFtWzJdIC09IGR4WzJdOyBxbVszXSAtPSBkeFszXTsKKyAgICAgICAgcW1bNF0gLT0gZHhbNF07IHFtWzVdIC09IGR4WzVdOyBxbVs2XSAtPSBkeFs2XTsgcW1bN10gLT0gZHhbN107CisgICAgfSBlbHNlIGlmIChjLT5lcnJvciA+IDApIHsKKyAgICAgICAgcW1bMF0gKz0gZHhbMF07IHFtWzFdICs9IGR4WzFdOyBxbVsyXSArPSBkeFsyXTsgcW1bM10gKz0gZHhbM107CisgICAgICAgIHFtWzRdICs9IGR4WzRdOyBxbVs1XSArPSBkeFs1XTsgcW1bNl0gKz0gZHhbNl07IHFtWzddICs9IGR4WzddOworICAgIH0KKworICAgIHN1bSArPSBkbFswXSAqIHFtWzBdICsgZGxbMV0gKiBxbVsxXSArIGRsWzJdICogcW1bMl0gKyBkbFszXSAqIHFtWzNdICsKKyAgICAgICAgICAgZGxbNF0gKiBxbVs0XSArIGRsWzVdICogcW1bNV0gKyBkbFs2XSAqIHFtWzZdICsgZGxbN10gKiBxbVs3XTsKKworICAgIGR4WzBdID0gZHhbMV07IGR4WzFdID0gZHhbMl07IGR4WzJdID0gZHhbM107IGR4WzNdID0gZHhbNF07CisgICAgZGxbMF0gPSBkbFsxXTsgZGxbMV0gPSBkbFsyXTsgZGxbMl0gPSBkbFszXTsgZGxbM10gPSBkbFs0XTsKKworICAgIGR4WzRdID0gKChkbFs0XSA+PiAzMCkgfCAxKTsKKyAgICBkeFs1XSA9ICgoZGxbNV0gPj4gMzApIHwgMikgJiB+MTsKKyAgICBkeFs2XSA9ICgoZGxbNl0gPj4gMzApIHwgMikgJiB+MTsKKyAgICBkeFs3XSA9ICgoZGxbN10gPj4gMzApIHwgNCkgJiB+MzsKKworICAgIGRsWzRdID0gLWRsWzVdOyBkbFs1XSA9IC1kbFs2XTsKKyAgICBkbFs2XSA9ICppbiAtIGRsWzddOyBkbFs3XSA9ICppbjsKKyAgICBkbFs1XSArPSBkbFs2XTsgZGxbNF0gKz0gZGxbNV07CisKKyAgICAqaW4gLT0gKHN1bSA+PiBjLT5zaGlmdCk7CisgICAgYy0+ZXJyb3IgPSAqaW47Cit9CisKK3N0YXRpYyBpbnQzMl90IGdldF9zYW1wbGUoY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCBzYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgZm9ybWF0KQoreworICAgIGludDMyX3QgcmV0OworCisgICAgaWYgKGZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX1U4KSB7CisgICAgICAgIHJldCA9IGZyYW1lLT5kYXRhWzBdW3NhbXBsZV0gLSAweDgwOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEFWX1NBTVBMRV9GTVRfUzE2KSB7CisgICAgICAgIGNvbnN0IGludDE2X3QgKnB0ciA9IChjb25zdCBpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisgICAgICAgIHJldCA9IHB0cltzYW1wbGVdOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludDMyX3QgKnB0ciA9IChjb25zdCBpbnQzMl90ICopZnJhbWUtPmRhdGFbMF07CisgICAgICAgIHJldCA9IHB0cltzYW1wbGVdID4+IDg7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0dGFfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIFRUQUVuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFB1dEJpdENvbnRleHQgcGI7CisgICAgaW50IHJldCwgaSwgb3V0X2J5dGVzLCBjdXJfY2hhbiA9IDAsIHJlcyA9IDAsIHNhbXBsZXMgPSAwOworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgZnJhbWUtPm5iX3NhbXBsZXMgKiAyICogYXZjdHgtPmNoYW5uZWxzICogcy0+YnBzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGluaXRfcHV0X2JpdHMoJnBiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworCisgICAgLy8gaW5pdCBwZXIgY2hhbm5lbCBzdGF0ZXMKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgcy0+Y2hfY3R4W2ldLnByZWRpY3RvciA9IDA7CisgICAgICAgIGZmX3R0YV9maWx0ZXJfaW5pdCgmcy0+Y2hfY3R4W2ldLmZpbHRlciwgZmZfdHRhX2ZpbHRlcl9jb25maWdzW3MtPmJwcyAtIDFdKTsKKyAgICAgICAgZmZfdHRhX3JpY2VfaW5pdCgmcy0+Y2hfY3R4W2ldLnJpY2UsIDEwLCAxMCk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5uYl9zYW1wbGVzICogYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgVFRBQ2hhbm5lbCAqYyA9ICZzLT5jaF9jdHhbY3VyX2NoYW5dOworICAgICAgICBUVEFGaWx0ZXIgKmZpbHRlciA9ICZjLT5maWx0ZXI7CisgICAgICAgIFRUQVJpY2UgKnJpY2UgPSAmYy0+cmljZTsKKyAgICAgICAgdWludDMyX3QgaywgdW5hcnksIG91dHZhbDsKKyAgICAgICAgaW50MzJfdCB2YWx1ZSwgdGVtcDsKKworICAgICAgICB2YWx1ZSA9IGdldF9zYW1wbGUoZnJhbWUsIHNhbXBsZXMrKywgYXZjdHgtPnNhbXBsZV9mbXQpOworCisgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiAxKSB7CisgICAgICAgICAgICBpZiAoY3VyX2NoYW4gPCBhdmN0eC0+Y2hhbm5lbHMgLSAxKQorICAgICAgICAgICAgICAgIHZhbHVlICA9IHJlcyA9IGdldF9zYW1wbGUoZnJhbWUsIHNhbXBsZXMsIGF2Y3R4LT5zYW1wbGVfZm10KSAtIHZhbHVlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbHVlIC09IHJlcyAvIDI7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wID0gdmFsdWU7CisjZGVmaW5lIFBSRUQoeCwgaykgKGludDMyX3QpKCgoKHVpbnQ2NF90KSh4KSA8PCAoaykpIC0gKHgpKSA+PiAoaykpCisgICAgICAgIHN3aXRjaCAocy0+YnBzKSB7CisgICAgICAgIGNhc2UgMTogdmFsdWUgLT0gUFJFRChjLT5wcmVkaWN0b3IsIDQpOyBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDM6IHZhbHVlIC09IFBSRUQoYy0+cHJlZGljdG9yLCA1KTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYy0+cHJlZGljdG9yID0gdGVtcDsKKworICAgICAgICB0dGFmaWx0ZXJfcHJvY2VzcyhmaWx0ZXIsICZ2YWx1ZSk7CisgICAgICAgIG91dHZhbCA9ICh2YWx1ZSA+IDApID8gKHZhbHVlIDw8IDEpIC0gMTogLXZhbHVlIDw8IDE7CisKKyAgICAgICAgayA9IHJpY2UtPmswOworCisgICAgICAgIHJpY2UtPnN1bTAgKz0gb3V0dmFsIC0gKHJpY2UtPnN1bTAgPj4gNCk7CisgICAgICAgIGlmIChyaWNlLT5rMCA+IDAgJiYgcmljZS0+c3VtMCA8IGZmX3R0YV9zaGlmdF8xNltyaWNlLT5rMF0pCisgICAgICAgICAgICByaWNlLT5rMC0tOworICAgICAgICBlbHNlIGlmIChyaWNlLT5zdW0wID4gZmZfdHRhX3NoaWZ0XzE2W3JpY2UtPmswICsgMV0pCisgICAgICAgICAgICByaWNlLT5rMCsrOworCisgICAgICAgIGlmIChvdXR2YWwgPj0gZmZfdHRhX3NoaWZ0XzFba10pIHsKKyAgICAgICAgICAgIG91dHZhbCAtPSBmZl90dGFfc2hpZnRfMVtrXTsKKyAgICAgICAgICAgIGsgPSByaWNlLT5rMTsKKworICAgICAgICAgICAgcmljZS0+c3VtMSArPSBvdXR2YWwgLSAocmljZS0+c3VtMSA+PiA0KTsKKyAgICAgICAgICAgIGlmIChyaWNlLT5rMSA+IDAgJiYgcmljZS0+c3VtMSA8IGZmX3R0YV9zaGlmdF8xNltyaWNlLT5rMV0pCisgICAgICAgICAgICAgICAgcmljZS0+azEtLTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJpY2UtPnN1bTEgPiBmZl90dGFfc2hpZnRfMTZbcmljZS0+azEgKyAxXSkKKyAgICAgICAgICAgICAgICByaWNlLT5rMSsrOworCisgICAgICAgICAgICB1bmFyeSA9IDEgKyAob3V0dmFsID4+IGspOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmICh1bmFyeSA+IDMxKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgMzEsIDB4N0ZGRkZGRkYpOworICAgICAgICAgICAgICAgICAgICB1bmFyeSAtPSAzMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcGIsIHVuYXJ5LCAoMSA8PCB1bmFyeSkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgdW5hcnkgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHVuYXJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7CisKKyAgICAgICAgaWYgKGspCisgICAgICAgICAgICBwdXRfYml0cygmcGIsIGssIG91dHZhbCAmIChmZl90dGFfc2hpZnRfMVtrXSAtIDEpKTsKKworICAgICAgICBpZiAoY3VyX2NoYW4gPCBhdmN0eC0+Y2hhbm5lbHMgLSAxKQorICAgICAgICAgICAgY3VyX2NoYW4rKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3VyX2NoYW4gPSAwOworICAgIH0KKworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgb3V0X2J5dGVzID0gcHV0X2JpdHNfY291bnQoJnBiKSA+PiAzOworICAgIHB1dF9iaXRzMzIoJnBiLCBhdl9jcmMocy0+Y3JjX3RhYmxlLCBVSU5UMzJfTUFYLCBhdnBrdC0+ZGF0YSwgb3V0X2J5dGVzKSBeIFVJTlQzMl9NQVgpOworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisKKyAgICBhdnBrdC0+cHRzICAgICAgPSBmcmFtZS0+cHRzOworICAgIGF2cGt0LT5zaXplICAgICA9IG91dF9ieXRlcyArIDQ7CisgICAgYXZwa3QtPmR1cmF0aW9uID0gZmZfc2FtcGxlc190b190aW1lX2Jhc2UoYXZjdHgsIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICAqZ290X3BhY2tldF9wdHIgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdHRhX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVFRBRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYXZfZnJlZXAoJnMtPmNoX2N0eCk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfdHRhX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInR0YSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRUQSAoVHJ1ZSBBdWRpbykiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVFRBLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUVEFFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB0dGFfZW5jb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gdHRhX2VuY29kZV9jbG9zZSwKKyAgICAuZW5jb2RlMiAgICAgICAgPSB0dGFfZW5jb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FIHwgQ09ERUNfQ0FQX0xPU1NMRVNTLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1U4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3R3aW52cS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHdpbnZxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyODliMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3R3aW52cS5jCkBAIC0wLDAgKzEsODA4IEBACisvKgorICogVHdpblZRIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBWaXRvciBTZXNzYWsKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZmZ0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsc3AuaCIKKyNpbmNsdWRlICJzaW5ld2luLmgiCisjaW5jbHVkZSAidHdpbnZxLmgiCisKKy8qKgorICogRXZhbHVhdGUgYSBzaW5nbGUgTFBDIGFtcGxpdHVkZSBzcGVjdHJ1bSBlbnZlbG9wZSBjb2VmZmljaWVudCBmcm9tIHRoZSBsaW5lCisgKiBzcGVjdHJ1bSBwYWlycy4KKyAqCisgKiBAcGFyYW0gbHNwIGEgdmVjdG9yIG9mIHRoZSBjb3NpbmUgb2YgdGhlIExTUCB2YWx1ZXMKKyAqIEBwYXJhbSBjb3NfdmFsIGNvcyhQSSppL04pIHdoZXJlIGkgaXMgdGhlIGluZGV4IG9mIHRoZSBMUEMgYW1wbGl0dWRlCisgKiBAcGFyYW0gb3JkZXIgdGhlIG9yZGVyIG9mIHRoZSBMU1AgKGFuZCB0aGUgc2l6ZSBvZiB0aGUgKmxzcCBidWZmZXIpLiBNdXN0CisgKiAgICAgICAgYmUgYSBtdWx0aXBsZSBvZiBmb3VyLgorICogQHJldHVybiB0aGUgTFBDIHZhbHVlCisgKgorICogQHRvZG8gcmV1c2UgY29kZSBmcm9tIFZvcmJpcyBkZWNvZGVyOiB2b3JiaXNfZmxvb3IwX2RlY29kZQorICovCitzdGF0aWMgZmxvYXQgZXZhbF9scGNfc3BlY3RydW0oY29uc3QgZmxvYXQgKmxzcCwgZmxvYXQgY29zX3ZhbCwgaW50IG9yZGVyKQoreworICAgIGludCBqOworICAgIGZsb2F0IHAgICAgICAgICA9IDAuNWY7CisgICAgZmxvYXQgcSAgICAgICAgID0gMC41ZjsKKyAgICBmbG9hdCB0d29fY29zX3cgPSAyLjBmICogY29zX3ZhbDsKKworICAgIGZvciAoaiA9IDA7IGogKyAxIDwgb3JkZXI7IGogKz0gMiAqIDIpIHsKKyAgICAgICAgLy8gVW5yb2xsIHRoZSBsb29wIG9uY2Ugc2luY2Ugb3JkZXIgaXMgYSBtdWx0aXBsZSBvZiBmb3VyCisgICAgICAgIHEgKj0gbHNwW2pdICAgICAtIHR3b19jb3NfdzsKKyAgICAgICAgcCAqPSBsc3BbaiArIDFdIC0gdHdvX2Nvc193OworCisgICAgICAgIHEgKj0gbHNwW2ogKyAyXSAtIHR3b19jb3NfdzsKKyAgICAgICAgcCAqPSBsc3BbaiArIDNdIC0gdHdvX2Nvc193OworICAgIH0KKworICAgIHAgKj0gcCAqICgyLjBmIC0gdHdvX2Nvc193KTsKKyAgICBxICo9IHEgKiAoMi4wZiArIHR3b19jb3Nfdyk7CisKKyAgICByZXR1cm4gMC41IC8gKHAgKyBxKTsKK30KKworLyoqCisgKiBFdmFsdWF0ZSB0aGUgTFBDIGFtcGxpdHVkZSBzcGVjdHJ1bSBlbnZlbG9wZSBmcm9tIHRoZSBsaW5lIHNwZWN0cnVtIHBhaXJzLgorICovCitzdGF0aWMgdm9pZCBldmFsX2xwY2VudihUd2luVlFDb250ZXh0ICp0Y3R4LCBjb25zdCBmbG9hdCAqY29zX3ZhbHMsIGZsb2F0ICpscGMpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgVHdpblZRTW9kZVRhYiAqbXRhYiA9IHRjdHgtPm10YWI7CisgICAgaW50IHNpemVfcyA9IG10YWItPnNpemUgLyBtdGFiLT5mbW9kZVtUV0lOVlFfRlRfU0hPUlRdLnN1YjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX3MgLyAyOyBpKyspIHsKKyAgICAgICAgZmxvYXQgY29zX2kgPSB0Y3R4LT5jb3NfdGFic1swXVtpXTsKKyAgICAgICAgbHBjW2ldICAgICAgICAgICAgICA9IGV2YWxfbHBjX3NwZWN0cnVtKGNvc192YWxzLCAgY29zX2ksIG10YWItPm5fbHNwKTsKKyAgICAgICAgbHBjW3NpemVfcyAtIGkgLSAxXSA9IGV2YWxfbHBjX3NwZWN0cnVtKGNvc192YWxzLCAtY29zX2ksIG10YWItPm5fbHNwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGludGVycG9sYXRlKGZsb2F0ICpvdXQsIGZsb2F0IHYxLCBmbG9hdCB2MiwgaW50IHNpemUpCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgc3RlcCA9ICh2MSAtIHYyKSAvIChzaXplICsgMSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHYyICAgICs9IHN0ZXA7CisgICAgICAgIG91dFtpXSA9IHYyOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBmbG9hdCBnZXRfY29zKGludCBpZHgsIGludCBwYXJ0LCBjb25zdCBmbG9hdCAqY29zX3RhYiwgaW50IHNpemUpCit7CisgICAgcmV0dXJuIHBhcnQgPyAtY29zX3RhYltzaXplIC0gaWR4IC0gMV0KKyAgICAgICAgICAgICAgICA6ICBjb3NfdGFiW2lkeF07Cit9CisKKy8qKgorICogRXZhbHVhdGUgdGhlIExQQyBhbXBsaXR1ZGUgc3BlY3RydW0gZW52ZWxvcGUgZnJvbSB0aGUgbGluZSBzcGVjdHJ1bSBwYWlycy4KKyAqIFByb2JhYmx5IGZvciBzcGVlZCByZWFzb25zLCB0aGUgY29lZmZpY2llbnRzIGFyZSBldmFsdWF0ZWQgYXMKKyAqIHNpaWlpYmlpaWlzaWlpaWJpaWlpc2lpaWliaWlpaXNpaWlpYmlpaWlzIC4uLgorICogd2hlcmUgcyBpcyBhbiBldmFsdWF0ZWQgdmFsdWUsIGkgaXMgYSB2YWx1ZSBpbnRlcnBvbGF0ZWQgZnJvbSB0aGUgb3RoZXJzCisgKiBhbmQgYiBtaWdodCBiZSBlaXRoZXIgY2FsY3VsYXRlZCBvciBpbnRlcnBvbGF0ZWQsIGRlcGVuZGluZyBvbiBhbgorICogdW5leHBsYWluZWQgY29uZGl0aW9uLgorICoKKyAqIEBwYXJhbSBzdGVwIHRoZSBzaXplIG9mIGEgYmxvY2sgInNpaWlpYmlpaWkiCisgKiBAcGFyYW0gaW4gdGhlIGNvc2luZSBvZiB0aGUgTFNQIGRhdGEKKyAqIEBwYXJhbSBwYXJ0IGlzIDAgZm9yIDAuLi5QSSAocG9zaXRpdmUgY29zaW5lIHZhbHVlcykgYW5kIDEgZm9yIFBJLi4uMlBJCisgKiAgICAgICAgKG5lZ2F0aXZlIGNvc2luZSB2YWx1ZXMpCisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgd2hvbGUgb3V0cHV0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBldmFsX2xwY2Vudl9vcl9pbnRlcnAoVHdpblZRQ29udGV4dCAqdGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBUd2luVlFGcmFtZVR5cGUgZnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCBzdGVwLCBpbnQgcGFydCkKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCBUd2luVlFNb2RlVGFiICptdGFiID0gdGN0eC0+bXRhYjsKKyAgICBjb25zdCBmbG9hdCAqY29zX3RhYiAgICAgID0gdGN0eC0+Y29zX3RhYnNbZnR5cGVdOworCisgICAgLy8gRmlsbCB0aGUgJ3MnCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gc3RlcCkKKyAgICAgICAgb3V0W2ldID0KKyAgICAgICAgICAgIGV2YWxfbHBjX3NwZWN0cnVtKGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NvcyhpLCBwYXJ0LCBjb3NfdGFiLCBzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10YWItPm5fbHNwKTsKKworICAgIC8vIEZpbGwgdGhlICdpaWlpYmlpaWknCisgICAgZm9yIChpID0gc3RlcDsgaSA8PSBzaXplIC0gMiAqIHN0ZXA7IGkgKz0gc3RlcCkgeworICAgICAgICBpZiAob3V0W2kgKyBzdGVwXSArIG91dFtpIC0gc3RlcF0gPiAxLjk1ICogb3V0W2ldIHx8CisgICAgICAgICAgICBvdXRbaSArIHN0ZXBdICAgICAgICAgICAgICAgICA+PSBvdXRbaSAtIHN0ZXBdKSB7CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShvdXQgKyBpIC0gc3RlcCArIDEsIG91dFtpXSwgb3V0W2kgLSBzdGVwXSwgc3RlcCAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0W2kgLSBzdGVwIC8gMl0gPQorICAgICAgICAgICAgICAgIGV2YWxfbHBjX3NwZWN0cnVtKGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jb3MoaSAtIHN0ZXAgLyAyLCBwYXJ0LCBjb3NfdGFiLCBzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdGFiLT5uX2xzcCk7CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShvdXQgKyBpIC0gc3RlcCArIDEsIG91dFtpIC0gc3RlcCAvIDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2kgLSBzdGVwXSwgc3RlcCAvIDIgLSAxKTsKKyAgICAgICAgICAgIGludGVycG9sYXRlKG91dCArIGkgLSBzdGVwIC8gMiArIDEsIG91dFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFtpIC0gc3RlcCAvIDJdLCBzdGVwIC8gMiAtIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJwb2xhdGUob3V0ICsgc2l6ZSAtIDIgKiBzdGVwICsgMSwgb3V0W3NpemUgLSBzdGVwXSwKKyAgICAgICAgICAgICAgICBvdXRbc2l6ZSAtIDIgKiBzdGVwXSwgc3RlcCAtIDEpOworfQorCitzdGF0aWMgdm9pZCBldmFsX2xwY2Vudl8ycGFydHMoVHdpblZRQ29udGV4dCAqdGN0eCwgZW51bSBUd2luVlFGcmFtZVR5cGUgZnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmJ1ZiwgZmxvYXQgKmxwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IHN0ZXApCit7CisgICAgZXZhbF9scGNlbnZfb3JfaW50ZXJwKHRjdHgsIGZ0eXBlLCBscGMsIGJ1Ziwgc2l6ZSAvIDIsIHN0ZXAsIDApOworICAgIGV2YWxfbHBjZW52X29yX2ludGVycCh0Y3R4LCBmdHlwZSwgbHBjICsgc2l6ZSAvIDIsIGJ1Ziwgc2l6ZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBzdGVwLCAxKTsKKworICAgIGludGVycG9sYXRlKGxwYyArIHNpemUgLyAyIC0gc3RlcCArIDEsIGxwY1tzaXplIC8gMl0sCisgICAgICAgICAgICAgICAgbHBjW3NpemUgLyAyIC0gc3RlcF0sIHN0ZXApOworCisgICAgdHdpbnZxX21lbXNldF9mbG9hdChscGMgKyBzaXplIC0gMiAqIHN0ZXAgKyAxLCBscGNbc2l6ZSAtIDIgKiBzdGVwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBzdGVwIC0gMSk7Cit9CisKKy8qKgorICogSW52ZXJzZSBxdWFudGl6YXRpb24uIFJlYWQgQ0IgY29lZmZpY2llbnRzIGZvciBjYjEgYW5kIGNiMiBmcm9tIHRoZQorICogYml0c3RyZWFtLCBzdW0gdGhlIGNvcnJlc3BvbmRpbmcgdmVjdG9ycyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byAqb3V0CisgKiBhZnRlciBwZXJtdXRhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZGVxdWFudChUd2luVlFDb250ZXh0ICp0Y3R4LCBjb25zdCB1aW50OF90ICpjYl9iaXRzLCBmbG9hdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICBlbnVtIFR3aW5WUUZyYW1lVHlwZSBmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2IwLCBjb25zdCBpbnQxNl90ICpjYjEsIGludCBjYl9sZW4pCit7CisgICAgaW50IHBvcyA9IDA7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGN0eC0+bl9kaXZbZnR5cGVdOyBpKyspIHsKKyAgICAgICAgaW50IHRtcDAsIHRtcDE7CisgICAgICAgIGludCBzaWduMCA9IDE7CisgICAgICAgIGludCBzaWduMSA9IDE7CisgICAgICAgIGNvbnN0IGludDE2X3QgKnRhYjAsICp0YWIxOworICAgICAgICBpbnQgbGVuZ3RoID0gdGN0eC0+bGVuZ3RoW2Z0eXBlXVtpID49IHRjdHgtPmxlbmd0aF9jaGFuZ2VbZnR5cGVdXTsKKyAgICAgICAgaW50IGJpdHN0cmVhbV9zZWNvbmRfcGFydCA9IChpID49IHRjdHgtPmJpdHNfbWFpbl9zcGVjX2NoYW5nZVtmdHlwZV0pOworCisgICAgICAgIGludCBiaXRzID0gdGN0eC0+Yml0c19tYWluX3NwZWNbMF1bZnR5cGVdW2JpdHN0cmVhbV9zZWNvbmRfcGFydF07CisgICAgICAgIHRtcDAgPSAqY2JfYml0cysrOworICAgICAgICBpZiAoYml0cyA9PSA3KSB7CisgICAgICAgICAgICBpZiAodG1wMCAmIDB4NDApCisgICAgICAgICAgICAgICAgc2lnbjAgPSAtMTsKKyAgICAgICAgICAgIHRtcDAgJj0gMHgzRjsKKyAgICAgICAgfQorCisgICAgICAgIGJpdHMgPSB0Y3R4LT5iaXRzX21haW5fc3BlY1sxXVtmdHlwZV1bYml0c3RyZWFtX3NlY29uZF9wYXJ0XTsKKyAgICAgICAgdG1wMSA9ICpjYl9iaXRzKys7CisgICAgICAgIGlmIChiaXRzID09IDcpIHsKKyAgICAgICAgICAgIGlmICh0bXAxICYgMHg0MCkKKyAgICAgICAgICAgICAgICBzaWduMSA9IC0xOworICAgICAgICAgICAgdG1wMSAmPSAweDNGOworICAgICAgICB9CisKKyAgICAgICAgdGFiMCA9IGNiMCArIHRtcDAgKiBjYl9sZW47CisgICAgICAgIHRhYjEgPSBjYjEgKyB0bXAxICogY2JfbGVuOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykKKyAgICAgICAgICAgIG91dFt0Y3R4LT5wZXJtdXRbZnR5cGVdW3BvcyArIGpdXSA9IHNpZ24wICogdGFiMFtqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduMSAqIHRhYjFbal07CisKKyAgICAgICAgcG9zICs9IGxlbmd0aDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY19nYWluKFR3aW5WUUNvbnRleHQgKnRjdHgsCisgICAgICAgICAgICAgICAgICAgICBlbnVtIFR3aW5WUUZyYW1lVHlwZSBmdHlwZSwgZmxvYXQgKm91dCkKK3sKKyAgICBjb25zdCBUd2luVlFNb2RlVGFiICAgKm10YWIgPSAgdGN0eC0+bXRhYjsKKyAgICBjb25zdCBUd2luVlFGcmFtZURhdGEgKmJpdHMgPSAmdGN0eC0+Yml0c1t0Y3R4LT5jdXJfZnJhbWVdOworICAgIGludCBpLCBqOworICAgIGludCBzdWIgICAgICAgID0gbXRhYi0+Zm1vZGVbZnR5cGVdLnN1YjsKKyAgICBmbG9hdCBzdGVwICAgICA9IFRXSU5WUV9BTVBfTUFYICAgICAvICgoMSA8PCBUV0lOVlFfR0FJTl9CSVRTKSAgICAgLSAxKTsKKyAgICBmbG9hdCBzdWJfc3RlcCA9IFRXSU5WUV9TVUJfQU1QX01BWCAvICgoMSA8PCBUV0lOVlFfU1VCX0dBSU5fQklUUykgLSAxKTsKKworICAgIGlmIChmdHlwZSA9PSBUV0lOVlFfRlRfTE9ORykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGN0eC0+YXZjdHgtPmNoYW5uZWxzOyBpKyspCisgICAgICAgICAgICBvdXRbaV0gPSAoMS4wIC8gKDEgPDwgMTMpKSAqCisgICAgICAgICAgICAgICAgICAgICB0d2ludnFfbXVsYXdpbnYoc3RlcCAqIDAuNSArIHN0ZXAgKiBiaXRzLT5nYWluX2JpdHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFdJTlZRX0FNUF9NQVgsIFRXSU5WUV9NVUxBV19NVSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRjdHgtPmF2Y3R4LT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCB2YWwgPSAoMS4wIC8gKDEgPDwgMjMpKSAqCisgICAgICAgICAgICAgICAgICAgICAgICB0d2ludnFfbXVsYXdpbnYoc3RlcCAqIDAuNSArIHN0ZXAgKiBiaXRzLT5nYWluX2JpdHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFdJTlZRX0FNUF9NQVgsIFRXSU5WUV9NVUxBV19NVSk7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWI7IGorKykKKyAgICAgICAgICAgICAgICBvdXRbaSAqIHN1YiArIGpdID0KKyAgICAgICAgICAgICAgICAgICAgdmFsICogdHdpbnZxX211bGF3aW52KHN1Yl9zdGVwICogMC41ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9zdGVwICogYml0cy0+c3ViX2dhaW5fYml0c1tpICogc3ViICsgal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUV0lOVlFfU1VCX0FNUF9NQVgsIFRXSU5WUV9NVUxBV19NVSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogUmVhcnJhbmdlIHRoZSBMU1AgY29lZmZpY2llbnRzIHNvIHRoYXQgdGhleSBoYXZlIGEgbWluaW11bSBkaXN0YW5jZSBvZgorICogbWluX2Rpc3QuIFRoaXMgZnVuY3Rpb24gZG9lcyBpdCBleGFjdGx5IGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIG9mIDMuMi40CisgKiBvZiB0aGUgRy43Mjkgc3BlY2lmaWNhdGlvbiAoYnV0IGludGVyZXN0aW5nbHkgaXMgZGlmZmVyZW50IGZyb20gd2hhdCB0aGUKKyAqIHJlZmVyZW5jZSBkZWNvZGVyIGFjdHVhbGx5IGRvZXMpLgorICovCitzdGF0aWMgdm9pZCByZWFycmFuZ2VfbHNwKGludCBvcmRlciwgZmxvYXQgKmxzcCwgZmxvYXQgbWluX2Rpc3QpCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgbWluX2Rpc3QyID0gbWluX2Rpc3QgKiAwLjU7CisgICAgZm9yIChpID0gMTsgaSA8IG9yZGVyOyBpKyspCisgICAgICAgIGlmIChsc3BbaV0gLSBsc3BbaSAtIDFdIDwgbWluX2Rpc3QpIHsKKyAgICAgICAgICAgIGZsb2F0IGF2ZyA9IChsc3BbaV0gKyBsc3BbaSAtIDFdKSAqIDAuNTsKKworICAgICAgICAgICAgbHNwW2kgLSAxXSA9IGF2ZyAtIG1pbl9kaXN0MjsKKyAgICAgICAgICAgIGxzcFtpXSAgICAgPSBhdmcgKyBtaW5fZGlzdDI7CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2xzcChUd2luVlFDb250ZXh0ICp0Y3R4LCBpbnQgbHBjX2lkeDEsIHVpbnQ4X3QgKmxwY19pZHgyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHBjX2hpc3RfaWR4LCBmbG9hdCAqbHNwLCBmbG9hdCAqaGlzdCkKK3sKKyAgICBjb25zdCBUd2luVlFNb2RlVGFiICptdGFiID0gdGN0eC0+bXRhYjsKKyAgICBpbnQgaSwgajsKKworICAgIGNvbnN0IGZsb2F0ICpjYiAgPSBtdGFiLT5sc3Bjb2RlYm9vazsKKyAgICBjb25zdCBmbG9hdCAqY2IyID0gY2IgICsgKDEgPDwgbXRhYi0+bHNwX2JpdDEpICogbXRhYi0+bl9sc3A7CisgICAgY29uc3QgZmxvYXQgKmNiMyA9IGNiMiArICgxIDw8IG10YWItPmxzcF9iaXQyKSAqIG10YWItPm5fbHNwOworCisgICAgY29uc3QgaW50OF90IGZ1bm55X3JvdW5kaW5nWzRdID0geworICAgICAgICAtMiwKKyAgICAgICAgbXRhYi0+bHNwX3NwbGl0ID09IDQgPyAtMiA6IDEsCisgICAgICAgIG10YWItPmxzcF9zcGxpdCA9PSA0ID8gLTIgOiAxLAorICAgICAgICAwCisgICAgfTsKKworICAgIGogPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBtdGFiLT5sc3Bfc3BsaXQ7IGkrKykgeworICAgICAgICBpbnQgY2h1bmtfZW5kID0gKChpICsgMSkgKiBtdGFiLT5uX2xzcCArIGZ1bm55X3JvdW5kaW5nW2ldKSAvCisgICAgICAgICAgICAgICAgICAgICAgICBtdGFiLT5sc3Bfc3BsaXQ7CisgICAgICAgIGZvciAoOyBqIDwgY2h1bmtfZW5kOyBqKyspCisgICAgICAgICAgICBsc3Bbal0gPSBjYltscGNfaWR4MSAgICAgKiBtdGFiLT5uX2xzcCArIGpdICsKKyAgICAgICAgICAgICAgICAgICAgIGNiMltscGNfaWR4MltpXSAqIG10YWItPm5fbHNwICsgal07CisgICAgfQorCisgICAgcmVhcnJhbmdlX2xzcChtdGFiLT5uX2xzcCwgbHNwLCAwLjAwMDEpOworCisgICAgZm9yIChpID0gMDsgaSA8IG10YWItPm5fbHNwOyBpKyspIHsKKyAgICAgICAgZmxvYXQgdG1wMSA9IDEuMCAgICAgLSBjYjNbbHBjX2hpc3RfaWR4ICogbXRhYi0+bl9sc3AgKyBpXTsKKyAgICAgICAgZmxvYXQgdG1wMiA9IGhpc3RbaV0gKiBjYjNbbHBjX2hpc3RfaWR4ICogbXRhYi0+bl9sc3AgKyBpXTsKKyAgICAgICAgaGlzdFtpXSA9IGxzcFtpXTsKKyAgICAgICAgbHNwW2ldICA9IGxzcFtpXSAqIHRtcDEgKyB0bXAyOworICAgIH0KKworICAgIHJlYXJyYW5nZV9sc3AobXRhYi0+bl9sc3AsIGxzcCwgMC4wMDAxKTsKKyAgICByZWFycmFuZ2VfbHNwKG10YWItPm5fbHNwLCBsc3AsIDAuMDAwMDk1KTsKKyAgICBmZl9zb3J0X25lYXJseV9zb3J0ZWRfZmxvYXRzKGxzcCwgbXRhYi0+bl9sc3ApOworfQorCitzdGF0aWMgdm9pZCBkZWNfbHBjX3NwZWN0cnVtX2ludihUd2luVlFDb250ZXh0ICp0Y3R4LCBmbG9hdCAqbHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBUd2luVlFGcmFtZVR5cGUgZnR5cGUsIGZsb2F0ICpscGMpCit7CisgICAgaW50IGk7CisgICAgaW50IHNpemUgPSB0Y3R4LT5tdGFiLT5zaXplIC8gdGN0eC0+bXRhYi0+Zm1vZGVbZnR5cGVdLnN1YjsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0Y3R4LT5tdGFiLT5uX2xzcDsgaSsrKQorICAgICAgICBsc3BbaV0gPSAyICogY29zKGxzcFtpXSk7CisKKyAgICBzd2l0Y2ggKGZ0eXBlKSB7CisgICAgY2FzZSBUV0lOVlFfRlRfTE9ORzoKKyAgICAgICAgZXZhbF9scGNlbnZfMnBhcnRzKHRjdHgsIGZ0eXBlLCBsc3AsIGxwYywgc2l6ZSwgOCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFdJTlZRX0ZUX01FRElVTToKKyAgICAgICAgZXZhbF9scGNlbnZfMnBhcnRzKHRjdHgsIGZ0eXBlLCBsc3AsIGxwYywgc2l6ZSwgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFdJTlZRX0ZUX1NIT1JUOgorICAgICAgICBldmFsX2xwY2Vudih0Y3R4LCBsc3AsIGxwYyk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgd3R5cGVfdG9fd3NpemVbXSA9IHsgMCwgMCwgMiwgMiwgMiwgMSwgMCwgMSwgMSB9OworCitzdGF0aWMgdm9pZCBpbWRjdF9hbmRfd2luZG93KFR3aW5WUUNvbnRleHQgKnRjdHgsIGVudW0gVHdpblZRRnJhbWVUeXBlIGZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3R5cGUsIGZsb2F0ICppbiwgZmxvYXQgKnByZXYsIGludCBjaCkKK3sKKyAgICBGRlRDb250ZXh0ICptZGN0ID0gJnRjdHgtPm1kY3RfY3R4W2Z0eXBlXTsKKyAgICBjb25zdCBUd2luVlFNb2RlVGFiICptdGFiID0gdGN0eC0+bXRhYjsKKyAgICBpbnQgYnNpemUgPSBtdGFiLT5zaXplIC8gbXRhYi0+Zm1vZGVbZnR5cGVdLnN1YjsKKyAgICBpbnQgc2l6ZSAgPSBtdGFiLT5zaXplOworICAgIGZsb2F0ICpidWYxID0gdGN0eC0+dG1wX2J1ZjsKKyAgICBpbnQgaiwgZmlyc3Rfd3NpemUsIHdzaXplOyAvLyBXaW5kb3cgc2l6ZQorICAgIGZsb2F0ICpvdXQgID0gdGN0eC0+Y3Vycl9mcmFtZSArIDIgKiBjaCAqIG10YWItPnNpemU7CisgICAgZmxvYXQgKm91dDIgPSBvdXQ7CisgICAgZmxvYXQgKnByZXZfYnVmOworICAgIGludCB0eXBlc19zaXplc1tdID0geworICAgICAgICBtdGFiLT5zaXplIC8gIG10YWItPmZtb2RlW1RXSU5WUV9GVF9MT05HXS5zdWIsCisgICAgICAgIG10YWItPnNpemUgLyAgbXRhYi0+Zm1vZGVbVFdJTlZRX0ZUX01FRElVTV0uc3ViLAorICAgICAgICBtdGFiLT5zaXplIC8gKG10YWItPmZtb2RlW1RXSU5WUV9GVF9TSE9SVF0uc3ViICogMiksCisgICAgfTsKKworICAgIHdzaXplICAgICAgID0gdHlwZXNfc2l6ZXNbd3R5cGVfdG9fd3NpemVbd3R5cGVdXTsKKyAgICBmaXJzdF93c2l6ZSA9IHdzaXplOworICAgIHByZXZfYnVmICAgID0gcHJldiArIChzaXplIC0gYnNpemUpIC8gMjsKKworICAgIGZvciAoaiA9IDA7IGogPCBtdGFiLT5mbW9kZVtmdHlwZV0uc3ViOyBqKyspIHsKKyAgICAgICAgaW50IHN1Yl93dHlwZSA9IGZ0eXBlID09IFRXSU5WUV9GVF9NRURJVU0gPyA4IDogd3R5cGU7CisKKyAgICAgICAgaWYgKCFqICYmIHd0eXBlID09IDQpCisgICAgICAgICAgICBzdWJfd3R5cGUgPSA0OworICAgICAgICBlbHNlIGlmIChqID09IG10YWItPmZtb2RlW2Z0eXBlXS5zdWIgLSAxICYmIHd0eXBlID09IDcpCisgICAgICAgICAgICBzdWJfd3R5cGUgPSA3OworCisgICAgICAgIHdzaXplID0gdHlwZXNfc2l6ZXNbd3R5cGVfdG9fd3NpemVbc3ViX3d0eXBlXV07CisKKyAgICAgICAgbWRjdC0+aW1kY3RfaGFsZihtZGN0LCBidWYxICsgYnNpemUgKiBqLCBpbiArIGJzaXplICogaik7CisKKyAgICAgICAgdGN0eC0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KG91dDIsIHByZXZfYnVmICsgKGJzaXplIC0gd3NpemUpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmMSArIGJzaXplICogaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfc2luZV93aW5kb3dzW2F2X2xvZzIod3NpemUpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NpemUgLyAyKTsKKyAgICAgICAgb3V0MiArPSB3c2l6ZTsKKworICAgICAgICBtZW1jcHkob3V0MiwgYnVmMSArIGJzaXplICogaiArIHdzaXplIC8gMiwKKyAgICAgICAgICAgICAgIChic2l6ZSAtIHdzaXplIC8gMikgKiBzaXplb2YoZmxvYXQpKTsKKworICAgICAgICBvdXQyICs9IGZ0eXBlID09IFRXSU5WUV9GVF9NRURJVU0gPyAoYnNpemUgLSB3c2l6ZSkgLyAyIDogYnNpemUgLSB3c2l6ZTsKKworICAgICAgICBwcmV2X2J1ZiA9IGJ1ZjEgKyBic2l6ZSAqIGogKyBic2l6ZSAvIDI7CisgICAgfQorCisgICAgdGN0eC0+bGFzdF9ibG9ja19wb3NbY2hdID0gKHNpemUgKyBmaXJzdF93c2l6ZSkgLyAyOworfQorCitzdGF0aWMgdm9pZCBpbWRjdF9vdXRwdXQoVHdpblZRQ29udGV4dCAqdGN0eCwgZW51bSBUd2luVlFGcmFtZVR5cGUgZnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHd0eXBlLCBmbG9hdCAqKm91dCwgaW50IG9mZnNldCkKK3sKKyAgICBjb25zdCBUd2luVlFNb2RlVGFiICptdGFiID0gdGN0eC0+bXRhYjsKKyAgICBmbG9hdCAqcHJldl9idWYgICAgICAgICAgID0gdGN0eC0+cHJldl9mcmFtZSArIHRjdHgtPmxhc3RfYmxvY2tfcG9zWzBdOworICAgIGludCBzaXplMSwgc2l6ZTIsIGk7CisgICAgZmxvYXQgKm91dDEsICpvdXQyOworCisgICAgZm9yIChpID0gMDsgaSA8IHRjdHgtPmF2Y3R4LT5jaGFubmVsczsgaSsrKQorICAgICAgICBpbWRjdF9hbmRfd2luZG93KHRjdHgsIGZ0eXBlLCB3dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0Y3R4LT5zcGVjdHJ1bSArIGkgKiBtdGFiLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfYnVmICsgMiAqIGkgKiBtdGFiLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworCisgICAgaWYgKCFvdXQpCisgICAgICAgIHJldHVybjsKKworICAgIHNpemUyID0gdGN0eC0+bGFzdF9ibG9ja19wb3NbMF07CisgICAgc2l6ZTEgPSBtdGFiLT5zaXplIC0gc2l6ZTI7CisKKyAgICBvdXQxID0gJm91dFswXVswXSArIG9mZnNldDsKKyAgICBtZW1jcHkob3V0MSwgICAgICAgICBwcmV2X2J1ZiwgICAgICAgICBzaXplMSAqIHNpemVvZigqb3V0MSkpOworICAgIG1lbWNweShvdXQxICsgc2l6ZTEsIHRjdHgtPmN1cnJfZnJhbWUsIHNpemUyICogc2l6ZW9mKCpvdXQxKSk7CisKKyAgICBpZiAodGN0eC0+YXZjdHgtPmNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgb3V0MiA9ICZvdXRbMV1bMF0gKyBvZmZzZXQ7CisgICAgICAgIG1lbWNweShvdXQyLCAmcHJldl9idWZbMiAqIG10YWItPnNpemVdLAorICAgICAgICAgICAgICAgc2l6ZTEgKiBzaXplb2YoKm91dDIpKTsKKyAgICAgICAgbWVtY3B5KG91dDIgKyBzaXplMSwgJnRjdHgtPmN1cnJfZnJhbWVbMiAqIG10YWItPnNpemVdLAorICAgICAgICAgICAgICAgc2l6ZTIgKiBzaXplb2YoKm91dDIpKTsKKyAgICAgICAgdGN0eC0+ZmRzcC0+YnV0dGVyZmxpZXNfZmxvYXQob3V0MSwgb3V0MiwgbXRhYi0+c2l6ZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZWFkX2FuZF9kZWNvZGVfc3BlY3RydW0oVHdpblZRQ29udGV4dCAqdGN0eCwgZmxvYXQgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFR3aW5WUUZyYW1lVHlwZSBmdHlwZSkKK3sKKyAgICBjb25zdCBUd2luVlFNb2RlVGFiICptdGFiID0gdGN0eC0+bXRhYjsKKyAgICBUd2luVlFGcmFtZURhdGEgKmJpdHMgICAgID0gJnRjdHgtPmJpdHNbdGN0eC0+Y3VyX2ZyYW1lXTsKKyAgICBpbnQgY2hhbm5lbHMgICAgICAgICAgICAgID0gdGN0eC0+YXZjdHgtPmNoYW5uZWxzOworICAgIGludCBzdWIgICAgICAgID0gbXRhYi0+Zm1vZGVbZnR5cGVdLnN1YjsKKyAgICBpbnQgYmxvY2tfc2l6ZSA9IG10YWItPnNpemUgLyBzdWI7CisgICAgZmxvYXQgZ2FpbltUV0lOVlFfQ0hBTk5FTFNfTUFYICogVFdJTlZRX1NVQkJMT0NLU19NQVhdOworICAgIGZsb2F0IHBwY19zaGFwZVtUV0lOVlFfUFBDX1NIQVBFX0xFTl9NQVggKiBUV0lOVlFfQ0hBTk5FTFNfTUFYICogNF07CisKKyAgICBpbnQgaSwgajsKKworICAgIGRlcXVhbnQodGN0eCwgYml0cy0+bWFpbl9jb2VmZnMsIG91dCwgZnR5cGUsCisgICAgICAgICAgICBtdGFiLT5mbW9kZVtmdHlwZV0uY2IwLCBtdGFiLT5mbW9kZVtmdHlwZV0uY2IxLAorICAgICAgICAgICAgbXRhYi0+Zm1vZGVbZnR5cGVdLmNiX2xlbl9yZWFkKTsKKworICAgIGRlY19nYWluKHRjdHgsIGZ0eXBlLCBnYWluKTsKKworICAgIGlmIChmdHlwZSA9PSBUV0lOVlFfRlRfTE9ORykgeworICAgICAgICBpbnQgY2JfbGVuX3AgPSAodGN0eC0+bl9kaXZbM10gKyBtdGFiLT5wcGNfc2hhcGVfbGVuICogY2hhbm5lbHMgLSAxKSAvCisgICAgICAgICAgICAgICAgICAgICAgIHRjdHgtPm5fZGl2WzNdOworICAgICAgICBkZXF1YW50KHRjdHgsIGJpdHMtPnBwY19jb2VmZnMsIHBwY19zaGFwZSwKKyAgICAgICAgICAgICAgICBUV0lOVlFfRlRfUFBDLCBtdGFiLT5wcGNfc2hhcGVfY2IsCisgICAgICAgICAgICAgICAgbXRhYi0+cHBjX3NoYXBlX2NiICsgY2JfbGVuX3AgKiBUV0lOVlFfUFBDX1NIQVBFX0NCX1NJWkUsCisgICAgICAgICAgICAgICAgY2JfbGVuX3ApOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgICAgIGZsb2F0ICpjaHVuayA9IG91dCArIG10YWItPnNpemUgKiBpOworICAgICAgICBmbG9hdCBsc3BbVFdJTlZRX0xTUF9DT0VGU19NQVhdOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWI7IGorKykgeworICAgICAgICAgICAgdGN0eC0+ZGVjX2JhcmtfZW52KHRjdHgsIGJpdHMtPmJhcmsxW2ldW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMtPmJhcmtfdXNlX2hpc3RbaV1bal0sIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGN0eC0+dG1wX2J1ZiwgZ2FpbltzdWIgKiBpICsgal0sIGZ0eXBlKTsKKworICAgICAgICAgICAgdGN0eC0+ZmRzcC0+dmVjdG9yX2ZtdWwoY2h1bmsgKyBibG9ja19zaXplICogaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsgKyBibG9ja19zaXplICogaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGN0eC0+dG1wX2J1ZiwgYmxvY2tfc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnR5cGUgPT0gVFdJTlZRX0ZUX0xPTkcpCisgICAgICAgICAgICB0Y3R4LT5kZWNvZGVfcHBjKHRjdHgsIGJpdHMtPnBfY29lZltpXSwgYml0cy0+Z19jb2VmW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcGNfc2hhcGUgKyBpICogbXRhYi0+cHBjX3NoYXBlX2xlbiwgY2h1bmspOworCisgICAgICAgIGRlY29kZV9sc3AodGN0eCwgYml0cy0+bHBjX2lkeDFbaV0sIGJpdHMtPmxwY19pZHgyW2ldLAorICAgICAgICAgICAgICAgICAgIGJpdHMtPmxwY19oaXN0X2lkeFtpXSwgbHNwLCB0Y3R4LT5sc3BfaGlzdFtpXSk7CisKKyAgICAgICAgZGVjX2xwY19zcGVjdHJ1bV9pbnYodGN0eCwgbHNwLCBmdHlwZSwgdGN0eC0+dG1wX2J1Zik7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG10YWItPmZtb2RlW2Z0eXBlXS5zdWI7IGorKykgeworICAgICAgICAgICAgdGN0eC0+ZmRzcC0+dmVjdG9yX2ZtdWwoY2h1bmssIGNodW5rLCB0Y3R4LT50bXBfYnVmLCBibG9ja19zaXplKTsKKyAgICAgICAgICAgIGNodW5rICs9IGJsb2NrX3NpemU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NvbnN0IGVudW0gVHdpblZRRnJhbWVUeXBlIGZmX3R3aW52cV93dHlwZV90b19mdHlwZV90YWJsZVtdID0geworICAgIFRXSU5WUV9GVF9MT05HLCAgIFRXSU5WUV9GVF9MT05HLCBUV0lOVlFfRlRfU0hPUlQsIFRXSU5WUV9GVF9MT05HLAorICAgIFRXSU5WUV9GVF9NRURJVU0sIFRXSU5WUV9GVF9MT05HLCBUV0lOVlFfRlRfTE9ORywgIFRXSU5WUV9GVF9NRURJVU0sCisgICAgVFdJTlZRX0ZUX01FRElVTQorfTsKKworaW50IGZmX3R3aW52cV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBUd2luVlFDb250ZXh0ICp0Y3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBUd2luVlFNb2RlVGFiICptdGFiID0gdGN0eC0+bXRhYjsKKyAgICBmbG9hdCAqKm91dCA9IE5VTEw7CisgICAgaW50IHJldDsKKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgaWYgKHRjdHgtPmRpc2NhcmRlZF9wYWNrZXRzID49IDIpIHsKKyAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBtdGFiLT5zaXplICogdGN0eC0+ZnJhbWVzX3Blcl9wYWNrZXQ7CisgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBvdXQgPSAoZmxvYXQgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGE7CisgICAgfQorCisgICAgaWYgKGJ1Zl9zaXplIDwgYXZjdHgtPmJsb2NrX2FsaWduKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkZyYW1lIHRvbyBzbWFsbCAoJWQgYnl0ZXMpLiBUcnVuY2F0ZWQgZmlsZT9cbiIsIGJ1Zl9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHRjdHgtPnJlYWRfYml0c3RyZWFtKGF2Y3R4LCB0Y3R4LCBidWYsIGJ1Zl9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yICh0Y3R4LT5jdXJfZnJhbWUgPSAwOyB0Y3R4LT5jdXJfZnJhbWUgPCB0Y3R4LT5mcmFtZXNfcGVyX3BhY2tldDsKKyAgICAgICAgIHRjdHgtPmN1cl9mcmFtZSsrKSB7CisgICAgICAgIHJlYWRfYW5kX2RlY29kZV9zcGVjdHJ1bSh0Y3R4LCB0Y3R4LT5zcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjdHgtPmJpdHNbdGN0eC0+Y3VyX2ZyYW1lXS5mdHlwZSk7CisKKyAgICAgICAgaW1kY3Rfb3V0cHV0KHRjdHgsIHRjdHgtPmJpdHNbdGN0eC0+Y3VyX2ZyYW1lXS5mdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHRjdHgtPmJpdHNbdGN0eC0+Y3VyX2ZyYW1lXS53aW5kb3dfdHlwZSwgb3V0LAorICAgICAgICAgICAgICAgICAgICAgdGN0eC0+Y3VyX2ZyYW1lICogbXRhYi0+c2l6ZSk7CisKKyAgICAgICAgRkZTV0FQKGZsb2F0ICosIHRjdHgtPmN1cnJfZnJhbWUsIHRjdHgtPnByZXZfZnJhbWUpOworICAgIH0KKworICAgIGlmICh0Y3R4LT5kaXNjYXJkZWRfcGFja2V0cyA8IDIpIHsKKyAgICAgICAgdGN0eC0+ZGlzY2FyZGVkX3BhY2tldHMrKzsKKyAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgLy8gVlFGIGNhbiBkZWxpdmVyIHBhY2tldHMgMSBieXRlIGdyZWF0ZXIgdGhhbiBibG9jayBhbGlnbgorICAgIGlmIChidWZfc2l6ZSA9PSBhdmN0eC0+YmxvY2tfYWxpZ24gKyAxKQorICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgcmV0dXJuIGF2Y3R4LT5ibG9ja19hbGlnbjsKK30KKworLyoqCisgKiBJbml0IElNRENUIGFuZCB3aW5kb3dpbmcgdGFibGVzCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBpbml0X21kY3Rfd2luKFR3aW5WUUNvbnRleHQgKnRjdHgpCit7CisgICAgaW50IGksIGosIHJldDsKKyAgICBjb25zdCBUd2luVlFNb2RlVGFiICptdGFiID0gdGN0eC0+bXRhYjsKKyAgICBpbnQgc2l6ZV9zID0gbXRhYi0+c2l6ZSAvIG10YWItPmZtb2RlW1RXSU5WUV9GVF9TSE9SVF0uc3ViOworICAgIGludCBzaXplX20gPSBtdGFiLT5zaXplIC8gbXRhYi0+Zm1vZGVbVFdJTlZRX0ZUX01FRElVTV0uc3ViOworICAgIGludCBjaGFubmVscyA9IHRjdHgtPmF2Y3R4LT5jaGFubmVsczsKKyAgICBmbG9hdCBub3JtID0gY2hhbm5lbHMgPT0gMSA/IDIuMCA6IDEuMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaW50IGJzaXplID0gdGN0eC0+bXRhYi0+c2l6ZSAvIHRjdHgtPm10YWItPmZtb2RlW2ldLnN1YjsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9tZGN0X2luaXQoJnRjdHgtPm1kY3RfY3R4W2ldLCBhdl9sb2cyKGJzaXplKSArIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zcXJ0KG5vcm0gLyBic2l6ZSkgLyAoMSA8PCAxNSkpKSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgRkZfQUxMT0NfQVJSQVlfT1JfR09UTyh0Y3R4LT5hdmN0eCwgdGN0eC0+dG1wX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIG10YWItPnNpemUsIHNpemVvZigqdGN0eC0+dG1wX2J1ZiksIGFsbG9jX2ZhaWwpOworCisgICAgRkZfQUxMT0NfQVJSQVlfT1JfR09UTyh0Y3R4LT5hdmN0eCwgdGN0eC0+c3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAyICogbXRhYi0+c2l6ZSwgY2hhbm5lbHMgKiBzaXplb2YoKnRjdHgtPnNwZWN0cnVtKSwKKyAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2ZhaWwpOworICAgIEZGX0FMTE9DX0FSUkFZX09SX0dPVE8odGN0eC0+YXZjdHgsIHRjdHgtPmN1cnJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAyICogbXRhYi0+c2l6ZSwgY2hhbm5lbHMgKiBzaXplb2YoKnRjdHgtPmN1cnJfZnJhbWUpLAorICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZmFpbCk7CisgICAgRkZfQUxMT0NfQVJSQVlfT1JfR09UTyh0Y3R4LT5hdmN0eCwgdGN0eC0+cHJldl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIDIgKiBtdGFiLT5zaXplLCBjaGFubmVscyAqIHNpemVvZigqdGN0eC0+cHJldl9mcmFtZSksCisgICAgICAgICAgICAgICAgICAgICBhbGxvY19mYWlsKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaW50IG0gICAgICAgPSA0ICogbXRhYi0+c2l6ZSAvIG10YWItPmZtb2RlW2ldLnN1YjsKKyAgICAgICAgZG91YmxlIGZyZXEgPSAyICogTV9QSSAvIG07CisgICAgICAgIEZGX0FMTE9DX0FSUkFZX09SX0dPVE8odGN0eC0+YXZjdHgsIHRjdHgtPmNvc190YWJzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgIChtIC8gNCksIHNpemVvZigqdGN0eC0+Y29zX3RhYnNbaV0pLCBhbGxvY19mYWlsKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDw9IG0gLyA4OyBqKyspCisgICAgICAgICAgICB0Y3R4LT5jb3NfdGFic1tpXVtqXSA9IGNvcygoMiAqIGogKyAxKSAqIGZyZXEpOworICAgICAgICBmb3IgKGogPSAxOyBqIDwgbSAvIDg7IGorKykKKyAgICAgICAgICAgIHRjdHgtPmNvc190YWJzW2ldW20gLyA0IC0gal0gPSB0Y3R4LT5jb3NfdGFic1tpXVtqXTsKKyAgICB9CisKKyAgICBmZl9pbml0X2ZmX3NpbmVfd2luZG93cyhhdl9sb2cyKHNpemVfbSkpOworICAgIGZmX2luaXRfZmZfc2luZV93aW5kb3dzKGF2X2xvZzIoc2l6ZV9zIC8gMikpOworICAgIGZmX2luaXRfZmZfc2luZV93aW5kb3dzKGF2X2xvZzIobXRhYi0+c2l6ZSkpOworCisgICAgcmV0dXJuIDA7CisKK2FsbG9jX2ZhaWw6CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworLyoqCisgKiBJbnRlcnByZXQgdGhlIGRhdGEgYXMgaWYgaXQgd2VyZSBhIG51bV9ibG9ja3MgeCBsaW5lX2xlblswXSBtYXRyaXggYW5kIGZvcgorICogZWFjaCBsaW5lIGRvIGEgY3ljbGljIHBlcm11dGF0aW9uLCBpLmUuCisgKiBhYmNkZWZnaGlqa2xtIC0+IGRlZmdoaWprbG1hYmMKKyAqIHdoZXJlIHRoZSBhbW91bnQgdG8gYmUgc2hpZnRlZCBpcyBldmFsdWF0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjb2x1bW4uCisgKi8KK3N0YXRpYyB2b2lkIHBlcm11dGF0ZV9pbl9saW5lKGludDE2X3QgKnRhYiwgaW50IG51bV92ZWN0LCBpbnQgbnVtX2Jsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBsaW5lX2xlblsyXSwgaW50IGxlbmd0aF9kaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFR3aW5WUUZyYW1lVHlwZSBmdHlwZSkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lX2xlblswXTsgaSsrKSB7CisgICAgICAgIGludCBzaGlmdDsKKworICAgICAgICBpZiAobnVtX2Jsb2NrcyA9PSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIChmdHlwZSA9PSBUV0lOVlFfRlRfTE9ORyAmJiBudW1fdmVjdCAlIG51bV9ibG9ja3MpIHx8CisgICAgICAgICAgICAoZnR5cGUgIT0gVFdJTlZRX0ZUX0xPTkcgJiYgbnVtX3ZlY3QgJiAxKSAgICAgICAgICB8fAorICAgICAgICAgICAgaSA9PSBsaW5lX2xlblsxXSkgeworICAgICAgICAgICAgc2hpZnQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKGZ0eXBlID09IFRXSU5WUV9GVF9MT05HKSB7CisgICAgICAgICAgICBzaGlmdCA9IGk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgc2hpZnQgPSBpICogaTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3ZlY3QgJiYgKGogKyBudW1fdmVjdCAqIGkgPCBibG9ja19zaXplICogbnVtX2Jsb2Nrcyk7IGorKykKKyAgICAgICAgICAgIHRhYltpICogbnVtX3ZlY3QgKyBqXSA9IGkgKiBudW1fdmVjdCArIChqICsgc2hpZnQpICUgbnVtX3ZlY3Q7CisgICAgfQorfQorCisvKioKKyAqIEludGVycHJldCB0aGUgaW5wdXQgZGF0YSBhcyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorICoKKyAqIEB2ZXJiYXRpbQorICoKKyAqIGFiY2RlZmdoCisgKiBpamtsbW5vcAorICogcXJzdHV2dworICogeDEyMzQ1NgorICoKKyAqIEBlbmR2ZXJiYXRpbQorICoKKyAqIGFuZCB0cmFuc3Bvc2UgaXQsIGdpdmluZyB0aGUgb3V0cHV0CisgKiBhaXF4YmpyMWNrczJkbHQzZW11NGZ2bjVnb3c2aHAKKyAqLworc3RhdGljIHZvaWQgdHJhbnNwb3NlX3Blcm0oaW50MTZfdCAqb3V0LCBpbnQxNl90ICppbiwgaW50IG51bV92ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBsaW5lX2xlblsyXSwgaW50IGxlbmd0aF9kaXYpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IGNvbnQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV92ZWN0OyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsaW5lX2xlbltpID49IGxlbmd0aF9kaXZdOyBqKyspCisgICAgICAgICAgICBvdXRbY29udCsrXSA9IGluW2ogKiBudW1fdmVjdCArIGldOworfQorCitzdGF0aWMgdm9pZCBsaW5lYXJfcGVybShpbnQxNl90ICpvdXQsIGludDE2X3QgKmluLCBpbnQgbl9ibG9ja3MsIGludCBzaXplKQoreworICAgIGludCBibG9ja19zaXplID0gc2l6ZSAvIG5fYmxvY2tzOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgb3V0W2ldID0gYmxvY2tfc2l6ZSAqIChpbltpXSAlIG5fYmxvY2tzKSArIGluW2ldIC8gbl9ibG9ja3M7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgY29uc3RydWN0X3Blcm1fdGFibGUoVHdpblZRQ29udGV4dCAqdGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBUd2luVlFGcmFtZVR5cGUgZnR5cGUpCit7CisgICAgaW50IGJsb2NrX3NpemUsIHNpemU7CisgICAgY29uc3QgVHdpblZRTW9kZVRhYiAqbXRhYiA9IHRjdHgtPm10YWI7CisgICAgaW50MTZfdCAqdG1wX3Blcm0gPSAoaW50MTZfdCAqKXRjdHgtPnRtcF9idWY7CisKKyAgICBpZiAoZnR5cGUgPT0gVFdJTlZRX0ZUX1BQQykgeworICAgICAgICBzaXplICAgICAgID0gdGN0eC0+YXZjdHgtPmNoYW5uZWxzOworICAgICAgICBibG9ja19zaXplID0gbXRhYi0+cHBjX3NoYXBlX2xlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplICAgICAgID0gdGN0eC0+YXZjdHgtPmNoYW5uZWxzICogbXRhYi0+Zm1vZGVbZnR5cGVdLnN1YjsKKyAgICAgICAgYmxvY2tfc2l6ZSA9IG10YWItPnNpemUgLyBtdGFiLT5mbW9kZVtmdHlwZV0uc3ViOworICAgIH0KKworICAgIHBlcm11dGF0ZV9pbl9saW5lKHRtcF9wZXJtLCB0Y3R4LT5uX2RpdltmdHlwZV0sIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2l6ZSwgdGN0eC0+bGVuZ3RoW2Z0eXBlXSwKKyAgICAgICAgICAgICAgICAgICAgICB0Y3R4LT5sZW5ndGhfY2hhbmdlW2Z0eXBlXSwgZnR5cGUpOworCisgICAgdHJhbnNwb3NlX3Blcm0odGN0eC0+cGVybXV0W2Z0eXBlXSwgdG1wX3Blcm0sIHRjdHgtPm5fZGl2W2Z0eXBlXSwKKyAgICAgICAgICAgICAgICAgICB0Y3R4LT5sZW5ndGhbZnR5cGVdLCB0Y3R4LT5sZW5ndGhfY2hhbmdlW2Z0eXBlXSk7CisKKyAgICBsaW5lYXJfcGVybSh0Y3R4LT5wZXJtdXRbZnR5cGVdLCB0Y3R4LT5wZXJtdXRbZnR5cGVdLCBzaXplLAorICAgICAgICAgICAgICAgIHNpemUgKiBibG9ja19zaXplKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X2JpdHN0cmVhbV9wYXJhbXMoVHdpblZRQ29udGV4dCAqdGN0eCkKK3sKKyAgICBjb25zdCBUd2luVlFNb2RlVGFiICptdGFiID0gdGN0eC0+bXRhYjsKKyAgICBpbnQgbl9jaCAgICAgICAgICAgICAgICAgID0gdGN0eC0+YXZjdHgtPmNoYW5uZWxzOworICAgIGludCB0b3RhbF9mcl9iaXRzICAgICAgICAgPSB0Y3R4LT5hdmN0eC0+Yml0X3JhdGUgKiBtdGFiLT5zaXplIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGN0eC0+YXZjdHgtPnNhbXBsZV9yYXRlOworCisgICAgaW50IGxzcF9iaXRzX3Blcl9ibG9jayA9IG5fY2ggKiAobXRhYi0+bHNwX2JpdDAgKyBtdGFiLT5sc3BfYml0MSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRhYi0+bHNwX3NwbGl0ICogbXRhYi0+bHNwX2JpdDIpOworCisgICAgaW50IHBwY19iaXRzID0gbl9jaCAqIChtdGFiLT5wZ2Fpbl9iaXQgKyBtdGFiLT5wcGNfc2hhcGVfYml0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG10YWItPnBwY19wZXJpb2RfYml0KTsKKworICAgIGludCBic2l6ZV9ub19tYWluX2NiWzNdLCBic2VfYml0c1szXSwgaTsKKyAgICBlbnVtIFR3aW5WUUZyYW1lVHlwZSBmcmFtZXR5cGU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAvLyArMSBmb3IgaGlzdG9yeSB1c2FnZSBzd2l0Y2gKKyAgICAgICAgYnNlX2JpdHNbaV0gPSBuX2NoICoKKyAgICAgICAgICAgICAgICAgICAgICAobXRhYi0+Zm1vZGVbaV0uYmFya19uX2NvZWYgKgorICAgICAgICAgICAgICAgICAgICAgICBtdGFiLT5mbW9kZVtpXS5iYXJrX25fYml0ICsgMSk7CisKKyAgICBic2l6ZV9ub19tYWluX2NiWzJdID0gYnNlX2JpdHNbMl0gKyBsc3BfYml0c19wZXJfYmxvY2sgKyBwcGNfYml0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRXSU5WUV9XSU5ET1dfVFlQRV9CSVRTICsgbl9jaCAqIFRXSU5WUV9HQUlOX0JJVFM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICBic2l6ZV9ub19tYWluX2NiW2ldID0KKyAgICAgICAgICAgIGxzcF9iaXRzX3Blcl9ibG9jayArIG5fY2ggKiBUV0lOVlFfR0FJTl9CSVRTICsKKyAgICAgICAgICAgIFRXSU5WUV9XSU5ET1dfVFlQRV9CSVRTICsKKyAgICAgICAgICAgIG10YWItPmZtb2RlW2ldLnN1YiAqIChic2VfYml0c1tpXSArIG5fY2ggKiBUV0lOVlFfU1VCX0dBSU5fQklUUyk7CisKKyAgICBpZiAodGN0eC0+Y29kZWMgPT0gVFdJTlZRX0NPREVDX01FVEFTT1VORCAmJiAhdGN0eC0+aXNfNmticHMpIHsKKyAgICAgICAgYnNpemVfbm9fbWFpbl9jYlsxXSArPSAyOworICAgICAgICBic2l6ZV9ub19tYWluX2NiWzJdICs9IDI7CisgICAgfQorCisgICAgLy8gVGhlIHJlbWFpbmluZyBiaXRzIGFyZSBhbGwgdXNlZCBmb3IgdGhlIG1haW4gc3BlY3RydW0gY29lZmZpY2llbnRzCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpbnQgYml0X3NpemUsIHZlY3Rfc2l6ZTsKKyAgICAgICAgaW50IHJvdW5kZWRfdXAsIHJvdW5kZWRfZG93biwgbnVtX3JvdW5kZWRfZG93biwgbnVtX3JvdW5kZWRfdXA7CisgICAgICAgIGlmIChpID09IDMpIHsKKyAgICAgICAgICAgIGJpdF9zaXplICA9IG5fY2ggKiBtdGFiLT5wcGNfc2hhcGVfYml0OworICAgICAgICAgICAgdmVjdF9zaXplID0gbl9jaCAqIG10YWItPnBwY19zaGFwZV9sZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiaXRfc2l6ZSAgPSB0b3RhbF9mcl9iaXRzIC0gYnNpemVfbm9fbWFpbl9jYltpXTsKKyAgICAgICAgICAgIHZlY3Rfc2l6ZSA9IG5fY2ggKiBtdGFiLT5zaXplOworICAgICAgICB9CisKKyAgICAgICAgdGN0eC0+bl9kaXZbaV0gPSAoYml0X3NpemUgKyAxMykgLyAxNDsKKworICAgICAgICByb3VuZGVkX3VwICAgICAgICAgICAgICAgICAgICAgPSAoYml0X3NpemUgKyB0Y3R4LT5uX2RpdltpXSAtIDEpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGN0eC0+bl9kaXZbaV07CisgICAgICAgIHJvdW5kZWRfZG93biAgICAgICAgICAgICAgICAgICA9IChiaXRfc2l6ZSkgLyB0Y3R4LT5uX2RpdltpXTsKKyAgICAgICAgbnVtX3JvdW5kZWRfZG93biAgICAgICAgICAgICAgID0gcm91bmRlZF91cCAqIHRjdHgtPm5fZGl2W2ldIC0gYml0X3NpemU7CisgICAgICAgIG51bV9yb3VuZGVkX3VwICAgICAgICAgICAgICAgICA9IHRjdHgtPm5fZGl2W2ldIC0gbnVtX3JvdW5kZWRfZG93bjsKKyAgICAgICAgdGN0eC0+Yml0c19tYWluX3NwZWNbMF1baV1bMF0gID0gKHJvdW5kZWRfdXAgKyAxKSAgIC8gMjsKKyAgICAgICAgdGN0eC0+Yml0c19tYWluX3NwZWNbMV1baV1bMF0gID0gIHJvdW5kZWRfdXAgICAgICAgIC8gMjsKKyAgICAgICAgdGN0eC0+Yml0c19tYWluX3NwZWNbMF1baV1bMV0gID0gKHJvdW5kZWRfZG93biArIDEpIC8gMjsKKyAgICAgICAgdGN0eC0+Yml0c19tYWluX3NwZWNbMV1baV1bMV0gID0gIHJvdW5kZWRfZG93biAgICAgIC8gMjsKKyAgICAgICAgdGN0eC0+Yml0c19tYWluX3NwZWNfY2hhbmdlW2ldID0gbnVtX3JvdW5kZWRfdXA7CisKKyAgICAgICAgcm91bmRlZF91cCAgICAgICAgICAgICA9ICh2ZWN0X3NpemUgKyB0Y3R4LT5uX2RpdltpXSAtIDEpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjdHgtPm5fZGl2W2ldOworICAgICAgICByb3VuZGVkX2Rvd24gICAgICAgICAgID0gKHZlY3Rfc2l6ZSkgLyB0Y3R4LT5uX2RpdltpXTsKKyAgICAgICAgbnVtX3JvdW5kZWRfZG93biAgICAgICA9IHJvdW5kZWRfdXAgKiB0Y3R4LT5uX2RpdltpXSAtIHZlY3Rfc2l6ZTsKKyAgICAgICAgbnVtX3JvdW5kZWRfdXAgICAgICAgICA9IHRjdHgtPm5fZGl2W2ldIC0gbnVtX3JvdW5kZWRfZG93bjsKKyAgICAgICAgdGN0eC0+bGVuZ3RoW2ldWzBdICAgICA9IHJvdW5kZWRfdXA7CisgICAgICAgIHRjdHgtPmxlbmd0aFtpXVsxXSAgICAgPSByb3VuZGVkX2Rvd247CisgICAgICAgIHRjdHgtPmxlbmd0aF9jaGFuZ2VbaV0gPSBudW1fcm91bmRlZF91cDsKKyAgICB9CisKKyAgICBmb3IgKGZyYW1ldHlwZSA9IFRXSU5WUV9GVF9TSE9SVDsgZnJhbWV0eXBlIDw9IFRXSU5WUV9GVF9QUEM7IGZyYW1ldHlwZSsrKQorICAgICAgICBjb25zdHJ1Y3RfcGVybV90YWJsZSh0Y3R4LCBmcmFtZXR5cGUpOworfQorCithdl9jb2xkIGludCBmZl90d2ludnFfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBUd2luVlFDb250ZXh0ICp0Y3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgZmZfbWRjdF9lbmQoJnRjdHgtPm1kY3RfY3R4W2ldKTsKKyAgICAgICAgYXZfZnJlZXAoJnRjdHgtPmNvc190YWJzW2ldKTsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmdGN0eC0+Y3Vycl9mcmFtZSk7CisgICAgYXZfZnJlZXAoJnRjdHgtPnNwZWN0cnVtKTsKKyAgICBhdl9mcmVlcCgmdGN0eC0+cHJldl9mcmFtZSk7CisgICAgYXZfZnJlZXAoJnRjdHgtPnRtcF9idWYpOworICAgIGF2X2ZyZWVwKCZ0Y3R4LT5mZHNwKTsKKworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIGludCBmZl90d2ludnFfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCByZXQ7CisgICAgVHdpblZRQ29udGV4dCAqdGN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICB0Y3R4LT5hdmN0eCAgICAgICA9IGF2Y3R4OworICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9GTFRQOworCisgICAgaWYgKCFhdmN0eC0+YmxvY2tfYWxpZ24pIHsKKyAgICAgICAgYXZjdHgtPmJsb2NrX2FsaWduID0gdGN0eC0+ZnJhbWVfc2l6ZSArIDcgPj4gMzsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5ibG9ja19hbGlnbiAqIDggPCB0Y3R4LT5mcmFtZV9zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQmxvY2sgYWxpZ24gaXMgJWQgYml0cywgZXhwZWN0ZWQgJWRcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+YmxvY2tfYWxpZ24gKiA4LCB0Y3R4LT5mcmFtZV9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHRjdHgtPmZyYW1lc19wZXJfcGFja2V0ID0gYXZjdHgtPmJsb2NrX2FsaWduICogOCAvIHRjdHgtPmZyYW1lX3NpemU7CisgICAgaWYgKHRjdHgtPmZyYW1lc19wZXJfcGFja2V0ID4gVFdJTlZRX01BWF9GUkFNRVNfUEVSX1BBQ0tFVCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IGZyYW1lcyBwZXIgcGFja2V0ICglZClcbiIsCisgICAgICAgICAgICAgICB0Y3R4LT5mcmFtZXNfcGVyX3BhY2tldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHRjdHgtPmZkc3AgPSBhdnByaXZfZmxvYXRfZHNwX2FsbG9jKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpOworICAgIGlmICghdGN0eC0+ZmRzcCkgeworICAgICAgICBmZl90d2ludnFfZGVjb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgaWYgKChyZXQgPSBpbml0X21kY3Rfd2luKHRjdHgpKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyBNRENUXG4iKTsKKyAgICAgICAgZmZfdHdpbnZxX2RlY29kZV9jbG9zZShhdmN0eCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGluaXRfYml0c3RyZWFtX3BhcmFtcyh0Y3R4KTsKKworICAgIHR3aW52cV9tZW1zZXRfZmxvYXQodGN0eC0+YmFya19oaXN0WzBdWzBdLCAwLjEsCisgICAgICAgICAgICAgICAgICAgICAgICBGRl9BUlJBWV9FTEVNUyh0Y3R4LT5iYXJrX2hpc3QpKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdHdpbnZxLmggYi9mZm1wZWcvbGliYXZjb2RlYy90d2ludnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTBmNTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHdpbnZxLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBUd2luVlEgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IFZpdG9yIFNlc3NhaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVFdJTlZRX0gKKyNkZWZpbmUgQVZDT0RFQ19UV0lOVlFfSAorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZmZ0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZW51bSBUd2luVlFDb2RlYyB7CisgICAgVFdJTlZRX0NPREVDX1ZRRiwKKyAgICBUV0lOVlFfQ09ERUNfTUVUQVNPVU5ELAorfTsKKworZW51bSBUd2luVlFGcmFtZVR5cGUgeworICAgIFRXSU5WUV9GVF9TSE9SVCA9IDAsICAvLy88IFNob3J0IGZyYW1lICAoZGl2aWRlZCBpbiBuICAgc3ViLWJsb2NrcykKKyAgICBUV0lOVlFfRlRfTUVESVVNLCAgICAgLy8vPCBNZWRpdW0gZnJhbWUgKGRpdmlkZWQgaW4gbTxuIHN1Yi1ibG9ja3MpCisgICAgVFdJTlZRX0ZUX0xPTkcsICAgICAgIC8vLzwgTG9uZyBmcmFtZSAgIChzaW5nbGUgc3ViLWJsb2NrICsgUFBDKQorICAgIFRXSU5WUV9GVF9QUEMsICAgICAgICAvLy88IFBlcmlvZGljIFBlYWsgQ29tcG9uZW50IChwYXJ0IG9mIHRoZSBsb25nIGZyYW1lKQorfTsKKworI2RlZmluZSBUV0lOVlFfUFBDX1NIQVBFX0NCX1NJWkUgNjQKKyNkZWZpbmUgVFdJTlZRX1BQQ19TSEFQRV9MRU5fTUFYIDYwCisjZGVmaW5lIFRXSU5WUV9TVUJfQU1QX01BWCAgICAgICA0NTAwLjAKKyNkZWZpbmUgVFdJTlZRX01VTEFXX01VICAgICAgICAgIDEwMC4wCisjZGVmaW5lIFRXSU5WUV9HQUlOX0JJVFMgICAgICAgICA4CisjZGVmaW5lIFRXSU5WUV9BTVBfTUFYICAgICAgICAgICAxMzAwMC4wCisjZGVmaW5lIFRXSU5WUV9TVUJfR0FJTl9CSVRTICAgICA1CisjZGVmaW5lIFRXSU5WUV9XSU5ET1dfVFlQRV9CSVRTICA0CisjZGVmaW5lIFRXSU5WUV9QR0FJTl9NVSAgICAgICAgICAyMDAKKyNkZWZpbmUgVFdJTlZRX0xTUF9DT0VGU19NQVggICAgIDIwCisjZGVmaW5lIFRXSU5WUV9MU1BfU1BMSVRfTUFYICAgICA0CisjZGVmaW5lIFRXSU5WUV9DSEFOTkVMU19NQVggICAgICAyCisjZGVmaW5lIFRXSU5WUV9TVUJCTE9DS1NfTUFYICAgICAxNgorI2RlZmluZSBUV0lOVlFfQkFSS19OX0NPRUZfTUFYICAgNAorCisjZGVmaW5lIFRXSU5WUV9NQVhfRlJBTUVTX1BFUl9QQUNLRVQgMgorCisvKioKKyAqIFBhcmFtZXRlcnMgYW5kIHRhYmxlcyB0aGF0IGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggZnJhbWUgdHlwZQorICovCitzdHJ1Y3QgVHdpblZRRnJhbWVNb2RlIHsKKyAgICB1aW50OF90ICAgICAgICAgc3ViOyAgICAgIC8vLzwgTnVtYmVyIHN1YmJsb2NrcyBpbiBlYWNoIGZyYW1lCisgICAgY29uc3QgdWludDE2X3QgKmJhcmtfdGFiOworCisgICAgLyoqIG51bWJlciBvZiBkaXN0aW5jdCBiYXJrIHNjYWxlIGVudmVsb3BlIHZhbHVlcyAqLworICAgIHVpbnQ4X3QgICAgICAgICBiYXJrX2Vudl9zaXplOworCisgICAgY29uc3QgaW50MTZfdCAgKmJhcmtfY2I7ICAgIC8vLzwgY29kZWJvb2sgZm9yIHRoZSBiYXJrIHNjYWxlIGVudmVsb3BlIChCU0UpCisgICAgdWludDhfdCAgICAgICAgIGJhcmtfbl9jb2VmOy8vLzwgbnVtYmVyIG9mIEJTRSBDQiBjb2VmZmljaWVudHMgdG8gcmVhZAorICAgIHVpbnQ4X3QgICAgICAgICBiYXJrX25fYml0OyAvLy88IG51bWJlciBvZiBiaXRzIG9mIHRoZSBCU0UgY29lZnMKKworICAgIC8vQHsKKyAgICAvKiogbWFpbiBjb2RlYm9va3MgZm9yIHNwZWN0cnVtIGRhdGEgKi8KKyAgICBjb25zdCBpbnQxNl90ICAgICpjYjA7CisgICAgY29uc3QgaW50MTZfdCAgICAqY2IxOworICAgIC8vQH0KKworICAgIHVpbnQ4X3QgICAgICAgICBjYl9sZW5fcmVhZDsgLy8vPCBudW1iZXIgb2Ygc3BlY3RydW0gY29lZmZpY2llbnRzIHRvIHJlYWQKK307CisKK3R5cGVkZWYgc3RydWN0IFR3aW5WUUZyYW1lRGF0YSB7CisgICAgaW50ICAgICB3aW5kb3dfdHlwZTsKKyAgICBlbnVtIFR3aW5WUUZyYW1lVHlwZSBmdHlwZTsKKworICAgIHVpbnQ4X3QgbWFpbl9jb2VmZnNbMTAyNF07CisgICAgdWludDhfdCBwcGNfY29lZmZzW1RXSU5WUV9QUENfU0hBUEVfTEVOX01BWF07CisKKyAgICB1aW50OF90IGdhaW5fYml0c1tUV0lOVlFfQ0hBTk5FTFNfTUFYXTsKKyAgICB1aW50OF90IHN1Yl9nYWluX2JpdHNbVFdJTlZRX0NIQU5ORUxTX01BWCAqIFRXSU5WUV9TVUJCTE9DS1NfTUFYXTsKKworICAgIHVpbnQ4X3QgYmFyazFbVFdJTlZRX0NIQU5ORUxTX01BWF1bVFdJTlZRX1NVQkJMT0NLU19NQVhdW1RXSU5WUV9CQVJLX05fQ09FRl9NQVhdOworICAgIHVpbnQ4X3QgYmFya191c2VfaGlzdFtUV0lOVlFfQ0hBTk5FTFNfTUFYXVtUV0lOVlFfU1VCQkxPQ0tTX01BWF07CisKKyAgICB1aW50OF90IGxwY19pZHgxW1RXSU5WUV9DSEFOTkVMU19NQVhdOworICAgIHVpbnQ4X3QgbHBjX2lkeDJbVFdJTlZRX0NIQU5ORUxTX01BWF1bVFdJTlZRX0xTUF9TUExJVF9NQVhdOworICAgIHVpbnQ4X3QgbHBjX2hpc3RfaWR4W1RXSU5WUV9DSEFOTkVMU19NQVhdOworCisgICAgaW50ICAgICBwX2NvZWZbVFdJTlZRX0NIQU5ORUxTX01BWF07CisgICAgaW50ICAgICBnX2NvZWZbVFdJTlZRX0NIQU5ORUxTX01BWF07Cit9IFR3aW5WUUZyYW1lRGF0YTsKKworLyoqCisgKiBQYXJhbWV0ZXJzIGFuZCB0YWJsZXMgdGhhdCBhcmUgZGlmZmVyZW50IGZvciBldmVyeSBjb21iaW5hdGlvbiBvZgorICogYml0cmF0ZS9zYW1wbGUgcmF0ZQorICovCit0eXBlZGVmIHN0cnVjdCBUd2luVlFNb2RlVGFiIHsKKyAgICBzdHJ1Y3QgVHdpblZRRnJhbWVNb2RlIGZtb2RlWzNdOyAvLy88IGZyYW1lIHR5cGUtZGVwZW5kYW50IHBhcmFtZXRlcnMKKworICAgIHVpbnQxNl90ICAgICBzaXplOyAgICAgICAgLy8vPCBmcmFtZSBzaXplIGluIHNhbXBsZXMKKyAgICB1aW50OF90ICAgICAgbl9sc3A7ICAgICAgIC8vLzwgbnVtYmVyIG9mIGxzcCBjb2VmZmljaWVudHMKKyAgICBjb25zdCBmbG9hdCAqbHNwY29kZWJvb2s7CisKKyAgICAvKiBudW1iZXIgb2YgYml0cyBvZiB0aGUgZGlmZmVyZW50IExTUCBDQiBjb2VmZmljaWVudHMgKi8KKyAgICB1aW50OF90ICAgICAgbHNwX2JpdDA7CisgICAgdWludDhfdCAgICAgIGxzcF9iaXQxOworICAgIHVpbnQ4X3QgICAgICBsc3BfYml0MjsKKworICAgIHVpbnQ4X3QgICAgICBsc3Bfc3BsaXQ7ICAgICAgLy8vPCBudW1iZXIgb2YgQ0IgZW50cmllcyBmb3IgdGhlIExTUCBkZWNvZGluZworICAgIGNvbnN0IGludDE2X3QgKnBwY19zaGFwZV9jYjsgLy8vPCBQUEMgc2hhcGUgQ0IKKworICAgIC8qKiBudW1iZXIgb2YgdGhlIGJpdHMgZm9yIHRoZSBQUEMgcGVyaW9kIHZhbHVlICovCisgICAgdWludDhfdCAgICAgIHBwY19wZXJpb2RfYml0OworCisgICAgdWludDhfdCAgICAgIHBwY19zaGFwZV9iaXQ7ICAvLy88IG51bWJlciBvZiBiaXRzIG9mIHRoZSBQUEMgc2hhcGUgQ0IgY29lZmZzCisgICAgdWludDhfdCAgICAgIHBwY19zaGFwZV9sZW47ICAvLy88IHNpemUgb2YgUFBDIHNoYXBlIENCCisgICAgdWludDhfdCAgICAgIHBnYWluX2JpdDsgICAgICAvLy88IGJpdHMgZm9yIFBQQyBnYWluCisKKyAgICAvKiogY29uc3RhbnQgZm9yIHBlYWsgcGVyaW9kIHRvIHBlYWsgd2lkdGggY29udmVyc2lvbiAqLworICAgIHVpbnQxNl90ICAgICBwZWFrX3BlcjJ3aWQ7Cit9IFR3aW5WUU1vZGVUYWI7CisKK3R5cGVkZWYgc3RydWN0IFR3aW5WUUNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcDsKKyAgICBGRlRDb250ZXh0IG1kY3RfY3R4WzNdOworCisgICAgY29uc3QgVHdpblZRTW9kZVRhYiAqbXRhYjsKKworICAgIGludCBpc182a2JwczsKKworICAgIC8vIGhpc3RvcnkKKyAgICBmbG9hdCBsc3BfaGlzdFsyXVsyMF07ICAgICAgICAgICAvLy88IExTUCBjb2VmZmljaWVudHMgb2YgdGhlIGxhc3QgZnJhbWUKKyAgICBmbG9hdCBiYXJrX2hpc3RbM11bMl1bNDBdOyAgICAgICAvLy88IEJTRSBjb2VmZmljaWVudHMgb2YgbGFzdCBmcmFtZQorCisgICAgLy8gYml0c3RyZWFtIHBhcmFtZXRlcnMKKyAgICBpbnQxNl90IHBlcm11dFs0XVs0MDk2XTsKKyAgICB1aW50OF90IGxlbmd0aFs0XVsyXTsgICAgICAgICAgICAvLy88IG1haW4gY29kZWJvb2sgc3RyaWRlCisgICAgdWludDhfdCBsZW5ndGhfY2hhbmdlWzRdOworICAgIHVpbnQ4X3QgYml0c19tYWluX3NwZWNbMl1bNF1bMl07IC8vLzwgYml0cyBmb3IgdGhlIG1haW4gY29kZWJvb2sKKyAgICBpbnQgYml0c19tYWluX3NwZWNfY2hhbmdlWzRdOworICAgIGludCBuX2Rpdls0XTsKKworICAgIGZsb2F0ICpzcGVjdHJ1bTsKKyAgICBmbG9hdCAqY3Vycl9mcmFtZTsgICAgICAgICAgICAgICAvLy88IG5vbi1pbnRlcmxlYXZlZCBvdXRwdXQKKyAgICBmbG9hdCAqcHJldl9mcmFtZTsgICAgICAgICAgICAgICAvLy88IG5vbi1pbnRlcmxlYXZlZCBwcmV2aW91cyBmcmFtZQorICAgIGludCBsYXN0X2Jsb2NrX3Bvc1syXTsKKyAgICBpbnQgZGlzY2FyZGVkX3BhY2tldHM7CisKKyAgICBmbG9hdCAqY29zX3RhYnNbM107CisKKyAgICAvLyBzY3JhdGNoIGJ1ZmZlcnMKKyAgICBmbG9hdCAqdG1wX2J1ZjsKKworICAgIGludCBmcmFtZV9zaXplLCBmcmFtZXNfcGVyX3BhY2tldCwgY3VyX2ZyYW1lOworICAgIFR3aW5WUUZyYW1lRGF0YSBiaXRzW1RXSU5WUV9NQVhfRlJBTUVTX1BFUl9QQUNLRVRdOworCisgICAgZW51bSBUd2luVlFDb2RlYyBjb2RlYzsKKworICAgIGludCAoKnJlYWRfYml0c3RyZWFtKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHN0cnVjdCBUd2luVlFDb250ZXh0ICp0Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSk7CisgICAgdm9pZCAoKmRlY19iYXJrX2Vudikoc3RydWN0IFR3aW5WUUNvbnRleHQgKnRjdHgsIGNvbnN0IHVpbnQ4X3QgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfaGlzdCwgaW50IGNoLCBmbG9hdCAqb3V0LCBmbG9hdCBnYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gVHdpblZRRnJhbWVUeXBlIGZ0eXBlKTsKKyAgICB2b2lkICgqZGVjb2RlX3BwYykoc3RydWN0IFR3aW5WUUNvbnRleHQgKnRjdHgsIGludCBwZXJpb2RfY29lZiwgaW50IGdfY29lZiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNoYXBlLCBmbG9hdCAqc3BlZWNoKTsKK30gVHdpblZRQ29udGV4dDsKKworZXh0ZXJuIGNvbnN0IGVudW0gVHdpblZRRnJhbWVUeXBlIGZmX3R3aW52cV93dHlwZV90b19mdHlwZV90YWJsZVtdOworCisvKiogQG5vdGUgbm90IHNwZWVkIGNyaXRpY2FsLCBoZW5jZSBub3Qgb3B0aW1pemVkICovCitzdGF0aWMgaW5saW5lIHZvaWQgdHdpbnZxX21lbXNldF9mbG9hdChmbG9hdCAqYnVmLCBmbG9hdCB2YWwsIGludCBzaXplKQoreworICAgIHdoaWxlIChzaXplLS0pCisgICAgICAgICpidWYrKyA9IHZhbDsKK30KKworc3RhdGljIGlubGluZSBmbG9hdCB0d2ludnFfbXVsYXdpbnYoZmxvYXQgeSwgZmxvYXQgY2xpcCwgZmxvYXQgbXUpCit7CisgICAgeSA9IGF2X2NsaXBmKHkgLyBjbGlwLCAtMSwgMSk7CisgICAgcmV0dXJuIGNsaXAgKiBGRlNJR04oeSkgKiAoZXhwKGxvZygxICsgbXUpICogZmFicyh5KSkgLSAxKSAvIG11OworfQorCitpbnQgZmZfdHdpbnZxX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCk7Cithdl9jb2xkIGludCBmZl90d2ludnFfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cithdl9jb2xkIGludCBmZl90d2ludnFfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVFdJTlZRX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdHdpbnZxX2RhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3R3aW52cV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1YWNjMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3R3aW52cV9kYXRhLmgKQEAgLTAsMCArMSwxMTE0NCBAQAorLyoKKyAqIFR3aW5WUSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgVml0b3IgU2Vzc2FrCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19UV0lOVlFfREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfVFdJTlZRX0RBVEFfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qCisgKiBUaGUgYmFya190YWJfKiB0YWJsZXMgYXJlIGNvbnN0cnVjdGVkIHNvIHRoYXQKKyAqCisgKiAgICAgICAvaS0xICAgICAgICAgICAgICBcCisgKiAgICAgICB8LS0gICAgICAgICAgICAgICB8CisgKiAgYmFyayB8XCAgIGJhcmtfdGFiW2pdICB8ID09IGkKKyAqICAgICAgIHwvICAgICAgICAgICAgICAgIHwKKyAqICAgICAgIHwtLSAgICAgICAgICAgICAgIHwKKyAqICAgICAgIFxqPTAgICAgICAgICAgICAgIC8KKyAqCisgKgorICogZm9yIHNvbWUgc2xpZ2h0bHkgbm9uY29udmVudGlvbmFsIGJhcmstc2NhbGUgZnVuY3Rpb24KKyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX2wwOF81MTJbXSA9IHsKKyAgICAgNywgIDgsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTQsIDE1LCAxNiwKKyAgICAxOCwgMTksIDIxLCAyNCwgMjcsIDMwLCAzNSwgNDAsIDQ2LCA1MworfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX2wxMV81MTJbXSA9IHsKKyAgICAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNywgIDYsICA3LCAgNywKKyAgICAgOCwgIDgsICA4LCAgOSwgMTAsIDEwLCAxMSwgMTMsIDEzLCAxNSwKKyAgICAxNywgMTgsIDIxLCAyNSwgMjcsIDMzLCAzOCwgNDUsIDU0LCA2NgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX2wxNl8xMDI0W10gPSB7CisgICAgIDksICA5LCAgOCwgIDksIDEwLCA5LCAgMTAsICAxMCwgIDEwLCAgMTIsCisgICAgMTEsIDEzLCAxMywgMTQsIDE2LCAxNywgMTksICAyMCwgIDI0LCAgMjYsCisgICAgMzAsIDM1LCA0MCwgNDgsIDU2LCA2OCwgODMsIDEwMiwgMTI4LCAxNjUKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9sMjJfMTAyNFtdID0geworICAgICAgNiwgICA3LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgICA4LAorICAgICAgOSwgICA4LCAxMCwgMTAsIDExLCAxMiwgMTMsIDE1LCAxNiwgIDE4LAorICAgICAyMSwgIDI0LCAyNywgMzMsIDM4LCA0NiwgNTUsIDY4LCA4NCwgMTA3LAorICAgIDE0MCwgMTkxCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbDIyXzUxMltdID0geworICAgICAzLCAgMywgIDMsICA0LCAgMywgIDMsICA0LCAgMywgIDQsICA0LAorICAgICA0LCAgNSwgIDQsICA1LCAgNiwgIDYsICA3LCAgNywgIDgsICA5LAorICAgIDEwLCAxMiwgMTQsIDE2LCAyMCwgMjIsIDI4LCAzNCwgNDIsIDUzLAorICAgIDcxLCA5NQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX2w0NF8yMDQ4W10gPSB7CisgICAgIDUsICA2LCAgNSwgIDYsICA1LCAgIDYsICAgNiwgICA2LCAgIDYsICAgNiwKKyAgICAgNywgIDcsICA3LCAgOCwgIDgsICAgOSwgICA5LCAgMTAsICAxMSwgIDExLAorICAgIDEzLCAxNCwgMTYsIDE3LCAxOSwgIDIyLCAgMjUsICAyOSwgIDMzLCAgMzksCisgICAgNDYsIDU0LCA2NCwgNzksIDk4LCAxMjMsIDE2MSwgMjIwLCAzMjAsIDUxMgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX20wOF8yNTZbXSA9IHsKKyAgICA2LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDgsICA4LAorICAgIDksIDEwLCAxMSwgMTMsIDE1LCAxOCwgMjAsIDI1LCAzMSwgMzkKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9tMTFfMjU2W10gPSB7CisgICAgNCwgNSwgIDQsICA1LCAgNSwgIDUsICA2LCAgNSwgIDcsICA3LAorICAgIDgsIDksIDEwLCAxMiwgMTUsIDE3LCAyMiwgMjgsIDM1LCA0NworfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX20xNl81MTJbXSA9IHsKKyAgICAgNywgIDYsICA3LCAgNywgIDcsICA4LCAgOSwgIDksIDEwLCAgMTEsCisgICAgMTQsIDE1LCAxOCwgMjIsIDI3LCAzNCwgNDQsIDU5LCA4MSwgMTE3Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbTIyXzI1NltdID0geworICAgIDMsIDIsIDMsIDIsICAzLCAgMywgIDQsICAzLCAgNCwgIDUsCisgICAgNSwgNywgOCwgOSwgMTMsIDE2LCAyMiwgMzAsIDQ0LCA3MAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX20yMl81MTJbXSA9IHsKKyAgICAgNSwgIDUsICA1LCAgNiwgIDUsICA3LCAgNiwgIDcsICA5LCAgIDksCisgICAgMTEsIDEzLCAxNSwgMjAsIDI0LCAzMywgNDMsIDYxLCA4OCwgMTQwCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfbTQ0XzUxMltdID0geworICAgIDMsIDIsICAzLCAgMywgIDMsICA0LCAgMywgIDUsICA0LCAgIDYsCisgICAgNywgOCwgMTAsIDE0LCAxOCwgMjUsIDM2LCA1NSwgOTUsIDIwOAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX3MwOF82NFtdID0geworICAgIDMsIDMsIDMsIDMsIDQsIDUsIDYsIDgsIDEyLCAxNworfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX3MxMV82NFtdID0geworICAgIDIsIDMsIDIsIDMsIDMsIDQsIDYsIDgsIDEyLCAyMQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX3MxNl8xMjhbXSA9IHsKKyAgICAzLCA0LCA0LCA0LCA1LCA3LCAxMCwgMTYsIDI2LCA0OQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJhcmtfdGFiX3MyMl8xMjhbXSA9IHsKKyAgICAzLCAyLCAzLCA0LCA0LCA2LCA5LCAxNCwgMjYsIDU3Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYmFya190YWJfczQ0XzEyOFtdID0geworICAgIDEsIDIsIDEsIDIsIDMsIDQsIDYsIDEwLCAyMywgNzYKK307CisKKy8qKgorICogVHdpblZRIGNvZGVib29rcy4gVGhleSBhcmUgY29kZWQgaW4gYSBzdHJ1Y3Qgc28gd2UgY2FuIHVzZSBjb2RlIHN1Y2ggYXMKKyAqCisgKiBmbG9hdCB2YWwgPSB0YWIuZmNiMDgwOGxbZ2V0X2JpdHMoZ2IsIDEyKV07CisgKgorICogd2l0aG91dCByaXNraW5nIGEgc2VnZmF1bHQgb24gbWFsZm9ybWVkIGZpbGVzLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHR3aW52cV9kYXRhIHsKKyAgICBmbG9hdCBsc3AwOFs1MDRdOworICAgIGludDE2X3QgZmNiMDhsWzY0MF07CisgICAgaW50MTZfdCBmY2IwOG1bMzIwXTsKKyAgICBpbnQxNl90IGZjYjA4c1szMjBdOworICAgIGludDE2X3Qgc2hhcGUwOFsxMjgwXTsKKworICAgIGludDE2X3QgY2IwODA4bDBbMTA4OF07CisgICAgaW50MTZfdCBjYjA4MDhsMVsxMDg4XTsKKyAgICBpbnQxNl90IGNiMDgwOHMwWzExNTJdOworICAgIGludDE2X3QgY2IwODA4czFbMTE1Ml07CisgICAgaW50MTZfdCBjYjA4MDhtMFsxMDI0XTsKKyAgICBpbnQxNl90IGNiMDgwOG0xWzEwMjRdOworCisgICAgaW50MTZfdCBjYjExMDhsMFsxNzI4XTsKKyAgICBpbnQxNl90IGNiMTEwOGwxWzE3MjhdOworICAgIGludDE2X3QgY2IxMTA4bTBbMTUzNl07CisgICAgaW50MTZfdCBjYjExMDhtMVsxNTM2XTsKKyAgICBpbnQxNl90IGNiMTEwOHMwWzE4NTZdOworICAgIGludDE2X3QgY2IxMTA4czFbMTg1Nl07CisKKyAgICBpbnQxNl90IGZjYjExbFs2NDBdOworICAgIGludDE2X3QgZmNiMTFtWzMyMF07CisgICAgaW50MTZfdCBmY2IxMXNbMzIwXTsKKyAgICBpbnQxNl90IHNoYXBlMTFbMTI4MF07CisgICAgZmxvYXQgbHNwMTFbMTMxMl07CisKKyAgICBpbnQxNl90IGNiMTExMGwwWzEyODBdOworICAgIGludDE2X3QgY2IxMTEwbDFbMTI4MF07CisgICAgaW50MTZfdCBjYjExMTBtMFsxMTUyXTsKKyAgICBpbnQxNl90IGNiMTExMG0xWzExNTJdOworICAgIGludDE2X3QgY2IxMTEwczBbMTM0NF07CisgICAgaW50MTZfdCBjYjExMTBzMVsxMzQ0XTsKKworICAgIGludDE2X3QgZmNiMTZsWzY0MF07CisgICAgaW50MTZfdCBmY2IxNm1bMzIwXTsKKyAgICBpbnQxNl90IGZjYjE2c1szMjBdOworICAgIGludDE2X3Qgc2hhcGUxNlsxOTIwXTsKKyAgICBmbG9hdCBsc3AxNlsxNDAwXTsKKworICAgIGludDE2X3QgY2IxNjE2bDBbMTAyNF07CisgICAgaW50MTZfdCBjYjE2MTZsMVsxMDI0XTsKKyAgICBpbnQxNl90IGNiMTYxNm0wWzk2MF07CisgICAgaW50MTZfdCBjYjE2MTZtMVs5NjBdOworICAgIGludDE2X3QgY2IxNjE2czBbMTAyNF07CisgICAgaW50MTZfdCBjYjE2MTZzMVsxMDI0XTsKKworICAgIGludDE2X3QgY2IyMjIwbDBbMTE1Ml07CisgICAgaW50MTZfdCBjYjIyMjBsMVsxMTUyXTsKKyAgICBpbnQxNl90IGNiMjIyMG0wWzEwODhdOworICAgIGludDE2X3QgY2IyMjIwbTFbMTA4OF07CisgICAgaW50MTZfdCBjYjIyMjBzMFsxMTUyXTsKKyAgICBpbnQxNl90IGNiMjIyMHMxWzExNTJdOworCisgICAgaW50MTZfdCBmY2IyMmxfMVs1MTJdOworICAgIGludDE2X3QgZmNiMjJtXzFbNjQwXTsKKyAgICBpbnQxNl90IGZjYjIyc18xWzY0MF07CisgICAgaW50MTZfdCBzaGFwZTIyXzFbMTE1Ml07CisgICAgZmxvYXQgbHNwMjJfMVsxMzEyXTsKKworICAgIGludDE2X3QgY2IyMjI0bDBbOTYwXTsKKyAgICBpbnQxNl90IGNiMjIyNGwxWzk2MF07CisgICAgaW50MTZfdCBjYjIyMjRtMFs4OTZdOworICAgIGludDE2X3QgY2IyMjI0bTFbODk2XTsKKyAgICBpbnQxNl90IGNiMjIyNHMwWzk2MF07CisgICAgaW50MTZfdCBjYjIyMjRzMVs5NjBdOworCisgICAgaW50MTZfdCBmY2IyMmxfMls1MTJdOworICAgIGludDE2X3QgZmNiMjJtXzJbNjQwXTsKKyAgICBpbnQxNl90IGZjYjIyc18yWzY0MF07CisgICAgaW50MTZfdCBzaGFwZTIyXzJbMTE1Ml07CisgICAgZmxvYXQgbHNwMjJfMlsxMzEyXTsKKworICAgIGludDE2X3QgY2IyMjMybDBbNzY4XTsKKyAgICBpbnQxNl90IGNiMjIzMmwxWzc2OF07CisgICAgaW50MTZfdCBjYjIyMzJtMFs3MDRdOworICAgIGludDE2X3QgY2IyMjMybTFbNzA0XTsKKyAgICBpbnQxNl90IGNiMjIzMnMwWzcwNF07CisgICAgaW50MTZfdCBjYjIyMzJzMVs3MDRdOworCisgICAgaW50MTZfdCBjYjQ0NDBsMFsxMDg4XTsKKyAgICBpbnQxNl90IGNiNDQ0MGwxWzEwODhdOworICAgIGludDE2X3QgY2I0NDQwbTBbMTA4OF07CisgICAgaW50MTZfdCBjYjQ0NDBtMVsxMDg4XTsKKyAgICBpbnQxNl90IGNiNDQ0MHMwWzExNTJdOworICAgIGludDE2X3QgY2I0NDQwczFbMTE1Ml07CisKKyAgICBpbnQxNl90IGZjYjQ0bFs2NDBdOworICAgIGludDE2X3QgZmNiNDRtWzY0MF07CisgICAgaW50MTZfdCBmY2I0NHNbNjQwXTsKKyAgICBpbnQxNl90IHNoYXBlNDRbMTE1Ml07CisgICAgZmxvYXQgbHNwNDRbMTY0MF07CisKKyAgICBpbnQxNl90IGNiNDQ0OGwwWzg5Nl07CisgICAgaW50MTZfdCBjYjQ0NDhsMVs4OTZdOworICAgIGludDE2X3QgY2I0NDQ4bTBbODk2XTsKKyAgICBpbnQxNl90IGNiNDQ0OG0xWzg5Nl07CisgICAgaW50MTZfdCBjYjQ0NDhzMFs5NjBdOworICAgIGludDE2X3QgY2I0NDQ4czFbOTYwXTsKK30gdGFiID0geworLmNiMDgwOGwwID0geworICAgIDk2LCAtMTI1OTIsIC0xMjQ0MywgICAgNDI1LCAgICAxODIsICAgLTQ1NiwgICAtMzQxLCAgIC04NDMsCisgICA2MTUsICAgIDY4OSwgICAgOTgyLCAgIDE0NzAsICAgLTUxOCwgICAgMjMxLCAgIC01MzgsICAgIDI4MiwKKyAgIDQwOSwgICAtNjAwLCAgIC0zMDMsICAgIC0yOSwgICAgIDUxLCAgICAgLTQsICAgLTExNSwgICAgIDc5LAorICAgLTI3LCAgICA0NTAsICAgLTkzNywgICAtNDYxLCAgIC01NTQsICAgLTE1OSwgICAgNDI2LCAgICA3MTAsCistMjkxMDYsICAtMjE0OCwgICAgIDk5LCAgIDM0MjYsICAgMTgzOCwgIDEyNDI3LCAgICA1ODUsICAtMjA4MCwKKyAtMjUyNCwgICAtNDc0LCAgIDE1NzIsICAgIDcxOCwgICAgNTc4LCAgIC0zNDQsICAgIDE4OCwgICAgMzI4LAorIDEyMTI1LCAgICAxMTIsICAgIDY1NCwgIC0xMjMyLCAgLTE2NDQsICAgIDI4OCwgICAgNTUzLCAgIDE1MTMsCisgICA5NjYsICAgMTAxMiwgICAgIDQ5LCAgICA2MzEsICAgLTExMSwgICAtMjM4LCAgIC0xMTYsICAgLTE4MiwKKyAgIC0yMSwgICAgLTQ2LCAgICAzMzQsICAxMTAxMywgICAtNDU0LCAgIC0yNjEsICAgICAxMiwgICAgIDIxLAorICAgIDUyLCAtMjA0NDAsICAgLTI5NSwgICAtNTAyLCAgIC01MTYsICAgLTMyOSwgICAtMjMwLCAgICA0NjUsCisgICAgNTksICAgIDI3MCwgICAgOTcxLCAgIC0xMjcsICAgIDUwNSwgICAtMTk0LCAgICAgNDMsICAgIC0zMCwKKyAgIDMwMCwgICAgIDM4LCAgICA2NjUsICAgLTYxMywgICAgIDMzLCAgIC0xNzIsICAgLTE1MywgICAgMzIzLAorICAtMTY2LCAgICAgNTQsICAgIDM5OSwgICAgMTA5LCAgICAxODYsICAtMTc2NSwgICAtMjIyLCAgICAxMzgsCisgICAgMTYsICAgIDIwNCwgIDMwMTExLCAgICAyMDgsICAgLTU2NCwgICAtNjEyLCAgICAxNTYsICAgLTE0NiwKKyAgLTM0NSwgICAgMzIxLCAgIC0xMzgsICAgIDIwMiwgICAtMTg0LCAgICAgOTMsICAgIDcxMCwgLTE1OTQ1LAorLTEzNDAxLCAgICAyMzQsICAtMTExMywgICAgMTQ2LCAgICAgLTksICAgICA1NiwgICAtNjI4LCAgIC04MzQsCisgLTEyNjgsICAgIDg3MiwgICAgIDYxLCAgLTExODQsICAgLTEyNiwgICAtMjA1LCAgICAxNDUsICAgLTEwOSwKKyAtODI0OCwgICAgMTEzLCAgIC0xNDYsICAgMTI4OCwgICA5MTQyLCAgICA4NTcsICAgLTc4MiwgICAtNjg2LAorICAtMjU2LCAgIC02NTAsICAgMTA2MSwgICAtMjAyLCAgICAgMTIsICAgLTcwOSwgICAgLTg4LCAgICAyNzMsCisgICA0OTcsICAgIDE1MCwgICAgLTU5LCAgLTg4MDcsICAgIDI0MCwgICAgNTMyLCAgICAgMTYsICAgMTQ4MiwKKyAxMTAxMiwgICAtNDQ0LCAgIDE5MTgsICAtMTc4NiwgICAxOTM0LCAgICAxNzIsICAgIDU5OCwgIC0xMzI0LAorICA1NjM4LCAgLTMxNjYsICAgIDQ5MiwgICAtNTQ1LCAgIC03NzAsICAgMTA2NywgICAgICAwLCAgIC0zNTYsCisgIC00MjEsICAgMTY4NCwgICAgMjczLCAgIC01MDIsICAgIDMxNiwgICAxMTE2LCAgICA4MDcsICAgLTUyOSwKKyAgLTgzMSwgLTEzMzc5LCAgIC00MjAsICAgIDIzNiwgICAgNDcwLCAgLTI1OTAsICAgLTE5MywgICAgLTQ3LAorICAgNTgwLCAgLTE2MTMsICAgIDc5OCwgICAgIDI3LCAgICAtMTYsIC0xMjc2OCwgICAtODkzLCAgICAyNTYsCisgICAgIDAsICAgMTY1OSwgICAxNDYzLCAgICA1NDQsICAgIDE5NiwgLTMwNDQ0LCAgICAzMTQsICAgLTQyMSwKKyAgIDUwOCwgICAtMjc2LCAgIC0xNzMsICAgIDQxNCwgICAtMzgwLCAgIC0zNzEsICAgIC00MCwgICAtMTIxLAorICAgMzc1LCAgICA0MzIsICAgLTQzOCwgICAgICAxLCAgIC0zNTAsICAgLTI4MCwgICAxMTk4LCAgIC0zNzMsCisgICA0NTIsICAgIDEwMCwgICAgLTY4LCAgIDkwNTMsICAgIDE2NSwgICAgNzcwLCAgICAgNzMsICAgIDI5MSwKKyAgIDcxNywgICAgNTE1LCAgICA1OTYsICAgLTMyMywgICAgIC00LCAgICAgLTIsICAgIDgwMywgICAgNzM4LAorICAyNjA1LCAgICAgMzAsICAgICA3MywgICAgNDU1LCAgMTEyODAsICAgMTUzNCwgICAtMjgzLCAgIDE1MDIsCisgLTkxMjYsICAtNDc2MCwgICAtNTcwLCAgICA0ODMsICAgLTE3OSwgIC04NjI4LCAgLTE2MzksICAgIDMyMiwKKyAgIC01NiwgICA2MTQ5LCAgLTMzMzAsICAgIDExNCwgICA0NTk4LCAgLTE5NzYsICAgIC0zNCwgICAgLTU2LAorICAgODQwLCAgICA3NTMsICAxMjI5MiwgIC03MTAwLCAgIC00OTIsICAgIDMyMCwgICAtNDEyLCAgICA5MDgsCisgIDExODYsICAgIDQ0NCwgICA2NTQ2LCAgIC03ODgsICAgNTM5NCwgICAgNjk3LCAgMTMxMDUsICAgIDE5NCwKKyAgLTM5NCwgICAgMjk0LCAgIDI2MzksICAgICAxMiwgIC0xMDA5LCAgLTE0MjYsICAgIC0zNiwgICAyMTA2LAorICAtMjUyLCAtMzE5NzksICAgIC02NiwgICAgMzQxLCAgICA5OTYsICAgIDI5OCwgICAgMTA1LCAgICAgIDYsCisgICAgMTAsICAgIDEwNiwgICAtNDk4LCAgIC0yNDQsICAgLTEwNSwgICAtNTc0LCAgICAgMTYsICAgLTIwNiwKKyAgICAyNCwgIC0yMDY3LCAgIC0zODEsICAxMDI2NSwgICAtMTAzLCAgIC03NjIsICAgLTc4NSwgIC0yMDM2LAorLTExOTI3LCAgICAgMTYsICAgLTcxMCwgICAgLTM1LCAgIC0yNzAsICAgIC05OSwgICAgICA0LCAgICA3NzIsCisgIC0yNzIsICAgLTE4NiwgICAtMzI4LCAtMTQ5MzYsICAgIC01NywgIC0xMzU3LCAgIC0xNzUsICAgLTYwNiwKKyAgIDIyMCwgICAgOTE4LCAgICAtMTEsICAgIDM5OCwgICAtMTg5LCAgIC0yNzgsICAgIDEzOCwgICAgNDI5LAorICAgNTA5LCAgIC03MDEsICAgIC00MywgICAgLTQyLCAgIC02MzAsICAgLTU2MCwgIDExNzM2LCAgIC01MjgsCisgMTAyODYsICAgLTYzMywgICAtODcwLCAgICA0MjMsICAgIDU1MCwgICAtODg4LCAgICAyOTcsICAgLTE3MCwKKyAgIDI1OCwgICAyMjM0LCAgICA0ODYsICAgIDI5MiwgICAtNDQ2LCAtMTE4NTgsICAxMDAwOCwgICAgIDUyLAorICAxMjAzLCAgIC0xNjQsICAgIDgxMCwgIC0xNTI3LCAgIC02MDQsICAgLTg4MywgICAtNTg4LCAgICAtOTYsCisgICAzMzIsICAgIDE0OCwgICAtMTgwLCAgICAyMjMsICAgIDM1NiwgICAgMjg1LCAgICA0MzQsICAgIC01NywKKyAgLTE3MiwgICAtNTIwLCAgIC00MzIsICAgIC03MiwgICAgMjk0LCAgICAtOTMsICAgLTEzNCwgICAgMzE2LAorIDMwNjQ3LCAgIC0zNTEsICAgIDI3OCwgICAgIDg0LCAgIC00MzksICAgIDU4OSwgICAgMTA1LCAgIDEwMDEsCisgICAyOTcsICAgIDY2MCwgICAgMTk2LCAgICAxNzEsICAgIDE3OCwgICAgLTkwLCAgICAtNTUsICAgMTE3MiwKKyAyMTEwMCwgICAgMjI3LCAgIC0yODgsICAgIDM3MiwgICAgMTYyLCAgICA0NTgsICAgLTU1NSwgIC0xMzI5LAorICAgMzgwLCAgICAzNjYsICAgLTEwNCwgICAgMTA1LCAgICA2NzQsICAgLTM3OCwgICAxMzI4LCAgICAyODMsCisgLTE5MjgsICAgIDU0OSwgICAgNzYyLCAgICA0NTQsICAgICA1NSwgICAgNjA2LCAgMTI0OTksICAgICAyNCwKKyAgIDQzNSwgICAgIDIzLCAgICAgMjksICAgNjE3MCwgICAxMTI5LCAgICAtOTUsICAgICA5NywgICAgNTY5LAorICAgMTMyLCAgICA0OTEsICAgIDE2NCwgICAtMjg4LCAgLTEwMTEsICAgLTEzNCwgICAxMjM0LCAgIC00MjcsCisgIC0yNTQsICAgLTUyNCwgICAgMjI2LCAtMTQxMTQsICAgIDMyOCwgICAgLTcwLCAgIDE2NjYsICAgLTE4OSwKKyAtMjM1MiwgICAxMDk3LCAgICA2MTksICAgIDYzMiwgICAtOTgxLCAgICA3NDUsICAgIDU4NywgICAgLTI3LAorICAtMjAwLCAgIC04NzEsICAgICA1MCwgICAgNDcwLCAgIC0yNDYsICAgMjYxMCwgICAgNTgxLCAgICAyNTQsCisgIDk4OTMsICAgLTU4NiwgICAgODgwLCAtMTE4OTQsICAgIDM4NiwgICAxMTM1LCAgICAxMTcsICAgMTA3MiwKKyAgIDExNiwgICAtODMwLCAgIC0xNjAsICAtMTAwMiwgICAtNjk5LCAgICAtNjYsICAgLTIzMCwgICAtMjYwLAorICAgMTEyLCAgICAxMDYsICAgIDIyMSwgICAgMjk3LCAgICAtNDcsICAgNzY0MiwgICAgMTcwLCAgIC0zMzAsCisgIC01OTksICAgIC01MSwgICAtNDc2LCAgICAgMzMsICAgIDQ3NSwgICAgNjI0LCAgIDYxOTksICAgLTM1MCwKKyAgLTQwNiwgICAgMTg0LCAgICA5MDYsICAgLTUyOCwgICAgMzgyLCAgICA0MDEsICAgIDM0OCwgICAgIDI2LAorICAtMTg2LCAgICAgMzMsICAgLTEzMCwgICAgLTYyLCAgICAtNTAsICAgMTI2OCwgICAtMTMyLCAgIC0xMDksCisgIDExNjQsICAgLTM1NCwgICAgNjc1LCAgICAgIDMsICAgLTQwMiwgICAtMjQ0LCAgICA2NDQsICAgIDY0OCwKKyAgLTEzMiwgICAgIC00LCAgICAgNDUsICAyMDM4NiwgICAtMTM2LCAgICA1NjgsICAgIDEyNiwgICAgMzc2LAorIDE0NDc2LCAgIC0zNzYsICAgIDI2NywgIDEzNTE4LCAgIC0yNjAsICAgIDExMSwgICAxMDE0LCAgICA3NTgsCisgICA0MzksICAgIDU1MSwgICAtMTY0LCAgICAyMDcsICAgIDEyOCwgICAtNDE2LCAgICA2MTYsICAgIDY5MCwKKyAtOTQ2MCwgIC0xODU2LCAgIDExMjMsICAgIDgyNiwgICAtMjY1LCAgIC03NjIsICAgMTU5NiwgICAtNjMyLAorICAgIDUyLCAgIC02MjIsICAgLTg5NCwgICAgMzY3LCAgIC00MzMsICAgLTEwMCwgICAxODczLCAgICA3NTYsCistMTc0MzYsICAgIDE2OCwgICAtNTQxLCAgICA1NTAsICAgIDE0NSwgIC01NjEyLCAgLTEwNTcsICAtMTM0NCwKKyAgLTY1NiwgICAtMTk0LCAgICAyMTYsICAgLTUwMCwgICAtMjQ1LCAgICAyNDYsICAgICA2NCwgICAgNjg4LAorICAgNzI3LCAgMTI1MzgsICAtNTQ5MiwgICAgMjUyLCAgIC05MDgsICAgLTQyNCwgICAtNTMyLCAgIC02NTksCisgIC0yNzcsICAgLTIzMCwgICAtNzM2LCAgIC0xODMsICAgICAzNSwgICAtMjI4LCAgICAyMDAsICAgIC0xMiwKKyAgLTI0OCwgICAgLTYwLCAgIC00OTMsICAgIDQzMywgICAgNDQ2LCAgICAzNjYsICAgLTY0NCwgICAgIDkyLAorICAtMzI0LCAgICAgMjksICAgIDgzMywgLTIxNTQyLCAgIC05NzcsICAgICA5NCwgICAgMzc5LCAgICAgNDksCisgLTEwNTgsICAgIDI0OCwgICAtMTc4LCAgICAgODUsICAgLTk2MSwgIC0xMTk4LCAgICAtNDgsICAgIDQ2NywKKyAgLTI0MiwgLTEwMjAyLCAgIDE1NTYsICAxMTI2MywgICAtNzE2LCAgICA4MTQsICAtMTY4NiwgICAzNTk0LAorICAgLTI3LCAgICA2OTQsICAgLTgwMiwgICAgMzkwLCAgIDQxNDQsICAgLTY2MywgICAgIDQ0LCAgIC01NDYsCisgICAzMTIsICAgIC0yOCwgICAtNDg0LCAgICA5ODEsICAgLTMwNywgICAgNDk2LCAgICA0MDgsICAgIDIwMywKKyAxMjU0MywgICAgMjk2LCAgLTEyNDAsICAgIDE1OSwgICAgODQ2LCAgIC05NTcsICAtMTQ5MywgICAtNjE4LAorICAxNTkzLCAgMTE4NjgsICAgMjYxNiwgICAxOTU0LCAgICA0MTIsICAgLTkyMiwgIC0xMzIwLCAgIDMzMjUsCisgIC0yNTQsICAtMTg5MiwgICAgNjA3LCAgLTIyMjMsICAtODc0NSwgIC0xNDg2LCAgICAgMTcsICAgIDM0MywKKyAgIC01MCwgICAtNTYyLCAgMjIwMTEsICAgLTM1MCwgICAtNDkxLCAgICAtNzAsICAgIC02MCwgICAgNjE3LAorICAgNzY4LCAgIC0zNDYsICAgIDM4NywgICAgNjYwLCAgIDE0MDksICAgIDIyMiwgICAgNjE2LCAgICAxNzMsCisgLTEzMjMsICAgNDAxNywgICAtMjA3LCAgIC01MjUsIC0xMzI0MywgICAgIDExLCAgICA0NDAsICAgLTYxNCwKKyAgLTI4MCwgICAgNTQ5LCAgIC02NzAsICAgIC03OSwgICAgNDU5LCAgICA1NjAsICAgLTEwMiwgICAtMjE0LAorICAgLTU0LCAgLTEyMDEsICAgIDIzMCwgICAtNTI2LCAgICA4NTcsICAgMTA0NCwgICAtMzY5LCAgIDI0NzAsCistMTEwMTAsIC0xMjU4NiwgICAgMjQzLCAgIC0yMDUsICAgIDgzOCwgICAtOTIwLCAgICAzNDgsICAgLTczOCwKKyAgMTMxOSwgICAgIDg2LCAgICAtNzgsICAgLTQyOCwgIC0xOTA5LCAgIC0xNTUsICAgICAgMiwgICAgNTA4LAorICAgNzExLCAgIC0yOTIsICAgMTY5OSwgICAgMjI1LCAgIC0xMDEsICAgLTE2MywgICAgNTQwLCAgIDk2OTIsCisgICAyMzUsICAgLTE4MywgICAgLTM4LCAgICAxOTgsICAgLTQ2NiwgICAtMjA0LCAgLTg5NTcsICAgLTkxNCwKKyAgLTI5OSwgICAgMTkzLCAgICAgMTAsICAgIDcyMywgICAgNjQzLCAgIC01MzMsICAtMTQxOCwgICAgMzIzLAorICAgIDIwLCAgICAzMzQsICAgLTg4NiwgICAtMzMxLCAgICAzNjgsICAgIDEzMCwgLTMwMjMzLCAgIC0xNTIsCisgICAtMTQsICAgIDYzNywgICAgMTMyLCAgIC0yMzIsICAgLTE0OSwgICAtNDMwLCAgICAgNjQsICAgLTI0MywKKyAgLTM3NiwgICAgMzcwLCAgICAzODgsICAgIDE5NiwgIC0xMDk4LCAgICAxMTcsICAgLTc5NCwgICAgLTE2LAorICAtMjc0LCAgICAzNDgsICAgIDQ2NCwgLTI4MTU2LCAgICAxODQsICAgIDMyMiwgICAtMTAxLCAgICAgIDIsCisgICAtMjcsICAgLTE4MywgICAgNjEwLCAgICAyNTYsICAgLTE2MCwgICAtNTczLCAgIC0yMjYsICAgIDU4OCwKKyAgMTYxMywgICAxMDI4LCAgIDk1MTgsICAtMjE1MSwgIC0xNjAyLCAgIC01MjgsICAgLTM1NiwgICAtMTE2LAorLTExNTExLCAgIDE4MjgsICAtMjIwNiwgICAgLTQ3LCAgIC03NTcsICAtMTQ3OSwgIC0xNDI5LCAtMTQ3MTcsCisgIDE2ODYsICAgIDI1MywgICAgODAyLCAgICA0NjIsICAgIC0zNywgICAtOTE2LCAgIC0yODksICAgLTQwMSwKKyAxMzM4MywgICAgMzUzLCAgICAtNzQsICAgIDExNCwgICAtMTg5LCAgICA2MzYsICAgIDQzNCwgICAtNjM5LAorICAxMDEzLCAgICAyMzQsICAxMTc1MiwgICAgMjE5LCAgIDE0NjQsICAgLTEzMiwgLTEyODM4LCAgICAxMjUsCisgIC01OTIsICAgIC00MCwgICAtMTYyLCAgLTE3NzIsICAgIDUwNiwgICAgNDc5LCAgICA0MjIsICAgICAzNiwKKyAgICAxNSwgICAtOTYwLCAgICA3OTksICAgIDUxNywgICAxMzExLCAgIC00MDksICAgIDc0OCwgICAgNzI5LAorICAgNDQ2LCAgMTEwMjksIC0xMzAzOSwgICAxMjU3LCAgIC02NTEsICAgIC0xMywgICAtNzQyLCAgIDE0MTYsCisgIC0zODgsICAgLTI3NCwgICAtNzk1LCAgICAxNjMsICAgLTU3MiwgICAgIDc0LCAgICA0MzAsICAgIC05MCwKKyAgLTEyNiwgICAgLTc0LCAgIC01OTgsICAgIDE0MCwgICAgMTI1LCAgICAtMjAsIC0yMDMzMiwgICAgMjA4LAorICAgIDM3LCAgICAgMTksICAgLTE3NCwgICAtMjA5LCAgICAzMDUsICAgICAyOCwgICAtNDAyLCAgICAgMjgsCisgIC0zMTUsICAgICAtMSwgICAtMTM0LCAgICA0NDAsICAgLTgzMiwgICAgIDc5LCAgIC02MzUsICAgLTMwNCwKKyAgICAgOCwgLTMyNzY4LCAgICA2MjUsICAgIDQ3MCwgIC0xMjI0LCAgIC0zNTEsICAgIDU0NiwgIC0xMTcxLAorICAtNzA2LCAgICA2NTIsICAgICAzMSwgICA3NDg0LCAgIC00NDgsICAgIDkxNiwgICAxMjQ0LCAgIC0zNzksCisgIC0zMDAsICAgICA2OCwgICAgODY4LCAgICA2MDcsICAgIDI0NywgICAgIDcwLCAgIC05ODQsICAxNDMxNCwKKyAgICAyMSwgICAtMzUwLCAgICAtODIsICAgIDM2OCwgICAgNDU2LCAgIC03NDIsICAgIDQ3MiwgICAgIDM0LAorICAgNzgyLCAgIC00OTgsICAgLTg3OSwgICAgNzAwLCAgICA0MTcsICAgIDIxNiwgICAgNDE1LCAgIC0xNjEsCisgIC0xODEsICAgLTYwOCwgICAxNTcwLCAgICA4NjIsICAgIC05NiwgICAtMTE0LCAgIDgwOTUsICAgIC0yNiwKKyAgIDE2OCwgICAtMzYzLCAgIC04MDQsICAgIC0zNiwgICAtNzcwLCAgICAxMzksICAgLTE3MSwgICA2NjQ1LAorIC0xNDI1LCAgIDQ4MjYsICAtNTI4OCwgICAxMzU4LCAtMTE3NDcsICAgIC02NCwgICAgNjUwLCAgLTMyMDYsCisgLTE2OTIsICAgIDc4OSwgIC0yMDQ3LCAgIC0yNzksICAgIDkxNiwgIC0xNjQ4LCAgIDExNjQsICAgMjA0NCwKKyAgLTE0NCwgICAtNzE3LCAgIC0zOTIsICAgLTIxNiwgICAgMzcyLCAgICAzNDgsICAgMTA1MiwgICAtMTc1LAorICAgNjY4LCAgICAzMDgsICAgIC0xNSwgIDI5MTEyLCAgIC00MDYsICAgLTc3NCwgICAgMzY1LCAgLTEwMDYsCisgIC01MjYsICAgMTA3NiwgICAgIDU5LCAgIC02NzIsICAgIC04NywgICAtMTA2LCAgICAxNzQsICAgICA5NiwKKyAgIDYxNSwgICAgNDYyLCAgICAtNDMsICAgLTQ5NiwgICAgMTEyLCAgICAxNDksICAgIC01NiwgICAtMTgyLAorICAtMjY4LCAtMzI3NjgsICAgLTIwNSwgICAtNjc2LCAgICAxNjUsICAtMTIxMCwgICAtMzI1LCAgIDc5NjQsCisgICAtNDQsICAgIDU0NiwgICAtNjk5LCAgICAyODUsICAgLTQxOCwgICAgMzU1LCAgICAyMzgsICAgIDU1MCwKKyAgICA2NywgICAgNDI1LCAgICAzODQsICAgLTk1MCwgICAtMzMwLCAgIC0yMDgsICAgLTQ1MiwgICAgMjEyLAorIDExNjEwLCAgIC0xOTAsICAgICAzNywgICAtOTA3LCAtMTExMzcsICAgLTk4MiwgICAgNTg1LCAgIC03ODMsCisgIC04NjQsICAgIDE2NCwgICAgLTI0LCAgIC01MTQsICAgLTIxMSwgICAgICAyLCAgIC01MTAsICAgLTU4MCwKKyAgIDU5NSwgICAgMTI4LCAgICAxMDAsICAgLTIyOSwgICAgLTU1LCAgICAyOTAsICAgLTUzOSwgICAgIDQwLAorIC03Nzg2LCAgIC0yNzAsICAgIDI5NSwgICAtNTA4LCAgICA1NjIsICAtMTE5NiwgICAgMjE4LCAgICAgMzMsCisgIDM3ODgsICAtODk1NCwgIC0xMDgyLCAgICAyOTcsICAgLTkwNiwgICAtMzIyLCAgICAxMjMsICAgMTE2MiwKKyAgLTM0MywgLTExNjU1LCAgICAgODgsICAgIC0yOCwgICAxMTczLCAgICAgIDksICAgIC05OSwgICAgIDM2LAorLTExOTg3LCAgICAzNTYsICAxMjYzMCwgICAgNzY3LCAgIC0xODMsICAgLTk4MywgICAtNTU5LCAgICAxODYsCisgIDExNDgsICAgIDUzMCwgICAtNDQwLCAgIDEyMzAsICAgLTQ1NiwgICAtMTMzLCAgIC00MjQsICAgICAzNSwKKyAgLTM1NywgICAgNDE4LCAgIDE0NTcsICAgLTY4NywgICAgNzQwLCAgIC0yNDIsICAxNzg1NSwgICAtMzY4LAorIC0xMDU3LCAgIC0yNjIsICAgLTY0NiwgICAgNDA2LCAgIC03MTIsICAtMTA1OCwgICAgLTg0LCAgICA0NTQKK30sCisKKy5jYjA4MDhsMSA9IHsKKyAgIDk4MiwgICAgLTI2LCAgIC03MjEsICAgIDM1OSwgICAgNTA5LCAgMTMyOTAsICAgMjM5MSwgICAgNzI3LAorICAgMzI1LCAgICAzMjgsICAgIDI2OSwgICAtMTU2LCAgICAzNDYsICAgLTI0MiwgICAgLTMxLCAgIC0zNTYsCisgICA3NDEsICAgIDM5NiwgICAgLTk4LCAgICAxMDgsICAgICAzNSwgICAtMjM3LCAtMjk2ODQsICAgIDE5NiwKKyAgIC02OSwgICAgNDYyLCAgIC0zMzksICAgICAyNCwgIC0xMjIxLCAgICAzNTIsICAgLTY1OCwgICAgMzk2LAorICAgMjQzLCAgLTE2NTgsICAgLTQ1OCwgIC0xMTUzLCAgICAgIDUsICAgLTY2MiwgICAgLTQ3LCAgICAgMTgsCisgIC01NzIsICAgLTU2NywgIC0yMDg0LCAgIC05ODAsICAgLTIxMCwgICAgMTUwLCAgIC0zOTYsICAxNDgzNiwKKyAgLTIxMCwgICAgICAwLCAgIC0xNjIsICAgLTUzOSwgICAgNTg4LCAgIC04NjgsICAgIDI0OCwgIC04NTc2LAorICAxMDIwLCAgICA1MjYsICAgMTA1NiwgICAgMjYyLCAgIC0xNDksICAgIDgxOCwgIC0xMzUzLCAgLTExMjAsCisgICA3NjcsICAgLTczOCwgICAtNjM0LCAtMTQ3NDIsICAgLTEwNSwgICAgODExLCAgIDE3MTgsICAgLTExNiwKKyAgIC02NCwgICAgMzA3LCAgICA5MjAsICAtMTI0NCwgICAyMzg4LCAgMTAyMTMsICAtNDUwNSwgICAtMjUwLAorICAgNjE3LCAgLTE3MjUsICAgLTY0NSwgICAxMjU4LCAgIDExNDYsICAgLTU5MCwgICAgNzA3LCAgICAtMTIsCisgICAzNzIsICAgMTc5NCwgICAxMDEyLCAgIC0xNDksICAgIDQwNCwgICAtOTc4LCAgIC0zMDYsICAgIDE2OCwKKyAtMTUzNiwgICAgIDg5LCAgICAxNDIsICAgIDkzOCwgLTE5ODkxLCAgICA5NzMsICAgLTQ4MSwgICAtNDE5LAorICAtOTA0LCAgIC00NTUsICAtMTgyMSwgIC0xNjE3LCAgICA2NTQsICAtMjAyMiwgICAxOTA2LCAgIC00OTcsCistMTEzNDYsICAgLTMzMCwgLTExNjc5LCAgICAtMTQsICAgICAgMSwgICAgNTM1LCAgIC0zNzcsICAgMTA1NywKKyAgLTIxNCwgICAtMjEzLCAgICA0MzAsICAgIC0xMywgIC0zMzc5LCAtMTEyNTAsICAgIDkxMSwgICAtNzE2LAorICAtMjQwLCAgICAtMTAsICAgIDI2MCwgICAgMTMyLCAgIC02MTEsICAgIC02NCwgICAtNTk0LCAgLTg1NDAsCisgICA4MzcsICAtMzcxNywgIC0xMTU0LCAgICA5MDYsICAxMDYyMywgICAtNTAyLCAgIC0xNjcsICAgICA2NywKKyAgIDExOSwgIDEzNTAxLCAgLTE0NjksICAgIDIxMywgIC0xMDQ4LCAgLTE0MDMsICAgIDQzMiwgIC0xMDc5LAorICAgIDQ1LCAgIC0yMzAsICAgLTczMCwgICAtMjAzLCAgIC01OTUsICAtMTE1MCwgICAtNDYwLCAgICAtOTcsCisgICAzOTUsICAgLTMwNCwgIDI3ODE2LCAgIC0zMDAsICAgIC0xNiwgICAgMTUzLCAgIC02NzEsICAgIDU1MSwKKyAgIDQzNiwgICAtOTU2LCAgIC0xODIsICAgIDE5NCwgICAgMTEzLCAgLTU1MDQsICAgIDE5NCwgICAgMjYzLAorICAtMzMyLCAgIC01MTcsICAgLTI0NCwgICAtMzk2LCAgICA1NDAsICAgICA1NiwgICAtMzcxLCAgICA0NDYsCisgICAxNDcsICAgIC02NiwgICAgICA3LCAgIC0zMDYsICAgMTQ0MCwgICAtMzA4LCAgICAzMjcsICAgIDY0NSwKKyAgIDU5NywgIC02NjQyLCAgICAgNzIsICAgIDM5MiwgICAtMTM4LCAgICAtNTAsICAgLTE0NCwgICAtMjYyLAorICAgNTA0LCAgIC0yMzAsICAgIDExNCwgICAyMDc2LCAgIDgxNzUsICAgMTE4OCwgICAgMjkwLCAgIC04NzIsCisgICAyMDIsICAgICA2OSwgICAgIDgyLCAgIC0yODEsICAgLTEyNiwgICAtMjkxLCAgIC0xNTgsICAgLTE1MiwKKyAgIC00NSwgICAgMjM5LCAgICAxNTMsICAgLTUxNiwgICAtNDIyLCAgIC02OTEsICAgIDgwMSwgICAgIDI4LAorICAgNDk2LCAgIC0yOTgsIC0xMTExOCwgIDEwNDMwLCAgIC0yMjcsICAgLTg1MSwgICAgMjE0LCAgIC04MDEsCisgICA1MzgsICAgIDgzNCwgICAtMTM3LCAgICA5NDIsICAgIDU3MywgICAgNDA1LCAgIDEzMDgsICAgMjIzNCwKKyAgIDMwMCwgICAxMjY5LCAgMTIzNjEsICAgLTc1MiwgICAyMTc3LCAgIC03NDMsICAgICA2MCwgICAgNDY0LAorICAgOTQ2LCAgICAzMDIsICAgLTQyMiwgICAgMTE2LCAgLTEyMDAsICAgLTExMCwgICAtODQzLCAgICAyODQsCisgIC01NzgsICAgIDczMiwgICAtMzA4LCAgICAxNTMsICAgIC02NCwgICAgMTU2LCAgICAyMjUsIC0yOTIzMiwKKyAgLTQ1MiwgICAtNDY2LCAgIC0xMzAsICAgIDg4OCwgICAgMjQwLCAgICAzMDUsICAgIC04MywgICAgMjM2LAorICAgMjA4LCAgICA0MTcsICAgMTUzMCwgICAgMjk0LCAgICA1OTQsICAgIDM1MSwgICAgNTA4LCAgICAxMzcsCisgLTcyNzQsICAgLTE4NCwgICAgMjAxLCAgICAgNDQsICAgLTYzNSwgICAtODkxLCAgIC02NTIsICAgLTU5NiwKKyAgIDM4MCwgICAtNjUyLCAgLTg2NzAsICAgIC03NiwgIC0zNzQ2LCAgIC03MzIsICAgIDI2MiwgIC0xODYwLAorIC0xMDMwLCAgIDEzNjYsICAgLTI3OSwgICAgNDQ0LCAgICA5MTEsICAgIDIwOSwgICAgMzMwLCAgICAyNTEsCisgIC0yMDgsICAgLTc0NywgICAgIDY1LCAtMTAxNTQsICAgLTIwNCwgIDEyOTYwLCAgIC0zMjUsICAgIDM0NywKKyAgLTQ2NSwgICAtNzMwLCAgIC03MjcsICAgIDM4NSwgICAgLTg5LCAgIC03NjMsICAgLTQyNywgICAgODY4LAorICAgLTM5LCAgIC04NTksICAgICAzNCwgICAgLTI5LCAgIC0zODgsICAtMTMyNCwgICAtMjE4LCAgIDIwNTEsCisgLTE1OTMsICAgNTUxMSwgIDEwNTA3LCAgLTg1MTYsICAgMjI1NCwgICA1ODQ3LCAgLTE0NzQsICAgMTk5NCwKKyAgNDcwNCwgIC0xODc2LCAgICA4ODAsICAtMzgxMCwgICAtNDg5LCAgIC05NDYsICAtMTIyNSwgIC0xMTA0LAorICAgMTI1LCAgICAxMzksICAgLTY2OCwgICAyMjMyLCAgIC01MzcsICAgIDE3OSwgICAtMjE1LCAgICAgNjMsCisgICAxNDQsICAgICA3MiwgICAxMTk4LCAgIDk3NTAsICAgIDI0OCwgICAtNzA5LCAgICAzMDgsICAxMDU1MiwKKyAgLTQzNCwgICAtNDYyLCAgMTM1NjksICAgMTA5NiwgICAtNDkxLCAgIC0yNjIsICAgIDgwNCwgIC0xNTk5LAorICAgNjc5LCAgICA1NjksICAgIDYwNCwgICAxMzI2LCAgICAyMTMsICAtMjAyNiwgICAgMzI0LCAgLTI2MTIsCisgIC0zNzMsIC0xMjgxOCwgICAgLTIwLCAgICAgMzgsICAgLTE3MSwgICAgMzE2LCAgMTU1MTYsICAgIDMwNiwKKyAgIDc2MywgICAgIDk3LCAgICAgOTEsICAgLTgzMiwgICAgIDIzLCAgIC00MzcsICAgLTM5MCwgICAgNTA1LAorIC0xMjI2LCAgIDI1MTgsICAgIDEwNiwgIC0yMDY1LCAgICAzMTUsICAgICA4NiwgICAgNTIzLCAgICAxNzIsCisgLTEwMTIsIC0xMzg1MSwgICAzMzU4LCAgIDI2MTAsICAgLTM4MSwgICAtMTk0LCAgIDEyMDAsICAtNDEwNiwKKyAtMTI5OCwgIC0zNjM3LCAgLTE1MzQsICAgIDc4MCwgICAxMzY3LCAgIC01NDQsICAgLTc3MCwgICAxNjkwLAorICAxMDQ3LCAgICAtNTQsICAgMjEzNiwgIDEyNTAyLCAgICAgMzIsICAgNjY4OSwgICAgNzA2LCAgLTExNzIsCisgICA4NDYsICAtNDg1MywgICAyMTQ2LCAgIDI1NDgsICAgIC0zOSwgICAtNDY1LCAgIC01OTYsICAgIDE3NywKKyAgIDIxMywgICAgNDIxLCAgICAgMjgsICAgLTM4OCwgICAgIDExLCAgICAgNjksICAgICAzMSwgICAgLTgzLAorICAgLTI4LCAgIC0xNjYsICAgLTE1MCwgLTE5ODM2LCAgIC0zMjMsICAgICAgMywgICAgNjU5LCAgICA3ODMsCisgICAzOTAsICAgIDEzOSwgICAtMTM4LCAgICAgMzEsICAgLTExMSwgICAgNDUzLCAgICAtODAsICAgIDQzMiwKKyAgLTUxOSwgICAtMjU5LCAgICA2ODYsICAxMTQzMSwgICAgMTYzLCAtMTMxNzksICAgIDU1NCwgICAgIDQwLAorICAtMzc5LCAgIC0xMjAsICAgLTY5MiwgICAgMzQwLCAgICAxNjksICAgIDEyMCwgICAtNDc2LCAgICA2NDMsCisgICA3NzgsICAgIDUwMSwgICAtMTI4LCAgICA1NDMsICAgMTI3NSwgICAtMTM0LCAgMjA1NjgsICAgIDIwMSwKKyAgIDQwMSwgICAgNTEyLCAgIC0zNjIsICAgLTIxMCwgICAtMjY5LCAgIC04MTIsICAgIDExMiwgICAgIDc1LAorICAgMTQ5LCAgIC01NDcsICAgLTQ5NCwgICAtNDE4LCAgIC0xMDAsIC0xMzYyMSwgIC0xMDAyLCAgIDExNzYsCisgIDE2MzQsICAgLTM5NSwgIC00Mjg5LCAgLTE1MzEsICAgIC00NywgICAgODUwLCAgLTExMDIsICAxMzU1OCwKKyAgLTQwMywgICAgNjgzLCAgIC0xNjQsICAtMjIxNSwgIC0xMTgwLCAgLTE3NTAsICAgIDM0NCwgICAgNjMwLAorICAtOTY4LCAgICA2NjksICAgIDU0MCwgICAgIDI2LCAgIC01OTQsICAgIDE5MiwgICAgLTE3LCAgIC0zMzYsCisgMTk2NDUsICAgMTEzMywgICAgIDE4LCAgICAtNTYsICAgIDQxOCwgICAtNDI2LCAgLTE1MzUsICAgIDQwOSwKKyAgIDczMiwgICAgMTg2LCAgICAyNjgsIC0yMDQyMiwgICAgLTIyLCAgICAgNjIsICAgLTYyMSwgICAgNzIyLAorICAgNDQwLCAgICAgOTYsICAgLTMwNywgICAtMTI4LCAgICA0ODAsICAgICAgNSwgICAgIDg3LCAgICA2NjgsCisgIC0zNjEsICAgLTU5OSwgICAgLTIyLCAgICA2NTIsICAgLTE3NiwgICAtMTE0LCAgICAyMTQsIC0xMjIzMywKKyAgLTY5OCwgICAgMjMyLCAgICA2MDgsICAgLTEyNiwgICAtNzE0LCAgIC00ODgsICAgLTIyOCwgICAgOTI5LAorIC0xNTgyLCAtMTk4NDUsICAgIDI0NSwgICAtNDYwLCAgICAxMjQsICAgICA1NywgICAgMzI4LCAgIC00MzYsCisgIC0xNTgsICAgIDIzNiwgICAtMTk2LCAgIC01MzQsICAgIDIwOSwgICAgIDY5LCAgICAyMjksICAgIDIxMCwKKyAgLTI1MSwgICAxMTAwLCAgICA1ODMsICAgIDQxNSwgICAgMjEwLCAgICAxODksICAgLTIxOSwgICAxMjQyLAorIDE5NDgyLCAgIC0xMDUsICAgIDE5MCwgICAtMzc0LCAgICAtNDMsICAgLTIzMiwgICAgMjUzLCAgICA1NjEsCisgIC0yOTcsICAgLTM3NiwgIC0xMDc3LCAgIC0zMDgsICAxMzQ4NiwgLTEyNDYyLCAgICAgNjQsICAgLTE5MCwKKyAgLTI5OCwgICAtNjQzLCAgICA0NjAsICAgIDIzMiwgICAtOTg3LCAgIC00NzgsICAgMTU5NiwgICAgMTY4LAorICAtNzIyLCAgICA2MTYsICAgLTg3MywgICAgLTk4LCAgIC05NDgsICAgIDIzMSwgIC0xMTAyLCAgMTE5MTUsCisgICA3NDYsICAgLTQ5NSwgICAxMjQ4LCAgIDEyMDMsICAxMTA2NywgICAgLTMyLCAgICAxNjAsICAgIC05NCwKKyAgIC0yNCwgICAtMTUzLCAgIC0yMDksICAtMTQ1MywgIC0xMDU5LCAgIC0zMTMsICAgLTkyMiwgICAxMTQzLAorICAtNTM4LCAgLTEzNDgsICAgLTMyMywgICAgNjc5LCAgICAtNTQsICAgLTIzMiwgICAtNDcwLCAgIDIwNzUsCistMTkxMzUsICAgIDYyOCwgICAtNzc0LCAgICAgMzUsICAgIDI0NywgICAgLTg2LCAgICA3MjEsICAgIDUxMiwKKyAgMTMwNSwgICAgODUwLCAgIDk3NjAsICAgIDI0OCwgIC0yNDA0LCAgIC0yMjAsICAgICAgNiwgICAgLTczLAorIC0xMzcwLCAgICA1NjcsICAgMTQzMiwgIC0yNTI5LCAgLTE1MDgsICAxNDM1OCwgICAtOTkyLCAgLTExMTEsCisgIC05NDAsICAgLTExMSwgICAgOTY4LCAgIC01MzAsICAgIDU3NiwgICAgMTAyLCAgLTEwNDUsICAgIDQ1MywKKyAgIDE4MCwgICAgLTk0LCAgLTc5MzYsICAgLTMxMCwgICAgNTEyLCAgICA5OTYsICAgIC0zMiwgIC0xMDYyLAorICAtMTUwLCAgICAtMjYsICAtNjY4NywgICAtMTgxLCAgIC0zMzYsICAtMTUxMCwgICAgNjE2LCAgICAgNzAsCisgIC0zMzIsICAgLTE3NSwgICAgNjI0LCAgIC01NDYsICAgIDE3MSwgICAgMzY0LCAgIDEwMTEsICAgICA2OCwKKyAgLTI4NCwgICAtMzY4LCAgICA3MTEsICAgICA0NiwgICAgIDczLCAgICAtMzQsICAgLTQxOSwgICAgNDA0LAorIDI4MjcwLCAgICAyODMsICAgLTMyNCwgICAgMzM1LCAgIC0xMzEsICAgIDMxNiwgICAgMjEyLCAgICAtMjcsCisgIC0zNDIsICAtMTA2MiwgICAgNDcwLCAgIDEyNjksICAgIDQ1NCwgICAgMjg2LCAgLTE5MjgsICAtMTY3NCwKKyAgLTczOSwgICAtMzg5LCAgIDEwNzMsICAtNjE3MiwgICAtMzE3LCAgIC01ODYsICAgLTE5NCwgICAtMTgyLAorLTEzMDM0LCAgIC04NDgsICAgNDU5NiwgICAtNjU5LCAgICA3MDksICAgLTYzMCwgICAtMzEwLCAgICA0MDAsCisgICAzNDQsICAgLTI3NiwgICAgNDMwLCAgICA4NzYsICAtMjA0NywgIC0xMDEyLCAgLTE2NzIsICAgLTE4MCwKKyAgICA2NCwgIDIyMDA1LCAgIC03MzYsICAgIDgyOSwgICAgMjY2LCAgICAxODIsICAgIDQzNiwgICAtMTEyLAorICAgLTM2LCAgICAxMzEsICAgIDI1MiwgICAgLTYzLCAgICAxNTQsICAgIDM2OCwgICAgMTA3LCAgICAgOTMsCisgICAtNDIsIC0zMjc2OCwgICAgICAwLCAgICAyMDAsICAgLTIzMCwgICAgMjcxLCAgLTE3NzYsICAgNDMyOSwKKyAgIDk4NiwgICAtNTUzLCAgICA0ODEsICAgMTg4OCwgIC0yNzcwLCAgICA4NDgsICAtNjMwNSwgICAgMjY0LAorIDEyMjQ0LCAgIDE2MTAsICAgLTY0MCwgICAxMzQ4LCAgLTI3NDIsICAtMjA3OCwgICAgOTA3LCAgLTExMTUsCisgICAzNzAsIC0xNjUzOSwgIC0xNTcxLCAgIC0xNzYsICAgICAyNCwgICAtNTE1LCAgICAyMzQsICAgIDk1NCwKKyAgIDYwNSwgICAgNjEzLCAgIC0xNTQsICAgIDQ2MywgICAgNTM1LCAgIC0xNjAsICAgIDY4NCwgICAgNDcwLAorICAgODI3LCAgMTA0NTgsICAgIDE1MCwgICAtNjY5LCAgLTY2ODQsICAgIDMzOSwgICAtNTQyLCAgIC03MzAsCisgIC0zNTEsICAgIDk4NCwgICAgMjEyLCAgICAxMTYsICAgICAtNywgICAgIDYyLCAgICA5MjYsICAgMjE3NSwKKyAgLTE4NSwgICAtNTUyLCAgICA0ODksICAgLTIwOSwgICA1MjQ3LCAgICAgMzgsICAgIDM2NiwgICAgIDUzLAorICAgIDE2LCAgICAyNjMsICAgLTE0MiwgICAtNTM1LCAgIC0yMjQsICAgIDMzOCwgICAtMTc0LCAgIC0xMjUsCisgICAxMTMsIC0xMjc1MCwgICAgNDAwLCAgIC00MTAsICAgIDI4MSwgICAgLTEyLCAgICA3NDQsICAgLTE3MywKKyAgIDQ4NiwgLTEyMTU5LCAgIC0xMDcsICAgLTE4MywgICAtNDg0LCAgICAgIDIsICAgIDE1MCwgICAgICAxLAorICAtMjM5LCAgICAgIDcsICAgLTM5OSwgICAtNjA4LCAgIC04NzMsICAgIDY5OCwgIC0xNjIzLCAgICA3MDEsCisgIC03NzMsICAgIDI3MiwgICAtODMyLCAgICAtOTQsICAgLTkyMSwgICAgODg1LCAgMTM1ODgsICAgIDE3OCwKKyAgIDE5MiwgICAgMTQ4LCAgIDEzNDYsICAgICA0NCwgICAgIDU5LCAgIC0yNzUsICAgIC0xNCwgICAtMzI4LAorICAgMjEyLCAgICAxMzMsICAgLTIyMywgICAgMzAwLCAgIC0zOTQsICAgLTI3NSwgICAgLTQzLCAgICAtNzYsCisgICAtNDcsICAgIDMyMiwgICAtMjA4LCAgMjE3MTMsICAgIDQ4NCwgICAgMzI5LCAgIDE4NjAsICAgICA0MCwKKyAgLTkxNiwgICAgNTAyLCAgICAxMzAsICAgIDQ3NywgICAxNzU0LCAgICA1MDMsICAgNzk4NCwgICAtMzM4LAorICAtMzIzLCAgIC0yMzAsICAgIDM1NCwgICAgOTI4LCAgICA0MzAsICAgIC04OSwgICAgLTk0LCAgICAxMDgsCisgIC01NDMsICAgIDM2NSwgICAtMTMwLCAgICAgNzAsICAgIDkwMiwgICAtMTMxLCAgICAgNTgsICAgIDQ2OSwKKyAgIDU4MCwgLTMwOTQ5LCAgICAgMzYsICAgIDIzMiwgICAtNDEwLCAgIC00NTEsICAgIDEwNCwgIC04Njk4LAorICAgMTEzLCAgLTE2ODIsICAgIC00MiwgICAtMjc5LCAgICAtOTIsICAgLTI4MCwgICAtNDc3LCAgIC0zODYsCisgIC01MzEsICAgIDgzMiwgICAgIDgwLCAtMTUwMDIsICAgIC01NiwgICAgIDkzLCAgICAxNjQsICAgLTcyMSwKKyAgODM4OCwgICAtNDEyLCAgLTIzOTYsICAgIDU4NCwgICAxMDA0LCAgIC0zMTAsICAtMjIyOSwgICAtMzA0LAorICAtMzgzLCAgICAyNzUsICAgMTA2MiwgICAxMjY2LCAgICAyOTcsICAgIC03MCwgICAtOTA5LCAgICA4OTEsCisgICAxMzEsICAtMTA0NiwgICAgNTM5LCAgMzI1MDIsICAgMTAwMCwgICAgLTIxLCAgIC0yMjksICAgIDEzOCwKKyAgMTUyOCwgICAtMTc1LCAgICA1NDYsICAgIDMyNiwgICAgMTY4LCAgIC0zMjAsICAgIDcxNiwgICAtMjkxLAorICAtMjk4LCAgIC0yMjcsICAgMTA5NCwgICAgLTU5LCAtMTI1NjEsICAxMjk0MywgICAgNzg2LCAgICA2MDAsCisgIC0yMDYsICAgIDg4OSwgICAtNzYxLCAgICAgNTQsICAgIDMzMiwgIC0xMjUzLCAgIC01OTcsICAgIDM1NywKKyAtMTEyNCwgICAgLTUwLCAgIC0xNjgsICAgMTE3MiwgICAyMjY2LCAgICAgNzUsICAgLTE3NCwgICAgNTgzLAorICAgNDA4LCAgIC0xNTcsICAxNDY2NiwgICAgMzc4LCAgICAzMDIsICAgICAtNSwgICAgIDQ4LCAgICAxMDksCisgICAgMjgsICAgIC0yMSwgICAxMDQ0LCAgICA1MjksICAgLTg1OSwgIC0xMTgyLCAgIC0yMDIsICAgMTk4NCwKKyAgIDMwOCwgICAgNDAyLCAgICAgNjYsICAtMTEzOSwgICAyNTk1LCAgIC0zODAsICAgMTExOSwgICAgMzA5LAorICAgNDgyLCAtMTA3MDUsICAgIDEwMCwgIC00NTkxLCAgMTE2NDYsICAtMTM2NCwgICAtMzY1LCAgIDk1MjEsCisgIC0zMTgsICAgIC0yMywgICAxMDc2LCAgIC0xMzUsICAtMjc0MiwgICAtODMzLCAgICAgNzgsICAgIDkxMCwKKyAgICA5NiwgICAgLTIwLCAgIC01OTksICAgICA0NiwgICAgODU1LCAgLTEyNjUsICAgNDc0OCwgICAyMzk0LAorICAtMjUwLCAgLTkwOTYsICAgLTk2MiwgICAgMTkxLCAgIC0zNDYsICAgIDM0OCwgICAgMzQyLCAgIDE5MDksCisgMTUzMzAsICAgIDI2NiwgICAgNTQwLCAgICAyNzEsICAgMjk4NiwgICAxMzU2LCAgIDE1NDIsICAtMTAxOSwKKyAgLTg5NSwgICAgNzM3LCAgICAyODEsICAgIDY4NCwgICAtNTM4LCAgMTA0MTQsICAgLTkyMiwgICAgMjg3LAorICAgNjc5LCAgICAyMDQsIC0xMTE0MiwgIC0yMzIxLCAgIC0zNDYsICAtMTU3MiwgICAtMjUwLCAgIC0zMTUsCisgIC02MDQsICAgMTMzNiwgICAgMzExLCAgIDEzMTcsICAtMTExMSwgICAgNDA5LCAgIC0xMDQsICAgLTIyMSwKKy0xNDEyNSwgIC0xNTExLCAgIC05OTAsICAgIDcwNSwgICAtODA4LCAgICA1ODcsICAgIDY3NiwgICAgMzQ4Cit9LAorCisuY2IwODA4czAgPSB7CisgLTc0ODgsICAtMTMyNywgIC01MjQ0LCAgLTIwNDksICAtMzczNiwgICAgLTQ1LCAgICA0NDYsICAgMTU1OCwKKyAgLTc1NSwgIC02MDUyLCAgIDYwMzQsICAtNDMyNiwgICAgNzQwLCAgIC0zNDgsICAxMjM2OSwgICAyMTE1LAorICAtNjYyLCAgIC02ODUsICAtNjU5MiwgIDEwMTc2LCAgIDg1NzUsICAtMTAzNSwgIC0yNzUyLCAgLTQ0NTMsCisgIC0yODMsICAgMTU0NywgICA0Nzc2LCAgLTI5MzIsICAgIDcwMCwgICAzNDI1LCAgLTM5MDUsICAgMTA3MywKKyAgMjM1NiwgIC03MDk0LCAgLTE3MDUsICAgLTQzNSwgICA0ODQwLCAgLTE5NDQsICAgMTE4OCwgICAgNzgwLAorIC0zOTYzLCAgLTYxNzAsICAtMTcyNiwgICA0NzU5LCAgLTQzNTYsICAtMjEyNCwgIC0xNjg2LCAgICAzMjEsCisgIC05MDEsICAgMTQxNCwgICAtOTIzLCAgLTI2NzgsICAtMTE5OCwgLTE0Nzc3LCAgLTIwMzgsICAtMzUyOCwKKyAgIDEyMywgIDExMjE2LCAgIDE5MDQsICAtMTkxNCwgICA3NTg4LCAgIDI3NDQsICAtNDI2NSwgIC00ODg2LAorIC0zNTMwLCAgLTE0OTUsICAtMTcwOSwgIC01ODU3LCAgIDM4MjksICAgMjE5NiwgIC00ODQyLCAgIC04MTcsCisgIC04NzQsICAtNTY0OSwgIC0yMTgxLCAgLTM4NzEsICAgMzc3NCwgIC0xMzY4LCAgICAzMjIsICAtMTEyNiwKKyAgLTk5NiwgIC0zODczLCAgMTM2OTgsICAtOTM2OSwgICAtODQ4LCAgIDM3OTcsICAgLTY2NywgIC0xMDgzLAorICAyNDI5LCAgLTMzNTEsICAtMTY3MiwgIC0zNTYyLCAgLTE1OTAsICAtMzUwNywgICAgNTUyLCAgIDY2MTAsCisgLTQxMzcsIC0xMDA2MSwgIC01NDUyLCAgLTYxNDIsICAtMTQ1NCwgICAxNzI2LCAgLTEyOTgsICAtNDQ3OSwKKyAgNjEyNiwgICAxNjI2LCAgLTI3OTEsICAgMTU4NCwgICAxMzAwLCAgIDU3MjYsICAgMjU4NCwgIDExMTA5LAorICAgNjk2LCAgLTMzNDQsICAtMjQxOCwgICA5MDI5LCAgIDQzNDYsICAtMzU1NCwgICAxMzkzLCAgICAxNDQsCisgIDIwNTEsICAgODkxNiwgICA2MTc0LCAgIDUxNzAsICAgIDM3NiwgICA5Nzc4LCAgLTIyOTgsICAtNDExOSwKKyAgMzczMywgICAgLTM1LCAgLTI2NzMsICAgMjIyMiwgICAxMzgzLCAgIDIwNDYsICAgMjg1OSwgLTE2MTMxLAorICAxNjM3LCAgLTExOTUsICAgLTY2MiwgICAyODAwLCAgLTIyNDEsICAgMzgwMSwgIC01MDYyLCAgIC05NzgsCisgIDU2NzAsICAtNTQ0OSwgICAgLTc5LCAgIDM0NzksICAgIDYwNiwgICAzNzY2LCAgLTEzMjUsICAgLTI2NSwKKyAgIDkwNywgICAtNzQ1LCAgIDEwMDUsIC0xNDUyOCwgIC00MjI3LCAgLTM5NTUsICAtNzE5NCwgICAzNjkwLAorICAyMTY2LCAgLTI1MjAsICAxMTU1NSwgICAtNTExLCAgIDU5MDAsICAgLTM4OCwgIC0zODU0LCAgLTM0NDAsCisgIDIxMzYsICAgLTg2OCwgIC0yOTg2LCAgICA3MjIsICAgMTI4NiwgIC00MDI3LCAgMTAzODIsICAtMTY0NiwKKyAgNTE5MywgICAyNTM5LCAgIDEyMzksICAgNzgxOSwgICAgLTY3LCAgIDMzODIsICAtMzI5NywgICAgLTQ2LAorIC0zODA4LCAgICA4MzAsICAgMTMxMywgIC0yMTg4LCAgLTQzNDYsICAgNTkyMiwgIC0xMDU3LCAgLTYyOTQsCisgMTQzMTcsICAgMjAwMSwgICAgOTY4LCAgIDQxNTAsICAtNDEyMSwgICAxNDEyLCAgIC0zMDIsICAtODQwMSwKKyAtMTM4OCwgIDEwNjQ5LCAgLTk1MTMsICAgMTA0MiwgICAgODQwLCAgLTQ2MDYsICAgMjA5OCwgICAxMTY2LAorICAxNDcyLCAgIC04MDIsICAtMjgxMCwgICAgNDIwLCAgIC01NjEsICAgLTMyNSwgICAyNjUyLCAgLTI4NjYsCisgIDEzMzQsICAgNDg3OCwgICAgOTU4LCAgICAgODMsICAgIDQ1NiwgICAxMjAzLCAgLTc1OTQsICAxNDU5MCwKKyAtMTIxMCwgICAyMjAyLCAgLTE5NTQsICAtMTkzOCwgIC0zNDEzLCAgLTEwOTYsICAgNjAzNiwgIC0xNjc1LAorIC0xMzIwLCAgLTQ0ODUsIC0xMDY2NSwgIDEwMDI2LCAgLTI0ODQsICAtMzI3MywgICA0NzUzLCAgIC0yNzUsCisgLTM1NDIsICAgIDkyNCwgICAxMjYyLCAgIDczNDgsICAtMjk1OSwgICAtNzQ5LCAgIC00MDgsICAgNDU5NCwKKyAgNDg3NiwgICAtNDkxLCAgIDM0MDksICAgNDYxNiwgICAgMTEwLCAgICA1NTcsICAtMTM3OCwgIC0xNjE2LAorIC00NTMyLCAgIDE2OTksICAgMTQxMiwgICAgNTc5LCAgIC00OTQsICAgIDcxNiwgICAgMTk3LCAtMjMzNDYsCisgLTIyODQsICAgIDE1NiwgICAxMDk2LCAgIC0xNTEsICAtMTgyNywgICAgNjg4LCAgIC0zMjIsICAgMjM3MSwKKyAtNzkwOSwgIC0xMzI0LCAgLTE2ODMsICAgNzg2MSwgICA3MDc0LCAgIC00NTEsICAgIDI1OCwgICA5MDg4LAorICAxOTAwLCAgIDg2NjAsICAgIDg0MCwgICAzNDkxLCAgLTMyNzUsICAgMzAyOSwgICAtNDc1LCAgLTIxMjIsCisgLTU3MjUsICAtODY2OCwgIC02MDY5LCAgLTM0NTgsICAgNDI0MCwgIC0zMDA3LCAgLTU0NjMsICAgOTM5NSwKKyAtMjY4NiwgICA0NzE4LCAgIC03MTcsICAgICA0MiwgIC0xODAyLCAgIDMxMjIsICAtMzE5NywgIC01MjEyLAorIC0xNTcyLCAgIC0yNDMsICAgLTQ1MSwgICA4MjEzLCAgLTIxOTksICAtMzM3MiwgICA0MTEwLCAgLTgxNzYsCistMTA1MjUsICAtNTU1MSwgICA0MzEyLCAgICA2ODIsICAgMjA2OSwgICAxOTg1LCAgLTM3MTMsICAtNjc4MCwKKyAgMTE5MywgICAyODMxLCAgLTIyMjgsICAgIDQ4NiwgIC0zNjY3LCAgIC03ODksICAtMTY5MSwgICA0NTY3LAorICAgNDY0LCAgLTIxMTQsICAtMjM0MCwgIC0xODgxLCAgIDE5MjEsICAgMTYwMiwgIDE4NDE4LCAgIDE1MzUsCisgIC01NjcsICAgIDIyOCwgIC05MzU5LCAgLTYwMjcsICAgLTI2NywgICAzNjI4LCAgMzI3NjcsICAgMTQyMywKKyAgIC03NCwgIC0yODE3LCAgIDIxMTIsICAgLTEyOCwgIC0xNTE2LCAgLTI0NDYsICAgMTY3MywgICAyODEyLAorIC0xNTgyLCAgIDIxMjUsICAgIDYxOCwgICAyNTY5LCAgIDI3MTQsICAtMTcxMCwgICAgMzQwLCAgIDMyNTUsCisgICA4NDgsICAgMzM3OSwgIC0yMzE3LCAgLTIzNjEsICAtMTgyMywgICAgNDEyLCAgLTI0OTYsIC0xODE2NCwKKyAtMTIyNCwgICAyNTUyLCAgLTMwNDAsICAgIDE0NCwgICAtNTk3LCAgIDc3MTYsICAgNDkxNiwgIC0yODY3LAorIC0yMTcyLCAgIDIxMjAsICAtMjc3NiwgICAgNjc1LCAtMTE5ODUsICAgMTY5MiwgIC0xMzg0LCAgLTM1ODgsCisgIDQzMTAsICAgMTAyMCwgIC00MjE1LCAgIC0yNTEsICAtNzA5MCwgIC0xOTE2LCAgIDE5MTQsICAtMjgwNCwKKyAgNjE4OSwgIC02NzMyLCAgLTEzNzAsICAtMzcwNCwgICAgNDUwLCAgLTI2NTIsICAgNjU1MywgICAgLTM4LAorIDEwMzQ4LCAgIDEyNDQsICAtMjI0NiwgIC0zNzI5LCAgLTIxNTgsICAtMTM0MCwgICAyMzU3LCAgIDMxMTgsCisgIDkzNzgsICAtMTcyNywgICAzMTUwLCAgLTM4NjcsICAgMTI3NywgICAgLTE1LCAgICA3NjksICAtMjM1MiwKKyAgLTQxMSwgICAxNDI4LCAtMTQwMzIsICAtMTAyOSwgICAyODI4LCAgLTE4OTQsICAgNjA4NCwgICAgLTM2LAorICAgNTE4LCAgMTMxNTksICAgMTA5NSwgIC0xMTg1LCAgLTMyMDcsICAgLTU1NSwgIC0zMjU2LCAgICAtNzYsCisgIDM4ODQsICAgMzM5NCwgICAxMDEwLCAgIDE5NDYsICAgIDE2MCwgIC00ODYzLCAgIDQ3MTQsICAtNzA4NywKKyAtMzk4NSwgICA1NjAyLCAgIDMzNTAsICAgNzgyMiwgIC01NzI5LCAgLTc3MDEsICAgOTI5NiwgICAzMDY3LAorICAzNTgyLCAgIDUyNTYsICAxMzYyOSwgIC00MDEyLCAgLTIyMDYsICAtMzg2NywgICAtNjY0LCAgIC0xMDQsCisgIDQzOTcsICAtNzg2MiwgICAgIDM2LCAgICA5NTUsICAgIC0zOCwgICAtOTczLCAgIDM0NTgsICAgNTAwNCwKKyAgIDM2NCwgIC05MTE2LCAgLTI3NjQsICAtMjE2OCwgIC0xODkyLCAgLTc2MzIsICAtNDgzNCwgIC01Nzg4LAorIC0zNTY1LCAgLTEyNDUsICAtNDU0NCwgICA2NTUyLCAgIDQ2MDEsICAgMjM0MiwgICA2NjI1LCAgIDEwNDAsCisgIDIxNTQsICAtNjk4NSwgICA1ODM4LCAgLTE5MTIsICAtMzQzOSwgICAxMTg5LCAgLTI0MjIsICAgLTU1NSwKKyAgMzI4NiwgLTE0ODcyLCAgIC03NzYsICAgMTIyOCwgICAyNDM0LCAgICAxMjAsICAxMzY3MywgICAgOTA0LAorIC0xMzU0LCAgICA2NDUsICAtMTU1MCwgIC0xMzc3LCAgLTE4ODgsICAgMTQxNiwgICAtNjc5LCAgLTE2ODUsCisgIDE3MzEsICAgMjQwNCwgIC01Nzg2LCAgIDMyODUsICAgLTE5MywgICAtMTIzLCAgIDE5NzMsICAgMzY2MywKKyAtMTM4OCwgLTE0OTYxLCAgLTM1OTcsICAgNTU1NSwgIC0xNDIwLCAgICAyODQsICAgMTUyNywgIC0yNTc1LAorICAxOTQxLCAgICA4NzEsICAgMzkwMCwgIC0yMTY4LCAtMTI3NjMsICAgMjk3MCwgICAtNDA4LCAgLTMxMzEsCisgLTY0MjYsICAgMTg5MiwgICAgNzgyLCAgIDY3NjgsICAgLTI4NCwgICAxMDM0LCAgIDk3ODUsICAgNjAyOSwKKyAtMzg3MywgIC00MTAyLCAgLTQzNDksICAgMjU0OCwgIC0zNjg2LCAgLTU2MjIsICAgNDc2OSwgICAtMzUxLAorICA4MTc4LCAgLTcyNTMsICAgMzY4NywgICAgNjI0LCAgLTQzODYsICAgNDAyOCwgIC0yNzgwLCAgLTE5MzgsCisgLTQwNjEsICAtMTg3MiwgIC0xMjY0LCAgIDczMDAsICAgIDc2MCwgICA4NTMwLCAgIC04MjEsICAgLTg3NCwKKy0xNDIyNSwgIC0xMTQzLCAgLTU0MDAsICAgLTg1MCwgIC0yNTM3LCAgICA0NzgsICAgMTY2OCwgIC0xMjQ0LAorICAtMzYyLCAgICA4NzcsICAgMzQ4MSwgIC0xMzM4LCAgLTUyMTgsICAgMjA5MSwgICAzOTk2LCAgIC01NzcsCisgICAzOTAsICAgODYyNiwgICAgODIwLCAgICAxODEsICAgLTk4OCwgICA1NjA0LCAgIDk2OTQsICAgMTExMiwKKyAtMzA2NCwgICAtMjY2LCAgIDEyMzQsICAgLTQ4NiwgICAxMjY0LCAgLTIxNzMsIC0xMzY3MSwgICAzNzI5LAorIC0zMjEyLCAgIDI1NDgsICAgMTc0NSwgIC05MzYzLCAgIDgwNjUsICAgMzcxMywgIC0zMzQzLCAgLTQ4NDcsCisgIDI4MDgsICAtNDcxNiwgIC0yMTc1LCAgICAgMjUsICAtNTcxOCwgICA0MDU2LCAgIDE4NTUsICAgNDY2MywKKyAgMjMyNCwgIC0xMTY2LCAgICA1NDMsICAgICAgMiwgICAzOTMxLCAgLTMxOTYsICAgMjc3MSwgICAtOTIwLAorIC0yOTA3LCAgIC03NDYsICAtMTI0MSwgICAtMzA2LCAgIDI3OTMsICAgIC0yMiwgIC0yNjQyLCAgIDMwNDgsCisgIDMyNTYsICAgMTgwNCwgIC0xMzEwLCAgMTc4NzYsICAtMTgxNiwgICAgIDU2LCAgLTE2OTQsICAgLTQ2NSwKKyAgLTUzNCwgIC0yMjc0LCAgIDYxMzksICAtMjI0NywgIC0yNTE1LCAgLTEwNzcsICAgMzMwNSwgICAxNTE5LAorICAgMjczLCAgIDExMjgsICAtMTYzNywgICAyNTYxLCAgLTE1MzQsICAgIDg3NCwgLTIyODA4LCAgLTExMTksCisgLTI1NTEsIC0xMDM0NCwgIC0yMjI5LCAgLTM1MTAsICAgIDE5NCwgICAyNTk0LCAgIDE3MzcsICAgNDcxMywKKyAxMzc2NywgICAzNTMyLCAgIC0zMTEsICAgODA5NywgIC0xMDEyLCAgIC04NDEsICAtNDM2MCwgICAgNzkzLAorICAtMjY3LCAgIC0yMDYsICAxMjkwNSwgIC0yNjgzLCAgLTY0MjQsICAgIDE5NiwgICA3MDk4LCAgLTE2OTAsCisgIC02OTAsICAgMTIzNiwgIC0yODgyLCAgLTI2NjgsICAtMjAyMCwgICA4MjkxLCAgLTI3MTQsICAtNDYwNywKKyAgLTkyMywgIC0yMDc3LCAgLTI4NzgsICAgMTY4NywgLTEwNDU3LCAgLTE1NzUsICAgMjE3MiwgIC0zOTc0LAorICA1Nzk1LCAgIDE3NDgsICAtMTg1MiwgIC01MTQzLCAgIDQ3NjMsICAtNTA5NywgIC0yODQwLCAgLTE4NTEsCisgIDI2MzQsICAgNTk3MCwgICAgMTgwLCAgLTMzMjYsICAtMTY1NSwgICAxMjI2LCAgICAzNzUsICAgNTEzNywKKyAtMjY3OCwgIC01MjQ2LCAgIDQzMjcsICAtMzY3MCwgICA5OTU2LCAgLTE5NzYsICAgMjE4OSwgICAyOTUyLAorIC02Nzg1LCAgIC02OTcsICAgMTEyOSwgIC01NzY4LCAgLTU4MTksICAgNjUzMiwgICAzNjUwLCAgLTE3MTEsCisgIDM4NTcsICAgICA0NywgIC05NjE4LCAgLTE5NDEsICAgMjUyNCwgIC0xMjQ0LCAgIDcyNDIsICAxMTY0NiwKKyAgIC02NCwgICAyMzA0LCAgICAyMDEsICAtMzcwNywgICAtNzAwLCAgICAxNDksICAgMjY5MiwgICAtODA1LAorICAzOTc4LCAgIDI3MzgsICAgLTk3NywgIC0xMDA0LCAgLTU3NzYsICAxMjc3OSwgICA3NDU0LCAgIC0zNTMsCisgLTQ3MzEsICAtMzg2NiwgICA3MDc2LCAgICAxNDYsICAtMzMwMiwgICAzMDY1LCAgIDE5NTUsICAgLTM0MywKKyAtMTQ1OSwgICAtNDI2LCAgLTU5MDYsICAtMTMxOCwgICAgNTAwLCAgLTEwMTQsICAtMTAwMiwgIC0yMDkwLAorIC0yOTI0LCAtMjA1MjEsICAgMjYxMCwgICAxNTgxLCAgICAzOTcsICAtMzM4MCwgIC0yODg1LCAgICA1MTAsCisgLTExNDcsICAgMzM5OCwgICAxOTE0LCAgICAgOTksICAgLTExOSwgICAgMTQ0LCAgLTMxMjgsICAgMjQ0NSwKKyAgMTc5MSwgICAgMzk3LCAgIDM3MzQsICAgIC04MCwgIC0zNDEwLCAgLTM3OTgsICAtMTE0MiwgIC0xNTE1LAorIC0yNjE1LCAgLTE1NDAsICAgNTE5MywgICAyMTg3LCAgICA5NDAsICAgNDk2OSwgIC0yMzM0LCAtMTY1ODksCisgICAzMjUsICAtMjE4NiwgIC00NTY3LCAgIDUxMjEsICAgLTg5NCwgIC02ODQ4LCAgLTYwMDIsICAgMTgzMiwKKyAgLTU2OCwgICA4MjU5LCAgICA4MzMsICAgMzQyMCwgIC00NDU5LCAgIC03NDgsICAgMzQ0MiwgICA0MzU4LAorIC0zMDQxLCAtMTAyMDMsICAgOTMwMywgIC0xNTExLCAgLTQ4MjEsICAgMTk1MCwgICAtOTY2LCAgIDM1NzMsCisgICA0NTMsICAgIDcwNSwgIDE2MjM4LCAgIC05MDEsICAgLTE2MywgIC0yODY2LCAgIC0xMDQsICAtMTc2NywKKyAtMTc3OSwgIC0xMjQ5LCAgIDMyNTEsICAgMTk3NSwgICAxMjU0LCAgIC04MzgsICAgLTM5MCwgIC0zMTUwLAorICAxMDIwLCAgIDI1MjYsICAtMjAyNSwgICAgNjYyLCAgLTI4MTcsICAtMTMzOCwgICAtODU1LCAgLTM0NDIsCistMjExMjMsICAgIDI0MSwgICAtMTM0LCAgIC05NTIsICAgLTU4OCwgICAyNTcyLCAgIDIwODAsICAgODE1MywKKyAgIDExNCwgICA5NzMyLCAgLTY3NzQsICAtNTI2NiwgIC0yNDYyLCAgIDIyODYsICAgLTU5OSwgICAtNDI2LAorICAxMzk2LCAgLTcwNTEsICAtMTIyOCwgICAgMzEyLCAgLTQ0OTUsICAtMjUyNSwgICA0NjQ5LCAgLTEzMDUsCisgLTExMDYsICAtMjM2NiwgICAyMjMyLCAgIDQwNjUsIC0xODY3NCwgIC0xMjk1LCAgLTMyNTksICAtMTAwNCwKKyAtNTEzNiwgICAgMjA2LCAgIDExNzcsICAtNTEzMCwgICAyMzk0LCAgIDI1MTgsICAtMTM4MSwgICAyNTY0LAorICAtMTM4LCAgIDQzNDEsICAxNjk4OCwgICAyNTQ2LCAgIDY3ODIsICAtMzQzMywgICAgODUwLCAgIC05NzAsCisgIC0yNTUsICAgMTMwOCwgICAyMjI4LCAgIDE3MDQsICAtMTI4MywgICAxNDUyLCAgLTI2MDgsICAgMTQ4NywKKyAgMzEwNiwgIC0yMjY3LCAgLTI5OTgsICAtNjgxNCwgICAxNjU0LCAgMjExOTUsICAgMTU1NSwgICAgOTY4LAorICAgMTU0LCAgICAxMjQsICAtMTI1OCwgICAgNzE0LCAgIC00MDcsICAgICA0NCwgICAgMjQ3LCAgICA5OTIsCisgIDIyMjgsICAgMjgyNCwgICAxNDM1LCAgIC0zNDEsICAgMTIxMiwgIC0xNjEyLCAgIDYxMjYsICAgMTYzNiwKKyAtODM2OCwgICAgNTc4LCAgLTU0MTgsICAgIDIxNywgICAtMTkxLCAgICAyMDQsICAtNzE0NywgICA1MTEwLAorICAzNzY2LCAgIDUwNTUsICAtNTk3OSwgICA2NjgzLCAgICAzNjgsICAtMzU5NywgIC00NTk1LCAgIDc2MzAsCisgLTM2MTEsICAtMjM4NCwgICAxMzY5LCAgIDY5OTUsICAtMzI5OSwgICAgLTUzLCAgIDIwMzYsICAtNDY1NCwKKyAgNDI1OSwgICA5NjE4LCAgLTEwMTIsICAtMjk2NCwgICA0Mzk3LCAgLTIxMTIsICAxMTg4NSwgIC0xNjQ4LAorICAtOTQyLCAgLTM0NzQsICAgLTU0NCwgIC0xNDEwLCAgLTE5NTgsICAtMTUzNSwgICAyOTgxLCAgLTE1OTEsCistMTY3ODcsICAgIDMzNSwgICA0NjA5LCAgLTE5OTAsICAgMzgyMSwgICAtNjQ1LCAgIDE4NDIsICAgIC02NCwKKyAtMzQ4NSwgICAzMjAyLCAgIC0zNzQsICAgIC01OCwgIC0xNDEwLCAgIDczMDQsICAtMTk1OCwgIC0yMTQyLAorLTExNDEyLCAgLTI1MzMsICAgIDUxMywgIC02MTQ5LCAgLTY2NzksICAgMjE1MiwgICAzMTUzLCAgIDUxMDIsCisgIDIyMTYsICAtMTM2MSwgICAyMjYwLCAgIDQ4NjMsICAtNzAzMSwgICAxNTM4LCAgLTUyNTAsICAtMjUxMSwKKyAgICA5NiwgICAzMzM5LCAgLTM0NDcsICAtMzcwOCwgICA3MTY4LCAgLTQxNjgsICAgIDgzOCwgIC0zMTM0LAorICAzMjI4LCAgLTE1MzEsICAtNTU5OCwgIDE0MTI1LCAgICAyMDgsICAtMjE1MCwgICAgODE5LCAgLTEwODUsCisgMTIyODIsICAgNjcxNCwgIC0yNzc4LCAgLTkyNTIsICAtNTExNywgIC02NjIzLCAgLTE3MTEsICAtNDI1MywKKyAtNjMwNiwgIC0xMjkyLCAgLTEzNzAsICAtMTAyNywgICAtOTA4LCAgLTI4NjMsICAtMTgzMiwgICA0NjQ1LAorICAtNzIyLCAgIC0yODQsICAgLTE2MSwgIC01MTA2LCAgIDcxMTAsIC0xMjQ5NCwgIC0xNTE0LCAgLTU0NTMsCisgLTMzMDgsICAgMzUyMCwgICAxMTAxLCAgLTEwOTYsICAtMjMyNSwgICAtNzQ2LCAgICAtMzMsICAgMjY0NSwKKyAtNDQ1OCwgICAtNzk3LCAgIC02ODQsICAgMTUxNCwgICAxNzE2LCAgLTYyMDQsICAgNjU4MCwgIC0zNDI3LAorICAtNjUwLCAtMTA0OTMsICAgNDg2OCwgICA1ODMzLCAgLTIzODUsICAgLTI3NCwgICAxNTMwLCAgIDM4OTIsCisgLTE5NDAsICAtMTQxNSwgIC0yMzg5LCAtMTE0OTksICAtMjA2NCwgICAgOTM3LCAgIC0zMzMsICAgMTM2MSwKKyAtMTU4MywgICA1NDU4LCAgLTIyOTYsICAtMzI2MywgIC04MzQ0LCAgLTQyMzYsICAtNjM1NywgIC0yMzcyLAorIC0zMTE1LCAgIDEzMzYsICAtMjE4NCwgICAgMTk0LCAgLTQyNjIsICAtNzgzOCwgICA2OTQ2LCAgIDQ1MzUsCisgICA3NDksICAgNzMzMiwgICAgIDY3LCAgIC0zMjcsICAgIDI3MywgICAzMjExLCAgLTE4MjUsICAgLTM1NywKKyAgNzAzOSwgICAzMzQ2LCAgIDYyODIsICAgIDQ4OCwgIC0zOTQwLCAgMTAxOTYsICAgNjQ2MywgICAgMzI3LAorICA0NDA3LCAgICA5MDksICAgIDg4OSwgIC00OTQzLCAgIC02MjIsICAtNDA0OSwgICAyNTMyLCAgIDE4NzAsCisgICA2NTIsICAgMTc3OCwgICAgNjYzLCAgIDMwNjMsICAtMTAxMiwgIC0xMzkwLCAgIDQxNjIsICAyMDQ4NiwKKyAgIC04NiwgICAzMTY2LCAgICAzMjUsICAtMTkxMiwgICAgNTExLCAgIC02MzQsICAgMTI2MiwgIC00NzE5LAorIC0xNDkwLCAgIDY3NjcsICAtMzMxNCwgICAtMTI1LCAgIDQ0OTAsIC0xMDMzNCwgICA1Mzg2LCAgIDk5MzIsCisgICA3ODEsICAgIDI5MCwgICAyMTk4LCAgIDE2OTUsICAgMzc5MCwgIC0xODc4LCAgIDc3NjAsICAgLTMwMCwKKyAgMjAyMSwgICA1NTA4LCAgIDIyMDAsICAgIDIzMiwgICA3MTM4LCAgIDEzNzAsICAtMzI2OCwgICAzNDk2LAorIDEzOTM0LCAgLTEyMzAsICAtMjMwMywgICAgOTU4LCAgICAxNDEsICAgMzM0OCwgIC0yODY3LCAgIC05ODcKK30sCisKKy5jYjA4MDhzMSA9IHsKKyAgOTMxMywgICAgNzM0LCAgIDY2MTAsICAtMzYyOSwgLTEyMDIwLCAgIDUzMTcsICAgLTI0NCwgIC0xODU4LAorICAgICAyLCAgLTE4MTIsICAtNjQ4NiwgICAgODkyLCAgICA5MjYsICAgLTIzNiwgICAxMDE2LCAgLTEyNDksCisgIC00NjksICAgLTIzOCwgIC0xOTA4LCAtMTA1OTQsICAtNDcwNCwgICAtOTA3LCAgLTc3NDYsICAgMzg0NywKKyAgIDU2NCwgIC01OTU2LCAgIDMzOTUsICAgIDM3MSwgIC01MTM2LCAgIDQwMDEsICAgMTE4MCwgICAgNzY5LAorICAtNTU1LCAgLTE4NzIsICAtMjk0MywgIC0xNzQ0LCAgIDg2MjAsICAgMTQ4NSwgICA5OTAxLCAgLTEzOTIsCisgIDM0MjUsICAtNzk0MCwgICAgMTUxLCAgICAzNzYsICAgMTk4NCwgICAzMDMxLCAgIDM4MTUsICAgLTk3NCwKKyAgIDUzNywgIC03MDM4LCAgIDE5NjQsICAtNTYyNSwgICA0NDU3LCAtMTAyMTQsICAtMTc4NywgIC0yNzY4LAorIC04NTE0LCAgICAxNzYsICAtMzY5MiwgICA2NDQxLCAgIDMxNDgsICAgIDYwMiwgIC0yMDAwLCAgMTM3NjksCisgLTI3OTIsICAgMTEwNCwgIC0yMDY3LCAgLTYyMTksICAgMTUxNSwgICAtMjg4LCAgIDMyNDAsICAtNTQ5MCwKKyAxMTU4OSwgICAzNzQyLCAgLTIzNDMsICAtMTc1MiwgICAzNzAxLCAgIDc1MjUsICAtMTY3NiwgICAgODQ1LAorICA2ODk1LCAgIDI4ODQsICAgMzU0MCwgICAyNDU0LCAgIDEwMTAsICAgMjQ1NCwgIC01NzYxLCAgIDIwMzUsCisgIDMzNjksICAtOTYyOCwgICAtODYyLCAgLTcwNjAsICAgMTgwMiwgICA1Njc2LCAgIDIzOTYsICAgMjc1NywKKyAgNTg5MSwgICAtNzAxLCAtMTE4OTYsICAtNDA2MSwgICA3OTMyLCAgIC0yNzIsICAgMjU2MiwgICAgIDgzLAorICAgNTYwLCAgLTUxODAsICAtMjIyMywgICAtMzU2LCAgLTMzNDMsICAgMjg3NCwgIC0xMzcwLCAgLTc2MTIsCisgIDE3NzMsICAgMjAwNiwgIC00MjU4LCAgIDUzMTIsICAgIDM0MiwgICA4MTk2LCAgIDQ5MzksICAgIDUxOSwKKyAgMzU2OCwgICA0NDIwLCAgIDI3NjgsIC0xMTg3MiwgIC0zMDIxLCAgIDE4OTMsICAgMTY5MCwgIC01NDgzLAorIC04MTI5LCAgIDc1NDAsICAgLTExNiwgIC0yMDY0LCAgLTQ0NzMsICAgMTE0MSwgICAxOTMwLCAgICA2NTYsCisgLTc3MjgsICAtMjc0MiwgIC0zMjc2LCAgIDI3ODIsICAgMjg2MCwgIC02MDgyLCAgIDUxOTgsICAtNDc1MSwKKyAgLTQ4NiwgICAtNzg5LCAtMTY5MzIsICAgLTU2NiwgICA1MTE2LCAgIDExOTYsICAgIDgzMiwgICA0MjgyLAorICAgIDc4LCAgIDMwODgsICAgMjc2OCwgICAyMTI1LCAgIDEwMjcsICAgMTcxMiwgICAgMzEwLCAgICA4MDgsCisgLTE1OTUsICAgLTEwNiwgICAzMTc0LCAgIDQ1OTgsICAtMjk0NSwgICAxNTUxLCAgLTc2ODgsICAgIDYyMCwKKyAtMTY0MCwgICAgMzM5LCAgIDQ1MzgsICAgMzMzOSwgICAgNTMyLCAgIC0zNTEsICAgIDI2MCwgICAgMjQ5LAorIC0yMTM1LCAgIC01NDMsIC0xODM2MiwgICAtNjQ4LCAgLTM4NzEsICAgNTUxNCwgIC0xNzgyLCAtMTEzMDEsCisgIC0zNzQsICAtMjA3OCwgICAxNjEwLCAgICAgNTAsICAtNDQzOSwgIC0yNTQ2LCAgLTMwNTgsICAgIDgzOSwKKyAtOTIyMSwgICAyNjE4LCAgIDE3OTAsICAgIDEwMywgIC0xMDYxLCAgIC0zNjMsICAgIDI4NSwgIC0zNTQyLAorICAgNTAzLCAgIC00MzcsICAgICAzMCwgICAxMzgyLCAgICAgNzUsICAtMjg1MiwgIC0xMDI4LCAgIDMwOTUsCisgIDQzMTgsICAtMjMxNiwgICAgNzM5LCAgICA4MDEsIC0yMjc2NSwgICAyMTYyLCAgICA5MTMsICAgMTY5OCwKKyAgIDE0OSwgICAyMDQ5LCAgIC0zMTMsICAgLTgwMywgICAzMzkzLCAgLTE0NzYsICAgNDM5NiwgIC00MDAzLAorICAgODU0LCAgLTEzNDQsICAgMTA2MiwgIDEwMDA5LCAgIDYzMzIsICAtODUyMiwgIC0yNjE2LCAgLTk5MDQsCisgIC0zOTAsICAtMzE0NiwgIC0yOTUxLCAgIDQyMjIsICAgNTUzOCwgICAgNDk1LCAgIDM3NzYsIC0xMzY4NCwKKyAgNDY4NywgIC0yMTg3LCAgIC05MDUsICAgNDk5NywgICA2MjA5LCAgIDQ3NzUsICAtMTIzNCwgICAxOTU2LAorIC00NjA3LCAgIDMwMDYsICAgLTM3MCwgICAtNjcwLCAtMTI0NDgsICAtNTgwMiwgICA4MTUxLCAgICAxNDAsCisgIDE0ODUsICAtNjM0MCwgICAyMTM5LCAgIDEyMzEsICAgICAyMiwgICAtMjEyLCAgIDIwOTAsICAgLTY3NiwKKyAgMjM2NiwgICAtNzAxLCAgLTQxMTMsICAgIDM2NSwgICAyOTcwLCAgIC01NzcsICAgIDkxOCwgICA3MzI0LAorICAtNzA5LCAgIDIwMzUsICAgNTE2MiwgICA3MjMyLCAtMTMyODcsICAtMzI1OSwgICAtOTA4LCAgLTE5MDAsCisgLTQyNTUsICAtMjU5MCwgICAgMzE4LCAgIDQ4OTEsICAgIDY5NiwgICAgLTQwLCAgLTE2NDcsICAgMTU3MiwKKyAtMTIyMSwgICA0ODk2LCAgIDUyNDEsICAgICA0OSwgIC0yMDgzLCAgLTUwNjgsICAgNzY0NSwgICA4OTc4LAorICAxNjI4LCAgIDI4OTUsICAtNDkzMCwgIC04MDY4LCAgIDIyNjYsICAgMjAyNSwgIC0xODY4LCAgIDMyNTAsCisgIDI2NDIsICAgLTc4NSwgLTE0NTcxLCAgIDk5NzksICAgMzQ4MSwgIC0yMjQ2LCAgIDExNTQsICAgMjY0NiwKKyAgMjYxNiwgIC0yMDMzLCAgLTI5MzYsICAtMTMwMCwgICAyNDkwLCAgICA4NzksICAtMTIzNywgIC0xMjI4LAorICAtNzI0LCAgLTE3ODAsICAgIDUyNCwgIC02NjE5LCAgLTMzMzksICAtMjUyNiwgICAzNTMzLCAgICA4NDQsCisgIDI5NDYsICAgMjIwOCwgIC0zNTIyLCAtMTI0MTEsICAtMzA2MiwgICAyMzgwLCAgICA0NDgsICAgIDYwNCwKKyAtNDcwOCwgICAyNDAzLCAgIDE5MTQsICAgIC01OCwgICAgMTQ5LCAgLTM3MDQsICAtMjAxOSwgICA0MjQ2LAorIC03MDIwLCAgLTMxOTcsICAgLTcxMiwgIC0yMjE5LCAgMTAwMzYsICAtMjc3NiwgIC0zMTY2LCAgIDI2NDgsCisgIDI5NDcsICAgMzM4NiwgICA2NDQ1LCAgIDE1ODcsICAgLTI2OCwgICAtNTM2LCAgIDE4OTUsICAtOTAwNSwKKyAxMDc5MSwgICAtOTgyLCAgIDgyMTUsICAgNjQxNCwgICA1MTY2LCAgIDQ3NTEsICAgIDE2MCwgICAzMDUwLAorICAtODY1LCAgIDYyMTYsICAtMTE4NywgIC03MDc3LCAgIDE2NDAsICAgNTA3OCwgICA0MzU0LCAgIDE3NjIsCisgLTM4NjksICAgMTE3NCwgICAtMTQ5LCAgIDEwNzgsICAgMTg4NCwgICA1MTQ5LCAgMTUwOTEsICAgLTQzMiwKKyAtMjQ0MSwgIC0xMTAyLCAgLTExOTQsICAgMTA3OCwgIC0xNTM1LCAgIDgyODksICAtMjcwMiwgICA0MDA3LAorICAgNjk0LCAgICAgNzIsICAgIDY4NSwgICAyODE2LCAgMTMyNDQsICAgLTQyMiwgIC03MDk0LCAgICA0MzIsCisgIDIwNDQsIC0xMjAwNCwgICAtMjc2LCAgIDIxNzQsICAgLTkwOCwgIC00Nzg0LCAgIDU3MjUsICAgLTI1MCwKKyAgICAyMiwgICA1MTE2LCAgICAgLTIsICAgMjY4NiwgICAgOTU1LCAgLTg1MDksICAtNzY5NywgIC0zNzM1LAorICAgNjcyLCAgLTEyMDIsICAgNDI5OSwgICA0Mjg0LCAgMTIzNTIsICAtMjM2MiwgICA1NzU3LCAgIDEzMTcsCisgIDQyOTMsICAgIDUwOCwgICAzMDUwLCAgIC01MjQsICAgMTA5NywgICAzMzQ2LCAgIC01MzcsICAtMjQ0MCwKKyAtMTU5NiwgIC01NjU5LCAgIDQxODgsICAgLTYyNSwgICAxNjU5LCAgIDMwNjEsICAgMjc5MSwgICAxNzEyLAorIC0yOTkxLCAgICA5NjYsIC0xNjkwMywgICAgNjEwLCAgLTMzMTQsICAgNDE2MCwgIC0zNzUwLCAgICA1ODAsCisgLTM0MDcsICAgLTM0MCwgLTExODI5LCAgIC01MjAsICAtMTYyNSwgICAyOTA1LCAgICA2NzQsICAgLTE0NywKKyAtNTI4NCwgIC00Mjc4LCAgLTUwMjEsICAgNDYzNSwgICA2Mjk5LCAgIDIyMDcsICAgMjU5NSwgIC03ODExLAorICAgLTY4LCAgIDQxMDcsICAgNDMxNCwgIC0xNTQwLCAtMTEwNDQsICAtMjIxNCwgICAtODAzLCAgICAyMzIsCisgLTc2MDIsICAgIC05NSwgICAxMTMwLCAgIDQ5OTEsICAgLTM2MSwgICAxNjc1LCAgIDQ0ODcsICAgMzYwNywKKyAtNjE5MiwgICAtMTMwLCAgICAxMzcsICAtMTQ0MCwgICAyODI2LCAgICAxNzgsIC0xMzgzNCwgICAtOTg0LAorICAxMTQ5LCAgIDEyMzAsICAgMTU4NywgICAxNTcxLCAgIDMyODYsICAgNTI5MywgIC0yMjU5LCAgIDIwMjEsCisgLTYyMTEsICAtNzYwOCwgIC0yNzEwLCAgIDI1MDIsICAgNDMxNSwgICAtNTM5LCAgLTg1MzAsICAgLTc0NiwKKyAgLTY1NCwgIC00MDAzLCAgLTU5MTcsICAtMzcyOCwgICA0NTIyLCAtMTAzNTAsICAtMTI2NiwgICAgMjEwLAorICA1MDc4LCAgLTI5ODgsICAtMzg2NiwgICAzOTE5LCAgICA5NjksICAtMTA2MywgIC02MzAwLCAgLTQ1ODQsCisgLTI0MjAsICAtMjA5NCwgICAtODg0LCAgIDIzMzgsICAtMzE1MCwgICA1NDYxLCAgLTExNDUsICAgLTczNCwKKyAgMTY0NCwgICAyMTgzLCAgMTkxMTQsICAtMTE0NCwgIC0yMzEzLCAgIC00MDQsICAgMTIzNiwgICAzNTgzLAorICAgMTM0LCAgIDE4MDIsICAtNDA4OCwgIC0yNzk1LCAgICA2ODEsICAgMzczOCwgICAxODMxLCAgMTY1NzEsCisgICA5MTcsICAtMjI5MCwgIC0zNjQ4LCAgLTE1ODgsICAgLTE1OCwgICAtNTI4LCAgIC03OTIsICAgIDM5NCwKKyAtNzQzMiwgICAyNDQ2LCAgICA0MDIsICAgLTM5MSwgICAgLTczLCAgLTEzOTgsICAgMTI4NiwgIC02NTAzLAorICA1MjE2LCAgIDEwOTQsICAgLTkzOSwgICAxNjczLCAgLTIwMzgsICAxNTg0MiwgIC0xOTcxLCAgIDQxNjAsCisgLTE2NjQsICAgNzIzMSwgICAgNjQyLCAgIDU3NzAsICAgNDIwOSwgIC0xODM5LCAgICAyMjAsICAgLTI2NiwKKyAgIDE2NSwgICAyMDU1LCAgIDUyMjIsICAtMzM0NCwgIC02NTQ0LCAgIDU0MTIsICAgMTUxNCwgICAgNTg2LAorICAxNTkxLCAtMTUyNTYsICAtMjcxNSwgICAgOTQxLCAgIDEzMDgsICAtOTE3MCwgIC0yODYzLCAgIDQ5MzUsCisgLTI5MTMsICAtMTI5MSwgICAyNzkxLCAgIDc5NjcsICAgICAxNCwgIC0xMTAxLCAgIDM3NzQsICAgMzU4MCwKKyAgIDg0OCwgICAxMzM3LCAgIDExMzgsICAtMjgzOSwgIC0zNTY0LCAgLTUzMDAsICAxMjQyOSwgICAgIDE0LAorICAxNDY2LCAgLTcxMTQsICAgMTE5OCwgIC0zNDc0LCAgIC0yMzcsICAtMjU3NywgIC0xMzA1LCAgICA0NDUsCisgIDEwNjksICAgLTE3NCwgICAxNjg0LCAgIDM5MDIsICAgIDIyOSwgICA1ODQyLCAgIC02OTAsICAgIDk3OCwKKyAgLTc1NCwgICAxMTgyLCAgIC04NTksICAyMTA3OCwgICAtMTg1LCAgICA3MTAsICAgIDc5NywgIC0yMTU1LAorICAgMzY3LCAgLTIxNjgsICAgMTAwMiwgICAzODA1LCAgIC05MjQsICAgIDQ2OCwgIC0yMzIyLCAgLTM1OTAsCisgIDE2MDgsICAgMzM4NywgICAgIDE4LCAgIDE1MzYsICAgLTg1OCwgICAgNjQyLCAgLTc5NjQsICAxNzY4OSwKKyAgOTg0MywgIC00ODc4LCAgLTMwMDMsICAgNzM3MywgICA1OTM0LCAgIDQyODYsICAxMDQ4NCwgICAgLTYzLAorIC00NjI5LCAgICA5NzQsICAtMjIyNywgICAyNjAyLCAgIDM4MTAsICAgMTkwNSwgIC0xNjY4LCAgLTIxMzAsCisgIDIwMjAsICAtMjM2MCwgICAyODUzLCAgICA2MTIsICAgNTA3MCwgIC0xMjQ4LCAgIC04NjgsICAgLTQ5NywKKyAgMzQ3OCwgIC0xOTM3LCAgLTMwMDYsICAgLTY0NSwgICAzNTg5LCAgIDMwMTksICAtMzI5MywgIDE2NDY5LAorIC01MjQzLCAgLTI5MTgsICAgMTc4OCwgIC0yNTY5LCAgIDM3MTcsICAtOTYzMCwgIC0xMzUyLCAgLTM4NzAsCisgIC00MTYsICAtNDE5MCwgIC04ODYzLCAgLTY4ODgsICAgLTQ5OCwgICAtODE0LCAgIC03ODMsICAtNDYyNSwKKyAgNTg0MSwgICAxNTYyLCAgLTIxNzMsICAgIDQ4MSwgICAgMjgwLCAgICA4MTYsICAgNDc0MiwgIC05OTYyLAorIDExNzk5LCAgLTIwMjksICAtMjQ2MCwgICA0OTcyLCAgIC02MDAsICAtMTQ1MiwgIC0xOTAxLCAgLTIxMjIsCisgIDMxMzAsICAgMjY4NiwgICAtODE5LCAgLTIzNjYsICAgIDg2NiwgIC0yMDkzLCAgIDEwNTIsICAgIC01OCwKKyAgIDI4NCwgICAzODMwLCAgLTQ3MzgsICAtNDExNCwgIC0xMzIxLCAgIDEzMDcsICAtMjgyMCwgICA0OTE1LAorLTExNzAxLCAgICA1MjIsICAtMTk4MiwgICA3MDI0LCAgIDg0MDMsICAgMTc2MiwgICAgLTQ2LCAgICA1MzIsCisgIDUwOTcsICAgNTAxMywgICAtNjE1LCAgIDMwODYsICAgMjA4OSwgICA2ODk5LCAgLTExMDcsICAtNDA0NywKKyAtMjkwMywgICA1MzU2LCAgLTQ4MDIsICAgLTk2NSwgICA2NzA2LCAgIDM4OTUsICAgOTAyMiwgICAxMzg4LAorIDEwOTcxLCAgIDU5MjcsICAtMjk1NCwgICAtOTY1LCAgLTM0NzMsICAtNTE3NywgIC0yNjU0LCAgIDM0MTgsCisgLTUzMTUsIC0xNjY5NSwgIC02NTg3LCAgIC00MTYsICAgIDQwNCwgICAxMjMwLCAgLTI1ODYsICAtMzI5MiwKKyAgMTM5MCwgICAgIDE0LCAgIC00ODEsICAtNDQ0NiwgICAxMzM1LCAgICAxMDksICAgMTA2MCwgICAzOTU4LAorICAxMjc1LCAgLTU2NTUsICAgMTI1MywgIC0yNDExLCAgICAyMDcsIC0xMjU1MCwgICA2MjA4LCAgLTI0NDcsCisgLTM0MTUsICAgMjUwMywgICAgODQ4LCAgIDMwOTQsICAgOTMzNiwgICAyNjQ3LCAgIDI0NTUsICAgMjIzOCwKKyAgMjM1NiwgIC0yMTMyLCAgIDUzNDcsICAgIDkxNSwgICAyMjI3LCAgIC0xMDMsICAgNTgzMiwgIC0yNTA0LAorICA3NTYyLCAgIDk1NjgsICAtNjEwMCwgICA0MDkxLCAgIDI2NjgsICAtMTcyMiwgICAgMjg3LCAgIDY3NjMsCisgIDQwNTgsICAgLTM4NywgIC0yMDYwLCAgIDU1MjIsICAgMzE4NCwgICA0NzY2LCAgIC0xNTgsICAgIDY1MCwKKy0xMTI4NCwgIDExODQxLCAgIDYyMzAsICAtNDIzMiwgICA1MzA4LCAgIDMxNzQsICAgNDkyNiwgIC0yOTcwLAorIC00NzYxLCAgIC05ODAsICAgIDExNywgICAxOTQ0LCAgLTE5NzQsICAtNTQ4NCwgICA2NTM0LCAgIC0yNjYsCisgLTcyMjIsICAgIDkyNCwgIC0yNjU0LCAgIC01ODgsICAgOTYwOSwgIC0yMzM3LCAgIDE4OTIsICAtMjExMCwKKyAgNTA4OCwgICAxODU2LCAgIDc5NjQsICAtNDAyOSwgICAtOTQwLCAgIDE0MjksICAgIDgwNSwgIC00NzA1LAorIC0xMzYyLCAgICA4OTIsICAgLTE4OSwgIC04MzU0LCAgIDMyNTksICAgIDE5NCwgICAgNzY3LCAgLTI4NzcsCisgLTQxNjUsICAgLTk5MCwgIDEyMTg1LCAgIC0xNjAsICAtMjAwMiwgIC0xMzg0LCAgLTUzODgsICAtMTYwNCwKKyAgIDIyNiwgIC02MzUzLCAgLTQxNTcsICAgMTc3MywgICAyMzYwLCAgLTQzNTYsICAgLTczMCwgIC01NDYyLAorIC00MDU0LCAtMTU2NjksICAtMTUyOCwgICAtMzk0LCAgIDQxMDEsICAgLTIwMywgICAyNzkyLCAgIC03ODcsCisgIDMzOTEsICAgLTI5OSwgICA2Mzg0LCAgLTE2MzAsICAtNzE4NiwgLTEyNzY1LCAgIDQ2MTgsICAgIDkzNCwKKyAgLTQwMSwgICAyNzkwLCAgIDIyODQsICAtNDkzMiwgIC0xMjYwLCAgLTYwMDksICAtMjU5MCwgIC0yMjg1LAorIC0xMjg5LCAgIDMzNjYsICAtNDE5MiwgIC00NDYyLCAgMzI3NjcsICAtMzEzNSwgIC0xODg4LCAgICAgNjcsCisgLTI4NzQsICAgIDE1MCwgICA0NzYwLCAgLTE1NzEsICAgIDU4NCwgIC0yMTg3LCAgICAzNTgsICAtMTczMywKKyAtMTI4NiwgIC00NTczLCAgLTIwMDMsICAgMTg3MiwgICAgOTQwLCAgLTE5NDIsICAgLTI1NSwgIC04ODU2LAorIC0xMzIwLCAgLTMzNDgsICAgNDg1NCwgICAtNTA5LCAgIDI4MzYsICAgIC0xNCwgICAyNDkwLCAgLTE1MzcsCisgICA4ODIsICAgMTE4OCwgIC0zMTMyLCAtMTUyMDksICAtMTYzMywgICAgLTQ0LCAgLTI4MjcsICAgIDM2OCwKKyAtMTA5OSwgIC0xMDczLCAgIC00NjcsICAgNjMxOCwgICA1ODYzLCAgIDI4NDAsICAtNTIwMCwgICAgNTY5LAorIC0yOTg0LCAgIDY1ODcsICAgOTU5NiwgIC00OTI0LCAgICA0NTcsICAgNDg3OSwgIC00NDQ5LCAgIDM1MjgsCisgIDE4NjgsICAtMzg5NCwgIC0zOTA1LCAgMTU0MjAsICAtMjU5MCwgICAtNTk5LCAgLTQ5NzUsICAgMzg5MiwKKyAtMTQ1NCwgICAtNjE2LCAgIDE4OTAsICAtMjcwMCwgIC0zMjY4LCAgLTEzODYsICAtMTA2NSwgIC0zMDc4LAorIC0yNDU0LCAgLTE5MDIsICAgNDcyNiwgICAgLTM0LCAgLTQyMTgsICAgMTYxOSwgIC0zMDc0LCAgIDU1NDAsCisgLTYzOTIsICAtMzU3MCwgICAyNjg3LCAgLTg3NDIsICAgIDMzMywgICAtMTA2LCAgIDIzMjYsICAtMTczNywKKyAtMzc3NSwgICAgMzk3LCAgLTM1NTMsICAtNjYzMiwgIC02MDY2LCAgIDk1NjcsICAgMjkwNCwgICAtODg5LAorICAxMTM2LCAgIDEyOTUsICAxOTM5MCwgICAtMjY4LCAgLTMxMjcsICAgLTE4MCwgICAxNjk2LCAgIC04MTQsCisgIC03NzUsICAtNDkxNCwgICAtNDU2LCAgIC03NTgsICAgLTg2NiwgICAxMTAyLCAgLTM3NDAsICAgLTM3NCwKKyAgIDQ2OSwgIC02OTAyLCAgIDE0NDAsIC0xMDI0MywgIC02MjIxLCAgLTQ3OTcsICAtMzA3NCwgIC0xMTQyLAorICAgMjk3LCAgIDUwNjksICAtMTU0NywgICA1NDc0LCAgICA3MTYsICAgLTQ1NCwgICAzODA2LCAgIDQxMDAsCisgIDI5MDEsICAtMjE2OSwgICAtNzQ0LCAgIDUwMzIsICAtNTU4NiwgIC0yOTg2LCAgIDIyODYsICAgMjQxNCwKKyAgNzg2MCwgIC0yNjcyLCAgICAtNDYsIC0xMDA0NiwgICA1MzQ4LCAgLTEwMTgsICAgMTAxNiwgICA5MTQyLAorICA0NTQzLCAgIDU1ODcsICAgMjIyOCwgIC0yNjg0LCAgLTQ1OTQsICAtMjQ1NywgIC0xODUwLCAgLTM2NTEsCisgLTE4MDYsICAgNDgyNiwgLTExNjg2LCAgIDE5NDAsICAtMzUyOSwgICAxMDc4LCAgLTUyMzQsICAtMjQyMCwKKyAgIC04MywgIC0yMzIyLCAgLTUxMzQsICAgLTc3NSwgICAgNjc3LCAgLTkyNTcsICAgLTg2NCwgICAtOTE1LAorICA0NDk0LCAgICA0MTEsICAtNDgyMCwgICA1OTk5LCAgIDQ0NzIsICAgNTgyMywgIC00NTk3LCAgIDMxMjEsCisgLTE4NjgsICAtMTUzOSwgICAyMzM4LCAgLTQyNDksICAgMTE1NCwgLTEzNDIyLCAgICA3OTEsICAtMTIzNSwKKyAtMTI0MCwgICAgMzY0LCAgICAxNzcsICAtMTUwOCwgIC0yNTI3LCAgLTI5NDksICAtMjA2MiwgICAgMTE4LAorIC0zMTE1LCAgICAyOTMsICAtMTkyNywgIDE4NjQ0LCAgLTExMDAsICAgIDE1MiwgIC0yNTI4LCAgIDE5MTQsCisgLTEzODAsICAtMTYyNCwgICAgMzAyLCAgIC04MzEsICAgLTkyMCwgICAgMzIwLCAgIC04NzksICAtMTI1MiwKKyAgIDgxMywgICAgLTExLCAgIDY5NjAsICAgLTUyMiwgICAzMDkyLCAgIC0xMTksICAgMTQ4NiwgICAzMDY4LAorICA2NjkwLCAgLTMwNzksICAxMzMwNSwgICA2MzQyLCAgICA5MzcsICAgMTYzMiwgIC0xMDI2LCAgIDE4OTYsCisgLTIzMzUsICAtMzk2MSwgICA1NTEwLCAgIDI3ODIsICAgIDE4NywgIC0yNDQ4LCAgLTEyNTEsICAgIDc1NiwKKy0xNTg1NiwgICAzMTc5LCAgLTExNTUsICAgIDgwOCwgIC0xNzQ4LCAgLTY1OTMsICAgMTQ5NCwgIC0zMTIyLAorICAgLTk4LCAgLTM4MDgsICAgIDQ5MSwgICAxNzUyLCAgIDMxODgsICAgMjE1OCwgIC0xOTI0LCAgICA3NjMsCisgIDExNjUsICAgIDE0OCwgIC0zMTYxLCAgLTEyODQsICAxODA4MiwgICAtMTk1LCAgLTExMjUsICAgIDg0NQorfSwKKworLmNiMDgwOG0wID0geworLTE4NjU2LCAgIC00NjEsICAgIDIzNiwgIC0xMTIyLCAgIC03OTYsICAgLTEwMSwgICAgODUxLCAgLTM3NDgsCisgIDEzNzQsICAtODU0OSwgIC0zMzY2LCAgLTE0ODIsICAgMTAyNiwgICAyMDQ2LCAgIDQzOTQsICAgLTUyMSwKKyAgIDIzMiwgICAtNDg2LCAgLTE2NTYsICAzMjc2NywgICAxOTU0LCAgLTExODMsICAgLTEzMCwgICAgMzkyLAorICAgMTk0LCAgIC04NjgsICAgMjg4MywgICAtMTY4LCAgLTE2NzQsICAgLTkxMCwgICAgLTM0LCAgICA4MTksCisgLTExMDUsICAgMTYyOCwgIC00ODcxLCAgIC01ODUsICAtMTE3MCwgICAtNTcyLCAgICA0NTEsICAgMzkxMSwKKyAxMDc3MCwgICAgLTM1LCAgLTQxMjYsICAgNzEyNCwgICA3MTEwLCAgIC04NjAsICAtMzkxNCwgIC0zMjk0LAorICAgMjcyLCAgIC02NDcsICAgIDIyMCwgIDExOTY1LCAgLTMzNzgsICAgMjcyNiwgICAxOTkwLCAgIDE2MjQsCisgLTM2ODksICAgOTg4NCwgICAyMzk0LCAgIDMwOTYsICAgLTUxOCwgICA1MTY5LCAgLTQwMTgsICAgMzEwOCwKKyAgIDE2OCwgICAxMjU2LCAgIC00MTAsICAtMzg1MSwgLTExMTc2LCAtMTA0NzksICAgMjA0MiwgICAxNDIxLAorICAxNDg4LCAgIC05OTIsICAtMTU2MiwgICAtNjUzLCAgLTExOTEsICAgMjI0NiwgICAgNDY3LCAgIDQ3MzIsCisgICAxNTQsICAgIDcyOSwgICA3MjQ0LCAgICAtMTgsICAgMTMxMywgICAgLTUxLCAgLTE4MjQsICAgMTIxOCwKKyAgMTQ3MywgIC02NzYzLCAtMTEyNzAsICAtNDI5NSwgICA0MTE4LCAgIDEwNDMsICAtNTc4MiwgICAxMzcwLAorICAgIDQ2LCAtMTEwMjcsICAgNDA4NiwgIC0xNTAxLCAgICAtMTEsICAgLTYyMSwgICAgNDY0LCAgICA3ODEsCisgMTM2ODAsICAgIDI1NywgICAgNTU0LCAgIDMxMTksICAgIDc1MCwgIC0xODU3LCAgIDEwNDYsICAtMTI1MiwKKyAgLTUxMiwgICAgNzM5LCAgMTQ4MTEsICAxMjY0MiwgICAzODQxLCAgIDI4MjQsICAgIDE2MywgICAxNjIwLAorICAgIDM5LCAgIDQ3NjYsICAgMTQxMSwgIC0yMTk3LCAgICA1MjUsICAgIDY1OCwgICAgNDE5LCAgICAgIDUsCisgICAgOTIsICAgMTU0NCwgICAgMjkwLCAgLTIwMzgsICAxMDYwMywgIC01NzY0LCAgLTMzMzUsICAtNjYyOSwKKyAtMjU3OSwgICA0MDIwLCAgLTMxMDcsICAgMjc3OSwgICAgODQ5LCAgIDU2NzgsICAgIDI2MCwgICAyODA0LAorICAgIDk5LCAgIDEzMzksICAgIDU0NCwgICAxNDM4LCAgIC00NTAsICAgLTU5OCwgICAgNzY0LCAgIDE1NjgsCisgLTEwMzQsICAtNDU2MCwgICAyNjA0LCAtMTgyMDUsICAgMTY0NCwgICAxMDAzLCAgIC02NzUsICAgMzIxNywKKyAgLTMzNCwgICAtODMyLCAgLTE0NTIsICAgIDMyMiwgICAgNjA4LCAgICAzMDAsICAtNDc3NiwgICAtODEyLAorICAgLTM2LCAgICA2MjcsICAgMTY1NCwgICAtMjQ4LCAgIC04MzgsICAyMTU3MSwgICAgLTg5LCAgLTE2MjYsCisgICA1MzAsICAtMTE1MSwgICA5NDQwLCAgICA1MjIsICAtNjEzOCwgICAyMjEzLCAtMTAwOTUsICAgLTU2MiwKKyAgMTAwMCwgICA1MDM3LCAgIC0xMjIsICAgICAtMywgICA3MDY0LCAgICAzOTcsICAtMjExOCwgICAgMzYyLAorIDE1NzkxLCAgLTEwNDcsIC0xNTAxMCwgIC0xNTI3LCAgLTEzNTYsICAtMjgwNSwgICAtNTYwLCAgLTMxNDgsCisgICAyNjYsICAgIC00NSwgICAxMzI0LCAgLTMzMTIsICAtMTc3MiwgICAyMzgyLCAgICAxODksICAgNjUzNywKKyAgIDEyNCwgIC0xMjcyLCAgICAxNTYsICAgIDU4OCwgIC0yNjc4LCAgLTMxMDYsICAgMjgyOCwgIC0zNjg0LAorICAgNjg5LCAgIDM4ODQsICAgNDY1MCwgICAgMTkyLCAgIC0zMjMsICAtNTQyNiwgICAtNzIyLCAgMTE0ODYsCisgIC02MDcsICAgMzU5MSwgICA0Mjk5LCAgIDIxMTcsICAgIDM2MiwgIC05MTE0LCAgMTE3MDAsICAtMzM5MSwKKyAgMjM1NywgICA3NjM5LCAgIDIxOTcsICAgNDM1MCwgICAyOTcwLCAgLTI1MjUsICAgIDE2OSwgIC02MTEyLAorICAgIDkxLCAgIDE1MjAsICAgIC0xOSwgICAxNTU4LCAgLTQ1ODgsICAgLTgzNywgIC04MTYzLCAgICA4OTcsCisgLTc5OTIsICAgMjA4MCwgIC0zMTAyLCAgICA3NzQsIC0xMDU5MiwgICAtMzE0LCAgIC0xMzcsICAgLTUyNCwKKyAgICA4NywgICAtNzk5LCAgIC0xMTEsICAgICA3NCwgICAxMzEyLCAgICA4NjIsICAgIDI2NiwgICAgMjQzLAorICAgMTk5LCAgIC0yODgsICAgMTIwNSwgICAtODI5LCAgIDE2NTAsICAgMjg4MCwgLTI0Nzc2LCAgIDM4NjcsCistMTMxMDEsICAgIDU5NywgIC05Nzc4LCAgLTIwODQsICAtMzA4OSwgIC0xMTEyLCAgICA1NDgsICAgLTYzOCwKKyAgMzcyNywgICAtNDQ2LCAgIDQ4NzcsICAgMjA5OSwgICAgIDY4LCAgLTI3MzYsICAtNDkxNCwgIC03MTAzLAorICAgMjYzLCAgLTkyMjgsICAgLTc4MiwgIC0yMTA5LCAgIDEwODgsICAtMTg4MSwgIC0xNDI0LCAgICAtMzAsCisgLTEzNTMsICAgIDU4NiwgICA0MDg1LCAgLTM1NzMsIC0xMTkyMSwgICAyMzY2LCAgICA1MTYsICAtMTAyOCwKKyAgIDgzNCwgICAtMjM0LCAgIDIxNTAsIC0xNTg5MywgICAyMzA1LCAgLTM2MTksICAtMjU2NywgIC04MzY2LAorICAgNjEwLCAgIDI5NDYsICAtMjM4MywgICAyMjkzLCAgICA5NDYsICAtMzU1MCwgIC02NzcwLCAgLTE0ODEsCisgIC03NTgsICAgLTg2NCwgICAtMjMyLCAgIDI4NTUsICAgICA0MCwgIC0yMzMwLCAgIDIwNjksICAgLTM0NSwKKyAgMTgwMSwgICAtNTg5LCAgLTEyNDEsICAgIDY0NywgICA2OTg4LCAgLTI2MjUsICAxNDMwOCwgICAyODAxLAorICAgNzU5LCAgLTI3NDAsICAgLTY4MCwgICAgOTY0LCAgICAzNjUsICAgLTUwNiwgIDIyMjY4LCAgIDE3NjYsCisgIC0yMDIsICAtMjc1MSwgICAtMjkzLCAgIDM3NTQsICAgMTI4MCwgICAtNTIxLCAgLTMzNTUsICAgNDYxNSwKKyAgIDU5NCwgIC0xNzgzLCAgICAtMzksICAgIC00NiwgICAgIDQ4LCAgLTI2MzgsICAgLTU1MSwgICAyNTQ4LAorIC0xODgwLCAgIDM3MzAsICAtMTcyNiwgICAgOTM5LCAgIC0zNDUsICAgICAtNywgIC0xNjMwLCAtMjM0MDUsCisgLTEwMDIsICAgNTY1NSwgICAyMTAwLCAgICA0NDAsICAgMTY4MiwgICAxMDIwLCAgIC01OTQsICAgIDM0NCwKKyAgMTUxMSwgIC0xMjg2LCAgIDU1MTgsICAgIDQ3MywgLTExMzk4LCAgLTQ1NTIsICAgIDcyMCwgICA0NzAxLAorICA3NzI2LCAgICAxMjYsICAtMTk1MywgICAtNDg0LCAgLTE2NDgsICAtMTc2NiwgICAxNTg5LCAgICA5OTYsCisgIC02ODgsICAgLTM4MSwgICAxNjc4LCAgIDE0OTgsICAgLTUyOCwgICAtODYwLCAgIC02NjcsICAgLTgyMywKKyAzMjc2NywgICAtNDYzLCAgIC0yNDMsICAtMTI0MiwgICAxMDc0LCAgIDI0NjAsICAtMTQxMSwgICAtNDU5LAorIC0xNTMzLCAgIDE0NjIsICAtMjYwMywgICAtNzg0LCAgIC0zOTEsICAgIDMzOCwgICAzNDQ0LCAgIDIxNzAsCisgIC05MjQsICAgIDk0OSwgICAxOTcyLCAgIDE1MjAsICAtMzA2MiwgICAtNjcxLCAgMTI5MDgsICAgMjYzNiwKKyAgMjgwNSwgICAgNzIyLCAtMTIwMTYsICAgIC0yNiwgICAgNjE2LCAgIDExOTIsICAgMTE5MywgIC0xMDI4LAorICAtMTI4LCAtMjI4NTAsICAgIDE5MSwgICAgNDA4LCAgLTMxMDUsICAgLTU5MiwgICAtNDQwLCAgIDEyNjQsCisgLTI1ODAsICAgIDg0NywgICAgODUwLCAgIDIzMDAsICAgLTI3OCwgICAgMTI2LCAgIDIyMTQsICAtMjY5MywKKyAgIC0yMSwgICAtMTk0LCAgIC01OTQsICAgLTUzMywgICAgIDQ1LCAgICA1NzAsICAgICAzOCwgICAgNjM2LAorICAxMjc2LCAgICAxNzEsICAyOTg0NiwgICAgNjQ4LCAgICA5MTEsICAgLTM1OCwgICAgMzAwLCAgICA2MDIsCisgICA0MTMsIC0xMDE2NywgICAgLTU0LCAgLTEzNTMsICAgICA0MiwgIC0xNzcwLCAgICA0OTEsIC0xMjE1NCwKKyAtMTgwOCwgICAgIDI2LCAgICA0MjUsICAgMjAwOSwgICAgOTEwLCAgLTgxMzQsICAgIDM2MiwgICAyMDAxLAorICAtMTE0LCAgLTI1ODYsICAtMTA0OSwgICAtMjQ5LCAgIC0zMTIsICAgIDE2MCwgICAxNjc3LCAgMjcwNDMsCisgICAtNDQsICAgIDE2MCwgICAgODM0LCAgICAyNDMsICAgLTYwNiwgICAtMjcyLCAgIC05NzksICAtMTYwNSwKKyAgIDEwNSwgICAtNDkxLCAgICA3NTQsICAgLTIzMCwgICAyNDQyLCAgICAgMjQsICAtNTEzOSwgICAtMzk1LAorIC0zNTYyLCAgMTQ0MzYsICAtMTIwOCwgIC0zMjMyLCAgIDI1NTUsIC0xMjk4MCwgICAtOTA2LCAgICA0MjksCisgICAyMTcsICAgLTQzMiwgIC0xMjYzLCAgIC0yNDQsICAgLTIyNSwgICAgOTEyLCAgICAtNjQsICAgIDc4MCwKKyAgMTEwMSwgICAgODU0LCAgIC0yNDAsICAgIDMwOCwgLTI4NjMwLCAgICA1MTgsICAgICAzMiwgICAgOTc2LAorIC04NjQyLCAgLTMwNDEsICAgMTgwMSwgICAtNzQyLCAgLTE1MTMsICAgIDEyOCwgIC0zMTg5LCAgICA4NTcsCistMTQyNzcsICAtMTgwMiwgICAxMjI5LCAgICAtNjgsICAgLTU2NSwgICAgIDY1LCAgIDQwOTQsICAgMTYxNCwKKyAtODI1NCwgIC0xMTUzLCAgIC02NDAsICAxNjIyNSwgICAzNTA4LCAgLTEzODMsICAtMzg4MiwgICAtMzQ3LAorICAxMzQ2LCAgIDM4NDUsICAgMjY2NSwgICAyMzQwLCAgLTE4NjIsICAtNTMxOCwgICAxNDAyLCAgLTEzNTIsCistMjE2ODIsICAgLTY5NCwgIC0xMTgyLCAgICAyODYsICAgLTgwNiwgICAyMTMzLCAgIDE4NDgsICAgLTUzMiwKKyAtMzc1MCwgICA3NTY0LCAgIDEwNTQsICAgIDI4NCwgIC0zNzQyLCAgIDI1NTksICAgMjc0OCwgICAzNDA4LAorIC0xNTQ0LCAgIC0zNDIsIC0yMjU3OCwgICAxMjI1LCAgICA5NTgsICAgMjU1OSwgICAgMjY3LCAgICAzNzgsCisgLTM2MDgsICAtMTQwNCwgIC0xNjY5LCAgICAtMTMsICAgMTEzNSwgICAgMTUzLCAgIC02MjUsICAgMTQzNiwKKyAgIDIxMSwgICAgNTU2LCAgICA3MzksICAgMTA5NCwgIDEwNDUyLCAgICA4NTAsICAgNTEyOCwgIDExNDY5LAorICAgMTIxLCAgIDQ5MzcsICAtMzY0MywgICAxMzcxLCAgIC0zNzMsICAtNjY4NiwgICAgMjI5LCAgLTMyNTYsCisgICAtNzUsICAgMTMwNCwgIC0xMDIzLCAgIC00NTIsICAgIDI4OCwgIDEyNzA5LCAgMTM1NzIsICAgLTUwMSwKKyAgMTg0MCwgIC0xMDQ0LCAgLTIwMTQsICAtNDA3NywgIC0yNzI2LCAgLTEwMTAsICAtMzgyNiwgICAtNjI5LAorICAtNDY2LCAgIC05MjMsICAgLTg0NywgICA1Nzg0LCAgICA4OTgsIC0xMjAzNiwgICAxMjUzLCAgLTE3NDEsCisgIDE1NDYsICAtMzcxMCwgICAyNzgyLCAgLTM0MzAsICAtMTgxMCwgICAgMjYzLCAgLTgyNTQsICAgMzEyNiwKKyAgICA1NSwgICAtMzc2LCAgICAyMDIsICAgIDk2OCwgIC0xNjg2LCAgICA5NDQsIC0xNTMwMCwgIC0yNjY0LAorICAxMzkzLCAgICA3ODMsIC0xMTA4MCwgICAxNzE0LCAgLTE2NjYsICAtMTA2NCwgIC00ODU5LCAgLTIzNDQsCisgICAzMzQsICAgMTMxMywgIC0xMjA5LCAgICA4NzcsICAtMTgyOCwgIC0yMTMwLCAgLTMwNTcsICAgIDM0MCwKKyAgODAzMCwgIC0zMjIyLCAgMTE2MjIsICAtNTYyMCwgICAxNDY5LCAgIDMzNDAsICAgMjg2MiwgIC0zOTQ1LAorICAtODY4LCAgICAzNTEsICAtMTMxNCwgICAyMjc3LCAgLTIzNDYsICAxMjM4NCwgICAgOTk2LCAgLTI0NjAsCisgIDE4MTAsICAgIDcwMywgIC0yMTU4LCAgIDMxNjgsICAtOTg4NywgICA4NzU0LCAgIDM1MDMsICAtMTQxNCwKKyAgIDQ0NSwgICAgODUwLCAgICAtMzAsICAgMjM4OSwgICAtNjE3LCAgIDMyNzEsICAtMTYwNiwgIC01NjMzLAorICAyOTkzLCAgMTAwMDksICAgNTcwNCwgLTExNTg5LCAgIDQyNzgsICAgMTMwNCwgIC0yNDE4LCAgICA0NzksCistMTY1OTYsIC0xMjM0OSwgICAyOTE1LCAgICAzMjcsICAgIDg5NSwgICAxMjc4LCAgIDE0MTIsICAgLTMxMCwKKyAgLTY1MywgIC0xMjg3LCAgICA4ODAsICAtNDI5NCwgICAgIDM4LCAgIDIxNzksICAtMjA3NCwgIC0xODEwLAorICAgMTk4LCAgLTE1NDQsICAtODAwOCwgICAyNDU2LCAgLTI4MjEsICAtMzIyMywgIC0zNzEzLCAgMTE3NjMsCisgLTIwODEsICAgLTE0MSwgICA0ODMzLCAgIDE2NTIsICAgMzU5OCwgICAgNTUxLCAgLTE2NTUsICAtMTE1NCwKKyAgIC02MCwgICAtMzAyLCAgICA3MzksICAtMTQ5NCwgICAyNTk1LCAgLTEwMDYsICAgMjY2NSwgIDEwODM0LAorLTExMjcwLCAgLTI5OTYsICAgLTYzNiwgICAtNDQ2LCAgIDE4MTYsICAtMTUzOSwgICA0MTQ5LCAgIC0xODQsCisgIC0xMDAsICAgIC01NSwgICAgMjY1LCAgIDIyMDcsICAgIDYzOSwgICAtMTYyLCAgLTIyMTAsICAgLTYyNiwKKyAgIDYwNSwgLTIxMTQ5LCAgIDIxNjMsICAgLTk3MCwgICAtMzMwLCAgLTQ2NTUsICAgMzM5NiwgIC0zMDkyLAorICAtNTQ0LCAgIC02NTAsICAgLTMwNCwgICAgIDkzLCAgLTE0ODQsICAgLTg4OCwgIC04OTgyLCAgIDE4NzEsCisgIDE3MDEsICAtMTQyMywgICAxNjcxLCAgICAtMTEsICAtMTI4NywgLTE0MjkyLCAgICA1OTIsICAgMTA0MCwKKyAgLTYyMiwgIDEzMjAyLCAgIC02NjAsIC0xMjc0NSwgIC0yODM2LCAgLTE4MzIsICAgMzQ4MSwgICAxNTQ2LAorICAgMjM1LCAgIC02NDYsICAgMjEzMiwgICAtNjAyLCAgIDIzOTEsICAgMTUzNCwgICAzNTk5LCAgLTQ5MzIsCisgIC0yOTYsICAtMTg1NSwgIC0yMDc1LCAgLTI2NDYsICAgLTIxOSwgLTEwMjQ4LCAgIDExNjEsICAgNTk1NSwKKyAgNjk1NCwgICA5MTA5LCAgIDM0OTgsICAtNTkzMiwgIC0xNzg3LCAgICAzNzMsICAgMTIzNCwgICAxMjQ0LAorICAtODEzLCAgICAtNzYsICAgOTA4MywgIC01MTIwLCAgIC00OTksICAtMTc3NCwgIC0yMTUwLCAgMTA2MDEsCisgIC0xNzAsICAgMTE2MCwgICAgOTgyLCAgIC01OTcsICAgICA5NSwgICAgMTUxLCAgIC01MzQsICAgNjU1NCwKKyAgIDg0MCwgICAtOTU4LCAgIC03MjAsICAgMjA2NiwgICAgLTUwLCAgLTI4NzcsICAgIC03NCwgIC0yMDY4LAorLTI0NzYwLCAgIC03MjUsICAgLTM1NywgICAxMjczLCAgIDE5NDEsICAgMjUyNSwgICAgIDQ2LCAgIC04MTksCisgIC0yMzAsICAgMTAzMCwgICAyMjkxLCAgIC0yODcsICAgMTA5MiwgIC0yMzE1LCAgICA0MjcsICAgIC0xOSwKKyAgIDQ0OCwgICAxNjk4LCAgIDk3OTcsICAxMDk2MiwgICAzMDM0LCAgIDI2MjIsICAtMjY1MiwgIC0xMTI4LAorICAtMTk0LCAgIC0xODAsICAtMTE3NiwgIC0xNzk0LCAtMjIyNDgsICAgIDI0NCwgICAgIC0zLCAgLTE4NTYsCisgLTEwNTQsICAtMjc1MSwgICAtNDU5LCAgICAtNjIsICAgLTQzMywgIC0yMjc0LCAgLTE3OTAsICAgLTE5MiwKKyAgLTcyMCwgICAtNDIxLCAgICAgNTUsICAgLTcyMSwgICAxOTYwLCAgIDEwOTQsICAgMjUwMCwgIC0yMzUzLAorICAtNDgwLCAgIC03ODQsICAtMTIyMSwgICAtNTA1LCAgIDE3MzgsICAtOTk2MCwgLTEwNzcyLCAtMTM2NTcsCisgICAxMjIsICAgIDM4NywgICAtNjY3LCAgIC00NTQsICAgIDk4OCwgIDMwNzgwLCAgIC03NTcsICAtMjMxOSwKKyAgIDg3OCwgICAgOTYyLCAgICA3NTMsICAgMTMwNiwgICAgNzE2LCAgIC03NzEsICAgIDUzOSwgICAtNzA1LAorICAgNTA4LCAgIDE5MTUsICAgMjExNCwgICAgOTM3LCAgICA0NDcsICAgIDkzNSwgIC0xNDMyLCAgLTExNDMsCisgIDQ0MzUsICAxMTc1OSwgIC0yNDQyLCAgICAtNTMsIC0xMDYwMSwgICAxOTc5LCAgIDU0MTksICAtMjI5NiwKKyAgLTE3MiwgIC01OTg3LCAgLTExNjgsICAtMjAxMiwgICAyMjU3LCAgLTE0NTEsICAgICA5NywgIC0xMjUzLAorICA1NTQ4LCAgICA4ODQsIC0xNDQ0OCwgICAzMTM0LCAgIDI1NDksICAgIDE3MiwgICA1NDA0LCAgICA4NjksCisgICAtODMsICAgIDU5NywgLTEyNDE2LCAgICA3NjIsICAtMTAzNSwgICAtODA1LCAgLTEzNjksICAgLTgwNCwKKyAgIDY2NCwgICA5NjQ0LCAgLTQzMjksICAgMTEzMCwgIC0xNTI2LCAgLTI5MDAsICAgIDYyOCwgICAgNjIwLAorIC02NDM2LCAgLTIzNzAsICAgMjEwNywgLTExODM2LCAgICAgMzcsICAgIDg2NCwgICAyMTA1LCAgICAzMTQsCisgICAyMTYsICAgLTUyOSwgICAgODEwLCAgIDMxNDEsICAgMzcxNiwgICA3MDE5LCAgLTI2NTMsICAgMTQ2NiwKKy0xNDk0MCwgIDEzMTI4LCAgIDEyMTgsICAgMjI4NywgICAtMTQ1LCAgIC00NDMsICAgLTkyMywgICAgNDc2LAorICAyNDExLCAgIDU0MjgsICAgLTYxMSwgICAyMjEyLCAgIDE0NTAsICAtMzA0MiwgIC00NzUwLCAgIDM1NjIsCisgICA1ODcsIC0xNTM3OCwgLTE1MTUxLCAgICA2MDAsICAgMTAyOSwgIC0yMzUzLCAgIC05MzQsICAgMTk4NiwKKyAgMTQ0NCwgIC0yMTcxLCAgIDEwMjAsICAgLTcwMCwgIC0xNTA4LCAgICAxOTUsICAtMjQ2NiwgICAtNzk4LAorIDE2NDYwLCAgLTIxNjQsICAgIDUyMCwgICAyNzExLCAtMTM4MzIsICAtMjAyNCwgICAtODcxLCAgLTUyNjgsCisgIDM1NTYsICAgIDExNywgICAtNDE2LCAgICAgLTgsICAgMjEyOCwgIC0xNTcwLCAgIDIwNTIsICAtMzE2OQorfSwKKworLmNiMDgwOG0xID0geworIDE2NDkyLCAgIC0yOTUsICAgMjU1NiwgICAxMzAzLCAgIC00NDAsICAgNzU4NCwgICAzMzA1LCAgLTM0MjIsCisgLTExOTYsICAtMTgwOSwgICAyMTQyLCAgLTEyOTIsICAgMTA0OCwgICAgMzE0LCAgIDE5NDUsICAgIDU3OCwKKyAgMTA4MCwgICAtMjU1LCAgIDExMDksICAgIDYxNywgICAxNTk3LCAgICAxOTgsIC0yOTA4MSwgICAtMjQzLAorICAgIDU0LCAgICAtMzMsICAgICA3NiwgICAtNDE4LCAgIDEzMzIsICAgIDQ3NSwgICAxNDk1LCAgIDE1NTQsCisgIC03ODIsICAgIDMwOCwgIC0xMjg2LCAgIDEwNDQsICAgIDMwMCwgICAxNTQ0LCAgICA2NDYsICAgOTQ0MSwKKyAgMjU3NywgLTExMTQwLCAgIDE0MjEsICAgMTEwNywgICAtNDgzLCAgIC01OTAsICAgIDYyNSwgICA4NTQ0LAorICAgNDQ2LCAgLTE4MTQsICAgMTcxNCwgICAgNjg1LCAgIDk2MjAsICAtNDk4MSwgIC0zMTAwLCAgIC03MjQsCisgIDg0MzksICAtMjMzMywgICAgNTA2LCAgIDM1NTcsICAtMTE2MCwgIC0yMTk5LCAgIC02NTksICAgNDEwNywKKyAgODYyMCwgIC0xNDA2LCAgLTM3NDUsICAgMTcyOSwgIDEwNzU2LCAgICA4NjgsICAgIC04MiwgICAyNTg0LAorIC0zMTQwLCAgIDM2MzIsICAgMjYxNywgICAzODgwLCAgLTExNzUsICAgLTE2MywgICAxODY0LCAgIC05ODAsCisgICA1NTEsICAgIDIwMSwgICAtNDMzLCAgLTE0NjQsICAgIDcwOCwgICAxOTI2LCAgLTg0NzEsICAgMzg3MCwKKyAtMjM3NiwgIDE1NTY3LCAgIDIxMTIsICAgIDc1MywgIC0yNDUwLCAgICAgNzIsICAgMTEzMSwgICAyOTMyLAorICAtMTM5LCAgIDYzOTIsICAgMTU0NywgICAgICAzLCAgICA2MjUsICAgLTgyMywgIC0xNzUwLCAgICA4MTEsCisgIC05NzcsICAtMTM4OSwgICAxMzAwLCAgIDExODQsICAgIDM5OSwgICA0Njg0LCAgICAxOTYsICAgMzY3OSwKKyAtMTY3MiwgICAtMjE4LCAtMTEwMjMsICAgICA5OCwgICAgNDkyLCAgIDQwNzIsICAgMTIxMywgIC0yMDA0LAorICAzNjAyLCAgLTE3ODcsICAgMTI4OCwgIC05NDQyLCAgIDQxNTcsICAtNDI2NywgICAzNTA5LCAgIDUzMTcsCisgIC01NzQsIC0xMTA5NCwgICAxMDc4LCAgIDYyNDAsICAgMTU5MywgLTEyNzczLCAgICA0MDgsICAgMzk2MCwKKyAgMTExNiwgICAxNTE3LCAgIC04MTYsICAgLTU3NywgICAtNjk2LCAgICA1NTQsICAgMTY0NSwgICAtOTM2LAorICAgIDgzLCAtMjAyNTUsICAgLTc1NCwgICAxNDYwLCAgIDExMTAsICAgMTQxMiwgICAtNzU3LCAgICAzNzcsCisgIDIzNzMsICAtMTYwOCwgIC0xNDE0LCAgLTEwMjgsICAtMzE1MiwgICAxNTM0LCAgLTQxNDUsICAgMjI3NCwKKyAgLTI4NiwgIC03MDU4LCAgIDIyODYsICAgNDAxMywgICAyNTE1LCAgIDI2ODEsICAtNTYwMiwgICAgICAwLAorIC0xNzQwLCAgICAyNTcsICAgIDc1NiwgIDExNDk2LCAgICA5NTQsICAgNDUxMywgICAzOTY4LCAgIDQ4NTEsCisgICAyNzgsICAgLTUxMSwgICAgODI5LCAgIDI4NTMsICAtOTc0MywgIC0zNzIzLCAgLTE1NTAsICAgLTQ0NCwKKyAgNDI1NiwgICAtNjc5LCAtMTE0MTEsICAtNDI5MCwgIC0xNDcwLCAgLTQxOTEsICAgLTk1MiwgICAtMjM5LAorICAtMTk4LCAgIDEzNjEsICAgOTUyNywgICAxNDgxLCAgIC05ODEsICAgMTQwMywgICAgOTkxLCAgIC0yNTUsCisgIDkzMjYsICAgMTgzMiwgIC0xOTM2LCAgIC0xMzUsICAgMTEyMywgICAyNzU2LCAgIDE5MzIsICAgMjU0MywKKyAgIDc5NSwgIDEyNjEyLCAgIDI0MjksICAgLTQ5OCwgLTEzMTg1LCAgIDM4MTIsICAtMTYyOCwgICAgMTk2LAorICAxODIyLCAgIDQzMzMsICAgMjc2MCwgICAtNjc2LCAgLTI5MDIsICAgMTI0NCwgIC0xOTc0LCAgLTcwNDYsCistMTIyMTYsICAgMTUwMywgIC0yMTc2LCAgIDE5MTYsICAgIDM2NSwgICAgNjM2LCAtMTEzNDgsICAtNTAzMCwKKyAtMzMxOSwgIC0zNzk0LCAgLTEwMTYsICAgMTE1NywgIC00MTU4LCAgIDM0MjQsICAgIDM0NCwgICA0NDk0LAorICAgODEyLCAgLTMwNzQsICAgNDM1NiwgICAgMjkzLCAgLTM0NjMsICAgMTIzMiwgICAxNzQ2LCAgIDI2OTYsCisgLTgyNjksICAgLTk2MSwgIC00MzE2LCAgICAxMzAsICAtNDI3OCwgLTE0MDA3LCAgIDMwMjUsICAtMjcwMywKKyAgIDE3OSwgLTEwMTc2LCAgIDE1MTEsICAtMTQ2MCwgIC0xMTAwLCAgLTExNzEsICAtMTU3NSwgIC0yNTk2LAorIC0yMDI2LCAtMTE0MDAsICAgMjY4OSwgICAxNDgwLCAgICA3NDMsICAtMTY2OSwgICAyNzI4LCAgICA3NDIsCisgICAtNjAsICAxMTQ1MiwgICAgIDg0LCAgIC02NjIsICAgMTQyNCwgLTE1MTAzLCAgIC00MTAsICAgMjE0MSwKKyAtMTY2NCwgIC0xMzc4LCAgIC0xMjIsICAgICA5NywgICAtMzU4LCAgIC04MjAsICAgIDM4MiwgIC0zODY1LAorICAgMzc0LCAgIDE2OTgsICAgIC0yMSwgICAtNzUyLCAgICA1OTUsICAtODc3MSwgICAtNzMxLCAgIDkzNjgsCisgIDE2OTgsICAtMjU4NiwgIC02NzkwLCAgLTI1MDcsICAtMTc3NiwgICA0OTkzLCAgLTM4NjcsICAtMjgwNywKKyAgLTE5MCwgIDE0NDY1LCAtMTM5MzgsICAgMzA5NSwgIC0xMTk4LCAgICAzNzQsICAgMTY4MiwgICAxODg4LAorICAgMjg2LCAgIC01NzYsICAtMjA5NCwgICAgNDU0LCAgIC02OTAsICAgMTM5NiwgIC0xMTM5LCAgIC00MjIsCisgICA0MDUsICAgIDIzOCwgICAxNzE4LCAgIDIwNDgsICAxMzQ0OCwgICAtMTUxLCAgIC0yNDcsICAgIDIwMiwKKyAgLTkwMCwgIC01NjMwLCAgIDMxMjEsIC0xMDk4OCwgIC0xNjE1LCAgIDE5NTUsICAtMzkwMSwgICAzMzYwLAorICAxNDI5LCAgIDM5MjgsICAgMTk1MSwgIC0xMDk5LCAgIC00MzUsICAgMTU3MiwgICAxNTAwLCAgMTkxNzYsCisgICA3MzEsICAgLTQzOSwgICAzNjg2LCAgLTMwMzksICAgIDI0NCwgIC00MjcwLCAgICAtMzQsICAgMTI4OSwKKyAgIDI5NiwgICAtNDA2LCAgIDIyMTYsICAtMTQwMCwgIC0xOTQ2LCAgICAyNjQsICAgMTUzNiwgICAyOTkyLAorICAgIDU0LCAgICA4OTIsICAgLTE4MSwgIC0xNTQ1LCAgICAyNzgsICAyNDkyMywgICAgOTg5LCAgIDEzMDEsCisgLTEyNzksICAgLTE4OCwgICAtMTk4LCAgIC02NjEsICAgIDYxMiwgIC0xNTIwLCAgIDIzNTUsIC0xMjk3MiwKKyAgLTY5NCwgICAtNTYwLCAgIDEzNjQsICAtMjk4OCwgIC02MjM2LCAgIDI1NTUsICAtNjYzMCwgICAxNDIzLAorICAgNDQwLCAgIC01OTgsICAtMTA5MiwgICAgMzA0LCAgLTI1MjksICAtMTY5OCwgICAtOTA5LCAgIDI1NjAsCisgICA4NDQsICAgIDc2OCwgIC0yOTg4LCAgIC02NjEsICAxODQzMiwgICAxMTU4LCAgIC02MzksICAgNTA3MCwKKyAxMTAxNSwgICAgLTE0LCAgIDIzMTMsICAgIDc1NiwgIC0xOTQxLCAtMTA5ODYsICAgLTQ5MCwgIC01MjM1LAorICAyNjQ2LCAgIDI0MDYsICAgIDE3MCwgICAtNTQ2LCAgICAzMzcsICAgNjQ5OSwgIC00NDUwLCAgIDU1OTgsCisgICAyOTksICAgLTUwNCwgIDE0MzIyLCAgIC05NzIsICAgOTM1NiwgIC0yMDU2LCAgIDg4MTIsICAtMTU5OSwKKyAtMTkzMSwgICAyMDg0LCAgICAxMTksICAgLTk4MywgICAtMzA1LCAgIDE0MzcsICAgIDQwMywgICAyNjUxLAorICAtMTU5LCAgICAyMjksICAgIDIwOSwgICAxNDM4LCAgLTE3ODksICAtMTE1OSwgICAxMDE3LCAgICA0MTYsCisgICA0MDgsICAgIDQ1NCwgICAgODU4LCAgIC02NTIsICAtMTU1NCwgICAxMTk4LCAgMTgyNzgsICAgIDEyMiwKKyAgIDQzMywgICAtMTY1LCAgICAxNjIsIC0xMDUzMiwgIDExNTYzLCAgIDQ3NTQsICAtMjAyMiwgICA0MjQ2LAorIC0xMzk2LCAgLTI0MTcsICAtMTc5NiwgIC0xNDk2LCAgLTEyNzksICAgMzg3NywgIC0xMjE3LCAgIC03NzAsCisgICA5ODMsICAgLTYwOSwgICAxNzY2LCAgIC0xODQsICAtNTY2NCwgICAgNTQ2LCAgIDc5NDgsICAgMTk3OCwKKyAgLTI1MCwgICA0MzUwLCAgIDM0OTgsICAgMjc5NywgICAgODAyLCAgICA4NDYsIC0xMjYyOCwgIC0xMDkyLAorICAtMjQwLCAgICA3ODEsIC0xMTI1MiwgICAtOTU1LCAgIDk5NDQsICAgLTIyMiwgICAxMTc3LCAgIDEyNjIsCisgIC01MzQsICAgMTc5MCwgIC03Mzk2LCAgIDE0NTIsICAgNDI1MSwgICAgMzAzLCAgLTM3MTQsICAtMjI5NSwKKyAgLTI5MCwgICAtMjI3LCAgICA2NzIsICAyMjY5MCwgICAtNjIyLCAgIC00NjYsICAgMTU5OSwgICAtNDk2LAorICAgMzI2LCAgICA4NzEsICAtMTk0OCwgICAgMTQ4LCAgICA0NDksICAgIDIxNCwgIC0yMTc1LCAgICA3MTMsCisgICAzOTQsICAgMTkyMSwgLTI4NzE2LCAgIC03ODYsICAgMTA4MywgICAtNjQxLCAgIDEyMzIsICAgLTI0NiwKKyAgMTU3MiwgICAxNTc1LCAgIC04NzksICAtMjk2MiwgICAgLTU3LCAgICAzNjksICAgMTYzMywgIC0xNDU3LAorICAxMTk0LCAgLTEyMjIsICAgIDMwNCwgICAtOTU1LCAgICAxMDQsICAtMTI0OSwgICAtOTM1LCAgICAxMzUsCisgIC03NTgsICAgMzQ4MywgIC0xMTkwLCAgIDE0NTcsICAgMTEzMCwgIC0xMjg0LCAgLTM3MDksICAxODA0MiwKKyAgICAgNiwgICAgIDI1LCAgIDEyMzMsICAgLTMyOCwgICAgMzQ3LCAgIC01MTIsICAgMjA3MSwgICAgMzI4LAorLTE4MDM3LCAgIDQ1ODIsICAgMzg0MSwgICAtNDM0LCAgIC03NDUsICAgIDMzMiwgICAtNTc2LCAgIDMwMDYsCisgICAzMzYsIC0xMTUwNSwgICAtNjQ2LCAgIDM1MDksICAgLTk5NiwgICAxMjcwLCAgIDIwNDEsICAgMTM1MywKKyAgMTE5MywgICAyOTc2LCAgMTE1NjksICAtMzE2NSwgICAxNDUwLCAgIDQzNTEsICAgMjUyMiwgLTEwMDIyLAorICAgIC02LCAgMTI2MDIsICAgIDg3NCwgICAgNTE4LCAgICA0NzUsICAgMTI1MSwgIC0zMjkwLCAgLTI2NzQsCisgIDQ4MDIsIC0xMTc5NCwgICAtOTQ2LCAgIC00MjYsICAtMjg0NiwgICAxNjE5LCAgIDExMDUsICAtMTAyMiwKKyAgICAtMSwgICAxNzU5LCAgICA2NDYsICAxMDM0NywgIC0yOTM3LCAgMTM1MDUsICAgMTEwNCwgICAgNjE0LAorICAxMTQ5LCAgIC04MDAsICAgMjM3NywgICAtMTE1LCAgICA3OTIsICAgLTk0OCwgIC0yNDMxLCAgLTE3NzksCisgLTExNDIsICAgIDgwOSwgIC0zMTMwLCAgICA0NDcsIC0xNTUxNiwgICAgMzEzLCAgMTEyMzUsICAtMTM0NiwKKyAtMjQyNiwgIC0yNzM3LCAgLTE3MzgsICAgMjIzNiwgICAxMDk0LCAgICA4MDIsICAgMTMyMywgICAzNjEyLAorICAtMjEzLCAgIDEzODMsICAgMjgwMCwgIDEwMzk0LCAgIDEyMTAsICAtMjM2MCwgLTEwMjAzLCAgLTE5OTEsCisgIC0xMDIsICAtMjY2OSwgICAyMzAzLCAgLTIxODQsICAgMTgzMCwgIC0xMTU4LCAgLTU2MzMsICAtNDA4MywKKyAgLTI1MiwgICAgMzExLCAgICA2MTIsICAgLTMzMSwgIC0yNzg2LCAtMTI0MjEsICAgOTk5NCwgIC02MDA2LAorIC00OTk2LCAgIC05NTQsICAgMTAxNCwgIC0xMTQ3LCAgICA4NjAsICAgMTI1MiwgICAxMTE0LCAgLTIwNjksCisgICAyNjYsICAgLTIzMCwgICAtNTkxLCAgLTQ0NDIsICAgIDIzMCwgIDIwNjAzLCAgIDEzODYsICAgMTEzMCwKKyAtMTQ2OCwgIC0zNjAwLCAgIDIxNjgsICAgIDgzNiwgIC0xNzU0LCAgIC01MTEsICAgLTU0MiwgICAgMjE2LAorICAgIDI2LCAgIDM0NzYsICAgMTE2NSwgIC00MjkzLCAgIDMwOTgsICAgLTI0NSwgICAtNTc5LCAgIDE4MzAsCisgIDIyNDgsICAgNTMyNiwgLTE4MzU3LCAgICAzOTcsICAgNTQ2NiwgICAgNzM0LCAgIDM5MjAsICAtMzY3OCwKKyAgIDMxOSwgIC0xMDYyLCAgIC02MTAsICAtNzUwOSwgIC0xMDY0LCAgIDE0NTYsICAtNTcyOSwgICAxMDg4LAorICA5MDk5LCAgIDIyNjYsICAgIDI0MSwgICAgMjAxLCAtMTAwMTcsICAtMTU0NSwgIC0yNzk5LCAgIDE0OTEsCisgMjcwOTgsICAgIC02MCwgIC0xNzM2LCAgIDEzODcsICAgIDg1OSwgIC0xNDc0LCAgICAtNzksICAtMTEyMiwKKyAgLTk3MSwgIC0xMzAyLCAgICA5MDYsICAtMTEzMywgIC0yNjU5LCAgIC0yOTYsICAgMTM0NCwgIC0yNjk4LAorICAtNDQ4LCAgLTE0NzYsICAgLTIxMiwgIC0xNTg1LCAgIDEzMTAsICAxNDM1MywgIC0yMTY1LCAgLTIyMjksCisgIC02NTYsICAgNTIxOSwgIC0zMjY2LCAgLTE4NTAsICAgNzk0MiwgICA0OTk3LCAgLTIyOTUsICAgIDUxOSwKKyAgIDYwOCwgIC05NDk4LCAgLTE3MDAsICAgMTc3MCwgLTE1MzA4LCAgIDEyODYsICAtMjkxNCwgICAyMjUyLAorICAtNzE3LCAgIDIxMzYsICAgMjQ3OCwgIC0zNzQ3LCAgIDIzNjIsICAgICAtNSwgICAtMjM3LCAgIDIzMzQsCisgICA3MDEsICAgLTc3NCwgICAtNjcyLCAgICAtMjAsICAgLTU5OSwgICAgNjIzLCAgIC03MDAsICAgLTcxMywKKyAgLTk3OSwgLTI5OTI2LCAgLTEwOTAsICAgIDg0OCwgICAtMTQxLCAgIDEyNzMsICAgLTcxMSwgICAxNzgyLAorICAtMjIxLCAgIC0xMDMsICAgIDE3MCwgICAtMTg1LCAgLTEwNTksICAgMzA2NiwgICAxMzIxLCAgIDExODIsCisgIDM2NDEsICAgLTIxNywgICAxOTU5LCAgMTE4MDYsICAgMjM5MCwgLTEwMzEyLCAgLTI1NzUsICAgMTYxMiwKKyAgIDU5NiwgICAtMzUyLCAgIDIxOTcsICAtMjA0MSwgICAyMzg1LCAgIC04OTgsICAtOTM2MywgIC0xMTQ0LAorLTEwODk2LCAgICAgMjAsICAtNzg0MiwgIC0xMDQ3LCAgIDM2ODcsICAgMjE0NywgICAyNTg0LCAgIC0yNDksCisgICAtNzIsICAzMjc2NywgICAxOTM2LCAgICA0NDYsICAgLTg4OSwgICAtODQ1LCAgIC04OTYsICAgMTI2OSwKKyAgIDQ0OCwgICAgMzI3LCAgLTM0MTEsICAgICAgNCwgICAgNzAyLCAgLTE5MDAsICAgLTY0NiwgICAgNzk5LAorICAtNzcwLCAgICA2NjIsICAgLTkxMSwgICAtODU2LCAgICAyODcsICAgMTY2NywgICAtMTA4LCAgICAtNjQsCisgICAgMTYsICAgMTU3OCwgIC0yMDU5LCAtMjczMjcsICAgIDExMiwgICAtMTg4LCAgIDI1MDQsICAgLTY5MiwKKyAgIDI1MCwgICAgMzYwLCAgICA1NjQsICAgIDg2OCwgICA0MTQ3LCAgIDEzNDAsICAxODA4MCwgIC0zNTg0LAorICAgNDQ1LCAgICAzNjQsICAtMjYyMywgICAtNDEyLCAgLTI5MTgsICAgLTExNiwgICAyNjExLCAgLTIzOTYsCisgICAtNDQsICAxMDkzNCwgIC0xNTEyLCAgLTExNjYsICAgIDIzOSwgICAgOTEzLCAgICAxOTAsIC0xNDY4MSwKKyAgLTc2NywgICAyNjEwLCAgIDI5MzEsICAtMjM4OSwgICAzNTkwLCAgLTE2ODAsICAgNjI4NywgICAtNTMxLAorICAtNjE2LCAgIDEzMTcsICAtMTAzNCwgICAtOTAwLCAgICA4NzEsICAgLTMyOSwgICAgNDY3LCAgIDEyMDAsCisgLTE5MTQsICAgMTEwOCwgICAzMTUwLCAgLTY4NzgsICAgIDU0NCwgLTE0NDExLCAgIDI4MDcsICAgNTQyNywKKyAxMzM2MSwgICAxNDQ4LCAgLTE3NTMsICAgIDUyNCwgIC01ODUxLCAgIDE0NjcsICAtMTg2NiwgICA2ODg4LAorIC04NzQyLCAgIDEzNzIsICAtMTUxNSwgICA0ODgzLCAgLTIyNDgsICAtMTA0MiwgICA0NjI4LCAgMTA3NjgsCisgICAxNDksICAgLTM1OCwgIC0xMjg3LCAgLTEyODksICAzMjc2NywgIC0xMTM3LCAgICA5NDEsICAtMjExMiwKKyAgIDQ1MSwgIC0xNDM2LCAgICAxNzQsICAgIDI5NCwgICAgNDc1LCAgLTM2NjcsICAgMTYxMCwgICAxNjQxLAorICAtNTk5LCAgICA2MjYsICAgMjA1OCwgICAgNjcxLCAgIDE2MjYsICAgLTk4NSwgICAtMTIzLCAgIDIwNDAsCisgICA0MjEsICAgMTc5NywgIDE4NDQ4LCAgIDI1MzgsICAgLTM1OSwgIC01MDQyLCAgIDMwOTYsICAtMTEzNiwKKyAgLTMyMCwgICAxODIzLCAgICAgMzAsIC0xMjAwMiwgIC0xMjk3LCAgIC04NTAsICAgLTQxOCwgIC0xNDk3LAorIC0xNzYxLCAgIDUwNzMsICAxMDk0NCwgICAgMjEyLCAgLTQ3MTMsICAtMTYxNCwgIC0xNzUyLCAgLTIxMzUsCisgICA0ODMsICAgMTA0MywgIC0xOTg5LCAgIC0yOTMsICAgICAzOSwgIC0xMDQ5LCAgICAgNjcsICAtNzQ4MiwKKyAgIDcxMiwgIC01MzU4LCAgICA4OTYsICAxMjQ2MCwgIC0xNzQ0LCAgLTE3OTMsICAgMTUzOCwgICAzNTc3LAorICAgIC02LCAgICA0MTgsICAgIC03MiwgICAxMDcyLCAgIDEzNjcsICAgMTA4MCwgICAzNTY0LCAgIDE0NjgsCisgICA0ODIsICAtMTI5OCwgIC02NDQyLCAgIC0yOTksIC0xMjkzNCwgICAtNzU3LCAgLTQxOTksICAgMzg0MiwKKy0xMTMzMSwgIC0xMjE2LCAgIC0yMDYsICAgMTU5OCwgIC0xMTM1LCAgLTMyNDAsICAgMzI5NCwgICAtMjg2LAorICAtNTQwLCAgICA3NzcsICAgMTE4OCwgIC0xMTg5LCAgIDQ1MTYsICAgMjYzOCwgICAyMDcxLCAgIDk3MDIsCisgIC05MDAsICAgMTAwMiwgIDE4NzA3LCAgIC03MDUsICAtMTg1NiwgICAxMTg1LCAgLTQ4MzIsICAtMTY5NCwKKyAtMzUwMiwgIC0yMzI0LCAgLTI4MjYsICAtNDYwMCwgICAxOTk2LCAgLTMxMTAsICAgIDExMCwgICAgMTE3LAorICAgNDA1LCAtMTY4NTQsICAgLTUxMCwgLTE0NzI1LCAgIDE2OTksICAgMTkyMiwgIC0yMTE3LCAgLTI3MTgsCisgICAgNDUsICAgMTA2NCwgICAgNTA3LCAgLTE3ODEsICAgMjEwNiwgIC0yMzEwLCAgIDEyMzksICAgNTg2MAorfSwKKworLmNiMTEwOGwwID0geworICAyMzU0LCAgIDgwMTYsICAxMjUyOCwgICAtOTQ3LCAgIC0zNDgsICAgMTc2MCwgICAyMDU0LCAgLTM5NjAsCisgLTIxMjUsICAtMzU3OCwgICAzOTMyLCAgIDE2NDcsICAtMzMxNiwgICA2MDUzLCAgICAzOTIsICAtMzEyOCwKKyAgMzIwOSwgIC0yNDQ1LCAgICA0NjMsICAtMjgzNSwgIC0xNTU1LCAgIDEyNTksICAgIDI5NiwgIC0xNDY1LAorICAxODM5LCAgLTQ4MTEsICAgIDQyMCwgICAtMjE1LCAgICA0NjksICAtMTAxMywgICAtMjcyLCAgICAxODUsCistMjcwNjEsICAtMTE1NCwgICAgICA4LCAgICAyOTgsICAgIDI1OSwgICAtOTUzLCAgIC01NTUsICAgIDQ3MiwKKyAgIDYxNywgIC0xMTI3LCAgIC02NzMsICAgIDk4MiwgICAtMzk4LCAgLTE2ODEsICAgIDMyOCwgICAgODgyLAorICAgNjE0LCAgICA4MDAsICAgIDQzMSwgICAgIDg0LCAgICA4ODAsICAgLTI0MCwgIDE1NzU4LCAtMTQzMjQsCisgIDEzMDEsICAgMTU3OCwgICAgOTMyLCAgIC02OTQsICAtMTQ1NiwgICAyNDM1LCAgLTE2NTEsICAgMTQ2NCwKKyAgIDIyNywgICAxNTI3LCAgICA1MjcsICAgLTEyOCwgICAgNjk4LCAgIDI0MDUsICAgLTcyNiwgICAxNDg5LAorICAxMDE2LCAgIDE5MzgsICAtMTg5NywgIC0xNDc4LCAgIC0yMzgsICAgIDkzMiwgICAyNTA3LCAgIC01MTksCisgLTExNDcsICAgIDU1NywgICAyMzM0LCAgICA3MDAsIC0xMjkxNCwgIDE0ODYxLCAgICAxNTgsICAgIDI1NSwKKyAgMTE5NSwgICAtODgzLCAgIDMzNTksICAtMTA0NSwgICAyMDk1LCAgICA1MjAsICAgIDI0OSwgICAgOTI2LAorICAgNzg5LCAgIDEzOTIsICAgLTE4NSwgIC0xNjU0LCAgICA5MDIsICAgICAgOSwgIC0yMTY2LCAgLTE5MTYsCisgICA1NDMsICAtMjEyNiwgICAyODQyLCAgIC0zMzIsICAgMTM1NiwgICAtMzQ0LCAgICA0MzYsICAgLTQwNCwKKyAgLTE3NCwgICAtNDg5LCAgICA4NTgsICAgIDI1OCwgICAgMjI5LCAgICAtNDUsICAgIDMyNywgICAtMzE2LAorIC0xMTc2LCAgIC00NTQsICAgIDExNSwgICAtMjIwLCAgIC00NTgsICAgLTE5NCwgICAgMjcxLCAgIC01MzAsCisgIDE1NzIsICAgLTU3NCwgLTI1MDY4LCAgICAxNjcsICAgIDYwMSwgIC0xMDI3LCAgLTE3MDUsICAtMzE0NCwKKyAtNDIzMSwgIC0xNjM2LCAgLTEwMTIsICAtMTAwMiwgICAtNTE5LCAgIC04MjUsICAgLTQ1OCwgICAgOTQ1LAorICAgNTQ2LCAgICAxOTMsIC0xNzkwOSwgICAtMTU2LCAgLTEwNjcsICAgIDgyNiwgICAgMzM4LCAgIDExNTIsCisgICA1NjIsICAgLTUwNiwgICAgODQ4LCAgICAyMzksICAgIDE4OCwgICAgNjU2LCAgICAgOTcsICAgLTE3NCwKKyAgIC01OSwgICAgMjQyLCAgIDE5NDYsICAgIC02NywgICAgNzQ1LCAgIDIwNDMsICAgIDQyNCwgICAtMTkyLAorICAgNTc0LCAgIC01MjQsICAgMTU1MywgICAgNTY2LCAgIDE0ODAsICAgLTc0NywgICAgNDg3LCAtMjA2MjMsCisgICA4NzIsICAtMTA4OSwgICAxMDM0LCAgIDEzNTcsICAgIDkxOSwgICAgMTUzLCAgICAxNTQsICAgIDQ5OCwKKyAgICA1NCwgICAgNTU1LCAgIC05ODksICAgIDcwNywgICAgLTg1LCAgICAtMjEsICAgIDcwMCwgIC0xNDI0LAorICAgIDkwLCAgICA2NTUsICAgLTM5OSwgICAgMTIzLCAgIC03MDksICAgIDExNywgICAgNDM4LCAgICAzMzAsCisgIC03MjAsICAgIDE5MCwgICAgODEyLCAgIC0xMzgsICAgIDQ2MCwgLTMyNzY4LCAgIC0xNjIsICAgLTQxMCwKKyAgLTMyNywgICAtMTIyLCAgLTEyMDgsICAgLTU1NCwgICAtNTAyLCAgIC0xNzgsICAgLTMwOSwgICAgMzczLAorICA0Mjk1LCAgIC05NDUsICAtNTUwMiwgIC0yNzUyLCAgLTY2MTUsICAtMTI0MSwgICAxMjc4LCAgLTEzMTUsCisgLTc2ODMsICAgLTk4NiwgICAtNDE5LCAgICAtNTAsICAgMjM4NCwgIC00NjQwLCAgLTYyNDYsIC0xMTgwNCwKKyAgLTMwOCwgICAtNDQ2LCAgIDM0ODYsICAtNDgyNCwgICAxNzM2LCAgIC01OTAsICAgIDk2MCwgICAgMTk1LAorICAgNTkzLCAgICAxNjQsICAgMzM1NSwgICAxNjU1LCAgIDEyMzMsICAgICA2NiwgICAtNzg3LCAgIC0zNDcsCistMTM3NTEsICAgICA3NCwgIC0xMjA5LCAgIC04MTIsICAtNDA5OCwgICAtMTAyLCAgICA5MTAsICAtMTY1OSwKKyAtMjAzNiwgIC0zMTQ3LCAgLTIwNzUsICAtMjYwNSwgIC0xMjQwLCAgIDQ0OTksICAgMTcyNywgIC05NDg0LAorICAgNTQ5LCAgICA3MjgsICAgMzQxMSwgICAxOTU4LCAgLTQ0MzksICAtMTA2NCwgICA1NjkwLCAgLTE2MDAsCisgLTE5ODQsICAgMTY5NSwgICAtNTg4LCAgIDQ4MTUsICAgLTEzOCwgIC0zMzgwLCAgIC01MTIsICAgMTU1MywKKyAgMTk3OCwgICA0MzEwLCAgIC03MzAsICAgLTQwMiwgICAgODI4LCAgIDIxMjQsICAxNDIxNiwgICAtMjIyLAorICAyNzU3LCAgLTg2ODYsICAgIDUyMywgICAyNTE2LCAgIDEwMTcsICAgIDc5MCwgICAtMTM2LCAgIC00NzAsCisgIC0yNTIsICAgLTcxNywgICAgODA4LCAgLTExMTMsICAxMzc2NiwgICAtMTE0LCAgLTExODIsICAgMzA1MywKKyAtNTIzOCwgIC0yMjMxLCAgIDE3MjAsICAgLTUxMSwgICAtOTg3LCAgIDE1OTIsICAtMTI1NywgIC0yNTc4LAorICAxNzc3LCAgIDEwNzUsICAgMjM2NywgICAtMjI3LCAgIDIzMzAsICAgLTY3MiwgIC0yNjIwLCAgLTE0NDksCisgIDIxMjIsICAgIDM2MiwgICAxMjQ5LCAgIDEzMzgsICAgLTMyNywgLTIxNjMxLCAgLTE1NDAsICAgICAyNCwKKyAtMjM1NiwgICAtNjU2LCAgIDE5ODEsICAgIC05MiwgICAtMjA3LCAgLTIxODgsICAgICAzNCwgICAtNDU3LAorIC0xMjkxLCAgIDEyMzEsICAgLTQ2MCwgICAtMTI4LCAgIC0zOTYsICAgIDU5MywgICAtNjcxLCAgLTE1MTMsCisgICAxMzYsICAgLTMzNSwgICAgNTYwLCAgLTExMjEsICAgIDQ5MCwgICAxMDA4LCAgICA5NDgsICAgODYyOSwKKyAtMzM0NCwgICAgNDY3LCAgICA4ODEsICAtNTczMSwgICAxMTIwLCAgIC0zMDAsICAtMTQzMiwgICAxMjI3LAorICAxNTU4LCAgICA5OTAsICAtMTA3OCwgICAgMjE0LCAgIC05MjIsICAgIC04MSwgICAxMTIwLCAtMTU1ODYsCisgLTExNzYsICAgMTIwMywgIC0xOTExLCAgICAxNTEsICAgMTQ4NCwgICAxNTU1LCAgIC00MjEsICAgLTQyMCwKKyAgLTQyOCwgICAtNzYyLCAgICAyOTIsICAgIC01OSwgICAxMDc1LCAgIC02NDksICAgLTg0MSwgICAgNDk0LAorICAgMTk0LCAgICAgMjcsICAgLTc2OCwgICAtMzU2LCAgICAgNTQsICAgIDE2MywgICAgLTczLCAgICAyOTMsCisgLTE3MTcsICAgLTM5MiwgICAgNzUwLCAgICAyMzQsICAgIDc1MSwgICAtMTExLCAgMjY4NTgsICAgIDkxMSwKKyAgLTM4OSwgICAgNDUxLCAgICA0NDIsICAgIDI2MCwgICAtMTE3LCAgICAyNzAsICAgICAxOSwgIC0yNDI5LAorICAgNjE4LCAgIC05NjIsICAgIDM3OCwgICAgIDEwLCAgLTE5NTQsICAtMTMzNiwgICAgNTI1LCAgIC0yNTgsCisgIC02OTMsICAtNDE1NSwgIDEwMjY1LCAgIDI5MjQsICAtMTM2MSwgICAzMTk3LCAgMTAxOTksICAgNjg3MCwKKyAtMjYwOCwgIC01NzkyLCAgICA2MTksICAtMTk5NCwgIC0yMDM1LCAgIC03MDEsICAgMjU5OCwgICAgNDY1LAorICAtNTc1LCAgICAzMTEsICAgIDE3NSwgICAgMTYyLCAgLTExOTEsICAgIDE2MiwgICAtMTU3LCAgIC0xNDcsCisgICAzMjUsICAgIDU1MSwgICAgNTM2LCAgIC0xODgsICAgLTI5MCwgICAtMTY1LCAgICAzNDMsICAgICAxNCwKKyAgLTI2OCwgLTI3MTEzLCAgICAyNzgsICAgIDEyNywgICAtMjMzLCAgICAtNjgsICAgIDYwNiwgICAgMTI1LAorICAgNjY1LCAgICA0MzgsICAgLTQ0MiwgICAyNTEwLCAgICA4MDAsICAtMTk5MSwgICAtNjQxLCAgIC0zODYsCisgLTE1NzQsICAgICA3OCwgICAgOTQ2LCAgICAxODksICAgIDEwNiwgIC0yMjQ5LCAgIC0yNjgsICAtMTcwOCwKKyAtMTE5MiwgICAgOTg2LCAgIDMwNzYsICAgMTgwNywgICAgIDIxLCAgLTU4ODQsICAgLTk2NCwgICAgMjU2LAorLTE1OTE2LCAgLTEzMjAsICAtMjg2NywgIC0zNTYyLCAgICA0OTEsICAgMzUwMiwgICAtMzM3LCAgLTE1NDIsCisgICA0OTYsICAtMzE4MiwgICAxNjc2LCAgLTIzNzEsICAtNDI2NCwgIC0yMDUzLCAgMTQzNDIsICAtNTY3NCwKKyAgMTc0NCwgICAxODEzLCAgLTM3MzEsICAtMzc2MSwgICAxMzUwLCAgIDE3ODMsICAgLTQzOCwgICAtOTIwLAorICAyMzY2LCAgIDE0MzgsICAgLTY4NywgICAgNTEyLCAgLTE5MzQsICAgIDMyMywgIC0zMTU4LCAgIDE3NzUsCisgIDE5NjQsICAtNjc0MiwgIDEwMTYyLCAgIDc3NjMsICAgMTQ2OSwgICAxOTY3LCAgICA4NTEsICAgMjc0MiwKKyAgNzQxMywgIC0zMzM4LCAgICA3NDIsICAgMTg1NCwgICAgMzEwLCAgIC0xOTIsICAgLTkzNiwgIC0xNzcwLAorICAtNzc1LCAgIC05NzYsICAtMTUzMiwgIC0xNDM2LCAgIC02NzAsICAtNDAzMiwgICAxMTk0LCAgLTEzMzYsCisgLTQzNjksICAgIDMzMiwgICAgNjA0LCAgICA5NjIsIC0yNzU2MywgICAtOTcyLCAgICA4NDIsICAgLTc0MywKKyAgIDI3NSwgICAgNzEzLCAgIC0yNTEsICAgLTc5OSwgIC0xMTkwLCAgICAzNzIsICAgLTIxMywgICAtNDIzLAorICAgMjAyLCAgIDExODksICAgIC0zMSwgICAxMDg0LCAgIC05NzQsICAgIDc1NiwgICAtMTQ4LCAgLTE2NjksCisgICA2NDAsICAgLTU0OSwgICAtMzM5LCAgLTE1MDYsICAgLTExMiwgICAtNTk4LCAgIC04NzAsICAgIDQxMCwKKy0xMzMwNywgIDEzMTQxLCAgLTE5MTEsICAgMjMwOCwgICAgLTkyLCAgIC03NzYsICAgIDIyMSwgICAxNTAzLAorICAxNTc4LCAgICA4MDMsICAgLTMwOCwgIC0xNjcyLCAgIC00MDQsICAgIC04MywgIC0zNTE3LCAgLTEzMjcsCisgIC02MDYsICAtMjQyNiwgICAgLTYxLCAgIC01MTMsICAgIDMxOCwgIC0xODA1LCAgIDIwNDksICAgMTg4NywKKyAgLTc3NywgICAxMjY4LCAgIC01NDIsICAgLTExNiwgICAzNTUwLCAtMTg4NDAsICAtMjk4NiwgICAtOTc5LAorICAyNjUzLCAgLTI4NzUsICAgLTkyMiwgLTEwNTIwLCAgICA4MDQsICAgIDEwNywgICAzMjM0LCAgLTEyNzAsCisgIC02MDgsICAgMTA0MiwgICAzNTk5LCAgICA5NjUsICAgLTM0MiwgIC0yMDk2LCAgIC0yNjcsICAgMTcwNCwKKyAtMzkzOSwgICAgNzkxLCAgIDIxODAsICAgLTk4NSwgICAgODE2LCAgIC03MTYsICAtMjY2MSwgICAgIDk5LAorICAxNTIzLCAgMTE5MDIsICAtMTc4MiwgICAgNzc1LCAtMTI1MTcsICAgMzI0NCwgIC0zNzYyLCAgIDIwNDYsCisgIC0yNzgsICAgMTUzOSwgICAyODk1LCAgLTI0MjUsICAgIC0xMCwgICAgOTkwLCAgIDE0ODQsICAtMTM3NywKKyAtMzM5OSwgICAtOTg0LCAgIDMxNzEsICAgMTUxMywgICAgNjk2LCAgIC03ODUsICAgIDE1NSwgIC0xMDcyLAorICAgNDE0LCAgIDIwMTYsICAtMTkzMiwgIC0zMTI0LCAgLTExMjYsICAgICA2OCwgICAzODU1LCAgIDEzNjAsCisgIDQwNzQsICAxNzU5NiwgICAxNzE0LCAgIC01OTYsICAgNDAwMCwgICAxNjU2LCAgICAyMzAsICAgLTI1OCwKKyAgMjI2NiwgICAgODQzLCAgLTE3MjAsICAgNDYyNCwgICAtNzE0LCAgICA4NTQsICAgIDY5NiwgICAgNjM2LAorIC0xMzU3LCAgICAzNTAsICAtMTI1NiwgICAtNTIzLCAgICAxNjgsICAtOTkzMywgICAtNzY2LCAgICAxOTgsCisgIDI2ODAsICAgODA2MCwgICAyMTY4LCAgLTI3ODksIC0xNDI1NSwgICAxNDQ0LCAgIC01MjAsICAgIDE2OSwKKyAgMTAzMiwgICAxNDc4LCAgICAyOTQsICAgLTY0NCwgICAtMzIwLCAgICA4NTYsICAgMTI4MiwgICAtMjE2LAorIC0xMDAwLCAgIC05MjUsICAgICAgMiwgICAtODkwLCAgICA2NzksICAgLTYyOSwgICAxMTUyLCAgLTEzMjksCistMTM5NDEsIC0xNjM4NSwgIC0xMDUwLCAgLTEwMjIsICAgIDEwNiwgIC0xMTUxLCAgICAtNDEsICAgLTcwOSwKKyAgMTc3MSwgICAtODgyLCAgIC03MjksICAtMTQyMCwgICAxNTQ0LCAgIC0xMjAsICAgIDM4NiwgICAtODM4LAorIC0yNzQ0LCAgIDE1NTksICAgIDkwNCwgICAgMjczLCAgLTQyMjEsICAtMTA2NSwgICAtMzEyLCAgLTEwNDYsCisgICAyMzQsICAgIDgzMCwgICAgMzg3LCAgICAxNzIsICAgLTk1NiwgICAtMzMyLCAgICAzNjAsICAgIDQwOCwKKyAgIDEyNSwgICAgIDkwLCAgICAzNDgsICAgIDkxNSwgICAtMjY0LCAgICA5MTEsICAgIDI2MywgICAgMTI0LAorICAtNjIwLCAgIC02MTIsICAgIDIyMCwgICAgMTY0LCAgICAyMDIsICAgIDEyNCwgLTMwMjUyLCAgIC0xNTksCisgIDEwMDYsICAgLTMyMCwgICAgMjgzLCAgLTE2NDEsICAtMTMxMiwgIC05MDU3LCAgIDU1MjUsICAgNzUyMCwKKyAtMjg4NCwgLTEyMTk0LCAgIDI3NzEsICAtMTE2NCwgICAxODQyLCAgIDEyNjEsICAgLTU4MiwgICAgNzY2LAorICAyNDk4LCAgICAzOTMsICAgIDk1MywgICAtNjE3LCAgIC03NTYsICAgLTMyMywgIC0xODYyLCAgIDExOTUsCisgLTEzMjYsICAgLTQzNiwgICAtOTY1LCAgICAzNjYsICAtNjcyNywgIC0xMjI2LCAgIDkwMTQsICAgIDQwMCwKKyAtMTI1OCwgICAtODEyLCAgIC0yNzksICAgLTQwNCwgICAxNjIxLCAgICAgODYsICAgMTYyMiwgICAgLTE2LAorICAgIDk2LCAgIC01MTUsICAgLTI1NywgICAgLTM5LCAgIC0xMzQsICAgMTg0MywgICAtMjk0LCAgIC00OTEsCisgIC05MDgsICAgLTEyMCwgICAtNzIwLCAgLTExNjIsICAtMTU1NSwgICAgNDA1LCAgIC0xMzQsICAgIDUyOCwKKyAyMzU5NiwgICAgLTc3LCAgICAxODMsICAgLTQ0NCwgICAyMDc3LCAgICA5NTUsICAgIDY0OSwgICAyMjQ2LAorICAzMjM2LCAgICA3MzUsICAtMTIwMiwgICA3OTU0LCAgIDk0NDAsICAgNjEzNCwgIC03MjY3LCAgICAgMjgsCisgLTMzOTgsICAgIDUwMCwgICA0OTY1LCAgLTEyMzAsICAgIDMwNiwgICAgMzU3LCAgIDI5NDIsICAgLTkwNiwKKyAtNDczMywgICAgOTAzLCAgLTM5NDUsICAgNDQ0NywgICAxMDQ2LCAgLTExMjUsICAgIDQ2NSwgICAxMTgzLAorLTEyNzEwLCAgLTEwMTgsIC0xMTMwMiwgICA1MTc3LCAgIC0yMTksICAtNjIzMiwgICAxNTUyLCAgIDIwNjEsCisgLTEzNzIsICAtMTI5MCwgICAtODIyLCAgICAyOTUsICAgIDgxNCwgIC0zMDAzLCAgIC01MjcsICAgLTYxNCwKKyAgLTg1NiwgICAgODAyLCAgICAxNjcsICAgMTE3OCwgICAtNDk0LCAgLTE2MjUsICAgIDc1NCwgIC0xNTUwLAorICAgNjgyLCAgLTEyODYsICAgLTQ4MCwgICAtNjk0LCAgICAgODYsICAgIC02NywgIC0xNDI5LCAgLTEyMzUsCisgIC01NTksICAgLTMxMSwgICAgMzIyLCAgIC0zMDgsICAgIC01NiwgICAgMjk2LCAgIC0xNTgsICAgIC0yNCwKKyAgLTc0OCwgICAtMTk3LCAgMjY5NTQsICAgMTA1NCwgICAgMjA5LCAgIC0yMjYsICAgIDE2NSwgICAgNjgxLAorICAtMTMxLCAgICAzNDEsICAgIDM0MSwgICAxNTEwLCAgICA2MTUsICAgIDkwNywgICAtMjY0LCAgIDEzNTUsCisgICAzODgsICAgIDE5OCwgICAgIC01LCAgICA0MTgsICAgLTc4MywgIDI4NTM5LCAgICAgODIsICAgLTU1OSwKKyAgLTQ1OSwgICAtMzQ0LCAgICAyNzksICAgLTExNCwgICAgOTY2LCAgIC01MjksICAgLTQyMywgICAgMjg2LAorICAtNDE4LCAgIC03NjYsICAgICA0MiwgICAgMTg2LCAgICA0NjEsICAgIDQxOCwgICAtNjg4LCAgIDI5MzcsCisgIDI3OTMsICAgIDE0NiwgICAxNzA5LCAgIC02NjUsICAgMjAyMiwgICAgMjkzLCAgLTE1MjIsICAtMjc0MCwKKy0xNTkyNiwgICAtNjAwLCAgLTE1MDMsICAtMTczMiwgIC0yODI3LCAgLTEwMjcsICAgMTcwMiwgICAgMjUyLAorICAtNjQzLCAgICA0NzAsICAgLTgxNSwgICAgODU4LCAgLTE5NTQsICAgMTE5MCwgICAxODQ3LCAgICAtMTYsCisgICAyNjYsICAgICAyOSwgICAgNDg2LCAgMjU5ODUsICAgIDEzOSwgICAgMjIwLCAgICA0MzMsICAgLTMzMCwKKyAgIDE2OCwgICAtMzYyLCAgIC01NjIsICAgIDE4MCwgICAgOTA2LCAgICAzODYsICAgLTg0NSwgICAgNjY0LAorICAxMDY0LCAgIC02MTYsICAtMTQ5OCwgICAtMzM1LCAgIC0xNjQsICAgLTkzMCwgICAtODU0LCAgIC04NjksCisgIC0xMDEsICAgLTIwNCwgICAgODM1LCAgICAxMTcsIC0xNjAzNCwgIC00NDc4LCAgIDI2MzQsICAgMTYyOSwKKyAtMTg3MywgIC0xMTU2LCAgIC0zNzMsICAgLTUyNiwgICAyNTM3LCAgICA5NjcsICAtMjQzMywgICAtODU3LAorICAxMjY0LCAgLTE2NzAsICAgIDExMywgICAgODQ1LCAgIDc2NTQsICAtMTM0MywgICA1MjQ1LCAgLTE2MDUsCisgIDIyMzYsICAtMTE5MCwgICAgLTQ4LCAgIDMzNDAsICAtMTk4MSwgIC0xNjA2LCAgLTEzNjksICAgLTIyNywKKyAgLTcyNywgICAtNTcwLCAgIDExMzYsICAgMTg2OCwgICAgNjY3LCAgICAgOTIsICAgLTE0NCwgICAgNTMxLAorICAgOTQ5LCAgLTEwODYsICAgIDUzMCwgICAxNzY0LCAgICAzMDIsICAgIDE5MCwgLTI4MDM2LCAgICAxODIsCisgICA4MjUsICAgIDIyOSwgICAtNjU2LCAgICA1ODUsICAgIDQ0NCwgICAgMjAwLCAgLTExOTUsICAtMTg1NSwKKyAgLTM4NywgICAtNzgxLCAgIDExNTYsICAgIDY5MiwgIC0xMTY0LCAgIC01MTcsICAgLTQ2NCwgICAtMjc1LAorICAtMzI4LCAgICAyMTgsICAgLTk3MCwgICAgMTc0LCAgIC0zODQsICAgLTU2MSwgICAgLTM4LCAgIC03MjAsCisgIC0xNDAsICAgMTAyMSwgICAtMjcxLCAgICAtNTcsICAgIDQ2MywgLTI1MzEzLCAgIC0zNDIsICAgIC00MCwKKyAgICAyNiwgICAgMTU5LCAgIC04NTQsICAgIDkxNiwgIC0xNTMyLCAgLTEwMzMsICAgIDI2NSwgICAgMTA1LAorICAtNzE5LCAgIC01ODgsICAgICA5NiwgICAtNDM1LCAgIC0yOTYsICAgLTIyNiwgICAgMjI0LCAgICAzNTcsCisgICAgMzAsICAgIDU3NiwgICAgLTY2LCAtMzAwMzcsICAgIC03MiwgICAgMzc0LCAgICAgMzIsICAgIDI1NiwKKyAgIDMwNCwgICAtODUyLCAgIC03MDYsICAgIDI0OCwgICAtNzQxLCAgIC0zNzksICAgIDk4MCwgICAgNjI5LAorICAxMzQ0LCAgIDM4NTgsICAtMjIxMSwgICAtMTUzLCAgLTM5MTQsICAtMzc3NSwgICAxNTcwLCAgICA3MTgsCisgLTEwNDIsICAtMTMzOCwgIC00NDA5LCAgIDEzMzgsICAgNTExOCwgICA1MTg2LCAgIDM2MTksICAgMjE0MiwKKyAgOTA4MSwgIC0yNzg0LCAgIDQxNjksICAgMzU5OCwgICA2NjIxLCAgIDQ1NjIsICAgLTE3MCwgICAtNjE0LAorICAxMTk2LCAgLTExNzQsICAgNTAyNCwgICAgNzIxLCAgICAtNzEsICAgIDI2NywgICAgICA0LCAgMjU1OTgsCisgIC0zNjksICAgIDM1NiwgICAgMzMxLCAgIDEwOTksICAgIDM3NywgICAtMzU2LCAgIC05MzgsICAgMTE2MSwKKyAgLTg2MywgICAxMTA3LCAgIC0xMzIsICAgIDIyMiwgICAgMTQ4LCAgIDE0MTAsICAgIDkwOCwgICAgIDYwLAorICAgMzc3LCAgIDEyODAsICAgIDQ2OCwgICAgNjkwLCAgICA0NTQsICAgIDI0NywgIC00NTUyLCAgIDYxMjIsCisgIC0yNjcsICAgMjk3MywgIC01OTMyLCAgLTY0MjQsICAtNDk4MywgIC00MTkzLCAgLTMzODYsICAgMTY5MSwKKyAgMTM0OSwgICAxNDE5LCAgLTM3MzAsICAgIDMwMCwgIDEyMTUwLCAgLTI5MjcsICAgMTU4OCwgICAgLTM0LAorIC0yNDM1LCAgIC0yNzEsICAgLTk2MSwgIC0xNzQ0LCAgIDE4ODEsICAgIC03MywgICAtNDUzLCAgIC03ODgsCisgIC03OTgsICAgOTE2NiwgICAyNzQ0LCAgICA4NTgsICAgIDM0MiwgICAgOTkxLCAgIC0yODcsICAgIDgyMiwKKyAgIC0zNywgICAxMTU2LCAgLTE0OTMsICAgIDcyMywgLTE0MTI3LCAgLTE3NTUsICAgMjAyOSwgICAtOTMzLAorIC0xMjc2LCAgICA2MzIsICAtNTI0OSwgICAgNDY0LCAgIC0yNzIsICAgMTE0OSwgICAtMjkwLCAgIDQ2OTMsCisgIC03MjgsICAtMTQ3NSwgICAgODQxLCAgICAgMTAsICAgLTI4MywgICAgIDkyLCAgIC0yNjgsICAgLTI5NSwKKyAgIDM1OCwgICAgMTYwLCAgICA0MDUsICAgICAgMiwgICAtMzgxLCAgICA2NzksICAgIDcxNiwgICAtMTkwLAorICAgMTI4LCAgICAyNzUsICAgIDI1NSwgICAgMTIzLCAgIC00MTIsICAgLTQ1MywgICAtMjczLCAgICAgMjYsCisgIC0xNzQsICAgLTM0MCwgICAgNjQ0LCAgIC0zNzYsICAyNzU4NCwgICAgLTI1LCAgICAgNjYsICAgMzEwNywKKyAtMTcwNywgICAgOTExLCAgICA1MDAsICAtMTAyOSwgICAxMDI5LCAgLTE1NTcsICAgOTAyMCwgICAtMzk4LAorIC0yNTEyLCAgIC01ODIsICAgMTEzMSwgLTE2Njk2LCAgIC00MjksICAtMTI4NCwgICAgIC0zLCAgIDIzMjAsCisgIC01MzIsICAgLTMwMiwgICAtMTc0LCAgIC0xNDYsICAgLTQxMywgICAyMTUyLCAgIDEwMDksICAgICA0MiwKKyAgIDQwMiwgIC0xNDcxLCAgICAxNTcsICAgNTc0MiwgICAtNzgyLCAgIC0yMjksICAgMjM3OSwgICAgNjQ2LAorICAyODQyLCAgLTE3NzYsICAgLTQ2MywgIC0yNzQ5LCAgLTM2MTcsICAtMTcxMCwgLTEyMjgxLCAgIC01NjYsCisgICAyNjMsICAtMzE3NCwgIC0yMzM3LCAgIDk1OTAsICAtMTE1MCwgICAyNDY1LCAgIDQ1NzcsICAgMjA2NCwKKyAgLTY0OCwgIC0yMTc1LCAgLTE4NzcsICAgLTY3NCwgICAtNjM0LCAgIC0zMzgsICAgIDM0MywgIC0xNDkyLAorICAgODc4LCAgIC01MzAsICAgMTA3MiwgIDEzNjcwLCAgLTQ1NDIsICAgIDc0NiwgICA5NzA0LCAgLTQxODgsCisgLTcwNzYsICAgMTE3OSwgICAtNzQwLCAgIC01ODksICAgLTg3NiwgICAgMjY4LCAgLTEwODAsICAgLTk4NiwKKyAtNDU4NCwgICAyNjkyLCAgIDMwMzIsICAtMjA2NywgICAgMjMwLCAgLTM1MzMsICAgIDk0NCwgIC00OTUwLAorIC0xOTA4LCAgIDE0NTIsICAgLTI1NSwgICAtNjk4LCAgIDE0NjAsICAgLTYwNiwgICAtMjUwLCAgIC0xNTQsCistMjIzMDMsICAgLTk0NSwgICAxNjI2LCAgIC01ODgsICAgLTQ4MiwgIC0xNTQ5LCAgIC0xMjksICAgIDk3OCwKKyAgLTYzMSwgICAtNzIyLCAgIDEwOTQsICAgMTc3MSwgICAtMzExLCAgICA1MzIsICAgLTUwOCwgICAgNjk2LAorIC0xMTI4LCAgIDEyNzAsICAgIDg1NCwgICAgLTg0LCAgIDQyOTAsICAgIDQxNCwgICAzMzUxLCAgIDEwNjEsCisgICA5MzEsICAtMjkzNiwgIC05NjA2LCAgICAtMzUsICAgMjUxNCwgIC0xMDk1LCAgICA1NjcsICAgLTQ1MiwKKyAtODUyMCwgICA0MDM3LCAgIC00MzEsICAgMjc0NCwgIC0yMjc2LCAgIDI2NDcsICAtMTE4OCwgICAtNDU0LAorICAtNDAwLCAgLTM2OTgsICAgLTMxNSwgIDExNTU4LCAgIC02NjcsICAgIDUxMiwgICAgMTYyLCAgIC0zOTUsCistMTMwMTUsICAgIC0xMSwgIC0xOTQ0LCAgIC04OTAsIC0xNDM1OCwgIC0zODUwLCAgLTQyOTYsICAgMTMxMCwKKyAgLTU4MCwgICAtMjQ4LCAgIDEzMDUsICAgIDQwMiwgIC0xMDQ5LCAgICAxMTUsICAgMjA4NSwgIC0xNzk3LAorIC0xMTcyLCAgIC0zMjEsICAgLTkxOSwgICAtMzEzLCAgIC01MTIsICAgLTEzMSwgICAxNjE5LCAgICA1NzYsCisgICA0OTksICAtMjAyNCwgICAgMTMwLCAgICAgMTQsICAgIC03NiwgIC02MzI0LCAgICA0OTUsICAgMjQ0NSwKKy0xNjc1NywgIC0yMzQ4LCAgLTI3MDYsICAtMTkwNiwgICAyMzc3LCAgLTIyNTIsICAgLTYxOSwgIC0yNTc5LAorICAgNjQzLCAgIC02NjEsICAtMTI3NiwgICAgOTM1LCAgICA4OTMsICAgIDk5MiwgIC0yMjA0LCAgLTI0NTEsCisgIC0zOTUsICAgLTUwOCwgICAxMTYzLCAgIC0yMTYsIC0xMzAzNCwgICAtNzE4LCAgLTEwMTgsICAtMTY3NSwKKyAgLTY5OCwgICAgNzEwLCAgIC0yNTcsICAgMjY1OCwgICAxMTc4LCAgIDIwNDYsICAtMjI3MCwgIC0yNTg4LAorLTE0NDQyLCAgLTExNDIsICAtMTAyNiwgICAyMjQ3LCAgIC01MzYsICAgIDMxNCwgICAgMTIzLCAgLTExNzUsCisgIC02NzMsICAgMTU3NiwgIC0yNjAwLCAgICAgIDUsICAgIDk2NCwgICAgNjE5LCAgLTE3MTQsIC0xNDgxMSwKKyAtMTUwMiwgIC0xNjQ2LCAgLTExNTEsICAgIC05MywgLTExNjUyLCAgIC0yMjIsICAgIDM0MywgIC0yMjAzLAorICAtMzUxLCAgIC05MjgsICAgLTI4OSwgICAyNjc5LCAgIDIxMDEsICAgIDc0MiwgICAgNzQ3LCAgLTIyNDUsCisgICAxNDYsICAtMTgyOCwgIC0yNzI4LCAgIDEwNTgsICAgMTA0OCwgICAzMDQ2LCAgICAyNDIsICAgNDQzMiwKKyAgIDI0NiwgICAgMzUwLCAtMTM0MTksICAgIDc2OCwgICAtODA1LCAgIDE4MTksICAxNDMzMiwgICAxMzE2LAorICAtMzcwLCAgICAzOTEsICAtMTQyMSwgIC0xNDI2LCAgIC0zNTUsICAgLTgxMiwgICAgLTY0LCAgICAxOTYsCisgLTI5MTcsICAgMTA5NywgIC0xNTUwLCAgLTEyNDYsICAgIDQzNiwgICAgLTYyLCAgIC04MTMsICAgMTM1MCwKKyAgIDU1NSwgIC0yMjM2LCAgLTE1ODksICAgIDk4MCwgIC0xNDgzLCAgMTAxMjIsICAtMjQzNCwgICA3MjM2LAorLTE1MjI1LCAgIDE1MTMsICAgMjA5MCwgIC0xMjI0LCAgICAtODMsICAtMjgyMSwgICAgNjY0LCAgICA2NTgsCisgLTMyNDIsICAtMTAzMSwgICAxNTA5LCAgIDI2NjcsICAgLTE2MCwgIC0xMzE1LCAgIDEwNjAsICAgIDg5MSwKKyAgIDQzMiwgIC0xMzExLCAgLTI1MDMsICAgMTMwNCwgICAxMjk1LCAgIDE3NDUsICAgLTcyMiwgIC0yNDk2LAorIC00NDA5LCAgLTMzNjAsICAtMjc3NiwgIC0yNzkzLCAgLTQ5MjEsICAxMjYxNiwgIC0xMDMxLCAgIC00NDMsCisgIDE0OTUsICAtMjQxNiwgIC00NjQwLCAgIDQ1MDgsICAtMjk0NCwgICAyNjA4LCAgIDEzMjMsICAgLTM5NCwKKyAgLTQxNSwgIC0yMTExLCAgLTIwNjUsICAgMTAzMCwgIC0zNjM2LCAgLTEzMzgsICAgMjkxNiwgIC0zMDA3LAorIC0zNjgwLCAgLTMxNTIsICAgLTExNSwgICAgNTc3LCAgIDI3NDIsICAgIDc4NSwgIC00NDI5LCAgLTE5NDUsCisgIC0zMDQsICAtNDg4MywgICAtMTMzLCAgLTMxMzYsICAtMTkyNywgICAtNTc2LCAgICA2MTgsICAgMTc4MCwKKyAgMjU2OCwgIC0yMTAyLCAgIC0xNTgsICAtMzk4NiwgIC0xMTg3LCAgICAyODAsICAgIDY1NSwgICAgMTYyLAorIC0xMzUyLCAgLTU3MzAsICAxNTM3MiwgIC0xMzE0LCAgIDE1NTMsICAgIDI3NCwgIC0yODczLCAgIDQyMjEsCisgIDQ2MTAsICAtNDE0MywgLTEzNjk5LCAgIDI3NjAsICAtMTI1NSwgICAtMjM4LCAgIDE0ODcsICAgMTU4MywKKyAgMTQyMiwgIC0yMjcyLCAgIDQ3MzQsICAtNjM2OCwgICAgNzk1LCAgIC00MDYsICAgMTQ5OCwgICAxNTg4LAorICAtNTAwLCAgLTI3NDQsICAgLTg3NSwgICAyMDgwLCAgIDE5MDEsICAgIDk2MCwgICAgMzQ0LCAgICA5NzksCisgIC0yNTgsICAgIDk1MiwgICAyNTI2LCAtMTE3ODUsICAgIDg5MywgICAgNjY5LCAgIDEzNjEsICAgIDUxOCwKKyAtMTM2OCwgICAzODU0LCAgIDI1MzksICAgIDYyMywgIC0xODM1LCAgLTQxNzcsICAgMjY4NiwgIC0yOTU2LAorIC0yODA0LCAgIDExMjEsICAtODg5MCwgICAxMzc3LCAgIDExMjUsICAtMzk5MCwgICAgMTQwLCAgIDM1OTQsCisgIDE3NTcsICAgMjI3MSwgICAgMzY2LCAgIDE3MjMsICAgMjE1MCwgIDEzNTU3LCAgLTE3NjgsICAtMTQzMywKKyAtNjYzMiwgICAtNTc4LCAgIDMyNjYsICAgMjUwOSwgICA3MTQyLCAgICA2ODAsICAgMTUzMiwgICAxMzE4LAorIC0xMTIzLCAgIDU2NjgsICAgMTI4MywgICAtNDEyLCAgLTU0MDQsICAgMjg5MywgIC0yNjQ3LCAgLTI2OTUsCisgLTE0MTIsICAgIDM0MCwgICAtNjUwLCAgICA4NjMsICAgMTg5NSwgICAyODY3LCAgICAzODQsICAgIDYyNiwKKyAgIDg1NiwgICAgNTA4LCAgIDEzNjUsICAgLTI5NSwgICAgOTYwLCAtMjYwODAsICAgIDIzNCwgICAgIC00LAorICAgMjM5LCAgIC00MTIsICAgICAtNiwgICAtNzY1LCAgICA3MzYsICAgIC0zMCwgICAgMTM2LCAgICA5MTIsCisgICA1MzgsICAgLTc5MiwgICAgNDEzLCAgICA4NzEsICAgLTQzNywgICAgMzA1LCAgICAgMzAsICAgLTE5NCwKKyAgMTEwNSwgIC0xMTEzLCAgIDM1NTAsICAtNDg1NCwgICAgNDQ5LCAgIC01NDksICAtNzYyNiwgICAzNzA2LAorIC0zNjk4LCAgIDE3NzgsICAgMTQ0MSwgICAyMjQwLCAgICAgNzMsICAgIDUxMywgIC0zMzgzLCAgLTIzNDYsCisgLTEzNzIsICAgMzk1NSwgICAyOTczLCAgIDExNzUsICAtNjA4NywgICA1MDcxLCAgLTIxMzUsICAgODU1MiwKKyAgNDk2MSwgIC0xMjAxLCAgLTE0NTgsICAtMjYyNywgICAtNzMwLCAgICA1MTUsICAgLTc1NiwgICAgNDc2LAorIC0xMTA0LCAgIDIxMTUsICAtMTI3NiwgICAgNDk4LCAgICAzMzYsICAgLTQ1MSwgICAgODA5LCAgLTEwMzAsCisgICA1NTYsICAgLTIxMSwgICAgLTcwLCAgICAtOTMsICAgICA4OSwgICAtNzU1LCAgICAyOTYsICAgIDg3MiwKKyAgLTI4MiwgICAgMzgwLCAgIC0yOTgsICAgMjc3NCwgICAgNjYwLCAgIDEzMzksICAgLTU0NSwgICAgNDI5Cit9LAorCisuY2IxMTA4bDEgPSB7CistMTM1NzAsICAtOTIzMiwgICAtNjczLCAgICAyNjcsICAgLTgxOSwgICAxNjMzLCAgICAtMzMsICAgIDYyMywKKyAgLTg1MCwgIC00Mzc2LCAgLTExMzUsICAgIDk5OSwgICAtMjYyLCAgIDE5MjgsICAgIDY5NSwgIC0xNzUxLAorIC0yNzkzLCAgICA3NzIsICAgNTA2NCwgIC0xMTU4LCAgICAyODAsICAtMjE0NCwgICAxMzEzLCAgICA4ODgsCisgLTI0ODIsICAgIDQ2OSwgICAyOTk2LCAgLTE0MDYsICAxMjUyNSwgIC0xMjAwLCAgLTEyMDIsICAgIDkzOSwKKyAgICAtMywgICAgODQ3LCAgICA4MTgsICAgLTkyNCwgICAgMTM1LCAgLTEzMDgsIC0xMjAwMCwgICAtNTQ0LAorICAtNTkyLCAgLTM5MTQsICAgIDQ0MSwgICAzMzcyLCAgIDMxODgsICAgMTMxNCwgIC0xODM2LCAgIC03MDYsCisgIC04NDQsICAtMTMxOSwgICAxMDI5LCAgLTE3NTQsICAgIDE3MiwgICAyNDY4LCAgIC05MDMsICAgLTg4OSwKKy0xNDYwMiwgIC0yMDU0LCAgMTE2OTQsICAtMTk4MCwgICAtNzMwLCAgLTE2NjEsICAgIDIxNCwgICAxMjQzLAorICAtMzM3LCAgIC02NDYsICAgIC05NSwgICAxNDMyLCAgIC04NTQsICAgLTIzNiwgICAgIDg4LCAgICAgLTIsCisgICA1MTQsICAtMTY0MywgICAgLTg0LCAgIDM1NjEsICAgIDMwMiwgICAgNzcwLCAgLTEyNDgsICAgIDQ4MCwKKyAgIDY2NCwgICAgNzM4LCAgIDE3MjgsICAtMTc4MywgIC0yMjI3LCAgIC03MDIsICAtMzU4MiwgLTE2NjQxLAorICAxNzEzLCAgIDE1MDYsICAgIDY2MCwgIC0yNDcxLCAgIDIwNjEsICAgIC00OCwgIC0zMTYxLCAgIDE2OTcsCisgICA5MDAsICAtMTQ3NywgICAgNTU4LCAgICAyODcsICAtNTUxNSwgICAxMDIzLCAgLTE5NzIsICAgIDk5OSwKKyAtMTg1NiwgIC0zMDIyLCAgIC0yMjgsICAgIDcxMSwgICAxMjcwLCAgIDI2NDQsICAgLTY0OCwgICAxMDY0LAorICAzODk5LCAgLTEyMDUsICAgLTc1NCwgICAxMDgwLCAgIDEyNjIsICAgICAxOCwgICAgODYwLCAgIDIyNzQsCisgICA2NTUsICAgIDQ5NCwgICAtMjIxLCAtMTU2NDcsICAgMTMzNCwgICAtNDczLCAgLTE2NDgsICAgLTM0MSwKKyAgMzU0MSwgICAzMTA5LCAgLTE2NzEsICAgIDYzOSwgIC0yNDkxLCAgICAxODUsICAgIDQ3NywgICAtMzg4LAorICA1MTk4LCAgLTU2ODAsICAgIDgxMiwgICAgNzAwLCAgIDIxODAsICAgLTUzNiwgLTE5NDY4LCAgLTI1MDgsCisgIDI1OTIsICAgMjkwMSwgICAgIDMyLCAgLTExNjUsICAgMTUwMCwgICAtNDIyLCAgIC03OTAsICAtMTkxNCwKKyAgIDk3MSwgICAgMTExLCAgIDEyMjYsICAtMTMwMiwgICAgNTQxLCAgLTM4NjIsICAgLTgzMiwgICAgNjQyLAorICAgMzA1LCAgLTM4NzAsICAgODkyMSwgICAgNTcwLCAgICAxODAsICAgMTczNCwgIC0xNTcyLCAgIC04OTEsCisgMTc2NzIsICAgLTc1NiwgICAgNzAyLCAgIDI3NDAsICAgLTY0NywgICAyMTIyLCAgICAxMDIsICAtMTM3MSwKKyAgIDQ2MSwgICAgNDU0LCAgICAyMDQsICAgLTMwNywgIC0xMjQ4LCAgLTIzMzAsICAgMTM1MywgIC0xNzgzLAorIC0xOTM5LCAgIC02MDEsICAgIDUxMiwgICAyMTE4LCAgLTIxNzgsICAgIDI1NCwgICAxMTkwLCAgLTEyNTIsCisgICA5MjMsICAgMTE2NiwgICAgMzYwLCAgICAzMjAsICAgIDMyMCwgICAxMjEwLCAgIC0xNDIsICAgLTQxNiwKKyAgMTI2MCwgICAtMjA1LCAgIDE0MDMsICAtMTAyNSwgIDE5MjUyLCAgICAzMjgsICAgICA1OCwgICAgIDIxLAorIC0xMDQ0LCAgIDE3ODYsICAgMjE1MywgICAgNjk3LCAgIC00MzYsICAtMTYxNywgICAtODY5LCAgIC00OTMsCisgLTI0MTksICAtMzEwMiwgICAxOTk1LCAgIDE1MTksICAtMTc5OSwgICAtMTUzLCAgIDI2ODksICAgLTY2NSwKKyAtMTM3MSwgICAtOTE1LCAgMTg0ODYsICAgIDk0MSwgIC0yNjEyLCAgLTEwNTcsICAgMTA3NiwgIC0zMzUxLAorICAgLTQ4LCAgLTE0NzgsICAgIDU3NSwgICAgNzI4LCAgICAxMzAsICAgLTE2OCwgICAgIDQwLCAgICA4OTgsCisgIDIxNDEsICAgMTUxOCwgICAtOTY1LCAgLTE5MTAsICAgIDg5NiwgICAgODM4LCAgIDEyMjAsICAgIDQxNiwKKyAtMTQ5NCwgICAxNDA0LCAgIC0xMjYsICAyMTQ3MiwgICAgNjA0LCAgIDE3NDAsICAgIDEwMiwgICAtODEyLAorICAtNzk2LCAgIC03MzQsICAgMTA4MiwgICAtNTA3LCAgIC00NjgsICAtMTczMiwgICAxMTcxLCAgICAyNTIsCisgICAzNTksICAgIDQzNiwgICAtNzY1LCAgICA3OTEsICAgIDcyNiwgICAtODEwLCAgIDE4MzgsICAtMTc5OCwKKyAgNTY2MiwgIC0yMzYyLCAgIDEyNzUsICAtMjgyOSwgIC00MDQxLCAgIDEzOTgsICAgMjY4MSwgICAgNDgwLAorIDEzNzQwLCAgIC03NTIsICAgMjI1MiwgICAxMzA2LCAgLTEwMjYsICAgMTgzNCwgICAgIDU0LCAgIDk5OTMsCisgICA1NTksICAgMTM3MCwgICAgNzExLCAgIDE5MTgsICAtMTc1NywgICAgNjQ2LCAgICAgMTYsICAtMzI2MiwKKyAgMjY3NiwgICAxNzUxLCAgLTI1OTUsICAgNDc4MiwgIC0xMDUwLCAgIDI0MDEsIC0xNTEzMSwgICAxMTAwLAorICAgMzg2LCAgICA3MDgsICAgLTM1OSwgICAgNDU1LCAgICAtMjUsICAgLTk1MCwgICAgMjQxLCAgIC00ODIsCisgICAyNjgsICAgMjMyNywgIC0yNzY2LCAgIC0xNDIsICAtMTk5MiwgICAtNTY2LCAgICAtMzYsICAgIDk5MCwKKyAtNjMwMiwgICAzMjQ1LCAgLTEzOTQsICAtMTU3OSwgICAgNzYwLCAgIC03NTcsICAtMjExNSwgIC04NTQyLAorIC0yOTQ1LCAgIC04MDAsICAtNDAyNywgIC0zMTAyLCAgLTEzMTksICAtMTk4OSwgIC0xNzg3LCAgIC00MjYsCisgICA1OTAsICAgMTAzMSwgICAgNDY3LCAgICAgMzEsICAgMjY3NCwgICAxNjg2LCAtMTQzNTIsICAgMTE3NCwKKyAtMTQ0NiwgICAtODEzLCAgLTEyNjcsICAgMjkxOSwgICAyMDUyLCAgLTE1NzQsICAgLTc1MywgICAzMzY5LAorIC0xMDkwLCAgIDM4MzAsICAgMjA0MiwgIDExMzc2LCAgIDExNDAsICAgIDg5NSwgICAxMTMwLCAgIC03MjAsCisgLTEyODQsICAtMjI3NywgICAgIDQ5LCAgIC03MjQsICAgIDM5NywgIDEzMjAxLCAgIC05ODUsICAgMTU5OSwKKyAgLTM2NSwgICAxNTE3LCAgIC00OTYsICAgIDk3OCwgICAyMTUyLCAgIDEzOTEsICAgMTc3NywgICAzMDMyLAorICAtOTM2LCAgICAyODAsICAgMTcxOSwgIC00NTUxLCAgIDQ4NzQsICAgLTk0MSwgICAtMTYwLCAgICA5NTYsCisgIC02NzYsICAgLTIyOSwgICAtNTQ4LCAgICAxODMsIC0xNjYwNiwgICAtODU1LCAgLTM0MzMsICAgMTI0OCwKKyAgLTU3OCwgICAyMjU0LCAgIC01MzIsICAgMzA4MSwgIC0xNDA2LCAgLTE4NTksICAgLTYwNSwgICAxODA5LAorIC0xMDAxLCAgIC0xMTQsICAtMTIyMiwgICAzODkwLCAgIC02MDksICAgMzExNCwgIC0yNDMwLCAgLTIxNDIsCisgICA0NDAsICAgMTc4MCwgICAxNjA2LCAgLTQyMTEsICAgMTA0NywgICAtNDU2LCAgIDgyODAsICAgICAgOSwKKyAgNTg2NiwgIC0xNzE4LCAgIC05MzIsIC0xMzA0OSwgICAtNTYyLCAgIDMwOTcsICAgLTU4MywgICAgLTIxLAorIC0xOTcyLCAgIDEyNTQsICAgLTE3MiwgICAgNTI3LCAgIDIyODIsICAgNTA2NCwgIC01MzkxLCAgIDEwNzQsCisgICAzNTcsICAgMTg0NSwgICAgIDI0LCAgIC05OTYsICAgIDEwMCwgICAgLTUwLCAgIDEwOTgsICAgMjkwNSwKKyAgLTQxNywgICAtOTM3LCAgIC00MzksICAgIDI0NywgIDE4NTAyLCAgLTIzODAsICAtMjA4OCwgICAtNDAyLAorICAtNTgwLCAgICAgODMsICAgLTI4MiwgICAgLTcwLCAgICA5NjksICAgIDU0MCwgICAtMjE5LCAgLTExMzIsCisgLTE3MDEsICAgLTE5NSwgIC0zMDMwLCAgLTI3NDgsICAtMTk3NCwgIC0xMzA0LCAgLTE5MDksICAgMTA4MCwKKyAgMTA0MiwgICAxMTI0LCAgIC0xMjgsICAgNTgxNiwgICAyMzAzLCAgIDI4NDAsICAtMjQyMCwgICAgIDM1LAorIDE2NTUwLCAgICA3MjEsICAtMjA3OSwgIC0xNDg5LCAgIDEwMjMsICAgLTY1NCwgICAyMDI1LCAgIDE0NzksCisgIC0xODUsICAtMjQ0OSwgICAgNTAwLCAgIDMwMzQsICAgMjY2MywgICAzOTExLCAgIDEyMDMsICAgIDk5OCwKKyAgIDU5NCwgICAtNTMzLCAgIC0xNjMsICAgLTI2MiwgICAgNzM5LCAgICAgMTMsICAgLTQyNiwgICAgMTgyLAorICAgMzk0LCAgICAzNTAsIC0zMDA1NSwgICAtMzcxLCAgICAxNTAsICAgLTQzMCwgICAgMTQ3LCAgLTExMjIsCisgICAgNDMsICAgLTM5MCwgICAgMjk4LCAgICA4MzEsICAgLTE5NCwgICAgMTU4LCAgIC0xMTQsICAgLTI1NywKKyAtMTM0NiwgICAtNTg1LCAgICAyMDYsICAgLTQ1NiwgICAgNDc4LCAgIC01MDIsICAtMTcxMCwgIC0xNzE5LAorICAtNTgxLCAgIC01MzYsICAgICA0NSwgICAtODYxLCAgICA4MjUsICAgMTA5MywgICAtMjU1LCAgIC02ODUsCisgICAgMzgsICAgIC0yMCwgICAgNDE5LCAgIC01OTQsICAgICAxMCwgIC0xNDA4LCAgIC01MjYsIC0xOTE5MSwKKyAgIDE5NiwgIC0xNDk2LCAgICAyNTUsICAgMTg0NCwgIC04NzU5LCAgLTM1NjUsICAtMTAwOSwgICAtOTI2LAorICAtODE4LCAgLTExOTUsICAgIDIzNiwgICAyODk4LCAgIC0xODIsICAxNDM0NCwgIC0xMzg0LCAgIDEwNjQsCisgIDExODEsICAtMTg0NiwgICAgNTQzLCAgIC01ODMsICAgIDE3MCwgIC0zMzA1LCAgLTExODcsICAtMjQwNiwKKyAgIC00MCwgIC0xMDUxLCAgLTEwNzEsICAgIC0yOCwgICAxNDgyLCAgLTEwNjAsICAtMTA1NywgICAzMDI4LAorIC0yMDIzLCAgICA5MTMsICAgMTA1MiwgICAgOTgwLCAgLTUxNTgsICAgNDY0MiwgLTE0MDY3LCAgIDM5MjAsCisgIDE0NTAsICAtNDQ5NywgIC0xNTkxLCAgICA4NDIsICAtMjIyMiwgICAtMzkyLCAgICAtNDIsICAtMzU0NiwKKyAgLTI1OCwgIC0zNTY2LCAgIDI1OTUsICAgIDIyNSwgIC0yNjk2LCAgIDQ2MjQsICAgMjI4MywgICAxNDgzLAorIC0xNTA2LCAgIDIxNjQsICAgIDE1MSwgICAgMzgwLCAgLTMyMDcsICAtMTA4NiwgLTEwNTk0LCAgIDIwMDUsCisgIDIzNzksICAtMjU2NywgICAtOTI1LCAgIC0zNjMsICAtMTI2MSwgIDEzMTc0LCAgICAtNzMsICAgMTE2OCwKKyAgMjIxNSwgIC0xNzIxLCAgICA3MjYsICAgIDUyNSwgICAxMDQ4LCAgICAzMjIsICAgLTgyNywgICAyMTE3LAorICAzODkwLCAgIDEzNDYsICAtMzUxMiwgICAyMjQzLCAgICA2MzgsICAgMjI1OSwgIC0xMzcxLCAgLTIyNjAsCisgMTA1OTAsICAgIDg1MSwgIC0xMjQ3LCAgIC04OTQsICAgMTg3MSwgICAtODgyLCAgLTE5NTUsICAgMzgyMiwKKyAtMzY1NCwgIC0xNzMwLCAgICA5MDYsICAgMjA3NCwgICAtNTQ4LCAgICA4ODUsICAtMjUwMSwgIC0xMzE2LAorIC0zMjc1LCAtMTA2OTQsICAgMjAzMSwgICAxMDc3LCAgIDMwMTMsICAtMTEwNSwgICAyOTUxLCAgIDE5MDcsCisgIDEyMTgsICAgIDE5NCwgICAxODYwLCAgLTE2NjIsICAgIDE3OCwgICAgOTE1LCAgIDEwOTIsICAgIDgwOSwKKyAgLTQ1MSwgICAtNjEwLCAgIC03MjgsICAgIDc5OSwgICAtMTI5LCAgIC0xMDEsICAgLTkwNSwgICAgIC0yLAorICAyNDcwLCAgIDEyOTIsICAgLTEzNywgICAgNTQ0LCAtMTg3OTUsICAtMTA4MSwgICAtMzAwLCAgICAtNTksCisgICAyODIsICAgLTMyOSwgICAtNTQ0LCAgLTEzMjQsICAgMjE1NSwgICA5MzI2LCAgICA0NjIsICAgLTM4OCwKKyAgLTMwMywgIC0yOTQwLCAgIC02MDgsIC0xMzY1MiwgICAgNTMyLCAgLTEzNTAsICAtMTAyNiwgICAxMzMwLAorICA1NTU5LCAgIC0zMzMsICAgNDk2MSwgICAgNzA3LCAgLTE4MzIsICAgMTA3MCwgICAyNDgzLCAgLTIwMTYsCisgIC0zMTUsICAgMjE5NywgICAgODQ5LCAgIC0zNDgsICAgIDM3OSwgIC0yMTc5LCAtMTU2OTEsICAgIDkwMywKKyAgMzE5MiwgICAzODg4LCAgICAzOTYsICAgNDYxMCwgICAzMjYxLCAgLTI1ODksICAtNDkwMywgICAtNjQzLAorICAzNjA0LCAgLTEzODAsICAgMTUyNCwgIC0yMTU1LCAgICA0NjksICAtMzUyOCwgICAtNzkwLCAgICA0MjksCisgLTM4NjIsICAgMTc5NywgICAtMTA0LCAgIDIzNjQsICAtMTE2MiwgIC0xNTU5LCAgIDEwMTEsICAgMTg0OSwKKyAgLTIzNSwgIC0xOTUyLCAgLTIwODgsICAgMTQzNiwgICAyNTAyLCAgLTM4NjIsICAtMTcwNCwgLTE0ODU5LAorIC0yODYzLCAgICA3MTAsICAgIDYyNCwgICA0MzczLCAgLTYzMDIsICAgLTYxNiwgICAtODA3LCAgLTE1NzcsCisgLTI0OTIsICAgLTYyMCwgICAtOTE3LCAgICA5NDgsICAgNDk1NywgICAtODQ4LCAgIC04NjMsICAgIDUxNCwKKyAtMjIxMCwgICAyMTYyLCAgIC03NTMsIC0xNTE2OCwgIC0yMDY4LCAgMTI0NzIsICAtMjYxMSwgICAtNzIzLAorICAyNzk3LCAgLTg1NzMsICAtMjI3MCwgICAgOTc4LCAgLTI1OTcsICAgMjIxNSwgICAtNjg0LCAgIDI1MzUsCisgIDMxMTQsICAgLTI2MSwgICAtMTc4LCAgIDIzODUsICAtNDg2OSwgICAxMTYxLCAgICAtMzIsICAtMTQ2OSwKKyAgMjA3NCwgIC0xNDA3LCAgIDMyMjYsICAgLTk5MiwgICA0NTQ2LCAgLTMxNTgsICAgMTA0NCwgICAgNDYzLAorIC01Mjg1LCAgICAgIDQsICAtMTM5NiwgIC0xMzk1LCAgIDE3NzAsICAtMTc2NywgICAtODYwLCAgICAgLTYsCisgLTIyNDIsICAtMTU0OCwgICAtNjY3LCAgICA1ODcsICAgLTk4MiwgIC0yMjQ2LCAgLTEzMTIsICAgMTU1MCwKKyAgLTU0MiwgICA1MzAyLCAgIC03MTYsICAgIDEzNSwgLTE1ODk1LCAgIDMzODIsICAgLTQ3OCwgICAxMjc5LAorICAgNjE1LCAgIDMzNjUsICAgMTYyMCwgLTEyNjEzLCAgIC0yMzAsICAgMzEwMSwgICAzMjMwLCAgLTEzMDcsCisgIDI4NjAsICAgIDYyOCwgICAgNjQ3LCAgLTM1OTUsICAgLTIxNCwgIC0xNjMxLCAgIDI3ODMsICAgIDc0OCwKKyAgMTA4OCwgICAgLTU3LCAgLTYwMTQsICAgMjQ5NiwgICAgMzU5LCAgICA3MTksICAgMTQ3NiwgICAtNzUwLAorIC0xNjQ0LCAgLTIxMjUsICAgMzkxMywgIC0zNzg4LCAgICA1NjUsICAtMTExOCwgIC0xNDExLCAgIDEzNzcsCisgLTEwMjAsICAgLTI0NiwgIDE4ODUxLCAgLTE0MzgsICAtMTE1MCwgIC0xNDkyLCAgIC02ODEsICAgLTc5OCwKKyAgLTc3NiwgICAgOTYwLCAgICA5MTEsICAtMTQ0OSwgICAgMzM2LCAgLTExMTQsICAtMjExMSwgICAtODc3LAorICAtNTMyLCAgICA2NjgsICAgMTAxOCwgICAxMDk4LCAgICA0MDgsICAgMjAzMiwgICAtNjA3LCAgIC02NTYsCisgLTU5OTcsICAgMzA4OSwgICAyNDYyLCAtMTgzNjgsICAtMTAyNywgICAgIDc4LCAgLTQwNjYsICAgIDQzOSwKKyAgLTg0NSwgICAxNDc2LCAgICAyOTAsICAgIDQ5MCwgICAtNDUyLCAgIDE2MzgsICAtMzM4MSwgICAgIDgwLAorICAxNjk5LCAgICA0NTgsICAgIDI2MCwgICAxMjE1LCAgIC01MTYsICAgMTg4MywgICAgLTYyLCAgICAgMzUsCisgLTI1NDAsICAtMTcwMywgIC0xMDQyLCAgIDE3NTEsICAgLTQyMiwgICAxMjIyLCAgICAyMDcsICAgLTEwNCwKKyAgMTExMiwgICAgMTUxLCAgIC00NzMsICAgLTUyMiwgIDI2NDI2LCAgICA1NjIsICAgIDg4NCwgIC0yMjAxLAorICAtMjgxLCAgICAyMzgsICAgLTgzOSwgICAxMDM3LCAgIC01ODgsICAgICA4MSwgICAtMTA5LCAgICAgLTIsCisgICAtMzIsICAgICA3NSwgICAgNjU0LCAgICA0ODksICAgIDUyNCwgICAtMzg4LCAgLTE0MDgsICAgLTkwNiwKKyAtMTE5MywgICAtOTM2LCAgIC0yNzMsICAgIC00MCwgICAtMTAwLCAgIC02NjIsICAgLTUyMiwgICAtMTQ1LAorICAgMTE5LCAgICA2MTQsICAgLTkyMiwgLTI1MzI5LCAgIC0xODAsICAgLTY2OCwgICAtNTc0LCAgICAxNjEsCisgIC00NDgsICAgIDE3MywgICAgNzUwLCAgIC02MDksICAgLTgxMiwgICAtMTI1LCAgICA4MTQsICAgIDU3MiwKKyAgMjYwMiwgIDIwMzcyLCAgICAyNDQsICAgMTgyMCwgICAgNzI0LCAgICA1MTUsICAgIDkzMiwgIC0xMjkwLAorICAtNzEyLCAgIC05OTAsICAgLTMwNSwgICAgLTEzLCAgIC03NjMsICAtMTE1NywgICAgNDgxLCAgIC03NjQsCisgICAzMjAsICAgIDYyNCwgICAtNjIwLCAgICA2NDIsICAtMTQ5NCwgICAtNTY4LCAgIC02MDEsICAgLTY1NSwKKyAgLTc5MCwgIC0xMzQ4LCAgICAzMzQsICAtMTMwMiwgICAgMzgyLCAgICA3ODIsICAtMTEyMiwgICAtNjQxLAorLTIzNTQ5LCAgICAxODAsICAgIDQ2MywgICAtNjM0LCAgIC02NjYsICAgIDU5OSwgICAtMzU2LCAgLTEwNzEsCisgICA4MTYsICAgLTU3NiwgICAxMjA4LCAgICA5MTIsICAgLTM3NywgICAgNjI0LCAgIDEwNDksICAgICA0MiwKKyAgIC05NSwgICAgMzcwLCAgIDE5MzIsICAgLTE2NywgICAtMjc1LCAgICAxNDIsICAgLTE1OSwgICAtNDEwLAorICAgNTk1LCAgIC01NjIsICAgLTYzMiwgICAgNzQ4LCAgIDExOTIsICAgIDYxNCwgICAgLTQxLCAgICAtMTgsCisgIC0xNTYsICAgIC02MSwgICAxMjgwLCAgIC02ODYsICAgIDM2MywgICAgNzU5LCAgICA3NTYsIC0xOTM2MiwKKyAgLTYxNCwgICAyMTUxLCAgLTExODUsICAgIDE2OSwgICAgMzI3LCAgIDE0OTQsICAgIDc4MiwgIC0xMzEzLAorICAtMTM0LCAgICA4NDEsICAgIDIxOCwgICAgLTc2LCAgLTI5ODAsICAgIDIwMiwgICAgIDgwLCAgICAyODEsCisgICAgODksICAgIC02MSwgIC0xNjc4LCAgICAgNTksICAgLTEyNSwgICAgMTk1LCAgICAzMjAsICAtMTMxMCwKKyAgIC01NiwgICAgODA2LCAgICAgNDcsICAgIC02NSwgICAgMjQ5LCAgMTg0MzIsICAgLTY2NiwgICAtNTA2LAorICAtMjA0LCAgIC0xOTQsICAgLTU2MCwgICAtNDE2LCAgLTM2NDEsICAgIDMzMCwgICAtMjY4LCAgICA4NDIsCisgMTA2MDAsICAgLTE3NiwgICAgNDI0LCAgLTE3NDQsICAtMzYwOSwgIC0xNjgyLCAgIC04NDQsICAgLTMwOSwKKyAgLTUzOCwgICAgNDM1LCAgMTQyNTEsICAtMTI4MSwgICAgMzczLCAgIDI3NDgsICAgLTcwMiwgIC0xMzU4LAorICAtNzY2LCAgIDM0ODAsICAgLTY3OSwgICA0MDM5LCAgICA1MjksICAtNTY5OCwgICAgLTM4LCAgIC04MTMsCisgIDEyMDMsICAgNDczNCwgICAgMzE4LCAgLTEwNDQsICAtNTEwOSwgICAyMTg3LCAgLTM0NzQsICAgIDQxNSwKKyAgMjQzNiwgIC0zMDIxLCAgLTE2MjgsICAgLTQ1NiwgIC0xNDUxLCAgIDM0MDYsICAtMTc5OCwgICAxMDAxLAorIC04NjQ4LCAgICA0NjgsICAgMTE4OCwgICAgNDk3LCAgIDQ2MjgsICAgLTk0OCwgIC00MDczLCAtMTE4OTQsCisgLTI3NTAsICAgLTczOCwgICAxNTIwLCAgLTQwNzAsICAgLTgxMCwgIC01NzU1LCAgLTEzNzAsICAgMjk3OCwKKyAgNDQ2MCwgICAgOTE3LCAgIDEyMjEsICAgLTMyNCwgIC0xMTY2LCAgIDIzMzksICAtMTIyMSwgIC0yMDQ4LAorICAgNzE0LCAgIDY4ODQsICAgMzA5NiwgICA2OTk4LCAgICAgMTMsICAgLTI3NSwgIC0zODc5LCAgICA3OTAsCisgICAxMDQsICAgMTM4MywgICAyMDU2LCAgIDE5NTcsICAtOTIxNiwgICAtNDMwLCAgIC0xOTksICAgIDI2MSwKKyAgIDc2NCwgICAtMTA5LCAgIC0yMTAsICAgIDc5NSwgICAgODg0LCAgIC0zMzQsICAgMTU0NiwgICAtMjcyLAorICAgLTM1LCAgICA3MzgsICAgLTI2OCwgICAgLTEzLCAgIC00NDgsICAgIDY0NSwgICAgIDk3LCAgICAgNzYsCisgIDEyODQsICAgLTM0MywgICAtNjU0LCAgICAxMTIsICAgIDY0MywgIDIyODQ2LCAgICA2MzQsICAgLTU5NywKKyAgLTYyMSwgICAtNzg0LCAgIC0zODAsICAgIDk1MSwgICAtNDUyLCAgIC02ODUsICAgIDE0MCwgICAgNjg4LAorICAtNzcwLCAgICAyNDcsICAgLTY3OSwgICAtMjI4LCAtMjY4NTYsICAgIDMxMSwgICAtNTQ2LCAgIC00NDQsCisgICA2MDYsICAgICA2OSwgICAtMTk1LCAgICAgMTgsICAgLTIyMCwgICAtMzM0LCAgICAtNDIsICAgIDU0MywKKyAgIC0yOCwgICAgNDkyLCAgICA3NjYsICAgIDIwOCwgIC0xMjA2LCAgIC01NTQsICAgIDIxMywgIC0xMTEyLAorIC0xNjc1LCAgIC02MDgsICAgIDM4MiwgICAyMDExLCAgIDUwNzcsIC0xNzQ0MiwgICAxMzY3LCAgIC03MDIsCisgIC04NTYsICAgLTQxNiwgIC0xNzI4LCAgLTE5ODcsICAgMjk2NiwgIC0xOTUyLCAgICAgMzgsICAgIDE1MiwKKyAgIDcxMiwgICAgMjEwLCAgIC01ODksICAgMzAyOSwgIC0xMTg5LCAgLTIwMTYsICAtODA3MSwgIDEwNzQ2LAorIC0yMTQzLCAgIC01NTYsICAtMTk2NCwgICAgMTYyLCAgIC01MDQsICAgIDk5NSwgICAgOTgyLCAgLTI1NjUsCisgIC02MzQsICAgLTk4NSwgIC0xNjY4LCAgICA0NDQsICAtMjA5OCwgICAtNDExLCAgICA0ODgsICAgMTM5NywKKyAtMTEzNCwgICAxODg4LCAgIC05MjAsICAgLTI3OSwgIDE1MDU3LCAgIC03NTcsICAtMTI1OCwgIC0zMDQwLAorICAtODkwLCAgIC0xMDUsICAgLTY3MCwgICAtNDkwLCAgIC0yMzgsICAtMjQxOSwgIC0xMzAyLCAgICA5MTUsCisgIC03ODQsICAgLTkyOSwgICAxNjUzLCAgICAtODksICAgMTA3NiwgICAgNDQ1LCAgIDI1MzgsICAtMTQyNCwKKyAxOTE3NSwgICAgLTkxLCAgICA0MzcsICAgIDc1MiwgICAgMjU0LCAgICA5MzUsICAgIDg1NCwgIC0xNjY2LAorICAgLTg2LCAgIC01NDMsICAgMTA1MywgICAgNjY0LCAgIC0xNTUsICAgLTQ4NSwgIC0zOTk0LCAgICAtNTAsCisgICAgNTAsICAgIC01OCwgIC0yNjI2LCAgIDE4MDEsICAgLTMxNCwgLTE2MDUyLCAgLTE4MzEsICAgMTAwOSwKKyAgMjM0NCwgIC0zMDMwLCAgIC05MzgsICAgMTc2MSwgIC0xMjgzLCAgIC0xNTAsICAgLTQyNSwgIC02NjYwLAorICAtOTAwLCAgIDEzNzQsICAgIDgwMywgICAgNTQ5LCAgLTI2ODMsICAgIDgzNywgICAgNDgzLCAgIC02NTUsCisgIDQ2MTAsICAgMTI1OSwgICAgLTQ1LCAgICA4MzQsICAgMTEwMywgIC0zMjUwLCAgLTM2MDQsICAtMjg4MiwKKyAtMjQ2MywgIC01MzMxLCAgMTEzMTIsICAtMTY1MywgIC0zNTA1LCAgLTE4NTUsICAtNDk2MiwgICA4NTc5LAorICAyMzcwLCAgLTI0NzQsICAgIDUwMSwgIC0xMjgyLCAgICA5ODUsICAgLTkyNCwgICAzNDUyLCAgICA0NTYsCisgIC0yNDIsICAgMzg3OCwgIC0yMDk1LCAgIDI5OTQsICAgNzA3NiwgICAtNDU5LCAgIDI1NzQsICAxNjExNiwKKyAgODI3NywgICAgLTg4LCAgICA1NzIsICAgIC0zOCwgICAgICAwLCAgIDE2NjQsICAgLTU1MywgICAxODIwLAorIC0yMDk2LCAgIDEwNzYsICAgIDQxNSwgICAtNDIwLCAgIDE5MDAsICAtMTY5NiwgICAtMTMwLCAgICAyOTgsCisgLTE1NTUsICAgIDIwMSwgICAtNDA0LCAgLTE4MzEsICAgLTkzMiwgICAgODQ0LCAgIDk2MDYsICAgLTQ5NywKKy0xNjMwNCwgICAzMjc4LCAgICA5MTgsICAgLTUyMywgIC0xNTczLCAgIDI0ODgsICAgLTgxMywgICAgMTQ3LAorICAxNTQwLCAgIDM3OTUsICAgMTM5MCwgICAxMDYxLCAgICAtNzgsICAgIC0xMCwgICAgNTc0LCAgIDI2MjAsCisgLTExNDMsICAgLTUxMiwgICAtNTgyLCAgLTE0OTYsICAgIDczNiwgIC00MzIzLCAgICA3ODYsICAtMjg3MywKKyAtMTM0MiwgICAzOTMyLCAgMTQ1MDgsICAxMjYzNSwgICAtODk5LCAgIDE3MzAsICAgLTY3MywgICAgMzg2LAorICAtNjc2LCAgIDI3ODcsICAtMjc4MCwgIC0yOTYwLCAgICAzNzUsICAgIDQ3NSwgIC0yMTg4LCAgIDIyNTAsCisgICA4NTEsICAgIDc4OCwgICAgMjY4LCAgIDEyNjQsICAgMjk3MywgICAgLTk0LCAgIDEwNjIsICAgMTAwNiwKKyAgLTY5NywgICAgNjY5LCAgIC02MzUsICAgLTk4NiwgIC00ODQ4LCAgLTE0ODYsICAgICAtNiwgIC0zOTE0LAorICA2MjY3LCAgLTE1NjAsICAgICAgOCwgICAtNTAzLCAgIDUyNzMsICAtMzU0NSwgICAgIDY5LCAgMTUxNDYsCisgIDIyNjMsICAtMTQ5MCwgICAtNTQ4LCAgIDE3NDAsICAgMTYzNiwgICAtODkyLCAgIC04OTUsICAgIDc2OSwKKyAgLTQ3MSwgICAgMjI2LCAgIDY0OTcsICAtMjQ2NiwgIC0yMDM3LCAgLTEwNjgsICAgMTA3NSwgICAtOTAyLAorIDEzNjY4LCAgLTEyMTMsICAxMjQyNCwgIC0zNTIzLCAgIC0xMjQsICAtMTA5MCwgICAgOTcyLCAgLTExMzQsCisgIC00OTQsICAtMjU2OCwgICAgODgxLCAgLTMwODEsICAgIDM2OSwgICAtMjU0LCAgIC02MTgsICAgLTkxNCwKKyAgIDQ0MywgIC0xMjU0LCAgICA2NTgsICAgMTMyMiwgICAgNTQ2LCAgICAtMTQsICAgIDc3OCwgICAtMTE2LAorICAtMzc4LCAgIC04MDIsICAgLTI2OCwgICAgIDQ4LCAgIDExNDAsICAyNTk0MiwgICAgNTAzLCAgIC02MzcsCisgIC04NzEsICAgMTA1MCwgICAgMjk4LCAgIC0xODcsICAgIDM4NywgICAtNDA2LCAgICAzNDMsICAgIDIxMiwKKyAgIDExMCwgICAgNzIzLCAgICA2OTUsICAgIC00NywgICAgLTUwLCAgIC01NjgsICAgIC02NiwgICAgMzQ3LAorIC0xNTg4LCAgICAgMjAsICAgIDcwMSwgICAtNDg1LCAgICAtOTgsICAgLTc4NywgICA0NTAyLCAgIDEwNDYsCisgLTE2MjgsICAtMjUyNiwgICAgMTg1LCAgIDEwMTYsICAgLTI1NiwgICAtNzAwLCAgIC00MDMsICAgLTE1NCwKKyAgIDEwMywgICAtNzUyLCAgIC02ODksICAgMjA4NCwgIC0xNDYzLCAgIDIyOTQsICAgIDM2MCwgIDE3NTkwLAorICAtNjk4LCAgLTEyNjIsICAgIDc4OCwgICAgMTE2LCAgICA3NTUsICAgIDc1MSwgICAtNDQwLCAgIC02MTAsCisgIC00NjksICAgMTIzNSwgIC0yMzE0LCAgIDEyNDAsICAgLTMwOCwgICAgNTUzLCAgIDEwNjUsICAyNDQ0MiwKKyAgLTczMywgICAgNjY3LCAgICAgIDQsICAgLTQ4NCwgICAgIDkzLCAgIC0yNjMsICAgLTM2MSwgICAtMjc4LAorIC0xNTI0LCAgICAxNzYsICAgMTMxMSwgICAxNTYxLCAgICA0MzUsICAgLTQzNiwgIC0xMDc5LCAgICAyNjAsCisgIC0zNjYsICAgIDQ3MiwgIC0xMDQ5LCAgICA2NDcsICAgIDE1OCwgICAgMzAyLCAgIC05MzEsICAgIC0zNiwKKyAgLTk5MCwgICAgNzM2LCAgIC00NDQsICAgMTA3NywgIC0xNTYwLCAgIC0yNTEsICAgIDE0OCwgICAxMDAwLAorICAxMDk2LCAgIC0zMDAsICAgLTIyNCwgICAtMzA3LCAtMTc2NDYsICAgICAzOSwgICAgMjA2LCAgICAgNzQsCisgICA1MDUsICAtMzA1MSwgIC0xMjg1LCAgIC03OTMsICAgLTcyNCwgICAgNzE4LCAgICAzMjQsICAgIDgwMywKKyAgIDg3NCwgICA2MDYyLCAgLTIyMzUsICAtMzMyMSwgICAtNTUwLCAgIDkyNjQsICAgMzQ4MywgIC00MTcyLAorIC00MDI0LCAgIC00NzEsICAgIDg1OCwgICAyNjgyLCAgLTEwNzgsICAtMTkyMiwgICAyMDg4LCAgIDExMzUsCisgIC04NzgsICAgIDU0NSwgICAyMjA1LCAgICA4MzYsICAtMTA4OCwgICAgNTQ3LCAgMTI0NjEsICAgMjIyMiwKKyAgLTgyOCwgIC0zODQxLCAgIDQ3OTcsICAtMjM2MCwgIC0yNTEwLCAgLTQwMjksICAtMjIxMywgIDEzNzM2LAorICAxMDMyLCAgIC05NTgsICAgMTg5NSwgICAgMjY0LCAgLTE0OTksICAtMjA2NiwgICAtMjQxLCAgIDEzMjQsCisgIC0yMjQsICAgLTc5MiwgICAgNzc2LCAgIDIxMzAsICAgMjYwMCwgIC0yMjc2LCAgLTQyMzksICAgMzI2MCwKKyAgMTYxMCwgIC0xNjIwLCAgLTEyMjAsICAtMjc1MiwgICAgOTc5LCAgLTIwMjgsICAxOTYyNiwgIC0yMTQ2LAorICAgNjg0LCAgIC03MjksICAgLTIzNSwgICAtMjg5LCAgICA1ODgsICAgLTYwMCwgICAgMjQ1LCAgIC04NzksCisgIC04MTYsICAgIDQxMywgICAgLTg3LCAgLTExNTgsICAgLTI0NiwgICAgIDY5LCAgICA5NzAsICAgLTExMSwKKyAgIDUwMCwgICAxMDk3LCAgIDEwODcsICAgLTEzOCwgIC0xMzU2LCAgICAgMzAsICAgLTQzNCwgICAtNDUyLAorLTIyODAyLCAgICAxNzcsICAgIDQ5MiwgICAgMjA2LCAgIC0yNTcsICAgLTg1NCwgICAxNDQ1LCAgICAgMzcsCisgIDEzODQsICAgICA5NywgICAtMjU4LCAgICA4MTEsICAgLTIyMiwgICAgIDUzLCAgICA1NDgsICAgMTc0NCwKKyAgIDEyNCwgIC0xMDMxLCAgIDEwNzYsICAgIDE4NiwgICAgNDUzLCAgIC0xNzMsICAgMTE4MCwgIC0yMjM1LAorICAgNTgzLCAgIC0zOTIsICAtMTU0MiwgICAtNzI2LCAgIDI5MzcsICAtMzYzNSwgICAtODU2LCAgIDE0NDYsCisgIDc3OTYsICAtMjc3OSwgICAtOTYyLCAgLTIyNzcsICAgMTY1MSwgICAxOTYwLCAgLTE0NjAsICAtMTI3NywKKyAtOTc5NCwgICAtMjg4LCAgIDI0NTksICAgMjM1MCwgIC0yNTIxLCAgICAgODQsICAgIDU3OCwgICAyMjg2LAorICAgNDgwLCAgIDE2MjAsICAgNjQyMSwgICAtMjAwLCAgICAxNzAsICAgMTUxMywgICAgMTk4LCAgLTEwMDEsCisgIC00OTEsICAtMTAwMCwgICAgMTYxLCAgIC00ODIsICAgIDYwNywgICAgMjE0LCAgICA3NDMsICAgLTI5MiwKKyAgLTM5NCwgICAtMTkyLCAgICAgOTIsICAgICA3MywgICAtNDE1LCAgIC0zMTYsICAgIDU5MywgICAgLTQyLAorICAtMzQ2LCAgICA0NTYsICAgICA0NCwgICAgOTUwLCAgICAxMjksICAgLTE4OSwgICAgODA2LCAgIC0yMjEKK30sCisKKy5jYjExMDhzMCA9IHsKKy0zMjc2OCwgICAtODI4LCAgIDk1NjksICAgIDMzMSwgICA2OTM4LCAgIDMxMjIsICAtMTAwOCwgICAyODQ3LAorICAgNjQ2LCAgLTU2OTAsICAgMTcxMiwgICAtNzk1LCAgLTQ0MDYsICAgMTM2OCwgICAgMzA3LCAgIC01MjYsCisgLTIyMDYsICAgICAyNiwgICAtMjEwLCAgIDEzNTgsICAgIDc0NiwgICAxOTIwLCAgICA2NjcsICAgMzg2NiwKKyAgLTQxMywgICAtNzIwLCAgLTQzMjgsICAtMjQ3NSwgIC0xMTg5LCAgIC04NjMsICAtMzgwOSwgIC01MDUyLAorIC04NTY3LCAgIDI4NTksICAgMTkxNSwgICA0ODk1LCAgMTI0NDAsIC0xMzAwMiwgICAyNzU3LCAgLTU5NjksCisgIDQwNTQsICAgMTEwMCwgIC05NDMwLCAgIDQ5MzAsICAxMDI2NiwgIC0xNTIyLCAgIDcwOTIsICAtODc3OCwKKyAtMTk2OCwgICA0MzI1LCAgIDg0NDAsICAgMzg4OCwgIC0xOTY2LCAgIC02ODgsICAtMjQ1NSwgICAyOTY2LAorIC0yMzgwLCAgIDE2ODIsICAgNDk1NiwgIC0yMzEwLCAgLTM3MDYsICAgIDQwNCwgICA2Nzc0LCAgMTc1NjIsCistMTI0MzcsICAtMjY2NywgICA0ODY0LCAgLTk0MTEsICAtNjQzNiwgIC05MzE2LCAgIC05MDMsICAtNTUyNiwKKyAgMzQ2MywgIC0xNjkwLCAgLTUyNTAsIC0xMjU2OCwgICAyMzM4LCAgLTEzMTAsICAtMzAxOSwgICAgNzc2LAorICAtNjQxLCAgIDM0ODMsICAgICA1NCwgLTEwNzMyLCAgLTM4NzgsICAgLTY5MSwgLTE3NjE1LCAgIDQ1MzAsCisgMTAyNjcsICAgNzgzMCwgICA4NDg4LCAtMTI2MjQsICAtNDUxNCwgLTE3MTgzLCAgIDcwNzAsICAgMzExNSwKKyAgNDE3NiwgICAgMzgzLCAgLTQ1NTgsICAgIDQxMCwgICA2Mzc5LCAgIDYyNDIsICAgNDcwMiwgICA0ODUzLAorICAtMjE3LCAgICA0NDYsICAtMzgxMSwgIC0yMzk2LCAgICAyNDQsICAtMjEyMCwgICAzMjc1LCAgIDUxMjIsCisgICAxODAsICAgNDUyMywgICA4NjgwLCAgLTE4NjgsICAtNjE2NCwgICAyNjM2LCAgLTUwNTYsICAtNDAzOSwKKy0xMTYxOCwgICA0MDE0LCAgMTEzNDksICAtMjYxNiwgICA4MjQwLCAgLTUxMTksICAgMTk4OCwgIC0yNTUyLAorICA2MDYwLCAgIDMyMDYsICAgLTY2MiwgICAyNjg2LCAgIDExMTYsIC0xMDQ0NywgIC0zMDA0LCAgICA2NTAsCisgIDc4MTEsIC0xMjE0OCwgICAtMzI3LCAgICA4NTYsICAgLTkxNiwgICAtMzk3LCAgIC02MDAsICAgNDYyMSwKKyAgMzAxMSwgICA1NTM5LCAgIDU0MTcsICAtMjM3NCwgICA5NjY3LCAgLTQ3MTQsICAgNzgyMSwgIC0yODE5LAorICAgNTczLCAgIDQ0OTIsICAgMTg4MiwgLTI2NzcwLCAgIDE0ODYsICAtNjk2MywgICAxMTAzLCAgIDI1MTUsCisgIDgxOTYsICAgMTg0OSwgIC03NDkyLCAgLTUyNDMsICAgMjEwNiwgIC01MjkwLCAtMTEwMDAsICAtMTQxMCwKKyAtMzQ0OCwgIC04NTQ4LCAgLTQ1MzYsICAtNzczMCwgICAzMDgzLCAgIDYxMDksIC0xNDQ1OCwgIC04NjI0LAorICAtMzgxLCAgIDc4NDAsICAgNDY5NCwgIC0zOTA2LCAgIDgyMjMsICAgMzMxNSwgICA1ODQ5LCAgMTMxMTIsCistMTMxMzIsICAgNjA4MSwgIDExODAxLCAgLTc2MjQsICAgLTM3NiwgIC02MzcyLCAgLTY4MTcsICAgNjgzNCwKKyAgMTc2MCwgIC0xNDM1LCAgIDEwNzIsICAgMzUwNSwgIC0xNDk0LCAgIC03MDksICAgNTc4NiwgICAgNDU0LAorICAxODA3LCAgIDI2NTAsICAgNzcyOCwgICAxMzU3LCAgLTEwMDIsICAtNTM2NiwgIC0yMzY4LCAgIDIwNTIsCisgICAzMzMsICAgNjMxMiwgICAtMzM2LCAgIDgyNzQsICAtMTY1MywgIC00MzA5LCAgLTY2MzAsICAgMjg0MSwKKyAgMjQ0OCwgICA4Mzk4LCAgIDUzNzYsICAtNzI0OCwgIC0xNDc0LCAgLTE4NDIsICAtNDExOSwgICAgODM4LAorICAgNTAxLCAgLTQyMDYsICAgNDA1MiwgIC0xMjUwLCAtMjA5NDMsICAtMzMzOCwgICAtNTkyLCAgLTI5NzMsCisgIDcwNTcsICAgLTEyOCwgIC0zMjM1LCAgLTQzMTMsICAtMjUxMCwgLTExMzEzLCAgLTQ5MjUsICAgMzEwMywKKyAgMTQ0OCwgIC01MTg2LCAgLTEzMjIsIC0xNjgxNSwgICAxOTU2LCAgLTc5NTAsICAgMjY0MSwgIC0yODkwLAorICA0Mzk2LCAgIDIzMjIsICAtMTM4MSwgIC0xOTExLCAgICA0NDgsICAgMjU0MywgICAzNTM1LCAgICA3ODIsCisgIDM3MTksICAgLTYyNCwgICAxNjEwLCAgLTI4NDMsICAgNzU4MywgICAxNzk0LCAgICA3MDAsICAgMzEwNywKKyAgNDUyOCwgICA1NDYxLCAgIDI1NDAsICAtMTA3NCwgICA1OTc2LCAgICA3NDEsICAgIDU3NiwgICA0NDI2LAorICA0NDAwLCAgLTQ5MjAsICAgNTcyNCwgIC0zNzM0LCAgLTExODYsICAxMDY0NSwgICAxMTAwLCAgMTA1MzcsCisgIDI4MjgsICAxMTY3MCwgIC04MzkxLCAtMzI1NzIsICAtOTQwNSwgIC02ODA3LCAgIC04NzUsICAgMjI3NywKKyAgIDczNiwgIC00NTQ2LCAtMTg2OTMsICAgMTIwNCwgIC0xMDgzLCAgIDM0MjIsICAtMzMyOCwgICA2MDEzLAorIC0yOTkyLCAgIDU4MTIsICAgMjc0NCwgLTExNjY4LCAgLTI1MTksICAtMjM4NCwgIC0zNjM1LCAgIDY1MzIsCisgIDY4NzQsICAtMjgyMCwgIC01MjIyLCAtMTIyNjEsIC0xNDI2NiwgIC02NjYzLCAgLTExNTAsICAtMjAzMiwKKyAgMjA5OSwgICA0NjQyLCAgIDE2MzgsICAtNDE2MiwgICAtNjQ0LCAgICAyNDksICAtMzEzMywgIDExODMwLAorLTEwNzEyLCAgMTIzNzAsICAgNDgxOCwgIC0xOTI0LCAgLTU2MzksICAtNjQ0OCwgICAyNDU1LCAgLTQ4OTgsCisgIC02MTMsICAgMTc2MCwgICAyMzkzLCAgIDE0MTQsICAgNzAzOSwgIC03MDE4LCAgIDU5MDEsICAtMjkwMCwKKyAgMzc4NiwgIC0zMjMwLCAgLTM3MTgsICAgMzUxNCwgIC00MDQwLCAgLTQ2NzYsICAgNjM2NywgIC0xNDQ5LAorIC0yNzU4LCAgLTI4ODgsICAgNDA2NiwgIC03MTQwLCAgICA0MDgsICAtNzY1NiwgICAzMTU2LCAgMTk5MTksCisgLTE4NTgsICAgNjY3MSwgICAgMzUyLCAgLTMzNTUsICAgMzA3NCwgICA1NTI0LCAgLTE0MjksICAgMTk1NCwKKyAtNjY2NCwgLTEwMDgyLCAgIDQ0MDUsICAtMTU5OCwgICAtODA2LCAgIDE3NzksICAtNjkxMywgICA3MDYyLAorICA1MDY0LCAgIDY1MTgsICAtMTA0MiwgICAzNDAwLCAgLTU1MzAsICAtMTE5MiwgICAgNTkwLCAgLTMyOTgsCisgIC03NzIsICAgIDU3MSwgIC02MjM5LCAgIDk4MTAsIC0xMjM4MCwgICAxMzAyLCAgIDEzNDQsICAtMzQzMCwKKyAgMzgzMCwgICA0MTA2LCAgIDU3OTIsICAtNjE5NiwgICAgMjI0LCAgLTI2MDQsICAgMzk1NCwgLTEyNTUxLAorIC01NTM5LCAgLTgzMDYsICAgMTgwMSwgIC00NTIxLCAgIDM1NzgsICAtNDM0OSwgIC01NzE2LCAgIDQ5NjAsCisgIDM2MjAsICAgMTUxNiwgICA1Nzc5LCAgIDU1NTAsICAtMzcxMCwgICAzMzI5LCAgMTA1NDIsICAgNDE5OCwKKyAgNTE0OCwgIC0zMjkxLCAgICAxOTYsICAgNjIzMiwgICA2OTQzLCAgLTEzMDMsIC0xMDMwNiwgICAxODYyLAorICA2NTQ3LCAgLTE1NDQsICAtMjk5NiwgICAyODY4LCAgLTQzODksICAtNjg5NCwgIDI4NTU3LCAtMTMxMzAsCisgIDEzOTcsICAtMjMzMSwgIC00MDc2LCAgIDI4NzAsICAgMzU5MiwgICA2NjEzLCAgICAyNjUsICAtNDc5MCwKKyAtMzUxNCwgIC0zMTUyLCAgIDg3MTAsICAgIDIzMCwgICAzMTQyLCAgLTEyNjQsICAgMTgyMiwgICAtNzY5LAorICA2MTY4LCAgLTE3OTIsICAgMjE4OSwgICAyNjYwLCAgLTI2NjQsICAgMzQwMiwgICAtNTMzLCAgLTMxMDAsCisgIC00NzYsICAtMTE2NCwgICA2MDkyLCAgLTI5MzAsICAgMzM3MiwgIC01ODk1LCAgIDg1MDcsICAgLTkxOCwKKyAtNDcxNiwgIC0xNTgyLCAgMjM5NTksICAgMTUwNiwgICAyMzYwLCAgIC0xMTcsICAgMjAyOSwgICAtNDUyLAorIC02NTc1LCAgICA5NjQsIC0xMzEzMiwgIC0yODM4LCAgIDM4MDAsICAtMzM1NSwgICAzMTY4LCAgIDUyMzAsCisgMTExMTYsICAgIDgyNiwgIC0xNzExLCAgLTM1NDYsICAgNzM5OCwgIC00MDkyLCAgLTI4ODQsICAgIDc0MywKKyAtMTc4NCwgIC0zODI0LCAgLTM0MzcsICAgMTA1MCwgIC0zMzA2LCAgICA5MjgsICAtNTEwOSwgIC03OTk5LAorICAxNTgxLCAgIDg2MDksICAtNDY2MiwgIC0zNTk0LCAgLTE2MTgsICAgOTkyOSwgIC0zOTgyLCAgLTU1OTEsCisgLTg3ODksICAtMTQ0NCwgLTEyMDExLCAgIDEzMDQsICAxMjY2OCwgIC01MTM4LCAgMTA4MzcsICAtNzk1MSwKKyAtNDA4OSwgICAzOTIxLCAgLTUzNzUsICAtMjQ4NiwgIC0yNTkwLCAgMTEzOTgsICAgIC04MCwgICA3NzM0LAorIC00NTQ3LCAtMTEyODYsICAtNzA5OCwgIC03NzU4LCAgIDUzMDMsICAgNzM4MCwgLTExMjY2LCAtMTExMzgsCisgLTg2NzYsICAgICAzMCwgICA2MzI4LCAgICA1OTcsICAgNzg1MiwgICAzMTQ0LCAgLTM5MzMsICAxNTE0MiwKKyAgMzk1NCwgIDEyMTk3LCAgIC01MDcsICAtMTY2NywgICA1NTE3LCAgLTQxODcsICAgIDcwOSwgIC0xMzMwLAorICAyMDk0LCAgIDQ3MzksICAgMTM0MSwgICA4Mjc2LCAgIDg1NDQsIC0xMDEwNywgLTEwMTUxLCAgIDM2NDEsCisgICA3NzEsICAgNDc5OCwgICA0ODM5LCAgLTMyNTQsICAtOTI0NiwgIC03MzA0LCAgMTQ4NTAsIC0xODE1NSwKKyAgMzA2OCwgICA0OTkzLCAgLTQ5MzAsICAxMDk4NSwgICA2MjcwLCAgIDg1MjgsICAgNTkwNCwgLTEzMDEwLAorIC03ODI0LCAgIDEzMDAsICAgLTcwNiwgICAtMTU2LCAgLTQyMjgsICAgIDMwMiwgICA5OTYyLCAgLTMwODcsCisgIDQ0NzIsICAgNDU0MSwgIDEzMTc5LCAgLTY1NzYsICAtMjU0MSwgICA4Mjg0LCAgICAtNTEsICAgNTM2NiwKKyAtNDM2OSwgICAgMjg5LCAgIDM4OTAsICAtMzY3MSwgICAxODk0LCAgMjE4MjAsICAtMzAzMSwgICA1MzM2LAorIC04NDEyLCAgIDI0ODcsICAtMTIxMSwgIC02NzU5LCAgIDEyOTIsICAgMzc0OSwgIC04OTA0LCAgICA2MzgsCisgIDY4NjMsICAgIDE1NCwgICAxMTQ1LCAgIC02ODQsICAgNjY0OCwgIC0zODc0LCAgIDIwMDUsICAgNDY3MCwKKyAgNDQwOCwgICA0MTkxLCAgIDM5ODQsICAgIDYzMiwgICAyOTU3LCAgLTE1MzIsICAtMzk3NCwgIC0yNTc2LAorIC0xNjM2LCAgLTM3MTQsICAgLTEzNiwgIC00OTQ2LCAgIDM5MDAsICAgIDM2NywgIDI3MDcyLCAgIDE4NjQsCisgIDE0MjYsICAtMzMyMSwgICAgODYwLCAgLTE3NjgsICAtMjAwOSwgIC0zNDM2LCAgIDI2NjYsICAtOTg5OSwKKyAtMTMyOCwgIC0yMzMwLCAgLTMwNzgsICAtMzI1OCwgIC00NjAwLCAgIDU2MDQsICAtNTI0OCwgICAxNzAzLAorICA0NDAzLCAgLTQ3ODEsICAtODI3NSwgICA2NzE3LCAgLTM4NjAsICAxMDk4MCwgLTEwNjM0LCAgLTgzNjAsCisgLTIyOTEsICAyMDMxMSwgICA3NjAyLCAgLTQwMjgsICAgIDQ4MywgIC00ODg2LCAgIDI2NzcsICAtNDkyMSwKKyAgNjA2NSwgICA1MzkzLCAgLTIxNDUsICAgNjIwMSwgICAtNDcyLCAgIDE3OTYsICAgMjg2OSwgIC0zNTc4LAorICAzMDUzLCAgLTIzNDIsICAtMzE5MywgIC0yNTg5LCAgLTMyMTUsICAgMTMyMiwgICAgNTM2LCAgIC0xNjQsCisgIC0zMTQsICAgNDgwMCwgIC0xOTAzLCAgLTEzMzgsIC0xMTgzMywgLTIzMzk5LCAgIDU1NjIsICAgNDQ0MCwKKyAtMTg2NCwgICAyNTIwLCAgLTQyNTEsICAtMTQ2NCwgICA1MDUzLCAgLTg1NTMsICAtMzg1MiwgIC01OTMyLAorICAtODQ5LCAgLTcxMTMsICAtMzQ5MywgIC01MzM4LCAgLTE2NzEsICAgMTQ5NiwgICA0NTA0LCAgLTE4MzAsCisgIDU3MTYsICAgLTIxMCwgICAxMzk3LCAgLTIwNjAsICAgMjI0MiwgICAtNTgzLCAgIDI2MDQsICAgNTM1NSwKKyAxMzkzOCwgIDEzMTUwLCAgIDEzNDYsICAgMjY0OSwgIC0xNTI3LCAgLTQ1NjgsICAgODg5MSwgICA3Mzk5LAorIC02NDkyLCAtMTAzNzEsICAtNDg4NSwgIDEzMDU2LCAgLTgyNjIsICAtMTI2NywgIC0yOTU5LCAgIC04NjgsCisgIDU5NDEsICAgIDI5OSwgICAtNjAxLCAgIDg4MzQsICAgMTQzNiwgICA1NDA0LCAgIDE5MTQsICAtMzc3NSwKKyAgIDk4MCwgICA4ODQ4LCAgLTIyNzAsICAtMTk1MiwgICA2OTAyLCAgIDg2NDIsIC0yNTcyNSwgICA5NTU2LAorIDE0NTQwLCAgIDE5OTgsIC0xMzE1NywgICAgMzA4LCAtMTM4NDQsIC0xMDEyNiwgIC0yMTQ3LCAgIDgyOTYsCisgIDE3NzIsICAgMTA5NCwgIC05NzEyLCAgLTg1NjAsICAtNzU1MiwgICA1NTI3LCAgLTE0NDYsICAtMTA5NywKKyAtNTc5OCwgLTE3MjcwLCAgIDI4NjAsICAgLTIxMCwgICAyMTM2LCAgICAxNzUsICAgIDcyOSwgIDExNzc1LAorIC01MTU0LCAgLTQyMDIsICAxMzM0MiwgICAzOTc3LCAgMTQ0OTQsICAtNTY1OSwgICA5MTA1LCAtMTEwNjcsCisgLTM2OTQsICAgNDc5NCwgICAtNTkzLCAgIDY4MTcsICAgMTg3NSwgIC00OTc1LCAgIDM2NjMsICAgNDE0MSwKKyAtODMxNywgIC04OTMyLCAgIDIxMjcsICAtNDE3NiwgICAxMTM2LCAgIC0xNDgsICAgNzY0MCwgICA4MTI3LAorICAtNzQ0LCAgIDIzNTQsICAgIDM4OSwgICAxNjAwLCAgLTY0NzUsICAtNDU1OCwgIDEwNzM1LCAgMTE0MDcsCisgIDM4OTYsICAxMzA5OCwgICAxODE0LCAgIDUxOTEsICAtMzg1MCwgICAyNjI5LCAgMTg0MzAsICAgODM0MywKKyAgNDYzMCwgIC00NjI0LCAgIC03MDIsICAtMzgzNCwgIC0yMjc2LCAgLTI4OTQsICAtMTU1NiwgICAxNDM3LAorICAgNDI0LCAgIDU2NTIsICAtNjI2MCwgICAyMzg3LCAgLTU4NDUsICAgNzQ5NiwgIDEwNjU3LCAgLTI3NTQsCisgIDQ4MDYsICAgMTE2OSwgICAxMzA4LCAgLTQxMTQsICAtNTM0NywgIDE1MDc2LCAgIDU2ODYsICAgNzI4NywKKyAgMzAwNCwgIC02MjU0LCAgIDUxODYsIC0xNDA5NiwgIDEwMzIzLCAgLTE5NzQsICAtOTM1NSwgIC01NTQ0LAorICAtOTg2LCAgLTU5OTgsICAgIDI2MSwgICA0NDk0LCAgIDI0NjcsICAtMTkxMSwgICAtNjAzLCAgLTQ1NDgsCisgLTEzNDQsICAgMTk5NSwgIC0xNjAzLCAgMTA0NjQsICAgNTIyMiwgICAzNzE0LCAgLTUzNDIsICAtODAzOSwKKyAxMjUzMCwgLTI2NDY1LCAgLTE4MTMsICAgNDA0NCwgICAgNzQ2LCAgIDgxMjMsIC0xMjA3OCwgIC00NzAzLAorICAyOTcxLCAgLTQ0ODcsICAgMjU1NiwgICAzOTA0LCAgLTI1MTgsICAgMTUwNCwgICA1Nzc0LCAgIDU0MzEsCisgIDExMjAsICAgLTkzNCwgIC01MjAyLCAgLTY4MjYsICAtODc3NCwgICA3MTU2LCAgLTIzOTIsICAxMDY0MywKKyAtMjkxOCwgIC00Mjk4LCAgIDMzNjEsICAtMzc1OCwgICAtODk0LCAgIDU4MjgsICAgLTIwMywgIC00OTA1LAorICA2NDgwLCAgMTE3NzEsIC0xOTgzMCwgLTE3NTQ1LCAgLTQ5MjAsIC0xNzI2MywgIDEwMDY2LCAgMTAxMjUsCisgLTg5ODAsIC0xOTcxOSwgIDIzNTU0LCAgMjc5MDcsICAgMjYwNywgIC03MDE0LCAgIDYxMjgsIC0yMzc1OSwKKyAtNDgwMiwgIC03MDk5LCAgICA4NzQsICAxMzEwMywgIDIxNjY3LCAgLTg0NzUsIC0xMjkzOCwgLTEzMTIyLAorIC0zNjk0LCAtMTg4NjAsICAtMzUxOCwgIC0zNTg2LCAgMTI2NTgsICAgLTc5MywgIDEwNjYxLCAgIDY5MjUsCisgIC03MzAsIC0xMTM3MywgIC03ODQ1LCAgICAgOTQsICAtMjYyNywgIC02MDQ0LCAgLTIyMTMsICAtNDM4MSwKKy0xMDE5OCwgIC01ODE2LCAgICAtNTYsICAtNDM0OSwgICAzNzIyLCAgIDM5MTEsICAtMTcxOSwgIC0yNTEzLAorLTEzMjkwLCAgIDMyMTgsICAgIDEwNSwgICAxODc2LCAgICAtNzYsICAtMTEwNywgICAyNTYzLCAgIDQ1MjAsCisgMTAyODgsICAgNTg2MiwgIC03NzM4LCAgIDYxODAsICAgOTg2MywgICAxMzgwLCAgIDY3NTYsICAgMjYzMiwKKy0xODc5OCwgICA5MzE0LCAgIDcxOTAsICAtNzQ1NCwgICAgNDMyLCAtMTUxNDEsICAgODQ2MiwgICAyMTI4LAorIC0yMzg2LCAgLTI3MTAsICAgIDI5MiwgICAtNzUxLCAgLTMxMjUsICAgNjE0NywgICA0OTQxLCAgIDMxNDYsCisgIDMwNDYsICAgIDEyMCwgICAgMzIxLCAgLTU4ODQsICAgNTEwNSwgIC00MzAwLCAgIDYyNjQsICAgLTMxNywKKyAgMTY2NywgICAtNjk0LCAgIDc5NTAsICAgNTYzOSwgIC0zMjg0LCAgIDEwODksICAtNjQ1NiwgLTE0Njk0LAorIC0zNTI3LCAgLTExMDQsICAgNDMxMywgLTIwODU4LCAgIDc5MjAsIC0xMDc4MiwgLTEzNTM2LCAgICA5MzMsCisgIDQ1MjMsICAgMjY0MCwgICAyMTE4LCAgICAgOTcsICAgLTYxNCwgICA5ODM0LCAgLTk1MTUsICAgIDIzMiwKKyAgNTA4NiwgIC02NzIwLCAgLTE1MjksICAgIDU2OCwgICAzMTM5LCAgLTM2NjUsICAtODU2NywgLTEzNzcxLAorICA2Mjc0LCAgLTQzNzAsICAtNTY1MywgIC04OTIwLCAgLTc2NjcsICAtOTM5MSwgIC02NjUzLCAgMTI0ODksCisgLTM2NjYsICAtNTEwMywgLTEyMzI0LCAgIDQ3OTYsICAgLTU0MCwgIDEwMzk2LCAgIDM2NjgsICAtMzQ2NywKKyAgNzEyNCwgIC00Mzk4LCAgICAgODcsIC0xMjEzOSwgICAtMjA0LCAgIDEyMTMsICAtMjE5MCwgIDExOTQ4LAorIC0yNjQxLCAgLTI0MzQsICAtNTY0NywgICAyODE5LCAgIDMxNDgsICAgMzU1OCwgIC02NDU1LCAgIDM3MDUsCisgIDE2NDQsICAtMzA5MCwgIC00MjI1LCAgLTU5OTgsICAgIDExMiwgIDE3Nzg5LCAgLTcyMjAsICAgMjE2NiwKKyAgNDE1MywgICA0NTE2LCAgLTExMDAsICAtMTY2NywgIC0xNDAyLCAgLTg4MzcsICAgNjM0NCwgIC0xNTg2LAorIC0zNDUxLCAgIDIzNTcsICAgIDYxNiwgICAtMzkyLCAgLTgxNjMsIC0xMTU3OSwgICA2MTYwLCAgLTI3ODMsCisgIDc4OTUsICAxMTMyMSwgLTExODQ3LCAgIDgwNzAsICAgNTIzMSwgIC02NDk2LCAgLTMxNzIsICAtMzQ3MCwKKyAtMjk2MCwgLTExNDM3LCAgICA0NjUsICAgLTQ3MCwgIC0yNTY4LCAgMTExOTcsICAtOTQxNywgIC00MTE3LAorIC0xMTYyLCAgLTE4OTMsICAtMjM2MSwgICAgNTUxLCAgMTQ0NzgsICAgMzUxMCwgIC0xMzcyLCAgIDMxMTcsCisgLTgyMzYsICAtMjkwNCwgIDE0NTU2LCAgIDMxOTEsICAgIDIwMCwgICAyMTY2LCAtMTM5NzQsICAgMjcxOCwKKyAgMzk0NiwgICAyNDQ0LCAgIDE5ODIsICAgNTMyMCwgICAyMDg3LCAgLTIyMjIsICAgMTU3MywgICAgNzQyLAorIC04ODI4LCAgLTM5MTcsIC0xMTA4MCwgICAtMjQxLCAgLTg0NzIsICAgNjExOSwgICAgMjkwLCAgLTIzNjQsCisgLTMxNjMsICAgMTkyMywgIC0xOTY0LCAgIC01ODIsICAgMjU2NCwgIC01NTY2LCAgLTY0MTEsICAgMjA2OSwKKyAgNzM5MiwgICA5MTE1LCAgMjUzMTYsICAgMTUwNCwgICAyNTQwLCAgIC04MTQsICAtMTc0NiwgICAgNTY2LAorIC0xNTgwLCAgLTIyOTAsICAgIDE3MCwgICAgNjk4LCAgICAxMDUsICAgOTU2NywgIC02NzE0LCAgIC01ODQsCisgLTQ5MzQsICAgLTM3OSwgICAtNDkxLCAgIC05NzgsICAgNDU4MCwgICAxMTgwLCAgLTMzNTUsICAgMTg4MiwKKyAtNDM0MywgICA0ODE3LCAgIDE1MDMsICAgOTk2OCwgIC04ODc4LCAgLTQ5MDgsICAgMzQxOSwgIC00ODE4LAorIC0yMjU0LCAgIDY2OTQsICAtNDM2OCwgLTEwODQ5LCAgLTUwOTMsICAgNDUxMCwgIC0zMTI5LCAgICAxNTIsCisgIDE5MjYsICAtNDQ5MCwgICAxNTEwLCAtMTc3NjQsICAtNjY5OSwgICAgOTYyLCAgIDM0NzQsICAgNDk4MSwKKyAgICAyNSwgIC03MTI4LCAgIDE0MzIsICAgNTM4NiwgICAzMTA4LCAgLTQ1NDUsICAgMTA5MiwgICAxNjYzLAorIC0xMzYzLCAgIDMwNzYsICAtODkxNiwgICA2MTU4LCAgICAyNDQsICAtMTE4MSwgICAtODI1LCAgIC05MzMsCisgLTU1NzAsICAxNzIyMSwgICAtNTM1LCAgLTI4OTIsICAtNTAzMSwgIC0xMjk3LCAgLTMwMTAsICAgNTg0MCwKKyAgIDY3OCwgICAgNzQ4LCAgIDM5NDQsICAgMTYzMCwgIC0zNjQ4LCAgLTU0NTcsICAtMjYxOCwgICAgODc2LAorICA2NjU1LCAgLTI4MzQsICAgMjU5NywgIC02NjY3LCAgIDEzMzAsICAgIC00MCwgIC00NDIzLCAgIDYyNTcsCisgICA3NDMsICAgNjA4MywgICAtNTg0LCAgLTM3NDIsICAtMTQwMSwgICAxNzc5LCAgLTUxNjYsICAgNDU1OSwKKyAgNTU1OCwgICA4NTg4LCAgLTY0NzYsICAgNzUyMSwgIC0xNTYxLCAgIDQ5NTAsICAgLTc3OCwgICAzNTY0LAorIDExNDAzLCAgLTEwMTAsICAtMzE1MSwgLTE0MTUxLCAgLTEwMjAsICAgMjU5NSwgIC0zMjc4LCAgMjQ1NTUsCisgLTQ4NTksICAgLTkwOSwgICAyMzE0LCAgIDEzMDEsICAgMjA5OCwgIC01NjY0LCAgIDM5MzgsICAtNDA1MCwKKyAgLTIwMywgICAzMzY4LCAgLTI1ODAsICAgMzA2MSwgIC05MjY2LCAgLTYyNjMsICAtNjc0OCwgICAzODkwLAorICAxOTUwLCAgIC0zMjksICAgMTA1MCwgIC0xMTA2LCAgICA1ODgsICAyMzcwNSwgICAtNjYxLCAgIDY5MTMsCisgICA3MjIsICAtNTgyMCwgICAyMTQ3LCAgIDM3ODksICAtMTY4OSwgICAgNjYxLCAgIDUzODksICAtODUxOSwKKyAgMTE1MiwgICAzODAwLCAgIDcxNjAsICAgNTIzNCwgICAxMzQzLCAgIDMyMTgsICAtMjkwMCwgICAtMzkxLAorIC00MjU4LCAgIDUwODQsICAtNDc4MywgICA3MjYyLCAtMTAwMTMsICAgLTgxMSwgIC01MjUyLCAgIDY0NzQsCistMTczMzgsICAtMjM4OCwgIC0yNTk2LCAgLTg3MTUsICAgNTgzNiwgICA5NTIzLCAgICA2MzksICAgNDY1MiwKKyAgMzA3MSwgICAzMTE0LCAgLTE2NDgsICAgMTU2MywgICAtOTMxLCAtMTAxNDMsICAgNDM5NCwgIC0yODM4LAorLTExOTAwLCAgLTEwMTIsICAgIDg0MSwgIC01ODEyLCAgLTMwNDgsICAtMjcxNSwgICAtMTk2LCAgLTU3OTQsCistMjAwMjIsICAgMTk0OSwgICAzNDY0LCAgIC03NzAsICAgMjIwMCwgIC0zNTY0LCAgIDE5NzUsICAtNjI0MiwKKyAtMTkzNywgICAzOTU0LCAgIDU2NzgsICAtMjc0NCwgICAxODg4LCAgLTM4MjUsICAgNTc3MCwgICAzODY5LAorICA4MzE1LCAgLTczODYsICAgMTMxOCwgICAxMzAyLCAgLTU1MzQsICAtNDU1NCwgICAgOTI0LCAgLTM4MDQsCisgLTQyOTIsIC0yMjc1NywgIC03OTcyLCAgLTc0NjksICAtMzU0MywgICA3ODU4LCAtMTAxMjUsICAtMjYzNywKKyAtNDc2NSwgLTEwNjQ0LCAgLTU5NDQsICAgMTE1OSwgIC0zMjkzLCAgIDQzNjMsICAtMTIxOSwgLTEyMjQ4LAorICA1MDYwLCAgLTcyMzIsICAgNjk0NywgIC0xNjA5LCAgLTMwMzcsICAtNTA4NCwgICA2NTgwLCAgMTU4NzMsCisgIDUzMzYsICAgNzI5NSwgICAyMzg2LCAgIDI5NjEsICAgNDY1NSwgICA5NzE0LCAgIDUwODAsICAxMTYzNSwKKyAgMTc5MCwgICAyODk3LCAgICA2ODcsICAgLTkxNCwgICAtNjkyLCAgLTY2NTMsICAtODU2MiwgIC0xNDEyLAorICAgMjQ0LCAgIDQ0NzgsICAgMTY1MCwgICA3MTc1LCAgIDEwNDYsICAtNjY4OSwgICAzNjkzLCAgLTM1MjAsCisgIDYwNDYsICAtMTMzNiwgICAxOTc2LCAgMTY4MjIsICAtMTE3NiwgICAgNzkyLCAgLTE3MzMsICAgODI4NiwKKyAtNzM1OSwgIC0yNDAyLCAgLTg1MzYsICAgMTM5MiwgIC0zMjcxLCAgIDY1ODAsICAtNDkzOSwgICAxNTYyLAorICAgNTk1LCAgLTQyMzcsICAgNDg3MiwgICA0MjY2LCAgLTE3OTgsICAtNjU4OSwgICA3NDU3LCAgIDQyMDcsCisgIDk5NzgsICAtMzk5NiwgIC0yMjM2LCAgLTMwNzgsICAgMTg2MSwgIDEwMTAxLCAgLTIzOTQsICAtMzI1MCwKKyAtNzYxOSwgIC03MDgyLCAtMTQzMDUsICAgNTY2NCwgIC0xMzM3LCAtMTEwMTksICAtMzgzOSwgIDEwMTkwLAorICA3MjQ5LCAgIDMwODYsICAtMTc4MiwgICAgIDI0LCAgLTM1NjYsICAxMDc2OSwgIC00MTAyLCAgLTY0MDgsCisgIC02ODgsICAtODk4NywgICAzMDE4LCAgLTU5NDIsICAgNzQ3OCwgICAtMzY4LCAgLTc5MzEsICAtMzAxOCwKKyAgNjc2NiwgICAgLTc4LCAgIDU3MDUsICAtMzI2NCwgIC0xMTAwLCAgIDQ4NTAsICAgNDUxOCwgICAgLTI4LAorIC02Mjc2LCAgIDQ5MDUsICAgNzA5NCwgIC00Mzk0LCAgLTI4NDYsICAgIC04OCwgICAgNDM0LCAgIDIwMzksCisgICAzNTIsICAgOTgyNywgIDEyMzcyLCAgIDEyMDcsICAtODU2MSwgIC00NDc2LCAgIDE0OTYsICAtNDkyNywKKyAgMjA4NywgIC02NzMwLCAgIDExMzQsICAgIC04MSwgICAgIDU3LCAgLTg3MDEsICAtMjkxOCwgICAzOTUzLAorIC0yODQ0LCAgLTE4NDIsICAgNDgwNCwgIC01MzE1LCAgIC00MDEsICAgNzA2MCwgLTE2Mzk3LCAgLTQ4MDIsCisgLTk4NDksICAxNzU0MiwgLTExNzE1LCAtMTI0MzIsICAtNjY3NiwgICA5MzIzLCAtMTMxODksICAtNTc2MSwKKyAgODA1NCwgICAtNjIwLCAgLTc0MzEsICAgMzcyNiwgIDE3NzkwLCAgIDc4ODAsICAgIDI1MSwgICAyOTgzLAorICAzNzM2LCAgIDcxMTgsICAxNzE5NywgICA4NjEzLCAgIDE0NDUsIC0xNTI5MCwgLTE2MTg0LCAgMTEwODQsCisgLTQ5NzEsICAtNTkyMiwgIC0xODkzLCAgIDkwNjcsICAgOTMyMSwgIC04MTM5LCAgICA3MTQsICAgIDE4MiwKKyAtMzEzOCwgICA3MjU4LCAgLTE4NzQsICAtMjc4MSwgIDEwODAwLCAgIDI5MTUsICAgNTMxNiwgIC01MjA2LAorIC0yNTgxLCAgMTAyMTksICAgLTQ4NCwgICAgODYyLCAgICAxMTksICAgNjYyOCwgICAxNTE0LCAgIDM4ODMsCisgIC04ODAsICAgNzU4NiwgIC0yNTczLCAgIDMyNzksICAgMzgwMSwgICA0NDkyLCAgLTM4NTAsICAgOTQxNiwKKyAgIC0zOCwgICA3NTE4LCAgIC01NzQsICAgNDA1MiwgIC0xMTM2LCAgIC02NjgsICAgOTY3MiwgIC05NTM2LAorICAyNTUxLCAgLTQyMjMsICAtMTA3NCwgIC0zNjE2LCAgIDg0NDYsICAgIDE1OCwgICAzMjYyLCAgIDc5NjUsCisgIDEzMTEsICAtODYzNCwgIC02Nzg2LCAgICA3MDAsICAgNDk3MywgICAgOTE3LCAgIC03NTQsICAtMTE1NiwKKyAgNjA1NCwgICAyMDY3LCAgMTA3NTcsICAgIDQyMSwgICAxMDMwLCAgMTEzNTEsICAgMjE0OSwgIC00Mjg2LAorIDEyMDc1LCAgIDQ1OTMsICAgMTE5MywgIC01MjkwLCAgLTg1NjYsICAtMjk2NSwgICA2ODI0LCAgLTYyMzgsCisgIDIzOTIsICAtMzM5NSwgICA1MzUwLCAgLTI3ODksICAgNzUyOSwgIC0xODczLCAgIDMwMzIsICAtMTQ5NCwKKyAtMjcwMywgLTE4NTM1LCAgIDE1ODMsICAgOTUzOSwgICAyNTU2LCAgLTQ0MjIsICAtNjA3OSwgIC0yNjk5LAorIC03ODYwLCAgLTQ1NzMsICAtODIzNiwgICA0MjgxLCAgLTEwNzksIC0xNzU3OCwgIC0yODQwLCAgIDc0NjgsCisgIDQ2NzUsICAtNTAwMiwgIC0xMjY4LCAgLTE1MjksICAtODIyMiwgICA4Mjg1LCAgIC03NjYsICAtNDMxNCwKKyAgNjA0OCwgIDExNTA3LCAgIDUwNDYsICAtMjQ0NCwgICAzMTg2LCAgIDE3MzIsICAgNzg3MiwgICA2NTk4LAorICAyODI4LCAgLTI5MjAsICAgODI3OCwgIDEzMjYzLCAtMTAyMDQsICAgMTMzNCwgIC01NTUyLCAgMTA1MzIsCisgIDU0MTIsICAgMjU1NCwgLTEwMDc2LCAgIDExMjgsICAtMzk1OSwgIC0zMjEwLCAgIDQwOTEsICAgMTgyNCwKKyAgNDk4NCwgICA1NTU4LCAgLTIyMDQsICAgMjA4MCwgIC0zODAyLCAgIDY2MTQsICAtNzM4MCwgICAzNjEyLAorIC00NjI0LCAgIDYzNjYsICAtMTc5NSwgICA0MDM4LCAgIDYyMjcsICAtNDMxMiwgIC00OTEwLCAgLTIxMjcsCisgMTUwNzcsICAgNDE0NCwgLTE2ODg1LCAgIDM3NTcsICAgMjMwMywgICAtNjcwLCAgIDU2MjUsICAtMjU5MCwKKyAtMjU5NCwgICAyNDkxLCAgLTMxNzQsICAgNDE5OSwgICAxMTUyLCAgLTE1MzIsICAtNzMwOCwgIC04NTc4LAorICA2NDMxLCAgIDI5NzUsICAgNjAzMiwgICAzMDM3LCAgLTc0NTEsICAtMjY0MywgICA1NTAzLCAgLTc4NTYsCisgLTI0NTEsICAgNTMwOSwgIC0zNjc4LCAgIDgxNDUsICAgMTg2NCwgIC04MzQxLCAtMTU1NzUsICAgNzcxNiwKKy0xMDMzNywgICA4OTM1LCAgMTIzNTAsIC0xMDQxOCwgIC00MDkyLCAgICA3MzQsICAxMDQwMCwgIDEwOTM0LAorICA1NzI0LCAgIDE3NzgsICAgNTgzNiwgIC0zMjAzLCAtMTA3MDAsICAgMjc2NiwgICA0MTc4LCAtMTgxMzUsCistMTY1ODksICAtNTQ2NSwgIC01MDA1LCAgIDcyMzksICAyNTQ4MCwgICA3MzEwLCAgLTY0MDgsICAgNjE0MiwKKyAtNzc0OCwgIC0xNDIzLCAgLTQzMTgsICAgLTMyMSwgIC0yODk5LCAgIDM3MjgsICAtMzE4NCwgIC0zNTc4LAorLTExNTk4LCAgLTEyMjMsICAtODU1NCwgICAgNjU2LCAgLTM5NDUsICAtNDA4NCwgICAtNzI0LCAgICAzMDEsCisgIDk1MzksICAgOTY5NSwgIC0xNzk5LCAgLTI2MDIsICAtMTM3OSwgIC01MjgyLCAgLTQ3MDksICAxMTg1OCwKKyAgOTU2MiwgIC03NTA4LCAgIDQ4ODYsICAgIDg5NiwgICA1NzgwLCAgIC0xNjAsIC0xMjcyNCwgIC05NTk4LAorICAxMjIwLCAgLTU0MTEsICAtNTA3MiwgIC02NDc2LCAtMTE3NjMsICAgLTEwNCwgICA5MzExLCAgIDUyMzAsCisgICA1OTEsICAgNDM0MiwgICAgMjYzLCAgMTMxOTgsIC0xNzgwMSwgIC0xODkyLCAgIDI2MTksICAxODE5NCwKKyAtMjA4MCwgIDE2NTM2LCAgMTg0OTcsIC0yNTkyNiwgIDI1NTQxLCAgICAgNjYsICAtNjY0OCwgICAxNjI3LAorICAyNzk0LCAgLTM3OTAsICAgOTQyNCwgICAxMzg3LCAgMjA3MDIsICAgNTI2MCwgICA1MjExLCAgIDE3MDIsCisgIDEwMTksIC0xMTE0MywgIC02NTAxLCAtMTg3MTEsICAxMDg2OSwgIC00MjA0LCAgIDQ5OTQsICAgMTcyMiwKKyAgODU2OSwgICAzNjcwLCAgIDQzODYsIC0xNjg3NCwgICA4ODc2LCAgLTIyOTcsICAtMjc0MywgIC00NTYyLAorIC05MjA3LCAgIDgwMzMsICAgLTM0NiwgIC0zNTg2LCAgLTk0NTEsICAgMzI0MiwgICAxNTUyLCAgIDQyNzgsCisgLTY3ODcsICAgNzExOCwgICAzNjMwLCAgIDQ2MDIsICAtNzM3MSwgLTEyNzg5LCAtMTA0MjQsIC0xNDkyMiwKKyAtMzAxMCwgICAxODg1LCAgIDQxNDQsICAtNDQ5MCwgICA0MDc0LCAgIDc3OTYsICAtMTIwMSwgIC03MjQ0LAorICAyNjc1LCAgIDEyMjEsICAtNzA2MCwgLTEyODI4LCAgLTM1MjAsICAgMTk4MywgIC00NjE1LCAgIDgyMDcsCisgIDE2MDYsICAgIDUxNywgICAzNjQ2LCAgLTcyNTIsICAgIDgxNiwgIC0zNjkwLCAgIC02NzQsICAxMzEwMCwKKy0xNjI1NCwgICA0NzI3LCAgLTgxODQsICAgLTk2OCwgIC01MzY2LCAgLTIyODgsIC0yMDI2MCwgICAxMTc0LAorLTE5Mzg0LCAgLTQxOTksICAtNTI5MiwgICAgNTgyLCAtMTMxMTgsICAgMTgzNiwgICAxNjk4LCAgLTIwMzQsCistMTQ2MDEsICAgNjY0MiwgLTEwNTMwLCAgICA0ODIsICAgLTg1MSwgICA5OTY4LCAgIDcwNTAsIC0xMzM2NiwKKyAtODM1NCwgICA0NzQwLCAtMjAwNTAsICAgLTE5MywgIC0xODgxLCAgLTEyMDUsICAtNDA0MiwgICA3MDY3LAorIDEyODcyLCAgIDU4NDYsICAtNDc5MiwgIC0xODMzLCAgIDI1MDQsICAtMzIyMiwgIC0xNjA3LCAgIDI2MzQsCisgIDQ1ODcsICAgNjc2MSwgICAxNTQ5LCAgIDExMjQsICAgOTQyNywgICAzOTc4LCAgLTgzMDUsICAgNzUyNCwKKyAgMjUwNywgIC01NzQ0LCAgIDMyMzgsICAgNTIzOCwgIC0zNjY0LCAgICA2OTQsIC0yODQ5NiwgIC0xNjc0Cit9LAorCisuY2IxMTA4czEgPSB7CistMTA5NzksICAgODY5OCwgICAtNjMwLCAgIDQ2NjAsICAgMzA2MCwgIC03MjkyLCAgMTAxNDAsICAxMTk0MiwKKyAgMTQ0OCwgIC01ODIwLCAgLTMxNDQsICAgMzEwMCwgIDEwNTc1LCAgIDY4ODgsICAgMzUwNSwgICA5OTk2LAorICAyNzg3LCAgIC00ODQsICAgODA1NywgICAxNTAzLCAgIDYzMjksICAgMzA3NCwgICAzOTU0LCAgIDk0MTksCisgIC03MzYsICAgMjMzMywgIC0xODU4LCAgIDMyNjQsICAtNDAyNiwgIDE2MTMwLCAtMTQ1MDEsICAtNTI4NCwKKyAgLTQ3MiwgICAgODUwLCAgLTcyNTgsICAgMTU0MiwgICAxNDczLCAgLTIzNDgsICAtNzA1NSwgIC05NTc0LAorIC0yMjc1LCAgLTQzODMsICAgNzU0MiwgICAtMzYwLCAgLTI5NDUsICAtMzg3OCwgICAgIDI4LCAgICA4MDksCisgICA2MDAsICAgMjI0NiwgICAgNTg3LCAgLTE3NzksICAtMzQ1NiwgICAtNzM3LCAgIDMyNDIsICAtMjUyMywKKyAtMTg2MiwgICA2MTI3LCAgICA4OTksICAgMTA3MCwgLTE1NjE0LCAgMTA5OTAsICAtMzA4NCwgICA5NTQ2LAorICA3MzM5LCAgIDg4OTksICAtMTQ5MCwgLTEwMzc5LCAgLTkxOTMsICAtMzg1NywgICA4Mjg5LCAgIDcyNjEsCisgMTI0ODksICAgNzgxNCwgIC02NDU4LCAgIDEyMjMsICAxNTQ4NiwgLTEwOTYwLCAgLTE4ODAsICAgNDkyMiwKKyAtNzgxOSwgICAtNTI3LCAgLTIzNzAsICAgMzY4NywgICAxMzU4LCAgMTAzNjcsIC0xNDI2NiwgIC0xNDk2LAorICAxMDYwLCAgLTkzMjUsICAtNTU4MiwgIC0zOTQ3LCAtMTc1MzYsICAgMTQ3MCwgICA0ODc4LCAgMTA3OTMsCisgIDI5MDQsICAtMjU2NiwgIC00OTk1LCAgIDY1NDksICAgNjE0MSwgIDExMDQ4LCAgIDMxNzcsICAgLTQ5NCwKKyAgOTA4NywgICAgNzk3LCAgLTI1NzUsICAtNTYxNiwgICAxMTk3LCAgIDI5NjYsIC0xMTI4NywgICA0NjU4LAorICAtNTA0LCAgIDQ1NzEsICAgMTgxNCwgIDE4ODMwLCAgMjYyNTQsICAgMjM5OSwgICA4NzUwLCAgIDI2NTYsCisgIDgyMDYsIC0xMjk4NywgIC05MTE5LCAgLTEwMjcsICAgLTQ1NywgICAxMjI4LCAgIDYxMzcsICAgMjMyMiwKKyAgMTczMiwgIC01Njk0LCAgIC04OTIsICAgLTI0OSwgICAtMTc4LCAgLTcwMDksICAtNDM2OCwgICAgNDAyLAorIC01NTY0LCAgLTUxODMsICAgMjQ3MCwgIC00NzQ1LCAgIDI3ODgsICAtMzI1NSwgIC01MTgxLCAgIC03MDYsCisgICAgNDAsICAtNDkxNSwgICA4OTI2LCAgLTM2MzMsICAtMjQ1NSwgIDE1MDU0LCAgIDUzNzYsICAgLTg2NywKKyAtNzI3MCwgICAtOTc5LCAgIDcwNTMsICAtNzQzMywgIDEzNzQ5LCAgIDUwMzksICAtMjIzNCwgICA4NDc0LAorICA3MDMxLCAgLTM5MTcsICAgNTEyNywgIC03NjAyLCAgICA1ODAsICAxMjA2NywgICAyMjUyLCAgICAxNDksCisgICAgODYsICAgLTU4MiwgIC01NzI5LCAgIDIxOTMsICAgNDE3OCwgIC05MTk1LCAtMTE4MjQsICAgMzg5NywKKyAgMTI5OCwgIC0xMDQ0LCAgIDY0NTAsICAgMTg4NSwgLTE5NTYyLCAgIDYyMDUsICAtNDYxMCwgIC0yNTQ0LAorICA1MTkyLCAgLTQ4ODUsICAgNTAyMSwgIC0yMzczLCAgIC0xMDIsICAgNzM1OCwgIC0yNDM0LCAgLTM1MTIsCisgLTQwNDgsICAgMzA3MCwgICAgIDQ1LCAgLTEzNDQsICAgIDIwMiwgIC0yMTg5LCAgICA0NDgsICAgMTE3MiwKKyAgMjkzOSwgICAtNTQ3LCAgIDEwMDMsICAtNjM3MCwgICAzNjQzLCAgLTExNTcsICAgMzkzMiwgIC02MDQ0LAorLTEyODgyLCAgIDE5NTksICAtMTU3NCwgICAyNTc0LCAgMTQ4NTQsIC0xNjMxNywgIC02NjI3LCAgICA1MDUsCisgIDExMDIsICAtOTM2MSwgIC04MDg3LCAgIDc1MjUsICAtMTQ2NiwgICAgMjg0LCAgIDM3NTYsICAgLTM4MywKKyAgNTE0NywgICA1MDYwLCAgIC00NzQsICAgIDUzMSwgIC02MTQ0LCAgLTE4NzIsICAtMTIwNiwgICAgNTI3LAorIC00ODYxLCAtMTI0MTAsICAgNzUwOCwgIC03MjI2LCAgIDUwNDYsIC0xMjIzMywgIC00MTUzLCAgIDQ2MjgsCistMTQ0MDIsICAtNTI2NSwgICAgNTM0LCAgIDE1MjgsIC0xMzQwOCwgICAgLTYyLCAtMTg3NTcsICAtMTI4MCwKKyAtOTMwMSwgLTEwMjU0LCAgLTg5OTAsICAtNjMzNSwgIC03NzI0LCAgLTMzOTQsICAgMTk1MSwgLTEzMjcxLAorIC0xMzg5LCAgLTUyNzQsICAtNDYxNiwgIC05NjQzLCAtMTAyOTUsICAgMTMzMiwgIC01NjE4LCAtMTA3MzcsCisgLTc1MzYsICAtOTMxNCwgIC03MDA2LCAgIC03NjAsICAgNzY5NCwgICAyOTU1LCAgIC00MDQsICAtMjgwMCwKKyAxNTI1MCwgIC0zODI4LCAgIDU5OTQsICAgNTQwOCwgICA4NDExLCAgMTY1NjgsICAtNzI4MCwgIC02OTAxLAorICAtMjIyLCAgLTE1NTQsICAgLTg2MiwgIC0xODcxLCAgICA5MzksICAtMzY3OCwgIC00MzQ4LCAgLTMyMDAsCisgIDMyMjAsICAgMTYxNCwgICA4NTk4LCAgIDgxNjIsICAgMTc0OSwgIC03Mzc4LCAgLTE2NTgsICAgIDkzMSwKKyAgMzg3MCwgICA5MTgzLCAgIDE1MDksICAtNTA2OCwgICAgLTE3LCAgIDU3MzMsICAtODEyMSwgICAyNzY5LAorIC0zMTk1LCAgLTMyOTYsICAgODk0MCwgICAyODI4LCAgLTI0NzAsICAtMjQ0OCwgICA3NDEzLCAgLTI4NTEsCisgLTEwNTgsICAtNDUwNSwgIC05NjUzLCAgLTUwNzQsICAgICA3MywgIC0zMjg2LCAgLTQwMTQsICAtMTc2MCwKKyAgMjU2MiwgIDEzNjkwLCAgLTM0NjQsICAgNTQzOCwgIC0zMzk0LCAgMTY5OTcsICAtMjk0NCwgICAgMjkxLAorICA0MjI0LCAgIDExNzUsICAtMjIzNywgIC02ODk0LCAgLTU0NzksICAtMTI5MSwgICAzMzkwLCAgIDU0NTUsCisgICA4OTgsICAgMzQ2MSwgIC03OTE0LCAgLTQ3ODUsICAgMTg3OSwgICAxMDU5LCAgLTM3MjEsICAtNTc5NiwKKyAgNTA1NCwgIC0zOTMxLCAgIDYzMTUsICAtMjQ2MCwgICAxOTA5LCAgICA1NzMsICAtMzM3MywgICAzMDUyLAorICAtMTc4LCAgICA5ODYsICAgIDU3MiwgIC01OTc2LCAgIDU3ODEsICAtNDkyOCwgLTEwNTM5LCAgICA1ODAsCistMTg3MjcsICAgIDc1NywgICAxNzU5LCAgLTQwNDksICAgMjIzMiwgICAxODkwLCAgIDQxMTUsICAgIDY5OSwKKyAtMjkzNCwgICA0OTI2LCAgIDIzOTEsICAxMDg0OCwgICA1MTAzLCAgIDQzNDAsICAtMTUxOCwgICAyMjg4LAorICAyMjgzLCAgIDg4ODYsICAtNTEzMSwgIC00NDI5LCAgLTQzODQsICAtMzI2NSwgIDExOTMzLCAgIDM5OTMsCisgMTE0NzQsICAgMzcyMSwgICAxNTMyLCAgICA5NzYsICAgNjExMiwgICAxOTU0LCAgLTIzNjAsICAtMTc4MywKKyAgMjA4MCwgIC02MzU2LCAgIDI0ODIsICAtNDY0NiwgIC0xOTkyLCAgIDE1OTAsICAgMTc5MCwgICAzMjkwLAorIC0yMzEyLCAgIC01NjQsICAgIDUwOCwgIC0xNjg4LCAgLTc1MjIsICAtOTI2MywgICAzMDU5LCAgIDE4ODMsCisgLTMwMDUsICAtMTMwMywgIC05MTQ2LCAgMTAyODIsICAgMTMzMywgICA0NjkyLCAgLTIwODMsIC0xNTc5MiwKKyAgMjIwOCwgICAxMTI4LCAtMTE1NzQsICAtNzE0OSwgIC0xMTI2LCAgLTQ5OTUsICAxODk2MywgIC02MjYyLAorICA1MDQ1LCAgIDIxNzksICAgLTgyMiwgIC0xMjQ5LCAgMTAwOTIsICAgLTMzOCwgICA1NzQ0LCAgIDE2MzUsCisgIDI1MzUsICAgNjExNCwgIC0xMzM5LCAgLTgzMzcsICAtNDM3MCwgICA0Mjg4LCAgIDI0NjgsICAgMzA1MSwKKyAxMjQ5MSwgIC05NTU0LCAgLTQwMzQsICAgIDUyMiwgIC0xMDg1LCAgIDU4NTIsICAtMjc1OSwgICA0OTE4LAorLTEwNzE3LCAgIC0xOTQsIC0xMTM3NiwgICAzMDU5LCAgMTIwNzUsICAgMTAzNywgICA1MjYwLCAgICA4MTYsCisgIDU5MTgsICAtMTk4NywgICA3OTI0LCAgLTYwMjIsIC0xMDM3NCwgIDExNjA3LCAgMjUwMzUsIC0xMTU5OCwKKyAxNjg5NCwgICAyNDU4LCAgLTU0NjEsICAtMjAzOSwgICAgMzg1LCAgIDYwMDIsICAgNzU3NCwgICAxMjI5LAorICAtODM0LCAgLTEwMzIsICAtNzQ1MywgICAyNjk0LCAgLTE0NDcsICAgMzYzMiwgICA0MjE1LCAgIDM1NDEsCisgIDI5MzYsICAtMzI5NCwgICAxMDAxLCAgLTY0NTEsICAtNDU5NSwgLTExNjgyLCAgIDc4ODAsICAgMjI2MSwKKyAgMzc4NiwgIC0yODQ5LCAgIDIyNzYsICAgLTgyNiwgICAzNzQyLCAgIDc1ODYsICAgLTMzNCwgICAyODM3LAorIC0yMzMxLCAtMTI4NDksICAgMTE3MCwgIC0xMTUwLCAgLTUyNTMsICAgLTk5NywgIC04OTk2LCAgIDgxMjQsCisgIDIyMzQsICAgIDkwNCwgIC0yMjk0LCAgIDMxNDQsICAgNzM1MiwgIC01NDUyLCAgIDE1MzYsICAtODgwMCwKKyAgMTg4NiwgLTE4MjgyLCAgLTk3ODcsICAtODA2NiwgLTEyMDY2LCAgIDE1MzYsICAgNDQ2MCwgIC0xMzQ1LAorICAxNDE4LCAgIDc0NzEsICAxMzQ1MSwgIC03Mjk5LCAgIDU1MDcsICAgNjc5NSwgICAtMTg0LCAgIDg5MDUsCisgLTIwNDAsICAtNDkzMywgICA0OTk4LCAgIDczMTcsICAtNjY2NywgIC01MTM0LCAgIDkwOTQsICAtODU2MSwKKyAtMjUzNCwgICAzNDIyLCAgIDIyNzgsICAgMzExOCwgICAgMjA1LCAgIDU4MTEsICAgMjI0NywgICA1OTQ2LAorICAxMDc4LCAgLTIxMDUsICAtNjk0NiwgICAgMTcwLCAgLTE2MjUsICAtNDczNCwgIC0xNDQ3LCAgLTQzMjksCisgLTQ1NTMsICAtMjIzMCwgIC04NzM4LCAtMTUyODksICAgNzMxMSwgICA2NjY1LCAgIDUwNDcsICAgMTk4NCwKKyAxMTg5NiwgIDEzOTIyLCAtMTA0OTAsICAtOTMxMywgICAxNDI0LCAgLTI5OTEsICAgMTQwOCwgICAgMzM1LAorICA4OTE0LCAgIDM3NzMsICAgODgxNCwgICA3OTE3LCAgLTQ1NjAsICAgLTExNCwgICAtNjI0LCAgIDg5ODQsCisgLTE1OTgsICAgLTU4MCwgICAzMjMzLCAgICA1OTAsICAtMjE3MiwgIC0zMTYyLCAgLTM5ODUsICAgNTM5NCwKKyAxMzg0MiwgLTExNjI1LCAgICAgNzMsICAxMjgyNiwgIC0xMjA0LCAgIDUxMTksICAxMDMwNCwgLTEwMDA2LAorIC0yNjk1LCAgIDEzMTgsICAgIDE1NiwgICAgIDg0LCAgIC03NjAsICAtNDYzOCwgIC0zODA0LCAgIDMwNDEsCisgIC03ODIsICAtMjk5NCwgIC0zMTEzLCAgICA2MzcsICAtMzI1NiwgIC01ODMxLCAgICA0NTIsICAtMTIwNCwKKyAgMTYxNCwgLTExNjI2LCAgLTQ3NjksICAxMDYxMiwgIC04NzEwLCAtMjAwMTksICAxMDU0MiwgIC00Mjc5LAorICA2OTEyLCAgLTE0MjksICAgMzgxMiwgICAyODQ0LCAgIDM5MDMsIC0xMTYyMiwgIC04OTU0LCAgICAxODAsCisgIDM4OTgsICAgMzg1OCwgICAgMTE5LCAgIDEzODUsICAgNDAzOCwgIC01ODk5LCAgIC05NjksICAtNTQ1NCwKKyAxMzMwNSwgIC02NzQ4LCAgIDU5MzQsICAgODAyNywgIC03MzQ4LCAgLTM3OTcsIC0yOTc4MSwgIC00OTU2LAorICAyMDM3LCAgLTIzMzEsICAtMzI5MiwgICA4MjU0LCAgIDY1OTcsICAgNDQ0NiwgIC03ODQ4LCAgIDYyNTAsCisgIDE0MDAsICAtMTE4MiwgIC00OTY2LCAgLTM0OTAsICAtMTQxMCwgIC0yMjg2LCAgIDMzMzQsICAgIDM1MCwKKyAgOTI3MSwgICAyOTg3LCAgIC05MzQsICAtNTcwMiwgIC0zODgxLCAgICAtOTcsICAgLTY3MSwgICA1MTA4LAorICAtMTMzLCAgIDEzMDIsICAxMTYzMCwgIC04ODU4LCAgLTMwMjcsICAgIC00MiwgICAzNjgyLCAgLTE1MDcsCisgIDM5OTIsICAgNTY0MSwgICAyNzc4LCAgLTg2OTgsICAtMjUwOSwgIC0xMzYwLCAgICAgNzcsICAgMjExNiwKKyAgICA5OCwgICAyODUzLCAgLTYzMzQsICAgNTkxNSwgIC0xMjE0LCAgLTI3MjEsICAgODkyMSwgICAxMzgwLAorIC00MTU4LCAgLTQzMTUsICAtNDc0MCwgLTIxMDQ5LCAgIDcwNDQsICAgIDg2NiwgICAyMDk0LCAgLTk0NDIsCisgIDkwMDMsICAtNTE0NywgIC00ODk3LCAgIDM0MDcsIC0xMTU1OCwgICA0MjgwLCAgIDQ1MDgsICAgNjY5NywKKyAgMTYxMiwgICAxNTA4LCAgIDg1NDcsIC0xNDI1NywgICAtMTUxLCAgLTk1MzAsICAtNzI1MCwgIDExMzIxLAorLTE0NDMwLCAgLTQ5NDQsICAtMjQ4OCwgICAxMzQ5LCAgIC0yNDgsICAtMTQ5MCwgICAxNzQ5LCAgIDM5NzAsCisgLTU4MzAsICAyMDc2NywgICA0NjQyLCAgIDMyMzYsICAgICAzNiwgLTE3MDc5LCAtMTEwOTksICAgNTk5NiwKKy0xMDc1OSwgICAgLTM5LCAgIDc4MjIsICAtNzUyNywgIC0xNDMxLCAgICAxNzksICAtMzg0MSwgICAyMjk4LAorICAxNDA3LCAgIC0yNDEsICAtMjMwMywgICA5MjQ0LCAgLTM2MjYsICAgNjYwOSwgICAxOTU5LCAgIC01MTgsCisgICAzNjgsICAgMTY3OCwgIC01MzM0LCAgLTU4NDksICAtNDk4NiwgIC0yMzYzLCAgICA2MDcsICAgMjgwOSwKKyAtMTAwNiwgIC03Njk1LCAgMTAwMjIsICAgMjIxNiwgIC04OTkyLCAgIDQyODIsICAgIDgwNywgIDE0NzA3LAorICA5NTI4LCAtMTEwNjUsICAgMzAxNCwgICAzMTU3LCAgIDU1OTcsICAgMTEzOSwgIC0xMjk4LCAgLTM2NDIsCisgIDc4MzksICAgIDg2MCwgIC00MzM2LCAgIDI2MjQsICAtNDE3MSwgICAxNzkxLCAgLTI4MjUsICAgNTM2MiwKKyAgLTUyOSwgICAxNDk0LCAgICAzMzcsICAtNDQ4NywgICAtNjcxLCAgIDUzNjAsICAgMzI4MywgICA0OTMzLAorLTE0NjkyLCAgIDQwMzMsICAtNDM2NSwgICAyNzEzLCAgLTY5MDMsICAtMTc4NCwgLTEwODYyLCAgIDYxNzMsCisgIDUyNzgsICAxNDg1OSwgICAtODUyLCAgMTAwMjAsICAxMjMwNCwgICA4ODk4LCAgLTMwODksICAgOTE4MywKKyAgMTg0MSwgICA4Mjc2LCAgIDQ5MjksICAgLTI2MSwgIC0xMjY0LCAgICA2MTUsICAgMzYxNSwgIDE0NTM1LAorICA2NTU3LCAgICA1MTksICAgNDIyOCwgICA3MzgyLCAgLTE4MDUsICAtNDUyOSwgICA0OTkyLCAgIDQyNzcsCisgIC0zNDIsICAtOTYxMCwgIC01MTkzLCAgLTcwMjIsIC0yMzI2NCwgICAyNDAyLCAgIC03NDAsICAgMjg3NSwKKyAtNTA1MiwgICAxOTgzLCAgIDQ5ODcsICAgMzMzNiwgIC0zODA2LCAgIDEzMzUsICAtMjg2OCwgICAgODQ2LAorICA3NjUyLCAgICA5MzYsICAgMzUxMCwgIC00NTcwLCAgLTMwMTAsICAtODgwNSwgICA2MTc3LCAgLTQ0MTMsCisgIDU4NzksIC0xNTIwNCwgIC0xNjMyLCAgMTM0MTYsICAtNDU0MywgICAzODM4LCAgLTkyOTMsICAgMTc0NCwKKyAgIDkyMCwgIDE1NTQ0LCAgIDM4MjAsICAtNTg1MiwgICAzOTM1LCAgIDIzNTcsICAtNjQ4NiwgICAxOTMyLAorIDEyMDQ0LCAgLTYzNzQsICAtMjU0NSwgIC0yMzg5LCAgIDI3NTUsICAtODA3MywgIC04MjAzLCAgIDQ2NTksCisgIDQyODYsICAxNjEyOCwgICAtOTg3LCAgICA0MzQsICAtNDQ5NSwgIC00NDI4LCAgLTQ4MTYsIC0xMDMyOSwKKyAtNDUyOSwgLTEzNDA4LCAtMTMyODMsICAtMTEzNiwgICA0MDAyLCAgLTEyNzEsICAgMzU0NywgIC01Mjc0LAorIC01NTc3LCAgICA3MDEsICAgLTM2NSwgIC0yNzY0LCAgICAzNzAsICAgLTM2OSwgICAyNjExLCAgIC04MzIsCisgIDM4NjIsICAgNDYwNCwgIC03Nzg2LCAgMTExNzAsICAtMTQ1MywgIC0xNTY4LCAgMTA3NTgsICAgIDE2OCwKKyAgIDQwMiwgIC0xOTg1LCAgIDE0MzYsICAtODg1OCwgIDEwMDgwLCAgLTg1NTksICAgMzk5OCwgIC00MzEwLAorLTEzNDc4LCAgLTMxMDQsIC0xMTQ1OCwgICAgNTA2LCAtMTgxOTQsICAtMzcyNCwgIC02NzY4LCAgIDc5NjAsCisgLTQyMTMsICAgMTEyMSwgIC0xNjU4LCAgLTExNDEsICAtMTg3NCwgICAtMzgzLCAgLTUwOTAsICAgIDc0OCwKKyAtMTAzMiwgIC0xMjA3LCAgIDEwNDYsICAtMTg2NSwgIC0yMzg3LCAgIDIxMjYsICAtMzY3MiwgICA2NzMzLAorIC0yNzk0LCAgIDM3OTcsICAxNTU2MiwgLTExOTg5LCAgICAxNzAsICAgNjEyOSwgICAgNjU4LCAgICA5MjksCisgIDQ4MDAsICAtNDI5NiwgICAtOTU1LCAgLTIxODksICAgLTE4OCwgICAzMTgwLCAgIC0xMTgsICAgLTc2NiwKKyAtMjE4MiwgIC02OTI4LCAgLTIyNTQsICAgNjYxNSwgIC00NDIyLCAgIDYzMjQsICAgIC0zMSwgICAzNzQyLAorIC01ODMyLCAgLTUwMjIsICAgNDY3MSwgICAxNTc0LCAgLTYzMDksICAgIDI4OCwgIC0yNzY4LCAgLTI0OTIsCisgLTQ4MTgsICAtNTE5MiwgICAtMjQ4LCAgLTMyMzYsICAgLTQyOSwgICAgMTIwLCAgIDExODIsIC0xMDQ4NiwKKyAtMjk2NCwgIC0zNzEzLCAgLTU5NzgsICAxMTgxNywgLTIwMDUyLCAgLTY1MjUsICAgMjA1NCwgICAtODc5LAorICAtNjAyLCAgLTI4NDMsICAgNzI0NCwgIC0xMzcyLCAgICA0MTcsICAgLTE3MiwgICAzMzIyLCAgLTY1NTYsCisgLTcwMjEsICAgNTg0MiwgICA3MzU3LCAgLTI3OTksICAgMzY2MCwgICA3NTc5LCAgIDQ2ODIsICAtMjI0MiwKKyAgICA3MywgIC05MjQ3LCAgMjEwNjEsICAtMjA2MCwgIC0zNjE0LCAgIDI0ODYsICAgNDc5MywgIC0yOTU5LAorICAtNTEwLCAgICAtNzQsICAtNTk4MiwgICAyMjc0LCAgLTQxNDcsICAgMzI2MCwgICAxOTk0LCAgLTE2NzgsCisgLTc0OTQsIC0xMzYyNCwgICAyNTYwLCAgLTczNzUsICAgLTg5NiwgIC00OTQ1LCAgLTI4MzgsIC0xMTA5NiwKKyAtMTk2OSwgICA1ODc5LCAgICA0NDQsICAtMzIyMCwgIDE0NjMwLCAgIDQ5MTUsICAtMjM3NiwgIC04NDc1LAorICA5ODU0LCAgMTEzODAsICAxMTA2MCwgICAxNTM0LCAtMTQ0MTMsICAgNDM2NiwgIC05NTQ0LCAtMTA2NDYsCisgLTc2NTQsIC0xNzkxNiwgICAzNDgxLCAgLTMyNDAsICAgMTc3NiwgIC0yNDM2LCAgLTg0MDMsICAgMzY3OSwKKyAtMTkxNCwgIDEyNTM3LCAgLTU1NDAsICAtNTI5NCwgICA1OTk1LCAgIDU5NjgsICAtMjYwOSwgLTE2ODgyLAorICAgNzg5LCAgLTk1MDYsIC0xMDA3NSwgLTEyMTQyLCAgLTc1ODAsICAtNzA5MCwgIC0yMDQ2LCAgMTEwNjUsCisgIDc2MTcsICAtMzUwMywgIC0yMDEzLCAgIDM1MTYsICAgNjM0NywgICAtMTk1LCAgLTMxMTksICAgMjQ0NCwKKyAgICAxNCwgIC00OTk4LCAgICA3NjcsICAgNDk3NiwgIC0zOTc0LCAgIDkwMzgsICAgIDU3OSwgICAxODA0LAorIC04MjA2LCAgMzI3NjcsICAtNTYzMywgICAxMDE4LCAgMTMzODgsICAgIDk5NiwgLTEyNzM3LCAgLTMxNzksCisgLTIwNTgsICAxMzY2MywgICAxMjc0LCAgLTQ0NzUsICAgNzM4NiwgIC0xNjk4LCAgMTc5MjcsICAtNjExOCwKKyAxNTk0MiwgIC0yOTIyLCAgLTM0MzQsICAgNTkwMywgICA2MzMzLCAgLTkxNDksICAxNDE0MCwgIC0xNDg4LAorICAyOTk5LCAgIDExNTEsICAgMjM2MSwgIC0xOTM1LCAtMTAyNDMsIC0xMTU2NiwgIC01MzE5LCAgICA5NjUsCisgIDUxNDYsICAgMzY1MiwgICAtNDQxLCAgLTIxNzMsICAtMzQ4NCwgICAzNjg1LCAtMTM1OTUsICAtMTcwMywKKyAgIC03OCwgIC0xNDA4LCAgMTg1MTcsICAtMzc4OCwgIC0zMjY2LCAgIDMxNjIsICAgIDk5NiwgIDE5OTUwLAorIC04NTYwLCAgIDQ5ODksICAgNjU5MywgIC01MzI5LCAgIDI5NTAsIC0xMzg5NiwgIC0zNTI0LCAgIDU1OTAsCisgIDQwNTUsICAgNjA4NCwgICAyNDkzLCAgMTI2NTksICAtNTc4NiwgICA0ODU4LCAgIDcyNTIsICAtNzExMSwKKyAtNzMxOCwgICA1NDExLCAgIDczOTMsICAtODcxNCwgIC0zNDU0LCAgLTE1NjIsICAgMTkxOSwgICAgLTQ5LAorICAtNjgwLCAgIDcyODUsICAgLTM5OCwgIC0yOTU2LCAgIDcxMDAsICAgNTU2MywgICAtNTM4LCAgIDE3MTksCisgICAtMTYsICAtMzgyNCwgICAgNDM3LCAgLTY4NDIsICAgMTUwNCwgICA1Njk0LCAgIDEyMTQsICAgMzIwOSwKKy0xNTU2MiwgIC00MzY1LCAgIDkzMjksIC0yNTU3NywgICAxNDI1LCAgLTI1OTgsICAtODM4OSwgIC02ODkxLAorIC0zMjc1LCAgIDMzMDQsICAtMzk5MywgIC02MzkxLCAgIC05MzQsICAgNzg2MiwgICA0ODQ0LCAgIC0xMzQsCisgIDk4OTAsICAtNDY0NiwgICAyNDY4LCAgLTk5MDEsICAtNDExMSwgIC0zMDgwLCAgLTUwNTYsICAgIDQ3NiwKKy0xMzA5OSwgICAxNDQ3LCAgICAyMDUsICAtMjQyNCwgICA3MDk4LCAtMTIwNzUsICAtNDY0NiwgLTEzNzI1LAorICA4MzY3LCAgLTI5MTAsICAtODQ2MSwgICAxMzg3LCAgIDM1NTMsIC0xMDIyOCwgIC0yNzcxLCAgIDQ2OTgsCisgLTY0ODMsICAxMjIzNCwgIC04MDg2LCAgIDMzMjksICAgMjM3NCwgICAgNDUyLCAgLTE4MDUsICAgNTA4MywKKyAgMjAxNCwgICAgMTY0LCAgIDcxNDMsICAgICA4MSwgICA2MDYyLCAgIDI4MzgsICAgNTMxOCwgIC00OTgyLAorICAxNDQwLCAgIDIwMTQsICAtMzI3MywgIC02NjU4LCAgIC03OTgsICAtMzIwNCwgICAxMzk4LCAgIC01OTksCisgLTU4MzQsICAgMjA3MCwgICA0NjQ0LCAtMTcyMzgsICAgIDM5MCwgIC0xNjg0LCAgLTQ5MzIsICAgODk2MSwKKy0xMjIxNywgIC0zMDc5LCAgIDY1NzQsICAgMTM4NywgIC01OTkxLCAgLTc4MDMsICAgMTI4NSwgICA3NDM5LAorICAtMzk1LCAgLTMwNDgsICAgMjAzOCwgICAtODQ3LCAgIC02OTAsICAtNTEyNywgICAyMjI4LCAgLTQxODAsCisgLTM0OTksICAgIDUzMCwgICAtNTg0LCAgIDk4ODQsICAgLTMyMywgICAgNDQ2LCAtMTU2NDQsICAtOTE2MiwKKyAtMTY4MywgICAzNjQzLCAgLTM1NzgsICAgMjYzNCwgICAgNDk2LCAgIDgwOTcsICAgIDEwOSwgICAxMDU2LAorICAxNDIyLCAgIDU0NTIsICAgNjUxNywgICAtNDQ5LCAgLTIzODksICAgIDMwMiwgICA2ODI3LCAgIDE1MDcsCisgLTMxMDYsICAtNzE4OCwgIC00OTA5LCAgIC00NDEsICAxMjk1NSwgIC0zOTMzLCAgLTUzMjIsICAgNTE1NSwKKy0yMzE3MSwgIC0yNzgwLCAgLTI2NTUsICAtNDA0OCwgIDEyODQ0LCAgLTM3MDksICAgNjU1NSwgIC01NzAwLAorICAzNzgwLCAgLTY1NjYsICAtNDQxNSwgIDExMDkxLCAgMTEyOTEsICAgNjQ0MywgICA5MTQ2LCAgIC03OTYsCisgLTE0MjAsICAgNTYwMCwgIDEyMDk4LCAgLTU3OTAsICAgNjYxOSwgLTEwNDc0LCAtMTIxNzcsICAtNTg5MCwKKyAyMTcwMCwgIDExMTQ4LCAgIDM0MjcsICAgMzEzMCwgIC01NzI3LCAgMTQ2NDYsICAxMzk1MywgIC0yNzIxLAorICAxNDA0LCAgLTMxMDIsICAtNDY5MywgICA0NzYyLCAgIDE3NTcsICAgMjUzMywgICAzOTk4LCAgIC01MzAsCisgIC03NTgsICAgNTMwMSwgIC0xNDI2LCAgIDg5NDgsICAgLTcyMCwgICA2ODc3LCAgLTM4NjMsICAgMjM5NiwKKyAgNTI2NiwgICAtNjg1LCAgICA4OTAsICAtNzE4OCwgICAyNzQyLCAgIC0yNzAsICAgODEyNSwgICAtODA0LAorIDMyMjkyLCAgIDY5NjQsICAgODU5OSwgIC0zNDY2LCAgLTEwODAsICAtODQyMywgICAyMDcwLCAgIC0yOTUsCisgIC0xNTcsICAtNTQzMiwgICAgMTUyLCAgIDI0NzgsICAtMzczOCwgICAxMTA0LCAgIDE1MDAsICAtNTI5MCwKKyAtMjQ2MywgIC02Mzg2LCAgLTI1MzcsICAtMjMzMSwgIC0zMjkwLCAgLTIzOTgsICAgIDE1OSwgICA2NTg4LAorIC0yNTQ3LCAgLTI0MjQsICAtMjE4NCwgICA4MzE2LCAgIDU2NzAsICAtNTYwOCwgIC0yNjAwLCAgIDI2NTksCisgICAxNjYsICAxNDgyOCwgICAyNjIyLCAtMTA0OTAsIC0xNjM3OCwgICAgIDY0LCAgICA0MzQsICAgNDU3NiwKKyAtMzAxMCwgICAyNDc5LCAgLTY3OTgsICAgMzQzMSwgICAgMzYwLCAgLTEwNjcsICAgMzQyMSwgICAgNjY0LAorICA0MDI5LCAgLTQwNTAsICAgLTI0MCwgICAzODc1LCAgICA2NzIsICAgMzU4NywgICAgNTAxLCAgIDI0OTQsCisgICAtNDgsICAgOTk5NywgICAzMjU5LCAgIDg1NTEsICAtNzYyNCwgIDE3MzQyLCAgMTA3NjUsICAgNDMyOCwKKyAtMzcyMSwgICAxNzI5LCAgLTI4NDQsICAtNjMzMCwgICA1MTE0LCAgMTU1ODksICAgLTI2MSwgIC03NTU0LAorICAyNzA4LCAgIDcyNjAsICAgNTg1MiwgIC04NzM2LCAgICA0MzYsICAtNjE2MCwgICAtNTg4LCAgLTU5MTksCisgIDU3NTIsICAgMzEyNywgIC00NTU4LCAgICA1NDAsICAgICA3NCwgIC00MDQ4LCAgIDM3MzUsICAgNzg3MywKKyAtMjg2OSwgICAtNTQ0LCAgIC0xMTEsICAgNTE4MiwgICAxMDMyLCAgIDIzMTUsICAgLTE1OSwgICA1MTA1LAorICA0MTA2LCAgIC00OTQsICAgIDY3OCwgIC00NzU2LCAgLTM4NjUsICAtNzM4OSwgIC0yNDkyLCAgIDcxOTMsCisgIDUxNDYsICAtNzkyNiwgIDEyMDQzLCAgMTExMzcsICAgMTcxOSwgICAyMzA3LCAgLTU0NzYsICAxMjY3OSwKKyAgNzk5NiwgICAgNzI2LCAgICA5MzMsICAgMzIyMiwgICA3NTE1LCAgICA2NzgsICAtNTg1OCwgIC0yNzE2LAorICAxNTAzLCAgLTMwMTQsICAtMjEyNSwgICA0OTgyLCAgLTQ5ODQsICAgIDQ2NywgICAgOTg2LCAgIDU0NTAsCisgLTE0NzIsICAgNTMxNCwgIC0xMjg1LCAgICAyMTgsICAtMzQxMSwgICA0NTExLCAgIDgwNDcsICAgNDI2OCwKKyAtODMwNywgLTEwNTg3LCAgMTcyMDAsICAgMzMwMywgICA3NTUzLCAgIDUzNjEsICAgMTEwOCwgIC03OTgyLAorICA4MjQwLCAgLTU4NTYsICAtMzM3NiwgIC0zOTUyLCAgLTI4ODQsICAgNDQwMSwgIC03MjUyLCAgIDQwNzgsCisgIDc1MzgsICAgMzQyMCwgLTEzODM0LCAgLTExMzksICAxMDc0MiwgIC0yNTM2LCAgICA2MzYsICAgNzc1OCwKKyAgNDI4MiwgIC0zNTA1LCAgIDExOTAsICAtNzM4MiwgIC04MTY0LCAgIDUzMDYsICAgLTQwOCwgIC01MDA1LAorICAyNzc2LCAgIDc4MDYsICAgNDc4MSwgIC03OTAzLCAgLTIzNzAsICAxMzg4NCwgICAgNTQyLCAgIDU2NDMsCisgIDY5NDgsICAgNjQ3MSwgICAyNjk5LCAgICA4MTUsICAgNDQ1NCwgICAxODgyLCAgIDIyOTAsICAtMzg1NiwKKyAtMzA4NiwgICA4MjE1LCAgIDMyMzQsICAgNDQ0NCwgIC0xNTgwLCAgIDI4MzUsICAtMzA4MywgICA2NzA2LAorICA3NDA5LCAgIDQ2MjYsICAgMjY1OCwgICAyMzA4LCAgIDc5NjUsICAtMTAzNCwgIC0yNTg0LCAgICAzNDQsCisgICA3MDQsICAxMjI4MCwgIDEwMzQ0LCAgLTgwMzIsICAtNDQxMCwgIC02MTY4LCAgIDY4NjAsICAgNzk3NywKKyAtNTYzMCwgIC02NjgwLCAgLTUwMDEsICAtNjE5OSwgLTEwMzc4LCAgLTE3NjQsICAtMzMyMiwgIC00Mjg0LAorIC0xMDQ4LCAgIDI3MjEsIC0xMTczOCwgLTExODAwLCAgLTc5NzUsICAgMjc1NCwgICAzNDI0LCAgLTc2NDEsCisgLTIyNDUsICAtNDk0NSwgICAtMTk0LCAgLTE5NDgsICAtMjg1MCwgICA0MTExLCAtMjE4NDYsICAtODc1MCwKKyAgNDMwNiwgIDI0NDk0LCAgMTA0MjgsICAyNjk5OCwgICA0OTc2LCAgLTI3MDEsICAtMzI4MywgICAtNzIzLAorIC0xNTM5LCAgIDY3NTgsICAtOTczMCwgIC0zNTE3LCAgIDY0MDEsICAtNDU0NiwgICAtNDEwLCAgLTk5MDAsCisgLTQ5NDcsICAgNjk5NiwgIDEwOTgzLCAgIDUxMTAsICAxOTk0OCwgICAgLTc4LCAgLTE3OTQsICAxMTA1MSwKKyAgIC0xNCwgICAgMzE2LCAgIDY0NDcsIC0yMDQzMCwgICA5MzYzLCAgIDkwNjIsICAtMjEzNCwgIDEzNzExLAorICA2NDQ4LCAgIDY2NTUsICAtNTIzMiwgICA0NjEwLCAtMTAzNTIsICAtMzA0MiwgIC04NzEzLCAgIDU3NzcsCisgLTI0MzgsICAtMjYwMiwgIC03MjkzLCAgIC03NTUsICAgNjczNiwgICAyOTYwLCAgLTM2NzYsICAtMjg4MiwKKyAtOTgwNiwgICAxMzQyLCAgIDEyNDIsICAgMjEyMiwgICAyNzQ5LCAgICA2MzEsICAgNjUwMiwgICAyMjY2LAorLTEyOTk2LCAgMTM2MjAsICAxOTc2MiwgICA4MDk2LCAgICA3MDIsICAtNDM5NCwgIC04NjY4LCAgLTE0NjAsCisgLTMyMjgsICAgLTE3MywgIC02MjM5LCAgIDQ2NDMsICAtMTkxNiwgICA0MDk4LCAgLTIyMzQsICAgMTIwMiwKKyAgMTc2MywgICA2MTcwLCAgLTYzMjAsICAxMjk4NCwgIC01OTM2LCAgIDgzMDEsICAgNjAyMSwgICAyMTkxLAorICAgNDY2LCAgLTQwNDQsICAtMTkxMywgIC0zNDU4LCAgIDgxOTcsICAtMzI0OSwgIC01OTM1LCAgIDIzODMsCisgLTQyNDEsICAgNDk3NywgIC00NDE1LCAgICA3MDQsICAgMzQ4OCwgIC04MzU2LCAgMTAyMjksICAgIDU2MiwKKyAgICAxNCwgIC00ODI4LCAgLTM4OTAsICAtNzU5OSwgIC00MjA4LCAgLTMxNjYsICAgMTEzMiwgLTE2NTg0LAorICAtNTA2LCAgIDEzOTcsICAgNjI2NiwgICAzMzA3LCAgIDU3ODIsICAgMjM0OSwgICAzMjU3LCAgLTMwMTcsCisgIDc4MTQsICAgMTIxNiwgICA3NDQwLCAtMTAwOTYsICAxMjY5OCwgICAgOTQ0LCAgIDEyMjEsICAtMTY4MywKKyAgIDE1MiwgICA2MDIwLCAgLTc5MTAsICAgMzg5NywgIC02OTU0LCAgLTk0MzksICAtOTgzOCwgIC0zODYwLAorIC01MzgzLCAgLTQyMjgsICAtMTk4MCwgIC00MDQ1LCAgIDc0NDIsICAtNTUwNCwgICAyMTQ1LCAgICA2MzYsCisgIDI4NTcsICAtNDUzOCwgICAtODIwLCAgIDQyNzUsICAtMjEwNCwgICA1MDc2LCAgIDUxOTEsICAgLTM2MywKKy0yMzI1NCwgICAxOTYyLCAgICAtNjYsICAgNzU1MCwgICAgIDg4LCAgIDg3MjEsICAtMTM2MSwgICA3NzMzLAorIC0yNjYxLCAgIDUyODIsICAtNTExMiwgICAgLTI0LCAgIC05NzUsICAtMzIwMCwgIC0yMjM1LCAgIDUxNDQsCisgICAyMTMsICAtNjM0MCwgIC0zOTc0LCAgIDEyNjYsICAtMjM4MywgICAyNDMyLCAgIC0xMjQsICAgLTIzMywKKyAtMzUwNCwgIDEwNjA0LCAgICA4MDYsICAgLTkxOCwgIDExNjAxLCAgMTkzMzIsICAgIDIwNiwgICA3NDU2LAorIC04ODg1LCAgLTk2OTIsICAgMzA4NywgICAzNjg1LCAgLTIxODMsICAtNzUzOCwgIDExOTcwLCAgLTUwOTgsCisgLTczNjQsICAtMTE3MywgIC0zMDk5LCAgIDY1MzIsICAtNjg1MCwgICA0NjIyLCAgIC04MjgsICAgIDM5MCwKKyAgIDQ2NywgIC01MzY0LCAgIDQ0NDIsICAtMTg3OCwgICA4OTQ5LCAgLTQzNDAsICAgLTI2MSwgIC0yNzIwLAorICA2NjU5LCAgMTYxODQsICAtNjU1MiwgIC0zNzM2LCAtMTU0MTYsICAxNTc3NCwgICAtMzA2LCAgLTQyNDAsCisgLTE4MDcsIC0xMDMwNCwgIDExMDczLCAgIDI3NDMsICAgMzk3NCwgIC01NTU3LCAgLTM0OTksICAgNTMxNSwKKy0xMDc0MiwgICAtMzc4LCAgLTQ1MTcsICAtNTk0OSwgIC03NjY0LCAgLTI4MzAsICAtNjUxMCwgIC02MDk2LAorICAyMDUyLCAgIDM0MjUsICAgMTk3MSwgIC0zMzI4LCAgIDUzMjYsICAtMTM2MiwgICAxODA2LCAtMTQyODYsCistMTI3NzQsICAgNjA1OCwgIC0zMzY1LCAgIC03MzUsICAtMjU4NiwgLTE4NjU4LCAgIDY2NjQsICAgOTUwMiwKKyAtMTU5MCwgICAgMzIzLCAgIDY0NDUsIC0xNzc2NiwgIDE0Njk0LCAgLTk3ODYsICAgMzY5NiwgIC00NTQ3LAorICAxNjAxLCAgIDM2NDUsICAgLTU4NCwgICAgOTEwLCAgIDI1MTYsICAgODE5NywgICAzODk4LCAgIDQzMDYsCisgICA2MzEsICAtMjAyMCwgICA0MzA5LCAgIC03NjUsICAtNjU5MSwgICAyMDgzLCAgIDg5NjksICAtMTQ3NCwKKyAgIC0yNywgICA5MTMwLCAgLTU4MDgsICAgODQ5MiwgICAtMTM1LCAgIDIyMzAsICAgMjI5NiwgIC00NTA5LAorICA0NjAwLCAgIDQ5NTEsICAgMTkzMCwgIC0yNTY0LCAgLTU4ODksICAtMTMzOCwgLTExNzM3LCAgIDYzODcsCisgLTM2NDksICAtNTQ0NywgIC0yNDYyLCAgLTQ3NTEsICAtMTAxMiwgICAzNTIzLCAgLTM1MDQsICAtOTUxMAorfSwKKworLmNiMTEwOG0wID0geworIC0yNDE3LCAgIDQ2MjMsICAgMjkxNiwgIC00MjU3LCAgICAxMjAsIC0xMDMyMywgICAxMTk4LCAtMTAyNTIsCisgIC0xMTcsICAgODc2NywgICAzMTYwLCAgIDIzMjMsICAgMTE2MiwgICAtNjUwLCAgIDIyMzcsICAtNDE3MSwKKyAgMjM4NiwgICAgNDMyLCAgIDE2MjcsICAtNzI1NSwgICAgIDM4LCAgICAxMjQsICAtMzY1OCwgIC0xNTU4LAorLTExNzExLCAgICAgMTAsICAgODE0NiwgICAxNzAwLCAgLTE5NzUsIC0xNjczMSwgICAyMzk3LCAgIDEwNTYsCisgLTI1MDIsICAtMjY2MCwgIC0yNzMxLCAgLTI0NzcsICAgMTQ4OCwgICAxMjIwLCAgIDQ4ODAsICAtMTE1NiwKKyAgMTgwNSwgICAgIC0zLCAgLTMwMDksICAtNjIzMywgIC0yMjE2LCAgIDM0NDAsICAtMzA4MiwgICAyMTI0LAorICAgIDcwLCAgLTI0NjEsICAgMTEyNSwgICAxOTE5LCAgMTE5NDksICAtMjUwNiwgICAtNjIyLCAgIDIyMDksCisgIC03MDIsICAgMjY4NSwgICA5MTgzLCAgIC01MTAsICAtMjgwNiwgIC0xMTI5LCAgLTE4MjMsICAtMTc0NiwKKyAtMzYwMCwgICAyMjk4LCAgLTMzNjAsICAxMDc5MywgIC0xNzE0LCAgIDE2NjIsICAgIC02MiwgICAgMzk1LAorIDE0MTQyLCAgIC0yNjEsICAgLTE0NCwgIC05ODk2LCAgMTE0ODEsICAgLTg4NCwgIC0yMTk3LCAgICAzNTIsCisgIC0zMjYsICAgLTQ1MywgIC0xOTg0LCAgIDIwMjcsICAtMTQ2NiwgICAzMjkwLCAgICAgOTQsICAgMzQ4MSwKKyAgMjUzMywgICA0NDAxLCAgIDU0OTIsICAgMzgwMywgICAgMjQ3LCAgIC04OTYsICAtMTY4OCwgIC0zMTY2LAorICAxMTMwLCAgLTExMjUsICAtMTk3MywgICAgMzIyLCAgICA4NjcsICAtMTkzNiwgICAgNzE0LCAgIC04ODAsCisgICAgIDgsICAgMjMxMywgIDIzNDE4LCAgLTE2ODIsICAgLTY3NywgICAgMzg0LCAgLTIxNDAsICAgLTM4NiwKKyAgIDkyMCwgIC0yNTIzLCAgIC00OTUsICAtMTQ5NCwgICAzMDI3LCAgIC03MDcsICAgMTE3MiwgIC0xNDAzLAorICAyMTc3LCAgLTIxMzcsICAgLTg4NSwgIC0xMDM1LCAgLTE2MzcsICAgIDM3NSwgICAyNDUyLCAgLTM3MDksCisgLTExNzEsICAgMjA2OSwgICAxMDk1LCAgLTE5MzcsICAgLTY4NiwgICAtOTU2LCAgIDIwMzQsICAgMzQxMCwKKyAtMzA3NSwgICAtMzU5LCAgIC01OTgsICAtMjA4NCwgIDE4NTUwLCAgIDE3ODEsICAgIC00NSwgICAxNDAwLAorIC0xNTgwLCAtMTMxODAsICAgLTYwOSwgIC0xMzc2LCAgLTMxNDUsICAgLTI0OCwgICA1NjYxLCAgIDY4ODYsCisgLTM5MTUsICAgLTE5NCwgICA5ODc2LCAgIDEwNjUsICAgMzg3OSwgIC0xNzI2LCAgIC04MzcsICAgLTY2MCwKKyAtNzQ2NywgIC0zMDU1LCAgIDM1MTYsICAgIDI4MywgIC0xNjA0LCAgIC02MjUsICAgMTE2NSwgICAzMDIzLAorIC0xNTMxLCAgLTE4MjUsICAgMTQzMCwgICAtNTYxLCAgIC04ODEsICAgMTM0NiwgICAtMTI5LCAgLTE4MTcsCisgICA4NTEsIC0zMjc2OCwgICAtMjk0LCAgIC0xODgsICAgLTExNiwgICAtNjQ2LCAgIDExNzYsICAgIDYzMCwKKyAgIDkwMywgICAgNDE3LCAgLTI0ODcsICAgIDM1MiwgICAtNzg5LCAgICA1NzEsICAgLTEyNywgIC0yMDU0LAorIC0yMTEyLCAgICA0MTgsICAgMTYzMSwgICAgMjY2LCAgIC0yNzAsICAgIDM2MiwgIC0yNzY1LCAgLTExOTgsCisgIC0xODIsICAgMzU4NiwgIC0xMjcyLCAgIDE0NzAsICAgIC02NiwgLTE4Mzg0LCAgLTEyMzAsICAgIDgyMywKKyAgMTE3MSwgICAxMzUwLCAgIDExMDEsICAgMTQxMCwgIC0zNzMwLCAgIDE1MzUsICAgLTEwMSwgIC0zMjM0LAorICAyMzE1LCAgICAtMzQsICAgLTQ1OCwgICAxMzYxLCAtMTY0OTcsICAgLTk5MCwgICAxNDM4LCAgIDI1NDIsCisgLTExOTMsICAgIDU4NiwgIC0xNzA4LCAgIDI2ODksICAgMjc0MSwgICA2MDEwLCAgIDQyMDksICAtNTk3NCwKKyAgLTYyOCwgICAxNTU2LCAgIDIyMzgsICAgNjEzNCwgIC0zMDQwLCAgLTI5MzcsICAgMjE4OCwgIC0xNjYwLAorICAxMTM3LCAgIDEzMTYsICAtMjY1MCwgICAgOTA1LCAgIC01MDIsICAgIC05MywgIC0xMTc3LCAtMzE5NjQsCisgLTExNzAsICAgMTUwNCwgIC0xMjg0LCAgIC0xMDQsICAgIDE2OCwgICAgIDU1LCAgIDM0NzgsICAgLTE2MSwKKyAgMjgxOCwgICAtNDg0LCAgICAtMzIsICAtMTUzNiwgICAxMjE4LCAgIC04NTQsICAgLTM1MSwgICA0NDY1LAorIDE2OTIyLCAgICA2ODEsICAgNDE5OCwgICAgNDE5LCAgIC00MTQsICAgNjgyNCwgIC0zOTA2LCAgMTE1OTgsCisgICAgNzUsICAgNDkwNCwgICAxMzc0LCAgICAgNjQsICAtMjY5MiwgIC0zNzU5LCAgIDMwNjUsICAtMTM5NywKKyAgLTIwMiwgICAtMzQ3LCAgLTI0NjYsICAgICA5NiwgICAxMDM1LCAgIC03NjUsICAgLTI1OCwgICAzNzExLAorICAxNDM3LCAtMTgyNTAsICAgIDU2NiwgICAgOTc2LCAgIDI0ODMsICAgICAgNCwgIC0xMDk2LCAgIDE5MDYsCisgIDM3NDUsICAtMjYyMSwgIC0yNzU2LCAgIDE4NjQsICAgLTU2MCwgICAgIDk4LCAgICA4MjEsICAtNDA5NCwKKyAgNTM0OSwgICAxMzY5LCAgLTUyNDUsICAtMjE3MCwgICAyOTMyLCAgLTEwNTIsICAgMzkzMiwgICAtNDEzLAorICAtNDAwLCAgMzEyMDYsICAgMTEyNSwgICAxNjMxLCAgICAgNDMsICAgLTc2NCwgICAxNjY2LCAgICA3ODAsCisgIDIwMzYsICAgLTU2NCwgICAgIDY0LCAgIDEzMTEsICAgLTIwMiwgICAgODQzLCAgLTIwMzAsICAgIDg1NiwKKyAgMTc2NiwgIC0zMTYzLCAgLTExNTgsICAgLTYyNiwgICAgMzE2LCAgICAxMjcsICAgMTc4MywgICAxOTE4LAorICAzMzg0LCAgLTI4ODcsICAtNTg4NSwgICAxNzYzLCAgIDQ5MTAsICAgLTI0OCwgIDE3MTAwLCAgLTMwMjIsCisgLTE4ODAsICAtMjkyNywgIC0xMjg3LCAgLTMzMDgsICAtMTc2NywgIC0yNjIyLCAgLTE0NjAsICAgLTI1MCwKKyAgMzU5NywgIC00NTI2LCAgICA5NDYsICAtMTUzMywgICAxMDU5LCAgICAgLTgsICAgLTgwNywgIC0xMjgzLAorICAxNDM2LCAtMTExODQsICAgIDY0MywgICAgMzk4LCAgLTE1NjUsICAgMTk4MywgICAgLTYwLCAgLTk4NjIsCisgIDEyMTksICAgIDMyMiwgICAzMTMyLCAgLTIwNDMsICAgMTEzOCwgICA2MjU4LCAgLTM1NDAsICAgIDc5MCwKKyAgLTkyMywgIC00NjkyLCAgLTE0MDEsICAgMjczMywgIC04OTE4LCAgIDQ5MDUsICAgNjE4MSwgICAgMTkyLAorICAgIDgyLCAgLTEwOTQsICAgICAgNCwgICAtNjM0LCAgLTEzMjMsICAtMjg2NSwgICAxMDM2LCAgIDE0ODQsCisgLTI0NjEsICAgLTkzNywgICAgNDE0LCAgICAyMjEsICAgMjE3OSwgICAtNDM4LCAgIDEyNzMsICAtMjY5MCwKKyAxODQ0MiwgICAyNzgxLCAgIDE3ODgsICAgMjI2NCwgIC0xMjMwLCAgIDQyODQsICAtNDcwOCwgICAxMTkwLAorIC00ODEwLCAgIC05NzUsICAgIDIzMCwgIC0zNzI4LCAgIDI1MDQsICAgMzYwMiwgICAzNDg4LCAgICAgODgsCisgIDEzMjIsICAgIDQ4NywgICAyOTY1LCAgLTM3MzEsICAtMjM0MSwgICA1OTM3LCAgIDg1NDUsICAgMTcxNiwKKyAgNzMwOCwgICA5MDE3LCAgIDY0MjYsICAgIDcyNywgICAzOTkyLCAgLTQ1ODQsICAgIDM4OCwgICAzNzE0LAorICAxMTY0LCAgICAgMTgsICAgIDQ0NSwgICAxMjUzLCAgICAzOTgsICAtMTk4OSwgICAtODI0LCAgIC00MzAsCisgICA3NDUsICAtNTQ0NywgICAyMTc2LCAgLTE5ODYsICAtMzk2MywgICAyODYxLCAgICAxOTQsICAxNzczOSwKKyAgMTg5MSwgIC01MzY4LCAgIDQxNzIsICAgIDEyNSwgICAgNTMwLCAgLTI3NjYsICAgMTE3OSwgICAgNDAxLAorICAxNzU5LCAgLTE2MDksICAzMTIzNCwgICAgOTEwLCAgIDExMDAsICAgMTAzNiwgICAtOTQ4LCAgLTExMDEsCisgIC02MTQsICAgMTc2OCwgICAtMzQ0LCAgICA4NDAsICAgLTY5NiwgICAtODQyLCAgICAzMjAsICAtMTQ0NCwKKyAtMjU2MCwgIC0zMTk5LCAgICAgNTgsICAtMjE3MiwgICAxMzc1LCAgLTMwMDIsICAgLTgyMSwgICAtODYzLAorLTEyMDk2LCAgLTI0ODQsICAgLTY3NywgIC0yMTMwLCAgIDQ0NTAsICAgMzU2OCwgIC0zMTkyLCAgLTExMTQsCisgLTMyMTgsICAgMzEyMSwgICAtNTAzLCAgIDU1NzAsICAgLTU2MSwgICAzODk2LCAgMTA1NjYsICAtMzA2NSwKKyAtMjc2OCwgICAxMzk4LCAgIDE3MTksICAtMjcwOCwgICAxOTUyLCAgIC0xNDIsICAgNDc3NywgICAtOTc4LAorICAyMjM4LCAgLTU3ODAsICAgLTQzMCwgICAxMjI4LCAgLTEyOTgsICAtMjkyMywgICA0MzUzLCAgLTE2MjEsCisgLTIzNjgsICAtMjkwOCwgIC04MDEyLCAgIDQzOTgsICAgLTUwMiwgICAgNTE4LCAgLTY5NjQsICAgIDYyMiwKKyAgLTM3NywgICAzNzU4LCAgIDY1OTgsICAgNDQzOCwgICA2ODQ5LCAgLTc2OTYsICAgIDQ3MCwgICAzNTg1LAorICAgNDY2LCAtMTQ2NjQsICAgMzQzOCwgIDE0NzA2LCAgLTE5NDQsICAtMjU0NCwgICAtNzg1LCAgIDM2NTMsCisgIDEyNzQsICAgIDQ0MywgICAtNjk0LCAgIDE5NjgsICAtMzQ5OSwgICAyODU1LCAgLTM5MzAsICAtMTIxMCwKKyAgLTUyOCwgICAxOTMxLCAgIDM4NDksICAgLTc3MiwgIC0yNjU5LCAgIDQ0OTksICAtMzYyNCwgICAtNTQwLAorIC0xNjQ1LCAgIC05NDksICAgLTM4MiwgICAgOTc5LCAgICA1OTUsICAgIDE2NSwgICAgNDI5LCAgICAtODAsCistMjA0NjgsICAgMTA0MCwgICAgNTQ0LCAgIDI1NDUsICAtNTAxMCwgIC0yMTIyLCAgLTI4NDAsICAgLTMzNSwKKyAgLTQwNSwgICAgNDA0LCAgICAtNTAsICAtMjk5NiwgICAxMjI2LCAgICA1MTksICAtMTA0NiwgICAzNzQ1LAorIC0yMzE3LCAgIDYyMTEsIC0xNDUwMCwgICA5NzU0LCAgLTU4MDIsICAgNTIzMCwgIC0zMTEyLCAgIDE1MDYsCisgIDM3NDEsICAgIDY2NCwgICAtOTAyLCAgICAxOTcsICAgMjQ3NiwgIC0zNjE4LCAgIDIwNDAsICAtMTA2NiwKKyAgMjMzOCwgICAtMjU3LCAgLTI1ODAsICAgLTI5MywgICAyNzQwLCAgIC01NzYsICAgMjA1MCwgICAtODY1LAorIC0zNjY2LCAgLTIwOTAsICAtMTgzMSwgLTMyMDU2LCAgICA2NTgsICAgMTU0OSwgICAxNjAyLCAgIDE3MjgsCisgIC01MzQsICAgIDM5MCwgIC0xNTE3LCAgIC02MjcsICAtNDAyNSwgICAtNzk3LCAgLTIzNTEsICAgMjc1OSwKKyAgLTEwMiwgICAyNTc0LCAgICAtNTYsICAgIDc5NiwgICAtMjMyLCAgIC04ODYsICAgMTYzOSwgIC0yNzczLAorICAxMDA3LCAgICA4MzAsICAgNTg4MCwgIC0yMjIwLCAgICA3NjIsICAtMzgzNCwgIC0yODY1LCAgIC00MTUsCisgICA1ODQsICAtMzQ5OCwgIC00NTQ2LCAtMTYxMDgsICAgIDM0NCwgIC00MDcyLCAgICA1NTEsICAtNTQzNSwKKyAgMjAwNywgIC0xNDE4LCAgIDM4MzgsICAtMTY2MiwgICAxOTgxLCAgIDM1NDUsICAgMTQyNCwgICAgNzY5LAorICAyMTM1LCAgIDE3MDUsIC0xNTA3NiwgICAtNjM2LCAgICAyODMsICAgMzM4NiwgICAgIDk3LCAgLTEwNDgsCisgLTM5MzMsICAgIDIwNCwgIC04NjE2LCAgIC01NTYsICAtMjkzNiwgICA0MjQxLCAgIDUxMDAsICAgMTc3NywKKyAgICA5OCwgICAgNzE5LCAgIDYyMDIsICAtMTQ5NiwgICAgNzA4LCAgIDIxNjAsICAtMjM5NiwgICA0MDYwLAorICAxNTEzLCAgIDIyNTMsICAgIC00NiwgIC0xODIzLCAgIC0xMzIsICAgIDcwOSwgICAtNzU2LCAgIC05NDQsCisgICA1NzUsICAgMTA3MCwgIC0xNTgzLCAgICA1ODcsIC0yNDU3NSwgIC0xOTg5LCAgICA4NzQsICAgLTU2OCwKKyAgMTA0MCwgICAxMTE2LCAgLTQwMDIsICAgMzE5NiwgICAyODI2LCAgICAxMTcsICAgMTU5MCwgICAyNDU2LAorICAgOTM4LCAgICAxMTIsICAgLTkzOCwgIC0xMjY4LCAgIDUwNTYsICAtMjg1MSwgICAyOTk1LCAgIDI1NTksCistMTMxMjEsICAtODM3NCwgICAzNTkzLCAgLTY2ODQsICAgMzY2MywgICAgNzY2LCAgICA3NDcsICAgMTAxNiwKKyAgLTkyMSwgICAyMjQxLCAgLTE5NDIsICAgNDI2OSwgIC0zMzEyLCAgLTEwMTIsICAgMjM0MCwgICAyNzgxLAorIC0zODgxLCAgIDI1MzIsICAtMTk3NiwgIC0xNDM2LCAgLTMyMTksICAgIDQyMCwgIDIyMDg4LCAgIC03NDIsCisgIC02NDAsICAgMzI3MCwgICAxNDQ2LCAgIDE5MzUsICAgMTI3OSwgICAxOTEzLCAgIDEzNzcsICAtMzI5NywKKyAgLTc1MSwgICA0MjA5LCAgLTEwNTIsICAgMjM4MSwgICAyOTM4LCAgLTEzMzAsICAgMjE1NCwgICAyNzg0LAorIC0yNDIwLCAgIDEyNzAsICAgMjMzNCwgICAtNTI2LCAgIDE0ODAsICAgLTQzNSwgICAyMjA2LCAgICAyNTIsCisgIC01MTAsICAtMTAxOCwgIC0xNDY5LCAgLTEyOTQsICAgLTk1MCwgICAgNDI0LCAgIDEwNTgsICAtMjMxNywKKyAgLTg0NiwgLTIwNzM3LCAgLTE4NzcsICAgICA4OCwgICAtNDMxLCAgLTEyNjgsICAgIDExNiwgICAtMzc4LAorIC0yMzI2LCAgIDMxMTUsICAgLTI0NiwgICAgIDMwLCAgLTQ3MjUsICAgIDY0OCwgICAyMDg0LCAgMTQyODYsCisgIC04MTcsICAgMjQ5NiwgIC0xOTQ3LCAgLTQ4NjksICAtOTcwMywgICAxNTA1LCAgLTI0NzYsICAtMjEwOCwKKyAgIDc0NywgICAtNDQ5LCAgIDMwMDIsICAtNTQ2NCwgICAtNTE0LCAgIDE4MDUsICAgMjU1OSwgICAyNDk0LAorIDEyNzgyLCAgLTEyMzIsICAxMjA5MSwgICAyMTE4LCAgIDM5OTYsICAgMjU5MiwgICAxMDU4LCAgICA1MTAsCisgLTEzODQsICAtMzA1MCwgICAyNTMzLCAgIC00MDgsICAgNTIxOSwgICAzMDQ0LCAgIDMyNDIsICAgLTE4NSwKKyAgMjY1NCwgIC0zNzIzLCAgICAgMTYsICAtMTcyMywgICAxODIzLCAgIDYxNDQsICAtNDgwNiwgICAgMTgyLAorICAxNzcyLCAgIDQ4NDEsICAxNjM5MCwgICAgLTk2LCAgIDI1MDUsICAtNzcxMywgIC01MjQ0LCAgLTMzMTYsCisgLTY3NzYsICAgMTQ0OCwgIC0xNDcwLCAgIDQyMzgsICAgIDI5NCwgICAgODg5LCAgLTIzNzIsICAtNjI4MSwKKyAtMjQyMywgICA1NDIzLCAgIDIxMTksICAgMjg5NywgICAxMzc4LCAgICA4MTcsICAgLTk5MywgIC0xNTk5LAorLTE0NjYyLCAgIDMwMTQsICAtMzM5NywgIC02MTgyLCAgIC0yNDUsICAgNDg5NywgICA1MTE2LCAgIDIyODUsCisgLTI4NjMsICAgMTE3NCwgICAgNDE1LCAgLTY3NzcsICAgMzg2MywgIC02MDA5LCAgLTQ3MjIsICAgLTExOSwKKyAgIDYwNiwgIC0yMjQ3LCAgIDQ0NDcsICAgMTA2NCwgIC0xOTM1LCAgIDI3MDUsICAtMjYyOSwgIC0xMTQ0LAorLTExOTgwLCAgIDM4MDUsICAgIDg4MiwgICAxNjM0LCAgIDU0NDYsICAtNDMwMCwgICAgNjQzLCAgIDM0MzYsCisgIDc2MzIsICAgIDU5MiwgICAgOTk4LCAgICA2NzQsICAtMjY0NywgICA0NjQ0LCAgLTY4NTQsICAgMTM2OCwKKyAgLTE0NiwgIC0zMzk1LCAgMTA1OTksICAgMTM2OSwgICAzODUyLCAgIDE2ODksICAgMjQzNywgIC0zOTM3LAorICAzNDA1LCAgIDI1MTcsICAgMTg5NSwgLTE0MDkyLCAgLTExNDIsICAgMjU3MCwgIDEwMTYzLCAgIDE2MDgsCisgLTI0NDUsICAgIDg1MCwgIC0xNjc4LCAgIDMxMTIsICAtMzQ2NSwgICAzMTM4LCAgIDQ0MTMsICAtMTk3MywKKyAtNDE1MSwgICAxMTYzLCAgIDE4MjIsICAtMzgxOSwgIC0xNTY4LCAgIC00MDcsICAtMjY0MiwgICAgNDI0LAorICAgMzY1LCAgLTM1OTksICAgIDE2NCwgIC0xNDQ4LCAgIDEwNjIsICAgMTUzNiwgICAxNTkwLCAgLTE5ODIsCisgICAyMDAsICAxODU3MiwgICAtMjMwLCAgIC02MzgsICAtMTI1MywgICAxNjUwLCAgIDIyODAsICAgNDk0NSwKKyAgNDUyNywgIC0yMzUzLCAgLTQyMTYsICAgMzc1MiwgIC0zODA3LCAgIDM2ODYsICAtNDgxNiwgICAyMzgyLAorLTE0ODMzLCAgIDEzMDYsICAxNzI0NiwgICAtNzM5LCAgIDIwMTIsICAgMzUyMSwgICAxNDczLCAgLTE0MzYsCisgIDE1MTQsICAgLTE0MiwgICAtNDYxLCAgIDEwMzgsICAgMjQ2MiwgICAgOTcxLCAgIDEzNTQsICAgMTI3MiwKKyAgMTc4NywgICAyNDIwLCAgIC05MjIsICAgMzM2NCwgICAyMjUwLCAgICA0OTcsICAgMTM0OSwgICAyNzk1LAorLTMyNzY4LCAgICA0MjUsICAgMTg3NCwgICAgLTcyLCAgIDI0NjEsICAgIDM4OSwgICAtMzA2LCAgLTExODAsCisgIC02NDYsICAgIDI1MSwgICAgMjk5LCAgLTI3MzUsICAgIDU3NywgICAxMDU1LCAgIDE4MjYsICAgMTYyMCwKKyAtMTIxNCwgICAxNDIyLCAgIC05MDEsICAtMTI3MywgIC0yMzY3LCAgLTEyNDEsICAgIDM2NiwgICAgNTIxLAorICAtNDMzLCAgICAgNTUsICAgNDAwMCwgICAzMDM1LCAgLTEzOTAsICAgMjUwNSwgICAxNzg2LCAtMTUzOTcsCisgICA0MTMsICAtNTkxNiwgICAtMjM0LCAgIDM1NTksICAtNjc3NiwgIC01MDY4LCAgIDIyNTEsICAgICAzNiwKKyAgLTE4MCwgICAgNTk2LCAgIDU3NDQsICAtMjQ1MCwgIC0xMjc2LCAgLTQ3ODYsICAtMTg3MiwgICAgIDI0LAorICAgMjUyLCAgICA0NjQsICAgMjgzMywgICAtMTM2LCAtMjU2MDAsICAgIC0zMywgICAgODczLCAgIDI2NDYsCisgIDE0NzEsICAtMTMzNiwgIC0xMzMwLCAgIC0yNzYsICAgMTc3OCwgICAtMjQyLCAgIC05NTEsICAgMTU4MCwKKyAgIC03OSwgICAtODU4LCAgIC05MjcsICAtNDMxMCwgICAtNjA0LCAgIDc1NjgsICAtMTcxMywgICAtOTQ4LAorICAgMTkyLCAgIC0yNjAsICAtMTMzNCwgIC0xMTE2LCAgIC03MDUsICAgIDYzOCwgICAgMTMyLCAgIDExODYsCisgIC05NTIsICAgMTE1NywgICAgNDI4LCAgIDIwMzksICAgMTU2OCwgICAxNzc4LCAgMjI0NTMsICAtMjE5MCwKKyAgMjE3NiwgICAxNjc0LCAgLTM5OTYsICAgMTI5NCwgICAxMTYyLCAgICAyNzQsICAgIDQxNSwgIC0yODc3LAorICAgNDY0LCAgICA1MDUsICAtMTg0MiwgIC0xMDY2LCAgLTIyNDEsICAgLTc2MSwgICAtMjkxLCAgICAgIDgsCisgIC05ODcsICAgLTEwNCwgICAgNzk2LCAtMzI3NjgsICAgMTMwMiwgICAtODA5LCAgICA1NzEsICAgMTIxNCwKKyAgIDQ1NSwgICAgNjg2LCAgICA2NTYsICAtMTc1MiwgICAgODg2LCAgIC03OTAsICAgIDY0NCwgIC0xMTE0LAorICAyMzU4LCAgMTE0NTIsICAtNDM5OCwgICAxMzM0LCAgMTMwOTUsICAgMzIzMCwgIC0xODE4LCAgIDQwNTMsCisgLTE5OTAsICAtMTA5MywgICAgODc4LCAgIDM3OTYsICAgMjcxMiwgIC0xNTIzLCAgLTEyMjksICAgMTA3NywKKyAgIDk2MCwgICAxMjUwLCAgICAtNzUsICAtMzIzMywgIC03NzM0LCAgIDI3ODMsICAgODQzMCwgICAtMzI3LAorIC0xNDI4LCAgLTE2ODcsICAtNDA5MiwgICAgMjY5LCAgIDMxNjEsICAgLTU2OSwgIC0xMjY3LCAgIDE3NzQsCisgIDI3NzIsICAtMjAzMywgICAgMTcxLCAgIC01MjAsICAgMTU1MSwgICAzNzE5LCAgLTMzNjQsICAgLTIyMCwKKyAgMTkwNCwgIC0xMjgyLCAgLTIwMDgsICAgLTgxOCwgICA0MjYxLCAgIC04ODYsIC0xOTIwMSwgIC0zNDU0LAorICAtNDc4LCAgLTI2NDUsICAtMjYwMSwgIC0yMTI0LCAgLTM5NzcsICAgMjk2MCwgICAxNTYzLCAgIC00MzIsCisgIC05ODksICAgMjY4MiwgICAxNzM0LCAgLTkwODUsICAgNDYxNCwgIC00NDU0LCAgIDI1MzUsICAtNzIwMSwKKyAgLTIyMCwgLTEwMDIyLCAgIC00MzEsICAtNzkwNywgICAgODg5LCAgLTk2NTgsICAgNjY1MywgICAgNzYyLAorIC0xODI3LCAgIDU4ODYsICAgIDg2MiwgIC0xODM2LCAgIC00MzAsIC0xNjM2MywgICA1NzA5LCAgICA4NTEsCisgIDE4MTQsICAgIDMwNCwgICA1MDQ1LCAgIDE2ODUsICAtMTAwNCwgICA1MTA4LCAgLTU5MzYsICAtMzE0MywKKyAgIDk0MCwgICAxODMyLCAgIC0yNzAsICAgLTY3NCwgICAxNDQxLCAgIC0yNDEsICAgMzIyMiwgICAtNTUxLAorICAtNDM0LCAgICAtNjksICAtMzU4NCwgICAgMzQ5LCAgLTEzNTQsIC0xMjA4MCwgICAzNjM5LCAgIDUyMTksCisgIDc1ODMsICAtMTAyMywgICAyMDc4LCAgIDMyNjMsICAtNTgwNywgICAtODczLCAgIDQwODUsICAtNTE1MywKKyAtMzYyMywgICAtNDM2LCAgLTQ3MTcsICAtMTgwMywgIC02Mjc0LCAgLTIwNDksICAgLTI0NywgICAyNTE2LAorICAxOTIyLCAgMTAyMDQsICAgMjE5NCwgIC0xNTc0LCAgIC01MzUsICAgIDY1NiwgICAxNjM4LCAgLTMwOTEsCisgIDExNTYsICAgMTM3NywgIC0xMjIwLCAgIDQ5NTYsICAgLTIyMSwgICA0OTg0LCAgLTExNTQsICAgNDYwMywKKyAtMTYxOCwgIC01NjU1LCAgLTI1ODMsICAxMzQ5NCwgIC0yNDQyLCAgLTM5NjgsICAgMzA4NiwgICAxMDk4LAorIC0xNjI1LCAtMTM3ODEsIC0xMjgyNiwgICAyNjU5LCAgIDM2MDQsICAgLTcwMiwgIC0xOTAwLCAgLTM1MDgsCisgLTYyODMsICAgMjMyMCwgICAxOTc5LCAgLTI4MjMsICAtNDg5MCwgIC0xNzI4LCAgICAgIDIsICAtNDQwMiwKKyAgLTQzNywgICAxOTMyLCAgLTMyNzIsICAgMjg1MywgIC0zMDE4LCAgICA4NDAsICAgLTYzMiwgIC02NjkxLAorICAtNDg0LCAgIDk1NzksICAgMTAwOCwgIDExNjc3LCAgLTI4MTQsICAtMjAyOSwgICA4MDQ4LCAgLTExNzAsCisgLTczNjYsICAtMjY2NCwgICAzMzQ5LCAgIDEzMTksICAtMTE2MCwgIC0xODY0LCAgICA2MDYsICAgMTU2OCwKKyAgNTQyOCwgIC00NzYzLCAgLTI0NzAsICAgMjE0NSwgICAxNzk4LCAgIC01MDIsICAtMTUzOCwgIC0zNzM2LAorIC0xMzc2LCAgIDEzMzAsICAtMzU2NywgICAgLTc4LCAgICA0NzgsICAgLTc0MywgICAgODkwLCAgIC04MDAsCisgICAtNDQsICAtMTgzMiwgIC0xNzYxLCAgLTEwMjIsICAgLTk5NiwgICAtODQ2LCAgIDExODgsICAtMTA0MiwKKyAtMzIwMiwgIC0yNDM5LCAgIDE2MDIsICAgMzYwMSwgICAgNTY0LCAgMTgzMzgsICAgIC0xNywgICAxMzI3LAorICAtMzg3LCAgLTE5OTgsICAtMTI2MCwgICAzMzUyLCAgICA4NDksICAtNDc4MCwgICAxOTMyLCAgICAtNTYsCisgIDI2MjUsICAxMDc1MywgIC0xNjc2LCAtMTA1MzYsICAgMjk4MCwgICAxNTQyLCAgIDExNzcsICAtMzExMywKKyAgLTg1OSwgICAgNTIyLCAgIDMwOTIsICAgOTU4OCwgICAyODgyLCAgLTQ1NDAsICAtMTQwNiwgIC01MTgzLAorICAgIDUwLCAgLTQyNDUsICAgMzY0OSwgICAtNDIwLCAgLTM2MTIsICAtNTI5MCwgIC0xOTE5LCAgMTQ1NTksCisgLTI2MDUsICAgMTE2OSwgIC0yMDA5LCAgMTA3NjAsICAtMjM3MiwgICAgMzM5LCAgLTI1MzgsICAgNDQ3NiwKKyAgMzAwMSwgIC00NTcwLCAgLTMxNTgsICAtMzQ2NSwgICAyODczLCAgICA2NTAsICAtMjA5OSwgICAgIDc2LAorICAxMTY2LCAgLTE0NjksICAtMjc2OSwgICAtMzkxLCAgIDQyMTUsICAgLTYzMCwgIC0xNDQ4LCAgLTE3OTYsCisgLTE1NzMsICAgNTkxNCwgICAgODA3LCAgLTE1ODAsICAgMjA3MiwgICAgIDk5LCAgICA1ODAsICAtMjk5OSwKKyAgMTA3OSwgICAtMjAyLCAgMTc5NDAsICAtMTIzMywgIC00OTA5LCAgIDEwNzksICAgIDM5MCwgICAtODkxLAorICAxODM0LCAgLTIxNTUsICAtMjY0MiwgIC0xNzAzLCAgIDE4NTYsIC0xNDEyNSwgICAyMDgxLCAgIDMxNzgsCisgLTI0ODAsICAtNDM0MiwgLTExOTkxLCAgLTIwNTAsICAgMTA0NiwgICAyNDEyLCAgICA0MzYsICAgMTA0NiwKKyAtMjI5MSwgIC0xNzE4LCAgLTMwODcsICAgMTcxMCwgICAtOTYzLCAgLTE5MTQsICAtMzQyMywgICA2MTkwLAorIC0xMjM4LCAgLTQzMzMsICAgIDExNSwgLTEwNTUwLCAgLTI3NDIsICAgLTkxOSwgIC00ODQ5LCAgIDE1MDIsCisgLTMwNTQsICAtMzMwNCwgICAyMzAwLCAgLTE4NTAsICAgMjMzNywgIC02NjQzLCAgIDE5OTUsICAtMTI3OSwKKyAgLTIzOCwgICAgNzM4LCAgIC0xMjQsICAxMzU5MywgICAgMjUyLCAgLTE0MjQsICAgLTE2NSwgICAyNzg2LAorIC0xNzE3LCAgIC04MzgsIC0xMTI0NCwgLTEwOTcxLCAgIC05MDIsICAtMzMzMCwgIC0yNTgwLCAgLTI3MzUsCisgIC0xNzEsICAgNDA0MSwgIC0yMTQ5LCAgIDI1MDIsICAgNjcyNiwgICAtNzM4LCAgLTQyMzUsICAgIDM2OCwKKyAgNjE0NCwgIC0xNzE4LCAgLTg2MjAsICAtMTg4OCwgICAgMTEyLCAgIC0yODIsICAgIC0xOSwgICA0MTI2LAorIDEwNzk3LCAgICA2MTAsICAtMzA5NywgICA3NzgzLCAgLTI5NzQsICAtMjA1OCwgIC0zNTU4LCAgICA0NzAsCisgLTU5MTQsICAxMDMyMiwgICAgLTIwLCAgICAgODUsICAtMTY1MiwgICA2MTExLCAgLTEzOTgsICAgMjYxMywKKyAgMzczMywgIC0zNzE2LCAgIDE5MzAsICAtNDMyNSwgIC0xMTk5LCAgIC05MjEsICAgLTQ0NiwgICAxMDk1LAorICAxMDA2LCAgICA5MTAsICAtMjMyMywgICAtMzUxLCAgICA4MDgsIC0zMjc2OCwgICAgMjc0LCAgIDEzNDYsCisgICAxMDUsICAgMjM2MCwgIC0xMTg0LCAgIDIyNDksICAgLTk3MCwgICAgMTUzLCAgIDMxODAsICAgMTMwNywKKyAgMjIwNywgICAtOTYyLCAgIDIyMDksICAgLTkyMSwgICAxNTA0LCAgIC0xMTcsICAtMjExMSwgIC0zNzM0LAorICA1NzM4LCAgIDgwMTQsICAgICA3NiwgICAxNTY2LCAgIDMwMTMsICAgLTQ2MiwgIC0zNjAwLCAgIDM5MzksCisgIDQ4NjIsICAgMTAzOCwgICA0MzEyLCAgIC03OTAsICAgLTQyNiwgIC0xNjU2LCAgICAgMjAsIC0xMDU2OCwKKyAtNjM4OSwgIC02NTk3LCAgIDQyMzAsICAgMjkxMCwgICAyNTA0LCAgLTI5NjIsICAgIDI1NiwgICAgODE0LAorICAtNDg4LCAgICA4MjQsICAgLTM1NSwgICAzNTc0LCAgLTE4OTAsICAtMjY1NywgICAtNzY3LCAgIDI3MzAsCisgLTEwODcsICAtMjUzOCwgIC0zNTIyLCAgLTQwNjcsICAgNjI0OSwgIC0zMzU0LCAgMTM5MjMsICAgNDA3MCwKKy0xMTAwNCwgICA0NzAzLCAgICA5MDksICAtNTk2OCwgIC01NDgzLCAgLTQyNDIsICAgLTc4MCwgIC0yNDg5Cit9LAorCisuY2IxMTA4bTEgPSB7CisgICA3NTIsICAtNDA5OCwgICA3NzI2LCAgICA1OTIsICAtOTQ4NywgICAyMDA0LCAgICAzMTgsICAtNDMyMiwKKyAgNjk4OSwgIC0zMzUwLCAgIC00NzgsICAtNDMwOCwgICAyMDIzLCAgICA3NTMsICAtNzA4MSwgIC0zOTM0LAorICAtODY2LCAgIDYyNjcsICAtNTcxMCwgICAyMTAwLCAgLTg0NjcsICAgIDEwMCwgIC00NjU0LCAgLTY3NzMsCisgIDQyNzEsICAxMDcyOCwgIDExNjE4LCAgIDExMjgsICAxMjczMywgICAxNDcxLCAgLTU1MTgsICAtMTE2MiwKKyAtMjE1OSwgICAtNDAyLCAgIC02MzIsICAtNDcyMCwgICAgLTI4LCAgLTE0MTIsICAtMTAzNywgICAgODk3LAorIC0xMjQyLCAgLTE3MzUsICAtMjYzMiwgIC0zNDYwLCAgIDMzODksICAgLTU4MiwgICAgMjA2LCAgICAzMjUsCisgLTI1NDcsICAgICA0NiwgICAxMzQwLCAgLTQ0MjQsIC0xMzQwOCwgIC00OTE4LCAgLTI4MzIsICAgMTQ1NCwKKyAgMjEyNywgICAxMjc2LCAgIDIyOTIsICAtMzk3MywgIC0zMjMwLCAgLTc4MTAsICAgIDU0MiwgICA0MjI3LAorICAyNjczLCAgLTg0OTAsICAgLTkwMiwgICAxMzYxLCAgLTEzOTgsICAtMTk4NiwgICAtOTkxLCAgIC02ODAsCisgICA2MDIsICAtMjg4NywgICAtNTU3LCAgIDI2NTYsICAgMzIxNCwgICAxNzk0LCAgMzEyNDEsICAgMTQ2MiwKKyAtMTQ1NywgIC0zNzUwLCAgLTE5MjMsICAtMjM4MSwgICAxMzEzLCAgIC0xMjgsICAgLTE3MiwgICAtNjQ3LAorICAtNTc0LCAgIDEwNDUsICAgMjQzOCwgICAxNjYyLCAgICA1MDMsICAgIDI4OCwgICAxNTM1LCAgLTEwMTYsCisgIDI0ODcsICAgLTgyMCwgICA0NjkyLCAgIDI3OTksIC0zMTk0OSwgICAgMTY2LCAgLTE2NTUsICAtMjE5MiwKKyAgLTYzNiwgICAxMzU3LCAgLTIzNjEsICAgLTQ1OSwgIC0xNzUyLCAgIDI3ODIsICAgLTI5MywgICAtMTQ0LAorICAxOTAwLCAgICA2ODUsICAgMTc2NiwgICAxOTAwLCAgIC0zNDcsICAtNDQ4OCwgICAgNTkwLCAgICA5MTUsCisgICA3OTgsICAgMTEzMywgIC00NDk0LCAgLTEzODgsICAgICA3NSwgICAgODg0LCAgMTMwODgsICAtMjM5MiwKKyAgIDY3OSwgICAtMzE1LCAgLTc1MjAsICAgMTA4NiwgICAzODczLCAgIDMyOTcsICAgLTgxMiwgICAtNjI2LAorIC05NDQzLCAgIDI1NDgsICAtNjQxNywgICAxNjE5LCAgIDcxOTYsICAgIC01NywgICAgICA1LCAgIDM1OTQsCisgLTE5MjIsICAgIDE4NCwgICAyNzg0LCAgIC0yNjEsICAtMzMxMCwgICAyNzc5LCAgICAxNzQsICAgMjgxNCwKKyAgLTk2NSwgIC0yOTEyLCAgLTE4MzUsICAgIDQyNSwgIC00Mjg1LCAgICA4OTYsICAgMjAwMSwgICAzNzE3LAorICAgNzc1LCAgLTExOTIsICAyMjM2NSwgICAtMTc1LCAgIDE1MjIsICAgLTcxMSwgIC0xMTM1LCAgIDUxMjMsCisgIC01MTcsICAgIDg3MCwgICA0MzIzLCAgICA1ODUsICAgLTQzNywgICAgMjYwLCAgLTE3MzcsICAtMTk4NCwKKyAgMjUyMiwgIC0yNTM5LCAgIC05NzMsICAtODgxMiwgLTE2MTczLCAgIDQ2NzgsICAtNDEwNywgICAgMTMwLAorIC03ODMyLCAgIDExNDAsICAgMjc5MiwgICAzMzk0LCAgIC02OTIsICAtNDEwNSwgICAtMjk5LCAgIDE0ODgsCisgIDEyNDYsICAgIDYwNCwgICAyNzk2LCAgLTM3NjcsICAgIDU3OSwgICAgMTg4LCAgLTE1NDQsICAgICA4NiwKKyAgIDQyNCwgICAxMjA0LCAgIDQ0NDEsICAtMTAwMCwgIDE1MjI3LCAgIDM0NTksICAtMzQ0NCwgIC0xNjMxLAorIC0yMTc3LCAgIDM0OTcsICAgMTY4NCwgICAgOTI1LCAgIDI4NzIsICAtMzkwNSwgICA1NzI5LCAgICA2NDcsCisgICA5MTMsICAgLTc1OCwgICAtNTQ3LCAgICA1NjYsICAgMTc4NywgICAgNzkyLCAgLTE1MDksICAtMTY0MSwKKyAgLTkyNiwgIC0xNTE1LCAgIC0xMTYsICAgMTI2NiwgICAgNDgxLCAgLTM5NDQsICAyODUyNiwgIC0yMjc5LAorICA1NTc3LCAgIDEwMjYsICAgNDA4MiwgICAtNjA1LCAgICA2OTYsICAgMTA5NCwgICAtNDc4LCAgIDU3MzIsCisgIDcyNDcsICAgMTQ2MSwgICAxNTIxLCAgIC0yMzQsICAgIC00MiwgICAtODc4LCAgICAyNzAsICAgLTU1NCwKKyAgMzcwMiwgICAgLTcxLCAgIDEzNjIsICAgNzcxOSwgICAgMzA1LCAtMTM2NTQsICAtNDk4NSwgIC0xMDcyLAorIC0yMDQ0LCAgIDY4NTEsICAgIDQzOCwgIC04NDM1LCAgICA5MjMsICAgLTUzNywgICAxNTExLCAgLTEwMDMsCisgIDIwNTYsICAtMjI5OSwgLTE1NTc4LCAgICA1MDMsICAgMTk0NCwgICAzMTg4LCAgIDIzMTgsICAgMTc2MSwKKyAgMTI5MCwgIC0yMzIyLCAgIC01NjgsICAtMTU5MSwgIC0yNzQ2LCAgLTE5NjYsICAtOTc4NCwgICAxNTE0LAorIC01NTk2LCAgIDQwNzAsICAgLTE4MSwgIC0zMDA2LCAgLTE5MDMsICAgLTI0MCwgIC0xMTQzLCAgICAzOTMsCisgLTE1MzAsICAgLTgyMiwgICAgNTIwLCAgICA5ODksICAtMTYwMCwgIC0zMzc0LCAgICA5NDYsICAgIDY3OCwKKyAgICA4NiwgIC0xOTU3LCAgIDE5NDcsICAgMTE4OCwgICAgMzU2LCAgICA3MTksICAtMjg3NCwgIC0yMjQ1LAorLTE5MDEwLCAgICA1NDcsICAgOTA2NywgICAgNDM5LCAgLTIzODQsICAgIDg0NywgIC0zMzA3LCAgIC0xMTYsCisgLTExMTQsICAgLTQ0NSwgIC0zNTA1LCAgIC05NjcsICAtMTI1MiwgICA0ODgwLCAgICA2MjUsICAgMTQ3OCwKKyAtMjk3MCwgIC0yMjc1LCAgIDEzMzcsICAgIDQyMiwgICAzODcwLCAgLTE5MDYsICAtMTAzMywgICAxNzI0LAorICAtNTMyLCAgIDE3MzQsICAgMTAxMSwgLTIxODQ4LCAgIC00NzcsICAgLTI1MSwgICAtNjE1LCAgICA3NzAsCisgIDc1MjAsICAgMTAzMCwgIC00MzcyLCAgIC00NDYsICAtMzE1NiwgIC0yMzE0LCAgICAxNzIsICAgIDkwMSwKKyAgICA3MCwgICAxODM3LCAgIDEyMDUsICAtMTM0NCwgICAyOTMzLCAgIDEwODAsICAtMTI5MCwgICAxMzUzLAorIDEwMjA1LCAgIDExNTgsICAxMTEzNSwgICAgNTYwLCAgLTM0ODAsICAtMjM3NiwgICA3NTM5LCAgLTU0MTgsCistMTQwOTIsICAgMjEzOCwgICAtMjUzLCAgLTkzNDQsICAtMTkwNywgICAyMTc3LCAgICA2ODcsICAgMjc3MiwKKyAtMjczMCwgICAtNTQ2LCAgLTQxODAsICAgMjAyMSwgICAtNTc3LCAgIDI1MzAsICAtMzgyMiwgIC03MDgwLAorICAgOTcxLCAgIDIwODMsICAtMTIyMCwgICAgMjAzLCAgIDMxODcsICAgMzcwNSwgICAtNzUyLCAgLTI1OTEsCisgIC03MDQsIC0xNzQ2OSwgIC0xMTY4LCAgIC0yMTQsICAgMjUxOCwgICAgMzA4LCAgIC01ODUsICAgMTExNywKKyAtMTg5MywgICAyNDg4LCAgIDE4NTYsICAgIC0yMywgICAyNDE4LCAgLTI5MjIsICAgMTk2MCwgICAgMjM1LAorIC0xNjI5LCAgLTgyNzcsICAgMTA4OCwgICAyMDMyLCAgICA4NzQsICAgMjc2MywgIC0xODY3LCAgICAgNjAsCisgIDE2ODQsICAgIDgzNCwgIC0yNjc2LCAgIDE1NzQsICAtMzA5OCwgICAzMjUwLCAgLTM3MjMsICAgLTEyNiwKKyAgICA1OSwgICAtNzg3LCAgIDI3MTAsICAgIDkzMCwgICAxMzg0LCAgICA0NzUsICAtMzkxNSwgIC0xMTYyLAorICAxNjQwLCAtMTY4MTgsICAgMjM1NiwgICAgLTcwLCAgICA3NjEsICAgNDE1MSwgICAtNzc4LCAgICA1MjMsCisgIC0xODMsICAxOTM3NCwgIC00MjIzLCAgLTEzNzksICAtMTY2NywgIC0xNjkwLCAgIC01MTIsICAgODc0MiwKKyAgIC0zNCwgICAzODE2LCAgIC02NzgsICAgMjc0OSwgICAyNDE4LCAgIC0zNDEsICAtMTIxNiwgICA0MjgwLAorIC0yMjA4LCAgIC0yNjQsICAtMjg4NCwgICA0Njc5LCAgIC04MjEsICAgMTgyNCwgIC02NzI0LCAgLTE1MjgsCistMTIwNDIsICAtOTkwOCwgICAgOTM1LCAgIDQzMzgsICAgLTExNiwgICAgNjEyLCAgICAgIDYsICAgLTE2MSwKKyAgMTkzNSwgICAxNjAwLCAgIC00NDIsICAgNDA1OSwgICAyNTEwLCAgIDIxODYsICAtNzY3OCwgICAzNjAwLAorIC0yNDYwLCAgLTEwNzIsICAgLTEyMiwgIC0xODE3LCAgIC0yNDYsICAgMjc4NiwgICA5MDc5LCAgICA1MjUsCisgIC0yMjYsICAgMjYyOCwgIC0yNTQ5LCAgIDE0NTksICAgNDUzMywgICAxMTExLCAtMTc0MTAsICAgNDUyOSwKKyAtMjU0NSwgIC0zMjcyLCAgICA0MDMsICAtMjc1OCwgIC0xODc2LCAgIDI3MzQsICAgMjEzNiwgIC02MTcxLAorIC0yMDU1LCAgIDExNjMsICAtMjgyMCwgICAyOTkyLCAgIDI5NzgsICAgMTQ1OCwgICAxNTcyLCAgIDI1MDgsCisgMTM1NzYsICAtMTU0NSwgIDE0ODYxLCAgIC03OTYsICAtNjQ0NCwgICA0MDIyLCAgLTQzNTgsICAgLTUyOSwKKyAgMzQzOSwgIC0yNjMwLCAgLTI0NTcsICAgMzAzMCwgIC0yOTcyLCAgIC0zOTgsICAgIDQ3MSwgICAyNTQ3LAorICAxMTI3LCAgIDEzNDQsICAgIDIwMiwgICAgNDIwLCAgLTE4NTgsICAgLTU4OSwgICAgNTk0LCAgIDE0NzgsCisgIDU1OTAsICAgMTY4MiwgIC0xNTYwLCAgIC0zNzgsICAtMjE5OCwgICAgNDAwLCAgIDIyMzEsICAgIDU2NiwKKyAgIC04MCwgIC0yMDQyLCAgLTQ1NTcsICAtMjMwOSwgICA4NzQzLCAgLTQyNTgsICAgMTI5MSwgIDExNzcwLAorICAgNzE4LCAgIDIzNDIsICAgMjkxMiwgICA1MTcwLCAgIDI0NzAsICAgNjgzMiwgICAgODMzLCAgIDQ5OTAsCisgIDIwMDksICAtMTI1OCwgICAtODk4LCAgLTE0MTQsICAgMTIxNCwgICAgNjcwLCAgLTIxMDQsICAtNTA2OCwKKyAgIDc4OCwgLTE4OTk3LCAgIC03NDMsICAgLTg2NCwgICAtMzU2LCAgIDE1OTIsICAtNTc4NiwgICAgNjUyLAorICA0OTUyLCAgLTIzMTksICAtMTA5NywgICAyMTc3LCAgLTE2NTQsICAgMjg3OSwgIC0xNjQ1LCAgIC0xNzIsCisgLTE1ODEsICAtMzA2MiwgICAtODA1LCAgLTEwNjUsICAtMjIyMiwgIDIwODU3LCAgLTExNDYsICAgIDg2NCwKKyAgMTY5MCwgIC0xNzk0LCAgICA4NTUsICAgIDMwNywgICAyMzIwLCAgIDM2MTgsICAgNjE4NCwgIC00MTI5LAorICAgMTg3LCAgLTI0MjMsICAgNDk0NiwgIC0zMDcyLCAgIC0yMTMsICAtMjYyMSwgIC0yMDI2LCAgLTU3OTMsCisgIC05ODYsICAtMTU5NywgICAyMTI1LCAgIDE0NzQsICAgMTc2NiwgICAgMzYwLCAgLTQ2NTIsICAtMTAzMCwKKyAgMTU0NiwgIC0xMDg1LCAgIC0yNTMsICAgMTAxNiwgICAgLTk2LCAgLTE2MDgsICAtNzAxNywgIC00ODU1LAorICAxMjk1LCAgIC0yNzEsICAgMzc1MSwgICAgMzQxLCAgMTk4MDQsICAtMjAwNiwgICAyMzIyLCAgLTIyOTgsCisgICAzNTMsICAtMjA3NywgICAtNzY0LCAgICAyMTIsICAgIDE1MCwgIC0xMTQwLCAgICA1NjQsICAgLTYxNCwKKyAgIDI2OCwgIC0yMDIzLCAgIC0zMzIsICAgLTY5OSwgICAtOTM3LCAgIDE2ODQsICAtMTYxNywgLTIyODYzLAorICAxMjAyLCAgIC0xNDQsICAgICA2MiwgICAgMzczLCAgIC01OTgsICAgIDE4NCwgICAgOTg3LCAgIDM3MjEsCisgIC02MTEsICAgICA4NiwgICAzNjc2LCAgICAzNjIsICAgLTY1MiwgICAtMjE0LCAgIC0zMTEsICAgLTY5NCwKKyAtMTk3MywgICAyMzUxLCAgIC03MzMsICAtMTYwMSwgIC0xMTg5LCAgMjgyMjcsICAgLTE1NCwgICAgIDEwLAorICAtMzQ3LCAgIDM0MDAsICAgMTMzMywgIC0xNjk1LCAgIC03NzMsICAgMTM2MiwgICAtNDQ3LCAgLTI5OTksCisgIC02MjYsICAtMTc3NiwgICAyNDc0LCAgIDIxOTUsICAtMTA0MSwgICAtNzk3LCAgIDE4MjgsICAgICA2MiwKKyAgMzM5NywgIC0xNzc5LCAgLTI5MjQsICAgMTc0MCwgIC0xNjk0LCAgIDQwODMsICAxNTEwMCwgICAzODcxLAorIC03ODIxLCAgIC0xMDgsICAgIDI5MiwgICAgOTk4LCAgIDMxNDEsICAgNTgxMywgICAtOTE4LCAgLTEyOTAsCisgIC05MDIsICAgIDg5NSwgIC0xMzM2LCAgICAtNTAsICAgMjAxNCwgIC0yMDY2LCAgIDIzODMsICAgICA2OCwKKyAzMTc2OSwgICAtMzM0LCAgIDEyNDMsICAgMTk4MSwgICAtNzE1LCAgICAxMjUsICAgLTM4MCwgIC0xMjcyLAorICAxMDY4LCAgIC0zNTcsICAtMTczNCwgIC0xMTM4LCAgIC02MzAsICAgMTA0MiwgICAgNjg4LCAgIC00MzgsCisgIC01NTgsICAtMjQ2MCwgIC0yODk0LCAgIDQxOTYsICAtMTAwNCwgIC0yMTc3LCAgLTIyOTEsICAtNDcwMSwKKy0xMzk5MCwgICAgNzQ3LCAgLTU1NTgsICAtMjc1NCwgICAxOTUwLCAgLTI3ODAsICAgODQxNCwgIC0xMjg2LAorICAtOTQ2LCAgICAyMjAsICAtMjUwNywgICAtMTkyLCAgIDM3MjYsICAtMTM2MSwgICAxMjk2LCAgLTIyMTUsCisgICA4NzIsICAgODI3MCwgIC0yNzk3LCAgLTY3MzIsICAgMTI1NiwgIC0xOTU3LCAgLTI5MTYsICAgIDEwNywKKy0xNDg0NywgICAxODY4LCAgIDQ2MzgsICAgMTI5MiwgIC0xMDA2LCAgIDUyODUsICAgMjk0NywgIC01MDI4LAorICAgOTQyLCAgICAxNTMsICAgIDQyMCwgIC0xMTUyLCAgIC0zOTEsICAgMzYxMiwgICA0NjIxLCAgICAxNzIsCisgICA3NjIsICAgLTg3NiwgIC0zNTYxLCAtMTQ0MDYsICAgLTU1MiwgIC0yNTcwLCAgLTQ0NDgsIC0xNTcwNCwKKyAgLTgwNiwgICAtOTI4LCAgIDMzODAsICAgLTY4NiwgIC0yNjA0LCAgLTM4OTUsICAgLTcxNCwgICAtNjI2LAorIC0xNzYzLCAgIDExNDQsICAgIDQ4NSwgICAgIDM0LCAgLTE5MjIsICAgMTUyOCwgICAtMjEzLCAgIDUwNTAsCisgIC04MDQsICAgIDE4NSwgICAgIDk2LCAgIDMzMjAsICAgLTYyMSwgICAtMzI5LCAgLTE0NDQsICAgIDg2NCwKKyAtMTY4NCwgIDE2NTgzLCAgIDE4NzIsICAgMzMyNywgICAyMTQ2LCAgIDExMzIsICAtODIxNiwgICAgIDczLAorICA2NTI0LCAgIDE2MjMsICAtNDE0NywgIC00OTg1LCAgIDE0NTAsICAgLTY0NiwgIC03MTg5LCAgIDQ1MjQsCisgLTE1OTYsICAgMjEyMCwgICAzOTEzLCAgICA2ODAsICAgMjA5NCwgICAxNjYwLCAgICA3NTIsICAtMTIyMSwKKyAgMjQxNCwgICAzOTg2LCAtMTAzMTQsICAgMjA5NiwgICAgMTI5LCAgLTU0NTgsICAgIDYzNCwgIC01NDI2LAorICAtNTk0LCAgLTk3MzEsICAgMjA4MywgIC0yMjg0LCAgLTUwODUsICAtNDc3NywgIC0xMzIzLCAgLTE3NDAsCisgIDYxNTcsICAgLTg0MSwgICAtMTI2LCAgICAyNDcsICAtMTE2MywgIC03MDA1LCAgIDM4NjMsICAgLTc2NCwKKyAtMTU1MiwgICAxMzU2LCAgMTA3ODgsICAgLTc0NSwgLTEyNDgxLCAgICAtNzMsICAgNTIzNCwgIC0zMjIwLAorICAyOTc5LCAgICA2MzUsICAgMzM3MiwgICAtNTQwLCAgICAtMzYsICAgMjg4NywgICA1MjIxLCAgICA5MzEsCisgLTE3MjQsICAtNDgyNCwgICAgNzgwLCAgICAtNDksICAgIDEyMCwgICAtNzM5LCAgICA4OTAsICAgIDcxNCwKKyAtMTQzOCwgICAtNDU4LCAgLTE4NjEsIC0xNjczMiwgIC0xODU4LCAtMTMyODIsICAgMjE4MiwgIC02Nzk2LAorIC0zMzA3LCAgICA1NTYsICAtMjk2OCwgICAgNTQyLCAgLTIzNTgsICAgMTQ2MywgIC0zNTM2LCAgIDE4NjYsCisgIDI4MzMsICAtMTM2OSwgIC0xNTc2LCAgLTI4MjUsICAgMzU2MSwgIC0xNjI1LCAgIDE4NTgsICAtMTA1MiwKKyAtMTA3OSwgICAxMzAyLCAgLTIwNDksICAxOTA1MiwgIC0xMTg4LCAgLTQxMzcsICAgMTU5MiwgIC00NzA1LAorICAxMDgyLCAgLTExNjgsICAgMjM1NSwgICAgNjQ5LCAgLTE5MDAsICAtMjU4MiwgICAxMDAwLCAgLTMwNjUsCisgLTIzOTksICAgMzYyNSwgICAxMDYyLCAgICA4NjAsICAgMjU4NiwgIC0yNjQ1LCAgMTQ3NTUsICAgMzE0NywKKyAgNTAwMiwgIC02NzIwLCAgIDE3MjgsICAtMjExNCwgICA1MDkwLCAgLTI4MzgsICAgMzAyMCwgIC01MDQ4LAorICA0MTgyLCAgIDIyMzcsICAgIDcwNiwgIC00OTQ1LCAgICAtODYsICAtMTkwOCwgIC0xMjA3LCAgICAxMzUsCisgICA2NzUsICAgLTIwMCwgLTIyMTM0LCAgIDE0OTIsICAgMjQ5MCwgIC0xMzI0LCAgLTExMzUsICAgLTg0MiwKKyAgMTQ1NywgICAgMTg1LCAgIDEzNDIsICAgMzUxNiwgICAtODgyLCAgIDEwNjksICAgMTE1OSwgICAgLTUyLAorICAxODQ0LCAgLTExODYsICAgIDU1NCwgICAzODYwLCAgIDE4MjQsICAtMjEzNiwgICAtODgxLCAgLTEyODEsCistMTMyNTksICAgLTcwNSwgICAgLTkwLCAgIDIxNTAsICAgIDU3MywgICAyNzg3LCAgIDEwNjgsICAtMTk2OCwKKyAgIDEyMSwgICAgODA1LCAgIDQzODIsICAtMTAzMywgIC05MjIwLCAgIC03NDQsICAtMTQ0NiwgICA3MTgwLAorICAgMjU3LCAgLTU5ODMsICAtMTY0MywgIC02MTk4LCAgIDE4NTQsICAtMzUyNCwgICAxMDYwLCAgIC0xMTgsCisgICAgNTYsICAgLTg0MywgICAyODMyLCAgICAtOTgsICAtMzQ5MywgICAgMzY4LCAgICAgIDYsICAtMTg3NywKKyAtMzYxNSwgIC0xOTU0LCAgMTc5NzEsICAgIDk2MiwgICAxNTMyLCAgLTE3NTQsICAgMzc3NiwgICAgNjYxLAorIC0yMDI1LCAgICAtNjAsICAtMTAxMywgIC0xMjIyLCAgLTMwNjIsICAgIC02OSwgIC00OTMzLCAgIDMwNjQsCisgLTExNzYsICAgIDIxMywgICAgNDc3LCAgIDEwODEsICAgMTY3OSwgIC0yMzI4LCAgIDE5ODQsIC0yMTc1OSwKKyAgLTg4MSwgICAgLTU0LCAgLTExMDEsICAtMTA5MiwgICAgNTk4LCAgIDE2NDgsICAtMzM4NCwgICAtMjEzLAorICAgMzc5LCAgLTEzMTgsICAtMTk3MiwgICAgNjMwLCAgIC01MzYsICAtMTk3MCwgICAtNDYxLCAgIC0zNTYsCistMjI0MTYsICAtMTg1NSwgICAtMTEzLCAgICA4NzYsICAtMjgwOSwgICAtNTg3LCAgLTIzMjMsICAgIC01NiwKKyAgMjE3NywgICAtNzk3LCAgIDE2NDksICAtNDA2OSwgICAxMzUwLCAgLTIwNzUsICAgIDEwMSwgIC0xMzg0LAorICAxNzAzLCAgIDEwODUsICAgIDQ3MSwgICA4MDkzLCAgIDEwMjAsICAtNDExMiwgICAgOTcwLCAgICA4NjYsCisgLTE0NTYsICAgLTM0MSwgICAxNDE4LCAtMTI5MzgsICAgIDM3OSwgICA5Nzg3LCAgIDE4MTQsICAgMjMzNywKKyAtMTcwNSwgICA5OTEzLCAgIDEwMjYsICAgMTk2MiwgICAtNzQ0LCAgLTI5MDAsICAtMTY5MCwgICAxNTM0LAorICAtOTU5LCAgIC02MjksICAgMjMzMCwgICAzNzM1LCAgIDQ3NDIsICAtMzEzOSwgIC0yMTM1LCAgIDIyOTgsCisgLTI3NjUsICAtMTM4OSwgIC0zNjM0LCAgMjcxMzksICAgIDY3MSwgICAyMjA4LCAgICA0OTQsICAgMTAxNSwKKyAtMTE5NywgICAtMjM5LCAgIC0zMjEsICAtMTE0NSwgICAtNjc5LCAgIC02MzcsICAtMzExNiwgICAgNTQ0LAorICAtOTUyLCAgICA4ODIsICAgIDM5NiwgICAxMDg3LCAgLTMxNjMsICAtMjY4NCwgICAgNzU5LCAgIC03MjUsCisgLTIxODYsICAgLTU0MiwgICAyNTQ1LCAgIDM2NjksICAgICAyNCwgICAxNjg5LCAgMTA0NzMsICAgMTgzNiwKKyAgLTQxOSwgICAgMzIyLCAgIDI0NzUsICAgMTkwOCwgIC0xMzQ2LCAgICAgNTAsICAtNjQwMSwgIC0zNjQ0LAorICAgNTUyLCAgIDIzNDgsICAgMTMyNywgIDExODUzLCAgIDI0NjcsICAgNTQ5MywgICAxNTQ0LCAgICA0NjQsCisgIDE3OTYsICAtMjgwMSwgICA4MjE3LCAgIDEwMTQsICAtMjEwMywgICAzNzY0LCAgIDgwOTEsICAgIDE3MCwKKy0xMjQyMiwgICAxNzA4LCAgLTI0MzgsICAtMTg3MywgICAxOTcwLCAgIDIxNjAsICAtNTAyNywgICAtNjQ3LAorICAtMTE4LCAgIDI4MzAsICAgMjM3OSwgIC0xMDkxLCAgLTU3MjMsICAgIDEyNCwgICAzMDE3LCAgICA0MTcsCisgICAgNTUsICAgMTM3NiwgIC0xMDc5LCAgIDcxMjIsICAgMzA4NiwgIDE3ODQ3LCAgIDI0NjgsICAgMzI3MywKKyAgLTU5OSwgICAzMzAyLCAgIC05MjIsICAtMjA3MywgIC0xNjk2LCAgICA4MDUsICAgMjAyMiwgIC0xODk5LAorICAzMTg4LCAgIDE0MjUsICAtNDM2NCwgICAtMTQwLCAgLTM3NjAsICAgIDQzNywgICAxMzkzLCAgLTEyOTgsCisgMTcxNjYsICAtMTI4MywgIC0yOTA0LCAgIC02OTIsICAgIDUxOCwgICAtNDA0LCAgICA5NDQsICAtMTk5MCwKKyAgLTk2OCwgICAxMzIzLCAgIDIzNzYsIC0xMTcwOCwgICAyMTg3LCAgIDMxNjQsICAgLTU1OSwgICAyMjEyLAorICAxNTk4LCAgLTE3NDEsICAgIDM2MCwgICAgNjMzLCAgIDMwNzUsICAgLTY2MCwgIC0xMDEyLCAgICA3NzgsCisgICA1NjUsICAtMjAyMCwgICAtMTIzLCAgICAgIDUsICAtMjIxNywgIC0yOTY3LCAgICAzNzQsICAgIDI3MiwKKyAgIDMzNiwgIC0xNzI1LCAgIC00MDgsICAtMjI3MCwgIC0yNjQ1LCAgLTEwNDQsICAgLTUxNywgICAxOTExLAorICAtMzg2LCAgLTQ0MzksICAtNzYwMywgIC0xMDAwLCAgIDc2NjAsICAgIDU4OSwgIDE0OTMxLCAgIDI5MDEsCisgMTE5OTgsIC0xMzEwMiwgIC0xOTE5LCAgIDM5MDQsICAgICA4NiwgICAxNjE3LCAgIDczMjQsICAgMzA3OCwKKyAgMTcxNCwgICA0NjM2LCAgLTI1MDQsICAgLTE5NCwgIC0zMjc0LCAgIC03MTAsICAgICAzMywgIC0xOTY1LAorIC0yMjk4LCAgIDI1MTMsICAgIDcyNiwgICAgIDc1LCAgICAgNjcsICAgIDg4NCwgICAyMTA0LCAgIDQxMTAsCisgIDE5MzYsICAxMDM4NywgICAyNzIyLCAgLTE5NzAsIC0xMjQ5NiwgICA0Nzk5LCAgIDMwODYsICAtMjkzOCwKKyAgMTcxOSwgIC0yMTM4LCAgIC0zMzgsICAtMTEyNCwgICAgOTcxLCAgLTQyMDAsICAgIDQ4MCwgIC0zMzYxLAorICA2MjIwLCAgIDU5NTQsICAgMTgzMCwgICAxMDAxLCAgIDI5OTYsICAgNDE2NiwgIC0yODU0LCAgIC00MzcsCisgLTE0MzAsICAgMTA3MiwgICAtMzEyLCAtMTI5NDksICAgMzExMywgIC0yNDc5LCAgLTIwMzQsICAgNjk1NiwKKyAgMjgwNSwgICAyMTI4LCAgICA4NTYsICAtODgwMywgIC00NzA5LCAgLTEyNzQsICAgLTEyMCwgICAxMjUyLAorICAzODk4LCAgIDY1MjYsICAtMzkxNCwgIC0yMjc2LCAgIDI3NTQsICAtMjYwNCwgIC0zMDM4LCAgIDQxMzYsCisgIDI1OTgsICAtMjE3MiwgICA0ODYxLCAgLTI0NTcsICAgICAgMiwgIC0yNjkzLCAgIC04MDgsICAgMzUyNywKKyAtMTE4NCwgICAgMzkyLCAgLTIyMDIsICAgMjQwNiwgICAgOTYwLCAgLTEwNjQsICAtMjU4OSwgICAxMTYxLAorICAyNDE4LCAgICA3MjgsICAgLTQ2NiwgIC00ODY1LCAgICAyMTEsICAxNDcyMCwgIC0yMDkzLCAgLTE5NzcsCisgICAgODUsIC0xMjYxOCwgIC0yMDczLCAgLTMwMjgsICAtMTA2NywgICAxNzM0LCAgLTI0OTEsICAgOTUwNiwKKyAgLTQyMiwgIC0yNzE4LCAgLTI5NjYsICAgMzg4MywgIC0yODUyLCAgICAzMzYsICAgMTMwNiwgIC0yMjk3LAorICAyMDA5LCAgIDI1ODksICAgMzA3MSwgICAgMTkyLCAgLTEyMzksIC0xMDU1MywgICAgICAyLCAgLTExNzQsCisgLTMwMzYsICAgOTkzOSwgICAgLTI3LCAgLTEyNzgsICAgMTQ0OCwgIDE4NjU1LCAgICA3NjEsICAgIDkzMSwKKyAgIDQ0NSwgICAgLTk0LCAgICAyMDYsICAgIDQ0OCwgIC0xODY1LCAgICAyMzIsICAtNDM1MywgICA0NTk2LAorICAtMjYwLCAgIC05NzYsICAgIDU5NCwgICAgNjQ4LCAgICA3OTYsICAtMTM3NiwgIC0xMTg2LCAgIDMwNTYsCisgIDMxNzEsICAtNTY3NSwgICA2MTc5LCAgLTEyODcsICAxNjkzNCwgIC0xNDc4LCAgIDEwOTAsICAgIDU3NywKKyAgODA3NSwgICAxMTE5LCAgIDI5NDMsICAtMzIwOCwgICAxODUyLCAgIDE5ODYsICAgNjAwMywgICAgOTAxLAorICAtOTYyLCAgLTMxOTYsICAtMTkwNywgICAgMzkyLCAgLTI2MDUsICAgMjc5NiwgICA0MDgyLCAgIC00NTYsCisgLTMxMDksICAtMTIxOSwgICAgMTIzLCAgIDI0NzAsICAgIDE3NCwgIC0xMjU0LCAgLTEzNTAsICAtNDkxOSwKKyAgMTI3MSwgIDEyMzAyLCAgLTExNTQsICAtNjMxNywgIC0zMzQ2LCAgLTEzMTUsICAgLTE0NCwgICAxMjE0LAorICAgLTQ5LCAgIDM0OTEsICAtMTAyOSwgIC0yMDQzLCAgLTgzNzMsICAgNDE5NywgICA0OTcxLCAgIDk4MDgsCisgIDk3MzIsICAgIDcwMCwgICAyMjQ3LCAgLTI3NTUsICAtMjAzNCwgICAzMjYwLCAgICA4MzksIC0xMDU1NCwKKyAgMTY2MSwgIDExNDg0LCAgLTMxODAsICAtMTkwOSwgICAxMDg5LCAgIC04MTMsICAgMzExNiwgIC0yMTAzLAorIC0zNzI2LCAgLTQ1MTQsICAgIDY2MywgICAxMTUyLCAgIDM5MDIsICAgNDg2MiwgICAyNzM5LCAgLTM4MjgsCisgICA3MDcsICAgMjcxMiwgIC04MDA5LCAgIC04MzIsIC0xNjQ5MiwgIC0xNDcyLCAgLTI0MjIsICAtNTU5MywKKyAgIDMyMiwgIC0xODk0LCAgIDI4MTAsICAgIDEwOSwgIC0xNzg4LCAgIDIwNTAsICAgMzUzOSwgIC0zMTEyLAorIC02MTc4LCAgIDI0ODcsICAgMjEwMiwgICAtMTM1LCAgIDMxNjMsICAgMjA5NiwgICA0MTIzLCAgIC0zMTAsCisgLTEwOTAsICAgICAtMiwgIC0yNjYyLCAtMTcwODcsICAgMTM3MywgICAxNDQ4LCAgICAxNjIsICAgIDUyNywKKyAgIDY1NSwgIC0yMjQ4LCAgLTM1MzAsICAgIDE5NCwgICAxMzA1LCAgIDc1OTAsICAtNTUxNSwgICAxMjI1LAorICAxNjA3LCAgLTM4MTYsICAgMjE4NSwgIC0yNjc5LCAgLTQ0ODYsICAgLTU4MiwgICA0OTgxLCAgLTE2NzUsCisgICAxNDcsICAxNDc5MCwgICAgMTE5LCAgMTE3NzEsICAtMTIyOCwgICAxMDEyLCAgLTYxMzMsICAtMjI0NywKKyAtMzkxMywgICAxMzQ4LCAgLTE4NDYsICAgLTUxMywgIC02Mzg2LCAgIC03NDksICAgNjcyNiwgICAgNzQ1LAorICAtODA5LCAgIC03OTksICAgMzIyNCwgICAgIDQzLCAgLTIyMzAsICAgMjU5OCwgICAyOTk0LCAgLTE1OTAsCistMTExOTgsIC0xNDQ3NiwgICAtMjU2LCAgICA2OTUsICAgIDg3NywgIC0zNjgwLCAgLTI3MzQsICAtMTQ0OCwKKyAgMTMzNiwgIC0xNjMzLCAgIDMzMjcsICAgMzQ5NywgICAyOTU2LCAgIC03ODIsICAgMjk1OCwgIC0xODY2LAorICAyODc2LCAgIDIwMDMsICAgLTg1NiwgICAxMjgyLCAgIDUwNjgsICAgIDM5MSwgLTEwNTM5LCAgIDE3MDMKK30sCisKKy5jYjExMTBsMCA9IHsKKy0xNDk0NCwgLTE0OTUwLCAgICAtNzMsICAtMTE0MSwgICAxNTMyLCAgIC01NzUsICAgLTYyMCwgICAtODE2LAorICAxMTg1LCAgLTE1OTcsICAtMjY1MSwgICAxNDI2LCAgLTE0NTgsICAgMTMxNywgIC0xMzIwLCAgICAtMTksCisgIC0yMDksICAgLTM1MiwgICAtMTYzLCAgICA5MTIsICAgIC04NSwgICAtMTgwLCAgIC01NDYsICAtMTEyMSwKKyAgLTQzNSwgICAtMzQ1LCAgICAyMjksICAgIDM2NCwgICAtODUwLCAgICA2MzIsICAgLTQyNiwgICAtMzU5LAorLTMyNzY4LCAgICAyNzgsICAtMTAyMSwgICAgMzEwLCAgICAtMzEsICAgLTM1NSwgICAtNDQyLCAgIC0yMzQsCisgICA0MTUsICAgLTIwMiwgLTEwMzkzLCAgIDE2NDUsICAgLTM3OCwgIC0yMjcwLCAgICA4MzcsICAtMTg1NywKKyAgIDU1NiwgICAtOTM1LCAgLTEzNDQsICAgMzAxNiwgICAzNDUyLCAgIDE1OTcsICAgMTM3OCwgICAgNDY2LAorLTEzNzQwLCAgIC04NzgsICAgMTQ3NSwgICAgMjM3LCAgLTEzMDEsICAgOTc1NiwgICAtNTkyLCAgICAgMjMsCisgIC0xOTIsICAgIDMzNSwgICAgLTU4LCAgICAyODUsICAgIDM3NiwgICAgIDQwLCAgICAgMjQsICAgIDI5MiwKKyAgIDQyNiwgIC0xOTYyLCAgIC03OTgsICAgIDc0NSwgICAxMzc5LCAgICAtMzQsICAgIDM5NywgLTE0NzQ4LAorIC02Mjg1LCAgIDczNDMsICAtNjM3NCwgICA0NDQyLCAtMTQ4MDAsICAgMTg3OCwgICAgLTI0LCAgIDE2MDYsCisgIC03MjgsICAgLTQ3NiwgICAxNzU0LCAgLTEwNTIsICAgIDkxMSwgICAzMTM5LCAgLTE0NDQsICAgLTIyMiwKKyAtMTk2OCwgICAxODU4LCAgIDEzMzAsICAgIDI0NCwgICAgMjEzLCAgICA5MzUsICAgIC05MiwgICAtMzQ4LAorICAgMTU1LCAgICA0MTgsICAyOTEyOCwgICAgMjM2LCAgIC0xOTAsICAgLTIyNiwgICAtMzA5LCAgIC0xNzgsCisgIC02OTAsICAgICA0NiwgICAgNzE2LCAgIC01MzQsICAgIDE0NywgICAtNjMwLCAgICAtNzUsICAgLTgyNiwKKyAgICAzNywgICA0NzQ1LCAgLTEwNTYsICAgMjQwMCwgICAxMzk4LCAgIDE0OTQsICAgIDQ2MCwgICAtMjIxLAorICAyOTA4LCAgIC02NTYsIC0xNTYxMSwgIC0yOTQwLCAgIDIzNDIsICAgIC05OCwgICAgNTgxLCAgLTMxNDQsCisgIC00NzEsICAgMzc3MiwgICAyMDU3LCAgIDE1ODMsICAxMzczOCwgICAtMTM5LCAgICAzMzAsICAgMTE3NSwKKyAgIDQyOSwgICAgIDYzLCAtMTQ1NDQsICAgLTM3NCwgICAxNDM5LCAgLTEyMjYsICAgLTQyMiwgICAtNjkwLAorICAgODE2LCAgIDEyNzksICAgLTU5MiwgICAxNjQyLCAgICA3MDAsICAgMTMzOCwgICAgICAwLCAgIC03MTQsCisgICAgNDYsICAgIDM3NywgICAtMTg4LCAgIC0zNjYsICAgLTE5NywgICAtNjM3LCAgIC02MjIsICAgLTI2MiwKKyAgIC02OSwgICAtNjM3LCAgLTEyNjYsICAgIDI1NywgICAgNjIwLCAgLTEwNDAsICAgIDMyNCwgLTE5MDY0LAorICAtNjAyLCAgIC00NjMsICAtMTMyOSwgICAgNTEzLCAgIDI2OTksICAgLTQyMSwgIC0xOTE4LCAgIDIyNTAsCisgIC00MDQsICAgIDQwMywgIC0xNTE0LCAgICAxMzQsICAgIDE0NywgICAgICAzLCAgICA0MjYsICAgIDYwNSwKKyAgIDI3NiwgICAgNTYxLCAgICAtMjYsICAgLTI5NCwgICAgNjMwLCAgIC01MDAsICAgLTQ4MCwgICAtMTMzLAorICAtNzEyLCAgLTExNDQsICAgIDIzOCwgICAtNjMzLCAgICAxNzMsIC0yOTE2NCwgIC0xMTgyLCAgIC0yNzQsCisgIC0xMzgsICAgLTI3MSwgICAtMjMyLCAgICAgMzAsICAgIDcwNiwgICAtMTY4LCAgIC04NDgsICAgIDcwNCwKKyAtMjEzMiwgICAtMjQ4LCAgIC0xMDgsICAgIDY2OSwgICAxMTY1LCAgICAyMzQsICAgMTI0MywgLTEyMjAxLAorICAyMjA4LCAgLTE5NzEsICAgLTgyOSwgIDEwMzA1LCAgLTM5NjQsICAtMTUwMiwgICAtNDA5LCAgLTM5MTgsCisgIDQ1MjAsICAtMjI1OSwgICAtNzk3LCAgIDIyMzUsICAtNTU2MCwgIC0xNzEwLCAgLTI0NzIsICAgIDI4MCwKKyAtMTc0NywgICAtOTgwLCAgLTQ1MjksICAtNTIwOCwgIC0xODEzLCAgICAzMzAsICAgIDg5MCwgIC02MjIwLAorICAtNzEwLCAgLTU1ODMsICAtNDcwNCwgICAtOTEzLCAgIDI5MjAsIC0xMjQ4NCwgIC00MzQwLCAgICAzMzQsCisgLTEzMDMsICAgIDI4MywgICAtNzQwLCAgLTEyNjEsICAgMzU1NiwgICAzMjEwLCAtMTE2NDAsIC0xNDQzOCwKKyAtMjU1NywgICAtNzk1LCAgICA3NDcsICAgIDU0NiwgIC0yNDg4LCAgIDE4OTEsICAgIDQ4NSwgICAgNzI1LAorICAgMzM4LCAgIDE1NzksICAgMjA5MiwgICAyMzU0LCAgICAyODQsICAgMjgxMiwgICAgNDkwLCAgIDE0NDIsCisgICAxODcsICAtMjY5OSwgICAxMTk2LCAgLTE3ODMsICAgMTIyOCwgICAyMzY0LCAgMTMzNjQsICAgIDI1OCwKKyAgMjEwMiwgIC02MTYzLCAgIC0yMDAsICAtNTQ3NSwgICAyODA0LCAgIC01NzYsICAgNjg3OCwgIC0yODUyLAorICAyMjQ2LCAgIDExODYsICAgIDU4NCwgICAtMTM2LCAgIDUyNTgsICAgMzgyNSwgICAzMDQ1LCAgLTE2NjEsCisgLTUyNDYsICAgMjU0OCwgIC01MDU0LCAgLTQzODMsICAtMTU0MiwgIDEyOTEyLCAgLTE1ODAsICAgMTI2OCwKKyAtMTQxNSwgIC0yMDEyLCAgIDEwMjEsICAtMjEwNiwgICAgOTc5LCAgIDIzOTAsICAgMzQxMSwgIC0xMDc2LAorICAtNDM5LCAgIDU0MTYsICAgMTMzMywgICAgNDQwLCAgIDM0MjIsIC0xMzM4NCwgICAyNTQwLCAgIDI1NDQsCisgLTM2NjgsICAtMjMwOCwgICAxMDQyLCAgICA1ODksICAgNDE2NiwgICA1MDkwLCAgIDE1MzksICAtMzQ0NywKKyAgNzAwMywgIC00Mzk2LCAgICAzMTksICAgLTU5MCwgICAgNDgxLCAgIC00NzEsICAyMjI2MCwgIC0xOTM2LAorICAtMjk3LCAgIDEzMDIsICAgMTE2MywgICAgOTM3LCAgIC0xNjQsICAgIDg0NywgICAgNzY4LCAgICA4MjcsCisgIC00MzAsICAgIDc5MiwgICAgNDcyLCAgLTE1NTcsICAgIDcxMiwgICAtNjAyLCAgLTEwMDcsICAgLTI3OCwKKyAgLTk3NCwgIC0zMTk4LCAgMTA1NjAsICAtMjEyNCwgICAgMzM1LCAgLTEyMDYsICAgIDYyOSwgLTEzNzEyLAorICAgIDEyLCAgLTE2NzMsICAgLTY5MSwgICAtNjY2LCAgLTI4OTAsICAgIDgyNiwgICAxNzkyLCAgLTE1NDcsCisgLTIwMTYsICAgIDgwNywgICAxODEwLCAgICA4NDEsICAgLTgxNCwgICAxMjE0LCAgICA3NjAsICAtMTA1NiwKKyAgIDQwNCwgICAgLTk0LCAgICAxNDQsICAgIDI5NywgICAtNTg0LCAgICAxMDYsICAgIDExNiwgICAtMTMyLAorICAgMjM2LCAgIC01MDcsICAgICA4NiwgICAgODUzLCAgIC02NzAsICAgIDQxMywgIDMyNzY3LCAgICA3MzAsCisgMTA4MzUsICAgLTUwMiwgICAxMjk3LCAgLTM4NTcsICAtMTAzNSwgIC0xNjAyLCAgIC0xNjQsICAtMTcyMSwKKyAgMTQ2OCwgICAgNTA3LCAgIDEwNjQsICAgMTQ3OCwgICA0MzIzLCAgIC03NjAsICAgLTg4MiwgIC00MzMxLAorICAyNTY0LCAtMTA5MzMsICAgMzAwMCwgICAyMTAxLCAgLTI0OTIsICAgIC03MiwgIDEyNjM2LCAgIDI3NDMsCisgLTExMTMsICAtODMzNCwgICA2NzIwLCAgIDIzNDgsICAgIDQ5MSwgICAgLTIzLCAgLTEwNjUsICAgMTUwNiwKKyAgMjA5MCwgIC0xNzMxLCAgLTE5OTcsICAgIDY3NSwgICAgNDI1LCAgIDgxNjUsICAgIDY5NSwgICAyMjg1LAorICAtNDMzLCAgICA1MTUsICAgLTQ2NSwgICAtMzQ3LCAgLTEwMDYsICAgIDM1NywgICAgLTU1LCAgICAgNTcsCisgICA0ODEsIC0zMTQ5NCwgICAtODE2LCAgICAgNjAsICAgICA3NiwgICAtNDM5LCAgIC0zMjgsICAgLTIxNywKKyAgIDI2NSwgICAgMTIzLCAgICA4MzksICAgIDIxOCwgICAxMzU1LCAgICAyNDMsICAgLTg3OCwgLTEyODE5LAorICA1MTY4LCAgICAzMTgsICAgMTM3NiwgIC0yOTMxLCAgMTI2ODksICAgIC04MywgICAtMjIwLCAgIDI4NDgsCisgIC03NzAsICAgIDE1MCwgICAxNjMxLCAgIDE5NTUsICAgMTU1MiwgIC0xMzcxLCAgLTMwNTMsICAgMTc1MiwKKyAtNzI1MCwgICAgLTI0LCAgIC01MTQsICAtNTU2OCwgIC0xNTI5LCAgIC0xMTIsICAgIDQxOSwgIC0xMTM2LAorICAtNjcyLCAgLTE4NDcsICAtMTEzNiwgICAgIDkwLCAgICA0NTMsICAgNDgxMCwgIDEzMDEyLCAgLTIzNTUsCisgLTI0NzcsICAgMTM5MywgICAgNDUxLCAgIDMzOTAsICAgICAxMiwgIC0yMjI4LCAgIDE4NDAsICAtMjU0MywKKyAtMjQwNCwgIC0yOTY5LCAgICAxODYsICAgLTQ0NCwgICAgMjA0LCAgIC0yNjUsIC0xMTQ2NywgICAyMjA0LAorICAxODIxLCAgIDM1OTEsICAgICA2NywgICA4ODIxLCAgIDQwMTUsICAgLTE4MywgIC01OTAyLCAgLTE0NjgsCisgMTEzOTQsICAgMzA2MiwgICAtMTI4LCAgIC00NzYsICAgMjQ5NSwgIC0yODg4LCAgMTM0ODIsICAgIDY4NiwKKyAtMTMyMCwgICAgMzcxLCAgIC04ODQsICAgMTgyOSwgIC0xODEwLCAgICAzMzcsICAtMTEyNCwgIC0xNDQyLAorICAgNDMyLCAgIDE5NTAsICAtMTIwMywgICAgNjYzLCAtMTA0NDUsICAgMjMxMCwgICAgNzY2LCAgICAxMzcsCisgIDQ0MTgsICAgMjgyMSwgICAgMTM1LCAgICAxMTYsIC0xMjE2NCwgIC0zNTkyLCAgICA2ODYsICAgMjMxMCwKKyAgMTIyOSwgICAxOTMwLCAgLTE3NTYsICAtMTMwOSwgICAxNDM5LCAgLTM3NDEsICAgLTMwNSwgICAxNTQ3LAorIC05OTQwLCAgIDMxOTgsICAgMTMzMywgICAyNDAzLCAgLTI4NDcsICAtMzg5MiwgICAtMjU5LCAgLTE3NjYsCisgICA4ODEsICAxNDMxMCwgIC0xNzExLCAgIC04NDAsICAgMjI1OSwgICAzMDI3LCAgLTE1MjcsICAgMTE1NiwKKyAgMjkwNCwgICAgLTc1LCAgIC03MjgsICAgMTUzNiwgICAtMTI3LCAgICAxNTIsICAtMzI0MCwgICAtNzI2LAorLTExOTE0LCAgIDEwMzcsICAgLTg1MSwgIC0xODkzLCAgIC03NDgsICAtMzI5NCwgIC0xMTE0LCAgIDYwNzIsCisgICAxMDMsICAtMTUzOSwgICA0NTczLCAgLTE2MzcsICAgNTI0MiwgICAyNzA1LCAgLTk4OTAsICAgIDI1NCwKKyAtMTU2NSwgICAtNDA3LCAgIDE4MTgsIC0yMzAwNCwgICAxMTEwLCAgICAxMTksICAgIDI1NiwgICAtNzA3LAorICAtNDUxLCAgIC02NzksICAgIDM3NCwgICAtOTM1LCAgIC02NjksICAgIDQwMywgICAgLTEwLCAgIC01OTQsCisgIC01MjUsICAgMTQwMywgIC0xMDE2LCAgIC01NTMsICAgIDU5NSwgICAtMTY5LCAgIDI1MjMsICAgIC04MiwKKyAgIDk0NywgIDExNTcyLCAgLTExNjYsICAxMTY2OCwgIC00OTYyLCAgICA4NDIsICAgLTg2MCwgICAgIDg5LAorIC0zMzA4LCAgIC02NDAsICAgIDU1OCwgICAtODUxLCAgICA2MjIsICAtMTAwMiwgIC00OTMzLCAgIDI3NjIsCisgIDE5OTEsICAgLTEyMSwgICAxNDAxLCAgIC0xMTEsICAgIC00OSwgICAgODY4LCAgICAxMzUsICAtMTM5MiwKKyAgLTI3OSwgICAtNTYwLCAgICA0MTIsICAgLTI0MSwgICAxNDE0LCAgIC04MDIsICAtMTI1NiwgICAtMjk4LAorICAgNDQ3LCAgMTc3MzgsICAgLTMyMCwgIC0xMTUwLCAgIDE2NTAsICAgLTM5OCwgICA1NjI2LCAgIDYwNzYsCisgLTg5MTksICAgIDQ1NSwgIDEyNzE2LCAgLTIwOTQsICAgIDE1NywgICAxMzYxLCAgLTE1MTUsICAgMTQ5NCwKKyAtNjIxMCwgICAtNTUzLCAgLTE3ODUsICAgLTQyNCwgIC0zMDQ5LCAgLTQwNjYsICAtMTE4OCwgICAtNzMyLAorICAxOTkyLCAgLTE5MjYsICAgMTQ5NSwgICAxMDg1LCAtMjI0MzQsICAgMTE4NywgICAgMzkxLCAgLTE1MTIsCisgICA3NDcsICAgLTMxMywgICAtNTAyLCAgIDEzMzEsICAgIDQ1NiwgICAtMzIzLCAgICAyNDYsICAgLTU4MSwKKyAgICA1NiwgICAxNDQ4LCAgIDIwNzEsICAgIDUzNSwgICAgNzgyLCAgICA1MjAsICAgLTEzNiwgICAtMjkwLAorLTEyMzUwLCAtMTE4NTgsICAgLTQ1NiwgICAyMzQwLCAgIC0zMTAsICAgICAyMiwgICAyMjEwLCAgLTI1MzEsCisgIC0zOTIsICAgLTg5OCwgICAzOTE5LCAgIDEzNTQsICAgLTMzMiwgIC00MjU1LCAgICAxNjksICAgIDQyNSwKKyAgLTQ3NiwgICAyNTc3LCAgLTExNzIsICAgMTk4NCwgICAgMjY2LCAgICA1MTQsICAgLTUxNiwgICAyNDgxLAorICAgIDgxLCAgIDIxMDMsICAgLTcxMCwgICAgMjczLCAgIDE0MDUsIC0xNDgxMSwgICA1ODU4LCAgIDM2MjEsCisgIC05ODIsICAgIDM0NSwgICAyMDQ0LCAgICAxNTgsICAtMjA1MCwgICAtNjAyLCAgICA5NTQsICAgIDM0MiwKKyAgIDIzOSwgICAgMTU3LCAgIC0zMTcsICAgIC0zNSwgICAtMjYwLCAgICAzMDcsIC0zMTk3MiwgICAgMjI4LAorICAgLTc3LCAgICAyMjUsICAgLTE1NCwgICAgNjQzLCAgIC04ODMsICAgLTUxOCwgICAgIDMyLCAgICAzNzIsCisgICAyMDgsIC0yMjQ4OCwgICAtNDU4LCAgICA1MzAsICAgIDEwNCwgICAgMjU0LCAgIC03NzUsICAtMTI2NCwKKyAgLTU3MSwgICAgOTAwLCAgIC0yNjMsICAgLTMyMywgICAtMjk2LCAgICA5NjIsICAgIDUyMCwgICAgNTQ4LAorIC0yMTk2LCAgICAgNDIsICAgMTQwOCwgICAtMjExLCAtMTYxMTcsICAgMjA1MiwgIDEyNjU2LCAgIC04MjIsCisgICA1MDcsICAgIDMyMSwgICAtNzcyLCAgIC03ODYsICAgLTE0NCwgIC0zNTM5LCAgICA4OTIsICAtMzQzMCwKKyAgICAxOSwgIC0xODMxLCAgIDExNjEsICAgMTgzNiwgICAgOTg4LCAgLTExMzQsICAgLTcwNCwgIC0yOTk0LAorICAgNjkyLCAgICA3NjUsICAgIDQ1NywgICAxNjI0LCAgICA1MDIsICAgICAxMywgICAgMzY0LCAgICAzMzcsCisgMzIxMDgsICAgMTUxNywgICAtMjI1LCAgICAxODksICAgIDE0MSwgICAgOTg1LCAgIC01NzIsICAgIDI2MiwKKyAgLTE0NiwgICAgIDMxLCAgICAyMzYsICAgIDI2OSwgICAtMjc4LCAgLTE2ODYsIC0xMzk2OCwgICAxMjQ3LAorIC0xMDA5LCAgIDEwNDYsICAxMzQ2NywgICAxMjc2LCAgIC0yNjgsICAgIDMwNywgIC0xMzgzLCAgIDE1NDQsCisgICAxMzYsICAgIDk0OSwgICAgIDcwLCAgICA0NDYsICAgMTM5MSwgIC0yMTg4LCAgICA3NDUsICAgLTM3NCwKKy0xNDIzMSwgICAtNzEyLCAtMTUyMDIsICAgLTUzMywgICAtMTA4LCAgLTIyNDQsICAtMTIzMiwgICAgNDUwLAorICAtODk1LCAgIDEwODYsICAgLTc4MiwgIC0xMDgyLCAgIC03MTgsICAgLTY2MCwgICAgNzk2LCAgLTIwOTUsCisgIDI3MjIsICAgLTQ2OCwgIC0xNzE3LCAgICAxNDcsIC0yMzU2NiwgICAgMzc3LCAgIC0yMjAsICAtMTczMSwKKyAtMTQxNiwgICAgNDg2LCAgIC0yNDEsICAgIDI2NiwgICAtODAyLCAgIC0zMjIsICAgMTA2NiwgICAtNTQ0LAorICAtMTY3LCAgICA1MjAsICAtMTI5NywgICAtMTAwLCAgICA2MjIsICAgIDY3MCwgICAtMTg4LCAgICA3MTEsCisgICAgMzIsICAgMTE1NSwgICAgNjI4LCAgICAzNTAsICAgLTExMiwgICAtMTU0LCAgLTEwNDgsICAgIC00NCwKKyAgICAzNiwgICAtNDU0LCAgICAzMDQsICAzMjc2NywgICAgMzU2LCAgICA0NjIsICAtMTE5NCwgICAgNTQ5LAorICAgMTM4LCAgICAgIDAsICAgMTA0NCwgICAtMTE5LCAgICAxOTUsICAgMTA5OCwgICAgNTIxLCAgIDMyOTQsCisgLTM3NzYsICAgLTIyNCwgICA0Mjk3LCAgLTEyNTYsICAgLTMwMywgICAyMTA3LCAgICAzMDAsIC0xMzI4MywKKyAgMjkzMywgIC0zMTk0LCAgLTE0MDgsICAtNDE1MiwgICA0MTk1LCAgICAyODcsICAgLTkzMiwgICAxMjQ3LAorIDEzNDUzLCAgICAyNzcsICAgIDQxOCwgICAtNTk4LCAgICAgODcsICAgMTEzMiwgICAgLTgwLCAgIC00MDUsCistMTM0MDAsICAgIDY1NiwgIC0xMzEwLCAgLTE0NDcsICAtMzk3NCwgICAxNzE5LCAgICAzMTMsICAgIDUwMCwKKyAgMTA3OCwgICAtMTE0LCAgIDE0NDksICAgLTI5MywgICAtMTIwLCAgLTQ3NTQsICAgNTU4MywgICAgMjM1LAorIC01MTQwLCAgIC04NjUsICAgLTQ4NCwgIDE1NTcyLCAgICAzMzYsICAtMTg1NCwgICAtMTU0LCAgIC00NTQsCisgLTE0NzUsICAgLTcyNiwgIC0zNzE4LCAgLTQwNDgsICAgMTU3NSwgICAgNDgwLCAgIDEwOTQsICAtMjIwOSwKKyAtMzIwMiwgICAgNDIwLCAgIC01NjQsICAgIC00OCwgICAgOTY0LCAgLTI2NjcsICAgMjE3MiwgIC0xNjY2LAorICAgMTEyLCAgIC03MzAsICAgIDIwMywgICAzNjE4LCAtMTU4NTcsICAtNDg1MywgICAgIDQ4LCAgLTEwODQsCisgIDE1MTIsICAgLTkzNywgICAzMzUzLCAgIC00NTMsICAgIDIyMywgICAyMjY3LCAgICAxMzksICAgIDE5MCwKKyAgMTk1OSwgICAtNzIwLCAgIDQzODksICAgIDY4MSwgIDEwMzgzLCAgIC0xMTIsICAxMjM5MCwgICAtODgyLAorICAxNjk1LCAgIDM1MzksICAgLTE2OSwgICAzMTMxLCAgIC0xMjIsICAgMzYyNywgICAgMjUyLCAgICAxODUsCisgIC01MjMsICAgIDExMiwgICAtMjE5LCAgICAyMTQsICAgLTE4MiwgICAtMTAyLCAgICAxMTgsICAgIDIzMCwKKyAgIC02MCwgICAtODAxLCAgICAtMjUsICAgICA0MiwgICAtMjc5LCAgICAyNjIsIC0zMjM1OCwgICAgMzQ0LAorICAtNTQyLCAgICAzODIsICAgLTIyMywgICAtNDA0LCAgIDEyMDEsICAtMjY0NiwgICAtMTYzLCAgIC04MDMsCisgIDMwNDEsICAtMTAwOSwgICAzODE4LCAgICA3NTYsICAgNTgzNCwgIDE0MjQ5LCAgLTE4MjgsICAgIDEzOSwKKyAgLTIxOCwgICAtNjU4LCAgLTEzMTQsICAtNDk4MCwgIC0zMzIyLCAgLTE0NjEsICAtMTU5OCwgICAgLTkxLAorICAyNDY0LCAgIC05NTQsICAtNTIwMywgICAtNzkxLCAgIDEzMzksIC0xMzU5OCwgICAgNTk0LCAgICA3MDIsCisgIC0zODgsICAtMTExNSwgIC0yMzc3LCAgIC0zNzAsICAtMzY1OCwgIC0zMzIyLCAgIDE4NzEsICAgMjUxMywKKyAgMjkxMCwgICA0MDk1LCAgLTIxOTUsICAgNDI5MSwgICAgODg2LCAgIC01NjcsICAgMTE4MiwgICAtMzAyLAorICAtNjcyLCAgICAtMjEsICAgLTI2OCwgLTI5MjQ0LCAgIC0xOTksICAtMTAyNCwgIC0xMjg0LCAgICA0ODUsCisgIDE0MzIsICAtMTA4NiwgICAgMTE5LCAgIDEwMzAsICAgIDQxOCwgICAtNjQzLCAgLTExNjUsICAgMTg0NywKKyAgIC0zMCwgICAtODQ0LCAgIC05MDksICAgLTQxNiwgICAtNjA0LCAgIC02MDksICAgLTI4OSwgICAtMzkxLAorICAtMjM4LCAgICAtOTQsICAgLTM5MSwgICAtODEwLCAgICA0MTMsICAgIDM1NiwgICAgOTU0LCAgLTE5MzUsCisgMzA5OTYsICAgIDQ0MSwgICAgMTM4LCAgIDEzODEsICAgMTEzMCwgIC0yMzEzLCAgICA1NTgsICAgLTIwMywKKyAgLTI0OCwgICAtOTUxLCAgICA0MDgsICAgMTgxNSwgICAgMjU2LCAgIC00MjksICAgLTg5MiwgICAtNjk1LAorICAxMTM4LCAgICA0MzksICAgLTc2MCwgICAgLTYzLCAgIDY0OTgsICAgIDU3MCwgIDE1MjUyLCAgLTMzOTcsCisgICAxNzAsICAgIDkzNSwgICAgMzM4LCAgICAgIDEsICAgLTUyOCwgICAgNTI0LCAgIC01NDEsICAgLTI4MSwKKyAgICAtMywgICAgNDk5LCAgIC0zMzMsICAgIDY4NSwgICAgNDM2LCAgMzIxNzYsICAgIDM4OSwgICAtMTUzLAorICAgNTcyLCAgICAyNTYsICAgICA1MywgICAgIDE2LCAgIC05MDIsICAgIDcyNCwgICAyODQ5LCAgIDI1MDMsCisgICAgODAsICAgIDY2NywgIC0xODY3LCAgICA3NDIsICAxNTIwNSwgIC04NzE1LCAgLTI1ODgsICAgLTQ3NiwKKyAgLTQ1MCwgICAtNzMzLCAgIC04OTEsICAgMTE3OCwgIC0xNzUxLCAgLTE2MzAsICAgLTExNCwgICAgMTQ0LAorICAtMTM4LCAgMTAxNDUsICAgLTE4OCwgIC0xNjA4LCAgIC0xMzEsICAgLTI0NywgICAtNTQ0LCAgIDk3NzQsCisgIC02MTAsICAtMjg2OCwgIC0zNDcyLCAgICAzNDUsICAtOTI5NCwgICAzNzI0LCAgIDI2MzQsICAtNTEyNCwKKyAgLTM5MiwgICAyNTUxLCAgIC02NDksICAgIDc4MiwgICAgLTE4LCAgIC0xNjAsICAgLTM1MSwgIDEyMDc0LAorIDEzODY1LCAgLTEyOTQsICAgMTI2MiwgIC0zMTM1LCAgLTI4NjEsICAgICAxOCwgICAgNzUzLCAgICAxNjcsCisgICA2MjAsICAtMjQzMiwgICAxOTk4LCAgICA3NDAsICAgMTkwMiwgICAgNDAwLCAgIC0yMDYsICAgMzUxOCwKKyAtMzU2MywgICAtNjMyLCAgICAgNzIsICAtMTgxMCwgICAxNTIwLCAgIC04MjcsICAgLTU3MiwgICAxNjA0LAorICAtNjEzLCAgIDM3MDQsICAgLTczNiwgIDExMTAwLCAgMTI3MDIsICAtMzE4OSwgICAtNzkyLCAgLTM1NTIsCisgIDE2MjEsICAgMTg0MSwgICAxMjM2LCAgIDEyMTUsICAgLTQ1NywgICA5NTQyLCAgIDkyNzgsICAgMjYzMywKKyAtODgwMSwgICAgODYyLCAgIDE3NDEsICAtNDg0MCwgIC0yNjIwLCAgICA2MTYsICAgIDMyNCwgICAyMTUyLAorICAzNjMyLCAgICA4ODAsICAgLTQ3MiwgICAxOTI3LCAgLTM0NTYsICAtMjEwNSwgICAtOTY1LCAgIDM0MjYsCisgLTE4OTMsICAgMzA5NSwgIC0xMTUyLCAgLTM1NDIsICAgIDE4MiwgICAgOTk4LCAgIC0zODYsICAgMTIwMiwKKyAgIDQ4MSwgIC0xOTUxLCAgIC01MTAsICAgLTkzMSwgICAxNjg4LCAgICAxNTEsIC0xMzY2NCwgIC0zODk0LAorICAtOTczLCAgIC05MDYsICAgMTUyNCwgICA5NTc2LCAgIDI2MDcsICAxMjQ5NywgICAtODE5LCAgLTUyMTQsCisgIDU5MzYsICAgLTYzNCwgICAtNjEwLCAgLTQxNDgsICAgLTQyMSwgICAtNDg2LCAgLTE4NjQsICAgLTMwNiwKKyAgMjQyMSwgICAgNzI0LCAgIC0yMTksICAtMTMwNCwgIC0yMTA2LCAgIC01MDQsICAgNjc2MiwgICA1MjY2Cit9LAorCisuY2IxMTEwbDEgPSB7CisgLTI5NzIsICAtMTIwMSwgIC0xMzg4LCAgLTE3NjIsICAgIDM0MCwgIDIxMTI3LCAgIC05OTksICAgIDEyNiwKKyAgIDExMSwgIC0xMjI0LCAgLTE3MzgsICAgIDMxMSwgICAtNzEyLCAgIC00NTAsICAgLTExNCwgICAtNjQ4LAorICAtNzUyLCAgIC0xNzIsICAgICA2NywgICAgMzc1LCAgIC05NjcsICAtMTAzMiwgLTEwNzYzLCAgLTE4ODUsCisgLTIyMjMsICAtMzI1OCwgICAgNDgwLCAgIC0yMjgsICAgLTE0MywgIC0xMjk5LCAgMTMxMjgsICAtMzA2MiwKKyAgMTQxOCwgICAgICA2LCAgIC02NDksICAtMTgxNiwgICAtMjg4LCAgICA3NjcsICAgIDM0NSwgICAgODc2LAorICAtNDkxLCAgICA5NDgsICAgIDU0MCwgICAtMTY3LCAgIDE5NjksICAtMTg4MywgICAtNDU1LCAgMjA1ODQsCisgIC02NTYsICAgIDExNCwgICAgMzA4LCAgICAyNzksICAgMTEwNSwgICAtNTk0LCAgIDEzMzIsICAgIDI1NSwKKyAgLTM1NiwgICAtMTg2LCAgIC01NDAsICAgMTg5OCwgICAtODczLCAgIC00NzcsICAgMTQwNCwgIDMwNDc1LAorICAgMzcwLCAgIC0zMjIsICAgLTMzNywgICAtMjA2LCAgIC00NDAsICAgLTg5NCwgICAgLTU0LCAgIC00NjYsCisgIC02NDAsICAgLTQwOCwgICAtMjU2LCAgIC01NjAsICAtMTUwMywgICAgNjI2LCAgIC01NzMsICAtMTY4NCwKKyAgIDQxOSwgICAgNDA3LCAgIDIwNzYsICAgNTAyMiwgICAzMTQzLCAgLTExMzUsIC0xMjExOCwgLTEyMDgyLAorIC0xNDYyLCAgLTIwNjAsICAtNTQzMiwgIC0xMDkyLCAgIDE1NzUsICAgMTk1OCwgICAtOTY4LCAgICAxMjIsCisgICA5NTgsICAtNTMxMiwgICAgNjc3LCAgLTE5NTIsIC0xMjI3NiwgIC0xNTk0LCAgIDEyMTEsICAtMTA5NCwKKyAgMTk5MiwgLTExMDMyLCAgLTI5OTMsICAgLTgzNCwgIC0xMjk3LCAgLTExMzksICAgIDMxMiwgIC0xNTQ2LAorIC00MjUzLCAgIDExOTEsICAgICAyMSwgICAyNzcxLCAgICA2MzksICAtMjUxNCwgICA2NjIzLCAgICA3NDYsCisgIDE4MzAsICAgMjk2NywgICAxNjg4LCAtMTQ4OTMsICAgNzk4OCwgICA0MDk5LCAgICAtOTcsICAgMTE2NSwKKyAtMjM1MCwgICAgIDY1LCAgLTEzMDgsICAgMTgzNCwgIC0yMDg0LCAgIDE2ODMsICAgNTExOCwgIC0xNjMzLAorICAgLTEwLCAgLTUyODIsICAgIDQwMywgIC0xNDg5LCAgIC0yNjQsICAgIDM5OCwgIC0yNDIwLCAgMTI4NTQsCisgLTE0OTgsICAtMjY0MiwgIC0xNDg2LCAgICA4MjYsICAgIDY5OSwgIC0yMjEzLCAgLTIyOTYsICAxMTg0OSwKKyAgIDQ3OCwgIC0yMjAyLCAgIC01NjEsICAgLTI1MCwgICAgMTk5LCAgLTI0MzMsICAgLTk0OCwgICAtNDAyLAorICAgNDMzLCAgICA0MDMsICAxMzAzMSwgICAtMTI0LCAgIC0xODAsICAgMTQ5OSwgICAtNjQzLCAgICA1MjcsCisgMTEzNjgsICAgNTgzMywgICAgOTM4LCAgIDMyMDIsICAgLTQ1MiwgICAyODc1LCAgLTExNjMsICAgLTExNywKKyAtMjA0NywgIC0xMDY4LCAgICAyMTEsICAgMzEyMiwgICAtMjM2LCAgMTM1NDgsICAgLTcwMiwgICAgMzUyLAorICAtMzEyLCAgLTE5MDEsICAtMjE0NSwgICAyMzM0LCAtMTIxMDAsICAgIC03NiwgICAtNDE5LCAgICAzNjIsCisgIDM1MDEsICAgLTIyMCwgIC0zMDg2LCAgICA1NzIsICAgMTUzNywgICAzMjQwLCAgLTE0ODksICAtMTAxMiwKKyAgIDY0MCwgICAtNTEzLCAgICA5MzAsICAgIDM5MCwgIDMxMDE5LCAgICA3MjQsICAgIC03OCwgICAtNzA2LAorICAgMTgzLCAgIC0xNTcsICAgLTEyMiwgICAtODQ3LCAgLTExNTYsICAgIDMwMSwgICAgNTA4LCAgIC00NTYsCisgICAzMjEsICAgIDMxNywgICAxMzAwLCAgIC01MTIsICAtMTc0MywgIDEwMTkwLCAgIC0yOTQsICAgLTExNiwKKyAgNDE4MywgICAxMzc0LCAgMTMzNjAsICAtMTMzOSwgICAxODMyLCAgIDI1NDcsICAgLTcwMiwgIC0yNzgyLAorIC0xNDY0LCAgIDExNzYsICAtMTI4NywgICAyMjU2LCAgIDIxNjksICAgIDgzNiwgICAyMDk2LCAgIC0yNDgsCisgIDE3NzcsICAxMTMwNiwgICAtMjExLCAgICAyNjUsICAtMzgzNCwgICAgMzM2LCAgIDE5MzYsICAgLTU4NiwKKyAgIDYzMywgICAxMDM3LCAgLTE5MTUsICAxMjg2MiwgICAgOTMwLCAgIC0yNzMsICAgMjMzMywgIC0zMjM5LAorICAgNDI5LCAgICAzNzQsICAgMjUxOCwgICAtNjcxLCAgICA1NzAsICAtMjIwOCwgICAgMzg1LCAgIC0yODQsCistMTU2MTMsICAtMTc1MiwgICAxMzQxLCAgIC01MzEsICAgLTc0NCwgIC0xMTExLCAgICAyOTAsICAtMjMwMiwKKyAtMTAxMiwgIC0yOTMzLCAgIC0zNjYsICAgIC0zMCwgIC00NTk1LCAgIDE0MDAsICAgIDU2MCwgICAgIDQ4LAorIDE1NzM5LCAgIC05NDUsICAgIDQxMSwgICAxODc2LCAgIDI0NDEsICAtMjE0NCwgIC0xMjIyLCAgMTI0NDgsCisgICAgNTQsICAgLTcyNiwgIC0yNzQzLCAgIDI1NDgsICAgMjEwMCwgICAxMzA3LCAgICA0MDgsICAgLTE5OCwKKyAtMTgwMiwgICAgLTYzLCAgLTE5MTksICAgIDkzMywgICAtMzI5LCAgIC01MjgsIC0xNTkxOCwgICAxNzA0LAorICAzMDI4LCAgICAyMTcsICAgIDYwNiwgIC0yODA0LCAgIDIwNTIsICAgOTMyMCwgICAgNTkyLCAgICA5NjksCisgIDY4MzYsICAgIDY0NywgICAtNjcxLCAgICA1ODQsICAgICAtMSwgICAzNTY0LCAgLTI1NzUsICAgIDQzNiwKKyAtMjE5NSwgICAgNDE0LCAgIC0yMDEsICAgMTA5OSwgICAtNzcyLCAgIC0yMjAsICAgLTU3OCwgICAtNDY3LAorICAgMTI1LCAgIC05MzQsICAgIDI3MSwgLTIxNDc2LCAgICAyODgsICAgIDIxNSwgICAgMjE2LCAgICA0NzYsCisgIC01NjAsICAgIDc2OCwgICAxMTQyLCAgIC0xNjksICAtMTExMiwgLTE0MDk2LCAtMTQ0MzYsICAgMjc2OSwKKyAtMTQ2NCwgICAgLTYxLCAgIDEzNzMsICAtMzUzOSwgIC0xMDY3LCAgIDExNzUsICAtMTU0OSwgICAtODYxLAorICAtMzMyLCAgLTE4NzYsICAgMzE1OSwgICAgMzQwLCAgIDE3MTEsICAtMjQ1MywgICAgNDU3LCAgIDI1MzYsCisgIDExMTQsICAtMjI3OCwgICAyNDY0LCAgLTMyNTMsICAgLTQ2NiwgIDEyMjkxLCAgMTI0ODQsICAtMjg2OCwKKyAgLTgwMCwgICAxMTQyLCAgLTQyNDQsICAgLTE3OCwgICAzNzgxLCAgIDE1NDIsICAgLTY2MywgICAxOTc2LAorICAzMTA1LCAgICAxNDUsICAgLTEwMCwgIC0xNzc0LCAgLTEwMzksICAgMTYyNywgIDE1NTQwLCAgIDQxOTQsCisgIDUzOTIsICAgIDc0MSwgICAxODE2LCAgIC01NDQsICAtOTEwMCwgICA0MjU1LCAgLTEwODMsICAtMTI2NiwKKyAgMjU4MCwgIC00MjAwLCAgIDE5MzQsICAgMTcyMSwgICAgMTI5LCAgIDIyNzYsICAtMjcwNCwgIC0xMzQxLAorIC0xMzEwLCAtMTE5MjYsICAtMTQ3OCwgICAgMTk5LCAgICA3NTUsICAgIDYxOSwgICA0MjMxLCAgIC00NzgsCisgLTE2MjcsICAtMTI0MiwgICAxODQyLCAgMTMxNzAsICAtMjQxNiwgICAgNzc4LCAgICAxOTIsICAgIDI3MywKKyAgIDc4MiwgICAgNzc0LCAgIDIxODgsICAgLTgzOCwgICAzMTM5LCAgLTE1MzIsICAtMTYzOSwgIC0xMDczLAorICAtNTk2LCAgICA3NzAsICAgLTM1MywgICAgLTUzLCAgICAgODIsICAgLTMyMiwgLTIwNTg0LCAgIC0zNDQsCisgIC00NDMsICAgIDE1OCwgICAtMTQ0LCAgIC01NTQsICAgICA1MCwgICAgOTU0LCAgIC0xNDUsICAgLTMzNiwKKyAtMjA1MCwgICAgNTk2LCAgIC05NTAsICAtMjY5MCwgIDEzOTA4LCAtMTM3ODMsICAgNDc5MiwgICAgODc5LAorICAgNTg0LCAgLTI5ODcsICAgIDk2NywgICAgMTkyLCAgIC01ODUsICAgLTc4MywgIC0xMzQxLCAgLTMxMDgsCisgLTE2MjIsICAgMjQ3OCwgIC0xMzYyLCAgLTE0NzAsICAtMTU1NiwgICAtNDMwLCAgIC0xMTAsICAgLTczNiwKKyAtODA5NywgICAyMDczLCAgICA5NjQsICAgLTQxNywgICAxNjY5LCAgLTU0MjUsICAtNzg0NiwgICAgNTM2LAorIDEyODgzLCAgLTE2OTAsICAgMTE0MywgICAtMjQyLCAgIC00MzgsICAtMjI3NCwgICAgIDU3LCAgICAzMDIsCisgIC01NzQsICAgIDYzNywgICAyODE2LCAgLTE2NDIsICAgMjE2NiwgICAtMTcyLCAgICA4OTMsICAgIDQyMSwKKyAgLTYxNCwgICAtNTY1LCAgIC0zMzgsICAgLTUyNiwgIC0xMDg1LCAgIC05MzksICAtMTEzOCwgICAtOTkxLAorICAxOTE5LCAgIDE3MjAsIC0xODg0NSwgIC0xOTUwLCAgIC0zNDIsICAgMTkzMCwgICAgMzIxLCAgICAxODQsCisgIC05NTYsICAgLTM3NCwgICAtNDYyLCAgIC0yMTYsICAgICAtNiwgICAgIDI2LCAgICAzODYsICAgIC01MCwKKyAgIDYwMywgICAtNzIwLCAgICA2MzQsICAgLTI1MiwgICAgMjYxLCAgIC04NjAsICAgIDIxOCwgIDIyODQ2LAorIDExNTQ0LCAgIC00NTksICAgLTk0NiwgICAgNDUyLCAgIC0xMDIsICAtMTIwMywgIC0xODAyLCAgLTExMDUsCisgIC0zMTAsICAgIDc4NywgICAtMjIwLCAgLTExMTMsICAtMjA0MywgICAgNjUwLCAgMTM3NjcsICAtMzYzOCwKKyAgLTI5NiwgICAtOTAyLCAgIC00MTMsICAgIDI1MiwgICAtODE2LCAgIC0xNzIsICAgLTUwNSwgIC0xMzM1LAorICAgODkwLCAgICA3NjgsICAgLTUyMywgICAgODA4LCAgIC0zMzEsICAyMDAwMCwgICAtMjY0LCAgIDE3NjMsCisgICAxMzMsICAgICAtMSwgICAtNDY0LCAgICA5NDksICAgLTk1NCwgICAtMTQ3LCAgIDE3ODAsICAgLTE5MCwKKyAgICAzMCwgIC03NDIyLCAgLTQ2MTUsICAtMTAwNiwgICAtNDcwLCAgIC03NDIsICAgIDUwMCwgICA3NTA5LAorICAxNTAwLCAgIDE1NTAsICAtMzYxNCwgICAgODEwLCAgIDI1OTUsICAgMTUwNiwgLTEyOTI2LCAgIDM1ODgsCisgICA0MDIsICAtMjU0NywgICAxNTA1LCAgICAgNjUsICAgICAgNCwgICAzMzgyLCAgLTIyMDEsICAtMjQ0MSwKKyAtMTUyMSwgIC01NDUwLCAgLTM4MjAsICAgIDI4MiwgICA1MjEyLCAgIDExODYsICAtMTA1NiwgIC0yMzM0LAorICAgOTg4LCAgMTI5ODcsICAgIDM5MCwgICA0MTQxLCAgLTI2ODAsICAgMTY2MywgIC04MDM0LCAgLTE3OTIsCisgIC0yMjUsICAgLTY3NCwgIC03MTQ3LCAgMTMyNTQsICAgMTYzMSwgIDEwMTYzLCAgLTMzMzIsICAgICAtNywKKyAgLTY3NSwgICAtNzM1LCAgICA3NzIsICAtMjI5OSwgICAtMzI2LCAgIDE2NDEsICAtMTE3NCwgIC0xOTExLAorICAgIDgyLCAgICA3NzYsICAgIDg5MSwgICAtNDQ1LCAgMTg1OTAsICAgIDIzOCwgICAxNDE3LCAgLTIzNzIsCisgLTk3MTgsICAtMjY4MiwgICAgNjAwLCAgLTE0MDEsICAgIDYwNCwgIC0xNzkxLCAgICAtMjIsICAgMTU0NiwKKyAtMTc2NCwgICAgNTI1LCAgLTEzNTUsICAgIDM0OCwgICAzMjYwLCAgIDExMTUsICAgIDIwNCwgICAgNTI0LAorICAgMjI1LCAtMTI3NzYsICAgLTY3OSwgLTE1NTk1LCAgLTExODgsICAgMTA3OCwgICAgIDgyLCAgIC04NTksCisgICAgMjgsICAgIDgxOSwgIC0xMjIwLCAgICA1NjMsICAgMjMwOSwgICAgMzMxLCAgLTExNTgsICAtMjAxMCwKKyAgLTI2NCwgICAtMzgzLCAgIDE3MzIsICAgLTQyNCwgIC0yNzQyLCAgIC03NzUsICAgLTMyOSwgICAgMTMyLAorICAgMzkxLCAgIDEyNjEsICAgMTAzMywgIC05ODEyLCAtMTE4MjksICAgMjQzMywgICAyNjkwLCAgICA2MDYsCisgLTI3MjQsICAgNzIxNiwgICAtMjk2LCAgLTE4MzQsICAtMTY5NCwgICAgNDU2LCAgLTQ3MzIsICAgLTQwMCwKKyAtMzE5MiwgICAxNDI4LCAgIC0zMTYsIC0xMzY3NCwgIC0yNzAyLCAgIDIzMjAsICAtNjU0OCwgIC0yMDI1LAorICAxMjIyLCAgIDE3NDksICAgNDAwNSwgICAyOTI0LCAgLTM1MzksICAtNTEwNCwgIC0yMzMzLCAgLTE0MzgsCisgIDI1OTgsICAgICA2MiwgICAtNzU3LCAgICA3NjAsICAgIDM0MywgICAgMTU0LCAtMzE5NDcsICAgLTUzNCwKKyAgMTI5NiwgICAgNjk3LCAgICAgODgsICAgIDM0NSwgICAtNTc3LCAgIC01MDAsICAgLTE3NCwgICAtMzI2LAorICAtMTk4LCAgICAyNzIsICAgIDE1NywgICAtODE1LCAgIC02MzYsICAtMTE2MywgICAtODY3LCAgIC0yNzMsCisgIDEwNTQsICAgIDc3NCwgICAxNjI0LCAgICA5ODksICAgIDEwNywgIC0xMDg4LCAgIC02NzMsICAgMjE0MywKKy0yMjk2MiwgICAtNTY2LCAgICAxNTEsICAgICA3MiwgICAgLTI3LCAgIDEwMzQsICAgLTQ0NCwgICAgNTAxLAorICAxOTA1LCAgLTE0NTUsICAgICAyMSwgICAgMjg5LCAtMTA2NzAsICAgLTc4OSwgIC0yNDIxLCAgLTI2ODYsCisgIC0zMjcsICAgIDgwNCwgIC0zMDA5LCAgICA5MDcsICAgIDk2MCwgICAxMzc5LCAgICAtNDMsICAgLTU1MiwKKyAgMjIwMywgIC0xNDA2LCAgIC05MTEsIC0xMTA5NCwgICAtNTI5LCAgIDQ0NTgsICAtNDE1MiwgICAgLTcwLAorICAzMTYyLCAtMTI1NDYsICAgIDMyNiwgICAgODc0LCAgIDE0MjYsICAgMzAxOSwgICAyMzE1LCAgICAxMDQsCistMTI1MTYsICAtMTU5MSwgIC0yODc3LCAgICA3NzIsICAgMTk4MiwgICAxMTYwLCAgLTQ0OTEsICAgMzQxNywKKyAtMTUyNCwgIC0yMTM5LCAgICAxMzAsICAgIDkzMCwgICA5MzU5LCAtMTgzMDgsICAgLTM3NiwgICA0MDkwLAorICAtNDY4LCAgICAxNTYsICAgLTIxNiwgICAgIDYwLCAgIC02NDMsICAtMzQ0MCwgICAgMjU2LCAgIC04MzUsCisgLTIzODksICAgMTY2MCwgICAtNTQyLCAgLTE2MjgsICAgNDI3MCwgICAzNTc0LCAgLTMxMzYsICAgIDQzMywKKyAgMTA2OSwgIDMwMDI0LCAgICA1NjEsICAgIDI2OCwgICAgNzkwLCAgICAyOTQsICAgIDIwNywgIC0xNTUyLAorICAtNzM2LCAgICAtOTcsICAgLTIxNSwgICAgLTk4LCAgICA2OTAsICAgIDY4NiwgICAtMjAyLCAgIC03MzYsCisgIC00NTMsICAgIDY1NSwgICAgNTExLCAgIC0xNTYsICAgMTAwNiwgICAgMzYxLCAgIDE0MjQsICAtMTI1NCwKKyAgLTM2MSwgIC0xMjUzLCAgLTE0MTksICAgLTI5MCwgICAgIDc4LCAgICA1NTUsICAgIDU2NSwgICAtNDg4LAorICAtOTIzLCAtMTgxOTMsICAgLTYzMCwgICAtOTA4LCAgICAxODgsICAgIDkyNSwgIC0xNjg0LCAgICAyNDEsCisgIC0zMTksIC0xNDQ3OCwgIDE3MDA3LCAgLTE0MTUsICAgIDI3NCwgICAgNTkyLCAgIDEzNDQsICAgMTc4NCwKKyAgLTczMSwgICAgMzQ0LCAgICA5OTIsICAgIDE0MSwgICAgMjkwLCAgICA0ODEsICAgIDYyOCwgICAgNjIzLAorIC0xMTY2LCAgLTIwOTIsICAgIDE0MCwgIC0xMDU2LCAgMTM3MzYsICAgIDc1NCwgICAxOTgwLCAgIC0yMzgsCisgIDIxMzIsICAtMTM3MiwgIC0yMjE2LCAtMTIwNTcsICAtMTY2MiwgICAgIDY2LCAgIDE3NDIsICAgMjIwOSwKKyAgLTk2MiwgIC0xNTc0LCAgLTMwNDQsICAgIDE3MywgIC0zMDY2LCAgICAxODMsICAtNDQ3NiwgIC0xMDE2LAorICA2MTYwLCAgICA3ODAsICAtMTE5MywgIC0zMzM0LCAgICAxNzksICAgLTM3MSwgICAgMjQ0LCAgICAxNjAsCisgIC02ODYsICAgIDY2OSwgICAgMzMwLCAgICA0MjYsICAgICA2NSwgICAgMTU5LCAgIC02NjQsICAgLTE4NiwKKyAgIDQ3OSwgICAtNzQyLCAgICAgNTQsICAgIDYwNSwgIDMyNjAzLCAgIC05NDEsICAgIDM3MCwgICAgLTkxLAorICAgODU2LCAgICA4MjUsICAgMTA0MiwgICAgMzc0LCAgICA2NTEsICAgIDMxMywgICAgNzM0LCAgIC0yNDAsCisgICAtNDksICAgLTY4NSwgIC0xOTk0LCAgIC02MDQsICAgLTg3NSwgICAgIDQ0LCAgIC04ODQsICAgIDg4NiwKKyAxMzAxMiwgIC0xNTA2LCAgLTQzMTcsICAtMTkyNiwgICAzMDUwLCAgLTEwMjcsICAgLTQ4MiwgICAgLTQwLAorICAgMTM3LCAgLTI1NjAsICAgMTM2NiwgLTExODEyLCAgIDIxMTIsICAgMjI2NiwgIC0yNjkwLCAgLTEzMzksCisgIC03MDAsICAgLTI0MywgICAyMzIyLCAgLTEwNDIsICAgNDYzNSwgIC0zMjEwLCAgIDQyODEsICAgICA0NywKKyAgIDY3MCwgICA5MjE4LCAgIDExNjUsICAgIDgxNCwgICAgLTYyLCAgLTIyNzYsICAxMjk4NywgICAtNzE0LAorICAyNDgxLCAgIDEzNTUsICAgIDg5NiwgICAyODQwLCAgLTE2NjQsICAgMjA0OCwgICAtMzQ1LCAgIDIyODUsCisgIDE3NTQsICAgLTY2OSwgICAyMjg0LCAgIC0yODgsICAgLTU3NSwgICAgOTQ0LCAgLTE1MjgsICAgICA0NCwKKyAgMTA3MSwgICAtNzA2LCAgIC01NDMsICAtMTM0NywgICAgODgwLCAgICAyNTcsICAgMTM2NCwgICAxNDQ0LAorLTE3ODk2LCAgICAgOTksICAgMTUzOSwgICAxODEzLCAgIC02MTEsICAgIDM1NSwgIC0yMjkwLCAgICA5ODAsCisgIC03ODcsICAgIDEzMiwgICAgMzAwLCAgIDIzNTMsICAgIDIwNCwgICAtNzk4LCAgIC0yOTYsICAgLTU5NCwKKyAgIDg5NSwgICAgODQyLCAgMTg3NTUsICAgMTEyOSwgICAgIDc5LCAgIC0xODksICAgIDUxNSwgICAgODgyLAorICAtMjg2LCAgICAxMDksICAgIDMwNSwgICAgMzc0LCAgIDEzMjMsICAgIDg2MSwgICAgLTE4LCAgICAtNzgsCisgICAyOTQsICAgLTMyMCwgICAgNjc0LCAgICA1MDQsICAgLTE1OSwgICAtNTQ5LCAgICAtOTUsIC0zMjQwMywKKyAgIC05MCwgICAgNjU4LCAgIDEwODIsICAgMTYxMSwgICAtMTM3LCAgICAtNzQsICAgMTE2MCwgICAtNzk0LAorICAgLTU1LCAgICA4MjIsICAgMjYyNywgICAxMjAzLCAgLTM1NDAsICAgOTgyOSwgIC03ODYwLCAgLTkwNjMsCisgLTQwMTUsICAgLTg5NCwgIC0yMjE4LCAgICA3MjksICAgLTg3OSwgIC0xODY5LCAgLTI0NDYsICAgNDA1MCwKKyAgLTQ4OCwgIDEzMjExLCAgIC0yOTAsICAgLTgyMCwgICAgMzcxLCAgMTQxOTYsICAgIDg2NiwgICAtODkxLAorICAgMjE4LCAgLTE4MzgsICAgMjE2MiwgICAxMTQ0LCAgIC0xODYsICAgIDUxMiwgICAxNDE2LCAgICA1NDYsCisgIDMyOTgsICAtMTI1MywgICAgMTI4LCAgIDEyMDIsICAgIDU1NywgIC0xOTY3LCAgICA2ODAsICAgIDU0NSwKKyAgLTEzOSwgIC0zMDA4LCAgMTg0NTMsICAtMzMyMiwgICAtMTM3LCAgICAxNjMsICAgMTM3NywgICAxMTE2LAorICAyNTcyLCAgLTE1NzcsICAtMTg0NiwgICAgNjUxLCAgLTEzMTksICAgIDc5NiwgICAtODYyLCAgICAzMzEsCisgIDQzODMsICAgMjQ1MywgIC0xODk0LCAgIDMyNjQsICAxNDEzNywgICAgODQyLCAgLTMwODcsICAgMzc0MCwKKyAtMTEwMCwgIC0yNDAwLCAgLTEzNjQsICAgMjQwNiwgICAgNDE3LCAgLTIzOTMsICAgLTg2OCwgIC0zMTU4LAorIC05NzEyLCAgIDM0ODAsICAtMTQwMywgICAxODk2LCAgICAyMDEsICAgMTI4NSwgICAtNTkzLCAtMTE3MTgsCisgICAgOTksICAgLTUzOSwgICAtMTg2LCAgICAgNDUsICAtMjI2NiwgLTEyMjI4LCAgLTI2NTgsICAgMjgwMiwKKyAtMTE5OCwgICAxMDIyLCAgLTM4NDAsICAgMTQwMSwgIC0xOTE4LCAgIDE2NTUsICAgMTcyNSwgICAgIDk2LAorICAtMjA1LCAgIC05MTMsICAgMTYyOSwgICAgNTY4LCAgLTEyODUsICAgMTI2NCwgIC0xMTYwLCAgICA1OTQsCisgICAyMjMsICAgLTMzNiwgIC0xNDM2LCAgIC00NzIsIC0xOTc5MiwgICAgNTUzLCAgIDE0OTQsICAgLTE5NSwKKyAgIDU3MCwgICAgMjgyLCAgIC02NTMsICAgIC01NCwgIC0xMTE1LCAgICAxNTMsICAgLTQ4NCwgICAgMTQxLAorICAtMTg4LCAgIC0yNzgsICAgLTE3MywgICAgNDY0LCAgICAgMTMsICAgLTYzNCwgICAgLTQyLCAgICAzOTAsCisgIC00NjQsICAgLTI0NiwgICAgNjIyLCAgIDEyMjksICAgLTY5MiwgIDI5MTc1LCAgIC01NzQsICAgMTE1MCwKKyAgLTEzNSwgICAyNjg1LCAgIDI0NTIsICAgICA2MywgICAtOTYyLCAgIC05MTgsICAtMTY1NywgIC0xOTc4LAorICAtMTcyLCAgIC02NzcsICAtMzQxNCwgICAxMzQ1LCAgLTM5NjQsICAgMjg3NSwgIC0xNDEyLCAgIC02NTQsCisgLTMwMDAsICAxMDczOSwgIDExMzQ4LCAgLTIyMzIsICAgIDUxNiwgICA4MzAzLCAgIC0xODksICAgMjU2NCwKKyAgLTE1MCwgICAtMzczLCAgICA5MDMsICAgLTI3NSwgICAyMzk0LCAgLTExMzUsICAgIDUwOCwgICAgNDI0LAorIC0xNzA0LCAgLTIyMjIsICAtMzc4OSwgICAxOTM4LCAgICAyMTYsIC0xMjcwMiwgICAyNDg4LCAgLTEzNjQsCisgLTIxNzUsICAgMTExNCwgICAtODE5LCAgLTI3NTYsICAgMTU2NCwgICAgOTUyLCAgICAgMzYsICAgIDYwOSwKKyAgLTkzMywgIC0xNTY4LCAgICAxMTAsICAgIDE0MywgIC0xNTc1LCAgLTQyMzYsICAgIDUyOCwgIDE1MDQyLAorIC0xOTIwLCAgICAzNDgsICAtMjYyMywgICA1MjE3LCAgIDE5MTEsICAtMTA4OCwgICAgMjU5LCAgIC01OTAsCisgICAzNjQsICAgMjA4MSwgIC0zNTg1LCAgICA2NjIsICAgIDI0OSwgICAtMTE5LCAgIC0xMTEsICAgIDc3OCwKKyAgMjE2NywgICAgIDExLCAgIDI1MDAsICAgNzE4MiwgIDE0NDUyLCAgIDQzODgsICAgNDEyMSwgICAzNjIzLAorICAxNTk4LCAgICA1MzIsICAgLTUwNywgICAgODc3LCAgIDM4MzAsICAgIDM3MiwgIC0yMTg0LCAgLTI4MTAsCisgMTE3NDgsICAtMjA5NSwgIC0xMDc5LCAgLTMwNzAsICAgLTc2OCwgICAyOTAxLCAgLTM1ODcsICAtMjU3MiwKKyAxMDAwOCwgICAgNTYzLCAgLTQ1ODgsICAgMTAyNiwgICAxMTE3LCAgIDE4NzksIC0xMjAwNCwgICAtNDE2LAorICAgMzE3LCAgIDIwMzIsICAgMTgwMCwgICAxMDU4LCAgICAtODQsICAgLTI5NiwgIC0xNzQ4LCAgIDI1ODgsCistMTEwMTksICAtMTYyNywgIC0zMjY0LCAgIDI0ODAsICAgICA5NiwgICAyMTQ2LCAgLTI2NzIsICAgMjQxOAorfSwKKworLmNiMTExMHMwID0geworLTMyNzQ2LCAgICAzNjAsICAtMjc3NCwgICAtNjcyLCAgLTE4MDgsICAgIC0xNCwgIC0xMDM3LCAgLTEzMjcsCisgIDE0MDksICAtMjIxNSwgICAgMTcyLCAgIDE1NTcsICAgIDk0NSwgICAyMDMxLCAgIC03MDIsICAgMTg0NCwKKyAtMTEwNiwgICAgNDcyLCAgIDI2MDMsICAgLTk3OCwgICAyNzgyLCAgLTU2OTEsICAgMTQ3MywgIC01NjY4LAorICA3MTI5LCAgIDY2MDAsICAtMjE2MCwgICAgMTA4LCAgLTE4NDQsICAgMjA2MiwgIC0yMzk1LCAgIC03NDAsCisgIDE2OTAsICAgIC00NSwgICAtNzI1LCAgICAgNzcsICAgNzIzNiwgLTEyOTAzLCAgLTMzNTYsICAgLTc2NCwKKyAgMTg3MCwgICAgNzIwLCAgLTIyMDEsICAgIDc5MCwgICA5OTUwLCAgLTM2OTQsICAtNTM0MCwgIC00MDMxLAorICA0MTE1LCAgIDY4NjMsICAgMjM1MiwgICAxNDg0LCAgIDM2MDYsICAtNDg1NSwgICAgNzE0LCAgIDQxMDQsCisgIDYyNDAsICAgNzI2MSwgIC02ODU1LCAgIDQ5MTksICAtMjg0NywgICA2NzAxLCAgIDc0NjksICAgLTYxNiwKKy0xMTQ0MiwgIC0xOTM1LCAgIDkxNTcsICAtNDA3MiwgICAgMTMzLCAgLTU5NzYsICAgMjQ1NSwgIC05MzYwLAorIC0yODk4LCAgLTQzNTMsICAtNzcyMSwgIC0zMDk4LCAgLTM1MDUsICAgMjU2OCwgIC01NDMyLCAgIC01NzYsCistMTAwNzIsICAgIDI1MCwgICAyMTczLCAgLTQxOTYsICAtNDMyMiwgICAyNjg4LCAgIDUyMjAsICAtNjAyNiwKKyAgLTM0NiwgIDExNjc4LCAgIDIwNzEsICAtNzM0NCwgIC0yMTgyLCAgIC01MzAsICAgLTE4MCwgIC0yNTY4LAorICAxNTI0LCAgLTE2MTcsICAtODgyNSwgIC00ODQ1LCAgIDI3OTQsICAtMjgxMywgIC0yNjY5LCAgLTI0MjMsCisgLTI3MDksICAtODk4NSwgICAyMTA1LCAgLTQ2MjksICAgIDcwOCwgICAyMDQwLCAgLTU2ODAsICAtMjQ3MCwKKyAtNzI3NywgICA2ODQxLCAgIDY1MjMsICAgNDE5NiwgIC02Nzg4LCAgLTE5ODIsICAgMzg0NCwgIC01MDAwLAorICAgMTU2LCAgIDE5MzAsICAgMTc4MCwgIC0zODI0LCAgIC0yODYsICAgMzkwOCwgICAxNzAzLCAgIDczMDQsCisgIDExNDUsICAgIDE0NCwgICAxMTgwLCAgIDcxNDUsICAgMzE3NSwgLTEzODIzLCAgIDY1ODAsICAtMzA2NiwKKyAtNjMyMSwgIC05NzM5LCAgIDQ0MzIsICAtMTE0NSwgICAyOTIzLCAgLTI2MzYsICAgMzgzOCwgIC03MDM3LAorIC0zOTEzLCAgIDEyNjIsICAtMTM5OCwgICAgMzYzLCAgIC0xNDEsICAgLTg4NiwgIC01NjY3LCAgIC0yMTIsCisgLTIxMTgsICAtMjcxNywgICAyNzI0LCAtMTg4MDIsICAtMjA5OCwgICAtMTU1LCAgLTEzOTksICAgIDc4MiwKKyAgIDc5NywgICAgNzY2LCAgIDI2MTMsICAgNTM3NCwgIC0zNzY3LCAgLTE3MTEsICAgIDYyNCwgICAgNjkzLAorICAyNTQ0LCAgLTYxNTMsICAgNzE3OSwgICA2ODM1LCAgIC03NjIsICAgNTA2MSwgICAgNjU1LCAgIDI2MDAsCisgIDkyMDgsICAtNzAzMCwgICA3MDQ3LCAgIDE2NTQsICAtMzQwNCwgICAgMTc2LCAgLTU0ODYsICAgMTM3NCwKKy0xNTM3OCwgICAtNDg3LCAgIDc0NTYsICAtMTk1NCwgICAyNDA0LCAgLTI5OTQsICAtMTYwOCwgICAyMzYyLAorICAtNDk4LCAgLTc5NTIsICAtNjE0MywgIC0zOTk2LCAgIDE1OTYsICAtMzAxMywgICAxMTgxLCAgLTE1MzQsCisgLTUyNjUsICAgIDIyMCwgIC0yNjc3LCAgIDEwNDcsICAtNDYyOSwgLTE1MDY2LCAgIDM5NjYsICAgLTQ0NiwKKy0xMTcxMywgIC01Njk0LCAgIC0zOTMsICAgLTI1MCwgIC0xMzM2LCAgLTczOTQsICAgMTUwOCwgICA2MjM5LAorICAzNzg4LCAgIDYyNzMsICAgNjIxNSwgICAgODIyLCAgIDI2NTcsICAgODA1NywgICA4MzkxLCAgIC02NTgsCisgLTI1NjEsIC0xMTU4NywgIC0yNTg5LCAgLTY3MDIsICAtOTIyNywgIC0xMDE2LCAgLTIyMjAsICAtOTcwMiwKKyAgNTk4OCwgICAxODU5LCAgLTYxMDAsICAtNDU5NCwgICAgMjIxLCAgIDI1MjksICAgMjIxNywgICA4MjczLAorICAxODA0LCAgLTYxMjgsICAtMjg1OSwgIC04MjU5LCAgLTQ3MDcsICAtMjQ5NCwgICAxOTEzLCAgIC0zNTIsCisgLTQ1NjEsICAgLTI4OSwgIC0xODAxLCAgIC05OTQsICAtNDQ0NSwgIC0xMDAxLCAgIDU0MjIsICAxMDg2OCwKKyAtNzM2NiwgICAxNjc5LCAgLTUxOTUsICAtNjg1OSwgICAyOTgyLCAgIC00MDYsICAgMjQwMCwgICA0NTIwLAorIC0zNjExLCAgLTE4OTIsICAgNDkwMCwgIC0zNTA0LCAgICA3NzEsICAgMjc3NCwgICAtNzcyLCAgLTE5MjksCisgLTczNTQsICAgIDM3NSwgICAgNjI4LCAgIDQ1MjIsICAgMTA2OSwgICAtOTY5LCAgIDgwODMsICAgLTE1NSwKKyAgMzE3OCwgIC0xMTM4LCAgIDE3NTIsIC0xNzI4OCwgICA0MzkwLCAgLTI0ODMsICAtMjA3MSwgIC0xMzUzLAorIC0xMTU1LCAgIC00NTYsICAtMjY4MywgICA2Nzk4LCAgLTE5MDgsICAgMTc5NywgIC02NjU3LCAgLTI3NzAsCisgIDU2MTAsIC0xNDUxOCwgICA1OTIyLCAgLTM5NjQsICAgLTkzOCwgICAtODUzLCAgIDE0MTYsICAtMTA3NywKKyAtNDU2MiwgICAtMTYwLCAgIDU4MjAsICAtMzAzMSwgICA1MDkxLCAgIDE5ODcsICAtMjc0NiwgIC0zNzc5LAorICAgMjM4LCAgIC0yNjQsICAtMzA3NCwgLTExNzE4LCAgIDkzNzAsICAgOTgwNiwgIC02MzAyLCAgIDM5NzksCisgLTI5MzgsICAgNDAzNCwgICAgMzkzLCAgLTEzOTksICAtNDQ2NiwgICAyMTgxLCAgICA3NTYsICAgIDM5NCwKKyAgMjI2NCwgIC0zNjY0LCAgICAgNzgsICAgIDQ3MCwgIC0zMjI4LCAgIDM5NDIsICAtMTcxNCwgICAgNzA4LAorICA0OTg4LCAgIDE5MzgsICAtMjcyMiwgICA0NTU1LCAgLTUwNTQsICAtMTAyNiwgIDE5MzEyLCAgICAzNTQsCisgICAxMDcsICAtNTM1NywgIC00MzY0LCAgICA1OTcsICAtMjU2NiwgIC0yODEyLCAgLTIyNzgsICAgLTQ0NiwKKyAgMTM4NCwgICAtMzcxLCAgLTI1NjYsICAgLTM4OCwgIC0zOTY0LCAgLTg5ODksICAgOTEzNiwgICAzMzg5LAorICA4NDQwLCAgLTU1NzAsICAtMTI2MiwgIC01ODc0LCAgIDIwNTYsICAtNTk3MywgICAtMTg1LCAgIDQ1NDAsCisgLTQ5MjQsICAgIDE1NCwgIC0zNjUzLCAgLTExMTMsICAtMzA0OCwgICA3MDk5LCAgLTI3MzQsICAgMjk0MCwKKyAtNjcwNCwgICAxNTQzLCAgLTgxMjAsICAxMDEzNCwgIC05NDg1LCAgLTY2NDUsICAgNDgxNiwgICAtNDQyLAorICAgLTMyLCAgLTI0MzAsICAgNDkzMiwgIC02MTI5LCAgLTUwNTAsICAgNjEyMCwgIC0yMTQ3LCAgLTY5MTAsCisgLTEzNDIsICAgMTA3NSwgIC0yNDU4LCAgICAgNTAsICAtNDc0NywgIC0zMDgwLCAgIDE4ODYsICAgMTQ5MCwKKyAxODk3MiwgICAgIDQ4LCAgICA3ODcsICAgMjQ0MSwgICAtNDA1LCAgIDE2NjgsICAtMTM5OSwgICAyMjAyLAorICAyMTc1LCAgLTM1OTIsICAgMTU0OCwgIC0yNzI4LCAgLTQ4NjQsICAgIDUwNCwgICAgMzgzLCAgICAzNzYsCisgLTEwNzMsICAgMjE0MiwgICAgNTA0LCAgLTMxMTQsICAgNjM3OCwgIC01NTE2LCAgMTM0NjIsICAgIDE5NiwKKyAgMTg0MCwgICA3MDg3LCAgICA3OTIsICAtMzU4MywgICAgMzAyLCAgIDEwMTIsICAtNTUwNCwgICAgMjcwLAorICAzMzU0LCAgLTQ0ODYsICAtMjMxMiwgIC0yNTIyLCAgLTI4NzIsICAtMzg5OSwgIC0yMjYxLCAgIDUyMTEsCisgIDE0MTcsICAtMzA3NSwgICAtMTUxLCAgIC05ODUsICAgLTc3MiwgIC0xNjMwLCAgICAxNjQsICAgIDY1OSwKKyAgMTQ5NiwgICAtMzQ5LCAgIC02MjEsICAgIC0zMiwgIC0yOTgyLCAgLTE3MjAsICAtMzQ3NSwgIC03MzcwLAorIC0xNTQxLCAgIDExMjIsICAyMDQ3NCwgICAxNzI2LCAgIDQ0NzQsICAtMzIyOCwgICA3MDI0LCAgIDMyNjUsCisgICA1MjIsICAtMjE5MywgIC0yMTEzLCAgIDUzODgsICAgMTkxMiwgICA1OTI5LCAgMTE3NjgsICAtMTE2MiwKKyAgMjYwMCwgICA0MDQ4LCAgICA2NTIsICAgMzM2MCwgIC0zMjE1LCAgICAzNzYsICAxMDAyOCwgICA2MDU0LAorIC0zODE0LCAgLTExNTUsICAgICA5MywgICA0NTEyLCAgLTM1ODEsICAtNDAzNywgICA3NDg0LCAgLTE0ODEsCisgIDI3OTcsICAgMjYzNSwgLTEyMjc1LCAgLTI3ODAsICAtNjIzNSwgICA1NzM5LCAgIDI2ODcsICAgIDM3NiwKKyAgNTk4NCwgIC0yNTQ3LCAgLTg4MzQsICAgNDMzMiwgICAyNzUyLCAgIDE5NDIsICAgMTAwMiwgIC0zMzEyLAorICA1MjUxLCAgICAtODYsICAtNzc5NCwgICAgOTE4LCAgLTI0MTMsICAgMzEzMSwgIC0zMzE2LCAgIDIwOTUsCisgLTQ1NjksIC0xNTM4MiwgIC01NTM0LCAgIDEyOTAsICAgNTE3OSwgICAyOTI4LCAgIDMwMzQsICAgMjM2NSwKKyAgIDI3MCwgIC03NDc2LCAgLTMwMjQsICAgNjkxMCwgICAxMzU1LCAgLTYyNjIsICAtMjA0MCwgIDEwNDkwLAorICAxNDMyLCAgMTIyODQsICAgMTEyNSwgIC0zMTYwLCAgIDQ1MTgsICAgIDk3MywgIC0yMzUxLCAgLTE3MjYsCisgIDE5NjcsICAgMTQ4OCwgICAgMzgyLCAgIDM1NTksICAtMzc0MiwgIC0yOTA4LCAgIC05NDQsICAtMTY2MiwKKyAgIDY4MiwgICAgOTAyLCAgLTQzNjAsICAgNTAyNiwgIC00MjUyLCAgLTEyMTIsICAtMzI2OSwgIC02MDI0LAorIC0zNzg4LCAgIDkxMjgsICAtMjYzOCwgIC0xNjI1LCAgICAzMTUsICAgMzA4NywgIC0zMjY1LCAtMTA0NDEsCisgLTcyMDcsICAtNDA3OCwgIC0zMjY2LCAgLTc1NDMsICAtNTIyMywgICA1NDYwLCAgIDI0OTYsICAtOTI1OCwKKyAgLTIyNywgICA0MDQ4LCAgICA4NjAsICAgLTUyMCwgIDEzNjE2LCAgLTM0NTgsICAgMzgzNywgICAgODA5LAorICAtMTA0LCAgLTQwNjIsICAtNDg0NiwgICAtMTM2LCAgLTE2MzEsICAxMzk3NywgIC0xMTM2LCAgIDMzODAsCisgIDEwOTksICAtNDAyMiwgICAxODMxLCAgIDMzNjAsICAtOTAzNCwgICAgLTUyLCAgIC01MTYsICAxMDE0NCwKKyAgNTA3NCwgICA0ODY2LCAgIDgyODIsICAgLTk3MiwgICAyNDk2LCAgIDIzMzYsICAgODc2NiwgICAyODgxLAorICAyNDE3LCAgLTU1ODgsICAgMzA2NCwgICAzOTM0LCAgLTQyMDIsICAgIDYyNywgICAtOTg2LCAgIDE3NTAsCisgICA5NTgsICAtMjM0OCwgICA1MDA2LCAgLTI1OTcsICAgIC05MCwgICAgMTMzLCAgMjMyNzEsICAgMjQzMSwKKyAtMzk4NCwgICAxODk0LCAgLTIwOTQsICAtMTgxNiwgICA1MDA3LCAgLTMxNjQsICAgMjUyNiwgIC0xODYyLAorICAyNjUxLCAgIDE4MDksICAgNzE3MywgICAzNDEwLCAgICAxNTQsICAxNDkzMCwgICAzMDMyLCAgLTUzMTQsCisgICAgNDQsICAgODg2OCwgICAtNTQzLCAgLTIxNTgsICAgNTM0MSwgICAgMjU4LCAgLTgxODgsICAgMzc3MiwKKyAgMjgwNCwgICA3NTQ0LCAgIDgzMzksICAtMzU2MCwgICAgLTYzLCAgIC03MzUsICAgMTMwMCwgIC00MzA4LAorIC0xMDg1LCAgLTQ5ODYsICAgMTU2NCwgIC02NzQ0LCAgLTI2MDUsICAgLTMxMCwgICAxMjc1LCAgIDExNjYsCisgIC02NDAsICAgNDgxNCwgICA0MzczLCAgIDMxMDMsICAtMTI0MiwgICA2MDQ5LCAgLTQ3ODYsICAgIDU5NywKKyAgIDE4MiwgICAyMzcxLCAgIDY5NTAsICAtMjI2NSwgICAgMzg5LCAtMTQ2NjksICAtMTk0MiwgIC0yNzMzLAorICAtNDg1LCAgIC04NjUsICAgLTU5NywgIC0xMzc2LCAgIDE2MjYsICAtMzk1NiwgIC0xMjQ0LCAgIDE1MzIsCisgIDM5MTgsICAtMzMxMSwgICAxNTc0LCAgICAtODgsIC0yMDU3MywgIC01NDcxLCAgICAtNzEsICAtMTczMSwKKyAgMTQzNiwgICAyNDI4LCAgIDM5ODIsICAtNDU3NiwgICAtOTE0LCAgIDU0NjAsICAtNDk3MywgICAxNjUwLAorIC0yMzY0LCAgLTI0ODYsICAgMzIxMiwgICA1NDI0LCAgLTI1MDEsICAgNDU5NSwgICAtOTM3LCAgICA3MjgsCisgLTUxNDAsICAtOTk0OCwgICAxNDM3LCAgMTA1NjAsICAtNTcwNCwgICAtMjY0LCAgLTI3NTIsICAgIDk0OSwKKyAgNTIyOSwgIC0xNDQ1LCAgICA0MzAsICAgIDgyNywgICA0MTAzLCAgLTE5OTksICAtNDYyNSwgIC00MTcxLAorIC04NzY5LCAgLTg5MjcsICAgNzE2MSwgICA0NTM5LCAgIDY5NjgsICAgNTk3NSwgIC00NjI2LCAgLTI3OTMsCisgMTAwODAsIC0xMDM4NiwgIC0yNDc5LCAgIDE3MjQsICAgMjk5MiwgICAgMzU0LCAgIDM2NTAsICAgMzMyOCwKKyAgNDQ5MCwgIC0xOTMxLCAgIDczNDgsICAgNzI4MywgIC0zMzA0LCAgIDQ0NDYsICAtMTY5OCwgIC0xMjI0LAorIC0zMDAyLCAgIDQzNDAsICAgMTA0MSwgICAgNjA3LCAgIC00NTQsICAtNDI2MSwgLTE4MDcxLCAgLTExOTksCisgLTM5MDIsICAgIDU3MCwgICA1ODA4LCAgIDU1ODIsICAgNjcxMCwgICAgMjM1LCAgIC0yMDUsICAtNDI4OCwKKyAgMzQ3MiwgICAtNjg2LCAgIC0xMDMsICAtMzY1OCwgICAtNDM2LCAgLTk2ODAsICAgLTE5MCwgICAgMjc1LAorICAtOTE5LCAgIDI1MjIsICAtMjA4NywgICA5MDk2LCAgIDUwNjAsICAtNjQ1MCwgIDEwMjgyLCAgIDMzNDQsCisgLTgxNjcsICAtNzY4OCwgIDExODgxLCAgIDMxMDEsICAtMTI4MCwgIC05OTQyLCAtMTE3NDEsICAgMjIxMywKKyAgIDcxMiwgICAzOTc2LCAgLTQyMTgsICAtNTI4NSwgICAyNzk3LCAgIDI5OTYsICAgNDAwNiwgICAyMDUzLAorICAyMzQ0LCAgIDYyMDAsICAgIDE0MSwgICAyNjE2LCAgLTM5ODEsICAgNjk3MCwgIC00MTk0LCAgLTE2MjEsCistMTM3MjQsICAgNzc3MiwgICAyODAwLCAgIDIyMjAsICAgIDQ0NSwgICAtMjY2LCAgIDQwMzAsICAgIDQ0NCwKKyAgLTIyOCwgICAyNjQyLCAgIDE2MTcsICAtMjUxMSwgICAxNjk5LCAgIDg3NDAsICAgMzQzOCwgIC0yMDYzLAorIC0yMDkzLCAgIDE4MDYsICAgIDk1MCwgIC03MTEyLCAgLTE1MTMsICAtMjg4NiwgIC04Nzg5LCAgICA4NzAsCisgIDM0NTYsICAtNDEyNiwgIC0zMzMwLCAgICA1NDEsIC0xMDE3MywgIC0xNzg5LCAgIDMxNTYsICAgNDQ2NiwKKyAtNTk2NSwgICAgNDc5LCAgIDUxNzcsICAtMjgwNiwgICAyNTA2LCAgLTE2NDYsICAtMzYwOSwgICAxNjE3LAorIC03MzczLCAgLTMxNDYsICAtMjM4OSwgICAzNjAxLCAgIDc4NTAsICAgICA4OSwgIC0zMzczLCAgIDQ2NzAsCisgLTQxODAsICAtMzE4NiwgICAzMDU2LCAgLTE2OTEsICAgMTMxNCwgICA5MjM0LCAgLTc3OTksICAgMTMyMywKKyAtNDM2MCwgIC05ODY2LCAgLTE5MzAsICAgODA5MSwgLTEzNDUyLCAgIDg1MDMsICAgMTk4MCwgIDExMjQ3LAorICA3Njg4LCAgLTU5NTMsICAtNDE2NSwgIC0zMTkyLCAgICA1NDAsICAgMTYzMSwgICAgMTMxLCAgIDIyNTAsCisgIDUzMzAsICAgLTE0NiwgIC04NzI0LCAgLTMxNDgsICAgMjgzNCwgICAxMTQ4LCAgLTM4ODYsICAgIDM3NCwKKyAtMTgzNiwgIC0zODk4LCAgIDk2NDksICAgMTExOSwgIDEwMjIxLCAgICAxMjgsICAgODg2OCwgIC03MzAxLAorICAyNjAxLCAgIDEyNTIsICAgMjM0MCwgIC0zNzg5LCAgIDQ2ODIsICAgIDE4MSwgICA0NDM0LCAgLTE3NDAsCisgIDQzNjgsICAgIDg3OSwgICAtNjIwLCAgIDIwNDYsICAgMTg0MiwgICAgODQ0LCAgIC05MjUsICAtMjUwNiwKKyAtMzM0NCwgIC04ODIwLCAgIC03MjIsICAgLTQ1MSwgICAgNTIxLCAgICA5MDMsICAtMTI4NiwgIC0zMDU5LAorIC01MzA4LCAgLTQ3NTksICAtMjcwNiwgIC0xNDI5LCAgIDI3NjIsICAgIDkyNywgIC0xNDU5LCAgLTcyNzQsCistMTIwMjgsICAgODgzOCwgICAzOTg3LCAgIDI0MDYsICAgODYyNiwgIC0zMTI4LCAgIDY1MDUsICAtNDMyMiwKKyAgLTE5NywgIC0yNDY0LCAgIDI3MzgsICAgIC00NiwgICAgMTYxLCAgMTM5MTksICAgMjI1MiwgICAyMDU5LAorICAgOTgxLCAgICAyMDQsICAgMTE2MSwgICA0OTEwLCAgICA2ODMsICAtNDMxMSwgICAyMDgxLCAgLTE5MzIsCisgIDExMTksICAtNjA2NywgIC01MzI1LCAgIDg1MjgsICAtNDcwNCwgIC01NTIyLCAgLTYxODMsICAgNTc0NCwKKyAtMzQwNywgIC0yMDIxLCAgIDI2ODgsICAtMzIzMCwgICAyNDkwLCAgIC05NzYsICAgLTUwMCwgIC03ODM0LAorICAyMDY0LCAgIDMxOTEsICAgNDc0MCwgICAzNjg2LCAgIDE3NjIsICAgMjYwNCwgIC0yNDQyLCAgLTU3MjAsCisgLTc1NTAsICAgIDQ1NywgIC0zNDc4LCAgLTgwOTcsICAtNjUxMCwgIC05MTA1LCAgIDgwMzEsICAtNDg5NSwKKyAgIDUwMCwgIC0yNDM2LCAgIDE0ODMsICAtNDQxNSwgIC0yMDIzLCAgLTM3NjgsICAtMjQ5NywgIC0xOTExLAorICAgNzg5LCAgICA1NjYsICAgLTk2OSwgIC00MjA0LCAgIDYxMjgsICAtNTA3NiwgICAyNjY0LCAgLTQyMjIsCisgIDY3NTUsICAgMTc3NCwgICA2ODgxLCAgICAgNjQsICAgMTIwNSwgIC05MjQzLCAgIDQ3ODIsICAgNDQzMiwKKyAgNTE5MywgIC0yMjU4LCAgLTQ3ODcsICAtNzQzMywgICAxNzU1LCAgIC03OTQsICAgMTI5NywgIC03NTM1LAorIDEyNzczLCAgIDkxMjQsICAgIDgwNiwgICAyMzQ4LCAgLTgxMTIsICAgNzg3NCwgIC00MzQ4LCAgLTE0MTAsCisgIC0zNTAsICAtMjUyOCwgICAgNTc2LCAgICA2NjEsICAgIDI3MiwgICA0NTk4LCAgICA2OTEsICAgMTkxMywKKyAtMzM0OSwgIC0xODgxLCAgLTE4NTQsICAgLTc3OSwgICAtODIxLCAgIDg0NDQsICAgICA2MCwgICAyNTcwLAorIC0xODEzLCAgLTEzNTQsICAtNDUxMiwgIC01NDcxLCAgIDQ3MjgsICAgMzI4OSwgICAyNjE3LCAgLTkzMjYsCisgLTY2NzAsICAgLTg1OSwgIC0yNzEzLCAgLTk4MzksICAgNDY3NiwgIC0yNjU3LCAgIDMxMDYsICAtMTM5MywKKyAxMDI3OCwgIC0zMDY5LCAgLTIyNTMsICAgMTAxNSwgICAyMjQ2LCAgLTIyMjcsICAgICAxNiwgICAtMzg4LAorICA3OTYyLCAgIDE0OTMsICAtMzEyMiwgIC0yNzA3LCAgIDc5ODIsICAtNjEwNiwgIC0xNDYyLCAgLTE2NjUsCisgLTEzMDIsICAgMjM0NywgICAzNjQwLCAtMTUxMjIsICAtMjIxMSwgICAgNDE3LCAgIDY4MTksICAgIDk1OSwKKyAtMjg3NiwgIC02ODY4LCAgMTEwNjAsICAtMjMyOSwgICAtMzAyLCAgIDE1OTUsICAtNDYxMCwgICA5NTE0LAorIDEyNjc3LCAgLTQ2MTQsICAtMjg5OSwgICAtMTQxLCAgLTQ4NTcsICAgMTQ0NywgICA2NDAwLCAgLTI4OTQsCisgIDE2OTYsICAtMjg4OCwgICAxODg5LCAgIDM0ODksICAgMjc3NSwgICAtNTA0LCAgLTY1OTcsICAtNTI1OCwKKyAtNzI1NiwgICAtMzc5LCAgLTEyNDksICAgLTEzNiwgICAzMTE4LCAgLTM1MzcsICAgMzI5NSwgIC0zNDU4LAorICAyMTAzLCAgIC0zOTksICAxNTI4MSwgICAtMjIyLCAgLTE4MDksICAgIDE3MiwgICAyMjU3LCAgIDE5NDcsCisgICA3MDcsICAgMzU2MiwgIC01NjkxLCAgIDM1NzUsICAtMjIxMCwgICA1NzUwLCAgICA4MTUsICAgNDA1OSwKKyAgIC0xNiwgICAxMzA2LCAtMTMzMDgsICAtMTczMywgIC0xMzM4LCAgLTM0NzcsICAgNTI0NywgIC0xOTUwLAorIC01MTQ4LCAgIC02NzgsICAgODA3NCwgICAxNzQwLCAgICAyOTAsICAgMjAzMywgICA0NjM5LCAgLTQyNDAsCisgIC01MzYsICAtNTIxNCwgIC0xMzY2LCAgIDI0OTEsICAgIDUwMSwgICAgLTU5LCAgLTQ0ODAsICAgIDQzMCwKKyAgLTI4NSwgIC01OTQ3LCAgIC03NTUsIC0xNDU1OSwgICA1Njk2LCAgIDY5NjAsICAgNDQ2MiwgICAyMzE3LAorICA2NDE0LCAtMTMxNzQsICAgNDk2MiwgICAtODk5LCAgIDU5MjQsICAxMTEwMCwgICA1MzAzLCAgIC05NzAsCisgLTI1MjgsICAtNjIzOSwgICAyMjUzLCAgIDIyMzYsICAgIDU1MywgICAgNDU4LCAgLTIyMjksICAgODAxNiwKKyAtNzA4MiwgICAyODY5LCAgLTQyMDksICAtNDQ2MCwgIC02NTM2LCAgIDM1NTcsICAtMTc2NiwgICA3ODE1LAorICAtNjU1LCAgLTYwMjksICAtNTI1MCwgIC0xNjI3LCAgIDI2NDYsICAtMzQ2NiwgIC0zNTg0LCAgICA5MDEsCisgMTAzMDUsICAgLTg5NSwgICAtNDI3LCAgICA5NDksICAtMjc3NiwgICAzNDM2LCAgICA3NjksICAtNDEzMSwKKyAgOTAxOSwgIC00ODk4LCAgLTM1NjIsICAtNzk3OCwgICAtMzU5LCAgIDEzNTgsICAtMTUyOCwgIC0zMDk1LAorICA1ODQwLCAgLTYyMTQsICAgMjU5MSwgIC0yMDg2LCAgIDk0ODAsICAgIDY0MCwgICAyODU4LCAgICAyMTYsCisgLTM2MjUsICAgNTc0MCwgIC03MDA4LCAgLTEwOTcsICAtMjA5MSwgICAtMTQzLCAgIDQ4MzIsICAgNjIxMCwKKyAtMTM1OCwgICAzOTk4LCAgIC03MTQsICAgIDgzNSwgIC00MDA0LCAgIDM2NjQsICAgMTk4MCwgICAxMjQwLAorICAyOTAyLCAgICA1MTAsICAtMTU2NSwgICAgNDI3LCAgLTIwNTIsICAtNDIwOCwgIC0xNTA1LCAgIDExODcsCisgLTEyMjksICAgMzczMiwgICAtOTMyLCAgLTEwMTQsICAgNDc4NCwgIDE4NDc0LCAgLTUxMTEsICAgMzA0NywKKyAgIC01NCwgIC0xNTQ3LCAgLTM4OTIsICAgODYxMiwgICAgMjc0LCAgIDE0NDYsICAtMzU0OCwgIC03Njg5LAorICAtNDIzLCAgIDExOTIsICAtNDUwOCwgLTEwNDAzLCAgLTg3MzUsICAgLTQ0NiwgICAgNDQ0LCAgLTYzNTMsCisgIDQwMDgsICAtMTQ2MiwgIC04OTA2LCAgLTExNjEsICAtMjM5NSwgICAyNDQyLCAgIDIyMDQsICAtNTQ3MiwKKy0xNzM3NiwgICAyNDcxLCAgIC02ODksICAgMTM5NCwgIC0zNjU3LCAgLTIxMTksICAgLTc2OSwgICAyODcyLAorICAxMzkzLCAgLTI3MDEsICAtMzUzNiwgICAzNjUwLCAgIC0zNzgsICAgIDg1OSwgIC0zMzM4LCAgIDE0MTIsCisgIDMwMTAsICAtMzI0MywgICAtMzM1LCAgLTM2MTksICAgLTUxMSwgIC0xOTMxLCAgLTcxMjYsICAtNTAxOCwKKyAtOTMzMiwgIC00NDQwLCAgIDE5MDYsICAtMjI2NSwgICAxMzg2LCAgIDgwNzIsICAtNjU3NiwgIC0xMzAwLAorICA1NDU4LCAgLTQ4OTQsICAgIDYzMCwgIC03MTQ2LCAgIDIyNjMsICAgIDgxMCwgICAyOTY4LCAgIDExMjQsCisgLTIyMTksICAgMjI5MiwgIC0zOTE0LCAgLTE4MzYsICAtNjY4MywgICAxNTExLCAgLTI3NTUsICAgMTM5NiwKKyAgMjQyNSwgLTIzODQyLCAgIDIyNDksICAgIC01MywgICAtODkxLCAgLTE2NzgsICAtMTc2NiwgIC0xNzg4LAorICAgNTAyLCAgLTQyMTAsICAgIDIxMSwgIDEwMzc2LCAgLTU1MDcsICAgIDgzNywgIC02MTk2LCAgIDIxMzIsCisgIC00NzIsIC0xMDE1MywgICA3MjM0LCAgLTE0NTYsICAgLTE0OCwgICA0ODg2LCAgIDI0MjcsICAgMjM3MSwKKyAgMTIzNCwgICAtOTYyLCAgIDYyOTgsICAgMTAxNiwgICAxNzM1LCAgIC01NjYsICAgLTg3OCwgIC04MDcxCit9LAorCisuY2IxMTEwczEgPSB7CisgIDI1MjUsICAxMjE2NCwgICA0ODYxLCAgIDk1MDUsICAtNzM3MSwgICAtNDE0LCAgIDMwMDIsICAgIDU3NiwKKyAgLTM0NywgICAtOTk4LCAgIDI4NjEsICAgLTgwNCwgICAzMDM0LCAgICA4MTAsICAgLTc4OCwgICAtNTM5LAorIC0yMDkyLCAgIDQ5NzAsICAgMTgyOCwgIC0yODY5LCAgLTI4MDIsICAgNjY0OSwgICAzNjczLCAgIC0xOTMsCisgLTQwMzQsICAgIDcyMiwgICAxNjQyLCAgIDM3OTIsICAgODc3MCwgIDEwNDI4LCAgLTMzMDMsICAtMzg0OSwKKyAtNDUyMCwgICAtMjM0LCAgLTQxOTAsICAtMTIxOSwgIC0xMzAwLCAgLTQxMjgsICAgODM4NCwgIC0xMTUwLAorICAxNTc4LCAgLTYxNzQsICAtMTA3MiwgIC00ODcxLCAgLTgxODAsICAtNjY5OCwgICAzODA2LCAgLTczODYsCisgLTI1NDUsICAgMTA1MiwgICAtNTUwLCAgLTExNDgsICAtMTMwOCwgIC04ODM0LCAgLTI2NTQsICAgMTk4MiwKKyAgODcxNiwgICA2NTc5LCAgIDEzNjAsICAtMjQwNCwgICAxODkzLCAgIDI2ODAsICAgMzgwMSwgIDExMDk3LAorICAxNDU1LCAgIDI0NTMsICAtNzU4NSwgIC03NTAzLCAtMTI3MTAsICAgLTQyMCwgICAyMDIzLCAgIC02NTYsCisgIDExMjQsICAgMjg3MiwgICA5Njc2LCAgLTQzMDksICAgLTIwMiwgICAxNDU4LCAgLTY1MjYsICAgLTUzNCwKKyAtMTUzNSwgICAgOTI0LCAgIDMwNjgsICAtMTE0MiwgICA1MDczLCAgIDEyODQsICAtNTYzMiwgICAgODY5LAorIC0xNjM3LCAgLTI4OTgsICAgNDkwMCwgLTEwMjAyLCAtMTA0ODgsICAtMTA5NywgICAxODkwLCAgMTEwMDYsCisgICAtNDQsICAgMTM2OCwgIC0xOTc5LCAgIDY1MDcsICAgIDMxNiwgICAgOTYxLCAgICAgIDgsICAtNDA4NSwKKyAgMjU2MSwgIC0yMDM0LCAgLTEwNzcsICAgMjU5NCwgICAtNDY1LCAgLTUxMzQsICAgLTg2OCwgICAgIDU0LAorIC02Njk0LCAgIDk2MDgsICAtMzUxNiwgICA3MTY1LCAgMTEwMTEsICAgOTU0MiwgICA0NzgwLCAgLTI4MDAsCisgLTExMzAsICAtMTcxNCwgIC0yNjg0LCAgIC0zNjksICAgNDc0NiwgIC0yNjg4LCAgIDQxNDYsICAtNzY1MiwKKyAgIDk4NCwgIC0zMjYzLCAgIC0yNzYsICAtOTEzNCwgIC0yODQ4LCAgLTM5ODMsICAgOTk5NCwgICAzNjA4LAorICAzMjM0LCAgIC01OTYsICAgIDI2MywgICAzMTAyLCAgIC0xNzgsICAtMjI2NCwgICAzODIwLCAgLTQyOTMsCisgLTU3NTIsICAtMzU3NywgIC0zOTE0LCAgIDEwOTUsICAtMTU2MiwgIDIyMTEwLCAgIDQ2MTAsICAgICA2OSwKKyAtMjk5OSwgICAgMjU0LCAgIDIxNzgsICAtMjkwMSwgIC0xMjAzLCAgLTEyOTIsICAgMjY0MiwgIC0zMjU0LAorIC0xMzg5LCAgIDI5NTUsICAgMTM0MCwgICAgNTQyLCAgICA4MTAsICAgMTM2OSwgICAzMjA4LCAgIC03OTUsCisgLTMyNzIsICAtMjcxNywgIC0xMTI5LCAgIDg3ODEsICAtNjg1NCwgIC0zMDI4LCAgIC02MTYsICAgIDcyOSwKKyAgIDUyOSwgIC02OTQ2LCAgIDE2MjEsICAgOTU3NCwgLTE0OTA5LCAgIDUzOTgsICAgIDg1NCwgICAtNzc0LAorIC05OTc4LCAgLTU0MTcsICAtMjUxNiwgIC00NjgzLCAgIDU3MTUsICAgIC02NiwgICAzMzM2LCAgLTUwNDAsCisgICA2NDAsICAtNzU2NiwgICAzNDk0LCAgIDcwMTYsICAtMjI2OSwgICAxMzc2LCAtMTM5OTQsICAgNjQ0OCwKKyAtMzk0OCwgIC0xNjk3LCAgLTM5ODgsICAtNjU1OSwgICAyMzc2LCAgIDQyMzEsICAtMzEzMSwgICAyMDQ1LAorIC0yNDE3LCAgLTU5MTksICAtNzAxNiwgIC0xNjk1LCAgIDkwNDYsICAtNzk2NiwgICA1MTg3LCAgLTI1NTMsCisgIDE0MDIsICAtMjM1MSwgICAtMjIwLCAgIDU5MzEsICAtMTgyMywgIC0yMjcwLCAgICA1ODQsICAtMzc4NCwKKyAgMjkyNCwgICA2MTY2LCAgLTMwMzUsICAgMjM3MCwgICA0OTIzLCAgLTEwODAsICAgIDY4MiwgIC03ODk5LAorLTEwODI3LCAgLTE4MjQsICAgLTkwOCwgICAxNTY4LCAgLTM1NjUsICAgNDAzMywgIC00MjY2LCAgLTE5NDgsCisgICA5MjMsICAgNTQ4OCwgICAtMjAzLCAgLTIzOTYsICAgLTkwNywgICAyNzgzLCAgLTMyNzgsICAgMTQxNSwKKyAgNzcxMCwgICAtMTkwLCAgLTUyMDgsICAtMjI3OSwgICAxMjY2LCAgLTExMzIsICAtMzM5MiwgIDEwMjUxLAorIC0xMDY0LCAgMTEyODMsICAgMjE2MiwgICAyMjEzLCAgLTUwODgsICAgNDQ3OSwgIC00NjU4LCAgLTE4MDMsCisgIDE1MzQsICAtNDIzMywgIC00MDczLCAgIDY5MzgsICAgMzk2NiwgIC00ODc4LCAgIC0zMzIsICAgNTk2MSwKKyAgOTIxNywgICAgNDg4LCAgIDY1MjAsICAgNDQzMCwgICA3OTg4LCAgIDkzODMsICAtMjU4NiwgICAxMjA2LAorIC02OTgzLCAgIC04NzMsICAgMTI1MSwgICAxODQ5LCAgIDU5NDUsICAtMjE0NCwgIC0yMDMyLCAgLTE4NTIsCisgICA0MTYsICAgMzcyMCwgICAyNDE5LCAgIDg0NjIsICAgMzE3MywgIDExNTI0LCAgLTI4OTQsICAtNTUxNywKKyAgLTIxMSwgIDE3ODMwLCAgIDMxNzAsICAgMTA5OCwgICAtNzIxLCAgLTIwNjYsICAtMTk1NiwgIC0zMDk3LAorIC0xMDYxLCAgIDI4MTUsICAgIDQ0NywgICAgNzAxLCAgICA0NDksICAgLTQ4NSwgICAyNjA5LCAgIDEyMzksCisgIDIyNTcsICAtMTc2MCwgICAzMDkxLCAgIDc1MzgsICAgMzcxMCwgIC0yNjg5LCAgLTMwOTIsICAgNjkwMywKKyAtMjQ1NywgICAzMjcxLCAgIDYzNTUsICAtMTQ4NiwgICAtODI4LCAgIDE5OTQsICAtMzU3NSwgICAzOTQ5LAorICAzMTg1LCAgIDI2MDYsICAtNDkxMiwgLTE2MDM5LCAgLTg4MzMsICAgMTgzMSwgICAyNTgwLCAgIDE5OTMsCisgLTExMTcsICAtMzQwOCwgIC03NTkwLCAgLTcyNzgsICAgLTE0MSwgICAyNjk2LCAgICA4MDUsICAgMTg5NiwKKyAgIDMwOCwgICAgMzc4LCAgIDkzMDgsICAgMjg5NCwgIC00MzI0LCAgIDEwNDIsICAgIDgzNywgICA0NzE2LAorIC00NzAyLCAgIDI0OTMsICAtNTE3MywgICA4NjE2LCAgIC00NjgsIC0xNDgyOSwgICAzNzU5LCAgIDMyNTEsCisgLTQyMzcsICAtMTM0MCwgICA1MjI0LCAgIDIwOTksICAgLTc2NCwgIC04MjYzLCAgLTE2OTksICAgICA3NiwKKyAtMTQ2NCwgICAyMTE1LCAgIC01ODIsICAgMzI4NiwgIC0zNjUzLCAgIDEwMTcsICAgMTY5NiwgIC0xNDE0LAorICAtNjY4LCAgLTk3NDgsICAtNTczMCwgICAyNDEzLCAgLTEyNzAsICAtNjA3MCwgIDE3MDAyLCAgIDIxNjQsCisgLTU0NDAsICAgMTgwMSwgIC0yMTIzLCAgICA4MDAsICAgMjEzNSwgICA0ODAxLCAgIC04ODcsICAtMjE0MSwKKyAgLTY0NywgIC00ODQ2LCAgIC00NjMsICAgLTU3NywgIC0xODQ2LCAgIC01NTUsICAtMTkyOSwgICAyMDQ2LAorICA4MjcyLCAgLTgzOTksICAgMzg4NiwgIC01OTUwLCAgLTQyMDIsIC0xMjYwMCwgIC0yODA1LCAgICA0NzcsCisgICAgNjUsICAgNjE0MCwgICAxMDg5LCAgLTQ3MzcsICAgODk2NywgICAxOTUyLCAgLTE5NjgsICAtMzY2MCwKKyAgNjY0MSwgICAgODUwLCAgLTMzMDQsICAtMTc3NSwgICA0MDEwLCAgMTA4MTksICAxNDM2NSwgICAtNjk2LAorIC0xMzMxLCAgLTE3MjQsICAgLTIzNywgIC0zNjExLCAgICAyNDQsICAgMzAwNSwgICA0MzQ5LCAgIC0xODIsCisgLTQxMjQsICAgMjQ2NiwgICAyNzQ2LCAgICAtNjEsICAgMzM5MSwgIC0xMzkyLCAgIDM3ODgsICAgMTU4MiwKKyAgMzcyMywgICA3MTQwLCAgLTIyMDcsICAtMzY3OCwgIC0yNjc1LCAgIC0yNTIsICAtNzQ3NiwgICA5NDI2LAorIC02MTk2LCAgIDMyMjYsICAgMzU1NCwgIC02MzI2LCAgLTQyODQsICAgNjM0NiwgIC00NDMyLCAgIDUxOTksCisgLTI2MzMsICAtMjQ5OSwgICAxMjAwLCAgLTExNDAsICAtMzkxMCwgICA2NjI0LCAgMTY3MzIsICAgNTk0NiwKKyAgLTc2NiwgICAyNjMwLCAgLTEyMDAsICAgMTk4OCwgICA1NTEwLCAgLTExOTksICAgNDEyNiwgICAxMjg3LAorICAgNDU0LCAgLTE3OTUsICAgMjY2NCwgICA1MDAxLCAgIDEwNTgsICAgIDUwMCwgICAtNDM3LCAgIDI5OTIsCisgLTIwMTIsICAgLTE2MCwgICAgNzk2LCAgLTQ4NDYsICAtNjU3MiwgLTEwMDg4LCAgICA2MDMsICAgIDQ4MywKKyAtNDUxMCwgLTEyNzk5LCAgIDM1MDIsICAtMTc4NCwgICAzNTEwLCAgLTM5NTYsICAgNjAzOCwgICA5MDQ0LAorIC02MDI5LCAgIDcxNzAsICAtMTYwOCwgICAgMTIwLCAgICA5MTQsICAgLTIwMCwgICAzOTM5LCAgLTYyNzQsCisgIDMwMjAsICAgNjIzNSwgIC0yNzU0LCAgIDUzNjgsICAtMTY5MywgIC02MDI4LCAgICAzODYsICAtMjAwNiwKKyAgMTg5OCwgLTExNzA0LCAgLTk5NzMsICAgLTUyNSwgIC0yNjI0LCAgIDE3OTksICAgNDE0MCwgICAzMjQ4LAorICAgLTU3LCAgLTM3MzEsICAgMzc2NCwgICA1NTgyLCAgLTM4MzAsICAtMjQ4NCwgIC0yMDY2LCAgIDE1MTcsCisgIC05MDAsICAtODI1MCwgIC04MTkxLCAgIDI2NzYsICAgMTE0NywgICA2NzUyLCAgIDY5MDgsICAgMTE5NiwKKyAtMjYzNCwgICAzNDA4LCAgIDI5ODAsICAtMTA0MiwgICAzOTcxLCAgICA2MzIsICAtNDk0NiwgIC01NjkwLAorICAgMTMzLCAgIDI0NDUsICAgLTQ0NiwgIC0xMjk0LCAgIC03NzcsICAgMzM1NiwgIC01NjI4LCAgLTYwMjAsCisgLTgwNDIsICAgNTA2OSwgIC0xNDIxLCAgLTI3MDEsIC0xNTExNywgICAzMDc0LCAgIC05MTIsICAtMjU3NCwKKyAgMjY0MywgICA1MjUyLCAgLTIxMTgsICAgMzg0OSwgIC0zNzkzLCAgIC04NTAsICAgNDE3MCwgICA2MjQwLAorICAtNjk3LCAgIDY5NzYsICAtMzc1MiwgICAxMTU1LCAgIDc3NjksICAtODkxMiwgIC03NzI4LCAgIDQyMjQsCisgLTIzNjIsICAtMzc2MCwgICAzNjg4LCAgIDI0MDIsICAtMzQxMSwgIC0zMTY1LCAgLTI1NTAsICAgICAtOCwKKyAgLTIwOSwgICAtMzM0LCAgIC04MzcsICAgNTY4OCwgICAzNDI1LCAgLTQ1NjQsICAgOTk5OSwgIC00NzgwLAorICAzMDkzLCAgIDQzNDYsICAtNTU1NiwgICAxNjM2LCAgIDE3NTUsIC0xNDY5NiwgICAxODEwLCAgIDY1NDcsCisgICAtNjAsICAgNDA1NCwgIDEwNTM5LCAgIDYxMTgsICAtNDQxNCwgICAxNzYwLCAgIDM1ODEsICAgLTg0MSwKKyAgNDQ3MSwgICAgLTIzLCAgICAxODAsICAgIDI1OSwgIC00NDM5LCAtMTMyMzAsICAtMTMyNiwgICAxOTEzLAorICAtNjIxLCAgLTE2NDEsICAtMjg4MiwgIC00OTM0LCAgICA1MTYsICAtMzg4NiwgIC00NDY4LCAgIC0xMTAsCisgLTQ1MjYsICAtNTE1NywgICA3NTUwLCAgLTQ0NDksICAgIDgxMywgIC00MzY0LCAgIDE3NjgsICAtODgyOSwKKyAgMjAwMywgIC0xMzcyLCAgIDE4NzMsICAgLTIwOSwgICAxNTM5LCAgIDEwNzYsIC0xMjQwOCwgIC0xNDY0LAorIC0xODc4LCAgIDE1NjMsICAgMjAyMCwgICAgNzA0LCAgIDE0MjUsICAgLTI3NSwgIC0zNzE4LCAgIDQ2MTgsCisgLTExMjAsICAtNTA1NywgIC0zNTkwLCAgIDQwMjIsICAtMTk3NywgICAgNjIwLCAgICAxNDMsICAtMjUwNywKKyAgMzY5NywgIC0zMjYzLCAgICA2MTYsICAtMzAwMiwgIC0zMzQ3LCAgMjEwNTEsICAtNDM5OCwgICAgMzY0LAorIC0xOTI0LCAgICAyODQsICAtMjcyNCwgIC0yMjk3LCAgIDQ5MTYsICAgMjcwMiwgICA0ODY2LCAgIDQyOTMsCisgLTI3ODEsICAgMTA5NCwgIC0xNTI1LCAgIC01NjIsICAgNTQ4NywgIC0yMDk4LCAgIDQ2NTgsICAgMTM2MiwKKyAgLTU5NywgIC0zNDI2LCAgIDMxNzMsICAtNTE3NCwgICAzOTIyLCAgLTM4NDQsICAgMTQ4MiwgICA0NzExLAorICA1ODUzLCAgIDE0OTAsICAgNTQ5OSwgLTE3NTM3LCAgICA5NTYsICAgIDU0NCwgICAgMjY4LCAgLTQ3ODIsCisgIC01MDQsICAtNDAwMywgICAtOTExLCAgICA1OTksICAgMTc0NiwgIC03MzIyLCAgIDE5MDcsICAgMTk5MCwKKyAxNjk4NSwgICAzMTcxLCAgLTI2NDUsICAgMTA0MCwgIC03MjM5LCAgIDU2MTgsICAgIDMwNCwgICAzNjA2LAorIC0zMzc3LCAgIDM2MzAsICAgNzMxOSwgICAgMTA4LCAgIC00OTYsICAgMTAyNiwgICAzMDYyLCAgIC0zOTIsCisgIDIzNjYsICAgMTk0OCwgICAtNTMwLCAgICA4MDYsICAgMjcwMCwgIC0yNjc2LCAgLTI3MTcsICAgNTIzOCwKKy0xNjAwOCwgICAtODIzLCAgIC0yNjQsICAtMTU2MCwgIC0xMDE0LCAgIC03NjAsICAtMzY4NCwgICAtMzMwLAorICA1NjQ0LCAgLTE2NjgsIC0xMDIzOSwgIC0yNTgzLCAgIDc0MTEsICAgLTU5MywgICAyMTkzLCAgLTE0NzksCisgLTI4OTIsICAgMzgzNCwgIC0zNjI1LCAtMTIyMzQsICAtMTEwMywgICAxODY4LCAgLTUxMjEsICAgMzg3OSwKKyAgMjc0OCwgICAxOTM2LCAgIDIwMjYsICAgNDU3MiwgIC02MDM3LCAgIDMzMTAsICAtODY3OCwgIDExNzI0LAorICA1MjkwLCAgLTIzMTYsICAgNDEzMSwgICAgODM0LCAgLTM5MTUsICAgIDg2OSwgIC0xNzM0LCAgLTU3NTIsCisgIDEyNTUsICAgOTUzNCwgIC0zNjI1LCAgIC0xMTUsICAtNTkxMiwgICAtMTI1LCAgIDIyOTgsICAtMTQ5NCwKKyAgNTkxMCwgICAtNDk2LCAgLTI3MTksICAgMTMyMCwgICAzMTc1LCAgLTMwMTIsICAtMzkwNiwgICA0NjAyLAorIC00NzYwLCAgLTU5MTgsICAtMjU2OCwgICA2NjMyLCAgLTg4MDIsICAtNTg3NiwgICA2MzU4LCAgIDIzNDksCisgICAyMDcsICAgNTE5MSwgICA4MzY5LCAgLTU5MzIsICAgMjcxMCwgICA3OTUwLCAgIDM2NzMsICAtMjU5MiwKKyAgMTMxMSwgICA4Mzg0LCAgLTQzNjAsICAgODYxNCwgIC01NjYyLCAgIDExODAsICAgMjE0NywgICAxMDQ0LAorICAxNTkxLCAgLTU1NTUsICAtMTU5NywgICA0NDE4LCAgICAgMzgsICAtMTU3OSwgICA0Njc1LCAgLTE3MjUsCisgLTE2OTMsICAtNjQ3MCwgICAzMDY2LCAgLTc2MDEsIC0xMjgyMiwgICAgNTI0LCAgLTI5ODYsICAtMzQwNiwKKyAgODg2MCwgIC0xMjY2LCAgIC05MzAsICAgNDMxNiwgICAxMTcxLCAgLTI5MDgsICAgIDE5OSwgIC0xNzg1LAorIC0yODUxLCAgLTM1ODgsICAgMzA3MiwgIC0zNTg1LCAgLTI2NjgsICAtMTEyMywgICAxNTA4LCAgICA0NjAsCisgIDY3ODAsIC0xOTQ4MCwgICAyODU0LCAgLTE1NzQsICAgMTAwNCwgICA1MDc0LCAgIDE5MDcsICAtMTk4OCwKKyAgMTE3NywgICAgIDc0LCAgLTE0MzYsICAgMjIyNCwgICAxMjMyLCAgLTMwMDgsICAtMzQ1NCwgICAtODYyLAorICAgNjA0LCAgIC02NTMsICAgMjc3OCwgICAyMzQ5LCAgIDMyNDIsICAgODQyNiwgICAtNDMwLCAgIDM2ODQsCisgIDQ4MTQsICAtMTg4NiwgICA1MTE4LCAgIDE0ODcsICAgIDQ0MiwgIC0yMzIyLCAgIC05MDAsICAtMjg1NCwKKyAgLTIzNCwgLTEwMzUwLCAgLTc5MjIsICAgLTc0NSwgIC0xNDkwLCAgLTU2MzgsICAtNjAxNCwgIC00MDc5LAorIC0yOTc5LCAgIC0zNTEsICAgOTQ5MywgIC0yMjc0LCAtMTEzNjIsICAtODE2NiwgIC03MzY0LCAgIDgyNjEsCisgIDE1NTQsICAtMTcyMiwgICA0NjUxLCAgIC04MzEsICAgMjI3NiwgICAxNTAyLCAgIDI2MDAsICAgMTI2NiwKKyAgNDQ1NiwgIC00MTQ1LCAgLTM4MzcsICAtMzU4NCwgICA0MjQyLCAgIDQwNTgsICAtMjM5NSwgIC02OTcxLAorICA0NDg2LCAgIDMyMzMsICAgNjIyNiwgICAxMzA2LCAtMTE1MDYsICAtNjIyMywgIC01MTMyLCAgIDE1MzcsCisgLTQ0MDcsICAgMTUxMCwgICA1NzMyLCAgIDI4MDgsICAgNTgxNywgIC00OTcyLCAgLTI5MDAsICAgIDg5NywKKyAtMjQ0MSwgIC0xODE5LCAgIDU2NTEsICAtNjk4OCwgLTEwMDYzLCAgLTIyODgsICAtNTgyMCwgIC0xMjUwLAorICAgOTI1LCAgIDMxMjAsICAgNjEyNSwgIC05OTAxLCAgIC0xMzcsICAgMzY4NCwgIC02NjAxLCAgIDEwNzcsCisgIDMyNzIsICAgICAyMSwgICAzMzQxLCAgIC04MzgsICAtMzY0MywgIC0xNzI3LCAgLTQ0MTcsICAgIDY2MCwKKyAtNjU1MSwgICAtMTg0LCAgLTgxMjUsICAtMTc4MCwgICA1MjMyLCAgIDYwNzcsICAtNzk2OCwgICA2NDIzLAorICAzODIzLCAgIDMwMjYsICAgNDU1NSwgICAgNDY0LCAgIDMzMTgsICAtNTUwNCwgICAgODM3LCAgLTM1NzEsCisgIDM4NTMsICAtMjI3NywgIC0xODY0LCAgIC03NDIsICAtNTM4MCwgICA2MDk2LCAgIDY4NTYsICAgMTA3NiwKKyAgIDg3NywgICAtNjQyLCAgIDE5MjYsICAtNDcxMiwgLTE0NDgyLCAgLTMzMjMsICAtMjY3MiwgICA3NDg1LAorIC0yMTE2LCAgLTM5MzIsICAgMjIzMywgIC0zMjcwLCAgICAzMjYsICAgMjIyMSwgICAgMTMyLCAgLTE4OTMsCisgIC03NDgsICAgIDQ1MywgICAzNTk3LCAgLTIzMDgsICAtNDM3MSwgICA1NjMyLCAgIDM2MDksICAtMTAzMywKKyAgLTQ0NCwgIC0yNTkxLCAgMTczNTksICAtMzEyMCwgIC0yNjA0LCAgIDMxNTcsICAgLTM3MCwgICA5MjQyLAorIC0xNjA2LCAgIDI2NzUsICAgLTg1MywgICAxNDc1LCAgIC00MTYsICAtMzI4MCwgIC0xMTU5LCAgICAxOTEsCisgLTM2NzAsICAgIDI4MiwgICA0MjgyLCAgIC05NTcsICAtMjk3OCwgICAzNTY0LCAgICAgOTEsIC0yMDUyMCwKKyAtMzA0NiwgICAxMjQ4LCAgIDEyNzcsICAgMzM2OCwgICAxMTE4LCAgICAzMTEsICAgLTU5OCwgICAxNDA2LAorIC0yMzc3LCAgLTE0NDQsICAgMTQxNywgIC0zNjI2LCAgICAxNjcsICAtNjQ0MCwgICAzMzQxLCAgICA2MjksCisgLTI1MjMsICAgNDM5OCwgIC0xMTg3LCAgIDQzMjIsICAgLTM4MywgICAxOTM0LCAgLTMyOTgsICAtODUzMCwKKyAgMjE5NSwgICA1MjIwLCAgICA1MTAsICAtMTI1NiwgIC02OTMyLCAgLTEwNjEsICAgNTE0MSwgLTE2MjQyLAorIC0xMzkwLCAgIC01NDYsICAtMzc2MCwgIC0yMDI5LCAgIC05MjksICAtNjA0NCwgIC0zNTAzLCAgICAzMTIsCisgIDg0NzgsICAgIDcwMSwgICA4ODY1LCAgIDQ3MTUsICAgMTk4NywgICAxMzQyLCAgIDE0MDAsICAgIC03MSwKKyAtNTIyOSwgIC0xNTQ3LCAgLTg4MjcsICAgMjM0OSwgIDEyODM2LCAgLTE0NzksICAgNDYyMSwgICA2MDAzLAorIC02NzQ5LCAgLTMxODQsICAtNTY2NywgIC0yOTMwLCAgLTEwNzQsICAgMzIwNCwgICAgMzMwLCAgIDQ2OTIsCisgIDI4NzIsIC0xMDgwOCwgICAgIDc1LCAgLTEyNjAsICAxODAwMywgICA0MTAwLCAgLTE0NjIsICAgMTM5MSwKKyAtMTY2NywgIC0yMDM5LCAgIC02ODcsICAtNDgwNiwgICA1OTEzLCAgIDI2ODIsICAgNzczMCwgICA3MDM0LAorICAyNzAzLCAgIDE2NjYsICAgIDEyMCwgICAxNjAxLCAgIDIxMjMsICAgMTQwMiwgIC00NzAyLCAtMTEyMjksCisgIDc4NzUsICAtNTU5MSwgICA0NjM0LCAgLTIyNzQsICAgMzAxNSwgICAtNTk3LCAgLTc1MjAsICAtMTA5NSwKKyAtNDgxNCwgICAtMTczLCAgIDU1NjIsICAgMTUzMywgICAyODA3LCAgIDg0NjYsICAgNTE5NSwgICA3ODA2LAorICAyNTg1LCAgLTI4NzcsICAgNjkzOCwgIC0zOTQyLCAgICA0MDIsICAtMzgyNSwgICA0MTYyLCAgIDkxNDksCisgLTY0MjMsICAgMjQ0NywgICA3MDQxLCAgIDI5MzIsICAtOTgxMywgICAyMTI0LCAgICAtNTgsICAgICAtMywKKy0xMjg1NiwgIC03OTczLCAgIDE0ODQsICAgIDkwNywgICAgMTgwLCAgIDgwNDIsICAtMjEyNCwgICA0MzU2LAorIC00MTE3LCAgIDExMjYsICAtOTcwNiwgIC0yMTAxLCAgIDM5NTcsICAtMTg3NywgICAxMTM5LCAgIDcxNDgsCisgIDM3MDcsICAtMTM0MSwgICA0NTA5LCAgLTEyMjAsICAgNDU3MCwgIC0xNjUwLCAgLTY1MDQsICAgNzAzNiwKKy0xMDI2OCwgICAtMzI4LCAgIDQ2NzgsIC0xMjIwNSwgICA1MDYyLCAgIDYwODksICAgLTQ5NiwgIC03NzQwLAorICAyMjA3LCAgIDQ0ODksICAgLTIwNSwgICAxMzg2LCAgLTI2OTUsICAtMTQ0MiwgICA0NzMwLCAgICA4OTIsCisgMTIwNjEsICAgMzgxOCwgIC0zMzA1LCAgIDQ0MzEsICAgOTMwMCwgICAzNDcwLCAgIDQ2MDgsICAgNDMxNSwKKyAgIDg5MiwgICAgODY2LCAgLTE3MTQsICAgMTUyOSwgICAyNTY5LCAtMTEzOTgsICAtMzA2OCwgICAtMjgyLAorICAxNjI2LCAgICA1ODcsICAtMTU2OCwgIC0xNjMwLCAgIC0yMjAsICAtMjAzMywgICA3MTQxLCAgLTI3MzIsCisgLTM1NDEsICAgMzQwNCwgIDE1NTE0LCAgIDE4ODMsICAtMjY5NywgICAtOTI2LCAgIDU5NzIsICAgNjQ4NSwKKyAtNjc5NCwgICAyMTExLCAgIDI0OTAsICAgMTIwMSwgICA1NDY3LCAgLTIzNTIsICAgMzI2NCwgICAgLTk3LAorICAyNDAwLCAgIC03MjgsICAtMzM2NCwgICAzNDE3LCAgIDE0ODEsICAgMjg2MiwgICAgNDYyLCAgIDI4NTUsCisgLTUyMzMsICAgNTc0MCwgICA3MjA4LCAtMTA1MDgsICAtMzI1NCwgICAxNDUwLCAgLTEyNzAsICAgLTI5MywKKyAgMzQwMCwgIC02OTc4LCAgMTAwMzUsICAtMTIxMywgICA0MzA4LCAgIDI2NDEsICAgODU3OSwgICA4NTE4LAorIC0yOTE5LCAgIC0zNTEsICAgLTQ1OSwgIC0yMDY5LCAgIC02MTcsICAgIDYzOCwgIC0xMzQ3LCAgICAxMDcsCisgIDYwMDksICAgMjAzNSwgICAtMjgwLCAgIDIwMDksICAgMzI4MCwgIC0xMjM2LCAtMTQ5NjAsICAtNTE3NywKKyAtMjQ0MCwgICAgOTY1LCAgLTI2NDYsICAtMjA5NSwgICA1Mjc0LCAgIDE4MjUsICAgMzcwNSwgICAzODMxLAorICAtNDQ2LCAgLTQwMTgsICAgNzE3OCwgIC0yNDE1LCAgIDQzNDQsICAgMTg1MCwgICAtNTA5LCAgIC01MDAsCisgIDEwNTYsICAtNDM3NCwgICA1NzA5LCAgIDEzMzYsICAgMzM1MiwgICA3OTE1LCAgLTIzMDIsICAxMjIwOSwKKy0xNDM2MiwgICA2NDI5LCAgIDE0MjMsICAgMjkxMiwgICA2NDc0LCAgLTE1OTksICAgMTExNiwgICAyMjgwLAorIC0xNzM4LCAgIDMxMDgsICAtNTc5MiwgIC0zNTU0LCAgICA2MjMsICAtMTExMCwgIC02MTE0LCAgIDQ0ODgsCisgIDg5NDEsICAtMzE3NiwgIDEzNjcwLCAgLTMzMjAsICAgLTMyNywgIC0yNjU3LCAgLTczNDksICAgMzc4MiwKKyAtMTQ4MSwgICA1NzM3LCAgIC0yMDAsICAgMjk2OCwgIC05NDc0LCAgIDU3NTIsICAgNTA1NiwgICA0Njg4LAorIC01MzUyLCAgIC00MzIsICAgLTkwNiwgIC0zODMyLCAgLTg1MTksICAgICAtNywgICAzNjY3LCAgIDM1ODMsCisgIDYyNTAsICAgODcyNCwgIDEwNzM3LCAgIDkzNzEsICAgIDk1MCwgIC0xNjMwLCAtMTA3NDAsICAgNTc4OCwKKyAgNDExMSwgIC0yOTEwLCAgICA0MzcsICAtMjQ4MiwgICAxOTEwLCAgICAxODUsICAtMjE2OCwgIC0zMTU1LAorIC0zNTE1LCAgLTE3NTQsICAgNDk3OCwgICA0Mjk4LCAgLTY5MjEsICAgIDQ3NiwgIC0yNzc4LCAgICA1NDYKK30sCisKKy5jYjExMTBtMCA9IHsKKyAgMzY2NiwgIC0xMDc4LCAgIC0xNzUsICAgMTM3MCwgICAyNDkxLCAtMTAwNTAsICAgLTY4NSwgIC03NjE3LAorICA0MDAyLCAgMTExMDQsICAgIDkwMywgICA1OTQ4LCAgIDI4MjEsICAgMzA1MCwgIC0yNDY1LCAgIDExNTEsCisgIC04NDgsICAtMjEzOSwgIDEyMzIxLCAgLTE0MDgsICAtMTQ2OSwgICAyMDQ2LCAgLTI2OTMsICAgMjQ3OSwKKyAtMzQ5OCwgICAzMDc3LCAgLTM4MjIsICAgMTg0MSwgIC0yNDA0LCAtMTExNzIsICAgLTQwNywgIC0zMDYyLAorIC0xNzI1LCAgLTU0NzUsICAgIDU5NywgICAxOTI0LCAgIC0xOTcsICAgIDQzNCwgIC0xNjQ4LCAgIDI2NzgsCisgLTI0NjIsICAgMTE0OCwgICAgNTk5LCAgIDEyODQsIC0xMzE3MSwgICAtOTQ5LCAgLTY1MDgsICAgIDc1NCwKKyAgNzQ2NiwgICA1OTI0LCAgIDE0MTEsICAgLTUzNiwgIDEwODI1LCAgICA1ODgsICAgIDI5NywgICAtMzEwLAorICAtNTkzLCAgIC04OTYsICAgIDc4NCwgICAtMjQyLCAgICA3MTYsICAgIDUwMSwgICAgLTUyLCAgIDQwNDMsCisgIC03NTUsICAgLTY5MCwgICAyNjMwLCAgMTc3NjIsICAtMjE1OSwgICAyMTI2LCAgICA5NTQsICAtMTMxNiwKKyAxMTEyOSwgICAxNTcwLCAgICAzODcsICAtMjYzOSwgIDEzOTUzLCAgIC0zMTEsICAgNTIzMSwgIC0yMjk3LAorIC0zNjEyLCAgIC02NzgsICAtMTExNywgICAgNjkwLCAgIC0yNzksICAgMjQwMywgIC0xNTQxLCAgICA0OTMsCisgLTE2OTIsICAtMjA0OCwgICAtNzcxLCAgIC05MzMsICAgIDQyMywgICAgNzAwLCAgICA4NDAsICAgIDczOSwKKyAgMTk1NiwgICAtOTQ0LCAgICA2MTIsICAtMjY3OCwgICAgMTAxLCAgICAyNDUsICAgLTc4NiwgICAgODUwLAorICAgMjY5LCAgIDEzNTUsICAyMTc3MywgICAgNDYzLCAgLTI1ODksICAgIDU5NiwgICAtNTE5LCAgICA3ODgsCisgICAtNDMsICAgMTIyMCwgIDEwNjc0LCAgIDQ4NDcsICAgMTE5MiwgICAgMzM1LCAgICA4NzUsICAgLTEwNiwKKyAxMDY0NCwgICAyNjAwLCAgIDUzOTEsICAgLTI2MiwgICAyMjk2LCAgLTU5MjgsICAtMTA3MiwgICAtMTIyLAorICAyNTA0LCAgIDEzMTMsICAgMTExNywgICAtOTgxLCAgICAzNTAsICAgIDM3NSwgICAtODEwLCAgICAgIDgsCisgIDE0NjIsICAtMjAyMCwgIC0yMzY4LCAgICAgIDgsICAyMjY2MywgICAxNTM3LCAgICAgODcsICAgIDkwOCwKKyAgIDgzMiwgIC00ODg0LCAgICAzMTIsICAgIDYyMCwgICAxMDQyLCAgLTQ0NDQsICAgIDY2MCwgICAxNTgyLAorIC0yNzEwLCAgLTI5NTQsICAxMDAxMiwgIC05NTgwLCAgIDgxMDIsICAgNTY5NiwgIC0xMzcxLCAgLTMwMzUsCisgLTMzNDcsICAgIDQwMiwgICAgMjE4LCAgIDEwOTYsICAtMTkyNCwgICAgIDg4LCAgLTIyNzAsICAgNDE3NSwKKyAtMTA4MywgICAtNDk3LCAgLTI0MzcsICAtMzMzMiwgICAtODI0LCAgICAyMTIsICAtMjM2MiwgICA0NjAwLAorIC03ODAwLCAtMTE1MDEsICAgNzc5NSwgICAgMjM2LCAgLTEzMzYsIC0xMjkyMCwgICAgNzA1LCAgIDQ1MzIsCisgLTE0ODgsICAxMTc0NiwgIC0zMjEzLCAgLTI2NTAsICAgMjUyNCwgIC0yNjM4LCAgIC0xMjgsICAgLTMyOCwKKyAgMzQwMiwgICAgNDUzLCAgIC0yNDIsICAtMjUwMCwgICAyMjI0LCAgICA3MDgsICAgIDQ1MCwgIC0zMDE0LAorICAtMTMyLCAgIDEyNTEsICAgLTEzMSwgICAtODMxLCAgIC03MTAsIC0yMTk4NSwgICAgMjIyLCAgLTIxMzIsCisgLTMyNjEsICAgIDQ5MCwgIC0zMDIwLCAgIC04NjAsICAgMjU1MCwgICAgODkyLCAgIC02MjMsICAtMzY2NiwKKyAgLTY2NCwgICAtMTMxLCAgIDIwMTgsICAgMjgxNywgLTEyMDA1LCAgICA0OTYsICAgLTYxMCwgIC03MjM4LAorIC0zOTA5LCAgLTI4NjcsICAgNjg3MiwgICAxOTAzLCAgICA4NDgsICAgNjY0NCwgICAzODEyLCAgLTU2ODYsCisgLTQwNTUsICAgLTM3NywgIC0yMDk2LCAtMTAyNDcsICAtMTA2OCwgICAxNDg2LCAgICA0MTUsICAgLTI1MywKKyAtMjE4NiwgICAxMDUwLCAgICA3NzEsICAtNjg1NiwgICAxMDQ0LCAgIDc0NjYsICAgMjk1MywgIC03NTE0LAorICAxNjAxLCAgIDcwMTUsICAtMTc3OCwgIC0xNjIyLCAgLTMzNjQsICAtMTc1NSwgICAyODM1LCAgICAxNzYsCisgIDI3MDAsICAgIDk5MSwgICAyNTYwLCAgIC01NTQsICAgNDg2NywgICAxNTcxLCAgLTU2MTAsICAgMjYxMCwKKyAxMjQzOCwgIC0zNzUxLCAgLTk5NjQsICAtMjc1MywgICA0ODU2LCAgLTI1OTUsICAtNTQyMywgIDEwMDI1LAorICAgODEyLCAgICA2ODcsICAgMjcxNSwgICA0MDEzLCAgIDMwODYsIC0xMjAzOSwgICAgMzI4LCAgLTM5OTIsCisgIDQwNDQsICAtMzkyMCwgICAtMTExLCAgIC01NTMsICAtMTcyMCwgICAyNDU0LCAgIDE3MDYsICAtMTM2NSwKKyAgIDgwNCwgLTMyMzI5LCAgIC00NzEsICAgIDg5NywgIC00NjcwLCAgICA3ODAsICAtMzY4MCwgIC0xNDA5LAorIC0yNjMwLCAgICAgMjAsICAgIDE4NCwgICAtMTU3LCAgIC0yOTAsICAgMjc5NCwgICAtNTQ2LCAgIC0xNjAsCisgIDE1NjQsICAgMTE0NiwgICAgNjI4LCAgLTQ3ODcsICAgLTIzOSwgIDExMjMzLCAgIC00OTIsICAgMTk1NSwKKyAgIDYwOCwgICA5MjczLCAgLTMyMjAsICAgMzgzMCwgICAgMzkwLCAgLTU5ODIsICAtMzM0MiwgIC0zMzg0LAorICAyMzU2LCAgIDE4MjAsICAtMzQ3MywgICAgOTc5LCAgICAtNDAsIC0yMDE5MCwgICAgIDQ3LCAgIC0yMDAsCisgIDUxMDYsICAgLTM4MSwgICAxODI0LCAgIC0xOTcsICAgMjI4MCwgICAyNDM0LCAgLTI2MzMsICAtMTQwOSwKKyAtMTEwOSwgIC0xMDcyLCAgICA4NTcsICAgMTU1NCwgICA3NDU5LCAgICAgIDYsICAxMjEzMCwgIC0xMDc4LAorICAxMDM4LCAgIC0zMDAsIC0xMzc0OCwgICAzMjAxLCAgIC03NjIsICAgMjY3MCwgIC0xMDUxLCAgIC00NDUsCisgICA5MTQsICAgLTE3MiwgICAtNTU4LCAgIDI2MzQsICAtMTE1OCwgICAzMTI5LCAgICAtNzQsICAtMzQxNSwKKyAgMTA4NiwgIC04ODkyLCAgICAxMTgsICAgLTY0NywgICAgMjg1LCAgICAxODYsICAgMzAyMiwgIC01MDc3LAorICAxMzQyLCAgIDM0NTMsICAtNzk5MSwgICAgLTY1LCAgIDQ2OTAsICAgIDk0NCwgICAzNzE3LCAgLTE5MDksCisgLTk3ODMsICAgLTM2NywgIC0xNjk5LCAgIC03NzIsIC0zMjc2OCwgICAxMjg2LCAgIC00MDgsICAgIDM0MCwKKyAgLTM0MCwgICAgNDMwLCAgIDEyNzQsICAgIDU5NiwgICAtMTA5LCAgIC03MjcsICAgIDI3NiwgICAtOTQ2LAorICAgMTM5LCAgIDE4MDQsICAtMTA1MCwgIC0zNTYyLCAgLTEzOTIsICAtMTE3OSwgICAgMjU3LCAgIDE2MzksCisgMjU3MDgsICAgMjI3OCwgICAyNDE1LCAgIDIxNzQsICAgIDE1MywgICAgMTI2LCAgICAtNjAsICAgIDU5MiwKKyAgIDk5NCwgICAtMzM0LCAgIC0yNjgsICAgMTgyNiwgICAtMzA2LCAgLTIyNDEsICAgMjc3NCwgIC0zMTg4LAorICAgNzU4LCAgIC00NTAsICAgODAyMywgICAgNTQyLCAgIDY4MTksICAtMTcxMiwgIDE0MTk1LCAgLTIxOTgsCisgICAyODEsICAgIC0xMiwgICAtNTkwLCAgLTExNTMsICAgNDU2OCwgIC0zNjc2LCAgIDE5NzMsICAtNTIyMSwKKyAtMTgzOSwgICAtNjAzLCAgIDMzMjQsICAgMjQ5MiwgIC0zMDcwLCAgIC04NDYsICAgIDEyMywgIC0xMTg0LAorICAgNjY3LCAtMTA4ODYsICAgIC02NSwgIC0yNjE1LCAgICA5NzEsICAxMDIxOSwgIC0xMjQ1LCAgIDczNzgsCisgLTIxMjIsICAtMjMwNiwgICAgNTcxLCAgLTIyOTgsICAgMTk1OCwgIC00MzU2LCAgLTkyMTAsICAgNDMyMSwKKyAgMjgwNSwgICAxODg4LCAgMTExMjksICAgMTI4MiwgIC01ODE5LCAgLTI1MjgsICAgLTg3MywgICAxMTIzLAorIC01OTY4LCAgLTI2NDQsICAtNTUxNSwgIC0yMTUxLCAgIC05NDQsICAtNzcxMiwgIC0yMDA3LCAgLTIyNjAsCisgLTE5MjAsICAgMjEwMCwgICAtMzI1LCAgICAxNTMsICAgMTA1MCwgICAgIDEwLCAgIDE0NjIsICAgIDY1MCwKKy0xMjU1OSwgICAzNTMwLCAgICA3NTQsICAgNDQ5MywgICAxNTI4LCAgLTY5OTEsICAtNDg0MiwgICAxNDgzLAorIC0yNDA4LCAgIDI3ODUsICAtMTY1MSwgICAtODMwLCAgIDE0MzMsICAtMjQ2NCwgIDE4ODk5LCAgLTE4OTEsCisgLTMxMzcsICAgIDk5NiwgICAyNDg1LCAgIDMwNTYsICAtMTA2MSwgIC00MDE1LCAgLTIyODIsICAgMTM1NiwKKyAtMjU3MiwgICAtNDkwLCAgIDEyMDksICAgMTEzNywgICAgICA0LCAgIC02MzYsICAtMTI4MiwgICAxMDAxLAorIC0xMTkwLCAgIC0xNzIsIC0xNDA0OSwgIC00MjU2LCAgLTE5NzIsICAgMjIyNSwgIC00NzM4LCAgLTEwNTQsCisgIDUyNTQsICAgODExMywgICA0Mjk0LCAgICAgMzYsICAxMTc2NSwgIC0zOTkzLCAgLTEwODQsICAgMzg2NCwKKyAtMzAxNiwgLTEwMzU2LCAgICAzNTMsICAgMjk2MywgIC0xMjI4LCAgICA1MzYsICAgIDYwOSwgICAtMzQzLAorICAxMjQ2LCAgIDM2MTcsICAtMzY2NywgICA0Nzk0LCAtMjAzNjAsICAgIDQ3MywgICAgNzI1LCAgLTEyNDYsCisgLTE2NDksICAgMTkwMCwgIC0yNTg5LCAgLTI4NjksICAtMjU1MCwgICAtODg2LCAgLTExNjQsICAtMTg3NiwKKyAgIDMwNywgICAzNzg0LCAgLTQ3ODIsICAgLTQ3NiwgICAtNzAwLCAgIDIxMTgsICAtMTg2MCwgICAxNTMzLAorIC01MDEzLCAgIDIzNTYsICAgMzMwNSwgICAzMzM4LCAtMTQzMTIsICAtMTI3OCwgICAtMzIyLCAgIDE5NTAsCisgIC05NTQsICAtMTk5MCwgICAxNDM4LCAgIDMzNTgsICAgNzQ3OSwgICAzMDQ2LCAgLTY2NzcsICAtMzA3OCwKKyAgMTcxNywgICAzMTEzLCAtMTI0ODQsICAtMTMwMiwgICAtMjIxLCAgIC01MTAsICAxMDQyMywgIC0zNDk3LAorICA0MTcwLCAgLTM2MDYsICAgNjk4MywgIC0yOTAyLCAgICA0NTgsICAgIDY2NywgICAgNTY2LCAgIDI0MTUsCisgIC00MDMsICAtMjg5OCwgICAgLTQ0LCAgLTE4MzIsICAgLTExMCwgICAxNzk5LCAgIDExNzIsICAgICAgNywKKyAtMTUzNCwgICAgIDkwLCAgICA2ODYsIC0yNjkwMiwgICAxNjAxLCAgIC04MjIsICAgIDY1OCwgICAgMTgyLAorICAtMTUxLCAgICAzNDUsICAgMTQ4OCwgICAxNDE2LCAgIC0yNzIsICAgMTU2MCwgICA5Nzc0LCAgIDIwODQsCisgICAgMTYsIC0xNDM0NCwgICAxNDI4LCAgICA1MTQsICAgMjY1OCwgIC0xMzEyLCAgIDIwOTUsICAgIDQ1NCwKKyAtMTc4MywgIC0yMDU2LCAgIDQ1MjksICAgMTE1NCwgIC0yMjM5LCAgICA5NTYsICAgIDY2OCwgIC0xMzk2LAorIC0yODk4LCAgICA0MDUsIC0xMjY1OSwgLTEyNTU2LCAgIC02NTAsICAgLTU4NywgICAzNDYxLCAgLTI0NzAsCisgICAgIDAsICAtMzE1NiwgICAzMTg2LCAgLTQxMDQsICAgMTcyOSwgICAxNDM4LCAgLTE4NDIsICAgLTQyMiwKKyAgNDQ3NiwgICAxOTQ1LCAgIC05MzIsICAtMTQzOSwgICAtNzAyLCAgLTEzOTgsICAgMzM0OSwgICAxODc2LAorICAtOTk5LCAgLTIwODYsIC0xNzg3OSwgICAtNDMyLCAgIDQwMzYsICAtMjI5OSwgICAxMTMzLCAgICAgODgsCisgLTIyMjEsICAtMjczMCwgICAtOTM4LCAgIC05OTgsICAgLTEzMiwgICAtNDI2LCAgIDIwODQsICAgMjA2MCwKKyAtMTEzNCwgICAtMzEzLCAgICA0MDIsICAgLTUzOCwgIC0yNTkzLCAgIDIwMjIsICAgIDcyNSwgICAxNTY2LAorIC0yMDcwLCAgMjE2MjIsICAgMTc2NywgICAtNDI0LCAtMzI2NzIsICAgIDIwNSwgIC0xMjM5LCAgLTMyNTMsCisgICAxOTgsICAtMTI1NywgICAyMzQyLCAgLTE5MTgsICAgMTUwNSwgICAgNDUyLCAgIDEzNDgsICAgLTYwNCwKKyAgIDk3OCwgICAxMDc5LCAgICAgLTQsICAgMjQ3NiwgIC0xMjQ3LCAgIC0xNDYsICAgLTg2MSwgIC0xOTI4LAorLTEyMjIyLCAtMTMwNDIsICAtMTM4NCwgIC0xOTcxLCAgLTE0MjgsICAgMTIyNCwgICAtNjM5LCAgICAtODMsCisgIDEwMzQsICAgMzQ4OCwgIC0yMzEwLCAgIC01NjUsICAgICA3NCwgICAtMzM1LCAgIDI3NzQsICAgIDYwMiwKKyAgIDg3MiwgIC0yMTMyLCAgIC0xNDcsICAgMjE2MCwgICAgMjQ0LCAgICAxNjIsICAxMjYwMCwgICAgNjI4LAorLTEwMTk0LCAgLTEyOTYsICAgMTA2OCwgIC0xODI0LCAgLTQ5NDUsICAgMzE5NCwgICAyMDY2LCAgIC04OTUsCisgIC03ODQsICAgMjM0NywgIC0xOTgyLCAgICAgNzMsICAgMTAzMCwgIDEyNTg5LCAgICAtNjIsICAtMjI3MiwKKyAgMzgyNywgIC0xNzc2LCAgIDI1NDYsICAtMTQxNywgICAzMzEwLCAgIDQ3MjYsICAtMzA3OCwgICAtNTQ4LAorIC04NTIyLCAgIDE2MzIsICAtNjY2NywgICAxMDA4LCAgIDExMjgsICAgIDgwNSwgICAgOTU0LCAgICA2MTYsCisgICA0OTksIC0zMTUyNiwgIC0xMzI3LCAgICA3OTAsICAgLTE5MCwgICAxMDU4LCAgLTExNTcsICAgMTQzMiwKKyAgIC0xNiwgICAgNDExLCAgLTMxODAsICAgIDgyNywgICAgMzI3LCAgICA5MTQsICAgMTcxNiwgICAxNDQyLAorICAxMDUyLCAgLTE2MzUsICAtMTgwNSwgIC00MTQ1LCAtMTM2NzgsICAgMzU5NywgIC0yMjczLCAgLTU5MjAsCisgIDM1OTIsICAgMTEzNiwgICAtMjExLCAgICA3MTcsICAgMzkwMSwgIC01MTMyLCAgIDMwMzYsICAgLTYwMSwKKyAxMjk3NiwgICAxNjMzLCAgMTAzMTYsICAtMTY3NCwgICAtNDY4LCAgICA5MDUsICAgMjMzMSwgICAgODQxLAorICAtMjQ3LCAgLTYwNTMsICAgLTU5MywgIC0zMjgxLCAgIDQyOTEsICAgNTE1OSwgIC0xMDUzLCAgLTE4MTQsCisgIDI2MTMsICAgMjIyMSwgICAxMTQ2LCAgICA4NzEsICAgLTQyMSwgICAtNTQyLCAgICA5MjMsICAtMzU2NywKKyAtMTEzOCwgIDEwMDUxLCAgMTA4NjAsICAtNjEyMSwgICAtNjYxLCAgLTU2NzcsICAgLTg5MCwgICAtMjY2LAorICAyMTAwLCAgIDYyMjMsICAgIC03MCwgIC0yNjU4LCAgICAtNzgsICAgMzQyNCwgICAgNzE0LCAgIDIxMzgsCisgLTEzNTUsICAgLTk4MSwgICAxOTkwLCAgICA3NzIsICAgIDkzOCwgICAxMzExLCAgLTE5NjMsICAgIDkyNCwKKy0yMjUxNiwgICAgMjYwLCAgIC0zNDEsICAgMTI1MSwgIC0xNTc4LCAgICAgMjMsICAgMTM3NSwgICAxMDY4LAorICAyNjg4LCAgLTM5NjUsICAgIDcxMywgIC01MzQyLCAgIC0yNTcsICAgICAzNywgIC02MDM0LCAgIC0yNzYsCisgICAyMjgsICAtMTI0MCwgIC03MTcxLCAgLTM0MDIsIC0xNDY3NywgICAxNzA4LCAgIC0zMTcsICAtMjg4MCwKKyAgIDg3NCwgICAxNDY2LCAgICA1MjQsICAgMjA5MSwgICAgNTY1LCAgLTQyMjAsICAgLTI2NSwgICAgIDUyLAorIC0zMzczLCAgIC0yMjAsICAtMzE3NSwgICAyNjQ2LCAgICA0NDgsICAtMTYyOCwgIC0xOTg2LCAgIDIyMDAsCisgIDM3MjIsIC0xNTc1MiwgICA3MTIwLCAgLTIwMzYsICAtMjE3MCwgICAtNjI3LCAgLTEwNzksICAtNDA2MCwKKyAgMjI1NywgICAtOTI1LCAgLTM0MTgsIC0xMzQ4OCwgIC0xMzA4LCAgIDM0NzYsICAgLTc4MywgIC0zOTI0LAorICAtODIwLCAgIC04NjAsICAgMjQxOCwgICAyOTgyLCAgLTg3NTMsICAgOTAwMSwgICAgMjk0LCAtMTE5MTUsCisgIC05NjksICAgMzMyOSwgICAtNzYxLCAgIDE0NTksICAtNTMwOCwgICAxODExLCAgICAzNzksICAgIDMwNiwKKyAgIDYzMiwgIC0yNzMyLCAgIDI1MTIsICAgMTE4OCwgIC0zNDcwLCAgLTIxNjcsICAgLTU3MiwgIC0yMjc0LAorIC0xNjU3LCAgMjQwNzQsICAgLTE1OSwgICAtMTM4LCAgLTE4MjYsICAtMjUyNywgIC0zMTE3LCAgIC05MDYsCisgLTE3NzAsICAtMTE4MiwgICAxMjQwLCAgLTMwNjQsICAgMjMxMywgICAtNzkwLCAgICAzMzYsICAtMzg0MywKKy0xMzM4NCwgICAtNDIzLCAgMTMwNjYsICAgIC0xNCwgIC0xOTA4LCAgICAtMzIsICAgMjYwNywgICAgNDg3LAorIC0yNDI2LCAgICAxOTUsICAgIDEzNSwgICAyNzQyLCAgIDE1NDAsICAtMTAzNCwgICAgODU2LCAgLTIyODgsCisgIC0yODcsICAgLTc3NCwgICAgNDk3LCAgIDE3NjAsICAgIDE5MSwgICAgMTc4LCAgICAyOTgsICAgICAzOCwKKy0zMDg5OCwgICAgODAxLCAgLTE0NTYsICAgMjMxMSwgICAxMjcyLCAgLTE4NDUsICAgIDMzNCwgICAtOTMzLAorICAgMTgzLCAgLTE2MTQsICAgIDczOSwgICAxODgxLCAtMTM1NDgsIC0xMzU4OSwgICAxNDk2LCAgLTIwNzUsCisgLTEyODEsICAtMTUxMCwgICAgMTA4LCAgIDM2ODMsICAtMTEyMCwgICAgNzUyLCAgIC05ODAsICAgLTI3NywKKyAtMTI4OSwgICAyMDE2LCAgIC0yOTAsICAgMTgzOCwgICAtMzIxLCAgIC0xMzksICAgLTg4MSwgLTEyMzkxLAorLTE0NzEzLCAgIDE5MDYsICAgIDk5MCwgIC0zMjAyLCAgIDIzMjAsICAgIDc0OSwgICAxODcyLCAgLTI1NDUsCisgLTE0NTcsICAtMTcyNywgICAgNzM0LCAgIC0zMjcsICAgLTMxNiwgICAxMDYyLCAgLTMxNDksICAtMjk1OSwKKyAgMjIxMCwgICAgOTEyLCAgICA5NTIsICAgMTkyNiwgIC04OTE4LCAgIDEwOTgsICAgIDU5NCwgIC0xNDM5LAorIC0xNDAyLCAgMTEwOTcsICAgMzQ4MiwgICAtNDcyLCAgICAyMTksICAtMzg0NSwgICAtNjYyLCAgIDk3MTUsCisgIDM5MjgsICAgMTI1NCwgIC0yMDA5LCAgMTIzNzUsICAtMTcyNCwgIDEzOTM4LCAgIDE4OTIsICAtMTM5MCwKKyAgIDY4NiwgICAyMTc0LCAgIDEwMTAsICAtMTI5NywgICAtMTk5LCAgIDE4NTUsICAgIDQ2MywgICAyNjAxLAorICA0NDA4LCAgIDE5NzgsICAgMTY3OSwgIC0xNjE0LCAgICAgLTMsIC0xMTk2NSwgIDE2MjIwLCAgICA4MjgsCisgIDE0OTcsICAgLTc0NywgICAtNDg0LCAgICA1MTksICAtMTgwNCwgIC0zODE0LCAgIDMyODcsICAgMjEwNCwKKyAgMTE0OSwgICAgNDc4LCAgLTM5MTgsICAgMTUwNCwgICAyMzc2LCAgIC0zMTYsICAgLTUyMCwgIC0xNDQ5LAorIC0zOTE4LCAgICA2NjQsICAgMjc3MiwgLTE2NDM0LCAgICAzMzQsICAgLTU0MCwgICAtNzc4LCAgLTI4MTIsCisgLTYwMjYsICAtNDM5MiwgIC0yNDQ2LCAgIDM0NzksICAgMzc0MiwgICAtNjI0LCAgIDM4OTUsICAgMTE0NSwKKyAgLTM0NCwgICAgMzMzLCAgMTE4OTgsICAtMjcyNSwgIDEyODczLCAgLTExNDUsICAtMTgwNywgICAtMjc5LAorICAtNDUyLCAgLTE1ODEsICAgIDU0OCwgIC01MTgwLCAgLTIwMTIsICAgMzQxMSwgICAxMTg4LCAgLTE0MDcsCisgLTQwMTYsICAgLTQ2OCwgICAxOTA0LCAgLTE3MjQsIC0xMTM5MCwgICAgLTMwLCAgMTQ0MDIsICAgMTYxMCwKKyAtMjEzOCwgICAxMjQ5LCAgICAzNDYsICAgNjA5NywgIC0xNDMzLCAgIC02NTUsICAgLTE3NCwgICAzNjUyLAorICA0MDEwLCAgICA5NTQsICAtMTQ1OCwgICAtMzU0LCAgLTE4NzIsICAtMjY4OSwgICAgODgwLCAgIC04NDYsCisgLTEzMDQsICAtMTcyNSwgICAxNzUwLCAgLTExODYsICAgMTUyMCwgICAgNDk5LCAgIC01ODMsICAxODIwMSwKKyAtMTA4MywgIC0zMzIzLCAgIDMwNzIsICAtNTQ0MCwgICAtMTgyLCAgIDEwNjUsICAtMTExMiwgICAtOTg0LAorICAyNTAxLCAgIC01MjksICAgIDYxMywgICAyMDU0LCAgICA0NjAsICAtNTI0NSwgICAyODI3LCAgLTE0NDUsCisgLTI0MDMsIC0xMjg5OCwgICAxNTA0LCAgLTg0MjgsICAtMTAzNSwgIC00NjIwLCAgIDE3MDQsICAtMjU4NgorfSwKKworLmNiMTExMG0xID0geworICAxNDQyLCAgMTI0MjUsICAtMjA3MiwgICAgNzQxLCAgLTM2MjQsICAxMjk3OSwgICAyMDMxLCAgIC0zNjQsCisgIDM3NTAsICAtNTA4MiwgIC0xOTY4LCAgICAxNDYsICAgIDY3MCwgIC0zOTg4LCAgIC04MzEsICAgMzk2MiwKKyAgIDM5NywgICA2MjEzLCAgLTExNzgsICAgIDgxNiwgICAgLTg4LCAgIC00MzIsICAtOTYyMCwgIDExNTcyLAorICAgMTk0LCAgICAyODksICAtMTk1OCwgIC0yMTE1LCAgIC04NzEsICAgNTM3MiwgIC0zMTQ1LCAgIDM2MTIsCisgIDE2NDQsICAgIDgyNiwgICAgNTI1LCAgLTI1NDUsICAgLTUxNCwgICAtNTM3LCAgIDI0ODUsICAtMTAxNCwKKyAgMTI3NiwgICAgNTQxLCAgIC05MzYsICAgLTMwMiwgIC0xMTcyLCAgICAxODMsICAgIDgyNywgIDIzOTM5LAorICAxMTIwLCAgIC0zNDYsICAgLTMxMywgICAyNzU5LCAgIDM5MzQsICAtMzA4MiwgIC0yMjYwLCAgIC05MDYsCisgIC05NjcsICAgMTQ5NiwgICAgMTAyLCAgLTI3ODIsICAgIDMyMywgIC0xMTA5LCAgICAtMzcsICAgMjU1NCwKKyAtMjkyMCwgICAgOTk4LCAgIC05MzAsICAtMTk1MiwgIC0xMTM4LCAgIDE4NDIsICAtMTU5MywgIDE3MzQ1LAorIC0xMjE0LCAgLTEwNjUsICAgMjE4MiwgIC0xMTY5LCAgMTE3NDUsICAgIDI3OCwgICA4MzEwLCAgIDE0OTEsCisgIC01NjQsICAgMTE2OSwgICA4NDA2LCAgIDEzNTksICAtMTI0OSwgIC0yMDk0LCAgLTEzNjUsICAgNDA2OSwKKyAgMTgyOCwgICAgODk3LCAgIDEyNTgsICAgMTA4MywgICA0MzE5LCAgICA2MTAsICAgIDc2NiwgICAyMjczLAorICA0MDU3LCAgICA2MjEsICAgIDMzOCwgICAxMzE3LCAtMjA5NDEsICAgIDU0OCwgIC0yMDEyLCAgICA1NjMsCisgIDExMDIsICAgIC0yNywgICAzMDA3LCAgIDExMjksICAtMTA2OCwgICAxMjgyLCAgLTI5MzksICAgMjk4MywKKyAgMTk1OCwgICAxODAwLCAgIDE5MTIsICAgMTcyOCwgICAtNjA2LCAgIDE4MDQsICAtNDc2OCwgICA1MDY4LAorIC0xMzY1LCAgIDQ1NDMsICAgIDM5OSwgLTE0MTUyLCAgLTYyMDYsICAgNjE4NywgIC0yMjA1LCAgIDExNzQsCisgLTE4OTIsICAtMzI4NCwgICAtMjA2LCAgIDI4NzIsICAtMjYyMiwgICAgLTQzLCAgMTEyNjgsICAgLTEwNCwKKyAgIDI5MiwgIC0xODM2LCAgLTYyNzYsICAgIDcyNSwgICAyMDY2LCAgIC02MDQsICAxMTM4MiwgICAtNDQ4LAorICAgNzQyLCAgIDI4NTQsICAgLTkxMCwgICAtODM4LCAgLTE4MDIsICAgMzY3OCwgICAtMzk3LCAgIC01MzAsCistMTA2NDcsICAgMjM1NiwgIDEyMTYxLCAgIDE1MDYsICAgMjY0OSwgIC0zMzM1LCAgIDMxMjgsICAgMjE2OSwKKyAgNTk0MiwgICAyMTUyLCAgMTQxMjQsICAgIDQyOCwgICAgMTg3LCAgICAyNDgsICAgMTU5MiwgICAgLTQ0LAorICAgLTU5LCAgLTI5MzQsICAgMTg4MywgICAtOTIzLCAgIDI2NzMsICAgLTg0NywgICAgMTUwLCAgLTIxNDIsCisgLTc2MjAsICAxMTA3OCwgICAtNTk1LCAgIDY0OTAsIC0xMzY3MywgICAgOTQ4LCAgICAyMTksICAtMTMxNCwKKyAtMzA4MCwgICAxMzM5LCAgMTEwMjAsICAgMTM2MiwgICAgMjQ3LCAgLTE4NjMsICAgMTA2OSwgIC0zNzg2LAorICAxNzA2LCAgIDEwNjQsICAgIDMyMCwgICA0NTM1LCAgICAxMzYsICAgMzc5NSwgICAxNDY1LCAgLTEzNTYsCisgIC00NDksICAgICAxMywgICAtNDIxLCAgIDE3NjksICAyMDQ3MCwgICAyMTgxLCAgIC0zNzEsICAgMjQ0NCwKKyAgLTc0NCwgICAyMjYzLCAgIC0xNTUsICAgLTY4OCwgICAtMjM2LCAgLTQ0ODEsICAgMTU1MSwgICAyODEyLAorICAyNDc2LCAgLTE0MzYsICAgLTQ3MCwgICAtMjcyLCAgIDIyNzYsICAgIDU5NCwgICAtODU4LCAgIC05NzgsCisgIDExMjIsICAgMjQ2OCwgIC05MzUwLCAgIC0zNTMsICAtMTAyMCwgICAgNDk0LCAgMTMxNjcsICAgMTc3MCwKKyAgMTczNCwgICAgLTcwLCAgLTQ2MzAsICAxMjM1OCwgICAtODE4LCAgIC05NzksICAtMzkzMSwgICAxMDAwLAorIC00MzQzLCAgIDI1NzAsICAgNTU2NywgICAzMzIyLCAgIDI5MzAsICAgLTIzNiwgIC00Nzk2LCAgIDY5ODcsCisgLTE2NTgsICAgNDI5MSwgICAxMTE4LCAgIDE3MTAsICAtMjA1MCwgLTEzNTY2LCAgICAgLTIsICAgIC0yMywKKyAgMjEwNCwgICAxMTAxLCAgIC0zMTYsICAgMTkwNiwgICAxNjQzLCAgICAzNDAsICAgNTk0MCwgICAzMTgwLAorICAtODM3LCAgIDE5NzgsIC0xMDUxNCwgICAxNDY2LCAgLTY5MzYsICAgMzYwMCwgICAxMjA1LCAgICA5NTcsCisgIC0yMTEsICAtODI3MiwgICAxNjExLCAgIDUzMzAsICAtNTIxNywgIC0yMjY0LCAgLTU2ODEsICAtMzA4NSwKKyAtOTIwMSwgICAgLTYyLCAgIDMzNjYsICAgMTM3MCwgIC05NDk0LCAgICAyNDQsICAtNTUxNiwgICAxMjEwLAorICAyOTMwLCAgIC00MzIsICAtMTI2NSwgICAgMzc2LCAgLTE5MTAsICAtMTAxNiwgICAtODQ1LCAgIDMyMjgsCisgIDEwOTQsICAtMzE2OCwgICAgNjM0LCAgIC0yNjUsICAtMzQyNiwgICA0MzY3LCAgLTQwMDQsICAgLTI3NywKKy0xNTA4MSwgICAzOTk4LCAgIDk2NzEsICAgMzQxOCwgICAgNjkxLCAgIDkxMjQsICAtMjcyMywgICAxOTM5LAorICAyMzExLCAgICA1ODEsICAtNDk4MCwgICAzMzgxLCAgLTE1MDIsICAgIDg3OCwgIC0xMDM3LCAgIDE0OTYsCisgIDMwMDIsICAgIDkwNCwgIC01Mzg4LCAgLTMzMDAsICAgIDI2MywgICAxMjc3LCAgIC02OTQsICAgIDc2NiwKKyAgMTc4MSwgICAxMTM0LCAgICAyNTAsIC0zMjYwMiwgICAtMjg1LCAgICAyMTAsICAgMjU1MCwgICAtMzgzLAorICAgOTA4LCAgICAzMDIsICAgIDI5MiwgICAtMzUyLCAgIDI2MTUsICAgIC05NywgIC0xODYzLCAgIDE5MDgsCisgIDI2ODUsICAgLTUwMiwgIC0zNzY3LCAgICA0MTYsICAgIDk5MCwgICAtNjAyLCAgLTE1MzMsICAgICA0MywKKyAgMTI4OCwgICAxMzI2LCAgMTY2MzgsICAgIDQzMywgIC0xMjA0LCAgIDE4NTAsICAtMTYwOSwgICAxNDA3LAorIC03MTk2LCAgIDIzMTksICAgNTc3MCwgICAxNTg0LCAgIDExNTAsICAgLTYzNCwgIC0xNjg2LCAgIDEzNTksCisgLTEzOTYsICAgIDQzOCwgICAgMjQ2LCAgICAxODYsIC0xMTI2MiwgIC0xMTk0LCAgLTM3OTAsICAtMzI2NywKKyAgMjY5MiwgICAgNzU1LCAgICAxNDIsICAxNjI3NiwgIC0yMzM4LCAgLTEzNDEsICAxMDQzMywgICAgIDM4LAorIC0xNTEwLCAgLTI1MjAsICAtMzIwNSwgICAgOTEzLCAgIDM3ODMsICAtMTYyMiwgIC00NzQ0LCAgIDE4OTEsCisgIDI1MDIsICAgICAtOCwgIC0yOTYyLCAgIDIwOTEsICAxNDk4NiwgICAxMjcwLCAgIDI5MzEsICAgIDY4MiwKKyAgMTA3MywgLTEwMjE1LCAgIDE2MDYsICAtMTAxMCwgICAtODIyLCAgIDExNjgsICAtMTQwMywgICAgMjU0LAorICAxMTU2LCAgIDMyMDYsICAgMzk1OCwgICAxNzM5LCAgIC00MDIsICAgLTY1NCwgIC00ODYyLCAgLTE4NjksCisgIDI2NDMsICAtMjg1OCwgICAgNjU4LCAgIC05MTAsICAtMjU0OCwgICA1NDI4LCAgLTE5OTIsICAgLTIwOCwKKyAgMTk1MCwgLTE1NTI2LCAgICA1MjAsICAtNDIxMiwgICAzMTgyLCAgIDQxNjAsICAgMTUyNCwgIC0yOTE2LAorICAgNTg2LCAgIDMyMTMsICAgIDY3NSwgICAgMTg1LCAgIC02MjksICAgIDY2OSwgICAtODM4LCAgICA1MDIsCisgLTQwNjUsICAgIDM1MywgIC00MDcyLCAgLTE4MzIsICAtMjEwOCwgICA1MDM0LCAgIDI0ODQsICAxNTM4NiwKKyAtMjEwMiwgICA0OTg4LCAgICAgNzAsICAgMTAxMSwgICAyNTY4LCAgIDEzNjAsICAtMjgyMSwgICAzMzUyLAorLTExMDc0LCAgLTI2ODYsICAgIDYxMSwgICAgNDYwLCAgIDE4MTEsICAgMzA5MywgICAgIDM0LCAgLTkxNDAsCisgLTExNjMsICAgICAyNiwgICAtODc1LCAgIDI1MTAsICAgMTEzNCwgIC0xMzIyLCAgIDIyNzQsICAgLTk2MCwKKyAgLTgyMywgICAtNTEwLCAgIDEwOTIsICAgMTQ5MCwgICAxNDY2LCAgLTE5NzgsICAzMjc2NywgIC0yMzc5LAorIC0xMDE5LCAgIC02MzMsICAtMTMwNiwgICAtMjQyLCAgIDIwNTAsICAgMTMzNiwgIC0yNjY4LCAgLTIxOTUsCisgIC00NDIsICAgICAgOCwgICAyMjkyLCAgIDQzNDQsICAtMjQzOSwgIC0xNDcyLCAgIDEwMzUsIC0xNDQ0MywKKyAtMTgyMCwgICA2MzA5LCAgLTIwOTYsICAgICA0NSwgICAzNjE3LCAgIDE1NjEsICAgMTI1MiwgICAyODI4LAorIDEwNjgyLCAgIC04OTQsICAxMDg0MSwgICAyMzczLCAgIC0xMDEsICAgIDkxMywgICAyMTYwLCAgIDI2NTMsCisgIDI5NjAsICAtNDQzMywgICAxMTkzLCAgIDQ4OTIsICAtMjEyMywgIC03OTExLCAgICA5OTEsICAtMjY0MywKKyAtMTM2NCwgIC0zNjQxLCAgLTk3MzYsICAgIDQ0NCwgICAgODY5LCAgIDI5OTAsICAgIDkyNiwgIC0xMjIwLAorIC0xNjc2LCAgIDc0OTIsICAgNDM3NiwgIC0zNzQyLCAgLTY5NjQsICAgNDUzMSwgICA3NTIyLCAgLTI2ODYsCisgICAxNjQsICAgMTA3MCwgIC03MzA1LCAgIDE4NjMsICAgIDU0MiwgICAgMTQ2LCAgIC04MDAsICAxODQ5MiwKKyAtNDg0OSwgIC0zODc2LCAgIDIxNjIsICAgNTExMSwgICAyNjA2LCAgIDQyNDMsICAtMzAzNSwgIC0yOTkwLAorIC0xNzEwLCAgIC00MjYsICAtNTMxNSwgIC0yMzMyLCAgLTEwMjAsICAgLTI2OCwgIC0xMjQyLCAgICAtMzksCisgLTE2ODQsIC0zMjc2OCwgICAxMjg4LCAgIC03MjYsICAtMTc2OCwgICAgMzA0LCAgICA3MDIsICAtMjk2OSwKKyAgLTcwMCwgICAgNTg2LCAgIDE1NDEsICAtMTA5OSwgICAtMzQ4LCAgLTI4MTYsICAtMjE4MSwgIC0xMjYwLAorIC0xNjU4LCAgIDIyNzgsICAgIDMyMywgIC0xNTQ4LCAgIDI1MTMsICAxMTgxNiwgIC0yNDE2LCAgLTU4MzcsCisgIC0xMTgsICAgNjc3MCwgICAzMzYwLCAgLTQwOTcsICAgLTI2NCwgIC0xMjcwLCAgIDEwNjQsICAtOTg2MiwKKyAtMzY2OSwgICAgLTU2LCAgICA2MDMsICAtMTQ3NSwgICAxNDY0LCAgLTk1NTMsICAgICAgNiwgIC0zMDkxLAorICA1MzMxLCAgIC0zOTYsICAgIDg5MiwgIC0yNzc0LCAgLTQ2NzQsICAgMzY2NywgIC05OTgyLCAgLTUxNjAsCisgLTExNDYsICAtNDAyNiwgIC0yMDMyLCAgIDI5MzYsICAgMTgwNSwgIC0xMDI2LCAgIDEwNjUsICAgLTQyMCwKKyAgLTU3MiwgICAxNzU2LCAgIC00NzksICAgLTU4MywgIDMwNzYwLCAgIC03MzIsICAgIDc1MCwgICAgMjcwLAorIC0xNTQxLCAgICAgMjgsICAtMTExNCwgICAgLTk2LCAgIC0yNjQsICAgMTE2NywgICAgNTQ4LCAgICA1NzAsCisgICAgODQsICAtMTk4MSwgIC0yMTEwLCAgLTExMzYsICAgIDM1OCwgIC02MzM3LCAgIC0yNTcsIC0xNDY1OCwKKyAgMTE0NCwgIC05MDMyLCAgICAzMjIsICAtMzczMCwgIC0zMDg2LCAgLTEzNTEsICAtMzMyMCwgIC00MTE2LAorICAtMzk2LCAgIC0xMjksICAtMzIwMiwgICAxNDAzLCAgIC0zNDcsICAgMjQwMCwgICAtMzcxLCAgICA1MzIsCisgIDE1NTUsICAtMjc2MCwgICAxMDc4LCAgICA4MDQsICAtMTMxNCwgIDIxOTU2LCAgIDIyMzEsICAtMjgwOCwKKyAtMTk0NywgICAgODM4LCAgMTI0MjgsIC0xNDUxNCwgICAtMzg0LCAgLTE1NTQsICAgLTY3NSwgICAtODg1LAorICAxMzU4LCAgIDE2MTIsICAtMzI2NiwgICAgLTk4LCAgIDE4NzYsICAgLTQ0NywgICAyMjQxLCAgIDMzNzUsCisgLTE3NjUsICAgMjc5MiwgICAgNjc0LCAgLTE1MTMsICAtMTEzMiwgIC0zNjk2LCAgMTEzNjgsICAtMTkxNiwKKyAtMjc3OCwgICAtNDY2LCAgIC0zNzcsICAgMjA5MCwgICAzODk3LCAgIDU0MjIsICAtMjU1MCwgICAyMzYwLAorICAzMjc5LCAgIDg2NTcsICAgIDk5MCwgIC0yMTI4LCAgIDI1OTIsICAgLTk3MCwgIC0yMzk3LCAgIC0yNjksCisgMjI3NDIsICAgIDY5NCwgICAgMzEwLCAgLTI0MzMsICAgIDkyMCwgICAtNjkwLCAgIDE0NzgsICAgMTM3MCwKKyAgLTQ1MCwgICAgNDQ1LCAgLTEzNzksICAtMTI0NCwgICAyMzc0LCAgIDE0MDAsICAtMTA0MCwgIC01NjkyLAorIC0xNzAwLCAgLTE2MzAsICAtNDA2OCwgIC0xMTkzLCAgIC03MTksICAtMjk1MywgIC0zNTYyLCAgICAyNjQsCistMTMyNDcsICAtNDYyOSwgICAgICA1LCAgIDMyNDUsICAtNTcyNCwgICAyNDQ5LCAgIDMxOTAsICAtNTM3NSwKKyAtMzU2MCwgIC0zODM0LCAgIDEyNzEsICAgMTU2OCwgICAtNzYyLCAgIDI5MzgsICAgIDc4MiwgIC0xMzkwLAorICAgMjQzLCAgIC00NjYsICAgMTM3NiwgICAgOTc0LCAgLTE2NDYsICAtMTc4NCwgICAgMjQ5LCAgIC01MTQsCistMTM1NDMsICAgMTkwNCwgIDEwNzc4LCAgIC03NzIsICAgLTE1NSwgICA3ODM4LCAgICAtMzAsICAgMzYzNCwKKyAgLTQ3MywgIC05MTAwLCAgIC0xMTIsICAtMzk5MCwgICAtODQwLCAgIDE0OTUsICAtMjM0NiwgICAtMzI2LAorICAzNjU1LCAgIDEyOTIsICAgLTI5MiwgLTEwOTcyLCAgIDM0MzEsICAgLTI2MiwgICAgMTcxLCAgLTk3NzUsCisgIC05ODUsICAgIDU3OCwgICAgMzEyLCAgLTI1NTMsICAgMzM3NSwgIC04MzE2LCAgIDE0MTAsICAtMTMyNiwKKyAgMjQ1OSwgIC0zMTE2LCAgIDEwNzksICAgNzE5NCwgICAyNzIwLCAgIDE5OTgsICAgMjc0MiwgICA0NjcyLAorIC0xNTg5LCAgLTg5MzIsICAgLTEyNCwgICAtNjUyLCAgICAtNzIsICAgMjQwOSwgICAtOTI2LCAgLTM2NjEsCisgLTM3NjIsICAxNDgzMiwgIC0xMzUwLCAgLTIyMzQsICAgMTI1OCwgIC0xNjA0LCAgICAxNjksICAgIDEwMywKKyAgMTI2MywgICAtNDAwLCAgIC03NjUsICAgIDE0NCwgICAgODI0LCAgICA4NTUsIC0xMzM0NCwgIC0xNjI5LAorICAxOTc3LCAgIDI5OTUsICAtMTk2NCwgICAtNjUwLCAgIC0yMTksIC0xMTYwNywgIC02MDYyLCAgIC03OTIsCisgLTEyNDMsICAtMTQzOCwgICAxNzU3LCAgIDE0MzYsICAtMzczOSwgICAgODEyLCAgIC04NTYsICAtOTYwMywKKyAtMjQyOCwgLTExMzcyLCAgIDMyNzMsICAtMjMxOCwgIC04MjYzLCAgIDE1NTEsICAtMjA1NCwgIC0zNjQ2LAorICAzMTQ5LCAgIDIyNTUsICAgIDU5NCwgICAtNDEyLCAgLTMwMzAsICAgMTU1OCwgICAgNjk0LCAgLTEyMTEsCisgICA2MTgsICAgMzI1NiwgICA2NTI2LCAgLTE1NzIsICAtOTA1NCwgICA2NjU1LCAgLTMyMDgsICAgMzYxNiwKKyAgMjE2MiwgICAzMTM3LCAgIDQyNTQsICAgNDYxMCwgLTEwMDQwLCAgIDExODgsICAgIDMzNSwgICAtNjE1LAorICAgNjQwLCAgLTE5OTAsICAgLTMxNCwgICA2MDE0LCAgLTIzOTIsICAtMjE3NCwgICAgMzQzLCAgIDY3MzAsCisgLTEzMjAsICAgIDE4MywgICAgLTk3LCAgLTM1NjYsICAgMjk4OCwgLTEzMzQzLCAgLTE1NzMsICAtOTA3MCwKKyAgIDQyOCwgICAyODM5LCAgIDY3MjgsICAtMTEwOSwgIC0xMTEzLCAgLTExMDIsICAgNTAxMiwgICAxMzA4LAorIC0zOTQzLCAgIDMyMDcsICAgIDc2NCwgIC0yOTI4LCAgIDExNDQsICAtMzA0NCwgICA0MDMzLCAgIDE4NDYsCisgIDY0NjAsICAtNDE2NSwgICA4NTA5LCAgIDk4MjQsICAxNTcwOCwgICAtNjQyLCAgICA3NDgsICAgIDEyNCwKKyAgLTQwNiwgIDEzMDMzLCAgICA4MDcsICAgLTI5OSwgICAxMzE5LCAgIDE0OTksICAtMTIwNiwgIC0xMTAyLAorIC0zMTI5LCAgIDM3OTUsICAgICA0NywgIC0yNDgzLCAgLTI0NzAsICAgMjI4NywgICA0MDI4LCAgIDE2NTYsCisgIC0zNjQsICAtMTcxMiwgIC0xNTY4LCAgLTM5NDAsICAtMjc3MCwgLTEzNjg4LCAgICA3OTYsICAgMzM4MCwKKyAgIDM2MywgICAxNjczLCAgIDExNjAsICAtMzkzNCwgICAyODg0LCAgLTUwNjAsICAgIDgzMiwgICA0Nzk5LAorICAgMzY0LCAgLTMwMzAsIC0xMDU5NiwgIC0xODA1LCAgLTMyNTYsICAtMjQ5MiwgIC0xODMxLCAgIDEwODgsCisgMTExMDgsICAgMzIzNiwgICA1MTI4LCAgIDMwNTIsICAgNDQ4NiwgICAgIDg0LCAgIDIwNzgsICAgIDIwMCwKKyAtNDA3MSwgICAxNzEzLCAgIDE1MzksICAyNDU5NywgIC0xMDE5LCAgICAgMzIsICAgIC00OCwgICAgIDgyLAorICAgIDgxLCAgIDExNzEsICAtMTI2MSwgIC0xNzgzLCAgLTE2OTMsICAgMjE5NCwgICAxNzE0LCAgIC0yMjUsCisgLTE5ODksICAgIDQwMiwgICAyNjExLCAgIC03MDgsIC0xNTkwMSwgICAgMjIyLCAgIC01MDcsICAxMjg1NSwKKyAgMTE2MiwgIC0xNTM2LCAgLTI4ODQsICAgMTkxMSwgIC0xMjU2LCAgIC05MjYsICAtMTg3NSwgIC0xNDQ4LAorIC0yNzMwLCAgIDMwNTksICAtMTIzMSwgICAxNjgwLCAgIDE4MjQsICAgMTI4OCwgICAtMjE1LCAgICAgLTksCisgICAgNDAsICAgLTk1NywgIDI3NjYyLCAgLTE4NDQsICAtMTkyNywgICAtODQ2LCAgLTExNDQsICAgLTQzOSwKKyAtMzUwNywgIC0yODQ0LCAgLTE4ODAsICAgIDYzNywgICAxMDQyLCAgICAyMzcsICAgMTAwNywgICAtMzg3LAorLTExOTEzLCAgLTI1ODQsICAgLTE0MiwgICAgNjI0LCAgIC00OTQsICAgMTQzOSwgICAyMjI1LCAtMTMwMTcsCisgLTE5MDEsICAtMTI1MywgIC0xMDcxLCAgLTcwODMsICAtMjE1NCwgICAgODE0LCAgIDM4NjcsICAgMTEzMCwKKyAtMjYxMSwgIC0yMjYwLCAgIDE1NDgsIC0xMjM4OSwgIC0xMDE4LCAgICAxMDIsICAgMTE3OCwgICAxMDU4LAorLTE0ODYzLCAgIDIwMjAsICAgNDA5NCwgIC0xMjU5LCAgIC04NjEsICAgLTg4NiwgIC0zMTE5LCAgIDI2MzgsCisgIDE3MjUsICAtMTM2NCwgIC0yMDg2LCAgICAxODMsICAgIDUwNywgICAtOTc4LCAgLTMwODYsIC0xNDk2NiwKKyAgIDc1OSwgIC0xMzQxLCAgICAtNzAsICAgODUzOCwgICAyOTc0LCAgIC0xNDAsICAgMjUwOSwgIC00NDYwLAorICAyNzI0LCAgLTEzNzIsICAgIDQ5MSwgIC02MTM4LCAgIC0zNDUsICAtMjE3MCwgIC0xMTg3LCAgIC0zMzAsCistMTEwOTAsICAxNTY1NywgICAtMzAwLCAgIDIxMDUsICAgIDQ5NiwgIC0yMDkzLCAgIC00NDcsICAgMjAwMCwKKyAgMzQ1MSwgICAxNDgyLCAgICA3NTgsICAgNDE0MiwgICAgNTYyLCAgLTQwNDIsICAgMTQ5MSwgICAzMTgzLAorICAxNjg1LCAgLTI3MjksICAgMTYxMSwgIDExNjk4LCAgMTQ5MTgsICAgICAyNSwgICAgODQyLCAgLTI3NjYsCisgIC02NjcsICAtMTU2NCwgIC0yNjE5LCAgICA2NDYsICAgMTM5MSwgICAgODYyLCAgIC05MDksICAtMjE0MSwKKyAgLTU4OSwgICAxNDY4LCAgIC03NTUsICAgMTMyNCwgICAtNzY1LCAgICA2MzQsICAgIDE5NSwgLTE5NjIyLAorIC0xMDA2LCAgLTExNjEsICAgMjQzNCwgIC0xODA4LCAgIDQxNjgsICAgNDEwOCwgIC0yNTgwLCAgIC02MzUsCisgLTI1MzMsICAtMjE3MCwgIC0zNzAxLCAgLTEwNDcsICAgLTM2MywgICAgNzY5LCAgIDUwNjQsICAgICAtOCwKKyAgLTY1NCwgICAyMzQ2LCAgICA3NTIsICAxMzczNiwgIC00MDU2LCAgICAgIDcsICAgNTQ5MiwgICA3MzI2LAorIC00ODk0LCAgLTM4NjAsICAgMzMyNSwgIC0zOTQ3LCAgIDQ3MjEsICAgNTU1NywgIC0zNjk5LCAgICAxOTQsCistMTI5NTcsICAgMTA1MiwgIC0xMzE3LCAgLTI2NDIsICAtMjkzMSwgICAxMDUwLCAgLTM5NTEsICAgMjM5MiwKKyAtOTY4MywgICAyNTE5LCAgIDI4ODAsICAtMzcwMCwgIC0xODIwLCAgICA4MzEsICAgNDM3MCwgIC0xMTc3Cit9LAorCisuY2IxNjE2bDAgPSB7CisgIC0xODUsIC0yMDI5MCwgICAgNDc2LCAgIC0yNzIsICAgICAzMSwgICAtNjM4LCAgICA4MDYsICAgIC02MSwKKyAgIDIyMCwgICAgMTc2LCAgICAxNzgsICAgLTc4OCwgICAtNDQxLCAgIC0zMzMsICAgLTM2MCwgICAtMjYzLAorICAtMTE2LCAgIC01MTIsICAgOTc5NCwgICAtNzI3LCAgIDg5MDQsICAgMTE5MiwgICAtMjc3LCAgICA3NTYsCisgIC02NzAsICAgIDc5NSwgICAtMzExLCAgICAyNDAsICAgLTYxNywgICAtNjc1LCAgIC05NzAsICAgIDc1NiwKKyAgIDg1NywgICAgNTI5LCAgIC0xNjYsICAgIDY3NCwgICAgODkwLCAgIC01MjIsICAgIDgzNywgICAgIDc5LAorICAtNjE4LCAgLTEzMDgsIC0xMzgzMiwgICAgNzQ0LCAgIDU0MjIsICAgMjY4OCwgICAgNTMxLCAgICAzOTgsCisgIDE1MDAsICAtMTk2NSwgICAtMjA5LCAgIC0zNDYsICAgIDYxMywgICAyMTQ3LCAgMTAwNTMsICAtMTM5OCwKKyAgIDE4OSwgICAtMTA4LCAgICA0NzEsICAtMTIwMiwgICAgOTk5LCAgICAxNzgsICAgIDc2MiwgICAtNjAxLAorICAxMTE2LCAgIDk0NjgsICAgLTI4MSwgICAgNzYzLCAgLTEyMDQsICAgLTgyMiwgICAgLTIwLCAgIC0xNjAsCisgIC04MDYsICAxNDcyMCwgICAtMjY5LCAgICAxNDMsICAtMTM2MiwgICAtNTMyLCAgIC03ODgsICAtMTUzMiwKKyAgLTQwNSwgICAgIDg1LCAgIC0yNzEsICAtNDk1OSwgICAgMjc2LCAgICAtMzQsICAgIC0yOCwgICAgLTY2LAorICAgMTEyLCAgIC0xODgsICAgLTU4MiwgICAtNjc4LCAgICAxMjgsICAgIDY4MCwgICAgOTgyLCAgICA1OTYsCisgMTIxNTQsIC0xMDQ2OCwgICAtMTY3LCAgIC0zODAsICAgIDczNCwgICAtMjk2LCAgICAyODIsICAgLTIyMywKKyAgIC04NiwgICAtMzQyLCAgIC04MTIsICAgIDUxNCwgICAgMzg3LCAgIC00MTgsICAgLTM2NCwgIC0xMjE2LAorICAgIDE0LCAgICAzNzMsICAgIDM1NywgIDEwODk3LCAgMTEyMzUsICAgLTcxNCwgICAgMjA2LCAgIC02MTgsCisgIC02MDcsICAgIDU5NiwgICAgMTkwLCAgICA3MjYsICAgIDQ5NiwgICAtMzAwLCAgICAgOTUsICAgMTAyMiwKKyAgLTE1MywgICAgMjEyLCAgIC01NDAsICAgIDI1MiwgICAgMjgxLCAgICAyMzgsICAgLTIzNCwgICAgIDI4LAorICAgIDI0LCAgICAxODQsICAzMjc2NywgICAtNjI3LCAgICA1NjksICAgIDMyMywgICAgNDg2LCAgICA1NDQsCisgIC0zNDgsICAgLTU4OSwgICAtMjg0LCAgICAyMzgsICAgIDIyOCwgICAgNDc1LCAgICAgODMsICAtNzc1MywKKyAgIDE4MiwgICAgNzQ1LCAgICA0MDAsICAgLTYzMywgICAtMjA3LCAgICAxMzcsICAgIDM4MiwgICAgIDkwLAorICAgIDc4LCAgICA3MTUsICAgIDQ0OCwgICAgNDYzLCAgICA5MzcsICAxMDIwMywgLTEyMDQ3LCAgIC02NjcsCisgIC0zNzAsICAtMTUxNiwgICAtMzYwLCAgICAgOTQsICAgIDgzMiwgICAxMDI3LCAgIDEwMTMsICAgICA5MiwKKyAtNTQ0NiwgICAgODM0LCAgICAzMDIsICAgIDc2NCwgICAgLTk0LCAgIC00NjIsICAgODA5NSwgICAxMDU3LAorICAgMzA4LCAgIC02MzUsICAgIDMwOCwgICAtODc3LCAgIC05NDYsICAgLTYxNiwgICAgIDUxLCAgIDEwOTAsCistMTMzNTEsICAgIDQ5MCwgICAtODE5LCAgMTUxODIsICAgLTM4NCwgICAgNDExLCAgIC01NDYsICAgLTI0MiwKKyAgIDQ2MCwgICAtMzIzLCAgICAgNzYsICAgIDI3NywgICAxNTgyLCAgICA5MDAsICAtMTExOSwgICAgMzQ1LAorICAxMzE2LCAgIDExMzgsICAgMjAyMCwgICAxNjEyLCAgIC0xNDgsICAgIDgxMiwgICAxMjQxLCAtMTAzNTAsCisgLTk0OTUsICAgLTk2NSwgICAgLTY5LCAgIDE5NjcsICAgLTE2OCwgICAtMTI4LCAgIDEwNDIsICAgIDQ0NywKKyAgIDQ5MSwgICAtMTMzLCAgLTUwODMsICAgLTQ1MCwgICAtMTY0LCAgICAgNTAsICAgIDMyNiwgICAgMjY5LAorICAtMjgzLCAgICAyMjYsICAgIC00MCwgICAtMzM0LCAgIC0xMTAsICAgICA2MCwgICAgLTQ3LCAgICAxNjksCisgIDkxNjYsICAgMTE4OCwgICAtOTQyLCAgICAtMTQsICAgMjExMiwgICAtMjMwLCAgICA2MzQsICAgLTc0MSwKKyAgLTIxNCwgICAtMzM2LCAgIC02MDYsICAgMzEwMiwgICAgIDU5LCAgICAyMTYsICAgMTgwNSwgIC0xMTc2LAorICAgMjExLCAgICAgLTgsICAgIDU2NCwgICAgMTU2LCAgIC0yNjEsICAgIDMwMCwgICAgNTk3LCAtMjE4NDIsCisgICAgNjYsICAgLTIzMiwgICAtNTA2LCAgLTExMjYsICAgMTA1NywgICAgNjAzLCAgIDE0NDgsICAgLTM5MSwKKyAgIDI0OSwgIC05NDQ1LCAtMTAyNDAsICAgIDY5NCwgICAgMTY3LCAgLTExNTgsICAgLTY0NSwgICAtMzg1LAorICAtMjA5LCAgICAzMzAsICAgIDUxOSwgICAtMzQ1LCAgIC02MDAsICAgIDE5MiwgICAgIDc4LCAgIC0yMjksCisgICAyMDgsICAtOTA1MywgICAtMzgzLCAgMTA2NDYsICAgLTI2NCwgICAgIDg0LCAgICAyOTUsICAgLTE0OCwKKyAgICA4NywgICAxMjkyLCAgICAyNTcsICAgMTA4MCwgICAtNTY0LCAgLTIzOTUsICAtMTIwMCwgICAtNDg0LAorICAgLTQ4LCAgIC01MTMsICAgLTM4MywgICAgLTExLCAgIC01MTYsIC0xNzM1NiwgIC0xMTcyLCAgIC0yMTgsCisgICAxMjQsICAgLTMyNywgICAgIDMxLCAgICAzMjgsICAgIC04MCwgICAgMjMxLCAgICAgNTgsICAgLTk1MSwKKyAgIDU2MCwgICAtNTAxLCAgIC0zOTIsICAzMDUyOCwgICAgLTU2LCAgICAzODIsICAgLTUxNSwgICAgLTUwLAorICAtMTU1LCAgICAzMzgsICAgICAgMCwgICAtNDE0LCAgIC04OTksICAgICA5NSwgICAgIDExLCAgICAzNzgsCisgIC0zNTAsICAgIDQ1OSwgICAgNjczLCAgICAgNzYsICAgICA4NiwgICAgMzc5LCAgMzIyMjIsICAgIDE0MywKKyAgIC00OCwgICAgNDI1LCAgIC0zOTQsICAgIC02MCwgICAtMzQ4LCAgICA0NTAsICAgLTQ4OSwgICAgMjIwLAorICAgIDU2LCAgIDExMjksICAgLTEyNSwgICAgMzIyLCAgICAxNjgsICAgIC0xNiwgICAgMzIyLCAgIC0yOTMsCisgICAyOTQsICAgIC0zOCwgICAgMzI4LCAgICAxNDEsICAgIDY5MiwgICAgLTgyLCAgIC0xNjAsIC0zMjc2OCwKKyAgLTE0MCwgIC0xNTQzLCAgIDEwNzksICAgMTA1MiwgICAtOTI0LCAgIC01NjksICAgIDE2OCwgIC0xNzgyLAorICAgODE1LCAgICA3MDYsICAtMTMxOCwgIC0zNDM2LCAgIDI4NjAsICAxMDkyMiwgICAgMjM2LCAgMTAzMTEsCisgICA4ODIsICAtMTkxMSwgICAgIDExLCAgIDE2MzgsICAgLTE4OSwgICAgMjQ1LCAgIC04NTgsICAxMTA2MCwKKyAgLTgyNiwgICAgNjk2LCAgICAyMjQsICAgMTcwNywgICAxNzY2LCAgICA0NzIsICAxMDgzMiwgICAtMjY1LAorICAtMTYxLCAgICAxNjMsICAgIDQ3OCwgICAtMjU4LCAgIC0yODQsICAgIC04NiwgICAgNDk2LCAgICA0MjUsCisgICAtNzEsIC0xMDM0NCwgICAtMTQxLCAgICA0MjUsICAtMTQ1NywgICAxMTQ1LCAgICAtNjMsICAgLTcxMywKKyAgLTU4MywgICAtMzI3LCAgICA2MjgsICAgIDM2OCwgICAgLTE4LCAgLTE3NDYsICAgLTUyNSwgICAtMzM4LAorICAtMTEwLCAgIC0zNTksICAgICA5MiwgICAtMjMzLCAtMjEzMjgsICAgIDQ2MCwgICAtMjc1LCAgICAtOTgsCisgICAtNTgsICAgICA1MSwgICAgMjA4LCAgICAgNTYsICAtMTE0NSwgICAgLTUxLCAgIC0yNDIsICAgICA2NSwKKyAgICA3NiwgICAgMjE0LCAgICAxNDEsICAgICAyOCwgICAgLTg2LCAgICAgMjYsICAgIDkyNSwgICAgMTkzLAorICA5OTgwLCAgIC0zMjYsICAxMTM0MiwgICAgMTc2LCAgIC01MzQsICAgLTMwMywgICAgMTMwLCAgLTE1NzUsCisgICAxODksICAgLTQ5NiwgICAtNjk5LCAgICAzODEsICAgIDQxMSwgICAgNjQ0LCAgICAyMjksICAgLTE0NywKKyAgIDY5NCwgIC0xOTk4LCAgICA1MjMsICAtMTU3NiwgICA4MDI4LCAtMTAzODUsICAtMTkyNCwgICAxMTc0LAorICAgNjA4LCAgIDI0MDIsICAgIDU3NSwgIC0xNzUzLCAgICA0MzcsICAgLTgxNiwgICAxMjY3LCAgICAxNDcsCisgIDE0NDgsICAgLTYxNCwgICAgODY1LCAgIDEwNzYsICAgLTE1NiwgICA1MDAwLCAgIDIwMjAsICAgMjAyMSwKKyAxMDI4MywgICAtNDYwLCAgLTIzODEsICAtMzIyNiwgIC0zOTkxLCAgIDQ5MDQsICAgLTI4NCwgICAgMTA1LAorICAtMjY4LCAgIDEwNDksICAgIDIwMywgICAtNjQ2LCAgICA3MzIsICAgNjQ5MCwgICAtMTI4LCAgICA5MzIsCisgICAgMTAsICAgLTg2NiwgICAgIDc0LCAgICAtNjQsICAgIDgzNCwgICAgMjA0LCAgICAxNTksICAgLTE2MiwKKyAgLTE3MCwgICAtMTEwLCAtMjg5MDgsICAgICA1MiwgICAtNTEyLCAgICAtNzIsICAgIDMyNywgICAgNjE1LAorICAgNTM0LCAgIC00ODQsICAgIDEzMSwgICAtMjYyLCAgICAgMzEsICAgLTQwNywgICAgMjg0LCAgICAgMzMsCisgMTExMTgsICAgLTE3MCwgICAgMzE4LCAgMTI4NDgsICAtMTEyNiwgICAtNjU5LCAgICA1MDAsICAgIDMxMCwKKyAgLTQwMywgICAtMjM0LCAgICAyMzcsICAgLTU0NCwgICAxMjMyLCAgIC0yNDMsICAtMTE3OCwgICAtOTY1LAorICAtMTE3LCAgICAxMDgsICAtMTMwNCwgIDExNzI4LCAgLTIyNTQsICAgMTIzMSwgIC0xMDc3LCAgIC0xMzYsCisgIC02MzIsICAgLTEwMywgICAtMjU2LCAgLTE2NDQsICAgLTMwMCwgICAxNjgwLCAgLTExNzUsICAgLTk1NiwKKyAgIC00MywgICAxNzE4LCAgICAxNzUsICAgIDE0NCwgICAgMjc1LCAgIC04MDIsICAgLTIyMywgICAxMTE2LAorICAgMzIxLCAgIC04NzEsICAtMTE3NCwgIC0xMTc1LCAgIDEwMDgsICAgIDI1NSwgIDMxMTcyLCAgICAgMjgsCisgIC02MjEsICAgLTIyMiwgLTEyNDczLCAtMTA5OTUsICAgLTcxMiwgICAgMjQ3LCAgIDE3NjIsICAgIDQxOCwKKyAgLTE4MSwgICAgIDkwLCAgICAgOTIsICAgLTQwNiwgICAtNDM1LCAgIC0xMDUsICAgLTU5NiwgICAyMjYyLAorICAtMTE2LCAgLTE1NzQsICAtMzQwMiwgICA2Nzk2LCAgIDc5NDQsICAgIDk3MywgIC0yNjYxLCAgIDIyNjAsCisgICA2MjEsICAtNjk4NCwgICAgMzgyLCAgLTEzNzUsICAtMjYwNCwgICAxNTUwLCAgLTE0NTMsICAgMTEzMywKKyAgIDk2NiwgICAgNDAzLCAgICAyODQsICAgIC03MiwgICAgLTM2LCAgICAxNzQsICAgIDQ1NywgICAgLTkwLAorICAgIDM4LCAgIC00MzcsICAgLTQ3NiwgICAtMzcwLCAgICA0NjksICAzMjc2NywgICAtMjY3LCAgICAzNTAsCisgICA2OTQsICAgLTE2OSwgICAtNzgyLCAgIDIxMTAsICAgLTYyMCwgICAtNzgyLCAgIC02NjksICAtNjQ3OCwKKyAxMDU1MCwgIC0zMjk0LCAgICA0ODUsICAgIDE3NywgICAgNTUzLCAgLTMyMzIsICAgMTYyOCwgICAyMzM1LAorICAtODcwLCAgIC0zNjAsICAtMTExMiwgICAyMTk3LCAgIC00NzQsICAtNTExMywgICAzMzQ2LCAgICA4NzgsCisgICA1NjYsICAtMzgyMywgIC0xMTc1LCAgICAzNTcsICAxMDUwOSwgICAxMDc3LCAgIC01MTQsICAgMTAxMiwKKyAgICAzOCwgICAgIDU5LCAgICA2NjksICAgIDY1NCwgICAgMzQ5LCAgLTEwNDYsICAgIDM1NSwgICAgMTkyLAorICAgIDU3LCAgICAgOTUsICAxMTg2OSwgICAtNzAyLCAgMTAyMDEsICAgIDIwNCwgICAgIDQ1LCAgIC02MDgsCisgIC00NDQsICAgIDkyMSwgIC0xMDcwLCAgIC0zMTYsICAgMTI4NiwgIC0yNTY2LCAgIDIwMjYsICAgLTEyNywKKyAgIC03OSwgICAtOTU0LCAgICAgOTMsICAtMTI4OCwgLTEwMDI0LCAgICA2OTMsICAgODgyMCwgICAtMzY2LAorICAgLTg0LCAgLTYzNzgsICAgMTY4MiwgICAtNjI3LCAgICAzODYsICAgIDI1NCwgICAgNTAzLCAgIC0xNTIsCisgIC0zMzYsICAgICAzOCwgICAtMzQxLCAgICAzNzMsICAgIC04NSwgICAxMDg4LCAgLTE3MDcsICAgIDExOSwKKyAgLTI0MiwgICAgMjQyLCAgIC0zMjYsICAgLTE2MiwgICAgMTA5LCAgICAgNzAsICAgLTExNCwgICAtODMxLAorICAtMjc5LCAtMzI3NjgsICAgICA2MiwgICAgIDU4LCAgICAyMTQsICAgIDEzNiwgICAgMTk0LCAgIC0xMDMsCistMTAwNDcsICAgLTYxMCwgICAgIDkxLCAgIC0zMTAsICAxMjA1OSwgICAgMzQ2LCAgIC02NTYsICAgIDk4NiwKKyAgIDQ3OCwgICAgMzY0LCAgIDE3NzcsICAgLTE3MywgICAtNjYzLCAgIC0xMDMsICAgMTAxMSwgICAtMzczLAorICAgMjAwLCAgIDE2MzIsIC0xMzA5OCwgICAzNjUxLCAgICA0MTgsICAgIDQ3OCwgICAgIDY4LCAgIC0yMTcsCisgICAxNjksICAgICA3OCwgIC0xMTc2LCAgLTExOTEsICAtMTY2NCwgICAtMzI4LCAgICAxNTIsICAtMTA1MywKKyAgIDU0NywgICAgNTI3LCAtMTA0MzUsICAgLTE3NiwgIDExMTMxLCAgIC0xMzcsICAgIC0zNiwgICAxMDYyLAorICAgIDMzLCAgICAgNzEsICAgLTczMCwgICAyMDgwLCAgIDIwNjEsICAgLTM3MiwgICAtNjM3LCAgICAtODQsCisgICA3NDQsICAgIDEwOSwgICAtMzU3LCAgICA1NTAsICAgIDMwOSwgICAtMjM5LCAgIC0xMzQsICAgIDEzNSwKKy0yMDQ2MSwgICAtMTc3LCAgIC02OTAsICAgLTQ4OCwgICAgLTM2LCAgIC00MTUsICAgIDI3NSwgICAgIDY0LAorICAgMzc4LCAgMTEyNTAsICAgLTgwMiwgICAtNTY5LCAgIC0yMDAsICAgMTQ5OSwgIDEzMTAzLCAgLTEwOTAsCisgIC0xNzUsICAgIDE4OSwgICAtMTYyLCAgIC03NTEsICAgMTA1MiwgICAtOTQ5LCAgICAtOTgsICAgMTI0OSwKKyAgIDQ3OSwgIC0xMzA0LCAgIDMyOTMsICAgIDc3MSwgICAxNjQyLCAgIC0zODEsICAgMTQyMywgICAyMjU4LAorICAxMTg0LCAgIDQ4MDYsIC0xMDk1MCwgIC0zODczLCAgICAzNDgsICAgLTgxNSwgIC01MzE1LCAgLTMzMDYsCisgLTMzMDcsICAgMjMzNywgICAgNzc2LCAgIC0xMjUsICAgIC00OCwgICAtNDM1LCAgIC0xNTUsICAgIC0zMCwKKyAgIDI5NCwgICAgMTE2LCAgICAgOTYsICAgIC00NywgICAxMDIyLCAgIC0zOTEsICAgLTE4MywgICAgMjUyLAorICAgODI2LCAgICAtMzIsICAgIDI5MywgIC0xMzY5LCAgMTgzMTAsICAgLTE0NiwgICAgMjM5LCAgIC0yNjYsCisgICAgMzQsICAgLTE1NCwgICAtNzA0LCAgIC00OTgsICAgLTEzNSwgICAgMjI4LCAgIC01NjMsICAgLTIxMCwKKyAgLTE1OCwgICAtNTE0LCAgIC0yMDEsICAgLTU3MSwgICAtMzQxLCAgIC00MjgsICAgICA3NCwgICAtMTUyLAorICAgMjk3LCAgIC0xNjIsICAgLTY0NCwgICAtMjE2LCAgIC0yNTIsIC0xMzgxMCwgICAgNzA1LCAgICA0NjQsCisgMjEwOTcsICAgICA3NCwgICAtMTY5LCAgICA3OTIsICAgICAxMiwgICAgMTMxLCAgICAzMjAsICAgLTM5OCwKKyAgLTQ0NiwgICAgIDQ0LCAgIC0zNjIsICAgIDM4OCwgICAgLTIyLCAgICAtMTMsICAgLTIwOSwgICAxMjA1LAorICA5MzQxLCAgICA1OTAsICAgLTY4MywgICAtMzUxLCAgICAxNzcsICAtMTYxOCwgICAgNDk1LCAgICAgMTQsCisgIC0zMTksICAgIDc1NSwgIDExMzUyLCAgICAyNDksICAgLTk4OSwgICAxNTc0LCAgIC05MjIsICAgLTM2NCwKKyAgIDM2NiwgLTEwMzQ4LCAgICAzMzcsICAgLTU1OCwgICAtMTI0LCAgMTIwNTYsICAgIDEwMiwgICAgODAyLAorICAtNTQ4LCAgIC0yNTQsICAgMTUzMiwgICAgICA3LCAgIC0yODIsICAgLTQ1OSwgICAtODM5LCAgICAxNzEsCisgLTQ0NDUsICAtMTYxMCwgIC0xNTE1LCAgICAtMzcsICAgIDk3MCwgICAgMzA2LCAgIC04ODEsICAgLTIzOCwKKyAgLTE1NCwgICAgLTU4LCAgICAgMjcsICAgIDQzNSwgICAgMTY2LCAgICA1NzEsICAgIDIyNSwgICAtODQ0LAorIC05OTY3LCAgIC0xOTIsICAgLTg3NCwgICAtNDU5LCAgLTEyODMsICAtMTQzMSwgICAxNTUyLCAgICAtMzgsCisgIC02ODYsICAgLTIwNywgICAgNzA5LCAgMTE5ODIsICAgLTM4MywgICAxOTIyLCAgICAtOTIsICAgIC02MCwKKyAgIDcwOCwgICAtOTAwLCAgICA4NjcsICAgICAzOSwgICAxNDcwLCAgICA1MTcsICAgLTE4MiwgICAtNDU2LAorICAgIDkwLCAgIDEwMjYsICAgLTE5MiwgICA5OTg4LCAgICA5NDIsICAgICA0OCwgICAgNzg5LCAgICA5ODEsCisgICAgNzQsICAgLTY5MiwgIC0xMjgzLCAgIDEyMzksICAgMTYyNSwgIC0xMTIxLCAgIC0yODYsICAtMTExNSwKKyAgIDI5NCwgIDEzMjI4LCAgICA5ODAsICAgIDMxMiwgICAtNzQ1LCAgMTE3MTEsICAgMTA1NSwgICAxMDUyLAorICAtOTA3LCAgICAyMDEsICAgIDY4OCwgICAgMzY0LCAgIDExNzEsICAgICA5NiwgICAtNTkxLCAgIC05ODEsCisgIC0yNDYsICAgIDg3NSwgICAtMzUyLCAgICA2NzcsICAgIDg4MSwgICAtMzk3LCAgMTI4OTAsICAgICAxMCwKKyAgICAgMCwgICAgNDEyLCAgICAgNzYsICAgIDQ2NCwgICAgMjc1LCAgIC03MjEsICAgIC0yOCwgICAtMTk3LAorICAgMTA0LCAgIC0yMzgsICAgLTM3MiwgICAtMjcyLCAgICA0OTAsICAgMTQyNiwgICAgOTYzLCAtMTMyMzIsCisgLTExOTAsICAgIDc5MCwgICAgMTYxLCAgIC0zMjEsICAgMTEzOCwgICAgNjQ2LCAgICAzNTksICAgLTE4MywKKyAgLTY1OSwgICAtMTI5LCAgICAzNDgsIC0yMjcwMywgICAxMDE2LCAgIC0xNDcsICAgICAyNiwgICAgLTgwCit9LAorCisuY2IxNjE2bDEgPSB7CisgICAyOTIsICAgIDMxMCwgICAtMjU1LCAgICAzMDUsICAgICA2OSwgIDI1MDAxLCAgICAtMTYsICAgLTY2OCwKKyAgIDIxMCwgICAgIDE3LCAgICAtMTIsICAgICA0NSwgICAtNzU4LCAgICAtNzYsICAgLTU0NCwgICAtODgyLAorICAgIDYxLCAgICAgMjYsICAtMTY4MiwgIC04ODIwLCAgICAxNTQsIC0xMTc3NSwgICAgIDY0LCAgICA0NzIsCisgIC00NjQsICAgIDI0NSwgICAgNDc4LCAgLTE1NjAsICAgIDg2OSwgICAyMTkyLCAgICAgOTgsICAgIDY0NSwKKyAgIC05NSwgIC05MzY5LCAgIC01OTQsICAgLTYzNSwgLTExMTMyLCAgICA5MDAsICAgMTYwNiwgICAtOTA0LAorICAgODQxLCAgIDI1NzAsICAtMTQ2NCwgICAgOTYxLCAgIDEwNTYsICAgIDY2OSwgICAgNDYxLCAgIDMzMDcsCisgIC0xNTcsICAgLTY0NCwgICAgMTIxLCAgIC02OTQsICAgIDE3MCwgICAgMTE2LCAgICAzOTMsICAgMTUwNywKKyAgLTIzMywgICAtNjU0LCAgIC0xNjIsICAgIDEwOCwgICAgIDk4LCAgMTc0NzEsICAgIDM0NywgLTExMzQ0LAorICAtNzAxLCAgIC0yODQsICAgLTI0NiwgICAtMzM3LCAgLTE5MDMsICAgICAxNCwgICA5ODY1LCAgICA0NTMsCistMTEzMTgsICAtMzY2MiwgICAyMzczLCAgIDExMDYsICAtMTQyNCwgIC0xNzA5LCAgLTI3NDMsICAgLTg2MCwKKyAxMTAwOCwgICAxNTc5LCAgICAtMzgsICAtMTM4MSwgICAgNDY3LCAgIC00ODcsICAtMTMwNiwgICAgMzY5LAorICAgNDI2LCAgIC00MjQsICAgIDEyOCwgICAxMDc4LCAgIDEwODUsICAgIDY4MywgIDEyNTUyLCAgICA3OTIsCisgIC0xODQsICAgLTI3OCwgICAgMTg2LCAgIDIwMDYsICAgIDM2MywgICAgMzEwLCAgICAtNzUsICAgIDg2MiwKKyAgIDM3NywgICAgNDkwLCAgIC0yNTYsICAtMTU2OCwgICAtMTI0LCAtMTA3ODUsICAtMTQ1NiwgICAtNTI0LAorIC0xMjU5LCAgICA1MTcsICAtMTg0NCwgICAgOTE0LCAgICA3NjksICAgIDk0NSwgICAgNzM5LCAgLTEwNTMsCisgIC02OTEsICAgIDE3NywgICAgIDk2LCAgLTEwNzAsICAgLTE2MiwgICAtNzA3LCAgIC01OTQsICAtOTg4NSwKKyAgIDEwMywgICAgNDUyLCAgIC03MzQsICAtNjc3NCwgICAtNzUzLCAgICAxOTIsICAgICA4OCwgICAtMjkyLAorICAgMjAxLCAgIC01MzIsICAgIDIzMSwgICAtMjgxLCAgIC02OTEsICAtMTIzMiwgIC0xNzY4LCAgIC03NTMsCisgICAzNjksICAgMTU1NiwgICAtMTM5LCAgICA2NjgsICAgIDk0MSwgICAgMjY0LCAgMTAzNzIsICAgOTc0MCwKKyAgIDk3NiwgICAyNTE5LCAgICAtODgsICAgIDk0MSwgICAgNDQ2LCAgIC0xMzAsICAgMjEzMSwgICAtNjMxLAorICAgMzI1LCAgICAyODUsICAgIDE3NiwgICAtMjM2LCAgIC02MzQsICAgIC05MSwgICAgMTEyLCAgMzI3NjcsCisgIC0yMzMsICAgLTcyNiwgICAgMTU2LCAgICA4ODEsICAgLTIxNywgICAtNDk3LCAgIC0yMzYsICAtMTEwNiwKKyAgIDI4MywgICAgMTY0LCAgIC0zMjgsICAgLTYyOSwgLTI3NDQyLCAgICAtMTcsICAgIDE3NiwgICAtMzM4LAorICAtMTkyLCAgICA1MzgsICAgLTc3MywgICAgNjM0LCAgIC0xODAsICAgIDg3MiwgICAtMTkwLCAgIC01MzAsCisgICA1ODYsICAgNjk5NCwgICAzMDYwLCAgIC0zMzYsICAgIDczNiwgIC0xMjY4LCAgLTExNDIsICAgIC02OSwKKyAtMTM1OSwgIC0xMDQ3LCAgIC05NzUsICAgIC04NiwgIDEyNDg5LCAgIDExNjIsICAgLTUwOSwgICAtNDc4LAorICAgNzE3LCAgIC01MTQsICAgLTUwMiwgIC0xNzU1LCAgMTEwNjQsICAgNzY2OCwgICAgMzQwLCAgICAyMzAsCisgIC0xMjcsICAgMTQ5MCwgICAgLTYzLCAgICA2ODAsICAgLTI5NywgICAgMTI1LCAgIDE3MDAsICAgMjUwNSwKKyAgICAgMywgIC0yMDQzLCAgICAyNTUsICAgMTU0NywgICAgNTY5LCAgLTI0ODMsICAgIDczMywgICAtODk2LAorICAgODgxLCAgIDQ3ODAsICAgMTU0NCwgLTEzNDQyLCAgIDEzMjgsICAgMTkzNywgIC00NDQ4LCAgIC0zODQsCisgICA3NDksICAgIDE3MywgICA3MzUwLCAgICAxNTYsICAgLTE0NCwgICAgIDUyLCAgIC01MjcsICAgIC0zNCwKKyAgICAtMywgICAtMTczLCAgICAxMTgsICAgLTUyOCwgICAgLTc1LCAgICAgMzksICAgICA0MiwgICAtODc0LAorLTE0NjM2LCAgICA0NzQsICAgLTQxMywgICAtMTA2LCAgIC0xMTUsICAgLTQzMSwgICAgIDU0LCAgICA3MjIsCisgICAxNTYsICAgLTQ2OCwgICAgMzY5LCAgICAxNDksICAgIC02OCwgICAtNzkxLCAgIDEzMTgsICAgMjE1MCwKKyAgICA2OSwgICAgNDU0LCAgMTkwMzIsICAgICAgMywgICAgMTExLCAgICAtNDAsICAgIDM0OSwgICAgIDg4LAorICAgMzg1LCAgICAtNTQsICAgLTM5NSwgICAtMjI0LCAgIC01MTksICAgICAgMCwgICAtMjE5LCAgICAxNzksCisgIC0yNTMsIC0xMTM3OSwgIDExMDA1LCAgIDE4NTcsICAgLTEyNiwgICAtMjQ4LCAgICAzMDQsICAgLTYxNiwKKyAgIDM1MSwgICAgMzI0LCAgICA1MDAsICAgMTQ5NCwgIC0xMzkwLCAgIDIzNDksICAtMTI1NywgIC0xMTE0LAorICAtMjEzLCAgIDgxNTYsICAtMjA2NiwgICA5NzQ2LCAgICA3NjMsICAgLTg0OCwgICAgMzQ5LCAgICAgLTcsCisgICA3MjMsICAgLTk2NiwgICAgNDY5LCAgICAgOTEsICAgLTI1MiwgICAxMzM2LCAgICA1NzksICAgMTgxNiwKKyAgMTM3MiwgICAtOTQxLCAgICAzNjQsICAgIDI3NiwgICAgLTMzLCAgICAgIDcsICAgLTQyNSwgICAtNDMzLAorICAgLTIxLCAgICA1NDYsICAgLTY3MSwgLTMxMjcxLCAgIC05MjYsICAgIDEwMSwgICAgMTQ3LCAgICAzMDIsCisgIC01NTIsICAgIDIyNCwgICAgNTY4LCAgLTIzODYsICAgIDUxOSwgICAtNDU4LCAgMTMxNzEsICAtMTQ2NCwKKyAgMTE2MSwgICAgNjM5LCAgICAtMTAsICAgLTg3NywgICAgMzMxLCAgIDMzNzIsICAgIC03MiwgICA1MTU4LAorICAtNzA2LCAgICA5MDYsICAgMjY2OCwgICAxMDA4LCAgLTI3MzIsICAgMzI2NCwgICAgMTA1LCAgICA2MzAsCisgICA2NzMsICAtMTk0OCwgICAtMTk2LCAtMTMxMzAsICAgMTcyNiwgICAgNzM3LCAgIDQ4MjksICAgICA5MywKKyAgIDY1NCwgICAyMTc1LCAgIDM4NTgsICAgICAtNSwgICAgMjQ1LCAgIC00NzEsICAgIDM2OSwgICA1NDM1LAorICAgMzU2LCAtMTI5MzQsICAgICA2MSwgICAxOTg0LCAgICA5NzUsICAgIDcwNiwgIC0yNDU0LCAgIC02NDIsCisgICAtOTMsICAgLTc4MCwgICAtNDQzLCAgLTE0ODcsICAgLTQ2MCwgICAxMTEyLCAgICAzODUsICAgIDMwOSwKKy0xMDI2OCwgICAgMTk3LCAgLTE2OTIsICAtMTg3MCwgICAgIDUwLCAgLTE5MzQsICAgNTM4MCwgIC0xMTkzLAorICAgNzc1LCAgIC00OTMsICAgLTk5MiwgICAtNTU3LCAgIDI5NTIsICAgIDQwOCwgICA0NjE2LCAgLTEzNDEsCisgMTA3NzQsICAgNTMwNSwgICAgODU0LCAgIDMwMzEsICAgICA2NywgICAgNjE3LCAgIDI0MzYsICAtMjA3MiwKKyAtMTQ2OSwgICAgODA0LCAgIC01NzgsICAgIDI0MywgICAgMjY0LCAgIDkxNTAsICAgIDIwMCwgIDEwNzUzLAorICAtMzUwLCAgICAxODIsICAgIC01MiwgICAtNDA2LCAgICA1MDgsICAgLTc2MSwgICAtMTYxLCAgLTExNDIsCisgICAgMjUsICAgIDQ4NCwgICAgMTI3LCAgICAxMjYsICAgIDQ3NywgICAtMzQxLCAgICAxMTAsICAgIDM3MSwKKyAzMjc2NywgICAxMDkwLCAgICA2NzgsICAgIDE3NSwgICAgMTQ2LCAgIDEwMjAsICAgLTg5NywgICAgODc4LAorICAtMTM3LCAgIC01MDcsICAgLTUzNCwgICAgNjU4LCAgICA2NzgsICAgIDUwNSwgICAtNzUzLCAgIC0yMDcsCisgICAzOTEsICAgICA2MCwgLTIzMjc5LCAgIC03NzIsICAtMTMyMywgIC0xNTc4LCAgICAgLTMsICAgIDE5NiwKKyAgLTc0OSwgICAgMjIwLCAgIC00ODIsICAgLTc4NSwgICAgNDU2LCAgICAgMzgsICAgMTAzNCwgICAtNTc5LAorICAgLTU4LCAgLTE1MzksICAgIDQyMSwgICAtNzQ2LCAgICAyMzgsICAgMTUzMSwgIDIxMjkwLCAgICA1ODYsCisgIC00NDEsICAgLTI3NiwgICAxNTEyLCAgICA1NTMsICAtMTQwNywgICAtMjc2LCAgICAgNjAsICAtMTA2OCwKKyAgIDI5OSwgICAgNjUwLCAgICAtMjUsICAxMjU5MCwgICAyMDU4LCAgICA5MjUsICAgLTI5NSwgIC0xNzQ0LAorICA1MTUyLCAgIDQ5MzUsICAgLTQxOSwgICAgMjcyLCAgIC0zODMsICAgLTY2NSwgICAtMTk0LCAgIC0yNTUsCisgICA1NzQsICAgLTI2NywgICAgNTQxLCAgIDEwMzEsICAgLTI4MiwgICAtNjQ4LCAgICA2MjIsICAtMTQ2NCwKKyAgIC0yOCwgICAtMjY5LCAgIC01MzMsICAgIC04MCwgICAtNDc2LCAgICAyODIsICAgLTMzNiwgICAgMTI1LAorICAgMTA0LCAgICA0NjQsICAtODk0OCwgICAgODQ5LCAgICAxNzEsICAgMTUxOCwgICAtMjk2LCAgICAgNTEsCisgICAtMjcsICAgMzA5NywgIC01MTAzLCAgIC00MTIsICAgLTQ5NCwgICAtMTk0LCAgIC03MTMsICAtMTI3NywKKyAgIDEwMiwgICAxNzQwLCAgIC00NDUsICAgMzQzMiwgICAxMTgwLCAgIDY0MDQsIC0xMDkwOCwgICAtOTcwLAorICAgIDMxLCAgICAxNDIsICAgLTI0MiwgICAgLTc5LCAgICAtNzgsICAgIC03NiwgICAgMTI0LCAgIDEwMzEsCisgICAgODMsICAgIC01NSwgICAxNTIyLCAgIC02MTMsIC0zMjc2OCwgICAtMzk0LCAgIDEzMDYsICAgIDI4NywKKyAgIDcwMSwgIC00NzI1LCAgLTEwODUsICAgIDQxNSwgICAtMTIyLCAgIC01MzgsICAgLTY3NSwgICAgIDgyLAorICAgMTE2LCAgIC03MjgsICAgIC05OSwgICAgNTAwLCAgICA2NTksICAgLTMyOSwgICAgMjkyLCAgIC0xMDYsCisgIDkyNDMsICAgLTM0MCwgLTExOTMzLCAgIC00OTgsICAgIDM0MSwgICAtODI1LCAgIC00MDEsICAgLTQwMiwKKyAgIDE0MiwgICAgLTEzLCAgIC0zMDksICAgLTcyMiwgICAgMTQxLCAgICAgIDAsICAgLTY4MSwgICAgNDk0LAorICAgNjcxLCAgLTEyMTAsICAgMTQ2NiwgIC0xMzM1LCAgMTE3NDMsICAgLTI4MCwgICAxNjE2LCAtMTE0ODEsCisgICAgNTIsICAgIDMxNywgICAgOTAyLCAgIC02NTMsICAgLTk2NywgICAtNDk0LCAgIC0xNjIsICAgLTY4NSwKKyAgLTQzOCwgICAgNzU2LCAgICAgODEsICAgLTIwNywgICAgNTc3LCAgLTc0NzYsICAgLTM1MywgICAgOTE4LAorICAgLTMxLCAgIC0xMDcsICAgIDE4MSwgICAgNTIzLCAgICAtNDYsICAgLTc1MiwgICAgMzczLCAgIC05MDgsCisgLTE4MDgsICAgLTkxNiwgICAgNjMyLCAgIDE1MDgsICAgIC0zNSwgIC02OTQzLCAgICAgNjQsICAxMzA3MiwKKyAgLTY1NSwgICAgMTYzLCAgIDEyMjEsICAtMTY1NSwgIC0yNTY4LCAgIC00NDYsICAgLTQwMSwgICAgNDcwLAorICAtNjIyLCAgIC05NDQsICAgMzc0NCwgICAtNDU4LCAgICAyMDMsICAgIDEyNSwgICAgMjM4LCAgIDUxOTYsCisgICAgMjEsICAxMjE5MywgICAxMDk1LCAgIDEwOTEsICAgLTc4NywgIC0xMTU3LCAgIC05ODAsICAtMTE1NCwKKyAgNzcwNywgICAgLTI5LCAgICAxMDYsICAgMTIyNiwgICAgNjk2LCAgIC05NzQsICAgLTM3OSwgICAtNTM3LAorICAgIDU2LCAgICAgOTUsICAgLTQ3NywgICAtNTI4LCAtMTEyNDUsICAtMTAxNCwgICAgMTQwLCAgICAzODAsCisgICAgODksICAgIDU0MCwgICAgIDg0LCAgIC02MTksICAgLTMyMiwgICAtNTcyLCAgIC0yNDAsICAgIC0yNiwKKyAgIDcyNywgICAgMzEwLCAgICAgNDMsICAgLTc5MCwgICAgLTMxLCAtMjQzMTgsICAgIDExMCwgICAgNjE4LAorICAgIDQ0LCAgIC0xMDgsICAgICA4OSwgICAtMTkxLCAgICAtMzMsICAgLTIwMSwgICAtNDkwLCAgICAgNDMsCisgIC0xMzYsICAgMTM2NiwgICAgIC0yLCAgICAxNjIsICAgLTgzMiwgICAgNDY5LCAgIC0xNDAsICAgLTI3OCwKKyAgIDYwMCwgLTE1Nzc1LCAgLTE2OTksICAgIDE4NCwgICAxODI1LCAgICA3MjgsICAtMTgwMywgICAtODc2LAorICAgMTUyLCAgICAgNjAsICAgLTgxMywgICAzMDYzLCAgIC05MjksICAgIDk3MiwgICAtMjgyLCAgICA3MTgsCisgIDg0MjYsICAgLTg4OCwgICAxMzgzLCAgIC02NjQsICAgIDU3MSwgICAgOTU4LCAgICA5ODIsICAgIDIzNiwKKyAgLTU0OCwgICAgIDY2LCAgIDE4OTgsICAgLTI3NCwgIDEwNzE1LCAgLTE2OTMsICAgICA3OSwgIC0xMjU0LAorICAgMjk2LCAgICA2MDksICAgIDY4MiwgIC0xMDc0LCAgICAyNzIsICAgIDE1NywgLTE4OTcyLCAgICAzNzcsCisgICAtMTIsICAgIDQzOCwgICAgNTM2LCAgIC02NzIsICAgIDI5MiwgICAgNzE5LCAgIC00NjQsICAgMTEwNiwKKyAgLTI5NiwgICAtODEyLCAgICAgIDYsICAgLTMzNCwgICAgIDY3LCAgICA2NzgsICAgIDM4MiwgICAgNjc4LAorICAgMzAxLCAtMjIxNjUsICAgIDE4NCwgICAgIDgwLCAgIC02NzEsICAgIC04NiwgICAgMTM5LCAgIC0yOTgsCisgICA0MTYsICAgLTYxMCwgICAxMDU3LCAgICAgMTUsICAgLTIzMCwgICAgMzc2LCAgIC03NjgsICAgIDY0MywKKyAgICA1OCwgICAgIDI3LCAgICAxNzgsICAgLTc0MiwgICAgIDYwLCAgIC01MDAsICAgIDQ4NSwgLTE5OTIzLAorIC0xMDE2LCAgICA3MTcsICAgMTEyNiwgICAgMjg3LCAgIDIxNzEsICAgLTM4OCwgICAxNDUzLCAgICAtMjEsCisgIC0yNjgsICAtMTU1NSwgICAtMjYzLCAgICA3MTMsICAgMTcwOSwgIC0xMTAzLCAtMTA2OTksICAgMTc4OCwKKyAgICAtOCwgICAtNTAxLCAgIC04OTIsICAxMTQ3NiwgIC0yMDA2LCAgICA0NjYsICAgODA3MCwgICAtMjg2LAorICAgMTYzLCAgICAgMzUsICAgIDQ5NCwgICAgIDc2LCAgIDE0MjgsICAtMjI0OSwgICAgMTAwLCAgLTE1NDIsCisgICAzMTksICAgLTIxNCwgICAtNzAxLCAgMTAxMzAsICAgLTI5NCwgLTExOTYyLCAgIC02NTYsICAgIDIyNywKKyAgLTUxMiwgIC0xMDE0LCAgICAyMTMsICAgLTYwMCwgICAtNzIwLCAgICAgNjMsICAgLTE4MCwgICAxMjg2LAorICAxMDYzLCAgLTk2NzEsICAtMTA1NiwgICAxMjY5LCAgIDE0ODQsICAgICAyMCwgICAgNzkwLCAgICAgMjksCisgLTk5MDYsICAgLTM3MywgICAgNjA4LCAgICAzNjEsICAgLTY1OSwgICAgIDQzLCAgLTEwMzQsICAgIC05NiwKKyAgLTIxOSwgICAgLTY1LCAgICAzOTIsIC0xOTYxNSwgICAtNDY0LCAgICAyMTIsICAgIDgyMCwgICAtMTgyLAorICAtMjI3LCAgICA0NjMsICAgIDMwMSwgICAgNjQyLCAgIC0yMTksICAgIDM4NiwgIC0xMTcwLCAgICAxMDgsCisgLTU1ODMsICAgIDQyMiwgICAtNTA3LCAgICA1MzAsICAtMTA1OCwgICAtMTMxLCAgICAgMjAsIC0xNDQ4NywKKyAgIDEwMSwgICAgLTE0LCAgIC00MTUsICAgICAzMiwgIC0xMTMzLCAgIC05MTcsICAgIDk0NCwgICAtODMyLAorICAgNTgwLCAgIDI1MDksICAgLTk1OSwgICAgNDcwLCAgIDExODQsICAgIDQzMiwgIC0xMjM4LCAgICAxOTMsCistMTMzODIsICAgMjMyOSwgICAxOTkzLCAgIDEwMzUsICAgICA4MCwgICAzMTM5LCAgIC01NTMsICAgMTY4MywKKyAgIDM5MCwgICAxNDgwLCAgICA2NDIsICAgIDU2NCwgLTExMTczLCAgICA0MjIsICAgLTk4NCwgICAtNTU5LAorICAtNjg2LCAgICAxNjgsICAgLTc3NywgICAtODEwLCAgLTEyNzgsICAgLTQyNywgICAgLTk2LCAgIDE2OTEsCisgMjkxNzIsICAgLTQzNSwgICAgLTUwLCAgIC05NjgsICAgIDIyMSwgICAgNjg1LCAgICAgNTIsICAgLTM3MywKKyAgIDUyNSwgICAtNTYzLCAgICAzNTAsICAgIDUyOCwgICAgMzA1LCAgICA3MDUsICAgIDMxMywgICAgNjEyLAorICAtMjU0LCAgIC0yMjAsICAtMTYzOCwgICAtMTU2LCAgICAgMjQsICAgIDEwOSwgICAtODkzLCAgIC02OTcsCisgICAyNDUsICAgMjU3OSwgICAgNjY3LCAgIC0xNDIsICAxMjMxNSwgICAtNjk0LCAgIDM3OTksICAgICAgNSwKKyAgLTQzOCwgICAtNDczLCAgIC00MjYsICAgICA1OSwgIC01MzgxLCAgICAtNTYsICAgIDIwMCwgICAtMjgwLAorICAtMjc2LCAgICAgOTYsICAgIDQzNSwgICAgNzI5LCAgICAzMzYsICAgIDEyMywgICAtNzE0LCAgIC0zNzIsCistMTI2MDksIC0xMjA1MywgICAtMjM4LCAgICAyMjMsICAgLTI0MiwgICAgMjMwLCAgICA2NjMsICAgLTY0NSwKKyAgICA5OCwgICAgNTE1LCAgICAgIDMsICAgIDcyNCwgICAgNTEwLCAgICAtNDgsICAgMTA5MCwgICAtMTczLAorIC01MDI0LCAgICA1MzYsICAgIDYzNSwgICAtMTQzLCAgICA3MDIsICAgIDE3MiwgICAtMTk2LCAgICAxNjQsCisgICAxOTAsICAgLTE1MiwgICAtMTgwLCAgICAyMzgsICAgLTE0MiwgICAtMzI5LCAgICAxOTEsICAgLTI5NiwKKyAgLTQxNiwgIDExNzc1LCAgIC00OTYsICAgIC05NSwgICAgMzkyLCAgICA5OTQsICAgLTU4NCwgICAtOTI1LAorICAtOTYzLCAgICAyODYsICAgLTQ1OCwgICAzMTA0LCAgLTE5OTAsICAgIDk2OCwgIC0xNDMwLCAgICA5OTgsCisgIC00MDcsICAyODQ4NSwgICAgNDM2LCAgICAgNDIsICAgIDM3OCwgICAtMjEwLCAgICAxNDgsICAgLTE0OSwKKyAgLTUzMiwgICAgIDk0LCAgIC02MjgsICAgIDE4NiwgICAtMTg2LCAgIC0yNzQsICAgIDI1MCwgICAtMzE2Cit9LAorCisuY2IxNjE2czAgPSB7CisgIDU2MDQsICAgMTQ5MSwgIC0yMDY0LCAgIDEzMjEsICAtMjg0NiwgIC0zMDA3LCAgLTE4OTksICAgLTg5NiwKKyAgIDU1NiwgICAxOTY5LCAgLTIyMjUsICAxODUxNSwgICA0MTU2LCAgIDEzMzMsICAgMzQ4OSwgIC0yMTY4LAorICAxODk3LCAgLTE0NDAsICAtMTUxNCwgLTEzODM3LCAgIDEwMTcsICAgNDc5NywgICAgNDUzLCAgLTIxMDEsCisgLTY4MjIsICAgIDkyMywgICAgMTg1LCAgICA3NTQsICAgLTIwMSwgIC00MTUxLCAgICAxMjYsICAgLTc5MywKKyAgLTQzNywgICAyNDc0LCAgIDQyODYsICAtNjQwNSwgICA0MDA3LCAgLTE2NDQsICAgLTc1NywgLTEzMTA2LAorICAyNDYwLCAgLTE4NzQsICAtMTg2NywgIC0xMDk5LCAgLTUxNDYsICAgMjk0NSwgICAyMTYyLCAgLTQ0MjcsCisgIDE2OTIsICAgIDc2MywgICAxNzU2LCAgIC04MjEsICAgICA2NiwgICAtMzQ4LCAgIDIwMDEsICAgIDcwMiwKKyAgMTA0NiwgIC0xMzY1LCAgIC01NzAsICAgMTA3MywgIDMyNjU1LCAgICAgLTksICAgIDQ1MCwgICAtNzYxLAorICAgOTA4LCAgIC0yMDAsICAgLTU3MiwgIC0xMzA2LCAgIDI1ODksICAgMjQwNiwgICAxOTI2LCAgIDE3NzIsCisgMTEwNDIsICAtMTk4OSwgICAzOTE0LCAgLTExOTIsICAgMTgxNywgLTExNzEwLCAgIDI5ODUsICAtMjk0MiwKKyAxNTY4NCwgICAxOTE5LCAgIC02NjcsICAtMTI2NywgICA1MjEyLCAgICA0NDQsICAgIDg2NCwgIC0zODQ0LAorICAgNDM4LCAgLTIzODIsICAgIDk3NCwgICAgOTgzLCAgIC04ODcsICAgLTgyMiwgICAgMTg1LCAgICAyNDUsCisgLTMxOTIsICAgMTAzMCwgICAxNDQxLCAtMjgxNTIsICAtMjYxNiwgICAtMzgwLCAgICAzMDAsICAgMTk5MCwKKyAgIC05NCwgICAtOTk5LCAgICAyODUsICAgIDU1MywgICAyMTA3LCAgICA5NjAsICAgLTg1OSwgICAxMDAxLAorIC0xNjMyLCAgIDIyMDgsICAtMTMwMiwgICAxMzMxLCAgLTM5NTYsICAxMDU5MywgIC0xOTMxLCAgLTQ0ODYsCisgIDkzNzYsICAtNjU4NywgICAtNDYzLCAgLTM2MDUsICAgMjQ2MCwgICAxMzA2LCAgICAgIDIsICAgMTk4NywKKyAgMTY0MywgICAtNTUyLCAgIDEzMjcsICAgMTEyNCwgICAtNTgxLCAgIDEzNDcsICAgIDY1MCwgLTI5NTE0LAorICAgMjc4LCAgIDEwNjIsICAgMTQ1OSwgICAgOTUxLCAgIDI0MTYsICAgIDM5NiwgICAtNTk0LCAgICA5MzAsCisgICA0MzQsICAgMzMwOCwgIC0yODE2LCAgIDU0NjYsICAgNDgzMSwgIC0yODY5LCAgICAtNjgsICAgLTg5NCwKKyAgICA1OCwgLTEzMDM2LCAgICAyMTAsICAtMTk0MCwgIC0yNTI0LCAgIDExMzksICAgMjA0NCwgICAgLTMyLAorICAgOTY5LCAgIDIxODcsICAgIDUxNiwgICAgNTgxLCAgIDgxODUsICAgMjA4MCwgICAgMTc2LCAgIC03MDgsCisgIDE1MjksICAgMTEzMiwgICAtNjc1LCAgLTEzODQsIC0xMDk0OSwgICAxMTc0LCAgLTUyNDUsICAgIDU4MCwKKyAgNzQ5MCwgICAzMjU4LCAgIDQzMTQsICAgMjcwNiwgLTEzNjc2LCAgLTE3MzUsICAgMTkzNywgICAgNTc3LAorICAtMTA4LCAgIDI2NzYsICAgIDYxMiwgICAtOTY2LCAgIC05NjYsICAgMzI1NSwgICAxNDAxLCAgIDE0NDMsCisgLTE4NTAsICAgLTI1MiwgICA5MjcwLCAgIDUwMzcsICAtMTQ5MiwgIC0xOTU3LCAgLTIxMzQsICAgMTE5OCwKKyAgMzQ3MCwgIDEwNDgyLCAgIC00NjgsICAgLTY3MSwgIC0xNjU1LCAgIC05NTUsICAgMzI0OCwgICAzMzYwLAorICAgNDQ4LCAgLTE4NTQsIC0yNTE0NSwgIC0yNzcxLCAgLTMzMTgsICAgIDU2MSwgICAtNjcyLCAgIDE3OTEsCisgIDIxOTQsICAgLTU5OCwgICAxNjczLCAgIC00MjAsICAgIDU0NywgICAgMTIyLCAgIC0xNjAsICAgLTE3MiwKKyAgMTY4NiwgICAtMzk3LCAgIDExODcsICAgICAxMSwgICAtODc5LCAgICAtNTgsICAgIDMyMywgICAgMTgwLAorIC0yNTg4LCAgLTIxMzksICAtMTc5NCwgIC0yOTI0LCAgICA5OTksIC0yNjk2OSwgIC0xMjgwLCAgLTE0MDEsCisgIC03NzAsICAgNjE1OSwgIC00NDQ5LCAgLTQxNzQsICAgNTI3MCwgIC00ODEzLCAgIDQxMzksICAtMjAyMywKKyAgMjY5NCwgICAyODg0LCAgIDM0MTgsICAtNTk0OCwgICAzMTE4LCAgLTExNzYsICAgNDY5MSwgICA4NTY2LAorLTMyNzY4LCAgIC02ODEsICAgLTU1MywgICAtMjE2LCAgIC0yMTYsICAgLTkzMSwgICAtNTA3LCAgICA1NzksCisgIC05MzIsICAgLTc0MCwgICAgMzQ5LCAgICAgODEsICAgMjEyMCwgIC0xMjIyLCAgICA1NjQsICAtMTU3NiwKKyAgMTI0MSwgICAgMTU5LCAgIDI1NzksICAgMzIzNiwgIDE5MjA1LCAgIC03NDQsICAtMTcyNywgIC0xODAzLAorICAxMjQ3LCAgIC01NzUsICAgLTI2MSwgICAgMjYxLCAgICA1NDAsICAgLTI1NSwgICAgLTYwLCAgLTE0MjgsCistMTQxODQsICAtNTE5NCwgICAgODYzLCAgICA5OTcsICAgMTA0MywgICAtODI4LCAgICA0NjYsIC0xMjU1MywKKyAgMjEwNiwgICAgIDU2LCAgIC01NjYsICAgMTE0MiwgICAgNDAxLCAgIDEzNjAsICAgMjMyMiwgICAgNjI5LAorICAgOTM3LCAgIDI5NTQsIC0xMDA4NiwgICAgLTEyLCAgIDI1NTQsICAtNTc2MCwgICAgNTIzLCAtMTUxODQsCisgICA2MzYsICAgIDE1NiwgICAgMTY1LCAgLTI2MzgsICAgMTEzNCwgICAgNjU4LCAgIDQzOTgsICAtMTM4NSwKKyAtMTkyNCwgICAxMTc5LCAgIDMyMjIsICAgLTkwOCwgIC0xMTUzLCAgMTgwODIsICAgMTAxMSwgICAxOTQ4LAorIC0xMDA3LCAgICAzNTIsICAgLTE3MiwgIC02NDQ2LCAgICAtMjIsICAgLTIyOCwgICAtMjY0LCAgICAgNzMsCisgICAgNzYsICAgMjIyOSwgIC0xMzQ5LCAgIDYxMDMsIC0xMTU4OCwgICAgNTc2LCAgIDMzNzQsICAtMTYxNiwKKyAgNzkwNCwgICAzMTQ2LCAgICA5ODQsICAgMTA1NiwgIC0xNjI2LCAgIDMxMTMsICAtMzY3NCwgICAgMjAzLAorICAtNDUyLCAgIC05MzgsICAgMjA3NCwgICAyNDA5LCAgLTEyMjgsICAtODE4NiwgIC0yNzY2LCAgMTEwOTgsCisgIDE1OTgsICAtODY1OCwgICAtNzM1LCAgICA1NTYsICAgMTYxMCwgIC03NDE5LCAgLTUyNjcsICAgMTE1OCwKKyAgMjg0MSwgICA0NDk3LCAgIDc1NTEsICAtMjA2NiwgICAxMTA1LCAgICA3NjEsICAgMjU0OSwgIC0xNzY0LAorICAyODcwLCAgIDM4ODksICAtMTQ3OCwgICAxOTEyLCAgIDI1MDQsICAtMTQxNywgICAgOTYzLCAtMTQ2MDIsCisgICA1NzksICAgICAyOCwgIC0yOTUzLCAgIDE1ODksICAgMzk2MiwgIC0xMzcyLCAgLTMzMDQsICAgIDU2NiwKKyAgMjY4NywgICA5NzAwLCAgLTI0NjQsIC0xMzExMCwgICAzMDA1LCAgIC03NzIsICAtMzc3NSwgICAtMTM4LAorIC00MjQ0LCAgIDUwMzEsICAgMjUyMywgIC0yODgzLCAgICA1ODIsICAgLTQ0NiwgICAtMjc0LCAgIDMzMTEsCisgIC0xNTcsICAgLTc4NCwgICAtOTQ4LCAgIC0yOTIsICAgMzA4NSwgICAtNzgxLCAgICA5NTQsICAtMjEzMywKKyAtNjY5MywgIDEzOTA5LCAgLTIyMzYsICAgIDQxNiwgIC0yNTg5LCAgLTMxOTQsICAgIDY2OCwgIC0xOTg4LAorIC0yMjM0LCAgIDIzNjUsICAgMTAzNCwgICAxMjAxLCAgIC0xMDAsICAgMTY4OCwgICAgMzcyLCAgICAxNTYsCisgIC0yNTQsICAgIDkzMSwgICAgNTc2LCAgLTQ2ODAsICAgIDU2NiwgIC0xODIzLCAgICAyOTQsICAgMTY0NSwKKyAyNzY3OCwgIC0xMzUzLCAgLTEyMzAsICAgMTc0NCwgICAgNTcwLCAgIDE2NzksICAgIDYwOCwgICAgLTM1LAorIC03MTUwLCAgLTQzODMsIC0xMTk5MiwgIC0yOTEwLCAgLTIwOTYsICAgIDUxMiwgICAxODM4LCAgIDMxMjksCisgIC00MTAsICAtMjMwNiwgICAtNTUxLCAgLTM5MDQsICAgNDE0MCwgLTEyNzgyLCAgLTE3NDMsICAgLTEwNiwKKyAtNDE5MCwgIC01NTU0LCAgMTI5NzUsICAgLTU3MywgIC0zNTMyLCAgLTQwNTAsICAgICAxNSwgICAxMzA3LAorICAgIDYyLCAgIDE2NDMsICAtMTk4OCwgICA1Nzc0LCAgIDIwNjQsICAgNDczNCwgICAxMDA5LCAgIDIwMzgsCisgLTI3OTQsICAtMjcwNCwgICAyMjc1LCAgIC0yNzksICAtMTU4OCwgICAtOTEwLCAgMzEzMTUsICAgMTI0OSwKKyAtMTY0MiwgICAgIDc4LCAgICAxNjQsICAgLTI2MCwgICAtODc4LCAgICA2OTgsICAgMTE4OSwgICAgMTU5LAorIC02MTM3LCAgLTE5OTQsICAgIDc3NSwgICAzNDg0LCAgIDE2MzUsICAgMTEyMSwgICA0MzkxLCAgLTU4ODMsCistMTEzMDAsICAgMzcyMiwgICAtNDIyLCAgLTIxODAsICAtMzIwNiwgIC0zMTgxLCAgLTE0OTAsICAgIDI5MSwKKyAgMTMyNiwgICAgMzk5LCAgIDE5NTIsICAtODQwNSwgICAyMjQwLCAgICAxNzUsICAgMzU0MSwgICA0MjU4LAorICAxNTE4LCAgIC03ODEsICAgMTEwNSwgICAgNDk4LCAgIC0zNDgsICAgIDc3MSwgIDE1OTE4LCAgICAxMjAsCisgICAzNzksICAtMjAzNiwgIC0zNzIzLCAgMTA5NDgsICAtMTgyNywgICAzMjIwLCAgICAgNDAsICAgIDIxMCwKKyAgLTI5NCwgICAtODEzLCAgLTIzNDksICAgLTcwNywgICAgOTY3LCAgICA5NTMsICAgMjYyNSwgLTEzNjE0LAorIC0xNTE5LCAgIDk0NTQsICAxMTYwNiwgICAtOTAzLCAgICA4MTcsICAgNjIzNywgIC04ODc4LCAgIC0xNjAsCisgLTE3NjgsICAgIDQ0NCwgIC0yODEyLCAgLTE2OTcsICAtMTAxMCwgICAtOTY0LCAgIDE4NDYsICAgMjk5NywKKyAgMjYzMywgIC0xOTI0LCAgICA1MDEsICAtMTQ2NCwgICAyNDAyLCAgIC05ODYsICAtMTE0MywgICAgNTI3LAorICAxMTg3LCAgIC05MjksICAyMDkyMywgICAtNTYzLCAgICA3ODUsICAgLTQ4NiwgICAtOTQwLCAgIDE2MjUsCisgIC03OTYsICAgLTY5NywgICAgMzQ4LCAgIC00MjgsICAgMTQ1MSwgICAxMDg3LCAgLTIyNTIsICAtMjQ4MSwKKyAgIDkzOSwgICAgODkwLCAgLTI1MDgsICAtMTM1NywgIC0xODY4LCAgIDEzOTUsICAtNjM4NiwgLTIxOTg2LAorICAyNTc0LCAgIC0zODQsICAgLTMyNCwgICA3NzUyLCAgIDI5OTYsICAgLTY0MSwgIC03OTAzLCAgLTU3NDUsCisgLTQyMjYsICAtNDE3OCwgIC00Mzk0LCAgIDkzMDcsICAgMzkwNiwgICAtMjI3LCAgIC00OTYsICAgNDU1NiwKKyAgMTA5OSwgICAtODM4LCAgLTI1NDYsICAgMTE5MCwgICA5OTM3LCAgMTEwNTcsICAgMzg0NiwgICAtMTU2LAorICAgNDMzLCAgLTI4NzMsICAtMTc2OSwgICAgIDM2LCAgIDMxODgsICAgNDQ5MCwgICA0MzY5LCAgIDQ3MTQsCisgLTQ2ODEsICAtMjgwNCwgIC0xNTI1LCAgIC05NDcsICAtNTA2NCwgIC00MTgwLCAgLTEzNDgsICAtMTQwNCwKKyAtMTA5NywgIC0zOTIyLCAgLTEwODgsICAgLTQ0NCwgLTEzNjM2LCAgLTE1NDcsICAgMTY4NSwgIC0xNjI1LAorIC04NDk0LCAgIDI0OTIsICAgIC03MiwgICA5ODkzLCAgIDI0NzAsICAgIDcwNSwgICAgMTA1LCAgIDU2MDksCisgLTU0MDMsICAgIDg0NiwgICAgIDkwLCAgIC02ODgsICAgMTE4NCwgICA2Mjg2LCAgIC0yNTMsICAtMTYxMCwKKyAgMzM0OCwgIC0yMDgyLCAgIDg4MzgsICAtMjQ1MywgIC0xMzE1LCAgLTEyMzUsICAgLTcxOSwgIC00NjA3LAorIC0yMTM4LCAgLTU1MjIsIC0xMDQ2NiwgICAxOTAwLCAgIDE1NDEsICAtMjY4OCwgICAgNzI5LCAgICAzNjgsCisgLTg4NDUsICAgMTI4MiwgICAgNDM4LCAgLTI1MzIsICAtMjMyOCwgICA0ODMzLCAgLTYxNDUsICAgNDAzNywKKyAgMzU4NCwgICA3OTY1LCAgLTE0OTUsICAgNjk5OSwgIC01MDM3LCAgLTEzNjQsICAgNzA5NSwgICA0MjUzLAorICAyNzExLCAgLTgzMzYsICAgMzk0NiwgIC0xMzQ3LCAgICAxOTIsICAgLTgyMCwgICAtMzI4LCAgLTExNTIsCisgIDE1NTQsICAgIDg2OSwgICA1MDUzLCAgIDk3MDcsICAtNTg4OCwgIC00Mjk0LCAgLTM4NTgsICAtMzM0NCwKKyAgODM0NCwgICAtNjQ0LCAgIDE3NTAsICAtMTc5NiwgICAtMTQ5LCAgLTM3MDYsIC0xNDgyMywgICAgNjU2LAorIC0xNDg3LCAgLTI0NjYsICAgIDY0MCwgIC0yMjg2LCAgLTI5MDIsICAgMjkwNiwgICAgIDQ0LCAgICAyMTEsCisgIC0zMzYsICAyOTk3NiwgICAtMjk4LCAgIDIwOTIsICAgLTY4OCwgICAxODU3LCAgIDE4MDcsICAtMTcwNSwKKyAgMzIxMSwgICAgNDI1LCAgLTEwNDYsICAgIDEyOCwgICAxMTkxLCAgLTE5NjYsICAgLTcyNiwgIC0zMDQwLAorIC0zNjMyLCAgIDEyMTIsICAgMjk4NiwgICA1MjY2LCAgIDEwODYsICAgMzYyNCwgICAzMDY4LCAgICA0MjIsCisgICA5ODksICAyNDQ3OSwgICAzNzkxLCAgLTIyMjksICAtMzcxMywgIC0yMzc5LCAgLTEzNzAsICAtMTc5OSwKKyAgMjc0MiwgIC0zMjU5LCAgLTQ5NzMsICAgLTYyNiwgICAyMjg3LCAgIDU2NTUsICAgIDY2MywgICAtOTE4LAorIDEzMjY2LCAgIDc3NjIsICAtMTEzMSwgICAyNDkwLCAgLTMxMjMsICAgMjg2OSwgICAtODQ2LCAgLTI4MjgsCisgICAxMTksICAxNDU0MCwgICA0NTg4LCAgLTI3ODQsICAtMzcxMywgIC0yNTQ3LCAgIDM2OTgsICAgMzE4OSwKKyAgMzM3MiwgIC01NDM2LCAgICA4NTYsICAgNDM4MiwgICA0MTI0LCAgIDM0MDYsICAgLTMzNiwgICAtOTExLAorICAtMTM3LCAgIDQyNjgsICAtNDQzNiwgICAxNTY2LCAgIDExNjksICAtMzAyMCwgIDEzOTgwLCAgIC0xNjIsCisgLTcyMjYsICAtMjU1MCwgICAtOTQ2LCAgLTI0MDgsICAtMTA1NiwgICAtNTg3LCAgIC0yNzMsICAgLTkzMiwKKyAgLTIxOSwgIC04MDIxLCAgLTEwODYsICAtMjU4NywgICAzODUyLCAgIDEyMzUsICAgIC0yMiwgICAgMjIyLAorIC0xMTAwLCAgLTE1OTQsICAgIDEzNywgIC0xOTg1LCAgMTAyMjUsICAgNDk5OCwgICAtMzQ4LCAgIC00NTAsCisgIDY2NTEsICAtMjIxNywgIC03NzA1LCAgIDI1MDgsICAxMDA2MSwgIC00NTEyLCAgLTIyNjIsICAgNjE1NiwKKyAgMjk2MiwgICAgMTUwLCAgLTI0NTYsICAgMTA4OSwgICAtOTI3LCAgIC02MDksICAtMzEzMCwgIC0xNjgyLAorIC0xMjE1LCAgLTkyNTEsICAgLTEzMCwgIC0zNzc2LCAgIC0zMDksIC0xMzg3MiwgICAtMjc2LCAgLTY5MjIsCisgICAtODIsICAgMjY2MCwgIC0xMjU1LCAgLTY1NjIsICAgMjY0MCwgICAyNjQ2LCAgICA0MjIsICAgIC04NCwKKyAtNjAyMCwgLTExNTUxLCAgLTE3MTAsICAtMzQ2MiwgIC0yNjY2LCAgMTI1MTAsICAgMzE0NSwgICAtMjE4LAorICAyOTU2LCAgICA0NDcsICAgICAzMCwgICAyMjY4LCAgLTI0MTAsICAtMTQwMCwgICAgNjYwLCAgICA0MzEsCisgIDMwNjgsICAgIDI1OCwgIC0yODYyLCAgIDM5MTksICAgMjY5MywgICAtNzQ0LCAgIDMwNzAsICAtMjE3OSwKKyAtMTE5MiwgICAtOTMyLCAgLTIwOTUsICAgLTI3OSwgICAyMDQ1LCAgLTgyMDUsICAxNTI2MywgIC00NDE1LAorICAyMTE2LCAgIDQwNDcsICAxMDMwOCwgICAzMTEwLCAgIDEzNjgsICAtMTU0NywgIDEwOTE5LCAgICA5ODgsCisgICAtODEsICAgLTkwNywgIC0xNzI4LCAgLTEwNTIsICAtMzUzOSwgIC00NzY5LCAgLTI1NzYsICAtMTAzOCwKKyAgOTI1NSwgICAgMTUyLCAgICA0MzEsICAgMjQ1NSwgIC0xNTQ0LCAgIDE4ODAsICAgLTMxMiwgICAyNzI0LAorLTEzMzM2LCAgLTQxOTcsICAtMTE5OSwgICAgNzA5LCAgIC02OTUsICAtMTY4NywgICAgNDQyLCAgLTI1NjQsCisgLTE2MjYsICAtMTg4OCwgICAxODcwLCAgIDM1MzksICAtMjkyMiwgIC0zNTA2LCAgLTc4OTAsICAtNTQ4NiwKKyAtMTY0MCwgICAyMTc4LCAgIDIxNzMsICAtMzIwMCwgIC00NjI2LCAgIDExMTYsICAxMzE2MSwgIC01MjIxLAorICAtODUyLCAgLTEwNDcsICAtMzMyOCwgIC0zOTc1LCAgLTQ0NDEsICAgMjg3MCwgIC0xNDU4LCAgIDU2NjQsCisgICAtMjgsICAgMzg1MywgICAxODA5LCAgIDI3MjEsICAgIDY1OCwgLTE1MjYyLCAgIDM2MTEsICAgMzIyMywKKyAgIDU5NSwgICAgIDQ0LCAgLTUzMjcsICAtMjQ4NiwgIC0xODA2LCAgICA2MDYsICAtMjQ3NCwgIC0xMjM2LAorICAgOTgzLCAgIDE3NDEsICAtODM5MCwgICAxOTQ4LCAgIDE4NzUsICAtMTgwNiwgIC02Mjk0LCAgIC04MTQsCisgIC03NDcsICAgMjIwOSwgIC0xMzMyLCAgIDIwNTgsICAtMTMyNiwgICA1ODA4LCAgIDExMTMsIC0xMDc2NSwKKyAgLTU4NCwgICA0MDM4LCAgIDE0MTIsICAtMzM1NiwgICAgIDI0LCAtMTI4MjYsICAtNDMyMiwgIC0yMjg3LAorLTEwNzkzLCAgIDMwMDgsICAtNjkwMywgIC0xMjczLCAgIDE1OTAsICAgLTYwOCwgICAtNTE0LCAgIC0zMDksCisgIC0xNDQsICAtMjAyNCwgICAxODIyLCAgIDQzNzUsICAgMTEyMiwgICAtNjMxLCAgICAtNzYsICAgLTU5NSwKKyAgIDE5MiwgLTExMzIzLCAgIDgxNjgsICAxMDE4MCwgICAtNjQ2LCAgIDI0NzgsICAgNDUxNiwgICAxMDk1LAorICAgIDk0LCAgICAgIDYsICAgMTI1MSwgICAtNjU4LCAgIDI2MjAsICAgIDYyNiwgICAzMDc4LCAgICA3MjcsCisgIDc3NjksICAgIDk2NiwgIC0zNTkzLCAgLTY5OTAsICAtMjM1OCwgICAxMDIyLCAgIDEyODgsICAgMjczMywKKyAgLTI1OSwgICAtMjkxLCAgIDI0ODIsICAgIDI5NywgIC0xMjY4LCAgMTAzMzgsICAgIDczOSwgIC0xODYyCit9LAorCisuY2IxNjE2czEgPSB7CistMTI4NzMsICAtMjQyOSwgICA2NjU5LCAgIDQ0MDEsICAtMjI1MCwgICAxNjg0LCAgIDE1MDgsICAgMTc4MCwKKyAtMTA4MSwgICAgLTEwLCAgLTYwMTIsICAgIDg5NSwgIC0yMzczLCAgLTEyNjMsICAgIDEyNSwgICAxNDQ4LAorICA0NzQ0LCAgIDE1NTYsICAtNzI2NywgICAyMzU0LCAtMTEzNjgsICAgMTE1NSwgIC03Njk5LCAgLTE0MjQsCisgIC05MTQsICAgLTU5MSwgICAyNDcyLCAgICA1MzgsICAgMTQzMSwgICAgOTUzLCAgICAgIDUsICAtMzA2NiwKKyAtMTA2MywgICAgICAzLCAgICA0MDYsICAgIDk3OSwgICAgOTIyLCAgIC02NjgsICAgMTYzMywgICAgICAyLAorICAgNjQ5LCAgIC0xMzksICAgIDk2NCwgICAgODYwLCAtMTg4MDcsICAgMTk0NCwgICAyMTgzLCAgLTEzNTgsCisgIDEzOTUsICAtMTE2NywgICA1MzY5LCAgLTM1MjUsICAgIDczNSwgIC0yNjk4LCAgMTA1NTYsICAtMTEzNywKKyAtMzk3OSwgICAxMzgzLCAgLTE5OTcsICAgNTk5NSwgICA2NDY1LCAgIDIzMTAsICAgMTc4MSwgICAtMzExLAorICAzMzc2LCAgIDcxOTksICAtMjc0NSwgIC0xNjU2LCAgLTU3MDIsICAgMzE4MCwgICAzMDE3LCAgLTU2NzMsCisgIC03MTIsICAtODkwMiwgICAyMDU4LCAgIC01NzAsICAgIDE3MCwgICAyMjc2LCAgIDM4NjksICAtOTMzMiwKKyAtNzk2NSwgICAxMTMwLCAgIDIxMTEsICAgNTYzOCwgIC0xNTA3LCAgIDI5NDQsICAgMTU3NCwgICAtOTE5LAorIC0xNDU5LCAgIC05NzAsICAxMTA5MywgICAgNTQ0LCAgLTI5NTIsICAgLTE0NiwgIC00Njg0LCAgIC0zMDMsCisgIC01MjgsICAtMTE5OSwgICAtODkwLCAgLTI3MjAsICAtMTY2NSwgLTEwOTUyLCAgICAzNzMsICAgMTY1NywKKyAgMTk2MCwgIC0xMzg2LCAgICAyOTksICAtNDM1NiwgIC00NTI3LCAgIDg5NDgsICAgNzM3OCwgICAxNTgwLAorICAxMzAxLCAgLTYwNTcsICAgNzY1MCwgIC03Mzk5LCAgIDQ2NDYsICAtMTc2OCwgICAyNzU2LCAgIC0yNjMsCisgIC0yODYsICAgLTMzNCwgICAxMzY5LCAgIC03ODYsICAtMzc2MCwgICAgODI0LCAtMTM1MjQsICAtNTA5OSwKKyAtMTY5MywgICAtMzQ3LCAgLTE4MjEsICAgMTk5MiwgICAzNDYyLCAgIDE0MjEsICAgNDkwMCwgICAtNDYyLAorLTEzMzMxLCAgLTE2MTcsICAtMjM1MCwgICA0MDgzLCAgLTg3MjEsICAtNTg4MCwgICA0OTAwLCAgIDI5MTIsCisgICAyMzUsICAxMDM2OSwgIC0xMzQwLCAgICA3NzYsICAtMjU5OCwgIDE0MzQ0LCAgLTM4MDUsICAgLTU2OCwKKyAtMzc4OCwgICAzNTkxLCAgIC0zOTQsICAtMTA3NywgICAzOTA4LCAgIDYwODAsICAgMTk1MywgIC0xNDU0LAorIC0xMDEzLCAgICA1MDcsICAxMDA5NywgICAzMzk2LCAgLTQ2NjIsICAgLTc2MywgICAyNTA2LCAgIDE0ODYsCisgIDMwODgsICAgIDU4MCwgICAgLTg2LCAgIDExMTcsICAgMTYwNiwgIC0zNDU0LCAtMTA3ODIsICAgNDg3MCwKKyAgNjE3MCwgICA0MDIwLCAgLTU2NzUsICAgNjg0OCwgICAgNDM5LCAgLTg3NjUsICAgMzg3NywgICA2MjUwLAorICAgNzM0LCAgIDMyNDUsICAgLTg3NCwgIC00MzEyLCAgIC04NzksICAtNDM2OCwgIC0xMjg3LCAgIDMyMTIsCisgLTIxMzAsICAtMTQzNSwgICAxNjE5LCAgIC0yODAsICAtMzA4MiwgIC0xMDcwLCAtMTg5MjEsICAgIDk0MCwKKyAtMjQyOCwgIC0xNTQ4LCAgLTExNDIsICAgLTI3MSwgICAgMTkzLCAgIC0yNDAsICAgLTg5MCwgICAgOTE4LAorIC00MzUwLCAgLTUwNDIsICAtODk5NCwgICA1MDYwLCAgLTY0OTUsICAgMzQ1NSwgICAtMjU5LCAgICA4OTIsCisgLTEyOTAsICAgMTM0OCwgIC0xMDQ5LCAtMTI2ODEsICAgIC00OSwgIDE4Mjg2LCAgICAgNzUsICAgIDc5MSwKKyAgMTgzMCwgIC00MTE2LCAgMTAyNDAsICAgIC0xMiwgICAtNDU5LCAgIDI0NzcsICAtMjU4MiwgIC0zMzQ0LAorIC0xNTk4LCAgICA5ODIsICAgLTMyNCwgICAgLTQ4LCAgLTQyMjksICAtODQ3NiwgIDExMTIwLCAgICAxMDAsCisgLTYyMzgsICAgMTE2NCwgICAyMzY5LCAgLTIwNTIsICAgIDI0NywgICAgNjI2LCAgIDIyMTMsICAgMjI3OSwKKyAtMjYyNywgICAgMjg5LCAgIC00NzEsICAtMTEzNiwgIC0xODE4LCAgMTU0MTMsICAgIDU3OSwgICAxMDM0LAorIC02ODM1LCAgLTg2NDUsIC0xMjY2NywgICAgNzU4LCAgIC05MzIsICAtNDM5OCwgICAgNTY1LCAgICA0NTgsCisgLTIwMjQsICAtNDA1MCwgIC0zMTAwLCAgIDE4OTcsICAgMTMyNCwgICAzMTkxLCAgIDE4NzYsICAgNzY2MCwKKyAgIDM4NSwgIC0xMDY2LCAgLTE1MzksICAtMTMxNywgIC0yNjMyLCAgICA3NjYsICAgICA2MywgICAgMzg5LAorICAtMTg5LCAgIDExMzYsICAgLTY1MywgICAgODAyLCAgICA3NTUsICAgICA3MCwgLTI5ODEyLCAgICA2NDAsCistMTE5NTMsICAxMDkwMSwgICAyMDc4LCAgIC01MjksICAxMDM3MywgICAyNTA5LCAgLTI3NzYsICAgLTEwNCwKKyAtMjIzMiwgICAgMTc0LCAgIC04MzcsICAgIDE1OCwgICAxNTA3LCAgIDE5NjMsICAgLTI3MywgICAxNTM0LAorICAxMDg0LCAgIDg0NjksICAgMjU2OCwgIDEyNjYyLCAgLTIyNzYsICAgMjgwOCwgICAyMDUyLCAgLTc0MzAsCisgICA0MzQsICAgMzc3NywgICAgOTkxLCAgICA2NjQsICAgMjcyNCwgICAxNjMxLCAgLTM2MzIsICAgMjA5OSwKKyAgLTU4MiwgICA0MTQwLCAgICA3NTcsICAxMTI0OCwgICAgNTQwLCAgLTE0MjUsIC0xMDIwNCwgICAxNjA0LAorICAgNjAwLCAgLTIwMzQsICAtMTA2MCwgICAgOTc3LCAgIDE4NDMsICAgMzgzMSwgICAtOTMzLCAgIC04MTYsCisgIDI5NzUsICAtNjQxMywgICAxNTg5LCAgIC05MTUsICAgLTY5NiwgICAyMTU1LCAgIC01NTYsIC0xNzg5MywKKyAgMzM0OCwgIC0xMjM5LCAgIDEwMTQsICAtMjUzOSwgICAxNTg4LCAgIC0zMjAsICAgMjQwMiwgIC0xNDg1LAorIC04MDYyLCAgLTEwNDYsICAtMTQ1OCwgICAgMjAwLCAgIDEzMjMsICAgIDM1NywgIC0zNzUyLCAgIDI4MzYsCisgIDU3NzQsIC0xMTYzOCwgICAtOTEzLCAgIC02NDgsICAgMTY3NiwgICAgMjQ2LCAgLTEyNzcsICAtMTA2NSwKKyAgMjMzNCwgIDE0OTExLCAgICAyMjgsICAgIDg4MCwgIC0yMTcyLCAgIDMwNzIsICAtMjUyMCwgICAxNDQ1LAorICAxNDQyLCAgIDI1NjgsICAtMTI1NCwgICAgNzMwLCAgLTE5NTAsICAgLTE5MiwgIDEyMDAzLCAgLTE1ODcsCisgIDI1NTgsICAgIDcxNCwgICAgIDMzLCAgIDQzMjQsICAtNDY0MiwgICAtMjMxLCAgIC0yNzksICAgLTI1NSwKKyAxNzgyNCwgICAxMjkyLCAgIDM1MzAsICAgLTc2NiwgICAgLTY0LCAgICAyNDUsICAgMTY3NywgICAxNzE2LAorICAyNTA3LCAgLTM1OTQsICAtMzUzMiwgICAzMDAwLCAgIDE5OTYsICAtNTM0MiwgIC0xODY4LCAgLTU2NDIsCisgICAtMjEsICAgMTEzMiwgIC0xMjAyLCAgIDExMDQsICAtNjU0MywgICAxMjQyLCAgICA0NTcsICAtMTcxMSwKKy0zMjc2OCwgICAgIDQ5LCAgIC00NTgsICAgIDI5NSwgICAgODU4LCAgIDIwNDMsICAgMTI2OCwgIC0xMjU3LAorICAtMzQ2LCAgICA3OTMsICAgIDU1NCwgICAxMjYwLCAgLTEwODIsICAgIDk4NSwgIC0xNDUzLCAgIDE3MDQsCisgIDI0MzEsICAtMjg1OCwgICAxNDY2LCAgLTU0MjQsICAtODg3MCwgICA0NzE0LCAgLTE1MzksICAgNTc2NywKKyAgIDExMCwgIC0yNTY4LCAgLTE0ODIsICAgLTM0OCwgLTExNTgwLCAgLTI4MzgsICAgMTIxMywgICAtNTk5LAorIC0xNTkxLCAgLTM0NzIsICAtNjkwNywgICA2MTkxLCAgIDM5MjgsICAgNDcwOCwgICAxMzI2LCAgLTE1MTAsCisgIDYzMjIsICAgMzg0OSwgIC00MTEyLCAgIDc2ODksICAgNTk3NiwgIC0zMjk4LCAgICAzNzIsICAtNTQ1MCwKKyAtMjIwOCwgICA2NTY0LCAgLTY5MTUsICAgIDkxMSwgICA0MjE2LCAgIDE2ODIsICAgLTczOSwgIC0yMTQ2LAorICAgMjAzLCAgICAzNTAsICAgLTgxNiwgICAgMzUxLCAgLTMzODYsICAtMzAxNiwgLTE1MDQ1LCAtMTA4MjQsCisgIC01NTMsICAtNDk2OSwgICAgMTM4LCAgICAyNTYsICAgMTY3MiwgIC0xODQwLCAgIDI4NTEsICAxNTgzOCwKKyAgMjkzNCwgICAxODcxLCAgIC02MDAsICAtMzI5MywgICAtODQ1LCAgLTI2OTYsICAgMTQ2MywgIC0xMDc1LAorICAgNzIwLCAgLTExNzcsICAtMTUzOCwgICAyNDE1LCAgIDczMTUsICAgLTQ4NCwgICAxMDgyLCAgICA5NjIsCisgICA3NjYsICAgLTg0NSwgLTEwNjg3LCAgLTU5MzIsICAtNDQxMCwgICAzODQwLCAgICAzNjIsICAgIDE5NCwKKyAtNDU3NiwgIDEwMjA5LCAgLTM1NDgsICAgLTEyNywgIC0xMjAyLCAgICAyNDYsICAgLTczNCwgICAgNzcwLAorICAgMzExLCAgLTMxMjYsICAgIDc3MiwgIC0yNDIyLCAgLTExNDEsIC0xMjMzMCwgICAgOTYwLCAgIDE1NjcsCisgIDI4MTYsICAgICA4MCwgIC00NDE0LCAgIC03NzgsICAgIDY2NSwgICAyMzA4LCAgIC00MjAsICAgLTE4MCwKKyAtMTI0MiwgICAtNDIzLCAgMTIxMzgsICAgIDExMywgIC0xNDc3LCAgIDI4OTksICAgIDIxNCwgICAgMzQ4LAorICAtOTI3LCAgIC03NjQsICAgICAyNiwgIC0xMTI3LCAgLTIyODgsIC0zMjc2OCwgICAxMzAyLCAgICAzOTQsCisgICA2NDYsICAgLTQ1MywgICAtOTQ2LCAgIC04MzgsICAgMTY0OSwgIC0yMjkyLCAgIDExODIsICAtMTU1OCwKKyAtNjQxMywgICAtMjY1LCAgLTE5NDIsICAtMzQ2NywgICAxODYzLCAgLTM1MjYsICAgMzQ0NiwgICAtODYzLAorICAgODg2LCAgICAyMDIsICAgLTIwMiwgIDE1NzA2LCAgIDIyMjYsICAgMTc2MywgICAgODk0LCAgICA5MzYsCisgMTYxOTEsICAgLTY5MywgICAxNjgyLCAgIDY2NzgsICAgMTc0MiwgICAxMzY1LCAgICA3MDAsICAtMTc2NSwKKyAgLTgwMywgICAgMjk5LCAgLTIxOTQsICAgMTI1OSwgICAgNjg5LCAgIDE2NzAsICAgLTYzNSwgICAgIDI4LAorIDExODkwLCAgICAtMTQsICAgLTg3OCwgIC01NDM5LCAgICAxMDMsICAxMTEyNCwgICAgNTI4LCAgIDExNzksCisgICAtNjIsICAgIDg2OCwgICAtNjY0LCAgICA3NDksICAtMTEyOCwgICAxNDI5LCAgIC00ODUsICAgMTkyMCwKKyAgLTg2NiwgICAxMTc2LCAgIDEwNTEsICAgIDM3OSwgLTI5NDcwLCAgIDIzNTQsICAgLTI1MiwgIC0xNjQ4LAorICAtNDEyLCAgIC04MDQsICAgMTMzOSwgICAtMzgzLCAgIC04MTIsICAgIDk1OSwgICAgODkzLCAgLTE3NDEsCisgIDE0NjIsICAtMTg2OCwgICAgNDcwLCAgIDIxMTIsICAtMTg4OSwgIC0yMjM2LCAgLTE2NjgsICAgLTc1NSwKKyAtMjU2MiwgICAxMzU0LCAgIDYxODMsIC0xMDk2NCwgICA1NjUxLCAgLTEwNjIsICAgMjU1MCwgIC02MjI1LAorICAtMTk0LCAgIDE2ODcsICAgLTc4MiwgICAxNTY4LCAgICAtODUsICAgICAxMCwgICAgIC04LCAgIDExMjgsCisgIC01MjEsICAtMTA5MCwgIC0xOTMzLCAgLTM0NDEsICAtMjY5OCwgICAzMDQ5LCAgLTU4MjIsICAyMDg0NywKKyAgIDcxMCwgICAgNzg5LCAgLTE4NzIsICAgMTA4MiwgIC0xMjQyLCAgIDQxNTIsICAgMTYyNCwgIDEwNzk1LAorIC0yMTQ5LCAgIC0xMzQsICAgMTA4NywgICAgOTAwLCAgLTc5NDMsICAgNTE3OCwgIC0zNDI5LCAtMTE2MjIsCisgLTM2MTcsICAtNzQ0NCwgICAtODI0LCAgIDM0NjIsICAgLTU3OSwgICAtODMwLCAgIDEwMTAsICAtMzMwMSwKKyAxMjIwMiwgIC01NDQ2LCAgLTE3NjMsICAgIDM0MCwgICAtNzQ0LCAgIC01MDksICAgIDU1NCwgICAxMTQwLAorIDEyMjY2LCAgLTEzMjgsICAgNDY1MiwgICAgOTkyLCAgLTE5MzEsICAgLTcwOCwgICAxMDc0LCAgIDI3NjIsCisgIDI5MzEsICAgLTQxNCwgICAtMjE3LCAgMTAxNjYsICAtNDE2NywgICAtOTAzLCAgICA2NjAsICAgMTAwMCwKKyAgICAyNywgIC0xMDM3LCAgLTE1MzIsICAgMTMwOCwgICA4NjU1LCAgIDkwODcsICAtMjk5OCwgICA5OTI4LAorIC0zNzIyLCAgIC01NTYsICAgNDgxMiwgICAzMDYyLCAgICA2MDAsICAgMTI4MSwgICAzODc5LCAgICAxMTQsCisgLTU0MDQsICAgMTg2OSwgICAyMTc0LCAgIDIwODMsIC0xMTYzMSwgICAtMzAxLCAgLTM2MDksICAgMjQ0MywKKyAgMjMwMCwgICA0ODYzLCAgIC04MzgsICAgIC0yOSwgICAyMTY2LCAgIDEzMTksICAgMjExMCwgICAxMzg3LAorICAtNzQxLCAgLTEyMjUsICAtMTcyOSwgLTEzNTM2LCAgLTczNzYsICAtMTUyMCwgICAgNjE5LCAgLTQ5MTksCisgIDI1MTcsICAtNDMzOCwgIC0xNjUwLCAgICA0NzUsICAgIDQ1NiwgICA0MzcyLCAgICA3OTIsICAgMzIyNCwKKyAgMTk2MywgICAtNTQ3LCAgLTIwNzEsICAgMjE0MiwgICAtMjU0LCAgIDE1NDksICAtNjg0NiwgICAyNDMwLAorICAgLTk2LCAgMTk4NDQsICAgIDU5NSwgICAxMTk3LCAgLTEzNjcsICAgMjAxOSwgICAyMDE0LCAgLTE1NDcsCisgLTM3NzUsICAtMTE4NiwgIC05NjkwLCAgIC0zOTQsICAtNDEwNiwgIC0xNzI4LCAgLTEwMzYsICAgMjk0NSwKKyAgIDUwOSwgIDE0MjQyLCAgLTE4OTMsICAtMjQ5NCwgIC0zMDA0LCAgICA0NTgsICAtMTc1MywgICAyNjI4LAorICA5NzkwLCAgIDM0NTAsICAtMTY1MiwgICAtMzIyLCAgIDgyNjMsICAgMzk1MiwgIC0yMTU2LCAgLTIxMTAsCisgIC00NDIsICAgMTI1NiwgICAxNTYxLCAgLTQ5MTMsICAtMzQ1MiwgICAgIDc0LCAgIDMwNTEsICAgODkwNywKKyAtMzM3NiwgICAgLTk2LCAgMTY2NTQsICAgIDU1NywgICAgNTIwLCAgIC00NDYsICAtMjUyMCwgIC0xNzEyLAorICAyMTUxLCAgLTI0MjMsICAgMzc2MSwgIC0zNTA3LCAgICA0ODcsICAgMjEwMywgICAgNzc3LCAgIC00MTYsCisgICA1MDksICAgIDQ2OCwgICAzNjI5LCAgLTMxNTUsICAxMTQ2MCwgICAyMTA2LCAgLTIxOTEsICAtMTAxNCwKKyAgMTE1NCwgICA5MzE3LCAgICA3MDQsICAgLTI4MiwgICAzMDk4LCAgIDI3MjIsICAgICA4NCwgICAgMTUwLAorIC01OTIyLCAgIDMwNjMsICAgODM3MywgLTExODk2LCAgLTExNTcsICAtMjI4NiwgIC0xNzgxLCAgIDczMzEsCisgIDEzMzEsICAgLTMzNCwgICAtOTc0LCAgLTE2NTMsICAgIDc1MiwgIC0xOTcwLCAgICAtODksICAtMzQ3MCwKKyAgMjQxOCwgIC0xMzM0LCAgIDM2MTUsICAxMjc3MCwgICAtMTE2LCAgIDE5NjUsICAtMTY0MywgICAxNDgwLAorIC0yMjI1LCAtMTA2ODYsICAtMTE3NCwgICAgNTMwLCAgIC05NzIsICAgLTkzMywgICAgNzE5LCAgICA3MjIsCisgIDE1MzAsICAgLTMxNywgICAgMTA1LCAtMTQxNTUsICAgMjU2OSwgICA0NTA2LCAgLTg1MDIsICAgLTY4MSwKKyAtMTU0NCwgICAtNTQyLCAgLTI4MTQsICAtMTE2MSwgICAtNjI5LCAgLTE3NzYsICAtMzU0MCwgIC0xMzY2LAorIC0zNjgxLCAgIDE4MzgsICAtMTYzMCwgICAtNzAzLCAgMTI2MTMsIC0xMjMzNSwgIC0yMDIwLCAgIDIxNzMsCisgICAgMjcsICAgIDMxNSwgICA0NzY2LCAgIDQ1OTAsICAtMTYwMywgICAgLTY4LCAgIDExNTQsICAtMjk0MCwKKyAgMTE5OCwgICA3ODg0LCAgIDI1MDIsICAgLTU4NiwgICAgNDQwLCAgLTUxMjQsICAtMjQ1NCwgIC0yNTk3LAorICAtODI2LCAgIDc0MDEsICAgMjgwMywgICA0NTUyLCAgLTMyMTIsICAgMjk2NiwgIC01NTY3LCAgICA1ODgsCisgIDIyMTYsICAgNzQ0NCwgIC0yNjMzLCAgLTU5MjIsICAgIDQzNCwgICAzNDIzLCAgIDQwODQsICAgMjI5NiwKKyAxMzI1OCwgICAyMDcwLCAgLTQ2MjQsICAtMTIyNiwgICAgMTY2LCAgIC0zNjcsICAgLTUyNywgICAxMTEwLAorIC0xNDA3LCAgIC0xNTAsICAgIDE0MCwgICAgNTg0LCAgIC0zNzMsICAtMjY0OSwgICAgODYyLCAgICA1MDAsCisgIDMyOTIsICAtMzUwNiwgICAtNjc5LCAtMjAxMDksICAgMTc3NSwgICAtNzI2LCAgIDMzNzgsICAgIDc1NCwKKyAtMTk2MiwgIC01NzY0LCAgLTEzMzgsICAtMzYyOCwgICAtNjkxLCAgIDQ1NTQsICAtMTg5MCwgIC02MDIxLAorIC02NTY2LCAgIDI1OTAsICAgIDI2MiwgICAyNTA5LCAgICAyNTcsICAtNDM4NiwgIC0yNDgwLCAgIDYzNTIsCisgLTIwMjYsICAgMTIzNCwgICAtMzk5LCAgMjI4MDgsICAtMjIyMSwgICAtNjI2LCAgIC03MTQsICAgLTMzOSwKKyAtMTE5NiwgICAtNDU1LCAgICAtODAsICAgIDcxMywgICAxNjYyLCAgICA0NzQsICAtMjMyNCwgICAtNTI3LAorICA0MTAxLCAtMTA1MjYsICAtNDYxNywgIDEwNDkyLCAgLTExNDMsICAgIDgwNSwgICAxMzYwLCAgIDM3OTYsCisgICA5NDIsICAgIDY4NCwgICAyNTk2LCAgIDEzMTMsICAgMTU4OSwgICAtNTcwLCAgIDU0NzYsICAgIC0yNywKKyAgOTIyMCwgIC0xNDkzLCAgIDI2MzEsICAtNjcyNiwgIC0yOTc2LCAtMTQyOTUsICAgIDEzNywgICAtNzM0LAorIC0yMDE1LCAgICA2NTgsICAgIDMyMywgICAgIDgzLCAgIDI1MzksICAtMTIzMCwgICAxNzE0LCAgLTIwODAsCisgICA2NTgsIC0xODgwMywgICAyOTc4LCAgICA5OTYsICAtMzM3NCwgICAgLTI4LCAgLTEzMzUsICAgIDE1MCwKKyAgMjE1NCwgICAxMDY5LCAgIC04NTIsICAgIDI5MywgICAgNTM1LCAgLTEwMDQsICAgLTk5MywgIC0zNjkyCit9LAorCisuY2IxNjE2bTAgPSB7CistMTY0NzYsIC0xMTQ0MiwgICAtMzA1LCAgIC0xOTYsICAgLTc2NywgIC0yMTY3LCAgICAgLTEsICAgIDM3OCwKKyAtMjIwMCwgICAgIDIyLCAgIDI0MDUsICAgIDk0NCwgIC0xNzg2LCAgIC04MDYsICAgIDY2OSwgICAgOTUyLAorIDEwNDM1LCAgLTI3NTIsICAtMTYyNSwgICAxMDYwLCAtMTIzMTQsICAgMTI4MywgICAgMjM0LCAgLTI0MDUsCisgICA2MjcsICAgIDc5OCwgIC0xMDU4LCAgICAzMTEsICAtMjc5NCwgIC0yNzE1LCAgICAgNzMsICAgLTIxNCwKKyAgIDgxMywgIC0yNzQ5LCAgMTA3MzIsICAgLTQ0NSwgLTEyMTQ3LCAgLTI1MDcsICAtMTk3MiwgICAxNjUyLAorIC0xOTIwLCAgICAyMTUsICAgIDI5OCwgICAxMTA2LCAgICA4MjYsICAtNzQ0NSwgICAgIDY5LCAgLTE2NzksCisgIC02NzUsICAgMTI0OSwgICAxNDQ0LCAgLTExMDksICAgIC00OCwgIC0xNDUyLCAgLTIzNjgsICAgMzAzNCwKKyAgLTQ5MiwgIDEzMDY4LCAgICAzMTEsICAtMzQ0NiwgICAgMzI2LCAgLTE0MjYsICAgMjM4NCwgIC0yMTQ2LAorICAyOTE2LCAgIDg5NTcsICAgLTE5NiwgICAyMjEyLCAgICA0NDcsICAgMTc3NSwgICAyNjA3LCAtMTE5NjIsCisgIC0yNzgsICAgNDMzNSwgIC0xNzQzLCAgICAxMzUsICAgIDIxMiwgICAgLTQxLCAgICAtOTIsICAgIDE2NCwKKyAgIC0xMSwgICAtNTA0LCAgICA4MjgsICAgLTUxOSwgICAtODM0LCAgICAyNTEsICAgMTkxOSwgICAgNzYyLAorIDI0OTE3LCAgIC0xODAsICAgLTEzMiwgICAtMzMwLCAgICAxMzgsICAgIDIyNSwgICAxMDM4LCAgICAgIDMsCisgMzIxMzgsICAgLTM4OCwgICAgMjA4LCAgIC02MzgsICAtMTMzOCwgICAtMTY1LCAgICAyMDAsICAgLTIzMCwKKyAgIDIyNSwgICAtNzc3LCAgLTIyNzAsICAgODE5OCwgICAgNTgzLCAgIDM5NDYsICAtMTUzNCwgICAxNjY2LAorIC0xMDMyLCAgMTEzODQsICAgIDIwMiwgICAgIDMwLCAgIDI3NTgsICAgLTUwNSwgIC0yODE1LCAgIDEyNjUsCisgICAgNjQsICAgIC0xNywgICAtMzYwLCAgICA2MzYsICAgIDEzNCwgICAgNTAyLCAgICAyNTksICAgIDg3MiwKKy0yODE0OCwgIC0xMDQ2LCAgIC0zNDgsICAgIC04NiwgICAtNzM5LCAgICAgNTUsICAgIDQ0OCwgICAgMTY4LAorICAtNjU2LCAgIDEwOTQsICAtMTA3NCwgICA0NTUyLCAgIC04MzQsICAgMjI5NiwgICAyMzU2LCAgIC01NzIsCisgLTE5MTcsICAxMDk3OSwgICAzMTI3LCAgICAtNTIsICAtOTk2OSwgICAtNTI3LCAgIDE5OTQsICAtMTYyNiwKKyAgMTA0MSwgICAzMzEwLCAgLTIzMTksICAgMjIzMiwgLTExNDQ0LCAgLTI0MDAsICAtMTc4OCwgIC0xMjU0LAorICA1MjY1LCAgIDMxOTgsICAgNzA4OCwgICA0NTIyLCAgIDEyOTIsICAgLTE5MSwgLTE1ODg2LCAgIDI3ODcsCisgICAgMjIsICAtMTYxMCwgICAgMTg0LCAgICAzODAsICAgIDUyMSwgICAgMzM2LCAgIC0xNTgsICAgIDg3NywKKyAgIDQ2OCwgICA2NTE1LCAgIC03NTYsICAtNTQ4NCwgICAgMTAwLCAgIC00NjQsICAgOTI0NCwgIC0yNzI2LAorIC0xNjQ0LCAgLTI3NDEsICAtNTM2MiwgIC0xNjM1LCAgICA4OTQsICAtMTg0OSwgIDEwMTE4LCAgLTMyNjQsCisgLTQ0NzIsICAgMTI1NSwgIC0zNTcxLCAgIC00MzcsICAtMTA1MCwgICAxNTA1LCAtMTExNzgsICAgLTE5MywKKy0xMTUxMywgICAgLTI0LCAgICA3MTksICAgIDIxMiwgIC0xOTk5LCAgIC03MjUsICAgIDUwMiwgIC0xMTY0LAorIC0xMDYwLCAgIC02MTgsICAgIC05MSwgICAtNzM4LCAgICA3NDAsICAtMjI1NCwgIC00NjM1LCAgIDI3MDAsCisgICAgOTUsICAgLTg1MywgICAxMDkzLCAtMTE2MjAsICAgLTk2OCwgICA5NDkyLCAgICAtMjUsICAgLTY2NCwKKyAgIDM2NywgICAxMTA1LCAgIDU1MDEsICAgLTExMiwgICA3NTE2LCAgMTAyODYsICAgIDgyMSwgICAtNDg0LAorICAgMjA0LCAgIDE0MjUsICAtMzQ5MSwgIC0xMjM0LCAgLTQyNDAsICAgMzgwNywgICAyODc3LCAgIDE4MjQsCisgICA0MjMsICAgIDQ2NiwgICAtNDI4LCAgIC04NDUsICAgIC04NiwgIDEzMjc2LCAgIDg0MzYsICAgLTY5MCwKKyAgLTY4OCwgICAgNTc0LCAgLTI4NzQsICAgLTU1MiwgICA0NTQwLCAgICA5MjYsICAtNTQ0MywgICAgNjI5LAorICAtMzk1LCAgIDIwOTAsIC0xNzQ2OCwgICAgMzM1LCAgIDI0MTksICAgMTI3NSwgIC0zNzUwLCAgLTE1ODksCisgICA0NzAsICAtMTczNSwgICAgMzMwLCAgIDI1MzIsICAgMTA5NCwgIC02MjE4LCAgIC04ODQsICAgLTIzNiwKKyAtOTY3OCwgIC05OTQ1LCAgIC00NDcsICAgIDU0MiwgICAtNzI4LCAgLTE5MjIsICAgIDEwOCwgIC0yMTkzLAorICAtOTQ2LCAgIDMyNzAsICAgMjEyMSwgICAyNjI0LCAgIDEwMTAsIC0xMDc0MiwgICAtMTAyLCAgIDI4MTMsCistMTMwNzAsICAgMTUyMywgIC0xNTMyLCAgLTEyOTEsICAgIDQyMCwgIC0xOTk5LCAgICAyNjIsICAtMTE5NCwKKyAtNDIyNiwgIC0xNDUwLCAgIC0yNzUsICAgICA4MywgICAxMTY4LCAgIDE1OTAsICAtMTUxNywgICAtNDI2LAorIC0xNDI0LCAgICAxNTIsICAgIDY3NiwgIDExNDYzLCAgICA4MjQsICAtMjA5MiwgIC0xMTA2LCAtMTE1MDIsCisgLTIzMjcsICAgLTI3OCwgICAyNTk3LCAgICAtMTEsICAgIDc5MywgICAtMTE4LCAgICAzOTMsICAgIDU4MCwKKyAgLTQ5OSwgICAtNzQzLCAgICAtNzcsICAgLTQyNywgICAtNDA4LCAgIC02OTIsIC0yOTE5NSwgICAtMjQ3LAorIC0yMDE0LCAgIC05MjIsICAgICA5NywgICAgNTgxLCAgIDU0NjksICAtMTQxOSwgICAtNjk4LCAgIDE0OTAsCisgLTM4MTQsICAtMjgxOCwgLTEzODE2LCAgICA2ODAsICAgMzU5NSwgICAxNTQ0LCAgIDIzNjYsICAtMzAxOCwKKyAgMjQ3OSwgICAgMzIzLCAgICAzNDYsICAgLTI2MCwgICAgMzM3LCAgIDI3MzAsICAxMjIxNCwgIC0xMTE4LAorLTExMzAxLCAgLTMwMjgsICAgIDIxMiwgICAgLTQxLCAgIDE3NjQsICAgLTU4MCwgICAgNTUzLCAgIDU0NTQsCisgICAgLTgsICAgLTM2NiwgIC0xMjAyLCAgICA5MDEsICAgLTc5NiwgIC04MzUwLCAgIDQzODAsICAtMTQ1MiwKKyAgLTMwMCwgICAxMTUyLCAgIDMwNTgsICAtMzQ3NiwgICAgLTI3LCAgMTMwNDYsICAgICAzNCwgLTExNDM4LAorIC0xMzIxLCAgLTE1MjgsICAxMzIzNywgICAgMTE0LCAgIDI1MTQsICAgIDk3NiwgICAtNTcxLCAgLTExOTIsCisgLTIwNTAsICAtMTYzNSwgICAtOTY0LCAgICA0MTYsICAgIC0yMywgIC0xMDgzLCAgICAgLTksICAzMjc2NywKKyAgLTU0OCwgICAgNTU2LCAgLTEyMTcsICAgIC01NiwgICAgMzI1LCAgIDEwNDgsICAgLTE0NSwgICAgMjAyLAorICAxNTIwLCAgICAgNDQsICAgIDQwMiwgICAgNDAwLCAgIC02MTEsICAgODY2NywgIC0xMDgzLCAgIDEwNjgsCisgIDEyMjQsIC0xMjAzMSwgICAyMzE4LCAgLTExMDksICAgMTI2NiwgICAxMzA2LCAgIDQ2NzMsICAgIDI4NSwKKyAtNTYwMywgICAxNTU1LCAgIC0xMDAsICAtMTA1OSwgICAgNDAzLCAgIC0yMTMsICAgLTY4MCwgICAtOTA0LAorIDExNDQzLCAgICA1ODEsICAxMjE2MCwgICAtNjM4LCAgICAzMDksICAgIC02NSwgICAgOTMzLCAgLTIyODAsCisgIDE5NTgsICAgMjY0MiwgICAxODA4LCAgIDc5NDUsICAtMjA4OCwgICAgODUwLCAgIC00MjgsICAgIDc4NSwKKyAgLTk4OSwgICAxMjM0LCAgLTE0MTMsICAgIDc0NSwgLTEwNzU2LCAgIDE5NDMsICAgLTE4NCwgICAzMjUyLAorICAgLTk2LCAgICA5MzIsICAgLTY2NCwgIDEzMjIyLCAgMTEzMjYsICAtMTM3NCwgICAtMzI3LCAgIDE5MDEsCisgIDEwNjksICAtMTU0MCwgICAgMTA0LCAgIC0xMzksICAgLTkwNCwgICAgMTA2LCAgIDE2NjQsICAgIDkyNSwKKyAgICA0NiwgICAgMzUzLCAgIC04MzUsICAgLTU1NCwgICAxNjE4LCAgIC05NTYsICAgLTQzNywgICAtNzI3LAorIC0zNDAzLCAgIDEwMzgsICAgIDk2OCwgICAgNDM2LCAgICAgNDYsICAtNDM4NSwgICAgMzQwLCAtMTY5MDMsCisgIC00OTgsICAgICA0NywgICAtNTU0LCAgIC0zOTksICAtMjQxOCwgICAtMzQ3LCAgICAzNTgsICAyMzI4MCwKKyAgIDIzNCwgICAtMTcyLCAgIC0zMzgsICAgMTA1OCwgIC0yMTcyLCAgICAgLTEsICAgMTcxMCwgICAgLTY0LAorICAtNTgzLCAgLTIyMjQsICAgLTc4MCwgICAtNjM3LCAgIDM1MDAsICAgIDEwOCwgICAxMDQ1LCAgICA4MjgsCisgIC03MjgsICAgOTQ2NiwgIC0yNDg3LCAtMTI3NzMsICAgMTkyNCwgIC0xMTU4LCAgICAyMDgsICAgICA0OSwKKyAgIDEzNiwgIDEyMDU1LCAgICAgNDIsICAtMTM4MSwgICAtMzc1LCAtMTE1MzQsICAgLTI0OSwgICAxNjAyLAorICAgOTk2LCAgICAyMDQsICAgLTcxMCwgICA0NzYxLCAgIC01MTEsIC0xNTc2MSwgICAgMTY2LCAgLTExODQsCisgIC0xOTIsICAgICA1MCwgICAtMTA1LCAgICA4OTAsICAtOTU2NiwgICAyMDYyLCAgLTE1MzYsICAgIDEzMywKKyAgLTE4NSwgICAtNjQzLCAgIC0xNzIsICAgLTg5NCwgICAtMzU1LCAgICAtMTYsICAtMTM5NSwgICAgNTQyLAorICAyMTYwLCAgIC00ODEsICAtMTEwNCwgICAtNzkzLCAgICA1MTcsIC0yMDQ1NCwgICAgNjk4LCAgIC0xODEsCisgIC0xMzUsICAgLTQzNCwgICAxNjc3LCAgIC0xODEsICAgLTQxNSwgICAtNzM4LCAgLTE1NzQsICAgMTY2NCwKKy0xNDA1OCwgICAgNTk3LCAtMTIzNTQsICAgLTQ2MCwgICAtMzEzLCAgIDE3MjQsICAgLTY4NiwgICAgIDg1LAorIC0xMTYyLCAgIC02NDgsICAgIDg2NSwgICAgMTY1LCAgIC0yMjUsICAtMTk0NywgICAyODE4LCAgIC03NzgsCisgLTQwMTAsICAgIDQwMiwgICAgNjg2LCAgMTExNzAsICAgLTMzMiwgIDEwMzM2LCAgIC03NTcsICAgNDc5NCwKKyAgMjIwNCwgICAtNDc3LCAgIC0yOTIsICAgLTM2NiwgICA4NDEyLCAgLTI0NzYsICAgIDQ5NCwgICAgNTEwLAorIDEwNTE0LCAgICA3NjksICAgIDY0MiwgICAtNDQxLCAgIDEwNzksICAgNjk1NCwgICA0MjQ2LCAgLTIyNzIsCisgIC0yOTAsICAgLTIyNCwgICAxMzEyLCAgICAzOTgsICAgMTUzNiwgICAtNjkyLCAgICAzMzAsICAgIDE1NywKKyAgLTk0NiwgICAtMTAwLCAgLTE4MzAsICAgIDIxNCwgLTI1NjUyLCAgIDEzODIsICAtMTgzNiwgICAtNDQwLAorICAgMTEwLCAgIC01MDYsICAgLTQzOCwgIC0yMzcwLCAgICAxMjYsICAgIDU2MiwgIC0zNTE1LCAgIDEwMTQsCisgIDg1MjYsICAtMTY0MSwgIC0yNDkzLCAgIDQ0MTEsICAtOTIxMCwgICAyMTEwLCAgICA2MjUsICAgIDExNCwKKyAgIDMyMywgICAyNDUwLCAgIDI0MDcsICAgIDY4MiwgICAxOTk5LCAgLTk0MjQsICAgMjQ4MCwgICAgIDY5LAorIC0yMDkxLCAtMTE4NDUsICAtMzY4NCwgICAtNDI5LCAgLTE2MjIsICAgLTkxOSwgICAtNTE4LCAgICAgNzAsCisgIDE0NTAsICAtMzUyMywgICA1MTI2LCAgIDU3MDYsICAtMTQ1MSwgICAyNjMzLCAgICA4MjAsICAgLTIwNCwKKyAxMTMzOCwgIC04MDE0LCAgICA3NTMsICAgLTEwMywgICAgMjkwLCAgIC05MjMsICAgMTQwOCwgICAgMjk4LAorIC0xOTYyLCAgIC04ODcsICAgOTY5MSwgIC0xMzY2LCAtMTEwNDgsICAgIC01NSwgICAtMjIzLCAgLTEwNDAsCisgIC0xNjMsICAgIDEzMiwgICAgNjc2LCAgIC03NjAsICAgNDk5MCwgICAtMzEwLCAgLTkyODYsICAtMjQyNywKKyAxNDQ0MiwgICAtNDE4LCAgIC04MDIsICAgLTM1OSwgICAtMzIzLCAgIDI4NzcsICAgLTIxMCwgIC0xNDM2LAorICAxNTc0LCAgLTEyMDYsICAgIDI2NSwgICAtMTU1LCAgIC0yMjUsIC0zMjc2OCwgICAgMzQ3LCAgICAyMjIsCisgLTExNjUsICAgIDIwMCwgICAgOTI0LCAgIDExMzUsICAgLTg0MywgICAgLTY2LCAgIC0zNDMsICAgLTMzNCwKKyAgLTExMywgICAgMjA5LCAgICAgMTQsICAgLTIwMywgICAxMjE0LCAgIC04OTYsICAgIDkxMCwgIC0xNDk2LAorICAxODMxLCAgLTc4MzMsICAgLTg0MSwgLTEwNDUzLCAgIDE2MDUsICAtODUxNCwgICAtNDc3LCAgICAtNDgsCisgIC0yNDEsICAgIC01OCwgLTMyNzY4LCAgICAyMTMsICAgIDEwOCwgICAgNDUwLCAgIDExNTUsICAgIC0zMCwKKyAgICA4OSwgICAgMjQwLCAgIC03NjgsICAgMTMzMiwgICAgMjkwLCAgLTEzNzcsICAgIDk1MSwgICAgNTg2LAorIC04OTM5LCAgIDEyOTgsICAgIDQ5NiwgICAgNzA1LCAgLTE2NjEsICAgMTc5OCwgIC0xOTA2LCAgLTIyMzMsCisgLTE3MTYsICAgLTk4NiwgIC0yMjA0LCAgLTExNDksICAgMjY4NiwgICA4NTc4LCAgMzI3NjcsICAgIDY0NSwKKyAgLTY2MSwgICAtMTM1LCAgICA3NzAsICAgLTQzMiwgICAtNTUwLCAgIC0zODUsICAgLTI3MiwgICAgNjI1LAorICAxMjM0LCAgIC03MjksICAgICAxOSwgICAxNzUzLCAgIC0yODQsICAgLTEwNiwgICAtNjU1LCAgICA3NTAsCisgIC00NDIsICAyMzE0MywgICAtMzI4LCAgIC01MjAsICAgLTUwNiwgICAgNzkwLCAgLTEwNDgsICAgLTczMCwKKyAgLTQ3MSwgICAtNDM4LCAgICA0ODMsICAgLTM3NCwgICAgOTM5LCAgIC0yMjYsICAgLTM5NywgICAtODQ5LAorLTEyMDU0LCAgIC03NzIsICAgIC00MCwgLTExNzc2LCAgICAyMzIsICAgLTU0MCwgIC0yNDk3LCAgIC02NzksCisgICAzMzcsICAgMTM1NywgICAgNDU4LCAgIC0zNDEsICAtNzU0MiwgICAxMDAxLCAgICA0OTIsICAgLTQxNiwKKyAtMTQ5NiwgIC04OTY2LCAgIDk4MTQsICAtMTc1MiwgICAtNjc0LCAgIDI1MjYsICAgLTU0NCwgIC0yOTAwLAorIC0xMzE4LCAgLTE1NzgsICAgLTIzOCwgICAgIDc1LCAgMTExODEsICAgMTc1MCwgIC0zMTgyLCAgICA1NjQsCisgIC01NzAsICAgIDUyOCwgICAxMDA0LCAgICAxNDYsICAgMTE0NCwgICA3NDMwLCAgICAxNTgsICAgOTUyNCwKKyAgIC0zNiwgICAtMzQwLCAgIC00NDEsICAgIDU5NiwgIC0xNjU5LCAgIDE0MjAsICAgLTY4NiwgICAgLTM2LAorICAtNTk2LCAgIDIyMTUsICAtMTI5NSwgLTE5NzIyLCAgLTIxNDksICAtMTA0NiwgIC0yMzM5LCAgLTExNjYsCisgIDMwNTcsICAgLTM3MCwgICAtNTU2LCAgICAtMzMsICAgLTMyMiwgICAgMjYwLCAgICAtMjMsICAgLTEwNiwKKyAgLTMyMywgICAgMTQ3LCAgICAtNTcsICAgIDE3OSwgICAgNDU4LCAgICA2ODQsICAtMTI4MywgICAxMjUxLAorICAxMjMxLCAtMTg1NDgsICAgLTUxMywgICAtNDgwLCAgIC02OTUsICAgIDU5MywgICAzMDcyLCAgIDE5NjAsCisgICAzMjIsICAgLTcwMiwgIC0xMDQzLCAgIC01NDQsICAgNjAwNSwgICAxMzc4LCAgICAxMDAsICAgLTIyNSwKKyAgLTg0OCwgIC0xMjk0LCAgLTMzNDYsICAgIDgyOCwgIC0yNjEwLCAgLTMwMTAsICAgOTYyMywgIC0xMzI5LAorICAxOTU2LCAgLTEwOTgsICAtMzczMCwgICAxMTM3LCAgMTI0MTMsICAtMTI2MCwgICAyNDU3LCAtMTA4NDQsCisgIDY4MjQsICAtNDI4OSwgICAtNjUzLCAgIC0zMDIsICAtNDQxNSwgICAgNjUwLCAgLTE2ODQsICAgNjEyOSwKKyAgLTM3MCwgICAtNjUyLCAgLTMyNDUsICAgLTQ3MywgICAtMTUwLCAgLTMwMTgsICAgMTg2NCwgIC0xMjU4LAorICAgOTI4LCAgLTIzNzksICAxNDQ1MSwgICAtMTE5LCAgIDIyODIsICAgLTI0OCwgICAzMTM5LCAgIDY1MDIsCisgIDQzMTgsICAgMjIxNCwgIC0xNjI3LCAgICAxMjYsICAgLTQyMiwgICAgMzI2LCAgIC02MjIsICAgLTMwMiwKKyAzMjI1MiwgICAtMjY4LCAgICA0NTYsICAgLTI2MCwgICAtMjYwLCAgIC05NjgsICAgIDM5MSwgICAtNDk3LAorICAgMTUyLCAgIDE3NjQsIC0xMDU4MCwgICAtMzY5LCAgICAyNzcsICAgICA3MCwgLTEzMTM3LCAgLTExMTQsCisgLTExMTEsICAgIDQ2NCwgICAyMjY2LCAgLTI5NjgsICAgIDcyOCwgIC0xMjE2LCAgIDE3MjYsICAgMTA0NCwKKyAgIDM0NCwgLTE2NDM2LCAgIDE1NTgsICAgMzE3OCwgICAtNTUxLCAgICA2MDQsICAgIDQ0MiwgICAtODkxLAorICA5NTcwLCAgIDE1OTYsICAgLTU0MSwgIC0yMTgyLCAgICA3MzAsICAgLTkwNiwgICAgMjQyLCAgICA5MzUKK30sCisKKy5jYjE2MTZtMSA9IHsKKyAgLTExNiwgICAgLTUzLCAtMjQ4NjgsICAgLTU0NCwgICAtNzgzLCAgICAgOTcsICAgLTkxMiwgIC0xMjAyLAorICAtNjIyLCAgIC0xNDcsICAgLTIxNSwgICAtMzYyLCAgICAtMTYsICAgLTUyMiwgIC0xNjk0LCAgIC0zNTgsCisgIC03MjQsICAgMjYyOCwgICAgNDM5LCAtMTgxMDYsICAtMTU2NiwgICAzMDQ4LCAgIDQxMzMsICAtMTIzOCwKKyAtMzIzMywgIC0xMTMwLCAgLTI4ODQsICAtMjc2MiwgICAxMDMxLCAgLTEwMzcsICAgICA2MywgIC0yMjE5LAorIDEwNzAxLCAgLTE1MTgsIC0xMDMyMiwgICAxNDI1LCAgICA3OTIsICAtMTgyMCwgICAgMzgwLCAgIC03NzcsCisgLTMwMTcsICAgMTUzMSwgIC0xMDUyLCAgLTM0OTEsICAgMTA4NSwgICAtNDI4LCAgIC03NjUsICAgLTExMywKKyAgICA0MiwgICAtMjY1LCAgICAzNjUsICAgICA5OSwgICAtODU5LCAgICAgMzUsICAgIDYxMCwgICAgIDQ0LAorICAtNDk1LCAgICAyNjIsICAgMTY4OSwgICAyMDgyLCAgMjE2MDUsICAgIDQxMiwgICAtNzE3LCAgLTExNjMsCisgLTMyODUsICAtNTA2MiwgIC0xNTgzLCAgICA1OTksICAgLTI3NywgICAgLTYyLCAgICA2MTUsICAgNjAxNCwKKyAtMTc4MSwgICAgNDY1LCAgIC01NDQsIC0xNDExNCwgIDExMjc3LCAgICAtMjAsICAgIDY5NiwgICAgNjYzLAorICAxMTU2LCAgIC0yNDAsICAgIDYzMSwgIC0yODAyLCAgICAzMzMsICAtMjU0NCwgIC0xNjI4LCAgICA3NzUsCisgIC05NjAsICAgLTU1MywgICAgNDk2LCAgIC0zNzgsICAgIDUyNiwgICAtNDIxLCAgIC00MjYsICAgIDI5MCwKKyAgIDU1NSwgICAgNDAzLCAgICAzOTAsIC0zMTcxNCwgICAgIDI1LCAgICA0NDksICAgIDY1NCwgICAtMzM0LAorIC0xMzE3LCAgICAxNjUsICAgIDQ5NiwgICAxNTU0LCAgICAtODgsICAgLTc3NywgICAgNjI2LCAgLTE1MTEsCisgLTkwMjAsICAtMTcyNSwgIDEyNzA1LCAgIC03OTgsICAtMTI0MCwgICAgMTk1LCAgIDE5MzIsICAgLTgzMywKKyAgLTkzOSwgICAgIDQzLCAgICAxODIsICAgMjU0NywgICA0ODc5LCAgIDkyMzQsICAgIDM3MCwgICAyMDU4LAorIC03NzU3LCAgICA1NDQsICAgMTEwNiwgICAtNjYwLCAgICA1NDYsICAgOTk4MywgICAgMjI1LCAgICAxMjQsCisgICA5NTIsICAtMjE1MywgIC0xNzMyLCAgIDI3NjAsICAtMTI3MCwgICAtMTc2LCAgIDMzMzQsICAtNjczNSwKKyAgLTUyNiwgIDEwNDc1LCAgIC02MjcsICAgNzgzNSwgIC0yMjYzLCAgICA0NzUsICAgIDczMSwgICAgOTA4LAorICA4MjY0LCAgIDE2MDUsICAgLTE5MiwgICA1MDI2LCAgIDI0MTQsICAgNTIyMywgICAgNTk1LCAgIDEwOTMsCisgIDIzNDUsICAgLTc5NiwgICA4NjYzLCAgIDEwMjgsICAgODE4OCwgICAtMTg1LCAgLTE1MDYsICAtMzA0NCwKKyAgLTEwMCwgIC0xODE4LCAgLTYzNjksICAgLTE3MCwgICAxNzI4LCAgLTkyNDksICAgIDg4NiwgIC0yMTExLAorICAtMzQ5LCAgLTExNDYsICAgMjEyNywgIDExNjIyLCAgLTgwNDMsICAgMjg4MCwgICAyMjE1LCAgIDE2OTMsCisgLTIzMDMsICAgMTY5OCwgICAxMTIxLCAgLTM1NzUsICAgLTkyNywgICAtNzE2LCAgIDE5NDAsICAgMjUxNCwKKy0xMTY3MiwgICAxNjE5LCAgICA5MTYsICAgICAtNywgICAtNTg1LCAgICA1MDgsICAtMTMxNiwgICAtOTcyLAorICAgNzc4LCAgIDk3NzQsICAtMjEyNiwgICAyMzY4LCAgICAtNTYsICAgNjcxNiwgICAxMTY5LCAgLTM2NTYsCisgLTEzMzAsICAgOTUzMCwgLTEyMTU4LCAgIDExODgsIC0xMTQyNiwgICAtMzUzLCAgICA5NDUsICAtMTk0MSwKKyAgMTc1MCwgICAgOTYyLCAgLTExMzMsICAgMTc5MywgICAyMzE4LCAgLTI2NDEsICAgMTEwOSwgICAgOTMzLAorICAgODA0LCAgICA1MDUsICAgICA2MCwgIC0xNjQyLCAgLTIyMzgsICAtMjMyOCwgIC0xNTU4LCAgLTE1NjgsCisgICAtMjcsICAgIDk1MiwgICAgICA0LCAgIDEzNzYsICAgLTg2MiwgLTE4NDA0LCAgLTE4MjgsICAgNDEwNywKKyAgLTQ1NCwgICAgIDUyLCAgLTEyMDIsICAgMTE1MCwgICAgNjg2LCAgLTE5NTAsICAgLTQ5NywgLTEwODgzLAorICAgNDAwLCAgIC00MjIsICAgMTczNCwgICAgLTU0LCAgMTExNjUsICAtMzMwOSwgICA2NDAyLCAgIC04NzcsCistMTk5NjcsICAgLTQwMCwgICAxNjQyLCAgIDEzMDUsICAtMjQzMiwgIC0zMTE1LCAgICAzNzUsICAgMzg5OCwKKyAgMTgxMiwgIC01MzA1LCAgIC05NDYsICAgMTcxNywgICAtNzU3LCAgIDMzMjIsICAgIDEyNiwgICAgNzQ3LAorICAxODM2LCAgIDk5NTcsICAgMTkwNCwgICAgNjU4LCAgMTMwNDMsICAtMTc3OSwgICAgNjc1LCAgICA3MTYsCisgIC00NTMsICAgIDY3MCwgIC0xNTcyLCAgICAyMTAsICAtMTUzMywgICAtMTMzLCAgICAyOTQsICAgIDU0NiwKKy0yNDA4NCwgIC0xMDM2LCAgIC00ODUsICAgLTExNywgICAtMTg0LCAgIC02MjQsICAgIDI3MywgICAtOTAxLAorICAgODY2LCAgICA2MDksICAtMTExOSwgICAgIDI4LCAgICAyNTAsICAgICAxMywgICAgIDcwLCAgIDExNzgsCisgICA4ODIsICAgLTYzMiwgLTIxNjI0LCAgLTEzMzksICAgIDkyNiwgIC0xODE0LCAgLTEyNzksICAgMTg2OCwKKyAgLTE4MSwgICAgMzgzLCAgIC02NzksICAtMTA3MCwgICA1MDkxLCAgIDExNDgsICAgMTAzNCwgICAyMTQ0LAorIC0yNzc5LCAgLTM4MTAsICAgNDUzNiwgICAxNzEzLCAgIDEwMDMsICAxMzMyMiwgICAyODY2LCAgLTMyMTcsCisgIDI1MDgsICAgNDM5NSwgICAgNDgwLCAgICAgMTQsICAgIDE2NywgICAgNzYzLCAgICAtMzQsICAgMTAzNCwKKyAtMTM0MiwgIC0xMzQ5LCAgIC0xMDAsICAgLTIyNSwgICAgNDY0LCAgIC05MTQsICAtMTQwMywgIC0xODUxLAorIDIzNzY3LCAgICA3NzAsICAgLTQ1NywgICAtMjU3LCAgLTEwNzIsICAgMTIwMSwgICAgNTgzLCAgICAtNTksCisgIDI2MjcsICAgMTQ2OSwgICAgIC03LCAtMTE2NDIsICAgMzM1MiwgIC0xMDAzLCAgICAgLTYsICAxMTU4OCwKKyAgLTMxMSwgIC0yNDM1LCAgLTIxODAsICAtMjM1MiwgICAxOTUyLCAgIDU1MzIsICAgMTk0NSwgICA3MjgxLAorICAgNTA0LCAgMTE4ODIsICAgLTYwMywgICAgIDQ1LCAgICAgNDIsICAtMTM5NiwgIC0xMTE1LCAgLTEwNDEsCisgLTEwNjEsICAgIDU2NiwgIC0yNzMzLCAgIC03NjUsICAgIDY4NywgICAgMTE4LCAgLTExNzQsIC0yMDQxMiwKKyAgLTI0NCwgICAtOTg2LCAgIC0xNTEsICAgMjg4OCwgICAxMTAyLCAgLTEzMDMsICAgLTEzNSwgICAgNTI5LAorICAxMTg2LCAgMTMyMjAsICAgLTE4MywgICAgOTA2LCAgLTQyMDksICAtNDQ1NSwgICAyMjQ3LCAgICAyNDYsCisgLTY0NzQsICAgMjc5NCwgICAxNDUwLCAgLTY0OTUsICAtMTgxOSwgICAgNTk4LCAgIC00MzgsICAgIDI0NCwKKyAtMTA2NCwgICAtNjczLCAgIC02NzIsICAtMTU2MywgICAgNTQzLCAgLTIyNzgsICAtMzA4NywgICAtODExLAorICAxODY2LCAgICAgODAsIC0xODk4NywgICAtNjgyLCAgICA1NjksICAgLTU1MSwgICAgNTE0LCAgIDY4NzYsCisgIDc1ODIsICAgIDgzOSwgIC00MDMxLCAgICA4MjMsICAgMjM0MiwgIC0xMzAwLCAgIDExODAsICAgIDcwMiwKKy0xMDE2OCwgIC0xOTU3LCAgICA0ODUsICAgLTM3NCwgICAtMTUxLCAtMTEwNjYsICAgLTQ2MSwgLTEyODI0LAorIC0xMjIxLCAgIDEyODEsICAgLTcxOCwgICAyMDEyLCAgICAzMzAsICAgLTI4OSwgICAtNDg3LCAgIC0yMDcsCisgIC03MjIsICAgIDM5NCwgICAgMTU2LCAgLTIwMjMsIC0xMTAwNiwgICAtMzczLCAgICAgLTQsICAgLTIzOCwKKyAxMDU4MSwgICAgOTkxLCAgLTEyMzYsICAgLTgxNCwgICAgNTUzLCAgIDEyOTUsICAtMjI2OSwgICAyNzgzLAorIC0xOTczLCAgICA2ODEsICAgOTc1OSwgICAzNjc0LCAgLTE2ODAsIC0xMjExOCwgIC0xMzQwLCAgLTIzNzIsCisgIC0yODgsICAgMjE0MywgICAtMzI4LCAgICA4MDksICAgIDMxMiwgICAyMDM4LCAgICA3MzYsICAgIC0xMCwKKyAgIDkwOCwgLTExMzE5LCAgICAgNzQsICAgNjM2MiwgIC0xMTIyLCAgIDE1NDYsICAgLTE4NCwgICAxNjMwLAorIC0xODUxLCAgLTIxNDMsICAgMTA0OCwgICA4ODU4LCAgIC00NjIsICAtNjQ1OCwgIC0xNTQwLCAgICA4MTEsCisgICAxMzAsICAtMzU0MiwgLTEwNDI0LCAgIDkzNTMsICAgIDM4OCwgICAxMTY4LCAgLTE3OTcsICAgMTc5NiwKKyAtNDE1MSwgIC0yMzI5LCAgICAgIDEsICAgLTI3MiwgICAgODQ2LCAgIC02NDIsICAgIDI0OCwgIC0xMTQ0LAorIC05ODYzLCAgLTE2ODQsICAgLTE5MCwgICA3NjExLCAgLTQxNDcsICAgLTY5MiwgICA1MzU0LCAgLTIzNjMsCisgICA2MDksICAtNDkyNiwgICAzMTY2LCAgIDIwOTQsICAgIDg1NywgICAtMzY5LCAgICAxMTgsICAgIDcyNSwKKyAgLTg5OSwgICAtNjAxLCAgICAgLTYsICAgIDU1NiwgLTMyNTQwLCAgICA5NTAsICAgLTQ3OCwgICAgNzU3LAorICAgMTM2LCAgIC01NjAsICAgLTc1NCwgICAgNTYyLCAgIC00NDgsICAgIDIyMywgICAtNzA0LCAgICA2MTYsCisgICAzNjUsICAyMjYxMCwgICAxMTkxLCAgLTEyNjQsICAgIC05NCwgICAgOTI3LCAgIC0yOTQsICAtMTI3MCwKKyAgIC0xNiwgIC0yNTIwLCAgLTIwMjYsICAgIDQyMCwgIC02NjIxLCAgIC01MDQsICAgOTY2NiwgICAgNDUyLAorICAtMzc5LCAgLTE4ODgsICAgIDUzNiwgICAxMTYxLCAgLTMwMjEsICAgIDYwOSwgIC00ODkwLCAgIC0yMzEsCisgIDM5MjYsICAgLTk0MywgIDMyNzY3LCAgIC02MTUsICAgIDMwMCwgICAgODcwLCAgIC03NDIsICAgIDQyOSwKKyAgIC00MiwgICAgMTU1LCAgIDEwNjAsICAgLTkwMCwgICAtMzQ3LCAgICAgMzQsICAgIDQ5MSwgIC0zNjI1LAorIC0xNTI5LCAgMTAxNzUsICAgIDE3OCwgIC03OTM4LCAgIC00MDYsICAgMTYyOCwgICAtMzYyLCAgLTczNDAsCisgIC00MzMsICAgIDQ4OSwgICAgNTY4LCAgICA2NzQsICAgIDUzNiwgIC0yODg2LCAgLTYxMTgsICAgIC0xNiwKKyAgLTUzMSwgICAgMTgyLCAgIDE0OTgsICAtNDE5NCwgICAtMzA2LCAgICAgNjMsICAtMTQyOSwgICAxMTA5LAorICAgNjMxLCAtMTAzODYsICAgIC0xNiwgIC01OTM4LCAgICAtNTIsICAxMDYzOCwgICAtNzkzLCAgICAgMzUsCisgIC04NzQsICAgMTYzMywgICAtMjUyLCAgICA3MDksICAgLTI4NiwgICAtNzgwLCAgMTcxNzIsICAgIC0zMiwKKyAgIDkxMiwgICAgMTM3LCAgLTE2ODQsICAgMjc4MSwgIC01NjM3LCAgICAzMzgsICAxMDk2MSwgICAxNDAxLAorICAgMTc2LCAgIDE4OTAsICAgIDU2MywgICAtMzcxLCAgICA1NzgsICAgLTIzNSwgICAtODgyLCAgIC02MTYsCisgIC01OTEsICAgLTY3MiwgICAtODIxLCAgMTIxOTQsICAgIDkxNywgICAgNzc4LCAgIC00MjcsICAgIDM1OCwKKyAtMTQxMSwgICAyMDMyLCAgLTEzNzIsICAgMTg5MSwgIC0xNzg0LCAgIDE4MzAsICAtMTgwOCwgICAtNDY0LAorIDEzOTczLCAgIDIwMTYsICAgODYwNiwgICAtOTE0LCAgLTczMjksICAtMTg1MywgIC0yNjI3LCAgIDIyMTksCisgIDI2MjgsICAgMjE2MSwgICAyMTg1LCAgIDI0MTQsICAgODg1NywgICAtMjczLCAgIDEwMTYsICAgMjI1MywKKyAgMTA3MCwgICAgOTA3LCAgICAzNjcsICAgLTQzMCwgICAgNTc0LCAgIDEwMzksICAgICA5MywgICAgMTcwLAorICAgMjU1LCAgIC0yNjcsICAgIDU1MCwgICAtNjY4LCAgICAyODcsICAgMTgyNywgIDE5ODMzLCAgICAyNDQsCisgLTM3MzEsICAgICAgNCwgIDIxMzY1LCAgIC0xMjcsICAgIDM1NiwgICAgNjQzLCAgIDIwMTYsICAgMzI5MCwKKyAgMTI0MiwgICAgIDQ2LCAgIC03MzQsICAtMjI5OCwgICAtMzE2LCAgLTY2MTgsICAgLTI5NiwgIC0xNDY1LAorICAgNjU3LCAgLTE0NTEsICAgIDQ2OSwgICAgMjEyLCAgIDI4MjMsICAtMjgwMywgLTExODYyLCAgICA5MzEsCisgICAgNDQsICAgIDY2MCwgICAxNTc2LCAgIDE4NDgsIC0xMDUyOSwgICAyODEzLCAgLTExNjMsICAgLTI2MCwKKyAgLTE5NSwgIDE2MzIwLCAgLTM0NDcsICAgLTI2MiwgICAgLTc2LCAgIC00MzksICAtMzQ4NywgICAxMjkyLAorICAzMzMwLCAgIC02MTYsICAgMTQ3NywgICAxOTAwLCAgIDg4NDMsICAgICA4MSwgICAtODQ2LCAgIDY4NDUsCisgICAtOTUsICAgLTExMiwgICAtMjMxLCAgICAxMjksICAgNjk4MiwgICAgMTY1LCAgLTMxMTUsICAgMjQ1NiwKKyAgMjAzMiwgIDEyMjAxLCAgIDI3NDcsICAgMTY5MSwgICAtNzI4LCAgLTE5MzUsICAgLTIzOSwgICAgOTY4LAorIDE1NTc4LCAgLTIyNjAsICAtMTgxMywgICAgNDQwLCAgIDIxODgsICAtMzg0NSwgICAxMjc4LCAgIC0xMzYsCisgLTEzODgsICAtNzg1MCwgICAtNDYyLCAgIDI5MjEsICAtMTc0MCwgICAtMTM2LCAgICAxNjQsICAgIDEwMywKKyAgLTIwNiwgIDMyNzY3LCAgIC00NTksICAgMTI0OSwgICAgNzM2LCAgIC01OTAsICAgLTc5NywgICAgNjI4LAorICAgNjEyLCAgICAzMjcsICAgIDM5NiwgICAgNTUyLCAgIC0xMjgsICAgIC03NiwgICAtMjU4LCAgIC01NTcsCisgICA0MjksICAgIDE3MCwgICAgNTMyLCAgIC0zNDcsICAgIDE2OSwgICAtNTkzLCAgMjgzMTksICAgLTYzMywKKyAtMTMzOSwgICAtOTk3LCAgIC0yNTgsICAgIDMyNCwgICAgNjI4LCAgIDMyNTQsICAtMTExOCwgICA4OTAyLAorICAgLTYzLCAgIDQ3NjIsICAtMjgyMCwgICAyNDI5LCAgICA4MjAsICAgIC00NiwgIC01MzY2LCAgLTIxOTMsCisgLTkwMDUsICAtMTMwNCwgICAtNTk3LCAtMTAxNDMsICAgIDU1NSwgIC0zMDAwLCAgICAyOTQsICAtMTU3NywKKyAgLTg3MSwgICAtMTQwLCAgICA3MjYsICAgMzcwMCwgIC0yMjI2LCAgICA5MDMsICAgLTI1MywgIDEwMzMwLAorIC0yOTQ2LCAgICA2NTYsICAgIDcyNSwgICAtNjY4LCAgIC05MjAsICAgMTY1MywgICAxMzEyLCAgIDE2MjMsCisgLTExNTAsIC0xMTk3MCwgICAyMTU3LCAgIDQ1MzIsICAgLTM0MCwgIC04NjQ4LCAgIC02MTYsICAtMTQyOSwKKyAgLTk4MCwgICAgLTMwLCAgICA2NDcsICAgLTQ3NCwgICAgNDQyLCAgIDUwOTgsICAgIDE4OCwgIC0xMjU4LAorIC04MTcyLCAtMTA5MjcsICAtNDIwNywgICAtMTEyLCAgIDI1MDEsICAtMzI0MSwgIC0xOTQ5LCAgICAxNTksCisgIC01MjUsICAgMTA5MCwgICAgNDIwLCAgMTA0MTgsIC0xMTg5NywgICAxMDcyLCAgICAtNzgsICAtMTAyOCwKKyAgMzM2NywgIC0yNjQ3LCAgIDM0MjEsICAgMjAyMSwgICAyMzU4LCAgIC05NzMsICAgIDI3MiwgIDI3OTExLAorICAgNDcyLCAgIC00MDIsICAgMTM5NywgICAtOTI3LCAgLTEwMzIsICAtMTI3NCwgICAgODQ4LCAgICAyMjEsCisgLTI3NDUsICAgLTcxMCwgICAtNjkyLCAgIC00MDksICAgMTkyMiwgICAgMTQyLCAgICA1OTQsICAgMTA1MywKKy0xMTM1MCwgICAtNzkxLCAgIDM3NjcsICAgMTU2OSwgICAgNTQxLCAgMTE5MjEsICAgIDEzNCwgICAgMzY4LAorICAtOTQ4LCAgLTI2ODksICAgIDg5NiwgIC0xMTkzLCAgIDExOTAsICAgODUxNCwgICAxNDM2LCAgIDEwMTcsCisgICA1OTksICAtMzM1OCwgICA0MDAyLCAgMTI5MzYsICAgLTY3NSwgICAxMDQ0LCAgLTEyMTAsICAgIDI5NiwKKyAtMTEwOSwgICAxOTkyLCAgIDEyODIsICAgIDc3NCwgLTEzMTAyLCAgIC02MDgsIC0xMTE0NSwgICAgMTM0LAorICAgMjc4LCAgICA5NDQsICAgLTg4OCwgICAgMzUwLCAgLTE1NzQsICAgIDE4OSwgIC0yNTQyLCAgIDM0NzYsCisgLTMwMTgsICAgMzM2OCwgIC05MzA0LCAgLTE4MzksICAgIDUzMywgICAgIC0yLCAgIDEwNTcsICAgIDY4NiwKKy0xMTgxOSwgIC0xMTQ2LCAgIC05NzMsICAgMTU5NCwgICAzNTI2LCAgLTI4OTAsICAtMTUyOCwgICAzNDg5LAorICAtNDc1LCAgIC0yNTksICAtOTYxMCwgICAtNDc1LCAgIC05ODQsICAtMzU1OSwgICAtNzQyLCAgICA0MDgsCisgIC0xMzAsICAtMjI5MSwgICAgODk5LCAgMTIxNzcsICAtMTkzNCwgICAtMTYyLCAgLTMyMzgsICAgMTYxMAorfSwKKworLmNiMjIyMGwwID0geworLTEyNTI4LCAgICAzNTAsICAgMTc4MiwgICAtNDc0LCAgIDE0MzksIC0xNDI2OSwgICAgIC04LCAgLTE3ODIsCisgIC03NTMsICAtMTcyMCwgICAgMTY3LCAgIC00NDAsICAtMjcwNiwgICAgMjIyLCAgLTE2MjksICAgLTI4OCwKKyAgIDY3MSwgICAtMTExLCAgMTAyNzAsICAgIDg3OCwgICAgMTUyLCAgICAzMzAsICAtMTAwMCwgICAgNjM5LAorIC0xMjgwLCAgIDExMTEsICAtMjA3MiwgICAxNDM5LCAgIC00NzYsICAgIDU1MywgIC0yOTc0LCAgIC02MTQsCisgIDE2NjYsICAgLTQ2NiwgIDExODExLCAgLTEzOTMsICAgIDE1NCwgICAgNjI0LCAgIC02OTcsICAgIDE3NiwKKyAgMTEwOCwgICAgNTA0LCAgICAyNTAsICAgIDU3MiwgICAgIC02LCAgICA3MDQsICAgICAxNiwgICAgNjQ3LAorIC0xMTQzLCAgLTE0MDcsICAgLTQxMSwgIDIzNzQ1LCAgICAzMTksICAgLTE4OSwgICAtNDA0LCAgIC02NDEsCisgICAtODYsICAgLTcwNywgICAtNzcwLCAgIC0zMDIsICAgICAxMywgICAtMzk4LCAgICAgNzYsICAgLTY4MSwKKyAgLTUyNSwgICAgMzU0LCAgLTEyMjUsICAgLTc1NywgLTIzMTcwLCAgIC00ODQsICAgLTk2NSwgICAtNDMwLAorIDEzNDc3LCAgICA4OTgsICAgIDUwNSwgICAgLTE3LCAgMTM4MTIsICAgLTg5MCwgICAgMzU3LCAgICA2NjIsCisgIDEwMDAsICAgLTkzNSwgICAgLTYwLCAgICA5NDQsICAgIDQwMCwgICAtNDMyLCAgIC0yMjEsICAgMTA0NywKKyAgIDMwNywgICAtMTgwLCAgIDUyNjAsICAxNjUwOSwgICAgNjUwLCAgIC0yNjksICAgMTU2MywgIC02MDAyLAorIC0zMDgyLCAgICAxODYsICAtMzMzNCwgIC01NzcwLCAgIDEwMTAsICAgLTM5NCwgICAgMTI4LCAgIC02OTksCisgICA1MzcsICAgIC0yNywgICAxMDE0LCAgIC01MzEsICAgIC01MCwgICAtMTYzLCAgLTE2NjQsICAtMTAyNiwKKyAgIDczMiwgIC0xMjk2LCAgMjE4NTYsICAgIDU3NCwgICAgNDE2LCAgIC03NDUsICAgLTQ0MywgIC0xMzgyLAorICAgMjcyLCAgICA3OTEsICAgMTMwOCwgICAtMzA4LCAgLTE2MzYsICAgIDE2OCwgLTEwOTIyLCAgICAxMTksCisgLTExOTAsICAgMTEyMywgICAxNDkyLCAgIDE3MDYsICAgMTA3NiwgIC0yMDE2LCAgIDMyNzAsICAgLTk5NCwKKyAgIDg3NiwgIC0yMzE2LCAgLTI5OTIsICAxMjYyNSwgICAtNDEyLCAgIC0xNTksICAgNTI0OSwgICAxNDI0LAorICAtMzA0LCAgICA1NTcsICAgLTQzMSwgICAtMzYwLCAgIC0zNDAsICAgLTU2MSwgICAtMjkyLCAgIDE3NDgsCisgIC0yMjQsICAgMTc4OSwgICAtMzUyLCAgICAzODYsICAgIDEzNiwgICAgIDc2LCAgIDEzMDksICAgLTI3MCwKKy0yNDIwNCwgICAtNTE1LCAgIDExNDIsICAgMjExOSwgICAxMTQ0LCAgIC0xNzMsICAgMTAwOCwgICAtNjkzLAorICAtNDMwLCAgLTEwNTIsICAgMTg5MCwgLTEyNDgzLCAtMTE0MTYsICAgMjkxOCwgICAxNTkxLCAgLTEyMDIsCisgLTE3ODIsICAtMTMzNSwgICAxMzU0LCAgIDE3MDMsICAgLTUxMCwgICA0Mjg3LCAgIC04NTQsICAgMTE1MywKKyAgMjAxOCwgICAtNTE4LCAgIC05NjAsICAxMTgyNSwgICAxMjk1LCAgIC01NjMsICAxMTI1MiwgICAgMTkwLAorICA0MDc4LCAgICAyMjIsICAtMzExNSwgICAzMzA2LCAgICA3NDcsICAgMjYzOCwgICAxMDE1LCAgLTE2NzQsCisgIDgwMzIsICAtMjM4NiwgICAgNTczLCAgIC0zNDksICAgLTgzMiwgICAgIDk2LCAgIDk1NjQsICAxMTcwOCwKKyAgLTQ4MywgICAxMzI2LCAgIDE4MDQsICAtMjkwMywgIC0yMDI0LCAgIC0yMzQsICAgMTAwOSwgICAzMjI5LAorICAtMjMyLCAgICA4MDMsICAgIDI3NSwgICAgNDQ0LCAgIC02MjksICAgLTE5MiwgICAgMzgxLCAgLTEyODksCisgIC0xMDksIC0yOTAxOSwgICAgMjcwLCAgIC00MjAsICAgLTQwOCwgICAtNDY2LCAgICAxMTMsICAgLTUzNywKKyAgLTI2NiwgICAgMjk2LCAgICAxODAsICAgIDUwNiwgICAxMDE1LCAgIC01NjUsICAgLTUxNywgICAxNDk0LAorLTExMDUzLCAgIDM5NjgsICAtMTczNSwgICAzNDc0LCAgLTE5OTEsICAtODMyNiwgICA4MDc1LCAgIDE3NDAsCisgLTM5OTUsICAtMTI4NywgIC0yNTU4LCAgIDEwMzAsICAgMzc0MiwgICAtNjE4LCAgLTI2MDAsICAtMTc4MywKKyAgMjY5NiwgICAxNDgwLCAgIDEwNTQsICAgIDM0MSwgICAzNzYyLCAgIDQyMjUsICAtMTc0MiwgLTExNTgyLAorICA0MzQ4LCAgLTg3NTYsICAgIDQ5MywgICAtNDA0LCAgIDM4NDAsICAtMTA0OSwgICAtNjgzLCAgIC05NjIsCisgICAxNjMsICAxMDk5NywgICAgLTk3LCAgIC04NDgsICAtNDYzMiwgICAyNzk0LCAgIDI2ODQsICAgMjU0MCwKKyAgIDczOSwgICA4NTM0LCAgIDM2ODgsICAgLTg3OCwgICAzMTM4LCAgIDI1NzYsICAgNjQ0NCwgICAzNjc0LAorIC0yMzcxLCAgIC0yMTgsICAgMjg2NCwgIDEyMjcwLCAgIDI4NjYsICAgIDE4OSwgICA0NTQ5LCAgIDQ4OTQsCisgLTYzNzgsICAtMTA1MCwgIC0zMTY2LCAgLTU4OTcsICAgMjI0NSwgICAyODAzLCAgICAtNzAsICAtMTkwOSwKKyAgMjc4MywgICAzOTUxLCAgICAxNTMsICAxMTIyMSwgICAtNjU4LCAgMTI3ODAsICAgLTIzOCwgICAzNDE4LAorIC0yMjM1LCAgICA3NTQsICAgIDMxMSwgICAtNzM5LCAgLTI0MTQsICAgIDcwMiwgICAxMDc2LCAgICAzMDMsCisgIC0zMjAsICAgICA0NywgIC0zMjg4LCAgIC0yMzQsICAtMTM3NiwgICAzMDIyLCAgIC0xMDMsICAtMTc4MCwKKyAgIDcxNiwgIDExODg2LCAgMTA5NDIsICAtNTQwMiwgIC01NDMxLCAgIDExOTYsICAgLTYyNCwgICAtODg1LAorICAtNjUyLCAgLTMyNDgsICAgICA3NCwgICAtNDM1LCAgIC02ODYsICAgIDE1NCwgICA4Njc1LCAgIDMzMjUsCisgLTE3NzksICAgLTM0MSwgICAgNTY0LCAgIC05MDEsICAgMTMzNSwgICAtNjM5LCAgIDM0OTQsICAtMTgyMCwKKyAgIDI5MCwgICAgLTkyLCAgLTMwODgsICAgNDc3NSwgIC0yMTQwLCAgIDIzMzQsICAgIDcxMCwgIDEwNTM2LAorLTE1MDQyLCAgMTQ4MjMsICAtMTA4MiwgIC0xMDQ1LCAgIDEwMDgsICAgIDczNCwgICAgMjQxLCAgLTEwNDgsCisgIC05MzMsICAgIDI0NSwgICAgOTEzLCAgICAxMTQsICAgIDMyMiwgIC0xNzk4LCAgICAyNDYsICAgMTA2NywKKyAgIDM0OCwgICAgNDA4LCAgIC0xODMsICAgLTcyOCwgLTEyOTE1LCAgICA2ODUsICAgMTUyNSwgICAxNjk0LAorICAgMTgzLCAgIC0xNjgsICAxMjcwMywgIC0xMjY4LCAgIDE2MTMsICAtMjA3MiwgICAxNTQ2LCAgICA3NDMsCisgIDIzNTYsICAgMjEzNSwgICAtNTUwLCAgIC0xNTMsICAgMTMyNywgICAgICAyLCAgMTI0ODcsICAtMzExMSwKKyAgMjM0NywgIC0xNzIyLCAgIC0zMDAsICAgLTE5MywgICAyMjIyLCAgLTE5MjgsICAgLTY1OCwgICAtMzg0LAorIC01NzM4LCAgLTExNDEsICAgMzYzNCwgIDEwMzEyLCAgICAtNjksICAtMTU0OSwgIDEwODc5LCAgIDE3OTUsCisgIC0zNjEsICAtMTgzOCwgICAgMTQzLCAgIDEyMDIsICAgIDMyNywgLTE1NTQ5LCAgLTEyNjgsICAgLTE5NCwKKyAgMzI4NCwgICAgLTEyLCAgIC0zNDQsICAtMjA0MiwgICAxNjYzLCAgICAzMzQsICAgLTc5OCwgICAtODczLAorICAxNzM2LCAgIC0zMjQsICAgIDE5NSwgICAtNDE3LCAgIC0zODIsIC0yMjkzNiwgICAgODEyLCAgIC00NzgsCisgIC05NjIsICAgLTQ1MSwgICAgNzMwLCAgICAzODIsICAgLTEzNSwgICAxMzExLCAgIC0yOTAsICAgIDEyMiwKKyAgIDE0OCwgICAtNzc1LCAgIC0zMDUsIC0zMjIxOCwgICAgLTg0LCAgICAgOTgsICAgIDM3NCwgICAgMzY5LAorICAgLTQ0LCAgICA5MjMsICAgLTQzMiwgICAgMTU2LCAgLTE0NzEsICAgIDIzNiwgICAgLTM5LCAgICAxNDMsCisgIC0xNDYsICAgIDgzNSwgICAgMTM1LCAgICAyMjksICAgLTI5NywgICAxNjkwLCAgIDY3ODYsIC0xMjE2OSwKKyAgIDgxNSwgICAtMTc2LCAgIDE4NjgsICAgICAtOSwgIC0zMDUyLCAgICAxMDgsICAgIDExNCwgICAgMjYwLAorIDExMzM3LCAgLTI2ODksICAgLTEzMiwgICAgNzY1LCAgIC0yMzksICAgICA1NCwgICAgNjkxLCAgLTk3MzcsCisgIC02MjcsICAgLTQ3NCwgIDEyMjEyLCAgIDIyMjIsICAtNzU5NSwgICAtMjM5LCAgIDE3OTMsICAgMjExNSwKKyAgIDU2MywgIC0yMzkwLCAgLTE5OTEsICAgMjkwNiwgICAgNjc1LCAgICA5MjMsICAgIDE0NiwgIC0zNjA1LAorICAgOTgxLCAgLTE3MjUsICAgICA5MiwgICAtNTYyLCAtMjExOTIsICAgIDMwNCwgICAtNDUwLCAgIC0zMjMsCisgIC04ODksICAgLTcyNiwgICAgNjg4LCAgLTExODYsICAgMjU5MCwgICAgNDY2LCAgICAzMjYsICAgLTczNCwKKyAgIDMwOCwgICAtNzgyLCAgLTMyMTksICAgIDk2MywgICAgNDU0LCAgIDEzNDgsICAgLTUxMywgICAgOTUzLAorIC0xNDE0LCAgIC0zMjAsICAgMTAxMiwgIC0xMTQ4LCAgIDExODUsIC0xNzM1NiwgICAgLTE1LCAgIDE1NDYsCisgIDEzNDYsICAgMjE4MiwgIC0yNDU3LCAgIDE0MjYsICAtMTY5MCwgICAgMTU1LCAgIDg3OTMsICAgMTM5NCwKKyAgIDUxMCwgICAyNjA4LCAgIC0yMDMsICAgMjY5NywgICAgNjA4LCAgIDI2MTIsIC0xMzU0MiwgICAgMTc3LAorICA0NjQyLCAgIC04MjQsICAgMTg3NywgIC0xODY0LCAgIDE2ODEsICAtMTAzMywgICAxNDg3LCAgIC03NDksCisgICAzNTYsICAgIC0xMSwgICAgIC0xLCAgIC0zNjYsICAgLTIxNSwgICAxNTMxLCAgICAtMzgsICAgLTkyMiwKKyAgLTM3OCwgICAtMjk2LCAgIDEyNDUsICAxOTk2NywgIC0yMzg5LCAgIC00NTksICAtMzcyOSwgICAtMTYzLAorICA2NTc4LCAgICAzNTQsICAtMTQ3MSwgICAgMTk1LCAgICAzNTMsICAgMTgzMSwgICAtNjA1LCAgLTIyOTEsCisgIC0zNTksICAgIDk0NywgICA4NDA5LCAgIDM0NTQsICAxMjQxNiwgICAyNDM0LCAgIDM0ODUsICAgICA0MCwKKyAgIDM1MCwgICAxNjQwLCAgICA3MzgsICAtOTgyNywgICAgOTM1LCAgIC0xNzEsICAgLTk0NCwgICAxNDA3LAorICAtMzk5LCAgICA1NzEsICAgMjgwNSwgLTEzMTA4LCAgICA3ODQsICAgIDY3OCwgICAyNDA1LCAgICAzMjgsCisgIC00MTcsICAgMTE4OCwgIC0xNTk2LCAgIC02NDksICAtMTM1OCwgIC0xMTMwLCAgICAzNDEsICAgIDIwMiwKKyAtMjQ1OSwgIDExMzA3LCAgLTIyNTAsICAtMzUxOCwgIC0xODEyLCAgIDMzMzgsICAgLTkyNCwgIDEwMDI3LAorICAzMDA0LCAgICA3MDMsICAgLTE4NCwgICAtNjY2LCAgICAyMjMsICAtMTY0NCwgIC03MjIxLCAgIDM1MDcsCisgMTAxMDgsICAgMTMyNCwgICAtNDEyLCAgIC0zNzEsICAgIC05MiwgICAyNDk2LCAgIDMxODIsICAgICAxMCwKKyAxMDI2OSwgICAtOTk4LCAgLTEwMTAsICAgIDYxMCwgICAzMjk2LCAgLTE4NDIsICAgIDQwNywgICAgNDA2LAorIC0xNjA5LCAgIC0xODEsICAgMjIwMiwgICAtNjYyLCAgLTE0NTAsICAgMTM2MCwgICAxNDg4LCAgIC0yMTIsCisgIDE1MDEsICAgLTIxNCwgICAtNTU1LCAgICAxNjgsICAgIDI3NSwgICAgMzAxLCAgIC05NTAsICAgMzI3MiwKKyAgLTMyMywgIDIwNjMyLCAgICAtMjEsICAtMTcyOSwgIDExMDEzLCAgIDIxNDksICAtOTI3OCwgICA2NzM1LAorICAtNTkzLCAgLTczNzQsICAgLTQzMCwgIC0yNzc2LCAgIDIzNDMsICAtMTM3NCwgICAgNTE5LCAgLTQ4NzYsCisgICA4MjcsICAtMjQ3NywgIC0xOTcxLCAgIDEyNDksIC0yMzM4MCwgIC0xODEwLCAgICAxOTksICAgLTc2MSwKKyAgMjE4MiwgICAxNjU0LCAgICA0NDcsICAgLTQ4OCwgIC0xMjE5LCAgICAzNjQsICAgIC01MywgICAtMzgyLAorICAtOTg5LCAgICAxNTQsICAgLTU0NSwgICAtODcyLCAgICA3NzYsICAgLTIxMSwgICA3NzA2LCAgIC03NjcsCisgIDgwMDYsICAgLTEzOCwgICAxOTg5LCAgIC0xODAsICAgIDMwNiwgICAgNDg2LCAgIDExMTIsICAgLTY0OCwKKyAgIC0xMiwgICAxNTM4LCAgIC0zMDAsICAgMjQ1OCwgIC01ODMzLCAgLTExODEsICAtNzY4MCwgIC02NzAwLAorICAtNjIxLCAgIC0zMDgsIC0yOTk5NSwgICAgNjAyLCAgICAtMjQsICAgICA5NCwgICAgNzUyLCAgICA1MTcsCisgICAgODYsICAgLTI0OSwgICAxMDU4LCAgICA3MDQsICAgLTQwNCwgICAtMzg3LCAgICAxMDYsICAgLTYzMiwKKyAgLTE1OSwgICAxMjc1LCAgIC0xOTcsICAtMTI2MywgIC0xMjEwLCAgLTE2ODksIC0xMDQ4OCwgICAxOTUwLAorIC0yMDM3LCAgIDU5NzQsICAtMzk2MCwgICAgIDM4LCAgIDEyODQsICAgMjg1MSwgIC0yODEzLCAgLTE2MTMsCisgLTE2NDYsICAxMDE2NCwgICAgMTM4LCAgLTI5NTYsICAgIDE5NiwgICAtMTE4LCAgIC00ODQsICAgIDg2MCwKKyAgIDEyNCwgICAtMjYyLCAgICAgMzAsICAtMTQ0OCwgICAgMTI4LCAgICAyODcsICAgIDMyNywgICAgNTkwLAorIDI3MjcyLCAgICAzOTEsICAgLTczOCwgIC0xNjMxLCAgIC00ODEsICAtMTUxMSwgICAgIDgyLCAgIC01NzQsCisgIC03MzcsICAgLTYxNCwgICAtNDQ3LCAgICAtODAsICAgIDI5MiwgICAgLTE5LCAgICAyNTIsICAgICAtMiwKKy0yODExNywgICAgMzMyLCAgICAxNDEsICAgMTQ4NSwgICAtMTU0LCAgIDEzODIsICAtMTc1NSwgICAtNDIyLAorIC0xNjkyLCAgLTIxNDQsICAgIDkxMCwgICAxMDA0LCAgIDE4OTQsICAtMTUzNywgICAgODk3LCAgIC00NTgsCisgMTk0ODMsICAtMTMyMSwgICAyMjgwLCAgICA2MjIsICAgIDI4OCwgIC0yMjUzLCAgLTEwMDEsICAgLTk3NiwKKyAgLTQwOCwgICAtMzk0LCAgICAxMzIsICAgLTI1MCwgICAtNDI4LCAgICAtMjIsICAgIDE0MCwgICAgMjg3LAorICAtMTQxLCAgMzA5ODEsICAgLTI5MywgICAgNjMxLCAgICA3MjksICAgICAtMiwgICAtMjMxLCAgIC0xMjcsCisgICAzNzcsICAgLTg3OSwgICAtMjk0LCAgIC0xMDcsICAgIDI1MywgICAtOTY0LCAgIDEyNTgsICAgIDU3MCwKKyAgICA3MSwgICA5NDIxLCAgIDgzNTgsICAgOTI5NSwgICA4MzU0LCAgIC01NDYsICAgMTE1MywgIC0xODA3LAorICAxNTc3LCAgIDI5MTEsICAtMTgwOCwgICAxODA4LCAgLTE2MzEsICAtMTM0OCwgIC02OTc3LCAgIC0zODIsCisgIDE2MjUsICAtMjc5MywgIDEwNjMzLCAgIDE5NzcsICAtMTc5MywgLTEyNDgwLCAgICAgIDEsICAgMjAxMCwKKyAgICAyMywgICAgNDIzLCAgIDExMDIsICAtMTkyMCwgICAtNDc4LCAgIDE4NDUsICAgMTAxNiwgICAgNDY1LAorICAgNzU4LCAgICA4MDAsICAtMTU0MCwgICA1NDQ4LCAtMTA0NzIsICAtMjc0OSwgICAtOTg5LCAgLTYzNjIsCisgIDkyODMsICAgIDM3MywgIC0yNTYwLCAgLTU0NzgsICAtMTYxOCwgICAgIDIwLCAgIC01NjQsICAtMTA3NCwKKyAgNDA3NSwgICAtNDcxLCAgIC01MTUsICAgIDQwOSwgIC0yMDY5LCAgICAzNTksICAgLTc4OCwgLTExNjE4LAorICAyNTI0LCAgICA5MTcsICAgMjc1NywgICAgMjQzLCAgLTMyNjEsICAgNjkyMiwgICA2MjY4LCAgLTMxNDgsCisgLTI4MDQsICAtMzQxMiwgIC00MjYyLCAgLTE5MDMsICAgMTA0MywgLTEyMjU1LCAgIC0xNjIsICAgMTU5OCwKKyAgIDQ5NiwgICAgNDU0LCAgIDE0MDEsICAtMTYzNSwgLTEyNzExLCAgIC02NzMsICAgMzM5MiwgICAxMjU1LAorICAxNjAyLCAgLTEyMDYsICAgLTI5NywgIC0yMDY2LCAgIDMwMDksICAgMTE0OSwgICAxMjg1LCAgLTEzMDcsCisgICA0MTIsICAyNzk3MSwgICAgMTgzLCAgICA1NjksICAgMTMwNCwgICAtNzA2LCAgICA4MjQsICAgLTYzNSwKKyAgLTM1OCwgICAtMzQwLCAgICAtMjgsICAtMTM0NCwgICAgOTU1LCAgICAgMTQsICAgIDY3NiwgICAtMjQzLAorICAgLTIwLCAtMTE5NDcsICAgMTM1MCwgICA4MTIyLCAgICAxOTYsIC0xMDE2MSwgICA0OTI1LCAgLTM3NjQsCisgIDE2NjEsICAgLTQwMSwgICAgMTQ1LCAgICAyNTMsICAgIDY4MCwgICAgNzE4LCAgIC02MTQsICAgLTYxMywKKyAgIDQ5OCwgICAtMjkzLCAgLTQyNTcsICAgLTY4NCwgLTE0ODUzLCAtMTA1MjIsICAgIDY5OCwgICAxNTM3LAorIC0yMDE2LCAgIDExNjIsICAtMjY4NCwgIC0xNTc4LCAgICAgIDgsICAgLTIzOCwgIC0zMjE0LCAgLTI3NDksCisgLTE1NzcsICAtMTE4NywgICAgMTEzLCAgLTE0NTcsICAgMTA2OCwgICAgNTkwLCAgICAgMjUsICAgLTY0NCwKKyAgMTAwMCwgICAyNDMwLCAgLTE2MTIsICAxMzI0NiwgIC0yNjg0LCAgLTE2NDIsICAtNDY0OCwgICAgODE2LAorIC0xMTAzLCAgLTc1NTYsICAgNTc1MywgIC0zOTk4LCAgLTEzMzgsICAgLTc3NiwgIC0xOTU4LCAgLTk2NTIsCisgLTEyODgsICAgLTI5MCwgIC00MjQwLCAgLTI3ODgsICAtODE5MSwgICAxNjI1LCAgIDI1NTgsICAgMTIzOCwKKyAtMTgyNCwgICAgLTM5LCAgLTMxMjksICAtODkxNiwgIC0zMzAyLCAgLTU2MzIsICAtMTc2OCwgICAgODY2LAorICAgNzA4LCAgICA2ODQsICAgMzUzMCwgIC04NzcyLCAgIDE0ODUsICAgIDY3NywgLTEwMzk4LCAgICA2ODYsCisgIC04NTIsICAtNjk3NCwgICA1Mjg2LCAgLTI2NTgsICAgIDYxMiwgICAxMTgwLCAgLTMzNjcsICAgNDI4NSwKKyAgNTcwOCwgICAxNDE2LCAgICAxNjYsICAgMjc4NywgIC0zNjk3LCAgIDE0MzEsICAgMTY0OCwgICA3OTQyLAorICAtNTQ0LCAgLTEwNjQsICAgLTUxNCwgICAtODQwLCAgIC04NzAsICAgMTI0NiwgIC0zNTgyLCAgLTkzMTAsCisgLTM4MDIsICAgNDAyNSwgIC04MjUxLCAgIDU5NzgsICAgIDEzMiwgICAtNjE5LCAgIDI3OTIsICAgOTc4NiwKKyAgMTI0NCwgICAgMjQyLCAgLTE5NDgsICAtNDcwMSwgIC01OTA0LCAgICA5NTEsICAgNzQ4NiwgIC0zNDk0LAorICAgIDQ4LCAgLTQ0NjgsICAtMjQwMywgICA2MDkwLCAgLTIzNDMsICAtNDE3NSwgICAxMzM2LCAgLTI1NDYsCisgIC0yODEsICAgLTczNiwgIC0xNzU4LCAgLTE3MjAsICAxMTA2NiwgICAtOTE4LCAgLTEzNTQsICAgMzg4NSwKKyAgIC0zMywgIC00MTE2LCAgIDEyNDYsICAgLTIxOCwgIC04MDgyLCAgIC03NjYsICAgNzc5NiwgICAxNTA1LAorICAxNTU5LCAgIC05NjQsICAgMTc0MSwgICAtNDU0LCAgLTE2MjgsICAgLTc2MiwgICAzMDM0LCAgIC04MDQsCisgIC04ODgsICAtOTY4MiwgICA5NjAzLCAgLTI1NTYsICAgMjg3NCwgIC01NDU2LCAgIDMwNjYsICAtNzc0NywKKyAgIDk1NiwgICAtNjYwLCAgLTE1MzgsICAgLTM4MSwgICAtNzYwLCAgIDE3NDcsICAgIDU0NywgICAtNTE3LAorICAtNjk3LCAgLTE0MTEsICAgIDQxMCwgICAtNTE0LCAgLTM5ODgsICAgLTIxOSwgIDEzMzU4LCAgLTIzOTMsCisgIC0yODAsICAxMTIzMCwgICAyNjQwLCAgICA3OTUsICAgMjUzNCwgIC04MDk0LCAgLTE4MzgsICAgICA3MSwKKyAgICAxNiwgICAtMjAzLCAgIDQyMjQsICAgIC05NiwgIC0yODI5LCAgIDIwMTAsICAgMTk2MSwgIC0xMzEyLAorIC0xMjY2LCAgIDM5NTIsICAgNjg5NCwgICA2OTk2LCAgLTgwNjIsICAgNDcwOCwgICAxMTkzLCAgLTM0MzksCisgIDE1NDksICAgIDkzNSwgICAgMTcwLCAgICA2MTQsICAgLTg2OCwgICAgIDQzLCAgIC0yNDYsICAgLTE4OCwKKyAgLTk0MCwgICAgMTMwLCAgICAxMjYsICAgLTczNiwgICAgNjk3LCAgIC01MTAsICAgIC01NiwgICAxNTk2Cit9LAorCisuY2IyMjIwbDEgPSB7CistMTM1ODIsICAgMTA0OSwgIDE1NTk2LCAgIC0xMDEsICAgIDcwNywgICAyNjc3LCAgICA1NDIsICAgLTUyMiwKKyAgLTYzNiwgICAgMTk0LCAgLTIzNjEsICAtMTI1MiwgICAgNTI0LCAgICAtMzIsICAgIDIyNywgICAtNDE5LAorICAtNjUyLCAgIC02MDEsICAgICA4NCwgLTEwNDI4LCAgLTE0MTcsICAxMzExNywgICAtNTczLCAgIDM3NzQsCisgLTM2MzIsICAgMjAyNSwgIC0xMjM3LCAgIC02OTIsICAtMTQ4NiwgICAgMTkyLCAgIDEyMjEsICAgIDQ1MiwKKyAgIDQzNiwgICAtNzY0LCAgLTI2MzYsICAgLTE1MywgICAtNjg1LCAgICAxMTgsICAgLTQyNCwgICAtNjM1LAorICAtNDU4LCAgICAyMDksICAgLTU3NywgLTEyMDQyLCAgIDQyNDAsIC0xMDg2MSwgICAgIDQ5LCAgLTE1MzQsCisgIC05OTEsICAtMjQxNiwgICAtMjgwLCAgIDIwOTUsICAtMTg0MSwgICAxMjc4LCAgICAtOTQsICAgLTQyMywKKyAgLTU3MiwgICAtOTQ5LCAgICA3MzQsICAtMTA4NywgIDEyNDQ5LCAgIDY1MTQsICAtNDU4MiwgIC03ODQ1LAorIC0zNzIyLCAgIDE0NDYsICAgMjUzMSwgIC0xMjM4LCAgLTIwNzAsICAgMTUxNSwgIC0xMzMxLCAgIDIzODIsCisgIDEwNjYsICAtMTI5OCwgIC0xMTg5LCAgIDY4MTEsICAtMTg2OCwgIC0xMDgyLCAgLTE3MzIsICAgIDM1NiwKKyAtMjYyMiwgICAgNDkzLCAgLTMzNDUsICAgMTM2NywgICAxNzM3LCAgIDQ0OTcsIC0xNDczNCwgIC0xMzUwLAorICAtMzU0LCAgLTEzNDAsICAgODQ3OCwgIC0xMTUyLCAgIDE4MzIsICAgMTc5MywgICAgODMwLCAgICA5NzQsCistMTM5MTgsICAgIDUyMiwgIC0xNDcyLCAgLTI1MDIsICAtMjYyNSwgICAtMTU3LCAgIC0zNjAsICAgIC0xNywKKyAgLTgzMCwgICAgNjczLCAgICAgMzYsICAtMTMzOSwgLTE0ODYwLCAgICA1MjIsIC0xMzM3NywgICAgODUxLAorICAgOTM3LCAgLTExMDMsICAgIC00NCwgICAgNDA4LCAgIC0zNjQsICAgLTk1MywgICAtMzkyLCAgIDE4MzcsCisgIDIzNDIsICAgMTIzNiwgICAgMTExLCAgIC0yMTgsICAgLTkxOSwgICAgOTg1LCAgMTAwNzcsICAtMTA2NSwKKyAgMTg0MCwgICAtMTI0LCAgIDM3ODAsIC0xMTAxNSwgICAgMjA0LCAgICA0MzcsICAgLTgzMCwgICA2NzEyLAorIC0xNzIwLCAgICAyODgsICAgLTk5MSwgICAxMDk0LCAgIDU2NDcsICAtMTI5NiwgIC0yMjg0LCAgIDE2NDIsCisgIDEwMDAsICAgIC0zNSwgICAtMTE1LCAgICAyMDgsICAgLTI0NCwgIC0xMDk5LCAgIC04MzIsICAtMjA5MiwKKyAgIDgwMiwgICAtMTYzLCAgIDMzNDMsICAgLTk2NCwgICAgMzE0LCAgICAxMjYsICAtMTIwNCwgICAgNzU0LAorLTE3ODM4LCAgIC04MjYsICAgNDQxNCwgICA4MzMxLCAgIC03NzAsICAgMTI0NiwgIC0zNTAwLCAgIDE2ODAsCisgICA4MzMsICAgLTEwOCwgICAgNDk0LCAgIC05MTAsICAtNjMxNCwgIC0yODMyLCAgIDI1NTMsICAtNjIzMCwKKyAgMTE2NSwgICAzNjMxLCAgLTE3MTcsICAgMjQwNCwgLTMyNzY4LCAgICA1MjAsICAgIC0zOCwgICAxMjI4LAorICAtNzA4LCAgICAgNTgsICAgIDI2MCwgICAgNzcxLCAgICA1ODgsICAgLTQ0OCwgICAgMzg5LCAgICAxNTYsCisgICA2MDYsICAgLTgzMCwgICAgNDAwLCAgIC00ODgsICAgLTE4OCwgICAgNTM2LCAgLTE0MjgsICAxMTk4MiwKKyAgLTE1NiwgIC0xNDA3LCAgIDE3OTYsICAgMTAzNiwgICAgOTA1LCAgIDEzNzEsICAtMTQ3MiwgICAgMzI1LAorICAzMDk4LCAgLTE0MzYsICAgNjQ0OSwgICAyMTA1LCAtMTExODMsICAgMTYzMiwgIC0xODQ4LCAgIDEwMTksCisgIDEyNDcsICAgMTMwOCwgIC0xMzUxLCAgIC04MjMsICAgMTY3OSwgICAtNjUxLCAgICA5NzgsICAgIDI5NiwKKyAgMTA4OCwgICAzOTY1LCAgLTE0MTQsIC0xMTgzOCwgICAgMTM5LCAgIDg2NjQsICAtMzQ1MiwgIC0xODA0LAorICAzMDg4LCAgLTIwNDQsICAgLTIyMSwgIC0xMzQ3LCAgIDEyMzIsICAgLTkwOSwgIC0xMzIzLCAgLTE0MDksCisgIDEzOTksICAgMjU1NywgIDE0NTUyLCAgIDE1MzUsICAtNTA4OCwgICAxNjk5LCAgIDEwMTIsICAgMzMzMywKKyAgMzk0MCwgICAyMjk0LCAgIDExODksICAtMjI1NiwgICAtNDg0LCAgLTMzMDcsICAtMTMzMywgICAgNDY0LAorICAtMzA1LCAgIC03NDQsICAgIC0yNCwgLTIwNDY0LCAgICAzMzIsICAgMjk2OCwgICAgMzA4LCAgIC02NDksCisgICAyOTIsICAgLTQwMiwgICAxMjI2LCAgLTI1NzUsICAtMTUwNSwgICAtMTAwLCAgIDE0MTMsICAgIDczMywKKyAtMTAyNCwgICAgNjE2LCAgIC0xMjEsICAgLTMyMiwgICAgIDY3LCAgIC0xNjEsICAgLTcwOCwgICAgMjUxLAorICAgNDYyLCAtMjY2OTcsICAtMTExMiwgIC0xMzgxLCAgIC0zMjQsICAgLTI4NiwgICAxMDkxLCAgICA2NjIsCisgMTU4MzAsICAxMzEyNCwgIC0xMDQ5LCAgLTE4MTYsICAgLTM1NSwgICAxODQ4LCAgIC04MDEsICAtMTcxMCwKKyAgMjUxMywgICAgNDU4LCAgIC03OTgsICAgIDM4NiwgICAtNzI2LCAgIC0zNTYsICAtMTI0MCwgIC0xMTMzLAorICAtMzg4LCAgICA2MzEsICAgICA5MSwgICAxODY3LCAgIDI1MTEsICAgLTMwNiwgICAzMDk3LCAgMTQzOTksCisgIC01NzEsICAgMjE5MSwgIC0yOTE2LCAgIDI4NTAsICAgIDc2MSwgIC0yNDQyLCAgICA2OTgsICAtMjE5MywKKyAtMjczOSwgIC0xOTE0LCAgLTQwNzcsICAtNDYzMSwgIDEyNzAyLCAgICAzMzMsICAgMTE2MiwgIC02MjQ4LAorLTEyNDY2LCAgIC0zMTAsICAgLTEwNywgIC0yNDY1LCAgIC0xNjMsICAgMTk3MCwgICAtOTk4LCAgLTEyNTMsCisgIDIwMDcsICAgICA3OSwgICAtNDI2LCAgIC0yNzYsICAgIDM2NSwgICAgNTY4LCAgIC01MjAsICAyMzY0MiwKKyAgIDI3NiwgICAxMDU5LCAgICAxODQsICAgMTA4MSwgICAgNjUwLCAgIDIyODYsICAgLTE5MSwgICAgODgzLAorIC0xOTQ2LCAgICAyNDYsICAgICA2NCwgICAtMjI1LCAgICA4MDAsICAgIDkxMCwgICAtMTM2LCAgIDExODcsCisgICA5NTUsIC0xNTYwNCwgIDEyODQ3LCAgIC03NDcsICAgIDg3NCwgICAgNTA2LCAgIC02NDYsICAgMTkyMCwKKyAgLTQ0OSwgICAtMzIxLCAgIDExNTIsICAgMTM0MSwgICAxNjUzLCAgICAzNDEsICAgIC0zMiwgICAgOTA3LAorICAgNjczLCAgIDEwNDUsICAgMTI0NSwgICAtNDk5LCAtMTAzMzEsICAgNDY4MywgIC0xMTIxLCAgLTMxNjQsCisgIDMzODIsICAgNjM5NywgIC0xMzQxLCAgIC03NjksICAgMTE4NiwgICAgMjI5LCAgLTEzNTQsICAtNzM3MCwKKyAgIDE1NSwgICAxODU4LCAgIDU2MTcsICAtMzQ4NywgICAtMjQ3LCAgIC03ODMsICAgIDcyNCwgICAgNTA4LAorIDE0MDI5LCAgIC01MjgsICAgMTg1MywgICAxNTcyLCAgICA1ODAsICAgLTcwOCwgICAgNTI4LCAgLTEzOTQsCisgIDg5MjIsICAgMjI4NCwgICAgNTUwLCAgIDMwODQsICAtMTcyNiwgIC0zMjM1LCAgIC03MDAsICAgNzEzMiwKKyAtMzU0MCwgICAtMjAwLCAgIDMyODgsICAgLTgxNSwgIC0yMTg5LCAgIDEyMzIsICAgMjQxMiwgICAyMDg4LAorIC0xMTAxLCAgMTI1OTIsICAgIDgwNiwgICAxNTA4LCAgIDE3NDEsICAgICAxMywgICAxMTI0LCAgLTM4ODMsCisgIC02ODcsICAtODE4MCwgIC0zMDk0LCAgLTMzNDYsICAgMTc4MSwgIDExODM2LCAgIC02NTcsICAtMzQ2OSwKKyAgMTQyOSwgIC0xODIyLCAgLTM0MzMsICAgICA4NywgICAzODcxLCAgICA2NTEsICAgLTk2NSwgIC0xNzU3LAorICA2Nzc4LCAgICAxMDksICAgIDExMiwgICAtMTMxLCAgICA3MTAsICAxMTk0MywgLTEyMTA3LCAgLTM0NjAsCisgIC03MjYsICAgMTAwMiwgIC0zODAzLCAgICA1ODAsICAgMjc1NiwgIC0xMjkzLCAgICAxMTYsICAgIDQ1NywKKyAgIDU4MSwgICAzODM0LCAgLTE2NzgsICAgLTk3NywgICAxMjQyLCAgLTIwNDAsICAgIDIzMiwgLTEwMDM0LAorICAxNjQ0LCAgLTIyOTAsICAgMTM2OCwgICAgMTcyLCAgLTMwMTIsICAgMTQyMywgIC0yNjIwLCAgIDM2MDgsCistMTA4MzEsICAgLTMwMywgIC0xNjEwLCAgIDMyNDYsICAgIDU2MiwgICA1MjEyLCAgICA0NDgsICAgLTg3NywKKyAgIDk1NCwgICAgNjg4LCAgLTg5ODEsICAgIDU3OSwgICAgNzE3LCAgIDEzMTUsICAgLTk1MiwgICA2ODE3LAorICAgNjYyLCAgIDMyMTgsICAgNzIxMywgIC0yMTE2LCAgMTA0NDYsICAgMTAxMiwgICAyMjcwLCAgIC04NTgsCisgICAgMTAsICAtMTA2NiwgIDEwNjE4LCAgIDYxMDgsICAgLTU0NywgICAzMjIxLCAgIC04OTMsICAgMzg4OCwKKyAtMTA4OCwgLTEwMDg1LCAgIC0yNDcsICAgMTA2NCwgIC0zNTAwLCAgIDMxMjMsICAtMjQ4MCwgIC0yMTI4LAorICAyNzg4LCAgLTIyNTMsICAtOTc1NiwgICAtNDcyLCAgIC0xNjYsICAgLTY4MCwgICAgNzI3LCAgICAgNzQsCistMTQxNTEsICAgLTE4OSwgIC0xNzM0LCAgICA2MTAsICAtMTE2OSwgICAgODQ1LCAgICAgOTQsICAgLTc4NiwKKyAgIDM5NCwgICAtNTgxLCAgICA1MDAsICAgMTk4MSwgLTEwOTQwLCAgICAzNTQsICAgIDUwMCwgICAgMzk5LAorIC0xOTUyLCAgIC0zNzMsICAgMjE5NywgIC00NzEyLCAgLTI1ODIsICAgMjc1MSwgICAgNjU0LCAgICA2MTMsCisgLTEyNTQsICAgMTQwNiwgICAyMDU2LCAtMTI1MTgsICAgMTU4MywgICAtNTgyLCAgIDQ4MzQsICAtMTU0MSwKKyAgIDUwOCwgLTIwNTgwLCAgICAyNzAsICAgMTIxNCwgICAgNTE1LCAgLTEwODIsICAgICAgNSwgICAgICA3LAorICAtNTMzLCAgICAtMjgsICAgMTI3MCwgIC0xMzA3LCAgICA0OTcsICAgIC01NywgICAtMzMxLCAgICA5MzMsCisgICAgOTIsICAgLTg1NiwgLTEwNDU4LCAgLTQ1NzYsICAtOTk5MSwgICAyNDI2LCAgIDY1NTIsICAtMzAyMiwKKyAgIDI3OSwgICAtNTYyLCAgIC0xOTIsICAgMTg3OCwgIC0yMjM3LCAgIDQ5NzgsICAtMTc1MywgICAgMzMyLAorIC0xNDYyLCAgIC04NTMsICAgIDIzOCwgICAgNDc4LCAgIDk3NDYsICAtNzM4NSwgLTEwMjkwLCAgLTgyNzgsCisgICA0NTcsICAgMzEyMSwgICAgODQxLCAgICAgNDgsICAtMzc0NSwgIC0xMjk4LCAgIC02MzcsICAtMTgyMCwKKyAgLTQ2OCwgICAtMjQ4LCAgIDE0MDAsICAgIDM5NCwgICAtMTI1LCAgIC05NTAsICAxMTUyNCwgIC0xODYwLAorICAgNDI2LCAgIC03NzMsICAxMjY2OSwgIC0xNjIwLCAgIC0xNTgsICAgMTYyNSwgICAxMDQ1LCAgICA3NjgsCisgICAtNjYsICAgIC0xMiwgICAxNjI1LCAgIC03NzAsICAgIDU1OSwgICAgIDU0LCAgICA1OTMsICAxNDQ2OCwKKyAxNDk5NCwgICAgNDkwLCAgICA1NDMsICAgLTgxMSwgICAgNzAwLCAgIC0yNzcsICAgIDkwMCwgICAtMTc4LAorIC0yMDAwLCAgICA0NzUsICAgIDI0MSwgICAgOTUwLCAgICAxMDYsICAtMTI2MCwgICAgODc0LCAgIC04NjIsCisgMTg5MDcsICAtMTk0NywgICAtODQ0LCAgICAyMDUsICAgMTI1MywgICAgLTgzLCAgIDE5NjYsICAgMjMwMCwKKyAtMjY5NCwgICAgODUyLCAgIDI0NTAsICAgIDY2MSwgICAtMzM0LCAgIC01MTgsICAtMTEzNiwgIC0yMzc3LAorICAgMzI1LCAgIDExNTIsICAgIDUxMSwgICAgODgxLCAtMjIyMDUsICAgIDg5OCwgICAgNTc0LCAgIC01ODIsCisgIC0yNjUsICAtMTM2MiwgICAtMjUzLCAgICAtNDAsICAgLTc4MCwgIC0xOTY3LCAgICA0NjksICAgMTQ4NCwKKyAgLTgxOCwgICAtOTI2LCAgICA5NTgsICAgLTQxNSwgIC03OTM0LCAgIC0zMzAsICAgIDMzMCwgICAxNDM5LAorICAxNjQzLCAgICAgNzcsICAgMTAzNCwgICAtMTU2LCAtMTIwOTQsICAgMzc4MiwgIC01NzI1LCAgIC01MjAsCisgIC01OTgsICAgMjM0NSwgICAzNTA2LCAgIDUzMzMsICAgLTMyMiwgICAgIDk5LCAgICAtNDgsICAgMTQ5MCwKKyAgICAyMCwgIDExMzkzLCAgIDM0NjgsICAtMTE0NCwgICA3MDEzLCAgLTM3MjgsICAgNzE0NSwgICAxNDMyLAorICAxODEwLCAgICAgMjYsICAgLTkxMiwgIC02NTMwLCAgLTEwNzksICAgMTc3MSwgICAgIDk1LCAgIDQwMDcsCistMTEzNDYsICAgIC00MywgICAgMjQ5LCAtMTQ2MTYsICAgLTI0OSwgICAgICAxLCAgIC03MjUsICAgIDI0NCwKKyAgMTA1MywgICAxODE1LCAgIC02MjYsICAgIDQwOCwgICAtMzQ0LCAgIDE5NzIsICAgMjIyMiwgICAyMjg4LAorIC0yMzI0LCAgIC00MTEsICAtMzk5MywgICAgNDk0LCAgIC03MDYsICAtNTA3OCwgLTExNjk1LCAgLTM2NDUsCisgLTIwOTAsICAgMjQ2NSwgICA1ODkzLCAgLTUwOTYsICAgNjgxNSwgICAtNTM3LCAgIDUwMDMsICAgMTI1OCwKKyAgIDE4NSwgIC0xNTU1LCAgIC04NzUsICAtMjA0NywgICAtMTcwLCAgIC00MzMsICAgLTE5NCwgIC0xMDIwLAorICAgMzQ5LCAgIC03MjQsIC0zMTgxMSwgICAgMTk3LCAgICAyNTEsICAgLTQxOCwgICAtMjIyLCAgIC02MTgsCisgICAyNzgsICAgIDU1NCwgICAgMzYzLCAgICAxODMsICAgLTg5OCwgICAgIDE0LCAgICAzNTAsICAgIDc0NSwKKyAtMjA1NCwgIC0xNjIzLCAgICA4MDYsICAgLTc3MCwgIC0xMjQ2LCAgIDE1OTQsICAgIC01NCwgLTE4NTAxLAorICAxNTE2LCAgICA4NDAsICAgIC04NiwgICAgNDg0LCAgICA1MTQsICAgMTIwOSwgICAgOTc4LCAgICA1NjQsCisgIC01MzcsICAgICAzNCwgICAtNDMxLCAgICAxMjgsICAgIDkzOCwgIC0xODA3LCAgICA4MzIsICAgIC05MCwKKy0yOTUwOSwgICAtNjQyLCAgIDEzOTcsICAgIC01MiwgICAgNTIzLCAgIC0zOTMsICAgIDIxNiwgICAgOTA4LAorICAgICA5LCAgICAtNjMsICAgIDcxMCwgICAtOTQ5LCAgICAgIDMsICAgLTE4NCwgICAgMTc1LCAgICA2MTMsCisgIC02ODcsICAgLTQwOCwgICAgIDI3LCAgIC04NTUsICAxODI1OCwgICAxMjgyLCAgIC05NDgsICAgLTIxOSwKKyAgMjM3NCwgICAxNjY4LCAgLTQ1NjcsICAgMTA2MywgIC0yMDQ1LCAgMTIwMjYsICAgIDQ2MSwgICAzMDc0LAorICAxMDUwLCAgLTE3ODgsICAgIDE2OSwgLTEzNDQyLCAgICA2MTIsICAgICAxOSwgIC0yMDE5LCAgICA2ODUsCisgICA0NTIsICAgLTE1MiwgICAgMjk5LCAgICAzMTAsICAtMjMyNywgICAgMzQ4LCAgIC0yMTUsICAgMTYzNCwKKyAgLTIwMSwgICAyMTYyLCAtMTAzMDAsICAxMjQ1MiwgIC0zNzMzLCAgIC00MjAsICAgMjM4OCwgICAgNTE4LAorIC0yMzA4LCAgIC0xNjAsICAgMTU1MiwgICAzMzQ3LCAgIDE2NTAsICAgMzI5MywgIC0xMTA4LCAgIDIwNjUsCistMTI2MTgsICAgICAyMCwgICAgLTQyLCAgIC02NDMsICAgIDIwMiwgIC0xMjk4LCAgICAyNTEsICAgMjQ4OSwKKyAgMTMyMiwgICAyMzYyLCAgIDM2OTgsICAgLTE5MCwgICAgNTkyLCAtMTI0ODQsICAgLTkzNywgICAyMDcyLAorICAxNTMxLCAgICAzMDIsICAgLTQwOSwgICAtODk5LCAgLTEwMTYsICAgLTM4OCwgICAxMTAzLCAgMzAwMDYsCisgICA3ODksICAtMTYwOSwgICAtNTQ4LCAgLTEwMDIsICAgMTA1NSwgICAgNjA1LCAgIC05NTUsICAgMTU1NywKKyAgIDQ1MiwgICAtNjIzLCAgICA4MTAsICAgIDU5NywgICAtNjk2LCAgMTA2MjgsICAtMTE3NCwgICAgNjA2LAorICAyNjI4LCAgIC01NTMsICAtMjI5NywgICA2NjY4LCAgLTI2MDAsICAgIDc4NywgICAzNTA0LCAgLTM2MDYsCisgIDQwODcsICAgMTA1MiwgICA2Mjc2LCAgLTc2MTksICAgIDMzNywgICAyNTY1LCAgICAtMTMsICAgMTIwNSwKKyAgLTEyNCwgICAxMjIyLCAtMjgwODIsICAgIC03OSwgICAtNTUzLCAgICA2MjgsICAgIDU0MiwgICAxMzE1LAorICAtNjA5LCAgICAzMjIsICAgLTg5NSwgICAtMzc3LCAgIC02OTQsICAgIDYxMCwgICAgMjM5LCAgIC0xNTIsCisgLTI5MDEsICAgOTg5MCwgICAgNzE2LCAgIDEwMzAsICAtMzMwNiwgICAgOTg4LCAgIC03MzgsICAgIDU2MiwKKyAtMjIwOSwgIC0xNjc2LCAgIDQ1MDcsICAgMTE2NSwgLTEyOTI0LCAgICA4NjYsICAgLTE1NCwgICAzNjY0LAorICAtMzY3LCAgLTI1ODAsICAtNzI4NiwgICAtNTcyLCAgIDIxNjcsICAgIDExOCwgICAgNTA4LCAgLTQ0MjksCisgIC00ODAsICAgIDg0MiwgICAyNDg5LCAgLTE2MzYsICAtMjA0MiwgICAxMTI1LCAgIDE4NDcsICAgMjU4NiwKKyAtNTYzOSwgICAzMzYxLCAgIC03NjAsICAxMTE4OSwgICAgNjIzLCAgIC0yODIsICAgMTM1MywgICAtMjc5LAorICAgNTE1LCAgIC04MTYsICAgIDcxMywgICAgMzIyLCAgICA0MTcsICAtMjgyMCwgIC0xMTE0LCAgLTE1NjMsCisgICA0MDEsIC0yMTYwNCwgIC0xMzAwLCAgIC05NzIsICAtMjI5OCwgICAtNDgzLCAgIDIxNzYsICAgLTgzMCwKKyAgMjEzNSwgIC00MDg0LCAgIDEwOTUsICAgMTk1MCwgIC0xOTM3LCAgICA1MzksICAgLTM3NCwgICAzMTk3LAorICAgNjgyLCAgICA0NzIsICAtMTM2OCwgIC04MDk1LCAtMTIwMjYsICAgNDgzMywgICA1NTg2LCAgICA0NjcsCisgIDI0MDAsICAgIDE0OCwgICAgMzgxLCAgIC0xMzgsICAgIDk1NCwgICAtNDU5LCAgIC03MjQsICAgIDk3MCwKKyAgIDE1NiwgIC0xOTU1LCAgLTEzNjMsICAgIDU2MCwgICAtNzYxLCAgLTE3MDgsICAtMTU5OSwgLTE3NDA4LAorIC0xMDY0LCAgLTEzNzIsICAgLTUwMCwgICAxMTYwLCAgICA3MzUsICAgIDQ0MSwgICAtNzczLCAgIC0yMjgsCisgICA0MjAsICAtMTEyOCwgICAgMjYwLCAgICA5MzAsICAxMjg3OSwgICAtOTI2LCAgIC0yMzEsICAgMTM1NSwKKyAgLTg1MCwgICAgNTU5LCAgMTEzNzcsICAtMTcyOSwgICAyNDc4LCAgICA5NjEsICAgIDMzNiwgICAxMDU2LAorICA1MDgxLCAgIDk3ODgsICAgLTU1NSwgICA0MDY3LCAgIDg2NjQsICAtMjcyMCwgIC0xNDYyLCAgIDMwMTIsCisgLTcyODAsICAgIDk2NSwgICAxNDYyLCAgLTQ3MDMsICAgMzY0OSwgICAyMDg0LCAgIC02OTksICAgLTI2MiwKKyAgIDQwOCwgICAtMTg4LCAgIDIxOTMsICAtMjIxNiwgIC00NTA5LCAgIC03MzYsICAtMTAzOSwgIC00ODQ4LAorIC04MjQzLCAgLTc5NTgsICAgLTE3MiwgIC0xMzE4LCAgIDk1NjYsICAgNDY2NSwgICAzMzYzLCAgLTM2NzIsCisgIDE1ODEsICAgLTU1MSwgIC0yMDI0LCAgIDE2MzAsICAgMTU0MywgICAgIDkwLCAgLTE3MjgsICAgLTc5MiwKKyAtMTc5OSwgICAyNTcxLCAgICAgODAsICAgLTQxMiwgICAtMzAxLCAgLTI4NzAsICAgMTc5NiwgIC01MzI3LAorICAgMTExLCAgMTczNDIsICAgIDU5MiwgIC0yMTA4LCAgICA0NzcsICAgMTU0MSwgICAxMjY2LCAgLTEwNjIsCisgIC0yMTUsICAtMjIxMCwgICAgMjIzLCAgIDEyMTUsICAgLTE5NywgICAgIDg3LCAtMTgzNDAsICAgIC02NywKKyAgIDgwNCwgICAtMzk4LCAgIC0xMTgsICAtMzQ1NywgICAtNzQxLCAgLTE5MzUsICAgLTcwNCwgICAtMjc0LAorICAgNTY2LCAgIC04NzIsICAtMTgyMSwgIDEyODc0LCAgIDUwNTcsICAgMjA2OSwgICAxNzQyLCAgLTYyMDUsCisgLTYxMTUsICAtMTYxNCwgICAtMjk0LCAgICAxODcsICAtNTIxMCwgICAxNzM0LCAgLTE0NjYsICAtMjE2MiwKKyAtMjI2NiwgICAtNjQyLCAgIC0xNDgsICAgIDQ0MCwgICAgICAyLCAgICAyMzMsICAgLTMxOSwgICAtNjM3LAorICAtNzM0LCAgIC0yMzAsICAgIDMwMSwgICAgNTA4LCAgIC00MzMsICAgIDMxMSwgICAtMzEzLCAgLTEyMDYKK30sCisKKy5jYjIyMjBzMCA9IHsKKy0xNTExOSwgICA3NTA4LCAgIDEzMzcsICAgNDE4MiwgIC0yOTE0LCAgLTM3MzMsICAgMjY4NiwgICAtNDcwLAorICAyMjQ5LCAgLTM5MDEsICAgMTQ0NCwgICAzODA1LCAgICAgOTksICAtMTc3MSwgICAtMzU0LCAgIC05MDMsCisgLTI3NTUsICAgLTcwOSwgIC00OTgwLCAgICAyMTQsICAtMjc1MCwgICAtNjUyLCAgLTEwNDIsICAgMTQzNCwKKyAtMTA5MCwgICAtNjEyLCAgLTI1NzQsICAgMTI3NCwgICAxMzEwLCAgIC03NjAsICAgMTQyMCwgICAtMTEyLAorICAyNzc2LCAgLTQ4NDMsICAxNTA2MCwgIC00OTI5LCAgLTM5NDIsICAtNTcyMSwgIC0xNjI4LCAgLTExNDIsCisgIDMwMjMsICAtMTQzNSwgICAxNDAyLCAgIDEwMTAsICAgIDYyMywgIC0zNTI3LCAgIDI2MjQsICAgIDE4NCwKKyAgIDk4OCwgICAgIDk4LCAgICAzNDAsICAxNjY3NiwgIC0xMjYyLCAgLTExNjIsICAgMzE4MywgIC00ODE2LAorICAtNTkyLCAgIDEwMTksICAtMTQwNiwgIC0yNDc4LCAgIDIzNzEsICAtMTAwNCwgICAzOTQ0LCAgICA4MDMsCisgIDU2NjUsICAtMjI2MSwgIDE2NDI3LCAgICAzNDksICAgMzExMywgICAtOTE2LCAgICA0NDIsICAtMTc1NCwKKyAtMzU1MSwgIC0xMzUxLCAgIDE1NjMsICAtMTMxNiwgICAgNTMyLCAgICAzNDMsICAgLTM5MiwgICAxNTA5LAorICAtNzE3LCAgIC0xMjIsICAgMjQ2MiwgICAtOTI5LCAgIC0xODUsICAgLTY4MywgLTE4NzgwLCAgIDI2ODIsCisgIC0xMjMsICAgIDUxOCwgICAtMzc5LCAgLTUxNjAsICAgIDI0NSwgICAxOTQwLCAgMTM5NjQsIC0xMjMxMSwKKyAgIDU5MCwgICAgLTMwLCAgICAxNTksICAtMTU1OCwgIC0xOTQwLCAgICAgMzYsICAtMTUyOCwgICAtNTE1LAorIC0xMTc4LCAgICA4NTYsICAgLTM5NSwgICAgIDI5LCAgLTU4NTQsIC0xMjk0MywgIDEzMjg2LCAgLTI1NzIsCisgIDEwNDksICAgIDc2OCwgICAzMjkyLCAgLTM5MjEsICAgIC01MiwgICAtNDYyLCAgIDE5NjgsICAgNDkzMywKKyAgIDYzMCwgICAgOTMwLCAgIDEwMjYsICAgMjYwNiwgICAgMzE5LCAgIC0yNzcsICAgNjMzMywgIC0yMTE5LAorIC00NzAwLCAgIDIxNjQsICAgMTU4MywgICAgMTU0LCAgIDIxMDcsICAtMTQ2NywgICAgMzM5LCAgICA2MzQsCistMTcyNDAsICAgLTU5NSwgIC0zNTI1LCAgLTI2OTAsICAtMTc4OCwgICAtNDc2LCAgICAtNDEsICAgIDE2NSwKKyAtMTAxNiwgIC0xNDU2LCAgIC0zNDgsICAxMTI4OSwgIC0yOTIwLCAgLTM4MDQsICAgMjM1NywgIDEyMDEyLAorICAzODQ4LCAgIDE3OTYsICAgMjE2NCwgIC01NTU1LCAgIDQ1MjcsICAgLTIwMSwgICAgOTY1LCAgLTQ4OTMsCisgIDM0MTksICAgNjQ0MSwgICAxNjkxLCAgICAtNzcsICAgIDM0OCwgICAtNzY5LCAgMjczMTksICAgLTM0NSwKKyAgLTMzNiwgICAtNTQxLCAgIC0zMjAsICAgIDk3MiwgICAgOTI2LCAgLTEwMjYsICAgMTA1MiwgICAgNzAyLAorICAgMjI0LCAgICAgNzYsICAgIDc0MiwgICAgMjIwLCAgIDYyOTIsICAgODYyNSwgIC0zNzQyLCAgIDQxMzksCisgLTU5ODksICAtNTYxNSwgICAtNjQxLCAgIC0yMzEsICAgLTgzNywgICA2MTU2LCAgIDQxNDEsICAgMzc5MiwKKyAgNDc0NiwgICA5OTcyLCAgIDE4MDAsICAgLTM5NywgIC0yMjM3LCAgLTIyMTgsICAtNzU5NSwgIC0yNzYxLAorICAtNDk2LCAgLTE0NTEsICAgMTE3OCwgICAtOTcwLCAgLTEyMjYsICAgMjUyNywgIC0yMTA1LCAgIDE3NzgsCisgIDE0NDYsICAgMTk4NiwgICA5OTcwLCAtMTMxMDcsICAgLTk4NSwgIC0xMTQyLCAgLTEzNjcsICAgLTMyOSwKKyAtNDQ5OCwgICAgNTkwLCAgICAgMzYsICAgMjA3MywgIC0xMDY5LCAgICA4NjIsICAgIDEzMywgICAyNTE2LAorICAgLTI3LCAgIDQ0OTQsIC0xMTYwMiwgIC0xNjM4LCAgIDI1MjQsICAgMTQ0OSwgICA1Njg0LCAgIC02MTEsCisgLTk0NTIsICAtMjYxOCwgICA1MDA2LCAgIDM0ODEsICAgLTYzOSwgICAgMzc5LCAgLTIzMzMsICAgLTQ5OCwKKyAgLTcxMywgICAgMzgyLCAgICA3ODQsICAgIDI2OSwgIC01NjkyLCAgIC0zNTAsICAgIDUyNCwgLTE4NzA1LAorIC0xMDQyLCAgLTEzNDksICAgMTIxMCwgICAxNzcwLCAgIDM5NjQsICAgNDkwOCwgIC0xMTMxLCAgMTc1MzUsCisgIC03ODgsICAtMTg5NiwgICAgIDMwLCAgLTI2ODIsICAgMTA0NCwgICAxNjA0LCAgLTM3NDAsICAgICAxOCwKKyAgMTc3MSwgICAgMzMxLCAgIDQyNzksICAgMjYzNCwgICAtMzY4LCAgIC00NDcsICAtNjk5NSwgIC0xMjI0LAorICAtNjg4LCAgLTUzNjgsICAgLTIzNiwgIC04ODcyLCAgIDI0NDksIC0xMjE4OSwgICA0NDY1LCAgIDE4OTUsCisgIDI0ODQsICAgMTMxNSwgIC01NDQ2LCAgIC00NTcsICAgLTU3NSwgICAgMTAxLCAgIDIzNTYsICAtMTU4NSwKKyAgMzIwNCwgICAtMTA0LCAgLTcyNDQsICAtMTY3OCwgICAtODAxLCAgLTI2MjAsICAtNDYwMywgLTExODc2LAorIC0xNzg3LCAgIDI5NjIsICAtMTc5NiwgIC0zMzg1LCAgIC00MTEsICAgNTc5NiwgICAyOTAwLCAgIC01NjIsCisgICA4MzUsICAgIDI5MywgICA3MTI3LCAgIDQ5MzksICAgIDcyMSwgIC0yOTcyLCAgIC00ODIsICAgIDEyMSwKKyAtMjY5NCwgIC0yMjc3LCAgICA0MTIsICAxMjc3MCwgICAtMzQyLCAgICA3MTgsICAgMzMwNiwgICAgNTAyLAorIC03MjgxLCAgIC0zMDcsICAgIDU1MiwgICA3MTU4LCAgIDMyODksICAtNTA1MSwgICA1MjMwLCAgLTExODUsCisgIDMwMjQsICAgLTk0MiwgIC0xMzQ3LCAgIC0yODMsIC0xMzkzNywgICAtMjA4LCAgIDI1NzYsICAgLTkwNiwKKyAgMTg0OCwgICA1NjkyLCAgLTI0MzQsICAgIDE3NSwgICA3ODM3LCAgIDE4NzIsICAtNDUzNiwgIC0zMzQxLAorICAtOTU3LCAgMTQ3ODcsICAtMTU5OCwgICA5MDU4LCAgIDM3NzYsICAgIDQwNywgIC0xNzM0LCAgIDEyNTksCisgLTMwMTEsICAgLTEzMSwgIC0zNTg5LCAgIC02MTQsICAgIDI3MiwgIC0yOTY4LCAgLTE2MTEsICAgMzY0NSwKKyAtODEyNiwgICAyMTIwLCAgIDQ4NjgsICAtNTQ2MiwgLTEzMjM1LCAgLTM0NTIsICAtNjA3NywgICA1MDY0LAorIC0xNTkzLCAgLTEzOTUsICAtMjQyNywgIC0xMTM5LCAgIC05NTgsICAgMTU4NSwgIC0xMzMwLCAgIDIxNzgsCisgIC03NzgsICAgMzU0NSwgICAyODM2LCAgIDc3MTIsICAgNTk5MywgICAtNDMyLCAgIDM1NzUsICAgIDkyOSwKKyAtNzk1MSwgICAgMTE1LCAgIDIxODAsICAgMzkwNCwgICAtMTkzLCAgIDE1NTYsICAgLTI1MiwgICAtOTEzLAorICAyNTc0LCAgMTE5NDgsICAtNDUyNSwgICAxMzkxLCAgLTg1MTMsICAgNDU0MCwgLTEyODE1LCAgLTMzNzksCisgLTQ2NzYsICAgMTgzOCwgIC01Njc2LCAgIDEzMjEsICAtNjE2OCwgICAxMzk3LCAgIDEwMjAsICAgIDQzOCwKKyAgLTE0MSwgICAzNDI0LCAgICAzOTIsICAgLTUxMiwgIC0xNjE0LCAgLTEzOTYsICAgLTMxOCwgIC0yNDUxLAorICAxNTQ1LCAgLTcxMzIsICAtMTc2MywgICAtNDI0LCAgIDM1NzUsICAgLTgyOCwgIDE5MjE2LCAgIDE5NzgsCisgIDE2MjQsICAtMTk2OSwgIC0xNjY3LCAgIC03NzIsICAtMjAzMSwgICAtNzgxLCAgIDE3MzIsICAgIDI0NCwKKyAgLTIxMiwgICAgNDE2LCAgICA5MDAsICAtODk2MCwgICAxMDAyLCAgLTEwNzcsICAgNDY2NywgIC0zNTI3LAorICAxNTg2LCAtMTMxMDksICAtMjQ0MiwgICAzODI5LCAgIDQzNTgsICAgMTA1NiwgICAyOTYwLCAgLTEwODcsCisgIC02NjIsICAgNDc3NSwgIC02MzE2LCAgIDYxNTcsICAtMzczNiwgIC0yMDQwLCAgIC0xODcsICAgIDkwNCwKKyAgMTI1NCwgICAtNjM2LCAgIDIwMzIsICAgLTczNCwgIC0xMjcxLCAgLTI2OTEsICAgMzM3NiwgICAgNTY0LAorIC03NzY5LCAgLTU0ODIsICAgIDg0MCwgIDE0MTcxLCAgLTU4MjgsICAgLTk2NiwgICAxNjg1LCAtMTAxOTIsCisgIC0zODgsICAgLTQzNCwgICAzNzA2LCAgICA1OTQsICAgMjE4OCwgICAgMzY1LCAgICAyMDksICAgIDI5OCwKKyAgMTgyNSwgICAtMjM2LCAgMTI3NjIsICAgMTY0NCwgICAzMTk5LCAgIC00NjgsICAxMjg3NiwgICAgMTMwLAorIC0yMTY5LCAgLTM0MDYsICAtMzU3MSwgIC00NjU1LCAgIDIzMzksICAxMDc1NywgICAxMjkyLCAgIDI5MjAsCisgICAyODksICAgLTMxNCwgICAtNTkxLCAgLTE2MzEsICAtMTc3OCwgIC0xMjk2LCAgIC0yNTQsICAgIDQ2OSwKKyAtOTQwOCwgICAxMTU0LCAgICAzMzQsICAgICAtNCwgIC0xOTIyLCAgIDI3ODcsICAgIDMxNywgICAgNDE2LAorIC0xNzAzLCAgMTQwNzUsICAgMTYwMSwgICAgNjM4LCAgLTIyNjAsICAgLTk3MywgICAtODI0LCAgIDI4MTYsCisgLTI5NTQsICAgMzI4MiwgIC0zNzE2LCAgIC04ODIsICAtMzQ0NywgICAzMDU4LCAgLTY3MDEsICAgMTIzMywKKyAgIDE3NywgICAzNTc5LCAgIDM1MDgsICAtMzUzOSwgLTEwNTExLCAgIDc1MDcsICAgNzYwOCwgIC0xOTI4LAorICAyNDgyLCAgIC03MTksICAgMjI3OCwgICA1MTY3LCAgIDk4MjgsICAxMDU3MiwgIC0zNjM1LCAgLTI3NTAsCisgIDM0MDcsICAgLTExNiwgICAzMzQzLCAgLTM0MzIsICAtMzM3NSwgICAgOTgyLCAgICA5MDMsICAtMzIzOSwKKyAgLTQ0NCwgIC0xNTc0LCAgIC0zMzMsICAgOTYxMywgIC0xOTE0LCAgIC01MzIsICAgMTg3OSwgICAgLTc4LAorLTE3OTQ0LCAgLTcwMjksICAgMTU4NiwgIC0zMTIyLCAgICAzNjAsICAgLTQwMSwgICAxMjE5LCAgLTIwODYsCisgIDMwNjYsICAgIDg3OCwgICA1NzgwLCAgIC05NDgsICAgIDEwMiwgICAxOTUyLCAgICA0MTgsICAgLTQxNiwKKyAgMTAwMiwgICAxMzgwLCAgIDEyOTcsICAgIC05MiwgICAtNjQwLCAgIC01NTUsICAtMTE1OSwgLTI4NTE3LAorIC0xNzU3LCAgIC02OTYsICAgIDEyNCwgICAtNjE4LCAgIDE1OTAsICAgIDMwMCwgICAtNTk4LCAgICA5MjQsCisgIC0xOTAsICAtMTczNCwgIC00MTk2LCAgLTUzNDUsIC0xNDA2OCwgICA1OTcxLCAgIDgyOTMsICAtMzg3OCwKKyAtMTQ0OCwgIC0xNzc3LCAgIC0xNzQsICAgIDkyMSwgIC0xNTU1LCAgIC04NjYsICAgIDU2MCwgICAgMjMyLAorIC0xOTE0LCAgLTQwMDIsICAgLTc3MiwgICAxOTYwLCAgLTQ5NDUsICAgMzQyNCwgICA2NDkyLCAgIDM2NzUsCisgIC04MDAsICAgNTM0NiwgICA0NDA0LCAgIC02MzksICAxMDY5NywgICAxNjMxLCAgLTE0NDYsICAtNDQ2OSwKKyAtNzgwNCwgICAzNzIxLCAgIDQ4MjQsICAgLTYyMCwgICAxMDk5LCAgLTI5NTYsICAgNTE3NSwgIC0yNDUzLAorIC00ODk0LCAgIDI1NjIsICAtMTg0MiwgICA0OTQwLCAgIDEzOTEsICAgMjgxOCwgICAxMDk1LCAgLTQyODUsCisgIDY0NjksICAtMTk2NiwgLTE0NTY0LCAgLTIyMzIsICAgIDU5MiwgICA1NTcwLCAgLTI2ODIsICAgMjY1MSwKKyAgNDY3OCwgIC03NDQ0LCAgLTIzODcsICAgNjgxMiwgLTEyNzU3LCAgLTU2NjQsICAgIC00MiwgICAgMTM0LAorIC0yODYxLCAgLTE3ODAsICAgLTE1OCwgICAxNDEwLCAgLTQ5OTAsICAgIDY3MywgICAyMDgzLCAgLTI2MzksCisgIDMwMTksICAgICAtMiwgICA4MzA1LCAgLTE5ODEsICAtMjExNCwgICAgLTU0LCAgIDI4OTIsICAgMTY1OSwKKy0xNDkxMywgICAgLTc0LCAgLTEwOTIsICAtMTE4NywgICAyNDY1LCAgLTIyMTgsICAgIDc5MSwgICAtNjA4LAorICAzMDc3LCAgICAgMjYsICAtMTA5NiwgIC0xNjkyLCAgIDMyMzQsICAtNzExNiwgIC0xODM1LCAgLTUyNDQsCisgICAzOTgsICAxMDEzNywgICAgNjk4LCAgIDIyOTgsICAgIDQ5OCwgICA3MDYwLCAgIDY0MzAsICAgMTM5MywKKyAgMjU0MCwgICAgNDg3LCAgLTE1MzQsICAtMTkyNiwgIC01MTM5LCAgIDM0MjUsICAgNDUzMywgICA1MDY3LAorICAtNTM1LCAgIC05MjQsICAgIDkzOCwgIC0xNzk5LCAgMTYxMjAsICAgMjAzNywgIC0zNzI3LCAgIC04MjEsCisgIDI5ODYsICAgMjMxNCwgICAtMjIzLCAgIDEzNTgsICAgICAgOSwgICAyNjk3LCAgLTE4MDYsICAgLTk0MCwKKyAtMzYzMCwgIC0xODQzLCAgLTI3NzYsICAtMjI0NiwgICAgNTgwLCAgLTE2NzgsICAgMjQyNywgICAyMTI2LAorIC0xOTM1LCAgIDI5NTYsICAgIDg0OSwgIDE4MjM0LCAgICA2MzgsICAgIDM0MiwgICAxMDM2LCAgICAyNDksCisgICAtMjQsICAgMjcxMywgIC0xOTczLCAgIC0xMzQsICAtNDQ2OSwgIC0yMDE0LCAgLTYxNjIsIC0xOTc3NiwKKyAgIDcwMywgICAgLTUwLCAgIDIyOTUsICAtMjI5NCwgICAxOTcxLCAgIDExNzksICAgMTAxNCwgICAyMzc0LAorIC0xNDgwLCAgIDE1MTMsICAgIDYzMCwgICAxNTQyLCAgMjQ3MTYsICAgMzUzNCwgICAyOTI2LCAgICA2NjIsCisgLTI4ODYsICAgLTUyMSwgICAtMzQ4LCAgICA0MDIsICAgMTExMiwgICAtMzcxLCAgIDE1ODcsICAgMTgyMiwKKyAgMTg4MCwgICAxMjg0LCAgICAzMDIsICAgMTg3MywgICAxMjg0LCAgIC05MjQsICAgNjQyMCwgICA0NjUwLAorICA3OTg2LCAgICA0MjcsICAgIDM2MSwgIC04Mjc2LCAgICAzMDQsIC0xMTkxMSwgIC0xMzA1LCAgLTIwMTgsCisgICAxODksICAgIDI1OCwgICAgODM5LCAgIC05NDIsICAgIDQ3OSwgIC0zMTYyLCAgLTExOTUsICAtMTEzOCwKKyAgMTU2MCwgIC0xODUwLCAgLTUzMDQsIC0xMDEzMiwgLTEwNTMzLCAgLTEzMDEsICAtMzE0NywgICAtNjgwLAorICAgIDU2LCAgIDQyNjAsICAtNjg2NywgIC0xMzUwLCAgLTEwOTQsICAtMTM4NSwgICAxODMxLCAgICAgLTIsCisgIC05NDEsICAgMzc0MCwgICA3NzAxLCAgIC04NTUsICAgMzMwNCwgICAzNDQ0LCAgLTQ0NjcsICAgIDI2OSwKKyAtNDA5MiwgICAgNTg4LCAgMTM5NTcsICAtMTU2NiwgIC0zNTYxLCAgIDE5MzYsICAgMjgxNiwgICAyOTgyLAorICAxODA0LCAgIDI3MTAsICAgIDQxOSwgICAgNjg1LCAgIDQ0NjgsICAgIDQ4OCwgIC05NTIwLCAgLTI3MzgsCisgIDM5NzQsICAtOTk3OCwgIC0xNjgxLCAgLTI0MTgsICAgMjM0MCwgICAtNzE3LCAgIC04OTksICAtMjg1NSwKKy0xMDQ3MCwgICAxMDMwLCAgLTIzNDYsICAtNTU1NSwgICAyNTU5LCAgIDIxODAsICAtNTMyNCwgICAxODMyLAorIDEwMjk0LCAgICAzNDIsICAxMTMxOCwgIC0yMzc2LCAgLTM5MDQsICAtMTUyNCwgIC0zODA2LCAgIDEwNzgsCisgLTE4OTYsICAgNzE5OSwgIC0zNTIyLCAgIDEzNjQsICAgMjI5MSwgICAtOTExLCAgIC0xNTYsICAtNDMyNywKKyAgLTc3OCwgLTMwNDUxLCAgIC01NzcsICAgLTE1OCwgICAgNTYwLCAgIDI3NDksICAgIDc5OSwgICAyNjg5LAorICAgMzM3LCAgIC0zMDEsICAtMTIxOCwgICAxMjQzLCAgICA2ODcsICAgLTg4MCwgICAtNDE5LCAgICAgNDAsCisgIC0yODAsICAgICAgNCwgICAxODM0LCAgIDk5MDgsICAgMTk1MywgICAgNDA4LCAgIDEwODAsICAgODc3NywKKyAgMzg2MSwgICAgNTUyLCAgLTY5MDYsICAtMzU0NiwgIC02NjY2LCAgICAgMzUsICAtMTkwMywgICA0Nzg4LAorICA1MDgwLCAgIDI4NjUsICAgLTIzMywgICAxMDMxLCAgLTQ1MTksIC0xMzc1MiwgIC0yNDE3LCAgLTE3NDIsCisgLTczODksICAgMzE5MSwgICAtNjI2LCAgIC00MTEsICAtNzM1MSwgICAzMDYzLCAgLTE4MDEsICAtNDM3NywKKyAtMjk3NCwgICAtMTI0LCAgIDI3NzgsICAgMjczMywgICAgMzQ5LCAgLTExOTEsICAtNjUyOCwgIC0xNjk5LAorICA2OTA3LCAgICAyMzksICAtMjc2NSwgIC01NzA2LCAgIDM2MjcsICAgMjA5NiwgICAgLTIwLCAgIDIyODUsCisgIDcxNjQsICAgMzUyMywgLTExNTgyLCAgIDM2MTYsICAgLTYxNCwgICA2MjY2LCAgIC0yODUsICAgMzY0MywKKyAgMTUwNiwgICAzNjY1LCAgIDEyNjEsICAtMjMzOCwgICAgNDE4LCAgLTUwNjIsICAgNDg5MywgICAyOTQ1LAorICAxOTIzLCAgLTI5OTAsICAtNDUzMSwgIC04ODU4LCAgIDI3NjksICAtNTAyOSwgICAyMjAyLCAgIDMzMzcsCisgMTA3MDMsICAgIDcxNiwgICA1NjE0LCAtMTQ5ODIsICAtMjM2NiwgIC01NDE1LCAgICAgMjUsICAtMTY2NSwKKyAgNDM1MywgICAzMDYwLCAgLTIxNTksICAgMTAwNSwgIC0xNTg3LCAgIC0zNjgsICAgLTk0OSwgIC0yNzg4LAorICAxMDYzLCAgIDEzMDcsICAgIC01OSwgICAgLTQ2LCAgLTYzMzcsICAgIDUwMCwgIC0xMTk0LCAgIDI5MTQsCisgIDIzNzIsICAtMTM5MywgIC0xOTE0LCAgIDM4MjAsICAtMTE2MCwgICAtMTM1LCAgIDM3NzcsIC0xNDE1MSwKKyAgNTIwOCwgIC0yMjkwLCAgIDU3MzgsICAgMTAxOCwgICAgMzg1LCAgIDE4ODMsICAtMjYyNiwgIC05Mjg5LAorICAxMDgyLCAgIDE1NTgsICAtMTc1NiwgICAyNzIwLCAgIC01MTksIC0xMzA1MCwgIC0zNjcyLCAgIDE3NTksCisgICAtMTMsICAgMzQ3MSwgICA0MDcxLCAgLTU5NzcsICAgIDE2NywgIC00MjEwLCAgIDIyMTksICAgMTM0NCwKKyAtMjQxMiwgICA0NDk3LCAgLTY5NDYsICAgIDY2MCwgICA4Nzc0LCAgLTMxNDEsICAgNjA4MCwgIC00NDc4LAorICAyNTIwLCAgIC02MDksICAtMzA4MCwgICAtNzQxLCAgIDc4NjQsICAgNzQyOCwgICAtMzMzLCAgIDExNTQsCisgLTE4NDksICAgMTQ3OCwgICAgNDYwLCAgIC0zMzgsICAtNjY1MSwgIC0yNDgwLCAgIDE2OTIsICAgMjEwNCwKKyAgMTY0MiwgICAyNzIwLCAgIDEwMTcsICAgMjc1OSwgIC0xODIyLCAgLTI2NjgsICAtMjI2NSwgIC0xMDE5LAorIC04OTI2LCAgIDE0ODcsICAgIDczMywgLTE1MTI4LCAgIDU1NDMsICAtNDIxNCwgIC03MDQ0LCAgICA2NjYsCisgIDcxMDgsICAgMjIyMiwgIC0yNDU0LCAgIDQ5OTUsICAgNTEwOCwgICAxNDgxLCAgIDIyNDIsICAgNTc0MywKKyAgLTQ4NywgICA5NjY5LCAgICAyOTUsICAgMzUzOSwgICA0ODM2LCAgICA0ODcsICAtMTU0MSwgICAgODI0LAorIC01OTQ2LCAgIDY2OTIsICAgLTM2OCwgIC0xMzkwLCAgLTYxMDMsICAgNDU0NSwgICAyNjcxLCAtMTIyNzIsCisgIDMxNjAsICAgIDc2MCwgIC0yMDgwLCAgIDM1MjMsICAtMjc1MiwgIC0yOTQwLCAgIC03MTgsICAgMjIwMiwKKyAtNTUyMywgICAyMzQ2LCAgLTU1ODAsICAtNTAwNywgICA2MjEyLCAgLTU0MDYsIC0xMTM0OCwgICAxMjcyLAorICA1Mzg5LCAgIDIzMzEsICAgMzY5MSwgIC0xMTg0LCAgLTM1ODUsICAtNDUwMCwgICAtNjAzLCAgICAtMzgsCisgLTUyODUsICAgLTUzMSwgICA0ODQ0LCAgLTM4NTAsICAgMzk0NCwgIC02NTI1LCAgLTU3MjMsICAtMjMxMywKKyAgLTk4NSwgICAgODc5LCAgICA1NzgsICAtMzIxNywgIC0zNjAwLCAgLTI4MTQsICAgMTQzMiwgIDExNTY4LAorIC0xNDYxLCAgLTE3NjEsICAtNDExMCwgIC00MTA0LCAgIC0xMDMsICAtMTgwMywgICA1MTk1LCAgLTE0NzcsCisgIDEzNDgsICAgIDEwNywgICAzOTAyLCAgIDEyMTUsICAgMzUyMiwgIC0zNDA0LCAgIDkwOTgsICAgLTIzNywKKyAgICA2OCwgICAgIDM0LCAgLTI1MjQsIC0xMjA0MCwgIC02MTgzLCAgIDIxMjIsICAgIDQ3MCwgIC0xMjU3LAorICAgMzQ2LCAgIC0yMzIsICAtMTcyNSwgICA1OTEzLCAgLTE1MjUsICAtNTg3MywgICAxODQ2LCAtMTEzNjgsCisgIDEwNDMsICAtMTAyNywgICA0MjAxLCAgLTM4NjQsICAtNDI5NCwgICA3NzU2LCAgIDE4NDcsICAtMzY4OAorfSwKKworLmNiMjIyMHMxID0geworIDMyNzY3LCAgLTIyNTYsICAgICAxNiwgICAyMTU2LCAgICAyNjcsICAgMTEyOCwgICAxMzk0LCAgLTE5MzYsCisgIC00ODgsICAgLTQwNSwgICAtMzQ1LCAgIDEwNjgsICAgIDU3OCwgICAxNTA0LCAgLTExOTIsICAgLTQwNSwKKyAgIDI5MiwgICAxMTQ5LCAgIDQyNDMsICAgIDE1MiwgICAxMDM2LCAgIDE3ODIsICAgMjY1NSwgLTIzMzQ5LAorIC0xMTAwLCAgLTE5MzMsICAgIDM1NCwgICAgOTY2LCAgLTE1NTQsICAgMTE3MywgIC0xMTg2LCAgICA0OTUsCisgICA2MTgsICAgMTAwOSwgIC0yNzE1LCAgICA0NjEsICAgNTk3NCwgICAgOTM5LCAgIDM1NTIsICAgMTMyNSwKKyAgMzM4NSwgICAtOTU2LCAgIDIxNzcsICAgMjEwMSwgICAtMTQ1LCAgLTEwMDAsICAgMjMyNiwgICAyNDY2LAorICAyODIyLCAgMTU4MjIsICAgLTU4MSwgICAtNzEzLCAgIDQzOTgsICAgIDgyOCwgIC0zMjQ5LCAgLTM5NDIsCisgIDE5OTAsICAgLTg2MiwgICAyMjcyLCAgICAzNDgsICAtMjk3MiwgICAgMjQxLCAgLTI2NzgsICAtMTg4MSwKKy0yMjMwNywgICAgNDE3LCAgIC01ODcsICAgIDMxMiwgICAgMjgwLCAgLTI1MjQsICAgMjM4MCwgICAgMjk5LAorICAzOTMxLCAgICAxNzgsICAgMjkxMCwgIC0yNTQ0LCAgIC0zNTYsICAgLTc4NiwgICAgNTQ2LCAgICAtNzMsCisgIC04NjIsICAgIDI0MCwgIC0xNjUzLCAgIDEyODYsICAtMzg3NSwgIC0yMDcyLCAgLTE0NzcsICAxNjgwMCwKKyAtMTE0OCwgICAyMDk5LCAgIDMyMTYsICAgNTE3NCwgICAyMTc3LCAgIDMwNDIsICAgLTc5NiwgICAgNDE0LAorICAtNTA2LCAgICA4ODMsICAgMTgzNywgICAxNDUxLCAgIDI4NjQsICAgIDg1MCwgICAyMzk1LCAgIC00MTQsCisgIDMyNTQsICAtMTkzNywgLTE2Mzc5LCAgLTM5NzYsICAgMjE3OCwgIC0xNDczLCAgIDQ3NTksICAgLTgzMiwKKyAgODg5MCwgICAzMzI0LCAgLTMwNTMsICAgLTQwNywgIC0xNTMwLCAgIC00MzEsICAtMTIyMCwgICAgMTI4LAorIC0zNDcyLCAgICA5ODAsICAgICA1MiwgLTE0NzE2LCAgIDE3MzIsICAgMTkzMSwgIC02NTE4LCAgLTE3ODQsCistMTExMTMsICAgNDQ2NiwgICAgLTI0LCAgLTg1NTksICAgIDEwNSwgICA1NDc4LCAgLTQxMTYsICAtMjIxMywKKyAtMzAwNiwgICAxNzM4LCAgLTQxODksICAgMzMxMCwgICAtNzUzLCAgIDE4NjksICAgIDU4MCwgICAtODg1LAorICAzMDg5LCAgIDgxNDYsICAtNDk5MCwgIC0xODI1LCAgIC01MjQsICAgMzYyMCwgIC02OTIwLCAgICA2MjEsCisgLTEwNjQsICAgNDYzMywgIC0xNTA5LCAgICAgODAsIC0xMDk0OSwgIC0yNzUyLCAgICA0NzYsICAtMzY4NCwKKyAgMzU0NywgIC0xOTY3LCAgIDMzNjQsICAgMjg4NywgICAtNzI5LCAgIDc5MjEsICAtNDIxNiwgIC0zNjgxLAorLTE0NDE3LCAgLTM5NzgsICAgIDI2MSwgIC0xMTQ2LCAgLTExMjQsICAgLTkwMSwgICAgNzc3LCAgICA3ODMsCisgICAgLTIsICAgLTk4OSwgIC0xNTgyLCAgIDM5ODgsICAgNzc4NSwgIC02MzcxLCAgLTIyNTgsICAgMzM0NCwKKyAgIDM1NCwgIDEzMjg5LCAgIDMzMzksICAgIDMxNiwgIC0zMTg2LCAgLTIwODgsICAtMTk1MSwgICAgMzEwLAorICAtNTQ1LCAgIC03MDQsICAgIC00MCwgICA0NDE2LCAgIC0zOTIsICAtMTAzMywgICA1NjUwLCAgICAgOTksCisgLTMwMDgsICAtMzcxNiwgICAyNDQ4LCAgLTM3NTgsICAgOTQ2MywgIC0xNzkzLCAgIC0xMzAsICAgMTcwNSwKKyAgNjUwMSwgIC0yMjE0LCAgIDI5NzAsIC0xMDQ3NiwgICAgNTY0LCAgLTU5NTIsICAgLTU0MSwgICAyMDc3LAorICAgLTkwLCAgIDY1ODgsICAtMjg1OCwgIC0xNzMzLCAgLTkyNDcsICAgLTM0NSwgIC0zMTcwLCAgIDQ5ODYsCisgIDMzNTMsICAtNDg2OCwgICA4ODczLCAgICAxMTMsICAtNTIyMywgICAxNTYyLCAgIC0xNjMsICAtMjQ0NiwKKyAtNDQ1OSwgIC04MDUyLCAgIDExMDYsIC0xMDg4MywgICAxMTg1LCAgLTE3NTYsICAgLTE1MiwgICAzMTA5LAorICAgMTgxLCAgLTE0MjcsICAgODI5MSwgIDExNDE5LCAgLTYyNjUsICAgMjExNiwgICAtNDY5LCAgIDUxNTAsCisgIDEzNTUsICAgIDE4MiwgICAtNzQwLCAgICA3NzksICAtNzc1NCwgICAxODY4LCAgICAxNDQsICAgMzkzNiwKKyAgIC02MCwgICAtNzg0LCAgIC0yMzEsICAgIDg3OSwgIDE3MDMyLCAgLTIyNzMsICAgMTg4NiwgICAtNTM4LAorICAxMDE1LCAgIDE3OTgsICAgLTYzMywgICAxMDkwLCAgIDE5MTAsICAgIDEyOCwgIC02MDk0LCAgLTE5NDYsCisgLTE1NzAsICAgLTcyNywgLTE4NDU3LCAgICA0OTgsICAgIDc4NCwgIC00NDE5LCAgIDE2NTYsICAgIC0yMSwKKyAgIDE1NCwgICAyNDMwLCAgIDM4MTUsICAgIC00MSwgIC0yNzA4LCAgLTE1OTQsICAgIDIyOCwgICAtNzg0LAorICA3Mjg0LCAgIC00NTIsICAtNzYzNCwgLTEyODY4LCAgIDM1NjQsICAgNTQ3MywgIC0xMjQ0LCAgIDIyMzEsCisgICAgMjgsICAgNDMyMSwgIC0xNDY0LCAgIDE0MDIsICAtMTM1OCwgICAyMjQxLCAgICA2NTYsICAtMTEyOCwKKyAgMTE2MCwgIC0yMzUyLCAgIDM2NDEsICAgLTY4MCwgICAxODE2LCAgIDY4NjQsICAgIC00MiwgICAxMjY5LAorICAtMjgwLCAgLTEyNjUsICAtMjA0OCwgICAgMjM4LCAgIC02NTMsICAxMzU3MSwgICAzODc0LCAgIC0yNjksCisgIDc5NzcsICAgMjIzOCwgIC0xMjQ2LCAgLTIwNjYsICAgNDc0MSwgICAxNzA2LCAgIDM0OTgsICAgIDU5NSwKKyAgMjU1OSwgICAgIDU1LCAgICA1OTMsICAgMTY4MSwgICAxNjEyLCAgICAgNDMsICAtMjc1NiwgICAyNzAyLAorICAyNDM5LCAgLTI0NzEsICAgLTgwOSwgICAxODkwLCAgMTcwMzIsICAgLTc4NywgIC00MjgwLCAgIDExNjcsCisgLTE5MjYsICAtNDk3MywgIC0xMTgxLCAgLTI3NjQsICAtNDE1MSwgICAyOTYyLCAgIDM0NDQsICAgIDg0NCwKKyAgMjQ0NiwgIDE0MDEzLCAgIDMzMjYsICAtMTE5NSwgIC0xODI5LCAgIDE1ODgsICAgMTc2NSwgIC0zMTQwLAorICA4NTYyLCAtMTQ0MjUsICAgNDA0MCwgICAyMDAzLCAgIC03MzgsICAtMTAzMiwgIC0zMzE0LCAgLTIyMzYsCisgICA1NDgsICAgIDc2OCwgIC0yMzQ4LCAgICA0MzYsICAgMTc1NSwgICAgIDMxLCAgLTQ2MTYsICAgMTI1OSwKKyAgIDI2OSwgICAxNTQzLCAgLTEzOTMsICAgNTMzOCwgLTE2NDYzLCAgIDI5MDAsICAtMjQ4MCwgICAxNjU5LAorICAgMjE3LCAgLTU4NjQsICAgMzg3OCwgICA1MjY4LCAgIDEyNDQsICAgLTUyMCwgIC0xMjAyLCAgIDEyMzgsCisgICAxODIsICAtMTA0OSwgICAtNjk1LCAgIC0zMjAsICAtNjgzMiwgIC01OTA0LCAgIDI5MTQsICAtMjYxNiwKKyAgMjU4NiwgLTEwOTU4LCAgLTMyNTgsICAtMTg0NiwgIC00NjMzLCAgIDIzNzEsICAgMzI1MSwgIC0zNTgzLAorICAyNjMxLCAgLTQxNjIsICAgMzAzNSwgICAyNzE4LCAgICA2MTYsICAgMjg5MCwgICAgMjA2LCAgMTYxMjgsCisgICA5NzksICAgMzU1MSwgIC02ODY0LCAgLTMyMjEsICAgNTg4MSwgICAzNjkyLCAgIDE3MTgsICAgIDIzNCwKKyAtMjg0NCwgICAxNjY4LCAgICAxMDIsICAgMjY4NywgICAtODM4LCAgICA5ODgsICAgMTExNiwgICAgNTMzLAorICA0MDI2LCAgLTcyMzUsICAgNTk3MiwgLTEzNzgxLCAgLTMzOTQsICAtMzUxOCwgICAtMjk0LCAgLTYzODMsCisgIDE2NzUsICAgNDUwNywgICA1NDQ0LCAgICAzODUsICAtMTkzMSwgICAgOTMwLCAgICA2OTksICAgMTYzOSwKKyAgIDQxNSwgICA2NzIwLCAgIDc4NTQsICAgMTUxNCwgICAzMTkyLCAgLTIyNTMsIC0xNDc4NiwgIC0xMzA3LAorICAgODcxLCAgIDEzMjksICAgMTg4MSwgICA2NjI4LCAgIDI4NTEsICAgIC04NSwgIC0yMjg0LCAgLTQ1MzgsCisgIC04MzcsICAtMjIzMiwgICAgMjY5LCAgLTIyMjcsICAxMzkzMCwgIC0yMDYzLCAgLTc1NDAsICAgODk3OCwKKyAgMTE5NSwgICAyNzE3LCAgLTEyODIsICAgLTk3MiwgICAxMzA1LCAgIDM4NjQsICAgMjQxMiwgICAyMzA4LAorIC00ODI0LCAgLTMyODIsICAgLTg2NCwgICAtNDg5LCAgLTE0NTgsICAgMjE5MiwgIDE1OTAzLCAgIDI0NjAsCisgIDI3OTIsICAtNDEzNywgICAxMDM0LCAgIC0zNTksICAgICAgNSwgICAyMjk3LCAgICAgLTYsICAtMzg1OSwKKyAgIDQ3OCwgIC0xNTM1LCAgIDIwODAsICAgLTc0MSwgICAyMDMwLCAgIC02MDMsICAtMjY0MCwgIC0xOTAyLAorIC04MjA4LCAgIDM4MTgsICAtMTI3MywgIC04MTM4LCAgIDIwMTUsICAgOTE2OSwgIC0zNDQwLCAgLTE3NzksCisgIDQwNzYsICAgLTU3NiwgICAgLTkzLCAgLTE3MTgsICAgIDc0NCwgICAyNTYzLCAgIDY3NDQsICAtMzg0MSwKKyAgMTM1NSwgICAxNTkwLCAgLTQxOTYsIC0xMzkyNCwgICAgMzU2LCAgMTMzODEsICAgMjU1MiwgIC0yODYyLAorICAyNzkwLCAgIC01NzgsICAgMzU2MiwgICAyNzExLCAgIC02ODYsICAtMzc4MywgICAtNDg5LCAgIDEyMzAsCisgICA4OTYsICAgMTIwOCwgIC0xMTAxLCAgLTM0ODIsICAtMjQ3OCwgICAgNzcyLCAgIDEyNTQsICAgIDMyMCwKKyAtMTgyNSwgICAtMzI3LCAgIDEwNzAsICAtMTcxMiwgICAgMjk1LCAtMTgxNDEsICAtMjYxOCwgICAxNTM3LAorICAtNjAzLCAgIDM3ODIsICAtMTI3MiwgIC0xOTAxLCAgICA0MTQsICAgIDE2OSwgIC02NTc0LCAgLTY5NjYsCisgIDI3MTEsICAtMzI5MiwgIDEzMjA0LCAgLTEzMjQsICAgMzYyMCwgICA0OTYyLCAgIDI4MzUsICAgNDE3NywKKyAgNDg2MSwgIC0yMzc4LCAgLTU1MzQsICAgMzcwMSwgIC00MjI0LCAgIC02MzEsICAtMzE5OSwgICAtNjUzLAorICA0Nzg1LCAgLTEwNDUsICAtMjA5NywgICAgNTgwLCAgIDIxOTAsICAgLTE0MCwgICAgIDQ4LCAgIDMwNzUsCisgLTEzNDYsICAgLTgxMCwgICAyMDE2LCAgICA1NjYsICAtMjU0MywgICAgMjM1LCAgLTU5MzAsICAgMTk1NiwKKyAgIDQ4MSwgIDE5MDAzLCAgLTM5MzgsICAgNjQ4OSwgICAyNjk3LCAgIDQ3OTYsICAgMzQzNSwgICA3MTAyLAorICAzMDYyLCAgIDE0NjAsICAtNTgxNCwgICAyNzIzLCAgIDQxODEsICAtNDk3OSwgIC0yNTM0LCAgLTIwNTgsCisgIC0xMzYsICAgMzU1NCwgIC0yNjg0LCAgMTUyNTIsICAgNDExMiwgIC0zMTQ2LCAgIDI4MTIsICAgNzE4MiwKKyAtMjY0MiwgICA1NDQzLCAgLTEwNDMsICAgLTgwMywgICAyNzg2LCAgLTE2MjIsICAgMTk4OCwgICAtNzgwLAorICAxNDgyLCAtMTMwMTUsICAtMTc2MiwgIC0xMzc3LCAgLTQwMDUsICAgIDE2MSwgIC05NTY4LCAgIDgxNjYsCisgIDE4MzIsICAgIDMzMCwgIC02NDg0LCAgICA5NDUsICAtNDM4OCwgICAxMDkwLCAgIC01MjQsICAgMTU1NiwKKyAgLTU4MiwgICAgMzIwLCAgICA3NzAsICAgLTkzOCwgIC04NzU3LCAgICA5NzcsICAgMTA4NCwgIC03MDYyLAorICAzNTUyLCAgICA3NzUsICAtNDcwOCwgIC0yMjgxLCAgIC01NTIsIC0xMDAyNywgICA0MjYzLCAgIDExOTcsCisgIC02NzIsICAgIC05MywgICA1NzE2LCAgLTM4MjUsICAtNDUyNiwgICAxNzgxLCAgIDk3OTksICAgNDQ1MCwKKyAgMTk4MSwgIC0zMTQ5LCAgLTk2NjQsICAgMzExOSwgICAzNzk0LCAgICAtOTEsICAgNjcxMCwgICAgODQwLAorIC0xMDk4LCAgMTEzMTAsICAtMjkzMywgICAgNzg1LCAgLTI1NzMsICAgIDc0OCwgICAxODAzLCAgLTE0MDEsCisgLTE1NDcsICAtNDExOCwgICAgODQ5LCAgIC01ODAsICAtMTQwNCwgICAxNTM2LCAgLTkzODIsICAtMTYxMCwKKyAgMjMzNSwgICAgNDAzLCAgLTI5MzksICAtMzAxNSwgIC0zNzUzLCAgLTc1OTMsICAgMTY0MCwgICAzMzQ2LAorIC0yNTk0LCAgLTgwMjgsICAgNTQ4NSwgICAyMTg5LCAgLTMzNjksICAgMjEwNiwgICA1MzY5LCAgLTI1NzMsCisgIC01MTUsICAgMTQ1OSwgICA2OTk2LCAgIDEzNDQsICAgLTM4OSwgIC03MDA5LCAgMTAzMzIsICAgLTg0MCwKKyAtMzg2OSwgICAgOTAxLCAgLTY0NDksICAtMjM0OCwgIC0yNDYxLCAgLTQxMDMsICAgLTgxMCwgIC0yMDYwLAorICAxMDQwLCAgICAxMTcsICAzMjI0MSwgICAtMjMxLCAgICA5NDUsICAgIDk5OSwgIC0xMTgzLCAgICAxODAsCisgIDE0NDMsICAgIDE4OCwgICAgODU1LCAgLTE2MzQsICAgIDc3NCwgICAtMjAyLCAgICAgOTksICAgMTcxNCwKKyAgIDI4NiwgICAtODQ5LCAgIDE5NjgsICAtOTc0MywgLTE1NDU4LCAgIC04NTksICAtMzcyNiwgICAyMjU3LAorICAgMzU1LCAgIC0xNjcsICAtMTY3NCwgICAxODA4LCAgIC00ODgsICAgMTExOCwgIC0xNDE2LCAgLTE2ODUsCisgIDI5MjgsICAgMTQ3MSwgIC0xMTQ1LCAgIC01MzYsICAgMjMwNywgICAtOTcyLCAgLTExOTEsICAgMTYyNSwKKyAtMTQzNiwgICAgMzc4LCAgMjAxNzgsICAgLTYzOCwgICAxODI2LCAgICA0NzIsICAgLTMwMCwgICAtODQ1LAorIC0xMDQ1LCAgIDEwNzQsICAtMTA0MSwgICAtNTEwLCAgICAtMzksICAgIDUxNiwgICA0NTQ4LCAgIDI3NDEsCistMTAxOTcsICAtMjMzNiwgICAzODI4LCAgIDIwOTMsICAtNDE0OCwgIC05MTM4LCAgIDQyMzksICAgMjUyMCwKKyAtMzUzNiwgIC0zODA3LCAgIDI5OTgsICAtMjIyNiwgIC02ODk4LCAgIDQ4MzgsICAgMjU1MiwgIC0yMDI0LAorIC01NTc5LCAgIDEzNzAsICAxMTcwNiwgIC03NjI2LCAgIDE1NjYsICAgIDk4OSwgIC00OTM0LCAgLTEzNDUsCisgLTU5NjIsICAgNDI1OSwgICAxMTU4LCAgLTM3MTIsICAtMjcxMCwgIC0xMDM3LCAgICAxMDUsICAtMjczMywKKyAgMTA2OCwgICAzNjgyLCAgIDM5MDQsICAgMjA0NCwgICAgMTg0LCAgICA1MzcsICAtMzQzOCwgIC0xMzc2LAorICAgMzMyLCAgMTc4MTIsICAtMzE3MCwgICAyMzg2LCAgLTIwOTAsICAgMzQ4MSwgIC0xMzUyLCAgICA0MzEsCisgLTEwMTYsICAtMTA2MiwgICAtNTY0LCAgLTE3NTIsICAtMjYwMiwgICAxMjk5LCAgIDY3MjAsICAgIDc4OSwKKyAgMTI3NSwgIC05ODAxLCAgIDUzMjAsICAgMjMyNywgIC00MDQ4LCAgIDQ0NDMsICAtNzgyMCwgICAxMTEyLAorICAxMjMyLCAgLTExMzksICAgLTkyMCwgICAtNzQ0LCAgIC04NDUsICAtMzc1NCwgICA1OTU4LCAgLTUzODgsCisgIDMzMzYsICAtMzU3OCwgIC00MDI3LCAgICA2ODgsICAtNzA0MywgICAtMTM2LCAgIC0xNjMsICAtMTM5NSwKKyAxMzQwMCwgICAxNzI5LCAgLTE4NjIsICAgMjYxMiwgICAgMzIxLCAgLTM4NzQsICAgIDk0NywgICAtOTkwLAorIC0zMTY0LCAgMTE0ODcsICAgICA0NiwgIC0xOTc4LCAgLTIxMzksICAgMTIyMiwgICAzODk3LCAgLTk2NjQsCisgIDM2OTIsICAgNTQzMSwgIC0zMzY0LCAgLTM3MDYsICAgIDE4MCwgIC00MDA5LCAgIDI1NjMsICAgLTMxMywKKyAgMzIyOCwgIC0xNjMxLCAgLTk3NjMsICAtOTE4NCwgIC02MDU4LCAgLTQ1OTQsICAgMTA0MCwgIC0zMzIzLAorICAgMzIxLCAgLTMyMzMsICAgNTAzNSwgIC0xOTE5LCAgLTU1MjUsICAgMTg5OSwgICAxMTk2LCAgLTE4MzQsCisgIC0zOTEsICAgIDU0OSwgIC0yMTE0LCAgLTE0MzYsICAtMjYyNCwgICAyNDQxLCAgICA2MTgsIC0yNzYwNiwKKyAgLTg0MSwgICAtOTM2LCAgIDEwNjcsICAgMTE1NywgICAgMjMwLCAgICA3ODQsICAgLTc1NSwgICAxNzk4LAorICAtMjE5LCAgLTEwMjYsICAtMTExOSwgICAgMzIwLCAgLTI2MTEsICAtMTM4MiwgICA4Nzc2LCAgIDExNTEsCisgIDM3MzksICAgLTYwNywgICAyOTk3LCAgLTc3MDQsICAtNTg3MCwgICAxODAwLCAgIDEzNTcsICAgNDk3MywKKyAtOTY3NCwgIC01MTgyLCAgICAtNTAsICAgLTg4NiwgICAyMDU2LCAgIC04MDIsICAtMTkwOSwgICAgNTc0LAorIC0xNzE2LCAgLTYzODgsICAtMjg4MiwgIC0zNTI2LCAgLTMxODgsICAgLTU0MywgICAgMjQ0LCAgIDk2NDgsCisgIDUxMjksICAtNTA2OSwgICAgNTk4LCAgLTkwNDksICAgMTgzNCwgIC0zMzc1LCAgIDEzNjksICAgMTQ2MSwKKyAtMTI5NSwgICAtMzgwLCAgIC0yNzQsICAgNzI1OCwgIC05MzUzLCAgLTI0MDEsICAxMTkxNSwgIC01MDg3LAorICAxNTA1LCAgIDQyMTEsICAgLTcxOSwgICAtOTAyLCAgIDE3NjIsICAgLTE2OCwgICAgNjQyLCAgICA2OTksCisgLTIwNjcsICAgLTkzMywgICAxMDkyLCAgIC05NTgsICAgIDcxNSwgIC0xOTc4LCAgLTE5NjgsICAtMTYxMywKKyAtMTI2MywgICAtNzc3LCAgIDExNzAsICAtOTY1MiwgIC05NTcwLCAgICA2MTIsICAtMzkzNSwgICAgMjM3LAorICAgMzg2LCAgIDQyMzcsICAtMTQ2OCwgLTEwMTcyLCAgLTQ5NjQsICAgMjkxOSwgIC02NDI4LCAgLTcxODQsCisgICAxMTksICAgMzYxMCwgICAgIDU5LCAgIDMxNjgsICAtNTQ3NCwgICAtODUzLCAgLTU3MzUsICAtMTc2NSwKKyAgMzA2MywgIC0xMzUyLCAgICA5NDQsICAtMTkzNCwgIC0zNTAwLCAgIDkyODIsICAgNTkyMCwgICAgNzg0LAorICAgIDkwLCAgICAyNzUsICAgMzIxMSwgICAyNDE4LCAgLTg1NzAsIC0xMDQ5OCwgIC0yMDI2LCAgLTEwMjAsCisgLTI5ODksICAgMTUxMSwgICAgLTQxLCAtMTE0NjIsICAtMTk4MCwgICA1Mjk2LCAgIDI2MTQsICAgIC0yMSwKKyAgIDc3MCwgICAtMTU2LCAgLTI4MTcsICAtNDc0OCwgIC04NjcyLCAgIDM0NDcsICAtNzIzMSwgICA0NTk4LAorIC0xMzQ3LCAgIC02ODksICAtMzE5OCwgICAgNDM0LCAgICAgNTYsICAtMjA2NSwgICAxNzk4LCAgMTM3NjEsCisgIC01MzMsICAtMTI4MCwgICAtNzk2LCAgIDI0ODEsICAgICA1NiwgICAxMzc3LCAgLTU0NzMsICAgOTExNiwKKyAtMTE4NSwgICAtNjAyLCAgIDI1NDcsICAtMzY5MywgIC04ODgwLCAgIDI5NzgsICAgOTA5MywgICAxODI5LAorICA0ODQ0LCAgIC02NDksICAgIDMxNiwgICAtMTYyLCAgIDE1MjAsICAtNTgxNCwgICA0ODYwLCAgICAxOTksCisgLTEzMzAsICAtNTE4MiwgIC02MjY5LCAgIDI2NDIsICAgMTIyMCwgICAyODE2LCAgLTQwOTgsICAtMzk4MSwKKy0xMzI2NCwgICAtMzk4LCAgICAzNjEsICAgMjc2OCwgIC00Nzg2LCAgIDEwMjMsICAgIC05NywgICAgNjU1LAorICAtMzk3LCAgIDI0MDMsICAtMTU3NiwgICAtMzg2LCAgLTExMTIsICAgIDc5MiwgIC0xMTk1LCAgIC03NTksCisgICA3NDIsICAgIDcyOSwgIC0yOTE2LCAgLTEwMjAsICAyMTM1MCwgICAgLTI2LCAgLTM1NzcsICAgIDY1OSwKKyAtMTI2MywgICAxMzc4LCAgLTQzMzksICAgMTg4MCwgICA0ODQyLCAgIC02NjksICAtMTIwMywgICA1OTM2LAorICAgODE2LCAgLTgzNTYsICAgMzY2MCwgICAxNjczLCAgIC02NzcsICAtMjM3MCwgICAxNjUyLCAgIDg3MTAsCisgLTEyNTQsICAgNjE3MSwgIC02ODY4LCAgIC04OTEsICAtNjc1MiwgICAtMTY5LCAgLTU2NzgsICAtNzU4OCwKKyAtMzI0NywgICAyOTgyLCAgIDUyODEsICAtNDk0MSwgICAtMzU5LCAgLTMzNTQsICAgIDg1MSwgIC0xNjA5LAorLTExMTk0LCAgICA2MTAsICAgIDI2MSwgIC0xOTM2LCAgIDI3MTUsICAtMzU0MCwgIC0yNDg4LCAgIDIwODYsCisgIDYxMTAsICAgIDkxNCwgIC0zMjI0LCAgIDE3NzcsICAtMTU1OCwgICAgOTM3LCAgIDM3MzYsICAtMzEwOSwKKyAgMTkwMywgICA0MjUwLCAgLTQ0NzgsICAgMjYzNiwgICAyMjkyLCAgLTE0NTEsICAxMDIzMSwgICA3NjAwCit9LAorCisuY2IyMjIwbTAgPSB7CistMjY0MzAsICAgLTUzMywgICAxNTk5LCAgICAyMDgsICAgLTI5MywgICAyMzAzLCAgICA3MDQsICAgMTU4NiwKKyAtMTA2NCwgIC0xNjMwLCAgICA2OTAsICAgMTY5NywgICAgNjIzLCAgIDE3ODYsICAgIDMzMiwgICAgNjgyLAorICAgMTk5LCAgMTI2OTUsICAgIDQ3NSwgICAxMjg4LCAgLTI0NzEsICAgLTc5NywgICAgLTY4LCAgIDk2NTksCisgIC04MTYsICAtMjQ2NSwgICAgNTQ2LCAgLTE0MjEsICAgMTU5NiwgICAtOTI2LCAgIDQ0NzEsICAgMjM2MCwKKyAgNTU1MSwgICAtOTAwLCAgICAyOTcsICAgICA5NiwgICAgNDAwLCAgICA5MzYsICAgMTU0OCwgIC0xMDY2LAorIC0xNjI1LCAgICA2NTIsICAgMTQxNiwgICAtMTE4LCAgIC01MjUsICAgIDY4MywgICAxNTQ1LCAgIDEzNDAsCisgMjA2ODQsICAgIDkzNiwgIC0xMDMzLCAgIC03NzMsICAgODQxNiwgICAgOTU0LCAgLTQ4MjIsICAgNDIyMywKKy0xMDgxNSwgICAtMzEyLCAgIC04OTYsICAgIDUzMSwgICAzMTQwLCAgLTE2NDksICAgIDUwOCwgIDEwMjk0LAorICAtMzE1LCAgLTIwNzgsICAgIDU4NCwgICAxNTIzLCAgICAxMTgsICAgIDk5NywgLTExODM3LCAgIC02MDUsCisgIC0yNjIsICAtMTczMiwgICAtNjEzLCAgMTIyMjAsICAtMjY2NiwgIC0xODAyLCAgIC01MDcsICAtNDQxMCwKKyAgLTEwMCwgICAyMTI3LCAgIC0xMTQsICAgLTg4NiwgIC0yODA2LCAgICA1MDAsICAgMTAzNCwgIC0yODExLAorIDEyNjQyLCAgIDEwMTUsICAtOTE5MywgIC00MjAxLCAgICAyMzgsICAgMTA5NiwgIC0xMTU5LCAgIDE2MTksCisgIDI1MzQsICAgMTY0NCwgIC0zNDY1LCAgIDQ3OTcsICAgIDYzOSwgICAyNTgzLCAgLTEzMTYsICAtOTg4NCwKKyAgIDk0OCwgICAxNDc5LCAgIDExODYsICAtMTc2MCwgICAtMzQzLCAgLTEyODYsICAtMTY1MywgICAgNjc4LAorIC03NDM5LCAgIDQ1NDIsICAtNjI5NSwgIC0xNjAwLCAgLTY5NzgsICAgICA0OCwgICAgNDQ4LCAgICAzNjksCisgIDE1OTcsICAtMzY5NiwgIC0yMTIxLCAgIDEwMDIsICAgMjQyOCwgLTExMzY4LCAgIDUzODUsICAgIDgyNywKKy0xMDY3NCwgIC0yMjUyLCAgIDIyNDAsICAgMTIzMCwgIC0zMDc0LCAgLTE4OTQsICAgIDI5NiwgIC0yMjE2LAorICAgNTcxLCAgICAxMTQsICAgLTQ5NywgIC0xNjc1LCAgIDEzMTEsICAtMjI5NywgICAxODQzLCAgIC0zNTAsCisgIC04NTYsICAgMjA2NywgICAxMTk4LCAgIC01ODgsICAgIDI3MCwgICAtNDcwLCAgIDI2NDAsICAgIDI3NCwKKyAxOTU4NiwgICAtNzYyLCAtMTE0NzEsICAgLTYyMywgICAtNTA2LCAgIDQyMzYsIC0xMDk4MSwgICAtMjE0LAorIC0xODU2LCAgICA0MDksICAtMTI3NiwgICAtOTM1LCAgLTE2ODEsICAgNTExNiwgICAgNzc0LCAgIDMwMDgsCisgIDQzODgsICAgLTExMiwgIC05NDkzLCAgLTExMDgsICAgMTQ1NCwgICAxMzg1LCAgIDEwNjUsICAgIDUxOSwKKyAgLTQ4NiwgICAgMzA4LCAgLTExNDEsICAgIDI4OSwgICAxNDI0LCAgLTM2NzIsIC0xNTk4OSwgIC0zNzM4LAorIC0xNTkyLCAgIC0yNTgsICAgMzMwNCwgICAgIDYyLCAgIDE0NDEsICAgICA0NSwgICAtNjg2LCAgLTEwNzAsCisgLTE2MTYsICAgLTcwMSwgICAyMzEzLCAgIDE5MTgsICAgNDg0MywgICAgNjU0LCAtMTY5MDIsICAgIDI2MywKKyAgMTgzNywgIC00MDYyLCAgIDI3MjcsICAgLTcwOSwgICAxNTI0LCAgLTE2MjgsICAgMjAyNSwgICAtMjgxLAorICAgMjY0LCAgIDEyMzgsICAtMTAyMywgLTExOTgxLCAgLTI5OTAsICAtMTI5MywgICAgODAxLCAgLTk2MDYsCisgIC02MDQsICAgLTIxMCwgICAxMjQ4LCAgIDQwMTQsICAgMzY1MiwgLTExMjg2LCAgLTIwOTQsICAgLTQ3MCwKKyAtMTMzMCwgIDE0NTIzLCAgLTIzODgsICAgMTQxMywgIC0zOTY4LCAgICA2NDEsICAgMjkzNiwgICAgMTYxLAorIC0xNjg3LCAgLTEyNjAsICAgMTcyMiwgIC0xOTY4LCAgICAzNjQsICAgLTg1NCwgLTE0Mzg2LCAgMTAxNDYsCisgICA3OTIsICAgIDEzMywgICAxNzQ2LCAgICAyNjEsICAgMzM0NSwgICAtNDA4LCAgIDIwMzYsICAgIDI3MiwKKyAgMTQxMiwgICAgNzIwLCAgLTMzMDIsICAtMTQ5NSwgIC00MzM0LCAgIDIyMTAsICAgIDc5OSwgIDE3NTQ2LAorICAyNjAwLCAgIDEzMTQsICAgIDc2NCwgICAxMzI3LCAgIDM0MzMsICAgLTM3NywgICA0Mjk2LCAgIDI0MDIsCisgLTEwNzQsICAgIDQ3MCwgICA3MjIwLCAgLTI1NTYsICAgMzMyNiwgIC00MzM4LCAgLTIwODYsICAtMTk0NSwKKyAxMTg2NSwgICAzNTI1LCAgIDE1MTMsICAgMTUyMCwgIC0xODE0LCAtMTMwMjAsICAgLTkyOSwgIC0yMDAxLAorIC0xNDk2LCAgICA1ODAsICAtMzI5MywgIC0zMTQ2LCAgLTIxODUsICAgMTQ0MiwgICAgMzkwLCAgLTIwMjYsCisgLTIxNDEsICAgLTE5MiwgLTE4NzAwLCAgLTIwMzksICAtNDMzMCwgICAxNjkxLCAgIC0yNTAsICAgMTQ1MSwKKyAtMjkxMywgICAyODMyLCAgLTMyODQsICAgMjg5OSwgICAxNTI5LCAgIC04ODgsICAgIDQ4NiwgIC0yMzgxLAorIC0xNDU5LCAgLTI2NjMsICAgIDUzMCwgICAtNzE3LCAgIC0yNDgsICAtMTcxNCwgIDEyNjYyLCAgIDE4MjAsCistMTE0ODgsICAtMTA0NCwgICAzMDM1LCAgIDM4NzIsICAtMjQzMCwgICAgNjc5LCAgIDEwNzUsICAgIDQ3NSwKKyAgLTU5MywgICAgOTMwLCAgLTE3NTEsICAgIDQwNSwgIC0yMzA4LCAgIDIxNDgsICAgIDUxMCwgIC0yNzk4LAorICAgNDQ1LCAgIC0yNDAsICAtNjg2NSwgICAyMTA2LCAtMTEzMjMsICAgIDY3MCwgICA0MzQyLCAgICAxNTQsCisgLTc3NDgsICAtMTgwNSwgICA1MzgxLCAgIC04NDIsICAgLTY5NywgICAtNzA5LCAgICA2ODgsICAgLTQ5OCwKKyAgNTUyNSwgIDE1MjEyLCAgLTIwMDYsICAtNDE0NiwgIC0yNDUyLCAgIDIzOTIsICAtMzUyMiwgIC0yMDIzLAorICAxMzA2LCAgIDU1MjIsICAgIDkxNiwgIC0zNjE2LCAgIC0yODcsICAgLTY1MywgICAgMzMzLCAgIC0zMzAsCisgICAgIDQsIC0yNDg4NiwgICAgNjM1LCAgICAxMTksICAtMTk0OSwgICAgODk5LCAgICAtMzYsICAgIC0zNywKKyAgMjY1OCwgICAtMTMzLCAgIDIwNjQsICAgLTUzNCwgICAtNTQ5LCAgLTE3NDUsICAgIC03MCwgIDMyNzY3LAorICAxMDg5LCAgIC04NjksICAgIDE1MCwgICAtNTk5LCAgLTExNDYsICAgLTU3NCwgICAtNDI0LCAgICAzNzcsCisgIC02NDgsICAgLTMwMywgICAgNTkwLCAgICA0NTMsICAgMTkxMCwgICAtMzUxLCAgICA1NTMsICAgIDMwNCwKKyAgLTc1MiwgICAtNzUyLCAgIC01MDIsICAgIC00MiwgLTMxMjExLCAgIC02MzQsICAgIDQ0OSwgICAgNjM4LAorICAxMDg2LCAgLTE0MDYsICAgMTIyMCwgICAgODAyLCAgIC05MjQsICAtMTg3NCwgICAtMjEyLCAgICAgODYsCisgIC0yMDAsICAtMTE0MCwgICAgNjE4LCAgIC02MjEsICAgLTYwNSwgLTEwOTc2LCAgIDE2OTksICAgLTYwMywKKyAgMjA1NiwgIC00NDQ4LCAgLTE1MTksICAgMjU2NCwgICAtNzQzLCAgMTIzMDQsICAgMTQ4MiwgICAgNTQ3LAorIC0xNTg5LCAgIC04MTcsICAgLTIxNywgIC0xNjMzLCAgLTEwODksICAtMjI3MCwgICAgMTgxLCAgIC02MzQsCisgIDM4OTAsICAgIDczNCwgIC0xMzE5LCAgLTIwMzUsICAgMzMwNCwgIDEzMTQ0LCAgLTkwNzYsICAtNDA2NywKKyAgICA3MCwgICAxMzA5LCAgIDEwNjcsICAgLTM1NCwgICAxNTI5LCAgIDEzNzksICAtMTAwMiwgIC0zMzI0LAorICAtNTI1LCAgIC04MTcsICAtMTQzOCwgIDEwODM0LCAgIDEwMzYsICAxMjQ0MSwgICAxMjQyLCAgIDI0NjEsCisgIDI4NTgsICAgMjI1NywgICAgNDMwLCAgLTExNzcsICAgMTE0MiwgICAtODcwLCAgICA4NDQsICAgMTEwMiwKKyAgMTIwOCwgIC0xNDgyLCAgICA4MzAsICAxNzYyMiwgIC0yNzUzLCAgICAgIDYsICAgIDE3NCwgICA0Mzg1LAorICAtMzM5LCAgIDIxNTcsICAgLTE1NSwgICAgLTY4LCAgIC0xOTAsICAtMTE4MSwgICAgIDI5LCAgLTIwNDYsCisgLTIxNDAsICAgICAyNywgICAgOTQ5LCAgIDE4ODksICAgIDQ0NiwgICAgLTU0LCAgMTY2OTYsICAgIC00OSwKKyAtMzMwNCwgIC0xOTI5LCAgIDE4MzMsICAgMzczNSwgICAtNDk1LCAgLTEyMjUsIC0xMTc0MywgIC0yMjU5LAorICAgODkxLCAgLTE5NTQsICAgMjg0OCwgICAtNTA0LCAgIDExNjQsICAtMjQ4OSwgICAgODYxLCAgICA1NzksCistMTE1NDcsICAgIDk3NiwgICAgLTQyLCAgIDE0NzcsICAtMjQyOCwgIC0xNTYxLCAgICAxMTIsICAgICA3NCwKKyAtMjcyMSwgIDEyMDQ2LCAgICA2MzIsICAgMTI4MywgIC0xOTAwLCAgIDE5OTAsICAtMTE5MywgICAxNjA2LAorIC0xMzcwLCAgLTI4MTIsICAtMTMwOSwgIC0xNDE5LCAtMTI1MjYsICAgMzM5MSwgIC00MjEzLCAgLTI3MTAsCisgICAyNjksICAgICA5MCwgIDE0NTc1LCAgIC0zNDUsICAgIDgyMCwgICA2MTE4LCAgICA4OTIsICAgNjMwMiwKKyAtMjgyNSwgICAgMzMyLCAgLTMwNzEsICAgMjI3OSwgICAzNzU2LCAgICAxODUsICAtMzAyOSwgICAyNDAyLAorICAgMjQ1LCAgIDEwMTAsICAgLTI3MywgLTMyNzUxLCAgIC0xNDAsICAgLTYwMCwgICAgNDgyLCAgIDE1MTYsCisgIC00NjIsICAgMTkzMSwgICAxOTQxLCAgICAyNzIsICAgLTMxMCwgICAgNTQ0LCAgIC00MjIsICAgLTgxNSwKKyAtMTExNiwgICAgODAzLCAgIC02MTcsICAtMTY0MCwgIC00MzM2LCAtMTE3MzUsICAgMzY1NiwgIC0xMTc2LAorICAxMTcwLCAgLTYyMDksICAgMjEzOSwgIC0xNTcxLCAgIDIwNjcsICAgMTAxMSwgICA5ODQyLCAgICA3OTAsCisgIDE3MDIsICAgLTE5MSwgICAgOTExLCAgIDI3NzEsICAgLTI1MywgICAgNzk0LCAgLTM4NjIsICAtMTg4NSwKKyAgLTQ5NCwgICAyMDcwLCAgLTI2ODIsICAgIDc3MiwgICAgNzYzLCAgIDQzMDQsIC0xNTY1NywgIC0yMTk0LAorIC0xOTk4LCAgIC05NjMsICAtNTIyMiwgICAtMTc1LCAgICAyMzgsICAgICAzMiwgIDEwMDY3LCAgIC02OTIsCisgIDI4MjQsICAgLTQ3NCwgICAzMDE2LCAtMTE5OTQsICAgIC01MSwgICAgNzEzLCAgIDI0MjMsICAgMjg2NCwKKyAgLTMzOCwgICA0ODM4LCAgLTEwOTUsICAgIDIxNSwgLTEzNDcxLCAgICAgLTIsICAgIDcwNCwgICAgNzUyLAorLTE0NjU0LCAgIDEzOTYsICAgIDQ4NCwgICAgNTY0LCAgIC04ODYsICAgLTc3NSwgIC0xMDk5LCAgICA3NzUsCisgLTEwMzUsICAgMTY2MSwgIC0xMDEzLCAgLTExMTgsICAgIDQ0OSwgICAgODIyLCAgMTQyNTMsIC0xMzIzOCwKKyAtMTA4NCwgIC0xMTA3LCAgLTE2NzIsICAgIDk5NiwgICAgNDcyLCAgIDIyMzcsICAgLTQ0MCwgICAxMTg2LAorICAxMjAwLCAgLTIxMTIsICAtMTM4OCwgIC0xMDkzLCAgLTE5MDIsICAgIDU1NSwgICAtMzI4LCAgLTE0OTMsCisgLTIwMzQsICAgIDQyNiwgIC0yMTQ0LCAgIC0zODgsIC0yMDAyOCwgICAxMjg1LCAgIDExMjIsICAgIDczMCwKKyAgMTY2MSwgIC0xNTc2LCAgLTIwODQsICAgMjkzMCwgICAgMzM3LCAgICAtNjYsICAgMTU5MSwgICA4Njg1LAorICAyMzYxLCAgICAxNDYsICAgMTM3MCwgICAgIDIyLCAgIDEzNzEsICAgLTEwNSwgIC00MTkwLCAgICAzNzEsCistMTMyNTIsICAgIDMyOCwgICAxMzAxLCAgIC05OTUsICAgMzY4OSwgICA2NDIyLCAgICAtNzksICAtMTQwNywKKyAgLTM4NCwgICAgODI4LCAgICA4NDAsICAgIDg1NCwgICAgMjY2LCAgIDEyMjIsICAgIDc5NiwgICAtNTUwLAorICAtNzI5LCAgLTEyMTMsICAgIC04NywgICAgNTI0LCAgIDEwNzAsICAyMjMzNCwgIC0yMzMzLCAgICA1NzQsCisgICA2ODAsICAgLTYyNCwgICAgNDYzLCAgIDQwNDcsICAgLTIzNiwgICAgMTE0LCAgIDEwMjAsICAgLTY5MiwKKyAgMTU3NSwgICAtMzIwLCAgLTMyMjksICAgIDIyMiwgICAgNTIwLCAgICA5OTYsICAgMjEwNCwgIC01NDA0LAorLTE4MTk3LCAgLTExMDUsICAgLTE4NCwgIC0xMDU3LCAgMTA3MTIsICAtMjUwOSwgIC03MTQwLCAgLTIzMDcsCisgIDEzMzMsICAgMzA0MSwgICAgMTgzLCAgIDEyNDEsICAtNzg2MSwgIC0zMDYwLCAgIDE0MzIsICAgICAgOSwKKyAtMTQzMSwgIC0yNjA1LCAgIDI2NjMsICAgIDI3MywgICAgMjUwLCAgICA3NzAsICAgLTc0MCwgICA2Njk5LAorLTEwOTI5LCAgLTcyMjcsICAgIDEwNSwgIC0yOTgzLCAgLTEyMDMsICAgMTYzNywgIC02MDcyLCAgLTY2MzAsCisgICA5MzMsICAtMTUyNiwgICAgNjU4LCAgIDI2MTIsICAgNTM3NywgICAgLTkxLCAgICAtNjYsICAgNDk0NCwKKyAgMzAyNSwgICAyNzIzLCAgIC04NjksICAgIDE0MiwgIDEwNTMyLCAgIDk4NTgsICAgLTIwNywgICAzMDcyLAorIC0yNjEwLCAgICAgIDAsICAgICA4MSwgICAxMDc4LCAgIDIxMzYsICAgLTI2NiwgICAgMjIzLCAgICA5MzEsCisgIC0zODUsICAgIDk4MywgICAxMDI5LCAgICAxMDgsICAgMjI5MCwgICAtNDkxLCAgMjY2ODUsICAgIDU2NSwKKyAgLTE0MCwgICAtNjYyLCAgICA2ODAsICAtMjIwNiwgICAtODAzLCAgIC03NzcsICAgLTI1MCwgICAtNDY3LAorICAgIDk4LCAgIDI5NDQsIC0xMjI5NiwgIC00MTkwLCAgLTIyNTQsICAgLTc0OCwgIC0yMDc2LCAgIDQ3ODAsCisgIC01MTAsICAgLTIyMSwgICAxNDI4LCAgLTYxNjIsICAgMjY5MywgICA2MjM4LCAgLTQwMzAsICAgIDI2NiwKKyAgNjU0MCwgICAyNTAyLCAgIDUxNDcsICAtNDY0OSwgICAxODA0LCAtMTA1MTQsICAtMzQxMywgICAyNTAzLAorICAyMTQzLCAgLTE5MjQsICAtMzgxMSwgICAzNjc0LCAgIDQzNDEsICAtMTA1NCwgIC0zMTMwLCAgLTEyNjAsCisgIC01NzYsICAgIDg4NywgIDI1OTA4LCAgIC03NzMsICAgMTE4NiwgICAgNTQ4LCAgIC02MDYsICAgLTc0NCwKKyAgLTk5NSwgICAxMzIwLCAgIC01MDcsICAgIDI3OSwgICAxODAzLCAgLTI0NTEsICAgIDg4MCwgICAgLTMxLAorICAgIC01LCAgIDE2MTUsICAgIDc3MCwgLTExODE4LCAgIDEwNjIsICAtMTEyNiwgICAgNDcyLCAgIC0yOTcsCistMTIxMjYsICAtMTE5NywgICAxOTEyLCAgIC05NjIsICAgMTI0MSwgICAyMzQ4LCAgIDIzMzIsICAtMzA0NywKKyAgMTU2MSwgICAzODQ0LCAgICA3MjAsICAgLTM4NywgICAgMzcxLCAgIDI5NDIsICAgMTE3NCwgIC0yMzQ3LAorICAxMjQ0LCAgMTAxNDgsICAtMTYyMCwgLTExNzg4LCAgIDEzMTUsICAgIC0zMSwgIC0xODY3LCAgIDM0NTAsCisgLTE1ODksICAgNTE4MCwgICAzMTg0LCAgLTI2MTQsICAgIC0xMywgICAgMTMwLCAgICAxMDcsICAgIDI5NywKKyAgIDExMywgIC0xNDA3LCAgMjkxOTAsICAgLTU0NCwgICAtMTczLCAgICA5OTAsICAgIDkxMywgIC0xODQ4LAorICAtOTkwLCAgIDEyMzAsICAgIDI2NCwgICAxODk2LCAgLTY5NzQsICAgLTEwMiwgIC0yMjMyLCAgIDM4MjYsCisgLTIyNjksICAtNTAyNywgICAgIDk0LCAtMTI2MTIsICAgIDQzNiwgIC01OTc5LCAgIDE3NTcsICAgMTc1NywKKyAgLTcyNCwgICAyMzc4LCAgIDI1ODQsICAgIDcyOCwgIC0xMDIyLCAgLTcyNzQsICAgIDY2OCwgICAgNzQ0LAorICAtNTE2LCAgICA0MjAsIC0xMTg2NiwgICAgMjQ2LCAgLTEzNTcsICAgMjQwNiwgICAzNjc0LCAgLTI1OTQsCisgIDE2MzgsICAtMzAzNywgIC0yNDAyLCAgIDE1MjUsICAtNzMwNCwgIC0xMDc4LCAgIDE3NzIsICAgOTI2NCwKKyAxMjM2NiwgICAgMjAyLCAgICAgIDIsICAgLTcyOCwgICAgNjg0LCAgIC00MzcsICAgMTQ0NiwgIC0zNTQ2LAorICAgODI4LCAgLTIxMDYsICAtMjczNiwgICAgOTY0LCAgIC0xODAsICAgNjUyNCwgICAyMjUwLCAgICA1MTQsCisgIC03ODIsICAgIDY3NSwgICAxNDE4LCAtMTEyMjUsICAgMjc2MCwgIC0zOTcwLCAgIC01NDUsICAgOTEyOCwKKyAtNjYwMSwgICAtNTU2LCAgLTE5NjYsICAtNDYyNSwgICAtMTQ5LCAgIC0xOTgsICAtMzMzMCwgIC0xNTc1LAorIC02MTk4LCAgICA2NTYsICAgIDY3NCwgICAgMzY3LCAgIDE4MDksICAgIDE1NSwgIC01MTI2LCAgIDYxMDksCisgIC01NzIsICAgNDkyNywgICAxNDQ4LCAgLTE4NTUsICAgMTYzNiwgICA4NjQ4LCAgIDIwMTAsICAgODk3MywKKyAgMzA4NywgIDEwMTcyLCAgICAgMzQsICAtMTE4MywgICAgLTEyLCAgLTEwNTcsICAgIDE5MiwgIC0yOTU1LAorICAxMDM0LCAgIC0zNzQsICAgMjUwMCwgICA5MzE4LCAgLTQwOTAsICAtNTIyMCwgICAtNDA0LCAgLTEwMjIsCisgLTE0NTgsICAtMTM2NywgICAgNzY1LCAgLTExOTMsICAgMTU0MiwgICAgMzAyLCAgLTEzMzcsICAgIC0zNCwKKyAgMTQ0OSwgICAxNDM0LCAgIDIyMTAsICAgIDQwNCwgIC0zMjc3LCAgLTgwMjQsICAgMTM2MywgIC03NTkxLAorICA5MDk2LCAgLTkxNzksICAgMTE3NiwgIC03MzExLCAgICA1NDQsICAtODk0MiwgICAtNzEzLCAgICAtNTYsCisgIDI2MjMsICAgIC0zNSwgICAxNjIzLCAgIDIyMTIsICAgMTczMywgICAtNzEyLCAgLTEzMjcsICAgLTMyMCwKKyAtMTk2NiwgIDExMzUyLCAgLTEyNzYsICAtMzgwNCwgICAtNTUwLCAgICA1MjAsICAtNDg0OCwgICAgNTUwLAorICAxNDg4LCAgICA5NDQsICAxMDc1NiwgICAtNzgyLCAgIDU2NDMsICAtMjY0NywgIC02NTEzLCAgLTM1MDAsCisgLTI4NzcsICAgMTg4MCwgIC02NjM0LCAgIDIzNDksICAgIDI1NiwgICAgNDQwLCAgICAxODgsICAtODQyOCwKKyAtNDU4MCwgICAyNDc5LCAgIDQ3NjMsICAtMTgwNywgICAtNTEzLCAgLTQyOTIsICAtMTcyOSwgIC02ODc4LAorICAgNDQ4LCAgLTY3MDYsICAtMTE2MiwgICA0OTM4LCAgIC03MjEsICAgNTQ2NSwgICAxNDA5LCAgLTg3NTksCisgIC04OTgsICAtNDI1NCwgIC01MjMwLCAgLTM4ODYsICAtNzk2OSwgICAxNzMwLCAgIDM2NTYsICAgMTE5OCwKKyAgMzUzNywgICAgIDMzLCAgIDQwOTEsICAtMjA4OCwgIC03NjQ2LCAgIDExNjAsICAgMjkyMiwgICAgODU1LAorIC0xMjU0LCAgLTI2MTYsICAgLTc3MCwgICAtNjg1LCAgIC0xMDAsICAgLTU3NywgIC00OTI3LCAgIC03OTIsCisgLTIxMDcsICAgOTYxMywgICAyNTYzLCAgIDUwOTYsICAgNjE0MywgIC0zNDA0LCAgLTg2MzAsICAgNDE2NAorfSwKKworLmNiMjIyMG0xID0geworIDMyNTI0LCAgIC0zMjQsICAgIDQxMSwgICAgLTM0LCAgIC02OTcsICAgIDgxOCwgICAgLTcxLCAgIDIzMjYsCisgIC0xNDIsICAgLTk4OSwgIC0xNTEyLCAgICAzNTgsICAgLTI2MCwgICAzNzkxLCAgIC01NzUsICAgICA5MywKKyAgIDIyNCwgICAgMjA4LCAgLTExMDEsICAzMjc2NywgICAxMTQ3LCAgIC0yMDMsICAgMjAxNSwgICAgNDYxLAorICAgNjY4LCAgIC0yOTYsICAtMzM0MCwgICAgLTM4LCAgICA3MjAsICAgLTk5MywgICAxNzY1LCAgLTEzNDQsCisgIDEzMjMsICAgIDY0OCwgICAtOTk3LCAgICA3MjksICAgIDU4MSwgICAgMzQ5LCAgICA4NjEsICAtMjAzNSwKKyAgMTc5MSwgIC0yMTQyLCAgIC04MjIsICAtMTQyNSwgICAgODIwLCAgLTY1NTUsICAgLTgxMSwgLTE1NzA4LAorICAtOTEyLCAgIDQ4MzUsICAgMTUwMCwgICAtNjA0LCAgICA1MjcsICAgLTkzNywgICAtNjQwLCAgLTEyNDAsCisgIDQ2OTIsICAgMTI1OSwgICAgMTc0LCAtMTIwNDAsICAgIDQ1MCwgICA4MTk2LCAgIDI3OTYsICAtNTEyMywKKyAgMTU5NSwgICAgNTM4LCAgIC0xMDEsICAgLTIxOCwgICA1NTgxLCAgICAzNjcsICAtMjcwMCwgICAgMjc3LAorICAyMTExLCAgIDI3MTgsICAgMTQ1OCwgICAgMTU1LCAgIC0xMDAsICAgMzI4NCwgICAtNDk4LCAgIDk5NjEsCisgLTE1MDUsIC0xMDMzNiwgIC0xMTcwLCAgIDUzMzcsICAgMTAzMiwgLTE0OTQ3LCAgIDExNTQsICAgLTU3OCwKKy0xMTc3MywgICAtOTQ1LCAgIC02NjAsICAgIDY2OSwgICAyMzQwLCAgLTEwMzgsICAgMTUyMCwgICAgNzEzLAorICAyNjYzLCAgICA0MjIsICAtMTI0MiwgICAxOTE4LCAgIC0yMzQsICAtMTc5MywgIC0xNTgwLCAgIC0yNzEsCisgLTU2MjgsICAtMjAxMCwgLTEyMjA5LCAgLTE3ODQsICAtNDQxNywgIC0yODA0LCAgLTMxMjMsICAtNDMxNiwKKyAgIDEyNiwgICA2MzUzLCAgLTIzOTEsICAtMjA4OCwgICAgODM2LCAgLTI1NTAsICAgIDUyMSwgIC0xMjU4LAorICAgOTE4LCAgIDQ0NzEsICAgLTUyOCwgICA0MjQzLCAgIC02MTUsICAgMzQ1MywgIC02NjgzLCAgIDE3ODQsCisgICA3OTAsICAxMzIwMCwgICAgNzAwLCAgICAzMjIsICAgLTgxNSwgICA2MDQ5LCAgIC0yOTAsICAgIDkyOCwKKyAtMTEyMSwgIC0xNTMxLCAgIC04NzgsICAtMTE1MCwgICAxNDA0LCAgICAzMjUsICAgLTUzMCwgICAtNDM1LAorICAtMjU0LCAgIC04MDQsICAtMjUzNiwgICAgNTg5LCAgIDg0MzksICAtMTA4NywgLTE2MjQ4LCAgIC02MzcsCisgLTE1MjgsICAgIDMwNSwgIC0xNTc3LCAgICA2NDIsIC0yMjY5OSwgICAtMTM5LCAgIDEzMTksICAgIDU4OCwKKyAtMzA3OSwgICAgODAwLCAgIC01OTcsICAtMTQwOCwgIC0xMTUwLCAgIDMxNDUsICAgLTg2OCwgICAzMjQ0LAorIC0xMDA0LCAgIDEwMDQsICAtMTQ1OSwgLTExNjE4LCAgLTQ1NTcsICAtMzY0MywgICAtOTE0LCAgIDQyMzgsCisgIC02MjYsICAgNDAyNSwgICAzMjI3LCAgICA1MzcsICAtNDI4NSwgICAyMDEwLCAgICA3NDcsICAgMTU5NSwKKyAgMTU5OSwgICA1OTk0LCAgIC03OTcsICAgLTkxMSwgICAyODU0LCAgLTM0MjYsICAtODQ4OCwgIC0xODk5LAorICAtMzAxLCAgLTIxNDYsICAgLTExMSwgICAtNTIyLCAgLTE4NTIsICAgMzA3NSwgIC0zODY0LCAgLTE1MzEsCisgICA2NTQsICAgIDE5MywgLTExMjY0LCAgIDU1NjEsICAgIDMwNCwgICAgNTI1LCAgICAzNDYsICAtMjc2MSwKKyAtMTEyNCwgICAxMTM0LCAgIDgzNTQsIC0xMjQ2MCwgIC0xMDIzLCAgLTc2MzQsICAtMjc1MCwgIC0xNTE4LAorICA1MDAxLCAgIDE0ODAsICAtMTAzOSwgICAtNTAyLCAgIDE0NTUsICAgIDU4NiwgICAxMDEyLCAgLTEyNzAsCisgMTI0MzUsICAgIDg5NSwgICAxMTY5LCAgICA0NjYsIC0xMDY5NiwgIC0zODYxLCAgIDQzODEsICAgMTc5MCwKKyAgIDc2NywgIC0xODA4LCAgIC01MzcsICAtMTA1NywgIC0yMzc0LCAgLTIwNTgsICAgOTk5MiwgICAtODU4LAorIC0xNTY4LCAgIC02NzgsICAtMzgxMiwgIC0xNTIwLCAgIDE1MjEsICAgIDIzMCwgIC0xNzE2LCAgMTM0MTgsCisgLTE5MzAsICAgLTk3OSwgICAzMjcyLCAgIDExMTYsICAtNDU1NSwgICAtNTU5LCAgIC0zMjAsICAxMjA4MCwKKyAxMzY5NiwgICAtMjg2LCAgICA2NTIsICAgMjQyMCwgICAxNzI1LCAgIC0yNzcsICAgIDIxMywgIC0xMDQ2LAorICAxNjQyLCAgIC01NzYsICAtMTUxNCwgICAtOTczLCAgLTE1MDEsICAgICA3NywgICAgNTM3LCAgIC02MDYsCisgIDExNDQsICAgLTY4MCwgICAtNTY4LCAgIDExMDQsICAgMjE3NiwgICAtOTY5LCAgIDE2NTcsICAgLTc4NCwKKyAgMTEwNywgIC0xMDU2LCAgICAtNTksICAtNTYwNywgICAgIDY0LCAgMTE5MTMsICAgLTE3OCwgICA4NzAzLAorICAzNzQ0LCAgICAyNzYsICAgIC01MCwgLTEyODA3LCAgIDExMjIsICAtNjEzOCwgICAxOTAxLCAgIC00MzksCisgICA3MzMsICAgNjgyOSwgICAzMDAxLCAgICAtNjEsICAtMTAwNSwgICAzODE2LCAgIDM5ODcsICAtMzU4OCwKKyAgLTc3OCwgICAyMjU3LCAgMTIxMDEsICAgIDE5NiwgIDEzNzk2LCAgICAzNTUsICAgMTQwNywgICAgOTg5LAorICAgMTAxLCAgIDEwNDEsICAgIDk4OCwgICAxMjc0LCAgLTE0NzgsICAtMTEyNywgICAxMzIwLCAgIC00NDIsCisgIDM0NTIsICAtMTcxNywgICAxMjQ0LCAgIC00NjYsICAgLTg2OCwgICAtMzIzLCAgICA1MDIsICAgMTI0MywKKyAgIC03MCwgICAgODk3LCAgICA5NTgsICAgMjc4MSwgIC0yNDkyLCAgICA3ODgsICAgIDc0NCwgLTEyMzI0LAorICAxMTExLCAtMTE3MDQsICAgLTQ1MiwgICAtNzM0LCAgMTk1NzQsICAgIC00NSwgICAtNTg0LCAgLTIzODcsCisgIC04MzAsICAgIDYwMywgICAgMzgwLCAgICA3ODcsICAtMjk2MiwgICAyMDQ2LCAgIDI1MjQsICAtMjQwMywKKyAgIDY5OSwgIC00MTQ0LCAgIDE1ODcsICAgIDU3MywgICAgNTg4LCAgICAyMzgsICAgIC04OCwgICAgIDMxLAorICAtMjc4LCAtMzI3NjgsICAtMTE3MywgICAtNzQ1LCAgICA2NjcsICAgLTE4OCwgICAxMjIxLCAgIC0zNjksCisgIC0yNjEsICAgIDMyMiwgIC0yMDU0LCAgICA2NTEsICAgIDEwMCwgIC0yMDkyLCAgICAzMTUsICAgMTU1OCwKKyAgIDU5NiwgICAtNDA3LCAgIC0xNDYsICAtMTIzNCwgLTMwOTcwLCAgICAtNzEsICAgIDYzMywgICAgNTM2LAorIC0xMzQ1LCAgIDE4MTksICAgIDY1NSwgICAgNjgwLCAgLTE0NTMsICAgIDQ5MiwgIC0xMjY1LCAgLTEyOTIsCisgIDE3ODAsICAgIC02OCwgICAxMDA4LCAgICAyMTUsIC0xOTk4MCwgICAtNTIxLCAgLTMxNDgsICAgLTI1NiwKKyAgIDE5MywgICAgOTE2LCAgICA0NTMsICAgICA4NiwgICAgMTE2LCAgICAxMDgsICAgMTUxOCwgIC0xNDIwLAorIC0xNTAxLCAgICA2ODgsICAgIDY2OSwgICAxMTk2LCAgLTE1NzksICAgLTk0MiwgICAgODY4LCAgICA4MDQsCisgICAxMTAsICAgMTEyNiwgICAgMjAyLCAgIDEwODYsICAyMzUxNiwgICAxMDcwLCAgLTE2MjMsICAgIDc0NywKKyAgIC0zOCwgICAtMTE2LCAgIDExNzYsICAgIDU1NCwgIC0yMzYxLCAgIDEwMDgsICAgMTA4NSwgICAxOTcyLAorIC0xNzk0LCAgICAtOTYsICAgIDQ2NCwgLTIwOTEwLCAgLTEyMDgsICAtMzg1NywgICAtNDY2LCAgLTIxNzMsCisgIDI0NjEsICAgMjM2NCwgICAtOTMxLCAgIC02ODQsICAgMzA1NiwgICAtNzE5LCAgIC05MzYsICAgIDg4NywKKyAtMzE0OSwgICAxMDA0LCAgIDcwODUsICAtMjk4NSwgIC05MzkzLCAgIDUxNDIsICAtOTYyMSwgICAgMTUwLAorICAgMTc0LCAgICA1NzIsICAtMjIzMiwgICAtMzkwLCAgIDEzNTYsICAgIDE2MCwgLTEwNzk2LCAgIDIyNTYsCisgIDIyMzgsICAgIDI0MiwgICAxNjYzLCAgICA0ODUsICAxMjM3OCwgICAxMjM2LCAgICA2ODgsICAtMjkwOCwKKyAgMTA4NCwgICAxMDQ3LCAgIDQ4NTAsICAgIC03MiwgICAtNjQyLCAgIDE2MDQsICAgIDE1MiwgICAtODUwLAorICAgNjcwLCAgICA5NjgsICAtMzIwNywgICAxNjkwLCAgICAxMDUsICAtMjUxNiwgIDExNTM5LCAgICAzOTAsCisgLTExMTcsICAgLTU4OCwgLTEwNzcxLCAgIDI4NzksICAgNDc0MiwgIC04MzUxLCAgIDE1NzEsICAgLTg1MCwKKyAgLTYwNSwgIC0xOTU5LCAgICAzOTUsICAxMjMyNCwgICAxNzUwLCAgIDIyOTAsICAgIC05MiwgICAgNzc0LAorIC0yODk3LCAgIDEwMjUsICAtMTg0MSwgICAgNTQ2LCAgIDM5MDQsICAgMzkwOCwgIDExNDk0LCAgICAgIDksCisgIDEzNDAsIC0xMTk3NiwgICAtNTI1LCAgIDE1MjIsICAgIC00MywgICAgLTQzLCAgLTE4NjAsICAtNjE2MCwKKyAgLTE5OSwgICAyNDc5LCAgIDQ1OTMsICAtMjg3NiwgIC0yOTg1LCAgIDEwNDQsICAgIC02MiwgICAtODEyLAorIDEwNDI0LCAgLTI0ODksICAtMTA5OCwgICAgNzk2LCAgLTEyOTIsICAtMjA3MCwgICAxMDk2LCAgLTE5NDQsCisgLTIxNDUsICAtNDM3NCwgICAxMDQxLCAgLTEwMTQsICAgOTAzNiwgIC0yMTQyLCAgICAzMjgsICAtODIzMiwKKyAgIDE1MiwgLTEzMzM2LCAgLTIyMjUsICAxMzcxNiwgICAtMzY3LCAgIC01NTgsICAtMTk0MiwgICAgMTYxLAorICAtNDcyLCAgIDIyMjQsICAgLTc0OCwgICAzNTUwLCAgIC04MDksICAgLTQ5MywgICAyMTIxLCAgIDEyMzQsCisgICA3NzIsICAgNTE0NiwgICAyNDg1LCAgLTIyODIsICAgNzU0NiwgIC0xNDQxLCAgIDE1OTUsICAgOTE3NiwKKyAgNjIwOCwgICAxMjkyLCAgIDE3MDQsICAgMzk2OCwgIC0xNTAwLCAgLTE5NzQsICAtMzUxOSwgIC0yODI2LAorICAgMTQ5LCAgIC05MDMsICAgIDUwNCwgICAtMTg3LCAgIC05NDAsICAgIDEyMSwgICAtMjE1LCAgIC02MTUsCisgIC0yNTcsICAtMTk1NCwgICAgOTU4LCAgIDIwNTcsICAgLTE5MSwgIDIxMjU4LCAgIC03MjYsICAgMjA4MSwKKyAgMTI3OCwgICAxNjcwLCAgIC04NTQsICAgMjczMCwgIC04MTMyLCAgIC01MzAsICAgMTAwNCwgICAyNTc0LAorICAxNDMwLCAgLTI1MzYsIC0xMDg1MSwgICAxMzg5LCAgICAxNTUsICAgLTE0MCwgICAyMTU4LCAgIDI3NjIsCisgIDM4MDcsICAgMzg1MCwgIC0zNzI4LCAgIC05NTQsIC0xMTM2NiwgICAgNzA5LCAgMTQ3MjcsICAgIDUxNCwKKyAgIDY5NCwgICAgLTg3LCAgICA4NTcsICAgLTI0OSwgICAtNDE5LCAgICA2MTcsICAgLTQxOCwgIC0xMTQ0LAorICAgLTMyLCAgLTIxODIsICAgLTgzOSwgICAxNDQ5LCAgLTEwNzIsICAgLTc4NSwgICAtMjQ2LCAgMTM2MzQsCisgMTI0ODgsICAgIDM1OCwgICAtNDQ3LCAgLTIyNjIsICAgIDkyNiwgICAxMDIzLCAgIC05MDEsICAgLTM0NSwKKyAgMjI2MCwgIC0xNTMwLCAgLTE0NjYsICAtMjk3MywgIC0yMTcwLCAgIDIwOTAsICAgICA0NCwgLTIzNDc2LAorICAgNjAzLCAgLTE3NDAsICAgLTM0NSwgICAtNDM4LCAgLTMwMDQsICAgMTMyMiwgIC0zMDg4LCAgIDEyNzQsCisgICAzNDEsICAgLTM0OCwgICAtNTM0LCAgIDEwNTUsICAgMzAyNiwgICAtOTMyLCAgICA1MTQsICAgODk1OCwKKy0xNTQ4OSwgICAtMzc0LCAgIDEwNzcsICAgMTE2NiwgICAgIDQ4LCAgIDEwMTYsICAgLTkxOCwgICAgLTI3LAorICAtNDEwLCAgIC0yNjYsICAtMTQwMSwgIC0zODg4LCAgLTI5MTgsICAtMjE0NiwgICAyODE1LCAgIDE4MzQsCisgIC04NzUsICAgIDE2MiwgICAtNjc4LCAgIDE4NzYsICAtMjAzMywgICAxOTk5LCAtMTI4NTQsICAtMTU2MywKKyAgIDE5MiwgICAgNDE0LCAgICA3ODIsICAtMzEwOSwgICAxNDMyLCAgLTQxOTcsICAgMjM1OCwgICA4NTE3LAorICAgNzg0LCAgIDEyNTYsICAtMTM2MiwgICAyOTM4LCAtMTEzNTUsICAtNTE4NCwgLTEwMzE0LCAgICAtMzksCisgLTIxODIsICAtMTY4NiwgICAgMjQxLCAgIC0xOTUsICAgLTIzMiwgIC02MTY5LCAgICAyMDYsICAgIDE4MSwKKyAgLTQ3MCwgICAxMDA4LCAgIC01OTksICAgLTI4NCwgICAgNzMzLCAgIC04MzYsICAgIDY0OCwgICAtMTM4LAorICAyMDc4LCAgICAzMTMsICAyNDQzMiwgICAgNTQ4LCAgIC00NDEsICAgMTQ0NiwgIC0xNjI4LCAgLTEyMTgsCisgICAtNjQsICAgLTcxNiwgIC0yNDU2LCAgIDE5ODcsICAgLTM1MiwgIC0xMDI1LCAgLTE5NTEsICAgMTMyMCwKKyAgIDM1MCwgICAgNzQ0LCAgIDI1OTgsICAgLTk4NCwgLTE4MzI4LCAgICA2MjIsICAgICAtNCwgIC0xNTcyLAorICAgODkzLCAgLTMwNDMsICAtNDM2NSwgICAgMTI3LCAgICAgLTEsICAgLTIyNiwgIC0xNjk2LCAgIDEzMzIsCisgLTEzNjAsICAgNjc1NiwgICAyNTk2LCAgMTIwNTksICAgIDM3MCwgIC0zNjkwLCAgICA0OTcsICAgIDU4NSwKKyAgMTYxOSwgICAtNzc4LCAgIDkxNzQsICAtMjA0NiwgICAyMjE0LCAgIDIwMDQsICAgMTEzMywgICAxMDY5LAorICAgMTMyLCAgIC0yNTAsICAtMTU1NSwgICAtOTA2LCAgICA1NjEsIC0xMjkwNCwgIC0xMDM5LCAgLTgwMDYsCisgIDE4NzYsICAgMjMwMCwgIC0xMTE2LCAgIDE4OTUsICAgMTc4MiwgICAzNzM0LCAgLTExMDgsICAgMTMzOCwKKyAtMTQwOSwgICAtMjQ4LCAgMTYxMTcsICAtMTQ1OCwgICAgMTU2LCAgLTI2MjYsICAgICA2NCwgIC0xMTk5LAorIC0zNTQ0LCAgIDQyODMsICAtMzM5MCwgICAtNDA0LCAgIDE0MjYsICAgLTkwNywgIC0yNzY4LCAgIC03ODAsCisgICAtMzQsIC0xODY1NiwgICAyMDAzLCAgICA1MTUsICAgMzE3MSwgICAtNjUzLCAgICA3NjIsICAtMzM1MiwKKyAgLTE1NCwgIC0xMTcxLCAgIC00NTIsICAtMTU5MCwgIC01OTM2LCAgICA1MTksICAgMTIxMCwgICAgNTAyLAorICAtNDA5LCAgIDIyNjIsICAgIDY5NSwgICAxMDI4LCAgIDg2NTIsICAgMjUzMiwgIC0yNjM2LCAgIDM0NzIsCisgLTExODYsICAgMTM1MCwgICAtNjUxLCAgIC02MzksICAgODM4MiwgIC0zMjM0LCAgICA2MzAsIC0xMDMyMywKKyAtMjI4NSwgIC0xOTE2LCAgICA4MjYsICAtMTQ0OSwgICAtNzM4LCAgIC0zNDQsICAgMTAyMiwgIC0zMjQ4LAorLTIwOTIxLCAgIC0yMDAsICAgIDU2OCwgICAgLTg0LCAgICA3NzcsICAtMTU3MCwgIC0yNzU2LCAgIDI4MzQsCisgICAgMjYsICAgMzg3OCwgIC0xNzA5LCAgICAxMDEsICAgMTQzMywgIC0yMjM4LCAgICAzMDUsICAgICA2MSwKKyAtMTA0MSwgICAyMzk5LCAgICA2MjgsICAtMTUwOSwgICAtMzg4LCAgICA5NDYsICAgIDczMywgIC0xNTM4LAorICAtNjUwLCAgMTk5MzUsICAgIDQ3OCwgLTEwNjk2LCAgICA4NTAsICAgLTY4MiwgICAgNDQ3LCAgIDIzMTEsCisgICAgMzUsICAtMTI1OCwgICAyMzMyLCAtMTE0MTcsICAgMTc0MywgICAtODM0LCAgICA2NjAsICAgMzE3MCwKKyAgMjM3OCwgIC0yNzM0LCAgIC03NjIsICAtMTE1MSwgIC0xODAyLCAgLTkzMjQsICAgNDYyNSwgICAyMzA0LAorIC0xMTg2LCAgIDExODAsICAgNDg5NCwgICAgNjYyLCAgLTcwNjcsICAgIDg2OSwgICAgNjEzLCAgIDE4MDIsCisgIDQ4MzksICAgMzQxMiwgIC01NDYwLCAgIC04NjIsICAtNDIwMiwgICA3ODc2LCAgLTEwNTcsICAgMjg3MiwKKyAtMTMzNiwgICAxNzMxLCAtMTA3ODgsICAgMTA4OCwgICAzNDMzLCAgICAgNDIsICAgLTkzOSwgICAyNDc5LAorICA2NDI1LCAgICA5OTEsICAtMTYyMSwgICAzMjIyLCAgLTI0NjQsICAgMjk4OCwgICAgLTI5LCAgICA0ODEsCisgMTE2MDYsICAtMjgwMCwgIC04MzE1LCAgIDc2NjAsICAtMzM4NSwgICAxMjE3LCAgIC03MjgsICAtMzY3MCwKKyAgIDY4NCwgIC0yMjk1LCAgIC03MjQsICAgLTU2NywgIC0yMTUwLCAgIC0xMDYsICAtMTkyMCwgIC0yMTQzLAorICAzNDY1LCAgIDE5NjgsICAtMTA4OSwgLTExOTUzLCAgLTI3MDQsICAgMzA0OSwgIC0xMzUxLCAgIDcyMjUsCisgIDU3MjcsICAgLTUyNSwgICAyNjM5LCAgIDE5NTUsICAgMjI1OSwgICA2NDg5LCAgLTE4NjcsICAgMTU0NCwKKyAtMzE5OSwgIC00OTkyLCAgIDI0MjAsICAgNDExOSwgIC0yODYwLCAgLTk1MDUsICAtMjE1MiwgIDEwMjA0LAorIC0xMTMzLCAgLTEyMDEsICAtMTQ2OCwgIC0yOTg5LCAgIDQ2NTgsICAgIDU3OCwgICAxMTE1LCAgICAzNjgsCisgIDE1NzAsICAgLTc3NiwgICAtNTAzLCAgIDE1NTQsICAgMTMyOSwgICAtNjk2LCAgIC03NjAsICAgIDU3NSwKKyAtMTUyNywgIC0zODY1LCAgIDgzNzIsICAtMzM3OCwgIC04MTM3LCAgLTgzOTIsICAtMzQ3MSwgIC0xODU0LAorIC00ODUyLCAgIDUyNzAsICAgLTYzNCwgICAgNjA4LCAgIDEyODksICAtNzY2MCwgICA0OTgzLCAgLTEyNjYsCisgLTIwNzAsICAgLTkwNiwgICAzMjkxLCAgIDI0NTksICAgNDgwNywgIC00MjQxLCAgIDU3NzMsICAtMjI1OCwKKyAtNDUwMCwgICAyNjM0LCAtMTMxNzYsICAgNjQxMiwgICAgMjgyLCAgLTU4NDksICAgIDI5NCwgICAtNjI2LAorICAgODg4LCAgLTEwODgsICAgIDY1NiwgICAgMTkyLCAgIC02MzAsICAtMzQwNSwgLTEyNDY5LCAgIDI4ODIsCisgIDIxODQsICAgMzkyMCwgICAyNzE1LCAgLTY4NTIsICAtMTExMSwgICAgODY5LCAgIC0xNjEsICAgIDM0MSwKKyAgMTg1NiwgIC05NDUwLCAgIDI3MTksICAgLTU3OSwgIC0zODQwLCAgLTg3NjMsICAgMTE1MywgIC0zNTMyLAorICAtNTcxLCAgIC03NjYsICAgODMwMSwgICAyOTM2LCAtMTA1MDEsICAtMTA3MywgIDEwMDY4LCAgLTI5MzAsCisgIDYzMDgsICAtMjc0NywgICAzMDkzLCAgLTE3MTAsICAtMzg2NSwgIC0xNDY0LCAgLTQ0NDcsICAgIDQ0NiwKKyAgIDg5OCwgICA1Mzg2LCAgLTEwNzQsICAtNDY1MSwgICA2MjA1LCAgICA0NTUsICAtMTc3MywgIC0xMjcwLAorICA2OTg2LCAgLTI0OTMsICAgNDA3NiwgIDEwNjA1LCAgLTI1MjIsICAgIDk3NywgICA0MDk4LCAgIDExNTMsCisgIC00MzQsICAgNDA3MSwgIC0yODkwLCAgIDI5MjAsICAgOTE3NSwgICAyMjc2LCAgIDQ2OTksICAgIDY0MiwKKyAtMTA2NywgICAtOTY4LCAgICA1MDgsICAtMTc1MiwgICAgNzI4LCAgIDMyNjAsICAgLTUwMCwgICAxNDE0LAorICA1NTU0LCAgIDI3NjEsICAgMTk3MywgIC00NzA0LCAgIDIxMjcsICAgMTM5NywgIC0xMDcwLCAtMTQ1MzYKK30sCisKKy5jYjIyMjRsMCA9IHsKKy0xMjQ1MSwgICAgMzg5LCAgICA5MTcsICAgMTIzOCwgICAtNjI2LCAgIC05MDQsICAtMTg3NywgICAyMzI4LAorLTEyODA4LCAgLTEzNDUsICAgIDQwNiwgICAgIDgwLCAgICAzODMsICAtMzg0MSwgICAxMTg4LCAgIC05MDcsCisgIDIzNjksIC0xMzQwOSwgIDExMTkxLCAgLTI1NDcsICAgLTUzMiwgICAgNzYyLCAgLTE2MjcsICAgIDY4MCwKKyAtMjMwNSwgICAtODExLCAgLTExMTgsICAgMzIzMiwgICAzNDEzLCAgLTIwMTAsICAgLTQ1MywgIC02ODE2LAorIC00MTAwLCAgIDE2NDMsICAxMTIwOSwgICAgOTMzLCAgLTIyNzIsICAgMTQ0MCwgIC0yNDY1LCAgLTY4NjIsCisgICAxODYsICAgMTU2MywgIC04NDY4LCAgLTE4MzIsICAtMTE2NiwgICAtNTk2LCAgIC0zMjYsICAgIDEwNSwKKyAgLTExNSwgICAtMzUyLCAgIC02MjQsICAzMTYyMSwgICAgMTI5LCAgIC0zMDEsICAgLTYxNSwgICAtMzEzLAorICAtMTc2LCAgICA2MjAsICAgICAtNSwgIC0xMzU0LCAgLTM1NjMsICAgIDY3OCwgICAtMzAxLCAgICA2MjEsCisgICA5MDQsICAgLTc2OSwgIC0xMzE0LCAgIC05NTYsICAtMjI5NCwgICAtMzYyLCAgICAzODEsICAtMjM5OCwKKyAxNzA4NSwgICAgMTAwLCAgIDM5NjIsICAgLTgzMCwgIDE4NzA1LCAgICAyMzcsICAtMTI5NiwgICAzNTM0LAorICAxNDUyLCAgICAyNTksICAgMTY5MCwgIC0zMTA2LCAgLTM2MjQsICAgLTMxNiwgICAgLTE2LCAgIDU5MDAsCisgIDIxOTUsICAtMTAwOCwgIDE0MzM1LCAgMTQxNzMsICAtMTYzNywgICAxMTMwLCAgIDExMTAsICAgIDQ5OSwKKyAtMTUxNiwgICAgNTAwLCAgIC03MjAsICAgLTQ5NCwgIC0xMDEwLCAgLTEyNjQsICAgLTc3MywgICAxMzg5LAorICAgMjEyLCAgIDgwMzYsICAgIDc4MCwgICAgNjA4LCAgIC00MTUsICAgIDkzMSwgICAtMzAxLCAgLTIxODYsCisgIDIyNTYsICAgLTcwNiwgIDEyOTcyLCAgLTM0NjEsICAtMzY5NSwgICAyMDczLCAgLTI3NjgsICAtMTUyNSwKKyAtNzUzOSwgICAtNDQxLCAgIC03NTMsICAgNDU1OCwgIC04MTcxLCAgLTE3NTEsICAtNjg4NSwgICA0MDc3LAorICA2NzE0LCAgICAgNTMsICAgMTA5MCwgIC0zMDA2LCAgIDM2ODgsICAtMTE2MiwgICAgLTU5LCAgICAzMDIsCisgICA5MjgsICAgLTQ1MCwgICAgMjM4LCAgMTA4MDksICAgIDM1MywgICAgNjk4LCAgIC00NzYsICAgIDE3MiwKKyAtMjE5OCwgIC00Mzc3LCAgLTc1MTgsICAgMTYwNSwgICA2MzQ4LCAgIDUxNDcsICAgLTE2NSwgICAgMTY1LAorICAtNDYzLCAgICAtOTMsICAgMTI1MSwgICAgNjcxLCAgICA1ODcsICAgLTQwMiwgICAtMjI3LCAgIC00NjIsCistMjc5NjAsICAgIDIxNSwgICAgLTU2LCAgIC05NTgsICAgLTY1NywgICAgNTA4LCAgICAgOTgsICAtMjgxMSwKKyAtMTQ0MywgICAzMDc2LCAgIDYyMTgsICAtOTc2MCwgLTEwNDY1LCAgIC03NzAsICAgIDM0NSwgICAzMDc2LAorICAtMTE2LCAgLTI4ODQsICAgMjIxNSwgIC0yNjUyLCAgIDEzMDYsICAgMjYzOCwgICAtMTI0LCAgIC0zMTcsCisgICAzNjYsICAgMTQ2MSwgICAtMjk1LCAgIDUwNzMsICAgIDQ2MCwgICAxOTIwLCAgMTIyMTYsICAtNzAzMiwKKyAgNjgxNiwgICAzMDM3LCAgLTI2MzAsICAtMTA4NywgIC0xMzE1LCAgICAxMjMsICAgLTU4MiwgIC0yMTM3LAorICA1MDYxLCAgICAyOTEsICAgMTc0MCwgICAtMjE0LCAgIDE5MjAsICAtMzQ3MCwgIDEwODk1LCAgIDk0OTEsCisgIDM1NTgsICAtMTI1NiwgICAtNDQ4LCAtMTAzMDQsICAtMjM5MSwgICAxODkwLCAgICA0ODQsICAxMTA1NywKKyAgNjYzNiwgICAgNDIyLCAgIDIzMTYsICAtMTY2MywgICAtMzQ4LCAgICA2MzMsICAgMTIwMCwgICAxNzg4LAorIC0xMTI0LCAtMjQ0MzUsICAgIDE0MCwgICAgODY5LCAgICA3MzgsICAgIDIyMywgIC0xNDI5LCAgICA2MDIsCisgICA0MzMsICAgLTE5NiwgIC0xMTI3LCAgLTE5MzcsICAgLTg3OSwgICAtMzEwLCAgIC01NjQsICAgMTAyMiwKKyAtNDM4MCwgICA3MjQ3LCAgLTM5MzgsICAgNDQ2MSwgICAyMjE5LCAgLTg0NjUsICAgOTI2NiwgIC00NTY0LAorIC0zMTY5LCAgLTM0NjMsICAgLTQ3NywgICAgNzQ5LCAgIDI0NjAsICAgLTc3NiwgICAgMjk0LCAgIC0xNzEsCisgIDEwNzIsICAgMTc0OCwgICAxMDAwLCAgIC0yMDgsICAgMTkwOCwgICAtOTk4LCAgLTE4OTgsIC0xMDQ4NSwKKyAgMjM2MCwgLTExOTUwLCAgLTI0MTIsICAtMjYwOSwgICAzODg1LCAgLTI3MzgsICAgMTM0OCwgICAtNTU5LAorIC0xMzQyLCAgIDkzNjYsICAgMTU2MCwgICAtODE2LCAgIDExNzgsICAgIDM0MiwgICAtMTc1LCAgIDEyODYsCisgIDMwMTQsICAxMDY0MSwgICAgMjQ2LCAgIDMxMjgsICAgNjYxOCwgICAtMzA1LCAgMTA5MDYsICAgNjM1OSwKKyAtNDM5NSwgICAxNDE1LCAgICAxOTYsICAxMTEzNiwgICAxNzcyLCAgLTMwNDcsICAgMzMxMywgIC0xMjMxLAorIC0xOTc0LCAgLTMwMjEsICAtMTQ4MCwgIC0xMzQ1LCAgIC04MzAsICAgMTU1MSwgICAyNTIxLCAgIC01MDYsCisgIDc4MjEsICAgNzcxNSwgICA1MDc4LCAgIDgyMTUsICAgMjEwMiwgICAxNTUyLCAgIDIyNDcsICAgMzc2NiwKKyAtMzE1OCwgIC0xODExLCAgICA2MzEsICAgMzk4MCwgICAtMzk3LCAgIDkwMzAsICAtMTI2NywgIC0xOTc0LAorICAxNTM5LCAgIC0zNjAsICAgLTMxNSwgICAgNzk2LCAgLTQ3NDksICAgMjA3NiwgIC0xMDE3LCAgICA3MTcsCisgIDIyOTAsICAxMTIxMiwgICA5MzY1LCAgIDE2MjYsICAgIDM3OSwgICAyMDYwLCAgIDEzMjksICAgICAgNCwKKyAgIC0yNSwgIC0xMzQ4LCAgICA1NjYsICAtMTI2NiwgICAxNjcwLCAgIDIxNjYsICAxMzEyMywgICAgIDQyLAorICAyNDE2LCAgLTIxNzAsICAtNjM4MCwgICAgMTcyLCAgICAzMTYsICAgICA0MCwgICAgMzAwLCAgIC00ODcsCisgICA0MDIsICAgLTIyMCwgICAgODQ2LCAgIC04OTQsICAtMTQxMywgIC0yMjI3LCAgIDE5NjIsICAxOTQ3OCwKKy0xNDc1NiwgIDE0Mzc3LCAgIC01ODIsICAgLTc3MCwgICAtMTg2LCAgLTEwMDgsICAtMTUyMCwgICAtNzIyLAorICAtODg1LCAgIDI2MjIsICAgIDMxMSwgICAtNzUzLCAgICA0ODAsICAgIDUzOSwgIC0xMDExLCAgLTE3NDgsCisgIC04MzIsICAgLTYwMywgIC0yMDE1LCAgICA4NjksIC0xNDg2MCwgICAtNjAwLCAgIDIxMTAsICAgIDQ4NCwKKyAtNTg3NCwgICAxNTMyLCAgIDMyOTAsICAgLTIyMiwgIC00NjcwLCAgICAtMzMsICAgLTc5NCwgIC0yMDYxLAorIC0xMTg1LCAgICAtOTYsICAgIDMzNywgICAgNTE1LCAgLTE4ODcsICAgICAyNiwgIDIwMjgzLCAgIC00NTUsCisgIC03OTksICAgIC02MiwgIC0xMDgzLCAgICAyMzYsICAtMTcyMSwgICAtNTY5LCAgLTEyNTksICAgIDM2MSwKKyAgMTA5MCwgICAtMjI2LCAgIDE0ODAsICAxMzM2NywgICAtNjM4LCAgICA5NDAsICAgMzczNiwgICA2NDE5LAorIC01OTk1LCAgICA4MzAsICAtNjU5OSwgICA0NTQ5LCAgIDE1ODMsICAtOTAwMSwgICAxMTA0LCAgLTEyODEsCisgLTEyNzAsICAgIC05NCwgICAxMTA0LCAgLTIwNzYsICAgIDY1MiwgICAyMjYzLCAgIDE0NjUsICAgIC0yNSwKKyAgOTA0NiwgIC04MTM5LCAgLTI2NDYsIC0xMzIwMCwgICAtNTM0LCAtMTUyNDQsICAtMTQ0OCwgIC0xMzkwLAorICAgNDUyLCAgICA1ODQsICAgLTMxNCwgIC0xMTkyLCAgICA5NTEsICAgIDg4NSwgICAgMzk2LCAgICA3NzYsCisgIDEzMDMsICAgMTI5OCwgICAtNDQ4LCAtMzI2NDEsICAgLTIzNCwgICAgLTYyLCAgICAgMzEsICAgLTE2NCwKKyAtMTA0MiwgICAgLTgyLCAgICAtMjYsICAgLTI3MiwgICAtNTU5LCAgIC0xNjQsICAgIDY2OSwgICAtNTAwLAorICAgNTE2LCAgIDEzNDcsICAgOTYxNSwgICAxMTIzLCAgLTEzNDYsICAtMTg5OCwgICA4MzQxLCAtMTA1ODMsCisgIDIyODYsICAtNTIzMywgICAxNTAzLCAgICA0NTQsICAtMjAyNCwgICA0MjQ4LCAgLTIyOTgsICAtMjExNywKKyAxMzM5MCwgICAtODQ5LCAgIDIwNzgsICAgMTA5NiwgICAtNjUxLCAtMTIyMzIsICAgLTM3NCwgICAtODEyLAorIC0zNzI5LCAgIC04MjksICAgLTE0NCwgICAxMjEzLCAgIC00NjksICAgMTExMiwgICAxMTQ2LCAgICA4MTYsCisgICA4MTgsICAgLTkxMiwgICAtOTY3LCAgICA5MDcsICAgICAxMiwgICAyNDQzLCAgIC03NTksICAtMTgzMywKKyAgLTE3NCwgICAtODM4LCAgICA0ODgsICAtMTU2MCwgLTE4MjQyLCAgIC01NTgsICAgNTUxMCwgIC0xMzE2LAorICAxNzU4LCAgIDM5NTcsICAtNzEzMCwgIC0xMzk0LCAgIDQ5NjIsICAgMzg3MCwgIC0xOTA3LCAgLTkyNDcsCisgIDIyMTcsICAtMzg4MCwgIC00NDEzLCAgIDE4OTMsICAtMzA4NSwgICAtMjAyLCAgICA1OTksICAgMTMwNywKKyAgMTU3NCwgIC0xMDcwLCAgLTI1OTMsICAtMjcyMiwgICA5NTA2LCAtMTAxNzAsICAgMTEwNSwgICA0ODc5LAorICAyMjA4LCAgICAgMzgsICAgNTU5NiwgIC01OTkwLCAgLTMyMDUsICAgICAzNSwgICA5NDA1LCAgIC0yMTksCisgICA2MTgsICAgMTMwOCwgICAgMzUzLCAgIDM0NTcsICAgMTcxMiwgICAgNzE3LCAtMTI5MzcsICAgICAyNSwKKyAgMjE3NiwgIC0yNTkwLCAgLTEyMjMsICAgIDUyOCwgICAxMzE4LCAgIDQ1ODgsICAgNzY3OCwgICA1NzQzLAorIC04NDMwLCAgLTQ0ODcsICAgMTM2NCwgICA4MDgyLCAgLTE3MjcsICAgLTM4NywgICAgNDY5LCAgIDMxNzIsCisgICA0MDEsICAtMjc3MSwgICAgNjk0LCAgMTQ1NTQsICAtMjI3OCwgICAzNjQwLCAtMTEwODQsICAgIDkyNCwKKyAgLTU5MywgIC0zODQxLCAgLTQzMzgsICAgIDIyNywgICAgNzUwLCAgIDI5NzQsICAtMjgzNCwgIC0xNzY1LAorICAyMTMzLCAgLTExODEsICAgNTE0OSwgIDExNzU4LCAgMTE5NDksICAgMzUzOCwgICAyNDQyLCAgIDI4MDEsCisgIDE0NTcsICAgLTgyMiwgIC0zNDE5LCAgLTI0NjgsICAgIDE5MSwgICAtNjQ2LCAgIC05NzUsICAtMTI3MSwKKyAgIDgzMiwgICAzMDg4LCAgIC00OTUsIC0xMDAyMiwgICAxODE3LCAgIDEzMTksICAgLTg4MCwgICAxMzQyLAorIC0xNDQ4LCAgLTM1OTcsICAtMzMxMCwgICA4NzUzLCAgIC0xNjEsICAtNjU1MCwgICAxNDIyLCAgIC02NDAsCisgIC01MDgsICAxMTU0MiwgICAtMjc3LCAgIC0xNjUsICAgIDgzNywgICA3Mzg5LCAgIC05NDIsICAxMTAwOSwKKyAgIC05NywgICAxNTQ4LCAgIDE0MTgsICAgLTQ0NSwgICAyMTA1LCAgIC05NDYsICAtODY3NiwgICA1Mjc0LAorICA4ODQyLCAgICA1NzYsICAtMTM5MiwgIC0xNzM3LCAgLTEyNzYsICAgNTQ5MSwgICAgMzEyLCAgIDM2MjQsCisgIDI4MDYsICAgMjE1NywgICAtNTM3LCAgIDE2NTYsICAgMTk4MiwgIC0xMzAwLCAgIC0xNDYsICAgIDQ2MywKKyAgIDQ5NiwgIDE2NzkyLCAgIC0xNDAsICAtMTc1NSwgICAtODMyLCAgLTIxMjMsICAgLTM5OSwgICA1ODExLAorICAtNzAyLCAgIDI4OTEsICAtMzYzMCwgIC0xODQzLCAgICAzNDYsICAgIDUwOCwgICAtMzY0LCAgIC00OTgsCisgIC01NTgsICAzMjA0OCwgICAtNzQ0LCAgICAgOTAsICAgLTM3MiwgICAgNDMwLCAgICA3MDQsICAgIDg3MSwKKyAgIDEzOSwgICAgNzcyLCAgICA2OTYsICAgLTEwOCwgICAgLTE4LCAgICAzMTAsICAgLTQxMSwgICAtNzk4LAorICAgNDY1LCAgIC0xNjUsICAgLTMyMSwgICAgNzQ1LCAtMjc4NjEsICAgLTc1MiwgICAgNDk5LCAgIC0yMTUsCisgICAxNzIsICAgICAzNSwgICAtMTk2LCAgIC03NzAsICAgIDI3NCwgICAtNTQ2LCAgICAtOTYsICAgLTQ3MCwKKyAtODk3NiwgICA5MTU2LCAgICA1ODEsICAgIDkwNCwgIC00NjQ0LCAgLTc4MDEsICAgMzUyNSwgICAtNjA3LAorICA2NDQ0LCAgIDQwNTgsICAgLTY5NiwgIC0xMTA3LCAgIC02MzIsICAgMTQ3NSwgICAgMTk2LCAgIC05MzMsCisgICA4ODMsICAgMTEwMSwgICAgMjc4LCAgICA0MzMsICAgIDU0NCwgICAtNDk3LCAgICAgIDQsICAtMTg4MiwKKyAgMTUwNCwgICAgNTk0LCAtMzAzODYsICAgIDIxOCwgICAgMjExLCAgICA4NTAsICAgLTk4OSwgICAgMzE5LAorICAtODY3LCAgICAtNDIsICAgIDc1NCwgICAgNDk4LCAgICAtNzAsICAgLTU2MiwgICAgNjYwLCAtMTE1NjEsCisgICAgNTQsICAgIDgwMywgICAgNDI1LCAgICA5NjYsICAtMTAxNywgIC0xMjI0LCAtMTI2MzAsICAgMTgzNCwKKyAgIC00MSwgICAgIDk4LCAgLTEwODMsICAgMzUwOCwgICAxNzUwLCAgLTE3NTEsICAgICA3MiwgICAtNTAzLAorICAgLTM4LCAgMjIyMTEsICAgIDI1MiwgICAgIDg4LCAgICAyMjEsICAgIDY5MCwgICAgIDgyLCAgLTEzNDAsCisgICA1MDgsICAgIDYzOCwgICAgODMyLCAgICA0ODIsICAgICA1MSwgICA3OTU0LCAgIDI3MDIsICAtMTE3NiwKKyAgODgzMCwgICAtMzExLCAgIDI1MzYsICAtNjA3MiwgIC00MTQ3LCAgIDUyMzQsICAgIDQ5NCwgICAtMTU3LAorIC0xMjg5LCAgLTU2NzgsICAtMTYxNywgICAxNTA4LCAgIC0xNDAsICAgIC01NSwgICAgNzEzLCAgICA0NDAsCistMzI1ODMsICAgIDEwNSwgICAtMzk0LCAgIC02MTMsICAgLTk3MiwgICAgNTc4LCAgIDExMjIsICAgIC0zMiwKKyAgIDExNCwgICAtMjI4LCAgICAzNDIsICAtMTIzNywgICAxMTIzLCAgIDExMjYsICAgLTE4OCwgICAtMTA2LAorIDExMzA4LCAgLTM3ODcsICAgIDU2MywgICAzNDIzLCAgLTk5MjYsICAgMTYyMywgIC0yNTUxLCAgLTE0NDgsCisgLTQxMjUsICAgIDkxOCwgIC0xMzY2LCAgIC00NzYsICAgIC02NiwgICAgICA0LCAgICA3NjEsICAgIDE2NCwKKyAgIC02MSwgIDIwNDQ1LCAgICAyMzgsICAgIDI5NiwgICAgNDkyLCAgLTExMjYsICAgIC05OCwgIC0xMjAxLAorICAgIDE0LCAgLTE4NDAsICAgLTg2NSwgICAxMTc4LCAgIC04NjksICAgIDEwNSwgICAgOTA3LCAgICAyNDgsCisgIDE1MzgsICAgMjk5MCwgIDExNjkxLCAgIDc3ODMsICAgMTU2NiwgIC02NzA0LCAgIDIzOTcsICAgIDU5NCwKKyAtMTgyNSwgICAtMzgzLCAgIDQyNjQsICAgMTkxMSwgICAgNDY4LCAgIDEwMTgsICAgLTY3NiwgIC0yNjc2LAorIC03NzU2LCAgLTI2MjMsICAxMDcwNSwgICAyNzEwLCAgLTgwNzgsICAtNTI1NiwgICAxNjk5LCAgLTIxMDAsCisgIC0zNTUsICAtMjA4NiwgIDEwODI4LCAgICA2MTEsICAgICAxOCwgICAtODMwLCAgICA5NzgsICAtNDE4MSwKKyAgMTMyNCwgIC01MjYyLCAgIC0zMjcsICAgMTc5NiwgIC05Nzc3LCAgIDEzMDYsICAtMTkzNCwgIC04OTMwLAorICA5NTIwLCAgLTIzNjQsICAtMzk5NywgLTEwMjA5LCAgLTYzMjYsICAgMTM5NCwgIC0xNzU4LCAgICA4NjgsCisgIDExOTIsICAtMjkxNiwgICAgLTIzLCAgLTE1ODYsICAgLTI5NiwgICAgNDM4LCAgIC0yNzksIC0xNDE3MSwKKyAtMTU1NCwgICAtMjA2LCAgIDIzODMsICAgIDUwNiwgICAxMTgxLCAgIDgyOTgsICAgLTQ5MSwgIC0yNzcxLAorIC00Mjg2LCAgLTcxMTYsICAtMTY4MCwgICAgNTA2LCAgIDE3MjksIC0xMjk2NSwgICAtOTI1LCAgIC05ODUsCisgICA0MjAsICAtMTc0NiwgICAtMjY3LCAgIC00NzgsIC0xMTc2MywgIC0xMDMwLCAgICAxODcsICAtMzg3OCwKKyAgMTUxNiwgICAyNDcyLCAgIC0zNzEsICAgICAyOSwgICAgODA5LCAgLTE3MDAsICAgLTE1MiwgICAgNTYwLAorICAxODMzLCAgMTQzOTcsICAgIDk2OCwgICAgLTk2LCAgLTMyNDIsICAtMjQ5NywgICAgLTc2LCAgIDIwOTYsCisgIDk1OTMsICAtMTIwMCwgICAgNDQ2LCAgIDE1MDUsICAgODA1OCwgICAxNzIyLCAgICA1MDEsICAgIDkyMywKKyAtMTE3MSwgIC05NTE2LCAgLTI1MzYsICAgNzM2OCwgICAgIC0yLCAgLTUzMDQsICAtMjQ0MCwgICAtMzUyLAorICAgNTEwLCAgICAzMjAsICAgIDMwMSwgICAgMTIwLCAgICA2ODcsICAgLTk0MiwgICAgMTM3LCAgICA4MjQsCisgIC0zMTYsICAgMTMxMiwgICAgNTEwLCAgLTExMzMsIC0yNzQ0OCwgICAtNDA0LCAgIDEwNDEsICAgIDI3MgorfSwKKworLmNiMjIyNGwxID0geworLTE0ODQwLCAgLTEzNjEsICAxMjczMywgICAgNzk4LCAgIC00OTYsICAgMTY5MSwgIC0xNjY4LCAgLTE3MzAsCisgICA5MjgsICAtMzIzMywgICAgMzM4LCAgIC01NzgsICAgIDE1NiwgICAgNzg0LCAgIC03ODcsICAgLTI0MiwKKyAgLTYxOCwgICAtODUzLCAgLTEyODIsIC0xMTc2NiwgICAzOTcwLCAgMTIxNzgsICAtMjAzNCwgICAgMjQ0LAorIC0zNDExLCAgICAzMDAsICAgIDE1OSwgICAzNDk0LCAgLTMwNjAsICAtMTQ1OSwgIC0yNDg0LCAtMTA2ODAsCisgICA3NTIsICAgIDIyNywgIC0xNjEyLCAgIC05MjIsICAgLTU0OSwgICAgMTU4LCAgIDIyNjAsICAtNzY0MCwKKyAtNDQ3OSwgIC00MDc1LCAgLTI0MTIsICAtNzcwNywgICAgNjAwLCAtMTIzNTgsICAgICA5MywgIC0xNjY2LAorICAtNzk1LCAtMTMwNjAsICAgICA2MSwgICAgNTExLCAgLTIxMDIsICAtMjEyMiwgICAgMzY0LCAgIC0xNTcsCisgIDIzMTAsICAtMTU1MiwgICAxMjYwLCAgICAxNTgsICAgOTUwMywgICA3MDUwLCAgICAgIDcsICAtNTkwMiwKKyAtNzA5OCwgICAgNDQ0LCAgIDM3MzYsICAtMTgzNiwgICAzMTA5LCAgLTIzMjgsICAgIDQ1NywgICAtODcxLAorICAtMzI3LCAgIC03ODAsICAgIDY2MSwgICA4Njg0LCAgIDI1MzAsICAgLTI2OCwgICAgOTU0LCAgIDEzODAsCisgLTEwMjksICAgIDQxOCwgICAtMTM2LCAgLTM1MTUsICAgMTk1MywgIC0xNjg4LCAgLTg2MjMsICAtMzI5MiwKKyAgNzc1OCwgICAyNzk2LCAgMTE2NDMsICAgLTkzMSwgICAtNTAxLCAgIC04NzMsICAgLTQ0NCwgIC0xMzQyLAorLTEzOTAwLCAgIC0yNDYsICAgLTI4MywgIC0xNzc5LCAgICA5OTgsICAtMTMxOCwgICAgNDA4LCAgIDE1MDUsCisgIC00NjIsICAxMDY2NywgIC0xODEzLCAgICAgNzgsIC0xNjUxNCwgICAgMzYwLCAgLTIwMjksICAgIDk0MiwKKyAgMTY3NCwgICAgMTcxLCAgICAzMTcsICAgIDI0NCwgICAxMTgzLCAgICA3MjQsICAgIDc2MCwgICAxNjM0LAorICAgODYzLCAgICA3OTMsICAgIDEyNiwgICAtMzI2LCAgICA5ODAsICAgLTYyOSwgIDIyMjE5LCAgIC02NDksCisgIDEyNzQsICAgIDcxNywgICAxMzU1LCAgLTE4NTMsICAtMTc5MiwgIC0xMDE3LCAgLTIxMDQsICAgLTc2OCwKKyAtMTcwOCwgICAyMzAyLCAgIDIzNTMsICAxMTE2NywgIDEwNzM0LCAgLTM0MTIsICAtMjI2NiwgICAgIDc1LAorICAtMTA0LCAgICA0MjUsICAgLTg4MCwgICAyMDcyLCAgIDI5MzQsICAgLTkzMCwgICAgMjcwLCAgLTI0MTQsCisgIC05MjUsICAgMTAyMywgICAtNzQ2LCAgIC0yMzYsICAtMTYyMCwgICAgODI1LCAgIDEzMjQsICAgLTEwMSwKKy0xOTM0OCwgIC0xMjkxLCAgICA1ODUsICAgMjE2NSwgICAyODkxLCAgIDM2NjIsICAgLTU3NywgICAxODAwLAorICAgNDA4LCAgLTE0ODYsICAgIDEwNywgICAgMzUxLCAgIC0zMTksICAgMTEwNCwgICAgOTU2LCAgICA0MDMsCisgICA2MjgsICAgLTI3NywgICAgLTU3LCAgICA5MzgsIC0zMjc2OCwgICAgLTcxLCAgIC00NDEsICAgLTIwOCwKKyAgIC0zMiwgICAgMTkxLCAgICAzMTQsICAgLTE3MSwgICAgNjEzLCAgICA3NDksICAgIDg0NCwgICAtNDcyLAorICAtNDQ0LCAgICA5NTIsICAgICA0MiwgIC04MDI2LCAgIDI3MjAsICAgMTkxMSwgIC0yNzgwLCAgMTIzMTEsCisgIC0xMjIsICAgMzU2OSwgICAgLTkxLCAgIDYwNDgsICAgLTc3NiwgICAxNjk0LCAgICAtNjMsICAtMTI3MiwKKyAgMzU4MSwgICAxNjIyLCAgIDI1MzgsICAgIDE5MCwgLTEzMTA4LCAgIC04MjAsICAtMzA1NiwgICAxMTg5LAorIC0xNDI4LCAgIC0yNDQsICAgLTc1MiwgIC02MTg3LCAgLTM0NzMsICAgLTY5NywgICAxMzY4LCAgIDEwNDMsCisgIDc3MDIsICAgIDM1MiwgICAtMTQwLCAtMTI5OTksICAgIC04MCwgIDEyNjcyLCAgLTE0NzMsICAgMzExMywKKyAgMTUwNSwgICAgNjY3LCAgIDIzOTIsICAgMTc2NywgICAgNTM3LCAgIDE5NDksICAgIDY1NywgICAtMTMwLAorICAgOTgwLCAgIDE3NDMsICAgODI2OSwgICAyMzgwLCAgLTIzMTEsICAgIDE5NywgICAtNjUxLCAgIDI1MzEsCisgICA1NTMsICAtMTExNywgICAtMzk2LCAgICA0NzIsICAgNDU2NSwgLTEyNjcyLCAgIDIzMjIsICAgLTM2MCwKKy0xMjc2NiwgICAyMjA1LCAgLTI2NTEsIC0xMDY5MCwgICAtMjE4LCAgICA1ODYsICAgNTIyOSwgICAgIDM0LAorICAgIDU5LCAgIDE3MzAsICAgMTIyNiwgICAyMTA2LCAgIDQwMDgsICAtMTg3OCwgIC05NTIwLCAgLTEzNjYsCisgLTExNzQsICAgLTI5MCwgIC0xMDM3LCAgIDE2NDIsICAgMTIzNCwgICAgMzA1LCAgLTEyNzksICAgLTY0MiwKKyAgMTEyNiwgLTEzMTk5LCAgICAtMjksICAgIDY0MiwgICAyOTI4LCAgIDE5MzYsICAgLTI2MCwgICAgNTg4LAorIDExNjkwLCAgIDkyODIsICAtMzM2MiwgICA3NzMyLCAgIDEwNzMsICAgMjczOCwgICA0Njg4LCAgLTE1MDcsCisgLTE0NjEsICAtMjI3MSwgIC0xMTMxLCAgIDE5NjksICAtMjE1MiwgICAxNjM3LCAgIC03NzQsICAgICA2NiwKKyAtMTE5MCwgICAtMjA2LCAgIC00OTEsICAtMTA4MCwgICAgNjQ0LCAgIC0zNzgsICAgIDM2NywgIDE3OTgwLAorIC0xNTgzLCAgIDIxNjIsICAgIDkxOCwgICAtMTIxLCAgIC00MzIsICAgIDExNSwgICAgICA1LCAgICA3OTEsCisgIDE5NjgsICAtMjI4NywgIC0xNTc0LCAgLTk1NDUsICAxMTE0NiwgICAzNTQwLCAgLTQ3MDAsICAgLTUxNSwKKyAtNDU0OCwgICAgODgxLCAgICA1OTEsICAgMTA0NCwgICAtMjU5LCAgIC05NzgsICAgICAgMiwgICAgMjMyLAorICAgNzc4LCAgIC0xOTgsICAtMTE2MSwgICAtMzc4LCAgICAtODMsICAgIDQyMSwgICAgMjgyLCAgMjY1NjQsCisgIC04MDEsICAtMTYyOCwgIC0xOTgzLCAgIC0zMDEsICAgIDkzMSwgICAgODg2LCAgIDIxOTYsICAgMTQ1MywKKyAgIDc1MiwgICAyOTU2LCAgLTM0NzgsICAgIDQ5MCwgIC0xNDIwLCAgMTMzMDMsICAgMTI5MywgIC05NDY2LAorICAgNDYyLCAtMTI4MjksICAxMTEzMCwgICA4MDYxLCAgICA1OTMsICAgMzY5NywgICAtNjExLCAgIC01MzQsCisgIC02OTgsICAtMTE0OCwgICAxNTk4LCAgICAyOTMsICAgLTcyNiwgICAtNjk4LCAgICAyODksICAgIDE4MCwKKyAgIDg3NiwgICAtMzY5LCAgICAtNDMsICAgIDIzNCwgLTIxNjI5LCAgLTE0NDgsICAgLTc1MywgICAtNDgwLAorICAgOTU2LCAgICA5OTQsICAgIDUzMSwgICAtOTE2LCAgICA2MzAsICAgIDcyMCwgIC0yMzAwLCAgLTk1NDQsCisgLTE0MTgsICAgIDk5MywgICAyMTMwLCAgLTIzNTksICAgMjQ2MCwgICAtMzM5LCAgIC0yNzcsICAgMTU3NywKKyAxMjIwNiwgIC0zNTA3LCAgLTEyODAsICAgMTkzOCwgICAgODcxLCAgLTE4NTAsICAgLTgwOSwgIC0zMzY0LAorICA2OTE4LCAgIDExMzQsICAgNTAxMCwgICA4NzcyLCAgIDIxMDMsICAtOTc3NSwgIC0xNDA0LCAgIDUxNDgsCisgLTE0OTQsICAgMTU0OSwgICAxNzYxLCAgIC04MTIsICAgIDY1NCwgICAtNjExLCAgICA4MjIsICAgLTIyOSwKKyAgLTM4NCwgIDEwNDY2LCAgIC0zMzcsICAgMjIwNywgICAgMTMxLCAgIDI4MTgsICAtMjkyNSwgIC0zMzc0LAorIC04Nzg2LCAgLTg1NTIsICAtMjI4MiwgICAgIDg4LCAgLTEwNTgsICAgODU3MSwgICAyOTAwLCAgIC01MjksCisgLTE1NjksICAgMTg4MiwgICAtOTgxLCAgICAyMDQsICAgMjk1NSwgIC00MjI3LCAgIDQxOTYsICAtMzA0MSwKKyAxMDgwNCwgICAxODIyLCAgICAgODIsICAgMTkzNiwgICAyMzgwLCAgMTI5OTIsICAtNTY1OSwgIC0zNDQ5LAorICAxMzI5LCAgLTE2NjgsICAgMTI5MSwgIC0xNzI2LCAgIDgzMjgsICAgIDMxNCwgICAyNzM3LCAgIC02NzcsCisgIDIzODQsICAgLTkxMCwgICAtODc4LCAgICA2ODcsICAgIDY0MCwgICAtNzIxLCAgIC05MTIsIC0xMjc3MiwKKyAtMjA3OSwgICAtMzk4LCAgLTE3ODgsICAtMjUxNiwgIC04NzExLCAgLTEwMzgsICAgLTk4NSwgIC03MTUxLAorIC05MDU3LCAgICA4OTAsICAgIDQ1OSwgICAtMjk4LCAgICA5MTgsIC0xMDA2MSwgICAgODQ4LCAgIC03MTYsCisgIDE4MjIsICAgIDgzNiwgIC05NTE2LCAgIC05ODUsICAtMTM3OSwgICAtNDA5LCAgLTIyMzcsICAgMTAzNiwKKyAtMTA4MiwgIC0xNzA0LCAgIDEzMzMsICAtMTQzMiwgIDExNDYzLCAgLTIzNTUsICAtNTk3NSwgIC0xNjc0LAorICAtNjQwLCAgIC01NTQsICAgODM1MiwgICAyNzMyLCAgLTUyNTEsICAgNDI0MywgICAtMzU0LCAgIDM2NjIsCisgIC01OTIsICAtOTMxNywgIC0xMjA1LCAgLTEwODQsICAgLTk5NSwgIDExMjg4LCAgLTIwOTgsICAtMTYyMCwKKyAgMjM2NywgIC0xMjg2LCAgLTUzMTIsICAgIC02NCwgICAgNTQwLCAgLTIzMjcsICAtMjcwMywgIC0yMDEzLAorIC04NjQ5LCAgLTEzMDYsICAgLTk0OCwgICAxNDQzLCAgICA2NjQsICAgMjQwMCwgICA0NzA2LCAgIDQwNjEsCisgICAzODcsICAgIC0yMCwgICAxODU5LCAgIDkyODMsIC0xODE3NSwgICAgODA2LCAgLTE0MDEsICAgMTI1MywKKyAgIDU5NiwgICAyMTc2LCAgLTE2ODIsICAgMjIwOSwgICAgNzMzLCAgIDE0MDQsICAtNjY1MiwgICAyNzU0LAorICAgOTUwLCAgIDIzNDYsICAgMzYyOSwgIC02ODc1LCAgIDUwNjksICAtOTMwMiwgICAxNDcyLCAgICA5NDIsCisgIDExODQsIC0xMDQzMiwgICAgOTYwLCAgIDM5ODcsICAgMTk4NSwgICAgNDIxLCAgICAzMDAsICAgLTcxNiwKKyAgIDkzOCwgICAgNTAwLCAgIC0xNjAsICAgIDIyNiwgICAgLTg3LCAgLTE2NDgsICAtMTg1NywgIC0xOTc3LAorICAtMzIzLCAgIDIzMDUsIC0xMzg0MywgIC00MTQ4LCAgLTI5NzgsICAgNTQzMCwgIC0zNDIyLCAgLTExMzgsCisgLTIxNDYsICAgMTU0OCwgIC0xNDMwLCAgICA3MzQsICAgLTMzOSwgICA4NTk4LCAgLTQ1NjgsICAgLTQ5NiwKKyAgIDQ3NywgICA0OTY5LCAgIDI1OTMsICAgMjg0MiwgICA4NjQ1LCAgLTIzNjUsICAtNzQ1NSwgIC0yNjg3LAorICAgMjQ5LCAgIDc1MTYsICAgIC01MywgICAgMjE5LCAgIDExMzksICAgLTY2OCwgICAgNTY2LCAgIC01MjIsCisgIDEyODksICAgICAzMywgICAtMTQxLCAgIC05MjAsICAgMjUyNiwgIC0yNzk3LCAgMTY0NTYsICAtMjAwMCwKKyAgLTc1OCwgICAtMTk0LCAgMTA5ODQsICAgIDE4NywgICAxNjg2LCAgLTQ3OTksICAgOTY3MSwgICAxODM4LAorIC0xMjI0LCAgIDEzMjUsICAgIDY1NiwgIC01NDM0LCAgIDMyMDcsICAgMTgxMywgICAxODMzLCAgMTQzNzUsCisgMTIyNTksICAgIC05NSwgICAtNTM2LCAgLTE3NDYsICAtMzU2OCwgICAtNDQyLCAgICA5NjQsICAtMTQ3MiwKKyAgMTM0NSwgICAyNjkyLCAgIC01ODksICAgIDUyMCwgICAgNjE2LCAgICAzNTcsICAgIDMyNiwgIC0xMzYzLAorIDI4NjAzLCAgICA3MDAsICAgIDQ3MywgICAtOTA4LCAgLTExMjksICAgMTA0NiwgICAxMTA2LCAgIC00NzEsCisgIC00NzIsICAgLTk4MCwgICAgIDI5LCAgICA1NzQsICAgLTM1MCwgICAtNTQ1LCAgIC01ODUsICAtMTkzNiwKKyAgIDI3OSwgICAgODgyLCAgIC04ODAsICAgIC01MiwgLTMwNTUyLCAgICAzNzEsICAgLTE1NCwgIC0xMjc1LAorIC0xOTE0LCAgICAxMDQsICAgLTExMCwgICAxMTIyLCAgIC03MTksICAgIDcyOSwgICAtNzQzLCAgICAzNjAsCisgICA3NjYsICAgIDE5OCwgLTExNjc0LCAgICA2MTIsIC0xMDYwMiwgICAxMTU3LCAgICAxODYsICAtMzEzMiwKKyAgMzA3MCwgICAxNTM1LCAgICAxNTUsICAgIDc3NCwgIC05NDMyLCAgIDQ5NjYsICAtNjcxNywgICAgMzIwLAorICA1MTY3LCAgICAxMTIsICAgMjcyNywgIDExMjI4LCAgIDEzNjgsICAgMTg2NCwgICAxMTk3LCAgLTE1MTksCisgIDE1MDQsICAxNzg2MywgICAgIDQ5LCAgIDIyMTIsICAgIDYxMSwgIC0xNzg4LCAgIDI5MzIsICAgIDM5NSwKKyAgICAzMiwgICAtNTY2LCAgIDI0MjUsICAtOTQ1NywgICAgNjczLCAgICA2NzAsICAgLTI0NywgICAxNjE3LAorLTEyNTc4LCAgIDE0MDgsICAgIDQ2MiwgLTE0OTM1LCAgIDE0MzgsICAgLTgwOCwgIC0xODUwLCAgIC03ODQsCisgIDE4NTYsICAtMTY0OCwgICAgNzY3LCAgLTE0NTIsICAtMTY1MiwgIC0xNjIxLCAgIDEwMTYsICAgMTQyOCwKKy0xMTIwMywgICA0MjE3LCAgLTY0MTAsICAgMjU3MCwgIC0xMDE2LCAgLTE3MjAsICAtOTAzNiwgICAtMzkwLAorICAgIDYyLCAgLTEyNDUsICAgMzAyNywgICAtMjU1LCAgIDE2NDYsICAgMTM1OCwgICAtOTA3LCAgIC04NjQsCisgIC0xMTgsICAgIDg3NCwgICAgMjY4LCAgICAyNTIsICAgIDEwNCwgICAtOTI2LCAgIC01NTIsICAtMTIwNiwKKyAgIDk2NSwgICAtMjA4LCAtMjQ0NzIsICAgIDg5MCwgIC0xNTE2LCAgIC02MzAsICAgLTg4NSwgICAtODA0LAorICAtMzc0LCAtMjI1MjAsICAtMTE0MywgICAtNzc3LCAgICA1MzIsICAgIDE4NSwgICAgNjAzLCAgIDE3NzUsCisgLTE4ODcsICAgIDQxMywgICAtNDU4LCAgLTEwMzYsICAgLTIxMSwgICAyNjkzLCAgIDY5NzYsICAtOTQ5OCwKKyAgMTQzNywgIDEwMTYzLCAgIDI0NTAsICAtMTU3NCwgICA0OTQxLCAgICA4ODQsICAgLTQ3MCwgIC0zMzY2LAorICA0NjY0LCAgICA0MjAsICAgLTU2OCwgICA1NzAzLCAgICAgMTAsICAtMTY5MiwgICAgMTQzLCAgIDE1OTIsCistMTA5NjYsICAgMjg5MSwgIC0yOTYxLCAgIDM5MzgsICAgMTk5MCwgICAxNzI2LCAgLTUyNDcsICAgMzMyNiwKKyAtNjU3NSwgICAgNTg0LCAgIC0yNzcsICAgLTQ0MSwgICAxNjc5LCAgIC01MjAsICAgMTMzOSwgICAxMDc3LAorLTExNDYyLCAgIC0yNjcsICAgLTM1MSwgICAgMjAxLCAgMTA5MzksICAgNDE1MCwgICAzODkwLCAgIDE0ODQsCisgIDI2MTUsICAgLTY3NiwgICAtNDQ4LCAgIDIzMTYsICAtMTI3OCwgICA5NzM0LCAgLTMwMzksICAgMjg0MSwKKyAgIDk2NCwgIC03NTU3LCAgICAxNTYsICAtNzIyOCwgICAtMTIwLCAgIDU1MzMsICAtNDMyMiwgICAxNzk2LAorICAyNTU1LCAgLTk5MTIsICAtMzAzOCwgICAyMjM2LCAgIDExOTAsICAgIDIyMiwgIC0xNjg0LCAgIDMyNzMsCisgLTE3NjgsICAgNjIzMywgIC02NDQyLCAgIDg1NDUsICAgIC00OSwgICAgLTQ1LCAgIDIzNjYsICAgIDI5MywKKyAgIDMwOCwgICAtNjg5LCAgICAzMDgsICAgIDM2OCwgICAtNDUyLCAgIDExMjUsICAgMjMyNiwgIC0yMzM1LAorLTE3NzkzLCAgIDIwMjcsICAgLTc3OSwgICAgNzM0LCAgLTIwMzIsICAgMTI0NiwgIC0yODk4LCAgIDQxNzQsCisgICAtNzQsICAgIC00MCwgIC0zMTA1LCAgLTIxMzUsICAgIDk5NiwgLTEyNzE0LCAgIDM2MTQsICAgNDkzNiwKKyAtMTkyOCwgICAxNTI4LCAgLTQxNTgsICAtMTc5MSwgIC0yMzE4LCAgICA5MDcsICAgLTMyNiwgIDIyNTEzLAorICAtNjYwLCAgIDEwMjIsICAgIDQzNCwgICAtNTY0LCAgICAgMjgsICAgLTExMiwgICAgMjUyLCAgICAzNzIsCisgIC04NDIsICAgICAtMiwgICAgNjQ4LCAgIDIzMjMsICAgLTYxNCwgIDIzMzc3LCAgIC0yNjMsICAgIDQ4NiwKKyAgLTQwOCwgICAtMzYyLCAgIC04MjEsICAgLTcyNCwgICAgOTcyLCAgIDEyNDgsICAgIDQ0NCwgIC0xNzQxLAorICAtNDIwLCAgLTEzNzEsICAgMTA4OCwgICAtNTY1LCAgICAgMjIsICAgLTM5NCwgICAgLTY0LCAgIC0yOTIsCisgIC0xMDMsICAgLTUwMSwgLTMwNTEwLCAgIC0yOTQsICAgLTI2NiwgICAgNDMzLCAgIC03MDAsICAgIDc0MiwKKyAgLTc1NiwgICAtNDA3LCAgIC05NjEsICAgLTE0OCwgIC0xNDE2LCAgLTEwNDEsICAgLTQ4MSwgICAgMTIxLAorICAgMzQ2LCAgMTAyNDAsICAxMjYyOSwgICAxNDc2LCAgLTI2NDcsICAgMTM1MCwgIC0yMDEyLCAgIC0yNjIsCisgLTU2MjEsICAgIDcxNCwgICA0Mzk4LCAgLTI3MzIsIC0xMDQ3MywgICA5ODM0LCAgLTUxNjUsICAgLTk5MSwKKyAgLTU1NywgIC0yNzMzLCAgLTM0NjAsICAgNTc3OSwgICAgNjU5LCAgIDE0NzIsICAgMjAyOSwgIC0yMzM5Cit9LAorCisuY2IyMjI0czAgPSB7CistMjc1MjIsICAgMjYyOCwgIC0yNDg2LCAgICAyNzcsICAgIDg3NCwgIC0yMzUxLCAgIDI3MjUsICAgIDkxNSwKKyAgIDk5NCwgIC0xMjA5LCAgIC00MzksICAgMjkzNiwgICAgIDQ2LCAgIDEwMTQsICAtMTgxNiwgIC0zNTYxLAorLTE0Mzg2LCAgIDMxMTMsIC0xMDQwMCwgIC0xMDI1LCAgIDIxMTQsICAgMTMyOCwgICAtMjc4LCAgIDExODIsCisgLTE4MjAsICAgMzkyOCwgIC0xMDYyLCAgIC0yODIsICAtMTMyNywgIC0xNDY4LCAgIDU5NzUsICAgMjM0MiwKKyAgLTYzMCwgIC00MjE3LCAgMTAxMTYsICAtMTI1NCwgIC0yNjQ2LCAgLTUyMTAsICAtOTk0MiwgICAxOTA0LAorICAgIDIxLCAgICA1MDQsICAgMjMyNSwgICAxNDQzLCAgIDY0NzAsICAgMjU5OCwgICA4MTMwLCAgICA4MTAsCisgICAzMDQsICAtMTA1OSwgICAtNjQ1LCAgMTQ2MzQsICAtMzE5OCwgICA0Mjc3LCAgIC02NjksICAtNzE3MCwKKyAgMTU1NCwgIC0yMzIxLCAgIDIzODYsICAtMTA3MiwgICAyNDgzLCAgLTQxNDEsICAgMjg0MSwgICAzNDE0LAorICA4MDE0LCAgLTMxNDEsICAxMDg1NywgICA2NjM0LCAgIDMxMzgsICAgMzE5OSwgICAtMzIwLCAgICAgMzYsCisgLTEzNjYsICAtNDEyOSwgICAzMTU3LCAgIDI2MDIsICAgNDI3MywgIC0yNDM1LCAgIDI2NDUsICAgMjk4NiwKKyAtMzcxMiwgIC0zOTk1LCAgLTU0NzYsICAtNDY5MywgIC0xNjY0LCAgIDYzODQsIC0xMTIwMSwgICAxMzIwLAorICAyMTg0LCAgLTUxMDIsICAtMjk4NCwgIC0xNTY5LCAgLTIxMTYsICAtMTUxMywgIDE0Mjg0LCAtMTExODIsCisgLTI5MjUsICAgLTczMSwgIC0xMzIxLCAgLTYzNjMsICAgMTQ4MywgICAzNDYzLCAgIDEyOTIsICAtMjA2NSwKKyAgLTM1NywgICA5MTA4LCAgIDYzNzEsICAgMzg0MCwgIC02OTA1LCAgLTg5MTgsICAgMjkwNiwgIC0xNjU4LAorICAgNzU3LCAgIDE5OTgsICAgLTU4MCwgICAtNzA4LCAgIDIxOTgsICAgMTg2NywgICAgOTYwLCAgIDQ1MjIsCisgIDE4OTYsICAtMTY3NCwgIC00OTQzLCAgIDI2OTUsICAtMjQ2NSwgIC0yMDc4LCAgIDk3NTUsICAtNDg1MywKKyAtMjYwMiwgICAzNDY2LCAgIDM4OTcsICAtMzYzMywgICA0OTE4LCAgLTIwNDksICAgMzczMCwgIC0xOTgyLAorLTEwMDg1LCAgLTM0NTgsICAtMTg2NiwgICAgIDMyLCAgLTE3MDYsICAgMzY0OCwgICAtMzA4LCAgIC05NDIsCisgLTE2MzAsICAgMTczMCwgICAgNTEyLCAgMTQ2MTIsICAgMzQxNSwgICAgOTc0LCAgIDMwNzksICAgIDc2NSwKKyAgIDg5NywgICAtMjcwLCAgLTE4MTMsICAtMTUzMywgICAxMTE4LCAgLTI4MDUsICAtMjc2NCwgICAxMTMwLAorIC0xNzk4LCAgIDQ1OTQsICAtMzEzNCwgICAgOTY0LCAtMjAwODIsICAgMjU3NCwgIDMyNDUwLCAgLTEzNzksCisgICAgNTIsICAgIDM1OCwgICAtMjI2LCAgIDE5MDIsICAgIDI1NywgIC0xMDcxLCAgIC02NTAsICAgLTM5OSwKKyAgLTM4MSwgICAyMDczLCAgIDIzMTAsICAgMjE2NCwgICA4MjIxLCAgIDE0MzMsICAgLTYyOSwgICAxNDQwLAorICAxMTIwLCAgLTMzNjIsICAtNDY0MiwgICAyMDAwLCAgICAzNzgsICAgMTIwOCwgIC0yNjQ4LCAgIDQ1MzQsCisgIDMzMDcsICAxMzIwMCwgICAyNzgwLCAgIDMxMDAsICAtMzE5NCwgLTEwNjA2LCAtMTE1NjMsICAtNDQ5MSwKKyAgMjIxOCwgIC00NTAwLCAgICA2MjIsICAgMTMxMywgICAyNjgyLCAgIDMwMDMsICAtMTM4NywgIC0zODg2LAorIC0xNTY3LCAgLTQ4NjQsICAxMDg5OSwgLTIwNjA2LCAgLTE2MDYsICAgIC02MCwgICAgNjAyLCAgICAxMjUsCisgIC03MzAsICAtMTExMiwgICAgOTc5LCAgICAzMjUsICAgIC0xMywgICAtMTg1LCAgIDEyNDEsICAgLTI4OCwKKyAgLTU1MiwgICA2MDQyLCAgLTcwNDksICAtNzM1OSwgIC0xNDU2LCAgICA0OTMsICAxMTIwNCwgICAgLTY1LAorIC0yMTcwLCAgLTUyNDgsICAgMjI0OCwgIC0xMDQ2LCAgICA1OTEsICAgMjA4NSwgIC0yODQ0LCAgICAyNDQsCisgLTM0NTQsICAgIDU4MSwgICAxMzE1LCAgIDMwNDMsICAgIDMwNCwgICAtNjIwLCAgICA0MDUsIC0xOTk0NCwKKyAgIDc2OSwgICAxMDc2LCAgLTE0NTYsICAgLTY5NCwgICAyNTYwLCAgLTEwNDYsICAgMjUxNCwgIDE0NTUyLAorICAxNTg2LCAgLTcwMjcsICAtNDcxMCwgICAxMzY2LCAgIDE1NTIsICAgNDM1NCwgICAzMjk2LCAgICA0NjIsCisgICA2MDAsICAgIDUwMCwgICAzMjI1LCAgIDUwODMsICAgLTc5MiwgICAzMTk5LCAgIC02OTgsICAtMzU4OSwKKyAtMjU5NiwgIC0zMzUwLCAgIDI3NTgsICAtMzAxOSwgICA1NjY0LCAgLTkzODcsICAgNDcxNiwgIC0zMTI1LAorICAzMzA2LCAgIDYyNjgsICAgLTU5MiwgICAtNjIyLCAgLTQxNDQsICAtNjI5MCwgICA0OTkwLCAgIC03NDgsCisgIDE4NTQsICAtMTA0MiwgIC0yOTk2LCAgLTQyNzksICAgIDMzOCwgIC0xODY0LCAgLTg2MzksIC0xMTIwOCwKKyAgIDkzMiwgICAtNzIyLCAgIDE3ODgsICAtMTkyNywgICAgNDUwLCAgIDIxOTEsICAxMTgyOCwgIC02NDAwLAorICA1MzY0LCAgLTIyMzYsICAgMzIxMiwgICA4MzQwLCAgLTMyMjksICAtMjg0NiwgIC00Njc2LCAgLTE4MjUsCisgIDI2MjgsICAgLTMwMywgICAtNTg5LCAgIDc3MjgsICAtNDIxNiwgIC0zODY2LCAgLTQ0MDAsICAgLTE5NCwKKy0xMTMxNiwgICA1NjQ2LCAgIDM3MTYsICAgNDgyNywgICAgMjMyLCAgIC01ODMsICAgIDMwOCwgIC0xODMzLAorICAyMTUzLCAgLTI1MDgsICAgIC00NiwgICAgODU3LCAgLTk1ODcsICAgMjc2OCwgICA1MTM2LCAgIDE0NjIsCisgIDUxNDIsICAgNzk5MCwgIC0zNDI0LCAgIDEwNjcsICAgNzQ2MiwgICA0OTQ0LCAgICAgOTgsICAgMTAxNCwKKyAtNDc1MCwgIDEzODI0LCAgIDExMzAsICAgMjMzNCwgICA5MzkzLCAgIDI0MTYsICAtNDUxOSwgICAgIDI3LAorICAyMDAwLCAgICA5MjksICAgLTIwNCwgICAgNDgxLCAgLTI3ODAsICAtMzcyMCwgICAxMjY3LCAgICAyNjksCisgLTUzODMsICAtMTk5OSwgICAxMjQ5LCAgLTQyMzgsICAtOTM1MSwgIC03NDQwLCAgLTU5NjQsICAgNjE1NCwKKyAtNjgyNywgICAzMTEyLCAgLTI2MTMsICAgLTE2NCwgICAxNjA0LCAgIDEyNDUsICAgIC01MCwgICA4NjE5LAorIC00MDQ0LCAgIDQ2NTIsICAgMjg0NiwgICA4MzU5LCAgIDUzNDUsICAtMjkwMiwgICAyMjk1LCAgIDQ4MDEsCisgLTUwMTYsICAtNjI3MCwgICAyODkzLCAgIDI3MzIsICAtMzUxMCwgIC0yNjEzLCAgIDQ1NDgsICAtNjM3NiwKKyAgNDUxMCwgIDEwNTY2LCAgIDE4NTksICAgMTAzOCwgIC04MzgxLCAgIDI3ODIsICAtMTYyMiwgICAgMTU5LAorIC0xMDM1LCAgLTMyMzIsICAtMzc2NiwgICAxNTgwLCAgIC03MjAsICAtNDQ3NiwgIC0zODYzLCAgIC05MjAsCisgLTIxMzUsICAgLTQ1OCwgICAgMzUyLCAgLTI2NDUsICAgMzAyOSwgICAgMzAxLCAgLTExNDUsICAgLTQ3OCwKKyAgMzY5NiwgLTExNzAwLCAgIDk5MzAsICAgNjY0OSwgICA3MjkwLCAgIDIzNjIsICAxNzIyNiwgICAzMjM4LAorICAxNzg2LCAgICA2NjIsICAgIDk3MSwgICAtNzM2LCAgIC02NDcsICAgMTc0NSwgICAtNTA2LCAgIC03NzcsCisgIDE0NTgsICAgMjQwNiwgIC0xNDE3LCAgLTc5MzMsICAgLTg0NiwgIC0yNjU0LCAgIDExMDQsICAgIDYxOCwKKyAtMjc4MywgLTEwMTY4LCAgLTMzMjIsICAgOTQ5OCwgICAtOTM5LCAgLTIzNDIsICAtMTg3NiwgIC0xOTE0LAorICAgIDg0LCAgIDM0NjgsICAtNjUzMywgICA3Nzk2LCAgLTM3OTcsICAtMTMxOCwgIC0yMTgzLCAgIDEzMTAsCisgIC04OTUsICAgNDk0MywgICAxMDYyLCAgLTQ0NjgsICAgIDE0MiwgICAtMjQ0LCAgICA4ODQsICAgIDYxMywKKy0xMzk2MywgIC01ODUzLCAgIC05NDcsICAxODcwMywgICAtOTY0LCAgIDEwOTAsICAgMTA3MCwgICAxMzg4LAorIC0xNTcyLCAgLTExMTAsICAgIDY3MSwgICAxNzA2LCAgICA2MjAsICAgLTI2MiwgIC0yNDIxLCAgLTIyNzcsCisgLTU2NjUsICAtNTIxMiwgICA0OTk0LCAgIDIzNzksICAgLTU5MywgICAyMDQ4LCAgMTQ0ODksICAgMTE2NSwKKyAtMTc3NSwgIC0yMDkzLCAgIDI0NjYsICAgIDQxOSwgICAgNDA0LCAgIDU0MjksICAgMzA4OSwgIC0xMzUwLAorICAxOTc1LCAgIDIyODEsICAgICA2MCwgICAgNTk5LCAgLTE2MDAsICAgMjI4NiwgICAyMzU4LCAgIDY2OTgsCistMTY0MjMsICAgMzc2MCwgICAgNjY2LCAgLTEzMDksICAtMTM0NiwgICAyNzg2LCAgIDIzNjQsICAgMTQ0OCwKKyAgMTExNCwgIDE3OTU2LCAgLTUzMDEsICAgMjQzMCwgICAxMTc4LCAgIC0xNjQsICAgMjE5NSwgICAzOTI3LAorICAtMTIyLCAgIC03MzcsICAgMTQ2OCwgICAgMzA3LCAgLTE4NjMsICAgMTU5MiwgIC03NzE0LCAgLTI0MjgsCisgICA5NTgsICAgIDIyMCwgICAgIDU5LCAgIDQxMjQsICAtMTk0NSwgIDExMTUxLCAgIDg2MDQsICAtMjA3NywKKyAtNDc4NywgIC00NTc4LCAgIDEwOTYsICAgMjY4NSwgICA2NDc4LCAgIDgzMTQsICAtNjIyMSwgIC0zODQyLAorICAyMTczLCAgICAtNDMsICAgIDEwNCwgIC0yNTEwLCAgIDMxMDksICAtMjMyNCwgIC00MjM4LCAgLTQ3MDksCisgLTMyMzMsICAgMzIyOCwgIDExNDU0LCAgIDI0MjgsICAgIDU3OCwgICAgNzgwLCAgLTEwOTYsICAgICA3MiwKKy0yMjYyNCwgIC0xNDIxLCAgLTQxMDQsICAgIDIyNiwgICAgNDY0LCAgLTE3MjYsICAtMTk3MSwgICAyMDY4LAorICAxMTQyLCAgIDE0MTIsICAgMTQxMiwgICAgNzk4LCAgLTI2MDUsICAtMzQ1MSwgIC0xMTA0LCAgLTIyMjQsCisgLTIyNTAsICAtMzQ3MCwgICAtNTcyLCAgLTE0MjAsICAtMTI5MiwgICAgLTU4LCAgIC0yMTcsIC0yMTQxNywKKyAgLTE3MiwgIC02MzY4LCAgICAgMzAsICAtMjE3MCwgICAgIDk1LCAgICAzNzgsICAtMjkyNiwgIC0yMTgwLAorICAyODIwLCAgIC02ODMsICAgMjAxOCwgIC00MzEzLCAtMTM0NjksICAgNTM5NiwgICAxODA4LCAgIC01OTIsCisgIDQ3MzIsICAtNjYwMiwgIC01NjAyLCAgIC05ODMsICAtNDEzMCwgICAtNDc3LCAgLTEyMzYsICAtMjI2MywKKyAgMzk5MiwgLTEyOTYyLCAgLTE3NzgsICAtMjYzMSwgIC0yNDIxLCAgIC03NDYsICAgMTk2NCwgICAxNzU0LAorICAtNzYwLCAgIDI3NTMsICAgLTExNiwgIC0zODYwLCAgMTAyNDYsICAgLTQ0OCwgIC0xMzE4LCAgIC0xMDAsCistMTAzNzIsICAgMTQyMCwgICAtMjEwLCAgIDI3NjgsICAgICA0OCwgIC0yMzczLCAgIDc3MjEsICAtMzIxNywKKyAgLTMyOCwgICAxNTQzLCAgLTI1MjcsICAgMzcwOSwgICA0MDI0LCAgIC05MTYsICAtNDU4OCwgICAtNzI2LAorIC00MzAyLCAgIC05ODIsIC0xNDcxNCwgICAzNjE1LCAgLTExOTAsICAgOTA1MSwgICAgMTk5LCAgIDIyNTIsCisgIDEzNDgsICAtNDIwNCwgICAgNjkzLCAgIDEyNDEsIC0xNDE2MCwgIC0yNDYwLCAgLTIwMTcsICAgMjk5NywKKyAgIDc2NiwgICAtMzYwLCAgIC00NTAsICAtMjkxOSwgIC03OTc2LCAgIDMyMTAsICAgLTE3OSwgICA4OTM1LAorICAgNjcwLCAgIDExNTUsICAgNjg4OCwgIC0yMjQ5LCAgIDI3MjksICAgMTgxMCwgICA2MjgzLCAgICA2ODQsCisgLTk3MTcsICAtMTc2MywgICAtOTIxLCAgLTQ1NzgsICAgMzk0MSwgIC02NDA4LCAgIDE0MzEsICAtMjc0MiwKKyAgIC05MSwgIC0yMDk0LCAgLTIxMTgsICAtOTc1MiwgICAyODAxLCAgLTI0OTcsICAgIDE0NywgIC01OTAxLAorIC01MjcwLCAgMTMxNzAsICAgMjgxMCwgICAxNTc2LCAgLTMxOTEsICAxMDI1MywgICA0MjI2LCAgLTEzNDAsCisgIDI0NTYsICAgMTA3OSwgIDEyNTQxLCAgLTUxMjQsICAtODM1NiwgIC0xMDAwLCAgIC01NTgsICAgIDE4MCwKKyAtMjA3MCwgIC0xODgwLCAgLTU3MTgsICAgLTY4NywgIDEwNTQ5LCAgIDEwNjYsICAgIDIyMCwgIC00MTQ3LAorICAtNjk1LCAgIDM2NDgsICAtMzQ2MCwgIC0zMTQzLCAgLTE2MjMsICAgMjE1MCwgLTExMjIyLCAgLTI1NjYsCisgLTYzOTUsICAgMzU1MiwgIC00MTc2LCAgIC02OTgsICAgMTI0OCwgICAgMTEyLCAgLTQ2MjgsICAgLTk2MCwKKyAgLTcyNCwgICAxMTkxLCAgIDIwODQsICAxNTIwNywgICAtMzQ2LCAgICAzNzEsICAgIDE5MCwgICA1MzQ1LAorIC00MjgzLCAgLTc0ODIsICAgMTM1NCwgIC00NDI0LCAgLTM3NzUsICAtNDE0MywgICAxNDQ0LCAtMTQ4NzYsCisgIC01ODksICAgMjQ5OCwgICAxMzA1LCAgIC00ODYsICAgMTYyOCwgICAtODY3LCAgIDE1ODQsICAgMTA5NCwKKyAgIC0xMCwgIC0xMjYwLCAgLTEwNDYsICAgMjUyOCwgIDI3NDcyLCAgICA5MTAsICAtMTA2OSwgICAgODI5LAorICAtMTE3LCAgLTEwOTcsICAgIDc3MCwgICAgMjUyLCAgLTE0MTIsICAgMjM1MywgICAyMjAwLCAgICAtMTEsCisgICA2MjQsICAgODQ1OSwgICA2MzIwLCAgLTk0NjUsICAgMTIyNSwgICAyNTMyLCAgIDU0MTUsICAgOTI1MiwKKyAtMTQ0MSwgIC0xMzc4LCAgIDEwODEsICAtMTk5NywgIC0zOTA0LCAtMTQ3NDAsICAtNTIyMCwgICAzNjI3LAorICA1NzI1LCAgIDYxODAsICAtNTMzNiwgICAgIDcyLCAgIDQ2MzgsICAgIDkxNSwgICAtNDk2LCAgICA2MjgsCisgIDE4ODAsICAgLTQyMCwgICAyODAwLCAgLTcxNDMsICAtNzU3OCwgICAzMTgwLCAgLTQyMTAsICAtMTExMSwKKyAgMjk3OSwgICAtNDQyLCAgIC0xODIsICAgMjc3OCwgICAyMzk4LCAtMTM4NzgsICAgMjIwOSwgICAtMjgyLAorICAtODg4LCAgICAxODAsICAgMzU4NCwgIC0xMDA1LCAgICAgIDIsICAgIDk5OSwgIC0zMDc0LCAgIDEyMDUsCisgLTQ2MDUsICAgNTI1MCwgIDE3MjU1LCAgIDI4MzksICAgMjcxOCwgICAtNjc4LCAgLTI2NTEsICAgIDE2MCwKKyAgMTU5NiwgICA0Njg1LCAgIDIzMjQsICAgMzEwMCwgICAzNzQ0LCAgLTE5NTQsIC0xMTY3NCwgICAgNjIxLAorICAtNjc4LCAgLTYyNDIsICAtMzQ0OSwgIC0xODkwLCAgIDMxMzQsICAgLTI4OSwgIC03MTYyLCAgIDIyNjgsCisgLTg0MzcsICAgLTYyNCwgICA0OTk5LCAgLTU5NDYsICAxMzAxMywgICAgMjQ0LCAgIC0yMDAsICAtMTQ5NCwKKyAtMTEwOCwgICAzNzY4LCAgICA0NDUsICAgMjQyOSwgIC0xMjY0LCAgICA3ODYsICAtMjk5MywgICAzNDgyLAorICAyNDQ4LCAgIC05NjgsICAtMTE4NCwgICAgMjEzLCAgIC03NzIsICAgNDkzMSwgICAgIDQyLCAgLTM4NTAsCisgIDIwMjAsIC0xNzk3MCwgICAgIDg0LCAgIDMwMTYsICAgLTYwMiwgICAxODA1LCAgICA3MzEsICAgMzUyMiwKKyAtMjYwNiwgICAtNjM3LCAgMjU1MzUsICAgIDY4MCwgICAxMDgzLCAgIDQxMzgsICAgMTYwMiwgICAgMTkwLAorIC0xODU0LCAgIC05NjIsICAgLTM3OSwgIC0yNDk5LCAgIDI0NTMsICAgLTM2MiwgIC00NTUyLCAgIDQ2ODksCisgIDIxNjgsICAtNTkzMCwgLTEwNTUyLCAgLTU1ODUsICAtNDY5NCwgICAyNDQ3LCAgIDIwNDcsICAgNTQyMCwKKyAgMzkwOCwgIC0xNDQ5LCAgICAtOTAsICAgIC02OCwgICAgNDk2LCAtMTI3MTMsICAtMjEyNywgICAxNDA2LAorLTEwNzY2LCAgIDI0MzgsICAgMjI3OCwgICAyOTYyLCAgLTY0MTEsICAgIC0yMiwgIC0xOTY2LCAgIDI4MTQsCisgLTE3NDYsICAgLTM4MywgIC0yMzgxLCAgLTU5ODEsICAxMDkyMCwgLTEyMzU0LCAgIC02NTYsICAgMjI2MCwKKyAgNTIwMCwgIC0xOTA4LCAgLTIyNzUsICAgNDI3NiwgICAxMTc0LCAgIC05MzIsICAgLTUzMiwgICAyODMyLAorICAgNjAxLCAgIDE1NTEsICAtODQzNCwgIC00MTcwLCAgLTY0MTEsICAgOTA5OSwgIC02ODg2LCAgIDIyNDMsCisgICA1NjEsICAgMjAyNiwgIC0zNTk4LCAgLTExMjUsICAgIDY0NiwgIC01MTg4LCAgIDYwMTcsICAgLTYzMiwKKyAgIDc3MiwgIC0yOTE5LCAgLTM3NzYsICAtOTkzOCwgICAyNDYxLCAgIC0xMjIsICAgIDEyOCwgIC0xNDE2LAorIC0xNTMzLCAgICAzNDMsICAgMTMxOCwgLTEzNzM4LCAgLTE1MjgsICAtNjQxOCwgIC0xMTk2LCAgICA4MzIKK30sCisKKy5jYjIyMjRzMSA9IHsKKyAzMjc2NywgICAtNzQ5LCAgLTE4ODUsICAgLTgwNiwgICAgNzM5LCAgLTE4NTgsICAgMzkwMiwgICAxMDI5LAorICAgMzMyLCAgLTIxMjIsICAgMTI0MCwgICAyNzA1LCAgIDEzNjIsICAgIDE5MCwgICAxMDU4LCAgLTE0MDQsCisgIDEyMjQsICAgMTEyMiwgICAxMjA4LCAgICAxOTAsICAgMTk4NCwgIC0xMzU1LCAgIDE2OTQsIC0yMTAwMCwKKyAtMTAxMiwgICAyNDE4LCAgLTEyNjksICAtMTE1NCwgICAxMTEzLCAgIDIyOTEsICAtMjMxNywgICAgMzE1LAorIDEyODcyLCAgLTIyOTYsICAtMTUxMCwgICAxMTA0LCAgMTEzMjQsICAtMTE0NiwgIC0xMDE4LCAgIDEzMjYsCisgIC05MDIsICAgIDE2OCwgICAgNjQ3LCAgLTE4MjgsICAtMzgzOCwgIC01NjgyLCAgIDI3MzIsICAgLTIzOCwKKyAgLTEzNCwgIDEzNDUwLCAgIDE1NzAsICAgMjQyNCwgICAgOTk2LCAgLTM0OTQsICAtMzcyMCwgICA0ODk3LAorICA1ODc1LCAgICAxNDksICAtNjM2NywgICA2NjU5LCAgLTIzMjksICAgNjkxNiwgICAxMTM0LCAgICA0MjUsCistMTkwMTQsICAgLTQ3OSwgIC0xOTAwLCAgIDM0NzAsICAtMTc3NywgICAtODExLCAgIDE3MjMsICAgIC00NiwKKyAtMjEwMywgIC0xMjk4LCAgIDI5MjksICAtNDI3OSwgICAtNjM5LCAgLTI0NDMsICAgNzIzMSwgIC0xMTg3LAorIC0yMTQ1LCAgIC03NzcsICAtMzI4NywgICA0ODk1LCAgIDg4NzgsICAtOTMxOCwgICAgMjg5LCAgIDQwMTUsCisgLTMxNDgsICAgLTU5OCwgICAyMjI2LCAgMTE3MDAsICAgIDExNCwgICAzMjM3LCAgIDk1ODYsICAtNDU3MCwKKyAgMjU5MiwgICAzNjE0LCAgLTIyNzIsICAtMjgyOSwgIC0zMzU2LCAgLTEwOTUsICAtNTI5MCwgICA0NzA5LAorIC0xODY3LCAgLTE5MzAsIC0yMDcyMiwgICAgOTM3LCAgICA4OTIsICAgMTQxNSwgICAxNTQ0LCAgIDI5NTAsCisgIDUwOTAsICAgIDkzNywgIC0xNDExLCAgICAxMjMsICAgIC0zMSwgIC0xNTY4LCAgICAzMzgsICAgLTkzOCwKKyAgNTQ2NSwgICA1Nzk2LCAgICA0ODAsICAtMjc4MiwgICAzMzUxLCAgLTI0ODksICAgLTM4MywgICAxNTI5LAorIC01Njg2LCAgIDI0NDYsICAgLTY5MywgLTEyNzk2LCAgIC01OTksICAgMTg5NCwgIC0xNTc2LCAgLTIyNDQsCisgLTQ2ODYsICAxMDE2NSwgIC0xMDg1LCAgMTAwNTAsICAgMjY4MSwgICAxMTM4LCAgIDI1NDQsICAtMTgwOSwKKyAgLTgwNiwgICA1Mjc4LCAgLTg3MzAsICAtMzc0MCwgIC0yMzQzLCAgICA5NzEsICAtMzI1NCwgICAtMTY1LAorICAtMjEyLCAgLTQxNjQsICAgIDg1MCwgICAgMjMzLCAtMTM2OTQsICAgIDQ0MiwgICAxMDczLCAgIDM4NTQsCistMTI5MjYsICAtMjAwMSwgICAzNDY4LCAgIC03NjUsICAgIDgyOSwgICAyMTc0LCAgIDE1MzEsICAtNjAzNiwKKy0xMDg0OCwgLTExMDA5LCAgICA4MDMsICAgMTcxMywgICAyODg0LCAgIDE5OTIsICAgICA3NSwgIC0yOTg5LAorICAgMjY4LCAgICAzNDYsICAgMTk5OCwgICA0Nzk4LCAgIDg5NzYsICAtNDYzMiwgICAxODYzLCAgLTQxMjcsCisgIC02MTIsICAgNDc5MCwgIDEwOTQ2LCAgLTEyOTYsICAgODAwOSwgIC0xMzUxLCAgICAzNTYsICAtMTcxMSwKKyAgIDMxMywgICAyMzAxLCAgIDEzMTgsICAgODA1MCwgICAgNzAwLCAgIDEyMTgsICAgMjI3MCwgIC0yMTU2LAorICAgIDY3LCAgIDE1MzcsICAgMTk0MSwgICAzNDQyLCAgMTMzMjEsICAgIDY5MSwgICAyMzQ0LCAgIDI1OTQsCisgIDE1NTEsICAgMzg1MywgICA3Mjc5LCAtMTA0NDEsICAgMTAwNiwgLTExODYyLCAgIDU1MzIsICAgLTYxMSwKKyAgLTU4MiwgICAyMjU3LCAgLTI4NzMsICAgMzk5MywgIC01MTMzLCAgLTIyNjQsICAtMjQ3OCwgICAxNTc2LAorICAxODM0LCAgLTQ5MzEsICAxMDI2NCwgIC0xNDI5LCAtMTA0MDQsICAgIDM5MywgIC0zNzE1LCAgLTE0NzAsCisgLTIwMDMsICAgIDM4NCwgICA0ODY5LCAgLTY3ODAsICAtMTI5NywgICAxNTcyLCAgIDEwNDMsICAgNjk4MCwKKyAtNDM4MiwgIC0zMDA1LCAgIDM2OTgsICAgNDE3NiwgIC0xMzQ4LCAgLTQ5NzIsICAgMTU3NCwgICA5ODE1LAorIC01OTk1LCAgIC05NzksICAgMzYwOSwgICAzNzAyLCAgLTg1MDMsICAgIDY2OCwgICAzMzU0LCAgIDI1NTIsCisgIDkxODMsICAtMTE3NSwgICAxMjI0LCAgLTI4NTksICAxMTE3NiwgICA2MDg4LCAgLTEzNTUsICAgICA4NCwKKyAgMTI3MSwgICAtMzgwLCAgIDUzMzYsICAgIDI5OSwgICAtNjkwLCAgIC0zNjUsICAtODA0NywgIC0zNjc5LAorIC0zMjA0LCAgIDEzMzQsIC0xMzQ1MSwgIC0xMzkyLCAgIDIyMDAsICAtMzY0NiwgIC0xMDQ2LCAgLTQyOTIsCisgICA3NDEsICAtMTcwMSwgICAxNzIyLCAgIDIwNjEsICAtMTM1OCwgICA3MjY2LCAgLTYzNTYsICAgIDk2MywKKyAgMjE5MCwgIC0xMzQ5LCAgLTE4ODIsIC0xNDEyOCwgIC00NjYyLCAgIDM1NTIsICAgIDU2NSwgIC0xMTA5LAorICA1NDEzLCAgIDEyMzksICAtMjYxOCwgICAgNzk0LCAgLTIwNjQsICAxMTgwNSwgICA5MDA0LCAgLTIxMzQsCisgIDI4MDQsICAgIDk0NiwgICAgIDgwLCAgLTIzODcsICAtMTIwNSwgICAgIDExLCAgIDE2NDIsICAtMTgyNSwKKyAtMjMyNCwgIC01MDE4LCAgIDQyMDgsICAgNTI4NSwgICAgNjYxLCAgMTI0MzAsICAgMTkwNywgICAgNzg0LAorIDEwODY0LCAgICAzNDAsICAgICAxOCwgICAtMTM4LCAgIDI4ODUsICAtMjI0NywgICAgIDE3LCAgICAzMzQsCisgLTMxNzIsICAgMjk3NywgICAgOTcwLCAgICA1MzYsICAtMTU0MCwgICAtNTE2LCAgIC00ODgsICAgLTUxMiwKKyAtMTMzNCwgIC0xOTMwLCAgLTI0MTgsICAgMTA3OCwgIDI0ODM3LCAgICAgMTIsICAgMjA2MCwgICAtMjUyLAorIC0yNTM2LCAgLTIyMDYsICAtMzE3OSwgIC02Nzg1LCAgLTg4NDIsICAgODczNiwgICAxMzkzLCAgICAxMTksCisgIDE2NTIsICAxMDEyNiwgICAgODU2LCAgICA4NTUsICAgLTc0MiwgICAtMjg5LCAgLTIyMDgsICAgMzgzMSwKKyAgNjkwOSwgIC02NTU2LCAgIDI0NzIsICAgLTI0NSwgIC0xNzI5LCAgIDE0NjAsICAtMzAxNCwgICAgIDU5LAorICAgLTU4LCAgICAxMzIsICAgMzkwMywgIC0zNzYyLCAgLTE0MTksICAxMzI3MywgICAyNzA4LCAgLTc3NTIsCisgICAgODQsICAgMzUyNSwgIC0xMzA1LCAgIC0zMzQsIC0xMzQyMSwgICA1OTMxLCAgLTQ4NDUsICAtMjY5NywKKyAgIDY2NiwgICAgNTU4LCAgLTExMDIsICAgIDYzMiwgIC0yOTQ2LCAgIDQxNTMsICAtNDAxOCwgICA0NTE2LAorICA0ODc1LCAgIDQ0NjAsICAtMTU2NywgICAyMjMzLCAgICAzODYsICAgLTc1NCwgICAxMjU2LCAgIDIxNDUsCisgLTE2OTIsIC0xMzA0NiwgICAxNTgxLCAgIC01MTgsICAgNDM5NywgICAxMjE1LCAgIC03MjMsICAgMzQxMywKKyAgLTY0MCwgIC01MDg4LCAgIDE3MTEsICAgLTcxNCwgICAyNTM2LCAgIDI0MzMsICAgLTY5MSwgIDEwNzU4LAorIC04NzY0LCAgIDU1NDEsICAtMjA3MSwgIC0xNjYyLCAgMTI5NTUsICAxMjk5OCwgICAxMjUyLCAgICAtOTQsCisgICA4MDIsICAgMjU3MywgIC0yNTU3LCAgICAtNjYsICAgLTgzMiwgICAgMTA2LCAgIC03MjgsICAgMTA1MCwKKyAgLTgxMSwgIC0yNjg0LCAgICA2MjksIC0xNjUyNCwgICAxNTMxLCAgLTE2MTcsICAgMTM0OCwgICAgMjA0LAorICAxNzIyLCAgICAzNjgsICAgIDU1NCwgIC0xNzUyLCAgICAxMTQsICAgMTM0OSwgICAxOTUyLCAgLTEwMDcsCisgIDI2MjYsICAgMjAzNSwgICA4MTQ4LCAgLTI1MzksICAtNDI5NiwgIC00NDYwLCAgLTg1NDIsICAtMzA4OSwKKyAtMTU0MywgICAtODU3LCAgLTI2MTcsICAtMTc2NSwgICA2NjQyLCAgIDIxNjcsICAtMTUzMSwgIC02ODgxLAorICAgIDg2LCAgIC00MTQsICAtNTg5NiwgIC01MTUyLCAgMTc0NDUsICAgMTEyOSwgIC01MDA2LCAgIDI5MzYsCisgLTM0MzIsICAtMjIyNiwgICAxMTc2LCAgICA5NzIsICAgMTE3MCwgICAgNTMwLCAgIDMzOTAsICAgIDI2MCwKKyAtMjkwOSwgIC0zNTUwLCAgLTUyNTUsICAgMTc3MSwgICAtMzgyLCAgLTE2OTAsICAxNzA3MCwgICAyNjg4LAorICAgNTY2LCAgIDI0MzAsICAtMTc2OCwgICAzMzczLCAgIDE0NjAsICAtMzQ2NCwgICAtNjI5LCAgIDMxMTksCisgICA0MzAsICAtMzU1NCwgICA4MzU3LCAgIDcwNzUsICAgIDI5MywgICAyOTU1LCAgICAtNjEsICAtNjkxOSwKKyAtNDkzOSwgICAzNjc4LCAgLTY4NTIsICAgIDY1MiwgICAyMjA2LCAgIDU5MTgsICAtMjc2OCwgIC0zMDIyLAorICA1NzIxLCAgIC03NzAsICAtMTEwMiwgIC0xMDU3LCAgLTI3NjAsICAgMzA4NiwgICA1NjExLCAgIC0xNjAsCisgIDI3MTQsICAtMTA0MiwgICAyNTY5LCAtMTQyNDgsICAgMzg0NiwgICA4MjEyLCAgIDUzOTIsICAgIDE0NCwKKy0xMTg5NiwgICAgNjE4LCAgIDEyMTIsICAgMzI4MywgIC0zNzc3LCAgIC03MTUsICAtMzg3MCwgICAyNTI4LAorIC0yOTAwLCAgIDE2NDUsICAtMTc4NiwgIC0xODUyLCAgIDI3NzYsICAtMTM0OCwgICAtNTg2LCAgICAyMzQsCisgICAgLTQsICAtMTY2NiwgICAgIDQ2LCAgIDIwOTUsICAtMTk4NywgLTE4NzI4LCAgLTI5ODAsICAgMjUwMSwKKyAgNDA0MiwgICAgIDc5LCAgLTE4NDksICAtMjAxMywgICA4MDQ3LCAgLTE4OTgsICAgLTEwOCwgICAgMzQwLAorIC00NzYwLCAgIDIxMzQsICAgOTAwMCwgICAgMzQ3LCAgMTAzNjUsICAgNDc3OSwgICA2NjYwLCAgIDE2OTQsCisgLTMyNTMsICAtMjI4MiwgIC0xNDg4LCAgMTA0MDYsICAtODA1NCwgIC0zNDE0LCAgLTI5MzQsICAtMTYxMSwKKyAgMzE3MiwgIC0yMTk1LCAgIDQ5NzMsICAgMTI0OSwgICAyODg4LCAgLTQwNTQsICAtNTczOCwgIC0yOTk1LAorIC0yMjgyLCAgIDE5NzcsICAgLTM1MywgICAtNTE2LCAgIDUzMjIsICAgMzIyNSwgIC00OTA3LCAgIDEzMDMsCisgLTQ2NTYsICAgOTk0NywgICAtMjM2LCAgIDkzODIsICAgMjMzMiwgICAyMDc2LCAgIDE0NzAsICAgMzE3MywKKyAgNDcxMiwgICAyNjQ1LCAgICA1NTksICAgNDkwNCwgICAxNTExLCAgLTE3MTUsICAtNDg1NiwgICA1NzUwLAorIC0xMjc2LCAgIC0zMDYsICAtNTk4MCwgIDE0MzkzLCAgIDE0NDMsICAgICA4NSwgICAgMTU2LCAgIDc3MTgsCisgICA3OTMsICAgNDE5OSwgICAyMTIyLCAgIDEwOTgsICAgIDEyOCwgIC0xOTk2LCAgLTEzOTcsICAgIC0yMCwKKyAgLTUzNCwgLTEzMjk2LCAgLTE1MTgsICAtMjk3MCwgIC0xMDAxLCAgLTY0NzQsICAtNjE0NiwgICA4MzM3LAorICA1NDc2LCAgIDMwNTgsICAgLTUyNiwgIC0xMjk1LCAgIDE2MjMsICAtODc5MSwgICAxMjU3LCAgIDIwMDYsCisgLTU3MjUsICAgMzAzNSwgIC0yOTE3LCAgIDEyODAsICAtODQ3OSwgICA1OTM0LCAgIDk4NzAsIC0xMzEzMSwKKyAgICAxNCwgICAxMDg4LCAgICAgLTksICAgMTk2OSwgICAgMzY2LCAgLTMyMTQsICAgIDE5MiwgICAyNzY0LAorICAxNDk5LCAgICAzNDYsICAtMjAzMSwgIC0yOTAwLCAgLTI1MjksICAgMTA3MiwgIDExNzE3LCAgIDUyMDYsCisgICAtNDQsICAtMjUxNCwgIC04OTAwLCAgIDI4OTIsICAgMjEzMiwgICAzNjM1LCAgIDM3MzUsICAgMjcyNiwKKyAgMTM5OCwgICA2MDM1LCAgLTI4MzAsICAtNDU2OCwgICAgNDI0LCAgLTg2OTYsICAgMTM2OCwgIC0zODYwLAorICAxODIzLCAgLTI2MjAsICAgNDU0NiwgIC0yMjEwLCAgIDE2NjAsICAtMTY3MiwgLTEwNTI0LCAgIC00ODQsCisgICA5NTAsICAgICAxMSwgIC00NDk0LCAgLTYyMjAsICAtNTY1MywgLTEzMzMyLCAgIDI4NjgsICAgIDQ2MCwKKyAtNDEyMCwgIC00MDMwLCAgLTMyNzcsICAgIDUyMiwgIC0zNDAzLCAgIDExMjYsICAgLTE3MCwgIC0xODkyLAorIC00MzY2LCAgIDEzMDQsICAgMzQ3NywgIC0xNTA3LCAgIDExMTEsICAgLTU5NCwgICAxNjcwLCAgLTg0MTYsCisgLTE2OTAsICAgMjQ5MiwgIC03MTA5LCAgIDI1MzEsICAgNDEzMSwgIC04MTIzLCAgLTQ4ODQsICAxNjUwNSwKKyAgLTI0MCwgICAgLTYzLCAgMzIwOTksICAgIDk3NCwgIC0xMzYwLCAgLTIzOTUsICAtMjAwNSwgIC0xMTU2LAorICAtODc3LCAgIC00MTYsICAgLTkyMiwgICAxODU3LCAgICA3NjYsICAgICA3MSwgICAxMzgwLCAgIC0yNTksCisgIC0yNzIsICAtMTkyNCwgICAyNDk4LCAgLTMyOTAsIC0xNjA0NSwgIC0yMDY0LCAgIDI5NjYsICAgMjkzNiwKKyAtMTI2NSwgICAyMTIxLCAgICA0ODgsICAgMzc4MSwgICAxNDg0LCAgLTExOTMsICAgNDc3NiwgIC0xMDAxLAorICAtNjY5LCAgIDE1NjksICAgLTM3OSwgICAtNjA0LCAgICAgLTUsICAtMTk0MywgICAgNzU3LCAgICAzNTksCisgIC01NjAsICAgIDExOCwgIDE3OTQxLCAgIDIzMjMsICAgIDIxNSwgICA3NjIxLCAgLTM1ODIsICAtODEzMCwKKyAgLTY5OCwgICA5ODkzLCAgLTI3NTIsICAgLTQxNywgIC0xMjYyLCAgLTE1MDQsICAgMzMxOSwgICAxMTg2LAorIC0yMTkyLCAgIDMwMTQsICAgIDc4MSwgIC0zNjAyLCAgLTYxOTAsICAtNzcyNSwgICAzMTY5LCAgIDIwMzgsCisgIDExNzUsICAgIDYxMiwgICAyNDc3LCAgLTQxMzYsIC0xMjE1MiwgICA0NTM4LCAgICA1NjcsICAgLTExNiwKKyAtMzIyMiwgICAtNDcwLCAgIC0xMTgsICAtOTI1NywgICAtNjM1LCAgIDMwNzgsIC0xMTU5NiwgICAgIDkzLAorIC00MTc4LCAgIDQxNTAsICAgNTk4NSwgICA0NDE0LCAgLTIxMTAsICAgIDU0MiwgIC0xMTI1LCAgLTEyNDIsCisgIC0yMzQsICAgIDgwNywgIC0xMzg1LCAgLTI0NDgsICAgIDgyNCwgICAgMTA5LCAgLTE4MjYsICAgMzAzMiwKKyAgIDI2OSwgIDE0MTg4LCAgIDM0NjgsICAgIDkwOCwgICAgLTEyLCAgIDIyOTAsICAgNTc1OCwgICAxNjg1LAorICAgNjgwLCAgIDU5NjMsICAtMjc2MywgICAtMTczLCAgICAtMzQsICAgMzEzNSwgICAxMjMwLCAgIDIyMjYsCisgIDI0NzEsICAtOTU0NiwgICAyMjY2LCAgLTE1ODMsICAgIDcyOSwgICAzNTA2LCAtMTA2NjQsICAgLTY1MiwKKyAgMjIxMiwgICAtNjIwLCAgIDI3NjIsICAgLTc1MSwgIC02MzM3LCAgLTQzMzksICAgNDEzMSwgIC0xMjM0LAorICA1NDIzLCAgLTIyNzksICAtMjg4NCwgICAtOTI5LCAtMTI1ODIsICAgIDQxNiwgICAyMDQ2LCAgLTM4NTQsCisgMTExMzAsICAtMjczOCwgICAtNjcwLCAgIC0yMDIsICAgNjIxNiwgIC03MjY2LCAgIDk3MjYsICAgMTMwOCwKKyAtMTc2MSwgICA0Njk2LCAgLTEwNjEsICAgLTE0NCwgICAgNDgyLCAgLTE1ODYsICAgNDM3NywgIC01MDE2LAorIC0zODk0LCAgIDIyOTYsICAgNDM0MCwgICAtNTU1LCAgLTMwMDMsICAtMjExNywgICAtOTYyLCAgICAxMDAsCisgIDQ1NDgsICAtMTg3MCwgLTEzODg1LCAgIDEzNTEsICAtMzIyNiwgIC04MTE0LCAgICAzNzcsICAgLTM5MSwKKyAtMTM0NCwgIC0yMTQ4LCAgIDQ3NTYsICAtMzUxOCwgLTE0NDI5LCAgIC02NzAsICAgLTIzOCwgICAgNDAwLAorICAxMjM0LCAgIDQzODksICAgMTE4MSwgICAxMDQ2LCAgICA0MjUsICAgIC0zMiwgICAgODQwLCAtMjk4NDYsCisgIDE1ODAsICAgLTk5MiwgICAxODQ0LCAgIDE5NjEsICAtMTMwNSwgICAxMDU1LCAgICA0MTgsICAgICA1MiwKKyAgLTY0MSwgICAyNDMwLCAgLTE3NzMsICAtNTMyMywgICAzMzQxLCAgLTUzNjcsICAxNDAyNywgICAzMDUxLAorICAzODY0LCAgICA0MDQsICAgNDE4NiwgIC0xODc1LCAgLTU4MjIsICAtNDMyMSwgICAgMTEyLCAgICAzOTUsCisgIC0xNzcsICAgMTA4MCwgIC0zMDA4LCAgICA1MjAsICAgICAgOCwgICAgMjI2LCAgIDE0MzAsICAtMTYzNSwKKyAgICAgOCwgIC0yNjMyLCAgLTMyNDksICAtMzU5NSwgICAgNjIyLCAgICA1NjQsICAgODQwNCwgIDE0NDYzLAorICAgMTYwLCAgLTc4MjgsICAtNDExMywgLTE2NTQ3LCAgICA4NDgsICAgNjMyMCwgICAyMzExLCAgIDQwNzQsCisgLTIwNTAsICAgIDY2OCwgICAxNDYzLCAgLTIzMjIsICAgMTc5MCwgICAgODY0LCAgICAzMTcsICAgLTU5NAorfSwKKworLmNiMjIyNG0wID0geworLTE3MzM4LCAgIDU3MzcsICAgLTkxMiwgICA1OTA2LCAgLTUzMTUsICAgIDkyMCwgICAyNzQzLCAgLTIyMzIsCisgIDE5NDMsICAgLTc1MywgICAxNjk2LCAgLTE4MTgsICAtMjI3MiwgICAtNTY0LCAgLTEzMDYsICAgLTUyNywKKyAgLTE1NiwgICA5OTUyLCAgICAgMzYsICAgMjUyNCwgICAyMDUzLCAgIDE4NDEsICAtMTY3MCwgIDEwNjIyLAorICAyNTMyLCAgLTU2MTYsICAgLTMyNCwgIC0xMTMyLCAgLTExNDgsICAgMTkyMCwgIDEwMjMyLCAgICAtNzUsCisgIC02MzAsIC0xMDc5NiwgICAxNjE4LCAgIDExMDQsICAtMjU1NywgICAtNjAzLCAgIDIxMTUsICAgIDk2NiwKKyAtMzc2MywgIC0zMTgzLCAgIC04NTEsICAgNDUwMiwgIC0xNTY1LCAgMTAwNjIsICAgIDMxMywgICAtNzA5LAorIDEwNzA3LCAgICA4NjcsICAgMzgyMCwgIC0yNzQ3LCAgIDM0NzAsICAtMTk0MiwgICAtNDg2LCAgIDQwOTIsCisgLTYyODksICAtMjM2MywgICAgNTU2LCAgIDMxOTAsICAgNTA0NiwgIC0xODY5LCAgIDI4ODYsICAxMDU3MiwKKyAgLTk0OCwgIC00MTkxLCAgIDE1NDQsICAtMTcyNywgICAgNzIxLCAgLTMxNTMsICAgLTcxMiwgICAgOTM0LAorICAxNjEwLCAgIDEwNzAsICAgMTI0OCwgIDEwNjQ1LCAgIDIzNDAsIC0xMTEwMiwgIC0yNzQ0LCAgIC0zNTMsCisgICAtNjUsICAtNDk3MywgIC0xNzgyLCAgLTEwMzcsICAgMTIxMCwgICAxMTkyLCAgIDExMzgsICAgMTEwNiwKKyAgOTQyMiwgICAgNjUyLCAgLTk1OTUsICAtMTY2MywgICAgNDYwLCAgIDkxMDcsICAtMjgyNywgICAgNzc1LAorICAxMTMxLCAgIDQ3MzIsICAgICA5MywgICAgNDc2LCAgICAzODcsICAzMjc2NywgICAtMTYxLCAgICAyNjYsCisgIC00MDYsICAgIDYwNCwgICAgNjc1LCAgICAgODMsICAgLTU4OSwgICAtNjM5LCAgICAyMjAsICAgLTgzMCwKKyAgMjIwMCwgICAtMTQyLCAgLTIwMDAsICAgLTEyOCwgICAgOTAyLCAgICA4MjMsICAgIDI4NywgICAgNzE3LAorICAxODU3LCAgLTE2MjYsICAgIDIwOCwgICAyNzg0LCAgICAtNzIsIC0xOTMxMCwgICA2MTkwLCAgLTIwNjMsCisgLTkxMDEsICAgMzQxOSwgICAxNzIxLCAgLTIwOTIsICAgIDMzMiwgIC02NTMzLCAgLTc1OTQsICAgMTEzOCwKKyAgIDgwNywgIC0yNTgyLCAgIC02NjgsICAgIDQxMCwgICAtNDk3LCAgIDE1MjYsICAgICA5NiwgICAgOTQ0LAorICAzMzE5LCAgIDEyOTQsICAgLTMzNSwgICAxOTY0LCAgIC0zODAsICAgLTYxOCwgICAzMDY5LCAgICAxMDEsCisgMTg5NjQsICAtMjI5OCwgLTEwMzA0LCAgLTExOTAsICAgLTk5OCwgIC0xMzg0LCAtMTE0NjYsICAgLTI1NiwKKyAtNDQ3NSwgICA0MDI3LCAgLTM1MzIsICAgMTgyOCwgIC0xMzExLCAgLTM0MTcsICAtMzkyNSwgICAtMjIxLAorIDI3Njg4LCAgIDIyNzcsICAtMTIyNywgICAxMDQzLCAgIC0zOTksICAtMzMyNywgICAgNTE1LCAgIDE2NjUsCisgIC02MTYsICAgMjcyNCwgICAtNTQ2LCAgIDQ2MDgsICAgLTU3NiwgICAtMTAzLCAgLTkwNjQsICAtMTI4MSwKKyAgLTU2MywgIC0zNTg4LCAgIDIxNzQsICAgLTgyNCwgICAzMzc5LCAgLTIzNjAsICAgIDM1NCwgICAgODQ0LAorIC03MDQ0LCAgLTIyOTUsICAtMjYxMywgLTExMTUyLCAgIDEwMDYsICAtMTA2NCwgLTE3MDA3LCAgIDExODAsCisgICAzODcsICAtODQ0OCwgICAgODM2LCAgIC01NzgsICAgMjYyMSwgICAtMzU2LCAgLTE0NzYsICAgMjM2MiwKKyAgIDgyMiwgICA0NTQ3LCAgICAxMTgsIC0xMTYyOCwgICAgMzUyLCAgICAzNjcsICAgLTk1OCwgLTEyNDIzLAorICAgLTY1LCAgLTE1OTEsICAtMjMwNCwgIC0yODgwLCAgIDE2ODQsICAgMTcwOCwgIC0xNjkzLCAgIC03ODEsCisgICAtNzEsICAxMDAxMiwgICAtNTM0LCAgLTM2NzIsICAgIDQxNywgIC0yMDQ4LCAgLTE5NTUsICAxMDQ5MSwKKyAtMTI1NywgICAgODYxLCAgIC00MTQsICAtNDA1OCwgICAzMDQyLCAgIDE1MjksICAtNTgyMywgICA2ODc3LAorIC0zOTE4LCAgICA5OTMsICAgIDIyMSwgICAyNTc2LCAgLTc3ODAsICAgIDE3MCwgICAtNjQ4LCAgIC0xMzksCisgLTM0MTAsICAgNzk3NCwgICAtNzU2LCAgIDI2NTcsICAgLTU5NiwgIDEyNTI3LCAgIC0xOTksICAxMzc1MiwKKyAgMjE5OCwgICAtOTM4LCAgLTIyNjUsICAgMTczNiwgICAgMjU3LCAgIDE1MTcsICAgLTY3NiwgIC0xMTY1LAorIC0yODc0LCAgLTI0MzMsICAgIDEyMywgICAtODI5LCAgIDI2MDUsIC0xMDI3MCwgIC0zMTU4LCAgIDM2MjQsCisgIDIwNzIsICAgNjk2MCwgICAxNDkwLCAgIDQ2MzQsICAgIDQ1NSwgIC04MTc1LCAgIDExMzksICAtNDU0NSwKKyAtMTQ5MSwgICAzNzI3LCAgLTg3MzgsICAtMTk1MSwgICAgNTkzLCAgICAgMTQsICAgMjg5NywgICAyNDkwLAorIC0yMjczLCAgLTE0MzYsIC0xMDk5MiwgICAzMDA1LCAgLTQzOTIsICAtMzQzNCwgIC00NTYxLCAgLTEwMTQsCisgLTk1MDYsICAtMTYwOSwgIC0xMjQ4LCAgLTE1OTMsICAgLTE5MCwgLTEwNDcyLCAgIDMyNjQsICAtMjI3NCwKKyAgNTA5NywgICAtNjMzLCAgICA0NzMsICAgIDQyNywgICAgNzI1LCAgIDE1NzcsICAxMTAzMiwgICAgMzE4LAorLTEyMjI4LCAgICAgNzgsICAtMTExNiwgICAgNDQxLCAgIDE5MzAsICAgNDA0MSwgICAtNjQ4LCAgLTQzMjQsCisgIC0yMjQsICAgMjczOCwgICA4ODI2LCAgICAtNDAsICAgIDMyNywgICAxNzYxLCAgIDIzNzEsICAgIDE3MSwKKyAgNDAzOSwgIC0zNDExLCAgLTI0OTUsICAgMTE1MCwgLTEyMTgxLCAgLTE3MDQsICAgICAzNSwgICAgNTI4LAorICAgNDE3LCAgICA2MjYsICAgMTg2NiwgICAtNDcyLCAgICA0NjYsICAgIDkwNSwgICAtODU0LCAgIC04NzUsCisgIDExOTQsICAyNDM3MSwgICAgNDg4LCAgICAgMjYsICAgIDY5NSwgICAxNzc3LCAgICA3OTgsICAgLTE2OSwKKyAgIC0xNiwgIC0xMjUyLCAgICAzOTUsICAgIDg3MSwgICAxMTcwLCAgIC02MzUsICAtMTYzNywgICAyMDk0LAorIC01NDI3LCAtMTYzOTMsICAgLTM4NCwgICAzODcyLCAgICAgMzMsICAgLTY4NywgIC0xNzc3LCAgLTQxNjAsCisgIDMwMjAsICAtMTkwNiwgICAzODY4LCAgICA2OTksICAgLTQwMCwgICA2NzU1LCAgLTMyNTMsICAxMjY5OSwKKyAgMTQ3NCwgICA3MzEyLCAgICA5OTEsICAgLTY0NiwgIDI2NzcwLCAgIDI1MjQsICAgMjE0NCwgICAtNTAwLAorICAxMDk2LCAgLTE4NjksICAgMTAzNiwgIC0xNzA3LCAgICA1MjEsICAtMjA5MSwgICAxNDQ1LCAgIDIzMzUsCisgICAxMDcsICAgIDIzOCwgICAtMjI3LCAgIC0xMjAsIC0zMjc2OCwgICAgNTkxLCAgIC0yNTcsICAgIDg2NywKKyAtMTIzMSwgICAgNjUwLCAgIC00NjUsICAgIDM1NiwgICAgNDMxLCAgICA3NjIsICAgLTUxNiwgICAtNTk0LAorICAgNTEyLCAgICAyNDIsICAgMjI5OCwgICAxMDEyLCAgLTE1MzgsIC0xMTc0OCwgICAzNTUxLCAgLTU2MDgsCisgLTIxNzQsICAtMjQyOCwgIDEwNTU3LCAgICA2MjUsICAgMTAwMiwgIDI3ODY1LCAgIC01ODksICAtMTUyNywKKyAtMTU1MiwgICAgMTU2LCAgIDE5MDUsICAgMTA0MSwgIC00MTkwLCAgIDIzMDAsICAgMTYwMywgICAtOTgwLAorIC0xNzY0LCAgICA0ODQsICAgMTU1NSwgIC0yNjY0LCAgICAzODEsICAxMTY3NiwgIC04ODQ4LCAgLTMwNjAsCisgICA2NzUsICAgLTY0NiwgICAgNzM2LCAgLTEyNzksICAtMTI2MSwgIC0xOTg4LCAgICA1NDMsICAtMTg4MCwKKyAgMTkxNywgIC0yMTY1LCAgIDI4NDYsICAxMTg2MywgICAyMDc2LCAgMTAzODEsICAgLTMwNywgICA0MzU0LAorICAgIDczLCAgLTI3ODgsICAtMjQ2NCwgICAgOTY0LCAgIC0yMTgsICAgMTU1MiwgICAxODQ2LCAgIDE0NzAsCisgICA1NzcsICAgLTU5NCwgICAgNzI1LCAgMzA3OTgsICAgICA0MywgICAgIDEzLCAgLTE0NzQsICAgIDI2MCwKKyAgMTIxOCwgICAxNDMzLCAgIC0xMTQsICAgMTAyMCwgICAtNjQ4LCAgIC02NzgsICAtMTg3OSwgICAgLTY1LAorICAgNzkxLCAgICAzNjYsICAgODU0NywgICAgOTMxLCAgIDEwOTEsICAgMTAxOCwgIDE2MzEyLCAgLTExMTYsCisgIC03NzcsICAtMTA5OCwgICAgNDA0LCAgICAxODAsICAgLTg5OSwgIC0yODY1LCAtMTAwODksICAgLTc1MSwKKyAgICA0MCwgIC0yMzU4LCAgLTI5ODAsICAgMzU3NCwgICA3OTA1LCAgIC0xOTAsICAgOTIwNywgICAgLTE4LAorLTE4NzY2LCAgIC0yNzAsICAtNTMwMCwgIC0yMDIzLCAgIDI0MjIsICAtMTE4OSwgICAxMjY3LCAgLTEwODUsCisgIC03MDQsICAgNjgyMywgICAyMTY0LCAgICAgIDIsICAgIDEyNSwgIC0yMzE5LCAgICA0MTEsICAgIDU5MSwKKyAgLTQ4OCwgICAtNTY2LCAgLTMzOTQsICAgIDMwNCwgLTEyMzc1LCAgIC0yNjgsICAxMTA5OCwgICAtMTUwLAorIC0yMzkyLCAgLTEyNTUsICAgMzE3MiwgICAgMTYyLCAgIDEyOTUsICAgNTg5NywgICA3OTQ0LCAgIDYwMTksCisgIDMzMjksICAtMjAxNCwgICAyOTU3LCAgLTQ5MzMsICAgNDgwNSwgICAyNzgwLCAgLTU0NTMsICAgMjY4MCwKKyAgMzIyMCwgICAyNzg0LCAgIC01NDksIC0xOTkwOCwgIC0xMjIyLCAgICA1NTAsICAtMzU0MCwgICAxODIyLAorICA0MDgyLCAgIDIzOTksICAtNjg0NCwgICAyMTQ1LCAgICA5MzgsICAgLTU5NywgICAgMTIyLCAgICAtMjAsCistMTQ5ODYsICAtMTYyMCwgICAxNTc1LCAgICA1NjEsICAgIDQwOCwgIC02MzA1LCAgICA3NjAsICAgMTYzNCwKKyAgMjY1MiwgIC04MzAxLCAgLTI5ODgsICAgMTg2NCwgICAyNTI0LCAgIDMyMjgsICAgNzQ2NiwgIC0yNjIwLAorICAgNDEwLCAgIDEzNjQsICAgMTc0MCwgICAyMjA0LCAgIDE5OTksICAgMTcwNCwgIC0yNjAxLCAgIC0zNTEsCisgIC0xMDQsICAxMDY4OCwgIC03MTY2LCAgICAxMzQsICAgLTM0NiwgIDExODUyLCAtMTMzMjIsICAtMzE3MSwKKyAtMTIzMCwgICAxMTA5LCAgLTIzMzYsICAgLTk2MiwgICAtNTYzLCAgIDEwMzAsICAgMjgzMiwgICAtOTY5LAorIC0xOTk3LCAgIDMyMzMsICAgLTQxNCwgIC04MjQ2LCAgLTIwNzQsICAgMjczNywgICAzNTU3LCAgIDE2MjUsCisgIDEwMzYsICAgIDg0NSwgICAxODQ4LCAgIDE3MTAsIC0xMDM4OCwgIC00NTg2LCAgIDY5MTUsICAgMjczNCwKKyAtODY5MywgICAtNjY3LCAgIDE1NjgsICAgMTc1OCwgICAyMzk2LCAgLTMyNjIsICAtMjQ5NywgIC0xNDcyLAorLTExODQ4LCAgIC02ODksICAgMzM3OSwgICAxNjkyLCAgIDE0NDksICAgMjg0NCwgICA4NTI0LCAtMTU1OTgsCisgICAzMzcsICAgIDU5MCwgICAzMzAzLCAgLTE1OTQsICAtMjU0OCwgICA0NTI5LCAgICA0MzMsICAtMTkyMSwKKyAgIDkyMCwgICAxMDYxLCAgLTE2OTMsICAgIDE5MSwgICAgIDQ0LCAgICA5NTcsICAtMjM5NywgIC0xMTI2LAorICAgIDQxLCAgIDIxNjQsICAtMTU4NywgICAgNTY4LCAtMTcyOTAsICAgNDY4NywgIC0xMDI4LCAgIC00MDMsCisgIDExNjksICAtMTI4MiwgIC0xNjAyLCAgICAyNDIsICAtMTIzNCwgICAxODcwLCAgIDEwNjcsICAgMjQ0NCwKKyAgMTc1MiwgIC0yNTUyLCAgIDg3NzUsICAgMTM4NCwgICA1NjgzLCAgLTQ3NzAsIC0xMjQzNiwgICAtNjgwLAorLTEzMzQ0LCAgIC0xOTYsICAgLTI3NiwgICAtMjk5LCAgICA3MzQsICAxMjM3OCwgICAyMzY0LCAgICAzMjcsCisgLTE0OTQsICAgIDU2MCwgICAgLTkwLCAgIDMzOTQsICAgIDQ5NiwgICAyMzU3LCAgICA2MjksICAgIC0xNywKKyAgMTA0MCwgICAtNzA2LCAgICA1ODksICAgIDI5NCwgIC0xMTM1LCAgMjUwMTIsICAgIDQ0NCwgICAxMjA2LAorICAtMjk4LCAgIDE0MjQsICAgMTUyNCwgIC0yMTg4LCAgICAtNjQsICAtMTEwMSwgIC0xOTk4LCAgICAzNzQsCisgIDEzNzcsICAtMTM4MiwgLTExMzQ5LCAgIDE0NTYsICAgLTE3MSwgIC0yMzY5LCAgIDY5NjYsICAtMjgwOCwKKyAtODk4NywgICAzMzkwLCAgIC04MTEsICAgIDY3MSwgICAzMDMyLCAgLTMzOTYsICAtOTgxNSwgICAyMjQ2LAorICA0NDE4LCAgIC02NzgsICAgMTg1MSwgIC0xNTkyLCAtMTEwMzgsICAtMTE5NCwgIC0zNjEyLCAgIDI1ODksCisgIC0yNTAsICAgLTQ5NSwgICAxMjAzLCAgIDEzNDgsICAgLTgwNSwgICAxODUzLCAgIC0zNDUsICAgLTU1NSwKKyAtODc1NSwgIC05Njk1LCAgLTM3NjgsICAtMTUwNiwgIC04MTcyLCAgIC0zMjIsICAtNzE2MywgIC02MzE5LAorICAyMDUyLCAgICAxMTYsICAtNDQ1OSwgIC0yMzI4LCAgIDQ4NTcsICAtMjU2OSwgICAxNDE5LCAgICA5NTksCisgIDExMzgsICAgNzAzNCwgICA0ODM2LCAgIDM0NDksICAgNjgyNiwgIDEzNDExLCAgIC04OTMsICAgIDk4MSwKKyAtMjA2MCwgIC0zNzEwLCAgIDMxNzcsICAgLTc2MSwgIC0xMTI4LCAgIDQzODYsICAgLTEyNywgICA2Njk4LAorICAzNDI2LCAgLTI5MjIsICAgIC02MSwgICAgNDA4LCAgIDE0MjYsICAtMTIzOCwgIDE1NDY4LCAgICAgOTQsCisgICAzNzMsICAgMzU5NywgIC0yNDMyLCAgLTE5ODksICAgLTg1OSwgIC04OTc2LCAgIDI5MzgsICAgLTc3NywKKyAgIDQwOSwgICAtMjA2LCAgLTc3NTgsICAgMzM4NCwgICAgMjk1LCAgIC00NjYsICAgICAyOSwgICA3OTI1LAorICAyMDQ4LCAgICA5MzAsICAgMjI5NiwgLTEwMDMwLCAgICAzMzAsICAgNzg2NCwgIC0xMDA0LCAgIC0zODUsCisgIDIxMzAsICAgIDM4OCwgICAzNTg3LCAgLTQ0ODAsICAgMTU2MCwgLTEyNzY4LCAgLTI2MDYsICAgODE3OCwKKyAgIDc3MSwgIC0zNTE5LCAgLTE1OTAsICAgLTU5MiwgICAyMTkyLCAgLTExMjYsICAgIC03NywgIC0zOTQ3LAorICAxODY4LCAgLTEzMDQsICAxMTEwNywgICAgNzgxLCAgIDYyNDAsICAgNDEzNCwgIC0zMzE0LCAgICA0MDcsCisgLTYxMjUsICAgNTE2OCwgICAtNTAzLCAgIDIxNTUsICAgLTk5MCwgICAgMTQzLCAgICAyMTksICAtOTk1MCwKKyAtMTE4NiwgIC0xNDQ2LCAgIDE5MzAsICAtODk2MywgIC00MDg0LCAgLTYxNDEsICAgLTk3NiwgICAgMTUzLAorLTEzNjY1LCAgICA1NjQsICAxMzYzMSwgICAgMTM4LCAgIC0yNjksICAgIDM3OSwgICAxMzMzLCAgLTE3MTAsCisgIC05NDAsICAgLTUxMSwgICAxMjE0LCAgLTIxOTAsICAgMTM0NywgIC0xMzk3LCAgLTEzMjEsICAgICA5NCwKKyAtMTgwMiwgICA2NjI3LCAgIDEzMDYsIC0xMjM0NywgICAyNzgwLCAgLTEwOTEsICAtNDM2MiwgICA1MDQ3LAorICAtNDQ2LCAgLTM0NzIsICAgNjA2NCwgICAxMDc1LCAgICA0NzgsICAgIDc2OSwgICAgIDU4LCAgICA4MDIsCisgICA1NjIsICAtMTU4MSwgIDI4NTgwLCAgICAxOTQsICAgMTMzOCwgICAgNTczLCAgIC01NTUsICAgIDYxNywKKyAgLTQwOSwgIC0xMjQ5LCAgICAgLTgsICAgMTEzMywgICAgOTUyLCAgIC0xMjAsICAgMjUwMiwgICA1MzEzLAorICAgOTY5LCAgLTE2NjQsICAgMTc2OSwgLTEyMTk5LCAgIDU1NTEsICAgLTQwMiwgICA0ODYyLCAgIDMyNzAKK30sCisKKy5jYjIyMjRtMSA9IHsKKyAzMjc2NywgICAgLTU0LCAgIDEzODUsICAgLTIwNiwgICAgIDE5LCAgICA1MjIsICAtMTE3NiwgICAtNjY3LAorICAtMjYwLCAgLTEzODgsICAtMTc1MSwgIC0yMjM0LCAgICAyMjgsICAgLTM0MywgICAtODkzLCAgIC04OTgsCisgLTEwMDQsICAgMjUxNywgICAtMjMyLCAgMjA5OTYsICAgIDUwNywgIC0xODU3LCAgIDI1NzQsICAgIDg0MCwKKyAgLTYxNSwgIC0xOTIyLCAgICA2NjAsICAgIDg0NCwgICAgIDUyLCAgIDEyNzIsICAgIDYwOSwgICAtNjkyLAorIDIxODA1LCAgICA5MzgsICAgIDY3OCwgICAtMzk5LCAgICAtMjIsICAtMTgzOSwgICAtOTk2LCAgIDE1NjAsCisgICAyMTgsICAgMzk3MywgIC02NTQ3LCAgLTExNTEsICAtMzkxNCwgICAtNzg5LCAgICA5MzgsIC0xMTUwOSwKKyAtMjI4MiwgICAtNjA2LCAgIC0zMjcsICAgMzA4OCwgICAgNzk3LCAgLTE1NDAsICAtNzU5OCwgICAxMzc4LAorICAtMTAwLCAgIDIxMDgsICAtMTkwNywgLTExNjcxLCAgIDE1MzgsICAxMTEzNiwgICAgMzEwLCAgLTIwOTYsCisgLTMwMzcsICAgMzE4MSwgICAxNzMxLCAgIDIwNDMsICAgMzQyNCwgIC0xMDk4LCAgIDIwNDYsICAgIDU0NSwKKyAtMTc3OCwgICAgNjA1LCAgICA5MzIsICAgIDgzMiwgIC0yMzU2LCAgLTE0OTgsICAgMTEyOSwgIDExNTQyLAorICAgMTE5LCAtMTA5OTQsICAtMzcyMCwgICA0MzE2LCAgICAzNDYsICAtOTE0MSwgICAzOTIxLCAgIC05MTgsCisgLTU0NzYsICAgIDM3MiwgICAtMzE4LCAgIDkyNTQsICAgLTY4MSwgICA0ODk2LCAgIDE1ODcsICAgMTYyMCwKKyAgMTg1MCwgICA0MDU3LCAgLTE1MDcsICAgLTM2MiwgIC0xMDc0LCAgIC0zMjgsICAtMTUwMiwgIC0zMDkyLAorICAyNzM1LCAgIC0zNzgsIC0xMTU3MiwgIC0xMjkyLCAgLTI1NzUsICAtMzM5NywgIC03NTY2LCAgLTg5NzcsCisgIDE2NzAsICAgODY1OSwgICAtNjU1LCAgICA4ODQsICAgMTgxNSwgIC05MzQ4LCAgICA1NzAsICAgIDM5NCwKKyAgMTY3MCwgICAxOTQyLCAgIC0xOTUsICAgIDM4NiwgICAgNTUzLCAgIDg4ODUsICAtOTIwNiwgICAtNjI0LAorIC0yMzEyLCAgMTU4NTIsICAgIDc4MiwgICAgNTYyLCAgLTE0OTcsICAgIDcyMCwgICAxODA0LCAgIDE0MTUsCisgLTM4MDksICAgMzc4MywgIC0xOTE4LCAgLTM0OTYsICAgLTYzNywgICAgNTgxLCAgIDExNjEsICAgIDk2MSwKKyAgLTk2MCwgICAtOTMwLCAgLTE2NzMsICAgIDkwNCwgIDExNTEwLCAgLTIyODYsICAtOTk2NCwgICAyOTY0LAorIC01NzUyLCAgIDIyMjksICAgIDc4NiwgIC0xNDc5LCAtMTg4ODIsICAgMTUxNywgICAgMTI4LCAgIDMyODIsCisgICAxNTcsICAtMjE3OCwgICAtNTY0LCAgLTYwMjksICAgIDc2NiwgIC00NTk5LCAgIDM2MjAsICAtNDM4MCwKKy0yMDExNCwgICAtNjc3LCAgIDIxMzQsICAgIC05MywgICAxNDg2LCAgICA2NDgsICAtNDc5MCwgICAxODYyLAorIC0xNDc2LCAgICAtNTYsICAtMzQ0MywgIC0yNjIyLCAgLTI4MDYsICAtMTE4NSwgICAgMTIyLCAgIDE4MDEsCisgLTE1NDcsICAxMjI0MSwgIC0yNzg1LCAgIDIzODYsICAgICA1NiwgIC00MDc1LCAtMTA5NjQsICAgLTgzMiwKKyAtNDc0NCwgIC0xMzUwLCAgIDI4NDksICAgLTI1NSwgIC0xMzc1LCAgICAxNjMsICAgMTMwNiwgICAgIDM3LAorICAyMzA0LCAgLTEzOTYsIC0xMTIzNCwgICA5NzEyLCAgIDE3MzIsICAtMjI2MiwgICAzNjMyLCAgIC00MzEsCisgIC01NzksICAtNDA0NSwgICAgODA2LCAtMTIxNjgsICAtMTMwOSwgICAgODQwLCAgLTE0NzQsICAgIDkxOCwKKyAtMTI0MCwgIC0xNjAxLCAgICAgNDgsICAtNDEzNywgICA2OTM0LCAgIDM5NjgsICAgNzM3MCwgICA0MDg4LAorICA4NjQ4LCAgIDIzNTEsICAgMTQ2NiwgICAgNjE1LCAtMTIzMTQsICAtMjM0NywgICA0MzgyLCAgICA4NjIsCisgLTQyODgsICAtMzEzOCwgICAxODg2LCAgLTQzNTcsICAgIDM3NSwgICAxOTQ5LCAgICAgNzMsICAgIDI4NywKKyAgIDEzNSwgICAgLTYwLCAgLTE0OTgsICAtMjQyNywgICAxMjYzLCAgIDMzMjIsICAgLTU4MiwgIDE3NTA4LAorIC0xMjAyLCAgIDE1NTgsICAgMzM1MSwgICAgNDg0LCAgIC00MzksICAgLTU3MSwgICAtMzcwLCAgMTE5NTIsCisgMTE2NTYsICAtMTQwNywgIC0xNDEwLCAgLTI5NzYsICAgLTQ1OSwgICAgMzk3LCAgIDE5ODAsICAtMTM3NCwKKyAgMTIzNywgICA1MDQ0LCAgLTIwNzQsICAgIDQwNSwgLTEwNjUwLCAgIC0xNzQsIC0xMjU1NiwgIC0xOTYyLAorICA0NTY5LCAgLTEyOTMsICAgLTIwMCwgICAzMTA2LCAgICAzNDMsICAgIDc0OCwgICAxOTE4LCAgIDEwODQsCisgIC02NzAsICAgICAgMywgIC0xMDcwLCAgIC0zOTcsICAgMzk2NSwgICA5OTY2LCAgIC02MDksICAgOTY5MSwKKyAgLTkwMCwgICAgMTM3LCAgIDIzMDUsICAtNTk0NCwgICAtOTQ0LCAgLTE1MDAsICAgIDYzOCwgICAtNzAzLAorICAtNTgyLCAgMTAwOTgsICAgLTUyMywgICAgNzc2LCAgIDEyNjYsICAgNDg2MCwgICA2MjEzLCAgIDExODEsCisgLTU2MzQsICAgIDUxOCwgICA5MTE2LCAgLTQ3NDAsICAxMDY4MywgICAtNTQ3LCAgLTEyOTUsICAgIC05MSwKKyAgIDEwNCwgIC0zMTE1LCAgLTE3MjQsICAgIC0xNywgICAxOTUzLCAgIC03NDUsICAgIDY5NCwgICAtNDc0LAorIDEyMjQ4LCAgIC01OTYsICAgLTY3NCwgICAgNzY1LCAgICA2NzQsICAgNDQ5NCwgICAxMjA1LCAgIDU4ODMsCisgLTE2MzgsICAtMzk5NiwgICAtNjY0LCAgIDg2OTQsICAtNTYyMCwgICAzOTY4LCAgIC03MTcsIC0xMDQyNSwKKyAgLTI4NSwgLTEyNjA1LCAgICAzNjgsICAtMzkwNCwgIDEyMzYzLCAgLTEyODgsICAgMTI0MiwgIC0xNDk3LAorIC0zMTE3LCAgIDIzOTYsICAgLTIyMCwgICAxNzAwLCAgLTI3ODgsICAgIDI1MCwgICAgMTA3LCAgIC0xNTAsCisgICAzNDUsICAgIDY4MSwgICAgLTQ0LCAgLTI0NjYsICAgLTM4OSwgICAyMDk4LCAgICAzMTIsICAgICA1NCwKKyAgMjczNCwgLTIyMjI1LCAgLTEyMzIsICAtMTc3OCwgICAxMDYzLCAgLTE1ODYsICAtNjY1OCwgICAgMzQ0LAorIC0yODg5LCAgLTQzNDgsICAtMzY4NSwgIC0yMTAwLCAgICAgMTIsICAtMTc1NSwgIC02NDAxLCAgIC0xNDksCisgIDgxNTAsIC0xMDY4OSwgICAtNzQ4LCAgIDE0NDMsIC0zMjc2OCwgICAxNjk4LCAgIDE0NjEsICAgIDIxNiwKKyAgMTM3MywgIC0yODE0LCAgIDEwMTQsICAgMTEzNSwgICAtMjI3LCAgLTEzMDksICAgLTYxNiwgICAxNTY2LAorICAgMzk1LCAgIC03MjQsICAgIDg1MiwgICAxNTc5LCAgLTk2NDcsICAtMTIxNCwgICAgNzI4LCAgICAzMjksCisgIDkyNDQsICAgIDE3OSwgICA3MjA0LCAgIC04MzYsICAtMzk1NCwgICAgMTY4LCAgLTU3MjIsICAgIDE1MiwKKyAtMjg4NiwgICAgNDcyLCAgIC02NTEsICAgNTExNCwgICA4NzM0LCAgICAtNzEsICAxMTQwNiwgICAxMDk4LAorIC0xNDUyLCAgIDExOTAsICAgIDU5OCwgICAtODgwLCAgMTQ2MTEsICAxMjU0MCwgIC0xNTIzLCAgIDEzNDAsCisgIDEwMTUsICAgMTUxMCwgICAtMjA4LCAgICAyMDYsICAgMTMxNCwgIC0xNTMyLCAgIC0yNDYsICAtMzIxMCwKKyAtMTYzNywgICAtMTk3LCAgICAxOTcsIC0zMjc2OCwgICAxNDQ4LCAgIC0xOTEsICAtMTcyMCwgICAtMjE3LAorICAxMDIxLCAgICA5NzMsICAtMjA5OSwgICAgIDU2LCAgICA2MDYsICAgICAzOSwgIC0xNTY5LCAgLTEyMDUsCisgLTIzNzUsICAtMjE1NiwgICA0Nzk4LCAgIDI1MDQsIC0xMTkxNCwgICAgOTMzLCAgLTYwMTUsICAgMjY1NywKKyAtMjkxMSwgIC01MTczLCAgLTE5NjQsICAgMTU3NiwgICA1MjY4LCAgIDExOTAsICAgIDY3NSwgICAgODU2LAorIC0xNzE4LCAgLTQzMzIsICAgIDE2NiwgICAxNTU2LCAgMTkwMDUsICAgMjA0MCwgICAxMTk4LCAgLTIxNzAsCisgIDE4MjQsICAtMzQwOSwgICAgMTIxLCAgICA4MzAsICAgLTI1MiwgICAtNTI1LCAgICAyODksICAtMTcwMSwKKyAgIDI5MiwgICAgODU0LCAgLTExNTAsICAtMTEwOCwgICAgMTcxLCAgICA1MTEsICAyMjExNCwgICAgNjYyLAorIC0xMjYzLCAgIC01NDAsICAtMjMwNiwgIC0yMzMyLCAgICA4NjksICAtNTE5MSwgICAgMTg2LCAgICA1MzYsCisgICA0MTAsICAtNzU3NiwgICAgNTkwLCAgMTM2MjUsICAgMzUxOSwgICAzODU4LCAgLTI3ODcsICAgLTM3NiwKKyAtNjUwNiwgICAgODkxLCAgIDUwMjUsICAtMjA1NCwgICA4MzE2LCAgLTIxMTUsICAgNzY2OCwgIC01ODA4LAorIC0yNDY0LCAgLTI0MjIsICAgMTU0MSwgIC0zODUxLCAgIDE1NzgsICAgIDQyMCwgICAtNjE3LCAgLTY1MDcsCisgIC04NTgsICAgIDE2MCwgICAzODc2LCAgLTI4MzAsICAtNTk3MCwgIC0zMjk1LCAgIDk4MjksICAgMTA5OSwKKyAgMTYxNywgICAzNTAyLCAgLTMxMjQsICAtNDExNiwgICAgMTM4LCAgICAyODcsICAgIDkxNCwgICAtNTQ4LAorICAxMDU2LCAgLTE1NDYsICAgMTIxOCwgICAtMjI3LCAgMTE2MzIsICAgLTU3NCwgICAtOTk2LCAgLTk4OTQsCisgICA4MDgsICAtNTg2OCwgIC0xNDU3LCAgIDgzNzQsICAtMjA4NiwgICAtMjgwLCAgIDEwMzgsICAgIDUyOCwKKyAgMTg2MiwgICAgMjg0LCAgIDM5MjYsICAgLTE0NCwgICA3MTY4LCAgIDEyMjQsICAxMTYyOCwgICAtMjIxLAorICAxMDE4LCAgIDE2ODMsICAgIDkyMiwgICAgNTYxLCAgIDY5MTAsICAgMTg5NSwgICAzMDQ0LCAgMTI2MTMsCisgICAtNzQsICAtMTQyNCwgICAxNjU0LCAgIDg4NzIsICAgMjI1NSwgICAtOTkwLCAgLTIwMzksICAgIDI2OSwKKyAgOTU1OCwgIDEwMTIyLCAgICA5NTgsICAgIDQ2NiwgIC0xOTQ4LCAgLTEyNDIsICAgMTA0MiwgICAgODg2LAorIC0xMTQzLCAgLTM0NDQsICAtODcyMCwgICAxOTE4LCAgIC0zMDAsICAxOTA3NCwgIC0xNjI5LCAgICA5OTEsCisgICA5MDgsICAgLTg5NiwgICAxMjA3LCAgIDM2MDIsICAtNDgwMiwgIC0yOTEyLCAgIDQxMDAsICAgMjkzNiwKKyAtMTM0NCwgICAgNDU5LCAgLTY5MDQsICAgLTcxNCwgICAgNTI0LCAgICAxNzEsICAtMTQzMCwgICAxNDU0LAorIC0yNzI1LCAgIDExMzAsICAgLTc1NywgICAyODYxLCAtMTExNzQsICAtMjc2OCwgICA1NDY2LCAgIDM2NjIsCisgICAxMTAsICAtMTk5OSwgIDEyMzc2LCAgLTIxNzMsICAtMjUwOCwgIC0yODM4LCAgLTIwMjUsICAtNDM3OCwKKyAgIDEzNCwgIC05ODU2LCAgIDE3MzgsICAgMTAyNywgICAxNDI4LCAgICAgMzgsICAtMTU2MCwgIDEyODI0LAorIDEzOTMyLCAgICA1NDksICAgIDU4NiwgICAgNzIwLCAgICA5MjMsICAtMTA0MCwgIC0yODI3LCAgLTMyNzIsCisgIDE5MDIsICAtMjExMywgICAyNjI0LCAgIDMyOTYsICAgIC0zNCwgIDEyMjkxLCAgIDE0NDksIC0xMjEzOCwKKyAgLTc5NiwgICAgMTg2LCAgIDI3NzcsICAtMTAwNywgICAzMjc2LCAgIC01ODcsICAtMTkxNywgICAtMTMwLAorICAyMTIwLCAgIC01NjQsICAgLTM2NCwgICAxMDA1LCAgIC02MTUsICAgMTUwNCwgIC0yNDEyLCAgIDkyMTksCistMTE0MTIsICAtMjQ5MCwgICAxMjYyLCAgLTI3MjAsICAgMTYwOCwgIC0zMjc2LCAgIDEyOTQsICAgMTg4MiwKKyAgLTE4OCwgICA3MDkwLCAgIDYwMjksICAtNDIwNywgIC0yNzM5LCAgICAgNzIsIC0xMDAzNSwgIC0xNjcyLAorICAxNTA5LCAgIC0xMjQsICAtMTY0OSwgICAgNDIwLCAgLTM2MjMsICAtMTA2OSwgLTExMjI1LCAgIC03NTQsCisgIC0zODgsICAgIDc5MCwgIC0zMjA5LCAgIC0zMzAsICAtMjYzMiwgLTExOTIwLCAgIDMxNzgsICAtMTc4OCwKKyAgMjU4NSwgICA0MTQ2LCAgIDE5NDQsICAtMjc1NywgLTEwNjE2LCAgICAyMjAsIC0xNDEzNiwgICAyMTU4LAorICAtMjc0LCAgIDIwMTAsICAgLTM2MiwgICAxMTA3LCAgIC0zNDgsICAtMTk5MCwgICAgIDk2LCAgIC05ODUsCisgIDE1OTksICAgMTU2NiwgICAxMzkzLCAgICAzMDQsICAtMTM4MCwgICAtOTI0LCAgIC0yODUsICAgIDYyMCwKKyAgIC0zMCwgICAtOTAyLCAgMjYyMTAsICAgMTQ4NSwgICAxMDQyLCAgLTExNjAsICAgIDM1MiwgICAtMTc3LAorICAxMjQ1LCAgIDE4NzksICAgIC0xOCwgICAgNzI3LCAgIC00MjEsICAgIDIyMywgIC0xMjk4LCAgIDEwNjYsCisgICA5NjIsICAgMTMwNiwgICAzODY2LCAgICA4NzAsIC0xODc4MCwgIC0zODczLCAgICAxMDcsICAtMTQwOCwKKyAtMTI2MSwgICAgODA4LCAgIC04MTgsICAgMTczOCwgICAxNDM5LCAgLTIxNTYsICAtMTQ5OSwgIC0yMTA4LAorIC00NjI2LCAgIDQwMzksICAgLTk2NCwgIDE2NjgyLCAgLTExNjksICAgIDI2NiwgICA5MzczLCAgIDEyMzgsCisgLTI3MjgsICAgMjM4MSwgIDEyMTU5LCAgIDIxNTUsICAgLTQ3MiwgIC0yMjkzLCAgIC01MTMsICAgMzgwOCwKKyAgLTY5MCwgIC0yMTkwLCAgLTExMzksICAgICAtNiwgICAxMzc5LCAtMjI4MDMsICAgMTM4MCwgICAtNjEyLAorICAgMzA4LCAgIDEzOTQsICAgLTkwMiwgIC0xNDU0LCAgLTI2MjAsICAtMTA4MCwgIC0yODY0LCAgLTMzMDEsCisgICAxMDgsICAgIDIxOCwgICA4NzE4LCAgIC02MTcsICAtMTA5OCwgICAxNDM2LCAgLTIwMDUsICAtMzk2NiwKKyAtMjY1OCwgICA2MTUyLCAgIC04NzQsICAtNDYzNiwgICA4NzA1LCAgLTMzODIsIC0xMjA3MiwgICAgNDE4LAorIC0xODM3LCAtMTI1ODIsICAgIDI3MCwgICAtNzg4LCAgLTExNzQsICAgMjE1NiwgICAgNDYxLCAgIC0yOTcsCisgICA0NzgsICAgLTYzMiwgICAtMzU2LCAgIDU3OTYsIC0xMjAyNCwgICAgNDE2LCAgIDI2MDIsICAgMzU0NCwKKyAtMTI0MCwgICAtOTcwLCAgIDQ4NzQsICAgNzIyMSwgICAgNzA0LCAgIDg5NDAsICAgMjMxNiwgICAxMTc0LAorICAyNTM3LCAgIDUzODAsICAgICAtNSwgIC0xODE4LCAgIDMwMjAsICAtNDEyMCwgICA3MDQyLCAgLTk2MTgsCisgLTE2MjIsICAgMzU3NiwgICAyNDU1LCAgIC0yOTgsICAgIDQ1MSwgIC01Mjk4LCAgIDczNzEsICAtMTU3MCwKKy0xMjk1NiwgICA5NzU4LCAgIC0yMTYsICAgIDg4OSwgICA1Mzk1LCAgLTI3NzksICAtNDAzNiwgICAxNzM2LAorIC0xODcxLCAgLTIwMzYsICAtMTExOSwgICAxODQ3LCAgICA5MTIsICAgMjI5MiwgICAgODUwLCAgICAyMjAsCisgIDEzMDAsICAgMjIyOCwgICAgMzk5LCAgLTI4ODUsICAtMjY5NiwgICAyMzk5LCAgIDMxNzksICAgNjI2NiwKKyAgMTYyOSwgIDEzMDkxLCAgIC0yMzIsICAtNTMyMiwgICAxMzk3LCAgIC03MjQsICAgMTY2NiwgIC0yMDEyLAorICAzNjQzLCAgIDE0MDAsICAtMjcyNCwgLTE4MDA3LCAgIC01MDYsICAgLTEwMywgICAxMzE4LCAgIDI0NzMsCisgICA5NjUsICAgLTU4NywgICAxMTM1LCAgIC05MDQsICAgLTUxMCwgLTEwNzY3LCAgIDE5MzcsICAgLTU4NSwKKyAgIC03MywgIC0xNjYyLCAgIDMwMjEsICAgIDM0MCwgLTEyNDc1LCAgLTE2MTgsICAgICAtMSwgIC0xOTE0Cit9LAorCisuY2IyMjMybDAgPSB7CisgLTk5NDcsICAgLTY3MywgICAgNTIyLCAgICAtMzYsICAgIDM5NiwgICAtNDMzLCAgICA5NDksICAgLTQ0MiwKKy0xMjQ5NSwgIC0yMTg2LCAgIDQyODAsICAgLTk5NywgIC0xNzE1LCAgLTczODUsICAgLTM3OSwgICAzNDk4LAorICAtNTcyLCAgLTk4OTcsICAgNjY4NiwgIC00NzM2LCAgICA1NzcsICAgMTg2NiwgICAgNjU5LCAgIC0xMjMsCisgLTE2ODIsICAgIDQyMCwgICAtODY2LCAgIDQ0NTgsICAgNTgyMSwgICAzMTU1LCAgIDc5MjksICAtNTU2MiwKKyAtMTc5OCwgICAzMDg2LCAgIDg1NTYsICAgIC02NSwgIC04OTQzLCAgIDIzNTQsICAtNDE4NywgIC0zNzk4LAorICAgNjI3LCAgLTE4NTksICAtOTc2MCwgIC0xODExLCAgLTE3MjQsICAgIC00NSwgIC0xODM4LCAgIDE2MzgsCisgICA0OTksICAgIDE0OCwgICAtMzM1LCAgMjA5MTYsICAgLTI2NCwgICAtNTU2LCAgIC0yNjksICAtMTAxNCwKKyAtMTUzMSwgICAgNzExLCAgIC01MTksICAgIDQ2MiwgIC01MTE3LCAgIDM5NDQsICAgLTk1MCwgICA4Mjc3LAorICAgODc4LCAgLTQ4MDMsICAtNTAwMywgIC00NDAyLCAgLTQ3MjIsICAgMjk4OCwgICAtMTQ0LCAgLTY4ODcsCisgMTA2NjEsICAgLTkwOSwgICAgNzAwLCAgLTIyODcsICAxMjEyNiwgICAtMTAxLCAgIC03NjEsICAgMTgzNiwKKyAgIDgyNywgICAtNjA5LCAgICA1MzgsICAgIDQ0MiwgIC00NTA0LCAgIDE4MTIsICAgMzgxOCwgICA3MzU5LAorICAgIDk2LCAgIC01NTUsICAgMTU5OCwgIDEwMDQwLCAgIC01NTQsICAgIDkyNCwgICAzNDI2LCAgLTE3ODYsCisgIDI2MjAsICAtMjEzMiwgICAgODY3LCAgIC01MTksICAtMjI5OSwgICAtNjcyLCAgIC01MDgsICAgIDIwMSwKKyAtMjQ1NywgIDEwODcyLCAgLTUwMDMsICAgNTQyMiwgIC04ODkwLCAgIC0xMDQsICAgMjU3OSwgICAgOTQwLAorICAgNDAxLCAgICA4NzEsICAxMTE2NywgICAxMjE2LCAgIDEwNTQsICAtMjg3NiwgIC0xNTIzLCAgLTM5NTAsCisgLTEyMjksICAtMzQxMCwgICAtNDI4LCAgIDM2NDgsICAtOTM4OSwgIC0zMDI1LCAgLTE3NTIsICAgNzU4MywKKyAgMzk1MywgICAxOTM4LCAgIDM4OTksICAgMTQzNSwgICA4MTcwLCAgIDEwMTksICAtMjMyMCwgICAxMjk5LAorIC0xMTUyLCAgICAyMjYsICAgIDM5NCwgIDExMzI4LCAgLTE0NzEsICAgIDYwNCwgICAtMTg0LCAgICA1NjcsCisgLTM3MDQsICAtNTcyMywgIC01OTM4LCAgICA0MjMsICAgOTM2MiwgICA0NTQ2LCAgLTMzMTgsICAtMzM5NSwKKyAgNTA4NCwgIC00MzQxLCAgLTE3ODEsICAtMjYxOSwgICAxMDc4LCAgIC0zNjUsICAgIDE1MSwgICAtNDEzLAorLTIxNTkxLCAgIC05NjgsICAgLTIwMiwgICAtMTgzLCAgICA4NDksICAgLTQ4MSwgICAgNDA3LCAgICAtMTEsCisgLTI3MDgsICAgMjQ3MiwgICAyNjg5LCAgLTkyMzIsICAtOTQ4MiwgIC0xNzc2LCAgICA2NDUsICAtMTUxMCwKKyAtMTQxMCwgIC02MTE1LCAgIC0xMTQsICAtMjU1MCwgICAxOTIyLCAgIDE2NjgsICAgIDI4OCwgIC0xMzAyLAorICAgOTQ4LCAgIDE5NjcsICAgICA1MiwgICAyMzkzLCAgLTE5NzUsICAgIDM3NCwgIDE3MzU4LCAgLTEzMzIsCisgIDUzMDMsICAgMzE5NSwgIC0yNjc0LCAgIDQ3ODQsICAtMTQxOCwgIC0xMzU5LCAgICAtNTcsICAtMjEyNiwKKyAgNDYxOCwgICA4ODkwLCAgIDY0NTUsICAgMTE4MSwgICAgIDc2LCAgICAzNzQsICAgOTU4NSwgICA4NzYyLAorICAgNjcyLCAgIC02NDIsICAgIDY2NiwgIC02NDg1LCAgIDE3NTEsICAgMzI1NSwgICAtOTM0LCAgIDYxOTYsCisgICA4OTIsICAgIDE3MSwgICAtMTAyLCAgICAtNDQsICAgLTMyNiwgICAxMzMwLCAgIC0zMjAsICAgLTQ4MCwKKyAgLTg0MiwgLTIyMzc2LCAgIC01NjEsICAgLTE0MSwgICAgNjM1LCAgLTY1MjgsICAgNTcxMSwgICAyNDAwLAorICAgODM4LCAgIDI4NDYsICAtMzIxMiwgIC01MzQxLCAgLTU0NzksICAgNDk2MSwgICAyMTEwLCAgLTc0ODAsCisgLTQyMTUsICAgNzk2NCwgIC0xMzA4LCAgIDEyMTksICAgMTU0MSwgIC00NDE4LCAgIDYyOTMsICAtNDUyMiwKKyAtNDg4NywgIC01NzYwLCAgIDI3OTAsICAgMTQ0MSwgICA2MTM1LCAgLTExMzMsICAtMTYyNywgICAxMjM1LAorICAgOTE0LCAgICA1NzIsICAtMTA0MywgIC0xNDczLCAgIC01MTksICAtNDYxOCwgIC0xMjI4LCAtMTIyMTIsCisgIDExMDEsIC0xMDc5NCwgIC00MjkyLCAgLTQzNTUsICAgNjQzMSwgICAtNTg4LCAgIC05OTIsICAgIDYxMiwKKyAtMTc3MSwgICA2NzUxLCAgIDQ4NzEsICAgIDU4MSwgICAgNjIwLCAgIC0zNTIsICAgIDI3NywgICAgNzI3LAorICAyMjI2LCAgIDg1NTIsICAgIC00MywgICAyMjk1LCAgIDk0MDksICAgMTEyMiwgICA3NjE4LCAgIDE4ODUsCisgIDExOTIsICAtMTQzMiwgIC0xMTAzLCAgIDg2NjYsICAtMjA3OCwgICAtNDAzLCAgLTE3ODcsICAgMTU3MiwKKyAtMjIwMCwgIC03NzA1LCAgLTY3NDMsICAtMTI3NywgIC0xMjI4LCAgICA5NTUsICAgNzYxMywgIC0xNTM2LAorICA4NTMwLCAgIDU3MDMsICAgNTQ0NiwgICA0MjUxLCAgIC04NTMsICAgNDkxMCwgICAxNTc4LCAgIDI4MzIsCisgIDEyNzQsICAtMjYxMCwgICAgMjQzLCAgIDI4MjAsICAgIDk1MSwgICA5MjQwLCAgIDE2MTcsICAgIDYwNSwKKyAtNjc1NSwgIC0yNzI4LCAgLTU2NTgsICAgMzg2NiwgICAtMTU3LCAgIDEyMTUsICAtODQ3MCwgIC0yMDM4LAorICAtMTg5LCAgMTA0MTEsICAgNzQ0NCwgICAtMzc2LCAgICA0MDcsICAtMTEyOCwgICAgNzcwLCAgIC00MTAsCisgICA1MDMsICAgMTcwNywgICAgNzg2LCAgIC01MjksICAgICA4MiwgICAgLTI3LCAgMjE1MTIsICAgLTI4MiwKKyAgICA4MSwgIC0xMTI5LCAgIC02ODYsICAgLTU1NSwgICAyNjc0LCAgICAtOTksICAgMTI4NCwgICAyMjE2LAorICAxMjM4LCAgICA0MDQsICAtMzM5OCwgICAxMDEwLCAgIDM5NjYsICAtMTEzNCwgIC0yNjgyLCAgMTQyMjIsCisgLTE1ODEsICAgOTc3OSwgIC0xMTE0LCAgICA4NDgsICAgMTkwNSwgICAyMTI5LCAgLTM5MzcsICAtNDc0MiwKKyAgMTIyOSwgICA4MDUxLCAgLTQzNDQsICAgMzkxNCwgICA0MjczLCAgIC02NTksICAgIDE1OSwgIC0xMTg4LAorIC0xODQ0LCAgICA5MTIsICAtMTI1NiwgICAtNDc4LCAtMTYxNTgsICAtMjg2OSwgICAgOTU5LCAgLTIwOTYsCisgLTIxNjYsICAgMjM2MCwgICA3ODYxLCAgLTI3MTgsICAtNjM1OCwgICA3NjUzLCAgIDY2MzksICAtMzIzOSwKKyAtMTY5MCwgIC0xMjQyLCAgIDM0MzksICAgMTI1NCwgICAtOTU0LCAgICA2MDQsICAxNzUxMiwgICAtMjg4LAorICAyNDEyLCAgICAyMTEsICAgLTI5OCwgICAyNjU2LCAgLTUyMTcsICAtMTc3MCwgICAgODkyLCAgIDE5NzksCisgLTE0ODIsICAgMzQ5OCwgICAgLTQwLCAgMTA0MjQsICAtMTAzOCwgIC0xODYyLCAgIDk5MDUsICAgIDI5OCwKKyAgICA3NywgICAyMTc5LCAgLTQ0NDQsICAgMjU4MCwgIC0yMDY5LCAgLTY0NzMsICAgICA2MSwgICAgIDg0LAorICAxMDM1LCAgIC02NDUsICAgLTY2MiwgICAtODI0LCAgIC03NDMsICAgLTEwNCwgIC0xOTYyLCAgIC0xMjQsCisgIDQ5NzYsICAtNTM3OCwgIC0xMjU0LCAgLTcwNTUsICAtMzQ3NCwgLTEwNjk1LCAgLTEyNTQsICAgMjU0NywKKyAgLTY5NCwgICAzMTk0LCAgICAtODIsICAtMjYzNCwgICAgMjMwLCAgICAzNTgsICAgIC0xMiwgICAxNTk0LAorICAgLTkwLCAgICA1OTgsICAgIC03NiwgLTIxMTM2LCAgLTEyNzgsICAgIDg0NiwgICAgLTg0LCAgICAyNTksCisgLTI1MzYsICAtNDQ0MiwgICAyMzM3LCAgLTE2MDYsICAtMzI2NCwgIC0zMTI2LCAgIC01OTEsICAtMTI5NSwKKyAtMjQ0MCwgIC0yNTkyLCAgMTA4ODgsICAgNTgyMSwgICAtODYyLCAgLTUwNzAsICAxMDQwMiwgLTEwNjMzLAorICAgMTU5LCAgLTI2NjAsICAgIDg5NCwgIC0yMTEyLCAgLTE3NzQsICAgMzczMiwgIC0xMDIwLCAgICA0MjIsCisgIDk0ODcsICAgMTYwOCwgICAtOTkyLCAgIDIwNDYsICAgIDI3NSwgLTEwNjc2LCAgIDI2MDYsICAgLTk5OSwKKyAgIDQ3NywgIC0xODY4LCAgLTE2OTAsICAgNDc2NCwgIC02NDE5LCAgLTc1NTAsICAgODE1OSwgICAgNTI5LAorICAyMzA4LCAgIC0zOTQsICAtMjM5NCwgICAyODI2LCAgIDY2ODAsICAgIDQ5NiwgICAzNjI4LCAgIC02NDYsCisgIDMxODYsICAgLTY1NywgIC0yMjYwLCAgLTE0MTYsICAtOTIwMiwgICAgNDk2LCAgIDY2MjQsICAgMjQ0MSwKKyAgMTU1NCwgIC0yMTk1LCAgLTg0NTgsICAtMzQ1OSwgICAgNDY2LCAgIDY3MDYsICAgMTA1NiwgIC04Nzc3LAorICA1NDM2LCAgLTQwMDAsICAtMzEzMCwgICA0Nzk0LCAgLTYxMjcsICAgMjAwOCwgICAxNjAyLCAgICAxOTUsCisgICA1NTgsICAtMTM2MiwgICAtODgwLCAgLTI2NjIsICAgOTcyNiwgIC05NzkzLCAgIDI5ODksICAtMzE4MiwKKyAtMjM3OCwgIC0xMzM4LCAgIDEwODYsICAtNDY4MiwgICAgMzcyLCAgIC0zOTksICAxMTEyOSwgICAtNjAxLAorICAtNjY2LCAgIDUyMDYsICAtMTEwNiwgICAgMzYyLCAgIDMxNTUsICAgIDMyOCwgIC05ODYyLCAgICA3MTksCisgIDE2MDIsICAgIDk5OCwgIC0yMzQyLCAgICA4NTcsICAgMTUxMCwgICAgNDc2LCAgIDcyNTYsICAgNDY1MiwKKyAtNTc1MCwgIC00OTkxLCAgIDQ2MTEsICAgODcxOCwgIC00NDM0LCAgLTQxMTksICAgLTM1MSwgIC0xNjA2LAorIC0xMDMzLCAgLTM3MTcsICAgMzU4NSwgICA5MzgxLCAgLTE1OTQsICAgNTA1MiwgIC03NDE0LCAgIC0yMDUsCisgIDIzNTYsICAtNTk0OSwgIC04NzM4LCAgIDE1MjYsICAtMTgzOCwgICA0NzYwLCAgLTU0NDQsICAgIDYyMywKKyAgIDExMiwgIC0yODYzLCAgIDU3MTAsICAgNDkyMCwgICA5NDk3LCAgIDM3NTksICAxMDc0OCwgICAtMjAxLAorICAgNzE2LCAgICA3NDcsICAtMjU1OSwgIC00MDc3LCAgIC00NDksICAgLTc0MSwgICAtMTM2LCAgLTEzMDMsCisgIC01NzIsICAgMTg4NiwgICAtOTg2LCAtMTA1MjksICAgIC01MSwgICAxMzYwLCAgIDI0MTgsICAgIDExNiwKKyAtMTQ5MCwgICAxOTI4LCAgLTk5NzcsICAgNDcyMCwgICAgMjI3LCAtMTEyMTIsICAgMzczMCwgIC0yOTk2LAorICAxMzAwLCAgIDk5MzUsICAgIDM1NiwgIC00NjE4LCAgIC0zODQsICAgIDk3MiwgICAzMTc0LCAgIDM3MzIsCisgIC04MDMsICAgMjY2NiwgICAgNzkwLCAgIDIwNjcsICAgMjM0MywgIC0xMjA5LCAtMTAxNDcsICAgICAyMSwKKyAgOTA2NiwgIC00NTY0LCAgIDI1MDgsICAgLTE3NiwgICAgMjY0LCAgIDk4MzQsICAgMzM2MCwgICA3Mjc4LAorICA5Mzg2LCAgLTEyNzQsICAgIDUyMiwgICAgLTUwLCAgIDQxNTAsICAgLTg4NCwgICAgNTkyLCAgIC02ODgsCisgICAzMDksICAyMDc1MCwgICAgNjcyLCAgLTEzMjYsICAgLTM0NiwgICAgMzY2LCAgIDIwNTgsICAgLTYwNywKKyAgIDYzMywgICAgNjIwLCAgIC02NzcsICAgIDMzMCwgICAgIDY5LCAgICA0MzIsICAgIDMxOSwgICAgNDM2LAorICAtMzAwLCAgMjE4NDUsICAgLTMxOCwgICAtNjc2LCAgICAzMjAsICAgLTM4NiwgICAgODg5LCAgIC03MjQsCisgLTEzOTQsICAtMjY2NCwgICAtNDMxLCAgIDIwNDYsICAgLTEzNiwgICA1NTIwLCAgIDY3MDAsICAgMTE5MiwKKyAgNTc3OSwgICA5Mzg2LCAgLTM1NDEsICAtNTYzOCwgLTE2MTI1LCAgIC0yNTksICAgIDU0NSwgICAtMjY3LAorICAxOTcyLCAgLTIzNjYsICAgIC00MywgICAgNjE1LCAgICAyNTEsICAgMTAwMywgICAtOTgwLCAgIDIyNjIsCistMTA1MTksICAxMjE2NiwgICAyMDA3LCAgIC04ODQsICAtMTU2MCwgIC0xMjUwLCAgIC00OTEsICAgLTQzOCwKKyAgIDgyMCwgICAxMjEyLCAgIDM1MTIsICAgIDM1NCwgIC0xMDY2LCAgICAtNDYsICAgICA5OCwgICAgMzE1LAorICA4NTMyLCAgICA5NDQsICAtMTI5NywgICA4MDExLCAgIDEwMjksICAgLTM4MywgIC0xNjA2LCAgLTgzODEsCisgLTE2NTAsICAgMjg1MiwgICAtOTU4LCAgIDE3NTcsICAtNDI3MCwgICAyMTYwLCAgLTkyODMsICAgMjkxOCwKKyAtMzcxOCwgICAtMjI0LCAgIDYxNTQsICAtNTY3MSwgICAzNzY0LCAgIC01NTQsICAgNTIxNCwgIC0yNTI2LAorICAgLTMxLCAgICA1NDcsICAgICAgNiwgICAxNjMzLCAgLTQ1NjIsICAgMTQyNCwgICAxMTc3LCAgIC04NjYsCisgIDE2NDgsICAgIDY1MywgICA2MDU2LCAgLTE4NDUsICAtMTI3MSwgICAtMzUwLCAgICA1OTYsICAtMjI4NiwKKyAgOTg5MywgIC02NTk0LCAgIDEwOTksICAgIDYzMCwgICAtNTM3LCAgICAyMzAsICAgIDk3MiwgICAtMTM0LAorICAtNDkxLCAgICAgNzksICAgIDMwNiwgICAgLTc0LCAgICAyNTMsICAgIDIwOCwgIC0xODA0LCAgICAgNzMKK30sCisKKy5jYjIyMzJsMSA9IHsKKy0xMTM5NywgICAgMzc4LCAgMTI4NDUsICAtMTgxMywgICAgMzQyLCAgICAzMjksICAgMTE2NSwgICAgNTUwLAorICAgNTU2LCAgIC0xMTUsICAgIDc1NSwgICAgMTE3LCAgIDI1MTEsICAgIDI2MCwgIC0xMTg5LCAgLTE0MDYsCisgLTE1MjgsICAgMTg2NiwgICAzMzAwLCAgLTk2NzgsICAgMTAyNSwgIDEwNDEzLCAgICAxOTksICAgMjg3OCwKKyAtMzU3MiwgICA4NzAxLCAgLTE4OTUsICAtMTE4OSwgICAtNTc2LCAgLTMzODQsICAgLTE2MiwgLTEwODY2LAorICAzMjUzLCAgLTEyNjcsICAgICA5MSwgICAyMjc3LCAgICAtODYsICAtMzM5NCwgICA2NTc2LCAgLTI0NzUsCisgLTExMzYsICAtNDI5NSwgIC0xNjEwLCAgLTgwNjQsICAgIDI5NywgIC04OTA4LCAgLTQ0MzMsICAtMjk1NCwKKyAgIC04MiwgLTExNDI2LCAgLTQ2MTAsICAgMjA2MywgICAxNTIyLCAgLTc5NzIsICAgLTQ5NSwgICAxNzk5LAorICAyOTIyLCAgLTUxNzksICAgLTg2NSwgICA0NzM5LCAgMTEwNzIsICAgMzkyNywgICAtNDgzLCAtMTExMTEsCisgLTIzNzUsICAtMTQzMiwgICAxMjEwLCAgLTEzNDIsICAgMjQxOCwgICAxNjg4LCAgICA4NTIsICAgIC02NCwKKyAgIDEzMywgIC00NTgyLCAgLTcxMzYsICAxMDU1OCwgIC0zNDE3LCAgLTMxNjIsICAgMjAzMywgICAzMTQ5LAorIC0zMDUwLCAgIDI1MzIsICAgIDU2OCwgIC0yNDQ0LCAgIDQwODIsICAtMjg1OSwgLTEwMzUwLCAgLTQ5ODMsCisgIDY2MzMsICAgIDIzMCwgICA1OTU0LCAgLTExNDAsICAgLTY1NywgICAtOTk4LCAgIDExNTYsICAgIDczNiwKKyAtODg5NCwgICAgIDY0LCAgICA5MzksICAgLTI2MCwgIC0xNzA0LCAgIC01MjYsICAtMTMzMCwgICAtODY5LAorIC0yNDI3LCAgMTIzNzcsICAgMTI5NiwgICAtMTIwLCAtMTA1NjAsICAgMTc5NCwgIC05MDkwLCAgIDE0ODcsCisgIDcxNjIsICAgIDUxOSwgICAtMzgyLCAgLTMyMzQsICAgIC02NiwgICAxMjk0LCAgIDIzNjMsICAgMTQ4MiwKKyAgIDQ5OCwgIC00MDUzLCAgIC03NTIsICAgLTE1NCwgICAtNTg3LCAgIC0yOTMsICAxNjUzMywgICAgIDY1LAorIC0xMjExLCAgIDE2NjYsICAgIDI5MSwgICAyODIwLCAgIDIyMjIsICAgICAgMiwgICAgODY1LCAgICAzNDQsCisgLTEyMDYsICAtMTIxNCwgIC0yMTYyLCAgIDg4NDIsICAxMTA2MywgIC0yMDkzLCAgIDE4OTYsICAgLTg1NywKKyAgLTE0NCwgICAgMzIxLCAgLTk1NDgsICAgNDQ2NCwgICA1MDM4LCAgIC0yODIsICAgMTE2MCwgICAtMTk0LAorICAgODIzLCAgIDM0NzksICAtODIzNCwgICA1ODM0LCAgIC0zMjAsICAgNzExNCwgICAtMTg0LCAgLTI2NjMsCistMTE2NzAsICAgIDQ3MiwgIC0yMDEzLCAgLTEyODIsICAgNDM5MCwgICA0NDUzLCAgLTIxMjYsICAtMjQ4MywKKyAgLTkwMCwgIC02MjYyLCAgLTIyMzcsICAgLTUzOSwgIC0xMTM0LCAgICAxNjQsICAgIDQyNiwgIC04OTY5LAorIC0xNzQ2LCAgLTE5NjAsICAgODE3MiwgIC0yMTI3LCAtMTk5NDgsICAgIDY1NywgICAtNzEyLCAgICAzNDQsCisgIC00NDMsICAgIDQ1OCwgICAtNTY0LCAgICAgNTYsICAgIDc1NiwgICAtMTU3LCAgICAyNzQsICAtMTMyNCwKKyAtMzM3MiwgICAyOTgxLCAgICA2MzUsICAtOTQ1NCwgIC00OTE2LCAgIDI4ODQsICAgMjMxNiwgICA4MjAwLAorIC0xNDUyLCAgIDIxMzUsICAgMTc4NSwgIC0xMDU0LCAgICAgODIsICAgNTAwNywgIC00MTY0LCAgICA2NDIsCisgIDkyNDEsICAgNTA5MSwgICAxMDAyLCAgIDI0NjcsICAtODQwOSwgICAtODU0LCAgIC04NjEsICAtMjMxNywKKyAgIDQwNSwgIC0xODEwLCAgIC03OTMsICAtNzkwNywgICAgNDk2LCAgLTEwMDUsICAgMzM3MywgIC0xMDE2LAorICA5NTI3LCAgIC01NDIsICAgMTY3MiwgIC05MTA1LCAgICAyODAsICAxMTE3MCwgICAgMjczLCAgICA5MDgsCisgICAgODksICAgLTIzMywgIDEwODUwLCAgICA4NzAsICAgIDQzNiwgICAxNjMwLCAgIDMzMjgsICAgLTQ5OSwKKyAgNTA5MSwgICAxMjI0LCAgIDkxMzUsICAgLTQ4MCwgIC0xMTM0LCAgIDI0MjgsICAtMjkwNCwgICA1MDc3LAorICAyMDE0LCAgIDI4NTksICAgNDI3NywgICA3NzYzLCAgIDg3MTksIC0xMTQ3NCwgICAxNjE5LCAgIDExNjcsCisgLTMxODgsICAtMTA2MywgICAtNDMzLCAgLTQyOTEsICAgMjY0NiwgICAxMDI0LCAgIDIwMDgsICAgIDMxNywKKyAgIDc0NiwgICAgMzI3LCAgIDY4MjQsICAgMTE3NCwgICA4OTc4LCAgIDUyNTQsICAtODk0OCwgICAtMTM2LAorIC0yNjAyLCAgLTE0NDIsICAgLTY5OCwgICAtOTUwLCAgIDE4MDAsICAgIDI5NiwgIC0xMDE2LCAgIDE2NTMsCisgIDM3NzEsICAtOTMyNiwgICA0NTM2LCAgIDcwMzMsICAgNDcyOSwgICA2NjMwLCAgIDEwNDIsICAgIDE2NywKKyAxMTQ4NSwgIDEyMzM4LCAgIC0xNDcsICAgMjgzNCwgICAgNjExLCAgIDE4NDQsICAgLTMxMywgICAgNDg2LAorICAtOTE2LCAgIC04ODcsICAtMTQyMywgICAgNjQyLCAgICAyNDIsICAgICA3NSwgIC0xODc1LCAgIC02NDUsCisgLTEyMzksICAtMjExOCwgICAxNDU4LCAgIC0yNzIsICAtMTcwMywgICAgOTQ5LCAgICA3NzgsICAyMTgyNiwKKyAgIDIxNCwgIC0xMzIwLCAgICAzMTAsICAgMjY4MCwgIC0xNTQyLCAgLTIyMDIsICAgMTA3MiwgICAtMTMyLAorIC0yMDY3LCAgLTM1OTMsICAtODI5MywgLTEwMzMxLCAgIDkwMzAsICAgIDQwMiwgIC0yNzAyLCAgIDI5ODQsCistMTIwNjgsICAgMzE3MCwgIC0xMDk4LCAgLTExNzUsICAtMTE4OCwgICAyOTk4LCAgIDExNTksICAtMTcxMiwKKyAgLTkwNCwgICAgMjM2LCAgICAgNDIsICAgIDgyMywgICAgNTQ4LCAgIC01NDYsICAtMTk1NCwgIDE1OTg5LAorIC0yMjEyLCAgIDE4ODYsICAgMjMwMCwgICAyMjkzLCAgIDI2MDYsICAgMjkwNSwgICAyMzY1LCAgLTEyMTQsCisgIDE1OTIsICAgMTM2MiwgIC0yMjEwLCAgIDE2NzQsICAtMTg5MiwgIDE1MDQ5LCAgLTEwMTIsICAtMjgyNCwKKyAgLTc5MiwgLTExNDQ3LCAgMTExNDQsICAgNDg1MywgICAtMzU3LCAgLTEyMzAsICAgIDc0OCwgICAxMjEyLAorICAtMjk0LCAgIC00MjQsICAtMjcyMCwgICAgIDc4LCAgLTIxNDksICAgIDk2NiwgICA3Nzk0LCAgIDE2NDUsCisgICAxMzgsICAgLTcwOSwgICAgNDY0LCAgIDM2MTQsIC0xMDMwOCwgICAgMzEwLCAgLTQ3MjYsICAtMzY5NCwKKyAgMTA4OCwgICAtNTc2LCAgICA2OTAsICAgICA2OCwgICAtMTQ1LCAgLTMyODIsICAtOTI4MCwgIC05NTM3LAorIC0xMjc0LCAgIDMyMDIsICAgIDU4OCwgICAxNzkwLCAgIDE0MzcsICAgMzg4MCwgIC0xODAzLCAgLTExNTQsCisgMTUwODIsICAtMjM4OCwgIC0xNzQ2LCAgIC04ODUsICAgMjI2NywgICAxODEzLCAgIDE2ODgsICAtMTAzOSwKKyAgOTc3NSwgICAgMzUwLCAgIDMyMTgsICAxMDU1MCwgICAxMDQ4LCAgLTM3MzEsICAtMzc0OCwgICAzNTE3LAorICAtOTEwLCAgIC02NjMsICAgLTQxMywgIC0xMDQ1LCAgLTEyMzYsICAgLTI0OCwgICAtMTMyLCAgLTExOTYsCisgICAgMTIsICAxNTgxNSwgICAgNjUzLCAgIDE0MjksICAgLTM3MSwgICA0MDk0LCAgLTMwNTAsICAgIDU2NywKKyAtNTUyNCwgLTExMTI4LCAgLTQyNjEsICAgMTkyOSwgIC0xNzE5LCAgIDgyMzYsICAgIDY4NiwgICAxMzA5LAorIC0xMDU3LCAgIC03MTUsICAtMjU4NiwgICAxMzI3LCAgICAtMzgsICAtNjE4MCwgICAzNDk5LCAgLTIwODAsCisgIDg5ODAsICAtMTg5MCwgICAgIDYyLCAgLTEwMDQsICAgMzMwOCwgICA1ODA5LCAgLTU3NzgsICAtMzg2NSwKKyAgLTYxMCwgICAgMTgwLCAgIC01MTksICAgMzEyOSwgICA5MDAwLCAgIDE2MDcsICAgODQ4NCwgIC00MDU2LAorICA0NzQxLCAgLTQ0OTEsICAgLTM1NSwgIC0xMzI0LCAgIDEyMDMsICAtMTg2NCwgICAtODExLCAtMTU5OTUsCisgIC0xMjEsICAgMTMyNSwgICAtODE3LCAgLTIxNzAsICAtNTc1MywgICAgNzMxLCAgLTE4NzUsICAtMjI4NiwKKyAtOTE5MywgICAtMzA3LCAgICAyNDcsICAgMjQ2OSwgIC0xNzM4LCAtMTIyOTAsICAgICAzMSwgICAxMDI4LAorICAgNjcwLCAgICAtNjYsICAtMTg1NiwgICAgNTcwLCAgLTM1NDIsICAtMzQwMSwgICAgMTQ0LCAgIC0zMjAsCisgIC01MjQsICAgIDE4NCwgICAtOTI4LCAgLTE2MDYsICAxMDk3OCwgIC0zMTE0LCAgLTg4NjEsICAgMTQ2NywKKyAgMTE1NiwgICAgODcyLCAgIDgyNzYsICAgNTY1NSwgICAtNjk1LCAgIDI3ODgsICAgMzczMywgICAyMTU1LAorIC0yMDQ0LCAtMTAyNjAsICAgMTY4MywgICAxODU5LCAgIC0yNjMsICAxNzk2NiwgICAgLTE5LCAgIDE2MjEsCisgICAgNTAsICAgLTI2MSwgIC00MTQzLCAgIDEyNDUsICAgIC0yMiwgIC0xNTY0LCAgICA4MDksICAgMjQ2MiwKKyAtODAwNSwgICAxMjQ3LCAgLTE0NzEsICAgLTc2MywgIC0xNjg2LCAgIC02OTgsICAgMjg2OCwgICAgNzk2LAorICA0MDM2LCAgLTM2NzIsICAxMTIwOSwgICAxMTAyLCAgLTkzNjksICAtMTAwOCwgICAxMjczLCAgIC05MDYsCisgLTQ0NTgsICAgMTY0MiwgIC0zMjU0LCAgIDM1NjMsICAgIC05NCwgIC02MjY3LCAgIC02MDQsICAgODY4NywKKyAgMjM4OCwgICAyMjE0LCAgIDE3NTksICAtNzc4OCwgICA0Mjk2LCAgLTc0NjcsICAgMzU0NywgICAzMjQ4LAorICAgODQ1LCAgLTc3ODQsICAtMjE5NSwgICAgLTQyLCAgIDUzMjcsICAtMTAwMiwgIC0zOTE1LCAgLTQ1ODEsCisgLTEyMTUsICAgLTkxOSwgIC0zNDQ0LCAgIDUxNDIsICAtMTg3NCwgIC0zMDIwLCAgLTI2MjcsICAgMTEyOSwKKyAtNDQ1NiwgICAxODQwLCAtMTE0NzIsICAgLTkxNCwgIC02MzY2LCAgIDM0OTUsICAtMjc3NSwgICAgNDg0LAorIC01ODU5LCAgICA5ODAsICAtMTk2NywgICAxMzUwLCAgICA5MjksICAgNjg1NiwgIC0zOTUyLCAgLTMzNjUsCisgIDE1MTQsICAgNzQyMywgICAtNjc1LCAgLTIyNjAsICAgNjAyNywgIC0zMDcyLCAgLTYzODgsICAtMzcxNiwKKyAtMjM5OCwgICA1NTY0LCAgIDE0NDcsICAgIC04NiwgICAxMTgwLCAgLTEyMzksICAtMTM3MiwgICAtNDM1LAorIC0xMzE0LCAgLTE5NzgsICAgIDk0MiwgIC0yMDE4LCAgIDEwMjcsICAgIDcwNCwgIDIwNDE3LCAgICAtOTQsCisgLTEyMzksICAgIDI1MiwgICAtMTcxLCAgLTExMDAsICAgMTY4NCwgICAxNDAxLCAgICA2MjMsICAgLTM1NCwKKyAtMjY3NCwgIC01MDQyLCAgIC03MzQsICAtNjYzMSwgICA3NTg3LCAgIDQ5MDEsICAtMTU5NiwgICA2ODA2LAorICA0MjMwLCAgIC04NTksICAgLTg2NywgICAxMjY2LCAgLTM4NjksICAtMzk3MiwgICAxNTQ4LCAgLTQ4ODksCisgIDI4MTEsICAgMjI2MywgICAyNDY4LCAgICAzNTQsICAtNjE5NywgIC0xMjc4LCAgIDE5NDcsICAgNTY3NSwKKyAxMDYxMiwgIC0xNzMwLCAgIDIwNTYsICAgIC03MCwgICAzMDM0LCAgIC01ODMsICAgIDg3OSwgIC0zNzE5LAorIC04NjIzLCAgLTEyNDEsICAgIDgyMiwgICA1ODMyLCAgICAxNjMsICAtMTA3NSwgICAtNzg0LCAgICAzOTgsCisgIDExNzAsICAgLTcxNywgICAtMzc0LCAgICA4NTYsIC0yMTYwMiwgICAgIDg5LCAgIC01MTMsICAgIDI2MCwKKyAgIDg1NCwgICAxMTUyLCAgICA3NjIsICAgLTYwMSwgICAgNTIzLCAgIC0xMDcsICAgMTAzMywgICAxODc3LAorIC0xNDU2LCAgICAyMjYsIC0yMDc1OCwgICAgMzY1LCAgLTg5NDMsICAgMTMwNSwgICAgMTkzLCAgICA5NDgsCisgICAyOTUsICAgMjY5NiwgIC0zMTY1LCAgLTE5ODIsICAtMjQzOSwgICAxMDY3LCAtMTIyNjYsICAtMTAxOCwKKyAgMzQwMCwgICAtMTc4LCAgIDE5OTUsICAxMTc0NSwgICAxODMzLCAgIDk3ODUsICAgMTE3MSwgICAgNTgyLAorIC0xODQ0LCAgICAxNTcsICAtMTI0MiwgIC00MDgwLCAgICA4NjQsICAtMTc3MSwgIC00MjU3LCAgICA3MjEsCisgLTQwMTAsICAgNzk5MCwgICAgMTQyLCAgICA3MzAsICAgMTk3NiwgIC02NjIzLCAgIDQ2MzcsICAtNzM5NCwKKyAtMTE0MywgICAtODM1LCAgIDMzNDEsICAgMTczMiwgIC03MjY2LCAgIC00NDgsICAgNTM3OSwgICAgMjkwLAorICAxODU1LCAgIDY5NzcsICAgNjYzNywgIC02NTYxLCAgLTEzNzAsICAtMTc2NywgIC0yNzY5LCAgLTExODksCisgIDM4NzIsICAtNDg5NSwgIC00Njc5LCAgIDM5MDYsICAtMTY2NCwgICAxNTE0LCAgIDc5MDgsICAtNzk2MCwKKyAtNDE0NywgIC0xMjM1LCAgLTE3MDYsICAgMzMxNCwgICAgMTQ0LCAgIDE2NjgsICAtOTUwNSwgICAyMjY4LAorICA0MTQ3LCAgIDI1MTUsICAtMTQ1MSwgICA2NDc1LCAgIDE2NzUsICAgIDEwNiwgICAgOTgxLCAgICAyMDEsCisgICAzMDksICAgICA2MCwgICAtMTMzLCAgIC00NzIsICAgIDU2MSwgICAtMzgwLCAgIDExMzAsICAgICA5MQorfSwKKworLmNiMjIzMnMwID0geworLTI2MjE4LCAgIDE2MDYsICAgLTM5MCwgICAtNjk2LCAgICAyNjYsICAgLTk0NywgICAgNTYxLCAgLTE1MjYsCisgICAgLTgsICAgMTA4MCwgICAtMTg3LCAgIDU2NzEsICAgMjI0OSwgICAgLTMwLCAgLTQxMjksICAgLTc2OCwKKy0xMDkwOCwgICAzODI2LCAtMTA0MjIsICAgLTE0NCwgIC0xMjU5LCAgLTEzNzIsICAtMzU1MywgICAxMjg3LAorIC01MTUxLCAgIDY0NDIsICAtNTEwMSwgICAxMzg2LCAgICA3OTEsICAtMTU5MywgIDEyOTQyLCAgIC03NjQsCisgICA0MjQsICAtNjIxMiwgICA5NzMzLCAgICA3MDIsICAtOTcyMSwgICAgNTI0LCAgLTQ4MTgsICAtMTIzMiwKKyAgICAgNiwgICAtNDg0LCAgIC04MTgsICAgIDk1NSwgICA2NDI1LCAgIDM1OTQsICAgNTE1NiwgICAtMjg2LAorICAxNTE0LCAgIDQ0NjYsICAtMTc1NiwgIDExMzIxLCAgIC02NzksICAtMTQ4MSwgICAtNDc3LCAgLTgwMTUsCisgLTMwNTksICAgNDQ3NiwgICAgNjc5LCAgLTExNDMsICAgMjg3NywgICAyNTgxLCAgIDMyMzAsICAgIDIzOSwKKyAxMjAxOCwgIC0xNTk3LCAgMTM0MzEsICAxMTg1MiwgICAgMjYwLCAgIDMzMDYsICAgLTcxNCwgICAxMjk5LAorIC00Mzc1LCAgIC03NzgsICAgIDE3MCwgICAtNTY1LCAgLTM1MTAsICAtNjYzMiwgICAzMzU0LCAgIDU5MDEsCisgLTEwNzAsICAtNTkxMiwgIC0zNDMwLCAgLTQ5NzAsICAtNDcxMiwgICAyNjQ4LCAgLTkxMTMsICAgMTU2MSwKKyAgMTAwMiwgIC01NjU5LCAgLTMxNzcsICAgIDYzOCwgICAyMjg5LCAgLTEwNTAsICAxMjMxMCwgLTEwMzY0LAorICAyODMwLCAgIC05NjEsICAgLTE5NCwgIC02NDQyLCAgIDIyMDYsICAgMzQ1NCwgIC0yMDg3LCAgIDQzMjcsCisgIDEwODAsICAxMDI1NywgICA4MTA3LCAgIDQ5MDQsICAtMzE0MSwgIC0yMzM5LCAgIDc1NjgsICAgLTM2MywKKyAgMzc2NSwgICA3OTYwLCAgIDcwNjcsICAgMTQ5NiwgIC0zODQyLCAgIDE4MDUsICAgMjQxNSwgICAgOTEzLAorIC0xNjQxLCAgLTU0MTEsICAtNzU4MywgICA0NTk3LCAgLTEzMjQsICAgMjg4MiwgIDExMzEwLCAgLTI1NzAsCisgLTI4NzcsICAgMzU0NCwgICA0NjQyLCAgLTIyNDksICAgNzExMCwgICAtMzA3LCAgLTM0MTMsICAtMjg3MSwKKyAtODk3NCwgIC02MzU4LCAgLTU3MDMsICAgNDA0NiwgICAgIDgzLCAgIDE4ODcsICAtMzQ3NiwgIC00MzQ2LAorIC0yOTk1LCAgIC0zNDYsICAgIC00NiwgIDIyMTQzLCAgIC01NzYsICAgMjU5NywgICAgNjk2LCAgIDE1MjAsCisgICAxNDAsICAgMjkzNywgIC0zMzU2LCAgIC05ODgsICAgNDA5MCwgIC0xMjQ2LCAgLTMzNDcsICAgMTM4NywKKyAgMjI2NCwgICAxMjgyLCAgIDcwNDAsICAgLTgwNiwgLTEyODEwLCAgLTExMDUsICAzMjc2NywgIC00MjY2LAorICAgMTA4LCAgLTE5OTgsICAgLTY4MCwgIC0xMjc5LCAgIC00NjcsICAgLTExMCwgICAgNDYyLCAgICA3NjgsCisgIDE2NzgsICAgMTQwOCwgIC0xODg4LCAgLTExMTUsICAgOTQzMCwgICA1ODUyLCAgLTM1NzgsICAgNTM2NywKKyAtMTA5NiwgIC00MzEwLCAgLTk1ODgsICAgNDM1MCwgICA2MDQ4LCAgIDI1MTYsICAgMzIxNCwgICA0NDY4LAorICAtMjc2LCAgMTUxNzUsICAgLTg0OCwgIC0yODc1LCAgIC0zMTQsICAtNjAwMiwgLTExNzQzLCAgICA0NDgsCisgIDkyMzgsICAtMzAyNiwgIC0zOTM0LCAgIDI4NDAsICAtMjA3MCwgICAxODUwLCAgICA0NDQsICAgIDUxMSwKKyAgLTU0MiwgIC03MzgyLCAgIDYwMDIsIC0xNDQ0NywgIC0xNDk4LCAgICAxNzYsICAgIDgxMiwgIC0yNjMyLAorIC0yMjkxLCAgLTMzMTIsICAgMzk1MywgICAgMzcwLCAgLTIxNTQsICAgMTY3OCwgIC0xMTg2LCAgLTYzODIsCisgIDE1NDQsICAgMzUzNCwgIC0zNzY3LCAgLTc0NTksICAgNzI2NSwgIC0zMjcyLCAgMTA2NjksICAtMTY3NywKKyAtNzA0NiwgIC0xNjc5LCAgIC0xMzIsICAgMjEwOCwgIC0xOTQ4LCAgLTI5MzgsICAtNTM5MywgIC02MjIyLAorLTExMjkzLCAgIDIwNjYsICAgIDk4MSwgICAtNzMxLCAgIDE4NjksICAtMjIxMSwgICAzNTU4LCAtMjE1MTMsCisgIC02NzgsICAgLTQ5MywgIC0yMDg3LCAgICAyNDUsICAgIDYzNSwgIC0yMDExLCAgLTMzMTYsICAxMzQ0NSwKKyAgMjA4OSwgLTEwMTg2LCAgIDExMTQsICAtMTI0MSwgICAyMTIxLCAgLTIzMDUsICAgMzMxNiwgIC0xMjgyLAorICAyNzMzLCAgICAzMTgsICAgMzUzNCwgICA0ODQ0LCAgLTE0MzksICAgODkzMiwgIC03NjQ5LCAgIC01NTYsCisgLTc1MTksICAtMzQ0MiwgICA1MDY4LCAgLTM1NDYsICAgODU4NiwgIC04NDI1LCAgIDcxNDYsICAgLTY4MywKKyAgIDY2NSwgICAzMDUyLCAgLTI1ODEsICAgIDI0OCwgIC04MzIwLCAgIDIyNzAsICAgNzA0NSwgICAtODAwLAorICA1ODkwLCAgIDIxODcsICAgLTI1MSwgIC0yNTUyLCAgLTM4NjcsICAgMzY2NSwgIC0xNjQzLCAtMTE3NTcsCisgLTU1NDIsICAgMTgwNiwgICAzNjY5LCAgIC01MDgsICAtMzQzNiwgICAgNjAwLCAgMTA0MTIsICAtNTQyNiwKKyAgMTY4MCwgIC00NTQ1LCAgMTE1MzYsICAtMTg1OSwgIC01NDQ2LCAgLTQ1OTQsICAtNDMwMCwgIC0xMTczLAorICAgMjgyLCAgIDIxMDAsICAtMjU1NiwgICA5NDg2LCAgLTczMjUsICAtNzI1MiwgIC0zMTU1LCAgIC03NzUsCistMTM2NzQsICAgNDI3MiwgICAzMDY2LCAgIDkzNTIsICAgMTY0NywgICAxMTM2LCAgICA3OTQsICAgLTUyMCwKKyAgLTY1NCwgICAxNTM5LCAgLTIyNDQsICAgMzE1NSwgLTEyMDM5LCAgICA3MzEsICAgMzM3OSwgIC0xOTA0LAorICA2ODY2LCAgIDk2NjksICAtMjM4NCwgICAyMDk5LCAgLTI0MjYsICAgMTYzMywgIC0zMzU4LCAgLTU2NjIsCisgIDIxNjQsICAxMDY3OSwgIC01MzMwLCAgIDcwNjYsICAgNTgyNiwgICAtMTg3LCAgLTQ4NDAsICAtMTE3NCwKKyAtMzY5NCwgICAgOTc2LCAgLTI1NDgsICAgMjI5MiwgIC0zNTE3LCAgLTEwMDcsICAtNDA0MSwgICAgNjg0LAorLTE0OTg2LCAgLTQ3ODksICAtNDEzNSwgIC00Mzc2LCAtMTA2NzgsICAtMTQ4MiwgLTEwNDY2LCAgIDM1NzUsCisgLTE5NjAsICAgMzE4NSwgICAxMTk4LCAgIC0xOTYsICAgLTg5MiwgIC01NDI0LCAgIDQ4MDIsICAxMzYwOCwKKyAtNzc3MiwgICAzOTUyLCAgIDQ0MDQsICAgIC01MiwgICAxMDk3LCAgIDMxODIsICAtMjY5OSwgICAgOTAwLAorIC0xMjU4LCAgLTgwNTUsICAtMzEwMiwgICAgNzg0LCAgLTI1NzQsICAgMTU1NiwgICAxMDYwLCAgLTU0MTcsCisgICA1MzcsICAxMTk5MSwgICAtNjUwLCAgIC00ODcsIC0xMDI1MCwgICA2NzY2LCAgLTM3MTYsICAgMTA2MiwKKyAgMjUyNSwgICAxMDM5LCAgLTMwMDIsICAgNTc0MiwgICAtNTAyLCAgLTQ1ODMsICAgLTE0NCwgICAtMTQ0LAorIC01ODk2LCAgIC05NzgsICAgMTc4NiwgIC0xNDIwLCAgIDE5NDQsICAgLTEzMCwgIC01MjAyLCAgLTE1NzgsCisgIDc4MjEsIC0xMTY3NSwgICA5OTgwLCAgIDUwNjUsICAgNTk0MiwgICAtMzYyLCAgMTYzNDQsICAgLTgwMSwKKyAgMTkzMiwgICAxMjQyLCAgICAtMTAsICAgIDc5MSwgICAtMTcwLCAgLTI0NjgsICAgLTQ3OSwgICAzMjk3LAorICA0MzI4LCAgMTE0NzMsICAtMTU0OSwgLTEyMzE2LCAgICAyMDksICAgMTczOSwgICAxODc1LCAgIDEzMDUsCisgLTQzMTAsIC0xMzA0OSwgIC00OTEzLCAgIDkyMDgsICAgLTk2NiwgICAyNTcwLCAgIC0xMzgsICAgIDg5MCwKKyAgMTM3MywgIC0xMzI0LCAgIC05NjUsICAgODU2MywgIC03NTYwLCAgICA0OTAsICAtMTM5MiwgICA1Njk1LAorIC01NjU2LCAgIDU0MzEsICAgMzk3NCwgIC0xMTMxLCAgLTEyNDYsICAtMTMzNCwgIC0zODU5LCAgLTMxNTAsCistMTI5NzYsICAtNjkyOSwgICAgNjY1LCAgIDkzOTMsICAgIDQ5MCwgICAyMjEyLCAgICAgMTgsICAgIDU0MiwKKyAgIDIyOSwgIC0zOTI1LCAgIDE4MzYsICAgNDIyMywgICA1MjY4LCAgIDEyMDAsICAgIDQ3MSwgICAgIDIwLAorIC05OTE0LCAgLTU3NzQsICAgODM2MiwgICA1OTI5LCAgLTcwODcsICAgMjAwNSwgIDE1NjI0LCAgIDE2MjYsCisgIDU0MTksICAtMTQ5MiwgIC0xNTM2LCAgIC00MTcsICAgMTk1NywgICAyNTg1LCAgIC00MDQsICAtMTEyNSwKKyAgMjI5NiwgICAgNTk2LCAgICA4MzYsICAgLTM1NiwgICAgNzQ1LCAgLTI4MTAsICAgMjg3OSwgIC0yMzU0LAorLTIxNjgyLCAgIC0xMDgsICAgIDcyNiwgICAtODYyLCAgICA1OTMsICAgIC00MiwgICAgMjY2LCAgLTEzNTYsCisgLTIxMTksICAxOTYxMywgICAgODE0LCAgIDI0NjIsICAtMjk0MCwgICAgMjIyLCAgIDM1OTUsICAgNTYzNCwKKyAgLTgwNywgICAxMjE5LCAgIDI0NDYsICAgNTY2NiwgIC0xODM5LCAgIDcwOTIsIC0xMDU4MSwgIC01MTM2LAorIC0yNDA4LCAgIDU3MjYsICAtMTExNiwgIC0yMzQ4LCAgLTYzMTgsICAgODk5MSwgICA2NzUwLCAgLTUzMjEsCisgLTczNDQsICAtMjE5NCwgIC01NTQ0LCAgIDE3MDUsICAxMjUwMCwgICA5MDY5LCAgLTE5NjYsICAtNDkxNCwKKyAgMjIyNSwgICAzNTM3LCAgLTE0ODUsICAtNTE0MSwgICAgNDM0LCAgLTE2MjAsICAtNTM4MywgICAtNzEwLAorIC01NDQzLCAgIDM5MzAsICAgNzA4MiwgICAgNjY3LCAgLTMyODksICAtMzIwMiwgIC0yMDk3LCAgIDE5NzAsCistMTE2NDcsICAtMjkyNywgIC0yMDk4LCAgLTEzNDUsICAgMzQ0OSwgIC0yMDc1LCAgICAyNjIsICAgLTc1NiwKKyAgMTgyOSwgICAtMjcxLCAgLTEyOTIsICAgMTA3OSwgIC01NzQ2LCAgIC0zNDQsICAgMzY2MCwgIC00NDU2LAorICAzNTkzLCAgLTc2NTIsICAtMTM2NywgICAtODI4LCAgLTIyOTAsICAgMTA2MywgICA0MjM0LCAtMTc1OTYsCisgIC05MTEsICAtNjA2OCwgICAxMDQwLCAgLTI5NTYsICAgMjcwNCwgICAxNzYzLCAgICA5NzQsICAgMzEzMiwKKyAgIDY5NywgICAxMjY3LCAgICAyNDAsICAtNTUyMCwgLTEyMzY4LCAgMTA4MzAsICAgLTYzMywgIC01OTM5LAorICAyMzA3LCAgIDE4NjgsICAtMjIxNiwgIC0xMjYxLCAgICA1OTcsICAtNjMwMiwgIC01MTQ1LCAgIDM1NTAsCisgIDc1MTksICAtNjk2MywgICAzNzUyLCAgICA4NzYsICAtMTkxMiwgICAgIDMwLCAgLTkxOTIsICAgMTA3NSwKKyAtNDYzMiwgICA5MTA4LCAgIDExMzksICAgIDkxMSwgICA5MjkwLCAgIDEyNjgsICAtMTAwNiwgIC0xNzE4LAorIC02NjY4LCAgIDMyOTQsICAtMTUxMCwgICA2NTI3LCAgICA0NTYsICAtMTQwMCwgIDExNDI0LCAgLTQxNjgsCisgLTM5NDAsICAgNDczOCwgIC00ODYzLCAgIDI5OTAsICAgMzIwMiwgICAtNDQxLCAgLTQ3NDQsICAgNDYyMywKKyAtNDM1MSwgICAzOTk3LCAtMTEwMTYsICAgLTczNywgICAgMTM2LCAgIDc5NzgsICAtMzgwMSwgICA0MTcwLAorICAzNjAyLCAgLTIyMTcsICAgIDg0OSwgIC0yNTUyLCAtMjIyMzIsICAgIDMyMywgICAgMTkzLCAgICAgLTQsCisgLTEwMzAsICAgIDU5MCwgICAxNjI1LCAgIDMyMDgsIC0xMDU5NSwgICAyNjI0LCAgIC03NDEsICAxMzEyMSwKKyAtMTA0NCwgICAxNjAxLCAgIDUxNzUsICAgMjE5OSwgIC0zODMzLCAgIDE4MDQsICAtMjMxNCwgICAgNzkzLAorLTExNDg2LCAgIC02NTUsICAtMzMyMCwgIC0yOTc1LCAgIDQwNjUsICAtMzEyNCwgICAtNzA2LCAgLTcyNjQsCisgLTEwMzgsICAtMzA4MiwgIC01NTAzLCAgLTcxNDcsICAgODM2NywgICAxMjA1LCAgLTEwOTIsICAtMTY5NCwKKyAtMTA3OCwgIDExNTg0LCAgICAgIDgsICAtMTIzNywgIC0yMDc3LCAgIDk3MzIsICAgNDk2MywgICAyNzgwLAorICAgNjc0LCAgICA1ODEsICAgODIyNiwgIC0xMjMxLCAgLTkyNTIsICAgIDY0NCwgIC0zMjg0LCAgIC03NDQKK30sCisKKy5jYjIyMzJzMSA9IHsKKyAzMjc2NywgICAgLTQ1LCAgICA0MjIsICAtMTEzOSwgIC0xMDUyLCAgLTIwODUsICAgLTY5NSwgICAtNjEyLAorICAxNDUxLCAgIC0yODgsICAgICA1OCwgICAtODc4LCAgICAgNTMsICAgMjkxMiwgIC0xODkxLCAgLTcxNDgsCisgIDE4OTMsICAgMzAyOCwgICAgMTY1LCAgICA5NjMsICAgMjI2MCwgIC03OTA0LCAgIDU4NTcsIC0xODgyNCwKKyAtMjYxNywgIC0xMDMwLCAgIC04NzIsICAgMTUwMCwgICAxMTE4LCAgIC03NDUsICAgIDE0MywgICAtNDM2LAorICAxMjM5LCAgLTM4NDAsICAgMTc4NSwgIC0yNTA2LCAgMjAyMzcsICAtMTAyNiwgIC0xNTU2LCAgLTEzNzEsCisgIC02NjAsICAtMTE4NSwgICAgOTM5LCAgIDEzMTUsICAtMzY1OCwgIC01NDI4LCAgICA1ODcsICAtNDEwNSwKKyAgMTU5NiwgIDEyNjEyLCAgIDU3ODEsICAgMTE3MiwgIC0zNDkwLCAgLTExODIsICAgLTMzMywgICA2MjU4LAorIC0yNTk0LCAgIDIxNDQsICAtNDgzMCwgICAtMTkwLCAgIDE5NzIsICAgMjY4NywgICAxMzI3LCAgIC05ODcsCistMTUwNDYsICAgNDY1OSwgICAgLTcxLCAgIDY4OTAsICAgMTU4OCwgIC00Nzg3LCAgIDQzMTgsICAtMzcwNCwKKyAgIDQ5NiwgIC01NjAxLCAgIDE5NTQsICAtMTI1MCwgIC0zMzg5LCAgLTUxNTYsICAgOTIzOCwgICAyMjk4LAorIC00OTQ1LCAgICAxODMsICAtMjAzNiwgICAgMTE0LCAgMTIyNTAsICAtMjMzMCwgICAgIDcxLCAgLTMzOTUsCisgLTE0MDIsICAgMzY2OCwgICAgNTMxLCAgMTA5MTUsICAgMTE2MiwgICA3NzM4LCAgIDkwODksICAtMTI1MCwKKyAgMTUwMCwgICA2MzU3LCAgIDExNTUsICAtNTA5NCwgIC0yNjQxLCAgIDE2NTcsICAgIDQ3MCwgICAyMDIyLAorICAgNTM1LCAgIC0zMDYsIC0xODAzMSwgICAtOTAzLCAgIDI5MTMsICAtNTQ4NiwgICAxNzY5LCAgLTE0MTksCisgIDkwODIsICAgMjE0OSwgICAzNTE2LCAgIDY5NjAsICAgIDgzMywgICAxMTIzLCAgIDEyNjYsICAgMTY3MiwKKyAgLTY5MCwgICA5NjM0LCAgLTI5ODYsICAtNDY3NSwgICAxMDA2LCAgLTIyMDUsICAtMjkxOSwgIC0zMjA1LAorIC0yNzU5LCAgICAxMDcsICAgLTkzMSwgIC05Njk0LCAgIDIzNDAsICAgLTg2MiwgIC0yNzgyLCAgLTM2MzYsCisgLTk0MTQsICAgOTU2NCwgICAxMDU3LCAgIDg2NjQsICAgMTMyNiwgICAzOTI4LCAgIDE0NTIsICAtNDY5MiwKKyAtMzQzNywgICA4NjEwLCAtMTA0NjYsICAtNjYzOCwgIC0yODc5LCAgIDM0MDgsICAgIDg2MSwgIC0zMDU3LAorICAtODIzLCAgICAxNjQsICAgMzE1MywgIC0zNjk4LCAtMTU2OTMsICAgLTg4NiwgICAxNDU2LCAgIDMyNzgsCisgLTYxNjAsICAgIC01NywgICAxMTEwLCAgICAgMjIsICAtMjk4NSwgICA3Mjk5LCAgLTEwODIsICAtNzkyMSwKKy0xMjIxMiwgICAgNDgwLCAgLTc2NDUsICAgLTIxMSwgICAxNTg2LCAgIDM4NzQsICAgMzI0MiwgICAtODgzLAorICA2NzMwLCAgLTE1OTcsICAgLTUwNiwgICAzNzQ0LCAgIDc1NTIsICAtNzYwNywgICAgLTY1LCAgLTE0NDIsCisgICAyNjYsICAxMDAxMiwgICAxNTk0LCAgLTI2MjgsICAgNjk4OCwgIC0xMDQ5LCAgIC01MTYsICAgLTY5MSwKKyAgIDY3MiwgICA0OTEzLCAgIDE3ODgsICAxNDk3MywgICAgMzQyLCAgICA5NjIsICAgNzIxMiwgICAxMTI0LAorICAgNTAwLCAgIDExMzUsICAgLTMxMSwgICAzODg2LCAgMTI1NDgsICAgNTQzMiwgICA2MjE5LCAgIDMzNDEsCisgIC0xMjIsICAgNTYzNiwgICA2ODcxLCAtMTA4MzEsICAgNDAxMCwgLTEwMDg0LCAgIDE0NTYsICAgNTIxNiwKKyAtMTAxMywgICAxMTAyLCAgIDQxNjQsICAtMTQ5MCwgIC01MTg2LCAgIC0yNDIsICAtNDQ5OCwgICAzMzIyLAorICAzNTg0LCAgLTIxNzYsICAgNTcwNCwgICAgNTE1LCAtMTE1NTYsICAgMTQ0NiwgICA0MzAzLCAgLTM5MjgsCisgLTQyMjcsICAtNzI2OCwgICA2MDY5LCAtMTEzMzAsICAgIDgyMiwgIC0yMDU0LCAgLTMwMzUsICAtMjUxNiwKKyAtMTgxNiwgIC0zNzk2LCAgIDg0MDgsICAgODg0OSwgIC0zMDMwLCAgLTgyMDEsICAgMTE0OSwgICA3Mzg4LAorICAxMDM2LCAgIDI1ODYsICAgNTYxOCwgIC0yMjc0LCAgLTUwMzcsICAtMTQ5NywgICAgMzg0LCAgIDE0NTQsCisgIDgxNTQsICAgMTY3MiwgIC0yNDA5LCAgIDMzNDcsICAxMzI1OCwgICAtOTc5LCAgICA1MTMsICAgNzgyNiwKKyAgMjY2MiwgICAxODE4LCAgIDU1MzcsICAtMTEwNCwgICAyNjQ1LCAtMTA2MzIsICAtODc2NywgIC01NjY3LAorIC0xMDI5LCAgICA4MDYsICAtOTA0MCwgIC00Njg0LCAgICA3OTIsICAtNTAwOCwgIC01ODA3LCAgLTM5MjQsCisgICA5NjQsICAgIDMxMywgIC0yNTIxLCAgIDExMDYsICAtNTcyOCwgIDEzNTM0LCAgLTgwNzgsICAgNDIxNiwKKyAtMTM4OCwgIC0yNTg4LCAgICA5ODYsIC0xNDUzNiwgIC0xNDEwLCAgIDM0NjEsICAgMTM2MCwgIC0xMzQ4LAorICAtMTA0LCAgIDE0OTMsICAtMjg1OCwgIC0yODYwLCAgIDIwNDUsICAxODMzMCwgICA0ODE0LCAgLTM2MjgsCisgIC03MDUsICAtMzIyOCwgICAtNjYwLCAgLTI2NjQsICAgMjYxNiwgICA0NTQ4LCAgIDM3NTMsICAgMTU3NCwKKyAtMTMxOSwgIC0xMTEwLCAgICA1NTYsICAgMzMwNCwgIC0yODAzLCAgMTMwNTIsICAgNDU5MiwgICAyOTIyLAorIDEzNjY3LCAgLTIzMjIsICAtMzA1NiwgIC0yNzE3LCAgICAxNzQsICAtNDIyMiwgIC00Mjk2LCAgLTc2OTUsCisgIDEzNjYsICAgMTc4NiwgICAxMDQxLCAgIC0xMTAsICAtMTk5NywgICA0MTAyLCAgLTE4NTUsICAgLTkwMCwKKyAgIDIwMywgICAxMzExLCAgIDM0MTIsICAgNDEwNywgIDIyNjA5LCAgLTQxMTIsICAgIDQyNywgIC0yNDg4LAorICAgMjU3LCAgLTEyNjcsICAtMTI3NywgIC02NDMwLCAgLTcxOTMsICAxMDY2NywgICA0NDk1LCAgLTQzMTcsCisgIDY4NDYsICAxMzIxMywgICA3MzM1LCAgIC05NzIsICAtMzEzNywgICAgMzM1LCAgIC02MDksICAgMzEzMSwKKyAgMjQwNiwgIC0zNzYyLCAgIDIxNTEsICAtNTE4OCwgIC03Njc1LCAgIDIwNjgsICAtMjAyNywgICAzNzIyLAorICAtNzczLCAgLTMyNzYsICAgMTUzOSwgIC03ODg2LCAgIDEwMDUsICAxMzY5MywgICA0NjAxLCAgLTgzODYsCisgIC01MDgsICAgNTY2MiwgIC00ODg5LCAgICAgOTMsIC0xMDYwMywgICA0MDUxLCAgICAgLTIsICAgMTA5NCwKKyAtNDg5NywgIC0yMjc0LCAgLTIzNzcsICAgMjIyOCwgIC01NTA3LCAgIC00NjQsICAtMzQ1NSwgICAtMjI3LAorICA5NDMzLCAgIDgwOTMsICAtMjI0NSwgICAzNzAxLCAgLTEwNDcsICAtNjgyNywgICAyMDM3LCAgIDE5MjYsCisgLTM2MTAsIC0xNTQyMCwgICAtNTgxLCAgLTYxMjcsICAtMjA3NSwgICAyNTAxLCAgLTIyMTYsICAgNTM4NSwKKyAtMjI5NywgIC0yNjYwLCAgIDE1NjMsICAgMzI0NCwgICAxNDE4LCAgLTIwMTIsICAgMjk2NCwgIDEyMjM1LAorIC04NTk1LCAgIDI3MjgsICAtMzU0MSwgIC02NTExLCAgMTEwMzgsICAxMTMyNiwgICAtMTgzLCAgLTExMDIsCisgIDEwMzgsICAgMTIyNCwgICAgIDIwLCAgIDE0NDEsICAgLTM0OSwgICAxMjQwLCAgLTc3MzcsICAgLTkzMCwKKyAgMTQxMSwgICA2OTQ1LCAgIDQxMzAsIC0xMzU0NCwgIC0yNjI1LCAgIDM1NTAsICAgMzE0OSwgICAtNzMwLAorICA3NjU4LCAgIDMwOTgsICAgIDY3MywgIC0yMjU5LCAgIDI1NTYsICAgMTU0MywgICAxNDc4LCAgIC05NTEsCisgLTgxMjgsICAgNDk1MSwgIDExOTE5LCAgIDQ1ODgsICAtODQ0OCwgICAgNzg0LCAtMTE0OTgsICAtMTkwOCwKKyAgMjU3OCwgICAyOTM2LCAgLTc0OTYsICAtNTgzNCwgICAxOTg3LCAgIDM0MDcsICAtNDEzMywgIC00OTI0LAorIC0xMzQ4LCAgLTEzMDAsICAgIDkxNiwgICAgODk5LCAgMjAyNTcsICAgMjAyNywgICAxNDUwLCAgIDQzODgsCisgLTM3NDgsICAgMzg0NiwgICAyMTg3LCAgLTExNTgsICAgNDcyMCwgIC0zNjEzLCAgIDUzMTIsICAgNDA1NSwKKyAgIDQ0OCwgIC02MzgzLCAgLTg3OTQsICAtMjIzMiwgICAxOTIwLCAgICA4MzQsICAyNzA4NywgICAtNzU0LAorICAgIDkwLCAgIDE0MTAsICAgLTk4NSwgIC0xMzgxLCAgICAtNjEsICAgIDY1MCwgICAxMDgwLCAgIDcwMzUsCisgLTI3NzIsICAtMTIzMywgIDEzNDEwLCAgIDQ0OTQsICAgLTQ3MiwgIC0yODk2LCAgLTUwODMsICAtMjIxNywKKyAtNTc3OCwgICAgNDM3LCAgLTY4NTMsICAgNDk5NiwgICAzNDQyLCAgIDYwOTIsICAtNjQ5NywgIC0zODcxLAorICA0MDI0LCAgIC04OTgsICAgIC03MywgIC0zMDY3LCAgLTI3OTMsICAgNTY0MCwgICA2MDc2LCAgLTI0NTQsCisgIDM1OTgsICAgLTI3NywgICAxNjcyLCAgLTY4NTgsICAgMjQxOSwgICA5NzUzLCAgIDYyOTIsICAgODgzNSwKKyAtOTkwOSwgIC00NzI0LCAgIC02MTgsICAgNzI2NiwgICAtNDE2LCAgIDE5NjUsICAtNDk2OCwgICAyNDIxLAorICAxMTU1LCAgIDM4MTUsICAgLTExNiwgIC0zNzI1LCAgIDc4NzIsICAtNDkwMSwgICAyMzgzLCAgIDE2MTIsCisgLTIxODYsICAtMjMwMiwgICAyNzkxLCAgLTIyMjYsICAgMTE0NCwgLTEzMzc5LCAgLTY2MDIsICAgLTgwNiwKKyAgNzA5OSwgIC0yMDk4LCAgIDQxOTQsICAtMjEyOCwgICA4NjYzLCAgLTQyNzUsICAgIDQ1MiwgICAtMTM1LAorIC02MDUzLCAgIDEyODAsICAxMjgxNSwgICAzMjc4LCAgIDg0NTIsICAgNDQ3OSwgIC0xNjQ4LCAgIDE0NTMsCisgIDE0MDcsICAgLTk2NiwgIC0xMDE2LCAgIDMxNzMsICAtNzMzMywgIC00NTUyLCAtMTMxNzYsICAtMTc0NCwKKyAgIDU3NywgIC0xNTcyLCAgICA2MTEsICAgMTIwMiwgICAtMTQ2LCAgLTU3NzMsICAgMzAxMiwgIC0zMDE2LAorIC0xNTgxLCAgIDMxNjIsICAgMzgxOCwgIC0xOTcwLCAgIDYxOTUsICAgMTk0NiwgIC05NjU2LCAgIDI4NjEsCisgLTc4NzUsICAgMzEzMywgIC03ODQwLCAgMTA5NTEsICAtMTY4NCwgICAtMzA2LCAgIC0yMjcsICAgOTc3NiwKKyAgIC04MiwgICAxNzM2LCAgIDExODAsICAgMzQ1NywgIC0yODc0LCAgIDUzNjUsICAtNzQyOCwgICA3NjA0LAorICAyNjIzLCAgLTI5OTgsICAtMjI3MCwgIDEwNDEwLCAgIDEyNTIsICAtMjcyNSwgIC00NDMzLCAgIDE3NTgsCisgLTUyMjUsICAgNjUyMiwgICA2Njk4LCAgICA3MTIsICAgNDY5NCwgIC0yMzkyLCAgICAyNDAsICAgIDQyMywKKyAtMzAzMCwgLTEyNzA4LCAgLTMxMzYsICAtNTE3NiwgICAgNDgwLCAgLTE2MjQsIC0xMjkwMCwgICA3NTM3LAorICA0MzcxLCAgIDExODYsICAtMTgyOCwgICAtNzU3LCAgLTE4NTAsICAgLTk3NCwgIC0zNzU1LCAgIDE0MTUsCisgLTYzMDIsICAgMjY0MiwgIC0zODIzLCAgLTE1NzAsICAtODA5MCwgICA4MjUxLCAgIDE5NDUsICAtOTIxMywKKyAgMTE0NywgICA0MTI4LCAgLTQzMDEsICAgIDgwNiwgIC0xNzQ1LCAgICA3MDQsICAtMjQ5NiwgICAxMzc1LAorICAtODAyLCAgICAgIDksICAgLTgwOCwgICAtMjUyLCAgLTU0NTMsICAgMzg1NywgIDEwMzUzLCAgIC01MzYsCisgIDE4NzUsICAtMjg5NiwgLTEwNzkyLCAgIDMzNTgsICAgMTA2MywgICAtODkwLCAgIDcyMDAsICAgMzY2MCwKKyAgIDQwNiwgICAyODQwLCAgLTY5NzMsICAtNDQ2OSwgICA0NjM4LCAgLTgwOTEsICAgMjc3MiwgIC04MDM1LAorICAxNzI4LCAgLTUzMTUsICAgNzIzNCwgIC0yNzE4LCAgIDM3MDcsICAtMTIyNiwgLTExODU4LCAgLTIzOTcsCisgICA3NzIsICAgMzI4NSwgIC00MDg5LCAgLTE0MDAsICAgMTExMywgLTE2NjgwLCAgIDE4ODUsICAgLTQzNSwKKyAgLTk1OSwgICAgMjQyLCAgIC04MTcsICAgIDI1OSwgIC0yMDEwLCAgLTE4NTcsICAgLTU1NywgICAtOTE0Cit9LAorCisuY2IyMjMybTAgPSB7CistMTMzOTQsICAxNDM4MiwgICAtNDg4LCAgLTEwODgsICAgLTgxNywgICAgMTAwLCAgICAzMDUsICAgMjI2NywKKyAgMjUyNywgIC0xNTg0LCAgICA5OTUsICAtNTc4MSwgIC0zNTg1LCAgLTE4MjYsICAgIDgwMywgIC00MTA4LAorIC0zMTM3LCAgMTIxMTEsICAgLTIxMSwgICAgODM4LCAgIDQ4NzksICAtMTk2NCwgIC0xNzI4LCAgMTM4MzAsCisgIDIwODQsIC0xMTUzNSwgICAgNjY0LCAgLTI0OTksICAtMzQyMSwgICAtNzAzLCAgIDQ1MjgsICAgIDk2OCwKKyAgMTAwOCwgLTEyMDEwLCAgICA5ODQsICAgMjY1OCwgICAgNDIyLCAgIDE0MTIsICAxMDc3MiwgICAyMjE2LAorIC00MjkxLCAgIDEzMjksICAtMjMyNCwgICAyMzkyLCAgLTIwMjksICAxMjMyMiwgICAxMDUzLCAgICAxNjksCisgMTI2MzUsICAgLTkwMiwgICAgLTYyLCAgIC02NzAsICAtMzAwNywgIC0zMzIyLCAgLTI5NDgsICAgMTgxNywKKy0xMDY4OCwgIC0xMjY0LCAgIDE5NDksICAgMjczNCwgICAxMDcyLCAgLTE0MjksICAgMjA4NSwgIDEwMzEyLAorIC0xNjg1LCAgLTQ0MzMsICAtMTI4NywgIC05NjIwLCAgLTExMzIsICAgICAyMCwgICAgNjE0LCAgIDI0NzAsCisgIDI4MjEsICAgNTkzNCwgICAzNTI2LCAgMTEyOTIsICAgICA1MCwgLTEyOTcwLCAtMTE5NDgsICAgMTExNCwKKyAgMTk4MCwgICAtOTQ1LCAgIC03MTMsICAtNTM1NywgICAzNzY2LCAgIC00NDcsICAgIDk2OSwgICAyMjQ3LAorIDExODU0LCAgIDIxNDgsIC0xMjM5MywgICAxNTE4LCAgICA2MTAsICAgNDUyNywgICAxMTY0LCAgIDEzNDcsCisgLTE0MjIsICAgIDY0OSwgICAgNjUzLCAgICA4NTUsICAgIC0yNCwgIDMwMTUyLCAgICAgMjAsICAgLTU2NCwKKyAtMjgyNSwgICAgLTExLCAgLTE0MDgsICAgIC04MCwgICAgMjM5LCAgICAzMDUsICAtMzE2MywgICAtODU0LAorICAgNTY4LCAgICAtMTgsICAtNDIxMiwgICAtNDAzLCAgICAyODgsICAtMzAwOSwgICAgMjI5LCAgLTExNTIsCisgMTYzOTAsICAgLTg3NywgICAtNDU4LCAgICAzMTYsICAgLTEyOCwgLTEyMTY1LCAgIDEwODgsICAgLTgyOCwKKy0xMDg4NiwgICAtMjY5LCAgICA3NDcsICAtMTAyNiwgICAxNzE2LCAtMTA5MjAsICAtOTIwNCwgIC0zMTIzLAorICAgOTU4LCAgLTYxMjgsICAgLTI2MCwgICAtODUxLCAgLTE1MjQsICAtMjM4NiwgIC02NDcyLCAgICAyMjgsCisgIDI2NjcsICAgMzE1OCwgICAtMTQwLCAgIDE3MTksICAgMjMzMCwgIC0yNzMwLCAgIDMwODAsICAgICA0NCwKKyAxNTc0MywgIC0yMTY3LCAtMTE2MzcsICAgLTYwNywgICAgNDc2LCAgICA0MDgsIC0xMjUwNSwgIC0xODYyLAorIC0xODkyLCAgIC00NDAsICAtMzc4NSwgIC0yMzQ4LCAgIDEyMjksICAgLTMzOCwgICAtNDM4LCAgIC03OTcsCisgMjk5MzMsICAgLTcxNSwgICAgMzY2LCAgIC0xOTcsICAgIDU3NiwgICAtMTg4LCAgICA0ODQsICAgIDI0MCwKKyAtNDg0NCwgICAxMTY4LCAgLTEwNTQsICAgIDg2MywgICAgODc1LCAgIC0yOTUsIC0xNjA5MSwgIC0xOTcyLAorICAzOTc2LCAgIDM4MzMsICAgMzA1NiwgICAtNzcwLCAgIDEwMTEsICAtMzA5OCwgICAgMTY1LCAgIDM5NzMsCisgLTkzNjcsICAgIC0xOCwgICAtMjk5LCAtMTEyNTQsICAgMTAwNSwgICA4NjQ0LCAtMTQ3ODgsICAtMjI2OCwKKyAgMjY0NCwgIC04NDEwLCAgICA1NzgsICAgMjE2OSwgICAtNzY2LCAgIDI3NjQsICAgMjM3OCwgICAzMjgyLAorIC0yNzEwLCAgIDc2MTIsICAgLTU0MiwgLTEyMDYyLCAgLTI0MzcsICAgLTQxNCwgICAtNTA2LCAtMTAzMzIsCisgIDI3MzIsICAgIDgzOSwgIC0yNTkzLCAgICA5MjMsICAgMTE1OSwgIC0xMDU3LCAgLTczMzMsICAgIC04NiwKKyAgMjgzMiwgIDExMzI4LCAgLTE2MTYsICAgLTMwMiwgICA0Mzk5LCAgIC01NDcsICAgNjEwNywgICA5OTgzLAorIC02OTAxLCAgICAtODUsICAgLTU0NCwgIC00OTE2LCAgICAzNjYsICAgNDg3OCwgIC04NjYyLCAgIDczMTMsCisgLTMwNTYsICAtMTAyNywgICAyMzgxLCAgIDg5MDYsICAtNzI3MCwgICAgNTA5LCAgLTExMjQsICAtMjUxMiwKKyAtMTYzNiwgICA1ODMwLCAgLTU4NjgsICAgMjM2OSwgIC0zMjM2LCAgMTI1NTcsICAtMjcxMywgIDEyNzkzLAorIC0yOTU3LCAgIDE2ODgsICAgLTg1MiwgICA0NzIzLCAgIC0xMjIsICAtMjMzNiwgIC00Njk4LCAgLTEzMDYsCisgLTczOTksICAtMjA5MCwgIC0xOTUzLCAgLTE1MDUsICAgMzMzNSwgLTEwOTA2LCAgLTI1OTgsICAgMTMyMiwKKyAgMjU1NiwgICA3MjEwLCAgLTE1NTMsICAgMTI2MiwgICAxODc4LCAtMTA3MTksICAgMTc0NiwgIC0yNzM2LAorICAxNDQ4LCAgIDg3MzQsICAtOTYwMiwgICAgODI4LCAgIDE3NTIsICAtMTYzMiwgICA4MDM3LCAgIDI3MjgsCisgICA1NjIsICAtMTg3OSwgLTEwNTcyLCAgIC01NDQsICAtMjI1NCwgIC0xOTk3LCAgLTYzODQsICAgIC04NywKKyAtNTg3OCwgICAtNDczLCAgICA0OTgsICAtMjk2MCwgIC01Njk4LCAtMTE1MDAsICAgMTgxNSwgICAyMDUwLAorICA3Mzg4LCAgIDUyMzAsICAgMjc4MiwgICA1NjAyLCAgICA1MTQsICAgLTMwNiwgIDEzMDIyLCAgICA1MjMsCistMTA3NzYsICAgLTg0NiwgICAgNzE2LCAgICAyNzAsICAgMzM1MCwgIC02MDIxLCAgIDE0MjAsICAtNjE3NSwKKyAtMTk3OCwgICAzOTY3LCAgMTE2MTIsICAgMzMyMCwgIC00MTAwLCAgLTI0NjgsICAgNDU5NSwgIC01MzM4LAorICAgIDY1LCAgIDM0NzgsICAgICAxOSwgICAzNTAxLCAtMTU4OTYsICAtMTMzNSwgIC0xODYxLCAgLTE5NDQsCisgIDM5MzUsICAgMzYzMCwgICA0NjI3LCAgLTU4OTIsICAgLTQ1OCwgICAgMzgzLCAgIC0yMTEsICAgLTU5NCwKKyAgLTE2NSwgIDI0ODY1LCAgIC02NTYsICAgMjMwMCwgICAtNDA0LCAgICAyNTcsICAgIDIxNCwgICAtNjQzLAorICAyMjk4LCAgIC0xODAsICAgICAzNSwgICA0OTc0LCAgICA4MzQsICAgLTk5OCwgIC0xNzM4LCAgIDU0NDksCisgLTkyMjIsIC0xMDg1OCwgICA0MTg4LCAgIDkxNDcsICAtNTYzOSwgIC0xNjkxLCAgICA5OTAsICAtMTk0NSwKKyAgMzQyMSwgIC0zNTI3LCAgIDkwMDUsICAtMjAzOCwgIC0yMzY5LCAgIDUwOTgsICAgIDk2NywgIDE1ODQwLAorICAgMTk2LCAgLTMyMDQsICAtMTA3OSwgICAtNzc2LCAgMTE4MDYsICAtMTM1MiwgIC0yMDUzLCAgIDIwMTEsCisgICAzMDksICAgIDY0MiwgICAxNTQxLCAgLTE0NjYsICAtNDQ2NSwgICA2Njc5LCAgIDU3NTYsICAgNzQ3NCwKKyAgIC01OCwgIC0xODY0LCAgIDU5MDgsICAtMTU3NiwgLTMwMzc0LCAgIC05MDQsICAgLTU3MSwgIC0xMTM2LAorICAgNDI1LCAgICAtMjIsICAgIDY2NiwgICAxMTUwLCAgIC03MzQsICAgICA4MiwgICAxMjU0LCAgIC0yMjYsCisgIC00MzcsICAgLTg5MCwgICAxNDY0LCAgLTMzNjgsICAgIDk4NywgLTExODg1LCAgIDExMjcsICAtNzIyNCwKKyAgMTg3MiwgIC04MTk4LCAgIDg3NzUsICAtMjY5NSwgICAxNDU3LCAgMTUxMDIsICAgLTg5OSwgIC0xMzg0LAorIC0xOTc1LCAgIDE4OTEsICAgMzEyOCwgICAxNDY1LCAgLTE2NDksICAtMTM2MywgICAxNDgzLCAgICAzMDMsCisgIC01MzQsICAgICAtNywgIC0xNzEwLCAgLTEzNzcsICAgIDc2OSwgIDEyNjk4LCAgLTg5ODcsICAgLTgwMiwKKyAgNDYzNiwgICAgNTcyLCAgIDIwMDQsICAtMzUxMywgICAgNDQyLCAgLTk4NjMsICAgMzIxNSwgIC00NTUwLAorICAyMTM4LCAgLTQzNDYsICAgNTY4MiwgIDExMDUzLCAgIDcyMjAsICAgOTg0MiwgICAgNzk3LCAgLTEzOTksCisgLTI2NzksICAtNTg1NywgIC0yMTQzLCAgIDMyNDEsICAgMjMzMCwgICAgMjQ4LCAgIC02MzAsICAgMTA0NCwKKyAgIDYzOSwgIC0zNDMyLCAgICAxMjUsICAyMjA4MywgICAxOTc2LCAgLTEwMDMsICAgIDgxMywgICAgNTUyLAorICAtNTcxLCAgIDQzNTgsICAtNjIwMCwgICAzNjM1LCAgIDU0MzksICAgLTYzNiwgICAgMjMzLCAgLTQ4NTYsCisgLTM1MTksICAgLTQ2MCwgICA2OTU2LCAgLTQyMTUsICAgMTUzNywgICA3ODk1LCAgMTM5MTAsICAtNzYzNywKKyAgMTM5MiwgICAxNTcyLCAgICA2NDgsICAgMzY5MCwgIC0xOTg4LCAgLTI0NjMsICAtMzMwMiwgICAgNjc3LAorICAtOTI0LCAgIC01MzUsICAtNjAyNSwgICA0MTI2LCAgIDcxNzgsICAtNDE0NSwgICA0OTYwLCAgLTE4NjAsCistMTA5MjYsICAtMTQ3MCwgIC05NTA2LCAgIC0yMjYsICAgLTI1OCwgICAgIDMyLCAgIC00NzksICAgMjIyMiwKKyAgICA5NCwgIDExMzU4LCAgIDM5ODQsICAtMjczMiwgICAyMTExLCAgIC01OTAsICAtMjQ0NCwgICAtMzQ0LAorICAtNDI1LCAgICA1OTgsICAtMTM4MiwgIC0xMjEzLCAtMTc2MzIsICAgMTU2NiwgICAxMzg3LCAgLTM1MjEsCisgICAtNTcsICAtMTgyOSwgICA0Nzg4LCAgICA1NzQsICAgLTIwNiwgICA3OTYyLCAgIDkxNTcsICAgNjQ1OSwKKyAtMTU5NCwgIC0xMzU1LCAgIDQ4NzQsICAgMTA2NiwgICAyMDA2LCAgIDE3OTMsICAtNzU2OSwgICAyMzY5LAorICAxMTA4LCAgIDEzMDUsICAtMzA0NiwgLTE0MDUyLCAgLTE3MzYsICAtNDA0NSwgIC00MzI4LCAgIDc0OTcsCisgIDMzMDQsICAgMTUxOCwgIC01NjY2LCAgIC01MjksICAgNDI1NiwgICA0NjY3LCAgICA5MzIsICAtMTQ5NSwKKy0xMDQxNCwgICAtNDE0LCAgLTIxMTAsICAtMzE1MCwgIC0xMjUwLCAgLTg3OTksICAgLTQxOSwgICA1MTYyLAorICA4NDk3LCAgLTg3MjAsICAgLTc0NiwgIC0zMDE1LCAgIDY0MDMsICAgMzg1NSwgICA3MzUwLCAgICAxNjUsCisgICAtNTksICAgLTk1OCwgICA1NzgwLCAgIDYwNDQsICAgMTczNiwgICAzMDE2LCAgICAgMzEsICAgMTAxMiwKKyAgMzQyMiwgICA3NTk4LCAgLTY4MzcsICAtMjA5MiwgICAyMjYyLCAgIDYxNzEsIC0xMDM2MiwgIC0yMTA4LAorIC0xMzUyLCAgIDE3OTgsICAtNDg3MiwgIC02MzY5LCAgIDI1MDcsICAgMjY0MCwgICA2MDc0LCAgIDE4MzUsCisgIDI5NDgsICAgIDM4OCwgICAgMzk4LCAgLTkyOTUsICAtNTM4NCwgIC0yMDg4LCAgIDIwOTYsICAgIDc0MiwKKyAgMzI4NiwgICAgNDQxLCAgIDcxMzUsICAtMjExMiwgIC05OTU4LCAgLTU2MTIsICAgMjQ3OSwgICA1NDI3LAorLTEwMTE0LCAgIC02NzQsICAgIDMwOCwgIC0xMDM3LCAgICA3NzAsICAgIDUxNCwgICAxODY4LCAgIC0yNTIsCistMTE5MDEsICAgLTk4NCwgICAgNjcwLCAgIDI1MDYsICAgNTM5NiwgIC0xMDQ3LCAgIDkxMTMsIC0xMDg2NSwKKyAgNDg3MiwgICAxNzIwLCAgIDIyMjYsICAgIDk0NywgIC0yMzM2LCAgIDI2NDksICAgIDE3MywgIC0xNDY0LAorIC0yODc0LCAgIDQ0NjMsICAtMTI3MCwgICAzNDI5LCAgIDYyNDIsICAtNTM4MCwgIC03NzcyLCAgLTQ1NTAsCisgLTg0NTEsICAgMjA0NSwgIC0yODU1LCAgIDUzMzYsIC0xNTA2NiwgICAtNDE4LCAgLTQ4ODYsICAgLTY0OCwKKyAgMzczNiwgICAgOTQ1LCAgIC05NTYsICAtNDgyNSwgICAtMTE2LCAgICAxMzAsICAgMTg4OSwgICA5NjQyLAorICAzNzkwLCAgLTQzNzEsICAgNzE4MCwgIC0xNTU2LCAgIDY1NjIsICAtMjIwNywgIC03OTEwLCAgICA1MDYsCistMjE1OTQsICAgIDY2MiwgICAtMzM4LCAgIC05NDMsICAtMTAyMiwgICA2NDUzLCAgICAzMDEsICAgLTQ2NCwKKyAgLTQ1NywgICAgODQwLCAgIDMzMTMsICAxMDk0NiwgICAtMjk0LCAgIDgxNTYsICAgIDEzOCwgIC0xNDI1LAorICAyMzk3LCAgIC03OTIsICAgNjQ2OCwgICA0NjE1LCAgIC01MTEsICAxNTkzOCwgICAgNDk0LCAgICAyNzQsCisgLTU5NzYsICAgLTY2MCwgICAzODk0LCAgLTIxNDAsICAgMTQyNCwgICAyMDAzLCAgIDQxMDEsICAgMjgyMworfSwKKworLmNiMjIzMm0xID0geworIDIwNDU2LCAgLTE5NTIsICAtMTU4MSwgICAgODY5LCAgICA2MjgsICAgICA3NiwgICAxNDA0LCAgIDQwNjAsCisgICA1MDgsICAtMzE3NywgICAtOTQ2LCAgLTI5OTIsICAgMjQyMiwgICAxMTM5LCAgLTE5MzEsICAgLTI0MCwKKyAgMTAxMSwgICAgMzY1LCAgLTExMDYsICAyMDk3MywgIC0xNDM4LCAgICAzNzIsICAgIDEzNywgIC0xMDU4LAorICAxMTcxLCAgLTEyNTIsICAgMjc5NCwgICAxNDM0LCAgIDE4MTQsICAgIDQ4MiwgICAzOTQ4LCAgLTI3MDQsCisgMjA0MjIsICAgLTI0MSwgICAgNDQxLCAgLTExMjEsICAgIDQ5OSwgICAxMDM2LCAgIC05MTgsICAgOTcwOCwKKyAtMzE2NiwgICAtNDg4LCAtMTAzNzksICAtMzIwMSwgIC01MjU0LCAgLTE4NzEsICAgNTY2NSwgLTEyNjIyLAorIC03NTkxLCAgICAxMjcsICAgMTQ2OSwgIC0yMjY3LCAgIDE4MTMsICAtNDE5NywgICAyMDY1LCAgIC02MDIsCisgIC0zOTUsICAgLTY1MiwgICAgMzMzLCAtMTkxMTQsICAtMTA5MiwgICA0MzEwLCAgIDE1OTAsICAgMTY4OCwKKyAtMTQ1MywgICAgMTc3LCAgIDQ0MDIsICAgMTE2OCwgICA1OTcyLCAgLTEyOTUsICAtMzI1OCwgICAxNTQyLAorIC00ODMyLCAgIDMzNzcsICAtNTU0NSwgIC0zNjIyLCAgLTQ5NDQsICAgMjA2NCwgIC0yODQ2LCAgIDgxMTgsCisgIC04NDUsICAtNjc3OCwgIC0zNjQwLCAgIDU3MjksICAgLTkwNywgLTExMDA3LCAgICAgLTUsICAgMjYzNCwKKy0xMTExOCwgICAyMTA4LCAgICAxNDQsICAxMzI5OSwgICAgMjUxLCAgICAzMzYsICAgIDU2MywgICAgLTc1LAorICAzMDA0LCAgICAxNjksICAtMzg5MiwgICAxNDc3LCAgIDEwNjYsICAtMTU3MSwgIC0xMTEzLCAgLTEwODgsCisgICA1MTcsICAgIDQ2NSwgLTIxODQxLCAgLTE1NDEsICAtMTA5NCwgICAxODQxLCAgLTkyMTMsIC0xNzQ3OCwKKyAgMTY2MiwgICAgICA4LCAgIDExOTIsICAgMTE3NCwgICAxMDE0LCAgLTU2NTksICAgLTY5NSwgICAgMzE2LAorIC01MTYxLCAgIDE4MDMsICAtMTA1NiwgIC0yMzY5LCAgLTI5MTksICAgMjk0MSwgIC05NzEyLCAgIDE5NzUsCisgICA0MjYsICAxMTIxNCwgICAyMjg4LCAgIDYxODYsICAtNzM0OCwgIC0zMDYyLCAgIDMzNDEsICAgMzI1MiwKKyAtNDEwMiwgICAtMzQ2LCAgIC04NzYsICAtNzA4OCwgIC0zMzMwLCAgIDQ1MDcsICAgIDMxMCwgIC0xNjMyLAorICAgMjk5LCAgLTI2MzYsICAtMjc0MCwgICAtNzUyLCAgMTAxNTksICAtNzIwMSwgIC05NTY4LCAgIDMxMzQsCisgLTQwMDIsICAgIC00MSwgICAyNDc5LCAgLTE4MTYsIC0xNDA5OSwgICAzNTc1LCAgIDExNjEsICAgNjQyNywKKyAtMjQ2NiwgICAgMzkwLCAgLTE4ODMsICAtNjI2NSwgIC0xMjY2LCAgIC0yNjMsICAgMTQ3NCwgICAtNTkyLAorLTIxMjM0LCAgICAgOTQsICAgNDE4NywgICAgICAxLCAgIDMyMjcsICAtMzI3MywgICAxOTUwLCAgICA0MDYsCisgICA1NDMsICAgMTY2MSwgIC0yNjQ4LCAgLTkyNTIsICAtMjA0OCwgIC01OTg3LCAgIC03MjIsICAgNDkzMiwKKyAtNDQxMCwgIDEyNTA0LCAgLTE1NzIsICAgMjI0NCwgICA1NjEwLCAgICAzMDcsICAtOTcxMCwgIC0zNjQyLAorIC02NDM2LCAgIDQzNjgsICAgMjk1NiwgIC0yMjY5LCAgLTYxOTYsICAgNDA2OSwgICAtNzY2LCAgLTM2OTUsCisgIDM0MTYsICAtNTc4NiwgIC05NjY4LCAgMTE2NzcsICAgMTIwOCwgICAtOTY1LCAgIDE1MTYsICAgMTEzMiwKKyAgMTAxOCwgIC02MTY4LCAgIDE5NzAsIC0xMDM1NywgICAxMzc5LCAgIC03MjUsICAtODc4OSwgICAzNzMwLAorICAgLTY1LCAgLTQ3NTgsICAtMTgxOCwgIC0xMDUwLCAgIDk2NDEsICAgNDUxOSwgICAyODg2LCAgIDI2NjcsCisgIDYzNDgsICAgMjQzNiwgICAtNDM4LCAgIDE5NzgsICAtOTM3NCwgIC0xMjg2LCAgIDM4OTMsICAtMjA3MywKKy0xMTE5OSwgIC0yMDgxLCAgIDMzNDUsICAtMzQ0NCwgIC05NDgwLCAgIDI0MTAsICAgMTk4NiwgIC0xODY5LAorICAzMjUyLCAgIDU5NDksICAtMjExOSwgICAtNDAxLCAgIC0yMTQsICAgMzQxNiwgIC0xMDY3LCAgMTg1MTAsCisgLTI5ODYsICAgMzUxMCwgICAgNTA4LCAgIC0zNTcsICAgLTgzNywgIC0xMjA1LCAgIDI4ODQsICAxMTU4NywKKyAxMTU2NSwgICAtNTU1LCAgLTI2NjQsICAgLTg3MywgICAzNjQyLCAgLTIwNjgsICAgMTczNCwgIC00NDA4LAorICAgMzMwLCAgIC0xODEsICAtMTM1OCwgICAxNDA3LCAgLTk3MzksICAgIDgwOSwgLTEwMjAzLCAgLTIwNjYsCisgIDM0NDAsICAtMjA2MywgICAzMjM4LCAgIDM3MzQsICAgMTY3MSwgICAgNzUwLCAgIDY4OTAsICAgNDA2OCwKKyAgMTIzOCwgICAgNDkzLCAgLTEzMzAsICAgICA3NiwgICA4OTE4LCAgMTA4NTUsICAgICA4NSwgIDEyMjM2LAorICAzNTcwLCAgLTEwNzQsICAgMzAwOCwgIC05NDI0LCAgLTMxODYsICAgMTI3MSwgICAtMzgwLCAgIC0xNTcsCisgLTQ5NzQsICAxMDU3NSwgIC0xMzc4LCAgIC0yMTksICAgMTM1NCwgIC0xNTg5LCAgMTA5MzYsICAgMjI2OCwKKyAtMzc4NywgIC0xMDQwLCAgIDc1NjcsICAgIDkyNCwgIDEwNDkwLCAgIC04MDYsICAtMTMxOCwgIC0xNTc2LAorICAtMjA5LCAgICAgOTMsICAtMzc0NSwgIC0zODIwLCAgICA0MzksICAtOTgyOCwgIC02MjY1LCAgIC04NjQsCisgMzEzNDIsICAgICAzNSwgICAxMzMyLCAgICA0NDMsICAgLTU5MCwgICAgODQ2LCAgICAxMDQsICAgIDg2OCwKKyAgLTg2MywgICAxNTI2LCAgLTEwODgsICAxMTQ5NCwgIC03MDU1LCAgIDM1NjQsICAgIDEwOSwgIC0zMDcyLAorIC0yMjM0LCAgLTQ1MzAsICAgMTg2NiwgIC0zNDI1LCAgIDk5NDAsICAgMzE1OCwgIC0xODIxLCAgIC02ODAsCisgLTExMjQsICAgMjg4NCwgICAxMTkxLCAgICAtNjEsICAtOTY5OCwgICA3NTk2LCAgIC01NTgsICAtOTAxOSwKKyAtMTE4MSwgICAgMjA4LCAgLTEzNDIsICAgIC02OCwgICAtMzEyLCAgICAyOTQsICAtMTQ2OCwgICAxNDEwLAorICAgIDM5LCAtMjEwODEsICAgIDcyNCwgIC0yMTM3LCAgICA5MzUsICAgICAtOCwgLTEwMjk3LCAgIDM1MDksCisgLTY1MTAsICAtNjU1OCwgIC02OTA2LCAgLTE5MDUsICAgMTkxNSwgICA1OTIwLCAgLTg5ODMsICAgMzQxNiwKKyAgNzMwMCwgIC0xMzcyLCAgLTE0MjIsICAgMTgyMiwgLTEwNDMzLCAgLTI1MzAsICAgMTY2OSwgICAgNTU0LAorIC0zMDA4LCAgLTMzNTEsICAgLTkyMiwgICA4Mjc5LCAgLTUxODQsICAgNTUyMCwgICA0Nzg1LCAgICA2ODMsCisgIC01MDYsICAtNDU1OCwgICAxOTM4LCAgIDg0NDIsIC0xMjYzOSwgICAgLTU0LCAgLTI5MDcsICAgLTgyMCwKKyAxMDAwNCwgICAxNzgwLCAgICA0ODUsICAgMTQwMSwgIC0zNzg2LCAgICA3ODYsICAtNTkzNywgICAyNjMyLAorIC0xNTQwLCAgICA5NzIsICAtMzM0MiwgICAyMjk0LCAgIDgwNzYsICAtMTAwNiwgIDExNzMxLCAgLTE4MjUsCisgIDMwMzYsICAgMTA4NSwgICAxMTYwLCAgLTk2ODAsICAxMTExMSwgICA3ODM4LCAgLTI1MDQsICAtMjExMiwKKyAgMjM3NiwgICAyNTM0LCAgIDM2MjQsICAgIDU1NSwgICAzNjEwLCAgIC01MjAsICAgLTgzMSwgICAgLTE1LAorICAtNDk4LCAgICAxNjcsICAgIDcxMSwgLTIyNjg1LCAgIC05OTksICAtMTQ2NiwgIC0xNjQzLCAgIC0zOTQsCisgIDU0MDQsICAtNDI0NywgIC0yMzA3LCAgIDQwNTIsICAtMTE1NiwgIC0xMjQwLCAgIC00OTAsICAtMTU5OCwKKyAtNDM2NSwgIC04MzgyLCAgMTA0OTMsICAgIDQ2NCwgLTE2NTkyLCAgIDM3MjMsICAtNzcwOSwgICAtODIxLAorIC00MjE4LCAgIC05MjIsICAgIDM5OCwgICA1NjM1LCAgIDIxODQsICAgNTA5MCwgIC03MTQ0LCAgIDI0MjAsCisgICA3OTIsICAgLTMyNCwgIC0xMjc4LCAgIDMxNzIsICAxMzEwMSwgICAxNjA4LCAgLTM5OTYsICAtMjIxOSwKKyAgMjk5NSwgIC02OTI0LCAgICA4MTYsICAtMjQ4MiwgICAtNDA2LCAgIDM0NTgsICAgIDUwMywgIC04MTU0LAorICAzNDYwLCAgIDI1NDIsICAtMzcwMywgICA4NTI0LCAgICAtNjEsICAgLTQzMCwgIDIzMjEyLCAgIDEyMDMsCisgIDIzMzUsICAgNTU1NiwgICAtNDc2LCAgICA5MjMsICAgLTU2NSwgICAgNTkzLCAgLTE2MTEsICAgMTgxNCwKKyAtMTYxNCwgIC03MDY3LCAgLTE5NTcsICAxMDE2NiwgIC00MzA2LCAgIC00MjEsICAtNDAyNiwgICAxODU0LAorIC05ODgxLCAgICA2NjcsICAgNzcyMCwgIC0yOTA2LCAgIDcwMDMsICAtMTgyMywgICA2MzQ0LCAgLTg2MTQsCisgLTI5NjUsICAtMjcyMCwgICAgLTYyLCAgIC04MDIsICAgMTk0NSwgICA0NTc0LCAgLTQ2MDQsICAtODM0MSwKKyAgIDUxOCwgIC0zNTQzLCAgICAgOTUsICAtNDI2MiwgIC01MjIwLCAgIC0xMzMsICAxMDI3MCwgICAxOTk5LAorICAzMjM0LCAgIDg5MDAsICAtNDg2NiwgIC0zNzA4LCAgLTQ0NjUsICAgNDU0MiwgICAyNTQ1LCAgIDE3NzAsCisgIDY5OTUsICAgMzU1OSwgICAxMTMzLCAgLTExNTIsICAxNDY4MCwgICAxMDAyLCAgICA2MzQsIC0xMjkxMywKKyAgMTY4NiwgIC0xNjQ1LCAgLTE3OTYsICAgIC01MCwgICAgMTEyLCAgLTExMDgsICAgMTA3MCwgICAgNjg2LAorICAxMDY4LCAgIDE1NTUsICAgIDg5NiwgICAzNDk4LCAgMTA0NTgsICAgIC0zMiwgIDEyMDE3LCAgIC03MzcsCisgICA2NTAsICAgLTQzMiwgICAgNDA0LCAgICAxNzAsICAxMDg3MywgICAxODY0LCAgLTE3MTgsICAxMTA2MSwKKyAtMTU1NiwgIC0zNzY2LCAgICAyMjUsICAgNjk5OSwgICAxNzMwLCAgLTY5MTksICAtMTg5NSwgIC0yOTE5LAorICA4MjUwLCAgMTAwNTAsICAtNDYzMSwgIC0xNDg4LCAgLTQ4MDEsICAtMTUwNCwgIC0yNzM2LCAgIC0xMTAsCisgLTM2MzAsICAtMjc1MiwgLTExMTYyLCAgIDExMjgsICAtMjU4MCwgIDExNjkyLCAgIC02NzgsICAgMTMzOCwKKyAgMjE3NSwgIC02MDMwLCAgICA2MTYsICAgMTY1MSwgIC03MDM0LCAgLTMwNTcsICAgMjQyMCwgICAxOTk4LAorICA0MzgzLCAgLTE3MjEsIC0xMDc2MiwgICAtNDI4LCAgIDI5MDIsICAgLTkwNiwgIC00Mjk4LCAgIDIxNDEsCisgLTEyNDIsICAgNTQ2NCwgICAtNjA3LCAgIDUzODksICAtODk0NiwgIC0zODkwLCAgMTA4ODQsICAgMTU0NCwKKyAgIDYyOCwgIC0xOTY5LCAgMTM5MDIsICAtMTU3MCwgIC0xMDgwLCAgIC02ODksICAtNDY3NiwgIC0zNjQyLAorICAgNzUzLCAtMTEzNTEsICAgLTExMCwgICAtNzQ0LCAgIDQyODYsICAgMTE2MywgICAzMTA1LCAgIDk3NTIsCisgMTExNDMsICAgNDI5NiwgIC0xNjk4LCAgIDEwMTIsICAgMjI4NCwgICAtOTg5LCAgIC05NTgsICAtOTQ4MSwKKyAgIDczOCwgICAgIDI0LCAgICA0MjYsICAgMTYzOCwgICAzODk4LCAgIDg4ODUsICAgMjkzOCwgIC04ODI2LAorICAyOTgyLCAgLTE2NzksICAgODQ2NiwgICAtNjUxLCAgIDUxNDQsICAgMjczNiwgICAgNzUxLCAgICAtODQsCisgIDc3MTAsICAgMzA3NywgICAyODg1LCAgICAxNDYsICAtMTEwMiwgIC0yNTY5LCAgLTIwMzksICAxMTA1OSwKKyAtOTk1MCwgIC0xMDQ4LCAgLTEwMzEsICAgIC0zMywgIC01MTE4LCAgLTEwOTYsICAtMTk4NiwgICAyMzA2LAorICAyNDAwLCAgIDkzMjAsICAgNjE4OCwgICAgNTAwLCAgIDIwOTAsICAgICA2MSwgLTExMzU3LCAgICAxMTgsCisgIDE1MDUsICAgMTAzMiwgIC0xOTIwLCAgIC0xNjQsICAtOTc0NCwgIC00NjcwLCAtMTEwMjksICAgLTEwMiwKKyAgLTk2MCwgIC0xMDIzLCAgLTI1NzAsICAgNDEwMiwgIC0zOTg5LCAtMTE0NzgsICAgIDc3MiwgIC0xNTE1LAorIC0xMTAyLCAgLTIxOTQsICAgMTcyMiwgIC0xMTk1LCAgLTgxNDQsICAgIDc0NiwgIC05NTM0LCAgIDMyNTAKK30sCisKKy5jYjQ0NDBsMCA9IHsKKy0xNDQ5NywgIC0xOTgyLCAgICA2MzEsICAgLTk4NCwgIC0yMTE1LCAgLTMyNTIsICAgMjc1NSwgICAyMDE3LAorIC0yMTEwLCAgLTg4NjQsICAgLTc5MiwgIC0xMjkxLCAgLTI3NjEsICAtMjM2NSwgICAgNjk4LCAgIDEwNDcsCisgICA5NzIsIC0xNDcwMywgIDEwNTkwLCAgLTM5NDUsICAgIDY2MywgICAgOTcyLCAgIDEyMDQsICAtMjgwMSwKKyAgMTI5NSwgIC0xMjk2LCAgICAgNTAsICAgMTQ0OCwgICAgODg4LCAgLTE4NzksICAgIDEyMiwgICAgIDc4LAorICAtMTgzLCAgIC01ODgsICAxNjIwMiwgICAtMzg4LCAgLTIyNDAsICAgMTEzNiwgICAxMjY2LCAgLTY0NDUsCisgIDI2MTksICAtMTY2NCwgIC02MzI5LCAgLTI3MDAsICAgMTU1NywgICAtNDk3LCAgICA1OTgsICAgLTExMCwKKyAgMTI5OCwgICAtMzM0LCAgICAxOTEsICAyOTg5NywgICAgMzg3LCAgICA0MTksICAgICA3NiwgICAgMTUyLAorICAgNTMzLCAgICAgNzgsICAgIDExMiwgICAgMTAxLCAgICAxNTgsICAgIDEzNiwgICAtMjM2LCAgICAgODgsCisgICAgNDMsICAgIDEwNywgICAgIDg0LCAgICAgMjEsICAtNjM4NSwgIC0xNzExLCAgIDE3NTcsICAgMTQxMSwKKyAgOTE1MiwgICAgLTcyLCAgIDE0MjgsICAtMTA5OCwgIDEwMzI4LCAgIC01MDYsICAgLTM2MCwgICAgMjg1LAorICAgLTM2LCAgLTI4MTYsICAgIDgxOSwgICAgIDg4LCAgICAxNzYsICAgLTQ4MSwgICAtMTcyLCAgIDIwNjcsCisgIDMyNjgsICAgNTQ3OSwgICA4NjA1LCAgMTEyNzIsICAtMTg4MCwgICAgMzYxLCAgIDE1ODIsICAtNDk3MywKKyAtMTM3OSwgICAzODM1LCAgICAgNzQsICAgICAtMywgICAgNDkzLCAgIC00MzEsICAgMTM5MCwgICAgMTAxLAorICAtNTUwLCAgICAgNTksICAgIDQ3NiwgICAtNDY5LCAgIC01ODMsICAgIDU2OCwgICAgNzMyLCAgLTEwMTUsCisgLTExMDQsICAgLTY5OCwgIDIzOTIyLCAgIDExMzAsICAtMTI2OCwgICAgMjgwLCAgICAyMDQsICAgIC01OSwKKyAtOTc4OSwgICAtMzE3LCAgICA5MzUsICAgMjk0NCwgLTEwNDAyLCAgLTI1NjQsICAtNDY0OCwgICAxNTA2LAorICAzODM0LCAgLTEwMDIsICAgMjgwNSwgICAtMTU4LCAgIC00MDksICAgIDgxNCwgICAtMTUwLCAgICAtOTcsCisgLTM1NzMsICAtMTU1MCwgICAxMzU2LCAgIDUzNTAsICAgLTM2NSwgIC0yNjIyLCAgLTM0NTQsICAgIDMxMCwKKyAgMTE5NCwgICAgOTExLCAtMTA5MjgsICAgIDkzNywgICA3OTgwLCAgLTUyODYsICAgLTU1NCwgICAxOTk5LAorIC0xMjYzLCAgIC01NjIsICAgICAxMCwgICAtMzIxLCAgICA3NDQsICAgICA0NCwgICAgIDY0LCAgIC0yNzQsCistMzAxMzYsICAgIDM0MCwgIC0xMDUxLCAgICA3NTYsICAgIC0zMCwgICAgIC02LCAgIC0yNjksICAgLTI3MywKKyAgICAxMiwgICAgIDk1LCAgIDE1NjUsIC0xMzE5NCwgLTExODEwLCAgIC00ODUsICAtMTU3NCwgICAgNDE0LAorICAtMjQwLCAgIC00NTIsICAgIDU2NCwgICAgNzQwLCAgIC00NzYsICAgIDk1OSwgICAxMDc5LCAgLTE1NjgsCisgIC00MjIsICAgICAzNywgICAtMTU0LCAgMTAxMTcsICAgIC02OCwgICAxNDEyLCAgMTE4NjIsICAtMzQyMCwKKyAgNDE2OSwgICA1MTc4LCAgICA1MjcsICAtMTAyNywgIC0xMDMwLCAgLTE5ODUsICAgIDQ0OCwgICAtNzE2LAorICAxNjk2LCAgIDE5NDIsICAgLTI1NCwgICAgMzA4LCAgIDExMDAsICAgLTc5MCwgICA4MTAyLCAgIDY2MzAsCisgIDM2NTMsICAtMTAxOCwgICAtNTg3LCAgLTY5OTAsICAgIC0xOSwgICAxNjcxLCAgIDE0MjUsICAgODA4OSwKKyAgMzcwOCwgIC0xMTgyLCAgICA3NzQsICAgIDY1OSwgICAgMTEzLCAgICA0MzcsICAgICA1MCwgICAgODM1LAorICAtNTMyLCAtMTEyMDksICAgMTY4MiwgIC03NDkwLCAgLTI1OTIsICAgMTIzNCwgIC00Njg5LCAgLTczMDEsCisgIC0xNDMsICAgMzM2MSwgICAxMTIxLCAgICAxNzcsICAgLTQ3MywgICAgNTEzLCAgICAxMzYsICAgIDk2NSwKKyAtNDAyMCwgICA0NjM5LCAgLTEyMTIsICAgMTI3MSwgICAyOTA1LCAgLTY4NjUsICAxMDQ5OSwgIC0zODAwLAorIC0zMzU0LCAgLTUwMjksICAtMzYwNiwgICAtOTUwLCAgIDQ0OTAsICAgIDUyNiwgICAxMDA2LCAgICAgIDIsCisgIDE3NjAsICAgNTgxOSwgICAgLTU1LCAgLTEwOTgsICAtMTg0MywgICAgMzQ4LCAgLTIwNjIsICAtOTE5NiwKKyAgMzcxMiwgLTExNDY2LCAgLTMyMTgsICAgLTg1OCwgICAyNzIwLCAgICA1ODksICAgIDMyMCwgICAgODYxLAorICAgIDU5LCAgIDUzNTcsICAgIDU2NCwgICAtMzgwLCAgICA1MzgsICAgLTE0MiwgICAgNDkwLCAgICAyMTIsCisgIDE3MTYsICAgIDY3MCwgICAxOTA0LCAgIC0xODEsICAgMjk3OSwgICAgOTQzLCAgMTY5MTYsICAgMTI3MSwKKyAgIDk4OCwgICAtODAyLCAgLTE0OTAsICAgOTE1NCwgICAgNjQzLCAgIDE3MjUsICAgMTM0NywgIC0yODI3LAorIC00MDk2LCAgICA0ODUsICAtNzA5MSwgIC0zMTgwLCAgLTQ3NDcsICAtMTYwNCwgICAxNTc2LCAgLTU3MjQsCisgIDYxMDQsICAgLTEzOSwgICAxNzI2LCAgMTE3MTUsICAgIDM2MCwgICA3NTE5LCAgIDI1MTMsICAgNTE5MiwKKyAtMjIwOCwgIC0xOTkzLCAgICA4MjksICAgLTM4NywgIC01NzI0LCAgIDQ0MTgsICAgIDExNiwgIC0yOTU1LAorICAtMjI2LCAgICAyNDksICAgIDM3NywgICAyMTQ5LCAgLTI5MjksICAgNTAyMSwgIC0zMDY0LCAgICA4MDAsCisgLTE0NTksICAxMTM4NCwgICA4NTU2LCAgIDE3NDAsICAgIDM2OCwgIC0yODM5LCAgLTIwNDksICAgMTQzOCwKKyAtMTM1NywgICA0MDg0LCAgIDE4OTYsICAgLTUyOCwgICAxNjIxLCAgLTE3NjAsICAxMzc0MSwgICAgMzAyLAorIC0xMDE4LCAgLTk3NzQsICAtMzUyMSwgICAxMzAyLCAgIDEzNzQsICAgMTEzOSwgICAgOTE4LCAgLTE3MjQsCisgIC03NjQsICAgIDg1OCwgICAgODA0LCAgLTE3NzIsICAgIDM3MiwgICAtMzIyLCAgIC01MjYsICAxMTkyNCwKKy0xMTk0NCwgICA0MDEyLCAgIDE3NDksICAgMTczNywgIC0xNTQ1LCAgICAgNjgsICAgIDg4OSwgICAgMjgwLAorICAgNjkwLCAgLTIyMDAsICAgMTA2OCwgICAtNDg0LCAgIC0xNzEsICAgIDQ1NSwgICAgLTQ0LCAgLTMxNzgsCisgIDIyNDMsICAgLTU5MCwgICAgNzQ5LCAgIC03OTIsIC0xOTg3NiwgICAgMTk4LCAgICAyMzYsICAgMjY5NSwKKyAtMzQxMywgICAgNjUyLCAgICAyODQsICAgLTgyMCwgIC0xMTM0LCAgIC0xOTksICAgLTExMiwgIC01NjUwLAorICAtNDE4LCAgIDEwNDcsICAgMTA5MCwgICAyMjYwLCAgLTMyOTcsICAtMjE2NCwgIDEzNTI0LCAgIDE3MjAsCisgIC0zMjYsICAgIDkxMCwgIC0xNzA2LCAgIDM5MTIsICAtMTE3NSwgICAxNjg3LCAgLTIxNTIsICAgICA1MCwKKyAgICAzNSwgICAxNzE4LCAgICA3MjEsICAgOTMxNiwgIC0yMjU2LCAgLTQzMzAsICAgNjk2MSwgICA0NDMyLAorIC04MDQzLCAgICAgNDUsICAgMTM3MCwgICAzNDcyLCAgIDI4OTIsICAtMzIyNCwgICAxMzY4LCAgIDEzNTUsCisgIC01NjIsICAgLTY5NCwgICAgNzQ2LCAgICAxOTgsICAgMTE4OCwgICAyODE5LCAgIDMxMzEsICAtMjM3MSwKKyAgNjQzOCwgICAgODQ3LCAgIDIxMTEsIC0xMDE4NywgIC0zNDUxLCAgLTk4MjYsICAtMzUwMiwgICAgNjU1LAorICAgNjQ5LCAgIDE0NjAsICAgIDI3MCwgICAgMTE4LCAgICAgNDUsICAgIDE5MiwgICAgMTg4LCAgLTExMzksCisgIC0yNTgsICAgIDY2MywgICAgLTg0LCAtMjc1MTksICAgLTc2NSwgICAtOTA1LCAgICAzNTcsICAgICAtNCwKKyAgICA4OSwgICAtMzcyLCAgICAtMjQsICAgIDE3OCwgICAxMTI3LCAgICAyMDksICAgMTE3NywgIC0yNzYyLAorICAtNTg3LCAgIDE0ODgsICAgODk4OSwgICAzMjE3LCAgLTI1NTAsICAgIDIxNSwgICA5NTQwLCAgLTcxOTYsCisgIDEyNTksICAtMzcxNiwgICAyNzY3LCAgIC0yNjEsICAgLTIxNiwgICAgODcyLCAgLTMwMDgsICAtMjA3NiwKKyAgODY4MiwgICAgNzA5LCAgIDM2MjksICAgICA4NywgIC0zMTE0LCAtMTA2MjQsICAgIDI0NiwgIC0xNjcwLAorIC0xNzM4LCAgIDEyMjksICAgNzYyNCwgIC0xMTIwLCAgICA3ODQsICAgIDMwNSwgICAgMjMzLCAgIC0xODUsCisgICAyODAsICAtMTQ2NiwgICAtMjY4LCAgICAxOTgsICAgIDQ5OSwgICAgMzA4LCAgLTIxODcsICAtMTE0OSwKKyAgLTM4OCwgICAgLTM4LCAgIC0zMzgsICAtMTA4NCwgLTE5NDI0LCAgICAgNDAsICAgMTk1OCwgIC0yMjQwLAorICAgLTg2LCAgICAyNjQsICAtOTg3NiwgIC0xMjg3LCAgIDQwODYsICAgMzc0MiwgICAyNTAyLCAtMTAwNzgsCisgIDQ1NzQsICAtMTQ5MywgICAxMDc4LCAgIDMyMTgsICAgMjQxMCwgICAtMzY0LCAgIDEwNDksICAgMjYzOCwKKyAgICAzNSwgIC0xMjk1LCAgICAyMDAsICAtMjg0NywgIDEwODE4LCAtMTIwNjQsICAgMjM3NSwgICAgMzQ4LAorICAtMzUzLCAgIDI3ODgsICAgLTgyMSwgIC0zMTk2LCAgIC01MTEsICAgIDE0NiwgICAyMDE1LCAgICAyMzUsCisgLTEwOTQsICAgMjYyMiwgICAyNjg4LCAgICAtNzksICAgNTE3NiwgICAtODg0LCAtMTE4MTQsICAgIDc5NCwKKyAgMjY5NiwgIC02NzA0LCAgIDM0NTIsICAgMTI5NSwgICAzODcyLCAgIDI5MjQsICAgNDQ5OCwgICAtMTY2LAorICAtNTk4LCAgLTEyMTMsICAgIDg5MSwgICA1NDc4LCAgIC0yNjYsICAgLTc3NywgICAgIC01LCAgIC03NzYsCisgIDEwMDMsICAtMTgzNywgICAtMTU2LCAgMTc5MTAsICAgIDQ1MywgICAtMjk3LCAgLTE1NDUsICAgIDg1NywKKyAgLTI4OCwgICAtMzA4LCAgLTYzNzMsICAgMjA0NSwgIC0xODQ2LCAgIDMwMDcsICAtMjIzNiwgIC0xOTA0LAorICAgODE1LCAgLTI4ODksICAgNDIwMCwgICA4MzIwLCAgIDk4NzIsICAgLTYxNCwgICAtODM0LCAgIDM4NTYsCisgICA0MTQsICAgLTIzNCwgICAxNTU5LCAgLTc0NTEsICAgMzY0MSwgIC0xMjMwLCAgICA4MzcsICAgLTEyNywKKyAgMjY1MiwgICAgNDExLCAgIC01MzIsIC0xMjU0OCwgIC0xNjkyLCAgIDEwMzQsICAtMjQxOCwgICAtOTY4LAorICAgNTU4LCAgLTE1NjQsICAtMTk1MiwgICAgMzA3LCAgLTEwNjQsICAtNjc3NiwgICAxNTg4LCAgLTI2MzYsCisgICA5NDksICAgODI3MiwgICAgLTEyLCAgLTM0NjgsICAgMzQ4MSwgICA2NTg4LCAgIDI1ODAsICAgNzM5MywKKyAgIDI3MiwgICAxNTI4LCAgIDE4MTgsICAtMjIwNiwgICAtMzQ5LCAgIC0zOTYsIC0xMTcwNCwgICAxNDg3LAorICA5NzUzLCAgLTQ2NjUsICAgIC0yNCwgICAyMDg0LCAgIC03ODAsICAgNTAzNiwgICAtNjQ3LCAgIDM2NjgsCisgICA1NjEsICAgMTA5OSwgIC0xMDk0LCAgICA1MzQsICAgMTI3MCwgICAgLTk5LCAgIDEwMDYsICAgLTQ3NiwKKyAgLTUyOCwgIDEyNDgxLCAgIDE1ODksICAgMTU5MywgIC0xNjgyLCAgIDcwMjIsICAgMjY2NCwgICA4NzAyLAorICAtNTYzLCAgIDEwODIsICAgLTIwNiwgICAgIDg3LCAgLTE5NzgsICAgLTE0NCwgICAgMjI4LCAgIDEyMzIsCisgICA4ODksICAxNDM0MCwgICAgIDY1LCAgLTEwNjEsICAxMDUxMCwgICAgLTk1LCAgICA2NDksICAgICA1MywKKyAgLTk2MiwgICAtMzgzLCAgIDI0NzksICAgMTMyMiwgIC0xNzk4LCAgIDI4NDAsICAgLTQ5MiwgICAtNDE5LAorICAgIDkwLCAgIC02ODAsICAgICA3OSwgICAxMDI2LCAtMjA5MTIsICAgMTU5MywgICAtNzQyLCAgIDEwODYsCisgICA1MTYsICAgIDY5OSwgICAyMzkzLCAgICAtNjQsICAtMjAxMCwgICAgIDQ2LCAgIC04NTksICAgIDExMSwKKyAgLTQ0MCwgIDE0MjgxLCAgICAyNzIsICAgIDc5NywgLTEwMTQxLCAgLTM3MzQsICAgMzEyNiwgIC0zMDUwLAorICAxMzAwLCAgICAgNzMsICAtMTc1NCwgIC0xMjc4LCAgIDE4OTAsICAtMjcxMCwgICAgNzA0LCAgIDExNjAsCisgICAgIDEsICAgIDI2OSwgICAgLTI0LCAgIC02MjIsICAgIDEyNCwgICAgMTM4LCAgIC01MjIsICAgLTUxMCwKKyAgICA5NSwgICAtNDAyLCAtMjczMDYsICAgLTQ3MCwgICAtMjE0LCAgIC0xNTksICAgIDM5NiwgICAtMjAxLAorICAtMzcyLCAgICAxMjIsICAgIDEzNiwgIC0xMDA1LCAgICA3NDQsICAgMTk0OSwgICAtODEwLCAgLTI2NDgsCisgIC03MjYsICAgLTM4NCwgICAgOTU1LCAgIDEyMzIsICAgMTM1NCwgICAtMzQ1LCAtMTk0ODUsICAgMTA1NiwKKyAgLTE5MywgICAxMjU3LCAgIC0yNjMsICAgIDM5OCwgICAtNzUyLCAgICA2MDIsICAgICA5OCwgICAgNzkzLAorICAgIDE3LCAgMjAxODYsICAgLTE4OSwgIC0yNjE1LCAgIC0xNzQsICAgIDE2NiwgICAgNDM2LCAgICA0MTEsCisgLTEwNDYsICAgIDM3NCwgICAtNDcxLCAgIC0yNTMsICAgIDIzMywgICA4MzUyLCAgIDEzNDIsICAtMTI3OSwKKyAgOTMwNSwgICAyMTkwLCAgLTMyMzksICAtNTI2MiwgIC0zNDU0LCAgIDE4NDQsICAgIDY4NCwgICAgMzAzLAorIC00NDM0LCAgLTYwNDEsICAtMzQ5NSwgIC0yNDgyLCAgICAzODksICAgIDM1MywgICAgMTU5LCAgICAtMTQsCistMjkxNzksICAgLTUxMSwgICAtMTU4LCAgICAgOTIsICAgLTQwMSwgICAgLTM2LCAgIC0yOTcsICAgIDQ0NywKKyAgLTYwNSwgICAgMjY5LCAgICAgODUsICAgIDIxMiwgICAgICA4LCAgIC0xMTgsICAgLTEzMCwgICAgMjA3LAorIDEzMTUwLCAgLTg3MTIsICAgMjUwNCwgICAxMzU1LCAgLTMyNjgsICAgMTM5NiwgIC00NzQ4LCAgLTIyMDAsCisgLTE1NjAsICAgIDIyOCwgICAtMTYyLCAgIDExNzksICAgMzAyNCwgICAgNzQyLCAgIC04NjAsICAgICA2OSwKKyAgICAxMCwgIDMwMDA2LCAgIC01MzgsICAgLTQ4OSwgICAtMTI1LCAgIC0yMTQsICAgIDM2NCwgICAtNjgyLAorICAtMjgzLCAgICA1MzIsICAgLTEzNCwgICAgMjI3LCAgIC00NDgsICAgIC0yMCwgICAtMjY2LCAgICAgNzAsCisgICAgIDIsICAgOTMxMCwgIDE0ODU4LCAgICA4NTYsICAgLTQ5MywgIC0zMzU3LCAgICAgMzYsICAgLTI0OCwKKyAgIDIxNCwgICAgMjgxLCAgICAtNzMsICAgMzI2OCwgICAgNzQ1LCAgIC0yNDUsICAtMTAwNywgICAgMTQ2LAorICAgMzkyLCAgICAgMzYsICAgODA0MiwgICAyOTUzLCAgLTY2MDMsICAtNzY5NywgICA0NDI1LCAgLTI0OTgsCisgICA1NzEsICAtMjE5NCwgICAzMzg4LCAgIC03OTQsICAgLTU2MSwgIC0yNzYzLCAgIDE5MTIsICAtMzAzMCwKKyAgIDIyNSwgICAgMjE0LCAgICAtMjcsICAgIDgzNCwgLTEwNjYxLCAgICA0MzcsICAgLTUwNiwgICAtNTM1LAorICA4Mzk3LCAgIDEzMzIsICAtMjQwNiwgIC04ODY4LCAgLTI5NzIsICAgMTM4NSwgICAgMjk2LCAgICA4NjUsCisgIDIzMTgsICAgIDg5MCwgICAgMjQ0LCAgIC0xMjEsICAgIDIyNiwgICAgMzc1LCAgICA4OTYsIC0xMDM4MSwKKyAtMjI2NiwgIC0zNDA0LCAgICA5ODMsICAgMTI1NSwgICAgMjU5LCAgMTE0MjcsICAgIDQ1NSwgIC0zMDQxLAorICAgMzA3LCAgLTI0NDYsICAgIDQ3NiwgICAgNzIzLCAgICAgMTgsIC0xMDIyNCwgICAgNTEwLCAgICA1NTIsCisgIC02NTQsICAgLTg3NiwgICAtNDY1LCAgICA2MjgsIC0xMjU3MiwgICAgNzg2LCAgIC0zOTMsICAtNDE2MiwKKyAgIDkzOCwgIC0xMzI3LCAgLTE2OTUsICAgLTYwOCwgIC0xMzUyLCAgIC0xMzEsICAgLTg4MCwgICAgODMwLAorICAxMDE2LCAgMjE4NzUsICAgLTQwOCwgIC0xNTYwLCAgIC01MDAsICAtMTY4MiwgICAgNDUzLCAgIC05MzAsCisgIDEzMTYsICAgLTEzNiwgICAgNDM0LCAgIC02ODMsICAgIDQxMiwgICAgMjAyLCAgICAyMzMsICAgIDM4MiwKKyAtMjAwMiwgIC05MjY3LCAgLTEwMzQsICAgODcxMCwgICAgNDM0LCAgLTgxMjEsICAgMzAzNSwgIC0zMTIxLAorICAxNzkyLCAgIDI3MTIsICAtMTUzNywgIC0xMDgyLCAgICA4NTQsICAgMTMzNywgIC0xMDg0LCAgICAgOTEsCisgLTQ0ODUsICAgMjU0NSwgIC00NDEyLCAgLTE5MzAsIC0xMjIzNCwgIC00ODAyLCAgIDQ2NDEsICAgIDQzNywKKyAgLTkyOCwgICAyMTYzLCAgLTMxNTQsICAgIDUyMSwgICAtNjY1LCAgLTEyMDAsICAgMjY1NCwgICAgOTMxLAorICAtMzg4LCAgIC0xMTgsICAtMTE0NCwgICAgMTMzLCAgIDUwODksICAtMTE5NCwgIC0xNTI4LCAgIC05NjcsCisgIC03OTUsICAgIDE4OCwgICAxOTE4LCAgICA4OTcsICAtNzA0NiwgIC03NjE3LCAgIDcxMTgsICAgNTc1NSwKKyAtMjcyNCwgIC03ODk0LCAgIC00NzIsICAgLTM2MCwgICAtNTkxLCAgICA5OTAsICAtMzAzMiwgICA3NzQyLAorICAgNzI2LCAgIDU0OTAsICAgOTM4MywgICAgNDc5LCAgLTMwMzIsICAtMTkwNCwgICA3MTU4LCAgIDQ3MDYsCisgIDI0NDIsICAtMTU3NiwgICAgLTU4LCAgIC0xNTYsICAtMzk3NywgIC0yNjk2LCAgIDQxOTUsICAgLTE2NiwKKyAgMzM0MiwgIC0xNTY2LCAgIDM3NjcsICAtNDE1OSwgIC01NzUwLCAgIDU1MDUsICAtNzY2MywgICA0NTE2LAorIC00MDczLCAgLTI2MTIsICAgNTEzNiwgICAtMjkwLCAgIC02NjYsICAgMTI4MiwgICAgNzc2LCAgIC01NjYsCisgIC02MDIsICAgLTMxMCwgICAxMDAzLCAgIC02NDgsICAgMjkyOCwgIC0zMTU5LCAgICA0MjcsICAtMTE2OCwKKyAtMjcwMiwgLTE2OTkwLCAgIC0yMDUsICAgLTM0MywgIC0xMTk2LCAgLTE5ODAsICAgMTY1MywgICAtNTEyLAorIC0xODIwLCAgIC00MTgsICAtMzM2OCwgICAzNTIyLCAgLTE5NjYsICAgNDk2NCwgIC01NzI4LCAgLTUxODUsCisgIC0yMTAsICAtMTcyMSwgIDEwMTMxLCAgLTcwNjAsICAgMzM1MSwgICAgMzM0LCAgICAtOTYsICAtMzE5MywKKyAtMTcxMywgICAtNjE0LCAgLTI2MzMsICAgIDE0NywgIC0xNTUyLCAgLTIzNjMsICAtMzcyNCwgIC0xNzMxLAorIC03MzUwLCAgIDU0NTMsICAtMjczMiwgIC0yODY3LCAgMTI0NTgsICAgIDQxNiwgICAgICAwLCAgIDQ0MTQsCisgICA4MzMsICAgIDU5MCwgICAxNjE3LCAgICA0MDUsICAgICA3MywgICAgODY4LCAgICAyMzIsICAgIDE5NSwKKyAgICAxNSwgICAtMTk2LCAgIC03ODIsICAgIDc0OSwgICAtOTU1LCAgICAtODQsICAgMTE3NiwgICAtNTUzCit9LAorCisuY2I0NDQwbDEgPSB7CistMTIyMjcsICAtMzQxMywgIDEyODQ4LCAgLTEzMzYsICAgICAyMCwgICAgODk0LCAgICAyNTQsICAtMTAwMSwKKyAtMTM4MSwgICAtNDA2LCAgLTExNTcsICAgLTQ1OCwgICAgMzAwLCAgIC0zOTUsICAgIDgyNSwgICAgLTM0LAorICAgIDc0LCAgICAzODIsICAtMTAxOCwgLTEwMjY2LCAgIDEzMzgsICAxMTA5MSwgICAgNTQ0LCAgICA3OTcsCisgLTQzMDQsICAgMTM4OSwgICAtNzQ3LCAgIDE5MjQsICAgLTI1NywgICAyNjE1LCAgICAtMzcsICAtNDM3NSwKKyAgIDc4MiwgICAgMTU4LCAgIC0zNzgsICAgICAxOSwgICAgNjUyLCAgIC01MzksICAgMTAxMiwgIC00MjExLAorICAxMjYzLCAgIC05MjUsICAgICA5NiwgIC05MjI2LCAgIDU5MjEsICAtODIwOSwgICAgLTcxLCAgLTE4MzgsCisgLTIyMDEsICAtNzQ0MSwgICAgLTYwLCAgICAzOTMsICAtNTYyNiwgICAtMjY0LCAgLTEwMDIsICAgICA4NSwKKyAgMTk4OSwgIC0xNjE2LCAgIC0yMTYsICAgLTkxNCwgICA5OTA3LCAgIDgwNDQsICAgLTU3OCwgIC03ODMwLAorIC0xNzA1LCAgLTM2MjQsICAgMjQzMCwgICAgIDU5LCAgIDU4MTMsICAgIDg3MCwgICAtMzE3LCAgLTI1NDUsCisgLTQwMjAsICAtMTMzMCwgICAxMjE1LCAgIDkzNTIsICAgNTQyNSwgICAgMzI0LCAgLTQ4MDMsICAgLTY4MSwKKyAgLTUwNiwgIC00NzEwLCAgLTY1NzQsICAtNDE4NCwgICAgIDY1LCAgICA3MjksICAtMTMxMCwgIC0xMzg3LAorICAxMzg1LCAgIDIzNjQsICAgMTY3MiwgICAyNDkzLCAgIC00MzgsICAtMTM2NywgICAtOTA3LCAgICAgMzgsCistMjAyMjAsICAtMTY0NCwgICAgNTEyLCAgIC00MTMsICAgIDM0OCwgICAtMTEyLCAgIC01MzIsICAgIDc4NSwKKyAgMTMzMiwgICA3MTQwLCAgLTE5MTYsICAtMTc2NiwgLTExNTcwLCAgIDE4MTEsICAtOTE2NywgICAgLTc2LAorIC0xNTMxLCAgIC0xNzUsICAtMTczOSwgICAtNzcxLCAgIDIwMTQsICAgIDUxOSwgICAgIDE1LCAgICA1NzYsCisgIDg3MzYsICAgLTk3OSwgICAgLTI4LCAgIDE4MzAsICAgIDMyOSwgICAtMzAyLCAgMTIyMDYsICAtMTUwMSwKKyAgNTE5NSwgICAtMzA1LCAgIDE0NTYsICAgLTU4MSwgICAxNDg4LCAgICAxNDIsICAgIDIzNSwgICAtMTU3LAorICAgMTkyLCAgIDE1NDAsICAgLTkyMiwgIDExMDU2LCAgMTE4MjMsICAtMjk2NCwgIC0xNDg4LCAgIDE3MTIsCisgLTIwMTgsICAgLTg4MCwgIC0zMjgyLCAgIC0xOTAsICAgLTE5OCwgICAyNDM2LCAgIC0yNDgsICAgIDIyMiwKKyAgICAyMiwgICAgODYzLCAgIDE1MDQsICAgMjA3OCwgIC0yMDQ3LCAgICAyMTYsICAtMTI3MCwgICAtNzMyLAorLTE4MjUyLCAgIDExODYsICAgMzE3OCwgICAtNzMwLCAgICA0MzIsICAgIDkzNCwgICAxNjE3LCAgICA4NzMsCisgIC00OTEsICAgIC03MCwgICAtNzY4LCAgICA2NzksICAgMTM5OCwgICAgNTM3LCAgIC0zNjQsICAgIDE3MiwKKyAgLTU0MSwgICAgLTk0LCAgICAtMjQsICAgLTEyOSwgLTI2NzI1LCAgICAyMDEsICAgLTU1NCwgICAtMzU3LAorICAgLTcxLCAgICAgNjAsICAgICA5NiwgIC0xNjY1LCAgIDE0MjUsICAgMTI0NCwgICAgMzMyLCAgLTEwNjgsCisgICAzMjYsICAgIDgzNCwgICAtNjIwLCAgLTE0NzMsICAgMTU4NSwgICAxNDMyLCAgICA5MjgsICAxODc4MiwKKyAtMTM4OCwgICAyODk3LCAgICA0NDgsICAgICA0MCwgICAxMzIzLCAgIDE0MzMsICAgIDc4NywgICAgMjE1LAorICAzMjk3LCAgIDI1ODYsICAgLTg1NiwgICAgNDUxLCAtMTc3MDAsICAgIDczNSwgICAgLTQzLCAgICA0MDUsCisgLTEyNTIsICAgIDc0NCwgICAxMDEyLCAgICA2NzcsICAgIDMxMiwgICAgMjA2LCAgIC0yNzksICAgLTQzMiwKKyAgNjY3NywgICAgLTg3LCAgICAtNzIsIC0xMDQwMCwgICAtMTA2LCAgMTEyMjQsICAgMTE1MiwgICAtNDIyLAorICAyMDI0LCAgICA3MDQsICAgMjQ2MiwgIC0xMTk3LCAgICAyMzIsICAgLTExOSwgICAgICA0LCAgIC04NzksCisgIDE2MDAsICAgLTcwOCwgICAzNDk2LCAgICAyNzksICAgLTE0MywgIC0xMDk2LCAgIC01NTUsICAgNDU5NCwKKyAgMTQ4NiwgICAgMTYxLCAgICA5NDIsICAgMjAxOCwgICAyNDc0LCAtMTYwMTAsICAgLTM4MCwgICAtMTkzLAorLTExNDE1LCAgICA0NTcsICAgLTI3NiwgLTExMjIwLCAgLTE2MDQsICAgIC0zOCwgICAgODEzLCAgLTQwNDQsCisgIDE4ODgsICAtNDI2NSwgICAxNjQ3LCAgIC04ODIsICAgIDk4MSwgICAtNzM0LCAgIC0xMTAsICAgIDE0MCwKKyAtMzA1MCwgICAxMjQ4LCAgIC01NDksICAtMTE2NywgICAtOTY3LCAgIDM1ODYsICAgIDY4OCwgIC0xMzgwLAorICAgNDI0LCAtMTc5NTksICAgMjAyMiwgICAyMjc0LCAgICAtNDQsICAtMTQwNiwgICAtNDMyLCAgIDEzMzUsCisgIC02NTksICAgOTU1NSwgIC0zNTgxLCAgMTEwNDUsICAgMTg3MCwgICAgODA2LCAgICA1OTksICAtMjA2NSwKKyAgIDE1NiwgIC00NDIwLCAgICAgMTYsICAgMjM0OSwgICAtNjA5LCAgLTMwNTgsICAgLTczOCwgICAgLTYwLAorICAtNTQ4LCAgIC0xMTksICAgIC00OSwgICAgIDI2LCAgIDE1MjgsICAtMTg0MiwgICA2MzA2LCAgMTQwNzgsCisgIC02OTIsICAgNTQ4MCwgICAgMzIxLCAgIDE5OTYsICAgMTM3NiwgIC0zMDg2LCAgICA0OTAsICAgIC01NCwKKyAgMTE1MSwgICAgOTMyLCAgICA0NDUsICAtOTg4NywgIDE1ODA4LCAgIDMwODUsICAgIDg2NiwgIC0yMDIwLAorIC0xNzg1LCAgIDIxMjYsICAgLTkyMCwgICAgNDE0LCAgIC0yOTAsICAgIDEzOCwgICAgMjQ0LCAgICA5OTQsCisgIC03MDIsICAgMTQxMCwgICAgMzMwLCAgICAyMDIsICAgIDY3NSwgICAtMzg5LCAgIC0yNDEsICAzMTMwNiwKKyAgIDM4MCwgICAgMzAwLCAgICAtNTMsICAgIDgwNCwgICAtMTA5LCAgICA0MTMsICAgIC00NCwgICAgICA2LAorICAgIDE0LCAgICA0ODYsICAgLTI5MywgICAtMTEyLCAgICAgMjYsICAxMTYzMiwgICAtODM2LCAgLTM5NDgsCisgIC01MTgsICAtMTM2NCwgIDExMzYwLCAgIDM1NTgsICAgLTU4OCwgIC0yMDg0LCAgICA0OTAsICAgIDM4MSwKKyAgLTk1NSwgICAyMjA3LCAgLTI5NTMsICAgMTExNSwgICAtMjY1LCAgICAgIDIsICAgICA2NSwgICAgNDY0LAorICAtMTgwLCAgIC0xMTEsICAgLTE3NCwgICAtMTUyLCAtMzA1MDgsICAgIDEyMSwgICAtMjA3LCAgIC04MzUsCisgIDExMjYsICAgLTE4NSwgICAgIDkxLCAgICAtOTYsICAgIDIyMiwgICAgLTk5LCAgICAtOTMsIC0xMDEzOCwKKyAgLTQzMCwgICAtMTg0LCAgIC0zNzIsICAgLTE5NCwgICAgOTUzLCAgIC0xMDAsICAgIDM4MiwgIC0xNDIyLAorIDEzOTMxLCAgLTE4MzUsICAtMTY1NywgICAgODIxLCAgICA0MDgsICAgIDgwOCwgICAtNjAxLCAgIC00NjMsCisgIDcxNDIsICAgNTU5NiwgICAzMTcxLCAgIDIxNzQsICAgMjc0MCwgLTExMzUwLCAgIDEwMTksICAgMTQ0OSwKKyAgLTM4NiwgICAxNjQyLCAgIDM3MDMsICAgNDI3MSwgICAxNjY0LCAgIDIyMzIsICAgLTY3NCwgICAgOTgzLAorICAgNTUxLCAgIDg1NDMsICAgIDE1NCwgICAtMzgzLCAgLTI0MTksICAgMTExNywgICAtNTIwLCAtMTA5NjYsCisgLTQ0MDYsICAtMzc0MiwgICAgLTc5LCAgIC05MDksICAgMTgxMywgICA1MDQzLCAgICA0MTIsICAgMTA5OSwKKyAgMTQzNCwgICAgMTczLCAgICA3ODgsICAgIC05MiwgIC0xMDA0LCAgIDEyODgsICAgIC04NywgICAgOTMxLAorIDEwMjQxLCAgIC04NTUsICAgICAgNiwgICAtNDA1LCAgIDI1ODAsICAxMTQ1NSwgICAxMTUwLCAgLTE5MTYsCisgIDM2MTQsICAgLTI2MiwgICAgMjkyLCAgICA4OTcsICAgOTY3MywgICAtMzgxLCAgIDE3MTEsICAtMjcxMywKKyAtMTExMSwgICAgMjgyLCAgLTIxODAsICAtMjI4MiwgIC0yMjY2LCAgIC03MjQsICAgLTg0OSwgLTExNzg3LAorICAgODg4LCAgIDMxMjAsICAtMTQ1OSwgICAgNDk1LCAtMTA4MTIsICAgLTc5MiwgICAtMjc0LCAgIC05ODQsCistMTIyMjMsICAgLTczNywgIC0yMzk0LCAgIC0yOTksICAgLTU3OCwgIC0yNzU4LCAgIDE1MjEsICAgIDc3NCwKKyAgMTkzOCwgICAgODU3LCAgLTE5MzUsICAgIDIxNywgICAgNjU0LCAgIDE0NTIsICAtMzY5NSwgICA2NzM0LAorICAgODA0LCAgICAxMzQsICAgIDk0NiwgIC0yMTU2LCAgIDk0OTUsICAgLTYwMCwgIC0xOTYyLCAgLTUyNTIsCisgIC0yNDYsICAgMTI2OSwgICA4NDkyLCAgIDEyNjEsICAtMjIwNSwgICAtMTA2LCAgLTEzMTQsICAgIDgyOCwKKyAgMTAxMywgLTEyMDU5LCAgICA2NjMsICAgIDQzNiwgIC0yNjQ4LCAgIDk4NjMsICAgLTYzMCwgIC0yOTYxLAorICAzMDA0LCAgIDEwMTUsICAtMzE1MywgIC0xNDc1LCAgICAtMjUsICAgIDM5OSwgICAtODQ2LCAgICA0MzAsCisgLTEyMzcsICAgLTE1NiwgICAtMTg3LCAgIDExMTUsICAgLTUwMiwgICAtMzYzLCAgICAzODYsICAtMjgyMCwKKyAgIDk0MiwgICAtOTI2LCAgICA3MjcsICAgMTEzMCwgLTIwMzg4LCAgIC0yNzQsICAgMTE0MCwgICAgMTk4LAorICAgMTk5LCAgIDI1NDgsICAgIDQ0MiwgICAgMTU3LCAgLTE1NDYsICAgMzY5MywgICAgODkyLCAgICA0NjAsCisgIDY1NTIsICAgNDg1OCwgIC0yNTYwLCAgLTg2NzMsICAgMTkzMCwgIC04OTEzLCAgIDM0MjcsICAgIDY4NiwKKyAgICA2MSwgIC04ODMwLCAgIC0zNTgsICAgMTMzOCwgICAgLTc0LCAgIDExODAsICAgMjg3MSwgIC0zODIyLAorICAgMTA0LCAgIDI0MTQsICAtMTc0MiwgIDExNDI1LCAgLTQ1MjIsICAgIDM5MywgIC0zMDE2LCAgICA5NzIsCisgICAgMzQsICAgIDExNywgLTE2MTEzLCAgLTY5MDAsICAtNjk2NCwgICAxNzI2LCAgIC04NDMsICAgLTI0MiwKKyAtMjE0MSwgICAgODAzLCAgLTEwOTMsICAgIDQ0MiwgICAxNzc2LCAgIDI0MjksICAtMTAwMCwgICAgNDg5LAorICAgMzkzLCAgICA2MzUsICAgIDM4OSwgICAxMTI2LCAgMTIyODUsICAtMTY0OCwgLTExMzk2LCAgLTI4ODUsCisgICAtNTYsICAgMzg0MCwgICAtMTc0LCAgIDMxNzcsICAtMTcwOCwgICAxMTg5LCAgIDE5MTQsICAgMTUxNCwKKyAgLTE4OSwgICAgLTg4LCAgICAyNzYsICAgLTI0MCwgICAtMTIwLCAgLTI5MjksICAgOTgyMywgICAgNjc4LAorICAgNTY4LCAgICAgMjYsICAxMDA4MCwgIC0yNTc1LCAgIC04MDYsICAgIC02NCwgICA2NDA2LCAgICAtODIsCisgLTExNzEsICAgMjE2OSwgIC0xODA0LCAgIC02NjcsICAgIC0zNywgICAgIDU0LCAgIDQyMDgsICAxMDgyOSwKKyAxMTkyMCwgICAtNDY4LCAgIDE5MTYsICAgLTgwOSwgICAtMzcwLCAgICAxNDQsICAgMzYxNiwgICAtMjYzLAorIC00MzUyLCAgIC0xMjQsICAgIDMwMCwgICAtMjQ2LCAgIC00NDAsICAgLTExNSwgICAgNDQ3LCAgIC00MDcsCisgMjA4NjksICAgLTM0MCwgICAgIDU0LCAgIC03NjQsICAgLTgwNywgICAtNjk5LCAgIC0yODMsICAgIDcyNywKKyAgLTkyMiwgICAxMDk4LCAgICA1NzcsICAgICAtNiwgICAtODA5LCAgICAtNTAsICAgLTExNSwgICAgLTc1LAorICAgMjgwLCAgICAxNTYsICAgIDE4MiwgICAgMjI1LCAtMzA0MzIsICAgLTIxMiwgICAtNDE3LCAgIC0yNDUsCisgICAxNzcsICAgICA5NCwgICAgICA0LCAgIC02MjcsICAgIDE2NywgICAgIDQ3LCAgICAxNTIsICAgIDE0OCwKKyAgMTMyNSwgIC0yNDM2LCAtMTAwNjMsICAgLTY5NiwgIC05OTY2LCAgIDEwMzIsICAtMTAyNCwgIC0zNzAyLAorICAzOTMzLCAgICA0MDAsICAgIDMzMywgICAgNjkyLCAgLTM4NTgsICAgMjU5OSwgIC0xMjE1LCAgIC0zODksCisgICAzOTMsICAgLTY2NiwgICAyMTM1LCAgMTAyODAsICAtMjQ0MywgICAxOTcyLCAgICA0MTAsICAgLTM5MiwKKyAgIDU5MCwgIDEyMzIyLCAgIC01MjMsICAgMTE0MSwgICAgIDUyLCAgLTE0NjgsICAgIDgxOSwgICAtMjEzLAorICAgMTYyLCAgICAxMTYsICAgLTYxNCwgLTEwNjMwLCAgIC0yMDQsICAtMTI0NywgICAgNTM1LCAgICAxOTksCisgLTYwNTgsICAgMjUzOCwgICAxNjQ0LCAtMTE1MzksICAtMTU2MiwgICAxNDYyLCAgLTE0OTMsICAgLTIxOCwKKyAgLTI5NiwgICAtNjA1LCAgICAzMjEsICAgIDYwNywgICAtMzY2LCAgIC0yNTcsICAgLTgzNywgICA0NTM2LAorLTExNjgzLCAgIDEyNjYsICAtMzgwNSwgICA0NDk2LCAgIDI4NTQsICAgICAgOCwgIC04ODQ4LCAgICAxMjQsCisgICA2NTYsICAtMTA0MSwgICAgNDExLCAgICAxNDQsICAgIDkxNiwgICAgNDQ1LCAgICAtOTEsICAgLTI2MCwKKyAgLTE0OSwgICAtODgyLCAgIC00MzMsICAgLTEyMSwgICAgMzQ1LCAgICAgNjgsICAgIDM0OSwgICAgODIxLAorICAgNjUyLCAgICAyNTEsIC0yMzA1MywgICAxMDE1LCAgICA3MTIsICAgIC03MywgICA3MDM4LCAgLTE1MjAsCisgIDU4MTAsIC0xMjYwNCwgICAyODQxLCAgICA0MjUsICAgIDI2NSwgICAxNTQ2LCAgICA5MzgsICAgMTg1MSwKKyAtMTE4MCwgICAyNzUxLCAgIC00OTgsICAgMTI4OSwgICAtNzc0LCAgICAzMjcsICAgNDA0NywgIC04MTMyLAorIC0yNjIyLCAgIDU0NDksICAgMzIyMSwgIC0yOTkwLCAgMTAxMDcsICAgMTg4MCwgICAgMTczLCAgLTQwMDYsCisgICAzOTksICAgLTMzMiwgICAgNjQyLCAgICAyOTcsICAtNDUxMywgIC0xMjMwLCAgIC0zMzAsICAgLTc4OCwKKy0yMTg4MSwgICAgOTAzLCAgLTEzMDgsICAgIDU0NywgICAtNTIyLCAgIDE4ODUsICAtMTczMCwgICAgLTYzLAorICAgOTczLCAgICA4OTcsICAgIDY3MCwgICAtNjU3LCAgIC0yMzIsICAgIDQ5OCwgICAgIDkyLCAgICAgLTgsCistMTEwMTAsICAgMTA3MiwgICAtMzY4LCAgLTE4NjQsICAxMTUwNSwgICAzNDk3LCAgICA3MzAsICAgMjE1OCwKKyAtMTYyOSwgIC0xMzUxLCAgLTE1ODMsICAgMjI0NywgIC0xNTA2LCAgIDIxNDQsICAgLTkwMiwgICAgNjM5LAorICAgMTc1LCAgLTYwMDYsICAgLTk4NiwgIC00MjQ2LCAgLTE1MTAsICAgMTc4NSwgIC05NzkyLCAgIC00OTUsCisgIDE5OTUsICAtOTE4OSwgIC0xNDE0LCAgLTI1NTAsICAgMTU3OCwgICAyMzkwLCAgLTI5ODksICAgMTY3MywKKyAtMTk4MCwgICAgIDIxLCAgLTQwNTQsICAgODU1MiwgICAxMTU1LCAgIC0zMDEsICAgMTIwNCwgICAzNzc2LAorICAgMjYyLCAgLTE4MjgsICAtMTgzNywgIC0xMDE0LCAgICAgLTksICAgMjcxMSwgICAxNDY3LCAgICA0NjMsCistMTE2MDUsICAgMTc0MywgICAtOTU2LCAgLTEyMTMsICAtMzg5MiwgICAxNTM0LCAtMTAyOTgsICAgICAyMiwKKyAgLTkwMiwgICAtNjU4LCAgLTE3NTksICAgMjUwNywgICAxNTUyLCAtMTIyOTgsICAtMTA1MCwgICAgNjIzLAorIC0zMjIxLCAgIDE1MjIsICAgIC0zNiwgICAtNDQ2LCAgLTU5MjUsICAgMjE0NCwgIC0yODQ0LCAgMTUwODAsCisgLTE5ODQsICAgMzYzMSwgICAxOTMxLCAgIDE4OTQsICAgMTE5MywgIC0xNjk0LCAgLTMxNzIsICAgLTgxMywKKyAtMTMzNiwgICAgNTM0LCAgIC0zNjUsICAgIDgzMywgICAtMjkzLCAgMjE3NTksICAtMTI2NiwgIC0xMjE2LAorICAgOTk2LCAgICAgLTIsICAgLTM5MywgICAtODU4LCAgICA3NTksICAgIDk2OSwgICAtMjMwLCAgIC0xNTEsCisgICA5NzcsICAgLTg3NCwgICAgMTE5LCAgIC04OTYsICAgIDI2MiwgICAtMTE4LCAgICAgODksICAgICA5NSwKKyAgICA5NCwgICAtNDM3LCAtMzAzNzUsICAgLTQ2MiwgICAgMzYwLCAgIC01ODgsICAgLTMzNCwgICAgIDg2LAorIC0xMDI3LCAgIC0yMDgsICAgIDUzNiwgICAtMTk2LCAgICAzNjcsICAgLTQ2NywgICAgMTE5LCAgICAtMzIsCisgLTI1NDQsICAgNjIwNCwgICA4ODMwLCAgIC0yNjQsICAtNzg0NywgICAgODQ4LCAgIDIyNjcsICAgMzg3NywKKyAtNjM3OCwgIC0yMjQ5LCAgIDE0MjAsICAtMTg2OCwgIC0zNDQzLCAgIDM3NDcsICAgLTU5MCwgICAgIDU4LAorICAtMjc0LCAgLTYwNjUsICAtODQ3MiwgICA1OTA2LCAgIDMxMDksICAgNTgzNCwgICAzOTA1LCAgIDIwODYsCisgIDEzMDAsICAgMzgyOCwgICAtNTE4LCAgIC01MjgsICAtMzY3MiwgICAxNzk0LCAgIDQzNTMsICAgIDQwOCwKKyAgIDU2NiwgIC0yNTc3LCAgLTExMzcsICAgMjc0OSwgIC0yNjYyLCAgIC01MjgsICAtNzQ3OSwgICA1NTUwLAorICAyOTMyLCAgIC0zMzYsICAgMzY4MSwgIC0yMDM0LCAgICAyMTIsICAtODczMywgICAxMDE3LCAgIDIyNTgsCisgIDgyMjUsICAgIDM4NywgICAgMjI3LCAgICA4NzcsICAgMjc1MiwgIC0xMzc1LCAgIDI2MzYsICAgODEzMSwKKyAgMzg1MCwgIC02ODcwLCAgLTExNTgsICAtMzczNiwgIC04NDc4LCAgICAyMjgsICAtNTgwOSwgICAgIDk3LAorIC0yNTU1LCAgLTI5NTYsICAgLTkyOCwgICAgNjc4LCAgICAxMTIsICAgMTQzNCwgIC0xMjUwLCAgIDEyNDAsCisgIC00MTIsICAtNDI2NywgIC0zODExLCAgIDQzMjIsICAtMzQzMCwgICA3NzA1LCAgIDU0NTYsICAtNjg3NiwKKyAtMzQ1MiwgICA3MzI5LCAgIDMxNDIsICAgIDIyMCwgICAgNjYyLCAgIDE1MzEsICAtNTQ5MiwgIC0xMzg4LAorICA2ODQyLCAgLTM2MzEsICAgIDM2MiwgICA1MDI5LCAgIDgwNTIsICAtMjM2NywgIC01MzQ2LCAgIDU3MjQsCisgIC0zNTgsICAgMjQ2OSwgICAyMTk2LCAgLTE0MjYsICAgLTI3MiwgICAgNTM0LCAgIC0xOTIsICAgLTUzMSwKKyAgLTcwNSwgICAgLTcwLCAgIC0yNTksICAgICA5MywgICAgMzM1LCAgICAtOTQsICAgLTE0NSwgICAgLTE3LAorICAgOTIwLCAgIDExODYsICAgLTgxOCwgICAtNTk5LCAgICAzNDMsIC0xOTg1OSwgICAyOTY4LCAgICAxNjEsCisgICAxMjgsICAtNDI4MiwgICAgNTk4LCAgICAxNTIsICAgMTIxMCwgIC0xMzE3LCAgLTE1NDUsICAgLTIyOSwKKyAgIDE4MSwgIC02NDg4LCAgIDU2OTksICAgNzI3MCwgICA2MjcxLCAgIDg4MDksICAgICAyNywgIC00NzcwLAorICAtODA0LCAgIC0xNjgsICAgLTI0NywgICAtNjgwLCAgIC0xMjksICAgLTQ3MCwgICAtMTUyLCAgICA5MTUsCisgICAxNzYsICAgLTkwNCwgICAgNjIyLCAgICAyODAsICAgMjk4NiwgICAxMDM0LCAgLTEwNDYsICAgLTQ4MgorfSwKKworLmNiNDQ0MHMwID0geworLTEyMDg1LCAgIDgxOTIsICAtMTgwMiwgICA0NTg3LCAgIDU5NDcsICAtMzE4MywgIC0yNjI5LCAgIDE4MzcsCisgIDI0MzQsICAgIDI1MiwgICAtNjEyLCAgLTQ2OTcsICAgLTU3NiwgICAgMTUwLCAgIC03MDQsICAgLTY0MCwKKyAgIDE3NCwgICAtMTI2LCAtMTAzMDksICAgIDM1MCwgIC0zMTg3LCAgIDQ3MTQsICAtMjgyOSwgIDEyNjE4LAorIC0yMTcyLCAgIDM1MDIsICAgIDQ2NSwgICAtMTU5LCAgIC02MDEsICAgMTMwNiwgICAxMTc0LCAgIC00NDgsCisgIC0yOTIsICAgLTEzNiwgICAgMjQyLCAgICAgMzEsICAtOTAwNSwgIC02MjAzLCAtMTAwMjcsICAgICAyNSwKKyAgLTIwOSwgICAgLTIwLCAgLTEyOTIsICAtMTI1MiwgICA0MzA0LCAgIDM2ODEsICAgNDQ2MiwgIC00NDAxLAorICA0NDEyLCAgIDEyNDAsICAgLTU3NiwgICAzNjE4LCAgICA1OTUsICAgLTIzNywgICAyNTQ0LCAgLTYwMzIsCisgLTE1MTEsICAgMTUyMywgIC0zNjY4LCAgLTM0NzIsICAgNTU1MiwgIC00OTAxLCAgIC0yNzIsICAgNTk2MywKKyAgMjc0MCwgICAtODc4LCAgMTMwMTAsICAgIDE5MSwgIC0yMDE3LCAgICA3NjgsICAgIDQ1NSwgICAgLTQ1LAorIC02ODczLCAgLTM2NjQsICAgMjYzOSwgICAtOTYxLCAgIDMwNjgsICAtNDI0MiwgICAxMzI3LCAgIDIzNjIsCisgLTE5MDksICAtMTExNCwgICAgMTAwLCAgLTU5NDAsICAgIDIyMCwgICAgODY1LCAtMTI5NTIsICAgIC03NiwKKyAtMTI3OSwgICAtNTkxLCAgIDEwOTIsICAtMzUwMiwgICAgIDg4LCAgLTIxMTgsICAxMzA1MywgLTEwMTQxLAorIC0zMDI0LCAgIC01MzMsICAtMTkyMywgIC00MDk3LCAgICAxMzUsICAgMTY3MiwgIC0xNjYxLCAgIDE2NDYsCisgIC0zNzAsICAgLTM2MSwgICAgNjQ0LCAgIC0xOTcsICAtNjc5NiwgLTEwOTQ4LCAgMTE2OTIsICAgLTk3NCwKKyAgIDQ4OCwgICAgMzQ5LCAgIDM5MzYsICAtMTUwNiwgICAtMTQ5LCAgICA1MTMsICAgMTQwMSwgIC0xNzc2LAorICAtMzkxLCAgIC0yMTAsICAgICA1NywgICAgLTU2LCAgIC0zNDQsICAgMTAxOCwgICA3OTg5LCAgLTQ5NTcsCisgICAxNjcsICAgIDk4NywgICAgLTYwLCAgICAgNjIsICAgMTYyMiwgICAxMjA3LCAgICAtNjksICAgIDMzOCwKKy0xNjEzMywgICAgLTQ2LCAgIDEwMTgsICAtMTQ2MCwgICAtODIxLCAgIC02NDYsICAgMTMxNiwgICAgMTI2LAorIC00NjMxLCAgIC04NDIsICAtMTUwNSwgIDE1ODMzLCAgLTY0MDQsICAtNDUxNCwgICAyOTQ2LCAgIDI5MjMsCisgIDExOTgsICAtMzE0MSwgIC0zMTA5LCAgLTE2MTMsICAgMTg1MywgICAtOTA2LCAgIC00MzYsICAtMTExMCwKKyAgLTI4MiwgICAtMjE0LCAgLTM0MjQsICAtMzE0MSwgIC0zOTg4LCAgICAyODQsICAyMjI2MiwgICAxMjY5LAorICAxNzg3LCAgLTExMTYsICAtMTQyOSwgICAxMDE3LCAgICAzNzEsICAgLTE4NywgICAtODI1LCAgICA1MzQsCisgICAzNTAsICAgMTA4OCwgICAgIDI2LCAgICAxNzYsICAgODkxNCwgICA2NjYyLCAgICA5MzUsICAgMjA3NCwKKyAtNzk4NiwgIC00NzgwLCAgIDIxOTQsICAgMTc5NiwgICAgNjk3LCAgLTQwNDAsICAgMjQ4NiwgICAxNzAwLAorICA5MTUwLCAgICAtMzcsICAtMTU2MCwgICAyNDQ5LCAgIC0xNjIsICAgIDEyOCwgIC03NDY5LCAgLTI2OTAsCisgIC0yODEsICAtNDY5OCwgICAgNDI0LCAgICA1MzUsICAgMTQxNiwgICAgMjQzLCAgIC01NzUsICAtMTE2MCwKKyAgIDMyNiwgIC0yNDE3LCAgICA4MDgsIC0xNTgxNiwgICAgOTk0LCAgIC0zMDIsICAgICAyNiwgICAgODk0LAorIC03Mzc2LCAgICAzOTUsICAgLTU4NiwgICAgODIzLCAgLTEzNDEsICAgIDk3MiwgICAgMTAwLCAgICAyNDEsCisgICA3NDMsICAgIDQ3MCwgICAgMjY3LCAgIC01NTAsICAgIDQ3NCwgICAgMTgyLCAgMTgyNTIsICAgIDE3OCwKKyAgLTE4MiwgICAgIC03LCAgIDM0OTYsICAgMjEzMiwgICAgODYzLCAgIC0xNTEsICAgIDc0MSwgIC0yMTU4LAorICAtNzYzLCAgIC02NTIsICAgLTUwMywgICAtNDM0LCAgIC03MzYsICAgIDc3MCwgICAtMTU2LCAtMTkwNzEsCisgICA0NDMsICAgLTM1NCwgICAtMjQzLCAgICAgNjYsICAgNDI1OCwgICA2NzE0LCAgIDM1NzcsICAxNzMzOCwKKyAgIDU1NiwgIC0zNTcwLCAgIDEyNjksICAtMTQwNiwgICAxNjY4LCAgIC0zNDksICAgIC05MCwgICAgNzgxLAorICAgIDgyLCAgICA1NTgsICAgIDkzNiwgICAtNzg4LCAgLTEwNzIsICAgIC0yMSwgIC02NDcyLCAgLTMwMjIsCisgIC00NzUsICAtNjk5NywgIC0yODE2LCAgLTM3NzQsICAgMTY4MywgLTEzOTUwLCAgIDM0ODIsICAtMTg3MiwKKyAgMjYyNCwgICAxMDY0LCAgIC0zMTgsICAgMTMwMCwgIC0xMjE0LCAgICAxNzksICAgIC0xMSwgICAtMTI0LAorICA0NTYwLCAgLTI4MjcsICAtNjMxNCwgIC01NzM2LCAgIDExNTksICAgMTMwOSwgIC01NDYyLCAtMTE2NTIsCisgIDQxOTIsICAgIDE1MSwgICAtNTQzLCAgLTM0ODQsICAtMjI4OCwgICAtMTE5LCAgICA3NDUsICAgMTM3MywKKyAgLTEyMSwgICAtNjI5LCAgIDUyMDQsICAgNzY1MCwgIC0yMDYyLCAgLTMzNzAsICAtMjg5NCwgICAtMzM4LAorIC0xMzYxLCAgIDEwODAsICAtMzY3NCwgIDEyODUyLCAgLTYxMTksICAtMTU3OCwgICAtNzM2LCAgIC0yNDEsCisgLTE1NjQsICAgLTEwOSwgICAtNDQxLCAgICAzMzUsICAgIDQxNiwgICAxNjc4LCAgIDQ4MDIsICAtMzIzOSwKKyAgNjE4MiwgICAgMTU0LCAgLTM2NTYsICAtMTMzNywgLTE3MDI3LCAgIDE3MDcsICAgLTM4MSwgIC0xNzA0LAorICAtMzc3LCAgIDEwMjIsICAgLTU5MiwgICAgOTgzLCAgIC0zMjEsICAgICAzNywgIC0xODQ2LCAgLTQ1MDAsCisgIDI1NzUsICAxNDE2MiwgICAtNTYwLCAgIDkzODUsICAgNDE3OSwgIC0xMzQwLCAgLTM0NjYsICAgMzIzNSwKKyAgMTcyNywgICAxNTQ1LCAgICAtMjMsICAgIDYzNiwgICAgMjgwLCAgICAtMzksICAgIDg3MSwgICAgMTczLAorIC04OTE1LCAgLTI0MjcsICAgMjE0NiwgIC0zNjk4LCAtMTIxNTMsICAtMzc3MywgIC0zODczLCAgIDUwNDIsCisgICAxMTIsICAgIDc4OCwgIC0xMTM5LCAgICAyNDUsICAgIDU0NiwgICAgMjc4LCAgICAgLTgsICAtMTAwNSwKKyAgIDQ0MywgICAgLTc2LCAgLTEyNTYsICAgODI1NSwgICAzODQxLCAgIDYxMTYsICAgNDIyNiwgICAzNzA1LAorIC0xMjc4LCAgLTY0NzAsICAgNTIyMCwgICA1ODkyLCAgLTM0NjgsICAgMjczNiwgICA1NDI3LCAgLTMzMzYsCisgIC0yNjQsICAgMTkwNiwgICAgMjk0LCAgICAtNjAsICAtNzA3OCwgICA3Njk5LCAgLTk3OTIsICAtNzEwOCwKKyAtMjAzMCwgICAxMDU1LCAgLTY5NjIsICAgIDcwMiwgIC0yMDc0LCAgIC0yMzIsICAgIDEyNywgICAtNDMwLAorICAgNjU4LCAgIC0yNzIsICAgIDc1NywgICAgMTM4LCAgICAxNTksICAgLTM0MCwgIC00NjA2LCAgIDEwMjEsCisgICAxNDYsICAtNzY5MCwgICA2MDAxLCAgIDU2NjAsICAgMzM2MywgICAtMzY3LCAgMTMyMjIsICAgLTQ0MSwKKyAgICAxMywgICAtODc0LCAgICA2NjgsICAgMjI5MywgICAgODc1LCAgIDEyMzgsICAgIDExMCwgICAgNzc4LAorICAxNDM0LCAgIC05NzYsICAgMjE1MSwgIC04MTY5LCAgIDE0MjEsICAgMjYyMiwgICAgMjA2LCAgIC03OTUsCisgIC04MTYsIC0xNDQ0MywgIC0xNTgzLCAgIDMzNTYsICAgMjk3MSwgICAtOTY0LCAgIC0zMjEsICAgLTg0MSwKKyAgLTQwNCwgICAgMTExLCAgLTU1OTUsICAgNDI0OCwgIC0zODE5LCAgICAyMTQsICAtMjUyMCwgICAtNzEyLAorIC0xNTA1LCAgICA4NDksICAgIDk0NywgICAtODc2LCAgICAxODgsICAgMzIyMSwgICAgODYzLCAgICAxMDUsCistMTczMzYsICAgMTgxOCwgICAgIDE0LCAgICAgMTcsICAtNjM0OSwgICAgMzc5LCAgIDQ3NDYsIC0xMjQwNSwKKyAgLTU2MCwgIC0zNDQ4LCAgIDM2NjQsICAgODI1MSwgICAgODQ1LCAgICAzODMsICAgMTM0OCwgICAtNzM5LAorICAtNzgwLCAgIDE2OTUsICAgNDgyOCwgICAtMTIzLCAgIC02NDcsICAgIDgyMywgICA5OTQwLCAgIC0xODMsCisgLTE4MDQsICAtNzExMiwgICAtMTYxLCAgICA1NzgsICAgLTYxOSwgIDExNTM0LCAgIDMyMTQsICAgMTU4NiwKKyAgNDc4NCwgIC0yNTQwLCAgIDExODgsICAgLTMwNCwgICAtNDg1LCAgIC02NDgsICAgLTgyNCwgICAtNTk1LAorIC04ODE3LCAgIDQxMzgsICAgIDkyNywgIC0zMjU5LCAgIC0xOTgsICAgNDAyMiwgICAyMjEzLCAgLTE2MjcsCisgICA2NDUsICAxNDYwMiwgIC0xMDU4LCAgIDE0ODEsICAtMTY3MCwgICAtMTEzLCAgICA1NjQsICAgLTcxMCwKKyAgLTQ1MSwgICAtMzYwLCAgLTEyNjEsICAgMjUwNCwgICAgMjQ3LCAgIDU1NjYsICAtNzI2MiwgICAxMzQ0LAorIC01MTA2LCAgLTE2MDgsICAgMTk0NiwgIC00MjQwLCAgLTczOTMsICAxMDQ0MCwgICAzMzA2LCAgIDE5NDAsCisgIC05OTksICAgIDE1NSwgICAgODMyLCAgICAgNTUsICAxMDIxOCwgIDExNDc1LCAgLTMyNTIsICAtODI5NSwKKyAgMTM0NywgICAyNDA1LCAgIDM0MjEsICAtMjYxOSwgICAyMjYyLCAgLTI4MjksICAgIDc1NCwgICAtMzA3LAorICAgNTQ4LCAgLTIwNDAsICAtMTEzMCwgICAgMzE3LCAgICAxNzAsICAgIDI5MiwgICAgMjQ4LCAgIDI2MDEsCistMTg5MzAsICAtMTk0MiwgICAxNDE3LCAgIDE2NzgsICAgMzMxMCwgIC0yNTc4LCAgLTE5NjksICAgMTU1MCwKKyAgMzAxMCwgICAgIDcwLCAgICAgIDgsICAgMzA2NCwgICAtODQ4LCAgICA1MDQsICAgLTE3MiwgICAgMTgwLAorICAxNzg3LCAgLTExMzMsICAgMjQyNywgICAxMDAyLCAgIC02NjQsICAgIC00MCwgICAgMTkyLCAtMjM0MDAsCisgLTEwMDQsICAgIDUxMywgICAtODE4LCAgIC0zODIsICAgIDM2MCwgICAgMzYwLCAgICAyNjgsICAgICA5OCwKKyAgLTIwMiwgICAtMTkyLCAgIC02NjgsIC0xMjkyNCwgLTExNzAyLCAgIDczMjUsICAgIDc5NywgICAxOTM3LAorICAgNjc0LCAgLTI0NTgsICAgLTU0MSwgIC0xNDk3LCAgLTE2NzMsICAgLTk1NSwgICAtMzU2LCAgIC00ODYsCisgICAxODIsICAgIDI5OSwgICAgLTQ2LCAgICAgNjUsICAtNDIzMiwgICAxNDE4LCAgIDY1MzIsICAgMjM1NiwKKyAtNDg5NCwgICA0ODcwLCAgIDMzNjksICAtNDU4NSwgICA4NzQzLCAgIDE0OTcsICAtMTQ1MSwgICAgODYyLAorIC04NjEyLCAgLTE3MTgsICAgMTcxNiwgIC0yMzg5LCAgICAzNzEsICAgIDU5MiwgICA3Mzk3LCAgLTMxODgsCisgIC02NDksICAgIDEyNiwgIC0xMzAwLCAgIDEzNzQsICAtMTI5MiwgICAgNjQ1LCAgLTE0OTQsICAgMjczNiwKKyAtMTQ2OCwgIC0xODA4LCAtMTcyMjMsICAgLTM1MiwgICAgMTExLCAgIC0yMjIsICAgLTIzNiwgICAgMTcxLAorICAtMTk4LCAgLTc5OTQsICAtMzgyMiwgICA1MzI0LCAtMTY4NTYsICAgLTUxNywgICAgMTE5LCAgICAzMTQsCisgIC0zNjAsICAgLTUxNSwgICAgNDM1LCAgICA1MjAsICAgLTYzOCwgICAxNjM1LCAgICA0MjAsICAgMTE5MSwKKyAgIDgzMCwgICAgNzEwLCAgIDY4OTcsICAgMjkyNSwgICAzMDkxLCAgICA1MTAsICAgMzI2OCwgIC0xNzAyLAorLTE2MTg2LCAgICA3MTgsICAtMzEyNywgICAtNDYzLCAgICA3NjMsICAtMTAzNSwgICAgNzI1LCAgIC0xMjIsCisgICA2NDYsICAgIDE3MiwgICAtMTY0LCAgIC0yNzcsICAgNTg1MywgIC03MDc0LCAgICAtMTAsICAtMTc3MCwKKyAtMjU0NCwgICA1OTc4LCAgIC04NzQsICAgLTQ5NCwgICAtMjMyLCAgMTQ0NjUsICAgMTgxNSwgIC0xOTAyLAorICAgOTg3LCAgLTE1MzMsICAgMTIxNiwgICAgNzQxLCAgICA2MjAsICAgIDE2MSwgICA0NDE0LCAgIDQxODQsCisgICAtMzIsICAtMjk0NCwgIC00NjE5LCAgIC00NjIsICAxNTcwMSwgIC0xMDI2LCAgIC0xNDAsICAtMjM5NiwKKyAtMTc0NywgICAtNTM4LCAgLTEwMjQsICAgIDIxOSwgICAgODU0LCAgIC0zNTEsICAgIDg2MCwgICAtMjI2LAorIC00MzkwLCAgICA3MzIsICAtMjAwMywgIC0yNDMwLCAgIC01NDAsICAgIDU5MiwgICAxNjIyLCAgIDExODAsCisgICAzODUsICAtMjA1MiwgICA0MDUwLCAgMTc0MDEsICAgLTY1MCwgICAtMjQzLCAgIDE3MDksICAgMTI2MSwKKyAgICA5NSwgICAtMzA3LCAgLTUxMTAsICAgLTY2NiwgIC03MDk0LCAgIC01MzMsICAtMTI5MywgLTE3MzU3LAorICAyOTI5LCAgIDIzODksICAgLTExOSwgICAtNDEzLCAgICAzMTcsICAgLTk2MiwgICAgNzA5LCAgLTE1NTIsCisgICAgMjYsICAgIDE3NSwgICAgNzAwLCAgIC01NzAsICAyMDEyMCwgICAxMTA3LCAgICAyMzIsICAgIDE2OSwKKyAgLTg4OSwgICAtNTMzLCAgLTEyNzYsICAgICAyMiwgICAgOTU5LCAgICA4NjYsICAgLTk1NCwgICAtNzkyLAorICAgODczLCAgIC0xNzIsICAgMTc1NywgICAgMTk1LCAgICAxNDgsICAgIDQyMywgICA0NDkwLCAgIDg3ODIsCisgICA2MzEsICAgIDY4MiwgICAxODMyLCAgLTM3MjgsICAtMTc0MiwgLTExMTMwLCAgLTEyMDEsICAgMTc3NiwKKyAgOTI2OCwgICAtNTg2LCAgLTEzNTgsICAgLTY0NiwgICAgNjI2LCAgIC04NjYsICAgICAgNSwgICAgMjYzLAorICAzOTUwLCAgIC03NjAsICAtMjkxNCwgLTEyNzUxLCAtMTI2NjksICAgMTUxMywgICAgIC00LCAgICA2MzEsCisgIDE4MzUsICAgIDMxMiwgICAtMTY3LCAgIDE1NDYsICAgLTUzMiwgICAgNjE5LCAgIDExNzYsICAgMTQzNiwKKyAgLTExNiwgICAgMzEyLCAgIDcwNTQsICAgMzEyMCwgICA0MDc1LCAgLTEzMjAsICAgIDcxNSwgICAtMjA2LAorIC0xNTcyLCAgIDEzNTAsICAxNzY4OCwgIC0xMTgyLCAgLTE1NjgsICAgIDY4MCwgICAgICA2LCAgICAyMDcsCisgIDEwMTAsICAgIDYwMCwgICAtNzY2LCAgICA1NTQsICAtMTQ4MywgICAgNjQ0LCAgLTg4MTAsICAgIDYyNCwKKyAgIDE0OCwgIC00MDE1LCAgLTE1MzYsICAtMTg2MywgICAgIDkyLCAgICA3MzAsIC0xNDgwNiwgICAgMzg2LAorIC01MTc0LCAgLTE0MjAsICAgLTMzMSwgICAtMjU0LCAgIC0xMDQsICAgIDI3NSwgIC03MjY4LCAgIDI1NjMsCisgMTE5ODMsICAgIC02NSwgICA4MDQzLCAgLTE2MjMsICAtMjU4OSwgIC0yNjEwLCAgIDEzMjgsICAgMzE1NCwKKyAgMTkzNSwgICAzNjcyLCAgLTE3NjEsICAgNDk4NCwgICAgNjYxLCAgICAyMDksICAtMTAzOCwgICAgMTIyLAorIC0xMDE5LCAtMjg5NDgsICAgICA1NSwgICAgMzU4LCAgIC01MzksICAgIDQ4OCwgICAgIDU1LCAgICA2MTgsCisgICAgMjAsICAgLTMxNCwgICAgNDQ2LCAgLTEwMTYsICAgIDYxOCwgICAgLTkzLCAgICAtOTQsICAgLTMzMSwKKyAgIC0zNiwgICAgMTk0LCAgLTE3MDYsICAgNjYyOCwgICAgMzk2LCAgIC0xNDYsICAgLTc2NSwgIDEwNTAwLAorICAyNjE5LCAgICAtODIsIC0xMDg5NCwgIC0zOTA4LCAgIC04ODgsICAgLTE5MiwgICAgNjIwLCAgICAxNjMsCisgICAgNzgsICAgIDc3NCwgICAtMjkzLCAgIC0xMDQsICAtNDgyNiwgLTE0MDY2LCAgLTE4ODMsICAtMzI1OCwKKyAtNDU3NywgIC0xNDg0LCAgIDU0MTIsICAtNDI3NCwgIC00OTUxLCAgIDMzMTYsICAgLTkwNywgICAxOTQ4LAorIC0xMTg3LCAgIC00MDQsICAgMzY1NCwgICAgNDAwLCAgICAtNzAsICAgIDQ1OSwgIC0zMjI0LCAgLTMxOTQsCisgIDIzMzgsICAgNDM5MCwgICAgIC01LCAgLTMxNjcsICAgMzI3MywgICAgMTE2LCAgLTEwMjYsICAtMTY2OCwKKyAgMzc2NywgICAgMjcyLCAtMTY2NjIsICAgIDEzNywgIC0xNjM0LCAgLTEwMDcsICAgIDIyMCwgICAtMzEwLAorICAgOTgyLCAgIDgyMjAsICAgIC0xNiwgIC0xMjUxLCAgLTI2NDQsICAtMzM0NCwgICAyMjM2LCAgLTE1NzMsCisgIDgxNzQsICAgIDYxMiwgICAxMTQyLCAtMTA3OTksICAgIDM5MywgICAtNzA3LCAgIDQ4MDQsICAgIDM5NywKKyAgMTIzMiwgICAtMjkyLCAgIDU3NjIsIC0xNTYwOCwgICAyOTIxLCAgLTY0NDAsICAgMzU0NCwgIC0yMzk1LAorICAtNTA0LCAgIDE4OTAsICAgIDE3MiwgIC0xMDEwLCAgICAxNzgsICAgIDM4MCwgIC0xMTYzLCAgICA0MDQsCisgLTEyMzAsICAgMTAzNCwgICAtNTk2LCAgICAxMDUsICAtMjAzOCwgICAxOTkxLCAgIDU2MTMsICAgLTMxMiwKKyAtNDE1NiwgLTEwMjA1LCAgIDMwOTIsICAtNDcwNCwgIC02MTAxLCAgLTE2MjAsICAtMTAzNywgIC0xMTMwLAorICAxNTkwLCAgIDgzMjEsICAgLTc5NywgICAgMjQ3LCAgICA5NTQsICAgLTEwMywgICAzODM4LCAgIDIzMzAsCisgMTAwNjQsICAgMzE5NywgIC04NTA4LCAgIDEzMDAsICAtMTAxMiwgIC02NjA3LCAgLTM4NjEsICAgNTY1MSwKKyAgICAzMSwgICAtNDc1LCAgIDE1ODIsICAtMTM3MCwgICAxMTA3LCAgIDIxNjQsICAgIDc0MywgICAtNTY3LAorICA0ODQyLCAgLTI5MzAsICAgMzE5MSwgICAtMTkwLCAgLTIyMzAsICAgIC00NywgICAgMjU0LCAgIDIxNDcsCisgICA1OTEsICAgLTUxMiwgICAxMzEyLCAgIDExNTksICAgIDgxMSwgICAxNDQ0LCAgLTEzMTIsICAgLTI1NywKKyAxNjAxNiwgICAgNzg5LCAgLTI1NjIsICAgMzk4MywgICAtMzczLCAgLTkyNTUsICAgIDMwMiwgIC0zNjU1LAorICA1NzUwLCAgLTM4NTYsICAtNjk0MSwgICAzOTM0LCAgLTIzMTQsICAgNTU1NiwgIC00MDk5LCAgIC0yNjUsCisgIC00NzksICAtNDg0MywgICAtMTMwLCAgICAgMjAsICAtNDg1OSwgICAzMDgzLCAgIDY0ODIsICAtMzczOCwKKyAtMzkzNiwgICAgNTkwLCAgLTYzNjgsICAtMTc4NCwgICAgIDc1LCAgLTM5MDMsICAtNjgzNCwgIC00NDUyLAorICAtODcxLCAgICA3NjQsICAtMTExOCwgICA4NzMxLCAgICAgMzgsICAgLTE0OCwgIC0zMzY4LCAgLTYzMzAsCisgIC0zNzAsICAgMjIzNCwgICAgOTA3LCAgLTI4MDksICAtMTQ1OCwgIC0yMzA2LCAgIC00MDIsICAgMjY3OSwKKyAtMTIyMiwgICAxMTM4LCAgICAxOTIsICAtMTMxNywgICAxMDEyLCAgMTU1MTQsICAgIDYyNCwgICAgMjc5LAorIC00MDMyLCAgIDI1NjUsICAgNjE2MiwgICAtOTM4LCAgIDU3NjAsICAgMTY4NSwgICA0MzUwLCAgIDI5MzksCisgIC04MjUsICAgLTMzMSwgICAxODQwLCAgIC01NTYsICAgIDQyNywgIC00NjQyLCAgICAtMjMsICAgODM0NiwKKyAgNzU3NywgICAtNDY3LCAgIDM4NDgsICAgIDQ1NCwgIC0zOTYyLCAgICAzNzMsICAgLTExNiwgICAyMzE0LAorICA0ODY4LCAgIC0yMDgsICAtMTM2NywgIC0xODAzLCAgIDI2ODEsICAgIDgwNiwgIC00Mjc5LCAgIDMzNDgsCisgIC01MjgsICAxNDAyNywgICAtMjM4LCAgIC00NTcsICAtMjc2NCwgICAgODMyLCAgLTQ2ODAsICAgNDM1NCwKKyAgMTIxOSwgICAtODAxLCAgIDI0MTQsICAtNTIwNCwgIC0zNzY4LCAgLTY1MjQsICAgNTE2MywgLTEwOTA5LAorICAxNjU2LCAgICAzMjEsICAgMzI2MCwgIC0xNzczLCAgICAyMTQsICAgLTEzNSwgIC00NTYzLCAgIDUyMDYsCisgLTQ3OTQsICAgMTQ4NiwgICAgNDA2LCAgLTEwMjYsICAgIDI4MSwgICAxNzk5LCAgIC0yMTgsICAgIDMyMCwKKyAgLTkwOCwgICAgODcyLCAgIDEwNTYsICAgMjk1NSwgICAtMjA4LCAgIC03OTksICAxNTQ5MiwgICAgMzM0Cit9LAorCisuY2I0NDQwczEgPSB7CisgMjc0OTgsICAgLTQxNCwgICAtMjY2LCAgICA2NDYsICAgIDIyOSwgICAgIDk0LCAgICAtMTUsICAgIDMwMiwKKyAgLTQ4OSwgICAtNDAxLCAgICAxMjUsICAgIDc1MiwgICAtNDc2LCAgIC0yMDAsICAgLTk3NiwgICAgMTk1LAorICAgICA0LCAgIC00MDIsICAgMjIyMCwgICAxMDEyLCAgIDE3MzEsICAgMjUzMCwgICAtNjUyLCAtMjEzODAsCisgIC02NzksICAgLTg2NywgICAtMTk1LCAgIC0xMTQsICAgMTMyNiwgICAyNTMxLCAgIC0zNDgsICAgLTE4NSwKKyAgLTExNCwgICAgMTc4LCAgIC02OTQsICAgLTI5OCwgICA4NzUyLCAgIDE3MzUsICAgMjY0MCwgIC0yMzc0LAorICA2MTkxLCAgIDE1MTYsICAgNTc3MSwgICA2NzA1LCAgIC0yNTMsICAtODUwMiwgICAgOTg2LCAgIDIxMzQsCisgLTE4NTQsICAgMzQ5MCwgICAtNjc4LCAgICAtNDgsICAgIDEzMywgICAgODQ0LCAgLTE2MzUsICAgMTYzMCwKKyAgNjA1NiwgICAtNzU2LCAgLTExMDksICAgMTU2MywgIC0xNDQ1LCAgIC0xMzksICAgIDU4MCwgIC0xNDQ4LAorLTE4Njc1LCAgICA4NDYsICAgLTM5MCwgICAtMjU5LCAgIDE1NDgsICAgLTMyNCwgICAgMjgxLCAgICAxNDIsCisgIDE3OTIsICAgMTIxMSwgICAxMzI4LCAgLTQzMDgsICAtMTAzMiwgIC01NDEyLCAgIDQ3NDIsICAgLTIwMSwKKyAgIC00NywgICAtMjk3LCAgLTg0MDMsICAgOTcxNSwgICA3MjY4LCAgLTM3NTYsICAgMTU3MywgICAgNjc3LAorICAgLTg4LCAgIC0xNDUsICAgNDg3NywgIDEyOTQ2LCAgIDMyNjQsICAgMTgwOSwgICA3MjMwLCAgLTI1ODMsCisgIDE2MjcsICAtMTc4NiwgIC03MTEzLCAgLTE0ODAsICAtMjExMSwgICAtNTA4LCAgICA0MTUsICAgMTY2NCwKKyAgLTQ4MywgICAtNTM4LCAgIC0yNDksICAgICA4MCwgICA3MDA1LCAgLTI1NjIsICAgLTg4NywgICAzODAxLAorICA2NDExLCAgIDIyMjIsICAgICAzNiwgICAgODc1LCAgLTUwODksICAxMDg5NywgICA0MDE0LCAgIDQ5NDgsCisgLTE1ODAsICAgMTQyNSwgIC0xODE0LCAgIC0zOTEsICAgIC05NiwgICAgMzIyLCAgLTY0ODQsICAgMTg5NiwKKyAtNzc5MCwgICAtOTUwLCAgLTQyMzUsICAtODM2MiwgICAzMTE4LCAgIDQ4NDMsICAgMzc1NCwgICAxMDcwLAorIC0xNjQ4LCAgIDc2OTIsICAtMTY3NSwgICAzNDA1LCAgICA5MTgsICAgMjI3MCwgICAgNTczLCAgICAxOTMsCisgIDYwMjQsICAgODkxMiwgIC00OTA1LCAgLTE4MTAsICAgIDk4NSwgICAxODc3LCAgIDIxNTgsICAtMjE1MCwKKyAgLTM4NiwgICAzOTA4LCAgIDIwMzAsICAgIDQxOSwgLTEyNTk5LCAgIC01NzAsICAgLTE1MCwgICAxNTgwLAorICAgIDM2LCAgIC0xNTIsICAgICAgMiwgICAtNTM4LCAgLTE1NjUsICAgNjgwOSwgICAtNzE1LCAgLTYyNjYsCistMTI3MjUsICAtNjcxOCwgICAgODEwLCAgIC02MDMsICAgMTU0NywgICAxMDAxLCAgIDIyNTAsICAgIDgxMCwKKyAgMTc3MywgICAtNjcyLCAgICAzMjcsICAgIDI0NiwgICA2NDE0LCAgLTc1MTEsICAgIDkxNiwgICAtMzI3LAorICAgODMwLCAgMTE4NjIsICAgNDM3MywgICAxMDAzLCAgIDYzNzAsICAtMTczMCwgIC0yMTI3LCAgICA2MTMsCisgIDE2MjcsICAgIDYyNiwgICAgNzYzLCAgIC04NjQsICAgIDIwNywgICAtMjMzLCAgIDM3MzgsICAtODY0NCwKKyAtMTYzNCwgIC0yMDUwLCAgIDM5MDYsICAgLTQ1MSwgIDEyOTg2LCAgLTQ4MjgsICAtMjk3MywgIC00NzE0LAorICAgNTQ1LCAgICA4MjIsICAgIDczNSwgIC0zNTM5LCAgIC0yNTYsICAgICA2NSwgICAgLTkzLCAgICAtOTQsCisgIDI5MjMsICAgNzA3NSwgIC0zNzYzLCAgIDYxNzIsICAtOTU0NCwgIC0yNjc1LCAgLTM4MzMsICAgIDkzMCwKKyAgIDQxOCwgIC00NDk2LCAgIDM3OTAsICAgIDM4NiwgIC03Nzk3LCAgICAyMzQsICAgLTYwOSwgICAtMjU5LAorICAgNDU0LCAgICAzMzAsICAgMTU0NiwgIC03NjM0LCAgLTE5NjYsICAgIDUxNSwgIC0yNDk2LCAgICAzNzQsCisgIDI2MzMsICAtMzAxNCwgICA0MTI2LCAgIDk5MjAsICAtNzEwMywgICAxNDQxLCAgIC0xNTAsICAgNzY5NSwKKyAgIDY3MCwgICAgLTQ4LCAgICAtNDEsICAgLTUxMiwgIC02ODQ5LCAgLTE3ODUsICAgMzc1NSwgICAxODYwLAorICAyNDE4LCAgLTIzNDYsICAtMTE5NCwgIC0xNTc0LCAgMTU1MTAsICAgIDQ0NCwgIC0xNTE1LCAgICA1ODUsCisgICA3NDIsICAgLTE5OSwgIC0xMTE1LCAgIC0xMjIsICAgIC0xMSwgICAgMTQwLCAgLTc3NjMsICAgMTQzOCwKKyAgLTMxNywgICAtNDQ0LCAtMTcxNDksICAgIC0yNCwgICAyNjg1LCAgIC04NTYsICAtMzE2NiwgICAxMTA5LAorICAgMzA4LCAgICAyMzMsICAgICAzMCwgICAgIDYzLCAgICA1MzAsICAgIDY0NSwgICAgIDg0LCAgICAxMzMsCisgIDYxMzksICAtMTE4MywgLTEwNjczLCAtMTI3OTAsICAgLTExMiwgIC0xNTQ0LCAgIDQ2MjMsICAgIDU3NiwKKyAgLTgwNCwgICAxMDIzLCAgLTE2NDYsICAgMTE5MiwgICAgMjY5LCAgIDI2ODEsICAgICA0NCwgICAtOTA5LAorICAgLTE0LCAgIC00MTQsICAgICA0OCwgIC00MDAyLCAgIDQ3NjgsICAgMzQ0MCwgICAzMjUyLCAgIDE0NDEsCisgICAxMDEsICAgIDM3MiwgICAzMTY2LCAgLTEzOTgsICAgIDMyNSwgIDE2MTg0LCAgIC03MTEsICAgIDQ4NiwKKyAgMTMyOCwgICAgMTE0LCAgIC00NTAsICAgIC0zMSwgICAxMTUyLCAgIDIxNTQsICAgIC02OSwgICAtMjUyLAorICAgIDMyLCAgICA5MjIsICAgIDIxOSwgIC0yMDU1LCAgICA0MjEsICAtMTM3NywgICAxMDA2LCAgIC02MTQsCisgICAyMzQsICAgIC00MCwgICAgLTg0LCAgICAyMDQsICAyNzE3MSwgICAgMTgyLCAgIDEwMzQsICAgMTUzNiwKKyAgIDgzNCwgIC04MDM4LCAgIDEyNDMsICAtMzA3NCwgIC03ODI5LCAgMTExNjUsICAtMTg1NCwgIC0xMTczLAorICAtODcxLCAgIDQxMDUsICAgMzU4OCwgIC0zMTkxLCAgICAxODgsICAtMjEwMiwgICAgMTI0LCAgIC0xNjYsCisgIDgwNzAsIC0xMTA2NiwgICA2NjMyLCAgIDI3MzksICAtNzc4NywgICAgMTg0LCAgLTU4NzIsICAgMTM2MCwKKyAtMTA4OSwgICAxMjczLCAgICAgODQsICAtMTY4MywgIC0xNTg0LCAgICA5NzUsICAgLTIwNiwgICAxMTYwLAorICAgMTgwLCAgICAgMTIsICAtNjEyMSwgICA1NDM2LCAtMTQ3MjYsICAgNTk0OSwgIC02NzU2LCAgICA4MzQsCisgIDE3NTAsICAtMzE0MiwgICAtODc4LCAgICAgIDcsICAgLTIyMCwgIC0xOTMzLCAgIC0xNDEsICAgIDE2MCwKKyAgICAyNiwgICAgNzU2LCAgIC04MDAsICAgICAgNiwgIC04MTA0LCAgLTY5ODksICAgMzM1MywgIC0zNTE4LAorICA0NTEwLCAtMTI0MzAsICAgIDczNiwgIC0yNjg1LCAgLTEwNDIsICAgICAzMiwgICAxMTg0LCAgIC01MTksCisgIC0zMTIsICAtMTA3MywgICAtNDAyLCAgICAgNzEsICAgLTQyMiwgICAgLTM1LCAgIDE3OTEsICAxMjczNSwKKyAtMjI4MSwgICAyNjIzLCAgLTE1MDIsICAtMzg3OCwgICA2NzI3LCAgMTA1NDEsICAtMTExMCwgICAyMzA4LAorICAgODcwLCAgIDExMjQsICAgIDg3NCwgIC0xNDA2LCAgICAxMjMsICAgIDI1NCwgICAgNDA1LCAgICAzMjgsCisgIDM4MjgsICAtNzU0MSwgICAzMDk2LCAtMTQxNDUsICAgLTY3MiwgIC0xNzI1LCAgIC00MjMsICAtMTkxOCwKKyAgNDE2NCwgICAtNDExLCAgIDMwOTQsICAgLTU2OCwgICAzNTc1LCAgLTI4OTUsICAgLTM3OCwgIC0zMDY1LAorICAtMjMyLCAgICA0NDksICAgODExMCwgICAyMjY0LCAgLTEzODMsICAgLTU1NywgLTEwNjgzLCAgLTc2MjgsCisgIDQxNTUsICAgIDc1NCwgICAtMTM0LCAgIDY3NTksICAgMTA1MSwgIC0yMDU0LCAgIC05MDAsICAgLTk0OCwKKyAgIDU3OSwgIC0xMjc3LCAgICAxNTEsICAgIDQ2MiwgIDExNTYyLCAgIC0zMTAsICAtODI2MCwgIDEwMjM4LAorIC0xMzA5LCAgLTMwNTIsICAgIDM0NSwgICAtNjg5LCAgLTExMzMsICAgLTU4OCwgICAgNTQ4LCAgICA5ODAsCisgLTEzMzIsICAgIDg4MSwgICAgMzY4LCAgICA3NzYsICAgLTcwNCwgICAgNDIyLCAgMTI0MzMsICAgMTMxNCwKKyAtMTQ4NywgIC00NzUzLCAgIDI2NzksICAgMzA5MiwgICAtOTM5LCAgICAxMzYsICAgLTU4NiwgICAzNTA0LAorIC0xMDM0LCAgLTYzMTgsICAgMzUwNiwgICAgNDIwLCAgIDIzMjYsICAgMTAzNCwgICAtMjUyLCAgIC0zOTgsCisgLTYyMzIsICAgNDQ4OCwgIC02MTY2LCAgLTE3NTQsICAgIDkwOCwgICA0ODg0LCAgLTUxODgsICAtMjk4NSwKKyAxMDc5MywgICAtMTE2LCAgIDQ2NzQsICAgMzk4MCwgICAgIC05LCAgICA4MDUsICAgMTU2OCwgIC0xNjIwLAorICAgLTg4LCAgIC0xNDYsICAgMzAyNywgLTE2MTU0LCAgIDI4OTksICAgNzgzOSwgICA1OTEyLCAgIC00MjcsCisgICAyNzAsICAtMTQ2NywgICAtMzg3LCAgIC0zNTEsICAgIDYxNSwgICAtMzIyLCAgICAgLTIsICAtMTA2MSwKKyAgLTY1NCwgICAgIDU2LCAgIC00MzgsICAgIDEzMiwgICAyMzg4LCAgICA0NjAsICAgMjE3MiwgICAxODc0LAorIC0zMDI4LCAgIDMzMDIsICAgMjAzNSwgICAtNzA0LCAgLTEyMjIsIC0xOTgzNSwgICAtNDcyLCAgLTE4NTgsCisgLTE2ODYsICAgLTI4NiwgICAgICA1LCAgIC03NDgsICAgIDQ5MSwgICAtMzUwLCAgLTQzNDQsICAgIDEwMywKKyAgMTQ3MywgICAyNDQwLCAgMTM1NzUsICAtMTM1MCwgICAxNDU2LCAgMTAzNzcsICAgMTk2MiwgICAzMDM2LAorIC0xMjM4LCAgIDE1ODAsICAgIDYwNywgICAxMzUyLCAgICA5OTcsICAgMTIxMiwgICAtNDg5LCAgICAyNTEsCisgIDQwNzUsICAtMzQ1NywgICA2MTg2LCAgICA3ODYsICAgIDMwMCwgIC0yNTMyLCAgIC0zNzMsICAtMjUyMiwKKyAgMzEwOCwgICAtMjk0LCAgIDQ5MzgsICAtMjk4MCwgICAxNTA5LCAgMTI0NTAsICAgLTY5NSwgIC0xMTI4LAorICAgLTk2LCAgICAzNTQsICAtMzY3OCwgICA4NDk0LCAgIDI0ODAsICAgMjI2NCwgICA1MTYyLCAgMTE5MDcsCisgIDQ3MjEsICAgMTExMSwgICAgNzUyLCAgIDI5OTksICAgMzkyNCwgIC0xNDI5LCAgICAzMjEsICAgIDI3NiwKKyAgIDMwOSwgICAtNjAzLCAgICA2MDEsICAgIC02MiwgICAzMzM3LCAgLTM1NzAsICAgMzI3MywgICA2NjE4LAorIC0yMDAxLCAgICA5NTAsICAgIDUzMiwgICAgOTcyLCAgIDE2MTksICAgIDk1NiwgICAgIDY1LCAgIC02MDksCisgIC0yODEsIC0xNDc2OSwgICAtNDM4LCAgICA1ODAsICAgIDIzMCwgICAtMjI4LCAtMTAxMDgsICAxMjI4OSwKKyAgODkwNCwgICAgODcyLCAgLTMyOTYsICAgMTUzNSwgICAtMzg0LCAgICA0NzcsICAgLTkxMywgICAtNzc3LAorICAgNTQ2LCAgICA0NDUsICAtMTAwNCwgICAtNDM1LCAgIC03MTYsICAgLTEzOCwgICAgNTcyLCAgICA0MzUsCisgIDQ2MjYsICAgLTg2NCwgIC01NzE2LCAgLTI4MTAsICAgMTI5MSwgIC00Nzk2LCAgIC0yNDEsICAgMjUyNywKKyAtMjM0MiwgIC0xMzYwLCAgIDQxNjEsICAgMTg4NiwgICAtMTI4LCAgLTE1MjEsICAxMzcyNiwgICAxODE4LAorICAtNTU0LCAgIC0xNTcsICAtOTY2NSwgICAyNjA3LCAgLTEwMTMsICAgIDU3OSwgICAxMTIyLCAgIDE1NzEsCisgLTI2ODQsICAxMTM2NCwgIC02NDY0LCAgIC0xODQsICAtMTU0MiwgIC01NjcwLCAgLTEwOTEsICAgLTY3MCwKKyAgMTI3MywgIC0xMDUxLCAgICAgLTcsICAgLTI3OCwgIC0yNTUxLCAgIC01NDgsIC0xMDY3MywgIC0xNDM0LAorICAtMzQzLCAgICAzMTcsICAtMzEwOCwgIC0xNjE1LCAgLTIyMzksIC0xNDEzMiwgICAgNDkwLCAgIC00NTQsCisgIDI0NjcsICAgMTk5MCwgICAgNDcwLCAgLTEwNzIsICAgIDQ0MCwgICAgMjkwLCAgIDMwMDYsICAtNDQyMCwKKyAtMjA4MywgICAzMDUwLCAgIDI3NzksICAtMjM0OSwgICAtNTkwLCAgLTQ5NDEsICAgNzQ2NCwgIC05MDAwLAorIC0yNjg2LCAgLTIwNDUsICAtODcxMiwgIC0zMjgxLCAgLTI0NzYsICAgIDY0OCwgICAtMTQ4LCAgICA0MDgsCisgLTEzNjcsICAtMTExMywgIDI3MzQ3LCAgLTExMTMsICAgIDczOSwgICAgIDM5LCAgIDE0NDMsICAgLTIwOCwKKyAgLTY4NiwgICAgOTg2LCAgICA3MzUsICAgLTcwMiwgICAgIDc2LCAgICA2NjUsICAgLTE5NCwgICAtMTY1LAorICAgMzY2LCAgIC02MDYsICAtNDkwOCwgIC0zOTMyLCAtMTU5NDEsICAtMjgxMCwgICA0NTcyLCAgICA4MTYsCisgLTIwOTIsICAgNDIxMywgIC0yNDkyLCAgIDQwMDYsICAgIDkyNiwgICAgMjEwLCAgLTExMTAsICAtMTYzNSwKKyAgLTI3MCwgICAtMjI2LCAgIC0zNjIsICAgLTE4NywgICAxNzkwLCAgIDMwMTYsICAgMjIxNiwgICAzODkwLAorICAyMDE4LCAgLTEzMjUsICAxOTc4NCwgICAtNzcxLCAgICAzNTYsICAgMjExOCwgICAgLTk4LCAgIC02ODgsCisgIDEwMTYsICAgIDk3OCwgICAgNTU5LCAgICAtMzksICAgIDE2MCwgICAtMzEwLCAgIDY2MjIsICAtMTc1NCwKKy0xMTEwNCwgICAgMjA0LCAgLTIyMTIsICAgMjM3MCwgLTExNjEwLCAgIDExMTksICAgMzIxNiwgICAzMTAyLAorICAgNTI0LCAgICAyNzgsICAgLTgyOSwgICAgNTI0LCAgICAgMjgsICAgIDgzOCwgICAgMzc0LCAgICAtNzYsCisgLTQ1OTMsICAtMjkzMywgIDEwNjk3LCAgLTY1MTAsICAtNDk3MCwgIC0yMDI1LCAgLTkzODMsICAtMzQyOCwKKyAtNDExMiwgICAyNjY1LCAgIDE0NTksICAtMTQxMSwgICAgNDIxLCAgICA0ODEsICAgIDg0MiwgICAtMzQxLAorICAgMTQ3LCAgIC0xNTgsICAgNDEwOCwgICAgIDQ1LCAgIDQ5MzUsICAgIC0yMSwgIC03OTA1LCAgIDIwNTgsCisgIDExNTgsICAxNTI2MCwgICAtNTY3LCAgIC03NTIsICAgLTk5MiwgIC0xMDk0LCAgLTEwNTksICAgMjM3MCwKKyAgIDgyMCwgICAgNjU1LCAgIC0yNjEsICAgIDI4MCwgIC0zOTY5LCAgIDYzNDIsICAgODUyMSwgICAzMTE0LAorICAgMzY5LCAtMTIyNjksICAgMTY4NCwgICAgICA0LCAgIDQ2ODYsICAgMTk4NSwgIC0zNjY4LCAgLTMwNDAsCisgICA2NzcsICAgLTI1NCwgICAgIDU3LCAgIC0xNjEsICAgLTk4OSwgICAtMzc5LCAgIDcwNzUsICAgLTU4MCwKKyAgMjg0NiwgIC0zMTc3LCAgLTIyODUsICAgIDk1OCwgIC03MDk2LCAgIC0xNTQsICAgLTUxNSwgIC0zMzQ1LAorIDEzNDg3LCAgIDM1NDgsICAtMTgwNCwgICAgMjkwLCAgIC00MzAsICAgIDcyNiwgICAgMzk5LCAgICAgNTQsCisgLTI4MTQsICAxMDIzNSwgICAxOTU4LCAgLTMzNTYsICAtMTMzMCwgICAgNTM2LCAgIDMyMTgsIC0xNDE5NCwKKyAgIDIwMCwgICAtNzk2LCAgIC04NjIsICAtMTQ4MCwgICAxODExLCAgIC0zNDYsICAgIDYwNCwgICAtMzkxLAorICAtMjMxLCAgICA1MTMsIC0xMDQ5NSwgIC02MDI5LCAgLTY0OTIsICAtODc0NiwgICAtMzU3LCAgIC0yMjEsCisgLTE4OTAsICAtMjY2OSwgICAgICA4LCAgLTE3NTYsICAtNTgxMiwgIC0xMDQ4LCAgIDIyNTgsICAgIDIyMywKKyAgLTQ3NCwgICAxMTU0LCAgIC0yMjYsICAgIDM0OCwgIC0xNTkwLCAgIDI5MTUsICAgIDE1OCwgLTI0MDU5LAorICAgODc1LCAgIC04NDYsICAgMTE1MCwgIC0xMDAwLCAgIC04NDQsICAgLTExNiwgICAtMjQ2LCAgIC0yMTksCisgIC00ODIsICAgLTM2NywgICAgMTIwLCAgICA1MTcsICAgLTQ4OSwgICAgNDQyLCAgIDgxNDgsICAgNTA0MCwKKyAgMzc3MCwgIC0xMDA2LCAgICAtNTEsICAtMzE3NSwgLTEwMjc4LCAgLTQ0NjgsICAgMTE4OCwgICAxNDk3LAorIC02NTE1LCAgICAgLTUsICAtMTYyOCwgIC0yMzg3LCAgLTEyOTcsICAgLTcxNywgICAxNjMwLCAgICAyMzIsCisgLTM2MDgsICAtNjY4OCwgICAyNDQ0LCAgIC03OTIsICAgLTI0NiwgICAgNDExLCAgIDE0NjQsICAgMzY2MSwKKyAgMzI0NCwgIC0xMTIxLCAgLTE2MDIsIC0xNTM5OCwgICAtNDQzLCAgICA4ODIsICAgMTQxMiwgICAgOTI2LAorICAgIDE2LCAgICAtNzMsICAgMjY5MywgICA3MTY4LCAgLTkzOTksICAgIDUyOCwgICA3OTE2LCAgLTkyNzAsCisgLTE2NjksICAtMjc1NiwgICAxMzA0LCAgIDMwNzQsICAtMTUxMCwgIC0yMDg5LCAgIDE0OTEsICAtMTU1NiwKKyAgLTQyMiwgICAtNDE0LCAgICAxMzIsICAgLTE5MiwgICA1OTg4LCAgIDQ1MDAsICAgNzU3MiwgLTEwOTc4LAorIC00ODc1LCAgIDM2ODUsICAgMTg4OCwgICAtNjYwLCAgLTE3NTAsICAgLTUxNSwgIC0yNzI4LCAgLTMxMzMsCisgLTI3NDIsICAgIDY2NiwgIC0yODYxLCAgICA2MjYsICAgIDI1NiwgICAgMjQzLCAgIDQ1ODcsICAtMzU2NywKKyAgLTI4OCwgICAyMzE0LCAgIDQ3NjUsIC0xMTAzNiwgICA3MzIyLCAgIDc1ODEsICAgMjY1MSwgICAzMjY0LAorICAtMzk0LCAgIC0yNDYsICAgLTg5MSwgIC0xNDY0LCAgLTE3MTcsICAgIDEyMywgICAtNTE3LCAgIC00ODYsCisgLTEwMTksICAgNzIxNSwgICAgNTU0LCAgICA3MjIsICAtNDI1MywgICAyMzkzLCAgIDMwNTMsICAgMjg4MSwKKyAgMTUzOCwgIC0yMTA0LCAgICA1NzMsICAgIDMyMSwgICAgNjczLCAgIDM5MDIsICAtMjg1NSwgICAgOTQ0LAorLTEyODE2LCAgICAzNzAsICAgMzQ5NiwgICAgOTUyLCAgLTE0MzUsICAgNjM3OSwgICAgNzY2LCAgIDIyNzMsCisgIC03MjksICAgICA4MCwgIC0yNDMyLCAgLTExNTAsICAgMjQwOCwgICAtODk1LCAgMTU0OTcsICAtMTIzMSwKKyAgLTI4MiwgIC0zMzA2LCAgIC00MzUsICAgLTE2NywgIC0zNTI4LCAgLTU2ODMsICAtNjQxMywgICAyNTAxLAorIC00ODI1LCAgICAxMjQsICAgMzEyOCwgICAtNDI1LCAgLTI4MDAsICAgLTk4NiwgIC0yMjgzLCAgIC00OTUsCisgLTMzOTIsICAtMTU2MCwgIC0yMDkzLCAtMTE2MTMsICAgIC0zNywgICAgMTU3LCAgIC00MzgsICAgLTc5NCwKKyAgMTk4OCwgICAgLTQ1LCAgIDE1MDgsICAgICAyMCwgICAgIDk4LCAgIC00NTgsICAgLTI0NSwgICAxMTMwLAorICAgMTEwLCAgIC01MjUsICAgLTc3MSwgICAxMTIwLCAgICA3MTAsIC0yMTc1OCwgICAgMTc0LCAgIC0yMTAsCisgLTQ4MzksICAtMjQ2OCwgICAtNjQ4LCAgLTQzODgsICAgIC0xMSwgICAyOTkwLCAgIC0xODEsICAtNDc5MCwKKyAtNDIzMiwgICAzNjM0LCAgIDY0MjcsICAgMjc3MiwgICAgMTY2LCAgLTI5OTYsIC0xMjAwNSwgICAxNjMwLAorICAtMjQ5LCAgICAxNzksICAgIDg1NiwgIC0xMjUwLCAgLTQyMTYsICAgMTk5MywgICA1MTY0LCAgIDQ3NTcsCisgLTUwNzEsICAgNDMzMSwgIC0zMDI5LCAgLTEyNzYsIC0xMTE4NCwgIC0yODY0LCAgIDEyMzgsICAgNjMzMiwKKyAtMjQzMSwgICAxMjc2LCAgIC0zMzgsICAgLTQ3NiwgIC01NjU5LCAgLTI0MTAsICAgMjUxMCwgICAxODUzLAorIC00ODUzLCAgLTMxNzUsICAtMTg5NiwgIDEwNzI4LCAgIDM3MjQsICAgIDk2MCwgICA5OTYzLCAgICAzMDUsCisgIC05MzgsICAgLTY0NiwgIC0yNzYwLCAgIDE0MzYsICAgIDExMywgICAgLTc0LCAgLTMwOTgsICAtNDA5MCwKKyAgMjk1MCwgICAyNzAxLCAgICA5OTIsICAgIDIwNiwgIC0xMzkzLCAgLTIxNzksIC0xMDg2MiwgIC0yMzk2LAorIC0xMDA4LCAgIDI2MzksICAtMTU0NywgICAtNDE2LCAgIDkyNjQsICAgMTgyNCwgICAtMzYwLCAgICA0MDEKK30sCisKKy5jYjQ0NDBtMCA9IHsKKy0yNTc5MywgICAtMjM4LCAgIDExOTMsICAtMjYzNSwgICAtMjM4LCAgIDEzMTUsICAtMjI3NywgICAxNTg4LAorICAtODk2LCAgICA1MTIsICAgLTg2NCwgICAgNjExLCAgIC0zOTgsICAgMTI3NywgICAtMjEyLCAgIC0zNTgsCisgICAyMDIsICAxMzI1MCwgICAgIDE2LCAgIC04NjAsICAgMTYxOCwgIC0xMDI0LCAgICAzMTAsICAxMTU2MCwKKyAgLTc0NiwgIC0zODc2LCAgICA3ODAsICAtNDA4NywgICAtNDc1LCAgICA4NTcsICAgMTAxNywgIC0xNDM5LAorICAtODkwLCAgICAxNTUsICAgODU1NiwgICAgMzYyLCAgLTExNTgsICAgMjExNiwgICAtMjkxLCAgICAtNjYsCisgLTEyNzIsICAgIDUxMCwgIC0xMzk0LCAgIDIyNTksICAtNDc2MSwgICAgODA4LCAgIC03NDAsICAgLTkzNywKKyAxMzk5MywgICAgMTkxLCAgICAyNzMsICAtNzY3MCwgICA2Nzc2LCAgICA4NDYsICAtMTkwNywgICAgOTU1LAorLTEzMjA2LCAgLTE5NTYsICAgMTY5NywgICAxNjcwLCAgIC0zMjksICAgLTI0NCwgICAyMzk1LCAgIDYxMTksCisgIC04MDIsICAtMTAwNywgICAgNjQ5LCAgIC05NzQsICAgIDE3MCwgIC0yMTM2LCAtMTA3ODAsICAgMTAyMCwKKyAgMTI3MCwgICAxOTU0LCAgIDExMTgsICAxMzM0OCwgICAgOTgzLCAgLTEzOTQsICAgLTU5NCwgICAtNTE0LAorICAtNTg2LCAgIDEwMjYsICAtMTgyMSwgICAgNTQ4LCAgIC0yOTgsICAgMzM0MiwgICAgODM3LCAgLTEzOTUsCisgMTM5NzcsICAgMTAyMSwgIC03NzkyLCAgLTI5MzAsICAgMTQ2NiwgICA1NDk0LCAgIC04NDMsICAgMjQzMiwKKyAgMTM3OCwgICAgLTY4LCAgICAxNzQsICAgIDQwNywgICAgIDc2LCAgIC04NzcsICAgIDY5MSwgIC05NDQ1LAorICAgNTIyLCAgLTM0NDgsICAgMjU0OSwgICAtNDEyLCAgLTIzNTgsICAgIDg3NSwgIC01MDQ0LCAgIC05NTIsCistMTAxMTMsICAgNjU3NCwgIC02MzQ3LCAgLTI3NjAsICAgLTY2MiwgICAgIDI5LCAgIC0yMjcsICAgNDg4NCwKKyAgMTMwNCwgICAgNDExLCAgLTMzMjAsICAgMjQzNCwgICAgNzg1LCAtMTQ4MjIsICAgNDQxMiwgICAyMjcyLAorIC02NDA3LCAgIDIxNzIsICAgLTYxMywgIC0xNjY1LCAgICAyOTYsICAgIDc0MiwgICAgNjI0LCAgICAxMzUsCisgIDUzMTYsICAtMzE5MSwgICAtODU1LCAgLTIwNjEsICAgIDQ4NSwgIC0zMTg4LCAgIDI5OTgsICAgMTM4MiwKKyAgMjUxNiwgIC0yNDM4LCAgLTM1MDYsICAgLTIzOCwgICAgNzM3LCAgIC02MjksICAgMTAwMSwgICAgNzczLAorIDE3NTQwLCAgIDE0NzgsICAgLTcyNCwgICAtNzY0LCAgLTEyMzEsICAtMTI1NCwgIC0xNTgyLCAgIC02OTIsCisgIC0zNTEsICAtMTU1MSwgICAtMTcxLCAgICAxODMsICAgICAzOCwgICAtNjY4LCAgICA3NTYsICAgLTc3MCwKKyAyNDM0NCwgICAtOTA1LCAgLTcxODIsICAgIDUwMiwgIC0zNzY2LCAgLTE2OTAsICAgMTU4OCwgICAxNTIyLAorICAxODQ0LCAgIDEyNzYsICAgMTQ1OCwgICAtNzc3LCAgIDE3MzEsICAgNDg1NiwgLTE0ODYwLCAgLTEwOTcsCisgICAgMzYsICAtMTMxMCwgICAgODQ2LCAgLTE1MDAsICAgIDUyMSwgIC0zNjY5LCAgIC0yNTIsICAgNDQ4MCwKKyAtMjYwMiwgICAtODQ1LCAgICA1OTcsICAtNDUxMiwgICAxMDYyLCAgIC0yOTIsIC0xODUxOCwgICAxOTcyLAorICAtMzM0LCAgICAtODAsICAtMTI1NiwgICAtMzY2LCAgIDM2NDAsICAgLTQzNiwgICAgLTEyLCAgLTE2NzAsCisgIC00MzUsICAgMTQ5NiwgICAxNDI5LCAtMTEwOTIsICAgMTAxMiwgICAtOTM2LCAgLTEyMjQsIC0xMjI0MCwKKyAtMzA0OCwgICAgMjEwLCAgIDE5MDUsICAtMTE5NywgICAtMzU3LCAgLTk3NTksICAtMjYzMiwgICAtMzMyLAorIC0zNDE3LCAgMTUwNzgsICAgMTQ5NiwgICAyMjA2LCAgIDE4MDAsICAgIDIwNSwgICAxMzg0LCAgIDM1NDYsCisgLTE4NTMsICAgIDc1NSwgICAxMDE2LCAgICA3MjYsICAgICA1OCwgICAtMTUwLCAtMTMwNTMsICAxMDM3NSwKKyAtMjU4OSwgICAtMzMwLCAgIDE2MTYsICAgMzA4MSwgICAyNzYzLCAgLTI2MTcsICAtMTIwNCwgICAgMzI0LAorICAgLTUzLCAgIDI5NjgsICAgMTQ4NSwgICAgMjE0LCAgICAxMjQsICAgLTMzNCwgICAtMjM3LCAgMTY3ODQsCisgIDI2MTIsICAgMTAyMywgIC00Mjk4LCAgLTIxNTYsICAgNDMzNiwgIC00MzA3LCAgIDQ5NTIsICAgMTAzNiwKKyAgICA4MSwgICAtNzYyLCAgIDM0MTYsICAgIDcxNCwgICAtMTg3LCAgLTQxMDAsICAgLTc1NywgICAxMTI0LAorIDEwMjI0LCAgIDcwNTksICAgIDQyNCwgICAtMzE2LCAgIDEyODEsIC0xMjI2MiwgICAgOTEyLCAgLTE5OTksCisgICAgIDIsICAgLTczMSwgICAtMTg0LCAgICA4NzksICAgLTkzNCwgICAtMjAyLCAgIC0zOTEsICAtMTA0NiwKKyAgLTMzOCwgICAtMTAxLCAtMTc1MTEsICAtMTcxMiwgIC01NTgwLCAgLTIzMjcsICAtMjQ3OCwgICAxNzcwLAorIC01ODI1LCAgIDE0OTksICAgIDU3OCwgICAtMTMwLCAgIDE0MjQsICAtMTgxOCwgICAgMTEwLCAgICA1NDIsCisgICAgMjIsICAgIDk4OCwgIC00MjI3LCAgIDI4MzYsICAtMTQ0NywgICAxMTcwLCAgMTIzMzUsICAgMjE3OSwKKy0xMTIxNiwgIC0yNTAwLCAgICAgNjQsICAgLTkxMiwgICAtOTU0LCAgICA2NTQsICAgLTgwMiwgICAtNDU1LAorICAtNTk3LCAgICAyMzQsICAgLTI5NiwgICAgODExLCAgIDEwODMsICAgMTg0OCwgICA0MTQ4LCAgICA2MzcsCisgLTY2MDgsICAtMjM2MiwgIC0zMzgyLCAgIC02NjQsIC0xMzA4OCwgICAyODM5LCAgIDMwOTAsICAgMzI5NCwKKyAtNDU1NCwgICAyNTE4LCAgICAtNTUsICAgIDgzNywgICAxMzkyLCAgIDU5MDUsICAgMTI4NywgIC0xNDg0LAorICAgOTY1LCAgMTY1MzMsICAtMzUwNywgIC0xOTAzLCAgLTE1NjIsICAgMjQwOCwgICA1MDM3LCAgLTQ4MTYsCisgIDE0MDksICAgIDM2MSwgIC0xODkwLCAgICAxNzAsICAgLTYxMCwgIC0xNzU1LCAgIC01MjQsICAgLTg2NywKKyAtNjIzOCwgLTIwMTE3LCAgIC03NDUsICAgLTk1NiwgICAtMTc2LCAgIDI5OTgsICAgIDEzMCwgICAtNjY4LAorICAtODQzLCAgIC0yNjcsICAgLTM2NCwgICAtNTczLCAgICA0OTUsICAgIDEyNywgICAgLTY2LCAgMzI3NjcsCisgICAyNzEsICAgLTQwOCwgICAgNjU0LCAgIC0xMjMsICAgMTgzMSwgICAgMTUxLCAgICA5OTYsICAgICA4MiwKKyAgIDYyOCwgICAtMjUxLCAgICAxNDQsICAgIDE5OCwgICAgLTg4LCAgICAzNTcsICAgICAzNywgICAgNjEyLAorICAgMTg0LCAgICAyMzgsICAgLTU4NCwgICAgLTUyLCAtMzAwMjUsICAgLTQxNSwgICAgNDA0LCAgIC01NjYsCisgICAxMDAsICAgIDY1OSwgICAtMzM2LCAgICA4NzcsICAgIDIxMSwgICAtNzMwLCAgIC0zNzcsICAgIDE4NCwKKyAtNTI1NiwgIC0xNDg0LCAgLTExOTEsICAtMjEwOCwgICAgIDI0LCAgLTc4MjEsICAgIDIwOSwgIC0yODU2LAorIC0xODQ0LCAgICA2OTcsICAgNTc5OCwgIC0xMTkxLCAgICA0MjcsICAxMTg1OCwgICAxMDAwLCAgIC0yNjEsCisgICAxODQsICAgLTY4NiwgICAxMTgyLCAgLTMxNDIsICAtMzEzOCwgICAgMTM5LCAgICAxNDQsICAgIDExNywKKyAgMzY1OCwgIC0zNTY2LCAgLTE1NjIsICAgIDY3MiwgICAyMDM2LCAgMTUwNTEsICAtNTA2OSwgICAtNTUxLAorICAgNTI5LCAgIDE2OTYsICAgLTIxNCwgIC0yNjc4LCAgLTU5NjYsICAtMzcwNywgICAyODQ3LCAgLTI1NTQsCisgLTE3NjAsICAtMTE5NiwgICAyMDg4LCAgIDYzNzIsICAgMTc3OCwgIDEyOTM1LCAgIDIxODksICAgMTk5MiwKKyAgMTc2MSwgICAgNTc4LCAgIC01NDIsICAgLTc1MywgIC0xMTgyLCAgIDQzMjEsICAgMTg3MSwgICAgMzA5LAorICAgNzA0LCAgLTEyNTksICAgIDg4NCwgIDE5MTM2LCAgLTI2NjUsICAgMTA5NiwgICAzMDQ4LCAgIC0xNjcsCisgICA4NzIsICAgLTM0NCwgIC0xMDkyLCAgICA0NjQsICAgMzI1NSwgICAgLTg2LCAgIDE2MDgsICAtMTA2MiwKKyAtMTU2OSwgIC0xNjk5LCAgIDQ1MDQsICAgLTI3NCwgICAgNTY4LCAgIDE0MjgsICAyMDU3MSwgICAxNDUyLAorICAtODk0LCAgIC03OTEsICAgIDQ1OSwgICAtODgyLCAgLTEwNDgsICAtMjk0NCwgLTExMDk1LCAgIC03ODMsCisgIC04MzIsICAtMjQ1MCwgICAgNjUwLCAgIDI3ODQsICAgMzE1NiwgICAgNTI5LCAgICA0NTcsICAgIDQ4MywKKy0xMjU1MywgICAgNjU1LCAgICA2ODYsICAgLTc1NywgICAgOTI5LCAgICAyMTIsICAgMTI0MiwgICAtMjAxLAorIC0xNjI3LCAgIDQ4MjYsICAtMTg5NSwgICAgOTk3LCAgLTMyMjUsICAgICA4NCwgICAgIDgwLCAgICAyODcsCisgLTIxMzYsICAgIDQwNSwgICAtMTg4LCAgIC04OTAsIC0xODI3MiwgICAtNTExLCAgIC0xMTgsICAtMzY0MiwKKyAtMTAxOCwgICAgNDIwLCAgMTI2NTAsICAgLTQ3NCwgICAtNTQwLCAgIDY5NzgsICAgNjk3NywgICA0NDE4LAorICAxMTYyLCAgLTEzMzIsICAtMTExMiwgIC0xNzY1LCAgIDI2NDAsICAgIDU2MiwgIC0xMTY0LCAgIDEyNTYsCisgICA1OTUsICAgIDU2NywgICAtNDgzLCAtMzE1MTEsICAgLTk2MCwgICAtODE2LCAgICA3NTYsICAgMTUwNSwKKyAgICAxMiwgICAtNTE4LCAgICAyMzQsICAgIDE4NCwgICAgNjc5LCAgICAzMjgsICAgLTYwMCwgICAtMTM3LAorICAgMjY3LCAgIC00NDAsICAgMjU0MCwgICAgNTkzLCAgIDEwMjMsIC0xMTc1NiwgICAgNjI2LCAgLTIwMzQsCisgIDU3NTYsICAtOTg4MiwgICAzMTc1LCAgLTExOTAsICAgMTYyOCwgICAzOTIwLCAgIDMyMTksICAgMTM5NCwKKyAgIDgzNCwgICAtMTQwLCAgIDQwMzYsICAgNDcyMiwgICAtNDU1LCAgIDMxMDUsICAtMTM1NSwgIC0zMTA2LAorICAxMDAwLCAgIDc4MDYsICAtMjIyNywgICAgNjg3LCAgLTE1ODAsICAgMzE4MCwgLTEyMzAyLCAgLTEzOTQsCisgIC00MjUsICAgIDQ4OCwgICAtMTg3LCAgICAtMzYsICAgIDIxOSwgICAgMTU4LCAgMTIwMDYsICAgMTY4MywKKyAgMjE1MSwgICAgIC0yLCAgLTExMTAsIC0xMjI1MCwgICAgLTU5LCAgICA2NzIsICAgMTg0NCwgICAyMDg0LAorIC0yMTAxLCAgIDE2NTIsICAgLTc4MywgICAgNjM0LCAtMTMyNTcsICAgLTMzOSwgICAzOTMyLCAgIDIyNjAsCistMTI0NTIsICAgIDE1MiwgICAgMzE2LCAgIC02ODgsICAgICA3OSwgICAtOTEyLCAgLTIwODEsICAgMTM4NCwKKyAgIDE4OCwgICAxOTQyLCAgIC03MDYsICAgIDIwNCwgICAgNzAwLCAgIDE3NzYsICAxMzkwMSwgLTEzNjY2LAorICAtMzI0LCAgICA0NzIsICAgMTA1NSwgICAtNjQ2LCAgICAgODIsICAgLTc2OSwgICAtODc3LCAgIC00NDMsCisgIC0yMjcsICAgLTkwMCwgICAgNjM2LCAgIC04NzAsICAgIDQ3MCwgICAtMTEyLCAgIC01OTgsICAtNDQwMiwKKyAtMjcyNiwgICAxNzc1LCAgIC0yMTYsICAgIC00MywgLTE4Njc1LCAgIC04NjMsICAtNDYwNCwgICAzNDMzLAorICAgNjc0LCAgIC0xNTUsICAgIDIwOCwgICAxNTQ2LCAgICAyOTQsICAgLTE1NywgICAtNjE2LCAgMTEwNzAsCisgIDEyMjksICAgLTUyOCwgICAyMTI0LCAgICA2OTksICAgMzYyNCwgICAgIDU0LCAgIC01MTYsICAgIDE5NCwKKy0xMzU1NiwgICAxOTAyLCAgIC01MDYsICAtMTMxNywgICAxOTE2LCAgICA0NzEsICAgLTM0MiwgICAgODM2LAorICAgIDE4LCAgICA5MDYsICAgIDYxNCwgICAgIC04LCAgIC05NTEsICAgMTA1MiwgICAgLTk3LCAgIDIyMTIsCisgIC05MjQsICAgIDMxMCwgICAgICA2LCAgIC03MzMsICAgIDEyMiwgIDIzNzMxLCAgICA0NjgsICAgIDM0NSwKKyAgMTU0NSwgICAxNDM0LCAgICA2MTEsICAgIDQwMywgIC0zMTM2LCAgLTIyMTQsICAgIC01NCwgICAxMDIzLAorIC0xMzkwLCAgLTUyNDMsICAtMzc0NCwgICAtMjU4LCAgIDY4NzEsICAtMTc3OCwgICAgNjczLCAgLTIzNjIsCistMTMwMDcsICAgLTc3NiwgICAtOTc0LCAgLTEwNzcsICAgODM4NiwgIC0zOTc4LCAgLTQzMjUsICAgMTIzNiwKKyAgNDAxMSwgICAxMTYxLCAgIC0yNjMsICAgMTIyNCwgLTEyOTU3LCAgIC0xMDAsICAgMjgwMSwgICAxNDU4LAorIC0zMDgxLCAgICA1NzgsICAgICAxNywgICAxMDM3LCAgIC03NDIsICAgNTk3MiwgICAtNjMyLCAgIDI5MDQsCistMTI3MjEsICAtNjczMywgICAtNDc4LCAgICAxODIsICAtMTk3MywgICAtODIwLCAgLTY5MTEsICAtNDkwNCwKKyAgLTk0MiwgICAtMzQ4LCAgIC0zNTMsICAgLTM1MCwgICA3ODY0LCAgICAgMzQsICAgIDU2OCwgICAxOTg1LAorICAgOTU2LCAgIDMzMTAsICAgIDExOCwgIC0yMDY3LCAgMTI2MDAsICAgOTA2MywgICAxNjA5LCAgLTEyNjEsCisgICAyOTYsICAtMTI0OCwgIC0xNjU2LCAgICAtNjUsICAgMTgzMiwgICAxNTI1LCAgIDE1MDMsICAgNTE0OSwKKyAgNDM3MCwgIC0xNjM4LCAgLTM4NjgsICAgIDMyMCwgICAxNTI3LCAgIC00MjQsICAxNzY3NiwgICAxNzgwLAorICAxMTcyLCAgLTExMzIsICAgMTEyOCwgICAxMjk0LCAgIC0zMjIsICAgLTEwMSwgICAgNDYyLCAgLTY2NjgsCisgLTMwMjQsICAgNzU3MywgLTExMDg4LCAgIDE1ODEsICAgICAxMywgIC0xMzk4LCAgICA1NTAsICAgNDM3NiwKKyAgMTYyMywgICAxNzI3LCAgICA4NTcsICAtNTMxMCwgICAyNTI4LCAgIC01MjksICAgLTQwMSwgICAgNTM5LAorICA2NTA4LCAgIDQyNDYsICAgNDEwNSwgIC01MzYzLCAgICAgOTYsIC0xMzQwNywgICAtNjk0LCAgIDUwNjEsCisgIDM0NDUsICAtMzI4MywgICAtMzQ4LCAgLTE0NzAsICAgMTExNCwgICAgNjAyLCAgIC00MDQsICAgLTEyOSwKKyAgIDY0MiwgICAxNTQ3LCAgMjMxMTAsICAtMjI1NSwgICAxOTY5LCAgICAzMzMsICAgMTI5NywgICAgMTE2LAorIC0xNjkxLCAgICAzNjQsICAgLTUyOCwgICAgNzU4LCAgLTEyMzksICAtMTgyNiwgICAtMjQ5LCAgIC0zOTUsCisgICA2ODQsICAgLTg1NiwgICAtNjM4LCAtMTAwMDAsICAtMjc3MywgIC02MTUxLCAgLTEyNDQsICAtMzEzOCwKKyAtOTY4OCwgIC0xOTk0LCAgIDcxMjQsICAgMTM2OCwgIC0xODcwLCAgIC0zMTIsICAgMTg2MywgIC0xMDA2LAorICAgOTYzLCAgICA3ODksICAgIDc0MywgIC00MTU4LCAgIC03NjAsICAgMTM4NCwgIC03NTI1LCAgIC05NTksCisgIC0yNjIsICAgNTc1MiwgICA0MDA1LCAtMTIwMzcsICAgLTIxMCwgICAgODg2LCAgLTE5NjEsICAgNDg5NSwKKyAgLTI1MSwgICAtMTU4LCAgICAyMTIsICAgIDY3NywgICAgNTE4LCAgICAzNDIsICAgLTIyNiwgICAtMzYwLAorICAgNDY2LCAgICAgMTcsICAyODM5MiwgICAgLTIwLCAgICAyNDYsICAgLTY4NiwgICAtMjU4LCAgICA2NDAsCisgIC0zNzgsICAgLTEyMCwgICAtNDQzLCAgIDEwNzgsICAtMjYxMiwgICAyMDg0LCAgLTE3MDYsICAgNDMzNCwKKyAtNDY3NSwgIC00NjM0LCAgIDIzMzYsICAtOTk5OCwgICA5OTc1LCAgLTEyODUsICAgMjc3OCwgICAzMjkyLAorIC0xNzE3LCAgICAxMzgsICAgMjExNCwgIC0xMTIwLCAgIC0xODAsICAtMTE0NiwgIDExOTg4LCAgICA4MjksCisgLTI1MzAsICAtODgyNywgICA2ODMzLCAgLTExOTEsICAtMTY1MywgICAyNjkxLCAgLTQwNjcsICAgMTE2NiwKKyAgMTk3MSwgICAgMzAzLCAgIC01NDQsICAtMTQ1OSwgICAtMjYxLCAgIDEwNjUsICAgMzQxMCwgICAyMDUwLAorICAzMTYzLCAgIC01MTUsICAgNTQ1NiwgIC00MjYxLCAgIDU0ODMsICAgMTUzMSwgIC0yMDk4LCAgIDIwMjAsCisgIDM3NzMsICAgIDU4OCwgICAgOTE1LCAgICAxNTgsIC0xMTg3NiwgICAgMjgyLCAgLTExODAsICAgIDI2NSwKKyAxMTAzNiwgICAgLTY2LCAgLTE3NDEsICAtMTg5NCwgIC00MjM0LCAgIDMwNDgsICAgIDIxOCwgIC0xMDMwLAorICAyMjQwLCAtMTI2NjYsICAtMjI5MCwgIC0xNjczLCAgLTE5MTEsICAgMTQ4MCwgICAgMjg3LCAgICAtODEsCisgIDExODIsICAgIDIxNiwgLTEwNzM0LCAgIDIyMDEsICAgIC01OCwgICAtNjE5LCAgIDg1ODUsICAgLTU3NCwKKyAtNDU3NiwgICAxODUyLCAgIC00NjgsICAtNjc1OSwgIC03NjY3LCAgICAxNjcsICAgIDk5NSwgIC0xMTE0LAorIC0xMjc2LCAgLTIwNTMsICAgMjE3OCwgIC04MTMzLCAgLTEyNzAsICAtNzgyMiwgLTEwNTgyLCAgIDUzODAsCisgIDMwMzcsICAgMTA3MSwgICAgODI3LCAgIDQ5NzIsICAgMTAyNCwgICAtMTI5LCAgIC0xODAsICAtMzAwMiwKKyAgLTg0NiwgICAtNzM2LCAgIDk1ODcsICAgMTg5MCwgIDEwMjg3LCAgLTE5NTQsICAgMTA0MiwgICAxNTU4LAorICAtOTUwLCAgIDI0MDYsICAtMTg1MiwgICAyMjc1LCAgIDY2OTQsICAgLTcwMywgICAtOTEwLCAgIDM4NTQsCisgICA4MTIsICAgIDUyMSwgIC0xMDc1LCAgIC03NjEsICAgNTM1NywgIC0zOTExLCAgIDM4OTIsICAgNzk0NCwKKyAgNDU4MCwgICA1MDMxLCAgIDEwODgsICAgNzExNiwgIC0xNzQ2LCAgLTUyMjMsICAgMjYwNywgICAzMjI3LAorICAyMjk2LCAgIDU2MDMsICAgIDIxMSwgICAtNzMxLCAgIDY0NTAsICAtMzMxMiwgLTEyMzc4LCAgIC0zMjYsCisgIDQyNDUsICAgNDE2OCwgICAtNzk5LCAgLTM1NjMsICAgLTUwNSwgICAgNzI1LCAgLTUyOTcsICAgMjE5NiwKKyAgMjIyMSwgICAgLTE2LCAgLTM0NzIsICAgIDMxNSwgICAgNjI2LCAgLTYxMzEsICAgICA3MSwgICAgOTIwLAorIC00MzgzLCAgLTEzNDAsICAtMjY3NSwgICAtNjY0LCAgIDc0MTIsICAtMTI0MCwgIC0xMzYxLCAgICA5OTcsCisgLTM4MTcsICAtMjM3NywgLTExNzE3LCAgIDE2NjEsICAgICAyMiwgICAgNTQwLCAgLTUyNjEsICAgLTk1MCwKKyAgNzQ3MiwgICAzMTQ4LCAgIDc2NDcsICAtNDQwMCwgICA0NTU4LCAgLTQ0MTIsICAgLTg2OSwgIC0xNTI4LAorIC0yNjE4LCAgIDgzMTEsICAgMjExMCwgICAgNTM0LCAgIC00NjAsICAgLTIyMywgICAtMTYyLCAgIC04MjgsCisgICAyNzQsICAgMTg0NCwgICAxODYxLCAgLTE1ODMsICAgNjg5OSwgICA1MjIyLCAgLTE3NzIsICAtMjg4MCwKKyAtNjQwMCwgICA0NzAzLCAgIDI2MDYsICAtMzk5MCwgIC0xMjI0LCAgLTQxNjAsICAgOTAzMiwgICAtMjk5Cit9LAorCisuY2I0NDQwbTEgPSB7CisgMzI3NjcsICAgIDM4MywgICAgODU3LCAgLTE1NzksICAgLTQyMywgICAxMTY0LCAgLTE2MDYsICAgMTIxOCwKKyAgLTQxMCwgICAgNzc3LCAgIC0yOTIsICAgIDEyMiwgICAgMjgyLCAgICAtNzQsICAtMTM5NCwgICAgMjU5LAorICAtNzM0LCAgICAxMDIsICAgIC04MiwgIDMyNjE2LCAgICA0MjcsICAgLTU0NSwgICAtMTQ2LCAgIC0xNDEsCisgICAzNDAsICAgIDUwNiwgICAtODA4LCAgICAxNzEsICAgLTc3OCwgICAgOTAwLCAgIC0yMDQsICAgLTI3NywKKyAgLTIyOCwgICAtNDI2LCAgICA1NjYsICAgLTQ4MSwgIC0xMTM4LCAgIC05MDcsICAgIDExMiwgICAyNzIyLAorICAgODcxLCAgICAxMTUsICAtNzIwMiwgICAxOTUzLCAgIC04MjYsICAtMTgxMiwgICAtMzk2LCAtMTQ3MjIsCisgIC04NDAsICAgIDE1NSwgICAxMTE0LCAgIDU2MjQsICAgMTExMiwgICAtMTQ3LCAgLTYzODMsICAgIDkyNiwKKyAgMTUwNSwgICAgMzYwLCAgICA5MzcsIC0xMzM5MSwgICAgOTY5LCAgIDcwNjIsICAgMjIxOCwgIC0zNTMxLAorICAgNDcxLCAgICA0NTgsICAgIDE5MSwgICAtNDY1LCAgIDg2NjQsICAtMTE2OCwgICAgNTQ2LCAgIDIxMDksCisgIC05NDQsICAgIC03NCwgICAxNjQ0LCAgICAtODEsICAgLTc2MCwgIC0xOTIwLCAgIDI2NTksICAxMzMzMCwKKyAgMTUxMSwgIC0xMTQ4LCAgIDEzNDYsICAgIDc5NiwgICAgLTIwLCAtMTU2MTYsICAgMTI0NiwgIC0xMTkwLAorLTEwODgyLCAgIC03NzQsICAgIC03MCwgICAzNjQzLCAgIC04OTYsICAgMTgzMCwgICAtMTkyLCAgIDEwMTgsCisgIDEwODUsICAgIC05NSwgICAtMzA5LCAgICA2NTksICAgICA5MSwgICAgNzI3LCAgLTQ0ODYsICAgIDQ4NiwKKyAtMjA3OCwgICAxMjM1LCAtMTQ0MTUsICAtNDA1MywgIC0xNjE5LCAgLTI1ODksICAgLTU4MiwgIC00NjUwLAorICA0MDc2LCAgIC03NjIsICAtMTExMSwgICAgMjc3LCAgIDE0NDgsICAgLTc0MiwgICAtMzE0LCAgIC05NzksCisgIDE4ODksICAgMjY3OSwgIC0xOTcyLCAgIDI0ODAsICAgIDMwMiwgICAyODY5LCAgLTkxODMsICAgLTQ0NSwKKyAtMTgxNywgIDEyODk0LCAgICAxMDYsICAgIDE4NywgIC0xNDA2LCAgIC02MTUsICAtMTE3NCwgICAgNzQ2LAorICAtMzcxLCAgICAzODIsICAgIDM1MCwgIC0xODExLCAgIC01MjcsICAgICAzNiwgICAgNTAwLCAgIC04MzUsCisgIC0xMDYsICAgMTEzNCwgIC0yMjA3LCAgIDEwMjEsICAgIDM0OCwgICAgOTA4LCAtMjE3ODAsICAgIDQ0OCwKKyAgIDY4OCwgICAgLTYwLCAgLTE3OTAsICAgMTkwMSwgLTIyOTkwLCAgIDE0NjcsICAgIDU5NiwgICAtOTEyLAorIC0zMTkwLCAgIDE0ODQsICAgIDI2OSwgICAtNDA5LCAgIC00NzQsICAtMTY3MCwgICAxMzI4LCAgICAxNTIsCisgIC00MDIsICAgIDM1OSwgICAtNzM0LCAtMTMyMDgsICAgICA2MiwgIC00MTk3LCAgLTYyNDIsICAgNTE5NSwKKyAtMjg0MSwgICA1MDMwLCAgIDI3OTQsICAgMTI2NCwgIC0xMTMwLCAgIDM4MjEsICAgIDk2MSwgICAgNzI5LAorICAxMDc1LCAgICAgNDksICAgLTE0OCwgICA3MjY3LCAgIDI1OTYsICAtNTA5MywgIC04Mjg0LCAgLTY4NzUsCisgLTMwNTksICAgMzkwOSwgIC00NjM1LCAgIDE0MDIsICAtNjMzNCwgICAtMzQyLCAgLTMwODMsICAgLTg2MSwKKyAgIDQ5MCwgICAxMjU3LCAgIC02MzAsICAgIDEyOCwgICAyMjQwLCAgICA4MzIsICAgMTA2MCwgIC0xODAyLAorIC0xNjUyLCAgICAxMjgsICAgNzgxNiwgLTE0MzkxLCAgLTY3MjIsICAtMzMyOCwgIC0yNTg2LCAgIDMwNDQsCisgIDEwODgsICAgMTU3NywgICAgODUyLCAgIC0xNDIsICAgLTE3NiwgICAxMzcxLCAgIDEyMzYsICAgIDk3NiwKKyAxMjE2NSwgIC0xNTk2LCAgIC0xOTksICAgLTUwNCwgLTExMDIwLCAgIC01ODIsICAgIDk3MiwgIC0xNDY4LAorIC0yNDAyLCAgIC02NjYsICAtMzMyNywgIC0yMTQ4LCAgIDEwNzgsICAgLTE5NCwgICA5Njc1LCAgLTIxMDIsCisgLTEyMzYsICAgIC03MCwgICAtOTQyLCAgICAyOTEsICAgMTM2NCwgICAxNDAzLCAgLTMzNjIsICAxMjk2MywKKyAgLTM3NSwgIC0xNzI4LCAgIDE2MTUsICAtMjM1NCwgICAgNjMzLCAgIC01MDYsICAgLTE5NCwgIDEzMDM3LAorIDE0MTcyLCAgICA1MzQsICAtMTAyNiwgICAtNDI1LCAgIDI0ODgsICAgLTE4MCwgICAtNjc4LCAgIC00MzYsCisgICAyNzIsICAgMTUwNywgICAtMzM0LCAgICA4NDAsICAtMTAwMCwgIC0xMDY4LCAgIDEwMjksICAgLTMwNiwKKyAgICAyNCwgIC00NDM1LCAgLTU5OTQsICAtMTMwNywgICA0MjUxLCAgIDM5NjgsICAgMjUyNywgICAtOTgxLAorIC0yNjI2LCAgLTQ0MDAsICAgLTI0MiwgIC0xODIzLCAgIC02NzksICAxMjgzMSwgICAgLTIyLCAgICAgNTEsCisgIC0zODEsICAgMjQyMiwgIC0yMzc2LCAgLTgxNTYsICAtMTQ3NywgIC02OTc0LCAgIDExMDIsICAgLTM3MywKKyAgIDQ2NywgIDExMzE0LCAgIC01NTQsICAgLTQzMiwgICAgODI0LCAgIDcyNzcsICAgIDM5MywgICAtMTc4LAorICAgMTc5LCAgIC02NTMsICAxMTg0OCwgIC0xNTkzLCAgMTQxNDMsICAgLTczMSwgIC0xMDM2LCAgLTIzMjIsCisgICAyNjEsICAtMTk5MiwgIC0xMTUyLCAgLTE0MzAsICAtMTM1NCwgICAgLTUxLCAgIC0yODUsICAtMTYzNywKKyAgIDE0NCwgICAgLTU5LCAgLTIxODIsICAgNTczMSwgICAgNTM4LCAgIC04ODAsICAgIDM5NywgICAzMDEwLAorICAgNzA3LCAgLTE4MjIsICAtMTAwNiwgICA0Njg2LCAgLTUwOTYsICAgNDI0NiwgIC0zMDk2LCAgLTM5OTcsCisgIC0yNTQsIC0xMTAyNSwgICAgMzk0LCAgIC0zNDUsICAxODc4MCwgICAtNjg2LCAgIC01MTcsICAtMzQyMiwKKyAgIDEwNCwgIC0yMTczLCAgIDI0MzksICAtNTQwMCwgICAgLTEwLCAgIDEwODQsICAgMTgyMSwgICAtNjAyLAorICAxNDMxLCAgICA0MDUsICAgMjE0MywgICAgNDk5LCAgICA0MDUsICAgIDM1MSwgICAgLTYyLCAgICAtNDcsCisgIDE5NTQsIC0yOTkxNSwgICAgNDQwLCAgIDEwNTQsICAgIDU1OSwgIC0xMjEwLCAgICA0NDIsICAgIDkyOCwKKyAgICAtMSwgICAgIDU5LCAgICAyNzksICAgLTExMiwgICAtMTEwLCAgIC00NDAsICAgLTM5NiwgICAgODA1LAorICAgMzExLCAgICA4NTgsICAgLTQzMSwgIC0xMDcwLCAtMzAxOTIsICAgIDEzNSwgICAxMjQ2LCAgIC0zNDUsCisgICA3OTAsICAgIDQ5OCwgICAgMzE5LCAgIC0zMDIsICAgLTQ2OSwgICAgLTEwLCAgICA1MTIsICAgLTgyOSwKKyAgLTUyNiwgIC0yMDUyLCAgIDI0NTYsICAgIDEzNCwgLTE5Mzc1LCAgLTEyMTAsICAtMTI5MiwgICAgNjQwLAorICAzMjMyLCAgIDI1ODAsICAgIDk3MywgIC0yNDEyLCAgICAyNzEsICAgLTI4MiwgICAgNjMyLCAgIC01MjMsCisgIC04NDcsICAgLTEzOCwgICAtOTkwLCAgIDI1MDEsICAgIDUzNiwgICAtMTY2LCAgIDIxMDAsICAgLTM1NywKKyAgIDEyMiwgICAgNDY2LCAgICAgLTQsICAgMjAzNCwgIDIwMDgzLCAgIDE1NzgsICAgIDQ0NCwgICAtMzQ0LAorICAtNjg5LCAgIDU3MzMsICAgLTQ1NiwgICAtNTAzLCAgIC01OTIsICAtMTM1MCwgIC0xMDM4LCAgICA5MzIsCisgLTE5MTYsICAgMTA5OCwgICAtOTkwLCAtMjI2ODcsICAgMTU0NCwgICAtNDQyLCAgIC0zOTYsICAgLTU3MCwKKyAgLTY4MywgICAtNjE2LCAgLTE0MzEsICAgIDExOCwgICA0MTEzLCAgIC0zMTIsICAgMjMwMCwgICAyMDkzLAorIC0yMzQ0LCAgLTI5NTUsICAgNjM0MywgICA0MzA2LCAtMTAwNzgsICAgNjI4NiwgIC01Nzk0LCAgIC04MDYsCisgICA2NjQsICAgLTIxNywgICAgNTQ4LCAgIDUwNzIsICAgNDYyNiwgIC0xNjQzLCAtMTE2MTksICAgIDc3OSwKKyAgMTk1NiwgIC0yOTYwLCAgICA2MTQsICAgMjA4NywgICA5MTA0LCAgLTI0MTgsICAgIDc3NSwgIC00NDQ3LAorICAgNzY4LCAgIDE1OTksICAtMTA4NCwgICAgOTk5LCAgIDE2NTIsICAgMTA5MCwgICAgNjMwLCAgLTExOTcsCisgLTM0OTUsICAgLTkxMiwgIC05ODE3LCAgICA2NDgsICAgMzI3OCwgICAxODI4LCAgMTM2MDUsICAgMjc1NywKKyAgLTgzMSwgIC0xMTkxLCAgLTE4NDYsICAtMTQ0MSwgICAtMjc4LCAgLTg1MzAsICAgLTQ1NSwgICAtNDk1LAorICAgMzIzLCAgIC05MTEsICAgMjUwMCwgIDE0MTAwLCAgIDM2MzUsICAgMTAxNiwgICAtOTM2LCAgIDUyNjUsCisgLTMwOTIsICAgMjEyNSwgICAtMTIxLCAgICAtNjQsICAgLTY1NiwgICAtMzM3LCAgIDk0MzgsICAtNzYwMCwKKyAgMTQwMywgLTExOTE3LCAgIDIxODAsICAgMjYxMiwgICAxNjY0LCAgIDEwOTEsICAgLTMxOCwgIC0zMzAwLAorICAtNDI3LCAgICAyODIsICAgMTk3OSwgICAgODk0LCAgIC03MDMsICAgIDUxNCwgICAgMTYwLCAgIDE2OTcsCisgIDY1MDgsICAgIDgyOCwgICAgMTg3LCAgICAtMzQsICAtMTA5NCwgIC0yODYxLCAgICAyNDAsICAtNTAxMywKKyAgNjAwNCwgIC00Nzk2LCAgIC05OTEsICAgIDE1OCwgIDExNDM3LCAgLTE3MzAsICAgIDM1NCwgICAxMTk1LAorICAzNzkwLCAtMTA0MzIsICAtMzU4NCwgIDEzODcyLCAgICAzMzYsICAgMjA0MywgICAgMjIxLCAgICA2MDQsCisgIDI5MzAsICAgMTA4MCwgIC0xNDE3LCAgIDE4NzgsICAgLTg3OCwgICAtNDU5LCAgIC00MTksICAgIDM2NCwKKyAtMTAzNywgICA3NzY0LCAgIDMxMDAsICAgICA0OCwgIDExMDU3LCAgIDE5MzYsICAgMjIyOSwgICA5MTUwLAorICAtNDcyLCAgIDExNzgsICAgLTEyOSwgICAyODc2LCAgIC0yNDksICAgLTI1OCwgIC0xMTgxLCAgIC0zMjksCisgIC01ODEsICAtMTE0MCwgIC0xOTY3LCAgICAzNDcsICAgLTUzOSwgICAtMzk0LCAgICA3NzUsICAtMTE1MSwKKyAgIC0zMSwgICAxMDUyLCAgLTE5MDAsICAgLTIxMywgIC0xNTUyLCAgMjI0ODQsICAgIDE2NCwgICAtMTEzLAorICAgMTM1LCAgLTEyOTQsICAgIDU1MCwgICA3NzM4LCAgLTcyMjMsICAgLTczOSwgICAxMzYyLCAgIDU1MTgsCisgICAxOTMsICAtMjE3MCwgLTExODYxLCAgLTEzNTcsICAgIDM1MSwgICAyMjE1LCAgICAxNjUsICAgICAxNiwKKyAgLTYwNiwgICAgNzI3LCAgIC0xNTgsICAgLTc3MiwgLTEzNDIwLCAgLTEyNDgsICAxMjQyMiwgICAtODEyLAorICAxNzY4LCAgIC00NDIsICAgMTI2OSwgIC0xMDc2LCAgICA4OTksICAgIDEyNCwgICAtMjQ5LCAgLTExMTAsCisgICA2NTMsICAtMzA2NCwgIC0xNjMyLCAgICA4MzksICAgLTIzMCwgICAgNTEyLCAgICA2NDIsICAxMzIzMCwKKyAxMzI4NSwgICAtNTUyLCAgLTExMTMsICAgLTU5NSwgICAgODY0LCAgICA1MzcsICAtMTAxMiwgICAtNTM5LAorICAtNjE1LCAgIC00OTEsICAgMTAxNCwgICAgODAwLCAgICAtMTAsICAgIDUzNCwgIC0xMjI3LCAtMjUwMTEsCisgIDEyMzksICAgIC0yNiwgICAzODM0LCAgICAxMDQsICAgIDc2MiwgICAxMjU5LCAgIDIxMTIsICAgLTMwMCwKKyAgLTkyMCwgICAtODEyLCAgICA2MTIsICAtMTA2MSwgICAtMzc4LCAgIC0yNDYsICAgICAtNywgIDExMDQyLAorLTE4NDkyLCAgLTE0MTEsICAgIC03NywgICAgNDA3LCAgIC01NTYsICAgIDIxOCwgICAxNzUxLCAgIDEwNjksCisgIC0yOTQsICAgMTc4OSwgICAgOTA0LCAgICAyODUsICAgIC03NiwgICAgMzAwLCAgIC0xNjAsICAgLTEyOCwKKyAtMzM5OCwgIC0yMDAxLCAgIDE2ODksICAgNDk0NiwgIC0yNzUwLCAgIDE0MjcsIC0xMjYzMiwgIC0xODczLAorIC0xODAyLCAgLTExMTUsICAtMjc3NywgIC00NDM2LCAgIDI5MzcsICAtNjQwOCwgICAtNDY3LCAgICA0ODcsCisgIDEwNDMsICAgMzkxNCwgICAgLTgxLCAgIDE1NDAsIC0xMTcxOCwgICAxMzY4LCAtMTI2NTYsICAgLTU4MywKKyAgMTAwOSwgICAtNDE2LCAgICAyNDksICAgMTg3NCwgICAxMTU3LCAgICA5OTQsICAgLTg1OCwgICAtMTU0LAorICAgMjk0LCAgICAzMzMsICAgIC0yNiwgICAgIDczLCAgLTE1NzYsICAgIC0yMCwgICAtNTYwLCAgLTEwNjgsCisgIDEzMjUsICAgLTU4OCwgIDI2MTYxLCAgIDE1ODAsICAgLTQxMSwgICAtNTg3LCAgLTEwODMsICAgIC03OSwKKyAgIDc2MiwgICAgMjkyLCAgIC02MjIsICAgIDc4OCwgICAgMjg0LCAgIDIwMTQsICAgICA3OCwgICAgNTU0LAorICAtNTE2LCAgIDEzNDAsICAgIDgzNSwgICAgMzAwLCAtMjQ4MjcsICAgIDU1OCwgICAtNzA1LCAgICAtMjIsCisgICAxMzksICAgLTE1OSwgICAtMjQ2LCAgIC01ODUsICAgNDMxOCwgICAgMjM0LCAgIDEzMDgsICAgLTE5OCwKKyAtMzM3MCwgICA1NzI0LCAgIDIzODEsICAxMzg0MywgICAgICA0LCAgICA1NjksICAgODAwMiwgICAxMTg4LAorICAgLTYzLCAgLTE2OTgsICAgNDYyNCwgICAtNDA1LCAgIC0yMTgsICAgNDIzOCwgICAtODg4LCAgLTExODAsCisgIDM3NTAsICAtNDg0OCwgIC05NDk3LCAgICAyOTMsICAtMTA4NywgLTEzMjc0LCAgICAtMzMsICAtMjg3MCwKKyAgIDQ1NywgICAtNjE4LCAgICAzMzgsICAgIC0zNCwgICAgMjg2LCAgICAzNDUsICAtNTMyMSwgICAgOTA0LAorIC01NjU2LCAgLTIwODIsICAxMjY0NCwgIC03NDIzLCAgICA1MzIsICAgIDk1OCwgIC0xOTk3LCAgLTE0ODMsCisgLTI5ODIsICAgMzExNSwgIC0xODUxLCAgLTIwMjUsICAgMTg1MywgICAtOTE4LCAgIC05MDMsICAgMTU1NCwKKyAgIDU0MCwgLTE2NTQ5LCAgIDE0NDEsICAgMjkzOSwgIC0xMjcyLCAgIDMxMDYsICAgMjM3NCwgICAzOTA2LAorICAtNjk3LCAgIDExNDQsICAgIDc1MCwgICAtMzc5LCAgLTY1MDIsICAgIDk4MCwgICAgMzg2LCAgICAgMzYsCisgIDExMDksICAgMTE5NSwgICA2MjcyLCAgIDQyNjQsICAgMTUwMSwgICA1MzY5LCAgLTE1NjAsICAgMzUzNSwKKyAgMTA4NCwgICAgNzM5LCAgLTEwMzEsICAtNDQwMCwgICA4NDUyLCAgIC00MzAsICAtMTc4NywgIC03NjY5LAorICAtMjMxLCAgIC0xMTUsICAgNDMyNCwgIC0xODIwLCAgLTIwOTgsICAgLTc4NiwgICA3NDc4LCAgLTI3MDksCistMTQyNTUsICAgNTc3MSwgICAgMTE1LCAgLTE3MDAsICAgLTExMSwgIC0xNDgyLCAgLTEzNjksICAgLTExMiwKKyAgIDEyMiwgICAtNDcyLCAgICAyMzMsICAgMjQyNywgICAxODE2LCAgICAxODAsICAgLTQ4MSwgICAgOTI4LAorICAgIDgyLCAgICAgODQsICAgLTcwMCwgICAtNDQ4LCAgIC05NDYsICAgMTk2OCwgICAxNjQ0LCAgICAxNjgsCisgIC0xNjcsICAxNjE2NCwgICAgMTU1LCAtMTAzMTYsICAgIDk0MSwgICAtNTg0LCAgICA0ODgsICAgICA5NiwKKyAgNTIwNSwgICAgNDkxLCAgLTE4NDQsIC0xMzA1NSwgICAxMjY2LCAgIC0zNTIsICAgLTgzNiwgICAgNTU4LAorICAxNTQ2LCAgLTE3MjAsICAgIDMxMywgICAyMDMzLCAgICA1OTcsIC0xNDM1MSwgICA0NDI2LCAgIDMyODEsCisgIC01NTksICAgMjYxNCwgICAzMjQ4LCAgLTIyNjUsIC0xMDMxMiwgIC0xNjE0LCAgIC0yODgsICAgIDQ4MCwKKyAgMTQxOSwgICAtNTQ2LCAgIC00ODUsICAgIDgzNSwgICAgOTYwLCAgICA0NjIsICAgIDkyMywgICA2NTE4LAorICAgODM0LCAgIC03MTEsIC0xMjYzOSwgICA4ODExLCAgIC0yMDcsICAgMTgwNiwgICAgMzM3LCAgLTEyNDAsCisgLTQ3OTYsICAgMjM4MywgICAgMjc3LCAgIDExNDEsICAgIDk2OSwgICAgIDU5LCAgICAxOTcsICAgMTM2NSwKKyAgLTYxNCwgIC05MTQ0LCAgIDQ4MjQsICAgLTQzNiwgICA0MTkxLCAgLTI1ODgsICAgNDUwOSwgICAgMzkxLAorIC01MDU1LCAgLTMyMzEsICAgNjk3OCwgIC02Mzg4LCAgICAgNTEsICAgIDEwNSwgICAtODYzLCAgIDEwNTAsCisgMTMxMDMsICAxMjc2OSwgICAtNDIwLCAgLTE1NjIsICAgLTEyMywgICAyNzAyLCAgICAyOTIsICAgMTA2MSwKKyAgIDEyMywgICAgNDA1LCAgIDE5MTcsICAgLTI3NSwgICAgNDkzLCAgICAtOTUsICAgLTE5NSwgICAgMTMwLAorIC0yNjEzLCAgIDkwMTAsICAgIDE5NiwgIC0xMzgyLCAgIDU5MDMsICAgNzI4MSwgICAxNTg1LCAgIDI1NTcsCisgIC04NzYsICAgMzE2NiwgICA2OTEwLCAgICA1OTAsICAtMzA2MCwgICAtNTU5LCAgIDQ3MjIsICAgIDM5MywKKyAgIDYxMywgICAtMzkyLCAgLTMwMjIsICAgOTg5MiwgICAxODA4LCAgICA5MjMsICAgODEyMywgICA5ODczLAorIC0xNjY1LCAgIDIzNDksICAgMjg5NCwgICAgNTkxLCAgIDIwMDAsICAtMzczNCwgICAtOTE3LCAgICAyMjAsCisgICA0MDgsICAgIDI5NiwgICAtNjU2LCAgIDI2MDgsICAtMTcwMCwgICAgNDAwLCAtMTA3MzQsICAgNTQzNCwKKyAgNjUwNCwgIC0xMzk5LCAgIDIxNzUsICAtMTIwMywgIC02MzU4LCAgLTEyMjEsICAtNTA2MiwgICAgIDQ1LAorICAgOTcwLCAgIC01MDAsICAtMTMyMiwgICAxMTc2LCAgIDU4ODIsIC0xMTY4NywgICA2MzI0LCAgLTIxODMsCisgIDIzMjcsICAgIDkyMiwgIC01NjI4LCAgLTM1MDcsICAgMjQwNiwgICAgODc0LCAgIDEzOTksICAgNDUxOCwKKyAgLTM0MywgICAgODU3LCAgIC0yMjQsICAgIDgwMiwgICAtNzI1LCAgLTg1NjEsICAgNDQzMiwgICAxOTc0LAorICAxODI1LCAgLTIxNjgsICAgLTQ1MSwgIC0zNDA4LCAgIDY1ODcsICAgNzU4OSwgICAzMzYxLCAgLTQ3MTEsCisgLTE0NzQsICAgMzE1MSwgICAxOTUwLCAgIDEwMjIsICAgMTQ2NiwgICA5MTkyLCAgIDQ2NjYsICAgLTgyMiwKKyAgMTAyNCwgICAyMzQyLCAgLTIyMjAsICAgMTE2OSwgIDEwNDYwLCAgIDI5OTMsICAgLTk4OCwgIC00NDA3LAorIC02NzI3LCAgICA5MDIsICAgMTY1OSwgICAgIDgwLCAgICAxMDYsICAgIDQwMCwgICAgIDM0LCAgIDE3NDYsCisgLTY5ODIsICAxMDQ4NCwgICA2MzMzLCAgIC04NDUsICAtMzMzMywgICAxNzY0LCAgICAyMTcsICAtNDczMCwKKyAtMzMwNiwgIC0zNjY0LCAgLTI4MzAsICAgMjI1NCwgICAtOTI3LCAgICAtNTUsICAgIDU4NywgICAxODEyLAorICAgMjgxLCAgIDQzNzUsICAtMzYxNCwgIC0xMzQ5LCAgIDE4MDIsICAtNjE4NCwgIC0yNjQ4LCAgLTQxODksCisgLTkzODEsICAtMzI0MywgIC00MTQ3LCAgICAzODQsICAgMjI0MSwgICA1NTI0LCAgIC00NzgsICAtMTUzNAorfSwKKworLmNiNDQ0OGwwID0geworLTE1NDAyLCAgLTUxNTYsICAtMTc5OCwgICAtMTQ0LCAgLTQ3MTEsICAtNDcwMCwgICAyODE5LCAgIC0zODksCisgICAxNDgsICAtMjYwMCwgICAxNzA2LCAgLTE5MDYsICAgLTU3OCwgICAgNDk1LCAgICAgMjQsICAgIDgyOSwKKyAgLTM4MywgLTEyNTgxLCAgMTE2NjcsICAtMTAzOSwgICAxMzk1LCAgIDI2NzAsICAgLTI4OCwgICAgIDIzLAorICAgNjI4LCAgIC0yNDgsICAgLTUxMiwgICAgIDc5LCAgIC0zMjYsICAtNTQyOCwgIC0yODMwLCAgLTI0NzYsCisgLTEyNTMsICAgLTkxNSwgIDEyMDQyLCAgIC02NzQsICAgLTExMCwgICAyOTUwLCAgIDM4ODUsICAtNTc5OSwKKyAgIDk4MywgICAgNjE2LCAgIC02NTIsICAgIC02MCwgICAtMzcyLCAgICAgMjIsICAgLTE0MSwgICAtMTY3LAorICAgIDk4LCAgICAxMjUsICAgLTEwMCwgIDI3MjExLCAgICAxMzMsICAgLTEyNywgICAtMjcxLCAgIC0yNzIsCisgIC0xNzYsICAgMTI2OCwgICAgMTczLCAgIC00MjIsICAgMjQzMSwgIC0zOTk4LCAgLTI3OTcsICAgMjMyOCwKKyAgIDE4MiwgICA2NTI2LCAgIDMzMTgsICAtNjI4MiwgLTEwNTgwLCAgIDM5NjYsICAgODUwNCwgICAgNTI3LAorICA5NTA3LCAgIDYyMDMsICAgIDk5MCwgICAtOTg5LCAgIDYwMzAsICAgLTEzNiwgICAgNjQ3LCAgLTExMDAsCisgIC0zMjQsICAtMjYxOCwgIC0yNDk5LCAgICA1MDAsICAgLTEzMiwgICAtODQyLCAgIDEyMzcsICAgMzU5OSwKKyAgMjI4NSwgICAyOTA2LCAgMTA3NjYsICAxMTI4NCwgIC0yNzk0LCAgICAyNDIsICAgIDE4NCwgIC0xOTM0LAorICAgIDU1LCAgIC04MzksICAtMTE4MSwgICAgNDA2LCAgICA4NTUsICAgIDkwMiwgIDEwNDkwLCAgIC0zMjcsCisgLTE1NjEsICAgNTc0MiwgICAgNDI4LCAgIDIyMTgsICAgMTUyMywgICA1MjI5LCAgIDkxMzAsICAgLTc2MCwKKyAgIDEwOCwgICAtMTQwLCAgMjIyMjksICAgMTEzMiwgICAgNDExLCAgICA3MjAsICAgIDQxNCwgICAtMzU2LAorICAtNzQ1LCAgLTEyNzYsICAgLTg5OSwgICAtNTYyLCAgICAzNjksICAgICAgNSwgIC03NzcwLCAgIDQxMDEsCisgIDM2MjYsICAgIDEyNiwgICAgLTEzLCAgLTQzNTYsICAgIDcyOCwgIC0zMTk3LCAgIDE5MzAsICAtMTQ3MCwKKyAtNjkzNiwgICAtNDEwLCAgIDY3MjAsICAgMTg5NywgICAtNTMwLCAgLTQyNjcsICAtMjE4MSwgICAtODc2LAorICAtNDcyLCAgLTI1NDAsIC0xMDIzNCwgICA0MDA4LCAgMTAyMTcsICAtMjU2MSwgIC0yMDIxLCAgICA3MTYsCisgLTEzNzgsICAgLTMyNSwgICAgNDI3LCAgIC0yNDUsICAgIDMxNCwgICAgLTQ4LCAgIC0xMTgsICAgLTE1MCwKKy0zMDI5NSwgICAtMzY4LCAgICAyNTYsICAgIDM2OSwgICAtNjU2LCAgICAtNzgsICAgLTI0NiwgICAtMTQwLAorIC0xMjUwLCAgIC02MzUsICAgMTMzMiwgLTEzNjA0LCAtMTAzODMsICAtMTM3NSwgICAgMzUzLCAgIDI0MTcsCisgIDIxNDAsICAgLTM0OSwgICAxNDYwLCAgICAtNTEsICAgLTMwOSwgICAgNTIzLCAgICA1MDksICAgMjM1MiwKKyAgMTIwOCwgICAtMzc3LCAgLTIwMjMsICAgOTcwOCwgICAgMzk3LCAgIDEyMTYsICAxMDYxMCwgIC00NDE2LAorICA1NTIwLCAgIDM5MDIsICAtMjExOSwgICAtNDgwLCAgIC00MjAsICAgMTE3MCwgICAgIDM2LCAgLTMzMDQsCisgIDE1NTAsICAgLTI2NiwgICAxNjgyLCAgIC04MDgsICAgMjQyMCwgICAyNzAwLCAgMTYyMzksICAgMzkxMCwKKyAgIDU3MiwgICAtMzc1LCAgICAgODUsICAtOTc3NSwgICAtMTIwLCAgIDIyMTQsICAgMjc3OSwgIDExNTEwLAorICAyNjI4LCAgIC00MTYsICAtMTc0MCwgIC0xMzA1LCAgIDEyMjYsICAgICA3OCwgICAgIDc4LCAgICA2MzUsCisgICA0MjIsIC0xMzg5MiwgICAxMzAyLCAgLTQxMTcsICAtMTIxOCwgICAyNjgxLCAgLTg0MzYsICAtMTcyMywKKyAgMjI5MCwgICAyODE1LCAgIDExNzIsICAgLTE4MSwgICAtNjc1LCAgIC00NzUsICAgLTc2MywgICAyMzk0LAorIC0zNjM5LCAgIDc5MDMsICAgLTY1OSwgICAyMzIzLCAgIDQ4MzcsICAtNjc1OCwgICA5NDYwLCAgLTE0ODAsCisgLTI0MDMsICAtMjc4MywgICAxNDk2LCAgICA4MDYsICAgLTQ1OCwgICAtMjQ2LCAgICAgMTIsICAgLTI1NCwKKyAgIDEyMSwgICAxNDc3LCAgIC02MzMsICAgLTUxMywgICAgNzkxLCAgICAyMDgsICAgLTM5MCwgICAtMTc3LAorIC0xMjkyLCAtMjA0NzEsICAtNDQwMSwgIC0yNjc4LCAgIDkwMjYsICAgIDEyOCwgICAtMjY1LCAgICA4MjIsCisgICAyNjAsICAxMTIwMiwgICAzMTMyLCAgLTE4NzksICAtMzg5MSwgICAxODg0LCAgIC04NDIsICAgLTEwNywKKyAgNzUxNiwgICAxMjA4LCAgLTE1NTIsICAgLTk5NSwgICAxMjAzLCAgIDIxNTAsICAxMTA0NCwgICAxMjg1LAorICAyMjgyLCAgICAgODAsICAgMTM0OCwgICA1MzQyLCAgIDIwODksICAgIDkyNCwgICAxNDcyLCAgLTE0NTQsCisgLTgyNTksICAgLTIyNiwgLTEwMjU5LCAgLTIzMzUsICAtMjQ0MiwgICAgMjI0LCAgIDMyNTcsICAtMTUyOCwKKyAgNjY4NSwgICAxNjMwLCAgIDE5NjksICAgICA0OCwgICA0ODAyLCAgIDYwNTEsICAgIDk4NywgICA4NjYyLAorIC0yMzY4LCAgLTQ5ODQsICAtMTk3NCwgIC00MDQ5LCAgLTUzMjAsICAgNTAwMywgICAgMjk5LCAgIC00MDAsCisgICA3MjcsICAgIDIwOCwgICAtMTg3LCAgIDI4MzgsICAtNDU0NywgICA5NjgyLCAgLTIyMzgsICAgMTA2NSwKKyAtMzIwNiwgIDEwMDkxLCAgIDQ5MTUsICAgMjk0NSwgIC0xNjM1LCAgIC0xOTgsICAgMTA3NCwgICAtNjk4LAorICAtNzE2LCAgICAtOTYsICAgMTM5MCwgIC0yNjQ0LCAgIDEwMDYsICAtNDE1NCwgIDEwNTg3LCAgIDExMzIsCisgIDI5MTIsICAtNzM5OSwgIC04MzUwLCAgICA3ODUsICAgIDE1NiwgICAtMjkwLCAgIC0xNDIsICAgLTM3NCwKKyAtMjE2MSwgICAxMDY2LCAgIDEzNTgsICAtMTc5OCwgICAzMDUwLCAgICAtMTksICAgIDQ1MiwgIDEwNDcwLAorLTEwOTQ4LCAgIDQxOTAsICAgLTk4NCwgIC0yMDg5LCAgIC03MjgsICAgMTUwMywgICA0MjczLCAgICA4MTIsCisgIDQ5NTAsICAtMzc1MCwgICAgODQ0LCAgLTEyMzEsICAtMTU4MiwgIC0yNTE3LCAgIDIzODUsIC0xMDUzNywKKyAgNTgwNywgIC00NjIxLCAgICAzMzIsICAgLTM1NywgLTEyNDg0LCAgIDE2NzYsICAgIDE2MCwgIDEwNzYyLAorIC0xMjI1LCAgLTEzNzQsICAgICAxNCwgIC0xMzg5LCAgLTI5MDAsICAgLTQ2NywgIC0xMjYwLCAgICA0NTksCisgIC04NjEsICAgIDEwMiwgICAxNzE1LCAgIDQyOTUsICAtNzMyNCwgIC03NDAwLCAgMTA0MzUsICAgIDI4NywKKyAgMTg2NiwgICAgNzY1LCAgIDE3MzAsICAgMzQzMCwgICAtNzQ0LCAgICAgLTIsICAtMTc3MywgICAgLTk2LAorICAyMDAxLCAgIDIxNjUsICAgIDExOCwgICA5Mjk2LCAgLTQ2NDAsICAtNDYxMiwgICA3MTM0LCAgIDUxMjgsCisgLTc5NjcsICAgIDQwNCwgICAtNDMzLCAgIC00MzMsICAgMjIyMiwgIC04MDUwLCAgIDIwMjMsICAgMjc2NiwKKyAgLTI2MCwgIC0yNDQwLCAgIDE2MDcsICAgMjQ0MiwgICA3NzYzLCAgIC00ODYsICAgMzc2NiwgICAyMzU1LAorICA3NTE1LCAgICAyMzAsICAgMTI0OCwgIC04ODczLCAgLTgyMjQsICAtOTEzNSwgIC0xNDAyLCAgLTE4MTIsCisgIDEyMjMsICAgIDE1MiwgIC0yMzE2LCAgIC03MzksICAgLTQwNSwgICAtNzg0LCAgIC01OTgsICAgIDYyNSwKKyAgIDUwMywgICAtMTc1LCAgIC01NzMsIC0zMTY5MywgICAgNTAyLCAgIC00NzgsICAgLTU1NCwgICAtOTM0LAorICAgMzg3LCAgICAtODAsICAgLTQ4NCwgICAtNzAxLCAgICAtMzQsICAgIC01MSwgICAtNDk0LCAgLTE0NjEsCisgIDEwMDUsICAgMjkyMCwgIDExNTMyLCAgIDI2NjcsICAtMTY3NCwgICAtODMyLCAgIDg2ODAsICAtNTc2NywKKyAgIDc4NiwgIC0xNTU4LCAgLTIwNjIsICAgMTAwOSwgICAtMzkyLCAgIDIwOTksICAtNzI3NywgIC0yNTg3LAorICA2MzAyLCAgIDMwNzAsICAgNDQ5NiwgIC0xNzEzLCAgLTQwNDIsICAtODEwOSwgICAxNjQyLCAgLTE4OTQsCisgIDM0NTAsICAgIDg0MCwgICAzNjMyLCAgICAxNjAsICAgIDU3OCwgICAgMTQ5LCAgICA3NjcsICAgIDc1NCwKKyAgIDIwOCwgICAtODcwLCAgIC02NzIsICAgIDI1MiwgICAgLTMwLCAgIC0yMTMsICAgLTQ4MiwgICAgIDUwLAorICAtNTc4LCAgICAgLTIsICAgLTE0OCwgICAgMjQ2LCAtMzE5MTgsICAgLTU2OCwgICAgMTMwLCAgICA0NzIsCisgICA3NjEsICAgIC0yNywgICAgLTUxLCAgICA0NTQsICAgIDE0NCwgICAgMTI0LCAgIDU4NDQsICAtODM1NCwKKyAgOTU2MiwgIC0zNzU1LCAgIC0yNjIsICAgMzI4NiwgICAxMTIwLCAgICA5ODMsICAgLTYyOCwgICAtNzM0LAorIC0xNzMyLCAgLTE0MjQsICAgIDM1MywgICAtNDAzLCAgMTU4NzcsIC0xMzU1MiwgICAtMzM1LCAgICAzMzcsCisgICA1MTksICAgIDE0MCwgICAgMjk3LCAgICAxNTAsICAgIDcyNSwgICAtNzgwLCAgICA4NzYsICAgLTExNiwKKyAgIC05MSwgICAtMTI4LCAgICAyNzUsICAgMjQ5OSwgICA5MzEzLCAgIC03NjgsIC0xMDQ2OSwgICAxMTQ4LAorICAyMTcyLCAgLTY0MTcsICAgMzI5MiwgIC0yMTg3LCAgLTExMDgsICAgMzA1NSwgICAxMTA1LCAgICA2MjUsCisgICA3OTQsICAgICA2OCwgICAgMzM3LCAgIDEzODQsICAgLTEwNiwgICAtNTE2LCAgICA1NzQsICAgIDg2OCwKKyAgIDg0OSwgICAtOTk3LCAgICAgODEsICAyNTc5NiwgICAgIDI4LCAgICAyMDYsICAtMzU1NiwgICAtMzUxLAorICAxMDU4LCAgIDExMjYsICAtNzgyNiwgICA1MzEwLCAgLTQxMDIsICAgNTM1MiwgIC02ODM1LCAgLTQwMzIsCisgIDE0ODcsICAgIDIzMCwgICA1NjE3LCAgICA5MzcsICAxMDQ4NCwgICAgLTcxLCAgIDI2NTMsICAgMTIwMywKKyAgICAtMSwgICAgNjY3LCAgLTE0ODksIC0xMDEzNiwgICA3NzgyLCAgIC03NjMsICAgIDc5MiwgICAxNDM0LAorICAtMTcwLCAgICAzNjcsICAgICA5NiwgLTIxOTkyLCAgIC0yNTIsICAgIDc1NiwgICAgMTQ1LCAgLTE0NzYsCisgIDE0MDgsICAgMTUyMywgICAtODE5LCAgIC01NzYsICAgLTQ3NiwgIC0xMDY4LCAgIC0yNDEsICAgIC0zOSwKKyAgMTU0NywgICA5NTUzLCAgIC02MjIsICAtMTc5OSwgICAxODYxLCAgIDYxMTUsICAgLTg2NCwgIDEwNjkwLAorICAtNTg2LCAgICA0NzAsICAgIDIwMCwgICAxMTYyLCAgICA1ODYsICAgICA0NCwgLTExNjUwLCAgIDM0NTMsCisgIDg3MzQsICAtMjc1NCwgICAtMTc4LCAgICAyMzYsICAtMjY1MCwgICAyNjU0LCAgIDI2OTksICAgMTE4MCwKKyAgNTMyNSwgICAtNDU4LCAgICAtNDAsICAgLTIxOCwgICAgIC02LCAgICAxMjYsICAgNjc5NCwgICAgNTA2LAorICAgODYwLCAgMTE4NjMsICAgIDY1MiwgICAxNjY1LCAgLTQyMTMsICAgNDg2MywgICAxNDI0LCAgIDU3MTIsCisgIC02NjMsICAgLTY4OCwgICAgLTEwLCAgLTE0MjEsICAgLTY3NiwgIC0xMzI1LCAgIC0zNzgsICAgLTMxMSwKKyAgLTQ5MCwgIDE5NTAxLCAgIDEyNDIsICAgIDI2OCwgICA0NTgxLCAgIDE1ODcsICAtMTE1MywgICAgODQ4LAorIC0xMzc4LCAgLTExNTksICAgIDUwNSwgICAgIDYzLCAgICA3MDQsICAgMTk0MiwgICAyMjA0LCAgLTIxMDYsCisgICAgNDQsICAgIDQ3OSwgIC0xMDk4LCAgICAzMzMsIC0yMTU5NSwgICAtNjE3LCAgLTY0NDQsICAgMzU0NywKKyAgMTI4MiwgIC0xNzg0LCAgIDQ2NjQsICAtMTMzMCwgICAyNjA3LCAgIDEyNDEsICAtMzU3OSwgICAgMjQ3LAorICAtODc1LCAgMTEzNTksICAtMzAxMywgICAtMTM2LCAtMTI4MTMsIC0xNDQwMCwgICAxODU3LCAgIC05OTgsCisgIDEzNDIsICAgMTE4NywgICAtMzM4LCAgIDEyNjMsICAgIDU3NSwgICAxMjI2LCAgIC05OTUsICAgIDU5NiwKKyAgIDQ0NiwgICAgMjkzLCAgICA3NjcsICAgLTM1NiwgICAgIDcwLCAgICA3ODYsICAgIDQ2NiwgICAgMjAyLAorICAgMTQ5LCAgICA4NDksIC0yODk5MSwgICAgNjUyLCAgICAxMjQsICAgLTIwOSwgICAtMTI0LCAgIC00MDYsCisgLTU0NjMsICAtMTQxMywgIC0xMzAwLCAgLTUzMzksICAtMTc2MSwgICA0NzcwLCAgIDI2ODAsIC0xMDU0MiwKKyAgMzQ4NiwgICA1NjAxLCAgIDI5MzIsICAgMTU4MSwgICAgNDg5LCAgICA1MjEsIC0xNjU4MywgICAgICAxLAorIC0xNTI5LCAgIDU5NDIsICAgMTIzNCwgICA0NzE0LCAgLTE2NDcsICAgMTE1MCwgICAyODAyLCAgICA2NDIsCisgICA1ODYsICAgMzgzNiwgICAgMjQwLCAgICAzMDcsICAgLTQ5MCwgICAgIDY3LCAgICA3NzEsICAgIDgxNiwKKyAgLTkwNiwgICAxNTU0LCAgIDEwOTAsICAtMjM1MywgICAtNjI5LCAgMTEyOTEsICAgMjk0MSwgIC0yOTgyLAorICA5NDczLCAgIDE0MzQsICAtNDM1MSwgIC04MDE3LCAgLTUxNzMsICAgODA3MSwgICAxOTMxLCAgIDEyODEsCisgLTQwNTUsICAtMzIyNCwgIC0xOTE4LCAgIC0yNzEsICAgLTIwNCwgICAgNjcwLCAgIDM0OTEsICAgIDEwNywKKy0zMTYyNCwgICAgMjI3LCAgICAgNzUsICAgIC05MSwgICAgMTA4LCAgICAxNzEsICAgIC01MywgICAtMjAxLAorICAgMzczLCAgICAgNjMsICAgIDExOCwgICAgMTI2LCAgIC0xMDQsICAgIDEyNywgICAgLTg4LCAgIDE4MTAsCisgMTE2ODgsIC0xMDI0MCwgICAgNTUwLCAgIDM2OTIsICAtNDk3OCwgIC0xNjE5LCAgICAgNDAsICAgIDkxMSwKKyAtMTA4MCwgICAgNTgwLCAgIC03NjcsICAgIDMzMywgICAgMTkyLCAgICA0MDMsICAgIDMwOCwgICAtOTA0LAorICAgMTQyLCAgMzExNjksICAgIDUwMywgIC0xMTAxLCAgIC0xNDYsICAgLTE0NCwgICAgIDM1LCAgICAxODEsCisgIC0zNTUsICAgICA1NCwgICAgNTkwLCAgICA0OTksICAgICA5NSwgIC0xNzY3LCAgICA0NDQsICAgIC00OSwKKyAgMjE2MCwgICA3MTc2LCAgMTIwMzIsICAgNjQ3OCwgICAtNzQxLCAgLTU1NzYsICAgLTY0NCwgICAtMTAxLAorIC0xMjUxLCAgLTEyNjgsICAgMjM2NSwgIDEwMDI5LCAgICA1MzcsICAtMTQ3NiwgICAgMzA3LCAgIDIxMDgsCisgLTI0NzgsICAgLTk0NCwgIDEwNzI1LCAgICAzNDksICAtNDI0MiwgICAtMTM1LCAgIDc1NzcsICAtNDQ5MiwKKyAgMTQ5MiwgIC0yNTEyLCAgIDc3MzYsICAtNTExOCwgIC02NzU2LCAgLTI0MzYsICAtMTg5MCwgIC0yMzkwLAorICAxNjIwLCAgICA5MTQsICAgMTY1OCwgICAgIDQ3LCAtMTE2OTIsICAgLTEzNCwgIC0xNzQwLCAgIC0xOTYsCisgIDk1MjEsICAgLTEzNiwgIC0xMzc2LCAgLTg2ODIsICAtMTEzNiwgICAxMDk2LCAgICA5MDMsICAtMTE0OCwKKyAgLTMzNCwgICAtMjI4LCAgICAgLTQsICAgLTY3NSwgICAtMTk5LCAgIDE5MTQsICAgMjgyNywgLTExMDk4LAorIC0yMTI5LCAgLTI1NTksICAgLTk3OCwgICAgMTc1LCAgIDE4MzIsICAxMDA3NSwgIC0yMzU4LCAgLTE4ODgKK30sCisKKy5jYjQ0NDhsMSA9IHsKKy0xMTUxNCwgIC0yODU4LCAgMTIzOTIsICAgLTMwNSwgICAtMjA2LCAgICA5MjksICAgIDQ3MywgIC0zMTIwLAorIC0yNzY2LCAgLTEwNjgsICAtMTIzNywgICAgNDIwLCAgIC03MTgsICAgIC0yMSwgICAtMzM2LCAgICAtNDUsCisgIC00NzgsICAtMTUxNywgICAxODMwLCAtMTI2NDQsICAgIDI1OSwgIDExOTc4LCAgICAyNTcsICAgMTQ5NCwKKyAtMTc1OSwgICAgMjQ3LCAgIC03MzMsICAgIDExMiwgIC0yMjQyLCAgICAyOTAsICAgIDIzNCwgLTEwMjYwLAorICAxNzgxLCAgLTE4MDYsICAtNDEwNCwgICAxNzQ3LCAgICAgMzgsICAgLTY5MiwgICA0OTcxLCAgLTkxMTMsCisgLTE5MjUsICAtMTU4MCwgICAtNjE1LCAgLTk2MDgsICAgMzc3OSwgLTExMTU4LCAgICA0NjksICAtNDczNiwKKyAgIDI5OSwgIC0yODE1LCAgIDIxMDgsICAgMTkxMCwgIC0yMzU2LCAgICAgNjYsICAgIDUyMywgICAtNDQwLAorICAyMjk4LCAgLTQyMTksICAtMjUxMiwgIC0xMTEwLCAgMTExOTIsICAgNTkzMiwgIC0yNjI5LCAgLTc5ODUsCisgIC05OTIsICAgIDc3NSwgIC0xMTM0LCAgIDMyODcsICAgIDkwMCwgICAtNjgxLCAgICAtMzksICAtMTIwNiwKKyAtMTcwOCwgIC02ODAwLCAgIC0zNjEsICAxMTAyNCwgICA4NDk2LCAgIC0xOTgsICAtMzg1NSwgICAxNDg2LAorIC0yNTQ3LCAgIDE3NzMsICAgICA1MCwgICAtMjc2LCAgIC0yODYsICAgIDc4NSwgIC03ODg0LCAgICA0MzgsCisgIDQ1OTAsICAgMjc5NCwgICA1MzMzLCAgIDU0NzYsICAgMjEwOCwgICAgNjYwLCAgIDM2MTAsICAgMjMwOCwKKyAtODUzOCwgICAgMjI0LCAgIC0xMzIsICAgIDEzNCwgICAgNzMxLCAgICA5ODgsICAtMTM2OCwgICAzODk0LAorICA0MzE4LCAgIDk5MTEsICAgLTEwNCwgICAgMzIwLCAgLTk1MDYsICAgMTcyMSwgIC01NjkwLCAgIDE3MTIsCisgLTg3NDcsICAtMTg3NiwgIC01MTIyLCAgLTEzMDQsICAgLTE2MiwgICAgNzUyLCAgIDM2NDYsICAgMTYyMSwKKyAxMTA4OSwgICAxMTE3LCAgLTE5NzEsICAgMTA1OCwgICAzMDcwLCAgICAxODAsICAyMzExMiwgICAgMTc1LAorICAgNDgzLCAgLTEwMjgsICAgLTUzOCwgICAgNDk3LCAgIDEwNTMsICAgICA2MSwgICAgNzg4LCAgIC00NTUsCisgICAgMjIsICAgIC01NSwgICAgLTMyLCAgIC0zMjYsICAxNTk1NiwgIC0yMDQ1LCAgICA3ODgsICAgOTc4NCwKKyAtMTE3MCwgICAtODE5LCAgLTM2NzcsICAgIDY0NywgICAtNDg0LCAgICA1NzgsICAgLTE2MCwgICAgMjg2LAorICAtNDIxLCAgICAyODksICAgODE0MCwgICAzODM4LCAgIC01NzgsICAtMTg2NiwgIC0yMDc0LCAgICA2NjcsCistMTE5NTEsICAgMTY4NCwgICAzNDM5LCAgIDEyODAsICAgIDE1OCwgIC0xNzg0LCAgIDEyNzYsICAgIDYzOCwKKyAgIDU2MiwgICAyMDQ1LCAgIC0yMjAsICAgIDg1MiwgICAtNTk0LCAgLTIxMDksICAtMjY2NSwgICAyNzQ4LAorICAgIDM4LCAgICAgOTEsICAgMTM3NywgICAtNjI0LCAtMTg1ODYsICAgLTQ5OCwgICAtODgyLCAgICAgMzYsCisgICA1MzYsICAgIC05OSwgICAgIDYyLCAgLTUyNzUsICAgMzA1MSwgICAgMjMxLCAgLTYzNDMsICAtMTc1MSwKKyAgMTIwNiwgIC0xNjQ2LCAgLTEzNDcsIC0xMzU5MCwgICAxNDMxLCAgIC0yNzEsICAgLTQ0MiwgIDIxOTM0LAorICAtMTQzLCAgLTE4MjQsICAgLTM3OCwgICAtNDYzLCAgICA4MTYsICAgIDM3OSwgICAgMzM2LCAgIC0yOTEsCisgIC02NTIsICAgIDI3NSwgICAtNzU4LCAgICAyNTcsIC0xNDg2NiwgIC0xMzA0LCAgIDcyNjAsICAtMzM3MywKKyAgMTI0OSwgIC0xOTkyLCAgIDI3MzQsICAtMjU2NSwgIC0zMDY0LCAgIC00MTYsICAgMjQyNCwgICAgMjc5LAorIDEwNTE4LCAgICAyMDYsICAgLTY4MSwgLTE0MzM4LCAgICA2NjYsICAgMTg0MywgICAtNjQ4LCAgICA1MjYsCisgIDE5ODIsICAgIDM2NiwgICAgNjg0LCAgIDEwMTksICAgIDE5MiwgICAgICA4LCAgIC00ODIsICAtNDc4NSwKKyAgMjEzNCwgIC0xNzIyLCAgMTA2NzQsICAtMTYxMywgICAgIDMzLCAgIDExNDgsICAtMTU2NiwgIDEwMjI2LAorICAzMzk3LCAgICA2NjcsICAtMTEwMCwgICAtNzM4LCAgIDI0MjAsIC0xNDI4MiwgICAgNDUxLCAgICAgOTAsCistMTAzNDYsICAgMjY3MywgICAxMTc1LCAgLTM2MzksICAgIDI2NiwgICAtNTY2LCAgICAgIDAsICAgMTY3MiwKKyAgMTA4MiwgICAgMjk4LCAgICAzNTksICAgLTQ5NywgICAxNzg0LCAgIC01NzAsICAtMjUzOCwgICAyNTIyLAorIC0zODI1LCAgIDYyNjUsICAgICA5OSwgIC03OTI3LCAgIDMxNjAsICAxMTA3OSwgICAgMTMxLCAgLTIwODAsCisgICAgOTIsIC0yOTk1MSwgICAgMjY4LCAgIC0yOTMsICAgIDI0MCwgICAgMjU0LCAgIC0xODIsICAgLTE0NSwKKyAgIDMwMywgICAgIDEyLCAgICAgODYsICAgIDU5NiwgICAgMjQ2LCAgICAxMzYsICAgMTAyMCwgIC0xNTIxLAorIC0xMTM0LCAtMTAxMjUsICAtNTY5MSwgICA2MDI4LCAgLTM3MDMsICAtNDI5NSwgIC0zNzE4LCAgLTU3MTksCisgIC01NjQsICAgIDY2MCwgICAtMzIxLCAgLTEwNzMsICAgICA4MywgIC0zMDY4LCAgIDYxNjcsICAxMjc4OCwKKyAgLTc2MiwgICA4MDU3LCAgLTEyMTUsICAgMjM3OSwgICAyMTQyLCAgLTM2MjUsICAgLTUwMywgIC0xNDE4LAorICAtMzA0LCAgIC02NDksICAgLTUwMSwgLTEyNTU4LCAgMTI3ODcsICAgMzczNywgICAxNDY1LCAgLTM2OTIsCisgLTEzMjEsICAgMTEwNiwgIC0xMTM2LCAgIC02NTEsICAgIC01MCwgICAxNjA4LCAgICAgNTksICAgLTU4MywKKyAgICA4MiwgICAgMzMxLCAgICA0NDMsICAgIDc4MiwgICAgIDkzLCAgICAyODUsICAgIDMxMCwgIDI5MTQ5LAorICAtNjk4LCAgICAtNTIsICAgLTkwOSwgICAtMjM4LCAgIC0yMjIsICAgLTExNCwgICAgICA0LCAgICA2NTAsCisgIC0yMDAsICAgIDIzNSwgICAyNTQxLCAgICA1OTgsICAgIDM3OCwgIDExMDAwLCAgIDMxMDEsICAtODIyOCwKKyAgMTY5MCwgIC00MzEzLCAgIDY5OTYsICAgIC0xMSwgIC0yNjIwLCAgLTE0NTgsICAtMTQyOCwgICAgNTc5LAorICAtMzA0LCAgICAgMjAsICAgLTM3MiwgICAgODk3LCAgICA2MDIsICAgIDQzMiwgICAtMTM4LCAgICA2OTAsCisgICA1OTMsICAtMTQ4NSwgICAgMTM2LCAgICAxOTEsIC0zMjE0NywgICAgMjYwLCAgICAxOTksICAgIDQxMiwKKyAgLTE2OCwgICAgLTQxLCAgIC0zODQsICAgLTM2MiwgICAgLTE0LCAgICAyNDIsICAgIDM2NiwgICAtMzE4LAorICAtMzA0LCAgIDE1NDQsICAgIDQ1OCwgIC03NzkwLCAgIDMzMzIsICAtNTExNywgIC0xOTM3LCAgICA4NjgsCisgMTI2MjIsICAgIDkwNiwgICAxOTQxLCAgIDQ3NjMsICAgMTY5OCwgICAgMzUxLCAgIC0yMzQsICAgLTk3MywKKyAgOTE2NiwgICA2NzI2LCAgIDI2ODYsICAgIDI0OCwgICAzNTk3LCAgLTk4MTIsICAgLTQwMCwgICA0MTU1LAorICAyODUyLCAgIC00MTUsICAgMjIxOCwgICAgODc2LCAgIDE0MjMsICAgMzg1MiwgICAyOTY1LCAgIC00MTAsCisgIDE4MjAsICAgODI2OCwgIC0xMjk2LCAgICA2ODYsICAgIDExNCwgICAzMDg3LCAgIDMwMDcsICAtOTQwMiwKKyAtNTc1MSwgIC0zNDU5LCAgLTY2NzQsICAgIDQxOCwgICA0MTM3LCAgIDQ3NzgsICAgICA1NiwgIC0xMzk5LAorIC0xNjk4LCAgLTI1OTAsICAgODM0MywgIC0yMTMwLCAgIDI1MzUsICAgNjE0OCwgICAtMTM0LCAgLTIzOTMsCisgMTE1NTEsICAgLTMzOCwgICAgNzM1LCAgICA2MzAsICAgLTY1OCwgIDEzMzU4LCAgICA5NDksICAtMTEzNiwKKyAgLTIxNywgICAtOTg1LCAgICAxODIsICAtMTAxNCwgICAxNDU5LCAgICAyMjEsICAgNzcxMywgIC0xMzg2LAorIC0xNDI3LCAgIDEzMjYsICAgIDU1NSwgICAgIDY2LCAgIDI2OTQsICAtMTUzNSwgICAtMjY4LCAtMTM1OTYsCisgICA2NTgsICAgIDMwNSwgICAgODU4LCAgICA1NDgsIC0xMjc0OCwgICAtNTgyLCAgLTEwNTUsICAgLTY1OSwKKy0xMjE1NSwgICAgOTQwLCAgLTIxNjQsICAtMjUxOCwgICAtMTI2LCAgIC0xMzIsICAgLTg0MiwgICAgNjQxLAorICAtNDgzLCAgIC00NDYsICAtNTE4NCwgICAtMTg2LCAgIC01MTEsICAgMTE2OSwgIC02MDkyLCAgIDYxNjEsCisgIDMwODIsICAgLTY2NCwgIC0yMDM3LCAgICA4NDcsICAxMTAzMiwgIC0xMzA2LCAgLTE2NzMsICAtMTIxOSwKKyAgIC0zNiwgICAxODYyLCAgMTAwNTMsICAgIDc4MCwgICAtMjgyLCAgIC04MzcsICAgLTI2MywgICAgNTA5LAorICAtNTg4LCAtMTI2NDYsICAgLTc2OSwgIC0yMTY0LCAgLTIyMTksICAgIDUyNCwgIC0zNDMzLCAgLTY0MzcsCisgIDM4OTAsICAgLTYyMywgIC03NTA5LCAgICAyNDEsICAgNDA0MiwgICAgMjY0LCAgLTEzOTQsICAgMzY0NiwKKyAtNjkyNSwgIC01MTg0LCAgIDEyMTgsICAtMTQ3NiwgIC0yMjQwLCAgIDE4ODIsICAgIDE4MiwgIC0zNDUwLAorICAtNDk3LCAgIC0xNDgsICAgIDE2MCwgIC0xNTc5LCAtMTk1NDUsICAgIC04MCwgICAgODg2LCAgICA5MTMsCisgICA3MDgsICAgIDcyOCwgICAgMzkzLCAgIC02MDMsICAgLTc3OCwgICAzNDE0LCAgIC03NzgsICAtMTQ5NSwKKyAgMTIwNSwgICAyMzQyLCAgICAyMzIsICAtMzYzNCwgICAgLTc2LCAtMTY3OTIsICAgLTY4NCwgICAxMzIyLAorICAgMTkyLCAtMTMyNDgsICAgLTY1OCwgICA3NjUwLCAgIDQ3MzEsICAgLTE2OSwgICA1MTQ4LCAgLTE0MTMsCisgIDMwMjYsICAgMjQ4MCwgIC0yMTkwLCAgIDEwMDQsICAtMjA4MiwgICAgMjM3LCAgICAxNzEsICAgLTcxNywKKyAgLTc2NiwgICAtNTI1LCAtMTE4MDIsICAtMzc3NiwgIC05OTE0LCAgIDEzNzQsICAtMzI1MCwgICAgNDE1LAorIC0yNzg3LCAgIC0xNzUsICAtMTA4MSwgICAgNzkyLCAgICA5ODAsICAxMTQ2NCwgICAgODM0LCAgICA3MTQsCisgIC05OTMsICAgIDE1MCwgICAgIDc3LCAgIDIzMDYsICAxMTI0OSwgIC0zMDU4LCAgLTM0MTgsICAtMTc1OCwKKyAgLTIzOSwgICAtMTE5LCAgLTE0MDgsICAgNjA4MywgIC00Mjc2LCAgIDE4MjcsICAgMTY2MCwgICAyMjg3LAorIC0yOTk3LCAgIC01NzYsICAgIDQwMCwgICAyMDYyLCAgLTMxNzQsICAtNjIxNSwgIDEwMDI2LCAgLTEwODIsCisgICAgNDEsICAgIDI0OSwgIDEwMDI2LCAgLTYxOTksICAgLTMwMSwgICAgMjgwLCAgMTAxMjAsICAgMjI0OSwKKyAgIDUyNywgICAtNTY0LCAgIDEwMDIsICAgIDYyMiwgICAzMzQxLCAgICA0MDgsICAgMjg3MCwgIDEyOTAyLAorIDEzMzA3LCAgICA2ODksICAgIDMzNiwgICAtODE5LCAgICAtNDMsICAgIDgzMiwgIC0xMjQyLCAgICA2NTcsCisgIC0xMDYsICAgICA0MiwgICAxMTIzLCAgICAxNDksICAtMjA3MiwgICAgIDc4LCAgIC0zMDMsICAgIDMyOSwKKyAyMTc0NSwgIC0yMTcyLCAgLTEyMDQsICAgIDQ0OCwgICAxNDM3LCAgIC01NjAsICAgLTM3NiwgICAgMzExLAorICAgLTczLCAgICAxNTMsICAgLTc4NSwgICAtMzY4LCAgICAgNTQsICAgLTQ0NSwgICAgLTkyLCAgICAxMjAsCisgICAtNTksICAgLTM3NywgICAgNDAyLCAgICA1NjcsIC0yNTgyMCwgICAxMjg0LCAgIDEyODgsICAgIDIwMCwKKyAgLTg2NSwgIC0xMjg2LCAgICAtNDEsICAtMTg2MiwgICAgNDAyLCAgICAxNzksICAtMjMzOCwgIC0zODc2LAorICA0OTkyLCAgLTE4MjQsIC0xMDA5MiwgIC0zNDA3LCAgLTg1MTYsICAtMzU1NiwgICAgMTMwLCAgLTU2OTUsCisgIDU4NDYsICAgMjMzMywgICAyOTk1LCAgIDIxMTAsICAtNjk0NiwgICA1MDQ5LCAgLTIzNzcsICAgMTY1NSwKKyAgLTg1OSwgIC00NzM3LCAgIDE2NDgsICAgNzAzMSwgIC03MzQ0LCAgIDQ5OTIsICAgMTc2MCwgICAtNzExLAorICAzMTM0LCAgMTQzNjMsICAgLTkwNywgICAgMTcxLCAgLTE5NzEsICAtMzA2MiwgIC0xMDc5LCAgICA2MDAsCisgICA2MDMsICAgLTIyNCwgICAtNDQwLCAtMTEzMjgsICAgLTI5MSwgICAtNjYzLCAgIDE4NzgsICAgLTcxNSwKKyAtMjcyNCwgICAgMjg0LCAgIC00NTYsIC0xMDk3MCwgIC0zMjI1LCAgLTIyNDAsICAgIDI1MiwgICAtOTc3LAorICAtMzYwLCAgICA3MjksICAgLTU3MiwgICAzOTgxLCAgIDE2MTUsICAgIC01MiwgIC01MzcyLCAgIDYwOTUsCisgLTk4ODgsICAgNjg3MywgIC0zODMwLCAgIDQ5MTYsICAgMTgzNCwgIC0xNTgxLCAtMTEyNjgsICAtMjMxNiwKKyAgLTM5OCwgICAxMzYxLCAgIDYxNTEsICAgMjczNiwgIC0xOTY4LCAgIDQ2MjQsICAgLTE4MCwgICAtMjYwLAorIC0xMjIxLCAgLTU2MzMsICAtMTMwMCwgIC0xMDgxLCAgLTE0MzMsICAgLTUwOSwgICAgMzY2LCAgIC0zODgsCisgIDE2NjAsICAgIDM0MCwgLTE4OTk3LCAgICA2OTQsICAtMTE4NCwgICAtODEzLCAgIDEzMjQsICAgMTI2MSwKKyAgIDczNSwgICAtMTg2LCAgIDUyNTgsICAgLTU4MywgICAtMjIxLCAgIDE3MDcsICAgIDE0OSwgICAxMDIyLAorICAtODM1LCAgIDEwODksICAgMjkzOSwgICAyMDI1LCAgICA0MjEsICAgIDQxMSwgICAzNjA5LCAtMTM3OTcsCisgICA0NjQsICAgOTIxNCwgICAyNDYyLCAgLTYyNTcsICAgNjAzMiwgICAxOTExLCAgIDEyODIsICAtOTY3MywKKyAgIDk3NCwgICAtNzAzLCAgIC0xMjgsICAgIDk1MCwgICAgMzY5LCAgIDExNjAsICAgLTY3NCwgICAtMzEyLAorLTEzODU4LCAgIDEwNzgsICAtNzYwNiwgICAgICA4LCAgIDI3ODYsICAgIDM2NywgIC02NDQxLCAgIC04MjQsCisgIC0xOTUsICAgIDcxNCwgICAgNDg0LCAgICAxMDgsICAgIDQ3NSwgICAgMjg5LCAgLTEwMTIsICAtMTU5MSwKKy0xMDg4MCwgICAtMzI0LCAgIC02NDcsICAtMjE5OSwgIDEwMzc4LCAgIDU3ODEsICAgIDk5NSwgICAtNDE2LAorICAgODcxLCAgLTEyNDAsICAgLTM4MCwgICAgIDcwLCAgLTE4OTMsICAgNzYzMiwgICAxNzI3LCAgIC05MDgsCisgIC02NzIsIC0xMDkwMSwgICAtOTYyLCAgLTczMjIsICAgIDc5NCwgICAxNzQ4LCAgLTU1NjgsICAgMTIxNSwKKyAgNTg0NSwgIC05NTc1LCAgLTI0MTMsICAtMjE1OSwgICAzMDc3LCAgIDEzNTksICAgLTQxNiwgICA2Mjc3LAorICAgLTg1LCAgIDEzNTIsICAtMzQ5OCwgICA2MTMwLCAgIDExMjUsICAgLTIzNiwgICAxOTUwLCAgIDg0ODEsCisgICA3MTYsICAgLTU2MCwgIC0xMzExLCAgIC0yMjgsICAgIDI1MCwgICAtNDQwLCAgLTUzMjAsICAtMTk0MSwKKyAtOTcxMCwgICA0NjM3LCAgIDE0MjAsICAgLTEwMiwgIC04MjIyLCAgICA2MTYsICAtMjI1NCwgICAtNTI4LAorICAgMTk2LCAgLTEzMTUsICAgLTc0OSwgICAgLTk3LCAgIC0yODUsIC0xNTg4MCwgICAxMTA1LCAgICA2MzAsCisgICAzNjgsICAgLTgwOSwgICAgIDI5LCAgLTE2ODgsICAtMjMxNCwgICAgNzQ1LCAgLTE2MjcsICAxOTg0MCwKKyAtMjM4MCwgICA0MTA4LCAgIDE2NzAsICAgMjc2MywgICAgMjc1LCAgICA1MzAsICAgIDQ5MiwgICAtNTg5Cit9LAorCisuY2I0NDQ4czAgPSB7CistMTA3MjAsICAgOTk5NywgIC0xMzEzLCAgIDg4NDksICAgNTE1MiwgICAtMjI2LCAgLTI5MDgsICAgIDMwMywKKyAgLTg0MiwgICAtODcwLCAgICAxNjUsICAtMTM3MiwgICAtMTA1LCAgIC0xNTQsICAgIDE3MCwgICAyNDI0LAorIC0yNDc2LCAgLTIxMjYsICAtODMyOSwgICAgMzQ5LCAgLTQ1MDksICAgNTEyOCwgICAgLTkyLCAgIDkwODYsCisgLTcyNjMsICAgIDQxNiwgICAtMTI0LCAgICAzNDEsICAgIC04OCwgICAgMjM5LCAgIDUxNzIsICAgIDU1MywKKyAgMTUyNiwgICAxNzI4LCAgIDE5NTUsICAtMTQ4OSwgIC02NTk1LCAtMTEyMzcsIC0xMDIyNCwgICAtMzk0LAorICAtOTI3LCAgIC05MzIsICAgIDY3NCwgICAgNzQzLCAgICAzMTcsICAgNDYyOCwgICA4NDUzLCAgLTM3NjgsCisgIDI1NDUsICAgMzUwNiwgIC0yNDA2LCAgIDkxMDgsICAgNTY0MywgICA0NjYwLCAgIDQxMTYsICAtMjQ1MiwKKyAtMTM5MSwgICAtMTU0LCAgICAtNzQsICAgIDE4MCwgICA1MjcwLCAgLTc5MjIsICAgICA0NiwgIDExMDQ2LAorICA2MDc2LCAgICA3MzUsICAgNzkyMiwgICAtMTk2LCAgLTEwODAsICAgMTQ0NSwgICAtNjg3LCAgLTI0MDMsCisgIC03ODQsICAgIDc0MiwgICAtMjY5LCAgIC00OTgsICAgNjAxMCwgIC00MDQ1LCAgIDEwNTMsICAgIDg5MSwKKyAtMTUzOCwgICAgNjEzLCAgICAtODQsICAtNDI1NCwgICAtOTU3LCAgIDQ2ODIsIC0xNDAwNCwgICAyMDUwLAorICAtNjQ3LCAgIC03MTgsICAgIDU1NywgIC0yNzIwLCAgIDI0MzcsICAtNzY3NSwgIDExODc0LCAgLTkyODQsCisgIC03MzQsICAgIDc3NSwgIC0yMjMxLCAgICAxMDUsICAgIDM2NiwgICAxMzYwLCAgICAtOTgsICAgLTEyNiwKKyAgIDUwOCwgICAyNjQ3LCAgICA3MjksICAgIDc2MiwgIC04ODA2LCAtMTA0MTMsICAgOTAwOCwgIC0yMDkzLAorICAxMTA3LCAgICAyMDEsICAgMTQyMSwgICAxMTgxLCAgIC0yNTksICAgMTQyMCwgICAgODI4LCAgICAzMjcsCisgLTE5NTYsICAgLTU3MywgICAtODc0LCAgICAzNTQsICAgMjY2MiwgIC0xNDM3LCAgMTA4NjQsICAtOTI0MCwKKyAtNzY0OCwgICAxNjcwLCAgIDE1OTgsICAgIDE3MywgICAgNDM4LCAgIC0zNzMsICAgLTU2NiwgICAgMjQ2LAorLTExOTk5LCAgIDE4MTcsICAgLTYxMSwgICAgICAxLCAgLTE2NTIsICAgMTg3NiwgICAxMzU0LCAgIDEyNzAsCisgIC03ODksICAgIDMwMCwgICAtMzIxLCAgMTE1NzcsICAgLTUxNiwgICAgMzI5LCAgIDU3MjMsICAgNDczMiwKKyAgMTcxNywgIC02MjI0LCAgLTUzNTYsICAtNjI5MiwgICAtMzcwLCAgLTM2NDQsICAgLTkyMiwgICAgLTUwLAorICAgLTE0LCAgIC01ODEsICAtMTU1NCwgIC0xNjc1LCAgICAtMjAsICAgLTk2NSwgIDI4NDc5LCAgICA2NTgsCisgIC00OTgsICAgLTQ4OCwgICAgNTA0LCAgIC02MDEsICAgIDQzNywgICAtNTg1LCAgIC0yNDUsICAgLTE5NiwKKyAgIDE4NiwgICAgMjgxLCAgIC0xNzQsICAgIDE1OSwgICA3NDY5LCAgIDU4OTAsICAtNTExMiwgICA0OTE4LAorIC05MDIzLCAgIC0zNjAsICAgICA0MCwgIC0yOTc1LCAgIDQ3ODQsICAgLTQzNywgICAxNjA5LCAgIDEwMzIsCisgIDI3NTksICAgLTI5NywgICAgMTA2LCAgIDUxNzYsICAtNDMxNSwgICAgNTY4LCAgLTk1MzYsICAtMTI5NywKKyAtNjc4MywgLTEwOTY1LCAgIDEyODUsICAgIDI2NCwgICAgMzMwLCAgIC01MDgsICAgLTUyMiwgICAgNjI0LAorICAgNjYyLCAgICA1MzksICAgNzI0OCwgLTEzNzgwLCAgICAgNDAsICAgMjE0MCwgIC0yMTg4LCAgIDE5MjUsCisgLTg5NzIsICAgMTE0NywgIC0xMzQwLCAgICA4NzAsICAgIDc3OSwgICAgIC00LCAgIC0xMDEsICAgLTM3NCwKKyAgIDc4MSwgICA1NzMzLCAgLTU3MTIsICAtNTc3NywgICAyMDgwLCAgICA4NzUsICAxMzQ1MCwgIC0xNTUxLAorIC0zMjI5LCAgLTE4MTgsICAgLTExNCwgICAxMjY1LCAgICA1MDEsICAgIDYzNiwgICAtNTc2LCAgIC02MjMsCisgLTEyNjksICAgMzAwNiwgICAxMDIzLCAgICA4NjIsICAgMTM1OSwgICAxOTUwLCAgICA1ODgsIC0yMjY0OCwKKyAgIDIxOCwgICAtNDM4LCAgIDE1NDcsICAgLTQwOCwgICAtODQ0LCAgIC0yNjMsICAgLTEwNiwgIDE0NzU0LAorICAtNjg5LCAgLTk0NjYsICAgLTk3OCwgICAgLTIxLCAgIDE0MTIsICAgICA0MywgICAyMDEyLCAgICAzNTIsCisgICA5MDgsICAgIDI3NywgICAtOTYwLCAgIC03NDcsICAgLTIzMCwgIC0xNTU3LCAgLTcxMzIsICAtNTcwNywKKyAgICA3OSwgIC0yNDc0LCAgIDIxNzcsICAtNTM0OSwgICAyNTEwLCAtMTI3MjAsICAgMjgzMywgIC0yMTUyLAorIC0xNjkzLCAgICA0NTgsICAgIDE5NywgICAtNjQzLCAgICA3MzUsICAtMjcyOCwgICAtODkzLCAgIDI3NTgsCisgIDUxOTYsICAtMzU2NiwgIC00Mjk0LCAgLTQ5MTQsICAtMTIyMiwgICAgMTg4LCAgLTg4ODQsICAtNjIzNCwKKyAgMjM5MSwgIC0xNTE4LCAgICA2NjMsICAgIDU3MiwgIC0xNDY1LCAgIDExNDcsICAgODQ4NiwgICAyMDM3LAorICAyNTE2LCAgICA5NDEsICAgNjA5MiwgIDExNjAyLCAgLTI1NTksICAtMTcwMiwgIC0xODQ4LCAgIC05MjQsCisgIC0yMTAsICAgLTEwOCwgIC0xMDUyLCAgIDgzNjAsICAtNzU2NywgIC00NTg4LCAgIC0xNjksICAgMzQ2NCwKKyAtOTIwNiwgICAxODQyLCAgLTQzMjksICAtMjQ5OSwgICAtMzQxLCAgICA1OTIsICAgIDkxOCwgICAtMTAyLAorICAgMzQwLCAgICAyMTQsICAgMTAzNywgICAtMzI0LCAtMTYyODksICAxMDMwOCwgICAgLTQ3LCAgICAtMjksCisgIDEzNDAsICAgLTYwMywgIC0yNzYzLCAgIC01NDgsICAgIDM5MiwgICAxNDg5LCAgIC0xNDksICAgLTc2OSwKKyAgIC02NywgIDEzMjcwLCAgLTIyMzMsICAgODI1NywgICAxNTgyLCAgIDEwMzQsICAtNDI3MCwgICAgOTE2LAorICA0NDg2LCAgIDExOTEsICAgLTEwMiwgICAgMTU5LCAgICAxMDksICAgLTUzNiwgICAtNjY0LCAgIC05ODcsCisgLTgwNDEsICAtMTc1OSwgICA0MjY0LCAgLTU2MDAsIC0xMzgxNSwgIC0xMTU4LCAgIDE3MTIsICAgMjUxNiwKKyAgLTYzNCwgICAgNTA0LCAgICA1MTUsICAgIDczMiwgICAgLTQ2LCAgIC02ODUsICAgLTQ4MSwgICAxNjg1LAorIC0xNzgyLCAgICAyNjIsICAtMzYwMCwgIDE0NzIxLCAgIDYzMzQsICAgNzk0MSwgICAgMTAxLCAgICA5MTQsCisgLTIxNDEsICAgICAtMiwgICAgMTgyLCAgICA4MjksICAgLTIxNSwgICAtMTIyLCAgIDYzMjUsICAtMzc1MiwKKyAtMjgxMiwgICAxNjE4LCAgIDM1MTIsICAtMTU5MSwgIC00Mjc2LCAgIDY5OTQsIC0xMDM0OSwgIC01Njc1LAorIC0xNTAxLCAgLTE3NjYsICAtMTk0OSwgICAgNDM2LCAgICAgODIsICAtNTU5NiwgICAyNTkyLCAgLTEwODYsCisgLTI4MDQsICAgMjU0MCwgICAgNDU4LCAgIC01NTAsICAtMTgzNCwgIC0yNDAxLCAgLTc1NjMsICAgMjM0MCwKKyAgMTY3OCwgIC03NjY2LCAgIDQ1MzgsICAgICAyNywgICA2MzM3LCAgIDM2NDIsICAxNzA2OCwgICA1MzEwLAorICAxMTE1LCAgIDE1NzksICAgLTE0MiwgICAtMzk3LCAgIC02NzAsICAgMjAxMCwgICAgODYzLCAgIC01MDQsCisgICA4NDUsICAgIDg0OCwgICAgNzcwLCAgLTg4MjEsICAgMTk2MywgICAyNzgyLCAgICAxNjIsICAgMTEzMCwKKyAgMjU5NywgLTEzNjk5LCAgLTM5OTYsICAgIDgwMCwgICAyNDk5LCAgLTEwNDUsICAtMTUxMiwgICAtMTg2LAorICAgLTU5LCAgIC0xMTksICAtNTA0OCwgICA2ODAwLCAgLTg3NjYsICAgIDc4NCwgIC03MDkxLCAgLTEwMDIsCisgICAzMzUsICAgMTk5MywgIC0xMDQ1LCAgICA2MDEsICAgMTgwNCwgICAgMTY2LCAgIDEzNDMsICAgIDExMCwKKyAgLTIyNCwgICAyMjQ3LCAgIC0zNDQsICAgICAtNSwgIC00MjkyLCAgIDU4NDYsICAgODU5MSwgLTExODQ2LAorIC0xMzAzLCAgLTEwMjcsICAgMTc1OSwgICAtMTY4LCAgIC0xOTQsICAtMTI4MSwgICAgNDg5LCAgICAzNzgsCisgLTUwNjksICAtMzMyMSwgIDExMjM4LCAgIC0zNzUsICAgLTgwNiwgICAzOTYyLCAgIDk2NjAsICAtMjk2MCwKKyAgLTY2NCwgIC0xMDY3LCAgIC02MjcsICAgIDI3MSwgICAxMjA1LCAgIDExNjAsICAgIDI2MSwgICAzNzI1LAorICA3ODc3LCAgIC02NzksICAgICAyMiwgICAgNTk4LCAgLTEwODYsICAgLTQyMCwgICAyMTY4LCAgICAtNDYsCistMTU1NTIsICAgIDQyMCwgICAxMjIwLCAgIDEzMzIsICAgIC01OCwgICAtMTU2LCAgIDc3NzcsICAtNDY1NywKKyAgIDM1MiwgIDE1MzE2LCAgLTQ3NjAsICAtMjE0MCwgIC0yNTc3LCAgLTEzMjEsICAgMjAzNywgICAtMzcxLAorIC0xMjU0LCAgIC05MTIsICAtMTE3NywgIC0xMzY3LCAgIC0xMDMsICAgNDU3MiwgIC05NDgyLCAgLTE1OTksCisgICAyOTQsICAgIDQwMywgICAtMjcyLCAgLTIzMzEsICAtNDM2NSwgIDEzNDY3LCAgIDQ1ODUsICAtMjU1NCwKKyAtMTc0MywgICAgNTQ1LCAgICAxNjIsICAgLTM2OSwgICA2MDc0LCAgMTEyNzMsICAtODg1NiwgIC04MTc1LAorICAyNTQzLCAgICAgLTcsICAgIDMxNCwgIC0yMDMzLCAgIDI3MDQsICAtMTc1NSwgIC0xNDMxLCAgIC03OTEsCisgIC0yNzYsICAgMTA4NSwgICAgMjM2LCAgIDY1NTMsICAgMTg3MiwgICAgMzg3LCAgIDEwNTYsICAgIC0zMSwKKy0yMDYxMCwgICAtNjA5LCAgICA2MDgsICAgMTAwNywgICAxNjA0LCAgLTE1MDEsICAgIC02OCwgICAtNTI3LAorICAgMjA0LCAgICAyNTIsICAgMjUzMywgICAtNzIxLCAgIDE0NjgsICAgIDQ0NCwgICAgLTcyLCAgICAgNjEsCisgIC0yMDksICAgIDUxMiwgICAtMjE2LCAgICAgNDIsICAgIDM4NSwgICAtNDkwLCAgIC0xMDQsIC0yOTAzMCwKKyAgLTE2NiwgIC00ODgzLCAgLTI3NTQsICAgIDc4OCwgICAtNDMwLCAgIC04NjcsICAgIDU2NSwgIC0xMTU1LAorICAgNTYyLCAgIDEwNzYsICAgMTc1NywgIC0yOTkwLCAtMTQ5NzEsICAgODM5MiwgICAgOTAyLCAgICA1NTAsCisgICAxMDIsICAtNjU3OSwgIC02OTM5LCAgIC0zMTksICAgIDE3MiwgICAtODYzLCAgICA5NzksICAgMjE3OCwKKyAgIDYzMCwgICAgMTYwLCAgICA5NTIsICAgIDk0NiwgIC0zOTU1LCAgIDE1MTUsICAgIDM1MiwgICAyNTU3LAorIC01MzM5LCAgIDYxNjYsICAgNDU4OCwgIC0yMDQwLCAgIDQwMzEsICAgLTUzNSwgIC0yNTA0LCAgIDI3ODIsCistMTIxMzYsICAgMTMzOCwgIC0yNzU4LCAgICA0NTgsICAgLTY3MSwgICAgMTU1LCAgIDY5OTgsICAtMjU5OCwKKyAgLTkzMSwgICAtMzk2LCAgIC05MjIsICAgMjA2MCwgICAgNDQ3LCAgICAtNDIsICAgLTY0OSwgICAtNTMyLAorICAtNTUyLCAgLTE5NDUsIC0xNjU0OCwgICAgODE1LCAgIC00MDgsICAgMzQ2OSwgIC00MTE4LCAgICA4NzUsCisgLTEwMTcsIC0xMTE1MCwgICAtNTExLCAgIDM4NDYsIC0xMTM0OSwgIC0xOTI4LCAgIC03ODEsICAgMjc2NSwKKyAgLTY4MSwgICAtNzEzLCAgICA2NTUsICAgLTIxOCwgIC04MDMyLCAgIC00NjUsICAgIDI5NSwgICAxNTkxLAorICAtMzgzLCAgLTE4ODksICAgMTYyNywgICAgMTA4LCAgIDExNDksICAgMjUxMywgICAgMzg4LCAgLTU3MDIsCistMTU2OTMsICAgICAyNCwgICAgNDcwLCAgLTQzMjIsICAgMzcyMSwgICAxNTg0LCAgIDE4MDgsICAgIDM1MCwKKyAtMTc2NSwgICAtNjIwLCAgLTI5NTMsICAgNDM1NCwgICA4NTEyLCAtMTI1MzMsICAgIC04NiwgIC0yNDkwLAorICAtMTkyLCAgIC01MDcsICAgMjAyNCwgICAzOTQyLCAgIC04MDEsICAxMzQ0NCwgICAgNzM4LCAgLTIwODYsCisgICAxNjIsICAgMjAxMywgICAgODM3LCAgICAgNTYsICAgLTM4NCwgICAzMTY0LCAgIDUwNTIsICAgMTE1OCwKKyAgLTQwMywgIC02OTEzLCAgLTQyOTAsICAtMjA2OCwgIDE2NjIyLCAgLTI3MzgsICAgIDg1NiwgIC0yODg0LAorIC0yNDMyLCAgIC00MTAsICAtMTE3OSwgICAtNDU2LCAgICA1MDQsICAtMTM1OSwgICAgNDM2LCAgICAzNTIsCisgLTYzNTEsICAgIDMyNywgIC0yMTk2LCAgLTE1MDIsICAgIDMwMiwgICAgMzM4LCAgIC04MzksICAgIDIzNSwKKyAgLTUyMCwgICAxMjgzLCAgIDI3MTAsICAxODgxNCwgICAyMjU2LCAgICAgLTIsICAgIDQwMCwgICAxMzAwLAorIC0xMTg1LCAgIDEwMjQsICAtMzc0NCwgIC0zNTQyLCAgLTQzNTAsICAgLTc2MywgICAxOTAyLCAtMTQ3MzcsCisgIDU0MzcsICAgICA0OCwgIC0xNTg5LCAgIC0yODAsICAgIC02NywgICAgMjMyLCAgIDIyNzYsICAgMTQxMywKKyAgMzI4NCwgICAtMzA4LCAgIDEwMTMsICAgIDYxMCwgIDIyNzg3LCAgIC02ODUsICAgIDcyNCwgICAgIDEyLAorICAtMzU5LCAgLTE2NTEsICAtMTA2MCwgICAgNTY5LCAgICAyNDgsICAgMzgzNiwgICAgNjA1LCAgIC00MTMsCisgIDMzODAsICAtMTM2MCwgIC0xMTIwLCAgLTI5MzMsICAtMjM2OCwgICAtOTc3LCAgMTAxMzUsICAxMjM1NiwKKyAgMzczOSwgIC0xNTcxLCAgIC00MTgsICAgIDU4MCwgIC0yNjYyLCAtMTE0NjAsICAtNjEyOCwgICAyODY3LAorIDExNDY4LCAgICA4MjUsICAtMzIwMSwgICAtNTAxLCAgIC0xMzgsICAgLTc1NSwgICAtNTU0LCAgICAxNjgsCisgICA3NTcsICAgLTU2NCwgICAgNDI4LCAtMTIxMTgsIC0xNTE3OSwgIC0xOTc4LCAgICA0MzIsICAgLTU5NywKKyAgMTUyOCwgICAzMDM4LCAgIC01NjgsICAgMTM0OSwgIC0zMzc3LCAgICA5MTQsICAgIDQ5OCwgICAgOTI4LAorICAgLTkxLCAgICAgLTUsICAgOTE5MiwgICAzMDAwLCAgIDI1NDIsICAtMTQxMSwgICAgNjI2LCAgIDI3MDUsCisgIC03NjMsICAgMzI0NywgIDEzNzM2LCAgIDMwMzQsICAgMjE3MCwgICAgLTY3LCAgIC04NTIsICAgLTM3OCwKKyAgMTI2NCwgIC0yNzcxLCAgLTI0MTUsICAtNDIzNiwgICAgMTI2LCAgLTE5ODQsIC0xMzMzNiwgIC0xMDg4LAorICAtNDE2LCAgLTE5NzksICAgLTUyMCwgICAyNTA2LCAgLTE1MDUsICAgIDI5NCwgIC0yMzk4LCAgICAyMTgsCisgLTg3NDAsICAtMzg3MywgICAyMDY5LCAgLTEzNzQsICAgICA4NiwgICAtOTk4LCAgLTM4NTEsICAgMTA3MCwKKyAxMzM1NywgICAgOTU1LCAgIDMwODUsICAgLTUzNiwgICAgMTY2LCAgICA5MjYsICAgIDI5OSwgICA2NTMyLAorICAxMzI0LCAgIC01MDIsICAtMTY1OCwgICAxODI5LCAgLTEyNjMsICAgIDQ0NSwgIC0xOTAyLCAgIDE0NTIsCisgLTI3NDcsIC0xNjQyMiwgICAxODc1LCAgIDE3NzMsICAgIDQ1MiwgICAgMjg4LCAgIDU5OTIsICAgMTYyNiwKKyAgMzY1OSwgICAtOTE3LCAgIDIyNTUsICAtMTUwOCwgICAgMzU2LCAgICA1NDcsICAgIDE1OCwgICAgICA5LAorICAtMTE3LCAgLTE2NjUsICAgLTU5NSwgIDE0MzkyLCAgLTEwMTMsICAgICA0OSwgIC00MDYwLCAgMTIwNjQsCisgIDM2NjYsICAtMjkwMywgIC05MTQ1LCAgIC0zOTYsICAtNDM0MSwgICAtOTUzLCAgIDI3NTgsICAgLTE3OCwKKyAgLTIwNCwgICAtNDYyLCAgICAgOTgsICAgIDIyMiwgIC0zNjIyLCAtMTIyMDAsICAtNDQ4NCwgICAgLTk0LAorIC04NjQyLCAgLTU2OTQsICAgNDAzNCwgICAtNzIwLCAgLTE2OTUsICAgIDc1MSwgIC0xNjY4LCAgIC0yNjYsCisgIC0zNDMsICAgIDI5NiwgICAtMTEyLCAgIC05MDAsICAtMzc1MCwgICAtMzYwLCAgIDEwMDIsICAtNzQwMiwKKyAgNzc1OCwgICA3MzcwLCAgIDMzMzIsICAtNzUxNywgICAtNzY5LCAgLTEyNzIsICAgIDQxMiwgIC0xNDUxLAorICAgLTg5LCAgIC0yMjcsIC0xMTMzMiwgICAtNDcyLCAgLTExMDgsICAgLTM5NCwgICAtMzM5LCAgLTE5ODEsCisgLTM0OTQsICAxMjExMCwgICAtNTY0LCAgLTU5NTgsICAgLTY5MCwgIC0xMDY2LCAgIC0xMzAsICAgIDc2MiwKKyAgIC01MCwgIC0xNDU2LCAgLTE1MjEsICAtODQyOCwgICAgOTk0LCAgIC04NjcsICAgMjY1MCwgIC0yMzM1LAorICAgMzU0LCAgLTIyNTMsICAgNDYxMiwgLTEyMzY0LCAgLTI2MjYsICAgMTg1MywgICAgNTc3LCAgIC0xMDMKK30sCisKKy5jYjQ0NDhzMSA9IHsKKyAyNTkwMSwgICAtMjM5LCAgICA2NDgsICAgIDE2NywgICAtMjg0LCAgICAxOTgsICAgLTM0MCwgIC0xMTEyLAorICAgLTU1LCAgIC0yNDIsICAgLTIxNCwgICAgNTI4LCAgICAxMTIsICAgLTI1OSwgICAtMjg0LCAgIC0yNTAsCisgICAgMjMsICAgIDQ3NSwgICAgNzgwLCAgIC01NTgsICAgIDExMSwgICAgMTQ4LCAgLTI0MTEsIC0xOTgyNiwKKyAtMTE1OCwgICAyNzk5LCAgIC05NjQsICAgICA0NCwgIC0xMjA0LCAgIDExODcsICAtNDAzNiwgICAxODcyLAorICAzNTQxLCAgICA3NjgsICAgIDE1OSwgICAxOTc5LCAgIDMzODIsICAgLTExMywgICAgODA0LCAgLTEwMjEsCisgIDM3MDgsICAtMjU3NywgICA5Njk3LCAgMTE1MjcsICAgLTMyNiwgIC03MDU4LCAgIDQzMDYsICAgMTI2MCwKKyAgMzc4MiwgICAzMzcwLCAgIDE1OTUsICAgIDcwNSwgICAyMjY4LCAgIDIxODIsICAgMTUwOSwgICAxMTMxLAorICA5ODc3LCAgLTcyNjAsICAgLTI1OCwgICAgIDQ5LCAgIDE2ODYsICAtMTQ3MiwgIC0yNTU2LCAgLTE5NzMsCistMjI0MjUsICAgIDMzOCwgICAgNDg2LCAgICA5NjMsICAgMTA2OSwgICAgLTM0LCAgLTEwMjcsICAgIC05MCwKKyAgLTg4MSwgICAtNDczLCAgICA1NTQsICAtNjMyNiwgICAtODczLCAgLTk3NDQsICAxMDE1NywgIC0xMDc5LAorICAgNTg0LCAgLTEwNDcsICAtMTk1NCwgICA2MjA0LCAgIDI0MTYsICAgLTg5OSwgICAxNDUyLCAgICA5MzgsCisgIC00MzksICAgLTY2NCwgICA0MjMxLCAgIDkzNzAsICAgNzgwMCwgICAgMTcwLCAgIDk0NDgsICAtNDc1NiwKKyAgMTk2NywgICAgNjg2LCAgLTExODYsICAgIDYzNiwgIC0xNzE5LCAgLTEyNDQsICAgLTU0MCwgICAtNzI4LAorICAgMzA2LCAgLTE3NzgsICAtNzk4MCwgIC0zNDE4LCAgIDgzMTgsICAtMTgyOCwgICAxNTU2LCAgIDM0ODcsCisgMTAxOTUsICAgMzc0MSwgICAtNTEwLCAgIDIwNzcsICAtMTQ5NiwgICAxMjQxLCAgICAzODQsICAgIDQ3NywKKyAtMTA1MSwgICA3OTIyLCAgLTQwNzcsICAtMjUxMywgICAgODQ5LCAgIC02OTMsICAtOTE3MCwgICA0MjY0LAorIC03OTQwLCAgLTE3MDMsICAgIDQ2MCwgIC0yOTg2LCAgICA1ODYsICAgICAxMywgICAgMzc3LCAgICA3ODEsCisgLTcwNDcsICAgNjg1MiwgIC0xMzUwLCAgIDc1MzcsICAgLTQ5MywgIC0xOTE5LCAgICAzNzksICAgMzEwOCwKKyAgNDI5MywgICA4NDY3LCAgLTM4NzUsICAgICA2MywgICAgIDQ0LCAgICA0OTMsICAgMTQ5NiwgIC0xNTc3LAorIC01Njc2LCAgIDMzMTgsICAgNjYyOCwgICA1MTc3LCAtMTEwODIsICAgMTE0NiwgICAzMjUxLCAgLTExNTksCisgIC00NjEsICAgIDQ0MiwgICAxMjUwLCAgICAyMTIsICAgIDE3NiwgICAzNTg2LCAgICAxMzcsICAtOTE1MywKKy0xMzc3MiwgIC04MjExLCAgICAzOTMsICAgMTE3MCwgICAxNzE3LCAgIC02NzEsICAgIDI5OCwgICAtMjMzLAorICAgODgzLCAgLTE1MzMsICAgIDQwMSwgICAgMjU0LCAgIDc3MDAsICAtNDgyNywgICAgNzk0LCAgICAzNzcsCisgIC0zNzYsICAxMjI0MCwgICA3Mjk4LCAgIDI0NDUsICAgMTE2OCwgICAtNTYyLCAgIDE1MjgsICAgIDU2MywKKyAgIDQyMSwgICAtNjA2LCAgICAgIDAsICAgNTc5MiwgIC0xMDY5LCAgICA4MjQsICAgMzcyOCwgIC0yNzI5LAorICAxMDA1LCAgIC03MzAsICAgNDMxOCwgICAgNjQ0LCAgMTczMzYsICAtMTU4OCwgICAyMTAwLCAgIC0zNjUsCisgICA1MDksICAgLTQxNSwgICAzNjg0LCAgLTkxMjgsICAtMTA5NiwgIC00Mjc4LCAgIDE1NDksICAtMTI0NywKKyAgNTUxOSwgIDExMDc1LCAgLTIyMTYsICAgNjAwNCwgIC0zNjgzLCAgICA0MDksICAgLTczMCwgICAtNDE0LAorICAtMjYzLCAgLTY2MjMsICAgODE5NCwgICAgNDg5LCAgLTkwODUsICAgIDMzNCwgIC0xMTA0LCAgIC04MTQsCisgIDE0MTIsICAgMTUyMiwgIC0xNjU3LCAgLTcwMjksICAtNDE0MiwgIC0xMjc0LCAgIC01MjAsICAgIC00MCwKKyAgIDY1MCwgIC0xODg2LCAgIDk3MDEsICAxMTQ1NiwgIC03NTY3LCAgIDExNzYsICAgMzI2OCwgICAzMDE2LAorICAxMTA5LCAgIC0xMTcsICAgLTg1OCwgICAtMTU1LCAgLTEyNDksICAgLTIzMCwgICAtMjE2LCAgIDM5NDUsCisgIDkxNDIsICAtMjI5NywgICAgMTM0LCAgLTI1NjMsICAxNTEzMSwgICAgODU3LCAgLTE1OTcsICAgLTYxOCwKKyAgIDE1MCwgICAtNTkwLCAgIC0xNjYsICAgLTM1NywgICAgMzg4LCAgICAtNjksICAtODc2NywgICAyOTE0LAorICAxMDg3LCAgIDQ2NzMsIC0xNDM3MywgICAgNjAwLCAgICAzODIsICAtMTg5MywgICAgODQ0LCAgIC0yNDIsCisgICA1NDQsICAgLTEwNiwgICAgNTY4LCAgLTExNDEsICAgIDM3MSwgICAyNjYzLCAgLTE4NjAsICAgLTcyNSwKKyAgODA2NiwgIC0xMzUzLCAgLTg3NDMsIC0xMDQzMywgIC0xNzk2LCAgICA0MjcsICAgIC03MywgICAgMTc4LAorICAgIDk2LCAgICA5ODAsICAgLTQ3OCwgICAgOTc4LCAgIDE3NjcsICAgNjAzNCwgICAgNjMzLCAgICA5NjYsCisgICA2NzcsICAgIC02NSwgICAtODg0LCAgICA0MTcsICAgIDQ2MSwgICAgIDYyLCAgIC04NjgsICAgICA5MywKKyAgLTEwMCwgICAgNTE5LCAgMTYzMDQsICAgMjY0NiwgIC0xMjYwLCAgMTIyNzEsICAgLTE0MCwgICAgMTQyLAorIDExMTM4LCAgIC04OTIsICAtMjExNCwgICAtNjI5LCAgICAxNzIsICAgIDc0NCwgIC0yMDU2LCAgIC05NjAsCisgICAgNjEsICAgLTk4MCwgICAyMDgyLCAgIC00MzksICAtMzEyNiwgIC0yNTY0LCAgIDExNzQsICAgIC03OCwKKyAgIDI1NCwgICAtMTc4LCAgIDE1OTksICAgLTQzNiwgIDE5MDIzLCAgIDUzMzUsICAtMTY4NiwgICAtNzgyLAorICAgNTIwLCAgLTg3MjcsICAgIDI1NiwgIC0zNTg4LCAgLTU2OTQsICAxMjMyMywgIC0yMDkxLCAgIDE1MTEsCisgIC02NTYsICAgMzg3MiwgICAyMzcwLCAgIC03NzAsICAgIDI4MiwgICAgNDU1LCAgIC01NzMsICAgIC0zOSwKKyAgNzg0NSwgLTEyNTY2LCAgMTI2OTAsICAgLTE1NiwgICAtNDQyLCAgIC0yMjcsICAgIDU3NSwgICAtMjc0LAorIC0xNzE3LCAgICAxMjAsICAgIC00MCwgICAxODY2LCAgICA2MzUsICAgIDE2MSwgICAgMjcwLCAgIDEwMzksCisgIDMyNTYsICAgLTY3MywgIC0zMzQzLCAgIDQyOTIsIC0xNDI0NywgICA3MTQyLCAgLTQ4MjEsICAgLTU5MSwKKyAgLTQxOCwgICAgMzc2LCAgICAgMjEsICAgIDU3MiwgICAgNTUxLCAgICAgNzAsICAtNTUzNiwgICAgIDc5LAorICAyNTQwLCAgIC01MDUsICAgLTI4MywgICAtMzUwLCAgLTEyNzksICAtMTYzMCwgICAyMjM0LCAgIC02MDQsCisgIDUyNDYsIC0xNzU4MCwgIC0zMDIyLCAgLTEwNTIsICAgLTMwNywgICA2NjI2LCAgIDI3OTQsICAgMTcwMiwKKyAgMTg3NSwgIC0xODc2LCAgIDEwMTEsICAgLTMyMCwgICAxMjY4LCAgIC0yODIsICAgMTA3MiwgIDE0MzcwLAorIC04MjA2LCAgIDEyMTgsICAgIDYzMCwgICAgMTczLCAgIDc0ODYsICAxNTE3NiwgIC02MTQ2LCAgIDQ5MDMsCisgIC02MzYsICAtMTM0MSwgICAxMzYwLCAgLTE1NDEsICAtMTAxMiwgICAtNzc4LCAgICAgODQsICAgIDQyNiwKKyAgLTEyNCwgICAtNzQ2LCAgIC0yNTIsIC0xMTA4NSwgICAxNzgzLCAgLTI4MzMsICAgIDgwOSwgICAtNzQ0LAorICAyMTk0LCAgIDMzMjgsICAgNzAyOSwgIC01MDk3LCAgIDQ5MzQsICAtMzAyNSwgICAtNjQxLCAgICAzMDMsCisgIC0zMjgsICAgIDI1OCwgICA4Njc0LCAgICAgNTMsICAtMzM5NSwgICAgOTc1LCAgLTk5NDQsICAtODU1MCwKKyAgMzM3NiwgICAtNzE0LCAgIDEwNzgsICAgMTE4NiwgICAgNTk4LCAgICA4MDgsICAgLTE2NiwgICAtNzUyLAorICAgNDg0LCAgLTUwODgsICAgMTQ4NCwgIC0xMjc4LCAgMTEzOTQsICAtMTg3NiwgIC04MjM2LCAgIDUxNTksCisgLTE4MzAsICAtMTUyMCwgICAyNzYxLCAgICA1OTIsICAgLTIwNCwgIC0xMzYwLCAgICA0NTQsICAgIDIzMCwKKyAtNTAzOCwgIC0xNTgyLCAgLTU2MTcsICAgMTM0NiwgIC0yMDQ1LCAgIDIzMDYsICAxNzc2NCwgICAgNDk0LAorICAgNTcyLCAgLTE5MzAsICAgIDMzOSwgICAgNTUwLCAgICA3ODQsICAgIDE1MSwgICAtNzUzLCAgIDQ3MDgsCisgLTMwNTgsICAtODI2NywgICAzMjgxLCAgLTEwNTQsICAgIDg3MCwgIC0xMjAxLCAgLTIwMDUsICAgLTkyMCwKKy0xMDExNSwgICA1Mzk1LCAgLTY0MjMsICAgLTc5OCwgICAgMzY3LCAgIC0yMjEsICAtNTI5NiwgIC0yODA4LAorICA4MzEzLCAgLTUwNzcsICAgMTY1NSwgICAtMjAwLCAgICAxMTQsICAgICA0NiwgICAgMzUwLCAgLTIzNzQsCisgICA4NjgsICAgLTMyNywgICAgMzc3LCAgLTk1NzAsICAgMTIzMSwgICA5MjU4LCAgIDg3NTIsICAgMzA3NCwKKyAtNDQxMSwgICAtMzA4LCAgIDIzMTUsICAgNjgyNCwgIC0zMzAzLCAgIC04OTYsICAtMTE4NiwgICAgNTc5LAorIC0yNTYxLCAgIDIyODAsICAgIDU4NiwgICAtNzk4LCAgIDQ3NDcsICAtMzQ4NywgICAxMzA2LCAgLTEyNDEsCisgIC00ODcsICAgIC05MCwgICAgLTUyLCAgIDMyMzEsICAgLTU1NSwgLTE3NzAyLCAgLTI2ODEsICAgMTY0OSwKKyAgIC0xNywgICAtMjc4LCAgIC02NDcsICAtNDIyNSwgICAyNzQwLCAgLTEyNDgsICAtMzgyNiwgICAxMzU2LAorICAzNTcyLCAgLTEwMTAsICAxNjE2MCwgICAtNDIyLCAgICAzMDQsICAgMzk3MCwgICAxMTI0LCAgIC0zMTcsCisgIC01NTQsICAgIDY3MywgIC0xMTkxLCAgIDMxODAsICAtNDQyOSwgICAxNTgxLCAgIDE1NDMsICAtMjA5NywKKyAgNDIwOCwgIC05MzYzLCAgMTAxNDYsICAgMTg5NiwgICAyOTA0LCAgLTQxMTIsICAtMTQyOCwgICAtMjA3LAorICAgNDU5LCAgICAtMzUsICAgNTM5NSwgIC04OTYwLCAgIDMxNDEsICAxMTAwNCwgICAgMzA4LCAgIDM2ODcsCisgIDE1NDAsICAtMjE1NiwgICAtNTkyLCAgIDE2NDAsICAgMTAwMywgICAtMjgwLCAgICA3OTcsICAgIDIwNCwKKyAgNjkxMCwgICAtODI0LCAgIDQ3MjQsICAgNDcyOSwgICA1NTUzLCAgLTMxNjUsICAgIDQ4MywgICAgLTEyLAorICAgIDMzLCAgIC01ODgsICAgLTM3OSwgICAgNDAyLCAgIDM1NDMsICAtOTY0NiwgICAgIDc0LCAgIDk2MDMsCisgIC00NjUsICAgMjg3MiwgIC0yMzY3LCAgIC04ODUsICAgMjg5NCwgICAtMTMzLCAgIDI3NTgsICAgLTcyMSwKKyAgMzQ3MywgLTEzMzIyLCAgIDE1MDYsICAtMTM0NCwgICAgNTEyLCAgIDEwNjYsICAtODMwMCwgIDExMzkxLAorIDExOTc2LCAgLTEyMDEsICAgICAxMywgICAtNjEyLCAgICAxNjUsICAtMTgyMywgICAgMTU0LCAgIC0xMjMsCisgIDEyMzQsICAgLTQyMywgICAtMzY3LCAgICAtNTgsICAgIDM4NCwgICAyNjg3LCAgIDI1MzYsICAgIDgyNiwKKyAgNjIyMywgICAxNzUwLCAgLTg1ODksICAgMTEyNiwgICA5NzcyLCAgLTY2NDYsICAgMjA0MywgICAxODI2LAorIC0xMDM3LCAgLTIwMTgsICAgIDY5MiwgICAtODE4LCAgLTM0MzEsICAgLTQ2NywgIDExMDA2LCAgIDM0MDcsCisgICA4ODAsICAtMjA0NywgLTEwMzAzLCAgIDYxNjgsICAgMTQyOCwgICAtMzA3LCAgICAtMTgsICAgIDY2MSwKKyAgLTI1MiwgICAgNzU0LCAgIDEyMDcsICAtMjc5NywgIC0zMDU3LCAgLTYyMzUsICAgICA5OSwgICAtOTMxLAorICAxNjE4LCAgICA2OTIsICAgMjc5MCwgICAtMjk0LCAgLTEyMDAsICAtNTc2OCwgLTExNjkxLCAgLTUzMDUsCisgIC0xMDAsICAgIDM5MCwgICAtNzgzLCAtMTE2NjAsICAtNDY3NSwgLTEzNTcwLCAgIDI3NjQsICAgMTQxNCwKKyAgLTc4NiwgICAgMzg1LCAgICAxNjMsICAgIDcxOCwgICAgNzk0LCAgIDExMTgsICAgIDgyNywgICAtNjM0LAorICAgLTc1LCAgIDYyMjQsICAgMzk2NSwgIC0yMDkyLCAgLTExMjAsICAtNjM5NSwgICA1NDc0LCAtMTI5ODYsCisgLTM5ODUsICAgIDYzNSwgICAtNTQ0LCAgLTE4NzcsICAgLTE5MSwgICAgICAwLCAgICAxMjEsICAgIDM3OSwKKyAtMzA1OSwgICAgMTMyLCAgMjYzMjAsICAgLTcyMSwgICAxMjYyLCAgIC03MDYsICAgIDQyMSwgICAgLTg1LAorICAgLTM4LCAgICA2NjUsICAgIDU5MCwgICAtMjA4LCAgIC0xOTYsICAgIDE2OCwgICAgIDEwLCAgIDEyNzEsCisgIC0yMTgsICAgLTM2NSwgIC01ODQzLCAgLTU4OTcsIC0xMjM0NiwgIC0zMDI2LCAgIDU5MTYsICAgLTExNSwKKyAtMjY3MSwgIC0xMDIyLCAgIC0yMDMsICAgIDk2MiwgICAgOTk1LCAgIC04NTAsICAgIDUyNywgICAtNTE2LAorIC0xNjQxLCAgICA0NTIsICAgICA2OCwgICAxMjA0LCAgICA3NDAsICAgIDM4NSwgICAgIDM4LCAgICA3NTIsCisgICAxNTAsICAtMzA4OCwgIDIwNjA4LCAgICAtNTQsICAgIC0zOSwgICA2MTA5LCAgIDMyMjQsICAgIC05MiwKKyAgLTMxNSwgICA0NDA3LCAgIC0zMDYsICAgMTMxNywgICAtMzk1LCAgLTE2MTcsICAgOTEwNCwgIC0zNDkzLAorLTEwNzI0LCAgLTMwNTksICAgIDI4MywgICAgIDgxLCAgLTk3OTEsICAtMzIxMCwgICA3MzA3LCAgIDQ0NTksCisgIC02MzksICAgIC02MSwgICAxMTUyLCAgIC0xODQsICAgMjI5MCwgICAgMzk4LCAgLTI5MDIsICAtMjc3NiwKKyAtMTYyNCwgICAxMTUzLCAgICAyNDIsICAtODg2NSwgIC0zNjE3LCAgICAzMDksIC0xMTkzMywgIC0zODQ3LAorIC01NzUwLCAgIDMyMzUsICAgLTE1MywgICAtMzE1LCAgICAzODIsICAgIDIwOSwgICAtOTIzLCAgIDIwNzIsCisgICA0NTgsICAgIDE2NCwgICAzNjMxLCAgIDMxMjEsICAgMzIyMCwgICAtODI4LCAgLTg2NDQsICAgMjIxNSwKKyAgMzg3MywgIDEyNDQ1LCAgICA1MzMsICAgLTYzMSwgICAgLTUzLCAgIC0xMzYsICAgLTcyOCwgICAtMjQwLAorICAgNDIwLCAgIDI4NzAsICAtNDk4MSwgICAgOTA2LCAgLTMyNzIsICAgNDczNSwgICAzNjEzLCAgIDI0MTIsCisgLTM5NTEsIC0xMDU4NywgICA3Mzg5LCAgICA1NjQsICAgMzI2NiwgIC0xMzQ4LCAgICA1MjQsICAgMTU3MCwKKyAgNjYxMSwgICAzMzU0LCAgLTEwNDIsICAgMTg2MiwgICAxODYwLCAgLTExODcsICAgNTc2MSwgIC0xNzIyLAorICA4MjMxLCAgLTc0MjgsICAtNTY2MiwgICAxMjM5LCAgLTI4ODcsICAgLTIxOCwgICAgODEwLCAgLTEwNjMsCisgMTUwNzgsICAgIDY4NiwgIC0yMzc0LCAgIC0yOTMsICAtMjAzMSwgICAtMjQ1LCAgIDQ0NDEsICAgNTA0NSwKKyAgMTEwMCwgICA2NzIyLCAgIDE3ODcsICAgLTU4NywgICAtMzgwLCAgICAxMzIsICAgNTEyNCwgLTEyNDc4LAorICAgIDk1LCAgLTEyMzAsICAgMTQ2NCwgIC0xODcxLCAgICA5MjksICAgMTQzMCwgICAyNjY2LCAgLTM3NjgsCisgIDI3ODQsICAtMzY5NywgIC04MjM4LCAgIC0yNDcsICAgIDYwMywgIC04NDA2LCAgIDEzMzAsICAgMTAzMywKKyAgLTc0MywgIC0yNTQ2LCAgIDI3MzksICAgIDg1NiwgLTEyNjk4LCAgLTQ5NzAsICAgMjI5MCwgIC0xMTA0LAorICAgIDM0LCAgLTEwNDgsICAgIC04MCwgICAgNjM0LCAgIC02OTUsICAgIC04NCwgICAyMzc0LCAtMjQ3OTMsCisgLTEwNjQsICAtMTA4MCwgICAtMjU0LCAgIC04MTIsICAgIDI1MiwgIC0xNTgyLCAgIC00MDEsICAgIDc2NSwKKyAgIDg0NywgICAgMzQwLCAgICA0NzksICAtMzE2MywgICAgMTUwLCAgIC0xODcsICAgODQzMiwgICAyNjA3LAorICAyMDc1LCAgIDEzODQsICAgIDQyMywgIC03MzYxLCAtMTAyNjIsICAtMjI1NCwgICAgIDU0LCAgIDEwNjUsCisgICAgNDAsICAgIDg1NywgICAyMDE0LCAgLTUwNzYsICAgIDE5OCwgICAgNjU3LCAgICA0ODIsICAgLTQyMiwKKyAtMjE4NSwgICAtODUwLCAgIC0zMTgsICAgIDE2NCwgICAtNjg0LCAgIDI2OTgsICAtMTAwOCwgIDE3NDkzLAorICAgLTY0LCAgLTY3ODgsICAtNTk2NiwgLTE0MzUyLCAgLTIzNDksICAgMjQ5MiwgICAgMjY2LCAgIDEwNzcsCisgIDE5MzUsICAgIC05OSwgICA0MjcwLCAgIDIzMTksICAtMjM5MSwgICAgNzc5LCAgICAxODcsICAgIC03MAorfSwKKworLmNiNDQ0OG0wID0geworLTIwNDU1LCAgICA2NjMsICAtMzE0MCwgICAyNTQwLCAgLTIxMTAsICAgLTQwNiwgICAxMDc4LCAgIDE5NjgsCisgIC03NDEsICAtMjQ1OCwgICAgNDkwLCAgIC00OTYsICAgIDMzOCwgICAgNTgxLCAgIDEwNzksICAgLTYxNiwKKyAgIDE1NCwgIDEwMDk3LCAgICAyMzEsICAgLTIyOCwgICAgNDc3LCAgICAgMjAsICAgMTM3MiwgIDExNDkyLAorIC0xMTEyLCAgLTMxNDgsICAgIDU0NywgICAgMjQ4LCAgIC02NzYsICAgODE5NywgICA1OTAyLCAgLTEyOTksCisgICA1MTksICAtMjgwOCwgIDExNTI5LCAgICAtNzYsICAgMTIzOSwgIC0xMDMyLCAgIC01NDIsICAgIDM1MywKKyAtMTA3MSwgICAgMjc4LCAgICAyNzQsICAgMjc4MSwgIC03NzQxLCAgIDMyNjAsICAgMjcxMSwgICAgMTc1LAorIDEyMzQwLCAgIDExMTAsICAtMjM0OCwgIC01MzAzLCAgIDE0NDAsICAgIDU4MSwgICAgLTcwLCAgICAyNjIsCisgLTk5MDIsICAtMjM3NSwgICAgNTMwLCAgIDE0MzMsICAgMTYyNCwgIC0xNDc1LCAgIC05NDcsICAxMzQ1MCwKKyAgMTMxOCwgIC0xNjk2LCAgICAyMDcsICAgIDE5OCwgICAxMTYyLCAgIC05NDQsICAtOTMyOSwgIC0xMDQ2LAorICAgMTk1LCAgIC0xMDYsICAgIDY4MiwgIDE0NjI0LCAgIC04NTQsICAtMjQxMCwgICAxMDU0LCAgICAyNDIsCisgIC0zNDgsICAgIDU4MSwgICAgNDYzLCAgICA3MTYsICAgIDc2MCwgICAyNzE0LCAgIDEzNTYsICAtMTM1OSwKKyAxMzA4OSwgICAyNTY1LCAtMTA1MjMsICAgMTkzNCwgICAgNjM3LCAgIDEyMTgsICAgMTE2MCwgICAgODMwLAorICAgOTA1LCAgICAyNzIsICAgIDQwOCwgICAtNTgxLCAgLTE0MjYsICAgIDYxMywgICAyNTg2LCAgLTgxODYsCisgIDM3NDgsICAtNjY2MywgICA0MzcyLCAgIC0xMTQsICAtNDY0NCwgICAyOTk4LCAgLTk0NDAsICAgIDY4NSwKKyAtODc0MSwgICAzMzYzLCAgLTU2MjMsICAtNDIyOSwgIC03MDU4LCAgLTEyMDEsICAgLTgyMiwgICAxODA2LAorICA4NjcxLCAgIC04NTYsICAgLTYxMiwgICAxMTY1LCAgIC00MjYsICAgIDMxNywgICA2ODY3LCAgICAtODAsCisgLTcwODQsICAgMTE0MywgIC0xODYyLCAgIDI3NDIsICAgIDY2OSwgICAgNTUwLCAgICAgMjIsICAgIDE3MywKKyAgNDMwMSwgLTEwNDA2LCAgIDEwNDIsICAgLTM0NiwgIC0xMzM0LCAgLTI4OTcsICAgIDY0NywgICAgNzQ0LAorICAgIDE0LCAgLTEzMzgsICAtMTY0OCwgIC0xMjM1LCAgIDM1NTAsICAgLTQ1NSwgICAyMTI1LCAgIDExODgsCisgMTcxMzYsICAgMTE4OCwgIC02NzgyLCAgIC04NDksICAgIDI5OCwgIC0xMDU0LCAgLTkyNTQsICAgIDQwOSwKKyAtMTczNiwgICAxNDEwLCAgLTcyNTQsICAtMTg4OSwgICAgNDU3LCAgIC03NDAsICAgICAyMiwgICAgMjYyLAorIDMyMjQyLCAgIDE2NTcsICAtMjMwOCwgICAyNjg4LCAgIC02MDcsICAgIDYwOSwgICAgICA0LCAgICAxNTAsCisgIC0yNjQsICAgIDE5MiwgICAtMTQwLCAgICAyNDYsICAgLTM5MywgICAgLTc2LCAtMTUwNTAsICAgIDM5MCwKKyAgIDk2OSwgICAgNDU3LCAgIDE0MzYsICAgLTY0OSwgICAgNDYwLCAtMTIxNTAsICAgMTM1OSwgICAxMDE0LAorIC0yMTAzLCAgIC01NzYsICAgICA1NSwgICAtNTkwLCAgICAxMTMsICAtMTQxMCwgLTIzNDMxLCAgICAxODIsCisgLTIzODYsICAtMTU2OCwgICAgOTA0LCAgIC0yMTgsICAgLTI4MSwgICAtMTg4LCAgIC0xNzgsICAgICA2MywKKyAgIDIxMSwgICAgNTQ5LCAgICA2ODcsIC0xMjA2OSwgICAgLTg4LCAgIC02NTQsICAtMTA3MCwgLTEzMTU1LAorICAtMTI0LCAgIC02OTcsICAgIDQzOCwgICAzMTc0LCAgIDE3MDAsICAgIDI3MCwgICAgMjM0LCAgIC0yODksCisgIC02MjUsICAxNTc0OSwgIC0yMzQwLCAgIDg0NjYsICAgIDM5NywgIC00NDYwLCAgLTEwMzAsICAgMzIwNiwKKyAgMTA4MSwgIC0xMzE3LCAgLTEwMzAsICAgIC03MiwgICAgNDg3LCAgLTE0NzcsICAtODc4MiwgICA2OTg0LAorIC0xMjIxLCAgIDIzOTUsICAgMzE5OCwgICAyOTk1LCAgIDU4NjIsICAtMTE5NSwgIC02MDc1LCAgLTEwMjAsCisgIC05MzQsICAgIDg2OCwgICAtNDcwLCAgLTEwMjQsICAgMTIwMiwgICAtOTk4LCAgLTEzMDYsICAyMjExOCwKKyAgIDM0NCwgICAgNTQwLCAgLTMxMzcsICAgLTU0NywgICAyNDQwLCAgICAtMjgsICAgIDIyMiwgICAgMzcyLAorICAtNDI0LCAgIC0xOTksICAgMTA2OCwgICAtOTE3LCAgIC0xMDUsICAtNDI3OCwgICAgIDUyLCAgIC0yOTksCisgIDY5MzMsICAxMTcxNSwgICAtNTIwLCAgLTI4NTMsICAgICA1OCwgIC04NTc1LCAgICA0MTYsICAtMTI3MiwKKyAgMTEyOCwgICAgLTMyLCAgLTExNDAsICAtMTg3MywgICAtNDk1LCAgICAyMzUsICAgMjA3OSwgICAtMzE0LAorIC0xMzI4LCAgLTI2MTUsIC0yMDE5NCwgICAgODQ4LCAgLTE1NTMsICAgIDM4NywgIC02MDkxLCAgICA5MDYsCistMTAxODAsICAgODYzNCwgICAtNTA2LCAgIDQwNzgsICAgIDMxOCwgIC0yNjU3LCAgIDE2MTIsICAgLTEyNiwKKyAtMTQyNCwgICAgIC00LCAgLTE3NDUsICAgLTM0MywgICAgMzAyLCAgIDI0MzksICAxMjE5MCwgICAgOTQxLAorLTEyNTM0LCAgLTQ3NTYsICAgLTE3NiwgICAgLTkwLCAgLTEyOTUsICAgMTA0MSwgICAxODc1LCAgIC00NTAsCisgICAgODksICAgIDIxMiwgICAyMDk4LCAgIDE3MDgsICAgMTg3NiwgICA0MDY1LCAgIDE2ODIsICAgMTk3MiwKKyAtNDkxNiwgICAtOTUxLCAtMTA2ODMsICAgMTQ0MywgLTEwOTc4LCAgICA3NzIsICAtMTAxMywgICAtMjM1LAorICAgIDU5LCAgICAyMTMsICAgLTIzMCwgICAgMTQyLCAgIC01NzYsICAgIDUwNiwgICAgMTAxLCAgICAgNDQsCisgIC0xMzcsICAyNjIzOCwgICAgLTQ3LCAgIC0zMjIsICAgLTI4OSwgICAgMjgxLCAgIDI2MTQsICAtNDUzOCwKKyAgIDYzNCwgICAxMTE2LCAgIDExOTEsICAgMjk4NSwgICAtNzU5LCAgLTU1MjcsICAgIDU1MCwgICAyMTA3LAorIC02MDE4LCAtMTEwMTMsICAgLTQyNSwgICAtMjIxLCAgICA5MDEsICAgIDIxNywgICAgNTQ2LCAgICAyMTMsCisgIDIwMjYsICAgIDY5NSwgICAxMDc0LCAgLTIxMzIsICAgLTE3MywgIC0xNjY0LCAgIC03ODMsICAyNTA2NSwKKyAgLTMyNiwgICAgIDg2LCAgIC02MzIsICAgMTM5OCwgICA0NzA4LCAgLTI5MTEsICAgMjM3NiwgICAgMTM1LAorIC0xNDcxLCAgIC05MDQsICAtMjMzOCwgICAgOTg3LCAgIDMyMTYsICAtNDU2NCwgICAgMzE0LCAgMTU2OTIsCisgIC0yMTQsICAgMTIzOCwgICAgMjMwLCAgIC0xODEsIC0zMDUzNywgICAtMjk0LCAgICAxNTUsICAgLTYwNywKKyAgIDIxOCwgICAtMzA5LCAgIC0xODAsICAgLTI0NiwgICAtMTAyLCAgIC05ODgsICAgLTY0NCwgICAgMTExLAorLTEwNTE3LCAgLTE2MDQsICAtMTE4MCwgIC0yNzQ4LCAgIDExOTEsIC0xMjk1OSwgICAgIC0yLCAgLTEwMDQsCisgICAgMjgsICAgLTE5NiwgICAxOTc0LCAgIC03OTAsICAgIDgwOSwgICA4ODAyLCAgLTEyMDQsICAgIDMzMiwKKyAgIDE4MCwgIC0zODU3LCAgIDEwMjUsICAtNTk5OCwgIC05NTc4LCAgICAgOTQsICAtMTA2OSwgIC0yMzk4LAorICAgMTg1LCAgICA2NDMsICAtMTQ3OSwgICAgMzIyLCAgIDI1NDQsICAxMjU4NCwgIC04MzA4LCAgLTM4NTYsCisgIDEyODYsICAgMTYwMCwgIC0yNTM5LCAgLTI3NTIsICAtMjUyMCwgICAtMzY3LCAgIC05NDIsICAgIDQxNywKKyAgLTMwOSwgIC0yMTYyLCAgIDIwNDQsICAxMDg4NiwgICAxNzY0LCAgMTEwMjgsICAgMzgxMCwgICAyOTU1LAorIC0xMDI4LCAgLTEwMTcsICAtMTc1MiwgICAtNDg3LCAgIC02MDUsICAgICA0OCwgICAyMzEyLCAgIC0zNjgsCisgLTE3NTgsICAgLTI1MiwgICAgMzcxLCAgMTk4ODIsICAtMTk5NCwgICAxNjc1LCAgIDU0OTQsICAgLTY2MCwKKyAtMTY2OSwgICAgMjU2LCAgICAtNTQsICAgLTk0MSwgICA0MzE4LCAgIC0zMDYsICAgMjE0MywgICAgMjczLAorIC0zMzY3LCAgLTMwODgsICAgNjUwOSwgIC0xODg0LCAgLTU0MDAsICAgLTU3NiwgIDExMzk0LCAgICA4NzUsCisgICA0NTUsICAgIDI3MSwgICAtMjE4LCAgIDE0MDEsICAgIC00NCwgIC01MzM2LCAtMTIxNzAsICAgNDY2NCwKKyAgLTU4OSwgIC0zNTYyLCAgLTE5MzQsICAgNTg0MiwgICAxMzU3LCAgIDMyMzIsICAgMTQ0OSwgICAtNDAyLAorLTExMjI4LCAgICAtOTYsICAtMTUwOSwgICAyMDczLCAgLTE3NTEsICAgIDc3NiwgICAtNDM5LCAgICA3NzUsCisgLTMzMDIsICAxMzUyMSwgICAtMzI1LCAgIC0xMTgsICAgLTE3MiwgICAgNDExLCAgIC0zOTYsICAgNjE1NCwKKyAtMjQ1NSwgICAgLTUyLCAgLTQ2MTYsICAgIDc4MywgLTEyNDg4LCAgLTIwODUsICAgNTgxNywgIC0xMjc4LAorICAgNjM1LCAgLTE3MTMsICAgMjg4OCwgICAtODMwLCAgICA2NDksICAgNzQ4MiwgIDEwMTM0LCAgIDkxNDcsCisgIDM3ODQsICAgMTA0NiwgIC0xOTM0LCAgLTI1ODAsICAgIDEwMiwgICAtNjc5LCAgIC0xMjQsICAgICA2OCwKKyAgIDY1NywgICAgNDE3LCAgIC0xNzUsIC0zMjc2OCwgICAgLTgwLCAgICAzNzUsICAgLTk0MSwgICAgMjI0LAorICAgMjcxLCAgIC0yMzIsICAgMTUxOSwgICAgLTk5LCAgIC02ODAsICAgICA2NywgICAgIDY2LCAgIC02MTgsCisgICAyNTIsICAgMTkwNywgICA1MTIxLCAgIDI0NTYsICAtMjExNywgIC05Mzg4LCAgLTE0NDEsICAgIDYzNiwKKyAgNzg2OCwgIC04MzQwLCAgIDE5MzksICAgMTM0MCwgICAxNTExLCAgICA3MTEsICAgNjUzMCwgIC0xNzQ4LAorICAtMTgzLCAgICAgOTAsICAgMjU2MSwgICA1ODYwLCAgIC0zNjQsICAgNTExNywgIC00MTAxLCAgLTQwMjgsCisgIC05NDQsICAxMDUyNiwgIC0xMDI4LCAgIDEwNDcsICAgIDcwNywgIDEyMTE2LCAtMTI1OTYsICAtNDAwNiwKKyAgIDkyMiwgIC0xMDQ3LCAgICAzNDgsICAgLTk3MSwgICAtMjcyLCAgLTIzODgsICAgIDQzNSwgICAgMjQ2LAorIC0xMDU1LCAgICAxNDgsICAtMTg1MiwgLTEyNDE4LCAgLTI1MzEsICAgMzUyNCwgICA0MTAzLCAgIC0zNDQsCisgIDE2NjcsICAgMjgxOCwgIC00NTc2LCAgIC0yNzMsICAtODMzNywgICAgMTgzLCAgICA0OTcsICAgLTE0NCwKKyAtOTg0NSwgICAtMjkyLCAgIC01MDMsICAtMTIxMiwgICA0MzE2LCAgLTE0MzQsIC0xMTA1OCwgIC0zMDQzLAorIC01ODE3LCAgIC05ODEsICAgIDgxMywgICAgICAwLCAgIC03MTgsICAgLTQ2NywgIDEwMjg1LCAtMTkwMDUsCisgICAtODIsICAgIDc3NiwgICAxMTkyLCAgIDEwMzAsICAgMTU2MCwgICAxMDgwLCAgIC0xNDQsICAgIDcyOSwKKyAgIDYwNiwgICAtMjI1LCAgIC0zODksICAgLTE4NywgICAgNTUyLCAgIC05MzAsICAgLTQ0NCwgIC01OTU5LAorIC0xOTYwLCAgLTEzMTUsICAgMjY1MCwgIC0xMjgyLCAtMTg3OTAsICAgMTc3MiwgICAgMjYzLCAgIDE0MTAsCisgICA4MTIsICAgLTQ1OCwgICAtNDc2LCAgICA3NDQsICAgMjU5NSwgICAtNDI2LCAgICAtMTksICAgOTExOSwKKyAgNDUyOSwgIC0xNTAyLCAgIDQ2NzMsICAgMzY3NSwgICA3NDMwLCAgIDEwODQsICAtNjk2NiwgICAtNTE4LAorLTEzNTUyLCAgIDEwNTQsICAgMjQ3NCwgIC05NDk5LCAgIDEwNDEsICAgNTExNCwgICAgNDQyLCAgIDI5MjcsCisgICA1MTEsICAtMTQ5MiwgICAgMjE3LCAgIC03MjYsICAgIDM5OCwgICAtNTIyLCAgICAgMzUsICAgIDExOSwKKyAgLTMzMiwgICAgMTA2LCAgICA4MTYsICAgIDQzNywgIC0xMjIzLCAgMjc2MTIsICAgIDUyMSwgICAgLTI5LAorICAtNDYyLCAgICAzNjcsICAgLTk2NiwgICAgNDc2LCAgLTI1NTksICAtMzQ4NSwgICAtMTYwLCAgIDE0ODcsCisgIC0yNzIsICAgLTU4NiwgIC02MDE0LCAgIC0yMzIsICAgMzY3OSwgIC0xODY0LCAgIDEyNDQsICAgIDU3NSwKKy0xNDU5MSwgICAtNDgzLCAgLTE0MjgsICAgICAyMCwgICA3ODc0LCAgLTI5NDgsICAtNTk2NSwgICAyMzgzLAorICAzMjcwLCAgICA0OTAsICAgMjc1MCwgICAtNTQ3LCAgLTk2NTgsICAtMTQ3MywgICAgOTQzLCAgICAyODUsCisgLTIzODgsICAgLTc3MiwgIC0xNTgyLCAgIDMxODEsICAgMzQxOSwgICAyNjI4LCAgIC0xOTcsICAgMzM3NiwKKy0xMzI4MiwgIC03Njg0LCAgIDMzODMsICAgICA3MCwgIC0xMTc0LCAgICAtNzAsICAtNjcwMywgIC03MzA1LAorICAtNTUzLCAgIDM1ODgsICAgLTgyNiwgICAgLTEyLCAgIDczNTAsICAtMzYwNCwgICAgMzQ1LCAgIDEwOTgsCisgIDM4NTYsICAgIDkxOCwgICAyMDM4LCAgICAtMzksICAxMTUxNCwgIDE1Nzk4LCAgIDEzMjcsICAgMTE1OCwKKyAgIDQzNiwgICAtOTE4LCAgICAgNzEsICAgIDk1MywgICAgOTc1LCAgIDExNDcsICAgIDE3NCwgICAgNDExLAorICAxNDY3LCAgICAgODMsICAtNDUzNiwgIC0xNTExLCAgIDUzNTAsICAtMzMxNCwgIDEzOTk5LCAgICAgMTgsCisgIDQxMDcsICAgMTkwMSwgICAgODM0LCAgIDI2MTQsICAgMjM1NiwgICAtMzY5LCAgICA5NDMsICAgLTM0MSwKKyAgLTQ2MCwgICA0MzgwLCAtMTAwMTQsICAgMzMwOCwgIC0zNTQxLCAgLTMyMjUsICAgLTYyMSwgICA4NDQ5LAorIC0xMzgzLCAgIDQ0ODEsICAtMTM5OSwgIC0zNjQ2LCAgIC05MzYsICAgIDkyMywgICAgMjIxLCAgICAzNDYsCisgIDc4MjgsICAgMjQwNiwgICAzMDIxLCAgLTQ5OTMsICAgMzAxMiwgLTEwOTAzLCAgLTE5MjUsICAgODE1MywKKyAgIDM4MiwgIC0xNDUzLCAgIDEyMzgsICAgIDYwMSwgICAxMTk1LCAgLTIyNDUsICAtMjc5MiwgIC00MTE4LAorICAgNDczLCAgIDQ4OTgsICAxMjk2MSwgIC02MDk0LCAgIDU5MDUsICAgMTM2OCwgIC0yNzU0LCAgIC0zMDMsCisgICA3NjgsICAgIC0zMSwgIC0xMjc1LCAgIDE0MDAsICAgIDU5NiwgIC0xMzI2LCAgICA2MTksICAtMTc0NCwKKyAgMTE0NSwgIC0zOTc3LCAgICA2MzksIC0xMDc4NSwgIC0xNjkzLCAtMTExOTIsICAgLTU0MSwgICAtNDM0LAorLTExMzg0LCAgLTEwMTcsICAxNDM2MSwgICAxMzk4LCAgICA1MjEsICAtMzIzOSwgICAxODUxLCAgIC00OTEsCisgICAyMzcsICAtMTAyNCwgICAxMDAyLCAgLTMwMDIsICAgLTMwMywgICAgLTMzLCAgLTY1MzIsICAgIDYwMSwKKyAtMzcyNiwgICA3ODMyLCAgIDYwOTAsIC0xMDEwNywgICAgOTU3LCAgLTExNDksICAgIDY4OSwgICAxMzI3LAorICAgLTUxLCAgIDE5NDUsICAgIDk5MCwgICAtMTA2LCAgICA1OTUsICAgIDIzNCwgICAgNTE4LCAgIDEwNjAsCisgICAgNzcsICAgIDgzNywgIDI4ODgwLCAgICAtOTEsICAgLTM5NSwgICAtMjc1LCAgIC0yNjUsICAgLTI3OSwKKyAgLTIxNywgICAtMzAwLCAgICAyNDAsICAtMTA1NSwgICAtNDA2LCAgIDQzMTQsICAtMjEzOSwgICA2MzQ5LAorIC0yMjI3LCAgLTU5OTYsICAgIDk2MywgLTEwMzg2LCAgIDQ2MjksICAgLTU2MCwgICAxMDgwLCAgICAxMzQKK30sCisKKy5jYjQ0NDhtMSA9IHsKKyAzMTU3NywgIC0xMzIyLCAgIDE1MzMsICAtMjIyNCwgICAgMjUzLCAgLTE0ODUsICAgIC05MiwgICAgMjk0LAorICAgMTgzLCAgIC01ODAsICAgIDQyMCwgICAgMTcyLCAgIC03OTQsICAgLTIwNiwgICAtMzQyLCAgIC0zMzgsCisgICAgNTMsICAgIC04NSwgICAtOTIwLCAgMjk1MTcsICAgMTA3MywgICAtOTcyLCAgLTE4MzksICAgMTAwNCwKKyAgIDI5MCwgICAgIDQ2LCAgICA0NjAsICAgIC03MSwgICAtOTg4LCAgIDE3MzEsICAgLTM2MiwgIC0yMDcwLAorICAzODQ4LCAgICAgLTIsICAtMzg0MiwgICAgNzM0LCAgLTEyMjEsICAtODAxMiwgICAxMTA0LCAgIDY3ODIsCisgIDk2NzMsICAgMTA4MiwgIC04NTYxLCAgIC04NjAsICAtMjEzNSwgIC0xNTU3LCAgLTE2MTMsIC0xMzk5OSwKKyAgMTY2NCwgICAyMjY4LCAgLTE1NzAsICAgLTczMiwgICAxMDEwLCAgIC00MDIsICAtMTEzOSwgICAtNDI4LAorICAgNDAwLCAgIDExMjMsICAtMjEwOCwgLTExNzc2LCAgIC0zNDUsICAxMDYwOCwgICAxMjQ1LCAgLTMxNDIsCisgLTMyNDQsICAtMTEzMiwgICAxNzAwLCAgIC0zMDgsICAgMTU3MywgICAgNTQzLCAgICA2NzgsICAgNTE2MCwKKyAtMzA2MiwgICAgNDMzLCAgIDI3MDMsICAgLTg1MiwgIC00OTAzLCAgLTE4ODAsICAgMTcwNiwgIDEzOTk1LAorICAyNDY1LCAgLTQ4NDQsICAgLTkwNCwgICAtMTQ4LCAgICAzNTAsIC0xMTE2OCwgICAxNDA2LCAgICAzMTIsCistMTE5MDAsICAgIDM5NywgICAgNzY5LCAgIDU1NTgsICAtMTM1NCwgICAgMTg3LCAgICAtMzAsICAgIDIzMSwKKyAtMTAyMCwgICAgMjAyLCAgICA4ODQsICAgLTE5OCwgIC0zMTUxLCAgIC04MzAsICAtODQ5MCwgICAtNjcwLAorIC0yNzY3LCAgIDE1MTcsIC0xMjk1NywgIC0zODYxLCAgLTI3OTQsICAtMTg1NCwgICAtMTgwLCAgICAxMzUsCisgIDcxNDAsICAgNDEwMywgIC00NDI3LCAgICA0NTAsICAgIDQ5NCwgIC0xMDMzLCAgLTExMTAsICAtMjg1NywKKyAxMTA1NiwgICAtNzExLCAgIC04MDAsICAgMzYyOCwgICAtMTgwLCAgIC04NTIsIC0xMDMwMCwgIC0yMTIwLAorICAtNDUwLCAgMTQ0NjQsICAgLTUxMSwgICAgMzAzLCAgLTE0NjQsICAgLTU0MiwgICAgLTg5LCAgIC0yMDQsCisgICA1MDAsICAgLTQwMCwgICAtMzE4LCAgICA1NjksICAgIDIxNiwgICAgNDI4LCAgICAzNTAsICAgMTk3MywKKyAgLTEzNywgICAtODg1LCAgLTE3OTQsICAgLTk3NCwgICAzOTc3LCAgIDMzODIsIC0xODYyNCwgICAtNDIwLAorIC0xOTQ3LCAgICAxNjUsICAgLTQ0OSwgICAxMzk1LCAtMTczMTMsICAgLTI4NiwgICAyMDU0LCAgIC00NDcsCisgLTI3NDAsICAtMTg4MSwgICAtNTUwLCAgLTIxNjYsICAgMTM2MCwgIC02MDIxLCAgICAtOTQsICAgIDE0OCwKKyAgIDY3NiwgIC0xNjE5LCAgLTE3MzcsIC0xMTk3NywgICAtMTY5LCAgLTE2NjQsICAtNzcwOSwgICA2MjAyLAorIC01OTU0LCAgIDE2ODEsICAgIDcxNSwgICAtMjYzLCAgICAgNTYsICAgIDM2OSwgICAgNTg5LCAgICA1NjQsCisgIDE5ODksICAgMTYxNywgIC0xNjQ4LCAgIDkyMDUsICAgMTM0MywgLTExNTA4LCAgLTczNzksICAtMzc5MSwKKyAtMzEzNiwgICAxMDQ5LCAgIC04NDQsICAgICAyNCwgIC02NzE0LCAgLTE3MzYsICAtNTczNCwgIC0yOTA3LAorICA1MDE2LCAgIDIxNjcsICAtNTcyMiwgIC0xMjEwLCAgIDYyMzIsICAgIDQyOCwgICAyNDY3LCAgLTMzMzQsCisgLTE0NzcsICAgLTcxMSwgICA2NzI4LCAtMTAyNzQsICAtNDkzMCwgIC02MjI0LCAgIC0zNDksICAgLTcxMCwKKyAgMTU5OCwgICAtNzEzLCAgLTE3MDgsICAgLTQ5NywgICAtMjU0LCAgICA1NjcsICAgLTg4NCwgICAgMTMxLAorIDExNTIwLCAgIC05MDgsICAtMTQyNSwgIC0xODYyLCAtMTM0NDksICAtMTU5MCwgICAtNjY5LCAgICA2NTcsCisgICA1MDUsICAgIDIzNiwgICAgIC00LCAgICAgMjEsICAgIDg0NiwgICAgMTAwLCAgIDgyNDgsICAtMTg0NywKKyAgLTEzMSwgICAtMTg2LCAgICAxODEsICAgLTgwNiwgICAzMjkzLCAgLTEwNzIsICAtMTIwOCwgIDE0NDkyLAorICAxNTU1LCAgIDE1MjcsICAgIDU0NCwgICAtMTIwLCAgIC0yNTgsICAgICAgNiwgIC0yNDAxLCAgMTI0NTUsCisgMTA4ODAsICAgMTA5MSwgIC0yMzUwLCAgIC05MzksICAtMTI1MiwgICAtNTY0LCAgICAxNTAsICAgLTExNCwKKyAgMTQxOSwgICAgNzM3LCAgLTE3MzIsICAgLTQ0MCwgIC0yMzAzLCAgIC0yMjYsICAgIDUzNiwgIC0yNDkyLAorIC0xMDg1LCAtMTAxMTcsIC0xMTAxMywgICAzNzg2LCAgIDUyNzUsICAgIC0xMCwgICAyNDc5LCAgICAxNDMsCisgLTE2NDcsICAtNzk0NSwgICAgODg0LCAgLTE2MTgsICAgMjA1NiwgIDEyODkwLCAgIC00MjQsICAgNTk4NiwKKyAtMTQ3MSwgICAtNjY2LCAgIC01NzAsICAtMTQ2NiwgICAtNDk5LCAgICAgNjQsICAgIDU2NiwgIC0xNzM4LAorICAtNjM5LCAgMTEzODAsICAgLTYxMiwgICAxODc5LCAgIDE1NTAsICAxMjQ2OSwgICAtMjk5LCAgLTE1MDEsCisgIDI2MzQsICAgMTAzNiwgICAzMDIwLCAgICAtMTMsICAxNDk3NCwgIC0yMDY2LCAgLTU3ODYsICAtMjY2NywKKyAgNTQ4NywgIC02NzY4LCAgICA0NjgsICAgLTM4NSwgICAgNzc4LCAgIC04MDUsICAgLTUzNiwgICAtMzA0LAorICAgNzE4LCAgICAzODYsICAgIDI4NSwgICA3NTQ2LCAgICA2NDMsICAgMTQ2MiwgICAgOTEzLCAgIDQ3MDcsCisgICA5NDEsICAtMzMzOCwgICAtMTk0LCAgIDY2NjksICAtNDQ5MywgICA4ODY5LCAgIC04MzcsICAgIDQwMCwKKyAgLTg3NywgLTExMTEzLCAgICAzMjYsICAtMjMxOCwgIDEzNjgzLCAgLTEzMDQsICAtMTk2NiwgICAtOTMzLAorICAgMzEyLCAgICAxMjgsICAgIDQ3MCwgICAtMjk2LCAgIC0zMjIsICAgIDM0MCwgIC0xMTI2LCAgIDE4MTEsCisgIDE5OTksICAgMjg4NSwgICAzMjAxLCAgICAzMzEsICAtMjQ5NCwgICAzOTk5LCAgICA2NjAsICAgIC04MCwKKyAtMjA2MywgLTE2NzcxLCAgLTEzMzcsICAgIDQyNiwgICA0ODg0LCAgLTYwMjYsICAgIC00MCwgICAyMDkzLAorICAgMzQyLCAgIC0xNzYsICAgICA4MywgICAgMTM0LCAgICA3OTYsICAgLTQyNSwgIC04OTM0LCAgIDIxMDAsCisgIDg1NTAsICAgIDE2MCwgICAtMjIxLCAgIC0yNTIsIC0zMjcxNCwgICAxMzA2LCAgIDEzMzIsICAgLTYwOSwKKyAgLTEwOSwgICAgNTQ3LCAgICA4NDgsICAgIDUxOCwgICAgLTQwLCAgICAzMDMsICAgLTI0NiwgICAtNDUxLAorIC0yMTc3LCAgIC03MTYsICAgLTc1MCwgICAgICAxLCAtMjEyMzIsICAgMTI4NywgIC0xMzAzLCAgIDIwNTEsCisgIDE2NTksICAgMTUwMSwgICAtMzY5LCAgLTE0MTUsICAgIDI3NCwgICAgMzA4LCAgICAyNjAsICAgIDM3MSwKKyAtMTQwOSwgICAtNjYyLCAgLTczNDcsICAgNzE2MSwgICAzNjU2LCAgLTExMDQsICAgODg2MiwgIC01NjcxLAorICAxMzcwLCAgIDExMjIsICAgICAxNiwgICAxMTMyLCAgMTc1OTMsICAgNjc3OCwgICAtOTkzLCAgICA2MTMsCisgIC02NjUsICAgMzAwNCwgICAzMjg4LCAgLTE2MjUsICAtMTgyMywgIC0xMDAzLCAgICA3NDAsICAtMTAwMiwKKyAgLTg4OCwgICAtNjc3LCAgLTEwNjUsIC0yNTI5NCwgICAgOTk3LCAgIC0xNjAsICAgLTE4MCwgICAtODExLAorICAgMTg4LCAgIC0zMzMsICAtMjQ4MywgICAtNjk2LCAgIDEzMDksICAgIDEyMCwgICAgNDU2LCAgIC0xMTYsCisgLTIwMjAsICAgLTg5NiwgICA3MjE2LCAgIDYzMjgsICAtOTE3MCwgICA4NDA3LCAgLTI5ODYsICAtMTY4NCwKKyAgIDY4MCwgICAxNzUyLCAgIC02ODQsICAgIDYxMywgICAgMzM3LCAgIC02MjksIC0xMTc1MCwgICAtNDkzLAorICAtMzI0LCAgIC05MDcsICAgLTM5MSwgICAxMDUzLCAgMTQxMjUsICAgIDE0MiwgICAgNDIwLCAgLTE5MTcsCisgIC0zNzgsICAtMTQyOCwgICAgLTkwLCAgIC00OTcsICAgMTExNiwgICAtNDY0LCAgIDIxNzAsICAgIDgwNSwKKyAtMTU3MiwgICAtOTA0LCAgLTkwMjAsICAgLTUzNCwgICA2NDUwLCAgIC00OTAsICAxMDc1MCwgICAgMjc5LAorICAgNzY1LCAgICA5NjEsICAtMzk4NSwgIC0yNzAyLCAgIDI0MjMsICAtNDk4MSwgIC0xMjIyLCAgIDE2NTQsCisgLTEwODksICAtMjE1NywgICAxOTQwLCAgMTQzMzEsICAgLTg5NSwgICAxNzI2LCAgIDE1NTUsICAgIDEyMiwKKyAtMzU1MiwgICAxMjc0LCAgIC01OTgsICAgLTkxMCwgICAzMDU2LCAgLTE3MDQsICAgNjQzMCwgLTEwNjI2LAorICAxMDE0LCAgLTg3NzMsICAgMTAwOSwgICAxOTM2LCAgIC0zNjAsICAgLTQ2OCwgIC0xMDI5LCAgLTg4NDEsCisgIC02MjUsICAgMjIxMiwgICAyMjM0LCAgIDI3MjAsICAgMTE5MCwgICAgLTY0LCAgLTIwNzgsICAgNDY4OCwKKyAgODY5MCwgICA1MTUwLCAgIC00NTAsICAgIDc0NCwgICAtNzk2LCAgLTU2NjEsICAgLTMzMiwgIC03OTM4LAorICAyNjcwLCAgLTQwNTQsICAgMTM3NywgIC0xNTk0LCAgMTE1NTQsICAtNDcwMiwgIC0zNjMxLCAgICA3NDUsCisgICA3NDIsICAgIC05MCwgIC0xMzExLCAgMTI1MjgsICAtNDY2NCwgICAgODM0LCAgIC04NTMsICAgMTU0MiwKKyAgODU2MCwgICAyMjA5LCAgIDQwOTEsICAgMjg3NiwgICAyMTE3LCAgIC02NzgsICAgMTY4NCwgICAgNzg1LAorICAgMzA0LCAgIDc5ODAsICAgMjEyNiwgICAtMzAyLCAgIDgyMzksICAtMjEwNSwgICAxNTg0LCAgMTE4OTQsCisgLTEwNTUsICAtMTM5MSwgICAgNTk2LCAgIDIzNDMsICAgICA4NiwgICAgMzg4LCAgLTEzNDgsICAtMTAwNywKKyAgMTQyOCwgICAgNDEzLCAgLTkyMzEsIC0xMDMxMiwgIC03MzQ2LCAgLTExMDgsICAgMTM4NSwgIC0xMjU1LAorIC0zOTU0LCAgICA3MzgsICAtMTI1OCwgICAgNDEwLCAgICAyMjYsICAxNTExNSwgIC0xMDU5LCAgLTQxMTcsCisgICAtNTAsICAgLTUwNCwgIC0xNzI2LCAgIDE0MjUsICAtOTk3NCwgICAtMzQ2LCAgICA2ODgsICAgIDQ2NCwKKyAgIDI0NCwgICAtNTg2LCAgLTg4ODAsICAgIDg0NSwgICAtNjU5LCAgICA5MzIsICAtMTMwOSwgICAgMjkwLAorICAgLTI5LCAgIC00MTcsICAtMjE4NCwgICAxMDExLCAgLTk2MjIsICAgMTQ0MywgICA5MDA5LCAgIDE5NDUsCisgIDI2OTgsICAgLTcwOCwgIDEwNTcyLCAgIDI0MTAsICAgMTIwMCwgICA0NDkyLCAgLTI1NjksICAgMTQ0NCwKKyAgMjczNSwgIC04NjA0LCAgIDIyNzQsICAtNDA1NywgICAgNDc4LCAgIC0xOTksICAgMTI4NSwgIDEyNjk1LAorIDEyMzIxLCAgLTI5MzMsICAtMTcwOCwgICAxMTk4LCAgICA2NzUsICAgLTQ5MiwgICAtNTYwLCAgICAtNTIsCisgLTEyNjEsICAgICA4NSwgICAtNDgwLCAgICAtOTYsICAgIDY5NiwgICAtNzY0LCAgLTE0MDIsIC0zMTM2OCwKKyAgLTU4MCwgICAtNjc1LCAgLTE2NzgsICAgIC01OCwgICAgNjAwLCAgIC01MjIsICAgLTI5MiwgICAgNjQ3LAorICAgLTM2LCAgICAxNTQsICAtMTE0OCwgICAgNDM3LCAgIDE1NjEsICAgIDU4OCwgICAgNjAzLCAgIDc2MjksCistMTY5NzMsICAgICAyOSwgICAtODI4LCAgIC01ODksICAgLTkxOSwgIC0xMzcyLCAgIC00NzAsICAgLTQ0NSwKKyAgIDQyOCwgICAgNTI4LCAgIDU4MjgsICAgLTM1MywgICAgLTMyLCAgLTE3ODEsICAgLTcwMiwgICAtNjkwLAorIC03MTk2LCAgLTMyNTMsICAgMTk0MiwgICA0NjAwLCAtMTIxMDIsICAgLTY3NCwgLTEwNDgwLCAgLTIzMzYsCisgICA3MTEsICAtMjE3NCwgIC03NDc0LCAgLTE0MzYsICAgLTQ1MSwgIC03MTMzLCAgICA4NTYsICAtMjY1MiwKKyAgMTg5MiwgICAzNDY0LCAgIC01NDYsICAgIDY3NiwgLTEzMjk2LCAgIC01MTYsIC0xMzYxOCwgICAtOTk3LAorICAgOTM4LCAgIDE2ODYsICAgMTAwNiwgICAxMzU4LCAgLTEzNzEsICAgIDkyMiwgICAgNTM0LCAgIC0xNzAsCisgICAxMjYsICAgIDI1NSwgICAtODM1LCAgICAgNTAsICAgIDk0NSwgIC0xMDY2LCAgLTE2NzYsICAgICAgMywKKyAgMTAzOCwgICAtNDM3LCAgMjYwMzAsICAgIDQxOCwgICAgIDI3LCAgLTEwOTIsICAgLTQ5MywgICAtNDI4LAorICAtNjA2LCAgLTEwOTcsICAgLTYyOCwgICAgMjk4LCAgICAyOTUsICAgLTgwNiwgICAgMTgzLCAgICAxNDYsCisgIDEzNTIsICAgIC04NCwgICAtNzIyLCAgICA4MzMsIC0yNTY2NywgICAzMTc2LCAgIDEwMDEsICAgLTMyMiwKKyAtMjMzOSwgICAgIDE1LCAgIC00NzUsICAtMTI1NywgICAyMTE2LCAgICA4NzYsICAgIDYzNywgICAtNTI5LAorIC0xMTA4LCAgICAzMDIsICAtMjQ1MiwgIDE5NzM0LCAgICAgNTgsICAgIDg1MSwgICA5ODQ1LCAgIDExNDIsCisgIDIxNjgsICAgIDcwNiwgIDExMDcwLCAgIDE1NTYsICAgIDU0NCwgICAzMDAyLCAgIDIyMzgsICAtMzk3NCwKKyAgMjczOCwgICAgLTQ4LCAgLTgzMjQsICAtMjE4NiwgICAtMzU1LCAtMTQ5MzMsICAgMjE5MiwgIC0yNDgxLAorICAyNzAwLCAgICA0NzMsICAgLTQ4NiwgICAgNzYxLCAgIC0yMDgsICAgICA3NiwgICAgLTc4LCAgICAxMDIsCisgLTQ4OTYsICAgMTM3OCwgIDEyMzc3LCAgLTgyNjksICAgICAyOCwgICAxMDkyLCAgLTUwNzEsICAtMTUwMCwKKyAtMTE5MCwgICAtODA0LCAgIDEwODUsICAgLTc2NiwgICAgNDkzLCAgICAgMjIsICAtMTA0MSwgICA5MTM2LAorIC0xMjM0LCAtMTIyNDcsICAgIDk2NywgICAyNjcyLCAgIC04ODMsICAgNDU4MiwgICA0ODcxLCAgIDE4OTEsCisgIC01MzIsICAgIDMyOSwgICAgMjI2LCAgICA0NDYsICAtNjcxMCwgICAgMzEyLCAgIC05MTQsICAgMTQxNiwKKyAtMTg1MiwgICAzMDUyLCAgIDY1MTIsICAgODk3MSwgICA1NTQ0LCAgIDY1MTksICAgLTU3OSwgICAxMDIxLAorICAtMjQxLCAgICA5MTEsICAgIDc4MiwgIC0zNDU2LCAgMTAxNTgsICAtMTg2NSwgICAzOTQxLCAtMTIzMDAsCisgICAgIDgsICAgIDQ3MiwgICAgODgyLCAgLTE1ODAsICAtMTc5OSwgIC0xMDI1LCAgIC02MzEsICAgLTEyNywKKy0xNTMxNiwgICA4MDQ3LCAgIC0yMDAsICAtMTg2MCwgICAgNTgyLCAgLTQzNjMsICAtMTI3NCwgICAxMDg1LAorICAgLTQ4LCAgIDIzODMsICAgIDYzOCwgICAgNDgwLCAgICAzNjksICAgLTgzOCwgIC0xMzQxLCAgICA0MTQsCisgIC0xMTQsICAgMjc1NywgICAxMjIyLCAgLTIxOTQsICAtMzM5NCwgICA2NDY5LCAgIDI0MTgsICAgIDczOCwKKyAtMTY1NiwgIDE1NTk0LCAgLTEwOTAsICAgIDIwMiwgICAgNzI3LCAgIC03NjksICAgIDQ4NCwgICAyNDYyLAorICA0ODc1LCAgIDE2NTYsICAtMzgzNSwgLTE2ODc3LCAgIDUyNzYsICAgIDIzOSwgICAgOTgyLCAgLTE4NzIsCisgIC0xMzAsICAgIDkwMSwgICAxMzUyLCAgIC0xNTUsICAgNDkzOSwgIC04MzE3LCAgIDkwMDAsICAgMjUwMywKKyAgIDQ4NSwgICAxMTg0LCAgIC01NDgsICAtMTM1NiwgIC03NDgyLCAgIC0xODgsICAtMTU4NywgICAgNDk2Cit9LAorCisuZmNiMDhsID0geworIC0yNTM5LCAgLTMyNzUsICAtMjY5OSwgIC0zMzQ1LCAgLTI4NDMsICAgNTUwMSwgICAgNDI2LCAgIDcxMjcsCisgIC0xNDksICAgMzExMSwgIC0yOTkxLCAgLTIyOTcsICAtMjM0NSwgICAyNzAyLCAgIC05NjksICAgLTk0NiwKKyAgMjgzNywgICAxMTE0LCAgIDE4MDAsICAgMTI3MSwgIDEyMjQ5LCAgLTIyODIsICAtMjMwOSwgICAxNTY2LAorIC0yODg5LCAgLTMwMjAsICAtMjA4MywgICAzNTg2LCAgIDg5MTksICAgMjY1MSwgICA0MTExLCAgLTE4NDIsCisgLTE1ODgsICAtMTQyOCwgICAzMjUxLCAgIC0xMDIsICAgIDE1NiwgICAtMzIwLCAgICA3MjIsICAgMTcxMSwKKyAyMDU2NSwgIC0zMDY4LCAgLTIyMTEsICAtMzE2NCwgIC0zNDEwLCAgLTMzOTYsICAtMjg4MiwgIC0yMDAyLAorICAxNzMwLCAgIDQwNzcsICAtMjY5NiwgIC0xNjk0LCAgLTI4MzksICAgMjk0OCwgIC0yNzM5LCAgLTIzODAsCisgLTIyNTIsICAtMTMxMSwgICAtMjY5LCAgIDE5MDAsICAtMjc5NiwgICAtNDQ0LCAgLTI5OTYsICAtMjUyNSwKKyAgNTE5NCwgICAxNDU5LCAgIDUwNDIsICAtMTA4OSwgICAgOTE0LCAgIDQxMTYsICAgNzY0NCwgIC0zMTM3LAorIC0zMTU2LCAgIDQwMjgsICAtMzQzNSwgIC0zMjQwLCAgLTI1ODUsICAgNTU0MiwgICA1MTE5LCAgIDk4ODUsCisgLTI5OTUsICAtMzE1MywgIC0zNDQ5LCAgLTMxMDEsICAtMzU1MSwgIC0zNDY5LCAgLTIxOTYsICAtMTI3MSwKKyAgMzg2OSwgICA1NDEzLCAgLTI4MDAsICAtMTk5MCwgICAzMzcxLCAgLTIyODYsICAtMTAyMiwgICAzMTkwLAorICAtNTUwLCAgIDE3MjMsICAgIDk2OCwgICAxOTE2LCAgLTI3NDksICAtMTUzMCwgIC0yMjExLCAgLTI5ODcsCisgLTMzNTcsICAtMzI2MiwgIC0xMDQyLCAgMTAyNzcsICAgIDEwNywgICAyNjYyLCAgIDk4MTksICAtMjc1MywKKyAgNDI2OSwgIC0zMjc3LCAgIDMxMjUsICAtMzEzMSwgIC0yOTc0LCAgLTMyNTEsICAgNjQ2NiwgICA5NDg0LAorIC0yMDM0LCAgLTI3MDcsICAtMjQyNCwgIC0zMTcwLCAgLTI2MTksICAtMjI3OCwgICAtMTQzLCAgLTE2NDEsCisgMTE4NTYsICAgNTk3NSwgIC0xMjgyLCAgLTI2MjksICAtMjM5NiwgIC0yMzY0LCAgLTIwMTIsICAtMTA4NSwKKyAtMjU3NiwgIC0yNDIyLCAgLTIyMDYsICAxMzczMSwgIC0yMjYxLCAgIDI3NTEsICAtMTc2OCwgICAyNDgyLAorIC0xMDY1LCAgIC0zNDcsICAgLTEzNywgICAgIDMxLCAgICA2MTksICAgIDM4NSwgIC0yMjU3LCAgLTIyMTUsCisgLTE2OTgsICAtMjY4NiwgICA0NDY4LCAgLTI1NjMsICAtMTA3MSwgIC0xMzU5LCAgIDc3NTcsICAgMzczMiwKKyAtMjg1NiwgICA5MDE4LCAgLTIwNDYsICAtMTQ5NCwgIC0yMjM0LCAgLTIyMDksICAgIC02NywgICAxMzQwLAorICAyNDMzLCAgIDI5NjUsICAtMjcyMiwgIC0yMTUxLCAgLTI5NjYsICAtMjc4MCwgIC0yNzMyLCAgLTE1MDksCisgLTIwODUsICAtMTUzMiwgICA2OTM0LCAgLTEyNDgsICAtMTkzNiwgIC0yMjAzLCAgIC03ODcsICAtMTc4MSwKKyAgLTg5NSwgIC0xOTkwLCAgIDQ2OTMsICAtMTgxOCwgIC0xNTY5LCAgIDE5NTQsICAtMjI4MywgIC0yNDAzLAorIDEwNTE0LCAgLTMxMDUsICAtMTA3NCwgIC0yODM4LCAgICAgLTEsICAgMTE5MiwgICAxMTEzLCAgIDMzMDksCisgLTIyNDksICAtMjQ1MSwgIC0xNjYwLCAgIDI1MzUsICAtMTQzOSwgICAzNTgyLCAgLTEwOTMsICAgLTU5NCwKKyAgMTk1NiwgICAgNzU4LCAgIDUzNDksICAtMjUyNCwgIC0yMzIwLCAgLTE5MDMsICAtMjA1NSwgICA1MDc1LAorICAtOTQxLCAgIC03MjEsICAgLTUzNiwgICAyMTk3LCAgLTIzMDksICAtMzAyNywgIC0xNDYwLCAgLTI5MTEsCisgMTEzNDQsICAtMjQ3NCwgIC0xNjAxLCAgLTE3NDksICAgMzI2MCwgICAyNTQ3LCAgIDM4MTksICAtMTI0NywKKyAtMTQ0OSwgICAyODM1LCAgLTExMTgsICAgLTY1MiwgICAtNTE2LCAgIC0zNzksICAgIDUzMSwgICAgNDQwLAorICAtNTY5LCAgLTI2MDYsICAtMjU0NSwgIC0yNDQ3LCAgLTE2ODUsICAgODY3OCwgIC0xODY4LCAgLTIwMDMsCisgIC05OTIsICAgNTg4OCwgICA4NTkxLCAgLTE4NDgsICAtMjAxMCwgIC0yMTk2LCAgLTIwNDksICAgLTY1OCwKKyAgMzQ3MywgICAgMjE0LCAgICA5MDUsICAgIDMxNywgIC0yMDUwLCAgLTEwODMsICAtMjU5MywgICA4NzU0LAorIC0yMjM0LCAgLTI0NDksICAtMTY4OCwgICAyMTk0LCAgIDIyNDQsICAgMjUwMiwgIC0xNjU5LCAgLTI3NDgsCisgIDQ1ODQsICAtMzAxMSwgICAzNzAyLCAgLTIzMDcsICAtMTg4NywgIC0xOTYwLCAgLTEwNjgsICAgMjg4OSwKKyAtMzAyMiwgIC0yOTg5LCAgLTIyOTUsICAtMjc5NCwgICAzMDcxLCAgLTE1ODgsICAgIC00MywgICAyNjI3LAorICAxMjc4LCAgIDIwMzEsICAtMjE0NSwgIC0yNTUxLCAgLTIzMzMsICAtMzIwNSwgIC0zMjM3LCAgLTI3NjAsCisgIDkwODIsICAgLTQ1NCwgICA0MzM5LCAgIDE3NzYsICAtMjczOCwgICA0Nzg1LCAgLTIxNzYsICAtMTg5NiwKKyAgMjE0OCwgICAxMzUwLCAgICA3NjgsICAgIDI0OSwgICAxMDAxLCAgIDE0OTksICAgIDc5NywgIC0yMTgyLAorIC0xNDQzLCAgIC0yMjksICAgIC0zMiwgICAgODI3LCAgICA0MDEsICAgIDI3MCwgICAgNTgxLCAgICAzODAsCisgLTIzNzAsICAtMjM3NiwgIC0yNjc5LCAgLTMwOTksICAtMTc0MiwgIC0xMTQ5LCAgIDQ2NjYsICAgLTY5MywKKyAgMTEwOSwgICA3NTQ3LCAgLTI0OTYsICAtMzA2MywgIC0yODE4LCAgLTI2MjEsICAtMjAxNiwgICA1NzIyLAorICA0OTMyLCAgIDEyMTcsICAgMjE2MSwgICAyNDQ5LCAgLTIyMDcsICAtMjk1NCwgICAzNzY5LCAgLTI4MjQsCisgLTE4MDksICAtMjk0NiwgIC0xNjkzLCAgIC0zNzcsICAgMTU2NSwgICA0MTAwLCAgLTI5NDcsICAgMzA2MywKKyAtMzA2MiwgIC0yOTE5LCAgLTMwOTMsICAtMjUyMCwgIC0xNzEyLCAgIDIzODMsICAgMTMwNSwgICAxODY3LAorIDEwMTQ1LCAgLTI5MTIsICAtMzMwNywgICA3NTE5LCAgLTM1MDIsICAtMTA2MywgIC0yNzgyLCAgIDg1OTUsCisgIC03NTAsICAtMTUwMywgIC0zMTQxLCAgLTI0ODYsICAgMjkyMywgIC0yNTc0LCAgLTE4MjYsICAtMTI0NCwKKyAgMzUzNywgICAyNDk0LCAgIDI1ODMsICAgMTU2MCwgIC0yNzIyLCAgIDMyODQsICAgMjI0NSwgIC0xMjU4LAorICAtNjU4LCAgIC0zOTQsICAgIDQ4MywgICAgNzE5LCAgIDExMjEsICAgMTA3MywgIC0yOTQ5LCAgLTEwMTMsCisgLTMwNDgsICAgIDU5NywgIC0zMTAzLCAgLTI1MTAsICAtMTk3MCwgICA3MjA3LCAgIDg2MzUsICAgMTkxNywKKyAtMTc3MiwgICAtNDgzLCAgLTIzMTgsICAtMTg2MCwgIC0yNTAwLCAgIDI5ODEsICAtMTY1MSwgICAgNTUwLAorICAgNjk2LCAgICA2MTUsICAtMjEyMSwgIC0yMDU1LCAgLTE2MTksICAtMjEyNiwgICAzMTA4LCAgIDM0MTcsCisgIC00ODUsICAgIC00NywgICAgODQ4LCAgIDE2MDgsICAtMjYzNiwgIC0xNzA3LCAgIDMxNDIsICAgMzc5OCwKKyAgIDQ3OSwgIC0xMTEyLCAgICA1OTcsICAgLTMyMywgICAxNTU1LCAgIDE1MzEsICAtMjkzMCwgICAyMTA2LAorIC0yMzk4LCAgLTIzMTQsICAtMTgzNSwgICAgICAwLCAgIDI5MjAsICAgIDg5NiwgICAyMzU2LCAgIDEyNTksCisgLTI5MTEsICAtMzE4NCwgICAgNTkzLCAgLTM1NzAsICAtMzM4OSwgIC0zMjYzLCAgIDczNDAsICAgNzY0MCwKKyAgNjg3NCwgICA2NTQ5LCAgLTE5MTIsICAtMTMzNCwgIC0xNzQ5LCAgIC01NjgsICAtMTcxOCwgICAtNDA1LAorIC0xMzc1LCAgIDM0NTYsICAtMTAyNCwgIC0xOTAzLCAgIDkzODQsICAtMjcyMSwgIC0yNDg1LCAgLTIzNzcsCisgLTMwMjYsICAgLTg5OSwgIC0zMTMzLCAgLTMwMzIsICAtMjQ1MiwgICA3NzE1LCAgIDI0OTIsICAtMjQ1MCwKKyAtMTcyMSwgIC0yMTM4LCAgLTE0OTcsICAgIC01NSwgICAgNzYwLCAgIDIzODIsICAgMTE4MywgICAxMTA1LAorIC0yNzgyLCAgICAzODksICAtMTUyOCwgICAtOTI3LCAgICA2NjQsICAgLTUzMSwgICAxNDA1LCAgICAzNjMsCisgICA1ODIsICAgLTI5MiwgIC0xNjc4LCAgLTI3MTgsICAtMjc2MywgIC0zMTQwLCAgLTI3OTksICAtMjE3OCwKKyAtMjcxNSwgIC0yNTkyLCAgIC05NzIsICAtMTIyNiwgICAzMjc4LCAgLTExNzMsICAgMjkxNiwgIC0xNTQ4LAorICAtNDQ2LCAgLTEyNDEsICAgLTIwOSwgICAgMzc5LCAgICA2ODksICAgIDUzOCwgICAzMTEwLCAgIDI4NTcsCisgLTE3MzUsICAtMTI0NCwgICAtNTg5LCAgIC00MTMsICAgICA2NSwgICAgNDcxLCAgICA1MjIsICAgIDMyMywKKyAtMjA0MywgICAtMjEyLCAgIDEzMDksICAgLTQ3MSwgICAtNTY0LCAgICAtMTYsICAgIDM3OCwgICAtMzIwLAorICAtNDM3LCAgICAyMjgsICAtMjE5NCwgIC0yNjM3LCAgLTI1MTMsICAtMjY3MCwgIC0xODYzLCAgIC05NTQsCisgLTIwODIsICAtMjM5OCwgIC0yMjcwLCAgIDU1NjMsICAtMjk1OSwgIC0yNDQ0LCAgLTI3OTQsICAtMTczNiwKKyAtMTYzMSwgIC0xMzI0LCAgIDE0ODIsICAgLTQ4MSwgICAyMzE3LCAgIDE0NzAsICAtMjg3MSwgIC0yMDA3LAorICAgNzAyLCAgLTE5ODAsICAgLTQ5MSwgICAtMTQ2LCAgIC02OTUsICAgLTE0NSwgICAyODE3LCAgIDEyNjgsCisgLTMzOTUsICAtMzQ1NiwgIC0zMDY5LCAgLTM0MzMsICAtMjg3NCwgICAtMjA1LCAgICA4MDYsICAgMzAzOCwKKyAgMzgwNiwgICAyNjIzLCAgLTI5NTQsICAtMTg2MSwgICAtNzEyLCAgIDEwMTcsICAgLTMyNiwgICAgIDQ0LAorICAgLTkzLCAgICA5MTAsICAgIDc3NSwgICAgMzQ2LCAgLTI2MjUsICAtMjU3MCwgIC0yOTc0LCAgLTIzNDQsCisgLTI3MTIsICAtMTkzMCwgIC0yMjEzLCAgIDM1MjEsICAtMTM0MSwgICA0MzI3LCAgIC0xNDEsICAgIDgzNSwKKyAtMTExOSwgIC0xMzM2LCAgLTEwOTIsICAtMTg5MSwgICAtODYwLCAgIC03MjcsICAgIDMxNSwgICAyNTYyLAorICA0MTE5LCAgLTI2MzgsICAtMjU4NCwgIC0xOTUxLCAgLTI3MTAsICAtMjQ5OSwgIC0xNTYxLCAgIC05NTIsCisgIDI4MjEsICAgMjUwNSwgIC0yMzg4LCAgLTE4NTUsICAtMjkyNiwgICAxNzQyLCAgLTI1NjMsICAtMjY1NSwKKyAtMTgwMiwgICAzMDgyLCAgIDMwNjMsICAgMjQ1NiwgIC0zMzA0LCAgLTI2NzAsICAtMjE0NywgIC0xNTA0LAorICAtMzA5LCAgIDE0MjEsICAgMTY2MSwgICAxNTQ2LCAgICA1NjAsICAgIDYxNSwgIC0yNTkwLCAgLTE1OTMsCisgLTE1MjMsICAgMjAyNSwgICAzMTY3LCAgIC04NDEsICAgLTM1NiwgICAtNjQ4LCAgICAzMDksICAgMTE2NQorfSwKKworLmZjYjA4bSA9IHsKKyAtMjk2MiwgIC0yMTQwLCAgLTIxNjYsICAtMTQ1NCwgIC0xNjM4LCAgLTExMDAsICAgLTgzNSwgICAgNjg2LAorICAgOTc4LCAgICA1NTAsICAtMTYzMCwgIC0xMDIxLCAgLTE0MjQsICAtMTg2NywgIC0xMTE4LCAgIC00NzQsCisgICAgNjYsICAgNjEwNCwgICAgOTA0LCAgICA2MDMsICAgLTgyOSwgICAtNDc1LCAgLTEzNjgsICAtMTE5OSwKKyAgNzI1NSwgICAtODkwLCAgIC00NjUsICAgIDExNCwgICAgMTE4LCAgICAyMjQsICAtMjQ1MywgIC0xMjc5LAorICA4MTkyLCAgLTEyODksICAgLTQ1MiwgICAgLTQ3LCAgICAxODAsICAgIDMyNCwgICAgNjI3LCAgICAyMDksCisgLTI3NzAsICAxMTIxNCwgICAtODU3LCAgLTE3MjAsICAgLTg5NSwgICAtNTMxLCAgIC0yOTEsICAgLTI2NCwKKyAgIDIzMiwgICAtNDAyLCAgLTI2OTksICAtMjU2MSwgIC0yNDMzLCAgLTIwOTMsICAtMTMxNSwgICAgIDg2LAorICAyNjY2LCAgIDE2NjMsICAgMTM1MSwgICAyMzQ5LCAgLTI3ODgsICAgNDU3NiwgICAzNjgwLCAgLTEzNjUsCisgIC05OTUsICAgLTUxMywgICAgIDQ2LCAgICAgNDQsICAgIDUyMiwgICAgMTQyLCAgLTI3MzksICAtMTY1NCwKKyAtMTk1MCwgICA0NTczLCAgIC02NTksICAgLTUzNiwgICAgMjg1LCAgICAgNzIsICAgIDg3NSwgICAgNjI3LAorICAzMTQyLCAgICAxMDUsICAgLTk0MSwgICAxMjQ1LCAgIC00ODksICAgLTQ5NSwgICAtMjI5LCAgICAgNDQsCisgIC0yMzYsICAtMTA4MywgIC0yMzM2LCAgLTExOTMsICAtMTYyMCwgIC0xODU5LCAgLTEzMzksICAgLTY1NSwKKyAgIDIwNSwgICAxMDMyLCAgIDU1ODEsICAgMTE5NSwgIC0yNjM1LCAgLTE3NDAsICAgMjY1NiwgICAxOTc2LAorICAgLTUyLCAgICA3ODQsICAgIC05NiwgICAtMTY1LCAgICA0MTksICAgLTQ4NiwgICA4ODUwLCAgIC02MjQsCisgIC03OTIsICAtMTUzMSwgICAtNzY1LCAgIC02NzQsICAgLTczMCwgICAtODI5LCAgIC0xNTAsICAgIC0yNywKKyAgMjI1NSwgIC0xMTc3LCAgIDI3MjcsICAtMTQzMCwgICAgNzM3LCAgIC05MDIsICAgLTc4MCwgICAtNzI5LAorICAgMTY5LCAgICAyNzgsICAgMzcyOSwgICAzNzYzLCAgICAtMzIsICAtMTU4MSwgICAtNTYzLCAgIC01NzMsCisgICAgNzcsICAgLTM3MiwgICAgLTY0LCAgIC00NzcsICAtMjUwMCwgICAgNTI2LCAgLTE2ODIsICAgMTQ2NCwKKyAgLTgzMCwgICAtMTI0LCAgIC01NDgsICAgIDU2MSwgICAgMjAyLCAgIDExMTUsICAtMTY4MiwgIC0xNTUyLAorIC0yMDE0LCAgLTIxMjcsICAtMTM3NCwgICAtNzQ5LCAgIC03MjAsICAgICA2NCwgICAyMDk3LCAgIDY5NDQsCisgLTI3NzEsICAgNDkyOSwgIC0xNjgwLCAgLTIyMTIsICAtMTQzMCwgICAtODAxLCAgICAxMTQsICAgIDg5MSwKKyAgMTE3NiwgICAgODU1LCAgIDM1NzEsICAtMjE4NywgIC0xNTY2LCAgLTE2OTQsICAgICA4NCwgICAgLTQ2LAorICAgOTMyLCAgICA3ODYsICAgIDc2NSwgICAgODU2LCAgLTEwMzgsICAgLTQ5OCwgICAtMTE3LCAgLTE1ODIsCisgLTEzNzksICAtMTE2MiwgICA2MjkzLCAgIC0zNjcsICAgIDU5NCwgICAgMTMyLCAgLTI0ODcsICAgMjExOSwKKyAtMjE1MywgIC0xNzQ5LCAgICA4MzMsICAgMTA4OSwgICAgNTA3LCAgICAxMzMsICAgIDMzNywgICAgNDIzLAorIC0yNzc3LCAgIDI1MDcsICAgIDI3NywgIC0xNDU1LCAgLTEwMTksICAgMTgxMSwgICAgNjM5LCAgIC01OTUsCisgICAxMzYsICAtMTA1MCwgIC0yOTQxLCAgIDQ0NzQsICAgLTE3NiwgICAxMDk1LCAgIDExMTMsICAgLTQ3OSwKKyAgIDE4MiwgICAtMjk1LCAgIC0yMjksICAgLTYwNSwgIC0yMDM1LCAgLTE2NDksICAtMTE3MSwgICAgIDUxLAorICAgICAwLCAgICAxMjUsICAgMjg0NCwgICAtMzEwLCAgICAtODIsICAgLTY0MCwgIC0yMjUxLCAgLTIxMzgsCisgLTIyNzAsICAtMTU2NywgICAyMjYwLCAgICAgOTIsICAgIDM2OCwgICAgIDk1LCAgIDE0MzMsICAgMTM0NiwKKyAgIDgyMCwgIC0yMzM5LCAgLTE4MjIsICAgLTg5NSwgICAgLTY5LCAgICAxNTgsICAgIDE5MCwgICAgOTExLAorICAxMDA4LCAgICA3NjQsICAgIDY4NCwgIC0xNzU2LCAgLTEwMTMsICAtMTYyNSwgIC0xNjEwLCAgIDYwNjIsCisgIC00OTksICAtMTAzNiwgICAtMTM5LCAgIDExMjksICAgIDQ4OCwgICAgNTI0LCAgIC02NjUsICAgLTg3MCwKKyAgLTM0NywgICAgLTc2LCAgICAxMjMsICAgICA5MSwgICAgLTEyLCAgICAgMTQsICAtMjg2NywgIC0yMDE5LAorICAyODU4LCAgLTE5MDMsICAtMTE2NSwgICAgMzA5LCAgICAyODcsICAgMTI1MCwgICAgNzY3LCAgICA3NzYsCisgLTI3ODQsICAtMjQ0NiwgIC0xMTU3LCAgICA0NjAsICAgMjU4OSwgICAgNDM3LCAgIC0yODUsICAgIDcxMSwKKyAgLTI5OSwgICAgNDAyLCAgLTI2ODMsICAtMjI3MSwgIC0xNzE0LCAgLTE1MzUsICAgLTU0NywgICA0MTE4LAorICAgNTEwLCAgIDExNTgsICAgIDcwMCwgICAgNjMxLCAgLTIwODQsICAtMTIzNiwgICAgNTA5LCAgLTEwMDksCisgIC01MTAsICAgLTE5MywgIC0xMDc1LCAgIC03OTMsICAgIDcyNywgICAyMTUwLCAgLTI3MjIsICAgIDk2OCwKKyAgMTA3NywgIC0xNTc5LCAgLTE0MTAsICAgLTg5NCwgICAgNDAxLCAgIDEwNDMsICAgIDQyNywgICAgMTgyCit9LAorCisuZmNiMDhzID0geworIC0yMzY4LCAgLTIzNDAsICAtMTczNSwgIC0xODk3LCAgLTE0OTMsICAgIDk4NCwgICAzMDYyLCAgIDI4MjYsCisgIDEwNDksICAgIDE2NCwgICAxMTgxLCAgLTE5OTAsICAtMTgzMywgIC0xNzIwLCAgLTEzNjAsICAgICAyNCwKKyAgMTQ4NSwgICAxOTIzLCAgICA0NjAsICAgIDUxMSwgICAgIDY5LCAgICAgNzgsICAgLTM1MywgICAgIC0zLAorICAzNzYxLCAgIC00ODAsICAtMTUzOCwgIC0xMDYzLCAgICA1NDAsICAgIC02NCwgIC0xNTQ2LCAgIC05ODgsCisgIDE1MTQsICAtMTE2NywgIC0xMzU0LCAgIC01NjMsICAgMTQzNSwgICAgODgwLCAgIDExMjMsICAgIDE4MiwKKyAtMjI0MywgIC0yMTA5LCAgLTIzNzgsICAtMjIwMSwgIC0xNDkxLCAgIC04MzYsICAgLTEyNCwgICAgNjA1LAorICA2MTU5LCAgIDM2MzYsICAtMjc3MCwgIC0yOTU5LCAgLTI5NTYsICAtMzAxOSwgIC0yMTU0LCAgIC02NDgsCisgIDE4MDUsICAgNDY5OCwgICAyOTI5LCAgIDIwNzgsICAgLTk3NSwgICAtMzYwLCAgIC04OTUsICAgLTYyMywKKyAgLTU5MywgICAtODc5LCAgIC0zNDUsICAgNDMzMywgICAgNDkyLCAgICAtNTYsICAtMjEwMiwgICAtNzgxLAorICAtNDc2LCAgIDEyNjgsICAgIDYwNiwgICAtNjcwLCAgIDE2ODYsICAgLTEwNSwgICAgMzcwLCAgICA0NjEsCisgIC0yMjEsICAgLTg2OCwgIC0xMzgxLCAgICAyOTcsICAgIDEyOCwgICAtNTc4LCAgIC04MDksICAgLTkzOCwKKyAgMzg5NiwgICAgNDkwLCAgIDQwMzIsICAgMjY3NSwgICAtNjg0LCAgLTExMDgsICAtMTIzNSwgICAtOTE1LAorICAtODc0LCAgIC05MTksICAgLTgwMiwgIC0xMDQwLCAgLTEzMjQsICAgIC0xNiwgICAyMTU2LCAgIDE5NDMsCisgIC02NTIsICAgLTY2NiwgICAgLTQ3LCAgLTE0OTksICAgIDE2OCwgICAtMjEwLCAgIDQyMTMsICAtMTg5NSwKKyAtMTczNCwgIC0xNzY3LCAgLTE0MTIsICAgLTg2NywgICAgLTcxLCAgICAzMjksICAgIDg1NSwgICAxMjk0LAorIC0xODQ5LCAgIDQzOTMsICAtMTMxMiwgIC0xNTk3LCAgIC01NjQsICAgIDQzNCwgICAtNDU0LCAgICAyNjksCisgICA4OTIsICAgIC0zMSwgIC0xMTcwLCAgICAgNjcsICAgIDM3MCwgIC0xMTQ0LCAgIC0zMjAsICAgMzcwNiwKKyAgLTgxMSwgICAtMTkwLCAgIC0xMjMsICAgLTE2NiwgICAtNjU5LCAgLTEwMzMsICAgLTc4OSwgICAtOTAyLAorICAtMzQ3LCAgIC0yODAsICAgLTEwOCwgICAtMzEzLCAgICA0NTIsICAgMzcwMSwgIC0xNTA1LCAgLTI2MTAsCisgLTI3NTgsICAtMjU1MCwgIC0yMDM0LCAgLTEzNjEsICAgLTY3NiwgICAgNzEzLCAgIDIyNjMsICAgODI4NiwKKyAtMjI0MSwgIC0yNTA4LCAgLTI1NDAsICAtMTcyMSwgICAgMTgyLCAgIDE5NDcsICAgIDMwNiwgICAxNzczLAorICAxMjIwLCAgIDI5MDksICAgIC02MCwgICAgIDczLCAgIC0yMzUsICAtMTYzMSwgIC0xMzAyLCAgIC02OTIsCisgIDQxNzEsICAgLTgzMCwgICAgIDQ5LCAgIC0xODgsICAgLTQ3MSwgIC0yMjA4LCAgLTIyNjUsICAtMTUxOCwKKyAgLTE5NiwgICAyOTk1LCAgIDI1NzEsICAgLTU3OSwgICAgLTY4LCAgICA4MDUsICAtMTI5NCwgICAxMjc0LAorICA0Mjk0LCAgLTEzNTYsICAgLTcwMiwgICAtNTMyLCAgIC00NjUsICAgLTEyMywgICAtNDAwLCAgIC03MTksCisgICAzMzYsICAgMzA5MywgICAxNjM0LCAgIC05MDYsICAgIC03MSwgICAtNTAyLCAgIC05MzgsICAgLTk4MiwKKyAgLTc0MiwgIC0xMTg3LCAgLTE3NTcsICAgMjg5MCwgIC0xNTkxLCAgIDEzMDMsICAgIDIxNiwgICAtMzExLAorICAtNDA0LCAgICAtMjksICAgIDUwMSwgICAtNTQzLCAgLTE0NjYsICAgMTU4NywgICAgMzA5LCAgIC01NzgsCisgIC0xNzMsICAgICAzNCwgICAxMTE2LCAgIDEyODYsICAtMTE4NCwgIC0xMTc0LCAgIC0xNzUsICAgLTczMiwKKyAgLTYxOSwgICAzNTA4LCAgICAtODAsICAgIDE5MSwgIC0xMDU5LCAgIC0xNzQsICAgLTQyOSwgICAtNDcwLAorIDEwMDAwLCAgIC05MzMsICAtMTUxMSwgIC0xNjAxLCAgLTE1NzEsICAtMTQ0NSwgIC0xMDY1LCAgLTE0MDcsCisgLTEwNTMsICAgLTkzMiwgICAxMTgzLCAgIDc4NzUsICAgLTQ2MCwgIC0xNjA5LCAgLTE2MTgsICAtMTM5OCwKKyAtMTE1NCwgIC0xMjI3LCAgLTEwMTIsICAtMTQ1MCwgICAgIDIwLCAgICAgMjgsICAgLTIzNSwgICAtMTEwLAorICAgMjAzLCAgICAxMDUsICAgIDI1MiwgICAtMTU0LCAgICAtNTEsICAgIC01OCwgICAyOTQwLCAgIC00OTAsCisgICAgMTcsICAgIC01MSwgICAgMTMxLCAgIC0xMDYsICAgLTUyNiwgICAtNTY2LCAgIC04MjIsICAtMTE3NywKKyAtMTMzNSwgICAyNzQ5LCAgICA2MDgsICAtMTU3NSwgIC0xMzIyLCAgLTEzNTEsICAgIDExMSwgICAgNjQxLAorICAxNDQxLCAgICAgLTksICAgIDczMywgICAtMjA3LCAgIC0yNzMsICAgLTY2NSwgICAtNjMwLCAgIC01ODgsCisgICAtNzgsICAgIDI1NCwgICAgMzA0LCAgICA3NjIsICAtMjY2MSwgIC0yNjc3LCAgLTEyMzgsICAgIC04MiwKKyAgMjU2OSwgICAzMDAxLCAgICA5MzIsICAtMTAzMiwgICAgMjExLCAgIC0zMjQsICAgICA0MCwgICAxMzk1LAorICAtODM2LCAgLTExMTksICAgLTYzNSwgIC0xNDI1LCAgLTE1MTQsICAtMTEzNSwgICAxNTA5LCAgIDI5NjMKK30sCisKKy5mY2IxMWwgPSB7CisgLTMwMDQsICAtMjkyNywgIC0yNjcyLCAgLTIzNTYsICAgLTczNSwgICAgMTc5LCAgICA5NTAsICAgMTczNCwKKyAgMTEwMSwgICAxNjQxLCAgLTE2MTAsICAtMTE2MSwgIC0xNjA2LCAgIC0xNzksICAtMTYzNCwgICAzMzgzLAorICAtNjEwLCAgICAyNDAsICAgICA3MywgICAxMTI4LCAgICA4MTgsICAtMTA1MiwgIC0xNjQxLCAgICA3MjQsCisgLTE5MzgsICAtMTc0MSwgIC0xMjExLCAgIDM5NjcsICAgMTk4OCwgICAxNDQ1LCAgIDMwMTAsICAgMjIwMywKKyAtMTY4NSwgIC0xNjk4LCAgLTE4MzgsICAgLTc1OSwgICAtMTQ0LCAgICA1MTUsICAgIDk5OSwgICAxMjE1LAorICAzMjM5LCAgLTE5MTIsICAtMjA0OCwgIC0xNzM5LCAgLTE0ODgsICAgLTE0OCwgICAxNTkwLCAgIDEzNzAsCisgIDEwNjYsICAgMTI3MCwgIC0yNzIxLCAgLTE2MzcsICAgICA5OSwgIC0xOTY0LCAgICAyMjQsICAgLTk0NiwKKyAtMTQzNywgICAtOTU0LCAgICA3NTUsICAgMTQyMCwgIC0yODAwLCAgLTIyMTEsICAtMjMwNCwgIC0yMDQ4LAorICA0ODUzLCAgIC03MTQsICAgLTM4MywgICAyMTU5LCAgIDE4MjMsICAgMjMyOCwgIC0xNjE5LCAgLTE1ODQsCisgLTE4MzksICAgNTQ2MiwgIC0xNzAzLCAgIC04MDIsICAgLTIyNywgICAgNDg1LCAgIDEwMTcsICAgMTY5NSwKKyAtMjQ1OSwgICAyMzk5LCAgLTE4MjAsICAgMjI1NCwgIC0xMzczLCAgIC03NjcsICAgICA1MywgICAgNzA1LAorICAxMDc0LCAgIDEyOTMsICAtMTU4MiwgIC0yNDg2LCAgLTIyMDgsICAtMjM0MSwgIC0yMjY0LCAgLTIxMzIsCisgLTE1NzgsICAtMTA0MywgICAgMzIyLCAgIDc2ODUsICAtMjE5OCwgIC0xNzY4LCAgLTIxMDYsICAgICAxNiwKKyAtMjIwNywgIC0xNDk1LCAgLTExMDYsICAgLTk2MSwgICAtNDgyLCAgIDE2NDIsICAgNjc4NSwgIC0xNTQwLAorIC0xNTQwLCAgLTE0NDksICAtMTE3NywgICAtODU0LCAgIC0zMDcsICAgIDg1MywgICAxMjc5LCAgIDE0NDksCisgIDMyNTMsICAtMTQyNywgICAyMzE0LCAgLTE0NzMsICAgLTk4NSwgIC0xMDI1LCAgIC0zMjEsICAgIDkyMywKKyAgMTE0MCwgICAxMTY2LCAgLTI3MDQsICAgMjY2NCwgIC0yNDQ0LCAgLTI3MTcsICAgIDQ4MSwgICAzMDgzLAorIC0xNDQ5LCAgIDEyMjUsICAgMzE2OCwgICAyMzg5LCAgLTIxMjQsICAtMTk4MSwgIC0xMzQyLCAgLTE5MzksCisgLTE5MDQsICAgNDczNiwgICAtODg1LCAgIC04MjYsICAgMzg2NiwgICAyMDQ2LCAgIC0yOTAsICAgLTU2NywKKyAtMTk4NiwgIC0xODgwLCAgIDE5NjYsICAgLTQ2NSwgICAxNjM4LCAgICA2ODMsICAgMTAwNSwgICAxMDk5LAorIC0yODQyLCAgLTI1MzcsICAtMjU1OSwgIC0yNDI3LCAgLTEyNDMsICAgNDAzOSwgICAxMzcxLCAgIDM4OTcsCisgIDI1MjksICAgMjQwMCwgIC0yNTg2LCAgLTEzMjgsICAgIDc4NSwgIC0xNjk3LCAgIDE3MzMsICAgMjM4MiwKKyAgLTQ0MiwgICAgMTkwLCAgICA5MDEsICAgMTI4MSwgIC0yNjY5LCAgIDIxOTgsICAtMTUwMiwgIC0xNDA0LAorICAyNTkzLCAgIC02OTQsICAgLTE4NiwgICAgNDY2LCAgIDEwNjUsICAgMTE5OSwgIC0xOTA1LCAgLTEzODksCisgIDYxNzEsICAtMTgxNywgICAtNTEzLCAgIC05ODksICAgLTM1NiwgICAgMjQ2LCAgIDE2MTksICAgMTg4MywKKyAgICAzNiwgIC0yMTc4LCAgLTE2MDIsICAgIDYwOCwgIC0xNTIzLCAgICAgMjMsICAgMTI2NSwgICAgNTc4LAorICAgOTUzLCAgIDEwMzgsICAgLTQ4MywgIC0yMjc4LCAgLTIxMzgsICAtMTc0MCwgICAgNTg0LCAgICAyNDQsCisgICAtNTQsICAgLTE5MiwgICAgOTE1LCAgIDEwOTcsICAgLTIxMywgIC0xNTY5LCAgIDE4NjEsICAtMTQwMSwKKyAgMzY4NiwgIC0xNjI1LCAgLTEyMzQsICAgLTYxNCwgICAgODYwLCAgIDEzMTEsICAtMTM5NywgICAyMzE1LAorICAxODk2LCAgLTE2MDgsICAtMTMyNiwgIC0xNDg3LCAgICAtOTksICAgMjI0MSwgICAgNjk3LCAgIDExNTYsCisgIDE3MTEsICAtMjA5OSwgIC0xNTA3LCAgIC0xMzUsICAgMTQyMiwgICAtNjk1LCAgICAtNTcsICAgMTM5MCwKKyAgIDgyMywgICAgOTM3LCAgIC0xMjIsICAgIDQ3OSwgICAgIDQ3LCAgLTIxNDQsICAtMTUxNCwgICAgOTU1LAorIC0xMzE3LCAgIC03MjYsICAgIDQ4MCwgICAxMTUzLCAgLTI5NTksICAtMjU1OCwgIC0yNTczLCAgLTEzNTUsCisgLTE4NzksICAtMTQ0NiwgICA2NDM1LCAgICA2NzcsICAgMzEyNCwgICAzMTM0LCAgIDE4NTAsICAgMTgzNCwKKyAtMTM5NiwgIC0xNDE3LCAgIDEyOTAsICAgLTg5NiwgICAtNTYxLCAgIDE0MjgsICAgMTAwNywgICAxMTA1LAorIC0yMTAxLCAgLTIwNDQsICAgMTc3OSwgIC0xOTEzLCAgLTE4NjgsICAgMTQxMCwgICAgOTE2LCAgIDEyMzIsCisgIDExMTIsICAgMTMzNSwgIC0yNjYzLCAgIC0xMDQsICAgLTUxMywgICAgLTk2LCAgIC00NzAsICAgIDQ4MCwKKyAgMTUxNiwgICAtMTUwLCAgICAyOTgsICAgIDcxNCwgIC0yNTU4LCAgIDMwNzYsICAgIDQ2OCwgICAtNzQ1LAorICAtOTQ1LCAgIC00NDMsICAgLTg0OSwgICAtOTg5LCAgICAzNDEsICAgMTEwMiwgICAgNDMzLCAgICA1ODgsCisgLTE3NzIsICAgIDQ2MiwgICAtNTI3LCAgICA2NzAsICAgLTEyOCwgICAtMTA4LCAgICA1ODMsICAgIDcwMSwKKyAtMjI4MSwgIC0yMTQ5LCAgLTIzOTgsICAtMjc0OSwgIC0yNTU3LCAgLTE2OTEsICAtMTA5NSwgICAxMzM2LAorICA5MDg4LCAgIDM4NDQsICAtMTc5OSwgIC0xODYxLCAgLTE5MDgsICAtMjI0MiwgIC0yMTg0LCAgIDIzMTMsCisgIDM3NzksICAgLTgwOSwgICAgNTE5LCAgIDIyMjksICAtMTkxNCwgIC0xNjczLCAgIDE3NjQsICAgLTYzNCwKKyAtMTk1NSwgIC0xNzIxLCAgICA0MDUsICAgLTQ5OSwgICAgMjQzLCAgIDE2MzIsICAtMjM3NywgICA3Mjg5LAorIC0xNjU5LCAgLTE3NTIsICAtMTM0MSwgICAtOTQ4LCAgIC0zMjMsICAgIDg0MSwgICAxNzAzLCAgIDE3NzQsCisgLTIwMjksICAgMjM4NCwgIC0xODc3LCAgLTE5MTgsICAtMTcyOSwgICAxNDgzLCAgICA0ODMsICAgMTkxNiwKKyAgIDU3NiwgICAxMjU4LCAgLTIzMTAsICAtMTc5NiwgICAyMjA4LCAgLTE1NzksICAgICA1NywgIC0xNzM1LAorIC0xMTYxLCAgIDUxNzcsICAgMTY3NCwgICAyNDY4LCAgLTE5MDcsICAtMTQ5OSwgICAxODY4LCAgIDIyNzUsCisgIC02MjAsICAgLTM1NiwgICAtMjI4LCAgICA0ODksICAgMTA2NCwgICAgODQ5LCAgIC02ODMsICAtMTIwNCwKKyAtMTc2MSwgIC0yMjExLCAgIC02MDYsICAgLTc2NCwgIC0xMDU2LCAgIDM4ODgsICAgIDI1MywgICAxNTE4LAorIC0yNTU1LCAgLTIwNzUsICAgIDExOSwgIC0xNTY3LCAgICA5NzEsICAtMTE3OCwgICAyNjgzLCAgIDE0NzYsCisgICA5NzgsICAgMTQxOSwgIC0yOTQ3LCAgLTI0MTgsICAtMjE2NCwgICAxMTc4LCAgIDE1ODIsICAgMTQ3MCwKKyAgIDg5NiwgICAgNjQ1LCAgIDE2NzEsICAgMTQ2MiwgIC0yMjM0LCAgLTEzNjMsICAtMTE4NCwgICAxNDA4LAorICAxMDQyLCAgLTEwOTEsICAgLTIwOCwgICAgLTQ5LCAgICA1MjcsICAgIDkxNywgICAxMjY2LCAgLTE0NDQsCisgLTIxNzQsICAtMjQ0NywgIC0yMzAwLCAgLTE3MzIsICAgMzA3NiwgICA1NjMxLCAgICAyNDgsICAgMjE5NSwKKyAtMjQ3NywgIC0xNzI0LCAgLTI0MzQsICAtMjQ3NywgIC0yNTI0LCAgLTE4MjgsICAgMjMzMSwgICAgODQ1LAorICAxNDIzLCAgIDE3NjcsICAtMjM5MywgIC0xOTQ2LCAgIC04NTcsICAgLTQ2MiwgICAgMzQ0LCAgICAgMTcsCisgIC04OTYsICAgMjM5MSwgICAgODkyLCAgICA4ODIsICAgLTgyOCwgICAtMjgwLCAgIC03NTIsICAtMTEzNiwKKyAtMTU2MywgIC0xMDQwLCAgIDEyMjIsICAtMTE3MywgICAxNzYzLCAgIDExNzksICAtMTQ0OCwgICAxOTQ2LAorIC0xODE1LCAgLTE1ODgsICAtMTYzOCwgIC0xMjgyLCAgIDMzMDIsICAgIDEzMiwgICAgNTA5LCAgIDE0MDgsCisgLTI3NjAsICAtMjMzOCwgIC0xOTM1LCAgIDEzNTMsICAtMTUzMSwgIC0xMDc0LCAgIDExNTYsICAgMzA4NiwKKyAgMTM3NCwgICAxNjY3LCAgIDIzMDIsICAtMTYyMywgIC0xODk3LCAgLTE5OTEsICAgLTQ5NCwgICAyNjAzLAorICAtNzU0LCAgICA1MjQsICAgMTI2NSwgICAxMzA0LCAgIDMwNjIsICAtMTM1OSwgIC0xMzY1LCAgIDE5ODcsCisgLTEzMzQsICAgLTkxNiwgICAtMTQ2LCAgICAtNDAsICAgIDYzNSwgICAxMDMzLCAgIDE3MjQsICAtMTA1NywKKyAgICA0OSwgIC0xMTU5LCAgIC03NzQsICAgIDEwNiwgICAxMDUzLCAgIC0xNTMsICAgIDEzNCwgICAgNjkxLAorICAtMTE5LCAgLTEyMjYsICAgIDMzMiwgICAtMzYzLCAgIC0xOTcsICAgIC02OSwgICAtMTMzLCAgICA1NzMsCisgICAxOTAsICAgIDIxNiwgIC0yMjM2LCAgIC0yOTQsICAgMTI4OCwgIC0yMTEwLCAgLTE1MzcsICAtMTAwNSwKKyAtMTE3NSwgICAgIDU2LCAgIDQyMjcsICAgMTYyMywgIC0yNDQwLCAgLTE4OTQsICAtMTYyMywgIC0yMzc3LAorICAyMjg3LCAgLTEyMjAsICAtMTUwNiwgICAgMTc3LCAgIDU2ODksICAgMjg0OSwgIC0yODU3LCAgLTIxNjYsCisgLTI1NDYsICAgMjE3NCwgIC0yNDE0LCAgLTIzNDMsICAgIDU1OSwgIC0xMDIwLCAgIDQ2NTAsICAgMzUxNCwKKyAtMjg3NSwgICAxMzA5LCAgLTI1NTcsICAtMjUzNCwgIC0yMjM1LCAgLTE5MDEsICAgMTU1OSwgICA0NDEyLAorICAyMzAxLCAgIDIyMDQsICAtMjk2OSwgIC0yMDE4LCAgLTIzOTksICAtMjgzNCwgIC0yNDMxLCAgIDEzMTYsCisgLTE0NzQsICAgMTI2OSwgICAyNTMzLCAgIDM0ODUsICAtMjg5MiwgIC0yMzg3LCAgLTI3MTYsICAtMjMxNywKKyAtMjAzMSwgIC0xOTkyLCAgLTEzMTEsICAgODA3MSwgICAzOTMzLCAgIDM4MDcsICAtMjEzOSwgICAxOTA5LAorIC0yMjAwLCAgLTIzNDQsICAtMjA2MCwgIC0xNjM4LCAgLTExNTQsICAgLTIxMCwgICAyNzgxLCAgIDIxMzksCisgIDExMTksICAtMTgyOCwgIC0yMDY5LCAgLTIzMDYsICAtMTk3NSwgIC0xMTY1LCAgIC00NDQsICAgIDc4OSwKKyAgMjQwOSwgICAxNTUxLCAgLTI5MjksICAgLTEwMywgIC0xOTIwLCAgLTIwMTAsICAgLTkwNCwgICAgNjk0LAorICAtMTg4LCAgICAgIDQsICAgMTA1MSwgICAxMTkwLCAgLTI2NDksICAtMjQ1NCwgIC0yMjA1LCAgLTE2NTEsCisgLTE4NTYsICAtMTU1MiwgIC0xMTY1LCAgICAzNTIsICAgMzM1MSwgICAxMjY2LCAgLTE3MTksICAgICA1NywKKyAtMTgyOCwgICAtNDIwLCAgIC05MzgsICAtMTI1MSwgICAtNDYxLCAgIDEyOTQsICAgMTE1OCwgICAgODkzCit9LAorCisuZmNiMTFtID0geworIC0yNzA0LCAgLTI0NTksICAtMjM0OSwgIC0xNTM1LCAgIDI4MDcsICAgIDM2NSwgICAxMDY0LCAgICA4OTIsCisgICA4MzAsICAgMTIyMiwgIC0yMTkwLCAgLTE1NDIsICAtMjI4NSwgICA2NDQzLCAgLTE2MDcsICAtMTM2MiwKKyAgLTYwNSwgICAgNjM3LCAgICA4ODMsICAgIDg3NywgIC0yMzc4LCAgIDIyOTIsICAgMzEwNiwgIC0xMDU3LAorICAxNzc2LCAgLTEwOTQsICAgLTg1OSwgICAgMjQ5LCAgICAxOTksICAgIDI1NiwgIC0xNTM3LCAgIDIwOTgsCisgLTExMjYsICAgMjI0MywgIC0xMTg2LCAgIC0xOTMsICAgLTIxMSwgICAgMjExLCAgICA1MDIsICAgIDMwOCwKKyAgMzM2OSwgICAzMTk3LCAgLTEyNzEsICAtMTM3MCwgICAtMzU1LCAgIC00MjMsICAgLTUzNywgICAgNDY4LAorICAtMjM3LCAgICAtOTksICAtMTQzOSwgIC0xNzQ4LCAgLTIxODUsICAtMTk3MiwgIC0xMzU3LCAgIC04MTQsCisgIC00NzAsICAgIDgxNSwgICAxMzA2LCAgIDYzOTAsICAgMTk4MywgIC0xMTY5LCAgLTE3NDksICAgIC0yOSwKKyAtMTM2OCwgICA1OTI5LCAgLTE1MzksICAgLTkwMCwgICAgNTc2LCAgICA3MDEsICAgMTcwOCwgIC0xNjA4LAorIC0xMTQ4LCAgIDM1MjIsICAgLTgyMiwgICAtMTIwLCAgIC00NjEsICAgLTE1OCwgICAgLTQzLCAgICAgMzksCisgLTI1NDMsICAgODg3MiwgIC0xMzQ3LCAgLTE1ODAsICAgIDIyMiwgICAtNDg4LCAgIC0xNjIsICAgIDI5NSwKKyAgIDM4MiwgICAgMjkxLCAgMTExNDMsICAtMTIyMywgIC0xMjcwLCAgLTEzOTksICAgLTM5MiwgICAtNTYzLAorICAtNTAwLCAgIC02MDQsICAgLTU0NCwgICAtMTM1LCAgLTE3ODcsICAtMTMxMywgIC0xNDkwLCAgLTEzOTUsCisgLTExMDAsICAtMTI3OCwgICAtODE4LCAgIDYxNzIsICAgIDc2OCwgICAxNTk3LCAgIC02MjMsICAgLTY4MSwKKyAtMTEyOCwgIC0xNTc1LCAgIDcyNTcsICAgLTY2NSwgIC0xMDIxLCAgIC00MzksICAgIDkzMiwgICAgNzAzLAorIC0xNDk2LCAgLTIxNjgsICAtMTk0NSwgIC0xNDU0LCAgIC04MDgsICAtMTI2MSwgICAtMzU0LCAgICA4NzUsCisgIDY3MDYsICAgMTk1NiwgIC0xNzczLCAgLTE1MDMsICAtMTUzNiwgIC0xMTYyLCAgLTEzODYsICAtMTg4NSwKKyAtMTYwNywgICAtMzE4LCAgICAtNzIsICAgICAtNywgIC0xOTMyLCAgLTEzNDksICAgNjE1MCwgIC0xODUyLAorICAtMzQ1LCAgICAtMTgsICAgIC04MSwgICAgMjIzLCAgICAzMzksICAgIDQyNSwgICAgMzYyLCAgLTE2MjMsCisgLTE0MzIsICAtMTk3MywgIC0xMDQyLCAgLTEzNzMsICAgNzgzMCwgICAgIDM4LCAgIC0xMTYsICAgMTAwMCwKKyAgIDQyMSwgIC0yMzc1LCAgLTE4MDgsICAtMTgzMiwgIC0xMDQ2LCAgIDIwNzcsICAgIDk1NSwgICAxNTc2LAorICAgNTgxLCAgICA4MjQsICAtMjAyMSwgIC0xNTgyLCAgLTE0MDIsICAtMTQyMCwgICAgIDY5LCAgIDM1NDksCisgIC01MTMsICAgIDE5MiwgICAgMjYyLCAgICA0ODMsICAtMjUwMywgICA0MTczLCAgICAtMTEsICAtMTUzMiwKKyAgLTg5MywgICAgMjgyLCAgICAxODcsICAgIDMyMCwgICAgMTc2LCAgICAyNTksICAtMjMwOCwgICAyMzQyLAorIC0yMzg1LCAgLTIxNDcsICAgLTc4NCwgICAtMzc1LCAgICA0MTMsICAgIDgzMywgICAgODg5LCAgIDEyOTcsCisgIDE0MTUsICAtMTA4NSwgIC0xMDA5LCAgLTE1MDEsICAtMTI0NiwgIC0xMjk4LCAgIDE1NTMsICAgMTM4NCwKKyAgIDMzMiwgICAgNjYyLCAgIDIyMjYsICAtMjM5OSwgIC0xNzUyLCAgIC04NTcsICAgMTg5OSwgICAgMTMxLAorICAgNTAxLCAgICAyMDksICAgIDIxNywgICAgMzQ2LCAgIDQyOTQsICAtMTgxMSwgIC0xNjk0LCAgLTEwODAsCisgIC03NTIsICAgLTI2MywgICAtMjI4LCAgICAyNDksICAgIDYyOCwgICAgOTcxLCAgIDI1MDgsICAtMTAzMSwKKyAgMjg3MSwgIC0xMDU0LCAgICAgNDIsICAgLTIwMiwgICAtNzM4LCAgIC0xNzAsICAgLTIzOSwgICAtMjkwLAorIC0yNzUxLCAgLTIzNzksICAtMjM3OSwgIC0xOTk5LCAgLTE0NDgsICAgLTM4MCwgICAxNTk0LCAgIDEyNzksCisgIDEzOTksICAgMTYzMywgIC0yMzc2LCAgLTE4MzksICAgMTM2NywgICAxNjg1LCAgICAzNTYsICAgLTEyNiwKKyAgIC01MCwgICAgMTQzLCAgICAgMzEsICAgICAzMywgICAgMzE0LCAgICAxNjAsICAgLTY2MywgICAtNjg3LAorICAgIDI1LCAgICAzODgsICAgLTI2NywgICAtMTg4LCAgIC0xODgsICAgLTEyOSwgIC0yNjE0LCAgIDEwNjMsCisgLTE4MzUsICAgLTI4NSwgICAyNTQ5LCAgICAyMDUsICAgIC0zMCwgICAgMzcwLCAgICAzMTksICAgIDI5NywKKyAgIC04NywgIC0yMjA4LCAgLTExNjQsICAgLTgzOSwgICAgODk0LCAgIC0yNjYsICAgLTQxMCwgICAgMzc1LAorICAxMjYzLCAgICA5MjQsICAtMjYwNiwgIC0yMzI1LCAgLTE4NTQsICAgMTc5MiwgICAgNDA3LCAgICAzMjgsCisgIC0xMTAsICAgIDU3NSwgICAxMDkwLCAgICA5NzEsICAtMjUxNywgIC0xNTgzLCAgIDEzNTUsICAtMTg5MiwKKyAgLTQ5MCwgICAtMjAzLCAgICA4NDYsICAgIDcyNCwgICAgNTk3LCAgICA3NzksICAtMTY1MCwgIC0xMjgxLAorIC0xMjk0LCAgICA1NDksICAgLTE0NiwgICAtNTQ4LCAgIDI5NDcsICAgIC0yOCwgICAgMjY1LCAgICAzMzkKK30sCisKKy5mY2IxMXMgPSB7CisgLTE1MzYsICAtMjM2MCwgIC0yMzc4LCAgLTIxMzgsICAtMTM4MCwgICAtMzQ2LCAgIDE1NzUsICAgMjc3OSwKKyAgMzI0NywgICAxNjg5LCAgIC0zNDAsICAtMTc4OCwgIC0xODM5LCAgICAxMDMsICAgICAzMSwgICAgODUzLAorICAtNjUzLCAgIDMxNTksICAgIDM2NSwgICAgMTU0LCAgICA0MDQsICAgLTgzNSwgICAtNzE2LCAgICAtMzUsCisgIDQzMDksICAgLTE1NSwgIC0xMjE0LCAgLTExODAsICAgLTc1MCwgICAtNTIyLCAgIC03NTMsICAgIDM1MCwKKyAtMTY2MCwgIC0xNjAzLCAgLTExNTksICAgLTU4MiwgICAtNDg5LCAgIDEwNjcsICAgMjYxNSwgICAxNzQ3LAorIC0xNzU1LCAgLTIzNTEsICAtMjMxNCwgIC0xNDUzLCAgICA5MjIsICAgMzQ1OCwgICAgODY3LCAgICA0MzksCisgICA0OTMsICAgMTIxMiwgIC0xNTg0LCAgLTE2NTUsICAgMTMwMCwgICAxNzgzLCAgIDE2NDEsICAgMTQ0MiwKKyAgIDgxNiwgIC0xMjgzLCAgLTE0NTYsICAtMTQxNywgICA0OTk4LCAgIDE5MjMsICAgLTIwMCwgIC0xMDg2LAorIC0xMDYwLCAgLTEwMTYsICAtMTA3NCwgIC0xMjE3LCAgLTEyODUsICAtMTI0NSwgICAgNjMzLCAgICAzOTAsCisgLTE0NDMsICAtMTA5OSwgICAtNTA3LCAgIDMwNDEsICAgIDM0MywgICAtMTYzLCAgIC03NDUsICAgLTY2NywKKyAgMjMzMywgIC0yMTQ0LCAgLTI0NjAsICAtMjI0NywgIC0yMDYzLCAgLTE3MzYsICAgLTc0MiwgICAgNDE4LAorICAzMTI0LCAgIDM1MDQsICAgIDIyNywgICAtNzM1LCAgICA3OTksICAtMTMyNiwgICAgLTIwLCAgIC01NDMsCisgIDE5MDAsICAgIDIzNywgICAtNjcxLCAgIC01NDUsICAtMTcyNywgICAgMTIxLCAgLTE3NTAsICAgMzcwMCwKKyAgLTQ4NSwgICAtNTUzLCAgICAtNzcsICAgLTIxMiwgICAgOTQyLCAgICAgNjIsICAgMTY0NywgICAtNjg4LAorIC0xNTA2LCAgLTE0MjksICAgLTYxOSwgICAtODM5LCAgICAxNzIsICAgMzIwOSwgICAtNTAwLCAgIC0zNzEsCisgLTE2ODAsICAtMTQwOCwgIC0xMTIyLCAgIC01NjMsICAgMzYyNywgICAtMTE1LCAgICA1MTAsICAgIDUzNCwKKyAgIC02NSwgICAgMTk5LCAgICA4MDAsICAgNTA0MCwgICAgNjMxLCAgIC03NDQsICAgLTYxMiwgIC0xMDIzLAorIC0xMDk5LCAgLTEzMTksICAtMTUyMCwgIC0xNDYwLCAgLTExMjAsICAgLTI3NCwgIC0xMjIwLCAgICAzNDksCisgIDE4NDgsICAgLTYyMCwgIC0xNDExLCAgIC02MTYsICAgMTc3MSwgICAxMDI0LCAgLTEyMjMsICAtMjE5NSwKKyAtMjM0NSwgIC0yMTQ0LCAgLTE1MTcsICAtMTA1NSwgICAtMzg1LCAgICA1NTcsICAgMTQ4MiwgICA2Nzk3LAorIC0yMjc0LCAgICA4MTgsICAgLTQ2MCwgICAtNzA3LCAgIC0yNzQsICAgIDY0NiwgICAgNjU0LCAgICA3MzEsCisgICAyNjgsICAgIDM0NywgICA0NTgzLCAgLTEyODksICAtMTQ1MiwgIC0xMTkzLCAgLTEwNzIsICAgLTY4MSwKKyAgLTE3OCwgICAtMTMxLCAgIC0xMDgsICAgIDU0NywgIC0xNTIxLCAgIC03ODEsICAtMTI5OCwgICAgMjM5LAorICAtNDg2LCAgIC00NDUsICAgMzQ1MywgICAtMjI2LCAgICAgOTAsICAgIDY1MywgIC0xMjM3LCAgICA2MjQsCisgIDQ2OTIsICAgLTQ4MiwgICAtNzk4LCAgIC03OTksICAgLTc2NiwgICAtNjQ1LCAgIC04OTAsICAgLTkxNSwKKyAgMzc0OCwgICAtOTA5LCAgLTEwMTIsICAgICA4NSwgICAgOTYzLCAgICAzNzUsICAgLTEwMCwgIC0xMDEwLAorIC0xMjY5LCAgLTE1MDgsICAgMjEwNiwgIC0xMTk0LCAgIDI2MzIsICAgIDU5NSwgICAtODI2LCAgIC0yMjEsCisgIC00MTEsICAtMTEwNCwgIC0xMzY1LCAgLTEwNTAsICAtMjExMiwgICAtODYzLCAgIDE5NDMsICAgLTcyNywKKyAtMTA3OSwgICAtNzMzLCAgICAgNzgsICAgMTk5MCwgICAgMzYzLCAgICA5NTMsICAgMTMyNSwgICAgNDU5LAorICAtODkxLCAgIDMzNjQsICAgLTQxMCwgICAtMzYyLCAgIC01NDcsICAgLTk5NCwgIC0xMzcxLCAgLTEyNTgsCisgMTIyNzAsICAgIC00MywgIC0xNjY4LCAgLTE4NjgsICAtMjAwNCwgIC0yMTMzLCAgLTE4NjMsICAtMTk0OSwKKyAtMTgwNSwgIC0xMjg4LCAgLTE2NDAsICAgMzc4MywgIC0xNDE0LCAgIC01NzgsICAgLTUwNSwgICAtNDY0LAorICAtMTU4LCAgICAyNTIsICAgICA3MSwgICAgIDc2LCAgICAgMjIsICAgIC0yMCwgICAgLTcyLCAgICAtMTMsCisgICAtMTksICAgIC05NSwgICAgLTE0LCAgICAgIDIsICAgICAyMywgICAgIC01LCAgIDEyODksICAgIDYzMCwKKyAgIDI5MSwgICAtNzA3LCAgIC03OTQsICAgLTg1NywgICAtNzE1LCAgIC0xMjIsICAgIDU1MSwgICAgMjE5LAorIC0yMzU4LCAgLTE5MDUsICAtMTM5NywgICAgMjc3LCAgICA1NzIsICAgIDM0MywgICAgNzg5LCAgICA1MjYsCisgIDE2MjksICAgIDk5MSwgICAtOTgwLCAgICAyMjIsICAgIDc0MCwgICAxMTk5LCAgICAgMTksICAgMTIwMCwKKyAgLTg2NCwgICAtNDY3LCAgIC02NTYsICAgLTEzOCwgICAgODIwLCAgLTIwMDUsICAgLTkyNCwgICAgMTU0LAorICAgMTk1LCAgICAzOTMsICAgIDI2NywgICAtMTgzLCAgIDEwMjQsICAgIDEwMCwgICAxMjQzLCAgIC04NzIsCisgIC03MDUsICAgLTc4MSwgICAtNDIyLCAgIC0zNzcsICAgLTkxMCwgICAtNjM3LCAgICAgODksICAgMjg0OQorfSwKKworLmZjYjE2bCA9IHsKKyAtMjY3NiwgIC0yMjQ2LCAgLTMxMTksICAtMjkwNCwgIC0yNzA3LCAgLTE5NDYsICAgNzcxOCwgICAyMjkyLAorICAyNDUxLCAgIDQyMDYsICAtMTIxNCwgICAtMzYyLCAgIDExMTYsICAgLTg2MCwgICAgIDMwLCAgIC05OTMsCisgIC04ODgsICAtMTA0NiwgIC0zNzMyLCAgLTIyNjgsICAtMjU0MSwgICA2MDYwLCAgLTIyMjAsICAtMTU5NywKKyAtMTY1MCwgIC0xMzIwLCAgICAgODgsICAgMTIyOSwgICAyMTE4LCAgIDIzNDgsICAgMTQzMCwgIC0xODY1LAorIC0yMTkwLCAgLTIxMjIsICAtMTg0NCwgIC0yMDY5LCAgLTE3NDYsICAgICAxNSwgIC0xNzQ2LCAgIDEzMjEsCisgLTI2NzEsICAtMjk5MywgIC0zMjQ3LCAgLTI4MTEsICAtMjE0MSwgIC0xMzYwLCAgIDE4ODYsICAgIDI3MCwKKyAgLTM4MSwgICA1Njc2LCAgLTIwNzAsICAgLTQ0NCwgICAtNjc0LCAgLTEwODIsICAtMTE0NCwgICAtMzQ2LAorICAtODIzLCAgIDQ2MzAsICAgLTIyNCwgICAxOTQwLCAgLTI0NDEsICAtMjA3MiwgIC0yMTk0LCAgIC0yOTUsCisgIDIxNzUsICAgMTIwOSwgICAtNzM0LCAgICAxNjgsICAgIDkyMywgICAxMzU5LCAgLTI2NjcsICAgIDM4OSwKKyAtMjU4NSwgIC0yMjc5LCAgLTIxOTUsICAtMTE0MSwgIC0xMDE2LCAgIC0yMTgsICAgIDEwOSwgICAxOTI2LAorICA1MTg0LCAgLTIyMjYsICAtMTg4OCwgIC0xMjczLCAgLTEwNDQsICAgICAyNSwgICAgNDYxLCAgICA4ODYsCisgIDExMjUsICAgMTI0OSwgIC0yMjE1LCAgLTIzODEsICAgMzEwOSwgIC0xOTYzLCAgIDMwMTUsICAtMjAyNywKKyAgLTc5MCwgICAxMTkyLCAgIDE2NDYsICAgMjE4OCwgIC0yOTA2LCAgLTI1OTgsICAgIDQ4NCwgIC0yMzcyLAorIC0xMzcyLCAgLTEwODIsICAgMTcxOCwgICAgNjY0LCAgIDEzOTEsICAgMjM5NiwgIC0yNTE4LCAgIDE5MzcsCisgLTIzNjIsICAtMjUxMCwgIC0xNTA0LCAgIDI5NDcsICAgIDQ0NiwgICAgNjg0LCAgIDE5NDcsICAgMjA1OSwKKyAtMzI2MywgIC0zMDAxLCAgLTMyNDAsICAtMzAzNCwgIC0yNTk4LCAgIDMzNjcsICAgNDQwNywgICAyMzI3LAorICAyNDUwLCAgIDI5OTQsICAtMjM3OSwgIC0xODc1LCAgLTE4NjIsICAgNjM4NywgIC0xOTU2LCAgLTE0MTcsCisgIC01MjUsICAgMTA5OCwgICAxODM2LCAgIDI5MzIsICAgMTQwOCwgIC0xMTMwLCAgLTE0MTcsICAgMTY5MywKKyAgLTI2MiwgICAtNjQ1LCAgIC01MTUsICAgIDQ0MywgICAgNzM1LCAgICA2MTksICAtMjgzNCwgIC0yMjQ2LAorIC0yNjQ2LCAgLTI1MjEsICAgLTgxMSwgICA2NjA4LCAgIC00MjEsICAgMTU3MiwgICAyMDE1LCAgIDMyMzQsCisgLTIwODYsICAtMTQzNSwgICAgIDg5LCAgIDE2NDgsICAgIDgzOCwgICAtOTg2LCAgLTExNTksICAtMTIwOCwKKyAgIC0zMiwgICAxMzU0LCAgLTIxMzUsICAtMjE1OSwgICA3Nzk2LCAgLTI0MjQsICAgLTk0OSwgIC0yMDQwLAorIC0xMTc5LCAgICAyMjgsICAgMTE4NywgICAzMDA4LCAgLTI5NjMsICAtMjUwMCwgIC0yMDc0LCAgLTIwMjUsCisgLTE0MzksICAgMTY5MiwgICAtMzc4LCAgIC01OTYsICAgIC02MiwgICAyNDE5LCAgLTM1MjIsICAtMzEzMiwKKyAtMjg5OSwgIC0zMjkwLCAgLTI5MjksICAgMjg0NCwgICAgIDQ5LCAgIDQzMDcsICAgMjc1NCwgICAzODk3LAorIC0yOTYwLCAgIDEzMDUsICAtMTg1OCwgICAtODMxLCAgLTEzNzksICAgLTc3MywgICAzMjU3LCAgICA5NzksCisgICA5NzUsICAgMTUxMywgIC0yODQ5LCAgLTE2MTAsICAgMjQ4MywgICAgNDU2LCAgLTEzOTUsICAgLTYzNCwKKyAgIDg0NywgICAxMzIwLCAgIDExMTYsICAgMTE3NSwgICAyNDk3LCAgLTE1NTQsICAgMjE3NiwgIC0xNjk3LAorICAtOTk3LCAgIC03OTksICAgLTEyMCwgICAgMzM5LCAgICA5OTYsICAgMTM3OSwgIDExMzU5LCAgLTE1NTcsCisgLTIyMTksICAtMjIzNywgIC0xNzkyLCAgLTIwODQsICAtMTAwOSwgICAgNzgxLCAgIDMzNDEsICAgIDkzOSwKKyAgMTk1NCwgIC0xODYwLCAgLTIzNDcsICAtMjExNywgIC0yMDAwLCAgLTEzOTQsICAgMzgyNSwgICAgMTA2LAorICAyNTk1LCAgIDIxNjIsICAtMjkzOCwgIC0yNDg4LCAgLTIxMTIsICAgIDc3MiwgIC0xMDU5LCAgIDE4MjIsCisgICAxNTksICAgMTAxNywgICAyNDUyLCAgIDE1MDYsICAgMTMxMywgIC0yNjE1LCAgLTI0NzksICAtMjk0MSwKKyAtMjIyMCwgIC0yNTEwLCAgIC03MjYsICAgNDcwMywgICAxNzc4LCAgIDMzNzUsICAtMzEzMywgIC0yNjY0LAorIC0yODIxLCAgLTI3NzEsICAgMTU1OSwgIC0xMDAwLCAgIC00MzQsICAgMTg3NCwgICA0MTMwLCAgIDI5ODcsCisgLTI5OTgsICAtMjY5MiwgIC0yMzI2LCAgIDE1ODAsICAtMjIzMSwgIC0xMzQ3LCAgIDQxNjYsICAgMjAyMSwKKyAgMTE3NywgICAyNTMxLCAgLTI4ODAsICAtMjMzNywgIC0yNTg5LCAgIDE1MDUsICAtMjg0MywgIC0yNDY4LAorICAtMzM5LCAgLTEwNTksICAgMzIxMiwgICA0MjY0LCAgLTMxMTIsICAtMjg4NSwgIC0yODg5LCAgICA5NzUsCisgLTI1MjIsICAtMjI3OCwgICAgNzIxLCAgIDUwNTcsICAgMzk4OSwgICAzMzczLCAgLTMwOTgsICAtMjk0NywKKyAtMTEyOCwgIC0yMjUxLCAgIDE5MzUsICAgMjk4MSwgICAzMDA3LCAgICA5NzUsICAgMTk4MywgICAyMDQ4LAorIC0yODYxLCAgLTIzMDIsICAtMjQzMSwgIC0xNDYwLCAgLTE0OTIsICAtMTUyNCwgICAtOTQ0LCAgIDE1NTYsCisgIDE3NzgsICAgMTU0OSwgIC0yNjU4LCAgLTIyNTksICAgMjc2OCwgIC0yNDYwLCAgLTE0NDcsICAgMjk1NywKKyAgIDc1OSwgICAgMzI0LCAgIDI1MzMsICAgMjQ3NywgIC0yOTM1LCAgLTE2ODcsICAtMjU1NCwgIC0yNjQ3LAorIC0xNDMxLCAgICAxMTgsICAgLTM2NSwgIDEwMjgwLCAgIDE1MjYsICAgMzQ0NywgIC0yNTcwLCAgIDIyNjgsCisgLTIzNTEsICAtMjExNSwgICAyNTg4LCAgICAgLTksICAgLTgzNCwgICAxMTE1LCAgIDE4NzgsICAgMjM2NSwKKyAgICA3OSwgICAxMTMyLCAgLTE2MTksICAtMTQwNiwgIC0xNTY4LCAgLTE3NjYsICAgLTIyNCwgICAgODI1LAorICAyMTEzLCAgIDEzODIsICAgLTU0OCwgIC0yNjY5LCAgLTE3OTcsICAtMjY5MSwgIC0yMTM5LCAgLTI0OTUsCisgIC0yMTAsICAgMTI3NiwgIDEzNjIzLCAgIDIzMTUsICAgMTk2NSwgIC0xNzEzLCAgLTE2MTAsICAtMjE4NywKKyAgMjUzNCwgIC0xNDk1LCAgLTEzMDEsICAgIDYyMiwgICAgNTYzLCAgIDIxNTQsICAgMjc0MywgICAzMjMwLAorIC0xNzg0LCAgLTE3NzQsICAgLTc5MiwgICAtNDkzLCAgIC0xMzEsICAgIDE1NiwgICAgOTQ0LCAgIDEyMTEsCisgLTE4ODYsICAgIDM1NywgIC0xMDE4LCAgICAyMjUsICAgLTI4NSwgICAxMDI1LCAgIC0xMzQsICAgIDIxOCwKKyAgIDI5MCwgICAgMTUzLCAgIDU4NjksICAtMjQwNywgIC0yODU2LCAgLTMwNTEsICAtMjU0MCwgIC0zMjM4LAorIC0yMjYwLCAgIC0zNzAsICAgLTQ1MSwgICA2MzE0LCAgIC01MDAsICAtMjU1NCwgIC0yMTEwLCAgIC04NzksCisgIC0zMjMsICAgLTUzNywgICAgNTcwLCAgIDEyMjgsICAgMTU1NiwgICAxMzQyLCAgLTI0ODYsICAgMzM2NiwKKyAgMTgzOCwgICAtOTM3LCAgIC05NTksICAgLTY4MywgICAgIDYzLCAgICA5MzcsICAgIDY1MiwgICAxMjEyLAorIC0yMTY0LCAgLTE0NDgsICAgIDE2NiwgICAtNzk5LCAgIC01NTAsICAtMTMxNywgICAgNDgxLCAgICAyOTksCisgIDU0OTQsICAgMTM2MCwgIC0zMTQ3LCAgLTI1NzQsICAgLTk4OSwgICAxNTUwLCAgIDE5NTIsICAtMTUwMiwKKyAgIC05NiwgICAzNTE3LCAgIDEzMDQsICAgMjMxMSwgIC0yOTMxLCAgLTIxNDYsICAtMjE3NCwgIC0yMDUyLAorICAgNTc5LCAgICA2ODAsICAgIDg5NiwgICAyNjk3LCAgICA3MDMsICAgMTM2NSwgICA0MTMwLCAgLTIzNjcsCisgLTI2MjcsICAtMzEyNSwgICAtOTM0LCAgLTMwOTMsICAtMjE1NSwgICAtOTU1LCAgIDYwMjUsICAgNTAyNCwKKyAtMzEyMSwgIC0zMDY0LCAgLTI4ODMsICAtMjQ1OCwgICAxNzIzLCAgIC04NDIsICAgMzAzMiwgICA0MzkxLAorICAyMzI3LCAgIDI4MzcsICAtMjUzNiwgIC0yMjA4LCAgLTE2MTAsICAtMjE4OSwgICA2NTA5LCAgLTE0MjQsCisgLTExMTYsICAgMTQyNywgICAyODMwLCAgIDMzNzAsICAgMTA4NCwgIC0xNTYyLCAgLTE2NTUsICAtMTYyOCwKKyAgLTQ5MSwgICAyMjYwLCAgIC0zMjEsICAgIDQyMSwgICAgNzc0LCAgIDEyMzcsICAtMzI2NywgICAgOTc3LAorIC0zMTcwLCAgLTMxNDQsICAtMjY5OCwgIC0xMzI0LCAgIDE0MjQsICAgMzAzNCwgICAzMzIzLCAgIDMzNDcsCisgLTMwMjEsICAtMzA2MSwgICAyMDI3LCAgLTIzNDUsICAgIDg1MiwgIC0yODMyLCAgLTE3MTQsICAgNTkyNiwKKyAgNDUxNywgICAzODM5LCAgLTE0OTAsICAtMjQxNiwgIC0xNzI2LCAgLTEyNjgsICAtMTQ1OCwgIC0yMTM3LAorIC0xNzE1LCAgIC01ODAsICAgMTQwMywgIDEzNDA4LCAgLTMwMDUsICAtMjcwNiwgIC0zMDYzLCAgLTI3NDUsCisgLTI3NzcsICAtMjEzNiwgICAyNzg2LCAgICAyMDIsICAgNTE0MSwgICAzNDA3LCAgLTMxMDQsICAtMzAwMSwKKyAtMzE3NiwgIC0zMzg4LCAgLTM1MDcsICAtMjg2MywgIC0yMDk3LCAgIDIzMjUsICAgMjYxOCwgICA2MTQ2LAorIC0xOTk3LCAgLTMxNTIsICAtMTAzNiwgIC0yNjk0LCAgLTI1ODcsICAtMjk4NiwgIC0yNzUwLCAgLTIyMTksCisgLTE2MDcsICAgNTk0NCwgIC0yODkzLCAgLTI2MzMsICAtMjIyOSwgIC0yODExLCAgLTI0ODIsICAtMjExNSwKKyAtMjIxOSwgIC0xMTgwLCAgIDUyNDYsICAgMzI1MiwgIC0zMTExLCAgLTIwNTIsICAtMjY5MywgIC0yOTM0LAorIC0xODA1LCAgIDI1ODMsICAgIDM1MywgICAxMjYyLCAgIDg1ODgsICAgMzkwMCwgIC0yNDY4LCAgLTI3MjYsCisgLTE4NjEsICAtMjM1MiwgIC0yMjM3LCAgLTI3NTAsICAtMjM0NSwgIC0xOTM2LCAgIDk3OTMsICAgODM5MiwKKyAtMzQ5MCwgIC0zMTI0LCAgLTM1OTYsICAtMzYzMCwgIC0zMTU0LCAgLTIzOTAsICAgIDc0MywgICA2NjUyLAorICA2MzY2LCAgIDYxNDMsICAtMjg1MiwgIC0zNTQ3LCAgLTMxMjQsICAtMjcxOCwgIC0xMDk0LCAgIC00OTQsCisgICAgNDksICAtMTA1MywgIC0zMDA1LCAgMzI3NjcsICAtMTcyMSwgIC0xMjI5LCAgLTE3MTUsICAtMTU5MCwKKyAgMTU4NywgIC0xMjMzLCAgIDMzODQsICAgLTI1MiwgICAgMzEyLCAgIDExMjAsICAtMzI4NywgIC0yOTI2LAorIC0zMDQ4LCAgLTI4MjgsICAtMjUwMiwgIC0xMTg1LCAgIDIwMjgsICAgMzc3OCwgICAgNDg3LCAgIDIwODMKK30sCisKKy5mY2IxNm0gPSB7CisgICA2MTYsICAtMTA2NSwgIC0xNjIyLCAgLTE5NDksICAtMTI4MywgICAtODYzLCAgIDY4MTksICAgIDUxNywKKyAgMTEzNSwgICAxMjgyLCAgIDI2MzEsICAtMTQ0NywgIC0xNDc3LCAgLTEwMDQsICAgIDI4NiwgICAxMzU4LAorICAtMTM1LCAgIC0zNDAsICAgIDE0NywgICAtMTMwLCAgIDU0MzUsICAtMTYwOSwgIC0xOTE2LCAgLTE3NTgsCisgLTEwNjYsICAtMTEyNiwgICAgNDc4LCAgICA5OTUsICAgMTA5OCwgICAxNDM3LCAgLTE3MzcsICAtMTMzOSwKKyAtMTg2NCwgIC0yMDA5LCAgLTEwMzgsICAtMTAwNCwgICAtNTczLCAgICA4MTAsICAgNTk3NCwgICAyODQwLAorICAgMzQ5LCAgLTE1NTksICAtMTQ5NiwgIC0xMTUxLCAgIC0zMDcsICAgIC04MiwgICAgNjgxLCAgICA4MjcsCisgICA1NTAsICAgIDc3NiwgICAxOTMwLCAgICAxNjYsICAtMTEwMCwgIC0xNDg5LCAgLTExODUsICAtMTE4MiwKKyAtMTIxMCwgICAtMzI2LCAgICA4NTgsICAgMTY4OCwgIC0yNTYxLCAgIDM1MTQsICAgLTczNiwgICAxNTU1LAorICAgLTU5LCAgIC05MDYsICAgLTEyMywgICAgIDg3LCAgICAxMDIsICAgIDI3NCwgICAxOTAyLCAgIC00NTksCisgIDMwMDgsICAgLTk4NCwgICAtNzA3LCAgIC0zMzQsICAgLTU3MSwgICAtMzE3LCAgIC0xOTAsICAgLTM3MSwKKyAtMjg2MiwgICAgNjA3LCAgIDEzNDYsICAtMTUxNywgIC0xMjIwLCAgIC02MTcsICAgMjQ5NCwgICAgNjk3LAorICAgMTkwLCAgICAgNjQsICAgMzI2NCwgICAzOTI2LCAgLTEyNDksICAtMTU0MiwgICAtOTMzLCAgIC0zMDIsCisgIC0yNDYsICAgLTI0OCwgICAgIDY5LCAgIC0yODMsICAtMTc2NiwgICAtNzUwLCAgLTE4OTgsICAtMTI1OSwKKyAgNjg0MSwgIC0xNTQ2LCAgIC03ODUsICAgIC02NCwgICAxMjA4LCAgIDEyOTQsICAtMTUyMiwgIC0xNzQyLAorIC0xODczLCAgLTE4OTgsICAtMTQ1NSwgICA3MTI4LCAgIC03NTIsICAgMTcxOCwgICAxMzk4LCAgIDExMjMsCisgLTI3NDIsICAgNDczMywgIC0xNTUyLCAgLTI0ODMsICAtMjIxMCwgICAtNDk1LCAgICAzNTUsICAgIDg2NCwKKyAgIDgzMCwgICAgNzU5LCAgLTI3MjEsICAtMjExNSwgIC0xODkxLCAgLTE2OTYsICAtMTEzNywgIC0xNTU5LAorIC0xMjY1LCAgIC02NTgsICAgLTU5MSwgICAgODUwLCAgIC02OTksICAgMTI2MiwgICAtNTUxLCAgLTEwNTUsCisgICA4NzcsICAgICA5NiwgICAtMzg4LCAgIC0xOTIsICAgLTQ3OSwgIC0xMDkxLCAgLTI3NjMsICAtMTM3OSwKKyAgMzI5MCwgICAyMzMxLCAgIC04NzQsICAgLTMwNywgICAtMzg2LCAgICA2MTUsICAgIDM2NiwgICAgMTMzLAorIC0yNjcxLCAgIDUxODEsICAgNDMzOSwgICAtODk0LCAgIC04NzEsICAgLTYzNCwgICAtMTY1LCAgICA0MDksCisgICAgOTEsICAgLTI5MSwgIC0yNjQ5LCAgIC00MTEsICAgODAzOSwgIC0xOTQ3LCAgLTExNTYsICAgICA1NywKKyAgIDM1MSwgICAxMDE0LCAgICA0NzIsICAgLTE5OCwgIC0xODE2LCAgIC01OTAsICAgMjg4NywgIC0xNzAyLAorIC0xMTEzLCAgIDM0MTQsICAgLTU1NiwgICAgMTE3LCAgICA0ODMsICAgLTM3NywgIC0xNzA3LCAgLTExNDYsCisgLTExNTUsICAgMjUxOCwgICAyMDE0LCAgIC0zODIsICAgICAgMywgICAgIC02LCAgICAyMDYsICAgIC05OCwKKyAxMDc3MCwgICAgMjc0LCAgLTE0MTUsICAtMTY3MCwgIC0xMDIwLCAgLTEwMzYsICAgLTc4NiwgICAtNzgyLAorICAtNDYzLCAgIC01NTIsICAtMjUwMCwgIDEwNDYwLCAgLTE2MjQsICAtMTc4NywgICAtNzA3LCAgLTEzMjcsCisgICAtNTksICAgIDM3NSwgICAgIDkxLCAgICAgMjIsICAtMjc3NiwgIC0yMzQzLCAgLTIxMDQsICAgIDgyNSwKKyAgLTc1OSwgICAtODIzLCAgICA0ODIsICAgMTE0OSwgICAxMjY1LCAgICA1NzAsICAtMTY3NiwgIC0xODI2LAorIC0xODQ4LCAgIDYxMjUsICAtMTM5MSwgICAtODIwLCAgIC00NDksICAgIDg0NCwgICAgNTg2LCAgICA1MzUsCisgLTI4NzMsICAtMjQ3NSwgIC0yNjA3LCAgLTI2MTEsICAtMTgzMCwgICAtNDg3LCAgIDE2NDMsICAgMTY4MCwKKyAgMjA4OCwgICAyNTcwLCAgLTIzNTcsICAgLTk5MywgICAzMTg5LCAgLTE0NzMsICAgMzUwNiwgIC0xMjAzLAorICAtNzkzLCAgICA2NjIsICAgIDQ2NCwgICAgIDk4LCAgLTI1MDcsICAgMTYxNywgIC0xNzkzLCAgLTE5MzUsCisgLTEzMDcsICAgLTE2OSwgICAgICA5LCAgICA4ODUsICAgIDcyOCwgICAxMTc4LCAgLTIwMTAsICAtMTM0NiwKKyAtMTM3NSwgICAtMTg3LCAgIC01NDgsICAgMjc1MywgICAtNDY0LCAgIC0xMDUsICAgIDc5OSwgICAgNTExLAorIC0yMTcwLCAgLTI0MjgsICAtMjE3NywgIC0xNDk3LCAgIDIwNzIsICAgIDgyOCwgICAgNDQxLCAgIDEwMjAsCisgICA4NzMsICAgMTAwMCwgIC0xMjk3LCAgLTE1MzEsICAtMTg2MywgIC0xOTY3LCAgLTE1MTYsICAtMTA4OCwKKyAgLTc1OCwgICAtMjMwLCAgIDE1NjEsICAgNjY1NSwgIC0yMTczLCAgLTE3ODcsICAtMTU0OCwgIC0xNzYzLAorIC0xMzY2LCAgICAtMjQsICAgLTY0NSwgICA2ODM2LCAgIDE0ODAsICAgMTkyMywgIC0yNzI4LCAgLTE4NTksCisgIDE3OTgsICAtMjAxMCwgIC0xNTg1LCAgIC02NzcsICAgLTM3MSwgICAxNDA1LCAgIDEyNTQsICAgMTI3OAorfSwKKworLmZjYjE2cyA9IHsKKyAtMjI1MCwgIC0yNzcxLCAgLTI4NzksICAtMjc3NSwgIC0yMjQwLCAgLTEzNjMsICAgLTI3MiwgICAxMjMzLAorICA2MTcyLCAgIDUwNzQsICAtMjg4MiwgIC0yNDE5LCAgLTIwNTQsICAtMjQyMCwgIC0xMjUyLCAgICAzNDcsCisgIDEzMjUsICAgMTc5OSwgICAxNzIzLCAgIDQzNjEsICAgIDc3NCwgICAyMDY2LCAgIDE4NzQsICAgIDI4MCwKKyAgLTcwNywgICAtNjA1LCAgIC01ODEsICAgLTY2MiwgIC0xMTA0LCAgLTIwMzgsICAgNzExMSwgICAtMTM3LAorICAtODgzLCAgLTEwNzksICAtMTAwMSwgICAgLTU0LCAgIC04NDcsICAtMTAxMywgIC0xMDQ1LCAgIC04MzIsCisgIDQ2OTYsICAgMzc4MSwgICAtNjI0LCAgLTE0ODUsICAtMTM2MCwgIC0xMzU5LCAgLTEzMDcsICAtMTIxOSwKKyAgLTg2NiwgICAtOTQ1LCAgIDU0MTksICAtMTUxMiwgIC0yMzA3LCAgLTIxMzQsICAtMjA1NiwgIC0xNzI0LAorIC0xNjUzLCAgIC02MzAsICAgIDE1NywgICAzMzk5LCAgIC03MjcsICAgLTg2MCwgIC0xMzgxLCAgIC0zODAsCisgIC03MTYsICAtMTMzNSwgICAzODE5LCAgICAgNzgsICAgICAtMiwgICAgMjc3LCAgLTMxODUsICAtMzExOCwKKyAtMjcxNSwgIC0zMTEwLCAgLTE1MDAsICAgMTYyNiwgICAzMzUyLCAgIDMwNzUsICAgMTk1NiwgICAtNTM5LAorIDE2NjQwLCAgLTEyMDQsICAtMjI4MSwgIC0yMzA3LCAgLTIyNzIsICAtMjM0OSwgIC0yMDA5LCAgLTIxODQsCisgLTI3NzcsICAtMjM3NSwgIC0xMDE1LCAgIDYyMDgsICAgLTQwMiwgIC0xMzMxLCAgLTExODIsICAgLTc2MywKKyAgLTczMCwgICAgLTgxLCAgIC01OTEsICAtMTE4NCwgIC0xOTI3LCAgICA1NDMsICAgNDQ2NCwgIC0xMDk1LAorICAtMTMxLCAgIC01NDIsICAgLTEyOSwgICAgNDg2LCAgIC0zNjYsICAtMTA5NywgIC0xNTk0LCAgIC01NTQsCisgICAtMTUsICAgLTMzNywgICAzMTUyLCAgIC03MjMsICAgICA3MSwgICAgLTQwLCAgICAzODUsICAgLTMwOSwKKyAgLTc2OSwgICAgMjkwLCAgIC04NTMsICAtMTA1OCwgIC0xMTk2LCAgLTE1NTcsICAgLTU5NSwgICAzNjk1LAorICAxMTI5LCAgICA0MzgsICAgMTcyOSwgIC0xMzA5LCAgIC05NzEsICAgLTg3MSwgICAgIDkwLCAgIDE0MTgsCisgIDEyNjEsICAgIC0yMywgIC0xMzgyLCAgIC0yMjMsICAtMTU1MSwgICAtNzEzLCAgLTEwNDQsICAgNDQ5NSwKKyAgLTE2MCwgICAtODY3LCAgLTEyNDIsICAgMTE4OCwgICAgMTU5LCAgICAxMjAsICAtMTY1NywgICAtOTUxLAorICAxNTM2LCAgIC0xNTksICAtMTMxMCwgICAxMTAxLCAgIC00MDQsICAgIDE1NSwgICAxNzE3LCAgICAtMjQsCisgLTE2MDcsICAgMjM0NywgICAyMDU2LCAgLTE5NDMsICAtMTMxMywgIC0xMjk3LCAgICAtODEsICAgICAzNCwKKyAgMTQ0MSwgICAgMzU0LCAgLTIxMTAsICAtMTg3MywgICAtNTE2LCAgIDExMDIsICAgMjE3NCwgICAyMTMxLAorICAgICAwLCAgIC05NDYsICAgLTcyOSwgICAgIDYxLCAgICAxMDcsICAgIC0xNCwgICAtMTA4LCAgICAtNTAsCisgICAgNDIsICAgLTE2NCwgICAtMTc3LCAgICAtOTIsICAgIC0yOSwgICAgMTYyLCAgIDEzNDksICAtMjM4MCwKKyAtMjA5OSwgIC0xNjkyLCAgIC05ODAsICAgIC00OSwgICAgLTk0LCAgICAzMzEsICAgMTMxNywgICAzODE5LAorICAtNDgyLCAgIC03ODIsICAgLTc3NSwgICAtOTA5LCAgIC02NDAsICAtMTA5OSwgICAtNjE1LCAgIC0yMjUsCisgIDE1NTYsICAgMjk3MywgICAtNjMwLCAgICAgNzAsICAgLTE4NiwgIC0xNTk5LCAgLTEwNzYsICAgNDQ0MCwKKyAgLTg5MCwgICAgIDc4LCAgICAtNzYsICAgLTUxNywgICAtODU1LCAgLTE4ODYsICAtMTUyMSwgIC0xMjA2LAorIC0xMTUyLCAgIC05MDAsICAgIDc1MywgICAxMzM4LCAgIDE3NTgsICAgMjQzMSwgIC0yNDMzLCAgLTE1NjksCisgLTEyOTQsICAgLTU4MywgICAgNTUyLCAgIDIwNDAsICAgLTE1NCwgICAgMjUwLCAgICA1MTMsICAgMjMzMywKKyAgLTgyMCwgIC0xOTg3LCAgLTIyOTEsICAtMjIzOCwgIC0xODgwLCAgLTE2NTEsICAtMTEyMCwgICAtMjYyLAorICAyMDEzLCAgIDk3NTYsICAtMjgwMywgIC0yNTc0LCAgLTI2MzQsICAtMjc4OSwgICAgMzU2LCAgLTE4MzgsCisgICAzMjUsICAgNDU4NCwgICAzNTg0LCAgIDI0ODYsICAtMTUyNCwgICAxODc0LCAgIC0zMzcsICAtMTgwMCwKKyAtMTY1OSwgICAgNDA2LCAgIDI0NTAsICAgMTI1MiwgICAtMjQ1LCAgLTEwMzAsICAgMTk4NSwgICAtMzk3LAorIC0xNTY1LCAgICAtNTEsICAgIDE0OCwgICAyMDM5LCAgLTEyMTIsICAgLTcyOSwgICAtNzAwLCAgICAtMTEsCisgICA5MDQsICAgIDY0OSwgICAgNTMxLCAgLTIyODcsICAtMTY0MCwgICAgNzY2LCAgIC03MjUsICAgIDE3MSwKKyAtMTU5NiwgICAxMzg3LCAgIDMxODksICAgLTY3MiwgICAtNDU5LCAgIC03OTQsICAgLTQyMiwgICAtNzE0LAorICAtMTk1LCAgIC0yMzEsICAgIDE4NSwgICAgIDk5LCAgIC05NTIsICAtMjI0OCwgIC0yMTcwLCAgLTExOTAsCisgIC00NTcsICAgMTQ1OCwgICAgIDM0LCAgIDExNzksICAgMjQyNywgICAxNjgzLCAgLTE2NTgsICAgMzc0OSwKKyAtMTgxNiwgIC0yMDAwLCAgIDI4MjMsICAtMTI0MywgIC0xNDE1LCAgICA3MTMsICAgIDg3NSwgICAgIDc1Cit9LAorCisuZmNiMjJsXzEgPSB7CisgIDIxOTgsICAtMjIxNSwgIC0yMjUxLCAgLTE5NjYsICAtMTU0MCwgICAtNDY3LCAgICA0MDMsICAgMTY0NywKKyAtMjg2NywgIC0yNTg5LCAgICAtMzQsICAtMjMxNCwgICAtNjAyLCAgIDIzNzEsICAgMjYxNCwgICAyMjE4LAorIC0yNDk0LCAgIDM2NTksICAgMjcwOCwgIC0xMDc2LCAgIC05MTQsICAgIDIzMywgICAxMTQ5LCAgIDE0MjUsCisgICAzMTksICAgLTk3OSwgICAxMDIzLCAgIC02ODIsICAgIDExMCwgICAgMjM5LCAgICA0MjcsICAgIDcwMywKKyAtMjk3OSwgIC0yNTEzLCAgLTI2NDksICAtMjI2NSwgICA3NDIwLCAgICA1MjYsICAgMjE3NCwgICAyOTMyLAorIC0yODY4LCAgLTIwNTYsICAtMjIzMiwgICAxNjUxLCAgLTEzMjUsICAgLTg1NiwgICAtMjE4LCAgIDIwOTEsCisgICA0NTgsICAgMTUwOCwgIC0xMjA4LCAgIC04NDUsICAgIDI0NCwgICAtNDQxLCAgICA1NTgsICAgIDc1MiwKKyAgLTcwMCwgIC0xMzcwLCAgIC0zOTUsICAgIDk4MCwgICAtMzIxLCAgIC0yMzIsICAgLTI0MSwgICAgMjkzLAorIDEwMzkxLCAgLTE3OTIsICAtMTk0OCwgIC0xNTE4LCAgLTEwNDksICAgICA0MywgICAxNTI0LCAgIDIwMzMsCisgLTI0MzQsICAgIDMwMywgICAxNzMwLCAgLTEyMDUsICAtMTQzMiwgIC0xMTgzLCAgIC02OTQsICAgMTE4NSwKKyAtMjUzMSwgIC0yNjU2LCAgLTI3NTEsICAtMTc1NiwgIC0xMzIxLCAgLTExMDAsICAgIDI4NywgICA4NjA1LAorIC0yODY4LCAgLTI1NTQsICAgIDcyMSwgIC0yMDY1LCAgLTE2NzEsICAgLTc3MSwgICAgNjc1LCAgIDIyMjMsCisgLTI2OTAsICAtMjUwMSwgIC0yMzEzLCAgIDE4MjksICAgMzE4OSwgICAgIDQ1LCAgIDE4MjUsICAgMjAyNCwKKyAtMzE1MywgIC0yODI0LCAgLTI3MjksICAtMjMwOCwgICAxNjg2LCAgIC0zNzAsICAgIDQ4MiwgICAyNjA2LAorIC0yOTcyLCAgLTIzMjQsICAgMjQ5MiwgIC0xNzYyLCAgLTE2NjIsICAgICAyOCwgICA0OTc2LCAgIDMyMTQsCisgLTI3NjksICAgLTMxNiwgIC0xMTQ2LCAgLTE5NTQsICAgICA4NiwgICAgLTYwLCAgIC0zNzAsICAgMTE0NCwKKyAgNTUxOSwgIC0xNzg1LCAgLTE1MzgsICAtMTA0NCwgICAtNTgwLCAgICAtODksICAgIDcwNCwgICAxMTUxLAorIC0yNTg2LCAgLTEwOTQsICAgNzQ3MywgIC0xMjIwLCAgLTEwNzYsICAgIC01MCwgICAxMDI5LCAgIDE4NTAsCisgIDM1NDYsICAgMzI3OSwgIC0xODA2LCAgLTExOTEsICAgLTUyOCwgICAgNjgyLCAgIDExNjAsICAgMTM0MSwKKyAtMjg1MiwgICAxNTQxLCAgLTIzNTgsICAtMTg0MSwgIC0yMzE3LCAgLTEzNTEsICAgIDk5MywgICAyNDE3LAorIC0yNjc1LCAgIDI0ODIsICAtMjA2MSwgIC0yMDg5LCAgIDM2ODEsICAgIDYyNiwgICAxNjE5LCAgIDE4MTgsCisgLTI5MTYsICAgMjgyMSwgIC0yNDgyLCAgLTIxNjYsICAtMTA4NCwgICAxMTM3LCAgIDU1MzcsICAgMjg2NCwKKyAtMjQ5OSwgIC0xNzgyLCAgIDIxNTYsICAgMjU1OCwgIC0xMTE3LCAgICAxMjcsICAgMTE0NywgICAxNTU2LAorIC0yNTcyLCAgIDM4NjUsICAtMjAwOCwgIC0xODA1LCAgIC02NzksICAgIDExOSwgICAgIDM1LCAgIDEzMTksCisgLTI3MDQsICAtMTg3MiwgIC0xNzU2LCAgIDY4NDMsICAgLTkxMSwgICAgMzIyLCAgIDE2NDEsICAgMjQ2MSwKKyAtMjY1MiwgIC0xOTU3LCAgIDE5NzIsICAtMTU4MiwgICAzMDgyLCAgICAgODQsICAgMTA4NiwgICAxNDg3LAorIC0yOTgzLCAgLTIzMjUsICAtMjc4MCwgIC0yNTMyLCAgLTE4NTgsICAgLTI3OSwgIDEwMDkyLCAgIDQ1MTksCisgLTIzNjQsICAgMjcxOCwgIC0xOTA3LCAgIDI2NzgsICAtMTAwNSwgICAgMjQ2LCAgIDE0OTksICAgMTY3OSwKKyAtMjU3MCwgICA4Nzc5LCAgLTIwMDQsICAtMTYyNywgICAtODQ0LCAgICAgODksICAgMTcxMiwgICAyMTQ1LAorICAzMzE2LCAgLTE3NjMsICAtMTY0MiwgICAyODE5LCAgIC01OTksICAgICAgOSwgICAgOTA2LCAgIDE0MDEsCisgLTIyODksICAtMjIyNCwgICAyNDYyLCAgLTE1ODAsICAgLTg0MywgICAyNTAxLCAgICAtMjQsICAgMTMxMCwKKyAgMzA5MSwgIC0xNzQ1LCAgIDIzOTgsICAtMTI2NCwgICAtNzMxLCAgICAxMTMsICAgIDgzMSwgICAxMzI4LAorIC0yODAzLCAgLTIzODAsICAtMjgwOCwgIC0yMzc5LCAgLTIyOTAsICAtMTM3NiwgICAtMjM0LCAgIDIyNDIsCisgIDM1MzcsICAtMjEzNywgIC0yMDUwLCAgLTEyNjAsICAgMjg4MSwgICAgMTc3LCAgIDExNTgsICAgMTQyNCwKKyAtMzMwMywgIC0zMTIzLCAgLTMxMzAsICAtMjg2MSwgIC0yMDc1LCAgIDI1MjgsICAgIC00MywgICAzODkwLAorIC0zMTA2LCAgLTI2NzIsICAtMjU1NCwgICAxODMzLCAgIC04MjYsICAgICA1NSwgICA0OTEwLCAgIDMzMjQsCisgIDM5OTMsICAtMjE3NiwgIC0yNDQ2LCAgLTE4NDgsICAgLTc4NiwgICAzMzQ2LCAgIDE1OTAsICAgMjAzNCwKKyAtMjcyNSwgICAtMjY1LCAgICAzMDMsICAgMTA3NiwgIC0xOTg1LCAgIDM2NjEsICAgMTU1NiwgICAxOTgzLAorIC0zMTgyLCAgLTI3MTIsICAtMjk4OCwgIC0yODQxLCAgLTEzMzIsICAgNDgxNiwgICA2NDIyLCAgIDQxODQsCisgLTIyMzAsICAtMTI0OCwgIC0yMTc2LCAgLTE4MDYsICAtMTYxNywgICAtODc4LCAgIDM3NjQsICAgMTMwOSwKKyAtMjI4MCwgICAgNTA5LCAgIC0yMTEsICAgIDQyNiwgICAgNzczLCAgICAgOTksICAgIDUxMywgICAgNjI4LAorICAgMTY3LCAgICAxOTYsICAtMjI1NiwgIC0xODAyLCAgLTExNTcsICAgIDcyNCwgICAxNDA1LCAgIDEzODMsCisgIDIzODQsICAgLTQwOSwgICAtNjcyLCAgIC00NTMsICAgLTIwNSwgICAgLTg5LCAgICAtMTIsICAgIDI0MCwKKyAgIDExNCwgIC0yMjIwLCAgIC04MDcsICAtMTMwMiwgIC0xNjEyLCAgIC00MDUsICAgMTEzNCwgICAxMzgxLAorICAgNjk5LCAgLTE4MTYsICAtMjE1MSwgIC0xODgzLCAgIDI5NzUsICAgIDkyOCwgICAxNTI3LCAgIDE1NjUsCisgICA3NzUsICAtMjE0MSwgIC0xOTgxLCAgLTE1MzIsICAgLTU5MSwgICAzMzM4LCAgICA2ODMsICAgMTc2MywKKyAgIDQ2NiwgIC0yMDI4LCAgLTIwODYsICAgMTQ0OCwgICAtNjIyLCAgICA1ODksICAgMTI5NCwgICAxMTUwLAorICAgMTQ1LCAgLTIzODIsICAtMTA5MywgICAtMzY3LCAgICA5ODYsICAgIDMyMywgICAgNDA0LCAgICA5MzEsCisgIC0zNzEsICAtMjg2OCwgIC0yNzM3LCAgLTIxMDMsICAgIDEyOSwgICAgNzcxLCAgIDE0OTgsICAgMTk3NCwKKyAtMTQ4MSwgIC0xMDYwLCAgLTIzOTgsICAtMTEyNSwgICAgMjg1LCAgIDI3NzcsICAgMjk3NSwgICAxNDMxLAorIC0yNzIwLCAgIDE3NDgsICAtMjM3NSwgIC0xODQ3LCAgIC05MTIsICAgMzgyOSwgICAgODA4LCAgIDIwMzQsCisgLTI0OTIsICAtMjQ0NywgIC0xMjQ4LCAgIC05OTEsICAgMTQ0OSwgICAxMzA0LCAgICA4NjcsICAgMTE3MSwKKyAtMjk5OSwgIC0yNTU2LCAgLTI3NjMsICAtMjI5OCwgICAzMzU5LCAgIDQyNzcsICAgMTk5MSwgICAyODUwLAorIC0yNjkyLCAgLTI2NDAsICAtMjU5MywgICAxODEzLCAgIC00NTgsICAgMzA2OCwgICAxMDEyLCAgIDIwNDksCisgLTMyNTgsICAtMjgyMCwgIC0yODQ1LCAgLTIzOTUsICAgMjc4NywgICAgLTQ1LCAgIDU0NTcsICAgMzU2OCwKKyAtMjQ5MSwgIC0yMTE0LCAgLTE4ODQsICAgICAgNiwgICAtMzMyLCAgIC0yMzIsICAgMTY4MCwgICAxMTM5LAorICAyMDMyLCAgLTIzODMsICAtMjE4MywgIC0xNzI1LCAgIC05MTQsICAgIDE5MiwgICA0MTc1LCAgIDIwNTksCisgLTI5MjIsICAtMjk3MiwgIC0yOTIwLCAgLTIyMTAsICAtMTE0MywgICAxODUwLCAgIDI0NjgsICAgMTg3MSwKKyAtMzEzOCwgICAgLTk5LCAgLTI2NTEsICAtMjUxMCwgICAtMTI5LCAgICA2MzEsICAgMTY3NywgICAxOTI1LAorIC0zMzAyLCAgLTMxMjQsICAtMzIxNCwgIC0zMTQzLCAgLTI2MTYsICAgLTc2MSwgICAzOTc4LCAgIDQyMzQsCisgLTE2OTgsICAgLTgyNCwgIC0xOTc1LCAgIC03NDIsICAgMjQ0OSwgICAtNjEwLCAgICAgMjEsICAgIDk5OCwKKyAtMzA0NywgIC0yNjk3LCAgLTI3NDcsICAtMTkxOSwgIC0xNTQ1LCAgIDc1MzQsICAgMTI0MywgICAzNTQ4LAorIC0xODYzLCAgLTEyNTcsICAgIDMzOSwgIC0xMDI3LCAgICAxMjIsICAgLTYxMywgICAxOTg5LCAgICA5NTMsCisgLTIyMzIsICAtMTc1OSwgIC0xNzUxLCAgIC05NjksICAtMTU5MSwgICAxOTE3LCAgIC0zMjUsICAgIDg4OQorfSwKKworLmZjYjIybV8xID0geworIDEzNTMxLCAgLTEyNzgsICAtMjIxNywgIC0xOTU2LCAgLTEzNjAsICAgLTg5MiwgICAtNjUwLCAgIC04NjYsCisgIC0yNTUsICAgIDE5MiwgIC0xMTM5LCAgLTEyNDIsICAtMjEwMSwgIC0xNjgyLCAgLTE2MDEsICAgMjk1MCwKKyAgMjM0MCwgICAgMTIxLCAgICA2NjIsICAgIDQ0NiwgIC0yNjM2LCAgIDE3MTEsICAgIDYxNSwgIC0xODY0LAorIC0xMjk3LCAgLTEwOTgsICAgLTI5NiwgICAxMDcwLCAgIDEyODQsICAgIDg5MSwgICA3MzMyLCAgLTIyOTIsCisgLTIzMzQsICAtMTg4OSwgIC0xMTcwLCAgIDE4ODQsICAgLTU3MCwgICAgIDUyLCAgIDExNDYsICAgIDk0NCwKKyAtMjA4MywgIC0yMTkyLCAgLTI0MjAsICAtMjE2NSwgIC0xNTQyLCAgLTE0NzQsICAgLTI3OCwgICA0MTQ3LAorICAxNTA2LCAgIDE2NjYsICAgMTAxNCwgIC0xNjU3LCAgLTIyMjUsICAtMjI2MSwgICA4NTY4LCAgLTE0NDUsCisgIC01MjMsICAgLTExNSwgICAgOTk5LCAgICA2MDIsICAtMjc2MiwgIC0yMjYxLCAgICAyNzEsICAtMTc5NywKKyAtMTYzMywgICAtNzkwLCAgICAzOTEsICAgIDkwNywgICAxMzAyLCAgIDEwNzYsICAtMTkwNywgIC0yMjE5LAorIC0yNDQzLCAgLTE5NjMsICAtMTQ5NSwgIC0xMjk0LCAgIDQ3MjIsICAgIDkzNSwgICAxNjkxLCAgIDEzNzAsCisgLTIzNTUsICAtMTU4NSwgIC0yNTEwLCAgLTIyOTcsICAgMjY5MCwgIC0xNDkxLCAgIC02NDcsICAgIDM2MCwKKyAgMTQ2MCwgICAxNDc5LCAgLTIwNDEsICAgIDM2OCwgIDEwNDU0LCAgLTEyNzcsICAgLTcxNiwgICAtMTcyLAorICAtNTM4LCAgIC0yODcsICAgIDE2OSwgICAtMjMyLCAgICA5NjAsICAtMTA4NywgIC0yNDU5LCAgLTIxOTYsCisgLTExODksICAtMTk2NywgIC0xNTg2LCAgIC03ODMsICAgNTI3NSwgICAyODExLCAgLTE1MjMsICAtMTczMywKKyAtMjM3MywgIC0xOTQ2LCAgLTE1ODYsICAtMTI4MCwgICAtNDQyLCAgIC0yMDUsICAgMjMzMCwgICA2MzE5LAorIC0yNDgzLCAgLTIxMTUsICAtMjY0NSwgIC0yMDE2LCAgLTE0NjQsICAgICA4OSwgICAgNTI5LCAgIDEzMzgsCisgIDUyOTEsICAgMzE4NiwgICA1NzcwLCAgLTIzMTEsICAtMjY5NiwgIC0yNDIwLCAgIC02MTksICAtMjMyMiwKKyAgODQzNCwgICAtMTI5LCAgIDE2NjEsICAgMTIzMiwgIC0xMzc3LCAgLTEyNzcsICAtMTE5MywgICAgNDA2LAorIC0xMzMyLCAgLTEyNDYsICAgLTk5OSwgICAtNDk3LCAgIDEwMjQsICAgMTUwMCwgIC0yNzkxLCAgLTE0MTcsCisgLTIxNzMsICAgMjQxOSwgIC0xNDkyLCAgIC03MzQsICAgMjc5NSwgICAgNTU5LCAgICA3NTAsICAgIDUxOSwKKyAtMjcxNCwgICAtNTA5LCAgIDQ2MjIsICAgMzY3OSwgICAtMjk0LCAgICAgNzMsICAgLTgwNSwgICAgNjAyLAorICAgLTk5LCAgICAgOTQsICAtMjY1OCwgIC0xOTg0LCAgIDY5MDcsICAtMTc4MCwgIC0xMjQ0LCAgICAyNzIsCisgICA4NzQsICAgIDE0MCwgICAxMzI2LCAgICA2OTMsICAtMjY3OSwgIC0yMjc0LCAgLTI1NTEsICAxMzM1MSwKKyAtMjYxOSwgICA0NTcwLCAgLTE3MzksICAgMjMwOSwgICAxMjgwLCAgIDEyMzUsICAtMTAxMSwgIC0yMDg0LAorIC0xOTY4LCAgLTE0MDQsICAgMjU2OCwgICAzMTQ3LCAgIC0zMzYsICAgIDI3MCwgICAgNDk5LCAgICA1MDYsCisgLTE1NjcsICAtMjI0MCwgIC0yNjg1LCAgLTE5NTEsICAtMjI1NCwgICAyNzgzLCAgLTE0MTEsICAgODg3OCwKKyAgMjMyMSwgICAxNjkxLCAgLTI1NjcsICAtMjQ1MCwgIC0yNTcyLCAgLTIyODYsICAtMjAzOCwgIC0xODAzLAorIC0xMzE2LCAgIC0zMTUsICAgIDQ2NCwgICAxMjIzLCAgLTE5ODgsICAgLTkyNywgIC0yMDM1LCAgIDIxNjUsCisgIDM2NjMsICAgLTkxOSwgICAtMzI4LCAgICAyMjksICAgICAtMiwgICAgMjE3LCAgLTI3NzMsICAtMjE2MCwKKyAtMjYzNywgIC0yMTgzLCAgIDUwODEsICAtMTQzNCwgICAxNTI2LCAgIDI4MzAsICAgMTY5OCwgICAxMTUzLAorIC0yODEwLCAgLTExMzIsICAgNTQwOCwgIC0xOTkyLCAgIDQyNjcsICAtMTM1NywgICAgODA5LCAgICA1NjMsCisgICAgIDksICAgIC02NCwgIC0yOTQ5LCAgIDcwNjEsICAgNDYwNCwgIC0xNDI0LCAgLTE4MzksICAgLTYxMCwKKyAgLTI1MSwgICAgMzcwLCAgICA5MDEsICAgIDE0NywgIC0yMjY0LCAgIDMxMzUsICAgMzI0MSwgIC0xMTAyLAorICAtMzk3LCAgLTEyOTIsICAgICAzOSwgICAgIDE3LCAgICAzODAsICAgIDM4MywgIC0xNDgzLCAgLTE0NTgsCisgICA4MjAsICAgMjEzNSwgICAtNjQ2LCAgIC00NzksICAgIDE3MywgICAgIDIzLCAgIC0yNzQsICAgLTQ0MiwKKyAgLTk3OCwgIC0xMjE2LCAgLTE5MjgsICAgNzI2MCwgIC0xMjQ5LCAgIC05NTYsICAgIC0yNCwgICAgMjUwLAorICAgNDM4LCAgICAxMjgsICAgNDA4MCwgICAgMTUyLCAgIDI2NzcsICAgLTU4NywgICAtNjY3LCAgIC02NzIsCisgIC02NjIsICAgLTQ5MiwgICAtNzIyLCAgIC02ODgsICAtMTkwNywgICAtNzg3LCAgIDMxMDEsICAtMTQwNCwKKyAtMTIzNCwgICAtNTA4LCAgIDM4MTcsICAgIDQyNCwgICAgNjU3LCAgICAtODYsICAtMjE3OSwgICAtNTk5LAorICAyMTQxLCAgLTE0NDYsICAtMTg0NywgICA0MzQxLCAgIC04MDEsICAgIC0yNiwgICAgLTU3LCAgICAyMTYsCisgLTE2MjUsICAgLTgwMiwgICAxNzUyLCAgLTEzMDEsICAgMjYxNywgIC0xNTQ1LCAgIC01MTMsICAgLTQwMSwKKyAgIDIzNCwgICAgNjU4LCAgIDEyOTksICAtMTI3OSwgICAgODc0LCAgLTE0MDgsICAtMTEzNSwgICAgLTQwLAorICAtNDIzLCAgICAzOTQsICAgIDY2MCwgICAgNjg0LCAgIDMzNDEsICAgLTkzNywgIC0xODQyLCAgLTExNzcsCisgIDE5NDUsICAgLTYyMSwgICAgIDE5LCAgICAtOTMsICAgIDE0MSwgICAgLTU5LCAgLTI2MjYsICAgMzM2OCwKKyAtMTU4OCwgIC0xOTU5LCAgLTE1MDYsICAgMzcyOSwgICAtMzQ3LCAgICAyMTgsICAgIDQ5NywgICAgNTg1LAorIC0yNDk1LCAgLTI0NTIsICAtMjExOCwgICAgNTc4LCAgIC0yMjUsICAgIDM3OCwgICAgIDQwLCAgIDEwODAsCisgICA5MDgsICAgIDc2MSwgIC0yMDcwLCAgLTE2MDcsICAgMjUzNCwgIC0xNTM1LCAgIDE0OTMsICAgMjY2NCwKKyAgIDIxNSwgICAgNjM0LCAgICAzMTcsICAgLTIzMywgICA0MTg4LCAgLTE0NDYsICAtMjEyOSwgIC0xODEyLAorIC0xNDI4LCAgLTE1NzksICAtMTAzOCwgICAgIDk3LCAgICA5ODksICAgMjAzOCwgICAzNjcxLCAgLTI3MDcsCisgLTI2MDgsICAtMjE5OCwgIC0xMTE5LCAgIDE2MDEsICAgMTA0MiwgICAxMzI1LCAgIDEyMzAsICAgMTE0OSwKKyAtMjU2NiwgIC0xMDU0LCAgIDM2NTksICAtMjE3MywgIC0xNzcyLCAgIC03MTMsICAtMTA4MCwgICAtMTAxLAorICAgOTg3LCAgICA4MDUsICAtMTU1NSwgICAtNzQ5LCAgLTE1MTAsICAgMzQ0MywgIC0xNDAyLCAgIDQxNzIsCisgIC02OTYsICAgIDQzNywgICAgMjc2LCAgICAyMTksICAtMjczNSwgIC0yNDUzLCAgLTIwODIsICAgMzg5OCwKKyAgLTg2NywgICAtNTgyLCAgIC03MjYsICAgMTEzNCwgICAxMjI3LCAgIDExMjEsICAgMjMzMywgICAtOTYzLAorIC0xNDc0LCAgIDIzODYsICAgLTk1OSwgICAtMzI3LCAgIC0xMzgsICAgICAgNCwgICAgMjY4LCAgICA0NzksCisgLTI4ODksICAtMjg5NiwgIC0yNzAxLCAgLTE5NzUsICAgLTU5MywgICAxMjEyLCAgIDE1MTEsICAgMTA4NywKKyAgMTQ4MiwgICAxNjEyLCAgLTE3MDMsICAgNDg3NCwgICAgIDQ2LCAgLTEzNjQsICAtMTM0MiwgICAtNTQ0LAorICAtODc5LCAgIC00NTUsICAgLTQ4OCwgICAtMzk2LCAgLTI2MTYsICAgIDg0OSwgIC0yNDI0LCAgLTE5NzYsCisgLTE0OTEsICAgLTczOSwgICAgMzI1LCAgIDEyODQsICAgMTgzMSwgICAxMjIzLCAgICAtNDgsICAtMTQ1NywKKyAtMjEyMywgIC0xMzE4LCAgIDE2MTcsICAtMTA2NCwgICAyNDg0LCAgIC00NjcsICAgIDUzMywgICAgNzA3LAorICAgMzUxLCAgICA0MjIsICAgLTUyNSwgICAtNjU3LCAgICAyMDIsICAgLTQ3NiwgICAgMTMzLCAgIC02NzksCisgIC05NDUsICAgLTgzMiwgICAxOTA2LCAgLTI5ODEsICAtMjYwNSwgIC0xOTExLCAgLTI1NDEsICAxMTU1MywKKyAtMTU4NSwgICAxNTU1LCAgIDIxOTYsICAgMTYxNiwgIC0yNjY5LCAgLTIzNDUsICAtMjQyMywgIC0xODQ4LAorIC0xNzU2LCAgIDQ5MTgsICAgLTcxMSwgICAxMTg2LCAgIDE4NzMsICAgMTM5OSwgICAtNjcyLCAgLTE0MDEsCisgLTE1MjQsICAtMTEzOCwgICAtNjc0LCAgIDEyODUsICAgIDE5NSwgICAgODg0LCAgIC0zNzcsICAtMTA2NywKKyAtMjEyNSwgICAgMzc3LCAgLTE3NDcsICAtMTYwNCwgICAgODM3LCAgIC0zMzQsICAgLTExNSwgICAgLTU5LAorICAgMTYwLCAgICA0ODMsICAtMjIyMCwgIDEyODYxLCAgLTE2MzMsICAtMTYxNiwgICAtOTI2LCAgLTEyMDMsCisgIC0xMTMsICAgIC05MCwgICAgMzc4LCAgICAxNDgsICAgNTc0MCwgICAgIDg4LCAgLTIyNDYsICAtMTU5OCwKKyAtMTU0NiwgIC0xNjk0LCAgIDI3OTAsICAgIC03MiwgICAgNTkwLCAgICAgMjgsICAtMjYwOCwgICA0MzEyLAorIC0xMDY4LCAgIDMwOTEsICAgLTYzMiwgICAtNjUxLCAgICAzNjYsICAgICA2MywgICAgNzQ0LCAgICAzNzUsCisgIDE3NDYsICAgMjc1MywgIC0yMDc1LCAgLTE2MjEsICAtMTAzMywgICAtNDcxLCAgICA5NzIsICAgIDE5OSwKKyAgIDU3NSwgICAgNjU1LCAgLTIxNDgsICAgMjQwNywgIC0yMTgwLCAgLTE3NjQsICAtMTAzMCwgIC0xMDg5LAorICA0MDgzLCAgICAtODAsICAgIDQxNywgICAgMzg0LCAgIDExOTYsICAtMjI4NCwgIC0yNTQ5LCAgLTE3NzEsCisgIC03NzMsICAgIDIxMywgICAxMTg4LCAgICA3ODgsICAgMTM0MywgICAxMzU4LCAgLTI1ODQsICAgNzcyMywKKyAtMjE3MSwgIC0yMzAxLCAgLTE0OTcsICAgLTQzOCwgICAxMDAxLCAgICAxMTAsICAgIDY3MSwgICAgOTM5LAorICA2NDM1LCAgIDU3NzcsICAtMTc2NSwgIC0xMjg3LCAgLTExODEsICAtMTAxNCwgICAgIDg3LCAgIC05MTksCisgIC00MjIsICAgLTQ0NCwgIC0xOTMwLCAgIDQ5MDYsICAtMTY2MCwgIC0xNTU4LCAgIDM2MTcsICAtMTE3NywKKyAgIDI2MSwgICAgICA5LCAgICAyNjEsICAgIC00NywgIC0yNTM5LCAgIDI3NDksICAtMjQ3NiwgIC0yMjk4LAorIC0xMDQ3LCAgLTEzMTksICAgLTM0MSwgICAtNjA0LCAgIDIxMTEsICAgMjc3OSwgIC0yOTM1LCAgIDUwMTEsCisgLTE4NjAsICAtMjM2MywgIC0xNjg2LCAgLTEwMzMsICAgIDgwMCwgICAxNzc0LCAgIDE3MDAsICAgMTQ3OAorfSwKKworLmZjYjIyc18xID0geworIDExNTIzLCAgIC03OTYsICAtMTQ4OCwgIC0xODk3LCAgLTE4ODgsICAtMTY5MSwgIC0xNzY3LCAgLTE3OTQsCisgLTE2MjIsICAtMTIxMCwgIC0yMjg0LCAgLTI3NzcsICAtMjM4MiwgIC0xMzcxLCAgIC0yMzgsICAgMjk5NywKKyAgMzE4MiwgICAgNTg4LCAgIDExMjksICAgIDcwNCwgICAgMjQ4LCAgIDE3MDMsICAgLTI2NCwgIC0xMzA2LAorIC0xMTQ3LCAgIC01NjAsICAtMTUxMywgICAtOTU2LCAgIDE2NjcsICAgMTM0MCwgICA1MjIwLCAgLTIyNzYsCisgLTIyMTUsICAtMjA0OSwgIC0xNDc5LCAgLTEyOTQsICAgLTc3NCwgICAgIDY2LCAgIDEyNzAsICAgMjA3NSwKKyAtMTQzNSwgIC0xOTgxLCAgLTIzMjIsICAtMTg5NiwgIC0xMzIxLCAgIC00NjIsICAgIDEzOCwgICA1MDIyLAorICAyNTQ5LCAgIDE2ODMsICAgLTEwMCwgIC0xNzQ0LCAgLTE1MjgsICAgLTQyMywgICA2MDkzLCAgICAtNjEsCisgIC0yODgsICAgLTYyMywgICAtNjUwLCAgIC04MjgsICAtMTUyMSwgICAgMTM0LCAgIDEyNDAsICAtMTM5OSwKKyAtMTQ1MCwgICAgNjEyLCAgIC05NjksICAgMjU4NSwgICAgOTQ1LCAgIC0zMTIsICAtMTEzOCwgIC0yNDg4LAorIC0yNTEzLCAgLTE5ODgsICAtMTYwNywgICAtNzczLCAgIDMzODQsICAgMTE5MiwgICAyNjUxLCAgIDI1ODAsCisgIC05ODQsICAtMjAxNSwgIC0xNDY1LCAgLTE1NzYsICAgMjI3MywgIC0xMjIxLCAgICAgOTEsICAgMjYxNSwKKyAgIDg0MCwgICAxMjk5LCAgLTEwNjksICAtMjE1MSwgIC0xODk5LCAgIC03MzUsICAgIDQ0MCwgICAgODg4LAorICAtMjQxLCAgICA1MDIsICAgIDk1MywgICAzNjEzLCAgIDE4MDYsICAtMTg1NSwgIC0yMzAzLCAgLTE3NTgsCisgLTEzMTgsICAtMTQ4NCwgICAgLTEwLCAgICA1OTcsICAgMzcyMywgICAxOTkyLCAgIC00ODgsICAtMjA2MywKKyAtMjI4NCwgIC0yMTcyLCAgLTE5MDUsICAtMTU0NywgICAtOTM3LCAgICAtMTgsICAgMzI3NiwgICA3MTg0LAorIC0xOTQyLCAgLTIzMDIsICAtMjM5OSwgIC0xOTcyLCAgLTEzNzgsICAgLTYzNSwgICAgMzAyLCAgIDEwODEsCisgIDU0NTQsICAgMzM1OCwgICAtNDQ3LCAgIC04MDcsICAgIDIwNSwgIC0xODA1LCAgLTE1NDYsICAgLTQ0NiwKKyAgNjM2NCwgICAtOTE2LCAgICAxNTEsICAgLTM3NywgICAtNTgyLCAgIC04NTYsICAgLTIwNCwgICAtNzMxLAorICAtODg0LCAgIC02NzQsICAgLTI1NywgICAgLTY3LCAgIDE1NjQsICAgMjQ4NiwgICAxMDAzLCAgLTE1MDgsCisgLTE2OTIsICAgMTUxNSwgICAtODg5LCAgIC02MjIsICAgMjM2NiwgICAgICA5LCAgICAtMTcsICAgLTI0NSwKKyAgMzczMywgIC0xMDU3LCAgIC0yODQsICAgMzE5NywgICAgLTMxLCAgIC00NDAsICAtMTExNSwgIC0xNjA5LAorIC0xODM0LCAgLTE5MzAsICAgIDIzMCwgICAgMjYyLCAgIDczNDQsICAgIC0zOSwgIC0xNzQ2LCAgIC01NjIsCisgLTE1NTQsICAtMTgzOCwgIC0xNjQ4LCAgLTEzMTAsICAgMjE1NywgICAgIDgwLCAgIC0xMDIsICAgIDIzOCwKKyAgLTgyMywgICAtNjIyLCAgIC03MjAsICAgLTExNSwgICAtMjc0LCAgICAgMTYsICAtMTU2MiwgIC0xNzg1LAorIC0xNTM1LCAgIC0zMzQsICAgMjYwNCwgICAzMzg4LCAgIC00MTAsICAgLTEwMywgICAtMzQ4LCAgIC0xNDIsCisgIDE2NzYsICAgLTQ0MSwgIC0yMjY3LCAgLTE5ODgsICAtMTQyMSwgICAtNjgwLCAgIDEzMDIsICAgMjY4MiwKKyAgIDM4MywgICAgLTEwLCAgIDE0ODcsICAtMTA4NiwgICAtMjUxLCAgLTExMzQsICAgIDE0MSwgICAgLTg0LAorIC0xMDAzLCAgIC04OTgsICAgICA5NSwgICAyMzA0LCAgICA4MDIsICAtMTU0OSwgIC0xNTYyLCAgIDI2NTAsCisgIDIxODAsICAgICA2NCwgICAtNTEyLCAgIC04MzIsICAgLTcwNSwgICAtNDI5LCAgIDE4MjYsICAtMjI4MywKKyAtMTk3NiwgIC0xMjc3LCAgIDI2OTksICAgIDUwNCwgICAgMjQ5LCAgICAgLTksICAgIDE3OCwgICAgLTMzLAorIC0xMzU3LCAgLTExMzgsICAgMzAwNSwgICAgMjkzLCAgICAyMjksICAgMTYzMywgICAtMTk3LCAgIC01NDAsCisgLTEyNDUsICAtMTYxNywgIC0xMjY5LCAgIDY2MzksICAgMjQzNywgICAtNjQ3LCAgLTE1MDEsICAtMTA5NywKKyAtMTA1MSwgIC0xMTUwLCAgLTExODMsICAtMTQ2MSwgICAgIDcxLCAgIDE1MjksICAgMjg0NywgICAxMTQ5LAorICAtNzA1LCAgLTEzNDUsICAtMTYwNSwgICAtNjI5LCAgIC02MTcsICAgIC02MCwgIC0yMDgxLCAgLTE0MzUsCisgICA5MzgsICAgIDg0NCwgIC0xMDU1LCAgIC04NDEsICAgMTE3OSwgICAgMzkyLCAgIDExMTIsICAgIDk0NiwKKyAtMTI1MiwgIC0xNzI4LCAgIC0yNjYsICAgNzA2MywgIC0xMzM1LCAgIC05MjAsICAtMTA0OCwgICAgMjA2LAorICAgIDQ4LCAgIC02MTksICAgNDc2NCwgICAgMjc0LCAgIDIzOTQsICAgLTc5OSwgICAtNzk4LCAgLTEwMDMsCisgLTEyNzgsICAtMTgwMCwgIC0xNjI2LCAgLTE0MTUsICAgLTQ5OCwgICAxNDM5LCAgIDE2NDMsICAtMTk3OCwKKyAtMTI1OCwgIC0xMTM2LCAgIDEyODUsICAgICAtOSwgICAgNTk2LCAgICAxNDEsICAtMjIxMSwgICAgOTA4LAorICAgODAyLCAgIC00NzAsICAtMTEyNSwgICAzMjE2LCAgIC0yMzQsICAgLTQxMiwgICAgICAzLCAgIC05ODAsCisgICAgMTUsICAtMTA0NywgICAxNTMwLCAgICA2NjAsICAgMTk4NiwgICAtNDgwLCAgIC00OTksICAgLTU1MCwKKyAgLTczMywgICAtNTMxLCAgIDEzMjYsICAtMTYwNywgICAgNzg3LCAgLTExMzYsICAtMTAwMiwgICAgLTY1LAorICAgMzU4LCAgICA3NDMsICAgIDI1MywgICAtMjk0LCAgIDM0OTgsICAtMTAzMywgIC0xMjcwLCAgIC03OTAsCisgICA1MzcsICAgMTc4OCwgICAgMzA5LCAgICAtNzIsICAtMTI0MSwgIC0xOTk5LCAgICA2MDksICAgMjk4MSwKKyAtMTAyNSwgIC0xNjQyLCAgIC05NTgsICAgMzg0NSwgIC0xMjIxLCAgIC05NjIsICAgLTk2NSwgIC0xNjEyLAorIC0xOTkzLCAgICAtMzMsICAtMTEzNiwgICAxMDg2LCAgICAtNDYsICAgMTE3OCwgICAtMjI5LCAgICAxMzksCisgICA2NDQsICAgIDcxOCwgIC0xNjk2LCAgIDI0MTEsICAgMTAxOSwgIC0xMDU2LCAgICAgNTIsICAgIDIyNCwKKyAgLTQ4NywgICAtMzk1LCAgICAtNDAsICAgIDEyNSwgICAzMDAxLCAgLTE5NTUsICAtMTk1MCwgICAtNzg0LAorIC0xMTExLCAgICA4OTcsICAgLTUxNCwgICAgMTU5LCAgICA3ODUsICAgMTA5NSwgICAyOTQ0LCAgLTI1NTQsCisgLTI0MDcsICAtMTk3NSwgICAtNjMyLCAgIDEwMzAsICAgMTcxMiwgICAgMzY2LCAgICA0NjMsICAgIDEyNSwKKyAtMjM1NCwgICAtNzk2LCAgIDU2NjMsICAtMTA1NSwgIC0xMTUxLCAgIC04NzAsICAgIDM0OCwgICAtNjc2LAorICAxNDQ3LCAgICAyMTUsICAtMTAwNSwgIC0xNTMxLCAgIC05MTAsICAgMjI0OSwgICAtNDM4LCAgIDI4ODksCisgICAxMDcsICAgLTQwNCwgICAtMjcxLCAgIC01MzQsICAtMTAyMiwgIC0yMTE3LCAgLTE3MzgsICAgMjI2MSwKKyAgLTI1NywgICAtNzg4LCAgICAgMzIsICAgMTc0NywgICAxMTk2LCAgICA5MTAsICAgICAzMywgICAgICAxLAorICAgLTIzLCAgICAgMjgsICAgIC0yNSwgICAgIDE5LCAgICAgMTMsICAgIC0yOSwgICAgLTIzLCAgICAtNDgsCisgIC05MDcsICAtMjExMywgIC0xOTc4LCAgLTE0MjYsICAgLTUzNSwgICAxNTg5LCAgIDE5MDgsICAgMjcyNCwKKyAgMTY0NiwgICAtODk3LCAgICA3NTgsICAgMjMyNiwgICAgNjc0LCAgLTE0NDksICAgIDExMSwgICAgMjIwLAorICAgNDc1LCAgIC0xNjIsICAtMTQ2NSwgIC0yMDM2LCAgIC01MjgsICAgMTMwOCwgIC0yMDg3LCAgLTIwMzEsCisgLTEzMDgsICAgIDE4MywgICAgIDM1LCAgIDEwOTcsICAgMTAwOCwgICAxODY0LCAgLTIxMTYsICAtMjMwMywKKyAtMTkyOCwgICAtMjYxLCAgIDIzNDIsICAgLTI5MiwgICAxNDgwLCAgICAyNjgsICAgMTU4MiwgICAxMDc5LAorIC0xMTgzLCAgLTExNTQsICAgLTc3NywgICAgMzA5LCAgIDEyMTgsICAgIDY4MywgICAxMzE0LCAgIDE2NzcsCisgIC03NTgsICAtMTc0NSwgICAxNDIyLCAgLTEzMzEsICAtMTYzOCwgIC0xMTAwLCAgIC0zMDMsICAgNTAwMywKKyAgIC01NywgICAtMzc5LCAgIC01MTEsICAgLTc1NiwgICAtNzI3LCAgLTIzMTUsICAtMTg2MCwgIC0xNzc1LAorICAtNjc2LCAgIDM4NTQsICAgIC02NywgICAgLTUyLCAgIDIwMTgsICAgMTUzMiwgICAtMTYwLCAgIC0xOTcsCisgICAtNzUsICAtMTkzNCwgIC0xMTM0LCAgIDIwMjUsICAgMTgxMCwgICAtNDkxLCAgICAgODMsICAgIDY0NiwKKyAgIDM5MCwgICAtMjk3LCAgIC00NDEsICAgLTM0MiwgICAtNDc5LCAgIC00ODYsICAgLTI5NiwgICAgLTMwLAorICAgNDQzLCAgIDExNTEsICAgMzUwOCwgICA2MTE5LCAgIC00OTMsICAtMTQyNywgIC0xMzkzLCAgLTEyNzMsCisgLTEyODAsICAtMTY4NywgIC0xNjgzLCAgLTE1MTEsICAgNTEwOSwgIC0xMDA4LCAgLTExMzcsICAgLTYzOCwKKyAgLTY0OSwgICAtMzQyLCAgIC01OTAsICAgLTQ3OCwgICAtNTc3LCAgIC0zNDksICAgLTU3OSwgICAyNTQ4LAorICAtNDYzLCAgIDIxMDcsICAgLTU2OCwgICAtNjc4LCAgIC03ODgsICAgLTQ1NCwgICAtNjA4LCAgIC00NTIsCisgIDE5MzQsICAgMTQ4NSwgIC0xNzQ2LCAgLTEwMDcsICAtMTE3NCwgICAtNTczLCAgICAyMzksICAgLTExOSwKKyAgIDY3OSwgICAgLTc2LCAgLTE2ODcsICAgMTk1NiwgICAtODk4LCAgIC00NzcsICAgIDQ1NiwgICAtMTU2LAorICAxNDYwLCAgICAgMTMsICAgICA5MiwgICAtOTg3LCAgICA1NTQsICAtMjc3MiwgIC0yNTc4LCAgLTE2OTQsCisgIC0yMzUsICAgIDc1MywgICAxNTI3LCAgIDExMDYsICAgMTUzOSwgICAxMzQyLCAgLTEzMDUsICAgNjU2MCwKKyAtMTUyNiwgIC0xNzY1LCAgIC03OTMsICAgLTYwMCwgICAgMjQ4LCAgIC01NDIsICAgIC02MywgICAtNDIxLAorICA0ODI4LCAgIDEyODgsICAtMTU4MCwgIC0xODI2LCAgLTExNjMsICAtMTAxNCwgICAtMjIxLCAgIC04MTgsCisgIC0xMDksICAgIC02MSwgICAxMjY1LCAgIDE5MzksICAtMTI2NSwgICAtNDE0LCAgIDE5MTIsICAgLTE5MCwKKyAtMTE1NywgICAtNjc1LCAgIC03NTYsICAgLTkzNSwgICAyNTI5LCAgICAxMzYsICAtMTcwOSwgIC0xNzI3LAorIC0xODE5LCAgLTE1MDQsICAtMTIzMiwgICAtOTU5LCAgIDExMjgsICAgNDE0MiwgIC0xOTQ1LCAgIDI5NTgsCisgIC05MDAsICAtMTQzMiwgIC0xNzIwLCAgLTEzODAsICAgIDM4MSwgICAxNDczLCAgIDEyMzUsICAgMTA2MgorfSwKKworLmZjYjIybF8yID0geworICAyNDQxLCAgLTIwODYsICAtMjEyOSwgIC0yMTQ2LCAgLTE4MzksICAtMTAzNSwgICAgMjk1LCAgIDI0NjUsCisgLTI3ODUsICAtMjU5NywgICAgLTgxLCAgLTIxNjIsICAgLTk5MSwgICAzMDYwLCAgIDMwNTYsICAgMjk4NSwKKyAtMjQxNSwgICA0MDA5LCAgIDMwNTgsICAtMTE2NSwgIC0xMjgxLCAgIC0zMjIsICAgIDYyOSwgICAyMjMyLAorICAgNDgxLCAgLTIyNTUsICAgMTE2NSwgIC0xNDU1LCAgIC02MjEsICAgIC0yOSwgICAgOTIzLCAgIDEzNzEsCisgLTI4MjIsICAtMjQyMSwgIC0yNTk2LCAgLTE5MDgsICAgNjMzOCwgICAgMjc5LCAgIDE4NDUsICAgMzUzMiwKKyAtMjk1NSwgIC0yNTcxLCAgLTI1NTQsICAgIDc0NCwgIC0xNzg1LCAgIC05MDksICAgIDc3NSwgICAzMTU2LAorICAgNzM4LCAgIDE3NjAsICAgLTQ1OCwgICAtNTkwLCAgICAtNzMsICAgICAyMiwgICAgLTkxLCAgICAzMjYsCisgLTEwOTgsICAtMTUxMSwgIC0xMDAwLCAgIDE3NDEsICAtMTAyNCwgICAtNTYyLCAgIC0zOTksICAgIDczNiwKKyAgOTY2OSwgIC0yMTA5LCAgLTE4NzIsICAtMTUzOSwgIC0xMjA4LCAgIC0yNjUsICAgIDk5NCwgICAyMzY0LAorIC0yMTIxLCAgICAtOTgsICAgMTUyMywgIC0xNDI3LCAgLTE0NTAsICAtMTE1NywgICAtMjk0LCAgIDEzNzUsCisgLTMwMDcsICAtMjY2OSwgIC0yODQ3LCAgLTE3NzcsICAtMTE5NiwgIC0xMjU3LCAgIDEwNjUsICAgOTEyOCwKKyAtMjk0OCwgIC0yNTA5LCAgICA0NzAsICAtMjUyMSwgIC0xOTQ3LCAgIC03MjgsICAgIDUwMywgICAzODEwLAorIC0yNTM4LCAgLTI0NjksICAtMjIxNywgICAxOTU3LCAgIDI1ODAsICAgLTIyOSwgICAxMjEyLCAgIDIyNjMsCisgLTMxNzQsICAtMjY2MCwgIC0yNzkyLCAgLTI2OTIsICAgMTIyNiwgICAtNTEyLCAgICA1NTUsICAgMzk2MCwKKyAtMjk3OSwgIC0yNDI2LCAgIDE5NzgsICAtMjE4MiwgIC0xODY4LCAgIC00NTUsICAgNDY4MSwgICA0NTgwLAorIC0yNTE0LCAgLTE2NDIsICAtMTAyOSwgIC0xNzEyLCAgICA0MTYsICAgLTgzOCwgICAtMzYyLCAgIDEyMDgsCisgIDUyMTEsICAtMjEyOCwgIC0xODY3LCAgLTEzMzcsICAgLTU0OSwgICAgLTcwLCAgICA4MjgsICAgMTUwOCwKKyAtMjI3MiwgIC0xNjExLCAgIDczMDcsICAtMTYxMiwgIC0xMjQ0LCAgIC00NjEsICAgIDc0OSwgICAyNTEwLAorICAzNjY5LCAgIDMyMzYsICAtMTg0NSwgIC0xMzMzLCAgIC04NjYsICAgIDI2OCwgICAgODUwLCAgIDE2ODYsCisgLTI4MDUsICAgMTA3OSwgIC0yMjU4LCAgLTIwNzUsICAtMjAxNywgIC0xMTE1LCAgICAyMTQsICAgMjczNSwKKyAtMjcxOSwgICAyNjc2LCAgLTIxNTQsICAtMTk3NiwgICAyODg0LCAgICAzOTMsICAgMTI0NywgICAyMzgyLAorIC0zMDQzLCAgIDIxODgsICAtMjcwMywgIC0yMzUzLCAgLTE4NjEsICAgLTIwOCwgICA0NDE5LCAgIDQ1MTEsCisgLTIxODcsICAtMTYzMCwgICAyMjQ2LCAgIDIzMzEsICAtMTEwNSwgICAtMTk4LCAgICA4MTgsICAgMTcyMSwKKyAtMjE4MCwgICAzNTcxLCAgLTE4NDEsICAtMTczOCwgIC0xMDIwLCAgICAgMTQsICAgIDQwNywgICAxMDI4LAorIC0yNTM2LCAgLTIxNzEsICAtMjExNSwgICA2NjMwLCAgIC05NjgsICAgLTMwNiwgICAxNDM4LCAgIDM1NzQsCisgLTI0MTEsICAtMTg1NywgICAxOTExLCAgLTE1NDYsICAgMjcwOSwgICAgIDU3LCAgICA5MTAsICAgMTcyNywKKyAtMzE1OSwgIC0yNTY1LCAgLTI2NzUsICAtMjc0NiwgIC0yMDE3LCAgIC01MzQsICAgODQ2MSwgICA2MTAzLAorIC0yMjk5LCAgIDI5MTIsICAtMTg1MSwgICAyNjYwLCAgLTE0NzksICAgIC05NywgICAxMTQ4LCAgIDIyMDQsCisgLTI1MTAsICAgODc4MSwgIC0yMTk0LCAgLTE3OTAsICAtMTExNCwgICAtMTEwLCAgIDExNDAsICAgMjg4NSwKKyAgMzI2MSwgIC0xOTIxLCAgLTE2MzMsICAgMjc2NiwgICAtNzg4LCAgIC00MDMsICAgIDYxMCwgICAxNjUxLAorIC0yNTE1LCAgLTIwMjEsICAgMjQxNSwgIC0xNjA2LCAgLTExNDksICAgMjQ3OSwgICAgMjk3LCAgIDE2OTMsCisgIDM4MjMsICAtMTUzOCwgICAyNTE0LCAgLTEyNjEsICAgLTkwNCwgICAtMjM2LCAgICA1NTAsICAgMTU4MSwKKyAtMjkwMywgIC0yNDQwLCAgLTI5MjIsICAtMjc0OSwgIC0yNDgwLCAgLTE4NDksICAgLTQyMywgICAzNjEzLAorICAzNDIwLCAgLTE4NzYsICAtMTkyOSwgIC0xNTM3LCAgIDI5NTUsICAgICA1OCwgICAxMDE0LCAgIDE5NTAsCisgLTMyOTUsICAtMzAwOSwgIC0zMTYxLCAgLTI5MjYsICAtMjM1MywgICAyMzU1LCAgICAzNTEsICAgNTUwMiwKKyAtMzE0MCwgIC0yNzQ1LCAgLTI3ODEsICAgMTI0NywgIC0xMDM3LCAgICA1MzgsICAgNDkzOSwgICA0MzgyLAorICAzNTg0LCAgLTIyODQsICAtMjMyMSwgIC0xODQ0LCAgIC03NDMsICAgMzE1NiwgICAxNTQ2LCAgIDIzNTgsCisgIC01NjIsICAgLTEwMSwgICAtNDk3LCAgLTExOTYsICAtMTAyMywgICAxOTcyLCAgIDEyNTUsICAgMTM3NCwKKyAtMzE0NiwgIC0yODI0LCAgLTMwNTcsICAtMjc1NywgIC0xNzM2LCAgIDM3NDYsICAgNTYwOSwgICA1MTE4LAorIC0yMTU1LCAgLTE2NjUsICAtMTcwMSwgIC0xNzgwLCAgLTE5NzUsICAtMTEyNywgICAzMTg1LCAgIDIwMzYsCisgLTI1NDAsICAgIDMyNCwgICAtNDgxLCAgICAzMTEsICAgIDYyNCwgICAgNzE5LCAgICA1NDMsICAgMTAzMCwKKyAgIDU1MCwgICAgNTEzLCAgLTI0MzAsICAtMTgxNywgIC0xMTI5LCAgICAgNjIsICAgMTUyNiwgICAxODA5LAorICAyMTcyLCAgLTEzMTQsICAtMTAzNSwgICAtNTg2LCAgIC0yOTIsICAgIDIzMywgICAgMjA5LCAgICA1NDMsCisgIC0yNTIsICAtMjM3MiwgIC0xOTYxLCAgLTE2MjksICAtMTMwNiwgICAtNDA4LCAgICA0NTEsICAgMTMzOSwKKyAgIDc5MiwgIC0yNjE5LCAgLTIzMTYsICAtMTYyNCwgICAxOTQxLCAgICA2NzgsICAgIDk3NywgICAxNzEwLAorICAgNDI4LCAgLTI0OTksICAtMjM2OSwgIC0yMTAxLCAgLTE0NDgsICAgMjk4OCwgICAgODc0LCAgIDI0OTcsCisgICA0NTEsICAtMjI2MywgIC0yMjA0LCAgIDE0MDMsICAgLTYzMSwgICAgNjk0LCAgIDE0MjQsICAgMTY1OCwKKyAgLTI0MywgIC0yMTA0LCAgIC0zNzgsICAgIDM1NSwgICAxNDQ2LCAgICAzNzMsICAgIDM3NywgICAgOTczLAorICAtNzU2LCAgLTI4MDIsICAtMjUwOCwgIC0yMDgxLCAgICAxNzcsICAgIDM1MiwgICAyNDI4LCAgIDIzNTksCisgLTE1MzMsICAtMjcxMCwgIC0yNTQ0LCAgLTExMDIsICAgIDQxOSwgICAzMTMyLCAgIDEyMjIsICAgMTk0MiwKKyAtMjc1NiwgICAxODQ0LCAgLTI0MjksICAtMTg1NCwgIC0xMjgzLCAgIDM5NjAsICAgMTYzMywgICAyOTE3LAorIC0yODU4LCAgLTI3ODQsICAtMjEwNiwgIC0xMDI1LCAgIDE1ODgsICAgIDkwNSwgICAxMDkyLCAgIDE2NTcsCisgLTMwMjgsICAtMjcxNSwgIC0yNzgyLCAgLTIyMTgsICAgMjg1MiwgICA0MDA2LCAgIDI1MzQsICAgMzcyNiwKKyAtMjc4MywgIC0yMzU1LCAgLTIxNDYsICAgMjExMywgIC0xMjAxLCAgIDMzNjEsICAgMTE3OCwgICAyNjcwLAorIC0zMTk5LCAgLTI3OTYsICAtMjY4MiwgIC0yNDg5LCAgIDE5MDUsICAgLTQ3MSwgICA1MDk3LCAgIDQ0MzYsCisgLTIxOTcsICAtMTA3OCwgIC0yMzI3LCAgICA0MjAsICAgLTYzNywgICAgIDEwLCAgIDE2NDcsICAgMTM2MiwKKyAgMTgxNSwgIC0yNTE5LCAgLTIzNjMsICAtMjE3NCwgIC0xNDU0LCAgICAtMzEsICAgNDEyNSwgICAzNDQ2LAorIC0zMDU0LCAgLTI5NTMsICAtMjczOCwgIC0yMzI4LCAgLTE2MzYsICAgMTA4NiwgICAyMjM4LCAgIDIxMzIsCisgLTMwODksICAgLTQzMiwgIC0yNjc0LCAgLTI1MTUsICAgLTE2OCwgICAgNzQ1LCAgIDIyMzYsICAgMjMwNSwKKyAtMzIxNCwgIC0yOTUzLCAgLTMxNTksICAtMzA4NiwgIC0yNzQ4LCAgLTEyMDAsICAgMzM0NiwgICA1MTI3LAorIC0xMTUwLCAgIC01MDEsICAtMjEwOSwgIC0xNjYyLCAgIDIzMDEsICAgLTQwMSwgICAgNjUxLCAgIDEzMjAsCisgLTMwNzIsICAtMjYwOCwgIC0yODMzLCAgLTIyNDksICAtMTM4NywgICA3NzA0LCAgIDE4MTEsICAgNDk2MCwKKyAtMjQ3NCwgIC0yNTg5LCAgICAgODMsICAgLTQ5OSwgICAtNzg1LCAgICAxOTQsICAgMTMxMiwgICAxNDQyLAorIC0yNzE2LCAgLTE2NjMsICAtMjA4OCwgIC0xODEyLCAgLTEzOTYsICAgMTg2MiwgICAtMzY5LCAgIDEzOTcKK30sCisKKy5mY2IyMm1fMiA9IHsKKyAgODgwOSwgIC0yMjkxLCAgLTI0NTIsICAtMTk4MiwgIC0xMzU2LCAgIC00MjMsICAgIDQxOSwgICAgNTg4LAorICAgODk3LCAgIDEwODYsICAgICA3OSwgIC0yMTU1LCAgLTE5NTcsICAgIDM2NywgICAxMDgwLCAgICAyMzMsCisgICA3MTgsICAgIDQ0MSwgICAgNTE1LCAgICA2NDIsICAgIDczMCwgICAyNDU0LCAgICA3NzQsICAtMjI5OSwKKyAtMTUyNiwgICAtNzg0LCAgIC0zNTksICAgICA5NiwgICAgMzg1LCAgICA0ODIsICAgNDkwNSwgIC0yNTAxLAorIC0yNDMxLCAgLTIwNDcsICAtMTEzOSwgICAgMTMxLCAgICA3NDMsICAgIDk5OSwgICAxMjQzLCAgIDEyOTQsCisgLTIxNTQsICAgLTQzMywgIC0yNDYxLCAgLTIyMDEsICAtMTU1MiwgICAtMTYzLCAgIC0yMDAsICAgNDAwOSwKKyAgMTczMSwgICAxNjUyLCAgLTIzODEsICAgNTI5NSwgIC0xNDU3LCAgIC04OTUsICAgMzQ4MCwgIC0xMjMwLAorICAgLTk0LCAgICA0NzEsICAgIDU1NCwgICAgNjY5LCAgLTI0NTgsICAtMTI3MSwgICAgMjc4LCAgLTIyMzgsCisgLTE4NTIsICAgLTgxMywgICAgODg4LCAgIDEwMzIsICAgIDgwMSwgICAxMDA4LCAgIC0yNTgsICAgLTUzOCwKKyAtMTc0NCwgIC0yMDg3LCAgLTE2NTEsICAtMTIzOSwgICAyMjIyLCAgICAgLTQsICAgIDc4MywgICAgODgyLAorICAgNDc4LCAgICA3ODIsICAtMTMzNSwgIC0xNDUzLCAgIDE3MjgsICAgLTYyNywgICAtMzg3LCAgIC0yMDUsCisgICAyMjEsICAgIDE5MywgIC0yMjgyLCAgIC01MTgsICAgNzQ2NCwgIC0xODA4LCAgLTExMzQsICAgLTE5OSwKKyAgIDM0MCwgICAgMzIxLCAgICA0MTAsICAgIDYxNywgICAyMjc4LCAgIC00MzYsICAtMjA4MiwgIC0xOTU4LAorIC0xNDkzLCAgIC04ODUsICAgIDYyOCwgICAgNzk0LCAgICA4NTUsICAgIDk4OSwgICAgMjMyLCAgLTExMTUsCisgLTI2MTcsICAtMjE1MiwgIC0xMjkwLCAgLTEyOTksICAgLTQ1OCwgICAgMjIyLCAgIDM5MzYsICAgMzM0OSwKKyAtMjI0MCwgIC0yNzg3LCAgLTI2ODksICAtMjI1NSwgIC0xMjQxLCAgICA4MTYsICAgMjMwNywgICAxNTY2LAorICAxNjg1LCAgIDE3MjMsICAgMjk2MCwgIC0yMTM0LCAgLTI1MzIsICAtMTc5OCwgIC0xMTI4LCAgLTEwNzMsCisgIDUzODAsICAgMTAxMywgICAxNTI1LCAgIDE0MTUsICAtMTk3NiwgICAgNDU2LCAgIC01MzgsICAtMTQzMywKKyAtMTM0NywgICAgIDIyLCAgIC00OTYsICAgIDI4NCwgICAgMzg3LCAgICA0NjUsICAtMjIxNCwgIC0xODYzLAorIC0yMjYxLCAgIDEwNDksICAtMTQ4NywgIC0xMjIyLCAgIDE2MTAsICAgIDYyMSwgICAxMDAwLCAgIDExMTYsCisgLTIzOTMsICAgLTczMSwgICA0MDc1LCAgIDIzNzUsICAtMTE3OCwgICAtOTA4LCAgIC0zODMsICAgIDMyNywKKyAgIDU0MywgICAgNTcyLCAgLTIwNzEsICAtMjAzOSwgICAzMzEwLCAgLTE5MDMsICAtMTUwMiwgICAgLTcyLAorICAgMTIzLCAgICA2OTMsICAgIDcyMSwgICAgOTE4LCAgLTE4NjYsICAtMTI1MSwgIC0xMDY1LCAgIDU2MzAsCisgLTE1NzQsICAgLTU0MSwgICAgICAxLCAgIDEwMTQsICAgIDgxMywgICAgODg3LCAgLTIxNDUsICAtMjQyMSwKKyAtMjE3NiwgIC0xNzU2LCAgIDE4NTYsICAgIDQwOCwgICAgIC0xLCAgICA3NTksICAgMTEwOSwgICAxMjc2LAorICAzMDUzLCAgLTI3MDUsICAtMjQ2NywgIC0yMDY4LCAgLTExNjAsICAgMTQwNSwgICAgNDU5LCAgIDExNjcsCisgIDEyMTksICAgMTMxOCwgIC0yMTk4LCAgLTIwMzcsICAtMjAwNSwgIC0yMjA0LCAgLTIwMzksICAtMTQ3MywKKyAtMTUyOSwgICAgMjY0LCAgIDEzMzMsICAgMTgyMiwgIC0yMTIxLCAgLTE0MzQsICAgLTQ3MiwgICAxOTAxLAorICAyNDQ4LCAgIC01ODksICAgLTQyNCwgICAgMjQ4LCAgICAzNzYsICAgIDYwMiwgIC0xNTcxLCAgLTEwMzIsCisgLTEyNDMsICAtMTYxOSwgICA1NjgyLCAgLTExNjIsICAgIDM2MiwgICAgNTcwLCAgICA4NjUsICAgIDg1MiwKKyAtMTg3NSwgICAtODA1LCAgIDQyNTgsICAtMTU2OSwgICAyOTkyLCAgLTExNzUsICAgICA1MSwgICAgMTY0LAorICAgMzE0LCAgICA2NDgsICAtMjA4MywgICA1NTc0LCAgIDI1NTMsICAtMTg2NiwgIC0xMTU2LCAgIC02NDIsCisgIC0xOTgsICAgIDMzMCwgICAgNDQ2LCAgICA2MDIsICAtMjM2NSwgICAxNjAxLCAgIDI4NzMsICAtMjA0MywKKyAtMTUxMCwgIC0xMTQyLCAgICAtMjAsICAgIDU4OCwgICAgNTM1LCAgICA2NzYsICAtMjIwNywgIC0xNjM3LAorICAgNjI2LCAgICA3NDUsICAtMTU0OCwgICAtNTkwLCAgICA3NDUsICAgIDU0MCwgICAgNTA1LCAgICA2MTgsCisgICA3NDksICAtMTM4OSwgICAgODU3LCAgIDEzODcsICAgLTM5OCwgICAtNjA2LCAgICAtNzUsICAgIC04NiwKKyAgICAxMSwgICAgIDc4LCAgIDMzMjIsICAtMTM0NywgICAxOTc4LCAgLTE0MzEsICAgLTc0NSwgICAtMjgwLAorICAgLTQyLCAgICAxMzUsICAgIDM1MCwgICAgMzc2LCAgIC01MDgsICAtMTM0OSwgICAyOTYxLCAgLTExODQsCisgIC02NDcsICAtMTI1NywgICAzMDA5LCAgIC0zNzQsICAgIDUyMywgICAgNjE2LCAgLTE4NDgsICAgIC00MSwKKyAgMjY1MiwgIC0xNjA5LCAgLTE2MDMsICAgMzI4NCwgICAgLTI0LCAgICA1MDIsICAgIDEyMiwgICAgNDQ4LAorIC0yMzM3LCAgLTEwMjksICAgIDczNCwgIC0xNTMzLCAgIDE1MjMsICAtMTMxMiwgICAtNzU0LCAgICAzMzUsCisgICA1MTAsICAgIDc3NCwgICAgNzY5LCAgIC0xMTcsICAgIDEzOSwgIC0xMjU0LCAgLTE0NjgsICAgLTk2NSwKKyAgLTM3NSwgICAgICAyLCAgICAyMjcsICAgIDUxOCwgICAzMTg3LCAgLTE1MjQsICAgLTc3NiwgIC0xMjUzLAorICAyOTc3LCAgIC01MzAsICAgIDMxOSwgICAgLTYxLCAgICAyNDQsICAgIDQxMywgIC0yMjkwLCAgIDMwODUsCisgLTE3NjMsICAtMTQ4MCwgIC0xMzc0LCAgIDMyNzIsICAgIC04NywgICAgMzIzLCAgICA0MjEsICAgIDY1MiwKKyAtMjMxNywgIC0yMTgyLCAgLTE2MDQsICAgICAtMSwgICAtODAxLCAgIDEzMjAsICAgLTE1NiwgICAgOTA3LAorICAgNzk5LCAgICA5MTgsICAtMTQ5NCwgIC0yMjA1LCAgIDExMzcsICAgICA2OSwgICAxMjQ5LCAgIDM0MzcsCisgICA5MjUsICAgICAyOSwgICAgNDE5LCAgICA0NDgsICAgMzU3NCwgIC0xNTY0LCAgLTE3MTMsICAgMjM3NCwKKyAgLTk0MSwgICAtMjUyLCAgICAxMjMsICAgIDI2MywgICAgMzY2LCAgICA1MzksICAgMTA1OSwgIC0xODU2LAorIC0xNzUzLCAgICA3NjYsICAtMTcwNCwgICAgMTA2LCAgICAyNjIsICAgIDU5NiwgICAgNjg0LCAgICA4MjAsCisgLTI1MDMsICAtMTg3OCwgICAxODM1LCAgIC01OTQsICAtMTAyNCwgIC0yMTA1LCAgLTE1NjcsICAgIDQ4OCwKKyAgIDc5NCwgICAgODgzLCAgLTE2MjYsICAgLTYxMywgIC0xNDEwLCAgIDI4NDYsICAtMTQxMywgICAzNTU3LAorICAtMzQ4LCAgICA0NjAsICAgIDMzMiwgICAgNTc3LCAgIC05MDcsICAgIDcwMCwgIC0xNjgwLCAgIDExMzAsCisgLTE2MzcsICAgLTc5MywgICAtMTYwLCAgICAtMzgsICAgIDQ3MywgICAgNjMwLCAgIDE0ODcsICAgMTg3MiwKKyAtMTUyNiwgICAxMzc5LCAgIC04MDYsICAgIDEyMSwgICAtMzgzLCAgICAxNDksICAgIDI1OSwgICAgNDEzLAorICAgNzU5LCAgLTI4MTcsICAtMjc1OCwgIC0yMjkwLCAgLTEzNDgsICAgIDQ2MCwgICAxNzgyLCAgIDE1MzYsCisgIDE1MTMsICAgMTUwMywgIC0yMjY1LCAgIDMxOTMsICAgIDExNywgIC0xNzA0LCAgLTEzNjcsICAgLTQ4NywKKyAgIDEyNSwgICAgMzY1LCAgICA1OTQsICAgIDY1MSwgIC0yMjg3LCAgIDEyNzIsICAtMjUzNywgIC0yMDM4LAorIC0xNTE1LCAgIC01NzgsICAgMjk5NCwgICAgNTgyLCAgICA5NDEsICAgMTA1OCwgIC0xNTU2LCAgLTE1ODMsCisgIC03MjAsICAtMTU4NCwgICAgOTU2LCAgLTEwMzIsICAgMTg2MSwgICAgMTQ2LCAgICA0MDIsICAgIDQyOSwKKyAtMjE4NCwgICAxNjY3LCAgIDEyNDEsICAgIDI4OSwgICAgIDUyLCAgIC0yMzIsICAgLTI2NSwgICAgMjEwLAorICAgMjQ4LCAgICAzMzEsICAgMTEzMywgIC0xODEzLCAgLTE4NjksICAtMTQyOSwgIC0xNDg0LCAgIDU2MjAsCisgIC00MDAsICAgMTMxNiwgICAxMTQ2LCAgIDExNTAsICAtMTk3NSwgICAtODE4LCAgLTE5MjEsICAtMjA1NCwKKyAtMTc2OCwgICAyOTUzLCAgIC01NDQsICAgIDQyNiwgICAgODU2LCAgIDExMDcsICAgIDQ5MywgIC0yMDE5LAorICAgMTc2LCAgLTE5MTUsICAtMTA0MCwgICAgNzE3LCAgICAtOTEsICAgIDcyOCwgICAgNjQ3LCAgICA3NzYsCisgLTIzNjAsICAgIDczOSwgIC0yMTM2LCAgICAgMzAsICAgIDYzNiwgICAtNDQ3LCAgIC0xMTYsICAgIDQ5OCwKKyAgIDUzMSwgICAgNzc1LCAgLTIyNTAsICAgODYwNywgIC0yMDc1LCAgLTE5MjgsICAtMTA3MiwgICAtNDUwLAorICAgIDM4LCAgICA0MzksICAgIDU1OCwgICAgNzc4LCAgIDQ0ODQsICAgMTA1NiwgIC0xODMwLCAgLTE3MTYsCisgIC05ODgsICAgLTQxMiwgICAgMjYwLCAgICAgNTYsICAgIDQyNSwgICAgNTc5LCAgLTIyNDMsICAgNDA5NCwKKyAtMTI2NywgICAyMTcyLCAgIC05OTAsICAgLTU2MiwgICAgIDk3LCAgICAzMDQsICAgIDUzMywgICAgNjA5LAorICAgNzkwLCAgICA3ODAsICAtMjAyOSwgIC0xOTQ3LCAgLTEzMjcsICAgMTIyNCwgICAgMjU1LCAgICAzNDQsCisgICA1MTYsICAgIDY2MCwgICAtNTkxLCAgIDE3MDIsICAgLTExOCwgIC0xNDAyLCAgICAzOTYsICAtMTM4NywKKyAgMjI2OCwgICAtMjQ3LCAgICAxNzcsICAgIDM1NSwgICAxMzkzLCAgLTIzMTgsICAtMTk3NSwgIC0xNTYzLAorICAgODYzLCAgIC05MzksICAgLTM2NSwgICAgNDExLCAgICA4MDAsICAgMTAxOSwgIC0yMzcwLCAgIDQ2NTYsCisgLTIzMDEsICAtMjExMSwgIC0xNjc5LCAgIC02OTgsICAgIDQ1OCwgICAgNzg4LCAgIDEwMDQsICAgMTEzOCwKKyAgMjI4NSwgICA0OTI0LCAgLTE5NDAsICAtMTk1NSwgIC0xMTU5LCAgIC00MzYsICAgIDIzNywgICAgICA1LAorICAgMzAwLCAgICAzNjQsICAtMjQ5MiwgICAyMTY1LCAgLTIwMjEsICAtMjA3MiwgICAxNTA0LCAgIC02MTIsCisgICAtOTMsICAgIDI0OSwgICAgNjc2LCAgICA3OTksICAtMjQxMSwgICAxOTUyLCAgLTE3NTIsICAtMjQxOCwKKyAtMjI4NSwgIC0xMzIzLCAgIC02MjEsICAgIDgzNywgICAxMDQzLCAgIDEyNjYsICAgICA3NiwgICAzMTYwLAorIC0yMTc2LCAgLTIxNzYsICAtMTcxNywgIC0xMTA1LCAgIDEwNDUsICAgIDQxMCwgICAgNzI4LCAgICA5NDAKK30sCisKKy5mY2IyMnNfMiA9IHsKKyAgNjk0NiwgIC0xODUwLCAgLTE5ODYsICAtMTU5MCwgIC0xMjc2LCAgLTEwNjMsICAtMTAyNiwgIC0xMDE3LAorICAtODA1LCAgIC0zNDYsICAgICAgOSwgIC0yOTExLCAgLTI4NDMsICAtMTg5OSwgICAtMTk4LCAgIDIxOTMsCisgIDMzMjUsICAgMTMxNSwgICAgIDM3LCAgIC01MjgsICAgLTM3MSwgICAgNTk5LCAgIC03NTEsICAtMjE1NywKKyAtMTkxMiwgICAtODU1LCAgICA5ODgsICAgMTIyMiwgICAxMDg1LCAgICA5NTMsICAgMzIxMiwgIC0yNzkzLAorIC0yNTY0LCAgLTE3MDcsICAgLTY1NywgICAgNjgzLCAgIDExMDksICAgIDY4MywgICAgNjQ3LCAgICA0NDYsCisgLTE5MDYsICAtMjMxNSwgIC0yNTY5LCAgLTI0MjgsICAtMTY5OCwgICAtNjAwLCAgIDExMDAsICAgMzc5MCwKKyAgMzM2OCwgICAyMTcyLCAgIDIwMTcsICAgLTg5NSwgIC0xMzU0LCAgIC03MzQsICAgMjU1MiwgICAtNDAzLAorICAgLTY4LCAgIC00MDIsICAgLTc1MiwgICAtOTMyLCAgLTEyMDUsICAtMTkzNywgICAgNTcyLCAgLTE0MzQsCisgIC01MDAsICAgLTU3OSwgICAgMjkxLCAgIDE3MjMsICAgMTMxMiwgICAxNjk1LCAgIC0yMzgsICAtMTcxNSwKKyAtMjAyOSwgIC0xNTI1LCAgIC04MTYsICAgLTM2MywgICAyODE2LCAgICAxNjcsICAgMjE5NiwgICAxNzkzLAorICAgODk3LCAgLTEwODEsICAgLTI2MiwgIC0xMzM4LCAgIDEwNTIsICAtMTIzMSwgICAgLTk0LCAgIDEyOTYsCisgICA1MDMsICAgIDE4NCwgICAgNTg4LCAgLTIwNTcsICAgLTkxMSwgIC0xOTMzLCAgLTE3NjksICAgIDE2NywKKyAgMTAxMywgICAxNzc0LCAgIDE0MTQsICAgMTI4OSwgICAyNDA2LCAgLTE5MDYsICAtMjA1NSwgIC0xOTUyLAorIC0xNzI2LCAgLTE2MTgsICAgLTQ1MSwgICAgNTc1LCAgIDMwMjEsICAgMjU2OSwgICAtNzc2LCAgLTE2NDksCisgLTIxMTEsICAtMTkzMCwgIC0xNDk5LCAgLTEzNDksICAgLTU5NSwgICAgMzI5LCAgIDMwOTAsICAgNTQ1OCwKKyAtMTk1NCwgIC0xMzA5LCAgLTE1NTQsICAtMTE1OSwgIC0xMTMyLCAgICAzMjksICAgIDcxNCwgICAgNzYwLAorICAyNTI5LCAgIDI0MTcsICAgMTA0NiwgIC0xMDI1LCAgLTExMTQsICAtMTMyNSwgICAtMTU0LCAgLTE1MDEsCisgIDQxNjAsICAgLTY5NiwgICAgMjMwLCAgICAzOTgsICAtMjAxMCwgICAgMzg1LCAgLTEzNDQsICAgICAzNiwKKyAtMTI2OSwgICAtOTg3LCAgIDEwMDksICAgMTQ1MywgICAxMTYzLCAgIDE1OTEsICAgIDkxNiwgIC0xNTM0LAorICAtNTA4LCAgICAyMjEsICAtMTU5NiwgIC0xMTMwLCAgIDEzOTQsICAgIDUzOSwgICAgNjc2LCAgICA2NzYsCisgIDEyNjMsICAgMjAyOSwgICAgMjg0LCAgIDE1OTIsICAgIDE2MSwgICAtMTI0LCAgIC01NzIsICAtMTM2MiwKKyAtMTk0NiwgIC0yMTQ4LCAgLTE0ODgsICAgLTIyMiwgICA0OTY3LCAgLTEyMDIsICAgLTkzOSwgICAtMzc1LAorICAgLTgwLCAgIC01OTMsICAgLTQ0NSwgICAtNDE4LCAgIC03ODEsICAtMTU2MCwgICAgIDMxLCAgIDQ3NTcsCisgLTE0MTcsICAgLTk1NCwgICAtNDAyLCAgICAxOTMsICAgLTMxNiwgICAtMjc4LCAgIC05MjYsICAgLTg5NSwKKyAtMTAyNCwgICAtNDM2LCAgIDI2NzMsICAgMTk5MSwgICAgMjU0LCAgICAgMjgsICAgLTg2MSwgIC0xMjkxLAorICAxNDc1LCAgLTI3MDgsICAtMjY4OSwgIC0yMTE4LCAgIC03MDMsICAgIDI5MCwgICAxODQxLCAgIDIwNDgsCisgIDEyMTMsICAgIDU5NCwgICAgMTMyLCAgLTI1OTgsICAtMjQyNywgICAtOTg4LCAgLTExMTEsICAgLTE1OCwKKyAgIDQ3OCwgICAyMTE4LCAgIDI1NzEsICAgIDgzMCwgIC0xNDMwLCAgIC02NzgsICAgLTc3MywgICAxMzQwLAorICAyNDczLCAgIC03OTgsICAgLTc1MSwgICAgMjE1LCAgICAyNzQsICAgIC02NSwgICAgMzM1LCAgLTE5NDcsCisgLTE3OTYsICAtMTQzNiwgICAzODYyLCAgIC02MTEsICAgIDEwNSwgICAgLTMxLCAgICA3NzUsICAgIDY2OSwKKyAgMTQzOSwgIC0xMjY2LCAgIDE2NzAsICAgLTczOSwgIC0xMjU5LCAgIC01NzIsICAgIC0xNywgICAtMTA3LAorICAgMTc2LCAgICAxMzAsICAgMzg5OSwgICAzNDc4LCAgIC01NDgsICAtMTQyOSwgIC0xMTc2LCAgLTExMDQsCisgLTExNDcsICAtMTUwMywgIC0xMjc3LCAgLTEwNjgsICAgLTI1OCwgICAyNjQ1LCAgIDE3NTMsICAgLTMzMywKKyAgLTgyNywgIC0xMzA2LCAgIC04MjcsICAgLTUwMiwgICAtMzA2LCAgIC0xMTksICAtMTYwMiwgIC0xNjQ0LAorICAxOTIyLCAgIDExMjcsICAgLTYyOCwgIC0xMDczLCAgICAzNDgsICAgIDE5NSwgICAgNjE2LCAgICA2ODUsCisgIDE3NTAsICAgLTg5OCwgIC0xODUyLCAgIDE4MTMsICAgLTcwMCwgICAgMjU0LCAgICA1OTgsICAgLTIzNCwKKyAgLTQzMywgIC0xMDM1LCAgIDI1MDIsICAgICA5NCwgICAgNDY3LCAgLTE2NzIsICAgLTkwNSwgICAgNzc2LAorICAgNjc5LCAgICAtMTEsICAtMTA3MSwgIC0xODQ1LCAgLTEwODMsICAgLTMyMCwgICAgNjkwLCAgICAxMTAsCisgIC03MDgsICAtMTA3NywgICAyNTE0LCAgICAgNzAsICAgLTQxMiwgICAtMzAwLCAgIC0zNzEsICAgLTcxNywKKyAgMTcwMCwgIC0xNjI1LCAgLTEzNDYsICAgMTk1NCwgICAgIDE0LCAgICAtNjQsICAgLTEyMSwgICAgMTgxLAorICAtNjczLCAgIC05MDksICAgMjI3NCwgIC0xMzg5LCAgIDIwNTgsICAtMTUwMywgICAgMzA2LCAgIC0xODcsCisgIC0yMDksICAgIC02OSwgICAxNTIzLCAgIC02MzIsICAgLTY5NSwgIC0xMjgzLCAgIC05ODgsICAgLTU2OSwKKyAgLTc5OCwgICAtNTIxLCAgICAzOTgsICAgMjgzNCwgICAxOTUzLCAgLTIyMTUsICAtMTYyNiwgICAgMTA2LAorICAgICA2LCAgIC00OTgsICAgIC01NywgICAgMTczLCAgICA3MzEsICAgMTAwMiwgIC0xNzA2LCAgIDE3MDEsCisgIC0zMjgsICAtMTc0NSwgIC0xMzk4LCAgIDIxNzYsICAgIC0xOSwgICAgMzExLCAgICA0OTIsICAgIDY2NywKKyAtMTA3MywgIC0xODAzLCAgLTE2ODQsICAgIDcwMywgIC0xMzE2LCAgIDE4MDMsICAgIDY1OSwgICAgOTEzLAorICAgOTA2LCAgIDEwMzMsICAtMTk4MiwgICAtMTAyLCAgICA5NDUsICAtMTYyMCwgICAgNzE4LCAgICA1NTUsCisgICA2MTMsICAgICAzOCwgICAgMzk0LCAgICA0MjEsICAgMjczOCwgIC0xMTU5LCAgLTIyNDgsICAtMTg1MiwKKyAtMTU2OCwgICAgIDMzLCAgICAzNjMsICAgMTQ5MCwgICAgOTM1LCAgICA1NjEsICAgMTQ2NCwgIC0yNDY2LAorIC0xMjA5LCAgLTEyMDQsICAgLTY5MiwgICAyMDA5LCAgICAxMjksICAgIDM1NCwgICAgMzcyLCAgICAzODAsCisgLTIwNTMsICAgMTEyMiwgICAyMjcyLCAgIC04MjQsICAtMTM1NSwgICAtOTI2LCAgIC0xMjIsICAgIDU2NywKKyAgIDUyNiwgICAgOTIzLCAgLTEzMjAsICAgICA1OSwgICAtMjI2LCAgIDE2NzQsICAtMTUxMiwgICAxNDk4LAorICAtNjMxLCAgICAyMjEsICAgICAyNiwgICAtMjQ3LCAgICAtNDAsICAtMTYxNSwgIC0xNTk3LCAgIDIxMTEsCisgICAgMzQsICAgLTgxMywgICAgMjAwLCAgICAyMTksICAgIDc1OCwgICAxMDAwLCAgICAzMDYsICAgIDM5NCwKKyAgLTQzMCwgICAtMTE3LCAgIC00MDksICAgIC04MSwgICAtMjA3LCAgICAgMTYsICAgICAzNiwgICAgMTc2LAorIC0xNzM3LCAgLTI4OTgsICAtMzAwNSwgIC0yMjE0LCAgIC01NjgsICAgMjE0MCwgICA0MTMyLCAgIDI1OTIsCisgICA1MDQsICAgLTUyMSwgIC0xNTA5LCAgIDM2MTAsICAgMTA3MCwgIC0xODkwLCAgLTEzMTksICAgIC0xMSwKKyAgIDE3NCwgICAtMTQ4LCAgIC0yMTIsICAgLTM0NywgICAtNDY0LCAgLTEwNjgsICAtMjU2OCwgIC0yNTMyLAorIC0xOTczLCAgIC01MTksICAgMjEwNCwgICAzNzEzLCAgIDE4ODIsICAgLTE0NSwgIC0xMzE5LCAgLTIzNzUsCisgLTE4NjIsICAgLTg0MywgICAyMDYxLCAgIC0yNjYsICAgMTQ2NSwgICAgODY2LCAgICA5MTIsICAgMTE4MywKKyAtMTc4NCwgICAyMDcyLCAgICAyMDUsICAgLTM3NSwgICAxMTEyLCAgIC0zNzQsICAgLTUzNCwgICAtNDMwLAorICAtMTYyLCAgIC0yMDQsICAgIDM3NSwgICAgIDgyLCAgIC04MjMsICAtMTE0OCwgICAtNzUyLCAgIDQ2ODEsCisgIC0zMzksICAgLTI0NywgICAtNzkwLCAgLTEwODgsICAgLTQ5NCwgIC0yMzAyLCAgLTIzMTAsICAtMTYwMywKKyAgICA0NiwgICAzMzY3LCAgICAtNTAsICAgIDM5MywgICAxMzgzLCAgIDE0NTcsICAtMTM3NywgIC0yMDA1LAorICAgNjQzLCAgICAzMjYsICAgIDMxMiwgICAxMTg5LCAgIC0yMjUsICAgIDU2MywgICAgMjYxLCAgICAtNzAsCisgIC02NjcsICAtMTE5MSwgIC0yMjU1LCAgIC00NzAsICAgMTAwMCwgICAgMTQyLCAgIC01MjUsICAgMjI4NSwKKyAgIDc1NiwgICAyMDYxLCAgIC05NTMsICAgNTg4OCwgIC0xMzM5LCAgLTE1MzQsICAtMTI1MiwgICAgLTE2LAorICAtMTE2LCAgIC0zMDUsICAgLTM3NSwgICAtNTk2LCAgIDM2MTEsICAgLTg4OSwgICAtNTExLCAgICAgNDMsCisgIC04MDksICAgLTY1OSwgICAtNzM3LCAgIC01MTAsICAgLTI1OCwgICAtMTA4LCAgLTE1MTUsICAgMjgwNiwKKyAtMTU1NSwgICAxMDI1LCAgIC05MzIsICAgLTYwMSwgICAgMTQ2LCAgICAxNjQsICAgIDIwNywgICAgIDcxLAorICAxNjA2LCAgICAgOTMsICAtMjQyMCwgIC0yMzExLCAgLTE2NDEsICAgLTI0NCwgICAxNzg1LCAgICA4MDQsCisgIDEwNDAsICAgIDQyNywgIC0xNTEwLCAgICAgMzgsICAtMjQ5MCwgIC0xOTg3LCAgICAgNDQsICAgIDY5OSwKKyAgMTQwNywgICAgOTg4LCAgIDEwNjEsICAgIDQxMSwgICAxMTYyLCAgLTEzODIsICAtMjY2OSwgIC0xNjM1LAorICAtOTA1LCAgIDE1MDMsICAgIDY3NCwgICAxMzU3LCAgICA4NjksICAgIDI0NCwgICAgNDExLCAgIDI2MTIsCisgLTE3OTIsICAtMjE0NywgIC0xNjkzLCAgIDE0MzQsICAgIDI4MSwgICAgIDM4LCAgICAyMjgsICAgIDQyNCwKKyAgMjI5MSwgICAxMzU0LCAgLTIxMjgsICAtMTM3NywgIC0xMDE0LCAgIC02MDksICAgIDEzMSwgICAtMTUxLAorICAgNDE4LCAgICA2MDIsICAgIDExMSwgICAyMjAwLCAgLTE1NDcsICAtMTE1MywgICAxNDM1LCAgLTEyODIsCisgICAgIDYsICAgLTExMSwgICAgIC0xLCAgICAgOTIsICAgIDIzOCwgICAgNjEzLCAgLTIyNzEsICAtMTE4MSwKKyAtMTQ1NSwgICAtOTE5LCAgIC0xODIsICAgMTA2NiwgICAxOTMyLCAgIDE2NzksICAtMTcxNSwgICAyODI1LAorIC0xNzY0LCAgLTE3NTksICAgLTc0MSwgICAtODI5LCAgICA1MDEsICAgIDc0NiwgICAxMDU2LCAgIDE0MTYKK30sCisKKy5mY2I0NGwgPSB7CisgIDQ4NjgsICAtMTg1MSwgIC0yMDMxLCAgLTIwMTksICAtMTc1MSwgICAtNTUyLCAgICA3NTYsICAgIDkyOSwKKyAgMTM4OSwgICAxNTkwLCAgLTIwOTAsICAtMTIwMiwgIC0xMzE3LCAgICA1MTYsICAtMTc5OCwgIC0xMDIwLAorICAtNjk0LCAgIDQzMjIsICAgMTM4OCwgICAxOTA0LCAgLTI2MDUsICAtMTIzOSwgICAxMDA1LCAgIC03NTcsCisgLTEyNDgsICAgLTM1OCwgICAgNjk5LCAgIC0yMDEsICAgIDQwOSwgICAxMDkzLCAgLTI5MDEsICAtMjI1NCwKKyAtMjYwNSwgIC0yNTk1LCAgLTIxMDQsICAtMTY4MSwgICA2ODU0LCAgIDI2OTIsICAgMzE1NSwgICAzNDQ2LAorIC0yNTM1LCAgLTE0MjEsICAtMTc0NSwgICAgODk4LCAgLTIwNDYsICAtMTQ1NywgIC0xMDQ0LCAgIC0yNjksCisgIDE3NDgsICAgMTg3MywgIC0yMjY4LCAgLTEwOTgsICAgIDQwNywgIC0xODY1LCAgLTIxMDMsICAgMTUxMCwKKyAtMTIxNywgICAtMzk5LCAgIDE3MTgsICAgMjAxNywgICAzNjM4LCAgLTE2ODUsICAtMTU0NywgIC0xNDgwLAorICAxNjM3LCAgIC03NDQsICAgIDU4MCwgICAgNTg2LCAgIDEzMTMsICAgMTQwOSwgICAgNjE3LCAgLTIwMjAsCisgLTE5MTksICAtMjE3OSwgICAgOTMyLCAgIC05MzcsICAgIDU1OSwgICAxNzk1LCAgIDE1MjgsICAgMTU5NiwKKyAtMjg2NywgIC0yNTUzLCAgLTI1MDcsICAtMjY1MywgIC0yMzY1LCAgLTE5ODUsICAgLTE3MCwgICA4Njc5LAorICA0MjcxLCAgIDQyNzMsICAgMjI2MywgIC0xODM1LCAgLTE5MzQsICAtMTcxOSwgIC0xNzc4LCAgIDIzNTcsCisgICAxMjUsICAgMTMxOSwgICAxNTQzLCAgIDE3NjUsICAgMzY4OSwgIC0xMjE1LCAgIDIzNjksICAtMTUzMywKKyAtMTYxMSwgICAtNzcxLCAgIC0xMjMsICAgMTAwNSwgICAxMjk3LCAgIDE0NjUsICAtMjQ5MSwgICAyNjMxLAorIC0xNjM2LCAgLTE2NTUsICAgMTI0NCwgIC0xMTc4LCAgICAzODYsICAgIDk2MSwgICAxMzAwLCAgIDE1NTMsCisgLTIzNTcsICAtMjQwNCwgIC0yMzA1LCAgLTIxNzcsICAtMTcxNCwgICAtMzgzLCAgICAtOTgsICAgIDI1OCwKKyAgMzkwMiwgICAyNDc1LCAgLTI5MjMsICAtMjU4MCwgIC0yNjg1LCAgLTI4MDMsICAtMjY3OCwgIC0yNDI4LAorIC0xMjQ3LCAgICA0NTAsICAgODE3NCwgICA1MDM1LCAgLTIzMDIsICAtMTYyOSwgIC0xNDk1LCAgIDE4MzIsCisgIDE2MTYsICAgLTU3NywgICAgNjM5LCAgICA4NzIsICAgMTEyMiwgICAxNDM3LCAgICA3ODUsICAtMTk0NywKKyAtMTk3NiwgICAgODIzLCAgLTE5MDksICAtMTAwNSwgICAgNDMwLCAgIDEyNDQsICAgMTcxMywgICAxNjY0LAorIC0yNTM3LCAgIDgwMjUsICAtMTcwNSwgIC0yMDA1LCAgLTIwMzAsICAtMTE1NSwgICAgIDY0LCAgIDExMDYsCisgIDE5NzUsICAgMjI3NywgIC0yNDEwLCAgLTI2MzksICAtMjI5MiwgIC0xODU4LCAgICAxNjIsICAgIDc0NCwKKyAgIDU1NSwgICAxNTU5LCAgIDE3MTksICAgMTgwNiwgIC0yMjgyLCAgLTE5ODIsICAtMTkxNCwgICAxNDE1LAorIC0xNzg1LCAgIDIxOTcsICAgIDI1NCwgICAgNzYzLCAgIDEzMzgsICAgMTc0MSwgIC0yNTA5LCAgLTE5OTEsCisgLTIzMjgsICAtMTg1MywgIC0yMjk5LCAgIDUxNDUsICAgIC0zNCwgICAxNDk1LCAgIDI5MTMsICAgMzAxOCwKKyAtMjAwOSwgIC0xNzM2LCAgIDI0MTEsICAtMTU5NSwgICAxODc3LCAgLTEzMTYsICAgIDY5MywgICAxMDQyLAorICAxNTY1LCAgIDE3NDQsICAtMjY1NywgIC0yMTYxLCAgLTIyMjIsICAtMjEzNSwgICA0NDU0LCAgLTE3ODQsCisgIDEzMzEsICAgMzIwOCwgICAyODUyLCAgIDI5NTUsICAgMzczOCwgIC0xMzM4LCAgLTE0MjUsICAgMjA5MCwKKyAtMTYwMSwgICAtMjc5LCAgICAgLTIsICAgIDcxMiwgICAxMjIwLCAgIDE0MzYsICAtMjM4NSwgIC0xMjY1LAorICA3MDkzLCAgLTE1NjEsICAtMTc0MiwgIC0xMDAzLCAgICAyODMsICAgMTAwOSwgICAxODQzLCAgIDIwNTUsCisgLTIyNTEsICAtMjE3NSwgICAyMzEwLCAgLTEzMjEsICAtMTk3NiwgICAxODc0LCAgICAxNjQsICAgMjc4MSwKKyAgMjcyMSwgICAyNDg3LCAgIDI1MTksICAtMTEwMSwgIC0xNTM5LCAgLTE1NzUsICAtMTQ4NywgICAtNzI0LAorICAgLTI1LCAgICAzNTUsICAgIDY0MywgICAxMDExLCAgLTIyOTYsICAtMTc5OSwgIC0xODk1LCAgLTE3MDAsCisgIDI3NDMsICAgLTkyNCwgICAtMjU0LCAgICAgMzIsICAgMTUwNCwgICAxOTEwLCAgLTI4MTEsICAgIDg5OCwKKyAtMjM2MywgIC0yNTE4LCAgLTI0MDgsICAtMTczNywgICAtOTM2LCAgICAyMjEsICAgMjU4OCwgICAyNTI3LAorIC0yNTM1LCAgLTIzNjAsICAtMjQ3NywgIC0xODYxLCAgLTE4ODIsICAgMTgzMywgICAzNTg3LCAgIDEzMDcsCisgIDIxNDEsICAgMjI3NCwgICAtNDMzLCAgLTE5OTQsICAtMTY5MiwgIC0xMzE4LCAgLTEzOTgsICAgLTM1MCwKKyAgMTUxOCwgICAxOTIzLCAgICA4MzUsICAgMTI2MiwgIC0yMjQ2LCAgIDMzODMsICAgMjQ1OCwgIC0xNDY0LAorIC0xODc0LCAgIC05ODMsICAgLTE1NywgICAgNTMxLCAgIDE0OTAsICAgMTcyOSwgICA5NTQzLCAgLTE3MTMsCisgLTIwMTEsICAtMjAxNSwgIC0xODcwLCAgIC05NjksICAgIC0zNCwgICAxMTYwLCAgIDE3MjQsICAgMTkxOSwKKyAtMjUzMCwgICAgMTQwLCAgLTE5MjMsICAtMTczMCwgIC0xNzIwLCAgIC02MDUsICAgIDYyOSwgICAxNTc3LAorICAgOTc0LCAgIDEzNzMsICAtMjI2OCwgIC0xNTgyLCAgIC05MzMsICAgMTEyNCwgIC0xNjI0LCAgIC01MTQsCisgIDQxNTYsICAgLTExOCwgICAxNTE1LCAgIDE5MDcsICAtMjI2NywgICAtNTc0LCAgLTEzMTEsICAgLTk1NCwKKyAgIC00NywgIC0xMjU5LCAgICAgMTUsICAgIDM2NCwgICAgODU0LCAgIDEwMDksICAtMjIyMSwgICAgNjI5LAorICAgOTk0LCAgLTE2NDYsICAtMTMyNCwgIC0xNTA5LCAgIDIzNTksICAgMzQ1MywgICAxMzkzLCAgIDE5MTIsCisgIDM1ODYsICAtMjI4NiwgIC0yNTM3LCAgLTI1NjAsICAtMjQxNSwgIC0xNzQ4LCAgIC0zNjgsICAgMzA5MywKKyAgMjg4MSwgICAyNjExLCAgLTI1NTYsICAgMjc5MiwgIC0xNTU4LCAgIDExMTcsICAtMTY4MSwgICAgLTY1LAorICAgLTM2LCAgICA1MTYsICAgMTIzMywgICAxNTE0LCAgICA1MzEsICAtMTgxNCwgICAgOTk4LCAgLTE3OTUsCisgLTE2OTMsICAgLTg3MSwgICAgNzI1LCAgICA4NjgsICAgMTUwNCwgICAxNDY1LCAgICA5MDcsICAgIDMwMCwKKyAtMjA2MCwgIC0yMzY2LCAgLTIzOTIsICAtMTg4MSwgICAtNTk2LCAgIDE3NTQsICAgMjE2OSwgICAyMTA0LAorIC0yNzU1LCAgIDI3MDksICAtMjI5OCwgIC0yNjI3LCAgLTI0MjMsICAtMTg3NSwgICAtNzMzLCAgIDM4ODYsCisgIDI2NDgsICAgMjgyMSwgICAgNjIzLCAgIC01NDEsICAgLTE2MywgICAtMzE5LCAgICAgODUsICAgICA4NCwKKyAgICAxNSwgICAgNzE2LCAgICA1MTEsICAgIDU3MiwgICAzOTQ4LCAgIDI3NzMsICAtMTUwNCwgIC0xNzQ2LAorIC0xODMyLCAgIC05MzQsICAgIC03OCwgICAgOTg4LCAgIDEyNzcsICAgMTUxOCwgIC0yNjc4LCAgIDIyMTYsCisgLTIxNjIsICAtMjMzMSwgIC0yMDc2LCAgIC05NjgsICAgMzQ0NSwgICAxMDcwLCAgIDIwNzcsICAgMjIwNiwKKyAtMjg5MiwgIC0yNDI1LCAgLTI2NzQsICAtMjkwNSwgIC0yODQ0LCAgLTI1ODQsICAtMTM4MSwgICAzMjY5LAorICAyNjk2LCAgIDMyODEsICAtMjA5MCwgICAtMzY5LCAgLTE1MTUsICAtMTM2NywgICAtMjAwLCAgIDIwODksCisgICA3MzksICAgIDcwMCwgICAgODY2LCAgIDExNjksICAtMjI3NiwgIC0xMDU3LCAgIDI4NTEsICAgMjU4OSwKKyAtMTY4NiwgICAtNTE1LCAgICAtNjUsICAgIDU3OSwgICAxMjc4LCAgIDE1OTMsICAtMjgzNywgIC0yNDU4LAorIC0yNTY1LCAgLTI3ODMsICAtMjg0MywgIC0yNDY4LCAgLTE3MDQsICAtMTUzMSwgICAxNDc1LCAgIDQxNTMsCisgLTIyMDksICAtMTg1NywgIC0xODczLCAgLTIxNzcsICAgIDc1OCwgIC0xNTMxLCAgIDMyMDcsICAgMTE2MywKKyAgMTUwNiwgICAxODUxLCAgLTIzODMsICAtMTY4MywgIC0xODM5LCAgIDU3NzIsICAtMTgxNSwgICAtNDY1LAorICAgMzYxLCAgIDEwODYsICAgMTkxMiwgICAyMTQwLCAgLTI2MjksICAtMTY4OCwgICAxNjA4LCAgLTIxOTAsCisgLTI0MTksICAtMjA2NCwgIC0xMjUzLCAgIDEzOTcsICAgMjA5OSwgICAyMzA2LCAgICA1MTMsICAgMTY2NCwKKyAtMTY4MywgIC0xNjI5LCAgLTE2ODIsICAgLTEwOSwgICAgMjY5LCAgICA2OTUsICAgMTA3MiwgICAxMzE3LAorICAgMjA4LCAgLTE2MDIsICAtMTkxOCwgIC0xMDM4LCAgIC04MTMsICAgIDMxMiwgICAgIDI0LCAgICAgMjYsCisgICA3NjEsICAgIDk5MCwgIC0yMjg4LCAgLTIyMjUsICAtMTk0OCwgIC0xOTMyLCAgLTE4MzIsICAgLTk0OSwKKyAgLTQ1MCwgICAgOTIwLCAgICA4MDUsICAgMTQ2OCwgIC0yODk3LCAgLTI2MzMsICAtMjU1NywgICAgNDY0LAorIC0yMTc0LCAgLTExNTcsICAgMTE3MCwgICAyMjMwLCAgIDI1NTAsICAgMjUyMiwgIC0yNjQzLCAgLTE5MjgsCisgLTIyNTUsICAtMjU3OCwgICAgIDgyLCAgLTIyMDYsICAgIC02MywgICAyNjYzLCAgIDIwMDcsICAgMjI5MiwKKyAgIDIyNiwgIC0yNTQxLCAgLTI2ODcsICAtMjc1MywgIC0yMjI5LCAgLTE1NTYsICAgIDc4NSwgICAzODM3LAorICAyMzMxLCAgIDI0OTIsICAtMjQ5NiwgIC0xNzQwLCAgLTI0NjUsICAtMjI5NSwgIC0yMTUxLCAgIDExNDIsCisgICAzNjMsICAgMzk2NywgICAxOTQzLCAgIDI0MzIsICAtMjYxOSwgIC0yNDAwLCAgICA1MjAsICAtMjI3NCwKKyAtMTkwMCwgIC0xNDg2LCAgIDIxMzUsICAgMTQwNywgICAyMzAwLCAgIDIyODgsICAtMjgxMSwgIC0zMDY2LAorIC0zMTI4LCAgLTMwOTgsICAtMjUyOSwgIC0xNDc1LCAgIDIxNzIsICAgMzQxMywgICAzNjEzLCAgIDM1NzEsCisgICA1NjQsICAtMjM0NywgIC0yMjU3LCAgLTIzNzcsICAtMTk0NCwgIC0xNzcxLCAgIC01ODIsICAgIDUwOSwKKyAgMTY4MywgICAxOTc1LCAgIC0yODUsICAtMjEzNiwgIC0yNTI5LCAgLTI0NjQsICAtMjExNywgICAgMjc4LAorICAxMDk0LCAgIDEwNDIsICAgMjE5MiwgICAxOTc2LCAgIDE3ODEsICAtMTg3NCwgIC0yMDQyLCAgLTIxMDMsCisgLTE3NDQsICAtMTA0NCwgICAzMzczLCAgIDEyNTIsICAgMTg2MSwgICAxODczLCAgLTI2ODgsICAtMTg0OSwKKyAtMjQ2MiwgIC0yNDk0LCAgLTIxMDUsICAtMTkwMywgICAyMjIxLCAgICAyNTAsICAgMTY1MywgICAyMjMzCit9LAorCisuZmNiNDRtID0geworIDEzMTUxLCAgLTE3NjMsICAtMjU4MywgIC0yNTE4LCAgLTIxODEsICAtMTAzNiwgICAtNTM3LCAgIC0xMTIsCisgICAyMTQsICAgIDU5MCwgICAtNjA4LCAgLTIyNzAsICAtMjIyOCwgIC0xMzAxLCAgLTEwMTgsICAgMzY4NywKKyAgLTQ3MSwgICAtMjgyLCAgICA5MDksICAgMTY2NSwgIC0yNDI2LCAgIDE3MTMsICAgLTgwOCwgIC0xMjQwLAorIC0xMzY2LCAgIC05NzYsICAgLTE0MCwgICAxNzMwLCAgICA2ODMsICAgIDE5MSwgICA3MjUzLCAgLTIwNzYsCisgLTI3MzMsICAtMjY5OCwgIC0yMjUzLCAgLTExMTYsICAgIDM3NiwgICAgNjg3LCAgIDEzMTQsICAgMTUzMiwKKyAgLTgyMCwgIC0xNDcxLCAgLTIwOTIsICAtMjA0NywgIC0xNzk2LCAgLTEzNDcsICAgLTczMiwgICA2MzQ4LAorICAyNTI5LCAgIDE0NDEsICAtMTQ2MCwgIC0xODQ1LCAgLTEwNDYsICAtMTY0MywgICA4MDg2LCAgIC05MjgsCisgICAgOTAsICAgIDY2MCwgICAgNDI4LCAgIC0xODgsICAgIDYwNCwgIC0yMDIyLCAgICA1NTYsICAtMTY4MCwKKyAtMTY0MSwgICAtOTAyLCAgICA4MzQsICAgIDk0MSwgICAxNDgwLCAgIDE5MDYsICAtMjQzOSwgIC0yNTczLAorIC0zMDkxLCAgLTI4NTMsICAtMjQxOSwgIC0xNjA2LCAgIDIzMTIsICAgMjYyNCwgICAyNjU5LCAgIDI2NTksCisgLTEyODYsICAtMjI3MywgIC0yNDAwLCAgLTE4MjYsICAgMjQ0MywgIC0xMzkxLCAgICA2ODUsICAgMTgyMiwKKyAgMTgxMCwgICAxNjI1LCAgLTE5OTMsICAgLTczMSwgICA5NzM3LCAgLTE0NzYsICAtMTE4MywgIC0xMjQ0LAorICAgIDM0LCAgICAtODUsICAgICAgMCwgICAgMjAxLCAgIDQxNzEsICAtMjQzMCwgIC0yODY5LCAgLTI4NjYsCisgLTI0ODgsICAtMTE1NCwgIC0xMjUzLCAgICAyODIsICAgMjcxNSwgICAzNjQzLCAgLTIxMzAsICAtMjUyMiwKKyAtMzI1OSwgIC0zMDUxLCAgLTI5NzcsICAtMjIwNCwgIC0xMjY0LCAgIDExMDMsICAgNzExMywgICA3OTQ4LAorIC0xMjcxLCAgLTE2OTQsICAtMjAxMSwgIC0xMjk0LCAgLTE2MDcsICAgIDI0NywgICAtMzAzLCAgICA3MTUsCisgIDQyNzYsICAgMTkwOCwgIC0yMzM3LCAgLTIxMTEsICAtMjIzMiwgIC0yMTIzLCAgLTE2NDgsICAtMTMwMiwKKyAgNzY4NiwgICAxMjEzLCAgICA5ODIsICAgIDk4NCwgIC0yNTk0LCAgLTIxMjcsICAtMTk4MSwgIC0yMTA0LAorIC0yNDA1LCAgLTE5NjYsICAgLTkzNiwgICAgLTk1LCAgICAzMjYsICAgIDY3MiwgIC0yMjYzLCAgIC04OTMsCisgLTEzNjcsICAgMTI4OCwgIC0xMzIxLCAgLTEzNTEsICAgMjUwMywgICAgNzQ3LCAgICAzOTAsICAgLTI0NywKKyAtMjIyMCwgICAtODYwLCAgIDM2NDEsICAgMzc2NiwgIC0xNzI0LCAgLTE0ODcsICAgLTUzMSwgICAgMjM5LAorICAgMTM0LCAgICAtODIsICAtMjU2MywgIC0xNTM3LCAgIDM4ODMsICAtMTkxMSwgIC0yMTA5LCAgLTE3MTMsCisgIDEwNTYsICAgIDcyNiwgICAgOTc3LCAgIDEwOTEsICAtMTg3NCwgIC0xMzY2LCAgLTE2MjgsICAxMTA2OSwKKyAtMTY1MywgICAtNjk2LCAgICAxMTgsICAgIC03OCwgICAgMzM3LCAgICAgMjksICAgMjQ0OSwgIC0xNDM4LAorICAtNjAxLCAgLTE1MzMsICAgLTgxNiwgICAxMjYyLCAgICA1NDAsICAgICA3OSwgICAtNDYwLCAgLTE0MDMsCisgIDMyMDQsICAtMTkxOCwgIC0xODkyLCAgLTE5MTEsICAtMTQ2OCwgICAtOTc2LCAgICAtNDIsICAgMjc4NSwKKyAgMTA4OCwgICAgNTY0LCAgIC0yMzYsICAtMjI2NywgIC0yMzI0LCAgLTIxMzAsICAtMTg4MCwgICAtNDI3LAorICAtMjU4LCAgIC01NDMsICAgIDkwMywgICA1MTQyLCAgLTE3OTEsICAtMTYxMSwgIC0xMDczLCAgIDI5MTEsCisgIDI5OTMsICAtMTI5NSwgICAtNDAwLCAgICAyMjksICAgIDE5MiwgICAgLTg1LCAgIDQ0NjEsICAtMTcxMSwKKyAtMTQzMSwgIC0xNjQwLCAgIDM1MjUsICAtMTM5OCwgICAtMTAxLCAgIC0yMTksICAgIDMyNywgICAgNDE1LAorICAtNjY5LCAgLTE1MjAsICAgNjU5NSwgIC0xMjkxLCAgIDUxMjMsICAgIDE1NSwgICAtNDgwLCAgIC01MTgsCisgIC01NTIsICAgLTg5MCwgIC0yNjA5LCAgIDcwNzQsICAgMzIyMCwgIC0xMDU0LCAgLTE4NTIsICAtMTE2NSwKKyAgIC0yNSwgICAgIDg5LCAgIC0zNjEsICAgLTE0MCwgIC0xNjEwLCAgIDIyMTQsICAgMjkwMywgIC0xNzM3LAorIC0xNzA0LCAgLTExNzgsICAgLTcwOCwgICAtMTcxLCAgICAxNzcsICAgIDY3NCwgIC0xMDc1LCAgIC04OTAsCisgICAgODIsICAgIDQ2MywgIC0xNDMyLCAgLTEwNDgsICAgLTcwMywgICAtNzU5LCAgIC0yNDcsICAgIDM0NCwKKyAgMjQ0OCwgICAtNjU2LCAgLTExMzUsICAgNDM2NiwgICAtNTgzLCAgIC03MDUsICAgICA0MCwgICAtMzE0LAorICAtNjc2LCAgLTEyNzEsICAgNDM4OSwgICAtOTUyLCAgIDMyNDksICAtMTYwNiwgIC0xNTI0LCAgLTExNzIsCisgIC00OTAsICAgICA5NywgICAgMTI4LCAgICAtOTEsICAgIC02NiwgIC0xMjkzLCAgIDE2OTYsICAtMTExNCwKKyAtMTQ1NSwgICAtNTE5LCAgIDI2MjAsICAgIDQ3OSwgICAtMjU3LCAgLTE1MTIsICAtMjAzNywgIC0xMjgxLAorICAxNzUyLCAgLTEyODUsICAtMTgxMiwgICAyNzg5LCAgICAtNTIsICAgIDY3NiwgICAgNDA5LCAgICAyOTYsCisgLTE5NzcsICAtMTA0MywgICAgMjcwLCAgLTE2MTUsICAgMjEzMSwgIC0xMDUxLCAgIC0xNjEsICAgLTQ5OCwKKyAgIDc2NywgICAxNjczLCAgIDEwNDQsICAgICAyNywgIC0xMTA3LCAgLTE3MzAsICAtMTg1NiwgIC0xMjY0LAorICAtMjc1LCAgIC0xNjcsICAgIDg5MywgICAgNDQzLCAgIDM4NTAsICAgICA5NywgIC0xMjQ0LCAgLTE2OTEsCisgLTE1NjYsICAtMTA4OCwgIC0xMDYyLCAgIC04MzcsICAgLTE1OSwgICAxODMwLCAgLTE0MjQsICAgMjQ5NCwKKyAtMTg3OCwgIC0xNTMyLCAgLTE5OTEsICAgMjkxOSwgICAgIDYyLCAgICAzOTksICAgIDUyNCwgICAgMzgxLAorIC0xMzQwLCAgLTI0MTUsICAtMjAyOCwgICAgMjE4LCAgLTEzNDIsICAgIDQxMCwgICAgODE1LCAgICA1MzMsCisgICA5NDgsICAgMTk5OCwgIC0xMjEzLCAgLTE4NDcsICAgMzY5MSwgIC0yMTIzLCAgIDE4MjIsICAtMTU0OCwKKyAgIDUzNywgICAgOTg3LCAgICAzNTYsICAgIDEyMywgICAzODc2LCAgLTI0NzYsICAtMjAyMSwgIC0yMTk1LAorIC0xNTYyLCAgIC03MzcsICAgMjI1MCwgICAgNzA5LCAgICA3OTcsICAgMTEwMiwgICAyMDY1LCAgLTIyNTgsCisgLTIzOTQsICAtMTgxNiwgIC0xNTM2LCAgIDEwNTksICAgNDY1MywgICAxNDU3LCAgICA0NTYsICAgIC0yNywKKyAtMjIyNiwgICAtNzM2LCAgICA3NjUsICAtMTg3OSwgIC0yMTg4LCAgLTE3OTMsICAgLTkyOCwgICAgODkyLAorICAxNzkzLCAgIDIyNTcsICAtMTE4MiwgIC0xNjQ2LCAgLTE3ODksICAgNjEwNSwgIC0xOTM2LCAgIDQzMTYsCisgIC0zMDcsICAgLTE0MywgICAgMjIzLCAgICAyMzYsICAtMjIxMywgIC0xODYyLCAgLTE4MjMsICAgMzMyNiwKKyAtMTgxMCwgIC0xMzg0LCAgIC00NTMsICAgMTAwNywgICAxMzMxLCAgIDE0MDUsICAgNDEzNSwgIC0yMjk4LAorIC0xNjU3LCAgIDE5ODEsICAtMTcwMiwgICAtODUzLCAgIC0zMTgsICAgIDI5OCwgICAgNzYwLCAgIDEwMjUsCisgLTI1MzcsICAtMjc4MiwgIC0yOTg1LCAgLTI2ODcsICAtMjgzOSwgICA0NDkzLCAgIC00NDgsICAgNDI0OSwKKyAgMzA0OCwgICAyNjc4LCAgIDEwNDUsICAgMzIyNywgICAtNjkwLCAgLTEzOTAsICAgLTk3NiwgICAtNjUyLAorICAgNTg3LCAgICAxOTQsICAgLTc0OSwgIC0xMzU4LCAgIC03MzAsICAgIDI1MCwgIC0yNDA0LCAgLTI1NDgsCisgLTIxNTcsICAtMTAyNywgICAgIDMyLCAgIDIwOTEsICAgMTA1OSwgICAxMzYwLCAgICAyNjIsICAtMjEzNSwKKyAtMjA2MSwgIC0xNzc3LCAgLTE2MTQsICAgLTI0NiwgICAyMDA0LCAgIDI2MDUsICAgMTUxNiwgICAtOTQ4LAorIC0xMDYwLCAgLTEwNzYsICAtMTY0MywgICAtNzQ4LCAgICAxNDQsICAgMTU5NSwgICAxNzMwLCAgICA1MzEsCisgLTEwODYsICAtMjE4MiwgICAtNDgzLCAgLTIxOTEsICAtMjQxMSwgIC0xOTgzLCAgLTIzNDUsICAxMDA1MSwKKyAgLTg0MSwgICAxNDU2LCAgICA5MjQsICAgIDIwNywgICA0NjUyLCAgLTE4MzEsICAtMjAyNiwgIC0xNzEwLAorIC0yMjM1LCAgIDQwMzYsICAgLTc1NSwgICAgLTcwLCAgICA1MzMsICAgIDg4NywgIC0xODk5LCAgLTIzMjYsCisgLTIxMjksICAtMjExNSwgIC0xNjA2LCAgIDE0NDMsICAgMjU1NywgICAgOTQxLCAgICA2MTgsICAgIDUyNywKKyAgIDk0OSwgIC0xNTQ3LCAgLTIwNjcsICAtMTc4NSwgICAgNDU1LCAgICAtNjAsICAgICA3OSwgICAgMjAyLAorICAgOTEyLCAgICA5NTQsICAtMjUyNywgIDE0NTUxLCAgLTE4OTMsICAtMjMxNSwgIC0yNjA5LCAgLTE4NDQsCisgICA0OTcsICAgIDI4NywgICAtMTk3LCAgICA2MjYsICAgNjgzOSwgICAtODA0LCAgLTEyOTksICAtMTI1OSwKKyAtMTEwOSwgICAgLTk3LCAgICA5NzYsICAgIDE0NCwgICAtMzQzLCAgLTEzNzUsICAtMjMzNCwgICAzNzQwLAorIC0xMDQ5LCAgIDI5ODAsICAtMTczOSwgICAtNDc0LCAgICAyMjMsICAgIDEzNywgICAgMTU1LCAgIC0xNzEsCisgIDI5NjIsICAgMTgxNCwgIC0yMzc4LCAgLTI2NDMsICAtMjI0OSwgIC0xMTA5LCAgICA4NTgsICAgIDY0MywKKyAgMTYzMCwgICAxMzk5LCAgLTIwOTgsICAgIDk3NCwgIC0xNzE4LCAgLTIxOTMsICAtMjE0NiwgIC0xNDg4LAorICAzMzUzLCAgIC0xNDcsICAgMTE4NywgICAxMjY2LCAgIDE1NTksICAtMjUzMiwgIC0yOTQxLCAgLTI3NTksCisgLTIxMDEsICAtMTA5OCwgICAxNTYyLCAgIDEwNDksICAgMjA0NSwgICAyMTU5LCAgLTIyOTgsICAgNzQzOSwKKyAtMjEyOSwgIC0yMzYxLCAgLTIzMTgsICAtMTU1MiwgICAtNDIyLCAgICA0ODIsICAgIDk4NSwgICAxMTExLAorICA2MDUwLCAgIDU2NTcsICAtMTY5OCwgIC0yMjY3LCAgLTIxMjcsICAtMTEzNSwgICAtMTQwLCAgIC0yODYsCisgIC0zNTIsICAgLTEyNCwgIC0xMjMwLCAgIDM0OTIsICAtMTM3MCwgIC0xMjIxLCAgIDI5NTgsICAtMTIzOSwKKyAgLTQ3MiwgICAtNzIyLCAgIC0xNjksICAgIC04OSwgIC0yMzEwLCAgIDI5ODgsICAtMjM2NywgIC0yNDIxLAorIC0yNTg5LCAgLTIwMzQsICAgLTY2MiwgICAgNDIxLCAgIDE4NjMsICAgMjczNiwgIC0yNjEyLCAgIDU0MjksCisgLTIxMDQsICAtMjI1NywgIC0yNDQwLCAgLTE4MTcsICAgNDgxOSwgICAgODgzLCAgICA2MjIsICAgIDYzNgorfSwKKworLmZjYjQ0cyA9IHsKKyAxMTIzOSwgICAtMzI4LCAgLTIwMTEsICAtMTcxMywgIC0xNjYyLCAgLTEyOTAsICAtMTIyNSwgIC0xNTIwLAorIC0xNTQxLCAgIC05MTIsICAgIDQwMCwgIC0xMTAzLCAgLTI2OTgsICAgLTE2MiwgICAgMjYzLCAgIC05NjQsCisgICA2NjgsICAgIDQwNSwgICAgNzMyLCAgIDI0OTMsICAtMjQ5MSwgICAxMDAwLCAgLTI5MTAsICAgLTc5MywKKyAtMTM1MSwgICAtNTE1LCAgIDEwNTEsICAgMjAwMiwgICAxNzU3LCAgIDIxNTAsICAtMjAxMCwgIC0yMDIxLAorIC0yMjU0LCAgLTE4OTYsICAtMTk1MywgICAgNjY0LCAgIDcwNjcsICAgMjYzMiwgICAgNTMxLCAgLTEzNjcsCisgLTIyMjgsICAgMjExMywgIC0yMDE5LCAgIDIzMDksICAtMTQ1OCwgICAtNDI2LCAgIDEyNDIsICAgIDMzOCwKKyAgIDIwNSwgICAtMjIyLCAgLTEzMTcsICAtMTgwNiwgIC0yNDc3LCAgLTI0MjcsICAtMjQ3NywgIC0xODUyLAorIC0xNDcyLCAgIC05MTEsICAgMjI2MSwgIDEwMjgwLCAgLTIzNjksICAgIDM4MiwgICAzMTgwLCAgLTEyMTAsCisgLTE2MDEsICAgLTc0OCwgICAtNzMyLCAgICA1MDQsICAgMTQ0MCwgICAxMTQyLCAgICAtMTMsICAgIDYxMCwKKyAtMjQ1NywgICAtNzM5LCAgLTEzMTgsICAtMTAxMywgICAgLTUyLCAgIC00NzAsICAgIDYyNywgICA0NzM0LAorICAxMjQ4LCAgIDI5NDcsICAgLTYzMSwgICAxNTYwLCAgIDIwOTYsICAgLTgzMywgIC0xMTczLCAgLTE0NzUsCisgLTIwNjAsICAtMjE4OSwgICAgOTY3LCAgLTE0NTEsICAtMTU0NCwgICAtNzU4LCAgIC01MzgsICAgIC0zMSwKKyAgMTM5NSwgICAzNTUwLCAgICAgLTMsICAtMTk5OSwgIC0xOTc1LCAgLTE3MzQsICAtMjY4MCwgIC0yNTEyLAorIC0yMDM3LCAgLTEzMDYsICAgLTI1MiwgICAxMjg4LCAgIDYwMTIsICAgNDgzNCwgIC0xMDg3LCAgIDMyNTksCisgIDMxMTUsICAtMTM2OSwgIC0xMTM2LCAgIC05NDgsICAgLTI2NCwgICAtNTgyLCAgIC02NzcsICAgLTY0MywKKyAtMjUwMCwgICAxMjg0LCAgIC0zMTcsICAtMTg3MiwgIC0xMTUwLCAgLTExNTAsICAgIDMxMCwgICAgODMyLAorICAxNTk3LCAgIDI4NDIsICAgNjI5NSwgICAzODA2LCAgIC02NzEsICAtMTUzNiwgIC0xNDYwLCAgLTEyNTYsCisgLTEyMjMsICAtMTUwNCwgIC0xNjcyLCAgLTE0NzEsICAgMTM1OCwgICAxMDA0LCAgLTE4OTMsICAgMTExNCwKKyAtMTY0MywgICAtMTAzLCAgIC01MTMsICAgIDE4OSwgICAgMzAzLCAgICAxNDAsICAtMTYxOCwgICAtNjQ4LAorICAtNzIwLCAgIDcyNzQsICAgIDU3MywgICAtMTgwLCAgIC03MzEsICAtMTIyNiwgIC0xNTY0LCAgLTE3NDIsCisgICAxNTEsICAgMjEwMywgIC0xNTYyLCAgIC05NzQsICAgICA5NCwgICAgNTQ2LCAgIDM1MzYsICAgLTIwNSwKKyAtMTY1NywgIC0yNTM0LCAgLTIxODcsICAgMjg0MCwgIC0xMjQ4LCAgICA0NTEsICAgMjYxNSwgICAgMTcxLAorICAgNDc5LCAgIC0zMDUsICAtMTI5OSwgIC0xNzA4LCAgLTIxNDQsICAtMTU5MywgIC0xMjg5LCAgIDI3NjYsCisgIDIyODcsICAgLTQwMCwgICAgMTg4LCAgICAtNTEsICAgIDE0MSwgICAgMTA1LCAgLTIxMjgsICAgNDk3NiwKKyAtMTY5MCwgIC0xMjE2LCAgLTExNzUsICAgIDI5NywgICAxNDU0LCAgICA0NDksICAgLTQ3OCwgICAtOTcwLAorIC0xOTE0LCAgLTE0NTksICAgMzAzNiwgICAyNjY4LCAgIC05NTAsICAgLTYzNCwgICAtNTA3LCAgIC0zNzQsCisgICAgIDQsICAgICAzNCwgIC0xNjY0LCAgIDI5MDEsICAgIDg0NywgICAyODE3LCAgLTExNTQsICAtMTY1MSwKKyAtMTI2MiwgIC0xMTYwLCAgIC02MjQsICAgIDYyOSwgICAxNTc4LCAgICA3NjUsICAtMjAwMiwgIC0yMTIxLAorIC0xNTI3LCAgIDE5MzgsICAgLTI3MiwgICAgMTEzLCAgICAyODcsICAgIDk1NSwgIC0xNDczLCAgICAgNjAsCisgIDgwNDcsICAgIDEzNywgICAtNTM0LCAgIC04NDEsICAtMTA3NywgIC0xNTA0LCAgLTE3ODgsICAtMTc1OCwKKyAtMTg3MSwgICAgMTE5LCAgICA5MzEsICAgMTc3NSwgICAtNzA0LCAgIDI3OTIsICAgIDM1NCwgICAtNTAxLAorIC0xMzcwLCAgLTIwMzgsICAtMTAzMSwgIC0xNjMxLCAgLTE5MTQsICAgLTg3OSwgICAgMzc3LCAgIDc1ODksCisgICAxNzMsICAgLTE5NiwgICAtNDkxLCAgLTE2NTgsICAgMzc5MCwgICAtNzczLCAgLTE3MzEsICAgMzAyOCwKKyAgICA0OSwgIC0xMDEzLCAgIC01NjMsICAtMTIzMiwgICAtOTUzLCAgIC03MzAsICAtMjU2OCwgIC0xOTI2LAorICAtNjc5LCAgIC0yNjcsICAgLTMyNCwgICAtOTYyLCAgICAgNTEsICAgIDQ2MSwgICAyNzI4LCAgIDM2MzEsCisgIDM1MzMsICAtMTY5MCwgIC0yODQ2LCAgLTIzNzAsICAtMTk0NSwgICAtOTE3LCAgIC01NTEsICAgIDI3NiwKKyAgMjYzNCwgICAzNTU4LCAgLTI1OTIsICAtMTc1MCwgIC0yNDIyLCAgLTE1ODYsICAtMTIwNCwgIC0xMDAxLAorICA0NjAzLCAgIDE4MDIsICAgMjY3MywgICAxNjg1LCAgIDI3MTAsICAgLTg1MywgIC0yMzIxLCAgLTE5MTksCisgLTE2MDMsICAgLTg2OCwgICAzNzA2LCAgICAyOTAsICAgIDU3MCwgICAgMzM4LCAgLTIyNDUsICAtMTcwNCwKKyAtMTkxNSwgICAgNTQ1LCAgIC03ODcsICAgMTYzNSwgICAxNzI1LCAgICA1MjYsICAgIDY2NiwgICAxNjA0LAorICAgNjQyLCAgLTExNTQsICAgMzIzMSwgIC0xMjMyLCAgLTE3NzIsICAgLTYyMywgICAgMjE3LCAgICAgMjcsCisgICAgIDMsICAgIDY0MSwgIC0yNDExLCAgIDE5MjQsICAgLTk2NywgIC0xNTgzLCAgLTE0OTksICAgMjMxNiwKKyAgMTM1NCwgICAtMTE1LCAgICAzMzMsICAgIDU1OSwgIC0xNzIxLCAgIDI0NzUsICAtMTk0MiwgIC0yMTE0LAorIC0xMTk2LCAgIC01NzEsICAgMTc2OSwgICAyMzUwLCAgIDEzMTUsICAgLTYwNywgICA0NTEwLCAgLTE0MTQsCisgLTIyMjgsICAtMTMxMiwgICAxNDM5LCAgICA0NjksICAgLTI0OCwgICAtMzk5LCAgIC0yNzAsICAgLTcyMSwKKyAtMTUxNywgIC0xMjQ3LCAgIC03NzEsICAgIC0zNiwgICA2NDg4LCAgICA5NDIsICAgLTI3OSwgICAtNTcyLAorIC0xMDQxLCAgLTE5MDgsICAtMjM4OCwgIC0yMjgxLCAgLTI1OTUsICAtMjI3NSwgIC0xNTI5LCAgICAgNTEsCisgICA0NzEsICAgNDQzNSwgICAzMDAyLCAgIDI3MzgsICAgNDA0OSwgICAxNTYyLCAgLTI3MDYsICAtMTY3MiwKKyAtMTY0OSwgIC0xMjA0LCAgIC01MTgsICAgLTI4MCwgICAgNzc0LCAgIDEzNDQsICAgICAgNiwgIC0xOTUwLAorIC0xNTIxLCAgLTE3NjgsICAgLTk3MiwgICAxNDIwLCAgIDMwMTEsICAgLTE5MSwgICAgNjQ0LCAgIDE0NzgsCisgIDMyMjAsICAgLTMxMywgICAzMDMwLCAgIC0xNTMsICAgLTg0MSwgICAtNzM5LCAgIC0zNzgsICAtMTAxMywKKyAtMTQxMCwgIC0xODE1LCAgLTIxMDQsICAtMTAzMywgIC0yMDk3LCAgLTE5OTIsICAgLTk0MywgICAyMzkxLAorICAgNDI0LCAgICAzNjksICAgMTYwMSwgICAzMzMxLCAgIDE0OTQsICAtMjA2MCwgIC0yMDI3LCAgIDE1NzksCisgLTE0MDcsICAgMTEyMCwgICAtMjgwLCAgIC0xOTcsICAgIDc2MSwgICAxMDQ4LCAgIC03MTAsICAgNDA5NCwKKyAtMTUzMywgIC0xOTg0LCAgLTE2MjAsICAtMTEzMiwgICAtNTE1LCAgIC00ODUsICAgIDk3MSwgICAyNjQ0LAorICAzOTc5LCAgIC02NjEsICAtMTg5MSwgIC0xMTIwLCAgIC04OTcsICAgMjQ4NCwgICAxNjIzLCAgICAgMjEsCisgLTE1MzQsICAtMjQzOCwgICAzMjAxLCAgLTE1MTAsICAgIDg1OCwgIC0xNDU5LCAgIC03MTEsICAtMTMzMiwKKyAgLTgzMywgICAtMjQwLCAgICA3NjMsICAgMTA5NiwgIC0xNDM1LCAgICAtMjksICAgMzE3NCwgIC0xNzczLAorICAgLTE5LCAgICA3MDgsICAgMTY4MCwgICAgNDAzLCAgIC05MTAsICAtMjIyNCwgIC0yNjcwLCAgIC02MTksCisgIDEzMjAsICAgLTc1MSwgIC0xMzIzLCAgLTEwMjIsICAgMjg3NSwgICAxMDgwLCAgICA5ODUsICAgICAgMSwKKyAgIDE5MSwgICA3ODIzLCAgIC00NzUsICAgLTYwNCwgIC0xMTI2LCAgIC05NjcsICAtMTEzOSwgIC0xNjAwLAorIC0xNzY3LCAgLTExNjEsICAtMTM0MiwgIC0xOTYwLCAgLTIxMTIsICAtMTc5MywgIC0xNTk2LCAgIDMxMDMsCisgICA1MzUsICAgMjAwMSwgICAzMjM1LCAgICAxNTEsICAtMjI2NiwgICAtODA3LCAgLTE5NzcsICAtMTY2MSwKKyAtMTI1NSwgICAyMzI4LCAgIDI2MzIsICAgMzE4OSwgICAgNjIxLCAgLTExMzAsICAtMjE4MywgIC0xMTI3LAorICAyMzkxLCAgIC04ODQsICAgMjE3MywgICAtNjkwLCAgIC0zNTQsICAgLTUxNiwgICAgMzUyLCAgICA5NTQsCisgIDE4NDcsICAgIC03NCwgIC0xMjYwLCAgLTE4MzksICAgMjU1NywgIC0xMjIxLCAgICAyMjgsICAgLTYzMCwKKyAgLTE2MiwgICAgMzg2LCAgIDE0NjIsICAtMTg4OSwgIC0yNTk2LCAgLTIyMTYsICAtMTg2OSwgICAtNTE4LAorICAxMjgxLCAgIDIzMjksICAgMjY1MywgICAxMTE3LCAgLTE1MzUsICAtMTAzOCwgIC0xNzUyLCAgLTE4NjIsCisgLTE2MzUsICAtMTA2NywgICAgOTk0LCAgIDUyMTIsICAgMjcxOSwgICAtMjY0LCAgLTIwMjEsICAgMTgyNCwKKyAtMjExMCwgICAtNjE5LCAgIDE1MzgsICAgLTM5NywgICAtMzMyLCAgIC0xNTMsICAgIDg2MCwgICAxMjgxLAorICA2NTY4LCAgLTE3OTAsICAtMjQ1OSwgIC0xNzA3LCAgLTE3MDgsICAgLTc5OSwgICAgMjk0LCAgICAgODksCisgICA0NzUsICAgIDk5MiwgIC0xNjY4LCAgLTE4MTksICAtMjAxMCwgIC0xNjIzLCAgIDIwNzksICAgMzI1NSwKKyAgLTM4OCwgICAgNTkxLCAgIDE0NzcsICAgIDU4MSwgIC0xNTQ0LCAgICA0NzYsICAtMTgyNSwgICAtOTU5LAorIC0xMjk2LCAgLTEwMzcsICAgLTQ1MywgICAxMTQ2LCAgIDQ2OTMsICAgIDgzOSwgICAyMDI3LCAgIDMwMjEsCisgLTE3MzEsICAtMTc0NiwgIC0xOTY0LCAgLTExMTUsICAgMTE5NywgICAgMTAyLCAgICAxNjQsICAgLTE2MiwKKyAtMjMwMSwgIC0xMjgxLCAgLTIwMjIsICAgMzk4MywgIC0xMTIyLCAgIC0yODEsICAgICA4NSwgICAgMzUyLAorICAxMDQyLCAgIDE1OTksICAgNjQ2MywgICAgLTkzLCAgLTIwMTAsICAtMTk4OCwgIC0yMjgyLCAgLTIxODksCisgLTE5MTUsICAtMTcyMSwgICAgIDE3LCAgIDQ2OTQsICAgIDQyNCwgICAtOTk4LCAgIC0xMTEsICAtMTk5NSwKKyAtMTI0NiwgIC0xMTc2LCAgICAgNzgsICAgLTExNiwgICAxOTUxLCAgIDMwNTksICAtMTk3NCwgIC0xNzgzLAorIC0yMjQzLCAgLTEyMzgsICAgMzkzNSwgICAtOTI4LCAgICAtMTUsICAgMTI2NSwgICAxNTM2LCAgIDE5MDcKK30sCisKKy5zaGFwZTA4ID0geworICA1Mjc5LCAgIDExMDEsICAxMjk3NCwgICA1NjI0LCAgIDIwMjksICAgMzg1MywgICA1OTE4LCAgIDE1MTYsCisgLTI5MDUsICAgLTIyNCwgICAgLTkyLCAgIC04MTksICAgIDgwMywgICAxMDkxLCAgIDMwOTEsICAtMzM1NSwKKyAgIDE1MiwgIC0xMjE0LCAgLTczMTcsICAgLTczOCwgIC04OTczLCAgICA1NDYsICAxMjAzNSwgICAtOTM3LAorICAyMjE2LCAgIDIxMTMsICAgMTIxNCwgIC02NTc3LCAgIDIwMDYsICAtMTY2MSwgICAtNjczLCAgLTU4ODAsCisgICA0OTYsICAgIDQ1NCwgICAzNDAwLCAgICA2NzYsICAgLTMyMiwgIDExMzg4LCAgICA2MzQsICAtMTE2OSwKKyAxMjU1NiwgIC01ODA0LCAgLTc3MjQsICAgIDU4OCwgIC02ODAxLCAgIDEwODAsICAgIDM1NCwgIC0xNjgxLAorICAtOTQyLCAgIDE5MjYsICAgLTQ4NywgICAtNTgwLCAgICAxNTYsICAgICA3OSwgIDE1MjUzLCAgICA2NjcsCisgIDExNTUsICAgIDY1NSwgICAtNzE5LCAgIDE5OTksICAgLTc4NSwgICAgMjE0LCAgIDI4MjIsICAgMTAyMCwKKyAtMTk2NywgICAgIDczLCAgIC0zODcsICAgLTEzNywgLTE1MjI1LCAgLTE1NTIsICAgLTM1NywgICAyODMwLAorICAyMTQwLCAgIDMwNzAsICAtMjU1MiwgICAyNDEwLCAgIDEyMzAsICAgNDEzMSwgICAgOTk5LCAgICAyNDgsCisgICA1MzEsICAgLTkwOSwgICAzOTQ4LCAgMTI4NTgsICAtODA1NiwgICAyMjA1LCAgLTI4MzcsICAgLTE3MSwKKyAtMTYzMywgICAtMTI5LCAgICAtOTMsICAgMTg1MiwgIC0xOTIwLCAgICAxNTcsICAgOTY0NywgICAgLTg0LAorICAtMTUwLCAgLTEzNjUsICAtMTUyMiwgLTEzMTk3LCAgIDYxNjgsICAtMzE5NSwgICA1ODkwLCAgLTE3MjQsCisgLTY0MDcsICAtMTM0MCwgIC03NDM1LCAgIC02MjEsICAtNTczMiwgIC0yODk1LCAgICAxNDUsICAgMzk3NCwKKyAgIDcyOCwgICA5ODQwLCAgIC00OTQsICAgNzM1NywgICAtMzk0LCAtMTM2MTQsICAgLTI1NiwgIC0xOTMwLAorICAgNDY4LCAgIC0yNjYsICAgODAwMSwgICAtMTUzLCAgIC0zNjUsICAgNzY1MiwgICAgMTM1LCAgIDE0MDAsCisgLTM4NjksICAgMTA5MSwgIC00OTM1LCAgLTI4ODQsICAgMTI1OSwgICA2ODE5LCAgIDEwMjUsICAtNjY2NywKKyAgMTA3OSwgIC05Nzk0LCAgIDY4MjcsICAtNDE2NiwgICAxMTA4LCAgIDExNDksICAxODg2MSwgICAgNTkzLAorICAtMTc3LCAgLTEwNjcsICAgLTY0NCwgIC0yMTY0LCAgIDQ3MjcsICAgICA4NSwgICAtMTAxLCAtMTA4MDUsCisgIC0yNDcsICAgODkxOCwgICAyMjYxLCAgIDU0NzUsICAgIDc1NiwgICAzMDE4LCAgLTY1MzUsICAgMTk0MSwKKyAgIDM1OSwgIC00MjI5LCAgIDEyMDYsICAgIDk1OCwgICAtODc4LCAgICA1NTQsIC0xODc4MCwgICAyMjg5LAorICA0OTA2LCAgLTc0MTIsICAtNzY4NSwgICA3OTMyLCAgICA5NjUsICAgMjQ2MCwgICA0NDIzLCAgIC01NjMsCisgLTM2NjgsICAtMzQ4MiwgICAzMzA3LCAgLTE3MzcsICAgIDk3MSwgIC03NDgwLCAgMTA3NDIsICAgMTk3OCwKKyAgMjM2NSwgICAgIDIwLCAgLTM2MjUsICAgIDQ2NiwgICAyMDU2LCAgLTY2MDIsICAgOTM5NiwgICAzMTQ1LAorICAzMTYyLCAgIDE4NTcsICAgLTYzMCwgIC02OTA1LCAgIDE2NjAsICAtMzAyNCwgIC0yMTU5LCAgIDExMDksCisgIDEyODIsICAgMjc2NywgICAgMjEwLCAgLTIyMDMsICAgMzA5OSwgIC03ODg5LCAgIDE4MDUsIC0xMzExNSwKKyAgIDk4OCwgIC02MjM1LCAgIDE1NjYsICAtMTM5OSwgIC05NjEyLCAgIDE4MjEsICAgLTUxOSwgICAgLTU3LAorICAzNDI4LCAtMTQwMjQsICAgMTE0MSwgIC0yNTQyLCAgLTkzOTYsICAgIC0xNywgICAgNDQwLCAgLTg1OTEsCisgIDIyNzEsICAtNzgxMSwgICAxODkxLCAgIC05MzUsICAtNDMzMCwgIC0xMzAzLCAgICAzNjIsICAgIDQyNiwKKyAgIDMxOSwgICAxMTc2LCAgIDMxNzYsICAgMjIwMiwgLTE0MzA4LCAgIC02MTksICAtMjk0MiwgIC0yMjcxLAorICAtNTMxLCAgIC02NTIsICAgIDM0NSwgIDE3NjgxLCAgIDE0NTMsICAtMTU2MSwgICAgMzQxLCAgLTIwNzcsCisgICA5MzMsICAgIDQzMywgICAxNTI5LCAgICA0NjMsICAtMTA5NSwgICA0OTEyLCAgIC04NDAsICAxNjI2NiwKKyAgIDk3MywgICAxNzMyLCAgIC03MTgsICAgNjcwMiwgIC0zNjU5LCAgIDQwMzcsICAgLTcwNCwgIC0yNzA3LAorICAxNDIzLCAgIDEyOTEsICAgMjMwMCwgICAgMTQ5LCAgIC05MzMsICAtMTMzOCwgICAyMDE5LCAgIDYxNzMsCisgICA0ODEsICAxNDkzNywgICAtMzY0LCAgIDM4OTYsICAgLTQ0MywgICAgOTkyLCAgIC04OTYsICAgIDM3OCwKKyAgLTIyNiwgIC0xNTA1LCAgICAyNjgsICAgLTQyOCwgIC0yNjIyLCAgIC0yODksICAtMjA2OSwgIDEwNDcyLAorIC0zODgwLCAgLTUzMzAsICAgIDM4NSwgICAzMDUzLCAgLTQ2NDIsICAgMTUyNSwgIC0xNTU3LCAgICA3MTYsCisgIDI1MDQsICAgIDg0OCwgICAtNDUwLCAgLTIwMTgsICAgLTQ1OCwgICAtNzA1LCAgLTcxMjAsICAgLTU0MywKKyAtMjEzOCwgICAyNTQ4LCAgIC0zNTEsICAgIDczNywgIDEyOTA2LCAgLTEwMTIsICAgICA2MywgIDE1MzU3LAorICAgMzMyLCAgIC04MzcsICAgLTIyNSwgIC0xMjk5LCAgIDI4NDMsICAgMTMzNCwgICAtNjY5LCAgIDIwODMsCisgIC03MDcsICAgMTE3MSwgICA4MjE5LCAgIDIxOTAsICAxMDU2NywgICAxMzcwLCAgLTEzNzYsICAtMjkxOSwKKyAgMjEwOCwgIDEwMDk4LCAgIC0zODgsICAgNDQ0MiwgICAgMTY0LCAgICA0OTAsICAgNzU4MCwgICAgIDI2LAorIC0xODQ4LCAgLTI5MTksICAgIDY0MCwgICA0NzU4LCAgIC0xMDgsICAgODE5NCwgIC0xMzI1LCAgLTIzMTQsCisgICA0NDcsICAgNTE3OCwgIC0xMDk1LCAgIDk5MDIsICAgLTY5MywgIC0zNjI0LCAgIC0yMjMsICAgIDY5MCwKKyAxMDQ5NSwgICAgNzc2LCAgIC05MTksICAtMTYyMSwgICAyMDQ2LCAgICA0NjksICAgMTQ1NCwgICAzNjgxLAorIC0xMDkwLCAgLTE3NzYsICAgMTQ1NywgICAgMjEyLCAgIDIwNTQsICAgLTk5NCwgICAgNjk4LCAgIC00OTYsCisgMjIzNDcsICAgLTYyMywgICAgMjU0LCAgICA5NjAsICAtNDA3MywgICAgNTMxLCAgLTI1NzIsIC0xNDM5MywKKyAtMTAyMiwgICAgMjU4LCAgLTM2NjcsICAgIDk5NCwgIDE1MjQyLCAgIDUwNzgsICAtMzYxOCwgICAxOTI1LAorIC0xMjI5LCAgLTE3NTQsICAgMTcxNSwgICA0MzU4LCAgIDEyODYsICAtMjM2MCwgIC00NTkwLCAgIDE4MjQsCisgIDc4NjQsICAgMTQyMywgIC0yMTQ2LCAgLTI3NjMsIC0xMDYzNSwgICAgNDc0LCAgIC04MjksICAgMTE1OSwKKyAgLTE1NywgICAgLTU0LCAgIC0xNTgsICAgIC0yOSwgICAgMjAyLCAgIC0zODMsICAgIDI4NSwgICAgIC0yLAorICAgODYyLCAgIC0zNjQsICAgIDQxNSwgICAtMTIzLCAgIC0xNDUsICAtOTczMywgICAxMTY3LCAgMTAxOTksCisgLTE0MDgsICAtMjk5MiwgICAyMTMxLCAgIC00MTIsICAgNDc0MywgICAyOTkyLCAgIDM1NTUsICAgLTYxNywKKyAgOTYwNiwgIC0yODMxLCAgIDIzNTcsICAgNTMwMCwgICAgNjI1LCAgIC02NzgsICAgLTUwMCwgICAtMTI4LAorICAgLTU2LCAgLTYzMjcsICAtMTEyMiwgIC0yNTY3LCAgIDE5MDQsICAtMTgwNCwgICAgNzA5LCAgIDMxOTQsCisgIC0xNDgsICAtMTM3MSwgIC02NTM0LCAgLTE3NDgsICAtMTQ5MCwgIDE0MTU5LCAgIDE0NjYsICAgMTM5NSwKKyAgMTEwMSwgIC0yNzI1LCAgICA1MDMsICAgICA2OCwgIC0xNDg2LCAgICAgIDAsICAgIDIxMSwgIC0xMjE4LAorICAgIC0zLCAgMjA5MjAsICAgMTcwOSwgICAtMjA4LCAgIC04MzksICAgNDU3NCwgIC02MDg0LCAgLTY1NTcsCisgIC0xMDMsICAgLTk4NCwgICAtMzc1LCAgIDg0MDksICAgMTcxNSwgIC0yMTcwLCAgLTUwMDMsICAtMzI5NiwKKyAxMzQ4MiwgICAxMjExLCAgLTQxNTksICAgMzQ5NiwgICAxMDQwLCAgIDY5MjUsICAgIDIxMywgIC0xMzk4LAorICAgNDQxLCAgLTEyMzEsICAgLTgxNCwgICAgODQyLCAgIDE1NzQsICAgMTE0NSwgICAxMzU5LCAgICA0MzcsCisgLTE3NzcsICAyMDU2NiwgICAgMjU5LCAgLTQ1NzMsICAtMTQxMiwgICAtMTU4LCAgMTAxNDQsICAgMTI2OSwKKyAgMTQwNSwgLTEyNjMxLCAgLTExMDQsICAgLTYxNSwgLTE1ODkyLCAgICAzNTUsICAtMzc5NSwgIC0xMTU4LAorICAzMjQxLCAgICAyNTIsICAgIDIzMiwgICAtMTc5LCAgIC02MTcsICAtMjAzOCwgICAgMjg1LCAgLTEwMTQsCisgLTEyNDgsICAgMTgzNSwgIC0xNTU4LCAgIDEyNjYsIC0xMDIwNywgICAgNjI5LCAgIC0zMTIsICAxMTM3NiwKKyAgIDE1NCwgICAtMjg4LCAgIDU5MTUsICAgLTM1MywgICAgIDYwLCAgIDI2OTUsICAgLTg1MywgICAtMTAzLAorIDE1NjU5LCAgIDI0MDMsICAtMTE4NCwgICAgICAzLCAgIDkyMzYsIC0xMDk1MywgICA0NDM0LCAgICA4MjksCisgIDI1NjMsICAgLTE2NCwgICAtODQ4LCAgIC02NDYsICAgNzI0NywgICAgODk1LCAgIDE3MjYsICAgLTc1MiwKKyAgLTk3OSwgICAxMDUzLCAgIC05NzEsICAgIDMxOCwgICAyMTgwLCAgICA5MjcsICAgIDgwNCwgICAtMjYyLAorICAgNDQ2LCAgIDMyNjEsICAtNDkyNiwgIC00NTIzLCAgIDEyNDcsICAgMjAzOSwgIDEyNzcwLCAgLTExOTEsCisgLTEzMTAsICAtNTU3NCwgICA0NzYzLCAgICA2NTcsICAtNDEzOSwgIDEwODIxLCAgIC04MDUsICAtMTEwOSwKKyAtMzE4OSwgIC0xNzIxLCAgICAxNjcsIC0xMDAyMiwgIC0xODc3LCAgIDIxMjMsICAgIDMyOCwgIC03MDQ4LAorIC0yMTMwLCAgIDI0MzEsICAgMTUyMiwgICAzMjA5LCAgLTg0NDgsICAgMTgxMCwgIC01NDEyLCAgIDk4MTUsCisgLTM2NzcsICAgNjU3NSwgIC02MjM3LCAgIC05MjksICAgLTQzNCwgIC0yMzc1LCAtMTM1ODYsICAgMzQ5NywKKyAtMTE0MCwgICAxMjI3LCAgLTYzNTQsICAgLTUwNywgICAgMzI5LCAgLTE2OTAsICAgMTA3OSwgICAtODgwLAorIC0zNzQzLCAgLTQwMjEsICAtNDY0NSwgIC02MDUzLCAgICA5NTgsICAgNDU5NCwgIC0xMTIyLCAtMTE2MjgsCisgIDE1MzcsICAtMzQxOCwgIC0xMjQyLCAgICAxMzMsICAtOTMzNSwgICAxNjExLCAgIC00MzIsICAxMDczMywKKyAgLTg4NSwgICAtNDY4LCAtMTM0NjYsICAgIDY5MCwgICAgMjE0LCAgIDg5NjgsICAgMzQ0MSwgICA1NDUxLAorICAtMjE5LCAgIDU0OTIsICAgLTM3NywgICAgNDA5LCAgIDM4MTIsICAgMjQ1MCwgICAgNTA4LCAgIDY1NDIsCisgIDM4MjQsICAtMzcwNSwgICAtNTE0LCAgLTgyNjIsICAgMTUzNywgICA3OTY5LCAgICA5NDYsICAtMjg2OSwKKyAgODc2MiwgICAgNDE3LCAgIDUwOTQsICAgMjEwNCwgICA2Njk0LCAgIC0zNDIsICAgMTI1OSwgIC00Nzc5LAorIC0xNDQ1LCAgLTE1MTksICAgIDMzMywgICA0Mzg1LCAgICA2NTIsICAgLTM4NiwgICAtNTgwLCAgLTE4OTIsCisgIC04NzMsICAgMTg2MiwgICAyNzA0LCAgMTM4MzcsICAtNTQxNSwgIC0xOTc1LCAgIDU4ODEsICAgNzE1MCwKKyAgODI3MiwgIC02NDEyLCAgICA3MDQsICAgMTg1NCwgICAgMjU3LCAgLTM3NDYsICAtOTc4OSwgIC05NjM0LAorICAtOTI0LCAgIDEzOTMsICAtMzIzNywgICAgMjU5LCAgICAtNTYsICAgNDM5MCwgICA0OTAyLCAgIDExNzIsCisgIDUxMTQsICAtMjYxNiwgIC00NDA5LCAgLTExODAsICAgNDY5MSwgICA3NDAwLCAgIC02MjUsICAgODg3MywKKyAgNjg0NiwgIC0xMjI0LCAgIC0yMTMsICAtNTI5NiwgIC0zNTA0LCAgIC0xNDcsICAxNzgyOCwgIC0xMzQ3LAorICAzMjUxLCAgIDE3MDIsICAgMTQ0MCwgIC0yMzY0LCAgIC00OTEsICAgLTIyNywgICAxNzY1LCAgIC00NDYsCisgLTk3NDYsICAtMjAxOSwgIDExMjg3LCAgIC0xOTUsICAtOTU1OSwgICAtMzEyLCAgICA4ODgsICAgNTc4OSwKKyAtMTc1MywgLTExMDY5LCAgIDI1MzcsICAgLTI2NSwgIC0xNzYyLCAgIC03NzksICAtODUwMSwgICAtMzA4LAorICAgLTg5LCAgIDE5NzMsICAgMzY0MCwgIDE3MzQ0LCAgIDEzMjYsICAgLTY4OSwgICAtMzk4LCAgLTM4MjAsCisgIDIxNjcsICAgIDIyOSwgICAtNjM2LCAgIDIxNDIsICAtNjU4NywgICAtNzUxLCAgMTMyNDMsICAgIDQ2NSwKKyAtNTk0NiwgICAtMjAyLCAgIC05NjgsICAtMTA2MCwgICAtMjQwLCAtMTA2MjYsICAgMzQwNSwgICAxMzAyLAorIC0xMjYzLCAgICA5NzIsICAxMTM1MSwgICAgMTAwLCAgIDIyNjYsICAgLTkzMCwgIC0yMTA4LCAgIDUzNTAsCisgLTMxODYsICAxMTEzMCwgICAyMDczLCAgLTU2MTYsICAgIDY1MCwgICAyMDAwLCAgIDEwNDgsICAgNTYyOCwKKyAgLTUzMSwgICAgNjc0LCAgIDg0NTMsICAgMTAzMCwgICAxMTUyLCAgMTIwOTUsICAgIDM1MiwgICAgNDA5LAorIC0xMDI5LCAgLTEyMzYsICAgLTE5MCwgIC01NzI0LCAgIC01ODksICAgMzU1MCwgICAxOTU4LCAtMTQwODEsCisgIC0zMzksICAgMTY3MiwgIC0xNjU5LCAgIDQ1MTgsICAgIC03NSwgICAtNjM4LCAgIDU1MDEsICAgIDI3NywKKyAgLTU3OCwgIC0yMTg1LCAgICAxNTcsICAgMjA2NiwgICA4NjM0LCAgLTI0MDMsICAgMTYxNywgLTEyNDg3LAorIC0xODgxLCAgIDgyNzMsICAgIDE3OSwgIC0yMTUyLCAgLTEyOTQsICAgLTUxMiwgICAtNDE1LCAgICA0NTYsCisgIC0xNDEsICAgLTEyNSwgICAtNDA1LCAgICAxMzIsICAgICA0OSwgIC0xOTc4LCAtMTkwODUsICAgLTQ1MSwKKyAtMTQ4MCwgICAgMzI0LCAgLTUzOTcsICAgIDIzNSwgIC0xMjE3LCAgICAzNDYsICAtMTI1OCwgICAzNTQwLAorIDEwMDc1LCAgMTAyOTEsICAgNTA2MCwgIC0yMDU3LCAgIDYxNTYsICAgLTk5MiwgICA5MzQ0LCAgLTM3MTgsCisgIDQyOTYsICAgIDg5NSwgIC04NDY0LCAgICAzNDEsICAgMTQyNiwgICAgNjQ4LCAgIDE0OTQsICAgMjg5NSwKKyAtMzc2MCwgIDEwMTM5LCAgMTU1MzEsICAgLTk4NCwgIC0xNTUwLCAgLTEzMTksICAtMTU0MiwgICAtMTE5LAorICAtNTE3LCAgIC0xODUsICAtMzM2OCwgIC05Mjc5LCAgLTM0NTUsICAtNDI1NywgICAxMDkyLCAtMTAxMjAsCisgIDUwNzIsICAgMzA5OSwgICAgOTg2LCAgLTI1NjIsIC0xMjA2OCwgICAxOTMyLCAgIDY0ODksICAgIDk1MCwKKyAtMjQxNywgICAxMzYyLCAgIC01NjcsICAgIDU5MSwgICAtNzE1LCAgIC01MTUsICAgMzUwNiwgICAtNzI2LAorICA2MzE5LCAgICAyMTQsICAgLTM2NCwgICAzNjExLCAgIDE4OTUsICAtMjAwNSwgICAtMjczLCAgIDE1MTMsCisgIDIzNzksICAgIDQ3NSwgIC00ODU1LCAgIC01MjcsIC0xMTQ5MywgICAgIDI3LCAgIDQzNDMsICAtMjM5NCwKKyAgLTYzOSwgICAtNzQ0LCAgLTI2MDEsICAxMDkxNywgICAxOTEwLCAgIDI0NDksICAgMTIzOCwgIC0yMTc1LAorICA1MzIyLCAgLTQwNTQsICAgIC00MCwgICA0Mjc0LCAgICA2ODQsICAgODE1MiwgICAgOTY2LCAgMTA4ODIsCisgICAtMTMsICAgNDI1MywgICAtMjg3LCAgLTMxOTIsICAgIDU0OCwgICAyMDIwLCAgICAxODksICAtNjg5NCwKKyAgIDc5NywgICAyMTYwLCAgICA1NzksICAgNDA4NCwgICAxNzY3LCAgLTQwMTEsICAgLTY0MCwgICA3Njk3LAorICAgNzkxLCAgICA5NDUsICAgMTIzMCwgICA2NDkxLCAgIDE1MDgsICAtMzc2MiwgICAtNDMzLCAgMTEzNDAsCisgIC0xMjksICAtMTEzMSwgIC01MTIxLCAgIDMxNDgsICAgMTU0NCwgIC03NjQ4LCAgIDE4NjYsICAgOTY2MCwKKyAgMjM2NSwgIC0yMTEwLCAgICA3ODIsICAgIC04MiwgICAzNjY2LCAgIC03MDEsICAgIDMwMywgICAgMjk4LAorIC0xOTM0LCAgIC0xMjUsICAtMTQyNywgLTE3NTg5LCAgLTExODgsICAgIDE3NSwgIC03MDQ2LCAgIC00ODgsCisgIDExMjEsICAtNjU5NCwgICAgNDg5LCAgLTE1NTEsICAxNDM0OSwgICAxNDk5LCAgIC01NDQsICAxNzEzMiwKKyAgIDE5OCwgICAyNTE2LCAgIDI0NzksICAgLTk3OCwgICAtMjE0LCAgLTMzOTksICAtMTIyMywgICAyMDk0LAorICAgMTMwLCAgLTEwMjAsICAgMTA0OSwgICAtNzEwLCAgMTI4MDEsICAgLTQ5OCwgICAgMjk3LCAgLTEzNjUsCisgIC0xODcsICAtMzE2OSwgICAtMTIzLCAgIDkwMTksICAgIDk1OCwgICAgMjIxLCAgMTQyMzQsICAgLTU5MCwKKyAgIDk2MSwgICAzMDkyLCAgICAgIDgsICAgIDI1NSwgIC00NTg2LCAgIDE3ODksICAgMjUyMiwgLTEyNTc3LAorICAgLTkxLCAgIC04MjIsICAgLTgwNSwgICAtNzE0LCAgIDUyOTgsICAgMTI5OSwgICAzMzA2LCAgLTEyODgsCisgMTMxNzYsICAgIDIzNSwgICAxNzU0LCAgICAtNjcsICAgMTkxMiwgICAtNjA0LCAgIDMyNDAsICAtMjA0OCwKKyAgLTIwMCwgICAgNzcyLCAgIC0xNzMsICAgLTk5NiwgICAxMzY4LCAgIDIzODAsICAgIDI5NCwgICAgNzYzLAorIDE5NjY1LCAgIC0xOTYsICAgIDUyOCwgICAgMTgyLCAgLTIzOTQsICAgIDkyMywgICAgNzQ5LCAtMTM1NzgsCisgICA4NTUsICAgIDU4OSwgIC05NTUzLCAgICAgIDAsICAgNTczNywgIDEwMzk5LCAgIDkxNDcsICAtMTY1NSwKKyAtMzczNSwgICAxMjQ2LCAgLTI0MjksICAtMTE0NywgIC0yMTk5LCAgLTI5NTMsICAgIDYxNCwgIC0xNDA0LAorICAtNDQ5LCAgLTg1MjQsICAtMjI3MSwgICA1MDAxLCAgLTk1MTcsICAgMjk0MCwgICAtMjA0LCAgIDM2MjUsCisgIC0yNTgsICAgICAzMiwgICAxNTIxLCAgIC0yOTksICAtMTc4NiwgIC0yODM2LCAgIDE1MjMsICAgMjQyNywKKyAgLTgzNSwgICAzMTM5LCAgIC0xOTcsICAgMzM1MSwgICAtMjc5LCAtMTQ3NjYsICAtMTI2NywgICA1MTY5LAorIC0xMDM5LCAtMTA5NjcsICAgICA1OCwgICAgNjQxLCAgIC03NjcsICAtMTE5MywgICAtNTkxLCAgIC03MTYsCisgIC04MzQsICAgODEwOSwgICAtOTE1LCAgIC03MTEsIC0xMDQyNywgIC0xNjgwLCAgIC02MzgsICAgMjY0MywKKyAgLTg1MCwgICAtMjU4LCAgMTA0NTIsICAgIDM2MiwgIC01Mzk0LCAgIC0zNDksIC0xNDcyNywgICAtNjU1LAorICAxMDQwLCAgIDE3MjIsIC0xMDI2NSwgICAgNTUxLCAgIC0yODMsICAgOTg4OCwgICAgNDA4LCAgIC00MDAsCisgIDU5ODAsICAgMTg3OCwgICAgNzgxLCAgIC05MjMsICAgLTY2NywgICAtNzg5LCAgIC0zNDgsICAgIDYyNCwKKyAgLTI2MCwgIDE0NTE1LCAgIC04MDQsICAgMTcyMSwgICAgIC0yLCAgIDUzNTYsICAgMTgwMiwgICAxMjE4LAorICAgNDk4LCAgIDE4NzEsICAgLTk4OCwgIDE2Mjk1LCAgIDQxNjMsICAtMjM0MiwgIC00MjkwLCAgIDMxMjEsCisgIDMyNjksICAgIDExMiwgIC0zNDkyLCAgIDExMjQsICAtMTQ5NiwgICAxODYzLCAgLTE0MjYsICAtMTA5MCwKKyAgMTU5OCwgICAtMTk3LCAgIDExNjAsICAtMTY2MCwgIC0xMDk0LCAgICA0NzcsICAtNDEwNCwgICAtMzk2LAorICAxNjA1LCAgMjYxMzQsICAgIDc0NiwgLTEyODc2LCAgIDIzMjAsICAtMTY5MCwgICA4NjI2LCAgICAgMzksCisgIDEzNDEsICAtMTI1NCwgIC0xODkwLCAgIDI1NTUsIC0xMzk5NiwgIC0xMjE4LCAgIDM4MjcsICAgMTIxNiwKKyAgLTkwOSwgICAtMTgwLCAgIDE3MjAsICAgIC04NywgICAtMTQzLCAgICA5ODksICAgIDM0MCwgIC0xNDI2LAorIC00MDI5LCAgIDMxNDEsICAtOTQyNCwgICAgNDY2LCAgLTgyMjcsICAgIDQyMiwgIC03Mzc5LCAgIDIwMzgsCisgICA0MDEsICAgICA5OCwgICAzNjAyLCAgLTEyMjMsICAgLTk0NiwgICAyNDY5LCAgIDExNTksICAgIDcyNywKKyAgLTI2OCwgICAgNDY3LCAgICAyMDMsIC0xMTA3OSwgICAzODUwLCAgLTM0NjksICAtMTk2NSwgIC0xODU3LAorIC0xNDE1LCAgLTI0NzcsICAgMzE3MywgICA3MzUyLCAgIDk0ODMsICAtNTU0MSwgICA2MjEyLCAgIDE4ODYsCisgLTM4NjgsICAgMjcyOCwgICAgNTc3LCAgLTUwNTcsICAgIDMyMSwgICAgOTcyLCAgICAtNzcsICAgICA0NywKKyAgIDIyNywgICAgLTM4LCAgLTEwMzcsICAgLTIyMiwgICAtMzQ3LCAgIC0zNDEsICAgMTE3OSwgICAtOTQ4LAorICAgNTkyLCAgLTc0ODUsICAgMjIxOCwgIC01OTU1LCAgIDI2OTgsICAxMTc5OCwgICAgMTk3LCAgIDYyNjAsCisgIDE3MTEsICAgIDk5OCwgICAgICA4LCAgLTYyMjMsICAtMTE4NCwgICAxMTQ1LCAgLTE3ODEsICAgMTM3NiwKKyAgMTM5NCwgICAgMzg4LCAgIC02ODksICAgMjI3OSwgICA2NTExLCAgIDI1NDIsICAtNDkwMywgICAzOTE3LAorICAtNzkwLCAgICA1MzUsICAtMTkwMywgIC00NDQ4LCAgIDQyMTYsICAgIC0yMiwgIC02NzE1LCAgIDUyMDQsCisgIDQ4MDcsICAgMzE5MywgIC0xMDY0LCAgIDU0MDMsICAgNDUwMywgIC0yNDM0LCAgLTQyOTYsICAgMTM4MywKKyAtMTUxNCwgIC00MTAzLCAgICA3NDcsICAgMzkyOCwgICAyOTg3LCAgIDk1MTMsICAgMjQ5MiwgIC04NjkxLAorICAtOTkzLCAgLTI2NjcsICAgIC00MCwgICAtMTcwLCAgLTMxMTYsICAgIDYxMSwgICAyMzY3LCAgMTYyOTcsCisgLTEyNTYsICAtMTQwNCwgIC0zNDYyLCAgICA0NjYsICAgLTUyNCwgICA1NDY0LCAgICA0OTEsICAgIDcwNiwKKyAtNzQ5MSwgICAyMDI3LCAgICAzNzMsICAtNDA4NiwgICAxNjIwLCAgLTc3ODksICAgIDcwNCwgICA1MDAyLAorICAxNzA2LCAgIDgzMjUsICAgLTg1MSwgIC05ODgzLCAgLTMwNzIsICAgNDQ3NSwgICAyNjk2LCAgLTg1NDkKK30sCisKKy5zaGFwZTExID0geworICAgIDQ0LCAtMTA1OTIsICAgLTgzMiwgICAtNDEzLCAgICA2MTIsICAgIDUzMCwgICAgMzc5LCAgICA3NTMsCisgIDE0NDIsICAtMzAwNiwgICAtODU4LCAgLTEwNzcsIC0xMjAxOCwgICAtMTk2LCAgIC03NzEsICAtMTE0MiwKKyAgLTYyOCwgIC0yOTM4LCAgIC00MzksICAtMzMyMywgICAgIDIwLCAgMTI1MTMsICAtMjQ2MiwgIC0xMjcwLAorICAgLTU3LCAgLTg0MTcsICAgLTY5MCwgICAgNzkwLCAgICAyNzYsICAgMjM0OSwgICAtMzQxLCAgLTE2NDQsCisgICAyMzAsICAtMjE3NiwgICAtMjAyLCAtMTQ3MjUsICAgIDE3MCwgICAxNzI1LCAgIDMwMzAsICAgIDY4MywKKyAgLTIzMSwgICAgNjQxLCAgIC0yNDIsICAtMzI1MiwgICAgMTEwLCAgLTE0NDAsICAgMjg4NiwgIC0xNDY3LAorIC0xMTU1LCAgMTQzOTUsICAgIDI5NywgICAgIDUyLCAgICAyNDAsICAgMzkzOCwgICA5ODgwLCAgLTc1NTUsCisgLTEyMTQsICAgMzM1MSwgICAgMTI5LCAgLTEyNjksICAgLTE2OCwgICAgNjY5LCAgMTM3NjUsICAtMTI4OSwKKyAgLTQ2NSwgIDEwMDE3LCAgIC02MzIsICAgLTMyOCwgICAtMjc2LCAgICAtMzMsICAgICAzMSwgIDE4ODgzLAorICAtMTQ4LCAgIC0xMzEsICAgIDUyNSwgICAxNjY5LCAgIDIyODgsICAgLTIwMywgICAgODY4LCAgIC02NjAsCisgICAyNDgsICAgLTQwOSwgICAgLTkxLCAgICAyOTUsICAtOTE3NCwgIC0xNDg0LCAgICA5MjksICAgMjgyNCwKKyAgMTA5NywgIC0zMjA1LCAgIC0xMTMsICAgMjcxMiwgIC0xNTQ0LCAgICA1MjcsICAgMTQxOSwgICAtOTYzLAorICAtMzg4LCAgICA2OTEsIC0xNjc5MSwgICAgLTg0LCAgICAgNzIsICAtMzgwMiwgICAtMzU3LCAgIDE2MzMsCistMTUxODIsICAgICA2MiwgIC02MDI0LCAgIC03NDIsICAtNTM5NiwgICA0NDcwLCAgIC0xOTgsICAgICAgMSwKKyAgMTQyOCwgIC0xNjkxLCAgMTg3MTUsICAgMTQwMiwgIC0yNTM5LCAgIC0zNzUsICAtODQ1NSwgICAtOTAxLAorICAtMTQ3LCAgLTMyNzQsICAgOTM1OSwgICAtMjc3LCAgLTg5NDEsICAgIDcxNCwgICAyODM0LCAgIDI5MjQsCisgLTYzMjYsICAgIDkwNywgICAtMTIzLCAgMTA0ODcsICAgLTQ4NCwgIC00NzcyLCAgICA4NzcsICAgOTg0MCwKKyAgLTUwNSwgIC03NTYyLCAgICAzMDEsICAgIDY3MSwgICAgMTE2LCAgIC0zNzEsICAgMzc0MCwgICAgMzU5LAorICAgMzg1LCAgLTUxNDUsICAgLTkwOCwgICAgMTU2LCAgIDk2MzksICAgMzc4MiwgIC05Njg4LCAgLTQyMTQsCisgIC05NDUsICAtNzY4NSwgICAgMzM0LCAgIDIxODUsICAtMTM0MiwgICAgMzg4LCAgLTE3NDEsICAgIDI3OCwKKyAgLTIzMSwgICAtOTEyLCAgICA5MDUsICAtMTAzOSwgICAgNTk4LCAgIDIwNDksICAgIDY2MiwgICAtMTk4LAorIDIyMzc4LCAgICAxNjYsICAgIDExNiwgIC0xNjk5LCAgICAzMzUsICAtODM4MCwgICAxMjc5LCAgIDE1MzYsCisgMTQ5NTUsICAgMTI1NCwgICAgMTkwLCAgLTI1MTksICAgLTYwOCwgICAgMzY0LCAgIC01NjEsICAgNTc0OCwKKyAtMTE3OCwgICAtOTIzLCAgIDMxODMsICAgIC01OSwgIDEzODgwLCAgLTI1MzAsICAgIDI0MSwgICAtNTY0LAorICAtMzE5LCAgLTc1MTAsICAgICAtOSwgICAtMTI0LCAtMjAzNDYsICAgIDMwNSwgICAgLTI1LCAgIC00MDAsCisgICAyMjIsIC0xNjk0MywgICAtNDg4LCAgICA4MDIsICAtMTY4NSwgICAzMzIzLCAgLTYxOTgsICAgMTAwMCwKKyAgLTkwMywgICAtODQ2LCAgIC0zODcsICAgIDQ2MiwgICAgODQ3LCAgICA1MjYsICAxMDAyNCwgICAyMDIwLAorICAyMDkwLCAgLTk1NjMsICAgMTQxNiwgICAgMTY5LCAtMTIxODIsICAgLTQyOCwgIDEwMzg4LCAgICA4NjksCisgIDEwNjgsICAgMjIwMSwgIC0xMDQxLCAgLTMxODAsICAgIDE1MiwgICAtNjQ2LCAgICAgIDQsICAgNDAxNywKKyAtMTA2OSwgICAgMzA3LCAgIDUyODMsICAgMzAyMSwgLTEzNjYyLCAgIC00OTMsICAgICAgOSwgICAgNTQyLAorICAgMTUyLCAgLTI2MTcsICAtMzg3MCwgICAtNTE0LCAgMTM0OTcsICAgMTE4MCwgICAtNjAzLCAgIDEyNTUsCisgIDIzOTYsICAgNzQxOCwgICA4OTAyLCAtMTExNjUsICAtMjYyNiwgIC01NzE5LCAgIDE3NjQsICAgIDg1OCwKKyAgMTEwNSwgICAxNDc2LCAgLTE3NjQsICAgMTk2OSwgICAgOTc3LCAgLTE3MzgsICAgLTkyOCwgLTEzOTQwLAorICAxNDQ0LCAgLTQxNTcsICAgIDgzNiwgLTEyMjQzLCAgIC0zNjksICAgLTI1NiwgLTE1NjgxLCAgIDUzMjAsCisgLTUxNzAsICAgLTUwOSwgICAgMzUzLCAgLTE1ODEsICAtMTQ1NSwgICAgOTY1LCAgICA3MTYsICAgIDIwOSwKKyAgLTg4MywgICAtMzE3LCAgLTE5NjEsICAgOTEyOCwgIC04MTk3LCAgIDIxNzMsICAtMjQzNCwgIC0xMTI2LAorICA0MDY2LCAgIDEwMjUsIC0xNjY2MywgIC03MDEzLCAgIC0xNDcsICAgMTYxNywgICAtNzQ1LCAgLTMyMDUsCisgIDE0OTYsICAgMTgyMiwgIC0xMTk5LCAgLTI5OTksICAgIDExNywgICAgNjE5LCAtMjAwMDIsICAgLTIzMiwKKyAgIDE0MiwgICAzMjA3LCAgICA1NjEsICAgLTI5MiwgIC0xNjM1LCAgIDEwMzUsICAgICAzNywgICAyNzEyLAorICAtMjQzLCAgLTgyNjksICAgIDMwNSwgIC0yNjAxLCAgICA0OTUsICAxNDUxNiwgICAgODMxLCAgICAyNjAsCisgICAtNTQsICAgNDIxNywgICAgNjc1LCAgLTE2MzIsICAgNDk2MiwgICAgNzkzLCAgIDEwNjYsICAgIDEzMywKKyAgLTM0NCwgLTEyNDI4LCAgICAgOTUsICAgNjE2NCwgIC0xMjk4LCAgLTE4NjAsICAgMzYyMiwgICAtNDY3LAorICAtODY3LCAgLTExNzgsICAxMTA1MywgICAgMTE4LCAgICAtMzYsICAtNjk5NywgICAtNzYzLCAgMTYwMTksCisgICAgMTYsICAgMjQ1OSwgICAgMzA2LCAgIC04MjAsICAtMTEzNSwgICAgODQ3LCAgIC03MDksICAgIDkyOCwKKyAgLTE2NCwgICAtMjkzLCAgLTU3MzYsICAgIDU0MywgLTExNTQ4LCAgIDUzODksICAtMjAxMiwgICAgMzAwLAorICAtMjI4LCAgLTEwNDMsICAgNTEwNywgICAtNTU4LCAgIDExODcsICAgLTE0MCwgLTEzMDM0LCAgLTE1NzEsCisgICA3NDAsICAtNDk2NywgICAtNDMyLCAgLTYyODksICAtMTc3OCwgICAzNDQ5LCAgIC0zMzcsIC0xMjYwNywKKyAgIDM0NCwgIC0zNzkwLCAgLTE1OTgsICAgLTI3NCwgICAtMzQ2LCAgLTE0OTQsICAgLTEwOCwgICAgMzI1LAorIC0xMjE1LCAgICA4MTksICAgIDQwNCwgICAtNTY4LCAgIC0yODYsIC0yMTM2NCwgIDE1NDk1LCAgLTIyOTcsCisgICA2MDYsICAgIDExNywgICAgIDEwLCAgIC0xOTMsICAgLTk3MiwgICAtMjkyLCAgIC01NzMsICAtMTE1NSwKKyAtMTI4OSwgIC0xMDI1LCAgICA0NzIsICAgMTE1NCwgICAgODQzLCAgICAxODcsICAgIDU4NiwgIDIwNTY5LAorICAgIC01LCAgIC0yMzYsICAtMTE4MSwgIC0xMDkyLCAgICA3MDAsICAgIDg5MSwgICAtNjAzLCAgIC02MDEsCisgMjE2NDgsICAgLTQ0OSwgICAtMTkzLCAgLTExMDMsICAgLTI5OCwgICAyMDg0LCAgIC0yNTEsICAgIDQ0OSwKKyAtMTQxNCwgIDE3MTY4LCAgIC0zOTEsICAgIDEwNCwgIC01NDY1LCAgICA0MDEsICAgODgzOSwgICAgNzgxLAorICAxNzQxLCAgICAyMDEsICAgLTM2OSwgICAgNDY2LCAgMTIzNTgsICAgLTYzNiwgICAtOTQ1LCAgIDM5MjgsCisgIC02MDUsIC0xNzQ0NSwgICA1MDIwLCAgLTEyODksICAgIDk3NywgIC02MjAyLCAgIDE3ODMsICAgLTUwNywKKyAgIC03NiwgICAgMjY3LCAgICAtMzEsICAtMjczMSwgIC0xNTYwLCAgLTEyMjUsICAgMTM0OCwgIDExMTc2LAorICAxNjY5LCAgICA3NTQsICAgMTY3MSwgIC00MDM4LCAgICAxNTEsICAgLTM3MSwgICA3MjgzLCAgICAyNDMsCisgIDEzODcsICAgIDEyNiwgICAxMDA3LCAgIDEyOTIsICAgIC0xNSwgICAgNjk2LCAgICAyODIsICAtMjYyMywKKyAgMTA2NSwgIC0xMDI2LCAgICAxOTEsICAgLTYzMiwgICAtMTMyLCAtMTI5NTcsICAgIC0zMiwgIC0xNjk3LAorICAtNDIyLCAgIC0yNDAsICAgMTM1MiwgIDEwMjUyLCAgIDEwNjcsICAgODI5NiwgIC0xMjQ0LCAgICAgLTksCisgIC0zMDEsICAtMzAxNCwgICAtMjQ5LCAgIC0zNzIsICAxMDczMSwgICAgNTM1LCAgIDIxNDcsICAtODk1OSwKKyAgIDM0NiwgICAtNDA4LCAgLTgzMjksICAtMTkwNSwgICAgLTQ4LCAgLTgxNzYsICAgMjc4MiwgICAgNDEyLAorICAxNDI1LCAgIC05NDYsICAgLTc0OCwgICAxMDk1LCAgLTEzNzAsICAgOTA4NiwgICAgLTk5LCAgIC0xNDMsCisgICAgNjgsICAgLTU0NCwgICAgMjY0LCAgICA0OTQsICAgLTM3NywgICAgIDEzLCAgIC02MTgsICAgIDIzNywKKyAgIDE5MywgICAzNTQ5LCAgICAzMTcsICAgLTE2OCwgIC03MTQ4LCAgIDIzNTEsICAgLTI0NCwgLTEzMjQwLAorIC0zMzU1LCAgLTIzMjIsICAgLTUzMywgICA5NTU0LCAgIDY5MDYsICAgIDEyNCwgICAtNjk0LCAgIC05MDEsCisgLTI3NjIsICAgIDIwNywgICAtOTE1LCAgLTI1MjAsICAgLTE0MywgICA4NTQ0LCAgIC02NzgsICAtMjc4OCwKKyAxMjkyNiwgICAgNzkxLCAgIDEyOTYsICAgNDg2MSwgIC0xNDcwLCAgICA4ODksICAgMzY3NSwgICAgODA2LAorICAgMjkwLCAtMTExNDYsICAgIDQyMiwgICA5MjE3LCAgICAtMzEsICAgMTYwOCwgICAgMTQwLCAgIDM5MzksCisgLTY5MDMsICAgLTI3NiwgICAtNzA0LCAgIDIzNTMsICAgLTM0NCwgIC0xMDM4LCAgIC0yMzAsICAgLTE3NywKKyAgIDY3MCwgICAtNjE3LCAgIC0xMjksICAgLTg1NywgIC04MjMxLCAgICA2MzgsICAgLTQxMSwgICAtMjUyLAorLTE1NzA5LCAgLTEyMTgsICAgIDIxMCwgICAgMjg4LCAgICA1NDIsICAgIDUzMywgIC05MDg3LCAtMTA0OTMsCisgIC02MjQsICAgMTE3NSwgICAgNjExLCAgIC0yMzAsICAgIDc0NiwgICAxNDU1LCAgIC01OTAsICAgIDgzMCwKKyAgMTc1NiwgLTE1ODAwLCAgICA4MjMsICAtMTA3NywgICAgNzg4LCAgIDEwNzEsICAgIDQ2OCwgIC0xNjU0LAorICAgNjYwLCAgICA5ODMsICAtOTY5NywgIC0xMzAwLCAgICA2NjIsICAgMjA1MywgICAtMjgxLCAgMTI5NDksCisgICAzODksICAgLTkxNSwgICAgMTk3LCAgLTE3NDIsICAtNDU4NywgICAxNzQ2LCAgICA3MDcsICAgMTYyNSwKKyAgOTAyMSwgICAyMjA0LCAgICA3NTksICAgMTMwMywgICAtNDI4LCAgIC0yMjAsICAgICA0MSwgIC01NDk5LAorLTE2MDgwLCAgIC0xOTMsICAgIDQ0MywgICAgNDQzLCAgICAtNzgsICAgIDg4OSwgICAtNTYxLCAgIDU2MjksCisgLTEwNzMsICAgNzAxOSwgICAgMjIyLCAgIDE2NjEsICAgMTE5MCwgICAxMTA4LCAgICAgOTQsICAgNTYyNCwKKyAtMzc5NiwgICAgNDA3LCAgIC03MDYsICAgLTEyMiwgICAgNzQ0LCAgICAzNjMsICAgMTY0OCwgLTEwODk2LAorICAgNTk1LCAgICA5NTMsICAgICA4NSwgICAtMjY3LCAgICAxOTUsICAgIDg1MSwgIDE3MTczLCAgIC02MzYsCisgICAyNDMsICAgIDkwNywgICAyMDI5LCAgIC03MDAsICAgIDM1MSwgICAxNDk1LCAgIC0xNTcsICAgLTU3NSwKKy0xMTY2NCwgICAxMjUyLCAgIDgzNDEsICAgLTYxNiwgICAzNzA4LCAgIDU2OTMsICAgICAtNiwgIC0xNzUzLAorICAxMDcyLCAgICA4NjMsICAgLTgyMywgIC00Mjc4LCAtMTIwNDMsICAgIDc1MCwgICAgNTk3LCAgIDMxNDUsCisgICAgMzgsICAtODE0MCwgICAzMTM2LCAgICAyOTAsICAgICAgNywgIDExMDg0LCAgIC04NzYsICAgMTg0MiwKKyAgIDE3NSwgICAzNDU4LCAgICA0NjAsICAgMTYxNSwgIDExNjk4LCAgIC04MjcsICAgICAxNiwgLTEyNDgyLAorICAgNDI4LCAgICA0MTEsICAgMjYyNSwgIC0xMzUyLCAgICAxNDIsICAgIDUyOSwgICAgMjI5LCAgICAtNDgsCisgIC05NjUsICAgLTE0NSwgICAtNTkyLCAgICA2NTUsICAgIDQ5OSwgIDIyMDk1LCAgMjIxNDEsICAgICAzNywKKyAtMTg3NSwgICAgNzAxLCAgICAgNDUsICAgIDcyNCwgICAxMTExLCAgIDE2MzEsICAgIDI2MiwgICAtMjUyLAorIC05MDkyLCAgIDUzMjUsICAgIDQwOCwgICAtNjM3LCAgIC02MTIsICAgIDY0NywgICAxMjY4LCAgICA4MzQsCisgIC01MTAsICAgIDYwMywgICAgMTk5LCAgICA4MTYsICAtOTkwNCwgICA5NTMzLCAgLTE1ODAsICAgMjY2OSwKKyAgMTgyNCwgIC0yMDkyLCAgIC03MDEsICAgLTI3MSwgICA3NDg5LCAgICAgNDYsICAtMzI5NSwgICAtODQ0LAorICAtMzA0LCAgIC0yMjYsICAgLTI2MCwgICAtNjkyLCAgICAgLTUsICAgLTUyNywgICAgIDM3LCAgICAtNDksCisgLTE1NDIsICAgIC02OSwgIC0xMDg3LCAgMjA1MTksICAgIDM2NywgICAgICAxLCAgIDM0ODcsICAgMjUzNSwKKyAtNTExMCwgICAgNjQyLCAgIDEyMjMsICAtMjEzMCwgIC0yODk0LCAgIDE3NTIsICAtMTYxOCwgICA5NzMyLAorIC0xNjMzLCAgIDY5MDQsICAgIDEzNywgICAgNjU0LCAgIC0zNTgsICAgIDM1NSwgICAgLTIxLCAgIC0yNzcsCisgICAtNjgsICAgLTE4OCwgICAgMTMyLCAgICA1MzAsICAgIDM3MiwgICAtMzE1LCAtMTE0OTgsICAgIDIyMSwKKyAgIDgxNSwgICAyNDgwLCAgLTEzOTgsICAgLTEyMywgICAgMzUzLCAgIDMxMTQsIC0xMjAyNSwgIC0xMjEyLAorIC0xMTExLCAgICA5MTYsICAgNjQ1MiwgIC0xODgwLCAgIDE4NjcsICAgIDMwNywgICAgLTY2LCAgIDE4NTcsCisgICAxMzgsICAgLTk4MCwgIC0zMDg4LCAgIC0xNzQsICAgIC00MSwgICAtMzkzLCAgIC02NTYsICAgIDg0NywKKyAxNTgyNCwgICAtMzc5LCAgICAzNTgsICAgIDY3MiwgICAtMzg5LCAgICA5MjAsIC0yMTE0NSwgICAtMzkzLAorICAgMzUwLCAgIC01NzQsICAgMTAwNSwgIC0yMDgzLCAgICAgMjYsICAgICA3OSwgICAtMjAzLCAgLTc5NjcsCisgLTMzMDIsICAtNTgwNSwgICAgNzcyLCAgIC0zMDIsICAgMjEwNCwgIC0xMjQwLCAgMTM3MTAsICAgNjgxNiwKKyAgMjI4MiwgIC0zNzA5LCAgLTE1MTIsICAgIC04MSwgIC0yMjE2LCAgLTMwMDUsICAgIDQ0NCwgICAtNzk1LAorICAgNzUxLCAgIDIxNjMsICAyMDc1MSwgICAgNzgwLCAgICA1NDIsICAgLTQ4MCwgICAgNjI0LCAgIC00MjUsCisgICA3NjksICAgMjQ3NCwgIC01OTAzLCAgICAzOTksICAxMDU2NCwgICAtMTEyLCAgICAgNjksICAtMTQwOSwKKyAgMTg4NSwgICAyMzM5LCAgICAgNjcsICAgLTYyMCwgICAgMTk2LCAgLTI0MzIsICAgNjA0NiwgIC0xNjczLAorICA2NTEyLCAgICA4MDksICAgNzkwNCwgICAtNTE2LCAgIDQyNzgsICAgIDIyMywgICAgMzU5LCAgMTY1MTIsCisgIDEyMjQsICAgLTQ4MCwgICAtNTA1LCAgIC03MzUsICAgLTUwMiwgICAtNTkzLCAgLTQ1NjUsICAgMTkxNCwKKyAgIDEyMiwgICAtNTMxLCAgIDE0NDIsICAgIDQ2NCwgICAgIDY5LCAgICAyOTIsICAgIDQxMCwgICAtNTgxLAorLTE5ODQ4LCAgIDEwNTksICAgIDEzMiwgICAxMzkyLCAgIDU5MTcsICAgIDcwNSwgIC03NzA2LCAgIDI0OTYsCisgLTE0ODcsICAgLTc5MSwgIDExOTM5LCAgICAxODUsICAgLTI2NSwgIC0yNDEyLCAgICA2MzAsICAtODAyOCwKKyAgMTQzNCwgIDEwMzE1LCAgLTE1NDEsICAtMzc1NiwgIC0yNDAzLCAgLTE5MTgsICAgMTA1MCwgICA4MDU3LAorICAgMjM0LCAgMTM1NDYsICAgIC05MiwgIC0yMTcyLCAgIC02NzEsICAxMTYzMSwgICAgMTAzLCAgICAxMTYsCisgIC0xNzEsICAtNDYwNCwgICAtMjY3LCAgIC02MDIsICAgICAxNSwgICAgNDU0LCAgIDY4NTksICAtMjE1MSwKKyAtODcwNywgIC0xNjY0LCAgICAgNjEsICAgMjUxOCwgICAtOTY5LCAgICA5MDMsICAgMTIwOSwgIC0xNDM1LAorIDEzNTMxLCAgICA1OTAsICAgIDIzNiwgICAtODIxLCAgICA1OTgsICAgMTE4NiwgIC03NjkwLCAgICAxMzQsCisgLTEwMDUsIC0xODE3NywgICAtMTQ4LCAgICA1MTksICAgIDkwMCwgICAgOTUxLCAgICA0MDYsICAtMzU4NCwKKyAgICA0NywgICA5NDM5LCAgIDE0MTgsICAgLTc5NywgIC0zMzUzLCAgIC03MDMsICAtMTc5OCwgIC0xMjQ0LAorICAgMjkxLCAgLTI3ODQsICAxNDYxMiwgICAyMDI5LCAgIC0xNjEsICAgMTA0MCwgIC00MTMwLCAgIDMwNjQsCisgIDE3MjEsICAtMjg5OCwgICAgMjY5LCAgIDMzNjcsICAgMTM3OSwgIDE0MzU5LCAgIC02OTAsICAgLTY1NSwKKyAgMjAxMCwgIC00OTM1LCAgIC02ODEsICAtMjYwNiwgIDExNjUxLCAgICA3NDgsICAgIDEwMSwgIDEzNTkzLAorICAgNjI5LCAgICAgMjgsICAgLTU0MCwgICAtODU0LCAgIDE0MDUsICAgIDU1OCwgIC04Nzg1LCAgLTEwMTYsCistMTMwNDMsICAgIDEyMSwgICAtNTU2LCAgIDQ5NTksICAgMTY5NCwgICAtNzIwLCAgIC0xMzgsICAtMzg5NywKKyAgIDE4MiwgICAxOTM4LCAgICA4NDQsICAgIDkxOSwgICAtNjgzLCAgMTIwNDIsICAtMTEwMSwgICAtMTU1LAorIC0xMzc1LCAgLTE1MDksICAgICAxMSwgICAgMjIwLCAgICA4MjEsICAyMTcyMSwgICAtMzY3LCAgIC02MzQsCisgLTE0NjgsICAgLTE3NCwgICAxMDAyLCAgLTEyMDMsICAgIDMxOCwgIDExNjcyLCAgLTIxMTQsICAgMjQ3MiwKKyAtMTcwMSwgICA1OTMyLCAgIC02NjEsICAgMTA5NCwgICAyNTAwLCAgLTU2MDksICAgIDI1NCwgICAgNDM3LAorICAtOTExLCAgLTE2MTEsICAtODAwNSwgICAgMjE3LCAgLTExMzksICAgMTMyMSwgLTEwNzEzLCAgLTIxODMsCisgIDExNjMsICAgLTg5MCwgICAtNjIyLCAgMTI4MjAsICAgMTAyMSwgLTEzNTc4LCAgIDEwNDAsICAgMzIxNiwKKyAgIDU5MiwgICAgNjg2LCAgICA3MzcsICAtMjg4MSwgIC0xNjkzLCAgIDM5OTUsICAgLTQ1NSwgICA0NjY2LAorIC00MTI0LCAgLTkzMTYsICAgMjA2MSwgIDEwNjQ1LCAgICAyNzEsICAgIDI2NCwgIC02ODI5LCAgICA2NDEsCisgIDIwNjEsICAtNjY4MywgICAtNTEyLCAgIC03NDcsICAtOTEzMSwgICAyNDQ1LCAgICAzNDMsICAtOTk0NCwKKyAtMjg4OCwgICAgNjA3LCAtMTA4NTUsICAgIDg3MSwgICAgNDE4LCAgICA1MDQsICAgIDkzNiwgICAxMDc5LAorICAgMjczLCAgICA0MDAsIC0xNzc1MiwgICAtMzkxLCAgLTE1NDMsICAtNjE5MywgICAxNDgyLCAgICA3MzcsCisgIDIwOTYsICAgLTk4MiwgICAgMTY3LCAgICA5NzIsICAgIDMzNiwgICAxMDYzLCAgLTEyNzIsICAtMTYwMiwKKyAtMTkwNywgICAgICA5LCAgIC0xOTEsIC0xNTIwNywgICAtMTE5LCAgIDQwNDcsICAgMTQ3OSwgIC0xNDA1LAorICAgNTI2LCAtMTg0NjIsICAgLTYyNywgIC0xOTk2LCAgLTEwMjIsICAtMTU0NCwgICAgMzEyLCAgIDc5NzIsCisgIC0yMjcsICAgIDc5NywgIC01MjA0LCAgLTIxNjAsICAgIDM5MSwgICAtNDIzLCAgICAyNTcsICAgMzgzNiwKKyAgIDQ0MiwgIC0xOTMxLCAgICAgMjIsICAgIDE0MywgICAtMjAzLCAgICAzNjIsICAgIC03MywgIDE1Njc5LAorICAtMjg5LCAgLTE0NDUsICAgIDU3NywgICAgODU4LCAgMTE0MDgsICAtMTk3MCwgIC0xMDIyLCAgIDE1NTAsCisgICA4ODIsICAtMzY5OSwgIC0yNjk3LCAgIDM5NzgsICAgIDYwMCwgICAgIDg2LCAgIDM4NTgsICAgODY4MywKKyAtNzY4MSwgIC00ODU2LCAgIDQwNTEsICAtMTMyMSwgICAtNTg3LCAgICAgNDYsICAgLTQ5OSwgICAtMzU0LAorICAtNjU1LCAtMTU3MTcsICAgICA2NywgICAgNDkwLCAgLTI2NzAsICAgIDQ3NCwgIC0xMzc0LCAgIDU2MDEsCisgICAgNjAsIC0xNzYxNSwgICAtODA4LCAgICAgODcsICAgIDM2NywgICAgNTc5LCAgIDEwNTcsICAgMTAyMCwKKyAgLTM5NCwgICAxMTgxLCAgIC0xODksIC0xMDg0NiwgICAgNzYzLCAgIDI2MzUsICAgIDI4MiwgIC0zMjc5LAorICAtODY2LCAtMTUyNTcsICAgLTQ0OSwgICAgMTEyLCAtMTU1NzcsICAgIDIyNywgICAgMjY5LCAgMTM5NjQsCisgLTEyNzMsICAgMTUxMywgIC0xNDg3LCAgICAxOTUsICAgIDMxOSwgICAyNTI3LCAgIC0yODYsICAtNTg4MywKKyAtNTM2MCwgICAtOTU5LCAgIDI3OTEsICAtMzMzNSwgICAtOTQ1LCAgLTE5ODUsICAgLTkwMywgLTExNDE4LAorICA4NTI1LCAgICA2NjksICAgNjEwNiwgICAgMTUzLCAgLTExNjksICAtMTE5OCwgICAtNTUzLCAgIDcwMzcsCisgICA1MjgsICAtNDIzNywgICAgNzE3LCAgIC0yMTQsICAgMTgyNCwgIDEwMTA4LCAgICA5NjEsICAgOTA3NywKKyAgMTg5OSwgIDEwNDA3LCAgIC0yMDcsICAgIC0yOSwgICAgMzU1LCAgLTY3OTQsICAgIDExMSwgLTEzNjI3LAorICAxMzYxLCAgLTM1NzcsICAgIDI5MSwgICA0NTM0LCAgIDIyMDksICAtMTU3OSwgICAgMTA5LCAgICA1MjMsCisgICA0NTYsICAxMDk5MCwgICAgIDMxLCAgIC00NDgsICAgIDM4NSwgICAxNDgxLCAgICAgIDIsICAxNTI2NiwKKyAgIDc5OCwgICA1NzU5LCAgICA4NjAsIC0xNjQyNCwgIC0xMzE1LCAgIDE2MzEsICAgLTQ1NiwgICAtOTc3LAorICAtMTgwLCAgLTI1OTMsICAgMTE5MSwgICA1OTU5LCAgICAtMzIsICAgODExMiwgICAtNTA2LCAgLTc3NjYsCisgLTE4NzEsIC0xNTMxMCwgICAgNjYyLCAgICAxOTYsIC0yMDQwMSwgICAgOTI1LCAgICA0NDYsICAtMjAzNSwKKyAgLTYyMCwgICAtNjg2LCAgIC0yNDksICAtMjUxNywgICAgNDIzLCAgICA3MDMsICAgIDYzMywgICAgODI4LAorICAtMTgyLCAgICAtMzcsICAgLTQwNiwgICAtMTQ5LCAgICA4MjEsIC0yMjI1NSwgICAgNjUyLCAgICA1MjIKK30sCisKKy5zaGFwZTE2ID0geworICAtNzg2LCAgICAxOTMsIC0xNTQ0MSwgICAgMjAwLCAgIDEwNTAsIC0xNjU0NSwgICAgLTQxLCAgICAzMjksCisgIC04NjksICAgLTE3MCwgICAtODU4LCAgIDI3MjUsICAgIDIxNywgICAgNDQ3LCAgIDIxMDcsICAgIC0yMywKKyAgLTM4NywgLTEwMjgwLCAgIC0zODMsICAgLTMyMCwgICAgMzg3LCAgMTYwMTIsICAgIC03OSwgICAtOTY3LAorICAzNTI4LCAgLTIxMjMsICAgLTUzNywgICAtNjM2LCAgLTE3NjEsICAgIDk0OSwgICAgMTAwLCAgICAtMTcsCisgIC00NDYsICAgIDI2MSwgIDIyNTI3LCAgICAzMzEsICAgICAyNiwgICAgLTg3LCAgIC0yMDYsICAtMjI5MiwKKyAtMTE3OCwgICAtMTY0LCAgICA1OTgsICAgIDE0NywgICAgODg5LCAtMTQ0ODcsICAtMjgyMywgIC0xMjgwLAorIC0xODkyLCAgICAgMzMsICAtMTc2MywgICAgOTkzLCAgIDQ4MDcsICAgLTk1MywgICAyMTgxLCAgIC01ODgsCisgICAgNTksICAgLTI5NiwgICAgMjE4LCAgICAyOTEsICAgLTEwNCwgICAgNDk1LCAgLTEwOTIsICAgMjIzMiwKKy0xNDkwNCwgICAtOTgzLCAgLTI5MTksICAgIDc5NSwgLTE3MjA3LCAgLTIwNDUsICAgMjk4OCwgICAgNTk3LAorLTEwMzEyLCAgIC03MTgsICAtMjE5NiwgIC01ODIyLCAgICA4NDcsICAgMTMwNCwgICAtNzU3LCAgLTQ3MTQsCisgIC0xNDgsICAgIDgzMSwgICAtNzM0LCAgICA4MDYsICAgNDM0OCwgICAtMzA4LCAgICAyNDQsICAgIDU2NiwKKyAgMjcwNiwgICAgNjA0LCAgIC03NDgsICAgLTg2NCwgICAtNTY4LCAgIC0yMTksICAgLTEyOCwgICAtNjg4LAorICAtMjE4LCAgICAxMTAsIC0yOTI4OSwgICAgNDgyLCAgICAgNzYsICAtMTQ0NywgICAtMTQyLCAgIC00MTcsCisgIC0yNTMsICAgODEyNCwgLTE5Nzc1LCAgICA5OTAsICAgNDU0NiwgIC0xMDEyLCAgLTgwODIsICAgIDEzMywKKyAtMTYxMiwgIC0yMjQzLCAgLTM3ODgsICAgMTU2OCwgIC0yODkyLCAgICA4NTIsICAtMTY0MiwgIC0zNDc5LAorICAgLTIzLCAgIDEzMDAsICAgLTU2NCwgIC0xMDM3LCAgICAyNDksIC0xNDUzMywgICAgLTQzLCAgICAzMjEsCisgIC02ODAsICAgICAxMCwgICAtNDE3LCAgMjM0MjYsICAgIDM5NywgICAtMTA4LCAgIDE4NDMsICAgIDE4MCwKKyAxMTk3NiwgIC05NjEzLCAgICAzNTMsICAgMzc2OCwgICAgMTMwLCAgLTEwMzUsICAgNDM0MCwgICAgMjE4LAorICAgNTk2LCAgIC0yMjQsICAgLTc3OSwgIC0xNjgwLCAgIDEzMjYsICAgIDE1MiwgICAtOTcxLCAgLTk3MjUsCisgIC0zNTUsICAgNTMyOCwgICAtNDU5LCAgMTYyNDIsICAgLTQzOCwgICAgOTI2LCAgIDYyMTAsICAgMTkxMiwKKyAgIDc2OSwgICAyNjIxLCAgIC0xNDgsICAtMTAwOCwgICAgNTE3LCAgICAzNDEsICAtMzU5NCwgICAtOTY1LAorIDExMzgzLCAgIC04NzQsIC0xNjk0OSwgICAxMTY3LCAgLTMzNzEsICAtMTY1NSwgICAgNTg2LCAgIC0xMzIsCisgIDM5OTAsICAgLTc3MCwgICAgMjExLCAgICAyNDYsICAgIDUxNCwgICAtMTY2LCAgIC03MzQsICAzMDQwOCwKKyAgLTI1OCwgICAtNTIxLCAgICAtMjAsICAgIDMzOSwgICAgNDk5LCAgLTI1NzIsICAgMjExMCwgICAgMjcyLAorICAxMzU3LCAgICAxMjMsICAgMjg0MSwgICAtMzIwLCAgICAtMzEsICAgLTQ0NCwgICAtNTAxLCAgICAyMTUsCisgICAtNDIsICAgIDU5NSwgICAgMTA4LCAgICA0ODQsICAgLTIyMywgICAgOTM3LCAgICA0NzUsICAgIC03MiwKKyAgLTMxOSwgICAgIDc1LCAgIC0yMDUsICAgLTk3OCwgIC05MTU1LCAgICAxNDUsICAgMjAyMCwgICAgIC0zLAorICAyNDM4LCAgIDQwNDYsICAtMTI4MSwgICAtODc1LCAgIDE1MzIsICAgLTU5OCwgIDEyMjg4LCAgICAzNjksCisgLTIwNDYsICAgIDM0MywgICAtNzc4LCAgIDE3NjksICAtMjU4OSwgICAtNjQxLCAgMTc0MzcsICAgMTc5MywKKyAgLTU5MiwgIC0xOTU0LCAgLTE2MDcsICAgNjE4NCwgICAzNDQwLCAgIC01MTIsICAtMjcxMCwgIC0xMzMwLAorICAtMTI3LCAgIDg3NjUsICAgICA4MywgICAtMjQzLCAgIC0zMTUsICAgIDcwOSwgICAgMjU2LCAgIDExNzYsCisgLTExOTgsICAgLTQ2MywgICAgOTcwLCAgIC0zMDIsICAgLTU2OCwgICAtOTk3LCAgLTEwMjIsICAgIDE1OSwKKyAxMTAwOCwgICAgIDI3LCAgMTMwNzQsICAgMTUyMywgIC0zMjM5LCAgIDIzMzAsICAtNDgwOCwgICA2MTE1LAorIC05OTMzLCAgIDE0NDksICAgMjE1MywgIC0zMTExLCAgIDE3ODAsICAgLTczMSwgICAgMTIxLCAgIC04ODEsCistMTQyODksICAgLTI2NSwgICAgNTY2LCAgIC02MTEsICAgLTI1MywgIC0yOTY1LCAgICAyNTAsICAgLTEwNSwKKyAgIC02NiwgICAyNTcwLCAgLTE5MjIsICAgMjcxMiwgICAxOTA3LCAgLTIwMjUsICAgLTQ1NCwgICAgMTczLAorICAxNDYzLCAgICAtMjksIC0zMTk1NSwgICAtMTEzLCAgLTE3NTEsICAtMzM1MywgICAgMjU0LCAgIDEwMDEsCisgIDY3ODEsICAgIC0yOSwgICAtNjM5LCAgLTEyODksICAgIDI4OCwgICAgNDk4LCAtMjE1MDUsICAgICA0OCwKKyAgIDEwOSwgIC0yMTUxLCAgIC0yMjMsICAgMTM2MCwgIC0zNDMwLCAgICA2NTgsICAtNDE4NSwgIC0xNzA2LAorICAxMjQ0LCAgIDE4OTksICAgIDEyNCwgICAgIDEyLCAgICAtMzUsICAgIDI4OSwgICAgMzgyLCAgICA0MzMsCisgICAyNjEsICAgLTEzMSwgICAgIDU0LCAgIC02NDYsICAgLTI4MCwgICAgIDg2LCAgICAxODAsICAgIDE1MywKKyAgLTE2OSwgLTIwMjQyLCAgICAtOTUsICAgIDczNCwgICAtNTI0LCAgICAgNzcsICAgIDEwMiwgICA4NDY4LAorICAtNDIxLCAgICAgMjksICAgICAtMywgICAgIDUxLCAgIDE1MjYsICAgLTYwMCwgICAtMjY0LCAgICAzNTUsCisgIDE5NDksICAgLTk4NSwgICAtMjkxLCAgICAtODYsICAxMDIxMiwgICAtNzg5LCAgIC0zOTMsICAgLTE4MiwKKyAgIC01MSwgICAgOTQ2LCAtMTY3MTYsICAgLTk1NCwgICAxMTc5LCAgLTI3NDUsICAgLTUwOSwgIC00Nzc0LAorICAtNTg3LCAgIC02MDgsICAgNzY1NywgICAtNTA5LCAgIC0zODgsICAgIDk4NywgICAgMTA5LCAgIC0yMTgsCistMTc1NzksICAgLTUyNCwgICAtNDY3LCAgLTE2NDMsICAgLTQ0NCwgICAxNDMwLCAgIDI1NDEsICAgLTEyNCwKKyAgMTc4NSwgICAgIDI3LCAgIDc5MDUsICAgIC03MywgIC0zMTM1LCAgLTEyNDEsICAgLTI1NCwgIC0yMTE0LAorICAxMTc1LCAgICA3ODAsICAgIC01MCwgICA0MDU1LCAgICA1MzUsICAgIDQzOCwgICAgIDMyLCAgIC0xMTMsCisgIC0yNjAsICAgICA4MSwgICAxMTAyLCAgICAtNTksICAyOTE4OCwgICAgLTQ4LCAgICAyMTIsICAgIC0yOSwKKyAgLTM0NCwgICAgNTU5LCAgICA4NTYsICAgLTQ4MywgICAgNjA4LCAgICAtNDAsICAtMTQ5OCwgICAgMTEyLAorIDEwMzc0LCAgIDExOTgsICAgLTQzNCwgICA0MDUzLCAgIDEyODYsICAgIDIzNiwgICAxODIzLCAgMTYwNDYsCisgICA1OTIsICAgMTU4MywgICAgIDc4LCAgLTUyNDMsICAgMTMxMSwgICAgNDU2LCAgLTEzNDIsICAgLTU0NiwKKyAgLTM1MywgIDEzMjg5LCAgIC0zMzMsICAgLTUyOSwgLTIwODU5LCAgICAxODMsICAgLTE2NywgIC0xMzY4LAorICAtMzM4LCAgIC02OTAsICAgNDI0OCwgICAtMjA1LCAgIC02NjYsICAgLTYzNCwgIC0xNjUzLCAgIDExNzQsCisgICAyMzQsIC0xODYyMiwgICAgODkxLCAgICAyODQsICAtMjYzMiwgIC0xNTE2LCAgICAyODksICAxMTI0MiwKKyAgIDcyNywgICAgMTMzLCAgICAyODQsICAgLTMyMywgIC0xMzcwLCAgICA5MDgsIC0xMzE2OSwgICAtNDEyLAorICAxMTU1LCAgICA0MTAsICAgIDYxMCwgIC0zMDcyLCAgLTgyMjAsICAgLTYzNywgICAgMjQyLCAgIC02NDcsCisgLTIwNzIsICAxNjA0MSwgICAyMjkyLCAgLTgwMDksICAgIDM1MSwgIC0zMTM3LCAgLTMwNzUsICAtMTA1MSwKKyAgNDU2OSwgICAgMTI1LCAgICAgMjMsICAgMTI4MSwgICAyNDg3LCAgICA1MjAsICAgLTIwOSwgICAtNjg4LAorICAgMjA1LCAgLTEyNDgsICAgIDI0NiwgICAtNjAxLCAgICA1MzMsIC0xMjIwOSwgIC0yMjk4LCAgICA4MjYsCisgLTI3NjIsICAgICA0NSwgIDE1MTIzLCAgICA3MjEsICAgMTEyOCwgICAgNzk4LCAgIC02NzYsICAgIDM0OSwKKyAgLTE1MywgICAgMjYzLCAgICAgODksICAgLTg1NCwgICAgLTI0LCAgIC0zNTAsICAgLTIyNywgICAgMTU3LAorICAgNTg3LCAgIC0yNDAsICAgLTE4NSwgICAgNjYzLCAtMzIzMjgsICAgLTE0OCwgICAtMjA0LCAgLTIzOTYsCisgIC01OTcsICAgLTM0NCwgICA4MTA0LCAgIC0yODAsICAgLTM3NSwgICAgMjY0LCAgICA2NDgsICAgIDc0MSwKKyAgLTI5MCwgICAtMzIxLCAgICAyNjMsICAgLTU2OSwgICAtMzgxLCAgICAxNjcsICAgMTc1NywgLTI5NjM2LAorICAgIDMwLCAgICAzOTMsICAgIDM5OCwgICAgNTkwLCAgIC0yNDIsICAgICA4MSwgICAxNjAxLCAgIDM2ODMsCisgICA3ODcsICAgLTMzNiwgICAgNjc1LCAgLTEwODAsICAgLTcxMywgICAgMjYxLCAgMTg0MjAsICAgMTc2MCwKKyAgIDYwOSwgIC00NjEwLCAgIC01NTEsICAgMjc5MCwgIDE5ODA3LCAgIDEzNDcsICAgLTEyNSwgIC05NDEyLAorICAtMjYxLCAgICA1NDgsICAgMTA1NiwgICAgMTc5LCAgIC05MTcsICAgLTE4MSwgIDEyNjM3LCAgIC0yNjcsCisgICA2MjEsIC0xMTkwOCwgICAxMzY2LCAgICAgNzYsICAgNTg3NSwgICAtNzQyLCAgICAzOTQsICAgIDE1NSwKKyAgLTM3MCwgICAyNDgxLCAgICAgNDYsIC0xNTM5MiwgICAtMzQ0LCAgLTk3NTAsICAtMTM1MywgIC0yMjQyLAorIC0xNjg1LCAgLTEyODYsICAgMjMyMCwgIC0yMTc2LCAgLTE3MjksICAgIDcwNSwgIC0xNTgyLCAgIDE1OTAsCisgIDE2MDMsICAyMTEyOSwgIC0zNTU1LCAgIDIxOTIsICAgLTg4MywgICAzNDM4LCAgICAyMzMsICAgMTk2NSwKKyAgLTUzNywgICAgMzk5LCAgLTQ4MTgsICAtNDA4NSwgICAgNTU5LCAgIC0yOTIsICAgMTI5MCwgIC0yNzAwLAorICAgIDEwLCAgIC0zMDEsICAtMTg2NSwgICAgMjI2LCAgICAgNTIsICAtMTM0NiwgICAgMzA2LCAgICAzMTYsCistMTIyODEsICAgLTUyNSwgICAgMjg1LCAgIDk2MzEsICAgICAtMiwgICAtODQ5LCAgIDE2MjAsICAgIDEyOCwKKyAgIDE3NiwgIC0xMDIxLCAgIC00NzMsICAgNzkyOSwgICAtMTMzLCAgIDI0NTksICAgIC0zMywgIC0xNTE3LAorLTIyMDQ3LCAgLTIzMDAsICAgICA5OCwgIC0zNTEzLCAgICAzMzQsICAgNDYxNywgICAtMTkzLCAgLTEzMDksCisgLTEyNzksICAgIDczOCwgICAtNDQzLCAgICAgOTUsICAgIDQwNiwgICAgNjYwLCAgIC03MDUsICAgIC01NCwKKyAgIC0zOSwgIDI2Mzk2LCAgIC03NjYsICAgIDI0OSwgIC0yNDIzLCAgIDc3NTksICAgLTY4OSwgIC0zOTA5LAorLTE3NDA0LCAgICAgNjUsICAgMTg0OSwgICAgOTQ1LCAgMTU5MDcsICAgMTM4NiwgICAtNDMzLCAgIC04MzEsCisgLTYzNDksICAtMzkxOSwgICAxODcwLCAgIDgwOTYsICAgIDMxMSwgIDE1MDQzLCAgIDE3MDksICAgLTMxNSwKKyAgMTI4OCwgICA3NTIyLCAgIC0yMTUsICAtNTA3MiwgICAxMjQ2LCAgLTE0ODYsICAgMzc2MiwgICA0NTI2LAorICAxNTE3LCAgLTE5MzYsICAgLTU0MywgICAtMjYzLCAgICA3NzEsIC0xMDIxNSwgICAtNDI1LCAgLTUwOTgsCisgICAgNTksICAgLTI2NiwgIC0xMDEyLCAgIC0zODAsICAtMjEzMSwgICAgNjMwLCAgICA0MDUsICAgIDY2NSwKKyAtNDU1MCwgICAxNDAzLCAgICAgIDgsICAgIC00NiwgICAtODc5LCAgICAzOTgsICAgLTUzMiwgICAtMTg1LAorICAtMjg2LCAgICA5MjEsICAgIC02NSwgICAgMzc4LCAgICA2NjksICAgIDE3NCwgLTE1MjgwLCAgICAgOTEsCisgIC03NzYsICAgODQ4MCwgICAyNDYzLCAgICAxODQsICAgMjA2NSwgICAtNjY2LCAgIC01NjEsICAgNDEyMiwKKyAgIDU5NCwgICAgNzMyLCAgIDQwMDcsICAgLTg1MiwgICAgLTcxLCAgICAxOTQsICAgLTEyNiwgICAxNzY1LAorIC0xNTcwLCAgICA5NjgsICAgLTI1NywgICAtMjg4LCAgICA5NTAsICAyNzQ4MiwgICAtMzMzLCAgICAzNzAsCisgLTE0MjksICAgIDI4NSwgICAgNTU4LCAgMTEyNDUsICAgLTEzNSwgICAgNTY1LCAgIDEyOTYsICAgLTI2MSwKKyAgIC02MiwgICAgNjAwLCAgIDE0NTUsICAgMTQ1NywgICAgODIwLCAgICAzNTcsICAtMTIwMywgICAgMTY5LAorIDE2NjExLCAgIC04OTMsICAgIDM1OSwgICAgMjMxLCAgICA0MTgsICAgLTU0NywgICAgLTk1LCAgIDM4NjYsCisgIC01MTEsICAtNjM0NCwgICAtMjA1LCAgICA5MjMsICAgLTIzOSwgLTE2MjA1LCAgLTE2MTksICAgIDIxNywKKyAtMzM2MiwgIC02MzQyLCAgLTE1NTEsICAgIDY0OSwgICAtNDkyLCAgICAyNjQsICAgIC01NSwgICAgMTcwLAorIDE2OTkyLCAgICAtOTEsICAgIDMwNiwgICAgIDQzLCAgLTI3NzAsICAgIDU4MiwgIC0xNzQwLCAgICAgNzcsCisgIC04ODIsICAgIDI2OCwgICAtNTE1LCAgICAtNDUsICAtNjA5MywgICAgIDI0LCAgLTU1OTYsICAgOTAzNCwKKyAgIDI4NCwgICAzMjExLCAgICA4NDYsICAgMTE1OCwgIC0xMTE4LCAgIC02MDQsICAgLTUxNCwgICAxNDAyLAorICAtNDkzLCAgIC05MzgsICAtMzg5MiwgICAgMjQyLCAgICA2NDMsICAgMTQyMSwgICAtNDM0LCAgIC00MDYsCisgIC0xMDIsICAgIC04OCwgLTExNzMzLCAgICAxNjEsICAgIDUxOCwgICAgOTc4LCAgIDE1MDgsICAgIDI0OCwKKyAtMTAzNiwgICAxNDA3LCAgIC0zOTYsICAgIDI5MywgICAxMTU0LCAgLTE0MzUsICAgIDQ5NSwgICA4MjQzLAorICAgIDIwLCAgIC04NDUsICAtNTM3MywgICAgNjU5LCAgIDIzNjYsICAyOTE0OCwgICAgMTQ1LCAgICA2MDMsCisgIDQwODgsICAgLTI1MSwgIC0yODQxLCAgLTI1MjYsICAyMDY4MiwgIC0xMzU3LCAgLTI0NTQsICAgIDY2MCwKKyAgLTEyNSwgICAgMzQ3LCAgMTE3NzIsICAgLTExMywgICAtMzU3LCAgLTIxODEsICAtMTIzNCwgICAxOTA4LAorICAtNDMyLCAgMTY1NTUsICAgLTI0OCwgICAgODIyLCAgMTU1MTYsICAgLTE1OCwgICAtNjUzLCAgIDE1NzMsCisgICAgOTMsICAtMjczMCwgIC0xMTExLCAgICA5NTgsICAtMTU1MCwgIC0xMTUzLCAgICAgMTcsICAgIDYxMCwKKyAgIDc4MSwgICAtMzcyLCAgLTE2NDAsICAgIDE0NCwgICAtMTM1LCAgLTExNzEsICAyMjE0MCwgICAtNDI3LAorICAgLTI2LCAgICA2OTAsICAgLTgwMCwgIC0xNDk3LCAgIC0zMDAsICAgNTQzOCwgICAgMzkwLCAgMTEzMDQsCisgIDkyNTMsICAgMTA5OCwgICA1NTY0LCAgICAgLTksICAgMzg1NiwgICAgOTY1LCAgIDIwMTYsIC0xMjc5NywKKyAgMTY4NywgICAgOTE1LCAgIDM2ODcsICAgIDUzOSwgICAyNDk2LCAgICA3MDIsICAtMTMyNCwgICAgLTcxLAorLTEyOTU1LCAgIDc0NTYsICAgNDYyNiwgICAtODQ4LCAgLTE4MTUsICAgIDgzMSwgICAyMTUxLCAgIDc5MjEsCisgLTMwMDAsICAgIDEyMywgICAxMTg5LCAgLTE0ODksICAgIDIyMiwgICA0OTczLCAgIDE5MzYsICAgICA1NCwKKy0xMDUyNywgIC0xMjM4LCAgLTExNTcsICAgIDYyOCwgIDE0MTEyLCAgLTIxNjQsICAgMTQ3OCwgICAtOTg1LAorIC00MTAyLCAgICA2MzUsICAgIDIyNSwgICAtMzExLCAgIC02MDksICAtMTAxNSwgICAgMzAxLCAgICA1MDcsCisgICAtODUsICAgIDQ0MywgICAgMTg2LCAgIC01NTIsICAgLTcxMSwgLTE2OTg4LCAgLTEzMjcsICAgIDIyMCwKKyAgIDU2NSwgIC0xNjczLCAgIC01NDMsICAxODYzMywgICAgMzMxLCAgICAxMjcsICAgLTM0MiwgICAgIDIyLAorICAgLTc3LCAgIC0zNjAsICAgLTQzOSwgICAtNTAxLCAgLTE4NDgsICAtMTE0NywgICAtNDgzLCAgIDExMzMsCisgIC0zNTEsICAgICA0MSwgICAgOTA4LCAgICA1MDIsICAgLTY1OCwgICAgNDc0LCAgIC00MzAsIC0xMTM0OCwKKyAgICAtMSwgICAtNTMxLCAgICA0NTEsICAgIDcwOSwgICAgMjI3LCAgIC05NzgsICAgIDM0OCwgICAtMjY1LAorICAgMjY5LCAgIC0zNzYsICAgMjUxMSwgICAtMTg4LCAgIC0xMTEsICAgLTM4NywgICAgODA5LCAgIDEwMDksCisgIDE1NzAsICAgLTc1NSwgLTExNDYzLCAgICA2NjcsICAgLTg5NSwgICAgNDQ2LCAgICAyNzYsICAgIDE0NSwKKyAgLTUxMywgICAtMTE3LCAgIC00NjIsICAgLTM0MCwgICAxNDU3LCAgIC05NjMsICAgIDE5MSwgICAtNzg4LAorICAtMTUwLCAgIC05NzksICAgLTUwNywgLTI3NTQwLCAgICAxMjIsICAgIDM2OCwgICAgLTczLCAgMTAwNTEsCisgIC00NjUsICAgIDY0MiwgICAgNTA3LCAgLTY4MjgsICAgIDI0MSwgIC01MDI1LCAgIDE1OTgsICAtMTE3NCwKKyAgMjM3MywgIC0yMjcyLCAgLTE5MTAsICAgLTEwOCwgICAgIDE1LCAgICAxNjYsICAgICAgMiwgIDEwNTE4LAorICAgOTMzLCAtMTI3MTYsICAgIDUxMCwgICAgNzc4LCAgIC00MjQsICAgIDQxNCwgICA0ODk5LCAgICA3NTksCisgICA4NjIsICAgLTQzOCwgICAtODg2LCAgICA0NTcsICAgIDMwNCwgIDIzNjM5LCAgICAxMzYsICAgLTIwMywKKyAgIDQ3OCwgICAtNTY1LCAgICAyNDQsICAgLTU0MSwgICAyNDE5LCAgIC03NzMsICAgMTEwNywgICAtMjE3LAorICAxNTc5LCAgLTEwMzcsICAgIDQ3NiwgICAgLTk3LCAgICA5OTUsICAxNzk3MywgICAgMTYxLCAgMTY0NjYsCisgIC0xNzgsICAgLTcxOCwgIC0xNjA2LCAgICA5NDcsICAgMTk5MSwgICAyMjY2LCAgIDEyNDksICAgMjcwOCwKKyAgLTYxMSwgICAxNDI0LCAgIC0xNDIsICAgIC01MywgICAgIDM2LCAgICA1MDksICAyNjE1OSwgICAtMTQ0LAorICAgMzU3LCAgICAtMzcsICAgLTIzNCwgICAgNTg3LCAgICAzMTEsICAgLTUwOSwgIC0xNjM5LCAgIC0zMzIsCisgLTE2MTgsICAgLTM4MiwgICAgMzAyLCAgLTg2NTcsICAgIC02OCwgICAgLTMwLCAgICA1NDUsIC0xMjgzNCwKKyAgIDE1OCwgICAgMTU4LCAgICAxMzUsICAgIDYyMSwgICAtMzU0LCAgIC04NzEsICAgIDQ1MSwgICAxMjIwLAorICAgLTMxLCAgICAgIDIsIC0xMzQxNCwgICAgIDYwLCAgICAgIDMsICAgLTM4MCwgICAgNTQxLCAgICAtNDQsCisgICA1NTIsICAgLTM2NiwgICAgMTU1LCAgIC00NjIsICAgICA2MSwgICAtMjMyLCAtMTU0MjYsICAgIDMxNywKKyAgIDY4OCwgICAxMTIxLCAgIDI5MzMsICAgNzE1MSwgICAtMTY4LCAgLTkxNjcsICAtMjUyMSwgICAgNzQ1LAorICAyNzkyLCAtMTA0NDgsICAgIDU2OSwgIC0zODIzLCAgICA2MzAsICAtNDYyNiwgICAgLTk1LCAgIC00MTYsCisgICA4MjgsICAgIDI1OSwgICAgIDcyLCAgICAxNzEsICAgIDYzNSwgICAtMjUwLCAgIC0xMjgsICAgLTQyNiwKKyAgLTE1MywgICAgMjYwLCAgIC03NzEsICAgIDMxNCwgICAgMjM1LCAgICAgMjYsICAzMjI4MSwgICAtMzQzLAorICAgNzUxLCAgLTE0NDMsICAgIDMyNCwgICAtNjg0LCAgIDE5MDAsICAtMTMzNCwgICAyMDIyLCAgICAgMzAsCisgIDEwNzMsICAtMjQwNiwgICAyMDgwLCAgIC00ODUsICAgLTMyMCwgIDE1MzI4LCAgIC04NjAsICAgLTUyOSwKKy0xNjQ0NCwgICAtMjE5LCAgIDE3MzYsICAgLTE0OSwgICAtMTYwLCAgIC04MjgsICAgMTA4OSwgICAgNDEzLAorICAgMjQxLCAgIDM3MjAsICAgIC05MCwgICAgMTQ2LCAgIDExMDksICAgIDI0MywgICAtMzIxLCAgIC0yNTYsCisgICAtNjgsICAgICA4OCwgICAgLTUwLCAgICA1NzEsICAgMTE3OSwgLTI1MDMwLCAgICAxMDQsICAgIDkyOSwKKyAgICAzNSwgICAgNTI5LCAgICAxMTcsIC0xMzcyNCwgICAgNzM0LCAgLTEzNDQsICAgIDQ1NiwgICA1NTg2LAorICAxNTY2LCAtMTI1NzMsICAgLTg0MCwgIC0xNjE3LCAgLTI0OTQsICAgMTc5MSwgICAxOTAxLCAgIDMwNjYsCisgLTIxNTksICAgLTQxNCwgIC0zODU2LCAgLTk4OTQsICAtMTYwOCwgICAtNjU3LCAgMTUzNTUsICAgLTc3MywKKyAtOTIxNywgICAtNjU4LCAgIC05NzIsICAgNDczMCwgIC0yOTg2LCAgLTM0NzgsICAgLTc1NywgIC0xNDE2LAorIC0zNzAyLCAgMTgwODksICAgIDYyOSwgICA3MDYxLCAgICAxMjQsICAgNTg0MywgICAgMTU4LCAgMTkwMTcsCisgLTIyMDQsICAtNjk3NiwgICAxNjI5LCAgLTU2NTcsICAgMTEwMSwgIC0xODU5LCAgLTE0MjUsICAgLTU0OCwKKyAtMTEzMiwgIC01MDQzLCAgIDEwNzQsICAgLTU5MiwgICAtMTk2LCAgIDE5MDIsICAyMjcwNSwgIC0xMjI4LAorICAgMjE0LCAgIC02ODUsICAtMjAzNiwgIC0yMzY4LCAgIC0zMTUsICAgLTkxNCwgICAgNTMzLCAgICAyMTgsCisgIDEwOTEsICAgLTYyNywgICAyMDMxLCAgMTM5MjIsICAgIDEwNCwgICAtNDUwLCAgIDQ0OTQsICAgLTQ5OCwKKyAgLTM2MSwgIDI0NzM0LCAgICA2MjMsICAgMTAyOSwgICAyNDM3LCAgLTExMjMsICAtNTA5MiwgIC02NTUxLAorICAgNDM4LCAgMTY1NjIsICAgIDM3NSwgLTEzMTAyLCAgIC0xOTMsICAtMjAwNCwgICAzNTU2LCAgICAxNzksCisgIDE4MzIsICAgMjA4NiwgICAgNzk4LCAgIC01MzQsICAgLTE5NSwgIC03MTA1LCAgICA3OTYsICAgMzk2OSwKKy0xMjI2OSwgICAxNTcwLCAgIDQyNzMsICAtMjY5MiwgICAxMjQwLCAgLTI5MDEsICAtMjA0NSwgIC0yNDUzLAorICAgMzcyLCAgICA2MTMsICAgLTU0OCwgICAtMjQ1LCAgICA2ODcsICAgIDI1OCwgIC04OTY0LCAgLTE1MDAsCisgLTE1MTksICAgLTk5MywgIDE3NTcxLCAgIC0zNTcsICAgIDkxNiwgIC0xMjAyLCAgIDE3NTIsICAgMjA4MSwKKyAgLTUzNiwgIC0zMTg1LCAgLTEwNjIsICAxOTMzNSwgICAgNzIxLCAgLTk5NTgsICAgMTA1MiwgICAtODcyLAorICAgMjQ4LCAgLTMxMzMsICAgIDQ1NiwgICAxNjQxLCAgICAxNDksICAgIC0xMSwgICAyOTU1LCAgICAzMTAsCisgLTMxNzgsIC0xODgyMywgICAgNDk3LCAgIC05NzEsICAtNjU4NywgIC0xMzgwLCAgICAzNTEsICAgIDEwNiwKKyAgIC00MywgICAgNjA3LCAgLTQ3NTQsICAgIDIxMywgICAxMDMwLCAgIDUzNzcsICAgLTgwNCwgIC0yNTU3LAorICAgODUwLCAgIDEwODEsICAgLTcwNiwgICAxMzI1LCAtMTQ5MjIsICAgLTc5NCwgLTE0MDYwLCAgLTE5NTMsCisgICA4OTEsICAtMzI5NiwgICAgMzI5LCAgIC01MTAsICAtMTEyNiwgICAxMTEzLCAgIDE3NTMsICAgLTQxMSwKKyAgMTc2OSwgICAgNDI5LCAgIC0xODUsICAtMTAyMCwgICAgMTk0LCAgIC0xMDYsICAxMTQ3MCwgICAtNTkxLAorICAtMjcyLCAgICA0MjIsICAgIDMzNywgICAgNTI0LCAgIC0xNTAsICAgIDgyMiwgICAgIDUxLCAgIC0xMjAsCisgIDcxOTMsICAgIDgwMiwgICAgNjQwLCAgIC0xNDAsICAgIC00MiwgIDI4MTI1LCAgLTEwMjAsICAgIDI4NSwKKyAgLTQ2NSwgICAzMTk1LCAgICAgNjksICAgIDQ4MiwgICAtOTUzLCAgICAyNjIsICAtNzY3MiwgICAtMzczLAorICA1MTU4LCAgIDU2MjUsICAtMzAwMywgICAgNTUwLCAgIDUzNzEsICAgNTYxOSwgIC0yMjAwLCAgIDUzOTIsCisgIC04MDQsICAgIDEzNSwgICAxMzAwLCAgLTM2MTAsICAgIC0yMywgICAtNDMzLCAgMTM1MDMsICAgIDIyNCwKKyAgIDkxMSwgLTE0NDIxLCAgIC01MDIsICAtMjE1MSwgIC0xNjY3LCAgLTE5MzMsICAgMjg4OCwgICAtMjc3LAorICAgNTQ3LCAgIC05ODksICAgMzExNSwgICAgLTMyLCAgIC02ODAsICAgLTE2NCwgICAgODA0LCAgICA0MTIsCisgICAgNjIsICAgLTE1NCwgICAtMTkwLCAgICAxNTYsIC0xMDkzOCwgICAtMzYwLCAgICAtODgsICAgIDg0MywKKyAgIDMyOCwgICAtNzczLCAgIC0yNjcsIC0xMjY2OCwgICAgODU2LCAgIDE0OTYsICAgLTI0MywgICAtNTg2LAorICAgNzM2LCAgLTIxNzUsICAgLTY3NywgIC0zMDY5LCAgIDc0ODAsICAtMTc2NCwgIC00MDI0LCAgLTI1NjksCisgIDE4MDUsICAgIDE5NCwgIC02ODE0LCAgLTExMzUsICAgLTIzNywgICAyNjgyLCAgIC0xNTYsICAgLTg5MCwKKyAgMTI4NSwgICAgMzY4LCAgIDE4MDIsICAgLTY4MywgICAtMTYzLCAgIDExOTEsIC0xMzA2MywgICAtNDk2LAorICAtMzM1LCAgMTc0ODIsICAgIDc0NiwgICAgODE4LCAgICAgNDgsICAyMTQxOSwgICAtNTk4LCAgLTE3NTMsCisgLTExNjksICAtMjEzNSwgICAgIDQwLCAgLTkxMTQsICAgIDU5MiwgIC0zOTEyLCAgIDE5ODAsICAgLTI2NCwKKyAgLTMwNCwgICA4MTM4LCAgIC0xODUsICAgIDI4NiwgIC0zMDI0LCAgICAgNDgsICAtMTYzMCwgICAgOTA5LAorICAgNjYxLCAgIC02NjIsICAxODA4NSwgICAgMjQwLCAgIC0yMDEsICAgICA2OSwgICAgMTkyLCAgICAzMDUsCistMjIxNjcsICAgIDY5MiwgIC0xMTM1LCAgIC05OTYsICAgIDM5OCwgICAgLTc0LCAgMTg1NTMsICAgLTk1OCwKKyAgMTIyMywgIC01NTc4LCAgICA1MDgsICAgLTM1MiwgICAxMjM0LCAgIC00NTAsICAgIDQ5NywgICAgNzgwLAorICAgIDc5LCAgICAgNTEsICAgLTIyMSwgICAgMjU1LCAgICAtMjYsICAxMzM1MiwgICAtMTcwLCAgICAyMzEsCisgICA1OTAsICAgIDE2OSwgICAtNzMzLCAgIC04MTIsICAgIC02NSwgICAtMjE5LCAtMjA5MzksICAgIDIwMCwKKyAgICAzNSwgICAtMTc3LCAgIC00NTQsICAgIDYzMiwgICAtMjY3LCAgIC00MDcsICAgLTEyMCwgICAgNjIzLAorICAtMTc2LCAgIC02NjQsICAgIDcxNSwgICAgLTIzLCAgICAzMTgsICAgIDE0OCwgICAxMTI1LCAgICAgMTYsCisgICA3MDksIC0yMTY4NywgICAtMjMwLCAgIC00MTMsICAgMTM5OCwgIC0xMjM1LCAgIC0yODMsICAgMTYxNSwKKyAgIDE3NSwgICAtMjk5LCAgICAzNDksICAgIDQwMCwgICAtMTEyLCAgMjE3NjIsICAgLTY2NSwgICAgMzY0LAorICAxMDg5LCAgIDEzMDMsICAgIC01NCwgICAgNTIzLCAgIC0zODEsICAtMTMxMiwgICAgIDQ4LCAgIC04ODYsCisgLTEyNjAsICAgIDQwOCwgICAgNDE1LCAgLTgzNDksICAgNzExNSwgICAgMTgwLCAgIC03NzQsICAgMzUwOCwKKyAgLTk3MSwgICAtMjU1LCAgIC0xOTUsICAgICA4MSwgIC0yNjc0LCAgIC05NzcsICAgLTM1NSwgIC0xNTAwLAorICAgMTc4LCAgLTIwODEsICAtNDQzMiwgIC0xMDE0LCAgICAzNDAsICAgNTgxOCwgICAgMTM4LCAgIC0xMDYsCisgMTY5MTcsICAgMTIwMywgICAgMzQ5LCAgIDMyNzEsICAgIDk2MSwgICAgMzYzLCAgIDYwMDgsICAtNjA0MywKKyAgMzczNiwgICAtNzMwLCAgLTQyMDEsICAgLTUxNCwgIC02MTMxLCAgICAtNjgsIC0xNDkzNSwgIC0xNzgxLAorIC0zODk4LCAgICAtNDAsIC0xODk0NCwgICAtNDYxLCAgLTE2OTQsICAtMTI2OSwgICAtNzU1LCAgICAtODEsCisgIDIzNjksICAgIDQ4NCwgICAgNTMxLCAgMTQxMTQsICAgICA4NSwgICAgIDMyLCAtMTAxNDIsICAgLTE0MiwKKyAgIDYwMCwgIC0yMzc0LCAgICAzNzUsICAgIDY3NSwgIC0yNjYzLCAgICAxNTUsICAgLTk0NywgICA2NDI3LAorIDExNDc2LCAgIDEyNTMsICAgNTA0OSwgICAxMDYzLCAgIDIwMDMsICAtMTYwOCwgICAyNDYzLCAgLTIxNjgsCisgLTExMjgsICAgMTA3OSwgICAgMzgzLCAgIC05OTYsICAgIDM2OCwgICAxMjA4LCAgLTM1NTQsICAgLTk1OSwKKyAgNDU5NiwgIC0xMjA5LCAgLTQxNTQsICAgMTI3MCwgICA5MzY1LCAgLTI3NzUsICAtMTc1MSwgICAgOTk4LAorLTIwMDIzLCAgIC0zNDcsICAgMTUwNSwgICAgMjE4LCAgIC0xNDIsICAgIDM0MiwgICAtMTI4LCAgIC01MjMsCisgIC0xNTksICAgICA3NSwgICAtNDY3LCAgICAyNTcsICAgLTEzMywgICAtMTQyLCAgICA3MTIsICAgLTYyMSwKKyAgIDQyOCwgLTI5NTg0LCAgICAgMTMsICAgIDQwMiwgICAtNDU1LCAgICAxMTksICAgLTQ4MywgICAxMTIxLAorICAtNDYxLCAgICA5NjAsICAgIDgwNywgICAgLTQ2LCAgICAyOTcsICAxNDg1NiwgICAgMjIxLCAgIC0zNTYsCisgICAyMjEsICAxNTAzNywgIC00NzQ0LCAgLTI1NTUsICAgIDQ0NywgIC0xNDE4LCAgIDE0NjQsICAgMTM5MSwKKyAtMTQwNCwgIC01ODEyLCAgICA1MTIsICAtMjMyMSwgICA5ODgyLCAgICAyNDIsICAtMjI5OCwgICAtMTM3LAorICAtODQ5LCAgLTMxODIsICAgOTM5NCwgICAxNDEyLCAgIDEwNTIsICAgMTM2OSwgICAtOTA0LCAgIC00OTQsCisgIC0yMzEsICAgMTExMywgICAxMDg3LCAtMTMzMTcsICAgIDc2OCwgIC0xMTc4LCAgLTMwMTEsICAgICAyNCwKKyAgIDIyOSwgICAgMTY0LCAtMTAxNzAsICAgIDMyOCwgICAgMzA4LCAgIC01OTEsICAgIDIxMywgICAtNTQzLAorICAgLTgyLCAgIC03OTAsICAgLTg3NSwgICAgNzk0LCAgIC01NTgsICAtNzY1MSwgICAtNTczLCAgIDEyNjYsCisgLTIwODQsICAgMjI3NSwgICAtMTg3LCAgICAgOTcsICAgIDM4NCwgLTExODMwLCAgIC0xODUsICAgLTQ3MiwKKyAgMTM2NSwgIDExNjM2LCAgLTE0MDUsICAgIDM2MCwgICAtNDg3LCAgIC00NDAsICAtMTgyMCwgICAtMzQ5LAorICAtMjkzLCAgICAyODUsICAgICAyNSwgICAtMTM5LCAgIC00MTUsICAgLTU0MCwgICAtMTA4LCAgIDExMzYsCisgIC02NzMsICAgIDIzMCwgIDE5MjAyLCAgIC01NDUsICAgLTU0MiwgICAgOTE5LCAgIDEyMjEsICAgLTUxOCwKKyAgIDE5NiwgLTIxOTAwLCAgICA3OTUsICAgIDExNSwgICAgLTE2LCAgICA0NTksICAgMzMzOSwgICAtMzQ3LAorICAtMzQ2LCAgIC0xODYsICAgLTY5NSwgICAtMjY3LCAgIC03MTQsICAgIDE4NSwgICAgMjY2LCAgLTEyMTgsCisgICAxMjAsICAgLTI0OSwgICAgMjMzLCAgIC0xMTAsIC0zMDQxMiwgICAgMjg1LCAgICAyMTksICAgMjI1NiwKKyAgIDUzNiwgICAtNDQyLCAgICA2NzMsICAtMTQ4NywgICAtNDc3LCAgICAtNjAsICAtMTgwNiwgICAgMTgzLAorIC03MTk1LCAgIC01NzcsICAgMjIzMCwgIC03NTk0LCAgLTMyMzAsICAgICA2NSwgIDIyOTYzLCAgICAxMTEsCisgICAzOTAsICAgNzEzNCwgIC0zNzE2LCAgLTUxMjMsICAgLTQ3NSwgICAgLTMyLCAgICAtOTgsICAgLTQ2NiwKKyAgLTExOCwgICAgLTQzLCAgICAgNzQsICAtMTA3MSwgICAtOTAyLCAgIDE3MTQsICAgNDAwNCwgICAgIDI2LAorICAgIDk3LCAgIDE2ODAsICAgIDQyMywgICAgMjUyLCAgIDk2NjcsICAgIDU1MCwgICAgMzU0LCAgIC0yMjIsCisgICAgMTksICAgLTIyNCwgICAtODA3LCAgICAzNjUsICAgIDU5MywgICAgMzYzLCAgIC04NTEsICAgIC0yOCwKKyAgIDU1MywgICAgMjM4LCAgIC00ODEsICAgIDc2OSwgICAgMjc5LCAgMTgzNjcsICAgLTQ2MiwgICAgMjg2LAorICA0ODI1LCAgIC0xNDEsICAgIDUwMCwgIDIwMzgzLCAgIDE2MTgsICAgIC0zMSwgICAtNTE0LCAgLTI0ODQsCisgIC0zMjcsICAtODUwNiwgICAtNzA1LCAgIC04NzIsICAgIDUzMCwgIC05OTk3LCAgICAtMzYsICAgLTQzMSwKKyAgMjgyNCwgICAzMTg1LCAgIDE3MTIsICAgLTMxOCwgICA5NTEzLCAtMTAwNjUsICAgIDYxNCwgICAtNTAzLAorICAgMzg5LCAgMTI4MzAsICAgLTExMywgICAgLTE1LCAgLTEwMDcsICAgLTUyMywgIC0xMjkzLCAgLTIxMDIsCisgIC01NDMsICAtMTE1NywgICAtNTgzLCAgIDEyMjgsICAgIDI2MiwgICAtNjc0LCAgLTE4NDcsICAgLTI0MiwKKyAgIDI5OSwgLTEyMDI1LCAgICA1NDcsICAgLTU5MSwgIC05MTczLCAgICAyNzUsICAgIDQxMiwgICAyNDkzLAorICAgOTk3LCAgIDEyMjksICAgMTk4MiwgIDI3NTU0LCAgICAyNDUsICAgIDEwNiwgIC0xMzIwLCAgIC0xNTMsCisgIC00MjMsICAgLTk1NSwgICAtNDQ5LCAgICAzOTIsICAgIDgyNCwgICAgNzk2LCAgLTExODEsICAgMTY0MCwKKyAgLTg4NCwgICAgLTcwLCAgIDg3ODksICAxMDAyMSwgIC0xODA2LCAgIDEwMTksICAgICA5MCwgICAxNDk0LAorICAyMDcxLCAgIC05MTEsICAtMTE1OSwgICAgMjEyLCAgIDIyMDcsICAgLTk5NCwgIC0yNTAwLCAgIC00OTcsCisgICAgOTIsIC0xMTU0NCwgICAtMzk4LCAgIC03NzQsICAgMTQ3NCwgICAgIDMyLCAgIC02NzEsICAgLTE3MSwKKyAtMTI1MCwgICAtMjQ5LCAgIDExNjEsICAgLTY1NCwgICAtMjA1LCAgICAtMzYsICAgMTczMywgICAgNzYzCit9LAorCisuc2hhcGUyMl8xID0geworICAgOTg3LCAgICAgLTYsICAgLTYyMSwgICAtMjIwLCAgLTI0MzgsICAgLTM4NywgICAtNTM1LCAgICAtMjMsCisgIC05MzQsICAgIC02OCwgIC00OTg1LCAgICA1NzUsICAgIDQ4MywgICA3MjQzLCAgLTEwNzUsICAgIDkxNywKKyAgMTczOSwgIC0xODMyLCAgIC01ODAsICAgMTU2NCwgICAgMTMxLCAgIC0xODAsICAtMTI3MSwgICAzNjcyLAorICAgMTYxLCAgIDEwNDAsICAgMTczNywgICAyNzE5LCAgIDExMDEsICAgLTE4NSwgIC0xNDEwLCAgICAyMjEsCisgIC00MjIsICAtODY3NSwgICAtNzUzLCAgIC00MDEsICAtNTM4OCwgICAgIDEzLCAgICA3NjIsICAgMTM3OCwKKyAgMTExMywgICAxNzY4LCAgIC0xNzcsICAgMzM5NywgICAyMTYyLCAgICAyNjcsICAgMjI2MSwgICAtMTU2LAorICAxNzA4LCAgIC04NDgsICAgIC03OSwgIC0xODE5LCAgLTMxNTksICAtNTU0OCwgICAtNzQ1LCAgIDcyMDgsCisgLTEwMzksICAgNzU1NSwgICAtMTM0LCAgIDI2NjEsICAtMjExMiwgICAyMjcwLCAgLTE5OTEsICAgIDQ0MSwKKyAtNjI0OCwgICAgMjQ2LCAgICAxNjYsICAgMjA5MiwgIC0xNDAyLCAgIC0yNDIsIC0xMzYwMCwgICAtNTM5LAorICAgMzkxLCAgIDIzOTUsICAxMTAwMSwgICAtOTgxLCAgMTA5MDYsICAgLTQwMywgICAgODIzLCAgIDE2NDcsCisgIC0yOTQsICAgICA5MywgICAgNTA0LCAgLTU0NDgsICAgMTIxMywgIC0xODQ5LCAgLTMwNzcsICAgIDc5MCwKKyAgLTg0MSwgIDEyODEyLCAtMTEyNjYsICAtMTg4MiwgICAtODA1LCAgIC0yNzQsICAgMTk2OCwgICAgLTQ5LAorICAxMTg5LCAgICAtODAsICAgLTI4MSwgICAgLTQwLCAgICA0MDksICAgMjQyMywgICAgNTgxLCAgLTEzNjIsCisgICAyMDcsICAgLTg2OSwgICAtNTg5LCAgIDMyOTQsICAgLTMxOCwgIC00NTkyLCAgIC00NzYsICAgMTAxNCwKKyAgLTEzNSwgLTE3OTk5LCAgIC0xOTQsICAgIDgwNywgIC0yOTQ2LCAgIC0yMjIsICAgICA0NCwgICAtNTE0LAorIC00NDA3LCAgLTEyMDEsICAgMTE1NSwgICAtMjM1LCAgICAgOTgsICAgNDQzMiwgICAtMzQyLCAgIDIzODYsCisgIDE0MDIsICAgLTk1NiwgICAzMzU3LCAgIDE5NTksICAgNDc5MCwgICAtMTM5LCAgLTM0OTQsICAtNDI4MCwKKyAgLTU4OSwgIC04NDIyLCAgICAzNjMsICAgLTc0NiwgICAgNjQwLCAgIC0zNjAsICAtMTAwNywgIC0xMTAwLAorIC03OTg5LCAtMTI2MzAsICAgMTAwNiwgIC0xNjA4LCAgIC04NjQsICAgLTIyNiwgICAtOTE1LCAgLTIwMzIsCisgIDEyNzQsICAgIDU5NiwgICAxODY0LCAgIDEwNjcsICAgMTU5NywgICAgNDYwLCAgLTIwMDMsICAtNTU2MCwKKyAtODAyMCwgICAyMzU0LCAgICAzNzksICAtMzE1MSwgICAgIDQ0LCAgIDcwMjQsICAgLTY5OCwgIC0yOTAxLAorICA0OTc2LCAgICA5MjcsICAgMTIyMywgICAgLTkzLCAgICAxNzIsICAgIDE4OSwgICA2NjM5LCAgLTYwODIsCisgIC03MjYsICAgLTUyNCwgIC0zMDY4LCAgLTM4MDIsICAgICAxNiwgIC0xMDM5LCAgIC0xMDUsICAgMjMzMywKKyAgLTM1MCwgICAtMzA2LCAgIC0zNzksICAgLTgzMiwgICAxMjgyLCAgICAgNTYsICAgMzUyOSwgICAgNTYyLAorICAtNjAzLCAgIDU5NTQsICAgIDI5NCwgIC0xMjY1LCAgIDgwNDUsICAtMzk5MCwgICAtMTY5LCAgIC0xMjMsCisgLTMyNjcsICAgIDU3MiwgICAtODc5LCAgIDE1NjIsICAtMTE4NSwgICAgNzk5LCAgLTk1ODksICAgIDQwNywKKyAgLTU5MCwgICAgIDY1LCAgLTI4NDgsICAgIDQzMywgIC01NTQ3LCAgICAtMTksICAgNzE4MCwgIC03OTA0LAorICAtMzkyLCAgICAzMjMsICAgLTQ0OCwgIC00NDgxLCAgLTM3NzMsICAtNTI4NiwgICAxOTU3LCAgICAyMjYsCisgLTIwNDAsICAgMzI5MiwgICAyOTg3LCAgLTE3MDQsICAgMjgzNSwgICAtMTQ5LCAgIDE0MzUsICAgIDgyMywKKyAgMTc3NSwgIC0yNzY5LCAgICAxNDYsICAgIDIzNCwgICAtMTMxLCAgICAtMTUsICAgIDI2OCwgICAgIDM3LAorICAgMTM5LCAgICAgMjIsICAgLTE5NiwgICAgIDkxLCAgLTM1MDMsICAtNTQyMSwgICAgIDI0LCAgIC0yODAsCisgICAgNTgsICAgIDM3MCwgICAgNjU1LCAgIDE0MTIsICAgIDExMywgICAgMzA2LCAgMTY0MDQsICAgLTIzNCwKKyAgIDMxNSwgICAtOTU3LCAgICAgNzIsICAtMTEyOSwgICAxOTkzLCAtMTg3MTksICAtMTQxNSwgICAxMzQ5LAorICAyMzQwLCAgICA1NDEsICAgIDMxMywgIC0xMzYwLCAgICAgMzEsICAgMTQ0MSwgICAgLTc4LCAgLTk5MDUsCisgIC0zOTMsICAgIDM2NywgICAtNzEyLCAgLTIwMDksICAgIDM3MiwgICAtMjk3LCAgIC0xMjMsICAgIDMwMywKKyAgLTQ1OCwgICAtMzIzLCAgICAgNDYsICAgODcwMSwgIC0xMzAxLCAgLTg3NjgsICAgIC00MywgICAxODE4LAorICAgMjEyLCAgIC01NDMsICAtNTA3NywgIC04MDM3LCAgLTI1MzYsICAgIDcwMiwgICAgNzkyLCAgIC0zODEsCisgIC0yNzIsICAgMTk0MSwgICA2MzIwLCAgLTE4NzEsIC0xMzkzOCwgICAtMjYyLCAgLTIwNjMsICAgIDEwOCwKKyAgLTg2MSwgICAgNDg1LCAgIC00NDAsICAgIDc2OCwgICA1NjY1LCAgIC0zMDIsICAgIDMwNSwgLTEzNzg0LAorICAyODg5LCAgIC0xMjcsICAgIC05NCwgICAgMTQ1LCAgIDEzMDgsICAgNzkxMSwgIC04Mzc2LCAgIC02NDMsCisgIC01OTYsICAgMTM1NywgICAtOTQzLCAgIDEzMjksICAgIC04NCwgICAgLTYyLCAgIDE2NTEsICAgIDM5MSwKKyAtMjI5NSwgIC01NDU2LCAgIC0zNTcsICAtNDYxMSwgICAxMzYxLCAgIDM5NjEsICAgLTI5NSwgICAgNjQyLAorICAtNjk4LCAgIDg2MTQsICAgMTYxMywgICAtNTI2LCAgIC0xMjAsICAgLTIwNSwgICAgIDE3LCAtMjAxNzEsCisgIDEyNTIsICAgLTI2MSwgICAgNTM1LCAgLTEyNDQsICAgICA5MiwgICAtMzE1LCAgICA4NzgsICAgIDM4MCwKKyAgIDE1NywgICAzMjE3LCAgIC00OTMsICAgLTc3MywgICAgNTEzLCAgIC01MTAsICAxMTMwNCwgICAtODk5LAorICAgLTI3LCAgICAzOTgsICAtNjM4NiwgICAgNjU5LCAgLTEwMDEsICAtMjczNywgLTEzMjk1LCAgIDEyMTksCisgLTEwMTQsICAgLTE5MywgICAgNDQ1LCAgLTIzOTMsICAgIDM0NCwgICAgLTI1LCAgIC01OTksICAtMjg0OCwKKyAgIDg4NCwgICAgIDk0LCAgICAtMTEsICAgLTU2NCwgICAgLTM2LCAgIDk5MzksICAtMzUzMCwgICAgNDYyLAorICAtOTQyLCAgMTAwODksICAgIDgyNCwgICAyOTk0LCAgIC0yOTMsICAgICA3MSwgIDEwMTY3LCAgIC00NTcsCisgICA3MTEsICAgLTk2NCwgIC0yMTI4LCAgIDI1MzAsICAgIDE2MCwgIC0yNTU4LCAgIDI0NTEsICAgMTY1NCwKKyAtMzgyOCwgICAxNTYwLCAgICA4NzksICAtMTAyMywgIC04MzU0LCAgICA4NTEsICAgIC03NywgICAtMTEyLAorIDE5NTcyLCAgIDIwMTAsICAtMTA3NywgIC0xMzI5LCAgLTEyODIsICAgMTI3NywgICAgMjUyLCAgLTU2MjIsCisgIDQ2MTcsICAgICA1OCwgIC0yMzE1LCAgIC00NTksICAtMTI0OSwgICAgIDkyLCAgICA3MDgsICAgLTczNywKKyAtMzMyMywgICAgMTgyLCAgIDE1NTcsICAgLTY1NywgICAgNTQ2LCAgIC00NDcsICAxOTExNywgICAxNjQ1LAorICAtMzM2LCAgICAtMjYsICAtMjA0MSwgICA1OTI2LCAgIDQ3NDYsICAtMTg2NiwgICAzOTIyLCAgIDI3OTgsCisgIDUzMjAsICAgICAgNywgICAgNDcwLCAgICA4NDIsICAgIDIyOSwgICAtNTY3LCAgICA3NDIsICAtMzMwNiwKKyAgIDY1OSwgICAtODcxLCAgIC0yMjYsICAtMjU5MywgIC0xMDAzLCAgLTEzNzMsICAgIDU5NSwgICAtNzY4LAorIDIwNjU4LCAgICA5NDQsICAgMTIyOCwgICAgMjc5LCAgLTE1MzEsICAgLTYxOCwgICAgMzYxLCAgLTQwMTksCisgIC0zNDMsICAgLTM1MSwgICA3MTQzLCAgICAyOTMsICAgICA5MiwgIC0yNzEzLCAgIC0yNjksICAgIC0zMCwKKyAgLTMzMiwgICA0MDkzLCAgICAyMTYsICAgIDIzOSwgICAtNTYzLCAgIDE5NDMsICAgLTk0NCwgIC0yMjY4LAorICAgIDcwLCAgIC0yMDksICAgIDQ0MCwgICAxNDkzLCAgIC00NDYsICAgIDQ5MSwgICAtMzYyLCAgICAgMjUsCisgIC0zMzEsICAgIDQzMywgIC0xNTg1LCAgICAxNzMsICAgMTEyNiwgIC0zNjE0LCAgIC0yMzQsICAtMjY0OSwKKyAgMTE4MSwgICAtNjQxLCAgIC0xNjAsICAgMzcyNywgICAtODQxLCAgLTIxMzQsICAtMTM5NiwgIC01NzU4LAorICAgLTE0LCAgICAzNjQsICAtNDY1MSwgICAxMTUxLCAgICAxOTQsICAtNTIzNCwgICA1ODc4LCAgLTEzNDgsCisgLTEzODgsICAgLTIzMywgICAzODEwLCAgIC04NjAsICAgOTQ3OSwgICAgLTI0LCAgLTY2MTYsICAgMTM4NywKKyAgLTQ1NSwgICAgNDQ3LCAgIC0yMjQsICAtMjk5NywgICAgIDEyLCAgIDM1MDIsICAgIC03MywgICAgNDcwLAorIC05MTcwLCAgIDE2NzcsICAgLTc0MCwgICAtNTkyLCAgLTE2MzgsICAgIDY3NSwgICAgLTkzLCAtMTc4NDIsCisgIDE3NTAsICAgLTg0NywgICAgOTkzLCAgLTIzOTMsICAgIC00OSwgIC0yMDI5LCAgIDE5NDAsICAgIDU4OCwKKyAgIDQ3NSwgIC0zNDY3LCAgICAgNTUsICAgNTA4NywgICAyOTg5LCAgICAzODAsICAgIDkxNSwgIC0yNzgyLAorICAyNDE4LCAgMTEzMDMsICAgMTA5OCwgICAxMDA5LCAgIDEzNzIsICAtNTc4MCwgICAtMzAzLCAgIDE0NTEsCisgICA5NzIsICAtNzQzMywgICAtNTcxLCAgIDE2NjEsICAgICA2NCwgIDEwMjY1LCAgIDE1NDEsICAgIC01MCwKKyAgLTk2NCwgICAtNzM4LCAgIC0yNTMsICAtMzEwNSwgICAtNjk1LCAgIC01NDYsICAgLTc3NSwgLTE4OTcxLAorIC0zMDk0LCAgLTIzNzksICAgIDczOCwgICAxNjI1LCAgICA2MjMsICAgMTA3MywgICAgNzgyLCAgICA3MjMsCisgLTM0MTcsICAgLTU3OCwgICAtMTg5LCAgIDQxMDgsICAgMTExNSwgIC0xMjIyLCAgLTkxMDIsICAtNDczNiwKKyAgIDM0NywgICAgOTQ2LCAgICAzMjIsICAtMzY5OSwgICAgMTkzLCAtMTUxMzksICAgIDM2NywgICAgOTY5LAorICAtNzg4LCAgIC02OTQsICAgLTYyMCwgICAgLTI2LCAgICAtMTYsICAgICAgNCwgICAtNDc4LCAgMjA3OTIsCisgLTExNzUsICAgLTIzMSwgICAyNTY2LCAgLTEyNzAsICAgIDE2MiwgICAgMTgxLCAgLTE0NTEsICAtNTM3MCwKKyAtMjQyOSwgIC04OTEwLCAgLTM3OTQsICAtNTgwNywgIC0xNjU1LCAgICAyNDgsICAgNDQzMiwgICAxMzkzLAorIC0yNDUxLCAgLTI3MDYsICAgLTc0NCwgICAgNjg3LCAgICA4NDIsICAtMTI4MSwgICAyOTYwLCAgLTIzNDgsCisgICAxNTMsICAtMTY3MSwgIC0xNDMzLCAgLTEyNTAsICAtMTA5NiwgICAyNTAxLCAgLTUzOTMsICAgNDI2NiwKKyAtMTA5OCwgICAgODgwLCAgLTEyMTUsICAgIDgxNywgICAtNDQzLCAgMTAwNTMsICAgIDcwNSwgICAtNjg5LAorIC0yNjc5LCAgLTEyMDUsICAtMzMwMiwgICAtODA5LCAgIC05MTgsICAtMTAwNSwgICAgMTI0LCAgIC0zMjksCisgICAxMDgsICAgIC01MiwgIC01MzA1LCAgIC00MTksICAgIDEyOCwgIC04MTM3LCAgIDE0MjcsICAgIDM4NywKKyAgLTIzNSwgIC0yNTgyLCAgICAxOTAsICAgLTE3MywgIC0xMDMxLCAgIDI2NzIsICAgLTk4NSwgICAzMzA5LAorIC01OTI3LCAgIDczMjcsICAtODQ2MywgICAgIC0yLCAgIDYwMzUsICAgIDc0MywgICAgNTUyLCAgICAtMTQsCisgIC01ODAsICAgIC02OCwgLTExODg2LCAgICA0NzYsICAgICA2MSwgICAxMTcyLCAgIC01MjksICAgLTk4OCwKKyAgIDg3MSwgICAtNzc2LCAgIC0zMzIsICAyMDg3MCwgICAgMzg0LCAgIDc3OTUsIC0xMDgzMCwgICAgNzIzLAorICAxNjkwLCAgIC01MTksICAgIDk2MiwgICAgNjYzLCAgIDEzMDAsICAgLTQ2NSwgICAgIDQ3LCAgLTM1NzgsCisgICAgNTYsICAtODEzMSwgICAyMDQxLCAgLTg1MjQsICAtMTMwMywgICA2MzQ5LCAgIDE5MDMsICAtNjcyNiwKKyAgMTE1NiwgICAtMjI0LCAgIDEyODYsICAtMjM1NSwgIC0zNDE1LCAgICA5ODUsICAgLTUwMiwgIC0yNDc0LAorICAgIDQ5LCAgLTI3ODksICAtMzYxNiwgIC0xNzA3LCAgIDMzNjMsICAgLTE0MCwgICAxNzAyLCAgLTE5MTksCistMTE1MTgsICAgLTQwNCwgICAgIDYyLCAgLTY5MzMsICAtMTE4NywgIDEwODMwLCAgICAxMzIsICAgIDI4NCwKKyAgLTYzOSwgICAxMzQ5LCAgIDIzNjcsICAgLTMxMSwgICAtNjI2LCAgICA3NDUsICAgNTY2MCwgICAtMTUyLAorICAtMTIxLCAgLTUyMzYsICAgLTQ4MSwgICA1ODg5LCAgLTEyNjMsICAtODQ0MywgICAgLTMzLCAgICA5MzYsCisgICA0MjMsICAgLTExNywgICAgMTExLCAgLTEwNTUsICAgLTEwMywgICAtMzIxLCAgIDEyODYsICAgLTYxMSwKKyAgIDc3NywgICAgODI3LCAgICA0MjIsICAgLTE2MiwgIC02NzY3LCAgIC0yNDEsICAgIDI4OSwgICAtNDQxLAorIC0xMzQ0LCAgIDI3MDYsICAtMTI2MCwgIC00NjQ5LCAgIC04NDcsIC0xNjEwNywgICAtMjYzLCAgLTE4MjYsCisgIC01MjEsICAgLTc2MCwgICAgOTQyLCAgICAzMDksICAtMjY5MiwgIC00ODM1LCAgIC04NTMsICAgLTgwNiwKKyAgLTI3NiwgICAtMzIyLCAgIDU2NDcsICAgMTIxOSwgICAtNDMzLCAgIC0zNDYsICAtMTE3MSwgIC0xMDI4LAorICAgMTkxLCAgIC00MDYsICAgIDQ0NCwgICAgIDMzLCAgICAyNzIsICAgMzUwMiwgICAgNDc1LCAgLTIxNzgsCisgIDE5MTUsICAgLTI5MCwgIC0xMDM3LCAgICA4MzMsICAgLTY5NSwgICAtMTIxLCAgICA0MTUsICAgIDU1NiwKKyAgMTAyNSwgIC0yMjY4LCAgICAzMzQsICAgMjg0NywgIC0xNzY4LCAgIC0zODksIC0xNDAzNCwgIC0zODc4LAorICAgODM2LCAgIDQ2MDUsICAtMTk4NSwgICAtMzU5LCAgIDE0NzgsICAgLTE0OSwgICAgODIzLCAgIC05MjYsCisgIC04MjgsICAgIDEzNSwgICAgNDY5LCAgIC02NDUsICAgLTMyOCwgICAgLTk0LCAgIC0xNzgsICAgMjgyMCwKKyAgIDc4MSwgIC0yMzYxLCAgLTU3NzgsICAgMTMxMiwgICAzOTE4LCAgICAgLTEsICAtMzY1NCwgICAtOTQyLAorIC0yNDk1LCAgICA2MTUsICAgIDIxMCwgLTE3MDA2LCAgIC0zOTYsICAgLTQ0NSwgICAgMzgyLCAgICA1NjMsCisgLTE3MzgsICAgICA5NSwgIC05MTA3LCAgIDQ4NjksICAgIDM0OCwgICAgNTI3LCAgIDU2ODgsICAgLTE0NSwKKyAtMTE5NSwgIC0yMzY3LCAgIC03NDksICAgLTE4NywgICA2Njk3LCAgICAgMjcsICAgIDM0NywgIDEyNTcxLAorICAgLTY0LCAgIC00MjcsICAgMzc2NSwgICAgODI0LCAgLTEyMTYsICAtMTEyNiwgICA1OTk3LCAgICA1ODYsCisgICAxMTAsICAgLTI5NCwgICAtMjQwLCAgIDE2NDYsICAgLTE4NiwgICAxMzYwLCAgICA0MTMsICAtNjQ1OSwKKyAtMTUzNSwgIC0zMjA4LCAgIC01MjAsICAgLTYyMSwgICA4NjEzLCAgIDEwOTgsICAgIC0xOSwgICAtMTk5LAorLTExNDQ2LCAgIC02NTcsICAgLTM1MywgICAgOTA2LCAgICA2NzgsIC0xOTM3NSwgICAtMTI2LCAgIDE2ODgsCisgICA2NDQsICAgMTIzMSwgIC0yMTUxLCAgIC03NDIsICAgIDMyMCwgICAgLTY4LCAtMTI0MjYsICAtMjc1MCwKKyAgMTQ4MywgIC0xNjAzLCAgLTI2MzksICAgMzAyOCwgICAyNjYyLCAgIC0xNDAsICAgNTQwNSwgICAtOTE3LAorICAtNDA3LCAgICAyMDcsICAgOTM5MiwgICAtNTY5LCAgICA5MzEsICAgLTEyNCwgICAgLTgyLCAgIDYzNzAsCisgICA0NzcsIC0xMjI2NCwgICAxMDkzLCAgIDM0MjcsICAgLTczMiwgICAgLTUwLCAgICAyMzIsICAgIC02NywKKyAgIDYwOSwgICAxNjE1LCAgIC00NjMsICAgIDU4MywgICAxODA4LCAgIDE0OTksICAgLTUwOSwgLTI0NDMxLAorICAgMjMxLCAgICAtNzIsICAgLTE5MiwgICAtMzMzLCAgLTc1NTQsICAgLTM0MiwgIC05MDM2LCAgIC0zMDQsCisgICAxMzYsIC0xNTQ1MCwgICAxMzMzLCAgLTExNDcsICAtMTQ4OCwgIC0xNDQwLCAgICAgNzUsICAgICA2MywKKyAgIDc0NywgICAgMjk3LCAgIC0yNTEsICAgICAzMCwgICAtMzAxLCAgLTE4MTAsICAgIC04NiwgICAgNTQ0LAorLTEwNDQ2LCAgIDEzMDAsICAxMDQ2OCwgICAgMjE4LCAgLTI0NzEsICAgMTk4MiwgICAgNDIzLCAgIDMwNDYsCisgLTExMTIsICAgLTY1NywgICAtMTA0LCAgMTA2NzEsICAgIC00NiwgLTEwOTUzLCAgLTYyMDUsICAtMTI3NSwKKyAgMTk3MiwgICAgOTM3LCAgICAtNzUsICAgLTMzMCwgICAtNTI5LCAgLTI1ODEsICAgMTUxMCwgIC0xODgxLAorIC0xMzcyLCAgLTE3MjUsICAxNDU0MSwgICAtNTYwLCAgIC04ODQsICAgIDk0NiwgICAtMzA3LCAgLTUwMzEsCisgIDc3OTgsICAgLTE5MCwgICAgNzIwLCAgIDE1MjUsICAgICAyOSwgICAgODY4LCAgIDEyMzgsICAgIDM3MiwKKyAgLTQ2MiwgICAyNDY3LCAgLTI2NjEsICAgMjcyMSwgIC0xNTE0LCAgICA3MjMsICAtMjc4MiwgICAtNDk0LAorICAgMjQwLCAgLTcxNDcsICAgIDU4NywgICAgNzUxLCAgIDE2MTMsICAxMTA1NCwgICAxMDc0LCAgICAyNzUsCisgICA5NzIsICAgLTk3MCwgICAgIDI3LCAgICAtNzUsICAgICAyNCwgICAgIC05LCAgICAxNjMsICAgICA4OCwKKyAgICAyMSwgICAgIDg3LCAgICAtNzgsICAgLTc0MywgICAtMTI4LCAgLTIzMzYsICAgLTIzNSwgICAtNzQzLAorIC0zOTE4LCAgIC0zMzMsICAgMTA4OCwgICAtMTk1LCAgIC0xNjYsICAgIDc4MiwgICAtMTE5LCAgLTMyNjMsCisgICA2MDQsICAgMjE1NSwgICAtMjU4LCAgLTEyODIsICAgLTEyOSwgICAgIDQzLCAgLTUxMjQsICAgLTQ3MiwKKyAgIDY4NSwgLTE0MjQzLCAgLTEyOTQsICAgIC05OSwgIC0xOTIyLCAgIC0yODQsICAgLTQyMiwgIC0xMTEyLAorIC0zMTk0LCAgLTE5NzcsICAgMTQ0OCwgICAtNDE5LCAgLTcxNzIsICAgICAyMCwgICAgLTcwLCAgIDIxMDIsCisgICAgIDAsICAgIDI3OCwgICAxODgyLCAtMTAwMDUsICAgMTYxMiwgICA2MDIwLCAgICAgNzEsICAgLTE0MSwKKyAgMTAyNywgICAgLTQzLCAgIC04NjQsICAgLTQ0OCwgLTIxMjU3LCAgIC0zMzYsICAtMjA5MCwgICA1MjA3LAorICAgNjc0LCAgICA3MjIsICAgMTAzMCwgICAxMzY3LCAgIDE5NjMsICAgNjA1NywgICAgOTg0LCAgLTEwODcsCisgLTM2OTAsICAgICA0NywgICAgLTYxLCAgICAxMDQsICAgIC04MSwgICAgODk1LCAgICAgMjIsICAgIDcyOCwKKyAgLTE5MSwgICAzMjE5LCAgIDUyMjgsICAgIC0yNywgICAtODAyLCAgIDE0MzgsICAtOTAyNiwgIC0xMzUyLAorICAtNTgxLCAgICA5MTIsICAgLTY2NCwgICAgLTIzLCAgIC01MjIsICAgLTkxMiwgICAgMTc4LCAgIC02MDMsCisgICA1NzEsICAgIDU3NCwgICAgNDA2LCAgICA1NjQsICAgIDE3NSwgICAtNDA1LCAgLTI5NjUsICAtMTA3MiwKKyAgMTc0OSwgICAtOTU3LCAgIC00MDIsICAgOTQzMSwgICAxNjQ5LCAgIC00MDksICAgIDI5MSwgICA1NzY1LAorICAgODA4LCAgIDY3NTQsICAgIDcyNywgICAgLTM3LCAgIC0yNTQsICAgMTUzMCwgICAgMjEzLCAgIDMyNTMsCisgICAzNTcsICAgIDM3MSwgICAgIDQ1LCAgLTEyNzYsIC0xMjQzMiwgICAyNzk5LCAgLTE5MjQsICAgLTE3NiwKKyAtMTEwNywgICAtMTgzLCAgICAxOTgsICAgMzY2MiwgICAgIDIwLCAgLTExNjYsICAgMjUwNywgIC0zNDg0Cit9LAorCisuc2hhcGUyMl8yID0geworICAxNjg4LCAgIC0zMDcsICAgLTU5MCwgICAgOTcxLCAgLTM2MTYsICAtMTYzMiwgICAtMjE4LCAgIDE4NjEsCisgLTE0NzksICAgLTM2NywgIC02NTg0LCAgICA0ODcsICAgLTk1MSwgIDEwODA4LCAgIC0yMzIsICAgIDQ0NCwKKyAgICA4OSwgIC0xMjE2LCAgLTE1NzcsICAgMTI4MywgICAgMjQ5LCAgICAgLTMsICAtMzY0NiwgICAyMjA1LAorIC0xMTE2LCAgIDI2MzAsICAgMjExMCwgICAzMTkzLCAgICAyNzAsICAgLTE4OSwgICAgIDc4LCAgIC04MjYsCisgIDEwMTAsIC0xMDUyMCwgICAtMzcwLCAgIDEyMzQsICAtNTYwNCwgICAtMjYyLCAgIDEyNzcsICAgMTQ0MCwKKyAgMjIyNSwgICAyNDY2LCAgICAzMDUsICAgMjQ2OSwgICAtNzQwLCAgICAxMjAsICAgMzE4NCwgICAyMTI1LAorICAxMTg1LCAgLTMyMzAsICAgMTU5NywgIC0xNjcwLCAgLTgyODMsICAtOTg1NywgICAtMTI5LCAgIDg5MzIsCisgLTEzNTUsICAgODc1NSwgICAgNzA3LCAgIC0yNTYsICAgLTEzNSwgICAgNDIzLCAgIDE1NDMsICAgMTc4MiwKKyAtNDg3NSwgICAgNDAzLCAgICAzNzMsICAgMTU3MCwgICAtMTgzLCAgICA3ODIsICAtOTYxNywgIC0yNTM5LAorICAxMDkwLCAgICA1MjMsICAgNjkyOSwgIC0xMjI2LCAgMTAzMjksICAgLTI3OCwgICAtOTk5LCAgIC0yNjAsCisgLTE4MTAsICAgIDY2NiwgICAtNDYzLCAgLTYxMDAsICAgMjA0MCwgICAgMjU2LCAgICA1MzIsICAtMTQ3NSwKKyAgIDM4MywgIDEzMTM3LCAtMTA5NTMsICAtMjIyNiwgIC0xMjQzLCAgIDE1ODQsICAtMjM0OCwgICAtODA5LAorICAzNjAyLCAgIC04MTYsICAgIDE5NCwgICAgNDgwLCAgICAgODQsICAgMjI5NywgICAgMzQ0LCAgLTUxODEsCisgLTYyNDMsICAtMjYxNiwgICAyMDkzLCAgIDcxMTIsICAtMjM3MywgIC0xMzQ2LCAgICAyOTEsICAgLTM3MiwKKyAgLTg2MywgLTE2OTExLCAgLTE4NzgsICAgIDM3OCwgICAtODI2LCAgICA1NzksICAgIDczNywgICAtNDY4LAorIC0yMjg4LCAgICAyNjQsICAgIDYzNCwgICAgMTA4LCAgIC0yNTQsICAgNDcxNywgIC0xMjg2LCAgIDI4ODUsCisgICA5ODYsICAtNDk0NCwgICAgLTk4LCAgIDIwMDcsICAgIDk5MSwgIC0yMjUyLCAgLTI4ODcsICAtNjE0MSwKKyAgLTYwNSwgLTEwNDc0LCAgICA4OTYsICAgICAgNiwgICAgMjM1LCAgIC00MDcsICAgIC03MCwgICAgNDc4LAorIC04MzkyLCAtMTA4NzAsICAgIDU3NSwgICAtNjcyLCAgICAxMDMsICAgIDMyMCwgICAtMTc5LCAgIC0yMjksCisgICA0NDUsICAgLTM4MCwgICAxMTI0LCAgIDMyNzEsICAtMTMyNywgICAtMjc1LCAgIC0yMzksIC0xMDM4MSwKKyAtOTEwMiwgICAxMzYxLCAgICAgOTYsICAtMTI1NSwgICAtMjc3LCAgIDkzMTYsICAgLTQxNSwgIC0yMjU4LAorICA4OTkyLCAgIC0xMTcsICAgMTYyNSwgICAtNzA0LCAgIC05ODAsICAgIDc1MiwgICA5MTMzLCAgLTg3OTIsCisgIC00MjMsICAgLTI3MiwgICAtODY1LCAgLTIyODUsICAgIDQ0MywgIC0yMDE0LCAgLTI1OTIsICAgMzE4MCwKKyAgMTE5OCwgICAyNTcwLCAgIDMzNjAsICAtNzA5MCwgICAzMzExLCAgICA2OTcsICAgMjIyOSwgICAgIDQ2LAorICAtNDcyLCAgIDY5ODQsICAgLTE0MCwgICAtNzgwLCAgMTAzOTEsICAtMTA3OCwgICAgIDQ4LCAgIC01NjQsCisgLTUwNzMsICAgMTU3NiwgICAtODI2LCAgIC00ODMsICAgIDk1MiwgICAxMDk5LCAtMTE1MzYsICAgLTY1MiwKKyAgIDM3NSwgICAgNDQwLCAgLTczMTksICAgMjY0NiwgIC0yMDg5LCAgIDI4MDQsICAgMzc5NSwgIC02NzA0LAorICAgMjUxLCAgICA4MTEsICAtMTIyNCwgIC0xOTc2LCAgLTQ5NDMsICAtNjY3MSwgICAgNzgwLCAgLTI4NTYsCisgLTc5MDcsICAgMjQ0NywgICAzNzU1LCAgIC0xMzUsICAgMTEyNywgICAgMzI4LCAgICA1NTMsICAgMzQ1MCwKKyAgIDM1MSwgIC01MDU0LCAgICAgLTUsICAgMTA3NywgICAgMTA5LCAgIC0yNTQsICAgLTM5MSwgICAtNTExLAorICAgNDA0LCAgICAtNjEsICAgIDUxMCwgICAgMzk1LCAgLTYwNDQsICAtNzQ1NCwgICAgMzY0LCAgIC01NzUsCisgICAgNjUsICAgLTQxMCwgIC0xOTIxLCAgIC0yNDgsICAgIDEyOCwgICAgMzExLCAgMTcxMzEsICAtMjEzNSwKKyAgLTU2MywgICAtODg0LCAgIDIzNTYsICAtMzk1MSwgIC0xMTc2LCAtMTY2OTUsICAtMTUzNCwgICAxOTc3LAorICAgNjI2LCAgIDI0NzgsICAgMTU1NCwgIC0xMDcwLCAgICAgMzgsICAgLTU1MSwgICAgMzcwLCAtMTEwNTMsCisgIC0zMzEsICAgMTA2MiwgIC0xMzg1LCAgLTE2ODEsICAgMTAyOCwgICAzMzUwLCAgICAyMzksICAgIC03NiwKKyAgLTE1NiwgICAgIDQ5LCAgICAzOTcsICAgNzA2MCwgIC0yODM0LCAgLTY1MjcsICAgICAyMiwgICAxOTIwLAorICAtOTUxLCAgICAzNTYsICAtNzY3NCwgIC04OTAzLCAgIC0xMjAsICAgIDMxNywgICAtMzAzLCAgICAxNjAsCisgICA1MzAsICAgNDYxMSwgICAxMDgzLCAgICA1MTQsIC0xMjIwNywgICAtMjgzLCAgIDE0MTMsICAgLTg0OCwKKyAgLTY0NSwgICAtNDMyLCAgICAgIDAsICAgLTE5MiwgICA0NzgwLCAgLTM0ODUsICAtMTE5MiwgLTEwNTc0LAorICAxMjc0LCAgLTMwNTcsICAgIDQ3NSwgICAtMTg4LCAgICAxODMsICAgNzg2NSwgLTExMjE0LCAgIC0yNjgsCisgICA0OTEsICAgMTQyMiwgICAgLTI4LCAgICAxNDksICAgIDUxNSwgIC0xNjUxLCAgICA2NzAsICAgLTQ1MCwKKyAgLTk1OCwgIC00Mjg4LCAgICA1NjcsICAgLTE4MiwgICAgNjY4LCAgIDQwNjksICAgLTIxMywgIC0xMTc2LAorICAgMTQ4LCAgIDg4NTQsICAgLTE1MSwgICAgNDc0LCAgICA1OTksICAgMTI5NywgICAgMjM3LCAtMTkxODYsCisgIDI5OTMsICAgLTQ4MiwgICAtNTkxLCAgLTEzMjIsICAgICAyNSwgICAtNjI4LCAgIC04MjgsICAgLTIwMywKKyAtMTUwMCwgICA1NTE5LCAgICAtODQsICAgIDcyMywgIC0xMTM3LCAgIDEyMTcsICAxMzA0NSwgICAtNzA3LAorICAtMzcyLCAgIC0yMDAsICAtNDE0MiwgICAtNzkwLCAgICAxODgsICAtNjc2MCwgIC04Mjg4LCAgICA3NjYsCisgICAzNjYsICAgIDQ0NCwgICAtNTE3LCAgLTI2NzksICAtMTQ3MCwgICAgLTYxLCAgICAxNjEsICAtMzczNCwKKyAgMzA1MywgICAyMDEyLCAgICA0MzksICAgIDYyNywgICAgNTI0LCAgIDU1MzgsICAgIDU0OSwgICAtNDczLAorIC0yMjQ0LCAgIDgzOTksICAtNjM5NSwgICA1ODExLCAgICA4NTEsICAgICA1OCwgIDExMzc2LCAgICAgLTYsCisgIC0zMzcsICAgLTY4OSwgIC0xNTEwLCAgIC02OTAsICAgLTM4OCwgIC0zNTg3LCAgIDI2NjUsICAgMzM3MSwKKyAtMTg1MCwgICAtOTUzLCAgIC01MTMsICAgIDU4MSwgLTEwMjk2LCAgICA1NDgsICAgMTA5MiwgICAgNTY1LAorIDE4MDQ1LCAgICAyMTUsICAtMTQ4NiwgIC0xMjcwLCAgICA0NTAsICAgLTg4MCwgICAgNDA3LCAgLTY1NDcsCisgIDgzOTMsICAgIDIwNiwgICAtNTE1LCAgLTE1NjUsICAgLTIxOSwgIC0xODcyLCAgIDE0NzksICAgIDM4MiwKKyAgLTU2OSwgIC01MDAyLCAgLTEyNDcsICAgIC00NSwgICAtNzQwLCAgLTE3OTEsICAxNzE3NywgIC0xMjEwLAorICAgNzYxLCAgICAxMzIsICAtMTYyNywgICA0OTcwLCAgIDU1NjMsICAgIDcyMiwgICA1NjE0LCAgICA0MzAsCisgIDU2NTksICAgIDEzOSwgICAxMTkzLCAgIDE1MTMsICAgMTE0NCwgIC0xMzE5LCAgICA1NjEsICAtNTE0NSwKKyAgMTAxMCwgICAgMTk5LCAgICA2NTYsICAtMzk1OCwgICAzNTQ0LCAgLTE3NTgsICAgIDgxMCwgIC0xNTc4LAorIDE1OTc2LCAgIC0xMzksICAtMTAzNSwgICAtNDE2LCAgIC01NDMsICAgLTQxOCwgICAyODI0LCAgLTY1NDEsCisgICAgOTQsICAgLTY3MywgIDExNzQxLCAgICA0MjYsICAgIC0xNSwgIC01MjgwLCAgICA3ODAsICAgMTc5NSwKKyAtNDYxNiwgICA4MTkyLCAgIC0yOTcsICAgLTIwNiwgICAgODgzLCAgIDIzNjksICAgLTM5NSwgIC00MjY2LAorIC0zMTIwLCAgIC0xOTksICAgIDk4NSwgICAxMjQwLCAgICAzNTIsICAgIDIzMiwgICAtMTcwLCAgICAxNzYsCisgICA0MTMsICAgLTQ5NSwgIC0xMzk5LCAgICA3NTQsICAgIDYxOCwgIC02MTAzLCAgIC0xNzksICAtMjU0NiwKKyAgIDk2NSwgIC0xMzYyLCAgIC04MDYsICAgIDgzOCwgIC0zOTEyLCAgLTEzNDYsICAtMzEzNSwgICAtOTM3LAorICAgMjE5LCAgICAzMDcsICAtMzUwOSwgICAxMjEwLCAgIDIzODEsICAtNzkyMywgICA2MzU4LCAgIC04ODUsCisgIDI5MDIsICAgIDI4NCwgICAyNTYwLCAgIDE3ODksICAgNjg3OCwgICAgICA2LCAgLTQ0MTgsICAtMjIwNiwKKyAtMTA5MSwgICAxODQwLCAgIC0xMTgsICAtMjY1OSwgICAxMDA4LCAgIDIxOTIsICAgMTY1MSwgICAxMzYzLAorIC03NzcyLCAgIDEyNTIsICAtMTIwMCwgICAgMTMzLCAgIC03NTcsICAgIDUwMSwgICAgLTk4LCAtMTcxOTcsCisgICAgOTgsICAgLTU0MywgICAxNzQzLCAgICA2MjEsICAgLTgwOSwgIC0xOTUwLCAgIC03OTMsICAgMTE2OCwKKyAgLTc0MywgIC03MTI0LCAgICAxNjYsICAgNzg3NSwgIC00NDY2LCAgICAzNTYsICAtMTQzMCwgICAtNDY3LAorICA4NTg5LCAgIDk5MzEsICAgIDUyMCwgICAtODY2LCAgIDE5NDUsICAgLTU5OSwgICAtNDM0LCAgICAxMTMsCisgICA1ODksICAtMzQ1NiwgICAgNTk3LCAgIDYwNzYsICAgMTExNCwgICA5NjYwLCAgIDE1MzIsICAgMjA3MywKKyAgLTEzOCwgICAtNzIxLCAgLTEwMzAsICAtMTMwOSwgICAgNjI1LCAgLTQwNDAsICAgMTIxMSwgLTE4ODM2LAorIC0zOTYzLCAgLTQ0NjgsICAgIDE5NywgICAgNjAwLCAgLTEwMDQsICAgLTgxNiwgICAtNTYwLCAgIC00NzYsCisgLTIxNjAsICAgICAtMiwgICAgIDI2LCAgIDgxNjIsICAgMTA1NywgICAtMTc4LCAtMTE3MzksICAtMTg4MiwKKyAgMTAwMCwgICAtMjI3LCAgICAxMDksICAtMTg1MiwgIC0xMTYzLCAtMTcxNDMsICAgIDE0MCwgICAtNzE4LAorIC0xMTUwLCAgICAgMzMsICAgMTM5NywgICAgLTQ1LCAgIC0yMDUsICAgIDE1MywgIC0xNDk0LCAgMjA1MDksCisgICAtNTEsICAgLTkwNCwgICAtNTk5LCAgIDE5MTUsICAgIDg4NCwgICAgNTA0LCAgLTE4MTksICAtNDQ4NywKKyAgMTI1MiwgIC0xMjU5LCAgLTIyMDAsICAtNTYwMSwgICAtNDQ4LCAgIC02ODYsICAgNTc3OCwgICAgODczLAorIC00MjgyLCAgIC01MzMsICAgIDI5NSwgICAtNDUwLCAgIDE0MjIsICAgMjM5MywgICAzMjY3LCAgLTM5MTEsCisgICAyNDksICAtMzYwNSwgIC0zMTkwLCAgLTEwOTYsICAtMjQyMiwgICAgMjc0LCAgLTE5MTgsICAgNDA3MCwKKyAgLTIwNiwgICAtNDMyLCAgIDE5MTksICAgLTY0NSwgICAtMjc1LCAgMTI5NTQsICAgIDMxMSwgICAxNDc5LAorIC0yNjY0LCAgIC04NTIsICAtNDgwOSwgICAxMTAyLCAgIC0zNzUsICAgICAyMCwgICAxNjU5LCAgLTExNzksCisgIDExOTksICAgICA0NCwgIC01NTkwLCAgLTExMTIsICAgLTU2NiwgLTExMzY5LCAgIC0xMjUsICAgLTg3MSwKKyAgIDE1OCwgICAxMjA4LCAgICAyNjUsICAgLTUxOSwgICAtNDA1LCAgIDI0MzksICAtMTEyOSwgICAxODI3LAorIC05NDYxLCAgIDg1NDgsICAtMTYwNiwgICAgMzgwLCAgIDQ5MjQsICAgIDY2MiwgICAxMzE0LCAgIC0zOTEsCisgLTIwMjQsICAgIDgyNywgLTEzMzgxLCAgIC0xOTgsICAgLTE0MiwgICAxNjAwLCAgIDMzMjksICAgIDEyNSwKKyAgLTY3MiwgICAtMjIwLCAgICA1NTcsICAxODY0MiwgICAgIDYwLCAgIDcyOTYsIC0xMDQ3MiwgICAtNzEyLAorICAxMTg4LCAgICA4MDgsICAgICA2NCwgICAgNDc5LCAgICA1NTUsICAgIDI2NCwgICAgMzk0LCAgIC02MTEsCisgIC04MTAsICAtNzk0MywgICAtMjM1LCAgLTY4ODksICAtMTU3NSwgICAxMzIwLCAgIC0zODEsICAtNzQxNCwKKyAgMTc0MCwgICAtNzQ0LCAgICAzNjksICAgLTYyNiwgIC02ODk5LCAgLTIxNDQsICAgLTU5MywgICAgNjY4LAorICAtMzUxLCAgLTM3NTYsICAtNTE0MywgIC0xODE0LCAgICA4MDYsICAgLTQ3NSwgICAgNTg4LCAgIC01MDcsCisgLTkwODgsICAgLTYyOSwgICAgMTU0LCAgLTY5NDUsICAtMTEwNSwgIDEwNjU4LCAgIC00MzUsICAgIDM4NCwKKyAgLTc1NywgICAxMTgzLCAgIDM4MDYsICAgLTc0NywgICAtMzc4LCAgICA1MzUsICAxMDIyNCwgICAgNjI2LAorICAtODY2LCAgLTE5MzEsICAtMTQ4NCwgICA1ODE4LCAgIC03NTAsICAtOTYyOCwgICAtMjUwLCAgICA1ODksCisgIC02NTMsICAgLTE5OCwgICAgMTA0LCAgIC05MzQsICAgMTIwNywgICAgIDQ2LCAgICA5NjAsICAtMTAzMiwKKyAgNDIzNiwgICA0NDcxLCAgLTI4OTYsICAgMTU1MSwgIC03NzE0LCAgLTE5MjEsICAgIDc0NiwgICAtNjcxLAorICA1MTE0LCAgIDU0ODIsICAgLTUyMiwgIC0zMzQ0LCAgLTE5MDUsICAtOTIyMCwgICAtNjYzLCAgLTEzNTUsCisgIC02MTEsICAgICA2NSwgICAxMzY4LCAgICA2MjgsICAtMTI3NiwgIC02NzgwLCAgLTI2MjMsICAgLTY2MSwKKyAgLTExNywgICAtNDM3LCAgIDU1MDcsICAgMzIwNSwgICAgOTI4LCAgICA1MzcsICAtOTQ4NywgICAgIDgwLAorICAtMTAyLCAgIC01MzgsICAgLTI3NywgICAgODYzLCAgLTE0MjEsICAgNjA1NCwgICAxMjI3LCAgICA2OTYsCisgIDM1ODIsICAgLTUwOCwgIC0xNzU3LCAgICAxNDUsICAtMTcwNSwgIC0xMjAxLCAgIDQxNTcsICAtMzMxNCwKKyAgMjI5MSwgICAtODM0LCAgICA4MjEsICAgIDU1MiwgICAtNzI0LCAgICA1MTMsICAtOTczMCwgIC04OTQ0LAorICAxOTEzLCAgICA1MDEsICAgLTIxNiwgICAgNzE2LCAgIDI3NjYsICAgLTgyMywgICAyNTM1LCAgICAzMTQsCisgIDE3NzQsICAtMzM3MiwgICAgMjM1LCAgICAyNDQsICAtMTIxNiwgICAtNzEwLCAgICA2ODksICAgNjczNiwKKyAgIC01MiwgICAgMjE4LCAgLTgzODIsICAgLTQ0NCwgICAgOTIwLCAgICA1NjksICAtNDg5MCwgIC0yMDUwLAorICAtNjEyLCAgIDE3MDgsICAgLTQ4MSwgLTE1NTAwLCAgLTI4NzgsICAgLTY5MSwgICAgNTM4LCAgIC0xMjUsCisgICAtODEsICAgLTg2MiwgLTEwMDk0LCAgMTIwNTAsICAtMTM5MiwgICAtMzI2LCAgICAxMzMsICAgICA2MSwKKyAgIC01MCwgICAgNzE1LCAgLTY2NjIsICAgLTY3MywgIDEwNzQ1LCAgIC01OTYsICAgICA0NCwgICAzOTA2LAorICAgMjQ3LCAgIC03NDUsICAgNDk1MCwgICAtMjEwLCAgICA0OTcsICAtMTg3NSwgICA4MTk3LCAgIDIxNDEsCisgIDE0NTQsICAgIC0yMywgIC0xNDgwLCAgIDIxODQsICAgLTgwNCwgICA1NTE1LCAgLTEzMTEsICAtODg5MywKKyAtMjg4MCwgIC0zNjA2LCAgIC0yODIsICAgLTExNiwgICA4MDg0LCAgICA2MTgsICAgLTQwMywgICAxMTA2LAorLTE0NDA1LCAgIDExNTksICAgIDIyOSwgICAgNzQyLCAgIC0xODQsIC0xOTQ0NSwgICAtMzI5LCAgIC03NDcsCisgLTEyNDAsICAgMTQ4NywgIC0xNjcwLCAgIC04MzksICAgIC03NywgICAtODgyLCAtMTA5ODYsICAtMjg1MSwKKyAgIC0yNCwgICAtNzQ3LCAgLTM2MTUsICAgMTkzOSwgICAxMzg5LCAgICAxMzIsICAgNTM2NywgICAxMzU1LAorICAgNDA4LCAgLTEyNzIsICAxMTM4OCwgICAgMTUzLCAgIDI3MDgsICAtMTUwMywgICAgMTY5LCAgIDczNTcsCisgICAgNTEsIC0xMzU4NiwgICAtNDA0LCAgIC0zMDQsICAgIDYyNiwgICAgMTYzLCAgLTE4MTQsICAgLTUxNSwKKyAgIDQ0NSwgICAgNTg5LCAgLTExOTQsICAgIDc3MCwgICAgNTU1LCAgICAyNDYsICAgLTE2NSwgLTIxMTkyLAorICAgMTg0LCAgIC0yNjUsICAtMTExNiwgICAtNDg1LCAgLTgxMDcsICAtMTk5MiwgLTEwODA1LCAgIC04ODAsCisgLTE0NTUsIC0xNTE1NCwgICAyMzEyLCAgLTE3MTIsICAgIC0xMSwgIC0xODk5LCAgIC00MDAsICAgICAtMiwKKyAgIDMxNCwgICAtMzE4LCAgIC0yODAsICAgLTY1OCwgIC0xMDY2LCAgLTI1ODQsICAgMTAyNywgICAgODAxLAorLTExOTYwLCAgIDE1MTksICAgODg3MywgICAgNDY1LCAgLTMyMjksICAgMTgwMSwgICAtMzQ4LCAgICA3NDksCisgICAgIDcsICAgMTA3OSwgIC0yMDUxLCAgMTE1MjEsICAgLTgzMSwgLTEzNDI1LCAgLTYzMTUsICAtMTEzNSwKKyAgMTA4OCwgICAxMDU2LCAgICAtNDYsICAtMTAwNiwgICAgMzc0LCAgLTUwNjUsICAgMTE2MywgICAtNDAyLAorICAgLTUwLCAgLTE0NTksICAgOTU4NiwgICAgNTE0LCAgLTE0MzksICAgLTYzOCwgICAtMTU1LCAgLTUyODksCisgIDgwNDMsICAgLTYxMiwgICAgNzM5LCAgIDEwODQsICAgIC02MCwgICAgODkxLCAgICA3ODYsICAgICAtNiwKKyAtMTA3OCwgICAyMDk3LCAgLTUzMzMsICAgMzQ5NywgICAgIDIzLCAgIC05MTMsICAgMTMwMywgICAgOTU3LAorICAgLTM1LCAgLTY0MTgsICAgLTE0NiwgICAtOTcxLCAgIDI3MzgsICAgOTY5NSwgIC0xNzIyLCAgLTIwMDIsCisgICA5MDUsICAtMTc0OSwgICAtOTE3LCAgICAxMjIsICAgIDM3OSwgICAtMzI1LCAgIC00NTUsICAgIDIzMCwKKyAgIDgyNSwgICAtMTM3LCAgIC0zMzUsICAgIC05NiwgICAtMTYwLCAgICAzOTAsICAgIDczMSwgIC0yNjIxLAorIC01ODg5LCAgLTM5NDksICAgNTEzOCwgICAgODM5LCAgLTExOTAsICAgIC02NiwgICAgOTYxLCAgLTQ2MDAsCisgIDIzNDUsICAgMTYwNywgIC0yNDQ4LCAgLTY2NTMsICAgLTU5MiwgICAtMTA2LCAgLTc2MTksICAgLTc5NCwKKyAtMTE4NiwgLTEyNTg3LCAgICAtMTEsICAtMjIyNCwgICAtMjI1LCAgLTI5MDMsICAgIDUzNCwgICAxMzU1LAorIC03MDAyLCAgICAzMTQsICAgIDQ5NCwgICAxOTUwLCAgLTg1NDUsICAtMjUzMSwgIC0yNDM4LCAgICAtNzcsCisgICA4ODYsICAtMTg1MSwgICAgOTQ0LCAtMTAxNTYsICAgMzAwMywgICAxODQ2LCAgIDE5MTksICAgMjAxOSwKKyAgIDQ3MSwgICAgNDUxLCAgIC00MzYsICAtMTAxMiwgLTIwMTIxLCAgICAyNzUsICAgICA5OCwgICAxNzc2LAorICAgNTc4LCAgICAgOTYsICAgIC0xNiwgICAxMTU2LCAgIDM2ODksICAgICAgNywgICAtMjA3LCAgICA5MjAsCisgICAxMDUsICAgIC01OCwgICAtMTc1LCAgICAxNjMsICAgIDY5NywgICAtNDA3LCAgICAtNjEsICAgMTI2MSwKKyAgMTI5NywgICA1MDYxLCAgIDUzMjYsICAtMTEyNiwgICAgNTE2LCAgIDEyMDgsIC0xMTEwOCwgICAgNDQxLAorICAgICA3LCAgIC04OTksICAgIC0xOSwgICAtMzY4LCAgICA0MzgsICAtMTkxMSwgICAgNjAyLCAgICA3MTYsCisgICAzMTMsICAgIDg1MywgICAxNDQ4LCAgIC04MTcsICAtMTQ1MywgICAxMzg0LCAgLTQzNzEsICAgMTA0MywKKyAgMTg4NCwgICAxNjE5LCAgIDIxOTYsICAxMDA3NSwgIC0xNTQ4LCAgLTEyMDEsICAgLTc5NiwgICA1MjI4LAorICAyNjU3LCAgIDgyNDQsICAgLTYwNSwgICAgNDIyLCAgIC02OTMsICAgMzE3MSwgICAgNjU3LCAgIDU0MzgsCisgIC0xNzEsICAgIDYzMywgICAxNTc5LCAgLTE3MTgsIC0xMjI2NSwgICAxMDgzLCAgIC05NzYsICAgLTI5MywKKyAtMzgwMiwgICAtMzA2LCAgIC02NjgsICAgNzgxOCwgIC0xMzQwLCAgIC00MDIsICAgMjIzMSwgIC00NDcyCit9LAorCisuc2hhcGU0NCA9IHsKKyAgIC00MCwgICAtMjgyLCAgIDEzNjYsICAtMTE3MywgIC0zNDg0LCAgICAzNTUsICAtMTA3OCwgICAzODAwLAorICA0Mzg2LCAgICAtMzUsICAtNDE5MiwgICAgNTIzLCAgIDEyOTEsICAgIDY3OCwgICAgMTU2LCAgIDIyNzIsCisgLTEwNDMsICAgMTA3NSwgIC0xODQ5LCAgIC0zMTQsICAgLTUyMiwgICAgMzkyLCAgIDIwOTgsICAgIC03OSwKKyAgIDQ3MywgICAtMjc1LCAgICAgIDIsICAgNjM5OCwgICAgNDUxLCAgICAgOTQsICAgIDE3MywgICAtNDMxLAorICAxMTE1LCAtMTA3ODgsICAgICAzNSwgICAxODIzLCAgLTMzODAsICAgIC05NywgICAgLTk4LCAgIC0zNTAsCisgICAtMjMsICAtMTI2NCwgICAtMzA4LCAgIDg5NDgsICAgLTY5NSwgICAgLTc5LCAgIDM1MjAsICAgIDMwOCwKKyAgIDM0MCwgICAtMzYyLCAgIC01NDcsICAgMTIwNywgIC0xMTgyLCAtMTAzOTIsICAgLTE0OCwgICAzNTgwLAorICAgNDgxLCAgIC00MjUsICAgIDg2MiwgICA0ODk0LCAgICA3MzYsICAgLTE1MiwgICAtNjI2LCAgICAgMjMsCisgLTU4NTMsICAgICAzOSwgICAtMTQzLCAgICA0MTgsICAgLTEwMywgIC0xNDU3LCAtMTI4MjYsICAgLTEyMiwKKyAgIDI4MywgICAtMjI1LCAgMTA1NjEsICAgLTE1MywgICA4ODcyLCAgIC04MDYsICAgIC01MSwgICAgIDkzLAorICAgNDIwLCAgIC0yMDksICAgIDM0NSwgIC03NjYxLCAgIC03MzIsICAgIC00OCwgICAgNDc5LCAgIC0yMjUsCisgICAyNzYsICAxMzM4NSwgLTEyNTc4LCAgLTE0NDAsICAgLTI2NSwgICAtMjc0LCAgIDExMDUsICAtMzM3NiwKKyAgLTY5MSwgICAtNTc5LCAgIC05NzIsICAgIDMwMCwgICAgMzQ5LCAgICAzNjIsICAgIDcyMiwgICAtNDcyLAorICAgMTg1LCAgICA4MTQsICAgICAxNCwgICA0NzQ2LCAgICA3NjEsICAgLTMzNiwgICAxNjkxLCAgICA4ODgsCisgLTE2NjksIC0xODcxNywgICAgODI3LCAgLTI2MDUsICAgIDkyMSwgICAgMTU1LCAgICAgNjgsICAgIDExMiwKKyAtMzAzMiwgICAtMjg3LCAgICA0MTQsICAgIC04NiwgICAgLTYyLCAgIC0yMTMsICAgLTEwNiwgICAgODA3LAorICAtNjE5LCAgICA1OTgsICAgLTE3OCwgICAzMTA0LCAgIC00ODEsICAtMTU1MywgICAxMjUwLCAgLTgzNjMsCisgIC02ODYsICAtOTYwOCwgICAgMTE2LCAgICAtNDcsICAgIDMyMSwgICAgLTg5LCAgICA5MzksICAgIC0zNSwKKyAtNzk5NSwgLTEwMTU5LCAgIC01MjYsICAgIDE0NSwgICAgMzYzLCAgIDIxNzAsICAgMTA3NywgIC0xMjIzLAorICAtNzM4LCAgICAxMjAsICAgLTQwOCwgICAtMzkwLCAgICAtODAsICAgLTQwNCwgIC0xNjA3LCAtMTAxODcsCisgLTY0MzIsICAgIDk2MSwgICAgIDk0LCAgLTE0NTksICAgIDQ4OSwgICA2NjQxLCAgICAzNzIsICAgMTAwNywKKyAgNTk1OCwgICAtODM0LCAgICAyMjIsICAgICA1MSwgICAgMjgyLCAgLTEwMDUsICAgNDQ3MywgIC04ODQxLAorICAgLTczLCAgIC00NzcsICAgLTU1NywgICAgMTIxLCAgIC0xNjUsICAtMTE5NSwgICAgNDM4LCAgICAxMzksCisgIC0xOTAsICAtNDIwNSwgIC00Mjc4LCAgLTQ2MTcsICAtNzU5MiwgICAgIDQwLCAgIC00MjIsICAgLTQ1OSwKKyAgIDU5NCwgICA3MzMxLCAgICAxNjQsICAgIDI5NywgICAyNjMxLCAgLTkwNzUsICAgIC03OCwgICAgMzcyLAorIC02MjEzLCAgLTEwNTMsICAgIDE4MiwgICAgLTcxLCAgIC0zODYsICAgLTYwNCwgLTExNzIwLCAgICA1NTIsCisgIC02MTcsICAgIDQxMywgICAxMjkyLCAgICAgIDQsICAgLTQ4NSwgICAxMTYyLCAgIDYwNTEsICAtNTE2OCwKKyAgLTE4MSwgICAxMDI0LCAgIC02MzAsICAgLTI3NSwgIC00MDY3LCAgLTg2MjcsICAgMTM4NiwgICAgOTcwLAorICAtNDIzLCAgIDI5NzMsICAgMjM2MCwgICAgMzYzLCAgIC0yNzQsICAgIDQxMCwgICAgIDQ4LCAgICA3NjgsCisgIDI5NTgsICAgLTQyNywgICAgIDg2LCAgICAgNjQsICAgLTEyOCwgICAtMjczLCAgIC0xODIsICAgLTI5MiwKKyAgIDg2OCwgICAgNDYzLCAgICAgNzMsICAgLTExNiwgIC02NTA5LCAgLTUyOTUsICAgIC0zNywgICAgNjkxLAorICAgMzQ0LCAgIC0xMjAsICAgIDE2OCwgICAgNDE5LCAgICA0OTQsICAtMTE3NSwgIDE4ODk2LCAgIC0xMzUsCisgIC0zNzYsICAgLTIxOCwgICAtNDUzLCAgIC05MTYsICAtMTA0MCwgLTIyMTc5LCAgIC04NDYsICAtMTAwNSwKKyAgIDI2NCwgICAgMTU5LCAgICA1OTcsICAgLTk1MiwgICAtODI1LCAgICAzOTMsICAgLTMyOCwgLTE0Njk0LAorICAgMzcxLCAgIC0yNjMsICAgIDc0MCwgICAgIDM4LCAgLTEwMDEsICAgMTI4OSwgICAtNjY4LCAgICAxODcsCisgIC0xNTUsICAgIDE0MywgICAgNjgzLCAgIDcxMzMsICAgLTU2MywgIC04MzgzLCAgIC0yOTEsICAgIDE3NiwKKyAgICA3NSwgICAgNjEzLCAgLTY5NjUsIC0xMTQ4MCwgICAgMzI0LCAgIC00OTAsICAgIDU4NiwgICAgNDE2LAorICAgNzYyLCAgIDU3NzcsICAgICA2NCwgICAgLTQ3LCAgLTQxMjQsICAtMTE5NiwgICAtMTEzLCAgICA3MDEsCisgIC0yMTEsICAgMjMzNSwgICAgMTMwLCAgICA2ODQsICAgNzI3OCwgICAtMTU4LCAgIC0yMTMsICAgIDI5NywKKyAxMDg0NSwgIC0xNDM5LCAgIC00NjUsICAgICAxNywgICAtNzkyLCAgIDY0OTksIC0xMDE4NywgICAtNDQ0LAorIC0xNDE2LCAgICA0ODIsICAgIDYzNiwgICAxNDcyLCAgICA3NTIsICAgIDE1NywgICAtMzM0LCAgLTMyMzAsCisgICAtMTksICAtNjc0NywgICAgNjYwLCAgLTMwODIsICAgNDA1NywgICA2ODAxLCAgICAtMTksICAgIDYzNSwKKyAgICAxOSwgICA5ODA3LCAgICA1MjYsICAgIDEyNiwgICAgNDQ0LCAgIC0xOTAsICAgLTQxOCwgLTI2NzU0LAorICAtMjAyLCAgICAyNDMsICAgIDU5NywgICAgIDEwLCAgICAzNDUsICAgIDgxNCwgICAtMzMwLCAgICAxNjAsCisgICAzNDQsICAgMzk4NiwgICAgNDcwLCAgICA0NTksICAgMjM4NywgICAtNTQ5LCAgMTE4ODksICAtMTgzNywKKyAgIC0zMCwgICAyNjA4LCAgICA2MTUsICAgMjMwMSwgICAtNzcxLCAgLTE1ODksICAtNjkzNSwgICAxMzIxLAorICA0Mjg3LCAgICAyOTUsICAgLTU1OCwgIC0xNTAzLCAgIC02MTEsICAgMjEwNCwgICAgNDExLCAgIC0yMTgsCisgIDExNDUsICAgLTQyNiwgICAgIDU4LCAgIC0xMDIsICAgICAxMywgICA3NDk5LCAgICA0NzYsICAtNDAzMiwKKyAtMjIzNywgIC0yNjU4LCAgLTE5NDMsICAgNTI2OCwgICAxMDM5LCAgICAzODksICAgNzA5MSwgICAgLTIyLAorICAgMTU2LCAgIC0xODYsICAgMjQzMiwgICAtODc4LCAgICAzMDUsICAtMTcyNiwgICAzMjA5LCAgICAzNjEsCisgLTEwMzAsICAgIDUwNSwgICAgNjE4LCAgIC0yNjIsICAtMTg3NywgICAgMjY4LCAgICA3NTcsICAgICAyNCwKKyAyNDMwNiwgICAgMTAyLCAgICA5NzMsICAgIDE0MiwgICAtOTUzLCAgLTExOTksICAgIDExNiwgICAtMjU1LAorICA1MzcwLCAgIC0zNDcsICAgLTM2NSwgICAgOTM3LCAgLTY5MzksICAtMTE4OSwgICAtNzYwLCAgICA1MzEsCisgLTE3NTksICAgLTcwNSwgICAtNTU3LCAgIC02MjAsICAgMTE1MSwgICAgMjUwLCAgMjE2MjksICAtMTUzMiwKKyAgLTEyOCwgICAxNDIxLCAgIC0yMTEsICAgIDU5MiwgICA1MTI2LCAgICAxOTcsICAgLTcxNiwgICAxMTEzLAorICA1ODQ0LCAgIC0yNjYsICAgIC0xMiwgICAtODEzLCAgICAgODUsICAgIDk5NCwgIC0yMTA2LCAgLTM5MTUsCisgIDE0MDIsICAgIDUzMywgICAgNTIxLCAgIC04ODMsICAgICA4NywgICAtMzg2LCAgICAgLTIsICAtNDM1MCwKKyAxOTc5MCwgICAtMTgwLCAgIC0zNjMsICAgICA2MCwgICAgMTAxLCAgLTE3MTcsICAgIDExOSwgICAtMzgxLAorICAgMTAwLCAgIC01NjUsICAgMzI2NCwgICAzMDUyLCAgICAyMDAsICAtNzMxOSwgICAgIDI2LCAgICAzNDcsCisgIC00ODIsICAxMDYwOSwgICAtNzY2LCAgICA1MjYsICAgLTYyMywgICAzNDk1LCAgICAzMzksICAtNDQwNiwKKyAgIC01OSwgICAtMjEzLCAgICA2ODYsICAgLTYwMywgICAgMTMzLCAgICAgOTksICAgICA0OCwgICAxNzE2LAorIC0xMjE0LCAgIDEzOTcsICAtMjM5NiwgICAtMzg0LCAgIC05MDEsICAtMzc1MCwgICAtNjYwLCAgLTQzMTQsCisgICAzMTMsICAgIDE5MiwgICAgMjkyLCAgICAyNTksICAgLTY0NCwgICAgMTc2LCAgIDIwOTksICAgNzk2MSwKKyAgIC0yOSwgICAgNjQyLCAgLTI5NzAsICAgMTc5MiwgICAgLTYxLCAgLTQzNDgsICAgIDU3OCwgICAxODY3LAorIC0xODY4LCAgICAgMzIsICAgNTI2MiwgICAgMTM3LCAgIDYxMDksICAgIDQ0MywgICAtMTc2LCAgICAzNTEsCisgICA0MDAsICAgMTg3NCwgICAtMTc1LCAgLTQwNjUsICAgIDY5NywgICAgMjkyLCAgIC03NDQsICAgIDEyMSwKKyAtNTEzNCwgICA2OTk2LCAgIC0xOTgsICAgIDYyOCwgICAxMDczLCAgIC01OTksICAgLTExNiwgLTE3OTAwLAorICAgNjQ3LCAgLTEwNDksICAgLTY2MywgICAxNDI3LCAgICAtOTQsICAgIDcyMSwgICAgMzExLCAgICAzMzcsCisgIDEzNzYsICAtMjc4NCwgICAzOTQ3LCAgIDEzNDIsICAgMTU3NywgICAtNDA2LCAgIC0yNjAsIC0xMDIyOCwKKyAgIDEwOSwgICAyMzU4LCAgIDI0MzcsICAgIDM0NiwgICAxMjYxLCAgIC0zMDgsICAtMjA5NCwgICAxNjgyLAorICAgMTQ0LCAgIC02NzUsICAgIDE4MywgICAgNDI4LCAgIC05NTAsICAgMTI0OSwgIC0xNTQ2LCAgICAgMzMsCisgIC0yNTQsICAgIDY4MSwgIC0xMjY0LCAgIC05NjQsICAgLTMxMCwgICAgODM4LCAgICAxMDAsIC0yMTk1MiwKKyAtMTQ4NCwgIC0xNTY0LCAgICAzMzksICAgIDI5OCwgICAgIDY3LCAgIC0zMzgsICAgICA4OSwgICAgNzA5LAorICAgIDUzLCAgICAyNTgsICAgLTM1OSwgICAyODAzLCAgIDE1NTMsICAgLTMxMiwgIC03OTkzLCAgLTE2MjcsCisgIDExODksICAgIDQ3NiwgICAtMTIzLCAgICAzMzYsICAgLTc2NywgLTE4NTIyLCAgICA1ODksICAgIDk0MiwKKyAgLTY0NSwgICAtMzgxLCAgLTE5MTMsICAgLTU4MiwgICAgIDU1LCAgIC04NzYsICAgLTUwOSwgIDI1MTQzLAorICAgNjkwLCAgIC03ODcsICAtMTEzNiwgICAgMTE0LCAgICAxNjIsICAgIDM0MiwgICAtMjMxLCAgLTg3NDIsCisgICAgOTksICAgLTY0NiwgICAtNDc0LCAgLTEzODQsICAgLTExMCwgICAgLTk4LCAgIDg2MzQsICAgIC0xNCwKKyAtOTY3NiwgICAtMzEyLCAgICAzNTgsICAgIDQ5NiwgICAtNjc2LCAgICAtOTcsICAgMTkwNCwgIC0yMTI0LAorICAgLTY2LCAgLTE4NjgsICAgIDUwMiwgICAtNTEzLCAgLTMyNDQsICAgMjA3OSwgIC0xNDc2LCAgIDU0NDAsCisgICAtNDAsICAgLTM4MSwgICAgNTAwLCAgIC0yMzgsICAgLTQ3MSwgIDEyMTYwLCAgICAyNDgsICAtMTAwNSwKKyAtMjg4NiwgICAgMTczLCAgLTMzNjksICAgLTM1NSwgICAtMjU2LCAgIC0xMTcsICAgLTQ3NCwgIC0xMjgyLAorICAtMzU1LCAgICAxMzAsICAtNDgzMywgICAgIDMxLCAgIC0yMzIsIC0xMjkzMSwgICAtODI2LCAgICAzMjIsCisgICA4MzksICAgMTUzNywgICAgIDczLCAgICAyMjYsICAtMTg4OCwgICAtNDgzLCAgLTI4NDgsICAgLTE5MCwKKyAgMTI3MSwgICAzNTk3LCAgLTQ1MTQsICAgIC0zOCwgICA2MDkzLCAgICAzNDcsICAgIC02OCwgICAtNDE1LAorICAtMTA1LCAgLTE2NjQsIC0xMTQ2MSwgICAtMTEwLCAgIC0zOTksICAgIDM4OSwgICAtNTExLCAgICA5MzUsCisgIC00MjQsICAtMTcwOCwgIC0xMDI2LCAgMjMyMzksICAgIDI5OCwgICA3MzYzLCAgLTkyMDYsICAgLTU2NiwKKyAgIDI1OSwgICAtNDEyLCAgLTEyMTMsICAgIDMzNSwgICAgNjE0LCAgICA5MjgsICAgIDk3MiwgIC0xOTE5LAorICAtNDA3LCAgICA1MDksICAgIDMwMywgLTEzNzYyLCAgIC01MjQsICAxMDM2MCwgICAxMzE4LCAgLTI3NTgsCisgIDIzNTAsICAgLTEwNiwgICAtMTE5LCAgICAtNjgsICAtNjE1NSwgICAtMjU1LCAgIC00NDgsICAgIC0zNCwKKyAgIC02NCwgIC00MzgyLCAgICAgNDcsICAgIDYzNSwgICAtMzM5LCAgICA0MDYsICAgLTQ0NywgICAtNDQ1LAorLTEwNTkyLCAgICAyMzMsICAgIDE2MCwgIC01NTE1LCAgLTEzMzMsICAgNjc1NSwgICAtOTUyLCAgICAxNzIsCisgLTEyNjAsICAgLTI5NCwgICAzNDgwLCAgIC0zNTIsICAgLTIzMSwgICAgNDE1LCAgICA0ODIsICAgLTQ5OCwKKyAgLTE5MSwgIC0yMDM0LCAgIDc5MzQsICAgNzk5NywgICAtNjg4LCAgLTk1MDMsICAgIDM3NiwgICAtMjI4LAorICAtNTAwLCAgICAyMjIsICAtMTAyMSwgICAtNDA3LCAgICAyNjEsICAgIDE3OSwgICAgNjIyLCAgIDEyMTcsCisgIC00NDMsICAgLTc2MywgICAtNTA4LCAgIC03MTksICAtNDUwOSwgICAgIDkxLCAgICA0NDksICAgLTI4MywKKyAgICA5MSwgICAgLTM5LCAgICA5NjEsIC0xMDE0OCwgICAxNTk2LCAgLTkxNjEsICAgLTMyNywgICAgMjIxLAorICAtNDcwLCAgICA2NzYsICAgICAxMiwgICAxNDE2LCAgICA5ODQsIC0xMDk4OCwgIC01NTAwLCAgIC0xODksCisgIC03MjcsICAgIDIyNiwgICA0NjkxLCAgICA2ODgsICAgIDc1OSwgICAgOTMwLCAgLTY0NDQsICAgLTExNCwKKyAgLTUzOSwgICAtNTI2LCAgICAtMjEsICAtMTIxOCwgICAgNjUwLCAgIDYwODgsICAgIDQxOSwgICA2MTg1LAorIC0xMjAwLCAgICAgODQsICAtMTIzMiwgICAgLTM0LCAgIC0xMDcsICAgICA2MCwgICAyMjQ4LCAgICA0NTAsCisgIDExODcsICAgMTI2NCwgICAtMTgxLCAgICA4NTcsICAgMjIzNSwgIC0yODU5LCAtMTM0ODMsICAgLTE5MiwKKyAgLTU4NiwgICAtMjA3LCAgLTU1NjksICAgIDUwMywgICAzMzc2LCAgIDEyNDMsICAgLTcwMCwgICAyMTE5LAorIC0yMTg2LCAgIC0yOTYsICAgIDg5NiwgICAgMjk5LCAgICAxNzcsICAgIDE4NCwgICAxMzc1LCAgIDI0OTgsCisgICAxNjEsICAgIDU3OSwgIC0zNjgzLCAgICA0NDMsICAgIC0yMSwgICAtMTg2LCAgLTM0NzQsICAgIDIzOCwKKyAgIDI3NCwgICAgMjc3LCAgIC0zMjUsICAtODMyNSwgICAtMjIzLCAgICAxMjUsICAgIDE5MSwgICAgMzMzLAorICAtMzQ1LCAgLTEzOTEsICAtNzM3MiwgIDExMzg5LCAgLTEwNTUsICAgNDA2NiwgIC0xMDk4LCAgICAgODcsCisgIC0yMDMsICAgIDQ0MywgICAgMzYzLCAgIC05NTksICAxNTM5NSwgICA0MDE2LCAgIC0yNTQsICAgMTYxMSwKKyAgLTE2OCwgIC0xMDcwLCAgIDI3MDksICAgLTc2OCwgICAgNTA2LCAgLTEyNDUsICAgNTgyMSwgICAyNDk5LAorICAxNTY0LCAgICAgMjcsICAgICA4NSwgICAxOTg5LCAgLTEwOTIsICAgIDE1MCwgICAtOTcyLCAgICA2NjAsCisgICAtMzMsICAgIDY4NywgICAgNTQ1LCAgLTE1NjQsICAgIDcyMCwgICAtMTk2LCAgICAtNTIsICAtMTc1MSwKKy0yNTM4MCwgIC0xMjQ2LCAgIC02MTUsICAgIDM5MSwgICAtNTEyLCAtMjMyODksICAgIDQ2MCwgICAgMzYwLAorICAgLTg1LCAgIC03MjMsICAgLTI1MCwgICAtMTYzLCAgICAtNDgsICAgLTkyMSwgIC0zOTg4LCAgICA0MjUsCisgLTEyNjgsICAtMTY5NSwgICAzMjMzLCAgLTEwOTMsICAtMTE2NiwgICAgMTk4LCAgIDc2MDIsICAgICAyMSwKKyAgIDM1NCwgICAgNzMzLCAgMTIyMTMsICAgLTM0NywgICAgNTMyLCAgIC00MjcsICAgICAyMiwgICAyMjE4LAorICAtNTc4LCAgLTMzODIsICAgLTQ3NCwgICAtNjI1LCAgICAgNzgsICAtNDU0NiwgICAgODYzLCAgICAtNTMsCisgIC0zNTcsICAtMTUyOSwgICAxMDE0LCAgICA3MTAsICAgMTM1NiwgICAtNDMwLCAgLTE2MzMsIC0yNDgyMywKKyAgICA5NSwgICAgIDI2LCAgICA1OTAsICAgLTU5MSwgIC03ODMzLCAgLTEzNTUsICAtOTc3MSwgICAtNTAyLAorICAtOTA3LCAtMTU0MzMsICAgIDk1NywgICAgNDYzLCAgICAgMzUsICAgLTQ5NiwgICAgMjk0LCAgIDIxMjksCisgIDEyNzQsICAgLTE2MCwgICAgLTgzLCAgICA1MzEsICAgLTc2NywgICAgMjg1LCAgICAyMzIsICAgNTk4MywKKyAtNjEyMiwgICAxNjIwLCAgIDQxMTIsICAgLTIzOSwgIC0xNzMzLCAgICAtNDYsICAtMTMyMSwgICAgNDY3LAorICAgNjEzLCAgLTM3NDcsICAtMjI4NCwgIDEzOTkxLCAgICAzNzMsIC0xNzM1NywgICAtMjE5LCAgICAtODAsCisgIC0yMTAsICAgMTQ2MiwgICAgIDM3LCAgLTE2OTIsICAgIDU0OCwgIC01ODQ1LCAgICA0MjAsICAgICA1NCwKKyAgLTM1MCwgICAtMjg1LCAgIDE5ODEsICAgIDI2MiwgICAtODc0LCAgIDI4NDQsICAgLTQzNSwgIC02MzA1LAorICA2NDQ5LCAgICAgNzIsICAgIDYzMSwgICAgLTk0LCAgICAgOTYsICAgLTQ0MiwgICAxMTM3LCAgICAgODksCisgICAzNjQsICAgMzM5MiwgIC0zNTEyLCAgIC0zODcsICAgMTA1NSwgICAgMzE4LCAgLTExMTEsICAtNjk3MSwKKyAgIDM0NCwgIC05MTA1LCAgICAtOTYsICAtOTM2MiwgICAgMTkwLCAgIC0yMjUsICAgIDM3MCwgICAgMTYxLAorICAgLTczLCAgLTE4MzAsICAgIDE3NCwgICAgIDQ4LCAgIC01MTgsICAtMzQ4NiwgICAgMTM3LCAgIC0yMzUsCisgICA4MTAsICAgICAyMywgICAgIDgwLCAgIC02NDIsICAgIC0zNSwgICAtMzE2LCAgIC0yNjksICAgLTM3MywKKyAtMjQxMywgICAtOTMzLCAgIDI1MjUsICAgIDI2NywgICAtNTA4LCAgIC0yMDAsICAgIDQyMiwgIC0zNDcwLAorIC0xMjczLCAgICA2NDAsICAtMTk1NiwgICAgMTM5LCAgICAzOTQsICAtMTA0MywgLTExMDA4LCAgIC0xNTgsCisgLTEwODksICAtMjAyMywgICAgMjAyLCAgIC05NzksICAgLTc0NCwgICAtMTU5LCAgIC0zOTIsICAgIC0zNywKKyAtMTY3OSwgICAyMTgzLCAgIDEzNjUsICAtMjg4MywgIC00NzUyLCAgLTIyNTUsICAgIDEwOSwgICAxNjYwLAorICAtNjEzLCAgIC01MTEsICAgMTI4NCwgIC03MzMxLCAgICA5NDcsICAgNzAwOSwgIC0yMDcyLCAgIC0zMjEsCisgIC05MzYsICAgLTU1MSwgICAtODc1LCAgICAxNjAsIC0yNzAyNywgICAgNjU0LCAgICAyNjUsICAgIDE2NCwKKyAgIDM3NiwgICAgNzI2LCAgIC0xNDksICAgMjgxMywgICAgLTk0LCAgIDU3MjgsICAgIDcwMiwgIC0xMTE4LAorIC0yNTU1LCAgICAyMTcsICAgLTE4NiwgICAtMTA3LCAgICAxNDYsICAgIC04MywgICAgLTYyLCAgIC0xOTYsCisgICA3MDgsICAgIDE0NiwgICAzNzI5LCAgIC00MTYsICAgIDIxMiwgICAtMTYzLCAgLTc4NjEsICAgIDM0NywKKyAgICA4MywgIC0xMDc5LCAgIC05OTQsICAgIDI3MSwgIC0xMDU0LCAgLTE2NDcsICAgIDEzOSwgICAgLTIwLAorICAgMzU0LCAgIDEyOTgsICAtMzQyMCwgICAxMTMwLCAgICAxNjEsICAgIDQ3NSwgIC0zOTEzLCAgICA0NjgsCisgICAgMjMsICAgIDI4NSwgIC0xNjk5LCAgIDgyMzQsICAgLTk0NywgICAgMjIyLCAgICAyNjAsICAgNDI3NiwKKyAgLTM0MSwgICA2Mzg3LCAgICAgMjEsICAgIDQ5MCwgIC0xOTA4LCAgLTE2NTQsICAgIC02MCwgICAyNDcxLAorICAgNzMzLCAgIC0xMzUsICAgIDEwOSwgIC0xMTM2LCAtMTQ3NTYsICAgNDkyMiwgICAxMTY1LCAgICAxNDksCisgLTM5NzYsICAgIC02NiwgICAtNTk0LCAgIDYxODEsICAgLTExMCwgICAgMjkyLCAgIDExMjksICAgLTU5MQorfSwKKworLmxzcDA4ID0geworIDAuMjcwMiwgIDAuNTA5NiwgIDAuNjQzNywgIDAuNzY3MiwgIDAuOTYzOSwgIDEuMDY5NiwgIDEuMjYyNSwgIDEuNTc4OSwKKyAxLjkyODUsICAyLjIzODMsICAyLjUxMjksICAyLjg0NzAsICAwLjE3NDAsICAwLjM2NzcsICAwLjYwODIsICAwLjgzODcsCisgMS4xMDg0LCAgMS4zNzIxLCAgMS42MzYyLCAgMS44NzMzLCAgMi4wNjQwLCAgMi4zNDQyLCAgMi42MDg3LCAgMi44NTQ4LAorIDAuMTUzNiwgIDAuMzI3OSwgIDAuNTE0MywgIDAuNjg1OSwgIDAuOTc2MywgIDEuMjc0NCwgIDEuNTYwNSwgIDEuODU2NiwKKyAyLjEwMDcsICAyLjM0NTAsICAyLjYwNzUsICAyLjg4NTAsICAwLjIwNzUsICAwLjQ1MzMsICAwLjc3MDksICAxLjAzNzcsCisgMS4yOTUzLCAgMS41MTMyLCAgMS43ODI2LCAgMi4wMzUxLCAgMi4yNTkwLCAgMi40OTk2LCAgMi42Nzk1LCAgMi44NzQ4LAorIDAuMTM5MywgIDAuMjQ1MywgIDAuMzc1NCwgIDAuNTQ1MywgIDAuODE0OCwgIDEuMTI4OSwgIDEuNDM4OSwgIDEuNzU5MiwKKyAyLjAzNTMsICAyLjMyMTUsICAyLjU5MzQsICAyLjg1ODgsICAwLjEyNTAsICAwLjM2MjcsICAwLjc2MTMsICAxLjEzODAsCisgMS40MTYzLCAgMS41NTY1LCAgMS42OTIwLCAgMS44MTMwLCAgMS44Njc4LCAgMi4wNDI3LCAgMi40MzE4LCAgMi44NTQ0LAorIDAuMjI1NiwgIDAuNDIyMywgIDAuNjQ1MiwgIDAuODU5OSwgIDEuMDY3MywgIDEuMzExOCwgIDEuNTQ4NiwgIDEuODM2NiwKKyAyLjA3NTksICAyLjMwMjYsICAyLjUyODQsICAyLjgwMzAsICAwLjIzMDQsICAwLjQ0MDQsICAwLjY4OTEsICAwLjg5NjQsCisgMS4xNTEwLCAgMS40MjAyLCAgMS42NDgzLCAgMS44NTgwLCAgMi4xMTgxLCAgMi4zNjg2LCAgMi42MDc4LCAgMi45MTI4LAorIDAuMjIzMCwgIDAuMzgxNiwgIDAuNTUyMCwgIDAuNjA2MiwgIDAuNzkwOSwgIDEuMDk4OCwgIDEuNDMzMCwgIDEuNzg0NiwKKyAyLjA3MTMsICAyLjM0NTcsICAyLjYwNDgsICAyLjg3MDgsICAwLjI0NDcsICAwLjU4MDAsICAwLjgyNDksICAwLjk5MDUsCisgMS4xNzIxLCAgMS4zOTkwLCAgMS42Njk0LCAgMS45MDY0LCAgMi4xMzA3LCAgMi40MjU1LCAgMi42ODE1LCAgMi45MTE3LAorIDAuMTk3NCwgIDAuMzgxMiwgIDAuNTgwMiwgIDAuNzc1OSwgIDAuOTI4MCwgIDEuMTU0NywgIDEuNDE3MCwgIDEuNjM2OSwKKyAxLjg4OTAsICAyLjI1ODcsICAyLjU2MjYsICAyLjgyMzksICAwLjEyMDksICAwLjI1MTAsICAwLjQ4NDEsICAwLjgwNDgsCisgMS4xMTk3LCAgMS4zNTYzLCAgMS42MDczLCAgMS44OTI2LCAgMi4xMzUwLCAgMi4zNjY5LCAgMi42MjkxLCAgMi44OTg1LAorIDAuMjM1MiwgIDAuNDM0NywgIDAuNjU4MiwgIDAuODE3OCwgIDAuOTU0OCwgIDEuMTY1NCwgIDEuNDk0MiwgIDEuODgxMiwKKyAyLjE3MDMsICAyLjM3NzksICAyLjY0MTIsICAyLjg4NzEsICAwLjIwOTEsICAwLjQwODQsICAwLjY3MzAsICAwLjkxNTEsCisgMS4xMjU5LCAgMS4zMjYyLCAgMS41OTM3LCAgMS44MTI5LCAgMi4wMjM3LCAgMi4zMzE3LCAgMi41Nzc4LCAgMi44NjIwLAorIDAuMTE2NywgIDAuMjQwNiwgIDAuNDUyMCwgIDAuNzI5OCwgIDAuOTg0OCwgIDEuMjQ0OCwgIDEuNTEzNywgIDEuNzg3NCwKKyAyLjAyODAsICAyLjMwMjAsICAyLjU5MTQsICAyLjg3OTQsICAwLjMwMDMsICAwLjQ5NjYsICAwLjY1MjAsICAwLjg1MDUsCisgMS4xNjAwLCAgMS4zOTgxLCAgMS41ODA1LCAgMS44MzQ2LCAgMi4wNzU3LCAgMi4zMTAyLCAgMi41NzYwLCAgMi44NDk5LAorIDAuMjQ1MSwgIDAuNDE2MywgIDAuNTk2MCwgIDAuNzgwNSwgIDAuOTUwNywgIDEuMjQzOCwgIDEuNTU4NywgIDEuODU4MSwKKyAyLjA3MzUsICAyLjMxOTgsICAyLjU3MDQsICAyLjgyMjAsICAwLjMxMTIsICAwLjU1MTcsICAwLjcwMzIsICAwLjg1MjgsCisgMS4xNDg5LCAgMS40MjU3LCAgMS42ODQ4LCAgMS45Mzg4LCAgMi4xNTc3LCAgMi40MjY1LCAgMi42Njc4LCAgMi45MDUxLAorIDAuMjI0OSwgIDAuMzg5NywgIDAuNTU1OSwgIDAuNzQ3MywgIDEuMDE1OCwgIDEuMzU4MSwgIDEuNjkxNCwgIDEuOTkzMCwKKyAyLjE4NDMsICAyLjM1MzQsICAyLjU1MTIsICAyLjgwNjUsICAwLjI2MDAsICAwLjQ1NzQsICAwLjczNDksICAwLjk2OTEsCisgMS4xNjk2LCAgMS4zODQ4LCAgMS42MzM1LCAgMS45MDIxLCAgMi4xMTc0LCAgMi4zNDgxLCAgMi41OTAyLCAgMi44MzkwLAorIDAuMjI0NiwgIDAuMzM3MiwgIDAuNDU2MCwgIDAuNTI0OSwgIDAuNzA1NiwgIDEuMDI3MywgIDEuMzgxMCwgIDEuNzEzMiwKKyAxLjk4MTksICAyLjI1NzQsICAyLjU0MTAsICAyLjg0OTEsICAwLjE0MTksICAwLjQ4MzQsICAwLjg4MzUsICAxLjE0NTMsCisgMS4yODM5LCAgMS40MjI0LCAgMS41NTkzLCAgMS43ODc3LCAgMi4xMjg1LCAgMi40MDcwLCAgMi42MDQzLCAgMi44NTExLAorIDAuMTg4NiwgIDAuMzY3NywgIDAuNTYxNywgIDAuODA5OSwgIDEuMTI3NywgIDEuMzg0MSwgIDEuNTgwNCwgIDEuODEzNiwKKyAyLjAzMDcsICAyLjI4MDUsICAyLjUzOTksICAyLjgzMjIsICAwLjIzNTEsICAwLjQxNTEsICAwLjY2NzUsICAwLjg3MTMsCisgMS4wNDY0LCAgMS4zMjkyLCAgMS42NTg2LCAgMS45MjgxLCAgMi4xMzU1LCAgMi4zNDk1LCAgMi42MjIyLCAgMi44NzgyLAorIDAuMjcwMCwgIDAuNDQ4OSwgIDAuNjIwNiwgIDAuNzEyMSwgIDAuNzczNywgIDAuOTg0OCwgIDEuMzY1OCwgIDEuNzQzMywKKyAyLjAxMzksICAyLjIyNDMsICAyLjQ4MDYsICAyLjgxNzUsICAwLjI0NzksICAwLjQ0MjUsICAwLjY0OTAsICAwLjg3NDUsCisgMS4xMTYxLCAgMS4zODQ5LCAgMS42NzczLCAgMS45NTY2LCAgMi4xNDkxLCAgMi4zNjI0LCAgMi41Njg1LCAgMi44MTE0LAorIDAuMjAzNSwgIDAuMzcwMSwgIDAuNTU2NywgIDAuNzk1MywgIDEuMDA4MiwgIDEuMjc1OCwgIDEuNTM3MywgIDEuNzgyMiwKKyAyLjAxNzUsICAyLjI2MDEsICAyLjQ3NTksICAyLjc3NzEsICAwLjE4NTYsICAwLjM0NjEsICAwLjU5OTgsICAwLjkwNDEsCisgMS4yMzgzLCAgMS40NjEyLCAgMS42NjY3LCAgMS45MzA1LCAgMi4xNjE3LCAgMi40MTA3LCAgMi42NDc3LCAgMi44NjU2LAorIDAuMjEwNywgIDAuMzcxNSwgIDAuNTI4OSwgIDAuNjY1MSwgIDAuODQyMCwgIDEuMTE2OCwgIDEuNDQwMSwgIDEuNzIzMCwKKyAxLjk5MDEsICAyLjI2ODcsICAyLjU0NTIsICAyLjg2NTUsICAwLjEyMTgsICAwLjI5OTksICAwLjYzNDgsICAwLjk0ODIsCisgMS4yNzQ1LCAgMS41ODc2LCAgMS45MTI5LCAgMi4yMzQ4LCAgMi40MDIwLCAgMi40OTIyLCAgMi42MzUxLCAgMi44MzU3LAorIDAuMTYxNywgIDAuMzQ4MywgIDAuNTg2OSwgIDAuODE2MywgIDEuMDM2NiwgIDEuMjM0NCwgIDEuNDYwOSwgIDEuNzAyOSwKKyAxLjk0NzYsICAyLjIzMzcsICAyLjUyNTgsICAyLjg0NDIsICAwLjI1MDUsICAwLjQ4OTQsICAwLjc1MTAsICAwLjkxNTIsCisgMS4wODQ1LCAgMS4zNjU3LCAgMS42NTI4LCAgMS44MzQ2LCAgMi4wMTYwLCAgMi4yODExLCAgMi41MzM4LCAgMi44MTM2LAorIDAuMDk0NywgIDAuMTE1OCwgIDAuMDU3OCwgLTAuMDMzNywgLTAuMDA2NiwgIDAuMDEwNCwgLTAuMDQ0NywgLTAuMDUwNSwKKy0wLjA3NzgsIC0wLjAyOTMsICAwLjAyNTEsIC0wLjAxNDMsICAwLjAzNDksIC0wLjAyMjcsIC0wLjA5MDksICAwLjA1MjMsCisgMC4wMzI1LCAtMC4wNDEwLCAtMC4xMDQ1LCAtMC4wODk5LCAtMC4wMDA5LCAgMC4wMDc1LCAtMC4wNTc1LCAtMC4wODU1LAorLTAuMDEyOSwgIDAuMDU3NSwgIDAuMDU5NywgIDAuMDM5MSwgIDAuMDM3MSwgLTAuMDE4NCwgLTAuMDA4MywgIDAuMDI4NywKKyAwLjAxNDMsICAwLjAxNjcsICAwLjAxMjAsIC0wLjAxNjgsICAwLjA0NTIsICAwLjAyMjMsIC0wLjAzNTIsICAwLjAxMTksCistMC4wNDk2LCAtMC4wOTY1LCAtMC4wNjYxLCAtMC4wMDcyLCAgMC4xMDk5LCAgMC4wODQzLCAtMC4wMDg3LCAtMC4wNDc4LAorLTAuMDEyOCwgLTAuMDEyMCwgLTAuMDAwNCwgIDAuMDczMSwgIDAuMTA0NywgIDAuMDYzMCwgIDAuMDE5NiwgLTAuMDEwMywKKy0wLjAzOTksIC0wLjA5ODYsIC0wLjA5MTIsIC0wLjAzOTAsIC0wLjAyNDcsIC0wLjA2OTQsIC0wLjA3NDksIC0wLjAwNjYsCisgMC4wMjIzLCAgMC4wNjM0LCAgMC4wMzQzLCAtMC4wMTM0LCAgMC4wNzI3LCAgMC4wMjQxLCAgMC4wMDY2LCAgMC4wNDM3LAorIDAuMDYxMCwgIDAuMDM2NCwgIDAuMDI0OCwgLTAuMDM1OCwgLTAuMDY4NiwgLTAuMDEwNCwgIDAuMDQyNiwgIDAuMDA4OCwKKy0wLjAxMzcsIC0wLjAxNjUsICAwLjA2NzEsICAwLjA4MTUsIC0wLjA4NjMsIC0wLjA2NDQsIC0wLjAwODgsICAwLjAwMjMsCisgMC4wNDgyLCAgMC4xMTc0LCAgMC4xMjcwLCAgMC4wNTk0LCAgMC4wMTY1LCAgMC4wOTQ5LCAgMC4xMDk4LCAgMC4wMTM3LAorIDAuNDk1MSwgIDAuNDk5OSwgIDAuNDk1OCwgIDAuNDkwNywgIDAuNDk4NCwgIDAuNDk2NSwgIDAuNDk1OCwgIDAuNDk5NiwKKyAwLjQ5ODcsICAwLjQ5NTgsICAwLjQ5ODYsICAwLjQ5NzcsICAwLjI4NDEsICAwLjIxODYsICAwLjE0NzQsICAwLjE2ODcsCisgMC4yMjE3LCAgMC4yNjMyLCAgMC4yNzA2LCAgMC4yNjI0LCAgMC4yMTYyLCAgMC4yNDUzLCAgMC4yNDYwLCAgMC4yNTMxCit9LAorCisubHNwMTEgPSB7CisgMC4xMTAzLCAgMC4zODYyLCAgMC42ODYzLCAgMC44NDQ3LCAgMC45MjMxLCAgMS4wMjYxLCAgMS4xMjQ4LCAgMS40MDU3LAorIDEuNjYyMSwgIDEuODAxMCwgIDEuODY5MiwgIDIuMDcwNCwgIDIuMzQ5MCwgIDIuNjA2MCwgIDIuNzUzOSwgIDIuODk3NywKKyAwLjEyNzMsICAwLjI0MDcsICAwLjM4MTIsICAwLjYwMDQsICAwLjc3NjcsICAwLjkzODMsICAxLjEzNDQsICAxLjMzNTEsCisgMS41MjMzLCAgMS43MjYyLCAgMS45NDY2LCAgMi4xNzM5LCAgMi4zNDk1LCAgMi41MTYyLCAgMi43MTY0LCAgMi45MjAyLAorIDAuMjAxMCwgIDAuMzMzMCwgIDAuNDQ4OCwgIDAuNjQ2NSwgIDAuODA0NiwgIDAuOTg4OSwgIDEuMTQ3OSwgIDEuMjk2NCwKKyAxLjQ3NzAsICAxLjY2MDYsICAxLjg3ODksICAyLjExNTUsICAyLjMyODcsICAyLjUxOTksICAyLjcxMDEsICAyLjkxMTksCisgMC4xMTY4LCAgMC4yMTk3LCAgMC4zMjc5LCAgMC40NjkxLCAgMC42MjY4LCAgMC44MjUxLCAgMS4wNTMzLCAgMS4yNzE0LAorIDEuNDcxMiwgIDEuNjc2MiwgIDEuODgzMSwgIDIuMTExNCwgIDIuMzIzMCwgIDIuNTI5NywgIDIuNzM2NSwgIDIuOTI3MCwKKyAwLjE0MDUsICAwLjMxMDksICAwLjQ5ODYsICAwLjY4OTEsICAwLjg2MzQsICAxLjA1ODMsICAxLjI1OTQsICAxLjQzNDksCisgMS42MjMyLCAgMS44MTE2LCAgMS45OTA1LCAgMi4xOTM1LCAgMi4zNzk5LCAgMi41NjU2LCAgMi43NjYxLCAgMi45NDg2LAorIDAuMTcwMywgIDAuMzA1NywgIDAuNDQwMywgIDAuNTIyNSwgIDAuNTk2OSwgIDAuODExMCwgIDEuMDcyOSwgIDEuMzIxNSwKKyAxLjU0MDcsICAxLjczODEsICAxLjk0NzcsICAyLjE2ODAsICAyLjM1ODYsICAyLjU2MTIsICAyLjc2MzAsICAyLjk0MTAsCisgMC4xMTI4LCAgMC4yNjI4LCAgMC40NTIzLCAgMC42NDk1LCAgMC44MTc2LCAgMC45ODE2LCAgMS4xNzQ2LCAgMS4zNzEwLAorIDEuNTU2OCwgIDEuNzUxOCwgIDEuOTQ5NywgIDIuMTQ1MiwgIDIuMzM0NiwgIDIuNTM4OSwgIDIuNzM2MiwgIDIuOTI2NCwKKyAwLjE4MDksICAwLjMyODcsICAwLjUyMDUsICAwLjcyNjQsICAwLjkyOTgsICAxLjEyMTcsICAxLjI5NzAsICAxLjQ4OTQsCisgMS42ODc0LCAgMS44NDkzLCAgMi4wNTc2LCAgMi4yMzgyLCAgMi40MDk3LCAgMi42MDQxLCAgMi43Nzk2LCAgMi45Mzg5LAorIDAuMjUwMiwgIDAuNDcwOSwgIDAuNjg5MiwgIDAuODM0NiwgIDAuOTIwOSwgIDEuMDQ1NSwgIDEuMjM5OSwgIDEuNDYxNiwKKyAxLjY0NjMsICAxLjgzODAsICAyLjA0NzUsICAyLjIzOTcsICAyLjQ2NjUsICAyLjY1NTAsICAyLjc3MDEsICAyLjg4OTUsCisgMC4xMDQwLCAgMC4yMzQwLCAgMC4zOTY0LCAgMC41NzQwLCAgMC43NzY0LCAgMC45OTQxLCAgMS4yMDAwLCAgMS40MDE0LAorIDEuNjAyNCwgIDEuNzk3NCwgIDEuOTkzOSwgIDIuMTk1OSwgIDIuMzc4MywgIDIuNTY2MywgIDIuNzYxMywgIDIuOTQ4NCwKKyAwLjE5MTIsICAwLjMzOTMsICAwLjQ3NDMsICAwLjYzMTMsICAwLjgwMTQsICAwLjk4NzksICAxLjE4NTUsICAxLjM5MjIsCisgMS41Njc4LCAgMS43Mjg5LCAgMS45MjcxLCAgMi4xMTY1LCAgMi4zMDg5LCAgMi41NDE0LCAgMi43NDQ4LCAgMi45MjY5LAorIDAuMDk2NSwgIDAuMjAyNSwgIDAuMzM5OCwgIDAuNDk5MCwgIDAuNjkzNCwgIDAuOTM4NiwgIDEuMTczMCwgIDEuMzc2NiwKKyAxLjU3ODMsICAxLjc3ODMsICAxLjk3OTAsICAyLjE4MzEsICAyLjM2NzAsICAyLjU1NzgsICAyLjc2NDEsICAyLjk1MTYsCisgMC4yMTI2LCAgMC4zNjUyLCAgMC41NTQ1LCAgMC43MTcwLCAgMC44Njc0LCAgMS4wNjQwLCAgMS4yNTU4LCAgMS40MDYxLAorIDEuNTkwNCwgIDEuODA5NSwgIDEuOTc2MCwgIDIuMTUwNSwgIDIuMzU0OSwgIDIuNTU3NSwgIDIuNzAyMywgIDIuODg3NywKKyAwLjE4MjcsICAwLjM0MjYsICAwLjQ4OTQsICAwLjY0ODgsICAwLjc5NjAsICAwLjk1MzUsICAxLjEyMTcsICAxLjI3OTgsCisgMS40NTY2LCAgMS42NDUzLCAgMS44MDQ0LCAgMi4wMDQyLCAgMi4yMzc5LCAgMi40NjExLCAgMi42Njk3LCAgMi44OTY2LAorIDAuMjAzNCwgIDAuMzgyMiwgIDAuNTIzMSwgIDAuNjk2MCwgIDAuOTIwMCwgIDEuMDM5NCwgIDEuMTYxNiwgIDEuMzc3MiwKKyAxLjU0OTMsICAxLjczMzAsICAxLjk2NDYsICAyLjEyMzMsICAyLjMzMzQsICAyLjUzNjEsICAyLjcwODcsICAyLjk0NzAsCisgMC4xMDUwLCAgMC4yMDYwLCAgMC4zNzA1LCAgMC41OTk4LCAgMC44MzM3LCAgMS4wNTc3LCAgMS4yNTU5LCAgMS40MzI3LAorIDEuNjMzNCwgIDEuODE2NSwgIDEuOTg1MywgIDIuMjA1OCwgIDIuNDA2MywgIDIuNTgxOCwgIDIuNzYyNSwgIDIuOTQ1OCwKKyAwLjE0MTksICAwLjQwNTMsICAwLjY2NjAsICAwLjg5MTEsICAxLjA0MDUsICAxLjE1NDcsICAxLjI1MDYsICAxLjM5MjYsCisgMS41NjY5LCAgMS43NTI3LCAgMS45Njk0LCAgMi4yMDU0LCAgMi4zODg5LCAgMi41NzQzLCAgMi43NTg2LCAgMi45MTc0LAorIDAuMTUxNCwgIDAuMjgyNSwgIDAuNDMwOSwgIDAuNTc3MiwgIDAuNzQ3MCwgIDAuOTcwMywgIDEuMTQ2MiwgIDEuMzMxNiwKKyAxLjUzMjEsICAxLjcyNTksICAxLjkyODIsICAyLjEyNjYsICAyLjMxMDYsICAyLjUwNjQsICAyLjcwNjcsICAyLjkwOTQsCisgMC4xNjkzLCAgMC4zMTU2LCAgMC40ODc4LCAgMC42NjM1LCAgMC44MjA2LCAgMC45NTY5LCAgMS4xMTU0LCAgMS4zMDY0LAorIDEuNTEwOSwgIDEuNzE4NCwgIDEuOTE3OSwgIDIuMTAzNiwgIDIuMjc2MywgIDIuNDgyMCwgIDIuNjk0OSwgIDIuOTEwNSwKKyAwLjE0MzIsICAwLjI3MTgsICAwLjQyNDEsICAwLjU1NjQsICAwLjY5MzksICAwLjkwMTEsICAxLjE1ODIsICAxLjM5NDgsCisgMS42MTgxLCAgMS44MDI0LCAgMS45ODE0LCAgMi4xNzQwLCAgMi4zNDU5LCAgMi41NDU2LCAgMi43NDkxLCAgMi45MzA3LAorIDAuMjI5NCwgIDAuMzg1NywgIDAuNTU5MCwgIDAuNzQzNCwgIDAuOTE4OSwgIDEuMDk0MSwgIDEuMjc0MCwgIDEuNDQ1NiwKKyAxLjYxNzgsICAxLjc5OTQsICAxLjk2ODksICAyLjE2NDQsICAyLjM1MjUsICAyLjUzODUsICAyLjc0NjgsICAyLjk0MDUsCisgMC4xNjY3LCAgMC4zMTA5LCAgMC40NjEyLCAgMC42MDMyLCAgMC43Mzc1LCAgMC44ODY2LCAgMS4wODQwLCAgMS4zMDUzLAorIDEuNDk4MiwgIDEuNzA0NCwgIDEuOTE0NiwgIDIuMTExNywgIDIuMjk0MiwgIDIuNDk4MywgIDIuNzA4NCwgIDIuOTEzMiwKKyAwLjE4MTAsICAwLjMyMDUsICAwLjQ2OTYsICAwLjYyMzEsICAwLjc2NDEsICAwLjk5NTksICAxLjI0MjcsICAxLjQzNjEsCisgMS41ODg5LCAgMS43NTQ0LCAgMS45MDgzLCAgMi4wNzMzLCAgMi4yNDU3LCAgMi40NDYxLCAgMi42NzkzLCAgMi45MDk4LAorIDAuMTE2NCwgIDAuMzc1MywgIDAuNjA2OCwgIDAuNzUwMywgIDEuMDEwMCwgIDEuMjEzMSwgIDEuMzc5MywgIDEuNTMwMiwKKyAxLjYzMDAsICAxLjc5NTAsICAxLjkwNTcsICAyLjEwMzEsICAyLjM4MzAsICAyLjU3NDUsICAyLjY5NDksICAyLjg3NzksCisgMC4xNTcxLCAgMC40Mzc4LCAgMC42NzM1LCAgMC44MzEyLCAgMC44OTQ0LCAgMC45ODE4LCAgMS4xNjIyLCAgMS40MDk0LAorIDEuNjQyMywgIDEuODA2NiwgIDEuOTI1OCwgIDIuMTgzOCwgIDIuNDM2MywgIDIuNjI3OSwgIDIuNzM1OCwgIDIuODc5MCwKKyAwLjEzOTgsICAwLjI2ODYsICAwLjQyNDgsICAwLjYxNTYsICAwLjc4NzAsICAxLjAwMzUsICAxLjIwMTIsICAxLjM2ODksCisgMS41MzYzLCAgMS43Mzk4LCAgMS45NjA0LCAgMi4xNjE5LCAgMi4zMzQ1LCAgMi41MDk3LCAgMi43MjcxLCAgMi45MzY4LAorIDAuMTkxMywgIDAuMzMzOCwgIDAuNDk4NywgIDAuNjQ0NiwgIDAuNzg1MiwgIDEuMDE2MywgIDEuMTg4NiwgIDEuMzYxMCwKKyAxLjUzNzksICAxLjcyMzAsICAxLjg4ODAsICAyLjA4NjIsICAyLjI5NjAsICAyLjQ5MjgsICAyLjcxMjIsICAyLjkxNTEsCisgMC4wOTA4LCAgMC4xNzUyLCAgMC4yODk5LCAgMC41MzY1LCAgMC43NzYxLCAgMS4wMTAwLCAgMS4yMTI0LCAgMS40MDYwLAorIDEuNjAxOSwgIDEuODAxMCwgIDEuOTc3NCwgIDIuMTkwNSwgIDIuMzczMywgIDIuNTYyMywgIDIuNzY2MCwgIDIuOTU2NSwKKyAwLjE3NzMsICAwLjMxNzksICAwLjQ5MjUsICAwLjY4NjQsICAwLjg0NTIsICAwLjk4OTcsICAxLjE4NjAsICAxLjM3MjIsCisgMS41NTE1LCAgMS43NjU4LCAgMS45ODAyLCAgMi4xODE5LCAgMi4zNjIwLCAgMi41NDQyLCAgMi43MjUwLCAgMi45MjIwLAorIDAuMTI4NiwgIDAuMjM0MSwgIDAuMzY4OSwgIDAuNTM2NCwgIDAuNzE3NiwgIDAuOTM1MCwgIDEuMTA4MywgIDEuMjk0MywKKyAxLjQ5NzQsICAxLjcwNTksICAxLjkwNDcsICAyLjExNDUsICAyLjMyNDIsICAyLjUzNjEsICAyLjc0NTMsICAyLjkzMjksCisgMC4yMjczLCAgMC4zODM0LCAgMC41NTY1LCAgMC43MTkyLCAgMC44NDMxLCAgMC45OTYyLCAgMS4xNzYzLCAgMS4zNTcxLAorIDEuNTc3NCwgIDEuNzQxOSwgIDEuOTIwMiwgIDIuMTEzMSwgIDIuMjkxOSwgIDIuNDg5OCwgIDIuNjg5NSwgIDIuOTE4MCwKKyAwLjE3NzUsICAwLjMwNTgsICAwLjQyNzQsICAwLjYwMjMsICAwLjgxNTEsICAxLjA3MzQsICAxLjMyMTEsICAxLjUxNzgsCisgMS42NzA2LCAgMS44MTU0LCAgMS45Njg2LCAgMi4xNTM3LCAgMi4zNDYxLCAgMi41Mjc2LCAgMi43MTgxLCAgMi45MTIxLAorIDAuMTY1MywgIDAuNDMwNCwgIDAuNjM2MSwgIDAuNzgyNCwgIDAuOTE4MywgIDEuMDQ1MiwgIDEuMjA3MSwgIDEuNDA3NywKKyAxLjYyMDYsICAxLjgyOTksICAyLjAwODksICAyLjE5NDgsICAyLjM5MDAsICAyLjU5ODIsICAyLjc4NDQsICAyLjk0ODcsCisgMC4xNDkyLCAgMC4yNjA5LCAgMC4zODIwLCAgMC41NDg1LCAgMC43MjQzLCAgMC45MzE5LCAgMS4xNTM4LCAgMS4zNTc5LAorIDEuNTI2NiwgIDEuNzAwMiwgIDEuODg3MywgIDIuMTAxNiwgIDIuMzE3NSwgIDIuNTIyMSwgIDIuNzI0MSwgIDIuOTI0MywKKyAwLjIwNzQsICAwLjM3ODEsICAwLjUyMDksICAwLjY4NjksICAwLjg1NzcsICAwLjk4NzUsICAxLjE4NDksICAxLjM1NjgsCisgMS40OTA3LCAgMS43MzM1LCAgMS44OTAyLCAgMi4xMjI0LCAgMi4zMDk5LCAgMi40OTE4LCAgMi43MDIzLCAgMi44NzY1LAorIDAuMTM1OSwgIDAuMjI1NCwgIDAuMzI4NiwgIDAuNDQzMiwgIDAuNjU4NiwgIDAuODk2NCwgIDEuMTEyNSwgIDEuMzUyMywKKyAxLjU2MjYsICAxLjc1NzksICAxLjk4NDYsICAyLjE5MDUsICAyLjM1NDgsICAyLjU1NDIsICAyLjc2NjMsICAyLjkzNDYsCisgMC4xNDMwLCAgMC4yOTY2LCAgMC40Njg1LCAgMC42NDkzLCAgMC44MzE1LCAgMS4wMzA0LCAgMS4yMjIwLCAgMS40MDgyLAorIDEuNTk5NSwgIDEuNzg4OCwgIDEuOTc3NCwgIDIuMTczNywgIDIuMzYwNywgIDIuNTU3NywgIDIuNzU1OCwgIDIuOTQwNSwKKyAwLjE0NzcsICAwLjI2OTQsICAwLjQwNTYsICAwLjU2MjYsICAwLjcwNTEsICAwLjg2NDcsICAxLjA0OTEsICAxLjI0ODgsCisgMS40ODE0LCAgMS43MDcyLCAgMS45MTUwLCAgMi4xMTQ3LCAgMi4zMDM4LCAgMi41MTQ0LCAgMi43MTg0LCAgMi45MjAyLAorIDAuMTY5MCwgIDAuMzAzMywgIDAuNDU4MCwgIDAuNjY4NiwgIDAuODUzNiwgIDEuMDI5MywgIDEuMjEyNCwgIDEuMzk5OCwKKyAxLjU3MTgsICAxLjc2MDcsICAxLjk1ODAsICAyLjEyNDUsICAyLjI5NzEsICAyLjQ3NjIsICAyLjY4OTYsICAyLjkxNzcsCisgMC4xMDkyLCAgMC4yNzc5LCAgMC40ODUzLCAgMC42ODgwLCAgMC45MDExLCAgMS4wOTUzLCAgMS4yNzUyLCAgMS40NjE4LAorIDEuNjYyMywgIDEuODQ4NCwgIDIuMDI2NCwgIDIuMjE1MiwgIDIuNDAxNywgIDIuNTgzNSwgIDIuNzY3MSwgIDIuOTQzNiwKKyAwLjE0OTcsICAwLjM2MzcsICAwLjYwMTQsICAwLjgwMzIsICAwLjk5NjMsICAxLjE4MzUsICAxLjM3NDEsICAxLjU2OTgsCisgMS43MzgyLCAgMS45MDk0LCAgMi4wNzEwLCAgMi4yMzkyLCAgMi40MDgyLCAgMi41OTI2LCAgMi43NzYyLCAgMi45NTM2LAorIDAuMTQzNCwgIDAuMjQ5MiwgIDAuMzk2NiwgIDAuNTkzNCwgIDAuODAzMywgIDEuMDY1NywgIDEuMjc5NiwgIDEuNDI3NiwKKyAxLjU3NDUsICAxLjc4MzMsICAxLjkyODgsICAyLjEyNDcsICAyLjM1NDMsICAyLjU0MTIsICAyLjcwNDksICAyLjg4NzIsCisgMC4xNjEyLCAgMC4yOTI2LCAgMC40NTc0LCAgMC42Mzg3LCAgMC44MjY1LCAgMS4wMTgwLCAgMS4xODA4LCAgMS4zNTI2LAorIDEuNTU2NCwgIDEuNzUzNiwgIDEuOTE4NywgIDIuMTE5MiwgIDIuMzE0OSwgIDIuNTAwNiwgIDIuNzEwMSwgIDIuOTIxNywKKyAwLjA4MjgsICAwLjE4NjMsICAwLjMyMzUsICAwLjUwNTAsICAwLjcyNTAsICAwLjk4NjcsICAxLjIwOTMsICAxLjM5NDEsCisgMS41OTgwLCAgMS43OTMyLCAgMS45ODA5LCAgMi4xODk0LCAgMi4zOTE4LCAgMi41NzczLCAgMi43NTQwLCAgMi45MzI5LAorIDAuMjAwMSwgIDAuMzY1NSwgIDAuNTI5MCwgIDAuNjc2MSwgIDAuODAyNywgIDAuOTk3MiwgIDEuMjA5MCwgIDEuNDI1NSwKKyAxLjYwODUsICAxLjc4MjUsICAxLjk4MDQsICAyLjE2ODEsICAyLjM0NTcsICAyLjUzMjUsICAyLjczMTksICAyLjkxOTYsCisgMC4xNTA1LCAgMC4yNzY3LCAgMC40MjU0LCAgMC42MDU0LCAgMC43ODIxLCAgMC45NTY3LCAgMS4xMjk0LCAgMS4zMDgwLAorIDEuNDk4NCwgIDEuNjk1NCwgIDEuODY2NiwgIDIuMDczNiwgIDIuMjg3NSwgIDIuNDk2OSwgIDIuNzA3MiwgIDIuOTE2MywKKyAwLjE1ODksICAwLjQxNTEsICAwLjU3NDksICAwLjY2NTEsICAwLjgwNjEsICAxLjA0NzAsICAxLjI2MTYsICAxLjM2OTAsCisgMS40OTg1LCAgMS43ODA4LCAgMS45ODI1LCAgMi4xMDY4LCAgMi4yNzUxLCAgMi41NDQ4LCAgMi43MTMzLCAgMi44Njg5LAorIDAuMDkxNiwgIDAuMTg0NiwgIDAuMzc4OCwgIDAuNjMyOSwgIDAuODc3NCwgIDEuMDY4NywgIDEuMjY1MywgIDEuNDU2MSwKKyAxLjY1NzMsICAxLjg0NDksICAyLjA0MDIsICAyLjIyNTQsICAyLjM5NjgsICAyLjU4NjEsICAyLjc3OTIsICAyLjk1MDgsCisgMC4yMjgyLCAgMC40MTU5LCAgMC41ODM0LCAgMC42ODk5LCAgMC44MTA4LCAgMS4wMzIxLCAgMS4yNzk1LCAgMS41MjYyLAorIDEuNjkzNiwgIDEuODQ2OSwgIDIuMDkyMiwgIDIuMjYwNywgIDIuMzc5NSwgIDIuNTMwMSwgIDIuNzM4NiwgIDIuOTUzMCwKKyAwLjE2NTEsICAwLjMwMDQsICAwLjQ1NTUsICAwLjYxNzksICAwLjc4OTEsICAwLjk1ODQsICAxLjEzNzIsICAxLjM3MDcsCisgMS41OTUxLCAgMS43ODgwLCAgMS45NDM0LCAgMi4xNDY1LCAgMi4zMzExLCAgMi41MDgxLCAgMi42OTc3LCAgMi44OTcwLAorIDAuMTI3OSwgIDAuMzgyOCwgIDAuNjMzMCwgIDAuODMyMywgIDAuOTY1MiwgIDEuMTE3NSwgIDEuMjMxOSwgIDEuMzUxMSwKKyAxLjUxMTUsICAxLjYzOTIsICAxLjc4MzUsICAxLjk1NTgsICAyLjIwMDgsICAyLjQ2MzUsICAyLjY5MTAsICAyLjkwNTgsCisgMC4xMTkzLCAgMC4yMTg1LCAgMC4zNTIxLCAgMC41MzExLCAgMC43Mzc4LCAgMC45MjM5LCAgMS4xMTA1LCAgMS4zMjE3LAorIDEuNTM2MiwgIDEuNzUwNCwgIDEuOTUzNiwgIDIuMTYyNywgIDIuMzU2MCwgIDIuNTUwNiwgIDIuNzU0OCwgIDIuOTQ1MywKKyAwLjE4MDYsICAwLjM0MzIsICAwLjQ5ODEsICAwLjY5NDgsICAwLjg5MjgsICAxLjA1MjcsICAxLjI0NjcsICAxLjQxNDAsCisgMS42MzI2LCAgMS43OTUwLCAgMS45OTM1LCAgMi4xOTY5LCAgMi4zNTEyLCAgMi41NjgyLCAgMi43NDQ1LCAgMi45Mjc3LAorIDAuMTg0NiwgIDAuMzExMiwgIDAuNDU2OCwgIDAuNTg5MSwgIDAuNzMxNywgIDAuODQ5MywgIDEuMDIwNCwgIDEuMjAyMiwKKyAxLjM2ODgsICAxLjYwMjAsICAxLjg0MjgsICAyLjA3MTAsICAyLjI3MjUsICAyLjQ4NzksICAyLjcwNTcsICAyLjkxNjAsCisgMC4wODgwLCAgMC4yNTE0LCAgMC41MzMyLCAgMC43MjcyLCAgMC44OTA2LCAgMS4xMzU0LCAgMS4zMTk5LCAgMS40OTQxLAorIDEuNjAxMCwgIDEuNzE1MSwgIDEuODcxMiwgIDIuMDY0MywgIDIuMjc1NSwgIDIuNTM3NSwgIDIuNzA1NCwgIDIuODg5MSwKKyAwLjEzODIsICAwLjI4MzMsICAwLjQ2NTgsICAwLjY4OTcsICAwLjkwNzEsICAxLjA3MTYsICAxLjI0NjksICAxLjQxNDMsCisgMS41OTEwLCAgMS43OTQ3LCAgMS45ODA1LCAgMi4xNTgxLCAgMi4zMzM4LCAgMi41MjE1LCAgMi43MjkyLCAgMi45MjExLAorIDAuMTA2MSwgIDAuMzQ5NCwgIDAuNjMyNywgIDAuODU3MCwgIDAuOTc0OCwgIDEuMDU2MCwgIDEuMTUyOSwgIDEuMzI1MCwKKyAxLjYwMzIsICAxLjgzNDAsICAxLjk3MTEsICAyLjExNTcsICAyLjMwMTEsICAyLjU0NjQsICAyLjgwNzgsICAyLjk4MDMsCisgMC4xNjAzLCAgMC4yODM5LCAgMC40MzA3LCAgMC41OTgwLCAgMC43OTgwLCAgMS4wMzk5LCAgMS4xOTcxLCAgMS4zNTI0LAorIDEuNTcxNSwgIDEuNzgzOCwgIDEuOTQ2OCwgIDIuMTQ5OCwgIDIuMzYyNywgIDIuNTUxNCwgIDIuNzMyNywgIDIuOTE0OCwKKyAwLjE2OTEsICAwLjMxMTcsICAwLjQ3OTYsICAwLjY4OTUsICAwLjg3MzIsICAxLjAxNjQsICAxLjE5MTYsICAxLjM3MDcsCisgMS41Mzg0LCAgMS43MjAyLCAgMS44ODU3LCAgMi4wNjcyLCAgMi4yNDg3LCAgMi40NTkzLCAgMi42Nzg5LCAgMi44OTQwLAorIDAuMDk2NSwgIDAuMTcwMiwgIDAuMzE5MSwgIDAuNTcyMSwgIDAuODEwMCwgIDEuMDI0MSwgIDEuMjI3MiwgIDEuNDE5NiwKKyAxLjYwOTMsICAxLjgwNTcsICAxLjk4ODQsICAyLjIwMzcsICAyLjM5MjUsICAyLjU4MDUsICAyLjc1NzgsICAyLjkzNjYsCisgMC4xOTUwLCAgMC4zNTE5LCAgMC41MjcyLCAgMC42OTczLCAgMC44NzMyLCAgMS4wNjU2LCAgMS4yMTEyLCAgMS4zOTU5LAorIDEuNjExNiwgIDEuNzgyMSwgIDEuOTQ0NSwgIDIuMTU5MiwgIDIuMzM0OCwgIDIuNTE0MiwgIDIuNzQ0MCwgIDIuOTI5NywKKyAwLjEzODgsICAwLjI1NTcsICAwLjQxMjAsICAwLjU3MjcsICAwLjczNTQsICAwLjkxOTYsICAxLjA5ODUsICAxLjI4MDUsCisgMS40NjQzLCAgMS42NTM1LCAgMS44MzQwLCAgMi4wNTQ2LCAgMi4yNzU4LCAgMi40Nzc4LCAgMi42OTIxLCAgMi45MTIyLAorIDAuMTgyMywgIDAuMzMzNiwgIDAuNDk1NywgIDAuNjc3MSwgIDAuODU2MywgIDEuMDEzNywgIDEuMjI5OSwgIDEuMzg0OSwKKyAxLjU3MTgsICAxLjc2NjcsICAxLjkxOTMsICAyLjEzMjYsICAyLjMxMzUsICAyLjUyNjgsICAyLjcxMzMsICAyLjg5OTgsCisgMC4wNzkwLCAgMC4xOTAxLCAgMC40MDgzLCAgMC42NDU2LCAgMC44NDYzLCAgMS4wMjg1LCAgMS4yMjk3LCAgMS40MTgxLAorIDEuNjE1OSwgIDEuODA1NiwgIDEuOTk3MSwgIDIuMTkxMiwgIDIuMzgxNiwgIDIuNTc0NiwgIDIuNzY5MiwgIDIuOTQ5NywKKyAwLjAwNDksICAwLjAxMTYsICAwLjAwNDUsICAwLjAwMzksIC0wLjAwMTAsIC0wLjAxMjIsIC0wLjAyMDUsIC0wLjAwMzQsCistMC4wMTQwLCAtMC4wMDQxLCAgMC4wMTkxLCAtMC4wMzIyLCAgMC4wMDAyLCAtMC4wMTI0LCAtMC4wMjY5LCAgMC4wMDU5LAorIDAuMDU4NiwgIDAuMDMzOSwgLTAuMDM4OSwgLTAuMDMxOSwgLTAuMDA3OSwgLTAuMDIwNSwgLTAuMDM2MywgLTAuMDIxMSwKKyAwLjAyNDEsICAwLjA1OTUsICAwLjA0NjksICAwLjAyODMsICAwLjAxNzYsIC0wLjAxODMsIC0wLjAxNzMsIC0wLjAwMDQsCisgMC4wMDI0LCAgMC4wMTQ1LCAgMC4wNTM0LCAgMC4wMTk3LCAtMC4wMDY1LCAtMC4wMDY3LCAgMC4wMTMzLCAgMC4wMzU4LAorLTAuMDEwNCwgLTAuMDM4NiwgLTAuMDEwOSwgLTAuMDA3OCwgIDAuMDI3NSwgIDAuMDU2NSwgIDAuMDI1MSwgLTAuMDAyNywKKy0wLjAwNTMsICAwLjAxNzEsICAwLjAwODgsICAwLjA0OTUsICAwLjAxNDEsICAwLjAwMzksIC0wLjA0NDUsIC0wLjA0MjYsCistMC4wMTg0LCAtMC4wMjgwLCAtMC4wMjIzLCAgMC4wMDM5LCAtMC4wMTcxLCAtMC4wNjA2LCAtMC4wNzg2LCAtMC4wNDMwLAorIDAuMDU0NCwgIDAuMDU5NSwgIDAuMDMyMCwgLTAuMDAxMiwgIDAuMDEwOCwgIDAuMDE4NSwgIDAuMDA2NiwgIDAuMDQwOCwKKyAwLjA1NTIsIC0wLjAwNzMsIC0wLjAyNDcsIC0wLjA0ODAsIC0wLjAyODgsICAwLjAxODYsICAwLjAyMTIsIC0wLjAwMTMsCisgMC4wNDAzLCAgMC4wNTk4LCAgMC4wNjkwLCAgMC4wNTE2LCAtMC4wMjk4LCAtMC4wMTc3LCAgMC4wMjc4LCAgMC4wMTY4LAorLTAuMDEwNiwgIDAuMDI1MSwgIDAuMDM4NiwgIDAuMDMzMSwgLTAuMDA1MiwgIDAuMDEzMywgIDAuMDI5MSwgLTAuMDE1OCwKKy0wLjAzMjksIC0wLjAzNjcsICAwLjAyODcsICAwLjA0NjIsIC0wLjAxNzYsICAwLjAwNDksICAwLjAyNDIsIC0wLjAwMzQsCisgMC4wMTM1LCAgMC4wMDg2LCAtMC4wMTQ5LCAgMC4wMjQxLCAgMC4wNTA0LCAgMC4wMjQ2LCAtMC4wMjczLCAtMC4wMzY5LAorLTAuMDEwOCwgLTAuMDQ0OSwgLTAuMDYyNSwgLTAuMDQxNCwgLTAuMDI5MiwgLTAuMDU3MSwgLTAuMDQ0MCwgLTAuMDA4OCwKKyAwLjAwOTgsICAwLjAwMDksIC0wLjAwMDQsICAwLjAwMDcsIC0wLjAzMTQsIC0wLjAyMDgsIC0wLjAxMzgsIC0wLjAyNzcsCistMC4wMDQ0LCAgMC4wNTIyLCAgMC4wMzE1LCAtMC4wMjcwLCAtMC4wMjc3LCAtMC4wMjU2LCAtMC4wMTAzLCAtMC4wMjAxLAorLTAuMDI4NywgLTAuMDI3OSwgLTAuMDE4MiwgIDAuMDQ3MiwgIDAuMDYxMywgIDAuMDQ1MCwgIDAuMDQxMywgIDAuMDMzMywKKyAwLjA0NDQsICAwLjAyMjMsICAwLjAwNjEsICAwLjAzMTYsICAwLjAzMjEsICAwLjA1MDEsICAwLjA0NjAsICAwLjAyNTAsCisgMC4wMjI3LCAgMC4wMjM1LCAgMC4wMDk5LCAgMC4wMTg1LCAtMC4wMzQ3LCAtMC4wNjg0LCAtMC4wMTg5LCAgMC4wMjQyLAorLTAuMDE5MCwgLTAuMDI3MywgLTAuMDAxMiwgLTAuMDI1MywgIDAuMDI5MywgLTAuMDIzMSwgLTAuMDIxOSwgLTAuMDAxMCwKKyAwLjAxNTMsICAwLjAxMjgsIC0wLjAxNjYsIC0wLjA0MzUsIC0wLjA0MTcsIC0wLjAxMjEsIC0wLjAzNTEsIC0wLjAzOTAsCisgMC4wMDc3LCAtMC4wMjc4LCAtMC4wMzU1LCAgMC4wMDkyLCAtMC4wMDYzLCAgMC4wMDA1LCAgMC4wMjE2LCAgMC4wNDYxLAorIDAuMDUzOCwgIDAuMDQ1MSwgIDAuMDI5OCwgLTAuMDEzMCwgIDAuMDA1OCwgIDAuMDIwNiwgIDAuMDQ3MSwgIDAuMDQ5OSwKKyAwLjAyODAsICAwLjAwODYsIC0wLjAwMDcsIC0wLjAzMTcsICAwLjAyNTksICAwLjAxNzYsICAwLjAwNDMsICAwLjAyMTIsCisgMC4wMTM4LCAgMC4wMTA2LCAgMC4wMjIwLCAtMC4wMDI1LCAgMC4wMDUwLCAgMC4wMTIyLCAtMC4wMDUxLCAtMC4wMDg2LAorLTAuMDQ3MiwgLTAuMDAwNSwgIDAuMDE5MywgIDAuMDAzMiwgIDAuMDI0NiwgIDAuMDIyMiwgIDAuMDA5MCwgLTAuMDMyMCwKKy0wLjA3MTMsIC0wLjA1MjYsIC0wLjAxNTEsIC0wLjA0NDAsIC0wLjA2NDgsIC0wLjA0NjYsIC0wLjAwOTIsICAwLjAxMTUsCistMC4wMTI5LCAgMC4wMDUzLCAtMC4wMzQ0LCAtMC4wMzg1LCAgMC4wMzkyLCAgMC4wNTk5LCAgMC4wNDE0LCAgMC4wMTY1LAorLTAuMDA5OCwgLTAuMDMyMCwgLTAuMDI2MSwgLTAuMDA1NSwgLTAuMDEzOSwgLTAuMDExMCwgIDAuMDA4NCwgIDAuMDE3MiwKKy0wLjA0OTIsIC0wLjA1MzcsIC0wLjAzMjAsIC0wLjAwMzYsICAwLjAyNjUsICAwLjAzODUsICAwLjAwNjQsIC0wLjAyODAsCistMC4wMjMwLCAgMC4wMTM0LCAgMC4wMjQxLCAgMC4wMTA2LCAgMC4wMzg3LCAgMC4wMTA1LCAgMC4wMDY4LCAgMC4wMjYwLAorIDAuNDk0MCwgIDAuNDkxMSwgIDAuNDg0OSwgIDAuNDgyMCwgIDAuNDgzNywgIDAuNDgzOSwgIDAuNDgyNCwgIDAuNDc5OSwKKyAwLjQ4MTIsICAwLjQ3ODIsICAwLjQ3ODgsICAwLjQ3MTEsICAwLjQ3MDYsICAwLjQ2NzEsICAwLjQ2MDEsICAwLjQ1NzgsCisgMC4yOTU0LCAgMC4yMTIxLCAgMC4xODU5LCAgMC4xOTU4LCAgMC4xNDc0LCAgMC4xMDg2LCAgMC4xMzUxLCAgMC4xMzYyLAorIDAuMTQ4NiwgIDAuMTM0MiwgIDAuMTIxNSwgIDAuMTQyMywgIDAuMTYzNCwgIDAuMTU4OCwgIDAuMTUzOSwgIDAuMTg1NworfSwKKworLmxzcDE2ID0geworIDAuMTgxMywgIDAuMzkxMSwgIDAuNjMwMSwgIDAuODAxMiwgIDEuMDA1NywgIDEuMjA0MSwgIDEuNDI3MSwgIDEuNjk0MywKKyAxLjk0MDIsICAyLjE3MzMsICAyLjM1MjEsICAyLjQ5ODksICAyLjU4MzksICAyLjY4NDYsICAyLjc2MzQsICAyLjg5NTAsCisgMC4xMzExLCAgMC4zMTgzLCAgMC40NjU5LCAgMC41NjAxLCAgMC42NjU4LCAgMC43ODI4LCAgMS4wMDY1LCAgMS4yNzE3LAorIDEuNTE4NSwgIDEuNzMzOSwgIDEuOTUzMCwgIDIuMjE4OSwgIDIuMzczOSwgIDIuNDk5MSwgIDIuNjk4NCwgIDIuOTI1NiwKKyAwLjE2MjcsICAwLjQ1MTksICAwLjYzMjMsICAwLjcwMTIsICAwLjc4NDgsICAwLjk4MDEsICAxLjE4MTAsICAxLjMyMjIsCisgMS41NDEzLCAgMS44MTI5LCAgMS45MzM4LCAgMi4wODA5LCAgMi4zMTgwLCAgMi41MTg5LCAgMi43MDY2LCAgMi45NTE0LAorIDAuMTQ3NSwgIDAuMjQ0NywgIDAuNDI0MCwgIDAuNTY2OSwgIDAuNzg3MiwgIDAuOTgzOCwgIDEuMTgyMywgIDEuMzgxNCwKKyAxLjUzNTgsICAxLjY4MjAsICAxLjg3OTQsICAyLjE0MTksICAyLjQxMzIsICAyLjYxMTIsICAyLjc5MTEsICAyLjk1MTEsCisgMC4xMjI0LCAgMC4yODc2LCAgMC41MDEzLCAgMC42OTg1LCAgMC44OTAyLCAgMS4wOTAxLCAgMS4yODM1LCAgMS40NzY4LAorIDEuNjU5NiwgIDEuODUzOCwgIDIuMDQ2NywgIDIuMjMwNCwgIDIuNDEyNCwgIDIuNTk0MiwgIDIuNzcyOSwgIDIuOTUzMSwKKyAwLjE3NDEsICAwLjMwMzQsICAwLjQ2NzcsICAwLjU4NzksICAwLjcyNTgsICAwLjk2NDgsICAxLjE0MTcsICAxLjMyMjAsCisgMS41MDgxLCAgMS43MTUxLCAgMS45MjEyLCAgMi4xMjg2LCAgMi4zMjA4LCAgMi40OTM4LCAgMi42NzY1LCAgMi44ODkxLAorIDAuMTY1NywgIDAuMzE3NCwgIDAuNDkwNywgIDAuNjU1OSwgIDAuODI5NSwgIDEuMDI1NCwgIDEuMjA3MSwgIDEuMzg4MCwKKyAxLjU3MzcsICAxLjc4NDUsICAxLjkwMjcsICAyLjExMzksICAyLjMzMjMsICAyLjUxNTcsICAyLjczMjMsICAyLjkwMTUsCisgMC4xNTkyLCAgMC4yNzU4LCAgMC40NDE3LCAgMC42MzE1LCAgMC44MjU3LCAgMC45ODczLCAgMS4xMjc3LCAgMS4yODMwLAorIDEuNDMzNywgIDEuNjMxNSwgIDEuODg5OSwgIDIuMTM1NiwgIDIuMzU3MiwgIDIuNTYzMiwgIDIuNzQ2OCwgIDIuOTQyMCwKKyAwLjE1MjQsICAwLjQzMjUsICAwLjU5MzEsICAwLjcwMzYsICAwLjc2OTYsICAwLjg5MjMsICAxLjE3MzksICAxLjQ3NzMsCisgMS42NjA5LCAgMS43OTExLCAgMS45NjY2LCAgMi4xOTcyLCAgMi4zNzU0LCAgMi41MDQ1LCAgMi42NjEzLCAgMi44ODgyLAorIDAuMjEzMCwgIDAuMzAxMywgIDAuMzcyMSwgIDAuNDI1NywgIDAuNTA3OSwgIDAuNzAxNSwgIDAuOTgxNSwgIDEuMjU1NCwKKyAxLjQ2NDgsICAxLjY5NjYsICAxLjkxMzgsICAyLjEwNzUsICAyLjMzMTgsICAyLjUyOTIsICAyLjc0NTMsICAyLjkzNDcsCisgMC4xMTQyLCAgMC4zNzQ4LCAgMC42MjA1LCAgMC43NjQyLCAgMC44MTIxLCAgMC45MDIyLCAgMC45ODQzLCAgMS4xNTU4LAorIDEuNDQ2NywgIDEuNzQyMiwgIDEuOTU3NCwgIDIuMTMwMiwgIDIuMzgxMiwgIDIuNTg5OCwgIDIuNzcyMCwgIDIuOTU4MywKKyAwLjEyNTUsICAwLjIzMzksICAwLjM1NzAsICAwLjUzMjMsICAwLjc0NTgsICAxLjAwMDMsICAxLjE3MjksICAxLjM1NjcsCisgMS41MjE3LCAgMS42OTc3LCAgMS44OTI0LCAgMi4wOTQyLCAgMi4zMTQ1LCAgMi41NDA4LCAgMi43NTUzLCAgMi45MzM3LAorIDAuMTMxNiwgIDAuMjI4OSwgIDAuNDMyNywgIDAuNjY2MywgIDAuODUwOSwgIDAuOTk5NCwgIDEuMTY5NywgIDEuMzgwNCwKKyAxLjU2MDksICAxLjY5MDMsICAxLjg1NzIsICAyLjEwMTksICAyLjM2ODcsICAyLjU3ODksICAyLjc3MTUsICAyLjk0NzIsCisgMC4xNTAyLCAgMC4yNTQ2LCAgMC4zODgzLCAgMC41MzMzLCAgMC42OTc2LCAgMC45MTYzLCAgMS4xMDcxLCAgMS4zMzY0LAorIDEuNTQyMCwgIDEuNzUyNSwgIDEuODk0OCwgIDIuMDgzOSwgIDIuMjgxOSwgIDIuNDY1MSwgIDIuNjg3NSwgIDIuODk4NywKKyAwLjE1OTMsICAwLjMwMTQsICAwLjQ1NzMsICAwLjYzNTQsICAwLjgxNTcsICAwLjk4MDUsICAxLjE3ODMsICAxLjM3NDcsCisgMS41Njc4LCAgMS43MzI2LCAgMS45Mjg2LCAgMi4xMzQwLCAgMi4zMjUzLCAgMi41MjgwLCAgMi43MTgwLCAgMi45Mjk4LAorIDAuMTgxMSwgIDAuMzE2NywgIDAuNDY1NSwgIDAuNjUwNywgIDAuODE5OCwgIDEuMDA3NSwgIDEuMTg5MiwgIDEuMzc0MywKKyAxLjUyMjcsICAxLjcwOTAsICAxLjg4NDksICAyLjA3NDMsICAyLjI3NTAsICAyLjQ4MzAsICAyLjY4OTYsICAyLjg5NTMsCisgMC4xODQ2LCAgMC4zNTc3LCAgMC41MzE1LCAgMC43MjkwLCAgMC45MTc2LCAgMS4xMDE2LCAgMS4yNjU0LCAgMS40NTI1LAorIDEuNjMxNSwgIDEuODI2OCwgIDIuMDIzOCwgIDIuMTkzNCwgIDIuMzg2OCwgIDIuNTc1MywgIDIuNzY4MiwgIDIuOTQ2OSwKKyAwLjA4NzYsICAwLjE0MzksICAwLjIwNDgsICAwLjM2NTQsICAwLjYyODEsICAwLjg4NTMsICAxLjA5MDcsICAxLjI5OTIsCisgMS41MjI3LCAgMS43MzczLCAgMS45Mzk1LCAgMi4xNDE5LCAgMi4zNDg4LCAgMi41NDg2LCAgMi43NDY2LCAgMi45MzQ4LAorIDAuMTM5MSwgIDAuNDE3MCwgIDAuNjU2MSwgIDAuNzk1MywgIDAuODczNCwgIDAuOTk4NiwgIDEuMTg3MCwgIDEuNDUyMCwKKyAxLjYwNDIsICAxLjc5MTAsICAyLjAxMzUsICAyLjE4NzAsICAyLjMzNTgsICAyLjUwNjYsICAyLjc0MDksICAyLjk5NTUsCisgMC4wODA0LCAgMC4xMzU1LCAgMC4yNTk5LCAgMC40OTk4LCAgMC43NDA4LCAgMC45NDc0LCAgMS4xMjc2LCAgMS4zNDI4LAorIDEuNTU1NiwgIDEuNzcxMiwgIDEuOTY5OSwgIDIuMTUzNSwgIDIuMzYwNSwgIDIuNTU0OCwgIDIuNzQ4OSwgIDIuOTMyNSwKKyAwLjEzMDQsICAwLjMwODcsICAwLjQ5NzksICAwLjY1ODQsICAwLjg0MTQsICAxLjAzMjksICAxLjIyNDQsICAxLjQxODksCisgMS42MTE4LCAgMS44MjAwLCAgMS45OTg1LCAgMi4xODkzLCAgMi4zOTE1LCAgMi41Nzk0LCAgMi43NjQ3LCAgMi45MzQ0LAorIDAuMTg5NSwgIDAuMjg0OSwgIDAuMzcwNSwgIDAuNDEyNiwgIDAuNjI2NSwgIDAuOTIwNywgIDEuMTc3NCwgIDEuMzc2MiwKKyAxLjU3NTcsICAxLjc3MjgsICAxLjk1NjgsICAyLjE2NjIsICAyLjM2MTUsICAyLjU1NzUsICAyLjc1NjEsICAyLjk0MTYsCisgMC4xODAwLCAgMC4zMDc4LCAgMC40ODA1LCAgMC42Nzk2LCAgMC44NTAzLCAgMS4wMDQ2LCAgMS4xNzAzLCAgMS4zMjY5LAorIDEuNDg2MiwgIDEuNjUwMiwgIDEuODQ1NCwgIDIuMDg3MywgIDIuMzE3NSwgIDIuNTM1NiwgIDIuNzUxNiwgIDIuOTQ2OSwKKyAwLjE5NTAsICAwLjMyMzMsICAwLjQ1NjgsICAwLjU5NDAsICAwLjc1ODksICAwLjk5NzgsICAxLjE3MDEsICAxLjMzODMsCisgMS41MDE3LCAgMS42NTY1LCAgMS44MjQzLCAgMi4wNjA1LCAgMi4yOTM4LCAgMi41MTQ3LCAgMi43NDE5LCAgMi45Mzk2LAorIDAuMjUzMSwgIDAuNDM5MSwgIDAuNTc5MCwgIDAuNzE3MCwgIDAuODk5OCwgIDEuMTQzMCwgIDEuMzU3NywgIDEuNTMyNiwKKyAxLjYzMjgsICAxLjc2MjcsICAxLjk3MjYsICAyLjE3NjIsICAyLjM1NjMsICAyLjU0NzgsICAyLjczODUsICAyLjkwNjcsCisgMC4xODA1LCAgMC4yNzg4LCAgMC4zNTkxLCAgMC4zODgxLCAgMC41NDQxLCAgMC44MDU1LCAgMS4wNzY2LCAgMS4zMTY1LAorIDEuNTMxNiwgIDEuNzUwOCwgIDEuOTQ3NywgIDIuMTM3NCwgIDIuMzQzOCwgIDIuNTQ4NCwgIDIuNzUwMSwgIDIuOTQxMCwKKyAwLjIwNDQsICAwLjM2NzEsICAwLjUzOTYsICAwLjcwNDIsICAwLjg1ODIsICAwLjk4MzEsICAxLjEyNjEsICAxLjMxOTQsCisgMS40NzY5LCAgMS42OTc5LCAgMS44NzE3LCAgMi4wNDYzLCAgMi4yNjIwLCAgMi40NzM5LCAgMi43MDU0LCAgMi45MjA4LAorIDAuMTA0OCwgIDAuMjE3NSwgIDAuNDIwNiwgIDAuNTkyMywgIDAuNzQ4MywgIDAuOTQwMCwgIDEuMTM1NiwgIDEuMzc5OSwKKyAxLjU5NTgsICAxLjczMjAsICAxLjg5ODQsICAyLjEyOTYsICAyLjM1OTQsICAyLjU0OTIsICAyLjczODcsICAyLjkzMDUsCisgMC4wODQyLCAgMC4xNzI5LCAgMC4zOTUxLCAgMC42NDQ3LCAgMC44Njg4LCAgMS4wNjA1LCAgMS4yNDcyLCAgMS40MzMwLAorIDEuNjIzMiwgIDEuODE0NCwgIDIuMDIxNiwgIDIuMTkxNSwgIDIuMzg3OCwgIDIuNTc2MywgIDIuNzY4NSwgIDIuOTQ2NCwKKyAwLjE0NjEsICAwLjI1OTMsICAwLjQxMDUsICAwLjU2NzcsICAwLjczMjgsICAwLjg5MTksICAxLjA0ODQsICAxLjIzMDIsCisgMS40Mzg2LCAgMS42NjM1LCAgMS44ODczLCAgMi4xMDI0LCAgMi4zMTE2LCAgMi41MjY4LCAgMi43MjczLCAgMi45MjY5LAorIDAuMTUwMywgIDAuMzEwOCwgIDAuNDc1NiwgIDAuNjczMSwgIDAuODYwMCwgIDEuMDIzMywgIDEuMjExNSwgIDEuMzk3MSwKKyAxLjU5MTUsICAxLjc4OTIsICAxLjk1MTcsICAyLjE2MDMsICAyLjM0ODcsICAyLjU0NjAsICAyLjczMDgsICAyLjg5OTgsCisgMC4yMTYzLCAgMC4zNjY5LCAgMC41MTI1LCAgMC42NzA5LCAgMC44MTQzLCAgMC45OTMwLCAgMS4yMDk1LCAgMS40MjA1LAorIDEuNjE3NiwgIDEuNzExMiwgIDEuODM5OCwgIDIuMDg5NiwgIDIuMzUxMywgIDIuNTI5MCwgIDIuNjY2NywgIDIuODk2MCwKKyAwLjIxMzMsICAwLjQzODIsICAwLjYyODcsICAwLjg3MDIsICAxLjEwODgsICAxLjM3NDksICAxLjYwNjIsICAxLjc0NDYsCisgMS44MzMzLCAgMS45MTIyLCAgMS45NjE0LCAgMi4wNjY5LCAgMi4xNzg5LCAgMi4zNDQ5LCAgMi42MDM4LCAgMi44ODQ5LAorIDAuMTU5OCwgIDAuMjcxOSwgIDAuMzg3NywgIDAuNDgxNSwgIDAuNTkyNiwgIDAuNzc5NSwgIDEuMDQ0OSwgIDEuMzA0NSwKKyAxLjUyMTAsICAxLjczOTEsICAxLjk0NjIsICAyLjEzOTcsICAyLjM1NTMsICAyLjU0NTgsICAyLjc1NDAsICAyLjkzOTIsCisgMC4yOTE4LCAgMC41NjA3LCAgMC42ODAxLCAgMC43NDA0LCAgMC44Mjg1LCAgMC45NDMxLCAgMS4xNTc5LCAgMS40MDgwLAorIDEuNjMzMiwgIDEuODQ3MiwgIDEuOTczOCwgIDIuMDc3MSwgIDIuMjg5MCwgIDIuNTE3OCwgIDIuNzQ0NSwgIDIuOTgzMCwKKyAwLjE2NjQsICAwLjI4NDIsICAwLjM5NjUsICAwLjU0NjMsICAwLjgxNjIsICAxLjAzNDYsICAxLjE4NDksICAxLjM0NDYsCisgMS41MTIyLCAgMS43NTYzLCAgMS45OTYwLCAgMi4yMDAyLCAgMi4zNzk2LCAgMi41Njg5LCAgMi43NzEyLCAgMi45NTUwLAorIDAuMDkxMSwgIDAuMjM5NywgIDAuNTA1MiwgIDAuNzg2OCwgIDEuMDI5OSwgIDEuMTMxMSwgIDEuMjI0NCwgIDEuMzMzMywKKyAxLjQzOTUsICAxLjY3OTAsICAxLjkzNjksICAyLjE3MTcsICAyLjM2ODksICAyLjU1MzgsICAyLjczNDAsICAyLjkzMjYsCisgMC4xNjQ3LCAgMC4yOTMxLCAgMC4zODM2LCAgMC40OTc4LCAgMC42MjU1LCAgMC45MjQzLCAgMS4xMzM5LCAgMS4zMDAxLAorIDEuNTI2OSwgIDEuODAxMCwgIDEuOTcxNSwgIDIuMTQxOSwgIDIuMzc4NCwgIDIuNTUwMywgIDIuNjcxOSwgIDIuODc0NSwKKyAwLjI0NDAsICAwLjM4MDIsICAwLjQ3NTYsICAwLjY2MTMsICAwLjg2MjcsICAxLjAyOTIsICAxLjIyOTEsICAxLjQwNjAsCisgMS41MTk4LCAgMS43MzU0LCAgMS45MDQ0LCAgMi4xMDEwLCAgMi4zMTQ3LCAgMi40OTk2LCAgMi43MTcxLCAgMi45MDQxLAorIDAuMTU5MCwgIDAuMjg3NiwgIDAuNDU3MiwgIDAuNTk5NiwgIDAuNzcxMywgIDAuOTQ5MCwgIDEuMTIwNSwgIDEuMjgxNSwKKyAxLjQ1MTYsICAxLjYzODUsICAxLjgxNzksICAyLjA0NTcsICAyLjI3NTksICAyLjQ3ODUsICAyLjY4NjEsICAyLjkwODAsCisgMC4yMjk3LCAgMC40MzA5LCAgMC41NzEyLCAgMC42NzE3LCAgMC44MTM4LCAgMS4wNDYzLCAgMS4yNDkyLCAgMS40NTYwLAorIDEuNjc5NiwgIDEuODQ1OCwgIDEuOTY0MiwgIDIuMTQ1MiwgIDIuMzYzNiwgIDIuNTM5NSwgIDIuNzQ1NiwgIDIuOTQ5NSwKKyAwLjI5NzUsICAwLjQ2NzgsICAwLjQ5OTYsICAwLjU4MDksICAwLjYyNzksICAwLjY4ODQsICAwLjg2MDYsICAxLjEzODYsCisgMS40NDEyLCAgMS42ODc2LCAgMS44NzYwLCAgMi4wOTMyLCAgMi4zMTc4LCAgMi41MTY2LCAgMi43MzQ1LCAgMi45MjgwLAorIDAuMTI3OCwgIDAuMzczNywgIDAuNjAwNCwgIDAuNzA2OSwgIDAuODE0NywgIDEuMDE4MCwgIDEuMjU4MSwgIDEuMzgxMiwKKyAxLjQ4NTUsICAxLjcyNjgsICAxLjk5NzAsICAyLjEyNTgsICAyLjI5MzYsICAyLjU3MDIsICAyLjc1NjMsICAyLjg5ODMsCisgMC4xMzE0LCAgMC4yNTA4LCAgMC4zOTk5LCAgMC41NjgwLCAgMC43NDI0LCAgMC45MzY3LCAgMS4xMjg2LCAgMS4zMTc1LAorIDEuNTMzNiwgIDEuNzQwNCwgIDEuOTMxNywgIDIuMTQwNCwgIDIuMzUxNCwgIDIuNTU2MiwgIDIuNzUxMCwgIDIuOTQwMiwKKyAwLjEwNDMsICAwLjIzNjcsICAwLjQyOTMsICAwLjYzNzYsICAwLjgxNjAsICAwLjk4MzYsICAxLjE3NzksICAxLjM4NTAsCisgMS41ODM1LCAgMS43ODc1LCAgMS45NzY1LCAgMi4xNTkzLCAgMi4zNjU0LCAgMi41NTc3LCAgMi43NDY1LCAgMi45Mzk4LAorIDAuMTUyOSwgIDAuMjUxNSwgIDAuMzQ1NCwgIDAuNDM3NCwgIDAuNzAxMSwgIDAuOTAxNSwgIDEuMDc0NCwgIDEuMzUzMiwKKyAxLjU2OTksICAxLjc1NDUsICAyLjAwMjEsICAyLjEyNTksICAyLjIyNzgsICAyLjQ1NDYsICAyLjcyNjQsICAyLjk0MjUsCisgMC4xNDI5LCAgMC4yODA4LCAgMC40Mzk1LCAgMC42MzM0LCAgMC44MDY5LCAgMC45NzA1LCAgMS4xNTIwLCAgMS4zMjUwLAorIDEuNTEwOSwgIDEuNzI4NSwgIDEuOTM1NiwgIDIuMTQ2OSwgIDIuMzQ3OSwgIDIuNTU1NCwgIDIuNzUxMiwgIDIuOTM0OCwKKyAwLjE2MjUsICAwLjMwMjIsICAwLjQ3NTYsICAwLjYzMTUsICAwLjgwMzIsICAwLjk5MjQsICAxLjE1OTYsICAxLjMyMDQsCisgMS40OTk0LCAgMS42OTI5LCAgMS44OTU1LCAgMi4xMDkwLCAgMi4zMDI1LCAgMi41MDE4LCAgMi42OTA4LCAgMi44OTgwLAorIDAuMTY5MiwgIDAuMzQyNywgIDAuNTIyOCwgIDAuNzc1NiwgIDAuOTY4OCwgIDEuMDk1MCwgIDEuMzA1NiwgIDEuNDM2MCwKKyAxLjU2NzUsICAxLjgwNDksICAxLjkzNzYsICAyLjExNTEsICAyLjM0MDcsICAyLjUwMTIsICAyLjcxOTIsICAyLjkyNTgsCisgMC4wNDc0LCAgMC4xMjUxLCAgMC4xOTM5LCAgMC4zODQxLCAgMC42NTAxLCAgMC45MjMxLCAgMS4xMTUzLCAgMS4zMjQwLAorIDEuNTQ3OCwgIDEuNzU5OSwgIDEuOTY1MSwgIDIuMTUxMCwgIDIuMzY0NSwgIDIuNTU1MiwgIDIuNzU0MiwgIDIuOTM5MywKKyAwLjIxOTYsICAwLjQ2NTYsICAwLjc0OTIsICAwLjk5MjIsICAxLjE2NzgsICAxLjI0ODksICAxLjMxMTIsICAxLjM2NTcsCisgMS40MjIzLCAgMS41MzAyLCAgMS43MjEyLCAgMS45OTk2LCAgMi4yNTIzLCAgMi40ODQ0LCAgMi43MDM2LCAgMi45MTQ1LAorIDAuMTEyOCwgIDAuMjM2OCwgIDAuMzcwNCwgIDAuNTQ3NiwgIDAuNzcyMywgIDAuOTk2OCwgIDEuMTkzMCwgIDEuMzk5MiwKKyAxLjYwMTMsICAxLjc5NTcsICAxLjk4ODgsICAyLjE4NTcsICAyLjM4MjUsICAyLjU3MDUsICAyLjc2MTYsICAyLjk0MzQsCisgMC4xMzQxLCAgMC4yNzY4LCAgMC40NTEwLCAgMC42MzU5LCAgMC44MzMyLCAgMS4wMzM1LCAgMS4yMDA0LCAgMS4zOTUyLAorIDEuNTc2MiwgIDEuNzY4MSwgIDEuOTgxNSwgIDIuMTczNSwgIDIuMzY1NywgIDIuNTU1MiwgIDIuNzUxNCwgIDIuOTQ5OCwKKyAwLjEyNDcsICAwLjI1NTksICAwLjM1MTYsICAwLjQ3MjYsICAwLjY4NjEsICAwLjk0ODMsICAxLjE4NTIsICAxLjM4NTgsCisgMS41ODUxLCAgMS43ODE1LCAgMS45Nzc4LCAgMi4xNzM3LCAgMi4zNzI5LCAgMi41NjY0LCAgMi43NjIwLCAgMi45NDI5LAorIDAuMTk4OCwgIDAuMzMyMCwgIDAuNDc3NywgIDAuNjczNywgIDAuODQyNSwgIDEuMDI2NSwgIDEuMTY5NCwgIDEuMzY1NSwKKyAxLjU0NjMsICAxLjcxMzUsICAxLjkzODUsICAyLjE2NTAsICAyLjM1MjksICAyLjUzNjcsICAyLjc1NDUsICAyLjk1ODUsCisgMC4xMzc2LCAgMC4yNjIwLCAgMC40MjczLCAgMC42MTY5LCAgMC43NzU1LCAgMC45NDQxLCAgMS4xMTY5LCAgMS4zMTU3LAorIDEuNTE3OSwgIDEuNzAyMCwgIDEuODkzMSwgIDIuMTA1OSwgIDIuMzExMiwgIDIuNTEzNiwgIDIuNzE2OSwgIDIuOTE5OCwKKyAwLjIxMTIsICAwLjQzODUsICAwLjYwOTEsICAwLjc2MTgsICAwLjk1NTMsICAxLjE1NDMsICAxLjM0NDUsICAxLjUzOTYsCisgMS43MTUzLCAgMS45MTkyLCAgMi4xMjYzLCAgMi4zNTkzLCAgMi41OTU4LCAgMi44MTcxLCAgMi45Mzk0LCAgMy4wNDA5LAorIDAuMTM0NywgIDAuMjA5OSwgIDAuMjY0NiwgIDAuMzQ1MywgIDAuNTI2NiwgIDAuNzg2OSwgIDEuMDUxMywgIDEuMjc5NSwKKyAxLjQ4ODAsICAxLjcxODEsICAxLjkyOTQsICAyLjEzMzIsICAyLjMzNjIsICAyLjU0NDIsICAyLjc0MzMsICAyLjkzNjIsCisgMC4zMTQxLCAgMC41OTM1LCAgMC43NTE3LCAgMC44MzEzLCAgMC44NTY4LCAgMC45NTcwLCAgMS4wMjUwLCAgMS4xMjc1LAorIDEuMzQyMiwgIDEuNjMwMywgIDEuODU3NywgIDIuMDcwNSwgIDIuMjk1NywgIDIuNTA5NSwgIDIuNzI0NCwgIDIuOTI2MiwKKyAwLjA5NjIsICAwLjIxMTYsICAwLjM5NjEsICAwLjU2NDEsICAwLjcxMjIsICAwLjg4ODMsICAxLjEwMjMsICAxLjM0ODEsCisgMS41NjIzLCAgMS43NTU0LCAgMS45NjE4LCAgMi4xNjc1LCAgMi4zNzA2LCAgMi41NTU2LCAgMi43NDMwLCAgMi45MzM3LAorIDAuMDg5OCwgIDAuMTUxMCwgIDAuMzA2MCwgIDAuNTgyMCwgIDAuODIyMSwgIDEuMDM4OCwgIDEuMjI2MSwgIDEuNDI4OSwKKyAxLjYwNTQsICAxLjgxMDMsICAxLjk5NDEsICAyLjE4NDQsICAyLjM3NDIsICAyLjU3MTEsICAyLjc2MzIsICAyLjk0NzQsCisgMC4xMzI2LCAgMC4yMzE2LCAgMC4zNzYxLCAgMC41MTc3LCAgMC42NzgyLCAgMC44NzYxLCAgMS4wOTUyLCAgMS4zMTc1LAorIDEuNTA3OCwgIDEuNzAzNCwgIDEuOTA1MSwgIDIuMTI0NSwgIDIuMzQyNCwgIDIuNTQ4NCwgIDIuNzQ0NCwgIDIuOTM4OSwKKyAwLjE3NDAsICAwLjMyOTMsICAwLjUxNzQsICAwLjY4MjQsICAwLjgzOTQsICAxLjAzNzIsICAxLjIwNDYsICAxLjM3MjMsCisgMS41NjU2LCAgMS43NDQ0LCAgMS45NDQyLCAgMi4xMzg2LCAgMi4zMTM5LCAgMi40OTYwLCAgMi43MDcxLCAgMi45Mjk3LAorIDAuMjMwNCwgIDAuMzc3NSwgIDAuNDg2NSwgIDAuNjE4MiwgIDAuNzg0MiwgIDAuOTIwOCwgIDEuMTE1MSwgIDEuMjg0MywKKyAxLjQ2NDEsICAxLjY5ODgsICAxLjkyMDksICAyLjEyNjAsICAyLjMwOTksICAyLjUyMjksICAyLjc0MTQsICAyLjkyNzYsCisgMC4wMDk0LCAgMC4wMjYxLCAtMC4wMDM3LCAgMC4wMDQxLCAtMC4wMDkyLCAtMC4wMDQ0LCAtMC4wMjMyLCAtMC4wMDczLAorLTAuMDA0NywgLTAuMDAyMSwgIDAuMDI1MCwgLTAuMDU4MCwgLTAuMDE0MCwgLTAuMDM0MiwgLTAuMDU4NiwgIDAuMDAyMCwKKyAwLjA0NDksICAwLjAxNTUsIC0wLjA1MjMsIC0wLjAyNzksICAwLjAyOTksIC0wLjAxODMsIC0wLjA3MzYsIC0wLjA2MzksCistMC4wMDE3LCAgMC4wMzM2LCAgMC4wMjA5LCAgMC4wMDQ2LCAgMC4wMDc3LCAtMC4wMTQ4LCAtMC4wMTE0LCAtMC4wMTIwLAorIDAuMDExNSwgLTAuMDA1MCwgIDAuMDQ0NSwgIDAuMDA0OCwgIDAuMDE4OCwgLTAuMDEzNywgLTAuMDA4MCwgIDAuMDIzOSwKKy0wLjAxODQsIC0wLjA1MjQsIC0wLjAxOTUsIC0wLjAxMjYsICAwLjAyODQsICAwLjA2MzIsICAwLjAxNDEsIC0wLjAwOTMsCistMC4wMDk2LCAgMC4wMTk2LCAgMC4wMjMwLCAgMC4wMzc5LCAgMC4wMzA4LCAgMC4wMjM3LCAtMC4wMjI0LCAtMC4wNjAwLAorLTAuMDc1NSwgLTAuMTA3NCwgLTAuMDk4OCwgLTAuMDYwNiwgLTAuMTAzOCwgLTAuMTU1MiwgLTAuMTQ4MCwgLTAuMDY3MiwKKyAwLjA1MDQsICAwLjA2NzYsICAwLjAzMzYsIC0wLjAwNDIsICAwLjA3MjksICAwLjEwMTMsICAwLjA4NjgsICAwLjA4NDYsCisgMC4wOTU0LCAgMC4wNTE1LCAtMC4wMDY2LCAtMC4wODUxLCAtMC4wNDg1LCAgMC4wMjk0LCAgMC4wMzk1LCAgMC4wMDg3LAorIDAuMDA3OCwgIDAuMDQ0NiwgIDAuMDg4MSwgIDAuMDY3MiwgLTAuMDM4NCwgLTAuMDAyNSwgIDAuMDQxNSwgIDAuMDM1MywKKyAwLjAwODAsICAwLjAwNTIsICAwLjAxOTAsICAwLjAxODIsICAwLjAwNjksICAwLjAxNjgsICAwLjAzNzQsICAwLjAwMzcsCistMC4wMjkyLCAtMC4wNDI5LCAgMC4wMzAyLCAgMC4wNjgxLCAtMC4wMjMzLCAtMC4wMjM4LCAtMC4wMDAzLCAtMC4wMDQzLAorIDAuMDA1NCwgLTAuMDAyOSwgLTAuMDE0OSwgIDAuMDY0MiwgIDAuMDYyMiwgIDAuMDM0MSwgLTAuMDIzMiwgLTAuMDQ2MSwKKy0wLjAwODIsIC0wLjA0NjksIC0wLjA2MTgsIC0wLjAzMjYsIC0wLjA0NTIsIC0wLjA2NDksIC0wLjA1OTcsIC0wLjAzOTgsCistMC4wMzE4LCAtMC4wMTE2LCAgMC4wMDExLCAgMC4wMDA5LCAtMC4wMzg0LCAtMC4wMzg0LCAtMC4wMTU2LCAtMC4wMjYwLAorLTAuMDAwNywgIDAuMDQ3MywgIDAuMDExMSwgLTAuMDM1OCwgLTAuMDQ4NCwgLTAuMDIwNCwgLTAuMDAyOSwgLTAuMDA5MCwKKy0wLjAyODUsIC0wLjA0OTUsIC0wLjAzNzYsICAwLjA5MTcsICAwLjExOTIsICAwLjEwMjYsICAwLjA3NDUsICAwLjAzOTcsCisgMC4wNDYzLCAgMC4wMjUzLCAgMC4wMDI1LCAgMC4wNDY1LCAgMC4wMTAwLCAgMC4wNDg4LCAgMC4wNDE2LCAgMC4wMjIzLAorIDAuMDI2MywgIDAuMDA3MiwgLTAuMDA1MywgIDAuMDU5NSwgIDAuMDA2MCwgLTAuMDUxOCwgLTAuMDMxNiwgLTAuMDA0MywKKy0wLjAxMzMsIC0wLjAyMzMsIC0wLjAwNzUsIC0wLjAyNTEsICAwLjAyNzcsIC0wLjAwNjcsIC0wLjAxMzYsIC0wLjAwMDQsCisgMC4wMjM1LCAgMC4wMTEyLCAtMC4wMTgyLCAtMC4wMzI0LCAtMC4wMjEwLCAtMC4wMDM1LCAtMC4wMzk1LCAtMC4wMzg0LAorIDAuMDAwNSwgLTAuMDE1MCwgLTAuMDM1NiwgIDAuMDEyNywgLTAuMDAzMywgLTAuMDAzNCwgIDAuMDIwNSwgIDAuMDc0NywKKyAwLjExMzgsICAwLjEwMTUsICAwLjA5OTUsIC0wLjAxNjEsIC0wLjAwNDUsICAwLjAxMjksICAwLjA0NzIsICAwLjA1NzUsCisgMC4wMjIyLCAgMC4wMDkxLCAgMC4wMDM3LCAtMC4wNDcxLCAgMC4wMzcxLCAgMC4wMTMyLCAgMC4wMjA4LCAgMC4wMjQ3LAorIDAuMDExNywgIDAuMDE2NCwgIDAuMDIyNSwgIDAuMDEyNCwgLTAuMDAyMywgIDAuMDA4OCwgLTAuMDA0NiwgIDAuMDA0NywKKy0wLjAzOTMsICAwLjAwMTgsICAwLjAxNDgsICAwLjAwMjAsICAwLjAwNDQsICAwLjAxNjUsICAwLjAyMjksIC0wLjAyMDgsCistMC4wNDc3LCAtMC4wMzEwLCAtMC4wMTY0LCAtMC4wMzkwLCAtMC4wNzY0LCAtMC4wNTI1LCAtMC4wMDk0LCAgMC4wMDc1LAorLTAuMDEwMiwgLTAuMDA0NSwgLTAuMDUwNCwgLTAuMDcwOSwgIDAuMDgyMiwgIDAuMDcxMCwgIDAuMDQyNiwgIDAuMDAxNCwKKy0wLjAzNzEsIC0wLjA0MDAsIC0wLjAxNTcsIC0wLjAxNTUsIC0wLjAxNzMsIC0wLjAxMzgsIC0wLjAwMTUsICAwLjAxMzQsCistMC4wNDE4LCAtMC4wNjgyLCAtMC4wMjU2LCAgMC4wMDUwLCAgMC4wMzYwLCAgMC4wMzU0LCAgMC4wMDc0LCAtMC4wMzk2LAorLTAuMDIzNSwgIDAuMDI4NCwgIDAuMDQ5NCwgIDAuMDE1MywgIDAuMDQ0OCwgIDAuMDAyNSwgLTAuMDA2MSwgIDAuMDI1MiwKKyAwLjEwMDAsICAwLjIyNjAsICAwLjIxNTgsICAwLjIxMTYsICAwLjIxOTgsICAwLjIwNTUsICAwLjIxMTAsICAwLjE4NzMsCisgMC4xOTA3LCAgMC4yMDcxLCAgMC4yMTY0LCAgMC4yMDA5LCAgMC4yMDU5LCAgMC4yMTI0LCAgMC4yMTQxLCAgMC4yMDkzLAorIDAuMDg3NSwgIDAuMDk4MSwgIDAuMTE3NywgIDAuMTA3MSwgIDAuMTAzMywgIDAuMTI0OCwgIDAuMTA0OCwgIDAuMTIzOCwKKyAwLjExNjYsICAwLjEwMDgsICAwLjEwNjIsICAwLjA5OTIsICAwLjA5OTQsICAwLjEwNjcsICAwLjA5OTksICAwLjExODcsCisgMC4wNzUwLCAgMC4wNzk0LCAgMC4wODI4LCAgMC4wODU0LCAgMC4wODU5LCAgMC4wODAxLCAgMC4wODkxLCAgMC4wOTMzLAorIDAuMDk2OSwgIDAuMDkyMCwgIDAuMDkxNSwgIDAuMDg2MiwgIDAuMDg2OCwgIDAuMDg5MSwgIDAuMDg0MiwgIDAuMDgyNCwKKyAwLjA2MjUsICAwLjA5MzAsICAwLjA4MTUsICAwLjA4NTMsICAwLjA4OTgsICAwLjA4MjgsICAwLjA4MjIsICAwLjA5MTAsCisgMC4wODczLCAgMC4wOTA2LCAgMC4wODU2LCAgMC4wODQwLCAgMC4wNzc0LCAgMC4wNzg1LCAgMC4wNjg0LCAgMC4wNzExLAorIDAuMzMxOSwgIDAuNDIxOSwgIDAuNDU4OCwgIDAuNDA5MCwgIDAuNDA5MiwgIDAuNDAxNCwgIDAuMzU0OCwgIDAuMzM1MywKKyAwLjM3MDgsICAwLjMzNTIsICAwLjM3MjAsICAwLjM1MzgsICAwLjQwODQsICAwLjQyODksICAwLjQwNjAsICAwLjQyMTAsCisgMC4wNTg4LCAgMC4wMjA5LCAtMC4wMDgyLCAtMC4wMTE1LCAtMC4wMzQzLCAtMC4wNjIxLCAtMC4wNTQxLCAtMC4wMzQ2LAorLTAuMDM0NiwgLTAuMDM2NiwgLTAuMDIyMCwgLTAuMDI2NSwgLTAuMDEwMiwgIDAuMDM3NCwgIDAuMDMwNiwgIDAuMDQwNCwKKyAwLjAzMDYsICAwLjAwOTAsIC0wLjAwNTQsICAwLjAzMzMsICAwLjAwNDcsICAwLjAyMzgsICAwLjAxNDEsICAwLjAxNjUsCisgMC4wMzA2LCAgMC4wNDIwLCAgMC4wMTU5LCAgMC4wMTI0LCAgMC4wNDE0LCAgMC4wMTU4LCAtMC4wMjM3LCAgMC4wMTQxLAorIDAuMDc2NSwgIDAuMDA1NywgLTAuMDI2MCwgLTAuMDQyNiwgLTAuMDM5NSwgLTAuMDEyNiwgLTAuMDU3OSwgLTAuMDQxNworfSwKKworLmxzcDIyXzEgPSB7CisgMC4wNjY0LCAgMC4xODc1LCAgMC40MzAwLCAgMC42NzMwLCAgMC44NzkzLCAgMS4wNjQwLCAgMS4yNTYzLCAgMS40NDMzLAorIDEuNjM5NCwgIDEuODE3NiwgIDIuMDAyOSwgIDIuMTkyMSwgIDIuMzc5NiwgIDIuNTY3MSwgIDIuNzU5NSwgIDIuOTUzNiwKKyAwLjIxMjgsICAwLjQwNTIsICAwLjUzMTEsICAwLjY0MDQsICAwLjc4NzUsICAwLjg3NzUsICAxLjA5NzQsICAxLjMyNjEsCisgMS41NTYzLCAgMS42NzkwLCAgMS44MzM5LCAgMi4xMTk1LCAgMi4zMjI2LCAgMi40NjA5LCAgMi42NDQwLCAgMi44OTQ3LAorIDAuMjAyNCwgIDAuMzM2MiwgIDAuNDgzNCwgIDAuNjc4NCwgIDAuOTA4OCwgIDEuMDg1MCwgIDEuMjE4OCwgIDEuNDA1NCwKKyAxLjYxMDIsICAxLjc3NjcsICAxLjk2NzksICAyLjE0MzYsICAyLjM0NDUsICAyLjU0NjcsICAyLjc0MjksICAyLjkzMjAsCisgMC4xMTgxLCAgMC4yMjc5LCAgMC40NDEzLCAgMC42MTE0LCAgMC43NzEwLCAgMC45NDI3LCAgMS4xMTQyLCAgMS4yNzA3LAorIDEuNDg5MiwgIDEuNzQxNiwgIDEuOTUyNiwgIDIuMTQ2NiwgIDIuMzYyOSwgIDIuNTQ0NSwgIDIuNzI5MywgIDIuOTIwNSwKKyAwLjExNTUsICAwLjI3MjAsICAwLjQ4ODYsICAwLjY4MTIsICAwLjg1OTQsICAxLjA0MjIsICAxLjIzMTUsICAxLjQxMTYsCisgMS42MTM3LCAgMS44MDIwLCAgMS45NzU4LCAgMi4xNzQzLCAgMi4zNjAyLCAgMi41NTY4LCAgMi43NDcyLCAgMi45Mzc0LAorIDAuMTExMCwgIDAuMzMxMiwgIDAuNDczNSwgIDAuNTYxMiwgIDAuNzEyOSwgIDAuODE0NiwgIDEuMDIzMywgIDEuMzE1NSwKKyAxLjU3NjUsICAxLjc3NDYsICAxLjk1NzQsICAyLjE0MTYsICAyLjMyMjAsICAyLjUzODQsICAyLjczMzQsICAyLjkzMTgsCisgMC4xNjU2LCAgMC4zMzUwLCAgMC40MjE1LCAgMC41NjA5LCAgMC42NzU5LCAgMC44NTAzLCAgMS4xNDA1LCAgMS40MDk0LAorIDEuNjA1NywgIDEuNjg2MCwgIDEuNzYzOSwgIDIuMDAzMSwgIDIuMjY4MCwgIDIuNTA3NiwgIDIuNzI2MywgIDIuOTM2OCwKKyAwLjE0NjYsICAwLjM2MzgsICAwLjQ1ODcsICAwLjU2NzQsICAwLjczODEsICAwLjg2NjksICAwLjk2MTksICAxLjE2NTgsCisgMS40NjY3LCAgMS43NDQwLCAgMS45MzM1LCAgMi4xMDE4LCAgMi4zMDIyLCAgMi41MjgxLCAgMi43MzU5LCAgMi45MjYxLAorIDAuMTA2MSwgIDAuMjU2NiwgIDAuNDczOSwgIDAuNjc1MSwgIDAuODcxMSwgIDEuMDcwNCwgIDEuMjcyMCwgIDEuNDY1NSwKKyAxLjY2MDUsICAxLjg0OTQsICAyLjAyOTAsICAyLjIxOTcsICAyLjQwMDgsICAyLjU5MTIsICAyLjc3NzIsICAyLjk1MTMsCisgMC4xMTE2LCAgMC4yMzY0LCAgMC4zOTcxLCAgMC42MzE2LCAgMC44NTgzLCAgMS4wMzM1LCAgMS4xNjg2LCAgMS4zMzAyLAorIDEuNTYxMiwgIDEuNzg3NywgIDEuOTgyOSwgIDIuMjA1MiwgIDIuMzU5NiwgIDIuNTQ2MCwgIDIuNzM0MSwgIDIuOTI5MCwKKyAwLjI2NjEsICAwLjQxODYsICAwLjUxMjYsICAwLjY0NzcsICAwLjg4MTgsICAxLjEwNDUsICAxLjI4NTIsICAxLjQxMjgsCisgMS41ODUxLCAgMS43NTkzLCAgMS45Mzk5LCAgMi4xNzU3LCAgMi4zNjg0LCAgMi41MTM2LCAgMi42OTI3LCAgMi45MDY0LAorIDAuMTQ5NSwgIDAuMjc0OSwgIDAuNDM5MSwgIDAuNjMwNCwgIDAuODIzOSwgIDEuMDE4MSwgIDEuMTk5NSwgIDEuMzc1OSwKKyAxLjU2NjksICAxLjc3MjIsICAxLjk2NzEsICAyLjE2MzUsICAyLjM1ODYsICAyLjU1MjgsICAyLjc0NDUsICAyLjkzMTEsCisgMC4wOTEyLCAgMC4xNzU5LCAgMC4zMDY2LCAgMC41NjYwLCAgMC44MDA1LCAgMC45NTY4LCAgMS4xODMyLCAgMS40NTA0LAorIDEuNjI1OSwgIDEuNzk0OCwgIDIuMDExMywgIDIuMjAwMiwgIDIuMzY1NCwgIDIuNTU4MywgIDIuNzkyOSwgIDIuOTczNSwKKyAwLjEzNTMsICAwLjI3NDcsICAwLjQwNzgsICAwLjU5NzcsICAwLjc2NTgsICAwLjkxMjQsICAxLjEwODEsICAxLjM2MzAsCisgMS41ODc1LCAgMS43ODQ3LCAgMS45MzIzLCAgMi4xMTgxLCAgMi4zMzIxLCAgMi41MDQ2LCAgMi43MTgzLCAgMi45MjI1LAorIDAuMTkzOCwgIDAuNDA2MywgIDAuNDk4MiwgIDAuNjAwMiwgIDAuNzcwMiwgIDAuOTA3MSwgIDEuMTYzMSwgIDEuMzg4NSwKKyAxLjYwNDMsICAxLjgxMTgsICAxLjkzMDYsICAyLjA4OTMsICAyLjI3MjQsICAyLjQ2MDksICAyLjYyODMsICAyLjg4MDIsCisgMC4xODU3LCAgMC4zMzUxLCAgMC40MzgxLCAgMC42MTAxLCAgMC43NTYxLCAgMC44NTU1LCAgMS4wMzg0LCAgMS4zMTcxLAorIDEuNTY2NywgIDEuNjkwNCwgIDEuNzU1MiwgIDEuOTY4OSwgIDIuMjU5NywgIDIuNTI2MCwgIDIuNzI3MiwgIDIuOTMzNywKKyAwLjEwMzcsICAwLjIxNTksICAwLjQxODgsICAwLjYxNzQsICAwLjgwMzUsICAxLjAyODUsICAxLjIyNTYsICAxLjQyMzAsCisgMS42NDAwLCAgMS44MzIyLCAgMi4wMTQ0LCAgMi4xOTg4LCAgMi4zODEwLCAgMi41NjgyLCAgMi43NjEzLCAgMi45NDM4LAorIDAuMTYyNSwgIDAuMjc3NiwgIDAuNDIyNSwgIDAuNjAwMSwgIDAuNzg3OSwgIDAuOTA4NywgIDEuMDgwMSwgIDEuMjc1OSwKKyAxLjQ4OTksICAxLjc0NDgsICAxLjk5MTEsICAyLjE3NzAsICAyLjM3MjMsICAyLjU3NzcsICAyLjc5NzEsICAyLjk0NDQsCisgMC4yMTExLCAgMC4zNjQwLCAgMC41ODM5LCAgMC43MjkwLCAgMC44MDUxLCAgMS4wMDIzLCAgMS4yMzE1LCAgMS40MTQzLAorIDEuNTg3OCwgIDEuNzc1NSwgIDEuOTgwNCwgIDIuMTQ5OCwgIDIuMzMxMiwgIDIuNTM1MCwgIDIuNzYxMywgIDIuOTQ3MiwKKyAwLjE0MjMsICAwLjI2NDYsICAwLjQxMzYsICAwLjYzNTAsICAwLjgwNzAsICAwLjk1MTQsICAxLjExNjgsICAxLjMyMTMsCisgMS41Nzc2LCAgMS43NzIxLCAgMS45NDA0LCAgMi4xNTQ1LCAgMi4zMzg1LCAgMi41MTM3LCAgMi43Mzk2LCAgMi45NTUzLAorIDAuMTEzMiwgIDAuMjM4NiwgIDAuNDEwMywgIDAuNTkzMSwgIDAuNzgwOCwgIDAuOTg4MSwgIDEuMTg0MCwgIDEuMzg2MCwKKyAxLjYwMjEsICAxLjc5OTAsICAxLjk5MjIsICAyLjE4ODUsICAyLjM4NTIsICAyLjU3MTcsICAyLjc2NDAsICAyLjk1MTAsCisgMC4xMjY3LCAgMC4yNjAyLCAgMC4zOTEzLCAgMC41OTQ0LCAgMC43NTk4LCAgMC45MTk4LCAgMS4wNzgxLCAgMS4yNzE1LAorIDEuNTI5OSwgIDEuNzU3MywgIDEuOTMwOCwgIDIuMTM0NiwgIDIuMzI2NywgIDIuNTQxOSwgIDIuNzQ2NiwgIDIuOTMyMCwKKyAwLjIwMjMsICAwLjM0MTcsICAwLjQzOTIsICAwLjYxNDEsICAwLjc0MzksICAwLjg1OTMsICAxLjEwOTYsICAxLjM1NDMsCisgMS41MTg1LCAgMS42NTUzLCAgMS43ODYyLCAgMi4wMzQxLCAgMi4yNzE4LCAgMi40ODM0LCAgMi43MTAzLCAgMi45NDY2LAorIDAuMTExMywgIDAuMjQ3MCwgIDAuMzY3NywgIDAuNTY4NiwgIDAuNzcwMCwgIDAuOTM1NiwgIDEuMDgwNiwgIDEuMjQ1MiwKKyAxLjQ4MzAsICAxLjczNDQsICAxLjkyNjgsICAyLjE0MDQsICAyLjMzNzEsICAyLjUxNjksICAyLjczMjksICAyLjkwMTIsCisgMC4xNjY0LCAgMC4zNTU0LCAgMC41NTczLCAgMC43NDcxLCAgMC45MjQ1LCAgMS4wOTk4LCAgMS4yNzg3LCAgMS40NjU1LAorIDEuNjY1NCwgIDEuODM0NiwgIDIuMDE3OSwgIDIuMjE1OSwgIDIuNDA5NiwgIDIuNTk0NiwgIDIuNzc5MCwgIDIuOTUzMCwKKyAwLjEzMTMsICAwLjI2MjUsICAwLjQ3MzEsICAwLjY0NDQsICAwLjgxMTAsICAwLjk4NzgsICAxLjE0OTMsICAxLjMyMTIsCisgMS41NzE5LCAgMS44MTM4LCAgMS45ODYxLCAgMi4xOTQzLCAgMi4zNzE0LCAgMi41NTc4LCAgMi43MzQ2LCAgMi45Mjk2LAorIDAuMTE4NiwgIDAuMzAzNSwgIDAuNTA0OSwgIDAuNjg2MCwgIDAuODY3MCwgIDAuOTk3NSwgIDEuMTM2NCwgIDEuMzQ3MSwKKyAxLjU2OTUsICAxLjc0MTIsICAxLjkzNDYsICAyLjE1MDYsICAyLjM0MTMsICAyLjU1MzEsICAyLjc3OTQsICAyLjk2MjcsCisgMC4xMTA4LCAgMC4yNjk3LCAgMC40Nzg3LCAgMC42MzQ0LCAgMC43OTA5LCAgMC45NTg2LCAgMS4xNDQwLCAgMS4zNTExLAorIDEuNTY4NiwgIDEuNzYwMSwgIDEuOTI0NiwgIDIuMTI0MSwgIDIuMzI5MywgIDIuNTM5MCwgIDIuNzMxNSwgIDIuOTMzMywKKyAwLjA5ODUsICAwLjIzMDIsICAwLjM1NDQsICAwLjU3NTksICAwLjc2MjAsICAwLjk2NTEsICAxLjE0OTcsICAxLjMwODAsCisgMS41NTAwLCAgMS43ODQ1LCAgMS45NTE4LCAgMi4xNzM0LCAgMi4zNTY1LCAgMi41NjY1LCAgMi43NjA1LCAgMi45MTAyLAorIDAuMTIwOCwgIDAuMjcyNywgIDAuNDM4MSwgIDAuNTczNiwgIDAuNzM4MiwgIDAuODM5MCwgIDEuMDEwMiwgIDEuMjY0OCwKKyAxLjUxMDAsICAxLjc0NDAsICAxLjk2MTksICAyLjE0MzAsICAyLjMzMDcsICAyLjUxNTksICAyLjcyNjQsICAyLjkyMTEsCisgMC4xNTgyLCAgMC4yNzc3LCAgMC40NDc1LCAgMC42NTUxLCAgMC44NTkxLCAgMS4wMDg0LCAgMS4xNDE0LCAgMS4zMjkxLAorIDEuNTkwMiwgIDEuNzgyNiwgIDEuOTU0MywgIDIuMTY1OSwgIDIuMzIzMywgIDIuNTA0NCwgIDIuNjkzNSwgIDIuOTE5OSwKKyAwLjEzNjAsICAwLjI4NzMsICAwLjQ1ODUsICAwLjYyOTUsICAwLjc1OTIsICAwLjkwODksICAxLjA0OTIsICAxLjI3MzMsCisgMS41MzkxLCAgMS43NzY4LCAgMS45MzcyLCAgMi4xMzI5LCAgMi4zMTY4LCAgMi41MDE1LCAgMi42ODU3LCAgMi44ODM3LAorIDAuMDg4NiwgIDAuMTgyOSwgIDAuMzY5NiwgIDAuNjEyNiwgIDAuODMzNCwgIDEuMDEzNSwgIDEuMjMwMywgIDEuNDY3NCwKKyAxLjY3NDMsICAxLjg1NjQsICAyLjA1MzAsICAyLjIzNzAsICAyLjM5NjAsICAyLjU3ODcsICAyLjc3NTYsICAyLjkzNzcsCisgMC4yMDA1LCAgMC4zNTM3LCAgMC40NzAwLCAgMC42MjQ5LCAgMC43Mzg1LCAgMC45MDk3LCAgMS4xNzU5LCAgMS4zODExLAorIDEuNTMxNCwgIDEuNjcwNSwgIDEuODU0NiwgIDIuMTIyOSwgIDIuMzI5MiwgIDIuNTI1MSwgIDIuNzk1MSwgIDIuOTY0NiwKKyAwLjE5OTksICAwLjMxMTIsICAwLjQ3MjIsICAwLjcxNDYsICAwLjg5MDgsICAxLjAwMjgsICAxLjE4MzEsICAxLjM5MDMsCisgMS42MTI1LCAgMS43NTE0LCAgMS45MDgzLCAgMi4xMjQ4LCAgMi4zMjcxLCAgMi41MzM5LCAgMi42OTQ1LCAgMi44OTE4LAorIDAuMTI0MywgIDAuMjYwNiwgIDAuNDM4MiwgIDAuNTg1MCwgIDAuNzcwNSwgIDAuOTcyNywgIDEuMTIxNCwgIDEuMzA1OSwKKyAxLjUyMTgsICAxLjc0MDYsICAxLjkxMzcsICAyLjEzNTMsICAyLjMzNTQsICAyLjUyOTksICAyLjcyODcsICAyLjkwNjgsCisgMC4xMDM5LCAgMC4yNDI2LCAgMC40MjY1LCAgMC42Mjg0LCAgMC44MTUyLCAgMC45OTQxLCAgMS4yMDA0LCAgMS40MDM4LAorIDEuNTkxMiwgIDEuNzc2MywgIDEuOTY1MCwgIDIuMTU5OCwgIDIuMzQ3NCwgIDIuNTQ4OCwgIDIuNzQxOSwgIDIuOTMyMiwKKyAwLjEzNjQsICAwLjI0MjAsICAwLjM4ODYsICAwLjU4NjQsICAwLjc2NjMsICAwLjg4NDQsICAxLjA4NjAsICAxLjMyNDIsCisgMS41NTE4LCAgMS43ODkzLCAgMi4wMDA0LCAgMi4xNTYyLCAgMi4zNjE5LCAgMi41NTE2LCAgMi43Njg3LCAgMi45MTgxLAorIDAuMTQ4MywgIDAuMjg1MSwgIDAuNDQ3OSwgIDAuNjMxMiwgIDAuNzkyNCwgIDAuOTgyMSwgIDEuMTcwNSwgIDEuMzM4NiwKKyAxLjUzNzUsICAxLjcyMjYsICAxLjkwNTMsICAyLjA5OTEsICAyLjI4OTgsICAyLjQ5NTMsICAyLjcwMDAsICAyLjkxNDYsCisgMC4yMzMyLCAgMC40NTYxLCAgMC41NDA3LCAgMC42MjEyLCAgMC43NTI0LCAgMC44MjE1LCAgMC45NTIyLCAgMS4xNjg1LAorIDEuNTIxNiwgIDEuNzEzMiwgIDEuODI5MSwgIDIuMDY0NywgIDIuMjgxMSwgIDIuNDg1NywgIDIuNzA3MSwgIDIuOTI4MSwKKyAwLjEzNDgsICAwLjMxMjYsICAwLjUxNzksICAwLjcxOTIsICAwLjkyMjcsICAxLjEzNjMsICAxLjMyMjMsICAxLjQ3NTYsCisgMS42NTA5LCAgMS44MTkxLCAgMS45OTkxLCAgMi4xOTc2LCAgMi4zODc3LCAgMi41NzY4LCAgMi43NTkwLCAgMi45Mzg2LAorIDAuMTA5MywgIDAuMjIxMSwgIDAuNDc2MywgIDAuNjcwMywgIDAuODI4MiwgIDAuOTUzNiwgIDEuMTIwMiwgIDEuMzc5NiwKKyAxLjYwNDMsICAxLjgwMzEsICAxLjk4MzIsICAyLjE2MDQsICAyLjM1NzgsICAyLjU4NTYsICAyLjc2NTAsICAyLjkyOTEsCisgMC4xODY1LCAgMC4zMDI3LCAgMC40NTgwLCAgMC42NzE5LCAgMC44NDAwLCAgMS4wMDgyLCAgMS4xOTAxLCAgMS4zNzgyLAorIDEuNTQ0OCwgIDEuNjg4NSwgIDEuOTQ3NywgIDIuMTM4MSwgIDIuMjc5NywgIDIuNTExMywgIDIuNzQ2NSwgIDIuOTQxNCwKKyAwLjE1NzUsICAwLjMxMjQsICAwLjQ2NDksICAwLjYyNjIsICAwLjgwOTUsICAwLjk4NTgsICAxLjE2NzYsICAxLjM2MDIsCisgMS41NjQ2LCAgMS43NTgyLCAgMS45NTUwLCAgMi4xNjcxLCAgMi4zNjI4LCAgMi41NzM0LCAgMi43NjcwLCAgMi45NTE5LAorIDAuMTE3NCwgIDAuMjc3NywgIDAuNDY2MywgIDAuNjMzMywgIDAuODE2OSwgIDEuMDA5NiwgIDEuMTg4NSwgIDEuMzg0NywKKyAxLjU4MDMsICAxLjc1NzEsICAxLjkzODAsICAyLjEzOTgsICAyLjM0MTQsICAyLjU0MDcsICAyLjczNjAsICAyLjkzNzUsCisgMC4xMDczLCAgMC4yMjY0LCAgMC40MDgzLCAgMC41OTczLCAgMC43NDc0LCAgMC45NTE0LCAgMS4xMzQ5LCAgMS4zMzM3LAorIDEuNTQzMywgIDEuNzM0OCwgIDEuOTM4MCwgIDIuMTQzNiwgIDIuMzQ0MSwgIDIuNTQzOCwgIDIuNzQ1NywgIDIuOTM4MywKKyAwLjE0NzIsICAwLjI4ODAsICAwLjQ3OTMsICAwLjYyNjgsICAwLjgwMTUsICAxLjAwNjMsICAxLjE3MTUsICAxLjM2NDQsCisgMS41NTI1LCAgMS43NDEwLCAgMS45MjU4LCAgMi4xMjI3LCAgMi4zMjE0LCAgMi41MTQ5LCAgMi43MTQ4LCAgMi45MTk2LAorIDAuMTQxNCwgIDAuMjU2NSwgIDAuNDM0OSwgIDAuNjExMSwgIDAuNzY5NSwgIDAuOTQ5NiwgIDEuMTIxMiwgIDEuMzI2NSwKKyAxLjUyMTgsICAxLjcyMDksICAxLjkwMTUsICAyLjA4ODcsICAyLjMxNTgsICAyLjUwNzcsICAyLjcyMzMsICAyLjk0MjEsCisgMC4xMjUyLCAgMC4yNjY3LCAgMC40NDU0LCAgMC42NDMxLCAgMC44MzcxLCAgMS4wMTI0LCAgMS4yMTEwLCAgMS40MTYwLAorIDEuNjI0MCwgIDEuODI0MiwgIDIuMDA0NywgIDIuMTk3NCwgIDIuMzkwMiwgIDIuNTc3OCwgIDIuNzYzNywgIDIuOTQ4MSwKKyAwLjEzMjEsICAwLjI1NjUsICAwLjM4NDYsICAwLjU4NDcsICAwLjc1NzgsICAwLjkyNTksICAxLjA2MzcsICAxLjIyMzksCisgMS40NjkwLCAgMS43MzQ2LCAgMS45NzUwLCAgMi4xODgyLCAgMi4zNzEyLCAgMi41NTA5LCAgMi43MjgwLCAgMi44ODg1LAorIDAuMTQzNywgIDAuMjkzMCwgIDAuNDQyOCwgIDAuNjE1NiwgIDAuODA0NSwgIDAuOTYzOCwgIDEuMTQ1MCwgIDEuMzEzOCwKKyAxLjUxNDQsICAxLjczNTUsICAxLjk0NjksICAyLjE1MzQsICAyLjM0MTQsICAyLjU0NTIsICAyLjczNTMsICAyLjkzMzQsCisgMC4xNjkyLCAgMC4yNzcwLCAgMC4zODMxLCAgMC42MTAwLCAgMC43ODI1LCAgMC45MzAyLCAgMS4wNjkwLCAgMS4yNDgxLAorIDEuNDYxNSwgIDEuNjc5OSwgIDEuOTE2NSwgIDIuMTczOSwgIDIuMzQzNSwgIDIuNTM0OSwgIDIuNzUyMCwgIDIuOTE2MywKKyAwLjEyMzUsICAwLjI0ODksICAwLjQzNTQsICAwLjYzNDMsICAwLjgyMzYsICAxLjAwNjYsICAxLjE5MDgsICAxLjM0NzQsCisgMS41NjU2LCAgMS44Mjc1LCAgMi4wNjIwLCAgMi4yNTQ4LCAgMi40MTM1LCAgMi41OTEzLCAgMi43NjM5LCAgMi45MzM0LAorIDAuMTA5MCwgIDAuMTk2MSwgIDAuMzg1NCwgIDAuNTcwMSwgIDAuNzAyNCwgIDAuODg0MywgIDEuMTM5MywgIDEuMzc4NSwKKyAxLjU5NDAsICAxLjc3OTcsICAxLjk0NDIsICAyLjE3NDAsICAyLjM4NTMsICAyLjU3NzMsICAyLjc3MjcsICAyLjk0MDYsCisgMC4xNTYwLCAgMC4zNDc3LCAgMC41MDExLCAgMC42Mjg3LCAgMC43NjEyLCAgMC45ODk2LCAgMS4xNTEwLCAgMS4zNDIwLAorIDEuNTQzNSwgIDEuNjgxNiwgIDEuODczMSwgIDIuMDY1MSwgIDIuMjYxMywgIDIuNDk5OSwgIDIuNzAyNywgIDIuODk3MSwKKyAwLjE0NTksICAwLjI0MTYsICAwLjM4MzMsICAwLjU0NTAsICAwLjc5MTYsICAwLjkyMjMsICAxLjA2NjIsICAxLjE5NTMsCisgMS40MDI5LCAgMS42NjE2LCAgMS45MzIwLCAgMi4xNDU5LCAgMi4zMzg2LCAgMi41MDgxLCAgMi42Nzk5LCAgMi45MTk1LAorIDAuMTU0NiwgIDAuMzg1NCwgIDAuNjE4NCwgIDAuODQ2MCwgIDEuMDU5OSwgIDEuMjQyOCwgIDEuMzkwNiwgIDEuNTU1MCwKKyAxLjczODgsICAxLjg5NDUsICAyLjA3NTcsICAyLjIzODYsICAyLjQwMTQsICAyLjU3MDUsICAyLjc1NzQsICAyLjk0MDAsCisgMC4xMDgwLCAgMC4yMzA3LCAgMC40MTEyLCAgMC42MDY3LCAgMC43NzI1LCAgMC45NDY3LCAgMS4xMjg1LCAgMS4zMjA1LAorIDEuNTM0OCwgIDEuNzYwOSwgIDEuOTkzNywgIDIuMTg3OCwgIDIuMzU4MywgIDIuNTUxNSwgIDIuNzE5OSwgIDIuOTA0OSwKKyAwLjE0ODIsICAwLjMxNzgsICAwLjQ5ODMsICAwLjYzNDIsICAwLjc3ODMsICAwLjk4ODAsICAxLjIwMTksICAxLjM0MDQsCisgMS41MjIzLCAgMS43Mjk2LCAgMS45MjExLCAgMi4wOTQzLCAgMi4yOTI4LCAgMi41MDA4LCAgMi43MTM2LCAgMi45MjI0LAorIDAuMTE0NSwgIDAuMjkxMCwgIDAuNDg5MSwgIDAuNjQ5MiwgIDAuODEyNiwgIDAuOTUzMCwgIDEuMTE4MCwgIDEuMzE1NSwKKyAxLjUwNTQsICAxLjY4OTMsICAxLjg4OTksICAyLjExODgsICAyLjMzODksICAyLjU1MTIsICAyLjczMTMsICAyLjkyMjQsCisgMC4wOTM5LCAgMC4xNjg5LCAgMC4zMjUwLCAgMC41NzkyLCAgMC43Njk4LCAgMC45MjQ1LCAgMS4xNTc0LCAgMS4zODY1LAorIDEuNTk1OSwgIDEuNzk3NywgIDEuOTgyMSwgIDIuMTUyOCwgIDIuMzMyNiwgIDIuNTU0MCwgIDIuNzU1MywgIDIuOTE3OSwKKyAwLjEyNDMsICAwLjI0NzQsICAwLjM5MjMsICAwLjYxOTksICAwLjc5MDgsICAwLjkzNzksICAxLjE0OTcsICAxLjM3MzQsCisgMS41NTgyLCAgMS43NDIwLCAgMS45NTM5LCAgMi4xMzg1LCAgMi4zMjQwLCAgMi41Mjc3LCAgMi43MzExLCAgMi45MTc4LAorIDAuMTk2MSwgIDAuMzc0OCwgIDAuNTE3NiwgIDAuNjM4NywgIDAuODE2OSwgIDEuMDQ3NywgIDEuMjEyNCwgIDEuMzg2OSwKKyAxLjU2MDQsICAxLjcyMjUsICAxLjg3NzAsICAyLjA4MzcsICAyLjI5NjAsICAyLjUxMDMsICAyLjY5NDUsICAyLjg4NjIsCisgMC4xMjk1LCAgMC4yNDAzLCAgMC40MTQ5LCAgMC42MTg5LCAgMC43OTEzLCAgMC45MTMwLCAgMS4wODMyLCAgMS4yNzg3LAorIDEuNDg2MCwgIDEuNzExMiwgIDEuOTUwMiwgIDIuMTM0OCwgIDIuMjc3NiwgIDIuNDk4MiwgIDIuNzQzMSwgIDIuOTUyMiwKKyAwLjAxNjAsICAwLjAzNjIsICAwLjAwOTcsICAwLjAwNTcsIC0wLjAwMTQsIC0wLjAwNzMsIC0wLjAwNDYsIC0wLjAwNjQsCistMC4wMTIxLCAgMC4wMDE5LCAgMC4wMTQ5LCAtMC4wNDQwLCAtMC4wNDc5LCAtMC4wMzgyLCAtMC4wNDgwLCAtMC4wMTgyLAorIDAuMDE3MCwgIDAuMDExNCwgLTAuMDI5OCwgLTAuMDE3NSwgLTAuMDAzMywgLTAuMDM1NCwgLTAuMDUxMCwgLTAuMDAyNSwKKyAwLjAzMDcsICAwLjAzNTEsICAwLjAzMzgsICAwLjA0MjAsICAwLjAxMzgsIC0wLjAxNzUsIC0wLjAxMDIsICAwLjAwNTMsCisgMC4wMDg0LCAtMC4wMDAzLCAgMC4wNDEyLCAtMC4wMDI3LCAgMC4wMTQ1LCAtMC4wMDM5LCAgMC4wMDgzLCAgMC4wNDAwLAorIDAuMDAwMSwgLTAuMDI2MiwgIDAuMDA1NSwgLTAuMDA4MiwgIDAuMDM0OCwgIDAuMDQzMywgIDAuMDEzNywgLTAuMDAyNCwKKy0wLjAwNTUsICAwLjAyNjIsICAwLjA1MjEsICAwLjAzNDksICAwLjAxODUsICAwLjAwNzYsIC0wLjAzMTksIC0wLjA1NjEsCistMC4wNDYwLCAtMC4wMjUzLCAtMC4wMDk3LCAgMC4wMTYzLCAgMC4wMTg0LCAtMC4wMDM3LCAtMC4wNDgwLCAtMC4wMzcxLAorIDAuMDYyOCwgIDAuMDY2NSwgIDAuMDI5NiwgLTAuMDA1NywgIDAuMDI1MywgIDAuMDIyNywgIDAuMDM1MCwgIDAuMDY5MiwKKyAwLjA1NDUsICAwLjAyMTgsICAwLjAwOTQsIC0wLjA0NDksIC0wLjAzNzIsICAwLjAwMDUsICAwLjAyNTgsICAwLjAxMTgsCisgMC4wMjg1LCAgMC4wNzYwLCAgMC4wODIyLCAgMC4wNTI3LCAtMC4wMjk5LCAtMC4wMDQ5LCAgMC4wMTcwLCAgMC4wMTk1LAorIDAuMDEzNiwgIDAuMDI4NiwgIDAuMDI4OSwgIDAuMDEzOSwgIDAuMDA1NCwgIDAuMDE1MiwgIDAuMDI0NCwgIDAuMDAyOCwKKy0wLjAwNTYsIC0wLjAyNjAsICAwLjAzMDcsICAwLjA1NzIsIC0wLjAwODcsICAwLjAwODgsICAwLjAwNjIsICAwLjAwMDAsCisgMC4wMTI1LCAgMC4wMDAwLCAtMC4wMjkyLCAgMC4wODIwLCAgMC4wODcyLCAgMC4wNjQ2LCAgMC4wMzQ2LCAgMC4wMDc2LAorLTAuMDAyMiwgLTAuMDI1MywgLTAuMDU2NywgLTAuMDE4OCwgLTAuMDMzNiwgLTAuMDY3MywgLTAuMDU0OSwgLTAuMDE2NiwKKy0wLjAyNTksIC0wLjAxNDAsICAwLjAwNDAsIC0wLjAwMjksIC0wLjA0MzAsIC0wLjA1MzEsIC0wLjAyNTMsIC0wLjAwMTksCistMC4wMDcxLCAgMC4wMzkzLCAgMC4wMDcyLCAtMC4wMzI3LCAtMC4wMjM2LCAtMC4wMjM1LCAtMC4wMTc3LCAtMC4wMTg2LAorLTAuMDI4MCwgLTAuMDIwMSwgLTAuMDA3NywgIDAuMDM4MywgIDAuMDQxOCwgIDAuMDMyMSwgIDAuMDI5NCwgIDAuMDE2OSwKKyAwLjA0NjgsICAwLjAzMDEsICAwLjAxMzMsICAwLjAzNjMsICAwLjA1MTYsICAwLjA5MzcsICAwLjEyNDAsICAwLjE0MDQsCisgMC4xMzI1LCAgMC4xMTc4LCAgMC4wOTk5LCAgMC4wMjUxLCAtMC4wMDM3LCAtMC4wNDk1LCAtMC4wNzAzLCAtMC4wMjE5LAorLTAuMDI2MSwgLTAuMDMwNCwgLTAuMDIwNCwgLTAuMDM3MiwgIDAuMDM1NSwgIDAuMDEzMSwgLTAuMDA5MywgLTAuMDA5OSwKKy0wLjAwNjksIC0wLjAwMzQsIC0wLjAwNjUsIC0wLjAyMDgsIC0wLjAyMzEsIC0wLjAxMTcsIC0wLjAyMTEsIC0wLjAyNDMsCisgMC4wMDQ2LCAtMC4wMTA3LCAtMC4wMDcwLCAgMC4wMTIzLCAgMC4wMjMwLCAgMC4wMTUyLCAgMC4wMTY0LCAgMC4wNDEyLAorIDAuMDYxOSwgIDAuMDg1OCwgIDAuMDg2MiwgLTAuMDA1NiwgIDAuMDEyNSwgIDAuMDE4MiwgIDAuMDM0NywgIDAuMDM4OCwKKyAwLjA0NTYsICAwLjA0MDcsIC0wLjAyNDksIC0wLjA0NjAsICAwLjAyMDYsICAwLjAyOTksICAwLjAyNTMsICAwLjAyMDcsCisgMC4wMTc3LCAgMC4wMjM4LCAgMC4wMjUzLCAgMC4wMDMwLCAgMC4wMDQyLCAgMC4wMDIwLCAtMC4wMDgxLCAtMC4wMTM2LAorLTAuMDI5MCwgLTAuMDA0MiwgIDAuMDEyMiwgIDAuMDA1MSwgIDAuMDEwNywgIDAuMDIyOCwgIDAuMDIxMSwgLTAuMDA2OCwKKy0wLjA0MzYsIC0wLjAyOTksIC0wLjAwNzgsIC0wLjA3NzksIC0wLjExNTcsIC0wLjA2NzksICAwLjAxNzIsICAwLjAxNTAsCistMC4wMDUxLCAgMC4wMDgxLCAtMC4wNTEyLCAtMC4wNjE2LCAgMC4wNTc2LCAgMC4wNzk5LCAgMC4wODAzLCAgMC4wMzM2LAorIDAuMDAwMSwgLTAuMDI5OCwgLTAuMDc0NywgLTAuMDExNSwgLTAuMDEwMSwgLTAuMDE3MCwgLTAuMDA1MCwgIDAuMDE3NCwKKy0wLjAyOTAsIC0wLjA2MDEsIC0wLjAxNTAsICAwLjAxMjEsICAwLjAxNjUsICAwLjAyMzAsICAwLjAwMjgsIC0wLjAzMTcsCistMC4wMTY1LCAgMC4wMzU2LCAgMC4wNDUxLCAgMC4wMTIwLCAgMC4wMzIxLCAgMC4wMDg0LCAtMC4wMDU4LCAgMC4wMTIyLAorIDAuMTkzNSwgIDAuMTgwMiwgIDAuMjE5NSwgIDAuMjQxMCwgIDAuMjIwMSwgIDAuMTkxNSwgIDAuMTg0MCwgIDAuMTkzNSwKKyAwLjIyMTMsICAwLjIwNzksICAwLjE4NTgsICAwLjE5NzQsICAwLjIyMzksICAwLjIxNzMsICAwLjE4NDAsICAwLjIxMjAsCisgMC40OTEyLCAgMC40Nzc3LCAgMC40NjA3LCAgMC40Mzk1LCAgMC40NDI2LCAgMC40Mzg4LCAgMC40NDE2LCAgMC40MzQ1LAorIDAuNDIzOSwgIDAuNDMzMSwgIDAuNDUyMiwgIDAuNDQyMywgIDAuNDQ3NSwgIDAuNDM4NywgIDAuNDUyNSwgIDAuNDQ0NgorfSwKKworLmxzcDIyXzIgPSB7CisgMC4wNzEyLCAgMC4xODMwLCAgMC40MTY3LCAgMC42NjY5LCAgMC44NzM4LCAgMS4wNjk2LCAgMS4yNTU1LCAgMS40NDI2LAorIDEuNjQyNywgIDEuODEzOCwgIDEuOTk2NiwgIDIuMTkyNSwgIDIuMzg3MiwgIDIuNTc0OCwgIDIuNzcxMywgIDIuOTU5NywKKyAwLjE4OTQsICAwLjM5NDIsICAwLjU0MTgsICAwLjY3NDcsICAwLjc1MTcsICAwLjg3NjMsICAxLjExODksICAxLjMwNzIsCisgMS41MDExLCAgMS42NzkwLCAgMS44MzQyLCAgMi4wNzgxLCAgMi4yOTI5LCAgMi40NTY2LCAgMi42NjEzLCAgMi45MjA0LAorIDAuMTc2NywgIDAuMzQwMywgIDAuNTE3MywgIDAuNzA1NSwgIDAuODg5OSwgIDEuMDY5NiwgIDEuMjMwMiwgIDEuNDExMSwKKyAxLjU5ODksICAxLjc3NTEsICAxLjk2MTgsICAyLjE1NDQsICAyLjM0NTQsICAyLjUzNTYsICAyLjczNjIsICAyLjkzMTUsCisgMC4xMjQwLCAgMC4yMzYxLCAgMC40NDIzLCAgMC42MzI2LCAgMC43NzI5LCAgMC45Mzg3LCAgMS4xMTQyLCAgMS4yODQ3LAorIDEuNDc0NiwgIDEuNzEyNiwgIDEuOTQ4MiwgIDIuMTY0MiwgIDIuMzUzNiwgIDIuNTUwNiwgIDIuNzU5MywgIDIuOTE5NywKKyAwLjEyMTMsICAwLjI3ODIsICAwLjUwMTEsICAwLjY5MTAsICAwLjg1NjQsICAxLjA0NjIsICAxLjIzMTUsICAxLjQyMzIsCisgMS42MTc4LCAgMS44MDI4LCAgMS45ODEzLCAgMi4xNzY2LCAgMi4zNjcwLCAgMi41NTkxLCAgMi43NDc1LCAgMi45NDAzLAorIDAuMTM4MiwgIDAuMjk5NSwgIDAuNDY5MywgIDAuNTg3NCwgIDAuNjkyOSwgIDAuODEwMiwgIDEuMDA5NCwgIDEuMjk2MCwKKyAxLjU1MTEsICAxLjc2MDcsICAxLjk2OTksICAyLjE2ODAsICAyLjMzNjcsICAyLjU0NTksICAyLjczNzAsICAyLjkxMDUsCisgMC4xNDI4LCAgMC4yNjkwLCAgMC4zNzEzLCAgMC40NzU3LCAgMC42NjY0LCAgMC45MDE5LCAgMS4xMjc2LCAgMS4zNjc0LAorIDEuNTQ3MSwgIDEuNjY5NSwgIDEuODI2MSwgIDIuMDU3MiwgIDIuMjc1MywgIDIuNDk2MywgIDIuNzE4NywgIDIuOTExNCwKKyAwLjE2NjksICAwLjMwODUsICAwLjQ0ODksICAwLjU3MjQsICAwLjY5MzQsICAwLjg0NjUsICAwLjk2ODAsICAxLjE2NDEsCisgMS40MzIwLCAgMS42ODQxLCAgMS44OTc3LCAgMi4xMDYxLCAgMi4zMTE4LCAgMi41MTUyLCAgMi43MzI5LCAgMi45Mjc0LAorIDAuMTEyOCwgIDAuMjcwOSwgIDAuNDgwMywgIDAuNjg3OCwgIDAuODY3MywgIDEuMDY5MywgIDEuMjc0OSwgIDEuNDY1NywKKyAxLjY2NTAsICAxLjg0MzQsICAyLjAzMzksICAyLjIzMDAsICAyLjQwMDMsICAyLjU5NTEsICAyLjc3NjIsICAyLjk0NjUsCisgMC4xMjAxLCAgMC4yMzQ1LCAgMC40MDIxLCAgMC42Mzc5LCAgMC44NjUxLCAgMS4wMjU2LCAgMS4xNjMwLCAgMS4zMjUwLAorIDEuNTM5NSwgIDEuNzgwOCwgIDIuMDAxMSwgIDIuMTk5NywgIDIuMzYxOCwgIDIuNTUwNSwgIDIuNzU2MSwgIDIuOTM1MSwKKyAwLjI1NzUsICAwLjQxNjMsICAwLjUwODEsICAwLjY0ODQsICAwLjg1NzAsICAxLjA4MzIsICAxLjI3MzIsICAxLjM5MzMsCisgMS41NDk3LCAgMS43NzI1LCAgMS45OTQ1LCAgMi4yMDk4LCAgMi4zNTE0LCAgMi41MjE2LCAgMi43MTQ2LCAgMi44OTY5LAorIDAuMTM2NywgIDAuMjY1NiwgIDAuNDQ3MCwgIDAuNjM5OCwgIDAuODE0NiwgIDEuMDEyNSwgIDEuMjE0MiwgIDEuMzk2MCwKKyAxLjU1NTgsICAxLjczMzgsICAxLjk0NjUsICAyLjE3NjksICAyLjQwMzEsICAyLjU3NDYsICAyLjczMzUsICAyLjkwNDYsCisgMC4wODY4LCAgMC4xNzIzLCAgMC4yNzg1LCAgMC41MDcxLCAgMC43NzMyLCAgMS4wMDI0LCAgMS4xOTI0LCAgMS40MjIwLAorIDEuNjE0OSwgIDEuODA2NCwgIDEuOTk1MSwgIDIuMTkzNSwgIDIuMzc3NywgIDIuNTc0OCwgIDIuNzY2MSwgIDIuOTQ4OCwKKyAwLjE0MjgsICAwLjI1OTIsICAwLjM4NzUsICAwLjU4MTAsICAwLjc1MTMsICAwLjkzMzQsICAxLjEwOTYsICAxLjM1NjUsCisgMS41ODY5LCAgMS43Nzg4LCAgMS45MDM2LCAgMi4wODkzLCAgMi4zMzMyLCAgMi41Mjg5LCAgMi43MjA0LCAgMi45MDUzLAorIDAuMjMxMywgIDAuNDA2NiwgIDAuNDk2MCwgIDAuNTg1MywgIDAuNzc5OSwgIDAuOTIwMSwgIDEuMTM2NSwgIDEuMzQ5OSwKKyAxLjUxMTksICAxLjc2NDEsICAxLjkwOTUsICAyLjA5MTEsICAyLjI2NTMsICAyLjQ1ODcsICAyLjcwMTAsICAyLjg5MDAsCisgMC4xOTI3LCAgMC4zNDI0LCAgMC40NjgyLCAgMC42MDM1LCAgMC43MzMwLCAgMC44NDkyLCAgMS4wNDc3LCAgMS4zMDgzLAorIDEuNTYwMiwgIDEuNjk0NSwgIDEuNzgwNiwgIDIuMDA2NiwgIDIuMjU2NiwgIDIuNDg2NCwgIDIuNzAyMSwgIDIuOTE4MCwKKyAwLjA5NjIsICAwLjE5MzMsICAwLjM5NjgsICAwLjYwNzcsICAwLjgwODMsICAxLjAyMjQsICAxLjIzMDcsICAxLjQzNDQsCisgMS42MzUwLCAgMS44MTczLCAgMi4wMDI0LCAgMi4xODk0LCAgMi4zODEyLCAgMi41NjQ4LCAgMi43NTM1LCAgMi45NDgzLAorIDAuMTQ2OSwgIDAuMjY3OSwgIDAuNDI3MiwgIDAuNjA4MCwgIDAuNzk0OSwgIDAuOTI0NywgIDEuMDc0MSwgIDEuMjcyMiwKKyAxLjUxNDQsICAxLjc2NzksICAyLjAwMzAsICAyLjE5NDQsICAyLjM4OTAsICAyLjU5MjgsICAyLjgxMTYsICAyLjk1NTUsCisgMC4xNjE4LCAgMC4zOTE3LCAgMC42MTExLCAgMC43NTExLCAgMC44MzI1LCAgMS4wMDEwLCAgMS4yMzk3LCAgMS40MTQ3LAorIDEuNTc2NCwgIDEuNzM1OSwgIDEuOTMwMCwgIDIuMTMyNSwgIDIuMzA5NiwgIDIuNTQ4MCwgIDIuNzcyNSwgIDIuOTY5NywKKyAwLjE1NjEsICAwLjI2MzQsICAwLjQwNjIsICAwLjYxMzksICAwLjgwNTksICAwLjk2MTgsICAxLjA5NDgsICAxLjMxNzksCisgMS41ODQ2LCAgMS43NjIyLCAgMS45Mzk5LCAgMi4xNDc2LCAgMi4zMzMwLCAgMi41MjMyLCAgMi43NDEyLCAgMi45NTU0LAorIDAuMTA3NiwgIDAuMjMyMCwgIDAuMzk3NywgIDAuNTc5OCwgIDAuNzcwNywgIDAuOTk3NSwgIDEuMTg4NCwgIDEuMzc5MywKKyAxLjYwNTksICAxLjgwMzgsICAxLjk5MjgsICAyLjE5NDIsICAyLjM4ODEsICAyLjU3NDIsICAyLjc3MTcsICAyLjk1NDcsCisgMC4xMzYwLCAgMC4yNDkzLCAgMC4zODI3LCAgMC41NjQ0LCAgMC43Mzg0LCAgMC45MDg3LCAgMS4wODY1LCAgMS4yOTAyLAorIDEuNTE4NSwgIDEuNzI0NiwgIDEuOTE3MCwgIDIuMTE3NSwgIDIuMzMyNCwgIDIuNTQ0MiwgIDIuNzQ0MSwgIDIuOTQzNywKKyAwLjE2ODQsICAwLjI5OTAsICAwLjQ0MDYsICAwLjU4MzQsICAwLjczMDUsICAwLjkwMjgsICAxLjA4MDEsICAxLjI3NTYsCisgMS40NjQ2LCAgMS42NTE0LCAgMS44MzQ2LCAgMi4wNDkzLCAgMi4yNTk0LCAgMi40NzY1LCAgMi42OTg1LCAgMi45MDg5LAorIDAuMTE0NSwgIDAuMjI5NSwgIDAuMzQyMSwgIDAuNTAzMiwgIDAuNzAwNywgIDAuOTA1NywgIDEuMDgzMCwgIDEuMjczMywKKyAxLjQ4ODUsICAxLjY4OTcsICAxLjg5MzMsICAyLjExMjgsICAyLjMxODgsICAyLjUyNzEsICAyLjcyODQsICAyLjkyNjYsCisgMC4xNzA1LCAgMC4zODE1LCAgMC42MTIwLCAgMC43OTY0LCAgMC45MzQyLCAgMS4wOTI2LCAgMS4yNzQxLCAgMS40NjQ1LAorIDEuNjU1MiwgIDEuODA0MCwgIDEuOTc3OCwgIDIuMTkzMSwgIDIuMzgzNiwgIDIuNTgyNywgIDIuNzkwNSwgIDIuOTQ5NCwKKyAwLjEyODQsICAwLjI2MjIsICAwLjQ3MTQsICAwLjY1NTksICAwLjgwMDQsICAxLjAwMDUsICAxLjE0MTYsICAxLjMxNjMsCisgMS41NzczLCAgMS44MTQ0LCAgMS45OTQ3LCAgMi4yMDAxLCAgMi4zODM2LCAgMi41NzEwLCAgMi43NDQ3LCAgMi45MjYyLAorIDAuMTE2NCwgIDAuMjg4MiwgIDAuNTM0OSwgIDAuNzMxMCwgIDAuODQ4MywgIDAuOTcyOSwgIDEuMTMzMSwgIDEuMzM1MCwKKyAxLjUzMDcsICAxLjczMDYsICAxLjk0MDksICAyLjEyNzUsICAyLjMyMjksICAyLjUzNTgsICAyLjc0NTUsICAyLjk0NDcsCisgMC4xMTU5LCAgMC4yNjQ2LCAgMC40Njc3LCAgMC42Mzc1LCAgMC43NzcxLCAgMC45NTU3LCAgMS4xMzk4LCAgMS4zNTE0LAorIDEuNTcxNywgIDEuNzUxMiwgIDEuOTMzNywgIDIuMTMyMywgIDIuMzI3MiwgIDIuNTQwOSwgIDIuNzM3NywgIDIuOTIxMiwKKyAwLjEwODAsICAwLjIxNDMsICAwLjM0NzUsICAwLjUzMDcsICAwLjczNTgsICAwLjk2ODEsICAxLjE0ODksICAxLjMyODksCisgMS41NTUzLCAgMS43NjY0LCAgMS45Njk2LCAgMi4xNzgwLCAgMi4zNjc2LCAgMi41NTY4LCAgMi43NDkzLCAgMi45MzQ3LAorIDAuMTMzMSwgIDAuMjQzMCwgIDAuMzg3OSwgIDAuNTA5MiwgIDAuNjMyNCwgIDAuODExOSwgIDEuMDMyNywgIDEuMjY1NywKKyAxLjQ5OTksICAxLjcxMDcsICAxLjkxNzgsICAyLjEyNzIsICAyLjMyOTYsICAyLjUzNDAsICAyLjczNzIsICAyLjkzNTMsCisgMC4xNTU3LCAgMC4yODczLCAgMC40NTU4LCAgMC42NTQ4LCAgMC44NDcyLCAgMS4wMTA2LCAgMS4xNDgwLCAgMS4zMjgxLAorIDEuNTg1NiwgIDEuNzc0MCwgIDEuOTU2NCwgIDIuMTY1MSwgIDIuMzI5NSwgIDIuNTIwNywgIDIuNzAwNSwgIDIuOTE1MSwKKyAwLjEzOTcsICAwLjI3NjEsICAwLjQ1MzMsICAwLjYzNzQsICAwLjc1MTAsICAwLjg3NjcsICAxLjA0MDgsICAxLjI5MDksCisgMS41MzY4LCAgMS43NTYwLCAgMS45NDI0LCAgMi4xMzMyLCAgMi4zMjEwLCAgMi41MTE2LCAgMi42OTI0LCAgMi44ODg2LAorIDAuMDk0NSwgIDAuMTY1MywgIDAuMzYwMSwgIDAuNjEyOSwgIDAuODM3OCwgIDEuMDMzMywgIDEuMjQxNywgIDEuNDUzOSwKKyAxLjY1MDcsICAxLjgzMDQsICAyLjAyODYsICAyLjIxNTcsICAyLjM5NzUsICAyLjU4NjUsICAyLjc3MjEsICAyLjk0MjYsCisgMC4xODkyLCAgMC4zODYzLCAgMC40ODk2LCAgMC41OTA5LCAgMC43Mjk0LCAgMC45NDgzLCAgMS4xNTc1LCAgMS4zNTQyLAorIDEuNDc5NiwgIDEuNjUzNSwgIDEuOTA3MCwgIDIuMTQzNSwgIDIuMzI4MSwgIDIuNDk2NywgIDIuNzAzOSwgIDIuOTIyMiwKKyAwLjE2MTQsICAwLjMxMjksICAwLjUwODYsICAwLjcwNDgsICAwLjg3MzAsICAxLjAyMzksICAxLjE5MDUsICAxLjM3OTksCisgMS41Njk3LCAgMS43NTAzLCAgMS45MTAzLCAgMi4xMTE1LCAgMi4zMjM1LCAgMi41MjM0LCAgMi42OTczLCAgMi44OTU3LAorIDAuMTE5OSwgIDAuMjU5MCwgIDAuNDI3MywgIDAuNTkzNSwgIDAuNzU0MiwgIDAuOTYyNSwgIDEuMTIyNSwgIDEuMjk5OCwKKyAxLjUzNjEsICAxLjcxMDIsICAxLjkwOTcsICAyLjEyNjksICAyLjMxNTcsICAyLjUzMDQsICAyLjcyMTIsICAyLjkxNzUsCisgMC4xMDg3LCAgMC4yMzczLCAgMC40MjYxLCAgMC42Mjc3LCAgMC44MDkyLCAgMC45ODg0LCAgMS4xOTU0LCAgMS40MDc3LAorIDEuNjA0OCwgIDEuNzc5OSwgIDEuOTY5MywgIDIuMTY2MiwgIDIuMzQyNiwgIDIuNTUwMSwgIDIuNzQ1OSwgIDIuOTI1NywKKyAwLjEyNjIsICAwLjIyMTYsICAwLjM4NTcsICAwLjU3OTksICAwLjcxNDgsICAwLjg2MTAsICAxLjA3NTIsICAxLjMzMDYsCisgMS41NTQ5LCAgMS43NjA1LCAgMS45NzI3LCAgMi4xNTgwLCAgMi4zNjEyLCAgMi41NjAyLCAgMi43NTU0LCAgMi45MzcyLAorIDAuMTQ0NSwgIDAuMjgzMiwgIDAuNDQ2OSwgIDAuNjI4MywgIDAuNzk5MSwgIDAuOTc5NiwgIDEuMTUwNCwgIDEuMzMyMywKKyAxLjUzMTMsICAxLjcxNDAsICAxLjg5NjgsICAyLjA5OTAsICAyLjI4MjYsICAyLjQ5MDMsICAyLjcwMDMsICAyLjkwMzEsCisgMC4xNjQ3LCAgMC40MDY4LCAgMC41NDI4LCAgMC42NTM5LCAgMC43NjgyLCAgMC44NDc5LCAgMC45MzcyLCAgMS4xNjkxLAorIDEuNDc3NiwgIDEuNzMxNCwgIDEuOTA3MSwgIDIuMDkxOCwgIDIuMjc3NCwgIDIuNTAyOSwgIDIuNzE1MiwgIDIuOTIyMSwKKyAwLjEyNzQsICAwLjMwNTIsICAwLjUyMzgsICAwLjcyODAsICAwLjkyMjksICAxLjEyMTEsICAxLjMwNzEsICAxLjQ3ODQsCisgMS42NTY0LCAgMS44MjM1LCAgMi4wMDI4LCAgMi4xOTk5LCAgMi4zNzYzLCAgMi41NjA4LCAgMi43NTEwLCAgMi45MzU2LAorIDAuMTA3NiwgIDAuMjE5NSwgIDAuNDgxNSwgIDAuNjg3MywgIDAuODI0MSwgIDAuOTQ0MywgIDEuMTA2NiwgIDEuMzY4NywKKyAxLjYwODcsICAxLjgxMDUsICAxLjk4NTcsICAyLjE0ODYsICAyLjM1MDUsICAyLjU4NTQsICAyLjc3ODUsICAyLjkzNzYsCisgMC4xNzU1LCAgMC4zMDg5LCAgMC40Njk1LCAgMC42NjQ4LCAgMC44MzE1LCAgMS4wMjAyLCAgMS4xNzc0LCAgMS4zNTU0LAorIDEuNTM5MywgIDEuNzE0MSwgIDEuOTI0NywgIDIuMTI4NCwgIDIuMjk4MywgIDIuNDk3NSwgIDIuNzI5NiwgIDIuOTQwMSwKKyAwLjE2MzYsICAwLjMxNjYsICAwLjQ1OTQsICAwLjYxOTksICAwLjgxNjEsICAwLjk4NzksICAxLjE3MzgsICAxLjM2NDIsCisgMS41NjgwLCAgMS43NjMzLCAgMS45NTk4LCAgMi4xNjk1LCAgMi4zNjkyLCAgMi41ODQ2LCAgMi43ODA5LCAgMi45NTYzLAorIDAuMTIxOSwgIDAuMjY2MiwgIDAuNDYyMCwgIDAuNjQ5MSwgIDAuODM1MywgIDEuMDE1MCwgIDEuMjA2NSwgIDEuMzk0NCwKKyAxLjU3ODUsICAxLjc2MzEsICAxLjkzODksICAyLjE0MzQsICAyLjM0MDAsICAyLjUzMTYsICAyLjczNTksICAyLjk1MTMsCisgMC4xMDcyLCAgMC4yMjU4LCAgMC4zOTY4LCAgMC41NjQyLCAgMC43MjIyLCAgMC45MzY3LCAgMS4xNDU4LCAgMS4zMzQ3LAorIDEuNTQyNCwgIDEuNzM3MywgIDEuOTMwMywgIDIuMTQzMiwgIDIuMzQ1MSwgIDIuNTQxNSwgIDIuNzQ0NCwgIDIuOTM5NCwKKyAwLjEzOTMsICAwLjI5NTAsICAwLjQ3MjQsICAwLjY0MDcsICAwLjgwMzQsICAxLjAwMzEsICAxLjE3MTIsICAxLjM1NTIsCisgMS41NTE5LCAgMS43NDExLCAgMS45MTk4LCAgMi4xMTYwLCAgMi4zMjM4LCAgMi41MTE5LCAgMi43MTM0LCAgMi45MjA1LAorIDAuMTM1OCwgIDAuMjYxMywgIDAuNDIzOSwgIDAuNTk5MSwgIDAuNzY0MywgIDAuOTM3OSwgIDEuMTIxMywgIDEuMzExNSwKKyAxLjUwNjcsICAxLjcwMzEsICAxLjg3NjgsICAyLjA4MzYsICAyLjMwOTIsICAyLjUxMzQsICAyLjcyMzcsICAyLjkyODYsCisgMC4xMjY3LCAgMC4yNjk1LCAgMC40NTI0LCAgMC42NTkxLCAgMC44Mzk2LCAgMS4wMTczLCAgMS4yMTgzLCAgMS40MjA1LAorIDEuNjMwNiwgIDEuODE2MiwgIDIuMDEwNiwgIDIuMjA4MiwgIDIuMzc3MywgIDIuNTc4NywgIDIuNzU1MSwgIDIuOTM4NywKKyAwLjEzMTQsICAwLjI1MjksICAwLjM4MzcsICAwLjU0OTQsICAwLjc0NDYsICAwLjkwOTcsICAxLjA0ODksICAxLjIzODUsCisgMS40NjkxLCAgMS43MTcwLCAgMS45NjAwLCAgMi4xNzcwLCAgMi4zNTk0LCAgMi41MzU2LCAgMi43MjE1LCAgMi45MDg4LAorIDAuMTUzOCwgIDAuMjkzMSwgIDAuNDQ0OSwgIDAuNjA0MSwgIDAuNzk1OSwgIDAuOTY2NiwgIDEuMTM1NSwgIDEuMzIxNCwKKyAxLjUxNTAsICAxLjcyMzAsICAxLjk0MzMsICAyLjE0MDgsICAyLjM0NTksICAyLjU0NzYsICAyLjcyNzMsICAyLjkzMzAsCisgMC4xNzcxLCAgMC4yODM0LCAgMC40MTM2LCAgMC41ODU2LCAgMC43NTE2LCAgMC45MzYzLCAgMS4wNTk2LCAgMS4yNDYyLAorIDEuNDczNywgIDEuNjYyNywgIDEuODgxMCwgIDIuMTE1MCwgIDIuMzIwMiwgIDIuNTI3NCwgIDIuNzQwMywgIDIuOTQ5MCwKKyAwLjEyNDgsICAwLjI0OTQsICAwLjQzOTcsICAwLjYzNTIsICAwLjgyMjYsICAxLjAwMTUsICAxLjE3OTksICAxLjM0NTgsCisgMS41NjU0LCAgMS44MjI4LCAgMi4wNjQ2LCAgMi4yNTUwLCAgMi40MTYxLCAgMi41OTY0LCAgMi43Njc1LCAgMi45MzgzLAorIDAuMDkzMywgIDAuMTk5MywgIDAuMzEwNSwgIDAuNDM3MSwgIDAuNjQxNywgIDAuODkzNSwgIDEuMTI0NCwgIDEuMzUwOCwKKyAxLjU2NDksICAxLjc1OTUsICAxLjk1ODEsICAyLjE2NDgsICAyLjM2MzksICAyLjU1NjksICAyLjc1NzMsICAyLjk0NjgsCisgMC4xNzk0LCAgMC4zMjI5LCAgMC40NzU4LCAgMC42MjM4LCAgMC43ODIxLCAgMC45NjQwLCAgMS4xMjA1LCAgMS4zMTE2LAorIDEuNTA1NCwgIDEuNjgwMywgIDEuODY1OCwgIDIuMDY1MSwgIDIuMjc5MywgIDIuNDg1NiwgIDIuNjg2NywgIDIuOTEwNSwKKyAwLjEyNTIsICAwLjIzOTcsICAwLjM4NDQsICAwLjUzOTgsICAwLjcwNDQsICAwLjg3OTksICAxLjA1MjYsICAxLjIyNzAsCisgMS40MjY5LCAgMS42NDEyLCAgMS44NTMyLCAgMi4wNzg0LCAgMi4yOTU3LCAgMi41MDUxLCAgMi43MTM5LCAgMi45MjEwLAorIDAuMTM5MSwgIDAuMzQ5NCwgIDAuNTczOCwgIDAuODAyNCwgIDEuMDA5OCwgIDEuMjA5NCwgIDEuMzgzMCwgIDEuNTUwOSwKKyAxLjcyMjIsICAxLjg3ODIsICAyLjA2MDQsICAyLjI0NzksICAyLjQxNTQsICAyLjU5NjgsICAyLjc3NjcsICAyLjk0NTAsCisgMC4xMTIyLCAgMC4yMTgwLCAgMC40MTc1LCAgMC42MDc0LCAgMC43NTU5LCAgMC45NDY1LCAgMS4xNTEzLCAgMS4zMzQwLAorIDEuNTIxNSwgIDEuNzQ5MSwgIDEuOTkxMSwgIDIuMTg5NCwgIDIuMzQzMywgIDIuNTM3NywgIDIuNzM4MCwgIDIuOTE4MywKKyAwLjE1OTUsICAwLjMwMjksICAwLjQ4NDIsICAwLjYzMjQsICAwLjc4NzQsICAwLjk4MTQsICAxLjE5OTIsICAxLjM1NTQsCisgMS41MDE3LCAgMS43Mjc0LCAgMS45MTY4LCAgMi4wODUzLCAgMi4yOTY0LCAgMi41MzAwLCAgMi43MTg3LCAgMi45MDQxLAorIDAuMTM1MCwgIDAuMjc0NywgIDAuNDc5MSwgIDAuNjYzOCwgIDAuODA1MCwgIDAuOTY0NCwgIDEuMTIzOCwgIDEuMjk4NywKKyAxLjQ4NDQsICAxLjY3NTQsICAxLjg3NzgsICAyLjA5ODcsICAyLjMyNzksICAyLjU0MjQsICAyLjc0MTAsICAyLjkzNTYsCisgMC4wOTE0LCAgMC4xNzI3LCAgMC4zMTQzLCAgMC41MTI0LCAgMC43MTIzLCAgMC45MzIzLCAgMS4xNzA2LCAgMS4zODIxLAorIDEuNTg2NCwgIDEuNzgyOCwgIDEuOTcwMSwgIDIuMTU2MCwgIDIuMzQ0NSwgIDIuNTQ4NiwgIDIuNzQzMywgIDIuOTM3MiwKKyAwLjEyMjIsICAwLjIzNTksICAwLjM5MzEsICAwLjU5MTIsICAwLjc3NzYsICAwLjk1MDUsICAxLjE2MjMsICAxLjM3MjMsCisgMS41NDg0LCAgMS43MzE2LCAgMS45MzIxLCAgMi4xMjgzLCAgMi4zMTQ4LCAgMi41MjY5LCAgMi43Mjk5LCAgMi45MjEzLAorIDAuMjA4OSwgIDAuMzg3MiwgIDAuNTA5MCwgIDAuNjQxMywgIDAuNzk2NywgIDEuMDIyNiwgIDEuMTg5NywgIDEuMzkwOCwKKyAxLjU5NTQsICAxLjcyMDIsICAxLjg2MTQsICAyLjEwMzAsICAyLjI5NzMsICAyLjUwNzksICAyLjc0OTEsICAyLjg5NDQsCisgMC4xMjg4LCAgMC4yNDIzLCAgMC40MTA4LCAgMC42MDYyLCAgMC43Njg4LCAgMC45MTg4LCAgMS4wODc2LCAgMS4yODY2LAorIDEuNDg5NywgIDEuNjkxMCwgIDEuOTIxOSwgIDIuMTA3NiwgIDIuMjgwNSwgIDIuNTAyMywgIDIuNzE1NSwgIDIuOTIwMywKKyAwLjAxOTIsICAwLjA0NjIsICAwLjAxMjgsICAwLjAwNTQsIC0wLjAxNTYsIC0wLjAxMTgsIC0wLjAxMzUsICAwLjAwMzAsCistMC4wMTIwLCAgMC4wMDMxLCAgMC4wMjQwLCAtMC4wNDUxLCAtMC4wNDM5LCAtMC4wNDMyLCAtMC4wNTI3LCAtMC4wMjA3LAorIDAuMDI1MywgIDAuMDA4NCwgLTAuMDMwNSwgLTAuMDE0NCwgIDAuMDA0NiwgLTAuMDM3OCwgLTAuMDQ2NywgLTAuMDEwMiwKKyAwLjAyODAsICAwLjA1NDAsICAwLjAxNTEsICAwLjA0MzcsICAwLjAxNDEsIC0wLjAyNTcsIC0wLjAwNTgsICAwLjAwNzMsCisgMC4wMTA3LCAgMC4wMDU0LCAgMC4wMzcxLCAtMC4wMTA1LCAgMC4wMTY1LCAtMC4wMTQzLCAgMC4wMTQ4LCAgMC4wMzgyLAorLTAuMDA1NCwgLTAuMDI4NCwgIDAuMDAwMSwgLTAuMDIxOCwgIDAuMDI1OCwgIDAuMDUxNywgIDAuMDE1NywgLTAuMDAzMiwKKy0wLjAxOTAsICAwLjAzNDMsICAwLjA1NzYsICAwLjAzNDYsICAwLjAzOTIsIC0wLjAxNTgsIC0wLjAzMjMsIC0wLjA1NzgsCistMC4wNjE3LCAtMC4wMjQyLCAtMC4wMTQ0LCAgMC4wMTg4LCAgMC4wMjQ5LCAgMC4wMDIxLCAtMC4wNDIyLCAtMC4wNDIwLAorIDAuMDc1MCwgIDAuMDc2MiwgIDAuMDMyNSwgLTAuMDA2NiwgIDAuMDMzMiwgIDAuMDM3NiwgIDAuMDM4OCwgIDAuMDYzMCwKKyAwLjA1MjUsICAwLjAxOTYsICAwLjAwNTEsIC0wLjA0ODQsIC0wLjAzMjIsICAwLjAwNTksICAwLjAxMzIsICAwLjAwNzksCisgMC4wMjM3LCAgMC4wNzc0LCAgMC4wNjk3LCAgMC4wMTg0LCAtMC4wMzIxLCAtMC4wMzI3LCAgMC4wMjc0LCAgMC4wMjg0LAorIDAuMDA1NywgIDAuMDI4OSwgIDAuMDQ3OCwgIDAuMDE0MiwgLTAuMDA1MywgIDAuMDExNCwgIDAuMDI5MiwgLTAuMDAzMiwKKy0wLjAxMTEsIC0wLjAzODksICAwLjAyODIsICAwLjA2MTMsICAwLjAyMDAsIC0wLjAwMDYsICAwLjAxMTEsICAwLjAwNDgsCisgMC4wMjczLCAgMC4wMDE3LCAtMC4wMzY5LCAgMC4wNjU1LCAgMC4wNzU4LCAgMC4wNTU1LCAgMC4wMjM4LCAtMC4wMDI0LAorLTAuMDEwMCwgLTAuMDQxOSwgLTAuMDY5NiwgLTAuMDE1OCwgLTAuMDQ3OSwgLTAuMDc0NCwgLTAuMDM1NiwgLTAuMDI0NSwKKy0wLjA0MDAsIC0wLjAxMTIsICAwLjAxMzQsICAwLjAwMDEsIC0wLjA0MjIsIC0wLjA1MTQsIC0wLjAwODEsICAwLjAwODMsCistMC4wMTUxLCAgMC4wMzIzLCAtMC4wMDAxLCAtMC4wNDQ0LCAtMC4wNDA2LCAtMC4wMjE0LCAtMC4wMDUwLCAtMC4wMjM1LAorLTAuMDIwNSwgLTAuMDI2NCwgLTAuMDMyNCwgIDAuMDMzNCwgIDAuMDM5MiwgIDAuMDI2NSwgIDAuMDI4OSwgIDAuMDE4MCwKKyAwLjA0OTMsICAwLjAyMjcsICAwLjAxOTQsICAwLjAzNjUsICAwLjA1NDQsICAwLjA2NzQsICAwLjA1NTksICAwLjA3MzIsCisgMC4wOTExLCAgMC4wOTQyLCAgMC4wNzM1LCAgMC4wMTc0LCAtMC4wMTEzLCAtMC4wNTUzLCAtMC4wNjY1LCAtMC4wMjI3LAorLTAuMDI1OSwgLTAuMDI2NiwgLTAuMDIzOSwgLTAuMDM3OSwgIDAuMDMyOSwgIDAuMDE3MywgLTAuMDIxMCwgLTAuMDExNCwKKy0wLjAwNjMsICAwLjAwNjAsIC0wLjAwODksIC0wLjAxOTgsIC0wLjAyODIsIC0wLjAwODAsIC0wLjAxNzksIC0wLjAyOTAsCisgMC4wMDQ2LCAtMC4wMTI2LCAtMC4wMDY2LCAgMC4wMzUwLCAgMC4wNTMyLCAgMC4wMjM1LCAgMC4wMTk4LCAgMC4wMjEyLAorIDAuMDQ0OSwgIDAuMDY4MSwgIDAuMDY3NywgLTAuMDA0OSwgIDAuMDA4NiwgIDAuMDEyMCwgIDAuMDM1NiwgIDAuMDQ1NCwKKyAwLjA1OTIsICAwLjA0NDksIC0wLjAyNzEsIC0wLjA1MTAsIC0wLjAxMTAsICAwLjAyMzQsICAwLjAyMDMsICAwLjAyNDMsCisgMC4wMjQyLCAgMC4wMTMzLCAgMC4wMDk4LCAgMC4wMDQwLCAgMC4wMDI0LCAtMC4wMDA1LCAtMC4wMDc1LCAtMC4wMTI2LAorLTAuMDM5MywgLTAuMDA1MiwgIDAuMDE2NSwgIDAuMDAxNiwgLTAuMDE5MywgIDAuMDIzOSwgIDAuMDMzNiwgIDAuMDAyOSwKKy0wLjA1ODYsIC0wLjA1MzksIC0wLjAwOTQsIC0wLjA2NjQsIC0wLjA4OTgsIC0wLjA1NDAsIC0wLjAwNjYsICAwLjAxMzQsCistMC4wMDc0LCAgMC4wMDY3LCAtMC4wNTIxLCAtMC4wNDMxLCAgMC4wMTA0LCAgMC4wNjkwLCAgMC4wNjYzLCAgMC4wMTk3LAorLTAuMDAxNywgLTAuMDUxOCwgLTAuMDU5NywgLTAuMDE3MSwgLTAuMDA1NCwgLTAuMDE0MCwgLTAuMDA4MCwgIDAuMDE3MiwKKy0wLjAzNjIsIC0wLjA3MTMsIC0wLjAzMTAsICAwLjAwOTYsICAwLjAyNDMsICAwLjAzODEsIC0wLjAwNjIsIC0wLjAzOTIsCistMC4wMjgxLCAgMC4wMzg2LCAgMC4wNDYxLCAgMC4wMDY5LCAgMC4wMzg0LCAgMC4wMDgwLCAtMC4wMTQxLCAgMC4wMTcxLAorIDAuMzM2OCwgIDAuMzEyOCwgIDAuMzMwNCwgIDAuMzM5MiwgIDAuMzE4NSwgIDAuMzAzNywgIDAuMjc4OSwgIDAuMjY5MiwKKyAwLjI3NzksICAwLjI3OTYsICAwLjI4OTEsICAwLjI2NDMsICAwLjI2NDcsICAwLjI1OTMsICAwLjI5MjcsICAwLjMyODMsCisgMC40OTc4LCAgMC40OTg4LCAgMC40OTY5LCAgMC40OTk3LCAgMC40OTU3LCAgMC40OTg1LCAgMC40OTcwLCAgMC40OTc4LAorIDAuNDkzOCwgIDAuNDk1MSwgIDAuNDk5NCwgIDAuNDk3MSwgIDAuNDk4MSwgIDAuNDk4MywgIDAuNDk2NywgIDAuNDc4OQorfSwKKworLmxzcDQ0ID0geworIDAuMDkyNywgIDAuMjI5MSwgIDAuNDA1OSwgIDAuNTc3OSwgIDAuNzI4OCwgIDAuODgyMSwgIDEuMDM3NywgIDEuMTkxNSwKKyAxLjM0MzMsICAxLjQ5MzEsICAxLjY0NzUsICAxLjc5ODksICAxLjkzODEsICAyLjA4NTgsICAyLjIzMjEsICAyLjM3NjUsCisgMi41MTg3LCAgMi42NTMwLCAgMi43ODk1LCAgMi45MzU0LCAgMC4wOTQ0LCAgMC4xOTc0LCAgMC4zMDQ2LCAgMC40NzE0LAorIDAuNjExNiwgIDAuNzgyOSwgIDAuOTAyNywgIDEuMDM3NSwgIDEuMTg2OSwgIDEuMzQ4OCwgIDEuNTAzNiwgIDEuNjc4MSwKKyAxLjgyNzYsICAxLjk5ODMsICAyLjE0NDksICAyLjMwODksICAyLjQ1MzQsICAyLjYxMTMsICAyLjc1NTMsICAyLjkwNjIsCisgMC4xMTY4LCAgMC4yODQzLCAgMC40OTA3LCAgMC42NzA2LCAgMC44MTAwLCAgMC45NDE3LCAgMS4wNzUzLCAgMS4yMDE0LAorIDEuMzE1MSwgIDEuNDQ5NiwgIDEuNTgzMiwgIDEuNzM3OSwgIDEuODY0MiwgIDIuMDIzMCwgIDIuMTY4MSwgIDIuMzI1MCwKKyAyLjQ2NzYsICAyLjYyNDIsICAyLjc2MDIsICAyLjkwNjYsICAwLjEzNTMsICAwLjIzMzUsICAwLjMzNzAsICAwLjQzODAsCisgMC41ODE5LCAgMC43MzUzLCAgMC44NjcxLCAgMS4wMTYwLCAgMS4xNDM1LCAgMS4yOTc3LCAgMS40ODYwLCAgMS42NzM5LAorIDEuODQxMiwgIDIuMDAyOCwgIDIuMTUzNywgIDIuMzEyNCwgIDIuNDc0MSwgIDIuNjI3MiwgIDIuNzg2MiwgIDIuOTUzNiwKKyAwLjEwMDMsICAwLjIyMjYsICAwLjM1ODQsICAwLjQ5NzEsICAwLjYyOTEsICAwLjc3MTAsICAwLjkxNTcsICAxLjA2NjksCisgMS4yMTQzLCAgMS4zNjI0LCAgMS41MTA0LCAgMS42NjgxLCAgMS44MTY0LCAgMS45ODIzLCAgMi4xMzk0LCAgMi4zMDgyLAorIDIuNDY3NywgIDIuNjMwNiwgIDIuNzkwOSwgIDIuOTM4MiwgIDAuMTA1NiwgIDAuMjAyNywgIDAuMjk1NiwgIDAuNDAwNSwKKyAwLjUyMTUsICAwLjY3MDgsICAwLjg1NDUsICAxLjA1NTcsICAxLjIzNDQsICAxLjQwMjMsICAxLjU2NzYsICAxLjcyNzgsCisgMS44ODA4LCAgMi4wMzgxLCAgMi4xODQ2LCAgMi4zMzc2LCAgMi40ODg3LCAgMi42Mzc3LCAgMi43ODc4LCAgMi45NTA0LAorIDAuMTAxNSwgIDAuMjQ2MiwgIDAuNDEyMiwgIDAuNTc4MywgIDAuNzIzMywgIDAuODgzMywgIDEuMDM3NywgIDEuMTkwMywKKyAxLjMzNDEsICAxLjQ3MjcsICAxLjYxMzgsICAxLjc1ODIsICAxLjg5MTIsICAyLjAzNzAsICAyLjE3MDEsICAyLjMxMjUsCisgMi40NTAwLCAgMi42MDA2LCAgMi43NTA3LCAgMi45MTY2LCAgMC4xNzg3LCAgMC4yNDE4LCAgMC4zMjY1LCAgMC41Mzc5LAorIDAuNjU4NCwgIDAuNzY4MSwgIDAuOTU0NSwgIDEuMTA1MCwgIDEuMjEyNSwgIDEuMzUyOCwgIDEuNDc2MywgIDEuNjcwNSwKKyAxLjgxMzYsICAxLjk1OTQsICAyLjA5MzYsICAyLjI3MjQsICAyLjQzOTQsICAyLjU5MTksICAyLjcwMzcsICAyLjg3NDcsCisgMC4wODU5LCAgMC4xNjAwLCAgMC4yOTgwLCAgMC40OTMzLCAgMC42Njk2LCAgMC44Mjg1LCAgMC45OTU4LCAgMS4xNTQ1LAorIDEuMzEwNywgIDEuNDU5MSwgIDEuNjEyNywgIDEuNzY1MiwgIDEuOTE0MywgIDIuMDY4MCwgIDIuMjE3MSwgIDIuMzY0MywKKyAyLjUxNDEsICAyLjY2MTEsICAyLjgxNDMsICAyLjk2OTEsICAwLjA5MTAsICAwLjIxMTAsICAwLjMzNjQsICAwLjQ3MTgsCisgMC41ODU2LCAgMC43Mjk4LCAgMC44OTEwLCAgMS4wNTE0LCAgMS4xOTg4LCAgMS4zNTcyLCAgMS41MTc4LCAgMS42ODYxLAorIDEuODM5OSwgIDIuMDA5OSwgIDIuMTYzOSwgIDIuMzIyNSwgIDIuNDc3NCwgIDIuNjMyMSwgIDIuNzg2MywgIDIuOTQxMiwKKyAwLjE5MDQsICAwLjI4NzQsICAwLjM2ODEsICAwLjQ5ODEsICAwLjYyNDgsICAwLjc4ODAsICAwLjkxMjEsICAxLjA3NTAsCisgMS4yMTg1LCAgMS4zODA5LCAgMS41Mjk2LCAgMS43MDA3LCAgMS44NTkyLCAgMi4wNDcwLCAgMi4xOTEzLCAgMi4zMjUwLAorIDIuNDUxOSwgIDIuNTk4NCwgIDIuNzQwOCwgIDIuOTAyMywgIDAuMDkxNywgIDAuMjA2NywgIDAuMzI0NiwgIDAuNDk2MSwKKyAwLjYzMTAsICAwLjgwMjQsICAwLjk0MzgsICAxLjEwMDgsICAxLjIzNjIsICAxLjM4OTIsICAxLjU0MDcsICAxLjcwMzMsCisgMS44NDI3LCAgMi4wMDYxLCAgMi4xNDk4LCAgMi4zMTE3LCAgMi40NTUwLCAgMi42MDUzLCAgMi43NDYyLCAgMi45MDI5LAorIDAuMDk4OSwgIDAuMjE5MywgIDAuMzc1NiwgIDAuNTQxMCwgIDAuNjkyOSwgIDAuODM2OCwgIDAuOTgwMSwgIDEuMTI1MCwKKyAxLjI2NzcsICAxLjQxODQsICAxLjU2NzcsICAxLjcyOTIsICAxLjg3NzAsICAyLjAzMTEsICAyLjE4MDMsICAyLjMzMDYsCisgMi40ODM2LCAgMi42MzM5LCAgMi43OTQzLCAgMi45NTQ5LCAgMC4wODYxLCAgMC4xOTQzLCAgMC4zMDU3LCAgMC40ODY3LAorIDAuNjE5NCwgIDAuNzU5MiwgIDAuOTE4NCwgIDEuMTA1MiwgIDEuMjQ4NiwgIDEuNDA2NCwgIDEuNTYwOSwgIDEuNzI3MywKKyAxLjg3MDMsICAyLjAyOTEsICAyLjE2ODYsICAyLjMyMjUsICAyLjQ2MjgsICAyLjYxMTUsICAyLjc0NzEsICAyLjkwMDUsCisgMC4wOTMyLCAgMC4yMTEwLCAgMC4zNzM3LCAgMC41NDc5LCAgMC43MTIwLCAgMC44NTcwLCAgMC45OTc1LCAgMS4xMzY0LAorIDEuMjc3MiwgIDEuNDIyMCwgIDEuNTYxMiwgIDEuNzA4OSwgIDEuODQxMCwgIDEuOTgyNywgIDIuMTI2MywgIDIuMjg1OSwKKyAyLjQ0NTksICAyLjYxNzIsICAyLjc3ODgsICAyLjkzOTUsICAwLjExOTMsICAwLjIzNDEsICAwLjM1MjMsICAwLjUwMjksCisgMC42NDM3LCAgMC43ODAzLCAgMC45MzY3LCAgMS4xMDA3LCAgMS4yMzkyLCAgMS4zODY5LCAgMS41NDI1LCAgMS43MTY4LAorIDEuODcwOSwgIDIuMDI0OCwgIDIuMTU4NCwgIDIuMjk0OSwgIDIuNDMwOCwgIDIuNTgyMywgIDIuNzIzNSwgIDIuOTAzNCwKKyAwLjA4MzQsICAwLjE5ODgsICAwLjM1NTcsICAwLjUyNjEsICAwLjY3NjcsICAwLjg0MjcsICAxLjAwMjksICAxLjE2ODMsCisgMS4zMTM4LCAgMS40NTI3LCAgMS42MDQ2LCAgMS43NTgzLCAgMS45MDExLCAgMi4wNTE3LCAgMi4xOTI4LCAgMi4zMzk3LAorIDIuNDgzOSwgIDIuNjI5MSwgIDIuNzc3MSwgIDIuOTMyOSwgIDAuMDkzOCwgIDAuMTk2NywgIDAuMzIxMywgIDAuNDY3NSwKKyAwLjYwNjgsICAwLjc2NjQsICAwLjk0MTgsICAxLjExMjAsICAxLjI1MzUsICAxLjM5MzIsICAxLjUyNDMsICAxLjY4MDEsCisgMS44MzQ2LCAgMS45OTMxLCAgMi4xMzc2LCAgMi4zMDM1LCAgMi40NjM2LCAgMi42MjQ0LCAgMi43ODI5LCAgMi45MzcxLAorIDAuMTAxNywgIDAuMjU1MiwgIDAuNDMyNywgIDAuNjAxNywgIDAuNzQ2NywgIDAuODc5NywgIDEuMDA5NywgIDEuMTQ0MiwKKyAxLjI2MjgsICAxLjQwNDksICAxLjU1NDEsICAxLjcwOTAsICAxLjg0NjEsICAxLjk5ODIsICAyLjE0ODYsICAyLjMwMjksCisgMi40NTEzLCAgMi42MDc1LCAgMi43NTk0LCAgMi45MjA5LCAgMC4xMDMxLCAgMC4yMjk1LCAgMC4zNzQ3LCAgMC41MTIyLAorIDAuNjU5NiwgIDAuNzkzNSwgIDAuOTM0NSwgIDEuMTA1MCwgIDEuMjM4NCwgIDEuMzU0MywgIDEuNDczOSwgIDEuNjEzNiwKKyAxLjc0NDcsICAxLjg5MTQsICAyLjA0MzQsICAyLjE5MTYsICAyLjM1NTcsICAyLjUzOTYsICAyLjc0MTksICAyLjk0MDEsCisgMC4xMDA3LCAgMC4yMzc0LCAgMC4zNzE1LCAgMC41MTczLCAgMC42NDY1LCAgMC44MDY5LCAgMC45NTUzLCAgMS4xMTQ1LAorIDEuMjU5NCwgIDEuNDE0MywgIDEuNTYxNywgIDEuNzE2NiwgIDEuODQ1NywgIDIuMDAxMiwgIDIuMTQ2MiwgIDIuMjg2NCwKKyAyLjQyNTgsICAyLjU5MTAsICAyLjczNzIsICAyLjkwMTgsICAwLjA4MDgsICAwLjE3MjYsICAwLjI4NDksICAwLjQ1OTIsCisgMC42MTE4LCAgMC43ODUzLCAgMC45NTg4LCAgMS4xMjU2LCAgMS4yNzUxLCAgMS40MzkyLCAgMS41ODk4LCAgMS43NTE0LAorIDEuODk3NywgIDIuMDU1NCwgIDIuMTkzNywgIDIuMzQzMCwgIDIuNDgzMSwgIDIuNjI0OSwgIDIuNzYwMSwgIDIuOTE1NSwKKyAwLjE2NjksICAwLjI1NzQsICAwLjM2OTQsICAwLjU1NjksICAwLjY3NzMsICAwLjgwNjEsICAxLjAxNjAsICAxLjE2NjcsCisgMS4yNzkxLCAgMS40MDQxLCAgMS41NDUyLCAgMS43MjA3LCAgMS44NTI0LCAgMi4wMDM4LCAgMi4xNDE0LCAgMi4zMzM4LAorIDIuNDc0NywgIDIuNjE1NywgIDIuNzMwMywgIDIuODg0OCwgIDAuMTU5OCwgIDAuMjUyMSwgIDAuMzQxNiwgIDAuNTE0OSwKKyAwLjY3MDMsICAwLjc5NDEsICAwLjk0MDgsICAxLjExNjQsICAxLjIwMTcsICAxLjMyOTMsICAxLjQ5MDgsICAxLjY3ODMsCisgMS44NDM4LCAgMS45OTI3LCAgMi4xMTQ5LCAgMi4yNjk4LCAgMi40NDIwLCAgMi42MTkzLCAgMi43NTgzLCAgMi45MTAzLAorIDAuMDkwMiwgIDAuMTk3OCwgIDAuMzI2NSwgIDAuNDU3OCwgIDAuNTg3OCwgIDAuNzQzOSwgIDAuOTExMCwgIDEuMDkwNiwKKyAxLjI1NTYsICAxLjQxMjUsICAxLjU2ODgsICAxLjcyOTUsICAxLjg4MjksICAyLjA0NzIsICAyLjIwNTgsICAyLjM1MzcsCisgMi41MDc1LCAgMi42NTQ4LCAgMi44MDU4LCAgMi45NTM4LCAgMC4wODE4LCAgMC4xNjk1LCAgMC4yNzk0LCAgMC40NDcwLAorIDAuNjA2OSwgIDAuNzY0MSwgIDAuOTMxMywgIDEuMDk0NiwgIDEuMjQxMSwgIDEuNDA3MiwgIDEuNTY0MCwgIDEuNzE4NiwKKyAxLjg2NTEsICAyLjAyNTQsICAyLjE3MjYsICAyLjMyODYsICAyLjQ3ODQsICAyLjYyODcsICAyLjc3NTAsICAyLjkzMzksCisgMC4xOTgwLCAgMC4zMTM0LCAgMC40MDk5LCAgMC40OTc1LCAgMC42NDkxLCAgMC44Mzc2LCAgMC45NDQxLCAgMS4wMjk4LAorIDEuMTc5NSwgIDEuMzg2NiwgIDEuNTc4NCwgIDEuNzIwOSwgIDEuODEzNywgIDEuOTI3MSwgIDIuMDg2MywgIDIuMjkzMCwKKyAyLjQ2OTYsICAyLjYxODQsICAyLjc1ODcsICAyLjkyNTEsICAwLjEzMzgsICAwLjIzNDEsICAwLjM1NjYsICAwLjQ3OTcsCisgMC42MTI5LCAgMC43NTgwLCAgMC45MDkzLCAgMS4wNDkxLCAgMS4xOTExLCAgMS4zMzEzLCAgMS40ODQxLCAgMS42NTAzLAorIDEuODAzNSwgIDEuOTY4NSwgIDIuMTEyOCwgIDIuMjY5NCwgIDIuNDA5MywgIDIuNTcyOCwgIDIuNzIwNiwgIDIuODk5NCwKKyAwLjA5MzcsICAwLjIwMzQsICAwLjM0NDcsICAwLjUwMzIsICAwLjYzNzAsICAwLjc5OTMsICAwLjk2NzQsICAxLjEzMjMsCisgMS4yODMwLCAgMS40MTk5LCAgMS41NDkyLCAgMS43MDEwLCAgMS44NTEzLCAgMi4wMDg3LCAgMi4xNTUwLCAgMi4zMTE1LAorIDIuNDY0MywgIDIuNjIzNywgIDIuNzgxMiwgIDIuOTM5MiwgIDAuMTA4NSwgIDAuMjE1MiwgIDAuMzEyNiwgIDAuNDU2OSwKKyAwLjU3MTgsICAwLjcyMTMsICAwLjg4MzcsICAxLjA2MDQsICAxLjIwNTMsICAxLjM3NTUsICAxLjUzOTcsICAxLjcwMDEsCisgMS44NDA5LCAgMi4wMDM5LCAgMi4xNDk4LCAgMi4zMDgwLCAgMi40NTM1LCAgMi42MDYzLCAgMi43NTA1LCAgMi45MTEwLAorIDAuMDU2MiwgIDAuMjA2NiwgIDAuNDAzNCwgIDAuNTQ5MCwgIDAuNjY4MiwgIDAuNzkyNCwgIDAuOTQ5NSwgIDEuMDgwMCwKKyAxLjE4NjksICAxLjMxNTYsICAxLjQ4MzQsICAxLjY2MTksICAxLjg0MDQsICAyLjAxOTksICAyLjE1MDksICAyLjI3NTUsCisgMi40MDcyLCAgMi41NTgwLCAgMi42OTkzLCAgMi44OTEzLCAgMC4wOTM5LCAgMC4yMzAzLCAgMC4zNzQyLCAgMC41MjYwLAorIDAuNjY2MiwgIDAuODI5NCwgIDAuOTc2OSwgIDEuMTMxNSwgIDEuMjc5MiwgIDEuNDE1MywgIDEuNTQzNiwgIDEuNjcwMSwKKyAxLjgyMTUsICAxLjk5MjAsICAyLjEzMTAsICAyLjMwMDUsICAyLjQ1MzQsICAyLjU3ODYsICAyLjcyMDQsICAyLjkwNjgsCisgMC4xMDA1LCAgMC4yNDQyLCAgMC4zODk4LCAgMC41Mzk4LCAgMC42OTU4LCAgMC44NDc0LCAgMS4wMDA4LCAgMS4xNTU2LAorIDEuMzAyMCwgIDEuNDQ1NiwgIDEuNTk1NCwgIDEuNzQ3MCwgIDEuODkyMiwgIDIuMDUwMCwgIDIuMjAxOSwgIDIuMzQ5MiwKKyAyLjQ5NjMsICAyLjY0MTIsICAyLjc4OTAsICAyLjk0MjMsICAwLjEwMjIsICAwLjIwMzEsICAwLjMyMTMsICAwLjQ0MDIsCisgMC41NjM3LCAgMC43MTE3LCAgMC44NjczLCAgMS4wMjQyLCAgMS4xNzI3LCAgMS4zMjA2LCAgMS40ODQ2LCAgMS42NDY1LAorIDEuODAxNSwgIDEuOTY1NSwgIDIuMTIzMywgIDIuMjg3MywgIDIuNDQ2NCwgIDIuNjA3NCwgIDIuNzY4NSwgIDIuOTQwOSwKKyAwLjE5ODUsICAwLjM0OTcsICAwLjQ2MjIsICAwLjU5ODIsICAwLjc0ODksICAwLjg3NTIsICAwLjk5MjUsICAxLjE2NzksCisgMS4zMjg4LCAgMS40NjA2LCAgMS41ODIwLCAgMS43NDkyLCAgMS44OTIyLCAgMi4wNTExLCAgMi4xNzgwLCAgMi4zMzczLAorIDIuNDc2MCwgIDIuNjIzMywgIDIuNzQ2NiwgIDIuODk3OCwgIDAuMTI4NCwgIDAuMjQzMywgIDAuMzYzMCwgIDAuNDg1MiwKKyAwLjYxMTcsICAwLjc0NjAsICAwLjg5MDQsICAxLjAzNjAsICAxLjE3MzgsICAxLjMxNDIsICAxLjQ2OTYsICAxLjYxODUsCisgMS43NzE5LCAgMS45MzE4LCAgMi4wOTYxLCAgMi4yNjk3LCAgMi40NDA4LCAgMi42MDQ2LCAgMi43NjgxLCAgMi45NDUxLAorIDAuMTA0MiwgIDAuMjI4NiwgIDAuMzU5OCwgIDAuNTA2NCwgIDAuNjQzOCwgIDAuNzg5OSwgIDAuOTM1MCwgIDEuMDg5MSwKKyAxLjIzMjMsICAxLjM4MDcsICAxLjUyMjUsICAxLjY3NDcsICAxLjgxNTMsICAxLjk2NjksICAyLjExNDUsICAyLjI4MzIsCisgMi40NDMwLCAgMi42MDg1LCAgMi43NzQ4LCAgMi45MzQ2LCAgMC4wNzgwLCAgMC4xNzI0LCAgMC4yNDQwLCAgMC4zNDg5LAorIDAuNTI4MCwgIDAuNzQyNiwgIDAuOTI3MiwgIDEuMDkxNCwgIDEuMjU2MiwgIDEuNDE4OCwgIDEuNTgwNCwgIDEuNzM3NiwKKyAxLjg5MDksICAyLjA0NzMsICAyLjE5NDYsICAyLjM0NTcsICAyLjQ5NTAsICAyLjY0MjQsICAyLjc5MjYsICAyLjk1NDksCisgMC4xMTAzLCAgMC4yNjA4LCAgMC40MDg3LCAgMC41NTM4LCAgMC42OTIzLCAgMC44NDE4LCAgMC45OTQwLCAgMS4xNTA3LAorIDEuMjkxOSwgIDEuNDQwNiwgIDEuNTgwMiwgIDEuNzI2MiwgIDEuODYzOCwgIDIuMDA4NSwgIDIuMTU3MiwgIDIuMjk3NSwKKyAyLjQzMjksICAyLjU4NjYsICAyLjczODAsICAyLjkxMDcsICAwLjEyOTcsICAwLjI1MzIsICAwLjQwMDMsICAwLjUzMjksCisgMC42NzMzLCAgMC43OTUwLCAgMC45NTU3LCAgMS4wODU5LCAgMS4yMjM1LCAgMS4zNTM4LCAgMS41MDM3LCAgMS42Mzg5LAorIDEuNzk2NCwgIDEuOTI4NSwgIDIuMDg5OCwgIDIuMjU0MSwgIDIuNDIzMSwgIDIuNTcxMSwgIDIuNjg3NSwgIDIuODk0NywKKyAwLjA4NzEsICAwLjE5NjgsICAwLjM0MjUsICAwLjQ5NDksICAwLjY0MjQsICAwLjc5NTksICAwLjk1MzQsICAxLjExMzIsCisgMS4yNjU2LCAgMS40MjI5LCAgMS41Nzg1LCAgMS43MjcxLCAgMS44NzI5LCAgMi4wMzU1LCAgMi4xOTk4LCAgMi4zNTYyLAorIDIuNTE1MSwgIDIuNjY2MywgIDIuODE0NSwgIDIuOTUzNCwgIDAuMTAzOCwgIDAuMjIwNCwgIDAuMzI0OCwgIDAuNDU2NiwKKyAwLjU5NDcsICAwLjc0NDMsICAwLjg4MTEsICAxLjAzNzksICAxLjIwMzEsICAxLjM3NzIsICAxLjU0MzAsICAxLjcwOTIsCisgMS44NjI1LCAgMi4wMzIyLCAgMi4xOTA0LCAgMi4zNDE3LCAgMi40OTYwLCAgMi42NDU4LCAgMi43OTc5LCAgMi45NDg1LAorIDAuMTMyOSwgIDAuMjc2MywgIDAuMzk0MywgIDAuNTE0NywgIDAuNjUxMiwgIDAuODA3MSwgIDAuOTQxMCwgIDEuMDg3OSwKKyAxLjIyOTgsICAxLjM4NTAsICAxLjUyODIsICAxLjY2NzQsICAxLjgxMzcsICAxLjk5OTMsICAyLjEzNDQsICAyLjI3NDksCisgMi40MjU3LCAgMi41ODYzLCAgMi43NDEwLCAgMi45MTg0LCAgMC4xMDUyLCAgMC4yMTQyLCAgMC4zNTg0LCAgMC41MDMzLAorIDAuNjM4NywgIDAuNzgwNCwgIDAuOTMyMCwgIDEuMDc4MCwgIDEuMjE3MiwgIDEuMzc2NCwgIDEuNTQyMSwgIDEuNjg4NywKKyAxLjgyNDYsICAxLjk4MzMsICAyLjEyNDUsICAyLjI3OTcsICAyLjQyMzcsICAyLjU3NzksICAyLjcyNTcsICAyLjkwOTcsCisgMC4xMDkyLCAgMC4yNjc2LCAgMC40MDcxLCAgMC41MzU1LCAgMC42NjYxLCAgMC44MTQyLCAgMC45NjIxLCAgMS4xMTczLAorIDEuMjYyOCwgIDEuNDE4NSwgIDEuNTY5NiwgIDEuNzIyMCwgIDEuODU5NSwgIDIuMDE3OCwgIDIuMTcyMCwgIDIuMzIyMSwKKyAyLjQ3MTgsICAyLjYyNTksICAyLjc3NzUsICAyLjkzMzQsICAwLjA5MjksICAwLjIwMTcsICAwLjMwNzMsICAwLjQ1NzAsCisgMC41Nzc1LCAgMC43NjM1LCAgMC45Mjk5LCAgMS4wODMyLCAgMS4yMzM0LCAgMS4zOTM1LCAgMS41NDIwLCAgMS43MTEyLAorIDEuODYwMSwgIDIuMDMwOSwgIDIuMTczNSwgIDIuMzIzMCwgIDIuNDU0MywgIDIuNjAzNCwgIDIuNzQxOCwgIDIuODk4OCwKKyAwLjA3NzUsICAwLjIwMDUsICAwLjM0OTAsICAwLjUyMDAsICAwLjY3NDcsICAwLjgzODMsICAwLjk4ODUsICAxLjE3MzgsCisgMS4zMTQxLCAgMS40MjM2LCAgMS41ODkyLCAgMS43NDAyLCAgMS44NDc0LCAgMi4wMjEwLCAgMi4xNTkzLCAgMi4yNzMwLAorIDIuNDIzNSwgIDIuNTYwNCwgIDIuNzEyOCwgIDIuOTAwNSwgIDAuMTEwNCwgIDAuMjI5MiwgIDAuMzM1MywgIDAuNDczMiwKKyAwLjYxNTIsICAwLjc2NzUsICAwLjkxNjQsICAxLjA5MDcsICAxLjI1OTQsICAxLjQwNjQsICAxLjUyMTgsICAxLjY0MjYsCisgMS44MDE4LCAgMS45OTM3LCAgMi4xMzYyLCAgMi4yOTYxLCAgMi40NTIzLCAgMi42MDgzLCAgMi43NjEzLCAgMi45MjAyLAorIDAuMDgyNiwgIDAuMjAwMCwgIDAuMzM4NCwgIDAuNTE0NCwgIDAuNjY5NCwgIDAuODM3NywgIDAuOTg3MCwgIDEuMTQ2MSwKKyAxLjI5NTAsICAxLjQ0OTUsICAxLjU4NzIsICAxLjczODcsICAxLjg3OTMsICAyLjAzMjksICAyLjE3MjMsICAyLjMxMTQsCisgMi40NDE1LCAgMi41OTA4LCAgMi43MzU0LCAgMi45MDI4LCAgMC4xMDYzLCAgMC4yMjY4LCAgMC4zNDQyLCAgMC40NzM1LAorIDAuNjExNiwgIDAuNzUwNywgIDAuOTAyOCwgIDEuMDc2OCwgIDEuMjQyNiwgIDEuNDA1MiwgIDEuNTU2NiwgIDEuNzAxNSwKKyAxLjgyNDMsICAxLjk3NDIsICAyLjEyNzYsICAyLjI4MjQsICAyLjQyNjIsICAyLjU5NTMsICAyLjc2MjcsICAyLjkyOTAsCisgMC4xMTUwLCAgMC4yODE0LCAgMC40NTQzLCAgMC42MDk1LCAgMC43MzczLCAgMC44NTkyLCAgMC45OTA4LCAgMS4xMTA4LAorIDEuMjMzOSwgIDEuMzU5MCwgIDEuNDg2NCwgIDEuNjE2OCwgIDEuNzM5MiwgIDEuODc1MiwgIDIuMDIxMiwgIDIuMTY4OCwKKyAyLjMxMjgsICAyLjQ4NjksICAyLjcwMTksICAyLjkyMzksICAwLjA5NDgsICAwLjIwNzQsICAwLjM0MzMsICAwLjQ5NDMsCisgMC42MzQ2LCAgMC43NjQ1LCAgMC44ODA5LCAgMS4wNjEwLCAgMS4yMzA3LCAgMS4zNDg3LCAgMS40NjU1LCAgMS42MTg2LAorIDEuNzUzNCwgIDEuODg1OSwgIDIuMDQ4NiwgIDIuMjIwMCwgIDIuMzgzNSwgIDIuNTU4MSwgIDIuNzU2NSwgIDIuOTUwMiwKKyAwLjEwNjIsICAwLjIyMzksICAwLjM2ODMsICAwLjUxOTcsICAwLjY3MDQsICAwLjgxODQsICAwLjk2NDIsICAxLjExMjcsCisgMS4yNTU2LCAgMS4zOTc2LCAgMS41NDA1LCAgMS42OTQwLCAgMS44Mzc1LCAgMS45ODg4LCAgMi4xMzc3LCAgMi4yOTgwLAorIDIuNDU1NSwgIDIuNjE4NCwgIDIuNzg0OSwgIDIuOTQ1MiwgIDAuMDg4OCwgIDAuMjAwNSwgIDAuMjg0NywgIDAuNDMyMiwKKyAwLjU3NjMsICAwLjc1NzcsICAwLjkyNjIsICAxLjEwOTUsICAxLjI3MTksICAxLjQzMzEsICAxLjU4NDMsICAxLjc0NTIsCisgMS44ODQ1LCAgMi4wMzg1LCAgMi4xODA1LCAgMi4zMzQ1LCAgMi40NzUwLCAgMi42MjE3LCAgMi43NTU1LCAgMi45MDEzLAorIDAuMTcxMywgIDAuMjYxNywgIDAuMzg2OCwgIDAuNTg1OSwgIDAuNzA3MywgIDAuODUzNSwgIDEuMDU5MywgIDEuMTc3OCwKKyAxLjMxMDksICAxLjQ1MDgsICAxLjU5MTAsICAxLjc0NjMsICAxLjg5MTEsICAyLjA2NTEsICAyLjIwMzUsICAyLjMzNTUsCisgMi40OTQ3LCAgMi42NDQwLCAgMi43NDI0LCAgMi44OTQzLCAgMC4xMzQ2LCAgMC4yNTQ5LCAgMC40MDg5LCAgMC41NDg4LAorIDAuNjk0OSwgIDAuODM5NCwgIDAuOTgxMCwgIDEuMTE0NSwgIDEuMjUyOCwgIDEuNDA0NCwgIDEuNTQyMywgIDEuNjg3MiwKKyAxLjgyNzQsICAxLjk3MjYsICAyLjE0MDMsICAyLjI4MDksICAyLjQxMjgsICAyLjU1NjQsICAyLjY4ODcsICAyLjg4OTUsCisgMC4wNzc2LCAgMC4xNjIxLCAgMC4yNTUzLCAgMC40MTkxLCAgMC41OTg4LCAgMC43OTIxLCAgMC45NjUxLCAgMS4xMzUwLAorIDEuMjkzMCwgIDEuNDQ3NSwgIDEuNjAxMSwgIDEuNzU4NSwgIDEuOTA2OCwgIDIuMDYzOCwgIDIuMjEwMiwgIDIuMzU5NCwKKyAyLjUwOTYsICAyLjY1ODEsICAyLjgwOTksICAyLjk2NTQsICAwLjA4NjQsICAwLjE3NzgsICAwLjI4NTQsICAwLjQyMzUsCisgMC41NTY4LCAgMC43MjIwLCAgMC44OTYzLCAgMS4wNjA5LCAgMS4yMjE3LCAgMS4zODMwLCAgMS41NDIyLCAgMS43MDE4LAorIDEuODU1MSwgIDIuMDIwNiwgIDIuMTc4MywgIDIuMzMyOCwgIDIuNDg2OSwgIDIuNjM2NiwgIDIuNzkyMywgIDIuOTUzOSwKKyAwLjExNDQsICAwLjI1NzYsICAwLjQxODYsICAwLjU1OTQsICAwLjY4NzUsICAwLjgyMjEsICAwLjk1OTgsICAxLjA5NDQsCisgMS4yMjczLCAgMS4zNzEzLCAgMS41MTUyLCAgMS42NjI4LCAgMS44MDcwLCAgMS45NTI1LCAgMi4wOTY1LCAgMi4yNTM1LAorIDIuNDEzMiwgIDIuNTcyNSwgIDIuNzI1MCwgIDIuOTE1MCwgIDAuMTA3OSwgIDAuMjIyMSwgIDAuMzMzNCwgIDAuNDg0NSwKKyAwLjYwODMsICAwLjc1MTYsICAwLjkwMTgsICAxLjA1OTQsICAxLjIwNjAsICAxLjM2NzMsICAxLjUyMTIsICAxLjY4ODAsCisgMS44MjA4LCAgMS45ODMxLCAgMi4xMjY5LCAgMi4yOTA5LCAgMi40MzY2LCAgMi42MDI3LCAgMi43MzM5LCAgMi44OTI0LAorIDAuMDk5NCwgIDAuMjIzMywgIDAuMzYzNCwgIDAuNTE0NSwgIDAuNjU2OCwgIDAuODEzMSwgIDAuOTc0NiwgIDEuMTI5NiwKKyAxLjI2NjYsICAxLjQxMTYsICAxLjU3NDgsICAxLjcyNjQsICAxLjg2NDksICAyLjAyMTcsICAyLjE3MTYsICAyLjMyOTMsCisgMi40OTAwLCAgMi42NDU1LCAgMi43ODE4LCAgMi45MzYyLCAgMC4xMTIwLCAgMC4yMDc5LCAgMC4zMTI4LCAgMC40MTI0LAorIDAuNTI5MSwgIDAuNjgxNiwgIDAuODQ3OCwgIDEuMDE1MCwgIDEuMTc3MiwgIDEuMzQ1NiwgIDEuNTIwOCwgIDEuNjg4MiwKKyAxLjg0NTgsICAyLjAwNzgsICAyLjE2MjcsICAyLjMxOTgsICAyLjQ3MzMsICAyLjYyNTEsICAyLjc3OTYsICAyLjk0ODksCisgMC4wODUzLCAgMC4yMDMwLCAgMC4zNjY5LCAgMC41MzI2LCAgMC42Njc4LCAgMC44MDg2LCAgMC45NTI2LCAgMS4xMTQyLAorIDEuMjU1MSwgIDEuNDE1OCwgIDEuNTY5NCwgIDEuNzA3MywgIDEuODQzMSwgIDEuOTY4NiwgIDIuMTE1MywgIDIuMjM3NiwKKyAyLjM2ODYsICAyLjU1OTEsICAyLjczMjAsICAyLjkxMDQsICAwLjA5MDUsICAwLjIxNjYsICAwLjM1MzksICAwLjUyMDEsCisgMC42NzAwLCAgMC44MzQ2LCAgMC45ODgzLCAgMS4xNDU3LCAgMS4yNzE0LCAgMS4zODQ1LCAgMS41MTcyLCAgMS42Njg4LAorIDEuODAwOCwgIDEuOTUzNSwgIDIuMTAxOSwgIDIuMjcwOCwgIDIuNDEzNSwgIDIuNTk3NCwgIDIuNzQ4NiwgIDIuOTAzMywKKyAwLjAwODQsICAwLjAzNzQsICAwLjAxNjQsIC0wLjAxNTMsICAwLjAyODgsICAwLjAxMDcsIC0wLjAyNTUsIC0wLjAyNDIsCisgMC4wMDAwLCAtMC4wMDU1LCAtMC4wMDgxLCAtMC4wMDc1LCAtMC4wMDIyLCAtMC4wMDUyLCAtMC4wMDY5LCAtMC4wMDE3LAorIDAuMDAwMywgIDAuMDA5MSwgIDAuMDAyOCwgLTAuMDAyNywgIDAuMDA4NSwgIDAuMDA0MywgLTAuMDIzNSwgLTAuMDQxMSwKKyAwLjAyMDIsICAwLjAzNTksICAwLjAzNzYsICAwLjAzMjEsICAwLjAzMDYsIC0wLjAzNTgsIC0wLjAyNzYsIC0wLjAwOTAsCisgMC4wMDMyLCAgMC4wMDQ4LCAgMC4wMzA5LCAgMC4wMzMyLCAgMC4wMjg0LCAgMC4wMjM3LCAgMC4wMDUxLCAtMC4wMTAxLAorLTAuMDIzMywgLTAuMDQyOCwgLTAuMDU4NSwgLTAuMDM4NywgIDAuMDAzOSwgIDAuMDA4MSwgIDAuMDAyOSwgLTAuMDAxNywKKy0wLjAwMDYsIC0wLjAwNjgsICAwLjAwNDQsICAwLjAxODIsICAwLjAzNzYsICAwLjAzODcsIC0wLjAzMzQsIC0wLjAyNjksCistMC4wMTgyLCAtMC4wMDY5LCAtMC4wMDI2LCAgMC4wMDM1LCAtMC4wMDQ5LCAtMC4wMjEyLCAtMC4wNDA4LCAtMC4wMjQ1LAorIDAuMDE4NiwgIDAuMDE4OSwgIDAuMDE1MywgIDAuMDEyMCwgIDAuMDE1NywgIDAuMDA1NSwgLTAuMDA0NiwgIDAuMDE3OSwKKyAwLjAyODQsIC0wLjAwMzIsIC0wLjAyNjEsIC0wLjAyMDUsIC0wLjAwMzksICAwLjAxNzQsICAwLjAyOTksICAwLjAyMDcsCisgMC4wMDEyLCAtMC4wMDU2LCAgMC4wMDEwLCAgMC4wMTQxLCAtMC4wMTE5LCAgMC4wMTkwLCAgMC4wMzE1LCAgMC4wMDMzLAorLTAuMDEyOCwgIDAuMDMwMCwgIDAuMDMyOCwgIDAuMDMwOCwgIDAuMDM1MywgIDAuMDI2NiwgIDAuMDA2NiwgLTAuMDMyOCwKKy0wLjAyNzMsICAwLjAwNTQsICAwLjAxNDUsICAwLjAxNzUsICAwLjAwMTUsIC0wLjAxNzEsICAwLjAwNjIsIC0wLjAxNjQsCisgMC4wMDQ1LCAtMC4wMDcxLCAgMC4wMDI1LCAgMC4wMjc4LCAgMC4wMjgzLCAgMC4wMTE3LCAtMC4wMDI2LCAtMC4wMjg1LAorLTAuMDQwOCwgLTAuMDM2NiwgLTAuMDA1OSwgLTAuMDIwOCwgLTAuMDM1NCwgLTAuMDMzNCwgLTAuMDI2MywgLTAuMDA2NCwKKyAwLjAwNzIsIC0wLjAwMDYsIC0wLjAyMzUsIC0wLjAwMzcsIC0wLjAzMDcsIC0wLjAyOTQsIC0wLjAxNjMsIC0wLjAxOTcsCistMC4wMjM1LCAgMC4wMTkyLCAgMC4wMDEzLCAtMC4wMjE5LCAtMC4wMTIzLCAtMC4wMDA0LCAtMC4wMDgxLCAtMC4wMDk2LAorLTAuMDEyMywgLTAuMDEwMSwgIDAuMDAyMSwgIDAuMDE1MSwgIDAuMDEwNiwgIDAuMDE1MSwgIDAuMDI5MiwgIDAuMDAzMywKKyAwLjAyODMsICAwLjAxMjQsICAwLjAwNTgsIC0wLjAwMTcsIC0wLjAwMzgsICAwLjAxNTIsICAwLjAxNDEsICAwLjAxMzIsCisgMC4wMTc4LCAgMC4wMTU3LCAgMC4wMDczLCAgMC4wMTc2LCAgMC4wMTQxLCAgMC4wMDk3LCAtMC4wMDkyLCAtMC4wMTYzLAorLTAuMDIzMCwgLTAuMDEzNCwgLTAuMDA5OSwgLTAuMDE0NywgIDAuMDA0MCwgLTAuMDE4MywgLTAuMDE3NSwgLTAuMDA4MCwKKy0wLjAwODMsIC0wLjAyOTAsIC0wLjA0MTcsIC0wLjAzOTgsIC0wLjAyNjksIC0wLjAxOTksIC0wLjAxNDMsIC0wLjAwNTMsCistMC4wMDk5LCAtMC4wMDU0LCAtMC4wMTk5LCAtMC4wMjE5LCAtMC4wMTcwLCAgMC4wMTA3LCAgMC4wMTk0LCAgMC4wMDM1LAorIDAuMDQzNywgIDAuMDQwNiwgIDAuMDIxNSwgIDAuMDEyMCwgIDAuMDA1MywgLTAuMDAyOCwgIDAuMDIzOCwgIDAuMDMzNywKKyAwLjAyMTcsICAwLjAwMTEsICAwLjAyMjcsICAwLjAyNDQsICAwLjAzMjcsICAwLjAzNzgsICAwLjA0MzcsICAwLjAzNTYsCistMC4wMDMzLCAgMC4wMTEzLCAgMC4wNDA3LCAgMC4wMzM0LCAtMC4wMTI1LCAtMC4wMDAzLCAtMC4wMTQxLCAtMC4wMjczLAorLTAuMDEzNywgLTAuMDA3OSwgLTAuMDE0NSwgLTAuMDA3MSwgIDAuMDExNCwgIDAuMDE4MSwgIDAuMDE1MCwgIDAuMDA4NSwKKy0wLjAwNzcsIC0wLjAwMzgsIC0wLjAyMTksIC0wLjAyNjMsIC0wLjAxODcsIC0wLjAyMzMsICAwLjAxMzMsICAwLjAyNjUsCistMC4wMTU2LCAtMC4wMDkxLCAtMC4wMTEwLCAtMC4wMDE2LCAgMC4wMTQzLCAgMC4wMTc3LCAgMC4wMjQwLCAgMC4wMDgyLAorLTAuMDE0MywgLTAuMDI1NywgLTAuMDAxNCwgIDAuMDAwMiwgIDAuMDA4MiwgIDAuMDE4MCwgIDAuMDMyNSwgIDAuMDM0MCwKKy0wLjAxNTMsIC0wLjAzODksIC0wLjAyNDAsICAwLjAwODIsICAwLjAxNDAsICAwLjAwNDYsIC0wLjAxMzgsIC0wLjAzNzgsCistMC4wMzY2LCAgMC4wMjk3LCAgMC4wMjUyLCAgMC4wMDc4LCAgMC4wMDYzLCAgMC4wMDA2LCAgMC4wMDQ0LCAgMC4wMDc0LAorIDAuMDA5NCwgIDAuMDExMywgIDAuMDEwNSwgIDAuMDEzNywgIDAuMDQzOCwgIDAuMDI2MiwgLTAuMDA3OCwgLTAuMDE4NSwKKy0wLjAyMTUsIC0wLjA0MDcsIC0wLjA0MzUsIC0wLjAyMDgsIC0wLjAwMDQsIC0wLjAxNDQsIC0wLjAyMDUsIC0wLjAyNDgsCistMC4wMTU5LCAtMC4wMDY5LCAtMC4wMTUzLCAgMC4wMTMyLCAgMC4wMzU1LCAgMC4wMjk4LCAgMC4wMTIwLCAgMC4wMDcyLAorIDAuMDIzNiwgIDAuMDUyNiwgIDAuMDQ3OSwgIDAuMDIzMywgLTAuMDEzMywgLTAuMDI4MywgLTAuMDQ2OCwgLTAuMDU0OSwKKy0wLjAzNzAsICAwLjAwMzIsICAwLjAwNTYsICAwLjAwMjMsICAwLjAwNTAsICAwLjAwMjQsICAwLjAyNzksICAwLjAxMTYsCistMC4wMDQ1LCAtMC4wMDEyLCAgMC4wMTA3LCAgMC4wMTkwLCAgMC4wMjUzLCAgMC4wMTkxLCAgMC4wMDQzLCAgMC4wMTkzLAorLTAuMDM0OCwgLTAuMDI0NiwgIDAuMDEyMywgIDAuMDIxMCwgIDAuMDEzNSwgLTAuMDA5NiwgLTAuMDEwOSwgLTAuMDA3NiwKKy0wLjAxNTYsIC0wLjAyOTAsICAwLjAxNjAsICAwLjAxOTQsICAwLjAyMTksICAwLjAyNTksICAwLjAyNTAsICAwLjAxOTUsCisgMC40OTQ4LCAgMC40OTYxLCAgMC40OTQwLCAgMC40ODc4LCAgMC40ODQ5LCAgMC40NzI3LCAgMC40NTcxLCAgMC40NTUxLAorIDAuNDUzNCwgIDAuNDQ2OCwgIDAuNDQxMiwgIDAuNDM1NCwgIDAuNDI5OCwgIDAuNDI3MiwgIDAuNDQ5OCwgIDAuNDUwNiwKKyAwLjQ1NjAsICAwLjQ1OTIsICAwLjQ3NTgsICAwLjQ5NDEsICAwLjI0NzYsICAwLjE3NzEsICAwLjE5NzQsICAwLjE4ODEsCisgMC4xNjY3LCAgMC4xODI2LCAgMC4yMDY3LCAgMC4yMDMxLCAgMC4xNzM0LCAgMC4xNTM0LCAgMC4xNDE1LCAgMC4xNzYxLAorIDAuMTg5NywgIDAuMTc3MiwgIDAuMTY1MSwgIDAuMTI0NywgIDAuMTA0MSwgIDAuMTIzMSwgIDAuMTgwOSwgIDAuMjIzNAorICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0YWI3W11bMzVdID0geworICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsCisgICAgICAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwKKyAgICAgIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMSwKKyAgICAgIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLAorICAgICAgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDAsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDEsIDAsIDEsIDAsCisgICAgICAwLCAxLCAwLCAxLCAwLCAwLCAxLCAwLCAxLCAwLCAwLCAxLCAwLCAxLCAwLCAwLAorICAgICAgMSwgMCwgMSB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFiOFtdWzVdID0geworICAgIHsgMCwgMCwgMCwgMSwgMSB9LAorICAgIHsgMCwgMSwgMCwgMCwgMSB9LAorICAgIHsgMSwgMSwgMCwgMCwgMCB9LAorICAgIHsgMSwgMCwgMCwgMSwgMCB9LAorICAgIHsgMCwgMCwgMCwgMSwgMSB9LAorICAgIHsgMCwgMSwgMCwgMCwgMSB9LAorICAgIHsgMSwgMSwgMCwgMCwgMCB9LAorICAgIHsgMSwgMCwgMCwgMSwgMCB9LAorICAgIHsgMCwgMCwgMCwgMSwgMSB9LAorICAgIHsgMCwgMSwgMCwgMCwgMSB9LAorICAgIHsgMSwgMSwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMSwgMCwgMSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0YWI5W11bNDVdID0geworICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAxLAorICAgICAgMSwgMSwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFiMTBbXVsyNV0gPSB7CisgICAgeyAxLCAxLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAwLAorICAgICAgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMSwgMCB9LAorICAgIHsgMSwgMSwgMCwgMSwgMSwgMCwgMSwgMSwgMCwgMSwgMSwgMCwKKyAgICAgIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAgfSwKKyAgICB7IDEsIDEsIDEsIDAsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDAsCisgICAgICAwLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAxLCAwLCAwLCAwIH0sCisgICAgeyAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfSwKKyAgICB7IDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsCisgICAgICAwLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxIH0sCisgICAgeyAwLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAwLCAxLCAxLAorICAgICAgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMSB9LAorICAgIHsgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDEsIDAsIDEsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsCisgICAgICAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAwLCAxLCAwLCAxIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRhYjExW11bNTVdID0geworICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIH0sCisgICAgeyAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIH0sCisgICAgeyAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIH0sCisgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIH0sCisgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIH0sCisgICAgeyAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIH0sCisgICAgeyAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIH0sCisgICAgeyAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAxLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRhYjEyW11bMTVdID0geworICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCB9LAorICAgIHsgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCB9LAorICAgIHsgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgaW50IHNpemU7CisgICAgY29uc3QgdWludDhfdCAqdGFiOworfSB0YWJzW10gPSB7CisgICAgeyAgMCwgTlVMTCAgICAgICAgIH0sCisgICAgeyAgNSwgJnRhYjhbMF1bMF0gIH0sIHsgIDUsICZ0YWI4WzBdWzBdICB9LCB7IDE1LCAmdGFiMTJbMF1bMF0gfSwKKyAgICB7ICA1LCAmdGFiOFswXVswXSAgfSwgeyAyNSwgJnRhYjEwWzBdWzBdIH0sIHsgMTUsICZ0YWIxMlswXVswXSB9LAorICAgIHsgMzUsICZ0YWI3WzBdWzBdICB9LCB7ICA1LCAmdGFiOFswXVswXSAgfSwgeyA0NSwgJnRhYjlbMF1bMF0gIH0sCisgICAgeyAyNSwgJnRhYjEwWzBdWzBdIH0sIHsgNTUsICZ0YWIxMVswXVswXSB9LCB7IDE1LCAmdGFiMTJbMF1bMF0gfQorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVFdJTlZRX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdHdpbnZxZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy90d2ludnFkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2NlMDMxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdHdpbnZxZGVjLmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qCisgKiBUd2luVlEgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IFZpdG9yIFNlc3NhaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0d2ludnEuaCIKKyNpbmNsdWRlICJ0d2ludnFfZGF0YS5oIgorCitzdGF0aWMgY29uc3QgVHdpblZRTW9kZVRhYiBtb2RlXzA4XzA4ID0geworICAgIHsKKyAgICAgICAgeyA4LCBiYXJrX3RhYl9zMDhfNjQsICAxMCwgdGFiLmZjYjA4cywgMSwgNSwgdGFiLmNiMDgwOHMwLCB0YWIuY2IwODA4czEsIDE4IH0sCisgICAgICAgIHsgMiwgYmFya190YWJfbTA4XzI1NiwgMjAsIHRhYi5mY2IwOG0sIDIsIDUsIHRhYi5jYjA4MDhtMCwgdGFiLmNiMDgwOG0xLCAxNiB9LAorICAgICAgICB7IDEsIGJhcmtfdGFiX2wwOF81MTIsIDMwLCB0YWIuZmNiMDhsLCAzLCA2LCB0YWIuY2IwODA4bDAsIHRhYi5jYjA4MDhsMSwgMTcgfQorICAgIH0sCisgICAgNTEyLCAxMiwgdGFiLmxzcDA4LCAxLCA1LCAzLCAzLCB0YWIuc2hhcGUwOCwgOCwgMjgsIDIwLCA2LCA0MAorfTsKKworc3RhdGljIGNvbnN0IFR3aW5WUU1vZGVUYWIgbW9kZV8xMV8wOCA9IHsKKyAgICB7CisgICAgICAgIHsgOCwgYmFya190YWJfczExXzY0LCAgMTAsIHRhYi5mY2IxMXMsIDEsIDUsIHRhYi5jYjExMDhzMCwgdGFiLmNiMTEwOHMxLCAyOSB9LAorICAgICAgICB7IDIsIGJhcmtfdGFiX20xMV8yNTYsIDIwLCB0YWIuZmNiMTFtLCAyLCA1LCB0YWIuY2IxMTA4bTAsIHRhYi5jYjExMDhtMSwgMjQgfSwKKyAgICAgICAgeyAxLCBiYXJrX3RhYl9sMTFfNTEyLCAzMCwgdGFiLmZjYjExbCwgMywgNiwgdGFiLmNiMTEwOGwwLCB0YWIuY2IxMTA4bDEsIDI3IH0KKyAgICB9LAorICAgIDUxMiwgMTYsIHRhYi5sc3AxMSwgMSwgNiwgNCwgMywgdGFiLnNoYXBlMTEsIDksIDM2LCAzMCwgNywgOTAKK307CisKK3N0YXRpYyBjb25zdCBUd2luVlFNb2RlVGFiIG1vZGVfMTFfMTAgPSB7CisgICAgeworICAgICAgICB7IDgsIGJhcmtfdGFiX3MxMV82NCwgIDEwLCB0YWIuZmNiMTFzLCAxLCA1LCB0YWIuY2IxMTEwczAsIHRhYi5jYjExMTBzMSwgMjEgfSwKKyAgICAgICAgeyAyLCBiYXJrX3RhYl9tMTFfMjU2LCAyMCwgdGFiLmZjYjExbSwgMiwgNSwgdGFiLmNiMTExMG0wLCB0YWIuY2IxMTEwbTEsIDE4IH0sCisgICAgICAgIHsgMSwgYmFya190YWJfbDExXzUxMiwgMzAsIHRhYi5mY2IxMWwsIDMsIDYsIHRhYi5jYjExMTBsMCwgdGFiLmNiMTExMGwxLCAyMCB9CisgICAgfSwKKyAgICA1MTIsIDE2LCB0YWIubHNwMTEsIDEsIDYsIDQsIDMsIHRhYi5zaGFwZTExLCA5LCAzNiwgMzAsIDcsIDkwCit9OworCitzdGF0aWMgY29uc3QgVHdpblZRTW9kZVRhYiBtb2RlXzE2XzE2ID0geworICAgIHsKKyAgICAgICAgeyA4LCBiYXJrX3RhYl9zMTZfMTI4LCAgMTAsIHRhYi5mY2IxNnMsIDEsIDUsIHRhYi5jYjE2MTZzMCwgdGFiLmNiMTYxNnMxLCAxNiB9LAorICAgICAgICB7IDIsIGJhcmtfdGFiX20xNl81MTIsICAyMCwgdGFiLmZjYjE2bSwgMiwgNSwgdGFiLmNiMTYxNm0wLCB0YWIuY2IxNjE2bTEsIDE1IH0sCisgICAgICAgIHsgMSwgYmFya190YWJfbDE2XzEwMjQsIDMwLCB0YWIuZmNiMTZsLCAzLCA2LCB0YWIuY2IxNjE2bDAsIHRhYi5jYjE2MTZsMSwgMTYgfQorICAgIH0sCisgICAgMTAyNCwgMTYsIHRhYi5sc3AxNiwgMSwgNiwgNCwgMywgdGFiLnNoYXBlMTYsIDksIDU2LCA2MCwgNywgMTgwCit9OworCitzdGF0aWMgY29uc3QgVHdpblZRTW9kZVRhYiBtb2RlXzIyXzIwID0geworICAgIHsKKyAgICAgICAgeyA4LCBiYXJrX3RhYl9zMjJfMTI4LCAgMTAsIHRhYi5mY2IyMnNfMSwgMSwgNiwgdGFiLmNiMjIyMHMwLCB0YWIuY2IyMjIwczEsIDE4IH0sCisgICAgICAgIHsgMiwgYmFya190YWJfbTIyXzUxMiwgIDIwLCB0YWIuZmNiMjJtXzEsIDIsIDYsIHRhYi5jYjIyMjBtMCwgdGFiLmNiMjIyMG0xLCAxNyB9LAorICAgICAgICB7IDEsIGJhcmtfdGFiX2wyMl8xMDI0LCAzMiwgdGFiLmZjYjIybF8xLCA0LCA2LCB0YWIuY2IyMjIwbDAsIHRhYi5jYjIyMjBsMSwgMTggfQorICAgIH0sCisgICAgMTAyNCwgMTYsIHRhYi5sc3AyMl8xLCAxLCA2LCA0LCAzLCB0YWIuc2hhcGUyMl8xLCA5LCA1NiwgMzYsIDcsIDE0NAorfTsKKworc3RhdGljIGNvbnN0IFR3aW5WUU1vZGVUYWIgbW9kZV8yMl8yNCA9IHsKKyAgICB7CisgICAgICAgIHsgOCwgYmFya190YWJfczIyXzEyOCwgIDEwLCB0YWIuZmNiMjJzXzEsIDEsIDYsIHRhYi5jYjIyMjRzMCwgdGFiLmNiMjIyNHMxLCAxNSB9LAorICAgICAgICB7IDIsIGJhcmtfdGFiX20yMl81MTIsICAyMCwgdGFiLmZjYjIybV8xLCAyLCA2LCB0YWIuY2IyMjI0bTAsIHRhYi5jYjIyMjRtMSwgMTQgfSwKKyAgICAgICAgeyAxLCBiYXJrX3RhYl9sMjJfMTAyNCwgMzIsIHRhYi5mY2IyMmxfMSwgNCwgNiwgdGFiLmNiMjIyNGwwLCB0YWIuY2IyMjI0bDEsIDE1IH0KKyAgICB9LAorICAgIDEwMjQsIDE2LCB0YWIubHNwMjJfMSwgMSwgNiwgNCwgMywgdGFiLnNoYXBlMjJfMSwgOSwgNTYsIDM2LCA3LCAxNDQKK307CisKK3N0YXRpYyBjb25zdCBUd2luVlFNb2RlVGFiIG1vZGVfMjJfMzIgPSB7CisgICAgeworICAgICAgICB7IDQsIGJhcmtfdGFiX3MyMl8xMjgsIDEwLCB0YWIuZmNiMjJzXzIsIDEsIDYsIHRhYi5jYjIyMzJzMCwgdGFiLmNiMjIzMnMxLCAxMSB9LAorICAgICAgICB7IDIsIGJhcmtfdGFiX20yMl8yNTYsIDIwLCB0YWIuZmNiMjJtXzIsIDIsIDYsIHRhYi5jYjIyMzJtMCwgdGFiLmNiMjIzMm0xLCAxMSB9LAorICAgICAgICB7IDEsIGJhcmtfdGFiX2wyMl81MTIsIDMyLCB0YWIuZmNiMjJsXzIsIDQsIDYsIHRhYi5jYjIyMzJsMCwgdGFiLmNiMjIzMmwxLCAxMiB9CisgICAgfSwKKyAgICA1MTIsIDE2LCB0YWIubHNwMjJfMiwgMSwgNiwgNCwgNCwgdGFiLnNoYXBlMjJfMiwgOSwgNTYsIDM2LCA3LCA3MgorfTsKKworc3RhdGljIGNvbnN0IFR3aW5WUU1vZGVUYWIgbW9kZV80NF80MCA9IHsKKyAgICB7CisgICAgICAgIHsgMTYsIGJhcmtfdGFiX3M0NF8xMjgsICAxMCwgdGFiLmZjYjQ0cywgMSwgNiwgdGFiLmNiNDQ0MHMwLCB0YWIuY2I0NDQwczEsIDE4IH0sCisgICAgICAgIHsgNCwgIGJhcmtfdGFiX200NF81MTIsICAyMCwgdGFiLmZjYjQ0bSwgMiwgNiwgdGFiLmNiNDQ0MG0wLCB0YWIuY2I0NDQwbTEsIDE3IH0sCisgICAgICAgIHsgMSwgIGJhcmtfdGFiX2w0NF8yMDQ4LCA0MCwgdGFiLmZjYjQ0bCwgNCwgNiwgdGFiLmNiNDQ0MGwwLCB0YWIuY2I0NDQwbDEsIDE3IH0KKyAgICB9LAorICAgIDIwNDgsIDIwLCB0YWIubHNwNDQsIDEsIDYsIDQsIDQsIHRhYi5zaGFwZTQ0LCA5LCA4NCwgNTQsIDcsIDQzMgorfTsKKworc3RhdGljIGNvbnN0IFR3aW5WUU1vZGVUYWIgbW9kZV80NF80OCA9IHsKKyAgICB7CisgICAgICAgIHsgMTYsIGJhcmtfdGFiX3M0NF8xMjgsICAxMCwgdGFiLmZjYjQ0cywgMSwgNiwgdGFiLmNiNDQ0OHMwLCB0YWIuY2I0NDQ4czEsIDE1IH0sCisgICAgICAgIHsgNCwgIGJhcmtfdGFiX200NF81MTIsICAyMCwgdGFiLmZjYjQ0bSwgMiwgNiwgdGFiLmNiNDQ0OG0wLCB0YWIuY2I0NDQ4bTEsIDE0IH0sCisgICAgICAgIHsgMSwgIGJhcmtfdGFiX2w0NF8yMDQ4LCA0MCwgdGFiLmZjYjQ0bCwgNCwgNiwgdGFiLmNiNDQ0OGwwLCB0YWIuY2I0NDQ4bDEsIDE0IH0KKyAgICB9LAorICAgIDIwNDgsIDIwLCB0YWIubHNwNDQsIDEsIDYsIDQsIDQsIHRhYi5zaGFwZTQ0LCA5LCA4NCwgNTQsIDcsIDQzMgorfTsKKworLyoqCisgKiBFdmFsdWF0ZSBhICogYiAvIDQwMCByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIFdoZW4sIGZvciBleGFtcGxlLAorICogYSAqIGIgPT0gMjAwIGFuZCB0aGUgbmVhcmVzdCBpbnRlZ2VyIGlzIGlsbC1kZWZpbmVkLCB1c2UgYSB0YWJsZSB0byBlbXVsYXRlCisgKiB0aGUgZm9sbG93aW5nIGJyb2tlbiBmbG9hdC1iYXNlZCBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IHRoZSBiaW5hcnkgZGVjb2RlcjoKKyAqCisgKiBAY29kZQorICogc3RhdGljIGludCB2ZXJ5X2Jyb2tlbl9vcChpbnQgYSwgaW50IGIpCisgKiB7CisgKiAgICBzdGF0aWMgZmxvYXQgdGVzdDsgLy8gVWdoLCBmb3JjZSBnY2MgdG8gZG8gdGhlIGRpdmlzaW9uIGZpcnN0Li4uCisgKgorICogICAgdGVzdCA9IGEgLyA0MDAuMDsKKyAqICAgIHJldHVybiBiICogdGVzdCArIDAuNTsKKyAqIH0KKyAqIEBlbmRjb2RlCisgKgorICogQG5vdGUgaWYgdGhpcyBmdW5jdGlvbiBpcyByZXBsYWNlZCBieSBqdXN0IFJPVU5ERURfRElWKGEgKiBiLCA0MDAuMCksIHRoZQorICogc3RkZGV2IGJldHdlZW4gdGhlIG9yaWdpbmFsIGZpbGUgKGJlZm9yZSBlbmNvZGluZyB3aXRoIFlhbWFoYSBlbmNvZGVyKSBhbmQKKyAqIHRoZSBkZWNvZGVkIG91dHB1dCBpbmNyZWFzZXMsIHdoaWNoIGxlYWRzIG9uZSB0byBiZWxpZXZlIHRoYXQgdGhlIGVuY29kZXIKKyAqIGV4cGVjdHMgZXhhY3RseSB0aGlzIGJyb2tlbiBjYWxjdWxhdGlvbi4KKyAqLworc3RhdGljIGludCB2ZXJ5X2Jyb2tlbl9vcChpbnQgYSwgaW50IGIpCit7CisgICAgaW50IHggPSBhICogYiArIDIwMDsKKyAgICBpbnQgc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpydGFiOworCisgICAgaWYgKHggJSA0MDAgfHwgYiAlIDUpCisgICAgICAgIHJldHVybiB4IC8gNDAwOworCisgICAgeCAvPSA0MDA7CisKKyAgICBzaXplID0gdGFic1tiIC8gNV0uc2l6ZTsKKyAgICBydGFiID0gdGFic1tiIC8gNV0udGFiOworICAgIHJldHVybiB4IC0gcnRhYltzaXplICogYXZfbG9nMigyICogKHggLSAxKSAvIHNpemUpICsgKHggLSAxKSAlIHNpemVdOworfQorCisvKioKKyAqIFN1bSB0byBkYXRhIGEgcGVyaW9kaWMgcGVhayBvZiBhIGdpdmVuIHBlcmlvZCwgd2lkdGggYW5kIHNoYXBlLgorICoKKyAqIEBwYXJhbSBwZXJpb2QgdGhlIHBlcmlvZCBvZiB0aGUgcGVhayBkaXZpc2VkIGJ5IDQwMC4wCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9wZWFrKGludCBwZXJpb2QsIGludCB3aWR0aCwgY29uc3QgZmxvYXQgKnNoYXBlLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcHBjX2dhaW4sIGZsb2F0ICpzcGVlY2gsIGludCBsZW4pCit7CisgICAgaW50IGksIGo7CisKKyAgICBjb25zdCBmbG9hdCAqc2hhcGVfZW5kID0gc2hhcGUgKyBsZW47CisgICAgaW50IGNlbnRlcjsKKworICAgIC8vIEZpcnN0IHBlYWsgY2VudGVyZWQgYXJvdW5kIHplcm8KKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggLyAyOyBpKyspCisgICAgICAgIHNwZWVjaFtpXSArPSBwcGNfZ2FpbiAqICpzaGFwZSsrOworCisgICAgZm9yIChpID0gMTsgaSA8IFJPVU5ERURfRElWKGxlbiwgd2lkdGgpOyBpKyspIHsKKyAgICAgICAgY2VudGVyID0gdmVyeV9icm9rZW5fb3AocGVyaW9kLCBpKTsKKyAgICAgICAgZm9yIChqID0gLXdpZHRoIC8gMjsgaiA8ICh3aWR0aCArIDEpIC8gMjsgaisrKQorICAgICAgICAgICAgc3BlZWNoW2ogKyBjZW50ZXJdICs9IHBwY19nYWluICogKnNoYXBlKys7CisgICAgfQorCisgICAgLy8gRm9yIHRoZSBsYXN0IGJsb2NrLCBiZSBjYXJlZnVsIG5vdCB0byBnbyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyCisgICAgY2VudGVyID0gdmVyeV9icm9rZW5fb3AocGVyaW9kLCBpKTsKKyAgICBmb3IgKGogPSAtd2lkdGggLyAyOyBqIDwgKHdpZHRoICsgMSkgLyAyICYmIHNoYXBlIDwgc2hhcGVfZW5kOyBqKyspCisgICAgICAgIHNwZWVjaFtqICsgY2VudGVyXSArPSBwcGNfZ2FpbiAqICpzaGFwZSsrOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfcHBjKFR3aW5WUUNvbnRleHQgKnRjdHgsIGludCBwZXJpb2RfY29lZiwgaW50IGdfY29lZiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNoYXBlLCBmbG9hdCAqc3BlZWNoKQoreworICAgIGNvbnN0IFR3aW5WUU1vZGVUYWIgKm10YWIgPSB0Y3R4LT5tdGFiOworICAgIGludCBpc2FtcGYgPSB0Y3R4LT5hdmN0eC0+c2FtcGxlX3JhdGUgLyAgMTAwMDsKKyAgICBpbnQgaWJwcyAgID0gdGN0eC0+YXZjdHgtPmJpdF9yYXRlICAgIC8gKDEwMDAgKiB0Y3R4LT5hdmN0eC0+Y2hhbm5lbHMpOworICAgIGludCBtaW5fcGVyaW9kICAgPSBST1VOREVEX0RJVig0MCAqIDIgKiBtdGFiLT5zaXplLCBpc2FtcGYpOworICAgIGludCBtYXhfcGVyaW9kICAgPSBST1VOREVEX0RJVig0MCAqIDIgKiBtdGFiLT5zaXplICogNiwgaXNhbXBmKTsKKyAgICBpbnQgcGVyaW9kX3JhbmdlID0gbWF4X3BlcmlvZCAtIG1pbl9wZXJpb2Q7CisgICAgZmxvYXQgcGdhaW5fc3RlcCA9IDI1MDAwLjAgLyAoKDEgPDwgbXRhYi0+cGdhaW5fYml0KSAtIDEpOworICAgIGZsb2F0IHBwY19nYWluICAgPSAxLjAgLyA4MTkyICoKKyAgICAgICAgICAgICAgICAgICAgICAgdHdpbnZxX211bGF3aW52KHBnYWluX3N0ZXAgKiBnX2NvZWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnYWluX3N0ZXAgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUwMDAuMCwgVFdJTlZRX1BHQUlOX01VKTsKKworICAgIC8vIFRoaXMgaXMgYWN0dWFsbHkgdGhlIHBlcmlvZCBtdWx0aXBsaWVkIGJ5IDQwMC4gSXQgaXMganVzdCBsaW5lYXJseSBjb2RlZAorICAgIC8vIGJldHdlZW4gaXRzIG1heGltdW0gYW5kIG1pbmltdW0gdmFsdWUuCisgICAgaW50IHBlcmlvZCA9IG1pbl9wZXJpb2QgKworICAgICAgICAgICAgICAgICBST1VOREVEX0RJVihwZXJpb2RfY29lZiAqIHBlcmlvZF9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgbXRhYi0+cHBjX3BlcmlvZF9iaXQpIC0gMSk7CisgICAgaW50IHdpZHRoOworCisgICAgaWYgKGlzYW1wZiA9PSAyMiAmJiBpYnBzID09IDMyKSB7CisgICAgICAgIC8vIEZvciBzb21lIHVua25vd24gcmVhc29uLCBOVFQgZGVjaWRlZCB0byBjb2RlIHRoaXMgY2FzZSBkaWZmZXJlbnRseS4uLgorICAgICAgICB3aWR0aCA9IFJPVU5ERURfRElWKChwZXJpb2QgKyA4MDApICogbXRhYi0+cGVha19wZXIyd2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMCAqIG10YWItPnNpemUpOworICAgIH0gZWxzZQorICAgICAgICB3aWR0aCA9IHBlcmlvZCAqIG10YWItPnBlYWtfcGVyMndpZCAvICg0MDAgKiBtdGFiLT5zaXplKTsKKworICAgIGFkZF9wZWFrKHBlcmlvZCwgd2lkdGgsIHNoYXBlLCBwcGNfZ2Fpbiwgc3BlZWNoLCBtdGFiLT5wcGNfc2hhcGVfbGVuKTsKK30KKworc3RhdGljIHZvaWQgZGVjX2JhcmtfZW52KFR3aW5WUUNvbnRleHQgKnRjdHgsIGNvbnN0IHVpbnQ4X3QgKmluLCBpbnQgdXNlX2hpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoLCBmbG9hdCAqb3V0LCBmbG9hdCBnYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gVHdpblZRRnJhbWVUeXBlIGZ0eXBlKQoreworICAgIGNvbnN0IFR3aW5WUU1vZGVUYWIgKm10YWIgPSB0Y3R4LT5tdGFiOworICAgIGludCBpLCBqOworICAgIGZsb2F0ICpoaXN0ICAgICA9IHRjdHgtPmJhcmtfaGlzdFtmdHlwZV1bY2hdOworICAgIGZsb2F0IHZhbCAgICAgICA9ICgoY29uc3QgZmxvYXQgW10pIHsgMC40LCAwLjM1LCAwLjI4IH0pW2Z0eXBlXTsKKyAgICBpbnQgYmFya19uX2NvZWYgPSBtdGFiLT5mbW9kZVtmdHlwZV0uYmFya19uX2NvZWY7CisgICAgaW50IGZ3X2NiX2xlbiAgID0gbXRhYi0+Zm1vZGVbZnR5cGVdLmJhcmtfZW52X3NpemUgLyBiYXJrX25fY29lZjsKKyAgICBpbnQgaWR4ICAgICAgICAgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGZ3X2NiX2xlbjsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmFya19uX2NvZWY7IGorKywgaWR4KyspIHsKKyAgICAgICAgICAgIGZsb2F0IHRtcDIgPSBtdGFiLT5mbW9kZVtmdHlwZV0uYmFya19jYltmd19jYl9sZW4gKiBpbltqXSArIGldICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMS4wIC8gNDA5Nik7CisgICAgICAgICAgICBmbG9hdCBzdCAgID0gdXNlX2hpc3QgPyAoMS4wIC0gdmFsKSAqIHRtcDIgKyB2YWwgKiBoaXN0W2lkeF0gKyAxLjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRtcDIgKyAxLjA7CisKKyAgICAgICAgICAgIGhpc3RbaWR4XSA9IHRtcDI7CisgICAgICAgICAgICBpZiAoc3QgPCAtMS4wKQorICAgICAgICAgICAgICAgIHN0ID0gMS4wOworCisgICAgICAgICAgICB0d2ludnFfbWVtc2V0X2Zsb2F0KG91dCwgc3QgKiBnYWluLCBtdGFiLT5mbW9kZVtmdHlwZV0uYmFya190YWJbaWR4XSk7CisgICAgICAgICAgICBvdXQgKz0gbXRhYi0+Zm1vZGVbZnR5cGVdLmJhcmtfdGFiW2lkeF07CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVhZF9jYl9kYXRhKFR3aW5WUUNvbnRleHQgKnRjdHgsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgZW51bSBUd2luVlFGcmFtZVR5cGUgZnR5cGUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGN0eC0+bl9kaXZbZnR5cGVdOyBpKyspIHsKKyAgICAgICAgaW50IGJzX3NlY29uZF9wYXJ0ID0gKGkgPj0gdGN0eC0+Yml0c19tYWluX3NwZWNfY2hhbmdlW2Z0eXBlXSk7CisKKyAgICAgICAgKmRzdCsrID0gZ2V0X2JpdHMoZ2IsIHRjdHgtPmJpdHNfbWFpbl9zcGVjWzBdW2Z0eXBlXVtic19zZWNvbmRfcGFydF0pOworICAgICAgICAqZHN0KysgPSBnZXRfYml0cyhnYiwgdGN0eC0+Yml0c19tYWluX3NwZWNbMV1bZnR5cGVdW2JzX3NlY29uZF9wYXJ0XSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHR3aW52cV9yZWFkX2JpdHN0cmVhbShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFR3aW5WUUNvbnRleHQgKnRjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBUd2luVlFGcmFtZURhdGEgICAgICpiaXRzID0gJnRjdHgtPmJpdHNbMF07CisgICAgY29uc3QgVHdpblZRTW9kZVRhYiAqbXRhYiA9IHRjdHgtPm10YWI7CisgICAgaW50IGNoYW5uZWxzICAgICAgICAgICAgICA9IHRjdHgtPmF2Y3R4LT5jaGFubmVsczsKKyAgICBpbnQgc3ViOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGksIGosIGs7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCBidWZfc2l6ZSAqIDgpOworICAgIHNraXBfYml0cygmZ2IsIGdldF9iaXRzKCZnYiwgOCkpOworCisgICAgYml0cy0+d2luZG93X3R5cGUgPSBnZXRfYml0cygmZ2IsIFRXSU5WUV9XSU5ET1dfVFlQRV9CSVRTKTsKKworICAgIGlmIChiaXRzLT53aW5kb3dfdHlwZSA+IDgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHdpbmRvdyB0eXBlLCBicm9rZW4gc2FtcGxlP1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGJpdHMtPmZ0eXBlID0gZmZfdHdpbnZxX3d0eXBlX3RvX2Z0eXBlX3RhYmxlW3RjdHgtPmJpdHNbMF0ud2luZG93X3R5cGVdOworCisgICAgc3ViID0gbXRhYi0+Zm1vZGVbYml0cy0+ZnR5cGVdLnN1YjsKKworICAgIHJlYWRfY2JfZGF0YSh0Y3R4LCAmZ2IsIGJpdHMtPm1haW5fY29lZmZzLCBiaXRzLT5mdHlwZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHN1YjsgaisrKQorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG10YWItPmZtb2RlW2JpdHMtPmZ0eXBlXS5iYXJrX25fY29lZjsgaysrKQorICAgICAgICAgICAgICAgIGJpdHMtPmJhcmsxW2ldW2pdW2tdID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHMoJmdiLCBtdGFiLT5mbW9kZVtiaXRzLT5mdHlwZV0uYmFya19uX2JpdCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHN1YjsgaisrKQorICAgICAgICAgICAgYml0cy0+YmFya191c2VfaGlzdFtpXVtqXSA9IGdldF9iaXRzMSgmZ2IpOworCisgICAgaWYgKGJpdHMtPmZ0eXBlID09IFRXSU5WUV9GVF9MT05HKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgICAgICAgYml0cy0+Z2Fpbl9iaXRzW2ldID0gZ2V0X2JpdHMoJmdiLCBUV0lOVlFfR0FJTl9CSVRTKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgYml0cy0+Z2Fpbl9iaXRzW2ldID0gZ2V0X2JpdHMoJmdiLCBUV0lOVlFfR0FJTl9CSVRTKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWI7IGorKykKKyAgICAgICAgICAgICAgICBiaXRzLT5zdWJfZ2Fpbl9iaXRzW2kgKiBzdWIgKyBqXSA9IGdldF9iaXRzKCZnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUV0lOVlFfU1VCX0dBSU5fQklUUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgICAgICBiaXRzLT5scGNfaGlzdF9pZHhbaV0gPSBnZXRfYml0cygmZ2IsIG10YWItPmxzcF9iaXQwKTsKKyAgICAgICAgYml0cy0+bHBjX2lkeDFbaV0gICAgID0gZ2V0X2JpdHMoJmdiLCBtdGFiLT5sc3BfYml0MSk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG10YWItPmxzcF9zcGxpdDsgaisrKQorICAgICAgICAgICAgYml0cy0+bHBjX2lkeDJbaV1bal0gPSBnZXRfYml0cygmZ2IsIG10YWItPmxzcF9iaXQyKTsKKyAgICB9CisKKyAgICBpZiAoYml0cy0+ZnR5cGUgPT0gVFdJTlZRX0ZUX0xPTkcpIHsKKyAgICAgICAgcmVhZF9jYl9kYXRhKHRjdHgsICZnYiwgYml0cy0+cHBjX2NvZWZmcywgMyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBiaXRzLT5wX2NvZWZbaV0gPSBnZXRfYml0cygmZ2IsIG10YWItPnBwY19wZXJpb2RfYml0KTsKKyAgICAgICAgICAgIGJpdHMtPmdfY29lZltpXSA9IGdldF9iaXRzKCZnYiwgbXRhYi0+cGdhaW5fYml0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoZ2V0X2JpdHNfY291bnQoJmdiKSArIDcpIC8gODsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHR3aW52cV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGlzYW1wZiwgaWJwczsKKyAgICBUd2luVlFDb250ZXh0ICp0Y3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSB8fCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCAxMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3Npbmcgb3IgaW5jb21wbGV0ZSBleHRyYWRhdGFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYXZjdHgtPmNoYW5uZWxzID0gQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhKSAgICAgKyAxOworICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDQpICogMTAwMDsKKyAgICBpc2FtcGYgICAgICAgICAgPSBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGEgKyA4KTsKKworICAgIGlmIChpc2FtcGYgPCA4IHx8IGlzYW1wZiA+IDQ0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgc3dpdGNoIChpc2FtcGYpIHsKKyAgICBjYXNlIDQ0OgorICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSA0NDEwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjoKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gMjIwNTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6CisgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IDExMDI1OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBpc2FtcGYgKiAxMDAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDw9IDAgfHwgYXZjdHgtPmNoYW5uZWxzID4gVFdJTlZRX0NIQU5ORUxTX01BWCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVsczogJWlcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGF2Y3R4LT5jaGFubmVscyA9PSAxID8gQVZfQ0hfTEFZT1VUX01PTk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX0NIX0xBWU9VVF9TVEVSRU87CisKKyAgICBpYnBzID0gYXZjdHgtPmJpdF9yYXRlIC8gKDEwMDAgKiBhdmN0eC0+Y2hhbm5lbHMpOworICAgIGlmIChpYnBzIDwgOCB8fCBpYnBzID4gNDgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCYWQgYml0cmF0ZSBwZXIgY2hhbm5lbCB2YWx1ZSAlZFxuIiwgaWJwcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHN3aXRjaCAoKGlzYW1wZiA8PCA4KSArIGlicHMpIHsKKyAgICBjYXNlICg4IDw8IDgpICsgODoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZtb2RlXzA4XzA4OworICAgICAgICBicmVhazsKKyAgICBjYXNlICgxMSA8PCA4KSArIDg6CisgICAgICAgIHRjdHgtPm10YWIgPSAmbW9kZV8xMV8wODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAoMTEgPDwgOCkgKyAxMDoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZtb2RlXzExXzEwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICgxNiA8PCA4KSArIDE2OgorICAgICAgICB0Y3R4LT5tdGFiID0gJm1vZGVfMTZfMTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgKDIyIDw8IDgpICsgMjA6CisgICAgICAgIHRjdHgtPm10YWIgPSAmbW9kZV8yMl8yMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAoMjIgPDwgOCkgKyAyNDoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZtb2RlXzIyXzI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlICgyMiA8PCA4KSArIDMyOgorICAgICAgICB0Y3R4LT5tdGFiID0gJm1vZGVfMjJfMzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgKDQ0IDw8IDgpICsgNDA6CisgICAgICAgIHRjdHgtPm10YWIgPSAmbW9kZV80NF80MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAoNDQgPDwgOCkgKyA0ODoKKyAgICAgICAgdGN0eC0+bXRhYiA9ICZtb2RlXzQ0XzQ4OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUaGlzIHZlcnNpb24gZG9lcyBub3Qgc3VwcG9ydCAlZCBrSHogLSAlZCBrYml0L3MvY2ggbW9kZS5cbiIsCisgICAgICAgICAgICAgICBpc2FtcGYsIGlzYW1wZik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB0Y3R4LT5jb2RlYyAgICAgICAgICA9IFRXSU5WUV9DT0RFQ19WUUY7CisgICAgdGN0eC0+cmVhZF9iaXRzdHJlYW0gPSB0d2ludnFfcmVhZF9iaXRzdHJlYW07CisgICAgdGN0eC0+ZGVjX2JhcmtfZW52ICAgPSBkZWNfYmFya19lbnY7CisgICAgdGN0eC0+ZGVjb2RlX3BwYyAgICAgPSBkZWNvZGVfcHBjOworICAgIHRjdHgtPmZyYW1lX3NpemUgICAgID0gYXZjdHgtPmJpdF9yYXRlICogdGN0eC0+bXRhYi0+c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gYXZjdHgtPnNhbXBsZV9yYXRlICsgODsKKyAgICB0Y3R4LT5pc182a2JwcyAgICAgICA9IDA7CisgICAgaWYgKGF2Y3R4LT5ibG9ja19hbGlnbiAmJiBhdmN0eC0+YmxvY2tfYWxpZ24gKiA4IC8gdGN0eC0+ZnJhbWVfc2l6ZSA+IDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVlFGIFR3aW5WUSBzaG91bGQgaGF2ZSBvbmx5IG9uZSBmcmFtZSBwZXIgcGFja2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIGZmX3R3aW52cV9kZWNvZGVfaW5pdChhdmN0eCk7Cit9CisKK0FWQ29kZWMgZmZfdHdpbnZxX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInR3aW52cSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZRRiBUd2luVlEiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVFdJTlZRLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUd2luVlFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB0d2ludnFfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfdHdpbnZxX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBmZl90d2ludnFfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy90eGQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3R4ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMWEwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy90eGQuYwpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIFJlbmRlcndhcmUgVGVYdHVyZSBEaWN0aW9uYXJ5ICgudHhkKSBpbWFnZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSXZvIHZhbiBQb29ydGVuCisgKgorICogU2VlIGFsc286IGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPVRYRAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzM3RjLmgiCisKK3N0YXRpYyBpbnQgdHhkX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkgeworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIEFWRnJhbWUgKiBjb25zdCBwID0gZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbiwgdywgaCwgZDNkX2Zvcm1hdCwgZGVwdGgsIHN0cmlkZSwgZmxhZ3M7CisgICAgdW5zaWduZWQgaW50IHksIHY7CisgICAgdWludDhfdCAqcHRyOworICAgIHVpbnQzMl90ICpwYWw7CisgICAgaW50IHJldDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIHZlcnNpb24gICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDcyKTsKKyAgICBkM2RfZm9ybWF0ICAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2IpOworICAgIHcgICAgICAgICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnYik7CisgICAgaCAgICAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKTsKKyAgICBkZXB0aCAgICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAyKTsKKyAgICBmbGFncyAgICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworCisgICAgaWYgKHZlcnNpb24gPCA4IHx8IHZlcnNpb24gPiA5KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidGV4dHVyZSBkYXRhIHZlcnNpb24gJWkgaXMgdW5zdXBwb3J0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKGRlcHRoID09IDgpIHsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNiB8fCBkZXB0aCA9PSAzMikgeworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMzI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkZXB0aCBvZiAlaSBpcyB1bnN1cHBvcnRlZFxuIiwgZGVwdGgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgdywgaCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcCwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHAtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgcHRyICAgID0gcC0+ZGF0YVswXTsKKyAgICBzdHJpZGUgPSBwLT5saW5lc2l6ZVswXTsKKworICAgIGlmIChkZXB0aCA9PSA4KSB7CisgICAgICAgIHBhbCA9ICh1aW50MzJfdCAqKSBwLT5kYXRhWzFdOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMjU2OyB5KyspIHsKKyAgICAgICAgICAgIHYgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgICAgICAgICAgcGFsW3ldID0gKHYgPj4gOCkgKyAodiA8PCAyNCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCB3ICogaCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgNCk7CisgICAgICAgIGZvciAoeT0wOyB5PGg7IHkrKykgeworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmZ2IsIHB0ciwgdyk7CisgICAgICAgICAgICBwdHIgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgeworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgNCk7CisgICAgICAgIHN3aXRjaCAoZDNkX2Zvcm1hdCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBpZiAoIShmbGFncyAmIDEpKQorICAgICAgICAgICAgICAgIGdvdG8gdW5zdXBwb3J0ZWQ7CisgICAgICAgIGNhc2UgRkZfUzNUQ19EWFQxOgorICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCAody80KSAqIChoLzQpICogOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGZmX2RlY29kZV9keHQxKCZnYiwgcHRyLCB3LCBoLCBzdHJpZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkZfUzNUQ19EWFQzOgorICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCAody80KSAqIChoLzQpICogMTYpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBmZl9kZWNvZGVfZHh0MygmZ2IsIHB0ciwgdywgaCwgc3RyaWRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byB1bnN1cHBvcnRlZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMzIpIHsKKyAgICAgICAgc3dpdGNoIChkM2RfZm9ybWF0KSB7CisgICAgICAgIGNhc2UgMHgxNToKKyAgICAgICAgY2FzZSAweDE2OgorICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCBoICogdyAqIDQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBmb3IgKHk9MDsgeTxoOyB5KyspIHsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnYiwgcHRyLCB3ICogNCk7CisgICAgICAgICAgICAgICAgcHRyICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byB1bnN1cHBvcnRlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworCit1bnN1cHBvcnRlZDoKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGQzZCBmb3JtYXQgKCUwOHgpXG4iLCBkM2RfZm9ybWF0KTsKKyAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7Cit9CisKK0FWQ29kZWMgZmZfdHhkX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInR4ZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlbmRlcndhcmUgVFhEIChUZVh0dXJlIERpY3Rpb25hcnkpIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1RYRCwKKyAgICAuZGVjb2RlICAgICAgICAgPSB0eGRfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdWx0aS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdWx0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzYyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy91bHRpLmMKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBJQk0gVWx0aW1vdGlvbiBWaWRlbyBEZWNvZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBJQk0gVWx0aW1vdGlvbiBWaWRlbyBEZWNvZGVyLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAidWx0aV9jYi5oIgorCit0eXBlZGVmIHN0cnVjdCBVbHRpbW90aW9uRGVjb2RlQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGludCB3aWR0aCwgaGVpZ2h0LCBibG9ja3M7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgY29uc3QgdWludDhfdCAqdWx0aV9jb2RlYm9vazsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKK30gVWx0aW1vdGlvbkRlY29kZUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCB1bHRpX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBVbHRpbW90aW9uRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIHMtPndpZHRoID0gYXZjdHgtPndpZHRoOworICAgIHMtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgcy0+YmxvY2tzID0gKHMtPndpZHRoIC8gOCkgKiAocy0+aGVpZ2h0IC8gOCk7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQxMFA7CisgICAgcy0+dWx0aV9jb2RlYm9vayA9IHVsdGlfY29kZWJvb2s7CisKKyAgICBzLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdWx0aV9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCl7CisgICAgVWx0aW1vdGlvbkRlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgYmxvY2tfY29vcmRzWzhdID0gLy8gNHg0IGJsb2NrIGNvb3JkcyBpbiA4eDggc3VwZXJibG9jaworICAgIHsgMCwgMCwgMCwgNCwgNCwgNCwgNCwgMH07CisKK3N0YXRpYyBjb25zdCBpbnQgYW5nbGVfYnlfaW5kZXhbNF0gPSB7IDAsIDIsIDYsIDEyfTsKKworLyogTG9va3VwIHRhYmxlcyBmb3IgbHVtYSBhbmQgY2hyb21hIC0gdXNlZCBieSB1bHRpX2NvbnZlcnRfeXV2KCkgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHVsdGlfbHVtYXNbNjRdID0KKyAgICB7IDB4MTAsIDB4MTMsIDB4MTcsIDB4MUEsIDB4MUUsIDB4MjEsIDB4MjUsIDB4MjgsCisgICAgICAweDJDLCAweDJGLCAweDMzLCAweDM2LCAweDNBLCAweDNELCAweDQxLCAweDQ0LAorICAgICAgMHg0OCwgMHg0QiwgMHg0RiwgMHg1MiwgMHg1NiwgMHg1OSwgMHg1QywgMHg2MCwKKyAgICAgIDB4NjMsIDB4NjcsIDB4NkEsIDB4NkUsIDB4NzEsIDB4NzUsIDB4NzgsIDB4N0MsCisgICAgICAweDdGLCAweDgzLCAweDg2LCAweDhBLCAweDhELCAweDkxLCAweDk0LCAweDk4LAorICAgICAgMHg5QiwgMHg5RiwgMHhBMiwgMHhBNSwgMHhBOSwgMHhBQywgMHhCMCwgMHhCMywKKyAgICAgIDB4QjcsIDB4QkEsIDB4QkUsIDB4QzEsIDB4QzUsIDB4QzgsIDB4Q0MsIDB4Q0YsCisgICAgICAweEQzLCAweEQ2LCAweERBLCAweERELCAweEUxLCAweEU0LCAweEU4LCAweEVCfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdWx0aV9jaHJvbWFzWzE2XSA9CisgICAgeyAweDYwLCAweDY3LCAweDZELCAweDczLCAweDdBLCAweDgwLCAweDg2LCAweDhELAorICAgICAgMHg5MywgMHg5OSwgMHhBMCwgMHhBNiwgMHhBQywgMHhCMywgMHhCOSwgMHhDMH07CisKKy8qIGNvbnZlcnQgVWx0aW1vdGlvbiBZVVYgYmxvY2sgKHNpeHRlZW4gNi1iaXQgWSBzYW1wbGVzIGFuZAorIHR3byA0LWJpdCBjaHJvbWEgc2FtcGxlcykgaW50byBzdGFuZGFyZCBZVVYgYW5kIHB1dCBpdCBpbnRvIGZyYW1lICovCitzdGF0aWMgdm9pZCB1bHRpX2NvbnZlcnRfeXV2KEFWRnJhbWUgKmZyYW1lLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmx1bWEsaW50IGNocm9tYSkKK3sKKyAgICB1aW50OF90ICp5X3BsYW5lLCAqY3JfcGxhbmUsICpjYl9wbGFuZTsKKyAgICBpbnQgaTsKKworICAgIHlfcGxhbmUgPSBmcmFtZS0+ZGF0YVswXSArIHggKyB5ICogZnJhbWUtPmxpbmVzaXplWzBdOworICAgIGNyX3BsYW5lID0gZnJhbWUtPmRhdGFbMV0gKyAoeCAvIDQpICsgKHkgLyA0KSAqIGZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICBjYl9wbGFuZSA9IGZyYW1lLT5kYXRhWzJdICsgKHggLyA0KSArICh5IC8gNCkgKiBmcmFtZS0+bGluZXNpemVbMl07CisKKyAgICBjcl9wbGFuZVswXSA9IHVsdGlfY2hyb21hc1tjaHJvbWEgPj4gNF07CisKKyAgICBjYl9wbGFuZVswXSA9IHVsdGlfY2hyb21hc1tjaHJvbWEgJiAweEZdOworCisKKyAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKXsKKyAgICAgICAgeV9wbGFuZVtpICYgM10gPSB1bHRpX2x1bWFzW2x1bWFbaV1dOworICAgICAgICBpZigoaSAmIDMpID09IDMpIHsgLy9uZXh0IHJvdworICAgICAgICAgICAgeV9wbGFuZSArPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIGdlbmVyYXRlIGJsb2NrIGxpa2UgaW4gTVMgVmlkZW8xICovCitzdGF0aWMgdm9pZCB1bHRpX3BhdHRlcm4oQVZGcmFtZSAqZnJhbWUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZjAsIGludCBmMSwgaW50IFkwLCBpbnQgWTEsIGludCBjaHJvbWEpCit7CisgICAgdWludDhfdCBMdW1hWzE2XTsKKyAgICBpbnQgbWFzaywgaTsKKyAgICBmb3IobWFzayA9IDB4ODAsIGkgPSAwOyBtYXNrOyBtYXNrID4+PSAxLCBpKyspIHsKKyAgICAgICAgaWYoZjAgJiBtYXNrKQorICAgICAgICAgICAgTHVtYVtpXSA9IFkxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBMdW1hW2ldID0gWTA7CisgICAgfQorCisgICAgZm9yKG1hc2sgPSAweDgwLCBpID0gODsgbWFzazsgbWFzayA+Pj0gMSwgaSsrKSB7CisgICAgICAgIGlmKGYxICYgbWFzaykKKyAgICAgICAgICAgIEx1bWFbaV0gPSBZMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTHVtYVtpXSA9IFkwOworICAgIH0KKworICAgIHVsdGlfY29udmVydF95dXYoZnJhbWUsIHgsIHksIEx1bWEsIGNocm9tYSk7Cit9CisKKy8qIGZpbGwgYmxvY2sgd2l0aCBzb21lIGdyYWRpZW50ICovCitzdGF0aWMgdm9pZCB1bHRpX2dyYWQoQVZGcmFtZSAqZnJhbWUsIGludCB4LCBpbnQgeSwgdWludDhfdCAqWSwgaW50IGNocm9tYSwgaW50IGFuZ2xlKQoreworICAgIHVpbnQ4X3QgTHVtYVsxNl07CisgICAgaWYoYW5nbGUgJiA4KSB7IC8vcmV2ZXJzZSBvcmRlcgorICAgICAgICBpbnQgdDsKKyAgICAgICAgYW5nbGUgJj0gMHg3OworICAgICAgICB0ID0gWVswXTsKKyAgICAgICAgWVswXSA9IFlbM107CisgICAgICAgIFlbM10gPSB0OworICAgICAgICB0ID0gWVsxXTsKKyAgICAgICAgWVsxXSA9IFlbMl07CisgICAgICAgIFlbMl0gPSB0OworICAgIH0KKyAgICBzd2l0Y2goYW5nbGUpeworICAgIGNhc2UgMDoKKyAgICAgICAgTHVtYVswXSAgPSBZWzBdOyBMdW1hWzFdICA9IFlbMV07IEx1bWFbMl0gID0gWVsyXTsgTHVtYVszXSAgPSBZWzNdOworICAgICAgICBMdW1hWzRdICA9IFlbMF07IEx1bWFbNV0gID0gWVsxXTsgTHVtYVs2XSAgPSBZWzJdOyBMdW1hWzddICA9IFlbM107CisgICAgICAgIEx1bWFbOF0gID0gWVswXTsgTHVtYVs5XSAgPSBZWzFdOyBMdW1hWzEwXSA9IFlbMl07IEx1bWFbMTFdID0gWVszXTsKKyAgICAgICAgTHVtYVsxMl0gPSBZWzBdOyBMdW1hWzEzXSA9IFlbMV07IEx1bWFbMTRdID0gWVsyXTsgTHVtYVsxNV0gPSBZWzNdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIEx1bWFbMF0gID0gWVsxXTsgTHVtYVsxXSAgPSBZWzJdOyBMdW1hWzJdICA9IFlbM107IEx1bWFbM10gID0gWVszXTsKKyAgICAgICAgTHVtYVs0XSAgPSBZWzBdOyBMdW1hWzVdICA9IFlbMV07IEx1bWFbNl0gID0gWVsyXTsgTHVtYVs3XSAgPSBZWzNdOworICAgICAgICBMdW1hWzhdICA9IFlbMF07IEx1bWFbOV0gID0gWVsxXTsgTHVtYVsxMF0gPSBZWzJdOyBMdW1hWzExXSA9IFlbM107CisgICAgICAgIEx1bWFbMTJdID0gWVswXTsgTHVtYVsxM10gPSBZWzBdOyBMdW1hWzE0XSA9IFlbMV07IEx1bWFbMTVdID0gWVsyXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBMdW1hWzBdICA9IFlbMV07IEx1bWFbMV0gID0gWVsyXTsgTHVtYVsyXSAgPSBZWzNdOyBMdW1hWzNdICA9IFlbM107CisgICAgICAgIEx1bWFbNF0gID0gWVsxXTsgTHVtYVs1XSAgPSBZWzJdOyBMdW1hWzZdICA9IFlbMl07IEx1bWFbN10gID0gWVszXTsKKyAgICAgICAgTHVtYVs4XSAgPSBZWzBdOyBMdW1hWzldICA9IFlbMV07IEx1bWFbMTBdID0gWVsxXTsgTHVtYVsxMV0gPSBZWzJdOworICAgICAgICBMdW1hWzEyXSA9IFlbMF07IEx1bWFbMTNdID0gWVswXTsgTHVtYVsxNF0gPSBZWzFdOyBMdW1hWzE1XSA9IFlbMl07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgTHVtYVswXSAgPSBZWzJdOyBMdW1hWzFdICA9IFlbM107IEx1bWFbMl0gID0gWVszXTsgTHVtYVszXSAgPSBZWzNdOworICAgICAgICBMdW1hWzRdICA9IFlbMV07IEx1bWFbNV0gID0gWVsyXTsgTHVtYVs2XSAgPSBZWzJdOyBMdW1hWzddICA9IFlbM107CisgICAgICAgIEx1bWFbOF0gID0gWVswXTsgTHVtYVs5XSAgPSBZWzFdOyBMdW1hWzEwXSA9IFlbMV07IEx1bWFbMTFdID0gWVsyXTsKKyAgICAgICAgTHVtYVsxMl0gPSBZWzBdOyBMdW1hWzEzXSA9IFlbMF07IEx1bWFbMTRdID0gWVswXTsgTHVtYVsxNV0gPSBZWzFdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIEx1bWFbMF0gID0gWVszXTsgTHVtYVsxXSAgPSBZWzNdOyBMdW1hWzJdICA9IFlbM107IEx1bWFbM10gID0gWVszXTsKKyAgICAgICAgTHVtYVs0XSAgPSBZWzJdOyBMdW1hWzVdICA9IFlbMl07IEx1bWFbNl0gID0gWVsyXTsgTHVtYVs3XSAgPSBZWzJdOworICAgICAgICBMdW1hWzhdICA9IFlbMV07IEx1bWFbOV0gID0gWVsxXTsgTHVtYVsxMF0gPSBZWzFdOyBMdW1hWzExXSA9IFlbMV07CisgICAgICAgIEx1bWFbMTJdID0gWVswXTsgTHVtYVsxM10gPSBZWzBdOyBMdW1hWzE0XSA9IFlbMF07IEx1bWFbMTVdID0gWVswXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBMdW1hWzBdICA9IFlbM107IEx1bWFbMV0gID0gWVszXTsgTHVtYVsyXSAgPSBZWzNdOyBMdW1hWzNdICA9IFlbMl07CisgICAgICAgIEx1bWFbNF0gID0gWVszXTsgTHVtYVs1XSAgPSBZWzJdOyBMdW1hWzZdICA9IFlbMl07IEx1bWFbN10gID0gWVsxXTsKKyAgICAgICAgTHVtYVs4XSAgPSBZWzJdOyBMdW1hWzldICA9IFlbMV07IEx1bWFbMTBdID0gWVsxXTsgTHVtYVsxMV0gPSBZWzBdOworICAgICAgICBMdW1hWzEyXSA9IFlbMV07IEx1bWFbMTNdID0gWVswXTsgTHVtYVsxNF0gPSBZWzBdOyBMdW1hWzE1XSA9IFlbMF07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgTHVtYVswXSAgPSBZWzNdOyBMdW1hWzFdICA9IFlbM107IEx1bWFbMl0gID0gWVsyXTsgTHVtYVszXSAgPSBZWzJdOworICAgICAgICBMdW1hWzRdICA9IFlbM107IEx1bWFbNV0gID0gWVsyXTsgTHVtYVs2XSAgPSBZWzFdOyBMdW1hWzddICA9IFlbMV07CisgICAgICAgIEx1bWFbOF0gID0gWVsyXTsgTHVtYVs5XSAgPSBZWzJdOyBMdW1hWzEwXSA9IFlbMV07IEx1bWFbMTFdID0gWVswXTsKKyAgICAgICAgTHVtYVsxMl0gPSBZWzFdOyBMdW1hWzEzXSA9IFlbMV07IEx1bWFbMTRdID0gWVswXTsgTHVtYVsxNV0gPSBZWzBdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIEx1bWFbMF0gID0gWVszXTsgTHVtYVsxXSAgPSBZWzNdOyBMdW1hWzJdICA9IFlbMl07IEx1bWFbM10gID0gWVsxXTsKKyAgICAgICAgTHVtYVs0XSAgPSBZWzNdOyBMdW1hWzVdICA9IFlbMl07IEx1bWFbNl0gID0gWVsxXTsgTHVtYVs3XSAgPSBZWzBdOworICAgICAgICBMdW1hWzhdICA9IFlbM107IEx1bWFbOV0gID0gWVsyXTsgTHVtYVsxMF0gPSBZWzFdOyBMdW1hWzExXSA9IFlbMF07CisgICAgICAgIEx1bWFbMTJdID0gWVsyXTsgTHVtYVsxM10gPSBZWzFdOyBMdW1hWzE0XSA9IFlbMF07IEx1bWFbMTVdID0gWVswXTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTHVtYVswXSAgPSBZWzBdOyBMdW1hWzFdICA9IFlbMF07IEx1bWFbMl0gID0gWVsxXTsgTHVtYVszXSAgPSBZWzFdOworICAgICAgICBMdW1hWzRdICA9IFlbMF07IEx1bWFbNV0gID0gWVswXTsgTHVtYVs2XSAgPSBZWzFdOyBMdW1hWzddICA9IFlbMV07CisgICAgICAgIEx1bWFbOF0gID0gWVsyXTsgTHVtYVs5XSAgPSBZWzJdOyBMdW1hWzEwXSA9IFlbM107IEx1bWFbMTFdID0gWVszXTsKKyAgICAgICAgTHVtYVsxMl0gPSBZWzJdOyBMdW1hWzEzXSA9IFlbMl07IEx1bWFbMTRdID0gWVszXTsgTHVtYVsxNV0gPSBZWzNdOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB1bHRpX2NvbnZlcnRfeXV2KGZyYW1lLCB4LCB5LCBMdW1hLCBjaHJvbWEpOworfQorCitzdGF0aWMgaW50IHVsdGlfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBVbHRpbW90aW9uRGVjb2RlQ29udGV4dCAqcz1hdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBtb2RpZmllciA9IDA7CisgICAgaW50IHVuaXEgPSAwOworICAgIGludCBtb2RlID0gMDsKKyAgICBpbnQgYmxvY2tzID0gMDsKKyAgICBpbnQgZG9uZSA9IDA7CisgICAgaW50IHggPSAwLCB5ID0gMDsKKyAgICBpbnQgaSwgcmV0OworICAgIGludCBza2lwOworICAgIGludCB0bXA7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZzLT5nYiwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICB3aGlsZSghZG9uZSkgeworICAgICAgICBpbnQgaWR4OworICAgICAgICBpZihibG9ja3MgPj0gcy0+YmxvY2tzIHx8IHkgPj0gcy0+aGVpZ2h0KQorICAgICAgICAgICAgYnJlYWs7Ly9hbGwgYmxvY2tzIGRlY29kZWQKKworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IDEpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgaWR4ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nYik7CisgICAgICAgIGlmKChpZHggJiAweEY4KSA9PSAweDcwKSB7CisgICAgICAgICAgICBzd2l0Y2goaWR4KSB7CisgICAgICAgICAgICBjYXNlIDB4NzA6IC8vY2hhbmdlIG1vZGlmaWVyCisgICAgICAgICAgICAgICAgbW9kaWZpZXIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICAgICAgICAgIGlmKG1vZGlmaWVyPjEpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJ3YXJuaW5nOiBtb2RpZmllciBtdXN0IGJlIDAgb3IgMSwgZ290ICVpXG4iLCBtb2RpZmllcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4NzE6IC8vIHNldCB1bmlxIGZsYWcKKyAgICAgICAgICAgICAgICB1bmlxID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg3MjogLy90b2dnbGUgbW9kZQorICAgICAgICAgICAgICAgIG1vZGUgPSAhbW9kZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg3MzogLy9lbmQtb2YtZnJhbWUKKyAgICAgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg3NDogLy9za2lwIHNvbWUgYmxvY2tzCisgICAgICAgICAgICAgICAgc2tpcCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgICAgICAgICAgICAgaWYgKChibG9ja3MgKyBza2lwKSA+PSBzLT5ibG9ja3MpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJsb2NrcyArPSBza2lwOworICAgICAgICAgICAgICAgIHggKz0gc2tpcCAqIDg7CisgICAgICAgICAgICAgICAgd2hpbGUoeCA+PSBzLT53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICB4IC09IHMtPndpZHRoOworICAgICAgICAgICAgICAgICAgICB5ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAid2FybmluZzogdW5rbm93biBlc2NhcGUgMHglMDJYXG4iLCBpZHgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvL2hhbmRsZSBvbmUgYmxvY2sKKyAgICAgICAgICAgIGludCBjb2RlOworICAgICAgICAgICAgaW50IGNmOworICAgICAgICAgICAgaW50IGFuZ2xlID0gMDsKKyAgICAgICAgICAgIHVpbnQ4X3QgWVs0XTsgLy8gbHVtYSBzYW1wbGVzIG9mIGJsb2NrCisgICAgICAgICAgICBpbnQgdHggPSAwLCB0eSA9IDA7IC8vY29vcmRzIG9mIHN1YmJsb2NrCisgICAgICAgICAgICBpbnQgY2hyb21hID0gMDsKKyAgICAgICAgICAgIGlmIChtb2RlIHx8IHVuaXEpIHsKKyAgICAgICAgICAgICAgICB1bmlxID0gMDsKKyAgICAgICAgICAgICAgICBjZiA9IDE7CisgICAgICAgICAgICAgICAgY2hyb21hID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2YgPSAwOworICAgICAgICAgICAgICAgIGlmIChpZHgpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hyb21hID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7IC8vIGZvciBldmVyeSBzdWJibG9jaworICAgICAgICAgICAgICAgIGNvZGUgPSAoaWR4ID4+ICg2IC0gaSoyKSkgJiAzOyAvL2V4dHJhY3QgMiBiaXRzCisgICAgICAgICAgICAgICAgaWYoIWNvZGUpIC8vc2tpcCBzdWJibG9jaworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZihjZikgeworICAgICAgICAgICAgICAgICAgICBjaHJvbWEgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0eCA9IHggKyBibG9ja19jb29yZHNbaSAqIDJdOworICAgICAgICAgICAgICAgIHR5ID0geSArIGJsb2NrX2Nvb3Jkc1soaSAqIDIpICsgMV07CisgICAgICAgICAgICAgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisKKyAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSBhbmdsZV9ieV9pbmRleFsodG1wID4+IDYpICYgMHgzXTsKKworICAgICAgICAgICAgICAgICAgICBZWzBdID0gdG1wICYgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgWVsxXSA9IFlbMF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuZ2xlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBZWzJdID0gWVswXSsxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFlbMl0gPiAweDNGKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlbMl0gPSAweDNGOworICAgICAgICAgICAgICAgICAgICAgICAgWVszXSA9IFlbMl07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBZWzJdID0gWVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFlbM10gPSBZWzBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZpZXIpIHsgLy8gdW5wYWNrIGZvdXIgbHVtYSBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBieXRlc3RyZWFtMl9nZXRfYmUyNCgmcy0+Z2IpOworCisgICAgICAgICAgICAgICAgICAgICAgICBZWzBdID0gKHRtcCA+PiAxOCkgJiAweDNGOworICAgICAgICAgICAgICAgICAgICAgICAgWVsxXSA9ICh0bXAgPj4gMTIpICYgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFlbMl0gPSAodG1wID4+IDYpICYgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFlbM10gPSB0bXAgJiAweDNGOworICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gcmV0cmlldmUgbHVtYSBzYW1wbGVzIGZyb20gY29kZWJvb2sKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZzLT5nYik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gKHRtcCA+PiAxMikgJiAweEY7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgJj0gMHhGRkY7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPDw9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBZWzBdID0gcy0+dWx0aV9jb2RlYm9va1t0bXBdOworICAgICAgICAgICAgICAgICAgICAgICAgWVsxXSA9IHMtPnVsdGlfY29kZWJvb2tbdG1wICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICBZWzJdID0gcy0+dWx0aV9jb2RlYm9va1t0bXAgKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFlbM10gPSBzLT51bHRpX2NvZGVib29rW3RtcCArIDNdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZpZXIpIHsgLy8gYWxsIDE2IGx1bWEgc2FtcGxlcworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBMdW1hWzE2XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCAxMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0dSgmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICAgICAgTHVtYVswXSA9ICh0bXAgPj4gMTgpICYgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEx1bWFbMV0gPSAodG1wID4+IDEyKSAmIDB4M0Y7CisgICAgICAgICAgICAgICAgICAgICAgICBMdW1hWzJdID0gKHRtcCA+PiA2KSAmIDB4M0Y7CisgICAgICAgICAgICAgICAgICAgICAgICBMdW1hWzNdID0gdG1wICYgMHgzRjsKKworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgICAgICBMdW1hWzRdID0gKHRtcCA+PiAxOCkgJiAweDNGOworICAgICAgICAgICAgICAgICAgICAgICAgTHVtYVs1XSA9ICh0bXAgPj4gMTIpICYgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEx1bWFbNl0gPSAodG1wID4+IDYpICYgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEx1bWFbN10gPSB0bXAgJiAweDNGOworCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBieXRlc3RyZWFtMl9nZXRfYmUyNHUoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEx1bWFbOF0gPSAodG1wID4+IDE4KSAmIDB4M0Y7CisgICAgICAgICAgICAgICAgICAgICAgICBMdW1hWzldID0gKHRtcCA+PiAxMikgJiAweDNGOworICAgICAgICAgICAgICAgICAgICAgICAgTHVtYVsxMF0gPSAodG1wID4+IDYpICYgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEx1bWFbMTFdID0gdG1wICYgMHgzRjsKKworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMjR1KCZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgICAgICBMdW1hWzEyXSA9ICh0bXAgPj4gMTgpICYgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEx1bWFbMTNdID0gKHRtcCA+PiAxMikgJiAweDNGOworICAgICAgICAgICAgICAgICAgICAgICAgTHVtYVsxNF0gPSAodG1wID4+IDYpICYgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEx1bWFbMTVdID0gdG1wICYgMHgzRjsKKworICAgICAgICAgICAgICAgICAgICAgICAgdWx0aV9jb252ZXJ0X3l1dihzLT5mcmFtZSwgdHgsIHR5LCBMdW1hLCBjaHJvbWEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZih0bXAgJiAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAodG1wID4+IDQpICYgMHg3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAgPDwgOCkgKyBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZWzBdID0gKHRtcCA+PiA2KSAmIDB4M0Y7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVsxXSA9IHRtcCAmIDB4M0Y7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVsyXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Z2IpICYgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZWzNdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nYikgJiAweDNGOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsdGlfZ3JhZChzLT5mcmFtZSwgdHgsIHR5LCBZLCBjaHJvbWEsIGFuZ2xlKTsgLy9kcmF3IGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBzb21lIHBhdHRlcm5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGYwLCBmMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmMCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYxID0gdG1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlbMF0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKSAmIDB4M0Y7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVsxXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Z2IpICYgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bHRpX3BhdHRlcm4ocy0+ZnJhbWUsIHR4LCB0eSwgZjEsIGYwLCBZWzBdLCBZWzFdLCBjaHJvbWEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihjb2RlICE9IDMpCisgICAgICAgICAgICAgICAgICAgIHVsdGlfZ3JhZChzLT5mcmFtZSwgdHgsIHR5LCBZLCBjaHJvbWEsIGFuZ2xlKTsgLy8gZHJhdyBibG9jaworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxvY2tzKys7CisgICAgICAgICAgICAgICAgeCArPSA4OworICAgICAgICAgICAgaWYoeCA+PSBzLT53aWR0aCkgeworICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgIHkgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPmZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworCitlcnI6CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICJJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKK0FWQ29kZWMgZmZfdWx0aV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ1bHRpbW90aW9uIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSUJNIFVsdGlNb3Rpb24iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVUxUSSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVWx0aW1vdGlvbkRlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHVsdGlfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gdWx0aV9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHVsdGlfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdWx0aV9jYi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdWx0aV9jYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjFkODMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy91bHRpX2NiLmgKQEAgLTAsMCArMSw0MTI0IEBACisvKgorICogSUJNIFVsdGltb3Rpb24gVmlkZW8gRGVjb2RlcgorICogY29weXJpZ2h0IChDKSAyMDA0IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1VMVElfQ0JfSAorI2RlZmluZSBBVkNPREVDX1VMVElfQ0JfSAorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB1bHRpX2NvZGVib29rWzE2Mzg0XT17CisgICAgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMiwKKyAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLAorICAgIDB4MDAsIDB4MDIsIDB4MDMsIDB4MDQsCisgICAgMHgwMCwgMHgwMSwgMHgwMywgMHgwNCwKKyAgICAweDAwLCAweDAxLCAweDAyLCAweDA0LAorICAgIDB4MDAsIDB4MDIsIDB4MDMsIDB4MDUsCisgICAgMHgwMCwgMHgwMiwgMHgwNCwgMHgwNSwKKyAgICAweDAwLCAweDAxLCAweDA0LCAweDA1LAorICAgIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDUsCisgICAgMHgwMCwgMHgwMiwgMHgwNCwgMHgwNiwKKyAgICAweDAwLCAweDAzLCAweDA1LCAweDA2LAorICAgIDB4MDAsIDB4MDEsIDB4MDUsIDB4MDYsCisgICAgMHgwMCwgMHgwMSwgMHgwMywgMHgwNiwKKyAgICAweDAwLCAweDA2LCAweDA2LCAweDA2LAorICAgIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDYsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwKKyAgICAweDAwLCAweDAzLCAweDA0LCAweDA3LAorICAgIDB4MDAsIDB4MDMsIDB4MDYsIDB4MDcsCisgICAgMHgwMCwgMHgwMSwgMHgwNiwgMHgwNywKKyAgICAweDAwLCAweDAxLCAweDA0LCAweDA3LAorICAgIDB4MDAsIDB4MDMsIDB4MDUsIDB4MDgsCisgICAgMHgwMCwgMHgwNCwgMHgwNiwgMHgwOCwKKyAgICAweDAwLCAweDAyLCAweDA2LCAweDA4LAorICAgIDB4MDAsIDB4MDIsIDB4MDQsIDB4MDgsCisgICAgMHgwMCwgMHgwOCwgMHgwOCwgMHgwOCwKKyAgICAweDAwLCAweDAwLCAweDA4LCAweDA4LAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsCisgICAgMHgwMCwgMHgwNCwgMHgwNywgMHgwQiwKKyAgICAweDAwLCAweDA1LCAweDA5LCAweDBCLAorICAgIDB4MDAsIDB4MDIsIDB4MDksIDB4MEIsCisgICAgMHgwMCwgMHgwMiwgMHgwNiwgMHgwQiwKKyAgICAweDAwLCAweDBCLCAweDBCLCAweDBCLAorICAgIDB4MDAsIDB4MDAsIDB4MEIsIDB4MEIsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQiwKKyAgICAweDAwLCAweDA1LCAweDA5LCAweDBFLAorICAgIDB4MDAsIDB4MDcsIDB4MEIsIDB4MEUsCisgICAgMHgwMCwgMHgwMywgMHgwQiwgMHgwRSwKKyAgICAweDAwLCAweDAzLCAweDA3LCAweDBFLAorICAgIDB4MDAsIDB4MEUsIDB4MEUsIDB4MEUsCisgICAgMHgwMCwgMHgwMCwgMHgwRSwgMHgwRSwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDBFLAorICAgIDB4MDAsIDB4MDYsIDB4MEIsIDB4MTEsCisgICAgMHgwMCwgMHgwOCwgMHgwRCwgMHgxMSwKKyAgICAweDAwLCAweDA0LCAweDBELCAweDExLAorICAgIDB4MDAsIDB4MDQsIDB4MDksIDB4MTEsCisgICAgMHgwMCwgMHgxMSwgMHgxMSwgMHgxMSwKKyAgICAweDAwLCAweDAwLCAweDExLCAweDExLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsCisgICAgMHgwMCwgMHgwNywgMHgwRCwgMHgxNCwKKyAgICAweDAwLCAweDBBLCAweDBGLCAweDE0LAorICAgIDB4MDAsIDB4MDUsIDB4MEYsIDB4MTQsCisgICAgMHgwMCwgMHgwNSwgMHgwQSwgMHgxNCwKKyAgICAweDAwLCAweDE0LCAweDE0LCAweDE0LAorICAgIDB4MDAsIDB4MDAsIDB4MTQsIDB4MTQsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwKKyAgICAweDAwLCAweDBCLCAweDEyLCAweDE3LAorICAgIDB4MDAsIDB4MDUsIDB4MTIsIDB4MTcsCisgICAgMHgwMCwgMHgwNSwgMHgwQywgMHgxNywKKyAgICAweDAwLCAweDE3LCAweDE3LCAweDE3LAorICAgIDB4MDAsIDB4MDAsIDB4MTcsIDB4MTcsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNywKKyAgICAweDAwLCAweDBELCAweDE0LCAweDFBLAorICAgIDB4MDAsIDB4MDYsIDB4MTQsIDB4MUEsCisgICAgMHgwMCwgMHgwNiwgMHgwRCwgMHgxQSwKKyAgICAweDAwLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MDAsIDB4MDAsIDB4MUEsIDB4MUEsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQSwKKyAgICAweDAwLCAweDBFLCAweDE2LCAweDFELAorICAgIDB4MDAsIDB4MDcsIDB4MTYsIDB4MUQsCisgICAgMHgwMCwgMHgwNywgMHgwRiwgMHgxRCwKKyAgICAweDAwLCAweDFELCAweDFELCAweDFELAorICAgIDB4MDAsIDB4MDAsIDB4MUQsIDB4MUQsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxRCwKKyAgICAweDAwLCAweDEwLCAweDE4LCAweDIwLAorICAgIDB4MDAsIDB4MDgsIDB4MTgsIDB4MjAsCisgICAgMHgwMCwgMHgwOCwgMHgxMCwgMHgyMCwKKyAgICAweDAwLCAweDIwLCAweDIwLCAweDIwLAorICAgIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwKKyAgICAweDAwLCAweDIzLCAweDIzLCAweDIzLAorICAgIDB4MDAsIDB4MDAsIDB4MjMsIDB4MjMsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMywKKyAgICAweDAwLCAweDEyLCAweDFCLCAweDI0LAorICAgIDB4MDAsIDB4MDksIDB4MUIsIDB4MjQsCisgICAgMHgwMCwgMHgwOSwgMHgxMiwgMHgyNCwKKyAgICAweDAwLCAweDI4LCAweDI4LCAweDI4LAorICAgIDB4MDAsIDB4MDAsIDB4MjgsIDB4MjgsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOCwKKyAgICAweDAwLCAweDJFLCAweDJFLCAweDJFLAorICAgIDB4MDAsIDB4MDAsIDB4MkUsIDB4MkUsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgyRSwKKyAgICAweDAxLCAweDAyLCAweDAyLCAweDAzLAorICAgIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsCisgICAgMHgwMSwgMHgwMywgMHgwNCwgMHgwNSwKKyAgICAweDAxLCAweDAyLCAweDA0LCAweDA1LAorICAgIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDUsCisgICAgMHgwMSwgMHgwMywgMHgwNCwgMHgwNiwKKyAgICAweDAxLCAweDAzLCAweDA1LCAweDA2LAorICAgIDB4MDEsIDB4MDIsIDB4MDUsIDB4MDYsCisgICAgMHgwMSwgMHgwMiwgMHgwNCwgMHgwNiwKKyAgICAweDAxLCAweDAzLCAweDA1LCAweDA3LAorICAgIDB4MDEsIDB4MDQsIDB4MDYsIDB4MDcsCisgICAgMHgwMSwgMHgwMiwgMHgwNiwgMHgwNywKKyAgICAweDAxLCAweDAyLCAweDA0LCAweDA3LAorICAgIDB4MDEsIDB4MDcsIDB4MDcsIDB4MDcsCisgICAgMHgwMSwgMHgwMSwgMHgwNywgMHgwNywKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDA3LAorICAgIDB4MDEsIDB4MDQsIDB4MDUsIDB4MDgsCisgICAgMHgwMSwgMHgwNCwgMHgwNywgMHgwOCwKKyAgICAweDAxLCAweDAyLCAweDA3LCAweDA4LAorICAgIDB4MDEsIDB4MDIsIDB4MDUsIDB4MDgsCisgICAgMHgwMSwgMHgwNCwgMHgwNiwgMHgwOSwKKyAgICAweDAxLCAweDA1LCAweDA3LCAweDA5LAorICAgIDB4MDEsIDB4MDMsIDB4MDcsIDB4MDksCisgICAgMHgwMSwgMHgwMywgMHgwNSwgMHgwOSwKKyAgICAweDAxLCAweDA5LCAweDA5LCAweDA5LAorICAgIDB4MDEsIDB4MDEsIDB4MDksIDB4MDksCisgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwOSwKKyAgICAweDAxLCAweDA1LCAweDA4LCAweDBDLAorICAgIDB4MDEsIDB4MDYsIDB4MEEsIDB4MEMsCisgICAgMHgwMSwgMHgwMywgMHgwQSwgMHgwQywKKyAgICAweDAxLCAweDAzLCAweDA3LCAweDBDLAorICAgIDB4MDEsIDB4MEMsIDB4MEMsIDB4MEMsCisgICAgMHgwMSwgMHgwMSwgMHgwQywgMHgwQywKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDBDLAorICAgIDB4MDEsIDB4MDYsIDB4MEEsIDB4MEYsCisgICAgMHgwMSwgMHgwOCwgMHgwQywgMHgwRiwKKyAgICAweDAxLCAweDA0LCAweDBDLCAweDBGLAorICAgIDB4MDEsIDB4MDQsIDB4MDgsIDB4MEYsCisgICAgMHgwMSwgMHgwRiwgMHgwRiwgMHgwRiwKKyAgICAweDAxLCAweDAxLCAweDBGLCAweDBGLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MEYsCisgICAgMHgwMSwgMHgwNywgMHgwQywgMHgxMiwKKyAgICAweDAxLCAweDA5LCAweDBFLCAweDEyLAorICAgIDB4MDEsIDB4MDUsIDB4MEUsIDB4MTIsCisgICAgMHgwMSwgMHgwNSwgMHgwQSwgMHgxMiwKKyAgICAweDAxLCAweDEyLCAweDEyLCAweDEyLAorICAgIDB4MDEsIDB4MDEsIDB4MTIsIDB4MTIsCisgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgxMiwKKyAgICAweDAxLCAweDA4LCAweDBFLCAweDE1LAorICAgIDB4MDEsIDB4MEIsIDB4MTAsIDB4MTUsCisgICAgMHgwMSwgMHgwNiwgMHgxMCwgMHgxNSwKKyAgICAweDAxLCAweDA2LCAweDBCLCAweDE1LAorICAgIDB4MDEsIDB4MTUsIDB4MTUsIDB4MTUsCisgICAgMHgwMSwgMHgwMSwgMHgxNSwgMHgxNSwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDE1LAorICAgIDB4MDEsIDB4MEMsIDB4MTMsIDB4MTgsCisgICAgMHgwMSwgMHgwNiwgMHgxMywgMHgxOCwKKyAgICAweDAxLCAweDA2LCAweDBELCAweDE4LAorICAgIDB4MDEsIDB4MTgsIDB4MTgsIDB4MTgsCisgICAgMHgwMSwgMHgwMSwgMHgxOCwgMHgxOCwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDE4LAorICAgIDB4MDEsIDB4MEUsIDB4MTUsIDB4MUIsCisgICAgMHgwMSwgMHgwNywgMHgxNSwgMHgxQiwKKyAgICAweDAxLCAweDA3LCAweDBFLCAweDFCLAorICAgIDB4MDEsIDB4MUIsIDB4MUIsIDB4MUIsCisgICAgMHgwMSwgMHgwMSwgMHgxQiwgMHgxQiwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDFCLAorICAgIDB4MDEsIDB4MEYsIDB4MTcsIDB4MUUsCisgICAgMHgwMSwgMHgwOCwgMHgxNywgMHgxRSwKKyAgICAweDAxLCAweDA4LCAweDEwLCAweDFFLAorICAgIDB4MDEsIDB4MUUsIDB4MUUsIDB4MUUsCisgICAgMHgwMSwgMHgwMSwgMHgxRSwgMHgxRSwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDFFLAorICAgIDB4MDEsIDB4MTEsIDB4MTksIDB4MjEsCisgICAgMHgwMSwgMHgwOSwgMHgxOSwgMHgyMSwKKyAgICAweDAxLCAweDA5LCAweDExLCAweDIxLAorICAgIDB4MDEsIDB4MjEsIDB4MjEsIDB4MjEsCisgICAgMHgwMSwgMHgwMSwgMHgyMSwgMHgyMSwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDIxLAorICAgIDB4MDEsIDB4MjQsIDB4MjQsIDB4MjQsCisgICAgMHgwMSwgMHgwMSwgMHgyNCwgMHgyNCwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDI0LAorICAgIDB4MDEsIDB4MTMsIDB4MUMsIDB4MjUsCisgICAgMHgwMSwgMHgwQSwgMHgxQywgMHgyNSwKKyAgICAweDAxLCAweDBBLCAweDEzLCAweDI1LAorICAgIDB4MDEsIDB4MjksIDB4MjksIDB4MjksCisgICAgMHgwMSwgMHgwMSwgMHgyOSwgMHgyOSwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDI5LAorICAgIDB4MDEsIDB4MkYsIDB4MkYsIDB4MkYsCisgICAgMHgwMSwgMHgwMSwgMHgyRiwgMHgyRiwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDJGLAorICAgIDB4MDIsIDB4MDMsIDB4MDMsIDB4MDQsCisgICAgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKKyAgICAweDAyLCAweDA0LCAweDA1LCAweDA2LAorICAgIDB4MDIsIDB4MDMsIDB4MDUsIDB4MDYsCisgICAgMHgwMiwgMHgwMywgMHgwNCwgMHgwNiwKKyAgICAweDAyLCAweDA0LCAweDA1LCAweDA3LAorICAgIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDcsCisgICAgMHgwMiwgMHgwMywgMHgwNiwgMHgwNywKKyAgICAweDAyLCAweDAzLCAweDA1LCAweDA3LAorICAgIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsCisgICAgMHgwMiwgMHgwNSwgMHgwNywgMHgwOCwKKyAgICAweDAyLCAweDAzLCAweDA3LCAweDA4LAorICAgIDB4MDIsIDB4MDMsIDB4MDUsIDB4MDgsCisgICAgMHgwMiwgMHgwOCwgMHgwOCwgMHgwOCwKKyAgICAweDAyLCAweDAyLCAweDA4LCAweDA4LAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDgsCisgICAgMHgwMiwgMHgwNSwgMHgwNiwgMHgwOSwKKyAgICAweDAyLCAweDA1LCAweDA4LCAweDA5LAorICAgIDB4MDIsIDB4MDMsIDB4MDgsIDB4MDksCisgICAgMHgwMiwgMHgwMywgMHgwNiwgMHgwOSwKKyAgICAweDAyLCAweDA1LCAweDA3LCAweDBBLAorICAgIDB4MDIsIDB4MDYsIDB4MDgsIDB4MEEsCisgICAgMHgwMiwgMHgwNCwgMHgwOCwgMHgwQSwKKyAgICAweDAyLCAweDA0LCAweDA2LCAweDBBLAorICAgIDB4MDIsIDB4MEEsIDB4MEEsIDB4MEEsCisgICAgMHgwMiwgMHgwMiwgMHgwQSwgMHgwQSwKKyAgICAweDAyLCAweDAyLCAweDAyLCAweDBBLAorICAgIDB4MDIsIDB4MDYsIDB4MDksIDB4MEQsCisgICAgMHgwMiwgMHgwNywgMHgwQiwgMHgwRCwKKyAgICAweDAyLCAweDA0LCAweDBCLCAweDBELAorICAgIDB4MDIsIDB4MDQsIDB4MDgsIDB4MEQsCisgICAgMHgwMiwgMHgwRCwgMHgwRCwgMHgwRCwKKyAgICAweDAyLCAweDAyLCAweDBELCAweDBELAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MEQsCisgICAgMHgwMiwgMHgwNywgMHgwQiwgMHgxMCwKKyAgICAweDAyLCAweDA5LCAweDBELCAweDEwLAorICAgIDB4MDIsIDB4MDUsIDB4MEQsIDB4MTAsCisgICAgMHgwMiwgMHgwNSwgMHgwOSwgMHgxMCwKKyAgICAweDAyLCAweDEwLCAweDEwLCAweDEwLAorICAgIDB4MDIsIDB4MDIsIDB4MTAsIDB4MTAsCisgICAgMHgwMiwgMHgwMiwgMHgwMiwgMHgxMCwKKyAgICAweDAyLCAweDA4LCAweDBELCAweDEzLAorICAgIDB4MDIsIDB4MEEsIDB4MEYsIDB4MTMsCisgICAgMHgwMiwgMHgwNiwgMHgwRiwgMHgxMywKKyAgICAweDAyLCAweDA2LCAweDBCLCAweDEzLAorICAgIDB4MDIsIDB4MTMsIDB4MTMsIDB4MTMsCisgICAgMHgwMiwgMHgwMiwgMHgxMywgMHgxMywKKyAgICAweDAyLCAweDAyLCAweDAyLCAweDEzLAorICAgIDB4MDIsIDB4MDksIDB4MEYsIDB4MTYsCisgICAgMHgwMiwgMHgwQywgMHgxMSwgMHgxNiwKKyAgICAweDAyLCAweDA3LCAweDExLCAweDE2LAorICAgIDB4MDIsIDB4MDcsIDB4MEMsIDB4MTYsCisgICAgMHgwMiwgMHgxNiwgMHgxNiwgMHgxNiwKKyAgICAweDAyLCAweDAyLCAweDE2LCAweDE2LAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MTYsCisgICAgMHgwMiwgMHgwRCwgMHgxNCwgMHgxOSwKKyAgICAweDAyLCAweDA3LCAweDE0LCAweDE5LAorICAgIDB4MDIsIDB4MDcsIDB4MEUsIDB4MTksCisgICAgMHgwMiwgMHgxOSwgMHgxOSwgMHgxOSwKKyAgICAweDAyLCAweDAyLCAweDE5LCAweDE5LAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MTksCisgICAgMHgwMiwgMHgwRiwgMHgxNiwgMHgxQywKKyAgICAweDAyLCAweDA4LCAweDE2LCAweDFDLAorICAgIDB4MDIsIDB4MDgsIDB4MEYsIDB4MUMsCisgICAgMHgwMiwgMHgxQywgMHgxQywgMHgxQywKKyAgICAweDAyLCAweDAyLCAweDFDLCAweDFDLAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MUMsCisgICAgMHgwMiwgMHgxMCwgMHgxOCwgMHgxRiwKKyAgICAweDAyLCAweDA5LCAweDE4LCAweDFGLAorICAgIDB4MDIsIDB4MDksIDB4MTEsIDB4MUYsCisgICAgMHgwMiwgMHgxRiwgMHgxRiwgMHgxRiwKKyAgICAweDAyLCAweDAyLCAweDFGLCAweDFGLAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MUYsCisgICAgMHgwMiwgMHgxMiwgMHgxQSwgMHgyMiwKKyAgICAweDAyLCAweDBBLCAweDFBLCAweDIyLAorICAgIDB4MDIsIDB4MEEsIDB4MTIsIDB4MjIsCisgICAgMHgwMiwgMHgyMiwgMHgyMiwgMHgyMiwKKyAgICAweDAyLCAweDAyLCAweDIyLCAweDIyLAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MjIsCisgICAgMHgwMiwgMHgyNSwgMHgyNSwgMHgyNSwKKyAgICAweDAyLCAweDAyLCAweDI1LCAweDI1LAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MjUsCisgICAgMHgwMiwgMHgxNCwgMHgxRCwgMHgyNiwKKyAgICAweDAyLCAweDBCLCAweDFELCAweDI2LAorICAgIDB4MDIsIDB4MEIsIDB4MTQsIDB4MjYsCisgICAgMHgwMiwgMHgyQSwgMHgyQSwgMHgyQSwKKyAgICAweDAyLCAweDAyLCAweDJBLCAweDJBLAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MkEsCisgICAgMHgwMiwgMHgzMCwgMHgzMCwgMHgzMCwKKyAgICAweDAyLCAweDAyLCAweDMwLCAweDMwLAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MzAsCisgICAgMHgwMywgMHgwNCwgMHgwNCwgMHgwNSwKKyAgICAweDAzLCAweDA0LCAweDA1LCAweDA2LAorICAgIDB4MDMsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgMHgwMywgMHgwNCwgMHgwNiwgMHgwNywKKyAgICAweDAzLCAweDA0LCAweDA1LCAweDA3LAorICAgIDB4MDMsIDB4MDUsIDB4MDYsIDB4MDgsCisgICAgMHgwMywgMHgwNSwgMHgwNywgMHgwOCwKKyAgICAweDAzLCAweDA0LCAweDA3LCAweDA4LAorICAgIDB4MDMsIDB4MDQsIDB4MDYsIDB4MDgsCisgICAgMHgwMywgMHgwNSwgMHgwNywgMHgwOSwKKyAgICAweDAzLCAweDA2LCAweDA4LCAweDA5LAorICAgIDB4MDMsIDB4MDQsIDB4MDgsIDB4MDksCisgICAgMHgwMywgMHgwNCwgMHgwNiwgMHgwOSwKKyAgICAweDAzLCAweDA5LCAweDA5LCAweDA5LAorICAgIDB4MDMsIDB4MDMsIDB4MDksIDB4MDksCisgICAgMHgwMywgMHgwMywgMHgwMywgMHgwOSwKKyAgICAweDAzLCAweDA2LCAweDA3LCAweDBBLAorICAgIDB4MDMsIDB4MDYsIDB4MDksIDB4MEEsCisgICAgMHgwMywgMHgwNCwgMHgwOSwgMHgwQSwKKyAgICAweDAzLCAweDA0LCAweDA3LCAweDBBLAorICAgIDB4MDMsIDB4MDYsIDB4MDgsIDB4MEIsCisgICAgMHgwMywgMHgwNywgMHgwOSwgMHgwQiwKKyAgICAweDAzLCAweDA1LCAweDA5LCAweDBCLAorICAgIDB4MDMsIDB4MDUsIDB4MDcsIDB4MEIsCisgICAgMHgwMywgMHgwQiwgMHgwQiwgMHgwQiwKKyAgICAweDAzLCAweDAzLCAweDBCLCAweDBCLAorICAgIDB4MDMsIDB4MDMsIDB4MDMsIDB4MEIsCisgICAgMHgwMywgMHgwNywgMHgwQSwgMHgwRSwKKyAgICAweDAzLCAweDA4LCAweDBDLCAweDBFLAorICAgIDB4MDMsIDB4MDUsIDB4MEMsIDB4MEUsCisgICAgMHgwMywgMHgwNSwgMHgwOSwgMHgwRSwKKyAgICAweDAzLCAweDBFLCAweDBFLCAweDBFLAorICAgIDB4MDMsIDB4MDMsIDB4MEUsIDB4MEUsCisgICAgMHgwMywgMHgwMywgMHgwMywgMHgwRSwKKyAgICAweDAzLCAweDA4LCAweDBDLCAweDExLAorICAgIDB4MDMsIDB4MEEsIDB4MEUsIDB4MTEsCisgICAgMHgwMywgMHgwNiwgMHgwRSwgMHgxMSwKKyAgICAweDAzLCAweDA2LCAweDBBLCAweDExLAorICAgIDB4MDMsIDB4MTEsIDB4MTEsIDB4MTEsCisgICAgMHgwMywgMHgwMywgMHgxMSwgMHgxMSwKKyAgICAweDAzLCAweDAzLCAweDAzLCAweDExLAorICAgIDB4MDMsIDB4MDksIDB4MEUsIDB4MTQsCisgICAgMHgwMywgMHgwQiwgMHgxMCwgMHgxNCwKKyAgICAweDAzLCAweDA3LCAweDEwLCAweDE0LAorICAgIDB4MDMsIDB4MDcsIDB4MEMsIDB4MTQsCisgICAgMHgwMywgMHgxNCwgMHgxNCwgMHgxNCwKKyAgICAweDAzLCAweDAzLCAweDE0LCAweDE0LAorICAgIDB4MDMsIDB4MDMsIDB4MDMsIDB4MTQsCisgICAgMHgwMywgMHgwQSwgMHgxMCwgMHgxNywKKyAgICAweDAzLCAweDBELCAweDEyLCAweDE3LAorICAgIDB4MDMsIDB4MDgsIDB4MTIsIDB4MTcsCisgICAgMHgwMywgMHgwOCwgMHgwRCwgMHgxNywKKyAgICAweDAzLCAweDE3LCAweDE3LCAweDE3LAorICAgIDB4MDMsIDB4MDMsIDB4MTcsIDB4MTcsCisgICAgMHgwMywgMHgwMywgMHgwMywgMHgxNywKKyAgICAweDAzLCAweDBFLCAweDE1LCAweDFBLAorICAgIDB4MDMsIDB4MDgsIDB4MTUsIDB4MUEsCisgICAgMHgwMywgMHgwOCwgMHgwRiwgMHgxQSwKKyAgICAweDAzLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MDMsIDB4MDMsIDB4MUEsIDB4MUEsCisgICAgMHgwMywgMHgwMywgMHgwMywgMHgxQSwKKyAgICAweDAzLCAweDEwLCAweDE3LCAweDFELAorICAgIDB4MDMsIDB4MDksIDB4MTcsIDB4MUQsCisgICAgMHgwMywgMHgwOSwgMHgxMCwgMHgxRCwKKyAgICAweDAzLCAweDFELCAweDFELCAweDFELAorICAgIDB4MDMsIDB4MDMsIDB4MUQsIDB4MUQsCisgICAgMHgwMywgMHgwMywgMHgwMywgMHgxRCwKKyAgICAweDAzLCAweDExLCAweDE5LCAweDIwLAorICAgIDB4MDMsIDB4MEEsIDB4MTksIDB4MjAsCisgICAgMHgwMywgMHgwQSwgMHgxMiwgMHgyMCwKKyAgICAweDAzLCAweDIwLCAweDIwLCAweDIwLAorICAgIDB4MDMsIDB4MDMsIDB4MjAsIDB4MjAsCisgICAgMHgwMywgMHgwMywgMHgwMywgMHgyMCwKKyAgICAweDAzLCAweDEzLCAweDFCLCAweDIzLAorICAgIDB4MDMsIDB4MEIsIDB4MUIsIDB4MjMsCisgICAgMHgwMywgMHgwQiwgMHgxMywgMHgyMywKKyAgICAweDAzLCAweDIzLCAweDIzLCAweDIzLAorICAgIDB4MDMsIDB4MDMsIDB4MjMsIDB4MjMsCisgICAgMHgwMywgMHgwMywgMHgwMywgMHgyMywKKyAgICAweDAzLCAweDI2LCAweDI2LCAweDI2LAorICAgIDB4MDMsIDB4MDMsIDB4MjYsIDB4MjYsCisgICAgMHgwMywgMHgwMywgMHgwMywgMHgyNiwKKyAgICAweDAzLCAweDE1LCAweDFFLCAweDI3LAorICAgIDB4MDMsIDB4MEMsIDB4MUUsIDB4MjcsCisgICAgMHgwMywgMHgwQywgMHgxNSwgMHgyNywKKyAgICAweDAzLCAweDJCLCAweDJCLCAweDJCLAorICAgIDB4MDMsIDB4MDMsIDB4MkIsIDB4MkIsCisgICAgMHgwMywgMHgwMywgMHgwMywgMHgyQiwKKyAgICAweDAzLCAweDMxLCAweDMxLCAweDMxLAorICAgIDB4MDMsIDB4MDMsIDB4MzEsIDB4MzEsCisgICAgMHgwMywgMHgwMywgMHgwMywgMHgzMSwKKyAgICAweDA0LCAweDA1LCAweDA1LCAweDA2LAorICAgIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgMHgwNCwgMHgwNiwgMHgwNywgMHgwOCwKKyAgICAweDA0LCAweDA1LCAweDA3LCAweDA4LAorICAgIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDgsCisgICAgMHgwNCwgMHgwNiwgMHgwNywgMHgwOSwKKyAgICAweDA0LCAweDA2LCAweDA4LCAweDA5LAorICAgIDB4MDQsIDB4MDUsIDB4MDgsIDB4MDksCisgICAgMHgwNCwgMHgwNSwgMHgwNywgMHgwOSwKKyAgICAweDA0LCAweDA2LCAweDA4LCAweDBBLAorICAgIDB4MDQsIDB4MDcsIDB4MDksIDB4MEEsCisgICAgMHgwNCwgMHgwNSwgMHgwOSwgMHgwQSwKKyAgICAweDA0LCAweDA1LCAweDA3LCAweDBBLAorICAgIDB4MDQsIDB4MEEsIDB4MEEsIDB4MEEsCisgICAgMHgwNCwgMHgwNCwgMHgwQSwgMHgwQSwKKyAgICAweDA0LCAweDA0LCAweDA0LCAweDBBLAorICAgIDB4MDQsIDB4MDcsIDB4MDgsIDB4MEIsCisgICAgMHgwNCwgMHgwNywgMHgwQSwgMHgwQiwKKyAgICAweDA0LCAweDA1LCAweDBBLCAweDBCLAorICAgIDB4MDQsIDB4MDUsIDB4MDgsIDB4MEIsCisgICAgMHgwNCwgMHgwNywgMHgwOSwgMHgwQywKKyAgICAweDA0LCAweDA4LCAweDBBLCAweDBDLAorICAgIDB4MDQsIDB4MDYsIDB4MEEsIDB4MEMsCisgICAgMHgwNCwgMHgwNiwgMHgwOCwgMHgwQywKKyAgICAweDA0LCAweDBDLCAweDBDLCAweDBDLAorICAgIDB4MDQsIDB4MDQsIDB4MEMsIDB4MEMsCisgICAgMHgwNCwgMHgwNCwgMHgwNCwgMHgwQywKKyAgICAweDA0LCAweDA4LCAweDBCLCAweDBGLAorICAgIDB4MDQsIDB4MDksIDB4MEQsIDB4MEYsCisgICAgMHgwNCwgMHgwNiwgMHgwRCwgMHgwRiwKKyAgICAweDA0LCAweDA2LCAweDBBLCAweDBGLAorICAgIDB4MDQsIDB4MEYsIDB4MEYsIDB4MEYsCisgICAgMHgwNCwgMHgwNCwgMHgwRiwgMHgwRiwKKyAgICAweDA0LCAweDA0LCAweDA0LCAweDBGLAorICAgIDB4MDQsIDB4MDksIDB4MEQsIDB4MTIsCisgICAgMHgwNCwgMHgwQiwgMHgwRiwgMHgxMiwKKyAgICAweDA0LCAweDA3LCAweDBGLCAweDEyLAorICAgIDB4MDQsIDB4MDcsIDB4MEIsIDB4MTIsCisgICAgMHgwNCwgMHgxMiwgMHgxMiwgMHgxMiwKKyAgICAweDA0LCAweDA0LCAweDEyLCAweDEyLAorICAgIDB4MDQsIDB4MDQsIDB4MDQsIDB4MTIsCisgICAgMHgwNCwgMHgwQSwgMHgwRiwgMHgxNSwKKyAgICAweDA0LCAweDBDLCAweDExLCAweDE1LAorICAgIDB4MDQsIDB4MDgsIDB4MTEsIDB4MTUsCisgICAgMHgwNCwgMHgwOCwgMHgwRCwgMHgxNSwKKyAgICAweDA0LCAweDE1LCAweDE1LCAweDE1LAorICAgIDB4MDQsIDB4MDQsIDB4MTUsIDB4MTUsCisgICAgMHgwNCwgMHgwNCwgMHgwNCwgMHgxNSwKKyAgICAweDA0LCAweDBCLCAweDExLCAweDE4LAorICAgIDB4MDQsIDB4MEUsIDB4MTMsIDB4MTgsCisgICAgMHgwNCwgMHgwOSwgMHgxMywgMHgxOCwKKyAgICAweDA0LCAweDA5LCAweDBFLCAweDE4LAorICAgIDB4MDQsIDB4MTgsIDB4MTgsIDB4MTgsCisgICAgMHgwNCwgMHgwNCwgMHgxOCwgMHgxOCwKKyAgICAweDA0LCAweDA0LCAweDA0LCAweDE4LAorICAgIDB4MDQsIDB4MEYsIDB4MTYsIDB4MUIsCisgICAgMHgwNCwgMHgwOSwgMHgxNiwgMHgxQiwKKyAgICAweDA0LCAweDA5LCAweDEwLCAweDFCLAorICAgIDB4MDQsIDB4MUIsIDB4MUIsIDB4MUIsCisgICAgMHgwNCwgMHgwNCwgMHgxQiwgMHgxQiwKKyAgICAweDA0LCAweDA0LCAweDA0LCAweDFCLAorICAgIDB4MDQsIDB4MTEsIDB4MTgsIDB4MUUsCisgICAgMHgwNCwgMHgwQSwgMHgxOCwgMHgxRSwKKyAgICAweDA0LCAweDBBLCAweDExLCAweDFFLAorICAgIDB4MDQsIDB4MUUsIDB4MUUsIDB4MUUsCisgICAgMHgwNCwgMHgwNCwgMHgxRSwgMHgxRSwKKyAgICAweDA0LCAweDA0LCAweDA0LCAweDFFLAorICAgIDB4MDQsIDB4MTIsIDB4MUEsIDB4MjEsCisgICAgMHgwNCwgMHgwQiwgMHgxQSwgMHgyMSwKKyAgICAweDA0LCAweDBCLCAweDEzLCAweDIxLAorICAgIDB4MDQsIDB4MjEsIDB4MjEsIDB4MjEsCisgICAgMHgwNCwgMHgwNCwgMHgyMSwgMHgyMSwKKyAgICAweDA0LCAweDA0LCAweDA0LCAweDIxLAorICAgIDB4MDQsIDB4MTQsIDB4MUMsIDB4MjQsCisgICAgMHgwNCwgMHgwQywgMHgxQywgMHgyNCwKKyAgICAweDA0LCAweDBDLCAweDE0LCAweDI0LAorICAgIDB4MDQsIDB4MjQsIDB4MjQsIDB4MjQsCisgICAgMHgwNCwgMHgwNCwgMHgyNCwgMHgyNCwKKyAgICAweDA0LCAweDA0LCAweDA0LCAweDI0LAorICAgIDB4MDQsIDB4MjcsIDB4MjcsIDB4MjcsCisgICAgMHgwNCwgMHgwNCwgMHgyNywgMHgyNywKKyAgICAweDA0LCAweDA0LCAweDA0LCAweDI3LAorICAgIDB4MDQsIDB4MTYsIDB4MUYsIDB4MjgsCisgICAgMHgwNCwgMHgwRCwgMHgxRiwgMHgyOCwKKyAgICAweDA0LCAweDBELCAweDE2LCAweDI4LAorICAgIDB4MDQsIDB4MkMsIDB4MkMsIDB4MkMsCisgICAgMHgwNCwgMHgwNCwgMHgyQywgMHgyQywKKyAgICAweDA0LCAweDA0LCAweDA0LCAweDJDLAorICAgIDB4MDQsIDB4MzIsIDB4MzIsIDB4MzIsCisgICAgMHgwNCwgMHgwNCwgMHgzMiwgMHgzMiwKKyAgICAweDA0LCAweDA0LCAweDA0LCAweDMyLAorICAgIDB4MDUsIDB4MDYsIDB4MDYsIDB4MDcsCisgICAgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKKyAgICAweDA1LCAweDA3LCAweDA4LCAweDA5LAorICAgIDB4MDUsIDB4MDYsIDB4MDgsIDB4MDksCisgICAgMHgwNSwgMHgwNiwgMHgwNywgMHgwOSwKKyAgICAweDA1LCAweDA3LCAweDA4LCAweDBBLAorICAgIDB4MDUsIDB4MDcsIDB4MDksIDB4MEEsCisgICAgMHgwNSwgMHgwNiwgMHgwOSwgMHgwQSwKKyAgICAweDA1LCAweDA2LCAweDA4LCAweDBBLAorICAgIDB4MDUsIDB4MDcsIDB4MDksIDB4MEIsCisgICAgMHgwNSwgMHgwOCwgMHgwQSwgMHgwQiwKKyAgICAweDA1LCAweDA2LCAweDBBLCAweDBCLAorICAgIDB4MDUsIDB4MDYsIDB4MDgsIDB4MEIsCisgICAgMHgwNSwgMHgwQiwgMHgwQiwgMHgwQiwKKyAgICAweDA1LCAweDA1LCAweDBCLCAweDBCLAorICAgIDB4MDUsIDB4MDUsIDB4MDUsIDB4MEIsCisgICAgMHgwNSwgMHgwOCwgMHgwOSwgMHgwQywKKyAgICAweDA1LCAweDA4LCAweDBCLCAweDBDLAorICAgIDB4MDUsIDB4MDYsIDB4MEIsIDB4MEMsCisgICAgMHgwNSwgMHgwNiwgMHgwOSwgMHgwQywKKyAgICAweDA1LCAweDA4LCAweDBBLCAweDBELAorICAgIDB4MDUsIDB4MDksIDB4MEIsIDB4MEQsCisgICAgMHgwNSwgMHgwNywgMHgwQiwgMHgwRCwKKyAgICAweDA1LCAweDA3LCAweDA5LCAweDBELAorICAgIDB4MDUsIDB4MEQsIDB4MEQsIDB4MEQsCisgICAgMHgwNSwgMHgwNSwgMHgwRCwgMHgwRCwKKyAgICAweDA1LCAweDA1LCAweDA1LCAweDBELAorICAgIDB4MDUsIDB4MDksIDB4MEMsIDB4MTAsCisgICAgMHgwNSwgMHgwQSwgMHgwRSwgMHgxMCwKKyAgICAweDA1LCAweDA3LCAweDBFLCAweDEwLAorICAgIDB4MDUsIDB4MDcsIDB4MEIsIDB4MTAsCisgICAgMHgwNSwgMHgxMCwgMHgxMCwgMHgxMCwKKyAgICAweDA1LCAweDA1LCAweDEwLCAweDEwLAorICAgIDB4MDUsIDB4MDUsIDB4MDUsIDB4MTAsCisgICAgMHgwNSwgMHgwQSwgMHgwRSwgMHgxMywKKyAgICAweDA1LCAweDBDLCAweDEwLCAweDEzLAorICAgIDB4MDUsIDB4MDgsIDB4MTAsIDB4MTMsCisgICAgMHgwNSwgMHgwOCwgMHgwQywgMHgxMywKKyAgICAweDA1LCAweDEzLCAweDEzLCAweDEzLAorICAgIDB4MDUsIDB4MDUsIDB4MTMsIDB4MTMsCisgICAgMHgwNSwgMHgwNSwgMHgwNSwgMHgxMywKKyAgICAweDA1LCAweDBCLCAweDEwLCAweDE2LAorICAgIDB4MDUsIDB4MEQsIDB4MTIsIDB4MTYsCisgICAgMHgwNSwgMHgwOSwgMHgxMiwgMHgxNiwKKyAgICAweDA1LCAweDA5LCAweDBFLCAweDE2LAorICAgIDB4MDUsIDB4MTYsIDB4MTYsIDB4MTYsCisgICAgMHgwNSwgMHgwNSwgMHgxNiwgMHgxNiwKKyAgICAweDA1LCAweDA1LCAweDA1LCAweDE2LAorICAgIDB4MDUsIDB4MEMsIDB4MTIsIDB4MTksCisgICAgMHgwNSwgMHgwRiwgMHgxNCwgMHgxOSwKKyAgICAweDA1LCAweDBBLCAweDE0LCAweDE5LAorICAgIDB4MDUsIDB4MEEsIDB4MEYsIDB4MTksCisgICAgMHgwNSwgMHgxOSwgMHgxOSwgMHgxOSwKKyAgICAweDA1LCAweDA1LCAweDE5LCAweDE5LAorICAgIDB4MDUsIDB4MDUsIDB4MDUsIDB4MTksCisgICAgMHgwNSwgMHgxMCwgMHgxNywgMHgxQywKKyAgICAweDA1LCAweDBBLCAweDE3LCAweDFDLAorICAgIDB4MDUsIDB4MEEsIDB4MTEsIDB4MUMsCisgICAgMHgwNSwgMHgxQywgMHgxQywgMHgxQywKKyAgICAweDA1LCAweDA1LCAweDFDLCAweDFDLAorICAgIDB4MDUsIDB4MDUsIDB4MDUsIDB4MUMsCisgICAgMHgwNSwgMHgxMiwgMHgxOSwgMHgxRiwKKyAgICAweDA1LCAweDBCLCAweDE5LCAweDFGLAorICAgIDB4MDUsIDB4MEIsIDB4MTIsIDB4MUYsCisgICAgMHgwNSwgMHgxRiwgMHgxRiwgMHgxRiwKKyAgICAweDA1LCAweDA1LCAweDFGLCAweDFGLAorICAgIDB4MDUsIDB4MDUsIDB4MDUsIDB4MUYsCisgICAgMHgwNSwgMHgxMywgMHgxQiwgMHgyMiwKKyAgICAweDA1LCAweDBDLCAweDFCLCAweDIyLAorICAgIDB4MDUsIDB4MEMsIDB4MTQsIDB4MjIsCisgICAgMHgwNSwgMHgyMiwgMHgyMiwgMHgyMiwKKyAgICAweDA1LCAweDA1LCAweDIyLCAweDIyLAorICAgIDB4MDUsIDB4MDUsIDB4MDUsIDB4MjIsCisgICAgMHgwNSwgMHgxNSwgMHgxRCwgMHgyNSwKKyAgICAweDA1LCAweDBELCAweDFELCAweDI1LAorICAgIDB4MDUsIDB4MEQsIDB4MTUsIDB4MjUsCisgICAgMHgwNSwgMHgyNSwgMHgyNSwgMHgyNSwKKyAgICAweDA1LCAweDA1LCAweDI1LCAweDI1LAorICAgIDB4MDUsIDB4MDUsIDB4MDUsIDB4MjUsCisgICAgMHgwNSwgMHgyOCwgMHgyOCwgMHgyOCwKKyAgICAweDA1LCAweDA1LCAweDI4LCAweDI4LAorICAgIDB4MDUsIDB4MDUsIDB4MDUsIDB4MjgsCisgICAgMHgwNSwgMHgxNywgMHgyMCwgMHgyOSwKKyAgICAweDA1LCAweDBFLCAweDIwLCAweDI5LAorICAgIDB4MDUsIDB4MEUsIDB4MTcsIDB4MjksCisgICAgMHgwNSwgMHgyRCwgMHgyRCwgMHgyRCwKKyAgICAweDA1LCAweDA1LCAweDJELCAweDJELAorICAgIDB4MDUsIDB4MDUsIDB4MDUsIDB4MkQsCisgICAgMHgwNSwgMHgzMywgMHgzMywgMHgzMywKKyAgICAweDA1LCAweDA1LCAweDMzLCAweDMzLAorICAgIDB4MDUsIDB4MDUsIDB4MDUsIDB4MzMsCisgICAgMHgwNiwgMHgwNywgMHgwNywgMHgwOCwKKyAgICAweDA2LCAweDA3LCAweDA4LCAweDA5LAorICAgIDB4MDYsIDB4MDgsIDB4MDksIDB4MEEsCisgICAgMHgwNiwgMHgwNywgMHgwOSwgMHgwQSwKKyAgICAweDA2LCAweDA3LCAweDA4LCAweDBBLAorICAgIDB4MDYsIDB4MDgsIDB4MDksIDB4MEIsCisgICAgMHgwNiwgMHgwOCwgMHgwQSwgMHgwQiwKKyAgICAweDA2LCAweDA3LCAweDBBLCAweDBCLAorICAgIDB4MDYsIDB4MDcsIDB4MDksIDB4MEIsCisgICAgMHgwNiwgMHgwOCwgMHgwQSwgMHgwQywKKyAgICAweDA2LCAweDA5LCAweDBCLCAweDBDLAorICAgIDB4MDYsIDB4MDcsIDB4MEIsIDB4MEMsCisgICAgMHgwNiwgMHgwNywgMHgwOSwgMHgwQywKKyAgICAweDA2LCAweDBDLCAweDBDLCAweDBDLAorICAgIDB4MDYsIDB4MDYsIDB4MEMsIDB4MEMsCisgICAgMHgwNiwgMHgwNiwgMHgwNiwgMHgwQywKKyAgICAweDA2LCAweDA5LCAweDBBLCAweDBELAorICAgIDB4MDYsIDB4MDksIDB4MEMsIDB4MEQsCisgICAgMHgwNiwgMHgwNywgMHgwQywgMHgwRCwKKyAgICAweDA2LCAweDA3LCAweDBBLCAweDBELAorICAgIDB4MDYsIDB4MDksIDB4MEIsIDB4MEUsCisgICAgMHgwNiwgMHgwQSwgMHgwQywgMHgwRSwKKyAgICAweDA2LCAweDA4LCAweDBDLCAweDBFLAorICAgIDB4MDYsIDB4MDgsIDB4MEEsIDB4MEUsCisgICAgMHgwNiwgMHgwRSwgMHgwRSwgMHgwRSwKKyAgICAweDA2LCAweDA2LCAweDBFLCAweDBFLAorICAgIDB4MDYsIDB4MDYsIDB4MDYsIDB4MEUsCisgICAgMHgwNiwgMHgwQSwgMHgwRCwgMHgxMSwKKyAgICAweDA2LCAweDBCLCAweDBGLCAweDExLAorICAgIDB4MDYsIDB4MDgsIDB4MEYsIDB4MTEsCisgICAgMHgwNiwgMHgwOCwgMHgwQywgMHgxMSwKKyAgICAweDA2LCAweDExLCAweDExLCAweDExLAorICAgIDB4MDYsIDB4MDYsIDB4MTEsIDB4MTEsCisgICAgMHgwNiwgMHgwNiwgMHgwNiwgMHgxMSwKKyAgICAweDA2LCAweDBCLCAweDBGLCAweDE0LAorICAgIDB4MDYsIDB4MEQsIDB4MTEsIDB4MTQsCisgICAgMHgwNiwgMHgwOSwgMHgxMSwgMHgxNCwKKyAgICAweDA2LCAweDA5LCAweDBELCAweDE0LAorICAgIDB4MDYsIDB4MTQsIDB4MTQsIDB4MTQsCisgICAgMHgwNiwgMHgwNiwgMHgxNCwgMHgxNCwKKyAgICAweDA2LCAweDA2LCAweDA2LCAweDE0LAorICAgIDB4MDYsIDB4MEMsIDB4MTEsIDB4MTcsCisgICAgMHgwNiwgMHgwRSwgMHgxMywgMHgxNywKKyAgICAweDA2LCAweDBBLCAweDEzLCAweDE3LAorICAgIDB4MDYsIDB4MEEsIDB4MEYsIDB4MTcsCisgICAgMHgwNiwgMHgxNywgMHgxNywgMHgxNywKKyAgICAweDA2LCAweDA2LCAweDE3LCAweDE3LAorICAgIDB4MDYsIDB4MDYsIDB4MDYsIDB4MTcsCisgICAgMHgwNiwgMHgwRCwgMHgxMywgMHgxQSwKKyAgICAweDA2LCAweDEwLCAweDE1LCAweDFBLAorICAgIDB4MDYsIDB4MEIsIDB4MTUsIDB4MUEsCisgICAgMHgwNiwgMHgwQiwgMHgxMCwgMHgxQSwKKyAgICAweDA2LCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MDYsIDB4MDYsIDB4MUEsIDB4MUEsCisgICAgMHgwNiwgMHgwNiwgMHgwNiwgMHgxQSwKKyAgICAweDA2LCAweDExLCAweDE4LCAweDFELAorICAgIDB4MDYsIDB4MEIsIDB4MTgsIDB4MUQsCisgICAgMHgwNiwgMHgwQiwgMHgxMiwgMHgxRCwKKyAgICAweDA2LCAweDFELCAweDFELCAweDFELAorICAgIDB4MDYsIDB4MDYsIDB4MUQsIDB4MUQsCisgICAgMHgwNiwgMHgwNiwgMHgwNiwgMHgxRCwKKyAgICAweDA2LCAweDEzLCAweDFBLCAweDIwLAorICAgIDB4MDYsIDB4MEMsIDB4MUEsIDB4MjAsCisgICAgMHgwNiwgMHgwQywgMHgxMywgMHgyMCwKKyAgICAweDA2LCAweDIwLCAweDIwLCAweDIwLAorICAgIDB4MDYsIDB4MDYsIDB4MjAsIDB4MjAsCisgICAgMHgwNiwgMHgwNiwgMHgwNiwgMHgyMCwKKyAgICAweDA2LCAweDE0LCAweDFDLCAweDIzLAorICAgIDB4MDYsIDB4MEQsIDB4MUMsIDB4MjMsCisgICAgMHgwNiwgMHgwRCwgMHgxNSwgMHgyMywKKyAgICAweDA2LCAweDIzLCAweDIzLCAweDIzLAorICAgIDB4MDYsIDB4MDYsIDB4MjMsIDB4MjMsCisgICAgMHgwNiwgMHgwNiwgMHgwNiwgMHgyMywKKyAgICAweDA2LCAweDE2LCAweDFFLCAweDI2LAorICAgIDB4MDYsIDB4MEUsIDB4MUUsIDB4MjYsCisgICAgMHgwNiwgMHgwRSwgMHgxNiwgMHgyNiwKKyAgICAweDA2LCAweDI2LCAweDI2LCAweDI2LAorICAgIDB4MDYsIDB4MDYsIDB4MjYsIDB4MjYsCisgICAgMHgwNiwgMHgwNiwgMHgwNiwgMHgyNiwKKyAgICAweDA2LCAweDI5LCAweDI5LCAweDI5LAorICAgIDB4MDYsIDB4MDYsIDB4MjksIDB4MjksCisgICAgMHgwNiwgMHgwNiwgMHgwNiwgMHgyOSwKKyAgICAweDA2LCAweDE4LCAweDIxLCAweDJBLAorICAgIDB4MDYsIDB4MEYsIDB4MjEsIDB4MkEsCisgICAgMHgwNiwgMHgwRiwgMHgxOCwgMHgyQSwKKyAgICAweDA2LCAweDJFLCAweDJFLCAweDJFLAorICAgIDB4MDYsIDB4MDYsIDB4MkUsIDB4MkUsCisgICAgMHgwNiwgMHgwNiwgMHgwNiwgMHgyRSwKKyAgICAweDA2LCAweDM0LCAweDM0LCAweDM0LAorICAgIDB4MDYsIDB4MDYsIDB4MzQsIDB4MzQsCisgICAgMHgwNiwgMHgwNiwgMHgwNiwgMHgzNCwKKyAgICAweDA3LCAweDA4LCAweDA4LCAweDA5LAorICAgIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsCisgICAgMHgwNywgMHgwOSwgMHgwQSwgMHgwQiwKKyAgICAweDA3LCAweDA4LCAweDBBLCAweDBCLAorICAgIDB4MDcsIDB4MDgsIDB4MDksIDB4MEIsCisgICAgMHgwNywgMHgwOSwgMHgwQSwgMHgwQywKKyAgICAweDA3LCAweDA5LCAweDBCLCAweDBDLAorICAgIDB4MDcsIDB4MDgsIDB4MEIsIDB4MEMsCisgICAgMHgwNywgMHgwOCwgMHgwQSwgMHgwQywKKyAgICAweDA3LCAweDA5LCAweDBCLCAweDBELAorICAgIDB4MDcsIDB4MEEsIDB4MEMsIDB4MEQsCisgICAgMHgwNywgMHgwOCwgMHgwQywgMHgwRCwKKyAgICAweDA3LCAweDA4LCAweDBBLCAweDBELAorICAgIDB4MDcsIDB4MEQsIDB4MEQsIDB4MEQsCisgICAgMHgwNywgMHgwNywgMHgwRCwgMHgwRCwKKyAgICAweDA3LCAweDA3LCAweDA3LCAweDBELAorICAgIDB4MDcsIDB4MEEsIDB4MEIsIDB4MEUsCisgICAgMHgwNywgMHgwQSwgMHgwRCwgMHgwRSwKKyAgICAweDA3LCAweDA4LCAweDBELCAweDBFLAorICAgIDB4MDcsIDB4MDgsIDB4MEIsIDB4MEUsCisgICAgMHgwNywgMHgwQSwgMHgwQywgMHgwRiwKKyAgICAweDA3LCAweDBCLCAweDBELCAweDBGLAorICAgIDB4MDcsIDB4MDksIDB4MEQsIDB4MEYsCisgICAgMHgwNywgMHgwOSwgMHgwQiwgMHgwRiwKKyAgICAweDA3LCAweDBGLCAweDBGLCAweDBGLAorICAgIDB4MDcsIDB4MDcsIDB4MEYsIDB4MEYsCisgICAgMHgwNywgMHgwNywgMHgwNywgMHgwRiwKKyAgICAweDA3LCAweDBCLCAweDBFLCAweDEyLAorICAgIDB4MDcsIDB4MEMsIDB4MTAsIDB4MTIsCisgICAgMHgwNywgMHgwOSwgMHgxMCwgMHgxMiwKKyAgICAweDA3LCAweDA5LCAweDBELCAweDEyLAorICAgIDB4MDcsIDB4MTIsIDB4MTIsIDB4MTIsCisgICAgMHgwNywgMHgwNywgMHgxMiwgMHgxMiwKKyAgICAweDA3LCAweDA3LCAweDA3LCAweDEyLAorICAgIDB4MDcsIDB4MEMsIDB4MTAsIDB4MTUsCisgICAgMHgwNywgMHgwRSwgMHgxMiwgMHgxNSwKKyAgICAweDA3LCAweDBBLCAweDEyLCAweDE1LAorICAgIDB4MDcsIDB4MEEsIDB4MEUsIDB4MTUsCisgICAgMHgwNywgMHgxNSwgMHgxNSwgMHgxNSwKKyAgICAweDA3LCAweDA3LCAweDE1LCAweDE1LAorICAgIDB4MDcsIDB4MDcsIDB4MDcsIDB4MTUsCisgICAgMHgwNywgMHgwRCwgMHgxMiwgMHgxOCwKKyAgICAweDA3LCAweDBGLCAweDE0LCAweDE4LAorICAgIDB4MDcsIDB4MEIsIDB4MTQsIDB4MTgsCisgICAgMHgwNywgMHgwQiwgMHgxMCwgMHgxOCwKKyAgICAweDA3LCAweDE4LCAweDE4LCAweDE4LAorICAgIDB4MDcsIDB4MDcsIDB4MTgsIDB4MTgsCisgICAgMHgwNywgMHgwNywgMHgwNywgMHgxOCwKKyAgICAweDA3LCAweDBFLCAweDE0LCAweDFCLAorICAgIDB4MDcsIDB4MTEsIDB4MTYsIDB4MUIsCisgICAgMHgwNywgMHgwQywgMHgxNiwgMHgxQiwKKyAgICAweDA3LCAweDBDLCAweDExLCAweDFCLAorICAgIDB4MDcsIDB4MUIsIDB4MUIsIDB4MUIsCisgICAgMHgwNywgMHgwNywgMHgxQiwgMHgxQiwKKyAgICAweDA3LCAweDA3LCAweDA3LCAweDFCLAorICAgIDB4MDcsIDB4MTIsIDB4MTksIDB4MUUsCisgICAgMHgwNywgMHgwQywgMHgxOSwgMHgxRSwKKyAgICAweDA3LCAweDBDLCAweDEzLCAweDFFLAorICAgIDB4MDcsIDB4MUUsIDB4MUUsIDB4MUUsCisgICAgMHgwNywgMHgwNywgMHgxRSwgMHgxRSwKKyAgICAweDA3LCAweDA3LCAweDA3LCAweDFFLAorICAgIDB4MDcsIDB4MTQsIDB4MUIsIDB4MjEsCisgICAgMHgwNywgMHgwRCwgMHgxQiwgMHgyMSwKKyAgICAweDA3LCAweDBELCAweDE0LCAweDIxLAorICAgIDB4MDcsIDB4MjEsIDB4MjEsIDB4MjEsCisgICAgMHgwNywgMHgwNywgMHgyMSwgMHgyMSwKKyAgICAweDA3LCAweDA3LCAweDA3LCAweDIxLAorICAgIDB4MDcsIDB4MTUsIDB4MUQsIDB4MjQsCisgICAgMHgwNywgMHgwRSwgMHgxRCwgMHgyNCwKKyAgICAweDA3LCAweDBFLCAweDE2LCAweDI0LAorICAgIDB4MDcsIDB4MjQsIDB4MjQsIDB4MjQsCisgICAgMHgwNywgMHgwNywgMHgyNCwgMHgyNCwKKyAgICAweDA3LCAweDA3LCAweDA3LCAweDI0LAorICAgIDB4MDcsIDB4MTcsIDB4MUYsIDB4MjcsCisgICAgMHgwNywgMHgwRiwgMHgxRiwgMHgyNywKKyAgICAweDA3LCAweDBGLCAweDE3LCAweDI3LAorICAgIDB4MDcsIDB4MjcsIDB4MjcsIDB4MjcsCisgICAgMHgwNywgMHgwNywgMHgyNywgMHgyNywKKyAgICAweDA3LCAweDA3LCAweDA3LCAweDI3LAorICAgIDB4MDcsIDB4MkEsIDB4MkEsIDB4MkEsCisgICAgMHgwNywgMHgwNywgMHgyQSwgMHgyQSwKKyAgICAweDA3LCAweDA3LCAweDA3LCAweDJBLAorICAgIDB4MDcsIDB4MTksIDB4MjIsIDB4MkIsCisgICAgMHgwNywgMHgxMCwgMHgyMiwgMHgyQiwKKyAgICAweDA3LCAweDEwLCAweDE5LCAweDJCLAorICAgIDB4MDcsIDB4MkYsIDB4MkYsIDB4MkYsCisgICAgMHgwNywgMHgwNywgMHgyRiwgMHgyRiwKKyAgICAweDA3LCAweDA3LCAweDA3LCAweDJGLAorICAgIDB4MDcsIDB4MzUsIDB4MzUsIDB4MzUsCisgICAgMHgwNywgMHgwNywgMHgzNSwgMHgzNSwKKyAgICAweDA3LCAweDA3LCAweDA3LCAweDM1LAorICAgIDB4MDgsIDB4MDksIDB4MDksIDB4MEEsCisgICAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwKKyAgICAweDA4LCAweDBBLCAweDBCLCAweDBDLAorICAgIDB4MDgsIDB4MDksIDB4MEIsIDB4MEMsCisgICAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQywKKyAgICAweDA4LCAweDBBLCAweDBCLCAweDBELAorICAgIDB4MDgsIDB4MEEsIDB4MEMsIDB4MEQsCisgICAgMHgwOCwgMHgwOSwgMHgwQywgMHgwRCwKKyAgICAweDA4LCAweDA5LCAweDBCLCAweDBELAorICAgIDB4MDgsIDB4MEEsIDB4MEMsIDB4MEUsCisgICAgMHgwOCwgMHgwQiwgMHgwRCwgMHgwRSwKKyAgICAweDA4LCAweDA5LCAweDBELCAweDBFLAorICAgIDB4MDgsIDB4MDksIDB4MEIsIDB4MEUsCisgICAgMHgwOCwgMHgwRSwgMHgwRSwgMHgwRSwKKyAgICAweDA4LCAweDA4LCAweDBFLCAweDBFLAorICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MEUsCisgICAgMHgwOCwgMHgwQiwgMHgwQywgMHgwRiwKKyAgICAweDA4LCAweDBCLCAweDBFLCAweDBGLAorICAgIDB4MDgsIDB4MDksIDB4MEUsIDB4MEYsCisgICAgMHgwOCwgMHgwOSwgMHgwQywgMHgwRiwKKyAgICAweDA4LCAweDBCLCAweDBELCAweDEwLAorICAgIDB4MDgsIDB4MEMsIDB4MEUsIDB4MTAsCisgICAgMHgwOCwgMHgwQSwgMHgwRSwgMHgxMCwKKyAgICAweDA4LCAweDBBLCAweDBDLCAweDEwLAorICAgIDB4MDgsIDB4MTAsIDB4MTAsIDB4MTAsCisgICAgMHgwOCwgMHgwOCwgMHgxMCwgMHgxMCwKKyAgICAweDA4LCAweDA4LCAweDA4LCAweDEwLAorICAgIDB4MDgsIDB4MEMsIDB4MEYsIDB4MTMsCisgICAgMHgwOCwgMHgwRCwgMHgxMSwgMHgxMywKKyAgICAweDA4LCAweDBBLCAweDExLCAweDEzLAorICAgIDB4MDgsIDB4MEEsIDB4MEUsIDB4MTMsCisgICAgMHgwOCwgMHgxMywgMHgxMywgMHgxMywKKyAgICAweDA4LCAweDA4LCAweDEzLCAweDEzLAorICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MTMsCisgICAgMHgwOCwgMHgwRCwgMHgxMSwgMHgxNiwKKyAgICAweDA4LCAweDBGLCAweDEzLCAweDE2LAorICAgIDB4MDgsIDB4MEIsIDB4MTMsIDB4MTYsCisgICAgMHgwOCwgMHgwQiwgMHgwRiwgMHgxNiwKKyAgICAweDA4LCAweDE2LCAweDE2LCAweDE2LAorICAgIDB4MDgsIDB4MDgsIDB4MTYsIDB4MTYsCisgICAgMHgwOCwgMHgwOCwgMHgwOCwgMHgxNiwKKyAgICAweDA4LCAweDBFLCAweDEzLCAweDE5LAorICAgIDB4MDgsIDB4MTAsIDB4MTUsIDB4MTksCisgICAgMHgwOCwgMHgwQywgMHgxNSwgMHgxOSwKKyAgICAweDA4LCAweDBDLCAweDExLCAweDE5LAorICAgIDB4MDgsIDB4MTksIDB4MTksIDB4MTksCisgICAgMHgwOCwgMHgwOCwgMHgxOSwgMHgxOSwKKyAgICAweDA4LCAweDA4LCAweDA4LCAweDE5LAorICAgIDB4MDgsIDB4MEYsIDB4MTUsIDB4MUMsCisgICAgMHgwOCwgMHgxMiwgMHgxNywgMHgxQywKKyAgICAweDA4LCAweDBELCAweDE3LCAweDFDLAorICAgIDB4MDgsIDB4MEQsIDB4MTIsIDB4MUMsCisgICAgMHgwOCwgMHgxQywgMHgxQywgMHgxQywKKyAgICAweDA4LCAweDA4LCAweDFDLCAweDFDLAorICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MUMsCisgICAgMHgwOCwgMHgxMywgMHgxQSwgMHgxRiwKKyAgICAweDA4LCAweDBELCAweDFBLCAweDFGLAorICAgIDB4MDgsIDB4MEQsIDB4MTQsIDB4MUYsCisgICAgMHgwOCwgMHgxRiwgMHgxRiwgMHgxRiwKKyAgICAweDA4LCAweDA4LCAweDFGLCAweDFGLAorICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MUYsCisgICAgMHgwOCwgMHgxNSwgMHgxQywgMHgyMiwKKyAgICAweDA4LCAweDBFLCAweDFDLCAweDIyLAorICAgIDB4MDgsIDB4MEUsIDB4MTUsIDB4MjIsCisgICAgMHgwOCwgMHgyMiwgMHgyMiwgMHgyMiwKKyAgICAweDA4LCAweDA4LCAweDIyLCAweDIyLAorICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MjIsCisgICAgMHgwOCwgMHgxNiwgMHgxRSwgMHgyNSwKKyAgICAweDA4LCAweDBGLCAweDFFLCAweDI1LAorICAgIDB4MDgsIDB4MEYsIDB4MTcsIDB4MjUsCisgICAgMHgwOCwgMHgyNSwgMHgyNSwgMHgyNSwKKyAgICAweDA4LCAweDA4LCAweDI1LCAweDI1LAorICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MjUsCisgICAgMHgwOCwgMHgxOCwgMHgyMCwgMHgyOCwKKyAgICAweDA4LCAweDEwLCAweDIwLCAweDI4LAorICAgIDB4MDgsIDB4MTAsIDB4MTgsIDB4MjgsCisgICAgMHgwOCwgMHgyOCwgMHgyOCwgMHgyOCwKKyAgICAweDA4LCAweDA4LCAweDI4LCAweDI4LAorICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MjgsCisgICAgMHgwOCwgMHgyQiwgMHgyQiwgMHgyQiwKKyAgICAweDA4LCAweDA4LCAweDJCLCAweDJCLAorICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MkIsCisgICAgMHgwOCwgMHgxQSwgMHgyMywgMHgyQywKKyAgICAweDA4LCAweDExLCAweDIzLCAweDJDLAorICAgIDB4MDgsIDB4MTEsIDB4MUEsIDB4MkMsCisgICAgMHgwOCwgMHgzMCwgMHgzMCwgMHgzMCwKKyAgICAweDA4LCAweDA4LCAweDMwLCAweDMwLAorICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MzAsCisgICAgMHgwOCwgMHgzNiwgMHgzNiwgMHgzNiwKKyAgICAweDA4LCAweDA4LCAweDM2LCAweDM2LAorICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MzYsCisgICAgMHgwOSwgMHgwQSwgMHgwQSwgMHgwQiwKKyAgICAweDA5LCAweDBBLCAweDBCLCAweDBDLAorICAgIDB4MDksIDB4MEIsIDB4MEMsIDB4MEQsCisgICAgMHgwOSwgMHgwQSwgMHgwQywgMHgwRCwKKyAgICAweDA5LCAweDBBLCAweDBCLCAweDBELAorICAgIDB4MDksIDB4MEIsIDB4MEMsIDB4MEUsCisgICAgMHgwOSwgMHgwQiwgMHgwRCwgMHgwRSwKKyAgICAweDA5LCAweDBBLCAweDBELCAweDBFLAorICAgIDB4MDksIDB4MEEsIDB4MEMsIDB4MEUsCisgICAgMHgwOSwgMHgwQiwgMHgwRCwgMHgwRiwKKyAgICAweDA5LCAweDBDLCAweDBFLCAweDBGLAorICAgIDB4MDksIDB4MEEsIDB4MEUsIDB4MEYsCisgICAgMHgwOSwgMHgwQSwgMHgwQywgMHgwRiwKKyAgICAweDA5LCAweDBGLCAweDBGLCAweDBGLAorICAgIDB4MDksIDB4MDksIDB4MEYsIDB4MEYsCisgICAgMHgwOSwgMHgwOSwgMHgwOSwgMHgwRiwKKyAgICAweDA5LCAweDBDLCAweDBELCAweDEwLAorICAgIDB4MDksIDB4MEMsIDB4MEYsIDB4MTAsCisgICAgMHgwOSwgMHgwQSwgMHgwRiwgMHgxMCwKKyAgICAweDA5LCAweDBBLCAweDBELCAweDEwLAorICAgIDB4MDksIDB4MEMsIDB4MEUsIDB4MTEsCisgICAgMHgwOSwgMHgwRCwgMHgwRiwgMHgxMSwKKyAgICAweDA5LCAweDBCLCAweDBGLCAweDExLAorICAgIDB4MDksIDB4MEIsIDB4MEQsIDB4MTEsCisgICAgMHgwOSwgMHgxMSwgMHgxMSwgMHgxMSwKKyAgICAweDA5LCAweDA5LCAweDExLCAweDExLAorICAgIDB4MDksIDB4MDksIDB4MDksIDB4MTEsCisgICAgMHgwOSwgMHgwRCwgMHgxMCwgMHgxNCwKKyAgICAweDA5LCAweDBFLCAweDEyLCAweDE0LAorICAgIDB4MDksIDB4MEIsIDB4MTIsIDB4MTQsCisgICAgMHgwOSwgMHgwQiwgMHgwRiwgMHgxNCwKKyAgICAweDA5LCAweDE0LCAweDE0LCAweDE0LAorICAgIDB4MDksIDB4MDksIDB4MTQsIDB4MTQsCisgICAgMHgwOSwgMHgwOSwgMHgwOSwgMHgxNCwKKyAgICAweDA5LCAweDBFLCAweDEyLCAweDE3LAorICAgIDB4MDksIDB4MTAsIDB4MTQsIDB4MTcsCisgICAgMHgwOSwgMHgwQywgMHgxNCwgMHgxNywKKyAgICAweDA5LCAweDBDLCAweDEwLCAweDE3LAorICAgIDB4MDksIDB4MTcsIDB4MTcsIDB4MTcsCisgICAgMHgwOSwgMHgwOSwgMHgxNywgMHgxNywKKyAgICAweDA5LCAweDA5LCAweDA5LCAweDE3LAorICAgIDB4MDksIDB4MEYsIDB4MTQsIDB4MUEsCisgICAgMHgwOSwgMHgxMSwgMHgxNiwgMHgxQSwKKyAgICAweDA5LCAweDBELCAweDE2LCAweDFBLAorICAgIDB4MDksIDB4MEQsIDB4MTIsIDB4MUEsCisgICAgMHgwOSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDA5LCAweDA5LCAweDFBLCAweDFBLAorICAgIDB4MDksIDB4MDksIDB4MDksIDB4MUEsCisgICAgMHgwOSwgMHgxMCwgMHgxNiwgMHgxRCwKKyAgICAweDA5LCAweDEzLCAweDE4LCAweDFELAorICAgIDB4MDksIDB4MEUsIDB4MTgsIDB4MUQsCisgICAgMHgwOSwgMHgwRSwgMHgxMywgMHgxRCwKKyAgICAweDA5LCAweDFELCAweDFELCAweDFELAorICAgIDB4MDksIDB4MDksIDB4MUQsIDB4MUQsCisgICAgMHgwOSwgMHgwOSwgMHgwOSwgMHgxRCwKKyAgICAweDA5LCAweDE0LCAweDFCLCAweDIwLAorICAgIDB4MDksIDB4MEUsIDB4MUIsIDB4MjAsCisgICAgMHgwOSwgMHgwRSwgMHgxNSwgMHgyMCwKKyAgICAweDA5LCAweDIwLCAweDIwLCAweDIwLAorICAgIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsCisgICAgMHgwOSwgMHgwOSwgMHgwOSwgMHgyMCwKKyAgICAweDA5LCAweDE2LCAweDFELCAweDIzLAorICAgIDB4MDksIDB4MEYsIDB4MUQsIDB4MjMsCisgICAgMHgwOSwgMHgwRiwgMHgxNiwgMHgyMywKKyAgICAweDA5LCAweDIzLCAweDIzLCAweDIzLAorICAgIDB4MDksIDB4MDksIDB4MjMsIDB4MjMsCisgICAgMHgwOSwgMHgwOSwgMHgwOSwgMHgyMywKKyAgICAweDA5LCAweDE3LCAweDFGLCAweDI2LAorICAgIDB4MDksIDB4MTAsIDB4MUYsIDB4MjYsCisgICAgMHgwOSwgMHgxMCwgMHgxOCwgMHgyNiwKKyAgICAweDA5LCAweDI2LCAweDI2LCAweDI2LAorICAgIDB4MDksIDB4MDksIDB4MjYsIDB4MjYsCisgICAgMHgwOSwgMHgwOSwgMHgwOSwgMHgyNiwKKyAgICAweDA5LCAweDE5LCAweDIxLCAweDI5LAorICAgIDB4MDksIDB4MTEsIDB4MjEsIDB4MjksCisgICAgMHgwOSwgMHgxMSwgMHgxOSwgMHgyOSwKKyAgICAweDA5LCAweDI5LCAweDI5LCAweDI5LAorICAgIDB4MDksIDB4MDksIDB4MjksIDB4MjksCisgICAgMHgwOSwgMHgwOSwgMHgwOSwgMHgyOSwKKyAgICAweDA5LCAweDJDLCAweDJDLCAweDJDLAorICAgIDB4MDksIDB4MDksIDB4MkMsIDB4MkMsCisgICAgMHgwOSwgMHgwOSwgMHgwOSwgMHgyQywKKyAgICAweDA5LCAweDFCLCAweDI0LCAweDJELAorICAgIDB4MDksIDB4MTIsIDB4MjQsIDB4MkQsCisgICAgMHgwOSwgMHgxMiwgMHgxQiwgMHgyRCwKKyAgICAweDA5LCAweDMxLCAweDMxLCAweDMxLAorICAgIDB4MDksIDB4MDksIDB4MzEsIDB4MzEsCisgICAgMHgwOSwgMHgwOSwgMHgwOSwgMHgzMSwKKyAgICAweDA5LCAweDM3LCAweDM3LCAweDM3LAorICAgIDB4MDksIDB4MDksIDB4MzcsIDB4MzcsCisgICAgMHgwOSwgMHgwOSwgMHgwOSwgMHgzNywKKyAgICAweDBBLCAweDBCLCAweDBCLCAweDBDLAorICAgIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsCisgICAgMHgwQSwgMHgwQywgMHgwRCwgMHgwRSwKKyAgICAweDBBLCAweDBCLCAweDBELCAweDBFLAorICAgIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEUsCisgICAgMHgwQSwgMHgwQywgMHgwRCwgMHgwRiwKKyAgICAweDBBLCAweDBDLCAweDBFLCAweDBGLAorICAgIDB4MEEsIDB4MEIsIDB4MEUsIDB4MEYsCisgICAgMHgwQSwgMHgwQiwgMHgwRCwgMHgwRiwKKyAgICAweDBBLCAweDBDLCAweDBFLCAweDEwLAorICAgIDB4MEEsIDB4MEQsIDB4MEYsIDB4MTAsCisgICAgMHgwQSwgMHgwQiwgMHgwRiwgMHgxMCwKKyAgICAweDBBLCAweDBCLCAweDBELCAweDEwLAorICAgIDB4MEEsIDB4MTAsIDB4MTAsIDB4MTAsCisgICAgMHgwQSwgMHgwQSwgMHgxMCwgMHgxMCwKKyAgICAweDBBLCAweDBBLCAweDBBLCAweDEwLAorICAgIDB4MEEsIDB4MEQsIDB4MEUsIDB4MTEsCisgICAgMHgwQSwgMHgwRCwgMHgxMCwgMHgxMSwKKyAgICAweDBBLCAweDBCLCAweDEwLCAweDExLAorICAgIDB4MEEsIDB4MEIsIDB4MEUsIDB4MTEsCisgICAgMHgwQSwgMHgwRCwgMHgwRiwgMHgxMiwKKyAgICAweDBBLCAweDBFLCAweDEwLCAweDEyLAorICAgIDB4MEEsIDB4MEMsIDB4MTAsIDB4MTIsCisgICAgMHgwQSwgMHgwQywgMHgwRSwgMHgxMiwKKyAgICAweDBBLCAweDEyLCAweDEyLCAweDEyLAorICAgIDB4MEEsIDB4MEEsIDB4MTIsIDB4MTIsCisgICAgMHgwQSwgMHgwQSwgMHgwQSwgMHgxMiwKKyAgICAweDBBLCAweDBFLCAweDExLCAweDE1LAorICAgIDB4MEEsIDB4MEYsIDB4MTMsIDB4MTUsCisgICAgMHgwQSwgMHgwQywgMHgxMywgMHgxNSwKKyAgICAweDBBLCAweDBDLCAweDEwLCAweDE1LAorICAgIDB4MEEsIDB4MTUsIDB4MTUsIDB4MTUsCisgICAgMHgwQSwgMHgwQSwgMHgxNSwgMHgxNSwKKyAgICAweDBBLCAweDBBLCAweDBBLCAweDE1LAorICAgIDB4MEEsIDB4MEYsIDB4MTMsIDB4MTgsCisgICAgMHgwQSwgMHgxMSwgMHgxNSwgMHgxOCwKKyAgICAweDBBLCAweDBELCAweDE1LCAweDE4LAorICAgIDB4MEEsIDB4MEQsIDB4MTEsIDB4MTgsCisgICAgMHgwQSwgMHgxOCwgMHgxOCwgMHgxOCwKKyAgICAweDBBLCAweDBBLCAweDE4LCAweDE4LAorICAgIDB4MEEsIDB4MEEsIDB4MEEsIDB4MTgsCisgICAgMHgwQSwgMHgxMCwgMHgxNSwgMHgxQiwKKyAgICAweDBBLCAweDEyLCAweDE3LCAweDFCLAorICAgIDB4MEEsIDB4MEUsIDB4MTcsIDB4MUIsCisgICAgMHgwQSwgMHgwRSwgMHgxMywgMHgxQiwKKyAgICAweDBBLCAweDFCLCAweDFCLCAweDFCLAorICAgIDB4MEEsIDB4MEEsIDB4MUIsIDB4MUIsCisgICAgMHgwQSwgMHgwQSwgMHgwQSwgMHgxQiwKKyAgICAweDBBLCAweDExLCAweDE3LCAweDFFLAorICAgIDB4MEEsIDB4MTQsIDB4MTksIDB4MUUsCisgICAgMHgwQSwgMHgwRiwgMHgxOSwgMHgxRSwKKyAgICAweDBBLCAweDBGLCAweDE0LCAweDFFLAorICAgIDB4MEEsIDB4MUUsIDB4MUUsIDB4MUUsCisgICAgMHgwQSwgMHgwQSwgMHgxRSwgMHgxRSwKKyAgICAweDBBLCAweDBBLCAweDBBLCAweDFFLAorICAgIDB4MEEsIDB4MTUsIDB4MUMsIDB4MjEsCisgICAgMHgwQSwgMHgwRiwgMHgxQywgMHgyMSwKKyAgICAweDBBLCAweDBGLCAweDE2LCAweDIxLAorICAgIDB4MEEsIDB4MjEsIDB4MjEsIDB4MjEsCisgICAgMHgwQSwgMHgwQSwgMHgyMSwgMHgyMSwKKyAgICAweDBBLCAweDBBLCAweDBBLCAweDIxLAorICAgIDB4MEEsIDB4MTcsIDB4MUUsIDB4MjQsCisgICAgMHgwQSwgMHgxMCwgMHgxRSwgMHgyNCwKKyAgICAweDBBLCAweDEwLCAweDE3LCAweDI0LAorICAgIDB4MEEsIDB4MjQsIDB4MjQsIDB4MjQsCisgICAgMHgwQSwgMHgwQSwgMHgyNCwgMHgyNCwKKyAgICAweDBBLCAweDBBLCAweDBBLCAweDI0LAorICAgIDB4MEEsIDB4MTgsIDB4MjAsIDB4MjcsCisgICAgMHgwQSwgMHgxMSwgMHgyMCwgMHgyNywKKyAgICAweDBBLCAweDExLCAweDE5LCAweDI3LAorICAgIDB4MEEsIDB4MjcsIDB4MjcsIDB4MjcsCisgICAgMHgwQSwgMHgwQSwgMHgyNywgMHgyNywKKyAgICAweDBBLCAweDBBLCAweDBBLCAweDI3LAorICAgIDB4MEEsIDB4MUEsIDB4MjIsIDB4MkEsCisgICAgMHgwQSwgMHgxMiwgMHgyMiwgMHgyQSwKKyAgICAweDBBLCAweDEyLCAweDFBLCAweDJBLAorICAgIDB4MEEsIDB4MkEsIDB4MkEsIDB4MkEsCisgICAgMHgwQSwgMHgwQSwgMHgyQSwgMHgyQSwKKyAgICAweDBBLCAweDBBLCAweDBBLCAweDJBLAorICAgIDB4MEEsIDB4MkQsIDB4MkQsIDB4MkQsCisgICAgMHgwQSwgMHgwQSwgMHgyRCwgMHgyRCwKKyAgICAweDBBLCAweDBBLCAweDBBLCAweDJELAorICAgIDB4MEEsIDB4MUMsIDB4MjUsIDB4MkUsCisgICAgMHgwQSwgMHgxMywgMHgyNSwgMHgyRSwKKyAgICAweDBBLCAweDEzLCAweDFDLCAweDJFLAorICAgIDB4MEEsIDB4MzIsIDB4MzIsIDB4MzIsCisgICAgMHgwQSwgMHgwQSwgMHgzMiwgMHgzMiwKKyAgICAweDBBLCAweDBBLCAweDBBLCAweDMyLAorICAgIDB4MEEsIDB4MzgsIDB4MzgsIDB4MzgsCisgICAgMHgwQSwgMHgwQSwgMHgzOCwgMHgzOCwKKyAgICAweDBBLCAweDBBLCAweDBBLCAweDM4LAorICAgIDB4MEIsIDB4MEMsIDB4MEMsIDB4MEQsCisgICAgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwKKyAgICAweDBCLCAweDBELCAweDBFLCAweDBGLAorICAgIDB4MEIsIDB4MEMsIDB4MEUsIDB4MEYsCisgICAgMHgwQiwgMHgwQywgMHgwRCwgMHgwRiwKKyAgICAweDBCLCAweDBELCAweDBFLCAweDEwLAorICAgIDB4MEIsIDB4MEQsIDB4MEYsIDB4MTAsCisgICAgMHgwQiwgMHgwQywgMHgwRiwgMHgxMCwKKyAgICAweDBCLCAweDBDLCAweDBFLCAweDEwLAorICAgIDB4MEIsIDB4MEQsIDB4MEYsIDB4MTEsCisgICAgMHgwQiwgMHgwRSwgMHgxMCwgMHgxMSwKKyAgICAweDBCLCAweDBDLCAweDEwLCAweDExLAorICAgIDB4MEIsIDB4MEMsIDB4MEUsIDB4MTEsCisgICAgMHgwQiwgMHgxMSwgMHgxMSwgMHgxMSwKKyAgICAweDBCLCAweDBCLCAweDExLCAweDExLAorICAgIDB4MEIsIDB4MEIsIDB4MEIsIDB4MTEsCisgICAgMHgwQiwgMHgwRSwgMHgwRiwgMHgxMiwKKyAgICAweDBCLCAweDBFLCAweDExLCAweDEyLAorICAgIDB4MEIsIDB4MEMsIDB4MTEsIDB4MTIsCisgICAgMHgwQiwgMHgwQywgMHgwRiwgMHgxMiwKKyAgICAweDBCLCAweDBFLCAweDEwLCAweDEzLAorICAgIDB4MEIsIDB4MEYsIDB4MTEsIDB4MTMsCisgICAgMHgwQiwgMHgwRCwgMHgxMSwgMHgxMywKKyAgICAweDBCLCAweDBELCAweDBGLCAweDEzLAorICAgIDB4MEIsIDB4MTMsIDB4MTMsIDB4MTMsCisgICAgMHgwQiwgMHgwQiwgMHgxMywgMHgxMywKKyAgICAweDBCLCAweDBCLCAweDBCLCAweDEzLAorICAgIDB4MEIsIDB4MEYsIDB4MTIsIDB4MTYsCisgICAgMHgwQiwgMHgxMCwgMHgxNCwgMHgxNiwKKyAgICAweDBCLCAweDBELCAweDE0LCAweDE2LAorICAgIDB4MEIsIDB4MEQsIDB4MTEsIDB4MTYsCisgICAgMHgwQiwgMHgxNiwgMHgxNiwgMHgxNiwKKyAgICAweDBCLCAweDBCLCAweDE2LCAweDE2LAorICAgIDB4MEIsIDB4MEIsIDB4MEIsIDB4MTYsCisgICAgMHgwQiwgMHgxMCwgMHgxNCwgMHgxOSwKKyAgICAweDBCLCAweDEyLCAweDE2LCAweDE5LAorICAgIDB4MEIsIDB4MEUsIDB4MTYsIDB4MTksCisgICAgMHgwQiwgMHgwRSwgMHgxMiwgMHgxOSwKKyAgICAweDBCLCAweDE5LCAweDE5LCAweDE5LAorICAgIDB4MEIsIDB4MEIsIDB4MTksIDB4MTksCisgICAgMHgwQiwgMHgwQiwgMHgwQiwgMHgxOSwKKyAgICAweDBCLCAweDExLCAweDE2LCAweDFDLAorICAgIDB4MEIsIDB4MTMsIDB4MTgsIDB4MUMsCisgICAgMHgwQiwgMHgwRiwgMHgxOCwgMHgxQywKKyAgICAweDBCLCAweDBGLCAweDE0LCAweDFDLAorICAgIDB4MEIsIDB4MUMsIDB4MUMsIDB4MUMsCisgICAgMHgwQiwgMHgwQiwgMHgxQywgMHgxQywKKyAgICAweDBCLCAweDBCLCAweDBCLCAweDFDLAorICAgIDB4MEIsIDB4MTIsIDB4MTgsIDB4MUYsCisgICAgMHgwQiwgMHgxNSwgMHgxQSwgMHgxRiwKKyAgICAweDBCLCAweDEwLCAweDFBLCAweDFGLAorICAgIDB4MEIsIDB4MTAsIDB4MTUsIDB4MUYsCisgICAgMHgwQiwgMHgxRiwgMHgxRiwgMHgxRiwKKyAgICAweDBCLCAweDBCLCAweDFGLCAweDFGLAorICAgIDB4MEIsIDB4MEIsIDB4MEIsIDB4MUYsCisgICAgMHgwQiwgMHgxNiwgMHgxRCwgMHgyMiwKKyAgICAweDBCLCAweDEwLCAweDFELCAweDIyLAorICAgIDB4MEIsIDB4MTAsIDB4MTcsIDB4MjIsCisgICAgMHgwQiwgMHgyMiwgMHgyMiwgMHgyMiwKKyAgICAweDBCLCAweDBCLCAweDIyLCAweDIyLAorICAgIDB4MEIsIDB4MEIsIDB4MEIsIDB4MjIsCisgICAgMHgwQiwgMHgxOCwgMHgxRiwgMHgyNSwKKyAgICAweDBCLCAweDExLCAweDFGLCAweDI1LAorICAgIDB4MEIsIDB4MTEsIDB4MTgsIDB4MjUsCisgICAgMHgwQiwgMHgyNSwgMHgyNSwgMHgyNSwKKyAgICAweDBCLCAweDBCLCAweDI1LCAweDI1LAorICAgIDB4MEIsIDB4MEIsIDB4MEIsIDB4MjUsCisgICAgMHgwQiwgMHgxOSwgMHgyMSwgMHgyOCwKKyAgICAweDBCLCAweDEyLCAweDIxLCAweDI4LAorICAgIDB4MEIsIDB4MTIsIDB4MUEsIDB4MjgsCisgICAgMHgwQiwgMHgyOCwgMHgyOCwgMHgyOCwKKyAgICAweDBCLCAweDBCLCAweDI4LCAweDI4LAorICAgIDB4MEIsIDB4MEIsIDB4MEIsIDB4MjgsCisgICAgMHgwQiwgMHgxQiwgMHgyMywgMHgyQiwKKyAgICAweDBCLCAweDEzLCAweDIzLCAweDJCLAorICAgIDB4MEIsIDB4MTMsIDB4MUIsIDB4MkIsCisgICAgMHgwQiwgMHgyQiwgMHgyQiwgMHgyQiwKKyAgICAweDBCLCAweDBCLCAweDJCLCAweDJCLAorICAgIDB4MEIsIDB4MEIsIDB4MEIsIDB4MkIsCisgICAgMHgwQiwgMHgyRSwgMHgyRSwgMHgyRSwKKyAgICAweDBCLCAweDBCLCAweDJFLCAweDJFLAorICAgIDB4MEIsIDB4MEIsIDB4MEIsIDB4MkUsCisgICAgMHgwQiwgMHgxRCwgMHgyNiwgMHgyRiwKKyAgICAweDBCLCAweDE0LCAweDI2LCAweDJGLAorICAgIDB4MEIsIDB4MTQsIDB4MUQsIDB4MkYsCisgICAgMHgwQiwgMHgzMywgMHgzMywgMHgzMywKKyAgICAweDBCLCAweDBCLCAweDMzLCAweDMzLAorICAgIDB4MEIsIDB4MEIsIDB4MEIsIDB4MzMsCisgICAgMHgwQiwgMHgzOSwgMHgzOSwgMHgzOSwKKyAgICAweDBCLCAweDBCLCAweDM5LCAweDM5LAorICAgIDB4MEIsIDB4MEIsIDB4MEIsIDB4MzksCisgICAgMHgwQywgMHgwRCwgMHgwRCwgMHgwRSwKKyAgICAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgIDB4MEMsIDB4MEUsIDB4MEYsIDB4MTAsCisgICAgMHgwQywgMHgwRCwgMHgwRiwgMHgxMCwKKyAgICAweDBDLCAweDBELCAweDBFLCAweDEwLAorICAgIDB4MEMsIDB4MEUsIDB4MEYsIDB4MTEsCisgICAgMHgwQywgMHgwRSwgMHgxMCwgMHgxMSwKKyAgICAweDBDLCAweDBELCAweDEwLCAweDExLAorICAgIDB4MEMsIDB4MEQsIDB4MEYsIDB4MTEsCisgICAgMHgwQywgMHgwRSwgMHgxMCwgMHgxMiwKKyAgICAweDBDLCAweDBGLCAweDExLCAweDEyLAorICAgIDB4MEMsIDB4MEQsIDB4MTEsIDB4MTIsCisgICAgMHgwQywgMHgwRCwgMHgwRiwgMHgxMiwKKyAgICAweDBDLCAweDEyLCAweDEyLCAweDEyLAorICAgIDB4MEMsIDB4MEMsIDB4MTIsIDB4MTIsCisgICAgMHgwQywgMHgwQywgMHgwQywgMHgxMiwKKyAgICAweDBDLCAweDBGLCAweDEwLCAweDEzLAorICAgIDB4MEMsIDB4MEYsIDB4MTIsIDB4MTMsCisgICAgMHgwQywgMHgwRCwgMHgxMiwgMHgxMywKKyAgICAweDBDLCAweDBELCAweDEwLCAweDEzLAorICAgIDB4MEMsIDB4MEYsIDB4MTEsIDB4MTQsCisgICAgMHgwQywgMHgxMCwgMHgxMiwgMHgxNCwKKyAgICAweDBDLCAweDBFLCAweDEyLCAweDE0LAorICAgIDB4MEMsIDB4MEUsIDB4MTAsIDB4MTQsCisgICAgMHgwQywgMHgxNCwgMHgxNCwgMHgxNCwKKyAgICAweDBDLCAweDBDLCAweDE0LCAweDE0LAorICAgIDB4MEMsIDB4MEMsIDB4MEMsIDB4MTQsCisgICAgMHgwQywgMHgxMCwgMHgxMywgMHgxNywKKyAgICAweDBDLCAweDExLCAweDE1LCAweDE3LAorICAgIDB4MEMsIDB4MEUsIDB4MTUsIDB4MTcsCisgICAgMHgwQywgMHgwRSwgMHgxMiwgMHgxNywKKyAgICAweDBDLCAweDE3LCAweDE3LCAweDE3LAorICAgIDB4MEMsIDB4MEMsIDB4MTcsIDB4MTcsCisgICAgMHgwQywgMHgwQywgMHgwQywgMHgxNywKKyAgICAweDBDLCAweDExLCAweDE1LCAweDFBLAorICAgIDB4MEMsIDB4MTMsIDB4MTcsIDB4MUEsCisgICAgMHgwQywgMHgwRiwgMHgxNywgMHgxQSwKKyAgICAweDBDLCAweDBGLCAweDEzLCAweDFBLAorICAgIDB4MEMsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgwQywgMHgwQywgMHgxQSwgMHgxQSwKKyAgICAweDBDLCAweDBDLCAweDBDLCAweDFBLAorICAgIDB4MEMsIDB4MTIsIDB4MTcsIDB4MUQsCisgICAgMHgwQywgMHgxNCwgMHgxOSwgMHgxRCwKKyAgICAweDBDLCAweDEwLCAweDE5LCAweDFELAorICAgIDB4MEMsIDB4MTAsIDB4MTUsIDB4MUQsCisgICAgMHgwQywgMHgxRCwgMHgxRCwgMHgxRCwKKyAgICAweDBDLCAweDBDLCAweDFELCAweDFELAorICAgIDB4MEMsIDB4MEMsIDB4MEMsIDB4MUQsCisgICAgMHgwQywgMHgxMywgMHgxOSwgMHgyMCwKKyAgICAweDBDLCAweDE2LCAweDFCLCAweDIwLAorICAgIDB4MEMsIDB4MTEsIDB4MUIsIDB4MjAsCisgICAgMHgwQywgMHgxMSwgMHgxNiwgMHgyMCwKKyAgICAweDBDLCAweDIwLCAweDIwLCAweDIwLAorICAgIDB4MEMsIDB4MEMsIDB4MjAsIDB4MjAsCisgICAgMHgwQywgMHgwQywgMHgwQywgMHgyMCwKKyAgICAweDBDLCAweDE3LCAweDFFLCAweDIzLAorICAgIDB4MEMsIDB4MTEsIDB4MUUsIDB4MjMsCisgICAgMHgwQywgMHgxMSwgMHgxOCwgMHgyMywKKyAgICAweDBDLCAweDIzLCAweDIzLCAweDIzLAorICAgIDB4MEMsIDB4MEMsIDB4MjMsIDB4MjMsCisgICAgMHgwQywgMHgwQywgMHgwQywgMHgyMywKKyAgICAweDBDLCAweDE5LCAweDIwLCAweDI2LAorICAgIDB4MEMsIDB4MTIsIDB4MjAsIDB4MjYsCisgICAgMHgwQywgMHgxMiwgMHgxOSwgMHgyNiwKKyAgICAweDBDLCAweDI2LCAweDI2LCAweDI2LAorICAgIDB4MEMsIDB4MEMsIDB4MjYsIDB4MjYsCisgICAgMHgwQywgMHgwQywgMHgwQywgMHgyNiwKKyAgICAweDBDLCAweDFBLCAweDIyLCAweDI5LAorICAgIDB4MEMsIDB4MTMsIDB4MjIsIDB4MjksCisgICAgMHgwQywgMHgxMywgMHgxQiwgMHgyOSwKKyAgICAweDBDLCAweDI5LCAweDI5LCAweDI5LAorICAgIDB4MEMsIDB4MEMsIDB4MjksIDB4MjksCisgICAgMHgwQywgMHgwQywgMHgwQywgMHgyOSwKKyAgICAweDBDLCAweDFDLCAweDI0LCAweDJDLAorICAgIDB4MEMsIDB4MTQsIDB4MjQsIDB4MkMsCisgICAgMHgwQywgMHgxNCwgMHgxQywgMHgyQywKKyAgICAweDBDLCAweDJDLCAweDJDLCAweDJDLAorICAgIDB4MEMsIDB4MEMsIDB4MkMsIDB4MkMsCisgICAgMHgwQywgMHgwQywgMHgwQywgMHgyQywKKyAgICAweDBDLCAweDJGLCAweDJGLCAweDJGLAorICAgIDB4MEMsIDB4MEMsIDB4MkYsIDB4MkYsCisgICAgMHgwQywgMHgwQywgMHgwQywgMHgyRiwKKyAgICAweDBDLCAweDFFLCAweDI3LCAweDMwLAorICAgIDB4MEMsIDB4MTUsIDB4MjcsIDB4MzAsCisgICAgMHgwQywgMHgxNSwgMHgxRSwgMHgzMCwKKyAgICAweDBDLCAweDM0LCAweDM0LCAweDM0LAorICAgIDB4MEMsIDB4MEMsIDB4MzQsIDB4MzQsCisgICAgMHgwQywgMHgwQywgMHgwQywgMHgzNCwKKyAgICAweDBDLCAweDNBLCAweDNBLCAweDNBLAorICAgIDB4MEMsIDB4MEMsIDB4M0EsIDB4M0EsCisgICAgMHgwQywgMHgwQywgMHgwQywgMHgzQSwKKyAgICAweDBELCAweDBFLCAweDBFLCAweDBGLAorICAgIDB4MEQsIDB4MEUsIDB4MEYsIDB4MTAsCisgICAgMHgwRCwgMHgwRiwgMHgxMCwgMHgxMSwKKyAgICAweDBELCAweDBFLCAweDEwLCAweDExLAorICAgIDB4MEQsIDB4MEUsIDB4MEYsIDB4MTEsCisgICAgMHgwRCwgMHgwRiwgMHgxMCwgMHgxMiwKKyAgICAweDBELCAweDBGLCAweDExLCAweDEyLAorICAgIDB4MEQsIDB4MEUsIDB4MTEsIDB4MTIsCisgICAgMHgwRCwgMHgwRSwgMHgxMCwgMHgxMiwKKyAgICAweDBELCAweDBGLCAweDExLCAweDEzLAorICAgIDB4MEQsIDB4MTAsIDB4MTIsIDB4MTMsCisgICAgMHgwRCwgMHgwRSwgMHgxMiwgMHgxMywKKyAgICAweDBELCAweDBFLCAweDEwLCAweDEzLAorICAgIDB4MEQsIDB4MTMsIDB4MTMsIDB4MTMsCisgICAgMHgwRCwgMHgwRCwgMHgxMywgMHgxMywKKyAgICAweDBELCAweDBELCAweDBELCAweDEzLAorICAgIDB4MEQsIDB4MTAsIDB4MTEsIDB4MTQsCisgICAgMHgwRCwgMHgxMCwgMHgxMywgMHgxNCwKKyAgICAweDBELCAweDBFLCAweDEzLCAweDE0LAorICAgIDB4MEQsIDB4MEUsIDB4MTEsIDB4MTQsCisgICAgMHgwRCwgMHgxMCwgMHgxMiwgMHgxNSwKKyAgICAweDBELCAweDExLCAweDEzLCAweDE1LAorICAgIDB4MEQsIDB4MEYsIDB4MTMsIDB4MTUsCisgICAgMHgwRCwgMHgwRiwgMHgxMSwgMHgxNSwKKyAgICAweDBELCAweDE1LCAweDE1LCAweDE1LAorICAgIDB4MEQsIDB4MEQsIDB4MTUsIDB4MTUsCisgICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgxNSwKKyAgICAweDBELCAweDExLCAweDE0LCAweDE4LAorICAgIDB4MEQsIDB4MTIsIDB4MTYsIDB4MTgsCisgICAgMHgwRCwgMHgwRiwgMHgxNiwgMHgxOCwKKyAgICAweDBELCAweDBGLCAweDEzLCAweDE4LAorICAgIDB4MEQsIDB4MTgsIDB4MTgsIDB4MTgsCisgICAgMHgwRCwgMHgwRCwgMHgxOCwgMHgxOCwKKyAgICAweDBELCAweDBELCAweDBELCAweDE4LAorICAgIDB4MEQsIDB4MTIsIDB4MTYsIDB4MUIsCisgICAgMHgwRCwgMHgxNCwgMHgxOCwgMHgxQiwKKyAgICAweDBELCAweDEwLCAweDE4LCAweDFCLAorICAgIDB4MEQsIDB4MTAsIDB4MTQsIDB4MUIsCisgICAgMHgwRCwgMHgxQiwgMHgxQiwgMHgxQiwKKyAgICAweDBELCAweDBELCAweDFCLCAweDFCLAorICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MUIsCisgICAgMHgwRCwgMHgxMywgMHgxOCwgMHgxRSwKKyAgICAweDBELCAweDE1LCAweDFBLCAweDFFLAorICAgIDB4MEQsIDB4MTEsIDB4MUEsIDB4MUUsCisgICAgMHgwRCwgMHgxMSwgMHgxNiwgMHgxRSwKKyAgICAweDBELCAweDFFLCAweDFFLCAweDFFLAorICAgIDB4MEQsIDB4MEQsIDB4MUUsIDB4MUUsCisgICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgxRSwKKyAgICAweDBELCAweDE0LCAweDFBLCAweDIxLAorICAgIDB4MEQsIDB4MTcsIDB4MUMsIDB4MjEsCisgICAgMHgwRCwgMHgxMiwgMHgxQywgMHgyMSwKKyAgICAweDBELCAweDEyLCAweDE3LCAweDIxLAorICAgIDB4MEQsIDB4MjEsIDB4MjEsIDB4MjEsCisgICAgMHgwRCwgMHgwRCwgMHgyMSwgMHgyMSwKKyAgICAweDBELCAweDBELCAweDBELCAweDIxLAorICAgIDB4MEQsIDB4MTgsIDB4MUYsIDB4MjQsCisgICAgMHgwRCwgMHgxMiwgMHgxRiwgMHgyNCwKKyAgICAweDBELCAweDEyLCAweDE5LCAweDI0LAorICAgIDB4MEQsIDB4MjQsIDB4MjQsIDB4MjQsCisgICAgMHgwRCwgMHgwRCwgMHgyNCwgMHgyNCwKKyAgICAweDBELCAweDBELCAweDBELCAweDI0LAorICAgIDB4MEQsIDB4MUEsIDB4MjEsIDB4MjcsCisgICAgMHgwRCwgMHgxMywgMHgyMSwgMHgyNywKKyAgICAweDBELCAweDEzLCAweDFBLCAweDI3LAorICAgIDB4MEQsIDB4MjcsIDB4MjcsIDB4MjcsCisgICAgMHgwRCwgMHgwRCwgMHgyNywgMHgyNywKKyAgICAweDBELCAweDBELCAweDBELCAweDI3LAorICAgIDB4MEQsIDB4MUIsIDB4MjMsIDB4MkEsCisgICAgMHgwRCwgMHgxNCwgMHgyMywgMHgyQSwKKyAgICAweDBELCAweDE0LCAweDFDLCAweDJBLAorICAgIDB4MEQsIDB4MkEsIDB4MkEsIDB4MkEsCisgICAgMHgwRCwgMHgwRCwgMHgyQSwgMHgyQSwKKyAgICAweDBELCAweDBELCAweDBELCAweDJBLAorICAgIDB4MEQsIDB4MUQsIDB4MjUsIDB4MkQsCisgICAgMHgwRCwgMHgxNSwgMHgyNSwgMHgyRCwKKyAgICAweDBELCAweDE1LCAweDFELCAweDJELAorICAgIDB4MEQsIDB4MkQsIDB4MkQsIDB4MkQsCisgICAgMHgwRCwgMHgwRCwgMHgyRCwgMHgyRCwKKyAgICAweDBELCAweDBELCAweDBELCAweDJELAorICAgIDB4MEQsIDB4MzAsIDB4MzAsIDB4MzAsCisgICAgMHgwRCwgMHgwRCwgMHgzMCwgMHgzMCwKKyAgICAweDBELCAweDBELCAweDBELCAweDMwLAorICAgIDB4MEQsIDB4MUYsIDB4MjgsIDB4MzEsCisgICAgMHgwRCwgMHgxNiwgMHgyOCwgMHgzMSwKKyAgICAweDBELCAweDE2LCAweDFGLCAweDMxLAorICAgIDB4MEQsIDB4MzUsIDB4MzUsIDB4MzUsCisgICAgMHgwRCwgMHgwRCwgMHgzNSwgMHgzNSwKKyAgICAweDBELCAweDBELCAweDBELCAweDM1LAorICAgIDB4MEQsIDB4M0IsIDB4M0IsIDB4M0IsCisgICAgMHgwRCwgMHgwRCwgMHgzQiwgMHgzQiwKKyAgICAweDBELCAweDBELCAweDBELCAweDNCLAorICAgIDB4MEUsIDB4MEYsIDB4MEYsIDB4MTAsCisgICAgMHgwRSwgMHgwRiwgMHgxMCwgMHgxMSwKKyAgICAweDBFLCAweDEwLCAweDExLCAweDEyLAorICAgIDB4MEUsIDB4MEYsIDB4MTEsIDB4MTIsCisgICAgMHgwRSwgMHgwRiwgMHgxMCwgMHgxMiwKKyAgICAweDBFLCAweDEwLCAweDExLCAweDEzLAorICAgIDB4MEUsIDB4MTAsIDB4MTIsIDB4MTMsCisgICAgMHgwRSwgMHgwRiwgMHgxMiwgMHgxMywKKyAgICAweDBFLCAweDBGLCAweDExLCAweDEzLAorICAgIDB4MEUsIDB4MTAsIDB4MTIsIDB4MTQsCisgICAgMHgwRSwgMHgxMSwgMHgxMywgMHgxNCwKKyAgICAweDBFLCAweDBGLCAweDEzLCAweDE0LAorICAgIDB4MEUsIDB4MEYsIDB4MTEsIDB4MTQsCisgICAgMHgwRSwgMHgxNCwgMHgxNCwgMHgxNCwKKyAgICAweDBFLCAweDBFLCAweDE0LCAweDE0LAorICAgIDB4MEUsIDB4MEUsIDB4MEUsIDB4MTQsCisgICAgMHgwRSwgMHgxMSwgMHgxMiwgMHgxNSwKKyAgICAweDBFLCAweDExLCAweDE0LCAweDE1LAorICAgIDB4MEUsIDB4MEYsIDB4MTQsIDB4MTUsCisgICAgMHgwRSwgMHgwRiwgMHgxMiwgMHgxNSwKKyAgICAweDBFLCAweDExLCAweDEzLCAweDE2LAorICAgIDB4MEUsIDB4MTIsIDB4MTQsIDB4MTYsCisgICAgMHgwRSwgMHgxMCwgMHgxNCwgMHgxNiwKKyAgICAweDBFLCAweDEwLCAweDEyLCAweDE2LAorICAgIDB4MEUsIDB4MTYsIDB4MTYsIDB4MTYsCisgICAgMHgwRSwgMHgwRSwgMHgxNiwgMHgxNiwKKyAgICAweDBFLCAweDBFLCAweDBFLCAweDE2LAorICAgIDB4MEUsIDB4MTIsIDB4MTUsIDB4MTksCisgICAgMHgwRSwgMHgxMywgMHgxNywgMHgxOSwKKyAgICAweDBFLCAweDEwLCAweDE3LCAweDE5LAorICAgIDB4MEUsIDB4MTAsIDB4MTQsIDB4MTksCisgICAgMHgwRSwgMHgxOSwgMHgxOSwgMHgxOSwKKyAgICAweDBFLCAweDBFLCAweDE5LCAweDE5LAorICAgIDB4MEUsIDB4MEUsIDB4MEUsIDB4MTksCisgICAgMHgwRSwgMHgxMywgMHgxNywgMHgxQywKKyAgICAweDBFLCAweDE1LCAweDE5LCAweDFDLAorICAgIDB4MEUsIDB4MTEsIDB4MTksIDB4MUMsCisgICAgMHgwRSwgMHgxMSwgMHgxNSwgMHgxQywKKyAgICAweDBFLCAweDFDLCAweDFDLCAweDFDLAorICAgIDB4MEUsIDB4MEUsIDB4MUMsIDB4MUMsCisgICAgMHgwRSwgMHgwRSwgMHgwRSwgMHgxQywKKyAgICAweDBFLCAweDE0LCAweDE5LCAweDFGLAorICAgIDB4MEUsIDB4MTYsIDB4MUIsIDB4MUYsCisgICAgMHgwRSwgMHgxMiwgMHgxQiwgMHgxRiwKKyAgICAweDBFLCAweDEyLCAweDE3LCAweDFGLAorICAgIDB4MEUsIDB4MUYsIDB4MUYsIDB4MUYsCisgICAgMHgwRSwgMHgwRSwgMHgxRiwgMHgxRiwKKyAgICAweDBFLCAweDBFLCAweDBFLCAweDFGLAorICAgIDB4MEUsIDB4MTUsIDB4MUIsIDB4MjIsCisgICAgMHgwRSwgMHgxOCwgMHgxRCwgMHgyMiwKKyAgICAweDBFLCAweDEzLCAweDFELCAweDIyLAorICAgIDB4MEUsIDB4MTMsIDB4MTgsIDB4MjIsCisgICAgMHgwRSwgMHgyMiwgMHgyMiwgMHgyMiwKKyAgICAweDBFLCAweDBFLCAweDIyLCAweDIyLAorICAgIDB4MEUsIDB4MEUsIDB4MEUsIDB4MjIsCisgICAgMHgwRSwgMHgxOSwgMHgyMCwgMHgyNSwKKyAgICAweDBFLCAweDEzLCAweDIwLCAweDI1LAorICAgIDB4MEUsIDB4MTMsIDB4MUEsIDB4MjUsCisgICAgMHgwRSwgMHgyNSwgMHgyNSwgMHgyNSwKKyAgICAweDBFLCAweDBFLCAweDI1LCAweDI1LAorICAgIDB4MEUsIDB4MEUsIDB4MEUsIDB4MjUsCisgICAgMHgwRSwgMHgxQiwgMHgyMiwgMHgyOCwKKyAgICAweDBFLCAweDE0LCAweDIyLCAweDI4LAorICAgIDB4MEUsIDB4MTQsIDB4MUIsIDB4MjgsCisgICAgMHgwRSwgMHgyOCwgMHgyOCwgMHgyOCwKKyAgICAweDBFLCAweDBFLCAweDI4LCAweDI4LAorICAgIDB4MEUsIDB4MEUsIDB4MEUsIDB4MjgsCisgICAgMHgwRSwgMHgxQywgMHgyNCwgMHgyQiwKKyAgICAweDBFLCAweDE1LCAweDI0LCAweDJCLAorICAgIDB4MEUsIDB4MTUsIDB4MUQsIDB4MkIsCisgICAgMHgwRSwgMHgyQiwgMHgyQiwgMHgyQiwKKyAgICAweDBFLCAweDBFLCAweDJCLCAweDJCLAorICAgIDB4MEUsIDB4MEUsIDB4MEUsIDB4MkIsCisgICAgMHgwRSwgMHgxRSwgMHgyNiwgMHgyRSwKKyAgICAweDBFLCAweDE2LCAweDI2LCAweDJFLAorICAgIDB4MEUsIDB4MTYsIDB4MUUsIDB4MkUsCisgICAgMHgwRSwgMHgyRSwgMHgyRSwgMHgyRSwKKyAgICAweDBFLCAweDBFLCAweDJFLCAweDJFLAorICAgIDB4MEUsIDB4MEUsIDB4MEUsIDB4MkUsCisgICAgMHgwRSwgMHgzMSwgMHgzMSwgMHgzMSwKKyAgICAweDBFLCAweDBFLCAweDMxLCAweDMxLAorICAgIDB4MEUsIDB4MEUsIDB4MEUsIDB4MzEsCisgICAgMHgwRSwgMHgyMCwgMHgyOSwgMHgzMiwKKyAgICAweDBFLCAweDE3LCAweDI5LCAweDMyLAorICAgIDB4MEUsIDB4MTcsIDB4MjAsIDB4MzIsCisgICAgMHgwRSwgMHgzNiwgMHgzNiwgMHgzNiwKKyAgICAweDBFLCAweDBFLCAweDM2LCAweDM2LAorICAgIDB4MEUsIDB4MEUsIDB4MEUsIDB4MzYsCisgICAgMHgwRSwgMHgzQywgMHgzQywgMHgzQywKKyAgICAweDBFLCAweDBFLCAweDNDLCAweDNDLAorICAgIDB4MEUsIDB4MEUsIDB4MEUsIDB4M0MsCisgICAgMHgwRiwgMHgxMCwgMHgxMCwgMHgxMSwKKyAgICAweDBGLCAweDEwLCAweDExLCAweDEyLAorICAgIDB4MEYsIDB4MTEsIDB4MTIsIDB4MTMsCisgICAgMHgwRiwgMHgxMCwgMHgxMiwgMHgxMywKKyAgICAweDBGLCAweDEwLCAweDExLCAweDEzLAorICAgIDB4MEYsIDB4MTEsIDB4MTIsIDB4MTQsCisgICAgMHgwRiwgMHgxMSwgMHgxMywgMHgxNCwKKyAgICAweDBGLCAweDEwLCAweDEzLCAweDE0LAorICAgIDB4MEYsIDB4MTAsIDB4MTIsIDB4MTQsCisgICAgMHgwRiwgMHgxMSwgMHgxMywgMHgxNSwKKyAgICAweDBGLCAweDEyLCAweDE0LCAweDE1LAorICAgIDB4MEYsIDB4MTAsIDB4MTQsIDB4MTUsCisgICAgMHgwRiwgMHgxMCwgMHgxMiwgMHgxNSwKKyAgICAweDBGLCAweDE1LCAweDE1LCAweDE1LAorICAgIDB4MEYsIDB4MEYsIDB4MTUsIDB4MTUsCisgICAgMHgwRiwgMHgwRiwgMHgwRiwgMHgxNSwKKyAgICAweDBGLCAweDEyLCAweDEzLCAweDE2LAorICAgIDB4MEYsIDB4MTIsIDB4MTUsIDB4MTYsCisgICAgMHgwRiwgMHgxMCwgMHgxNSwgMHgxNiwKKyAgICAweDBGLCAweDEwLCAweDEzLCAweDE2LAorICAgIDB4MEYsIDB4MTIsIDB4MTQsIDB4MTcsCisgICAgMHgwRiwgMHgxMywgMHgxNSwgMHgxNywKKyAgICAweDBGLCAweDExLCAweDE1LCAweDE3LAorICAgIDB4MEYsIDB4MTEsIDB4MTMsIDB4MTcsCisgICAgMHgwRiwgMHgxNywgMHgxNywgMHgxNywKKyAgICAweDBGLCAweDBGLCAweDE3LCAweDE3LAorICAgIDB4MEYsIDB4MEYsIDB4MEYsIDB4MTcsCisgICAgMHgwRiwgMHgxMywgMHgxNiwgMHgxQSwKKyAgICAweDBGLCAweDE0LCAweDE4LCAweDFBLAorICAgIDB4MEYsIDB4MTEsIDB4MTgsIDB4MUEsCisgICAgMHgwRiwgMHgxMSwgMHgxNSwgMHgxQSwKKyAgICAweDBGLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MEYsIDB4MEYsIDB4MUEsIDB4MUEsCisgICAgMHgwRiwgMHgwRiwgMHgwRiwgMHgxQSwKKyAgICAweDBGLCAweDE0LCAweDE4LCAweDFELAorICAgIDB4MEYsIDB4MTYsIDB4MUEsIDB4MUQsCisgICAgMHgwRiwgMHgxMiwgMHgxQSwgMHgxRCwKKyAgICAweDBGLCAweDEyLCAweDE2LCAweDFELAorICAgIDB4MEYsIDB4MUQsIDB4MUQsIDB4MUQsCisgICAgMHgwRiwgMHgwRiwgMHgxRCwgMHgxRCwKKyAgICAweDBGLCAweDBGLCAweDBGLCAweDFELAorICAgIDB4MEYsIDB4MTUsIDB4MUEsIDB4MjAsCisgICAgMHgwRiwgMHgxNywgMHgxQywgMHgyMCwKKyAgICAweDBGLCAweDEzLCAweDFDLCAweDIwLAorICAgIDB4MEYsIDB4MTMsIDB4MTgsIDB4MjAsCisgICAgMHgwRiwgMHgyMCwgMHgyMCwgMHgyMCwKKyAgICAweDBGLCAweDBGLCAweDIwLCAweDIwLAorICAgIDB4MEYsIDB4MEYsIDB4MEYsIDB4MjAsCisgICAgMHgwRiwgMHgxNiwgMHgxQywgMHgyMywKKyAgICAweDBGLCAweDE5LCAweDFFLCAweDIzLAorICAgIDB4MEYsIDB4MTQsIDB4MUUsIDB4MjMsCisgICAgMHgwRiwgMHgxNCwgMHgxOSwgMHgyMywKKyAgICAweDBGLCAweDIzLCAweDIzLCAweDIzLAorICAgIDB4MEYsIDB4MEYsIDB4MjMsIDB4MjMsCisgICAgMHgwRiwgMHgwRiwgMHgwRiwgMHgyMywKKyAgICAweDBGLCAweDFBLCAweDIxLCAweDI2LAorICAgIDB4MEYsIDB4MTQsIDB4MjEsIDB4MjYsCisgICAgMHgwRiwgMHgxNCwgMHgxQiwgMHgyNiwKKyAgICAweDBGLCAweDI2LCAweDI2LCAweDI2LAorICAgIDB4MEYsIDB4MEYsIDB4MjYsIDB4MjYsCisgICAgMHgwRiwgMHgwRiwgMHgwRiwgMHgyNiwKKyAgICAweDBGLCAweDFDLCAweDIzLCAweDI5LAorICAgIDB4MEYsIDB4MTUsIDB4MjMsIDB4MjksCisgICAgMHgwRiwgMHgxNSwgMHgxQywgMHgyOSwKKyAgICAweDBGLCAweDI5LCAweDI5LCAweDI5LAorICAgIDB4MEYsIDB4MEYsIDB4MjksIDB4MjksCisgICAgMHgwRiwgMHgwRiwgMHgwRiwgMHgyOSwKKyAgICAweDBGLCAweDFELCAweDI1LCAweDJDLAorICAgIDB4MEYsIDB4MTYsIDB4MjUsIDB4MkMsCisgICAgMHgwRiwgMHgxNiwgMHgxRSwgMHgyQywKKyAgICAweDBGLCAweDJDLCAweDJDLCAweDJDLAorICAgIDB4MEYsIDB4MEYsIDB4MkMsIDB4MkMsCisgICAgMHgwRiwgMHgwRiwgMHgwRiwgMHgyQywKKyAgICAweDBGLCAweDFGLCAweDI3LCAweDJGLAorICAgIDB4MEYsIDB4MTcsIDB4MjcsIDB4MkYsCisgICAgMHgwRiwgMHgxNywgMHgxRiwgMHgyRiwKKyAgICAweDBGLCAweDJGLCAweDJGLCAweDJGLAorICAgIDB4MEYsIDB4MEYsIDB4MkYsIDB4MkYsCisgICAgMHgwRiwgMHgwRiwgMHgwRiwgMHgyRiwKKyAgICAweDBGLCAweDMyLCAweDMyLCAweDMyLAorICAgIDB4MEYsIDB4MEYsIDB4MzIsIDB4MzIsCisgICAgMHgwRiwgMHgwRiwgMHgwRiwgMHgzMiwKKyAgICAweDBGLCAweDIxLCAweDJBLCAweDMzLAorICAgIDB4MEYsIDB4MTgsIDB4MkEsIDB4MzMsCisgICAgMHgwRiwgMHgxOCwgMHgyMSwgMHgzMywKKyAgICAweDBGLCAweDM3LCAweDM3LCAweDM3LAorICAgIDB4MEYsIDB4MEYsIDB4MzcsIDB4MzcsCisgICAgMHgwRiwgMHgwRiwgMHgwRiwgMHgzNywKKyAgICAweDBGLCAweDNELCAweDNELCAweDNELAorICAgIDB4MEYsIDB4MEYsIDB4M0QsIDB4M0QsCisgICAgMHgwRiwgMHgwRiwgMHgwRiwgMHgzRCwKKyAgICAweDEwLCAweDExLCAweDExLCAweDEyLAorICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsCisgICAgMHgxMCwgMHgxMiwgMHgxMywgMHgxNCwKKyAgICAweDEwLCAweDExLCAweDEzLCAweDE0LAorICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTQsCisgICAgMHgxMCwgMHgxMiwgMHgxMywgMHgxNSwKKyAgICAweDEwLCAweDEyLCAweDE0LCAweDE1LAorICAgIDB4MTAsIDB4MTEsIDB4MTQsIDB4MTUsCisgICAgMHgxMCwgMHgxMSwgMHgxMywgMHgxNSwKKyAgICAweDEwLCAweDEyLCAweDE0LCAweDE2LAorICAgIDB4MTAsIDB4MTMsIDB4MTUsIDB4MTYsCisgICAgMHgxMCwgMHgxMSwgMHgxNSwgMHgxNiwKKyAgICAweDEwLCAweDExLCAweDEzLCAweDE2LAorICAgIDB4MTAsIDB4MTYsIDB4MTYsIDB4MTYsCisgICAgMHgxMCwgMHgxMCwgMHgxNiwgMHgxNiwKKyAgICAweDEwLCAweDEwLCAweDEwLCAweDE2LAorICAgIDB4MTAsIDB4MTMsIDB4MTQsIDB4MTcsCisgICAgMHgxMCwgMHgxMywgMHgxNiwgMHgxNywKKyAgICAweDEwLCAweDExLCAweDE2LCAweDE3LAorICAgIDB4MTAsIDB4MTEsIDB4MTQsIDB4MTcsCisgICAgMHgxMCwgMHgxMywgMHgxNSwgMHgxOCwKKyAgICAweDEwLCAweDE0LCAweDE2LCAweDE4LAorICAgIDB4MTAsIDB4MTIsIDB4MTYsIDB4MTgsCisgICAgMHgxMCwgMHgxMiwgMHgxNCwgMHgxOCwKKyAgICAweDEwLCAweDE4LCAweDE4LCAweDE4LAorICAgIDB4MTAsIDB4MTAsIDB4MTgsIDB4MTgsCisgICAgMHgxMCwgMHgxMCwgMHgxMCwgMHgxOCwKKyAgICAweDEwLCAweDE0LCAweDE3LCAweDFCLAorICAgIDB4MTAsIDB4MTUsIDB4MTksIDB4MUIsCisgICAgMHgxMCwgMHgxMiwgMHgxOSwgMHgxQiwKKyAgICAweDEwLCAweDEyLCAweDE2LCAweDFCLAorICAgIDB4MTAsIDB4MUIsIDB4MUIsIDB4MUIsCisgICAgMHgxMCwgMHgxMCwgMHgxQiwgMHgxQiwKKyAgICAweDEwLCAweDEwLCAweDEwLCAweDFCLAorICAgIDB4MTAsIDB4MTUsIDB4MTksIDB4MUUsCisgICAgMHgxMCwgMHgxNywgMHgxQiwgMHgxRSwKKyAgICAweDEwLCAweDEzLCAweDFCLCAweDFFLAorICAgIDB4MTAsIDB4MTMsIDB4MTcsIDB4MUUsCisgICAgMHgxMCwgMHgxRSwgMHgxRSwgMHgxRSwKKyAgICAweDEwLCAweDEwLCAweDFFLCAweDFFLAorICAgIDB4MTAsIDB4MTAsIDB4MTAsIDB4MUUsCisgICAgMHgxMCwgMHgxNiwgMHgxQiwgMHgyMSwKKyAgICAweDEwLCAweDE4LCAweDFELCAweDIxLAorICAgIDB4MTAsIDB4MTQsIDB4MUQsIDB4MjEsCisgICAgMHgxMCwgMHgxNCwgMHgxOSwgMHgyMSwKKyAgICAweDEwLCAweDIxLCAweDIxLCAweDIxLAorICAgIDB4MTAsIDB4MTAsIDB4MjEsIDB4MjEsCisgICAgMHgxMCwgMHgxMCwgMHgxMCwgMHgyMSwKKyAgICAweDEwLCAweDE3LCAweDFELCAweDI0LAorICAgIDB4MTAsIDB4MUEsIDB4MUYsIDB4MjQsCisgICAgMHgxMCwgMHgxNSwgMHgxRiwgMHgyNCwKKyAgICAweDEwLCAweDE1LCAweDFBLCAweDI0LAorICAgIDB4MTAsIDB4MjQsIDB4MjQsIDB4MjQsCisgICAgMHgxMCwgMHgxMCwgMHgyNCwgMHgyNCwKKyAgICAweDEwLCAweDEwLCAweDEwLCAweDI0LAorICAgIDB4MTAsIDB4MUIsIDB4MjIsIDB4MjcsCisgICAgMHgxMCwgMHgxNSwgMHgyMiwgMHgyNywKKyAgICAweDEwLCAweDE1LCAweDFDLCAweDI3LAorICAgIDB4MTAsIDB4MjcsIDB4MjcsIDB4MjcsCisgICAgMHgxMCwgMHgxMCwgMHgyNywgMHgyNywKKyAgICAweDEwLCAweDEwLCAweDEwLCAweDI3LAorICAgIDB4MTAsIDB4MUQsIDB4MjQsIDB4MkEsCisgICAgMHgxMCwgMHgxNiwgMHgyNCwgMHgyQSwKKyAgICAweDEwLCAweDE2LCAweDFELCAweDJBLAorICAgIDB4MTAsIDB4MkEsIDB4MkEsIDB4MkEsCisgICAgMHgxMCwgMHgxMCwgMHgyQSwgMHgyQSwKKyAgICAweDEwLCAweDEwLCAweDEwLCAweDJBLAorICAgIDB4MTAsIDB4MUUsIDB4MjYsIDB4MkQsCisgICAgMHgxMCwgMHgxNywgMHgyNiwgMHgyRCwKKyAgICAweDEwLCAweDE3LCAweDFGLCAweDJELAorICAgIDB4MTAsIDB4MkQsIDB4MkQsIDB4MkQsCisgICAgMHgxMCwgMHgxMCwgMHgyRCwgMHgyRCwKKyAgICAweDEwLCAweDEwLCAweDEwLCAweDJELAorICAgIDB4MTAsIDB4MjAsIDB4MjgsIDB4MzAsCisgICAgMHgxMCwgMHgxOCwgMHgyOCwgMHgzMCwKKyAgICAweDEwLCAweDE4LCAweDIwLCAweDMwLAorICAgIDB4MTAsIDB4MzAsIDB4MzAsIDB4MzAsCisgICAgMHgxMCwgMHgxMCwgMHgzMCwgMHgzMCwKKyAgICAweDEwLCAweDEwLCAweDEwLCAweDMwLAorICAgIDB4MTAsIDB4MzMsIDB4MzMsIDB4MzMsCisgICAgMHgxMCwgMHgxMCwgMHgzMywgMHgzMywKKyAgICAweDEwLCAweDEwLCAweDEwLCAweDMzLAorICAgIDB4MTAsIDB4MjIsIDB4MkIsIDB4MzQsCisgICAgMHgxMCwgMHgxOSwgMHgyQiwgMHgzNCwKKyAgICAweDEwLCAweDE5LCAweDIyLCAweDM0LAorICAgIDB4MTAsIDB4MzgsIDB4MzgsIDB4MzgsCisgICAgMHgxMCwgMHgxMCwgMHgzOCwgMHgzOCwKKyAgICAweDEwLCAweDEwLCAweDEwLCAweDM4LAorICAgIDB4MTAsIDB4M0UsIDB4M0UsIDB4M0UsCisgICAgMHgxMCwgMHgxMCwgMHgzRSwgMHgzRSwKKyAgICAweDEwLCAweDEwLCAweDEwLCAweDNFLAorICAgIDB4MTEsIDB4MTIsIDB4MTIsIDB4MTMsCisgICAgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwKKyAgICAweDExLCAweDEzLCAweDE0LCAweDE1LAorICAgIDB4MTEsIDB4MTIsIDB4MTQsIDB4MTUsCisgICAgMHgxMSwgMHgxMiwgMHgxMywgMHgxNSwKKyAgICAweDExLCAweDEzLCAweDE0LCAweDE2LAorICAgIDB4MTEsIDB4MTMsIDB4MTUsIDB4MTYsCisgICAgMHgxMSwgMHgxMiwgMHgxNSwgMHgxNiwKKyAgICAweDExLCAweDEyLCAweDE0LCAweDE2LAorICAgIDB4MTEsIDB4MTMsIDB4MTUsIDB4MTcsCisgICAgMHgxMSwgMHgxNCwgMHgxNiwgMHgxNywKKyAgICAweDExLCAweDEyLCAweDE2LCAweDE3LAorICAgIDB4MTEsIDB4MTIsIDB4MTQsIDB4MTcsCisgICAgMHgxMSwgMHgxNywgMHgxNywgMHgxNywKKyAgICAweDExLCAweDExLCAweDE3LCAweDE3LAorICAgIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTcsCisgICAgMHgxMSwgMHgxNCwgMHgxNSwgMHgxOCwKKyAgICAweDExLCAweDE0LCAweDE3LCAweDE4LAorICAgIDB4MTEsIDB4MTIsIDB4MTcsIDB4MTgsCisgICAgMHgxMSwgMHgxMiwgMHgxNSwgMHgxOCwKKyAgICAweDExLCAweDE0LCAweDE2LCAweDE5LAorICAgIDB4MTEsIDB4MTUsIDB4MTcsIDB4MTksCisgICAgMHgxMSwgMHgxMywgMHgxNywgMHgxOSwKKyAgICAweDExLCAweDEzLCAweDE1LCAweDE5LAorICAgIDB4MTEsIDB4MTksIDB4MTksIDB4MTksCisgICAgMHgxMSwgMHgxMSwgMHgxOSwgMHgxOSwKKyAgICAweDExLCAweDExLCAweDExLCAweDE5LAorICAgIDB4MTEsIDB4MTUsIDB4MTgsIDB4MUMsCisgICAgMHgxMSwgMHgxNiwgMHgxQSwgMHgxQywKKyAgICAweDExLCAweDEzLCAweDFBLCAweDFDLAorICAgIDB4MTEsIDB4MTMsIDB4MTcsIDB4MUMsCisgICAgMHgxMSwgMHgxQywgMHgxQywgMHgxQywKKyAgICAweDExLCAweDExLCAweDFDLCAweDFDLAorICAgIDB4MTEsIDB4MTEsIDB4MTEsIDB4MUMsCisgICAgMHgxMSwgMHgxNiwgMHgxQSwgMHgxRiwKKyAgICAweDExLCAweDE4LCAweDFDLCAweDFGLAorICAgIDB4MTEsIDB4MTQsIDB4MUMsIDB4MUYsCisgICAgMHgxMSwgMHgxNCwgMHgxOCwgMHgxRiwKKyAgICAweDExLCAweDFGLCAweDFGLCAweDFGLAorICAgIDB4MTEsIDB4MTEsIDB4MUYsIDB4MUYsCisgICAgMHgxMSwgMHgxMSwgMHgxMSwgMHgxRiwKKyAgICAweDExLCAweDE3LCAweDFDLCAweDIyLAorICAgIDB4MTEsIDB4MTksIDB4MUUsIDB4MjIsCisgICAgMHgxMSwgMHgxNSwgMHgxRSwgMHgyMiwKKyAgICAweDExLCAweDE1LCAweDFBLCAweDIyLAorICAgIDB4MTEsIDB4MjIsIDB4MjIsIDB4MjIsCisgICAgMHgxMSwgMHgxMSwgMHgyMiwgMHgyMiwKKyAgICAweDExLCAweDExLCAweDExLCAweDIyLAorICAgIDB4MTEsIDB4MTgsIDB4MUUsIDB4MjUsCisgICAgMHgxMSwgMHgxQiwgMHgyMCwgMHgyNSwKKyAgICAweDExLCAweDE2LCAweDIwLCAweDI1LAorICAgIDB4MTEsIDB4MTYsIDB4MUIsIDB4MjUsCisgICAgMHgxMSwgMHgyNSwgMHgyNSwgMHgyNSwKKyAgICAweDExLCAweDExLCAweDI1LCAweDI1LAorICAgIDB4MTEsIDB4MTEsIDB4MTEsIDB4MjUsCisgICAgMHgxMSwgMHgxQywgMHgyMywgMHgyOCwKKyAgICAweDExLCAweDE2LCAweDIzLCAweDI4LAorICAgIDB4MTEsIDB4MTYsIDB4MUQsIDB4MjgsCisgICAgMHgxMSwgMHgyOCwgMHgyOCwgMHgyOCwKKyAgICAweDExLCAweDExLCAweDI4LCAweDI4LAorICAgIDB4MTEsIDB4MTEsIDB4MTEsIDB4MjgsCisgICAgMHgxMSwgMHgxRSwgMHgyNSwgMHgyQiwKKyAgICAweDExLCAweDE3LCAweDI1LCAweDJCLAorICAgIDB4MTEsIDB4MTcsIDB4MUUsIDB4MkIsCisgICAgMHgxMSwgMHgyQiwgMHgyQiwgMHgyQiwKKyAgICAweDExLCAweDExLCAweDJCLCAweDJCLAorICAgIDB4MTEsIDB4MTEsIDB4MTEsIDB4MkIsCisgICAgMHgxMSwgMHgxRiwgMHgyNywgMHgyRSwKKyAgICAweDExLCAweDE4LCAweDI3LCAweDJFLAorICAgIDB4MTEsIDB4MTgsIDB4MjAsIDB4MkUsCisgICAgMHgxMSwgMHgyRSwgMHgyRSwgMHgyRSwKKyAgICAweDExLCAweDExLCAweDJFLCAweDJFLAorICAgIDB4MTEsIDB4MTEsIDB4MTEsIDB4MkUsCisgICAgMHgxMSwgMHgyMSwgMHgyOSwgMHgzMSwKKyAgICAweDExLCAweDE5LCAweDI5LCAweDMxLAorICAgIDB4MTEsIDB4MTksIDB4MjEsIDB4MzEsCisgICAgMHgxMSwgMHgzMSwgMHgzMSwgMHgzMSwKKyAgICAweDExLCAweDExLCAweDMxLCAweDMxLAorICAgIDB4MTEsIDB4MTEsIDB4MTEsIDB4MzEsCisgICAgMHgxMSwgMHgzNCwgMHgzNCwgMHgzNCwKKyAgICAweDExLCAweDExLCAweDM0LCAweDM0LAorICAgIDB4MTEsIDB4MTEsIDB4MTEsIDB4MzQsCisgICAgMHgxMSwgMHgyMywgMHgyQywgMHgzNSwKKyAgICAweDExLCAweDFBLCAweDJDLCAweDM1LAorICAgIDB4MTEsIDB4MUEsIDB4MjMsIDB4MzUsCisgICAgMHgxMSwgMHgzOSwgMHgzOSwgMHgzOSwKKyAgICAweDExLCAweDExLCAweDM5LCAweDM5LAorICAgIDB4MTEsIDB4MTEsIDB4MTEsIDB4MzksCisgICAgMHgxMSwgMHgzRiwgMHgzRiwgMHgzRiwKKyAgICAweDExLCAweDExLCAweDNGLCAweDNGLAorICAgIDB4MTEsIDB4MTEsIDB4MTEsIDB4M0YsCisgICAgMHgxMiwgMHgxMywgMHgxMywgMHgxNCwKKyAgICAweDEyLCAweDEzLCAweDE0LCAweDE1LAorICAgIDB4MTIsIDB4MTQsIDB4MTUsIDB4MTYsCisgICAgMHgxMiwgMHgxMywgMHgxNSwgMHgxNiwKKyAgICAweDEyLCAweDEzLCAweDE0LCAweDE2LAorICAgIDB4MTIsIDB4MTQsIDB4MTUsIDB4MTcsCisgICAgMHgxMiwgMHgxNCwgMHgxNiwgMHgxNywKKyAgICAweDEyLCAweDEzLCAweDE2LCAweDE3LAorICAgIDB4MTIsIDB4MTMsIDB4MTUsIDB4MTcsCisgICAgMHgxMiwgMHgxNCwgMHgxNiwgMHgxOCwKKyAgICAweDEyLCAweDE1LCAweDE3LCAweDE4LAorICAgIDB4MTIsIDB4MTMsIDB4MTcsIDB4MTgsCisgICAgMHgxMiwgMHgxMywgMHgxNSwgMHgxOCwKKyAgICAweDEyLCAweDE4LCAweDE4LCAweDE4LAorICAgIDB4MTIsIDB4MTIsIDB4MTgsIDB4MTgsCisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgxOCwKKyAgICAweDEyLCAweDE1LCAweDE2LCAweDE5LAorICAgIDB4MTIsIDB4MTUsIDB4MTgsIDB4MTksCisgICAgMHgxMiwgMHgxMywgMHgxOCwgMHgxOSwKKyAgICAweDEyLCAweDEzLCAweDE2LCAweDE5LAorICAgIDB4MTIsIDB4MTUsIDB4MTcsIDB4MUEsCisgICAgMHgxMiwgMHgxNiwgMHgxOCwgMHgxQSwKKyAgICAweDEyLCAweDE0LCAweDE4LCAweDFBLAorICAgIDB4MTIsIDB4MTQsIDB4MTYsIDB4MUEsCisgICAgMHgxMiwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDEyLCAweDEyLCAweDFBLCAweDFBLAorICAgIDB4MTIsIDB4MTIsIDB4MTIsIDB4MUEsCisgICAgMHgxMiwgMHgxNiwgMHgxOSwgMHgxRCwKKyAgICAweDEyLCAweDE3LCAweDFCLCAweDFELAorICAgIDB4MTIsIDB4MTQsIDB4MUIsIDB4MUQsCisgICAgMHgxMiwgMHgxNCwgMHgxOCwgMHgxRCwKKyAgICAweDEyLCAweDFELCAweDFELCAweDFELAorICAgIDB4MTIsIDB4MTIsIDB4MUQsIDB4MUQsCisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgxRCwKKyAgICAweDEyLCAweDE3LCAweDFCLCAweDIwLAorICAgIDB4MTIsIDB4MTksIDB4MUQsIDB4MjAsCisgICAgMHgxMiwgMHgxNSwgMHgxRCwgMHgyMCwKKyAgICAweDEyLCAweDE1LCAweDE5LCAweDIwLAorICAgIDB4MTIsIDB4MjAsIDB4MjAsIDB4MjAsCisgICAgMHgxMiwgMHgxMiwgMHgyMCwgMHgyMCwKKyAgICAweDEyLCAweDEyLCAweDEyLCAweDIwLAorICAgIDB4MTIsIDB4MTgsIDB4MUQsIDB4MjMsCisgICAgMHgxMiwgMHgxQSwgMHgxRiwgMHgyMywKKyAgICAweDEyLCAweDE2LCAweDFGLCAweDIzLAorICAgIDB4MTIsIDB4MTYsIDB4MUIsIDB4MjMsCisgICAgMHgxMiwgMHgyMywgMHgyMywgMHgyMywKKyAgICAweDEyLCAweDEyLCAweDIzLCAweDIzLAorICAgIDB4MTIsIDB4MTIsIDB4MTIsIDB4MjMsCisgICAgMHgxMiwgMHgxOSwgMHgxRiwgMHgyNiwKKyAgICAweDEyLCAweDFDLCAweDIxLCAweDI2LAorICAgIDB4MTIsIDB4MTcsIDB4MjEsIDB4MjYsCisgICAgMHgxMiwgMHgxNywgMHgxQywgMHgyNiwKKyAgICAweDEyLCAweDI2LCAweDI2LCAweDI2LAorICAgIDB4MTIsIDB4MTIsIDB4MjYsIDB4MjYsCisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgyNiwKKyAgICAweDEyLCAweDFELCAweDI0LCAweDI5LAorICAgIDB4MTIsIDB4MTcsIDB4MjQsIDB4MjksCisgICAgMHgxMiwgMHgxNywgMHgxRSwgMHgyOSwKKyAgICAweDEyLCAweDI5LCAweDI5LCAweDI5LAorICAgIDB4MTIsIDB4MTIsIDB4MjksIDB4MjksCisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgyOSwKKyAgICAweDEyLCAweDFGLCAweDI2LCAweDJDLAorICAgIDB4MTIsIDB4MTgsIDB4MjYsIDB4MkMsCisgICAgMHgxMiwgMHgxOCwgMHgxRiwgMHgyQywKKyAgICAweDEyLCAweDJDLCAweDJDLCAweDJDLAorICAgIDB4MTIsIDB4MTIsIDB4MkMsIDB4MkMsCisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgyQywKKyAgICAweDEyLCAweDIwLCAweDI4LCAweDJGLAorICAgIDB4MTIsIDB4MTksIDB4MjgsIDB4MkYsCisgICAgMHgxMiwgMHgxOSwgMHgyMSwgMHgyRiwKKyAgICAweDEyLCAweDJGLCAweDJGLCAweDJGLAorICAgIDB4MTIsIDB4MTIsIDB4MkYsIDB4MkYsCisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgyRiwKKyAgICAweDEyLCAweDIyLCAweDJBLCAweDMyLAorICAgIDB4MTIsIDB4MUEsIDB4MkEsIDB4MzIsCisgICAgMHgxMiwgMHgxQSwgMHgyMiwgMHgzMiwKKyAgICAweDEyLCAweDMyLCAweDMyLCAweDMyLAorICAgIDB4MTIsIDB4MTIsIDB4MzIsIDB4MzIsCisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgzMiwKKyAgICAweDEyLCAweDM1LCAweDM1LCAweDM1LAorICAgIDB4MTIsIDB4MTIsIDB4MzUsIDB4MzUsCisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgzNSwKKyAgICAweDEyLCAweDI0LCAweDJELCAweDM2LAorICAgIDB4MTIsIDB4MUIsIDB4MkQsIDB4MzYsCisgICAgMHgxMiwgMHgxQiwgMHgyNCwgMHgzNiwKKyAgICAweDEyLCAweDNBLCAweDNBLCAweDNBLAorICAgIDB4MTIsIDB4MTIsIDB4M0EsIDB4M0EsCisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgzQSwKKyAgICAweDEzLCAweDE0LCAweDE0LCAweDE1LAorICAgIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsCisgICAgMHgxMywgMHgxNSwgMHgxNiwgMHgxNywKKyAgICAweDEzLCAweDE0LCAweDE2LCAweDE3LAorICAgIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTcsCisgICAgMHgxMywgMHgxNSwgMHgxNiwgMHgxOCwKKyAgICAweDEzLCAweDE1LCAweDE3LCAweDE4LAorICAgIDB4MTMsIDB4MTQsIDB4MTcsIDB4MTgsCisgICAgMHgxMywgMHgxNCwgMHgxNiwgMHgxOCwKKyAgICAweDEzLCAweDE1LCAweDE3LCAweDE5LAorICAgIDB4MTMsIDB4MTYsIDB4MTgsIDB4MTksCisgICAgMHgxMywgMHgxNCwgMHgxOCwgMHgxOSwKKyAgICAweDEzLCAweDE0LCAweDE2LCAweDE5LAorICAgIDB4MTMsIDB4MTksIDB4MTksIDB4MTksCisgICAgMHgxMywgMHgxMywgMHgxOSwgMHgxOSwKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDE5LAorICAgIDB4MTMsIDB4MTYsIDB4MTcsIDB4MUEsCisgICAgMHgxMywgMHgxNiwgMHgxOSwgMHgxQSwKKyAgICAweDEzLCAweDE0LCAweDE5LCAweDFBLAorICAgIDB4MTMsIDB4MTQsIDB4MTcsIDB4MUEsCisgICAgMHgxMywgMHgxNiwgMHgxOCwgMHgxQiwKKyAgICAweDEzLCAweDE3LCAweDE5LCAweDFCLAorICAgIDB4MTMsIDB4MTUsIDB4MTksIDB4MUIsCisgICAgMHgxMywgMHgxNSwgMHgxNywgMHgxQiwKKyAgICAweDEzLCAweDFCLCAweDFCLCAweDFCLAorICAgIDB4MTMsIDB4MTMsIDB4MUIsIDB4MUIsCisgICAgMHgxMywgMHgxMywgMHgxMywgMHgxQiwKKyAgICAweDEzLCAweDE3LCAweDFBLCAweDFFLAorICAgIDB4MTMsIDB4MTgsIDB4MUMsIDB4MUUsCisgICAgMHgxMywgMHgxNSwgMHgxQywgMHgxRSwKKyAgICAweDEzLCAweDE1LCAweDE5LCAweDFFLAorICAgIDB4MTMsIDB4MUUsIDB4MUUsIDB4MUUsCisgICAgMHgxMywgMHgxMywgMHgxRSwgMHgxRSwKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDFFLAorICAgIDB4MTMsIDB4MTgsIDB4MUMsIDB4MjEsCisgICAgMHgxMywgMHgxQSwgMHgxRSwgMHgyMSwKKyAgICAweDEzLCAweDE2LCAweDFFLCAweDIxLAorICAgIDB4MTMsIDB4MTYsIDB4MUEsIDB4MjEsCisgICAgMHgxMywgMHgyMSwgMHgyMSwgMHgyMSwKKyAgICAweDEzLCAweDEzLCAweDIxLCAweDIxLAorICAgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MjEsCisgICAgMHgxMywgMHgxOSwgMHgxRSwgMHgyNCwKKyAgICAweDEzLCAweDFCLCAweDIwLCAweDI0LAorICAgIDB4MTMsIDB4MTcsIDB4MjAsIDB4MjQsCisgICAgMHgxMywgMHgxNywgMHgxQywgMHgyNCwKKyAgICAweDEzLCAweDI0LCAweDI0LCAweDI0LAorICAgIDB4MTMsIDB4MTMsIDB4MjQsIDB4MjQsCisgICAgMHgxMywgMHgxMywgMHgxMywgMHgyNCwKKyAgICAweDEzLCAweDFBLCAweDIwLCAweDI3LAorICAgIDB4MTMsIDB4MUQsIDB4MjIsIDB4MjcsCisgICAgMHgxMywgMHgxOCwgMHgyMiwgMHgyNywKKyAgICAweDEzLCAweDE4LCAweDFELCAweDI3LAorICAgIDB4MTMsIDB4MjcsIDB4MjcsIDB4MjcsCisgICAgMHgxMywgMHgxMywgMHgyNywgMHgyNywKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDI3LAorICAgIDB4MTMsIDB4MUUsIDB4MjUsIDB4MkEsCisgICAgMHgxMywgMHgxOCwgMHgyNSwgMHgyQSwKKyAgICAweDEzLCAweDE4LCAweDFGLCAweDJBLAorICAgIDB4MTMsIDB4MkEsIDB4MkEsIDB4MkEsCisgICAgMHgxMywgMHgxMywgMHgyQSwgMHgyQSwKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDJBLAorICAgIDB4MTMsIDB4MjAsIDB4MjcsIDB4MkQsCisgICAgMHgxMywgMHgxOSwgMHgyNywgMHgyRCwKKyAgICAweDEzLCAweDE5LCAweDIwLCAweDJELAorICAgIDB4MTMsIDB4MkQsIDB4MkQsIDB4MkQsCisgICAgMHgxMywgMHgxMywgMHgyRCwgMHgyRCwKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDJELAorICAgIDB4MTMsIDB4MjEsIDB4MjksIDB4MzAsCisgICAgMHgxMywgMHgxQSwgMHgyOSwgMHgzMCwKKyAgICAweDEzLCAweDFBLCAweDIyLCAweDMwLAorICAgIDB4MTMsIDB4MzAsIDB4MzAsIDB4MzAsCisgICAgMHgxMywgMHgxMywgMHgzMCwgMHgzMCwKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDMwLAorICAgIDB4MTMsIDB4MjMsIDB4MkIsIDB4MzMsCisgICAgMHgxMywgMHgxQiwgMHgyQiwgMHgzMywKKyAgICAweDEzLCAweDFCLCAweDIzLCAweDMzLAorICAgIDB4MTMsIDB4MzMsIDB4MzMsIDB4MzMsCisgICAgMHgxMywgMHgxMywgMHgzMywgMHgzMywKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDMzLAorICAgIDB4MTMsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgxMywgMHgxMywgMHgzNiwgMHgzNiwKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDM2LAorICAgIDB4MTMsIDB4MjUsIDB4MkUsIDB4MzcsCisgICAgMHgxMywgMHgxQywgMHgyRSwgMHgzNywKKyAgICAweDEzLCAweDFDLCAweDI1LCAweDM3LAorICAgIDB4MTMsIDB4M0IsIDB4M0IsIDB4M0IsCisgICAgMHgxMywgMHgxMywgMHgzQiwgMHgzQiwKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDNCLAorICAgIDB4MTQsIDB4MTUsIDB4MTUsIDB4MTYsCisgICAgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKKyAgICAweDE0LCAweDE2LCAweDE3LCAweDE4LAorICAgIDB4MTQsIDB4MTUsIDB4MTcsIDB4MTgsCisgICAgMHgxNCwgMHgxNSwgMHgxNiwgMHgxOCwKKyAgICAweDE0LCAweDE2LCAweDE3LCAweDE5LAorICAgIDB4MTQsIDB4MTYsIDB4MTgsIDB4MTksCisgICAgMHgxNCwgMHgxNSwgMHgxOCwgMHgxOSwKKyAgICAweDE0LCAweDE1LCAweDE3LCAweDE5LAorICAgIDB4MTQsIDB4MTYsIDB4MTgsIDB4MUEsCisgICAgMHgxNCwgMHgxNywgMHgxOSwgMHgxQSwKKyAgICAweDE0LCAweDE1LCAweDE5LCAweDFBLAorICAgIDB4MTQsIDB4MTUsIDB4MTcsIDB4MUEsCisgICAgMHgxNCwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDE0LCAweDE0LCAweDFBLCAweDFBLAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MUEsCisgICAgMHgxNCwgMHgxNywgMHgxOCwgMHgxQiwKKyAgICAweDE0LCAweDE3LCAweDFBLCAweDFCLAorICAgIDB4MTQsIDB4MTUsIDB4MUEsIDB4MUIsCisgICAgMHgxNCwgMHgxNSwgMHgxOCwgMHgxQiwKKyAgICAweDE0LCAweDE3LCAweDE5LCAweDFDLAorICAgIDB4MTQsIDB4MTgsIDB4MUEsIDB4MUMsCisgICAgMHgxNCwgMHgxNiwgMHgxQSwgMHgxQywKKyAgICAweDE0LCAweDE2LCAweDE4LCAweDFDLAorICAgIDB4MTQsIDB4MUMsIDB4MUMsIDB4MUMsCisgICAgMHgxNCwgMHgxNCwgMHgxQywgMHgxQywKKyAgICAweDE0LCAweDE0LCAweDE0LCAweDFDLAorICAgIDB4MTQsIDB4MTgsIDB4MUIsIDB4MUYsCisgICAgMHgxNCwgMHgxOSwgMHgxRCwgMHgxRiwKKyAgICAweDE0LCAweDE2LCAweDFELCAweDFGLAorICAgIDB4MTQsIDB4MTYsIDB4MUEsIDB4MUYsCisgICAgMHgxNCwgMHgxRiwgMHgxRiwgMHgxRiwKKyAgICAweDE0LCAweDE0LCAweDFGLCAweDFGLAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MUYsCisgICAgMHgxNCwgMHgxOSwgMHgxRCwgMHgyMiwKKyAgICAweDE0LCAweDFCLCAweDFGLCAweDIyLAorICAgIDB4MTQsIDB4MTcsIDB4MUYsIDB4MjIsCisgICAgMHgxNCwgMHgxNywgMHgxQiwgMHgyMiwKKyAgICAweDE0LCAweDIyLCAweDIyLCAweDIyLAorICAgIDB4MTQsIDB4MTQsIDB4MjIsIDB4MjIsCisgICAgMHgxNCwgMHgxNCwgMHgxNCwgMHgyMiwKKyAgICAweDE0LCAweDFBLCAweDFGLCAweDI1LAorICAgIDB4MTQsIDB4MUMsIDB4MjEsIDB4MjUsCisgICAgMHgxNCwgMHgxOCwgMHgyMSwgMHgyNSwKKyAgICAweDE0LCAweDE4LCAweDFELCAweDI1LAorICAgIDB4MTQsIDB4MjUsIDB4MjUsIDB4MjUsCisgICAgMHgxNCwgMHgxNCwgMHgyNSwgMHgyNSwKKyAgICAweDE0LCAweDE0LCAweDE0LCAweDI1LAorICAgIDB4MTQsIDB4MUIsIDB4MjEsIDB4MjgsCisgICAgMHgxNCwgMHgxRSwgMHgyMywgMHgyOCwKKyAgICAweDE0LCAweDE5LCAweDIzLCAweDI4LAorICAgIDB4MTQsIDB4MTksIDB4MUUsIDB4MjgsCisgICAgMHgxNCwgMHgyOCwgMHgyOCwgMHgyOCwKKyAgICAweDE0LCAweDE0LCAweDI4LCAweDI4LAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MjgsCisgICAgMHgxNCwgMHgxRiwgMHgyNiwgMHgyQiwKKyAgICAweDE0LCAweDE5LCAweDI2LCAweDJCLAorICAgIDB4MTQsIDB4MTksIDB4MjAsIDB4MkIsCisgICAgMHgxNCwgMHgyQiwgMHgyQiwgMHgyQiwKKyAgICAweDE0LCAweDE0LCAweDJCLCAweDJCLAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MkIsCisgICAgMHgxNCwgMHgyMSwgMHgyOCwgMHgyRSwKKyAgICAweDE0LCAweDFBLCAweDI4LCAweDJFLAorICAgIDB4MTQsIDB4MUEsIDB4MjEsIDB4MkUsCisgICAgMHgxNCwgMHgyRSwgMHgyRSwgMHgyRSwKKyAgICAweDE0LCAweDE0LCAweDJFLCAweDJFLAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MkUsCisgICAgMHgxNCwgMHgyMiwgMHgyQSwgMHgzMSwKKyAgICAweDE0LCAweDFCLCAweDJBLCAweDMxLAorICAgIDB4MTQsIDB4MUIsIDB4MjMsIDB4MzEsCisgICAgMHgxNCwgMHgzMSwgMHgzMSwgMHgzMSwKKyAgICAweDE0LCAweDE0LCAweDMxLCAweDMxLAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MzEsCisgICAgMHgxNCwgMHgyNCwgMHgyQywgMHgzNCwKKyAgICAweDE0LCAweDFDLCAweDJDLCAweDM0LAorICAgIDB4MTQsIDB4MUMsIDB4MjQsIDB4MzQsCisgICAgMHgxNCwgMHgzNCwgMHgzNCwgMHgzNCwKKyAgICAweDE0LCAweDE0LCAweDM0LCAweDM0LAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MzQsCisgICAgMHgxNCwgMHgzNywgMHgzNywgMHgzNywKKyAgICAweDE0LCAweDE0LCAweDM3LCAweDM3LAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MzcsCisgICAgMHgxNCwgMHgyNiwgMHgyRiwgMHgzOCwKKyAgICAweDE0LCAweDFELCAweDJGLCAweDM4LAorICAgIDB4MTQsIDB4MUQsIDB4MjYsIDB4MzgsCisgICAgMHgxNCwgMHgzQywgMHgzQywgMHgzQywKKyAgICAweDE0LCAweDE0LCAweDNDLCAweDNDLAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4M0MsCisgICAgMHgxNSwgMHgxNiwgMHgxNiwgMHgxNywKKyAgICAweDE1LCAweDE2LCAweDE3LCAweDE4LAorICAgIDB4MTUsIDB4MTcsIDB4MTgsIDB4MTksCisgICAgMHgxNSwgMHgxNiwgMHgxOCwgMHgxOSwKKyAgICAweDE1LCAweDE2LCAweDE3LCAweDE5LAorICAgIDB4MTUsIDB4MTcsIDB4MTgsIDB4MUEsCisgICAgMHgxNSwgMHgxNywgMHgxOSwgMHgxQSwKKyAgICAweDE1LCAweDE2LCAweDE5LCAweDFBLAorICAgIDB4MTUsIDB4MTYsIDB4MTgsIDB4MUEsCisgICAgMHgxNSwgMHgxNywgMHgxOSwgMHgxQiwKKyAgICAweDE1LCAweDE4LCAweDFBLCAweDFCLAorICAgIDB4MTUsIDB4MTYsIDB4MUEsIDB4MUIsCisgICAgMHgxNSwgMHgxNiwgMHgxOCwgMHgxQiwKKyAgICAweDE1LCAweDFCLCAweDFCLCAweDFCLAorICAgIDB4MTUsIDB4MTUsIDB4MUIsIDB4MUIsCisgICAgMHgxNSwgMHgxNSwgMHgxNSwgMHgxQiwKKyAgICAweDE1LCAweDE4LCAweDE5LCAweDFDLAorICAgIDB4MTUsIDB4MTgsIDB4MUIsIDB4MUMsCisgICAgMHgxNSwgMHgxNiwgMHgxQiwgMHgxQywKKyAgICAweDE1LCAweDE2LCAweDE5LCAweDFDLAorICAgIDB4MTUsIDB4MTgsIDB4MUEsIDB4MUQsCisgICAgMHgxNSwgMHgxOSwgMHgxQiwgMHgxRCwKKyAgICAweDE1LCAweDE3LCAweDFCLCAweDFELAorICAgIDB4MTUsIDB4MTcsIDB4MTksIDB4MUQsCisgICAgMHgxNSwgMHgxRCwgMHgxRCwgMHgxRCwKKyAgICAweDE1LCAweDE1LCAweDFELCAweDFELAorICAgIDB4MTUsIDB4MTUsIDB4MTUsIDB4MUQsCisgICAgMHgxNSwgMHgxOSwgMHgxQywgMHgyMCwKKyAgICAweDE1LCAweDFBLCAweDFFLCAweDIwLAorICAgIDB4MTUsIDB4MTcsIDB4MUUsIDB4MjAsCisgICAgMHgxNSwgMHgxNywgMHgxQiwgMHgyMCwKKyAgICAweDE1LCAweDIwLCAweDIwLCAweDIwLAorICAgIDB4MTUsIDB4MTUsIDB4MjAsIDB4MjAsCisgICAgMHgxNSwgMHgxNSwgMHgxNSwgMHgyMCwKKyAgICAweDE1LCAweDFBLCAweDFFLCAweDIzLAorICAgIDB4MTUsIDB4MUMsIDB4MjAsIDB4MjMsCisgICAgMHgxNSwgMHgxOCwgMHgyMCwgMHgyMywKKyAgICAweDE1LCAweDE4LCAweDFDLCAweDIzLAorICAgIDB4MTUsIDB4MjMsIDB4MjMsIDB4MjMsCisgICAgMHgxNSwgMHgxNSwgMHgyMywgMHgyMywKKyAgICAweDE1LCAweDE1LCAweDE1LCAweDIzLAorICAgIDB4MTUsIDB4MUIsIDB4MjAsIDB4MjYsCisgICAgMHgxNSwgMHgxRCwgMHgyMiwgMHgyNiwKKyAgICAweDE1LCAweDE5LCAweDIyLCAweDI2LAorICAgIDB4MTUsIDB4MTksIDB4MUUsIDB4MjYsCisgICAgMHgxNSwgMHgyNiwgMHgyNiwgMHgyNiwKKyAgICAweDE1LCAweDE1LCAweDI2LCAweDI2LAorICAgIDB4MTUsIDB4MTUsIDB4MTUsIDB4MjYsCisgICAgMHgxNSwgMHgxQywgMHgyMiwgMHgyOSwKKyAgICAweDE1LCAweDFGLCAweDI0LCAweDI5LAorICAgIDB4MTUsIDB4MUEsIDB4MjQsIDB4MjksCisgICAgMHgxNSwgMHgxQSwgMHgxRiwgMHgyOSwKKyAgICAweDE1LCAweDI5LCAweDI5LCAweDI5LAorICAgIDB4MTUsIDB4MTUsIDB4MjksIDB4MjksCisgICAgMHgxNSwgMHgxNSwgMHgxNSwgMHgyOSwKKyAgICAweDE1LCAweDIwLCAweDI3LCAweDJDLAorICAgIDB4MTUsIDB4MUEsIDB4MjcsIDB4MkMsCisgICAgMHgxNSwgMHgxQSwgMHgyMSwgMHgyQywKKyAgICAweDE1LCAweDJDLCAweDJDLCAweDJDLAorICAgIDB4MTUsIDB4MTUsIDB4MkMsIDB4MkMsCisgICAgMHgxNSwgMHgxNSwgMHgxNSwgMHgyQywKKyAgICAweDE1LCAweDIyLCAweDI5LCAweDJGLAorICAgIDB4MTUsIDB4MUIsIDB4MjksIDB4MkYsCisgICAgMHgxNSwgMHgxQiwgMHgyMiwgMHgyRiwKKyAgICAweDE1LCAweDJGLCAweDJGLCAweDJGLAorICAgIDB4MTUsIDB4MTUsIDB4MkYsIDB4MkYsCisgICAgMHgxNSwgMHgxNSwgMHgxNSwgMHgyRiwKKyAgICAweDE1LCAweDIzLCAweDJCLCAweDMyLAorICAgIDB4MTUsIDB4MUMsIDB4MkIsIDB4MzIsCisgICAgMHgxNSwgMHgxQywgMHgyNCwgMHgzMiwKKyAgICAweDE1LCAweDMyLCAweDMyLCAweDMyLAorICAgIDB4MTUsIDB4MTUsIDB4MzIsIDB4MzIsCisgICAgMHgxNSwgMHgxNSwgMHgxNSwgMHgzMiwKKyAgICAweDE1LCAweDI1LCAweDJELCAweDM1LAorICAgIDB4MTUsIDB4MUQsIDB4MkQsIDB4MzUsCisgICAgMHgxNSwgMHgxRCwgMHgyNSwgMHgzNSwKKyAgICAweDE1LCAweDM1LCAweDM1LCAweDM1LAorICAgIDB4MTUsIDB4MTUsIDB4MzUsIDB4MzUsCisgICAgMHgxNSwgMHgxNSwgMHgxNSwgMHgzNSwKKyAgICAweDE1LCAweDM4LCAweDM4LCAweDM4LAorICAgIDB4MTUsIDB4MTUsIDB4MzgsIDB4MzgsCisgICAgMHgxNSwgMHgxNSwgMHgxNSwgMHgzOCwKKyAgICAweDE1LCAweDI3LCAweDMwLCAweDM5LAorICAgIDB4MTUsIDB4MUUsIDB4MzAsIDB4MzksCisgICAgMHgxNSwgMHgxRSwgMHgyNywgMHgzOSwKKyAgICAweDE1LCAweDNELCAweDNELCAweDNELAorICAgIDB4MTUsIDB4MTUsIDB4M0QsIDB4M0QsCisgICAgMHgxNSwgMHgxNSwgMHgxNSwgMHgzRCwKKyAgICAweDE2LCAweDE3LCAweDE3LCAweDE4LAorICAgIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCisgICAgMHgxNiwgMHgxOCwgMHgxOSwgMHgxQSwKKyAgICAweDE2LCAweDE3LCAweDE5LCAweDFBLAorICAgIDB4MTYsIDB4MTcsIDB4MTgsIDB4MUEsCisgICAgMHgxNiwgMHgxOCwgMHgxOSwgMHgxQiwKKyAgICAweDE2LCAweDE4LCAweDFBLCAweDFCLAorICAgIDB4MTYsIDB4MTcsIDB4MUEsIDB4MUIsCisgICAgMHgxNiwgMHgxNywgMHgxOSwgMHgxQiwKKyAgICAweDE2LCAweDE4LCAweDFBLCAweDFDLAorICAgIDB4MTYsIDB4MTksIDB4MUIsIDB4MUMsCisgICAgMHgxNiwgMHgxNywgMHgxQiwgMHgxQywKKyAgICAweDE2LCAweDE3LCAweDE5LCAweDFDLAorICAgIDB4MTYsIDB4MUMsIDB4MUMsIDB4MUMsCisgICAgMHgxNiwgMHgxNiwgMHgxQywgMHgxQywKKyAgICAweDE2LCAweDE2LCAweDE2LCAweDFDLAorICAgIDB4MTYsIDB4MTksIDB4MUEsIDB4MUQsCisgICAgMHgxNiwgMHgxOSwgMHgxQywgMHgxRCwKKyAgICAweDE2LCAweDE3LCAweDFDLCAweDFELAorICAgIDB4MTYsIDB4MTcsIDB4MUEsIDB4MUQsCisgICAgMHgxNiwgMHgxOSwgMHgxQiwgMHgxRSwKKyAgICAweDE2LCAweDFBLCAweDFDLCAweDFFLAorICAgIDB4MTYsIDB4MTgsIDB4MUMsIDB4MUUsCisgICAgMHgxNiwgMHgxOCwgMHgxQSwgMHgxRSwKKyAgICAweDE2LCAweDFFLCAweDFFLCAweDFFLAorICAgIDB4MTYsIDB4MTYsIDB4MUUsIDB4MUUsCisgICAgMHgxNiwgMHgxNiwgMHgxNiwgMHgxRSwKKyAgICAweDE2LCAweDFBLCAweDFELCAweDIxLAorICAgIDB4MTYsIDB4MUIsIDB4MUYsIDB4MjEsCisgICAgMHgxNiwgMHgxOCwgMHgxRiwgMHgyMSwKKyAgICAweDE2LCAweDE4LCAweDFDLCAweDIxLAorICAgIDB4MTYsIDB4MjEsIDB4MjEsIDB4MjEsCisgICAgMHgxNiwgMHgxNiwgMHgyMSwgMHgyMSwKKyAgICAweDE2LCAweDE2LCAweDE2LCAweDIxLAorICAgIDB4MTYsIDB4MUIsIDB4MUYsIDB4MjQsCisgICAgMHgxNiwgMHgxRCwgMHgyMSwgMHgyNCwKKyAgICAweDE2LCAweDE5LCAweDIxLCAweDI0LAorICAgIDB4MTYsIDB4MTksIDB4MUQsIDB4MjQsCisgICAgMHgxNiwgMHgyNCwgMHgyNCwgMHgyNCwKKyAgICAweDE2LCAweDE2LCAweDI0LCAweDI0LAorICAgIDB4MTYsIDB4MTYsIDB4MTYsIDB4MjQsCisgICAgMHgxNiwgMHgxQywgMHgyMSwgMHgyNywKKyAgICAweDE2LCAweDFFLCAweDIzLCAweDI3LAorICAgIDB4MTYsIDB4MUEsIDB4MjMsIDB4MjcsCisgICAgMHgxNiwgMHgxQSwgMHgxRiwgMHgyNywKKyAgICAweDE2LCAweDI3LCAweDI3LCAweDI3LAorICAgIDB4MTYsIDB4MTYsIDB4MjcsIDB4MjcsCisgICAgMHgxNiwgMHgxNiwgMHgxNiwgMHgyNywKKyAgICAweDE2LCAweDFELCAweDIzLCAweDJBLAorICAgIDB4MTYsIDB4MjAsIDB4MjUsIDB4MkEsCisgICAgMHgxNiwgMHgxQiwgMHgyNSwgMHgyQSwKKyAgICAweDE2LCAweDFCLCAweDIwLCAweDJBLAorICAgIDB4MTYsIDB4MkEsIDB4MkEsIDB4MkEsCisgICAgMHgxNiwgMHgxNiwgMHgyQSwgMHgyQSwKKyAgICAweDE2LCAweDE2LCAweDE2LCAweDJBLAorICAgIDB4MTYsIDB4MjEsIDB4MjgsIDB4MkQsCisgICAgMHgxNiwgMHgxQiwgMHgyOCwgMHgyRCwKKyAgICAweDE2LCAweDFCLCAweDIyLCAweDJELAorICAgIDB4MTYsIDB4MkQsIDB4MkQsIDB4MkQsCisgICAgMHgxNiwgMHgxNiwgMHgyRCwgMHgyRCwKKyAgICAweDE2LCAweDE2LCAweDE2LCAweDJELAorICAgIDB4MTYsIDB4MjMsIDB4MkEsIDB4MzAsCisgICAgMHgxNiwgMHgxQywgMHgyQSwgMHgzMCwKKyAgICAweDE2LCAweDFDLCAweDIzLCAweDMwLAorICAgIDB4MTYsIDB4MzAsIDB4MzAsIDB4MzAsCisgICAgMHgxNiwgMHgxNiwgMHgzMCwgMHgzMCwKKyAgICAweDE2LCAweDE2LCAweDE2LCAweDMwLAorICAgIDB4MTYsIDB4MjQsIDB4MkMsIDB4MzMsCisgICAgMHgxNiwgMHgxRCwgMHgyQywgMHgzMywKKyAgICAweDE2LCAweDFELCAweDI1LCAweDMzLAorICAgIDB4MTYsIDB4MzMsIDB4MzMsIDB4MzMsCisgICAgMHgxNiwgMHgxNiwgMHgzMywgMHgzMywKKyAgICAweDE2LCAweDE2LCAweDE2LCAweDMzLAorICAgIDB4MTYsIDB4MjYsIDB4MkUsIDB4MzYsCisgICAgMHgxNiwgMHgxRSwgMHgyRSwgMHgzNiwKKyAgICAweDE2LCAweDFFLCAweDI2LCAweDM2LAorICAgIDB4MTYsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgxNiwgMHgxNiwgMHgzNiwgMHgzNiwKKyAgICAweDE2LCAweDE2LCAweDE2LCAweDM2LAorICAgIDB4MTYsIDB4MzksIDB4MzksIDB4MzksCisgICAgMHgxNiwgMHgxNiwgMHgzOSwgMHgzOSwKKyAgICAweDE2LCAweDE2LCAweDE2LCAweDM5LAorICAgIDB4MTYsIDB4MjgsIDB4MzEsIDB4M0EsCisgICAgMHgxNiwgMHgxRiwgMHgzMSwgMHgzQSwKKyAgICAweDE2LCAweDFGLCAweDI4LCAweDNBLAorICAgIDB4MTYsIDB4M0UsIDB4M0UsIDB4M0UsCisgICAgMHgxNiwgMHgxNiwgMHgzRSwgMHgzRSwKKyAgICAweDE2LCAweDE2LCAweDE2LCAweDNFLAorICAgIDB4MTcsIDB4MTgsIDB4MTgsIDB4MTksCisgICAgMHgxNywgMHgxOCwgMHgxOSwgMHgxQSwKKyAgICAweDE3LCAweDE5LCAweDFBLCAweDFCLAorICAgIDB4MTcsIDB4MTgsIDB4MUEsIDB4MUIsCisgICAgMHgxNywgMHgxOCwgMHgxOSwgMHgxQiwKKyAgICAweDE3LCAweDE5LCAweDFBLCAweDFDLAorICAgIDB4MTcsIDB4MTksIDB4MUIsIDB4MUMsCisgICAgMHgxNywgMHgxOCwgMHgxQiwgMHgxQywKKyAgICAweDE3LCAweDE4LCAweDFBLCAweDFDLAorICAgIDB4MTcsIDB4MTksIDB4MUIsIDB4MUQsCisgICAgMHgxNywgMHgxQSwgMHgxQywgMHgxRCwKKyAgICAweDE3LCAweDE4LCAweDFDLCAweDFELAorICAgIDB4MTcsIDB4MTgsIDB4MUEsIDB4MUQsCisgICAgMHgxNywgMHgxRCwgMHgxRCwgMHgxRCwKKyAgICAweDE3LCAweDE3LCAweDFELCAweDFELAorICAgIDB4MTcsIDB4MTcsIDB4MTcsIDB4MUQsCisgICAgMHgxNywgMHgxQSwgMHgxQiwgMHgxRSwKKyAgICAweDE3LCAweDFBLCAweDFELCAweDFFLAorICAgIDB4MTcsIDB4MTgsIDB4MUQsIDB4MUUsCisgICAgMHgxNywgMHgxOCwgMHgxQiwgMHgxRSwKKyAgICAweDE3LCAweDFBLCAweDFDLCAweDFGLAorICAgIDB4MTcsIDB4MUIsIDB4MUQsIDB4MUYsCisgICAgMHgxNywgMHgxOSwgMHgxRCwgMHgxRiwKKyAgICAweDE3LCAweDE5LCAweDFCLCAweDFGLAorICAgIDB4MTcsIDB4MUYsIDB4MUYsIDB4MUYsCisgICAgMHgxNywgMHgxNywgMHgxRiwgMHgxRiwKKyAgICAweDE3LCAweDE3LCAweDE3LCAweDFGLAorICAgIDB4MTcsIDB4MUIsIDB4MUUsIDB4MjIsCisgICAgMHgxNywgMHgxQywgMHgyMCwgMHgyMiwKKyAgICAweDE3LCAweDE5LCAweDIwLCAweDIyLAorICAgIDB4MTcsIDB4MTksIDB4MUQsIDB4MjIsCisgICAgMHgxNywgMHgyMiwgMHgyMiwgMHgyMiwKKyAgICAweDE3LCAweDE3LCAweDIyLCAweDIyLAorICAgIDB4MTcsIDB4MTcsIDB4MTcsIDB4MjIsCisgICAgMHgxNywgMHgxQywgMHgyMCwgMHgyNSwKKyAgICAweDE3LCAweDFFLCAweDIyLCAweDI1LAorICAgIDB4MTcsIDB4MUEsIDB4MjIsIDB4MjUsCisgICAgMHgxNywgMHgxQSwgMHgxRSwgMHgyNSwKKyAgICAweDE3LCAweDI1LCAweDI1LCAweDI1LAorICAgIDB4MTcsIDB4MTcsIDB4MjUsIDB4MjUsCisgICAgMHgxNywgMHgxNywgMHgxNywgMHgyNSwKKyAgICAweDE3LCAweDFELCAweDIyLCAweDI4LAorICAgIDB4MTcsIDB4MUYsIDB4MjQsIDB4MjgsCisgICAgMHgxNywgMHgxQiwgMHgyNCwgMHgyOCwKKyAgICAweDE3LCAweDFCLCAweDIwLCAweDI4LAorICAgIDB4MTcsIDB4MjgsIDB4MjgsIDB4MjgsCisgICAgMHgxNywgMHgxNywgMHgyOCwgMHgyOCwKKyAgICAweDE3LCAweDE3LCAweDE3LCAweDI4LAorICAgIDB4MTcsIDB4MUUsIDB4MjQsIDB4MkIsCisgICAgMHgxNywgMHgyMSwgMHgyNiwgMHgyQiwKKyAgICAweDE3LCAweDFDLCAweDI2LCAweDJCLAorICAgIDB4MTcsIDB4MUMsIDB4MjEsIDB4MkIsCisgICAgMHgxNywgMHgyQiwgMHgyQiwgMHgyQiwKKyAgICAweDE3LCAweDE3LCAweDJCLCAweDJCLAorICAgIDB4MTcsIDB4MTcsIDB4MTcsIDB4MkIsCisgICAgMHgxNywgMHgyMiwgMHgyOSwgMHgyRSwKKyAgICAweDE3LCAweDFDLCAweDI5LCAweDJFLAorICAgIDB4MTcsIDB4MUMsIDB4MjMsIDB4MkUsCisgICAgMHgxNywgMHgyRSwgMHgyRSwgMHgyRSwKKyAgICAweDE3LCAweDE3LCAweDJFLCAweDJFLAorICAgIDB4MTcsIDB4MTcsIDB4MTcsIDB4MkUsCisgICAgMHgxNywgMHgyNCwgMHgyQiwgMHgzMSwKKyAgICAweDE3LCAweDFELCAweDJCLCAweDMxLAorICAgIDB4MTcsIDB4MUQsIDB4MjQsIDB4MzEsCisgICAgMHgxNywgMHgzMSwgMHgzMSwgMHgzMSwKKyAgICAweDE3LCAweDE3LCAweDMxLCAweDMxLAorICAgIDB4MTcsIDB4MTcsIDB4MTcsIDB4MzEsCisgICAgMHgxNywgMHgyNSwgMHgyRCwgMHgzNCwKKyAgICAweDE3LCAweDFFLCAweDJELCAweDM0LAorICAgIDB4MTcsIDB4MUUsIDB4MjYsIDB4MzQsCisgICAgMHgxNywgMHgzNCwgMHgzNCwgMHgzNCwKKyAgICAweDE3LCAweDE3LCAweDM0LCAweDM0LAorICAgIDB4MTcsIDB4MTcsIDB4MTcsIDB4MzQsCisgICAgMHgxNywgMHgyNywgMHgyRiwgMHgzNywKKyAgICAweDE3LCAweDFGLCAweDJGLCAweDM3LAorICAgIDB4MTcsIDB4MUYsIDB4MjcsIDB4MzcsCisgICAgMHgxNywgMHgzNywgMHgzNywgMHgzNywKKyAgICAweDE3LCAweDE3LCAweDM3LCAweDM3LAorICAgIDB4MTcsIDB4MTcsIDB4MTcsIDB4MzcsCisgICAgMHgxNywgMHgzQSwgMHgzQSwgMHgzQSwKKyAgICAweDE3LCAweDE3LCAweDNBLCAweDNBLAorICAgIDB4MTcsIDB4MTcsIDB4MTcsIDB4M0EsCisgICAgMHgxNywgMHgyOSwgMHgzMiwgMHgzQiwKKyAgICAweDE3LCAweDIwLCAweDMyLCAweDNCLAorICAgIDB4MTcsIDB4MjAsIDB4MjksIDB4M0IsCisgICAgMHgxNywgMHgzRiwgMHgzRiwgMHgzRiwKKyAgICAweDE3LCAweDE3LCAweDNGLCAweDNGLAorICAgIDB4MTcsIDB4MTcsIDB4MTcsIDB4M0YsCisgICAgMHgxOCwgMHgxOSwgMHgxOSwgMHgxQSwKKyAgICAweDE4LCAweDE5LCAweDFBLCAweDFCLAorICAgIDB4MTgsIDB4MUEsIDB4MUIsIDB4MUMsCisgICAgMHgxOCwgMHgxOSwgMHgxQiwgMHgxQywKKyAgICAweDE4LCAweDE5LCAweDFBLCAweDFDLAorICAgIDB4MTgsIDB4MUEsIDB4MUIsIDB4MUQsCisgICAgMHgxOCwgMHgxQSwgMHgxQywgMHgxRCwKKyAgICAweDE4LCAweDE5LCAweDFDLCAweDFELAorICAgIDB4MTgsIDB4MTksIDB4MUIsIDB4MUQsCisgICAgMHgxOCwgMHgxQSwgMHgxQywgMHgxRSwKKyAgICAweDE4LCAweDFCLCAweDFELCAweDFFLAorICAgIDB4MTgsIDB4MTksIDB4MUQsIDB4MUUsCisgICAgMHgxOCwgMHgxOSwgMHgxQiwgMHgxRSwKKyAgICAweDE4LCAweDFFLCAweDFFLCAweDFFLAorICAgIDB4MTgsIDB4MTgsIDB4MUUsIDB4MUUsCisgICAgMHgxOCwgMHgxOCwgMHgxOCwgMHgxRSwKKyAgICAweDE4LCAweDFCLCAweDFDLCAweDFGLAorICAgIDB4MTgsIDB4MUIsIDB4MUUsIDB4MUYsCisgICAgMHgxOCwgMHgxOSwgMHgxRSwgMHgxRiwKKyAgICAweDE4LCAweDE5LCAweDFDLCAweDFGLAorICAgIDB4MTgsIDB4MUIsIDB4MUQsIDB4MjAsCisgICAgMHgxOCwgMHgxQywgMHgxRSwgMHgyMCwKKyAgICAweDE4LCAweDFBLCAweDFFLCAweDIwLAorICAgIDB4MTgsIDB4MUEsIDB4MUMsIDB4MjAsCisgICAgMHgxOCwgMHgyMCwgMHgyMCwgMHgyMCwKKyAgICAweDE4LCAweDE4LCAweDIwLCAweDIwLAorICAgIDB4MTgsIDB4MTgsIDB4MTgsIDB4MjAsCisgICAgMHgxOCwgMHgxQywgMHgxRiwgMHgyMywKKyAgICAweDE4LCAweDFELCAweDIxLCAweDIzLAorICAgIDB4MTgsIDB4MUEsIDB4MjEsIDB4MjMsCisgICAgMHgxOCwgMHgxQSwgMHgxRSwgMHgyMywKKyAgICAweDE4LCAweDIzLCAweDIzLCAweDIzLAorICAgIDB4MTgsIDB4MTgsIDB4MjMsIDB4MjMsCisgICAgMHgxOCwgMHgxOCwgMHgxOCwgMHgyMywKKyAgICAweDE4LCAweDFELCAweDIxLCAweDI2LAorICAgIDB4MTgsIDB4MUYsIDB4MjMsIDB4MjYsCisgICAgMHgxOCwgMHgxQiwgMHgyMywgMHgyNiwKKyAgICAweDE4LCAweDFCLCAweDFGLCAweDI2LAorICAgIDB4MTgsIDB4MjYsIDB4MjYsIDB4MjYsCisgICAgMHgxOCwgMHgxOCwgMHgyNiwgMHgyNiwKKyAgICAweDE4LCAweDE4LCAweDE4LCAweDI2LAorICAgIDB4MTgsIDB4MUUsIDB4MjMsIDB4MjksCisgICAgMHgxOCwgMHgyMCwgMHgyNSwgMHgyOSwKKyAgICAweDE4LCAweDFDLCAweDI1LCAweDI5LAorICAgIDB4MTgsIDB4MUMsIDB4MjEsIDB4MjksCisgICAgMHgxOCwgMHgyOSwgMHgyOSwgMHgyOSwKKyAgICAweDE4LCAweDE4LCAweDI5LCAweDI5LAorICAgIDB4MTgsIDB4MTgsIDB4MTgsIDB4MjksCisgICAgMHgxOCwgMHgxRiwgMHgyNSwgMHgyQywKKyAgICAweDE4LCAweDIyLCAweDI3LCAweDJDLAorICAgIDB4MTgsIDB4MUQsIDB4MjcsIDB4MkMsCisgICAgMHgxOCwgMHgxRCwgMHgyMiwgMHgyQywKKyAgICAweDE4LCAweDJDLCAweDJDLCAweDJDLAorICAgIDB4MTgsIDB4MTgsIDB4MkMsIDB4MkMsCisgICAgMHgxOCwgMHgxOCwgMHgxOCwgMHgyQywKKyAgICAweDE4LCAweDIzLCAweDJBLCAweDJGLAorICAgIDB4MTgsIDB4MUQsIDB4MkEsIDB4MkYsCisgICAgMHgxOCwgMHgxRCwgMHgyNCwgMHgyRiwKKyAgICAweDE4LCAweDJGLCAweDJGLCAweDJGLAorICAgIDB4MTgsIDB4MTgsIDB4MkYsIDB4MkYsCisgICAgMHgxOCwgMHgxOCwgMHgxOCwgMHgyRiwKKyAgICAweDE4LCAweDI1LCAweDJDLCAweDMyLAorICAgIDB4MTgsIDB4MUUsIDB4MkMsIDB4MzIsCisgICAgMHgxOCwgMHgxRSwgMHgyNSwgMHgzMiwKKyAgICAweDE4LCAweDMyLCAweDMyLCAweDMyLAorICAgIDB4MTgsIDB4MTgsIDB4MzIsIDB4MzIsCisgICAgMHgxOCwgMHgxOCwgMHgxOCwgMHgzMiwKKyAgICAweDE4LCAweDI2LCAweDJFLCAweDM1LAorICAgIDB4MTgsIDB4MUYsIDB4MkUsIDB4MzUsCisgICAgMHgxOCwgMHgxRiwgMHgyNywgMHgzNSwKKyAgICAweDE4LCAweDM1LCAweDM1LCAweDM1LAorICAgIDB4MTgsIDB4MTgsIDB4MzUsIDB4MzUsCisgICAgMHgxOCwgMHgxOCwgMHgxOCwgMHgzNSwKKyAgICAweDE4LCAweDI4LCAweDMwLCAweDM4LAorICAgIDB4MTgsIDB4MjAsIDB4MzAsIDB4MzgsCisgICAgMHgxOCwgMHgyMCwgMHgyOCwgMHgzOCwKKyAgICAweDE4LCAweDM4LCAweDM4LCAweDM4LAorICAgIDB4MTgsIDB4MTgsIDB4MzgsIDB4MzgsCisgICAgMHgxOCwgMHgxOCwgMHgxOCwgMHgzOCwKKyAgICAweDE4LCAweDNCLCAweDNCLCAweDNCLAorICAgIDB4MTgsIDB4MTgsIDB4M0IsIDB4M0IsCisgICAgMHgxOCwgMHgxOCwgMHgxOCwgMHgzQiwKKyAgICAweDE4LCAweDJBLCAweDMzLCAweDNDLAorICAgIDB4MTgsIDB4MjEsIDB4MzMsIDB4M0MsCisgICAgMHgxOCwgMHgyMSwgMHgyQSwgMHgzQywKKyAgICAweDE5LCAweDFBLCAweDFBLCAweDFCLAorICAgIDB4MTksIDB4MUEsIDB4MUIsIDB4MUMsCisgICAgMHgxOSwgMHgxQiwgMHgxQywgMHgxRCwKKyAgICAweDE5LCAweDFBLCAweDFDLCAweDFELAorICAgIDB4MTksIDB4MUEsIDB4MUIsIDB4MUQsCisgICAgMHgxOSwgMHgxQiwgMHgxQywgMHgxRSwKKyAgICAweDE5LCAweDFCLCAweDFELCAweDFFLAorICAgIDB4MTksIDB4MUEsIDB4MUQsIDB4MUUsCisgICAgMHgxOSwgMHgxQSwgMHgxQywgMHgxRSwKKyAgICAweDE5LCAweDFCLCAweDFELCAweDFGLAorICAgIDB4MTksIDB4MUMsIDB4MUUsIDB4MUYsCisgICAgMHgxOSwgMHgxQSwgMHgxRSwgMHgxRiwKKyAgICAweDE5LCAweDFBLCAweDFDLCAweDFGLAorICAgIDB4MTksIDB4MUYsIDB4MUYsIDB4MUYsCisgICAgMHgxOSwgMHgxOSwgMHgxRiwgMHgxRiwKKyAgICAweDE5LCAweDE5LCAweDE5LCAweDFGLAorICAgIDB4MTksIDB4MUMsIDB4MUQsIDB4MjAsCisgICAgMHgxOSwgMHgxQywgMHgxRiwgMHgyMCwKKyAgICAweDE5LCAweDFBLCAweDFGLCAweDIwLAorICAgIDB4MTksIDB4MUEsIDB4MUQsIDB4MjAsCisgICAgMHgxOSwgMHgxQywgMHgxRSwgMHgyMSwKKyAgICAweDE5LCAweDFELCAweDFGLCAweDIxLAorICAgIDB4MTksIDB4MUIsIDB4MUYsIDB4MjEsCisgICAgMHgxOSwgMHgxQiwgMHgxRCwgMHgyMSwKKyAgICAweDE5LCAweDIxLCAweDIxLCAweDIxLAorICAgIDB4MTksIDB4MTksIDB4MjEsIDB4MjEsCisgICAgMHgxOSwgMHgxOSwgMHgxOSwgMHgyMSwKKyAgICAweDE5LCAweDFELCAweDIwLCAweDI0LAorICAgIDB4MTksIDB4MUUsIDB4MjIsIDB4MjQsCisgICAgMHgxOSwgMHgxQiwgMHgyMiwgMHgyNCwKKyAgICAweDE5LCAweDFCLCAweDFGLCAweDI0LAorICAgIDB4MTksIDB4MjQsIDB4MjQsIDB4MjQsCisgICAgMHgxOSwgMHgxOSwgMHgyNCwgMHgyNCwKKyAgICAweDE5LCAweDE5LCAweDE5LCAweDI0LAorICAgIDB4MTksIDB4MUUsIDB4MjIsIDB4MjcsCisgICAgMHgxOSwgMHgyMCwgMHgyNCwgMHgyNywKKyAgICAweDE5LCAweDFDLCAweDI0LCAweDI3LAorICAgIDB4MTksIDB4MUMsIDB4MjAsIDB4MjcsCisgICAgMHgxOSwgMHgyNywgMHgyNywgMHgyNywKKyAgICAweDE5LCAweDE5LCAweDI3LCAweDI3LAorICAgIDB4MTksIDB4MTksIDB4MTksIDB4MjcsCisgICAgMHgxOSwgMHgxRiwgMHgyNCwgMHgyQSwKKyAgICAweDE5LCAweDIxLCAweDI2LCAweDJBLAorICAgIDB4MTksIDB4MUQsIDB4MjYsIDB4MkEsCisgICAgMHgxOSwgMHgxRCwgMHgyMiwgMHgyQSwKKyAgICAweDE5LCAweDJBLCAweDJBLCAweDJBLAorICAgIDB4MTksIDB4MTksIDB4MkEsIDB4MkEsCisgICAgMHgxOSwgMHgxOSwgMHgxOSwgMHgyQSwKKyAgICAweDE5LCAweDIwLCAweDI2LCAweDJELAorICAgIDB4MTksIDB4MjMsIDB4MjgsIDB4MkQsCisgICAgMHgxOSwgMHgxRSwgMHgyOCwgMHgyRCwKKyAgICAweDE5LCAweDFFLCAweDIzLCAweDJELAorICAgIDB4MTksIDB4MkQsIDB4MkQsIDB4MkQsCisgICAgMHgxOSwgMHgxOSwgMHgyRCwgMHgyRCwKKyAgICAweDE5LCAweDE5LCAweDE5LCAweDJELAorICAgIDB4MTksIDB4MjQsIDB4MkIsIDB4MzAsCisgICAgMHgxOSwgMHgxRSwgMHgyQiwgMHgzMCwKKyAgICAweDE5LCAweDFFLCAweDI1LCAweDMwLAorICAgIDB4MTksIDB4MzAsIDB4MzAsIDB4MzAsCisgICAgMHgxOSwgMHgxOSwgMHgzMCwgMHgzMCwKKyAgICAweDE5LCAweDE5LCAweDE5LCAweDMwLAorICAgIDB4MTksIDB4MjYsIDB4MkQsIDB4MzMsCisgICAgMHgxOSwgMHgxRiwgMHgyRCwgMHgzMywKKyAgICAweDE5LCAweDFGLCAweDI2LCAweDMzLAorICAgIDB4MTksIDB4MzMsIDB4MzMsIDB4MzMsCisgICAgMHgxOSwgMHgxOSwgMHgzMywgMHgzMywKKyAgICAweDE5LCAweDE5LCAweDE5LCAweDMzLAorICAgIDB4MTksIDB4MjcsIDB4MkYsIDB4MzYsCisgICAgMHgxOSwgMHgyMCwgMHgyRiwgMHgzNiwKKyAgICAweDE5LCAweDIwLCAweDI4LCAweDM2LAorICAgIDB4MTksIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgxOSwgMHgxOSwgMHgzNiwgMHgzNiwKKyAgICAweDE5LCAweDE5LCAweDE5LCAweDM2LAorICAgIDB4MTksIDB4MjksIDB4MzEsIDB4MzksCisgICAgMHgxOSwgMHgyMSwgMHgzMSwgMHgzOSwKKyAgICAweDE5LCAweDIxLCAweDI5LCAweDM5LAorICAgIDB4MTksIDB4MzksIDB4MzksIDB4MzksCisgICAgMHgxOSwgMHgxOSwgMHgzOSwgMHgzOSwKKyAgICAweDE5LCAweDE5LCAweDE5LCAweDM5LAorICAgIDB4MTksIDB4M0MsIDB4M0MsIDB4M0MsCisgICAgMHgxOSwgMHgxOSwgMHgzQywgMHgzQywKKyAgICAweDE5LCAweDE5LCAweDE5LCAweDNDLAorICAgIDB4MTksIDB4MkIsIDB4MzQsIDB4M0QsCisgICAgMHgxOSwgMHgyMiwgMHgzNCwgMHgzRCwKKyAgICAweDE5LCAweDIyLCAweDJCLCAweDNELAorICAgIDB4MUEsIDB4MUIsIDB4MUIsIDB4MUMsCisgICAgMHgxQSwgMHgxQiwgMHgxQywgMHgxRCwKKyAgICAweDFBLCAweDFDLCAweDFELCAweDFFLAorICAgIDB4MUEsIDB4MUIsIDB4MUQsIDB4MUUsCisgICAgMHgxQSwgMHgxQiwgMHgxQywgMHgxRSwKKyAgICAweDFBLCAweDFDLCAweDFELCAweDFGLAorICAgIDB4MUEsIDB4MUMsIDB4MUUsIDB4MUYsCisgICAgMHgxQSwgMHgxQiwgMHgxRSwgMHgxRiwKKyAgICAweDFBLCAweDFCLCAweDFELCAweDFGLAorICAgIDB4MUEsIDB4MUMsIDB4MUUsIDB4MjAsCisgICAgMHgxQSwgMHgxRCwgMHgxRiwgMHgyMCwKKyAgICAweDFBLCAweDFCLCAweDFGLCAweDIwLAorICAgIDB4MUEsIDB4MUIsIDB4MUQsIDB4MjAsCisgICAgMHgxQSwgMHgyMCwgMHgyMCwgMHgyMCwKKyAgICAweDFBLCAweDFBLCAweDIwLCAweDIwLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MjAsCisgICAgMHgxQSwgMHgxRCwgMHgxRSwgMHgyMSwKKyAgICAweDFBLCAweDFELCAweDIwLCAweDIxLAorICAgIDB4MUEsIDB4MUIsIDB4MjAsIDB4MjEsCisgICAgMHgxQSwgMHgxQiwgMHgxRSwgMHgyMSwKKyAgICAweDFBLCAweDFELCAweDFGLCAweDIyLAorICAgIDB4MUEsIDB4MUUsIDB4MjAsIDB4MjIsCisgICAgMHgxQSwgMHgxQywgMHgyMCwgMHgyMiwKKyAgICAweDFBLCAweDFDLCAweDFFLCAweDIyLAorICAgIDB4MUEsIDB4MjIsIDB4MjIsIDB4MjIsCisgICAgMHgxQSwgMHgxQSwgMHgyMiwgMHgyMiwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDIyLAorICAgIDB4MUEsIDB4MUUsIDB4MjEsIDB4MjUsCisgICAgMHgxQSwgMHgxRiwgMHgyMywgMHgyNSwKKyAgICAweDFBLCAweDFDLCAweDIzLCAweDI1LAorICAgIDB4MUEsIDB4MUMsIDB4MjAsIDB4MjUsCisgICAgMHgxQSwgMHgyNSwgMHgyNSwgMHgyNSwKKyAgICAweDFBLCAweDFBLCAweDI1LCAweDI1LAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MjUsCisgICAgMHgxQSwgMHgxRiwgMHgyMywgMHgyOCwKKyAgICAweDFBLCAweDIxLCAweDI1LCAweDI4LAorICAgIDB4MUEsIDB4MUQsIDB4MjUsIDB4MjgsCisgICAgMHgxQSwgMHgxRCwgMHgyMSwgMHgyOCwKKyAgICAweDFBLCAweDI4LCAweDI4LCAweDI4LAorICAgIDB4MUEsIDB4MUEsIDB4MjgsIDB4MjgsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgyOCwKKyAgICAweDFBLCAweDIwLCAweDI1LCAweDJCLAorICAgIDB4MUEsIDB4MjIsIDB4MjcsIDB4MkIsCisgICAgMHgxQSwgMHgxRSwgMHgyNywgMHgyQiwKKyAgICAweDFBLCAweDFFLCAweDIzLCAweDJCLAorICAgIDB4MUEsIDB4MkIsIDB4MkIsIDB4MkIsCisgICAgMHgxQSwgMHgxQSwgMHgyQiwgMHgyQiwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDJCLAorICAgIDB4MUEsIDB4MjEsIDB4MjcsIDB4MkUsCisgICAgMHgxQSwgMHgyNCwgMHgyOSwgMHgyRSwKKyAgICAweDFBLCAweDFGLCAweDI5LCAweDJFLAorICAgIDB4MUEsIDB4MUYsIDB4MjQsIDB4MkUsCisgICAgMHgxQSwgMHgyRSwgMHgyRSwgMHgyRSwKKyAgICAweDFBLCAweDFBLCAweDJFLCAweDJFLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MkUsCisgICAgMHgxQSwgMHgyNSwgMHgyQywgMHgzMSwKKyAgICAweDFBLCAweDFGLCAweDJDLCAweDMxLAorICAgIDB4MUEsIDB4MUYsIDB4MjYsIDB4MzEsCisgICAgMHgxQSwgMHgzMSwgMHgzMSwgMHgzMSwKKyAgICAweDFBLCAweDFBLCAweDMxLCAweDMxLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MzEsCisgICAgMHgxQSwgMHgyNywgMHgyRSwgMHgzNCwKKyAgICAweDFBLCAweDIwLCAweDJFLCAweDM0LAorICAgIDB4MUEsIDB4MjAsIDB4MjcsIDB4MzQsCisgICAgMHgxQSwgMHgzNCwgMHgzNCwgMHgzNCwKKyAgICAweDFBLCAweDFBLCAweDM0LCAweDM0LAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MzQsCisgICAgMHgxQSwgMHgyOCwgMHgzMCwgMHgzNywKKyAgICAweDFBLCAweDIxLCAweDMwLCAweDM3LAorICAgIDB4MUEsIDB4MjEsIDB4MjksIDB4MzcsCisgICAgMHgxQSwgMHgzNywgMHgzNywgMHgzNywKKyAgICAweDFBLCAweDFBLCAweDM3LCAweDM3LAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MzcsCisgICAgMHgxQSwgMHgyQSwgMHgzMiwgMHgzQSwKKyAgICAweDFBLCAweDIyLCAweDMyLCAweDNBLAorICAgIDB4MUEsIDB4MjIsIDB4MkEsIDB4M0EsCisgICAgMHgxQSwgMHgzQSwgMHgzQSwgMHgzQSwKKyAgICAweDFBLCAweDFBLCAweDNBLCAweDNBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4M0EsCisgICAgMHgxQSwgMHgzRCwgMHgzRCwgMHgzRCwKKyAgICAweDFBLCAweDFBLCAweDNELCAweDNELAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4M0QsCisgICAgMHgxQSwgMHgyQywgMHgzNSwgMHgzRSwKKyAgICAweDFBLCAweDIzLCAweDM1LCAweDNFLAorICAgIDB4MUEsIDB4MjMsIDB4MkMsIDB4M0UsCisgICAgMHgxQiwgMHgxQywgMHgxQywgMHgxRCwKKyAgICAweDFCLCAweDFDLCAweDFELCAweDFFLAorICAgIDB4MUIsIDB4MUQsIDB4MUUsIDB4MUYsCisgICAgMHgxQiwgMHgxQywgMHgxRSwgMHgxRiwKKyAgICAweDFCLCAweDFDLCAweDFELCAweDFGLAorICAgIDB4MUIsIDB4MUQsIDB4MUUsIDB4MjAsCisgICAgMHgxQiwgMHgxRCwgMHgxRiwgMHgyMCwKKyAgICAweDFCLCAweDFDLCAweDFGLCAweDIwLAorICAgIDB4MUIsIDB4MUMsIDB4MUUsIDB4MjAsCisgICAgMHgxQiwgMHgxRCwgMHgxRiwgMHgyMSwKKyAgICAweDFCLCAweDFFLCAweDIwLCAweDIxLAorICAgIDB4MUIsIDB4MUMsIDB4MjAsIDB4MjEsCisgICAgMHgxQiwgMHgxQywgMHgxRSwgMHgyMSwKKyAgICAweDFCLCAweDIxLCAweDIxLCAweDIxLAorICAgIDB4MUIsIDB4MUIsIDB4MjEsIDB4MjEsCisgICAgMHgxQiwgMHgxQiwgMHgxQiwgMHgyMSwKKyAgICAweDFCLCAweDFFLCAweDFGLCAweDIyLAorICAgIDB4MUIsIDB4MUUsIDB4MjEsIDB4MjIsCisgICAgMHgxQiwgMHgxQywgMHgyMSwgMHgyMiwKKyAgICAweDFCLCAweDFDLCAweDFGLCAweDIyLAorICAgIDB4MUIsIDB4MUUsIDB4MjAsIDB4MjMsCisgICAgMHgxQiwgMHgxRiwgMHgyMSwgMHgyMywKKyAgICAweDFCLCAweDFELCAweDIxLCAweDIzLAorICAgIDB4MUIsIDB4MUQsIDB4MUYsIDB4MjMsCisgICAgMHgxQiwgMHgyMywgMHgyMywgMHgyMywKKyAgICAweDFCLCAweDFCLCAweDIzLCAweDIzLAorICAgIDB4MUIsIDB4MUIsIDB4MUIsIDB4MjMsCisgICAgMHgxQiwgMHgxRiwgMHgyMiwgMHgyNiwKKyAgICAweDFCLCAweDIwLCAweDI0LCAweDI2LAorICAgIDB4MUIsIDB4MUQsIDB4MjQsIDB4MjYsCisgICAgMHgxQiwgMHgxRCwgMHgyMSwgMHgyNiwKKyAgICAweDFCLCAweDI2LCAweDI2LCAweDI2LAorICAgIDB4MUIsIDB4MUIsIDB4MjYsIDB4MjYsCisgICAgMHgxQiwgMHgxQiwgMHgxQiwgMHgyNiwKKyAgICAweDFCLCAweDIwLCAweDI0LCAweDI5LAorICAgIDB4MUIsIDB4MjIsIDB4MjYsIDB4MjksCisgICAgMHgxQiwgMHgxRSwgMHgyNiwgMHgyOSwKKyAgICAweDFCLCAweDFFLCAweDIyLCAweDI5LAorICAgIDB4MUIsIDB4MjksIDB4MjksIDB4MjksCisgICAgMHgxQiwgMHgxQiwgMHgyOSwgMHgyOSwKKyAgICAweDFCLCAweDFCLCAweDFCLCAweDI5LAorICAgIDB4MUIsIDB4MjEsIDB4MjYsIDB4MkMsCisgICAgMHgxQiwgMHgyMywgMHgyOCwgMHgyQywKKyAgICAweDFCLCAweDFGLCAweDI4LCAweDJDLAorICAgIDB4MUIsIDB4MUYsIDB4MjQsIDB4MkMsCisgICAgMHgxQiwgMHgyQywgMHgyQywgMHgyQywKKyAgICAweDFCLCAweDFCLCAweDJDLCAweDJDLAorICAgIDB4MUIsIDB4MUIsIDB4MUIsIDB4MkMsCisgICAgMHgxQiwgMHgyMiwgMHgyOCwgMHgyRiwKKyAgICAweDFCLCAweDI1LCAweDJBLCAweDJGLAorICAgIDB4MUIsIDB4MjAsIDB4MkEsIDB4MkYsCisgICAgMHgxQiwgMHgyMCwgMHgyNSwgMHgyRiwKKyAgICAweDFCLCAweDJGLCAweDJGLCAweDJGLAorICAgIDB4MUIsIDB4MUIsIDB4MkYsIDB4MkYsCisgICAgMHgxQiwgMHgxQiwgMHgxQiwgMHgyRiwKKyAgICAweDFCLCAweDI2LCAweDJELCAweDMyLAorICAgIDB4MUIsIDB4MjAsIDB4MkQsIDB4MzIsCisgICAgMHgxQiwgMHgyMCwgMHgyNywgMHgzMiwKKyAgICAweDFCLCAweDMyLCAweDMyLCAweDMyLAorICAgIDB4MUIsIDB4MUIsIDB4MzIsIDB4MzIsCisgICAgMHgxQiwgMHgxQiwgMHgxQiwgMHgzMiwKKyAgICAweDFCLCAweDI4LCAweDJGLCAweDM1LAorICAgIDB4MUIsIDB4MjEsIDB4MkYsIDB4MzUsCisgICAgMHgxQiwgMHgyMSwgMHgyOCwgMHgzNSwKKyAgICAweDFCLCAweDM1LCAweDM1LCAweDM1LAorICAgIDB4MUIsIDB4MUIsIDB4MzUsIDB4MzUsCisgICAgMHgxQiwgMHgxQiwgMHgxQiwgMHgzNSwKKyAgICAweDFCLCAweDI5LCAweDMxLCAweDM4LAorICAgIDB4MUIsIDB4MjIsIDB4MzEsIDB4MzgsCisgICAgMHgxQiwgMHgyMiwgMHgyQSwgMHgzOCwKKyAgICAweDFCLCAweDM4LCAweDM4LCAweDM4LAorICAgIDB4MUIsIDB4MUIsIDB4MzgsIDB4MzgsCisgICAgMHgxQiwgMHgxQiwgMHgxQiwgMHgzOCwKKyAgICAweDFCLCAweDJCLCAweDMzLCAweDNCLAorICAgIDB4MUIsIDB4MjMsIDB4MzMsIDB4M0IsCisgICAgMHgxQiwgMHgyMywgMHgyQiwgMHgzQiwKKyAgICAweDFCLCAweDNCLCAweDNCLCAweDNCLAorICAgIDB4MUIsIDB4MUIsIDB4M0IsIDB4M0IsCisgICAgMHgxQiwgMHgxQiwgMHgxQiwgMHgzQiwKKyAgICAweDFCLCAweDNFLCAweDNFLCAweDNFLAorICAgIDB4MUIsIDB4MUIsIDB4M0UsIDB4M0UsCisgICAgMHgxQiwgMHgxQiwgMHgxQiwgMHgzRSwKKyAgICAweDFCLCAweDJELCAweDM2LCAweDNGLAorICAgIDB4MUIsIDB4MjQsIDB4MzYsIDB4M0YsCisgICAgMHgxQiwgMHgyNCwgMHgyRCwgMHgzRiwKKyAgICAweDFDLCAweDFELCAweDFELCAweDFFLAorICAgIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsCisgICAgMHgxQywgMHgxRSwgMHgxRiwgMHgyMCwKKyAgICAweDFDLCAweDFELCAweDFGLCAweDIwLAorICAgIDB4MUMsIDB4MUQsIDB4MUUsIDB4MjAsCisgICAgMHgxQywgMHgxRSwgMHgxRiwgMHgyMSwKKyAgICAweDFDLCAweDFFLCAweDIwLCAweDIxLAorICAgIDB4MUMsIDB4MUQsIDB4MjAsIDB4MjEsCisgICAgMHgxQywgMHgxRCwgMHgxRiwgMHgyMSwKKyAgICAweDFDLCAweDFFLCAweDIwLCAweDIyLAorICAgIDB4MUMsIDB4MUYsIDB4MjEsIDB4MjIsCisgICAgMHgxQywgMHgxRCwgMHgyMSwgMHgyMiwKKyAgICAweDFDLCAweDFELCAweDFGLCAweDIyLAorICAgIDB4MUMsIDB4MjIsIDB4MjIsIDB4MjIsCisgICAgMHgxQywgMHgxQywgMHgyMiwgMHgyMiwKKyAgICAweDFDLCAweDFDLCAweDFDLCAweDIyLAorICAgIDB4MUMsIDB4MUYsIDB4MjAsIDB4MjMsCisgICAgMHgxQywgMHgxRiwgMHgyMiwgMHgyMywKKyAgICAweDFDLCAweDFELCAweDIyLCAweDIzLAorICAgIDB4MUMsIDB4MUQsIDB4MjAsIDB4MjMsCisgICAgMHgxQywgMHgxRiwgMHgyMSwgMHgyNCwKKyAgICAweDFDLCAweDIwLCAweDIyLCAweDI0LAorICAgIDB4MUMsIDB4MUUsIDB4MjIsIDB4MjQsCisgICAgMHgxQywgMHgxRSwgMHgyMCwgMHgyNCwKKyAgICAweDFDLCAweDI0LCAweDI0LCAweDI0LAorICAgIDB4MUMsIDB4MUMsIDB4MjQsIDB4MjQsCisgICAgMHgxQywgMHgxQywgMHgxQywgMHgyNCwKKyAgICAweDFDLCAweDIwLCAweDIzLCAweDI3LAorICAgIDB4MUMsIDB4MjEsIDB4MjUsIDB4MjcsCisgICAgMHgxQywgMHgxRSwgMHgyNSwgMHgyNywKKyAgICAweDFDLCAweDFFLCAweDIyLCAweDI3LAorICAgIDB4MUMsIDB4MjcsIDB4MjcsIDB4MjcsCisgICAgMHgxQywgMHgxQywgMHgyNywgMHgyNywKKyAgICAweDFDLCAweDFDLCAweDFDLCAweDI3LAorICAgIDB4MUMsIDB4MjEsIDB4MjUsIDB4MkEsCisgICAgMHgxQywgMHgyMywgMHgyNywgMHgyQSwKKyAgICAweDFDLCAweDFGLCAweDI3LCAweDJBLAorICAgIDB4MUMsIDB4MUYsIDB4MjMsIDB4MkEsCisgICAgMHgxQywgMHgyQSwgMHgyQSwgMHgyQSwKKyAgICAweDFDLCAweDFDLCAweDJBLCAweDJBLAorICAgIDB4MUMsIDB4MUMsIDB4MUMsIDB4MkEsCisgICAgMHgxQywgMHgyMiwgMHgyNywgMHgyRCwKKyAgICAweDFDLCAweDI0LCAweDI5LCAweDJELAorICAgIDB4MUMsIDB4MjAsIDB4MjksIDB4MkQsCisgICAgMHgxQywgMHgyMCwgMHgyNSwgMHgyRCwKKyAgICAweDFDLCAweDJELCAweDJELCAweDJELAorICAgIDB4MUMsIDB4MUMsIDB4MkQsIDB4MkQsCisgICAgMHgxQywgMHgxQywgMHgxQywgMHgyRCwKKyAgICAweDFDLCAweDIzLCAweDI5LCAweDMwLAorICAgIDB4MUMsIDB4MjYsIDB4MkIsIDB4MzAsCisgICAgMHgxQywgMHgyMSwgMHgyQiwgMHgzMCwKKyAgICAweDFDLCAweDIxLCAweDI2LCAweDMwLAorICAgIDB4MUMsIDB4MzAsIDB4MzAsIDB4MzAsCisgICAgMHgxQywgMHgxQywgMHgzMCwgMHgzMCwKKyAgICAweDFDLCAweDFDLCAweDFDLCAweDMwLAorICAgIDB4MUMsIDB4MjcsIDB4MkUsIDB4MzMsCisgICAgMHgxQywgMHgyMSwgMHgyRSwgMHgzMywKKyAgICAweDFDLCAweDIxLCAweDI4LCAweDMzLAorICAgIDB4MUMsIDB4MzMsIDB4MzMsIDB4MzMsCisgICAgMHgxQywgMHgxQywgMHgzMywgMHgzMywKKyAgICAweDFDLCAweDFDLCAweDFDLCAweDMzLAorICAgIDB4MUMsIDB4MjksIDB4MzAsIDB4MzYsCisgICAgMHgxQywgMHgyMiwgMHgzMCwgMHgzNiwKKyAgICAweDFDLCAweDIyLCAweDI5LCAweDM2LAorICAgIDB4MUMsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgxQywgMHgxQywgMHgzNiwgMHgzNiwKKyAgICAweDFDLCAweDFDLCAweDFDLCAweDM2LAorICAgIDB4MUMsIDB4MkEsIDB4MzIsIDB4MzksCisgICAgMHgxQywgMHgyMywgMHgzMiwgMHgzOSwKKyAgICAweDFDLCAweDIzLCAweDJCLCAweDM5LAorICAgIDB4MUMsIDB4MzksIDB4MzksIDB4MzksCisgICAgMHgxQywgMHgxQywgMHgzOSwgMHgzOSwKKyAgICAweDFDLCAweDFDLCAweDFDLCAweDM5LAorICAgIDB4MUMsIDB4MkMsIDB4MzQsIDB4M0MsCisgICAgMHgxQywgMHgyNCwgMHgzNCwgMHgzQywKKyAgICAweDFDLCAweDI0LCAweDJDLCAweDNDLAorICAgIDB4MUMsIDB4M0MsIDB4M0MsIDB4M0MsCisgICAgMHgxQywgMHgxQywgMHgzQywgMHgzQywKKyAgICAweDFDLCAweDFDLCAweDFDLCAweDNDLAorICAgIDB4MUMsIDB4M0YsIDB4M0YsIDB4M0YsCisgICAgMHgxQywgMHgxQywgMHgzRiwgMHgzRiwKKyAgICAweDFDLCAweDFDLCAweDFDLCAweDNGLAorICAgIDB4MUQsIDB4MUUsIDB4MUUsIDB4MUYsCisgICAgMHgxRCwgMHgxRSwgMHgxRiwgMHgyMCwKKyAgICAweDFELCAweDFGLCAweDIwLCAweDIxLAorICAgIDB4MUQsIDB4MUUsIDB4MjAsIDB4MjEsCisgICAgMHgxRCwgMHgxRSwgMHgxRiwgMHgyMSwKKyAgICAweDFELCAweDFGLCAweDIwLCAweDIyLAorICAgIDB4MUQsIDB4MUYsIDB4MjEsIDB4MjIsCisgICAgMHgxRCwgMHgxRSwgMHgyMSwgMHgyMiwKKyAgICAweDFELCAweDFFLCAweDIwLCAweDIyLAorICAgIDB4MUQsIDB4MUYsIDB4MjEsIDB4MjMsCisgICAgMHgxRCwgMHgyMCwgMHgyMiwgMHgyMywKKyAgICAweDFELCAweDFFLCAweDIyLCAweDIzLAorICAgIDB4MUQsIDB4MUUsIDB4MjAsIDB4MjMsCisgICAgMHgxRCwgMHgyMywgMHgyMywgMHgyMywKKyAgICAweDFELCAweDFELCAweDIzLCAweDIzLAorICAgIDB4MUQsIDB4MUQsIDB4MUQsIDB4MjMsCisgICAgMHgxRCwgMHgyMCwgMHgyMSwgMHgyNCwKKyAgICAweDFELCAweDIwLCAweDIzLCAweDI0LAorICAgIDB4MUQsIDB4MUUsIDB4MjMsIDB4MjQsCisgICAgMHgxRCwgMHgxRSwgMHgyMSwgMHgyNCwKKyAgICAweDFELCAweDIwLCAweDIyLCAweDI1LAorICAgIDB4MUQsIDB4MjEsIDB4MjMsIDB4MjUsCisgICAgMHgxRCwgMHgxRiwgMHgyMywgMHgyNSwKKyAgICAweDFELCAweDFGLCAweDIxLCAweDI1LAorICAgIDB4MUQsIDB4MjUsIDB4MjUsIDB4MjUsCisgICAgMHgxRCwgMHgxRCwgMHgyNSwgMHgyNSwKKyAgICAweDFELCAweDFELCAweDFELCAweDI1LAorICAgIDB4MUQsIDB4MjEsIDB4MjQsIDB4MjgsCisgICAgMHgxRCwgMHgyMiwgMHgyNiwgMHgyOCwKKyAgICAweDFELCAweDFGLCAweDI2LCAweDI4LAorICAgIDB4MUQsIDB4MUYsIDB4MjMsIDB4MjgsCisgICAgMHgxRCwgMHgyOCwgMHgyOCwgMHgyOCwKKyAgICAweDFELCAweDFELCAweDI4LCAweDI4LAorICAgIDB4MUQsIDB4MUQsIDB4MUQsIDB4MjgsCisgICAgMHgxRCwgMHgyMiwgMHgyNiwgMHgyQiwKKyAgICAweDFELCAweDI0LCAweDI4LCAweDJCLAorICAgIDB4MUQsIDB4MjAsIDB4MjgsIDB4MkIsCisgICAgMHgxRCwgMHgyMCwgMHgyNCwgMHgyQiwKKyAgICAweDFELCAweDJCLCAweDJCLCAweDJCLAorICAgIDB4MUQsIDB4MUQsIDB4MkIsIDB4MkIsCisgICAgMHgxRCwgMHgxRCwgMHgxRCwgMHgyQiwKKyAgICAweDFELCAweDIzLCAweDI4LCAweDJFLAorICAgIDB4MUQsIDB4MjUsIDB4MkEsIDB4MkUsCisgICAgMHgxRCwgMHgyMSwgMHgyQSwgMHgyRSwKKyAgICAweDFELCAweDIxLCAweDI2LCAweDJFLAorICAgIDB4MUQsIDB4MkUsIDB4MkUsIDB4MkUsCisgICAgMHgxRCwgMHgxRCwgMHgyRSwgMHgyRSwKKyAgICAweDFELCAweDFELCAweDFELCAweDJFLAorICAgIDB4MUQsIDB4MjQsIDB4MkEsIDB4MzEsCisgICAgMHgxRCwgMHgyNywgMHgyQywgMHgzMSwKKyAgICAweDFELCAweDIyLCAweDJDLCAweDMxLAorICAgIDB4MUQsIDB4MjIsIDB4MjcsIDB4MzEsCisgICAgMHgxRCwgMHgzMSwgMHgzMSwgMHgzMSwKKyAgICAweDFELCAweDFELCAweDMxLCAweDMxLAorICAgIDB4MUQsIDB4MUQsIDB4MUQsIDB4MzEsCisgICAgMHgxRCwgMHgyOCwgMHgyRiwgMHgzNCwKKyAgICAweDFELCAweDIyLCAweDJGLCAweDM0LAorICAgIDB4MUQsIDB4MjIsIDB4MjksIDB4MzQsCisgICAgMHgxRCwgMHgzNCwgMHgzNCwgMHgzNCwKKyAgICAweDFELCAweDFELCAweDM0LCAweDM0LAorICAgIDB4MUQsIDB4MUQsIDB4MUQsIDB4MzQsCisgICAgMHgxRCwgMHgyQSwgMHgzMSwgMHgzNywKKyAgICAweDFELCAweDIzLCAweDMxLCAweDM3LAorICAgIDB4MUQsIDB4MjMsIDB4MkEsIDB4MzcsCisgICAgMHgxRCwgMHgzNywgMHgzNywgMHgzNywKKyAgICAweDFELCAweDFELCAweDM3LCAweDM3LAorICAgIDB4MUQsIDB4MUQsIDB4MUQsIDB4MzcsCisgICAgMHgxRCwgMHgyQiwgMHgzMywgMHgzQSwKKyAgICAweDFELCAweDI0LCAweDMzLCAweDNBLAorICAgIDB4MUQsIDB4MjQsIDB4MkMsIDB4M0EsCisgICAgMHgxRCwgMHgzQSwgMHgzQSwgMHgzQSwKKyAgICAweDFELCAweDFELCAweDNBLCAweDNBLAorICAgIDB4MUQsIDB4MUQsIDB4MUQsIDB4M0EsCisgICAgMHgxRCwgMHgyRCwgMHgzNSwgMHgzRCwKKyAgICAweDFELCAweDI1LCAweDM1LCAweDNELAorICAgIDB4MUQsIDB4MjUsIDB4MkQsIDB4M0QsCisgICAgMHgxRCwgMHgzRCwgMHgzRCwgMHgzRCwKKyAgICAweDFELCAweDFELCAweDNELCAweDNELAorICAgIDB4MUQsIDB4MUQsIDB4MUQsIDB4M0QsCisgICAgMHgxRSwgMHgxRiwgMHgxRiwgMHgyMCwKKyAgICAweDFFLCAweDFGLCAweDIwLCAweDIxLAorICAgIDB4MUUsIDB4MjAsIDB4MjEsIDB4MjIsCisgICAgMHgxRSwgMHgxRiwgMHgyMSwgMHgyMiwKKyAgICAweDFFLCAweDFGLCAweDIwLCAweDIyLAorICAgIDB4MUUsIDB4MjAsIDB4MjEsIDB4MjMsCisgICAgMHgxRSwgMHgyMCwgMHgyMiwgMHgyMywKKyAgICAweDFFLCAweDFGLCAweDIyLCAweDIzLAorICAgIDB4MUUsIDB4MUYsIDB4MjEsIDB4MjMsCisgICAgMHgxRSwgMHgyMCwgMHgyMiwgMHgyNCwKKyAgICAweDFFLCAweDIxLCAweDIzLCAweDI0LAorICAgIDB4MUUsIDB4MUYsIDB4MjMsIDB4MjQsCisgICAgMHgxRSwgMHgxRiwgMHgyMSwgMHgyNCwKKyAgICAweDFFLCAweDI0LCAweDI0LCAweDI0LAorICAgIDB4MUUsIDB4MUUsIDB4MjQsIDB4MjQsCisgICAgMHgxRSwgMHgxRSwgMHgxRSwgMHgyNCwKKyAgICAweDFFLCAweDIxLCAweDIyLCAweDI1LAorICAgIDB4MUUsIDB4MjEsIDB4MjQsIDB4MjUsCisgICAgMHgxRSwgMHgxRiwgMHgyNCwgMHgyNSwKKyAgICAweDFFLCAweDFGLCAweDIyLCAweDI1LAorICAgIDB4MUUsIDB4MjEsIDB4MjMsIDB4MjYsCisgICAgMHgxRSwgMHgyMiwgMHgyNCwgMHgyNiwKKyAgICAweDFFLCAweDIwLCAweDI0LCAweDI2LAorICAgIDB4MUUsIDB4MjAsIDB4MjIsIDB4MjYsCisgICAgMHgxRSwgMHgyNiwgMHgyNiwgMHgyNiwKKyAgICAweDFFLCAweDFFLCAweDI2LCAweDI2LAorICAgIDB4MUUsIDB4MUUsIDB4MUUsIDB4MjYsCisgICAgMHgxRSwgMHgyMiwgMHgyNSwgMHgyOSwKKyAgICAweDFFLCAweDIzLCAweDI3LCAweDI5LAorICAgIDB4MUUsIDB4MjAsIDB4MjcsIDB4MjksCisgICAgMHgxRSwgMHgyMCwgMHgyNCwgMHgyOSwKKyAgICAweDFFLCAweDI5LCAweDI5LCAweDI5LAorICAgIDB4MUUsIDB4MUUsIDB4MjksIDB4MjksCisgICAgMHgxRSwgMHgxRSwgMHgxRSwgMHgyOSwKKyAgICAweDFFLCAweDIzLCAweDI3LCAweDJDLAorICAgIDB4MUUsIDB4MjUsIDB4MjksIDB4MkMsCisgICAgMHgxRSwgMHgyMSwgMHgyOSwgMHgyQywKKyAgICAweDFFLCAweDIxLCAweDI1LCAweDJDLAorICAgIDB4MUUsIDB4MkMsIDB4MkMsIDB4MkMsCisgICAgMHgxRSwgMHgxRSwgMHgyQywgMHgyQywKKyAgICAweDFFLCAweDFFLCAweDFFLCAweDJDLAorICAgIDB4MUUsIDB4MjQsIDB4MjksIDB4MkYsCisgICAgMHgxRSwgMHgyNiwgMHgyQiwgMHgyRiwKKyAgICAweDFFLCAweDIyLCAweDJCLCAweDJGLAorICAgIDB4MUUsIDB4MjIsIDB4MjcsIDB4MkYsCisgICAgMHgxRSwgMHgyRiwgMHgyRiwgMHgyRiwKKyAgICAweDFFLCAweDFFLCAweDJGLCAweDJGLAorICAgIDB4MUUsIDB4MUUsIDB4MUUsIDB4MkYsCisgICAgMHgxRSwgMHgyNSwgMHgyQiwgMHgzMiwKKyAgICAweDFFLCAweDI4LCAweDJELCAweDMyLAorICAgIDB4MUUsIDB4MjMsIDB4MkQsIDB4MzIsCisgICAgMHgxRSwgMHgyMywgMHgyOCwgMHgzMiwKKyAgICAweDFFLCAweDMyLCAweDMyLCAweDMyLAorICAgIDB4MUUsIDB4MUUsIDB4MzIsIDB4MzIsCisgICAgMHgxRSwgMHgxRSwgMHgxRSwgMHgzMiwKKyAgICAweDFFLCAweDI5LCAweDMwLCAweDM1LAorICAgIDB4MUUsIDB4MjMsIDB4MzAsIDB4MzUsCisgICAgMHgxRSwgMHgyMywgMHgyQSwgMHgzNSwKKyAgICAweDFFLCAweDM1LCAweDM1LCAweDM1LAorICAgIDB4MUUsIDB4MUUsIDB4MzUsIDB4MzUsCisgICAgMHgxRSwgMHgxRSwgMHgxRSwgMHgzNSwKKyAgICAweDFFLCAweDJCLCAweDMyLCAweDM4LAorICAgIDB4MUUsIDB4MjQsIDB4MzIsIDB4MzgsCisgICAgMHgxRSwgMHgyNCwgMHgyQiwgMHgzOCwKKyAgICAweDFFLCAweDM4LCAweDM4LCAweDM4LAorICAgIDB4MUUsIDB4MUUsIDB4MzgsIDB4MzgsCisgICAgMHgxRSwgMHgxRSwgMHgxRSwgMHgzOCwKKyAgICAweDFFLCAweDJDLCAweDM0LCAweDNCLAorICAgIDB4MUUsIDB4MjUsIDB4MzQsIDB4M0IsCisgICAgMHgxRSwgMHgyNSwgMHgyRCwgMHgzQiwKKyAgICAweDFFLCAweDNCLCAweDNCLCAweDNCLAorICAgIDB4MUUsIDB4MUUsIDB4M0IsIDB4M0IsCisgICAgMHgxRSwgMHgxRSwgMHgxRSwgMHgzQiwKKyAgICAweDFFLCAweDJFLCAweDM2LCAweDNFLAorICAgIDB4MUUsIDB4MjYsIDB4MzYsIDB4M0UsCisgICAgMHgxRSwgMHgyNiwgMHgyRSwgMHgzRSwKKyAgICAweDFFLCAweDNFLCAweDNFLCAweDNFLAorICAgIDB4MUUsIDB4MUUsIDB4M0UsIDB4M0UsCisgICAgMHgxRSwgMHgxRSwgMHgxRSwgMHgzRSwKKyAgICAweDFGLCAweDIwLCAweDIwLCAweDIxLAorICAgIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjIsCisgICAgMHgxRiwgMHgyMSwgMHgyMiwgMHgyMywKKyAgICAweDFGLCAweDIwLCAweDIyLCAweDIzLAorICAgIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjMsCisgICAgMHgxRiwgMHgyMSwgMHgyMiwgMHgyNCwKKyAgICAweDFGLCAweDIxLCAweDIzLCAweDI0LAorICAgIDB4MUYsIDB4MjAsIDB4MjMsIDB4MjQsCisgICAgMHgxRiwgMHgyMCwgMHgyMiwgMHgyNCwKKyAgICAweDFGLCAweDIxLCAweDIzLCAweDI1LAorICAgIDB4MUYsIDB4MjIsIDB4MjQsIDB4MjUsCisgICAgMHgxRiwgMHgyMCwgMHgyNCwgMHgyNSwKKyAgICAweDFGLCAweDIwLCAweDIyLCAweDI1LAorICAgIDB4MUYsIDB4MjUsIDB4MjUsIDB4MjUsCisgICAgMHgxRiwgMHgxRiwgMHgyNSwgMHgyNSwKKyAgICAweDFGLCAweDFGLCAweDFGLCAweDI1LAorICAgIDB4MUYsIDB4MjIsIDB4MjMsIDB4MjYsCisgICAgMHgxRiwgMHgyMiwgMHgyNSwgMHgyNiwKKyAgICAweDFGLCAweDIwLCAweDI1LCAweDI2LAorICAgIDB4MUYsIDB4MjAsIDB4MjMsIDB4MjYsCisgICAgMHgxRiwgMHgyMiwgMHgyNCwgMHgyNywKKyAgICAweDFGLCAweDIzLCAweDI1LCAweDI3LAorICAgIDB4MUYsIDB4MjEsIDB4MjUsIDB4MjcsCisgICAgMHgxRiwgMHgyMSwgMHgyMywgMHgyNywKKyAgICAweDFGLCAweDI3LCAweDI3LCAweDI3LAorICAgIDB4MUYsIDB4MUYsIDB4MjcsIDB4MjcsCisgICAgMHgxRiwgMHgxRiwgMHgxRiwgMHgyNywKKyAgICAweDFGLCAweDIzLCAweDI2LCAweDJBLAorICAgIDB4MUYsIDB4MjQsIDB4MjgsIDB4MkEsCisgICAgMHgxRiwgMHgyMSwgMHgyOCwgMHgyQSwKKyAgICAweDFGLCAweDIxLCAweDI1LCAweDJBLAorICAgIDB4MUYsIDB4MkEsIDB4MkEsIDB4MkEsCisgICAgMHgxRiwgMHgxRiwgMHgyQSwgMHgyQSwKKyAgICAweDFGLCAweDFGLCAweDFGLCAweDJBLAorICAgIDB4MUYsIDB4MjQsIDB4MjgsIDB4MkQsCisgICAgMHgxRiwgMHgyNiwgMHgyQSwgMHgyRCwKKyAgICAweDFGLCAweDIyLCAweDJBLCAweDJELAorICAgIDB4MUYsIDB4MjIsIDB4MjYsIDB4MkQsCisgICAgMHgxRiwgMHgyRCwgMHgyRCwgMHgyRCwKKyAgICAweDFGLCAweDFGLCAweDJELCAweDJELAorICAgIDB4MUYsIDB4MUYsIDB4MUYsIDB4MkQsCisgICAgMHgxRiwgMHgyNSwgMHgyQSwgMHgzMCwKKyAgICAweDFGLCAweDI3LCAweDJDLCAweDMwLAorICAgIDB4MUYsIDB4MjMsIDB4MkMsIDB4MzAsCisgICAgMHgxRiwgMHgyMywgMHgyOCwgMHgzMCwKKyAgICAweDFGLCAweDMwLCAweDMwLCAweDMwLAorICAgIDB4MUYsIDB4MUYsIDB4MzAsIDB4MzAsCisgICAgMHgxRiwgMHgxRiwgMHgxRiwgMHgzMCwKKyAgICAweDFGLCAweDI2LCAweDJDLCAweDMzLAorICAgIDB4MUYsIDB4MjksIDB4MkUsIDB4MzMsCisgICAgMHgxRiwgMHgyNCwgMHgyRSwgMHgzMywKKyAgICAweDFGLCAweDI0LCAweDI5LCAweDMzLAorICAgIDB4MUYsIDB4MzMsIDB4MzMsIDB4MzMsCisgICAgMHgxRiwgMHgxRiwgMHgzMywgMHgzMywKKyAgICAweDFGLCAweDFGLCAweDFGLCAweDMzLAorICAgIDB4MUYsIDB4MkEsIDB4MzEsIDB4MzYsCisgICAgMHgxRiwgMHgyNCwgMHgzMSwgMHgzNiwKKyAgICAweDFGLCAweDI0LCAweDJCLCAweDM2LAorICAgIDB4MUYsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgxRiwgMHgxRiwgMHgzNiwgMHgzNiwKKyAgICAweDFGLCAweDFGLCAweDFGLCAweDM2LAorICAgIDB4MUYsIDB4MkMsIDB4MzMsIDB4MzksCisgICAgMHgxRiwgMHgyNSwgMHgzMywgMHgzOSwKKyAgICAweDFGLCAweDI1LCAweDJDLCAweDM5LAorICAgIDB4MUYsIDB4MzksIDB4MzksIDB4MzksCisgICAgMHgxRiwgMHgxRiwgMHgzOSwgMHgzOSwKKyAgICAweDFGLCAweDFGLCAweDFGLCAweDM5LAorICAgIDB4MUYsIDB4MkQsIDB4MzUsIDB4M0MsCisgICAgMHgxRiwgMHgyNiwgMHgzNSwgMHgzQywKKyAgICAweDFGLCAweDI2LCAweDJFLCAweDNDLAorICAgIDB4MUYsIDB4M0MsIDB4M0MsIDB4M0MsCisgICAgMHgxRiwgMHgxRiwgMHgzQywgMHgzQywKKyAgICAweDFGLCAweDFGLCAweDFGLCAweDNDLAorICAgIDB4MUYsIDB4MkYsIDB4MzcsIDB4M0YsCisgICAgMHgxRiwgMHgyNywgMHgzNywgMHgzRiwKKyAgICAweDFGLCAweDI3LCAweDJGLCAweDNGLAorICAgIDB4MUYsIDB4M0YsIDB4M0YsIDB4M0YsCisgICAgMHgxRiwgMHgxRiwgMHgzRiwgMHgzRiwKKyAgICAweDFGLCAweDFGLCAweDFGLCAweDNGLAorICAgIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjIsCisgICAgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywKKyAgICAweDIwLCAweDIyLCAweDIzLCAweDI0LAorICAgIDB4MjAsIDB4MjEsIDB4MjMsIDB4MjQsCisgICAgMHgyMCwgMHgyMSwgMHgyMiwgMHgyNCwKKyAgICAweDIwLCAweDIyLCAweDIzLCAweDI1LAorICAgIDB4MjAsIDB4MjIsIDB4MjQsIDB4MjUsCisgICAgMHgyMCwgMHgyMSwgMHgyNCwgMHgyNSwKKyAgICAweDIwLCAweDIxLCAweDIzLCAweDI1LAorICAgIDB4MjAsIDB4MjIsIDB4MjQsIDB4MjYsCisgICAgMHgyMCwgMHgyMywgMHgyNSwgMHgyNiwKKyAgICAweDIwLCAweDIxLCAweDI1LCAweDI2LAorICAgIDB4MjAsIDB4MjEsIDB4MjMsIDB4MjYsCisgICAgMHgyMCwgMHgyNiwgMHgyNiwgMHgyNiwKKyAgICAweDIwLCAweDIwLCAweDI2LCAweDI2LAorICAgIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjYsCisgICAgMHgyMCwgMHgyMywgMHgyNCwgMHgyNywKKyAgICAweDIwLCAweDIzLCAweDI2LCAweDI3LAorICAgIDB4MjAsIDB4MjEsIDB4MjYsIDB4MjcsCisgICAgMHgyMCwgMHgyMSwgMHgyNCwgMHgyNywKKyAgICAweDIwLCAweDIzLCAweDI1LCAweDI4LAorICAgIDB4MjAsIDB4MjQsIDB4MjYsIDB4MjgsCisgICAgMHgyMCwgMHgyMiwgMHgyNiwgMHgyOCwKKyAgICAweDIwLCAweDIyLCAweDI0LCAweDI4LAorICAgIDB4MjAsIDB4MjgsIDB4MjgsIDB4MjgsCisgICAgMHgyMCwgMHgyMCwgMHgyOCwgMHgyOCwKKyAgICAweDIwLCAweDIwLCAweDIwLCAweDI4LAorICAgIDB4MjAsIDB4MjQsIDB4MjcsIDB4MkIsCisgICAgMHgyMCwgMHgyNSwgMHgyOSwgMHgyQiwKKyAgICAweDIwLCAweDIyLCAweDI5LCAweDJCLAorICAgIDB4MjAsIDB4MjIsIDB4MjYsIDB4MkIsCisgICAgMHgyMCwgMHgyQiwgMHgyQiwgMHgyQiwKKyAgICAweDIwLCAweDIwLCAweDJCLCAweDJCLAorICAgIDB4MjAsIDB4MjAsIDB4MjAsIDB4MkIsCisgICAgMHgyMCwgMHgyNSwgMHgyOSwgMHgyRSwKKyAgICAweDIwLCAweDI3LCAweDJCLCAweDJFLAorICAgIDB4MjAsIDB4MjMsIDB4MkIsIDB4MkUsCisgICAgMHgyMCwgMHgyMywgMHgyNywgMHgyRSwKKyAgICAweDIwLCAweDJFLCAweDJFLCAweDJFLAorICAgIDB4MjAsIDB4MjAsIDB4MkUsIDB4MkUsCisgICAgMHgyMCwgMHgyMCwgMHgyMCwgMHgyRSwKKyAgICAweDIwLCAweDI2LCAweDJCLCAweDMxLAorICAgIDB4MjAsIDB4MjgsIDB4MkQsIDB4MzEsCisgICAgMHgyMCwgMHgyNCwgMHgyRCwgMHgzMSwKKyAgICAweDIwLCAweDI0LCAweDI5LCAweDMxLAorICAgIDB4MjAsIDB4MzEsIDB4MzEsIDB4MzEsCisgICAgMHgyMCwgMHgyMCwgMHgzMSwgMHgzMSwKKyAgICAweDIwLCAweDIwLCAweDIwLCAweDMxLAorICAgIDB4MjAsIDB4MjcsIDB4MkQsIDB4MzQsCisgICAgMHgyMCwgMHgyQSwgMHgyRiwgMHgzNCwKKyAgICAweDIwLCAweDI1LCAweDJGLCAweDM0LAorICAgIDB4MjAsIDB4MjUsIDB4MkEsIDB4MzQsCisgICAgMHgyMCwgMHgzNCwgMHgzNCwgMHgzNCwKKyAgICAweDIwLCAweDIwLCAweDM0LCAweDM0LAorICAgIDB4MjAsIDB4MjAsIDB4MjAsIDB4MzQsCisgICAgMHgyMCwgMHgyQiwgMHgzMiwgMHgzNywKKyAgICAweDIwLCAweDI1LCAweDMyLCAweDM3LAorICAgIDB4MjAsIDB4MjUsIDB4MkMsIDB4MzcsCisgICAgMHgyMCwgMHgzNywgMHgzNywgMHgzNywKKyAgICAweDIwLCAweDIwLCAweDM3LCAweDM3LAorICAgIDB4MjAsIDB4MjAsIDB4MjAsIDB4MzcsCisgICAgMHgyMCwgMHgyRCwgMHgzNCwgMHgzQSwKKyAgICAweDIwLCAweDI2LCAweDM0LCAweDNBLAorICAgIDB4MjAsIDB4MjYsIDB4MkQsIDB4M0EsCisgICAgMHgyMCwgMHgzQSwgMHgzQSwgMHgzQSwKKyAgICAweDIwLCAweDIwLCAweDNBLCAweDNBLAorICAgIDB4MjAsIDB4MjAsIDB4MjAsIDB4M0EsCisgICAgMHgyMCwgMHgyRSwgMHgzNiwgMHgzRCwKKyAgICAweDIwLCAweDI3LCAweDM2LCAweDNELAorICAgIDB4MjAsIDB4MjcsIDB4MkYsIDB4M0QsCisgICAgMHgyMCwgMHgzRCwgMHgzRCwgMHgzRCwKKyAgICAweDIwLCAweDIwLCAweDNELCAweDNELAorICAgIDB4MjAsIDB4MjAsIDB4MjAsIDB4M0QsCisgICAgMHgyMSwgMHgyMiwgMHgyMiwgMHgyMywKKyAgICAweDIxLCAweDIyLCAweDIzLCAweDI0LAorICAgIDB4MjEsIDB4MjMsIDB4MjQsIDB4MjUsCisgICAgMHgyMSwgMHgyMiwgMHgyNCwgMHgyNSwKKyAgICAweDIxLCAweDIyLCAweDIzLCAweDI1LAorICAgIDB4MjEsIDB4MjMsIDB4MjQsIDB4MjYsCisgICAgMHgyMSwgMHgyMywgMHgyNSwgMHgyNiwKKyAgICAweDIxLCAweDIyLCAweDI1LCAweDI2LAorICAgIDB4MjEsIDB4MjIsIDB4MjQsIDB4MjYsCisgICAgMHgyMSwgMHgyMywgMHgyNSwgMHgyNywKKyAgICAweDIxLCAweDI0LCAweDI2LCAweDI3LAorICAgIDB4MjEsIDB4MjIsIDB4MjYsIDB4MjcsCisgICAgMHgyMSwgMHgyMiwgMHgyNCwgMHgyNywKKyAgICAweDIxLCAweDI3LCAweDI3LCAweDI3LAorICAgIDB4MjEsIDB4MjEsIDB4MjcsIDB4MjcsCisgICAgMHgyMSwgMHgyMSwgMHgyMSwgMHgyNywKKyAgICAweDIxLCAweDI0LCAweDI1LCAweDI4LAorICAgIDB4MjEsIDB4MjQsIDB4MjcsIDB4MjgsCisgICAgMHgyMSwgMHgyMiwgMHgyNywgMHgyOCwKKyAgICAweDIxLCAweDIyLCAweDI1LCAweDI4LAorICAgIDB4MjEsIDB4MjQsIDB4MjYsIDB4MjksCisgICAgMHgyMSwgMHgyNSwgMHgyNywgMHgyOSwKKyAgICAweDIxLCAweDIzLCAweDI3LCAweDI5LAorICAgIDB4MjEsIDB4MjMsIDB4MjUsIDB4MjksCisgICAgMHgyMSwgMHgyOSwgMHgyOSwgMHgyOSwKKyAgICAweDIxLCAweDIxLCAweDI5LCAweDI5LAorICAgIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjksCisgICAgMHgyMSwgMHgyNSwgMHgyOCwgMHgyQywKKyAgICAweDIxLCAweDI2LCAweDJBLCAweDJDLAorICAgIDB4MjEsIDB4MjMsIDB4MkEsIDB4MkMsCisgICAgMHgyMSwgMHgyMywgMHgyNywgMHgyQywKKyAgICAweDIxLCAweDJDLCAweDJDLCAweDJDLAorICAgIDB4MjEsIDB4MjEsIDB4MkMsIDB4MkMsCisgICAgMHgyMSwgMHgyMSwgMHgyMSwgMHgyQywKKyAgICAweDIxLCAweDI2LCAweDJBLCAweDJGLAorICAgIDB4MjEsIDB4MjgsIDB4MkMsIDB4MkYsCisgICAgMHgyMSwgMHgyNCwgMHgyQywgMHgyRiwKKyAgICAweDIxLCAweDI0LCAweDI4LCAweDJGLAorICAgIDB4MjEsIDB4MkYsIDB4MkYsIDB4MkYsCisgICAgMHgyMSwgMHgyMSwgMHgyRiwgMHgyRiwKKyAgICAweDIxLCAweDIxLCAweDIxLCAweDJGLAorICAgIDB4MjEsIDB4MjcsIDB4MkMsIDB4MzIsCisgICAgMHgyMSwgMHgyOSwgMHgyRSwgMHgzMiwKKyAgICAweDIxLCAweDI1LCAweDJFLCAweDMyLAorICAgIDB4MjEsIDB4MjUsIDB4MkEsIDB4MzIsCisgICAgMHgyMSwgMHgzMiwgMHgzMiwgMHgzMiwKKyAgICAweDIxLCAweDIxLCAweDMyLCAweDMyLAorICAgIDB4MjEsIDB4MjEsIDB4MjEsIDB4MzIsCisgICAgMHgyMSwgMHgyOCwgMHgyRSwgMHgzNSwKKyAgICAweDIxLCAweDJCLCAweDMwLCAweDM1LAorICAgIDB4MjEsIDB4MjYsIDB4MzAsIDB4MzUsCisgICAgMHgyMSwgMHgyNiwgMHgyQiwgMHgzNSwKKyAgICAweDIxLCAweDM1LCAweDM1LCAweDM1LAorICAgIDB4MjEsIDB4MjEsIDB4MzUsIDB4MzUsCisgICAgMHgyMSwgMHgyMSwgMHgyMSwgMHgzNSwKKyAgICAweDIxLCAweDJDLCAweDMzLCAweDM4LAorICAgIDB4MjEsIDB4MjYsIDB4MzMsIDB4MzgsCisgICAgMHgyMSwgMHgyNiwgMHgyRCwgMHgzOCwKKyAgICAweDIxLCAweDM4LCAweDM4LCAweDM4LAorICAgIDB4MjEsIDB4MjEsIDB4MzgsIDB4MzgsCisgICAgMHgyMSwgMHgyMSwgMHgyMSwgMHgzOCwKKyAgICAweDIxLCAweDJFLCAweDM1LCAweDNCLAorICAgIDB4MjEsIDB4MjcsIDB4MzUsIDB4M0IsCisgICAgMHgyMSwgMHgyNywgMHgyRSwgMHgzQiwKKyAgICAweDIxLCAweDNCLCAweDNCLCAweDNCLAorICAgIDB4MjEsIDB4MjEsIDB4M0IsIDB4M0IsCisgICAgMHgyMSwgMHgyMSwgMHgyMSwgMHgzQiwKKyAgICAweDIxLCAweDJGLCAweDM3LCAweDNFLAorICAgIDB4MjEsIDB4MjgsIDB4MzcsIDB4M0UsCisgICAgMHgyMSwgMHgyOCwgMHgzMCwgMHgzRSwKKyAgICAweDIxLCAweDNFLCAweDNFLCAweDNFLAorICAgIDB4MjEsIDB4MjEsIDB4M0UsIDB4M0UsCisgICAgMHgyMSwgMHgyMSwgMHgyMSwgMHgzRSwKKyAgICAweDIyLCAweDIzLCAweDIzLCAweDI0LAorICAgIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsCisgICAgMHgyMiwgMHgyNCwgMHgyNSwgMHgyNiwKKyAgICAweDIyLCAweDIzLCAweDI1LCAweDI2LAorICAgIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjYsCisgICAgMHgyMiwgMHgyNCwgMHgyNSwgMHgyNywKKyAgICAweDIyLCAweDI0LCAweDI2LCAweDI3LAorICAgIDB4MjIsIDB4MjMsIDB4MjYsIDB4MjcsCisgICAgMHgyMiwgMHgyMywgMHgyNSwgMHgyNywKKyAgICAweDIyLCAweDI0LCAweDI2LCAweDI4LAorICAgIDB4MjIsIDB4MjUsIDB4MjcsIDB4MjgsCisgICAgMHgyMiwgMHgyMywgMHgyNywgMHgyOCwKKyAgICAweDIyLCAweDIzLCAweDI1LCAweDI4LAorICAgIDB4MjIsIDB4MjgsIDB4MjgsIDB4MjgsCisgICAgMHgyMiwgMHgyMiwgMHgyOCwgMHgyOCwKKyAgICAweDIyLCAweDIyLCAweDIyLCAweDI4LAorICAgIDB4MjIsIDB4MjUsIDB4MjYsIDB4MjksCisgICAgMHgyMiwgMHgyNSwgMHgyOCwgMHgyOSwKKyAgICAweDIyLCAweDIzLCAweDI4LCAweDI5LAorICAgIDB4MjIsIDB4MjMsIDB4MjYsIDB4MjksCisgICAgMHgyMiwgMHgyNSwgMHgyNywgMHgyQSwKKyAgICAweDIyLCAweDI2LCAweDI4LCAweDJBLAorICAgIDB4MjIsIDB4MjQsIDB4MjgsIDB4MkEsCisgICAgMHgyMiwgMHgyNCwgMHgyNiwgMHgyQSwKKyAgICAweDIyLCAweDJBLCAweDJBLCAweDJBLAorICAgIDB4MjIsIDB4MjIsIDB4MkEsIDB4MkEsCisgICAgMHgyMiwgMHgyMiwgMHgyMiwgMHgyQSwKKyAgICAweDIyLCAweDI2LCAweDI5LCAweDJELAorICAgIDB4MjIsIDB4MjcsIDB4MkIsIDB4MkQsCisgICAgMHgyMiwgMHgyNCwgMHgyQiwgMHgyRCwKKyAgICAweDIyLCAweDI0LCAweDI4LCAweDJELAorICAgIDB4MjIsIDB4MkQsIDB4MkQsIDB4MkQsCisgICAgMHgyMiwgMHgyMiwgMHgyRCwgMHgyRCwKKyAgICAweDIyLCAweDIyLCAweDIyLCAweDJELAorICAgIDB4MjIsIDB4MjcsIDB4MkIsIDB4MzAsCisgICAgMHgyMiwgMHgyOSwgMHgyRCwgMHgzMCwKKyAgICAweDIyLCAweDI1LCAweDJELCAweDMwLAorICAgIDB4MjIsIDB4MjUsIDB4MjksIDB4MzAsCisgICAgMHgyMiwgMHgzMCwgMHgzMCwgMHgzMCwKKyAgICAweDIyLCAweDIyLCAweDMwLCAweDMwLAorICAgIDB4MjIsIDB4MjIsIDB4MjIsIDB4MzAsCisgICAgMHgyMiwgMHgyOCwgMHgyRCwgMHgzMywKKyAgICAweDIyLCAweDJBLCAweDJGLCAweDMzLAorICAgIDB4MjIsIDB4MjYsIDB4MkYsIDB4MzMsCisgICAgMHgyMiwgMHgyNiwgMHgyQiwgMHgzMywKKyAgICAweDIyLCAweDMzLCAweDMzLCAweDMzLAorICAgIDB4MjIsIDB4MjIsIDB4MzMsIDB4MzMsCisgICAgMHgyMiwgMHgyMiwgMHgyMiwgMHgzMywKKyAgICAweDIyLCAweDI5LCAweDJGLCAweDM2LAorICAgIDB4MjIsIDB4MkMsIDB4MzEsIDB4MzYsCisgICAgMHgyMiwgMHgyNywgMHgzMSwgMHgzNiwKKyAgICAweDIyLCAweDI3LCAweDJDLCAweDM2LAorICAgIDB4MjIsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgyMiwgMHgyMiwgMHgzNiwgMHgzNiwKKyAgICAweDIyLCAweDIyLCAweDIyLCAweDM2LAorICAgIDB4MjIsIDB4MkQsIDB4MzQsIDB4MzksCisgICAgMHgyMiwgMHgyNywgMHgzNCwgMHgzOSwKKyAgICAweDIyLCAweDI3LCAweDJFLCAweDM5LAorICAgIDB4MjIsIDB4MzksIDB4MzksIDB4MzksCisgICAgMHgyMiwgMHgyMiwgMHgzOSwgMHgzOSwKKyAgICAweDIyLCAweDIyLCAweDIyLCAweDM5LAorICAgIDB4MjIsIDB4MkYsIDB4MzYsIDB4M0MsCisgICAgMHgyMiwgMHgyOCwgMHgzNiwgMHgzQywKKyAgICAweDIyLCAweDI4LCAweDJGLCAweDNDLAorICAgIDB4MjIsIDB4M0MsIDB4M0MsIDB4M0MsCisgICAgMHgyMiwgMHgyMiwgMHgzQywgMHgzQywKKyAgICAweDIyLCAweDIyLCAweDIyLCAweDNDLAorICAgIDB4MjIsIDB4MzAsIDB4MzgsIDB4M0YsCisgICAgMHgyMiwgMHgyOSwgMHgzOCwgMHgzRiwKKyAgICAweDIyLCAweDI5LCAweDMxLCAweDNGLAorICAgIDB4MjIsIDB4M0YsIDB4M0YsIDB4M0YsCisgICAgMHgyMiwgMHgyMiwgMHgzRiwgMHgzRiwKKyAgICAweDIyLCAweDIyLCAweDIyLCAweDNGLAorICAgIDB4MjMsIDB4MjQsIDB4MjQsIDB4MjUsCisgICAgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwKKyAgICAweDIzLCAweDI1LCAweDI2LCAweDI3LAorICAgIDB4MjMsIDB4MjQsIDB4MjYsIDB4MjcsCisgICAgMHgyMywgMHgyNCwgMHgyNSwgMHgyNywKKyAgICAweDIzLCAweDI1LCAweDI2LCAweDI4LAorICAgIDB4MjMsIDB4MjUsIDB4MjcsIDB4MjgsCisgICAgMHgyMywgMHgyNCwgMHgyNywgMHgyOCwKKyAgICAweDIzLCAweDI0LCAweDI2LCAweDI4LAorICAgIDB4MjMsIDB4MjUsIDB4MjcsIDB4MjksCisgICAgMHgyMywgMHgyNiwgMHgyOCwgMHgyOSwKKyAgICAweDIzLCAweDI0LCAweDI4LCAweDI5LAorICAgIDB4MjMsIDB4MjQsIDB4MjYsIDB4MjksCisgICAgMHgyMywgMHgyOSwgMHgyOSwgMHgyOSwKKyAgICAweDIzLCAweDIzLCAweDI5LCAweDI5LAorICAgIDB4MjMsIDB4MjMsIDB4MjMsIDB4MjksCisgICAgMHgyMywgMHgyNiwgMHgyNywgMHgyQSwKKyAgICAweDIzLCAweDI2LCAweDI5LCAweDJBLAorICAgIDB4MjMsIDB4MjQsIDB4MjksIDB4MkEsCisgICAgMHgyMywgMHgyNCwgMHgyNywgMHgyQSwKKyAgICAweDIzLCAweDI2LCAweDI4LCAweDJCLAorICAgIDB4MjMsIDB4MjcsIDB4MjksIDB4MkIsCisgICAgMHgyMywgMHgyNSwgMHgyOSwgMHgyQiwKKyAgICAweDIzLCAweDI1LCAweDI3LCAweDJCLAorICAgIDB4MjMsIDB4MkIsIDB4MkIsIDB4MkIsCisgICAgMHgyMywgMHgyMywgMHgyQiwgMHgyQiwKKyAgICAweDIzLCAweDIzLCAweDIzLCAweDJCLAorICAgIDB4MjMsIDB4MjcsIDB4MkEsIDB4MkUsCisgICAgMHgyMywgMHgyOCwgMHgyQywgMHgyRSwKKyAgICAweDIzLCAweDI1LCAweDJDLCAweDJFLAorICAgIDB4MjMsIDB4MjUsIDB4MjksIDB4MkUsCisgICAgMHgyMywgMHgyRSwgMHgyRSwgMHgyRSwKKyAgICAweDIzLCAweDIzLCAweDJFLCAweDJFLAorICAgIDB4MjMsIDB4MjMsIDB4MjMsIDB4MkUsCisgICAgMHgyMywgMHgyOCwgMHgyQywgMHgzMSwKKyAgICAweDIzLCAweDJBLCAweDJFLCAweDMxLAorICAgIDB4MjMsIDB4MjYsIDB4MkUsIDB4MzEsCisgICAgMHgyMywgMHgyNiwgMHgyQSwgMHgzMSwKKyAgICAweDIzLCAweDMxLCAweDMxLCAweDMxLAorICAgIDB4MjMsIDB4MjMsIDB4MzEsIDB4MzEsCisgICAgMHgyMywgMHgyMywgMHgyMywgMHgzMSwKKyAgICAweDIzLCAweDI5LCAweDJFLCAweDM0LAorICAgIDB4MjMsIDB4MkIsIDB4MzAsIDB4MzQsCisgICAgMHgyMywgMHgyNywgMHgzMCwgMHgzNCwKKyAgICAweDIzLCAweDI3LCAweDJDLCAweDM0LAorICAgIDB4MjMsIDB4MzQsIDB4MzQsIDB4MzQsCisgICAgMHgyMywgMHgyMywgMHgzNCwgMHgzNCwKKyAgICAweDIzLCAweDIzLCAweDIzLCAweDM0LAorICAgIDB4MjMsIDB4MkEsIDB4MzAsIDB4MzcsCisgICAgMHgyMywgMHgyRCwgMHgzMiwgMHgzNywKKyAgICAweDIzLCAweDI4LCAweDMyLCAweDM3LAorICAgIDB4MjMsIDB4MjgsIDB4MkQsIDB4MzcsCisgICAgMHgyMywgMHgzNywgMHgzNywgMHgzNywKKyAgICAweDIzLCAweDIzLCAweDM3LCAweDM3LAorICAgIDB4MjMsIDB4MjMsIDB4MjMsIDB4MzcsCisgICAgMHgyMywgMHgyRSwgMHgzNSwgMHgzQSwKKyAgICAweDIzLCAweDI4LCAweDM1LCAweDNBLAorICAgIDB4MjMsIDB4MjgsIDB4MkYsIDB4M0EsCisgICAgMHgyMywgMHgzQSwgMHgzQSwgMHgzQSwKKyAgICAweDIzLCAweDIzLCAweDNBLCAweDNBLAorICAgIDB4MjMsIDB4MjMsIDB4MjMsIDB4M0EsCisgICAgMHgyMywgMHgzMCwgMHgzNywgMHgzRCwKKyAgICAweDIzLCAweDI5LCAweDM3LCAweDNELAorICAgIDB4MjMsIDB4MjksIDB4MzAsIDB4M0QsCisgICAgMHgyMywgMHgzRCwgMHgzRCwgMHgzRCwKKyAgICAweDIzLCAweDIzLCAweDNELCAweDNELAorICAgIDB4MjMsIDB4MjMsIDB4MjMsIDB4M0QsCisgICAgMHgyNCwgMHgyNSwgMHgyNSwgMHgyNiwKKyAgICAweDI0LCAweDI1LCAweDI2LCAweDI3LAorICAgIDB4MjQsIDB4MjYsIDB4MjcsIDB4MjgsCisgICAgMHgyNCwgMHgyNSwgMHgyNywgMHgyOCwKKyAgICAweDI0LCAweDI1LCAweDI2LCAweDI4LAorICAgIDB4MjQsIDB4MjYsIDB4MjcsIDB4MjksCisgICAgMHgyNCwgMHgyNiwgMHgyOCwgMHgyOSwKKyAgICAweDI0LCAweDI1LCAweDI4LCAweDI5LAorICAgIDB4MjQsIDB4MjUsIDB4MjcsIDB4MjksCisgICAgMHgyNCwgMHgyNiwgMHgyOCwgMHgyQSwKKyAgICAweDI0LCAweDI3LCAweDI5LCAweDJBLAorICAgIDB4MjQsIDB4MjUsIDB4MjksIDB4MkEsCisgICAgMHgyNCwgMHgyNSwgMHgyNywgMHgyQSwKKyAgICAweDI0LCAweDJBLCAweDJBLCAweDJBLAorICAgIDB4MjQsIDB4MjQsIDB4MkEsIDB4MkEsCisgICAgMHgyNCwgMHgyNCwgMHgyNCwgMHgyQSwKKyAgICAweDI0LCAweDI3LCAweDI4LCAweDJCLAorICAgIDB4MjQsIDB4MjcsIDB4MkEsIDB4MkIsCisgICAgMHgyNCwgMHgyNSwgMHgyQSwgMHgyQiwKKyAgICAweDI0LCAweDI1LCAweDI4LCAweDJCLAorICAgIDB4MjQsIDB4MjcsIDB4MjksIDB4MkMsCisgICAgMHgyNCwgMHgyOCwgMHgyQSwgMHgyQywKKyAgICAweDI0LCAweDI2LCAweDJBLCAweDJDLAorICAgIDB4MjQsIDB4MjYsIDB4MjgsIDB4MkMsCisgICAgMHgyNCwgMHgyQywgMHgyQywgMHgyQywKKyAgICAweDI0LCAweDI0LCAweDJDLCAweDJDLAorICAgIDB4MjQsIDB4MjQsIDB4MjQsIDB4MkMsCisgICAgMHgyNCwgMHgyOCwgMHgyQiwgMHgyRiwKKyAgICAweDI0LCAweDI5LCAweDJELCAweDJGLAorICAgIDB4MjQsIDB4MjYsIDB4MkQsIDB4MkYsCisgICAgMHgyNCwgMHgyNiwgMHgyQSwgMHgyRiwKKyAgICAweDI0LCAweDJGLCAweDJGLCAweDJGLAorICAgIDB4MjQsIDB4MjQsIDB4MkYsIDB4MkYsCisgICAgMHgyNCwgMHgyNCwgMHgyNCwgMHgyRiwKKyAgICAweDI0LCAweDI5LCAweDJELCAweDMyLAorICAgIDB4MjQsIDB4MkIsIDB4MkYsIDB4MzIsCisgICAgMHgyNCwgMHgyNywgMHgyRiwgMHgzMiwKKyAgICAweDI0LCAweDI3LCAweDJCLCAweDMyLAorICAgIDB4MjQsIDB4MzIsIDB4MzIsIDB4MzIsCisgICAgMHgyNCwgMHgyNCwgMHgzMiwgMHgzMiwKKyAgICAweDI0LCAweDI0LCAweDI0LCAweDMyLAorICAgIDB4MjQsIDB4MkEsIDB4MkYsIDB4MzUsCisgICAgMHgyNCwgMHgyQywgMHgzMSwgMHgzNSwKKyAgICAweDI0LCAweDI4LCAweDMxLCAweDM1LAorICAgIDB4MjQsIDB4MjgsIDB4MkQsIDB4MzUsCisgICAgMHgyNCwgMHgzNSwgMHgzNSwgMHgzNSwKKyAgICAweDI0LCAweDI0LCAweDM1LCAweDM1LAorICAgIDB4MjQsIDB4MjQsIDB4MjQsIDB4MzUsCisgICAgMHgyNCwgMHgyQiwgMHgzMSwgMHgzOCwKKyAgICAweDI0LCAweDJFLCAweDMzLCAweDM4LAorICAgIDB4MjQsIDB4MjksIDB4MzMsIDB4MzgsCisgICAgMHgyNCwgMHgyOSwgMHgyRSwgMHgzOCwKKyAgICAweDI0LCAweDM4LCAweDM4LCAweDM4LAorICAgIDB4MjQsIDB4MjQsIDB4MzgsIDB4MzgsCisgICAgMHgyNCwgMHgyNCwgMHgyNCwgMHgzOCwKKyAgICAweDI0LCAweDJGLCAweDM2LCAweDNCLAorICAgIDB4MjQsIDB4MjksIDB4MzYsIDB4M0IsCisgICAgMHgyNCwgMHgyOSwgMHgzMCwgMHgzQiwKKyAgICAweDI0LCAweDNCLCAweDNCLCAweDNCLAorICAgIDB4MjQsIDB4MjQsIDB4M0IsIDB4M0IsCisgICAgMHgyNCwgMHgyNCwgMHgyNCwgMHgzQiwKKyAgICAweDI0LCAweDMxLCAweDM4LCAweDNFLAorICAgIDB4MjQsIDB4MkEsIDB4MzgsIDB4M0UsCisgICAgMHgyNCwgMHgyQSwgMHgzMSwgMHgzRSwKKyAgICAweDI0LCAweDNFLCAweDNFLCAweDNFLAorICAgIDB4MjQsIDB4MjQsIDB4M0UsIDB4M0UsCisgICAgMHgyNCwgMHgyNCwgMHgyNCwgMHgzRSwKKyAgICAweDI1LCAweDI2LCAweDI2LCAweDI3LAorICAgIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCisgICAgMHgyNSwgMHgyNywgMHgyOCwgMHgyOSwKKyAgICAweDI1LCAweDI2LCAweDI4LCAweDI5LAorICAgIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjksCisgICAgMHgyNSwgMHgyNywgMHgyOCwgMHgyQSwKKyAgICAweDI1LCAweDI3LCAweDI5LCAweDJBLAorICAgIDB4MjUsIDB4MjYsIDB4MjksIDB4MkEsCisgICAgMHgyNSwgMHgyNiwgMHgyOCwgMHgyQSwKKyAgICAweDI1LCAweDI3LCAweDI5LCAweDJCLAorICAgIDB4MjUsIDB4MjgsIDB4MkEsIDB4MkIsCisgICAgMHgyNSwgMHgyNiwgMHgyQSwgMHgyQiwKKyAgICAweDI1LCAweDI2LCAweDI4LCAweDJCLAorICAgIDB4MjUsIDB4MkIsIDB4MkIsIDB4MkIsCisgICAgMHgyNSwgMHgyNSwgMHgyQiwgMHgyQiwKKyAgICAweDI1LCAweDI1LCAweDI1LCAweDJCLAorICAgIDB4MjUsIDB4MjgsIDB4MjksIDB4MkMsCisgICAgMHgyNSwgMHgyOCwgMHgyQiwgMHgyQywKKyAgICAweDI1LCAweDI2LCAweDJCLCAweDJDLAorICAgIDB4MjUsIDB4MjYsIDB4MjksIDB4MkMsCisgICAgMHgyNSwgMHgyOCwgMHgyQSwgMHgyRCwKKyAgICAweDI1LCAweDI5LCAweDJCLCAweDJELAorICAgIDB4MjUsIDB4MjcsIDB4MkIsIDB4MkQsCisgICAgMHgyNSwgMHgyNywgMHgyOSwgMHgyRCwKKyAgICAweDI1LCAweDJELCAweDJELCAweDJELAorICAgIDB4MjUsIDB4MjUsIDB4MkQsIDB4MkQsCisgICAgMHgyNSwgMHgyNSwgMHgyNSwgMHgyRCwKKyAgICAweDI1LCAweDI5LCAweDJDLCAweDMwLAorICAgIDB4MjUsIDB4MkEsIDB4MkUsIDB4MzAsCisgICAgMHgyNSwgMHgyNywgMHgyRSwgMHgzMCwKKyAgICAweDI1LCAweDI3LCAweDJCLCAweDMwLAorICAgIDB4MjUsIDB4MzAsIDB4MzAsIDB4MzAsCisgICAgMHgyNSwgMHgyNSwgMHgzMCwgMHgzMCwKKyAgICAweDI1LCAweDI1LCAweDI1LCAweDMwLAorICAgIDB4MjUsIDB4MkEsIDB4MkUsIDB4MzMsCisgICAgMHgyNSwgMHgyQywgMHgzMCwgMHgzMywKKyAgICAweDI1LCAweDI4LCAweDMwLCAweDMzLAorICAgIDB4MjUsIDB4MjgsIDB4MkMsIDB4MzMsCisgICAgMHgyNSwgMHgzMywgMHgzMywgMHgzMywKKyAgICAweDI1LCAweDI1LCAweDMzLCAweDMzLAorICAgIDB4MjUsIDB4MjUsIDB4MjUsIDB4MzMsCisgICAgMHgyNSwgMHgyQiwgMHgzMCwgMHgzNiwKKyAgICAweDI1LCAweDJELCAweDMyLCAweDM2LAorICAgIDB4MjUsIDB4MjksIDB4MzIsIDB4MzYsCisgICAgMHgyNSwgMHgyOSwgMHgyRSwgMHgzNiwKKyAgICAweDI1LCAweDM2LCAweDM2LCAweDM2LAorICAgIDB4MjUsIDB4MjUsIDB4MzYsIDB4MzYsCisgICAgMHgyNSwgMHgyNSwgMHgyNSwgMHgzNiwKKyAgICAweDI1LCAweDJDLCAweDMyLCAweDM5LAorICAgIDB4MjUsIDB4MkYsIDB4MzQsIDB4MzksCisgICAgMHgyNSwgMHgyQSwgMHgzNCwgMHgzOSwKKyAgICAweDI1LCAweDJBLCAweDJGLCAweDM5LAorICAgIDB4MjUsIDB4MzksIDB4MzksIDB4MzksCisgICAgMHgyNSwgMHgyNSwgMHgzOSwgMHgzOSwKKyAgICAweDI1LCAweDI1LCAweDI1LCAweDM5LAorICAgIDB4MjUsIDB4MzAsIDB4MzcsIDB4M0MsCisgICAgMHgyNSwgMHgyQSwgMHgzNywgMHgzQywKKyAgICAweDI1LCAweDJBLCAweDMxLCAweDNDLAorICAgIDB4MjUsIDB4M0MsIDB4M0MsIDB4M0MsCisgICAgMHgyNSwgMHgyNSwgMHgzQywgMHgzQywKKyAgICAweDI1LCAweDI1LCAweDI1LCAweDNDLAorICAgIDB4MjUsIDB4MzIsIDB4MzksIDB4M0YsCisgICAgMHgyNSwgMHgyQiwgMHgzOSwgMHgzRiwKKyAgICAweDI1LCAweDJCLCAweDMyLCAweDNGLAorICAgIDB4MjUsIDB4M0YsIDB4M0YsIDB4M0YsCisgICAgMHgyNSwgMHgyNSwgMHgzRiwgMHgzRiwKKyAgICAweDI1LCAweDI1LCAweDI1LCAweDNGLAorICAgIDB4MjYsIDB4MjcsIDB4MjcsIDB4MjgsCisgICAgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwKKyAgICAweDI2LCAweDI4LCAweDI5LCAweDJBLAorICAgIDB4MjYsIDB4MjcsIDB4MjksIDB4MkEsCisgICAgMHgyNiwgMHgyNywgMHgyOCwgMHgyQSwKKyAgICAweDI2LCAweDI4LCAweDI5LCAweDJCLAorICAgIDB4MjYsIDB4MjgsIDB4MkEsIDB4MkIsCisgICAgMHgyNiwgMHgyNywgMHgyQSwgMHgyQiwKKyAgICAweDI2LCAweDI3LCAweDI5LCAweDJCLAorICAgIDB4MjYsIDB4MjgsIDB4MkEsIDB4MkMsCisgICAgMHgyNiwgMHgyOSwgMHgyQiwgMHgyQywKKyAgICAweDI2LCAweDI3LCAweDJCLCAweDJDLAorICAgIDB4MjYsIDB4MjcsIDB4MjksIDB4MkMsCisgICAgMHgyNiwgMHgyQywgMHgyQywgMHgyQywKKyAgICAweDI2LCAweDI2LCAweDJDLCAweDJDLAorICAgIDB4MjYsIDB4MjYsIDB4MjYsIDB4MkMsCisgICAgMHgyNiwgMHgyOSwgMHgyQSwgMHgyRCwKKyAgICAweDI2LCAweDI5LCAweDJDLCAweDJELAorICAgIDB4MjYsIDB4MjcsIDB4MkMsIDB4MkQsCisgICAgMHgyNiwgMHgyNywgMHgyQSwgMHgyRCwKKyAgICAweDI2LCAweDI5LCAweDJCLCAweDJFLAorICAgIDB4MjYsIDB4MkEsIDB4MkMsIDB4MkUsCisgICAgMHgyNiwgMHgyOCwgMHgyQywgMHgyRSwKKyAgICAweDI2LCAweDI4LCAweDJBLCAweDJFLAorICAgIDB4MjYsIDB4MkUsIDB4MkUsIDB4MkUsCisgICAgMHgyNiwgMHgyNiwgMHgyRSwgMHgyRSwKKyAgICAweDI2LCAweDI2LCAweDI2LCAweDJFLAorICAgIDB4MjYsIDB4MkEsIDB4MkQsIDB4MzEsCisgICAgMHgyNiwgMHgyQiwgMHgyRiwgMHgzMSwKKyAgICAweDI2LCAweDI4LCAweDJGLCAweDMxLAorICAgIDB4MjYsIDB4MjgsIDB4MkMsIDB4MzEsCisgICAgMHgyNiwgMHgzMSwgMHgzMSwgMHgzMSwKKyAgICAweDI2LCAweDI2LCAweDMxLCAweDMxLAorICAgIDB4MjYsIDB4MjYsIDB4MjYsIDB4MzEsCisgICAgMHgyNiwgMHgyQiwgMHgyRiwgMHgzNCwKKyAgICAweDI2LCAweDJELCAweDMxLCAweDM0LAorICAgIDB4MjYsIDB4MjksIDB4MzEsIDB4MzQsCisgICAgMHgyNiwgMHgyOSwgMHgyRCwgMHgzNCwKKyAgICAweDI2LCAweDM0LCAweDM0LCAweDM0LAorICAgIDB4MjYsIDB4MjYsIDB4MzQsIDB4MzQsCisgICAgMHgyNiwgMHgyNiwgMHgyNiwgMHgzNCwKKyAgICAweDI2LCAweDJDLCAweDMxLCAweDM3LAorICAgIDB4MjYsIDB4MkUsIDB4MzMsIDB4MzcsCisgICAgMHgyNiwgMHgyQSwgMHgzMywgMHgzNywKKyAgICAweDI2LCAweDJBLCAweDJGLCAweDM3LAorICAgIDB4MjYsIDB4MzcsIDB4MzcsIDB4MzcsCisgICAgMHgyNiwgMHgyNiwgMHgzNywgMHgzNywKKyAgICAweDI2LCAweDI2LCAweDI2LCAweDM3LAorICAgIDB4MjYsIDB4MkQsIDB4MzMsIDB4M0EsCisgICAgMHgyNiwgMHgzMCwgMHgzNSwgMHgzQSwKKyAgICAweDI2LCAweDJCLCAweDM1LCAweDNBLAorICAgIDB4MjYsIDB4MkIsIDB4MzAsIDB4M0EsCisgICAgMHgyNiwgMHgzQSwgMHgzQSwgMHgzQSwKKyAgICAweDI2LCAweDI2LCAweDNBLCAweDNBLAorICAgIDB4MjYsIDB4MjYsIDB4MjYsIDB4M0EsCisgICAgMHgyNiwgMHgzMSwgMHgzOCwgMHgzRCwKKyAgICAweDI2LCAweDJCLCAweDM4LCAweDNELAorICAgIDB4MjYsIDB4MkIsIDB4MzIsIDB4M0QsCisgICAgMHgyNiwgMHgzRCwgMHgzRCwgMHgzRCwKKyAgICAweDI2LCAweDI2LCAweDNELCAweDNELAorICAgIDB4MjYsIDB4MjYsIDB4MjYsIDB4M0QsCisgICAgMHgyNywgMHgyOCwgMHgyOCwgMHgyOSwKKyAgICAweDI3LCAweDI4LCAweDI5LCAweDJBLAorICAgIDB4MjcsIDB4MjksIDB4MkEsIDB4MkIsCisgICAgMHgyNywgMHgyOCwgMHgyQSwgMHgyQiwKKyAgICAweDI3LCAweDI4LCAweDI5LCAweDJCLAorICAgIDB4MjcsIDB4MjksIDB4MkEsIDB4MkMsCisgICAgMHgyNywgMHgyOSwgMHgyQiwgMHgyQywKKyAgICAweDI3LCAweDI4LCAweDJCLCAweDJDLAorICAgIDB4MjcsIDB4MjgsIDB4MkEsIDB4MkMsCisgICAgMHgyNywgMHgyOSwgMHgyQiwgMHgyRCwKKyAgICAweDI3LCAweDJBLCAweDJDLCAweDJELAorICAgIDB4MjcsIDB4MjgsIDB4MkMsIDB4MkQsCisgICAgMHgyNywgMHgyOCwgMHgyQSwgMHgyRCwKKyAgICAweDI3LCAweDJELCAweDJELCAweDJELAorICAgIDB4MjcsIDB4MjcsIDB4MkQsIDB4MkQsCisgICAgMHgyNywgMHgyNywgMHgyNywgMHgyRCwKKyAgICAweDI3LCAweDJBLCAweDJCLCAweDJFLAorICAgIDB4MjcsIDB4MkEsIDB4MkQsIDB4MkUsCisgICAgMHgyNywgMHgyOCwgMHgyRCwgMHgyRSwKKyAgICAweDI3LCAweDI4LCAweDJCLCAweDJFLAorICAgIDB4MjcsIDB4MkEsIDB4MkMsIDB4MkYsCisgICAgMHgyNywgMHgyQiwgMHgyRCwgMHgyRiwKKyAgICAweDI3LCAweDI5LCAweDJELCAweDJGLAorICAgIDB4MjcsIDB4MjksIDB4MkIsIDB4MkYsCisgICAgMHgyNywgMHgyRiwgMHgyRiwgMHgyRiwKKyAgICAweDI3LCAweDI3LCAweDJGLCAweDJGLAorICAgIDB4MjcsIDB4MjcsIDB4MjcsIDB4MkYsCisgICAgMHgyNywgMHgyQiwgMHgyRSwgMHgzMiwKKyAgICAweDI3LCAweDJDLCAweDMwLCAweDMyLAorICAgIDB4MjcsIDB4MjksIDB4MzAsIDB4MzIsCisgICAgMHgyNywgMHgyOSwgMHgyRCwgMHgzMiwKKyAgICAweDI3LCAweDMyLCAweDMyLCAweDMyLAorICAgIDB4MjcsIDB4MjcsIDB4MzIsIDB4MzIsCisgICAgMHgyNywgMHgyNywgMHgyNywgMHgzMiwKKyAgICAweDI3LCAweDJDLCAweDMwLCAweDM1LAorICAgIDB4MjcsIDB4MkUsIDB4MzIsIDB4MzUsCisgICAgMHgyNywgMHgyQSwgMHgzMiwgMHgzNSwKKyAgICAweDI3LCAweDJBLCAweDJFLCAweDM1LAorICAgIDB4MjcsIDB4MzUsIDB4MzUsIDB4MzUsCisgICAgMHgyNywgMHgyNywgMHgzNSwgMHgzNSwKKyAgICAweDI3LCAweDI3LCAweDI3LCAweDM1LAorICAgIDB4MjcsIDB4MkQsIDB4MzIsIDB4MzgsCisgICAgMHgyNywgMHgyRiwgMHgzNCwgMHgzOCwKKyAgICAweDI3LCAweDJCLCAweDM0LCAweDM4LAorICAgIDB4MjcsIDB4MkIsIDB4MzAsIDB4MzgsCisgICAgMHgyNywgMHgzOCwgMHgzOCwgMHgzOCwKKyAgICAweDI3LCAweDI3LCAweDM4LCAweDM4LAorICAgIDB4MjcsIDB4MjcsIDB4MjcsIDB4MzgsCisgICAgMHgyNywgMHgyRSwgMHgzNCwgMHgzQiwKKyAgICAweDI3LCAweDMxLCAweDM2LCAweDNCLAorICAgIDB4MjcsIDB4MkMsIDB4MzYsIDB4M0IsCisgICAgMHgyNywgMHgyQywgMHgzMSwgMHgzQiwKKyAgICAweDI3LCAweDNCLCAweDNCLCAweDNCLAorICAgIDB4MjcsIDB4MjcsIDB4M0IsIDB4M0IsCisgICAgMHgyNywgMHgyNywgMHgyNywgMHgzQiwKKyAgICAweDI3LCAweDMyLCAweDM5LCAweDNFLAorICAgIDB4MjcsIDB4MkMsIDB4MzksIDB4M0UsCisgICAgMHgyNywgMHgyQywgMHgzMywgMHgzRSwKKyAgICAweDI3LCAweDNFLCAweDNFLCAweDNFLAorICAgIDB4MjcsIDB4MjcsIDB4M0UsIDB4M0UsCisgICAgMHgyNywgMHgyNywgMHgyNywgMHgzRSwKKyAgICAweDI4LCAweDI5LCAweDI5LCAweDJBLAorICAgIDB4MjgsIDB4MjksIDB4MkEsIDB4MkIsCisgICAgMHgyOCwgMHgyQSwgMHgyQiwgMHgyQywKKyAgICAweDI4LCAweDI5LCAweDJCLCAweDJDLAorICAgIDB4MjgsIDB4MjksIDB4MkEsIDB4MkMsCisgICAgMHgyOCwgMHgyQSwgMHgyQiwgMHgyRCwKKyAgICAweDI4LCAweDJBLCAweDJDLCAweDJELAorICAgIDB4MjgsIDB4MjksIDB4MkMsIDB4MkQsCisgICAgMHgyOCwgMHgyOSwgMHgyQiwgMHgyRCwKKyAgICAweDI4LCAweDJBLCAweDJDLCAweDJFLAorICAgIDB4MjgsIDB4MkIsIDB4MkQsIDB4MkUsCisgICAgMHgyOCwgMHgyOSwgMHgyRCwgMHgyRSwKKyAgICAweDI4LCAweDI5LCAweDJCLCAweDJFLAorICAgIDB4MjgsIDB4MkUsIDB4MkUsIDB4MkUsCisgICAgMHgyOCwgMHgyOCwgMHgyRSwgMHgyRSwKKyAgICAweDI4LCAweDI4LCAweDI4LCAweDJFLAorICAgIDB4MjgsIDB4MkIsIDB4MkMsIDB4MkYsCisgICAgMHgyOCwgMHgyQiwgMHgyRSwgMHgyRiwKKyAgICAweDI4LCAweDI5LCAweDJFLCAweDJGLAorICAgIDB4MjgsIDB4MjksIDB4MkMsIDB4MkYsCisgICAgMHgyOCwgMHgyQiwgMHgyRCwgMHgzMCwKKyAgICAweDI4LCAweDJDLCAweDJFLCAweDMwLAorICAgIDB4MjgsIDB4MkEsIDB4MkUsIDB4MzAsCisgICAgMHgyOCwgMHgyQSwgMHgyQywgMHgzMCwKKyAgICAweDI4LCAweDMwLCAweDMwLCAweDMwLAorICAgIDB4MjgsIDB4MjgsIDB4MzAsIDB4MzAsCisgICAgMHgyOCwgMHgyOCwgMHgyOCwgMHgzMCwKKyAgICAweDI4LCAweDJDLCAweDJGLCAweDMzLAorICAgIDB4MjgsIDB4MkQsIDB4MzEsIDB4MzMsCisgICAgMHgyOCwgMHgyQSwgMHgzMSwgMHgzMywKKyAgICAweDI4LCAweDJBLCAweDJFLCAweDMzLAorICAgIDB4MjgsIDB4MzMsIDB4MzMsIDB4MzMsCisgICAgMHgyOCwgMHgyOCwgMHgzMywgMHgzMywKKyAgICAweDI4LCAweDI4LCAweDI4LCAweDMzLAorICAgIDB4MjgsIDB4MkQsIDB4MzEsIDB4MzYsCisgICAgMHgyOCwgMHgyRiwgMHgzMywgMHgzNiwKKyAgICAweDI4LCAweDJCLCAweDMzLCAweDM2LAorICAgIDB4MjgsIDB4MkIsIDB4MkYsIDB4MzYsCisgICAgMHgyOCwgMHgzNiwgMHgzNiwgMHgzNiwKKyAgICAweDI4LCAweDI4LCAweDM2LCAweDM2LAorICAgIDB4MjgsIDB4MjgsIDB4MjgsIDB4MzYsCisgICAgMHgyOCwgMHgyRSwgMHgzMywgMHgzOSwKKyAgICAweDI4LCAweDMwLCAweDM1LCAweDM5LAorICAgIDB4MjgsIDB4MkMsIDB4MzUsIDB4MzksCisgICAgMHgyOCwgMHgyQywgMHgzMSwgMHgzOSwKKyAgICAweDI4LCAweDM5LCAweDM5LCAweDM5LAorICAgIDB4MjgsIDB4MjgsIDB4MzksIDB4MzksCisgICAgMHgyOCwgMHgyOCwgMHgyOCwgMHgzOSwKKyAgICAweDI4LCAweDJGLCAweDM1LCAweDNDLAorICAgIDB4MjgsIDB4MzIsIDB4MzcsIDB4M0MsCisgICAgMHgyOCwgMHgyRCwgMHgzNywgMHgzQywKKyAgICAweDI4LCAweDJELCAweDMyLCAweDNDLAorICAgIDB4MjgsIDB4M0MsIDB4M0MsIDB4M0MsCisgICAgMHgyOCwgMHgyOCwgMHgzQywgMHgzQywKKyAgICAweDI4LCAweDI4LCAweDI4LCAweDNDLAorICAgIDB4MjgsIDB4MzMsIDB4M0EsIDB4M0YsCisgICAgMHgyOCwgMHgyRCwgMHgzQSwgMHgzRiwKKyAgICAweDI4LCAweDJELCAweDM0LCAweDNGLAorICAgIDB4MjgsIDB4M0YsIDB4M0YsIDB4M0YsCisgICAgMHgyOCwgMHgyOCwgMHgzRiwgMHgzRiwKKyAgICAweDI4LCAweDI4LCAweDI4LCAweDNGLAorICAgIDB4MjksIDB4MkEsIDB4MkEsIDB4MkIsCisgICAgMHgyOSwgMHgyQSwgMHgyQiwgMHgyQywKKyAgICAweDI5LCAweDJCLCAweDJDLCAweDJELAorICAgIDB4MjksIDB4MkEsIDB4MkMsIDB4MkQsCisgICAgMHgyOSwgMHgyQSwgMHgyQiwgMHgyRCwKKyAgICAweDI5LCAweDJCLCAweDJDLCAweDJFLAorICAgIDB4MjksIDB4MkIsIDB4MkQsIDB4MkUsCisgICAgMHgyOSwgMHgyQSwgMHgyRCwgMHgyRSwKKyAgICAweDI5LCAweDJBLCAweDJDLCAweDJFLAorICAgIDB4MjksIDB4MkIsIDB4MkQsIDB4MkYsCisgICAgMHgyOSwgMHgyQywgMHgyRSwgMHgyRiwKKyAgICAweDI5LCAweDJBLCAweDJFLCAweDJGLAorICAgIDB4MjksIDB4MkEsIDB4MkMsIDB4MkYsCisgICAgMHgyOSwgMHgyRiwgMHgyRiwgMHgyRiwKKyAgICAweDI5LCAweDI5LCAweDJGLCAweDJGLAorICAgIDB4MjksIDB4MjksIDB4MjksIDB4MkYsCisgICAgMHgyOSwgMHgyQywgMHgyRCwgMHgzMCwKKyAgICAweDI5LCAweDJDLCAweDJGLCAweDMwLAorICAgIDB4MjksIDB4MkEsIDB4MkYsIDB4MzAsCisgICAgMHgyOSwgMHgyQSwgMHgyRCwgMHgzMCwKKyAgICAweDI5LCAweDJDLCAweDJFLCAweDMxLAorICAgIDB4MjksIDB4MkQsIDB4MkYsIDB4MzEsCisgICAgMHgyOSwgMHgyQiwgMHgyRiwgMHgzMSwKKyAgICAweDI5LCAweDJCLCAweDJELCAweDMxLAorICAgIDB4MjksIDB4MzEsIDB4MzEsIDB4MzEsCisgICAgMHgyOSwgMHgyOSwgMHgzMSwgMHgzMSwKKyAgICAweDI5LCAweDI5LCAweDI5LCAweDMxLAorICAgIDB4MjksIDB4MkQsIDB4MzAsIDB4MzQsCisgICAgMHgyOSwgMHgyRSwgMHgzMiwgMHgzNCwKKyAgICAweDI5LCAweDJCLCAweDMyLCAweDM0LAorICAgIDB4MjksIDB4MkIsIDB4MkYsIDB4MzQsCisgICAgMHgyOSwgMHgzNCwgMHgzNCwgMHgzNCwKKyAgICAweDI5LCAweDI5LCAweDM0LCAweDM0LAorICAgIDB4MjksIDB4MjksIDB4MjksIDB4MzQsCisgICAgMHgyOSwgMHgyRSwgMHgzMiwgMHgzNywKKyAgICAweDI5LCAweDMwLCAweDM0LCAweDM3LAorICAgIDB4MjksIDB4MkMsIDB4MzQsIDB4MzcsCisgICAgMHgyOSwgMHgyQywgMHgzMCwgMHgzNywKKyAgICAweDI5LCAweDM3LCAweDM3LCAweDM3LAorICAgIDB4MjksIDB4MjksIDB4MzcsIDB4MzcsCisgICAgMHgyOSwgMHgyOSwgMHgyOSwgMHgzNywKKyAgICAweDI5LCAweDJGLCAweDM0LCAweDNBLAorICAgIDB4MjksIDB4MzEsIDB4MzYsIDB4M0EsCisgICAgMHgyOSwgMHgyRCwgMHgzNiwgMHgzQSwKKyAgICAweDI5LCAweDJELCAweDMyLCAweDNBLAorICAgIDB4MjksIDB4M0EsIDB4M0EsIDB4M0EsCisgICAgMHgyOSwgMHgyOSwgMHgzQSwgMHgzQSwKKyAgICAweDI5LCAweDI5LCAweDI5LCAweDNBLAorICAgIDB4MjksIDB4MzAsIDB4MzYsIDB4M0QsCisgICAgMHgyOSwgMHgzMywgMHgzOCwgMHgzRCwKKyAgICAweDI5LCAweDJFLCAweDM4LCAweDNELAorICAgIDB4MjksIDB4MkUsIDB4MzMsIDB4M0QsCisgICAgMHgyOSwgMHgzRCwgMHgzRCwgMHgzRCwKKyAgICAweDI5LCAweDI5LCAweDNELCAweDNELAorICAgIDB4MjksIDB4MjksIDB4MjksIDB4M0QsCisgICAgMHgyQSwgMHgyQiwgMHgyQiwgMHgyQywKKyAgICAweDJBLCAweDJCLCAweDJDLCAweDJELAorICAgIDB4MkEsIDB4MkMsIDB4MkQsIDB4MkUsCisgICAgMHgyQSwgMHgyQiwgMHgyRCwgMHgyRSwKKyAgICAweDJBLCAweDJCLCAweDJDLCAweDJFLAorICAgIDB4MkEsIDB4MkMsIDB4MkQsIDB4MkYsCisgICAgMHgyQSwgMHgyQywgMHgyRSwgMHgyRiwKKyAgICAweDJBLCAweDJCLCAweDJFLCAweDJGLAorICAgIDB4MkEsIDB4MkIsIDB4MkQsIDB4MkYsCisgICAgMHgyQSwgMHgyQywgMHgyRSwgMHgzMCwKKyAgICAweDJBLCAweDJELCAweDJGLCAweDMwLAorICAgIDB4MkEsIDB4MkIsIDB4MkYsIDB4MzAsCisgICAgMHgyQSwgMHgyQiwgMHgyRCwgMHgzMCwKKyAgICAweDJBLCAweDMwLCAweDMwLCAweDMwLAorICAgIDB4MkEsIDB4MkEsIDB4MzAsIDB4MzAsCisgICAgMHgyQSwgMHgyQSwgMHgyQSwgMHgzMCwKKyAgICAweDJBLCAweDJELCAweDJFLCAweDMxLAorICAgIDB4MkEsIDB4MkQsIDB4MzAsIDB4MzEsCisgICAgMHgyQSwgMHgyQiwgMHgzMCwgMHgzMSwKKyAgICAweDJBLCAweDJCLCAweDJFLCAweDMxLAorICAgIDB4MkEsIDB4MkQsIDB4MkYsIDB4MzIsCisgICAgMHgyQSwgMHgyRSwgMHgzMCwgMHgzMiwKKyAgICAweDJBLCAweDJDLCAweDMwLCAweDMyLAorICAgIDB4MkEsIDB4MkMsIDB4MkUsIDB4MzIsCisgICAgMHgyQSwgMHgzMiwgMHgzMiwgMHgzMiwKKyAgICAweDJBLCAweDJBLCAweDMyLCAweDMyLAorICAgIDB4MkEsIDB4MkEsIDB4MkEsIDB4MzIsCisgICAgMHgyQSwgMHgyRSwgMHgzMSwgMHgzNSwKKyAgICAweDJBLCAweDJGLCAweDMzLCAweDM1LAorICAgIDB4MkEsIDB4MkMsIDB4MzMsIDB4MzUsCisgICAgMHgyQSwgMHgyQywgMHgzMCwgMHgzNSwKKyAgICAweDJBLCAweDM1LCAweDM1LCAweDM1LAorICAgIDB4MkEsIDB4MkEsIDB4MzUsIDB4MzUsCisgICAgMHgyQSwgMHgyQSwgMHgyQSwgMHgzNSwKKyAgICAweDJBLCAweDJGLCAweDMzLCAweDM4LAorICAgIDB4MkEsIDB4MzEsIDB4MzUsIDB4MzgsCisgICAgMHgyQSwgMHgyRCwgMHgzNSwgMHgzOCwKKyAgICAweDJBLCAweDJELCAweDMxLCAweDM4LAorICAgIDB4MkEsIDB4MzgsIDB4MzgsIDB4MzgsCisgICAgMHgyQSwgMHgyQSwgMHgzOCwgMHgzOCwKKyAgICAweDJBLCAweDJBLCAweDJBLCAweDM4LAorICAgIDB4MkEsIDB4MzAsIDB4MzUsIDB4M0IsCisgICAgMHgyQSwgMHgzMiwgMHgzNywgMHgzQiwKKyAgICAweDJBLCAweDJFLCAweDM3LCAweDNCLAorICAgIDB4MkEsIDB4MkUsIDB4MzMsIDB4M0IsCisgICAgMHgyQSwgMHgzQiwgMHgzQiwgMHgzQiwKKyAgICAweDJBLCAweDJBLCAweDNCLCAweDNCLAorICAgIDB4MkEsIDB4MkEsIDB4MkEsIDB4M0IsCisgICAgMHgyQSwgMHgzMSwgMHgzNywgMHgzRSwKKyAgICAweDJBLCAweDM0LCAweDM5LCAweDNFLAorICAgIDB4MkEsIDB4MkYsIDB4MzksIDB4M0UsCisgICAgMHgyQSwgMHgyRiwgMHgzNCwgMHgzRSwKKyAgICAweDJBLCAweDNFLCAweDNFLCAweDNFLAorICAgIDB4MkEsIDB4MkEsIDB4M0UsIDB4M0UsCisgICAgMHgyQSwgMHgyQSwgMHgyQSwgMHgzRSwKKyAgICAweDJCLCAweDJDLCAweDJDLCAweDJELAorICAgIDB4MkIsIDB4MkMsIDB4MkQsIDB4MkUsCisgICAgMHgyQiwgMHgyRCwgMHgyRSwgMHgyRiwKKyAgICAweDJCLCAweDJDLCAweDJFLCAweDJGLAorICAgIDB4MkIsIDB4MkMsIDB4MkQsIDB4MkYsCisgICAgMHgyQiwgMHgyRCwgMHgyRSwgMHgzMCwKKyAgICAweDJCLCAweDJELCAweDJGLCAweDMwLAorICAgIDB4MkIsIDB4MkMsIDB4MkYsIDB4MzAsCisgICAgMHgyQiwgMHgyQywgMHgyRSwgMHgzMCwKKyAgICAweDJCLCAweDJELCAweDJGLCAweDMxLAorICAgIDB4MkIsIDB4MkUsIDB4MzAsIDB4MzEsCisgICAgMHgyQiwgMHgyQywgMHgzMCwgMHgzMSwKKyAgICAweDJCLCAweDJDLCAweDJFLCAweDMxLAorICAgIDB4MkIsIDB4MzEsIDB4MzEsIDB4MzEsCisgICAgMHgyQiwgMHgyQiwgMHgzMSwgMHgzMSwKKyAgICAweDJCLCAweDJCLCAweDJCLCAweDMxLAorICAgIDB4MkIsIDB4MkUsIDB4MkYsIDB4MzIsCisgICAgMHgyQiwgMHgyRSwgMHgzMSwgMHgzMiwKKyAgICAweDJCLCAweDJDLCAweDMxLCAweDMyLAorICAgIDB4MkIsIDB4MkMsIDB4MkYsIDB4MzIsCisgICAgMHgyQiwgMHgyRSwgMHgzMCwgMHgzMywKKyAgICAweDJCLCAweDJGLCAweDMxLCAweDMzLAorICAgIDB4MkIsIDB4MkQsIDB4MzEsIDB4MzMsCisgICAgMHgyQiwgMHgyRCwgMHgyRiwgMHgzMywKKyAgICAweDJCLCAweDMzLCAweDMzLCAweDMzLAorICAgIDB4MkIsIDB4MkIsIDB4MzMsIDB4MzMsCisgICAgMHgyQiwgMHgyQiwgMHgyQiwgMHgzMywKKyAgICAweDJCLCAweDJGLCAweDMyLCAweDM2LAorICAgIDB4MkIsIDB4MzAsIDB4MzQsIDB4MzYsCisgICAgMHgyQiwgMHgyRCwgMHgzNCwgMHgzNiwKKyAgICAweDJCLCAweDJELCAweDMxLCAweDM2LAorICAgIDB4MkIsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgyQiwgMHgyQiwgMHgzNiwgMHgzNiwKKyAgICAweDJCLCAweDJCLCAweDJCLCAweDM2LAorICAgIDB4MkIsIDB4MzAsIDB4MzQsIDB4MzksCisgICAgMHgyQiwgMHgzMiwgMHgzNiwgMHgzOSwKKyAgICAweDJCLCAweDJFLCAweDM2LCAweDM5LAorICAgIDB4MkIsIDB4MkUsIDB4MzIsIDB4MzksCisgICAgMHgyQiwgMHgzOSwgMHgzOSwgMHgzOSwKKyAgICAweDJCLCAweDJCLCAweDM5LCAweDM5LAorICAgIDB4MkIsIDB4MkIsIDB4MkIsIDB4MzksCisgICAgMHgyQiwgMHgzMSwgMHgzNiwgMHgzQywKKyAgICAweDJCLCAweDMzLCAweDM4LCAweDNDLAorICAgIDB4MkIsIDB4MkYsIDB4MzgsIDB4M0MsCisgICAgMHgyQiwgMHgyRiwgMHgzNCwgMHgzQywKKyAgICAweDJCLCAweDNDLCAweDNDLCAweDNDLAorICAgIDB4MkIsIDB4MkIsIDB4M0MsIDB4M0MsCisgICAgMHgyQiwgMHgyQiwgMHgyQiwgMHgzQywKKyAgICAweDJCLCAweDMyLCAweDM4LCAweDNGLAorICAgIDB4MkIsIDB4MzUsIDB4M0EsIDB4M0YsCisgICAgMHgyQiwgMHgzMCwgMHgzQSwgMHgzRiwKKyAgICAweDJCLCAweDMwLCAweDM1LCAweDNGLAorICAgIDB4MkIsIDB4M0YsIDB4M0YsIDB4M0YsCisgICAgMHgyQiwgMHgyQiwgMHgzRiwgMHgzRiwKKyAgICAweDJCLCAweDJCLCAweDJCLCAweDNGLAorICAgIDB4MkMsIDB4MkQsIDB4MkQsIDB4MkUsCisgICAgMHgyQywgMHgyRCwgMHgyRSwgMHgyRiwKKyAgICAweDJDLCAweDJFLCAweDJGLCAweDMwLAorICAgIDB4MkMsIDB4MkQsIDB4MkYsIDB4MzAsCisgICAgMHgyQywgMHgyRCwgMHgyRSwgMHgzMCwKKyAgICAweDJDLCAweDJFLCAweDJGLCAweDMxLAorICAgIDB4MkMsIDB4MkUsIDB4MzAsIDB4MzEsCisgICAgMHgyQywgMHgyRCwgMHgzMCwgMHgzMSwKKyAgICAweDJDLCAweDJELCAweDJGLCAweDMxLAorICAgIDB4MkMsIDB4MkUsIDB4MzAsIDB4MzIsCisgICAgMHgyQywgMHgyRiwgMHgzMSwgMHgzMiwKKyAgICAweDJDLCAweDJELCAweDMxLCAweDMyLAorICAgIDB4MkMsIDB4MkQsIDB4MkYsIDB4MzIsCisgICAgMHgyQywgMHgzMiwgMHgzMiwgMHgzMiwKKyAgICAweDJDLCAweDJDLCAweDMyLCAweDMyLAorICAgIDB4MkMsIDB4MkMsIDB4MkMsIDB4MzIsCisgICAgMHgyQywgMHgyRiwgMHgzMCwgMHgzMywKKyAgICAweDJDLCAweDJGLCAweDMyLCAweDMzLAorICAgIDB4MkMsIDB4MkQsIDB4MzIsIDB4MzMsCisgICAgMHgyQywgMHgyRCwgMHgzMCwgMHgzMywKKyAgICAweDJDLCAweDJGLCAweDMxLCAweDM0LAorICAgIDB4MkMsIDB4MzAsIDB4MzIsIDB4MzQsCisgICAgMHgyQywgMHgyRSwgMHgzMiwgMHgzNCwKKyAgICAweDJDLCAweDJFLCAweDMwLCAweDM0LAorICAgIDB4MkMsIDB4MzQsIDB4MzQsIDB4MzQsCisgICAgMHgyQywgMHgyQywgMHgzNCwgMHgzNCwKKyAgICAweDJDLCAweDJDLCAweDJDLCAweDM0LAorICAgIDB4MkMsIDB4MzAsIDB4MzMsIDB4MzcsCisgICAgMHgyQywgMHgzMSwgMHgzNSwgMHgzNywKKyAgICAweDJDLCAweDJFLCAweDM1LCAweDM3LAorICAgIDB4MkMsIDB4MkUsIDB4MzIsIDB4MzcsCisgICAgMHgyQywgMHgzNywgMHgzNywgMHgzNywKKyAgICAweDJDLCAweDJDLCAweDM3LCAweDM3LAorICAgIDB4MkMsIDB4MkMsIDB4MkMsIDB4MzcsCisgICAgMHgyQywgMHgzMSwgMHgzNSwgMHgzQSwKKyAgICAweDJDLCAweDMzLCAweDM3LCAweDNBLAorICAgIDB4MkMsIDB4MkYsIDB4MzcsIDB4M0EsCisgICAgMHgyQywgMHgyRiwgMHgzMywgMHgzQSwKKyAgICAweDJDLCAweDNBLCAweDNBLCAweDNBLAorICAgIDB4MkMsIDB4MkMsIDB4M0EsIDB4M0EsCisgICAgMHgyQywgMHgyQywgMHgyQywgMHgzQSwKKyAgICAweDJDLCAweDMyLCAweDM3LCAweDNELAorICAgIDB4MkMsIDB4MzQsIDB4MzksIDB4M0QsCisgICAgMHgyQywgMHgzMCwgMHgzOSwgMHgzRCwKKyAgICAweDJDLCAweDMwLCAweDM1LCAweDNELAorICAgIDB4MkMsIDB4M0QsIDB4M0QsIDB4M0QsCisgICAgMHgyQywgMHgyQywgMHgzRCwgMHgzRCwKKyAgICAweDJDLCAweDJDLCAweDJDLCAweDNELAorICAgIDB4MkQsIDB4MkUsIDB4MkUsIDB4MkYsCisgICAgMHgyRCwgMHgyRSwgMHgyRiwgMHgzMCwKKyAgICAweDJELCAweDJGLCAweDMwLCAweDMxLAorICAgIDB4MkQsIDB4MkUsIDB4MzAsIDB4MzEsCisgICAgMHgyRCwgMHgyRSwgMHgyRiwgMHgzMSwKKyAgICAweDJELCAweDJGLCAweDMwLCAweDMyLAorICAgIDB4MkQsIDB4MkYsIDB4MzEsIDB4MzIsCisgICAgMHgyRCwgMHgyRSwgMHgzMSwgMHgzMiwKKyAgICAweDJELCAweDJFLCAweDMwLCAweDMyLAorICAgIDB4MkQsIDB4MkYsIDB4MzEsIDB4MzMsCisgICAgMHgyRCwgMHgzMCwgMHgzMiwgMHgzMywKKyAgICAweDJELCAweDJFLCAweDMyLCAweDMzLAorICAgIDB4MkQsIDB4MkUsIDB4MzAsIDB4MzMsCisgICAgMHgyRCwgMHgzMywgMHgzMywgMHgzMywKKyAgICAweDJELCAweDJELCAweDMzLCAweDMzLAorICAgIDB4MkQsIDB4MkQsIDB4MkQsIDB4MzMsCisgICAgMHgyRCwgMHgzMCwgMHgzMSwgMHgzNCwKKyAgICAweDJELCAweDMwLCAweDMzLCAweDM0LAorICAgIDB4MkQsIDB4MkUsIDB4MzMsIDB4MzQsCisgICAgMHgyRCwgMHgyRSwgMHgzMSwgMHgzNCwKKyAgICAweDJELCAweDMwLCAweDMyLCAweDM1LAorICAgIDB4MkQsIDB4MzEsIDB4MzMsIDB4MzUsCisgICAgMHgyRCwgMHgyRiwgMHgzMywgMHgzNSwKKyAgICAweDJELCAweDJGLCAweDMxLCAweDM1LAorICAgIDB4MkQsIDB4MzUsIDB4MzUsIDB4MzUsCisgICAgMHgyRCwgMHgyRCwgMHgzNSwgMHgzNSwKKyAgICAweDJELCAweDJELCAweDJELCAweDM1LAorICAgIDB4MkQsIDB4MzEsIDB4MzQsIDB4MzgsCisgICAgMHgyRCwgMHgzMiwgMHgzNiwgMHgzOCwKKyAgICAweDJELCAweDJGLCAweDM2LCAweDM4LAorICAgIDB4MkQsIDB4MkYsIDB4MzMsIDB4MzgsCisgICAgMHgyRCwgMHgzOCwgMHgzOCwgMHgzOCwKKyAgICAweDJELCAweDJELCAweDM4LCAweDM4LAorICAgIDB4MkQsIDB4MkQsIDB4MkQsIDB4MzgsCisgICAgMHgyRCwgMHgzMiwgMHgzNiwgMHgzQiwKKyAgICAweDJELCAweDM0LCAweDM4LCAweDNCLAorICAgIDB4MkQsIDB4MzAsIDB4MzgsIDB4M0IsCisgICAgMHgyRCwgMHgzMCwgMHgzNCwgMHgzQiwKKyAgICAweDJELCAweDNCLCAweDNCLCAweDNCLAorICAgIDB4MkQsIDB4MkQsIDB4M0IsIDB4M0IsCisgICAgMHgyRCwgMHgyRCwgMHgyRCwgMHgzQiwKKyAgICAweDJELCAweDMzLCAweDM4LCAweDNFLAorICAgIDB4MkQsIDB4MzUsIDB4M0EsIDB4M0UsCisgICAgMHgyRCwgMHgzMSwgMHgzQSwgMHgzRSwKKyAgICAweDJELCAweDMxLCAweDM2LCAweDNFLAorICAgIDB4MkQsIDB4M0UsIDB4M0UsIDB4M0UsCisgICAgMHgyRCwgMHgyRCwgMHgzRSwgMHgzRSwKKyAgICAweDJELCAweDJELCAweDJELCAweDNFLAorICAgIDB4MkUsIDB4MkYsIDB4MkYsIDB4MzAsCisgICAgMHgyRSwgMHgyRiwgMHgzMCwgMHgzMSwKKyAgICAweDJFLCAweDMwLCAweDMxLCAweDMyLAorICAgIDB4MkUsIDB4MkYsIDB4MzEsIDB4MzIsCisgICAgMHgyRSwgMHgyRiwgMHgzMCwgMHgzMiwKKyAgICAweDJFLCAweDMwLCAweDMxLCAweDMzLAorICAgIDB4MkUsIDB4MzAsIDB4MzIsIDB4MzMsCisgICAgMHgyRSwgMHgyRiwgMHgzMiwgMHgzMywKKyAgICAweDJFLCAweDJGLCAweDMxLCAweDMzLAorICAgIDB4MkUsIDB4MzAsIDB4MzIsIDB4MzQsCisgICAgMHgyRSwgMHgzMSwgMHgzMywgMHgzNCwKKyAgICAweDJFLCAweDJGLCAweDMzLCAweDM0LAorICAgIDB4MkUsIDB4MkYsIDB4MzEsIDB4MzQsCisgICAgMHgyRSwgMHgzNCwgMHgzNCwgMHgzNCwKKyAgICAweDJFLCAweDJFLCAweDM0LCAweDM0LAorICAgIDB4MkUsIDB4MkUsIDB4MkUsIDB4MzQsCisgICAgMHgyRSwgMHgzMSwgMHgzMiwgMHgzNSwKKyAgICAweDJFLCAweDMxLCAweDM0LCAweDM1LAorICAgIDB4MkUsIDB4MkYsIDB4MzQsIDB4MzUsCisgICAgMHgyRSwgMHgyRiwgMHgzMiwgMHgzNSwKKyAgICAweDJFLCAweDMxLCAweDMzLCAweDM2LAorICAgIDB4MkUsIDB4MzIsIDB4MzQsIDB4MzYsCisgICAgMHgyRSwgMHgzMCwgMHgzNCwgMHgzNiwKKyAgICAweDJFLCAweDMwLCAweDMyLCAweDM2LAorICAgIDB4MkUsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgyRSwgMHgyRSwgMHgzNiwgMHgzNiwKKyAgICAweDJFLCAweDJFLCAweDJFLCAweDM2LAorICAgIDB4MkUsIDB4MzIsIDB4MzUsIDB4MzksCisgICAgMHgyRSwgMHgzMywgMHgzNywgMHgzOSwKKyAgICAweDJFLCAweDMwLCAweDM3LCAweDM5LAorICAgIDB4MkUsIDB4MzAsIDB4MzQsIDB4MzksCisgICAgMHgyRSwgMHgzOSwgMHgzOSwgMHgzOSwKKyAgICAweDJFLCAweDJFLCAweDM5LCAweDM5LAorICAgIDB4MkUsIDB4MkUsIDB4MkUsIDB4MzksCisgICAgMHgyRSwgMHgzMywgMHgzNywgMHgzQywKKyAgICAweDJFLCAweDM1LCAweDM5LCAweDNDLAorICAgIDB4MkUsIDB4MzEsIDB4MzksIDB4M0MsCisgICAgMHgyRSwgMHgzMSwgMHgzNSwgMHgzQywKKyAgICAweDJFLCAweDNDLCAweDNDLCAweDNDLAorICAgIDB4MkUsIDB4MkUsIDB4M0MsIDB4M0MsCisgICAgMHgyRSwgMHgyRSwgMHgyRSwgMHgzQywKKyAgICAweDJFLCAweDM0LCAweDM5LCAweDNGLAorICAgIDB4MkUsIDB4MzYsIDB4M0IsIDB4M0YsCisgICAgMHgyRSwgMHgzMiwgMHgzQiwgMHgzRiwKKyAgICAweDJFLCAweDMyLCAweDM3LCAweDNGLAorICAgIDB4MkUsIDB4M0YsIDB4M0YsIDB4M0YsCisgICAgMHgyRSwgMHgyRSwgMHgzRiwgMHgzRiwKKyAgICAweDJFLCAweDJFLCAweDJFLCAweDNGLAorICAgIDB4MkYsIDB4MzAsIDB4MzAsIDB4MzEsCisgICAgMHgyRiwgMHgzMCwgMHgzMSwgMHgzMiwKKyAgICAweDJGLCAweDMxLCAweDMyLCAweDMzLAorICAgIDB4MkYsIDB4MzAsIDB4MzIsIDB4MzMsCisgICAgMHgyRiwgMHgzMCwgMHgzMSwgMHgzMywKKyAgICAweDJGLCAweDMxLCAweDMyLCAweDM0LAorICAgIDB4MkYsIDB4MzEsIDB4MzMsIDB4MzQsCisgICAgMHgyRiwgMHgzMCwgMHgzMywgMHgzNCwKKyAgICAweDJGLCAweDMwLCAweDMyLCAweDM0LAorICAgIDB4MkYsIDB4MzEsIDB4MzMsIDB4MzUsCisgICAgMHgyRiwgMHgzMiwgMHgzNCwgMHgzNSwKKyAgICAweDJGLCAweDMwLCAweDM0LCAweDM1LAorICAgIDB4MkYsIDB4MzAsIDB4MzIsIDB4MzUsCisgICAgMHgyRiwgMHgzNSwgMHgzNSwgMHgzNSwKKyAgICAweDJGLCAweDJGLCAweDM1LCAweDM1LAorICAgIDB4MkYsIDB4MkYsIDB4MkYsIDB4MzUsCisgICAgMHgyRiwgMHgzMiwgMHgzMywgMHgzNiwKKyAgICAweDJGLCAweDMyLCAweDM1LCAweDM2LAorICAgIDB4MkYsIDB4MzAsIDB4MzUsIDB4MzYsCisgICAgMHgyRiwgMHgzMCwgMHgzMywgMHgzNiwKKyAgICAweDJGLCAweDMyLCAweDM0LCAweDM3LAorICAgIDB4MkYsIDB4MzMsIDB4MzUsIDB4MzcsCisgICAgMHgyRiwgMHgzMSwgMHgzNSwgMHgzNywKKyAgICAweDJGLCAweDMxLCAweDMzLCAweDM3LAorICAgIDB4MkYsIDB4MzcsIDB4MzcsIDB4MzcsCisgICAgMHgyRiwgMHgyRiwgMHgzNywgMHgzNywKKyAgICAweDJGLCAweDJGLCAweDJGLCAweDM3LAorICAgIDB4MkYsIDB4MzMsIDB4MzYsIDB4M0EsCisgICAgMHgyRiwgMHgzNCwgMHgzOCwgMHgzQSwKKyAgICAweDJGLCAweDMxLCAweDM4LCAweDNBLAorICAgIDB4MkYsIDB4MzEsIDB4MzUsIDB4M0EsCisgICAgMHgyRiwgMHgzQSwgMHgzQSwgMHgzQSwKKyAgICAweDJGLCAweDJGLCAweDNBLCAweDNBLAorICAgIDB4MkYsIDB4MkYsIDB4MkYsIDB4M0EsCisgICAgMHgyRiwgMHgzNCwgMHgzOCwgMHgzRCwKKyAgICAweDJGLCAweDM2LCAweDNBLCAweDNELAorICAgIDB4MkYsIDB4MzIsIDB4M0EsIDB4M0QsCisgICAgMHgyRiwgMHgzMiwgMHgzNiwgMHgzRCwKKyAgICAweDJGLCAweDNELCAweDNELCAweDNELAorICAgIDB4MkYsIDB4MkYsIDB4M0QsIDB4M0QsCisgICAgMHgyRiwgMHgyRiwgMHgyRiwgMHgzRCwKKyAgICAweDMwLCAweDMxLCAweDMxLCAweDMyLAorICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsCisgICAgMHgzMCwgMHgzMiwgMHgzMywgMHgzNCwKKyAgICAweDMwLCAweDMxLCAweDMzLCAweDM0LAorICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzQsCisgICAgMHgzMCwgMHgzMiwgMHgzMywgMHgzNSwKKyAgICAweDMwLCAweDMyLCAweDM0LCAweDM1LAorICAgIDB4MzAsIDB4MzEsIDB4MzQsIDB4MzUsCisgICAgMHgzMCwgMHgzMSwgMHgzMywgMHgzNSwKKyAgICAweDMwLCAweDMyLCAweDM0LCAweDM2LAorICAgIDB4MzAsIDB4MzMsIDB4MzUsIDB4MzYsCisgICAgMHgzMCwgMHgzMSwgMHgzNSwgMHgzNiwKKyAgICAweDMwLCAweDMxLCAweDMzLCAweDM2LAorICAgIDB4MzAsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgzMCwgMHgzMCwgMHgzNiwgMHgzNiwKKyAgICAweDMwLCAweDMwLCAweDMwLCAweDM2LAorICAgIDB4MzAsIDB4MzMsIDB4MzQsIDB4MzcsCisgICAgMHgzMCwgMHgzMywgMHgzNiwgMHgzNywKKyAgICAweDMwLCAweDMxLCAweDM2LCAweDM3LAorICAgIDB4MzAsIDB4MzEsIDB4MzQsIDB4MzcsCisgICAgMHgzMCwgMHgzMywgMHgzNSwgMHgzOCwKKyAgICAweDMwLCAweDM0LCAweDM2LCAweDM4LAorICAgIDB4MzAsIDB4MzIsIDB4MzYsIDB4MzgsCisgICAgMHgzMCwgMHgzMiwgMHgzNCwgMHgzOCwKKyAgICAweDMwLCAweDM4LCAweDM4LCAweDM4LAorICAgIDB4MzAsIDB4MzAsIDB4MzgsIDB4MzgsCisgICAgMHgzMCwgMHgzMCwgMHgzMCwgMHgzOCwKKyAgICAweDMwLCAweDM0LCAweDM3LCAweDNCLAorICAgIDB4MzAsIDB4MzUsIDB4MzksIDB4M0IsCisgICAgMHgzMCwgMHgzMiwgMHgzOSwgMHgzQiwKKyAgICAweDMwLCAweDMyLCAweDM2LCAweDNCLAorICAgIDB4MzAsIDB4M0IsIDB4M0IsIDB4M0IsCisgICAgMHgzMCwgMHgzMCwgMHgzQiwgMHgzQiwKKyAgICAweDMwLCAweDMwLCAweDMwLCAweDNCLAorICAgIDB4MzAsIDB4MzUsIDB4MzksIDB4M0UsCisgICAgMHgzMCwgMHgzNywgMHgzQiwgMHgzRSwKKyAgICAweDMwLCAweDMzLCAweDNCLCAweDNFLAorICAgIDB4MzAsIDB4MzMsIDB4MzcsIDB4M0UsCisgICAgMHgzMCwgMHgzRSwgMHgzRSwgMHgzRSwKKyAgICAweDMwLCAweDMwLCAweDNFLCAweDNFLAorICAgIDB4MzAsIDB4MzAsIDB4MzAsIDB4M0UsCisgICAgMHgzMSwgMHgzMiwgMHgzMiwgMHgzMywKKyAgICAweDMxLCAweDMyLCAweDMzLCAweDM0LAorICAgIDB4MzEsIDB4MzMsIDB4MzQsIDB4MzUsCisgICAgMHgzMSwgMHgzMiwgMHgzNCwgMHgzNSwKKyAgICAweDMxLCAweDMyLCAweDMzLCAweDM1LAorICAgIDB4MzEsIDB4MzMsIDB4MzQsIDB4MzYsCisgICAgMHgzMSwgMHgzMywgMHgzNSwgMHgzNiwKKyAgICAweDMxLCAweDMyLCAweDM1LCAweDM2LAorICAgIDB4MzEsIDB4MzIsIDB4MzQsIDB4MzYsCisgICAgMHgzMSwgMHgzMywgMHgzNSwgMHgzNywKKyAgICAweDMxLCAweDM0LCAweDM2LCAweDM3LAorICAgIDB4MzEsIDB4MzIsIDB4MzYsIDB4MzcsCisgICAgMHgzMSwgMHgzMiwgMHgzNCwgMHgzNywKKyAgICAweDMxLCAweDM3LCAweDM3LCAweDM3LAorICAgIDB4MzEsIDB4MzEsIDB4MzcsIDB4MzcsCisgICAgMHgzMSwgMHgzMSwgMHgzMSwgMHgzNywKKyAgICAweDMxLCAweDM0LCAweDM1LCAweDM4LAorICAgIDB4MzEsIDB4MzQsIDB4MzcsIDB4MzgsCisgICAgMHgzMSwgMHgzMiwgMHgzNywgMHgzOCwKKyAgICAweDMxLCAweDMyLCAweDM1LCAweDM4LAorICAgIDB4MzEsIDB4MzQsIDB4MzYsIDB4MzksCisgICAgMHgzMSwgMHgzNSwgMHgzNywgMHgzOSwKKyAgICAweDMxLCAweDMzLCAweDM3LCAweDM5LAorICAgIDB4MzEsIDB4MzMsIDB4MzUsIDB4MzksCisgICAgMHgzMSwgMHgzOSwgMHgzOSwgMHgzOSwKKyAgICAweDMxLCAweDMxLCAweDM5LCAweDM5LAorICAgIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzksCisgICAgMHgzMSwgMHgzNSwgMHgzOCwgMHgzQywKKyAgICAweDMxLCAweDM2LCAweDNBLCAweDNDLAorICAgIDB4MzEsIDB4MzMsIDB4M0EsIDB4M0MsCisgICAgMHgzMSwgMHgzMywgMHgzNywgMHgzQywKKyAgICAweDMxLCAweDNDLCAweDNDLCAweDNDLAorICAgIDB4MzEsIDB4MzEsIDB4M0MsIDB4M0MsCisgICAgMHgzMSwgMHgzMSwgMHgzMSwgMHgzQywKKyAgICAweDMxLCAweDM2LCAweDNBLCAweDNGLAorICAgIDB4MzEsIDB4MzgsIDB4M0MsIDB4M0YsCisgICAgMHgzMSwgMHgzNCwgMHgzQywgMHgzRiwKKyAgICAweDMxLCAweDM0LCAweDM4LCAweDNGLAorICAgIDB4MzEsIDB4M0YsIDB4M0YsIDB4M0YsCisgICAgMHgzMSwgMHgzMSwgMHgzRiwgMHgzRiwKKyAgICAweDMxLCAweDMxLCAweDMxLCAweDNGLAorICAgIDB4MzIsIDB4MzMsIDB4MzMsIDB4MzQsCisgICAgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwKKyAgICAweDMyLCAweDM0LCAweDM1LCAweDM2LAorICAgIDB4MzIsIDB4MzMsIDB4MzUsIDB4MzYsCisgICAgMHgzMiwgMHgzMywgMHgzNCwgMHgzNiwKKyAgICAweDMyLCAweDM0LCAweDM1LCAweDM3LAorICAgIDB4MzIsIDB4MzQsIDB4MzYsIDB4MzcsCisgICAgMHgzMiwgMHgzMywgMHgzNiwgMHgzNywKKyAgICAweDMyLCAweDMzLCAweDM1LCAweDM3LAorICAgIDB4MzIsIDB4MzQsIDB4MzYsIDB4MzgsCisgICAgMHgzMiwgMHgzNSwgMHgzNywgMHgzOCwKKyAgICAweDMyLCAweDMzLCAweDM3LCAweDM4LAorICAgIDB4MzIsIDB4MzMsIDB4MzUsIDB4MzgsCisgICAgMHgzMiwgMHgzOCwgMHgzOCwgMHgzOCwKKyAgICAweDMyLCAweDMyLCAweDM4LCAweDM4LAorICAgIDB4MzIsIDB4MzIsIDB4MzIsIDB4MzgsCisgICAgMHgzMiwgMHgzNSwgMHgzNiwgMHgzOSwKKyAgICAweDMyLCAweDM1LCAweDM4LCAweDM5LAorICAgIDB4MzIsIDB4MzMsIDB4MzgsIDB4MzksCisgICAgMHgzMiwgMHgzMywgMHgzNiwgMHgzOSwKKyAgICAweDMyLCAweDM1LCAweDM3LCAweDNBLAorICAgIDB4MzIsIDB4MzYsIDB4MzgsIDB4M0EsCisgICAgMHgzMiwgMHgzNCwgMHgzOCwgMHgzQSwKKyAgICAweDMyLCAweDM0LCAweDM2LCAweDNBLAorICAgIDB4MzIsIDB4M0EsIDB4M0EsIDB4M0EsCisgICAgMHgzMiwgMHgzMiwgMHgzQSwgMHgzQSwKKyAgICAweDMyLCAweDMyLCAweDMyLCAweDNBLAorICAgIDB4MzIsIDB4MzYsIDB4MzksIDB4M0QsCisgICAgMHgzMiwgMHgzNywgMHgzQiwgMHgzRCwKKyAgICAweDMyLCAweDM0LCAweDNCLCAweDNELAorICAgIDB4MzIsIDB4MzQsIDB4MzgsIDB4M0QsCisgICAgMHgzMiwgMHgzRCwgMHgzRCwgMHgzRCwKKyAgICAweDMyLCAweDMyLCAweDNELCAweDNELAorICAgIDB4MzIsIDB4MzIsIDB4MzIsIDB4M0QsCisgICAgMHgzMywgMHgzNCwgMHgzNCwgMHgzNSwKKyAgICAweDMzLCAweDM0LCAweDM1LCAweDM2LAorICAgIDB4MzMsIDB4MzUsIDB4MzYsIDB4MzcsCisgICAgMHgzMywgMHgzNCwgMHgzNiwgMHgzNywKKyAgICAweDMzLCAweDM0LCAweDM1LCAweDM3LAorICAgIDB4MzMsIDB4MzUsIDB4MzYsIDB4MzgsCisgICAgMHgzMywgMHgzNSwgMHgzNywgMHgzOCwKKyAgICAweDMzLCAweDM0LCAweDM3LCAweDM4LAorICAgIDB4MzMsIDB4MzQsIDB4MzYsIDB4MzgsCisgICAgMHgzMywgMHgzNSwgMHgzNywgMHgzOSwKKyAgICAweDMzLCAweDM2LCAweDM4LCAweDM5LAorICAgIDB4MzMsIDB4MzQsIDB4MzgsIDB4MzksCisgICAgMHgzMywgMHgzNCwgMHgzNiwgMHgzOSwKKyAgICAweDMzLCAweDM5LCAweDM5LCAweDM5LAorICAgIDB4MzMsIDB4MzMsIDB4MzksIDB4MzksCisgICAgMHgzMywgMHgzMywgMHgzMywgMHgzOSwKKyAgICAweDMzLCAweDM2LCAweDM3LCAweDNBLAorICAgIDB4MzMsIDB4MzYsIDB4MzksIDB4M0EsCisgICAgMHgzMywgMHgzNCwgMHgzOSwgMHgzQSwKKyAgICAweDMzLCAweDM0LCAweDM3LCAweDNBLAorICAgIDB4MzMsIDB4MzYsIDB4MzgsIDB4M0IsCisgICAgMHgzMywgMHgzNywgMHgzOSwgMHgzQiwKKyAgICAweDMzLCAweDM1LCAweDM5LCAweDNCLAorICAgIDB4MzMsIDB4MzUsIDB4MzcsIDB4M0IsCisgICAgMHgzMywgMHgzQiwgMHgzQiwgMHgzQiwKKyAgICAweDMzLCAweDMzLCAweDNCLCAweDNCLAorICAgIDB4MzMsIDB4MzMsIDB4MzMsIDB4M0IsCisgICAgMHgzMywgMHgzNywgMHgzQSwgMHgzRSwKKyAgICAweDMzLCAweDM4LCAweDNDLCAweDNFLAorICAgIDB4MzMsIDB4MzUsIDB4M0MsIDB4M0UsCisgICAgMHgzMywgMHgzNSwgMHgzOSwgMHgzRSwKKyAgICAweDMzLCAweDNFLCAweDNFLCAweDNFLAorICAgIDB4MzMsIDB4MzMsIDB4M0UsIDB4M0UsCisgICAgMHgzMywgMHgzMywgMHgzMywgMHgzRSwKKyAgICAweDM0LCAweDM1LCAweDM1LCAweDM2LAorICAgIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisgICAgMHgzNCwgMHgzNiwgMHgzNywgMHgzOCwKKyAgICAweDM0LCAweDM1LCAweDM3LCAweDM4LAorICAgIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzgsCisgICAgMHgzNCwgMHgzNiwgMHgzNywgMHgzOSwKKyAgICAweDM0LCAweDM2LCAweDM4LCAweDM5LAorICAgIDB4MzQsIDB4MzUsIDB4MzgsIDB4MzksCisgICAgMHgzNCwgMHgzNSwgMHgzNywgMHgzOSwKKyAgICAweDM0LCAweDM2LCAweDM4LCAweDNBLAorICAgIDB4MzQsIDB4MzcsIDB4MzksIDB4M0EsCisgICAgMHgzNCwgMHgzNSwgMHgzOSwgMHgzQSwKKyAgICAweDM0LCAweDM1LCAweDM3LCAweDNBLAorICAgIDB4MzQsIDB4M0EsIDB4M0EsIDB4M0EsCisgICAgMHgzNCwgMHgzNCwgMHgzQSwgMHgzQSwKKyAgICAweDM0LCAweDM0LCAweDM0LCAweDNBLAorICAgIDB4MzQsIDB4MzcsIDB4MzgsIDB4M0IsCisgICAgMHgzNCwgMHgzNywgMHgzQSwgMHgzQiwKKyAgICAweDM0LCAweDM1LCAweDNBLCAweDNCLAorICAgIDB4MzQsIDB4MzUsIDB4MzgsIDB4M0IsCisgICAgMHgzNCwgMHgzNywgMHgzOSwgMHgzQywKKyAgICAweDM0LCAweDM4LCAweDNBLCAweDNDLAorICAgIDB4MzQsIDB4MzYsIDB4M0EsIDB4M0MsCisgICAgMHgzNCwgMHgzNiwgMHgzOCwgMHgzQywKKyAgICAweDM0LCAweDNDLCAweDNDLCAweDNDLAorICAgIDB4MzQsIDB4MzQsIDB4M0MsIDB4M0MsCisgICAgMHgzNCwgMHgzNCwgMHgzNCwgMHgzQywKKyAgICAweDM0LCAweDM4LCAweDNCLCAweDNGLAorICAgIDB4MzQsIDB4MzksIDB4M0QsIDB4M0YsCisgICAgMHgzNCwgMHgzNiwgMHgzRCwgMHgzRiwKKyAgICAweDM0LCAweDM2LCAweDNBLCAweDNGLAorICAgIDB4MzQsIDB4M0YsIDB4M0YsIDB4M0YsCisgICAgMHgzNCwgMHgzNCwgMHgzRiwgMHgzRiwKKyAgICAweDM0LCAweDM0LCAweDM0LCAweDNGLAorICAgIDB4MzUsIDB4MzYsIDB4MzYsIDB4MzcsCisgICAgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgICAweDM1LCAweDM3LCAweDM4LCAweDM5LAorICAgIDB4MzUsIDB4MzYsIDB4MzgsIDB4MzksCisgICAgMHgzNSwgMHgzNiwgMHgzNywgMHgzOSwKKyAgICAweDM1LCAweDM3LCAweDM4LCAweDNBLAorICAgIDB4MzUsIDB4MzcsIDB4MzksIDB4M0EsCisgICAgMHgzNSwgMHgzNiwgMHgzOSwgMHgzQSwKKyAgICAweDM1LCAweDM2LCAweDM4LCAweDNBLAorICAgIDB4MzUsIDB4MzcsIDB4MzksIDB4M0IsCisgICAgMHgzNSwgMHgzOCwgMHgzQSwgMHgzQiwKKyAgICAweDM1LCAweDM2LCAweDNBLCAweDNCLAorICAgIDB4MzUsIDB4MzYsIDB4MzgsIDB4M0IsCisgICAgMHgzNSwgMHgzQiwgMHgzQiwgMHgzQiwKKyAgICAweDM1LCAweDM1LCAweDNCLCAweDNCLAorICAgIDB4MzUsIDB4MzUsIDB4MzUsIDB4M0IsCisgICAgMHgzNSwgMHgzOCwgMHgzOSwgMHgzQywKKyAgICAweDM1LCAweDM4LCAweDNCLCAweDNDLAorICAgIDB4MzUsIDB4MzYsIDB4M0IsIDB4M0MsCisgICAgMHgzNSwgMHgzNiwgMHgzOSwgMHgzQywKKyAgICAweDM1LCAweDM4LCAweDNBLCAweDNELAorICAgIDB4MzUsIDB4MzksIDB4M0IsIDB4M0QsCisgICAgMHgzNSwgMHgzNywgMHgzQiwgMHgzRCwKKyAgICAweDM1LCAweDM3LCAweDM5LCAweDNELAorICAgIDB4MzUsIDB4M0QsIDB4M0QsIDB4M0QsCisgICAgMHgzNSwgMHgzNSwgMHgzRCwgMHgzRCwKKyAgICAweDM1LCAweDM1LCAweDM1LCAweDNELAorICAgIDB4MzYsIDB4MzcsIDB4MzcsIDB4MzgsCisgICAgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKKyAgICAweDM2LCAweDM4LCAweDM5LCAweDNBLAorICAgIDB4MzYsIDB4MzcsIDB4MzksIDB4M0EsCisgICAgMHgzNiwgMHgzNywgMHgzOCwgMHgzQSwKKyAgICAweDM2LCAweDM4LCAweDM5LCAweDNCLAorICAgIDB4MzYsIDB4MzgsIDB4M0EsIDB4M0IsCisgICAgMHgzNiwgMHgzNywgMHgzQSwgMHgzQiwKKyAgICAweDM2LCAweDM3LCAweDM5LCAweDNCLAorICAgIDB4MzYsIDB4MzgsIDB4M0EsIDB4M0MsCisgICAgMHgzNiwgMHgzOSwgMHgzQiwgMHgzQywKKyAgICAweDM2LCAweDM3LCAweDNCLCAweDNDLAorICAgIDB4MzYsIDB4MzcsIDB4MzksIDB4M0MsCisgICAgMHgzNiwgMHgzQywgMHgzQywgMHgzQywKKyAgICAweDM2LCAweDM2LCAweDNDLCAweDNDLAorICAgIDB4MzYsIDB4MzYsIDB4MzYsIDB4M0MsCisgICAgMHgzNiwgMHgzOSwgMHgzQSwgMHgzRCwKKyAgICAweDM2LCAweDM5LCAweDNDLCAweDNELAorICAgIDB4MzYsIDB4MzcsIDB4M0MsIDB4M0QsCisgICAgMHgzNiwgMHgzNywgMHgzQSwgMHgzRCwKKyAgICAweDM2LCAweDM5LCAweDNCLCAweDNFLAorICAgIDB4MzYsIDB4M0EsIDB4M0MsIDB4M0UsCisgICAgMHgzNiwgMHgzOCwgMHgzQywgMHgzRSwKKyAgICAweDM2LCAweDM4LCAweDNBLCAweDNFLAorICAgIDB4MzYsIDB4M0UsIDB4M0UsIDB4M0UsCisgICAgMHgzNiwgMHgzNiwgMHgzRSwgMHgzRSwKKyAgICAweDM2LCAweDM2LCAweDM2LCAweDNFLAorICAgIDB4MzcsIDB4MzgsIDB4MzgsIDB4MzksCisgICAgMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwKKyAgICAweDM3LCAweDM5LCAweDNBLCAweDNCLAorICAgIDB4MzcsIDB4MzgsIDB4M0EsIDB4M0IsCisgICAgMHgzNywgMHgzOCwgMHgzOSwgMHgzQiwKKyAgICAweDM3LCAweDM5LCAweDNBLCAweDNDLAorICAgIDB4MzcsIDB4MzksIDB4M0IsIDB4M0MsCisgICAgMHgzNywgMHgzOCwgMHgzQiwgMHgzQywKKyAgICAweDM3LCAweDM4LCAweDNBLCAweDNDLAorICAgIDB4MzcsIDB4MzksIDB4M0IsIDB4M0QsCisgICAgMHgzNywgMHgzQSwgMHgzQywgMHgzRCwKKyAgICAweDM3LCAweDM4LCAweDNDLCAweDNELAorICAgIDB4MzcsIDB4MzgsIDB4M0EsIDB4M0QsCisgICAgMHgzNywgMHgzRCwgMHgzRCwgMHgzRCwKKyAgICAweDM3LCAweDM3LCAweDNELCAweDNELAorICAgIDB4MzcsIDB4MzcsIDB4MzcsIDB4M0QsCisgICAgMHgzNywgMHgzQSwgMHgzQiwgMHgzRSwKKyAgICAweDM3LCAweDNBLCAweDNELCAweDNFLAorICAgIDB4MzcsIDB4MzgsIDB4M0QsIDB4M0UsCisgICAgMHgzNywgMHgzOCwgMHgzQiwgMHgzRSwKKyAgICAweDM3LCAweDNBLCAweDNDLCAweDNGLAorICAgIDB4MzcsIDB4M0IsIDB4M0QsIDB4M0YsCisgICAgMHgzNywgMHgzOSwgMHgzRCwgMHgzRiwKKyAgICAweDM3LCAweDM5LCAweDNCLCAweDNGLAorICAgIDB4MzcsIDB4M0YsIDB4M0YsIDB4M0YsCisgICAgMHgzNywgMHgzNywgMHgzRiwgMHgzRiwKKyAgICAweDM3LCAweDM3LCAweDM3LCAweDNGLAorICAgIDB4MzgsIDB4MzksIDB4MzksIDB4M0EsCisgICAgMHgzOCwgMHgzOSwgMHgzQSwgMHgzQiwKKyAgICAweDM4LCAweDNBLCAweDNCLCAweDNDLAorICAgIDB4MzgsIDB4MzksIDB4M0IsIDB4M0MsCisgICAgMHgzOCwgMHgzOSwgMHgzQSwgMHgzQywKKyAgICAweDM4LCAweDNBLCAweDNCLCAweDNELAorICAgIDB4MzgsIDB4M0EsIDB4M0MsIDB4M0QsCisgICAgMHgzOCwgMHgzOSwgMHgzQywgMHgzRCwKKyAgICAweDM4LCAweDM5LCAweDNCLCAweDNELAorICAgIDB4MzgsIDB4M0EsIDB4M0MsIDB4M0UsCisgICAgMHgzOCwgMHgzQiwgMHgzRCwgMHgzRSwKKyAgICAweDM4LCAweDM5LCAweDNELCAweDNFLAorICAgIDB4MzgsIDB4MzksIDB4M0IsIDB4M0UsCisgICAgMHgzOCwgMHgzRSwgMHgzRSwgMHgzRSwKKyAgICAweDM4LCAweDM4LCAweDNFLCAweDNFLAorICAgIDB4MzgsIDB4MzgsIDB4MzgsIDB4M0UsCisgICAgMHgzOCwgMHgzQiwgMHgzQywgMHgzRiwKKyAgICAweDM4LCAweDNCLCAweDNFLCAweDNGLAorICAgIDB4MzgsIDB4MzksIDB4M0UsIDB4M0YsCisgICAgMHgzOCwgMHgzOSwgMHgzQywgMHgzRiwKKyAgICAweDM5LCAweDNBLCAweDNBLCAweDNCLAorICAgIDB4MzksIDB4M0EsIDB4M0IsIDB4M0MsCisgICAgMHgzOSwgMHgzQiwgMHgzQywgMHgzRCwKKyAgICAweDM5LCAweDNBLCAweDNDLCAweDNELAorICAgIDB4MzksIDB4M0EsIDB4M0IsIDB4M0QsCisgICAgMHgzOSwgMHgzQiwgMHgzQywgMHgzRSwKKyAgICAweDM5LCAweDNCLCAweDNELCAweDNFLAorICAgIDB4MzksIDB4M0EsIDB4M0QsIDB4M0UsCisgICAgMHgzOSwgMHgzQSwgMHgzQywgMHgzRSwKKyAgICAweDM5LCAweDNCLCAweDNELCAweDNGLAorICAgIDB4MzksIDB4M0MsIDB4M0UsIDB4M0YsCisgICAgMHgzOSwgMHgzQSwgMHgzRSwgMHgzRiwKKyAgICAweDM5LCAweDNBLCAweDNDLCAweDNGLAorICAgIDB4MzksIDB4M0YsIDB4M0YsIDB4M0YsCisgICAgMHgzOSwgMHgzOSwgMHgzRiwgMHgzRiwKKyAgICAweDM5LCAweDM5LCAweDM5LCAweDNGLAorICAgIDB4M0EsIDB4M0IsIDB4M0IsIDB4M0MsCisgICAgMHgzQSwgMHgzQiwgMHgzQywgMHgzRCwKKyAgICAweDNBLCAweDNDLCAweDNELCAweDNFLAorICAgIDB4M0EsIDB4M0IsIDB4M0QsIDB4M0UsCisgICAgMHgzQSwgMHgzQiwgMHgzQywgMHgzRSwKKyAgICAweDNBLCAweDNDLCAweDNELCAweDNGLAorICAgIDB4M0EsIDB4M0MsIDB4M0UsIDB4M0YsCisgICAgMHgzQSwgMHgzQiwgMHgzRSwgMHgzRiwKKyAgICAweDNBLCAweDNCLCAweDNELCAweDNGLAorICAgIDB4M0IsIDB4M0MsIDB4M0MsIDB4M0QsCisgICAgMHgzQiwgMHgzQywgMHgzRCwgMHgzRSwKKyAgICAweDNCLCAweDNELCAweDNFLCAweDNGLAorICAgIDB4M0IsIDB4M0MsIDB4M0UsIDB4M0YsCisgICAgMHgzQiwgMHgzQywgMHgzRCwgMHgzRiwKKyAgICAweDNDLCAweDNELCAweDNELCAweDNFLAorICAgIDB4M0MsIDB4M0QsIDB4M0UsIDB4M0YsCisgICAgMHgzRCwgMHgzRSwgMHgzRSwgMHgzRgorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVUxUSV9DQl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy91bmFyeS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdW5hcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDhkYzkzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdW5hcnkuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19VTkFSWV9ICisjZGVmaW5lIEFWQ09ERUNfVU5BUllfSAorCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworLyoqCisgKiBHZXQgdW5hcnkgY29kZSBvZiBsaW1pdGVkIGxlbmd0aAorICogQHBhcmFtIGdiIEdldEJpdENvbnRleHQKKyAqIEBwYXJhbVtpbl0gc3RvcCBUaGUgYml0c3RvcCB2YWx1ZSAodW5hcnkgY29kZSBvZiAxJ3Mgb3IgMCdzKQorICogQHBhcmFtW2luXSBsZW4gTWF4aW11bSBsZW5ndGgKKyAqIEByZXR1cm4gVW5hcnkgbGVuZ3RoL2luZGV4CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF91bmFyeShHZXRCaXRDb250ZXh0ICpnYiwgaW50IHN0b3AsIGludCBsZW4pCit7CisgICAgaW50IGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBsZW4gJiYgZ2V0X2JpdHMxKGdiKSAhPSBzdG9wOyBpKyspOworICAgIHJldHVybiBpOworfQorCisvKioKKyAqIEdldCB1bmFyeSBjb2RlIHRlcm1pbmF0ZWQgYnkgYSAwIHdpdGggYSBtYXhpbXVtIGxlbmd0aCBvZiAzMworICogQHBhcmFtIGdiIEdldEJpdENvbnRleHQKKyAqIEByZXR1cm4gVW5hcnkgbGVuZ3RoL2luZGV4CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF91bmFyeV8wXzMzKEdldEJpdENvbnRleHQgKmdiKQoreworICAgIHJldHVybiBnZXRfdW5hcnkoZ2IsIDAsIDMzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3VuYXJ5XzBfOShHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICByZXR1cm4gZ2V0X3VuYXJ5KGdiLCAwLCA5KTsKK30KKworI2VuZGlmIC8qIEFWQ09ERUNfVU5BUllfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdXRpbHMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmZTYyYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3V0aWxzLmMKQEAgLTAsMCArMSwzNzgyIEBACisvKgorICogdXRpbHMgZm9yIGxpYmF2Y29kZWMKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHV0aWxzLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXRvbWljLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJtZV9jbXAuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJmcmFtZV90aHJlYWRfZW5jb2Rlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicmF3LmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorI2lmIENPTkZJR19JQ09OVgorIyBpbmNsdWRlIDxpY29udi5oPgorI2VuZGlmCisKKyNpZiBIQVZFX1BUSFJFQURTCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VsaWYgSEFWRV9XMzJUSFJFQURTCisjaW5jbHVkZSAiY29tcGF0L3czMnB0aHJlYWRzLmgiCisjZWxpZiBIQVZFX09TMlRIUkVBRFMKKyNpbmNsdWRlICJjb21wYXQvb3MydGhyZWFkcy5oIgorI2VuZGlmCisKKyNpZiBIQVZFX1BUSFJFQURTIHx8IEhBVkVfVzMyVEhSRUFEUyB8fCBIQVZFX09TMlRIUkVBRFMKK3N0YXRpYyBpbnQgZGVmYXVsdF9sb2NrbWdyX2NiKHZvaWQgKiphcmcsIGVudW0gQVZMb2NrT3Agb3ApCit7CisgICAgdm9pZCAqIHZvbGF0aWxlICogbXV0ZXggPSBhcmc7CisgICAgaW50IGVycjsKKworICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIEFWX0xPQ0tfQ1JFQVRFOgorICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEFWX0xPQ0tfT0JUQUlOOgorICAgICAgICBpZiAoISptdXRleCkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF90ICp0bXAgPSBhdl9tYWxsb2Moc2l6ZW9mKHB0aHJlYWRfbXV0ZXhfdCkpOworICAgICAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGlmICgoZXJyID0gcHRocmVhZF9tdXRleF9pbml0KHRtcCwgTlVMTCkpKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZSh0bXApOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZwcml2X2F0b21pY19wdHJfY2FzKG11dGV4LCBOVUxMLCB0bXApKSB7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KHRtcCk7CisgICAgICAgICAgICAgICAgYXZfZnJlZSh0bXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChlcnIgPSBwdGhyZWFkX211dGV4X2xvY2soKm11dGV4KSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihlcnIpOworCisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgQVZfTE9DS19SRUxFQVNFOgorICAgICAgICBpZiAoKGVyciA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCptdXRleCkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoZXJyKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEFWX0xPQ0tfREVTVFJPWToKKyAgICAgICAgaWYgKCptdXRleCkKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgqbXV0ZXgpOworICAgICAgICBhdl9mcmVlKCptdXRleCk7CisgICAgICAgIGF2cHJpdl9hdG9taWNfcHRyX2NhcyhtdXRleCwgKm11dGV4LCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorc3RhdGljIGludCAoKmxvY2ttZ3JfY2IpKHZvaWQgKiptdXRleCwgZW51bSBBVkxvY2tPcCBvcCkgPSBkZWZhdWx0X2xvY2ttZ3JfY2I7CisjZWxzZQorc3RhdGljIGludCAoKmxvY2ttZ3JfY2IpKHZvaWQgKiptdXRleCwgZW51bSBBVkxvY2tPcCBvcCkgPSBOVUxMOworI2VuZGlmCisKKwordm9sYXRpbGUgaW50IGZmX2F2Y29kZWNfbG9ja2VkOworc3RhdGljIGludCB2b2xhdGlsZSBlbnRhbmdsZWRfdGhyZWFkX2NvdW50ZXIgPSAwOworc3RhdGljIHZvaWQgKmNvZGVjX211dGV4Oworc3RhdGljIHZvaWQgKmF2Zm9ybWF0X211dGV4OworCitzdGF0aWMgaW5saW5lIGludCBmZl9mYXN0X21hbGxvYyh2b2lkICpwdHIsIHVuc2lnbmVkIGludCAqc2l6ZSwgc2l6ZV90IG1pbl9zaXplLCBpbnQgemVyb19yZWFsbG9jKQoreworICAgIHZvaWQgKipwID0gcHRyOworICAgIGlmIChtaW5fc2l6ZSA8PSAqc2l6ZSAmJiAqcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbWluX3NpemUgPSBGRk1BWCgxNyAqIG1pbl9zaXplIC8gMTYgKyAzMiwgbWluX3NpemUpOworICAgIGF2X2ZyZWUoKnApOworICAgICpwID0gemVyb19yZWFsbG9jID8gYXZfbWFsbG9jeihtaW5fc2l6ZSkgOiBhdl9tYWxsb2MobWluX3NpemUpOworICAgIGlmICghKnApCisgICAgICAgIG1pbl9zaXplID0gMDsKKyAgICAqc2l6ZSA9IG1pbl9zaXplOworICAgIHJldHVybiAxOworfQorCit2b2lkIGF2X2Zhc3RfcGFkZGVkX21hbGxvYyh2b2lkICpwdHIsIHVuc2lnbmVkIGludCAqc2l6ZSwgc2l6ZV90IG1pbl9zaXplKQoreworICAgIHVpbnQ4X3QgKipwID0gcHRyOworICAgIGlmIChtaW5fc2l6ZSA+IFNJWkVfTUFYIC0gRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkgeworICAgICAgICBhdl9mcmVlcChwKTsKKyAgICAgICAgKnNpemUgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghZmZfZmFzdF9tYWxsb2MocCwgc2l6ZSwgbWluX3NpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFLCAxKSkKKyAgICAgICAgbWVtc2V0KCpwICsgbWluX3NpemUsIDAsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworfQorCit2b2lkIGF2X2Zhc3RfcGFkZGVkX21hbGxvY3oodm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgKnNpemUsIHNpemVfdCBtaW5fc2l6ZSkKK3sKKyAgICB1aW50OF90ICoqcCA9IHB0cjsKKyAgICBpZiAobWluX3NpemUgPiBTSVpFX01BWCAtIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpIHsKKyAgICAgICAgYXZfZnJlZXAocCk7CisgICAgICAgICpzaXplID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWZmX2Zhc3RfbWFsbG9jKHAsIHNpemUsIG1pbl9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSwgMSkpCisgICAgICAgIG1lbXNldCgqcCwgMCwgbWluX3NpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKK30KKworLyogZW5jb2RlciBtYW5hZ2VtZW50ICovCitzdGF0aWMgQVZDb2RlYyAqZmlyc3RfYXZjb2RlYyA9IE5VTEw7CitzdGF0aWMgQVZDb2RlYyAqKmxhc3RfYXZjb2RlYyA9ICZmaXJzdF9hdmNvZGVjOworCitBVkNvZGVjICphdl9jb2RlY19uZXh0KGNvbnN0IEFWQ29kZWMgKmMpCit7CisgICAgaWYgKGMpCisgICAgICAgIHJldHVybiBjLT5uZXh0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZpcnN0X2F2Y29kZWM7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgYXZjb2RlY19pbml0KHZvaWQpCit7CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisKKyAgICBpZiAoaW5pdGlhbGl6ZWQgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIGluaXRpYWxpemVkID0gMTsKKworICAgIGlmIChDT05GSUdfTUVfQ01QKQorICAgICAgICBmZl9tZV9jbXBfaW5pdF9zdGF0aWMoKTsKK30KKworaW50IGF2X2NvZGVjX2lzX2VuY29kZXIoY29uc3QgQVZDb2RlYyAqY29kZWMpCit7CisgICAgcmV0dXJuIGNvZGVjICYmIChjb2RlYy0+ZW5jb2RlX3N1YiB8fCBjb2RlYy0+ZW5jb2RlMik7Cit9CisKK2ludCBhdl9jb2RlY19pc19kZWNvZGVyKGNvbnN0IEFWQ29kZWMgKmNvZGVjKQoreworICAgIHJldHVybiBjb2RlYyAmJiBjb2RlYy0+ZGVjb2RlOworfQorCithdl9jb2xkIHZvaWQgYXZjb2RlY19yZWdpc3RlcihBVkNvZGVjICpjb2RlYykKK3sKKyAgICBBVkNvZGVjICoqcDsKKyAgICBhdmNvZGVjX2luaXQoKTsKKyAgICBwID0gbGFzdF9hdmNvZGVjOworICAgIGNvZGVjLT5uZXh0ID0gTlVMTDsKKworICAgIHdoaWxlKCpwIHx8IGF2cHJpdl9hdG9taWNfcHRyX2Nhcygodm9pZCAqIHZvbGF0aWxlICopcCwgTlVMTCwgY29kZWMpKQorICAgICAgICBwID0gJigqcCktPm5leHQ7CisgICAgbGFzdF9hdmNvZGVjID0gJmNvZGVjLT5uZXh0OworCisgICAgaWYgKGNvZGVjLT5pbml0X3N0YXRpY19kYXRhKQorICAgICAgICBjb2RlYy0+aW5pdF9zdGF0aWNfZGF0YShjb2RlYyk7Cit9CisKKyNpZiBGRl9BUElfRU1VX0VER0UKK3Vuc2lnbmVkIGF2Y29kZWNfZ2V0X2VkZ2Vfd2lkdGgodm9pZCkKK3sKKyAgICByZXR1cm4gRURHRV9XSURUSDsKK30KKyNlbmRpZgorCisjaWYgRkZfQVBJX1NFVF9ESU1FTlNJT05TCit2b2lkIGF2Y29kZWNfc2V0X2RpbWVuc2lvbnMoQVZDb2RlY0NvbnRleHQgKnMsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMocywgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiRmFpbGVkIHRvIHNldCBkaW1lbnNpb25zICVkICVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9Cit9CisjZW5kaWYKKworaW50IGZmX3NldF9kaW1lbnNpb25zKEFWQ29kZWNDb250ZXh0ICpzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUod2lkdGgsIGhlaWdodCwgMCwgcyk7CisKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgd2lkdGggPSBoZWlnaHQgPSAwOworCisgICAgcy0+Y29kZWRfd2lkdGggID0gd2lkdGg7CisgICAgcy0+Y29kZWRfaGVpZ2h0ID0gaGVpZ2h0OworICAgIHMtPndpZHRoICAgICAgICA9IEZGX0NFSUxfUlNISUZUKHdpZHRoLCAgcy0+bG93cmVzKTsKKyAgICBzLT5oZWlnaHQgICAgICAgPSBGRl9DRUlMX1JTSElGVChoZWlnaHQsIHMtPmxvd3Jlcyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfc2V0X3NhcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUmF0aW9uYWwgc2FyKQoreworICAgIGludCByZXQgPSBhdl9pbWFnZV9jaGVja19zYXIoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBzYXIpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImlnbm9yaW5nIGludmFsaWQgU0FSOiAldS8ldVxuIiwKKyAgICAgICAgICAgICAgIHNhci5udW0sIHNhci5kZW4pOworICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsgMCwgMSB9OworICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gc2FyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3NpZGVfZGF0YV91cGRhdGVfbWF0cml4X2VuY29kaW5nKEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZNYXRyaXhFbmNvZGluZyBtYXRyaXhfZW5jb2RpbmcpCit7CisgICAgQVZGcmFtZVNpZGVEYXRhICpzaWRlX2RhdGE7CisgICAgZW51bSBBVk1hdHJpeEVuY29kaW5nICpkYXRhOworCisgICAgc2lkZV9kYXRhID0gYXZfZnJhbWVfZ2V0X3NpZGVfZGF0YShmcmFtZSwgQVZfRlJBTUVfREFUQV9NQVRSSVhFTkNPRElORyk7CisgICAgaWYgKCFzaWRlX2RhdGEpCisgICAgICAgIHNpZGVfZGF0YSA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEoZnJhbWUsIEFWX0ZSQU1FX0RBVEFfTUFUUklYRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVudW0gQVZNYXRyaXhFbmNvZGluZykpOworCisgICAgaWYgKCFzaWRlX2RhdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBkYXRhICA9IChlbnVtIEFWTWF0cml4RW5jb2RpbmcqKXNpZGVfZGF0YS0+ZGF0YTsKKyAgICAqZGF0YSA9IG1hdHJpeF9lbmNvZGluZzsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGF2Y29kZWNfYWxpZ25fZGltZW5zaW9uczIoQVZDb2RlY0NvbnRleHQgKnMsIGludCAqd2lkdGgsIGludCAqaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZV9hbGlnbltBVl9OVU1fREFUQV9QT0lOVEVSU10pCit7CisgICAgaW50IGk7CisgICAgaW50IHdfYWxpZ24gPSAxOworICAgIGludCBoX2FsaWduID0gMTsKKyAgICBBVlBpeEZtdERlc2NyaXB0b3IgY29uc3QgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHMtPnBpeF9mbXQpOworCisgICAgaWYgKGRlc2MpIHsKKyAgICAgICAgd19hbGlnbiA9IDEgPDwgZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICAgICAgaF9hbGlnbiA9IDEgPDwgZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHMtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVZVjQyMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVZZVTQyMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfVVlWWTQyMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTZCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDIyUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQ0MFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0NDRQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTJCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE0TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTZMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE2QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTZMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFAxNkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTJCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDE0TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTZMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDE2QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTZMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxNkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTJCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE0TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTZMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE2QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTZMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTJCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE0TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTZMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE2QkU6CisgICAgICAgIHdfYWxpZ24gPSAxNjsgLy9GSVhNRSBhc3N1bWUgMTYgcGl4ZWwgcGVyIG1hY3JvYmxvY2sKKyAgICAgICAgaF9hbGlnbiA9IDE2ICogMjsgLy8gaW50ZXJsYWNlZCBuZWVkcyAyIG1hY3JvYmxvY2tzIGhlaWdodAorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDExUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQxMVA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1VZWVZZWTQxMToKKyAgICAgICAgd19hbGlnbiA9IDMyOworICAgICAgICBoX2FsaWduID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQxMFA6CisgICAgICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TVlExKSB7CisgICAgICAgICAgICB3X2FsaWduID0gNjQ7CisgICAgICAgICAgICBoX2FsaWduID0gNjQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU1NToKKyAgICAgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JQWkEpIHsKKyAgICAgICAgICAgIHdfYWxpZ24gPSA0OworICAgICAgICAgICAgaF9hbGlnbiA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1BBTDg6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjg6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjg6CisgICAgICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TTUMgfHwKKyAgICAgICAgICAgIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0NJTkVQQUspIHsKKyAgICAgICAgICAgIHdfYWxpZ24gPSA0OworICAgICAgICAgICAgaF9hbGlnbiA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0pWKSB7CisgICAgICAgICAgICB3X2FsaWduID0gODsKKyAgICAgICAgICAgIGhfYWxpZ24gPSA4OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IyNDoKKyAgICAgICAgaWYgKChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NU1pIKSB8fAorICAgICAgICAgICAgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1pMSUIpKSB7CisgICAgICAgICAgICB3X2FsaWduID0gNDsKKyAgICAgICAgICAgIGhfYWxpZ24gPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0NJTkVQQUspIHsKKyAgICAgICAgICAgIHdfYWxpZ24gPSA0OworICAgICAgICAgICAgaF9hbGlnbiA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0lGRl9JTEJNIHx8IHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0lGRl9CWVRFUlVOMSkgeworICAgICAgICB3X2FsaWduID0gRkZNQVgod19hbGlnbiwgOCk7CisgICAgfQorCisgICAgKndpZHRoICA9IEZGQUxJR04oKndpZHRoLCB3X2FsaWduKTsKKyAgICAqaGVpZ2h0ID0gRkZBTElHTigqaGVpZ2h0LCBoX2FsaWduKTsKKyAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fCBzLT5sb3dyZXMpCisgICAgICAgIC8vIHNvbWUgb2YgdGhlIG9wdGltaXplZCBjaHJvbWEgTUMgcmVhZHMgb25lIGxpbmUgdG9vIG11Y2gKKyAgICAgICAgLy8gd2hpY2ggaXMgYWxzbyBkb25lIGluIG1wZWcgZGVjb2RlcnMgd2l0aCBsb3dyZXMgPiAwCisgICAgICAgICpoZWlnaHQgKz0gMjsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGxpbmVzaXplX2FsaWduW2ldID0gU1RSSURFX0FMSUdOOworfQorCit2b2lkIGF2Y29kZWNfYWxpZ25fZGltZW5zaW9ucyhBVkNvZGVjQ29udGV4dCAqcywgaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzLT5waXhfZm10KTsKKyAgICBpbnQgY2hyb21hX3NoaWZ0ID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBpbnQgbGluZXNpemVfYWxpZ25bQVZfTlVNX0RBVEFfUE9JTlRFUlNdOworICAgIGludCBhbGlnbjsKKworICAgIGF2Y29kZWNfYWxpZ25fZGltZW5zaW9uczIocywgd2lkdGgsIGhlaWdodCwgbGluZXNpemVfYWxpZ24pOworICAgIGFsaWduICAgICAgICAgICAgICAgPSBGRk1BWChsaW5lc2l6ZV9hbGlnblswXSwgbGluZXNpemVfYWxpZ25bM10pOworICAgIGxpbmVzaXplX2FsaWduWzFdIDw8PSBjaHJvbWFfc2hpZnQ7CisgICAgbGluZXNpemVfYWxpZ25bMl0gPDw9IGNocm9tYV9zaGlmdDsKKyAgICBhbGlnbiAgICAgICAgICAgICAgID0gRkZNQVgzKGFsaWduLCBsaW5lc2l6ZV9hbGlnblsxXSwgbGluZXNpemVfYWxpZ25bMl0pOworICAgICp3aWR0aCAgICAgICAgICAgICAgPSBGRkFMSUdOKCp3aWR0aCwgYWxpZ24pOworfQorCitpbnQgYXZjb2RlY19lbnVtX3RvX2Nocm9tYV9wb3MoaW50ICp4cG9zLCBpbnQgKnlwb3MsIGVudW0gQVZDaHJvbWFMb2NhdGlvbiBwb3MpCit7CisgICAgaWYgKHBvcyA8PSBBVkNIUk9NQV9MT0NfVU5TUEVDSUZJRUQgfHwgcG9zID49IEFWQ0hST01BX0xPQ19OQikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBwb3MtLTsKKworICAgICp4cG9zID0gKHBvcyYxKSAqIDEyODsKKyAgICAqeXBvcyA9ICgocG9zPj4xKV4ocG9zPDQpKSAqIDEyODsKKworICAgIHJldHVybiAwOworfQorCitlbnVtIEFWQ2hyb21hTG9jYXRpb24gYXZjb2RlY19jaHJvbWFfcG9zX3RvX2VudW0oaW50IHhwb3MsIGludCB5cG9zKQoreworICAgIGludCBwb3MsIHhvdXQsIHlvdXQ7CisKKyAgICBmb3IgKHBvcyA9IEFWQ0hST01BX0xPQ19VTlNQRUNJRklFRCArIDE7IHBvcyA8IEFWQ0hST01BX0xPQ19OQjsgcG9zKyspIHsKKyAgICAgICAgaWYgKGF2Y29kZWNfZW51bV90b19jaHJvbWFfcG9zKCZ4b3V0LCAmeW91dCwgcG9zKSA9PSAwICYmIHhvdXQgPT0geHBvcyAmJiB5b3V0ID09IHlwb3MpCisgICAgICAgICAgICByZXR1cm4gcG9zOworICAgIH0KKyAgICByZXR1cm4gQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEOworfQorCitpbnQgYXZjb2RlY19maWxsX2F1ZGlvX2ZyYW1lKEFWRnJhbWUgKmZyYW1lLCBpbnQgbmJfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUsIGludCBhbGlnbikKK3sKKyAgICBpbnQgY2gsIHBsYW5hciwgbmVlZGVkX3NpemUsIHJldCA9IDA7CisKKyAgICBuZWVkZWRfc2l6ZSA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKE5VTEwsIG5iX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMsIHNhbXBsZV9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbik7CisgICAgaWYgKGJ1Zl9zaXplIDwgbmVlZGVkX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBwbGFuYXIgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihzYW1wbGVfZm10KTsKKyAgICBpZiAocGxhbmFyICYmIG5iX2NoYW5uZWxzID4gQVZfTlVNX0RBVEFfUE9JTlRFUlMpIHsKKyAgICAgICAgaWYgKCEoZnJhbWUtPmV4dGVuZGVkX2RhdGEgPSBhdl9tYWxsb2N6X2FycmF5KG5iX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpmcmFtZS0+ZXh0ZW5kZWRfZGF0YSkpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2RhdGEgPSBmcmFtZS0+ZGF0YTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2X3NhbXBsZXNfZmlsbF9hcnJheXMoZnJhbWUtPmV4dGVuZGVkX2RhdGEsICZmcmFtZS0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopKGludHB0cl90KWJ1ZiwgbmJfY2hhbm5lbHMsIGZyYW1lLT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfZm10LCBhbGlnbikpIDwgMCkgeworICAgICAgICBpZiAoZnJhbWUtPmV4dGVuZGVkX2RhdGEgIT0gZnJhbWUtPmRhdGEpCisgICAgICAgICAgICBhdl9mcmVlcCgmZnJhbWUtPmV4dGVuZGVkX2RhdGEpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoZnJhbWUtPmV4dGVuZGVkX2RhdGEgIT0gZnJhbWUtPmRhdGEpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgQVZfTlVNX0RBVEFfUE9JTlRFUlM7IGNoKyspCisgICAgICAgICAgICBmcmFtZS0+ZGF0YVtjaF0gPSBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaF07CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1cGRhdGVfZnJhbWVfcG9vbChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEZyYW1lUG9vbCAqcG9vbCA9IGF2Y3R4LT5pbnRlcm5hbC0+cG9vbDsKKyAgICBpbnQgaSwgcmV0OworCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfdHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOiB7CisgICAgICAgIEFWUGljdHVyZSBwaWN0dXJlOworICAgICAgICBpbnQgc2l6ZVs0XSA9IHsgMCB9OworICAgICAgICBpbnQgdyA9IGZyYW1lLT53aWR0aDsKKyAgICAgICAgaW50IGggPSBmcmFtZS0+aGVpZ2h0OworICAgICAgICBpbnQgdG1wc2l6ZSwgdW5hbGlnbmVkOworCisgICAgICAgIGlmIChwb29sLT5mb3JtYXQgPT0gZnJhbWUtPmZvcm1hdCAmJgorICAgICAgICAgICAgcG9vbC0+d2lkdGggPT0gZnJhbWUtPndpZHRoICYmIHBvb2wtPmhlaWdodCA9PSBmcmFtZS0+aGVpZ2h0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgYXZjb2RlY19hbGlnbl9kaW1lbnNpb25zMihhdmN0eCwgJncsICZoLCBwb29sLT5zdHJpZGVfYWxpZ24pOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIE5PVEU6IGRvIG5vdCBhbGlnbiBsaW5lc2l6ZXMgaW5kaXZpZHVhbGx5LCB0aGlzIGJyZWFrcyBlLmcuIGFzc3VtcHRpb25zCisgICAgICAgICAgICAvLyB0aGF0IGxpbmVzaXplWzBdID09IDIqbGluZXNpemVbMV0gaW4gdGhlIE1QRUctZW5jb2RlciBmb3IgNDoyOjIKKyAgICAgICAgICAgIGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKHBpY3R1cmUubGluZXNpemUsIGF2Y3R4LT5waXhfZm10LCB3KTsKKyAgICAgICAgICAgIC8vIGluY3JlYXNlIGFsaWdubWVudCBvZiB3IGZvciBuZXh0IHRyeSAocmhzIGdpdmVzIHRoZSBsb3dlc3QgYml0IHNldCBpbiB3KQorICAgICAgICAgICAgdyArPSB3ICYgfih3IC0gMSk7CisKKyAgICAgICAgICAgIHVuYWxpZ25lZCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIHVuYWxpZ25lZCB8PSBwaWN0dXJlLmxpbmVzaXplW2ldICUgcG9vbC0+c3RyaWRlX2FsaWduW2ldOworICAgICAgICB9IHdoaWxlICh1bmFsaWduZWQpOworCisgICAgICAgIHRtcHNpemUgPSBhdl9pbWFnZV9maWxsX3BvaW50ZXJzKHBpY3R1cmUuZGF0YSwgYXZjdHgtPnBpeF9mbXQsIGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHBpY3R1cmUubGluZXNpemUpOworICAgICAgICBpZiAodG1wc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgJiYgcGljdHVyZS5kYXRhW2kgKyAxXTsgaSsrKQorICAgICAgICAgICAgc2l6ZVtpXSA9IHBpY3R1cmUuZGF0YVtpICsgMV0gLSBwaWN0dXJlLmRhdGFbaV07CisgICAgICAgIHNpemVbaV0gPSB0bXBzaXplIC0gKHBpY3R1cmUuZGF0YVtpXSAtIHBpY3R1cmUuZGF0YVswXSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZwb29sLT5wb29sc1tpXSk7CisgICAgICAgICAgICBwb29sLT5saW5lc2l6ZVtpXSA9IHBpY3R1cmUubGluZXNpemVbaV07CisgICAgICAgICAgICBpZiAoc2l6ZVtpXSkgeworICAgICAgICAgICAgICAgIHBvb2wtPnBvb2xzW2ldID0gYXZfYnVmZmVyX3Bvb2xfaW5pdChzaXplW2ldICsgMTYgKyBTVFJJREVfQUxJR04gLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfTUVNT1JZX1BPSVNPTklORyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9idWZmZXJfYWxsb2N6KTsKKyAgICAgICAgICAgICAgICBpZiAoIXBvb2wtPnBvb2xzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwb29sLT5mb3JtYXQgPSBmcmFtZS0+Zm9ybWF0OworICAgICAgICBwb29sLT53aWR0aCAgPSBmcmFtZS0+d2lkdGg7CisgICAgICAgIHBvb2wtPmhlaWdodCA9IGZyYW1lLT5oZWlnaHQ7CisKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzogeworICAgICAgICBpbnQgY2ggICAgID0gYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGZyYW1lKTsgLy9hdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoZnJhbWUtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgaW50IHBsYW5hciA9IGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGZyYW1lLT5mb3JtYXQpOworICAgICAgICBpbnQgcGxhbmVzID0gcGxhbmFyID8gY2ggOiAxOworCisgICAgICAgIGlmIChwb29sLT5mb3JtYXQgPT0gZnJhbWUtPmZvcm1hdCAmJiBwb29sLT5wbGFuZXMgPT0gcGxhbmVzICYmCisgICAgICAgICAgICBwb29sLT5jaGFubmVscyA9PSBjaCAmJiBmcmFtZS0+bmJfc2FtcGxlcyA9PSBwb29sLT5zYW1wbGVzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZwb29sLT5wb29sc1swXSk7CisgICAgICAgIHJldCA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKCZwb29sLT5saW5lc2l6ZVswXSwgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzLCBmcmFtZS0+Zm9ybWF0LCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgcG9vbC0+cG9vbHNbMF0gPSBhdl9idWZmZXJfcG9vbF9pbml0KHBvb2wtPmxpbmVzaXplWzBdLCBOVUxMKTsKKyAgICAgICAgaWYgKCFwb29sLT5wb29sc1swXSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgcG9vbC0+Zm9ybWF0ICAgICA9IGZyYW1lLT5mb3JtYXQ7CisgICAgICAgIHBvb2wtPnBsYW5lcyAgICAgPSBwbGFuZXM7CisgICAgICAgIHBvb2wtPmNoYW5uZWxzICAgPSBjaDsKKyAgICAgICAgcG9vbC0+c2FtcGxlcyA9IGZyYW1lLT5uYl9zYW1wbGVzOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6IGF2X2Fzc2VydDAoMCk7CisgICAgfQorICAgIHJldHVybiAwOworZmFpbDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBhdl9idWZmZXJfcG9vbF91bmluaXQoJnBvb2wtPnBvb2xzW2ldKTsKKyAgICBwb29sLT5mb3JtYXQgPSAtMTsKKyAgICBwb29sLT5wbGFuZXMgPSBwb29sLT5jaGFubmVscyA9IHBvb2wtPnNhbXBsZXMgPSAwOworICAgIHBvb2wtPndpZHRoICA9IHBvb2wtPmhlaWdodCA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdWRpb19nZXRfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgRnJhbWVQb29sICpwb29sID0gYXZjdHgtPmludGVybmFsLT5wb29sOworICAgIGludCBwbGFuZXMgPSBwb29sLT5wbGFuZXM7CisgICAgaW50IGk7CisKKyAgICBmcmFtZS0+bGluZXNpemVbMF0gPSBwb29sLT5saW5lc2l6ZVswXTsKKworICAgIGlmIChwbGFuZXMgPiBBVl9OVU1fREFUQV9QT0lOVEVSUykgeworICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSA9IGF2X21hbGxvY3pfYXJyYXkocGxhbmVzLCBzaXplb2YoKmZyYW1lLT5leHRlbmRlZF9kYXRhKSk7CisgICAgICAgIGZyYW1lLT5uYl9leHRlbmRlZF9idWYgPSBwbGFuZXMgLSBBVl9OVU1fREFUQV9QT0lOVEVSUzsKKyAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2J1ZiAgPSBhdl9tYWxsb2N6X2FycmF5KGZyYW1lLT5uYl9leHRlbmRlZF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmZyYW1lLT5leHRlbmRlZF9idWYpKTsKKyAgICAgICAgaWYgKCFmcmFtZS0+ZXh0ZW5kZWRfZGF0YSB8fCAhZnJhbWUtPmV4dGVuZGVkX2J1ZikgeworICAgICAgICAgICAgYXZfZnJlZXAoJmZyYW1lLT5leHRlbmRlZF9kYXRhKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZmcmFtZS0+ZXh0ZW5kZWRfYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSA9IGZyYW1lLT5kYXRhOworICAgICAgICBhdl9hc3NlcnQwKGZyYW1lLT5uYl9leHRlbmRlZF9idWYgPT0gMCk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEZGTUlOKHBsYW5lcywgQVZfTlVNX0RBVEFfUE9JTlRFUlMpOyBpKyspIHsKKyAgICAgICAgZnJhbWUtPmJ1ZltpXSA9IGF2X2J1ZmZlcl9wb29sX2dldChwb29sLT5wb29sc1swXSk7CisgICAgICAgIGlmICghZnJhbWUtPmJ1ZltpXSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2RhdGFbaV0gPSBmcmFtZS0+ZGF0YVtpXSA9IGZyYW1lLT5idWZbaV0tPmRhdGE7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+bmJfZXh0ZW5kZWRfYnVmOyBpKyspIHsKKyAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2J1ZltpXSA9IGF2X2J1ZmZlcl9wb29sX2dldChwb29sLT5wb29sc1swXSk7CisgICAgICAgIGlmICghZnJhbWUtPmV4dGVuZGVkX2J1ZltpXSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2RhdGFbaSArIEFWX05VTV9EQVRBX1BPSU5URVJTXSA9IGZyYW1lLT5leHRlbmRlZF9idWZbaV0tPmRhdGE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX0JVRkZFUlMpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZGVmYXVsdF9nZXRfYnVmZmVyIGNhbGxlZCBvbiBmcmFtZSAlcCIsIGZyYW1lKTsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworc3RhdGljIGludCB2aWRlb19nZXRfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICpwaWMpCit7CisgICAgRnJhbWVQb29sICpwb29sID0gcy0+aW50ZXJuYWwtPnBvb2w7CisgICAgaW50IGk7CisKKyAgICBpZiAocGljLT5kYXRhWzBdKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJwaWMtPmRhdGFbMF0hPU5VTEwgaW4gYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbWVtc2V0KHBpYy0+ZGF0YSwgMCwgc2l6ZW9mKHBpYy0+ZGF0YSkpOworICAgIHBpYy0+ZXh0ZW5kZWRfZGF0YSA9IHBpYy0+ZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHBvb2wtPnBvb2xzW2ldOyBpKyspIHsKKyAgICAgICAgcGljLT5saW5lc2l6ZVtpXSA9IHBvb2wtPmxpbmVzaXplW2ldOworCisgICAgICAgIHBpYy0+YnVmW2ldID0gYXZfYnVmZmVyX3Bvb2xfZ2V0KHBvb2wtPnBvb2xzW2ldKTsKKyAgICAgICAgaWYgKCFwaWMtPmJ1ZltpXSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBwaWMtPmRhdGFbaV0gPSBwaWMtPmJ1ZltpXS0+ZGF0YTsKKyAgICB9CisgICAgZm9yICg7IGkgPCBBVl9OVU1fREFUQV9QT0lOVEVSUzsgaSsrKSB7CisgICAgICAgIHBpYy0+ZGF0YVtpXSA9IE5VTEw7CisgICAgICAgIHBpYy0+bGluZXNpemVbaV0gPSAwOworICAgIH0KKyAgICBpZiAocGljLT5kYXRhWzFdICYmICFwaWMtPmRhdGFbMl0pCisgICAgICAgIGF2cHJpdl9zZXRfc3lzdGVtYXRpY19wYWwyKCh1aW50MzJfdCAqKXBpYy0+ZGF0YVsxXSwgcy0+cGl4X2ZtdCk7CisKKyAgICBpZiAocy0+ZGVidWcgJiBGRl9ERUJVR19CVUZGRVJTKQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiZGVmYXVsdF9nZXRfYnVmZmVyIGNhbGxlZCBvbiBwaWMgJXBcbiIsIHBpYyk7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfZnJhbWVfdW5yZWYocGljKTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCit2b2lkIGF2cHJpdl9jb2xvcl9mcmFtZShBVkZyYW1lICpmcmFtZSwgY29uc3QgaW50IGNbNF0pCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChmcmFtZS0+Zm9ybWF0KTsKKyAgICBpbnQgcCwgeSwgeDsKKworICAgIGF2X2Fzc2VydDAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSKTsKKworICAgIGZvciAocCA9IDA7IHA8ZGVzYy0+bmJfY29tcG9uZW50czsgcCsrKSB7CisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGZyYW1lLT5kYXRhW3BdOworICAgICAgICBpbnQgaXNfY2hyb21hID0gcCA9PSAxIHx8IHAgPT0gMjsKKyAgICAgICAgaW50IGJ5dGVzICA9IGlzX2Nocm9tYSA/IEZGX0NFSUxfUlNISUZUKGZyYW1lLT53aWR0aCwgIGRlc2MtPmxvZzJfY2hyb21hX3cpIDogZnJhbWUtPndpZHRoOworICAgICAgICBpbnQgaGVpZ2h0ID0gaXNfY2hyb21hID8gRkZfQ0VJTF9SU0hJRlQoZnJhbWUtPmhlaWdodCwgZGVzYy0+bG9nMl9jaHJvbWFfaCkgOiBmcmFtZS0+aGVpZ2h0OworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGlmIChkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSA+PSA4KSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeDxieXRlczsgeCsrKQorICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90Kilkc3QpW3hdID0gY1twXTsKKyAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgbWVtc2V0KGRzdCwgY1twXSwgYnl0ZXMpOworICAgICAgICAgICAgZHN0ICs9IGZyYW1lLT5saW5lc2l6ZVtwXTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gdXBkYXRlX2ZyYW1lX3Bvb2woYXZjdHgsIGZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisjaWYgRkZfQVBJX0dFVF9CVUZGRVIKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBmcmFtZS0+dHlwZSA9IEZGX0JVRkZFUl9UWVBFX0lOVEVSTkFMOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX3R5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgcmV0dXJuIHZpZGVvX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lKTsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgcmV0dXJuIGF1ZGlvX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lKTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitpbnQgZmZfaW5pdF9idWZmZXJfaW5mbyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWUGFja2V0ICpwa3QgPSBhdmN0eC0+aW50ZXJuYWwtPnBrdDsKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSBwYWNrZXQ7CisgICAgICAgIGVudW0gQVZGcmFtZVNpZGVEYXRhVHlwZSBmcmFtZTsKKyAgICB9IHNkW10gPSB7CisgICAgICAgIHsgQVZfUEtUX0RBVEFfUkVQTEFZR0FJTiAsICAgQVZfRlJBTUVfREFUQV9SRVBMQVlHQUlOIH0sCisgICAgICAgIHsgQVZfUEtUX0RBVEFfRElTUExBWU1BVFJJWCwgQVZfRlJBTUVfREFUQV9ESVNQTEFZTUFUUklYIH0sCisgICAgICAgIHsgQVZfUEtUX0RBVEFfU1RFUkVPM0QsICAgICAgQVZfRlJBTUVfREFUQV9TVEVSRU8zRCB9LAorICAgIH07CisKKyAgICBpZiAocGt0KSB7CisgICAgICAgIGZyYW1lLT5wa3RfcHRzID0gcGt0LT5wdHM7CisgICAgICAgIGF2X2ZyYW1lX3NldF9wa3RfcG9zICAgICAoZnJhbWUsIHBrdC0+cG9zKTsKKyAgICAgICAgYXZfZnJhbWVfc2V0X3BrdF9kdXJhdGlvbihmcmFtZSwgcGt0LT5kdXJhdGlvbik7CisgICAgICAgIGF2X2ZyYW1lX3NldF9wa3Rfc2l6ZSAgICAoZnJhbWUsIHBrdC0+c2l6ZSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHNkKTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnBhY2tldF9zZCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwgc2RbaV0ucGFja2V0LCAmc2l6ZSk7CisgICAgICAgICAgICBpZiAocGFja2V0X3NkKSB7CisgICAgICAgICAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpmcmFtZV9zZCA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEoZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RbaV0uZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFmcmFtZV9zZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgICAgIG1lbWNweShmcmFtZV9zZC0+ZGF0YSwgcGFja2V0X3NkLCBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZyYW1lLT5wa3RfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIGF2X2ZyYW1lX3NldF9wa3RfcG9zICAgICAoZnJhbWUsIC0xKTsKKyAgICAgICAgYXZfZnJhbWVfc2V0X3BrdF9kdXJhdGlvbihmcmFtZSwgMCk7CisgICAgICAgIGF2X2ZyYW1lX3NldF9wa3Rfc2l6ZSAgICAoZnJhbWUsIC0xKTsKKyAgICB9CisgICAgZnJhbWUtPnJlb3JkZXJlZF9vcGFxdWUgPSBhdmN0eC0+cmVvcmRlcmVkX29wYXF1ZTsKKworICAgIGlmIChmcmFtZS0+Y29sb3JfcHJpbWFyaWVzID09IEFWQ09MX1BSSV9VTlNQRUNJRklFRCkKKyAgICAgICAgZnJhbWUtPmNvbG9yX3ByaW1hcmllcyA9IGF2Y3R4LT5jb2xvcl9wcmltYXJpZXM7CisgICAgaWYgKGZyYW1lLT5jb2xvcl90cmMgPT0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEKQorICAgICAgICBmcmFtZS0+Y29sb3JfdHJjID0gYXZjdHgtPmNvbG9yX3RyYzsKKyAgICBpZiAoYXZfZnJhbWVfZ2V0X2NvbG9yc3BhY2UoZnJhbWUpID09IEFWQ09MX1NQQ19VTlNQRUNJRklFRCkKKyAgICAgICAgYXZfZnJhbWVfc2V0X2NvbG9yc3BhY2UoZnJhbWUsIGF2Y3R4LT5jb2xvcnNwYWNlKTsKKyAgICBpZiAoYXZfZnJhbWVfZ2V0X2NvbG9yX3JhbmdlKGZyYW1lKSA9PSBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRCkKKyAgICAgICAgYXZfZnJhbWVfc2V0X2NvbG9yX3JhbmdlKGZyYW1lLCBhdmN0eC0+Y29sb3JfcmFuZ2UpOworICAgIGlmIChmcmFtZS0+Y2hyb21hX2xvY2F0aW9uID09IEFWQ0hST01BX0xPQ19VTlNQRUNJRklFRCkKKyAgICAgICAgZnJhbWUtPmNocm9tYV9sb2NhdGlvbiA9IGF2Y3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uOworCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWMtPnR5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgZnJhbWUtPmZvcm1hdCAgICAgICAgICAgICAgPSBhdmN0eC0+cGl4X2ZtdDsKKyAgICAgICAgaWYgKCFmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pCisgICAgICAgICAgICBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvOworCisgICAgICAgIGlmIChmcmFtZS0+d2lkdGggJiYgZnJhbWUtPmhlaWdodCAmJgorICAgICAgICAgICAgYXZfaW1hZ2VfY2hlY2tfc2FyKGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpbykgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiaWdub3JpbmcgaW52YWxpZCBTQVI6ICV1LyV1XG4iLAorICAgICAgICAgICAgICAgICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgICAgICBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICAgICAgZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7IDAsIDEgfTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBpZiAoIWZyYW1lLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgIGZyYW1lLT5zYW1wbGVfcmF0ZSAgICA9IGF2Y3R4LT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgaWYgKGZyYW1lLT5mb3JtYXQgPCAwKQorICAgICAgICAgICAgZnJhbWUtPmZvcm1hdCAgICAgICAgID0gYXZjdHgtPnNhbXBsZV9mbXQ7CisgICAgICAgIGlmICghZnJhbWUtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgICAgICAgICAgIGlmIChhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoYXZjdHgtPmNoYW5uZWxfbGF5b3V0KSAhPQorICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29uc2lzdGVudCBjaGFubmVsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlndXJhdGlvbi5cbiIpOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZnJhbWUtPmNoYW5uZWxfbGF5b3V0ID0gYXZjdHgtPmNoYW5uZWxfbGF5b3V0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID4gRkZfU0FORV9OQl9DSEFOTkVMUykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IGNoYW5uZWxzOiAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9zZXRfY2hhbm5lbHMoZnJhbWUsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmIEZGX0FQSV9HRVRfQlVGRkVSCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCitpbnQgYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICByZXR1cm4gYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXIyKGF2Y3R4LCBmcmFtZSwgMCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IENvbXBhdFJlbGVhc2VCdWZQcml2IHsKKyAgICBBVkNvZGVjQ29udGV4dCBhdmN0eDsKKyAgICBBVkZyYW1lIGZyYW1lOworICAgIHVpbnQ4X3QgYXZmcmFtZV9wYWRkaW5nWzEwMjRdOyAvLyBoYWNrIHRvIGFsbG93IGxpbmtpbmcgdG8gYSBhdnV0aWwgd2l0aCBsYXJnZXIgQVZGcmFtZQorfSBDb21wYXRSZWxlYXNlQnVmUHJpdjsKKworc3RhdGljIHZvaWQgY29tcGF0X2ZyZWVfYnVmZmVyKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBDb21wYXRSZWxlYXNlQnVmUHJpdiAqcHJpdiA9IG9wYXF1ZTsKKyAgICBpZiAocHJpdi0+YXZjdHgucmVsZWFzZV9idWZmZXIpCisgICAgICAgIHByaXYtPmF2Y3R4LnJlbGVhc2VfYnVmZmVyKCZwcml2LT5hdmN0eCwgJnByaXYtPmZyYW1lKTsKKyAgICBhdl9mcmVlcCgmcHJpdik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXBhdF9yZWxlYXNlX2J1ZmZlcih2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCit7CisgICAgQVZCdWZmZXJSZWYgKmJ1ZiA9IG9wYXF1ZTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJmJ1Zik7Cit9CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorCitpbnQgZmZfZGVjb2RlX2ZyYW1lX3Byb3BzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgcmV0dXJuIGZmX2luaXRfYnVmZmVyX2luZm8oYXZjdHgsIGZyYW1lKTsKK30KKworc3RhdGljIGludCBnZXRfYnVmZmVyX2ludGVybmFsKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncykKK3sKKyAgICBjb25zdCBBVkhXQWNjZWwgKmh3YWNjZWwgPSBhdmN0eC0+aHdhY2NlbDsKKyAgICBpbnQgb3ZlcnJpZGVfZGltZW5zaW9ucyA9IDE7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgMCwgYXZjdHgpKSA8IDAgfHwgYXZjdHgtPnBpeF9mbXQ8MCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ2aWRlb19nZXRfYnVmZmVyOiBpbWFnZSBwYXJhbWV0ZXJzIGludmFsaWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGlmIChmcmFtZS0+d2lkdGggPD0gMCB8fCBmcmFtZS0+aGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgIGZyYW1lLT53aWR0aCAgPSBGRk1BWChhdmN0eC0+d2lkdGgsICBGRl9DRUlMX1JTSElGVChhdmN0eC0+Y29kZWRfd2lkdGgsICBhdmN0eC0+bG93cmVzKSk7CisgICAgICAgICAgICBmcmFtZS0+aGVpZ2h0ID0gRkZNQVgoYXZjdHgtPmhlaWdodCwgRkZfQ0VJTF9SU0hJRlQoYXZjdHgtPmNvZGVkX2hlaWdodCwgYXZjdHgtPmxvd3JlcykpOworICAgICAgICAgICAgb3ZlcnJpZGVfZGltZW5zaW9ucyA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0ID0gZmZfZGVjb2RlX2ZyYW1lX3Byb3BzKGF2Y3R4LCBmcmFtZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBmZl9pbml0X2J1ZmZlcl9pbmZvKGF2Y3R4LCBmcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChod2FjY2VsICYmIGh3YWNjZWwtPmFsbG9jX2ZyYW1lKSB7CisgICAgICAgIHJldCA9IGh3YWNjZWwtPmFsbG9jX2ZyYW1lKGF2Y3R4LCBmcmFtZSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworI2lmIEZGX0FQSV9HRVRfQlVGRkVSCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgLyoKKyAgICAgKiBXcmFwIGFuIG9sZCBnZXRfYnVmZmVyKCktYWxsb2NhdGVkIGJ1ZmZlciBpbiBhIGJ1bmNoIG9mIEFWQnVmZmVycy4KKyAgICAgKiBXZSB3cmFwIGVhY2ggcGxhbmUgaW4gaXRzIG93biBBVkJ1ZmZlci4gRWFjaCBvZiB0aG9zZSBoYXMgYSByZWZlcmVuY2UgdG8KKyAgICAgKiBhIGR1bW15IEFWQnVmZmVyIGFzIGl0cyBwcml2YXRlIGRhdGEsIHVucmVmZmluZyBpdCBvbiBmcmVlLgorICAgICAqIFdoZW4gYWxsIHRoZSBwbGFuZXMgYXJlIGZyZWVkLCB0aGUgZHVtbXkgYnVmZmVyJ3MgZnJlZSBjYWxsYmFjayBjYWxscworICAgICAqIHJlbGVhc2VfYnVmZmVyKCkuCisgICAgICovCisgICAgaWYgKGF2Y3R4LT5nZXRfYnVmZmVyKSB7CisgICAgICAgIENvbXBhdFJlbGVhc2VCdWZQcml2ICpwcml2ID0gTlVMTDsKKyAgICAgICAgQVZCdWZmZXJSZWYgKmR1bW15X2J1ZiA9IE5VTEw7CisgICAgICAgIGludCBwbGFuZXMsIGksIHJldDsKKworICAgICAgICBpZiAoZmxhZ3MgJiBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKQorICAgICAgICAgICAgZnJhbWUtPnJlZmVyZW5jZSAgICA9IDE7CisKKyAgICAgICAgcmV0ID0gYXZjdHgtPmdldF9idWZmZXIoYXZjdHgsIGZyYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIC8qIHJldHVybiBpZiB0aGUgYnVmZmVycyBhcmUgYWxyZWFkeSBzZXQgdXAKKyAgICAgICAgICogdGhpcyB3b3VsZCBoYXBwZW4gZS5nLiB3aGVuIGEgY3VzdG9tIGdldF9idWZmZXIoKSBjYWxscworICAgICAgICAgKiBhdmNvZGVjX2RlZmF1bHRfZ2V0X2J1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGZyYW1lLT5idWZbMF0pCisgICAgICAgICAgICBnb3RvIGVuZDA7CisKKyAgICAgICAgcHJpdiA9IGF2X21hbGxvY3ooc2l6ZW9mKCpwcml2KSk7CisgICAgICAgIGlmICghcHJpdikgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHByaXYtPmF2Y3R4ID0gKmF2Y3R4OworICAgICAgICBwcml2LT5mcmFtZSA9ICpmcmFtZTsKKworICAgICAgICBkdW1teV9idWYgPSBhdl9idWZmZXJfY3JlYXRlKE5VTEwsIDAsIGNvbXBhdF9mcmVlX2J1ZmZlciwgcHJpdiwgMCk7CisgICAgICAgIGlmICghZHVtbXlfYnVmKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworI2RlZmluZSBXUkFQX1BMQU5FKHJlZl9vdXQsIGRhdGEsIGRhdGFfc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFWQnVmZmVyUmVmICpkdW1teV9yZWYgPSBhdl9idWZmZXJfcmVmKGR1bW15X2J1Zik7ICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghZHVtbXlfcmVmKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIGZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZl9vdXQgPSBhdl9idWZmZXJfY3JlYXRlKGRhdGEsIGRhdGFfc2l6ZSwgY29tcGF0X3JlbGVhc2VfYnVmZmVyLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bW15X3JlZiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghcmVmX291dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIGZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGZyYW1lLT5mb3JtYXQpOworCisgICAgICAgICAgICBwbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhmcmFtZS0+Zm9ybWF0KTsKKyAgICAgICAgICAgIC8qIHdvcmthcm91bmQgZm9yIEFWSFdBY2NlbCBwbGFuZSBjb3VudCBvZiAwLCBidWZbMF0gaXMgdXNlZCBhcworICAgICAgICAgICAgICAgY2hlY2sgZm9yIGFsbG9jYXRlZCBidWZmZXJzOiBtYWtlIGxpYmF2Y29kZWMgaGFwcHkgKi8KKyAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpCisgICAgICAgICAgICAgICAgcGxhbmVzID0gMTsKKyAgICAgICAgICAgIGlmICghZGVzYyB8fCBwbGFuZXMgPD0gMCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwbGFuZXM7IGkrKykgeworICAgICAgICAgICAgICAgIGludCB2X3NoaWZ0ICAgID0gKGkgPT0gMSB8fCBpID09IDIpID8gZGVzYy0+bG9nMl9jaHJvbWFfaCA6IDA7CisgICAgICAgICAgICAgICAgaW50IHBsYW5lX3NpemUgPSAoZnJhbWUtPmhlaWdodCA+PiB2X3NoaWZ0KSAqIGZyYW1lLT5saW5lc2l6ZVtpXTsKKworICAgICAgICAgICAgICAgIFdSQVBfUExBTkUoZnJhbWUtPmJ1ZltpXSwgZnJhbWUtPmRhdGFbaV0sIHBsYW5lX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHBsYW5hciA9IGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGZyYW1lLT5mb3JtYXQpOworICAgICAgICAgICAgcGxhbmVzID0gcGxhbmFyID8gYXZjdHgtPmNoYW5uZWxzIDogMTsKKworICAgICAgICAgICAgaWYgKHBsYW5lcyA+IEZGX0FSUkFZX0VMRU1TKGZyYW1lLT5idWYpKSB7CisgICAgICAgICAgICAgICAgZnJhbWUtPm5iX2V4dGVuZGVkX2J1ZiA9IHBsYW5lcyAtIEZGX0FSUkFZX0VMRU1TKGZyYW1lLT5idWYpOworICAgICAgICAgICAgICAgIGZyYW1lLT5leHRlbmRlZF9idWYgPSBhdl9tYWxsb2NfYXJyYXkoc2l6ZW9mKCpmcmFtZS0+ZXh0ZW5kZWRfYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9leHRlbmRlZF9idWYpOworICAgICAgICAgICAgICAgIGlmICghZnJhbWUtPmV4dGVuZGVkX2J1ZikgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRk1JTihwbGFuZXMsIEZGX0FSUkFZX0VMRU1TKGZyYW1lLT5idWYpKTsgaSsrKQorICAgICAgICAgICAgICAgIFdSQVBfUExBTkUoZnJhbWUtPmJ1ZltpXSwgZnJhbWUtPmV4dGVuZGVkX2RhdGFbaV0sIGZyYW1lLT5saW5lc2l6ZVswXSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+bmJfZXh0ZW5kZWRfYnVmOyBpKyspCisgICAgICAgICAgICAgICAgV1JBUF9QTEFORShmcmFtZS0+ZXh0ZW5kZWRfYnVmW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2RhdGFbaSArIEZGX0FSUkFZX0VMRU1TKGZyYW1lLT5idWYpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgICAgIH0KKworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmR1bW15X2J1Zik7CisKK2VuZDA6CisgICAgICAgIGZyYW1lLT53aWR0aCAgPSBhdmN0eC0+d2lkdGg7CisgICAgICAgIGZyYW1lLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgICAgIHJldHVybiAwOworCitmYWlsOgorICAgICAgICBhdmN0eC0+cmVsZWFzZV9idWZmZXIoYXZjdHgsIGZyYW1lKTsKKyAgICAgICAgYXZfZnJlZXAoJnByaXYpOworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmR1bW15X2J1Zik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKworICAgIHJldCA9IGF2Y3R4LT5nZXRfYnVmZmVyMihhdmN0eCwgZnJhbWUsIGZsYWdzKTsKKworZW5kOgorICAgIGlmIChhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgIW92ZXJyaWRlX2RpbWVuc2lvbnMpIHsKKyAgICAgICAgZnJhbWUtPndpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICAgICAgZnJhbWUtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX2dldF9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSwgaW50IGZsYWdzKQoreworICAgIGludCByZXQgPSBnZXRfYnVmZmVyX2ludGVybmFsKGF2Y3R4LCBmcmFtZSwgZmxhZ3MpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImdldF9idWZmZXIoKSBmYWlsZWRcbiIpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVnZXRfYnVmZmVyX2ludGVybmFsKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGcmFtZSAqdG1wOworICAgIGludCByZXQ7CisKKyAgICBhdl9hc3NlcnQwKGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyk7CisKKyAgICBpZiAoZnJhbWUtPmRhdGFbMF0gJiYgKGZyYW1lLT53aWR0aCAhPSBhdmN0eC0+d2lkdGggfHwgZnJhbWUtPmhlaWdodCAhPSBhdmN0eC0+aGVpZ2h0IHx8IGZyYW1lLT5mb3JtYXQgIT0gYXZjdHgtPnBpeF9mbXQpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJQaWN0dXJlIGNoYW5nZWQgZnJvbSBzaXplOiVkeCVkIGZtdDolcyB0byBzaXplOiVkeCVkIGZtdDolcyBpbiByZWdldCBidWZmZXIoKVxuIiwKKyAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwgYXZfZ2V0X3BpeF9mbXRfbmFtZShmcmFtZS0+Zm9ybWF0KSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBhdl9nZXRfcGl4X2ZtdF9uYW1lKGF2Y3R4LT5waXhfZm10KSk7CisgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKKyAgICB9CisKKyAgICBmZl9pbml0X2J1ZmZlcl9pbmZvKGF2Y3R4LCBmcmFtZSk7CisKKyAgICBpZiAoIWZyYW1lLT5kYXRhWzBdKQorICAgICAgICByZXR1cm4gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpOworCisgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGZyYW1lKSkKKyAgICAgICAgcmV0dXJuIGZmX2RlY29kZV9mcmFtZV9wcm9wcyhhdmN0eCwgZnJhbWUpOworCisgICAgdG1wID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2X2ZyYW1lX21vdmVfcmVmKHRtcCwgZnJhbWUpOworCisgICAgcmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnRtcCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXZfZnJhbWVfY29weShmcmFtZSwgdG1wKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZ0bXApOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9yZWdldF9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgcmV0ID0gcmVnZXRfYnVmZmVyX2ludGVybmFsKGF2Y3R4LCBmcmFtZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicmVnZXRfYnVmZmVyKCkgZmFpbGVkXG4iKTsKKyAgICByZXR1cm4gcmV0OworfQorCisjaWYgRkZfQVBJX0dFVF9CVUZGRVIKK3ZvaWQgYXZjb2RlY19kZWZhdWx0X3JlbGVhc2VfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICpwaWMpCit7CisgICAgYXZfYXNzZXJ0MChzLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyk7CisKKyAgICBhdl9mcmFtZV91bnJlZihwaWMpOworfQorCitpbnQgYXZjb2RlY19kZWZhdWx0X3JlZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqcGljKQoreworICAgIGF2X2Fzc2VydDAoMCk7CisgICAgcmV0dXJuIEFWRVJST1JfQlVHOworfQorI2VuZGlmCisKK2ludCBhdmNvZGVjX2RlZmF1bHRfZXhlY3V0ZShBVkNvZGVjQ29udGV4dCAqYywgaW50ICgqZnVuYykoQVZDb2RlY0NvbnRleHQgKmMyLCB2b2lkICphcmcyKSwgdm9pZCAqYXJnLCBpbnQgKnJldCwgaW50IGNvdW50LCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGludCByID0gZnVuYyhjLCAoY2hhciAqKWFyZyArIGkgKiBzaXplKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldFtpXSA9IHI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgYXZjb2RlY19kZWZhdWx0X2V4ZWN1dGUyKEFWQ29kZWNDb250ZXh0ICpjLCBpbnQgKCpmdW5jKShBVkNvZGVjQ29udGV4dCAqYzIsIHZvaWQgKmFyZzIsIGludCBqb2JuciwgaW50IHRocmVhZG5yKSwgdm9pZCAqYXJnLCBpbnQgKnJldCwgaW50IGNvdW50KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaW50IHIgPSBmdW5jKGMsIGFyZywgaSwgMCk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXRbaV0gPSByOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworZW51bSBBVlBpeGVsRm9ybWF0IGF2cHJpdl9maW5kX3BpeF9mbXQoY29uc3QgUGl4ZWxGb3JtYXRUYWcgKnRhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZm91cmNjKQoreworICAgIHdoaWxlICh0YWdzLT5waXhfZm10ID49IDApIHsKKyAgICAgICAgaWYgKHRhZ3MtPmZvdXJjYyA9PSBmb3VyY2MpCisgICAgICAgICAgICByZXR1cm4gdGFncy0+cGl4X2ZtdDsKKyAgICAgICAgdGFncysrOworICAgIH0KKyAgICByZXR1cm4gQVZfUElYX0ZNVF9OT05FOworfQorCitzdGF0aWMgaW50IGlzX2h3YWNjZWxfcGl4X2ZtdChlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIHJldHVybiBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMOworfQorCitlbnVtIEFWUGl4ZWxGb3JtYXQgYXZjb2RlY19kZWZhdWx0X2dldF9mb3JtYXQoc3RydWN0IEFWQ29kZWNDb250ZXh0ICpzLCBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKmZtdCkKK3sKKyAgICB3aGlsZSAoKmZtdCAhPSBBVl9QSVhfRk1UX05PTkUgJiYgaXNfaHdhY2NlbF9waXhfZm10KCpmbXQpKQorICAgICAgICArK2ZtdDsKKyAgICByZXR1cm4gZm10WzBdOworfQorCitzdGF0aWMgQVZIV0FjY2VsICpmaW5kX2h3YWNjZWwoZW51bSBBVkNvZGVjSUQgY29kZWNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgQVZIV0FjY2VsICpod2FjY2VsID0gTlVMTDsKKworICAgIHdoaWxlICgoaHdhY2NlbCA9IGF2X2h3YWNjZWxfbmV4dChod2FjY2VsKSkpCisgICAgICAgIGlmIChod2FjY2VsLT5pZCA9PSBjb2RlY19pZAorICAgICAgICAgICAgJiYgaHdhY2NlbC0+cGl4X2ZtdCA9PSBwaXhfZm10KQorICAgICAgICAgICAgcmV0dXJuIGh3YWNjZWw7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfaHdhY2NlbChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIEFWSFdBY2NlbCAqaHdhID0gZmluZF9od2FjY2VsKGF2Y3R4LT5jb2RlY19pZCwgZm10KTsKKyAgICBpbnQgcmV0ICAgICAgICA9IDA7CisKKyAgICBpZiAoIWh3YSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBhbiBBVkhXQWNjZWwgZm9yIHRoZSBwaXhlbCBmb3JtYXQ6ICVzIiwKKyAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9FTlQpOworICAgIH0KKworICAgIGlmIChod2EtPnByaXZfZGF0YV9zaXplKSB7CisgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGEgPSBhdl9tYWxsb2N6KGh3YS0+cHJpdl9kYXRhX3NpemUpOworICAgICAgICBpZiAoIWF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmIChod2EtPmluaXQpIHsKKyAgICAgICAgcmV0ID0gaHdhLT5pbml0KGF2Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdmN0eC0+aHdhY2NlbCA9IGh3YTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfZ2V0X2Zvcm1hdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqZm10KQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKmNob2ljZXM7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHJldDsKKyAgICB1bnNpZ25lZCBuID0gMDsKKworICAgIHdoaWxlIChmbXRbbl0gIT0gQVZfUElYX0ZNVF9OT05FKQorICAgICAgICArK247CisKKyAgICBjaG9pY2VzID0gYXZfbWFsbG9jX2FycmF5KG4gKyAxLCBzaXplb2YoKmNob2ljZXMpKTsKKyAgICBpZiAoIWNob2ljZXMpCisgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7CisKKyAgICBtZW1jcHkoY2hvaWNlcywgZm10LCAobiArIDEpICogc2l6ZW9mKCpjaG9pY2VzKSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChhdmN0eC0+aHdhY2NlbCAmJiBhdmN0eC0+aHdhY2NlbC0+dW5pbml0KQorICAgICAgICAgICAgYXZjdHgtPmh3YWNjZWwtPnVuaW5pdChhdmN0eCk7CisgICAgICAgIGF2X2ZyZWVwKCZhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhKTsKKyAgICAgICAgYXZjdHgtPmh3YWNjZWwgPSBOVUxMOworCisgICAgICAgIHJldCA9IGF2Y3R4LT5nZXRfZm9ybWF0KGF2Y3R4LCBjaG9pY2VzKTsKKworICAgICAgICBkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChyZXQpOworICAgICAgICBpZiAoIWRlc2MpIHsKKyAgICAgICAgICAgIHJldCA9IEFWX1BJWF9GTVRfTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzJkNPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKCFzZXR1cF9od2FjY2VsKGF2Y3R4LCByZXQsIGRlc2MtPm5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogUmVtb3ZlIGZhaWxlZCBod2FjY2VsIGZyb20gY2hvaWNlcyAqLworICAgICAgICBmb3IgKG4gPSAwOyBjaG9pY2VzW25dICE9IHJldDsgbisrKQorICAgICAgICAgICAgYXZfYXNzZXJ0MChjaG9pY2VzW25dICE9IEFWX1BJWF9GTVRfTk9ORSk7CisKKyAgICAgICAgZG8KKyAgICAgICAgICAgIGNob2ljZXNbbl0gPSBjaG9pY2VzW24gKyAxXTsKKyAgICAgICAgd2hpbGUgKGNob2ljZXNbbisrXSAhPSBBVl9QSVhfRk1UX05PTkUpOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZjaG9pY2VzKTsKKyAgICByZXR1cm4gcmV0OworfQorCisjaWYgRkZfQVBJX0FWRlJBTUVfTEFWQwordm9pZCBhdmNvZGVjX2dldF9mcmFtZV9kZWZhdWx0cyhBVkZyYW1lICpmcmFtZSkKK3sKKyNpZiBMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPj0gNTUKKyAgICAgLy8gZXh0ZW5kZWRfZGF0YSBzaG91bGQgZXhwbGljaXRseSBiZSBmcmVlZCB3aGVuIG5lZWRlZCwgdGhpcyBjb2RlIGlzIHVuc2FmZSBjdXJyZW50bHkKKyAgICAgLy8gYWxzbyB0aGlzIGlzIG5vdCBjb21wYXRpYmxlIHRvIHRoZSA8NTUgQUJJL0FQSQorICAgIGlmIChmcmFtZS0+ZXh0ZW5kZWRfZGF0YSAhPSBmcmFtZS0+ZGF0YSAmJiAwKQorICAgICAgICBhdl9mcmVlcCgmZnJhbWUtPmV4dGVuZGVkX2RhdGEpOworI2VuZGlmCisKKyAgICBtZW1zZXQoZnJhbWUsIDAsIHNpemVvZihBVkZyYW1lKSk7CisgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOworfQorCitBVkZyYW1lICphdmNvZGVjX2FsbG9jX2ZyYW1lKHZvaWQpCit7CisgICAgcmV0dXJuIGF2X2ZyYW1lX2FsbG9jKCk7Cit9CisKK3ZvaWQgYXZjb2RlY19mcmVlX2ZyYW1lKEFWRnJhbWUgKipmcmFtZSkKK3sKKyAgICBhdl9mcmFtZV9mcmVlKGZyYW1lKTsKK30KKyNlbmRpZgorCitNQUtFX0FDQ0VTU09SUyhBVkNvZGVjQ29udGV4dCwgY29kZWMsIEFWUmF0aW9uYWwsIHBrdF90aW1lYmFzZSkKK01BS0VfQUNDRVNTT1JTKEFWQ29kZWNDb250ZXh0LCBjb2RlYywgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKiwgY29kZWNfZGVzY3JpcHRvcikKK01BS0VfQUNDRVNTT1JTKEFWQ29kZWNDb250ZXh0LCBjb2RlYywgaW50LCBsb3dyZXMpCitNQUtFX0FDQ0VTU09SUyhBVkNvZGVjQ29udGV4dCwgY29kZWMsIGludCwgc2Vla19wcmVyb2xsKQorTUFLRV9BQ0NFU1NPUlMoQVZDb2RlY0NvbnRleHQsIGNvZGVjLCB1aW50MTZfdCosIGNocm9tYV9pbnRyYV9tYXRyaXgpCisKK2ludCBhdl9jb2RlY19nZXRfbWF4X2xvd3Jlcyhjb25zdCBBVkNvZGVjICpjb2RlYykKK3sKKyAgICByZXR1cm4gY29kZWMtPm1heF9sb3dyZXM7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zdWJ0aXRsZV9kZWZhdWx0cyhBVlN1YnRpdGxlICpzdWIpCit7CisgICAgbWVtc2V0KHN1YiwgMCwgc2l6ZW9mKCpzdWIpKTsKKyAgICBzdWItPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworfQorCitzdGF0aWMgaW50IGdldF9iaXRfcmF0ZShBVkNvZGVjQ29udGV4dCAqY3R4KQoreworICAgIGludCBiaXRfcmF0ZTsKKyAgICBpbnQgYml0c19wZXJfc2FtcGxlOworCisgICAgc3dpdGNoIChjdHgtPmNvZGVjX3R5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOgorICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgorICAgIGNhc2UgQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ6CisgICAgICAgIGJpdF9yYXRlID0gY3R4LT5iaXRfcmF0ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIGJpdHNfcGVyX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoY3R4LT5jb2RlY19pZCk7CisgICAgICAgIGJpdF9yYXRlID0gYml0c19wZXJfc2FtcGxlID8gY3R4LT5zYW1wbGVfcmF0ZSAqIGN0eC0+Y2hhbm5lbHMgKiBiaXRzX3Blcl9zYW1wbGUgOiBjdHgtPmJpdF9yYXRlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBiaXRfcmF0ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gYml0X3JhdGU7Cit9CisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGZmX2NvZGVjX29wZW4yX3JlY3Vyc2l2ZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWQ29kZWMgKmNvZGVjLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKQoreworICAgIGludCByZXQgPSAwOworCisgICAgZmZfdW5sb2NrX2F2Y29kZWMoKTsKKworICAgIHJldCA9IGF2Y29kZWNfb3BlbjIoYXZjdHgsIGNvZGVjLCBvcHRpb25zKTsKKworICAgIGZmX2xvY2tfYXZjb2RlYyhhdmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF0dHJpYnV0ZV9hbGlnbl9hcmcgYXZjb2RlY19vcGVuMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWQ29kZWMgKmNvZGVjLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKQoreworICAgIGludCByZXQgPSAwOworICAgIEFWRGljdGlvbmFyeSAqdG1wID0gTlVMTDsKKworICAgIGlmIChhdmNvZGVjX2lzX29wZW4oYXZjdHgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICgoIWNvZGVjICYmICFhdmN0eC0+Y29kZWMpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gY29kZWMgcHJvdmlkZWQgdG8gYXZjb2RlY19vcGVuMigpXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKChjb2RlYyAmJiBhdmN0eC0+Y29kZWMgJiYgY29kZWMgIT0gYXZjdHgtPmNvZGVjKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRoaXMgQVZDb2RlY0NvbnRleHQgd2FzIGFsbG9jYXRlZCBmb3IgJXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgJXMgcGFzc2VkIHRvIGF2Y29kZWNfb3BlbjIoKVxuIiwgYXZjdHgtPmNvZGVjLT5uYW1lLCBjb2RlYy0+bmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmICghY29kZWMpCisgICAgICAgIGNvZGVjID0gYXZjdHgtPmNvZGVjOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDAgfHwgYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IEZGX01BWF9FWFRSQURBVEFfU0laRSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmIChvcHRpb25zKQorICAgICAgICBhdl9kaWN0X2NvcHkoJnRtcCwgKm9wdGlvbnMsIDApOworCisgICAgcmV0ID0gZmZfbG9ja19hdmNvZGVjKGF2Y3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2Y3R4LT5pbnRlcm5hbCA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWQ29kZWNJbnRlcm5hbCkpOworICAgIGlmICghYXZjdHgtPmludGVybmFsKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgYXZjdHgtPmludGVybmFsLT5wb29sID0gYXZfbWFsbG9jeihzaXplb2YoKmF2Y3R4LT5pbnRlcm5hbC0+cG9vbCkpOworICAgIGlmICghYXZjdHgtPmludGVybmFsLT5wb29sKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmcmVlX2FuZF9lbmQ7CisgICAgfQorCisgICAgYXZjdHgtPmludGVybmFsLT50b19mcmVlID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWF2Y3R4LT5pbnRlcm5hbC0+dG9fZnJlZSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZnJlZV9hbmRfZW5kOworICAgIH0KKworICAgIGlmIChjb2RlYy0+cHJpdl9kYXRhX3NpemUgPiAwKSB7CisgICAgICAgIGlmICghYXZjdHgtPnByaXZfZGF0YSkgeworICAgICAgICAgICAgYXZjdHgtPnByaXZfZGF0YSA9IGF2X21hbGxvY3ooY29kZWMtPnByaXZfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmICghYXZjdHgtPnByaXZfZGF0YSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2RlYy0+cHJpdl9jbGFzcykgeworICAgICAgICAgICAgICAgICooY29uc3QgQVZDbGFzcyAqKilhdmN0eC0+cHJpdl9kYXRhID0gY29kZWMtPnByaXZfY2xhc3M7CisgICAgICAgICAgICAgICAgYXZfb3B0X3NldF9kZWZhdWx0cyhhdmN0eC0+cHJpdl9kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWMtPnByaXZfY2xhc3MgJiYgKHJldCA9IGF2X29wdF9zZXRfZGljdChhdmN0eC0+cHJpdl9kYXRhLCAmdG1wKSkgPCAwKQorICAgICAgICAgICAgZ290byBmcmVlX2FuZF9lbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZjdHgtPnByaXZfZGF0YSA9IE5VTEw7CisgICAgfQorICAgIGlmICgocmV0ID0gYXZfb3B0X3NldF9kaWN0KGF2Y3R4LCAmdG1wKSkgPCAwKQorICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfd2hpdGVsaXN0ICYmIGF2X21hdGNoX2xpc3QoY29kZWMtPm5hbWUsIGF2Y3R4LT5jb2RlY193aGl0ZWxpc3QsICcsJykgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvZGVjICglcykgbm90IG9uIHdoaXRlbGlzdFxuIiwgY29kZWMtPm5hbWUpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZnJlZV9hbmRfZW5kOworICAgIH0KKworICAgIC8vIG9ubHkgY2FsbCBmZl9zZXRfZGltZW5zaW9ucygpIGZvciBub24gSC4yNjQvVlA2RiBjb2RlY3Mgc28gYXMgbm90IHRvIG92ZXJ3cml0ZSBwcmV2aW91c2x5IHNldHVwIGRpbWVuc2lvbnMKKyAgICBpZiAoIShhdmN0eC0+Y29kZWRfd2lkdGggJiYgYXZjdHgtPmNvZGVkX2hlaWdodCAmJiBhdmN0eC0+d2lkdGggJiYgYXZjdHgtPmhlaWdodCAmJgorICAgICAgICAgIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fCBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2RikpKSB7CisgICAgaWYgKGF2Y3R4LT5jb2RlZF93aWR0aCAmJiBhdmN0eC0+Y29kZWRfaGVpZ2h0KQorICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgYXZjdHgtPmNvZGVkX3dpZHRoLCBhdmN0eC0+Y29kZWRfaGVpZ2h0KTsKKyAgICBlbHNlIGlmIChhdmN0eC0+d2lkdGggJiYgYXZjdHgtPmhlaWdodCkKKyAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZnJlZV9hbmRfZW5kOworICAgIH0KKworICAgIGlmICgoYXZjdHgtPmNvZGVkX3dpZHRoIHx8IGF2Y3R4LT5jb2RlZF9oZWlnaHQgfHwgYXZjdHgtPndpZHRoIHx8IGF2Y3R4LT5oZWlnaHQpCisgICAgICAgICYmICggIGF2X2ltYWdlX2NoZWNrX3NpemUoYXZjdHgtPmNvZGVkX3dpZHRoLCBhdmN0eC0+Y29kZWRfaGVpZ2h0LCAwLCBhdmN0eCkgPCAwCisgICAgICAgICAgIHx8IGF2X2ltYWdlX2NoZWNrX3NpemUoYXZjdHgtPndpZHRoLCAgICAgICBhdmN0eC0+aGVpZ2h0LCAgICAgICAwLCBhdmN0eCkgPCAwKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSWdub3JpbmcgaW52YWxpZCB3aWR0aC9oZWlnaHQgdmFsdWVzXG4iKTsKKyAgICAgICAgZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIDAsIDApOworICAgIH0KKworICAgIGlmIChhdmN0eC0+d2lkdGggPiAwICYmIGF2Y3R4LT5oZWlnaHQgPiAwKSB7CisgICAgICAgIGlmIChhdl9pbWFnZV9jaGVja19zYXIoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJpZ25vcmluZyBpbnZhbGlkIFNBUjogJXUvJXVcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsgMCwgMSB9OworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgdGhlIGRlY29kZXIgaW5pdCBmdW5jdGlvbiB3YXMgYWxyZWFkeSBjYWxsZWQgcHJldmlvdXNseSwKKyAgICAgKiBmcmVlIHRoZSBhbHJlYWR5IGFsbG9jYXRlZCBzdWJ0aXRsZV9oZWFkZXIgYmVmb3JlIG92ZXJ3cml0aW5nIGl0ICovCisgICAgaWYgKGF2X2NvZGVjX2lzX2RlY29kZXIoY29kZWMpKQorICAgICAgICBhdl9mcmVlcCgmYXZjdHgtPnN1YnRpdGxlX2hlYWRlcik7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID4gRkZfU0FORV9OQl9DSEFOTkVMUykgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZnJlZV9hbmRfZW5kOworICAgIH0KKworICAgIGF2Y3R4LT5jb2RlYyA9IGNvZGVjOworICAgIGlmICgoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1VOS05PV04gfHwgYXZjdHgtPmNvZGVjX3R5cGUgPT0gY29kZWMtPnR5cGUpICYmCisgICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgIGF2Y3R4LT5jb2RlY190eXBlID0gY29kZWMtPnR5cGU7CisgICAgICAgIGF2Y3R4LT5jb2RlY19pZCAgID0gY29kZWMtPmlkOworICAgIH0KKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkICE9IGNvZGVjLT5pZCB8fCAoYXZjdHgtPmNvZGVjX3R5cGUgIT0gY29kZWMtPnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXZjdHgtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29kZWMgdHlwZSBvciBpZCBtaXNtYXRjaGVzXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICB9CisgICAgYXZjdHgtPmZyYW1lX251bWJlciA9IDA7CisgICAgYXZjdHgtPmNvZGVjX2Rlc2NyaXB0b3IgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGF2Y3R4LT5jb2RlY19pZCk7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfRVhQRVJJTUVOVEFMICYmCisgICAgICAgIGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBjb25zdCBjaGFyICpjb2RlY19zdHJpbmcgPSBhdl9jb2RlY19pc19lbmNvZGVyKGNvZGVjKSA/ICJlbmNvZGVyIiA6ICJkZWNvZGVyIjsKKyAgICAgICAgQVZDb2RlYyAqY29kZWMyOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUaGUgJXMgJyVzJyBpcyBleHBlcmltZW50YWwgYnV0IGV4cGVyaW1lbnRhbCBjb2RlY3MgYXJlIG5vdCBlbmFibGVkLCAiCisgICAgICAgICAgICAgICAiYWRkICctc3RyaWN0ICVkJyBpZiB5b3Ugd2FudCB0byB1c2UgaXQuXG4iLAorICAgICAgICAgICAgICAgY29kZWNfc3RyaW5nLCBjb2RlYy0+bmFtZSwgRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUwpOworICAgICAgICBjb2RlYzIgPSBhdl9jb2RlY19pc19lbmNvZGVyKGNvZGVjKSA/IGF2Y29kZWNfZmluZF9lbmNvZGVyKGNvZGVjLT5pZCkgOiBhdmNvZGVjX2ZpbmRfZGVjb2Rlcihjb2RlYy0+aWQpOworICAgICAgICBpZiAoIShjb2RlYzItPmNhcGFiaWxpdGllcyAmIENPREVDX0NBUF9FWFBFUklNRU5UQUwpKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBbHRlcm5hdGl2ZWx5IHVzZSB0aGUgbm9uIGV4cGVyaW1lbnRhbCAlcyAnJXMnLlxuIiwKKyAgICAgICAgICAgICAgICBjb2RlY19zdHJpbmcsIGNvZGVjMi0+bmFtZSk7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhQRVJJTUVOVEFMOworICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICghYXZjdHgtPnRpbWVfYmFzZS5udW0gfHwgIWF2Y3R4LT50aW1lX2Jhc2UuZGVuKSkgeworICAgICAgICBhdmN0eC0+dGltZV9iYXNlLm51bSA9IDE7CisgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UuZGVuID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIH0KKworICAgIGlmICghSEFWRV9USFJFQURTKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiV2FybmluZzogbm90IGNvbXBpbGVkIHdpdGggdGhyZWFkIHN1cHBvcnQsIHVzaW5nIHRocmVhZCBlbXVsYXRpb25cbiIpOworCisgICAgaWYgKENPTkZJR19GUkFNRV9USFJFQURfRU5DT0RFUikgeworICAgICAgICBmZl91bmxvY2tfYXZjb2RlYygpOyAvL3dlIHdpbGwgaW5zdGFuY2lhdGUgYSBmZXcgZW5jb2RlcnMgdGh1cyBraWNrIHRoZSBjb3VudGVyIHRvIHByZXZlbnQgZmFsc2UgZGV0ZWN0aW9uIG9mIGEgcHJvYmxlbQorICAgICAgICByZXQgPSBmZl9mcmFtZV90aHJlYWRfZW5jb2Rlcl9pbml0KGF2Y3R4LCBvcHRpb25zID8gKm9wdGlvbnMgOiBOVUxMKTsKKyAgICAgICAgZmZfbG9ja19hdmNvZGVjKGF2Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICB9CisKKyAgICBpZiAoSEFWRV9USFJFQURTCisgICAgICAgICYmICEoYXZjdHgtPmludGVybmFsLT5mcmFtZV90aHJlYWRfZW5jb2RlciAmJiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSZGRl9USFJFQURfRlJBTUUpKSkgeworICAgICAgICByZXQgPSBmZl90aHJlYWRfaW5pdChhdmN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIUhBVkVfVEhSRUFEUyAmJiAhKGNvZGVjLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfQVVUT19USFJFQURTKSkKKyAgICAgICAgYXZjdHgtPnRocmVhZF9jb3VudCA9IDE7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjLT5tYXhfbG93cmVzIDwgYXZjdHgtPmxvd3JlcyB8fCBhdmN0eC0+bG93cmVzIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRoZSBtYXhpbXVtIHZhbHVlIGZvciBsb3dyZXMgc3VwcG9ydGVkIGJ5IHRoZSBkZWNvZGVyIGlzICVkXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjLT5tYXhfbG93cmVzKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICB9CisKKyNpZiBGRl9BUElfVklTTVYKKyAgICBpZiAoYXZjdHgtPmRlYnVnX212KQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhlICd2aXNtdicgb3B0aW9uIGlzIGRlcHJlY2F0ZWQsICIKKyAgICAgICAgICAgICAgICJzZWUgdGhlIGNvZGVjdmlldyBmaWx0ZXIgaW5zdGVhZC5cbiIpOworI2VuZGlmCisKKyAgICBpZiAoYXZfY29kZWNfaXNfZW5jb2RlcihhdmN0eC0+Y29kZWMpKSB7CisgICAgICAgIGludCBpOworICAgICAgICBpZiAoYXZjdHgtPmNvZGVjLT5zYW1wbGVfZm10cykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgYXZjdHgtPmNvZGVjLT5zYW1wbGVfZm10c1tpXSAhPSBBVl9TQU1QTEVfRk1UX05PTkU7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+c2FtcGxlX2ZtdCA9PSBhdmN0eC0+Y29kZWMtPnNhbXBsZV9mbXRzW2ldKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID09IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BsYW5hcl9zYW1wbGVfZm10KGF2Y3R4LT5zYW1wbGVfZm10KSA9PQorICAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGxhbmFyX3NhbXBsZV9mbXQoYXZjdHgtPmNvZGVjLT5zYW1wbGVfZm10c1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBhdmN0eC0+Y29kZWMtPnNhbXBsZV9mbXRzW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZjdHgtPmNvZGVjLT5zYW1wbGVfZm10c1tpXSA9PSBBVl9TQU1QTEVfRk1UX05PTkUpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMjhdOworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZCIsIGF2Y3R4LT5zYW1wbGVfZm10KTsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNwZWNpZmllZCBzYW1wbGUgZm9ybWF0ICVzIGlzIGludmFsaWQgb3Igbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilhdl94X2lmX251bGwoYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShhdmN0eC0+c2FtcGxlX2ZtdCksIGJ1ZikpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYXZjdHgtPmNvZGVjLT5waXhfZm10cykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgYXZjdHgtPmNvZGVjLT5waXhfZm10c1tpXSAhPSBBVl9QSVhfRk1UX05PTkU7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gYXZjdHgtPmNvZGVjLT5waXhfZm10c1tpXSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmNvZGVjLT5waXhfZm10c1tpXSA9PSBBVl9QSVhfRk1UX05PTkUKKyAgICAgICAgICAgICAgICAmJiAhKChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUpQRUcgfHwgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0xKUEVHKQorICAgICAgICAgICAgICAgICAgICAgJiYgYXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA8PSBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwpKSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZbMTI4XTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBhdmN0eC0+cGl4X2ZtdCk7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTcGVjaWZpZWQgcGl4ZWwgZm9ybWF0ICVzIGlzIGludmFsaWQgb3Igbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilhdl94X2lmX251bGwoYXZfZ2V0X3BpeF9mbXRfbmFtZShhdmN0eC0+cGl4X2ZtdCksIGJ1ZikpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPnBpeF9mbXRzW2ldID09IEFWX1BJWF9GTVRfWVVWSjQyMFAgfHwKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWMtPnBpeF9mbXRzW2ldID09IEFWX1BJWF9GTVRfWVVWSjQxMVAgfHwKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWMtPnBpeF9mbXRzW2ldID09IEFWX1BJWF9GTVRfWVVWSjQyMlAgfHwKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWMtPnBpeF9mbXRzW2ldID09IEFWX1BJWF9GTVRfWVVWSjQ0MFAgfHwKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWMtPnBpeF9mbXRzW2ldID09IEFWX1BJWF9GTVRfWVVWSjQ0NFApCisgICAgICAgICAgICAgICAgYXZjdHgtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfSlBFRzsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZjdHgtPmNvZGVjLT5zdXBwb3J0ZWRfc2FtcGxlcmF0ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGF2Y3R4LT5jb2RlYy0+c3VwcG9ydGVkX3NhbXBsZXJhdGVzW2ldICE9IDA7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlID09IGF2Y3R4LT5jb2RlYy0+c3VwcG9ydGVkX3NhbXBsZXJhdGVzW2ldKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPnN1cHBvcnRlZF9zYW1wbGVyYXRlc1tpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTcGVjaWZpZWQgc2FtcGxlIHJhdGUgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgZ290byBmcmVlX2FuZF9lbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXRzKSB7CisgICAgICAgICAgICBpZiAoIWF2Y3R4LT5jaGFubmVsX2xheW91dCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJDaGFubmVsIGxheW91dCBub3Qgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgYXZjdHgtPmNvZGVjLT5jaGFubmVsX2xheW91dHNbaV0gIT0gMDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID09IGF2Y3R4LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXRzW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXRzW2ldID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBidWZbNTEyXTsKKyAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhidWYsIHNpemVvZihidWYpLCAtMSwgYXZjdHgtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTcGVjaWZpZWQgY2hhbm5lbCBsYXlvdXQgJyVzJyBpcyBub3Qgc3VwcG9ydGVkXG4iLCBidWYpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZnJlZV9hbmRfZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxfbGF5b3V0ICYmIGF2Y3R4LT5jaGFubmVscykgeworICAgICAgICAgICAgaW50IGNoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGF2Y3R4LT5jaGFubmVsX2xheW91dCk7CisgICAgICAgICAgICBpZiAoY2hhbm5lbHMgIT0gYXZjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZbNTEyXTsKKyAgICAgICAgICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIC0xLCBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ2hhbm5lbCBsYXlvdXQgJyVzJyB3aXRoICVkIGNoYW5uZWxzIGRvZXMgbm90IG1hdGNoIG51bWJlciBvZiBzcGVjaWZpZWQgY2hhbm5lbHMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgY2hhbm5lbHMsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZnJlZV9hbmRfZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jaGFubmVsX2xheW91dCkgeworICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGF2Y3R4LT5jaGFubmVsX2xheW91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPndpZHRoIDw9IDAgfHwgYXZjdHgtPmhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkaW1lbnNpb25zIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoICAgKGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fCBhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgICAgICAmJiBhdmN0eC0+Yml0X3JhdGU+MCAmJiBhdmN0eC0+Yml0X3JhdGU8MTAwMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkJpdHJhdGUgJWQgaXMgZXh0cmVtZWx5IGxvdywgbWF5YmUgeW91IG1lYW4gJWRrXG4iLCBhdmN0eC0+Yml0X3JhdGUsIGF2Y3R4LT5iaXRfcmF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWF2Y3R4LT5yY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3kpCisgICAgICAgICAgICBhdmN0eC0+cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5ID0gYXZjdHgtPnJjX2J1ZmZlcl9zaXplICogMyAvIDQ7CisgICAgfQorCisgICAgYXZjdHgtPnB0c19jb3JyZWN0aW9uX251bV9mYXVsdHlfcHRzID0KKyAgICBhdmN0eC0+cHRzX2NvcnJlY3Rpb25fbnVtX2ZhdWx0eV9kdHMgPSAwOworICAgIGF2Y3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X3B0cyA9CisgICAgYXZjdHgtPnB0c19jb3JyZWN0aW9uX2xhc3RfZHRzID0gSU5UNjRfTUlOOworCisgICAgaWYgKCAgIGF2Y3R4LT5jb2RlYy0+aW5pdCAmJiAoIShhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlJkZGX1RIUkVBRF9GUkFNRSkKKyAgICAgICAgfHwgYXZjdHgtPmludGVybmFsLT5mcmFtZV90aHJlYWRfZW5jb2RlcikpIHsKKyAgICAgICAgcmV0ID0gYXZjdHgtPmNvZGVjLT5pbml0KGF2Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gZnJlZV9hbmRfZW5kOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0PTA7CisKKyNpZiBGRl9BUElfQVVESU9FTkNfREVMQVkKKyAgICBpZiAoYXZfY29kZWNfaXNfZW5jb2RlcihhdmN0eC0+Y29kZWMpKQorICAgICAgICBhdmN0eC0+ZGVsYXkgPSBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nOworI2VuZGlmCisKKyAgICBpZiAoYXZfY29kZWNfaXNfZGVjb2RlcihhdmN0eC0+Y29kZWMpKSB7CisgICAgICAgIGlmICghYXZjdHgtPmJpdF9yYXRlKQorICAgICAgICAgICAgYXZjdHgtPmJpdF9yYXRlID0gZ2V0X2JpdF9yYXRlKGF2Y3R4KTsKKyAgICAgICAgLyogdmFsaWRhdGUgY2hhbm5lbCBsYXlvdXQgZnJvbSB0aGUgZGVjb2RlciAqLworICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgICAgICBpbnQgY2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoYXZjdHgtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgICAgIGlmICghYXZjdHgtPmNoYW5uZWxzKQorICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgICAgICAgICAgZWxzZSBpZiAoY2hhbm5lbHMgIT0gYXZjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZbNTEyXTsKKyAgICAgICAgICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIC0xLCBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJDaGFubmVsIGxheW91dCAnJXMnIHdpdGggJWQgY2hhbm5lbHMgZG9lcyBub3QgbWF0Y2ggc3BlY2lmaWVkIG51bWJlciBvZiBjaGFubmVscyAlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAiaWdub3Jpbmcgc3BlY2lmaWVkIGNoYW5uZWwgbGF5b3V0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBidWYsIGNoYW5uZWxzLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscyAmJiBhdmN0eC0+Y2hhbm5lbHMgPCAwIHx8CisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgPiBGRl9TQU5FX05CX0NIQU5ORUxTKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZjdHgtPnN1Yl9jaGFyZW5jKSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDaGFyYWN0ZXIgZW5jb2RpbmcgaXMgb25seSAiCisgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgd2l0aCBzdWJ0aXRsZXMgY29kZWNzXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgZ290byBmcmVlX2FuZF9lbmQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2RlY19kZXNjcmlwdG9yLT5wcm9wcyAmIEFWX0NPREVDX1BST1BfQklUTUFQX1NVQikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJDb2RlYyAnJXMnIGlzIGJpdG1hcC1iYXNlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAic3VidGl0bGVzIGNoYXJhY3RlciBlbmNvZGluZyB3aWxsIGJlIGlnbm9yZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlY19kZXNjcmlwdG9yLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBhdmN0eC0+c3ViX2NoYXJlbmNfbW9kZSA9IEZGX1NVQl9DSEFSRU5DX01PREVfRE9fTk9USElORzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogaW5wdXQgY2hhcmFjdGVyIGVuY29kaW5nIGlzIHNldCBmb3IgYSB0ZXh0IGJhc2VkIHN1YnRpdGxlCisgICAgICAgICAgICAgICAgICogY29kZWMgYXQgdGhpcyBwb2ludCAqLworICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+c3ViX2NoYXJlbmNfbW9kZSA9PSBGRl9TVUJfQ0hBUkVOQ19NT0RFX0FVVE9NQVRJQykKKyAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnN1Yl9jaGFyZW5jX21vZGUgPSBGRl9TVUJfQ0hBUkVOQ19NT0RFX1BSRV9ERUNPREVSOworCisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5zdWJfY2hhcmVuY19tb2RlID09IEZGX1NVQl9DSEFSRU5DX01PREVfUFJFX0RFQ09ERVIpIHsKKyNpZiBDT05GSUdfSUNPTlYKKyAgICAgICAgICAgICAgICAgICAgaWNvbnZfdCBjZCA9IGljb252X29wZW4oIlVURi04IiwgYXZjdHgtPnN1Yl9jaGFyZW5jKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNkID09IChpY29udl90KS0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIG9wZW4gaWNvbnYgY29udGV4dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggaW5wdXQgY2hhcmFjdGVyIGVuY29kaW5nIFwiJXNcIlxuIiwgYXZjdHgtPnN1Yl9jaGFyZW5jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZnJlZV9hbmRfZW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGljb252X2Nsb3NlKGNkKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2hhcmFjdGVyIGVuY29kaW5nIHN1YnRpdGxlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udmVyc2lvbiBuZWVkcyBhIGxpYmF2Y29kZWMgYnVpbHQgd2l0aCBpY29udiBzdXBwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhpcyBjb2RlY1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmcmVlX2FuZF9lbmQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIEZGX0FQSV9BVkNUWF9USU1FQkFTRQorICAgICAgICBpZiAoYXZjdHgtPmZyYW1lcmF0ZS5udW0gPiAwICYmIGF2Y3R4LT5mcmFtZXJhdGUuZGVuID4gMCkKKyAgICAgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UgPSBhdl9pbnZfcShhdl9tdWxfcShhdmN0eC0+ZnJhbWVyYXRlLCAoQVZSYXRpb25hbCl7YXZjdHgtPnRpY2tzX3Blcl9mcmFtZSwgMX0pKTsKKyNlbmRpZgorICAgIH0KK2VuZDoKKyAgICBmZl91bmxvY2tfYXZjb2RlYygpOworICAgIGlmIChvcHRpb25zKSB7CisgICAgICAgIGF2X2RpY3RfZnJlZShvcHRpb25zKTsKKyAgICAgICAgKm9wdGlvbnMgPSB0bXA7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK2ZyZWVfYW5kX2VuZDoKKyAgICBhdl9kaWN0X2ZyZWUoJnRtcCk7CisgICAgaWYgKGNvZGVjLT5wcml2X2NsYXNzICYmIGNvZGVjLT5wcml2X2RhdGFfc2l6ZSkKKyAgICAgICAgYXZfb3B0X2ZyZWUoYXZjdHgtPnByaXZfZGF0YSk7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5wcml2X2RhdGEpOworICAgIGlmIChhdmN0eC0+aW50ZXJuYWwpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmludGVybmFsLT50b19mcmVlKTsKKyAgICAgICAgYXZfZnJlZXAoJmF2Y3R4LT5pbnRlcm5hbC0+cG9vbCk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZhdmN0eC0+aW50ZXJuYWwpOworICAgIGF2Y3R4LT5jb2RlYyA9IE5VTEw7CisgICAgZ290byBlbmQ7Cit9CisKK2ludCBmZl9hbGxvY19wYWNrZXQyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LCBpbnQ2NF90IHNpemUpCit7CisgICAgaWYgKGF2cGt0LT5zaXplIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbmVnYXRpdmUgdXNlciBwYWNrZXQgc2l6ZSAlZFxuIiwgYXZwa3QtPnNpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+IElOVF9NQVggLSBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBtaW5pbXVtIHJlcXVpcmVkIHBhY2tldCBzaXplICUiUFJJZDY0IiAobWF4IGFsbG93ZWQgaXMgJWQpXG4iLAorICAgICAgICAgICAgICAgc2l6ZSwgSU5UX01BWCAtIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChhdmN0eCkgeworICAgICAgICBhdl9hc3NlcnQwKCFhdnBrdC0+ZGF0YSB8fCBhdnBrdC0+ZGF0YSAhPSBhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyKTsKKyAgICAgICAgaWYgKCFhdnBrdC0+ZGF0YSB8fCBhdnBrdC0+c2l6ZSA8IHNpemUpIHsKKyAgICAgICAgICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmYXZjdHgtPmludGVybmFsLT5ieXRlX2J1ZmZlciwgJmF2Y3R4LT5pbnRlcm5hbC0+Ynl0ZV9idWZmZXJfc2l6ZSwgc2l6ZSk7CisgICAgICAgICAgICBhdnBrdC0+ZGF0YSA9IGF2Y3R4LT5pbnRlcm5hbC0+Ynl0ZV9idWZmZXI7CisgICAgICAgICAgICBhdnBrdC0+c2l6ZSA9IGF2Y3R4LT5pbnRlcm5hbC0+Ynl0ZV9idWZmZXJfc2l6ZTsKKyNpZiBGRl9BUElfREVTVFJVQ1RfUEFDS0VUCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICBhdnBrdC0+ZGVzdHJ1Y3QgPSBOVUxMOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdnBrdC0+ZGF0YSkgeworICAgICAgICBBVkJ1ZmZlclJlZiAqYnVmID0gYXZwa3QtPmJ1ZjsKKyNpZiBGRl9BUElfREVTVFJVQ1RfUEFDS0VUCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgIHZvaWQgKmRlc3RydWN0ID0gYXZwa3QtPmRlc3RydWN0OworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKworICAgICAgICBpZiAoYXZwa3QtPnNpemUgPCBzaXplKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVzZXIgcGFja2V0IGlzIHRvbyBzbWFsbCAoJWQgPCAlIlBSSWQ2NCIpXG4iLCBhdnBrdC0+c2l6ZSwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgYXZfaW5pdF9wYWNrZXQoYXZwa3QpOworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgYXZwa3QtPmRlc3RydWN0ID0gZGVzdHJ1Y3Q7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorICAgICAgICBhdnBrdC0+YnVmICAgICAgPSBidWY7CisgICAgICAgIGF2cGt0LT5zaXplICAgICA9IHNpemU7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCByZXQgPSBhdl9uZXdfcGFja2V0KGF2cGt0LCBzaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBwYWNrZXQgb2Ygc2l6ZSAlIlBSSWQ2NCJcbiIsIHNpemUpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworaW50IGZmX2FsbG9jX3BhY2tldChBVlBhY2tldCAqYXZwa3QsIGludCBzaXplKQoreworICAgIHJldHVybiBmZl9hbGxvY19wYWNrZXQyKE5VTEwsIGF2cGt0LCBzaXplKTsKK30KKworLyoqCisgKiBQYWQgbGFzdCBmcmFtZSB3aXRoIHNpbGVuY2UuCisgKi8KK3N0YXRpYyBpbnQgcGFkX2xhc3RfZnJhbWUoQVZDb2RlY0NvbnRleHQgKnMsIEFWRnJhbWUgKipkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYykKK3sKKyAgICBBVkZyYW1lICpmcmFtZSA9IE5VTEw7CisgICAgaW50IHJldDsKKworICAgIGlmICghKGZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmcmFtZS0+Zm9ybWF0ICAgICAgICAgPSBzcmMtPmZvcm1hdDsKKyAgICBmcmFtZS0+Y2hhbm5lbF9sYXlvdXQgPSBzcmMtPmNoYW5uZWxfbGF5b3V0OworICAgIGF2X2ZyYW1lX3NldF9jaGFubmVscyhmcmFtZSwgYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKHNyYykpOworICAgIGZyYW1lLT5uYl9zYW1wbGVzICAgICA9IHMtPmZyYW1lX3NpemU7CisgICAgcmV0ID0gYXZfZnJhbWVfZ2V0X2J1ZmZlcihmcmFtZSwgMzIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXQgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKGZyYW1lLCBzcmMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoKHJldCA9IGF2X3NhbXBsZXNfY29weShmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgc3JjLT5leHRlbmRlZF9kYXRhLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+bmJfc2FtcGxlcywgcy0+Y2hhbm5lbHMsIHMtPnNhbXBsZV9mbXQpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoKHJldCA9IGF2X3NhbXBsZXNfc2V0X3NpbGVuY2UoZnJhbWUtPmV4dGVuZGVkX2RhdGEsIHNyYy0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgLSBzcmMtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxzLCBzLT5zYW1wbGVfZm10KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAqZHN0ID0gZnJhbWU7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF0dHJpYnV0ZV9hbGlnbl9hcmcgYXZjb2RlY19lbmNvZGVfYXVkaW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBBVkZyYW1lICpleHRlbmRlZF9mcmFtZSA9IE5VTEw7CisgICAgQVZGcmFtZSAqcGFkZGVkX2ZyYW1lID0gTlVMTDsKKyAgICBpbnQgcmV0OworICAgIEFWUGFja2V0IHVzZXJfcGt0ID0gKmF2cGt0OworICAgIGludCBuZWVkc19yZWFsbG9jID0gIXVzZXJfcGt0LmRhdGE7CisKKyAgICAqZ290X3BhY2tldF9wdHIgPSAwOworCisgICAgaWYgKCEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfREVMQVkpICYmICFmcmFtZSkgeworICAgICAgICBhdl9mcmVlX3BhY2tldChhdnBrdCk7CisgICAgICAgIGF2X2luaXRfcGFja2V0KGF2cGt0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogZW5zdXJlIHRoYXQgZXh0ZW5kZWRfZGF0YSBpcyBwcm9wZXJseSBzZXQgKi8KKyAgICBpZiAoZnJhbWUgJiYgIWZyYW1lLT5leHRlbmRlZF9kYXRhKSB7CisgICAgICAgIGlmIChhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihhdmN0eC0+c2FtcGxlX2ZtdCkgJiYKKyAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyA+IEFWX05VTV9EQVRBX1BPSU5URVJTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVuY29kaW5nIHRvIGEgcGxhbmFyIHNhbXBsZSBmb3JtYXQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCBtb3JlIHRoYW4gJWQgY2hhbm5lbHMsIGJ1dCBleHRlbmRlZF9kYXRhIGlzIG5vdCBzZXQuXG4iLAorICAgICAgICAgICAgICAgICAgIEFWX05VTV9EQVRBX1BPSU5URVJTKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImV4dGVuZGVkX2RhdGEgaXMgbm90IHNldC5cbiIpOworCisgICAgICAgIGV4dGVuZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFleHRlbmRlZF9mcmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgbWVtY3B5KGV4dGVuZGVkX2ZyYW1lLCBmcmFtZSwgc2l6ZW9mKEFWRnJhbWUpKTsKKyAgICAgICAgZXh0ZW5kZWRfZnJhbWUtPmV4dGVuZGVkX2RhdGEgPSBleHRlbmRlZF9mcmFtZS0+ZGF0YTsKKyAgICAgICAgZnJhbWUgPSBleHRlbmRlZF9mcmFtZTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBmb3IgdmFsaWQgZnJhbWUgc2l6ZSAqLworICAgIGlmIChmcmFtZSkgeworICAgICAgICBpZiAoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSkgeworICAgICAgICAgICAgaWYgKGZyYW1lLT5uYl9zYW1wbGVzID4gYXZjdHgtPmZyYW1lX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1vcmUgc2FtcGxlcyB0aGFuIGZyYW1lIHNpemUgKGF2Y29kZWNfZW5jb2RlX2F1ZGlvMilcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX1ZBUklBQkxFX0ZSQU1FX1NJWkUpKSB7CisgICAgICAgICAgICBpZiAoZnJhbWUtPm5iX3NhbXBsZXMgPCBhdmN0eC0+ZnJhbWVfc2l6ZSAmJgorICAgICAgICAgICAgICAgICFhdmN0eC0+aW50ZXJuYWwtPmxhc3RfYXVkaW9fZnJhbWUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBwYWRfbGFzdF9mcmFtZShhdmN0eCwgJnBhZGRlZF9mcmFtZSwgZnJhbWUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKworICAgICAgICAgICAgICAgIGZyYW1lID0gcGFkZGVkX2ZyYW1lOworICAgICAgICAgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+bGFzdF9hdWRpb19mcmFtZSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmcmFtZS0+bmJfc2FtcGxlcyAhPSBhdmN0eC0+ZnJhbWVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibmJfc2FtcGxlcyAoJWQpICE9IGZyYW1lX3NpemUgKCVkKSAoYXZjb2RlY19lbmNvZGVfYXVkaW8yKVxuIiwgZnJhbWUtPm5iX3NhbXBsZXMsIGF2Y3R4LT5mcmFtZV9zaXplKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBhdmN0eC0+Y29kZWMtPmVuY29kZTIoYXZjdHgsIGF2cGt0LCBmcmFtZSwgZ290X3BhY2tldF9wdHIpOworICAgIGlmICghcmV0KSB7CisgICAgICAgIGlmICgqZ290X3BhY2tldF9wdHIpIHsKKyAgICAgICAgICAgIGlmICghKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX0RFTEFZKSkgeworICAgICAgICAgICAgICAgIGlmIChhdnBrdC0+cHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICBhdnBrdC0+cHRzID0gZnJhbWUtPnB0czsKKyAgICAgICAgICAgICAgICBpZiAoIWF2cGt0LT5kdXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgYXZwa3QtPmR1cmF0aW9uID0gZmZfc2FtcGxlc190b190aW1lX2Jhc2UoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2cGt0LT5kdHMgPSBhdnBrdC0+cHRzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZwa3QtPnNpemUgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhdnBrdC0+ZGF0YSAmJiBhdnBrdC0+ZGF0YSA9PSBhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyKSB7CisgICAgICAgIG5lZWRzX3JlYWxsb2MgPSAwOworICAgICAgICBpZiAodXNlcl9wa3QuZGF0YSkgeworICAgICAgICAgICAgaWYgKHVzZXJfcGt0LnNpemUgPj0gYXZwa3QtPnNpemUpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkodXNlcl9wa3QuZGF0YSwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcm92aWRlZCBwYWNrZXQgaXMgdG9vIHNtYWxsLCBuZWVkcyB0byBiZSAlZFxuIiwgYXZwa3QtPnNpemUpOworICAgICAgICAgICAgICAgIGF2cGt0LT5zaXplID0gdXNlcl9wa3Quc2l6ZTsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2cGt0LT5idWYgICAgICA9IHVzZXJfcGt0LmJ1ZjsKKyAgICAgICAgICAgIGF2cGt0LT5kYXRhICAgICA9IHVzZXJfcGt0LmRhdGE7CisjaWYgRkZfQVBJX0RFU1RSVUNUX1BBQ0tFVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICAgICAgYXZwa3QtPmRlc3RydWN0ID0gdXNlcl9wa3QuZGVzdHJ1Y3Q7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGF2X2R1cF9wYWNrZXQoYXZwa3QpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcmV0KSB7CisgICAgICAgIGlmIChuZWVkc19yZWFsbG9jICYmIGF2cGt0LT5kYXRhKSB7CisgICAgICAgICAgICByZXQgPSBhdl9idWZmZXJfcmVhbGxvYygmYXZwa3QtPmJ1ZiwgYXZwa3QtPnNpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICBhdnBrdC0+ZGF0YSA9IGF2cGt0LT5idWYtPmRhdGE7CisgICAgICAgIH0KKworICAgICAgICBhdmN0eC0+ZnJhbWVfbnVtYmVyKys7CisgICAgfQorCisgICAgaWYgKHJldCA8IDAgfHwgISpnb3RfcGFja2V0X3B0cikgeworICAgICAgICBhdl9mcmVlX3BhY2tldChhdnBrdCk7CisgICAgICAgIGF2X2luaXRfcGFja2V0KGF2cGt0KTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogTk9URTogaWYgd2UgYWRkIGFueSBhdWRpbyBlbmNvZGVycyB3aGljaCBvdXRwdXQgbm9uLWtleWZyYW1lIHBhY2tldHMsCisgICAgICogICAgICAgdGhpcyBuZWVkcyB0byBiZSBtb3ZlZCB0byB0aGUgZW5jb2RlcnMsIGJ1dCBmb3Igbm93IHdlIGNhbiBkbyBpdAorICAgICAqICAgICAgIGhlcmUgdG8gc2ltcGxpZnkgdGhpbmdzICovCisgICAgYXZwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKworZW5kOgorICAgIGF2X2ZyYW1lX2ZyZWUoJnBhZGRlZF9mcmFtZSk7CisgICAgYXZfZnJlZShleHRlbmRlZF9mcmFtZSk7CisKKyNpZiBGRl9BUElfQVVESU9FTkNfREVMQVkKKyAgICBhdmN0eC0+ZGVsYXkgPSBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nOworI2VuZGlmCisKKyAgICByZXR1cm4gcmV0OworfQorCisjaWYgRkZfQVBJX09MRF9FTkNPREVfQVVESU8KK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2Y29kZWNfZW5jb2RlX2F1ZGlvKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgKnNhbXBsZXMpCit7CisgICAgQVZQYWNrZXQgcGt0OworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIGludCByZXQsIHNhbXBsZXNfc2l6ZSwgZ290X3BhY2tldDsKKworICAgIGF2X2luaXRfcGFja2V0KCZwa3QpOworICAgIHBrdC5kYXRhID0gYnVmOworICAgIHBrdC5zaXplID0gYnVmX3NpemU7CisKKyAgICBpZiAoc2FtcGxlcykgeworICAgICAgICBmcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGlmIChhdmN0eC0+ZnJhbWVfc2l6ZSkgeworICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBhdmN0eC0+ZnJhbWVfc2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGlmIGZyYW1lX3NpemUgaXMgbm90IHNldCwgdGhlIG51bWJlciBvZiBzYW1wbGVzIG11c3QgYmUKKyAgICAgICAgICAgICAqIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYnVmZmVyIHNpemUgKi8KKyAgICAgICAgICAgIGludDY0X3QgbmJfc2FtcGxlczsKKyAgICAgICAgICAgIGlmICghYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShhdmN0eC0+Y29kZWNfaWQpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJhdmNvZGVjX2VuY29kZV9hdWRpbygpIGRvZXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cHBvcnQgdGhpcyBjb2RlY1xuIik7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYl9zYW1wbGVzID0gKGludDY0X3QpYnVmX3NpemUgKiA4IC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShhdmN0eC0+Y29kZWNfaWQpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIGlmIChuYl9zYW1wbGVzID49IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gbmJfc2FtcGxlczsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgc2FtcGxlcyBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIGJhc2VkIG9uIHRoZQorICAgICAgICAgKiByZWxldmFudCBwYXJhbWV0ZXJzICovCisgICAgICAgIHNhbXBsZXNfc2l6ZSA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKE5VTEwsIGF2Y3R4LT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10LCAxKTsKKyAgICAgICAgaWYgKChyZXQgPSBhdmNvZGVjX2ZpbGxfYXVkaW9fZnJhbWUoZnJhbWUsIGF2Y3R4LT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc19zaXplLCAxKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLyogZmFicmljYXRlIGZyYW1lIHB0cyBmcm9tIHNhbXBsZSBjb3VudC4KKyAgICAgICAgICogdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYXZjb2RlY19lbmNvZGVfYXVkaW8oKSBBUEkgZG9lcyBub3QgaGF2ZQorICAgICAgICAgKiBhIHdheSBmb3IgdGhlIHVzZXIgdG8gcHJvdmlkZSBwdHMgKi8KKyAgICAgICAgaWYgKGF2Y3R4LT5zYW1wbGVfcmF0ZSAmJiBhdmN0eC0+dGltZV9iYXNlLm51bSkKKyAgICAgICAgICAgIGZyYW1lLT5wdHMgPSBmZl9zYW1wbGVzX3RvX3RpbWVfYmFzZShhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnNhbXBsZV9jb3VudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZyYW1lLT5wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgYXZjdHgtPmludGVybmFsLT5zYW1wbGVfY291bnQgKz0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhbWUgPSBOVUxMOworICAgIH0KKworICAgIGdvdF9wYWNrZXQgPSAwOworICAgIHJldCA9IGF2Y29kZWNfZW5jb2RlX2F1ZGlvMihhdmN0eCwgJnBrdCwgZnJhbWUsICZnb3RfcGFja2V0KTsKKyAgICBpZiAoIXJldCAmJiBnb3RfcGFja2V0ICYmIGF2Y3R4LT5jb2RlZF9mcmFtZSkgeworICAgICAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnB0cyAgICAgICA9IHBrdC5wdHM7CisgICAgICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gISEocGt0LmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKTsKKyAgICB9CisgICAgLyogZnJlZSBhbnkgc2lkZSBkYXRhIHNpbmNlIHdlIGNhbm5vdCByZXR1cm4gaXQgKi8KKyAgICBhdl9wYWNrZXRfZnJlZV9zaWRlX2RhdGEoJnBrdCk7CisKKyAgICBpZiAoZnJhbWUgJiYgZnJhbWUtPmV4dGVuZGVkX2RhdGEgIT0gZnJhbWUtPmRhdGEpCisgICAgICAgIGF2X2ZyZWVwKCZmcmFtZS0+ZXh0ZW5kZWRfZGF0YSk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgcmV0dXJuIHJldCA/IHJldCA6IHBrdC5zaXplOworfQorCisjZW5kaWYKKworI2lmIEZGX0FQSV9PTERfRU5DT0RFX1ZJREVPCitpbnQgYXR0cmlidXRlX2FsaWduX2FyZyBhdmNvZGVjX2VuY29kZV92aWRlbyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljdCkKK3sKKyAgICBBVlBhY2tldCBwa3Q7CisgICAgaW50IHJldCwgZ290X3BhY2tldCA9IDA7CisKKyAgICBpZiAoYnVmX3NpemUgPCBGRl9NSU5fQlVGRkVSX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJidWZmZXIgc21hbGxlciB0aGFuIG1pbmltdW0gc2l6ZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKKyAgICBwa3QuZGF0YSA9IGJ1ZjsKKyAgICBwa3Quc2l6ZSA9IGJ1Zl9zaXplOworCisgICAgcmV0ID0gYXZjb2RlY19lbmNvZGVfdmlkZW8yKGF2Y3R4LCAmcGt0LCBwaWN0LCAmZ290X3BhY2tldCk7CisgICAgaWYgKCFyZXQgJiYgZ290X3BhY2tldCAmJiBhdmN0eC0+Y29kZWRfZnJhbWUpIHsKKyAgICAgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5wdHMgICAgICAgPSBwa3QucHRzOworICAgICAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9ICEhKHBrdC5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSk7CisgICAgfQorCisgICAgLyogZnJlZSBhbnkgc2lkZSBkYXRhIHNpbmNlIHdlIGNhbm5vdCByZXR1cm4gaXQgKi8KKyAgICBpZiAocGt0LnNpZGVfZGF0YV9lbGVtcyA+IDApIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwa3Quc2lkZV9kYXRhX2VsZW1zOyBpKyspCisgICAgICAgICAgICBhdl9mcmVlKHBrdC5zaWRlX2RhdGFbaV0uZGF0YSk7CisgICAgICAgIGF2X2ZyZWVwKCZwa3Quc2lkZV9kYXRhKTsKKyAgICAgICAgcGt0LnNpZGVfZGF0YV9lbGVtcyA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHJldCA/IHJldCA6IHBrdC5zaXplOworfQorCisjZW5kaWYKKworaW50IGF0dHJpYnV0ZV9hbGlnbl9hcmcgYXZjb2RlY19lbmNvZGVfdmlkZW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBpbnQgcmV0OworICAgIEFWUGFja2V0IHVzZXJfcGt0ID0gKmF2cGt0OworICAgIGludCBuZWVkc19yZWFsbG9jID0gIXVzZXJfcGt0LmRhdGE7CisKKyAgICAqZ290X3BhY2tldF9wdHIgPSAwOworCisgICAgaWYoQ09ORklHX0ZSQU1FX1RIUkVBRF9FTkNPREVSICYmCisgICAgICAgYXZjdHgtPmludGVybmFsLT5mcmFtZV90aHJlYWRfZW5jb2RlciAmJiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSZGRl9USFJFQURfRlJBTUUpKQorICAgICAgICByZXR1cm4gZmZfdGhyZWFkX3ZpZGVvX2VuY29kZV9mcmFtZShhdmN0eCwgYXZwa3QsIGZyYW1lLCBnb3RfcGFja2V0X3B0cik7CisKKyAgICBpZiAoKGF2Y3R4LT5mbGFncyZDT0RFQ19GTEFHX1BBU1MxKSAmJiBhdmN0eC0+c3RhdHNfb3V0KQorICAgICAgICBhdmN0eC0+c3RhdHNfb3V0WzBdID0gJ1wwJzsKKworICAgIGlmICghKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX0RFTEFZKSAmJiAhZnJhbWUpIHsKKyAgICAgICAgYXZfZnJlZV9wYWNrZXQoYXZwa3QpOworICAgICAgICBhdl9pbml0X3BhY2tldChhdnBrdCk7CisgICAgICAgIGF2cGt0LT5zaXplID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCAwLCBhdmN0eCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBhdl9hc3NlcnQwKGF2Y3R4LT5jb2RlYy0+ZW5jb2RlMik7CisKKyAgICByZXQgPSBhdmN0eC0+Y29kZWMtPmVuY29kZTIoYXZjdHgsIGF2cGt0LCBmcmFtZSwgZ290X3BhY2tldF9wdHIpOworICAgIGF2X2Fzc2VydDAocmV0IDw9IDApOworCisgICAgaWYgKGF2cGt0LT5kYXRhICYmIGF2cGt0LT5kYXRhID09IGF2Y3R4LT5pbnRlcm5hbC0+Ynl0ZV9idWZmZXIpIHsKKyAgICAgICAgbmVlZHNfcmVhbGxvYyA9IDA7CisgICAgICAgIGlmICh1c2VyX3BrdC5kYXRhKSB7CisgICAgICAgICAgICBpZiAodXNlcl9wa3Quc2l6ZSA+PSBhdnBrdC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIG1lbWNweSh1c2VyX3BrdC5kYXRhLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlByb3ZpZGVkIHBhY2tldCBpcyB0b28gc21hbGwsIG5lZWRzIHRvIGJlICVkXG4iLCBhdnBrdC0+c2l6ZSk7CisgICAgICAgICAgICAgICAgYXZwa3QtPnNpemUgPSB1c2VyX3BrdC5zaXplOworICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZwa3QtPmJ1ZiAgICAgID0gdXNlcl9wa3QuYnVmOworICAgICAgICAgICAgYXZwa3QtPmRhdGEgICAgID0gdXNlcl9wa3QuZGF0YTsKKyNpZiBGRl9BUElfREVTVFJVQ1RfUEFDS0VUCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICBhdnBrdC0+ZGVzdHJ1Y3QgPSB1c2VyX3BrdC5kZXN0cnVjdDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYXZfZHVwX3BhY2tldChhdnBrdCkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgaWYgKCEqZ290X3BhY2tldF9wdHIpCisgICAgICAgICAgICBhdnBrdC0+c2l6ZSA9IDA7CisgICAgICAgIGVsc2UgaWYgKCEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfREVMQVkpKQorICAgICAgICAgICAgYXZwa3QtPnB0cyA9IGF2cGt0LT5kdHMgPSBmcmFtZS0+cHRzOworCisgICAgICAgIGlmIChuZWVkc19yZWFsbG9jICYmIGF2cGt0LT5kYXRhKSB7CisgICAgICAgICAgICByZXQgPSBhdl9idWZmZXJfcmVhbGxvYygmYXZwa3QtPmJ1ZiwgYXZwa3QtPnNpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICBhdnBrdC0+ZGF0YSA9IGF2cGt0LT5idWYtPmRhdGE7CisgICAgICAgIH0KKworICAgICAgICBhdmN0eC0+ZnJhbWVfbnVtYmVyKys7CisgICAgfQorCisgICAgaWYgKHJldCA8IDAgfHwgISpnb3RfcGFja2V0X3B0cikKKyAgICAgICAgYXZfZnJlZV9wYWNrZXQoYXZwa3QpOworICAgIGVsc2UKKyAgICAgICAgYXZfcGFja2V0X21lcmdlX3NpZGVfZGF0YShhdnBrdCk7CisKKyAgICBlbW1zX2MoKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZjb2RlY19lbmNvZGVfc3VidGl0bGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlN1YnRpdGxlICpzdWIpCit7CisgICAgaW50IHJldDsKKyAgICBpZiAoc3ViLT5zdGFydF9kaXNwbGF5X3RpbWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJzdGFydF9kaXNwbGF5X3RpbWUgbXVzdCBiZSAwLlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXQgPSBhdmN0eC0+Y29kZWMtPmVuY29kZV9zdWIoYXZjdHgsIGJ1ZiwgYnVmX3NpemUsIHN1Yik7CisgICAgYXZjdHgtPmZyYW1lX251bWJlcisrOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQXR0ZW1wdCB0byBndWVzcyBwcm9wZXIgbW9ub3RvbmljIHRpbWVzdGFtcHMgZm9yIGRlY29kZWQgdmlkZW8gZnJhbWVzCisgKiB3aGljaCBtaWdodCBoYXZlIGluY29ycmVjdCB0aW1lcy4gSW5wdXQgdGltZXN0YW1wcyBtYXkgd3JhcCBhcm91bmQsIGluCisgKiB3aGljaCBjYXNlIHRoZSBvdXRwdXQgd2lsbCBhcyB3ZWxsLgorICoKKyAqIEBwYXJhbSBwdHMgdGhlIHB0cyBmaWVsZCBvZiB0aGUgZGVjb2RlZCBBVlBhY2tldCwgYXMgcGFzc2VkIHRocm91Z2gKKyAqIEFWRnJhbWUucGt0X3B0cworICogQHBhcmFtIGR0cyB0aGUgZHRzIGZpZWxkIG9mIHRoZSBkZWNvZGVkIEFWUGFja2V0CisgKiBAcmV0dXJuIG9uZSBvZiB0aGUgaW5wdXQgdmFsdWVzLCBtYXkgYmUgQVZfTk9QVFNfVkFMVUUKKyAqLworc3RhdGljIGludDY0X3QgZ3Vlc3NfY29ycmVjdF9wdHMoQVZDb2RlY0NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcmVvcmRlcmVkX3B0cywgaW50NjRfdCBkdHMpCit7CisgICAgaW50NjRfdCBwdHMgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIGlmIChkdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgY3R4LT5wdHNfY29ycmVjdGlvbl9udW1fZmF1bHR5X2R0cyArPSBkdHMgPD0gY3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X2R0czsKKyAgICAgICAgY3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X2R0cyA9IGR0czsKKyAgICB9IGVsc2UgaWYgKHJlb3JkZXJlZF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGN0eC0+cHRzX2NvcnJlY3Rpb25fbGFzdF9kdHMgPSByZW9yZGVyZWRfcHRzOworCisgICAgaWYgKHJlb3JkZXJlZF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgY3R4LT5wdHNfY29ycmVjdGlvbl9udW1fZmF1bHR5X3B0cyArPSByZW9yZGVyZWRfcHRzIDw9IGN0eC0+cHRzX2NvcnJlY3Rpb25fbGFzdF9wdHM7CisgICAgICAgIGN0eC0+cHRzX2NvcnJlY3Rpb25fbGFzdF9wdHMgPSByZW9yZGVyZWRfcHRzOworICAgIH0gZWxzZSBpZihkdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGN0eC0+cHRzX2NvcnJlY3Rpb25fbGFzdF9wdHMgPSBkdHM7CisKKyAgICBpZiAoKGN0eC0+cHRzX2NvcnJlY3Rpb25fbnVtX2ZhdWx0eV9wdHM8PWN0eC0+cHRzX2NvcnJlY3Rpb25fbnVtX2ZhdWx0eV9kdHMgfHwgZHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICYmIHJlb3JkZXJlZF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHB0cyA9IHJlb3JkZXJlZF9wdHM7CisgICAgZWxzZQorICAgICAgICBwdHMgPSBkdHM7CisKKyAgICByZXR1cm4gcHRzOworfQorCitzdGF0aWMgaW50IGFwcGx5X3BhcmFtX2NoYW5nZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBpbnQgc2l6ZSA9IDAsIHJldDsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhOworICAgIHVpbnQzMl90IGZsYWdzOworCisgICAgZGF0YSA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LCBBVl9QS1RfREFUQV9QQVJBTV9DSEFOR0UsICZzaXplKTsKKyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfUEFSQU1fQ0hBTkdFKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRoaXMgZGVjb2RlciBkb2VzIG5vdCBzdXBwb3J0IHBhcmFtZXRlciAiCisgICAgICAgICAgICAgICAiY2hhbmdlcywgYnV0IFBBUkFNX0NIQU5HRSBzaWRlIGRhdGEgd2FzIHNlbnQgdG8gaXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8IDQpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZsYWdzID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmZGF0YSk7CisgICAgc2l6ZSAtPSA0OworCisgICAgaWYgKGZsYWdzICYgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9DSEFOTkVMX0NPVU5UKSB7CisgICAgICAgIGlmIChzaXplIDwgNCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxzID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmZGF0YSk7CisgICAgICAgIHNpemUgLT0gNDsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9DSEFOTkVMX0xBWU9VVCkgeworICAgICAgICBpZiAoc2l6ZSA8IDgpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGJ5dGVzdHJlYW1fZ2V0X2xlNjQoJmRhdGEpOworICAgICAgICBzaXplIC09IDg7CisgICAgfQorICAgIGlmIChmbGFncyAmIEFWX1NJREVfREFUQV9QQVJBTV9DSEFOR0VfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgaWYgKHNpemUgPCA0KQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZkYXRhKTsKKyAgICAgICAgc2l6ZSAtPSA0OworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0RJTUVOU0lPTlMpIHsKKyAgICAgICAgaWYgKHNpemUgPCA4KQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBhdmN0eC0+d2lkdGggID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmZGF0YSk7CisgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZkYXRhKTsKKyAgICAgICAgc2l6ZSAtPSA4OworICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBBUkFNX0NIQU5HRSBzaWRlIGRhdGEgdG9vIHNtYWxsLlxuIik7CisgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKK3N0YXRpYyBpbnQgYWRkX21ldGFkYXRhX2Zyb21fc2lkZV9kYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHNpemU7CisgICAgY29uc3QgdWludDhfdCAqc2lkZV9tZXRhZGF0YTsKKworICAgIEFWRGljdGlvbmFyeSAqKmZyYW1lX21kID0gYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAoZnJhbWUpOworCisgICAgc2lkZV9tZXRhZGF0YSA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2Y3R4LT5pbnRlcm5hbC0+cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9TVFJJTkdTX01FVEFEQVRBLCAmc2l6ZSk7CisgICAgcmV0dXJuIGF2X3BhY2tldF91bnBhY2tfZGljdGlvbmFyeShzaWRlX21ldGFkYXRhLCBzaXplLCBmcmFtZV9tZCk7Cit9CisKK3N0YXRpYyBpbnQgdW5yZWZjb3VudF9mcmFtZShBVkNvZGVjSW50ZXJuYWwgKmF2Y2ksIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCByZXQ7CisKKyAgICAvKiBtb3ZlIHRoZSBvcmlnaW5hbCBmcmFtZSB0byBvdXIgYmFja3VwICovCisgICAgYXZfZnJhbWVfdW5yZWYoYXZjaS0+dG9fZnJlZSk7CisgICAgYXZfZnJhbWVfbW92ZV9yZWYoYXZjaS0+dG9fZnJlZSwgZnJhbWUpOworCisgICAgLyogbm93IGNvcHkgZXZlcnl0aGluZyBleGNlcHQgdGhlIEFWQnVmZmVyUmVmcyBiYWNrCisgICAgICogbm90ZSB0aGF0IHdlIG1ha2UgYSBDT1BZIG9mIHRoZSBzaWRlIGRhdGEsIHNvIGNhbGxpbmcgYXZfZnJhbWVfZnJlZSgpIG9uCisgICAgICogdGhlIGNhbGxlcidzIGZyYW1lIHdpbGwgd29yayBwcm9wZXJseSAqLworICAgIHJldCA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMoZnJhbWUsIGF2Y2ktPnRvX2ZyZWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgbWVtY3B5KGZyYW1lLT5kYXRhLCAgICAgYXZjaS0+dG9fZnJlZS0+ZGF0YSwgICAgIHNpemVvZihmcmFtZS0+ZGF0YSkpOworICAgIG1lbWNweShmcmFtZS0+bGluZXNpemUsIGF2Y2ktPnRvX2ZyZWUtPmxpbmVzaXplLCBzaXplb2YoZnJhbWUtPmxpbmVzaXplKSk7CisgICAgaWYgKGF2Y2ktPnRvX2ZyZWUtPmV4dGVuZGVkX2RhdGEgIT0gYXZjaS0+dG9fZnJlZS0+ZGF0YSkgeworICAgICAgICBpbnQgcGxhbmVzID0gYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGF2Y2ktPnRvX2ZyZWUpOworICAgICAgICBpbnQgc2l6ZSAgID0gcGxhbmVzICogc2l6ZW9mKCpmcmFtZS0+ZXh0ZW5kZWRfZGF0YSk7CisKKyAgICAgICAgaWYgKCFzaXplKSB7CisgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgICAgIH0KKworICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSA9IGF2X21hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCFmcmFtZS0+ZXh0ZW5kZWRfZGF0YSkgeworICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZnJhbWUtPmV4dGVuZGVkX2RhdGEsIGF2Y2ktPnRvX2ZyZWUtPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgICBzaXplKTsKKyAgICB9IGVsc2UKKyAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2RhdGEgPSBmcmFtZS0+ZGF0YTsKKworICAgIGZyYW1lLT5mb3JtYXQgICAgICAgICA9IGF2Y2ktPnRvX2ZyZWUtPmZvcm1hdDsKKyAgICBmcmFtZS0+d2lkdGggICAgICAgICAgPSBhdmNpLT50b19mcmVlLT53aWR0aDsKKyAgICBmcmFtZS0+aGVpZ2h0ICAgICAgICAgPSBhdmNpLT50b19mcmVlLT5oZWlnaHQ7CisgICAgZnJhbWUtPmNoYW5uZWxfbGF5b3V0ID0gYXZjaS0+dG9fZnJlZS0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgZnJhbWUtPm5iX3NhbXBsZXMgICAgID0gYXZjaS0+dG9fZnJlZS0+bmJfc2FtcGxlczsKKyAgICBhdl9mcmFtZV9zZXRfY2hhbm5lbHMoZnJhbWUsIGF2X2ZyYW1lX2dldF9jaGFubmVscyhhdmNpLT50b19mcmVlKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF0dHJpYnV0ZV9hbGlnbl9hcmcgYXZjb2RlY19kZWNvZGVfdmlkZW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9waWN0dXJlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZDb2RlY0ludGVybmFsICphdmNpID0gYXZjdHgtPmludGVybmFsOworICAgIGludCByZXQ7CisgICAgLy8gY29weSB0byBlbnN1cmUgd2UgZG8gbm90IGNoYW5nZSBhdnBrdAorICAgIEFWUGFja2V0IHRtcCA9ICphdnBrdDsKKworICAgIGlmICghYXZjdHgtPmNvZGVjKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGlmIChhdmN0eC0+Y29kZWMtPnR5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBtZWRpYSB0eXBlIGZvciB2aWRlb1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgKmdvdF9waWN0dXJlX3B0ciA9IDA7CisgICAgaWYgKChhdmN0eC0+Y29kZWRfd2lkdGggfHwgYXZjdHgtPmNvZGVkX2hlaWdodCkgJiYgYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+Y29kZWRfd2lkdGgsIGF2Y3R4LT5jb2RlZF9oZWlnaHQsIDAsIGF2Y3R4KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGF2X2ZyYW1lX3VucmVmKHBpY3R1cmUpOworCisgICAgaWYgKChhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIENPREVDX0NBUF9ERUxBWSkgfHwgYXZwa3QtPnNpemUgfHwgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpKSB7CisgICAgICAgIGludCBkaWRfc3BsaXQgPSBhdl9wYWNrZXRfc3BsaXRfc2lkZV9kYXRhKCZ0bXApOworICAgICAgICByZXQgPSBhcHBseV9wYXJhbV9jaGFuZ2UoYXZjdHgsICZ0bXApOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhcHBseWluZyBwYXJhbWV0ZXIgY2hhbmdlcy5cbiIpOworICAgICAgICAgICAgaWYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+cGt0ID0gJnRtcDsKKyAgICAgICAgaWYgKEhBVkVfVEhSRUFEUyAmJiBhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKQorICAgICAgICAgICAgcmV0ID0gZmZfdGhyZWFkX2RlY29kZV9mcmFtZShhdmN0eCwgcGljdHVyZSwgZ290X3BpY3R1cmVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXQgPSBhdmN0eC0+Y29kZWMtPmRlY29kZShhdmN0eCwgcGljdHVyZSwgZ290X3BpY3R1cmVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcCk7CisgICAgICAgICAgICBwaWN0dXJlLT5wa3RfZHRzID0gYXZwa3QtPmR0czsKKworICAgICAgICAgICAgaWYoIWF2Y3R4LT5oYXNfYl9mcmFtZXMpeworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3NldF9wa3RfcG9zKHBpY3R1cmUsIGF2cGt0LT5wb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9GSVhNRSB0aGVzZSBzaG91bGQgYmUgdW5kZXIgaWYoIWF2Y3R4LT5oYXNfYl9mcmFtZXMpCisgICAgICAgICAgICAvKiBnZXRfYnVmZmVyIGlzIHN1cHBvc2VkIHRvIHNldCBmcmFtZSBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICBpZiAoIShhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIENPREVDX0NBUF9EUjEpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFwaWN0dXJlLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkgICAgcGljdHVyZS0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgICAgICAgICAgICAgIGlmICghcGljdHVyZS0+d2lkdGgpICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUtPndpZHRoICAgICAgICAgICAgICAgPSBhdmN0eC0+d2lkdGg7CisgICAgICAgICAgICAgICAgaWYgKCFwaWN0dXJlLT5oZWlnaHQpICAgICAgICAgICAgICAgICAgICAgcGljdHVyZS0+aGVpZ2h0ICAgICAgICAgICAgICA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgICAgICAgICAgICAgaWYgKHBpY3R1cmUtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX05PTkUpICAgcGljdHVyZS0+Zm9ybWF0ICAgICAgICAgICAgICA9IGF2Y3R4LT5waXhfZm10OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFkZF9tZXRhZGF0YV9mcm9tX3NpZGVfZGF0YShhdmN0eCwgcGljdHVyZSk7CisKK2ZhaWw6CisgICAgICAgIGVtbXNfYygpOyAvL25lZWRlZCB0byBhdm9pZCBhbiBlbW1zX2MoKSBjYWxsIGJlZm9yZSBldmVyeSByZXR1cm47CisKKyAgICAgICAgYXZjdHgtPmludGVybmFsLT5wa3QgPSBOVUxMOworICAgICAgICBpZiAoZGlkX3NwbGl0KSB7CisgICAgICAgICAgICBhdl9wYWNrZXRfZnJlZV9zaWRlX2RhdGEoJnRtcCk7CisgICAgICAgICAgICBpZihyZXQgPT0gdG1wLnNpemUpCisgICAgICAgICAgICAgICAgcmV0ID0gYXZwa3QtPnNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmdvdF9waWN0dXJlX3B0cikgeworICAgICAgICAgICAgaWYgKCFhdmN0eC0+cmVmY291bnRlZF9mcmFtZXMpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyID0gdW5yZWZjb3VudF9mcmFtZShhdmNpLCBwaWN0dXJlKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZjdHgtPmZyYW1lX251bWJlcisrOworICAgICAgICAgICAgYXZfZnJhbWVfc2V0X2Jlc3RfZWZmb3J0X3RpbWVzdGFtcChwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWVzc19jb3JyZWN0X3B0cyhhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZS0+cGt0X3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZS0+cGt0X2R0cykpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKHBpY3R1cmUpOworICAgIH0gZWxzZQorICAgICAgICByZXQgPSAwOworCisgICAgLyogbWFueSBkZWNvZGVycyBhc3NpZ24gd2hvbGUgQVZGcmFtZXMsIHRodXMgb3ZlcndyaXRpbmcgZXh0ZW5kZWRfZGF0YTsKKyAgICAgKiBtYWtlIHN1cmUgaXQncyBzZXQgY29ycmVjdGx5ICovCisgICAgYXZfYXNzZXJ0MCghcGljdHVyZS0+ZXh0ZW5kZWRfZGF0YSB8fCBwaWN0dXJlLT5leHRlbmRlZF9kYXRhID09IHBpY3R1cmUtPmRhdGEpOworCisjaWYgRkZfQVBJX0FWQ1RYX1RJTUVCQVNFCisgICAgaWYgKGF2Y3R4LT5mcmFtZXJhdGUubnVtID4gMCAmJiBhdmN0eC0+ZnJhbWVyYXRlLmRlbiA+IDApCisgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UgPSBhdl9pbnZfcShhdl9tdWxfcShhdmN0eC0+ZnJhbWVyYXRlLCAoQVZSYXRpb25hbCl7YXZjdHgtPnRpY2tzX3Blcl9mcmFtZSwgMX0pKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJldDsKK30KKworI2lmIEZGX0FQSV9PTERfREVDT0RFX0FVRElPCitpbnQgYXR0cmlidXRlX2FsaWduX2FyZyBhdmNvZGVjX2RlY29kZV9hdWRpbzMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQxNl90ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZnJhbWVfc2l6ZV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpbnQgcmV0LCBnb3RfZnJhbWUgPSAwOworCisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpZiAoYXZjdHgtPmdldF9idWZmZXIgIT0gYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDdXN0b20gZ2V0X2J1ZmZlcigpIGZvciB1c2Ugd2l0aCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdmNvZGVjX2RlY29kZV9hdWRpbzMoKSBkZXRlY3RlZC4gT3ZlcnJpZGluZyB3aXRoIGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyXG4iKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQbGVhc2UgcG9ydCB5b3VyIGFwcGxpY2F0aW9uIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdmNvZGVjX2RlY29kZV9hdWRpbzQoKVxuIik7CisgICAgICAgIGF2Y3R4LT5nZXRfYnVmZmVyID0gYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXI7CisgICAgICAgIGF2Y3R4LT5yZWxlYXNlX2J1ZmZlciA9IGF2Y29kZWNfZGVmYXVsdF9yZWxlYXNlX2J1ZmZlcjsKKyAgICB9CisKKyAgICByZXQgPSBhdmNvZGVjX2RlY29kZV9hdWRpbzQoYXZjdHgsIGZyYW1lLCAmZ290X2ZyYW1lLCBhdnBrdCk7CisKKyAgICBpZiAocmV0ID49IDAgJiYgZ290X2ZyYW1lKSB7CisgICAgICAgIGludCBjaCwgcGxhbmVfc2l6ZTsKKyAgICAgICAgaW50IHBsYW5hciAgICA9IGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGF2Y3R4LT5zYW1wbGVfZm10KTsKKyAgICAgICAgaW50IGRhdGFfc2l6ZSA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKCZwbGFuZV9zaXplLCBhdmN0eC0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10LCAxKTsKKyAgICAgICAgaWYgKCpmcmFtZV9zaXplX3B0ciA8IGRhdGFfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJvdXRwdXQgYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBjdXJyZW50IGZyYW1lICglZCA8ICVkKVxuIiwgKmZyYW1lX3NpemVfcHRyLCBkYXRhX3NpemUpOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShzYW1wbGVzLCBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVswXSwgcGxhbmVfc2l6ZSk7CisKKyAgICAgICAgaWYgKHBsYW5hciAmJiBhdmN0eC0+Y2hhbm5lbHMgPiAxKSB7CisgICAgICAgICAgICB1aW50OF90ICpvdXQgPSAoKHVpbnQ4X3QgKilzYW1wbGVzKSArIHBsYW5lX3NpemU7CisgICAgICAgICAgICBmb3IgKGNoID0gMTsgY2ggPCBhdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkob3V0LCBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaF0sIHBsYW5lX3NpemUpOworICAgICAgICAgICAgICAgIG91dCArPSBwbGFuZV9zaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpmcmFtZV9zaXplX3B0ciA9IGRhdGFfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZnJhbWVfc2l6ZV9wdHIgPSAwOworICAgIH0KKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2Y29kZWNfZGVjb2RlX2F1ZGlvNChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkNvZGVjSW50ZXJuYWwgKmF2Y2kgPSBhdmN0eC0+aW50ZXJuYWw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisKKyAgICBpZiAoIWF2cGt0LT5kYXRhICYmIGF2cGt0LT5zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBwYWNrZXQ6IE5VTEwgZGF0YSwgc2l6ZSAhPSAwXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKCFhdmN0eC0+Y29kZWMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+dHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG1lZGlhIHR5cGUgZm9yIGF1ZGlvXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisKKyAgICBpZiAoKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX0RFTEFZKSB8fCBhdnBrdC0+c2l6ZSB8fCAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkpIHsKKyAgICAgICAgdWludDhfdCAqc2lkZTsKKyAgICAgICAgaW50IHNpZGVfc2l6ZTsKKyAgICAgICAgdWludDMyX3QgZGlzY2FyZF9wYWRkaW5nID0gMDsKKyAgICAgICAgdWludDhfdCBza2lwX3JlYXNvbiA9IDA7CisgICAgICAgIHVpbnQ4X3QgZGlzY2FyZF9yZWFzb24gPSAwOworICAgICAgICAvLyBjb3B5IHRvIGVuc3VyZSB3ZSBkbyBub3QgY2hhbmdlIGF2cGt0CisgICAgICAgIEFWUGFja2V0IHRtcCA9ICphdnBrdDsKKyAgICAgICAgaW50IGRpZF9zcGxpdCA9IGF2X3BhY2tldF9zcGxpdF9zaWRlX2RhdGEoJnRtcCk7CisgICAgICAgIHJldCA9IGFwcGx5X3BhcmFtX2NoYW5nZShhdmN0eCwgJnRtcCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFwcGx5aW5nIHBhcmFtZXRlciBjaGFuZ2VzLlxuIik7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgYXZjdHgtPmludGVybmFsLT5wa3QgPSAmdG1wOworICAgICAgICBpZiAoSEFWRV9USFJFQURTICYmIGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpCisgICAgICAgICAgICByZXQgPSBmZl90aHJlYWRfZGVjb2RlX2ZyYW1lKGF2Y3R4LCBmcmFtZSwgZ290X2ZyYW1lX3B0ciwgJnRtcCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0ID0gYXZjdHgtPmNvZGVjLT5kZWNvZGUoYXZjdHgsIGZyYW1lLCBnb3RfZnJhbWVfcHRyLCAmdG1wKTsKKyAgICAgICAgICAgIGZyYW1lLT5wa3RfZHRzID0gYXZwa3QtPmR0czsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID49IDAgJiYgKmdvdF9mcmFtZV9wdHIpIHsKKyAgICAgICAgICAgIGFkZF9tZXRhZGF0YV9mcm9tX3NpZGVfZGF0YShhdmN0eCwgZnJhbWUpOworICAgICAgICAgICAgYXZjdHgtPmZyYW1lX251bWJlcisrOworICAgICAgICAgICAgYXZfZnJhbWVfc2V0X2Jlc3RfZWZmb3J0X3RpbWVzdGFtcChmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Vlc3NfY29ycmVjdF9wdHMoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5wa3RfcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cGt0X2R0cykpOworICAgICAgICAgICAgaWYgKGZyYW1lLT5mb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9OT05FKQorICAgICAgICAgICAgICAgIGZyYW1lLT5mb3JtYXQgPSBhdmN0eC0+c2FtcGxlX2ZtdDsKKyAgICAgICAgICAgIGlmICghZnJhbWUtPmNoYW5uZWxfbGF5b3V0KQorICAgICAgICAgICAgICAgIGZyYW1lLT5jaGFubmVsX2xheW91dCA9IGF2Y3R4LT5jaGFubmVsX2xheW91dDsKKyAgICAgICAgICAgIGlmICghYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGZyYW1lKSkKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9zZXRfY2hhbm5lbHMoZnJhbWUsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgICAgICBpZiAoIWZyYW1lLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgICAgICBmcmFtZS0+c2FtcGxlX3JhdGUgPSBhdmN0eC0+c2FtcGxlX3JhdGU7CisgICAgICAgIH0KKworICAgICAgICBzaWRlPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdmN0eC0+aW50ZXJuYWwtPnBrdCwgQVZfUEtUX0RBVEFfU0tJUF9TQU1QTEVTLCAmc2lkZV9zaXplKTsKKyAgICAgICAgaWYoc2lkZSAmJiBzaWRlX3NpemU+PTEwKSB7CisgICAgICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyA9IEFWX1JMMzIoc2lkZSk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInNraXAgJWQgc2FtcGxlcyBkdWUgdG8gc2lkZSBkYXRhXG4iLAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzKTsKKyAgICAgICAgICAgIGRpc2NhcmRfcGFkZGluZyA9IEFWX1JMMzIoc2lkZSArIDQpOworICAgICAgICAgICAgc2tpcF9yZWFzb24gPSBBVl9STDgoc2lkZSArIDgpOworICAgICAgICAgICAgZGlzY2FyZF9yZWFzb24gPSBBVl9STDgoc2lkZSArIDkpOworICAgICAgICB9CisgICAgICAgIGlmIChhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyAmJiAqZ290X2ZyYW1lX3B0ciAmJgorICAgICAgICAgICAgIShhdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfU0tJUF9NQU5VQUwpKSB7CisgICAgICAgICAgICBpZihmcmFtZS0+bmJfc2FtcGxlcyA8PSBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyl7CisgICAgICAgICAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICAgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzIC09IGZyYW1lLT5uYl9zYW1wbGVzOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAic2tpcCB3aG9sZSBmcmFtZSwgc2tpcCBsZWZ0OiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9zYW1wbGVzX2NvcHkoZnJhbWUtPmV4dGVuZGVkX2RhdGEsIGZyYW1lLT5leHRlbmRlZF9kYXRhLCAwLCBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgLSBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcywgYXZjdHgtPmNoYW5uZWxzLCBmcmFtZS0+Zm9ybWF0KTsKKyAgICAgICAgICAgICAgICBpZihhdmN0eC0+cGt0X3RpbWViYXNlLm51bSAmJiBhdmN0eC0+c2FtcGxlX3JhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkaWZmX3RzID0gYXZfcmVzY2FsZV9xKGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIGF2Y3R4LT5zYW1wbGVfcmF0ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGt0X3RpbWViYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWUtPnBrdF9wdHMhPUFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnBrdF9wdHMgKz0gZGlmZl90czsKKyAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWUtPnBrdF9kdHMhPUFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnBrdF9kdHMgKz0gZGlmZl90czsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2X2ZyYW1lX2dldF9wa3RfZHVyYXRpb24oZnJhbWUpID49IGRpZmZfdHMpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV9zZXRfcGt0X2R1cmF0aW9uKGZyYW1lLCBhdl9mcmFtZV9nZXRfcGt0X2R1cmF0aW9uKGZyYW1lKSAtIGRpZmZfdHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJDb3VsZCBub3QgdXBkYXRlIHRpbWVzdGFtcHMgZm9yIHNraXBwZWQgc2FtcGxlcy5cbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInNraXAgJWQvJWQgc2FtcGxlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMsIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyAtPSBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlczsKKyAgICAgICAgICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGlzY2FyZF9wYWRkaW5nID4gMCAmJiBkaXNjYXJkX3BhZGRpbmcgPD0gZnJhbWUtPm5iX3NhbXBsZXMgJiYgKmdvdF9mcmFtZV9wdHIgJiYKKyAgICAgICAgICAgICEoYXZjdHgtPmZsYWdzMiAmIENPREVDX0ZMQUcyX1NLSVBfTUFOVUFMKSkgeworICAgICAgICAgICAgaWYgKGRpc2NhcmRfcGFkZGluZyA9PSBmcmFtZS0+bmJfc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoYXZjdHgtPnBrdF90aW1lYmFzZS5udW0gJiYgYXZjdHgtPnNhbXBsZV9yYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGlmZl90cyA9IGF2X3Jlc2NhbGVfcShmcmFtZS0+bmJfc2FtcGxlcyAtIGRpc2NhcmRfcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCBhdmN0eC0+c2FtcGxlX3JhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBrdF90aW1lYmFzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdl9mcmFtZV9nZXRfcGt0X2R1cmF0aW9uKGZyYW1lKSA+PSBkaWZmX3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfc2V0X3BrdF9kdXJhdGlvbihmcmFtZSwgYXZfZnJhbWVfZ2V0X3BrdF9kdXJhdGlvbihmcmFtZSkgLSBkaWZmX3RzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQ291bGQgbm90IHVwZGF0ZSB0aW1lc3RhbXBzIGZvciBkaXNjYXJkZWQgc2FtcGxlcy5cbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImRpc2NhcmQgJWQvJWQgc2FtcGxlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZF9wYWRkaW5nLCBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgLT0gZGlzY2FyZF9wYWRkaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChhdmN0eC0+ZmxhZ3MyICYgQ09ERUNfRkxBRzJfU0tJUF9NQU5VQUwpICYmICpnb3RfZnJhbWVfcHRyKSB7CisgICAgICAgICAgICBBVkZyYW1lU2lkZURhdGEgKmZzaWRlID0gYXZfZnJhbWVfbmV3X3NpZGVfZGF0YShmcmFtZSwgQVZfRlJBTUVfREFUQV9TS0lQX1NBTVBMRVMsIDEwKTsKKyAgICAgICAgICAgIGlmIChmc2lkZSkgeworICAgICAgICAgICAgICAgIEFWX1dMMzIoZnNpZGUtPmRhdGEsIGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBBVl9XTDMyKGZzaWRlLT5kYXRhICsgNCwgZGlzY2FyZF9wYWRkaW5nKTsKKyAgICAgICAgICAgICAgICBBVl9XTDgoZnNpZGUtPmRhdGEgKyA4LCBza2lwX3JlYXNvbik7CisgICAgICAgICAgICAgICAgQVZfV0w4KGZzaWRlLT5kYXRhICsgOSwgZGlzY2FyZF9yZWFzb24pOworICAgICAgICAgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorZmFpbDoKKyAgICAgICAgYXZjdHgtPmludGVybmFsLT5wa3QgPSBOVUxMOworICAgICAgICBpZiAoZGlkX3NwbGl0KSB7CisgICAgICAgICAgICBhdl9wYWNrZXRfZnJlZV9zaWRlX2RhdGEoJnRtcCk7CisgICAgICAgICAgICBpZihyZXQgPT0gdG1wLnNpemUpCisgICAgICAgICAgICAgICAgcmV0ID0gYXZwa3QtPnNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0ID49IDAgJiYgKmdvdF9mcmFtZV9wdHIpIHsKKyAgICAgICAgICAgIGlmICghYXZjdHgtPnJlZmNvdW50ZWRfZnJhbWVzKSB7CisgICAgICAgICAgICAgICAgaW50IGVyciA9IHVucmVmY291bnRfZnJhbWUoYXZjaSwgZnJhbWUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFVURjhfTUFYX0JZVEVTIDQgLyogNSBhbmQgNiBieXRlcyBzZXF1ZW5jZXMgc2hvdWxkIG5vdCBiZSB1c2VkICovCitzdGF0aWMgaW50IHJlY29kZV9zdWJ0aXRsZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqb3V0cGt0LCBjb25zdCBBVlBhY2tldCAqaW5wa3QpCit7CisjaWYgQ09ORklHX0lDT05WCisgICAgaWNvbnZfdCBjZCA9IChpY29udl90KS0xOworICAgIGludCByZXQgPSAwOworICAgIGNoYXIgKmluYiwgKm91dGI7CisgICAgc2l6ZV90IGlubCwgb3V0bDsKKyAgICBBVlBhY2tldCB0bXA7CisjZW5kaWYKKworICAgIGlmIChhdmN0eC0+c3ViX2NoYXJlbmNfbW9kZSAhPSBGRl9TVUJfQ0hBUkVOQ19NT0RFX1BSRV9ERUNPREVSIHx8IGlucGt0LT5zaXplID09IDApCisgICAgICAgIHJldHVybiAwOworCisjaWYgQ09ORklHX0lDT05WCisgICAgY2QgPSBpY29udl9vcGVuKCJVVEYtOCIsIGF2Y3R4LT5zdWJfY2hhcmVuYyk7CisgICAgYXZfYXNzZXJ0MChjZCAhPSAoaWNvbnZfdCktMSk7CisKKyAgICBpbmIgPSBpbnBrdC0+ZGF0YTsKKyAgICBpbmwgPSBpbnBrdC0+c2l6ZTsKKworICAgIGlmIChpbmwgPj0gSU5UX01BWCAvIFVURjhfTUFYX0JZVEVTIC0gRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlN1YnRpdGxlcyBwYWNrZXQgaXMgdG9vIGJpZyBmb3IgcmVjb2RpbmdcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIHJldCA9IGF2X25ld19wYWNrZXQoJnRtcCwgaW5sICogVVRGOF9NQVhfQllURVMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKyAgICBvdXRwa3QtPmJ1ZiAgPSB0bXAuYnVmOworICAgIG91dHBrdC0+ZGF0YSA9IHRtcC5kYXRhOworICAgIG91dHBrdC0+c2l6ZSA9IHRtcC5zaXplOworICAgIG91dGIgPSBvdXRwa3QtPmRhdGE7CisgICAgb3V0bCA9IG91dHBrdC0+c2l6ZTsKKworICAgIGlmIChpY29udihjZCwgJmluYiwgJmlubCwgJm91dGIsICZvdXRsKSA9PSAoc2l6ZV90KS0xIHx8CisgICAgICAgIGljb252KGNkLCBOVUxMLCBOVUxMLCAmb3V0YiwgJm91dGwpID09IChzaXplX3QpLTEgfHwKKyAgICAgICAgb3V0bCA+PSBvdXRwa3QtPnNpemUgfHwgaW5sICE9IDApIHsKKyAgICAgICAgcmV0ID0gRkZNSU4oQVZFUlJPUihlcnJubyksIC0xKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmVjb2RlIHN1YnRpdGxlIGV2ZW50IFwiJXNcIiAiCisgICAgICAgICAgICAgICAiZnJvbSAlcyB0byBVVEYtOFxuIiwgaW5wa3QtPmRhdGEsIGF2Y3R4LT5zdWJfY2hhcmVuYyk7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZ0bXApOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgb3V0cGt0LT5zaXplIC09IG91dGw7CisgICAgbWVtc2V0KG91dHBrdC0+ZGF0YSArIG91dHBrdC0+c2l6ZSwgMCwgb3V0bCk7CisKK2VuZDoKKyAgICBpZiAoY2QgIT0gKGljb252X3QpLTEpCisgICAgICAgIGljb252X2Nsb3NlKGNkKTsKKyAgICByZXR1cm4gcmV0OworI2Vsc2UKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInJlcXVlc3Rpbmcgc3VidGl0bGVzIHJlY29kaW5nIHdpdGhvdXQgaWNvbnYiKTsKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgdXRmOF9jaGVjayhjb25zdCB1aW50OF90ICpzdHIpCit7CisgICAgY29uc3QgdWludDhfdCAqYnl0ZTsKKyAgICB1aW50MzJfdCBjb2RlcG9pbnQsIG1pbjsKKworICAgIHdoaWxlICgqc3RyKSB7CisgICAgICAgIGJ5dGUgPSBzdHI7CisgICAgICAgIEdFVF9VVEY4KGNvZGVwb2ludCwgKihieXRlKyspLCByZXR1cm4gMDspOworICAgICAgICBtaW4gPSBieXRlIC0gc3RyID09IDEgPyAwIDogYnl0ZSAtIHN0ciA9PSAyID8gMHg4MCA6CisgICAgICAgICAgICAgIDEgPDwgKDUgKiAoYnl0ZSAtIHN0cikgLSA0KTsKKyAgICAgICAgaWYgKGNvZGVwb2ludCA8IG1pbiB8fCBjb2RlcG9pbnQgPj0gMHgxMTAwMDAgfHwKKyAgICAgICAgICAgIGNvZGVwb2ludCA9PSAweEZGRkUgLyogQk9NICovIHx8CisgICAgICAgICAgICBjb2RlcG9pbnQgPj0gMHhEODAwICYmIGNvZGVwb2ludCA8PSAweERGRkYgLyogc3Vycm9nYXRlcyAqLykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzdHIgPSBieXRlOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworaW50IGF2Y29kZWNfZGVjb2RlX3N1YnRpdGxlMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWU3VidGl0bGUgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3Rfc3ViX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGludCBpLCByZXQgPSAwOworCisgICAgaWYgKCFhdnBrdC0+ZGF0YSAmJiBhdnBrdC0+c2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgcGFja2V0OiBOVUxMIGRhdGEsIHNpemUgIT0gMFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmICghYXZjdHgtPmNvZGVjKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGlmIChhdmN0eC0+Y29kZWMtPnR5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBtZWRpYSB0eXBlIGZvciBzdWJ0aXRsZXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgICpnb3Rfc3ViX3B0ciA9IDA7CisgICAgZ2V0X3N1YnRpdGxlX2RlZmF1bHRzKHN1Yik7CisKKyAgICBpZiAoKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX0RFTEFZKSB8fCBhdnBrdC0+c2l6ZSkgeworICAgICAgICBBVlBhY2tldCBwa3RfcmVjb2RlZDsKKyAgICAgICAgQVZQYWNrZXQgdG1wID0gKmF2cGt0OworICAgICAgICBpbnQgZGlkX3NwbGl0ID0gYXZfcGFja2V0X3NwbGl0X3NpZGVfZGF0YSgmdG1wKTsKKyAgICAgICAgLy9hcHBseV9wYXJhbV9jaGFuZ2UoYXZjdHgsICZ0bXApOworCisgICAgICAgIGlmIChkaWRfc3BsaXQpIHsKKyAgICAgICAgICAgIC8qIEZGTUlOKCkgcHJldmVudHMgb3ZlcmZsb3cgaW4gY2FzZSB0aGUgcGFja2V0IHdhc24ndCBhbGxvY2F0ZWQgd2l0aAorICAgICAgICAgICAgICogcHJvcGVyIHBhZGRpbmcuCisgICAgICAgICAgICAgKiBJZiB0aGUgc2lkZSBkYXRhIGlzIHNtYWxsZXIgdGhhbiB0aGUgYnVmZmVyIHBhZGRpbmcgc2l6ZSwgdGhlCisgICAgICAgICAgICAgKiByZW1haW5pbmcgYnl0ZXMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGZpbGxlZCB3aXRoIHplcm9zIGJ5IHRoZQorICAgICAgICAgICAgICogb3JpZ2luYWwgcGFja2V0IGFsbG9jYXRpb24gYW55d2F5LiAqLworICAgICAgICAgICAgbWVtc2V0KHRtcC5kYXRhICsgdG1wLnNpemUsIDAsCisgICAgICAgICAgICAgICAgICAgRkZNSU4oYXZwa3QtPnNpemUgLSB0bXAuc2l6ZSwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkpOworICAgICAgICB9CisKKyAgICAgICAgcGt0X3JlY29kZWQgPSB0bXA7CisgICAgICAgIHJldCA9IHJlY29kZV9zdWJ0aXRsZShhdmN0eCwgJnBrdF9yZWNvZGVkLCAmdG1wKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICpnb3Rfc3ViX3B0ciA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnBrdCA9ICZwa3RfcmVjb2RlZDsKKworICAgICAgICAgICAgaWYgKGF2Y3R4LT5wa3RfdGltZWJhc2UuZGVuICYmIGF2cGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgc3ViLT5wdHMgPSBhdl9yZXNjYWxlX3EoYXZwa3QtPnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGt0X3RpbWViYXNlLCBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgICAgICByZXQgPSBhdmN0eC0+Y29kZWMtPmRlY29kZShhdmN0eCwgc3ViLCBnb3Rfc3ViX3B0ciwgJnBrdF9yZWNvZGVkKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDEoKHJldCA+PSAwKSA+PSAhISpnb3Rfc3ViX3B0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAhISpnb3Rfc3ViX3B0ciA+PSAhIXN1Yi0+bnVtX3JlY3RzKTsKKworICAgICAgICAgICAgaWYgKHN1Yi0+bnVtX3JlY3RzICYmICFzdWItPmVuZF9kaXNwbGF5X3RpbWUgJiYgYXZwa3QtPmR1cmF0aW9uICYmCisgICAgICAgICAgICAgICAgYXZjdHgtPnBrdF90aW1lYmFzZS5udW0pIHsKKyAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIG1zID0geyAxLCAxMDAwIH07CisgICAgICAgICAgICAgICAgc3ViLT5lbmRfZGlzcGxheV90aW1lID0gYXZfcmVzY2FsZV9xKGF2cGt0LT5kdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBrdF90aW1lYmFzZSwgbXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ViLT5udW1fcmVjdHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzdWItPnJlY3RzW2ldLT5hc3MgJiYgIXV0ZjhfY2hlY2soc3ViLT5yZWN0c1tpXS0+YXNzKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFVURi04IGluIGRlY29kZWQgc3VidGl0bGVzIHRleHQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXliZSBtaXNzaW5nIC1zdWJfY2hhcmVuYyBvcHRpb25cbiIpOworICAgICAgICAgICAgICAgICAgICBhdnN1YnRpdGxlX2ZyZWUoc3ViKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodG1wLmRhdGEgIT0gcGt0X3JlY29kZWQuZGF0YSkgeyAvLyBkaWQgd2UgcmVjb2RlPworICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgZnJvbSBkZXN0cm95aW5nIHNpZGUgZGF0YSBmcm9tIG9yaWdpbmFsIHBhY2tldCAqLworICAgICAgICAgICAgICAgIHBrdF9yZWNvZGVkLnNpZGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgcGt0X3JlY29kZWQuc2lkZV9kYXRhX2VsZW1zID0gMDsKKworICAgICAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZwa3RfcmVjb2RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX2Rlc2NyaXB0b3ItPnByb3BzICYgQVZfQ09ERUNfUFJPUF9CSVRNQVBfU1VCKQorICAgICAgICAgICAgICAgIHN1Yi0+Zm9ybWF0ID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5jb2RlY19kZXNjcmlwdG9yLT5wcm9wcyAmIEFWX0NPREVDX1BST1BfVEVYVF9TVUIpCisgICAgICAgICAgICAgICAgc3ViLT5mb3JtYXQgPSAxOworICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5wa3QgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpZF9zcGxpdCkgeworICAgICAgICAgICAgYXZfcGFja2V0X2ZyZWVfc2lkZV9kYXRhKCZ0bXApOworICAgICAgICAgICAgaWYocmV0ID09IHRtcC5zaXplKQorICAgICAgICAgICAgICAgIHJldCA9IGF2cGt0LT5zaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpnb3Rfc3ViX3B0cikKKyAgICAgICAgICAgIGF2Y3R4LT5mcmFtZV9udW1iZXIrKzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGF2c3VidGl0bGVfZnJlZShBVlN1YnRpdGxlICpzdWIpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3ViLT5udW1fcmVjdHM7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmc3ViLT5yZWN0c1tpXS0+cGljdC5kYXRhWzBdKTsKKyAgICAgICAgYXZfZnJlZXAoJnN1Yi0+cmVjdHNbaV0tPnBpY3QuZGF0YVsxXSk7CisgICAgICAgIGF2X2ZyZWVwKCZzdWItPnJlY3RzW2ldLT5waWN0LmRhdGFbMl0pOworICAgICAgICBhdl9mcmVlcCgmc3ViLT5yZWN0c1tpXS0+cGljdC5kYXRhWzNdKTsKKyAgICAgICAgYXZfZnJlZXAoJnN1Yi0+cmVjdHNbaV0tPnRleHQpOworICAgICAgICBhdl9mcmVlcCgmc3ViLT5yZWN0c1tpXS0+YXNzKTsKKyAgICAgICAgYXZfZnJlZXAoJnN1Yi0+cmVjdHNbaV0pOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZzdWItPnJlY3RzKTsKKworICAgIG1lbXNldChzdWIsIDAsIHNpemVvZihBVlN1YnRpdGxlKSk7Cit9CisKK2F2X2NvbGQgaW50IGF2Y29kZWNfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGlmICghYXZjdHgpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGF2Y29kZWNfaXNfb3BlbihhdmN0eCkpIHsKKyAgICAgICAgRnJhbWVQb29sICpwb29sID0gYXZjdHgtPmludGVybmFsLT5wb29sOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaWYgKENPTkZJR19GUkFNRV9USFJFQURfRU5DT0RFUiAmJgorICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5mcmFtZV90aHJlYWRfZW5jb2RlciAmJiBhdmN0eC0+dGhyZWFkX2NvdW50ID4gMSkgeworICAgICAgICAgICAgZmZfZnJhbWVfdGhyZWFkX2VuY29kZXJfZnJlZShhdmN0eCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBVkVfVEhSRUFEUyAmJiBhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHgpCisgICAgICAgICAgICBmZl90aHJlYWRfZnJlZShhdmN0eCk7CisgICAgICAgIGlmIChhdmN0eC0+Y29kZWMgJiYgYXZjdHgtPmNvZGVjLT5jbG9zZSkKKyAgICAgICAgICAgIGF2Y3R4LT5jb2RlYy0+Y2xvc2UoYXZjdHgpOworICAgICAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBOVUxMOworICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyX3NpemUgPSAwOworICAgICAgICBhdl9mcmVlcCgmYXZjdHgtPmludGVybmFsLT5ieXRlX2J1ZmZlcik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmF2Y3R4LT5pbnRlcm5hbC0+dG9fZnJlZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhwb29sLT5wb29scyk7IGkrKykKKyAgICAgICAgICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmcG9vbC0+cG9vbHNbaV0pOworICAgICAgICBhdl9mcmVlcCgmYXZjdHgtPmludGVybmFsLT5wb29sKTsKKworICAgICAgICBpZiAoYXZjdHgtPmh3YWNjZWwgJiYgYXZjdHgtPmh3YWNjZWwtPnVuaW5pdCkKKyAgICAgICAgICAgIGF2Y3R4LT5od2FjY2VsLT51bmluaXQoYXZjdHgpOworICAgICAgICBhdl9mcmVlcCgmYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YSk7CisKKyAgICAgICAgYXZfZnJlZXAoJmF2Y3R4LT5pbnRlcm5hbCk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5wcml2X2RhdGEgJiYgYXZjdHgtPmNvZGVjICYmIGF2Y3R4LT5jb2RlYy0+cHJpdl9jbGFzcykKKyAgICAgICAgYXZfb3B0X2ZyZWUoYXZjdHgtPnByaXZfZGF0YSk7CisgICAgYXZfb3B0X2ZyZWUoYXZjdHgpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+cHJpdl9kYXRhKTsKKyAgICBpZiAoYXZfY29kZWNfaXNfZW5jb2RlcihhdmN0eC0+Y29kZWMpKQorICAgICAgICBhdl9mcmVlcCgmYXZjdHgtPmV4dHJhZGF0YSk7CisgICAgYXZjdHgtPmNvZGVjID0gTlVMTDsKKyAgICBhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBBVkNvZGVjSUQgcmVtYXBfZGVwcmVjYXRlZF9jb2RlY19pZChlbnVtIEFWQ29kZWNJRCBpZCkKK3sKKyAgICBzd2l0Y2goaWQpeworICAgICAgICAvL1RoaXMgaXMgZm9yIGZ1dHVyZSBkZXByZWNhdGVjIGNvZGVjIGlkcywgaXRzIGVtcHR5IHNpbmNlCisgICAgICAgIC8vbGFzdCBtYWpvciBidW1wIGJ1dCB3aWxsIGZpbGwgdXAgYWdhaW4gb3ZlciB0aW1lLCBwbGVhc2UgZG9uJ3QgcmVtb3ZlIGl0CisvLyAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfVVRWSURFT19ERVBSRUNBVEVEOiByZXR1cm4gQVZfQ09ERUNfSURfVVRWSURFTzsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9CUkVOREVSX1BJWF9ERVBSRUNBVEVEICAgICAgICAgOiByZXR1cm4gQVZfQ09ERUNfSURfQlJFTkRFUl9QSVg7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfT1BVU19ERVBSRUNBVEVEICAgICAgICAgICAgICAgIDogcmV0dXJuIEFWX0NPREVDX0lEX09QVVM7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfVEFLX0RFUFJFQ0FURUQgICAgICAgICAgICAgICAgIDogcmV0dXJuIEFWX0NPREVDX0lEX1RBSzsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQUZfQVVESU9fREVQUkVDQVRFRCAgICAgICAgICAgOiByZXR1cm4gQVZfQ09ERUNfSURfUEFGX0FVRElPOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRMRV9QTEFOQVJfREVQUkVDQVRFRCAgICA6IHJldHVybiBBVl9DT0RFQ19JRF9QQ01fUzI0TEVfUExBTkFSOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJMRV9QTEFOQVJfREVQUkVDQVRFRCAgICA6IHJldHVybiBBVl9DT0RFQ19JRF9QQ01fUzMyTEVfUExBTkFSOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1ZJTUFfREVQUkVDQVRFRCAgICAgICAgICA6IHJldHVybiBBVl9DT0RFQ19JRF9BRFBDTV9WSU1BOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0VTQ0FQRTEzMF9ERVBSRUNBVEVEICAgICAgICAgICA6IHJldHVybiBBVl9DT0RFQ19JRF9FU0NBUEUxMzA7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfRVhSX0RFUFJFQ0FURUQgICAgICAgICAgICAgICAgIDogcmV0dXJuIEFWX0NPREVDX0lEX0VYUjsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9HMk1fREVQUkVDQVRFRCAgICAgICAgICAgICAgICAgOiByZXR1cm4gQVZfQ09ERUNfSURfRzJNOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BBRl9WSURFT19ERVBSRUNBVEVEICAgICAgICAgICA6IHJldHVybiBBVl9DT0RFQ19JRF9QQUZfVklERU87CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfV0VCUF9ERVBSRUNBVEVEICAgICAgICAgICAgICAgIDogcmV0dXJuIEFWX0NPREVDX0lEX1dFQlA7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfSEVWQ19ERVBSRUNBVEVEICAgICAgICAgICAgICAgIDogcmV0dXJuIEFWX0NPREVDX0lEX0hFVkM7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVZDMV9ERVBSRUNBVEVEICAgICAgICAgICAgICAgIDogcmV0dXJuIEFWX0NPREVDX0lEX01WQzE7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVZDMl9ERVBSRUNBVEVEICAgICAgICAgICAgICAgIDogcmV0dXJuIEFWX0NPREVDX0lEX01WQzI7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfU0FOTV9ERVBSRUNBVEVEICAgICAgICAgICAgICAgIDogcmV0dXJuIEFWX0NPREVDX0lEX1NBTk07CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfU0dJUkxFX0RFUFJFQ0FURUQgICAgICAgICAgICAgIDogcmV0dXJuIEFWX0NPREVDX0lEX1NHSVJMRTsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDdfREVQUkVDQVRFRCAgICAgICAgICAgICAgICAgOiByZXR1cm4gQVZfQ09ERUNfSURfVlA3OworICAgICAgICBkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJldHVybiBpZDsKKyAgICB9Cit9CisKK3N0YXRpYyBBVkNvZGVjICpmaW5kX2VuY2RlYyhlbnVtIEFWQ29kZWNJRCBpZCwgaW50IGVuY29kZXIpCit7CisgICAgQVZDb2RlYyAqcCwgKmV4cGVyaW1lbnRhbCA9IE5VTEw7CisgICAgcCA9IGZpcnN0X2F2Y29kZWM7CisgICAgaWQ9IHJlbWFwX2RlcHJlY2F0ZWRfY29kZWNfaWQoaWQpOworICAgIHdoaWxlIChwKSB7CisgICAgICAgIGlmICgoZW5jb2RlciA/IGF2X2NvZGVjX2lzX2VuY29kZXIocCkgOiBhdl9jb2RlY19pc19kZWNvZGVyKHApKSAmJgorICAgICAgICAgICAgcC0+aWQgPT0gaWQpIHsKKyAgICAgICAgICAgIGlmIChwLT5jYXBhYmlsaXRpZXMgJiBDT0RFQ19DQVBfRVhQRVJJTUVOVEFMICYmICFleHBlcmltZW50YWwpIHsKKyAgICAgICAgICAgICAgICBleHBlcmltZW50YWwgPSBwOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBleHBlcmltZW50YWw7Cit9CisKK0FWQ29kZWMgKmF2Y29kZWNfZmluZF9lbmNvZGVyKGVudW0gQVZDb2RlY0lEIGlkKQoreworICAgIHJldHVybiBmaW5kX2VuY2RlYyhpZCwgMSk7Cit9CisKK0FWQ29kZWMgKmF2Y29kZWNfZmluZF9lbmNvZGVyX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBBVkNvZGVjICpwOworICAgIGlmICghbmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IGZpcnN0X2F2Y29kZWM7CisgICAgd2hpbGUgKHApIHsKKyAgICAgICAgaWYgKGF2X2NvZGVjX2lzX2VuY29kZXIocCkgJiYgc3RyY21wKG5hbWUsIHAtPm5hbWUpID09IDApCisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitBVkNvZGVjICphdmNvZGVjX2ZpbmRfZGVjb2RlcihlbnVtIEFWQ29kZWNJRCBpZCkKK3sKKyAgICByZXR1cm4gZmluZF9lbmNkZWMoaWQsIDApOworfQorCitBVkNvZGVjICphdmNvZGVjX2ZpbmRfZGVjb2Rlcl9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgQVZDb2RlYyAqcDsKKyAgICBpZiAoIW5hbWUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSBmaXJzdF9hdmNvZGVjOworICAgIHdoaWxlIChwKSB7CisgICAgICAgIGlmIChhdl9jb2RlY19pc19kZWNvZGVyKHApICYmIHN0cmNtcChuYW1lLCBwLT5uYW1lKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIHAgPSBwLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqYXZjb2RlY19nZXRfbmFtZShlbnVtIEFWQ29kZWNJRCBpZCkKK3sKKyAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqY2Q7CisgICAgQVZDb2RlYyAqY29kZWM7CisKKyAgICBpZiAoaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgcmV0dXJuICJub25lIjsKKyAgICBjZCA9IGF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoaWQpOworICAgIGlmIChjZCkKKyAgICAgICAgcmV0dXJuIGNkLT5uYW1lOworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIkNvZGVjIDB4JXggaXMgbm90IGluIHRoZSBmdWxsIGxpc3QuXG4iLCBpZCk7CisgICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihpZCk7CisgICAgaWYgKGNvZGVjKQorICAgICAgICByZXR1cm4gY29kZWMtPm5hbWU7CisgICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZW5jb2RlcihpZCk7CisgICAgaWYgKGNvZGVjKQorICAgICAgICByZXR1cm4gY29kZWMtPm5hbWU7CisgICAgcmV0dXJuICJ1bmtub3duX2NvZGVjIjsKK30KKworc2l6ZV90IGF2X2dldF9jb2RlY190YWdfc3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplLCB1bnNpZ25lZCBpbnQgY29kZWNfdGFnKQoreworICAgIGludCBpLCBsZW4sIHJldCA9IDA7CisKKyNkZWZpbmUgVEFHX1BSSU5UKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCh4KSA+PSAnMCcgJiYgKHgpIDw9ICc5JykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCh4KSA+PSAnYScgJiYgKHgpIDw9ICd6JykgfHwgKCh4KSA+PSAnQScgJiYgKHgpIDw9ICdaJykgfHwgIFwKKyAgICAgKCh4KSA9PSAnLicgfHwgKHgpID09ICcgJyB8fCAoeCkgPT0gJy0nIHx8ICh4KSA9PSAnXycpKQorCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBsZW4gPSBzbnByaW50ZihidWYsIGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBUQUdfUFJJTlQoY29kZWNfdGFnICYgMHhGRikgPyAiJWMiIDogIlslZF0iLCBjb2RlY190YWcgJiAweEZGKTsKKyAgICAgICAgYnVmICAgICAgICArPSBsZW47CisgICAgICAgIGJ1Zl9zaXplICAgID0gYnVmX3NpemUgPiBsZW4gPyBidWZfc2l6ZSAtIGxlbiA6IDA7CisgICAgICAgIHJldCAgICAgICAgKz0gbGVuOworICAgICAgICBjb2RlY190YWcgPj49IDg7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXZjb2RlY19zdHJpbmcoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIEFWQ29kZWNDb250ZXh0ICplbmMsIGludCBlbmNvZGUpCit7CisgICAgY29uc3QgY2hhciAqY29kZWNfdHlwZTsKKyAgICBjb25zdCBjaGFyICpjb2RlY19uYW1lOworICAgIGNvbnN0IGNoYXIgKnByb2ZpbGUgPSBOVUxMOworICAgIGNvbnN0IEFWQ29kZWMgKnA7CisgICAgaW50IGJpdHJhdGU7CisgICAgaW50IG5ld19saW5lID0gMDsKKyAgICBBVlJhdGlvbmFsIGRpc3BsYXlfYXNwZWN0X3JhdGlvOworICAgIGNvbnN0IGNoYXIgKnNlcGFyYXRvciA9IGVuYy0+ZHVtcF9zZXBhcmF0b3IgPyAoY29uc3QgY2hhciAqKWVuYy0+ZHVtcF9zZXBhcmF0b3IgOiAiLCAiOworCisgICAgaWYgKCFidWYgfHwgYnVmX3NpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIGNvZGVjX3R5cGUgPSBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoZW5jLT5jb2RlY190eXBlKTsKKyAgICBjb2RlY19uYW1lID0gYXZjb2RlY19nZXRfbmFtZShlbmMtPmNvZGVjX2lkKTsKKyAgICBpZiAoZW5jLT5wcm9maWxlICE9IEZGX1BST0ZJTEVfVU5LTk9XTikgeworICAgICAgICBpZiAoZW5jLT5jb2RlYykKKyAgICAgICAgICAgIHAgPSBlbmMtPmNvZGVjOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwID0gZW5jb2RlID8gYXZjb2RlY19maW5kX2VuY29kZXIoZW5jLT5jb2RlY19pZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19maW5kX2RlY29kZXIoZW5jLT5jb2RlY19pZCk7CisgICAgICAgIGlmIChwKQorICAgICAgICAgICAgcHJvZmlsZSA9IGF2X2dldF9wcm9maWxlX25hbWUocCwgZW5jLT5wcm9maWxlKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWYsIGJ1Zl9zaXplLCAiJXM6ICVzIiwgY29kZWNfdHlwZSA/IGNvZGVjX3R5cGUgOiAidW5rbm93biIsCisgICAgICAgICAgICAgY29kZWNfbmFtZSk7CisgICAgYnVmWzBdIF49ICdhJyBeICdBJzsgLyogZmlyc3QgbGV0dGVyIGluIHVwcGVyY2FzZSAqLworCisgICAgaWYgKGVuYy0+Y29kZWMgJiYgc3RyY21wKGVuYy0+Y29kZWMtPm5hbWUsIGNvZGVjX25hbWUpKQorICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgYnVmX3NpemUgLSBzdHJsZW4oYnVmKSwgIiAoJXMpIiwgZW5jLT5jb2RlYy0+bmFtZSk7CisKKyAgICBpZiAocHJvZmlsZSkKKyAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIGJ1Zl9zaXplIC0gc3RybGVuKGJ1ZiksICIgKCVzKSIsIHByb2ZpbGUpOworCisgICAgaWYgKGVuYy0+Y29kZWNfdGFnKSB7CisgICAgICAgIGNoYXIgdGFnX2J1ZlszMl07CisgICAgICAgIGF2X2dldF9jb2RlY190YWdfc3RyaW5nKHRhZ19idWYsIHNpemVvZih0YWdfYnVmKSwgZW5jLT5jb2RlY190YWcpOworICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgYnVmX3NpemUgLSBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgIiAoJXMgLyAweCUwNFgpIiwgdGFnX2J1ZiwgZW5jLT5jb2RlY190YWcpOworICAgIH0KKworICAgIHN3aXRjaCAoZW5jLT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgZGV0YWlsWzI1Nl0gPSAiKCI7CisKKyAgICAgICAgICAgIGF2X3N0cmxjYXQoYnVmLCBzZXBhcmF0b3IsIGJ1Zl9zaXplKTsKKworICAgICAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIGJ1Zl9zaXplIC0gc3RybGVuKGJ1ZiksCisgICAgICAgICAgICAgICAgICIlcyIsIGVuYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUgPyAibm9uZSIgOgorICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShlbmMtPnBpeF9mbXQpKTsKKyAgICAgICAgICAgIGlmIChlbmMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgJiYgZW5jLT5waXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORSAmJgorICAgICAgICAgICAgICAgIGVuYy0+Yml0c19wZXJfcmF3X3NhbXBsZSA8PSBhdl9waXhfZm10X2Rlc2NfZ2V0KGVuYy0+cGl4X2ZtdCktPmNvbXBbMF0uZGVwdGhfbWludXMxKQorICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGRldGFpbCwgc2l6ZW9mKGRldGFpbCksICIlZCBicGMsICIsIGVuYy0+Yml0c19wZXJfcmF3X3NhbXBsZSk7CisgICAgICAgICAgICBpZiAoZW5jLT5jb2xvcl9yYW5nZSAhPSBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRCkKKyAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihkZXRhaWwsIHNpemVvZihkZXRhaWwpLCAiJXMsICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfY29sb3JfcmFuZ2VfbmFtZShlbmMtPmNvbG9yX3JhbmdlKSk7CisKKyAgICAgICAgICAgIGlmIChlbmMtPmNvbG9yc3BhY2UgIT0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEIHx8CisgICAgICAgICAgICAgICAgZW5jLT5jb2xvcl9wcmltYXJpZXMgIT0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEIHx8CisgICAgICAgICAgICAgICAgZW5jLT5jb2xvcl90cmMgIT0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICAgICAgaWYgKGVuYy0+Y29sb3JzcGFjZSAhPSAoaW50KWVuYy0+Y29sb3JfcHJpbWFyaWVzIHx8CisgICAgICAgICAgICAgICAgICAgIGVuYy0+Y29sb3JzcGFjZSAhPSAoaW50KWVuYy0+Y29sb3JfdHJjKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld19saW5lID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoZGV0YWlsLCBzaXplb2YoZGV0YWlsKSwgIiVzLyVzLyVzLCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9jb2xvcl9zcGFjZV9uYW1lKGVuYy0+Y29sb3JzcGFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2NvbG9yX3ByaW1hcmllc19uYW1lKGVuYy0+Y29sb3JfcHJpbWFyaWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfY29sb3JfdHJhbnNmZXJfbmFtZShlbmMtPmNvbG9yX3RyYykpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihkZXRhaWwsIHNpemVvZihkZXRhaWwpLCAiJXMsICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9jb2xvcnNwYWNlX25hbWUoZW5jLT5jb2xvcnNwYWNlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdl9sb2dfZ2V0X2xldmVsKCkgPj0gQVZfTE9HX0RFQlVHICYmCisgICAgICAgICAgICAgICAgZW5jLT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uICE9IEFWQ0hST01BX0xPQ19VTlNQRUNJRklFRCkKKyAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihkZXRhaWwsIHNpemVvZihkZXRhaWwpLCAiJXMsICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfY2hyb21hX2xvY2F0aW9uX25hbWUoZW5jLT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uKSk7CisKKyAgICAgICAgICAgIGlmIChzdHJsZW4oZGV0YWlsKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBkZXRhaWxbc3RybGVuKGRldGFpbCkgLSAyXSA9IDA7CisgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmLCBidWZfc2l6ZSwgIiVzKSIsIGRldGFpbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5jLT53aWR0aCkgeworICAgICAgICAgICAgYXZfc3RybGNhdChidWYsIG5ld19saW5lID8gc2VwYXJhdG9yIDogIiwgIiwgYnVmX3NpemUpOworCisgICAgICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgYnVmX3NpemUgLSBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICIlZHglZCIsCisgICAgICAgICAgICAgICAgICAgICBlbmMtPndpZHRoLCBlbmMtPmhlaWdodCk7CisKKyAgICAgICAgICAgIGlmIChhdl9sb2dfZ2V0X2xldmVsKCkgPj0gQVZfTE9HX1ZFUkJPU0UgJiYKKyAgICAgICAgICAgICAgICAoZW5jLT53aWR0aCAhPSBlbmMtPmNvZGVkX3dpZHRoIHx8CisgICAgICAgICAgICAgICAgIGVuYy0+aGVpZ2h0ICE9IGVuYy0+Y29kZWRfaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgYnVmX3NpemUgLSBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICglZHglZCkiLCBlbmMtPmNvZGVkX3dpZHRoLCBlbmMtPmNvZGVkX2hlaWdodCk7CisKKyAgICAgICAgICAgIGlmIChlbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKSB7CisgICAgICAgICAgICAgICAgYXZfcmVkdWNlKCZkaXNwbGF5X2FzcGVjdF9yYXRpby5udW0sICZkaXNwbGF5X2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+d2lkdGggKiBlbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPmhlaWdodCAqIGVuYy0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgYnVmX3NpemUgLSBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIFtTQVIgJWQ6JWQgREFSICVkOiVkXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2FzcGVjdF9yYXRpby5udW0sIGRpc3BsYXlfYXNwZWN0X3JhdGlvLmRlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZfbG9nX2dldF9sZXZlbCgpID49IEFWX0xPR19ERUJVRykgeworICAgICAgICAgICAgICAgIGludCBnID0gYXZfZ2NkKGVuYy0+dGltZV9iYXNlLm51bSwgZW5jLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgYnVmX3NpemUgLSBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiLCAlZC8lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT50aW1lX2Jhc2UubnVtIC8gZywgZW5jLT50aW1lX2Jhc2UuZGVuIC8gZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuY29kZSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIGJ1Zl9zaXplIC0gc3RybGVuKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAiLCBxPSVkLSVkIiwgZW5jLT5xbWluLCBlbmMtPnFtYXgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBhdl9zdHJsY2F0KGJ1Ziwgc2VwYXJhdG9yLCBidWZfc2l6ZSk7CisKKyAgICAgICAgaWYgKGVuYy0+c2FtcGxlX3JhdGUpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBidWZfc2l6ZSAtIHN0cmxlbihidWYpLAorICAgICAgICAgICAgICAgICAgICAgIiVkIEh6LCAiLCBlbmMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgfQorICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1ZiArIHN0cmxlbihidWYpLCBidWZfc2l6ZSAtIHN0cmxlbihidWYpLCBlbmMtPmNoYW5uZWxzLCBlbmMtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgaWYgKGVuYy0+c2FtcGxlX2ZtdCAhPSBBVl9TQU1QTEVfRk1UX05PTkUpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBidWZfc2l6ZSAtIHN0cmxlbihidWYpLAorICAgICAgICAgICAgICAgICAgICAgIiwgJXMiLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGVuYy0+c2FtcGxlX2ZtdCkpOworICAgICAgICB9CisgICAgICAgIGlmICggICBlbmMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPiAwCisgICAgICAgICAgICAmJiBlbmMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgIT0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoZW5jLT5zYW1wbGVfZm10KSAqIDgpCisgICAgICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgYnVmX3NpemUgLSBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICIgKCVkIGJpdCkiLCBlbmMtPmJpdHNfcGVyX3Jhd19zYW1wbGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOgorICAgICAgICBpZiAoYXZfbG9nX2dldF9sZXZlbCgpID49IEFWX0xPR19ERUJVRykgeworICAgICAgICAgICAgaW50IGcgPSBhdl9nY2QoZW5jLT50aW1lX2Jhc2UubnVtLCBlbmMtPnRpbWVfYmFzZS5kZW4pOworICAgICAgICAgICAgaWYgKGcpCisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIGJ1Zl9zaXplIC0gc3RybGVuKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiwgJWQvJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+dGltZV9iYXNlLm51bSAvIGcsIGVuYy0+dGltZV9iYXNlLmRlbiAvIGcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgorICAgICAgICBpZiAoZW5jLT53aWR0aCkKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBidWZfc2l6ZSAtIHN0cmxlbihidWYpLAorICAgICAgICAgICAgICAgICAgICAgIiwgJWR4JWQiLCBlbmMtPndpZHRoLCBlbmMtPmhlaWdodCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGVuY29kZSkgeworICAgICAgICBpZiAoZW5jLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzEpCisgICAgICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgYnVmX3NpemUgLSBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICIsIHBhc3MgMSIpOworICAgICAgICBpZiAoZW5jLT5mbGFncyAmIENPREVDX0ZMQUdfUEFTUzIpCisgICAgICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgYnVmX3NpemUgLSBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICIsIHBhc3MgMiIpOworICAgIH0KKyAgICBiaXRyYXRlID0gZ2V0X2JpdF9yYXRlKGVuYyk7CisgICAgaWYgKGJpdHJhdGUgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgYnVmX3NpemUgLSBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgIiwgJWQga2IvcyIsIGJpdHJhdGUgLyAxMDAwKTsKKyAgICB9IGVsc2UgaWYgKGVuYy0+cmNfbWF4X3JhdGUgPiAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBidWZfc2l6ZSAtIHN0cmxlbihidWYpLAorICAgICAgICAgICAgICAgICAiLCBtYXguICVkIGtiL3MiLCBlbmMtPnJjX21heF9yYXRlIC8gMTAwMCk7CisgICAgfQorfQorCitjb25zdCBjaGFyICphdl9nZXRfcHJvZmlsZV9uYW1lKGNvbnN0IEFWQ29kZWMgKmNvZGVjLCBpbnQgcHJvZmlsZSkKK3sKKyAgICBjb25zdCBBVlByb2ZpbGUgKnA7CisgICAgaWYgKHByb2ZpbGUgPT0gRkZfUFJPRklMRV9VTktOT1dOIHx8ICFjb2RlYy0+cHJvZmlsZXMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yIChwID0gY29kZWMtPnByb2ZpbGVzOyBwLT5wcm9maWxlICE9IEZGX1BST0ZJTEVfVU5LTk9XTjsgcCsrKQorICAgICAgICBpZiAocC0+cHJvZmlsZSA9PSBwcm9maWxlKQorICAgICAgICAgICAgcmV0dXJuIHAtPm5hbWU7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordW5zaWduZWQgYXZjb2RlY192ZXJzaW9uKHZvaWQpCit7CisvLyAgICBhdl9hc3NlcnQwKEFWX0NPREVDX0lEX1Y0MTA9PTE2NCk7CisgICAgYXZfYXNzZXJ0MChBVl9DT0RFQ19JRF9QQ01fUzhfUExBTkFSPT02NTU2Myk7CisgICAgYXZfYXNzZXJ0MChBVl9DT0RFQ19JRF9BRFBDTV9HNzIyPT02OTY2MCk7CisvLyAgICAgYXZfYXNzZXJ0MChBVl9DT0RFQ19JRF9CTVZfQVVESU89PTg2MDcxKTsKKyAgICBhdl9hc3NlcnQwKEFWX0NPREVDX0lEX1NSVD09OTQyMTYpOworICAgIGF2X2Fzc2VydDAoTElCQVZDT0RFQ19WRVJTSU9OX01JQ1JPID49IDEwMCk7CisKKyAgICBhdl9hc3NlcnQwKENPREVDX0lEX0NMTEMgPT0gQVZfQ09ERUNfSURfQ0xMQyk7CisgICAgYXZfYXNzZXJ0MChDT0RFQ19JRF9QQ01fUzhfUExBTkFSID09IEFWX0NPREVDX0lEX1BDTV9TOF9QTEFOQVIpOworICAgIGF2X2Fzc2VydDAoQ09ERUNfSURfQURQQ01fSU1BX0FQQyA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQVBDKTsKKyAgICBhdl9hc3NlcnQwKENPREVDX0lEX0lMQkMgPT0gQVZfQ09ERUNfSURfSUxCQyk7CisgICAgYXZfYXNzZXJ0MChDT0RFQ19JRF9TUlQgPT0gQVZfQ09ERUNfSURfU1JUKTsKKyAgICByZXR1cm4gTElCQVZDT0RFQ19WRVJTSU9OX0lOVDsKK30KKworY29uc3QgY2hhciAqYXZjb2RlY19jb25maWd1cmF0aW9uKHZvaWQpCit7CisgICAgcmV0dXJuIEZGTVBFR19DT05GSUdVUkFUSU9OOworfQorCitjb25zdCBjaGFyICphdmNvZGVjX2xpY2Vuc2Uodm9pZCkKK3sKKyNkZWZpbmUgTElDRU5TRV9QUkVGSVggImxpYmF2Y29kZWMgbGljZW5zZTogIgorICAgIHJldHVybiBMSUNFTlNFX1BSRUZJWCBGRk1QRUdfTElDRU5TRSArIHNpemVvZihMSUNFTlNFX1BSRUZJWCkgLSAxOworfQorCit2b2lkIGF2Y29kZWNfZmx1c2hfYnVmZmVycyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKEhBVkVfVEhSRUFEUyAmJiBhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKQorICAgICAgICBmZl90aHJlYWRfZmx1c2goYXZjdHgpOworICAgIGVsc2UgaWYgKGF2Y3R4LT5jb2RlYy0+Zmx1c2gpCisgICAgICAgIGF2Y3R4LT5jb2RlYy0+Zmx1c2goYXZjdHgpOworCisgICAgYXZjdHgtPnB0c19jb3JyZWN0aW9uX2xhc3RfcHRzID0KKyAgICBhdmN0eC0+cHRzX2NvcnJlY3Rpb25fbGFzdF9kdHMgPSBJTlQ2NF9NSU47CisKKyAgICBpZiAoIWF2Y3R4LT5yZWZjb3VudGVkX2ZyYW1lcykKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoYXZjdHgtPmludGVybmFsLT50b19mcmVlKTsKK30KKworaW50IGF2X2dldF9leGFjdF9iaXRzX3Blcl9zYW1wbGUoZW51bSBBVkNvZGVjSUQgY29kZWNfaWQpCit7CisgICAgc3dpdGNoIChjb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfOFNWWF9FWFA6CisgICAgY2FzZSBBVl9DT0RFQ19JRF84U1ZYX0ZJQjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0NUOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX0FQQzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9FQV9TRUFEOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX09LSToKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9XUzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0c3MjI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9ZQU1BSEE6CisgICAgICAgIHJldHVybiA0OworICAgIGNhc2UgQVZfQ09ERUNfSURfRFNEX0xTQkY6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9EU0RfTVNCRjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0RTRF9MU0JGX1BMQU5BUjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0RTRF9NU0JGX1BMQU5BUjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9BTEFXOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX01VTEFXOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M4OgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M4X1BMQU5BUjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VODoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9aT1JLOgorICAgICAgICByZXR1cm4gODsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZCRV9QTEFOQVI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEVfUExBTkFSOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1UxNkJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1UxNkxFOgorICAgICAgICByZXR1cm4gMTY7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzI0REFVRDoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRMRV9QTEFOQVI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTI0QkU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTI0TEU6CisgICAgICAgIHJldHVybiAyNDsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJMRV9QTEFOQVI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTMyQkU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTMyTEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjMyQkU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjMyTEU6CisgICAgICAgIHJldHVybiAzMjsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRMRToKKyAgICAgICAgcmV0dXJuIDY0OworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworZW51bSBBVkNvZGVjSUQgYXZfZ2V0X3BjbV9jb2RlYyhlbnVtIEFWU2FtcGxlRm9ybWF0IGZtdCwgaW50IGJlKQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWQ29kZWNJRCBtYXBbQVZfU0FNUExFX0ZNVF9OQl1bMl0gPSB7CisgICAgICAgIFtBVl9TQU1QTEVfRk1UX1U4ICBdID0geyBBVl9DT0RFQ19JRF9QQ01fVTgsICAgIEFWX0NPREVDX0lEX1BDTV9VOCAgICB9LAorICAgICAgICBbQVZfU0FNUExFX0ZNVF9TMTYgXSA9IHsgQVZfQ09ERUNfSURfUENNX1MxNkxFLCBBVl9DT0RFQ19JRF9QQ01fUzE2QkUgfSwKKyAgICAgICAgW0FWX1NBTVBMRV9GTVRfUzMyIF0gPSB7IEFWX0NPREVDX0lEX1BDTV9TMzJMRSwgQVZfQ09ERUNfSURfUENNX1MzMkJFIH0sCisgICAgICAgIFtBVl9TQU1QTEVfRk1UX0ZMVCBdID0geyBBVl9DT0RFQ19JRF9QQ01fRjMyTEUsIEFWX0NPREVDX0lEX1BDTV9GMzJCRSB9LAorICAgICAgICBbQVZfU0FNUExFX0ZNVF9EQkwgXSA9IHsgQVZfQ09ERUNfSURfUENNX0Y2NExFLCBBVl9DT0RFQ19JRF9QQ01fRjY0QkUgfSwKKyAgICAgICAgW0FWX1NBTVBMRV9GTVRfVThQIF0gPSB7IEFWX0NPREVDX0lEX1BDTV9VOCwgICAgQVZfQ09ERUNfSURfUENNX1U4ICAgIH0sCisgICAgICAgIFtBVl9TQU1QTEVfRk1UX1MxNlBdID0geyBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsIEFWX0NPREVDX0lEX1BDTV9TMTZCRSB9LAorICAgICAgICBbQVZfU0FNUExFX0ZNVF9TMzJQXSA9IHsgQVZfQ09ERUNfSURfUENNX1MzMkxFLCBBVl9DT0RFQ19JRF9QQ01fUzMyQkUgfSwKKyAgICAgICAgW0FWX1NBTVBMRV9GTVRfRkxUUF0gPSB7IEFWX0NPREVDX0lEX1BDTV9GMzJMRSwgQVZfQ09ERUNfSURfUENNX0YzMkJFIH0sCisgICAgICAgIFtBVl9TQU1QTEVfRk1UX0RCTFBdID0geyBBVl9DT0RFQ19JRF9QQ01fRjY0TEUsIEFWX0NPREVDX0lEX1BDTV9GNjRCRSB9LAorICAgIH07CisgICAgaWYgKGZtdCA8IDAgfHwgZm10ID49IEFWX1NBTVBMRV9GTVRfTkIpCisgICAgICAgIHJldHVybiBBVl9DT0RFQ19JRF9OT05FOworICAgIGlmIChiZSA8IDAgfHwgYmUgPiAxKQorICAgICAgICBiZSA9IEFWX05FKDEsIDApOworICAgIHJldHVybiBtYXBbZm10XVtiZV07Cit9CisKK2ludCBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKQoreworICAgIHN3aXRjaCAoY29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1NCUFJPXzI6CisgICAgICAgIHJldHVybiAyOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fU0JQUk9fMzoKKyAgICAgICAgcmV0dXJuIDM7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9TQlBST180OgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVDoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1NXRjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX01TOgorICAgICAgICByZXR1cm4gNDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gYXZfZ2V0X2V4YWN0X2JpdHNfcGVyX3NhbXBsZShjb2RlY19pZCk7CisgICAgfQorfQorCitpbnQgYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGZyYW1lX2J5dGVzKQoreworICAgIGludCBpZCwgc3IsIGNoLCBiYSwgdGFnLCBicHM7CisKKyAgICBpZCAgPSBhdmN0eC0+Y29kZWNfaWQ7CisgICAgc3IgID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIGNoICA9IGF2Y3R4LT5jaGFubmVsczsKKyAgICBiYSAgPSBhdmN0eC0+YmxvY2tfYWxpZ247CisgICAgdGFnID0gYXZjdHgtPmNvZGVjX3RhZzsKKyAgICBicHMgPSBhdl9nZXRfZXhhY3RfYml0c19wZXJfc2FtcGxlKGF2Y3R4LT5jb2RlY19pZCk7CisKKyAgICAvKiBjb2RlY3Mgd2l0aCBhbiBleGFjdCBjb25zdGFudCBiaXRzIHBlciBzYW1wbGUgKi8KKyAgICBpZiAoYnBzID4gMCAmJiBjaCA+IDAgJiYgZnJhbWVfYnl0ZXMgPiAwICYmIGNoIDwgMzI3NjggJiYgYnBzIDwgMzI3NjgpCisgICAgICAgIHJldHVybiAoZnJhbWVfYnl0ZXMgKiA4TEwpIC8gKGJwcyAqIGNoKTsKKyAgICBicHMgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworCisgICAgLyogY29kZWNzIHdpdGggYSBmaXhlZCBwYWNrZXQgZHVyYXRpb24gKi8KKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9BRFg6ICAgIHJldHVybiAgIDMyOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1FUOiByZXR1cm4gICA2NDsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0VBX1hBUzogcmV0dXJuICAxMjg7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BTVJfTkI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9FVlJDOgorICAgIGNhc2UgQVZfQ09ERUNfSURfR1NNOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUUNFTFA6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9SQV8yODg6ICAgICAgIHJldHVybiAgMTYwOworICAgIGNhc2UgQVZfQ09ERUNfSURfQU1SX1dCOgorICAgIGNhc2UgQVZfQ09ERUNfSURfR1NNX01TOiAgICAgICByZXR1cm4gIDMyMDsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QMTogICAgICAgICAgcmV0dXJuICAzODQ7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BVFJBQzE6ICAgICAgIHJldHVybiAgNTEyOworICAgIGNhc2UgQVZfQ09ERUNfSURfQVRSQUMzOiAgICAgICByZXR1cm4gMTAyNDsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FUUkFDM1A6ICAgICAgcmV0dXJuIDIwNDg7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NVVNFUEFDSzc6ICAgIHJldHVybiAxMTUyOworICAgIGNhc2UgQVZfQ09ERUNfSURfQUMzOiAgICAgICAgICByZXR1cm4gMTUzNjsKKyAgICB9CisKKyAgICBpZiAoc3IgPiAwKSB7CisgICAgICAgIC8qIGNhbGMgZnJvbSBzYW1wbGUgcmF0ZSAqLworICAgICAgICBpZiAoaWQgPT0gQVZfQ09ERUNfSURfVFRBKQorICAgICAgICAgICAgcmV0dXJuIDI1NiAqIHNyIC8gMjQ1OworCisgICAgICAgIGlmIChjaCA+IDApIHsKKyAgICAgICAgICAgIC8qIGNhbGMgZnJvbSBzYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGlmIChpZCA9PSBBVl9DT0RFQ19JRF9CSU5LQVVESU9fRENUKQorICAgICAgICAgICAgICAgIHJldHVybiAoNDgwIDw8IChzciAvIDIyMDUwKSkgLyBjaDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiYSA+IDApIHsKKyAgICAgICAgLyogY2FsYyBmcm9tIGJsb2NrX2FsaWduICovCisgICAgICAgIGlmIChpZCA9PSBBVl9DT0RFQ19JRF9TSVBSKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGJhKSB7CisgICAgICAgICAgICBjYXNlIDIwOiByZXR1cm4gMTYwOworICAgICAgICAgICAgY2FzZSAxOTogcmV0dXJuIDE0NDsKKyAgICAgICAgICAgIGNhc2UgMjk6IHJldHVybiAyODg7CisgICAgICAgICAgICBjYXNlIDM3OiByZXR1cm4gNDgwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGlkID09IEFWX0NPREVDX0lEX0lMQkMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYmEpIHsKKyAgICAgICAgICAgIGNhc2UgMzg6IHJldHVybiAxNjA7CisgICAgICAgICAgICBjYXNlIDUwOiByZXR1cm4gMjQwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX2J5dGVzID4gMCkgeworICAgICAgICAvKiBjYWxjIGZyb20gZnJhbWVfYnl0ZXMgb25seSAqLworICAgICAgICBpZiAoaWQgPT0gQVZfQ09ERUNfSURfVFJVRVNQRUVDSCkKKyAgICAgICAgICAgIHJldHVybiAyNDAgKiAoZnJhbWVfYnl0ZXMgLyAzMik7CisgICAgICAgIGlmIChpZCA9PSBBVl9DT0RFQ19JRF9ORUxMWU1PU0VSKQorICAgICAgICAgICAgcmV0dXJuIDI1NiAqIChmcmFtZV9ieXRlcyAvIDY0KTsKKyAgICAgICAgaWYgKGlkID09IEFWX0NPREVDX0lEX1JBXzE0NCkKKyAgICAgICAgICAgIHJldHVybiAxNjAgKiAoZnJhbWVfYnl0ZXMgLyAyMCk7CisgICAgICAgIGlmIChpZCA9PSBBVl9DT0RFQ19JRF9HNzIzXzEpCisgICAgICAgICAgICByZXR1cm4gMjQwICogKGZyYW1lX2J5dGVzIC8gMjQpOworCisgICAgICAgIGlmIChicHMgPiAwKSB7CisgICAgICAgICAgICAvKiBjYWxjIGZyb20gZnJhbWVfYnl0ZXMgYW5kIGJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqLworICAgICAgICAgICAgaWYgKGlkID09IEFWX0NPREVDX0lEX0FEUENNX0c3MjYpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lX2J5dGVzICogOCAvIGJwczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaCA+IDApIHsKKyAgICAgICAgICAgIC8qIGNhbGMgZnJvbSBmcmFtZV9ieXRlcyBhbmQgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fQUZDOgorICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZV9ieXRlcyAvICg5ICogY2gpICogMTY7CisgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0RUSzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWVfYnl0ZXMgLyAoMTYgKiBjaCkgKiAyODsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fNFhNOgorICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfSVNTOgorICAgICAgICAgICAgICAgIHJldHVybiAoZnJhbWVfYnl0ZXMgLSA0ICogY2gpICogMiAvIGNoOworICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfU01KUEVHOgorICAgICAgICAgICAgICAgIHJldHVybiAoZnJhbWVfYnl0ZXMgLSA0KSAqIDIgLyBjaDsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX0FNVjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZyYW1lX2J5dGVzIC0gOCkgKiAyIC8gY2g7CisgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1hBOgorICAgICAgICAgICAgICAgIHJldHVybiAoZnJhbWVfYnl0ZXMgLyAxMjgpICogMjI0IC8gY2g7CisgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0lOVEVSUExBWV9EUENNOgorICAgICAgICAgICAgICAgIHJldHVybiAoZnJhbWVfYnl0ZXMgLSA2IC0gY2gpIC8gY2g7CisgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1JPUV9EUENNOgorICAgICAgICAgICAgICAgIHJldHVybiAoZnJhbWVfYnl0ZXMgLSA4KSAvIGNoOworICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9YQU5fRFBDTToKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZyYW1lX2J5dGVzIC0gMiAqIGNoKSAvIGNoOworICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NQUNFMzoKKyAgICAgICAgICAgICAgICByZXR1cm4gMyAqIGZyYW1lX2J5dGVzIC8gY2g7CisgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01BQ0U2OgorICAgICAgICAgICAgICAgIHJldHVybiA2ICogZnJhbWVfYnl0ZXMgLyBjaDsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0xYRjoKKyAgICAgICAgICAgICAgICByZXR1cm4gMiAqIChmcmFtZV9ieXRlcyAvICg1ICogY2gpKTsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfSUFDOgorICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9JTUM6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQgKiBmcmFtZV9ieXRlcyAvIGNoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGFnKSB7CisgICAgICAgICAgICAgICAgLyogY2FsYyBmcm9tIGZyYW1lX2J5dGVzLCBjaGFubmVscywgYW5kIGNvZGVjX3RhZyAqLworICAgICAgICAgICAgICAgIGlmIChpZCA9PSBBVl9DT0RFQ19JRF9TT0xfRFBDTSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWVfYnl0ZXMgLyBjaDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lX2J5dGVzICogMiAvIGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJhID4gMCkgeworICAgICAgICAgICAgICAgIC8qIGNhbGMgZnJvbSBmcmFtZV9ieXRlcywgY2hhbm5lbHMsIGFuZCBibG9ja19hbGlnbiAqLworICAgICAgICAgICAgICAgIGludCBibG9ja3MgPSBmcmFtZV9ieXRlcyAvIGJhOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX2lkKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWOgorICAgICAgICAgICAgICAgICAgICBpZiAoYnBzIDwgMiB8fCBicHMgPiA1KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3MgKiAoMSArIChiYSAtIDQgKiBjaCkgLyAoYnBzICogY2gpICogOCk7CisgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREszOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2tzICogKCgoYmEgLSAxNikgKiAyIC8gMyAqIDQpIC8gY2gpOworICAgICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX0RLNDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrcyAqICgxICsgKGJhIC0gNCAqIGNoKSAqIDIgLyBjaCk7CisgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUkFEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2tzICogKChiYSAtIDQgKiBjaCkgKiAyIC8gY2gpOworICAgICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fTVM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3MgKiAoMiArIChiYSAtIDcgKiBjaCkgKiAyIC8gY2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJwcyA+IDApIHsKKyAgICAgICAgICAgICAgICAvKiBjYWxjIGZyb20gZnJhbWVfYnl0ZXMsIGNoYW5uZWxzLCBhbmQgYml0c19wZXJfY29kZWRfc2FtcGxlICovCisgICAgICAgICAgICAgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9EVkQ6CisgICAgICAgICAgICAgICAgICAgIGlmKGJwczw0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAyICogKGZyYW1lX2J5dGVzIC8gKChicHMgKiAyIC8gOCkgKiBjaCkpOworICAgICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0JMVVJBWToKKyAgICAgICAgICAgICAgICAgICAgaWYoYnBzPDQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lX2J5dGVzIC8gKChGRkFMSUdOKGNoLCAyKSAqIGJwcykgLyA4KTsKKyAgICAgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1MzMDJNOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMiAqIChmcmFtZV9ieXRlcyAvICgoYnBzICsgNCkgLyA0KSkgLyBjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGYWxsIGJhY2sgb24gdXNpbmcgZnJhbWVfc2l6ZSAqLworICAgIGlmIChhdmN0eC0+ZnJhbWVfc2l6ZSA+IDEgJiYgZnJhbWVfYnl0ZXMpCisgICAgICAgIHJldHVybiBhdmN0eC0+ZnJhbWVfc2l6ZTsKKworICAgIC8vRm9yIFdNQSB3ZSBjdXJyZW50bHkgaGF2ZSBubyBvdGhlciBtZWFucyB0byBjYWxjdWxhdGUgZHVyYXRpb24gdGh1cyB3ZQorICAgIC8vZG8gaXQgaGVyZSBieSBhc3N1bWluZyBDQlIsIHdoaWNoIGlzIHRydWUgZm9yIGFsbCBrbm93biBjYXNlcy4KKyAgICBpZiAoYXZjdHgtPmJpdF9yYXRlPjAgJiYgZnJhbWVfYnl0ZXM+MCAmJiBhdmN0eC0+c2FtcGxlX3JhdGU+MCAmJiBhdmN0eC0+YmxvY2tfYWxpZ24+MSkgeworICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNQVYxIHx8IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XTUFWMikKKyAgICAgICAgICAgIHJldHVybiAgKGZyYW1lX2J5dGVzICogOExMICogYXZjdHgtPnNhbXBsZV9yYXRlKSAvIGF2Y3R4LT5iaXRfcmF0ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmICFIQVZFX1RIUkVBRFMKK2ludCBmZl90aHJlYWRfaW5pdChBVkNvZGVjQ29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKKyNlbmRpZgorCit1bnNpZ25lZCBpbnQgYXZfeGlwaGxhY2luZyh1bnNpZ25lZCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgdikKK3sKKyAgICB1bnNpZ25lZCBpbnQgbiA9IDA7CisKKyAgICB3aGlsZSAodiA+PSAweGZmKSB7CisgICAgICAgICpzKysgPSAweGZmOworICAgICAgICB2IC09IDB4ZmY7CisgICAgICAgIG4rKzsKKyAgICB9CisgICAgKnMgPSB2OworICAgIG4rKzsKKyAgICByZXR1cm4gbjsKK30KKworaW50IGZmX21hdGNoXzJ1aW50MTYoY29uc3QgdWludDE2X3QoKnRhYilbMl0sIGludCBzaXplLCBpbnQgYSwgaW50IGIpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemUgJiYgISh0YWJbaV1bMF0gPT0gYSAmJiB0YWJbaV1bMV0gPT0gYik7IGkrKykgOworICAgIHJldHVybiBpOworfQorCisjaWYgRkZfQVBJX01JU1NJTkdfU0FNUExFCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCit2b2lkIGF2X2xvZ19taXNzaW5nX2ZlYXR1cmUodm9pZCAqYXZjLCBjb25zdCBjaGFyICpmZWF0dXJlLCBpbnQgd2FudF9zYW1wbGUpCit7CisgICAgYXZfbG9nKGF2YywgQVZfTE9HX1dBUk5JTkcsICIlcyBpcyBub3QgaW1wbGVtZW50ZWQuIFVwZGF0ZSB5b3VyIEZGbXBlZyAiCisgICAgICAgICAgICAidmVyc2lvbiB0byB0aGUgbmV3ZXN0IG9uZSBmcm9tIEdpdC4gSWYgdGhlIHByb2JsZW0gc3RpbGwgIgorICAgICAgICAgICAgIm9jY3VycywgaXQgbWVhbnMgdGhhdCB5b3VyIGZpbGUgaGFzIGEgZmVhdHVyZSB3aGljaCBoYXMgbm90ICIKKyAgICAgICAgICAgICJiZWVuIGltcGxlbWVudGVkLlxuIiwgZmVhdHVyZSk7CisgICAgaWYod2FudF9zYW1wbGUpCisgICAgICAgIGF2X2xvZ19hc2tfZm9yX3NhbXBsZShhdmMsIE5VTEwpOworfQorCit2b2lkIGF2X2xvZ19hc2tfZm9yX3NhbXBsZSh2b2lkICphdmMsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworICAgIHZhX2xpc3QgYXJndW1lbnRfbGlzdDsKKworICAgIHZhX3N0YXJ0KGFyZ3VtZW50X2xpc3QsIG1zZyk7CisKKyAgICBpZiAobXNnKQorICAgICAgICBhdl92bG9nKGF2YywgQVZfTE9HX1dBUk5JTkcsIG1zZywgYXJndW1lbnRfbGlzdCk7CisgICAgYXZfbG9nKGF2YywgQVZfTE9HX1dBUk5JTkcsICJJZiB5b3Ugd2FudCB0byBoZWxwLCB1cGxvYWQgYSBzYW1wbGUgIgorICAgICAgICAgICAgIm9mIHRoaXMgZmlsZSB0byBmdHA6Ly91cGxvYWQuZmZtcGVnLm9yZy9pbmNvbWluZy8gIgorICAgICAgICAgICAgImFuZCBjb250YWN0IHRoZSBmZm1wZWctZGV2ZWwgbWFpbGluZyBsaXN0LiAoZmZtcGVnLWRldmVsQGZmbXBlZy5vcmcpXG4iKTsKKworICAgIHZhX2VuZChhcmd1bWVudF9saXN0KTsKK30KK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmIC8qIEZGX0FQSV9NSVNTSU5HX1NBTVBMRSAqLworCitzdGF0aWMgQVZIV0FjY2VsICpmaXJzdF9od2FjY2VsID0gTlVMTDsKK3N0YXRpYyBBVkhXQWNjZWwgKipsYXN0X2h3YWNjZWwgPSAmZmlyc3RfaHdhY2NlbDsKKwordm9pZCBhdl9yZWdpc3Rlcl9od2FjY2VsKEFWSFdBY2NlbCAqaHdhY2NlbCkKK3sKKyAgICBBVkhXQWNjZWwgKipwID0gbGFzdF9od2FjY2VsOworICAgIGh3YWNjZWwtPm5leHQgPSBOVUxMOworICAgIHdoaWxlKCpwIHx8IGF2cHJpdl9hdG9taWNfcHRyX2Nhcygodm9pZCAqIHZvbGF0aWxlICopcCwgTlVMTCwgaHdhY2NlbCkpCisgICAgICAgIHAgPSAmKCpwKS0+bmV4dDsKKyAgICBsYXN0X2h3YWNjZWwgPSAmaHdhY2NlbC0+bmV4dDsKK30KKworQVZIV0FjY2VsICphdl9od2FjY2VsX25leHQoY29uc3QgQVZIV0FjY2VsICpod2FjY2VsKQoreworICAgIHJldHVybiBod2FjY2VsID8gaHdhY2NlbC0+bmV4dCA6IGZpcnN0X2h3YWNjZWw7Cit9CisKK2ludCBhdl9sb2NrbWdyX3JlZ2lzdGVyKGludCAoKmNiKSh2b2lkICoqbXV0ZXgsIGVudW0gQVZMb2NrT3Agb3ApKQoreworICAgIGlmIChsb2NrbWdyX2NiKSB7CisgICAgICAgIC8vIFRoZXJlIGlzIG5vIGdvb2Qgd2F5IHRvIHJvbGxiYWNrIGEgZmFpbHVyZSB0byBkZXN0cm95IHRoZQorICAgICAgICAvLyBtdXRleCwgc28gd2UgaWdub3JlIGZhaWx1cmVzLgorICAgICAgICBsb2NrbWdyX2NiKCZjb2RlY19tdXRleCwgICAgQVZfTE9DS19ERVNUUk9ZKTsKKyAgICAgICAgbG9ja21ncl9jYigmYXZmb3JtYXRfbXV0ZXgsIEFWX0xPQ0tfREVTVFJPWSk7CisgICAgICAgIGxvY2ttZ3JfY2IgICAgID0gTlVMTDsKKyAgICAgICAgY29kZWNfbXV0ZXggICAgPSBOVUxMOworICAgICAgICBhdmZvcm1hdF9tdXRleCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGNiKSB7CisgICAgICAgIHZvaWQgKm5ld19jb2RlY19tdXRleCAgICA9IE5VTEw7CisgICAgICAgIHZvaWQgKm5ld19hdmZvcm1hdF9tdXRleCA9IE5VTEw7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIGlmIChlcnIgPSBjYigmbmV3X2NvZGVjX211dGV4LCBBVl9MT0NLX0NSRUFURSkpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnIgPiAwID8gQVZFUlJPUl9VTktOT1dOIDogZXJyOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPSBjYigmbmV3X2F2Zm9ybWF0X211dGV4LCBBVl9MT0NLX0NSRUFURSkpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSBmYWlsdXJlcyB0byBkZXN0cm95IHRoZSBuZXdseSBjcmVhdGVkIG11dGV4LgorICAgICAgICAgICAgY2IoJm5ld19jb2RlY19tdXRleCwgQVZfTE9DS19ERVNUUk9ZKTsKKyAgICAgICAgICAgIHJldHVybiBlcnIgPiAwID8gQVZFUlJPUl9VTktOT1dOIDogZXJyOworICAgICAgICB9CisgICAgICAgIGxvY2ttZ3JfY2IgICAgID0gY2I7CisgICAgICAgIGNvZGVjX211dGV4ICAgID0gbmV3X2NvZGVjX211dGV4OworICAgICAgICBhdmZvcm1hdF9tdXRleCA9IG5ld19hdmZvcm1hdF9tdXRleDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2xvY2tfYXZjb2RlYyhBVkNvZGVjQ29udGV4dCAqbG9nX2N0eCkKK3sKKyAgICBpZiAobG9ja21ncl9jYikgeworICAgICAgICBpZiAoKCpsb2NrbWdyX2NiKSgmY29kZWNfbXV0ZXgsIEFWX0xPQ0tfT0JUQUlOKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZW50YW5nbGVkX3RocmVhZF9jb3VudGVyKys7CisgICAgaWYgKGVudGFuZ2xlZF90aHJlYWRfY291bnRlciAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJJbnN1ZmZpY2llbnQgdGhyZWFkIGxvY2tpbmcgYXJvdW5kIGF2Y29kZWNfb3Blbi9jbG9zZSgpXG4iKTsKKyAgICAgICAgaWYgKCFsb2NrbWdyX2NiKQorICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIk5vIGxvY2sgbWFuYWdlciBpcyBzZXQsIHBsZWFzZSBzZWUgYXZfbG9ja21ncl9yZWdpc3RlcigpXG4iKTsKKyAgICAgICAgZmZfYXZjb2RlY19sb2NrZWQgPSAxOworICAgICAgICBmZl91bmxvY2tfYXZjb2RlYygpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBhdl9hc3NlcnQwKCFmZl9hdmNvZGVjX2xvY2tlZCk7CisgICAgZmZfYXZjb2RlY19sb2NrZWQgPSAxOworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfdW5sb2NrX2F2Y29kZWModm9pZCkKK3sKKyAgICBhdl9hc3NlcnQwKGZmX2F2Y29kZWNfbG9ja2VkKTsKKyAgICBmZl9hdmNvZGVjX2xvY2tlZCA9IDA7CisgICAgZW50YW5nbGVkX3RocmVhZF9jb3VudGVyLS07CisgICAgaWYgKGxvY2ttZ3JfY2IpIHsKKyAgICAgICAgaWYgKCgqbG9ja21ncl9jYikoJmNvZGVjX211dGV4LCBBVl9MT0NLX1JFTEVBU0UpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgYXZwcml2X2xvY2tfYXZmb3JtYXQodm9pZCkKK3sKKyAgICBpZiAobG9ja21ncl9jYikgeworICAgICAgICBpZiAoKCpsb2NrbWdyX2NiKSgmYXZmb3JtYXRfbXV0ZXgsIEFWX0xPQ0tfT0JUQUlOKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdnByaXZfdW5sb2NrX2F2Zm9ybWF0KHZvaWQpCit7CisgICAgaWYgKGxvY2ttZ3JfY2IpIHsKKyAgICAgICAgaWYgKCgqbG9ja21ncl9jYikoJmF2Zm9ybWF0X211dGV4LCBBVl9MT0NLX1JFTEVBU0UpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IGF2cHJpdl90b3VwcGVyNCh1bnNpZ25lZCBpbnQgeCkKK3sKKyAgICByZXR1cm4gYXZfdG91cHBlcih4ICYgMHhGRikgKworICAgICAgICAgIChhdl90b3VwcGVyKCh4ID4+ICA4KSAmIDB4RkYpIDw8IDgpICArCisgICAgICAgICAgKGF2X3RvdXBwZXIoKHggPj4gMTYpICYgMHhGRikgPDwgMTYpICsKKygodW5zaWduZWQpYXZfdG91cHBlcigoeCA+PiAyNCkgJiAweEZGKSA8PCAyNCk7Cit9CisKK2ludCBmZl90aHJlYWRfcmVmX2ZyYW1lKFRocmVhZEZyYW1lICpkc3QsIFRocmVhZEZyYW1lICpzcmMpCit7CisgICAgaW50IHJldDsKKworICAgIGRzdC0+b3duZXIgPSBzcmMtPm93bmVyOworCisgICAgcmV0ID0gYXZfZnJhbWVfcmVmKGRzdC0+Ziwgc3JjLT5mKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChzcmMtPnByb2dyZXNzICYmCisgICAgICAgICEoZHN0LT5wcm9ncmVzcyA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5wcm9ncmVzcykpKSB7CisgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihkc3QtPm93bmVyLCBkc3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjaWYgIUhBVkVfVEhSRUFEUworCitlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfdGhyZWFkX2dldF9mb3JtYXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKmZtdCkKK3sKKyAgICByZXR1cm4gZmZfZ2V0X2Zvcm1hdChhdmN0eCwgZm10KTsKK30KKworaW50IGZmX3RocmVhZF9nZXRfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVGhyZWFkRnJhbWUgKmYsIGludCBmbGFncykKK3sKKyAgICBmLT5vd25lciA9IGF2Y3R4OworICAgIHJldHVybiBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmLT5mLCBmbGFncyk7Cit9CisKK3ZvaWQgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVGhyZWFkRnJhbWUgKmYpCit7CisgICAgaWYgKGYtPmYpCisgICAgICAgIGF2X2ZyYW1lX3VucmVmKGYtPmYpOworfQorCit2b2lkIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworfQorCit2b2lkIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoVGhyZWFkRnJhbWUgKmYsIGludCBwcm9ncmVzcywgaW50IGZpZWxkKQoreworfQorCit2b2lkIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhUaHJlYWRGcmFtZSAqZiwgaW50IHByb2dyZXNzLCBpbnQgZmllbGQpCit7Cit9CisKK2ludCBmZl90aHJlYWRfY2FuX3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICByZXR1cm4gMTsKK30KKworaW50IGZmX2FsbG9jX2VudHJpZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgY291bnQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfcmVzZXRfZW50cmllcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7Cit9CisKK3ZvaWQgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBmaWVsZCwgaW50IHRocmVhZCwgaW50IHNoaWZ0KQoreworfQorCit2b2lkIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGZpZWxkLCBpbnQgdGhyZWFkLCBpbnQgbikKK3sKK30KKworI2VuZGlmCisKK2VudW0gQVZNZWRpYVR5cGUgYXZjb2RlY19nZXRfdHlwZShlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCkKK3sKKyAgICBBVkNvZGVjICpjPSBhdmNvZGVjX2ZpbmRfZGVjb2Rlcihjb2RlY19pZCk7CisgICAgaWYoIWMpCisgICAgICAgIGM9IGF2Y29kZWNfZmluZF9lbmNvZGVyKGNvZGVjX2lkKTsKKyAgICBpZihjKQorICAgICAgICByZXR1cm4gYy0+dHlwZTsKKworICAgIGlmIChjb2RlY19pZCA8PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICByZXR1cm4gQVZNRURJQV9UWVBFX1VOS05PV047CisgICAgZWxzZSBpZiAoY29kZWNfaWQgPCBBVl9DT0RFQ19JRF9GSVJTVF9BVURJTykKKyAgICAgICAgcmV0dXJuIEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBlbHNlIGlmIChjb2RlY19pZCA8IEFWX0NPREVDX0lEX0ZJUlNUX1NVQlRJVExFKQorICAgICAgICByZXR1cm4gQVZNRURJQV9UWVBFX0FVRElPOworICAgIGVsc2UgaWYgKGNvZGVjX2lkIDwgQVZfQ09ERUNfSURfRklSU1RfVU5LTk9XTikKKyAgICAgICAgcmV0dXJuIEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKworICAgIHJldHVybiBBVk1FRElBX1RZUEVfVU5LTk9XTjsKK30KKworaW50IGF2Y29kZWNfaXNfb3BlbihBVkNvZGVjQ29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gISFzLT5pbnRlcm5hbDsKK30KKworaW50IGF2cHJpdl9icHJpbnRfdG9fZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgc3RydWN0IEFWQlByaW50ICpidWYpCit7CisgICAgaW50IHJldDsKKyAgICBjaGFyICpzdHI7CisKKyAgICByZXQgPSBhdl9icHJpbnRfZmluYWxpemUoYnVmLCAmc3RyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZShidWYpKSB7CisgICAgICAgIGF2X2ZyZWUoc3RyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBhdmN0eC0+ZXh0cmFkYXRhID0gc3RyOworICAgIC8qIE5vdGU6IHRoZSBzdHJpbmcgaXMgTlVMIHRlcm1pbmF0ZWQgKHNvIGV4dHJhZGF0YSBjYW4gYmUgcmVhZCBhcyBhCisgICAgICogc3RyaW5nKSwgYnV0IHRoZSBlbmRpbmcgY2hhcmFjdGVyIGlzIG5vdCBhY2NvdW50ZWQgaW4gdGhlIHNpemUgKGluCisgICAgICogYmluYXJ5IGZvcm1hdHMgeW91IGFyZSBsaWtlbHkgbm90IHN1cHBvc2VkIHRvIG11eCB0aGF0IGNoYXJhY3RlcikuIFdoZW4KKyAgICAgKiBleHRyYWRhdGEgaXMgY29waWVkLCBpdCBpcyBhbHNvIHBhZGRlZCB3aXRoIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUKKyAgICAgKiB6ZXJvcy4gKi8KKyAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSBidWYtPmxlbjsKKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgdWludDhfdCAqYXZwcml2X2ZpbmRfc3RhcnRfY29kZShjb25zdCB1aW50OF90ICphdl9yZXN0cmljdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICphdl9yZXN0cmljdCBzdGF0ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGF2X2Fzc2VydDAocCA8PSBlbmQpOworICAgIGlmIChwID49IGVuZCkKKyAgICAgICAgcmV0dXJuIGVuZDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgdG1wID0gKnN0YXRlIDw8IDg7CisgICAgICAgICpzdGF0ZSA9IHRtcCArICoocCsrKTsKKyAgICAgICAgaWYgKHRtcCA9PSAweDEwMCB8fCBwID09IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIHdoaWxlIChwIDwgZW5kKSB7CisgICAgICAgIGlmICAgICAgKHBbLTFdID4gMSAgICAgICkgcCArPSAzOworICAgICAgICBlbHNlIGlmIChwWy0yXSAgICAgICAgICApIHAgKz0gMjsKKyAgICAgICAgZWxzZSBpZiAocFstM118KHBbLTFdLTEpKSBwKys7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwID0gRkZNSU4ocCwgZW5kKSAtIDQ7CisgICAgKnN0YXRlID0gQVZfUkIzMihwKTsKKworICAgIHJldHVybiBwICsgNDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3V0dmlkZW8uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3V0dmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDhhZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdXR2aWRlby5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb21tb24gVXQgVmlkZW8gY29kZQorICogQ29weXJpZ2h0IChjKSAyMDExIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ29tbW9uIFV0IFZpZGVvIGNvZGUKKyAqLworCisjaW5jbHVkZSAidXR2aWRlby5oIgorCitjb25zdCBpbnQgZmZfdXRfcHJlZF9vcmRlcls1XSA9IHsKKyAgICBQUkVEX0xFRlQsIFBSRURfTUVESUFOLCBQUkVEX01FRElBTiwgUFJFRF9OT05FLCBQUkVEX0dSQURJRU5UCit9OworCitjb25zdCBpbnQgZmZfdXRfcmdiX29yZGVyWzRdICA9IHsgMSwgMiwgMCwgMyB9OyAvLyBHLCBCLCBSLCBBCisKK2ludCBmZl91dF9odWZmX2NtcF9sZW4oY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBIdWZmRW50cnkgKmFhID0gYSwgKmJiID0gYjsKKyAgICByZXR1cm4gKGFhLT5sZW4gLSBiYi0+bGVuKSoyNTYgKyBhYS0+c3ltIC0gYmItPnN5bTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3V0dmlkZW8uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3V0dmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGMzZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdXR2aWRlby5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb21tb24gVXQgVmlkZW8gaGVhZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVVRWSURFT19ICisjZGVmaW5lIEFWQ09ERUNfVVRWSURFT19ICisKKy8qKgorICogQGZpbGUKKyAqIENvbW1vbiBVdCBWaWRlbyBoZWFkZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJic3dhcGRzcC5oIgorI2luY2x1ZGUgImh1ZmZ5dXZlbmNkc3AuaCIKKworZW51bSB7CisgICAgUFJFRF9OT05FID0gMCwKKyAgICBQUkVEX0xFRlQsCisgICAgUFJFRF9HUkFESUVOVCwKKyAgICBQUkVEX01FRElBTiwKK307CisKK2VudW0geworICAgIENPTVBfTk9ORSA9IDAsCisgICAgQ09NUF9IVUZGLAorfTsKKworLyoKKyAqICJPcmlnaW5hbCBmb3JtYXQiIG1hcmtlcnMuCisgKiBCYXNlZCBvbiB2YWx1ZXMgZ290dGVuIGZyb20gdGhlIG9mZmljaWFsIFZGVyBlbmNvZGVyLgorICogVGhleSBhcmUgbm90IHVzZWQgZHVyaW5nIGRlY29kaW5nLCBidXQgdGhleSBkbyBoYXZlCisgKiBhbiBpbmZvcm1hdGl2ZSByb2xlIG9uIHNlZWluZyB3aGF0IHdhcyBpbnB1dAorICogdG8gdGhlIGVuY29kZXIuCisgKi8KK2VudW0geworICAgIFVUVklERU9fUkdCICA9IE1LVEFHKDB4MDAsIDB4MDAsIDB4MDEsIDB4MTgpLAorICAgIFVUVklERU9fUkdCQSA9IE1LVEFHKDB4MDAsIDB4MDAsIDB4MDIsIDB4MTgpLAorICAgIFVUVklERU9fNDIwICA9IE1LVEFHKCdZJywgJ1YnLCAnMScsICcyJyksCisgICAgVVRWSURFT180MjIgID0gTUtUQUcoJ1knLCAnVScsICdZJywgJzInKSwKK307CisKKy8qIE1hcHBpbmcgb2YgbGliYXZjb2RlYyBwcmVkaWN0aW9uIG1vZGVzIHRvIFV0IFZpZGVvJ3MgKi8KK2V4dGVybiBjb25zdCBpbnQgZmZfdXRfcHJlZF9vcmRlcls1XTsKKworLyogT3JkZXIgb2YgUkdCKEEpIHBsYW5lcyBpbiBVdCBWaWRlbyAqLworZXh0ZXJuIGNvbnN0IGludCBmZl91dF9yZ2Jfb3JkZXJbNF07CisKK3R5cGVkZWYgc3RydWN0IFV0dmlkZW9Db250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQnN3YXBEU1BDb250ZXh0IGJkc3A7CisgICAgSHVmZllVVkVuY0RTUENvbnRleHQgaGRzcDsKKworICAgIHVpbnQzMl90IGZyYW1lX2luZm9fc2l6ZSwgZmxhZ3MsIGZyYW1lX2luZm87CisgICAgaW50ICAgICAgcGxhbmVzOworICAgIGludCAgICAgIHNsaWNlczsKKyAgICBpbnQgICAgICBjb21wcmVzc2lvbjsKKyAgICBpbnQgICAgICBpbnRlcmxhY2VkOworICAgIGludCAgICAgIGZyYW1lX3ByZWQ7CisKKyAgICBpbnQgICAgICBzbGljZV9zdHJpZGU7CisgICAgdWludDhfdCAqc2xpY2VfYml0cywgKnNsaWNlX2J1ZmZlcls0XTsKKyAgICBpbnQgICAgICBzbGljZV9iaXRzX3NpemU7Cit9IFV0dmlkZW9Db250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBIdWZmRW50cnkgeworICAgIHVpbnQ4X3QgIHN5bTsKKyAgICB1aW50OF90ICBsZW47CisgICAgdWludDMyX3QgY29kZTsKK30gSHVmZkVudHJ5OworCisvKiBDb21wYXJlIGh1ZmZtYW4gdHJlZSBub2RlcyAqLworaW50IGZmX3V0X2h1ZmZfY21wX2xlbihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVVRWSURFT19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy91dHZpZGVvZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy91dHZpZGVvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2NWMxMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3V0dmlkZW9kZWMuYwpAQCAtMCwwICsxLDU1OSBAQAorLyoKKyAqIFV0IFZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMSBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFV0IFZpZGVvIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnN3YXBkc3AuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ1dHZpZGVvLmgiCisKK3N0YXRpYyBpbnQgYnVpbGRfaHVmZihjb25zdCB1aW50OF90ICpzcmMsIFZMQyAqdmxjLCBpbnQgKmZzeW0pCit7CisgICAgaW50IGk7CisgICAgSHVmZkVudHJ5IGhlWzI1Nl07CisgICAgaW50IGxhc3Q7CisgICAgdWludDMyX3QgY29kZXNbMjU2XTsKKyAgICB1aW50OF90IGJpdHNbMjU2XTsKKyAgICB1aW50OF90IHN5bXNbMjU2XTsKKyAgICB1aW50MzJfdCBjb2RlOworCisgICAgKmZzeW0gPSAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgaGVbaV0uc3ltID0gaTsKKyAgICAgICAgaGVbaV0ubGVuID0gKnNyYysrOworICAgIH0KKyAgICBxc29ydChoZSwgMjU2LCBzaXplb2YoKmhlKSwgZmZfdXRfaHVmZl9jbXBfbGVuKTsKKworICAgIGlmICghaGVbMF0ubGVuKSB7CisgICAgICAgICpmc3ltID0gaGVbMF0uc3ltOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsYXN0ID0gMjU1OworICAgIHdoaWxlIChoZVtsYXN0XS5sZW4gPT0gMjU1ICYmIGxhc3QpCisgICAgICAgIGxhc3QtLTsKKworICAgIGlmIChoZVtsYXN0XS5sZW4gPiAzMikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgY29kZSA9IDE7CisgICAgZm9yIChpID0gbGFzdDsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgY29kZXNbaV0gPSBjb2RlID4+ICgzMiAtIGhlW2ldLmxlbik7CisgICAgICAgIGJpdHNbaV0gID0gaGVbaV0ubGVuOworICAgICAgICBzeW1zW2ldICA9IGhlW2ldLnN5bTsKKyAgICAgICAgY29kZSArPSAweDgwMDAwMDAwdSA+PiAoaGVbaV0ubGVuIC0gMSk7CisgICAgfQorCisgICAgcmV0dXJuIGZmX2luaXRfdmxjX3NwYXJzZSh2bGMsIEZGTUlOKGhlW2xhc3RdLmxlbiwgMTEpLCBsYXN0ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMsICBzaXplb2YoKmJpdHMpLCAgc2l6ZW9mKCpiaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzLCBzaXplb2YoKmNvZGVzKSwgc2l6ZW9mKCpjb2RlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zLCAgc2l6ZW9mKCpzeW1zKSwgIHNpemVvZigqc3ltcyksIDApOworfQorCitzdGF0aWMgaW50IGRlY29kZV9wbGFuZShVdHZpZGVvQ29udGV4dCAqYywgaW50IHBsYW5lX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgc3RlcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHVzZV9wcmVkKQoreworICAgIGludCBpLCBqLCBzbGljZSwgcGl4OworICAgIGludCBzc3RhcnQsIHNlbmQ7CisgICAgVkxDIHZsYzsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBwcmV2LCBmc3ltOworICAgIGNvbnN0IGludCBjbWFzayA9IH4oIXBsYW5lX25vICYmIGMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCk7CisKKyAgICBpZiAoYnVpbGRfaHVmZihzcmMsICZ2bGMsICZmc3ltKSkgeworICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBidWlsZCBIdWZmbWFuIGNvZGVzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChmc3ltID49IDApIHsgLy8gYnVpbGRfaHVmZiByZXBvcnRlZCBhIHN5bWJvbCB0byBmaWxsIHNsaWNlcyB3aXRoCisgICAgICAgIHNlbmQgPSAwOworICAgICAgICBmb3IgKHNsaWNlID0gMDsgc2xpY2UgPCBjLT5zbGljZXM7IHNsaWNlKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3Q7CisKKyAgICAgICAgICAgIHNzdGFydCA9IHNlbmQ7CisgICAgICAgICAgICBzZW5kICAgPSAoaGVpZ2h0ICogKHNsaWNlICsgMSkgLyBjLT5zbGljZXMpICYgY21hc2s7CisgICAgICAgICAgICBkZXN0ICAgPSBkc3QgKyBzc3RhcnQgKiBzdHJpZGU7CisKKyAgICAgICAgICAgIHByZXYgPSAweDgwOworICAgICAgICAgICAgZm9yIChqID0gc3N0YXJ0OyBqIDwgc2VuZDsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoICogc3RlcDsgaSArPSBzdGVwKSB7CisgICAgICAgICAgICAgICAgICAgIHBpeCA9IGZzeW07CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VfcHJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldiArPSBwaXg7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXggICA9IHByZXY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IHBpeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdCArPSBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3JjICAgICAgKz0gMjU2OworCisgICAgc2VuZCA9IDA7CisgICAgZm9yIChzbGljZSA9IDA7IHNsaWNlIDwgYy0+c2xpY2VzOyBzbGljZSsrKSB7CisgICAgICAgIHVpbnQ4X3QgKmRlc3Q7CisgICAgICAgIGludCBzbGljZV9kYXRhX3N0YXJ0LCBzbGljZV9kYXRhX2VuZCwgc2xpY2Vfc2l6ZTsKKworICAgICAgICBzc3RhcnQgPSBzZW5kOworICAgICAgICBzZW5kICAgPSAoaGVpZ2h0ICogKHNsaWNlICsgMSkgLyBjLT5zbGljZXMpICYgY21hc2s7CisgICAgICAgIGRlc3QgICA9IGRzdCArIHNzdGFydCAqIHN0cmlkZTsKKworICAgICAgICAvLyBzbGljZSBvZmZzZXQgYW5kIHNpemUgdmFsaWRhdGlvbiB3YXMgZG9uZSBlYXJsaWVyCisgICAgICAgIHNsaWNlX2RhdGFfc3RhcnQgPSBzbGljZSA/IEFWX1JMMzIoc3JjICsgc2xpY2UgKiA0IC0gNCkgOiAwOworICAgICAgICBzbGljZV9kYXRhX2VuZCAgID0gQVZfUkwzMihzcmMgKyBzbGljZSAqIDQpOworICAgICAgICBzbGljZV9zaXplICAgICAgID0gc2xpY2VfZGF0YV9lbmQgLSBzbGljZV9kYXRhX3N0YXJ0OworCisgICAgICAgIGlmICghc2xpY2Vfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQbGFuZSBoYXMgbW9yZSB0aGFuIG9uZSBzeW1ib2wgIgorICAgICAgICAgICAgICAgICAgICJ5ZXQgYSBzbGljZSBoYXMgYSBsZW5ndGggb2YgemVyby5cbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KGMtPnNsaWNlX2JpdHMsIHNyYyArIHNsaWNlX2RhdGFfc3RhcnQgKyBjLT5zbGljZXMgKiA0LAorICAgICAgICAgICAgICAgc2xpY2Vfc2l6ZSk7CisgICAgICAgIG1lbXNldChjLT5zbGljZV9iaXRzICsgc2xpY2Vfc2l6ZSwgMCwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIGMtPmJkc3AuYnN3YXBfYnVmKCh1aW50MzJfdCAqKSBjLT5zbGljZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKikgYy0+c2xpY2VfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHNsaWNlX2RhdGFfZW5kIC0gc2xpY2VfZGF0YV9zdGFydCArIDMpID4+IDIpOworICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgYy0+c2xpY2VfYml0cywgc2xpY2Vfc2l6ZSAqIDgpOworCisgICAgICAgIHByZXYgPSAweDgwOworICAgICAgICBmb3IgKGogPSBzc3RhcnQ7IGogPCBzZW5kOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAqIHN0ZXA7IGkgKz0gc3RlcCkgeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTbGljZSBkZWNvZGluZyByYW4gb3V0IG9mIGJpdHNcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBpeCA9IGdldF92bGMyKCZnYiwgdmxjLnRhYmxlLCB2bGMuYml0cywgMyk7CisgICAgICAgICAgICAgICAgaWYgKHBpeCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJEZWNvZGluZyBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHVzZV9wcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXYgKz0gcGl4OworICAgICAgICAgICAgICAgICAgICBwaXggICA9IHByZXY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBwaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmZ2IpID4gMzIpCisgICAgICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICIlZCBiaXRzIGxlZnQgYWZ0ZXIgZGVjb2Rpbmcgc2xpY2VcbiIsIGdldF9iaXRzX2xlZnQoJmdiKSk7CisgICAgfQorCisgICAgZmZfZnJlZV92bGMoJnZsYyk7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgZmZfZnJlZV92bGMoJnZsYyk7CisgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfcmdiX3BsYW5lcyh1aW50OF90ICpzcmMsIGludCBzdGVwLCBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICB1aW50OF90IHIsIGcsIGI7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoICogc3RlcDsgaSArPSBzdGVwKSB7CisgICAgICAgICAgICByID0gc3JjW2ldOworICAgICAgICAgICAgZyA9IHNyY1tpICsgMV07CisgICAgICAgICAgICBiID0gc3JjW2kgKyAyXTsKKyAgICAgICAgICAgIHNyY1tpXSAgICAgPSByICsgZyAtIDB4ODA7CisgICAgICAgICAgICBzcmNbaSArIDJdID0gYiArIGcgLSAweDgwOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZXN0b3JlX21lZGlhbih1aW50OF90ICpzcmMsIGludCBzdGVwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2xpY2VzLCBpbnQgcm1vZGUpCit7CisgICAgaW50IGksIGosIHNsaWNlOworICAgIGludCBBLCBCLCBDOworICAgIHVpbnQ4X3QgKmJzcmM7CisgICAgaW50IHNsaWNlX3N0YXJ0LCBzbGljZV9oZWlnaHQ7CisgICAgY29uc3QgaW50IGNtYXNrID0gfnJtb2RlOworCisgICAgZm9yIChzbGljZSA9IDA7IHNsaWNlIDwgc2xpY2VzOyBzbGljZSsrKSB7CisgICAgICAgIHNsaWNlX3N0YXJ0ICA9ICgoc2xpY2UgKiBoZWlnaHQpIC8gc2xpY2VzKSAmIGNtYXNrOworICAgICAgICBzbGljZV9oZWlnaHQgPSAoKCgoc2xpY2UgKyAxKSAqIGhlaWdodCkgLyBzbGljZXMpICYgY21hc2spIC0KKyAgICAgICAgICAgICAgICAgICAgICAgc2xpY2Vfc3RhcnQ7CisKKyAgICAgICAgYnNyYyA9IHNyYyArIHNsaWNlX3N0YXJ0ICogc3RyaWRlOworCisgICAgICAgIC8vIGZpcnN0IGxpbmUgLSBsZWZ0IG5laWdoYm91ciBwcmVkaWN0aW9uCisgICAgICAgIGJzcmNbMF0gKz0gMHg4MDsKKyAgICAgICAgQSA9IGJzcmNbMF07CisgICAgICAgIGZvciAoaSA9IHN0ZXA7IGkgPCB3aWR0aCAqIHN0ZXA7IGkgKz0gc3RlcCkgeworICAgICAgICAgICAgYnNyY1tpXSArPSBBOworICAgICAgICAgICAgQSAgICAgICAgPSBic3JjW2ldOworICAgICAgICB9CisgICAgICAgIGJzcmMgKz0gc3RyaWRlOworICAgICAgICBpZiAoc2xpY2VfaGVpZ2h0IDw9IDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLy8gc2Vjb25kIGxpbmUgLSBmaXJzdCBlbGVtZW50IGhhcyB0b3AgcHJlZGljdGlvbiwgdGhlIHJlc3QgdXNlcyBtZWRpYW4KKyAgICAgICAgQyAgICAgICAgPSBic3JjWy1zdHJpZGVdOworICAgICAgICBic3JjWzBdICs9IEM7CisgICAgICAgIEEgICAgICAgID0gYnNyY1swXTsKKyAgICAgICAgZm9yIChpID0gc3RlcDsgaSA8IHdpZHRoICogc3RlcDsgaSArPSBzdGVwKSB7CisgICAgICAgICAgICBCICAgICAgICA9IGJzcmNbaSAtIHN0cmlkZV07CisgICAgICAgICAgICBic3JjW2ldICs9IG1pZF9wcmVkKEEsIEIsICh1aW50OF90KShBICsgQiAtIEMpKTsKKyAgICAgICAgICAgIEMgICAgICAgID0gQjsKKyAgICAgICAgICAgIEEgICAgICAgID0gYnNyY1tpXTsKKyAgICAgICAgfQorICAgICAgICBic3JjICs9IHN0cmlkZTsKKyAgICAgICAgLy8gdGhlIHJlc3Qgb2YgbGluZXMgdXNlIGNvbnRpbnVvdXMgbWVkaWFuIHByZWRpY3Rpb24KKyAgICAgICAgZm9yIChqID0gMjsgaiA8IHNsaWNlX2hlaWdodDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggKiBzdGVwOyBpICs9IHN0ZXApIHsKKyAgICAgICAgICAgICAgICBCICAgICAgICA9IGJzcmNbaSAtIHN0cmlkZV07CisgICAgICAgICAgICAgICAgYnNyY1tpXSArPSBtaWRfcHJlZChBLCBCLCAodWludDhfdCkoQSArIEIgLSBDKSk7CisgICAgICAgICAgICAgICAgQyAgICAgICAgPSBCOworICAgICAgICAgICAgICAgIEEgICAgICAgID0gYnNyY1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJzcmMgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgfQorfQorCisvKiBVdFZpZGVvIGludGVybGFjZWQgbW9kZSB0cmVhdHMgZXZlcnkgdHdvIGxpbmVzIGFzIGEgc2luZ2xlIG9uZSwKKyAqIHNvIHJlc3RvcmluZyBmdW5jdGlvbiBzaG91bGQgdGFrZSBjYXJlIG9mIHBvc3NpYmxlIHBhZGRpbmcgYmV0d2VlbgorICogdHdvIHBhcnRzIG9mIHRoZSBzYW1lICJsaW5lIi4KKyAqLworc3RhdGljIHZvaWQgcmVzdG9yZV9tZWRpYW5faWwodWludDhfdCAqc3JjLCBpbnQgc3RlcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNsaWNlcywgaW50IHJtb2RlKQoreworICAgIGludCBpLCBqLCBzbGljZTsKKyAgICBpbnQgQSwgQiwgQzsKKyAgICB1aW50OF90ICpic3JjOworICAgIGludCBzbGljZV9zdGFydCwgc2xpY2VfaGVpZ2h0OworICAgIGNvbnN0IGludCBjbWFzayAgID0gfihybW9kZSA/IDMgOiAxKTsKKyAgICBjb25zdCBpbnQgc3RyaWRlMiA9IHN0cmlkZSA8PCAxOworCisgICAgZm9yIChzbGljZSA9IDA7IHNsaWNlIDwgc2xpY2VzOyBzbGljZSsrKSB7CisgICAgICAgIHNsaWNlX3N0YXJ0ICAgID0gKChzbGljZSAqIGhlaWdodCkgLyBzbGljZXMpICYgY21hc2s7CisgICAgICAgIHNsaWNlX2hlaWdodCAgID0gKCgoKHNsaWNlICsgMSkgKiBoZWlnaHQpIC8gc2xpY2VzKSAmIGNtYXNrKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2Vfc3RhcnQ7CisgICAgICAgIHNsaWNlX2hlaWdodCA+Pj0gMTsKKworICAgICAgICBic3JjID0gc3JjICsgc2xpY2Vfc3RhcnQgKiBzdHJpZGU7CisKKyAgICAgICAgLy8gZmlyc3QgbGluZSAtIGxlZnQgbmVpZ2hib3VyIHByZWRpY3Rpb24KKyAgICAgICAgYnNyY1swXSArPSAweDgwOworICAgICAgICBBICAgICAgICA9IGJzcmNbMF07CisgICAgICAgIGZvciAoaSA9IHN0ZXA7IGkgPCB3aWR0aCAqIHN0ZXA7IGkgKz0gc3RlcCkgeworICAgICAgICAgICAgYnNyY1tpXSArPSBBOworICAgICAgICAgICAgQSAgICAgICAgPSBic3JjW2ldOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAqIHN0ZXA7IGkgKz0gc3RlcCkgeworICAgICAgICAgICAgYnNyY1tzdHJpZGUgKyBpXSArPSBBOworICAgICAgICAgICAgQSAgICAgICAgICAgICAgICAgPSBic3JjW3N0cmlkZSArIGldOworICAgICAgICB9CisgICAgICAgIGJzcmMgKz0gc3RyaWRlMjsKKyAgICAgICAgaWYgKHNsaWNlX2hlaWdodCA8PSAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIC8vIHNlY29uZCBsaW5lIC0gZmlyc3QgZWxlbWVudCBoYXMgdG9wIHByZWRpY3Rpb24sIHRoZSByZXN0IHVzZXMgbWVkaWFuCisgICAgICAgIEMgICAgICAgID0gYnNyY1stc3RyaWRlMl07CisgICAgICAgIGJzcmNbMF0gKz0gQzsKKyAgICAgICAgQSAgICAgICAgPSBic3JjWzBdOworICAgICAgICBmb3IgKGkgPSBzdGVwOyBpIDwgd2lkdGggKiBzdGVwOyBpICs9IHN0ZXApIHsKKyAgICAgICAgICAgIEIgICAgICAgID0gYnNyY1tpIC0gc3RyaWRlMl07CisgICAgICAgICAgICBic3JjW2ldICs9IG1pZF9wcmVkKEEsIEIsICh1aW50OF90KShBICsgQiAtIEMpKTsKKyAgICAgICAgICAgIEMgICAgICAgID0gQjsKKyAgICAgICAgICAgIEEgICAgICAgID0gYnNyY1tpXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggKiBzdGVwOyBpICs9IHN0ZXApIHsKKyAgICAgICAgICAgIEIgICAgICAgICAgICAgICAgID0gYnNyY1tpIC0gc3RyaWRlXTsKKyAgICAgICAgICAgIGJzcmNbc3RyaWRlICsgaV0gKz0gbWlkX3ByZWQoQSwgQiwgKHVpbnQ4X3QpKEEgKyBCIC0gQykpOworICAgICAgICAgICAgQyAgICAgICAgICAgICAgICAgPSBCOworICAgICAgICAgICAgQSAgICAgICAgICAgICAgICAgPSBic3JjW3N0cmlkZSArIGldOworICAgICAgICB9CisgICAgICAgIGJzcmMgKz0gc3RyaWRlMjsKKyAgICAgICAgLy8gdGhlIHJlc3Qgb2YgbGluZXMgdXNlIGNvbnRpbnVvdXMgbWVkaWFuIHByZWRpY3Rpb24KKyAgICAgICAgZm9yIChqID0gMjsgaiA8IHNsaWNlX2hlaWdodDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggKiBzdGVwOyBpICs9IHN0ZXApIHsKKyAgICAgICAgICAgICAgICBCICAgICAgICA9IGJzcmNbaSAtIHN0cmlkZTJdOworICAgICAgICAgICAgICAgIGJzcmNbaV0gKz0gbWlkX3ByZWQoQSwgQiwgKHVpbnQ4X3QpKEEgKyBCIC0gQykpOworICAgICAgICAgICAgICAgIEMgICAgICAgID0gQjsKKyAgICAgICAgICAgICAgICBBICAgICAgICA9IGJzcmNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggKiBzdGVwOyBpICs9IHN0ZXApIHsKKyAgICAgICAgICAgICAgICBCICAgICAgICAgICAgICAgICA9IGJzcmNbaSAtIHN0cmlkZV07CisgICAgICAgICAgICAgICAgYnNyY1tpICsgc3RyaWRlXSArPSBtaWRfcHJlZChBLCBCLCAodWludDhfdCkoQSArIEIgLSBDKSk7CisgICAgICAgICAgICAgICAgQyAgICAgICAgICAgICAgICAgPSBCOworICAgICAgICAgICAgICAgIEEgICAgICAgICAgICAgICAgID0gYnNyY1tpICsgc3RyaWRlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJzcmMgKz0gc3RyaWRlMjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBVdHZpZGVvQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIGo7CisgICAgY29uc3QgdWludDhfdCAqcGxhbmVfc3RhcnRbNV07CisgICAgaW50IHBsYW5lX3NpemUsIG1heF9zbGljZV9zaXplID0gMCwgc2xpY2Vfc3RhcnQsIHNsaWNlX2VuZCwgc2xpY2Vfc2l6ZTsKKyAgICBpbnQgcmV0OworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIFRocmVhZEZyYW1lIGZyYW1lID0geyAuZiA9IGRhdGEgfTsKKworICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIHBhcnNlIHBsYW5lIHN0cnVjdHVyZSB0byBnZXQgZnJhbWUgZmxhZ3MgYW5kIHZhbGlkYXRlIHNsaWNlIG9mZnNldHMgKi8KKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmLCBidWZfc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IGMtPnBsYW5lczsgaSsrKSB7CisgICAgICAgIHBsYW5lX3N0YXJ0W2ldID0gZ2IuYnVmZmVyOworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IDI1NiArIDQgKiBjLT5zbGljZXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGRhdGEgZm9yIGEgcGxhbmVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCAyNTYpOworICAgICAgICBzbGljZV9zdGFydCA9IDA7CisgICAgICAgIHNsaWNlX2VuZCAgID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGMtPnNsaWNlczsgaisrKSB7CisgICAgICAgICAgICBzbGljZV9lbmQgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMydSgmZ2IpOworICAgICAgICAgICAgc2xpY2Vfc2l6ZSAgPSBzbGljZV9lbmQgLSBzbGljZV9zdGFydDsKKyAgICAgICAgICAgIGlmIChzbGljZV9lbmQgPCAwIHx8IHNsaWNlX3NpemUgPCAwIHx8CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IHNsaWNlX2VuZCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IHNsaWNlIHNpemVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xpY2Vfc3RhcnQgPSBzbGljZV9lbmQ7CisgICAgICAgICAgICBtYXhfc2xpY2Vfc2l6ZSA9IEZGTUFYKG1heF9zbGljZV9zaXplLCBzbGljZV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBwbGFuZV9zaXplID0gc2xpY2VfZW5kOworICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIHBsYW5lX3NpemUpOworICAgIH0KKyAgICBwbGFuZV9zdGFydFtjLT5wbGFuZXNdID0gZ2IuYnVmZmVyOworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgYy0+ZnJhbWVfaW5mb19zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm90IGVub3VnaCBkYXRhIGZvciBmcmFtZSBpbmZvcm1hdGlvblxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBjLT5mcmFtZV9pbmZvID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzJ1KCZnYik7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJmcmFtZSBpbmZvcm1hdGlvbiBmbGFncyAlIlBSSVgzMiJcbiIsCisgICAgICAgICAgIGMtPmZyYW1lX2luZm8pOworCisgICAgYy0+ZnJhbWVfcHJlZCA9IChjLT5mcmFtZV9pbmZvID4+IDgpICYgMzsKKworICAgIGlmIChjLT5mcmFtZV9wcmVkID09IFBSRURfR1JBRElFTlQpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiRnJhbWUgd2l0aCBncmFkaWVudCBwcmVkaWN0aW9uIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBhdl9mYXN0X21hbGxvYygmYy0+c2xpY2VfYml0cywgJmMtPnNsaWNlX2JpdHNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBtYXhfc2xpY2Vfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCisgICAgaWYgKCFjLT5zbGljZV9iaXRzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHN3aXRjaCAoYy0+YXZjdHgtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5wbGFuZXM7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3BsYW5lKGMsIGksIGZyYW1lLmYtPmRhdGFbMF0gKyBmZl91dF9yZ2Jfb3JkZXJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGxhbmVzLCBmcmFtZS5mLT5saW5lc2l6ZVswXSwgYXZjdHgtPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQsIHBsYW5lX3N0YXJ0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmZyYW1lX3ByZWQgPT0gUFJFRF9MRUZUKTsKKyAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGlmIChjLT5mcmFtZV9wcmVkID09IFBSRURfTUVESUFOKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjLT5pbnRlcmxhY2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfbWVkaWFuKGZyYW1lLmYtPmRhdGFbMF0gKyBmZl91dF9yZ2Jfb3JkZXJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnBsYW5lcywgZnJhbWUuZi0+bGluZXNpemVbMF0sIGF2Y3R4LT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmhlaWdodCwgYy0+c2xpY2VzLCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN0b3JlX21lZGlhbl9pbChmcmFtZS5mLT5kYXRhWzBdICsgZmZfdXRfcmdiX29yZGVyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5wbGFuZXMsIGZyYW1lLmYtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIGMtPnNsaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc3RvcmVfcmdiX3BsYW5lcyhmcmFtZS5mLT5kYXRhWzBdLCBjLT5wbGFuZXMsIGZyYW1lLmYtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9wbGFuZShjLCBpLCBmcmFtZS5mLT5kYXRhW2ldLCAxLCBmcmFtZS5mLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggPj4gISFpLCBhdmN0eC0+aGVpZ2h0ID4+ICEhaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9zdGFydFtpXSwgYy0+ZnJhbWVfcHJlZCA9PSBQUkVEX0xFRlQpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKGMtPmZyYW1lX3ByZWQgPT0gUFJFRF9NRURJQU4pIHsKKyAgICAgICAgICAgICAgICBpZiAoIWMtPmludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9tZWRpYW4oZnJhbWUuZi0+ZGF0YVtpXSwgMSwgZnJhbWUuZi0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCA+PiAhIWksIGF2Y3R4LT5oZWlnaHQgPj4gISFpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zbGljZXMsICFpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN0b3JlX21lZGlhbl9pbChmcmFtZS5mLT5kYXRhW2ldLCAxLCBmcmFtZS5mLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoICA+PiAhIWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQgPj4gISFpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zbGljZXMsICFpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9wbGFuZShjLCBpLCBmcmFtZS5mLT5kYXRhW2ldLCAxLCBmcmFtZS5mLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggPj4gISFpLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX3N0YXJ0W2ldLCBjLT5mcmFtZV9wcmVkID09IFBSRURfTEVGVCk7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAoYy0+ZnJhbWVfcHJlZCA9PSBQUkVEX01FRElBTikgeworICAgICAgICAgICAgICAgIGlmICghYy0+aW50ZXJsYWNlZCkgeworICAgICAgICAgICAgICAgICAgICByZXN0b3JlX21lZGlhbihmcmFtZS5mLT5kYXRhW2ldLCAxLCBmcmFtZS5mLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoID4+ICEhaSwgYXZjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2xpY2VzLCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN0b3JlX21lZGlhbl9pbChmcmFtZS5mLT5kYXRhW2ldLCAxLCBmcmFtZS5mLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoID4+ICEhaSwgYXZjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2xpY2VzLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZnJhbWUuZi0+a2V5X2ZyYW1lID0gMTsKKyAgICBmcmFtZS5mLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBmcmFtZS5mLT5pbnRlcmxhY2VkX2ZyYW1lID0gISFjLT5pbnRlcmxhY2VkOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICAvKiBhbHdheXMgcmVwb3J0IHRoYXQgdGhlIGJ1ZmZlciB3YXMgY29tcGxldGVseSBjb25zdW1lZCAqLworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBVdHZpZGVvQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYy0+YXZjdHggPSBhdmN0eDsKKworICAgIGZmX2Jzd2FwZHNwX2luaXQoJmMtPmJkc3ApOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDE2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkluc3VmZmljaWVudCBleHRyYWRhdGEgc2l6ZSAlZCwgc2hvdWxkIGJlIGF0IGxlYXN0IDE2XG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJFbmNvZGVyIHZlcnNpb24gJWQuJWQuJWQuJWRcbiIsCisgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFbM10sIGF2Y3R4LT5leHRyYWRhdGFbMl0sCisgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFbMV0sIGF2Y3R4LT5leHRyYWRhdGFbMF0pOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiT3JpZ2luYWwgZm9ybWF0ICUiUFJJWDMyIlxuIiwKKyAgICAgICAgICAgQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhICsgNCkpOworICAgIGMtPmZyYW1lX2luZm9fc2l6ZSA9IEFWX1JMMzIoYXZjdHgtPmV4dHJhZGF0YSArIDgpOworICAgIGMtPmZsYWdzICAgICAgICAgICA9IEFWX1JMMzIoYXZjdHgtPmV4dHJhZGF0YSArIDEyKTsKKworICAgIGlmIChjLT5mcmFtZV9pbmZvX3NpemUgIT0gNCkKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiRnJhbWUgaW5mbyBub3QgNCBieXRlcyIpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRW5jb2RpbmcgcGFyYW1ldGVycyAlMDgiUFJJWDMyIlxuIiwgYy0+ZmxhZ3MpOworICAgIGMtPnNsaWNlcyAgICAgID0gKGMtPmZsYWdzID4+IDI0KSArIDE7CisgICAgYy0+Y29tcHJlc3Npb24gPSBjLT5mbGFncyAmIDE7CisgICAgYy0+aW50ZXJsYWNlZCAgPSBjLT5mbGFncyAmIDB4ODAwOworCisgICAgYy0+c2xpY2VfYml0c19zaXplID0gMDsKKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX3RhZykgeworICAgIGNhc2UgTUtUQUcoJ1UnLCAnTCcsICdSJywgJ0cnKToKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSAzOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnTCcsICdSJywgJ0EnKToKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSA0OworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnVScsICdMJywgJ1knLCAnMCcpOgorICAgICAgICBjLT5wbGFuZXMgICAgICA9IDM7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdVJywgJ0wnLCAnWScsICcyJyk6CisgICAgICAgIGMtPnBsYW5lcyAgICAgID0gMzsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CisgICAgICAgIGF2Y3R4LT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNDcwQkc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnTCcsICdIJywgJzAnKToKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSAzOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnTCcsICdIJywgJzInKToKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSAzOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBVdCBWaWRlbyBGT1VSQ0MgcHJvdmlkZWQgKCUwOFgpXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVXR2aWRlb0NvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZjLT5zbGljZV9iaXRzKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3V0dmlkZW9fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidXR2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlV0IFZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1VUVklERU8sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFV0dmlkZW9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdXR2aWRlb2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdXR2aWRlb2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NWZkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy91dHZpZGVvZW5jLmMKQEAgLTAsMCArMSw2NTEgQEAKKy8qCisgKiBVdCBWaWRlbyBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSmFuIEVrc3Ryw7ZtCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFV0IFZpZGVvIGVuY29kZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAiaHVmZnl1dmVuY2RzcC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJ1dHZpZGVvLmgiCisjaW5jbHVkZSAiaHVmZm1hbi5oIgorCisvKiBDb21wYXJlIGh1ZmZlbnRyeSBzeW1ib2xzICovCitzdGF0aWMgaW50IGh1ZmZfY21wX3N5bShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIGNvbnN0IEh1ZmZFbnRyeSAqYWEgPSBhLCAqYmIgPSBiOworICAgIHJldHVybiBhYS0+c3ltIC0gYmItPnN5bTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHV0dmlkZW9fZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBVdHZpZGVvQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKyAgICBhdl9mcmVlcCgmYy0+c2xpY2VfYml0cyk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmMtPnNsaWNlX2J1ZmZlcltpXSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHV0dmlkZW9fZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFV0dmlkZW9Db250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgc3Vic2FtcGxlZF9oZWlnaHQ7CisgICAgdWludDMyX3Qgb3JpZ2luYWxfZm9ybWF0OworCisgICAgYy0+YXZjdHggICAgICAgICAgID0gYXZjdHg7CisgICAgYy0+ZnJhbWVfaW5mb19zaXplID0gNDsKKyAgICBjLT5zbGljZV9zdHJpZGUgICAgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgMzIpOworCisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgYy0+cGxhbmVzICAgICAgICA9IDM7CisgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnVScsICdMJywgJ1InLCAnRycpOworICAgICAgICBvcmlnaW5hbF9mb3JtYXQgID0gVVRWSURFT19SR0I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBOgorICAgICAgICBjLT5wbGFuZXMgICAgICAgID0gNDsKKyAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IE1LVEFHKCdVJywgJ0wnLCAnUicsICdBJyk7CisgICAgICAgIG9yaWdpbmFsX2Zvcm1hdCAgPSBVVFZJREVPX1JHQkE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgICAgICBpZiAoYXZjdHgtPndpZHRoICYgMSB8fCBhdmN0eC0+aGVpZ2h0ICYgMSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIjQ6MjowIHZpZGVvIHJlcXVpcmVzIGV2ZW4gd2lkdGggYW5kIGhlaWdodC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYy0+cGxhbmVzICAgICAgICA9IDM7CisgICAgICAgIGlmIChhdmN0eC0+Y29sb3JzcGFjZSA9PSBBVkNPTF9TUENfQlQ3MDkpCisgICAgICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID0gTUtUQUcoJ1UnLCAnTCcsICdIJywgJzAnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IE1LVEFHKCdVJywgJ0wnLCAnWScsICcwJyk7CisgICAgICAgIG9yaWdpbmFsX2Zvcm1hdCAgPSBVVFZJREVPXzQyMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6CisgICAgICAgIGlmIChhdmN0eC0+d2lkdGggJiAxKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiNDoyOjIgdmlkZW8gcmVxdWlyZXMgZXZlbiB3aWR0aC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYy0+cGxhbmVzICAgICAgICA9IDM7CisgICAgICAgIGlmIChhdmN0eC0+Y29sb3JzcGFjZSA9PSBBVkNPTF9TUENfQlQ3MDkpCisgICAgICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID0gTUtUQUcoJ1UnLCAnTCcsICdIJywgJzInKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IE1LVEFHKCdVJywgJ0wnLCAnWScsICcyJyk7CisgICAgICAgIG9yaWdpbmFsX2Zvcm1hdCAgPSBVVFZJREVPXzQyMjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIHBpeGVsIGZvcm1hdDogJWRcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZmX2Jzd2FwZHNwX2luaXQoJmMtPmJkc3ApOworICAgIGZmX2h1ZmZ5dXZlbmNkc3BfaW5pdCgmYy0+aGRzcCk7CisKKyAgICAvKiBDaGVjayB0aGUgcHJlZGljdGlvbiBtZXRob2QsIGFuZCBlcnJvciBvdXQgaWYgdW5zdXBwb3J0ZWQgKi8KKyAgICBpZiAoYXZjdHgtPnByZWRpY3Rpb25fbWV0aG9kIDwgMCB8fCBhdmN0eC0+cHJlZGljdGlvbl9tZXRob2QgPiA0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiUHJlZGljdGlvbiBtZXRob2QgJWQgaXMgbm90IHN1cHBvcnRlZCBpbiBVdCBWaWRlby5cbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+cHJlZGljdGlvbl9tZXRob2QpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cHJlZGljdGlvbl9tZXRob2QgPT0gRkZfUFJFRF9QTEFORSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJQbGFuZSBwcmVkaWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gVXQgVmlkZW8uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfT1BUSU9OX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAvKiBDb252ZXJ0IGZyb20gbGliYXZjb2RlYyBwcmVkaWN0aW9uIHR5cGUgdG8gVXQgVmlkZW8ncyAqLworICAgIGMtPmZyYW1lX3ByZWQgPSBmZl91dF9wcmVkX29yZGVyW2F2Y3R4LT5wcmVkaWN0aW9uX21ldGhvZF07CisKKyAgICBpZiAoYy0+ZnJhbWVfcHJlZCA9PSBQUkVEX0dSQURJRU5UKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiR3JhZGllbnQgcHJlZGljdGlvbiBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgYXNrZWQgc2xpY2UgY291bnQgZm9yIG9idmlvdXNseSBpbnZhbGlkCisgICAgICogdmFsdWVzICg+IDI1NiBvciBuZWdhdGl2ZSkuCisgICAgICovCisgICAgaWYgKGF2Y3R4LT5zbGljZXMgPiAyNTYgfHwgYXZjdHgtPnNsaWNlcyA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiU2xpY2UgY291bnQgJWQgaXMgbm90IHN1cHBvcnRlZCBpbiBVdCBWaWRlbyAodGhlb3JldGljYWwgcmFuZ2UgaXMgMC0yNTYpLlxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5zbGljZXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8qIENoZWNrIHRoYXQgdGhlIHNsaWNlIGNvdW50IGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgc3Vic2FtcGxlZCBoZWlnaHQgKi8KKyAgICBzdWJzYW1wbGVkX2hlaWdodCA9IGF2Y3R4LT5oZWlnaHQgPj4gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCktPmxvZzJfY2hyb21hX2g7CisgICAgaWYgKGF2Y3R4LT5zbGljZXMgPiBzdWJzYW1wbGVkX2hlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJTbGljZSBjb3VudCAlZCBpcyBsYXJnZXIgdGhhbiB0aGUgc3Vic2FtcGxpbmctYXBwbGllZCBoZWlnaHQgJWQuXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPnNsaWNlcywgc3Vic2FtcGxlZF9oZWlnaHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisKKyAgICBpZiAoIWF2Y3R4LT5jb2RlZF9mcmFtZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBmcmFtZS5cbiIpOworICAgICAgICB1dHZpZGVvX2VuY29kZV9jbG9zZShhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLyogZXh0cmFkYXRhIHNpemUgaXMgNCAqIDMyYml0ICovCisgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMTY7CisKKyAgICBhdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCisgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIGV4dHJhZGF0YS5cbiIpOworICAgICAgICB1dHZpZGVvX2VuY29kZV9jbG9zZShhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGMtPnBsYW5lczsgaSsrKSB7CisgICAgICAgIGMtPnNsaWNlX2J1ZmZlcltpXSA9IGF2X21hbGxvYyhjLT5zbGljZV9zdHJpZGUgKiAoYXZjdHgtPmhlaWdodCArIDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIWMtPnNsaWNlX2J1ZmZlcltpXSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgdGVtcG9yYXJ5IGJ1ZmZlciAxLlxuIik7CisgICAgICAgICAgICB1dHZpZGVvX2VuY29kZV9jbG9zZShhdmN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHZlcnNpb24gb2YgdGhlIGVuY29kZXIuCisgICAgICogTGFzdCBieXRlIGlzICJpbXBsZW1lbnRhdGlvbiBJRCIsIHdoaWNoIGlzCisgICAgICogb2J0YWluZWQgZnJvbSB0aGUgY3JlYXRvciBvZiB0aGUgZm9ybWF0LgorICAgICAqIExpYmF2Y29kZWMgaGFzIGJlZW4gYXNzaWduZWQgd2l0aCB0aGUgSUQgMHhGMC4KKyAgICAgKi8KKyAgICBBVl9XQjMyKGF2Y3R4LT5leHRyYWRhdGEsIE1LVEFHKDEsIDAsIDAsIDB4RjApKTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSAib3JpZ2luYWwgZm9ybWF0IgorICAgICAqIE5vdCB1c2VkIGZvciBhbnl0aGluZyBkdXJpbmcgZGVjb2RpbmcuCisgICAgICovCisgICAgQVZfV0wzMihhdmN0eC0+ZXh0cmFkYXRhICsgNCwgb3JpZ2luYWxfZm9ybWF0KTsKKworICAgIC8qIFdyaXRlIDQgYXMgdGhlICdmcmFtZSBpbmZvIHNpemUnICovCisgICAgQVZfV0wzMihhdmN0eC0+ZXh0cmFkYXRhICsgOCwgYy0+ZnJhbWVfaW5mb19zaXplKTsKKworICAgIC8qCisgICAgICogU2V0IGhvdyBtYW55IHNsaWNlcyBhcmUgZ29pbmcgdG8gYmUgdXNlZC4KKyAgICAgKiBCeSBkZWZhdWx0IHVzZXMgbXVsdGlwbGUgc2xpY2VzIGRlcGVuZGluZyBvbiB0aGUgc3Vic2FtcGxlZCBoZWlnaHQuCisgICAgICogVGhpcyBlbmFibGVzIG11bHRpdGhyZWFkaW5nIGluIHRoZSBvZmZpY2lhbCBkZWNvZGVyLgorICAgICAqLworICAgIGlmICghYXZjdHgtPnNsaWNlcykgeworICAgICAgICBjLT5zbGljZXMgPSBzdWJzYW1wbGVkX2hlaWdodCAvIDEyMDsKKworICAgICAgICBpZiAoIWMtPnNsaWNlcykKKyAgICAgICAgICAgIGMtPnNsaWNlcyA9IDE7CisgICAgICAgIGVsc2UgaWYgKGMtPnNsaWNlcyA+IDI1NikKKyAgICAgICAgICAgIGMtPnNsaWNlcyA9IDI1NjsKKyAgICB9IGVsc2UgeworICAgICAgICBjLT5zbGljZXMgPSBhdmN0eC0+c2xpY2VzOworICAgIH0KKworICAgIC8qIFNldCBjb21wcmVzc2lvbiBtb2RlICovCisgICAgYy0+Y29tcHJlc3Npb24gPSBDT01QX0hVRkY7CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgZW5jb2RpbmcgZmxhZ3M6CisgICAgICogLSBTbGljZSBjb3VudCBtaW51cyAxCisgICAgICogLSBJbnRlcmxhY2VkIGVuY29kaW5nIG1vZGUgZmxhZywgc2V0IHRvIHplcm8gZm9yIG5vdy4KKyAgICAgKiAtIENvbXByZXNzaW9uIG1vZGUgKG5vbmUvaHVmZikKKyAgICAgKiBBbmQgd3JpdGUgdGhlIGZsYWdzLgorICAgICAqLworICAgIGMtPmZsYWdzICA9IChjLT5zbGljZXMgLSAxKSA8PCAyNDsKKyAgICBjLT5mbGFncyB8PSAwIDw8IDExOyAvLyBiaXQgZmllbGQgdG8gc2lnbmFsIGludGVybGFjZWQgZW5jb2RpbmcgbW9kZQorICAgIGMtPmZsYWdzIHw9IGMtPmNvbXByZXNzaW9uOworCisgICAgQVZfV0wzMihhdmN0eC0+ZXh0cmFkYXRhICsgMTIsIGMtPmZsYWdzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYW5nbGVfcmdiX3BsYW5lcyh1aW50OF90ICpkc3RbNF0sIGludCBkc3Rfc3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBpLCBqOworICAgIGludCBrID0gMiAqIGRzdF9zdHJpZGU7CisgICAgdW5zaWduZWQgaW50IGc7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgaWYgKHN0ZXAgPT0gMykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoICogc3RlcDsgaSArPSBzdGVwKSB7CisgICAgICAgICAgICAgICAgZyAgICAgICAgID0gc3JjW2kgKyAxXTsKKyAgICAgICAgICAgICAgICBkc3RbMF1ba10gPSBnOworICAgICAgICAgICAgICAgIGcgICAgICAgICs9IDB4ODA7CisgICAgICAgICAgICAgICAgZHN0WzFdW2tdID0gc3JjW2kgKyAyXSAtIGc7CisgICAgICAgICAgICAgICAgZHN0WzJdW2tdID0gc3JjW2kgKyAwXSAtIGc7CisgICAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoICogc3RlcDsgaSArPSBzdGVwKSB7CisgICAgICAgICAgICAgICAgZyAgICAgICAgID0gc3JjW2kgKyAxXTsKKyAgICAgICAgICAgICAgICBkc3RbMF1ba10gPSBnOworICAgICAgICAgICAgICAgIGcgICAgICAgICs9IDB4ODA7CisgICAgICAgICAgICAgICAgZHN0WzFdW2tdID0gc3JjW2kgKyAyXSAtIGc7CisgICAgICAgICAgICAgICAgZHN0WzJdW2tdID0gc3JjW2kgKyAwXSAtIGc7CisgICAgICAgICAgICAgICAgZHN0WzNdW2tdID0gc3JjW2kgKyAzXTsKKyAgICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgayArPSBkc3Rfc3RyaWRlIC0gd2lkdGg7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQorCisvKiBXcml0ZSBkYXRhIHRvIGEgcGxhbmUgd2l0aCBsZWZ0IHByZWRpY3Rpb24gKi8KK3N0YXRpYyB2b2lkIGxlZnRfcHJlZGljdCh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IGksIGo7CisgICAgdWludDhfdCBwcmV2OworCisgICAgcHJldiA9IDB4ODA7IC8qIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSAqLworICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgKmRzdCsrID0gc3JjW2ldIC0gcHJldjsKKyAgICAgICAgICAgIHByZXYgICA9IHNyY1tpXTsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgIH0KK30KKworLyogV3JpdGUgZGF0YSB0byBhIHBsYW5lIHdpdGggbWVkaWFuIHByZWRpY3Rpb24gKi8KK3N0YXRpYyB2b2lkIG1lZGlhbl9wcmVkaWN0KFV0dmlkZW9Db250ZXh0ICpjLCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgQSwgQjsKKyAgICB1aW50OF90IHByZXY7CisKKyAgICAvKiBGaXJzdCBsaW5lIHVzZXMgbGVmdCBuZWlnaGJvdXIgcHJlZGljdGlvbiAqLworICAgIHByZXYgPSAweDgwOyAvKiBTZXQgdGhlIGluaXRpYWwgdmFsdWUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAqZHN0KysgPSBzcmNbaV0gLSBwcmV2OworICAgICAgICBwcmV2ICAgPSBzcmNbaV07CisgICAgfQorCisgICAgaWYgKGhlaWdodCA9PSAxKQorICAgICAgICByZXR1cm47CisKKyAgICBzcmMgKz0gc3RyaWRlOworCisgICAgLyoKKyAgICAgKiBTZWNvbmQgbGluZSB1c2VzIHRvcCBwcmVkaWN0aW9uIGZvciB0aGUgZmlyc3Qgc2FtcGxlLAorICAgICAqIGFuZCBtZWRpYW4gZm9yIHRoZSByZXN0LgorICAgICAqLworICAgIEEgPSBCID0gMDsKKworICAgIC8qIFJlc3Qgb2YgdGhlIGNvZGVkIHBhcnQgdXNlcyBtZWRpYW4gcHJlZGljdGlvbiAqLworICAgIGZvciAoaiA9IDE7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICBjLT5oZHNwLnN1Yl9oZnl1X21lZGlhbl9wcmVkKGRzdCwgc3JjIC0gc3RyaWRlLCBzcmMsIHdpZHRoLCAmQSwgJkIpOworICAgICAgICBkc3QgKz0gd2lkdGg7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQorCisvKiBDb3VudCB0aGUgdXNhZ2Ugb2YgdmFsdWVzIGluIGEgcGxhbmUgKi8KK3N0YXRpYyB2b2lkIGNvdW50X3VzYWdlKHVpbnQ4X3QgKnNyYywgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgdWludDY0X3QgKmNvdW50cykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgY291bnRzW3NyY1tpXV0rKzsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gd2lkdGg7CisgICAgfQorfQorCisvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCBodWZmbWFuIGNvZGVzIGZyb20gdGhlIGNvZGUgbGVuZ3RocyAqLworc3RhdGljIHZvaWQgY2FsY3VsYXRlX2NvZGVzKEh1ZmZFbnRyeSAqaGUpCit7CisgICAgaW50IGxhc3QsIGk7CisgICAgdWludDMyX3QgY29kZTsKKworICAgIHFzb3J0KGhlLCAyNTYsIHNpemVvZigqaGUpLCBmZl91dF9odWZmX2NtcF9sZW4pOworCisgICAgbGFzdCA9IDI1NTsKKyAgICB3aGlsZSAoaGVbbGFzdF0ubGVuID09IDI1NSAmJiBsYXN0KQorICAgICAgICBsYXN0LS07CisKKyAgICBjb2RlID0gMTsKKyAgICBmb3IgKGkgPSBsYXN0OyBpID49IDA7IGktLSkgeworICAgICAgICBoZVtpXS5jb2RlICA9IGNvZGUgPj4gKDMyIC0gaGVbaV0ubGVuKTsKKyAgICAgICAgY29kZSAgICAgICArPSAweDgwMDAwMDAwdSA+PiAoaGVbaV0ubGVuIC0gMSk7CisgICAgfQorCisgICAgcXNvcnQoaGUsIDI1Niwgc2l6ZW9mKCpoZSksIGh1ZmZfY21wX3N5bSk7Cit9CisKKy8qIFdyaXRlIGh1ZmZtYW4gYml0IGNvZGVzIHRvIGEgbWVtb3J5IGJsb2NrICovCitzdGF0aWMgaW50IHdyaXRlX2h1ZmZfY29kZXModWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBkc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEh1ZmZFbnRyeSAqaGUpCit7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgY291bnQ7CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgZHN0LCBkc3Rfc2l6ZSk7CisKKyAgICAvKiBXcml0ZSB0aGUgY29kZXMgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgICAgICBwdXRfYml0cygmcGIsIGhlW3NyY1tpXV0ubGVuLCBoZVtzcmNbaV1dLmNvZGUpOworCisgICAgICAgIHNyYyArPSB3aWR0aDsKKyAgICB9CisKKyAgICAvKiBQYWQgb3V0cHV0IHRvIGEgMzJiaXQgYm91bmRhcnkgKi8KKyAgICBjb3VudCA9IHB1dF9iaXRzX2NvdW50KCZwYikgJiAweDFGOworCisgICAgaWYgKGNvdW50KQorICAgICAgICBwdXRfYml0cygmcGIsIDMyIC0gY291bnQsIDApOworCisgICAgLyogR2V0IHRoZSBhbW91bnQgb2YgYml0cyB3cml0dGVuICovCisgICAgY291bnQgPSBwdXRfYml0c19jb3VudCgmcGIpOworCisgICAgLyogRmx1c2ggdGhlIHJlc3Qgd2l0aCB6ZXJvZXMgKi8KKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworCisgICAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGVuY29kZV9wbGFuZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IHBsYW5lX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBQdXRCeXRlQ29udGV4dCAqcGIpCit7CisgICAgVXR2aWRlb0NvbnRleHQgKmMgICAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICBsZW5ndGhzWzI1Nl07CisgICAgdWludDY0X3QgY291bnRzWzI1Nl0gICAgID0geyAwIH07CisKKyAgICBIdWZmRW50cnkgaGVbMjU2XTsKKworICAgIHVpbnQzMl90IG9mZnNldCA9IDAsIHNsaWNlX2xlbiA9IDA7CisgICAgY29uc3QgaW50IGNtYXNrID0gfighcGxhbmVfbm8gJiYgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKTsKKyAgICBpbnQgICAgICBpLCBzc3RhcnQsIHNlbmQgPSAwOworICAgIGludCAgICAgIHN5bWJvbDsKKyAgICBpbnQgICAgICByZXQ7CisKKyAgICAvKiBEbyBwcmVkaWN0aW9uIC8gbWFrZSBwbGFuZXMgKi8KKyAgICBzd2l0Y2ggKGMtPmZyYW1lX3ByZWQpIHsKKyAgICBjYXNlIFBSRURfTk9ORToKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPnNsaWNlczsgaSsrKSB7CisgICAgICAgICAgICBzc3RhcnQgPSBzZW5kOworICAgICAgICAgICAgc2VuZCAgID0gaGVpZ2h0ICogKGkgKyAxKSAvIGMtPnNsaWNlcyAmIGNtYXNrOworICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShkc3QgKyBzc3RhcnQgKiB3aWR0aCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyArIHNzdGFydCAqIHN0cmlkZSwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgc2VuZCAtIHNzdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQUkVEX0xFRlQ6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5zbGljZXM7IGkrKykgeworICAgICAgICAgICAgc3N0YXJ0ID0gc2VuZDsKKyAgICAgICAgICAgIHNlbmQgICA9IGhlaWdodCAqIChpICsgMSkgLyBjLT5zbGljZXMgJiBjbWFzazsKKyAgICAgICAgICAgIGxlZnRfcHJlZGljdChzcmMgKyBzc3RhcnQgKiBzdHJpZGUsIGRzdCArIHNzdGFydCAqIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgd2lkdGgsIHNlbmQgLSBzc3RhcnQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUFJFRF9NRURJQU46CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5zbGljZXM7IGkrKykgeworICAgICAgICAgICAgc3N0YXJ0ID0gc2VuZDsKKyAgICAgICAgICAgIHNlbmQgICA9IGhlaWdodCAqIChpICsgMSkgLyBjLT5zbGljZXMgJiBjbWFzazsKKyAgICAgICAgICAgIG1lZGlhbl9wcmVkaWN0KGMsIHNyYyArIHNzdGFydCAqIHN0cmlkZSwgZHN0ICsgc3N0YXJ0ICogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHdpZHRoLCBzZW5kIC0gc3N0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gcHJlZGljdGlvbiBtb2RlOiAlZFxuIiwKKyAgICAgICAgICAgICAgIGMtPmZyYW1lX3ByZWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworICAgIH0KKworICAgIC8qIENvdW50IHRoZSB1c2FnZSBvZiB2YWx1ZXMgKi8KKyAgICBjb3VudF91c2FnZShkc3QsIHdpZHRoLCBoZWlnaHQsIGNvdW50cyk7CisKKyAgICAvKiBDaGVjayBmb3IgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgb25seSBvbmUgc3ltYm9sIHdhcyB1c2VkICovCisgICAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCAyNTY7IHN5bWJvbCsrKSB7CisgICAgICAgIC8qIElmIG5vbi16ZXJvIGNvdW50IGlzIGZvdW5kLCBzZWUgaWYgaXQgbWF0Y2hlcyB3aWR0aCAqIGhlaWdodCAqLworICAgICAgICBpZiAoY291bnRzW3N5bWJvbF0pIHsKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSBpZiBvbmx5IG9uZSBzeW1ib2wgd2FzIHVzZWQgKi8KKyAgICAgICAgICAgIGlmIChjb3VudHNbc3ltYm9sXSA9PSB3aWR0aCAqIChpbnQ2NF90KWhlaWdodCkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogV3JpdGUgYSB6ZXJvIGZvciB0aGUgc2luZ2xlIHN5bWJvbAorICAgICAgICAgICAgICAgICAqIHVzZWQgaW4gdGhlIHBsYW5lLCBlbHNlIDB4RkYuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IHN5bWJvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIDB4RkYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFdyaXRlIHplcm9lcyBmb3IgbGVuZ3RocyAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5zbGljZXM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2xlMzIocGIsIDApOworCisgICAgICAgICAgICAgICAgLyogQW5kIHRoYXQncyBhbGwgZm9yIHRoYXQgcGxhbmUgZm9sa3MgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIGh1ZmZtYW4gbGVuZ3RocyAqLworICAgIGlmICgocmV0ID0gZmZfaHVmZl9nZW5fbGVuX3RhYmxlKGxlbmd0aHMsIGNvdW50cywgMjU2LCAxKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyoKKyAgICAgKiBXcml0ZSB0aGUgcGxhbmUncyBoZWFkZXIgaW50byB0aGUgb3V0cHV0IHBhY2tldDoKKyAgICAgKiAtIGh1ZmZtYW4gY29kZSBsZW5ndGhzICgyNTYgYnl0ZXMpCisgICAgICogLSBzbGljZSBlbmQgb2Zmc2V0cyAoZ290dGVuIGZyb20gdGhlIHNsaWNlIGxlbmd0aHMpCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBsZW5ndGhzW2ldKTsKKworICAgICAgICBoZVtpXS5sZW4gPSBsZW5ndGhzW2ldOworICAgICAgICBoZVtpXS5zeW0gPSBpOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSB0aGUgaHVmZm1hbiBjb2RlcyB0aGVtc2VsdmVzICovCisgICAgY2FsY3VsYXRlX2NvZGVzKGhlKTsKKworICAgIHNlbmQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5zbGljZXM7IGkrKykgeworICAgICAgICBzc3RhcnQgID0gc2VuZDsKKyAgICAgICAgc2VuZCAgICA9IGhlaWdodCAqIChpICsgMSkgLyBjLT5zbGljZXMgJiBjbWFzazsKKworICAgICAgICAvKgorICAgICAgICAgKiBXcml0ZSB0aGUgaHVmZm1hbiBjb2RlcyB0byBhIGJ1ZmZlciwKKyAgICAgICAgICogZ2V0IHRoZSBvZmZzZXQgaW4gYml0cyBhbmQgY29udmVydCB0byBieXRlcy4KKyAgICAgICAgICovCisgICAgICAgIG9mZnNldCArPSB3cml0ZV9odWZmX2NvZGVzKGRzdCArIHNzdGFydCAqIHdpZHRoLCBjLT5zbGljZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAqIGhlaWdodCArIDQsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kIC0gc3N0YXJ0LCBoZSkgPj4gMzsKKworICAgICAgICBzbGljZV9sZW4gPSBvZmZzZXQgLSBzbGljZV9sZW47CisKKyAgICAgICAgLyogQnl0ZXN3YXAgdGhlIHdyaXR0ZW4gaHVmZm1hbiBjb2RlcyAqLworICAgICAgICBjLT5iZHNwLmJzd2FwX2J1ZigodWludDMyX3QgKikgYy0+c2xpY2VfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopIGMtPnNsaWNlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlX2xlbiA+PiAyKTsKKworICAgICAgICAvKiBXcml0ZSB0aGUgb2Zmc2V0IHRvIHRoZSBzdHJlYW0gKi8KKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2xlMzIocGIsIG9mZnNldCk7CisKKyAgICAgICAgLyogU2VlayB0byB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBwYWNrZXQgKi8KKyAgICAgICAgYnl0ZXN0cmVhbTJfc2Vla19wKHBiLCA0ICogKGMtPnNsaWNlcyAtIGkgLSAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLSBzbGljZV9sZW4sIFNFRUtfQ1VSKTsKKworICAgICAgICAvKiBXcml0ZSB0aGUgc2xpY2VzJyBkYXRhIGludG8gdGhlIG91dHB1dCBwYWNrZXQgKi8KKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J1ZmZlcihwYiwgYy0+c2xpY2VfYml0cywgc2xpY2VfbGVuKTsKKworICAgICAgICAvKiBTZWVrIGJhY2sgdG8gdGhlIHNsaWNlIG9mZnNldHMgKi8KKyAgICAgICAgYnl0ZXN0cmVhbTJfc2Vla19wKHBiLCAtNCAqIChjLT5zbGljZXMgLSBpIC0gMSkgLSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUVLX0NVUik7CisKKyAgICAgICAgc2xpY2VfbGVuID0gb2Zmc2V0OworICAgIH0KKworICAgIC8qIEFuZCBhdCB0aGUgZW5kIHNlZWsgdG8gdGhlIGVuZCBvZiB3cml0dGVuIHNsaWNlKHMpICovCisgICAgYnl0ZXN0cmVhbTJfc2Vla19wKHBiLCBvZmZzZXQsIFNFRUtfQ1VSKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHV0dmlkZW9fZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgVXR2aWRlb0NvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFB1dEJ5dGVDb250ZXh0IHBiOworCisgICAgdWludDMyX3QgZnJhbWVfaW5mbzsKKworICAgIHVpbnQ4X3QgKmRzdDsKKworICAgIGludCB3aWR0aCA9IGF2Y3R4LT53aWR0aCwgaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKyAgICBpbnQgaSwgcmV0ID0gMDsKKworICAgIC8qIEFsbG9jYXRlIGEgbmV3IHBhY2tldCBpZiBuZWVkZWQsIGFuZCBzZXQgaXQgdG8gdGhlIHBvaW50ZXIgZHN0ICovCisgICAgcmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCAoMjU2ICsgNCAqIGMtPnNsaWNlcyArIHdpZHRoICogaGVpZ2h0KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5wbGFuZXMgKyA0KTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZHN0ID0gcGt0LT5kYXRhOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIoJnBiLCBkc3QsIHBrdC0+c2l6ZSk7CisKKyAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmMtPnNsaWNlX2JpdHMsICZjLT5zbGljZV9iaXRzX3NpemUsIHdpZHRoICogaGVpZ2h0ICsgNCk7CisKKyAgICBpZiAoIWMtPnNsaWNlX2JpdHMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgdGVtcG9yYXJ5IGJ1ZmZlciAyLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiBSR0IsIG1hbmdsZSB0aGUgcGxhbmVzIHRvIFV0IFZpZGVvJ3MgZm9ybWF0ICovCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCQSB8fCBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KQorICAgICAgICBtYW5nbGVfcmdiX3BsYW5lcyhjLT5zbGljZV9idWZmZXIsIGMtPnNsaWNlX3N0cmlkZSwgcGljLT5kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5wbGFuZXMsIHBpYy0+bGluZXNpemVbMF0sIHdpZHRoLCBoZWlnaHQpOworCisgICAgLyogRGVhbCB3aXRoIHRoZSBwbGFuZXMgKi8KKyAgICBzd2l0Y2ggKGF2Y3R4LT5waXhfZm10KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+cGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IGVuY29kZV9wbGFuZShhdmN0eCwgYy0+c2xpY2VfYnVmZmVyW2ldICsgMiAqIGMtPnNsaWNlX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zbGljZV9idWZmZXJbaV0sIGMtPnNsaWNlX3N0cmlkZSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCAmcGIpOworCisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBlbmNvZGluZyBwbGFuZSAlZC5cbiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5wbGFuZXM7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gZW5jb2RlX3BsYW5lKGF2Y3R4LCBwaWMtPmRhdGFbaV0sIGMtPnNsaWNlX2J1ZmZlclswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMtPmxpbmVzaXplW2ldLCBpLCB3aWR0aCA+PiAhIWksIGhlaWdodCwgJnBiKTsKKworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZW5jb2RpbmcgcGxhbmUgJWQuXG4iLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+cGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IGVuY29kZV9wbGFuZShhdmN0eCwgcGljLT5kYXRhW2ldLCBjLT5zbGljZV9idWZmZXJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5saW5lc2l6ZVtpXSwgaSwgd2lkdGggPj4gISFpLCBoZWlnaHQgPj4gISFpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYik7CisKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGVuY29kaW5nIHBsYW5lICVkLlxuIiwgaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gcGl4ZWwgZm9ybWF0OiAlZFxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXcml0ZSBmcmFtZSBpbmZvcm1hdGlvbiAoTEUgMzJiaXQgdW5zaWduZWQpCisgICAgICogaW50byB0aGUgb3V0cHV0IHBhY2tldC4KKyAgICAgKiBDb250YWlucyB0aGUgcHJlZGljdGlvbiBtZXRob2QuCisgICAgICovCisgICAgZnJhbWVfaW5mbyA9IGMtPmZyYW1lX3ByZWQgPDwgODsKKyAgICBieXRlc3RyZWFtMl9wdXRfbGUzMigmcGIsIGZyYW1lX2luZm8pOworCisgICAgLyoKKyAgICAgKiBBdCBsZWFzdCBjdXJyZW50bHkgVXQgVmlkZW8gaXMgSURSIG9ubHkuCisgICAgICogU2V0IGZsYWdzIGFjY29yZGluZ2x5LgorICAgICAqLworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgcGt0LT5zaXplICAgPSBieXRlc3RyZWFtMl90ZWxsX3AoJnBiKTsKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKworICAgIC8qIFBhY2tldCBzaG91bGQgYmUgZG9uZSAqLworICAgICpnb3RfcGFja2V0ID0gMTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3V0dmlkZW9fZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidXR2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlV0IFZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1VUVklERU8sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFV0dmlkZW9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB1dHZpZGVvX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IHV0dmlkZW9fZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IHV0dmlkZW9fZW5jb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9GUkFNRV9USFJFQURTIHwgQ09ERUNfQ0FQX0lOVFJBX09OTFksCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfUkdCMjQsIEFWX1BJWF9GTVRfUkdCQSwgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfTk9ORQorICAgICAgICAgICAgICAgICAgICAgIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdjIxMGRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdjIxMGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDM5NTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92MjEwZGVjLmMKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBWMjEwIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAwOSBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlIGRvdCBjb3VkdXJpZXIgYXQgZ21haWwgZG90IGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInYyMTBkZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNkZWZpbmUgUkVBRF9QSVhFTFMoYSwgYiwgYykgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2YWwgID0gYXZfbGUybmUzMigqc3JjKyspOyAgIFwKKyAgICAgICAgKmErKyA9ICB2YWwgJiAweDNGRjsgICAgICAgICBcCisgICAgICAgICpiKysgPSAodmFsID4+IDEwKSAmIDB4M0ZGOyAgXAorICAgICAgICAqYysrID0gKHZhbCA+PiAyMCkgJiAweDNGRjsgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCB2MjEwX3BsYW5hcl91bnBhY2tfYyhjb25zdCB1aW50MzJfdCAqc3JjLCB1aW50MTZfdCAqeSwgdWludDE2X3QgKnUsIHVpbnQxNl90ICp2LCBpbnQgd2lkdGgpCit7CisgICAgdWludDMyX3QgdmFsOworICAgIGludCBpOworCisgICAgZm9yKCBpID0gMDsgaSA8IHdpZHRoLTU7IGkgKz0gNiApeworICAgICAgICBSRUFEX1BJWEVMUyh1LCB5LCB2KTsKKyAgICAgICAgUkVBRF9QSVhFTFMoeSwgdSwgeSk7CisgICAgICAgIFJFQURfUElYRUxTKHYsIHksIHUpOworICAgICAgICBSRUFEX1BJWEVMUyh5LCB2LCB5KTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVjIxMERlY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGF2Y3R4LT53aWR0aCAmIDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ2MjEwIG5lZWRzIGV2ZW4gd2lkdGhcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYXZjdHgtPnBpeF9mbXQgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKKyAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDEwOworCisgICAgcy0+dW5wYWNrX2ZyYW1lICAgICAgICAgICAgPSB2MjEwX3BsYW5hcl91bnBhY2tfYzsKKworICAgIGlmIChIQVZFX01NWCkKKyAgICAgICAgdjIxMF94ODZfaW5pdChzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFYyMTBEZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGludCBoLCB3LCByZXQsIHN0cmlkZSwgYWxpZ25lZF9pbnB1dDsKKyAgICBBVkZyYW1lICpwaWMgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKnBzcmMgPSBhdnBrdC0+ZGF0YTsKKyAgICB1aW50MTZfdCAqeSwgKnUsICp2OworCisgICAgaWYgKHMtPmN1c3RvbV9zdHJpZGUgKQorICAgICAgICBzdHJpZGUgPSBzLT5jdXN0b21fc3RyaWRlOworICAgIGVsc2UgeworICAgICAgICBpbnQgYWxpZ25lZF93aWR0aCA9ICgoYXZjdHgtPndpZHRoICsgNDcpIC8gNDgpICogNDg7CisgICAgICAgIHN0cmlkZSA9IGFsaWduZWRfd2lkdGggKiA4IC8gMzsKKyAgICB9CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPCBzdHJpZGUgKiBhdmN0eC0+aGVpZ2h0KSB7CisgICAgICAgIGlmICgoKChhdmN0eC0+d2lkdGggKyAyMykgLyAyNCkgKiAyNCAqIDgpIC8gMyAqIGF2Y3R4LT5oZWlnaHQgPT0gYXZwa3QtPnNpemUpIHsKKyAgICAgICAgICAgIHN0cmlkZSA9IGF2cGt0LT5zaXplIC8gYXZjdHgtPmhlaWdodDsKKyAgICAgICAgICAgIGlmICghcy0+c3RyaWRlX3dhcm5pbmdfc2hvd24pCisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkJyb2tlbiB2MjEwIHdpdGggdG9vIHNtYWxsIHBhZGRpbmcgKDY0IGJ5dGUpIGRldGVjdGVkXG4iKTsKKyAgICAgICAgICAgIHMtPnN0cmlkZV93YXJuaW5nX3Nob3duID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGFja2V0IHRvbyBzbWFsbFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFsaWduZWRfaW5wdXQgPSAhKCh1aW50cHRyX3QpcHNyYyAmIDB4ZikgJiYgIShzdHJpZGUgJiAweGYpOworICAgIGlmIChhbGlnbmVkX2lucHV0ICE9IHMtPmFsaWduZWRfaW5wdXQpIHsKKyAgICAgICAgcy0+YWxpZ25lZF9pbnB1dCA9IGFsaWduZWRfaW5wdXQ7CisgICAgICAgIGlmIChIQVZFX01NWCkKKyAgICAgICAgICAgIHYyMTBfeDg2X2luaXQocyk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwaWMsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICB5ID0gKHVpbnQxNl90KilwaWMtPmRhdGFbMF07CisgICAgdSA9ICh1aW50MTZfdCopcGljLT5kYXRhWzFdOworICAgIHYgPSAodWludDE2X3QqKXBpYy0+ZGF0YVsyXTsKKyAgICBwaWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIHBpYy0+a2V5X2ZyYW1lID0gMTsKKworICAgIGZvciAoaCA9IDA7IGggPCBhdmN0eC0+aGVpZ2h0OyBoKyspIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgKnNyYyA9IChjb25zdCB1aW50MzJfdCopcHNyYzsKKyAgICAgICAgdWludDMyX3QgdmFsOworCisgICAgICAgIHcgPSAoYXZjdHgtPndpZHRoIC8gNikgKiA2OworICAgICAgICBzLT51bnBhY2tfZnJhbWUoc3JjLCB5LCB1LCB2LCB3KTsKKworICAgICAgICB5ICs9IHc7CisgICAgICAgIHUgKz0gdyA+PiAxOworICAgICAgICB2ICs9IHcgPj4gMTsKKyAgICAgICAgc3JjICs9ICh3IDw8IDEpIC8gMzsKKworICAgICAgICBpZiAodyA8IGF2Y3R4LT53aWR0aCAtIDEpIHsKKyAgICAgICAgICAgIFJFQURfUElYRUxTKHUsIHksIHYpOworCisgICAgICAgICAgICB2YWwgID0gYXZfbGUybmUzMigqc3JjKyspOworICAgICAgICAgICAgKnkrKyA9ICB2YWwgJiAweDNGRjsKKyAgICAgICAgICAgIGlmICh3IDwgYXZjdHgtPndpZHRoIC0gMykgeworICAgICAgICAgICAgICAgICp1KysgPSAodmFsID4+IDEwKSAmIDB4M0ZGOworICAgICAgICAgICAgICAgICp5KysgPSAodmFsID4+IDIwKSAmIDB4M0ZGOworCisgICAgICAgICAgICAgICAgdmFsICA9IGF2X2xlMm5lMzIoKnNyYysrKTsKKyAgICAgICAgICAgICAgICAqdisrID0gIHZhbCAmIDB4M0ZGOworICAgICAgICAgICAgICAgICp5KysgPSAodmFsID4+IDEwKSAmIDB4M0ZGOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHNyYyArPSBzdHJpZGU7CisgICAgICAgIHkgKz0gcGljLT5saW5lc2l6ZVswXSAvIDIgLSBhdmN0eC0+d2lkdGg7CisgICAgICAgIHUgKz0gcGljLT5saW5lc2l6ZVsxXSAvIDIgLSBhdmN0eC0+d2lkdGggLyAyOworICAgICAgICB2ICs9IHBpYy0+bGluZXNpemVbMl0gLyAyIC0gYXZjdHgtPndpZHRoIC8gMjsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmZpZWxkX29yZGVyID4gQVZfRklFTERfUFJPR1JFU1NJVkUpIHsKKyAgICAgICAgLyogd2UgaGF2ZSBpbnRlcmxhY2VkIG1hdGVyaWFsIGZsYWdnZWQgaW4gY29udGFpbmVyICovCisgICAgICAgIHBpYy0+aW50ZXJsYWNlZF9mcmFtZSA9IDE7CisgICAgICAgIGlmIChhdmN0eC0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVFQgfHwgYXZjdHgtPmZpZWxkX29yZGVyID09IEFWX0ZJRUxEX1RCKQorICAgICAgICAgICAgcGljLT50b3BfZmllbGRfZmlyc3QgPSAxOworICAgIH0KKworICAgICpnb3RfZnJhbWUgICAgICA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKKyNkZWZpbmUgVjIxMERFQ19GTEFHUyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB8IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdjIxMGRlY19vcHRpb25zW10gPSB7CisgICAgeyJjdXN0b21fc3RyaWRlIiwgIkN1c3RvbSBWMjEwIHN0cmlkZSIsIG9mZnNldG9mKFYyMTBEZWNDb250ZXh0LCBjdXN0b21fc3RyaWRlKSwgRkZfT1BUX1RZUEVfSU5ULAorICAgICB7Lmk2NCA9IDB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWMjEwREVDX0ZMQUdTfSwKKyAgICB7TlVMTH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHYyMTBkZWNfY2xhc3MgPSB7CisgICAgIlYyMTAgRGVjb2RlciIsCisgICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgdjIxMGRlY19vcHRpb25zLAorICAgIExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfdjIxMF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2MjEwIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIDQ6MjoyIDEwLWJpdCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WMjEwLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWMjEwRGVjQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnYyMTBkZWNfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdjIxMGRlYy5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdjIxMGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZGI3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92MjEwZGVjLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVjIxMERFQ19ICisjZGVmaW5lIEFWQ09ERUNfVjIxMERFQ19ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICphdl9jbGFzczsKKyAgICBpbnQgY3VzdG9tX3N0cmlkZTsKKyAgICBpbnQgYWxpZ25lZF9pbnB1dDsKKyAgICBpbnQgc3RyaWRlX3dhcm5pbmdfc2hvd247CisgICAgdm9pZCAoKnVucGFja19mcmFtZSkoY29uc3QgdWludDMyX3QgKnNyYywgdWludDE2X3QgKnksIHVpbnQxNl90ICp1LCB1aW50MTZfdCAqdiwgaW50IHdpZHRoKTsKK30gVjIxMERlY0NvbnRleHQ7CisKK3ZvaWQgdjIxMF94ODZfaW5pdChWMjEwRGVjQ29udGV4dCAqcyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1YyMTBERUNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdjIxMGVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdjIxMGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNDBmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92MjEwZW5jLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBWMjEwIGVuY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAwOSBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlIGRvdCBjb3VkdXJpZXIgYXQgZ21haWwgZG90IGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2MjEwZW5jLmgiCisKKyNkZWZpbmUgQ0xJUCh2KSBhdl9jbGlwKHYsIDQsIDEwMTkpCisjZGVmaW5lIENMSVA4KHYpIGF2X2NsaXAodiwgMSwgMjU0KQorCisjZGVmaW5lIFdSSVRFX1BJWEVMUyhhLCBiLCBjKSAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmFsID0gICBDTElQKCphKyspOyAgICAgICAgICAgICBcCisgICAgICAgIHZhbCB8PSAoQ0xJUCgqYisrKSA8PCAxMCkgfCAgICAgXAorICAgICAgICAgICAgICAgKENMSVAoKmMrKykgPDwgMjApOyAgICAgIFwKKyAgICAgICAgQVZfV0wzMihkc3QsIHZhbCk7ICAgICAgICAgICAgICBcCisgICAgICAgIGRzdCArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgV1JJVEVfUElYRUxTOChhLCBiLCBjKSAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2YWwgPSAgKENMSVA4KCphKyspIDw8IDIpOyAgICAgICBcCisgICAgICAgIHZhbCB8PSAoQ0xJUDgoKmIrKykgPDwgMTIpIHwgICAgIFwKKyAgICAgICAgICAgICAgIChDTElQOCgqYysrKSA8PCAyMik7ICAgICAgXAorICAgICAgICBBVl9XTDMyKGRzdCwgdmFsKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0ICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgdjIxMF9wbGFuYXJfcGFja184X2MoY29uc3QgdWludDhfdCAqeSwgY29uc3QgdWludDhfdCAqdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnYsIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHdpZHRoKQoreworICAgIHVpbnQzMl90IHZhbDsKKyAgICBpbnQgaTsKKworICAgIC8qIHVucm9sbCB0aGlzIHRvIG1hdGNoIHRoZSBhc3NlbWJseSAqLworICAgIGZvciggaSA9IDA7IGkgPCB3aWR0aC0xMTsgaSArPSAxMiApeworICAgICAgICBXUklURV9QSVhFTFM4KHUsIHksIHYpOworICAgICAgICBXUklURV9QSVhFTFM4KHksIHUsIHkpOworICAgICAgICBXUklURV9QSVhFTFM4KHYsIHksIHUpOworICAgICAgICBXUklURV9QSVhFTFM4KHksIHYsIHkpOworICAgICAgICBXUklURV9QSVhFTFM4KHUsIHksIHYpOworICAgICAgICBXUklURV9QSVhFTFM4KHksIHUsIHkpOworICAgICAgICBXUklURV9QSVhFTFM4KHYsIHksIHUpOworICAgICAgICBXUklURV9QSVhFTFM4KHksIHYsIHkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdjIxMF9wbGFuYXJfcGFja18xMF9jKGNvbnN0IHVpbnQxNl90ICp5LCBjb25zdCB1aW50MTZfdCAqdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqdiwgdWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgd2lkdGgpCit7CisgICAgdWludDMyX3QgdmFsOworICAgIGludCBpOworCisgICAgZm9yKCBpID0gMDsgaSA8IHdpZHRoLTU7IGkgKz0gNiApeworICAgICAgICBXUklURV9QSVhFTFModSwgeSwgdik7CisgICAgICAgIFdSSVRFX1BJWEVMUyh5LCB1LCB5KTsKKyAgICAgICAgV1JJVEVfUElYRUxTKHYsIHksIHUpOworICAgICAgICBXUklURV9QSVhFTFMoeSwgdiwgeSk7CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFYyMTBFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChhdmN0eC0+d2lkdGggJiAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidjIxMCBuZWVkcyBldmVuIHdpZHRoXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIHMtPnBhY2tfbGluZV84ICAgICAgICAgID0gdjIxMF9wbGFuYXJfcGFja184X2M7CisgICAgcy0+cGFja19saW5lXzEwICAgICAgICAgPSB2MjEwX3BsYW5hcl9wYWNrXzEwX2M7CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX3YyMTBlbmNfaW5pdF94ODYocyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgVjIxMEVuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaW50IGFsaWduZWRfd2lkdGggPSAoKGF2Y3R4LT53aWR0aCArIDQ3KSAvIDQ4KSAqIDQ4OworICAgIGludCBzdHJpZGUgPSBhbGlnbmVkX3dpZHRoICogOCAvIDM7CisgICAgaW50IGxpbmVfcGFkZGluZyA9IHN0cmlkZSAtICgoYXZjdHgtPndpZHRoICogOCArIDExKSAvIDEyKSAqIDQ7CisgICAgaW50IGgsIHcsIHJldDsKKyAgICB1aW50OF90ICpkc3Q7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldChwa3QsIGF2Y3R4LT5oZWlnaHQgKiBzdHJpZGUpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBnZXR0aW5nIG91dHB1dCBwYWNrZXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBkc3QgPSBwa3QtPmRhdGE7CisKKyAgICBpZiAocGljLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQMTApIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnkgPSAoY29uc3QgdWludDE2X3QqKXBpYy0+ZGF0YVswXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnUgPSAoY29uc3QgdWludDE2X3QqKXBpYy0+ZGF0YVsxXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnYgPSAoY29uc3QgdWludDE2X3QqKXBpYy0+ZGF0YVsyXTsKKyAgICAgICAgZm9yIChoID0gMDsgaCA8IGF2Y3R4LT5oZWlnaHQ7IGgrKykgeworICAgICAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICAgICAgdyA9IChhdmN0eC0+d2lkdGggLyA2KSAqIDY7CisgICAgICAgICAgICBzLT5wYWNrX2xpbmVfMTAoeSwgdSwgdiwgZHN0LCB3KTsKKworICAgICAgICAgICAgeSArPSB3OworICAgICAgICAgICAgdSArPSB3ID4+IDE7CisgICAgICAgICAgICB2ICs9IHcgPj4gMTsKKyAgICAgICAgICAgIGRzdCArPSAodyAvIDYpICogMTY7CisgICAgICAgICAgICBpZiAodyA8IGF2Y3R4LT53aWR0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBXUklURV9QSVhFTFModSwgeSwgdik7CisKKyAgICAgICAgICAgICAgICB2YWwgPSBDTElQKCp5KyspOworICAgICAgICAgICAgICAgIGlmICh3ID09IGF2Y3R4LT53aWR0aCAtIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfV0wzMihkc3QsIHZhbCk7CisgICAgICAgICAgICAgICAgICAgIGRzdCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3IDwgYXZjdHgtPndpZHRoIC0gMykgeworICAgICAgICAgICAgICAgIHZhbCB8PSAoQ0xJUCgqdSsrKSA8PCAxMCkgfCAoQ0xJUCgqeSsrKSA8PCAyMCk7CisgICAgICAgICAgICAgICAgQVZfV0wzMihkc3QsIHZhbCk7CisgICAgICAgICAgICAgICAgZHN0ICs9IDQ7CisKKyAgICAgICAgICAgICAgICB2YWwgPSBDTElQKCp2KyspIHwgKENMSVAoKnkrKykgPDwgMTApOworICAgICAgICAgICAgICAgIEFWX1dMMzIoZHN0LCB2YWwpOworICAgICAgICAgICAgICAgIGRzdCArPSA0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1zZXQoZHN0LCAwLCBsaW5lX3BhZGRpbmcpOworICAgICAgICAgICAgZHN0ICs9IGxpbmVfcGFkZGluZzsKKworICAgICAgICAgICAgeSArPSBwaWMtPmxpbmVzaXplWzBdIC8gMiAtIGF2Y3R4LT53aWR0aDsKKyAgICAgICAgICAgIHUgKz0gcGljLT5saW5lc2l6ZVsxXSAvIDIgLSBhdmN0eC0+d2lkdGggLyAyOworICAgICAgICAgICAgdiArPSBwaWMtPmxpbmVzaXplWzJdIC8gMiAtIGF2Y3R4LT53aWR0aCAvIDI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZihwaWMtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlApIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqeSA9IHBpYy0+ZGF0YVswXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdSA9IHBpYy0+ZGF0YVsxXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdiA9IHBpYy0+ZGF0YVsyXTsKKyAgICAgICAgZm9yIChoID0gMDsgaCA8IGF2Y3R4LT5oZWlnaHQ7IGgrKykgeworICAgICAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICAgICAgdyA9IChhdmN0eC0+d2lkdGggLyAxMikgKiAxMjsKKyAgICAgICAgICAgIHMtPnBhY2tfbGluZV84KHksIHUsIHYsIGRzdCwgdyk7CisKKyAgICAgICAgICAgIHkgKz0gdzsKKyAgICAgICAgICAgIHUgKz0gdyA+PiAxOworICAgICAgICAgICAgdiArPSB3ID4+IDE7CisgICAgICAgICAgICBkc3QgKz0gKHcgLyAxMikgKiAzMjsKKworICAgICAgICAgICAgZm9yKCA7IHcgPCBhdmN0eC0+d2lkdGgtNTsgdyArPSA2ICl7CisgICAgICAgICAgICAgICAgV1JJVEVfUElYRUxTOCh1LCB5LCB2KTsKKyAgICAgICAgICAgICAgICBXUklURV9QSVhFTFM4KHksIHUsIHkpOworICAgICAgICAgICAgICAgIFdSSVRFX1BJWEVMUzgodiwgeSwgdSk7CisgICAgICAgICAgICAgICAgV1JJVEVfUElYRUxTOCh5LCB2LCB5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3IDwgYXZjdHgtPndpZHRoIC0gMSkgeworICAgICAgICAgICAgICAgIFdSSVRFX1BJWEVMUzgodSwgeSwgdik7CisKKyAgICAgICAgICAgICAgICB2YWwgPSBDTElQOCgqeSsrKSA8PCAyOworICAgICAgICAgICAgICAgIGlmICh3ID09IGF2Y3R4LT53aWR0aCAtIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfV0wzMihkc3QsIHZhbCk7CisgICAgICAgICAgICAgICAgICAgIGRzdCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3IDwgYXZjdHgtPndpZHRoIC0gMykgeworICAgICAgICAgICAgICAgIHZhbCB8PSAoQ0xJUDgoKnUrKykgPDwgMTIpIHwgKENMSVA4KCp5KyspIDw8IDIyKTsKKyAgICAgICAgICAgICAgICBBVl9XTDMyKGRzdCwgdmFsKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gNDsKKworICAgICAgICAgICAgICAgIHZhbCA9IChDTElQOCgqdisrKSA8PCAyKSB8IChDTElQOCgqeSsrKSA8PCAxMik7CisgICAgICAgICAgICAgICAgQVZfV0wzMihkc3QsIHZhbCk7CisgICAgICAgICAgICAgICAgZHN0ICs9IDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbXNldChkc3QsIDAsIGxpbmVfcGFkZGluZyk7CisgICAgICAgICAgICBkc3QgKz0gbGluZV9wYWRkaW5nOworCisgICAgICAgICAgICB5ICs9IHBpYy0+bGluZXNpemVbMF0gLSBhdmN0eC0+d2lkdGg7CisgICAgICAgICAgICB1ICs9IHBpYy0+bGluZXNpemVbMV0gLSBhdmN0eC0+d2lkdGggLyAyOworICAgICAgICAgICAgdiArPSBwaWMtPmxpbmVzaXplWzJdIC0gYXZjdHgtPndpZHRoIC8gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGVuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl92MjEwX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInYyMTAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgNDoyOjIgMTAtYml0IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1YyMTAsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFYyMTBFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBlbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBlbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZW5jb2RlX2Nsb3NlLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3YyMTBlbmMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3YyMTBlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTZhZTQxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdjIxMGVuYy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPRU5DX1YyMTBFTkNfSAorI2RlZmluZSBBVkNPRU5DX1YyMTBFTkNfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkICgqcGFja19saW5lXzgpKGNvbnN0IHVpbnQ4X3QgKnksIGNvbnN0IHVpbnQ4X3QgKnUsIGNvbnN0IHVpbnQ4X3QgKnYsIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHdpZHRoKTsKKyAgICB2b2lkICgqcGFja19saW5lXzEwKShjb25zdCB1aW50MTZfdCAqeSwgY29uc3QgdWludDE2X3QgKnUsIGNvbnN0IHVpbnQxNl90ICp2LCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCB3aWR0aCk7Cit9IFYyMTBFbmNDb250ZXh0OworCit2b2lkIGZmX3YyMTBlbmNfaW5pdF94ODYoVjIxMEVuY0NvbnRleHQgKnMpOworCisjZW5kaWYgLyogQVZDT0VOQ19WMjEwRU5DX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3YyMTB4LmMgYi9mZm1wZWcvbGliYXZjb2RlYy92MjEweC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzA3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92MjEweC5jCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKGF2Y3R4LT53aWR0aCAmIDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ2MjEweCBuZWVkcyBldmVuIHdpZHRoXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXZjdHgtPnBpeF9mbXQgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1lVVjQyMlAxNjsKKyAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDEwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDMyX3QgKnNyYyA9IChjb25zdCB1aW50MzJfdCAqKWF2cGt0LT5kYXRhOworICAgIEFWRnJhbWUgKnBpYyAgICAgICAgPSBkYXRhOworICAgIGludCB3aWR0aCAgICAgICAgICAgPSBhdmN0eC0+d2lkdGg7CisgICAgaW50IHkgICAgICAgICAgICAgICA9IDA7CisgICAgdWludDE2X3QgKnlkc3QsICp1ZHN0LCAqdmRzdCwgKnllbmQ7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiA4IC8gMykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPiBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogOCAvIDMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiKFByb2JhYmx5KSBwYWRkZWQgZGF0YSIpOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgeWRzdCA9ICh1aW50MTZfdCAqKXBpYy0+ZGF0YVswXTsKKyAgICB1ZHN0ID0gKHVpbnQxNl90ICopcGljLT5kYXRhWzFdOworICAgIHZkc3QgPSAodWludDE2X3QgKilwaWMtPmRhdGFbMl07CisgICAgeWVuZCA9IHlkc3QgKyB3aWR0aDsKKyAgICBwaWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIHBpYy0+a2V5X2ZyYW1lID0gMTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgdWludDMyX3QgdiA9IGF2X2JlMm5lMzIoKnNyYysrKTsKKyAgICAgICAgKnVkc3QrKyA9ICh2ID4+IDE2KSAmIDB4RkZDMDsKKyAgICAgICAgKnlkc3QrKyA9ICh2ID4+IDYgKSAmIDB4RkZDMDsKKyAgICAgICAgKnZkc3QrKyA9ICh2IDw8IDQgKSAmIDB4RkZDMDsKKworICAgICAgICB2ICAgICAgID0gYXZfYmUybmUzMigqc3JjKyspOworICAgICAgICAqeWRzdCsrID0gKHYgPj4gMTYpICYgMHhGRkMwOworCisgICAgICAgIGlmICh5ZHN0ID49IHllbmQpIHsKKyAgICAgICAgICAgIHlkc3QgKz0gcGljLT5saW5lc2l6ZVswXSAvIDIgLSB3aWR0aDsKKyAgICAgICAgICAgIHVkc3QgKz0gcGljLT5saW5lc2l6ZVsxXSAvIDIgLSB3aWR0aCAvIDI7CisgICAgICAgICAgICB2ZHN0ICs9IHBpYy0+bGluZXNpemVbMl0gLyAyIC0gd2lkdGggLyAyOworICAgICAgICAgICAgeWVuZCA9IHlkc3QgKyB3aWR0aDsKKyAgICAgICAgICAgIGlmICgrK3kgPj0gYXZjdHgtPmhlaWdodCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgICp1ZHN0KysgPSAodiA+PiA2ICkgJiAweEZGQzA7CisgICAgICAgICp5ZHN0KysgPSAodiA8PCA0ICkgJiAweEZGQzA7CisKKyAgICAgICAgdiA9IGF2X2JlMm5lMzIoKnNyYysrKTsKKyAgICAgICAgKnZkc3QrKyA9ICh2ID4+IDE2KSAmIDB4RkZDMDsKKyAgICAgICAgKnlkc3QrKyA9ICh2ID4+IDYgKSAmIDB4RkZDMDsKKworICAgICAgICBpZiAoeWRzdCA+PSB5ZW5kKSB7CisgICAgICAgICAgICB5ZHN0ICs9IHBpYy0+bGluZXNpemVbMF0gLyAyIC0gd2lkdGg7CisgICAgICAgICAgICB1ZHN0ICs9IHBpYy0+bGluZXNpemVbMV0gLyAyIC0gd2lkdGggLyAyOworICAgICAgICAgICAgdmRzdCArPSBwaWMtPmxpbmVzaXplWzJdIC8gMiAtIHdpZHRoIC8gMjsKKyAgICAgICAgICAgIHllbmQgID0geWRzdCArIHdpZHRoOworICAgICAgICAgICAgaWYgKCsreSA+PSBhdmN0eC0+aGVpZ2h0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgKnVkc3QrKyA9ICh2IDw8IDQgKSAmIDB4RkZDMDsKKworICAgICAgICB2ID0gYXZfYmUybmUzMigqc3JjKyspOworICAgICAgICAqeWRzdCsrID0gKHYgPj4gMTYpICYgMHhGRkMwOworICAgICAgICAqdmRzdCsrID0gKHYgPj4gNiApICYgMHhGRkMwOworICAgICAgICAqeWRzdCsrID0gKHYgPDwgNCApICYgMHhGRkMwOworICAgICAgICBpZiAoeWRzdCA+PSB5ZW5kKSB7CisgICAgICAgICAgICB5ZHN0ICs9IHBpYy0+bGluZXNpemVbMF0gLyAyIC0gd2lkdGg7CisgICAgICAgICAgICB1ZHN0ICs9IHBpYy0+bGluZXNpemVbMV0gLyAyIC0gd2lkdGggLyAyOworICAgICAgICAgICAgdmRzdCArPSBwaWMtPmxpbmVzaXplWzJdIC8gMiAtIHdpZHRoIC8gMjsKKyAgICAgICAgICAgIHllbmQgID0geWRzdCArIHdpZHRoOworICAgICAgICAgICAgaWYgKCsreSA+PSBhdmN0eC0+aGVpZ2h0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfdjIxMHhfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidjIxMHgiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgNDoyOjIgMTAtYml0IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1YyMTBYLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3YzMDhkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3YzMDhkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDMxZjBhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdjMwOGRlYy5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiB2MzA4IGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMSBDYXJsIEV1Z2VuIEhveW9zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIGF2X2NvbGQgaW50IHYzMDhfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOworCisgICAgaWYgKGF2Y3R4LT53aWR0aCAmIDEpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJ2MzA4IHJlcXVpcmVzIHdpZHRoIHRvIGJlIGV2ZW4uXG4iKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHYzMDhfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpwaWMgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IGF2cGt0LT5kYXRhOworICAgIHVpbnQ4X3QgKnksICp1LCAqdjsKKyAgICBpbnQgaSwgaiwgcmV0OworCisgICAgaWYgKGF2cGt0LT5zaXplIDwgMyAqIGF2Y3R4LT5oZWlnaHQgKiBhdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnN1ZmZpY2llbnQgaW5wdXQgZGF0YS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGljLT5rZXlfZnJhbWUgPSAxOworICAgIHBpYy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICB5ID0gcGljLT5kYXRhWzBdOworICAgIHUgPSBwaWMtPmRhdGFbMV07CisgICAgdiA9IHBpYy0+ZGF0YVsyXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aDsgaisrKSB7CisgICAgICAgICAgICB2W2pdID0gKnNyYysrOworICAgICAgICAgICAgeVtqXSA9ICpzcmMrKzsKKyAgICAgICAgICAgIHVbal0gPSAqc3JjKys7CisgICAgICAgIH0KKworICAgICAgICB5ICs9IHBpYy0+bGluZXNpemVbMF07CisgICAgICAgIHUgKz0gcGljLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgdiArPSBwaWMtPmxpbmVzaXplWzJdOworICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX3YzMDhfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gInYzMDgiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIHBhY2tlZCA0OjQ6NCIpLAorICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX1YzMDgsCisgICAgLmluaXQgICAgICAgICA9IHYzMDhfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICA9IHYzMDhfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3YzMDhlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3YzMDhlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmM1YWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdjMwOGVuYy5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiB2MzA4IGVuY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FybCBFdWdlbiBIb3lvcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgdjMwOF9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKGF2Y3R4LT53aWR0aCAmIDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ2MzA4IHJlcXVpcmVzIHdpZHRoIHRvIGJlIGV2ZW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdjMwOF9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWMsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICB1aW50OF90ICpkc3Q7CisgICAgdWludDhfdCAqeSwgKnUsICp2OworICAgIGludCBpLCBqLCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqIDMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZHN0ID0gcGt0LT5kYXRhOworCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWUgPSAxOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICB5ID0gcGljLT5kYXRhWzBdOworICAgIHUgPSBwaWMtPmRhdGFbMV07CisgICAgdiA9IHBpYy0+ZGF0YVsyXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aDsgaisrKSB7CisgICAgICAgICAgICAqZHN0KysgPSB2W2pdOworICAgICAgICAgICAgKmRzdCsrID0geVtqXTsKKyAgICAgICAgICAgICpkc3QrKyA9IHVbal07CisgICAgICAgIH0KKyAgICAgICAgeSArPSBwaWMtPmxpbmVzaXplWzBdOworICAgICAgICB1ICs9IHBpYy0+bGluZXNpemVbMV07CisgICAgICAgIHYgKz0gcGljLT5saW5lc2l6ZVsyXTsKKyAgICB9CisKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2MzA4X2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl92MzA4X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICA9ICJ2MzA4IiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCBwYWNrZWQgNDo0OjQiKSwKKyAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WMzA4LAorICAgIC5pbml0ICAgICAgICAgPSB2MzA4X2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgPSB2MzA4X2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgID0gdjMwOF9lbmNvZGVfY2xvc2UsCisgICAgLnBpeF9mbXRzICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdjQwOGRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdjQwOGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDQyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92NDA4ZGVjLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiB2NDA4IGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDYXJsIEV1Z2VuIEhveW9zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIGF2X2NvbGQgaW50IHY0MDhfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDQ0UDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY0MDhfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpwaWMgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IGF2cGt0LT5kYXRhOworICAgIHVpbnQ4X3QgKnksICp1LCAqdiwgKmE7CisgICAgaW50IGksIGosIHJldDsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8IDQgKiBhdmN0eC0+aGVpZ2h0ICogYXZjdHgtPndpZHRoKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGlucHV0IGRhdGEuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpYywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBpYy0+a2V5X2ZyYW1lID0gMTsKKyAgICBwaWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgeSA9IHBpYy0+ZGF0YVswXTsKKyAgICB1ID0gcGljLT5kYXRhWzFdOworICAgIHYgPSBwaWMtPmRhdGFbMl07CisgICAgYSA9IHBpYy0+ZGF0YVszXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aDsgaisrKSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkPT1BVl9DT0RFQ19JRF9BWVVWKSB7CisgICAgICAgICAgICAgICAgdltqXSA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICB1W2pdID0gKnNyYysrOworICAgICAgICAgICAgICAgIHlbal0gPSAqc3JjKys7CisgICAgICAgICAgICAgICAgYVtqXSA9ICpzcmMrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdVtqXSA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICB5W2pdID0gKnNyYysrOworICAgICAgICAgICAgICAgIHZbal0gPSAqc3JjKys7CisgICAgICAgICAgICAgICAgYVtqXSA9ICpzcmMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHkgKz0gcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgdSArPSBwaWMtPmxpbmVzaXplWzFdOworICAgICAgICB2ICs9IHBpYy0+bGluZXNpemVbMl07CisgICAgICAgIGEgKz0gcGljLT5saW5lc2l6ZVszXTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworI2lmIENPTkZJR19BWVVWX0RFQ09ERVIKK0FWQ29kZWMgZmZfYXl1dl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAiYXl1diIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgcGFja2VkIE1TIDQ6NDo0OjQiKSwKKyAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BWVVWLAorICAgIC5pbml0ICAgICAgICAgPSB2NDA4X2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgPSB2NDA4X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzID0gQ09ERUNfQ0FQX0RSMSwKK307CisjZW5kaWYKKyNpZiBDT05GSUdfVjQwOF9ERUNPREVSCitBVkNvZGVjIGZmX3Y0MDhfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gInY0MDgiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIHBhY2tlZCBRVCA0OjQ6NDo0IiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfVjQwOCwKKyAgICAuaW5pdCAgICAgICAgID0gdjQwOF9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgID0gdjQwOF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyA9IENPREVDX0NBUF9EUjEsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92NDA4ZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92NDA4ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmMDhjNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Y0MDhlbmMuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIHY0MDggZW5jb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDYXJsIEV1Z2VuIEhveW9zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCB2NDA4X2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworCisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgYWxsb2NhdGUgZnJhbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2NDA4X2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpYywgaW50ICpnb3RfcGFja2V0KQoreworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICB1aW50OF90ICp5LCAqdSwgKnYsICphOworICAgIGludCBpLCBqLCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqIDQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZHN0ID0gcGt0LT5kYXRhOworCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWUgPSAxOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICB5ID0gcGljLT5kYXRhWzBdOworICAgIHUgPSBwaWMtPmRhdGFbMV07CisgICAgdiA9IHBpYy0+ZGF0YVsyXTsKKyAgICBhID0gcGljLT5kYXRhWzNdOworCisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPndpZHRoOyBqKyspIHsKKyAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZD09QVZfQ09ERUNfSURfQVlVVikgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHZbal07CisgICAgICAgICAgICAgICAgKmRzdCsrID0gdVtqXTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSB5W2pdOworICAgICAgICAgICAgICAgICpkc3QrKyA9IGFbal07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHVbal07CisgICAgICAgICAgICAgICAgKmRzdCsrID0geVtqXTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSB2W2pdOworICAgICAgICAgICAgICAgICpkc3QrKyA9IGFbal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeSArPSBwaWMtPmxpbmVzaXplWzBdOworICAgICAgICB1ICs9IHBpYy0+bGluZXNpemVbMV07CisgICAgICAgIHYgKz0gcGljLT5saW5lc2l6ZVsyXTsKKyAgICAgICAgYSArPSBwaWMtPmxpbmVzaXplWzNdOworICAgIH0KKworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHY0MDhfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX0FZVVZfRU5DT0RFUgorQVZDb2RlYyBmZl9heXV2X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICA9ICJheXV2IiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCBwYWNrZWQgTVMgNDo0OjQ6NCIpLAorICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FZVVYsCisgICAgLmluaXQgICAgICAgICA9IHY0MDhfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICA9IHY0MDhfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgPSB2NDA4X2VuY29kZV9jbG9zZSwKKyAgICAucGl4X2ZtdHMgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCisjaWYgQ09ORklHX1Y0MDhfRU5DT0RFUgorQVZDb2RlYyBmZl92NDA4X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICA9ICJ2NDA4IiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCBwYWNrZWQgUVQgNDo0OjQ6NCIpLAorICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX1Y0MDgsCisgICAgLmluaXQgICAgICAgICA9IHY0MDhfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICA9IHY0MDhfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgPSB2NDA4X2VuY29kZV9jbG9zZSwKKyAgICAucGl4X2ZtdHMgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92NDEwZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92NDEwZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhOWMwZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Y0MTBkZWMuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICogdjQxMCBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIERlcmVrIEJ1aXRlbmh1aXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCB2NDEwX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+cGl4X2ZtdCAgICAgICAgICAgICA9IEFWX1BJWF9GTVRfWVVWNDQ0UDEwOworICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTA7CisKKyAgICBpZiAoYXZjdHgtPndpZHRoICYgMSkgeworICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidjQxMCByZXF1aXJlcyB3aWR0aCB0byBiZSBldmVuLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJ2NDEwIHJlcXVpcmVzIHdpZHRoIHRvIGJlIGV2ZW4sIGNvbnRpbnVpbmcgYW55d2F5LlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2NDEwX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqcGljID0gZGF0YTsKKyAgICB1aW50OF90ICpzcmMgPSBhdnBrdC0+ZGF0YTsKKyAgICB1aW50MTZfdCAqeSwgKnUsICp2OworICAgIHVpbnQzMl90IHZhbDsKKyAgICBpbnQgaSwgaiwgcmV0OworCisgICAgaWYgKGF2cGt0LT5zaXplIDwgNCAqIGF2Y3R4LT5oZWlnaHQgKiBhdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnN1ZmZpY2llbnQgaW5wdXQgZGF0YS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGljLT5rZXlfZnJhbWUgPSAxOworICAgIHBpYy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICB5ID0gKHVpbnQxNl90ICopcGljLT5kYXRhWzBdOworICAgIHUgPSAodWludDE2X3QgKilwaWMtPmRhdGFbMV07CisgICAgdiA9ICh1aW50MTZfdCAqKXBpYy0+ZGF0YVsyXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aDsgaisrKSB7CisgICAgICAgICAgICB2YWwgPSBBVl9STDMyKHNyYyk7CisKKyAgICAgICAgICAgIHVbal0gPSAodmFsID4+ICAyKSAmIDB4M0ZGOworICAgICAgICAgICAgeVtqXSA9ICh2YWwgPj4gMTIpICYgMHgzRkY7CisgICAgICAgICAgICB2W2pdID0gKHZhbCA+PiAyMik7CisKKyAgICAgICAgICAgIHNyYyArPSA0OworICAgICAgICB9CisKKyAgICAgICAgeSArPSBwaWMtPmxpbmVzaXplWzBdID4+IDE7CisgICAgICAgIHUgKz0gcGljLT5saW5lc2l6ZVsxXSA+PiAxOworICAgICAgICB2ICs9IHBpYy0+bGluZXNpemVbMl0gPj4gMTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl92NDEwX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICA9ICJ2NDEwIiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCA0OjQ6NCAxMC1iaXQiKSwKKyAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WNDEwLAorICAgIC5pbml0ICAgICAgICAgPSB2NDEwX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgPSB2NDEwX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92NDEwZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92NDEwZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyZTgyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3Y0MTBlbmMuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICogdjQxMCBlbmNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIERlcmVrIEJ1aXRlbmh1aXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCB2NDEwX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpZiAoYXZjdHgtPndpZHRoICYgMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInY0MTAgcmVxdWlyZXMgd2lkdGggdG8gYmUgZXZlbi5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworCisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgYWxsb2NhdGUgZnJhbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2NDEwX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpYywgaW50ICpnb3RfcGFja2V0KQoreworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICB1aW50MTZfdCAqeSwgKnUsICp2OworICAgIHVpbnQzMl90IHZhbDsKKyAgICBpbnQgaSwgaiwgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiA0KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGRzdCA9IHBrdC0+ZGF0YTsKKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgeSA9ICh1aW50MTZfdCAqKXBpYy0+ZGF0YVswXTsKKyAgICB1ID0gKHVpbnQxNl90ICopcGljLT5kYXRhWzFdOworICAgIHYgPSAodWludDE2X3QgKilwaWMtPmRhdGFbMl07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBhdmN0eC0+d2lkdGg7IGorKykgeworICAgICAgICAgICAgdmFsICA9IHVbal0gPDwgMjsKKyAgICAgICAgICAgIHZhbCB8PSB5W2pdIDw8IDEyOworICAgICAgICAgICAgdmFsIHw9ICh1aW50MzJfdCkgdltqXSA8PCAyMjsKKyAgICAgICAgICAgIEFWX1dMMzIoZHN0LCB2YWwpOworICAgICAgICAgICAgZHN0ICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgeSArPSBwaWMtPmxpbmVzaXplWzBdID4+IDE7CisgICAgICAgIHUgKz0gcGljLT5saW5lc2l6ZVsxXSA+PiAxOworICAgICAgICB2ICs9IHBpYy0+bGluZXNpemVbMl0gPj4gMTsKKyAgICB9CisKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2NDEwX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl92NDEwX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICA9ICJ2NDEwIiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCA0OjQ6NCAxMC1iaXQiKSwKKyAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WNDEwLAorICAgIC5pbml0ICAgICAgICAgPSB2NDEwX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgPSB2NDEwX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgID0gdjQxMF9lbmNvZGVfY2xvc2UsCisgICAgLnBpeF9mbXRzICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfWVVWNDQ0UDEwLCBBVl9QSVhfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92YWFwaS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmFhcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjRkMjlkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmFhcGkuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIFZpZGVvIEFjY2VsZXJhdGlvbiBBUEkgKHZpZGVvIGRlY29kaW5nKQorICogSFcgZGVjb2RlIGFjY2VsZXJhdGlvbiBmb3IgTVBFRy0yLCBNUEVHLTQsIEguMjY0IGFuZCBWQy0xCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgU3BsaXR0ZWQtRGVza3RvcCBTeXN0ZW1zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAidmFhcGlfaW50ZXJuYWwuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBWQUFQSV9EZWNvZGluZworICoKKyAqIEB7CisgKi8KKworc3RhdGljIHZvaWQgZGVzdHJveV9idWZmZXJzKFZBRGlzcGxheSBkaXNwbGF5LCBWQUJ1ZmZlcklEICpidWZmZXJzLCB1bnNpZ25lZCBpbnQgbl9idWZmZXJzKQoreworICAgIHVuc2lnbmVkIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuX2J1ZmZlcnM7IGkrKykgeworICAgICAgICBpZiAoYnVmZmVyc1tpXSkgeworICAgICAgICAgICAgdmFEZXN0cm95QnVmZmVyKGRpc3BsYXksIGJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgYnVmZmVyc1tpXSA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBmZl92YWFwaV9yZW5kZXJfcGljdHVyZShzdHJ1Y3QgdmFhcGlfY29udGV4dCAqdmFjdHgsIFZBU3VyZmFjZUlEIHN1cmZhY2UpCit7CisgICAgVkFCdWZmZXJJRCB2YV9idWZmZXJzWzNdOworICAgIHVuc2lnbmVkIGludCBuX3ZhX2J1ZmZlcnMgPSAwOworCisgICAgaWYgKCF2YWN0eC0+cGljX3BhcmFtX2J1Zl9pZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB2YVVubWFwQnVmZmVyKHZhY3R4LT5kaXNwbGF5LCB2YWN0eC0+cGljX3BhcmFtX2J1Zl9pZCk7CisgICAgdmFfYnVmZmVyc1tuX3ZhX2J1ZmZlcnMrK10gPSB2YWN0eC0+cGljX3BhcmFtX2J1Zl9pZDsKKworICAgIGlmICh2YWN0eC0+aXFfbWF0cml4X2J1Zl9pZCkgeworICAgICAgICB2YVVubWFwQnVmZmVyKHZhY3R4LT5kaXNwbGF5LCB2YWN0eC0+aXFfbWF0cml4X2J1Zl9pZCk7CisgICAgICAgIHZhX2J1ZmZlcnNbbl92YV9idWZmZXJzKytdID0gdmFjdHgtPmlxX21hdHJpeF9idWZfaWQ7CisgICAgfQorCisgICAgaWYgKHZhY3R4LT5iaXRwbGFuZV9idWZfaWQpIHsKKyAgICAgICAgdmFVbm1hcEJ1ZmZlcih2YWN0eC0+ZGlzcGxheSwgdmFjdHgtPmJpdHBsYW5lX2J1Zl9pZCk7CisgICAgICAgIHZhX2J1ZmZlcnNbbl92YV9idWZmZXJzKytdID0gdmFjdHgtPmJpdHBsYW5lX2J1Zl9pZDsKKyAgICB9CisKKyAgICBpZiAodmFCZWdpblBpY3R1cmUodmFjdHgtPmRpc3BsYXksIHZhY3R4LT5jb250ZXh0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlKSAhPSBWQV9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKHZhUmVuZGVyUGljdHVyZSh2YWN0eC0+ZGlzcGxheSwgdmFjdHgtPmNvbnRleHRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICB2YV9idWZmZXJzLCBuX3ZhX2J1ZmZlcnMpICE9IFZBX1NUQVRVU19TVUNDRVNTKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAodmFSZW5kZXJQaWN0dXJlKHZhY3R4LT5kaXNwbGF5LCB2YWN0eC0+Y29udGV4dF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhY3R4LT5zbGljZV9idWZfaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFjdHgtPm5fc2xpY2VfYnVmX2lkcykgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICh2YUVuZFBpY3R1cmUodmFjdHgtPmRpc3BsYXksIHZhY3R4LT5jb250ZXh0X2lkKSAhPSBWQV9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl92YWFwaV9jb21taXRfc2xpY2VzKHN0cnVjdCB2YWFwaV9jb250ZXh0ICp2YWN0eCkKK3sKKyAgICBWQUJ1ZmZlcklEICpzbGljZV9idWZfaWRzOworICAgIFZBQnVmZmVySUQgc2xpY2VfcGFyYW1fYnVmX2lkLCBzbGljZV9kYXRhX2J1Zl9pZDsKKworICAgIGlmICh2YWN0eC0+c2xpY2VfY291bnQgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzbGljZV9idWZfaWRzID0KKyAgICAgICAgYXZfZmFzdF9yZWFsbG9jKHZhY3R4LT5zbGljZV9idWZfaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgJnZhY3R4LT5zbGljZV9idWZfaWRzX2FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZhY3R4LT5uX3NsaWNlX2J1Zl9pZHMgKyAyKSAqIHNpemVvZihzbGljZV9idWZfaWRzWzBdKSk7CisgICAgaWYgKCFzbGljZV9idWZfaWRzKQorICAgICAgICByZXR1cm4gLTE7CisgICAgdmFjdHgtPnNsaWNlX2J1Zl9pZHMgPSBzbGljZV9idWZfaWRzOworCisgICAgc2xpY2VfcGFyYW1fYnVmX2lkID0gMDsKKyAgICBpZiAodmFDcmVhdGVCdWZmZXIodmFjdHgtPmRpc3BsYXksIHZhY3R4LT5jb250ZXh0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICBWQVNsaWNlUGFyYW1ldGVyQnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdmFjdHgtPnNsaWNlX3BhcmFtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHZhY3R4LT5zbGljZV9jb3VudCwgdmFjdHgtPnNsaWNlX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgJnNsaWNlX3BhcmFtX2J1Zl9pZCkgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB2YWN0eC0+c2xpY2VfY291bnQgPSAwOworCisgICAgc2xpY2VfZGF0YV9idWZfaWQgPSAwOworICAgIGlmICh2YUNyZWF0ZUJ1ZmZlcih2YWN0eC0+ZGlzcGxheSwgdmFjdHgtPmNvbnRleHRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgIFZBU2xpY2VEYXRhQnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdmFjdHgtPnNsaWNlX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgMSwgKHZvaWQgKil2YWN0eC0+c2xpY2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnNsaWNlX2RhdGFfYnVmX2lkKSAhPSBWQV9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHZhY3R4LT5zbGljZV9kYXRhID0gTlVMTDsKKyAgICB2YWN0eC0+c2xpY2VfZGF0YV9zaXplID0gMDsKKworICAgIHNsaWNlX2J1Zl9pZHNbdmFjdHgtPm5fc2xpY2VfYnVmX2lkcysrXSA9IHNsaWNlX3BhcmFtX2J1Zl9pZDsKKyAgICBzbGljZV9idWZfaWRzW3ZhY3R4LT5uX3NsaWNlX2J1Zl9pZHMrK10gPSBzbGljZV9kYXRhX2J1Zl9pZDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKmFsbG9jX2J1ZmZlcihzdHJ1Y3QgdmFhcGlfY29udGV4dCAqdmFjdHgsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdWludDMyX3QgKmJ1Zl9pZCkKK3sKKyAgICB2b2lkICpkYXRhID0gTlVMTDsKKworICAgICpidWZfaWQgPSAwOworICAgIGlmICh2YUNyZWF0ZUJ1ZmZlcih2YWN0eC0+ZGlzcGxheSwgdmFjdHgtPmNvbnRleHRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHNpemUsIDEsIE5VTEwsIGJ1Zl9pZCkgPT0gVkFfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHZhTWFwQnVmZmVyKHZhY3R4LT5kaXNwbGF5LCAqYnVmX2lkLCAmZGF0YSk7CisKKyAgICByZXR1cm4gZGF0YTsKK30KKwordm9pZCAqZmZfdmFhcGlfYWxsb2NfcGljX3BhcmFtKHN0cnVjdCB2YWFwaV9jb250ZXh0ICp2YWN0eCwgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgcmV0dXJuIGFsbG9jX2J1ZmZlcih2YWN0eCwgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVHlwZSwgc2l6ZSwgJnZhY3R4LT5waWNfcGFyYW1fYnVmX2lkKTsKK30KKwordm9pZCAqZmZfdmFhcGlfYWxsb2NfaXFfbWF0cml4KHN0cnVjdCB2YWFwaV9jb250ZXh0ICp2YWN0eCwgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgcmV0dXJuIGFsbG9jX2J1ZmZlcih2YWN0eCwgVkFJUU1hdHJpeEJ1ZmZlclR5cGUsIHNpemUsICZ2YWN0eC0+aXFfbWF0cml4X2J1Zl9pZCk7Cit9CisKK3VpbnQ4X3QgKmZmX3ZhYXBpX2FsbG9jX2JpdHBsYW5lKHN0cnVjdCB2YWFwaV9jb250ZXh0ICp2YWN0eCwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gYWxsb2NfYnVmZmVyKHZhY3R4LCBWQUJpdFBsYW5lQnVmZmVyVHlwZSwgc2l6ZSwgJnZhY3R4LT5iaXRwbGFuZV9idWZfaWQpOworfQorCitWQVNsaWNlUGFyYW1ldGVyQnVmZmVyQmFzZSAqZmZfdmFhcGlfYWxsb2Nfc2xpY2Uoc3RydWN0IHZhYXBpX2NvbnRleHQgKnZhY3R4LCBjb25zdCB1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IHNpemUpCit7CisgICAgdWludDhfdCAqc2xpY2VfcGFyYW1zOworICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJCYXNlICpzbGljZV9wYXJhbTsKKworICAgIGlmICghdmFjdHgtPnNsaWNlX2RhdGEpCisgICAgICAgIHZhY3R4LT5zbGljZV9kYXRhID0gYnVmZmVyOworICAgIGlmICh2YWN0eC0+c2xpY2VfZGF0YSArIHZhY3R4LT5zbGljZV9kYXRhX3NpemUgIT0gYnVmZmVyKSB7CisgICAgICAgIGlmIChmZl92YWFwaV9jb21taXRfc2xpY2VzKHZhY3R4KSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdmFjdHgtPnNsaWNlX2RhdGEgPSBidWZmZXI7CisgICAgfQorCisgICAgc2xpY2VfcGFyYW1zID0KKyAgICAgICAgYXZfZmFzdF9yZWFsbG9jKHZhY3R4LT5zbGljZV9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAmdmFjdHgtPnNsaWNlX3BhcmFtc19hbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICh2YWN0eC0+c2xpY2VfY291bnQgKyAxKSAqIHZhY3R4LT5zbGljZV9wYXJhbV9zaXplKTsKKyAgICBpZiAoIXNsaWNlX3BhcmFtcykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdmFjdHgtPnNsaWNlX3BhcmFtcyA9IHNsaWNlX3BhcmFtczsKKworICAgIHNsaWNlX3BhcmFtID0gKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJCYXNlICopKHNsaWNlX3BhcmFtcyArIHZhY3R4LT5zbGljZV9jb3VudCAqIHZhY3R4LT5zbGljZV9wYXJhbV9zaXplKTsKKyAgICBzbGljZV9wYXJhbS0+c2xpY2VfZGF0YV9zaXplICAgPSBzaXplOworICAgIHNsaWNlX3BhcmFtLT5zbGljZV9kYXRhX29mZnNldCA9IHZhY3R4LT5zbGljZV9kYXRhX3NpemU7CisgICAgc2xpY2VfcGFyYW0tPnNsaWNlX2RhdGFfZmxhZyAgID0gVkFfU0xJQ0VfREFUQV9GTEFHX0FMTDsKKworICAgIHZhY3R4LT5zbGljZV9jb3VudCsrOworICAgIHZhY3R4LT5zbGljZV9kYXRhX3NpemUgKz0gc2l6ZTsKKyAgICByZXR1cm4gc2xpY2VfcGFyYW07Cit9CisKK3ZvaWQgZmZfdmFhcGlfY29tbW9uX2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgc3RydWN0IHZhYXBpX2NvbnRleHQgKiBjb25zdCB2YWN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisKKyAgICBhdl9kbG9nKGF2Y3R4LCAiZmZfdmFhcGlfY29tbW9uX2VuZF9mcmFtZSgpXG4iKTsKKworICAgIGRlc3Ryb3lfYnVmZmVycyh2YWN0eC0+ZGlzcGxheSwgJnZhY3R4LT5waWNfcGFyYW1fYnVmX2lkLCAxKTsKKyAgICBkZXN0cm95X2J1ZmZlcnModmFjdHgtPmRpc3BsYXksICZ2YWN0eC0+aXFfbWF0cml4X2J1Zl9pZCwgMSk7CisgICAgZGVzdHJveV9idWZmZXJzKHZhY3R4LT5kaXNwbGF5LCAmdmFjdHgtPmJpdHBsYW5lX2J1Zl9pZCwgMSk7CisgICAgZGVzdHJveV9idWZmZXJzKHZhY3R4LT5kaXNwbGF5LCB2YWN0eC0+c2xpY2VfYnVmX2lkcywgdmFjdHgtPm5fc2xpY2VfYnVmX2lkcyk7CisgICAgYXZfZnJlZXAoJnZhY3R4LT5zbGljZV9idWZfaWRzKTsKKyAgICBhdl9mcmVlcCgmdmFjdHgtPnNsaWNlX3BhcmFtcyk7CisgICAgdmFjdHgtPm5fc2xpY2VfYnVmX2lkcyAgICAgPSAwOworICAgIHZhY3R4LT5zbGljZV9idWZfaWRzX2FsbG9jID0gMDsKKyAgICB2YWN0eC0+c2xpY2VfY291bnQgICAgICAgICA9IDA7CisgICAgdmFjdHgtPnNsaWNlX3BhcmFtc19hbGxvYyAgPSAwOworfQorCisvKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmFhcGkuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZhYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1YTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZhYXBpLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBWaWRlbyBBY2NlbGVyYXRpb24gQVBJIChzaGFyZWQgZGF0YSBiZXR3ZWVuIEZGbXBlZyBhbmQgdGhlIHZpZGVvIHBsYXllcikKKyAqIEhXIGRlY29kZSBhY2NlbGVyYXRpb24gZm9yIE1QRUctMiwgTVBFRy00LCBILjI2NCBhbmQgVkMtMQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFNwbGl0dGVkLURlc2t0b3AgU3lzdGVtcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVkFBUElfSAorI2RlZmluZSBBVkNPREVDX1ZBQVBJX0gKKworLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbGF2Y19jb2RlY19od2FjY2VsX3ZhYXBpCisgKiBQdWJsaWMgbGliYXZjb2RlYyBWQSBBUEkgaGVhZGVyLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2Y19jb2RlY19od2FjY2VsX3ZhYXBpIFZBIEFQSSBEZWNvZGluZworICogQGluZ3JvdXAgbGF2Y19jb2RlY19od2FjY2VsCisgKiBAeworICovCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGhlIEZGbXBlZyBsaWJyYXJ5IGFuZAorICogdGhlIGNsaWVudCB2aWRlbyBhcHBsaWNhdGlvbi4KKyAqIFRoaXMgc2hhbGwgYmUgemVyby1hbGxvY2F0ZWQgYW5kIGF2YWlsYWJsZSBhcworICogQVZDb2RlY0NvbnRleHQuaHdhY2NlbF9jb250ZXh0LiBBbGwgdXNlciBtZW1iZXJzIGNhbiBiZSBzZXQgb25jZQorICogZHVyaW5nIGluaXRpYWxpemF0aW9uIG9yIHRocm91Z2ggZWFjaCBBVkNvZGVjQ29udGV4dC5nZXRfYnVmZmVyKCkKKyAqIGZ1bmN0aW9uIGNhbGwuIEluIGFueSBjYXNlLCB0aGV5IG11c3QgYmUgdmFsaWQgcHJpb3IgdG8gY2FsbGluZworICogZGVjb2RpbmcgZnVuY3Rpb25zLgorICovCitzdHJ1Y3QgdmFhcGlfY29udGV4dCB7CisgICAgLyoqCisgICAgICogV2luZG93IHN5c3RlbSBkZXBlbmRlbnQgZGF0YQorICAgICAqCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIKKyAgICAgKi8KKyAgICB2b2lkICpkaXNwbGF5OworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBJRAorICAgICAqCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIKKyAgICAgKi8KKyAgICB1aW50MzJfdCBjb25maWdfaWQ7CisKKyAgICAvKioKKyAgICAgKiBDb250ZXh0IElEICh2aWRlbyBkZWNvZGUgcGlwZWxpbmUpCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlcgorICAgICAqLworICAgIHVpbnQzMl90IGNvbnRleHRfaWQ7CisKKyAgICAvKioKKyAgICAgKiBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXIgSUQKKyAgICAgKgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjCisgICAgICovCisgICAgdWludDMyX3QgcGljX3BhcmFtX2J1Zl9pZDsKKworICAgIC8qKgorICAgICAqIFZBSVFNYXRyaXhCdWZmZXIgSUQKKyAgICAgKgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjCisgICAgICovCisgICAgdWludDMyX3QgaXFfbWF0cml4X2J1Zl9pZDsKKworICAgIC8qKgorICAgICAqIFZBQml0UGxhbmVCdWZmZXIgSUQgKGZvciBWQy0xIGRlY29kaW5nKQorICAgICAqCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMKKyAgICAgKi8KKyAgICB1aW50MzJfdCBiaXRwbGFuZV9idWZfaWQ7CisKKyAgICAvKioKKyAgICAgKiBTbGljZSBwYXJhbWV0ZXIvZGF0YSBidWZmZXIgSURzCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYworICAgICAqLworICAgIHVpbnQzMl90ICpzbGljZV9idWZfaWRzOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGVmZmVjdGl2ZSBzbGljZSBidWZmZXIgSURzIHRvIHNlbmQgdG8gdGhlIEhXCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYworICAgICAqLworICAgIHVuc2lnbmVkIGludCBuX3NsaWNlX2J1Zl9pZHM7CisKKyAgICAvKioKKyAgICAgKiBTaXplIG9mIHByZS1hbGxvY2F0ZWQgc2xpY2VfYnVmX2lkcworICAgICAqCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2xpY2VfYnVmX2lkc19hbGxvYzsKKworICAgIC8qKgorICAgICAqIFBvaW50ZXIgdG8gVkFTbGljZVBhcmFtZXRlckJ1ZmZlcnMKKyAgICAgKgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjCisgICAgICovCisgICAgdm9pZCAqc2xpY2VfcGFyYW1zOworCisgICAgLyoqCisgICAgICogU2l6ZSBvZiBhIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXIgZWxlbWVudAorICAgICAqCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2xpY2VfcGFyYW1fc2l6ZTsKKworICAgIC8qKgorICAgICAqIFNpemUgb2YgcHJlLWFsbG9jYXRlZCBzbGljZV9wYXJhbXMKKyAgICAgKgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjCisgICAgICovCisgICAgdW5zaWduZWQgaW50IHNsaWNlX3BhcmFtc19hbGxvYzsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBzbGljZXMgY3VycmVudGx5IGZpbGxlZCBpbgorICAgICAqCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2xpY2VfY291bnQ7CisKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIHRvIHNsaWNlIGRhdGEgYnVmZmVyIGJhc2UKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYworICAgICAqLworICAgIGNvbnN0IHVpbnQ4X3QgKnNsaWNlX2RhdGE7CisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IHNpemUgb2Ygc2xpY2UgZGF0YQorICAgICAqCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMKKyAgICAgKi8KKyAgICB1aW50MzJfdCBzbGljZV9kYXRhX3NpemU7Cit9OworCisvKiBAfSAqLworCisjZW5kaWYgLyogQVZDT0RFQ19WQUFQSV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92YWFwaV9oMjY0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy92YWFwaV9oMjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViOGE2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZhYXBpX2gyNjQuYwpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIEguMjY0IEhXIGRlY29kZSBhY2NlbGVyYXRpb24gdGhyb3VnaCBWQSBBUEkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBTcGxpdHRlZC1EZXNrdG9wIFN5c3RlbXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInZhYXBpX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgIm1wZWd1dGlscy5oIgorCisvKioKKyAqIEBmaWxlCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZ2x1ZSBjb2RlIGJldHdlZW4gRkZtcGVnJ3MgYW5kIFZBIEFQSSdzCisgKiBzdHJ1Y3R1cmVzIGZvciBILjI2NCBkZWNvZGluZy4KKyAqLworCisvKioKKyAqIEluaXRpYWxpemUgYW4gZW1wdHkgVkEgQVBJIHBpY3R1cmUuCisgKgorICogVkEgQVBJIHJlcXVpcmVzIGEgZml4ZWQtc2l6ZSByZWZlcmVuY2UgcGljdHVyZSBhcnJheS4KKyAqLworc3RhdGljIHZvaWQgaW5pdF92YWFwaV9waWMoVkFQaWN0dXJlSDI2NCAqdmFfcGljKQoreworICAgIHZhX3BpYy0+cGljdHVyZV9pZCAgICAgICAgICA9IFZBX0lOVkFMSURfSUQ7CisgICAgdmFfcGljLT5mbGFncyAgICAgICAgICAgICAgID0gVkFfUElDVFVSRV9IMjY0X0lOVkFMSUQ7CisgICAgdmFfcGljLT5Ub3BGaWVsZE9yZGVyQ250ICAgID0gMDsKKyAgICB2YV9waWMtPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSAwOworfQorCisvKioKKyAqIFRyYW5zbGF0ZSBhbiBGRm1wZWcgUGljdHVyZSBpbnRvIGl0cyBWQSBBUEkgZm9ybS4KKyAqCisgKiBAcGFyYW1bb3V0XSB2YV9waWMgICAgICAgICAgQSBwb2ludGVyIHRvIFZBIEFQSSdzIG93biBwaWN0dXJlIHN0cnVjdAorICogQHBhcmFtW2luXSAgcGljICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRkZtcGVnIHBpY3R1cmUgc3RydWN0IHRvIGNvbnZlcnQKKyAqIEBwYXJhbVtpbl0gIHBpY19zdHJ1Y3R1cmUgICBUaGUgcGljdHVyZSBmaWVsZCB0eXBlIChhcyBkZWZpbmVkIGluIG1wZWd2aWRlby5oKSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcnNlZGVzIHBpYydzIGZpZWxkIHR5cGUgaWYgbm9uemVyby4KKyAqLworc3RhdGljIHZvaWQgZmlsbF92YWFwaV9waWMoVkFQaWN0dXJlSDI2NCAqdmFfcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFBpY3R1cmUgICAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgcGljX3N0cnVjdHVyZSkKK3sKKyAgICBpZiAocGljX3N0cnVjdHVyZSA9PSAwKQorICAgICAgICBwaWNfc3RydWN0dXJlID0gcGljLT5yZWZlcmVuY2U7CisgICAgcGljX3N0cnVjdHVyZSAmPSBQSUNUX0ZSQU1FOyAvKiBQSUNUX1RPUF9GSUVMRHxQSUNUX0JPVFRPTV9GSUVMRCAqLworCisgICAgdmFfcGljLT5waWN0dXJlX2lkID0gZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQoJnBpYy0+Zik7CisgICAgdmFfcGljLT5mcmFtZV9pZHggID0gcGljLT5sb25nX3JlZiA/IHBpYy0+cGljX2lkIDogcGljLT5mcmFtZV9udW07CisKKyAgICB2YV9waWMtPmZsYWdzICAgICAgPSAwOworICAgIGlmIChwaWNfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUUpCisgICAgICAgIHZhX3BpYy0+ZmxhZ3MgfD0gKHBpY19zdHJ1Y3R1cmUgJiBQSUNUX1RPUF9GSUVMRCkgPyBWQV9QSUNUVVJFX0gyNjRfVE9QX0ZJRUxEIDogVkFfUElDVFVSRV9IMjY0X0JPVFRPTV9GSUVMRDsKKyAgICBpZiAocGljLT5yZWZlcmVuY2UpCisgICAgICAgIHZhX3BpYy0+ZmxhZ3MgfD0gcGljLT5sb25nX3JlZiA/IFZBX1BJQ1RVUkVfSDI2NF9MT05HX1RFUk1fUkVGRVJFTkNFIDogVkFfUElDVFVSRV9IMjY0X1NIT1JUX1RFUk1fUkVGRVJFTkNFOworCisgICAgdmFfcGljLT5Ub3BGaWVsZE9yZGVyQ250ID0gMDsKKyAgICBpZiAocGljLT5maWVsZF9wb2NbMF0gIT0gSU5UX01BWCkKKyAgICAgICAgdmFfcGljLT5Ub3BGaWVsZE9yZGVyQ250ID0gcGljLT5maWVsZF9wb2NbMF07CisKKyAgICB2YV9waWMtPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSAwOworICAgIGlmIChwaWMtPmZpZWxkX3BvY1sxXSAhPSBJTlRfTUFYKQorICAgICAgICB2YV9waWMtPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSBwaWMtPmZpZWxkX3BvY1sxXTsKK30KKworLyoqIERlY29kZWQgUGljdHVyZSBCdWZmZXIgKERQQikuICovCit0eXBlZGVmIHN0cnVjdCBEUEIgeworICAgIGludCAgICAgICAgICAgIHNpemU7ICAgICAgICAvLy88IEN1cnJlbnQgbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgaW4gdGhlIERQQgorICAgIGludCAgICAgICAgICAgIG1heF9zaXplOyAgICAvLy88IE1heCBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lcy4gVGhpcyBpcyBGRl9BUlJBWV9FTEVNUyhWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIMjY0LlJlZmVyZW5jZUZyYW1lcykKKyAgICBWQVBpY3R1cmVIMjY0ICp2YV9waWNzOyAgICAgLy8vPCBQb2ludGVyIHRvIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckgyNjQuUmVmZXJlbmNlRnJhbWVzIGFycmF5Cit9IERQQjsKKworLyoqCisgKiBBcHBlbmQgcGljdHVyZSB0byB0aGUgZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlciwgaW4gYSBWQSBBUEkgZm9ybSB0aGF0CisgKiBtZXJnZXMgdGhlIHNlY29uZCBmaWVsZCBwaWN0dXJlIGF0dHJpYnV0ZXMgd2l0aCB0aGUgZmlyc3QsIGlmCisgKiBhdmFpbGFibGUuICBUaGUgZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlcidzIHNpemUgbXVzdCBiZSBsYXJnZSBlbm91Z2gKKyAqIHRvIHJlY2VpdmUgdGhlIG5ldyBWQSBBUEkgcGljdHVyZSBvYmplY3QuCisgKi8KK3N0YXRpYyBpbnQgZHBiX2FkZChEUEIgKmRwYiwgSDI2NFBpY3R1cmUgKnBpYykKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChkcGItPnNpemUgPj0gZHBiLT5tYXhfc2l6ZSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+c2l6ZTsgaSsrKSB7CisgICAgICAgIFZBUGljdHVyZUgyNjQgKiBjb25zdCB2YV9waWMgPSAmZHBiLT52YV9waWNzW2ldOworICAgICAgICBpZiAodmFfcGljLT5waWN0dXJlX2lkID09IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKCZwaWMtPmYpKSB7CisgICAgICAgICAgICBWQVBpY3R1cmVIMjY0IHRlbXBfdmFfcGljOworICAgICAgICAgICAgZmlsbF92YWFwaV9waWMoJnRlbXBfdmFfcGljLCBwaWMsIDApOworCisgICAgICAgICAgICBpZiAoKHRlbXBfdmFfcGljLmZsYWdzIF4gdmFfcGljLT5mbGFncykgJiAoVkFfUElDVFVSRV9IMjY0X1RPUF9GSUVMRCB8IFZBX1BJQ1RVUkVfSDI2NF9CT1RUT01fRklFTEQpKSB7CisgICAgICAgICAgICAgICAgdmFfcGljLT5mbGFncyB8PSB0ZW1wX3ZhX3BpYy5mbGFncyAmIChWQV9QSUNUVVJFX0gyNjRfVE9QX0ZJRUxEIHwgVkFfUElDVFVSRV9IMjY0X0JPVFRPTV9GSUVMRCk7CisgICAgICAgICAgICAgICAgLyogTWVyZ2Ugc2Vjb25kIGZpZWxkICovCisgICAgICAgICAgICAgICAgaWYgKHRlbXBfdmFfcGljLmZsYWdzICYgVkFfUElDVFVSRV9IMjY0X1RPUF9GSUVMRCkgeworICAgICAgICAgICAgICAgICAgICB2YV9waWMtPlRvcEZpZWxkT3JkZXJDbnQgICAgPSB0ZW1wX3ZhX3BpYy5Ub3BGaWVsZE9yZGVyQ250OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhX3BpYy0+Qm90dG9tRmllbGRPcmRlckNudCA9IHRlbXBfdmFfcGljLkJvdHRvbUZpZWxkT3JkZXJDbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaWxsX3ZhYXBpX3BpYygmZHBiLT52YV9waWNzW2RwYi0+c2l6ZSsrXSwgcGljLCAwKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqIEZpbGwgaW4gVkEgQVBJIHJlZmVyZW5jZSBmcmFtZXMgYXJyYXkuICovCitzdGF0aWMgaW50IGZpbGxfdmFhcGlfUmVmZXJlbmNlRnJhbWVzKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckgyNjQgKnBpY19wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NENvbnRleHQgICAgICAgICAgICAgICAgICAqaCkKK3sKKyAgICBEUEIgZHBiOworICAgIGludCBpOworCisgICAgZHBiLnNpemUgICAgID0gMDsKKyAgICBkcGIubWF4X3NpemUgPSBGRl9BUlJBWV9FTEVNUyhwaWNfcGFyYW0tPlJlZmVyZW5jZUZyYW1lcyk7CisgICAgZHBiLnZhX3BpY3MgID0gcGljX3BhcmFtLT5SZWZlcmVuY2VGcmFtZXM7CisgICAgZm9yIChpID0gMDsgaSA8IGRwYi5tYXhfc2l6ZTsgaSsrKQorICAgICAgICBpbml0X3ZhYXBpX3BpYygmZHBiLnZhX3BpY3NbaV0pOworCisgICAgZm9yIChpID0gMDsgaSA8IGgtPnNob3J0X3JlZl9jb3VudDsgaSsrKSB7CisgICAgICAgIEgyNjRQaWN0dXJlICogY29uc3QgcGljID0gaC0+c2hvcnRfcmVmW2ldOworICAgICAgICBpZiAocGljICYmIHBpYy0+cmVmZXJlbmNlICYmIGRwYl9hZGQoJmRwYiwgcGljKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgSDI2NFBpY3R1cmUgKiBjb25zdCBwaWMgPSBoLT5sb25nX3JlZltpXTsKKyAgICAgICAgaWYgKHBpYyAmJiBwaWMtPnJlZmVyZW5jZSAmJiBkcGJfYWRkKCZkcGIsIHBpYykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBGaWxsIGluIFZBIEFQSSByZWZlcmVuY2UgcGljdHVyZSBsaXN0cyBmcm9tIHRoZSBGRm1wZWcgcmVmZXJlbmNlCisgKiBwaWN0dXJlIGxpc3QuCisgKgorICogQHBhcmFtW291dF0gUmVmUGljTGlzdCAgVkEgQVBJIGludGVybmFsIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QKKyAqIEBwYXJhbVtpbl0gIHJlZl9saXN0ICAgIEEgcG9pbnRlciB0byB0aGUgRkZtcGVnIHJlZmVyZW5jZSBsaXN0CisgKiBAcGFyYW1baW5dICByZWZfY291bnQgICBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBwaWN0dXJlcyBpbiByZWZfbGlzdAorICovCitzdGF0aWMgdm9pZCBmaWxsX3ZhYXBpX1JlZlBpY0xpc3QoVkFQaWN0dXJlSDI2NCBSZWZQaWNMaXN0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0UGljdHVyZSAgKnJlZl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgcmVmX2NvdW50KQoreworICAgIHVuc2lnbmVkIGludCBpLCBuID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVmX2NvdW50OyBpKyspCisgICAgICAgIGlmIChyZWZfbGlzdFtpXS5yZWZlcmVuY2UpCisgICAgICAgICAgICBmaWxsX3ZhYXBpX3BpYygmUmVmUGljTGlzdFtuKytdLCAmcmVmX2xpc3RbaV0sIDApOworCisgICAgZm9yICg7IG4gPCAzMjsgbisrKQorICAgICAgICBpbml0X3ZhYXBpX3BpYygmUmVmUGljTGlzdFtuXSk7Cit9CisKKy8qKgorICogRmlsbCBpbiBwcmVkaWN0aW9uIHdlaWdodCB0YWJsZS4KKyAqCisgKiBWQSBBUEkgcmVxdWlyZXMgYSBwbGFpbiBwcmVkaWN0aW9uIHdlaWdodCB0YWJsZSBhcyBpdCBkb2VzIG5vdCBpbmZlcgorICogYW55IHZhbHVlLgorICoKKyAqIEBwYXJhbVtpbl0gIGggICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IEguMjY0IGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gIGxpc3QgICAgICAgICAgICAgICAgVGhlIHJlZmVyZW5jZSBmcmFtZSBsaXN0IGluZGV4IHRvIHVzZQorICogQHBhcmFtW291dF0gbHVtYV93ZWlnaHRfZmxhZyAgICBWQSBBUEkgcGxhaW4gbHVtYSB3ZWlnaHQgZmxhZworICogQHBhcmFtW291dF0gbHVtYV93ZWlnaHQgICAgICAgICBWQSBBUEkgcGxhaW4gbHVtYSB3ZWlnaHQgdGFibGUKKyAqIEBwYXJhbVtvdXRdIGx1bWFfb2Zmc2V0ICAgICAgICAgVkEgQVBJIHBsYWluIGx1bWEgb2Zmc2V0IHRhYmxlCisgKiBAcGFyYW1bb3V0XSBjaHJvbWFfd2VpZ2h0X2ZsYWcgIFZBIEFQSSBwbGFpbiBjaHJvbWEgd2VpZ2h0IGZsYWcKKyAqIEBwYXJhbVtvdXRdIGNocm9tYV93ZWlnaHQgICAgICAgVkEgQVBJIHBsYWluIGNocm9tYSB3ZWlnaHQgdGFibGUKKyAqIEBwYXJhbVtvdXRdIGNocm9tYV9vZmZzZXQgICAgICAgVkEgQVBJIHBsYWluIGNocm9tYSBvZmZzZXQgdGFibGUKKyAqLworc3RhdGljIHZvaWQgZmlsbF92YWFwaV9wbGFpbl9wcmVkX3dlaWdodF90YWJsZShIMjY0Q29udGV4dCAgICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW1hX3dlaWdodF9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgICAgICBsdW1hX3dlaWdodFszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgICAgICAgIGx1bWFfb2Zmc2V0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2hyb21hX3dlaWdodF9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgICAgICBjaHJvbWFfd2VpZ2h0WzMyXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgICAgICAgICAgY2hyb21hX29mZnNldFszMl1bMl0pCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgICAqbHVtYV93ZWlnaHRfZmxhZyAgICA9IGgtPmx1bWFfd2VpZ2h0X2ZsYWdbbGlzdF07CisgICAgKmNocm9tYV93ZWlnaHRfZmxhZyAgPSBoLT5jaHJvbWFfd2VpZ2h0X2ZsYWdbbGlzdF07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaC0+cmVmX2NvdW50W2xpc3RdOyBpKyspIHsKKyAgICAgICAgLyogVkEgQVBJIGFsc28gd2FudHMgdGhlIGluZmVycmVkIChkZWZhdWx0KSB2YWx1ZXMsIG5vdAorICAgICAgICAgICBvbmx5IHdoYXQgaXMgYXZhaWxhYmxlIGluIHRoZSBiaXRzdHJlYW0gKDcuNC4zLjIpLiAqLworICAgICAgICBpZiAoaC0+bHVtYV93ZWlnaHRfZmxhZ1tsaXN0XSkgeworICAgICAgICAgICAgbHVtYV93ZWlnaHRbaV0gPSBoLT5sdW1hX3dlaWdodFtpXVtsaXN0XVswXTsKKyAgICAgICAgICAgIGx1bWFfb2Zmc2V0W2ldID0gaC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsdW1hX3dlaWdodFtpXSA9IDEgPDwgaC0+bHVtYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICAgICAgICAgIGx1bWFfb2Zmc2V0W2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICBpZiAoaC0+Y2hyb21hX3dlaWdodF9mbGFnW2xpc3RdKSB7CisgICAgICAgICAgICAgICAgY2hyb21hX3dlaWdodFtpXVtqXSA9IGgtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMF07CisgICAgICAgICAgICAgICAgY2hyb21hX29mZnNldFtpXVtqXSA9IGgtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHRbaV1bal0gPSAxIDw8IGgtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICAgICAgICAgICAgICBjaHJvbWFfb2Zmc2V0W2ldW2pdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqIEluaXRpYWxpemUgYW5kIHN0YXJ0IGRlY29kaW5nIGEgZnJhbWUgd2l0aCBWQSBBUEkuICovCitzdGF0aWMgaW50IHZhYXBpX2gyNjRfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgICAgICAgICAgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3VudXNlZCBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIHVpbnQzMl90ICAgICAgIHNpemUpCit7CisgICAgSDI2NENvbnRleHQgKiBjb25zdCBoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgdmFhcGlfY29udGV4dCAqIGNvbnN0IHZhY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKyAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIMjY0ICpwaWNfcGFyYW07CisgICAgVkFJUU1hdHJpeEJ1ZmZlckgyNjQgKmlxX21hdHJpeDsKKworICAgIGF2X2Rsb2coYXZjdHgsICJ2YWFwaV9oMjY0X3N0YXJ0X2ZyYW1lKClcbiIpOworCisgICAgdmFjdHgtPnNsaWNlX3BhcmFtX3NpemUgPSBzaXplb2YoVkFTbGljZVBhcmFtZXRlckJ1ZmZlckgyNjQpOworCisgICAgLyogRmlsbCBpbiBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIMjY0LiAqLworICAgIHBpY19wYXJhbSA9IGZmX3ZhYXBpX2FsbG9jX3BpY19wYXJhbSh2YWN0eCwgc2l6ZW9mKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckgyNjQpKTsKKyAgICBpZiAoIXBpY19wYXJhbSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGZpbGxfdmFhcGlfcGljKCZwaWNfcGFyYW0tPkN1cnJQaWMsIGgtPmN1cl9waWNfcHRyLCBoLT5waWN0dXJlX3N0cnVjdHVyZSk7CisgICAgaWYgKGZpbGxfdmFhcGlfUmVmZXJlbmNlRnJhbWVzKHBpY19wYXJhbSwgaCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcGljX3BhcmFtLT5waWN0dXJlX3dpZHRoX2luX21ic19taW51czEgICAgICAgICAgICAgICAgICAgICAgPSBoLT5tYl93aWR0aCAtIDE7CisgICAgcGljX3BhcmFtLT5waWN0dXJlX2hlaWdodF9pbl9tYnNfbWludXMxICAgICAgICAgICAgICAgICAgICAgPSBoLT5tYl9oZWlnaHQgLSAxOworICAgIHBpY19wYXJhbS0+Yml0X2RlcHRoX2x1bWFfbWludXM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaC0+c3BzLmJpdF9kZXB0aF9sdW1hIC0gODsKKyAgICBwaWNfcGFyYW0tPmJpdF9kZXB0aF9jaHJvbWFfbWludXM4ICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPnNwcy5iaXRfZGVwdGhfY2hyb21hIC0gODsKKyAgICBwaWNfcGFyYW0tPm51bV9yZWZfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPnNwcy5yZWZfZnJhbWVfY291bnQ7CisgICAgcGljX3BhcmFtLT5zZXFfZmllbGRzLnZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOyAvKiByZXNldCBhbGwgYml0cyAqLworICAgIHBpY19wYXJhbS0+c2VxX2ZpZWxkcy5iaXRzLmNocm9tYV9mb3JtYXRfaWRjICAgICAgICAgICAgICAgID0gaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjOworICAgIHBpY19wYXJhbS0+c2VxX2ZpZWxkcy5iaXRzLnJlc2lkdWFsX2NvbG91cl90cmFuc2Zvcm1fZmxhZyAgID0gaC0+c3BzLnJlc2lkdWFsX2NvbG9yX3RyYW5zZm9ybV9mbGFnOyAvKiBYWFg6IG9ubHkgZm9yIDQ6NDo0IGhpZ2ggcHJvZmlsZT8gKi8KKyAgICBwaWNfcGFyYW0tPnNlcV9maWVsZHMuYml0cy5nYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcgPSBoLT5zcHMuZ2Fwc19pbl9mcmFtZV9udW1fYWxsb3dlZF9mbGFnOworICAgIHBpY19wYXJhbS0+c2VxX2ZpZWxkcy5iaXRzLmZyYW1lX21ic19vbmx5X2ZsYWcgICAgICAgICAgICAgID0gaC0+c3BzLmZyYW1lX21ic19vbmx5X2ZsYWc7CisgICAgcGljX3BhcmFtLT5zZXFfZmllbGRzLmJpdHMubWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyAgICAgPSBoLT5zcHMubWJfYWZmOworICAgIHBpY19wYXJhbS0+c2VxX2ZpZWxkcy5iaXRzLmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgICAgICAgID0gaC0+c3BzLmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWc7CisgICAgcGljX3BhcmFtLT5zZXFfZmllbGRzLmJpdHMuTWluTHVtYUJpUHJlZFNpemU4eDggICAgICAgICAgICAgPSBoLT5zcHMubGV2ZWxfaWRjID49IDMxOyAvKiBBLjMuMy4yICovCisgICAgcGljX3BhcmFtLT5zZXFfZmllbGRzLmJpdHMubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCAgICAgICAgPSBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtIC0gNDsKKyAgICBwaWNfcGFyYW0tPnNlcV9maWVsZHMuYml0cy5waWNfb3JkZXJfY250X3R5cGUgICAgICAgICAgICAgICA9IGgtPnNwcy5wb2NfdHlwZTsKKyAgICBwaWNfcGFyYW0tPnNlcV9maWVsZHMuYml0cy5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgPSBoLT5zcHMubG9nMl9tYXhfcG9jX2xzYiAtIDQ7CisgICAgcGljX3BhcmFtLT5zZXFfZmllbGRzLmJpdHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgPSBoLT5zcHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7CisgICAgcGljX3BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5wcHMuc2xpY2VfZ3JvdXBfY291bnQgLSAxOworICAgIHBpY19wYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaC0+cHBzLm1iX3NsaWNlX2dyb3VwX21hcF90eXBlOworICAgIHBpY19wYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxICAgICAgICAgICAgICAgICAgID0gMDsgLyogWFhYOiB1bmltcGxlbWVudGVkIGluIEZGbXBlZyAqLworICAgIHBpY19wYXJhbS0+cGljX2luaXRfcXBfbWludXMyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaC0+cHBzLmluaXRfcXAgLSAyNjsKKyAgICBwaWNfcGFyYW0tPnBpY19pbml0X3FzX21pbnVzMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPnBwcy5pbml0X3FzIC0gMjY7CisgICAgcGljX3BhcmFtLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5wcHMuY2hyb21hX3FwX2luZGV4X29mZnNldFswXTsKKyAgICBwaWNfcGFyYW0tPnNlY29uZF9jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICA9IGgtPnBwcy5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzFdOworICAgIHBpY19wYXJhbS0+cGljX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KKyAgICBwaWNfcGFyYW0tPnBpY19maWVsZHMuYml0cy5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgICAgICAgICA9IGgtPnBwcy5jYWJhYzsKKyAgICBwaWNfcGFyYW0tPnBpY19maWVsZHMuYml0cy53ZWlnaHRlZF9wcmVkX2ZsYWcgICAgICAgICAgICAgICA9IGgtPnBwcy53ZWlnaHRlZF9wcmVkOworICAgIHBpY19wYXJhbS0+cGljX2ZpZWxkcy5iaXRzLndlaWdodGVkX2JpcHJlZF9pZGMgICAgICAgICAgICAgID0gaC0+cHBzLndlaWdodGVkX2JpcHJlZF9pZGM7CisgICAgcGljX3BhcmFtLT5waWNfZmllbGRzLmJpdHMudHJhbnNmb3JtXzh4OF9tb2RlX2ZsYWcgICAgICAgICAgPSBoLT5wcHMudHJhbnNmb3JtXzh4OF9tb2RlOworICAgIHBpY19wYXJhbS0+cGljX2ZpZWxkcy5iaXRzLmZpZWxkX3BpY19mbGFnICAgICAgICAgICAgICAgICAgID0gaC0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRTsKKyAgICBwaWNfcGFyYW0tPnBpY19maWVsZHMuYml0cy5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgICAgICA9IGgtPnBwcy5jb25zdHJhaW5lZF9pbnRyYV9wcmVkOworICAgIHBpY19wYXJhbS0+cGljX2ZpZWxkcy5iaXRzLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgICAgICAgICAgID0gaC0+cHBzLnBpY19vcmRlcl9wcmVzZW50OworICAgIHBpY19wYXJhbS0+cGljX2ZpZWxkcy5iaXRzLmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnID0gaC0+cHBzLmRlYmxvY2tpbmdfZmlsdGVyX3BhcmFtZXRlcnNfcHJlc2VudDsKKyAgICBwaWNfcGFyYW0tPnBpY19maWVsZHMuYml0cy5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcgICA9IGgtPnBwcy5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50OworICAgIHBpY19wYXJhbS0+cGljX2ZpZWxkcy5iaXRzLnJlZmVyZW5jZV9waWNfZmxhZyAgICAgICAgICAgICAgID0gaC0+bmFsX3JlZl9pZGMgIT0gMDsKKyAgICBwaWNfcGFyYW0tPmZyYW1lX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPmZyYW1lX251bTsKKworICAgIC8qIEZpbGwgaW4gVkFJUU1hdHJpeEJ1ZmZlckgyNjQuICovCisgICAgaXFfbWF0cml4ID0gZmZfdmFhcGlfYWxsb2NfaXFfbWF0cml4KHZhY3R4LCBzaXplb2YoVkFJUU1hdHJpeEJ1ZmZlckgyNjQpKTsKKyAgICBpZiAoIWlxX21hdHJpeCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG1lbWNweShpcV9tYXRyaXgtPlNjYWxpbmdMaXN0NHg0LCBoLT5wcHMuc2NhbGluZ19tYXRyaXg0LCBzaXplb2YoaXFfbWF0cml4LT5TY2FsaW5nTGlzdDR4NCkpOworICAgIG1lbWNweShpcV9tYXRyaXgtPlNjYWxpbmdMaXN0OHg4WzBdLCBoLT5wcHMuc2NhbGluZ19tYXRyaXg4WzBdLCBzaXplb2YoaXFfbWF0cml4LT5TY2FsaW5nTGlzdDh4OFswXSkpOworICAgIG1lbWNweShpcV9tYXRyaXgtPlNjYWxpbmdMaXN0OHg4WzFdLCBoLT5wcHMuc2NhbGluZ19tYXRyaXg4WzNdLCBzaXplb2YoaXFfbWF0cml4LT5TY2FsaW5nTGlzdDh4OFswXSkpOworICAgIHJldHVybiAwOworfQorCisvKiogRW5kIGEgaGFyZHdhcmUgZGVjb2RpbmcgYmFzZWQgZnJhbWUuICovCitzdGF0aWMgaW50IHZhYXBpX2gyNjRfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBzdHJ1Y3QgdmFhcGlfY29udGV4dCAqIGNvbnN0IHZhY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKyAgICBIMjY0Q29udGV4dCAqIGNvbnN0IGggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBhdl9kbG9nKGF2Y3R4LCAidmFhcGlfaDI2NF9lbmRfZnJhbWUoKVxuIik7CisgICAgcmV0ID0gZmZfdmFhcGlfY29tbWl0X3NsaWNlcyh2YWN0eCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmluaXNoOworCisgICAgcmV0ID0gZmZfdmFhcGlfcmVuZGVyX3BpY3R1cmUodmFjdHgsIGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKCZoLT5jdXJfcGljX3B0ci0+ZikpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZpbmlzaDsKKworICAgIGZmX2gyNjRfZHJhd19ob3Jpel9iYW5kKGgsIDAsIGgtPmF2Y3R4LT5oZWlnaHQpOworCitmaW5pc2g6CisgICAgZmZfdmFhcGlfY29tbW9uX2VuZF9mcmFtZShhdmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqIERlY29kZSB0aGUgZ2l2ZW4gSC4yNjQgc2xpY2Ugd2l0aCBWQSBBUEkuICovCitzdGF0aWMgaW50IHZhYXBpX2gyNjRfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHNpemUpCit7CisgICAgSDI2NENvbnRleHQgKiBjb25zdCBoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQVNsaWNlUGFyYW1ldGVyQnVmZmVySDI2NCAqc2xpY2VfcGFyYW07CisKKyAgICBhdl9kbG9nKGF2Y3R4LCAidmFhcGlfaDI2NF9kZWNvZGVfc2xpY2UoKTogYnVmZmVyICVwLCBzaXplICVkXG4iLAorICAgICAgICAgICAgYnVmZmVyLCBzaXplKTsKKworICAgIC8qIEZpbGwgaW4gVkFTbGljZVBhcmFtZXRlckJ1ZmZlckgyNjQuICovCisgICAgc2xpY2VfcGFyYW0gPSAoVkFTbGljZVBhcmFtZXRlckJ1ZmZlckgyNjQgKilmZl92YWFwaV9hbGxvY19zbGljZShhdmN0eC0+aHdhY2NlbF9jb250ZXh0LCBidWZmZXIsIHNpemUpOworICAgIGlmICghc2xpY2VfcGFyYW0pCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzbGljZV9wYXJhbS0+c2xpY2VfZGF0YV9iaXRfb2Zmc2V0ICAgICAgICAgID0gZ2V0X2JpdHNfY291bnQoJmgtPmdiKSArIDg7IC8qIGJpdCBidWZmZXIgc3RhcnRlZCBiZXlvbmQgbmFsX3VuaXRfdHlwZSAqLworICAgIHNsaWNlX3BhcmFtLT5maXJzdF9tYl9pbl9zbGljZSAgICAgICAgICAgICAgPSAoaC0+bWJfeSA+PiBGSUVMRF9PUl9NQkFGRl9QSUNUVVJFKGgpKSAqIGgtPm1iX3dpZHRoICsgaC0+bWJfeDsKKyAgICBzbGljZV9wYXJhbS0+c2xpY2VfdHlwZSAgICAgICAgICAgICAgICAgICAgID0gZmZfaDI2NF9nZXRfc2xpY2VfdHlwZShoKTsKKyAgICBzbGljZV9wYXJhbS0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnICAgID0gaC0+c2xpY2VfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiA/IGgtPmRpcmVjdF9zcGF0aWFsX212X3ByZWQgOiAwOworICAgIHNsaWNlX3BhcmFtLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICAgPSBoLT5saXN0X2NvdW50ID4gMCA/IGgtPnJlZl9jb3VudFswXSAtIDEgOiAwOworICAgIHNsaWNlX3BhcmFtLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICAgPSBoLT5saXN0X2NvdW50ID4gMSA/IGgtPnJlZl9jb3VudFsxXSAtIDEgOiAwOworICAgIHNsaWNlX3BhcmFtLT5jYWJhY19pbml0X2lkYyAgICAgICAgICAgICAgICAgPSBoLT5jYWJhY19pbml0X2lkYzsKKyAgICBzbGljZV9wYXJhbS0+c2xpY2VfcXBfZGVsdGEgICAgICAgICAgICAgICAgID0gaC0+cXNjYWxlIC0gaC0+cHBzLmluaXRfcXA7CisgICAgc2xpY2VfcGFyYW0tPmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjICA9IGgtPmRlYmxvY2tpbmdfZmlsdGVyIDwgMiA/ICFoLT5kZWJsb2NraW5nX2ZpbHRlciA6IGgtPmRlYmxvY2tpbmdfZmlsdGVyOworICAgIHNsaWNlX3BhcmFtLT5zbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiAgICAgPSBoLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQgLyAyOworICAgIHNsaWNlX3BhcmFtLT5zbGljZV9iZXRhX29mZnNldF9kaXYyICAgICAgICAgPSBoLT5zbGljZV9iZXRhX29mZnNldCAgICAgLyAyOworICAgIHNsaWNlX3BhcmFtLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tICAgICAgICAgPSBoLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tOworICAgIHNsaWNlX3BhcmFtLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gICAgICAgPSBoLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub207CisKKyAgICBmaWxsX3ZhYXBpX1JlZlBpY0xpc3Qoc2xpY2VfcGFyYW0tPlJlZlBpY0xpc3QwLCBoLT5yZWZfbGlzdFswXSwgaC0+bGlzdF9jb3VudCA+IDAgPyBoLT5yZWZfY291bnRbMF0gOiAwKTsKKyAgICBmaWxsX3ZhYXBpX1JlZlBpY0xpc3Qoc2xpY2VfcGFyYW0tPlJlZlBpY0xpc3QxLCBoLT5yZWZfbGlzdFsxXSwgaC0+bGlzdF9jb3VudCA+IDEgPyBoLT5yZWZfY291bnRbMV0gOiAwKTsKKworICAgIGZpbGxfdmFhcGlfcGxhaW5fcHJlZF93ZWlnaHRfdGFibGUoaCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGljZV9wYXJhbS0+bHVtYV93ZWlnaHRfbDBfZmxhZywgICBzbGljZV9wYXJhbS0+bHVtYV93ZWlnaHRfbDAsICAgc2xpY2VfcGFyYW0tPmx1bWFfb2Zmc2V0X2wwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsaWNlX3BhcmFtLT5jaHJvbWFfd2VpZ2h0X2wwX2ZsYWcsIHNsaWNlX3BhcmFtLT5jaHJvbWFfd2VpZ2h0X2wwLCBzbGljZV9wYXJhbS0+Y2hyb21hX29mZnNldF9sMCk7CisgICAgZmlsbF92YWFwaV9wbGFpbl9wcmVkX3dlaWdodF90YWJsZShoLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsaWNlX3BhcmFtLT5sdW1hX3dlaWdodF9sMV9mbGFnLCAgIHNsaWNlX3BhcmFtLT5sdW1hX3dlaWdodF9sMSwgICBzbGljZV9wYXJhbS0+bHVtYV9vZmZzZXRfbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xpY2VfcGFyYW0tPmNocm9tYV93ZWlnaHRfbDFfZmxhZywgc2xpY2VfcGFyYW0tPmNocm9tYV93ZWlnaHRfbDEsIHNsaWNlX3BhcmFtLT5jaHJvbWFfb2Zmc2V0X2wxKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZIV0FjY2VsIGZmX2gyNjRfdmFhcGlfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaDI2NF92YWFwaSIsCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9WQUFQSV9WTEQsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gdmFhcGlfaDI2NF9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSB2YWFwaV9oMjY0X2VuZF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSB2YWFwaV9oMjY0X2RlY29kZV9zbGljZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92YWFwaV9pbnRlcm5hbC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmFhcGlfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MThjNzE4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmFhcGlfaW50ZXJuYWwuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogVmlkZW8gQWNjZWxlcmF0aW9uIEFQSSAodmlkZW8gZGVjb2RpbmcpCisgKiBIVyBkZWNvZGUgYWNjZWxlcmF0aW9uIGZvciBNUEVHLTIsIE1QRUctNCwgSC4yNjQgYW5kIFZDLTEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBTcGxpdHRlZC1EZXNrdG9wIFN5c3RlbXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZBQVBJX0lOVEVSTkFMX0gKKyNkZWZpbmUgQVZDT0RFQ19WQUFQSV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDx2YS92YS5oPgorI2luY2x1ZGUgInZhYXBpLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIFZBQVBJX0RlY29kaW5nCisgKgorICogQHsKKyAqLworCisvKiogRXh0cmFjdCBWQVN1cmZhY2VJRCBmcm9tIGFuIEFWRnJhbWUgKi8KK3N0YXRpYyBpbmxpbmUgVkFTdXJmYWNlSUQgZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQoQVZGcmFtZSAqcGljKQoreworICAgIHJldHVybiAodWludHB0cl90KXBpYy0+ZGF0YVszXTsKK30KKworLyoqIENvbW1vbiBBVkhXQWNjZWwuZW5kX2ZyYW1lKCkgaW1wbGVtZW50YXRpb24gKi8KK3ZvaWQgZmZfdmFhcGlfY29tbW9uX2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisvKiogQWxsb2NhdGUgYSBuZXcgcGljdHVyZSBwYXJhbWV0ZXIgYnVmZmVyICovCit2b2lkICpmZl92YWFwaV9hbGxvY19waWNfcGFyYW0oc3RydWN0IHZhYXBpX2NvbnRleHQgKnZhY3R4LCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKy8qKiBBbGxvY2F0ZSBhIG5ldyBJUSBtYXRyaXggYnVmZmVyICovCit2b2lkICpmZl92YWFwaV9hbGxvY19pcV9tYXRyaXgoc3RydWN0IHZhYXBpX2NvbnRleHQgKnZhY3R4LCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKy8qKiBBbGxvY2F0ZSBhIG5ldyBiaXQtcGxhbmUgYnVmZmVyICovCit1aW50OF90ICpmZl92YWFwaV9hbGxvY19iaXRwbGFuZShzdHJ1Y3QgdmFhcGlfY29udGV4dCAqdmFjdHgsIHVpbnQzMl90IHNpemUpOworCisvKioKKyAqIEFsbG9jYXRlIGEgbmV3IHNsaWNlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbnB1dCBzbGljZS4KKyAqCisgKiBAcGFyYW0gdmFjdHggdGhlIFZBIEFQSSBjb250ZXh0CisgKiBAcGFyYW0gYnVmZmVyIHRoZSBzbGljZSBkYXRhIGJ1ZmZlciBiYXNlCisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgc2xpY2UgaW4gYnl0ZXMKKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBzbGljZSBwYXJhbWV0ZXIKKyAqLworVkFTbGljZVBhcmFtZXRlckJ1ZmZlckJhc2UgKmZmX3ZhYXBpX2FsbG9jX3NsaWNlKHN0cnVjdCB2YWFwaV9jb250ZXh0ICp2YWN0eCwgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBzaXplKTsKKworaW50IGZmX3ZhYXBpX21wZWdfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CitpbnQgZmZfdmFhcGlfY29tbWl0X3NsaWNlcyhzdHJ1Y3QgdmFhcGlfY29udGV4dCAqdmFjdHgpOworaW50IGZmX3ZhYXBpX3JlbmRlcl9waWN0dXJlKHN0cnVjdCB2YWFwaV9jb250ZXh0ICp2YWN0eCwgVkFTdXJmYWNlSUQgc3VyZmFjZSk7CisKKy8qIEB9ICovCisKKyNlbmRpZiAvKiBBVkNPREVDX1ZBQVBJX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZhYXBpX21wZWcuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZhYXBpX21wZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg3OWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmFhcGlfbXBlZy5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBWaWRlbyBBY2NlbGVyYXRpb24gQVBJICh2aWRlbyBkZWNvZGluZykKKyAqIEhXIGRlY29kZSBhY2NlbGVyYXRpb24gZm9yIE1QRUctMiwgTVBFRy00LCBILjI2NCBhbmQgVkMtMQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBbnRvbiBLaGlybm92CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAidmFhcGlfaW50ZXJuYWwuaCIKKworaW50IGZmX3ZhYXBpX21wZWdfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBzdHJ1Y3QgdmFhcGlfY29udGV4dCAqIGNvbnN0IHZhY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX3ZhYXBpX2NvbW1pdF9zbGljZXModmFjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZpbmlzaDsKKworICAgIHJldCA9IGZmX3ZhYXBpX3JlbmRlcl9waWN0dXJlKHZhY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYpKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmaW5pc2g7CisKKyAgICBmZl9tcGVnX2RyYXdfaG9yaXpfYmFuZChzLCAwLCBzLT5hdmN0eC0+aGVpZ2h0KTsKKworZmluaXNoOgorICAgIGZmX3ZhYXBpX2NvbW1vbl9lbmRfZnJhbWUoYXZjdHgpOworICAgIHJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZhYXBpX21wZWcyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92YWFwaV9tcGVnMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOTA1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92YWFwaV9tcGVnMi5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogTVBFRy0yIEhXIGRlY29kZSBhY2NlbGVyYXRpb24gdGhyb3VnaCBWQSBBUEkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBTcGxpdHRlZC1EZXNrdG9wIFN5c3RlbXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgIm1wZWd1dGlscy5oIgorI2luY2x1ZGUgInZhYXBpX2ludGVybmFsLmgiCisKKy8qKiBSZWNvbnN0cnVjdCBiaXRzdHJlYW0gZl9jb2RlICovCitzdGF0aWMgaW5saW5lIGludCBtcGVnMl9nZXRfZl9jb2RlKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIHJldHVybiAocy0+bXBlZ19mX2NvZGVbMF1bMF0gPDwgMTIpIHwgKHMtPm1wZWdfZl9jb2RlWzBdWzFdIDw8IDgpIHwKKyAgICAgICAgICAgKHMtPm1wZWdfZl9jb2RlWzFdWzBdIDw8ICA0KSB8ICBzLT5tcGVnX2ZfY29kZVsxXVsxXTsKK30KKworLyoqIERldGVybWluZSBmcmFtZSBzdGFydDogZmlyc3QgZmllbGQgZm9yIGZpZWxkIHBpY3R1cmUgb3IgZnJhbWUgcGljdHVyZSAqLworc3RhdGljIGlubGluZSBpbnQgbXBlZzJfZ2V0X2lzX2ZyYW1lX3N0YXJ0KE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIHJldHVybiBzLT5maXJzdF9maWVsZCB8fCBzLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FOworfQorCitzdGF0aWMgaW50IHZhYXBpX21wZWcyX3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgYXZfdW51c2VkIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgYXZfdW51c2VkIHVpbnQzMl90IHNpemUpCit7CisgICAgc3RydWN0IE1wZWdFbmNDb250ZXh0ICogY29uc3QgcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IHZhYXBpX2NvbnRleHQgKiBjb25zdCB2YWN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyTVBFRzIgKnBpY19wYXJhbTsKKyAgICBWQUlRTWF0cml4QnVmZmVyTVBFRzIgKmlxX21hdHJpeDsKKyAgICBpbnQgaTsKKworICAgIGF2X2Rsb2coYXZjdHgsICJ2YWFwaV9tcGVnMl9zdGFydF9mcmFtZSgpXG4iKTsKKworICAgIHZhY3R4LT5zbGljZV9wYXJhbV9zaXplID0gc2l6ZW9mKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJNUEVHMik7CisKKyAgICAvKiBGaWxsIGluIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUcyICovCisgICAgcGljX3BhcmFtID0gZmZfdmFhcGlfYWxsb2NfcGljX3BhcmFtKHZhY3R4LCBzaXplb2YoVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyTVBFRzIpKTsKKyAgICBpZiAoIXBpY19wYXJhbSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHBpY19wYXJhbS0+aG9yaXpvbnRhbF9zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+d2lkdGg7CisgICAgcGljX3BhcmFtLT52ZXJ0aWNhbF9zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5oZWlnaHQ7CisgICAgcGljX3BhcmFtLT5mb3J3YXJkX3JlZmVyZW5jZV9waWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgPSBWQV9JTlZBTElEX0lEOworICAgIHBpY19wYXJhbS0+YmFja3dhcmRfcmVmZXJlbmNlX3BpY3R1cmUgICAgICAgICAgICAgICAgICAgICAgID0gVkFfSU5WQUxJRF9JRDsKKyAgICBwaWNfcGFyYW0tPnBpY3R1cmVfY29kaW5nX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPnBpY3RfdHlwZTsKKyAgICBwaWNfcGFyYW0tPmZfY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG1wZWcyX2dldF9mX2NvZGUocyk7CisgICAgcGljX3BhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24udmFsdWUgICAgICAgICAgICAgICAgICAgPSAwOyAvKiByZXNldCBhbGwgYml0cyAqLworICAgIHBpY19wYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuaW50cmFfZGNfcHJlY2lzaW9uID0gcy0+aW50cmFfZGNfcHJlY2lzaW9uOworICAgIHBpY19wYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucGljdHVyZV9zdHJ1Y3R1cmUgID0gcy0+cGljdHVyZV9zdHJ1Y3R1cmU7CisgICAgcGljX3BhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy50b3BfZmllbGRfZmlyc3QgICAgPSBzLT50b3BfZmllbGRfZmlyc3Q7CisgICAgcGljX3BhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5mcmFtZV9wcmVkX2ZyYW1lX2RjdCA9IHMtPmZyYW1lX3ByZWRfZnJhbWVfZGN0OworICAgIHBpY19wYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuY29uY2VhbG1lbnRfbW90aW9uX3ZlY3RvcnMgPSBzLT5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9yczsKKyAgICBwaWNfcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLnFfc2NhbGVfdHlwZSAgICAgICA9IHMtPnFfc2NhbGVfdHlwZTsKKyAgICBwaWNfcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLmludHJhX3ZsY19mb3JtYXQgICA9IHMtPmludHJhX3ZsY19mb3JtYXQ7CisgICAgcGljX3BhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5hbHRlcm5hdGVfc2NhbiAgICAgPSBzLT5hbHRlcm5hdGVfc2NhbjsKKyAgICBwaWNfcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLnJlcGVhdF9maXJzdF9maWVsZCA9IHMtPnJlcGVhdF9maXJzdF9maWVsZDsKKyAgICBwaWNfcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLnByb2dyZXNzaXZlX2ZyYW1lICA9IHMtPnByb2dyZXNzaXZlX2ZyYW1lOworICAgIHBpY19wYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuaXNfZmlyc3RfZmllbGQgICAgID0gbXBlZzJfZ2V0X2lzX2ZyYW1lX3N0YXJ0KHMpOworCisgICAgc3dpdGNoIChzLT5waWN0X3R5cGUpIHsKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9COgorICAgICAgICBwaWNfcGFyYW0tPmJhY2t3YXJkX3JlZmVyZW5jZV9waWN0dXJlID0gZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQocy0+bmV4dF9waWN0dXJlLmYpOworICAgICAgICAvLyBmYWxsLXRocm91Z2gKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9QOgorICAgICAgICBwaWNfcGFyYW0tPmZvcndhcmRfcmVmZXJlbmNlX3BpY3R1cmUgPSBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZChzLT5sYXN0X3BpY3R1cmUuZik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIEZpbGwgaW4gVkFJUU1hdHJpeEJ1ZmZlck1QRUcyICovCisgICAgaXFfbWF0cml4ID0gZmZfdmFhcGlfYWxsb2NfaXFfbWF0cml4KHZhY3R4LCBzaXplb2YoVkFJUU1hdHJpeEJ1ZmZlck1QRUcyKSk7CisgICAgaWYgKCFpcV9tYXRyaXgpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpcV9tYXRyaXgtPmxvYWRfaW50cmFfcXVhbnRpc2VyX21hdHJpeCAgICAgICAgICAgICAgPSAxOworICAgIGlxX21hdHJpeC0+bG9hZF9ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeCAgICAgICAgICA9IDE7CisgICAgaXFfbWF0cml4LT5sb2FkX2Nocm9tYV9pbnRyYV9xdWFudGlzZXJfbWF0cml4ICAgICAgID0gMTsKKyAgICBpcV9tYXRyaXgtPmxvYWRfY2hyb21hX25vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4ICAgPSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgaW50IG4gPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25bZmZfemlnemFnX2RpcmVjdFtpXV07CisgICAgICAgIGlxX21hdHJpeC0+aW50cmFfcXVhbnRpc2VyX21hdHJpeFtpXSAgICAgICAgICAgID0gcy0+aW50cmFfbWF0cml4W25dOworICAgICAgICBpcV9tYXRyaXgtPm5vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4W2ldICAgICAgICA9IHMtPmludGVyX21hdHJpeFtuXTsKKyAgICAgICAgaXFfbWF0cml4LT5jaHJvbWFfaW50cmFfcXVhbnRpc2VyX21hdHJpeFtpXSAgICAgPSBzLT5jaHJvbWFfaW50cmFfbWF0cml4W25dOworICAgICAgICBpcV9tYXRyaXgtPmNocm9tYV9ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeFtpXSA9IHMtPmNocm9tYV9pbnRlcl9tYXRyaXhbbl07CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhYXBpX21wZWcyX2RlY29kZV9zbGljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqc2xpY2VfcGFyYW07CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICB1aW50MzJfdCBxdWFudGlzZXJfc2NhbGVfY29kZSwgaW50cmFfc2xpY2VfZmxhZywgbWFjcm9ibG9ja19vZmZzZXQ7CisKKyAgICBhdl9kbG9nKGF2Y3R4LCAidmFhcGlfbXBlZzJfZGVjb2RlX3NsaWNlKCk6IGJ1ZmZlciAlcCwgc2l6ZSAlZFxuIiwgYnVmZmVyLCBzaXplKTsKKworICAgIC8qIERldGVybWluZSBtYWNyb2Jsb2NrX29mZnNldCAqLworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWZmZXIsIDggKiBzaXplKTsKKyAgICBpZiAoZ2V0X2JpdHNfbG9uZygmZ2IsIDMyKSA+PiA4ICE9IDEpIC8qIHN0YXJ0IGNvZGUgKi8KKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgcXVhbnRpc2VyX3NjYWxlX2NvZGUgPSBnZXRfYml0cygmZ2IsIDUpOworICAgIGludHJhX3NsaWNlX2ZsYWcgPSBnZXRfYml0czEoJmdiKTsKKyAgICBpZiAoaW50cmFfc2xpY2VfZmxhZykgeworICAgICAgICBza2lwX2JpdHMoJmdiLCA4KTsKKyAgICAgICAgaWYgKHNraXBfMXN0b3BfOGRhdGFfYml0cygmZ2IpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBtYWNyb2Jsb2NrX29mZnNldCA9IGdldF9iaXRzX2NvdW50KCZnYik7CisKKyAgICAvKiBGaWxsIGluIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqLworICAgIHNsaWNlX3BhcmFtID0gKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqKWZmX3ZhYXBpX2FsbG9jX3NsaWNlKGF2Y3R4LT5od2FjY2VsX2NvbnRleHQsIGJ1ZmZlciwgc2l6ZSk7CisgICAgaWYgKCFzbGljZV9wYXJhbSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNsaWNlX3BhcmFtLT5tYWNyb2Jsb2NrX29mZnNldCAgICAgICAgICAgICAgPSBtYWNyb2Jsb2NrX29mZnNldDsKKyAgICBzbGljZV9wYXJhbS0+c2xpY2VfaG9yaXpvbnRhbF9wb3NpdGlvbiAgICAgID0gcy0+bWJfeDsKKyAgICBzbGljZV9wYXJhbS0+c2xpY2VfdmVydGljYWxfcG9zaXRpb24gICAgICAgID0gcy0+bWJfeSA+PiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRSk7CisgICAgc2xpY2VfcGFyYW0tPnF1YW50aXNlcl9zY2FsZV9jb2RlICAgICAgICAgICA9IHF1YW50aXNlcl9zY2FsZV9jb2RlOworICAgIHNsaWNlX3BhcmFtLT5pbnRyYV9zbGljZV9mbGFnICAgICAgICAgICAgICAgPSBpbnRyYV9zbGljZV9mbGFnOworICAgIHJldHVybiAwOworfQorCitBVkhXQWNjZWwgZmZfbXBlZzJfdmFhcGlfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzJfdmFhcGkiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfVkFBUElfVkxELAorICAgIC5zdGFydF9mcmFtZSAgICA9IHZhYXBpX21wZWcyX3N0YXJ0X2ZyYW1lLAorICAgIC5lbmRfZnJhbWUgICAgICA9IGZmX3ZhYXBpX21wZWdfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICA9IHZhYXBpX21wZWcyX2RlY29kZV9zbGljZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92YWFwaV9tcGVnNC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmFhcGlfbXBlZzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzU1NmFmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmFhcGlfbXBlZzQuYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIE1QRUctNCAvIEguMjYzIEhXIGRlY29kZSBhY2NlbGVyYXRpb24gdGhyb3VnaCBWQSBBUEkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBTcGxpdHRlZC1EZXNrdG9wIFN5c3RlbXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInZhYXBpX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaDI2My5oIgorI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKKworLyoqIFJlY29uc3RydWN0IGJpdHN0cmVhbSBpbnRyYV9kY192bGNfdGhyICovCitzdGF0aWMgaW50IG1wZWc0X2dldF9pbnRyYV9kY192bGNfdGhyKE1wZWc0RGVjQ29udGV4dCAqcykKK3sKKyAgICBzd2l0Y2ggKHMtPmludHJhX2RjX3RocmVzaG9sZCkgeworICAgIGNhc2UgOTk6IHJldHVybiAwOworICAgIGNhc2UgMTM6IHJldHVybiAxOworICAgIGNhc2UgMTU6IHJldHVybiAyOworICAgIGNhc2UgMTc6IHJldHVybiAzOworICAgIGNhc2UgMTk6IHJldHVybiA0OworICAgIGNhc2UgMjE6IHJldHVybiA1OworICAgIGNhc2UgMjM6IHJldHVybiA2OworICAgIGNhc2UgMDogIHJldHVybiA3OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWFwaV9tcGVnNF9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGF2X3VudXNlZCBjb25zdCB1aW50OF90ICpidWZmZXIsIGF2X3VudXNlZCB1aW50MzJfdCBzaXplKQoreworICAgIE1wZWc0RGVjQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHMgPSAmY3R4LT5tOworICAgIHN0cnVjdCB2YWFwaV9jb250ZXh0ICogY29uc3QgdmFjdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUc0ICpwaWNfcGFyYW07CisgICAgVkFJUU1hdHJpeEJ1ZmZlck1QRUc0ICppcV9tYXRyaXg7CisgICAgaW50IGk7CisKKyAgICBhdl9kbG9nKGF2Y3R4LCAidmFhcGlfbXBlZzRfc3RhcnRfZnJhbWUoKVxuIik7CisKKyAgICB2YWN0eC0+c2xpY2VfcGFyYW1fc2l6ZSA9IHNpemVvZihWQVNsaWNlUGFyYW1ldGVyQnVmZmVyTVBFRzQpOworCisgICAgLyogRmlsbCBpbiBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHNCAqLworICAgIHBpY19wYXJhbSA9IGZmX3ZhYXBpX2FsbG9jX3BpY19wYXJhbSh2YWN0eCwgc2l6ZW9mKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUc0KSk7CisgICAgaWYgKCFwaWNfcGFyYW0pCisgICAgICAgIHJldHVybiAtMTsKKyAgICBwaWNfcGFyYW0tPnZvcF93aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT53aWR0aDsKKyAgICBwaWNfcGFyYW0tPnZvcF9oZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5oZWlnaHQ7CisgICAgcGljX3BhcmFtLT5mb3J3YXJkX3JlZmVyZW5jZV9waWN0dXJlICAgICAgICAgICAgICAgID0gVkFfSU5WQUxJRF9JRDsKKyAgICBwaWNfcGFyYW0tPmJhY2t3YXJkX3JlZmVyZW5jZV9waWN0dXJlICAgICAgICAgICAgICAgPSBWQV9JTlZBTElEX0lEOworICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCisgICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMuc2hvcnRfdmlkZW9faGVhZGVyICAgICAgID0gYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjYzOworICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy5iaXRzLmNocm9tYV9mb3JtYXQgICAgICAgICAgICA9IENIUk9NQV80MjA7CisgICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMuaW50ZXJsYWNlZCAgICAgICAgICAgICAgID0gIXMtPnByb2dyZXNzaXZlX3NlcXVlbmNlOworICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy5iaXRzLm9ibWNfZGlzYWJsZSAgICAgICAgICAgICA9IDE7CisgICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMuc3ByaXRlX2VuYWJsZSAgICAgICAgICAgID0gY3R4LT52b2xfc3ByaXRlX3VzYWdlOworICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy5iaXRzLnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5ICA9IHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5OworICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy5iaXRzLnF1YW50X3R5cGUgICAgICAgICAgICAgICA9IHMtPm1wZWdfcXVhbnQ7CisgICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMucXVhcnRlcl9zYW1wbGUgICAgICAgICAgID0gcy0+cXVhcnRlcl9zYW1wbGU7CisgICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMuZGF0YV9wYXJ0aXRpb25lZCAgICAgICAgID0gcy0+ZGF0YV9wYXJ0aXRpb25pbmc7CisgICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMucmV2ZXJzaWJsZV92bGMgICAgICAgICAgID0gY3R4LT5ydmxjOworICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy5iaXRzLnJlc3luY19tYXJrZXJfZGlzYWJsZSAgICA9ICFjdHgtPnJlc3luY19tYXJrZXI7CisgICAgcGljX3BhcmFtLT5ub19vZl9zcHJpdGVfd2FycGluZ19wb2ludHMgICAgICAgICAgICAgID0gY3R4LT5udW1fc3ByaXRlX3dhcnBpbmdfcG9pbnRzOworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm51bV9zcHJpdGVfd2FycGluZ19wb2ludHMgJiYgaSA8IDM7IGkrKykgeworICAgICAgICBwaWNfcGFyYW0tPnNwcml0ZV90cmFqZWN0b3J5X2R1W2ldICAgICAgICAgICAgICA9IGN0eC0+c3ByaXRlX3RyYWpbaV1bMF07CisgICAgICAgIHBpY19wYXJhbS0+c3ByaXRlX3RyYWplY3RvcnlfZHZbaV0gICAgICAgICAgICAgID0gY3R4LT5zcHJpdGVfdHJhaltpXVsxXTsKKyAgICB9CisgICAgcGljX3BhcmFtLT5xdWFudF9wcmVjaXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cXVhbnRfcHJlY2lzaW9uOworICAgIHBpY19wYXJhbS0+dm9wX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCisgICAgcGljX3BhcmFtLT52b3BfZmllbGRzLmJpdHMudm9wX2NvZGluZ190eXBlICAgICAgICAgID0gcy0+cGljdF90eXBlIC0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcGljX3BhcmFtLT52b3BfZmllbGRzLmJpdHMuYmFja3dhcmRfcmVmZXJlbmNlX3ZvcF9jb2RpbmdfdHlwZSA9IHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiA/IHMtPm5leHRfcGljdHVyZS5mLT5waWN0X3R5cGUgLSBBVl9QSUNUVVJFX1RZUEVfSSA6IDA7CisgICAgcGljX3BhcmFtLT52b3BfZmllbGRzLmJpdHMudm9wX3JvdW5kaW5nX3R5cGUgICAgICAgID0gcy0+bm9fcm91bmRpbmc7CisgICAgcGljX3BhcmFtLT52b3BfZmllbGRzLmJpdHMuaW50cmFfZGNfdmxjX3RociAgICAgICAgID0gbXBlZzRfZ2V0X2ludHJhX2RjX3ZsY190aHIoY3R4KTsKKyAgICBwaWNfcGFyYW0tPnZvcF9maWVsZHMuYml0cy50b3BfZmllbGRfZmlyc3QgICAgICAgICAgPSBzLT50b3BfZmllbGRfZmlyc3Q7CisgICAgcGljX3BhcmFtLT52b3BfZmllbGRzLmJpdHMuYWx0ZXJuYXRlX3ZlcnRpY2FsX3NjYW5fZmxhZyA9IHMtPmFsdGVybmF0ZV9zY2FuOworICAgIHBpY19wYXJhbS0+dm9wX2Zjb2RlX2ZvcndhcmQgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPmZfY29kZTsKKyAgICBwaWNfcGFyYW0tPnZvcF9mY29kZV9iYWNrd2FyZCAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5iX2NvZGU7CisgICAgcGljX3BhcmFtLT52b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiAgICAgICAgICAgID0gYXZjdHgtPmZyYW1lcmF0ZS5udW07CisgICAgcGljX3BhcmFtLT5udW1fbWFjcm9ibG9ja3NfaW5fZ29iICAgICAgICAgICAgICAgICAgID0gcy0+bWJfd2lkdGggKiBmZl9oMjYzX2dldF9nb2JfaGVpZ2h0KHMpOworICAgIHBpY19wYXJhbS0+bnVtX2dvYnNfaW5fdm9wICAgICAgICAgICAgICAgICAgICAgICAgICA9IChzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodCkgLyBwaWNfcGFyYW0tPm51bV9tYWNyb2Jsb2Nrc19pbl9nb2I7CisgICAgcGljX3BhcmFtLT5UUkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cGJfdGltZTsKKyAgICBwaWNfcGFyYW0tPlRSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5wcF90aW1lOworCisgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgcGljX3BhcmFtLT5iYWNrd2FyZF9yZWZlcmVuY2VfcGljdHVyZSA9IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKHMtPm5leHRfcGljdHVyZS5mKTsKKyAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JKQorICAgICAgICBwaWNfcGFyYW0tPmZvcndhcmRfcmVmZXJlbmNlX3BpY3R1cmUgID0gZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQocy0+bGFzdF9waWN0dXJlLmYpOworCisgICAgLyogRmlsbCBpbiBWQUlRTWF0cml4QnVmZmVyTVBFRzQgKi8KKyAgICAvKiBPbmx5IHRoZSBmaXJzdCBpbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgdXNlcyB0aGUgd2VpZ2h0aW5nIG1hdHJpY2VzICovCisgICAgaWYgKHBpY19wYXJhbS0+dm9sX2ZpZWxkcy5iaXRzLnF1YW50X3R5cGUpIHsKKyAgICAgICAgaXFfbWF0cml4ID0gZmZfdmFhcGlfYWxsb2NfaXFfbWF0cml4KHZhY3R4LCBzaXplb2YoVkFJUU1hdHJpeEJ1ZmZlck1QRUc0KSk7CisgICAgICAgIGlmICghaXFfbWF0cml4KQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpcV9tYXRyaXgtPmxvYWRfaW50cmFfcXVhbnRfbWF0ICAgICAgICAgPSAxOworICAgICAgICBpcV9tYXRyaXgtPmxvYWRfbm9uX2ludHJhX3F1YW50X21hdCAgICAgPSAxOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbiA9IHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltmZl96aWd6YWdfZGlyZWN0W2ldXTsKKyAgICAgICAgICAgIGlxX21hdHJpeC0+aW50cmFfcXVhbnRfbWF0W2ldICAgICAgID0gcy0+aW50cmFfbWF0cml4W25dOworICAgICAgICAgICAgaXFfbWF0cml4LT5ub25faW50cmFfcXVhbnRfbWF0W2ldICAgPSBzLT5pbnRlcl9tYXRyaXhbbl07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfbXBlZzRfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQoreworICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3QgcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFTbGljZVBhcmFtZXRlckJ1ZmZlck1QRUc0ICpzbGljZV9wYXJhbTsKKworICAgIGF2X2Rsb2coYXZjdHgsICJ2YWFwaV9tcGVnNF9kZWNvZGVfc2xpY2UoKTogYnVmZmVyICVwLCBzaXplICVkXG4iLCBidWZmZXIsIHNpemUpOworCisgICAgLyogRmlsbCBpbiBWQVNsaWNlUGFyYW1ldGVyQnVmZmVyTVBFRzQgKi8KKyAgICBzbGljZV9wYXJhbSA9IChWQVNsaWNlUGFyYW1ldGVyQnVmZmVyTVBFRzQgKilmZl92YWFwaV9hbGxvY19zbGljZShhdmN0eC0+aHdhY2NlbF9jb250ZXh0LCBidWZmZXIsIHNpemUpOworICAgIGlmICghc2xpY2VfcGFyYW0pCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzbGljZV9wYXJhbS0+bWFjcm9ibG9ja19vZmZzZXQgICAgICA9IGdldF9iaXRzX2NvdW50KCZzLT5nYikgJSA4OworICAgIHNsaWNlX3BhcmFtLT5tYWNyb2Jsb2NrX251bWJlciAgICAgID0gMDsKKyAgICBzbGljZV9wYXJhbS0+cXVhbnRfc2NhbGUgICAgICAgICAgICA9IHMtPnFzY2FsZTsKKworICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX01QRUc0X1ZBQVBJX0hXQUNDRUwKK0FWSFdBY2NlbCBmZl9tcGVnNF92YWFwaV9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVnNF92YWFwaSIsCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfVkFBUElfVkxELAorICAgIC5zdGFydF9mcmFtZSAgICA9IHZhYXBpX21wZWc0X3N0YXJ0X2ZyYW1lLAorICAgIC5lbmRfZnJhbWUgICAgICA9IGZmX3ZhYXBpX21wZWdfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICA9IHZhYXBpX21wZWc0X2RlY29kZV9zbGljZSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19IMjYzX1ZBQVBJX0hXQUNDRUwKK0FWSFdBY2NlbCBmZl9oMjYzX3ZhYXBpX2h3YWNjZWwgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImgyNjNfdmFhcGkiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYzLAorICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfVkFBUElfVkxELAorICAgIC5zdGFydF9mcmFtZSAgICA9IHZhYXBpX21wZWc0X3N0YXJ0X2ZyYW1lLAorICAgIC5lbmRfZnJhbWUgICAgICA9IGZmX3ZhYXBpX21wZWdfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICA9IHZhYXBpX21wZWc0X2RlY29kZV9zbGljZSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZhYXBpX3ZjMS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmFhcGlfdmMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhNDZkMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZhYXBpX3ZjMS5jCkBAIC0wLDAgKzEsMzU2IEBACisvKgorICogVkMtMSBIVyBkZWNvZGUgYWNjZWxlcmF0aW9uIHRocm91Z2ggVkEgQVBJCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgU3BsaXR0ZWQtRGVza3RvcCBTeXN0ZW1zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ2YWFwaV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInZjMS5oIgorI2luY2x1ZGUgInZjMWRhdGEuaCIKKworLyoqIFRyYW5zbGF0ZSBGRm1wZWcgTVYgbW9kZXMgdG8gVkEgQVBJICovCitzdGF0aWMgaW50IGdldF9WQU12TW9kZVZDMShlbnVtIE1WTW9kZXMgbXZfbW9kZSkKK3sKKyAgICBzd2l0Y2ggKG12X21vZGUpIHsKKyAgICBjYXNlIE1WX1BNT0RFXzFNVl9IUEVMX0JJTElOOiByZXR1cm4gVkFNdk1vZGUxTXZIYWxmUGVsQmlsaW5lYXI7CisgICAgY2FzZSBNVl9QTU9ERV8xTVY6ICAgICAgICAgICAgcmV0dXJuIFZBTXZNb2RlMU12OworICAgIGNhc2UgTVZfUE1PREVfMU1WX0hQRUw6ICAgICAgIHJldHVybiBWQU12TW9kZTFNdkhhbGZQZWw7CisgICAgY2FzZSBNVl9QTU9ERV9NSVhFRF9NVjogICAgICAgcmV0dXJuIFZBTXZNb2RlTWl4ZWRNdjsKKyAgICBjYXNlIE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QOiByZXR1cm4gVkFNdk1vZGVJbnRlbnNpdHlDb21wZW5zYXRpb247CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiogQ2hlY2sgd2hldGhlciB0aGUgTVZUWVBFTUIgYml0cGxhbmUgaXMgcHJlc2VudCAqLworc3RhdGljIGlubGluZSBpbnQgdmMxX2hhc19NVlRZUEVNQl9iaXRwbGFuZShWQzFDb250ZXh0ICp2KQoreworICAgIGlmICh2LT5tdl90eXBlX2lzX3JhdykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QICYmCisgICAgICAgICAgICh2LT5tdl9tb2RlID09IE1WX1BNT0RFX01JWEVEX01WIHx8CisgICAgICAgICAgICAodi0+bXZfbW9kZSA9PSBNVl9QTU9ERV9JTlRFTlNJVFlfQ09NUCAmJgorICAgICAgICAgICAgIHYtPm12X21vZGUyID09IE1WX1BNT0RFX01JWEVEX01WKSk7Cit9CisKKy8qKiBDaGVjayB3aGV0aGVyIHRoZSBTS0lQTUIgYml0cGxhbmUgaXMgcHJlc2VudCAqLworc3RhdGljIGlubGluZSBpbnQgdmMxX2hhc19TS0lQTUJfYml0cGxhbmUoVkMxQ29udGV4dCAqdikKK3sKKyAgICBpZiAodi0+c2tpcF9pc19yYXcpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiB2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCB8fAorICAgICAgICAgICAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgIXYtPmJpX3R5cGUpOworfQorCisvKiogQ2hlY2sgd2hldGhlciB0aGUgRElSRUNUTUIgYml0cGxhbmUgaXMgcHJlc2VudCAqLworc3RhdGljIGlubGluZSBpbnQgdmMxX2hhc19ESVJFQ1RNQl9iaXRwbGFuZShWQzFDb250ZXh0ICp2KQoreworICAgIGlmICh2LT5kbWJfaXNfcmF3KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gdi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgIXYtPmJpX3R5cGU7Cit9CisKKy8qKiBDaGVjayB3aGV0aGVyIHRoZSBBQ1BSRUQgYml0cGxhbmUgaXMgcHJlc2VudCAqLworc3RhdGljIGlubGluZSBpbnQgdmMxX2hhc19BQ1BSRURfYml0cGxhbmUoVkMxQ29udGV4dCAqdikKK3sKKyAgICBpZiAodi0+YWNwcmVkX2lzX3JhdykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHYtPnByb2ZpbGUgPT0gUFJPRklMRV9BRFZBTkNFRCAmJgorICAgICAgICAgICAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgfHwKKyAgICAgICAgICAgICh2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiB2LT5iaV90eXBlKSk7Cit9CisKKy8qKiBDaGVjayB3aGV0aGVyIHRoZSBPVkVSRkxBR1MgYml0cGxhbmUgaXMgcHJlc2VudCAqLworc3RhdGljIGlubGluZSBpbnQgdmMxX2hhc19PVkVSRkxBR1NfYml0cGxhbmUoVkMxQ29udGV4dCAqdikKK3sKKyAgICBpZiAodi0+b3ZlcmZsZ19pc19yYXcpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiB2LT5wcm9maWxlID09IFBST0ZJTEVfQURWQU5DRUQgJiYKKyAgICAgICAgICAgKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JIHx8CisgICAgICAgICAgICAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgdi0+YmlfdHlwZSkpICYmCisgICAgICAgICAgICh2LT5vdmVybGFwICYmIHYtPnBxIDw9IDgpICYmCisgICAgICAgICAgIHYtPmNvbmRvdmVyID09IENPTkRPVkVSX1NFTEVDVDsKK30KKworLyoqIFJlY29uc3RydWN0IGJpdHN0cmVhbSBQVFlQRSAoNy4xLjEuNCwgaW5kZXggaW50byBUYWJsZS0zNSkgKi8KK3N0YXRpYyBpbnQgdmMxX2dldF9QVFlQRShWQzFDb250ZXh0ICp2KQoreworICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3QgcyA9ICZ2LT5zOworICAgIHN3aXRjaCAocy0+cGljdF90eXBlKSB7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfSTogcmV0dXJuIDA7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfUDogcmV0dXJuIHYtPnBfZnJhbWVfc2tpcHBlZCA/IDQgOiAxOworICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX0I6IHJldHVybiB2LT5iaV90eXBlICAgICAgICAgPyAzIDogMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBSZWNvbnN0cnVjdCBiaXRzdHJlYW0gTVZNT0RFICg3LjEuMS4zMikgKi8KK3N0YXRpYyBpbmxpbmUgVkFNdk1vZGVWQzEgdmMxX2dldF9NVk1PREUoVkMxQ29udGV4dCAqdikKK3sKKyAgICBpZiAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AgfHwKKyAgICAgICAgKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmICF2LT5iaV90eXBlKSkKKyAgICAgICAgcmV0dXJuIGdldF9WQU12TW9kZVZDMSh2LT5tdl9tb2RlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqIFJlY29uc3RydWN0IGJpdHN0cmVhbSBNVk1PREUyICg3LjEuMS4zMykgKi8KK3N0YXRpYyBpbmxpbmUgVkFNdk1vZGVWQzEgdmMxX2dldF9NVk1PREUyKFZDMUNvbnRleHQgKnYpCit7CisgICAgaWYgKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QICYmIHYtPm12X21vZGUgPT0gTVZfUE1PREVfSU5URU5TSVRZX0NPTVApCisgICAgICAgIHJldHVybiBnZXRfVkFNdk1vZGVWQzEodi0+bXZfbW9kZTIpOworICAgIHJldHVybiAwOworfQorCisvKiogUmVjb25zdHJ1Y3QgYml0c3RyZWFtIFRURlJNICg3LjEuMS40MSwgVGFibGUtNTMpICovCitzdGF0aWMgaW5saW5lIGludCB2YzFfZ2V0X1RURlJNKFZDMUNvbnRleHQgKnYpCit7CisgICAgc3dpdGNoICh2LT50dGZybSkgeworICAgIGNhc2UgVFRfOFg4OiByZXR1cm4gMDsKKyAgICBjYXNlIFRUXzhYNDogcmV0dXJuIDE7CisgICAgY2FzZSBUVF80WDg6IHJldHVybiAyOworICAgIGNhc2UgVFRfNFg0OiByZXR1cm4gMzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBQYWNrIEZGbXBlZyBiaXRwbGFuZXMgaW50byBhIFZBQml0UGxhbmVCdWZmZXIgZWxlbWVudCAqLworc3RhdGljIGlubGluZSB2b2lkIHZjMV9wYWNrX2JpdHBsYW5lcyh1aW50OF90ICpiaXRwbGFuZSwgaW50IG4sIGNvbnN0IHVpbnQ4X3QgKmZmX2JwWzNdLCBpbnQgeCwgaW50IHksIGludCBzdHJpZGUpCit7CisgICAgY29uc3QgaW50IGJpdHBsYW5lX2luZGV4ID0gbiAvIDI7CisgICAgY29uc3QgaW50IGZmX2JwX2luZGV4ID0geSAqIHN0cmlkZSArIHg7CisgICAgdWludDhfdCB2ID0gMDsKKyAgICBpZiAoZmZfYnBbMF0pCisgICAgICAgIHYgPSBmZl9icFswXVtmZl9icF9pbmRleF07CisgICAgaWYgKGZmX2JwWzFdKQorICAgICAgICB2IHw9IGZmX2JwWzFdW2ZmX2JwX2luZGV4XSA8PCAxOworICAgIGlmIChmZl9icFsyXSkKKyAgICAgICAgdiB8PSBmZl9icFsyXVtmZl9icF9pbmRleF0gPDwgMjsKKyAgICBiaXRwbGFuZVtiaXRwbGFuZV9pbmRleF0gPSAoYml0cGxhbmVbYml0cGxhbmVfaW5kZXhdIDw8IDQpIHwgdjsKK30KKworc3RhdGljIGludCB2YWFwaV92YzFfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBhdl91bnVzZWQgY29uc3QgdWludDhfdCAqYnVmZmVyLCBhdl91bnVzZWQgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBWQzFDb250ZXh0ICogY29uc3QgdiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzID0gJnYtPnM7CisgICAgc3RydWN0IHZhYXBpX2NvbnRleHQgKiBjb25zdCB2YWN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVkMxICpwaWNfcGFyYW07CisKKyAgICBhdl9kbG9nKGF2Y3R4LCAidmFhcGlfdmMxX3N0YXJ0X2ZyYW1lKClcbiIpOworCisgICAgdmFjdHgtPnNsaWNlX3BhcmFtX3NpemUgPSBzaXplb2YoVkFTbGljZVBhcmFtZXRlckJ1ZmZlclZDMSk7CisKKyAgICAvKiBGaWxsIGluIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZDMSAqLworICAgIHBpY19wYXJhbSA9IGZmX3ZhYXBpX2FsbG9jX3BpY19wYXJhbSh2YWN0eCwgc2l6ZW9mKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZDMSkpOworICAgIGlmICghcGljX3BhcmFtKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcGljX3BhcmFtLT5mb3J3YXJkX3JlZmVyZW5jZV9waWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVkFfSU5WQUxJRF9JRDsKKyAgICBwaWNfcGFyYW0tPmJhY2t3YXJkX3JlZmVyZW5jZV9waWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBWQV9JTlZBTElEX0lEOworICAgIHBpY19wYXJhbS0+aW5sb29wX2RlY29kZWRfcGljdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFZBX0lOVkFMSURfSUQ7CisgICAgcGljX3BhcmFtLT5zZXF1ZW5jZV9maWVsZHMudmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KKyAgICBwaWNfcGFyYW0tPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLnB1bGxkb3duICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5icm9hZGNhc3Q7CisgICAgcGljX3BhcmFtLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5pbnRlcmxhY2UgICAgICAgICAgICAgICAgICAgICAgID0gdi0+aW50ZXJsYWNlOworICAgIHBpY19wYXJhbS0+c2VxdWVuY2VfZmllbGRzLmJpdHMudGZjbnRyZmxhZyAgICAgICAgICAgICAgICAgICAgICA9IHYtPnRmY250cmZsYWc7CisgICAgcGljX3BhcmFtLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5maW50ZXJwZmxhZyAgICAgICAgICAgICAgICAgICAgID0gdi0+ZmludGVycGZsYWc7CisgICAgcGljX3BhcmFtLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5wc2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+cHNmOworICAgIHBpY19wYXJhbS0+c2VxdWVuY2VfZmllbGRzLmJpdHMubXVsdGlyZXMgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPm11bHRpcmVzOworICAgIHBpY19wYXJhbS0+c2VxdWVuY2VfZmllbGRzLmJpdHMub3ZlcmxhcCAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPm92ZXJsYXA7CisgICAgcGljX3BhcmFtLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5zeW5jbWFya2VyICAgICAgICAgICAgICAgICAgICAgID0gdi0+cmVzeW5jX21hcmtlcjsKKyAgICBwaWNfcGFyYW0tPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLnJhbmdlcmVkICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5yYW5nZXJlZDsKKyAgICBwaWNfcGFyYW0tPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLm1heF9iX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgPSBzLT5hdmN0eC0+bWF4X2JfZnJhbWVzOworI2lmIFZBX0NIRUNLX1ZFUlNJT04oMCwzMiwwKQorICAgIHBpY19wYXJhbS0+c2VxdWVuY2VfZmllbGRzLmJpdHMucHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPnByb2ZpbGU7CisjZW5kaWYKKyAgICBwaWNfcGFyYW0tPmNvZGVkX3dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5hdmN0eC0+Y29kZWRfd2lkdGg7CisgICAgcGljX3BhcmFtLT5jb2RlZF9oZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+YXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICBwaWNfcGFyYW0tPmVudHJ5cG9pbnRfZmllbGRzLnZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOyAvKiByZXNldCBhbGwgYml0cyAqLworICAgIHBpY19wYXJhbS0+ZW50cnlwb2ludF9maWVsZHMuYml0cy5icm9rZW5fbGluayAgICAgICAgICAgICAgICAgICA9IHYtPmJyb2tlbl9saW5rOworICAgIHBpY19wYXJhbS0+ZW50cnlwb2ludF9maWVsZHMuYml0cy5jbG9zZWRfZW50cnkgICAgICAgICAgICAgICAgICA9IHYtPmNsb3NlZF9lbnRyeTsKKyAgICBwaWNfcGFyYW0tPmVudHJ5cG9pbnRfZmllbGRzLmJpdHMucGFuc2Nhbl9mbGFnICAgICAgICAgICAgICAgICAgPSB2LT5wYW5zY2FuZmxhZzsKKyAgICBwaWNfcGFyYW0tPmVudHJ5cG9pbnRfZmllbGRzLmJpdHMubG9vcGZpbHRlciAgICAgICAgICAgICAgICAgICAgPSBzLT5sb29wX2ZpbHRlcjsKKyAgICBwaWNfcGFyYW0tPmNvbmRpdGlvbmFsX292ZXJsYXBfZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5jb25kb3ZlcjsKKyAgICBwaWNfcGFyYW0tPmZhc3RfdXZtY19mbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5mYXN0dXZtYzsKKyAgICBwaWNfcGFyYW0tPnJhbmdlX21hcHBpbmdfZmllbGRzLnZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOyAvKiByZXNldCBhbGwgYml0cyAqLworICAgIHBpY19wYXJhbS0+cmFuZ2VfbWFwcGluZ19maWVsZHMuYml0cy5sdW1hX2ZsYWcgICAgICAgICAgICAgICAgICA9IHYtPnJhbmdlX21hcHlfZmxhZzsKKyAgICBwaWNfcGFyYW0tPnJhbmdlX21hcHBpbmdfZmllbGRzLmJpdHMubHVtYSAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5yYW5nZV9tYXB5OworICAgIHBpY19wYXJhbS0+cmFuZ2VfbWFwcGluZ19maWVsZHMuYml0cy5jaHJvbWFfZmxhZyAgICAgICAgICAgICAgICA9IHYtPnJhbmdlX21hcHV2X2ZsYWc7CisgICAgcGljX3BhcmFtLT5yYW5nZV9tYXBwaW5nX2ZpZWxkcy5iaXRzLmNocm9tYSAgICAgICAgICAgICAgICAgICAgID0gdi0+cmFuZ2VfbWFwdXY7CisgICAgcGljX3BhcmFtLT5iX3BpY3R1cmVfZnJhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+YmZyYWN0aW9uX2x1dF9pbmRleDsKKyAgICBwaWNfcGFyYW0tPmNicF90YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5jYnBjeV92bGMgPyB2LT5jYnBjeV92bGMgLSBmZl92YzFfY2JwY3lfcF92bGMgOiAwOworICAgIHBpY19wYXJhbS0+bWJfbW9kZV90YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLworICAgIHBpY19wYXJhbS0+cmFuZ2VfcmVkdWN0aW9uX2ZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPnJhbmdlcmVkZnJtOworICAgIHBpY19wYXJhbS0+cm91bmRpbmdfY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPnJuZDsKKyAgICBwaWNfcGFyYW0tPnBvc3RfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5wb3N0cHJvYzsKKyAgICBwaWNfcGFyYW0tPnBpY3R1cmVfcmVzb2x1dGlvbl9pbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5yZXNwaWM7CisgICAgcGljX3BhcmFtLT5sdW1hX3NjYWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+bHVtc2NhbGU7CisgICAgcGljX3BhcmFtLT5sdW1hX3NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+bHVtc2hpZnQ7CisgICAgcGljX3BhcmFtLT5waWN0dXJlX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KKyAgICBwaWNfcGFyYW0tPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlICAgICAgICAgICAgICAgICAgICAgPSB2YzFfZ2V0X1BUWVBFKHYpOworICAgIHBpY19wYXJhbS0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSAgICAgICAgICAgICAgICA9IHYtPmZjbTsKKyAgICBwaWNfcGFyYW0tPnBpY3R1cmVfZmllbGRzLmJpdHMudG9wX2ZpZWxkX2ZpcnN0ICAgICAgICAgICAgICAgICAgPSB2LT50ZmY7CisgICAgcGljX3BhcmFtLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmlzX2ZpcnN0X2ZpZWxkICAgICAgICAgICAgICAgICAgID0gdi0+ZmNtID09IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLworICAgIHBpY19wYXJhbS0+cGljdHVyZV9maWVsZHMuYml0cy5pbnRlbnNpdHlfY29tcGVuc2F0aW9uICAgICAgICAgICA9IHYtPm12X21vZGUgPT0gTVZfUE1PREVfSU5URU5TSVRZX0NPTVA7CisgICAgcGljX3BhcmFtLT5yYXdfY29kaW5nLnZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KKyAgICBwaWNfcGFyYW0tPnJhd19jb2RpbmcuZmxhZ3MubXZfdHlwZV9tYiAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5tdl90eXBlX2lzX3JhdzsKKyAgICBwaWNfcGFyYW0tPnJhd19jb2RpbmcuZmxhZ3MuZGlyZWN0X21iICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5kbWJfaXNfcmF3OworICAgIHBpY19wYXJhbS0+cmF3X2NvZGluZy5mbGFncy5za2lwX21iICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPnNraXBfaXNfcmF3OworICAgIHBpY19wYXJhbS0+cmF3X2NvZGluZy5mbGFncy5maWVsZF90eCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLworICAgIHBpY19wYXJhbS0+cmF3X2NvZGluZy5mbGFncy5mb3J3YXJkX21iICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLworICAgIHBpY19wYXJhbS0+cmF3X2NvZGluZy5mbGFncy5hY19wcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPmFjcHJlZF9pc19yYXc7CisgICAgcGljX3BhcmFtLT5yYXdfY29kaW5nLmZsYWdzLm92ZXJmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+b3ZlcmZsZ19pc19yYXc7CisgICAgcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LnZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KKyAgICBwaWNfcGFyYW0tPmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfbXZfdHlwZV9tYiAgICAgICAgICAgICAgICAgPSB2YzFfaGFzX01WVFlQRU1CX2JpdHBsYW5lKHYpOworICAgIHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9kaXJlY3RfbWIgICAgICAgICAgICAgICAgICA9IHZjMV9oYXNfRElSRUNUTUJfYml0cGxhbmUodik7CisgICAgcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX3NraXBfbWIgICAgICAgICAgICAgICAgICAgID0gdmMxX2hhc19TS0lQTUJfYml0cGxhbmUodik7CisgICAgcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX2ZpZWxkX3R4ICAgICAgICAgICAgICAgICAgID0gMDsgLyogWFhYOiBpbnRlcmxhY2VkIGZyYW1lICovCisgICAgcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX2ZvcndhcmRfbWIgICAgICAgICAgICAgICAgID0gMDsgLyogWFhYOiBpbnRlcmxhY2VkIGZyYW1lICovCisgICAgcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX2FjX3ByZWQgICAgICAgICAgICAgICAgICAgID0gdmMxX2hhc19BQ1BSRURfYml0cGxhbmUodik7CisgICAgcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX292ZXJmbGFncyAgICAgICAgICAgICAgICAgID0gdmMxX2hhc19PVkVSRkxBR1NfYml0cGxhbmUodik7CisgICAgcGljX3BhcmFtLT5yZWZlcmVuY2VfZmllbGRzLnZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KKyAgICBwaWNfcGFyYW0tPnJlZmVyZW5jZV9maWVsZHMuYml0cy5yZWZlcmVuY2VfZGlzdGFuY2VfZmxhZyAgICAgICAgPSB2LT5yZWZkaXN0X2ZsYWc7CisgICAgcGljX3BhcmFtLT5yZWZlcmVuY2VfZmllbGRzLmJpdHMucmVmZXJlbmNlX2Rpc3RhbmNlICAgICAgICAgICAgID0gMDsgLyogWFhYOiBpbnRlcmxhY2VkIGZyYW1lICovCisgICAgcGljX3BhcmFtLT5yZWZlcmVuY2VfZmllbGRzLmJpdHMubnVtX3JlZmVyZW5jZV9waWN0dXJlcyAgICAgICAgID0gMDsgLyogWFhYOiBpbnRlcmxhY2VkIGZyYW1lICovCisgICAgcGljX3BhcmFtLT5yZWZlcmVuY2VfZmllbGRzLmJpdHMucmVmZXJlbmNlX2ZpZWxkX3BpY19pbmRpY2F0b3IgID0gMDsgLyogWFhYOiBpbnRlcmxhY2VkIGZyYW1lICovCisgICAgcGljX3BhcmFtLT5tdl9maWVsZHMudmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KKyAgICBwaWNfcGFyYW0tPm12X2ZpZWxkcy5iaXRzLm12X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2YzFfZ2V0X01WTU9ERSh2KTsKKyAgICBwaWNfcGFyYW0tPm12X2ZpZWxkcy5iaXRzLm12X21vZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2YzFfZ2V0X01WTU9ERTIodik7CisgICAgcGljX3BhcmFtLT5tdl9maWVsZHMuYml0cy5tdl90YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+bXZfdGFibGVfaW5kZXg7CisgICAgcGljX3BhcmFtLT5tdl9maWVsZHMuYml0cy50d29fbXZfYmxvY2tfcGF0dGVybl90YWJsZSAgICAgICAgICAgID0gMDsgLyogWFhYOiBpbnRlcmxhY2VkIGZyYW1lICovCisgICAgcGljX3BhcmFtLT5tdl9maWVsZHMuYml0cy5mb3VyX212X3N3aXRjaCAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogWFhYOiBpbnRlcmxhY2VkIGZyYW1lICovCisgICAgcGljX3BhcmFtLT5tdl9maWVsZHMuYml0cy5mb3VyX212X2Jsb2NrX3BhdHRlcm5fdGFibGUgICAgICAgICAgID0gMDsgLyogWFhYOiBpbnRlcmxhY2VkIGZyYW1lICovCisgICAgcGljX3BhcmFtLT5tdl9maWVsZHMuYml0cy5leHRlbmRlZF9tdl9mbGFnICAgICAgICAgICAgICAgICAgICAgID0gdi0+ZXh0ZW5kZWRfbXY7CisgICAgcGljX3BhcmFtLT5tdl9maWVsZHMuYml0cy5leHRlbmRlZF9tdl9yYW5nZSAgICAgICAgICAgICAgICAgICAgID0gdi0+bXZyYW5nZTsKKyAgICBwaWNfcGFyYW0tPm12X2ZpZWxkcy5iaXRzLmV4dGVuZGVkX2Rtdl9mbGFnICAgICAgICAgICAgICAgICAgICAgPSB2LT5leHRlbmRlZF9kbXY7CisgICAgcGljX3BhcmFtLT5tdl9maWVsZHMuYml0cy5leHRlbmRlZF9kbXZfcmFuZ2UgICAgICAgICAgICAgICAgICAgID0gMDsgLyogWFhYOiBpbnRlcmxhY2VkIGZyYW1lICovCisgICAgcGljX3BhcmFtLT5waWNfcXVhbnRpemVyX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KKyAgICBwaWNfcGFyYW0tPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMuZHF1YW50ICAgICAgICAgICAgICAgICAgICAgPSB2LT5kcXVhbnQ7CisgICAgcGljX3BhcmFtLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLnF1YW50aXplciAgICAgICAgICAgICAgICAgID0gdi0+cXVhbnRpemVyX21vZGU7CisgICAgcGljX3BhcmFtLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmhhbGZfcXAgICAgICAgICAgICAgICAgICAgID0gdi0+aGFsZnBxOworICAgIHBpY19wYXJhbS0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5waWNfcXVhbnRpemVyX3NjYWxlICAgICAgICA9IHYtPnBxOworICAgIHBpY19wYXJhbS0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5waWNfcXVhbnRpemVyX3R5cGUgICAgICAgICA9IHYtPnBxdWFudGl6ZXI7CisgICAgcGljX3BhcmFtLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxX2ZyYW1lICAgICAgICAgICAgICAgICAgID0gdi0+ZHF1YW50ZnJtOworICAgIHBpY19wYXJhbS0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5kcV9wcm9maWxlICAgICAgICAgICAgICAgICA9IHYtPmRxcHJvZmlsZTsKKyAgICBwaWNfcGFyYW0tPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMuZHFfc2JfZWRnZSAgICAgICAgICAgICAgICAgPSB2LT5kcXByb2ZpbGUgPT0gRFFQUk9GSUxFX1NJTkdMRV9FREdFICA/IHYtPmRxc2JlZGdlIDogMDsKKyAgICBwaWNfcGFyYW0tPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMuZHFfZGJfZWRnZSAgICAgICAgICAgICAgICAgPSB2LT5kcXByb2ZpbGUgPT0gRFFQUk9GSUxFX0RPVUJMRV9FREdFUyA/IHYtPmRxc2JlZGdlIDogMDsKKyAgICBwaWNfcGFyYW0tPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMuZHFfYmluYXJ5X2xldmVsICAgICAgICAgICAgPSB2LT5kcWJpbGV2ZWw7CisgICAgcGljX3BhcmFtLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmFsdF9waWNfcXVhbnRpemVyICAgICAgICAgID0gdi0+YWx0cHE7CisgICAgcGljX3BhcmFtLT50cmFuc2Zvcm1fZmllbGRzLnZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KKyAgICBwaWNfcGFyYW0tPnRyYW5zZm9ybV9maWVsZHMuYml0cy52YXJpYWJsZV9zaXplZF90cmFuc2Zvcm1fZmxhZyAgPSB2LT52c3RyYW5zZm9ybTsKKyAgICBwaWNfcGFyYW0tPnRyYW5zZm9ybV9maWVsZHMuYml0cy5tYl9sZXZlbF90cmFuc2Zvcm1fdHlwZV9mbGFnICAgPSB2LT50dG1iZjsKKyAgICBwaWNfcGFyYW0tPnRyYW5zZm9ybV9maWVsZHMuYml0cy5mcmFtZV9sZXZlbF90cmFuc2Zvcm1fdHlwZSAgICAgPSB2YzFfZ2V0X1RURlJNKHYpOworICAgIHBpY19wYXJhbS0+dHJhbnNmb3JtX2ZpZWxkcy5iaXRzLnRyYW5zZm9ybV9hY19jb2RpbmdzZXRfaWR4MSAgICA9IHYtPmNfYWNfdGFibGVfaW5kZXg7CisgICAgcGljX3BhcmFtLT50cmFuc2Zvcm1fZmllbGRzLmJpdHMudHJhbnNmb3JtX2FjX2NvZGluZ3NldF9pZHgyICAgID0gdi0+eV9hY190YWJsZV9pbmRleDsKKyAgICBwaWNfcGFyYW0tPnRyYW5zZm9ybV9maWVsZHMuYml0cy5pbnRyYV90cmFuc2Zvcm1fZGNfdGFibGUgICAgICAgPSB2LT5zLmRjX3RhYmxlX2luZGV4OworCisgICAgc3dpdGNoIChzLT5waWN0X3R5cGUpIHsKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9COgorICAgICAgICBwaWNfcGFyYW0tPmJhY2t3YXJkX3JlZmVyZW5jZV9waWN0dXJlID0gZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQocy0+bmV4dF9waWN0dXJlLmYpOworICAgICAgICAvLyBmYWxsLXRocm91Z2gKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9QOgorICAgICAgICBwaWNfcGFyYW0tPmZvcndhcmRfcmVmZXJlbmNlX3BpY3R1cmUgPSBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZChzLT5sYXN0X3BpY3R1cmUuZik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwaWNfcGFyYW0tPmJpdHBsYW5lX3ByZXNlbnQudmFsdWUpIHsKKyAgICAgICAgdWludDhfdCAqYml0cGxhbmU7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZmX2JwWzNdOworICAgICAgICBpbnQgeCwgeSwgbjsKKworICAgICAgICBzd2l0Y2ggKHMtPnBpY3RfdHlwZSkgeworICAgICAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9QOgorICAgICAgICAgICAgZmZfYnBbMF0gPSBwaWNfcGFyYW0tPmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfZGlyZWN0X21iICA/IHYtPmRpcmVjdF9tYl9wbGFuZSAgICA6IE5VTEw7CisgICAgICAgICAgICBmZl9icFsxXSA9IHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9za2lwX21iICAgID8gcy0+bWJza2lwX3RhYmxlICAgICAgIDogTlVMTDsKKyAgICAgICAgICAgIGZmX2JwWzJdID0gcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX212X3R5cGVfbWIgPyB2LT5tdl90eXBlX21iX3BsYW5lICAgOiBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX0I6CisgICAgICAgICAgICBpZiAoIXYtPmJpX3R5cGUpIHsKKyAgICAgICAgICAgICAgICBmZl9icFswXSA9IHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9kaXJlY3RfbWIgPyB2LT5kaXJlY3RfbWJfcGxhbmUgOiBOVUxMOworICAgICAgICAgICAgICAgIGZmX2JwWzFdID0gcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX3NraXBfbWIgICA/IHMtPm1ic2tpcF90YWJsZSAgICA6IE5VTEw7CisgICAgICAgICAgICAgICAgZmZfYnBbMl0gPSBOVUxMOyAvKiBYWFg6IGludGVybGFjZWQgZnJhbWUgKEZPUldBUkQgcGxhbmUpICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBmYWxsLXRocm91Z2ggKEJJLXR5cGUpICovCisgICAgICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX0k6CisgICAgICAgICAgICBmZl9icFswXSA9IE5VTEw7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAoRklFTERUWCBwbGFuZSkgKi8KKyAgICAgICAgICAgIGZmX2JwWzFdID0gcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX2FjX3ByZWQgICAgPyB2LT5hY3ByZWRfcGxhbmUgICAgICAgOiBOVUxMOworICAgICAgICAgICAgZmZfYnBbMl0gPSBwaWNfcGFyYW0tPmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfb3ZlcmZsYWdzICA/IHYtPm92ZXJfZmxhZ3NfcGxhbmUgICA6IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZmX2JwWzBdID0gTlVMTDsKKyAgICAgICAgICAgIGZmX2JwWzFdID0gTlVMTDsKKyAgICAgICAgICAgIGZmX2JwWzJdID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYml0cGxhbmUgPSBmZl92YWFwaV9hbGxvY19iaXRwbGFuZSh2YWN0eCwgKHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0ICsgMSkgLyAyKTsKKyAgICAgICAgaWYgKCFiaXRwbGFuZSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBuID0gMDsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPm1iX2hlaWdodDsgeSsrKQorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPm1iX3dpZHRoOyB4KyssIG4rKykKKyAgICAgICAgICAgICAgICB2YzFfcGFja19iaXRwbGFuZXMoYml0cGxhbmUsIG4sIGZmX2JwLCB4LCB5LCBzLT5tYl9zdHJpZGUpOworICAgICAgICBpZiAobiAmIDEpIC8qIG1vdmUgbGFzdCBuaWJibGUgdG8gdGhlIGhpZ2ggb3JkZXIgKi8KKyAgICAgICAgICAgIGJpdHBsYW5lW24vMl0gPDw9IDQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhYXBpX3ZjMV9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IHNpemUpCit7CisgICAgVkMxQ29udGV4dCAqIGNvbnN0IHYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3QgcyA9ICZ2LT5zOworICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWQzEgKnNsaWNlX3BhcmFtOworCisgICAgYXZfZGxvZyhhdmN0eCwgInZhYXBpX3ZjMV9kZWNvZGVfc2xpY2UoKTogYnVmZmVyICVwLCBzaXplICVkXG4iLCBidWZmZXIsIHNpemUpOworCisgICAgLyogQ3VycmVudCBiaXQgYnVmZmVyIGlzIGJleW9uZCBhbnkgbWFya2VyIGZvciBWQy0xLCBzbyBza2lwIGl0ICovCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEgJiYgSVNfTUFSS0VSKEFWX1JCMzIoYnVmZmVyKSkpIHsKKyAgICAgICAgYnVmZmVyICs9IDQ7CisgICAgICAgIHNpemUgLT0gNDsKKyAgICB9CisKKyAgICAvKiBGaWxsIGluIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWQzEgKi8KKyAgICBzbGljZV9wYXJhbSA9IChWQVNsaWNlUGFyYW1ldGVyQnVmZmVyVkMxICopZmZfdmFhcGlfYWxsb2Nfc2xpY2UoYXZjdHgtPmh3YWNjZWxfY29udGV4dCwgYnVmZmVyLCBzaXplKTsKKyAgICBpZiAoIXNsaWNlX3BhcmFtKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc2xpY2VfcGFyYW0tPm1hY3JvYmxvY2tfb2Zmc2V0ICAgICAgID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICBzbGljZV9wYXJhbS0+c2xpY2VfdmVydGljYWxfcG9zaXRpb24gPSBzLT5tYl95OworICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX1dNVjNfVkFBUElfSFdBQ0NFTAorQVZIV0FjY2VsIGZmX3dtdjNfdmFhcGlfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid212M192YWFwaSIsCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dNVjMsCisgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9WQUFQSV9WTEQsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gdmFhcGlfdmMxX3N0YXJ0X2ZyYW1lLAorICAgIC5lbmRfZnJhbWUgICAgICA9IGZmX3ZhYXBpX21wZWdfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICA9IHZhYXBpX3ZjMV9kZWNvZGVfc2xpY2UsCit9OworI2VuZGlmCisKK0FWSFdBY2NlbCBmZl92YzFfdmFhcGlfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidmMxX3ZhYXBpIiwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVkMxLAorICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfVkFBUElfVkxELAorICAgIC5zdGFydF9mcmFtZSAgICA9IHZhYXBpX3ZjMV9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSBmZl92YWFwaV9tcGVnX2VuZF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSB2YWFwaV92YzFfZGVjb2RlX3NsaWNlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZiLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjODlhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92Yi5jCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogQmVhbSBTb2Z0d2FyZSBWQiBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWQiBWaWRlbyBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2VudW0gVkJGbGFncyB7CisgICAgVkJfSEFTX0dNQyAgICAgPSAweDAxLAorICAgIFZCX0hBU19BVURJTyAgID0gMHgwNCwKKyAgICBWQl9IQVNfVklERU8gICA9IDB4MDgsCisgICAgVkJfSEFTX1BBTEVUVEUgPSAweDEwLAorICAgIFZCX0hBU19MRU5HVEggID0gMHgyMAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgVkJEZWNDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisKKyAgICB1aW50OF90ICpmcmFtZSwgKnByZXZfZnJhbWU7CisgICAgdWludDMyX3QgcGFsW0FWUEFMRVRURV9DT1VOVF07CisgICAgR2V0Qnl0ZUNvbnRleHQgc3RyZWFtOworfSBWQkRlY0NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB2Yl9wYXR0ZXJuc1s2NF0gPSB7CisgICAgMHgwNjYwLCAweEZGMDAsIDB4Q0NDQywgMHhGMDAwLCAweDg4ODgsIDB4MDAwRiwgMHgxMTExLCAweEZFQzgsCisgICAgMHg4Q0VGLCAweDEzN0YsIDB4RjczMSwgMHhDODAwLCAweDAwOEMsIDB4MDAxMywgMHgzMTAwLCAweENDMDAsCisgICAgMHgwMENDLCAweDAwMzMsIDB4MzMwMCwgMHgwRkYwLCAweDY2NjYsIDB4MDBGMCwgMHgwRjAwLCAweDIyMjIsCisgICAgMHg0NDQ0LCAweEY2MDAsIDB4OENDOCwgMHgwMDZGLCAweDEzMzEsIDB4MzE4QywgMHhDODEzLCAweDMzQ0MsCisgICAgMHg2NjAwLCAweDBDQzAsIDB4MDA2NiwgMHgwMzMwLCAweEY5MDAsIDB4Qzg4QywgMHgwMDlGLCAweDMxMTMsCisgICAgMHg2MDAwLCAweDA4ODAsIDB4MDAwNiwgMHgwMTEwLCAweENDODgsIDB4RkMwMCwgMHgwMENGLCAweDg4Q0MsCisgICAgMHgwMDNGLCAweDExMzMsIDB4MzMxMSwgMHhGMzAwLCAweDZGRjYsIDB4MDYwMywgMHgwOEM2LCAweDhDNjMsCisgICAgMHhDNjMxLCAweDYzMTAsIDB4QzA2MCwgMHgwMTM2LCAweDEzNkMsIDB4MzZDOCwgMHg2QzgwLCAweDMyNEMKK307CisKK3N0YXRpYyB2b2lkIHZiX2RlY29kZV9wYWxldHRlKFZCRGVjQ29udGV4dCAqYywgaW50IGRhdGFfc2l6ZSkKK3sKKyAgICBpbnQgc3RhcnQsIHNpemUsIGk7CisKKyAgICBzdGFydCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjLT5zdHJlYW0pOworICAgIHNpemUgID0gKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjLT5zdHJlYW0pIC0gMSkgJiAweEZGOworICAgIGlmIChzdGFydCArIHNpemUgPiAyNTUpIHsKKyAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWxldHRlIGNoYW5nZSBydW5zIGJleW9uZCBlbnRyeSAyNTZcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzaXplKjMrMiA+IGRhdGFfc2l6ZSkgeworICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhbGV0dGUgZGF0YSBydW5zIGJleW9uZCBjaHVuayBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8PSBzdGFydCArIHNpemU7IGkrKykKKyAgICAgICAgYy0+cGFsW2ldID0gMHhGRlUgPDwgMjQgfCBieXRlc3RyZWFtMl9nZXRfYmUyNCgmYy0+c3RyZWFtKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfcGl4ZWwodWludDhfdCAqYnVmLCB1aW50OF90ICpzdGFydCwgdWludDhfdCAqZW5kKQoreworICAgIHJldHVybiBidWYgPj0gc3RhcnQgJiYgYnVmIDwgZW5kOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaGVja19saW5lKHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCAqc3RhcnQsIHVpbnQ4X3QgKmVuZCkKK3sKKyAgICByZXR1cm4gYnVmID49IHN0YXJ0ICYmIChidWYgKyA0KSA8PSBlbmQ7Cit9CisKK3N0YXRpYyBpbnQgdmJfZGVjb2RlX2ZyYW1lZGF0YShWQkRlY0NvbnRleHQgKmMsIGludCBvZmZzZXQpCit7CisgICAgR2V0Qnl0ZUNvbnRleHQgZzsKKyAgICB1aW50OF90ICpwcmV2LCAqY3VyOworICAgIGludCBibGssIGJsb2NrcywgdCwgYmxrMjsKKyAgICBpbnQgYmxvY2t0eXBlcyA9IDA7CisgICAgaW50IHgsIHksIGEsIGI7CisgICAgaW50IHBhdHR5cGUsIHBhdHRlcm47CisgICAgY29uc3QgaW50IHdpZHRoID0gYy0+YXZjdHgtPndpZHRoOworICAgIHVpbnQ4X3QgKnBzdGFydCA9IGMtPnByZXZfZnJhbWU7CisgICAgdWludDhfdCAqcGVuZCAgID0gYy0+cHJldl9mcmFtZSArIHdpZHRoKmMtPmF2Y3R4LT5oZWlnaHQ7CisKKyAgICBnID0gYy0+c3RyZWFtOworCisgICAgcHJldiA9IGMtPnByZXZfZnJhbWUgKyBvZmZzZXQ7CisgICAgY3VyICA9IGMtPmZyYW1lOworCisgICAgYmxvY2tzID0gKGMtPmF2Y3R4LT53aWR0aCA+PiAyKSAqIChjLT5hdmN0eC0+aGVpZ2h0ID4+IDIpOworICAgIGJsazIgICA9IDA7CisgICAgZm9yIChibGsgPSAwOyBibGsgPCBibG9ja3M7IGJsaysrKSB7CisgICAgICAgIGlmICghKGJsayAmIDMpKSB7CisgICAgICAgICAgICBibG9ja3R5cGVzID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYmxvY2t0eXBlcyAmIDB4QzApIHsKKyAgICAgICAgY2FzZSAweDAwOiAvL3NraXAKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCisgICAgICAgICAgICAgICAgaWYgKGNoZWNrX2xpbmUocHJldiArIHkqd2lkdGgsIHBzdGFydCwgcGVuZCkpCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShjdXIgKyB5KndpZHRoLCBwcmV2ICsgeSp3aWR0aCwgNCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY3VyICsgeSp3aWR0aCwgMCwgNCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDQwOgorICAgICAgICAgICAgdCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnKTsKKyAgICAgICAgICAgIGlmICghdCkgeyAvL3JhdyBibG9jaworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZykgPCAxNikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkluc3VmZmljaWVudCBkYXRhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmcsIGN1ciArIHkgKiB3aWR0aCwgNCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBtb3Rpb24gY29tcGVuc2F0aW9uCisgICAgICAgICAgICAgICAgeCA9ICgodCAmIDB4RileOCkgLSA4OworICAgICAgICAgICAgICAgIHkgPSAoKHQgPj4gNCkgXjgpIC0gODsKKyAgICAgICAgICAgICAgICB0ID0geCArIHkqd2lkdGg7CisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrX2xpbmUocHJldiArIHQgKyB5KndpZHRoLCBwc3RhcnQsIHBlbmQpKQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGN1ciArIHkqd2lkdGgsIHByZXYgKyB0ICsgeSp3aWR0aCwgNCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChjdXIgKyB5KndpZHRoLCAwLCA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ODA6IC8vIGZpbGwKKyAgICAgICAgICAgIHQgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZyk7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQorICAgICAgICAgICAgICAgIG1lbXNldChjdXIgKyB5KndpZHRoLCB0LCA0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4QzA6IC8vIHBhdHRlcm4gZmlsbAorICAgICAgICAgICAgdCAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnKTsKKyAgICAgICAgICAgIHBhdHR5cGUgPSB0ID4+IDY7CisgICAgICAgICAgICBwYXR0ZXJuID0gdmJfcGF0dGVybnNbdCAmIDB4M0ZdOworICAgICAgICAgICAgc3dpdGNoIChwYXR0eXBlKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgYSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnKTsKKyAgICAgICAgICAgICAgICBiID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcpOworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyssIHBhdHRlcm4gPj49IDEpCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJbeCArIHkqd2lkdGhdID0gKHBhdHRlcm4gJiAxKSA/IGIgOiBhOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHBhdHRlcm4gPSB+cGF0dGVybjsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBhID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcpOworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyssIHBhdHRlcm4gPj49IDEpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0dGVybiAmIDEgJiYgY2hlY2tfcGl4ZWwocHJldiArIHggKyB5KndpZHRoLCBwc3RhcnQsIHBlbmQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clt4ICsgeSp3aWR0aF0gPSBwcmV2W3ggKyB5KndpZHRoXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJbeCArIHkqd2lkdGhdID0gYTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgb3Bjb2RlIHNlZW4gQCVkXG4iLCBibGspOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2t0eXBlcyA8PD0gMjsKKyAgICAgICAgY3VyICArPSA0OworICAgICAgICBwcmV2ICs9IDQ7CisgICAgICAgIGJsazIrKzsKKyAgICAgICAgaWYgKGJsazIgPT0gKHdpZHRoID4+IDIpKSB7CisgICAgICAgICAgICBibGsyICA9IDA7CisgICAgICAgICAgICBjdXIgICs9IHdpZHRoICogMzsKKyAgICAgICAgICAgIHByZXYgKz0gd2lkdGggKiAzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFZCRGVjQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lICAgICAgICAgPSBkYXRhOworICAgIHVpbnQ4X3QgKm91dHB0ciwgKnNyY3B0cjsKKyAgICBpbnQgaSwgaiwgcmV0OworICAgIGludCBmbGFnczsKKyAgICB1aW50MzJfdCBzaXplOworICAgIGludCBvZmZzZXQgPSAwOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmYy0+c3RyZWFtLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZsYWdzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmMtPnN0cmVhbSk7CisKKyAgICBpZiAoZmxhZ3MgJiBWQl9IQVNfR01DKSB7CisgICAgICAgIGkgPSAoaW50MTZfdClieXRlc3RyZWFtMl9nZXRfbGUxNigmYy0+c3RyZWFtKTsKKyAgICAgICAgaiA9IChpbnQxNl90KWJ5dGVzdHJlYW0yX2dldF9sZTE2KCZjLT5zdHJlYW0pOworICAgICAgICBvZmZzZXQgPSBpICsgaiAqIGF2Y3R4LT53aWR0aDsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgVkJfSEFTX1ZJREVPKSB7CisgICAgICAgIHNpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmYy0+c3RyZWFtKTsKKyAgICAgICAgaWYoc2l6ZSA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjLT5zdHJlYW0pKzQgfHwgc2l6ZTw0KXsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRnJhbWUgc2l6ZSBpbnZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB2Yl9kZWNvZGVfZnJhbWVkYXRhKGMsIG9mZnNldCk7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmMtPnN0cmVhbSwgc2l6ZSAtIDQpOworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBWQl9IQVNfUEFMRVRURSkgeworICAgICAgICBzaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmMtPnN0cmVhbSk7CisgICAgICAgIHZiX2RlY29kZV9wYWxldHRlKGMsIHNpemUpOworICAgIH0KKworICAgIG1lbWNweShmcmFtZS0+ZGF0YVsxXSwgYy0+cGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSBmbGFncyAmIFZCX0hBU19QQUxFVFRFOworCisgICAgb3V0cHRyID0gZnJhbWUtPmRhdGFbMF07CisgICAgc3JjcHRyID0gYy0+ZnJhbWU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIG1lbWNweShvdXRwdHIsIHNyY3B0ciwgYXZjdHgtPndpZHRoKTsKKyAgICAgICAgc3JjcHRyICs9IGF2Y3R4LT53aWR0aDsKKyAgICAgICAgb3V0cHRyICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICBGRlNXQVAodWludDhfdCosIGMtPmZyYW1lLCBjLT5wcmV2X2ZyYW1lKTsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgLyogYWx3YXlzIHJlcG9ydCB0aGF0IHRoZSBidWZmZXIgd2FzIGNvbXBsZXRlbHkgY29uc3VtZWQgKi8KKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkJEZWNDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBjLT5hdmN0eCAgICAgICA9IGF2Y3R4OworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworCisgICAgYy0+ZnJhbWUgICAgICA9IGF2X21hbGxvY3ooYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCk7CisgICAgYy0+cHJldl9mcmFtZSA9IGF2X21hbGxvY3ooYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZCRGVjQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmYy0+ZnJhbWUpOworICAgIGF2X2ZyZWVwKCZjLT5wcmV2X2ZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3ZiX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZiIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQmVhbSBTb2Z0d2FyZSBWQiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WQiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVkJEZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZibGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmYyNWJhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmJsZS5jCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogVkJMRSBEZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgRGVyZWsgQnVpdGVuaHVpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWQkxFIERlY29kZXIKKyAqLworCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImh1ZmZ5dXZkc3AuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBIdWZmWVVWRFNQQ29udGV4dCBoZHNwOworCisgICAgaW50ICAgICAgICAgICAgc2l6ZTsKKyAgICB1aW50OF90ICAgICAgICAqdmFsOyAvLy88IFRoaXMgYXJyYXkgZmlyc3QgaG9sZHMgdGhlIGxlbmd0aHMgb2YgdmxjIHN5bWJvbHMgYW5kIHRoZW4gdGhlaXIgdmFsdWUuCit9IFZCTEVDb250ZXh0OworCitzdGF0aWMgaW50IHZibGVfdW5wYWNrKFZCTEVDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBpOworICAgIGludCBhbGxiaXRzID0gMDsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBMVVRbMjU2XSA9IHsKKyAgICAgICAgOCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLAorICAgICAgICA1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsCisgICAgICAgIDYsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCwKKyAgICAgICAgNSwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLAorICAgICAgICA3LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsCisgICAgICAgIDUsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCwKKyAgICAgICAgNiwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLAorICAgICAgICA1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsCisgICAgfTsKKworICAgIC8qIFJlYWQgYWxsIHRoZSBsZW5ndGhzIGluIGZpcnN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+c2l6ZTsgaSsrKSB7CisgICAgICAgIC8qIEF0IG1vc3Qgd2UgbmVlZCB0byByZWFkIDkgYml0cyB0b3RhbCB0byBnZXQgaW5kaWNlcyB1cCB0byA4ICovCisgICAgICAgIGludCB2YWwgPSBzaG93X2JpdHMoZ2IsIDgpOworCisgICAgICAgIC8vIHJlYWQgcmV2ZXJzZSB1bmFyeQorICAgICAgICBpZiAodmFsKSB7CisgICAgICAgICAgICB2YWwgPSBMVVRbdmFsXTsKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgdmFsICsgMSk7CisgICAgICAgICAgICBjdHgtPnZhbFtpXSA9IHZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBpZiAoIWdldF9iaXRzMShnYikpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgY3R4LT52YWxbaV0gPSA4OworICAgICAgICB9CisgICAgICAgIGFsbGJpdHMgKz0gY3R4LT52YWxbaV07CisgICAgfQorCisgICAgLyogQ2hlY2sgd2UgaGF2ZSBlbm91Z2ggYml0cyBsZWZ0ICovCisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgYWxsYml0cykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2YmxlX3Jlc3RvcmVfcGxhbmUoVkJMRUNvbnRleHQgKmN0eCwgQVZGcmFtZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiLCBpbnQgcGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIHVpbnQ4X3QgKmRzdCA9IHBpYy0+ZGF0YVtwbGFuZV07CisgICAgdWludDhfdCAqdmFsID0gY3R4LT52YWwgKyBvZmZzZXQ7CisgICAgaW50IHN0cmlkZSA9IHBpYy0+bGluZXNpemVbcGxhbmVdOworICAgIGludCBpLCBqLCBsZWZ0LCBsZWZ0X3RvcDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgICAgLyogZ2V0X2JpdHMgY2FuJ3QgdGFrZSBhIGxlbmd0aCBvZiAwICovCisgICAgICAgICAgICBpZiAodmFsW2pdKSB7CisgICAgICAgICAgICAgICAgaW50IHYgPSAoMSA8PCB2YWxbal0pICsgZ2V0X2JpdHMoZ2IsIHZhbFtqXSkgLSAxOworICAgICAgICAgICAgICAgIHZhbFtqXSA9ICh2ID4+IDEpIF4gLSh2ICYgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgIGxlZnQgPSAwOworICAgICAgICAgICAgbGVmdF90b3AgPSBkc3RbLXN0cmlkZV07CisgICAgICAgICAgICBjdHgtPmhkc3AuYWRkX2hmeXVfbWVkaWFuX3ByZWQoZHN0LCBkc3QgLSBzdHJpZGUsIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgJmxlZnQsICZsZWZ0X3RvcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RbMF0gPSB2YWxbMF07CisgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykKKyAgICAgICAgICAgICAgICBkc3Rbal0gPSB2YWxbal0gKyBkc3RbaiAtIDFdOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIHZhbCArPSB3aWR0aDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdmJsZV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFZCTEVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKnBpYyAgICAgPSBkYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgY29uc3QgdWludDhfdCAqc3JjID0gYXZwa3QtPmRhdGE7CisgICAgaW50IHZlcnNpb247CisgICAgaW50IG9mZnNldCA9IDA7CisgICAgaW50IHdpZHRoX3V2ID0gYXZjdHgtPndpZHRoIC8gMiwgaGVpZ2h0X3V2ID0gYXZjdHgtPmhlaWdodCAvIDI7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8IDQgfHwgYXZwa3QtPnNpemUgLSA0ID4gSU5UX01BWC84KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYWNrZXQgc2l6ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGJ1ZmZlciAqLworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogU2V0IGZsYWdzICovCisgICAgcGljLT5rZXlfZnJhbWUgPSAxOworICAgIHBpYy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICAvKiBWZXJzaW9uIHNob3VsZCBhbHdheXMgYmUgMSAqLworICAgIHZlcnNpb24gPSBBVl9STDMyKHNyYyk7CisKKyAgICBpZiAodmVyc2lvbiAhPSAxKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgVkJMRSBWZXJzaW9uOiAlZFxuIiwgdmVyc2lvbik7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgc3JjICsgNCwgKGF2cGt0LT5zaXplIC0gNCkgKiA4KTsKKworICAgIC8qIFVucGFjayAqLworICAgIGlmICh2YmxlX3VucGFjayhjdHgsICZnYikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBDb2RlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogUmVzdG9yZSBwbGFuZXMuIFNob3VsZCBiZSBhbG1vc3QgaWRlbnRpY2FsIHRvIEh1ZmZ5dXYncy4gKi8KKyAgICB2YmxlX3Jlc3RvcmVfcGxhbmUoY3R4LCBwaWMsICZnYiwgMCwgb2Zmc2V0LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworCisgICAgLyogQ2hyb21hICovCisgICAgaWYgKCEoY3R4LT5hdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgIG9mZnNldCArPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0OworICAgICAgICB2YmxlX3Jlc3RvcmVfcGxhbmUoY3R4LCBwaWMsICZnYiwgMSwgb2Zmc2V0LCB3aWR0aF91diwgaGVpZ2h0X3V2KTsKKworICAgICAgICBvZmZzZXQgKz0gd2lkdGhfdXYgKiBoZWlnaHRfdXY7CisgICAgICAgIHZibGVfcmVzdG9yZV9wbGFuZShjdHgsIHBpYywgJmdiLCAyLCBvZmZzZXQsIHdpZHRoX3V2LCBoZWlnaHRfdXYpOworICAgIH0KKworICAgICpnb3RfZnJhbWUgICAgICAgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdmJsZV9kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZCTEVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGF2X2ZyZWVwKCZjdHgtPnZhbCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHZibGVfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZCTEVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgLyogU3Rhc2ggZm9yIGxhdGVyIHVzZSAqLworICAgIGN0eC0+YXZjdHggPSBhdmN0eDsKKyAgICBmZl9odWZmeXV2ZHNwX2luaXQoJmN0eC0+aGRzcCk7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDg7CisKKyAgICBjdHgtPnNpemUgPSBhdnBpY3R1cmVfZ2V0X3NpemUoYXZjdHgtPnBpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisKKyAgICBjdHgtPnZhbCA9IGF2X21hbGxvY19hcnJheShjdHgtPnNpemUsIHNpemVvZigqY3R4LT52YWwpKTsKKworICAgIGlmICghY3R4LT52YWwpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgYWxsb2NhdGUgdmFsdWVzIGJ1ZmZlci5cbiIpOworICAgICAgICB2YmxlX2RlY29kZV9jbG9zZShhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfdmJsZV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2YmxlIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVkJMRSBMb3NzbGVzcyBDb2RlYyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WQkxFLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWQkxFQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdmJsZV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB2YmxlX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSB2YmxlX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5NTVmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMS5jCkBAIC0wLDAgKzEsMTcyMCBAQAorLyoKKyAqIFZDLTEgYW5kIFdNVjMgZGVjb2RlciBjb21tb24gY29kZQorICogQ29weXJpZ2h0IChjKSAyMDExIE1hc2hpYXQgU2Fya2VyIFNoYWtraGFyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKiBQYXJ0bHkgYmFzZWQgb24gdmM5LmMgKGMpIDIwMDUgQW5vbnltb3VzLCBBbGV4IEJlcmVnc3phc3ppLCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZDLTEgYW5kIFdNVjMgZGVjb2RlciBjb21tb24gY29kZQorICoKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJ2YzEuaCIKKyNpbmNsdWRlICJ2YzFkYXRhLmgiCisjaW5jbHVkZSAibXNtcGVnNGRhdGEuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorI2luY2x1ZGUgInNpbXBsZV9pZGN0LmgiCisKKyN1bmRlZiBOREVCVUcKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAbmFtZSBWQy0xIEJpdHBsYW5lIGRlY29kaW5nCisgKiBAc2VlIDguNywgcDU2CisgKiBAeworICovCisKKy8qKiBEZWNvZGUgcm93cyBieSBjaGVja2luZyBpZiB0aGV5IGFyZSBza2lwcGVkCisgKiBAcGFyYW0gcGxhbmUgQnVmZmVyIHRvIHN0b3JlIGRlY29kZWQgYml0cworICogQHBhcmFtW2luXSB3aWR0aCBXaWR0aCBvZiB0aGlzIGJ1ZmZlcgorICogQHBhcmFtW2luXSBoZWlnaHQgSGVpZ2h0IG9mIHRoaXMgYnVmZmVyCisgKiBAcGFyYW1baW5dIHN0cmlkZSBvZiB0aGlzIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfcm93c2tpcCh1aW50OF90KiBwbGFuZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaWYgKCFnZXRfYml0czEoZ2IpKSAvL3Jvd3NraXAKKyAgICAgICAgICAgIG1lbXNldChwbGFuZSwgMCwgd2lkdGgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICBwbGFuZVt4XSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIHBsYW5lICs9IHN0cmlkZTsKKyAgICB9Cit9CisKKy8qKiBEZWNvZGUgY29sdW1ucyBieSBjaGVja2luZyBpZiB0aGV5IGFyZSBza2lwcGVkCisgKiBAcGFyYW0gcGxhbmUgQnVmZmVyIHRvIHN0b3JlIGRlY29kZWQgYml0cworICogQHBhcmFtW2luXSB3aWR0aCBXaWR0aCBvZiB0aGlzIGJ1ZmZlcgorICogQHBhcmFtW2luXSBoZWlnaHQgSGVpZ2h0IG9mIHRoaXMgYnVmZmVyCisgKiBAcGFyYW1baW5dIHN0cmlkZSBvZiB0aGlzIGJ1ZmZlcgorICogQHRvZG8gRklYTUU6IE9wdGltaXplCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9jb2xza2lwKHVpbnQ4X3QqIHBsYW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgIGlmICghZ2V0X2JpdHMxKGdiKSkgLy9jb2xza2lwCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgICAgICAgICAgICAgcGxhbmVbeSpzdHJpZGVdID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorICAgICAgICAgICAgICAgIHBsYW5lW3kqc3RyaWRlXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIHBsYW5lICsrOworICAgIH0KK30KKworLyoqIERlY29kZSBhIGJpdHBsYW5lJ3MgYml0cworICogQHBhcmFtIGRhdGEgYml0cGxhbmUgd2hlcmUgdG8gc3RvcmUgdGhlIGRlY29kZSBiaXRzCisgKiBAcGFyYW1bb3V0XSByYXdfZmxhZyBwb2ludGVyIHRvIHRoZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGlzIGJpdHBsYW5lIGlzIG5vdCBjb2RlZCBleHBsaWNpdGx5CisgKiBAcGFyYW0gdiBWQy0xIGNvbnRleHQgZm9yIGJpdCByZWFkaW5nIGFuZCBsb2dnaW5nCisgKiBAcmV0dXJuIFN0YXR1cworICogQHRvZG8gRklYTUU6IE9wdGltaXplCisgKi8KK3N0YXRpYyBpbnQgYml0cGxhbmVfZGVjb2RpbmcodWludDhfdCogZGF0YSwgaW50ICpyYXdfZmxhZywgVkMxQ29udGV4dCAqdikKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZ2LT5zLmdiOworCisgICAgaW50IGltb2RlLCB4LCB5LCBjb2RlLCBvZmZzZXQ7CisgICAgdWludDhfdCBpbnZlcnQsICpwbGFuZXAgPSBkYXRhOworICAgIGludCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGU7CisKKyAgICB3aWR0aCAgPSB2LT5zLm1iX3dpZHRoOworICAgIGhlaWdodCA9IHYtPnMubWJfaGVpZ2h0ID4+IHYtPmZpZWxkX21vZGU7CisgICAgc3RyaWRlID0gdi0+cy5tYl9zdHJpZGU7CisgICAgaW52ZXJ0ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpbW9kZSA9IGdldF92bGMyKGdiLCBmZl92YzFfaW1vZGVfdmxjLnRhYmxlLCBWQzFfSU1PREVfVkxDX0JJVFMsIDEpOworCisgICAgKnJhd19mbGFnID0gMDsKKyAgICBzd2l0Y2ggKGltb2RlKSB7CisgICAgY2FzZSBJTU9ERV9SQVc6CisgICAgICAgIC8vRGF0YSBpcyBhY3R1YWxseSByZWFkIGluIHRoZSBNQiBsYXllciAoc2FtZSBmb3IgYWxsIHRlc3RzID09ICJyYXciKQorICAgICAgICAqcmF3X2ZsYWcgPSAxOyAvL2ludmVydCBpZ25vcmVkCisgICAgICAgIHJldHVybiBpbnZlcnQ7CisgICAgY2FzZSBJTU9ERV9ESUZGMjoKKyAgICBjYXNlIElNT0RFX05PUk0yOgorICAgICAgICBpZiAoKGhlaWdodCAqIHdpZHRoKSAmIDEpIHsKKyAgICAgICAgICAgICpwbGFuZXArKyA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICB5ID0gb2Zmc2V0ID0gMTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIHBsYW5lcCArPSBzdHJpZGUgLSB3aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB5ID0gb2Zmc2V0ID0gMDsKKyAgICAgICAgLy8gZGVjb2RlIGJpdHBsYW5lIGFzIG9uZSBsb25nIGxpbmUKKyAgICAgICAgZm9yICg7IHkgPCBoZWlnaHQgKiB3aWR0aDsgeSArPSAyKSB7CisgICAgICAgICAgICBjb2RlID0gZ2V0X3ZsYzIoZ2IsIGZmX3ZjMV9ub3JtMl92bGMudGFibGUsIFZDMV9OT1JNMl9WTENfQklUUywgMSk7CisgICAgICAgICAgICAqcGxhbmVwKysgPSBjb2RlICYgMTsKKyAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgaWYgKG9mZnNldCA9PSB3aWR0aCkgeworICAgICAgICAgICAgICAgIG9mZnNldCAgPSAwOworICAgICAgICAgICAgICAgIHBsYW5lcCArPSBzdHJpZGUgLSB3aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwbGFuZXArKyA9IGNvZGUgPj4gMTsKKyAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgaWYgKG9mZnNldCA9PSB3aWR0aCkgeworICAgICAgICAgICAgICAgIG9mZnNldCAgPSAwOworICAgICAgICAgICAgICAgIHBsYW5lcCArPSBzdHJpZGUgLSB3aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIElNT0RFX0RJRkY2OgorICAgIGNhc2UgSU1PREVfTk9STTY6CisgICAgICAgIGlmICghKGhlaWdodCAlIDMpICYmICh3aWR0aCAlIDMpKSB7IC8vIHVzZSAyeDMgZGVjb2RpbmcKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IHdpZHRoICYgMTsgeCA8IHdpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IGdldF92bGMyKGdiLCBmZl92YzFfbm9ybTZfdmxjLnRhYmxlLCBWQzFfTk9STTZfVkxDX0JJVFMsIDIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfREVCVUcsICJpbnZhbGlkIE5PUk0tNiBWTENcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBsYW5lcFt4ICsgMF0gICAgICAgICAgICAgID0gKGNvZGUgPj4gMCkgJiAxOworICAgICAgICAgICAgICAgICAgICBwbGFuZXBbeCArIDFdICAgICAgICAgICAgICA9IChjb2RlID4+IDEpICYgMTsKKyAgICAgICAgICAgICAgICAgICAgcGxhbmVwW3ggKyAwICsgc3RyaWRlXSAgICAgPSAoY29kZSA+PiAyKSAmIDE7CisgICAgICAgICAgICAgICAgICAgIHBsYW5lcFt4ICsgMSArIHN0cmlkZV0gICAgID0gKGNvZGUgPj4gMykgJiAxOworICAgICAgICAgICAgICAgICAgICBwbGFuZXBbeCArIDAgKyBzdHJpZGUgKiAyXSA9IChjb2RlID4+IDQpICYgMTsKKyAgICAgICAgICAgICAgICAgICAgcGxhbmVwW3ggKyAxICsgc3RyaWRlICogMl0gPSAoY29kZSA+PiA1KSAmIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBsYW5lcCArPSBzdHJpZGUgKiAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdpZHRoICYgMSkKKyAgICAgICAgICAgICAgICBkZWNvZGVfY29sc2tpcChkYXRhLCAxLCBoZWlnaHQsIHN0cmlkZSwgJnYtPnMuZ2IpOworICAgICAgICB9IGVsc2UgeyAvLyAzeDIKKyAgICAgICAgICAgIHBsYW5lcCArPSAoaGVpZ2h0ICYgMSkgKiBzdHJpZGU7CisgICAgICAgICAgICBmb3IgKHkgPSBoZWlnaHQgJiAxOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSB3aWR0aCAlIDM7IHggPCB3aWR0aDsgeCArPSAzKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBnZXRfdmxjMihnYiwgZmZfdmMxX25vcm02X3ZsYy50YWJsZSwgVkMxX05PUk02X1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiaW52YWxpZCBOT1JNLTYgVkxDXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwbGFuZXBbeCArIDBdICAgICAgICAgID0gKGNvZGUgPj4gMCkgJiAxOworICAgICAgICAgICAgICAgICAgICBwbGFuZXBbeCArIDFdICAgICAgICAgID0gKGNvZGUgPj4gMSkgJiAxOworICAgICAgICAgICAgICAgICAgICBwbGFuZXBbeCArIDJdICAgICAgICAgID0gKGNvZGUgPj4gMikgJiAxOworICAgICAgICAgICAgICAgICAgICBwbGFuZXBbeCArIDAgKyBzdHJpZGVdID0gKGNvZGUgPj4gMykgJiAxOworICAgICAgICAgICAgICAgICAgICBwbGFuZXBbeCArIDEgKyBzdHJpZGVdID0gKGNvZGUgPj4gNCkgJiAxOworICAgICAgICAgICAgICAgICAgICBwbGFuZXBbeCArIDIgKyBzdHJpZGVdID0gKGNvZGUgPj4gNSkgJiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbGFuZXAgKz0gc3RyaWRlICogMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHggPSB3aWR0aCAlIDM7CisgICAgICAgICAgICBpZiAoeCkKKyAgICAgICAgICAgICAgICBkZWNvZGVfY29sc2tpcChkYXRhLCAgICAgICAgICAgICB4LCBoZWlnaHQsIHN0cmlkZSwgJnYtPnMuZ2IpOworICAgICAgICAgICAgaWYgKGhlaWdodCAmIDEpCisgICAgICAgICAgICAgICAgZGVjb2RlX3Jvd3NraXAoZGF0YSArIHgsIHdpZHRoIC0geCwgICAgICAxLCBzdHJpZGUsICZ2LT5zLmdiKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIElNT0RFX1JPV1NLSVA6CisgICAgICAgIGRlY29kZV9yb3dza2lwKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgJnYtPnMuZ2IpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElNT0RFX0NPTFNLSVA6CisgICAgICAgIGRlY29kZV9jb2xza2lwKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgJnYtPnMuZ2IpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBBcHBseWluZyBkaWZmIG9wZXJhdG9yICovCisgICAgaWYgKGltb2RlID09IElNT0RFX0RJRkYyIHx8IGltb2RlID09IElNT0RFX0RJRkY2KSB7CisgICAgICAgIHBsYW5lcCA9IGRhdGE7CisgICAgICAgIHBsYW5lcFswXSBePSBpbnZlcnQ7CisgICAgICAgIGZvciAoeCA9IDE7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgcGxhbmVwW3hdIF49IHBsYW5lcFt4LTFdOworICAgICAgICBmb3IgKHkgPSAxOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIHBsYW5lcCArPSBzdHJpZGU7CisgICAgICAgICAgICBwbGFuZXBbMF0gXj0gcGxhbmVwWy1zdHJpZGVdOworICAgICAgICAgICAgZm9yICh4ID0gMTsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGxhbmVwW3gtMV0gIT0gcGxhbmVwW3gtc3RyaWRlXSkgcGxhbmVwW3hdIF49IGludmVydDsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVwW3hdIF49IHBsYW5lcFt4LTFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpbnZlcnQpIHsKKyAgICAgICAgcGxhbmVwID0gZGF0YTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHN0cmlkZSAqIGhlaWdodDsgeCsrKQorICAgICAgICAgICAgcGxhbmVwW3hdID0gIXBsYW5lcFt4XTsgLy9GSVhNRSBzdHJpZGUKKyAgICB9CisgICAgcmV0dXJuIChpbW9kZSA8PCAxKSArIGludmVydDsKK30KKworLyoqIEB9ICovIC8vQml0cGxhbmUgZ3JvdXAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFZPUCBEcXVhbnQgZGVjb2RpbmcKKyAqIEBwYXJhbSB2IFZDLTEgQ29udGV4dAorICovCitzdGF0aWMgaW50IHZvcF9kcXVhbnRfZGVjb2RpbmcoVkMxQ29udGV4dCAqdikKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZ2LT5zLmdiOworICAgIGludCBwcWRpZmY7CisKKyAgICAvL3ZhcmlhYmxlIHNpemUKKyAgICBpZiAodi0+ZHF1YW50ID09IDIpIHsKKyAgICAgICAgcHFkaWZmID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICBpZiAocHFkaWZmID09IDcpCisgICAgICAgICAgICB2LT5hbHRwcSA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdi0+YWx0cHEgPSB2LT5wcSArIHBxZGlmZiArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdi0+ZHF1YW50ZnJtID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKHYtPmRxdWFudGZybSkgeworICAgICAgICAgICAgdi0+ZHFwcm9maWxlID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgc3dpdGNoICh2LT5kcXByb2ZpbGUpIHsKKyAgICAgICAgICAgIGNhc2UgRFFQUk9GSUxFX1NJTkdMRV9FREdFOgorICAgICAgICAgICAgY2FzZSBEUVBST0ZJTEVfRE9VQkxFX0VER0VTOgorICAgICAgICAgICAgICAgIHYtPmRxc2JlZGdlID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEUVBST0ZJTEVfQUxMX01CUzoKKyAgICAgICAgICAgICAgICB2LT5kcWJpbGV2ZWwgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIGlmICghdi0+ZHFiaWxldmVsKQorICAgICAgICAgICAgICAgICAgICB2LT5oYWxmcHEgPSAwOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsgLy9Gb3JiaWRkZW4gPworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHYtPmRxYmlsZXZlbCB8fCB2LT5kcXByb2ZpbGUgIT0gRFFQUk9GSUxFX0FMTF9NQlMpIHsKKyAgICAgICAgICAgICAgICBwcWRpZmYgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgICAgICAgICAgICAgaWYgKHBxZGlmZiA9PSA3KQorICAgICAgICAgICAgICAgICAgICB2LT5hbHRwcSA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHYtPmFsdHBxID0gdi0+cHEgKyBwcWRpZmYgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9zZXF1ZW5jZV9oZWFkZXJfYWR2KFZDMUNvbnRleHQgKnYsIEdldEJpdENvbnRleHQgKmdiKTsKKworLyoqCisgKiBEZWNvZGUgU2ltcGxlL01haW4gUHJvZmlsZXMgc2VxdWVuY2UgaGVhZGVyCisgKiBAc2VlIEZpZ3VyZSA3LTgsIHAxNi0xNworICogQHBhcmFtIGF2Y3R4IENvZGVjIGNvbnRleHQKKyAqIEBwYXJhbSBnYiBHZXRCaXQgY29udGV4dCBpbml0aWFsaXplZCBmcm9tIENvZGVjIGNvbnRleHQgZXh0cmFfZGF0YQorICogQHJldHVybiBTdGF0dXMKKyAqLworaW50IGZmX3ZjMV9kZWNvZGVfc2VxdWVuY2VfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVkMxQ29udGV4dCAqdiwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJIZWFkZXI6ICUwWFxuIiwgc2hvd19iaXRzX2xvbmcoZ2IsIDMyKSk7CisgICAgdi0+cHJvZmlsZSA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICBpZiAodi0+cHJvZmlsZSA9PSBQUk9GSUxFX0NPTVBMRVgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIldNVjMgQ29tcGxleCBQcm9maWxlIGlzIG5vdCBmdWxseSBzdXBwb3J0ZWRcbiIpOworICAgIH0KKworICAgIGlmICh2LT5wcm9maWxlID09IFBST0ZJTEVfQURWQU5DRUQpIHsKKyAgICAgICAgdi0+enpfOHg0ID0gZmZfdmMxX2Fkdl9wcm9ncmVzc2l2ZV84eDRfeno7CisgICAgICAgIHYtPnp6XzR4OCA9IGZmX3ZjMV9hZHZfcHJvZ3Jlc3NpdmVfNHg4X3p6OworICAgICAgICByZXR1cm4gZGVjb2RlX3NlcXVlbmNlX2hlYWRlcl9hZHYodiwgZ2IpOworICAgIH0gZWxzZSB7CisgICAgICAgIHYtPmNocm9tYWZvcm1hdCA9IDE7CisgICAgICAgIHYtPnp6Xzh4NCA9IGZmX3dtdjJfc2NhbnRhYmxlQTsKKyAgICAgICAgdi0+enpfNHg4ID0gZmZfd212Ml9zY2FudGFibGVCOworICAgICAgICB2LT5yZXNfeTQxMSAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgdi0+cmVzX3Nwcml0ZSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIGlmICh2LT5yZXNfeTQxMSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIk9sZCBpbnRlcmxhY2VkIG1vZGUgaXMgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAoZnBzLTIpLzQgKC0+MzApCisgICAgdi0+ZnJtcnRxX3Bvc3Rwcm9jID0gZ2V0X2JpdHMoZ2IsIDMpOyAvL2NvbW1vbgorICAgIC8vIChiaXRyYXRlLTMya2JwcykvNjRrYnBzCisgICAgdi0+Yml0cnRxX3Bvc3Rwcm9jID0gZ2V0X2JpdHMoZ2IsIDUpOyAvL2NvbW1vbgorICAgIHYtPnMubG9vcF9maWx0ZXIgICA9IGdldF9iaXRzMShnYik7IC8vY29tbW9uCisgICAgaWYgKHYtPnMubG9vcF9maWx0ZXIgPT0gMSAmJiB2LT5wcm9maWxlID09IFBST0ZJTEVfU0lNUExFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkxPT1BGSUxURVIgc2hhbGwgbm90IGJlIGVuYWJsZWQgaW4gU2ltcGxlIFByb2ZpbGVcbiIpOworICAgIH0KKyAgICBpZiAodi0+cy5hdmN0eC0+c2tpcF9sb29wX2ZpbHRlciA+PSBBVkRJU0NBUkRfQUxMKQorICAgICAgICB2LT5zLmxvb3BfZmlsdGVyID0gMDsKKworICAgIHYtPnJlc194OCAgICAgICAgICA9IGdldF9iaXRzMShnYik7IC8vcmVzZXJ2ZWQKKyAgICB2LT5tdWx0aXJlcyAgICAgICAgPSBnZXRfYml0czEoZ2IpOworICAgIHYtPnJlc19mYXN0dHggICAgICA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKCF2LT5yZXNfZmFzdHR4KSB7CisgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzh4OCAgICA9IGZmX3NpbXBsZV9pZGN0Xzg7CisgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzh4NCAgICA9IGZmX3NpbXBsZV9pZGN0ODRfYWRkOworICAgICAgICB2LT52YzFkc3AudmMxX2ludl90cmFuc180eDggICAgPSBmZl9zaW1wbGVfaWRjdDQ4X2FkZDsKKyAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfNHg0ICAgID0gZmZfc2ltcGxlX2lkY3Q0NF9hZGQ7CisgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzh4OF9kYyA9IGZmX3NpbXBsZV9pZGN0X2FkZF84OworICAgICAgICB2LT52YzFkc3AudmMxX2ludl90cmFuc184eDRfZGMgPSBmZl9zaW1wbGVfaWRjdDg0X2FkZDsKKyAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfNHg4X2RjID0gZmZfc2ltcGxlX2lkY3Q0OF9hZGQ7CisgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzR4NF9kYyA9IGZmX3NpbXBsZV9pZGN0NDRfYWRkOworICAgIH0KKworICAgIHYtPmZhc3R1dm1jICAgICAgICA9IGdldF9iaXRzMShnYik7IC8vY29tbW9uCisgICAgaWYgKCF2LT5wcm9maWxlICYmICF2LT5mYXN0dXZtYykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGQVNUVVZNQyB1bmF2YWlsYWJsZSBpbiBTaW1wbGUgUHJvZmlsZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdi0+ZXh0ZW5kZWRfbXYgICAgID0gZ2V0X2JpdHMxKGdiKTsgLy9jb21tb24KKyAgICBpZiAoIXYtPnByb2ZpbGUgJiYgdi0+ZXh0ZW5kZWRfbXYpCisgICAgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJFeHRlbmRlZCBNVnMgdW5hdmFpbGFibGUgaW4gU2ltcGxlIFByb2ZpbGVcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHYtPmRxdWFudCAgICAgICAgICA9IGdldF9iaXRzKGdiLCAyKTsgLy9jb21tb24KKyAgICB2LT52c3RyYW5zZm9ybSAgICAgPSBnZXRfYml0czEoZ2IpOyAvL2NvbW1vbgorCisgICAgdi0+cmVzX3RyYW5zdGFiICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAodi0+cmVzX3RyYW5zdGFiKQorICAgIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiMSBmb3IgcmVzZXJ2ZWQgUkVTX1RSQU5TVEFCIGlzIGZvcmJpZGRlblxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB2LT5vdmVybGFwICAgICAgICAgPSBnZXRfYml0czEoZ2IpOyAvL2NvbW1vbgorCisgICAgdi0+cmVzeW5jX21hcmtlciAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB2LT5yYW5nZXJlZCAgICAgICAgPSBnZXRfYml0czEoZ2IpOworICAgIGlmICh2LT5yYW5nZXJlZCAmJiB2LT5wcm9maWxlID09IFBST0ZJTEVfU0lNUExFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAiUkFOR0VSRUQgc2hvdWxkIGJlIHNldCB0byAwIGluIFNpbXBsZSBQcm9maWxlXG4iKTsKKyAgICB9CisKKyAgICB2LT5zLm1heF9iX2ZyYW1lcyA9IGF2Y3R4LT5tYXhfYl9mcmFtZXMgPSBnZXRfYml0cyhnYiwgMyk7IC8vY29tbW9uCisgICAgdi0+cXVhbnRpemVyX21vZGUgPSBnZXRfYml0cyhnYiwgMik7IC8vY29tbW9uCisKKyAgICB2LT5maW50ZXJwZmxhZyA9IGdldF9iaXRzMShnYik7IC8vY29tbW9uCisKKyAgICBpZiAodi0+cmVzX3Nwcml0ZSkgeworICAgICAgICBpbnQgdyA9IGdldF9iaXRzKGdiLCAxMSk7CisgICAgICAgIGludCBoID0gZ2V0X2JpdHMoZ2IsIDExKTsKKyAgICAgICAgaW50IHJldCA9IGZmX3NldF9kaW1lbnNpb25zKHYtPnMuYXZjdHgsIHcsIGgpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGRpbWVuc2lvbnMgJWQgJWRcbiIsIHcsIGgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBza2lwX2JpdHMoZ2IsIDUpOyAvL2ZyYW1lIHJhdGUKKyAgICAgICAgdi0+cmVzX3g4ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsgLy8gc29tZXRoaW5nIHRvIGRvIHdpdGggREMgVkxDIHNlbGVjdGlvbgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBzcHJpdGUgZmVhdHVyZVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc2tpcF9iaXRzKGdiLCAzKTsgLy9zbGljZSBjb2RlCisgICAgICAgIHYtPnJlc19ydG1fZmxhZyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdi0+cmVzX3J0bV9mbGFnID0gZ2V0X2JpdHMxKGdiKTsgLy9yZXNlcnZlZAorICAgIH0KKyAgICBpZiAoIXYtPnJlc19ydG1fZmxhZykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJPbGQgV01WMyB2ZXJzaW9uIGRldGVjdGVkLCBzb21lIGZyYW1lcyBtYXkgYmUgZGVjb2RlZCBpbmNvcnJlY3RseVxuIik7CisgICAgICAgIC8vcmV0dXJuIC0xOworICAgIH0KKyAgICAvL1RPRE86IGZpZ3VyZSBvdXQgd2hhdCB0aGV5IG1lYW4gKGFsd2F5cyAweDQwMkYpCisgICAgaWYgKCF2LT5yZXNfZmFzdHR4KQorICAgICAgICBza2lwX2JpdHMoZ2IsIDE2KTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgIlByb2ZpbGUgJWk6XG5mcm1ydHFfcG9zdHByb2M9JWksIGJpdHJ0cV9wb3N0cHJvYz0laVxuIgorICAgICAgICAgICAiTG9vcEZpbHRlcj0laSwgTXVsdGlSZXM9JWksIEZhc3RVVk1DPSVpLCBFeHRlbmRlZCBNVj0laVxuIgorICAgICAgICAgICAiUmFuZ2VyZWQ9JWksIFZTVHJhbnNmb3JtPSVpLCBPdmVybGFwPSVpLCBTeW5jTWFya2VyPSVpXG4iCisgICAgICAgICAgICJEUXVhbnQ9JWksIFF1YW50aXplciBtb2RlPSVpLCBNYXggQiBmcmFtZXM9JWlcbiIsCisgICAgICAgICAgIHYtPnByb2ZpbGUsIHYtPmZybXJ0cV9wb3N0cHJvYywgdi0+Yml0cnRxX3Bvc3Rwcm9jLAorICAgICAgICAgICB2LT5zLmxvb3BfZmlsdGVyLCB2LT5tdWx0aXJlcywgdi0+ZmFzdHV2bWMsIHYtPmV4dGVuZGVkX212LAorICAgICAgICAgICB2LT5yYW5nZXJlZCwgdi0+dnN0cmFuc2Zvcm0sIHYtPm92ZXJsYXAsIHYtPnJlc3luY19tYXJrZXIsCisgICAgICAgICAgIHYtPmRxdWFudCwgdi0+cXVhbnRpemVyX21vZGUsIGF2Y3R4LT5tYXhfYl9mcmFtZXMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9zZXF1ZW5jZV9oZWFkZXJfYWR2KFZDMUNvbnRleHQgKnYsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIHYtPnJlc19ydG1fZmxhZyA9IDE7CisgICAgdi0+bGV2ZWwgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgaWYgKHYtPmxldmVsID49IDUpIHsKKyAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19FUlJPUiwgIlJlc2VydmVkIExFVkVMICVpXG4iLHYtPmxldmVsKTsKKyAgICB9CisgICAgdi0+Y2hyb21hZm9ybWF0ID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgIGlmICh2LT5jaHJvbWFmb3JtYXQgIT0gMSkgeworICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk9ubHkgNDoyOjAgY2hyb21hIGZvcm1hdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gKGZwcy0yKS80ICgtPjMwKQorICAgIHYtPmZybXJ0cV9wb3N0cHJvYyAgICAgICA9IGdldF9iaXRzKGdiLCAzKTsgLy9jb21tb24KKyAgICAvLyAoYml0cmF0ZS0zMmticHMpLzY0a2JwcworICAgIHYtPmJpdHJ0cV9wb3N0cHJvYyAgICAgICA9IGdldF9iaXRzKGdiLCA1KTsgLy9jb21tb24KKyAgICB2LT5wb3N0cHJvY2ZsYWcgICAgICAgICAgPSBnZXRfYml0czEoZ2IpOyAgIC8vY29tbW9uCisKKyAgICB2LT5tYXhfY29kZWRfd2lkdGggICAgICAgPSAoZ2V0X2JpdHMoZ2IsIDEyKSArIDEpIDw8IDE7CisgICAgdi0+bWF4X2NvZGVkX2hlaWdodCAgICAgID0gKGdldF9iaXRzKGdiLCAxMikgKyAxKSA8PCAxOworICAgIHYtPmJyb2FkY2FzdCAgICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CisgICAgdi0+aW50ZXJsYWNlICAgICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB2LT50ZmNudHJmbGFnICAgICAgICAgICAgPSBnZXRfYml0czEoZ2IpOworICAgIHYtPmZpbnRlcnBmbGFnICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CisgICAgc2tpcF9iaXRzMShnYik7IC8vIHJlc2VydmVkCisKKyAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAiQWR2YW5jZWQgUHJvZmlsZSBsZXZlbCAlaTpcbmZybXJ0cV9wb3N0cHJvYz0laSwgYml0cnRxX3Bvc3Rwcm9jPSVpXG4iCisgICAgICAgICAgICJMb29wRmlsdGVyPSVpLCBDaHJvbWFGb3JtYXQ9JWksIFB1bGxkb3duPSVpLCBJbnRlcmxhY2U6ICVpXG4iCisgICAgICAgICAgICJURkNUUmZsYWc9JWksIEZJTlRFUlBmbGFnPSVpXG4iLAorICAgICAgICAgICB2LT5sZXZlbCwgdi0+ZnJtcnRxX3Bvc3Rwcm9jLCB2LT5iaXRydHFfcG9zdHByb2MsCisgICAgICAgICAgIHYtPnMubG9vcF9maWx0ZXIsIHYtPmNocm9tYWZvcm1hdCwgdi0+YnJvYWRjYXN0LCB2LT5pbnRlcmxhY2UsCisgICAgICAgICAgIHYtPnRmY250cmZsYWcsIHYtPmZpbnRlcnBmbGFnKTsKKworICAgIHYtPnBzZiA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKHYtPnBzZikgeyAvL1BzRiwgNi4xLjEzCisgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcm9ncmVzc2l2ZSBTZWdtZW50ZWQgRnJhbWUgbW9kZTogbm90IHN1cHBvcnRlZCAoeWV0KVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdi0+cy5tYXhfYl9mcmFtZXMgPSB2LT5zLmF2Y3R4LT5tYXhfYl9mcmFtZXMgPSA3OworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7IC8vRGlzcGxheSBJbmZvIC0gZGVjb2RpbmcgaXMgbm90IGFmZmVjdGVkIGJ5IGl0CisgICAgICAgIGludCB3LCBoLCBhciA9IDA7CisgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfREVCVUcsICJEaXNwbGF5IGV4dGVuZGVkIGluZm86XG4iKTsKKyAgICAgICAgdyA9IGdldF9iaXRzKGdiLCAxNCkgKyAxOworICAgICAgICBoID0gZ2V0X2JpdHMoZ2IsIDE0KSArIDE7CisgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfREVCVUcsICJEaXNwbGF5IGRpbWVuc2lvbnM6ICVpeCVpXG4iLCB3LCBoKTsKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpCisgICAgICAgICAgICBhciA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgaWYgKGFyICYmIGFyIDwgMTQpIHsKKyAgICAgICAgICAgIHYtPnMuYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBmZl92YzFfcGl4ZWxfYXNwZWN0W2FyXTsKKyAgICAgICAgfSBlbHNlIGlmIChhciA9PSAxNSkgeworICAgICAgICAgICAgdyA9IGdldF9iaXRzKGdiLCA4KSArIDE7CisgICAgICAgICAgICBoID0gZ2V0X2JpdHMoZ2IsIDgpICsgMTsKKyAgICAgICAgICAgIHYtPnMuYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7dywgaH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9yZWR1Y2UoJnYtPnMuYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgICAgICZ2LT5zLmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICB2LT5zLmF2Y3R4LT5oZWlnaHQgKiB3LAorICAgICAgICAgICAgICAgICAgICAgIHYtPnMuYXZjdHgtPndpZHRoICogaCwKKyAgICAgICAgICAgICAgICAgICAgICAxIDw8IDMwKTsKKyAgICAgICAgfQorICAgICAgICBmZl9zZXRfc2FyKHYtPnMuYXZjdHgsIHYtPnMuYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiQXNwZWN0OiAlaTolaVxuIiwKKyAgICAgICAgICAgICAgIHYtPnMuYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgdi0+cy5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworCisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7IC8vZnJhbWVyYXRlIHN0dWZmCisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgICAgIHYtPnMuYXZjdHgtPmZyYW1lcmF0ZS5kZW4gPSAzMjsKKyAgICAgICAgICAgICAgICB2LT5zLmF2Y3R4LT5mcmFtZXJhdGUubnVtID0gZ2V0X2JpdHMoZ2IsIDE2KSArIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBuciwgZHI7CisgICAgICAgICAgICAgICAgbnIgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHIgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgICAgICAgICAgaWYgKG5yID4gMCAmJiBuciA8IDggJiYgZHIgPiAwICYmIGRyIDwgMykgeworICAgICAgICAgICAgICAgICAgICB2LT5zLmF2Y3R4LT5mcmFtZXJhdGUuZGVuID0gZmZfdmMxX2Zwc19kcltkciAtIDFdOworICAgICAgICAgICAgICAgICAgICB2LT5zLmF2Y3R4LT5mcmFtZXJhdGUubnVtID0gZmZfdmMxX2Zwc19ucltuciAtIDFdICogMTAwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodi0+YnJvYWRjYXN0KSB7IC8vIFB1bGxkb3duIG1heSBiZSBwcmVzZW50CisgICAgICAgICAgICAgICAgdi0+cy5hdmN0eC0+dGlja3NfcGVyX2ZyYW1lID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICB2LT5jb2xvcl9wcmltICAgID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgdi0+dHJhbnNmZXJfY2hhciA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIHYtPm1hdHJpeF9jb2VmICAgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2LT5ocmRfcGFyYW1fZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKHYtPmhyZF9wYXJhbV9mbGFnKSB7CisgICAgICAgIGludCBpOworICAgICAgICB2LT5ocmRfbnVtX2xlYWt5X2J1Y2tldHMgPSBnZXRfYml0cyhnYiwgNSk7CisgICAgICAgIHNraXBfYml0cyhnYiwgNCk7IC8vYml0cmF0ZSBleHBvbmVudAorICAgICAgICBza2lwX2JpdHMoZ2IsIDQpOyAvL2J1ZmZlciBzaXplIGV4cG9uZW50CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2LT5ocmRfbnVtX2xlYWt5X2J1Y2tldHM7IGkrKykgeworICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxNik7IC8vaHJkX3JhdGVbbl0KKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTYpOyAvL2hyZF9idWZmZXJbbl0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3ZjMV9kZWNvZGVfZW50cnlfcG9pbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWQzFDb250ZXh0ICp2LCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgdyxoOworICAgIGludCByZXQ7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkVudHJ5IHBvaW50OiAlMDhYXG4iLCBzaG93X2JpdHNfbG9uZyhnYiwgMzIpKTsKKyAgICB2LT5icm9rZW5fbGluayAgICA9IGdldF9iaXRzMShnYik7CisgICAgdi0+Y2xvc2VkX2VudHJ5ICAgPSBnZXRfYml0czEoZ2IpOworICAgIHYtPnBhbnNjYW5mbGFnICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB2LT5yZWZkaXN0X2ZsYWcgICA9IGdldF9iaXRzMShnYik7CisgICAgdi0+cy5sb29wX2ZpbHRlciAgPSBnZXRfYml0czEoZ2IpOworICAgIGlmICh2LT5zLmF2Y3R4LT5za2lwX2xvb3BfZmlsdGVyID49IEFWRElTQ0FSRF9BTEwpCisgICAgICAgIHYtPnMubG9vcF9maWx0ZXIgPSAwOworICAgIHYtPmZhc3R1dm1jICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB2LT5leHRlbmRlZF9tdiAgICA9IGdldF9iaXRzMShnYik7CisgICAgdi0+ZHF1YW50ICAgICAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgdi0+dnN0cmFuc2Zvcm0gICAgPSBnZXRfYml0czEoZ2IpOworICAgIHYtPm92ZXJsYXAgICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB2LT5xdWFudGl6ZXJfbW9kZSA9IGdldF9iaXRzKGdiLCAyKTsKKworICAgIGlmICh2LT5ocmRfcGFyYW1fZmxhZykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdi0+aHJkX251bV9sZWFreV9idWNrZXRzOyBpKyspIHsKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgOCk7IC8vaHJkX2Z1bGxbbl0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGdldF9iaXRzMShnYikpeworICAgICAgICB3ID0gKGdldF9iaXRzKGdiLCAxMikrMSk8PDE7CisgICAgICAgIGggPSAoZ2V0X2JpdHMoZ2IsIDEyKSsxKTw8MTsKKyAgICB9IGVsc2UgeworICAgICAgICB3ID0gdi0+bWF4X2NvZGVkX3dpZHRoOworICAgICAgICBoID0gdi0+bWF4X2NvZGVkX2hlaWdodDsKKyAgICB9CisgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgdywgaCkpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQgZGltZW5zaW9ucyAlZCAlZFxuIiwgdywgaCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKHYtPmV4dGVuZGVkX212KQorICAgICAgICB2LT5leHRlbmRlZF9kbXYgPSBnZXRfYml0czEoZ2IpOworICAgIGlmICgodi0+cmFuZ2VfbWFweV9mbGFnID0gZ2V0X2JpdHMxKGdiKSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJMdW1hIHNjYWxpbmcgaXMgbm90IHN1cHBvcnRlZCwgZXhwZWN0IHdyb25nIHBpY3R1cmVcbiIpOworICAgICAgICB2LT5yYW5nZV9tYXB5ID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgIH0KKyAgICBpZiAoKHYtPnJhbmdlX21hcHV2X2ZsYWcgPSBnZXRfYml0czEoZ2IpKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNocm9tYSBzY2FsaW5nIGlzIG5vdCBzdXBwb3J0ZWQsIGV4cGVjdCB3cm9uZyBwaWN0dXJlXG4iKTsKKyAgICAgICAgdi0+cmFuZ2VfbWFwdXYgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgfQorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJFbnRyeSBwb2ludCBpbmZvOlxuIgorICAgICAgICAgICAiQnJva2VuTGluaz0laSwgQ2xvc2VkRW50cnk9JWksIFBhbnNjYW5GbGFnPSVpXG4iCisgICAgICAgICAgICJSZWZEaXN0PSVpLCBQb3N0cHJvYz0laSwgRmFzdFVWTUM9JWksIEV4dE1WPSVpXG4iCisgICAgICAgICAgICJEUXVhbnQ9JWksIFZTVHJhbnNmb3JtPSVpLCBPdmVybGFwPSVpLCBRbW9kZT0laVxuIiwKKyAgICAgICAgICAgdi0+YnJva2VuX2xpbmssIHYtPmNsb3NlZF9lbnRyeSwgdi0+cGFuc2NhbmZsYWcsIHYtPnJlZmRpc3RfZmxhZywgdi0+cy5sb29wX2ZpbHRlciwKKyAgICAgICAgICAgdi0+ZmFzdHV2bWMsIHYtPmV4dGVuZGVkX212LCB2LT5kcXVhbnQsIHYtPnZzdHJhbnNmb3JtLCB2LT5vdmVybGFwLCB2LT5xdWFudGl6ZXJfbW9kZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogZmlsbCBsb29rdXAgdGFibGVzIGZvciBpbnRlbnNpdHkgY29tcGVuc2F0aW9uICovCisjZGVmaW5lIElOSVRfTFVUKGx1bXNjYWxlLCBsdW1zaGlmdCwgbHV0eSwgbHV0dXYsIGNoYWluKSBkbyB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzY2FsZSwgc2hpZnQsIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghbHVtc2NhbGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzY2FsZSA9IC02NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaGlmdCA9ICgyNTUgLSBsdW1zaGlmdCAqIDIpIDw8IDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobHVtc2hpZnQgPiAzMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc2hpZnQgKz0gMTI4IDw8IDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzY2FsZSA9IGx1bXNjYWxlICsgMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobHVtc2hpZnQgPiAzMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc2hpZnQgPSAobHVtc2hpZnQgLSA2NCkgPDwgNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc2hpZnQgPSBsdW1zaGlmdCA8PCA2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXkgPSBjaGFpbiA/IGx1dHlbaV0gIDogaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXUgPSBjaGFpbiA/IGx1dHV2W2ldIDogaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsdXR5W2ldICA9IGF2X2NsaXBfdWludDgoKHNjYWxlICogaXkgKyBzaGlmdCArIDMyKSA+PiA2KTsgICAgICAgICBcCisgICAgICAgICAgICBsdXR1dltpXSA9IGF2X2NsaXBfdWludDgoKHNjYWxlICogKGl1IC0gMTI4KSArIDEyOCo2NCArIDMyKSA+PiA2KTtcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorCitzdGF0aWMgdm9pZCByb3RhdGVfbHV0cyhWQzFDb250ZXh0ICp2KQoreworI2RlZmluZSBST1RBVEUoREVGLCBMLCBOLCBDLCBBKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQkkgfHwgdi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsgXAorICAgICAgICAgICAgQyA9IEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIERFRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbWVtY3B5KCZ0bXAsIEwgICAsIHNpemVvZih0bXApKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtZW1jcHkoTCAgICwgTiAgICwgc2l6ZW9mKHRtcCkpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1lbWNweShOICAgLCAmdG1wLCBzaXplb2YodG1wKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQyA9IE47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKKyAgICBST1RBVEUoaW50IHRtcCwgICAgICAgICAgICAgJnYtPmxhc3RfdXNlX2ljLCAmdi0+bmV4dF91c2VfaWMsIHYtPmN1cnJfdXNlX2ljLCAmdi0+YXV4X3VzZV9pYyk7CisgICAgUk9UQVRFKHVpbnQ4X3QgdG1wWzJdWzI1Nl0sIHYtPmxhc3RfbHV0eSwgICB2LT5uZXh0X2x1dHksICAgdi0+Y3Vycl9sdXR5LCAgIHYtPmF1eF9sdXR5KTsKKyAgICBST1RBVEUodWludDhfdCB0bXBbMl1bMjU2XSwgdi0+bGFzdF9sdXR1diwgIHYtPm5leHRfbHV0dXYsICB2LT5jdXJyX2x1dHV2LCAgdi0+YXV4X2x1dHV2KTsKKworICAgIElOSVRfTFVUKDMyLCAwLCB2LT5jdXJyX2x1dHlbMF0sIHYtPmN1cnJfbHV0dXZbMF0sIDApOworICAgIElOSVRfTFVUKDMyLCAwLCB2LT5jdXJyX2x1dHlbMV0sIHYtPmN1cnJfbHV0dXZbMV0sIDApOworICAgICp2LT5jdXJyX3VzZV9pYyA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9iZnJhY3Rpb24oVkMxQ29udGV4dCAqdiwgR2V0Qml0Q29udGV4dCogZ2IpIHsKKyAgICBpbnQgYmZyYWN0aW9uX2x1dF9pbmRleCA9IGdldF92bGMyKGdiLCBmZl92YzFfYmZyYWN0aW9uX3ZsYy50YWJsZSwgVkMxX0JGUkFDVElPTl9WTENfQklUUywgMSk7CisKKyAgICBpZiAoYmZyYWN0aW9uX2x1dF9pbmRleCA9PSAyMSB8fCBiZnJhY3Rpb25fbHV0X2luZGV4IDwgMCkgeworICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYmZyYWN0aW9uIGludmFsaWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgdi0+YmZyYWN0aW9uX2x1dF9pbmRleCA9IGJmcmFjdGlvbl9sdXRfaW5kZXg7CisgICAgdi0+YmZyYWN0aW9uICAgICAgICAgICA9IGZmX3ZjMV9iZnJhY3Rpb25fbHV0W3YtPmJmcmFjdGlvbl9sdXRfaW5kZXhdOworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfdmMxX3BhcnNlX2ZyYW1lX2hlYWRlcihWQzFDb250ZXh0ICp2LCBHZXRCaXRDb250ZXh0KiBnYikKK3sKKyAgICBpbnQgcHFpbmRleCwgbG93cXVhbnQsIHN0YXR1czsKKworICAgIHYtPmZpZWxkX21vZGUgPSAwOworICAgIHYtPmZjbSA9IDA7CisgICAgaWYgKHYtPmZpbnRlcnBmbGFnKQorICAgICAgICB2LT5pbnRlcnBmcm0gPSBnZXRfYml0czEoZ2IpOworICAgIGlmICghdi0+cy5hdmN0eC0+Y29kZWMpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAodi0+cy5hdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVNTMikKKyAgICAgICAgdi0+cmVzcGljICAgPQorICAgICAgICB2LT5yYW5nZXJlZCA9CisgICAgICAgIHYtPm11bHRpcmVzID0gZ2V0X2JpdHMoZ2IsIDIpID09IDE7CisgICAgZWxzZQorICAgICAgICBza2lwX2JpdHMoZ2IsIDIpOyAvL2ZyYW1lY250IHVudXNlZAorICAgIHYtPnJhbmdlcmVkZnJtID0gMDsKKyAgICBpZiAodi0+cmFuZ2VyZWQpCisgICAgICAgIHYtPnJhbmdlcmVkZnJtID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB2LT5zLnBpY3RfdHlwZSA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKHYtPnMuYXZjdHgtPm1heF9iX2ZyYW1lcykgeworICAgICAgICBpZiAoIXYtPnMucGljdF90eXBlKSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgICAgICAgICB2LT5zLnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYtPnMucGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0I7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdi0+cy5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICB9IGVsc2UKKyAgICAgICAgdi0+cy5waWN0X3R5cGUgPSB2LT5zLnBpY3RfdHlwZSA/IEFWX1BJQ1RVUkVfVFlQRV9QIDogQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICB2LT5iaV90eXBlID0gMDsKKyAgICBpZiAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgaWYgKHJlYWRfYmZyYWN0aW9uKHYsIGdiKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKHYtPmJmcmFjdGlvbiA9PSAwKSB7CisgICAgICAgICAgICB2LT5zLnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9CSTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgfHwgdi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0JJKQorICAgICAgICBza2lwX2JpdHMoZ2IsIDcpOyAvLyBza2lwIGJ1ZmZlciBmdWxsbmVzcworCisgICAgaWYgKHYtPnBhcnNlX29ubHkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogY2FsY3VsYXRlIFJORCAqLworICAgIGlmICh2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSB8fCB2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQkkpCisgICAgICAgIHYtPnJuZCA9IDE7CisgICAgaWYgKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKQorICAgICAgICB2LT5ybmQgXj0gMTsKKworICAgIC8qIFF1YW50aXplciBzdHVmZiAqLworICAgIHBxaW5kZXggPSBnZXRfYml0cyhnYiwgNSk7CisgICAgaWYgKCFwcWluZGV4KQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHYtPnF1YW50aXplcl9tb2RlID09IFFVQU5UX0ZSQU1FX0lNUExJQ0lUKQorICAgICAgICB2LT5wcSA9IGZmX3ZjMV9wcXVhbnRfdGFibGVbMF1bcHFpbmRleF07CisgICAgZWxzZQorICAgICAgICB2LT5wcSA9IGZmX3ZjMV9wcXVhbnRfdGFibGVbMV1bcHFpbmRleF07CisKKyAgICB2LT5wcXVhbnRpemVyID0gMTsKKyAgICBpZiAodi0+cXVhbnRpemVyX21vZGUgPT0gUVVBTlRfRlJBTUVfSU1QTElDSVQpCisgICAgICAgIHYtPnBxdWFudGl6ZXIgPSBwcWluZGV4IDwgOTsKKyAgICBpZiAodi0+cXVhbnRpemVyX21vZGUgPT0gUVVBTlRfTk9OX1VOSUZPUk0pCisgICAgICAgIHYtPnBxdWFudGl6ZXIgPSAwOworICAgIHYtPnBxaW5kZXggPSBwcWluZGV4OworICAgIGlmIChwcWluZGV4IDwgOSkKKyAgICAgICAgdi0+aGFsZnBxID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBlbHNlCisgICAgICAgIHYtPmhhbGZwcSA9IDA7CisgICAgaWYgKHYtPnF1YW50aXplcl9tb2RlID09IFFVQU5UX0ZSQU1FX0VYUExJQ0lUKQorICAgICAgICB2LT5wcXVhbnRpemVyID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB2LT5kcXVhbnRmcm0gPSAwOworICAgIGlmICh2LT5leHRlbmRlZF9tdiA9PSAxKQorICAgICAgICB2LT5tdnJhbmdlID0gZ2V0X3VuYXJ5KGdiLCAwLCAzKTsKKyAgICB2LT5rX3ggPSB2LT5tdnJhbmdlICsgOSArICh2LT5tdnJhbmdlID4+IDEpOyAvL2tfeCBjYW4gYmUgOSAxMCAxMiAxMworICAgIHYtPmtfeSA9IHYtPm12cmFuZ2UgKyA4OyAvL2tfeSBjYW4gYmUgOCA5IDEwIDExCisgICAgdi0+cmFuZ2VfeCA9IDEgPDwgKHYtPmtfeCAtIDEpOworICAgIHYtPnJhbmdlX3kgPSAxIDw8ICh2LT5rX3kgLSAxKTsKKyAgICBpZiAodi0+bXVsdGlyZXMgJiYgdi0+cy5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgIHYtPnJlc3BpYyA9IGdldF9iaXRzKGdiLCAyKTsKKworICAgIGlmICh2LT5yZXNfeDggJiYgKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JIHx8IHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CSSkpIHsKKyAgICAgICAgdi0+eDhfdHlwZSA9IGdldF9iaXRzMShnYik7CisgICAgfSBlbHNlCisgICAgICAgIHYtPng4X3R5cGUgPSAwOworICAgIGF2X2Rsb2codi0+cy5hdmN0eCwgIiVjIEZyYW1lOiBRUD1bJWldJWkgKCslaS8yKSAlaVxuIiwKKyAgICAgICAgICAgICh2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkgPyAnUCcgOiAoKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSA/ICdJJyA6ICdCJyksCisgICAgICAgICAgICBwcWluZGV4LCB2LT5wcSwgdi0+aGFsZnBxLCB2LT5yYW5nZXJlZGZybSk7CisKKyAgICBpZiAodi0+Zmlyc3RfcGljX2hlYWRlcl9mbGFnKQorICAgICAgICByb3RhdGVfbHV0cyh2KTsKKworICAgIHN3aXRjaCAodi0+cy5waWN0X3R5cGUpIHsKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9QOgorICAgICAgICBpZiAodi0+cHEgPCA1KSAgICAgICB2LT50dF9pbmRleCA9IDA7CisgICAgICAgIGVsc2UgaWYgKHYtPnBxIDwgMTMpIHYtPnR0X2luZGV4ID0gMTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgdi0+dHRfaW5kZXggPSAyOworCisgICAgICAgIGxvd3F1YW50ID0gKHYtPnBxID4gMTIpID8gMCA6IDE7CisgICAgICAgIHYtPm12X21vZGUgPSBmZl92YzFfbXZfcG1vZGVfdGFibGVbbG93cXVhbnRdW2dldF91bmFyeShnYiwgMSwgNCldOworICAgICAgICBpZiAodi0+bXZfbW9kZSA9PSBNVl9QTU9ERV9JTlRFTlNJVFlfQ09NUCkgeworICAgICAgICAgICAgdi0+bXZfbW9kZTIgPSBmZl92YzFfbXZfcG1vZGVfdGFibGUyW2xvd3F1YW50XVtnZXRfdW5hcnkoZ2IsIDEsIDMpXTsKKyAgICAgICAgICAgIHYtPmx1bXNjYWxlID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgICAgICAgICAgdi0+bHVtc2hpZnQgPSBnZXRfYml0cyhnYiwgNik7CisgICAgICAgICAgICB2LT5sYXN0X3VzZV9pYyA9IDE7CisgICAgICAgICAgICAvKiBmaWxsIGxvb2t1cCB0YWJsZXMgZm9yIGludGVuc2l0eSBjb21wZW5zYXRpb24gKi8KKyAgICAgICAgICAgIElOSVRfTFVUKHYtPmx1bXNjYWxlLCB2LT5sdW1zaGlmdCwgdi0+bGFzdF9sdXR5WzBdLCB2LT5sYXN0X2x1dHV2WzBdLCAxKTsKKyAgICAgICAgICAgIElOSVRfTFVUKHYtPmx1bXNjYWxlLCB2LT5sdW1zaGlmdCwgdi0+bGFzdF9sdXR5WzFdLCB2LT5sYXN0X2x1dHV2WzFdLCAxKTsKKyAgICAgICAgfQorICAgICAgICB2LT5xc19sYXN0ID0gdi0+cy5xdWFydGVyX3NhbXBsZTsKKyAgICAgICAgaWYgKHYtPm12X21vZGUgPT0gTVZfUE1PREVfMU1WX0hQRUwgfHwgdi0+bXZfbW9kZSA9PSBNVl9QTU9ERV8xTVZfSFBFTF9CSUxJTikKKyAgICAgICAgICAgIHYtPnMucXVhcnRlcl9zYW1wbGUgPSAwOworICAgICAgICBlbHNlIGlmICh2LT5tdl9tb2RlID09IE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QKSB7CisgICAgICAgICAgICBpZiAodi0+bXZfbW9kZTIgPT0gTVZfUE1PREVfMU1WX0hQRUwgfHwgdi0+bXZfbW9kZTIgPT0gTVZfUE1PREVfMU1WX0hQRUxfQklMSU4pCisgICAgICAgICAgICAgICAgdi0+cy5xdWFydGVyX3NhbXBsZSA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdi0+cy5xdWFydGVyX3NhbXBsZSA9IDE7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdi0+cy5xdWFydGVyX3NhbXBsZSA9IDE7CisgICAgICAgIHYtPnMubXNwZWwgPSAhKHYtPm12X21vZGUgPT0gTVZfUE1PREVfMU1WX0hQRUxfQklMSU4gfHwgKHYtPm12X21vZGUgPT0gTVZfUE1PREVfSU5URU5TSVRZX0NPTVAgJiYgdi0+bXZfbW9kZTIgPT0gTVZfUE1PREVfMU1WX0hQRUxfQklMSU4pKTsKKworICAgICAgICBpZiAoKHYtPm12X21vZGUgID09IE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QICYmCisgICAgICAgICAgICAgdi0+bXZfbW9kZTIgPT0gTVZfUE1PREVfTUlYRURfTVYpICAgICAgfHwKKyAgICAgICAgICAgIHYtPm12X21vZGUgICA9PSBNVl9QTU9ERV9NSVhFRF9NVikgeworICAgICAgICAgICAgc3RhdHVzID0gYml0cGxhbmVfZGVjb2Rpbmcodi0+bXZfdHlwZV9tYl9wbGFuZSwgJnYtPm12X3R5cGVfaXNfcmF3LCB2KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfREVCVUcsICJNQiBNViBUeXBlIHBsYW5lIGVuY29kaW5nOiAiCisgICAgICAgICAgICAgICAgICAgIkltb2RlOiAlaSwgSW52ZXJ0OiAlaVxuIiwgc3RhdHVzPj4xLCBzdGF0dXMmMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2LT5tdl90eXBlX2lzX3JhdyA9IDA7CisgICAgICAgICAgICBtZW1zZXQodi0+bXZfdHlwZV9tYl9wbGFuZSwgMCwgdi0+cy5tYl9zdHJpZGUgKiB2LT5zLm1iX2hlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gYml0cGxhbmVfZGVjb2Rpbmcodi0+cy5tYnNraXBfdGFibGUsICZ2LT5za2lwX2lzX3Jhdywgdik7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiTUIgU2tpcCBwbGFuZSBlbmNvZGluZzogIgorICAgICAgICAgICAgICAgIkltb2RlOiAlaSwgSW52ZXJ0OiAlaVxuIiwgc3RhdHVzPj4xLCBzdGF0dXMmMSk7CisKKyAgICAgICAgLyogSG9wZWZ1bGx5IHRoaXMgaXMgY29ycmVjdCBmb3IgUCBmcmFtZXMgKi8KKyAgICAgICAgdi0+cy5tdl90YWJsZV9pbmRleCA9IGdldF9iaXRzKGdiLCAyKTsgLy9idXQgdXNpbmcgZmZfdmMxXyB0YWJsZXMKKyAgICAgICAgdi0+Y2JwY3lfdmxjID0gJmZmX3ZjMV9jYnBjeV9wX3ZsY1tnZXRfYml0cyhnYiwgMildOworCisgICAgICAgIGlmICh2LT5kcXVhbnQpIHsKKyAgICAgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfREVCVUcsICJWT1AgRFF1YW50IGluZm9cbiIpOworICAgICAgICAgICAgdm9wX2RxdWFudF9kZWNvZGluZyh2KTsKKyAgICAgICAgfQorCisgICAgICAgIHYtPnR0ZnJtID0gMDsgLy9GSVhNRSBJcyB0aGF0IHNvID8KKyAgICAgICAgaWYgKHYtPnZzdHJhbnNmb3JtKSB7CisgICAgICAgICAgICB2LT50dG1iZiA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAodi0+dHRtYmYpIHsKKyAgICAgICAgICAgICAgICB2LT50dGZybSA9IGZmX3ZjMV90dGZybV90b190dFtnZXRfYml0cyhnYiwgMildOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdi0+dHRtYmYgPSAxOworICAgICAgICAgICAgdi0+dHRmcm0gPSBUVF84WDg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfQjoKKyAgICAgICAgaWYgKHYtPnBxIDwgNSkgICAgICAgdi0+dHRfaW5kZXggPSAwOworICAgICAgICBlbHNlIGlmICh2LT5wcSA8IDEzKSB2LT50dF9pbmRleCA9IDE7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgIHYtPnR0X2luZGV4ID0gMjsKKworICAgICAgICB2LT5tdl9tb2RlICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKSA/IE1WX1BNT0RFXzFNViA6IE1WX1BNT0RFXzFNVl9IUEVMX0JJTElOOworICAgICAgICB2LT5xc19sYXN0ICAgICAgICAgID0gdi0+cy5xdWFydGVyX3NhbXBsZTsKKyAgICAgICAgdi0+cy5xdWFydGVyX3NhbXBsZSA9ICh2LT5tdl9tb2RlID09IE1WX1BNT0RFXzFNVik7CisgICAgICAgIHYtPnMubXNwZWwgICAgICAgICAgPSB2LT5zLnF1YXJ0ZXJfc2FtcGxlOworCisgICAgICAgIHN0YXR1cyA9IGJpdHBsYW5lX2RlY29kaW5nKHYtPmRpcmVjdF9tYl9wbGFuZSwgJnYtPmRtYl9pc19yYXcsIHYpOworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19ERUJVRywgIk1CIERpcmVjdCBUeXBlIHBsYW5lIGVuY29kaW5nOiAiCisgICAgICAgICAgICAgICAiSW1vZGU6ICVpLCBJbnZlcnQ6ICVpXG4iLCBzdGF0dXM+PjEsIHN0YXR1cyYxKTsKKyAgICAgICAgc3RhdHVzID0gYml0cGxhbmVfZGVjb2Rpbmcodi0+cy5tYnNraXBfdGFibGUsICZ2LT5za2lwX2lzX3Jhdywgdik7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiTUIgU2tpcCBwbGFuZSBlbmNvZGluZzogIgorICAgICAgICAgICAgICAgIkltb2RlOiAlaSwgSW52ZXJ0OiAlaVxuIiwgc3RhdHVzPj4xLCBzdGF0dXMmMSk7CisKKyAgICAgICAgdi0+cy5tdl90YWJsZV9pbmRleCA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgdi0+Y2JwY3lfdmxjICAgICAgICA9ICZmZl92YzFfY2JwY3lfcF92bGNbZ2V0X2JpdHMoZ2IsIDIpXTsKKworICAgICAgICBpZiAodi0+ZHF1YW50KSB7CisgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVk9QIERRdWFudCBpbmZvXG4iKTsKKyAgICAgICAgICAgIHZvcF9kcXVhbnRfZGVjb2Rpbmcodik7CisgICAgICAgIH0KKworICAgICAgICB2LT50dGZybSA9IDA7CisgICAgICAgIGlmICh2LT52c3RyYW5zZm9ybSkgeworICAgICAgICAgICAgdi0+dHRtYmYgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgaWYgKHYtPnR0bWJmKSB7CisgICAgICAgICAgICAgICAgdi0+dHRmcm0gPSBmZl92YzFfdHRmcm1fdG9fdHRbZ2V0X2JpdHMoZ2IsIDIpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHYtPnR0bWJmID0gMTsKKyAgICAgICAgICAgIHYtPnR0ZnJtID0gVFRfOFg4OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghdi0+eDhfdHlwZSkgeworICAgICAgICAvKiBBQyBTeW50YXggKi8KKyAgICAgICAgdi0+Y19hY190YWJsZV9pbmRleCA9IGRlY29kZTAxMihnYik7CisgICAgICAgIGlmICh2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSB8fCB2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQkkpIHsKKyAgICAgICAgICAgIHYtPnlfYWNfdGFibGVfaW5kZXggPSBkZWNvZGUwMTIoZ2IpOworICAgICAgICB9CisgICAgICAgIC8qIERDIFN5bnRheCAqLworICAgICAgICB2LT5zLmRjX3RhYmxlX2luZGV4ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB9CisKKyAgICBpZiAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0JJKSB7CisgICAgICAgIHYtPnMucGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0I7CisgICAgICAgIHYtPmJpX3R5cGUgICAgID0gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl92YzFfcGFyc2VfZnJhbWVfaGVhZGVyX2FkdihWQzFDb250ZXh0ICp2LCBHZXRCaXRDb250ZXh0KiBnYikKK3sKKyAgICBpbnQgcHFpbmRleCwgbG93cXVhbnQ7CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgbWJtb2RldGFiLCBpbXZ0YWIsIGljYnB0YWIsIHR3b212YnB0YWIsIGZvdXJtdmJwdGFiOyAvKiB1c2VmdWwgb25seSBmb3IgZGVidWdnaW5nICovCisgICAgaW50IGZpZWxkX21vZGUsIGZjbTsKKworICAgIHYtPm51bXJlZiAgICAgICAgICA9IDA7CisgICAgdi0+cF9mcmFtZV9za2lwcGVkID0gMDsKKyAgICBpZiAodi0+c2Vjb25kX2ZpZWxkKSB7CisgICAgICAgIGlmKHYtPmZjbSE9MiB8fCB2LT5maWVsZF9tb2RlIT0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB2LT5zLnBpY3RfdHlwZSA9ICh2LT5mcHR5cGUgJiAxKSA/IEFWX1BJQ1RVUkVfVFlQRV9QIDogQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIGlmICh2LT5mcHR5cGUgJiA0KQorICAgICAgICAgICAgdi0+cy5waWN0X3R5cGUgPSAodi0+ZnB0eXBlICYgMSkgPyBBVl9QSUNUVVJFX1RZUEVfQkkgOiBBVl9QSUNUVVJFX1RZUEVfQjsKKyAgICAgICAgdi0+cy5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5waWN0X3R5cGUgPSB2LT5zLnBpY3RfdHlwZTsKKyAgICAgICAgaWYgKCF2LT5waWNfaGVhZGVyX2ZsYWcpCisgICAgICAgICAgICBnb3RvIHBhcnNlX2NvbW1vbl9pbmZvOworICAgIH0KKworICAgIGZpZWxkX21vZGUgPSAwOworICAgIGlmICh2LT5pbnRlcmxhY2UpIHsKKyAgICAgICAgZmNtID0gZGVjb2RlMDEyKGdiKTsKKyAgICAgICAgaWYgKGZjbSkgeworICAgICAgICAgICAgaWYgKGZjbSA9PSBJTEFDRV9GSUVMRCkKKyAgICAgICAgICAgICAgICBmaWVsZF9tb2RlID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZjbSA9IFBST0dSRVNTSVZFOworICAgIH0KKyAgICBpZiAoIXYtPmZpcnN0X3BpY19oZWFkZXJfZmxhZyAmJiB2LT5maWVsZF9tb2RlICE9IGZpZWxkX21vZGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHYtPmZpZWxkX21vZGUgPSBmaWVsZF9tb2RlOworICAgIHYtPmZjbSA9IGZjbTsKKworICAgIGF2X2Fzc2VydDAoICAgIHYtPnMubWJfaGVpZ2h0ID09IHYtPnMuaGVpZ2h0ICsgMTUgPj4gNAorICAgICAgICAgICAgICAgIHx8IHYtPnMubWJfaGVpZ2h0ID09IEZGQUxJR04odi0+cy5oZWlnaHQgKyAxNSA+PiA0LCAyKSk7CisgICAgaWYgKHYtPmZpZWxkX21vZGUpIHsKKyAgICAgICAgdi0+cy5tYl9oZWlnaHQgPSBGRkFMSUdOKHYtPnMuaGVpZ2h0ICsgMTUgPj4gNCwgMik7CisgICAgICAgIHYtPmZwdHlwZSA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgdi0+cy5waWN0X3R5cGUgPSAodi0+ZnB0eXBlICYgMikgPyBBVl9QSUNUVVJFX1RZUEVfUCA6IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBpZiAodi0+ZnB0eXBlICYgNCkgLy8gQi1waWN0dXJlCisgICAgICAgICAgICB2LT5zLnBpY3RfdHlwZSA9ICh2LT5mcHR5cGUgJiAyKSA/IEFWX1BJQ1RVUkVfVFlQRV9CSSA6IEFWX1BJQ1RVUkVfVFlQRV9COworCisgICAgfSBlbHNlIHsKKyAgICAgICAgdi0+cy5tYl9oZWlnaHQgPSB2LT5zLmhlaWdodCArIDE1ID4+IDQ7CisgICAgICAgIHN3aXRjaCAoZ2V0X3VuYXJ5KGdiLCAwLCA0KSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB2LT5zLnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHYtPnMucGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdi0+cy5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB2LT5zLnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9CSTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB2LT5zLnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOyAvLyBza2lwcGVkIHBpYworICAgICAgICAgICAgdi0+cF9mcmFtZV9za2lwcGVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICh2LT50ZmNudHJmbGFnKQorICAgICAgICBza2lwX2JpdHMoZ2IsIDgpOworICAgIGlmICh2LT5icm9hZGNhc3QpIHsKKyAgICAgICAgaWYgKCF2LT5pbnRlcmxhY2UgfHwgdi0+cHNmKSB7CisgICAgICAgICAgICB2LT5ycHRmcm0gPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2LT50ZmYgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgdi0+cmZmID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHYtPnRmZiA9IDE7CisgICAgfQorICAgIGlmICh2LT5wYW5zY2FuZmxhZykgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZSh2LT5zLmF2Y3R4LCAiUGFuLXNjYW4iKTsKKyAgICAgICAgLy8uLi4KKyAgICB9CisgICAgaWYgKHYtPnBfZnJhbWVfc2tpcHBlZCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdi0+cm5kID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAodi0+aW50ZXJsYWNlKQorICAgICAgICB2LT51dnNhbXAgPSBnZXRfYml0czEoZ2IpOworICAgIGlmKCFmZl92YzFfYmZyYWN0aW9uX3ZsYy50YWJsZSkKKyAgICAgICAgcmV0dXJuIDA7IC8vcGFyc2luZyBvbmx5LCB2bGMgdGFibGVzIGhhdm50IGJlZW4gYWxsb2NhdGVkCisgICAgaWYgKHYtPmZpZWxkX21vZGUpIHsKKyAgICAgICAgaWYgKCF2LT5yZWZkaXN0X2ZsYWcpCisgICAgICAgICAgICB2LT5yZWZkaXN0ID0gMDsKKyAgICAgICAgZWxzZSBpZiAoKHYtPnMucGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKSAmJiAodi0+cy5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0JJKSkgeworICAgICAgICAgICAgdi0+cmVmZGlzdCA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgIGlmICh2LT5yZWZkaXN0ID09IDMpCisgICAgICAgICAgICAgICAgdi0+cmVmZGlzdCArPSBnZXRfdW5hcnkoZ2IsIDAsIDE2KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB8fCAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0JJKSkgeworICAgICAgICAgICAgaWYgKHJlYWRfYmZyYWN0aW9uKHYsIGdiKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB2LT5mcmZkID0gKHYtPmJmcmFjdGlvbiAqIHYtPnJlZmRpc3QpID4+IDg7CisgICAgICAgICAgICB2LT5icmZkID0gdi0+cmVmZGlzdCAtIHYtPmZyZmQgLSAxOworICAgICAgICAgICAgaWYgKHYtPmJyZmQgPCAwKQorICAgICAgICAgICAgICAgIHYtPmJyZmQgPSAwOworICAgICAgICB9CisgICAgICAgIGdvdG8gcGFyc2VfY29tbW9uX2luZm87CisgICAgfQorICAgIGlmICh2LT5mY20gPT0gUFJPR1JFU1NJVkUpIHsKKyAgICAgICAgaWYgKHYtPmZpbnRlcnBmbGFnKQorICAgICAgICAgICAgdi0+aW50ZXJwZnJtID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgICAgICBpZiAocmVhZF9iZnJhY3Rpb24odiwgZ2IpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGlmICh2LT5iZnJhY3Rpb24gPT0gMCkgeworICAgICAgICAgICAgICAgIHYtPnMucGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0JJOyAvKiBYWFg6IHNob3VsZCBub3QgaGFwcGVuIGhlcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBhcnNlX2NvbW1vbl9pbmZvOgorICAgIGlmICh2LT5maWVsZF9tb2RlKQorICAgICAgICB2LT5jdXJfZmllbGRfdHlwZSA9ICEodi0+dGZmIF4gdi0+c2Vjb25kX2ZpZWxkKTsKKyAgICBwcWluZGV4ID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgIGlmICghcHFpbmRleCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHYtPnBxaW5kZXggPSBwcWluZGV4OworICAgIGlmICh2LT5xdWFudGl6ZXJfbW9kZSA9PSBRVUFOVF9GUkFNRV9JTVBMSUNJVCkKKyAgICAgICAgdi0+cHEgPSBmZl92YzFfcHF1YW50X3RhYmxlWzBdW3BxaW5kZXhdOworICAgIGVsc2UKKyAgICAgICAgdi0+cHEgPSBmZl92YzFfcHF1YW50X3RhYmxlWzFdW3BxaW5kZXhdOworCisgICAgdi0+cHF1YW50aXplciA9IDE7CisgICAgaWYgKHYtPnF1YW50aXplcl9tb2RlID09IFFVQU5UX0ZSQU1FX0lNUExJQ0lUKQorICAgICAgICB2LT5wcXVhbnRpemVyID0gcHFpbmRleCA8IDk7CisgICAgaWYgKHYtPnF1YW50aXplcl9tb2RlID09IFFVQU5UX05PTl9VTklGT1JNKQorICAgICAgICB2LT5wcXVhbnRpemVyID0gMDsKKyAgICB2LT5wcWluZGV4ID0gcHFpbmRleDsKKyAgICBpZiAocHFpbmRleCA8IDkpCisgICAgICAgIHYtPmhhbGZwcSA9IGdldF9iaXRzMShnYik7CisgICAgZWxzZQorICAgICAgICB2LT5oYWxmcHEgPSAwOworICAgIGlmICh2LT5xdWFudGl6ZXJfbW9kZSA9PSBRVUFOVF9GUkFNRV9FWFBMSUNJVCkKKyAgICAgICAgdi0+cHF1YW50aXplciA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKHYtPnBvc3Rwcm9jZmxhZykKKyAgICAgICAgdi0+cG9zdHByb2MgPSBnZXRfYml0cyhnYiwgMik7CisKKyAgICBpZiAodi0+cGFyc2Vfb25seSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAodi0+Zmlyc3RfcGljX2hlYWRlcl9mbGFnKQorICAgICAgICByb3RhdGVfbHV0cyh2KTsKKworICAgIHN3aXRjaCAodi0+cy5waWN0X3R5cGUpIHsKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9JOgorICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX0JJOgorICAgICAgICBpZiAodi0+ZmNtID09IElMQUNFX0ZSQU1FKSB7IC8vaW50ZXJsYWNlIGZyYW1lIHBpY3R1cmUKKyAgICAgICAgICAgIHN0YXR1cyA9IGJpdHBsYW5lX2RlY29kaW5nKHYtPmZpZWxkdHhfcGxhbmUsICZ2LT5maWVsZHR4X2lzX3Jhdywgdik7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiRklFTERUWCBwbGFuZSBlbmNvZGluZzogIgorICAgICAgICAgICAgICAgICAgICJJbW9kZTogJWksIEludmVydDogJWlcbiIsIHN0YXR1cz4+MSwgc3RhdHVzJjEpOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IGJpdHBsYW5lX2RlY29kaW5nKHYtPmFjcHJlZF9wbGFuZSwgJnYtPmFjcHJlZF9pc19yYXcsIHYpOworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19ERUJVRywgIkFDUFJFRCBwbGFuZSBlbmNvZGluZzogIgorICAgICAgICAgICAgICAgIkltb2RlOiAlaSwgSW52ZXJ0OiAlaVxuIiwgc3RhdHVzPj4xLCBzdGF0dXMmMSk7CisgICAgICAgIHYtPmNvbmRvdmVyID0gQ09ORE9WRVJfTk9ORTsKKyAgICAgICAgaWYgKHYtPm92ZXJsYXAgJiYgdi0+cHEgPD0gOCkgeworICAgICAgICAgICAgdi0+Y29uZG92ZXIgPSBkZWNvZGUwMTIoZ2IpOworICAgICAgICAgICAgaWYgKHYtPmNvbmRvdmVyID09IENPTkRPVkVSX1NFTEVDVCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGJpdHBsYW5lX2RlY29kaW5nKHYtPm92ZXJfZmxhZ3NfcGxhbmUsICZ2LT5vdmVyZmxnX2lzX3Jhdywgdik7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiQ09ORE9WRVIgcGxhbmUgZW5jb2Rpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkltb2RlOiAlaSwgSW52ZXJ0OiAlaVxuIiwgc3RhdHVzPj4xLCBzdGF0dXMmMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfUDoKKyAgICAgICAgaWYgKHYtPmZpZWxkX21vZGUpIHsKKyAgICAgICAgICAgIHYtPm51bXJlZiA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAoIXYtPm51bXJlZikgeworICAgICAgICAgICAgICAgIHYtPnJlZmZpZWxkICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgICAgICB2LT5yZWZfZmllbGRfdHlwZVswXSA9IHYtPnJlZmZpZWxkIF4gIXYtPmN1cl9maWVsZF90eXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2LT5leHRlbmRlZF9tdikKKyAgICAgICAgICAgIHYtPm12cmFuZ2UgPSBnZXRfdW5hcnkoZ2IsIDAsIDMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2LT5tdnJhbmdlID0gMDsKKyAgICAgICAgaWYgKHYtPmludGVybGFjZSkgeworICAgICAgICAgICAgaWYgKHYtPmV4dGVuZGVkX2RtdikKKyAgICAgICAgICAgICAgICB2LT5kbXZyYW5nZSA9IGdldF91bmFyeShnYiwgMCwgMyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdi0+ZG12cmFuZ2UgPSAwOworICAgICAgICAgICAgaWYgKHYtPmZjbSA9PSBJTEFDRV9GUkFNRSkgeyAvLyBpbnRlcmxhY2VkIGZyYW1lIHBpY3R1cmUKKyAgICAgICAgICAgICAgICB2LT5mb3VybXZzd2l0Y2ggPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIHYtPmludGNvbXAgICAgICA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgaWYgKHYtPmludGNvbXApIHsKKyAgICAgICAgICAgICAgICAgICAgdi0+bHVtc2NhbGUgPSBnZXRfYml0cyhnYiwgNik7CisgICAgICAgICAgICAgICAgICAgIHYtPmx1bXNoaWZ0ID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgICAgICAgICAgICAgICAgICBJTklUX0xVVCh2LT5sdW1zY2FsZSwgdi0+bHVtc2hpZnQsIHYtPmxhc3RfbHV0eVswXSwgdi0+bGFzdF9sdXR1dlswXSwgMSk7CisgICAgICAgICAgICAgICAgICAgIElOSVRfTFVUKHYtPmx1bXNjYWxlLCB2LT5sdW1zaGlmdCwgdi0+bGFzdF9sdXR5WzFdLCB2LT5sYXN0X2x1dHV2WzFdLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgdi0+bGFzdF91c2VfaWMgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBiaXRwbGFuZV9kZWNvZGluZyh2LT5zLm1ic2tpcF90YWJsZSwgJnYtPnNraXBfaXNfcmF3LCB2KTsKKyAgICAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiU0tJUE1CIHBsYW5lIGVuY29kaW5nOiAiCisgICAgICAgICAgICAgICAgICAgICAgICJJbW9kZTogJWksIEludmVydDogJWlcbiIsIHN0YXR1cz4+MSwgc3RhdHVzJjEpOworICAgICAgICAgICAgICAgIG1ibW9kZXRhYiA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgICAgICBpZiAodi0+Zm91cm12c3dpdGNoKQorICAgICAgICAgICAgICAgICAgICB2LT5tYm1vZGVfdmxjID0gJmZmX3ZjMV9pbnRmcl80bXZfbWJtb2RlX3ZsY1ttYm1vZGV0YWJdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdi0+bWJtb2RlX3ZsYyA9ICZmZl92YzFfaW50ZnJfbm9uNG12X21ibW9kZV92bGNbbWJtb2RldGFiXTsKKyAgICAgICAgICAgICAgICBpbXZ0YWIgICAgICAgICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgICAgICB2LT5pbXZfdmxjICAgICA9ICZmZl92YzFfMXJlZl9tdmRhdGFfdmxjW2ltdnRhYl07CisgICAgICAgICAgICAgICAgLy8gaW50ZXJsYWNlZCBwLXBpY3R1cmUgY2JwY3kgcmFuZ2UgaXMgWzEsIDYzXQorICAgICAgICAgICAgICAgIGljYnB0YWIgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgICAgIHYtPmNicGN5X3ZsYyAgID0gJmZmX3ZjMV9pY2JwY3lfdmxjW2ljYnB0YWJdOworICAgICAgICAgICAgICAgIHR3b212YnB0YWIgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgICAgIHYtPnR3b212YnBfdmxjID0gJmZmX3ZjMV8ybXZfYmxvY2tfcGF0dGVybl92bGNbdHdvbXZicHRhYl07CisgICAgICAgICAgICAgICAgaWYgKHYtPmZvdXJtdnN3aXRjaCkgeworICAgICAgICAgICAgICAgICAgICBmb3VybXZicHRhYiAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICAgICAgICAgIHYtPmZvdXJtdmJwX3ZsYyA9ICZmZl92YzFfNG12X2Jsb2NrX3BhdHRlcm5fdmxjW2ZvdXJtdmJwdGFiXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdi0+a194ID0gdi0+bXZyYW5nZSArIDkgKyAodi0+bXZyYW5nZSA+PiAxKTsgLy9rX3ggY2FuIGJlIDkgMTAgMTIgMTMKKyAgICAgICAgdi0+a195ID0gdi0+bXZyYW5nZSArIDg7IC8va195IGNhbiBiZSA4IDkgMTAgMTEKKyAgICAgICAgdi0+cmFuZ2VfeCA9IDEgPDwgKHYtPmtfeCAtIDEpOworICAgICAgICB2LT5yYW5nZV95ID0gMSA8PCAodi0+a195IC0gMSk7CisKKyAgICAgICAgaWYgKHYtPnBxIDwgNSkKKyAgICAgICAgICAgIHYtPnR0X2luZGV4ID0gMDsKKyAgICAgICAgZWxzZSBpZiAodi0+cHEgPCAxMykKKyAgICAgICAgICAgIHYtPnR0X2luZGV4ID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdi0+dHRfaW5kZXggPSAyOworICAgICAgICBpZiAodi0+ZmNtICE9IElMQUNFX0ZSQU1FKSB7CisgICAgICAgICAgICBpbnQgbXZtb2RlOworICAgICAgICAgICAgbXZtb2RlICAgICA9IGdldF91bmFyeShnYiwgMSwgNCk7CisgICAgICAgICAgICBsb3dxdWFudCAgID0gKHYtPnBxID4gMTIpID8gMCA6IDE7CisgICAgICAgICAgICB2LT5tdl9tb2RlID0gZmZfdmMxX212X3Btb2RlX3RhYmxlW2xvd3F1YW50XVttdm1vZGVdOworICAgICAgICAgICAgaWYgKHYtPm12X21vZGUgPT0gTVZfUE1PREVfSU5URU5TSVRZX0NPTVApIHsKKyAgICAgICAgICAgICAgICBpbnQgbXZtb2RlMjsKKyAgICAgICAgICAgICAgICBtdm1vZGUyID0gZ2V0X3VuYXJ5KGdiLCAxLCAzKTsKKyAgICAgICAgICAgICAgICB2LT5tdl9tb2RlMiA9IGZmX3ZjMV9tdl9wbW9kZV90YWJsZTJbbG93cXVhbnRdW212bW9kZTJdOworICAgICAgICAgICAgICAgIGlmICh2LT5maWVsZF9tb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIHYtPmludGNvbXBmaWVsZCA9IGRlY29kZTIxMChnYikgXiAzOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICB2LT5pbnRjb21wZmllbGQgPSAzOworCisgICAgICAgICAgICAgICAgdi0+bHVtc2NhbGUyID0gdi0+bHVtc2NhbGUgPSAzMjsKKyAgICAgICAgICAgICAgICB2LT5sdW1zaGlmdDIgPSB2LT5sdW1zaGlmdCA9ICAwOworICAgICAgICAgICAgICAgIGlmICh2LT5pbnRjb21wZmllbGQgJiAxKSB7CisgICAgICAgICAgICAgICAgICAgIHYtPmx1bXNjYWxlID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgICAgICAgICAgICAgICAgICB2LT5sdW1zaGlmdCA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCh2LT5pbnRjb21wZmllbGQgJiAyKSAmJiB2LT5maWVsZF9tb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIHYtPmx1bXNjYWxlMiA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgdi0+bHVtc2hpZnQyID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZighdi0+ZmllbGRfbW9kZSkgeworICAgICAgICAgICAgICAgICAgICB2LT5sdW1zY2FsZTIgPSB2LT5sdW1zY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgdi0+bHVtc2hpZnQyID0gdi0+bHVtc2hpZnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2LT5maWVsZF9tb2RlICYmIHYtPnNlY29uZF9maWVsZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodi0+Y3VyX2ZpZWxkX3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElOSVRfTFVUKHYtPmx1bXNjYWxlICwgdi0+bHVtc2hpZnQgLCB2LT5jdXJyX2x1dHlbdi0+Y3VyX2ZpZWxkX3R5cGVeMV0sIHYtPmN1cnJfbHV0dXZbdi0+Y3VyX2ZpZWxkX3R5cGVeMV0sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgSU5JVF9MVVQodi0+bHVtc2NhbGUyLCB2LT5sdW1zaGlmdDIsIHYtPmxhc3RfbHV0eVt2LT5jdXJfZmllbGRfdHlwZSAgXSwgdi0+bGFzdF9sdXR1dlt2LT5jdXJfZmllbGRfdHlwZSAgXSwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJTklUX0xVVCh2LT5sdW1zY2FsZTIsIHYtPmx1bXNoaWZ0Miwgdi0+Y3Vycl9sdXR5W3YtPmN1cl9maWVsZF90eXBlXjFdLCB2LT5jdXJyX2x1dHV2W3YtPmN1cl9maWVsZF90eXBlXjFdLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIElOSVRfTFVUKHYtPmx1bXNjYWxlICwgdi0+bHVtc2hpZnQgLCB2LT5sYXN0X2x1dHlbdi0+Y3VyX2ZpZWxkX3R5cGUgIF0sIHYtPmxhc3RfbHV0dXZbdi0+Y3VyX2ZpZWxkX3R5cGUgIF0sIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHYtPm5leHRfdXNlX2ljID0gKnYtPmN1cnJfdXNlX2ljID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBJTklUX0xVVCh2LT5sdW1zY2FsZSAsIHYtPmx1bXNoaWZ0ICwgdi0+bGFzdF9sdXR5WzBdLCB2LT5sYXN0X2x1dHV2WzBdLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgSU5JVF9MVVQodi0+bHVtc2NhbGUyLCB2LT5sdW1zaGlmdDIsIHYtPmxhc3RfbHV0eVsxXSwgdi0+bGFzdF9sdXR1dlsxXSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHYtPmxhc3RfdXNlX2ljID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHYtPnFzX2xhc3QgPSB2LT5zLnF1YXJ0ZXJfc2FtcGxlOworICAgICAgICAgICAgaWYgKHYtPm12X21vZGUgPT0gTVZfUE1PREVfMU1WX0hQRUwgfHwgdi0+bXZfbW9kZSA9PSBNVl9QTU9ERV8xTVZfSFBFTF9CSUxJTikKKyAgICAgICAgICAgICAgICB2LT5zLnF1YXJ0ZXJfc2FtcGxlID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHYtPm12X21vZGUgPT0gTVZfUE1PREVfSU5URU5TSVRZX0NPTVApIHsKKyAgICAgICAgICAgICAgICBpZiAodi0+bXZfbW9kZTIgPT0gTVZfUE1PREVfMU1WX0hQRUwgfHwgdi0+bXZfbW9kZTIgPT0gTVZfUE1PREVfMU1WX0hQRUxfQklMSU4pCisgICAgICAgICAgICAgICAgICAgIHYtPnMucXVhcnRlcl9zYW1wbGUgPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdi0+cy5xdWFydGVyX3NhbXBsZSA9IDE7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB2LT5zLnF1YXJ0ZXJfc2FtcGxlID0gMTsKKyAgICAgICAgICAgIHYtPnMubXNwZWwgPSAhKHYtPm12X21vZGUgPT0gTVZfUE1PREVfMU1WX0hQRUxfQklMSU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh2LT5tdl9tb2RlID09IE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdi0+bXZfbW9kZTIgPT0gTVZfUE1PREVfMU1WX0hQRUxfQklMSU4pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodi0+ZmNtID09IFBST0dSRVNTSVZFKSB7IC8vIHByb2dyZXNzaXZlCisgICAgICAgICAgICBpZiAoKHYtPm12X21vZGUgPT0gTVZfUE1PREVfSU5URU5TSVRZX0NPTVAgJiYKKyAgICAgICAgICAgICAgICAgdi0+bXZfbW9kZTIgPT0gTVZfUE1PREVfTUlYRURfTVYpCisgICAgICAgICAgICAgICAgfHwgdi0+bXZfbW9kZSA9PSBNVl9QTU9ERV9NSVhFRF9NVikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGJpdHBsYW5lX2RlY29kaW5nKHYtPm12X3R5cGVfbWJfcGxhbmUsICZ2LT5tdl90eXBlX2lzX3Jhdywgdik7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiTUIgTVYgVHlwZSBwbGFuZSBlbmNvZGluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAiSW1vZGU6ICVpLCBJbnZlcnQ6ICVpXG4iLCBzdGF0dXM+PjEsIHN0YXR1cyYxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdi0+bXZfdHlwZV9pc19yYXcgPSAwOworICAgICAgICAgICAgICAgIG1lbXNldCh2LT5tdl90eXBlX21iX3BsYW5lLCAwLCB2LT5zLm1iX3N0cmlkZSAqIHYtPnMubWJfaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IGJpdHBsYW5lX2RlY29kaW5nKHYtPnMubWJza2lwX3RhYmxlLCAmdi0+c2tpcF9pc19yYXcsIHYpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19ERUJVRywgIk1CIFNraXAgcGxhbmUgZW5jb2Rpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAiSW1vZGU6ICVpLCBJbnZlcnQ6ICVpXG4iLCBzdGF0dXM+PjEsIHN0YXR1cyYxKTsKKworICAgICAgICAgICAgLyogSG9wZWZ1bGx5IHRoaXMgaXMgY29ycmVjdCBmb3IgUCBmcmFtZXMgKi8KKyAgICAgICAgICAgIHYtPnMubXZfdGFibGVfaW5kZXggPSBnZXRfYml0cyhnYiwgMik7IC8vYnV0IHVzaW5nIGZmX3ZjMV8gdGFibGVzCisgICAgICAgICAgICB2LT5jYnBjeV92bGMgICAgICAgID0gJmZmX3ZjMV9jYnBjeV9wX3ZsY1tnZXRfYml0cyhnYiwgMildOworICAgICAgICB9IGVsc2UgaWYgKHYtPmZjbSA9PSBJTEFDRV9GUkFNRSkgeyAvLyBmcmFtZSBpbnRlcmxhY2VkCisgICAgICAgICAgICB2LT5xc19sYXN0ICAgICAgICAgID0gdi0+cy5xdWFydGVyX3NhbXBsZTsKKyAgICAgICAgICAgIHYtPnMucXVhcnRlcl9zYW1wbGUgPSAxOworICAgICAgICAgICAgdi0+cy5tc3BlbCAgICAgICAgICA9IDE7CisgICAgICAgIH0gZWxzZSB7ICAgIC8vIGZpZWxkIGludGVybGFjZWQKKyAgICAgICAgICAgIG1ibW9kZXRhYiA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgICAgIGltdnRhYiA9IGdldF9iaXRzKGdiLCAyICsgdi0+bnVtcmVmKTsKKyAgICAgICAgICAgIGlmICghdi0+bnVtcmVmKQorICAgICAgICAgICAgICAgIHYtPmltdl92bGMgPSAmZmZfdmMxXzFyZWZfbXZkYXRhX3ZsY1tpbXZ0YWJdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYtPmltdl92bGMgPSAmZmZfdmMxXzJyZWZfbXZkYXRhX3ZsY1tpbXZ0YWJdOworICAgICAgICAgICAgaWNicHRhYiA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgICAgIHYtPmNicGN5X3ZsYyA9ICZmZl92YzFfaWNicGN5X3ZsY1tpY2JwdGFiXTsKKyAgICAgICAgICAgIGlmICgodi0+bXZfbW9kZSA9PSBNVl9QTU9ERV9JTlRFTlNJVFlfQ09NUCAmJgorICAgICAgICAgICAgICAgIHYtPm12X21vZGUyID09IE1WX1BNT0RFX01JWEVEX01WKSB8fCB2LT5tdl9tb2RlID09IE1WX1BNT0RFX01JWEVEX01WKSB7CisgICAgICAgICAgICAgICAgZm91cm12YnB0YWIgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgICAgIHYtPmZvdXJtdmJwX3ZsYyA9ICZmZl92YzFfNG12X2Jsb2NrX3BhdHRlcm5fdmxjW2ZvdXJtdmJwdGFiXTsKKyAgICAgICAgICAgICAgICB2LT5tYm1vZGVfdmxjID0gJmZmX3ZjMV9pZl9tbXZfbWJtb2RlX3ZsY1ttYm1vZGV0YWJdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2LT5tYm1vZGVfdmxjID0gJmZmX3ZjMV9pZl8xbXZfbWJtb2RlX3ZsY1ttYm1vZGV0YWJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2LT5kcXVhbnQpIHsKKyAgICAgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfREVCVUcsICJWT1AgRFF1YW50IGluZm9cbiIpOworICAgICAgICAgICAgdm9wX2RxdWFudF9kZWNvZGluZyh2KTsKKyAgICAgICAgfQorCisgICAgICAgIHYtPnR0ZnJtID0gMDsgLy9GSVhNRSBJcyB0aGF0IHNvID8KKyAgICAgICAgaWYgKHYtPnZzdHJhbnNmb3JtKSB7CisgICAgICAgICAgICB2LT50dG1iZiA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAodi0+dHRtYmYpIHsKKyAgICAgICAgICAgICAgICB2LT50dGZybSA9IGZmX3ZjMV90dGZybV90b190dFtnZXRfYml0cyhnYiwgMildOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdi0+dHRtYmYgPSAxOworICAgICAgICAgICAgdi0+dHRmcm0gPSBUVF84WDg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfQjoKKyAgICAgICAgaWYgKHYtPmZjbSA9PSBJTEFDRV9GUkFNRSkgeworICAgICAgICAgICAgaWYgKHJlYWRfYmZyYWN0aW9uKHYsIGdiKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAodi0+YmZyYWN0aW9uID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHYtPmV4dGVuZGVkX212KQorICAgICAgICAgICAgdi0+bXZyYW5nZSA9IGdldF91bmFyeShnYiwgMCwgMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHYtPm12cmFuZ2UgPSAwOworICAgICAgICB2LT5rX3ggICAgID0gdi0+bXZyYW5nZSArIDkgKyAodi0+bXZyYW5nZSA+PiAxKTsgLy9rX3ggY2FuIGJlIDkgMTAgMTIgMTMKKyAgICAgICAgdi0+a195ICAgICA9IHYtPm12cmFuZ2UgKyA4OyAvL2tfeSBjYW4gYmUgOCA5IDEwIDExCisgICAgICAgIHYtPnJhbmdlX3ggPSAxIDw8ICh2LT5rX3ggLSAxKTsKKyAgICAgICAgdi0+cmFuZ2VfeSA9IDEgPDwgKHYtPmtfeSAtIDEpOworCisgICAgICAgIGlmICh2LT5wcSA8IDUpCisgICAgICAgICAgICB2LT50dF9pbmRleCA9IDA7CisgICAgICAgIGVsc2UgaWYgKHYtPnBxIDwgMTMpCisgICAgICAgICAgICB2LT50dF9pbmRleCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHYtPnR0X2luZGV4ID0gMjsKKworICAgICAgICBpZiAodi0+ZmllbGRfbW9kZSkgeworICAgICAgICAgICAgaW50IG12bW9kZTsKKyAgICAgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfREVCVUcsICJCIEZpZWxkc1xuIik7CisgICAgICAgICAgICBpZiAodi0+ZXh0ZW5kZWRfZG12KQorICAgICAgICAgICAgICAgIHYtPmRtdnJhbmdlID0gZ2V0X3VuYXJ5KGdiLCAwLCAzKTsKKyAgICAgICAgICAgIG12bW9kZSA9IGdldF91bmFyeShnYiwgMSwgMyk7CisgICAgICAgICAgICBsb3dxdWFudCA9ICh2LT5wcSA+IDEyKSA/IDAgOiAxOworICAgICAgICAgICAgdi0+bXZfbW9kZSAgICAgICAgICA9IGZmX3ZjMV9tdl9wbW9kZV90YWJsZTJbbG93cXVhbnRdW212bW9kZV07CisgICAgICAgICAgICB2LT5xc19sYXN0ICAgICAgICAgID0gdi0+cy5xdWFydGVyX3NhbXBsZTsKKyAgICAgICAgICAgIHYtPnMucXVhcnRlcl9zYW1wbGUgPSAodi0+bXZfbW9kZSA9PSBNVl9QTU9ERV8xTVYgfHwgdi0+bXZfbW9kZSA9PSBNVl9QTU9ERV9NSVhFRF9NVik7CisgICAgICAgICAgICB2LT5zLm1zcGVsICAgICAgICAgID0gISh2LT5tdl9tb2RlID09IE1WX1BNT0RFXzFNVl9IUEVMX0JJTElOIHx8IHYtPm12X21vZGUgPT0gTVZfUE1PREVfMU1WX0hQRUwpOworICAgICAgICAgICAgc3RhdHVzID0gYml0cGxhbmVfZGVjb2Rpbmcodi0+Zm9yd2FyZF9tYl9wbGFuZSwgJnYtPmZtYl9pc19yYXcsIHYpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19ERUJVRywgIk1CIEZvcndhcmQgVHlwZSBwbGFuZSBlbmNvZGluZzogIgorICAgICAgICAgICAgICAgICAgICJJbW9kZTogJWksIEludmVydDogJWlcbiIsIHN0YXR1cz4+MSwgc3RhdHVzJjEpOworICAgICAgICAgICAgbWJtb2RldGFiID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgaWYgKHYtPm12X21vZGUgPT0gTVZfUE1PREVfTUlYRURfTVYpCisgICAgICAgICAgICAgICAgdi0+bWJtb2RlX3ZsYyA9ICZmZl92YzFfaWZfbW12X21ibW9kZV92bGNbbWJtb2RldGFiXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2LT5tYm1vZGVfdmxjID0gJmZmX3ZjMV9pZl8xbXZfbWJtb2RlX3ZsY1ttYm1vZGV0YWJdOworICAgICAgICAgICAgaW12dGFiICAgICAgID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgdi0+aW12X3ZsYyAgID0gJmZmX3ZjMV8ycmVmX212ZGF0YV92bGNbaW12dGFiXTsKKyAgICAgICAgICAgIGljYnB0YWIgICAgICA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgICAgIHYtPmNicGN5X3ZsYyA9ICZmZl92YzFfaWNicGN5X3ZsY1tpY2JwdGFiXTsKKyAgICAgICAgICAgIGlmICh2LT5tdl9tb2RlID09IE1WX1BNT0RFX01JWEVEX01WKSB7CisgICAgICAgICAgICAgICAgZm91cm12YnB0YWIgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgICAgIHYtPmZvdXJtdmJwX3ZsYyA9ICZmZl92YzFfNG12X2Jsb2NrX3BhdHRlcm5fdmxjW2ZvdXJtdmJwdGFiXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHYtPm51bXJlZiA9IDE7IC8vIGludGVybGFjZWQgZmllbGQgQiBwaWN0dXJlcyBhcmUgYWx3YXlzIDItcmVmCisgICAgICAgIH0gZWxzZSBpZiAodi0+ZmNtID09IElMQUNFX0ZSQU1FKSB7CisgICAgICAgICAgICBpZiAodi0+ZXh0ZW5kZWRfZG12KQorICAgICAgICAgICAgICAgIHYtPmRtdnJhbmdlID0gZ2V0X3VuYXJ5KGdiLCAwLCAzKTsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSAvKiBpbnRjb21wIC0gcHJlc2VudCBidXQgc2hhbGwgYWx3YXlzIGJlIDAgKi8KKyAgICAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnRlbnNpdHkgY29tcGVuc2F0aW9uIHNldCBmb3IgQiBwaWN0dXJlXG4iKTsKKyAgICAgICAgICAgIHYtPmludGNvbXAgICAgICAgICAgPSAwOworICAgICAgICAgICAgdi0+bXZfbW9kZSAgICAgICAgICA9IE1WX1BNT0RFXzFNVjsKKyAgICAgICAgICAgIHYtPmZvdXJtdnN3aXRjaCAgICAgPSAwOworICAgICAgICAgICAgdi0+cXNfbGFzdCAgICAgICAgICA9IHYtPnMucXVhcnRlcl9zYW1wbGU7CisgICAgICAgICAgICB2LT5zLnF1YXJ0ZXJfc2FtcGxlID0gMTsKKyAgICAgICAgICAgIHYtPnMubXNwZWwgICAgICAgICAgPSAxOworICAgICAgICAgICAgc3RhdHVzICAgICAgICAgICAgICA9IGJpdHBsYW5lX2RlY29kaW5nKHYtPmRpcmVjdF9tYl9wbGFuZSwgJnYtPmRtYl9pc19yYXcsIHYpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19ERUJVRywgIk1CIERpcmVjdCBUeXBlIHBsYW5lIGVuY29kaW5nOiAiCisgICAgICAgICAgICAgICAgICAgIkltb2RlOiAlaSwgSW52ZXJ0OiAlaVxuIiwgc3RhdHVzPj4xLCBzdGF0dXMmMSk7CisgICAgICAgICAgICBzdGF0dXMgPSBiaXRwbGFuZV9kZWNvZGluZyh2LT5zLm1ic2tpcF90YWJsZSwgJnYtPnNraXBfaXNfcmF3LCB2KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfREVCVUcsICJNQiBTa2lwIHBsYW5lIGVuY29kaW5nOiAiCisgICAgICAgICAgICAgICAgICAgIkltb2RlOiAlaSwgSW52ZXJ0OiAlaVxuIiwgc3RhdHVzPj4xLCBzdGF0dXMmMSk7CisgICAgICAgICAgICBtYm1vZGV0YWIgICAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICB2LT5tYm1vZGVfdmxjICAgPSAmZmZfdmMxX2ludGZyX25vbjRtdl9tYm1vZGVfdmxjW21ibW9kZXRhYl07CisgICAgICAgICAgICBpbXZ0YWIgICAgICAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICB2LT5pbXZfdmxjICAgICAgPSAmZmZfdmMxXzFyZWZfbXZkYXRhX3ZsY1tpbXZ0YWJdOworICAgICAgICAgICAgLy8gaW50ZXJsYWNlZCBwL2ItcGljdHVyZSBjYnBjeSByYW5nZSBpcyBbMSwgNjNdCisgICAgICAgICAgICBpY2JwdGFiICAgICAgICAgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgICAgICAgICB2LT5jYnBjeV92bGMgICAgPSAmZmZfdmMxX2ljYnBjeV92bGNbaWNicHRhYl07CisgICAgICAgICAgICB0d29tdmJwdGFiICAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICB2LT50d29tdmJwX3ZsYyAgPSAmZmZfdmMxXzJtdl9ibG9ja19wYXR0ZXJuX3ZsY1t0d29tdmJwdGFiXTsKKyAgICAgICAgICAgIGZvdXJtdmJwdGFiICAgICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgIHYtPmZvdXJtdmJwX3ZsYyA9ICZmZl92YzFfNG12X2Jsb2NrX3BhdHRlcm5fdmxjW2ZvdXJtdmJwdGFiXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHYtPm12X21vZGUgICAgICAgICAgPSBnZXRfYml0czEoZ2IpID8gTVZfUE1PREVfMU1WIDogTVZfUE1PREVfMU1WX0hQRUxfQklMSU47CisgICAgICAgICAgICB2LT5xc19sYXN0ICAgICAgICAgID0gdi0+cy5xdWFydGVyX3NhbXBsZTsKKyAgICAgICAgICAgIHYtPnMucXVhcnRlcl9zYW1wbGUgPSAodi0+bXZfbW9kZSA9PSBNVl9QTU9ERV8xTVYpOworICAgICAgICAgICAgdi0+cy5tc3BlbCAgICAgICAgICA9IHYtPnMucXVhcnRlcl9zYW1wbGU7CisgICAgICAgICAgICBzdGF0dXMgICAgICAgICAgICAgID0gYml0cGxhbmVfZGVjb2Rpbmcodi0+ZGlyZWN0X21iX3BsYW5lLCAmdi0+ZG1iX2lzX3Jhdywgdik7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiTUIgRGlyZWN0IFR5cGUgcGxhbmUgZW5jb2Rpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAiSW1vZGU6ICVpLCBJbnZlcnQ6ICVpXG4iLCBzdGF0dXM+PjEsIHN0YXR1cyYxKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGJpdHBsYW5lX2RlY29kaW5nKHYtPnMubWJza2lwX3RhYmxlLCAmdi0+c2tpcF9pc19yYXcsIHYpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19ERUJVRywgIk1CIFNraXAgcGxhbmUgZW5jb2Rpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAiSW1vZGU6ICVpLCBJbnZlcnQ6ICVpXG4iLCBzdGF0dXM+PjEsIHN0YXR1cyYxKTsKKyAgICAgICAgICAgIHYtPnMubXZfdGFibGVfaW5kZXggPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICB2LT5jYnBjeV92bGMgPSAmZmZfdmMxX2NicGN5X3BfdmxjW2dldF9iaXRzKGdiLCAyKV07CisgICAgICAgIH0KKworICAgICAgICBpZiAodi0+ZHF1YW50KSB7CisgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVk9QIERRdWFudCBpbmZvXG4iKTsKKyAgICAgICAgICAgIHZvcF9kcXVhbnRfZGVjb2Rpbmcodik7CisgICAgICAgIH0KKworICAgICAgICB2LT50dGZybSA9IDA7CisgICAgICAgIGlmICh2LT52c3RyYW5zZm9ybSkgeworICAgICAgICAgICAgdi0+dHRtYmYgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgaWYgKHYtPnR0bWJmKSB7CisgICAgICAgICAgICAgICAgdi0+dHRmcm0gPSBmZl92YzFfdHRmcm1fdG9fdHRbZ2V0X2JpdHMoZ2IsIDIpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHYtPnR0bWJmID0gMTsKKyAgICAgICAgICAgIHYtPnR0ZnJtID0gVFRfOFg4OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh2LT5mY20gIT0gUFJPR1JFU1NJVkUgJiYgIXYtPnMucXVhcnRlcl9zYW1wbGUpIHsKKyAgICAgICAgdi0+cmFuZ2VfeCA8PD0gMTsKKyAgICAgICAgdi0+cmFuZ2VfeSA8PD0gMTsKKyAgICB9CisKKyAgICAvKiBBQyBTeW50YXggKi8KKyAgICB2LT5jX2FjX3RhYmxlX2luZGV4ID0gZGVjb2RlMDEyKGdiKTsKKyAgICBpZiAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgfHwgdi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0JJKSB7CisgICAgICAgIHYtPnlfYWNfdGFibGVfaW5kZXggPSBkZWNvZGUwMTIoZ2IpOworICAgIH0KKyAgICAvKiBEQyBTeW50YXggKi8KKyAgICB2LT5zLmRjX3RhYmxlX2luZGV4ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAoKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JIHx8IHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CSSkKKyAgICAgICAgJiYgdi0+ZHF1YW50KSB7CisgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfREVCVUcsICJWT1AgRFF1YW50IGluZm9cbiIpOworICAgICAgICB2b3BfZHF1YW50X2RlY29kaW5nKHYpOworICAgIH0KKworICAgIHYtPmJpX3R5cGUgPSAwOworICAgIGlmICh2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQkkpIHsKKyAgICAgICAgdi0+cy5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfQjsKKyAgICAgICAgdi0+YmlfdHlwZSA9IDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgdWludDMyX3QgdmMxX2FjX3RhYmxlc1tBQ19NT0RFU11bMTg2XVsyXSA9IHsKK3sKK3sgMHgwMDAxLCAgMn0sIHsgMHgwMDA1LCAgM30sIHsgMHgwMDBELCAgNH0sIHsgMHgwMDEyLCAgNX0sIHsgMHgwMDBFLCAgNn0sIHsgMHgwMDE1LCAgN30sCit7IDB4MDAxMywgIDh9LCB7IDB4MDAzRiwgIDh9LCB7IDB4MDA0QiwgIDl9LCB7IDB4MDExRiwgIDl9LCB7IDB4MDBCOCwgMTB9LCB7IDB4MDNFMywgMTB9LAoreyAweDAxNzIsIDExfSwgeyAweDAyNEQsIDEyfSwgeyAweDAzREEsIDEyfSwgeyAweDAyREQsIDEzfSwgeyAweDFGNTUsIDEzfSwgeyAweDA1QjksIDE0fSwKK3sgMHgzRUFFLCAxNH0sIHsgMHgwMDAwLCAgNH0sIHsgMHgwMDEwLCAgNX0sIHsgMHgwMDA4LCAgN30sIHsgMHgwMDIwLCAgOH0sIHsgMHgwMDI5LCAgOX0sCit7IDB4MDFGNCwgIDl9LCB7IDB4MDIzMywgMTB9LCB7IDB4MDFFMCwgMTF9LCB7IDB4MDEyQSwgMTJ9LCB7IDB4MDNERCwgMTJ9LCB7IDB4MDUwQSwgMTN9LAoreyAweDFGMjksIDEzfSwgeyAweDBBNDIsIDE0fSwgeyAweDEyNzIsIDE1fSwgeyAweDE3MzcsIDE1fSwgeyAweDAwMDMsICA1fSwgeyAweDAwMTEsICA3fSwKK3sgMHgwMEM0LCAgOH0sIHsgMHgwMDRCLCAxMH0sIHsgMHgwMEI0LCAxMX0sIHsgMHgwN0Q0LCAxMX0sIHsgMHgwMzQ1LCAxMn0sIHsgMHgwMkQ3LCAxM30sCit7IDB4MDdCRiwgMTN9LCB7IDB4MDkzOCwgMTR9LCB7IDB4MEJCQiwgMTR9LCB7IDB4MDk1RSwgMTV9LCB7IDB4MDAxMywgIDV9LCB7IDB4MDA3OCwgIDd9LAoreyAweDAwNjksICA5fSwgeyAweDAyMzIsIDEwfSwgeyAweDA0NjEsIDExfSwgeyAweDAzRUMsIDEyfSwgeyAweDA1MjAsIDEzfSwgeyAweDFGMkEsIDEzfSwKK3sgMHgzRTUwLCAxNH0sIHsgMHgzRTUxLCAxNH0sIHsgMHgxNDg2LCAxNX0sIHsgMHgwMDBDLCAgNn0sIHsgMHgwMDI0LCAgOX0sIHsgMHgwMDk0LCAxMX0sCit7IDB4MDhDMCwgMTJ9LCB7IDB4MEYwOSwgMTR9LCB7IDB4MUVGMCwgMTV9LCB7IDB4MDAzRCwgIDZ9LCB7IDB4MDA1MywgIDl9LCB7IDB4MDFBMCwgMTF9LAoreyAweDAyRDYsIDEzfSwgeyAweDBGMDgsIDE0fSwgeyAweDAwMTMsICA3fSwgeyAweDAwN0MsICA5fSwgeyAweDA3QzEsIDExfSwgeyAweDA0QUMsIDE0fSwKK3sgMHgwMDFCLCAgN30sIHsgMHgwMEEwLCAxMH0sIHsgMHgwMzQ0LCAxMn0sIHsgMHgwRjc5LCAxNH0sIHsgMHgwMDc5LCAgN30sIHsgMHgwM0UxLCAxMH0sCit7IDB4MDJENCwgMTN9LCB7IDB4MjMwNiwgMTR9LCB7IDB4MDAyMSwgIDh9LCB7IDB4MDIzQywgMTB9LCB7IDB4MEZBRSwgMTJ9LCB7IDB4MjNERSwgMTR9LAoreyAweDAwMzUsICA4fSwgeyAweDAxNzUsIDExfSwgeyAweDA3QjMsIDEzfSwgeyAweDAwQzUsICA4fSwgeyAweDAxNzQsIDExfSwgeyAweDA3ODUsIDEzfSwKK3sgMHgwMDQ4LCAgOX0sIHsgMHgwMUEzLCAxMX0sIHsgMHgwNDlFLCAxM30sIHsgMHgwMDJDLCAgOX0sIHsgMHgwMEZBLCAxMH0sIHsgMHgwN0Q2LCAxMX0sCit7IDB4MDA5MiwgMTB9LCB7IDB4MDVDQywgMTN9LCB7IDB4MUVGMSwgMTV9LCB7IDB4MDBBMywgMTB9LCB7IDB4MDNFRCwgMTJ9LCB7IDB4MDkzRSwgMTR9LAoreyAweDAxRTIsIDExfSwgeyAweDEyNzMsIDE1fSwgeyAweDA3QzQsIDExfSwgeyAweDE0ODcsIDE1fSwgeyAweDAyOTEsIDEyfSwgeyAweDAyOTMsIDEyfSwKK3sgMHgwRjhBLCAxMn0sIHsgMHgwNTA5LCAxM30sIHsgMHgwNTA4LCAxM30sIHsgMHgwNzhELCAxM30sIHsgMHgwN0JFLCAxM30sIHsgMHgwNzhDLCAxM30sCit7IDB4MDRBRSwgMTR9LCB7IDB4MEJCQSwgMTR9LCB7IDB4MjMwNywgMTR9LCB7IDB4MEI5QSwgMTR9LCB7IDB4MTczNiwgMTV9LCB7IDB4MDAwRSwgIDR9LAoreyAweDAwNDUsICA3fSwgeyAweDAxRjMsICA5fSwgeyAweDA0N0EsIDExfSwgeyAweDA1REMsIDEzfSwgeyAweDIzREYsIDE0fSwgeyAweDAwMTksICA1fSwKK3sgMHgwMDI4LCAgOX0sIHsgMHgwMTc2LCAxMX0sIHsgMHgwNDlELCAxM30sIHsgMHgyM0RELCAxNH0sIHsgMHgwMDMwLCAgNn0sIHsgMHgwMEEyLCAxMH0sCit7IDB4MDJFRiwgMTJ9LCB7IDB4MDVCOCwgMTR9LCB7IDB4MDAzRiwgIDZ9LCB7IDB4MDBBNSwgMTB9LCB7IDB4MDNEQiwgMTJ9LCB7IDB4MDkzRiwgMTR9LAoreyAweDAwNDQsICA3fSwgeyAweDA3Q0IsIDExfSwgeyAweDA5NUYsIDE1fSwgeyAweDAwNjMsICA3fSwgeyAweDAzQzMsIDEyfSwgeyAweDAwMTUsICA4fSwKK3sgMHgwOEY2LCAxMn0sIHsgMHgwMDE3LCAgOH0sIHsgMHgwNDk4LCAxM30sIHsgMHgwMDJDLCAgOH0sIHsgMHgwN0IyLCAxM30sIHsgMHgwMDJGLCAgOH0sCit7IDB4MUY1NCwgMTN9LCB7IDB4MDA4RCwgIDh9LCB7IDB4MDdCRCwgMTN9LCB7IDB4MDA4RSwgIDh9LCB7IDB4MTE4MiwgMTN9LCB7IDB4MDBGQiwgIDh9LAoreyAweDA1MEIsIDEzfSwgeyAweDAwMkQsICA4fSwgeyAweDA3QzAsIDExfSwgeyAweDAwNzksICA5fSwgeyAweDFGNUYsIDEzfSwgeyAweDAwN0EsICA5fSwKK3sgMHgxRjU2LCAxM30sIHsgMHgwMjMxLCAxMH0sIHsgMHgwM0U0LCAxMH0sIHsgMHgwMUExLCAxMX0sIHsgMHgwMTQzLCAxMX0sIHsgMHgwMUY3LCAxMX0sCit7IDB4MDE2RiwgMTJ9LCB7IDB4MDI5MiwgMTJ9LCB7IDB4MDJFNywgMTJ9LCB7IDB4MDE2QywgMTJ9LCB7IDB4MDE2RCwgMTJ9LCB7IDB4MDNEQywgMTJ9LAoreyAweDBGOEIsIDEyfSwgeyAweDA0OTksIDEzfSwgeyAweDAzRDgsIDEyfSwgeyAweDA3OEUsIDEzfSwgeyAweDAyRDUsIDEzfSwgeyAweDFGNUUsIDEzfSwKK3sgMHgxRjJCLCAxM30sIHsgMHgwNzhGLCAxM30sIHsgMHgwNEFELCAxNH0sIHsgMHgzRUFGLCAxNH0sIHsgMHgyM0RDLCAxNH0sIHsgMHgwMDRBLCAgOX0KK30sCit7Cit7IDB4MDAwMCwgIDN9LCB7IDB4MDAwMywgIDR9LCB7IDB4MDAwQiwgIDV9LCB7IDB4MDAxNCwgIDZ9LCB7IDB4MDAzRiwgIDZ9LCB7IDB4MDA1RCwgIDd9LAoreyAweDAwQTIsICA4fSwgeyAweDAwQUMsICA5fSwgeyAweDAxNkUsICA5fSwgeyAweDAyMEEsIDEwfSwgeyAweDAyRTIsIDEwfSwgeyAweDA0MzIsIDExfSwKK3sgMHgwNUM5LCAxMX0sIHsgMHgwODI3LCAxMn0sIHsgMHgwQjU0LCAxMn0sIHsgMHgwNEU2LCAxM30sIHsgMHgxMDVGLCAxM30sIHsgMHgxNzJBLCAxM30sCit7IDB4MjBCMiwgMTR9LCB7IDB4MkQ0RSwgMTR9LCB7IDB4MzlGMCwgMTR9LCB7IDB4NDE3NSwgMTV9LCB7IDB4NUE5RSwgMTV9LCB7IDB4MDAwNCwgIDR9LAoreyAweDAwMUUsICA1fSwgeyAweDAwNDIsICA3fSwgeyAweDAwQjYsICA4fSwgeyAweDAxNzMsICA5fSwgeyAweDAzOTUsIDEwfSwgeyAweDA3MkUsIDExfSwKK3sgMHgwQjk0LCAxMn0sIHsgMHgxNkE0LCAxM30sIHsgMHgyMEIzLCAxNH0sIHsgMHgyRTQ1LCAxNH0sIHsgMHgwMDA1LCAgNX0sIHsgMHgwMDQwLCAgN30sCit7IDB4MDA0OSwgIDl9LCB7IDB4MDI4RiwgMTB9LCB7IDB4MDVDQiwgMTF9LCB7IDB4MDQ4QSwgMTN9LCB7IDB4MDlERCwgMTR9LCB7IDB4NzNFMiwgMTV9LAoreyAweDAwMTgsICA1fSwgeyAweDAwMjUsICA4fSwgeyAweDAwOEEsIDEwfSwgeyAweDA1MUIsIDExfSwgeyAweDBFNUYsIDEyfSwgeyAweDA5QzksIDE0fSwKK3sgMHgxMzlDLCAxNX0sIHsgMHgwMDI5LCAgNn0sIHsgMHgwMDRGLCAgOX0sIHsgMHgwNDEyLCAxMX0sIHsgMHgwNDhELCAxM30sIHsgMHgyRTQxLCAxNH0sCit7IDB4MDAzOCwgIDZ9LCB7IDB4MDEwRSwgIDl9LCB7IDB4MDVBOCwgMTF9LCB7IDB4MTA1QywgMTN9LCB7IDB4MzlGMiwgMTR9LCB7IDB4MDA1OCwgIDd9LAoreyAweDAyMUYsIDEwfSwgeyAweDBFN0UsIDEyfSwgeyAweDM5RkYsIDE0fSwgeyAweDAwMjMsICA4fSwgeyAweDAyRTMsIDEwfSwgeyAweDA0RTUsIDEzfSwKK3sgMHgyRTQwLCAxNH0sIHsgMHgwMEExLCAgOH0sIHsgMHgwNUJFLCAxMX0sIHsgMHgwOUM4LCAxNH0sIHsgMHgwMDgzLCAgOH0sIHsgMHgwMTNBLCAxMX0sCit7IDB4MTcyMSwgMTN9LCB7IDB4MDA0NCwgIDl9LCB7IDB4MDI3NiwgMTJ9LCB7IDB4MzlGNiwgMTR9LCB7IDB4MDA4QiwgMTB9LCB7IDB4MDRFRiwgMTN9LAoreyAweDVBOUIsIDE1fSwgeyAweDAyMDgsIDEwfSwgeyAweDFDRkUsIDEzfSwgeyAweDAzOTksIDEwfSwgeyAweDFDQjQsIDEzfSwgeyAweDAzOUUsIDEwfSwKK3sgMHgzOUYzLCAxNH0sIHsgMHgwNUFCLCAxMX0sIHsgMHg3M0UzLCAxNX0sIHsgMHgwNzM3LCAxMX0sIHsgMHg1QTlGLCAxNX0sIHsgMHgwODJELCAxMn0sCit7IDB4MEU2OSwgMTJ9LCB7IDB4MEU2OCwgMTJ9LCB7IDB4MDQzMywgMTF9LCB7IDB4MEI3QiwgMTJ9LCB7IDB4MkRGOCwgMTR9LCB7IDB4MkU1NiwgMTR9LAoreyAweDJFNTcsIDE0fSwgeyAweDM5RjcsIDE0fSwgeyAweDUxQTUsIDE1fSwgeyAweDAwMDMsICAzfSwgeyAweDAwMkEsICA2fSwgeyAweDAwRTQsICA4fSwKK3sgMHgwMjhFLCAxMH0sIHsgMHgwNzM1LCAxMX0sIHsgMHgxMDU4LCAxM30sIHsgMHgxQ0ZBLCAxM30sIHsgMHgyREY5LCAxNH0sIHsgMHg0MTc0LCAxNX0sCit7IDB4MDAwOSwgIDR9LCB7IDB4MDA1NCwgIDh9LCB7IDB4MDM5OCwgMTB9LCB7IDB4MDQ4QiwgMTN9LCB7IDB4MTM5RCwgMTV9LCB7IDB4MDAwRCwgIDR9LAoreyAweDAwQUQsICA5fSwgeyAweDA4MjYsIDEyfSwgeyAweDJENEMsIDE0fSwgeyAweDAwMTEsICA1fSwgeyAweDAxNkIsICA5fSwgeyAweDBCN0YsIDEyfSwKK3sgMHg1MUE0LCAxNX0sIHsgMHgwMDE5LCAgNX0sIHsgMHgwMjFCLCAxMH0sIHsgMHgxNkZELCAxM30sIHsgMHgwMDFELCAgNX0sIHsgMHgwMzk0LCAxMH0sCit7IDB4MjhEMywgMTR9LCB7IDB4MDAyQiwgIDZ9LCB7IDB4MDVCQywgMTF9LCB7IDB4NUE5QSwgMTV9LCB7IDB4MDAyRiwgIDZ9LCB7IDB4MDI0NywgMTJ9LAoreyAweDAwMTAsICA3fSwgeyAweDBBMzUsIDEyfSwgeyAweDAwM0UsICA2fSwgeyAweDBCN0EsIDEyfSwgeyAweDAwNTksICA3fSwgeyAweDEwNUUsIDEzfSwKK3sgMHgwMDI2LCAgOH0sIHsgMHgwOUNGLCAxNH0sIHsgMHgwMDU1LCAgOH0sIHsgMHgxQ0I1LCAxM30sIHsgMHgwMDU3LCAgOH0sIHsgMHgwRTVCLCAxMn0sCit7IDB4MDBBMCwgIDh9LCB7IDB4MTQ2OCwgMTN9LCB7IDB4MDE3MCwgIDl9LCB7IDB4MDA5MCwgMTB9LCB7IDB4MDFDRSwgIDl9LCB7IDB4MDIxQSwgMTB9LAoreyAweDAyMTgsIDEwfSwgeyAweDAxNjgsICA5fSwgeyAweDAyMUUsIDEwfSwgeyAweDAyNDQsIDEyfSwgeyAweDA3MzYsIDExfSwgeyAweDAxMzgsIDExfSwKK3sgMHgwNTE5LCAxMX0sIHsgMHgwRTVFLCAxMn0sIHsgMHgwNzJDLCAxMX0sIHsgMHgwQjU1LCAxMn0sIHsgMHgwOURDLCAxNH0sIHsgMHgyMEJCLCAxNH0sCit7IDB4MDQ4QywgMTN9LCB7IDB4MTcyMywgMTN9LCB7IDB4MkU0NCwgMTR9LCB7IDB4MTZBNSwgMTN9LCB7IDB4MDUxOCwgMTF9LCB7IDB4MzlGRSwgMTR9LAoreyAweDAxNjksICA5fQorfSwKK3sKK3sgMHgwMDAxLCAgMn0sIHsgMHgwMDA2LCAgM30sIHsgMHgwMDBGLCAgNH0sIHsgMHgwMDE2LCAgNX0sIHsgMHgwMDIwLCAgNn0sIHsgMHgwMDE4LCAgN30sCit7IDB4MDAwOCwgIDh9LCB7IDB4MDA5QSwgIDh9LCB7IDB4MDA1NiwgIDl9LCB7IDB4MDEzRSwgIDl9LCB7IDB4MDBGMCwgMTB9LCB7IDB4MDNBNSwgMTB9LAoreyAweDAwNzcsIDExfSwgeyAweDAxRUYsIDExfSwgeyAweDAwOUEsIDEyfSwgeyAweDAwNUQsIDEzfSwgeyAweDAwMDEsICA0fSwgeyAweDAwMTEsICA1fSwKK3sgMHgwMDAyLCAgN30sIHsgMHgwMDBCLCAgOH0sIHsgMHgwMDEyLCAgOX0sIHsgMHgwMUQ2LCAgOX0sIHsgMHgwMjdFLCAxMH0sIHsgMHgwMTkxLCAxMX0sCit7IDB4MDBFQSwgMTJ9LCB7IDB4MDNEQywgMTJ9LCB7IDB4MDEzQiwgMTN9LCB7IDB4MDAwNCwgIDV9LCB7IDB4MDAxNCwgIDd9LCB7IDB4MDA5RSwgIDh9LAoreyAweDAwMDksIDEwfSwgeyAweDAxQUMsIDExfSwgeyAweDAxRTIsIDExfSwgeyAweDAzQ0EsIDEyfSwgeyAweDAwNUYsIDEzfSwgeyAweDAwMTcsICA1fSwKK3sgMHgwMDRFLCAgN30sIHsgMHgwMDVFLCAgOX0sIHsgMHgwMEYzLCAxMH0sIHsgMHgwMUFELCAxMX0sIHsgMHgwMEVDLCAxMn0sIHsgMHgwNUYwLCAxM30sCit7IDB4MDAwRSwgIDZ9LCB7IDB4MDBFMSwgIDh9LCB7IDB4MDNBNCwgMTB9LCB7IDB4MDA5QywgMTJ9LCB7IDB4MDEzRCwgMTN9LCB7IDB4MDAzQiwgIDZ9LAoreyAweDAwMUMsICA5fSwgeyAweDAwMTQsIDExfSwgeyAweDA5QkUsIDEyfSwgeyAweDAwMDYsICA3fSwgeyAweDAwN0EsICA5fSwgeyAweDAxOTAsIDExfSwKK3sgMHgwMTM3LCAxM30sIHsgMHgwMDFCLCAgN30sIHsgMHgwMDA4LCAxMH0sIHsgMHgwNzVDLCAxMX0sIHsgMHgwMDcxLCAgN30sIHsgMHgwMEQ3LCAxMH0sCit7IDB4MDlCRiwgMTJ9LCB7IDB4MDAwNywgIDh9LCB7IDB4MDBBRiwgMTB9LCB7IDB4MDRDQywgMTF9LCB7IDB4MDAzNCwgIDh9LCB7IDB4MDI2NSwgMTB9LAoreyAweDAwOUYsIDEyfSwgeyAweDAwRTAsICA4fSwgeyAweDAwMTYsIDExfSwgeyAweDAzMjcsIDEyfSwgeyAweDAwMTUsICA5fSwgeyAweDAxN0QsIDExfSwKK3sgMHgwRUJCLCAxMn0sIHsgMHgwMDE0LCAgOX0sIHsgMHgwMEY2LCAxMH0sIHsgMHgwMUU0LCAxMX0sIHsgMHgwMENCLCAxMH0sIHsgMHgwOTlELCAxMn0sCit7IDB4MDBDQSwgMTB9LCB7IDB4MDJGQywgMTJ9LCB7IDB4MDE3RiwgMTF9LCB7IDB4MDRDRCwgMTF9LCB7IDB4MDJGRCwgMTJ9LCB7IDB4MDRGRSwgMTF9LAoreyAweDAxM0EsIDEzfSwgeyAweDAwMEEsICA0fSwgeyAweDAwNDIsICA3fSwgeyAweDAxRDMsICA5fSwgeyAweDA0REQsIDExfSwgeyAweDAwMTIsICA1fSwKK3sgMHgwMEU4LCAgOH0sIHsgMHgwMDRDLCAxMX0sIHsgMHgwMTM2LCAxM30sIHsgMHgwMDM5LCAgNn0sIHsgMHgwMjY0LCAxMH0sIHsgMHgwRUJBLCAxMn0sCit7IDB4MDAwMCwgIDd9LCB7IDB4MDBBRSwgMTB9LCB7IDB4MDk5QywgMTJ9LCB7IDB4MDAxRiwgIDd9LCB7IDB4MDRERSwgMTF9LCB7IDB4MDA0MywgIDd9LAoreyAweDA0REMsIDExfSwgeyAweDAwMDMsICA4fSwgeyAweDAzQ0IsIDEyfSwgeyAweDAwMDYsICA4fSwgeyAweDA5OUUsIDEyfSwgeyAweDAwMkEsICA4fSwKK3sgMHgwNUYxLCAxM30sIHsgMHgwMDBGLCAgOH0sIHsgMHgwOUZFLCAxMn0sIHsgMHgwMDMzLCAgOH0sIHsgMHgwOUZGLCAxMn0sIHsgMHgwMDk4LCAgOH0sCit7IDB4MDk5RiwgMTJ9LCB7IDB4MDBFQSwgIDh9LCB7IDB4MDEzQywgMTN9LCB7IDB4MDAyRSwgIDh9LCB7IDB4MDE5MiwgMTF9LCB7IDB4MDEzNiwgIDl9LAoreyAweDAwNkEsICA5fSwgeyAweDAwMTUsIDExfSwgeyAweDAzQUYsIDEwfSwgeyAweDAxRTMsIDExfSwgeyAweDAwNzQsIDExfSwgeyAweDAwRUIsIDEyfSwKK3sgMHgwMkY5LCAxMn0sIHsgMHgwMDVDLCAxM30sIHsgMHgwMEVELCAxMn0sIHsgMHgwM0RELCAxMn0sIHsgMHgwMzI2LCAxMn0sIHsgMHgwMDVFLCAxM30sCit7IDB4MDAxNiwgIDd9Cit9LAoreworeyAweDAwMDQsICAzfSwgeyAweDAwMTQsICA1fSwgeyAweDAwMTcsICA3fSwgeyAweDAwN0YsICA4fSwgeyAweDAxNTQsICA5fSwgeyAweDAxRjIsIDEwfSwKK3sgMHgwMEJGLCAxMX0sIHsgMHgwMDY1LCAxMn0sIHsgMHgwQUFBLCAxMn0sIHsgMHgwNjMwLCAxM30sIHsgMHgxNTk3LCAxM30sIHsgMHgwM0I3LCAxNH0sCit7IDB4MkIyMiwgMTR9LCB7IDB4MEJFNiwgMTV9LCB7IDB4MDAwQiwgIDR9LCB7IDB4MDAzNywgIDd9LCB7IDB4MDA2MiwgIDl9LCB7IDB4MDAwNywgMTF9LAoreyAweDAxNjYsIDEyfSwgeyAweDAwQ0UsIDEzfSwgeyAweDE1OTAsIDEzfSwgeyAweDA1RjYsIDE0fSwgeyAweDBCRTcsIDE1fSwgeyAweDAwMDcsICA1fSwKK3sgMHgwMDZELCAgOH0sIHsgMHgwMDAzLCAxMX0sIHsgMHgwMzFGLCAxMn0sIHsgMHgwNUYyLCAxNH0sIHsgMHgwMDAyLCAgNn0sIHsgMHgwMDYxLCAgOX0sCit7IDB4MDA1NSwgMTJ9LCB7IDB4MDFERiwgMTR9LCB7IDB4MDAxQSwgIDZ9LCB7IDB4MDAxRSwgMTB9LCB7IDB4MEFDOSwgMTJ9LCB7IDB4MkIyMywgMTR9LAoreyAweDAwMUUsICA2fSwgeyAweDAwMUYsIDEwfSwgeyAweDBBQzMsIDEyfSwgeyAweDJCMkIsIDE0fSwgeyAweDAwMDYsICA3fSwgeyAweDAwMDQsIDExfSwKK3sgMHgwMkY4LCAxM30sIHsgMHgwMDE5LCAgN30sIHsgMHgwMDA2LCAxMX0sIHsgMHgwNjNELCAxM30sIHsgMHgwMDU3LCAgN30sIHsgMHgwMTgyLCAxMX0sCit7IDB4MkFBMiwgMTR9LCB7IDB4MDAwNCwgIDh9LCB7IDB4MDE4MCwgMTF9LCB7IDB4MDU5QywgMTR9LCB7IDB4MDA3RCwgIDh9LCB7IDB4MDE2NCwgMTJ9LAoreyAweDA3NkQsIDE1fSwgeyAweDAwMDIsICA5fSwgeyAweDAxOEQsIDExfSwgeyAweDE1ODEsIDEzfSwgeyAweDAwQUQsICA4fSwgeyAweDAwNjAsIDEyfSwKK3sgMHgwQzY3LCAxNH0sIHsgMHgwMDFDLCAgOX0sIHsgMHgwMEVFLCAxM30sIHsgMHgwMDAzLCAgOX0sIHsgMHgwMkNGLCAxM30sIHsgMHgwMEQ5LCAgOX0sCit7IDB4MTU4MCwgMTN9LCB7IDB4MDAwMiwgMTF9LCB7IDB4MDE4MywgMTF9LCB7IDB4MDA1NywgMTJ9LCB7IDB4MDA2MSwgMTJ9LCB7IDB4MDAzMSwgMTF9LAoreyAweDAwNjYsIDEyfSwgeyAweDA2MzEsIDEzfSwgeyAweDA2MzIsIDEzfSwgeyAweDAwQUMsIDEzfSwgeyAweDAzMUQsIDEyfSwgeyAweDAwNzYsIDEyfSwKK3sgMHgwMDNBLCAxMX0sIHsgMHgwMTY1LCAxMn0sIHsgMHgwQzY2LCAxNH0sIHsgMHgwMDAzLCAgMn0sIHsgMHgwMDU0LCAgN30sIHsgMHgwMkFCLCAxMH0sCit7IDB4MDAxNiwgMTN9LCB7IDB4MDVGNywgMTR9LCB7IDB4MDAwNSwgIDR9LCB7IDB4MDBGOCwgIDl9LCB7IDB4MEFBOSwgMTJ9LCB7IDB4MDA1RiwgMTV9LAoreyAweDAwMDQsICA0fSwgeyAweDAwMUMsIDEwfSwgeyAweDE1NTAsIDEzfSwgeyAweDAwMDQsICA1fSwgeyAweDAwNzcsIDExfSwgeyAweDA3NkMsIDE1fSwKK3sgMHgwMDBFLCAgNX0sIHsgMHgwMDBBLCAxMn0sIHsgMHgwMDBDLCAgNX0sIHsgMHgwNTYyLCAxMX0sIHsgMHgwMDA0LCAgNn0sIHsgMHgwMzFDLCAxMn0sCit7IDB4MDAwNiwgIDZ9LCB7IDB4MDBDOCwgMTN9LCB7IDB4MDAwRCwgIDZ9LCB7IDB4MDFEQSwgMTN9LCB7IDB4MDAwNywgIDZ9LCB7IDB4MDBDOSwgMTN9LAoreyAweDAwMDEsICA3fSwgeyAweDAwMkUsIDE0fSwgeyAweDAwMTQsICA3fSwgeyAweDE1OTYsIDEzfSwgeyAweDAwMEEsICA3fSwgeyAweDBBQzIsIDEyfSwKK3sgMHgwMDE2LCAgN30sIHsgMHgwMTVCLCAxNH0sIHsgMHgwMDE1LCAgN30sIHsgMHgwMTVBLCAxNH0sIHsgMHgwMDBGLCAgOH0sIHsgMHgwMDVFLCAxNX0sCit7IDB4MDA3RSwgIDh9LCB7IDB4MDBBQiwgIDh9LCB7IDB4MDAyRCwgIDl9LCB7IDB4MDBEOCwgIDl9LCB7IDB4MDAwQiwgIDl9LCB7IDB4MDAxNCwgMTB9LAoreyAweDAyQjMsIDEwfSwgeyAweDAxRjMsIDEwfSwgeyAweDAwM0EsIDEwfSwgeyAweDAwMDAsIDEwfSwgeyAweDAwNTgsIDEwfSwgeyAweDAwMkUsICA5fSwKK3sgMHgwMDVFLCAxMH0sIHsgMHgwNTYzLCAxMX0sIHsgMHgwMEVDLCAxMn0sIHsgMHgwMDU0LCAxMn0sIHsgMHgwQUMxLCAxMn0sIHsgMHgxNTU2LCAxM30sCit7IDB4MDJGQSwgMTN9LCB7IDB4MDE4MSwgMTF9LCB7IDB4MTU1NywgMTN9LCB7IDB4MDU5RCwgMTR9LCB7IDB4MkFBMywgMTR9LCB7IDB4MkIyQSwgMTR9LAoreyAweDAxREUsIDE0fSwgeyAweDA2M0MsIDEzfSwgeyAweDAwQ0YsIDEzfSwgeyAweDE1OTQsIDEzfSwgeyAweDAwMEQsICA5fQorfSwKK3sKK3sgMHgwMDAyLCAgMn0sIHsgMHgwMDA2LCAgM30sIHsgMHgwMDBGLCAgNH0sIHsgMHgwMDBELCAgNX0sIHsgMHgwMDBDLCAgNX0sIHsgMHgwMDE1LCAgNn0sCit7IDB4MDAxMywgIDZ9LCB7IDB4MDAxMiwgIDZ9LCB7IDB4MDAxNywgIDd9LCB7IDB4MDAxRiwgIDh9LCB7IDB4MDAxRSwgIDh9LCB7IDB4MDAxRCwgIDh9LAoreyAweDAwMjUsICA5fSwgeyAweDAwMjQsICA5fSwgeyAweDAwMjMsICA5fSwgeyAweDAwMjEsICA5fSwgeyAweDAwMjEsIDEwfSwgeyAweDAwMjAsIDEwfSwKK3sgMHgwMDBGLCAxMH0sIHsgMHgwMDBFLCAxMH0sIHsgMHgwMDA3LCAxMX0sIHsgMHgwMDA2LCAxMX0sIHsgMHgwMDIwLCAxMX0sIHsgMHgwMDIxLCAxMX0sCit7IDB4MDA1MCwgMTJ9LCB7IDB4MDA1MSwgMTJ9LCB7IDB4MDA1MiwgMTJ9LCB7IDB4MDAwRSwgIDR9LCB7IDB4MDAxNCwgIDZ9LCB7IDB4MDAxNiwgIDd9LAoreyAweDAwMUMsICA4fSwgeyAweDAwMjAsICA5fSwgeyAweDAwMUYsICA5fSwgeyAweDAwMEQsIDEwfSwgeyAweDAwMjIsIDExfSwgeyAweDAwNTMsIDEyfSwKK3sgMHgwMDU1LCAxMn0sIHsgMHgwMDBCLCAgNX0sIHsgMHgwMDE1LCAgN30sIHsgMHgwMDFFLCAgOX0sIHsgMHgwMDBDLCAxMH0sIHsgMHgwMDU2LCAxMn0sCit7IDB4MDAxMSwgIDZ9LCB7IDB4MDAxQiwgIDh9LCB7IDB4MDAxRCwgIDl9LCB7IDB4MDAwQiwgMTB9LCB7IDB4MDAxMCwgIDZ9LCB7IDB4MDAyMiwgIDl9LAoreyAweDAwMEEsIDEwfSwgeyAweDAwMEQsICA2fSwgeyAweDAwMUMsICA5fSwgeyAweDAwMDgsIDEwfSwgeyAweDAwMTIsICA3fSwgeyAweDAwMUIsICA5fSwKK3sgMHgwMDU0LCAxMn0sIHsgMHgwMDE0LCAgN30sIHsgMHgwMDFBLCAgOX0sIHsgMHgwMDU3LCAxMn0sIHsgMHgwMDE5LCAgOH0sIHsgMHgwMDA5LCAxMH0sCit7IDB4MDAxOCwgIDh9LCB7IDB4MDAyMywgMTF9LCB7IDB4MDAxNywgIDh9LCB7IDB4MDAxOSwgIDl9LCB7IDB4MDAxOCwgIDl9LCB7IDB4MDAwNywgMTB9LAoreyAweDAwNTgsIDEyfSwgeyAweDAwMDcsICA0fSwgeyAweDAwMEMsICA2fSwgeyAweDAwMTYsICA4fSwgeyAweDAwMTcsICA5fSwgeyAweDAwMDYsIDEwfSwKK3sgMHgwMDA1LCAxMX0sIHsgMHgwMDA0LCAxMX0sIHsgMHgwMDU5LCAxMn0sIHsgMHgwMDBGLCAgNn0sIHsgMHgwMDE2LCAgOX0sIHsgMHgwMDA1LCAxMH0sCit7IDB4MDAwRSwgIDZ9LCB7IDB4MDAwNCwgMTB9LCB7IDB4MDAxMSwgIDd9LCB7IDB4MDAyNCwgMTF9LCB7IDB4MDAxMCwgIDd9LCB7IDB4MDAyNSwgMTF9LAoreyAweDAwMTMsICA3fSwgeyAweDAwNUEsIDEyfSwgeyAweDAwMTUsICA4fSwgeyAweDAwNUIsIDEyfSwgeyAweDAwMTQsICA4fSwgeyAweDAwMTMsICA4fSwKK3sgMHgwMDFBLCAgOH0sIHsgMHgwMDE1LCAgOX0sIHsgMHgwMDE0LCAgOX0sIHsgMHgwMDEzLCAgOX0sIHsgMHgwMDEyLCAgOX0sIHsgMHgwMDExLCAgOX0sCit7IDB4MDAyNiwgMTF9LCB7IDB4MDAyNywgMTF9LCB7IDB4MDA1QywgMTJ9LCB7IDB4MDA1RCwgMTJ9LCB7IDB4MDA1RSwgMTJ9LCB7IDB4MDA1RiwgMTJ9LAoreyAweDAwMDMsICA3fQorfSwKK3sKK3sgMHgwMDAyLCAgMn0sIHsgMHgwMDBGLCAgNH0sIHsgMHgwMDE1LCAgNn0sIHsgMHgwMDE3LCAgN30sIHsgMHgwMDFGLCAgOH0sIHsgMHgwMDI1LCAgOX0sCit7IDB4MDAyNCwgIDl9LCB7IDB4MDAyMSwgMTB9LCB7IDB4MDAyMCwgMTB9LCB7IDB4MDAwNywgMTF9LCB7IDB4MDAwNiwgMTF9LCB7IDB4MDAyMCwgMTF9LAoreyAweDAwMDYsICAzfSwgeyAweDAwMTQsICA2fSwgeyAweDAwMUUsICA4fSwgeyAweDAwMEYsIDEwfSwgeyAweDAwMjEsIDExfSwgeyAweDAwNTAsIDEyfSwKK3sgMHgwMDBFLCAgNH0sIHsgMHgwMDFELCAgOH0sIHsgMHgwMDBFLCAxMH0sIHsgMHgwMDUxLCAxMn0sIHsgMHgwMDBELCAgNX0sIHsgMHgwMDIzLCAgOX0sCit7IDB4MDAwRCwgMTB9LCB7IDB4MDAwQywgIDV9LCB7IDB4MDAyMiwgIDl9LCB7IDB4MDA1MiwgMTJ9LCB7IDB4MDAwQiwgIDV9LCB7IDB4MDAwQywgMTB9LAoreyAweDAwNTMsIDEyfSwgeyAweDAwMTMsICA2fSwgeyAweDAwMEIsIDEwfSwgeyAweDAwNTQsIDEyfSwgeyAweDAwMTIsICA2fSwgeyAweDAwMEEsIDEwfSwKK3sgMHgwMDExLCAgNn0sIHsgMHgwMDA5LCAxMH0sIHsgMHgwMDEwLCAgNn0sIHsgMHgwMDA4LCAxMH0sIHsgMHgwMDE2LCAgN30sIHsgMHgwMDU1LCAxMn0sCit7IDB4MDAxNSwgIDd9LCB7IDB4MDAxNCwgIDd9LCB7IDB4MDAxQywgIDh9LCB7IDB4MDAxQiwgIDh9LCB7IDB4MDAyMSwgIDl9LCB7IDB4MDAyMCwgIDl9LAoreyAweDAwMUYsICA5fSwgeyAweDAwMUUsICA5fSwgeyAweDAwMUQsICA5fSwgeyAweDAwMUMsICA5fSwgeyAweDAwMUIsICA5fSwgeyAweDAwMUEsICA5fSwKK3sgMHgwMDIyLCAxMX0sIHsgMHgwMDIzLCAxMX0sIHsgMHgwMDU2LCAxMn0sIHsgMHgwMDU3LCAxMn0sIHsgMHgwMDA3LCAgNH0sIHsgMHgwMDE5LCAgOX0sCit7IDB4MDAwNSwgMTF9LCB7IDB4MDAwRiwgIDZ9LCB7IDB4MDAwNCwgMTF9LCB7IDB4MDAwRSwgIDZ9LCB7IDB4MDAwRCwgIDZ9LCB7IDB4MDAwQywgIDZ9LAoreyAweDAwMTMsICA3fSwgeyAweDAwMTIsICA3fSwgeyAweDAwMTEsICA3fSwgeyAweDAwMTAsICA3fSwgeyAweDAwMUEsICA4fSwgeyAweDAwMTksICA4fSwKK3sgMHgwMDE4LCAgOH0sIHsgMHgwMDE3LCAgOH0sIHsgMHgwMDE2LCAgOH0sIHsgMHgwMDE1LCAgOH0sIHsgMHgwMDE0LCAgOH0sIHsgMHgwMDEzLCAgOH0sCit7IDB4MDAxOCwgIDl9LCB7IDB4MDAxNywgIDl9LCB7IDB4MDAxNiwgIDl9LCB7IDB4MDAxNSwgIDl9LCB7IDB4MDAxNCwgIDl9LCB7IDB4MDAxMywgIDl9LAoreyAweDAwMTIsICA5fSwgeyAweDAwMTEsICA5fSwgeyAweDAwMDcsIDEwfSwgeyAweDAwMDYsIDEwfSwgeyAweDAwMDUsIDEwfSwgeyAweDAwMDQsIDEwfSwKK3sgMHgwMDI0LCAxMX0sIHsgMHgwMDI1LCAxMX0sIHsgMHgwMDI2LCAxMX0sIHsgMHgwMDI3LCAxMX0sIHsgMHgwMDU4LCAxMn0sIHsgMHgwMDU5LCAxMn0sCit7IDB4MDA1QSwgMTJ9LCB7IDB4MDA1QiwgMTJ9LCB7IDB4MDA1QywgMTJ9LCB7IDB4MDA1RCwgMTJ9LCB7IDB4MDA1RSwgMTJ9LCB7IDB4MDA1RiwgMTJ9LAoreyAweDAwMDMsICA3fQorfSwKK3sKK3sgMHgwMDAwLCAgMn0sIHsgMHgwMDAzLCAgM30sIHsgMHgwMDBELCAgNH0sIHsgMHgwMDA1LCAgNH0sIHsgMHgwMDFDLCAgNX0sIHsgMHgwMDE2LCAgNX0sCit7IDB4MDAzRiwgIDZ9LCB7IDB4MDAzQSwgIDZ9LCB7IDB4MDAyRSwgIDZ9LCB7IDB4MDAyMiwgIDZ9LCB7IDB4MDA3QiwgIDd9LCB7IDB4MDA2NywgIDd9LAoreyAweDAwNUYsICA3fSwgeyAweDAwNDcsICA3fSwgeyAweDAwMjYsICA3fSwgeyAweDAwRUYsICA4fSwgeyAweDAwQ0QsICA4fSwgeyAweDAwQzEsICA4fSwKK3sgMHgwMEE5LCAgOH0sIHsgMHgwMDRGLCAgOH0sIHsgMHgwMUYyLCAgOX0sIHsgMHgwMURELCAgOX0sIHsgMHgwMTk5LCAgOX0sIHsgMHgwMTg1LCAgOX0sCit7IDB4MDE1RCwgIDl9LCB7IDB4MDExQiwgIDl9LCB7IDB4MDNFRiwgMTB9LCB7IDB4MDNFMSwgMTB9LCB7IDB4MDNDOCwgMTB9LCB7IDB4MDMzMSwgMTB9LAoreyAweDAzMDMsIDEwfSwgeyAweDAyRjEsIDEwfSwgeyAweDAyQTAsIDEwfSwgeyAweDAyMzMsIDEwfSwgeyAweDAxMjYsIDEwfSwgeyAweDA3QzAsIDExfSwKK3sgMHgwNzZGLCAxMX0sIHsgMHgwNzZDLCAxMX0sIHsgMHgwNjYxLCAxMX0sIHsgMHgwNjA0LCAxMX0sIHsgMHgwNTcyLCAxMX0sIHsgMHgwNTUxLCAxMX0sCit7IDB4MDQ2QSwgMTF9LCB7IDB4MDI3NCwgMTF9LCB7IDB4MEYyNywgMTJ9LCB7IDB4MEYyNCwgMTJ9LCB7IDB4MEVEQiwgMTJ9LCB7IDB4MEM4RSwgMTJ9LAoreyAweDBDMEIsIDEyfSwgeyAweDBDMEEsIDEyfSwgeyAweDBBRTMsIDEyfSwgeyAweDA4RDYsIDEyfSwgeyAweDA0OTAsIDEyfSwgeyAweDA0OTUsIDEyfSwKK3sgMHgxRjE5LCAxM30sIHsgMHgxREI1LCAxM30sIHsgMHgwMDA5LCAgNH0sIHsgMHgwMDEwLCAgNX0sIHsgMHgwMDI5LCAgNn0sIHsgMHgwMDYyLCAgN30sCit7IDB4MDBGMywgIDh9LCB7IDB4MDBBRCwgIDh9LCB7IDB4MDFFNSwgIDl9LCB7IDB4MDE3OSwgIDl9LCB7IDB4MDA5QywgIDl9LCB7IDB4MDNCMSwgMTB9LAoreyAweDAyQUUsIDEwfSwgeyAweDAxMjcsIDEwfSwgeyAweDA3NkUsIDExfSwgeyAweDA1NzAsIDExfSwgeyAweDAyNzUsIDExfSwgeyAweDBGMjUsIDEyfSwKK3sgMHgwRUMwLCAxMn0sIHsgMHgwQUEwLCAxMn0sIHsgMHgwOEQ3LCAxMn0sIHsgMHgxRTRDLCAxM30sIHsgMHgwMDA4LCAgNX0sIHsgMHgwMDYzLCAgN30sCit7IDB4MDBBRiwgIDh9LCB7IDB4MDE3QiwgIDl9LCB7IDB4MDNCMywgMTB9LCB7IDB4MDdERCwgMTF9LCB7IDB4MDY0MCwgMTF9LCB7IDB4MEY4RCwgMTJ9LAoreyAweDBCQzEsIDEyfSwgeyAweDA0OTEsIDEyfSwgeyAweDAwMjgsICA2fSwgeyAweDAwQzMsICA4fSwgeyAweDAxNTEsICA5fSwgeyAweDAyQTEsIDEwfSwKK3sgMHgwNTczLCAxMX0sIHsgMHgwRUMzLCAxMn0sIHsgMHgxRjM1LCAxM30sIHsgMHgwMDY1LCAgN30sIHsgMHgwMURBLCAgOX0sIHsgMHgwMkFGLCAxMH0sCit7IDB4MDI3NywgMTF9LCB7IDB4MDhDOSwgMTJ9LCB7IDB4MTc4MSwgMTN9LCB7IDB4MDAyNSwgIDd9LCB7IDB4MDExOCwgIDl9LCB7IDB4MDY0NiwgMTF9LAoreyAweDBBQTYsIDEyfSwgeyAweDE3ODAsIDEzfSwgeyAweDAwQzksICA4fSwgeyAweDAzMjEsIDEwfSwgeyAweDBGOUIsIDEyfSwgeyAweDE5MUUsIDEzfSwKK3sgMHgwMDQ4LCAgOH0sIHsgMHgwN0NDLCAxMX0sIHsgMHgwQUExLCAxMn0sIHsgMHgwMTgwLCAgOX0sIHsgMHgwNDY1LCAxMX0sIHsgMHgxOTA1LCAxM30sCit7IDB4MDNFMiwgMTB9LCB7IDB4MEVDMSwgMTJ9LCB7IDB4M0M5QiwgMTR9LCB7IDB4MDJGNCwgMTB9LCB7IDB4MDhDOCwgMTJ9LCB7IDB4MDdDMSwgMTF9LAoreyAweDA5MjgsIDEzfSwgeyAweDA1RTEsIDExfSwgeyAweDMyMEQsIDE0fSwgeyAweDBFQzIsIDEyfSwgeyAweDY0MTgsIDE1fSwgeyAweDFGMzQsIDEzfSwKK3sgMHgwMDc4LCAgN30sIHsgMHgwMTU1LCAgOX0sIHsgMHgwNTUyLCAxMX0sIHsgMHgxOTFGLCAxM30sIHsgMHgwMEZBLCAgOH0sIHsgMHgwN0RDLCAxMX0sCit7IDB4MTkwNywgMTN9LCB7IDB4MDBBQywgIDh9LCB7IDB4MDI0OSwgMTF9LCB7IDB4MTNCMSwgMTR9LCB7IDB4MDFGNiwgIDl9LCB7IDB4MEFFMiwgMTJ9LAoreyAweDAxREMsICA5fSwgeyAweDA0RUQsIDEyfSwgeyAweDAxODQsICA5fSwgeyAweDE5MDQsIDEzfSwgeyAweDAxNTYsICA5fSwgeyAweDA5RDksIDEzfSwKK3sgMHgwM0U3LCAxMH0sIHsgMHgwOTI5LCAxM30sIHsgMHgwM0IyLCAxMH0sIHsgMHgzQjY4LCAxNH0sIHsgMHgwMkY1LCAxMH0sIHsgMHgxM0IwLCAxNH0sCit7IDB4MDMyMiwgMTB9LCB7IDB4M0I2OSwgMTR9LCB7IDB4MDIzNCwgMTB9LCB7IDB4NzkzNSwgMTV9LCB7IDB4MDdDNywgMTF9LCB7IDB4QzgzMywgMTZ9LAoreyAweDA2NjAsIDExfSwgeyAweDc5MzQsIDE1fSwgeyAweDAyNEIsIDExfSwgeyAweEM4MzIsIDE2fSwgeyAweDBBQTcsIDEyfSwgeyAweDFGMTgsIDEzfSwKK3sgMHgwMDdBLCAgN30KK30sCit7Cit7IDB4MDAwMiwgIDJ9LCB7IDB4MDAwMCwgIDN9LCB7IDB4MDAxRSwgIDV9LCB7IDB4MDAwNCwgIDV9LCB7IDB4MDAxMiwgIDZ9LCB7IDB4MDA3MCwgIDd9LAoreyAweDAwMUEsICA3fSwgeyAweDAwNUYsICA4fSwgeyAweDAwNDcsICA4fSwgeyAweDAxRDMsICA5fSwgeyAweDAwQjUsICA5fSwgeyAweDAwNTcsICA5fSwKK3sgMHgwM0I1LCAxMH0sIHsgMHgwMTZELCAxMH0sIHsgMHgwMTYyLCAxMH0sIHsgMHgwN0NFLCAxMX0sIHsgMHgwNzE5LCAxMX0sIHsgMHgwNjkxLCAxMX0sCit7IDB4MDJDNiwgMTF9LCB7IDB4MDE1NiwgMTF9LCB7IDB4MEY5MiwgMTJ9LCB7IDB4MEQyRSwgMTJ9LCB7IDB4MEQyMCwgMTJ9LCB7IDB4MDU5RSwgMTJ9LAoreyAweDA0NjgsIDEyfSwgeyAweDAyQTYsIDEyfSwgeyAweDFEQTIsIDEzfSwgeyAweDFDNjAsIDEzfSwgeyAweDFBNDMsIDEzfSwgeyAweDBCMUQsIDEzfSwKK3sgMHgwOEMwLCAxM30sIHsgMHgwNTVELCAxM30sIHsgMHgwMDAzLCAgM30sIHsgMHgwMDBBLCAgNX0sIHsgMHgwMDc3LCAgN30sIHsgMHgwMEU1LCAgOH0sCit7IDB4MDFEOSwgIDl9LCB7IDB4MDNFNSwgMTB9LCB7IDB4MDE2NiwgMTB9LCB7IDB4MDY5NCwgMTF9LCB7IDB4MDE1MiwgMTF9LCB7IDB4MDU5RiwgMTJ9LAoreyAweDFGM0MsIDEzfSwgeyAweDFBNEIsIDEzfSwgeyAweDA1NUUsIDEzfSwgeyAweDAwMEMsICA0fSwgeyAweDAwN0QsICA3fSwgeyAweDAwNDQsICA4fSwKK3sgMHgwM0UwLCAxMH0sIHsgMHgwNzY5LCAxMX0sIHsgMHgwRTMxLCAxMn0sIHsgMHgxRjI2LCAxM30sIHsgMHgwNTVDLCAxM30sIHsgMHgwMDFCLCAgNX0sCit7IDB4MDBFMiwgIDh9LCB7IDB4MDNBNSwgMTB9LCB7IDB4MDJDOSwgMTF9LCB7IDB4MUYyMywgMTN9LCB7IDB4M0I0NywgMTR9LCB7IDB4MDAwNywgIDV9LAoreyAweDAxRDgsICA5fSwgeyAweDAyRDgsIDExfSwgeyAweDFGMjcsIDEzfSwgeyAweDM0OTQsIDE0fSwgeyAweDAwMzUsICA2fSwgeyAweDAzRTEsIDEwfSwKK3sgMHgwNTlDLCAxMn0sIHsgMHgzOEMzLCAxNH0sIHsgMHgwMDBDLCAgNn0sIHsgMHgwMTY1LCAxMH0sIHsgMHgxRDIzLCAxM30sIHsgMHgxNjM4LCAxNH0sCit7IDB4MDA2OCwgIDd9LCB7IDB4MDY5MywgMTF9LCB7IDB4M0E0NSwgMTR9LCB7IDB4MDAyMCwgIDd9LCB7IDB4MEY5MCwgMTJ9LCB7IDB4N0NGNiwgMTV9LAoreyAweDAwRTgsICA4fSwgeyAweDA1OEYsIDEyfSwgeyAweDJDRUYsIDE1fSwgeyAweDAwNDUsICA4fSwgeyAweDBCM0EsIDEzfSwgeyAweDAxRjEsICA5fSwKK3sgMHgzQjQ2LCAxNH0sIHsgMHgwMUE3LCAgOX0sIHsgMHgxNjc2LCAxNH0sIHsgMHgwMDU2LCAgOX0sIHsgMHg2OTJBLCAxNX0sIHsgMHgwMzhELCAxMH0sCit7IDB4RTMwOSwgMTZ9LCB7IDB4MDBBQSwgMTB9LCB7IDB4MUM2MTEsIDE3fSwgeyAweDAyREYsIDExfSwgeyAweEIzQjksIDE3fSwgeyAweDAyQzgsIDExfSwKK3sgMHgzOEMyMCwgMTh9LCB7IDB4MDFCMCwgMTF9LCB7IDB4MTYzOTAsIDE4fSwgeyAweDBGOUYsIDEyfSwgeyAweDE2NzcxLCAxOH0sIHsgMHgwRUQwLCAxMn0sCit7IDB4NzE4NDMsIDE5fSwgeyAweDBEMkEsIDEyfSwgeyAweEY5RThDLCAyMH0sIHsgMHgwNDYxLCAxMn0sIHsgMHhGOUU4RSwgMjB9LCB7IDB4MEI2NywgMTN9LAoreyAweDA1NUYsIDEzfSwgeyAweDAwM0YsICA2fSwgeyAweDAwNkQsICA5fSwgeyAweDBFOTAsIDEyfSwgeyAweDA1NEUsIDEzfSwgeyAweDAwMTMsICA2fSwKK3sgMHgwMTE5LCAxMH0sIHsgMHgwQjY2LCAxM30sIHsgMHgwMDBCLCAgNn0sIHsgMHgwMjM1LCAxMX0sIHsgMHg3Q0Y1LCAxNX0sIHsgMHgwMDc1LCAgN30sCit7IDB4MEQyNCwgMTJ9LCB7IDB4RjlFOSwgMTZ9LCB7IDB4MDAyRSwgIDd9LCB7IDB4MUYyMiwgMTN9LCB7IDB4MDAyMSwgIDd9LCB7IDB4MDU0RiwgMTN9LAoreyAweDAwMTQsICA3fSwgeyAweDNBNDQsIDE0fSwgeyAweDAwRTQsICA4fSwgeyAweDdDRjcsIDE1fSwgeyAweDAwNUUsICA4fSwgeyAweDcxODUsIDE1fSwKK3sgMHgwMDM3LCAgOH0sIHsgMHgyQzczLCAxNX0sIHsgMHgwMURCLCAgOX0sIHsgMHg1OURELCAxNn0sIHsgMHgwMUM3LCAgOX0sIHsgMHg2OTJCLCAxNX0sCit7IDB4MDFBNiwgIDl9LCB7IDB4NThFNSwgMTZ9LCB7IDB4MDBCNCwgIDl9LCB7IDB4MUYzRDAsIDE3fSwgeyAweDAwQjAsICA5fSwgeyAweEIxQzksIDE3fSwKK3sgMHgwM0U2LCAxMH0sIHsgMHgxNjc3MCwgMTh9LCB7IDB4MDE2RSwgMTB9LCB7IDB4M0U3QTIsIDE4fSwgeyAweDAxMUIsIDEwfSwgeyAweEY5RThELCAyMH0sCit7IDB4MDBEOSwgMTB9LCB7IDB4RjlFOEYsIDIwfSwgeyAweDAwQTgsIDEwfSwgeyAweDJDNzIzLCAxOX0sIHsgMHgwNzQ5LCAxMX0sIHsgMHhFMzA4NCwgMjB9LAoreyAweDA2OTYsIDExfSwgeyAweDU4RTQ1LCAyMH0sIHsgMHgwMkRFLCAxMX0sIHsgMHhCMUM4OCwgMjF9LCB7IDB4MDIzMSwgMTF9LCB7IDB4MUM2MTBBLCAyMX0sCit7IDB4MDFCMSwgMTF9LCB7IDB4NzE4NDJELCAyM30sIHsgMHgwRDJCLCAxMn0sIHsgMHgzOEMyMTcsIDIyfSwgeyAweDBEMkYsIDEyfSwgeyAweDE2MzkxMywgMjJ9LAoreyAweDA1QjIsIDEyfSwgeyAweDE2MzkxMiwgMjJ9LCB7IDB4MDQ2OSwgMTJ9LCB7IDB4NzE4NDJDLCAyM30sIHsgMHgxQTQyLCAxM30sIHsgMHgwOEMxLCAxM30sCit7IDB4MDA3MywgIDd9Cit9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgdmxjX29mZnNbXSA9IHsKKyAgICAgICAgMCwgICA1MjAsICAgNTUyLCAgIDYxNiwgIDExMjgsICAxMTYwLCAgMTIyNCwgIDE3NDAsICAxNzcyLCAgMTgzNiwgIDE5MDAsICAyNDM2LAorICAgICAyOTg2LCAgMzA1MCwgIDM2MTAsICA0MTU0LCAgNDIxOCwgIDQ3NDYsICA1MzI2LCAgNTM5MCwgIDU5MDIsICA2NTU0LCAgNzY1OCwgIDgzNDIsCisgICAgIDkzMDQsICA5OTg4LCAxMDYzMCwgMTEyMzQsIDEyMTc0LCAxMzAwNiwgMTM1NjAsIDE0MjMyLCAxNDc4NiwgMTU0MzIsIDE2MzUwLCAxNzUyMiwKKyAgICAyMDM3MiwgMjE4MTgsIDIyMzMwLCAyMjM5NCwgMjMxNjYsIDIzNjc4LCAyMzc0MiwgMjQ4MjAsIDI1MzMyLCAyNTM5NiwgMjY0NjAsIDI2OTgwLAorICAgIDI3MDQ4LCAyNzU5MiwgMjc2MDAsIDI3NjA4LCAyNzYxNiwgMjc2MjQsIDI4MjI0LCAyODI1OCwgMjgyOTAsIDI4ODAyLCAyODgzNCwgMjg4NjYsCisgICAgMjkzNzgsIDI5NDEyLCAyOTQ0NCwgMjk5NjAsIDI5OTk0LCAzMDAyNiwgMzA1MzgsIDMwNTcyLCAzMDYwNCwgMzExMjAsIDMxMTU0LCAzMTE4NiwKKyAgICAzMTcxNCwgMzE3NDYsIDMxNzc4LCAzMjMwNiwgMzIzNDAsIDMyMzcyCit9OworCisvKioKKyAqIEluaXQgVkMtMSBzcGVjaWZpYyB0YWJsZXMgYW5kIFZDMUNvbnRleHQgbWVtYmVycworICogQHBhcmFtIHYgVGhlIFZDMUNvbnRleHQgdG8gaW5pdGlhbGl6ZQorICogQHJldHVybiBTdGF0dXMKKyAqLworYXZfY29sZCBpbnQgZmZfdmMxX2luaXRfY29tbW9uKFZDMUNvbnRleHQgKnYpCit7CisgICAgc3RhdGljIGludCBkb25lID0gMDsKKyAgICBpbnQgaSA9IDA7CisgICAgc3RhdGljIFZMQ19UWVBFIHZsY190YWJsZVszMjM3Ml1bMl07CisKKyAgICB2LT5ocmRfcmF0ZSA9IHYtPmhyZF9idWZmZXIgPSBOVUxMOworCisgICAgLyogVkxDIHRhYmxlcyAqLworICAgIGlmICghZG9uZSkgeworICAgICAgICBJTklUX1ZMQ19TVEFUSUMoJmZmX3ZjMV9iZnJhY3Rpb25fdmxjLCBWQzFfQkZSQUNUSU9OX1ZMQ19CSVRTLCAyMywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9iZnJhY3Rpb25fYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9iZnJhY3Rpb25fY29kZXMsIDEsIDEsIDEgPDwgVkMxX0JGUkFDVElPTl9WTENfQklUUyk7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmZmZfdmMxX25vcm0yX3ZsYywgVkMxX05PUk0yX1ZMQ19CSVRTLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX25vcm0yX2JpdHMsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmZl92YzFfbm9ybTJfY29kZXMsIDEsIDEsIDEgPDwgVkMxX05PUk0yX1ZMQ19CSVRTKTsKKyAgICAgICAgSU5JVF9WTENfU1RBVElDKCZmZl92YzFfbm9ybTZfdmxjLCBWQzFfTk9STTZfVkxDX0JJVFMsIDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX25vcm02X2JpdHMsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmZl92YzFfbm9ybTZfY29kZXMsIDIsIDIsIDU1Nik7CisgICAgICAgIElOSVRfVkxDX1NUQVRJQygmZmZfdmMxX2ltb2RlX3ZsYywgVkMxX0lNT0RFX1ZMQ19CSVRTLCA3LAorICAgICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX2ltb2RlX2JpdHMsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmZl92YzFfaW1vZGVfY29kZXMsIDEsIDEsIDEgPDwgVkMxX0lNT0RFX1ZMQ19CSVRTKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgZmZfdmMxX3R0bWJfdmxjW2ldLnRhYmxlICAgICAgICAgICA9ICZ2bGNfdGFibGVbdmxjX29mZnNbaSAqIDMgKyAwXV07CisgICAgICAgICAgICBmZl92YzFfdHRtYl92bGNbaV0udGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNbaSAqIDMgKyAxXSAtIHZsY19vZmZzW2kgKiAzICsgMF07CisgICAgICAgICAgICBpbml0X3ZsYygmZmZfdmMxX3R0bWJfdmxjW2ldLCBWQzFfVFRNQl9WTENfQklUUywgMTYsCisgICAgICAgICAgICAgICAgICAgICBmZl92YzFfdHRtYl9iaXRzW2ldLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX3R0bWJfY29kZXNbaV0sIDIsIDIsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICAgICAgICAgIGZmX3ZjMV90dGJsa192bGNbaV0udGFibGUgICAgICAgICAgID0gJnZsY190YWJsZVt2bGNfb2Zmc1tpICogMyArIDFdXTsKKyAgICAgICAgICAgIGZmX3ZjMV90dGJsa192bGNbaV0udGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNbaSAqIDMgKyAyXSAtIHZsY19vZmZzW2kgKiAzICsgMV07CisgICAgICAgICAgICBpbml0X3ZsYygmZmZfdmMxX3R0YmxrX3ZsY1tpXSwgVkMxX1RUQkxLX1ZMQ19CSVRTLCA4LAorICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX3R0YmxrX2JpdHNbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICBmZl92YzFfdHRibGtfY29kZXNbaV0sIDEsIDEsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICAgICAgICAgIGZmX3ZjMV9zdWJibGtwYXRfdmxjW2ldLnRhYmxlICAgICAgICAgICA9ICZ2bGNfdGFibGVbdmxjX29mZnNbaSAqIDMgKyAyXV07CisgICAgICAgICAgICBmZl92YzFfc3ViYmxrcGF0X3ZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSB2bGNfb2Zmc1tpICogMyArIDNdIC0gdmxjX29mZnNbaSAqIDMgKyAyXTsKKyAgICAgICAgICAgIGluaXRfdmxjKCZmZl92YzFfc3ViYmxrcGF0X3ZsY1tpXSwgVkMxX1NVQkJMS1BBVF9WTENfQklUUywgMTUsCisgICAgICAgICAgICAgICAgICAgICBmZl92YzFfc3ViYmxrcGF0X2JpdHNbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICBmZl92YzFfc3ViYmxrcGF0X2NvZGVzW2ldLCAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgZmZfdmMxXzRtdl9ibG9ja19wYXR0ZXJuX3ZsY1tpXS50YWJsZSAgICAgICAgICAgPSAmdmxjX3RhYmxlW3ZsY19vZmZzW2kgKiAzICsgOV1dOworICAgICAgICAgICAgZmZfdmMxXzRtdl9ibG9ja19wYXR0ZXJuX3ZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSB2bGNfb2Zmc1tpICogMyArIDEwXSAtIHZsY19vZmZzW2kgKiAzICsgOV07CisgICAgICAgICAgICBpbml0X3ZsYygmZmZfdmMxXzRtdl9ibG9ja19wYXR0ZXJuX3ZsY1tpXSwgVkMxXzRNVl9CTE9DS19QQVRURVJOX1ZMQ19CSVRTLCAxNiwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV80bXZfYmxvY2tfcGF0dGVybl9iaXRzW2ldLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgZmZfdmMxXzRtdl9ibG9ja19wYXR0ZXJuX2NvZGVzW2ldLCAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgICAgICAgICBmZl92YzFfY2JwY3lfcF92bGNbaV0udGFibGUgICAgICAgICAgID0gJnZsY190YWJsZVt2bGNfb2Zmc1tpICogMyArIDEwXV07CisgICAgICAgICAgICBmZl92YzFfY2JwY3lfcF92bGNbaV0udGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNbaSAqIDMgKyAxMV0gLSB2bGNfb2Zmc1tpICogMyArIDEwXTsKKyAgICAgICAgICAgIGluaXRfdmxjKCZmZl92YzFfY2JwY3lfcF92bGNbaV0sIFZDMV9DQlBDWV9QX1ZMQ19CSVRTLCA2NCwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9jYnBjeV9wX2JpdHNbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICBmZl92YzFfY2JwY3lfcF9jb2Rlc1tpXSwgMiwgMiwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgICAgICAgICAgZmZfdmMxX212X2RpZmZfdmxjW2ldLnRhYmxlICAgICAgICAgICA9ICZ2bGNfdGFibGVbdmxjX29mZnNbaSAqIDMgKyAxMV1dOworICAgICAgICAgICAgZmZfdmMxX212X2RpZmZfdmxjW2ldLnRhYmxlX2FsbG9jYXRlZCA9IHZsY19vZmZzW2kgKiAzICsgMTJdIC0gdmxjX29mZnNbaSAqIDMgKyAxMV07CisgICAgICAgICAgICBpbml0X3ZsYygmZmZfdmMxX212X2RpZmZfdmxjW2ldLCBWQzFfTVZfRElGRl9WTENfQklUUywgNzMsCisgICAgICAgICAgICAgICAgICAgICBmZl92YzFfbXZfZGlmZl9iaXRzW2ldLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX212X2RpZmZfY29kZXNbaV0sIDIsIDIsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBmZl92YzFfYWNfY29lZmZfdGFibGVbaV0udGFibGUgICAgICAgICAgID0gJnZsY190YWJsZVt2bGNfb2Zmc1tpICogMiArIDIxXV07CisgICAgICAgICAgICBmZl92YzFfYWNfY29lZmZfdGFibGVbaV0udGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNbaSAqIDIgKyAyMl0gLSB2bGNfb2Zmc1tpICogMiArIDIxXTsKKyAgICAgICAgICAgIGluaXRfdmxjKCZmZl92YzFfYWNfY29lZmZfdGFibGVbaV0sIEFDX1ZMQ19CSVRTLCBmZl92YzFfYWNfc2l6ZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAmdmMxX2FjX3RhYmxlc1tpXVswXVsxXSwgOCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICZ2YzFfYWNfdGFibGVzW2ldWzBdWzBdLCA4LCA0LCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgICAgICAgICAvKiBpbml0aWFsaXplIGludGVybGFjZWQgTVZEQVRBIHRhYmxlcyAoMi1SZWYpICovCisgICAgICAgICAgICBmZl92YzFfMnJlZl9tdmRhdGFfdmxjW2ldLnRhYmxlICAgICAgICAgICA9ICZ2bGNfdGFibGVbdmxjX29mZnNbaSAqIDIgKyAyMl1dOworICAgICAgICAgICAgZmZfdmMxXzJyZWZfbXZkYXRhX3ZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSB2bGNfb2Zmc1tpICogMiArIDIzXSAtIHZsY19vZmZzW2kgKiAyICsgMjJdOworICAgICAgICAgICAgaW5pdF92bGMoJmZmX3ZjMV8ycmVmX212ZGF0YV92bGNbaV0sIFZDMV8yUkVGX01WREFUQV9WTENfQklUUywgMTI2LAorICAgICAgICAgICAgICAgICAgICAgZmZfdmMxXzJyZWZfbXZkYXRhX2JpdHNbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICBmZl92YzFfMnJlZl9tdmRhdGFfY29kZXNbaV0sIDQsIDQsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAvKiBpbml0aWFsaXplIDRNViBNQk1PREUgVkxDIHRhYmxlcyBmb3IgaW50ZXJsYWNlZCBmcmFtZSBQIHBpY3R1cmUgKi8KKyAgICAgICAgICAgIGZmX3ZjMV9pbnRmcl80bXZfbWJtb2RlX3ZsY1tpXS50YWJsZSAgICAgICAgICAgPSAmdmxjX3RhYmxlW3ZsY19vZmZzW2kgKiAzICsgMzddXTsKKyAgICAgICAgICAgIGZmX3ZjMV9pbnRmcl80bXZfbWJtb2RlX3ZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSB2bGNfb2Zmc1tpICogMyArIDM4XSAtIHZsY19vZmZzW2kgKiAzICsgMzddOworICAgICAgICAgICAgaW5pdF92bGMoJmZmX3ZjMV9pbnRmcl80bXZfbWJtb2RlX3ZsY1tpXSwgVkMxX0lOVEZSXzRNVl9NQk1PREVfVkxDX0JJVFMsIDE1LAorICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX2ludGZyXzRtdl9tYm1vZGVfYml0c1tpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9pbnRmcl80bXZfbWJtb2RlX2NvZGVzW2ldLCAyLCAyLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgICAgICAgICAvKiBpbml0aWFsaXplIE5PTi00TVYgTUJNT0RFIFZMQyB0YWJsZXMgZm9yIHRoZSBzYW1lICovCisgICAgICAgICAgICBmZl92YzFfaW50ZnJfbm9uNG12X21ibW9kZV92bGNbaV0udGFibGUgICAgICAgICAgID0gJnZsY190YWJsZVt2bGNfb2Zmc1tpICogMyArIDM4XV07CisgICAgICAgICAgICBmZl92YzFfaW50ZnJfbm9uNG12X21ibW9kZV92bGNbaV0udGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNbaSAqIDMgKyAzOV0gLSB2bGNfb2Zmc1tpICogMyArIDM4XTsKKyAgICAgICAgICAgIGluaXRfdmxjKCZmZl92YzFfaW50ZnJfbm9uNG12X21ibW9kZV92bGNbaV0sIFZDMV9JTlRGUl9OT040TVZfTUJNT0RFX1ZMQ19CSVRTLCA5LAorICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX2ludGZyX25vbjRtdl9tYm1vZGVfYml0c1tpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9pbnRmcl9ub240bXZfbWJtb2RlX2NvZGVzW2ldLCAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgICAgICAgICAvKiBpbml0aWFsaXplIGludGVybGFjZWQgTVZEQVRBIHRhYmxlcyAoMS1SZWYpICovCisgICAgICAgICAgICBmZl92YzFfMXJlZl9tdmRhdGFfdmxjW2ldLnRhYmxlICAgICAgICAgICA9ICZ2bGNfdGFibGVbdmxjX29mZnNbaSAqIDMgKyAzOV1dOworICAgICAgICAgICAgZmZfdmMxXzFyZWZfbXZkYXRhX3ZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSB2bGNfb2Zmc1tpICogMyArIDQwXSAtIHZsY19vZmZzW2kgKiAzICsgMzldOworICAgICAgICAgICAgaW5pdF92bGMoJmZmX3ZjMV8xcmVmX212ZGF0YV92bGNbaV0sIFZDMV8xUkVGX01WREFUQV9WTENfQklUUywgNzIsCisgICAgICAgICAgICAgICAgICAgICBmZl92YzFfMXJlZl9tdmRhdGFfYml0c1tpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV8xcmVmX212ZGF0YV9jb2Rlc1tpXSwgNCwgNCwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgMk1WIEJsb2NrIHBhdHRlcm4gVkxDIHRhYmxlcyAqLworICAgICAgICAgICAgZmZfdmMxXzJtdl9ibG9ja19wYXR0ZXJuX3ZsY1tpXS50YWJsZSAgICAgICAgICAgPSAmdmxjX3RhYmxlW3ZsY19vZmZzW2kgKyA0OV1dOworICAgICAgICAgICAgZmZfdmMxXzJtdl9ibG9ja19wYXR0ZXJuX3ZsY1tpXS50YWJsZV9hbGxvY2F0ZWQgPSB2bGNfb2Zmc1tpICsgNTBdIC0gdmxjX29mZnNbaSArIDQ5XTsKKyAgICAgICAgICAgIGluaXRfdmxjKCZmZl92YzFfMm12X2Jsb2NrX3BhdHRlcm5fdmxjW2ldLCBWQzFfMk1WX0JMT0NLX1BBVFRFUk5fVkxDX0JJVFMsIDQsCisgICAgICAgICAgICAgICAgICAgICBmZl92YzFfMm12X2Jsb2NrX3BhdHRlcm5fYml0c1tpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV8ybXZfYmxvY2tfcGF0dGVybl9jb2Rlc1tpXSwgMSwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgaW50ZXJsYWNlZCBDQlBDWSBWTEMgdGFibGVzIChUYWJsZSAxMjQgLSBUYWJsZSAxMzEpICovCisgICAgICAgICAgICBmZl92YzFfaWNicGN5X3ZsY1tpXS50YWJsZSAgICAgICAgICAgPSAmdmxjX3RhYmxlW3ZsY19vZmZzW2kgKiAzICsgNTNdXTsKKyAgICAgICAgICAgIGZmX3ZjMV9pY2JwY3lfdmxjW2ldLnRhYmxlX2FsbG9jYXRlZCA9IHZsY19vZmZzW2kgKiAzICsgNTRdIC0gdmxjX29mZnNbaSAqIDMgKyA1M107CisgICAgICAgICAgICBpbml0X3ZsYygmZmZfdmMxX2ljYnBjeV92bGNbaV0sIFZDMV9JQ0JQQ1lfVkxDX0JJVFMsIDYzLAorICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX2ljYnBjeV9wX2JpdHNbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICBmZl92YzFfaWNicGN5X3BfY29kZXNbaV0sIDIsIDIsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgaW50ZXJsYWNlZCBmaWVsZCBwaWN0dXJlIE1CTU9ERSBWTEMgdGFibGVzICovCisgICAgICAgICAgICBmZl92YzFfaWZfbW12X21ibW9kZV92bGNbaV0udGFibGUgICAgICAgICAgID0gJnZsY190YWJsZVt2bGNfb2Zmc1tpICogMyArIDU0XV07CisgICAgICAgICAgICBmZl92YzFfaWZfbW12X21ibW9kZV92bGNbaV0udGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNbaSAqIDMgKyA1NV0gLSB2bGNfb2Zmc1tpICogMyArIDU0XTsKKyAgICAgICAgICAgIGluaXRfdmxjKCZmZl92YzFfaWZfbW12X21ibW9kZV92bGNbaV0sIFZDMV9JRl9NTVZfTUJNT0RFX1ZMQ19CSVRTLCA4LAorICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX2lmX21tdl9tYm1vZGVfYml0c1tpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9pZl9tbXZfbWJtb2RlX2NvZGVzW2ldLCAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgICAgICAgICBmZl92YzFfaWZfMW12X21ibW9kZV92bGNbaV0udGFibGUgICAgICAgICAgID0gJnZsY190YWJsZVt2bGNfb2Zmc1tpICogMyArIDU1XV07CisgICAgICAgICAgICBmZl92YzFfaWZfMW12X21ibW9kZV92bGNbaV0udGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNbaSAqIDMgKyA1Nl0gLSB2bGNfb2Zmc1tpICogMyArIDU1XTsKKyAgICAgICAgICAgIGluaXRfdmxjKCZmZl92YzFfaWZfMW12X21ibW9kZV92bGNbaV0sIFZDMV9JRl8xTVZfTUJNT0RFX1ZMQ19CSVRTLCA2LAorICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX2lmXzFtdl9tYm1vZGVfYml0c1tpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9pZl8xbXZfbWJtb2RlX2NvZGVzW2ldLCAxLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisgICAgICAgIH0KKyAgICAgICAgZG9uZSA9IDE7CisgICAgfQorCisgICAgLyogT3RoZXIgZGVmYXVsdHMgKi8KKyAgICB2LT5wcSAgICAgID0gLTE7CisgICAgdi0+bXZyYW5nZSA9IDA7IC8qIDcuMS4xLjE4LCBwODAgKi8KKworICAgIGZmX3ZjMWRzcF9pbml0KCZ2LT52YzFkc3ApOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92YzEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZmI2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92YzEuaApAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIFZDLTEgYW5kIFdNVjMgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS29uc3RhbnRpbiBTaGlzaGtvdgorICogUGFydGx5IGJhc2VkIG9uIHZjOS5jIChjKSAyMDA1IEFub255bW91cywgQWxleCBCZXJlZ3N6YXN6aSwgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVkMxX0gKKyNkZWZpbmUgQVZDT0RFQ19WQzFfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjRjaHJvbWEuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJpbnRyYXg4LmgiCisjaW5jbHVkZSAidmMxX2NvbW1vbi5oIgorI2luY2x1ZGUgInZjMWRzcC5oIgorCisjZGVmaW5lIEFDX1ZMQ19CSVRTIDkKKworLyoqIFNlcXVlbmNlIHF1YW50aXplciBtb2RlICovCisvL0B7CitlbnVtIFF1YW50TW9kZSB7CisgICAgUVVBTlRfRlJBTUVfSU1QTElDSVQsICAgIC8vLzwgSW1wbGljaXRseSBzcGVjaWZpZWQgYXQgZnJhbWUgbGV2ZWwKKyAgICBRVUFOVF9GUkFNRV9FWFBMSUNJVCwgICAgLy8vPCBFeHBsaWNpdGx5IHNwZWNpZmllZCBhdCBmcmFtZSBsZXZlbAorICAgIFFVQU5UX05PTl9VTklGT1JNLCAgICAgICAvLy88IE5vbi11bmlmb3JtIHF1YW50IHVzZWQgZm9yIGFsbCBmcmFtZXMKKyAgICBRVUFOVF9VTklGT1JNICAgICAgICAgICAgLy8vPCBVbmlmb3JtIHF1YW50IHVzZWQgZm9yIGFsbCBmcmFtZXMKK307CisvL0B9CisKKy8qKiBXaGVyZSBxdWFudCBjYW4gYmUgY2hhbmdlZCAqLworLy9AeworZW51bSBEUVByb2ZpbGUgeworICAgIERRUFJPRklMRV9GT1VSX0VER0VTLAorICAgIERRUFJPRklMRV9ET1VCTEVfRURHRVMsCisgICAgRFFQUk9GSUxFX1NJTkdMRV9FREdFLAorICAgIERRUFJPRklMRV9BTExfTUJTCit9OworLy9AfQorCisvKiogQG5hbWUgV2hlcmUgcXVhbnQgY2FuIGJlIGNoYW5nZWQKKyAqLworLy9AeworZW51bSBEUVNpbmdsZUVkZ2UgeworICAgIERRU0lOR0xFX0JFREdFX0xFRlQsCisgICAgRFFTSU5HTEVfQkVER0VfVE9QLAorICAgIERRU0lOR0xFX0JFREdFX1JJR0hULAorICAgIERRU0lOR0xFX0JFREdFX0JPVFRPTQorfTsKKy8vQH0KKworLyoqIFdoaWNoIHBhaXIgb2YgZWRnZXMgaXMgcXVhbnRpemVkIHdpdGggQUxUUFFVQU5UICovCisvL0B7CitlbnVtIERRRG91YmxlRWRnZSB7CisgICAgRFFET1VCTEVfQkVER0VfVE9QTEVGVCwKKyAgICBEUURPVUJMRV9CRURHRV9UT1BSSUdIVCwKKyAgICBEUURPVUJMRV9CRURHRV9CT1RUT01SSUdIVCwKKyAgICBEUURPVUJMRV9CRURHRV9CT1RUT01MRUZUCit9OworLy9AfQorCisvKiogTVYgbW9kZXMgZm9yIFAgZnJhbWVzICovCisvL0B7CitlbnVtIE1WTW9kZXMgeworICAgIE1WX1BNT0RFXzFNVl9IUEVMX0JJTElOLAorICAgIE1WX1BNT0RFXzFNViwKKyAgICBNVl9QTU9ERV8xTVZfSFBFTCwKKyAgICBNVl9QTU9ERV9NSVhFRF9NViwKKyAgICBNVl9QTU9ERV9JTlRFTlNJVFlfQ09NUAorfTsKKy8vQH0KKworLyoqIE1CTU9ERSBmb3IgaW50ZXJsYWNlZCBmcmFtZSBQLXBpY3R1cmUgKi8KKy8vQHsKK2VudW0gTUJNb2Rlc0ludGZyIHsKKyAgICBNVl9QTU9ERV9JTlRGUl8xTVYsCisgICAgTVZfUE1PREVfSU5URlJfMk1WX0ZJRUxELAorICAgIE1WX1BNT0RFX0lOVEZSXzJNViwKKyAgICBNVl9QTU9ERV9JTlRGUl80TVZfRklFTEQsCisgICAgTVZfUE1PREVfSU5URlJfNE1WLAorICAgIE1WX1BNT0RFX0lOVEZSX0lOVFJBLAorfTsKKy8vQH0KKworLyoqIEBuYW1lIE1WIHR5cGVzIGZvciBCIGZyYW1lcyAqLworLy9AeworZW51bSBCTVZUeXBlcyB7CisgICAgQk1WX1RZUEVfQkFDS1dBUkQsCisgICAgQk1WX1RZUEVfRk9SV0FSRCwKKyAgICBCTVZfVFlQRV9JTlRFUlBPTEFURUQsCisgICAgQk1WX1RZUEVfRElSRUNUCit9OworLy9AfQorCisvKiogQG5hbWUgQmxvY2sgdHlwZXMgZm9yIFAvQiBmcmFtZXMgKi8KKy8vQHsKK2VudW0gVHJhbnNmb3JtVHlwZXMgeworICAgIFRUXzhYOCwKKyAgICBUVF84WDRfQk9UVE9NLAorICAgIFRUXzhYNF9UT1AsCisgICAgVFRfOFg0LCAgICAgICAgIC8vIGJvdGggaGFsdmVzCisgICAgVFRfNFg4X1JJR0hULAorICAgIFRUXzRYOF9MRUZULAorICAgIFRUXzRYOCwgICAgICAgICAvLyBib3RoIGhhbHZlcworICAgIFRUXzRYNAorfTsKKy8vQH0KKworZW51bSBDb2RpbmdTZXQgeworICAgIENTX0hJR0hfTU9UX0lOVFJBID0gMCwKKyAgICBDU19ISUdIX01PVF9JTlRFUiwKKyAgICBDU19MT1dfTU9UX0lOVFJBLAorICAgIENTX0xPV19NT1RfSU5URVIsCisgICAgQ1NfTUlEX1JBVEVfSU5UUkEsCisgICAgQ1NfTUlEX1JBVEVfSU5URVIsCisgICAgQ1NfSElHSF9SQVRFX0lOVFJBLAorICAgIENTX0hJR0hfUkFURV9JTlRFUgorfTsKKworLyoqIEBuYW1lIE92ZXJsYXAgY29uZGl0aW9ucyBmb3IgQWR2YW5jZWQgUHJvZmlsZSAqLworLy9AeworZW51bSBDT1R5cGVzIHsKKyAgICBDT05ET1ZFUl9OT05FID0gMCwKKyAgICBDT05ET1ZFUl9BTEwsCisgICAgQ09ORE9WRVJfU0VMRUNUCit9OworLy9AfQorCisvKioKKyAqIEZDTSBGcmFtZSBDb2RpbmcgTW9kZQorICogQG5vdGUgc29tZSBjb250ZW50IG1pZ2h0IGJlIG1hcmtlZCBpbnRlcmxhY2VkCisgKiBidXQgaGF2ZSBmY20gc2V0IHRvIDAgYXMgd2VsbCAoZS5nLiBIRC1EVkQpCisgKi8KK2VudW0gRnJhbWVDb2RpbmdNb2RlIHsKKyAgICBQUk9HUkVTU0lWRSA9IDAsICAgIC8vLzwgIGluIHRoZSBiaXRzdHJlYW0gaXMgcmVwb3J0ZWQgYXMgMDBiCisgICAgSUxBQ0VfRlJBTUUsICAgICAgICAvLy88ICBpbiB0aGUgYml0c3RyZWFtIGlzIHJlcG9ydGVkIGFzIDEwYgorICAgIElMQUNFX0ZJRUxEICAgICAgICAgLy8vPCAgaW4gdGhlIGJpdHN0cmVhbSBpcyByZXBvcnRlZCBhcyAxMWIKK307CisKKy8qKgorICogSW1vZGUgdHlwZXMKKyAqIEB7CisgKi8KK2VudW0gSW1vZGUgeworICAgIElNT0RFX1JBVywKKyAgICBJTU9ERV9OT1JNMiwKKyAgICBJTU9ERV9ESUZGMiwKKyAgICBJTU9ERV9OT1JNNiwKKyAgICBJTU9ERV9ESUZGNiwKKyAgICBJTU9ERV9ST1dTS0lQLAorICAgIElNT0RFX0NPTFNLSVAKK307CisvKiogQH0gKi8gLy9pbW9kZSBkZWZpbmVzCisKKy8qKiBUaGUgVkMxIENvbnRleHQKKyAqIEB0b2RvIENoYW5nZSBzaXplIHdoZXJldmVyIGFub3RoZXIgc2l6ZSBpcyBtb3JlIGVmZmljaWVudAorICogTWFueSBtZW1iZXJzIGFyZSBvbmx5IHVzZWQgZm9yIEFkdmFuY2VkIFByb2ZpbGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgVkMxQ29udGV4dHsKKyAgICBNcGVnRW5jQ29udGV4dCBzOworICAgIEludHJhWDhDb250ZXh0IHg4OworICAgIEgyNjRDaHJvbWFDb250ZXh0IGgyNjRjaHJvbWE7CisgICAgVkMxRFNQQ29udGV4dCB2YzFkc3A7CisKKyAgICBpbnQgYml0czsKKworICAgIC8qKiBTaW1wbGUvTWFpbiBQcm9maWxlIHNlcXVlbmNlIGhlYWRlciAqLworICAgIC8vQHsKKyAgICBpbnQgcmVzX3Nwcml0ZTsgICAgICAgLy8vPCByZXNlcnZlZCwgc3ByaXRlIG1vZGUKKyAgICBpbnQgcmVzX3k0MTE7ICAgICAgICAgLy8vPCByZXNlcnZlZCwgb2xkIGludGVybGFjZWQgbW9kZQorICAgIGludCByZXNfeDg7ICAgICAgICAgICAvLy88IHJlc2VydmVkCisgICAgaW50IG11bHRpcmVzOyAgICAgICAgIC8vLzwgZnJhbWUtbGV2ZWwgUkVTUElDIHN5bnRheCBlbGVtZW50IHByZXNlbnQKKyAgICBpbnQgcmVzX2Zhc3R0eDsgICAgICAgLy8vPCByZXNlcnZlZCwgYWx3YXlzIDEKKyAgICBpbnQgcmVzX3RyYW5zdGFiOyAgICAgLy8vPCByZXNlcnZlZCwgYWx3YXlzIDAKKyAgICBpbnQgcmFuZ2VyZWQ7ICAgICAgICAgLy8vPCBSQU5HRVJFREZSTSAocmFuZ2UgcmVkdWN0aW9uKSBzeW50YXggZWxlbWVudCBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYXQgZnJhbWUgbGV2ZWwKKyAgICBpbnQgcmVzX3J0bV9mbGFnOyAgICAgLy8vPCByZXNlcnZlZCwgc2V0IHRvIDEKKyAgICBpbnQgcmVzZXJ2ZWQ7ICAgICAgICAgLy8vPCByZXNlcnZlZAorICAgIC8vQH0KKworICAgIC8qKiBBZHZhbmNlZCBQcm9maWxlICovCisgICAgLy9AeworICAgIGludCBsZXZlbDsgICAgICAgICAgICAvLy88IDNiaXRzLCBmb3IgQWR2YW5jZWQvU2ltcGxlIFByb2ZpbGUsIHByb3ZpZGVkIGJ5IFRTIGxheWVyCisgICAgaW50IGNocm9tYWZvcm1hdDsgICAgIC8vLzwgMmJpdHMsIDI9NDoyOjAsIG9ubHkgZGVmaW5lZAorICAgIGludCBwb3N0cHJvY2ZsYWc7ICAgICAvLy88IFBlci1mcmFtZSBwcm9jZXNzaW5nIHN1Z2dlc3Rpb24gZmxhZyBwcmVzZW50CisgICAgaW50IGJyb2FkY2FzdDsgICAgICAgIC8vLzwgVEZGL1JGRiBwcmVzZW50CisgICAgaW50IGludGVybGFjZTsgICAgICAgIC8vLzwgUHJvZ3Jlc3NpdmUvaW50ZXJsYWNlZCAoUlBURlRNIHN5bnRheCBlbGVtZW50KQorICAgIGludCB0ZmNudHJmbGFnOyAgICAgICAvLy88IFRGQ05UUiBwcmVzZW50CisgICAgaW50IHBhbnNjYW5mbGFnOyAgICAgIC8vLzwgTlVNUEFOU0NBTldJTiwgVE9QTEVGVHtYLFl9LCBCT1RSSUdIVHtYLFl9IHByZXNlbnQKKyAgICBpbnQgcmVmZGlzdF9mbGFnOyAgICAgLy8vPCBSRUZESVNUIHN5bnRheCBlbGVtZW50IHByZXNlbnQgaW4gSUksIElQLCBQSSBvciBQUCBmaWVsZCBwaWN0dXJlIGhlYWRlcnMKKyAgICBpbnQgZXh0ZW5kZWRfZG12OyAgICAgLy8vPCBBZGRpdGlvbmFsIGV4dGVuZGVkIGRtdiByYW5nZSBhdCBQL0IgZnJhbWUtbGV2ZWwKKyAgICBpbnQgY29sb3JfcHJpbTsgICAgICAgLy8vPCA4Yml0cywgY2hyb21hIGNvb3JkaW5hdGVzIG9mIHRoZSBjb2xvciBwcmltYXJpZXMKKyAgICBpbnQgdHJhbnNmZXJfY2hhcjsgICAgLy8vPCA4Yml0cywgT3B0by1lbGVjdHJvbmljIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcworICAgIGludCBtYXRyaXhfY29lZjsgICAgICAvLy88IDhiaXRzLCBDb2xvciBwcmltYXJpZXMtPllDYkNyIHRyYW5zZm9ybSBtYXRyaXgKKyAgICBpbnQgaHJkX3BhcmFtX2ZsYWc7ICAgLy8vPCBQcmVzZW5jZSBvZiBIeXBvdGhldGljYWwgUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRGVjb2RlciBwYXJhbWV0ZXJzCisgICAgaW50IHBzZjsgICAgICAgICAgICAgIC8vLzwgUHJvZ3Jlc3NpdmUgU2VnbWVudGVkIEZyYW1lCisgICAgLy9AfQorCisgICAgLyoqIFNlcXVlbmNlIGhlYWRlciBkYXRhIGZvciBhbGwgUHJvZmlsZXMKKyAgICAgKiBUT0RPOiBjaG9vc2UgYmV0d2VlbiBpbnRzLCB1aW50OF90cyBhbmQgbW9ub2JpdCBmbGFncworICAgICAqLworICAgIC8vQHsKKyAgICBpbnQgcHJvZmlsZTsgICAgICAgICAgLy8vPCAyYml0cywgUHJvZmlsZQorICAgIGludCBmcm1ydHFfcG9zdHByb2M7ICAvLy88IDNiaXRzLAorICAgIGludCBiaXRydHFfcG9zdHByb2M7ICAvLy88IDViaXRzLCBxdWFudGl6ZWQgZnJhbWVyYXRlLWJhc2VkIHBvc3Rwcm9jZXNzaW5nIHN0cmVuZ3RoCisgICAgaW50IG1heF9jb2RlZF93aWR0aCwgbWF4X2NvZGVkX2hlaWdodDsKKyAgICBpbnQgZmFzdHV2bWM7ICAgICAgICAgLy8vPCBSb3VuZGluZyBvZiBxcGVsIHZlY3RvciB0byBocGVsID8gKG5vdCBpbiBTaW1wbGUpCisgICAgaW50IGV4dGVuZGVkX212OyAgICAgIC8vLzwgRXh0IE1WIGluIFAvQiAobm90IGluIFNpbXBsZSkKKyAgICBpbnQgZHF1YW50OyAgICAgICAgICAgLy8vPCBIb3cgcXNjYWxlIHZhcmllcyB3aXRoIE1CcywgMmJpdHMgKG5vdCBpbiBTaW1wbGUpCisgICAgaW50IHZzdHJhbnNmb3JtOyAgICAgIC8vLzwgdmFyaWFibGUtc2l6ZSBbNDhdeFs0OF0gdHJhbnNmb3JtIHR5cGUgKyBpbmZvCisgICAgaW50IG92ZXJsYXA7ICAgICAgICAgIC8vLzwgb3ZlcmxhcHBlZCB0cmFuc2Zvcm1zIGluIHVzZQorICAgIGludCBxdWFudGl6ZXJfbW9kZTsgICAvLy88IDJiaXRzLCBxdWFudGl6ZXIgbW9kZSB1c2VkIGZvciBzZXF1ZW5jZSwgc2VlIFFVQU5UXyoKKyAgICBpbnQgZmludGVycGZsYWc7ICAgICAgLy8vPCBJTlRFUlBGUk0gcHJlc2VudAorICAgIC8vQH0KKworICAgIC8qKiBGcmFtZSBkZWNvZGluZyBpbmZvIGZvciBhbGwgcHJvZmlsZXMgKi8KKyAgICAvL0B7CisgICAgdWludDhfdCBtdl9tb2RlOyAgICAgICAgICAgICAvLy88IE1WIGNvZGluZyBtb25kZQorICAgIHVpbnQ4X3QgbXZfbW9kZTI7ICAgICAgICAgICAgLy8vPCBTZWNvbmRhcnkgTVYgY29kaW5nIG1vZGUgKEIgZnJhbWVzKQorICAgIGludCBrX3g7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgYml0cyBmb3IgTVZzIChkZXBlbmRzIG9uIE1WIHJhbmdlKQorICAgIGludCBrX3k7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgYml0cyBmb3IgTVZzIChkZXBlbmRzIG9uIE1WIHJhbmdlKQorICAgIGludCByYW5nZV94LCByYW5nZV95OyAgICAgICAgLy8vPCBNViByYW5nZQorICAgIHVpbnQ4X3QgcHEsIGFsdHBxOyAgICAgICAgICAgLy8vPCBDdXJyZW50L2FsdGVybmF0ZSBmcmFtZSBxdWFudGl6ZXIgc2NhbGUKKyAgICB1aW50OF90IHp6Xzh4OFs0XVs2NF07ICAgICAgIC8vLzwgWmlnemFnIHRhYmxlIGZvciBUVF84eDgsIHBlcm11dGVkIGZvciBJRENUCisgICAgaW50IGxlZnRfYmxrX3NoLCB0b3BfYmxrX3NoOyAvLy88IEVpdGhlciAzIG9yIDAsIHBvc2l0aW9ucyBvZiBsL3QgaW4gYmxrW10KKyAgICBjb25zdCB1aW50OF90KiB6el84eDQ7ICAgICAgIC8vLzwgWmlnemFnIHNjYW4gdGFibGUgZm9yIFRUXzh4NCBjb2RpbmcgbW9kZQorICAgIGNvbnN0IHVpbnQ4X3QqIHp6XzR4ODsgICAgICAgLy8vPCBaaWd6YWcgc2NhbiB0YWJsZSBmb3IgVFRfNHg4IGNvZGluZyBtb2RlCisgICAgLyoqIHBxdWFudCBwYXJhbWV0ZXJzICovCisgICAgLy9AeworICAgIHVpbnQ4X3QgZHF1YW50ZnJtOworICAgIHVpbnQ4X3QgZHFwcm9maWxlOworICAgIHVpbnQ4X3QgZHFzYmVkZ2U7CisgICAgdWludDhfdCBkcWJpbGV2ZWw7CisgICAgLy9AfQorICAgIC8qKiBBQyBjb2Rpbmcgc2V0IGluZGV4ZXMKKyAgICAgKiBAc2VlIDguMS4xLjEwLCBwKDEpMTAKKyAgICAgKi8KKyAgICAvL0B7CisgICAgaW50IGNfYWNfdGFibGVfaW5kZXg7ICAgIC8vLzwgQ2hyb21hIGluZGV4IGZyb20gQUNGUk0gZWxlbWVudAorICAgIGludCB5X2FjX3RhYmxlX2luZGV4OyAgICAvLy88IEx1bWEgaW5kZXggZnJvbSBBQzJGUk0gZWxlbWVudAorICAgIC8vQH0KKyAgICBpbnQgdHRmcm07ICAgICAgICAgICAgICAgLy8vPCBUcmFuc2Zvcm0gdHlwZSBpbmZvIHByZXNlbnQgYXQgZnJhbWUgbGV2ZWwKKyAgICB1aW50OF90IHR0bWJmOyAgICAgICAgICAgLy8vPCBUcmFuc2Zvcm0gdHlwZSBmbGFnCisgICAgaW50ICp0dGJsa19iYXNlLCAqdHRibGs7IC8vLzwgVHJhbnNmb3JtIHR5cGUgYXQgdGhlIGJsb2NrIGxldmVsCisgICAgaW50IGNvZGluZ3NldDsgICAgICAgICAgIC8vLzwgaW5kZXggb2YgY3VycmVudCB0YWJsZSBzZXQgZnJvbSAxMS44IHRvIHVzZSBmb3IgbHVtYSBibG9jayBkZWNvZGluZworICAgIGludCBjb2RpbmdzZXQyOyAgICAgICAgICAvLy88IGluZGV4IG9mIGN1cnJlbnQgdGFibGUgc2V0IGZyb20gMTEuOCB0byB1c2UgZm9yIGNocm9tYSBibG9jayBkZWNvZGluZworICAgIGludCBwcWluZGV4OyAgICAgICAgICAgICAvLy88IHJhdyBwcWluZGV4IHVzZWQgaW4gY29kaW5nIHNldCBzZWxlY3Rpb24KKyAgICBpbnQgYV9hdmFpbCwgY19hdmFpbDsKKyAgICB1aW50OF90ICptYl90eXBlX2Jhc2UsICptYl90eXBlWzNdOworCisKKyAgICAvKiogTHVtYSBjb21wZW5zYXRpb24gcGFyYW1ldGVycyAqLworICAgIC8vQHsKKyAgICB1aW50OF90IGx1bXNjYWxlOworICAgIHVpbnQ4X3QgbHVtc2hpZnQ7CisgICAgLy9AfQorICAgIGludDE2X3QgYmZyYWN0aW9uOyAgICAvLy88IFJlbGF0aXZlIHBvc2l0aW9uICUgYW5jaG9ycz0+IGhvdyB0byBzY2FsZSBNVnMKKyAgICB1aW50OF90IGhhbGZwcTsgICAgICAgLy8vPCBVbmlmb3JtIHF1YW50IG92ZXIgaW1hZ2UgYW5kIHFwKy41CisgICAgdWludDhfdCByZXNwaWM7ICAgICAgIC8vLzwgRnJhbWUtbGV2ZWwgZmxhZyBmb3IgcmVzaXplZCBpbWFnZXMKKyAgICBpbnQgYnVmZmVyX2Z1bGxuZXNzOyAgLy8vPCBIUkQgaW5mbworICAgIC8qKiBSYW5nZXM6CisgICAgICogLSMgMCAtPiBbLTY0biA2My5mXSB4IFstMzIsIDMxLmZdCisgICAgICogLSMgMSAtPiBbLTEyOCwgMTI3LmZdIHggWy02NCwgNjMuZl0KKyAgICAgKiAtIyAyIC0+IFstNTEyLCA1MTEuZl0geCBbLTEyOCwgMTI3LmZdCisgICAgICogLSMgMyAtPiBbLTEwMjQsIDEwMjMuZl0geCBbLTI1NiwgMjU1LmZdCisgICAgICovCisgICAgdWludDhfdCBtdnJhbmdlOyAgICAgICAgICAgICAgICAvLy88IEV4dGVuZGVkIE1WIHJhbmdlIGZsYWcKKyAgICB1aW50OF90IHBxdWFudGl6ZXI7ICAgICAgICAgICAgIC8vLzwgVW5pZm9ybSAob3ZlciBzZXF1ZW5jZSkgcXVhbnRpemVyIGluIHVzZQorICAgIFZMQyAqY2JwY3lfdmxjOyAgICAgICAgICAgICAgICAgLy8vPCBDQlBDWSBWTEMgdGFibGUKKyAgICBpbnQgdHRfaW5kZXg7ICAgICAgICAgICAgICAgICAgIC8vLzwgSW5kZXggZm9yIFRyYW5zZm9ybSBUeXBlIHRhYmxlcyAodG8gZGVjb2RlIFRUTUIpCisgICAgdWludDhfdCogbXZfdHlwZV9tYl9wbGFuZTsgICAgICAvLy88IGJpdHBsYW5lIGZvciBtdl90eXBlID09ICg0TVYpCisgICAgdWludDhfdCogZGlyZWN0X21iX3BsYW5lOyAgICAgICAvLy88IGJpdHBsYW5lIGZvciAiZGlyZWN0IiBNQnMKKyAgICB1aW50OF90KiBmb3J3YXJkX21iX3BsYW5lOyAgICAgIC8vLzwgYml0cGxhbmUgZm9yICJmb3J3YXJkIiBNQnMKKyAgICBpbnQgbXZfdHlwZV9pc19yYXc7ICAgICAgICAgICAgIC8vLzwgbXYgdHlwZSBtYiBwbGFuZSBpcyBub3QgY29kZWQKKyAgICBpbnQgZG1iX2lzX3JhdzsgICAgICAgICAgICAgICAgIC8vLzwgZGlyZWN0IG1iIHBsYW5lIGlzIHJhdworICAgIGludCBmbWJfaXNfcmF3OyAgICAgICAgICAgICAgICAgLy8vPCBmb3J3YXJkIG1iIHBsYW5lIGlzIHJhdworICAgIGludCBza2lwX2lzX3JhdzsgICAgICAgICAgICAgICAgLy8vPCBza2lwIG1iIHBsYW5lIGlzIG5vdCBjb2RlZAorICAgIHVpbnQ4X3QgbGFzdF9sdXR5WzJdWzI1Nl0sIGxhc3RfbHV0dXZbMl1bMjU2XTsgIC8vLzwgbG9va3VwIHRhYmxlcyB1c2VkIGZvciBpbnRlbnNpdHkgY29tcGVuc2F0aW9uCisgICAgdWludDhfdCAgYXV4X2x1dHlbMl1bMjU2XSwgIGF1eF9sdXR1dlsyXVsyNTZdOyAgLy8vPCBsb29rdXAgdGFibGVzIHVzZWQgZm9yIGludGVuc2l0eSBjb21wZW5zYXRpb24KKyAgICB1aW50OF90IG5leHRfbHV0eVsyXVsyNTZdLCBuZXh0X2x1dHV2WzJdWzI1Nl07ICAvLy88IGxvb2t1cCB0YWJsZXMgdXNlZCBmb3IgaW50ZW5zaXR5IGNvbXBlbnNhdGlvbgorICAgIHVpbnQ4X3QgKCpjdXJyX2x1dHkpWzI1Nl0gICwoKmN1cnJfbHV0dXYpWzI1Nl07CisgICAgaW50IGxhc3RfdXNlX2ljLCAqY3Vycl91c2VfaWMsIG5leHRfdXNlX2ljLCBhdXhfdXNlX2ljOworICAgIGludCBybmQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCByb3VuZGluZyBjb250cm9sCisKKyAgICAvKiogRnJhbWUgZGVjb2RpbmcgaW5mbyBmb3IgUy9NIHByb2ZpbGVzIG9ubHkgKi8KKyAgICAvL0B7CisgICAgdWludDhfdCByYW5nZXJlZGZybTsgICAgICAgICAgICAvLy88IG91dF9zYW1wbGUgPSBDTElQKChpbl9zYW1wbGUtMTI4KSoyKzEyOCkKKyAgICB1aW50OF90IGludGVycGZybTsKKyAgICAvL0B9CisKKyAgICAvKiogRnJhbWUgZGVjb2RpbmcgaW5mbyBmb3IgQWR2YW5jZWQgcHJvZmlsZSAqLworICAgIC8vQHsKKyAgICBlbnVtIEZyYW1lQ29kaW5nTW9kZSBmY207CisgICAgdWludDhfdCBudW1wYW5zY2Fud2luOworICAgIHVpbnQ4X3QgdGZjbnRyOworICAgIHVpbnQ4X3QgcnB0ZnJtLCB0ZmYsIHJmZjsKKyAgICB1aW50MTZfdCB0b3BsZWZ0eDsKKyAgICB1aW50MTZfdCB0b3BsZWZ0eTsKKyAgICB1aW50MTZfdCBib3R0b21yaWdodHg7CisgICAgdWludDE2X3QgYm90dG9tcmlnaHR5OworICAgIHVpbnQ4X3QgdXZzYW1wOworICAgIHVpbnQ4X3QgcG9zdHByb2M7CisgICAgaW50IGhyZF9udW1fbGVha3lfYnVja2V0czsKKyAgICB1aW50OF90IGJpdF9yYXRlX2V4cG9uZW50OworICAgIHVpbnQ4X3QgYnVmZmVyX3NpemVfZXhwb25lbnQ7CisgICAgdWludDhfdCogYWNwcmVkX3BsYW5lOyAgICAgICAvLy88IEFDIHByZWRpY3Rpb24gZmxhZ3MgYml0cGxhbmUKKyAgICBpbnQgYWNwcmVkX2lzX3JhdzsKKyAgICB1aW50OF90KiBvdmVyX2ZsYWdzX3BsYW5lOyAgIC8vLzwgT3ZlcmZsYWdzIGJpdHBsYW5lCisgICAgaW50IG92ZXJmbGdfaXNfcmF3OworICAgIHVpbnQ4X3QgY29uZG92ZXI7CisgICAgdWludDE2X3QgKmhyZF9yYXRlLCAqaHJkX2J1ZmZlcjsKKyAgICB1aW50OF90ICpocmRfZnVsbG5lc3M7CisgICAgdWludDhfdCByYW5nZV9tYXB5X2ZsYWc7CisgICAgdWludDhfdCByYW5nZV9tYXB1dl9mbGFnOworICAgIHVpbnQ4X3QgcmFuZ2VfbWFweTsKKyAgICB1aW50OF90IHJhbmdlX21hcHV2OworICAgIC8vQH0KKworICAgIC8qKiBGcmFtZSBkZWNvZGluZyBpbmZvIGZvciBpbnRlcmxhY2VkIHBpY3R1cmUgKi8KKyAgICB1aW50OF90IGRtdnJhbmdlOyAgIC8vLzwgRXh0ZW5kZWQgZGlmZmVyZW50aWFsIE1WIHJhbmdlIGZsYWcKKyAgICBpbnQgZm91cm12c3dpdGNoOworICAgIGludCBpbnRjb21wOworICAgIHVpbnQ4X3QgbHVtc2NhbGUyOyAgLy8vPCBmb3IgaW50ZXJsYWNlZCBmaWVsZCBQIHBpY3R1cmUKKyAgICB1aW50OF90IGx1bXNoaWZ0MjsKKyAgICBWTEMqIG1ibW9kZV92bGM7CisgICAgVkxDKiBpbXZfdmxjOworICAgIFZMQyogdHdvbXZicF92bGM7CisgICAgVkxDKiBmb3VybXZicF92bGM7CisgICAgdWludDhfdCB0d29tdmJwOworICAgIHVpbnQ4X3QgZm91cm12YnA7CisgICAgdWludDhfdCogZmllbGR0eF9wbGFuZTsKKyAgICBpbnQgZmllbGR0eF9pc19yYXc7CisgICAgdWludDhfdCB6emlfOHg4WzY0XTsKKyAgICB1aW50OF90ICpibGtfbXZfdHlwZV9iYXNlLCAqYmxrX212X3R5cGU7ICAgIC8vLzwgMDogZnJhbWUgTVYsIDE6IGZpZWxkIE1WIChpbnRlcmxhY2VkIGZyYW1lKQorICAgIHVpbnQ4X3QgKm12X2ZfYmFzZSwgKm12X2ZbMl07ICAgICAgICAgICAgICAgLy8vPCAwOiBNViBvYnRhaW5lZCBmcm9tIHNhbWUgZmllbGQsIDE6IG9wcG9zaXRlIGZpZWxkCisgICAgdWludDhfdCAqbXZfZl9uZXh0X2Jhc2UsICptdl9mX25leHRbMl07CisgICAgaW50IGZpZWxkX21vZGU7ICAgICAgICAgLy8vPCAxIGZvciBpbnRlcmxhY2VkIGZpZWxkIHBpY3R1cmVzCisgICAgaW50IGZwdHlwZTsKKyAgICBpbnQgc2Vjb25kX2ZpZWxkOworICAgIGludCByZWZkaXN0OyAgICAgICAgICAgIC8vLzwgZGlzdGFuY2Ugb2YgdGhlIGN1cnJlbnQgcGljdHVyZSBmcm9tIHJlZmVyZW5jZQorICAgIGludCBudW1yZWY7ICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHBhc3QgZmllbGQgcGljdHVyZXMgdXNlZCBhcyByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIGNvcnJlc3BvbmRzIHRvIDEgYW5kIDEgY29ycmVzcG9uZHMgdG8gMiByZWZlcmVuY2VzCisgICAgaW50IHJlZmZpZWxkOyAgICAgICAgICAgLy8vPCBpZiBudW1yZWYgPSAwICgxIHJlZmVyZW5jZSkgdGhlbiByZWZmaWVsZCBkZWNpZGVzIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgdG8gdXNlIGFtb25nIHRoZSB0d28gZmllbGRzIGZyb20gcHJldmlvdXMgZnJhbWUKKyAgICBpbnQgaW50Y29tcGZpZWxkOyAgICAgICAvLy88IHdoaWNoIG9mIHRoZSB0d28gZmllbGRzIHRvIGJlIGludGVuc2l0eSBjb21wZW5zYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDA6IGJvdGggZmllbGRzLCAxOiBib3R0b20gZmllbGQsIDI6IHRvcCBmaWVsZAorICAgIGludCBjdXJfZmllbGRfdHlwZTsgICAgIC8vLzwgMDogdG9wLCAxOiBib3R0b20KKyAgICBpbnQgcmVmX2ZpZWxkX3R5cGVbMl07ICAvLy88IGZvcndhcmQgYW5kIGJhY2t3YXJkIHJlZmVyZW5jZSBmaWVsZCB0eXBlICh0b3Agb3IgYm90dG9tKQorICAgIGludCBibG9ja3Nfb2ZmLCBtYl9vZmY7CisgICAgaW50IHFzX2xhc3Q7ICAgICAgICAgICAgLy8vPCBpZiBxcGVsIGhhcyBiZWVuIHVzZWQgaW4gdGhlIHByZXZpb3VzICh0ci4pIHBpY3R1cmUKKyAgICBpbnQgYm12dHlwZTsKKyAgICBpbnQgZnJmZCwgYnJmZDsgICAgICAgICAvLy88IHJlZmVyZW5jZSBmcmFtZSBkaXN0YW5jZSAoZm9yd2FyZCBvciBiYWNrd2FyZCkKKyAgICBpbnQgZmlyc3RfcGljX2hlYWRlcl9mbGFnOworICAgIGludCBwaWNfaGVhZGVyX2ZsYWc7CisKKyAgICAvKiogRnJhbWUgZGVjb2RpbmcgaW5mbyBmb3Igc3ByaXRlIG1vZGVzICovCisgICAgLy9AeworICAgIGludCBuZXdfc3ByaXRlOworICAgIGludCB0d29fc3ByaXRlczsKKyAgICBBVkZyYW1lICpzcHJpdGVfb3V0cHV0X2ZyYW1lOworICAgIGludCBvdXRwdXRfd2lkdGgsIG91dHB1dF9oZWlnaHQsIHNwcml0ZV93aWR0aCwgc3ByaXRlX2hlaWdodDsKKyAgICB1aW50OF90KiBzcl9yb3dzWzJdWzJdOyAgICAgIC8vLzwgU3ByaXRlIHJlc2l6ZXIgbGluZSBjYWNoZQorICAgIC8vQH0KKworICAgIGludCBwX2ZyYW1lX3NraXBwZWQ7CisgICAgaW50IGJpX3R5cGU7CisgICAgaW50IHg4X3R5cGU7CisKKyAgICBpbnQxNl90ICgqYmxvY2spWzZdWzY0XTsKKyAgICBpbnQgbl9hbGxvY2F0ZWRfYmxrcywgY3VyX2Jsa19pZHgsIGxlZnRfYmxrX2lkeCwgdG9wbGVmdF9ibGtfaWR4LCB0b3BfYmxrX2lkeDsKKyAgICB1aW50MzJfdCAqY2JwX2Jhc2UsICpjYnA7CisgICAgdWludDhfdCAqaXNfaW50cmFfYmFzZSwgKmlzX2ludHJhOworICAgIGludDE2X3QgKCpsdW1hX212X2Jhc2UpWzJdLCAoKmx1bWFfbXYpWzJdOworICAgIHVpbnQ4X3QgYmZyYWN0aW9uX2x1dF9pbmRleDsgLy8vPCBJbmRleCBmb3IgQkZSQUNUSU9OIHZhbHVlIChzZWUgVGFibGUgNDAsIHJlcHJvZHVjZWQgaW50byBmZl92YzFfYmZyYWN0aW9uX2x1dFtdKQorICAgIHVpbnQ4X3QgYnJva2VuX2xpbms7ICAgICAgICAgLy8vPCBCcm9rZW4gbGluayBmbGFnIChCUk9LRU5fTElOSyBzeW50YXggZWxlbWVudCkKKyAgICB1aW50OF90IGNsb3NlZF9lbnRyeTsgICAgICAgIC8vLzwgQ2xvc2VkIGVudHJ5IHBvaW50IGZsYWcgKENMT1NFRF9FTlRSWSBzeW50YXggZWxlbWVudCkKKworICAgIGludCBlbmRfbWJfeDsgICAgICAgICAgICAgICAgLy8vPCBIb3Jpem9udGFsIG1hY3JvYmxvY2sgbGltaXQgKHVzZWQgb25seSBieSBtc3MyKQorCisgICAgaW50IHBhcnNlX29ubHk7ICAgICAgICAgICAgICAvLy88IENvbnRleHQgaXMgdXNlZCB3aXRoaW4gcGFyc2VyCisgICAgaW50IHJlc3luY19tYXJrZXI7ICAgICAgICAgICAvLy88IGNvdWxkIHRoaXMgc3RyZWFtIGNvbnRhaW4gcmVzeW5jIG1hcmtlcnMKK30gVkMxQ29udGV4dDsKKworLyoqCisgKiBEZWNvZGUgU2ltcGxlL01haW4gUHJvZmlsZXMgc2VxdWVuY2UgaGVhZGVyCisgKiBAc2VlIEZpZ3VyZSA3LTgsIHAxNi0xNworICogQHBhcmFtIGF2Y3R4IENvZGVjIGNvbnRleHQKKyAqIEBwYXJhbSBnYiBHZXRCaXQgY29udGV4dCBpbml0aWFsaXplZCBmcm9tIENvZGVjIGNvbnRleHQgZXh0cmFfZGF0YQorICogQHJldHVybiBTdGF0dXMKKyAqLworaW50IGZmX3ZjMV9kZWNvZGVfc2VxdWVuY2VfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVkMxQ29udGV4dCAqdiwgR2V0Qml0Q29udGV4dCAqZ2IpOworCitpbnQgZmZfdmMxX2RlY29kZV9lbnRyeV9wb2ludChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFZDMUNvbnRleHQgKnYsIEdldEJpdENvbnRleHQgKmdiKTsKKworaW50IGZmX3ZjMV9wYXJzZV9mcmFtZV9oZWFkZXIgICAgKFZDMUNvbnRleHQgKnYsIEdldEJpdENvbnRleHQgKmdiKTsKK2ludCBmZl92YzFfcGFyc2VfZnJhbWVfaGVhZGVyX2FkdihWQzFDb250ZXh0ICp2LCBHZXRCaXRDb250ZXh0ICpnYik7CitpbnQgZmZfdmMxX2luaXRfY29tbW9uKFZDMUNvbnRleHQgKnYpOworCitpbnQgIGZmX3ZjMV9kZWNvZGVfaW5pdF9hbGxvY190YWJsZXMoVkMxQ29udGV4dCAqdik7Cit2b2lkIGZmX3ZjMV9pbml0X3RyYW5zcG9zZWRfc2NhbnRhYmxlcyhWQzFDb250ZXh0ICp2KTsKK2ludCAgZmZfdmMxX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK3ZvaWQgZmZfdmMxX2RlY29kZV9ibG9ja3MoVkMxQ29udGV4dCAqdik7CisKK3ZvaWQgZmZfdmMxX2xvb3BfZmlsdGVyX2libGsoVkMxQ29udGV4dCAqdiwgaW50IHBxKTsKK3ZvaWQgZmZfdmMxX2xvb3BfZmlsdGVyX2libGtfZGVsYXllZChWQzFDb250ZXh0ICp2LCBpbnQgcHEpOwordm9pZCBmZl92YzFfc21vb3RoX292ZXJsYXBfZmlsdGVyX2libGsoVkMxQ29udGV4dCAqdik7Cit2b2lkIGZmX3ZjMV9hcHBseV9wX2xvb3BfZmlsdGVyKFZDMUNvbnRleHQgKnYpOworCit2b2lkIGZmX3ZjMV9tY18xbXYoVkMxQ29udGV4dCAqdiwgaW50IGRpcik7Cit2b2lkIGZmX3ZjMV9tY180bXZfbHVtYShWQzFDb250ZXh0ICp2LCBpbnQgbiwgaW50IGRpciwgaW50IGF2Zyk7Cit2b2lkIGZmX3ZjMV9tY180bXZfY2hyb21hKFZDMUNvbnRleHQgKnYsIGludCBkaXIpOwordm9pZCBmZl92YzFfbWNfNG12X2Nocm9tYTQoVkMxQ29udGV4dCAqdiwgaW50IGRpciwgaW50IGRpcjIsIGludCBhdmcpOworCit2b2lkIGZmX3ZjMV9pbnRlcnBfbWMoVkMxQ29udGV4dCAqdik7CisKKyNlbmRpZiAvKiBBVkNPREVDX1ZDMV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92YzFfYmxvY2suYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMV9ibG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjJlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92YzFfYmxvY2suYwpAQCAtMCwwICsxLDMwNDggQEAKKy8qCisgKiBWQy0xIGFuZCBXTVYzIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYXNoaWF0IFNhcmtlciBTaGFra2hhcgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS29uc3RhbnRpbiBTaGlzaGtvdgorICogUGFydGx5IGJhc2VkIG9uIHZjOS5jIChjKSAyMDA1IEFub255bW91cywgQWxleCBCZXJlZ3N6YXN6aSwgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWQy0xIGFuZCBXTVYzIGJsb2NrIGRlY29kaW5nIHJvdXRpbmVzCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJtc21wZWc0ZGF0YS5oIgorI2luY2x1ZGUgInVuYXJ5LmgiCisjaW5jbHVkZSAidmMxLmgiCisjaW5jbHVkZSAidmMxX3ByZWQuaCIKKyNpbmNsdWRlICJ2YzFhY2RhdGEuaCIKKyNpbmNsdWRlICJ2YzFkYXRhLmgiCisKKyNkZWZpbmUgTUJfSU5UUkFfVkxDX0JJVFMgOQorI2RlZmluZSBEQ19WTENfQklUUyA5CisKKy8vIG9mZnNldCB0YWJsZXMgZm9yIGludGVybGFjZWQgcGljdHVyZSBNVkRBVEEgZGVjb2RpbmcKK3N0YXRpYyBjb25zdCBpbnQgb2Zmc2V0X3RhYmxlMVs5XSA9IHsgIDAsICAxLCAgMiwgIDQsICA4LCAxNiwgMzIsICA2NCwgMTI4IH07CitzdGF0aWMgY29uc3QgaW50IG9mZnNldF90YWJsZTJbOV0gPSB7ICAwLCAgMSwgIDMsICA3LCAxNSwgMzEsIDYzLCAxMjcsIDI1NSB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBuYW1lIFZDLTEgQml0cGxhbmUgZGVjb2RpbmcKKyAqIEBzZWUgOC43LCBwNTYKKyAqIEB7CisgKi8KKworCitzdGF0aWMgdm9pZCBpbml0X2Jsb2NrX2luZGV4KFZDMUNvbnRleHQgKnYpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdi0+czsKKyAgICBmZl9pbml0X2Jsb2NrX2luZGV4KHMpOworICAgIGlmICh2LT5maWVsZF9tb2RlICYmICEodi0+c2Vjb25kX2ZpZWxkIF4gdi0+dGZmKSkgeworICAgICAgICBzLT5kZXN0WzBdICs9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmxpbmVzaXplWzBdOworICAgICAgICBzLT5kZXN0WzFdICs9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmxpbmVzaXplWzFdOworICAgICAgICBzLT5kZXN0WzJdICs9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmxpbmVzaXplWzJdOworICAgIH0KK30KKworLyoqIEB9ICovIC8vQml0cGxhbmUgZ3JvdXAKKworc3RhdGljIHZvaWQgdmMxX3B1dF9zaWduZWRfYmxvY2tzX2NsYW1wZWQoVkMxQ29udGV4dCAqdikKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIGludCB0b3BsZWZ0X21iX3BvcywgdG9wX21iX3BvczsKKyAgICBpbnQgc3RyaWRlX3ksIGZpZWxkdHggPSAwOworICAgIGludCB2X2Rpc3Q7CisKKyAgICAvKiBUaGUgcHV0IHBpeGVscyBsb29wIGlzIGFsd2F5cyBvbmUgTUIgcm93IGJlaGluZCB0aGUgZGVjb2RpbmcgbG9vcCwKKyAgICAgKiBiZWNhdXNlIHdlIGNhbiBvbmx5IHB1dCBwaXhlbHMgd2hlbiBvdmVybGFwIGZpbHRlcmluZyBpcyBkb25lLCBhbmQKKyAgICAgKiBmb3IgZmlsdGVyaW5nIG9mIHRoZSBib3R0b20gZWRnZSBvZiBhIE1CLCB3ZSBuZWVkIHRoZSBuZXh0IE1CIHJvdworICAgICAqIHByZXNlbnQgYXMgd2VsbC4KKyAgICAgKiBXaXRoaW4gdGhlIHJvdywgdGhlIHB1dCBwaXhlbHMgbG9vcCBpcyBhbHNvIG9uZSBNQiBjb2wgYmVoaW5kIHRoZQorICAgICAqIGRlY29kaW5nIGxvb3AuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYWdhaW4sIGJlY2F1c2UgZm9yIGZpbHRlcmluZworICAgICAqIG9mIHRoZSByaWdodCBNQiBlZGdlLCB3ZSBuZWVkIHRoZSBuZXh0IE1CIHByZXNlbnQuICovCisgICAgaWYgKCFzLT5maXJzdF9zbGljZV9saW5lKSB7CisgICAgICAgIGlmIChzLT5tYl94KSB7CisgICAgICAgICAgICB0b3BsZWZ0X21iX3BvcyA9IChzLT5tYl95IC0gMSkgKiBzLT5tYl9zdHJpZGUgKyBzLT5tYl94IC0gMTsKKyAgICAgICAgICAgIGlmICh2LT5mY20gPT0gSUxBQ0VfRlJBTUUpCisgICAgICAgICAgICAgICAgZmllbGR0eCA9IHYtPmZpZWxkdHhfcGxhbmVbdG9wbGVmdF9tYl9wb3NdOworICAgICAgICAgICAgc3RyaWRlX3kgICAgICAgPSBzLT5saW5lc2l6ZSA8PCBmaWVsZHR4OworICAgICAgICAgICAgdl9kaXN0ICAgICAgICAgPSAoMTYgLSBmaWVsZHR4KSA+PiAoZmllbGR0eCA9PSAwKTsKKyAgICAgICAgICAgIHMtPmlkc3AucHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZCh2LT5ibG9ja1t2LT50b3BsZWZ0X2Jsa19pZHhdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlc3RbMF0gLSAxNiAqIHMtPmxpbmVzaXplIC0gMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlX3kpOworICAgICAgICAgICAgcy0+aWRzcC5wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkKHYtPmJsb2NrW3YtPnRvcGxlZnRfYmxrX2lkeF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdFswXSAtIDE2ICogcy0+bGluZXNpemUgLSA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZV95KTsKKyAgICAgICAgICAgIHMtPmlkc3AucHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZCh2LT5ibG9ja1t2LT50b3BsZWZ0X2Jsa19pZHhdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlc3RbMF0gLSB2X2Rpc3QgKiBzLT5saW5lc2l6ZSAtIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZV95KTsKKyAgICAgICAgICAgIHMtPmlkc3AucHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZCh2LT5ibG9ja1t2LT50b3BsZWZ0X2Jsa19pZHhdWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlc3RbMF0gLSB2X2Rpc3QgKiBzLT5saW5lc2l6ZSAtIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlX3kpOworICAgICAgICAgICAgcy0+aWRzcC5wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkKHYtPmJsb2NrW3YtPnRvcGxlZnRfYmxrX2lkeF1bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdFsxXSAtIDggKiBzLT51dmxpbmVzaXplIC0gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT51dmxpbmVzaXplKTsKKyAgICAgICAgICAgIHMtPmlkc3AucHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZCh2LT5ibG9ja1t2LT50b3BsZWZ0X2Jsa19pZHhdWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlc3RbMl0gLSA4ICogcy0+dXZsaW5lc2l6ZSAtIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZsaW5lc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPm1iX3ggPT0gcy0+bWJfd2lkdGggLSAxKSB7CisgICAgICAgICAgICB0b3BfbWJfcG9zID0gKHMtPm1iX3kgLSAxKSAqIHMtPm1iX3N0cmlkZSArIHMtPm1iX3g7CisgICAgICAgICAgICBpZiAodi0+ZmNtID09IElMQUNFX0ZSQU1FKQorICAgICAgICAgICAgICAgIGZpZWxkdHggPSB2LT5maWVsZHR4X3BsYW5lW3RvcF9tYl9wb3NdOworICAgICAgICAgICAgc3RyaWRlX3kgICA9IHMtPmxpbmVzaXplIDw8IGZpZWxkdHg7CisgICAgICAgICAgICB2X2Rpc3QgICAgID0gZmllbGR0eCA/IDE1IDogODsKKyAgICAgICAgICAgIHMtPmlkc3AucHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZCh2LT5ibG9ja1t2LT50b3BfYmxrX2lkeF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdFswXSAtIDE2ICogcy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlX3kpOworICAgICAgICAgICAgcy0+aWRzcC5wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkKHYtPmJsb2NrW3YtPnRvcF9ibGtfaWR4XVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kZXN0WzBdIC0gMTYgKiBzLT5saW5lc2l6ZSArIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlX3kpOworICAgICAgICAgICAgcy0+aWRzcC5wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkKHYtPmJsb2NrW3YtPnRvcF9ibGtfaWR4XVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kZXN0WzBdIC0gdl9kaXN0ICogcy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlX3kpOworICAgICAgICAgICAgcy0+aWRzcC5wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkKHYtPmJsb2NrW3YtPnRvcF9ibGtfaWR4XVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kZXN0WzBdIC0gdl9kaXN0ICogcy0+bGluZXNpemUgKyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZV95KTsKKyAgICAgICAgICAgIHMtPmlkc3AucHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZCh2LT5ibG9ja1t2LT50b3BfYmxrX2lkeF1bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdFsxXSAtIDggKiBzLT51dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnV2bGluZXNpemUpOworICAgICAgICAgICAgcy0+aWRzcC5wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkKHYtPmJsb2NrW3YtPnRvcF9ibGtfaWR4XVs1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kZXN0WzJdIC0gOCAqIHMtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZsaW5lc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyNkZWZpbmUgaW5jX2Jsa19pZHgoaWR4KSBkbyB7IFwKKyAgICAgICAgaWR4Kys7IFwKKyAgICAgICAgaWYgKGlkeCA+PSB2LT5uX2FsbG9jYXRlZF9ibGtzKSBcCisgICAgICAgICAgICBpZHggPSAwOyBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIGluY19ibGtfaWR4KHYtPnRvcGxlZnRfYmxrX2lkeCk7CisgICAgaW5jX2Jsa19pZHgodi0+dG9wX2Jsa19pZHgpOworICAgIGluY19ibGtfaWR4KHYtPmxlZnRfYmxrX2lkeCk7CisgICAgaW5jX2Jsa19pZHgodi0+Y3VyX2Jsa19pZHgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBuYW1lIFZDLTEgQmxvY2stbGV2ZWwgZnVuY3Rpb25zCisgKiBAc2VlIDcuMS40LCBwOTEgYW5kIDguMS4xLjcsIHAoMSkwNAorICogQHsKKyAqLworCisvKioKKyAqIEBkZWYgR0VUX01RVUFOVAorICogQGJyaWVmIEdldCBtYWNyb2Jsb2NrLWxldmVsIHF1YW50aXplciBzY2FsZQorICovCisjZGVmaW5lIEdFVF9NUVVBTlQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHYtPmRxdWFudGZybSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBlZGdlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh2LT5kcXByb2ZpbGUgPT0gRFFQUk9GSUxFX0FMTF9NQlMpIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAodi0+ZHFiaWxldmVsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbXF1YW50ID0gKGdldF9iaXRzMShnYikpID8gdi0+YWx0cHEgOiB2LT5wcTsgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbXFkaWZmID0gZ2V0X2JpdHMoZ2IsIDMpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKG1xZGlmZiAhPSA3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIG1xdWFudCA9IHYtPnBxICsgbXFkaWZmOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIG1xdWFudCA9IGdldF9iaXRzKGdiLCA1KTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh2LT5kcXByb2ZpbGUgPT0gRFFQUk9GSUxFX1NJTkdMRV9FREdFKSAgICAgICAgICAgICBcCisgICAgICAgICAgICBlZGdlcyA9IDEgPDwgdi0+ZHFzYmVkZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYgKHYtPmRxcHJvZmlsZSA9PSBEUVBST0ZJTEVfRE9VQkxFX0VER0VTKSAgICAgICBcCisgICAgICAgICAgICBlZGdlcyA9ICgzIDw8IHYtPmRxc2JlZGdlKSAlIDE1OyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYgKHYtPmRxcHJvZmlsZSA9PSBEUVBST0ZJTEVfRk9VUl9FREdFUykgICAgICAgICBcCisgICAgICAgICAgICBlZGdlcyA9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoZWRnZXMmMSkgJiYgIXMtPm1iX3gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtcXVhbnQgPSB2LT5hbHRwcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoZWRnZXMmMikgJiYgcy0+Zmlyc3Rfc2xpY2VfbGluZSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtcXVhbnQgPSB2LT5hbHRwcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoZWRnZXMmNCkgJiYgcy0+bWJfeCA9PSAocy0+bWJfd2lkdGggLSAxKSkgICAgICAgICBcCisgICAgICAgICAgICBtcXVhbnQgPSB2LT5hbHRwcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoZWRnZXMmOCkgJiYgcy0+bWJfeSA9PSAocy0+bWJfaGVpZ2h0IC0gMSkpICAgICAgICBcCisgICAgICAgICAgICBtcXVhbnQgPSB2LT5hbHRwcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghbXF1YW50IHx8IG1xdWFudCA+IDMxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0VSUk9SLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIk92ZXJyaWRpbmcgaW52YWxpZCBtcXVhbnQgJWRcbiIsIG1xdWFudCk7ICBcCisgICAgICAgICAgICBtcXVhbnQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvKioKKyAqIEBkZWYgR0VUX01WREFUQShfZG12X3gsIF9kbXZfeSkKKyAqIEBicmllZiBHZXQgTVYgZGlmZmVyZW50aWFscworICogQHNlZSBNVkRBVEEgZGVjb2RpbmcgZnJvbSA4LjMuNS4yLCBwKDEpMjAKKyAqIEBwYXJhbSBfZG12X3ggSG9yaXpvbnRhbCBkaWZmZXJlbnRpYWwgZm9yIGRlY29kZWQgTVYKKyAqIEBwYXJhbSBfZG12X3kgVmVydGljYWwgZGlmZmVyZW50aWFsIGZvciBkZWNvZGVkIE1WCisgKi8KKyNkZWZpbmUgR0VUX01WREFUQShfZG12X3gsIF9kbXZfeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmRleCA9IDEgKyBnZXRfdmxjMihnYiwgZmZfdmMxX212X2RpZmZfdmxjW3MtPm12X3RhYmxlX2luZGV4XS50YWJsZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFZDMV9NVl9ESUZGX1ZMQ19CSVRTLCAyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChpbmRleCA+IDM2KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYl9oYXNfY29lZmZzID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbmRleCAtPSAzNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYl9oYXNfY29lZmZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHMtPm1iX2ludHJhID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghaW5kZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZG12X3ggPSBfZG12X3kgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMzUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZG12X3ggPSBnZXRfYml0cyhnYiwgdi0+a194IC0gMSArIHMtPnF1YXJ0ZXJfc2FtcGxlKTsgICAgICAgICAgXAorICAgICAgICBfZG12X3kgPSBnZXRfYml0cyhnYiwgdi0+a195IC0gMSArIHMtPnF1YXJ0ZXJfc2FtcGxlKTsgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMzYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZG12X3ggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZG12X3kgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzLT5tYl9pbnRyYSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbmRleDEgPSBpbmRleCAlIDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIXMtPnF1YXJ0ZXJfc2FtcGxlICYmIGluZGV4MSA9PSA1KSB2YWwgPSAxOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2l6ZV90YWJsZVtpbmRleDFdIC0gdmFsID4gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmFsID0gZ2V0X2JpdHMoZ2IsIHNpemVfdGFibGVbaW5kZXgxXSAtIHZhbCk7ICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBzaWduID0gMCAtICh2YWwmMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZG12X3ggPSAoc2lnbiBeICgodmFsPj4xKSArIG9mZnNldF90YWJsZVtpbmRleDFdKSkgLSBzaWduOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbmRleDEgPSBpbmRleCAvIDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIXMtPnF1YXJ0ZXJfc2FtcGxlICYmIGluZGV4MSA9PSA1KSB2YWwgPSAxOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2l6ZV90YWJsZVtpbmRleDFdIC0gdmFsID4gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmFsID0gZ2V0X2JpdHMoZ2IsIHNpemVfdGFibGVbaW5kZXgxXSAtIHZhbCk7ICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBzaWduID0gMCAtICh2YWwgJiAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZG12X3kgPSAoc2lnbiBeICgodmFsID4+IDEpICsgb2Zmc2V0X3RhYmxlW2luZGV4MV0pKSAtIHNpZ247ICAgXAorICAgIH0KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBnZXRfbXZkYXRhX2ludGVybGFjZWQoVkMxQ29udGV4dCAqdiwgaW50ICpkbXZfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZG12X3ksIGludCAqcHJlZF9mbGFnKQoreworICAgIGludCBpbmRleCwgaW5kZXgxOworICAgIGludCBleHRlbmRfeCA9IDAsIGV4dGVuZF95ID0gMDsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZ2LT5zLmdiOworICAgIGludCBiaXRzLCBlc2M7CisgICAgaW50IHZhbCwgc2lnbjsKKyAgICBjb25zdCBpbnQqIG9mZnNfdGFiOworCisgICAgaWYgKHYtPm51bXJlZikgeworICAgICAgICBiaXRzID0gVkMxXzJSRUZfTVZEQVRBX1ZMQ19CSVRTOworICAgICAgICBlc2MgID0gMTI1OworICAgIH0gZWxzZSB7CisgICAgICAgIGJpdHMgPSBWQzFfMVJFRl9NVkRBVEFfVkxDX0JJVFM7CisgICAgICAgIGVzYyAgPSA3MTsKKyAgICB9CisgICAgc3dpdGNoICh2LT5kbXZyYW5nZSkgeworICAgIGNhc2UgMToKKyAgICAgICAgZXh0ZW5kX3ggPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGV4dGVuZF95ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBleHRlbmRfeCA9IGV4dGVuZF95ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGluZGV4ID0gZ2V0X3ZsYzIoZ2IsIHYtPmltdl92bGMtPnRhYmxlLCBiaXRzLCAzKTsKKyAgICBpZiAoaW5kZXggPT0gZXNjKSB7CisgICAgICAgICpkbXZfeCA9IGdldF9iaXRzKGdiLCB2LT5rX3gpOworICAgICAgICAqZG12X3kgPSBnZXRfYml0cyhnYiwgdi0+a195KTsKKyAgICAgICAgaWYgKHYtPm51bXJlZikgeworICAgICAgICAgICAgaWYgKHByZWRfZmxhZykgeworICAgICAgICAgICAgICAgICpwcmVkX2ZsYWcgPSAqZG12X3kgJiAxOworICAgICAgICAgICAgICAgICpkbXZfeSAgICAgPSAoKmRtdl95ICsgKnByZWRfZmxhZykgPj4gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmRtdl95ICAgICA9ICgqZG12X3kgKyAoKmRtdl95ICYgMSkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGF2X2Fzc2VydDAoaW5kZXggPCBlc2MpOworICAgICAgICBpZiAoZXh0ZW5kX3gpCisgICAgICAgICAgICBvZmZzX3RhYiA9IG9mZnNldF90YWJsZTI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9mZnNfdGFiID0gb2Zmc2V0X3RhYmxlMTsKKyAgICAgICAgaW5kZXgxID0gKGluZGV4ICsgMSkgJSA5OworICAgICAgICBpZiAoaW5kZXgxICE9IDApIHsKKyAgICAgICAgICAgIHZhbCAgICA9IGdldF9iaXRzKGdiLCBpbmRleDEgKyBleHRlbmRfeCk7CisgICAgICAgICAgICBzaWduICAgPSAwIC0odmFsICYgMSk7CisgICAgICAgICAgICAqZG12X3ggPSAoc2lnbiBeICgodmFsID4+IDEpICsgb2Zmc190YWJbaW5kZXgxXSkpIC0gc2lnbjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAqZG12X3ggPSAwOworICAgICAgICBpZiAoZXh0ZW5kX3kpCisgICAgICAgICAgICBvZmZzX3RhYiA9IG9mZnNldF90YWJsZTI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9mZnNfdGFiID0gb2Zmc2V0X3RhYmxlMTsKKyAgICAgICAgaW5kZXgxID0gKGluZGV4ICsgMSkgLyA5OworICAgICAgICBpZiAoaW5kZXgxID4gdi0+bnVtcmVmKSB7CisgICAgICAgICAgICB2YWwgICAgPSBnZXRfYml0cyhnYiwgKGluZGV4MSArIChleHRlbmRfeSA8PCB2LT5udW1yZWYpKSA+PiB2LT5udW1yZWYpOworICAgICAgICAgICAgc2lnbiAgID0gMCAtICh2YWwgJiAxKTsKKyAgICAgICAgICAgICpkbXZfeSA9IChzaWduIF4gKCh2YWwgPj4gMSkgKyBvZmZzX3RhYltpbmRleDEgPj4gdi0+bnVtcmVmXSkpIC0gc2lnbjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAqZG12X3kgPSAwOworICAgICAgICBpZiAodi0+bnVtcmVmICYmIHByZWRfZmxhZykKKyAgICAgICAgICAgICpwcmVkX2ZsYWcgPSBpbmRleDEgJiAxOworICAgIH0KK30KKworLyoqIFJlY29uc3RydWN0IG1vdGlvbiB2ZWN0b3IgZm9yIEItZnJhbWUgYW5kIGRvIG1vdGlvbiBjb21wZW5zYXRpb24KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHZjMV9iX21jKFZDMUNvbnRleHQgKnYsIGludCBkbXZfeFsyXSwgaW50IGRtdl95WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3QsIGludCBtb2RlKQoreworICAgIGlmIChkaXJlY3QpIHsKKyAgICAgICAgZmZfdmMxX21jXzFtdih2LCAwKTsKKyAgICAgICAgZmZfdmMxX2ludGVycF9tYyh2KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobW9kZSA9PSBCTVZfVFlQRV9JTlRFUlBPTEFURUQpIHsKKyAgICAgICAgZmZfdmMxX21jXzFtdih2LCAwKTsKKyAgICAgICAgZmZfdmMxX2ludGVycF9tYyh2KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZmX3ZjMV9tY18xbXYodiwgKG1vZGUgPT0gQk1WX1RZUEVfQkFDS1dBUkQpKTsKK30KKworLyoqIEdldCBwcmVkaWN0ZWQgREMgdmFsdWUgZm9yIEktZnJhbWVzIG9ubHkKKyAqIHByZWRpY3Rpb24gZGlyOiBsZWZ0PTAsIHRvcD0xCisgKiBAcGFyYW0gcyBNcGVnRW5jQ29udGV4dAorICogQHBhcmFtIG92ZXJsYXAgZmxhZyBpbmRpY2F0aW5nIHRoYXQgb3ZlcmxhcCBmaWx0ZXJpbmcgaXMgdXNlZAorICogQHBhcmFtIHBxIGludGVnZXIgcGFydCBvZiBwaWN0dXJlIHF1YW50aXplcgorICogQHBhcmFtW2luXSBuIGJsb2NrIGluZGV4IGluIHRoZSBjdXJyZW50IE1CCisgKiBAcGFyYW0gZGNfdmFsX3B0ciBQb2ludGVyIHRvIERDIHByZWRpY3RvcgorICogQHBhcmFtIGRpcl9wdHIgUHJlZGljdGlvbiBkaXJlY3Rpb24gZm9yIHVzZSBpbiBBQyBwcmVkaWN0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZjMV9pX3ByZWRfZGMoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBvdmVybGFwLCBpbnQgcHEsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICoqZGNfdmFsX3B0ciwgaW50ICpkaXJfcHRyKQoreworICAgIGludCBhLCBiLCBjLCB3cmFwLCBwcmVkLCBzY2FsZTsKKyAgICBpbnQxNl90ICpkY192YWw7CisgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGRjcHJlZFszMl0gPSB7CisgICAgICAgIC0xLCAxMDI0LCAgNTEyLCAgMzQxLCAgMjU2LCAgMjA1LCAgMTcxLCAgMTQ2LCAgMTI4LAorICAgICAgICAgICAgIDExNCwgIDEwMiwgICA5MywgICA4NSwgICA3OSwgICA3MywgICA2OCwgICA2NCwKKyAgICAgICAgICAgICAgNjAsICAgNTcsICAgNTQsICAgNTEsICAgNDksICAgNDcsICAgNDUsICAgNDMsCisgICAgICAgICAgICAgIDQxLCAgIDM5LCAgIDM4LCAgIDM3LCAgIDM1LCAgIDM0LCAgIDMzCisgICAgfTsKKworICAgIC8qIGZpbmQgcHJlZGljdGlvbiAtIHdtdjNfZGNfc2NhbGUgYWx3YXlzIHVzZWQgaGVyZSBpbiBmYWN0ICovCisgICAgaWYgKG4gPCA0KSBzY2FsZSA9IHMtPnlfZGNfc2NhbGU7CisgICAgZWxzZSAgICAgICBzY2FsZSA9IHMtPmNfZGNfc2NhbGU7CisKKyAgICB3cmFwICAgPSBzLT5ibG9ja193cmFwW25dOworICAgIGRjX3ZhbCA9IHMtPmRjX3ZhbFswXSArIHMtPmJsb2NrX2luZGV4W25dOworCisgICAgLyogQiBBCisgICAgICogQyBYCisgICAgICovCisgICAgYyA9IGRjX3ZhbFsgLSAxXTsKKyAgICBiID0gZGNfdmFsWyAtIDEgLSB3cmFwXTsKKyAgICBhID0gZGNfdmFsWyAtIHdyYXBdOworCisgICAgaWYgKHBxIDwgOSB8fCAhb3ZlcmxhcCkgeworICAgICAgICAvKiBTZXQgb3V0ZXIgdmFsdWVzICovCisgICAgICAgIGlmIChzLT5maXJzdF9zbGljZV9saW5lICYmIChuICE9IDIgJiYgbiAhPSAzKSkKKyAgICAgICAgICAgIGIgPSBhID0gZGNwcmVkW3NjYWxlXTsKKyAgICAgICAgaWYgKHMtPm1iX3ggPT0gMCAmJiAobiAhPSAxICYmIG4gIT0gMykpCisgICAgICAgICAgICBiID0gYyA9IGRjcHJlZFtzY2FsZV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogU2V0IG91dGVyIHZhbHVlcyAqLworICAgICAgICBpZiAocy0+Zmlyc3Rfc2xpY2VfbGluZSAmJiAobiAhPSAyICYmIG4gIT0gMykpCisgICAgICAgICAgICBiID0gYSA9IDA7CisgICAgICAgIGlmIChzLT5tYl94ID09IDAgJiYgKG4gIT0gMSAmJiBuICE9IDMpKQorICAgICAgICAgICAgYiA9IGMgPSAwOworICAgIH0KKworICAgIGlmIChhYnMoYSAtIGIpIDw9IGFicyhiIC0gYykpIHsKKyAgICAgICAgcHJlZCAgICAgPSBjOworICAgICAgICAqZGlyX3B0ciA9IDE7IC8vIGxlZnQKKyAgICB9IGVsc2UgeworICAgICAgICBwcmVkICAgICA9IGE7CisgICAgICAgICpkaXJfcHRyID0gMDsgLy8gdG9wCisgICAgfQorCisgICAgLyogdXBkYXRlIHByZWRpY3RvciAqLworICAgICpkY192YWxfcHRyID0gJmRjX3ZhbFswXTsKKyAgICByZXR1cm4gcHJlZDsKK30KKworCisvKiogR2V0IHByZWRpY3RlZCBEQyB2YWx1ZQorICogcHJlZGljdGlvbiBkaXI6IGxlZnQ9MCwgdG9wPTEKKyAqIEBwYXJhbSBzIE1wZWdFbmNDb250ZXh0CisgKiBAcGFyYW0gb3ZlcmxhcCBmbGFnIGluZGljYXRpbmcgdGhhdCBvdmVybGFwIGZpbHRlcmluZyBpcyB1c2VkCisgKiBAcGFyYW0gcHEgaW50ZWdlciBwYXJ0IG9mIHBpY3R1cmUgcXVhbnRpemVyCisgKiBAcGFyYW1baW5dIG4gYmxvY2sgaW5kZXggaW4gdGhlIGN1cnJlbnQgTUIKKyAqIEBwYXJhbSBhX2F2YWlsIGZsYWcgaW5kaWNhdGluZyB0b3AgYmxvY2sgYXZhaWxhYmlsaXR5CisgKiBAcGFyYW0gY19hdmFpbCBmbGFnIGluZGljYXRpbmcgbGVmdCBibG9jayBhdmFpbGFiaWxpdHkKKyAqIEBwYXJhbSBkY192YWxfcHRyIFBvaW50ZXIgdG8gREMgcHJlZGljdG9yCisgKiBAcGFyYW0gZGlyX3B0ciBQcmVkaWN0aW9uIGRpcmVjdGlvbiBmb3IgdXNlIGluIEFDIHByZWRpY3Rpb24KKyAqLworc3RhdGljIGlubGluZSBpbnQgZmZfdmMxX3ByZWRfZGMoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBvdmVybGFwLCBpbnQgcHEsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfYXZhaWwsIGludCBjX2F2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqKmRjX3ZhbF9wdHIsIGludCAqZGlyX3B0cikKK3sKKyAgICBpbnQgYSwgYiwgYywgd3JhcCwgcHJlZDsKKyAgICBpbnQxNl90ICpkY192YWw7CisgICAgaW50IG1iX3BvcyA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOworICAgIGludCBxMSwgcTIgPSAwOworICAgIGludCBkcXNjYWxlX2luZGV4OworCisgICAgd3JhcCA9IHMtPmJsb2NrX3dyYXBbbl07CisgICAgZGNfdmFsID0gcy0+ZGNfdmFsWzBdICsgcy0+YmxvY2tfaW5kZXhbbl07CisKKyAgICAvKiBCIEEKKyAgICAgKiBDIFgKKyAgICAgKi8KKyAgICBjID0gZGNfdmFsWyAtIDFdOworICAgIGIgPSBkY192YWxbIC0gMSAtIHdyYXBdOworICAgIGEgPSBkY192YWxbIC0gd3JhcF07CisgICAgLyogc2NhbGUgcHJlZGljdG9ycyBpZiBuZWVkZWQgKi8KKyAgICBxMSA9IHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfcG9zXTsKKyAgICBkcXNjYWxlX2luZGV4ID0gcy0+eV9kY19zY2FsZV90YWJsZVtxMV0gLSAxOworICAgIGlmIChkcXNjYWxlX2luZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGNfYXZhaWwgJiYgKG4gIT0gMSAmJiBuICE9IDMpKSB7CisgICAgICAgIHEyID0gcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVttYl9wb3MgLSAxXTsKKyAgICAgICAgaWYgKHEyICYmIHEyICE9IHExKQorICAgICAgICAgICAgYyA9IChjICogcy0+eV9kY19zY2FsZV90YWJsZVtxMl0gKiBmZl92YzFfZHFzY2FsZVtkcXNjYWxlX2luZGV4XSArIDB4MjAwMDApID4+IDE4OworICAgIH0KKyAgICBpZiAoYV9hdmFpbCAmJiAobiAhPSAyICYmIG4gIT0gMykpIHsKKyAgICAgICAgcTIgPSBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3BvcyAtIHMtPm1iX3N0cmlkZV07CisgICAgICAgIGlmIChxMiAmJiBxMiAhPSBxMSkKKyAgICAgICAgICAgIGEgPSAoYSAqIHMtPnlfZGNfc2NhbGVfdGFibGVbcTJdICogZmZfdmMxX2Rxc2NhbGVbZHFzY2FsZV9pbmRleF0gKyAweDIwMDAwKSA+PiAxODsKKyAgICB9CisgICAgaWYgKGFfYXZhaWwgJiYgY19hdmFpbCAmJiAobiAhPSAzKSkgeworICAgICAgICBpbnQgb2ZmID0gbWJfcG9zOworICAgICAgICBpZiAobiAhPSAxKQorICAgICAgICAgICAgb2ZmLS07CisgICAgICAgIGlmIChuICE9IDIpCisgICAgICAgICAgICBvZmYgLT0gcy0+bWJfc3RyaWRlOworICAgICAgICBxMiA9IHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbb2ZmXTsKKyAgICAgICAgaWYgKHEyICYmIHEyICE9IHExKQorICAgICAgICAgICAgYiA9IChiICogcy0+eV9kY19zY2FsZV90YWJsZVtxMl0gKiBmZl92YzFfZHFzY2FsZVtkcXNjYWxlX2luZGV4XSArIDB4MjAwMDApID4+IDE4OworICAgIH0KKworICAgIGlmIChhX2F2YWlsICYmIGNfYXZhaWwpIHsKKyAgICAgICAgaWYgKGFicyhhIC0gYikgPD0gYWJzKGIgLSBjKSkgeworICAgICAgICAgICAgcHJlZCAgICAgPSBjOworICAgICAgICAgICAgKmRpcl9wdHIgPSAxOyAvLyBsZWZ0CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmVkICAgICA9IGE7CisgICAgICAgICAgICAqZGlyX3B0ciA9IDA7IC8vIHRvcAorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhX2F2YWlsKSB7CisgICAgICAgIHByZWQgICAgID0gYTsKKyAgICAgICAgKmRpcl9wdHIgPSAwOyAvLyB0b3AKKyAgICB9IGVsc2UgaWYgKGNfYXZhaWwpIHsKKyAgICAgICAgcHJlZCAgICAgPSBjOworICAgICAgICAqZGlyX3B0ciA9IDE7IC8vIGxlZnQKKyAgICB9IGVsc2UgeworICAgICAgICBwcmVkICAgICA9IDA7CisgICAgICAgICpkaXJfcHRyID0gMTsgLy8gbGVmdAorICAgIH0KKworICAgIC8qIHVwZGF0ZSBwcmVkaWN0b3IgKi8KKyAgICAqZGNfdmFsX3B0ciA9ICZkY192YWxbMF07CisgICAgcmV0dXJuIHByZWQ7Cit9CisKKy8qKiBAfSAqLyAvLyBCbG9jayBncm91cAorCisvKioKKyAqIEBuYW1lIFZDMSBNYWNyb2Jsb2NrLWxldmVsIGZ1bmN0aW9ucyBpbiBTaW1wbGUvTWFpbiBQcm9maWxlcworICogQHNlZSA3LjEuNCwgcDkxIGFuZCA4LjEuMS43LCBwKDEpMDQKKyAqIEB7CisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdmMxX2NvZGVkX2Jsb2NrX3ByZWQoTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipjb2RlZF9ibG9ja19wdHIpCit7CisgICAgaW50IHh5LCB3cmFwLCBwcmVkLCBhLCBiLCBjOworCisgICAgeHkgICA9IHMtPmJsb2NrX2luZGV4W25dOworICAgIHdyYXAgPSBzLT5iOF9zdHJpZGU7CisKKyAgICAvKiBCIEMKKyAgICAgKiBBIFgKKyAgICAgKi8KKyAgICBhID0gcy0+Y29kZWRfYmxvY2tbeHkgLSAxICAgICAgIF07CisgICAgYiA9IHMtPmNvZGVkX2Jsb2NrW3h5IC0gMSAtIHdyYXBdOworICAgIGMgPSBzLT5jb2RlZF9ibG9ja1t4eSAgICAgLSB3cmFwXTsKKworICAgIGlmIChiID09IGMpIHsKKyAgICAgICAgcHJlZCA9IGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJlZCA9IGM7CisgICAgfQorCisgICAgLyogc3RvcmUgdmFsdWUgKi8KKyAgICAqY29kZWRfYmxvY2tfcHRyID0gJnMtPmNvZGVkX2Jsb2NrW3h5XTsKKworICAgIHJldHVybiBwcmVkOworfQorCisvKioKKyAqIERlY29kZSBvbmUgQUMgY29lZmZpY2llbnQKKyAqIEBwYXJhbSB2IFRoZSBWQzEgY29udGV4dAorICogQHBhcmFtIGxhc3QgTGFzdCBjb2VmZmljaWVudAorICogQHBhcmFtIHNraXAgSG93IG11Y2ggemVybyBjb2VmZmljaWVudHMgdG8gc2tpcAorICogQHBhcmFtIHZhbHVlIERlY29kZWQgQUMgY29lZmZpY2llbnQgdmFsdWUKKyAqIEBwYXJhbSBjb2RpbmdzZXQgc2V0IG9mIFZMQyB0byBkZWNvZGUgZGF0YQorICogQHNlZSA4LjEuMy40CisgKi8KK3N0YXRpYyB2b2lkIHZjMV9kZWNvZGVfYWNfY29lZmYoVkMxQ29udGV4dCAqdiwgaW50ICpsYXN0LCBpbnQgKnNraXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdmFsdWUsIGludCBjb2RpbmdzZXQpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmdi0+cy5nYjsKKyAgICBpbnQgaW5kZXgsIGVzY2FwZSwgcnVuID0gMCwgbGV2ZWwgPSAwLCBsc3QgPSAwOworCisgICAgaW5kZXggPSBnZXRfdmxjMihnYiwgZmZfdmMxX2FjX2NvZWZmX3RhYmxlW2NvZGluZ3NldF0udGFibGUsIEFDX1ZMQ19CSVRTLCAzKTsKKyAgICBpZiAoaW5kZXggIT0gZmZfdmMxX2FjX3NpemVzW2NvZGluZ3NldF0gLSAxKSB7CisgICAgICAgIHJ1biAgID0gdmMxX2luZGV4X2RlY29kZV90YWJsZVtjb2RpbmdzZXRdW2luZGV4XVswXTsKKyAgICAgICAgbGV2ZWwgPSB2YzFfaW5kZXhfZGVjb2RlX3RhYmxlW2NvZGluZ3NldF1baW5kZXhdWzFdOworICAgICAgICBsc3QgICA9IGluZGV4ID49IHZjMV9sYXN0X2RlY29kZV90YWJsZVtjb2RpbmdzZXRdIHx8IGdldF9iaXRzX2xlZnQoZ2IpIDwgMDsKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpCisgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICB9IGVsc2UgeworICAgICAgICBlc2NhcGUgPSBkZWNvZGUyMTAoZ2IpOworICAgICAgICBpZiAoZXNjYXBlICE9IDIpIHsKKyAgICAgICAgICAgIGluZGV4ID0gZ2V0X3ZsYzIoZ2IsIGZmX3ZjMV9hY19jb2VmZl90YWJsZVtjb2RpbmdzZXRdLnRhYmxlLCBBQ19WTENfQklUUywgMyk7CisgICAgICAgICAgICBydW4gICA9IHZjMV9pbmRleF9kZWNvZGVfdGFibGVbY29kaW5nc2V0XVtpbmRleF1bMF07CisgICAgICAgICAgICBsZXZlbCA9IHZjMV9pbmRleF9kZWNvZGVfdGFibGVbY29kaW5nc2V0XVtpbmRleF1bMV07CisgICAgICAgICAgICBsc3QgICA9IGluZGV4ID49IHZjMV9sYXN0X2RlY29kZV90YWJsZVtjb2RpbmdzZXRdOworICAgICAgICAgICAgaWYgKGVzY2FwZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxzdCkKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgKz0gdmMxX2xhc3RfZGVsdGFfbGV2ZWxfdGFibGVbY29kaW5nc2V0XVtydW5dOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgKz0gdmMxX2RlbHRhX2xldmVsX3RhYmxlW2NvZGluZ3NldF1bcnVuXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxzdCkKKyAgICAgICAgICAgICAgICAgICAgcnVuICs9IHZjMV9sYXN0X2RlbHRhX3J1bl90YWJsZVtjb2RpbmdzZXRdW2xldmVsXSArIDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBydW4gKz0gdmMxX2RlbHRhX3J1bl90YWJsZVtjb2RpbmdzZXRdW2xldmVsXSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBzaWduOworICAgICAgICAgICAgbHN0ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGlmICh2LT5zLmVzYzNfbGV2ZWxfbGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAodi0+cHEgPCA4IHx8IHYtPmRxdWFudGZybSkgeyAvLyB0YWJsZSA1OQorICAgICAgICAgICAgICAgICAgICB2LT5zLmVzYzNfbGV2ZWxfbGVuZ3RoID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXYtPnMuZXNjM19sZXZlbF9sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB2LT5zLmVzYzNfbGV2ZWxfbGVuZ3RoID0gZ2V0X2JpdHMoZ2IsIDIpICsgODsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YWJsZSA2MAorICAgICAgICAgICAgICAgICAgICB2LT5zLmVzYzNfbGV2ZWxfbGVuZ3RoID0gZ2V0X3VuYXJ5KGdiLCAxLCA2KSArIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHYtPnMuZXNjM19ydW5fbGVuZ3RoID0gMyArIGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ1biAgID0gZ2V0X2JpdHMoZ2IsIHYtPnMuZXNjM19ydW5fbGVuZ3RoKTsKKyAgICAgICAgICAgIHNpZ24gID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGxldmVsID0gZ2V0X2JpdHMoZ2IsIHYtPnMuZXNjM19sZXZlbF9sZW5ndGgpOworICAgICAgICAgICAgaWYgKHNpZ24pCisgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqbGFzdCAgPSBsc3Q7CisgICAgKnNraXAgID0gcnVuOworICAgICp2YWx1ZSA9IGxldmVsOworfQorCisvKiogRGVjb2RlIGludHJhIGJsb2NrIGluIGludHJhIGZyYW1lcyAtIHNob3VsZCBiZSBmYXN0ZXIgdGhhbiBkZWNvZGVfaW50cmFfYmxvY2sKKyAqIEBwYXJhbSB2IFZDMUNvbnRleHQKKyAqIEBwYXJhbSBibG9jayBibG9jayB0byBkZWNvZGUKKyAqIEBwYXJhbVtpbl0gbiBzdWJibG9jayBpbmRleAorICogQHBhcmFtIGNvZGVkIGFyZSBBQyBjb2VmZnMgcHJlc2VudCBvciBub3QKKyAqIEBwYXJhbSBjb2RpbmdzZXQgc2V0IG9mIFZMQyB0byBkZWNvZGUgZGF0YQorICovCitzdGF0aWMgaW50IHZjMV9kZWNvZGVfaV9ibG9jayhWQzFDb250ZXh0ICp2LCBpbnQxNl90IGJsb2NrWzY0XSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kZWQsIGludCBjb2RpbmdzZXQpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmdi0+cy5nYjsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIGludCBkY19wcmVkX2RpciA9IDA7IC8qIERpcmVjdGlvbiBvZiB0aGUgREMgcHJlZGljdGlvbiB1c2VkICovCisgICAgaW50IGk7CisgICAgaW50MTZfdCAqZGNfdmFsOworICAgIGludDE2X3QgKmFjX3ZhbCwgKmFjX3ZhbDI7CisgICAgaW50IGRjZGlmZjsKKworICAgIC8qIEdldCBEQyBkaWZmZXJlbnRpYWwgKi8KKyAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgZGNkaWZmID0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9tc21wNF9kY19sdW1hX3ZsY1tzLT5kY190YWJsZV9pbmRleF0udGFibGUsIERDX1ZMQ19CSVRTLCAzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkY2RpZmYgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX21zbXA0X2RjX2Nocm9tYV92bGNbcy0+ZGNfdGFibGVfaW5kZXhdLnRhYmxlLCBEQ19WTENfQklUUywgMyk7CisgICAgfQorICAgIGlmIChkY2RpZmYgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSWxsZWdhbCBEQyBWTENcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChkY2RpZmYpIHsKKyAgICAgICAgaWYgKGRjZGlmZiA9PSAxMTkgLyogRVNDIGluZGV4IHZhbHVlICovKSB7CisgICAgICAgICAgICAvKiBUT0RPOiBPcHRpbWl6ZSAqLworICAgICAgICAgICAgaWYgKHYtPnBxID09IDEpICAgICAgZGNkaWZmID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHYtPnBxID09IDIpIGRjZGlmZiA9IGdldF9iaXRzKGdiLCA5KTsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgIGRjZGlmZiA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh2LT5wcSA9PSAxKQorICAgICAgICAgICAgICAgIGRjZGlmZiA9IChkY2RpZmYgPDwgMikgKyBnZXRfYml0cyhnYiwgMikgLSAzOworICAgICAgICAgICAgZWxzZSBpZiAodi0+cHEgPT0gMikKKyAgICAgICAgICAgICAgICBkY2RpZmYgPSAoZGNkaWZmIDw8IDEpICsgZ2V0X2JpdHMxKGdiKSAgIC0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgICAgIGRjZGlmZiA9IC1kY2RpZmY7CisgICAgfQorCisgICAgLyogUHJlZGljdGlvbiAqLworICAgIGRjZGlmZiArPSB2YzFfaV9wcmVkX2RjKCZ2LT5zLCB2LT5vdmVybGFwLCB2LT5wcSwgbiwgJmRjX3ZhbCwgJmRjX3ByZWRfZGlyKTsKKyAgICAqZGNfdmFsID0gZGNkaWZmOworCisgICAgLyogU3RvcmUgdGhlIHF1YW50aXplZCBEQyBjb2VmZiwgdXNlZCBmb3IgcHJlZGljdGlvbiAqLworICAgIGlmIChuIDwgNCkgeworICAgICAgICBibG9ja1swXSA9IGRjZGlmZiAqIHMtPnlfZGNfc2NhbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmxvY2tbMF0gPSBkY2RpZmYgKiBzLT5jX2RjX3NjYWxlOworICAgIH0KKyAgICAvKiBTa2lwID8gKi8KKyAgICBpZiAoIWNvZGVkKSB7CisgICAgICAgIGdvdG8gbm90X2NvZGVkOworICAgIH0KKworICAgIC8vIEFDIERlY29kaW5nCisgICAgaSA9IDE7CisKKyAgICB7CisgICAgICAgIGludCBsYXN0ID0gMCwgc2tpcCwgdmFsdWU7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnp6X3RhYmxlOworICAgICAgICBpbnQgc2NhbGU7CisgICAgICAgIGludCBrOworCisgICAgICAgIHNjYWxlID0gdi0+cHEgKiAyICsgdi0+aGFsZnBxOworCisgICAgICAgIGlmICh2LT5zLmFjX3ByZWQpIHsKKyAgICAgICAgICAgIGlmICghZGNfcHJlZF9kaXIpCisgICAgICAgICAgICAgICAgenpfdGFibGUgPSB2LT56el84eDhbMl07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgenpfdGFibGUgPSB2LT56el84eDhbM107CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgenpfdGFibGUgPSB2LT56el84eDhbMV07CisKKyAgICAgICAgYWNfdmFsICA9IHMtPmFjX3ZhbFswXVswXSArIHMtPmJsb2NrX2luZGV4W25dICogMTY7CisgICAgICAgIGFjX3ZhbDIgPSBhY192YWw7CisgICAgICAgIGlmIChkY19wcmVkX2RpcikgLy8gbGVmdAorICAgICAgICAgICAgYWNfdmFsIC09IDE2OworICAgICAgICBlbHNlIC8vIHRvcAorICAgICAgICAgICAgYWNfdmFsIC09IDE2ICogcy0+YmxvY2tfd3JhcFtuXTsKKworICAgICAgICB3aGlsZSAoIWxhc3QpIHsKKyAgICAgICAgICAgIHZjMV9kZWNvZGVfYWNfY29lZmYodiwgJmxhc3QsICZza2lwLCAmdmFsdWUsIGNvZGluZ3NldCk7CisgICAgICAgICAgICBpICs9IHNraXA7CisgICAgICAgICAgICBpZiAoaSA+IDYzKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYmxvY2tbenpfdGFibGVbaSsrXV0gPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFwcGx5IEFDIHByZWRpY3Rpb24gaWYgbmVlZGVkICovCisgICAgICAgIGlmIChzLT5hY19wcmVkKSB7CisgICAgICAgICAgICBpZiAoZGNfcHJlZF9kaXIpIHsgLy8gbGVmdAorICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+bGVmdF9ibGtfc2hdICs9IGFjX3ZhbFtrXTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRvcAorICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+dG9wX2Jsa19zaF0gKz0gYWNfdmFsW2sgKyA4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBzYXZlIEFDIGNvZWZmcyBmb3IgZnVydGhlciBwcmVkaWN0aW9uICovCisgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspIHsKKyAgICAgICAgICAgIGFjX3ZhbDJba10gICAgID0gYmxvY2tbayA8PCB2LT5sZWZ0X2Jsa19zaF07CisgICAgICAgICAgICBhY192YWwyW2sgKyA4XSA9IGJsb2NrW2sgPDwgdi0+dG9wX2Jsa19zaF07CisgICAgICAgIH0KKworICAgICAgICAvKiBzY2FsZSBBQyBjb2VmZnMgKi8KKyAgICAgICAgZm9yIChrID0gMTsgayA8IDY0OyBrKyspCisgICAgICAgICAgICBpZiAoYmxvY2tba10pIHsKKyAgICAgICAgICAgICAgICBibG9ja1trXSAqPSBzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoIXYtPnBxdWFudGl6ZXIpCisgICAgICAgICAgICAgICAgICAgIGJsb2NrW2tdICs9IChibG9ja1trXSA8IDApID8gLXYtPnBxIDogdi0+cHE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPmFjX3ByZWQpIGkgPSA2MzsKKyAgICB9CisKK25vdF9jb2RlZDoKKyAgICBpZiAoIWNvZGVkKSB7CisgICAgICAgIGludCBrLCBzY2FsZTsKKyAgICAgICAgYWNfdmFsICA9IHMtPmFjX3ZhbFswXVswXSArIHMtPmJsb2NrX2luZGV4W25dICogMTY7CisgICAgICAgIGFjX3ZhbDIgPSBhY192YWw7CisKKyAgICAgICAgaSA9IDA7CisgICAgICAgIHNjYWxlID0gdi0+cHEgKiAyICsgdi0+aGFsZnBxOworICAgICAgICBtZW1zZXQoYWNfdmFsMiwgMCwgMTYgKiAyKTsKKyAgICAgICAgaWYgKGRjX3ByZWRfZGlyKSB7IC8vIGxlZnQKKyAgICAgICAgICAgIGFjX3ZhbCAtPSAxNjsKKyAgICAgICAgICAgIGlmIChzLT5hY19wcmVkKQorICAgICAgICAgICAgICAgIG1lbWNweShhY192YWwyLCBhY192YWwsIDggKiAyKTsKKyAgICAgICAgfSBlbHNlIHsgLy8gdG9wCisgICAgICAgICAgICBhY192YWwgLT0gMTYgKiBzLT5ibG9ja193cmFwW25dOworICAgICAgICAgICAgaWYgKHMtPmFjX3ByZWQpCisgICAgICAgICAgICAgICAgbWVtY3B5KGFjX3ZhbDIgKyA4LCBhY192YWwgKyA4LCA4ICogMik7CisgICAgICAgIH0KKworICAgICAgICAvKiBhcHBseSBBQyBwcmVkaWN0aW9uIGlmIG5lZWRlZCAqLworICAgICAgICBpZiAocy0+YWNfcHJlZCkgeworICAgICAgICAgICAgaWYgKGRjX3ByZWRfZGlyKSB7IC8vbGVmdAorICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbayA8PCB2LT5sZWZ0X2Jsa19zaF0gPSBhY192YWxba10gKiBzY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF2LT5wcXVhbnRpemVyICYmIGJsb2NrW2sgPDwgdi0+bGVmdF9ibGtfc2hdKQorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbayA8PCB2LT5sZWZ0X2Jsa19zaF0gKz0gKGJsb2NrW2sgPDwgdi0+bGVmdF9ibGtfc2hdIDwgMCkgPyAtdi0+cHEgOiB2LT5wcTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB0b3AKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgODsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+dG9wX2Jsa19zaF0gPSBhY192YWxbayArIDhdICogc2NhbGU7CisgICAgICAgICAgICAgICAgICAgIGlmICghdi0+cHF1YW50aXplciAmJiBibG9ja1trIDw8IHYtPnRvcF9ibGtfc2hdKQorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbayA8PCB2LT50b3BfYmxrX3NoXSArPSAoYmxvY2tbayA8PCB2LT50b3BfYmxrX3NoXSA8IDApID8gLXYtPnBxIDogdi0+cHE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaSA9IDYzOworICAgICAgICB9CisgICAgfQorICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gPSBpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBEZWNvZGUgaW50cmEgYmxvY2sgaW4gaW50cmEgZnJhbWVzIC0gc2hvdWxkIGJlIGZhc3RlciB0aGFuIGRlY29kZV9pbnRyYV9ibG9jaworICogQHBhcmFtIHYgVkMxQ29udGV4dAorICogQHBhcmFtIGJsb2NrIGJsb2NrIHRvIGRlY29kZQorICogQHBhcmFtW2luXSBuIHN1YmJsb2NrIG51bWJlcgorICogQHBhcmFtIGNvZGVkIGFyZSBBQyBjb2VmZnMgcHJlc2VudCBvciBub3QKKyAqIEBwYXJhbSBjb2RpbmdzZXQgc2V0IG9mIFZMQyB0byBkZWNvZGUgZGF0YQorICogQHBhcmFtIG1xdWFudCBxdWFudGl6ZXIgdmFsdWUgZm9yIHRoaXMgbWFjcm9ibG9jaworICovCitzdGF0aWMgaW50IHZjMV9kZWNvZGVfaV9ibG9ja19hZHYoVkMxQ29udGV4dCAqdiwgaW50MTZfdCBibG9ja1s2NF0sIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlZCwgaW50IGNvZGluZ3NldCwgaW50IG1xdWFudCkKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZ2LT5zLmdiOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgaW50IGRjX3ByZWRfZGlyID0gMDsgLyogRGlyZWN0aW9uIG9mIHRoZSBEQyBwcmVkaWN0aW9uIHVzZWQgKi8KKyAgICBpbnQgaTsKKyAgICBpbnQxNl90ICpkY192YWwgPSBOVUxMOworICAgIGludDE2X3QgKmFjX3ZhbCwgKmFjX3ZhbDI7CisgICAgaW50IGRjZGlmZjsKKyAgICBpbnQgYV9hdmFpbCA9IHYtPmFfYXZhaWwsIGNfYXZhaWwgPSB2LT5jX2F2YWlsOworICAgIGludCB1c2VfcHJlZCA9IHMtPmFjX3ByZWQ7CisgICAgaW50IHNjYWxlOworICAgIGludCBxMSwgcTIgPSAwOworICAgIGludCBtYl9wb3MgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKKworICAgIC8qIEdldCBEQyBkaWZmZXJlbnRpYWwgKi8KKyAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgZGNkaWZmID0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9tc21wNF9kY19sdW1hX3ZsY1tzLT5kY190YWJsZV9pbmRleF0udGFibGUsIERDX1ZMQ19CSVRTLCAzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkY2RpZmYgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX21zbXA0X2RjX2Nocm9tYV92bGNbcy0+ZGNfdGFibGVfaW5kZXhdLnRhYmxlLCBEQ19WTENfQklUUywgMyk7CisgICAgfQorICAgIGlmIChkY2RpZmYgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSWxsZWdhbCBEQyBWTENcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChkY2RpZmYpIHsKKyAgICAgICAgaWYgKGRjZGlmZiA9PSAxMTkgLyogRVNDIGluZGV4IHZhbHVlICovKSB7CisgICAgICAgICAgICAvKiBUT0RPOiBPcHRpbWl6ZSAqLworICAgICAgICAgICAgaWYgKG1xdWFudCA9PSAxKSAgICAgIGRjZGlmZiA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICBlbHNlIGlmIChtcXVhbnQgPT0gMikgZGNkaWZmID0gZ2V0X2JpdHMoZ2IsIDkpOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgIGRjZGlmZiA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtcXVhbnQgPT0gMSkKKyAgICAgICAgICAgICAgICBkY2RpZmYgPSAoZGNkaWZmIDw8IDIpICsgZ2V0X2JpdHMoZ2IsIDIpIC0gMzsKKyAgICAgICAgICAgIGVsc2UgaWYgKG1xdWFudCA9PSAyKQorICAgICAgICAgICAgICAgIGRjZGlmZiA9IChkY2RpZmYgPDwgMSkgKyBnZXRfYml0czEoZ2IpICAgLSAxOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKQorICAgICAgICAgICAgZGNkaWZmID0gLWRjZGlmZjsKKyAgICB9CisKKyAgICAvKiBQcmVkaWN0aW9uICovCisgICAgZGNkaWZmICs9IGZmX3ZjMV9wcmVkX2RjKCZ2LT5zLCB2LT5vdmVybGFwLCBtcXVhbnQsIG4sIHYtPmFfYXZhaWwsIHYtPmNfYXZhaWwsICZkY192YWwsICZkY19wcmVkX2Rpcik7CisgICAgKmRjX3ZhbCA9IGRjZGlmZjsKKworICAgIC8qIFN0b3JlIHRoZSBxdWFudGl6ZWQgREMgY29lZmYsIHVzZWQgZm9yIHByZWRpY3Rpb24gKi8KKyAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgYmxvY2tbMF0gPSBkY2RpZmYgKiBzLT55X2RjX3NjYWxlOworICAgIH0gZWxzZSB7CisgICAgICAgIGJsb2NrWzBdID0gZGNkaWZmICogcy0+Y19kY19zY2FsZTsKKyAgICB9CisKKyAgICAvL0FDIERlY29kaW5nCisgICAgaSA9IDE7CisKKyAgICAvKiBjaGVjayBpZiBBQyBpcyBuZWVkZWQgYXQgYWxsICovCisgICAgaWYgKCFhX2F2YWlsICYmICFjX2F2YWlsKQorICAgICAgICB1c2VfcHJlZCA9IDA7CisgICAgYWNfdmFsICA9IHMtPmFjX3ZhbFswXVswXSArIHMtPmJsb2NrX2luZGV4W25dICogMTY7CisgICAgYWNfdmFsMiA9IGFjX3ZhbDsKKworICAgIHNjYWxlID0gbXF1YW50ICogMiArICgobXF1YW50ID09IHYtPnBxKSA/IHYtPmhhbGZwcSA6IDApOworCisgICAgaWYgKGRjX3ByZWRfZGlyKSAvLyBsZWZ0CisgICAgICAgIGFjX3ZhbCAtPSAxNjsKKyAgICBlbHNlIC8vIHRvcAorICAgICAgICBhY192YWwgLT0gMTYgKiBzLT5ibG9ja193cmFwW25dOworCisgICAgcTEgPSBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3Bvc107CisgICAgaWYgKCBkY19wcmVkX2RpciAmJiBjX2F2YWlsICYmIG1iX3BvcykKKyAgICAgICAgcTIgPSBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3BvcyAtIDFdOworICAgIGlmICghZGNfcHJlZF9kaXIgJiYgYV9hdmFpbCAmJiBtYl9wb3MgPj0gcy0+bWJfc3RyaWRlKQorICAgICAgICBxMiA9IHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfcG9zIC0gcy0+bWJfc3RyaWRlXTsKKyAgICBpZiAoIGRjX3ByZWRfZGlyICYmIG4gPT0gMSkKKyAgICAgICAgcTIgPSBxMTsKKyAgICBpZiAoIWRjX3ByZWRfZGlyICYmIG4gPT0gMikKKyAgICAgICAgcTIgPSBxMTsKKyAgICBpZiAobiA9PSAzKQorICAgICAgICBxMiA9IHExOworCisgICAgaWYgKGNvZGVkKSB7CisgICAgICAgIGludCBsYXN0ID0gMCwgc2tpcCwgdmFsdWU7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnp6X3RhYmxlOworICAgICAgICBpbnQgazsKKworICAgICAgICBpZiAodi0+cy5hY19wcmVkKSB7CisgICAgICAgICAgICBpZiAoIXVzZV9wcmVkICYmIHYtPmZjbSA9PSBJTEFDRV9GUkFNRSkgeworICAgICAgICAgICAgICAgIHp6X3RhYmxlID0gdi0+enppXzh4ODsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFkY19wcmVkX2RpcikgLy8gdG9wCisgICAgICAgICAgICAgICAgICAgIHp6X3RhYmxlID0gdi0+enpfOHg4WzJdOworICAgICAgICAgICAgICAgIGVsc2UgLy8gbGVmdAorICAgICAgICAgICAgICAgICAgICB6el90YWJsZSA9IHYtPnp6Xzh4OFszXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh2LT5mY20gIT0gSUxBQ0VfRlJBTUUpCisgICAgICAgICAgICAgICAgenpfdGFibGUgPSB2LT56el84eDhbMV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgenpfdGFibGUgPSB2LT56emlfOHg4OworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFsYXN0KSB7CisgICAgICAgICAgICB2YzFfZGVjb2RlX2FjX2NvZWZmKHYsICZsYXN0LCAmc2tpcCwgJnZhbHVlLCBjb2RpbmdzZXQpOworICAgICAgICAgICAgaSArPSBza2lwOworICAgICAgICAgICAgaWYgKGkgPiA2MykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJsb2NrW3p6X3RhYmxlW2krK11dID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBhcHBseSBBQyBwcmVkaWN0aW9uIGlmIG5lZWRlZCAqLworICAgICAgICBpZiAodXNlX3ByZWQpIHsKKyAgICAgICAgICAgIC8qIHNjYWxlIHByZWRpY3RvcnMgaWYgbmVlZGVkKi8KKyAgICAgICAgICAgIGlmIChxMiAmJiBxMSAhPSBxMikgeworICAgICAgICAgICAgICAgIHExID0gcTEgKiAyICsgKChxMSA9PSB2LT5wcSkgPyB2LT5oYWxmcHEgOiAwKSAtIDE7CisgICAgICAgICAgICAgICAgcTIgPSBxMiAqIDIgKyAoKHEyID09IHYtPnBxKSA/IHYtPmhhbGZwcSA6IDApIC0gMTsKKworICAgICAgICAgICAgICAgIGlmIChxMSA8IDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGlmIChkY19wcmVkX2RpcikgeyAvLyBsZWZ0CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1trIDw8IHYtPmxlZnRfYmxrX3NoXSArPSAoYWNfdmFsW2tdICogcTIgKiBmZl92YzFfZHFzY2FsZVtxMSAtIDFdICsgMHgyMDAwMCkgPj4gMTg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdG9wCisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1trIDw8IHYtPnRvcF9ibGtfc2hdICs9IChhY192YWxbayArIDhdICogcTIgKiBmZl92YzFfZHFzY2FsZVtxMSAtIDFdICsgMHgyMDAwMCkgPj4gMTg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZGNfcHJlZF9kaXIpIHsgLy9sZWZ0CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1trIDw8IHYtPmxlZnRfYmxrX3NoXSArPSBhY192YWxba107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy90b3AKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+dG9wX2Jsa19zaF0gKz0gYWNfdmFsW2sgKyA4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogc2F2ZSBBQyBjb2VmZnMgZm9yIGZ1cnRoZXIgcHJlZGljdGlvbiAqLworICAgICAgICBmb3IgKGsgPSAxOyBrIDwgODsgaysrKSB7CisgICAgICAgICAgICBhY192YWwyW2sgICAgXSA9IGJsb2NrW2sgPDwgdi0+bGVmdF9ibGtfc2hdOworICAgICAgICAgICAgYWNfdmFsMltrICsgOF0gPSBibG9ja1trIDw8IHYtPnRvcF9ibGtfc2hdOworICAgICAgICB9CisKKyAgICAgICAgLyogc2NhbGUgQUMgY29lZmZzICovCisgICAgICAgIGZvciAoayA9IDE7IGsgPCA2NDsgaysrKQorICAgICAgICAgICAgaWYgKGJsb2NrW2tdKSB7CisgICAgICAgICAgICAgICAgYmxvY2tba10gKj0gc2NhbGU7CisgICAgICAgICAgICAgICAgaWYgKCF2LT5wcXVhbnRpemVyKQorICAgICAgICAgICAgICAgICAgICBibG9ja1trXSArPSAoYmxvY2tba10gPCAwKSA/IC1tcXVhbnQgOiBtcXVhbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKHVzZV9wcmVkKSBpID0gNjM7CisgICAgfSBlbHNlIHsgLy8gbm8gQUMgY29lZmZzCisgICAgICAgIGludCBrOworCisgICAgICAgIG1lbXNldChhY192YWwyLCAwLCAxNiAqIDIpOworICAgICAgICBpZiAoZGNfcHJlZF9kaXIpIHsgLy8gbGVmdAorICAgICAgICAgICAgaWYgKHVzZV9wcmVkKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGFjX3ZhbDIsIGFjX3ZhbCwgOCAqIDIpOworICAgICAgICAgICAgICAgIGlmIChxMiAmJiBxMSAhPSBxMikgeworICAgICAgICAgICAgICAgICAgICBxMSA9IHExICogMiArICgocTEgPT0gdi0+cHEpID8gdi0+aGFsZnBxIDogMCkgLSAxOworICAgICAgICAgICAgICAgICAgICBxMiA9IHEyICogMiArICgocTIgPT0gdi0+cHEpID8gdi0+aGFsZnBxIDogMCkgLSAxOworICAgICAgICAgICAgICAgICAgICBpZiAocTEgPCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICBhY192YWwyW2tdID0gKGFjX3ZhbDJba10gKiBxMiAqIGZmX3ZjMV9kcXNjYWxlW3ExIC0gMV0gKyAweDIwMDAwKSA+PiAxODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vIHRvcAorICAgICAgICAgICAgaWYgKHVzZV9wcmVkKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGFjX3ZhbDIgKyA4LCBhY192YWwgKyA4LCA4ICogMik7CisgICAgICAgICAgICAgICAgaWYgKHEyICYmIHExICE9IHEyKSB7CisgICAgICAgICAgICAgICAgICAgIHExID0gcTEgKiAyICsgKChxMSA9PSB2LT5wcSkgPyB2LT5oYWxmcHEgOiAwKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIHEyID0gcTIgKiAyICsgKChxMiA9PSB2LT5wcSkgPyB2LT5oYWxmcHEgOiAwKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChxMSA8IDEpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjX3ZhbDJbayArIDhdID0gKGFjX3ZhbDJbayArIDhdICogcTIgKiBmZl92YzFfZHFzY2FsZVtxMSAtIDFdICsgMHgyMDAwMCkgPj4gMTg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogYXBwbHkgQUMgcHJlZGljdGlvbiBpZiBuZWVkZWQgKi8KKyAgICAgICAgaWYgKHVzZV9wcmVkKSB7CisgICAgICAgICAgICBpZiAoZGNfcHJlZF9kaXIpIHsgLy8gbGVmdAorICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbayA8PCB2LT5sZWZ0X2Jsa19zaF0gPSBhY192YWwyW2tdICogc2NhbGU7CisgICAgICAgICAgICAgICAgICAgIGlmICghdi0+cHF1YW50aXplciAmJiBibG9ja1trIDw8IHYtPmxlZnRfYmxrX3NoXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+bGVmdF9ibGtfc2hdICs9IChibG9ja1trIDw8IHYtPmxlZnRfYmxrX3NoXSA8IDApID8gLW1xdWFudCA6IG1xdWFudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB0b3AKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgODsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+dG9wX2Jsa19zaF0gPSBhY192YWwyW2sgKyA4XSAqIHNjYWxlOworICAgICAgICAgICAgICAgICAgICBpZiAoIXYtPnBxdWFudGl6ZXIgJiYgYmxvY2tbayA8PCB2LT50b3BfYmxrX3NoXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+dG9wX2Jsa19zaF0gKz0gKGJsb2NrW2sgPDwgdi0+dG9wX2Jsa19zaF0gPCAwKSA/IC1tcXVhbnQgOiBtcXVhbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaSA9IDYzOworICAgICAgICB9CisgICAgfQorICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gPSBpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBEZWNvZGUgaW50cmEgYmxvY2sgaW4gaW50ZXIgZnJhbWVzIC0gbW9yZSBnZW5lcmljIHZlcnNpb24gdGhhbiB2YzFfZGVjb2RlX2lfYmxvY2sKKyAqIEBwYXJhbSB2IFZDMUNvbnRleHQKKyAqIEBwYXJhbSBibG9jayBibG9jayB0byBkZWNvZGUKKyAqIEBwYXJhbVtpbl0gbiBzdWJibG9jayBpbmRleAorICogQHBhcmFtIGNvZGVkIGFyZSBBQyBjb2VmZnMgcHJlc2VudCBvciBub3QKKyAqIEBwYXJhbSBtcXVhbnQgYmxvY2sgcXVhbnRpemVyCisgKiBAcGFyYW0gY29kaW5nc2V0IHNldCBvZiBWTEMgdG8gZGVjb2RlIGRhdGEKKyAqLworc3RhdGljIGludCB2YzFfZGVjb2RlX2ludHJhX2Jsb2NrKFZDMUNvbnRleHQgKnYsIGludDE2X3QgYmxvY2tbNjRdLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kZWQsIGludCBtcXVhbnQsIGludCBjb2RpbmdzZXQpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmdi0+cy5nYjsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIGludCBkY19wcmVkX2RpciA9IDA7IC8qIERpcmVjdGlvbiBvZiB0aGUgREMgcHJlZGljdGlvbiB1c2VkICovCisgICAgaW50IGk7CisgICAgaW50MTZfdCAqZGNfdmFsID0gTlVMTDsKKyAgICBpbnQxNl90ICphY192YWwsICphY192YWwyOworICAgIGludCBkY2RpZmY7CisgICAgaW50IG1iX3BvcyA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOworICAgIGludCBhX2F2YWlsID0gdi0+YV9hdmFpbCwgY19hdmFpbCA9IHYtPmNfYXZhaWw7CisgICAgaW50IHVzZV9wcmVkID0gcy0+YWNfcHJlZDsKKyAgICBpbnQgc2NhbGU7CisgICAgaW50IHExLCBxMiA9IDA7CisKKyAgICBzLT5iZHNwLmNsZWFyX2Jsb2NrKGJsb2NrKTsKKworICAgIC8qIFhYWDogR3VhcmQgYWdhaW5zdCBkdW1iIHZhbHVlcyBvZiBtcXVhbnQgKi8KKyAgICBtcXVhbnQgPSAobXF1YW50IDwgMSkgPyAwIDogKChtcXVhbnQgPiAzMSkgPyAzMSA6IG1xdWFudCk7CisKKyAgICAvKiBTZXQgREMgc2NhbGUgLSB5IGFuZCBjIHVzZSB0aGUgc2FtZSAqLworICAgIHMtPnlfZGNfc2NhbGUgPSBzLT55X2RjX3NjYWxlX3RhYmxlW21xdWFudF07CisgICAgcy0+Y19kY19zY2FsZSA9IHMtPmNfZGNfc2NhbGVfdGFibGVbbXF1YW50XTsKKworICAgIC8qIEdldCBEQyBkaWZmZXJlbnRpYWwgKi8KKyAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgZGNkaWZmID0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9tc21wNF9kY19sdW1hX3ZsY1tzLT5kY190YWJsZV9pbmRleF0udGFibGUsIERDX1ZMQ19CSVRTLCAzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkY2RpZmYgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX21zbXA0X2RjX2Nocm9tYV92bGNbcy0+ZGNfdGFibGVfaW5kZXhdLnRhYmxlLCBEQ19WTENfQklUUywgMyk7CisgICAgfQorICAgIGlmIChkY2RpZmYgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSWxsZWdhbCBEQyBWTENcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChkY2RpZmYpIHsKKyAgICAgICAgaWYgKGRjZGlmZiA9PSAxMTkgLyogRVNDIGluZGV4IHZhbHVlICovKSB7CisgICAgICAgICAgICAvKiBUT0RPOiBPcHRpbWl6ZSAqLworICAgICAgICAgICAgaWYgKG1xdWFudCA9PSAxKSAgICAgIGRjZGlmZiA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICBlbHNlIGlmIChtcXVhbnQgPT0gMikgZGNkaWZmID0gZ2V0X2JpdHMoZ2IsIDkpOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgIGRjZGlmZiA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtcXVhbnQgPT0gMSkKKyAgICAgICAgICAgICAgICBkY2RpZmYgPSAoZGNkaWZmIDw8IDIpICsgZ2V0X2JpdHMoZ2IsIDIpIC0gMzsKKyAgICAgICAgICAgIGVsc2UgaWYgKG1xdWFudCA9PSAyKQorICAgICAgICAgICAgICAgIGRjZGlmZiA9IChkY2RpZmYgPDwgMSkgKyBnZXRfYml0czEoZ2IpICAgLSAxOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKQorICAgICAgICAgICAgZGNkaWZmID0gLWRjZGlmZjsKKyAgICB9CisKKyAgICAvKiBQcmVkaWN0aW9uICovCisgICAgZGNkaWZmICs9IGZmX3ZjMV9wcmVkX2RjKCZ2LT5zLCB2LT5vdmVybGFwLCBtcXVhbnQsIG4sIGFfYXZhaWwsIGNfYXZhaWwsICZkY192YWwsICZkY19wcmVkX2Rpcik7CisgICAgKmRjX3ZhbCA9IGRjZGlmZjsKKworICAgIC8qIFN0b3JlIHRoZSBxdWFudGl6ZWQgREMgY29lZmYsIHVzZWQgZm9yIHByZWRpY3Rpb24gKi8KKworICAgIGlmIChuIDwgNCkgeworICAgICAgICBibG9ja1swXSA9IGRjZGlmZiAqIHMtPnlfZGNfc2NhbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmxvY2tbMF0gPSBkY2RpZmYgKiBzLT5jX2RjX3NjYWxlOworICAgIH0KKworICAgIC8vQUMgRGVjb2RpbmcKKyAgICBpID0gMTsKKworICAgIC8qIGNoZWNrIGlmIEFDIGlzIG5lZWRlZCBhdCBhbGwgYW5kIGFkanVzdCBkaXJlY3Rpb24gaWYgbmVlZGVkICovCisgICAgaWYgKCFhX2F2YWlsKSBkY19wcmVkX2RpciA9IDE7CisgICAgaWYgKCFjX2F2YWlsKSBkY19wcmVkX2RpciA9IDA7CisgICAgaWYgKCFhX2F2YWlsICYmICFjX2F2YWlsKSB1c2VfcHJlZCA9IDA7CisgICAgYWNfdmFsID0gcy0+YWNfdmFsWzBdWzBdICsgcy0+YmxvY2tfaW5kZXhbbl0gKiAxNjsKKyAgICBhY192YWwyID0gYWNfdmFsOworCisgICAgc2NhbGUgPSBtcXVhbnQgKiAyICsgdi0+aGFsZnBxOworCisgICAgaWYgKGRjX3ByZWRfZGlyKSAvL2xlZnQKKyAgICAgICAgYWNfdmFsIC09IDE2OworICAgIGVsc2UgLy90b3AKKyAgICAgICAgYWNfdmFsIC09IDE2ICogcy0+YmxvY2tfd3JhcFtuXTsKKworICAgIHExID0gcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVttYl9wb3NdOworICAgIGlmIChkY19wcmVkX2RpciAmJiBjX2F2YWlsICYmIG1iX3BvcykKKyAgICAgICAgcTIgPSBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3BvcyAtIDFdOworICAgIGlmICghZGNfcHJlZF9kaXIgJiYgYV9hdmFpbCAmJiBtYl9wb3MgPj0gcy0+bWJfc3RyaWRlKQorICAgICAgICBxMiA9IHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfcG9zIC0gcy0+bWJfc3RyaWRlXTsKKyAgICBpZiAoIGRjX3ByZWRfZGlyICYmIG4gPT0gMSkKKyAgICAgICAgcTIgPSBxMTsKKyAgICBpZiAoIWRjX3ByZWRfZGlyICYmIG4gPT0gMikKKyAgICAgICAgcTIgPSBxMTsKKyAgICBpZiAobiA9PSAzKSBxMiA9IHExOworCisgICAgaWYgKGNvZGVkKSB7CisgICAgICAgIGludCBsYXN0ID0gMCwgc2tpcCwgdmFsdWU7CisgICAgICAgIGludCBrOworCisgICAgICAgIHdoaWxlICghbGFzdCkgeworICAgICAgICAgICAgdmMxX2RlY29kZV9hY19jb2VmZih2LCAmbGFzdCwgJnNraXAsICZ2YWx1ZSwgY29kaW5nc2V0KTsKKyAgICAgICAgICAgIGkgKz0gc2tpcDsKKyAgICAgICAgICAgIGlmIChpID4gNjMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAodi0+ZmNtID09IFBST0dSRVNTSVZFKQorICAgICAgICAgICAgICAgIGJsb2NrW3YtPnp6Xzh4OFswXVtpKytdXSA9IHZhbHVlOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHVzZV9wcmVkICYmICh2LT5mY20gPT0gSUxBQ0VfRlJBTUUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGNfcHJlZF9kaXIpIC8vIHRvcAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbdi0+enpfOHg4WzJdW2krK11dID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gbGVmdAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbdi0+enpfOHg4WzNdW2krK11dID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbdi0+enppXzh4OFtpKytdXSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGFwcGx5IEFDIHByZWRpY3Rpb24gaWYgbmVlZGVkICovCisgICAgICAgIGlmICh1c2VfcHJlZCkgeworICAgICAgICAgICAgLyogc2NhbGUgcHJlZGljdG9ycyBpZiBuZWVkZWQqLworICAgICAgICAgICAgaWYgKHEyICYmIHExICE9IHEyKSB7CisgICAgICAgICAgICAgICAgcTEgPSBxMSAqIDIgKyAoKHExID09IHYtPnBxKSA/IHYtPmhhbGZwcSA6IDApIC0gMTsKKyAgICAgICAgICAgICAgICBxMiA9IHEyICogMiArICgocTIgPT0gdi0+cHEpID8gdi0+aGFsZnBxIDogMCkgLSAxOworCisgICAgICAgICAgICAgICAgaWYgKHExIDwgMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgaWYgKGRjX3ByZWRfZGlyKSB7IC8vIGxlZnQKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+bGVmdF9ibGtfc2hdICs9IChhY192YWxba10gKiBxMiAqIGZmX3ZjMV9kcXNjYWxlW3ExIC0gMV0gKyAweDIwMDAwKSA+PiAxODsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvL3RvcAorICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgODsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbayA8PCB2LT50b3BfYmxrX3NoXSArPSAoYWNfdmFsW2sgKyA4XSAqIHEyICogZmZfdmMxX2Rxc2NhbGVbcTEgLSAxXSArIDB4MjAwMDApID4+IDE4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGRjX3ByZWRfZGlyKSB7IC8vIGxlZnQKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+bGVmdF9ibGtfc2hdICs9IGFjX3ZhbFtrXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0b3AKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+dG9wX2Jsa19zaF0gKz0gYWNfdmFsW2sgKyA4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogc2F2ZSBBQyBjb2VmZnMgZm9yIGZ1cnRoZXIgcHJlZGljdGlvbiAqLworICAgICAgICBmb3IgKGsgPSAxOyBrIDwgODsgaysrKSB7CisgICAgICAgICAgICBhY192YWwyW2sgICAgXSA9IGJsb2NrW2sgPDwgdi0+bGVmdF9ibGtfc2hdOworICAgICAgICAgICAgYWNfdmFsMltrICsgOF0gPSBibG9ja1trIDw8IHYtPnRvcF9ibGtfc2hdOworICAgICAgICB9CisKKyAgICAgICAgLyogc2NhbGUgQUMgY29lZmZzICovCisgICAgICAgIGZvciAoayA9IDE7IGsgPCA2NDsgaysrKQorICAgICAgICAgICAgaWYgKGJsb2NrW2tdKSB7CisgICAgICAgICAgICAgICAgYmxvY2tba10gKj0gc2NhbGU7CisgICAgICAgICAgICAgICAgaWYgKCF2LT5wcXVhbnRpemVyKQorICAgICAgICAgICAgICAgICAgICBibG9ja1trXSArPSAoYmxvY2tba10gPCAwKSA/IC1tcXVhbnQgOiBtcXVhbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKHVzZV9wcmVkKSBpID0gNjM7CisgICAgfSBlbHNlIHsgLy8gbm8gQUMgY29lZmZzCisgICAgICAgIGludCBrOworCisgICAgICAgIG1lbXNldChhY192YWwyLCAwLCAxNiAqIDIpOworICAgICAgICBpZiAoZGNfcHJlZF9kaXIpIHsgLy8gbGVmdAorICAgICAgICAgICAgaWYgKHVzZV9wcmVkKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGFjX3ZhbDIsIGFjX3ZhbCwgOCAqIDIpOworICAgICAgICAgICAgICAgIGlmIChxMiAmJiBxMSAhPSBxMikgeworICAgICAgICAgICAgICAgICAgICBxMSA9IHExICogMiArICgocTEgPT0gdi0+cHEpID8gdi0+aGFsZnBxIDogMCkgLSAxOworICAgICAgICAgICAgICAgICAgICBxMiA9IHEyICogMiArICgocTIgPT0gdi0+cHEpID8gdi0+aGFsZnBxIDogMCkgLSAxOworICAgICAgICAgICAgICAgICAgICBpZiAocTEgPCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICBhY192YWwyW2tdID0gKGFjX3ZhbDJba10gKiBxMiAqIGZmX3ZjMV9kcXNjYWxlW3ExIC0gMV0gKyAweDIwMDAwKSA+PiAxODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vIHRvcAorICAgICAgICAgICAgaWYgKHVzZV9wcmVkKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGFjX3ZhbDIgKyA4LCBhY192YWwgKyA4LCA4ICogMik7CisgICAgICAgICAgICAgICAgaWYgKHEyICYmIHExICE9IHEyKSB7CisgICAgICAgICAgICAgICAgICAgIHExID0gcTEgKiAyICsgKChxMSA9PSB2LT5wcSkgPyB2LT5oYWxmcHEgOiAwKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIHEyID0gcTIgKiAyICsgKChxMiA9PSB2LT5wcSkgPyB2LT5oYWxmcHEgOiAwKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChxMSA8IDEpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjX3ZhbDJbayArIDhdID0gKGFjX3ZhbDJbayArIDhdICogcTIgKiBmZl92YzFfZHFzY2FsZVtxMSAtIDFdICsgMHgyMDAwMCkgPj4gMTg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogYXBwbHkgQUMgcHJlZGljdGlvbiBpZiBuZWVkZWQgKi8KKyAgICAgICAgaWYgKHVzZV9wcmVkKSB7CisgICAgICAgICAgICBpZiAoZGNfcHJlZF9kaXIpIHsgLy8gbGVmdAorICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbayA8PCB2LT5sZWZ0X2Jsa19zaF0gPSBhY192YWwyW2tdICogc2NhbGU7CisgICAgICAgICAgICAgICAgICAgIGlmICghdi0+cHF1YW50aXplciAmJiBibG9ja1trIDw8IHYtPmxlZnRfYmxrX3NoXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+bGVmdF9ibGtfc2hdICs9IChibG9ja1trIDw8IHYtPmxlZnRfYmxrX3NoXSA8IDApID8gLW1xdWFudCA6IG1xdWFudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB0b3AKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgODsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+dG9wX2Jsa19zaF0gPSBhY192YWwyW2sgKyA4XSAqIHNjYWxlOworICAgICAgICAgICAgICAgICAgICBpZiAoIXYtPnBxdWFudGl6ZXIgJiYgYmxvY2tbayA8PCB2LT50b3BfYmxrX3NoXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW2sgPDwgdi0+dG9wX2Jsa19zaF0gKz0gKGJsb2NrW2sgPDwgdi0+dG9wX2Jsa19zaF0gPCAwKSA/IC1tcXVhbnQgOiBtcXVhbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaSA9IDYzOworICAgICAgICB9CisgICAgfQorICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gPSBpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBEZWNvZGUgUCBibG9jaworICovCitzdGF0aWMgaW50IHZjMV9kZWNvZGVfcF9ibG9jayhWQzFDb250ZXh0ICp2LCBpbnQxNl90IGJsb2NrWzY0XSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXF1YW50LCBpbnQgdHRtYiwgaW50IGZpcnN0X2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUsIGludCBza2lwX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0dG1iX291dCkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOworICAgIGludCBpLCBqOworICAgIGludCBzdWJibGtwYXQgPSAwOworICAgIGludCBzY2FsZSwgb2ZmLCBpZHgsIGxhc3QsIHNraXAsIHZhbHVlOworICAgIGludCB0dGJsayA9IHR0bWIgJiA3OworICAgIGludCBwYXQgPSAwOworCisgICAgcy0+YmRzcC5jbGVhcl9ibG9jayhibG9jayk7CisKKyAgICBpZiAodHRtYiA9PSAtMSkgeworICAgICAgICB0dGJsayA9IGZmX3ZjMV90dGJsa190b190dFt2LT50dF9pbmRleF1bZ2V0X3ZsYzIoZ2IsIGZmX3ZjMV90dGJsa192bGNbdi0+dHRfaW5kZXhdLnRhYmxlLCBWQzFfVFRCTEtfVkxDX0JJVFMsIDEpXTsKKyAgICB9CisgICAgaWYgKHR0YmxrID09IFRUXzRYNCkgeworICAgICAgICBzdWJibGtwYXQgPSB+KGdldF92bGMyKGdiLCBmZl92YzFfc3ViYmxrcGF0X3ZsY1t2LT50dF9pbmRleF0udGFibGUsIFZDMV9TVUJCTEtQQVRfVkxDX0JJVFMsIDEpICsgMSk7CisgICAgfQorICAgIGlmICgodHRibGsgIT0gVFRfOFg4ICYmIHR0YmxrICE9IFRUXzRYNCkKKyAgICAgICAgJiYgKCh2LT50dG1iZiB8fCAodHRtYiAhPSAtMSAmJiAodHRtYiAmIDgpICYmICFmaXJzdF9ibG9jaykpCisgICAgICAgICAgICB8fCAoIXYtPnJlc19ydG1fZmxhZyAmJiAhZmlyc3RfYmxvY2spKSkgeworICAgICAgICBzdWJibGtwYXQgPSBkZWNvZGUwMTIoZ2IpOworICAgICAgICBpZiAoc3ViYmxrcGF0KQorICAgICAgICAgICAgc3ViYmxrcGF0IF49IDM7IC8vIHN3YXAgZGVjb2RlZCBwYXR0ZXJuIGJpdHMKKyAgICAgICAgaWYgKHR0YmxrID09IFRUXzhYNF9UT1AgfHwgdHRibGsgPT0gVFRfOFg0X0JPVFRPTSkKKyAgICAgICAgICAgIHR0YmxrID0gVFRfOFg0OworICAgICAgICBpZiAodHRibGsgPT0gVFRfNFg4X1JJR0hUIHx8IHR0YmxrID09IFRUXzRYOF9MRUZUKQorICAgICAgICAgICAgdHRibGsgPSBUVF80WDg7CisgICAgfQorICAgIHNjYWxlID0gMiAqIG1xdWFudCArICgodi0+cHEgPT0gbXF1YW50KSA/IHYtPmhhbGZwcSA6IDApOworCisgICAgLy8gY29udmVydCB0cmFuc2Zvcm1zIGxpa2UgOFg0X1RPUCB0byBnZW5lcmljIFRUIGFuZCBTVUJCTEtQQVQKKyAgICBpZiAodHRibGsgPT0gVFRfOFg0X1RPUCB8fCB0dGJsayA9PSBUVF84WDRfQk9UVE9NKSB7CisgICAgICAgIHN1YmJsa3BhdCA9IDIgLSAodHRibGsgPT0gVFRfOFg0X1RPUCk7CisgICAgICAgIHR0YmxrICAgICA9IFRUXzhYNDsKKyAgICB9CisgICAgaWYgKHR0YmxrID09IFRUXzRYOF9SSUdIVCB8fCB0dGJsayA9PSBUVF80WDhfTEVGVCkgeworICAgICAgICBzdWJibGtwYXQgPSAyIC0gKHR0YmxrID09IFRUXzRYOF9MRUZUKTsKKyAgICAgICAgdHRibGsgICAgID0gVFRfNFg4OworICAgIH0KKyAgICBzd2l0Y2ggKHR0YmxrKSB7CisgICAgY2FzZSBUVF84WDg6CisgICAgICAgIHBhdCAgPSAweEY7CisgICAgICAgIGkgICAgPSAwOworICAgICAgICBsYXN0ID0gMDsKKyAgICAgICAgd2hpbGUgKCFsYXN0KSB7CisgICAgICAgICAgICB2YzFfZGVjb2RlX2FjX2NvZWZmKHYsICZsYXN0LCAmc2tpcCwgJnZhbHVlLCB2LT5jb2RpbmdzZXQyKTsKKyAgICAgICAgICAgIGkgKz0gc2tpcDsKKyAgICAgICAgICAgIGlmIChpID4gNjMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoIXYtPmZjbSkKKyAgICAgICAgICAgICAgICBpZHggPSB2LT56el84eDhbMF1baSsrXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZHggPSB2LT56emlfOHg4W2krK107CisgICAgICAgICAgICBibG9ja1tpZHhdID0gdmFsdWUgKiBzY2FsZTsKKyAgICAgICAgICAgIGlmICghdi0+cHF1YW50aXplcikKKyAgICAgICAgICAgICAgICBibG9ja1tpZHhdICs9IChibG9ja1tpZHhdIDwgMCkgPyAtbXF1YW50IDogbXF1YW50OworICAgICAgICB9CisgICAgICAgIGlmICghc2tpcF9ibG9jaykgeworICAgICAgICAgICAgaWYgKGkgPT0gMSkKKyAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX2ludl90cmFuc184eDhfZGMoZHN0LCBsaW5lc2l6ZSwgYmxvY2spOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfOHg4KGJsb2NrKTsKKyAgICAgICAgICAgICAgICBzLT5pZHNwLmFkZF9waXhlbHNfY2xhbXBlZChibG9jaywgZHN0LCBsaW5lc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUVF80WDQ6CisgICAgICAgIHBhdCA9IH5zdWJibGtwYXQgJiAweEY7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgIGxhc3QgPSBzdWJibGtwYXQgJiAoMSA8PCAoMyAtIGopKTsKKyAgICAgICAgICAgIGkgICAgPSAwOworICAgICAgICAgICAgb2ZmICA9IChqICYgMSkgKiA0ICsgKGogJiAyKSAqIDE2OworICAgICAgICAgICAgd2hpbGUgKCFsYXN0KSB7CisgICAgICAgICAgICAgICAgdmMxX2RlY29kZV9hY19jb2VmZih2LCAmbGFzdCwgJnNraXAsICZ2YWx1ZSwgdi0+Y29kaW5nc2V0Mik7CisgICAgICAgICAgICAgICAgaSArPSBza2lwOworICAgICAgICAgICAgICAgIGlmIChpID4gMTUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICghdi0+ZmNtKQorICAgICAgICAgICAgICAgICAgICBpZHggPSBmZl92YzFfc2ltcGxlX3Byb2dyZXNzaXZlXzR4NF96eltpKytdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gZmZfdmMxX2Fkdl9pbnRlcmxhY2VkXzR4NF96eltpKytdOworICAgICAgICAgICAgICAgIGJsb2NrW2lkeCArIG9mZl0gPSB2YWx1ZSAqIHNjYWxlOworICAgICAgICAgICAgICAgIGlmICghdi0+cHF1YW50aXplcikKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbaWR4ICsgb2ZmXSArPSAoYmxvY2tbaWR4ICsgb2ZmXSA8IDApID8gLW1xdWFudCA6IG1xdWFudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKHN1YmJsa3BhdCAmICgxIDw8ICgzIC0gaikpKSAmJiAhc2tpcF9ibG9jaykgeworICAgICAgICAgICAgICAgIGlmIChpID09IDEpCisgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzR4NF9kYyhkc3QgKyAoaiAmIDEpICogNCArIChqICYgMikgKiAyICogbGluZXNpemUsIGxpbmVzaXplLCBibG9jayArIG9mZik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX2ludl90cmFuc180eDQoZHN0ICsgKGogJiAxKSAqIDQgKyAoaiAmIDIpICogIDIgKiBsaW5lc2l6ZSwgbGluZXNpemUsIGJsb2NrICsgb2ZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRUXzhYNDoKKyAgICAgICAgcGF0ID0gfigoc3ViYmxrcGF0ICYgMikgKiA2ICsgKHN1YmJsa3BhdCAmIDEpICogMykgJiAweEY7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgIGxhc3QgPSBzdWJibGtwYXQgJiAoMSA8PCAoMSAtIGopKTsKKyAgICAgICAgICAgIGkgICAgPSAwOworICAgICAgICAgICAgb2ZmICA9IGogKiAzMjsKKyAgICAgICAgICAgIHdoaWxlICghbGFzdCkgeworICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfYWNfY29lZmYodiwgJmxhc3QsICZza2lwLCAmdmFsdWUsIHYtPmNvZGluZ3NldDIpOworICAgICAgICAgICAgICAgIGkgKz0gc2tpcDsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDMxKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoIXYtPmZjbSkKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gdi0+enpfOHg0W2krK10gKyBvZmY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZHggPSBmZl92YzFfYWR2X2ludGVybGFjZWRfOHg0X3p6W2krK10gKyBvZmY7CisgICAgICAgICAgICAgICAgYmxvY2tbaWR4XSA9IHZhbHVlICogc2NhbGU7CisgICAgICAgICAgICAgICAgaWYgKCF2LT5wcXVhbnRpemVyKQorICAgICAgICAgICAgICAgICAgICBibG9ja1tpZHhdICs9IChibG9ja1tpZHhdIDwgMCkgPyAtbXF1YW50IDogbXF1YW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEoc3ViYmxrcGF0ICYgKDEgPDwgKDEgLSBqKSkpICYmICFza2lwX2Jsb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfOHg0X2RjKGRzdCArIGogKiA0ICogbGluZXNpemUsIGxpbmVzaXplLCBibG9jayArIG9mZik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX2ludl90cmFuc184eDQoZHN0ICsgaiAqIDQgKiBsaW5lc2l6ZSwgbGluZXNpemUsIGJsb2NrICsgb2ZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRUXzRYODoKKyAgICAgICAgcGF0ID0gfihzdWJibGtwYXQgKiA1KSAmIDB4RjsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgbGFzdCA9IHN1YmJsa3BhdCAmICgxIDw8ICgxIC0gaikpOworICAgICAgICAgICAgaSAgICA9IDA7CisgICAgICAgICAgICBvZmYgID0gaiAqIDQ7CisgICAgICAgICAgICB3aGlsZSAoIWxhc3QpIHsKKyAgICAgICAgICAgICAgICB2YzFfZGVjb2RlX2FjX2NvZWZmKHYsICZsYXN0LCAmc2tpcCwgJnZhbHVlLCB2LT5jb2RpbmdzZXQyKTsKKyAgICAgICAgICAgICAgICBpICs9IHNraXA7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAzMSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKCF2LT5mY20pCisgICAgICAgICAgICAgICAgICAgIGlkeCA9IHYtPnp6XzR4OFtpKytdICsgb2ZmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gZmZfdmMxX2Fkdl9pbnRlcmxhY2VkXzR4OF96eltpKytdICsgb2ZmOworICAgICAgICAgICAgICAgIGJsb2NrW2lkeF0gPSB2YWx1ZSAqIHNjYWxlOworICAgICAgICAgICAgICAgIGlmICghdi0+cHF1YW50aXplcikKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbaWR4XSArPSAoYmxvY2tbaWR4XSA8IDApID8gLW1xdWFudCA6IG1xdWFudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKHN1YmJsa3BhdCAmICgxIDw8ICgxIC0gaikpKSAmJiAhc2tpcF9ibG9jaykgeworICAgICAgICAgICAgICAgIGlmIChpID09IDEpCisgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzR4OF9kYyhkc3QgKyBqICogNCwgbGluZXNpemUsIGJsb2NrICsgb2ZmKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzR4OChkc3QgKyBqKjQsIGxpbmVzaXplLCBibG9jayArIG9mZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh0dG1iX291dCkKKyAgICAgICAgKnR0bWJfb3V0IHw9IHR0YmxrIDw8IChuICogNCk7CisgICAgcmV0dXJuIHBhdDsKK30KKworLyoqIEB9ICovIC8vIE1hY3JvYmxvY2sgZ3JvdXAKKworc3RhdGljIGNvbnN0IGludCBzaXplX3RhYmxlICBbNl0gPSB7IDAsIDIsIDMsIDQsICA1LCAgOCB9Oworc3RhdGljIGNvbnN0IGludCBvZmZzZXRfdGFibGVbNl0gPSB7IDAsIDEsIDMsIDcsIDE1LCAzMSB9OworCisvKiogRGVjb2RlIG9uZSBQLWZyYW1lIE1CCisgKi8KK3N0YXRpYyBpbnQgdmMxX2RlY29kZV9wX21iKFZDMUNvbnRleHQgKnYpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdi0+czsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgbWJfcG9zID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisgICAgaW50IGNicDsgLyogY2JwIGRlY29kaW5nIHN0dWZmICovCisgICAgaW50IG1xZGlmZiwgbXF1YW50OyAvKiBNQiBxdWFudGl6YXRpb24gKi8KKyAgICBpbnQgdHRtYiA9IHYtPnR0ZnJtOyAvKiBNQiBUcmFuc2Zvcm0gdHlwZSAqLworCisgICAgaW50IG1iX2hhc19jb2VmZnMgPSAxOyAvKiBsYXN0X2ZsYWcgKi8KKyAgICBpbnQgZG12X3gsIGRtdl95OyAvKiBEaWZmZXJlbnRpYWwgTVYgY29tcG9uZW50cyAqLworICAgIGludCBpbmRleCwgaW5kZXgxOyAvKiBMVVQgaW5kZXhlcyAqLworICAgIGludCB2YWwsIHNpZ247IC8qIHRlbXAgdmFsdWVzICovCisgICAgaW50IGZpcnN0X2Jsb2NrID0gMTsKKyAgICBpbnQgZHN0X2lkeCwgb2ZmOworICAgIGludCBza2lwcGVkLCBmb3VybXY7CisgICAgaW50IGJsb2NrX2NicCA9IDAsIHBhdCwgYmxvY2tfdHQgPSAwLCBibG9ja19pbnRyYSA9IDA7CisKKyAgICBtcXVhbnQgPSB2LT5wcTsgLyogbG9zc3kgaW5pdGlhbGl6YXRpb24gKi8KKworICAgIGlmICh2LT5tdl90eXBlX2lzX3JhdykKKyAgICAgICAgZm91cm12ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBlbHNlCisgICAgICAgIGZvdXJtdiA9IHYtPm12X3R5cGVfbWJfcGxhbmVbbWJfcG9zXTsKKyAgICBpZiAodi0+c2tpcF9pc19yYXcpCisgICAgICAgIHNraXBwZWQgPSBnZXRfYml0czEoZ2IpOworICAgIGVsc2UKKyAgICAgICAgc2tpcHBlZCA9IHYtPnMubWJza2lwX3RhYmxlW21iX3Bvc107CisKKyAgICBpZiAoIWZvdXJtdikgeyAvKiAxTVYgbW9kZSAqLworICAgICAgICBpZiAoIXNraXBwZWQpIHsKKyAgICAgICAgICAgIEdFVF9NVkRBVEEoZG12X3gsIGRtdl95KTsKKworICAgICAgICAgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMF1dWzBdID0gMDsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFswXV1bMV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbbWJfcG9zXSA9IHMtPm1iX2ludHJhID8gTUJfVFlQRV9JTlRSQSA6IE1CX1RZUEVfMTZ4MTY7CisgICAgICAgICAgICBmZl92YzFfcHJlZF9tdih2LCAwLCBkbXZfeCwgZG12X3ksIDEsIHYtPnJhbmdlX3gsIHYtPnJhbmdlX3ksIHYtPm1iX3R5cGVbMF0sIDAsIDApOworCisgICAgICAgICAgICAvKiBGSVhNRSBTZXQgREMgdmFsIGZvciBpbnRlciBibG9jayA/ICovCisgICAgICAgICAgICBpZiAocy0+bWJfaW50cmEgJiYgIW1iX2hhc19jb2VmZnMpIHsKKyAgICAgICAgICAgICAgICBHRVRfTVFVQU5UKCk7CisgICAgICAgICAgICAgICAgcy0+YWNfcHJlZCA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgY2JwICAgICAgICA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1iX2hhc19jb2VmZnMpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+bWJfaW50cmEpCisgICAgICAgICAgICAgICAgICAgIHMtPmFjX3ByZWQgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIGNicCA9IGdldF92bGMyKCZ2LT5zLmdiLCB2LT5jYnBjeV92bGMtPnRhYmxlLCBWQzFfQ0JQQ1lfUF9WTENfQklUUywgMik7CisgICAgICAgICAgICAgICAgR0VUX01RVUFOVCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtcXVhbnQgPSB2LT5wcTsKKyAgICAgICAgICAgICAgICBjYnAgICAgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVttYl9wb3NdID0gbXF1YW50OworCisgICAgICAgICAgICBpZiAoIXYtPnR0bWJmICYmICFzLT5tYl9pbnRyYSAmJiBtYl9oYXNfY29lZmZzKQorICAgICAgICAgICAgICAgIHR0bWIgPSBnZXRfdmxjMihnYiwgZmZfdmMxX3R0bWJfdmxjW3YtPnR0X2luZGV4XS50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkMxX1RUTUJfVkxDX0JJVFMsIDIpOworICAgICAgICAgICAgaWYgKCFzLT5tYl9pbnRyYSkgZmZfdmMxX21jXzFtdih2LCAwKTsKKyAgICAgICAgICAgIGRzdF9pZHggPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgICAgIHMtPmRjX3ZhbFswXVtzLT5ibG9ja19pbmRleFtpXV0gPSAwOworICAgICAgICAgICAgICAgIGRzdF9pZHggKz0gaSA+PiAyOworICAgICAgICAgICAgICAgIHZhbCA9ICgoY2JwID4+ICg1IC0gaSkpICYgMSk7CisgICAgICAgICAgICAgICAgb2ZmID0gKGkgJiA0KSA/IDAgOiAoKGkgJiAxKSAqIDggKyAoaSAmIDIpICogNCAqIHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICB2LT5tYl90eXBlWzBdW3MtPmJsb2NrX2luZGV4W2ldXSA9IHMtPm1iX2ludHJhOworICAgICAgICAgICAgICAgIGlmIChzLT5tYl9pbnRyYSkgeworICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBwcmVkaWN0aW9uIGJsb2NrcyBBIGFuZCBDIGFyZSBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgdi0+YV9hdmFpbCA9IHYtPmNfYXZhaWwgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAyIHx8IGkgPT0gMyB8fCAhcy0+Zmlyc3Rfc2xpY2VfbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPmFfYXZhaWwgPSB2LT5tYl90eXBlWzBdW3MtPmJsb2NrX2luZGV4W2ldIC0gcy0+YmxvY2tfd3JhcFtpXV07CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEgfHwgaSA9PSAzIHx8IHMtPm1iX3gpCisgICAgICAgICAgICAgICAgICAgICAgICB2LT5jX2F2YWlsID0gdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtpXSAtIDFdOworCisgICAgICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfaW50cmFfYmxvY2sodiwgcy0+YmxvY2tbaV0sIGksIHZhbCwgbXF1YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgPyB2LT5jb2RpbmdzZXQyIDogdi0+Y29kaW5nc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpPjMpICYmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfOHg4KHMtPmJsb2NrW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYtPnJhbmdlcmVkZnJtKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tbaV1bal0gPDw9IDE7CisgICAgICAgICAgICAgICAgICAgIHMtPmlkc3AucHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZChzLT5ibG9ja1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlc3RbZHN0X2lkeF0gKyBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYgNCA/IHMtPnV2bGluZXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcy0+bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAodi0+cHEgPj0gOSAmJiB2LT5vdmVybGFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi0+Y19hdmFpbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX2hfb3ZlcmxhcChzLT5kZXN0W2RzdF9pZHhdICsgb2ZmLCBpICYgNCA/IHMtPnV2bGluZXNpemUgOiBzLT5saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi0+YV9hdmFpbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3Zfb3ZlcmxhcChzLT5kZXN0W2RzdF9pZHhdICsgb2ZmLCBpICYgNCA/IHMtPnV2bGluZXNpemUgOiBzLT5saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfY2JwICAgfD0gMHhGIDw8IChpIDw8IDIpOworICAgICAgICAgICAgICAgICAgICBibG9ja19pbnRyYSB8PSAxIDw8IGk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0ID0gdmMxX2RlY29kZV9wX2Jsb2NrKHYsIHMtPmJsb2NrW2ldLCBpLCBtcXVhbnQsIHR0bWIsIGZpcnN0X2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdFtkc3RfaWR4XSArIG9mZiwgKGkgJiA0KSA/IHMtPnV2bGluZXNpemUgOiBzLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgJiYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSwgJmJsb2NrX3R0KTsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfY2JwIHw9IHBhdCA8PCAoaSA8PCAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF2LT50dG1iZiAmJiB0dG1iIDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0bWIgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RfYmxvY2sgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gc2tpcHBlZAorICAgICAgICAgICAgcy0+bWJfaW50cmEgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgICAgIHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV1dID0gMDsKKyAgICAgICAgICAgICAgICBzLT5kY192YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dICA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVttYl9wb3NdICAgICAgPSBNQl9UWVBFX1NLSVA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3Bvc10gPSAwOworICAgICAgICAgICAgZmZfdmMxX3ByZWRfbXYodiwgMCwgMCwgMCwgMSwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgMCwgMCk7CisgICAgICAgICAgICBmZl92YzFfbWNfMW12KHYsIDApOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gNE1WIG1vZGUKKyAgICAgICAgaWYgKCFza2lwcGVkIC8qIHVuc2tpcHBlZCBNQiAqLykgeworICAgICAgICAgICAgaW50IGludHJhX2NvdW50ID0gMCwgY29kZWRfaW50ZXIgPSAwOworICAgICAgICAgICAgaW50IGlzX2ludHJhWzZdLCBpc19jb2RlZFs2XTsKKyAgICAgICAgICAgIC8qIEdldCBDQlBDWSAqLworICAgICAgICAgICAgY2JwID0gZ2V0X3ZsYzIoJnYtPnMuZ2IsIHYtPmNicGN5X3ZsYy0+dGFibGUsIFZDMV9DQlBDWV9QX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YWwgPSAoKGNicCA+PiAoNSAtIGkpKSAmIDEpOworICAgICAgICAgICAgICAgIHMtPmRjX3ZhbFswXVtzLT5ibG9ja19pbmRleFtpXV0gPSAwOworICAgICAgICAgICAgICAgIHMtPm1iX2ludHJhICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgICAgICAgICAgICAgIGlmIChpIDwgNCkgeworICAgICAgICAgICAgICAgICAgICBkbXZfeCA9IGRtdl95ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+bWJfaW50cmEgICA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1iX2hhc19jb2VmZnMgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTVZEQVRBKGRtdl94LCBkbXZfeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmZfdmMxX3ByZWRfbXYodiwgaSwgZG12X3gsIGRtdl95LCAwLCB2LT5yYW5nZV94LCB2LT5yYW5nZV95LCB2LT5tYl90eXBlWzBdLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzLT5tYl9pbnRyYSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9tY180bXZfbHVtYSh2LCBpLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50cmFfY291bnQgKz0gcy0+bWJfaW50cmE7CisgICAgICAgICAgICAgICAgICAgIGlzX2ludHJhW2ldICA9IHMtPm1iX2ludHJhOworICAgICAgICAgICAgICAgICAgICBpc19jb2RlZFtpXSAgPSBtYl9oYXNfY29lZmZzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaSAmIDQpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNfaW50cmFbaV0gPSAoaW50cmFfY291bnQgPj0gMyk7CisgICAgICAgICAgICAgICAgICAgIGlzX2NvZGVkW2ldID0gdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaSA9PSA0KQorICAgICAgICAgICAgICAgICAgICBmZl92YzFfbWNfNG12X2Nocm9tYSh2LCAwKTsKKyAgICAgICAgICAgICAgICB2LT5tYl90eXBlWzBdW3MtPmJsb2NrX2luZGV4W2ldXSA9IGlzX2ludHJhW2ldOworICAgICAgICAgICAgICAgIGlmICghY29kZWRfaW50ZXIpCisgICAgICAgICAgICAgICAgICAgIGNvZGVkX2ludGVyID0gIWlzX2ludHJhW2ldICYgaXNfY29kZWRbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY29kZWQgYmxvY2tzIHRoZW4gZG9uJ3QgZG8gYW55dGhpbmcgbW9yZQorICAgICAgICAgICAgZHN0X2lkeCA9IDA7CisgICAgICAgICAgICBpZiAoIWludHJhX2NvdW50ICYmICFjb2RlZF9pbnRlcikKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIEdFVF9NUVVBTlQoKTsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfcG9zXSA9IG1xdWFudDsKKyAgICAgICAgICAgIC8qIHRlc3QgaWYgYmxvY2sgaXMgaW50cmEgYW5kIGhhcyBwcmVkICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGludHJhcHJlZCA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2ludHJhW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCghcy0+Zmlyc3Rfc2xpY2VfbGluZSB8fCAoaSA9PSAyIHx8IGkgPT0gMykpICYmIHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV0gLSBzLT5ibG9ja193cmFwW2ldXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKHMtPm1iX3ggfHwgKGkgPT0gMSB8fCBpID09IDMpKSAmJiB2LT5tYl90eXBlWzBdW3MtPmJsb2NrX2luZGV4W2ldIC0gMV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmFwcmVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbnRyYXByZWQpCisgICAgICAgICAgICAgICAgICAgIHMtPmFjX3ByZWQgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcy0+YWNfcHJlZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXYtPnR0bWJmICYmIGNvZGVkX2ludGVyKQorICAgICAgICAgICAgICAgIHR0bWIgPSBnZXRfdmxjMihnYiwgZmZfdmMxX3R0bWJfdmxjW3YtPnR0X2luZGV4XS50YWJsZSwgVkMxX1RUTUJfVkxDX0JJVFMsIDIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgICAgIGRzdF9pZHggICAgKz0gaSA+PiAyOworICAgICAgICAgICAgICAgIG9mZiAgICAgICAgID0gKGkgJiA0KSA/IDAgOiAoKGkgJiAxKSAqIDggKyAoaSAmIDIpICogNCAqIHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBzLT5tYl9pbnRyYSA9IGlzX2ludHJhW2ldOworICAgICAgICAgICAgICAgIGlmIChpc19pbnRyYVtpXSkgeworICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBwcmVkaWN0aW9uIGJsb2NrcyBBIGFuZCBDIGFyZSBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgdi0+YV9hdmFpbCA9IHYtPmNfYXZhaWwgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAyIHx8IGkgPT0gMyB8fCAhcy0+Zmlyc3Rfc2xpY2VfbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPmFfYXZhaWwgPSB2LT5tYl90eXBlWzBdW3MtPmJsb2NrX2luZGV4W2ldIC0gcy0+YmxvY2tfd3JhcFtpXV07CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEgfHwgaSA9PSAzIHx8IHMtPm1iX3gpCisgICAgICAgICAgICAgICAgICAgICAgICB2LT5jX2F2YWlsID0gdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtpXSAtIDFdOworCisgICAgICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfaW50cmFfYmxvY2sodiwgcy0+YmxvY2tbaV0sIGksIGlzX2NvZGVkW2ldLCBtcXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgJiA0KSA/IHYtPmNvZGluZ3NldDIgOiB2LT5jb2RpbmdzZXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGk+MykgJiYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX2ludl90cmFuc184eDgocy0+YmxvY2tbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAodi0+cmFuZ2VyZWRmcm0pCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja1tpXVtqXSA8PD0gMTsKKyAgICAgICAgICAgICAgICAgICAgcy0+aWRzcC5wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkKHMtPmJsb2NrW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdFtkc3RfaWR4XSArIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgPyBzLT51dmxpbmVzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcy0+bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAodi0+cHEgPj0gOSAmJiB2LT5vdmVybGFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi0+Y19hdmFpbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX2hfb3ZlcmxhcChzLT5kZXN0W2RzdF9pZHhdICsgb2ZmLCBpICYgNCA/IHMtPnV2bGluZXNpemUgOiBzLT5saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi0+YV9hdmFpbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3Zfb3ZlcmxhcChzLT5kZXN0W2RzdF9pZHhdICsgb2ZmLCBpICYgNCA/IHMtPnV2bGluZXNpemUgOiBzLT5saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfY2JwICAgfD0gMHhGIDw8IChpIDw8IDIpOworICAgICAgICAgICAgICAgICAgICBibG9ja19pbnRyYSB8PSAxIDw8IGk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc19jb2RlZFtpXSkgeworICAgICAgICAgICAgICAgICAgICBwYXQgPSB2YzFfZGVjb2RlX3BfYmxvY2sodiwgcy0+YmxvY2tbaV0sIGksIG1xdWFudCwgdHRtYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2Jsb2NrLCBzLT5kZXN0W2RzdF9pZHhdICsgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgJiA0KSA/IHMtPnV2bGluZXNpemUgOiBzLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgJiYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja190dCk7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrX2NicCB8PSBwYXQgPDwgKGkgPDwgMik7CisgICAgICAgICAgICAgICAgICAgIGlmICghdi0+dHRtYmYgJiYgdHRtYiA8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICB0dG1iID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0X2Jsb2NrID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vIHNraXBwZWQgTUIKKyAgICAgICAgICAgIHMtPm1iX2ludHJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfcG9zXSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtpXV0gPSAwOworICAgICAgICAgICAgICAgIHMtPmRjX3ZhbFswXVtzLT5ibG9ja19pbmRleFtpXV0gID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmZl92YzFfcHJlZF9tdih2LCBpLCAwLCAwLCAwLCB2LT5yYW5nZV94LCB2LT5yYW5nZV95LCB2LT5tYl90eXBlWzBdLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBmZl92YzFfbWNfNG12X2x1bWEodiwgaSwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZl92YzFfbWNfNG12X2Nocm9tYSh2LCAwKTsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfcG9zXSA9IDA7CisgICAgICAgIH0KKyAgICB9CitlbmQ6CisgICAgdi0+Y2JwW3MtPm1iX3hdICAgICAgPSBibG9ja19jYnA7CisgICAgdi0+dHRibGtbcy0+bWJfeF0gICAgPSBibG9ja190dDsKKyAgICB2LT5pc19pbnRyYVtzLT5tYl94XSA9IGJsb2NrX2ludHJhOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIERlY29kZSBvbmUgbWFjcm9ibG9jayBpbiBhbiBpbnRlcmxhY2VkIGZyYW1lIHAgcGljdHVyZSAqLworCitzdGF0aWMgaW50IHZjMV9kZWNvZGVfcF9tYl9pbnRmcihWQzFDb250ZXh0ICp2KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+Z2I7CisgICAgaW50IGk7CisgICAgaW50IG1iX3BvcyA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOworICAgIGludCBjYnAgPSAwOyAvKiBjYnAgZGVjb2Rpbmcgc3R1ZmYgKi8KKyAgICBpbnQgbXFkaWZmLCBtcXVhbnQ7IC8qIE1CIHF1YW50aXphdGlvbiAqLworICAgIGludCB0dG1iID0gdi0+dHRmcm07IC8qIE1CIFRyYW5zZm9ybSB0eXBlICovCisKKyAgICBpbnQgbWJfaGFzX2NvZWZmcyA9IDE7IC8qIGxhc3RfZmxhZyAqLworICAgIGludCBkbXZfeCwgZG12X3k7IC8qIERpZmZlcmVudGlhbCBNViBjb21wb25lbnRzICovCisgICAgaW50IHZhbDsgLyogdGVtcCB2YWx1ZSAqLworICAgIGludCBmaXJzdF9ibG9jayA9IDE7CisgICAgaW50IGRzdF9pZHgsIG9mZjsKKyAgICBpbnQgc2tpcHBlZCwgZm91cm12ID0gMCwgdHdvbXYgPSAwOworICAgIGludCBibG9ja19jYnAgPSAwLCBwYXQsIGJsb2NrX3R0ID0gMDsKKyAgICBpbnQgaWR4X21ibW9kZSA9IDAsIG12YnA7CisgICAgaW50IHN0cmlkZV95LCBmaWVsZHR4OworCisgICAgbXF1YW50ID0gdi0+cHE7IC8qIExvc3N5IGluaXRpYWxpemF0aW9uICovCisKKyAgICBpZiAodi0+c2tpcF9pc19yYXcpCisgICAgICAgIHNraXBwZWQgPSBnZXRfYml0czEoZ2IpOworICAgIGVsc2UKKyAgICAgICAgc2tpcHBlZCA9IHYtPnMubWJza2lwX3RhYmxlW21iX3Bvc107CisgICAgaWYgKCFza2lwcGVkKSB7CisgICAgICAgIGlmICh2LT5mb3VybXZzd2l0Y2gpCisgICAgICAgICAgICBpZHhfbWJtb2RlID0gZ2V0X3ZsYzIoZ2IsIHYtPm1ibW9kZV92bGMtPnRhYmxlLCBWQzFfSU5URlJfNE1WX01CTU9ERV9WTENfQklUUywgMik7IC8vIHRyeSBnZXR0aW5nIHRoaXMgZG9uZQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZHhfbWJtb2RlID0gZ2V0X3ZsYzIoZ2IsIHYtPm1ibW9kZV92bGMtPnRhYmxlLCBWQzFfSU5URlJfTk9ONE1WX01CTU9ERV9WTENfQklUUywgMik7IC8vIGluIGEgc2luZ2xlIGxpbmUKKyAgICAgICAgc3dpdGNoIChmZl92YzFfbWJtb2RlX2ludGZycFt2LT5mb3VybXZzd2l0Y2hdW2lkeF9tYm1vZGVdWzBdKSB7CisgICAgICAgIC8qIHN0b3JlIHRoZSBtb3Rpb24gdmVjdG9yIHR5cGUgaW4gYSBmbGFnICh1c2VmdWwgbGF0ZXIpICovCisgICAgICAgIGNhc2UgTVZfUE1PREVfSU5URlJfNE1WOgorICAgICAgICAgICAgZm91cm12ID0gMTsKKyAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzBdXSA9IDA7CisgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFsxXV0gPSAwOworICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbMl1dID0gMDsKKyAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzNdXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVl9QTU9ERV9JTlRGUl80TVZfRklFTEQ6CisgICAgICAgICAgICBmb3VybXYgPSAxOworICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbMF1dID0gMTsKKyAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzFdXSA9IDE7CisgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFsyXV0gPSAxOworICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbM11dID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1WX1BNT0RFX0lOVEZSXzJNVl9GSUVMRDoKKyAgICAgICAgICAgIHR3b212ID0gMTsKKyAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzBdXSA9IDE7CisgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFsxXV0gPSAxOworICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbMl1dID0gMTsKKyAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzNdXSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVl9QTU9ERV9JTlRGUl8xTVY6CisgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFswXV0gPSAwOworICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbMV1dID0gMDsKKyAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzJdXSA9IDA7CisgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFszXV0gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZmX3ZjMV9tYm1vZGVfaW50ZnJwW3YtPmZvdXJtdnN3aXRjaF1baWR4X21ibW9kZV1bMF0gPT0gTVZfUE1PREVfSU5URlJfSU5UUkEpIHsgLy8gaW50cmEgTUIKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFtpXV1bMF0gPSAwOworICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4W2ldXVsxXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2LT5pc19pbnRyYVtzLT5tYl94XSA9IDB4M2Y7IC8vIFNldCB0aGUgYml0ZmllbGQgdG8gYWxsIDEuCisgICAgICAgICAgICBzLT5tYl9pbnRyYSAgICAgICAgICA9IDE7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVttYl9wb3NdID0gTUJfVFlQRV9JTlRSQTsKKyAgICAgICAgICAgIGZpZWxkdHggPSB2LT5maWVsZHR4X3BsYW5lW21iX3Bvc10gPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgbWJfaGFzX2NvZWZmcyA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAobWJfaGFzX2NvZWZmcykKKyAgICAgICAgICAgICAgICBjYnAgPSAxICsgZ2V0X3ZsYzIoJnYtPnMuZ2IsIHYtPmNicGN5X3ZsYy0+dGFibGUsIFZDMV9DQlBDWV9QX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgIHYtPnMuYWNfcHJlZCA9IHYtPmFjcHJlZF9wbGFuZVttYl9wb3NdID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIEdFVF9NUVVBTlQoKTsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfcG9zXSA9IG1xdWFudDsKKyAgICAgICAgICAgIC8qIFNldCBEQyBzY2FsZSAtIHkgYW5kIGMgdXNlIHRoZSBzYW1lIChub3Qgc3VyZSBpZiBuZWNlc3NhcnkgaGVyZSkgKi8KKyAgICAgICAgICAgIHMtPnlfZGNfc2NhbGUgPSBzLT55X2RjX3NjYWxlX3RhYmxlW21xdWFudF07CisgICAgICAgICAgICBzLT5jX2RjX3NjYWxlID0gcy0+Y19kY19zY2FsZV90YWJsZVttcXVhbnRdOworICAgICAgICAgICAgZHN0X2lkeCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdi0+YV9hdmFpbCA9IHYtPmNfYXZhaWwgICAgICAgICAgPSAwOworICAgICAgICAgICAgICAgIHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV1dID0gMTsKKyAgICAgICAgICAgICAgICBzLT5kY192YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dICA9IDA7CisgICAgICAgICAgICAgICAgZHN0X2lkeCArPSBpID4+IDI7CisgICAgICAgICAgICAgICAgdmFsID0gKChjYnAgPj4gKDUgLSBpKSkgJiAxKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAyIHx8IGkgPT0gMyB8fCAhcy0+Zmlyc3Rfc2xpY2VfbGluZSkKKyAgICAgICAgICAgICAgICAgICAgdi0+YV9hdmFpbCA9IHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV0gLSBzLT5ibG9ja193cmFwW2ldXTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAxIHx8IGkgPT0gMyB8fCBzLT5tYl94KQorICAgICAgICAgICAgICAgICAgICB2LT5jX2F2YWlsID0gdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtpXSAtIDFdOworCisgICAgICAgICAgICAgICAgdmMxX2RlY29kZV9pbnRyYV9ibG9jayh2LCBzLT5ibG9ja1tpXSwgaSwgdmFsLCBtcXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSAmIDQpID8gdi0+Y29kaW5nc2V0MiA6IHYtPmNvZGluZ3NldCk7CisgICAgICAgICAgICAgICAgaWYgKChpPjMpICYmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzh4OChzLT5ibG9ja1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmlkZV95ID0gcy0+bGluZXNpemUgPDwgZmllbGR0eDsKKyAgICAgICAgICAgICAgICAgICAgb2ZmID0gKGZpZWxkdHgpID8gKChpICYgMSkgKiA4KSArICgoaSAmIDIpID4+IDEpICogcy0+bGluZXNpemUgOiAoaSAmIDEpICogOCArIDQgKiAoaSAmIDIpICogcy0+bGluZXNpemU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaWRlX3kgPSBzLT51dmxpbmVzaXplOworICAgICAgICAgICAgICAgICAgICBvZmYgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT5pZHNwLnB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQocy0+YmxvY2tbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlc3RbZHN0X2lkeF0gKyBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZV95KTsKKyAgICAgICAgICAgICAgICAvL1RPRE86IGxvb3AgZmlsdGVyCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsgLy8gaW50ZXIgTUIKKyAgICAgICAgICAgIG1iX2hhc19jb2VmZnMgPSBmZl92YzFfbWJtb2RlX2ludGZycFt2LT5mb3VybXZzd2l0Y2hdW2lkeF9tYm1vZGVdWzNdOworICAgICAgICAgICAgaWYgKG1iX2hhc19jb2VmZnMpCisgICAgICAgICAgICAgICAgY2JwID0gMSArIGdldF92bGMyKCZ2LT5zLmdiLCB2LT5jYnBjeV92bGMtPnRhYmxlLCBWQzFfQ0JQQ1lfUF9WTENfQklUUywgMik7CisgICAgICAgICAgICBpZiAoZmZfdmMxX21ibW9kZV9pbnRmcnBbdi0+Zm91cm12c3dpdGNoXVtpZHhfbWJtb2RlXVswXSA9PSBNVl9QTU9ERV9JTlRGUl8yTVZfRklFTEQpIHsKKyAgICAgICAgICAgICAgICB2LT50d29tdmJwID0gZ2V0X3ZsYzIoZ2IsIHYtPnR3b212YnBfdmxjLT50YWJsZSwgVkMxXzJNVl9CTE9DS19QQVRURVJOX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKChmZl92YzFfbWJtb2RlX2ludGZycFt2LT5mb3VybXZzd2l0Y2hdW2lkeF9tYm1vZGVdWzBdID09IE1WX1BNT0RFX0lOVEZSXzRNVikKKyAgICAgICAgICAgICAgICAgICAgfHwgKGZmX3ZjMV9tYm1vZGVfaW50ZnJwW3YtPmZvdXJtdnN3aXRjaF1baWR4X21ibW9kZV1bMF0gPT0gTVZfUE1PREVfSU5URlJfNE1WX0ZJRUxEKSkgeworICAgICAgICAgICAgICAgICAgICB2LT5mb3VybXZicCA9IGdldF92bGMyKGdiLCB2LT5mb3VybXZicF92bGMtPnRhYmxlLCBWQzFfNE1WX0JMT0NLX1BBVFRFUk5fVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPm1iX2ludHJhID0gdi0+aXNfaW50cmFbcy0+bWJfeF0gPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgICAgICB2LT5tYl90eXBlWzBdW3MtPmJsb2NrX2luZGV4W2ldXSA9IDA7CisgICAgICAgICAgICBmaWVsZHR4ID0gdi0+ZmllbGR0eF9wbGFuZVttYl9wb3NdID0gZmZfdmMxX21ibW9kZV9pbnRmcnBbdi0+Zm91cm12c3dpdGNoXVtpZHhfbWJtb2RlXVsxXTsKKyAgICAgICAgICAgIC8qIGZvciBhbGwgbW90aW9uIHZlY3RvciByZWFkIE1WREFUQSBhbmQgbW90aW9uIGNvbXBlbnNhdGUgZWFjaCBibG9jayAqLworICAgICAgICAgICAgZHN0X2lkeCA9IDA7CisgICAgICAgICAgICBpZiAoZm91cm12KSB7CisgICAgICAgICAgICAgICAgbXZicCA9IHYtPmZvdXJtdmJwOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkbXZfeCA9IGRtdl95ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCAgID0gKChtdmJwID4+ICgzIC0gaSkpICYgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X212ZGF0YV9pbnRlcmxhY2VkKHYsICZkbXZfeCwgJmRtdl95LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9wcmVkX212X2ludGZyKHYsIGksIGRtdl94LCBkbXZfeSwgMCwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmZl92YzFfbWNfNG12X2x1bWEodiwgaSwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmZl92YzFfbWNfNG12X2Nocm9tYTQodiwgMCwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR3b212KSB7CisgICAgICAgICAgICAgICAgbXZicCAgPSB2LT50d29tdmJwOworICAgICAgICAgICAgICAgIGRtdl94ID0gZG12X3kgPSAwOworICAgICAgICAgICAgICAgIGlmIChtdmJwICYgMikgeworICAgICAgICAgICAgICAgICAgICBnZXRfbXZkYXRhX2ludGVybGFjZWQodiwgJmRtdl94LCAmZG12X3ksIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmZl92YzFfcHJlZF9tdl9pbnRmcih2LCAwLCBkbXZfeCwgZG12X3ksIDIsIHYtPnJhbmdlX3gsIHYtPnJhbmdlX3ksIHYtPm1iX3R5cGVbMF0sIDApOworICAgICAgICAgICAgICAgIGZmX3ZjMV9tY180bXZfbHVtYSh2LCAwLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBmZl92YzFfbWNfNG12X2x1bWEodiwgMSwgMCwgMCk7CisgICAgICAgICAgICAgICAgZG12X3ggPSBkbXZfeSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG12YnAgJiAxKSB7CisgICAgICAgICAgICAgICAgICAgIGdldF9tdmRhdGFfaW50ZXJsYWNlZCh2LCAmZG12X3gsICZkbXZfeSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZmX3ZjMV9wcmVkX212X2ludGZyKHYsIDIsIGRtdl94LCBkbXZfeSwgMiwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgMCk7CisgICAgICAgICAgICAgICAgZmZfdmMxX21jXzRtdl9sdW1hKHYsIDIsIDAsIDApOworICAgICAgICAgICAgICAgIGZmX3ZjMV9tY180bXZfbHVtYSh2LCAzLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBmZl92YzFfbWNfNG12X2Nocm9tYTQodiwgMCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG12YnAgPSBmZl92YzFfbWJtb2RlX2ludGZycFt2LT5mb3VybXZzd2l0Y2hdW2lkeF9tYm1vZGVdWzJdOworICAgICAgICAgICAgICAgIGRtdl94ID0gZG12X3kgPSAwOworICAgICAgICAgICAgICAgIGlmIChtdmJwKSB7CisgICAgICAgICAgICAgICAgICAgIGdldF9tdmRhdGFfaW50ZXJsYWNlZCh2LCAmZG12X3gsICZkbXZfeSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZmX3ZjMV9wcmVkX212X2ludGZyKHYsIDAsIGRtdl94LCBkbXZfeSwgMSwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgMCk7CisgICAgICAgICAgICAgICAgZmZfdmMxX21jXzFtdih2LCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYnApCisgICAgICAgICAgICAgICAgR0VUX01RVUFOVCgpOyAgLy8gcC4gMjI3CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3Bvc10gPSBtcXVhbnQ7CisgICAgICAgICAgICBpZiAoIXYtPnR0bWJmICYmIGNicCkKKyAgICAgICAgICAgICAgICB0dG1iID0gZ2V0X3ZsYzIoZ2IsIGZmX3ZjMV90dG1iX3ZsY1t2LT50dF9pbmRleF0udGFibGUsIFZDMV9UVE1CX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgICBzLT5kY192YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dID0gMDsKKyAgICAgICAgICAgICAgICBkc3RfaWR4ICs9IGkgPj4gMjsKKyAgICAgICAgICAgICAgICB2YWwgPSAoKGNicCA+PiAoNSAtIGkpKSAmIDEpOworICAgICAgICAgICAgICAgIGlmICghZmllbGR0eCkKKyAgICAgICAgICAgICAgICAgICAgb2ZmID0gKGkgJiA0KSA/IDAgOiAoKGkgJiAxKSAqIDggKyAoaSAmIDIpICogNCAqIHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG9mZiA9IChpICYgNCkgPyAwIDogKChpICYgMSkgKiA4ICsgKChpID4gMSkgKiBzLT5saW5lc2l6ZSkpOworICAgICAgICAgICAgICAgIGlmICh2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0ID0gdmMxX2RlY29kZV9wX2Jsb2NrKHYsIHMtPmJsb2NrW2ldLCBpLCBtcXVhbnQsIHR0bWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9ibG9jaywgcy0+ZGVzdFtkc3RfaWR4XSArIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgPyBzLT51dmxpbmVzaXplIDogKHMtPmxpbmVzaXplIDw8IGZpZWxkdHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgJiA0KSAmJiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpLCAmYmxvY2tfdHQpOworICAgICAgICAgICAgICAgICAgICBibG9ja19jYnAgfD0gcGF0IDw8IChpIDw8IDIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXYtPnR0bWJmICYmIHR0bWIgPCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgdHRtYiA9IC0xOworICAgICAgICAgICAgICAgICAgICBmaXJzdF9ibG9jayA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gc2tpcHBlZAorICAgICAgICBzLT5tYl9pbnRyYSA9IHYtPmlzX2ludHJhW3MtPm1iX3hdID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtpXV0gPSAwOworICAgICAgICAgICAgcy0+ZGNfdmFsWzBdW3MtPmJsb2NrX2luZGV4W2ldXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbbWJfcG9zXSAgICAgID0gTUJfVFlQRV9TS0lQOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3Bvc10gPSAwOworICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFswXV0gPSAwOworICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFsxXV0gPSAwOworICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFsyXV0gPSAwOworICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFszXV0gPSAwOworICAgICAgICBmZl92YzFfcHJlZF9tdl9pbnRmcih2LCAwLCAwLCAwLCAxLCB2LT5yYW5nZV94LCB2LT5yYW5nZV95LCB2LT5tYl90eXBlWzBdLCAwKTsKKyAgICAgICAgZmZfdmMxX21jXzFtdih2LCAwKTsKKyAgICB9CisgICAgaWYgKHMtPm1iX3ggPT0gcy0+bWJfd2lkdGggLSAxKQorICAgICAgICBtZW1tb3ZlKHYtPmlzX2ludHJhX2Jhc2UsIHYtPmlzX2ludHJhLCBzaXplb2Yodi0+aXNfaW50cmFfYmFzZVswXSkqcy0+bWJfc3RyaWRlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YzFfZGVjb2RlX3BfbWJfaW50ZmkoVkMxQ29udGV4dCAqdikKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOworICAgIGludCBpOworICAgIGludCBtYl9wb3MgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKKyAgICBpbnQgY2JwID0gMDsgLyogY2JwIGRlY29kaW5nIHN0dWZmICovCisgICAgaW50IG1xZGlmZiwgbXF1YW50OyAvKiBNQiBxdWFudGl6YXRpb24gKi8KKyAgICBpbnQgdHRtYiA9IHYtPnR0ZnJtOyAvKiBNQiBUcmFuc2Zvcm0gdHlwZSAqLworCisgICAgaW50IG1iX2hhc19jb2VmZnMgPSAxOyAvKiBsYXN0X2ZsYWcgKi8KKyAgICBpbnQgZG12X3gsIGRtdl95OyAvKiBEaWZmZXJlbnRpYWwgTVYgY29tcG9uZW50cyAqLworICAgIGludCB2YWw7IC8qIHRlbXAgdmFsdWVzICovCisgICAgaW50IGZpcnN0X2Jsb2NrID0gMTsKKyAgICBpbnQgZHN0X2lkeCwgb2ZmOworICAgIGludCBwcmVkX2ZsYWcgPSAwOworICAgIGludCBibG9ja19jYnAgPSAwLCBwYXQsIGJsb2NrX3R0ID0gMDsKKyAgICBpbnQgaWR4X21ibW9kZSA9IDA7CisKKyAgICBtcXVhbnQgPSB2LT5wcTsgLyogTG9zc3kgaW5pdGlhbGl6YXRpb24gKi8KKworICAgIGlkeF9tYm1vZGUgPSBnZXRfdmxjMihnYiwgdi0+bWJtb2RlX3ZsYy0+dGFibGUsIFZDMV9JRl9NQk1PREVfVkxDX0JJVFMsIDIpOworICAgIGlmIChpZHhfbWJtb2RlIDw9IDEpIHsgLy8gaW50cmEgTUIKKyAgICAgICAgdi0+aXNfaW50cmFbcy0+bWJfeF0gPSAweDNmOyAvLyBTZXQgdGhlIGJpdGZpZWxkIHRvIGFsbCAxLgorICAgICAgICBzLT5tYl9pbnRyYSAgICAgICAgICA9IDE7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdICsgdi0+YmxvY2tzX29mZl1bMF0gPSAwOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFswXSArIHYtPmJsb2Nrc19vZmZdWzFdID0gMDsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbbWJfcG9zICsgdi0+bWJfb2ZmXSA9IE1CX1RZUEVfSU5UUkE7CisgICAgICAgIEdFVF9NUVVBTlQoKTsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVttYl9wb3NdID0gbXF1YW50OworICAgICAgICAvKiBTZXQgREMgc2NhbGUgLSB5IGFuZCBjIHVzZSB0aGUgc2FtZSAobm90IHN1cmUgaWYgbmVjZXNzYXJ5IGhlcmUpICovCisgICAgICAgIHMtPnlfZGNfc2NhbGUgPSBzLT55X2RjX3NjYWxlX3RhYmxlW21xdWFudF07CisgICAgICAgIHMtPmNfZGNfc2NhbGUgPSBzLT5jX2RjX3NjYWxlX3RhYmxlW21xdWFudF07CisgICAgICAgIHYtPnMuYWNfcHJlZCAgPSB2LT5hY3ByZWRfcGxhbmVbbWJfcG9zXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIG1iX2hhc19jb2VmZnMgPSBpZHhfbWJtb2RlICYgMTsKKyAgICAgICAgaWYgKG1iX2hhc19jb2VmZnMpCisgICAgICAgICAgICBjYnAgPSAxICsgZ2V0X3ZsYzIoJnYtPnMuZ2IsIHYtPmNicGN5X3ZsYy0+dGFibGUsIFZDMV9JQ0JQQ1lfVkxDX0JJVFMsIDIpOworICAgICAgICBkc3RfaWR4ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgdi0+YV9hdmFpbCA9IHYtPmNfYXZhaWwgICAgICAgICAgPSAwOworICAgICAgICAgICAgdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtpXV0gPSAxOworICAgICAgICAgICAgcy0+ZGNfdmFsWzBdW3MtPmJsb2NrX2luZGV4W2ldXSAgPSAwOworICAgICAgICAgICAgZHN0X2lkeCArPSBpID4+IDI7CisgICAgICAgICAgICB2YWwgPSAoKGNicCA+PiAoNSAtIGkpKSAmIDEpOworICAgICAgICAgICAgaWYgKGkgPT0gMiB8fCBpID09IDMgfHwgIXMtPmZpcnN0X3NsaWNlX2xpbmUpCisgICAgICAgICAgICAgICAgdi0+YV9hdmFpbCA9IHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV0gLSBzLT5ibG9ja193cmFwW2ldXTsKKyAgICAgICAgICAgIGlmIChpID09IDEgfHwgaSA9PSAzIHx8IHMtPm1iX3gpCisgICAgICAgICAgICAgICAgdi0+Y19hdmFpbCA9IHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV0gLSAxXTsKKworICAgICAgICAgICAgdmMxX2RlY29kZV9pbnRyYV9ibG9jayh2LCBzLT5ibG9ja1tpXSwgaSwgdmFsLCBtcXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgPyB2LT5jb2RpbmdzZXQyIDogdi0+Y29kaW5nc2V0KTsKKyAgICAgICAgICAgIGlmICgoaT4zKSAmJiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfOHg4KHMtPmJsb2NrW2ldKTsKKyAgICAgICAgICAgIG9mZiAgPSAoaSAmIDQpID8gMCA6ICgoaSAmIDEpICogOCArIChpICYgMikgKiA0ICogcy0+bGluZXNpemUpOworICAgICAgICAgICAgcy0+aWRzcC5wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkKHMtPmJsb2NrW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlc3RbZHN0X2lkeF0gKyBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgJiA0KSA/IHMtPnV2bGluZXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcy0+bGluZXNpemUpOworICAgICAgICAgICAgLy8gVE9ETzogbG9vcCBmaWx0ZXIKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHMtPm1iX2ludHJhID0gdi0+aXNfaW50cmFbcy0+bWJfeF0gPSAwOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVttYl9wb3MgKyB2LT5tYl9vZmZdID0gTUJfVFlQRV8xNngxNjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtpXV0gPSAwOworICAgICAgICBpZiAoaWR4X21ibW9kZSA8PSA1KSB7IC8vIDEtTVYKKyAgICAgICAgICAgIGRtdl94ID0gZG12X3kgPSBwcmVkX2ZsYWcgPSAwOworICAgICAgICAgICAgaWYgKGlkeF9tYm1vZGUgJiAxKSB7CisgICAgICAgICAgICAgICAgZ2V0X212ZGF0YV9pbnRlcmxhY2VkKHYsICZkbXZfeCwgJmRtdl95LCAmcHJlZF9mbGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZmX3ZjMV9wcmVkX212KHYsIDAsIGRtdl94LCBkbXZfeSwgMSwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgcHJlZF9mbGFnLCAwKTsKKyAgICAgICAgICAgIGZmX3ZjMV9tY18xbXYodiwgMCk7CisgICAgICAgICAgICBtYl9oYXNfY29lZmZzID0gIShpZHhfbWJtb2RlICYgMik7CisgICAgICAgIH0gZWxzZSB7IC8vIDQtTVYKKyAgICAgICAgICAgIHYtPmZvdXJtdmJwID0gZ2V0X3ZsYzIoZ2IsIHYtPmZvdXJtdmJwX3ZsYy0+dGFibGUsIFZDMV80TVZfQkxPQ0tfUEFUVEVSTl9WTENfQklUUywgMSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgIGRtdl94ID0gZG12X3kgPSBwcmVkX2ZsYWcgPSAwOworICAgICAgICAgICAgICAgICAgICB2YWwgICA9ICgodi0+Zm91cm12YnAgPj4gKDMgLSBpKSkgJiAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X212ZGF0YV9pbnRlcmxhY2VkKHYsICZkbXZfeCwgJmRtdl95LCAmcHJlZF9mbGFnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmZl92YzFfcHJlZF9tdih2LCBpLCBkbXZfeCwgZG12X3ksIDAsIHYtPnJhbmdlX3gsIHYtPnJhbmdlX3ksIHYtPm1iX3R5cGVbMF0sIHByZWRfZmxhZywgMCk7CisgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9tY180bXZfbHVtYSh2LCBpLCAwLCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgZmZfdmMxX21jXzRtdl9jaHJvbWEodiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYl9oYXNfY29lZmZzID0gaWR4X21ibW9kZSAmIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1iX2hhc19jb2VmZnMpCisgICAgICAgICAgICBjYnAgPSAxICsgZ2V0X3ZsYzIoJnYtPnMuZ2IsIHYtPmNicGN5X3ZsYy0+dGFibGUsIFZDMV9DQlBDWV9QX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgaWYgKGNicCkgeworICAgICAgICAgICAgR0VUX01RVUFOVCgpOworICAgICAgICB9CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfcG9zXSA9IG1xdWFudDsKKyAgICAgICAgaWYgKCF2LT50dG1iZiAmJiBjYnApIHsKKyAgICAgICAgICAgIHR0bWIgPSBnZXRfdmxjMihnYiwgZmZfdmMxX3R0bWJfdmxjW3YtPnR0X2luZGV4XS50YWJsZSwgVkMxX1RUTUJfVkxDX0JJVFMsIDIpOworICAgICAgICB9CisgICAgICAgIGRzdF9pZHggPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICBzLT5kY192YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dID0gMDsKKyAgICAgICAgICAgIGRzdF9pZHggKz0gaSA+PiAyOworICAgICAgICAgICAgdmFsID0gKChjYnAgPj4gKDUgLSBpKSkgJiAxKTsKKyAgICAgICAgICAgIG9mZiA9IChpICYgNCkgPyAwIDogKGkgJiAxKSAqIDggKyAoaSAmIDIpICogNCAqIHMtPmxpbmVzaXplOworICAgICAgICAgICAgaWYgKHZhbCkgeworICAgICAgICAgICAgICAgIHBhdCA9IHZjMV9kZWNvZGVfcF9ibG9jayh2LCBzLT5ibG9ja1tpXSwgaSwgbXF1YW50LCB0dG1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9ibG9jaywgcy0+ZGVzdFtkc3RfaWR4XSArIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgJiA0KSA/IHMtPnV2bGluZXNpemUgOiBzLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgJiA0KSAmJiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2tfdHQpOworICAgICAgICAgICAgICAgIGJsb2NrX2NicCB8PSBwYXQgPDwgKGkgPDwgMik7CisgICAgICAgICAgICAgICAgaWYgKCF2LT50dG1iZiAmJiB0dG1iIDwgOCkgdHRtYiA9IC0xOworICAgICAgICAgICAgICAgIGZpcnN0X2Jsb2NrID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+bWJfeCA9PSBzLT5tYl93aWR0aCAtIDEpCisgICAgICAgIG1lbW1vdmUodi0+aXNfaW50cmFfYmFzZSwgdi0+aXNfaW50cmEsIHNpemVvZih2LT5pc19pbnRyYV9iYXNlWzBdKSAqIHMtPm1iX3N0cmlkZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBEZWNvZGUgb25lIEItZnJhbWUgTUIgKGluIE1haW4gcHJvZmlsZSkKKyAqLworc3RhdGljIHZvaWQgdmMxX2RlY29kZV9iX21iKFZDMUNvbnRleHQgKnYpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdi0+czsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgbWJfcG9zID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisgICAgaW50IGNicCA9IDA7IC8qIGNicCBkZWNvZGluZyBzdHVmZiAqLworICAgIGludCBtcWRpZmYsIG1xdWFudDsgLyogTUIgcXVhbnRpemF0aW9uICovCisgICAgaW50IHR0bWIgPSB2LT50dGZybTsgLyogTUIgVHJhbnNmb3JtIHR5cGUgKi8KKyAgICBpbnQgbWJfaGFzX2NvZWZmcyA9IDA7IC8qIGxhc3RfZmxhZyAqLworICAgIGludCBpbmRleCwgaW5kZXgxOyAvKiBMVVQgaW5kZXhlcyAqLworICAgIGludCB2YWwsIHNpZ247IC8qIHRlbXAgdmFsdWVzICovCisgICAgaW50IGZpcnN0X2Jsb2NrID0gMTsKKyAgICBpbnQgZHN0X2lkeCwgb2ZmOworICAgIGludCBza2lwcGVkLCBkaXJlY3Q7CisgICAgaW50IGRtdl94WzJdLCBkbXZfeVsyXTsKKyAgICBpbnQgYm12dHlwZSA9IEJNVl9UWVBFX0JBQ0tXQVJEOworCisgICAgbXF1YW50ICAgICAgPSB2LT5wcTsgLyogbG9zc3kgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBzLT5tYl9pbnRyYSA9IDA7CisKKyAgICBpZiAodi0+ZG1iX2lzX3JhdykKKyAgICAgICAgZGlyZWN0ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBlbHNlCisgICAgICAgIGRpcmVjdCA9IHYtPmRpcmVjdF9tYl9wbGFuZVttYl9wb3NdOworICAgIGlmICh2LT5za2lwX2lzX3JhdykKKyAgICAgICAgc2tpcHBlZCA9IGdldF9iaXRzMShnYik7CisgICAgZWxzZQorICAgICAgICBza2lwcGVkID0gdi0+cy5tYnNraXBfdGFibGVbbWJfcG9zXTsKKworICAgIGRtdl94WzBdID0gZG12X3hbMV0gPSBkbXZfeVswXSA9IGRtdl95WzFdID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV1dID0gMDsKKyAgICAgICAgcy0+ZGNfdmFsWzBdW3MtPmJsb2NrX2luZGV4W2ldXSAgPSAwOworICAgIH0KKyAgICBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3Bvc10gPSAwOworCisgICAgaWYgKCFkaXJlY3QpIHsKKyAgICAgICAgaWYgKCFza2lwcGVkKSB7CisgICAgICAgICAgICBHRVRfTVZEQVRBKGRtdl94WzBdLCBkbXZfeVswXSk7CisgICAgICAgICAgICBkbXZfeFsxXSA9IGRtdl94WzBdOworICAgICAgICAgICAgZG12X3lbMV0gPSBkbXZfeVswXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2tpcHBlZCB8fCAhcy0+bWJfaW50cmEpIHsKKyAgICAgICAgICAgIGJtdnR5cGUgPSBkZWNvZGUwMTIoZ2IpOworICAgICAgICAgICAgc3dpdGNoIChibXZ0eXBlKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgYm12dHlwZSA9ICh2LT5iZnJhY3Rpb24gPj0gKEJfRlJBQ1RJT05fREVOLzIpKSA/IEJNVl9UWVBFX0JBQ0tXQVJEIDogQk1WX1RZUEVfRk9SV0FSRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBibXZ0eXBlID0gKHYtPmJmcmFjdGlvbiA+PSAoQl9GUkFDVElPTl9ERU4vMikpID8gQk1WX1RZUEVfRk9SV0FSRCA6IEJNVl9UWVBFX0JBQ0tXQVJEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGJtdnR5cGUgID0gQk1WX1RZUEVfSU5URVJQT0xBVEVEOworICAgICAgICAgICAgICAgIGRtdl94WzBdID0gZG12X3lbMF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV1dID0gcy0+bWJfaW50cmE7CisKKyAgICBpZiAoc2tpcHBlZCkgeworICAgICAgICBpZiAoZGlyZWN0KQorICAgICAgICAgICAgYm12dHlwZSA9IEJNVl9UWVBFX0lOVEVSUE9MQVRFRDsKKyAgICAgICAgZmZfdmMxX3ByZWRfYl9tdih2LCBkbXZfeCwgZG12X3ksIGRpcmVjdCwgYm12dHlwZSk7CisgICAgICAgIHZjMV9iX21jKHYsIGRtdl94LCBkbXZfeSwgZGlyZWN0LCBibXZ0eXBlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZGlyZWN0KSB7CisgICAgICAgIGNicCA9IGdldF92bGMyKCZ2LT5zLmdiLCB2LT5jYnBjeV92bGMtPnRhYmxlLCBWQzFfQ0JQQ1lfUF9WTENfQklUUywgMik7CisgICAgICAgIEdFVF9NUVVBTlQoKTsKKyAgICAgICAgcy0+bWJfaW50cmEgPSAwOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3Bvc10gPSBtcXVhbnQ7CisgICAgICAgIGlmICghdi0+dHRtYmYpCisgICAgICAgICAgICB0dG1iID0gZ2V0X3ZsYzIoZ2IsIGZmX3ZjMV90dG1iX3ZsY1t2LT50dF9pbmRleF0udGFibGUsIFZDMV9UVE1CX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgZG12X3hbMF0gPSBkbXZfeVswXSA9IGRtdl94WzFdID0gZG12X3lbMV0gPSAwOworICAgICAgICBmZl92YzFfcHJlZF9iX212KHYsIGRtdl94LCBkbXZfeSwgZGlyZWN0LCBibXZ0eXBlKTsKKyAgICAgICAgdmMxX2JfbWModiwgZG12X3gsIGRtdl95LCBkaXJlY3QsIGJtdnR5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbWJfaGFzX2NvZWZmcyAmJiAhcy0+bWJfaW50cmEpIHsKKyAgICAgICAgICAgIC8qIG5vIGNvZGVkIGJsb2NrcyAtIGVmZmVjdGl2ZWx5IHNraXBwZWQgKi8KKyAgICAgICAgICAgIGZmX3ZjMV9wcmVkX2JfbXYodiwgZG12X3gsIGRtdl95LCBkaXJlY3QsIGJtdnR5cGUpOworICAgICAgICAgICAgdmMxX2JfbWModiwgZG12X3gsIGRtdl95LCBkaXJlY3QsIGJtdnR5cGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5tYl9pbnRyYSAmJiAhbWJfaGFzX2NvZWZmcykgeworICAgICAgICAgICAgR0VUX01RVUFOVCgpOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVttYl9wb3NdID0gbXF1YW50OworICAgICAgICAgICAgcy0+YWNfcHJlZCA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBjYnAgPSAwOworICAgICAgICAgICAgZmZfdmMxX3ByZWRfYl9tdih2LCBkbXZfeCwgZG12X3ksIGRpcmVjdCwgYm12dHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYm12dHlwZSA9PSBCTVZfVFlQRV9JTlRFUlBPTEFURUQpIHsKKyAgICAgICAgICAgICAgICBHRVRfTVZEQVRBKGRtdl94WzBdLCBkbXZfeVswXSk7CisgICAgICAgICAgICAgICAgaWYgKCFtYl9oYXNfY29lZmZzKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGludGVycG9sYXRlZCBza2lwcGVkIGJsb2NrICovCisgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9wcmVkX2JfbXYodiwgZG12X3gsIGRtdl95LCBkaXJlY3QsIGJtdnR5cGUpOworICAgICAgICAgICAgICAgICAgICB2YzFfYl9tYyh2LCBkbXZfeCwgZG12X3ksIGRpcmVjdCwgYm12dHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZl92YzFfcHJlZF9iX212KHYsIGRtdl94LCBkbXZfeSwgZGlyZWN0LCBibXZ0eXBlKTsKKyAgICAgICAgICAgIGlmICghcy0+bWJfaW50cmEpIHsKKyAgICAgICAgICAgICAgICB2YzFfYl9tYyh2LCBkbXZfeCwgZG12X3ksIGRpcmVjdCwgYm12dHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+bWJfaW50cmEpCisgICAgICAgICAgICAgICAgcy0+YWNfcHJlZCA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBjYnAgPSBnZXRfdmxjMigmdi0+cy5nYiwgdi0+Y2JwY3lfdmxjLT50YWJsZSwgVkMxX0NCUENZX1BfVkxDX0JJVFMsIDIpOworICAgICAgICAgICAgR0VUX01RVUFOVCgpOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVttYl9wb3NdID0gbXF1YW50OworICAgICAgICAgICAgaWYgKCF2LT50dG1iZiAmJiAhcy0+bWJfaW50cmEgJiYgbWJfaGFzX2NvZWZmcykKKyAgICAgICAgICAgICAgICB0dG1iID0gZ2V0X3ZsYzIoZ2IsIGZmX3ZjMV90dG1iX3ZsY1t2LT50dF9pbmRleF0udGFibGUsIFZDMV9UVE1CX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkc3RfaWR4ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIHMtPmRjX3ZhbFswXVtzLT5ibG9ja19pbmRleFtpXV0gPSAwOworICAgICAgICBkc3RfaWR4ICs9IGkgPj4gMjsKKyAgICAgICAgdmFsID0gKChjYnAgPj4gKDUgLSBpKSkgJiAxKTsKKyAgICAgICAgb2ZmID0gKGkgJiA0KSA/IDAgOiAoKGkgJiAxKSAqIDggKyAoaSAmIDIpICogNCAqIHMtPmxpbmVzaXplKTsKKyAgICAgICAgdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtpXV0gPSBzLT5tYl9pbnRyYTsKKyAgICAgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgICAgICAvKiBjaGVjayBpZiBwcmVkaWN0aW9uIGJsb2NrcyBBIGFuZCBDIGFyZSBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgIHYtPmFfYXZhaWwgPSB2LT5jX2F2YWlsID0gMDsKKyAgICAgICAgICAgIGlmIChpID09IDIgfHwgaSA9PSAzIHx8ICFzLT5maXJzdF9zbGljZV9saW5lKQorICAgICAgICAgICAgICAgIHYtPmFfYXZhaWwgPSB2LT5tYl90eXBlWzBdW3MtPmJsb2NrX2luZGV4W2ldIC0gcy0+YmxvY2tfd3JhcFtpXV07CisgICAgICAgICAgICBpZiAoaSA9PSAxIHx8IGkgPT0gMyB8fCBzLT5tYl94KQorICAgICAgICAgICAgICAgIHYtPmNfYXZhaWwgPSB2LT5tYl90eXBlWzBdW3MtPmJsb2NrX2luZGV4W2ldIC0gMV07CisKKyAgICAgICAgICAgIHZjMV9kZWNvZGVfaW50cmFfYmxvY2sodiwgcy0+YmxvY2tbaV0sIGksIHZhbCwgbXF1YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSAmIDQpID8gdi0+Y29kaW5nc2V0MiA6IHYtPmNvZGluZ3NldCk7CisgICAgICAgICAgICBpZiAoKGk+MykgJiYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzh4OChzLT5ibG9ja1tpXSk7CisgICAgICAgICAgICBpZiAodi0+cmFuZ2VyZWRmcm0pCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrW2ldW2pdIDw8PSAxOworICAgICAgICAgICAgcy0+aWRzcC5wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkKHMtPmJsb2NrW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlc3RbZHN0X2lkeF0gKyBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmIDQgPyBzLT51dmxpbmVzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzLT5saW5lc2l6ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsKSB7CisgICAgICAgICAgICB2YzFfZGVjb2RlX3BfYmxvY2sodiwgcy0+YmxvY2tbaV0sIGksIG1xdWFudCwgdHRtYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9ibG9jaywgcy0+ZGVzdFtkc3RfaWR4XSArIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSAmIDQpID8gcy0+dXZsaW5lc2l6ZSA6IHMtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgJiYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIXYtPnR0bWJmICYmIHR0bWIgPCA4KQorICAgICAgICAgICAgICAgIHR0bWIgPSAtMTsKKyAgICAgICAgICAgIGZpcnN0X2Jsb2NrID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqIERlY29kZSBvbmUgQi1mcmFtZSBNQiAoaW4gaW50ZXJsYWNlZCBmaWVsZCBCIHBpY3R1cmUpCisgKi8KK3N0YXRpYyB2b2lkIHZjMV9kZWNvZGVfYl9tYl9pbnRmaShWQzFDb250ZXh0ICp2KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+Z2I7CisgICAgaW50IGksIGo7CisgICAgaW50IG1iX3BvcyA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOworICAgIGludCBjYnAgPSAwOyAvKiBjYnAgZGVjb2Rpbmcgc3R1ZmYgKi8KKyAgICBpbnQgbXFkaWZmLCBtcXVhbnQ7IC8qIE1CIHF1YW50aXphdGlvbiAqLworICAgIGludCB0dG1iID0gdi0+dHRmcm07IC8qIE1CIFRyYW5zZm9ybSB0eXBlICovCisgICAgaW50IG1iX2hhc19jb2VmZnMgPSAwOyAvKiBsYXN0X2ZsYWcgKi8KKyAgICBpbnQgdmFsOyAvKiB0ZW1wIHZhbHVlICovCisgICAgaW50IGZpcnN0X2Jsb2NrID0gMTsKKyAgICBpbnQgZHN0X2lkeCwgb2ZmOworICAgIGludCBmd2Q7CisgICAgaW50IGRtdl94WzJdLCBkbXZfeVsyXSwgcHJlZF9mbGFnWzJdOworICAgIGludCBibXZ0eXBlID0gQk1WX1RZUEVfQkFDS1dBUkQ7CisgICAgaW50IGlkeF9tYm1vZGU7CisKKyAgICBtcXVhbnQgICAgICA9IHYtPnBxOyAvKiBMb3NzeSBpbml0aWFsaXphdGlvbiAqLworICAgIHMtPm1iX2ludHJhID0gMDsKKworICAgIGlkeF9tYm1vZGUgPSBnZXRfdmxjMihnYiwgdi0+bWJtb2RlX3ZsYy0+dGFibGUsIFZDMV9JRl9NQk1PREVfVkxDX0JJVFMsIDIpOworICAgIGlmIChpZHhfbWJtb2RlIDw9IDEpIHsgLy8gaW50cmEgTUIKKyAgICAgICAgdi0+aXNfaW50cmFbcy0+bWJfeF0gPSAweDNmOyAvLyBTZXQgdGhlIGJpdGZpZWxkIHRvIGFsbCAxLgorICAgICAgICBzLT5tYl9pbnRyYSAgICAgICAgICA9IDE7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdXVswXSA9IDA7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdXVsxXSA9IDA7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW21iX3BvcyArIHYtPm1iX29mZl0gICAgICAgICA9IE1CX1RZUEVfSU5UUkE7CisgICAgICAgIEdFVF9NUVVBTlQoKTsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVttYl9wb3NdID0gbXF1YW50OworICAgICAgICAvKiBTZXQgREMgc2NhbGUgLSB5IGFuZCBjIHVzZSB0aGUgc2FtZSAobm90IHN1cmUgaWYgbmVjZXNzYXJ5IGhlcmUpICovCisgICAgICAgIHMtPnlfZGNfc2NhbGUgPSBzLT55X2RjX3NjYWxlX3RhYmxlW21xdWFudF07CisgICAgICAgIHMtPmNfZGNfc2NhbGUgPSBzLT5jX2RjX3NjYWxlX3RhYmxlW21xdWFudF07CisgICAgICAgIHYtPnMuYWNfcHJlZCAgPSB2LT5hY3ByZWRfcGxhbmVbbWJfcG9zXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIG1iX2hhc19jb2VmZnMgPSBpZHhfbWJtb2RlICYgMTsKKyAgICAgICAgaWYgKG1iX2hhc19jb2VmZnMpCisgICAgICAgICAgICBjYnAgPSAxICsgZ2V0X3ZsYzIoJnYtPnMuZ2IsIHYtPmNicGN5X3ZsYy0+dGFibGUsIFZDMV9JQ0JQQ1lfVkxDX0JJVFMsIDIpOworICAgICAgICBkc3RfaWR4ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgdi0+YV9hdmFpbCA9IHYtPmNfYXZhaWwgICAgICAgICAgPSAwOworICAgICAgICAgICAgdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtpXV0gPSAxOworICAgICAgICAgICAgcy0+ZGNfdmFsWzBdW3MtPmJsb2NrX2luZGV4W2ldXSAgPSAwOworICAgICAgICAgICAgZHN0X2lkeCArPSBpID4+IDI7CisgICAgICAgICAgICB2YWwgPSAoKGNicCA+PiAoNSAtIGkpKSAmIDEpOworICAgICAgICAgICAgaWYgKGkgPT0gMiB8fCBpID09IDMgfHwgIXMtPmZpcnN0X3NsaWNlX2xpbmUpCisgICAgICAgICAgICAgICAgdi0+YV9hdmFpbCA9IHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV0gLSBzLT5ibG9ja193cmFwW2ldXTsKKyAgICAgICAgICAgIGlmIChpID09IDEgfHwgaSA9PSAzIHx8IHMtPm1iX3gpCisgICAgICAgICAgICAgICAgdi0+Y19hdmFpbCA9IHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV0gLSAxXTsKKworICAgICAgICAgICAgdmMxX2RlY29kZV9pbnRyYV9ibG9jayh2LCBzLT5ibG9ja1tpXSwgaSwgdmFsLCBtcXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgPyB2LT5jb2RpbmdzZXQyIDogdi0+Y29kaW5nc2V0KTsKKyAgICAgICAgICAgIGlmICgoaT4zKSAmJiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfOHg4KHMtPmJsb2NrW2ldKTsKKyAgICAgICAgICAgIGlmICh2LT5yYW5nZXJlZGZybSkKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tbaV1bal0gPDw9IDE7CisgICAgICAgICAgICBvZmYgID0gKGkgJiA0KSA/IDAgOiAoKGkgJiAxKSAqIDggKyAoaSAmIDIpICogNCAqIHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgIHMtPmlkc3AucHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZChzLT5ibG9ja1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kZXN0W2RzdF9pZHhdICsgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgPyBzLT51dmxpbmVzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgIC8vIFRPRE86IHlldCB0byBwZXJmb3JtIGxvb3AgZmlsdGVyCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzLT5tYl9pbnRyYSA9IHYtPmlzX2ludHJhW3MtPm1iX3hdID0gMDsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbbWJfcG9zICsgdi0+bWJfb2ZmXSA9IE1CX1RZUEVfMTZ4MTY7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV1dID0gMDsKKyAgICAgICAgaWYgKHYtPmZtYl9pc19yYXcpCisgICAgICAgICAgICBmd2QgPSB2LT5mb3J3YXJkX21iX3BsYW5lW21iX3Bvc10gPSBnZXRfYml0czEoZ2IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmd2QgPSB2LT5mb3J3YXJkX21iX3BsYW5lW21iX3Bvc107CisgICAgICAgIGlmIChpZHhfbWJtb2RlIDw9IDUpIHsgLy8gMS1NVgorICAgICAgICAgICAgaW50IGludGVycG12cCA9IDA7CisgICAgICAgICAgICBkbXZfeFswXSAgICAgPSBkbXZfeFsxXSA9IGRtdl95WzBdID0gZG12X3lbMV0gPSAwOworICAgICAgICAgICAgcHJlZF9mbGFnWzBdID0gcHJlZF9mbGFnWzFdID0gMDsKKyAgICAgICAgICAgIGlmIChmd2QpCisgICAgICAgICAgICAgICAgYm12dHlwZSA9IEJNVl9UWVBFX0ZPUldBUkQ7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBibXZ0eXBlID0gZGVjb2RlMDEyKGdiKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGJtdnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIGJtdnR5cGUgPSBCTVZfVFlQRV9CQUNLV0FSRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBibXZ0eXBlID0gQk1WX1RZUEVfRElSRUNUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGJtdnR5cGUgICA9IEJNVl9UWVBFX0lOVEVSUE9MQVRFRDsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJwbXZwID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2LT5ibXZ0eXBlID0gYm12dHlwZTsKKyAgICAgICAgICAgIGlmIChibXZ0eXBlICE9IEJNVl9UWVBFX0RJUkVDVCAmJiBpZHhfbWJtb2RlICYgMSkgeworICAgICAgICAgICAgICAgIGdldF9tdmRhdGFfaW50ZXJsYWNlZCh2LCAmZG12X3hbYm12dHlwZSA9PSBCTVZfVFlQRV9CQUNLV0FSRF0sICZkbXZfeVtibXZ0eXBlID09IEJNVl9UWVBFX0JBQ0tXQVJEXSwgJnByZWRfZmxhZ1tibXZ0eXBlID09IEJNVl9UWVBFX0JBQ0tXQVJEXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW50ZXJwbXZwKSB7CisgICAgICAgICAgICAgICAgZ2V0X212ZGF0YV9pbnRlcmxhY2VkKHYsICZkbXZfeFsxXSwgJmRtdl95WzFdLCAmcHJlZF9mbGFnWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChibXZ0eXBlID09IEJNVl9UWVBFX0RJUkVDVCkgeworICAgICAgICAgICAgICAgIGRtdl94WzBdID0gZG12X3lbMF0gPSBwcmVkX2ZsYWdbMF0gPSAwOworICAgICAgICAgICAgICAgIGRtdl94WzFdID0gZG12X3lbMV0gPSBwcmVkX2ZsYWdbMF0gPSAwOworICAgICAgICAgICAgICAgIGlmICghcy0+bmV4dF9waWN0dXJlX3B0ci0+ZmllbGRfcGljdHVyZSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1peGVkIGZpZWxkL2ZyYW1lIGRpcmVjdCBtb2RlIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmZfdmMxX3ByZWRfYl9tdl9pbnRmaSh2LCAwLCBkbXZfeCwgZG12X3ksIDEsIHByZWRfZmxhZyk7CisgICAgICAgICAgICB2YzFfYl9tYyh2LCBkbXZfeCwgZG12X3ksIChibXZ0eXBlID09IEJNVl9UWVBFX0RJUkVDVCksIGJtdnR5cGUpOworICAgICAgICAgICAgbWJfaGFzX2NvZWZmcyA9ICEoaWR4X21ibW9kZSAmIDIpOworICAgICAgICB9IGVsc2UgeyAvLyA0LU1WCisgICAgICAgICAgICBpZiAoZndkKQorICAgICAgICAgICAgICAgIGJtdnR5cGUgPSBCTVZfVFlQRV9GT1JXQVJEOworICAgICAgICAgICAgdi0+Ym12dHlwZSAgPSBibXZ0eXBlOworICAgICAgICAgICAgdi0+Zm91cm12YnAgPSBnZXRfdmxjMihnYiwgdi0+Zm91cm12YnBfdmxjLT50YWJsZSwgVkMxXzRNVl9CTE9DS19QQVRURVJOX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgZG12X3hbMF0gPSBkbXZfeVswXSA9IHByZWRfZmxhZ1swXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGRtdl94WzFdID0gZG12X3lbMV0gPSBwcmVkX2ZsYWdbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICB2YWwgPSAoKHYtPmZvdXJtdmJwID4+ICgzIC0gaSkpICYgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tdmRhdGFfaW50ZXJsYWNlZCh2LCAmZG12X3hbYm12dHlwZSA9PSBCTVZfVFlQRV9CQUNLV0FSRF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRtdl95W2JtdnR5cGUgPT0gQk1WX1RZUEVfQkFDS1dBUkRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWRfZmxhZ1tibXZ0eXBlID09IEJNVl9UWVBFX0JBQ0tXQVJEXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmZfdmMxX3ByZWRfYl9tdl9pbnRmaSh2LCBpLCBkbXZfeCwgZG12X3ksIDAsIHByZWRfZmxhZyk7CisgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9tY180bXZfbHVtYSh2LCBpLCBibXZ0eXBlID09IEJNVl9UWVBFX0JBQ0tXQVJELCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgZmZfdmMxX21jXzRtdl9jaHJvbWEodiwgYm12dHlwZSA9PSBCTVZfVFlQRV9CQUNLV0FSRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYl9oYXNfY29lZmZzID0gaWR4X21ibW9kZSAmIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1iX2hhc19jb2VmZnMpCisgICAgICAgICAgICBjYnAgPSAxICsgZ2V0X3ZsYzIoJnYtPnMuZ2IsIHYtPmNicGN5X3ZsYy0+dGFibGUsIFZDMV9DQlBDWV9QX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgaWYgKGNicCkgeworICAgICAgICAgICAgR0VUX01RVUFOVCgpOworICAgICAgICB9CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfcG9zXSA9IG1xdWFudDsKKyAgICAgICAgaWYgKCF2LT50dG1iZiAmJiBjYnApIHsKKyAgICAgICAgICAgIHR0bWIgPSBnZXRfdmxjMihnYiwgZmZfdmMxX3R0bWJfdmxjW3YtPnR0X2luZGV4XS50YWJsZSwgVkMxX1RUTUJfVkxDX0JJVFMsIDIpOworICAgICAgICB9CisgICAgICAgIGRzdF9pZHggPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICBzLT5kY192YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dID0gMDsKKyAgICAgICAgICAgIGRzdF9pZHggKz0gaSA+PiAyOworICAgICAgICAgICAgdmFsID0gKChjYnAgPj4gKDUgLSBpKSkgJiAxKTsKKyAgICAgICAgICAgIG9mZiA9IChpICYgNCkgPyAwIDogKGkgJiAxKSAqIDggKyAoaSAmIDIpICogNCAqIHMtPmxpbmVzaXplOworICAgICAgICAgICAgaWYgKHZhbCkgeworICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfcF9ibG9jayh2LCBzLT5ibG9ja1tpXSwgaSwgbXF1YW50LCB0dG1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9ibG9jaywgcy0+ZGVzdFtkc3RfaWR4XSArIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgJiA0KSA/IHMtPnV2bGluZXNpemUgOiBzLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgJiA0KSAmJiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAoIXYtPnR0bWJmICYmIHR0bWIgPCA4KQorICAgICAgICAgICAgICAgICAgICB0dG1iID0gLTE7CisgICAgICAgICAgICAgICAgZmlyc3RfYmxvY2sgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKiogRGVjb2RlIG9uZSBCLWZyYW1lIE1CIChpbiBpbnRlcmxhY2VkIGZyYW1lIEIgcGljdHVyZSkKKyAqLworc3RhdGljIGludCB2YzFfZGVjb2RlX2JfbWJfaW50ZnIoVkMxQ29udGV4dCAqdikKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOworICAgIGludCBpLCBqOworICAgIGludCBtYl9wb3MgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKKyAgICBpbnQgY2JwID0gMDsgLyogY2JwIGRlY29kaW5nIHN0dWZmICovCisgICAgaW50IG1xZGlmZiwgbXF1YW50OyAvKiBNQiBxdWFudGl6YXRpb24gKi8KKyAgICBpbnQgdHRtYiA9IHYtPnR0ZnJtOyAvKiBNQiBUcmFuc2Zvcm0gdHlwZSAqLworICAgIGludCBtdnN3ID0gMDsgLyogbW90aW9uIHZlY3RvciBzd2l0Y2ggKi8KKyAgICBpbnQgbWJfaGFzX2NvZWZmcyA9IDE7IC8qIGxhc3RfZmxhZyAqLworICAgIGludCBkbXZfeCwgZG12X3k7IC8qIERpZmZlcmVudGlhbCBNViBjb21wb25lbnRzICovCisgICAgaW50IHZhbDsgLyogdGVtcCB2YWx1ZSAqLworICAgIGludCBmaXJzdF9ibG9jayA9IDE7CisgICAgaW50IGRzdF9pZHgsIG9mZjsKKyAgICBpbnQgc2tpcHBlZCwgZGlyZWN0LCB0d29tdiA9IDA7CisgICAgaW50IGJsb2NrX2NicCA9IDAsIHBhdCwgYmxvY2tfdHQgPSAwOworICAgIGludCBpZHhfbWJtb2RlID0gMCwgbXZicDsKKyAgICBpbnQgc3RyaWRlX3ksIGZpZWxkdHg7CisgICAgaW50IGJtdnR5cGUgPSBCTVZfVFlQRV9CQUNLV0FSRDsKKyAgICBpbnQgZGlyLCBkaXIyOworCisgICAgbXF1YW50ID0gdi0+cHE7IC8qIExvc3N5IGluaXRpYWxpemF0aW9uICovCisgICAgcy0+bWJfaW50cmEgPSAwOworICAgIGlmICh2LT5za2lwX2lzX3JhdykKKyAgICAgICAgc2tpcHBlZCA9IGdldF9iaXRzMShnYik7CisgICAgZWxzZQorICAgICAgICBza2lwcGVkID0gdi0+cy5tYnNraXBfdGFibGVbbWJfcG9zXTsKKworICAgIGlmICghc2tpcHBlZCkgeworICAgICAgICBpZHhfbWJtb2RlID0gZ2V0X3ZsYzIoZ2IsIHYtPm1ibW9kZV92bGMtPnRhYmxlLCBWQzFfSU5URlJfTk9ONE1WX01CTU9ERV9WTENfQklUUywgMik7CisgICAgICAgIGlmIChmZl92YzFfbWJtb2RlX2ludGZycFswXVtpZHhfbWJtb2RlXVswXSA9PSBNVl9QTU9ERV9JTlRGUl8yTVZfRklFTEQpIHsKKyAgICAgICAgICAgIHR3b212ID0gMTsKKyAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzBdXSA9IDE7CisgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFsxXV0gPSAxOworICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbMl1dID0gMTsKKyAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzNdXSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFswXV0gPSAwOworICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbMV1dID0gMDsKKyAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzJdXSA9IDA7CisgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFszXV0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHYtPmRtYl9pc19yYXcpCisgICAgICAgIGRpcmVjdCA9IGdldF9iaXRzMShnYik7CisgICAgZWxzZQorICAgICAgICBkaXJlY3QgPSB2LT5kaXJlY3RfbWJfcGxhbmVbbWJfcG9zXTsKKworICAgIGlmIChkaXJlY3QpIHsKKyAgICAgICAgaWYgKHMtPm5leHRfcGljdHVyZV9wdHItPmZpZWxkX3BpY3R1cmUpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiTWl4ZWQgZnJhbWUvZmllbGQgZGlyZWN0IG1vZGUgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHMtPm12WzBdWzBdWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbMF1dWzBdID0gc2NhbGVfbXYocy0+bmV4dF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMF1dWzBdLCB2LT5iZnJhY3Rpb24sIDAsIHMtPnF1YXJ0ZXJfc2FtcGxlKTsKKyAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVtzLT5ibG9ja19pbmRleFswXV1bMV0gPSBzY2FsZV9tdihzLT5uZXh0X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFswXV1bMV0sIHYtPmJmcmFjdGlvbiwgMCwgcy0+cXVhcnRlcl9zYW1wbGUpOworICAgICAgICBzLT5tdlsxXVswXVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdXVswXSA9IHNjYWxlX212KHMtPm5leHRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdXVswXSwgdi0+YmZyYWN0aW9uLCAxLCBzLT5xdWFydGVyX3NhbXBsZSk7CisgICAgICAgIHMtPm12WzFdWzBdWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMF1dWzFdID0gc2NhbGVfbXYocy0+bmV4dF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMF1dWzFdLCB2LT5iZnJhY3Rpb24sIDEsIHMtPnF1YXJ0ZXJfc2FtcGxlKTsKKworICAgICAgICBpZiAodHdvbXYpIHsKKyAgICAgICAgICAgIHMtPm12WzBdWzJdWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbMl1dWzBdID0gc2NhbGVfbXYocy0+bmV4dF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMl1dWzBdLCB2LT5iZnJhY3Rpb24sIDAsIHMtPnF1YXJ0ZXJfc2FtcGxlKTsKKyAgICAgICAgICAgIHMtPm12WzBdWzJdWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbMl1dWzFdID0gc2NhbGVfbXYocy0+bmV4dF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMl1dWzFdLCB2LT5iZnJhY3Rpb24sIDAsIHMtPnF1YXJ0ZXJfc2FtcGxlKTsKKyAgICAgICAgICAgIHMtPm12WzFdWzJdWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMl1dWzBdID0gc2NhbGVfbXYocy0+bmV4dF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMl1dWzBdLCB2LT5iZnJhY3Rpb24sIDEsIHMtPnF1YXJ0ZXJfc2FtcGxlKTsKKyAgICAgICAgICAgIHMtPm12WzFdWzJdWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMl1dWzFdID0gc2NhbGVfbXYocy0+bmV4dF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMl1dWzFdLCB2LT5iZnJhY3Rpb24sIDEsIHMtPnF1YXJ0ZXJfc2FtcGxlKTsKKworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDQ7IGkgKz0gMikgeworICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dWzBdID0gcy0+bXZbMF1baS0xXVswXTsKKyAgICAgICAgICAgICAgICBzLT5tdlswXVtpXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3MtPmJsb2NrX2luZGV4W2ldXVsxXSA9IHMtPm12WzBdW2ktMV1bMV07CisgICAgICAgICAgICAgICAgcy0+bXZbMV1baV1bMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFtpXV1bMF0gPSBzLT5tdlsxXVtpLTFdWzBdOworICAgICAgICAgICAgICAgIHMtPm12WzFdW2ldWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbaV1dWzFdID0gcy0+bXZbMV1baS0xXVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBzLT5tdlswXVtpXVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3MtPmJsb2NrX2luZGV4W2ldXVswXSA9IHMtPm12WzBdWzBdWzBdOworICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dWzFdID0gcy0+bXZbMF1bMF1bMV07CisgICAgICAgICAgICAgICAgcy0+bXZbMV1baV1bMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFtpXV1bMF0gPSBzLT5tdlsxXVswXVswXTsKKyAgICAgICAgICAgICAgICBzLT5tdlsxXVtpXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4W2ldXVsxXSA9IHMtPm12WzFdWzBdWzFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZmX3ZjMV9tYm1vZGVfaW50ZnJwWzBdW2lkeF9tYm1vZGVdWzBdID09IE1WX1BNT0RFX0lOVEZSX0lOVFJBKSB7IC8vIGludHJhIE1CCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIHMtPm12WzBdW2ldWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dWzBdID0gMDsKKyAgICAgICAgICAgIHMtPm12WzBdW2ldWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dWzFdID0gMDsKKyAgICAgICAgICAgIHMtPm12WzFdW2ldWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbaV1dWzBdID0gMDsKKyAgICAgICAgICAgIHMtPm12WzFdW2ldWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbaV1dWzFdID0gMDsKKyAgICAgICAgfQorICAgICAgICB2LT5pc19pbnRyYVtzLT5tYl94XSA9IDB4M2Y7IC8vIFNldCB0aGUgYml0ZmllbGQgdG8gYWxsIDEuCisgICAgICAgIHMtPm1iX2ludHJhICAgICAgICAgID0gMTsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbbWJfcG9zXSA9IE1CX1RZUEVfSU5UUkE7CisgICAgICAgIGZpZWxkdHggPSB2LT5maWVsZHR4X3BsYW5lW21iX3Bvc10gPSBnZXRfYml0czEoZ2IpOworICAgICAgICBtYl9oYXNfY29lZmZzID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKG1iX2hhc19jb2VmZnMpCisgICAgICAgICAgICBjYnAgPSAxICsgZ2V0X3ZsYzIoJnYtPnMuZ2IsIHYtPmNicGN5X3ZsYy0+dGFibGUsIFZDMV9DQlBDWV9QX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgdi0+cy5hY19wcmVkID0gdi0+YWNwcmVkX3BsYW5lW21iX3Bvc10gPSBnZXRfYml0czEoZ2IpOworICAgICAgICBHRVRfTVFVQU5UKCk7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfcG9zXSA9IG1xdWFudDsKKyAgICAgICAgLyogU2V0IERDIHNjYWxlIC0geSBhbmQgYyB1c2UgdGhlIHNhbWUgKG5vdCBzdXJlIGlmIG5lY2Vzc2FyeSBoZXJlKSAqLworICAgICAgICBzLT55X2RjX3NjYWxlID0gcy0+eV9kY19zY2FsZV90YWJsZVttcXVhbnRdOworICAgICAgICBzLT5jX2RjX3NjYWxlID0gcy0+Y19kY19zY2FsZV90YWJsZVttcXVhbnRdOworICAgICAgICBkc3RfaWR4ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgdi0+YV9hdmFpbCA9IHYtPmNfYXZhaWwgICAgICAgICAgPSAwOworICAgICAgICAgICAgdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtpXV0gPSAxOworICAgICAgICAgICAgcy0+ZGNfdmFsWzBdW3MtPmJsb2NrX2luZGV4W2ldXSAgPSAwOworICAgICAgICAgICAgZHN0X2lkeCArPSBpID4+IDI7CisgICAgICAgICAgICB2YWwgPSAoKGNicCA+PiAoNSAtIGkpKSAmIDEpOworICAgICAgICAgICAgaWYgKGkgPT0gMiB8fCBpID09IDMgfHwgIXMtPmZpcnN0X3NsaWNlX2xpbmUpCisgICAgICAgICAgICAgICAgdi0+YV9hdmFpbCA9IHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV0gLSBzLT5ibG9ja193cmFwW2ldXTsKKyAgICAgICAgICAgIGlmIChpID09IDEgfHwgaSA9PSAzIHx8IHMtPm1iX3gpCisgICAgICAgICAgICAgICAgdi0+Y19hdmFpbCA9IHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV0gLSAxXTsKKworICAgICAgICAgICAgdmMxX2RlY29kZV9pbnRyYV9ibG9jayh2LCBzLT5ibG9ja1tpXSwgaSwgdmFsLCBtcXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgPyB2LT5jb2RpbmdzZXQyIDogdi0+Y29kaW5nc2V0KTsKKyAgICAgICAgICAgIGlmIChpID4gMyAmJiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfOHg4KHMtPmJsb2NrW2ldKTsKKyAgICAgICAgICAgIGlmIChpIDwgNCkgeworICAgICAgICAgICAgICAgIHN0cmlkZV95ID0gcy0+bGluZXNpemUgPDwgZmllbGR0eDsKKyAgICAgICAgICAgICAgICBvZmYgPSAoZmllbGR0eCkgPyAoKGkgJiAxKSAqIDgpICsgKChpICYgMikgPj4gMSkgKiBzLT5saW5lc2l6ZSA6IChpICYgMSkgKiA4ICsgNCAqIChpICYgMikgKiBzLT5saW5lc2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyaWRlX3kgPSBzLT51dmxpbmVzaXplOworICAgICAgICAgICAgICAgIG9mZiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5pZHNwLnB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQocy0+YmxvY2tbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdFtkc3RfaWR4XSArIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGVfeSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzLT5tYl9pbnRyYSA9IHYtPmlzX2ludHJhW3MtPm1iX3hdID0gMDsKKyAgICAgICAgaWYgKCFkaXJlY3QpIHsKKyAgICAgICAgICAgIGlmIChza2lwcGVkIHx8ICFzLT5tYl9pbnRyYSkgeworICAgICAgICAgICAgICAgIGJtdnR5cGUgPSBkZWNvZGUwMTIoZ2IpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYm12dHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgYm12dHlwZSA9ICh2LT5iZnJhY3Rpb24gPj0gKEJfRlJBQ1RJT05fREVOLzIpKSA/IEJNVl9UWVBFX0JBQ0tXQVJEIDogQk1WX1RZUEVfRk9SV0FSRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBibXZ0eXBlID0gKHYtPmJmcmFjdGlvbiA+PSAoQl9GUkFDVElPTl9ERU4vMikpID8gQk1WX1RZUEVfRk9SV0FSRCA6IEJNVl9UWVBFX0JBQ0tXQVJEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGJtdnR5cGUgID0gQk1WX1RZUEVfSU5URVJQT0xBVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR3b212ICYmIGJtdnR5cGUgIT0gQk1WX1RZUEVfSU5URVJQT0xBVEVEKQorICAgICAgICAgICAgICAgIG12c3cgPSBnZXRfYml0czEoZ2IpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFza2lwcGVkKSB7IC8vIGludGVyIE1CCisgICAgICAgICAgICBtYl9oYXNfY29lZmZzID0gZmZfdmMxX21ibW9kZV9pbnRmcnBbMF1baWR4X21ibW9kZV1bM107CisgICAgICAgICAgICBpZiAobWJfaGFzX2NvZWZmcykKKyAgICAgICAgICAgICAgICBjYnAgPSAxICsgZ2V0X3ZsYzIoJnYtPnMuZ2IsIHYtPmNicGN5X3ZsYy0+dGFibGUsIFZDMV9DQlBDWV9QX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgIGlmICghZGlyZWN0KSB7CisgICAgICAgICAgICAgICAgaWYgKGJtdnR5cGUgPT0gQk1WX1RZUEVfSU5URVJQT0xBVEVEICYmIHR3b212KSB7CisgICAgICAgICAgICAgICAgICAgIHYtPmZvdXJtdmJwID0gZ2V0X3ZsYzIoZ2IsIHYtPmZvdXJtdmJwX3ZsYy0+dGFibGUsIFZDMV80TVZfQkxPQ0tfUEFUVEVSTl9WTENfQklUUywgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChibXZ0eXBlID09IEJNVl9UWVBFX0lOVEVSUE9MQVRFRCB8fCB0d29tdikgeworICAgICAgICAgICAgICAgICAgICB2LT50d29tdmJwID0gZ2V0X3ZsYzIoZ2IsIHYtPnR3b212YnBfdmxjLT50YWJsZSwgVkMxXzJNVl9CTE9DS19QQVRURVJOX1ZMQ19CSVRTLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICAgICAgdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtpXV0gPSAwOworICAgICAgICAgICAgZmllbGR0eCA9IHYtPmZpZWxkdHhfcGxhbmVbbWJfcG9zXSA9IGZmX3ZjMV9tYm1vZGVfaW50ZnJwWzBdW2lkeF9tYm1vZGVdWzFdOworICAgICAgICAgICAgLyogZm9yIGFsbCBtb3Rpb24gdmVjdG9yIHJlYWQgTVZEQVRBIGFuZCBtb3Rpb24gY29tcGVuc2F0ZSBlYWNoIGJsb2NrICovCisgICAgICAgICAgICBkc3RfaWR4ID0gMDsKKyAgICAgICAgICAgIGlmIChkaXJlY3QpIHsKKyAgICAgICAgICAgICAgICBpZiAodHdvbXYpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX21jXzRtdl9sdW1hKHYsIGksIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgZmZfdmMxX21jXzRtdl9sdW1hKHYsIGksIDEsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9tY180bXZfY2hyb21hNCh2LCAwLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmZfdmMxX21jXzRtdl9jaHJvbWE0KHYsIDEsIDEsIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9tY18xbXYodiwgMCk7CisgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9pbnRlcnBfbWModik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0d29tdiAmJiBibXZ0eXBlID09IEJNVl9UWVBFX0lOVEVSUE9MQVRFRCkgeworICAgICAgICAgICAgICAgIG12YnAgPSB2LT5mb3VybXZicDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRpciA9IGk9PTEgfHwgaT09MzsKKyAgICAgICAgICAgICAgICAgICAgZG12X3ggPSBkbXZfeSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9ICgobXZicCA+PiAoMyAtIGkpKSAmIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X212ZGF0YV9pbnRlcmxhY2VkKHYsICZkbXZfeCwgJmRtdl95LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGkgPiAxID8gMiA6IDA7CisgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9wcmVkX212X2ludGZyKHYsIGosIGRtdl94LCBkbXZfeSwgMiwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgZmZfdmMxX21jXzRtdl9sdW1hKHYsIGosIGRpciwgZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgZmZfdmMxX21jXzRtdl9sdW1hKHYsIGorMSwgZGlyLCBkaXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZmX3ZjMV9tY180bXZfY2hyb21hNCh2LCAwLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBmZl92YzFfbWNfNG12X2Nocm9tYTQodiwgMSwgMSwgMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJtdnR5cGUgPT0gQk1WX1RZUEVfSU5URVJQT0xBVEVEKSB7CisgICAgICAgICAgICAgICAgbXZicCA9IHYtPnR3b212YnA7CisgICAgICAgICAgICAgICAgZG12X3ggPSBkbXZfeSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG12YnAgJiAyKQorICAgICAgICAgICAgICAgICAgICBnZXRfbXZkYXRhX2ludGVybGFjZWQodiwgJmRtdl94LCAmZG12X3ksIDApOworCisgICAgICAgICAgICAgICAgZmZfdmMxX3ByZWRfbXZfaW50ZnIodiwgMCwgZG12X3gsIGRtdl95LCAxLCB2LT5yYW5nZV94LCB2LT5yYW5nZV95LCB2LT5tYl90eXBlWzBdLCAwKTsKKyAgICAgICAgICAgICAgICBmZl92YzFfbWNfMW12KHYsIDApOworCisgICAgICAgICAgICAgICAgZG12X3ggPSBkbXZfeSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG12YnAgJiAxKQorICAgICAgICAgICAgICAgICAgICBnZXRfbXZkYXRhX2ludGVybGFjZWQodiwgJmRtdl94LCAmZG12X3ksIDApOworCisgICAgICAgICAgICAgICAgZmZfdmMxX3ByZWRfbXZfaW50ZnIodiwgMCwgZG12X3gsIGRtdl95LCAxLCB2LT5yYW5nZV94LCB2LT5yYW5nZV95LCB2LT5tYl90eXBlWzBdLCAxKTsKKyAgICAgICAgICAgICAgICBmZl92YzFfaW50ZXJwX21jKHYpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0d29tdikgeworICAgICAgICAgICAgICAgIGRpciA9IGJtdnR5cGUgPT0gQk1WX1RZUEVfQkFDS1dBUkQ7CisgICAgICAgICAgICAgICAgZGlyMiA9IGRpcjsKKyAgICAgICAgICAgICAgICBpZiAobXZzdykKKyAgICAgICAgICAgICAgICAgICAgZGlyMiA9ICFkaXI7CisgICAgICAgICAgICAgICAgbXZicCA9IHYtPnR3b212YnA7CisgICAgICAgICAgICAgICAgZG12X3ggPSBkbXZfeSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG12YnAgJiAyKQorICAgICAgICAgICAgICAgICAgICBnZXRfbXZkYXRhX2ludGVybGFjZWQodiwgJmRtdl94LCAmZG12X3ksIDApOworICAgICAgICAgICAgICAgIGZmX3ZjMV9wcmVkX212X2ludGZyKHYsIDAsIGRtdl94LCBkbXZfeSwgMiwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgZGlyKTsKKworICAgICAgICAgICAgICAgIGRtdl94ID0gZG12X3kgPSAwOworICAgICAgICAgICAgICAgIGlmIChtdmJwICYgMSkKKyAgICAgICAgICAgICAgICAgICAgZ2V0X212ZGF0YV9pbnRlcmxhY2VkKHYsICZkbXZfeCwgJmRtdl95LCAwKTsKKyAgICAgICAgICAgICAgICBmZl92YzFfcHJlZF9tdl9pbnRmcih2LCAyLCBkbXZfeCwgZG12X3ksIDIsIHYtPnJhbmdlX3gsIHYtPnJhbmdlX3ksIHYtPm1iX3R5cGVbMF0sIGRpcjIpOworCisgICAgICAgICAgICAgICAgaWYgKG12c3cpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVtpKzJdWzBdID0gcy0+bXZbZGlyXVtpXVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1bcy0+YmxvY2tfaW5kZXhbaSsyXV1bMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3MtPmJsb2NrX2luZGV4W2ldXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1baSsyXVsxXSA9IHMtPm12W2Rpcl1baV1bMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3MtPmJsb2NrX2luZGV4W2krMl1dWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVtzLT5ibG9ja19pbmRleFtpXV1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltkaXIyXVtpKzJdWzBdID0gcy0+bXZbZGlyMl1baV1bMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXIyXVtzLT5ibG9ja19pbmRleFtpXV1bMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXIyXVtzLT5ibG9ja19pbmRleFtpKzJdXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2RpcjJdW2krMl1bMV0gPSBzLT5tdltkaXIyXVtpXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2RpcjJdW3MtPmJsb2NrX2luZGV4W2ldXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2RpcjJdW3MtPmJsb2NrX2luZGV4W2krMl1dWzFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmZfdmMxX3ByZWRfbXZfaW50ZnIodiwgMCwgMCwgMCwgMiwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgIWRpcik7CisgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9wcmVkX212X2ludGZyKHYsIDIsIDAsIDAsIDIsIHYtPnJhbmdlX3gsIHYtPnJhbmdlX3ksIHYtPm1iX3R5cGVbMF0sICFkaXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZmX3ZjMV9tY180bXZfbHVtYSh2LCAwLCBkaXIsIDApOworICAgICAgICAgICAgICAgIGZmX3ZjMV9tY180bXZfbHVtYSh2LCAxLCBkaXIsIDApOworICAgICAgICAgICAgICAgIGZmX3ZjMV9tY180bXZfbHVtYSh2LCAyLCBkaXIyLCAwKTsKKyAgICAgICAgICAgICAgICBmZl92YzFfbWNfNG12X2x1bWEodiwgMywgZGlyMiwgMCk7CisgICAgICAgICAgICAgICAgZmZfdmMxX21jXzRtdl9jaHJvbWE0KHYsIGRpciwgZGlyMiwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpciA9IGJtdnR5cGUgPT0gQk1WX1RZUEVfQkFDS1dBUkQ7CisKKyAgICAgICAgICAgICAgICBtdmJwID0gZmZfdmMxX21ibW9kZV9pbnRmcnBbMF1baWR4X21ibW9kZV1bMl07CisgICAgICAgICAgICAgICAgZG12X3ggPSBkbXZfeSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG12YnApCisgICAgICAgICAgICAgICAgICAgIGdldF9tdmRhdGFfaW50ZXJsYWNlZCh2LCAmZG12X3gsICZkbXZfeSwgMCk7CisKKyAgICAgICAgICAgICAgICBmZl92YzFfcHJlZF9tdl9pbnRmcih2LCAwLCBkbXZfeCwgZG12X3ksIDEsIHYtPnJhbmdlX3gsIHYtPnJhbmdlX3ksIHYtPm1iX3R5cGVbMF0sIGRpcik7CisgICAgICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbMF1dID0gMTsKKyAgICAgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFsxXV0gPSAxOworICAgICAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzJdXSA9IDE7CisgICAgICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbM11dID0gMTsKKyAgICAgICAgICAgICAgICBmZl92YzFfcHJlZF9tdl9pbnRmcih2LCAwLCAwLCAwLCAyLCB2LT5yYW5nZV94LCB2LT5yYW5nZV95LCAwLCAhZGlyKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPm12WyFkaXJdW2krMl1bMF0gPSBzLT5tdlshZGlyXVtpXVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWyFkaXJdW3MtPmJsb2NrX2luZGV4W2krMl1dWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbIWRpcl1bcy0+YmxvY2tfaW5kZXhbaV1dWzBdOworICAgICAgICAgICAgICAgICAgICBzLT5tdlshZGlyXVtpKzJdWzFdID0gcy0+bXZbIWRpcl1baV1bMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFshZGlyXVtzLT5ibG9ja19pbmRleFtpKzJdXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWyFkaXJdW3MtPmJsb2NrX2luZGV4W2ldXVsxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmZfdmMxX21jXzFtdih2LCBkaXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2JwKQorICAgICAgICAgICAgICAgIEdFVF9NUVVBTlQoKTsgIC8vIHAuIDIyNworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVttYl9wb3NdID0gbXF1YW50OworICAgICAgICAgICAgaWYgKCF2LT50dG1iZiAmJiBjYnApCisgICAgICAgICAgICAgICAgdHRtYiA9IGdldF92bGMyKGdiLCBmZl92YzFfdHRtYl92bGNbdi0+dHRfaW5kZXhdLnRhYmxlLCBWQzFfVFRNQl9WTENfQklUUywgMik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgcy0+ZGNfdmFsWzBdW3MtPmJsb2NrX2luZGV4W2ldXSA9IDA7CisgICAgICAgICAgICAgICAgZHN0X2lkeCArPSBpID4+IDI7CisgICAgICAgICAgICAgICAgdmFsID0gKChjYnAgPj4gKDUgLSBpKSkgJiAxKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZpZWxkdHgpCisgICAgICAgICAgICAgICAgICAgIG9mZiA9IChpICYgNCkgPyAwIDogKChpICYgMSkgKiA4ICsgKGkgJiAyKSAqIDQgKiBzLT5saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvZmYgPSAoaSAmIDQpID8gMCA6ICgoaSAmIDEpICogOCArICgoaSA+IDEpICogcy0+bGluZXNpemUpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdCA9IHZjMV9kZWNvZGVfcF9ibG9jayh2LCBzLT5ibG9ja1tpXSwgaSwgbXF1YW50LCB0dG1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfYmxvY2ssIHMtPmRlc3RbZHN0X2lkeF0gKyBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSAmIDQpID8gcy0+dXZsaW5lc2l6ZSA6IChzLT5saW5lc2l6ZSA8PCBmaWVsZHR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgJiYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSwgJmJsb2NrX3R0KTsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfY2JwIHw9IHBhdCA8PCAoaSA8PCAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF2LT50dG1iZiAmJiB0dG1iIDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0bWIgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RfYmxvY2sgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeyAvLyBza2lwcGVkCisgICAgICAgICAgICBkaXIgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgICAgIHYtPm1iX3R5cGVbMF1bcy0+YmxvY2tfaW5kZXhbaV1dID0gMDsKKyAgICAgICAgICAgICAgICBzLT5kY192YWxbMF1bcy0+YmxvY2tfaW5kZXhbaV1dID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW21iX3Bvc10gICAgICA9IE1CX1RZUEVfU0tJUDsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5xc2NhbGVfdGFibGVbbWJfcG9zXSA9IDA7CisgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFswXV0gPSAwOworICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbMV1dID0gMDsKKyAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzJdXSA9IDA7CisgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFszXV0gPSAwOworCisgICAgICAgICAgICBpZiAoIWRpcmVjdCkgeworICAgICAgICAgICAgICAgIGlmIChibXZ0eXBlID09IEJNVl9UWVBFX0lOVEVSUE9MQVRFRCkgeworICAgICAgICAgICAgICAgICAgICBmZl92YzFfcHJlZF9tdl9pbnRmcih2LCAwLCAwLCAwLCAxLCB2LT5yYW5nZV94LCB2LT5yYW5nZV95LCB2LT5tYl90eXBlWzBdLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmZfdmMxX3ByZWRfbXZfaW50ZnIodiwgMCwgMCwgMCwgMSwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGlyID0gYm12dHlwZSA9PSBCTVZfVFlQRV9CQUNLV0FSRDsKKyAgICAgICAgICAgICAgICAgICAgZmZfdmMxX3ByZWRfbXZfaW50ZnIodiwgMCwgMCwgMCwgMSwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG12c3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIyID0gZGlyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG12c3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyMiA9ICFkaXI7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVtpKzJdWzBdID0gcy0+bXZbZGlyXVtpXVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1bcy0+YmxvY2tfaW5kZXhbaSsyXV1bMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3MtPmJsb2NrX2luZGV4W2ldXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltkaXJdW2krMl1bMV0gPSBzLT5tdltkaXJdW2ldWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVtzLT5ibG9ja19pbmRleFtpKzJdXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1bcy0+YmxvY2tfaW5kZXhbaV1dWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2RpcjJdW2krMl1bMF0gPSBzLT5tdltkaXIyXVtpXVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2RpcjJdW3MtPmJsb2NrX2luZGV4W2ldXVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2RpcjJdW3MtPmJsb2NrX2luZGV4W2krMl1dWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2RpcjJdW2krMl1bMV0gPSBzLT5tdltkaXIyXVtpXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2RpcjJdW3MtPmJsb2NrX2luZGV4W2ldXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2RpcjJdW3MtPmJsb2NrX2luZGV4W2krMl1dWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbMF1dID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPmJsa19tdl90eXBlW3MtPmJsb2NrX2luZGV4WzFdXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFsyXV0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbM11dID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX3ZjMV9wcmVkX212X2ludGZyKHYsIDAsIDAsIDAsIDIsIHYtPnJhbmdlX3gsIHYtPnJhbmdlX3ksIDAsICFkaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WyFkaXJdW2krMl1bMF0gPSBzLT5tdlshZGlyXVtpXVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWyFkaXJdW3MtPmJsb2NrX2luZGV4W2krMl1dWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbIWRpcl1bcy0+YmxvY2tfaW5kZXhbaV1dWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WyFkaXJdW2krMl1bMV0gPSBzLT5tdlshZGlyXVtpXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWyFkaXJdW3MtPmJsb2NrX2luZGV4W2krMl1dWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbIWRpcl1bcy0+YmxvY2tfaW5kZXhbaV1dWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmZl92YzFfbWNfMW12KHYsIGRpcik7CisgICAgICAgICAgICBpZiAoZGlyZWN0IHx8IGJtdnR5cGUgPT0gQk1WX1RZUEVfSU5URVJQT0xBVEVEKSB7CisgICAgICAgICAgICAgICAgZmZfdmMxX2ludGVycF9tYyh2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+bWJfeCA9PSBzLT5tYl93aWR0aCAtIDEpCisgICAgICAgIG1lbW1vdmUodi0+aXNfaW50cmFfYmFzZSwgdi0+aXNfaW50cmEsIHNpemVvZih2LT5pc19pbnRyYV9iYXNlWzBdKSAqIHMtPm1iX3N0cmlkZSk7CisgICAgdi0+Y2JwW3MtPm1iX3hdICAgICAgPSBibG9ja19jYnA7CisgICAgdi0+dHRibGtbcy0+bWJfeF0gICAgPSBibG9ja190dDsKKyAgICByZXR1cm4gMDsKK30KKworLyoqIERlY29kZSBibG9ja3Mgb2YgSS1mcmFtZQorICovCitzdGF0aWMgdm9pZCB2YzFfZGVjb2RlX2lfYmxvY2tzKFZDMUNvbnRleHQgKnYpCit7CisgICAgaW50IGssIGo7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdi0+czsKKyAgICBpbnQgY2JwLCB2YWw7CisgICAgdWludDhfdCAqY29kZWRfdmFsOworICAgIGludCBtYl9wb3M7CisKKyAgICAvKiBzZWxlY3QgY29kaW5nbW9kZSB1c2VkIGZvciBWTEMgdGFibGVzIHNlbGVjdGlvbiAqLworICAgIHN3aXRjaCAodi0+eV9hY190YWJsZV9pbmRleCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgdi0+Y29kaW5nc2V0ID0gKHYtPnBxaW5kZXggPD0gOCkgPyBDU19ISUdIX1JBVEVfSU5UUkEgOiBDU19MT1dfTU9UX0lOVFJBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHYtPmNvZGluZ3NldCA9IENTX0hJR0hfTU9UX0lOVFJBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHYtPmNvZGluZ3NldCA9IENTX01JRF9SQVRFX0lOVFJBOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHYtPmNfYWNfdGFibGVfaW5kZXgpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHYtPmNvZGluZ3NldDIgPSAodi0+cHFpbmRleCA8PSA4KSA/IENTX0hJR0hfUkFURV9JTlRFUiA6IENTX0xPV19NT1RfSU5URVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgdi0+Y29kaW5nc2V0MiA9IENTX0hJR0hfTU9UX0lOVEVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHYtPmNvZGluZ3NldDIgPSBDU19NSURfUkFURV9JTlRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogU2V0IERDIHNjYWxlIC0geSBhbmQgYyB1c2UgdGhlIHNhbWUgKi8KKyAgICBzLT55X2RjX3NjYWxlID0gcy0+eV9kY19zY2FsZV90YWJsZVt2LT5wcV07CisgICAgcy0+Y19kY19zY2FsZSA9IHMtPmNfZGNfc2NhbGVfdGFibGVbdi0+cHFdOworCisgICAgLy9kbyBmcmFtZSBkZWNvZGUKKyAgICBzLT5tYl94ID0gcy0+bWJfeSA9IDA7CisgICAgcy0+bWJfaW50cmEgICAgICAgICA9IDE7CisgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZSA9IDE7CisgICAgZm9yIChzLT5tYl95ID0gMDsgcy0+bWJfeSA8IHMtPmVuZF9tYl95OyBzLT5tYl95KyspIHsKKyAgICAgICAgcy0+bWJfeCA9IDA7CisgICAgICAgIGluaXRfYmxvY2tfaW5kZXgodik7CisgICAgICAgIGZvciAoOyBzLT5tYl94IDwgdi0+ZW5kX21iX3g7IHMtPm1iX3grKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0WzZdOworICAgICAgICAgICAgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KHMpOworICAgICAgICAgICAgZHN0WzBdID0gcy0+ZGVzdFswXTsKKyAgICAgICAgICAgIGRzdFsxXSA9IGRzdFswXSArIDg7CisgICAgICAgICAgICBkc3RbMl0gPSBzLT5kZXN0WzBdICsgcy0+bGluZXNpemUgKiA4OworICAgICAgICAgICAgZHN0WzNdID0gZHN0WzJdICsgODsKKyAgICAgICAgICAgIGRzdFs0XSA9IHMtPmRlc3RbMV07CisgICAgICAgICAgICBkc3RbNV0gPSBzLT5kZXN0WzJdOworICAgICAgICAgICAgcy0+YmRzcC5jbGVhcl9ibG9ja3Mocy0+YmxvY2tbMF0pOworICAgICAgICAgICAgbWJfcG9zID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl93aWR0aDsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW21iX3Bvc10gICAgICAgICAgICAgICAgICAgICA9IE1CX1RZUEVfSU5UUkE7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3Bvc10gICAgICAgICAgICAgICAgPSB2LT5wcTsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdXVswXSA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFswXV1bMV0gPSAwOworCisgICAgICAgICAgICAvLyBkbyBhY3R1YWwgTUIgZGVjb2RpbmcgYW5kIGRpc3BsYXlpbmcKKyAgICAgICAgICAgIGNicCA9IGdldF92bGMyKCZ2LT5zLmdiLCBmZl9tc21wNF9tYl9pX3ZsYy50YWJsZSwgTUJfSU5UUkFfVkxDX0JJVFMsIDIpOworICAgICAgICAgICAgdi0+cy5hY19wcmVkID0gZ2V0X2JpdHMxKCZ2LT5zLmdiKTsKKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDY7IGsrKykgeworICAgICAgICAgICAgICAgIHZhbCA9ICgoY2JwID4+ICg1IC0gaykpICYgMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoayA8IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHByZWQgICA9IHZjMV9jb2RlZF9ibG9ja19wcmVkKCZ2LT5zLCBrLCAmY29kZWRfdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICAgICAgICA9IHZhbCBeIHByZWQ7CisgICAgICAgICAgICAgICAgICAgICpjb2RlZF92YWwgPSB2YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNicCB8PSB2YWwgPDwgKDUgLSBrKTsKKworICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfaV9ibG9jayh2LCBzLT5ibG9ja1trXSwgaywgdmFsLCAoayA8IDQpID8gdi0+Y29kaW5nc2V0IDogdi0+Y29kaW5nc2V0Mik7CisKKyAgICAgICAgICAgICAgICBpZiAoayA+IDMgJiYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfOHg4KHMtPmJsb2NrW2tdKTsKKyAgICAgICAgICAgICAgICBpZiAodi0+cHEgPj0gOSAmJiB2LT5vdmVybGFwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2LT5yYW5nZXJlZGZybSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrW2tdW2pdIDw8PSAxOworICAgICAgICAgICAgICAgICAgICBzLT5pZHNwLnB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQocy0+YmxvY2tba10sIGRzdFtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgJiA0ID8gcy0+dXZsaW5lc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzLT5saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYtPnJhbmdlcmVkZnJtKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tba11bal0gPSAocy0+YmxvY2tba11bal0gLSA2NCkgPDwgMTsKKyAgICAgICAgICAgICAgICAgICAgcy0+aWRzcC5wdXRfcGl4ZWxzX2NsYW1wZWQocy0+YmxvY2tba10sIGRzdFtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayAmIDQgPyBzLT51dmxpbmVzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcy0+bGluZXNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHYtPnBxID49IDkgJiYgdi0+b3ZlcmxhcCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5tYl94KSB7CisgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9vdmVybGFwKHMtPmRlc3RbMF0sIHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9oX292ZXJsYXAocy0+ZGVzdFswXSArIDggKiBzLT5saW5lc2l6ZSwgcy0+bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9vdmVybGFwKHMtPmRlc3RbMV0sIHMtPnV2bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9oX292ZXJsYXAocy0+ZGVzdFsyXSwgcy0+dXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9oX292ZXJsYXAocy0+ZGVzdFswXSArIDgsIHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX2hfb3ZlcmxhcChzLT5kZXN0WzBdICsgOCAqIHMtPmxpbmVzaXplICsgOCwgcy0+bGluZXNpemUpOworICAgICAgICAgICAgICAgIGlmICghcy0+Zmlyc3Rfc2xpY2VfbGluZSkgeworICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3Zfb3ZlcmxhcChzLT5kZXN0WzBdLCBzLT5saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfdl9vdmVybGFwKHMtPmRlc3RbMF0gKyA4LCBzLT5saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV92X292ZXJsYXAocy0+ZGVzdFsxXSwgcy0+dXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3Zfb3ZlcmxhcChzLT5kZXN0WzJdLCBzLT51dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3Zfb3ZlcmxhcChzLT5kZXN0WzBdICsgOCAqIHMtPmxpbmVzaXplLCBzLT5saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV92X292ZXJsYXAocy0+ZGVzdFswXSArIDggKiBzLT5saW5lc2l6ZSArIDgsIHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2LT5zLmxvb3BfZmlsdGVyKQorICAgICAgICAgICAgICAgIGZmX3ZjMV9sb29wX2ZpbHRlcl9pYmxrKHYsIHYtPnBxKTsKKworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2NvdW50KCZzLT5nYikgPiB2LT5iaXRzKSB7CisgICAgICAgICAgICAgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgMCwgMCwgcy0+bWJfeCwgcy0+bWJfeSwgRVJfTUJfRVJST1IpOworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQml0cyBvdmVyY29uc3VtcHRpb246ICVpID4gJWlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzX2NvdW50KCZzLT5nYiksIHYtPmJpdHMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXYtPnMubG9vcF9maWx0ZXIpCisgICAgICAgICAgICBmZl9tcGVnX2RyYXdfaG9yaXpfYmFuZChzLCBzLT5tYl95ICogMTYsIDE2KTsKKyAgICAgICAgZWxzZSBpZiAocy0+bWJfeSkKKyAgICAgICAgICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIChzLT5tYl95IC0gMSkgKiAxNiwgMTYpOworCisgICAgICAgIHMtPmZpcnN0X3NsaWNlX2xpbmUgPSAwOworICAgIH0KKyAgICBpZiAodi0+cy5sb29wX2ZpbHRlcikKKyAgICAgICAgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQocywgKHMtPmVuZF9tYl95IC0gMSkgKiAxNiwgMTYpOworCisgICAgLyogVGhpcyBpcyBpbnRlbnRpb25hbGx5IG1iX2hlaWdodCBhbmQgbm90IGVuZF9tYl95IC0gdW5saWtlIGluIGFkdmFuY2VkCisgICAgICogcHJvZmlsZSwgdGhlc2Ugb25seSBkaWZmZXIgYXJlIHdoZW4gZGVjb2RpbmcgTVNTMiByZWN0YW5nbGVzLiAqLworICAgIGZmX2VyX2FkZF9zbGljZSgmcy0+ZXIsIDAsIDAsIHMtPm1iX3dpZHRoIC0gMSwgcy0+bWJfaGVpZ2h0IC0gMSwgRVJfTUJfRU5EKTsKK30KKworLyoqIERlY29kZSBibG9ja3Mgb2YgSS1mcmFtZSBmb3IgYWR2YW5jZWQgcHJvZmlsZQorICovCitzdGF0aWMgdm9pZCB2YzFfZGVjb2RlX2lfYmxvY2tzX2FkdihWQzFDb250ZXh0ICp2KQoreworICAgIGludCBrOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgaW50IGNicCwgdmFsOworICAgIHVpbnQ4X3QgKmNvZGVkX3ZhbDsKKyAgICBpbnQgbWJfcG9zOworICAgIGludCBtcXVhbnQgPSB2LT5wcTsKKyAgICBpbnQgbXFkaWZmOworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOworCisgICAgLyogc2VsZWN0IGNvZGluZ21vZGUgdXNlZCBmb3IgVkxDIHRhYmxlcyBzZWxlY3Rpb24gKi8KKyAgICBzd2l0Y2ggKHYtPnlfYWNfdGFibGVfaW5kZXgpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHYtPmNvZGluZ3NldCA9ICh2LT5wcWluZGV4IDw9IDgpID8gQ1NfSElHSF9SQVRFX0lOVFJBIDogQ1NfTE9XX01PVF9JTlRSQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICB2LT5jb2RpbmdzZXQgPSBDU19ISUdIX01PVF9JTlRSQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICB2LT5jb2RpbmdzZXQgPSBDU19NSURfUkFURV9JTlRSQTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoICh2LT5jX2FjX3RhYmxlX2luZGV4KSB7CisgICAgY2FzZSAwOgorICAgICAgICB2LT5jb2RpbmdzZXQyID0gKHYtPnBxaW5kZXggPD0gOCkgPyBDU19ISUdIX1JBVEVfSU5URVIgOiBDU19MT1dfTU9UX0lOVEVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHYtPmNvZGluZ3NldDIgPSBDU19ISUdIX01PVF9JTlRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICB2LT5jb2RpbmdzZXQyID0gQ1NfTUlEX1JBVEVfSU5URVI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIGRvIGZyYW1lIGRlY29kZQorICAgIHMtPm1iX3ggICAgICAgICAgICAgPSBzLT5tYl95ID0gMDsKKyAgICBzLT5tYl9pbnRyYSAgICAgICAgID0gMTsKKyAgICBzLT5maXJzdF9zbGljZV9saW5lID0gMTsKKyAgICBzLT5tYl95ICAgICAgICAgICAgID0gcy0+c3RhcnRfbWJfeTsKKyAgICBpZiAocy0+c3RhcnRfbWJfeSkgeworICAgICAgICBzLT5tYl94ID0gMDsKKyAgICAgICAgaW5pdF9ibG9ja19pbmRleCh2KTsKKyAgICAgICAgbWVtc2V0KCZzLT5jb2RlZF9ibG9ja1tzLT5ibG9ja19pbmRleFswXSAtIHMtPmI4X3N0cmlkZV0sIDAsCisgICAgICAgICAgICAgICAoMSArIHMtPmI4X3N0cmlkZSkgKiBzaXplb2YoKnMtPmNvZGVkX2Jsb2NrKSk7CisgICAgfQorICAgIGZvciAoOyBzLT5tYl95IDwgcy0+ZW5kX21iX3k7IHMtPm1iX3krKykgeworICAgICAgICBzLT5tYl94ID0gMDsKKyAgICAgICAgaW5pdF9ibG9ja19pbmRleCh2KTsKKyAgICAgICAgZm9yICg7cy0+bWJfeCA8IHMtPm1iX3dpZHRoOyBzLT5tYl94KyspIHsKKyAgICAgICAgICAgIGludDE2X3QgKCpibG9jaylbNjRdID0gdi0+YmxvY2tbdi0+Y3VyX2Jsa19pZHhdOworICAgICAgICAgICAgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KHMpOworICAgICAgICAgICAgcy0+YmRzcC5jbGVhcl9ibG9ja3MoYmxvY2tbMF0pOworICAgICAgICAgICAgbWJfcG9zID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVttYl9wb3MgKyB2LT5tYl9vZmZdICAgICAgICAgICAgICAgICAgICAgICAgID0gTUJfVFlQRV9JTlRSQTsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdICsgdi0+YmxvY2tzX29mZl1bMF0gPSAwOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMF0gKyB2LT5ibG9ja3Nfb2ZmXVsxXSA9IDA7CisKKyAgICAgICAgICAgIC8vIGRvIGFjdHVhbCBNQiBkZWNvZGluZyBhbmQgZGlzcGxheWluZworICAgICAgICAgICAgaWYgKHYtPmZpZWxkdHhfaXNfcmF3KQorICAgICAgICAgICAgICAgIHYtPmZpZWxkdHhfcGxhbmVbbWJfcG9zXSA9IGdldF9iaXRzMSgmdi0+cy5nYik7CisgICAgICAgICAgICBjYnAgPSBnZXRfdmxjMigmdi0+cy5nYiwgZmZfbXNtcDRfbWJfaV92bGMudGFibGUsIE1CX0lOVFJBX1ZMQ19CSVRTLCAyKTsKKyAgICAgICAgICAgIGlmICggdi0+YWNwcmVkX2lzX3JhdykKKyAgICAgICAgICAgICAgICB2LT5zLmFjX3ByZWQgPSBnZXRfYml0czEoJnYtPnMuZ2IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYtPnMuYWNfcHJlZCA9IHYtPmFjcHJlZF9wbGFuZVttYl9wb3NdOworCisgICAgICAgICAgICBpZiAodi0+Y29uZG92ZXIgPT0gQ09ORE9WRVJfU0VMRUNUICYmIHYtPm92ZXJmbGdfaXNfcmF3KQorICAgICAgICAgICAgICAgIHYtPm92ZXJfZmxhZ3NfcGxhbmVbbWJfcG9zXSA9IGdldF9iaXRzMSgmdi0+cy5nYik7CisKKyAgICAgICAgICAgIEdFVF9NUVVBTlQoKTsKKworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLnFzY2FsZV90YWJsZVttYl9wb3NdID0gbXF1YW50OworICAgICAgICAgICAgLyogU2V0IERDIHNjYWxlIC0geSBhbmQgYyB1c2UgdGhlIHNhbWUgKi8KKyAgICAgICAgICAgIHMtPnlfZGNfc2NhbGUgPSBzLT55X2RjX3NjYWxlX3RhYmxlW21xdWFudF07CisgICAgICAgICAgICBzLT5jX2RjX3NjYWxlID0gcy0+Y19kY19zY2FsZV90YWJsZVttcXVhbnRdOworCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNjsgaysrKSB7CisgICAgICAgICAgICAgICAgdmFsID0gKChjYnAgPj4gKDUgLSBrKSkgJiAxKTsKKworICAgICAgICAgICAgICAgIGlmIChrIDwgNCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZCAgID0gdmMxX2NvZGVkX2Jsb2NrX3ByZWQoJnYtPnMsIGssICZjb2RlZF92YWwpOworICAgICAgICAgICAgICAgICAgICB2YWwgICAgICAgID0gdmFsIF4gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgKmNvZGVkX3ZhbCA9IHZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2JwIHw9IHZhbCA8PCAoNSAtIGspOworCisgICAgICAgICAgICAgICAgdi0+YV9hdmFpbCA9ICFzLT5maXJzdF9zbGljZV9saW5lIHx8IChrID09IDIgfHwgayA9PSAzKTsKKyAgICAgICAgICAgICAgICB2LT5jX2F2YWlsID0gISFzLT5tYl94IHx8IChrID09IDEgfHwgayA9PSAzKTsKKworICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfaV9ibG9ja19hZHYodiwgYmxvY2tba10sIGssIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrIDwgNCkgPyB2LT5jb2RpbmdzZXQgOiB2LT5jb2RpbmdzZXQyLCBtcXVhbnQpOworCisgICAgICAgICAgICAgICAgaWYgKGsgPiAzICYmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzh4OChibG9ja1trXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZmX3ZjMV9zbW9vdGhfb3ZlcmxhcF9maWx0ZXJfaWJsayh2KTsKKyAgICAgICAgICAgIHZjMV9wdXRfc2lnbmVkX2Jsb2Nrc19jbGFtcGVkKHYpOworICAgICAgICAgICAgaWYgKHYtPnMubG9vcF9maWx0ZXIpCisgICAgICAgICAgICAgICAgZmZfdmMxX2xvb3BfZmlsdGVyX2libGtfZGVsYXllZCh2LCB2LT5wcSk7CisKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19jb3VudCgmcy0+Z2IpID4gdi0+Yml0cykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IG1heSBuZWVkIG1vZGlmaWNhdGlvbiB0byBoYW5kbGUgc2xpY2UgY29kaW5nCisgICAgICAgICAgICAgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgMCwgcy0+c3RhcnRfbWJfeSwgcy0+bWJfeCwgcy0+bWJfeSwgRVJfTUJfRVJST1IpOworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQml0cyBvdmVyY29uc3VtcHRpb246ICVpID4gJWlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzX2NvdW50KCZzLT5nYiksIHYtPmJpdHMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXYtPnMubG9vcF9maWx0ZXIpCisgICAgICAgICAgICBmZl9tcGVnX2RyYXdfaG9yaXpfYmFuZChzLCBzLT5tYl95ICogMTYsIDE2KTsKKyAgICAgICAgZWxzZSBpZiAocy0+bWJfeSkKKyAgICAgICAgICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIChzLT5tYl95LTEpICogMTYsIDE2KTsKKyAgICAgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZSA9IDA7CisgICAgfQorCisgICAgLyogcmF3IGJvdHRvbSBNQiByb3cgKi8KKyAgICBzLT5tYl94ID0gMDsKKyAgICBpbml0X2Jsb2NrX2luZGV4KHYpOworCisgICAgZm9yICg7cy0+bWJfeCA8IHMtPm1iX3dpZHRoOyBzLT5tYl94KyspIHsKKyAgICAgICAgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KHMpOworICAgICAgICB2YzFfcHV0X3NpZ25lZF9ibG9ja3NfY2xhbXBlZCh2KTsKKyAgICAgICAgaWYgKHYtPnMubG9vcF9maWx0ZXIpCisgICAgICAgICAgICBmZl92YzFfbG9vcF9maWx0ZXJfaWJsa19kZWxheWVkKHYsIHYtPnBxKTsKKyAgICB9CisgICAgaWYgKHYtPnMubG9vcF9maWx0ZXIpCisgICAgICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIChzLT5lbmRfbWJfeS0xKSoxNiwgMTYpOworICAgIGZmX2VyX2FkZF9zbGljZSgmcy0+ZXIsIDAsIHMtPnN0YXJ0X21iX3kgPDwgdi0+ZmllbGRfbW9kZSwgcy0+bWJfd2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAocy0+ZW5kX21iX3kgPDwgdi0+ZmllbGRfbW9kZSkgLSAxLCBFUl9NQl9FTkQpOworfQorCitzdGF0aWMgdm9pZCB2YzFfZGVjb2RlX3BfYmxvY2tzKFZDMUNvbnRleHQgKnYpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdi0+czsKKyAgICBpbnQgYXBwbHlfbG9vcF9maWx0ZXI7CisKKyAgICAvKiBzZWxlY3QgY29kaW5nbW9kZSB1c2VkIGZvciBWTEMgdGFibGVzIHNlbGVjdGlvbiAqLworICAgIHN3aXRjaCAodi0+Y19hY190YWJsZV9pbmRleCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgdi0+Y29kaW5nc2V0ID0gKHYtPnBxaW5kZXggPD0gOCkgPyBDU19ISUdIX1JBVEVfSU5UUkEgOiBDU19MT1dfTU9UX0lOVFJBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHYtPmNvZGluZ3NldCA9IENTX0hJR0hfTU9UX0lOVFJBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHYtPmNvZGluZ3NldCA9IENTX01JRF9SQVRFX0lOVFJBOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHYtPmNfYWNfdGFibGVfaW5kZXgpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHYtPmNvZGluZ3NldDIgPSAodi0+cHFpbmRleCA8PSA4KSA/IENTX0hJR0hfUkFURV9JTlRFUiA6IENTX0xPV19NT1RfSU5URVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgdi0+Y29kaW5nc2V0MiA9IENTX0hJR0hfTU9UX0lOVEVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHYtPmNvZGluZ3NldDIgPSBDU19NSURfUkFURV9JTlRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYXBwbHlfbG9vcF9maWx0ZXIgICA9IHMtPmxvb3BfZmlsdGVyICYmICEocy0+YXZjdHgtPnNraXBfbG9vcF9maWx0ZXIgPj0gQVZESVNDQVJEX05PTktFWSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+ZmNtID09IFBST0dSRVNTSVZFOworICAgIHMtPmZpcnN0X3NsaWNlX2xpbmUgPSAxOworICAgIG1lbXNldCh2LT5jYnBfYmFzZSwgMCwgc2l6ZW9mKHYtPmNicF9iYXNlWzBdKSoyKnMtPm1iX3N0cmlkZSk7CisgICAgZm9yIChzLT5tYl95ID0gcy0+c3RhcnRfbWJfeTsgcy0+bWJfeSA8IHMtPmVuZF9tYl95OyBzLT5tYl95KyspIHsKKyAgICAgICAgcy0+bWJfeCA9IDA7CisgICAgICAgIGluaXRfYmxvY2tfaW5kZXgodik7CisgICAgICAgIGZvciAoOyBzLT5tYl94IDwgcy0+bWJfd2lkdGg7IHMtPm1iX3grKykgeworICAgICAgICAgICAgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KHMpOworCisgICAgICAgICAgICBpZiAodi0+ZmNtID09IElMQUNFX0ZJRUxEKQorICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfcF9tYl9pbnRmaSh2KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHYtPmZjbSA9PSBJTEFDRV9GUkFNRSkKKyAgICAgICAgICAgICAgICB2YzFfZGVjb2RlX3BfbWJfaW50ZnIodik7CisgICAgICAgICAgICBlbHNlIHZjMV9kZWNvZGVfcF9tYih2KTsKKyAgICAgICAgICAgIGlmIChzLT5tYl95ICE9IHMtPnN0YXJ0X21iX3kgJiYgYXBwbHlfbG9vcF9maWx0ZXIpCisgICAgICAgICAgICAgICAgZmZfdmMxX2FwcGx5X3BfbG9vcF9maWx0ZXIodik7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfY291bnQoJnMtPmdiKSA+IHYtPmJpdHMgfHwgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYXkgbmVlZCBtb2RpZmljYXRpb24gdG8gaGFuZGxlIHNsaWNlIGNvZGluZworICAgICAgICAgICAgICAgIGZmX2VyX2FkZF9zbGljZSgmcy0+ZXIsIDAsIHMtPnN0YXJ0X21iX3ksIHMtPm1iX3gsIHMtPm1iX3ksIEVSX01CX0VSUk9SKTsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkJpdHMgb3ZlcmNvbnN1bXB0aW9uOiAlaSA+ICVpIGF0ICVpeCVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0c19jb3VudCgmcy0+Z2IpLCB2LT5iaXRzLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWVtbW92ZSh2LT5jYnBfYmFzZSwgICAgICB2LT5jYnAsICAgICAgc2l6ZW9mKHYtPmNicF9iYXNlWzBdKSAgICAgICogcy0+bWJfc3RyaWRlKTsKKyAgICAgICAgbWVtbW92ZSh2LT50dGJsa19iYXNlLCAgICB2LT50dGJsaywgICAgc2l6ZW9mKHYtPnR0YmxrX2Jhc2VbMF0pICAgICogcy0+bWJfc3RyaWRlKTsKKyAgICAgICAgbWVtbW92ZSh2LT5pc19pbnRyYV9iYXNlLCB2LT5pc19pbnRyYSwgc2l6ZW9mKHYtPmlzX2ludHJhX2Jhc2VbMF0pICogcy0+bWJfc3RyaWRlKTsKKyAgICAgICAgbWVtbW92ZSh2LT5sdW1hX212X2Jhc2UsICB2LT5sdW1hX212LCAgc2l6ZW9mKHYtPmx1bWFfbXZfYmFzZVswXSkgICogcy0+bWJfc3RyaWRlKTsKKyAgICAgICAgaWYgKHMtPm1iX3kgIT0gcy0+c3RhcnRfbWJfeSkgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQocywgKHMtPm1iX3kgLSAxKSAqIDE2LCAxNik7CisgICAgICAgIHMtPmZpcnN0X3NsaWNlX2xpbmUgPSAwOworICAgIH0KKyAgICBpZiAoYXBwbHlfbG9vcF9maWx0ZXIpIHsKKyAgICAgICAgcy0+bWJfeCA9IDA7CisgICAgICAgIGluaXRfYmxvY2tfaW5kZXgodik7CisgICAgICAgIGZvciAoOyBzLT5tYl94IDwgcy0+bWJfd2lkdGg7IHMtPm1iX3grKykgeworICAgICAgICAgICAgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KHMpOworICAgICAgICAgICAgZmZfdmMxX2FwcGx5X3BfbG9vcF9maWx0ZXIodik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPmVuZF9tYl95ID49IHMtPnN0YXJ0X21iX3kpCisgICAgICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIChzLT5lbmRfbWJfeSAtIDEpICogMTYsIDE2KTsKKyAgICBmZl9lcl9hZGRfc2xpY2UoJnMtPmVyLCAwLCBzLT5zdGFydF9tYl95IDw8IHYtPmZpZWxkX21vZGUsIHMtPm1iX3dpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgKHMtPmVuZF9tYl95IDw8IHYtPmZpZWxkX21vZGUpIC0gMSwgRVJfTUJfRU5EKTsKK30KKworc3RhdGljIHZvaWQgdmMxX2RlY29kZV9iX2Jsb2NrcyhWQzFDb250ZXh0ICp2KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisKKyAgICAvKiBzZWxlY3QgY29kaW5nbW9kZSB1c2VkIGZvciBWTEMgdGFibGVzIHNlbGVjdGlvbiAqLworICAgIHN3aXRjaCAodi0+Y19hY190YWJsZV9pbmRleCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgdi0+Y29kaW5nc2V0ID0gKHYtPnBxaW5kZXggPD0gOCkgPyBDU19ISUdIX1JBVEVfSU5UUkEgOiBDU19MT1dfTU9UX0lOVFJBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHYtPmNvZGluZ3NldCA9IENTX0hJR0hfTU9UX0lOVFJBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHYtPmNvZGluZ3NldCA9IENTX01JRF9SQVRFX0lOVFJBOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHYtPmNfYWNfdGFibGVfaW5kZXgpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHYtPmNvZGluZ3NldDIgPSAodi0+cHFpbmRleCA8PSA4KSA/IENTX0hJR0hfUkFURV9JTlRFUiA6IENTX0xPV19NT1RfSU5URVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgdi0+Y29kaW5nc2V0MiA9IENTX0hJR0hfTU9UX0lOVEVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHYtPmNvZGluZ3NldDIgPSBDU19NSURfUkFURV9JTlRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZSA9IDE7CisgICAgZm9yIChzLT5tYl95ID0gcy0+c3RhcnRfbWJfeTsgcy0+bWJfeSA8IHMtPmVuZF9tYl95OyBzLT5tYl95KyspIHsKKyAgICAgICAgcy0+bWJfeCA9IDA7CisgICAgICAgIGluaXRfYmxvY2tfaW5kZXgodik7CisgICAgICAgIGZvciAoOyBzLT5tYl94IDwgcy0+bWJfd2lkdGg7IHMtPm1iX3grKykgeworICAgICAgICAgICAgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KHMpOworCisgICAgICAgICAgICBpZiAodi0+ZmNtID09IElMQUNFX0ZJRUxEKQorICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfYl9tYl9pbnRmaSh2KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHYtPmZjbSA9PSBJTEFDRV9GUkFNRSkKKyAgICAgICAgICAgICAgICB2YzFfZGVjb2RlX2JfbWJfaW50ZnIodik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmMxX2RlY29kZV9iX21iKHYpOworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2NvdW50KCZzLT5nYikgPiB2LT5iaXRzIHx8IGdldF9iaXRzX2NvdW50KCZzLT5nYikgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogbWF5IG5lZWQgbW9kaWZpY2F0aW9uIHRvIGhhbmRsZSBzbGljZSBjb2RpbmcKKyAgICAgICAgICAgICAgICBmZl9lcl9hZGRfc2xpY2UoJnMtPmVyLCAwLCBzLT5zdGFydF9tYl95LCBzLT5tYl94LCBzLT5tYl95LCBFUl9NQl9FUlJPUik7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJCaXRzIG92ZXJjb25zdW1wdGlvbjogJWkgPiAlaSBhdCAlaXglaVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSwgdi0+Yml0cywgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHYtPnMubG9vcF9maWx0ZXIpCisgICAgICAgICAgICAgICAgZmZfdmMxX2xvb3BfZmlsdGVyX2libGsodiwgdi0+cHEpOworICAgICAgICB9CisgICAgICAgIGlmICghdi0+cy5sb29wX2ZpbHRlcikKKyAgICAgICAgICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIHMtPm1iX3kgKiAxNiwgMTYpOworICAgICAgICBlbHNlIGlmIChzLT5tYl95KQorICAgICAgICAgICAgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQocywgKHMtPm1iX3kgLSAxKSAqIDE2LCAxNik7CisgICAgICAgIHMtPmZpcnN0X3NsaWNlX2xpbmUgPSAwOworICAgIH0KKyAgICBpZiAodi0+cy5sb29wX2ZpbHRlcikKKyAgICAgICAgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQocywgKHMtPmVuZF9tYl95IC0gMSkgKiAxNiwgMTYpOworICAgIGZmX2VyX2FkZF9zbGljZSgmcy0+ZXIsIDAsIHMtPnN0YXJ0X21iX3kgPDwgdi0+ZmllbGRfbW9kZSwgcy0+bWJfd2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAocy0+ZW5kX21iX3kgPDwgdi0+ZmllbGRfbW9kZSkgLSAxLCBFUl9NQl9FTkQpOworfQorCitzdGF0aWMgdm9pZCB2YzFfZGVjb2RlX3NraXBfYmxvY2tzKFZDMUNvbnRleHQgKnYpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdi0+czsKKworICAgIGlmICghdi0+cy5sYXN0X3BpY3R1cmUuZi0+ZGF0YVswXSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgMCwgcy0+c3RhcnRfbWJfeSwgcy0+bWJfd2lkdGggLSAxLCBzLT5lbmRfbWJfeSAtIDEsIEVSX01CX0VORCk7CisgICAgcy0+Zmlyc3Rfc2xpY2VfbGluZSA9IDE7CisgICAgZm9yIChzLT5tYl95ID0gcy0+c3RhcnRfbWJfeTsgcy0+bWJfeSA8IHMtPmVuZF9tYl95OyBzLT5tYl95KyspIHsKKyAgICAgICAgcy0+bWJfeCA9IDA7CisgICAgICAgIGluaXRfYmxvY2tfaW5kZXgodik7CisgICAgICAgIGZmX3VwZGF0ZV9ibG9ja19pbmRleChzKTsKKyAgICAgICAgbWVtY3B5KHMtPmRlc3RbMF0sIHMtPmxhc3RfcGljdHVyZS5mLT5kYXRhWzBdICsgcy0+bWJfeSAqIDE2ICogcy0+bGluZXNpemUsICAgcy0+bGluZXNpemUgICAqIDE2KTsKKyAgICAgICAgbWVtY3B5KHMtPmRlc3RbMV0sIHMtPmxhc3RfcGljdHVyZS5mLT5kYXRhWzFdICsgcy0+bWJfeSAqICA4ICogcy0+dXZsaW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSAqICA4KTsKKyAgICAgICAgbWVtY3B5KHMtPmRlc3RbMl0sIHMtPmxhc3RfcGljdHVyZS5mLT5kYXRhWzJdICsgcy0+bWJfeSAqICA4ICogcy0+dXZsaW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSAqICA4KTsKKyAgICAgICAgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQocywgcy0+bWJfeSAqIDE2LCAxNik7CisgICAgICAgIHMtPmZpcnN0X3NsaWNlX2xpbmUgPSAwOworICAgIH0KKyAgICBzLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKK30KKwordm9pZCBmZl92YzFfZGVjb2RlX2Jsb2NrcyhWQzFDb250ZXh0ICp2KQoreworCisgICAgdi0+cy5lc2MzX2xldmVsX2xlbmd0aCA9IDA7CisgICAgaWYgKHYtPng4X3R5cGUpIHsKKyAgICAgICAgZmZfaW50cmF4OF9kZWNvZGVfcGljdHVyZSgmdi0+eDgsIDIqdi0+cHEgKyB2LT5oYWxmcHEsIHYtPnBxICogIXYtPnBxdWFudGl6ZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHYtPmN1cl9ibGtfaWR4ICAgICA9ICAwOworICAgICAgICB2LT5sZWZ0X2Jsa19pZHggICAgPSAtMTsKKyAgICAgICAgdi0+dG9wbGVmdF9ibGtfaWR4ID0gIDE7CisgICAgICAgIHYtPnRvcF9ibGtfaWR4ICAgICA9ICAyOworICAgICAgICBzd2l0Y2ggKHYtPnMucGljdF90eXBlKSB7CisgICAgICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX0k6CisgICAgICAgICAgICBpZiAodi0+cHJvZmlsZSA9PSBQUk9GSUxFX0FEVkFOQ0VEKQorICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfaV9ibG9ja3NfYWR2KHYpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfaV9ibG9ja3Modik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfUDoKKyAgICAgICAgICAgIGlmICh2LT5wX2ZyYW1lX3NraXBwZWQpCisgICAgICAgICAgICAgICAgdmMxX2RlY29kZV9za2lwX2Jsb2Nrcyh2KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YzFfZGVjb2RlX3BfYmxvY2tzKHYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX0I6CisgICAgICAgICAgICBpZiAodi0+YmlfdHlwZSkgeworICAgICAgICAgICAgICAgIGlmICh2LT5wcm9maWxlID09IFBST0ZJTEVfQURWQU5DRUQpCisgICAgICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfaV9ibG9ja3NfYWR2KHYpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdmMxX2RlY29kZV9pX2Jsb2Nrcyh2KTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHZjMV9kZWNvZGVfYl9ibG9ja3Modik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMV9jb21tb24uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMV9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDY3YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmMxX2NvbW1vbi5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBWQy0xIGFuZCBXTVYzIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqIFBhcnRseSBiYXNlZCBvbiB2YzkuYyAoYykgMjAwNSBBbm9ueW1vdXMsIEFsZXggQmVyZWdzemFzemksIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZDMV9DT01NT05fSAorI2RlZmluZSBBVkNPREVDX1ZDMV9DT01NT05fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorCisvKiogTWFya2VycyB1c2VkIGluIFZDLTEgQVAgZnJhbWUgZGF0YSAqLworLy9AeworZW51bSBWQzFDb2RlIHsKKyAgICBWQzFfQ09ERV9SRVMwICAgICAgID0gMHgwMDAwMDEwMCwKKyAgICBWQzFfQ09ERV9FTkRPRlNFUSAgID0gMHgwMDAwMDEwQSwKKyAgICBWQzFfQ09ERV9TTElDRSwKKyAgICBWQzFfQ09ERV9GSUVMRCwKKyAgICBWQzFfQ09ERV9GUkFNRSwKKyAgICBWQzFfQ09ERV9FTlRSWVBPSU5ULAorICAgIFZDMV9DT0RFX1NFUUhEUiwKK307CisvL0B9CisKKyNkZWZpbmUgSVNfTUFSS0VSKHgpICgoKHgpICYgfjB4RkYpID09IFZDMV9DT0RFX1JFUzApCisKKy8qKiBBdmFpbGFibGUgUHJvZmlsZXMgKi8KKy8vQHsKK2VudW0gUHJvZmlsZSB7CisgICAgUFJPRklMRV9TSU1QTEUsCisgICAgUFJPRklMRV9NQUlOLAorICAgIFBST0ZJTEVfQ09NUExFWCwgLy8vPCBUT0RPOiBXTVY5IHNwZWNpZmljCisgICAgUFJPRklMRV9BRFZBTkNFRAorfTsKKy8vQH0KKworLyoqIEZpbmQgVkMtMSBtYXJrZXIgaW4gYnVmZmVyCisgKiBAcmV0dXJuIHBvc2l0aW9uIHdoZXJlIG5leHQgbWFya2VyIHN0YXJ0cyBvciBlbmQgb2YgYnVmZmVyIGlmIG5vIG1hcmtlciBmb3VuZAorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBjb25zdCB1aW50OF90KiBmaW5kX25leHRfbWFya2VyKGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqZW5kKQoreworICAgIHVpbnQzMl90IG1yayA9IDB4RkZGRkZGRkY7CisKKyAgICBpZiAoZW5kLXNyYyA8IDQpCisgICAgICAgIHJldHVybiBlbmQ7CisgICAgd2hpbGUgKHNyYyA8IGVuZCkgeworICAgICAgICBtcmsgPSAobXJrIDw8IDgpIHwgKnNyYysrOworICAgICAgICBpZiAoSVNfTUFSS0VSKG1yaykpCisgICAgICAgICAgICByZXR1cm4gc3JjIC0gNDsKKyAgICB9CisgICAgcmV0dXJuIGVuZDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHZjMV91bmVzY2FwZV9idWZmZXIoY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc2l6ZSwgdWludDhfdCAqZHN0KQoreworICAgIGludCBkc2l6ZSA9IDAsIGk7CisKKyAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgZm9yIChkc2l6ZSA9IDA7IGRzaXplIDwgc2l6ZTsgZHNpemUrKykKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyssIHNyYysrKSB7CisgICAgICAgIGlmIChzcmNbMF0gPT0gMyAmJiBpID49IDIgJiYgIXNyY1stMV0gJiYgIXNyY1stMl0gJiYgaSA8IHNpemUtMSAmJiBzcmNbMV0gPCA0KSB7CisgICAgICAgICAgICBkc3RbZHNpemUrK10gPSBzcmNbMV07CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBkc3RbZHNpemUrK10gPSAqc3JjOworICAgIH0KKyAgICByZXR1cm4gZHNpemU7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX1ZDMV9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmMxX2xvb3BmaWx0ZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMV9sb29wZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjNDUxOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMV9sb29wZmlsdGVyLmMKQEAgLTAsMCArMSwzNTMgQEAKKy8qCisgKiBWQy0xIGFuZCBXTVYzIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYXNoaWF0IFNhcmtlciBTaGFra2hhcgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS29uc3RhbnRpbiBTaGlzaGtvdgorICogUGFydGx5IGJhc2VkIG9uIHZjOS5jIChjKSAyMDA1IEFub255bW91cywgQWxleCBCZXJlZ3N6YXN6aSwgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWQy0xIGFuZCBXTVYzIGxvb3BmaWx0ZXIKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgInZjMS5oIgorI2luY2x1ZGUgInZjMWRzcC5oIgorCit2b2lkIGZmX3ZjMV9sb29wX2ZpbHRlcl9pYmxrKFZDMUNvbnRleHQgKnYsIGludCBwcSkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIGludCBqOworICAgIGlmICghcy0+Zmlyc3Rfc2xpY2VfbGluZSkgeworICAgICAgICB2LT52YzFkc3AudmMxX3ZfbG9vcF9maWx0ZXIxNihzLT5kZXN0WzBdLCBzLT5saW5lc2l6ZSwgcHEpOworICAgICAgICBpZiAocy0+bWJfeCkKKyAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjE2KHMtPmRlc3RbMF0gLSAxNiAqIHMtPmxpbmVzaXplLCBzLT5saW5lc2l6ZSwgcHEpOworICAgICAgICB2LT52YzFkc3AudmMxX2hfbG9vcF9maWx0ZXIxNihzLT5kZXN0WzBdIC0gMTYgKiBzLT5saW5lc2l6ZSArIDgsIHMtPmxpbmVzaXplLCBwcSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfdl9sb29wX2ZpbHRlcjgocy0+ZGVzdFtqICsgMV0sIHMtPnV2bGluZXNpemUsIHBxKTsKKyAgICAgICAgICAgIGlmIChzLT5tYl94KQorICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjgocy0+ZGVzdFtqICsgMV0gLSA4ICogcy0+dXZsaW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSwgcHEpOworICAgICAgICB9CisgICAgfQorICAgIHYtPnZjMWRzcC52YzFfdl9sb29wX2ZpbHRlcjE2KHMtPmRlc3RbMF0gKyA4ICogcy0+bGluZXNpemUsIHMtPmxpbmVzaXplLCBwcSk7CisKKyAgICBpZiAocy0+bWJfeSA9PSBzLT5lbmRfbWJfeSAtIDEpIHsKKyAgICAgICAgaWYgKHMtPm1iX3gpIHsKKyAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjE2KHMtPmRlc3RbMF0sIHMtPmxpbmVzaXplLCBwcSk7CisgICAgICAgICAgICB2LT52YzFkc3AudmMxX2hfbG9vcF9maWx0ZXI4KHMtPmRlc3RbMV0sIHMtPnV2bGluZXNpemUsIHBxKTsKKyAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjgocy0+ZGVzdFsyXSwgcy0+dXZsaW5lc2l6ZSwgcHEpOworICAgICAgICB9CisgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjE2KHMtPmRlc3RbMF0gKyA4LCBzLT5saW5lc2l6ZSwgcHEpOworICAgIH0KK30KKwordm9pZCBmZl92YzFfbG9vcF9maWx0ZXJfaWJsa19kZWxheWVkKFZDMUNvbnRleHQgKnYsIGludCBwcSkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIGludCBqOworCisgICAgLyogVGhlIGxvb3BmaWx0ZXIgcnVucyAxIHJvdyBhbmQgMSBjb2x1bW4gYmVoaW5kIHRoZSBvdmVybGFwIGZpbHRlciwgd2hpY2gKKyAgICAgKiBtZWFucyBpdCBydW5zIHR3byByb3dzL2NvbHMgYmVoaW5kIHRoZSBkZWNvZGluZyBsb29wLiAqLworICAgIGlmICghcy0+Zmlyc3Rfc2xpY2VfbGluZSkgeworICAgICAgICBpZiAocy0+bWJfeCkgeworICAgICAgICAgICAgaWYgKHMtPm1iX3kgPj0gcy0+c3RhcnRfbWJfeSArIDIpIHsKKyAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3ZfbG9vcF9maWx0ZXIxNihzLT5kZXN0WzBdIC0gMTYgKiBzLT5saW5lc2l6ZSAtIDE2LCBzLT5saW5lc2l6ZSwgcHEpOworCisgICAgICAgICAgICAgICAgaWYgKHMtPm1iX3ggPj0gMikKKyAgICAgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9oX2xvb3BfZmlsdGVyMTYocy0+ZGVzdFswXSAtIDMyICogcy0+bGluZXNpemUgLSAxNiwgcy0+bGluZXNpemUsIHBxKTsKKyAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX2hfbG9vcF9maWx0ZXIxNihzLT5kZXN0WzBdIC0gMzIgKiBzLT5saW5lc2l6ZSAtIDgsIHMtPmxpbmVzaXplLCBwcSk7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3ZfbG9vcF9maWx0ZXI4KHMtPmRlc3RbaiArIDFdIC0gOCAqIHMtPnV2bGluZXNpemUgLSA4LCBzLT51dmxpbmVzaXplLCBwcSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tYl94ID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjgocy0+ZGVzdFtqICsgMV0gLSAxNiAqIHMtPnV2bGluZXNpemUgLSA4LCBzLT51dmxpbmVzaXplLCBwcSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2LT52YzFkc3AudmMxX3ZfbG9vcF9maWx0ZXIxNihzLT5kZXN0WzBdIC0gOCAqIHMtPmxpbmVzaXplIC0gMTYsIHMtPmxpbmVzaXplLCBwcSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+bWJfeCA9PSBzLT5tYl93aWR0aCAtIDEpIHsKKyAgICAgICAgICAgIGlmIChzLT5tYl95ID49IHMtPnN0YXJ0X21iX3kgKyAyKSB7CisgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV92X2xvb3BfZmlsdGVyMTYocy0+ZGVzdFswXSAtIDE2ICogcy0+bGluZXNpemUsIHMtPmxpbmVzaXplLCBwcSk7CisKKyAgICAgICAgICAgICAgICBpZiAocy0+bWJfeCkKKyAgICAgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9oX2xvb3BfZmlsdGVyMTYocy0+ZGVzdFswXSAtIDMyICogcy0+bGluZXNpemUsIHMtPmxpbmVzaXplLCBwcSk7CisgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9oX2xvb3BfZmlsdGVyMTYocy0+ZGVzdFswXSAtIDMyICogcy0+bGluZXNpemUgKyA4LCBzLT5saW5lc2l6ZSwgcHEpOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV92X2xvb3BfZmlsdGVyOChzLT5kZXN0W2ogKyAxXSAtIDggKiBzLT51dmxpbmVzaXplLCBzLT51dmxpbmVzaXplLCBwcSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tYl94ID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjgocy0+ZGVzdFtqICsgMV0gLSAxNiAqIHMtPnV2bGluZXNpemUsIHMtPnV2bGluZXNpemUsIHBxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfdl9sb29wX2ZpbHRlcjE2KHMtPmRlc3RbMF0gLSA4ICogcy0+bGluZXNpemUsIHMtPmxpbmVzaXplLCBwcSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+bWJfeSA9PSBzLT5lbmRfbWJfeSkgeworICAgICAgICAgICAgaWYgKHMtPm1iX3gpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+bWJfeCA+PSAyKQorICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX2hfbG9vcF9maWx0ZXIxNihzLT5kZXN0WzBdIC0gMTYgKiBzLT5saW5lc2l6ZSAtIDE2LCBzLT5saW5lc2l6ZSwgcHEpOworICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjE2KHMtPmRlc3RbMF0gLSAxNiAqIHMtPmxpbmVzaXplIC0gOCwgcy0+bGluZXNpemUsIHBxKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+bWJfeCA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjgocy0+ZGVzdFtqICsgMV0gLSA4ICogcy0+dXZsaW5lc2l6ZSAtIDgsIHMtPnV2bGluZXNpemUsIHBxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPm1iX3ggPT0gcy0+bWJfd2lkdGggLSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPm1iX3gpCisgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjE2KHMtPmRlc3RbMF0gLSAxNiAqIHMtPmxpbmVzaXplLCBzLT5saW5lc2l6ZSwgcHEpOworICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjE2KHMtPmRlc3RbMF0gLSAxNiAqIHMtPmxpbmVzaXplICsgOCwgcy0+bGluZXNpemUsIHBxKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+bWJfeCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX2hfbG9vcF9maWx0ZXI4KHMtPmRlc3RbaiArIDFdIC0gOCAqIHMtPnV2bGluZXNpemUsIHMtPnV2bGluZXNpemUsIHBxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl92YzFfc21vb3RoX292ZXJsYXBfZmlsdGVyX2libGsoVkMxQ29udGV4dCAqdikKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIGludCBtYl9wb3M7CisKKyAgICBpZiAodi0+Y29uZG92ZXIgPT0gQ09ORE9WRVJfTk9ORSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbWJfcG9zID0gcy0+bWJfeCArIHMtPm1iX3kgKiBzLT5tYl9zdHJpZGU7CisKKyAgICAvKiBXaXRoaW4gYSBNQiwgdGhlIGhvcml6b250YWwgb3ZlcmxhcCBhbHdheXMgcnVucyBiZWZvcmUgdGhlIHZlcnRpY2FsLgorICAgICAqIFRvIGFjY29tcGxpc2ggdGhhdCwgd2UgcnVuIHRoZSBIIG9uIGxlZnQgYW5kIGludGVybmFsIGJvcmRlcnMgb2YgdGhlCisgICAgICogY3VycmVudGx5IGRlY29kZWQgTUIuIFRoZW4sIHdlIHdhaXQgZm9yIHRoZSBuZXh0IG92ZXJsYXAgaXRlcmF0aW9uCisgICAgICogdG8gZG8gSCBvdmVybGFwIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoaXMgTUIsIGJlZm9yZSBtb3Zpbmcgb3ZlciBhbmQKKyAgICAgKiBydW5uaW5nIHRoZSBWIG92ZXJsYXAuIFRoZXJlZm9yZSwgdGhlIFYgb3ZlcmxhcCBtYWtlcyB1cyB0cmFpbCBieSBvbmUKKyAgICAgKiBNQiBjb2wgYW5kIHRoZSBIIG92ZXJsYXAgZmlsdGVyIG1ha2VzIHVzIHRyYWlsIGJ5IG9uZSBNQiByb3cuIFRoaXMKKyAgICAgKiBpcyByZWZsZWN0ZWQgaW4gdGhlIHRpbWUgYXQgd2hpY2ggd2UgcnVuIHRoZSBwdXRfcGl4ZWxzIGxvb3AuICovCisgICAgaWYgKHYtPmNvbmRvdmVyID09IENPTkRPVkVSX0FMTCB8fCB2LT5wcSA+PSA5IHx8IHYtPm92ZXJfZmxhZ3NfcGxhbmVbbWJfcG9zXSkgeworICAgICAgICBpZiAocy0+bWJfeCAmJiAodi0+Y29uZG92ZXIgPT0gQ09ORE9WRVJfQUxMIHx8IHYtPnBxID49IDkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPm92ZXJfZmxhZ3NfcGxhbmVbbWJfcG9zIC0gMV0pKSB7CisgICAgICAgICAgICB2LT52YzFkc3AudmMxX2hfc19vdmVybGFwKHYtPmJsb2NrW3YtPmxlZnRfYmxrX2lkeF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPmJsb2NrW3YtPmN1cl9ibGtfaWR4XVswXSk7CisgICAgICAgICAgICB2LT52YzFkc3AudmMxX2hfc19vdmVybGFwKHYtPmJsb2NrW3YtPmxlZnRfYmxrX2lkeF1bM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPmJsb2NrW3YtPmN1cl9ibGtfaWR4XVsyXSk7CisgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX2hfc19vdmVybGFwKHYtPmJsb2NrW3YtPmxlZnRfYmxrX2lkeF1bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT5ibG9ja1t2LT5jdXJfYmxrX2lkeF1bNF0pOworICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9zX292ZXJsYXAodi0+YmxvY2tbdi0+bGVmdF9ibGtfaWR4XVs1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPmJsb2NrW3YtPmN1cl9ibGtfaWR4XVs1XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdi0+dmMxZHNwLnZjMV9oX3Nfb3ZlcmxhcCh2LT5ibG9ja1t2LT5jdXJfYmxrX2lkeF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+YmxvY2tbdi0+Y3VyX2Jsa19pZHhdWzFdKTsKKyAgICAgICAgdi0+dmMxZHNwLnZjMV9oX3Nfb3ZlcmxhcCh2LT5ibG9ja1t2LT5jdXJfYmxrX2lkeF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+YmxvY2tbdi0+Y3VyX2Jsa19pZHhdWzNdKTsKKworICAgICAgICBpZiAocy0+bWJfeCA9PSBzLT5tYl93aWR0aCAtIDEpIHsKKyAgICAgICAgICAgIGlmICghcy0+Zmlyc3Rfc2xpY2VfbGluZSAmJiAodi0+Y29uZG92ZXIgPT0gQ09ORE9WRVJfQUxMIHx8IHYtPnBxID49IDkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+b3Zlcl9mbGFnc19wbGFuZVttYl9wb3MgLSBzLT5tYl9zdHJpZGVdKSkgeworICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfdl9zX292ZXJsYXAodi0+YmxvY2tbdi0+dG9wX2Jsa19pZHhdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+YmxvY2tbdi0+Y3VyX2Jsa19pZHhdWzBdKTsKKyAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3Zfc19vdmVybGFwKHYtPmJsb2NrW3YtPnRvcF9ibGtfaWR4XVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPmJsb2NrW3YtPmN1cl9ibGtfaWR4XVsxXSk7CisgICAgICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfdl9zX292ZXJsYXAodi0+YmxvY2tbdi0+dG9wX2Jsa19pZHhdWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPmJsb2NrW3YtPmN1cl9ibGtfaWR4XVs0XSk7CisgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfdl9zX292ZXJsYXAodi0+YmxvY2tbdi0+dG9wX2Jsa19pZHhdWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPmJsb2NrW3YtPmN1cl9ibGtfaWR4XVs1XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV92X3Nfb3ZlcmxhcCh2LT5ibG9ja1t2LT5jdXJfYmxrX2lkeF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPmJsb2NrW3YtPmN1cl9ibGtfaWR4XVsyXSk7CisgICAgICAgICAgICB2LT52YzFkc3AudmMxX3Zfc19vdmVybGFwKHYtPmJsb2NrW3YtPmN1cl9ibGtfaWR4XVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+YmxvY2tbdi0+Y3VyX2Jsa19pZHhdWzNdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+bWJfeCAmJiAodi0+Y29uZG92ZXIgPT0gQ09ORE9WRVJfQUxMIHx8IHYtPm92ZXJfZmxhZ3NfcGxhbmVbbWJfcG9zIC0gMV0pKSB7CisgICAgICAgIGlmICghcy0+Zmlyc3Rfc2xpY2VfbGluZSAmJiAodi0+Y29uZG92ZXIgPT0gQ09ORE9WRVJfQUxMIHx8IHYtPnBxID49IDkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT5vdmVyX2ZsYWdzX3BsYW5lW21iX3BvcyAtIHMtPm1iX3N0cmlkZSAtIDFdKSkgeworICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV92X3Nfb3ZlcmxhcCh2LT5ibG9ja1t2LT50b3BsZWZ0X2Jsa19pZHhdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT5ibG9ja1t2LT5sZWZ0X2Jsa19pZHhdWzBdKTsKKyAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfdl9zX292ZXJsYXAodi0+YmxvY2tbdi0+dG9wbGVmdF9ibGtfaWR4XVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+YmxvY2tbdi0+bGVmdF9ibGtfaWR4XVsxXSk7CisgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkpIHsKKyAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3Zfc19vdmVybGFwKHYtPmJsb2NrW3YtPnRvcGxlZnRfYmxrX2lkeF1bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT5ibG9ja1t2LT5sZWZ0X2Jsa19pZHhdWzRdKTsKKyAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3Zfc19vdmVybGFwKHYtPmJsb2NrW3YtPnRvcGxlZnRfYmxrX2lkeF1bNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT5ibG9ja1t2LT5sZWZ0X2Jsa19pZHhdWzVdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2LT52YzFkc3AudmMxX3Zfc19vdmVybGFwKHYtPmJsb2NrW3YtPmxlZnRfYmxrX2lkeF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+YmxvY2tbdi0+bGVmdF9ibGtfaWR4XVsyXSk7CisgICAgICAgIHYtPnZjMWRzcC52YzFfdl9zX292ZXJsYXAodi0+YmxvY2tbdi0+bGVmdF9ibGtfaWR4XVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT5ibG9ja1t2LT5sZWZ0X2Jsa19pZHhdWzNdKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgdmMxX2FwcGx5X3Bfdl9sb29wX2ZpbHRlcihWQzFDb250ZXh0ICp2LCBpbnQgYmxvY2tfbnVtKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzICA9ICZ2LT5zOworICAgIGludCBtYl9jYnAgICAgICAgICA9IHYtPmNicFtzLT5tYl94IC0gcy0+bWJfc3RyaWRlXSwKKyAgICAgICAgYmxvY2tfY2JwICAgICAgPSBtYl9jYnAgICAgICA+PiAoYmxvY2tfbnVtICogNCksIGJvdHRvbV9jYnAsCisgICAgICAgIG1iX2lzX2ludHJhICAgID0gdi0+aXNfaW50cmFbcy0+bWJfeCAtIHMtPm1iX3N0cmlkZV0sCisgICAgICAgIGJsb2NrX2lzX2ludHJhID0gbWJfaXNfaW50cmEgPj4gYmxvY2tfbnVtLCBib3R0b21faXNfaW50cmE7CisgICAgaW50IGlkeCwgbGluZXNpemUgID0gYmxvY2tfbnVtID4gMyA/IHMtPnV2bGluZXNpemUgOiBzLT5saW5lc2l6ZSwgdHRibGs7CisgICAgdWludDhfdCAqZHN0OworCisgICAgaWYgKGJsb2NrX251bSA+IDMpIHsKKyAgICAgICAgZHN0ICAgICAgPSBzLT5kZXN0W2Jsb2NrX251bSAtIDNdOworICAgIH0gZWxzZSB7CisgICAgICAgIGRzdCAgICAgID0gcy0+ZGVzdFswXSArIChibG9ja19udW0gJiAxKSAqIDggKyAoKGJsb2NrX251bSAmIDIpICogNCAtIDgpICogbGluZXNpemU7CisgICAgfQorICAgIGlmIChzLT5tYl95ICE9IHMtPmVuZF9tYl95IHx8IGJsb2NrX251bSA8IDIpIHsKKyAgICAgICAgaW50MTZfdCAoKm12KVsyXTsKKyAgICAgICAgaW50IG12X3N0cmlkZTsKKworICAgICAgICBpZiAoYmxvY2tfbnVtID4gMykgeworICAgICAgICAgICAgYm90dG9tX2NicCAgICAgID0gdi0+Y2JwW3MtPm1iX3hdICAgICAgPj4gKGJsb2NrX251bSAqIDQpOworICAgICAgICAgICAgYm90dG9tX2lzX2ludHJhID0gdi0+aXNfaW50cmFbcy0+bWJfeF0gPj4gYmxvY2tfbnVtOworICAgICAgICAgICAgbXYgICAgICAgICAgICAgID0gJnYtPmx1bWFfbXZbcy0+bWJfeCAtIHMtPm1iX3N0cmlkZV07CisgICAgICAgICAgICBtdl9zdHJpZGUgICAgICAgPSBzLT5tYl9zdHJpZGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib3R0b21fY2JwICAgICAgPSAoYmxvY2tfbnVtIDwgMikgPyAobWJfY2JwICAgICAgICAgICAgICAgPj4gKChibG9ja19udW0gKyAyKSAqIDQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHYtPmNicFtzLT5tYl94XSAgICAgID4+ICgoYmxvY2tfbnVtIC0gMikgKiA0KSk7CisgICAgICAgICAgICBib3R0b21faXNfaW50cmEgPSAoYmxvY2tfbnVtIDwgMikgPyAobWJfaXNfaW50cmEgICAgICAgICAgPj4gKGJsb2NrX251bSArIDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHYtPmlzX2ludHJhW3MtPm1iX3hdID4+IChibG9ja19udW0gLSAyKSk7CisgICAgICAgICAgICBtdl9zdHJpZGUgICAgICAgPSBzLT5iOF9zdHJpZGU7CisgICAgICAgICAgICBtdiAgICAgICAgICAgICAgPSAmcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1bcy0+YmxvY2tfaW5kZXhbYmxvY2tfbnVtXSAtIDIgKiBtdl9zdHJpZGVdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJvdHRvbV9pc19pbnRyYSAmIDEgfHwgYmxvY2tfaXNfaW50cmEgJiAxIHx8CisgICAgICAgICAgICBtdlswXVswXSAhPSBtdlttdl9zdHJpZGVdWzBdIHx8IG12WzBdWzFdICE9IG12W212X3N0cmlkZV1bMV0pIHsKKyAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfdl9sb29wX2ZpbHRlcjgoZHN0LCBsaW5lc2l6ZSwgdi0+cHEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWR4ID0gKChib3R0b21fY2JwID4+IDIpIHwgYmxvY2tfY2JwKSAmIDM7CisgICAgICAgICAgICBpZiAoaWR4ID09IDMpIHsKKyAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3ZfbG9vcF9maWx0ZXI4KGRzdCwgbGluZXNpemUsIHYtPnBxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaWR4KSB7CisgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSAxKQorICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3ZfbG9vcF9maWx0ZXI0KGRzdCArIDQsIGxpbmVzaXplLCB2LT5wcSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3ZfbG9vcF9maWx0ZXI0KGRzdCwgICAgIGxpbmVzaXplLCB2LT5wcSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkc3QgLT0gNCAqIGxpbmVzaXplOworICAgIHR0YmxrID0gKHYtPnR0YmxrW3MtPm1iX3ggLSBzLT5tYl9zdHJpZGVdID4+IChibG9ja19udW0gKiA0KSkgJiAweEY7CisgICAgaWYgKHR0YmxrID09IFRUXzRYNCB8fCB0dGJsayA9PSBUVF84WDQpIHsKKyAgICAgICAgaWR4ID0gKGJsb2NrX2NicCB8IChibG9ja19jYnAgPj4gMikpICYgMzsKKyAgICAgICAgaWYgKGlkeCA9PSAzKSB7CisgICAgICAgICAgICB2LT52YzFkc3AudmMxX3ZfbG9vcF9maWx0ZXI4KGRzdCwgbGluZXNpemUsIHYtPnBxKTsKKyAgICAgICAgfSBlbHNlIGlmIChpZHgpIHsKKyAgICAgICAgICAgIGlmIChpZHggPT0gMSkKKyAgICAgICAgICAgICAgICB2LT52YzFkc3AudmMxX3ZfbG9vcF9maWx0ZXI0KGRzdCArIDQsIGxpbmVzaXplLCB2LT5wcSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV92X2xvb3BfZmlsdGVyNChkc3QsICAgICBsaW5lc2l6ZSwgdi0+cHEpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHZjMV9hcHBseV9wX2hfbG9vcF9maWx0ZXIoVkMxQ29udGV4dCAqdiwgaW50IGJsb2NrX251bSkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyAgPSAmdi0+czsKKyAgICBpbnQgbWJfY2JwICAgICAgICAgPSB2LT5jYnBbcy0+bWJfeCAtIDEgLSBzLT5tYl9zdHJpZGVdLAorICAgICAgICBibG9ja19jYnAgICAgICA9IG1iX2NicCAgICAgID4+IChibG9ja19udW0gKiA0KSwgcmlnaHRfY2JwLAorICAgICAgICBtYl9pc19pbnRyYSAgICA9IHYtPmlzX2ludHJhW3MtPm1iX3ggLSAxIC0gcy0+bWJfc3RyaWRlXSwKKyAgICAgICAgYmxvY2tfaXNfaW50cmEgPSBtYl9pc19pbnRyYSA+PiBibG9ja19udW0sIHJpZ2h0X2lzX2ludHJhOworICAgIGludCBpZHgsIGxpbmVzaXplICA9IGJsb2NrX251bSA+IDMgPyBzLT51dmxpbmVzaXplIDogcy0+bGluZXNpemUsIHR0YmxrOworICAgIHVpbnQ4X3QgKmRzdDsKKworICAgIGlmIChibG9ja19udW0gPiAzKSB7CisgICAgICAgIGRzdCA9IHMtPmRlc3RbYmxvY2tfbnVtIC0gM10gLSA4ICogbGluZXNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0ID0gcy0+ZGVzdFswXSArIChibG9ja19udW0gJiAxKSAqIDggKyAoKGJsb2NrX251bSAmIDIpICogNCAtIDE2KSAqIGxpbmVzaXplIC0gODsKKyAgICB9CisKKyAgICBpZiAocy0+bWJfeCAhPSBzLT5tYl93aWR0aCB8fCAhKGJsb2NrX251bSAmIDUpKSB7CisgICAgICAgIGludDE2X3QgKCptdilbMl07CisKKyAgICAgICAgaWYgKGJsb2NrX251bSA+IDMpIHsKKyAgICAgICAgICAgIHJpZ2h0X2NicCAgICAgID0gdi0+Y2JwW3MtPm1iX3ggLSBzLT5tYl9zdHJpZGVdID4+IChibG9ja19udW0gKiA0KTsKKyAgICAgICAgICAgIHJpZ2h0X2lzX2ludHJhID0gdi0+aXNfaW50cmFbcy0+bWJfeCAtIHMtPm1iX3N0cmlkZV0gPj4gYmxvY2tfbnVtOworICAgICAgICAgICAgbXYgICAgICAgICAgICAgPSAmdi0+bHVtYV9tdltzLT5tYl94IC0gcy0+bWJfc3RyaWRlIC0gMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByaWdodF9jYnAgICAgICA9IChibG9ja19udW0gJiAxKSA/ICh2LT5jYnBbcy0+bWJfeCAtIHMtPm1iX3N0cmlkZV0gICAgICA+PiAoKGJsb2NrX251bSAtIDEpICogNCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChtYl9jYnAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAoKGJsb2NrX251bSArIDEpICogNCkpOworICAgICAgICAgICAgcmlnaHRfaXNfaW50cmEgPSAoYmxvY2tfbnVtICYgMSkgPyAodi0+aXNfaW50cmFbcy0+bWJfeCAtIHMtPm1iX3N0cmlkZV0gPj4gKGJsb2NrX251bSAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobWJfaXNfaW50cmEgICAgICAgICAgICAgICAgICAgICAgICAgPj4gKGJsb2NrX251bSArIDEpKTsKKyAgICAgICAgICAgIG12ICAgICAgICAgICAgID0gJnMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3MtPmJsb2NrX2luZGV4W2Jsb2NrX251bV0gLSBzLT5iOF9zdHJpZGUgKiAyIC0gMl07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJsb2NrX2lzX2ludHJhICYgMSB8fCByaWdodF9pc19pbnRyYSAmIDEgfHwgbXZbMF1bMF0gIT0gbXZbMV1bMF0gfHwgbXZbMF1bMV0gIT0gbXZbMV1bMV0pIHsKKyAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjgoZHN0LCBsaW5lc2l6ZSwgdi0+cHEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWR4ID0gKChyaWdodF9jYnAgPj4gMSkgfCBibG9ja19jYnApICYgNTsgLy8gRklYTUUgY2hlY2sKKyAgICAgICAgICAgIGlmIChpZHggPT0gNSkgeworICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjgoZHN0LCBsaW5lc2l6ZSwgdi0+cHEpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpZHgpIHsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ID09IDEpCisgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjQoZHN0ICsgNCAqIGxpbmVzaXplLCBsaW5lc2l6ZSwgdi0+cHEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnZjMV9oX2xvb3BfZmlsdGVyNChkc3QsICAgICAgICAgICAgICAgIGxpbmVzaXplLCB2LT5wcSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkc3QgLT0gNDsKKyAgICB0dGJsayA9ICh2LT50dGJsa1tzLT5tYl94IC0gcy0+bWJfc3RyaWRlIC0gMV0gPj4gKGJsb2NrX251bSAqIDQpKSAmIDB4ZjsKKyAgICBpZiAodHRibGsgPT0gVFRfNFg0IHx8IHR0YmxrID09IFRUXzRYOCkgeworICAgICAgICBpZHggPSAoYmxvY2tfY2JwIHwgKGJsb2NrX2NicCA+PiAxKSkgJiA1OworICAgICAgICBpZiAoaWR4ID09IDUpIHsKKyAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjgoZHN0LCBsaW5lc2l6ZSwgdi0+cHEpOworICAgICAgICB9IGVsc2UgaWYgKGlkeCkgeworICAgICAgICAgICAgaWYgKGlkeCA9PSAxKQorICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjQoZHN0ICsgbGluZXNpemUgKiA0LCBsaW5lc2l6ZSwgdi0+cHEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYtPnZjMWRzcC52YzFfaF9sb29wX2ZpbHRlcjQoZHN0LCAgICAgICAgICAgICAgICBsaW5lc2l6ZSwgdi0+cHEpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZmX3ZjMV9hcHBseV9wX2xvb3BfZmlsdGVyKFZDMUNvbnRleHQgKnYpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdi0+czsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgdmMxX2FwcGx5X3Bfdl9sb29wX2ZpbHRlcih2LCBpKTsKKyAgICB9CisKKyAgICAvKiBWIGFsd2F5cyBwcmVjZWRlcyBILCB0aGVyZWZvcmUgd2UgcnVuIEggb25lIE1CIGJlZm9yZSBWOworICAgICAqIGF0IHRoZSBlbmQgb2YgYSByb3csIHdlIGNhdGNoIHVwIHRvIGNvbXBsZXRlIHRoZSByb3cgKi8KKyAgICBpZiAocy0+bWJfeCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICB2YzFfYXBwbHlfcF9oX2xvb3BfZmlsdGVyKHYsIGkpOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5tYl94ID09IHMtPm1iX3dpZHRoIC0gMSkgeworICAgICAgICAgICAgcy0+bWJfeCsrOworICAgICAgICAgICAgZmZfdXBkYXRlX2Jsb2NrX2luZGV4KHMpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgICAgIHZjMV9hcHBseV9wX2hfbG9vcF9maWx0ZXIodiwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92YzFfbWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMV9tYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZThmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92YzFfbWMuYwpAQCAtMCwwICsxLDk1MiBAQAorLyoKKyAqIFZDLTEgYW5kIFdNVjMgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDExIE1hc2hpYXQgU2Fya2VyIFNoYWtraGFyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKiBQYXJ0bHkgYmFzZWQgb24gdmM5LmMgKGMpIDIwMDUgQW5vbnltb3VzLCBBbGV4IEJlcmVnc3phc3ppLCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZDLTEgYW5kIFdNVjMgYmxvY2sgZGVjb2Rpbmcgcm91dGluZXMKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjRjaHJvbWEuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAidmMxLmgiCisKKy8qKiBEbyBtb3Rpb24gY29tcGVuc2F0aW9uIG92ZXIgMSBtYWNyb2Jsb2NrCisgKiBNb3N0bHkgYWRhcHRlZCBocGVsX21vdGlvbiBhbmQgcXBlbF9tb3Rpb24gZnJvbSBtcGVndmlkZW8uYworICovCit2b2lkIGZmX3ZjMV9tY18xbXYoVkMxQ29udGV4dCAqdiwgaW50IGRpcikKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIEgyNjRDaHJvbWFDb250ZXh0ICpoMjY0Y2hyb21hID0gJnYtPmgyNjRjaHJvbWE7CisgICAgdWludDhfdCAqc3JjWSwgKnNyY1UsICpzcmNWOworICAgIGludCBkeHksIG14LCBteSwgdXZteCwgdXZteSwgc3JjX3gsIHNyY195LCB1dnNyY194LCB1dnNyY195OworICAgIGludCB2X2VkZ2VfcG9zID0gcy0+dl9lZGdlX3BvcyA+PiB2LT5maWVsZF9tb2RlOworICAgIGludCBpOworICAgIHVpbnQ4X3QgKCpsdXR5KVsyNTZdLCAoKmx1dHV2KVsyNTZdOworICAgIGludCB1c2VfaWM7CisKKyAgICBpZiAoKCF2LT5maWVsZF9tb2RlIHx8CisgICAgICAgICAodi0+cmVmX2ZpZWxkX3R5cGVbZGlyXSA9PSAxICYmIHYtPmN1cl9maWVsZF90eXBlID09IDEpKSAmJgorICAgICAgICAhdi0+cy5sYXN0X3BpY3R1cmUuZi0+ZGF0YVswXSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbXggPSBzLT5tdltkaXJdWzBdWzBdOworICAgIG15ID0gcy0+bXZbZGlyXVswXVsxXTsKKworICAgIC8vIHN0b3JlIG1vdGlvbiB2ZWN0b3JzIGZvciBmdXJ0aGVyIHVzZSBpbiBCIGZyYW1lcworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbaV0gKyB2LT5ibG9ja3Nfb2ZmXVswXSA9IG14OworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbaV0gKyB2LT5ibG9ja3Nfb2ZmXVsxXSA9IG15OworICAgICAgICB9CisgICAgfQorCisgICAgdXZteCA9IChteCArICgobXggJiAzKSA9PSAzKSkgPj4gMTsKKyAgICB1dm15ID0gKG15ICsgKChteSAmIDMpID09IDMpKSA+PiAxOworICAgIHYtPmx1bWFfbXZbcy0+bWJfeF1bMF0gPSB1dm14OworICAgIHYtPmx1bWFfbXZbcy0+bWJfeF1bMV0gPSB1dm15OworCisgICAgaWYgKHYtPmZpZWxkX21vZGUgJiYKKyAgICAgICAgdi0+Y3VyX2ZpZWxkX3R5cGUgIT0gdi0+cmVmX2ZpZWxkX3R5cGVbZGlyXSkgeworICAgICAgICBteSAgID0gbXkgICAtIDIgKyA0ICogdi0+Y3VyX2ZpZWxkX3R5cGU7CisgICAgICAgIHV2bXkgPSB1dm15IC0gMiArIDQgKiB2LT5jdXJfZmllbGRfdHlwZTsKKyAgICB9CisKKyAgICAvLyBmYXN0dXZtYyBzaGFsbCBiZSBpZ25vcmVkIGZvciBpbnRlcmxhY2VkIGZyYW1lIHBpY3R1cmUKKyAgICBpZiAodi0+ZmFzdHV2bWMgJiYgKHYtPmZjbSAhPSBJTEFDRV9GUkFNRSkpIHsKKyAgICAgICAgdXZteCA9IHV2bXggKyAoKHV2bXggPCAwKSA/ICh1dm14ICYgMSkgOiAtKHV2bXggJiAxKSk7CisgICAgICAgIHV2bXkgPSB1dm15ICsgKCh1dm15IDwgMCkgPyAodXZteSAmIDEpIDogLSh1dm15ICYgMSkpOworICAgIH0KKyAgICBpZiAoIWRpcikgeworICAgICAgICBpZiAodi0+ZmllbGRfbW9kZSAmJiAodi0+Y3VyX2ZpZWxkX3R5cGUgIT0gdi0+cmVmX2ZpZWxkX3R5cGVbZGlyXSkgJiYgdi0+c2Vjb25kX2ZpZWxkKSB7CisgICAgICAgICAgICBzcmNZID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMF07CisgICAgICAgICAgICBzcmNVID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMV07CisgICAgICAgICAgICBzcmNWID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMl07CisgICAgICAgICAgICBsdXR5ICA9IHYtPmN1cnJfbHV0eTsKKyAgICAgICAgICAgIGx1dHV2ID0gdi0+Y3Vycl9sdXR1djsKKyAgICAgICAgICAgIHVzZV9pYyA9ICp2LT5jdXJyX3VzZV9pYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyY1kgPSBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVswXTsKKyAgICAgICAgICAgIHNyY1UgPSBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVsxXTsKKyAgICAgICAgICAgIHNyY1YgPSBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVsyXTsKKyAgICAgICAgICAgIGx1dHkgID0gdi0+bGFzdF9sdXR5OworICAgICAgICAgICAgbHV0dXYgPSB2LT5sYXN0X2x1dHV2OworICAgICAgICAgICAgdXNlX2ljID0gdi0+bGFzdF91c2VfaWM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzcmNZID0gcy0+bmV4dF9waWN0dXJlLmYtPmRhdGFbMF07CisgICAgICAgIHNyY1UgPSBzLT5uZXh0X3BpY3R1cmUuZi0+ZGF0YVsxXTsKKyAgICAgICAgc3JjViA9IHMtPm5leHRfcGljdHVyZS5mLT5kYXRhWzJdOworICAgICAgICBsdXR5ICA9IHYtPm5leHRfbHV0eTsKKyAgICAgICAgbHV0dXYgPSB2LT5uZXh0X2x1dHV2OworICAgICAgICB1c2VfaWMgPSB2LT5uZXh0X3VzZV9pYzsKKyAgICB9CisKKyAgICBpZiAoIXNyY1kgfHwgIXNyY1UpIHsKKyAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19FUlJPUiwgIlJlZmVyZW5jZWQgZnJhbWUgbWlzc2luZy5cbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3JjX3ggICA9IHMtPm1iX3ggKiAxNiArIChteCAgID4+IDIpOworICAgIHNyY195ICAgPSBzLT5tYl95ICogMTYgKyAobXkgICA+PiAyKTsKKyAgICB1dnNyY194ID0gcy0+bWJfeCAqICA4ICsgKHV2bXggPj4gMik7CisgICAgdXZzcmNfeSA9IHMtPm1iX3kgKiAgOCArICh1dm15ID4+IDIpOworCisgICAgaWYgKHYtPnByb2ZpbGUgIT0gUFJPRklMRV9BRFZBTkNFRCkgeworICAgICAgICBzcmNfeCAgID0gYXZfY2xpcCggIHNyY194LCAtMTYsIHMtPm1iX3dpZHRoICAqIDE2KTsKKyAgICAgICAgc3JjX3kgICA9IGF2X2NsaXAoICBzcmNfeSwgLTE2LCBzLT5tYl9oZWlnaHQgKiAxNik7CisgICAgICAgIHV2c3JjX3ggPSBhdl9jbGlwKHV2c3JjX3gsICAtOCwgcy0+bWJfd2lkdGggICogIDgpOworICAgICAgICB1dnNyY195ID0gYXZfY2xpcCh1dnNyY195LCAgLTgsIHMtPm1iX2hlaWdodCAqICA4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcmNfeCAgID0gYXZfY2xpcCggIHNyY194LCAtMTcsIHMtPmF2Y3R4LT5jb2RlZF93aWR0aCk7CisgICAgICAgIHNyY195ICAgPSBhdl9jbGlwKCAgc3JjX3ksIC0xOCwgcy0+YXZjdHgtPmNvZGVkX2hlaWdodCArIDEpOworICAgICAgICB1dnNyY194ID0gYXZfY2xpcCh1dnNyY194LCAgLTgsIHMtPmF2Y3R4LT5jb2RlZF93aWR0aCAgPj4gMSk7CisgICAgICAgIHV2c3JjX3kgPSBhdl9jbGlwKHV2c3JjX3ksICAtOCwgcy0+YXZjdHgtPmNvZGVkX2hlaWdodCA+PiAxKTsKKyAgICB9CisKKyAgICBzcmNZICs9IHNyY195ICAgKiBzLT5saW5lc2l6ZSAgICsgc3JjX3g7CisgICAgc3JjVSArPSB1dnNyY195ICogcy0+dXZsaW5lc2l6ZSArIHV2c3JjX3g7CisgICAgc3JjViArPSB1dnNyY195ICogcy0+dXZsaW5lc2l6ZSArIHV2c3JjX3g7CisKKyAgICBpZiAodi0+ZmllbGRfbW9kZSAmJiB2LT5yZWZfZmllbGRfdHlwZVtkaXJdKSB7CisgICAgICAgIHNyY1kgKz0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+bGluZXNpemVbMF07CisgICAgICAgIHNyY1UgKz0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+bGluZXNpemVbMV07CisgICAgICAgIHNyY1YgKz0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+bGluZXNpemVbMl07CisgICAgfQorCisgICAgLyogZm9yIGdyYXlzY2FsZSB3ZSBzaG91bGQgbm90IHRyeSB0byByZWFkIGZyb20gdW5rbm93biBhcmVhICovCisgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSB7CisgICAgICAgIHNyY1UgPSBzLT5lZGdlX2VtdV9idWZmZXIgKyAxOCAqIHMtPmxpbmVzaXplOworICAgICAgICBzcmNWID0gcy0+ZWRnZV9lbXVfYnVmZmVyICsgMTggKiBzLT5saW5lc2l6ZTsKKyAgICB9CisKKyAgICBpZiAodi0+cmFuZ2VyZWRmcm0gfHwgdXNlX2ljCisgICAgICAgIHx8IHMtPmhfZWRnZV9wb3MgPCAyMiB8fCB2X2VkZ2VfcG9zIDwgMjIKKyAgICAgICAgfHwgKHVuc2lnbmVkKShzcmNfeCAtIHMtPm1zcGVsKSA+IHMtPmhfZWRnZV9wb3MgLSAobXgmMykgLSAxNiAtIHMtPm1zcGVsICogMworICAgICAgICB8fCAodW5zaWduZWQpKHNyY195IC0gMSkgICAgICAgID4gdl9lZGdlX3BvcyAgICAtIChteSYzKSAtIDE2IC0gMykgeworICAgICAgICB1aW50OF90ICp1YnVmID0gcy0+ZWRnZV9lbXVfYnVmZmVyICsgMTkgKiBzLT5saW5lc2l6ZTsKKyAgICAgICAgdWludDhfdCAqdmJ1ZiA9IHVidWYgKyA5ICogcy0+dXZsaW5lc2l6ZTsKKworICAgICAgICBzcmNZIC09IHMtPm1zcGVsICogKDEgKyBzLT5saW5lc2l6ZSk7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsIHNyY1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lc2l6ZSwgcy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNyArIHMtPm1zcGVsICogMiwgMTcgKyBzLT5tc3BlbCAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfeCAtIHMtPm1zcGVsLCBzcmNfeSAtIHMtPm1zcGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3Bvcywgdl9lZGdlX3Bvcyk7CisgICAgICAgIHNyY1kgPSBzLT5lZGdlX2VtdV9idWZmZXI7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh1YnVmLCBzcmNVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZsaW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggKyAxLCA4ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c3JjX3gsIHV2c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHZfZWRnZV9wb3MgPj4gMSk7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh2YnVmLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZsaW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggKyAxLCA4ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c3JjX3gsIHV2c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHZfZWRnZV9wb3MgPj4gMSk7CisgICAgICAgIHNyY1UgPSB1YnVmOworICAgICAgICBzcmNWID0gdmJ1ZjsKKyAgICAgICAgLyogaWYgd2UgZGVhbCB3aXRoIHJhbmdlIHJlZHVjdGlvbiB3ZSBuZWVkIHRvIHNjYWxlIHNvdXJjZSBibG9ja3MgKi8KKyAgICAgICAgaWYgKHYtPnJhbmdlcmVkZnJtKSB7CisgICAgICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgKnNyYzI7CisKKyAgICAgICAgICAgIHNyYyA9IHNyY1k7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTcgKyBzLT5tc3BlbCAqIDI7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNyArIHMtPm1zcGVsICogMjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzcmNbaV0gPSAoKHNyY1tpXSAtIDEyOCkgPj4gMSkgKyAxMjg7CisgICAgICAgICAgICAgICAgc3JjICs9IHMtPmxpbmVzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3JjICA9IHNyY1U7CisgICAgICAgICAgICBzcmMyID0gc3JjVjsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA5OyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNyY1tpXSAgPSAoKHNyY1tpXSAgLSAxMjgpID4+IDEpICsgMTI4OworICAgICAgICAgICAgICAgICAgICBzcmMyW2ldID0gKChzcmMyW2ldIC0gMTI4KSA+PiAxKSArIDEyODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3JjICArPSBzLT51dmxpbmVzaXplOworICAgICAgICAgICAgICAgIHNyYzIgKz0gcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBpZiB3ZSBkZWFsIHdpdGggaW50ZW5zaXR5IGNvbXBlbnNhdGlvbiB3ZSBuZWVkIHRvIHNjYWxlIHNvdXJjZSBibG9ja3MgKi8KKyAgICAgICAgaWYgKHVzZV9pYykgeworICAgICAgICAgICAgaW50IGksIGo7CisgICAgICAgICAgICB1aW50OF90ICpzcmMsICpzcmMyOworCisgICAgICAgICAgICBzcmMgPSBzcmNZOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE3ICsgcy0+bXNwZWwgKiAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgZiA9IHYtPmZpZWxkX21vZGUgPyB2LT5yZWZfZmllbGRfdHlwZVtkaXJdIDogKChqICsgc3JjX3kgLSBzLT5tc3BlbCkgJiAxKSA7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE3ICsgcy0+bXNwZWwgKiAyOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNyY1tpXSA9IGx1dHlbZl1bc3JjW2ldXTsKKyAgICAgICAgICAgICAgICBzcmMgKz0gcy0+bGluZXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgID0gc3JjVTsKKyAgICAgICAgICAgIHNyYzIgPSBzcmNWOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDk7IGorKykgeworICAgICAgICAgICAgICAgIGludCBmID0gdi0+ZmllbGRfbW9kZSA/IHYtPnJlZl9maWVsZF90eXBlW2Rpcl0gOiAoKGogKyB1dnNyY195KSAmIDEpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3JjW2ldICA9IGx1dHV2W2ZdW3NyY1tpXV07CisgICAgICAgICAgICAgICAgICAgIHNyYzJbaV0gPSBsdXR1dltmXVtzcmMyW2ldXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3JjICArPSBzLT51dmxpbmVzaXplOworICAgICAgICAgICAgICAgIHNyYzIgKz0gcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcmNZICs9IHMtPm1zcGVsICogKDEgKyBzLT5saW5lc2l6ZSk7CisgICAgfQorCisgICAgaWYgKHMtPm1zcGVsKSB7CisgICAgICAgIGR4eSA9ICgobXkgJiAzKSA8PCAyKSB8IChteCAmIDMpOworICAgICAgICB2LT52YzFkc3AucHV0X3ZjMV9tc3BlbF9waXhlbHNfdGFiWzBdW2R4eV0ocy0+ZGVzdFswXSAgICAsIHNyY1kgICAgLCBzLT5saW5lc2l6ZSwgdi0+cm5kKTsKKyAgICB9IGVsc2UgeyAvLyBocGVsIG1jIC0gYWx3YXlzIHVzZWQgZm9yIGx1bWEKKyAgICAgICAgZHh5ID0gKG15ICYgMikgfCAoKG14ICYgMikgPj4gMSk7CisgICAgICAgIGlmICghdi0+cm5kKQorICAgICAgICAgICAgcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYlswXVtkeHldKHMtPmRlc3RbMF0sIHNyY1ksIHMtPmxpbmVzaXplLCAxNik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmhkc3AucHV0X25vX3JuZF9waXhlbHNfdGFiWzBdW2R4eV0ocy0+ZGVzdFswXSwgc3JjWSwgcy0+bGluZXNpemUsIDE2KTsKKyAgICB9CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpIHJldHVybjsKKyAgICAvKiBDaHJvbWEgTUMgYWx3YXlzIHVzZXMgcXBlbCBiaWxpbmVhciAqLworICAgIHV2bXggPSAodXZteCAmIDMpIDw8IDE7CisgICAgdXZteSA9ICh1dm15ICYgMykgPDwgMTsKKyAgICBpZiAoIXYtPnJuZCkgeworICAgICAgICBoMjY0Y2hyb21hLT5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlswXShzLT5kZXN0WzFdLCBzcmNVLCBzLT51dmxpbmVzaXplLCA4LCB1dm14LCB1dm15KTsKKyAgICAgICAgaDI2NGNocm9tYS0+cHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWJbMF0ocy0+ZGVzdFsyXSwgc3JjViwgcy0+dXZsaW5lc2l6ZSwgOCwgdXZteCwgdXZteSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdi0+dmMxZHNwLnB1dF9ub19ybmRfdmMxX2Nocm9tYV9waXhlbHNfdGFiWzBdKHMtPmRlc3RbMV0sIHNyY1UsIHMtPnV2bGluZXNpemUsIDgsIHV2bXgsIHV2bXkpOworICAgICAgICB2LT52YzFkc3AucHV0X25vX3JuZF92YzFfY2hyb21hX3BpeGVsc190YWJbMF0ocy0+ZGVzdFsyXSwgc3JjViwgcy0+dXZsaW5lc2l6ZSwgOCwgdXZteCwgdXZteSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBtZWRpYW40KGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKQoreworICAgIGlmIChhIDwgYikgeworICAgICAgICBpZiAoYyA8IGQpIHJldHVybiAoRkZNSU4oYiwgZCkgKyBGRk1BWChhLCBjKSkgLyAyOworICAgICAgICBlbHNlICAgICAgIHJldHVybiAoRkZNSU4oYiwgYykgKyBGRk1BWChhLCBkKSkgLyAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjIDwgZCkgcmV0dXJuIChGRk1JTihhLCBkKSArIEZGTUFYKGIsIGMpKSAvIDI7CisgICAgICAgIGVsc2UgICAgICAgcmV0dXJuIChGRk1JTihhLCBjKSArIEZGTUFYKGIsIGQpKSAvIDI7CisgICAgfQorfQorCisvKiogRG8gbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgNC1NViBtYWNyb2Jsb2NrIC0gbHVtaW5hbmNlIGJsb2NrCisgKi8KK3ZvaWQgZmZfdmMxX21jXzRtdl9sdW1hKFZDMUNvbnRleHQgKnYsIGludCBuLCBpbnQgZGlyLCBpbnQgYXZnKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgdWludDhfdCAqc3JjWTsKKyAgICBpbnQgZHh5LCBteCwgbXksIHNyY194LCBzcmNfeTsKKyAgICBpbnQgb2ZmOworICAgIGludCBmaWVsZG12ID0gKHYtPmZjbSA9PSBJTEFDRV9GUkFNRSkgPyB2LT5ibGtfbXZfdHlwZVtzLT5ibG9ja19pbmRleFtuXV0gOiAwOworICAgIGludCB2X2VkZ2VfcG9zID0gcy0+dl9lZGdlX3BvcyA+PiB2LT5maWVsZF9tb2RlOworICAgIHVpbnQ4X3QgKCpsdXR5KVsyNTZdOworICAgIGludCB1c2VfaWM7CisKKyAgICBpZiAoKCF2LT5maWVsZF9tb2RlIHx8CisgICAgICAgICAodi0+cmVmX2ZpZWxkX3R5cGVbZGlyXSA9PSAxICYmIHYtPmN1cl9maWVsZF90eXBlID09IDEpKSAmJgorICAgICAgICAhdi0+cy5sYXN0X3BpY3R1cmUuZi0+ZGF0YVswXSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbXggPSBzLT5tdltkaXJdW25dWzBdOworICAgIG15ID0gcy0+bXZbZGlyXVtuXVsxXTsKKworICAgIGlmICghZGlyKSB7CisgICAgICAgIGlmICh2LT5maWVsZF9tb2RlICYmICh2LT5jdXJfZmllbGRfdHlwZSAhPSB2LT5yZWZfZmllbGRfdHlwZVtkaXJdKSAmJiB2LT5zZWNvbmRfZmllbGQpIHsKKyAgICAgICAgICAgIHNyY1kgPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVswXTsKKyAgICAgICAgICAgIGx1dHkgPSB2LT5jdXJyX2x1dHk7CisgICAgICAgICAgICB1c2VfaWMgPSAqdi0+Y3Vycl91c2VfaWM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmNZID0gcy0+bGFzdF9waWN0dXJlLmYtPmRhdGFbMF07CisgICAgICAgICAgICBsdXR5ID0gdi0+bGFzdF9sdXR5OworICAgICAgICAgICAgdXNlX2ljID0gdi0+bGFzdF91c2VfaWM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzcmNZID0gcy0+bmV4dF9waWN0dXJlLmYtPmRhdGFbMF07CisgICAgICAgIGx1dHkgPSB2LT5uZXh0X2x1dHk7CisgICAgICAgIHVzZV9pYyA9IHYtPm5leHRfdXNlX2ljOworICAgIH0KKworICAgIGlmICghc3JjWSkgeworICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVmZXJlbmNlZCBmcmFtZSBtaXNzaW5nLlxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodi0+ZmllbGRfbW9kZSkgeworICAgICAgICBpZiAodi0+Y3VyX2ZpZWxkX3R5cGUgIT0gdi0+cmVmX2ZpZWxkX3R5cGVbZGlyXSkKKyAgICAgICAgICAgIG15ID0gbXkgLSAyICsgNCAqIHYtPmN1cl9maWVsZF90eXBlOworICAgIH0KKworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AgJiYgbiA9PSAzICYmIHYtPmZpZWxkX21vZGUpIHsKKyAgICAgICAgaW50IHNhbWVfY291bnQgPSAwLCBvcHBfY291bnQgPSAwLCBrOworICAgICAgICBpbnQgY2hvc2VuX212WzJdWzRdWzJdLCBmOworICAgICAgICBpbnQgdHgsIHR5OworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICBmID0gdi0+bXZfZlswXVtzLT5ibG9ja19pbmRleFtrXSArIHYtPmJsb2Nrc19vZmZdOworICAgICAgICAgICAgY2hvc2VuX212W2ZdW2YgPyBvcHBfY291bnQgOiBzYW1lX2NvdW50XVswXSA9IHMtPm12WzBdW2tdWzBdOworICAgICAgICAgICAgY2hvc2VuX212W2ZdW2YgPyBvcHBfY291bnQgOiBzYW1lX2NvdW50XVsxXSA9IHMtPm12WzBdW2tdWzFdOworICAgICAgICAgICAgb3BwX2NvdW50ICArPSBmOworICAgICAgICAgICAgc2FtZV9jb3VudCArPSAxIC0gZjsKKyAgICAgICAgfQorICAgICAgICBmID0gb3BwX2NvdW50ID4gc2FtZV9jb3VudDsKKyAgICAgICAgc3dpdGNoIChmID8gb3BwX2NvdW50IDogc2FtZV9jb3VudCkgeworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB0eCA9IG1lZGlhbjQoY2hvc2VuX212W2ZdWzBdWzBdLCBjaG9zZW5fbXZbZl1bMV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX212W2ZdWzJdWzBdLCBjaG9zZW5fbXZbZl1bM11bMF0pOworICAgICAgICAgICAgdHkgPSBtZWRpYW40KGNob3Nlbl9tdltmXVswXVsxXSwgY2hvc2VuX212W2ZdWzFdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9tdltmXVsyXVsxXSwgY2hvc2VuX212W2ZdWzNdWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB0eCA9IG1pZF9wcmVkKGNob3Nlbl9tdltmXVswXVswXSwgY2hvc2VuX212W2ZdWzFdWzBdLCBjaG9zZW5fbXZbZl1bMl1bMF0pOworICAgICAgICAgICAgdHkgPSBtaWRfcHJlZChjaG9zZW5fbXZbZl1bMF1bMV0sIGNob3Nlbl9tdltmXVsxXVsxXSwgY2hvc2VuX212W2ZdWzJdWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB0eCA9IChjaG9zZW5fbXZbZl1bMF1bMF0gKyBjaG9zZW5fbXZbZl1bMV1bMF0pIC8gMjsKKyAgICAgICAgICAgIHR5ID0gKGNob3Nlbl9tdltmXVswXVsxXSArIGNob3Nlbl9tdltmXVsxXVsxXSkgLyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICB9CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdICsgdi0+YmxvY2tzX29mZl1bMF0gPSB0eDsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMF0gKyB2LT5ibG9ja3Nfb2ZmXVsxXSA9IHR5OworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQorICAgICAgICAgICAgdi0+bXZfZlsxXVtzLT5ibG9ja19pbmRleFtrXSArIHYtPmJsb2Nrc19vZmZdID0gZjsKKyAgICB9CisKKyAgICBpZiAodi0+ZmNtID09IElMQUNFX0ZSQU1FKSB7ICAvLyBub3Qgc3VyZSBpZiBuZWVkZWQgZm9yIG90aGVyIHR5cGVzIG9mIHBpY3R1cmUKKyAgICAgICAgaW50IHF4LCBxeTsKKyAgICAgICAgaW50IHdpZHRoICA9IHMtPmF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICAgICAgaW50IGhlaWdodCA9IHMtPmF2Y3R4LT5jb2RlZF9oZWlnaHQgPj4gMTsKKyAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkgeworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbbl0gKyB2LT5ibG9ja3Nfb2ZmXVswXSA9IG14OworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbbl0gKyB2LT5ibG9ja3Nfb2ZmXVsxXSA9IG15OworICAgICAgICB9CisgICAgICAgIHF4ID0gKHMtPm1iX3ggKiAxNikgKyAobXggPj4gMik7CisgICAgICAgIHF5ID0gKHMtPm1iX3kgKiAgOCkgKyAobXkgPj4gMyk7CisKKyAgICAgICAgaWYgKHF4IDwgLTE3KQorICAgICAgICAgICAgbXggLT0gNCAqIChxeCArIDE3KTsKKyAgICAgICAgZWxzZSBpZiAocXggPiB3aWR0aCkKKyAgICAgICAgICAgIG14IC09IDQgKiAocXggLSB3aWR0aCk7CisgICAgICAgIGlmIChxeSA8IC0xOCkKKyAgICAgICAgICAgIG15IC09IDggKiAocXkgKyAxOCk7CisgICAgICAgIGVsc2UgaWYgKHF5ID4gaGVpZ2h0ICsgMSkKKyAgICAgICAgICAgIG15IC09IDggKiAocXkgLSBoZWlnaHQgLSAxKTsKKyAgICB9CisKKyAgICBpZiAoKHYtPmZjbSA9PSBJTEFDRV9GUkFNRSkgJiYgZmllbGRtdikKKyAgICAgICAgb2ZmID0gKChuID4gMSkgPyBzLT5saW5lc2l6ZSA6IDApICsgKG4gJiAxKSAqIDg7CisgICAgZWxzZQorICAgICAgICBvZmYgPSBzLT5saW5lc2l6ZSAqIDQgKiAobiAmIDIpICsgKG4gJiAxKSAqIDg7CisKKyAgICBzcmNfeCA9IHMtPm1iX3ggKiAxNiArIChuICYgMSkgKiA4ICsgKG14ID4+IDIpOworICAgIGlmICghZmllbGRtdikKKyAgICAgICAgc3JjX3kgPSBzLT5tYl95ICogMTYgKyAobiAmIDIpICogNCArIChteSA+PiAyKTsKKyAgICBlbHNlCisgICAgICAgIHNyY195ID0gcy0+bWJfeSAqIDE2ICsgKChuID4gMSkgPyAxIDogMCkgKyAobXkgPj4gMik7CisKKyAgICBpZiAodi0+cHJvZmlsZSAhPSBQUk9GSUxFX0FEVkFOQ0VEKSB7CisgICAgICAgIHNyY194ID0gYXZfY2xpcChzcmNfeCwgLTE2LCBzLT5tYl93aWR0aCAgKiAxNik7CisgICAgICAgIHNyY195ID0gYXZfY2xpcChzcmNfeSwgLTE2LCBzLT5tYl9oZWlnaHQgKiAxNik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjX3ggPSBhdl9jbGlwKHNyY194LCAtMTcsIHMtPmF2Y3R4LT5jb2RlZF93aWR0aCk7CisgICAgICAgIGlmICh2LT5mY20gPT0gSUxBQ0VfRlJBTUUpIHsKKyAgICAgICAgICAgIGlmIChzcmNfeSAmIDEpCisgICAgICAgICAgICAgICAgc3JjX3kgPSBhdl9jbGlwKHNyY195LCAtMTcsIHMtPmF2Y3R4LT5jb2RlZF9oZWlnaHQgKyAxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzcmNfeSA9IGF2X2NsaXAoc3JjX3ksIC0xOCwgcy0+YXZjdHgtPmNvZGVkX2hlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmNfeSA9IGF2X2NsaXAoc3JjX3ksIC0xOCwgcy0+YXZjdHgtPmNvZGVkX2hlaWdodCArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgc3JjWSArPSBzcmNfeSAqIHMtPmxpbmVzaXplICsgc3JjX3g7CisgICAgaWYgKHYtPmZpZWxkX21vZGUgJiYgdi0+cmVmX2ZpZWxkX3R5cGVbZGlyXSkKKyAgICAgICAgc3JjWSArPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5saW5lc2l6ZVswXTsKKworICAgIGlmIChmaWVsZG12ICYmICEoc3JjX3kgJiAxKSkKKyAgICAgICAgdl9lZGdlX3Bvcy0tOworICAgIGlmIChmaWVsZG12ICYmIChzcmNfeSAmIDEpICYmIHNyY195IDwgNCkKKyAgICAgICAgc3JjX3ktLTsKKyAgICBpZiAodi0+cmFuZ2VyZWRmcm0gfHwgdXNlX2ljCisgICAgICAgIHx8IHMtPmhfZWRnZV9wb3MgPCAxMyB8fCB2X2VkZ2VfcG9zIDwgMjMKKyAgICAgICAgfHwgKHVuc2lnbmVkKShzcmNfeCAtIHMtPm1zcGVsKSA+IHMtPmhfZWRnZV9wb3MgLSAobXggJiAzKSAtIDggLSBzLT5tc3BlbCAqIDIKKyAgICAgICAgfHwgKHVuc2lnbmVkKShzcmNfeSAtIChzLT5tc3BlbCA8PCBmaWVsZG12KSkgPiB2X2VkZ2VfcG9zIC0gKG15ICYgMykgLSAoKDggKyBzLT5tc3BlbCAqIDIpIDw8IGZpZWxkbXYpKSB7CisgICAgICAgIHNyY1kgLT0gcy0+bXNwZWwgKiAoMSArIChzLT5saW5lc2l6ZSA8PCBmaWVsZG12KSk7CisgICAgICAgIC8qIGNoZWNrIGVtdWxhdGUgZWRnZSBzdHJpZGUgYW5kIG9mZnNldCAqLworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyLCBzcmNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemUsIHMtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSArIHMtPm1zcGVsICogMiwgKDkgKyBzLT5tc3BlbCAqIDIpIDw8IGZpZWxkbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfeCAtIHMtPm1zcGVsLCBzcmNfeSAtIChzLT5tc3BlbCA8PCBmaWVsZG12KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhfZWRnZV9wb3MsIHZfZWRnZV9wb3MpOworICAgICAgICBzcmNZID0gcy0+ZWRnZV9lbXVfYnVmZmVyOworICAgICAgICAvKiBpZiB3ZSBkZWFsIHdpdGggcmFuZ2UgcmVkdWN0aW9uIHdlIG5lZWQgdG8gc2NhbGUgc291cmNlIGJsb2NrcyAqLworICAgICAgICBpZiAodi0+cmFuZ2VyZWRmcm0pIHsKKyAgICAgICAgICAgIGludCBpLCBqOworICAgICAgICAgICAgdWludDhfdCAqc3JjOworCisgICAgICAgICAgICBzcmMgPSBzcmNZOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDkgKyBzLT5tc3BlbCAqIDI7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA5ICsgcy0+bXNwZWwgKiAyOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNyY1tpXSA9ICgoc3JjW2ldIC0gMTI4KSA+PiAxKSArIDEyODsKKyAgICAgICAgICAgICAgICBzcmMgKz0gcy0+bGluZXNpemUgPDwgZmllbGRtdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBpZiB3ZSBkZWFsIHdpdGggaW50ZW5zaXR5IGNvbXBlbnNhdGlvbiB3ZSBuZWVkIHRvIHNjYWxlIHNvdXJjZSBibG9ja3MgKi8KKyAgICAgICAgaWYgKHVzZV9pYykgeworICAgICAgICAgICAgaW50IGksIGo7CisgICAgICAgICAgICB1aW50OF90ICpzcmM7CisKKyAgICAgICAgICAgIHNyYyA9IHNyY1k7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgOSArIHMtPm1zcGVsICogMjsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGYgPSB2LT5maWVsZF9tb2RlID8gdi0+cmVmX2ZpZWxkX3R5cGVbZGlyXSA6ICgoKGo8PGZpZWxkbXYpK3NyY195IC0gKHMtPm1zcGVsIDw8IGZpZWxkbXYpKSAmIDEpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA5ICsgcy0+bXNwZWwgKiAyOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNyY1tpXSA9IGx1dHlbZl1bc3JjW2ldXTsKKyAgICAgICAgICAgICAgICBzcmMgKz0gcy0+bGluZXNpemUgPDwgZmllbGRtdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcmNZICs9IHMtPm1zcGVsICogKDEgKyAocy0+bGluZXNpemUgPDwgZmllbGRtdikpOworICAgIH0KKworICAgIGlmIChzLT5tc3BlbCkgeworICAgICAgICBkeHkgPSAoKG15ICYgMykgPDwgMikgfCAobXggJiAzKTsKKyAgICAgICAgaWYgKGF2ZykKKyAgICAgICAgICAgIHYtPnZjMWRzcC5hdmdfdmMxX21zcGVsX3BpeGVsc190YWJbMV1bZHh5XShzLT5kZXN0WzBdICsgb2ZmLCBzcmNZLCBzLT5saW5lc2l6ZSA8PCBmaWVsZG12LCB2LT5ybmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2LT52YzFkc3AucHV0X3ZjMV9tc3BlbF9waXhlbHNfdGFiWzFdW2R4eV0ocy0+ZGVzdFswXSArIG9mZiwgc3JjWSwgcy0+bGluZXNpemUgPDwgZmllbGRtdiwgdi0+cm5kKTsKKyAgICB9IGVsc2UgeyAvLyBocGVsIG1jIC0gYWx3YXlzIHVzZWQgZm9yIGx1bWEKKyAgICAgICAgZHh5ID0gKG15ICYgMikgfCAoKG14ICYgMikgPj4gMSk7CisgICAgICAgIGlmICghdi0+cm5kKQorICAgICAgICAgICAgcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYlsxXVtkeHldKHMtPmRlc3RbMF0gKyBvZmYsIHNyY1ksIHMtPmxpbmVzaXplLCA4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+aGRzcC5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bZHh5XShzLT5kZXN0WzBdICsgb2ZmLCBzcmNZLCBzLT5saW5lc2l6ZSwgOCk7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X2Nocm9tYV9tdihpbnQgKm12eCwgaW50ICptdnksIGludCAqYSwgaW50IGZsYWcsIGludCAqdHgsIGludCAqdHkpCit7CisgICAgaW50IGlkeCwgaTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGNvdW50WzE2XSA9IHsgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNH07CisKKyAgICBpZHggPSAgKChhWzNdICE9IGZsYWcpIDw8IDMpCisgICAgICAgICB8ICgoYVsyXSAhPSBmbGFnKSA8PCAyKQorICAgICAgICAgfCAoKGFbMV0gIT0gZmxhZykgPDwgMSkKKyAgICAgICAgIHwgIChhWzBdICE9IGZsYWcpOworICAgIGlmICghaWR4KSB7CisgICAgICAgICp0eCA9IG1lZGlhbjQobXZ4WzBdLCBtdnhbMV0sIG12eFsyXSwgbXZ4WzNdKTsKKyAgICAgICAgKnR5ID0gbWVkaWFuNChtdnlbMF0sIG12eVsxXSwgbXZ5WzJdLCBtdnlbM10pOworICAgICAgICByZXR1cm4gNDsKKyAgICB9IGVsc2UgaWYgKGNvdW50W2lkeF0gPT0gMSkgeworICAgICAgICBzd2l0Y2ggKGlkeCkgeworICAgICAgICBjYXNlIDB4MToKKyAgICAgICAgICAgICp0eCA9IG1pZF9wcmVkKG12eFsxXSwgbXZ4WzJdLCBtdnhbM10pOworICAgICAgICAgICAgKnR5ID0gbWlkX3ByZWQobXZ5WzFdLCBtdnlbMl0sIG12eVszXSk7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgY2FzZSAweDI6CisgICAgICAgICAgICAqdHggPSBtaWRfcHJlZChtdnhbMF0sIG12eFsyXSwgbXZ4WzNdKTsKKyAgICAgICAgICAgICp0eSA9IG1pZF9wcmVkKG12eVswXSwgbXZ5WzJdLCBtdnlbM10pOworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIGNhc2UgMHg0OgorICAgICAgICAgICAgKnR4ID0gbWlkX3ByZWQobXZ4WzBdLCBtdnhbMV0sIG12eFszXSk7CisgICAgICAgICAgICAqdHkgPSBtaWRfcHJlZChtdnlbMF0sIG12eVsxXSwgbXZ5WzNdKTsKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICBjYXNlIDB4ODoKKyAgICAgICAgICAgICp0eCA9IG1pZF9wcmVkKG12eFswXSwgbXZ4WzFdLCBtdnhbMl0pOworICAgICAgICAgICAgKnR5ID0gbWlkX3ByZWQobXZ5WzBdLCBtdnlbMV0sIG12eVsyXSk7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY291bnRbaWR4XSA9PSAyKSB7CisgICAgICAgIGludCB0MSA9IDAsIHQyID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIGlmICghYVtpXSkgeworICAgICAgICAgICAgICAgIHQxID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gdDEgKyAxOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgaWYgKCFhW2ldKSB7CisgICAgICAgICAgICAgICAgdDIgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAqdHggPSAobXZ4W3QxXSArIG12eFt0Ml0pIC8gMjsKKyAgICAgICAgKnR5ID0gKG12eVt0MV0gKyBtdnlbdDJdKSAvIDI7CisgICAgICAgIHJldHVybiAyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKy8qKiBEbyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciA0LU1WIG1hY3JvYmxvY2sgLSBib3RoIGNocm9tYSBibG9ja3MKKyAqLwordm9pZCBmZl92YzFfbWNfNG12X2Nocm9tYShWQzFDb250ZXh0ICp2LCBpbnQgZGlyKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgSDI2NENocm9tYUNvbnRleHQgKmgyNjRjaHJvbWEgPSAmdi0+aDI2NGNocm9tYTsKKyAgICB1aW50OF90ICpzcmNVLCAqc3JjVjsKKyAgICBpbnQgdXZteCwgdXZteSwgdXZzcmNfeCwgdXZzcmNfeTsKKyAgICBpbnQgaywgdHggPSAwLCB0eSA9IDA7CisgICAgaW50IG12eFs0XSwgbXZ5WzRdLCBpbnRyYVs0XSwgbXZfZls0XTsKKyAgICBpbnQgdmFsaWRfY291bnQ7CisgICAgaW50IGNocm9tYV9yZWZfdHlwZSA9IHYtPmN1cl9maWVsZF90eXBlOworICAgIGludCB2X2VkZ2VfcG9zID0gcy0+dl9lZGdlX3BvcyA+PiB2LT5maWVsZF9tb2RlOworICAgIHVpbnQ4X3QgKCpsdXR1dilbMjU2XTsKKyAgICBpbnQgdXNlX2ljOworCisgICAgaWYgKCF2LT5maWVsZF9tb2RlICYmICF2LT5zLmxhc3RfcGljdHVyZS5mLT5kYXRhWzBdKQorICAgICAgICByZXR1cm47CisgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgIG12eFtrXSA9IHMtPm12W2Rpcl1ba11bMF07CisgICAgICAgIG12eVtrXSA9IHMtPm12W2Rpcl1ba11bMV07CisgICAgICAgIGludHJhW2tdID0gdi0+bWJfdHlwZVswXVtzLT5ibG9ja19pbmRleFtrXV07CisgICAgICAgIGlmICh2LT5maWVsZF9tb2RlKQorICAgICAgICAgICAgbXZfZltrXSA9IHYtPm12X2ZbZGlyXVtzLT5ibG9ja19pbmRleFtrXSArIHYtPmJsb2Nrc19vZmZdOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBjaHJvbWEgTVYgdmVjdG9yIGZyb20gZm91ciBsdW1hIE1WcyAqLworICAgIGlmICghdi0+ZmllbGRfbW9kZSB8fCAodi0+ZmllbGRfbW9kZSAmJiAhdi0+bnVtcmVmKSkgeworICAgICAgICB2YWxpZF9jb3VudCA9IGdldF9jaHJvbWFfbXYobXZ4LCBtdnksIGludHJhLCAwLCAmdHgsICZ0eSk7CisgICAgICAgIGNocm9tYV9yZWZfdHlwZSA9IHYtPnJlZmZpZWxkOworICAgICAgICBpZiAoIXZhbGlkX2NvdW50KSB7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFswXSArIHYtPmJsb2Nrc19vZmZdWzBdID0gMDsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdICsgdi0+YmxvY2tzX29mZl1bMV0gPSAwOworICAgICAgICAgICAgdi0+bHVtYV9tdltzLT5tYl94XVswXSA9IHYtPmx1bWFfbXZbcy0+bWJfeF1bMV0gPSAwOworICAgICAgICAgICAgcmV0dXJuOyAvL25vIG5lZWQgdG8gZG8gTUMgZm9yIGludHJhIGJsb2NrcworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGRvbWluYW50ID0gMDsKKyAgICAgICAgaWYgKG12X2ZbMF0gKyBtdl9mWzFdICsgbXZfZlsyXSArIG12X2ZbM10gPiAyKQorICAgICAgICAgICAgZG9taW5hbnQgPSAxOworICAgICAgICB2YWxpZF9jb3VudCA9IGdldF9jaHJvbWFfbXYobXZ4LCBtdnksIG12X2YsIGRvbWluYW50LCAmdHgsICZ0eSk7CisgICAgICAgIGlmIChkb21pbmFudCkKKyAgICAgICAgICAgIGNocm9tYV9yZWZfdHlwZSA9ICF2LT5jdXJfZmllbGRfdHlwZTsKKyAgICB9CisgICAgaWYgKHYtPmZpZWxkX21vZGUgJiYgY2hyb21hX3JlZl90eXBlID09IDEgJiYgdi0+Y3VyX2ZpZWxkX3R5cGUgPT0gMSAmJiAhdi0+cy5sYXN0X3BpY3R1cmUuZi0+ZGF0YVswXSkKKyAgICAgICAgcmV0dXJuOworICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdICsgdi0+YmxvY2tzX29mZl1bMF0gPSB0eDsKKyAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFswXSArIHYtPmJsb2Nrc19vZmZdWzFdID0gdHk7CisgICAgdXZteCA9ICh0eCArICgodHggJiAzKSA9PSAzKSkgPj4gMTsKKyAgICB1dm15ID0gKHR5ICsgKCh0eSAmIDMpID09IDMpKSA+PiAxOworCisgICAgdi0+bHVtYV9tdltzLT5tYl94XVswXSA9IHV2bXg7CisgICAgdi0+bHVtYV9tdltzLT5tYl94XVsxXSA9IHV2bXk7CisKKyAgICBpZiAodi0+ZmFzdHV2bWMpIHsKKyAgICAgICAgdXZteCA9IHV2bXggKyAoKHV2bXggPCAwKSA/ICh1dm14ICYgMSkgOiAtKHV2bXggJiAxKSk7CisgICAgICAgIHV2bXkgPSB1dm15ICsgKCh1dm15IDwgMCkgPyAodXZteSAmIDEpIDogLSh1dm15ICYgMSkpOworICAgIH0KKyAgICAvLyBGaWVsZCBjb252ZXJzaW9uIGJpYXMKKyAgICBpZiAodi0+Y3VyX2ZpZWxkX3R5cGUgIT0gY2hyb21hX3JlZl90eXBlKQorICAgICAgICB1dm15ICs9IDIgLSA0ICogY2hyb21hX3JlZl90eXBlOworCisgICAgdXZzcmNfeCA9IHMtPm1iX3ggKiA4ICsgKHV2bXggPj4gMik7CisgICAgdXZzcmNfeSA9IHMtPm1iX3kgKiA4ICsgKHV2bXkgPj4gMik7CisKKyAgICBpZiAodi0+cHJvZmlsZSAhPSBQUk9GSUxFX0FEVkFOQ0VEKSB7CisgICAgICAgIHV2c3JjX3ggPSBhdl9jbGlwKHV2c3JjX3gsIC04LCBzLT5tYl93aWR0aCAgKiA4KTsKKyAgICAgICAgdXZzcmNfeSA9IGF2X2NsaXAodXZzcmNfeSwgLTgsIHMtPm1iX2hlaWdodCAqIDgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHV2c3JjX3ggPSBhdl9jbGlwKHV2c3JjX3gsIC04LCBzLT5hdmN0eC0+Y29kZWRfd2lkdGggID4+IDEpOworICAgICAgICB1dnNyY195ID0gYXZfY2xpcCh1dnNyY195LCAtOCwgcy0+YXZjdHgtPmNvZGVkX2hlaWdodCA+PiAxKTsKKyAgICB9CisKKyAgICBpZiAoIWRpcikgeworICAgICAgICBpZiAodi0+ZmllbGRfbW9kZSAmJiAodi0+Y3VyX2ZpZWxkX3R5cGUgIT0gY2hyb21hX3JlZl90eXBlKSAmJiB2LT5zZWNvbmRfZmllbGQpIHsKKyAgICAgICAgICAgIHNyY1UgPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVsxXTsKKyAgICAgICAgICAgIHNyY1YgPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVsyXTsKKyAgICAgICAgICAgIGx1dHV2ID0gdi0+Y3Vycl9sdXR1djsKKyAgICAgICAgICAgIHVzZV9pYyA9ICp2LT5jdXJyX3VzZV9pYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyY1UgPSBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVsxXTsKKyAgICAgICAgICAgIHNyY1YgPSBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVsyXTsKKyAgICAgICAgICAgIGx1dHV2ID0gdi0+bGFzdF9sdXR1djsKKyAgICAgICAgICAgIHVzZV9pYyA9IHYtPmxhc3RfdXNlX2ljOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjVSA9IHMtPm5leHRfcGljdHVyZS5mLT5kYXRhWzFdOworICAgICAgICBzcmNWID0gcy0+bmV4dF9waWN0dXJlLmYtPmRhdGFbMl07CisgICAgICAgIGx1dHV2ID0gdi0+bmV4dF9sdXR1djsKKyAgICAgICAgdXNlX2ljID0gdi0+bmV4dF91c2VfaWM7CisgICAgfQorCisgICAgaWYgKCFzcmNVKSB7CisgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZWZlcmVuY2VkIGZyYW1lIG1pc3NpbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNyY1UgKz0gdXZzcmNfeSAqIHMtPnV2bGluZXNpemUgKyB1dnNyY194OworICAgIHNyY1YgKz0gdXZzcmNfeSAqIHMtPnV2bGluZXNpemUgKyB1dnNyY194OworCisgICAgaWYgKHYtPmZpZWxkX21vZGUpIHsKKyAgICAgICAgaWYgKGNocm9tYV9yZWZfdHlwZSkgeworICAgICAgICAgICAgc3JjVSArPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgICAgIHNyY1YgKz0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+bGluZXNpemVbMl07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodi0+cmFuZ2VyZWRmcm0gfHwgdXNlX2ljCisgICAgICAgIHx8IHMtPmhfZWRnZV9wb3MgPCAxOCB8fCB2X2VkZ2VfcG9zIDwgMTgKKyAgICAgICAgfHwgKHVuc2lnbmVkKXV2c3JjX3ggPiAocy0+aF9lZGdlX3BvcyA+PiAxKSAtIDkKKyAgICAgICAgfHwgKHVuc2lnbmVkKXV2c3JjX3kgPiAodl9lZGdlX3BvcyAgICA+PiAxKSAtIDkpIHsKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlciwgc3JjVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnV2bGluZXNpemUsIHMtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICsgMSwgOCArIDEsIHV2c3JjX3gsIHV2c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHZfZWRnZV9wb3MgPj4gMSk7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIgKyAxNiwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnV2bGluZXNpemUsIHMtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICsgMSwgOCArIDEsIHV2c3JjX3gsIHV2c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHZfZWRnZV9wb3MgPj4gMSk7CisgICAgICAgIHNyY1UgPSBzLT5lZGdlX2VtdV9idWZmZXI7CisgICAgICAgIHNyY1YgPSBzLT5lZGdlX2VtdV9idWZmZXIgKyAxNjsKKworICAgICAgICAvKiBpZiB3ZSBkZWFsIHdpdGggcmFuZ2UgcmVkdWN0aW9uIHdlIG5lZWQgdG8gc2NhbGUgc291cmNlIGJsb2NrcyAqLworICAgICAgICBpZiAodi0+cmFuZ2VyZWRmcm0pIHsKKyAgICAgICAgICAgIGludCBpLCBqOworICAgICAgICAgICAgdWludDhfdCAqc3JjLCAqc3JjMjsKKworICAgICAgICAgICAgc3JjICA9IHNyY1U7CisgICAgICAgICAgICBzcmMyID0gc3JjVjsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA5OyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNyY1tpXSAgPSAoKHNyY1tpXSAgLSAxMjgpID4+IDEpICsgMTI4OworICAgICAgICAgICAgICAgICAgICBzcmMyW2ldID0gKChzcmMyW2ldIC0gMTI4KSA+PiAxKSArIDEyODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3JjICArPSBzLT51dmxpbmVzaXplOworICAgICAgICAgICAgICAgIHNyYzIgKz0gcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBpZiB3ZSBkZWFsIHdpdGggaW50ZW5zaXR5IGNvbXBlbnNhdGlvbiB3ZSBuZWVkIHRvIHNjYWxlIHNvdXJjZSBibG9ja3MgKi8KKyAgICAgICAgaWYgKHVzZV9pYykgeworICAgICAgICAgICAgaW50IGksIGo7CisgICAgICAgICAgICB1aW50OF90ICpzcmMsICpzcmMyOworCisgICAgICAgICAgICBzcmMgID0gc3JjVTsKKyAgICAgICAgICAgIHNyYzIgPSBzcmNWOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDk7IGorKykgeworICAgICAgICAgICAgICAgIGludCBmID0gdi0+ZmllbGRfbW9kZSA/IGNocm9tYV9yZWZfdHlwZSA6ICgoaiArIHV2c3JjX3kpICYgMSk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzcmNbaV0gID0gbHV0dXZbZl1bc3JjW2ldXTsKKyAgICAgICAgICAgICAgICAgICAgc3JjMltpXSA9IGx1dHV2W2ZdW3NyYzJbaV1dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcmMgICs9IHMtPnV2bGluZXNpemU7CisgICAgICAgICAgICAgICAgc3JjMiArPSBzLT51dmxpbmVzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hyb21hIE1DIGFsd2F5cyB1c2VzIHFwZWwgYmlsaW5lYXIgKi8KKyAgICB1dm14ID0gKHV2bXggJiAzKSA8PCAxOworICAgIHV2bXkgPSAodXZteSAmIDMpIDw8IDE7CisgICAgaWYgKCF2LT5ybmQpIHsKKyAgICAgICAgaDI2NGNocm9tYS0+cHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWJbMF0ocy0+ZGVzdFsxXSwgc3JjVSwgcy0+dXZsaW5lc2l6ZSwgOCwgdXZteCwgdXZteSk7CisgICAgICAgIGgyNjRjaHJvbWEtPnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdKHMtPmRlc3RbMl0sIHNyY1YsIHMtPnV2bGluZXNpemUsIDgsIHV2bXgsIHV2bXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHYtPnZjMWRzcC5wdXRfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlswXShzLT5kZXN0WzFdLCBzcmNVLCBzLT51dmxpbmVzaXplLCA4LCB1dm14LCB1dm15KTsKKyAgICAgICAgdi0+dmMxZHNwLnB1dF9ub19ybmRfdmMxX2Nocm9tYV9waXhlbHNfdGFiWzBdKHMtPmRlc3RbMl0sIHNyY1YsIHMtPnV2bGluZXNpemUsIDgsIHV2bXgsIHV2bXkpOworICAgIH0KK30KKworLyoqIERvIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIDQtTVYgaW50ZXJsYWNlZCBmcmFtZSBjaHJvbWEgbWFjcm9ibG9jayAoYm90aCBVIGFuZCBWKQorICovCit2b2lkIGZmX3ZjMV9tY180bXZfY2hyb21hNChWQzFDb250ZXh0ICp2LCBpbnQgZGlyLCBpbnQgZGlyMiwgaW50IGF2ZykKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIEgyNjRDaHJvbWFDb250ZXh0ICpoMjY0Y2hyb21hID0gJnYtPmgyNjRjaHJvbWE7CisgICAgdWludDhfdCAqc3JjVSwgKnNyY1Y7CisgICAgaW50IHV2c3JjX3gsIHV2c3JjX3k7CisgICAgaW50IHV2bXhfZmllbGRbNF0sIHV2bXlfZmllbGRbNF07CisgICAgaW50IGksIG9mZiwgdHgsIHR5OworICAgIGludCBmaWVsZG12ID0gdi0+YmxrX212X3R5cGVbcy0+YmxvY2tfaW5kZXhbMF1dOworICAgIHN0YXRpYyBjb25zdCBpbnQgc19ybmR0YmxmaWVsZFsxNl0gPSB7IDAsIDAsIDEsIDIsIDQsIDQsIDUsIDYsIDIsIDIsIDMsIDgsIDYsIDYsIDcsIDEyIH07CisgICAgaW50IHZfZGlzdCA9IGZpZWxkbXYgPyAxIDogNDsgLy8gdmVydGljYWwgb2Zmc2V0IGZvciBsb3dlciBzdWItYmxvY2tzCisgICAgaW50IHZfZWRnZV9wb3MgPSBzLT52X2VkZ2VfcG9zID4+IDE7CisgICAgaW50IHVzZV9pYzsKKyAgICB1aW50OF90ICgqbHV0dXYpWzI1Nl07CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaW50IGQgPSBpIDwgMiA/IGRpcjogZGlyMjsKKyAgICAgICAgdHggPSBzLT5tdltkXVtpXVswXTsKKyAgICAgICAgdXZteF9maWVsZFtpXSA9ICh0eCArICgodHggJiAzKSA9PSAzKSkgPj4gMTsKKyAgICAgICAgdHkgPSBzLT5tdltkXVtpXVsxXTsKKyAgICAgICAgaWYgKGZpZWxkbXYpCisgICAgICAgICAgICB1dm15X2ZpZWxkW2ldID0gKHR5ID4+IDQpICogOCArIHNfcm5kdGJsZmllbGRbdHkgJiAweEZdOworICAgICAgICBlbHNlCisgICAgICAgICAgICB1dm15X2ZpZWxkW2ldID0gKHR5ICsgKCh0eSAmIDMpID09IDMpKSA+PiAxOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgb2ZmID0gKGkgJiAxKSAqIDQgKyAoKGkgJiAyKSA/IHZfZGlzdCAqIHMtPnV2bGluZXNpemUgOiAwKTsKKyAgICAgICAgdXZzcmNfeCA9IHMtPm1iX3ggKiA4ICsgIChpICYgMSkgKiA0ICAgICAgICAgICArICh1dm14X2ZpZWxkW2ldID4+IDIpOworICAgICAgICB1dnNyY195ID0gcy0+bWJfeSAqIDggKyAoKGkgJiAyKSA/IHZfZGlzdCA6IDApICsgKHV2bXlfZmllbGRbaV0gPj4gMik7CisgICAgICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQgcHJvcGVyIHB1bGwtYmFjayAoc2VlIHZjMWNyb3Btdi5jLCB2YzFDUk9QTVZfQ2hyb21hUHVsbEJhY2soKSkKKyAgICAgICAgdXZzcmNfeCA9IGF2X2NsaXAodXZzcmNfeCwgLTgsIHMtPmF2Y3R4LT5jb2RlZF93aWR0aCAgPj4gMSk7CisgICAgICAgIHV2c3JjX3kgPSBhdl9jbGlwKHV2c3JjX3ksIC04LCBzLT5hdmN0eC0+Y29kZWRfaGVpZ2h0ID4+IDEpOworICAgICAgICBpZiAoaSA8IDIgPyBkaXIgOiBkaXIyKSB7CisgICAgICAgICAgICBzcmNVID0gcy0+bmV4dF9waWN0dXJlLmYtPmRhdGFbMV07CisgICAgICAgICAgICBzcmNWID0gcy0+bmV4dF9waWN0dXJlLmYtPmRhdGFbMl07CisgICAgICAgICAgICBsdXR1diAgPSB2LT5uZXh0X2x1dHV2OworICAgICAgICAgICAgdXNlX2ljID0gdi0+bmV4dF91c2VfaWM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmNVID0gcy0+bGFzdF9waWN0dXJlLmYtPmRhdGFbMV07CisgICAgICAgICAgICBzcmNWID0gcy0+bGFzdF9waWN0dXJlLmYtPmRhdGFbMl07CisgICAgICAgICAgICBsdXR1diAgPSB2LT5sYXN0X2x1dHV2OworICAgICAgICAgICAgdXNlX2ljID0gdi0+bGFzdF91c2VfaWM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzcmNVKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBzcmNVICs9IHV2c3JjX3kgKiBzLT51dmxpbmVzaXplICsgdXZzcmNfeDsKKyAgICAgICAgc3JjViArPSB1dnNyY195ICogcy0+dXZsaW5lc2l6ZSArIHV2c3JjX3g7CisgICAgICAgIHV2bXhfZmllbGRbaV0gPSAodXZteF9maWVsZFtpXSAmIDMpIDw8IDE7CisgICAgICAgIHV2bXlfZmllbGRbaV0gPSAodXZteV9maWVsZFtpXSAmIDMpIDw8IDE7CisKKyAgICAgICAgaWYgKGZpZWxkbXYgJiYgISh1dnNyY195ICYgMSkpCisgICAgICAgICAgICB2X2VkZ2VfcG9zID0gKHMtPnZfZWRnZV9wb3MgPj4gMSkgLSAxOworCisgICAgICAgIGlmIChmaWVsZG12ICYmICh1dnNyY195ICYgMSkgJiYgdXZzcmNfeSA8IDIpCisgICAgICAgICAgICB1dnNyY195LS07CisgICAgICAgIGlmICh1c2VfaWMKKyAgICAgICAgICAgIHx8IHMtPmhfZWRnZV9wb3MgPCAxMCB8fCB2X2VkZ2VfcG9zIDwgKDUgPDwgZmllbGRtdikKKyAgICAgICAgICAgIHx8ICh1bnNpZ25lZCl1dnNyY194ID4gKHMtPmhfZWRnZV9wb3MgPj4gMSkgLSA1CisgICAgICAgICAgICB8fCAodW5zaWduZWQpdXZzcmNfeSA+IHZfZWRnZV9wb3MgLSAoNSA8PCBmaWVsZG12KSkgeworICAgICAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlciwgc3JjVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT51dmxpbmVzaXplLCBzLT51dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsICg1IDw8IGZpZWxkbXYpLCB1dnNyY194LCB1dnNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhfZWRnZV9wb3MgPj4gMSwgdl9lZGdlX3Bvcyk7CisgICAgICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyICsgMTYsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZsaW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAoNSA8PCBmaWVsZG12KSwgdXZzcmNfeCwgdXZzcmNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHZfZWRnZV9wb3MpOworICAgICAgICAgICAgc3JjVSA9IHMtPmVkZ2VfZW11X2J1ZmZlcjsKKyAgICAgICAgICAgIHNyY1YgPSBzLT5lZGdlX2VtdV9idWZmZXIgKyAxNjsKKworICAgICAgICAgICAgLyogaWYgd2UgZGVhbCB3aXRoIGludGVuc2l0eSBjb21wZW5zYXRpb24gd2UgbmVlZCB0byBzY2FsZSBzb3VyY2UgYmxvY2tzICovCisgICAgICAgICAgICBpZiAodXNlX2ljKSB7CisgICAgICAgICAgICAgICAgaW50IGksIGo7CisgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCAqc3JjMjsKKworICAgICAgICAgICAgICAgIHNyYyAgPSBzcmNVOworICAgICAgICAgICAgICAgIHNyYzIgPSBzcmNWOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGYgPSAodXZzcmNfeSArIChqIDw8IGZpZWxkbXYpKSAmIDE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tpXSAgPSBsdXR1dltmXVtzcmNbaV1dOworICAgICAgICAgICAgICAgICAgICAgICAgc3JjMltpXSA9IGx1dHV2W2ZdW3NyYzJbaV1dOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNyYyAgKz0gcy0+dXZsaW5lc2l6ZSA8PCBmaWVsZG12OworICAgICAgICAgICAgICAgICAgICBzcmMyICs9IHMtPnV2bGluZXNpemUgPDwgZmllbGRtdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2ZykgeworICAgICAgICAgICAgaWYgKCF2LT5ybmQpIHsKKyAgICAgICAgICAgICAgICBoMjY0Y2hyb21hLT5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsxXShzLT5kZXN0WzFdICsgb2ZmLCBzcmNVLCBzLT51dmxpbmVzaXplIDw8IGZpZWxkbXYsIDQsIHV2bXhfZmllbGRbaV0sIHV2bXlfZmllbGRbaV0pOworICAgICAgICAgICAgICAgIGgyNjRjaHJvbWEtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdKHMtPmRlc3RbMl0gKyBvZmYsIHNyY1YsIHMtPnV2bGluZXNpemUgPDwgZmllbGRtdiwgNCwgdXZteF9maWVsZFtpXSwgdXZteV9maWVsZFtpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHYtPnZjMWRzcC5hdmdfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlsxXShzLT5kZXN0WzFdICsgb2ZmLCBzcmNVLCBzLT51dmxpbmVzaXplIDw8IGZpZWxkbXYsIDQsIHV2bXhfZmllbGRbaV0sIHV2bXlfZmllbGRbaV0pOworICAgICAgICAgICAgICAgIHYtPnZjMWRzcC5hdmdfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlsxXShzLT5kZXN0WzJdICsgb2ZmLCBzcmNWLCBzLT51dmxpbmVzaXplIDw8IGZpZWxkbXYsIDQsIHV2bXhfZmllbGRbaV0sIHV2bXlfZmllbGRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCF2LT5ybmQpIHsKKyAgICAgICAgICAgICAgICBoMjY0Y2hyb21hLT5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsxXShzLT5kZXN0WzFdICsgb2ZmLCBzcmNVLCBzLT51dmxpbmVzaXplIDw8IGZpZWxkbXYsIDQsIHV2bXhfZmllbGRbaV0sIHV2bXlfZmllbGRbaV0pOworICAgICAgICAgICAgICAgIGgyNjRjaHJvbWEtPnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdKHMtPmRlc3RbMl0gKyBvZmYsIHNyY1YsIHMtPnV2bGluZXNpemUgPDwgZmllbGRtdiwgNCwgdXZteF9maWVsZFtpXSwgdXZteV9maWVsZFtpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHYtPnZjMWRzcC5wdXRfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlsxXShzLT5kZXN0WzFdICsgb2ZmLCBzcmNVLCBzLT51dmxpbmVzaXplIDw8IGZpZWxkbXYsIDQsIHV2bXhfZmllbGRbaV0sIHV2bXlfZmllbGRbaV0pOworICAgICAgICAgICAgICAgIHYtPnZjMWRzcC5wdXRfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlsxXShzLT5kZXN0WzJdICsgb2ZmLCBzcmNWLCBzLT51dmxpbmVzaXplIDw8IGZpZWxkbXYsIDQsIHV2bXhfZmllbGRbaV0sIHV2bXlfZmllbGRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKiogTW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgZGlyZWN0IG9yIGludGVycG9sYXRlZCBibG9ja3MgaW4gQi1mcmFtZXMKKyAqLwordm9pZCBmZl92YzFfaW50ZXJwX21jKFZDMUNvbnRleHQgKnYpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdi0+czsKKyAgICBIMjY0Q2hyb21hQ29udGV4dCAqaDI2NGNocm9tYSA9ICZ2LT5oMjY0Y2hyb21hOworICAgIHVpbnQ4X3QgKnNyY1ksICpzcmNVLCAqc3JjVjsKKyAgICBpbnQgZHh5LCBteCwgbXksIHV2bXgsIHV2bXksIHNyY194LCBzcmNfeSwgdXZzcmNfeCwgdXZzcmNfeTsKKyAgICBpbnQgb2ZmLCBvZmZfdXY7CisgICAgaW50IHZfZWRnZV9wb3MgPSBzLT52X2VkZ2VfcG9zID4+IHYtPmZpZWxkX21vZGU7CisgICAgaW50IHVzZV9pYyA9IHYtPm5leHRfdXNlX2ljOworCisgICAgaWYgKCF2LT5maWVsZF9tb2RlICYmICF2LT5zLm5leHRfcGljdHVyZS5mLT5kYXRhWzBdKQorICAgICAgICByZXR1cm47CisKKyAgICBteCAgID0gcy0+bXZbMV1bMF1bMF07CisgICAgbXkgICA9IHMtPm12WzFdWzBdWzFdOworICAgIHV2bXggPSAobXggKyAoKG14ICYgMykgPT0gMykpID4+IDE7CisgICAgdXZteSA9IChteSArICgobXkgJiAzKSA9PSAzKSkgPj4gMTsKKyAgICBpZiAodi0+ZmllbGRfbW9kZSAmJiB2LT5jdXJfZmllbGRfdHlwZSAhPSB2LT5yZWZfZmllbGRfdHlwZVsxXSkgeworICAgICAgICBteSAgID0gbXkgICAtIDIgKyA0ICogdi0+Y3VyX2ZpZWxkX3R5cGU7CisgICAgICAgIHV2bXkgPSB1dm15IC0gMiArIDQgKiB2LT5jdXJfZmllbGRfdHlwZTsKKyAgICB9CisgICAgaWYgKHYtPmZhc3R1dm1jKSB7CisgICAgICAgIHV2bXggPSB1dm14ICsgKCh1dm14IDwgMCkgPyAtKHV2bXggJiAxKSA6ICh1dm14ICYgMSkpOworICAgICAgICB1dm15ID0gdXZteSArICgodXZteSA8IDApID8gLSh1dm15ICYgMSkgOiAodXZteSAmIDEpKTsKKyAgICB9CisgICAgc3JjWSA9IHMtPm5leHRfcGljdHVyZS5mLT5kYXRhWzBdOworICAgIHNyY1UgPSBzLT5uZXh0X3BpY3R1cmUuZi0+ZGF0YVsxXTsKKyAgICBzcmNWID0gcy0+bmV4dF9waWN0dXJlLmYtPmRhdGFbMl07CisKKyAgICBzcmNfeCAgID0gcy0+bWJfeCAqIDE2ICsgKG14ICAgPj4gMik7CisgICAgc3JjX3kgICA9IHMtPm1iX3kgKiAxNiArIChteSAgID4+IDIpOworICAgIHV2c3JjX3ggPSBzLT5tYl94ICogIDggKyAodXZteCA+PiAyKTsKKyAgICB1dnNyY195ID0gcy0+bWJfeSAqICA4ICsgKHV2bXkgPj4gMik7CisKKyAgICBpZiAodi0+cHJvZmlsZSAhPSBQUk9GSUxFX0FEVkFOQ0VEKSB7CisgICAgICAgIHNyY194ICAgPSBhdl9jbGlwKCAgc3JjX3gsIC0xNiwgcy0+bWJfd2lkdGggICogMTYpOworICAgICAgICBzcmNfeSAgID0gYXZfY2xpcCggIHNyY195LCAtMTYsIHMtPm1iX2hlaWdodCAqIDE2KTsKKyAgICAgICAgdXZzcmNfeCA9IGF2X2NsaXAodXZzcmNfeCwgIC04LCBzLT5tYl93aWR0aCAgKiAgOCk7CisgICAgICAgIHV2c3JjX3kgPSBhdl9jbGlwKHV2c3JjX3ksICAtOCwgcy0+bWJfaGVpZ2h0ICogIDgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNyY194ICAgPSBhdl9jbGlwKCAgc3JjX3gsIC0xNywgcy0+YXZjdHgtPmNvZGVkX3dpZHRoKTsKKyAgICAgICAgc3JjX3kgICA9IGF2X2NsaXAoICBzcmNfeSwgLTE4LCBzLT5hdmN0eC0+Y29kZWRfaGVpZ2h0ICsgMSk7CisgICAgICAgIHV2c3JjX3ggPSBhdl9jbGlwKHV2c3JjX3gsICAtOCwgcy0+YXZjdHgtPmNvZGVkX3dpZHRoICA+PiAxKTsKKyAgICAgICAgdXZzcmNfeSA9IGF2X2NsaXAodXZzcmNfeSwgIC04LCBzLT5hdmN0eC0+Y29kZWRfaGVpZ2h0ID4+IDEpOworICAgIH0KKworICAgIHNyY1kgKz0gc3JjX3kgICAqIHMtPmxpbmVzaXplICAgKyBzcmNfeDsKKyAgICBzcmNVICs9IHV2c3JjX3kgKiBzLT51dmxpbmVzaXplICsgdXZzcmNfeDsKKyAgICBzcmNWICs9IHV2c3JjX3kgKiBzLT51dmxpbmVzaXplICsgdXZzcmNfeDsKKworICAgIGlmICh2LT5maWVsZF9tb2RlICYmIHYtPnJlZl9maWVsZF90eXBlWzFdKSB7CisgICAgICAgIHNyY1kgKz0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+bGluZXNpemVbMF07CisgICAgICAgIHNyY1UgKz0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+bGluZXNpemVbMV07CisgICAgICAgIHNyY1YgKz0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+bGluZXNpemVbMl07CisgICAgfQorCisgICAgLyogZm9yIGdyYXlzY2FsZSB3ZSBzaG91bGQgbm90IHRyeSB0byByZWFkIGZyb20gdW5rbm93biBhcmVhICovCisgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSB7CisgICAgICAgIHNyY1UgPSBzLT5lZGdlX2VtdV9idWZmZXIgKyAxOCAqIHMtPmxpbmVzaXplOworICAgICAgICBzcmNWID0gcy0+ZWRnZV9lbXVfYnVmZmVyICsgMTggKiBzLT5saW5lc2l6ZTsKKyAgICB9CisKKyAgICBpZiAodi0+cmFuZ2VyZWRmcm0gfHwgcy0+aF9lZGdlX3BvcyA8IDIyIHx8IHZfZWRnZV9wb3MgPCAyMiB8fCB1c2VfaWMKKyAgICAgICAgfHwgKHVuc2lnbmVkKShzcmNfeCAtIDEpID4gcy0+aF9lZGdlX3BvcyAtIChteCAmIDMpIC0gMTYgLSAzCisgICAgICAgIHx8ICh1bnNpZ25lZCkoc3JjX3kgLSAxKSA+IHZfZWRnZV9wb3MgICAgLSAobXkgJiAzKSAtIDE2IC0gMykgeworICAgICAgICB1aW50OF90ICp1YnVmID0gcy0+ZWRnZV9lbXVfYnVmZmVyICsgMTkgKiBzLT5saW5lc2l6ZTsKKyAgICAgICAgdWludDhfdCAqdmJ1ZiA9IHVidWYgKyA5ICogcy0+dXZsaW5lc2l6ZTsKKworICAgICAgICBzcmNZIC09IHMtPm1zcGVsICogKDEgKyBzLT5saW5lc2l6ZSk7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsIHNyY1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lc2l6ZSwgcy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNyArIHMtPm1zcGVsICogMiwgMTcgKyBzLT5tc3BlbCAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfeCAtIHMtPm1zcGVsLCBzcmNfeSAtIHMtPm1zcGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3Bvcywgdl9lZGdlX3Bvcyk7CisgICAgICAgIHNyY1kgPSBzLT5lZGdlX2VtdV9idWZmZXI7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh1YnVmLCBzcmNVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZsaW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggKyAxLCA4ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c3JjX3gsIHV2c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHZfZWRnZV9wb3MgPj4gMSk7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh2YnVmLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZsaW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggKyAxLCA4ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c3JjX3gsIHV2c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHZfZWRnZV9wb3MgPj4gMSk7CisgICAgICAgIHNyY1UgPSB1YnVmOworICAgICAgICBzcmNWID0gdmJ1ZjsKKyAgICAgICAgLyogaWYgd2UgZGVhbCB3aXRoIHJhbmdlIHJlZHVjdGlvbiB3ZSBuZWVkIHRvIHNjYWxlIHNvdXJjZSBibG9ja3MgKi8KKyAgICAgICAgaWYgKHYtPnJhbmdlcmVkZnJtKSB7CisgICAgICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgKnNyYzI7CisKKyAgICAgICAgICAgIHNyYyA9IHNyY1k7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTcgKyBzLT5tc3BlbCAqIDI7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNyArIHMtPm1zcGVsICogMjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzcmNbaV0gPSAoKHNyY1tpXSAtIDEyOCkgPj4gMSkgKyAxMjg7CisgICAgICAgICAgICAgICAgc3JjICs9IHMtPmxpbmVzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3JjID0gc3JjVTsKKyAgICAgICAgICAgIHNyYzIgPSBzcmNWOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDk7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3JjW2ldICA9ICgoc3JjW2ldICAtIDEyOCkgPj4gMSkgKyAxMjg7CisgICAgICAgICAgICAgICAgICAgIHNyYzJbaV0gPSAoKHNyYzJbaV0gLSAxMjgpID4+IDEpICsgMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcmMgICs9IHMtPnV2bGluZXNpemU7CisgICAgICAgICAgICAgICAgc3JjMiArPSBzLT51dmxpbmVzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHVzZV9pYykgeworICAgICAgICAgICAgdWludDhfdCAoKmx1dHkgKVsyNTZdID0gdi0+bmV4dF9sdXR5OworICAgICAgICAgICAgdWludDhfdCAoKmx1dHV2KVsyNTZdID0gdi0+bmV4dF9sdXR1djsKKyAgICAgICAgICAgIGludCBpLCBqOworICAgICAgICAgICAgdWludDhfdCAqc3JjLCAqc3JjMjsKKworICAgICAgICAgICAgc3JjID0gc3JjWTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNyArIHMtPm1zcGVsICogMjsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGYgPSB2LT5maWVsZF9tb2RlID8gdi0+cmVmX2ZpZWxkX3R5cGVbMV0gOiAoKGorc3JjX3kgLSBzLT5tc3BlbCkgJiAxKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTcgKyBzLT5tc3BlbCAqIDI7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgc3JjW2ldID0gbHV0eVtmXVtzcmNbaV1dOworICAgICAgICAgICAgICAgIHNyYyArPSBzLT5saW5lc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyYyAgPSBzcmNVOworICAgICAgICAgICAgc3JjMiA9IHNyY1Y7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgOTsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGYgPSB2LT5maWVsZF9tb2RlID8gdi0+cmVmX2ZpZWxkX3R5cGVbMV0gOiAoKGordXZzcmNfeSkgJiAxKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNyY1tpXSAgPSBsdXR1dltmXVtzcmNbaV1dOworICAgICAgICAgICAgICAgICAgICBzcmMyW2ldID0gbHV0dXZbZl1bc3JjMltpXV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNyYyAgKz0gcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBzcmMyICs9IHMtPnV2bGluZXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3JjWSArPSBzLT5tc3BlbCAqICgxICsgcy0+bGluZXNpemUpOworICAgIH0KKworICAgIG9mZiAgICA9IDA7CisgICAgb2ZmX3V2ID0gMDsKKworICAgIGlmIChzLT5tc3BlbCkgeworICAgICAgICBkeHkgPSAoKG15ICYgMykgPDwgMikgfCAobXggJiAzKTsKKyAgICAgICAgdi0+dmMxZHNwLmF2Z192YzFfbXNwZWxfcGl4ZWxzX3RhYlswXVtkeHldKHMtPmRlc3RbMF0gKyBvZmYgICAgLCBzcmNZICAgICwgcy0+bGluZXNpemUsIHYtPnJuZCk7CisgICAgfSBlbHNlIHsgLy8gaHBlbCBtYworICAgICAgICBkeHkgPSAobXkgJiAyKSB8ICgobXggJiAyKSA+PiAxKTsKKworICAgICAgICBpZiAoIXYtPnJuZCkKKyAgICAgICAgICAgIHMtPmhkc3AuYXZnX3BpeGVsc190YWJbMF1bZHh5XShzLT5kZXN0WzBdICsgb2ZmLCBzcmNZLCBzLT5saW5lc2l6ZSwgMTYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5oZHNwLmF2Z19ub19ybmRfcGl4ZWxzX3RhYltkeHldKHMtPmRlc3RbMF0gKyBvZmYsIHNyY1ksIHMtPmxpbmVzaXplLCAxNik7CisgICAgfQorCisgICAgaWYgKHMtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSByZXR1cm47CisgICAgLyogQ2hyb21hIE1DIGFsd2F5cyB1c2VzIHFwZWwgYmxpbGluZWFyICovCisgICAgdXZteCA9ICh1dm14ICYgMykgPDwgMTsKKyAgICB1dm15ID0gKHV2bXkgJiAzKSA8PCAxOworICAgIGlmICghdi0+cm5kKSB7CisgICAgICAgIGgyNjRjaHJvbWEtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdKHMtPmRlc3RbMV0gKyBvZmZfdXYsIHNyY1UsIHMtPnV2bGluZXNpemUsIDgsIHV2bXgsIHV2bXkpOworICAgICAgICBoMjY0Y2hyb21hLT5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlswXShzLT5kZXN0WzJdICsgb2ZmX3V2LCBzcmNWLCBzLT51dmxpbmVzaXplLCA4LCB1dm14LCB1dm15KTsKKyAgICB9IGVsc2UgeworICAgICAgICB2LT52YzFkc3AuYXZnX25vX3JuZF92YzFfY2hyb21hX3BpeGVsc190YWJbMF0ocy0+ZGVzdFsxXSArIG9mZl91diwgc3JjVSwgcy0+dXZsaW5lc2l6ZSwgOCwgdXZteCwgdXZteSk7CisgICAgICAgIHYtPnZjMWRzcC5hdmdfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlswXShzLT5kZXN0WzJdICsgb2ZmX3V2LCBzcmNWLCBzLT51dmxpbmVzaXplLCA4LCB1dm14LCB1dm15KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92YzFfcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92YzFfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyMzA4ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMV9wYXJzZXIuYwpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIFZDLTEgYW5kIFdNVjMgcGFyc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKiBQYXJ0bHkgYmFzZWQgb24gdmM5LmMgKGMpIDIwMDUgQW5vbnltb3VzLCBBbGV4IEJlcmVnc3phc3ppLCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZDLTEgYW5kIFdNVjMgcGFyc2VyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAidmMxLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworLyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvZiBhIHNlcXVlbmNlLCBlbnRyeSBwb2ludCBvcgorICogIGZyYW1lIGhlYWRlciB3aG9zZSB2YWx1ZXMgd2UgcGF5IGFueSBhdHRlbnRpb24gdG8gKi8KKyNkZWZpbmUgVU5FU0NBUEVEX1RIUkVTSE9MRCAzNworCisvKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9mIGEgc2VxdWVuY2UsIGVudHJ5IHBvaW50IG9yCisgKiAgZnJhbWUgaGVhZGVyIHdoaWNoIG11c3QgYmUgdmFsaWQgbWVtb3J5IChiZWNhdXNlIHRoZXkgYXJlCisgKiAgdXNlZCB0byB1cGRhdGUgdGhlIGJpdHN0cmVhbSBjYWNoZSBpbiBza2lwX2JpdHMoKSBjYWxscykKKyAqLworI2RlZmluZSBVTkVTQ0FQRURfTElNSVQgMTQ0CisKK3R5cGVkZWYgZW51bSB7CisgICAgTk9fTUFUQ0gsCisgICAgT05FX1pFUk8sCisgICAgVFdPX1pFUk9TLAorICAgIE9ORQorfSBWQzFQYXJzZVNlYXJjaFN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUGFyc2VDb250ZXh0IHBjOworICAgIFZDMUNvbnRleHQgdjsKKyAgICB1aW50OF90IHByZXZfc3RhcnRfY29kZTsKKyAgICBzaXplX3QgYnl0ZXNfdG9fc2tpcDsKKyAgICB1aW50OF90IHVuZXNjX2J1ZmZlcltVTkVTQ0FQRURfTElNSVRdOworICAgIHNpemVfdCB1bmVzY19pbmRleDsKKyAgICBWQzFQYXJzZVNlYXJjaFN0YXRlIHNlYXJjaF9zdGF0ZTsKK30gVkMxUGFyc2VDb250ZXh0OworCitzdGF0aWMgdm9pZCB2YzFfZXh0cmFjdF9oZWFkZXIoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICAvKiBQYXJzZSB0aGUgaGVhZGVyIHdlIGp1c3QgZmluaXNoZWQgdW5lc2NhcGluZyAqLworICAgIFZDMVBhcnNlQ29udGV4dCAqdnBjID0gcy0+cHJpdl9kYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IHJldDsKKyAgICB2cGMtPnYucy5hdmN0eCA9IGF2Y3R4OworICAgIHZwYy0+di5wYXJzZV9vbmx5ID0gMTsKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCBidWZfc2l6ZSAqIDgpOworICAgIHN3aXRjaCAodnBjLT5wcmV2X3N0YXJ0X2NvZGUpIHsKKyAgICBjYXNlIFZDMV9DT0RFX1NFUUhEUiAmIDB4RkY6CisgICAgICAgIGZmX3ZjMV9kZWNvZGVfc2VxdWVuY2VfaGVhZGVyKGF2Y3R4LCAmdnBjLT52LCAmZ2IpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZDMV9DT0RFX0VOVFJZUE9JTlQgJiAweEZGOgorICAgICAgICBmZl92YzFfZGVjb2RlX2VudHJ5X3BvaW50KGF2Y3R4LCAmdnBjLT52LCAmZ2IpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZDMV9DT0RFX0ZSQU1FICYgMHhGRjoKKyAgICAgICAgaWYodnBjLT52LnByb2ZpbGUgPCBQUk9GSUxFX0FEVkFOQ0VEKQorICAgICAgICAgICAgcmV0ID0gZmZfdmMxX3BhcnNlX2ZyYW1lX2hlYWRlciAgICAoJnZwYy0+diwgJmdiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gZmZfdmMxX3BhcnNlX2ZyYW1lX2hlYWRlcl9hZHYoJnZwYy0+diwgJmdiKTsKKworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGtlZXAgQVZfUElDVFVSRV9UWVBFX0JJIGludGVybmFsIHRvIFZDMSAqLworICAgICAgICBpZiAodnBjLT52LnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CSSkKKyAgICAgICAgICAgIHMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9COworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5waWN0X3R5cGUgPSB2cGMtPnYucy5waWN0X3R5cGU7CisKKyAgICAgICAgaWYgKGF2Y3R4LT50aWNrc19wZXJfZnJhbWUgPiAxKXsKKyAgICAgICAgICAgIC8vIHByb2Nlc3MgcHVsbGRvd24gZmxhZ3MKKyAgICAgICAgICAgIHMtPnJlcGVhdF9waWN0ID0gMTsKKyAgICAgICAgICAgIC8vIFB1bGxkb3duIGZsYWdzIGFyZSBvbmx5IHZhbGlkIHdoZW4gJ2Jyb2FkY2FzdCcgaGFzIGJlZW4gc2V0LgorICAgICAgICAgICAgLy8gU28gdGlja3NfcGVyX2ZyYW1lIHdpbGwgYmUgMgorICAgICAgICAgICAgaWYgKHZwYy0+di5yZmYpeworICAgICAgICAgICAgICAgIC8vIHJlcGVhdCBmaWVsZAorICAgICAgICAgICAgICAgIHMtPnJlcGVhdF9waWN0ID0gMjsKKyAgICAgICAgICAgIH1lbHNlIGlmICh2cGMtPnYucnB0ZnJtKXsKKyAgICAgICAgICAgICAgICAvLyByZXBlYXQgZnJhbWVzCisgICAgICAgICAgICAgICAgcy0+cmVwZWF0X3BpY3QgPSB2cGMtPnYucnB0ZnJtICogMiArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgcy0+cmVwZWF0X3BpY3QgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZwYy0+di5icm9hZGNhc3QgJiYgdnBjLT52LmludGVybGFjZSAmJiAhdnBjLT52LnBzZikKKyAgICAgICAgICAgIHMtPmZpZWxkX29yZGVyID0gdnBjLT52LnRmZiA/IEFWX0ZJRUxEX1RUIDogQVZfRklFTERfQkI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfUFJPR1JFU1NJVkU7CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdmN0eC0+ZnJhbWVyYXRlLm51bSkKKyAgICAgICAgYXZjdHgtPnRpbWVfYmFzZSA9IGF2X2ludl9xKGF2X211bF9xKGF2Y3R4LT5mcmFtZXJhdGUsIChBVlJhdGlvbmFsKXthdmN0eC0+dGlja3NfcGVyX2ZyYW1lLCAxfSkpOworfQorCitzdGF0aWMgaW50IHZjMV9wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIC8qIEhlcmUgd2UgZG8gdGhlIHNlYXJjaGluZyBmb3IgZnJhbWUgYm91bmRhcmllcyBhbmQgaGVhZGVycyBhdAorICAgICAqIHRoZSBzYW1lIHRpbWUuIE9ubHkgYSBtaW5pbWFsIGFtb3VudCBhdCB0aGUgc3RhcnQgb2YgZWFjaAorICAgICAqIGhlYWRlciBpcyB1bmVzY2FwZWQuICovCisgICAgVkMxUGFyc2VDb250ZXh0ICp2cGMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHBpY19mb3VuZCA9IHZwYy0+cGMuZnJhbWVfc3RhcnRfZm91bmQ7CisgICAgdWludDhfdCAqdW5lc2NfYnVmZmVyID0gdnBjLT51bmVzY19idWZmZXI7CisgICAgc2l6ZV90IHVuZXNjX2luZGV4ID0gdnBjLT51bmVzY19pbmRleDsKKyAgICBWQzFQYXJzZVNlYXJjaFN0YXRlIHNlYXJjaF9zdGF0ZSA9IHZwYy0+c2VhcmNoX3N0YXRlOworICAgIGludCBzdGFydF9jb2RlX2ZvdW5kID0gMDsKKyAgICBpbnQgbmV4dCA9IEVORF9OT1RfRk9VTkQ7CisgICAgaW50IGkgPSB2cGMtPmJ5dGVzX3RvX3NraXA7CisKKyAgICBpZiAocGljX2ZvdW5kICYmIGJ1Zl9zaXplID09IDApIHsKKyAgICAgICAgLyogRU9GIGNvbnNpZGVyZWQgYXMgZW5kIG9mIGZyYW1lICovCisgICAgICAgIG1lbXNldCh1bmVzY19idWZmZXIgKyB1bmVzY19pbmRleCwgMCwgVU5FU0NBUEVEX1RIUkVTSE9MRCAtIHVuZXNjX2luZGV4KTsKKyAgICAgICAgdmMxX2V4dHJhY3RfaGVhZGVyKHMsIGF2Y3R4LCB1bmVzY19idWZmZXIsIHVuZXNjX2luZGV4KTsKKyAgICAgICAgbmV4dCA9IDA7CisgICAgfQorICAgIHdoaWxlIChpIDwgYnVmX3NpemUpIHsKKyAgICAgICAgdWludDhfdCBiOworICAgICAgICBzdGFydF9jb2RlX2ZvdW5kID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBidWZfc2l6ZSAmJiB1bmVzY19pbmRleCA8IFVORVNDQVBFRF9USFJFU0hPTEQpIHsKKyAgICAgICAgICAgIGIgPSBidWZbaSsrXTsKKyAgICAgICAgICAgIHVuZXNjX2J1ZmZlclt1bmVzY19pbmRleCsrXSA9IGI7CisgICAgICAgICAgICBpZiAoc2VhcmNoX3N0YXRlIDw9IE9ORV9aRVJPKQorICAgICAgICAgICAgICAgIHNlYXJjaF9zdGF0ZSA9IGIgPyBOT19NQVRDSCA6IHNlYXJjaF9zdGF0ZSArIDE7CisgICAgICAgICAgICBlbHNlIGlmIChzZWFyY2hfc3RhdGUgPT0gVFdPX1pFUk9TKSB7CisgICAgICAgICAgICAgICAgaWYgKGIgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgc2VhcmNoX3N0YXRlID0gT05FOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB1bmVzY19pbmRleC0tOyAvLyBzd2FsbG93IGVtdWxhdGlvbiBwcmV2ZW50aW9uIGJ5dGUKKyAgICAgICAgICAgICAgICAgICAgc2VhcmNoX3N0YXRlID0gTk9fTUFUQ0g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7IC8vIHNlYXJjaF9zdGF0ZSA9PSBPTkUKKyAgICAgICAgICAgICAgICAvLyBIZWFkZXIgdW5lc2NhcGluZyB0ZXJtaW5hdGVzIGVhcmx5IGR1ZSB0byBkZXRlY3Rpb24gb2YgbmV4dCBzdGFydCBjb2RlCisgICAgICAgICAgICAgICAgc2VhcmNoX3N0YXRlID0gTk9fTUFUQ0g7CisgICAgICAgICAgICAgICAgc3RhcnRfY29kZV9mb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzLT5mbGFncyAmIFBBUlNFUl9GTEFHX0NPTVBMRVRFX0ZSQU1FUykgJiYKKyAgICAgICAgICAgICAgICB1bmVzY19pbmRleCA+PSBVTkVTQ0FQRURfVEhSRVNIT0xEICYmCisgICAgICAgICAgICAgICAgdnBjLT5wcmV2X3N0YXJ0X2NvZGUgPT0gKFZDMV9DT0RFX0ZSQU1FICYgMHhGRikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8ga2VlcCBzY2FubmluZyB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyIGZvcgorICAgICAgICAgICAgLy8gc3RhcnQgY29kZXMgaWYgd2Uga25vdyBpdCBjb250YWlucyBhIGNvbXBsZXRlIGZyYW1lIGFuZAorICAgICAgICAgICAgLy8gd2UndmUgYWxyZWFkeSB1bmVzY2FwZWQgYWxsIHdlIG5lZWQgb2YgdGhlIGZyYW1lIGhlYWRlcgorICAgICAgICAgICAgdmMxX2V4dHJhY3RfaGVhZGVyKHMsIGF2Y3R4LCB1bmVzY19idWZmZXIsIHVuZXNjX2luZGV4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh1bmVzY19pbmRleCA+PSBVTkVTQ0FQRURfVEhSRVNIT0xEICYmICFzdGFydF9jb2RlX2ZvdW5kKSB7CisgICAgICAgICAgICB3aGlsZSAoaSA8IGJ1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKHNlYXJjaF9zdGF0ZSA9PSBOT19NQVRDSCkgeworICAgICAgICAgICAgICAgICAgICBpICs9IHZwYy0+di52YzFkc3Auc3RhcnRjb2RlX2ZpbmRfY2FuZGlkYXRlKGJ1ZiArIGksIGJ1Zl9zaXplIC0gaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF9zdGF0ZSA9IE9ORV9aRVJPOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiID0gYnVmW2krK107CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2hfc3RhdGUgPT0gT05FX1pFUk8pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfc3RhdGUgPSBiID8gTk9fTUFUQ0ggOiBUV09fWkVST1M7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlYXJjaF9zdGF0ZSA9PSBUV09fWkVST1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID49IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoX3N0YXRlID0gYiA9PSAxID8gT05FIDogTk9fTUFUQ0g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIHNlYXJjaF9zdGF0ZSA9PSBPTkUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF9zdGF0ZSA9IE5PX01BVENIOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfY29kZV9mb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhcnRfY29kZV9mb3VuZCkgeworICAgICAgICAgICAgdmMxX2V4dHJhY3RfaGVhZGVyKHMsIGF2Y3R4LCB1bmVzY19idWZmZXIsIHVuZXNjX2luZGV4KTsKKworICAgICAgICAgICAgdnBjLT5wcmV2X3N0YXJ0X2NvZGUgPSBiOworICAgICAgICAgICAgdW5lc2NfaW5kZXggPSAwOworCisgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIFBBUlNFUl9GTEFHX0NPTVBMRVRFX0ZSQU1FUykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBpY19mb3VuZCAmJiAoYiA9PSAoVkMxX0NPREVfRlJBTUUgJiAweEZGKSB8fCBiID09IChWQzFfQ09ERV9GSUVMRCAmIDB4RkYpKSkgeworICAgICAgICAgICAgICAgICAgICBwaWNfZm91bmQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwaWNfZm91bmQgJiYgYiAhPSAoVkMxX0NPREVfRklFTEQgJiAweEZGKSAmJiBiICE9IChWQzFfQ09ERV9TTElDRSAmIDB4RkYpKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBpIC0gNDsKKyAgICAgICAgICAgICAgICAgICAgcGljX2ZvdW5kID0gYiA9PSAoVkMxX0NPREVfRlJBTUUgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9IHBpY19mb3VuZDsKKyAgICB2cGMtPnVuZXNjX2luZGV4ID0gdW5lc2NfaW5kZXg7CisgICAgdnBjLT5zZWFyY2hfc3RhdGUgPSBzZWFyY2hfc3RhdGU7CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVMpIHsKKyAgICAgICAgbmV4dCA9IGJ1Zl9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmZl9jb21iaW5lX2ZyYW1lKCZ2cGMtPnBjLCBuZXh0LCAmYnVmLCAmYnVmX3NpemUpIDwgMCkgeworICAgICAgICAgICAgdnBjLT5ieXRlc190b19za2lwID0gMDsKKyAgICAgICAgICAgICpwb3V0YnVmID0gTlVMTDsKKyAgICAgICAgICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgd2UgcmV0dXJuIHdpdGggYSB2YWxpZCBwb2ludGVyIHRvIGEgY29tYmluZWQgZnJhbWUgYnVmZmVyCisgICAgICogdGhlbiBvbiB0aGUgbmV4dCBjYWxsIHRoZW4gd2UnbGwgaGF2ZSBiZWVuIHVuaGVscGZ1bGx5IHJld291bmQKKyAgICAgKiBieSB1cCB0byA0IGJ5dGVzIChkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHRoZSBzdGFydCBjb2RlCisgICAgICogb3ZlcmxhcHBlZCB0aGUgaW5wdXQgYnVmZmVyLCBhbmQgaWYgc28gYnkgaG93IG11Y2gpLiBXZSBkb24ndAorICAgICAqIHdhbnQgdGhpczogaXQgd2lsbCBlaXRoZXIgY2F1c2Ugc3B1cmlvdXMgc2Vjb25kIGRldGVjdGlvbnMgb2YKKyAgICAgKiB0aGUgc3RhcnQgY29kZSB3ZSd2ZSBhbHJlYWR5IHNlZW4sIG9yIGNhdXNlIGV4dHJhIGJ5dGVzIHRvIGJlCisgICAgICogaW5zZXJ0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB1bmVzY2FwZWQgYnVmZmVyLiAqLworICAgIHZwYy0+Ynl0ZXNfdG9fc2tpcCA9IDQ7CisgICAgaWYgKG5leHQgPCAwICYmIG5leHQgIT0gRU5EX05PVF9GT1VORCkKKyAgICAgICAgdnBjLT5ieXRlc190b19za2lwICs9IG5leHQ7CisKKyAgICAqcG91dGJ1ZiA9IGJ1ZjsKKyAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK3N0YXRpYyBpbnQgdmMxX3NwbGl0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIGludCBpOworICAgIHVpbnQzMl90IHN0YXRlPSAtMTsKKyAgICBpbnQgY2hhcmdlZD0wOworCisgICAgZm9yKGk9MDsgaTxidWZfc2l6ZTsgaSsrKXsKKyAgICAgICAgc3RhdGU9IChzdGF0ZTw8OCkgfCBidWZbaV07CisgICAgICAgIGlmKElTX01BUktFUihzdGF0ZSkpeworICAgICAgICAgICAgaWYoc3RhdGUgPT0gVkMxX0NPREVfU0VRSERSIHx8IHN0YXRlID09IFZDMV9DT0RFX0VOVFJZUE9JTlQpeworICAgICAgICAgICAgICAgIGNoYXJnZWQ9MTsKKyAgICAgICAgICAgIH1lbHNlIGlmKGNoYXJnZWQpeworICAgICAgICAgICAgICAgIHJldHVybiBpLTM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2YzFfcGFyc2VfaW5pdChBVkNvZGVjUGFyc2VyQ29udGV4dCAqcykKK3sKKyAgICBWQzFQYXJzZUNvbnRleHQgKnZwYyA9IHMtPnByaXZfZGF0YTsKKyAgICB2cGMtPnYucy5zbGljZV9jb250ZXh0X2NvdW50ID0gMTsKKyAgICB2cGMtPnYuZmlyc3RfcGljX2hlYWRlcl9mbGFnID0gMTsKKyAgICB2cGMtPnByZXZfc3RhcnRfY29kZSA9IDA7CisgICAgdnBjLT5ieXRlc190b19za2lwID0gMDsKKyAgICB2cGMtPnVuZXNjX2luZGV4ID0gMDsKKyAgICB2cGMtPnNlYXJjaF9zdGF0ZSA9IE5PX01BVENIOworICAgIHJldHVybiBmZl92YzFfaW5pdF9jb21tb24oJnZwYy0+dik7Cit9CisKK0FWQ29kZWNQYXJzZXIgZmZfdmMxX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX1ZDMSB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWQzFQYXJzZUNvbnRleHQpLAorICAgIC5wYXJzZXJfaW5pdCAgICA9IHZjMV9wYXJzZV9pbml0LAorICAgIC5wYXJzZXJfcGFyc2UgICA9IHZjMV9wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKKyAgICAuc3BsaXQgICAgICAgICAgPSB2YzFfc3BsaXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmMxX3ByZWQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMV9wcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5MDhlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMV9wcmVkLmMKQEAgLTAsMCArMSw5NTggQEAKKy8qCisgKiBWQy0xIGFuZCBXTVYzIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYXNoaWF0IFNhcmtlciBTaGFra2hhcgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS29uc3RhbnRpbiBTaGlzaGtvdgorICogUGFydGx5IGJhc2VkIG9uIHZjOS5jIChjKSAyMDA1IEFub255bW91cywgQWxleCBCZXJlZ3N6YXN6aSwgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWQy0xIGFuZCBXTVYzIGJsb2NrIGRlY29kaW5nIHJvdXRpbmVzCisgKi8KKworI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJ2YzEuaCIKKyNpbmNsdWRlICJ2YzFfcHJlZC5oIgorI2luY2x1ZGUgInZjMWRhdGEuaCIKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHNjYWxlZm9yc2FtZV94KFZDMUNvbnRleHQgKnYsIGludCBuIC8qIE1WICovLCBpbnQgZGlyKQoreworICAgIGludCBzY2FsZWR2YWx1ZSwgcmVmZGlzdDsKKyAgICBpbnQgc2NhbGVzYW1lMSwgc2NhbGVzYW1lMjsKKyAgICBpbnQgc2NhbGV6b25lMV94LCB6b25lMW9mZnNldF94OworICAgIGludCB0YWJsZV9pbmRleCA9IGRpciBeIHYtPnNlY29uZF9maWVsZDsKKworICAgIGlmICh2LT5zLnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgcmVmZGlzdCA9IHYtPnJlZmRpc3Q7CisgICAgZWxzZQorICAgICAgICByZWZkaXN0ID0gZGlyID8gdi0+YnJmZCA6IHYtPmZyZmQ7CisgICAgaWYgKHJlZmRpc3QgPiAzKQorICAgICAgICByZWZkaXN0ID0gMzsKKyAgICBzY2FsZXNhbWUxICAgID0gZmZfdmMxX2ZpZWxkX212cHJlZF9zY2FsZXNbdGFibGVfaW5kZXhdWzFdW3JlZmRpc3RdOworICAgIHNjYWxlc2FtZTIgICAgPSBmZl92YzFfZmllbGRfbXZwcmVkX3NjYWxlc1t0YWJsZV9pbmRleF1bMl1bcmVmZGlzdF07CisgICAgc2NhbGV6b25lMV94ICA9IGZmX3ZjMV9maWVsZF9tdnByZWRfc2NhbGVzW3RhYmxlX2luZGV4XVszXVtyZWZkaXN0XTsKKyAgICB6b25lMW9mZnNldF94ID0gZmZfdmMxX2ZpZWxkX212cHJlZF9zY2FsZXNbdGFibGVfaW5kZXhdWzVdW3JlZmRpc3RdOworCisgICAgaWYgKEZGQUJTKG4pID4gMjU1KQorICAgICAgICBzY2FsZWR2YWx1ZSA9IG47CisgICAgZWxzZSB7CisgICAgICAgIGlmIChGRkFCUyhuKSA8IHNjYWxlem9uZTFfeCkKKyAgICAgICAgICAgIHNjYWxlZHZhbHVlID0gKG4gKiBzY2FsZXNhbWUxKSA+PiA4OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICBzY2FsZWR2YWx1ZSA9ICgobiAqIHNjYWxlc2FtZTIpID4+IDgpIC0gem9uZTFvZmZzZXRfeDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzY2FsZWR2YWx1ZSA9ICgobiAqIHNjYWxlc2FtZTIpID4+IDgpICsgem9uZTFvZmZzZXRfeDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXZfY2xpcChzY2FsZWR2YWx1ZSwgLXYtPnJhbmdlX3gsIHYtPnJhbmdlX3ggLSAxKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHNjYWxlZm9yc2FtZV95KFZDMUNvbnRleHQgKnYsIGludCBpLCBpbnQgbiAvKiBNViAqLywgaW50IGRpcikKK3sKKyAgICBpbnQgc2NhbGVkdmFsdWUsIHJlZmRpc3Q7CisgICAgaW50IHNjYWxlc2FtZTEsIHNjYWxlc2FtZTI7CisgICAgaW50IHNjYWxlem9uZTFfeSwgem9uZTFvZmZzZXRfeTsKKyAgICBpbnQgdGFibGVfaW5kZXggPSBkaXIgXiB2LT5zZWNvbmRfZmllbGQ7CisKKyAgICBpZiAodi0+cy5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgIHJlZmRpc3QgPSB2LT5yZWZkaXN0OworICAgIGVsc2UKKyAgICAgICAgcmVmZGlzdCA9IGRpciA/IHYtPmJyZmQgOiB2LT5mcmZkOworICAgIGlmIChyZWZkaXN0ID4gMykKKyAgICAgICAgcmVmZGlzdCA9IDM7CisgICAgc2NhbGVzYW1lMSAgICA9IGZmX3ZjMV9maWVsZF9tdnByZWRfc2NhbGVzW3RhYmxlX2luZGV4XVsxXVtyZWZkaXN0XTsKKyAgICBzY2FsZXNhbWUyICAgID0gZmZfdmMxX2ZpZWxkX212cHJlZF9zY2FsZXNbdGFibGVfaW5kZXhdWzJdW3JlZmRpc3RdOworICAgIHNjYWxlem9uZTFfeSAgPSBmZl92YzFfZmllbGRfbXZwcmVkX3NjYWxlc1t0YWJsZV9pbmRleF1bNF1bcmVmZGlzdF07CisgICAgem9uZTFvZmZzZXRfeSA9IGZmX3ZjMV9maWVsZF9tdnByZWRfc2NhbGVzW3RhYmxlX2luZGV4XVs2XVtyZWZkaXN0XTsKKworICAgIGlmIChGRkFCUyhuKSA+IDYzKQorICAgICAgICBzY2FsZWR2YWx1ZSA9IG47CisgICAgZWxzZSB7CisgICAgICAgIGlmIChGRkFCUyhuKSA8IHNjYWxlem9uZTFfeSkKKyAgICAgICAgICAgIHNjYWxlZHZhbHVlID0gKG4gKiBzY2FsZXNhbWUxKSA+PiA4OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICBzY2FsZWR2YWx1ZSA9ICgobiAqIHNjYWxlc2FtZTIpID4+IDgpIC0gem9uZTFvZmZzZXRfeTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzY2FsZWR2YWx1ZSA9ICgobiAqIHNjYWxlc2FtZTIpID4+IDgpICsgem9uZTFvZmZzZXRfeTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2LT5jdXJfZmllbGRfdHlwZSAmJiAhdi0+cmVmX2ZpZWxkX3R5cGVbZGlyXSkKKyAgICAgICAgcmV0dXJuIGF2X2NsaXAoc2NhbGVkdmFsdWUsIC12LT5yYW5nZV95IC8gMiArIDEsIHYtPnJhbmdlX3kgLyAyKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBhdl9jbGlwKHNjYWxlZHZhbHVlLCAtdi0+cmFuZ2VfeSAvIDIsIHYtPnJhbmdlX3kgLyAyIC0gMSk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBzY2FsZWZvcm9wcF94KFZDMUNvbnRleHQgKnYsIGludCBuIC8qIE1WICovKQoreworICAgIGludCBzY2FsZXpvbmUxX3gsIHpvbmUxb2Zmc2V0X3g7CisgICAgaW50IHNjYWxlb3BwMSwgc2NhbGVvcHAyLCBicmZkOworICAgIGludCBzY2FsZWR2YWx1ZTsKKworICAgIGJyZmQgPSBGRk1JTih2LT5icmZkLCAzKTsKKyAgICBzY2FsZXpvbmUxX3ggID0gZmZfdmMxX2JfZmllbGRfbXZwcmVkX3NjYWxlc1szXVticmZkXTsKKyAgICB6b25lMW9mZnNldF94ID0gZmZfdmMxX2JfZmllbGRfbXZwcmVkX3NjYWxlc1s1XVticmZkXTsKKyAgICBzY2FsZW9wcDEgICAgID0gZmZfdmMxX2JfZmllbGRfbXZwcmVkX3NjYWxlc1sxXVticmZkXTsKKyAgICBzY2FsZW9wcDIgICAgID0gZmZfdmMxX2JfZmllbGRfbXZwcmVkX3NjYWxlc1syXVticmZkXTsKKworICAgIGlmIChGRkFCUyhuKSA+IDI1NSkKKyAgICAgICAgc2NhbGVkdmFsdWUgPSBuOworICAgIGVsc2UgeworICAgICAgICBpZiAoRkZBQlMobikgPCBzY2FsZXpvbmUxX3gpCisgICAgICAgICAgICBzY2FsZWR2YWx1ZSA9IChuICogc2NhbGVvcHAxKSA+PiA4OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICBzY2FsZWR2YWx1ZSA9ICgobiAqIHNjYWxlb3BwMikgPj4gOCkgLSB6b25lMW9mZnNldF94OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNjYWxlZHZhbHVlID0gKChuICogc2NhbGVvcHAyKSA+PiA4KSArIHpvbmUxb2Zmc2V0X3g7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF2X2NsaXAoc2NhbGVkdmFsdWUsIC12LT5yYW5nZV94LCB2LT5yYW5nZV94IC0gMSk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBzY2FsZWZvcm9wcF95KFZDMUNvbnRleHQgKnYsIGludCBuIC8qIE1WICovLCBpbnQgZGlyKQoreworICAgIGludCBzY2FsZXpvbmUxX3ksIHpvbmUxb2Zmc2V0X3k7CisgICAgaW50IHNjYWxlb3BwMSwgc2NhbGVvcHAyLCBicmZkOworICAgIGludCBzY2FsZWR2YWx1ZTsKKworICAgIGJyZmQgPSBGRk1JTih2LT5icmZkLCAzKTsKKyAgICBzY2FsZXpvbmUxX3kgID0gZmZfdmMxX2JfZmllbGRfbXZwcmVkX3NjYWxlc1s0XVticmZkXTsKKyAgICB6b25lMW9mZnNldF95ID0gZmZfdmMxX2JfZmllbGRfbXZwcmVkX3NjYWxlc1s2XVticmZkXTsKKyAgICBzY2FsZW9wcDEgICAgID0gZmZfdmMxX2JfZmllbGRfbXZwcmVkX3NjYWxlc1sxXVticmZkXTsKKyAgICBzY2FsZW9wcDIgICAgID0gZmZfdmMxX2JfZmllbGRfbXZwcmVkX3NjYWxlc1syXVticmZkXTsKKworICAgIGlmIChGRkFCUyhuKSA+IDYzKQorICAgICAgICBzY2FsZWR2YWx1ZSA9IG47CisgICAgZWxzZSB7CisgICAgICAgIGlmIChGRkFCUyhuKSA8IHNjYWxlem9uZTFfeSkKKyAgICAgICAgICAgIHNjYWxlZHZhbHVlID0gKG4gKiBzY2FsZW9wcDEpID4+IDg7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIHNjYWxlZHZhbHVlID0gKChuICogc2NhbGVvcHAyKSA+PiA4KSAtIHpvbmUxb2Zmc2V0X3k7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2NhbGVkdmFsdWUgPSAoKG4gKiBzY2FsZW9wcDIpID4+IDgpICsgem9uZTFvZmZzZXRfeTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodi0+Y3VyX2ZpZWxkX3R5cGUgJiYgIXYtPnJlZl9maWVsZF90eXBlW2Rpcl0pIHsKKyAgICAgICAgcmV0dXJuIGF2X2NsaXAoc2NhbGVkdmFsdWUsIC12LT5yYW5nZV95IC8gMiArIDEsIHYtPnJhbmdlX3kgLyAyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYXZfY2xpcChzY2FsZWR2YWx1ZSwgLXYtPnJhbmdlX3kgLyAyLCB2LT5yYW5nZV95IC8gMiAtIDEpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHNjYWxlZm9yc2FtZShWQzFDb250ZXh0ICp2LCBpbnQgaSwgaW50IG4gLyogTVYgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaW0sIGludCBkaXIpCit7CisgICAgaW50IGJyZmQsIHNjYWxlc2FtZTsKKyAgICBpbnQgaHBlbCA9IDEgLSB2LT5zLnF1YXJ0ZXJfc2FtcGxlOworCisgICAgbiA+Pj0gaHBlbDsKKyAgICBpZiAodi0+cy5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IgfHwgdi0+c2Vjb25kX2ZpZWxkIHx8ICFkaXIpIHsKKyAgICAgICAgaWYgKGRpbSkKKyAgICAgICAgICAgIG4gPSBzY2FsZWZvcnNhbWVfeSh2LCBpLCBuLCBkaXIpIDw8IGhwZWw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG4gPSBzY2FsZWZvcnNhbWVfeCh2LCBuLCBkaXIpIDw8IGhwZWw7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKyAgICBicmZkICAgICAgPSBGRk1JTih2LT5icmZkLCAzKTsKKyAgICBzY2FsZXNhbWUgPSBmZl92YzFfYl9maWVsZF9tdnByZWRfc2NhbGVzWzBdW2JyZmRdOworCisgICAgbiA9IChuICogc2NhbGVzYW1lID4+IDgpIDw8IGhwZWw7CisgICAgcmV0dXJuIG47Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBzY2FsZWZvcm9wcChWQzFDb250ZXh0ICp2LCBpbnQgbiAvKiBNViAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGltLCBpbnQgZGlyKQoreworICAgIGludCByZWZkaXN0LCBzY2FsZW9wcDsKKyAgICBpbnQgaHBlbCA9IDEgLSB2LT5zLnF1YXJ0ZXJfc2FtcGxlOworCisgICAgbiA+Pj0gaHBlbDsKKyAgICBpZiAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgIXYtPnNlY29uZF9maWVsZCAmJiBkaXIgPT0gMSkgeworICAgICAgICBpZiAoZGltKQorICAgICAgICAgICAgbiA9IHNjYWxlZm9yb3BwX3kodiwgbiwgZGlyKSA8PCBocGVsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuID0gc2NhbGVmb3JvcHBfeCh2LCBuKSA8PCBocGVsOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisgICAgaWYgKHYtPnMucGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICByZWZkaXN0ID0gRkZNSU4odi0+cmVmZGlzdCwgMyk7CisgICAgZWxzZQorICAgICAgICByZWZkaXN0ID0gZGlyID8gdi0+YnJmZCA6IHYtPmZyZmQ7CisgICAgc2NhbGVvcHAgPSBmZl92YzFfZmllbGRfbXZwcmVkX3NjYWxlc1tkaXIgXiB2LT5zZWNvbmRfZmllbGRdWzBdW3JlZmRpc3RdOworCisgICAgbiA9IChuICogc2NhbGVvcHAgPj4gOCkgPDwgaHBlbDsKKyAgICByZXR1cm4gbjsKK30KKworLyoqIFByZWRpY3QgYW5kIHNldCBtb3Rpb24gdmVjdG9yCisgKi8KK3ZvaWQgZmZfdmMxX3ByZWRfbXYoVkMxQ29udGV4dCAqdiwgaW50IG4sIGludCBkbXZfeCwgaW50IGRtdl95LAorICAgICAgICAgICAgICAgICAgICBpbnQgbXYxLCBpbnQgcl94LCBpbnQgcl95LCB1aW50OF90KiBpc19pbnRyYSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHByZWRfZmxhZywgaW50IGRpcikKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIGludCB4eSwgd3JhcCwgb2ZmID0gMDsKKyAgICBpbnQxNl90ICpBLCAqQiwgKkM7CisgICAgaW50IHB4LCBweTsKKyAgICBpbnQgc3VtOworICAgIGludCBtaXhlZG12X3BpYywgbnVtX3NhbWVmaWVsZCA9IDAsIG51bV9vcHBmaWVsZCA9IDA7CisgICAgaW50IG9wcG9zaXRlLCBhX2YsIGJfZiwgY19mOworICAgIGludDE2X3QgZmllbGRfcHJlZEFbMl07CisgICAgaW50MTZfdCBmaWVsZF9wcmVkQlsyXTsKKyAgICBpbnQxNl90IGZpZWxkX3ByZWRDWzJdOworICAgIGludCBhX3ZhbGlkLCBiX3ZhbGlkLCBjX3ZhbGlkOworICAgIGludCBoeWJyaWRtdl90aHJlc2gsIHlfYmlhcyA9IDA7CisKKyAgICBpZiAodi0+bXZfbW9kZSA9PSBNVl9QTU9ERV9NSVhFRF9NViB8fAorICAgICAgICAoKHYtPm12X21vZGUgPT0gTVZfUE1PREVfSU5URU5TSVRZX0NPTVApICYmICh2LT5tdl9tb2RlMiA9PSBNVl9QTU9ERV9NSVhFRF9NVikpKQorICAgICAgICBtaXhlZG12X3BpYyA9IDE7CisgICAgZWxzZQorICAgICAgICBtaXhlZG12X3BpYyA9IDA7CisgICAgLyogc2NhbGUgTVYgZGlmZmVyZW5jZSB0byBiZSBxdWFkLXBlbCAqLworICAgIGRtdl94IDw8PSAxIC0gcy0+cXVhcnRlcl9zYW1wbGU7CisgICAgZG12X3kgPDw9IDEgLSBzLT5xdWFydGVyX3NhbXBsZTsKKworICAgIHdyYXAgPSBzLT5iOF9zdHJpZGU7CisgICAgeHkgICA9IHMtPmJsb2NrX2luZGV4W25dOworCisgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgIHMtPm12WzBdW25dWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1beHkgKyB2LT5ibG9ja3Nfb2ZmXVswXSA9IDA7CisgICAgICAgIHMtPm12WzBdW25dWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1beHkgKyB2LT5ibG9ja3Nfb2ZmXVsxXSA9IDA7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3h5ICsgdi0+YmxvY2tzX29mZl1bMF0gPSAwOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSArIHYtPmJsb2Nrc19vZmZdWzFdID0gMDsKKyAgICAgICAgaWYgKG12MSkgeyAvKiBkdXBsaWNhdGUgbW90aW9uIGRhdGEgZm9yIDEtTVYgYmxvY2sgKi8KKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5ICsgMSArIHYtPmJsb2Nrc19vZmZdWzBdICAgICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eSArIDEgKyB2LT5ibG9ja3Nfb2ZmXVsxXSAgICAgICAgPSAwOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1beHkgKyB3cmFwICsgdi0+YmxvY2tzX29mZl1bMF0gICAgID0gMDsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5ICsgd3JhcCArIHYtPmJsb2Nrc19vZmZdWzFdICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eSArIHdyYXAgKyAxICsgdi0+YmxvY2tzX29mZl1bMF0gPSAwOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1beHkgKyB3cmFwICsgMSArIHYtPmJsb2Nrc19vZmZdWzFdID0gMDsKKyAgICAgICAgICAgIHYtPmx1bWFfbXZbcy0+bWJfeF1bMF0gPSB2LT5sdW1hX212W3MtPm1iX3hdWzFdID0gMDsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3h5ICsgMSArIHYtPmJsb2Nrc19vZmZdWzBdICAgICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSArIDEgKyB2LT5ibG9ja3Nfb2ZmXVsxXSAgICAgICAgPSAwOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1beHkgKyB3cmFwXVswXSAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3h5ICsgd3JhcCArIHYtPmJsb2Nrc19vZmZdWzFdICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSArIHdyYXAgKyAxICsgdi0+YmxvY2tzX29mZl1bMF0gPSAwOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1beHkgKyB3cmFwICsgMSArIHYtPmJsb2Nrc19vZmZdWzFdID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQyA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgLSAgICAxICsgdi0+YmxvY2tzX29mZl07CisgICAgQSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgLSB3cmFwICsgdi0+YmxvY2tzX29mZl07CisgICAgaWYgKG12MSkgeworICAgICAgICBpZiAodi0+ZmllbGRfbW9kZSAmJiBtaXhlZG12X3BpYykKKyAgICAgICAgICAgIG9mZiA9IChzLT5tYl94ID09IChzLT5tYl93aWR0aCAtIDEpKSA/IC0yIDogMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb2ZmID0gKHMtPm1iX3ggPT0gKHMtPm1iX3dpZHRoIC0gMSkpID8gLTEgOiAyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vaW4gNC1NViBtb2RlIGRpZmZlcmVudCBibG9ja3MgaGF2ZSBkaWZmZXJlbnQgQiBwcmVkaWN0b3IgcG9zaXRpb24KKyAgICAgICAgc3dpdGNoIChuKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIG9mZiA9IChzLT5tYl94ID4gMCkgPyAtMSA6IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgb2ZmID0gKHMtPm1iX3ggPT0gKHMtPm1iX3dpZHRoIC0gMSkpID8gLTEgOiAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIG9mZiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgb2ZmID0gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgQiA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgLSB3cmFwICsgb2ZmICsgdi0+YmxvY2tzX29mZl07CisKKyAgICBhX3ZhbGlkID0gIXMtPmZpcnN0X3NsaWNlX2xpbmUgfHwgKG4gPT0gMiB8fCBuID09IDMpOworICAgIGJfdmFsaWQgPSBhX3ZhbGlkICYmIChzLT5tYl93aWR0aCA+IDEpOworICAgIGNfdmFsaWQgPSBzLT5tYl94IHx8IChuID09IDEgfHwgbiA9PSAzKTsKKyAgICBpZiAodi0+ZmllbGRfbW9kZSkgeworICAgICAgICBhX3ZhbGlkID0gYV92YWxpZCAmJiAhaXNfaW50cmFbeHkgLSB3cmFwXTsKKyAgICAgICAgYl92YWxpZCA9IGJfdmFsaWQgJiYgIWlzX2ludHJhW3h5IC0gd3JhcCArIG9mZl07CisgICAgICAgIGNfdmFsaWQgPSBjX3ZhbGlkICYmICFpc19pbnRyYVt4eSAtIDFdOworICAgIH0KKworICAgIGlmIChhX3ZhbGlkKSB7CisgICAgICAgIGFfZiA9IHYtPm12X2ZbZGlyXVt4eSAtIHdyYXAgKyB2LT5ibG9ja3Nfb2ZmXTsKKyAgICAgICAgbnVtX29wcGZpZWxkICArPSBhX2Y7CisgICAgICAgIG51bV9zYW1lZmllbGQgKz0gMSAtIGFfZjsKKyAgICAgICAgZmllbGRfcHJlZEFbMF0gPSBBWzBdOworICAgICAgICBmaWVsZF9wcmVkQVsxXSA9IEFbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmllbGRfcHJlZEFbMF0gPSBmaWVsZF9wcmVkQVsxXSA9IDA7CisgICAgICAgIGFfZiA9IDA7CisgICAgfQorICAgIGlmIChiX3ZhbGlkKSB7CisgICAgICAgIGJfZiA9IHYtPm12X2ZbZGlyXVt4eSAtIHdyYXAgKyBvZmYgKyB2LT5ibG9ja3Nfb2ZmXTsKKyAgICAgICAgbnVtX29wcGZpZWxkICArPSBiX2Y7CisgICAgICAgIG51bV9zYW1lZmllbGQgKz0gMSAtIGJfZjsKKyAgICAgICAgZmllbGRfcHJlZEJbMF0gPSBCWzBdOworICAgICAgICBmaWVsZF9wcmVkQlsxXSA9IEJbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmllbGRfcHJlZEJbMF0gPSBmaWVsZF9wcmVkQlsxXSA9IDA7CisgICAgICAgIGJfZiA9IDA7CisgICAgfQorICAgIGlmIChjX3ZhbGlkKSB7CisgICAgICAgIGNfZiA9IHYtPm12X2ZbZGlyXVt4eSAtIDEgKyB2LT5ibG9ja3Nfb2ZmXTsKKyAgICAgICAgbnVtX29wcGZpZWxkICArPSBjX2Y7CisgICAgICAgIG51bV9zYW1lZmllbGQgKz0gMSAtIGNfZjsKKyAgICAgICAgZmllbGRfcHJlZENbMF0gPSBDWzBdOworICAgICAgICBmaWVsZF9wcmVkQ1sxXSA9IENbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmllbGRfcHJlZENbMF0gPSBmaWVsZF9wcmVkQ1sxXSA9IDA7CisgICAgICAgIGNfZiA9IDA7CisgICAgfQorCisgICAgaWYgKHYtPmZpZWxkX21vZGUpIHsKKyAgICAgICAgaWYgKCF2LT5udW1yZWYpCisgICAgICAgICAgICAvLyBSRUZGSUVMRCBkZXRlcm1pbmVzIGlmIHRoZSBsYXN0IGZpZWxkIG9yIHRoZSBzZWNvbmQtbGFzdCBmaWVsZCBpcworICAgICAgICAgICAgLy8gdG8gYmUgdXNlZCBhcyByZWZlcmVuY2UKKyAgICAgICAgICAgIG9wcG9zaXRlID0gMSAtIHYtPnJlZmZpZWxkOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChudW1fc2FtZWZpZWxkIDw9IG51bV9vcHBmaWVsZCkKKyAgICAgICAgICAgICAgICBvcHBvc2l0ZSA9IDEgLSBwcmVkX2ZsYWc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3Bwb3NpdGUgPSBwcmVkX2ZsYWc7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgb3Bwb3NpdGUgPSAwOworICAgIGlmIChvcHBvc2l0ZSkgeworICAgICAgICBpZiAoYV92YWxpZCAmJiAhYV9mKSB7CisgICAgICAgICAgICBmaWVsZF9wcmVkQVswXSA9IHNjYWxlZm9yb3BwKHYsIGZpZWxkX3ByZWRBWzBdLCAwLCBkaXIpOworICAgICAgICAgICAgZmllbGRfcHJlZEFbMV0gPSBzY2FsZWZvcm9wcCh2LCBmaWVsZF9wcmVkQVsxXSwgMSwgZGlyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYl92YWxpZCAmJiAhYl9mKSB7CisgICAgICAgICAgICBmaWVsZF9wcmVkQlswXSA9IHNjYWxlZm9yb3BwKHYsIGZpZWxkX3ByZWRCWzBdLCAwLCBkaXIpOworICAgICAgICAgICAgZmllbGRfcHJlZEJbMV0gPSBzY2FsZWZvcm9wcCh2LCBmaWVsZF9wcmVkQlsxXSwgMSwgZGlyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY192YWxpZCAmJiAhY19mKSB7CisgICAgICAgICAgICBmaWVsZF9wcmVkQ1swXSA9IHNjYWxlZm9yb3BwKHYsIGZpZWxkX3ByZWRDWzBdLCAwLCBkaXIpOworICAgICAgICAgICAgZmllbGRfcHJlZENbMV0gPSBzY2FsZWZvcm9wcCh2LCBmaWVsZF9wcmVkQ1sxXSwgMSwgZGlyKTsKKyAgICAgICAgfQorICAgICAgICB2LT5tdl9mW2Rpcl1beHkgKyB2LT5ibG9ja3Nfb2ZmXSA9IDE7CisgICAgICAgIHYtPnJlZl9maWVsZF90eXBlW2Rpcl0gPSAhdi0+Y3VyX2ZpZWxkX3R5cGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFfdmFsaWQgJiYgYV9mKSB7CisgICAgICAgICAgICBmaWVsZF9wcmVkQVswXSA9IHNjYWxlZm9yc2FtZSh2LCBuLCBmaWVsZF9wcmVkQVswXSwgMCwgZGlyKTsKKyAgICAgICAgICAgIGZpZWxkX3ByZWRBWzFdID0gc2NhbGVmb3JzYW1lKHYsIG4sIGZpZWxkX3ByZWRBWzFdLCAxLCBkaXIpOworICAgICAgICB9CisgICAgICAgIGlmIChiX3ZhbGlkICYmIGJfZikgeworICAgICAgICAgICAgZmllbGRfcHJlZEJbMF0gPSBzY2FsZWZvcnNhbWUodiwgbiwgZmllbGRfcHJlZEJbMF0sIDAsIGRpcik7CisgICAgICAgICAgICBmaWVsZF9wcmVkQlsxXSA9IHNjYWxlZm9yc2FtZSh2LCBuLCBmaWVsZF9wcmVkQlsxXSwgMSwgZGlyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY192YWxpZCAmJiBjX2YpIHsKKyAgICAgICAgICAgIGZpZWxkX3ByZWRDWzBdID0gc2NhbGVmb3JzYW1lKHYsIG4sIGZpZWxkX3ByZWRDWzBdLCAwLCBkaXIpOworICAgICAgICAgICAgZmllbGRfcHJlZENbMV0gPSBzY2FsZWZvcnNhbWUodiwgbiwgZmllbGRfcHJlZENbMV0sIDEsIGRpcik7CisgICAgICAgIH0KKyAgICAgICAgdi0+bXZfZltkaXJdW3h5ICsgdi0+YmxvY2tzX29mZl0gPSAwOworICAgICAgICB2LT5yZWZfZmllbGRfdHlwZVtkaXJdID0gdi0+Y3VyX2ZpZWxkX3R5cGU7CisgICAgfQorCisgICAgaWYgKGFfdmFsaWQpIHsKKyAgICAgICAgcHggPSBmaWVsZF9wcmVkQVswXTsKKyAgICAgICAgcHkgPSBmaWVsZF9wcmVkQVsxXTsKKyAgICB9IGVsc2UgaWYgKGNfdmFsaWQpIHsKKyAgICAgICAgcHggPSBmaWVsZF9wcmVkQ1swXTsKKyAgICAgICAgcHkgPSBmaWVsZF9wcmVkQ1sxXTsKKyAgICB9IGVsc2UgaWYgKGJfdmFsaWQpIHsKKyAgICAgICAgcHggPSBmaWVsZF9wcmVkQlswXTsKKyAgICAgICAgcHkgPSBmaWVsZF9wcmVkQlsxXTsKKyAgICB9IGVsc2UgeworICAgICAgICBweCA9IDA7CisgICAgICAgIHB5ID0gMDsKKyAgICB9CisKKyAgICBpZiAobnVtX3NhbWVmaWVsZCArIG51bV9vcHBmaWVsZCA+IDEpIHsKKyAgICAgICAgcHggPSBtaWRfcHJlZChmaWVsZF9wcmVkQVswXSwgZmllbGRfcHJlZEJbMF0sIGZpZWxkX3ByZWRDWzBdKTsKKyAgICAgICAgcHkgPSBtaWRfcHJlZChmaWVsZF9wcmVkQVsxXSwgZmllbGRfcHJlZEJbMV0sIGZpZWxkX3ByZWRDWzFdKTsKKyAgICB9CisKKyAgICAvKiBQdWxsYmFjayBNViBhcyBzcGVjaWZpZWQgaW4gOC4zLjUuMy40ICovCisgICAgaWYgKCF2LT5maWVsZF9tb2RlKSB7CisgICAgICAgIGludCBxeCwgcXksIFgsIFk7CisgICAgICAgIHF4ID0gKHMtPm1iX3ggPDwgNikgKyAoKG4gPT0gMSB8fCBuID09IDMpID8gMzIgOiAwKTsKKyAgICAgICAgcXkgPSAocy0+bWJfeSA8PCA2KSArICgobiA9PSAyIHx8IG4gPT0gMykgPyAzMiA6IDApOworICAgICAgICBYICA9IChzLT5tYl93aWR0aCAgPDwgNikgLSA0OworICAgICAgICBZICA9IChzLT5tYl9oZWlnaHQgPDwgNikgLSA0OworICAgICAgICBpZiAobXYxKSB7CisgICAgICAgICAgICBpZiAocXggKyBweCA8IC02MCkgcHggPSAtNjAgLSBxeDsKKyAgICAgICAgICAgIGlmIChxeSArIHB5IDwgLTYwKSBweSA9IC02MCAtIHF5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHF4ICsgcHggPCAtMjgpIHB4ID0gLTI4IC0gcXg7CisgICAgICAgICAgICBpZiAocXkgKyBweSA8IC0yOCkgcHkgPSAtMjggLSBxeTsKKyAgICAgICAgfQorICAgICAgICBpZiAocXggKyBweCA+IFgpIHB4ID0gWCAtIHF4OworICAgICAgICBpZiAocXkgKyBweSA+IFkpIHB5ID0gWSAtIHF5OworICAgIH0KKworICAgIGlmICghdi0+ZmllbGRfbW9kZSB8fCBzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgLyogQ2FsY3VsYXRlIGh5YnJpZCBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiA4LjMuNS4zLjUgKGFsc28gMTAuMy41LjQuMy41KSAqLworICAgICAgICBoeWJyaWRtdl90aHJlc2ggPSAzMjsKKyAgICAgICAgaWYgKGFfdmFsaWQgJiYgY192YWxpZCkgeworICAgICAgICAgICAgaWYgKGlzX2ludHJhW3h5IC0gd3JhcF0pCisgICAgICAgICAgICAgICAgc3VtID0gRkZBQlMocHgpICsgRkZBQlMocHkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN1bSA9IEZGQUJTKHB4IC0gZmllbGRfcHJlZEFbMF0pICsgRkZBQlMocHkgLSBmaWVsZF9wcmVkQVsxXSk7CisgICAgICAgICAgICBpZiAoc3VtID4gaHlicmlkbXZfdGhyZXNoKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7ICAgICAvLyByZWFkIEhZQlJJRFBSRUQgYml0CisgICAgICAgICAgICAgICAgICAgIHB4ID0gZmllbGRfcHJlZEFbMF07CisgICAgICAgICAgICAgICAgICAgIHB5ID0gZmllbGRfcHJlZEFbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHggPSBmaWVsZF9wcmVkQ1swXTsKKyAgICAgICAgICAgICAgICAgICAgcHkgPSBmaWVsZF9wcmVkQ1sxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpc19pbnRyYVt4eSAtIDFdKQorICAgICAgICAgICAgICAgICAgICBzdW0gPSBGRkFCUyhweCkgKyBGRkFCUyhweSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdW0gPSBGRkFCUyhweCAtIGZpZWxkX3ByZWRDWzBdKSArIEZGQUJTKHB5IC0gZmllbGRfcHJlZENbMV0pOworICAgICAgICAgICAgICAgIGlmIChzdW0gPiBoeWJyaWRtdl90aHJlc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBweCA9IGZpZWxkX3ByZWRBWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgcHkgPSBmaWVsZF9wcmVkQVsxXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB4ID0gZmllbGRfcHJlZENbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBweSA9IGZpZWxkX3ByZWRDWzFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHYtPmZpZWxkX21vZGUgJiYgdi0+bnVtcmVmKQorICAgICAgICByX3kgPj49IDE7CisgICAgaWYgKHYtPmZpZWxkX21vZGUgJiYgdi0+Y3VyX2ZpZWxkX3R5cGUgJiYgdi0+cmVmX2ZpZWxkX3R5cGVbZGlyXSA9PSAwKQorICAgICAgICB5X2JpYXMgPSAxOworICAgIC8qIHN0b3JlIE1WIHVzaW5nIHNpZ25lZCBtb2R1bHVzIG9mIE1WIHJhbmdlIGRlZmluZWQgaW4gNC4xMSAqLworICAgIHMtPm12W2Rpcl1bbl1bMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5ICsgdi0+YmxvY2tzX29mZl1bMF0gPSAoKHB4ICsgZG12X3ggKyByX3gpICYgKChyX3ggPDwgMSkgLSAxKSkgLSByX3g7CisgICAgcy0+bXZbZGlyXVtuXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgKyB2LT5ibG9ja3Nfb2ZmXVsxXSA9ICgocHkgKyBkbXZfeSArIHJfeSAtIHlfYmlhcykgJiAoKHJfeSA8PCAxKSAtIDEpKSAtIHJfeSArIHlfYmlhczsKKyAgICBpZiAobXYxKSB7IC8qIGR1cGxpY2F0ZSBtb3Rpb24gZGF0YSBmb3IgMS1NViBibG9jayAqLworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5ICsgICAgMSArICAgICB2LT5ibG9ja3Nfb2ZmXVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgKyB2LT5ibG9ja3Nfb2ZmXVswXTsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eSArICAgIDEgKyAgICAgdi0+YmxvY2tzX29mZl1bMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5ICsgdi0+YmxvY2tzX29mZl1bMV07CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgKyB3cmFwICsgICAgIHYtPmJsb2Nrc19vZmZdWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eSArIHYtPmJsb2Nrc19vZmZdWzBdOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5ICsgd3JhcCArICAgICB2LT5ibG9ja3Nfb2ZmXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgKyB2LT5ibG9ja3Nfb2ZmXVsxXTsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eSArIHdyYXAgKyAxICsgdi0+YmxvY2tzX29mZl1bMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5ICsgdi0+YmxvY2tzX29mZl1bMF07CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgKyB3cmFwICsgMSArIHYtPmJsb2Nrc19vZmZdWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eSArIHYtPmJsb2Nrc19vZmZdWzFdOworICAgICAgICB2LT5tdl9mW2Rpcl1beHkgKyAgICAxICsgdi0+YmxvY2tzX29mZl0gPSB2LT5tdl9mW2Rpcl1beHkgKyAgICAgICAgICAgIHYtPmJsb2Nrc19vZmZdOworICAgICAgICB2LT5tdl9mW2Rpcl1beHkgKyB3cmFwICsgdi0+YmxvY2tzX29mZl0gPSB2LT5tdl9mW2Rpcl1beHkgKyB3cmFwICsgMSArIHYtPmJsb2Nrc19vZmZdID0gdi0+bXZfZltkaXJdW3h5ICsgdi0+YmxvY2tzX29mZl07CisgICAgfQorfQorCisvKiogUHJlZGljdCBhbmQgc2V0IG1vdGlvbiB2ZWN0b3IgZm9yIGludGVybGFjZWQgZnJhbWUgcGljdHVyZSBNQnMKKyAqLwordm9pZCBmZl92YzFfcHJlZF9tdl9pbnRmcihWQzFDb250ZXh0ICp2LCBpbnQgbiwgaW50IGRtdl94LCBpbnQgZG12X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtdm4sIGludCByX3gsIGludCByX3ksIHVpbnQ4X3QqIGlzX2ludHJhLCBpbnQgZGlyKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgaW50IHh5LCB3cmFwLCBvZmYgPSAwOworICAgIGludCBBWzJdLCBCWzJdLCBDWzJdOworICAgIGludCBweCA9IDAsIHB5ID0gMDsKKyAgICBpbnQgYV92YWxpZCA9IDAsIGJfdmFsaWQgPSAwLCBjX3ZhbGlkID0gMDsKKyAgICBpbnQgZmllbGRfYSwgZmllbGRfYiwgZmllbGRfYzsgLy8gMDogc2FtZSwgMTogb3Bwb3NpdAorICAgIGludCB0b3RhbF92YWxpZCwgbnVtX3NhbWVmaWVsZCwgbnVtX29wcGZpZWxkOworICAgIGludCBwb3NfYywgcG9zX2IsIG5fYWRqOworCisgICAgd3JhcCA9IHMtPmI4X3N0cmlkZTsKKyAgICB4eSA9IHMtPmJsb2NrX2luZGV4W25dOworCisgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgIHMtPm12WzBdW25dWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1beHldWzBdID0gMDsKKyAgICAgICAgcy0+bXZbMF1bbl1bMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eV1bMV0gPSAwOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eV1bMF0gPSAwOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eV1bMV0gPSAwOworICAgICAgICBpZiAobXZuID09IDEpIHsgLyogZHVwbGljYXRlIG1vdGlvbiBkYXRhIGZvciAxLU1WIGJsb2NrICovCisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eSArIDFdWzBdICAgICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eSArIDFdWzFdICAgICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eSArIHdyYXBdWzBdICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eSArIHdyYXBdWzFdICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eSArIHdyYXAgKyAxXVswXSA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eSArIHdyYXAgKyAxXVsxXSA9IDA7CisgICAgICAgICAgICB2LT5sdW1hX212W3MtPm1iX3hdWzBdID0gdi0+bHVtYV9tdltzLT5tYl94XVsxXSA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSArIDFdWzBdICAgICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSArIDFdWzFdICAgICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSArIHdyYXBdWzBdICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSArIHdyYXBdWzFdICAgICA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSArIHdyYXAgKyAxXVswXSA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSArIHdyYXAgKyAxXVsxXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG9mZiA9ICgobiA9PSAwKSB8fCAobiA9PSAxKSkgPyAxIDogLTE7CisgICAgLyogcHJlZGljdCBBICovCisgICAgaWYgKHMtPm1iX3ggfHwgKG4gPT0gMSkgfHwgKG4gPT0gMykpIHsKKyAgICAgICAgaWYgKCh2LT5ibGtfbXZfdHlwZVt4eV0pIC8vIGN1cnJlbnQgYmxvY2sgKE1CKSBoYXMgYSBmaWVsZCBNVgorICAgICAgICAgICAgfHwgKCF2LT5ibGtfbXZfdHlwZVt4eV0gJiYgIXYtPmJsa19tdl90eXBlW3h5IC0gMV0pKSB7IC8vIG9yIGJvdGggaGF2ZSBmcmFtZSBNVgorICAgICAgICAgICAgQVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgLSAxXVswXTsKKyAgICAgICAgICAgIEFbMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5IC0gMV1bMV07CisgICAgICAgICAgICBhX3ZhbGlkID0gMTsKKyAgICAgICAgfSBlbHNlIHsgLy8gY3VycmVudCBibG9jayBoYXMgZnJhbWUgbXYgYW5kIGNhbmQuIGhhcyBmaWVsZCBNViAoc28gYXZlcmFnZSkKKyAgICAgICAgICAgIEFbMF0gPSAocy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eSAtIDFdWzBdCisgICAgICAgICAgICAgICAgICAgICsgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eSAtIDEgKyBvZmYgKiB3cmFwXVswXSArIDEpID4+IDE7CisgICAgICAgICAgICBBWzFdID0gKHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgLSAxXVsxXQorICAgICAgICAgICAgICAgICAgICArIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgLSAxICsgb2ZmICogd3JhcF1bMV0gKyAxKSA+PiAxOworICAgICAgICAgICAgYV92YWxpZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEobiAmIDEpICYmIHYtPmlzX2ludHJhW3MtPm1iX3ggLSAxXSkgeworICAgICAgICAgICAgYV92YWxpZCA9IDA7CisgICAgICAgICAgICBBWzBdID0gQVsxXSA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgQVswXSA9IEFbMV0gPSAwOworICAgIC8qIFByZWRpY3QgQiBhbmQgQyAqLworICAgIEJbMF0gPSBCWzFdID0gQ1swXSA9IENbMV0gPSAwOworICAgIGlmIChuID09IDAgfHwgbiA9PSAxIHx8IHYtPmJsa19tdl90eXBlW3h5XSkgeworICAgICAgICBpZiAoIXMtPmZpcnN0X3NsaWNlX2xpbmUpIHsKKyAgICAgICAgICAgIGlmICghdi0+aXNfaW50cmFbcy0+bWJfeCAtIHMtPm1iX3N0cmlkZV0pIHsKKyAgICAgICAgICAgICAgICBiX3ZhbGlkID0gMTsKKyAgICAgICAgICAgICAgICBuX2FkaiAgID0gbiB8IDI7CisgICAgICAgICAgICAgICAgcG9zX2IgICA9IHMtPmJsb2NrX2luZGV4W25fYWRqXSAtIDIgKiB3cmFwOworICAgICAgICAgICAgICAgIGlmICh2LT5ibGtfbXZfdHlwZVtwb3NfYl0gJiYgdi0+YmxrX212X3R5cGVbeHldKSB7CisgICAgICAgICAgICAgICAgICAgIG5fYWRqID0gKG4gJiAyKSB8IChuICYgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEJbMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3MtPmJsb2NrX2luZGV4W25fYWRqXSAtIDIgKiB3cmFwXVswXTsKKyAgICAgICAgICAgICAgICBCWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVtzLT5ibG9ja19pbmRleFtuX2Fkal0gLSAyICogd3JhcF1bMV07CisgICAgICAgICAgICAgICAgaWYgKHYtPmJsa19tdl90eXBlW3Bvc19iXSAmJiAhdi0+YmxrX212X3R5cGVbeHldKSB7CisgICAgICAgICAgICAgICAgICAgIEJbMF0gPSAoQlswXSArIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1bcy0+YmxvY2tfaW5kZXhbbl9hZGogXiAyXSAtIDIgKiB3cmFwXVswXSArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgICAgIEJbMV0gPSAoQlsxXSArIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1bcy0+YmxvY2tfaW5kZXhbbl9hZGogXiAyXSAtIDIgKiB3cmFwXVsxXSArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPm1iX3dpZHRoID4gMSkgeworICAgICAgICAgICAgICAgIGlmICghdi0+aXNfaW50cmFbcy0+bWJfeCAtIHMtPm1iX3N0cmlkZSArIDFdKSB7CisgICAgICAgICAgICAgICAgICAgIGNfdmFsaWQgPSAxOworICAgICAgICAgICAgICAgICAgICBuX2FkaiAgID0gMjsKKyAgICAgICAgICAgICAgICAgICAgcG9zX2MgICA9IHMtPmJsb2NrX2luZGV4WzJdIC0gMiAqIHdyYXAgKyAyOworICAgICAgICAgICAgICAgICAgICBpZiAodi0+YmxrX212X3R5cGVbcG9zX2NdICYmIHYtPmJsa19tdl90eXBlW3h5XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbl9hZGogPSBuICYgMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVtzLT5ibG9ja19pbmRleFtuX2Fkal0gLSAyICogd3JhcCArIDJdWzBdOworICAgICAgICAgICAgICAgICAgICBDWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVtzLT5ibG9ja19pbmRleFtuX2Fkal0gLSAyICogd3JhcCArIDJdWzFdOworICAgICAgICAgICAgICAgICAgICBpZiAodi0+YmxrX212X3R5cGVbcG9zX2NdICYmICF2LT5ibGtfbXZfdHlwZVt4eV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENbMF0gPSAoMSArIENbMF0gKyAocy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVtzLT5ibG9ja19pbmRleFtuX2FkaiBeIDJdIC0gMiAqIHdyYXAgKyAyXVswXSkpID4+IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBDWzFdID0gKDEgKyBDWzFdICsgKHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1bcy0+YmxvY2tfaW5kZXhbbl9hZGogXiAyXSAtIDIgKiB3cmFwICsgMl1bMV0pKSA+PiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tYl94ID09IHMtPm1iX3dpZHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2LT5pc19pbnRyYVtzLT5tYl94IC0gcy0+bWJfc3RyaWRlIC0gMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZhbGlkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2FkaiAgID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NfYyAgID0gcy0+YmxvY2tfaW5kZXhbM10gLSAyICogd3JhcCAtIDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYtPmJsa19tdl90eXBlW3Bvc19jXSAmJiB2LT5ibGtfbXZfdHlwZVt4eV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9hZGogPSBuIHwgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1swXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1bcy0+YmxvY2tfaW5kZXhbbl9hZGpdIC0gMiAqIHdyYXAgLSAyXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVtzLT5ibG9ja19pbmRleFtuX2Fkal0gLSAyICogd3JhcCAtIDJdWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LT5ibGtfbXZfdHlwZVtwb3NfY10gJiYgIXYtPmJsa19tdl90eXBlW3h5XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWzBdID0gKDEgKyBDWzBdICsgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVtzLT5ibG9ja19pbmRleFsxXSAtIDIgKiB3cmFwIC0gMl1bMF0pID4+IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENbMV0gPSAoMSArIENbMV0gKyBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3MtPmJsb2NrX2luZGV4WzFdIC0gMiAqIHdyYXAgLSAyXVsxXSkgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZhbGlkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBvc19iICAgPSBzLT5ibG9ja19pbmRleFsxXTsKKyAgICAgICAgYl92YWxpZCA9IDE7CisgICAgICAgIEJbMF0gICAgPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3Bvc19iXVswXTsKKyAgICAgICAgQlsxXSAgICA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1bcG9zX2JdWzFdOworICAgICAgICBwb3NfYyAgID0gcy0+YmxvY2tfaW5kZXhbMF07CisgICAgICAgIGNfdmFsaWQgPSAxOworICAgICAgICBDWzBdICAgID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVtwb3NfY11bMF07CisgICAgICAgIENbMV0gICAgPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3Bvc19jXVsxXTsKKyAgICB9CisKKyAgICB0b3RhbF92YWxpZCA9IGFfdmFsaWQgKyBiX3ZhbGlkICsgY192YWxpZDsKKyAgICAvLyBjaGVjayBpZiBwcmVkaWN0b3IgQSBpcyBvdXQgb2YgYm91bmRzCisgICAgaWYgKCFzLT5tYl94ICYmICEobiA9PSAxIHx8IG4gPT0gMykpIHsKKyAgICAgICAgQVswXSA9IEFbMV0gPSAwOworICAgIH0KKyAgICAvLyBjaGVjayBpZiBwcmVkaWN0b3IgQiBpcyBvdXQgb2YgYm91bmRzCisgICAgaWYgKChzLT5maXJzdF9zbGljZV9saW5lICYmIHYtPmJsa19tdl90eXBlW3h5XSkgfHwgKHMtPmZpcnN0X3NsaWNlX2xpbmUgJiYgIShuICYgMikpKSB7CisgICAgICAgIEJbMF0gPSBCWzFdID0gQ1swXSA9IENbMV0gPSAwOworICAgIH0KKyAgICBpZiAoIXYtPmJsa19tdl90eXBlW3h5XSkgeworICAgICAgICBpZiAocy0+bWJfd2lkdGggPT0gMSkgeworICAgICAgICAgICAgcHggPSBCWzBdOworICAgICAgICAgICAgcHkgPSBCWzFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHRvdGFsX3ZhbGlkID49IDIpIHsKKyAgICAgICAgICAgICAgICBweCA9IG1pZF9wcmVkKEFbMF0sIEJbMF0sIENbMF0pOworICAgICAgICAgICAgICAgIHB5ID0gbWlkX3ByZWQoQVsxXSwgQlsxXSwgQ1sxXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvdGFsX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgaWYgICAgICAoYV92YWxpZCkgeyBweCA9IEFbMF07IHB5ID0gQVsxXTsgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJfdmFsaWQpIHsgcHggPSBCWzBdOyBweSA9IEJbMV07IH0KKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICB7IHB4ID0gQ1swXTsgcHkgPSBDWzFdOyB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYV92YWxpZCkKKyAgICAgICAgICAgIGZpZWxkX2EgPSAoQVsxXSAmIDQpID8gMSA6IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpZWxkX2EgPSAwOworICAgICAgICBpZiAoYl92YWxpZCkKKyAgICAgICAgICAgIGZpZWxkX2IgPSAoQlsxXSAmIDQpID8gMSA6IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpZWxkX2IgPSAwOworICAgICAgICBpZiAoY192YWxpZCkKKyAgICAgICAgICAgIGZpZWxkX2MgPSAoQ1sxXSAmIDQpID8gMSA6IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpZWxkX2MgPSAwOworCisgICAgICAgIG51bV9vcHBmaWVsZCAgPSBmaWVsZF9hICsgZmllbGRfYiArIGZpZWxkX2M7CisgICAgICAgIG51bV9zYW1lZmllbGQgPSB0b3RhbF92YWxpZCAtIG51bV9vcHBmaWVsZDsKKyAgICAgICAgaWYgKHRvdGFsX3ZhbGlkID09IDMpIHsKKyAgICAgICAgICAgIGlmICgobnVtX3NhbWVmaWVsZCA9PSAzKSB8fCAobnVtX29wcGZpZWxkID09IDMpKSB7CisgICAgICAgICAgICAgICAgcHggPSBtaWRfcHJlZChBWzBdLCBCWzBdLCBDWzBdKTsKKyAgICAgICAgICAgICAgICBweSA9IG1pZF9wcmVkKEFbMV0sIEJbMV0sIENbMV0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChudW1fc2FtZWZpZWxkID49IG51bV9vcHBmaWVsZCkgeworICAgICAgICAgICAgICAgIC8qIHRha2Ugb25lIE1WIGZyb20gc2FtZSBmaWVsZCBzZXQgZGVwZW5kaW5nIG9uIHByaW9yaXR5CisgICAgICAgICAgICAgICAgdGhlIGNoZWNrIGZvciBCIG1heSBub3QgYmUgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICAgICAgcHggPSAhZmllbGRfYSA/IEFbMF0gOiBCWzBdOworICAgICAgICAgICAgICAgIHB5ID0gIWZpZWxkX2EgPyBBWzFdIDogQlsxXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHggPSAgZmllbGRfYSA/IEFbMF0gOiBCWzBdOworICAgICAgICAgICAgICAgIHB5ID0gIGZpZWxkX2EgPyBBWzFdIDogQlsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0b3RhbF92YWxpZCA9PSAyKSB7CisgICAgICAgICAgICBpZiAobnVtX3NhbWVmaWVsZCA+PSBudW1fb3BwZmllbGQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpZWxkX2EgJiYgYV92YWxpZCkgeworICAgICAgICAgICAgICAgICAgICBweCA9IEFbMF07CisgICAgICAgICAgICAgICAgICAgIHB5ID0gQVsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZF9iICYmIGJfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHggPSBCWzBdOworICAgICAgICAgICAgICAgICAgICBweSA9IEJbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIC8qaWYgKGNfdmFsaWQpKi8geworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQxKGNfdmFsaWQpOworICAgICAgICAgICAgICAgICAgICBweCA9IENbMF07CisgICAgICAgICAgICAgICAgICAgIHB5ID0gQ1sxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChmaWVsZF9hICYmIGFfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHggPSBBWzBdOworICAgICAgICAgICAgICAgICAgICBweSA9IEFbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIC8qaWYgKGZpZWxkX2IgJiYgYl92YWxpZCkqLyB7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDEoZmllbGRfYiAmJiBiX3ZhbGlkKTsKKyAgICAgICAgICAgICAgICAgICAgcHggPSBCWzBdOworICAgICAgICAgICAgICAgICAgICBweSA9IEJbMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRvdGFsX3ZhbGlkID09IDEpIHsKKyAgICAgICAgICAgIHB4ID0gKGFfdmFsaWQpID8gQVswXSA6ICgoYl92YWxpZCkgPyBCWzBdIDogQ1swXSk7CisgICAgICAgICAgICBweSA9IChhX3ZhbGlkKSA/IEFbMV0gOiAoKGJfdmFsaWQpID8gQlsxXSA6IENbMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc3RvcmUgTVYgdXNpbmcgc2lnbmVkIG1vZHVsdXMgb2YgTVYgcmFuZ2UgZGVmaW5lZCBpbiA0LjExICovCisgICAgcy0+bXZbZGlyXVtuXVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHldWzBdID0gKChweCArIGRtdl94ICsgcl94KSAmICgocl94IDw8IDEpIC0gMSkpIC0gcl94OworICAgIHMtPm12W2Rpcl1bbl1bMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5XVsxXSA9ICgocHkgKyBkbXZfeSArIHJfeSkgJiAoKHJfeSA8PCAxKSAtIDEpKSAtIHJfeTsKKyAgICBpZiAobXZuID09IDEpIHsgLyogZHVwbGljYXRlIG1vdGlvbiBkYXRhIGZvciAxLU1WIGJsb2NrICovCisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgKyAgICAxICAgIF1bMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5XVswXTsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eSArICAgIDEgICAgXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHldWzFdOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5ICsgd3JhcCAgICBdWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eV1bMF07CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgKyB3cmFwICAgIF1bMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5XVsxXTsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eSArIHdyYXAgKyAxXVswXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHldWzBdOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFtkaXJdW3h5ICsgd3JhcCArIDFdWzFdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eV1bMV07CisgICAgfSBlbHNlIGlmIChtdm4gPT0gMikgeyAvKiBkdXBsaWNhdGUgbW90aW9uIGRhdGEgZm9yIDItRmllbGQgTVYgYmxvY2sgKi8KKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eSArIDFdWzBdID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbZGlyXVt4eV1bMF07CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHkgKyAxXVsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsW2Rpcl1beHldWzFdOworICAgICAgICBzLT5tdltkaXJdW24gKyAxXVswXSA9IHMtPm12W2Rpcl1bbl1bMF07CisgICAgICAgIHMtPm12W2Rpcl1bbiArIDFdWzFdID0gcy0+bXZbZGlyXVtuXVsxXTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfdmMxX3ByZWRfYl9tdihWQzFDb250ZXh0ICp2LCBpbnQgZG12X3hbMl0sIGludCBkbXZfeVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0LCBpbnQgbXZ0eXBlKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgaW50IHh5LCB3cmFwLCBvZmYgPSAwOworICAgIGludDE2X3QgKkEsICpCLCAqQzsKKyAgICBpbnQgcHgsIHB5OworICAgIGludCBzdW07CisgICAgaW50IHJfeCwgcl95OworICAgIGNvbnN0IHVpbnQ4X3QgKmlzX2ludHJhID0gdi0+bWJfdHlwZVswXTsKKworICAgIGF2X2Fzc2VydDAoIXYtPmZpZWxkX21vZGUpOworCisgICAgcl94ID0gdi0+cmFuZ2VfeDsKKyAgICByX3kgPSB2LT5yYW5nZV95OworICAgIC8qIHNjYWxlIE1WIGRpZmZlcmVuY2UgdG8gYmUgcXVhZC1wZWwgKi8KKyAgICBkbXZfeFswXSA8PD0gMSAtIHMtPnF1YXJ0ZXJfc2FtcGxlOworICAgIGRtdl95WzBdIDw8PSAxIC0gcy0+cXVhcnRlcl9zYW1wbGU7CisgICAgZG12X3hbMV0gPDw9IDEgLSBzLT5xdWFydGVyX3NhbXBsZTsKKyAgICBkbXZfeVsxXSA8PD0gMSAtIHMtPnF1YXJ0ZXJfc2FtcGxlOworCisgICAgd3JhcCA9IHMtPmI4X3N0cmlkZTsKKyAgICB4eSA9IHMtPmJsb2NrX2luZGV4WzBdOworCisgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5XVswXSA9CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5XVsxXSA9CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3h5XVswXSA9CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3h5XVsxXSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgICAgIGlmIChkaXJlY3QgJiYgcy0+bmV4dF9waWN0dXJlX3B0ci0+ZmllbGRfcGljdHVyZSkKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJNaXhlZCBmcmFtZS9maWVsZCBkaXJlY3QgbW9kZSBub3Qgc3VwcG9ydGVkXG4iKTsKKworICAgICAgICBzLT5tdlswXVswXVswXSA9IHNjYWxlX212KHMtPm5leHRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3h5XVswXSwgdi0+YmZyYWN0aW9uLCAwLCBzLT5xdWFydGVyX3NhbXBsZSk7CisgICAgICAgIHMtPm12WzBdWzBdWzFdID0gc2NhbGVfbXYocy0+bmV4dF9waWN0dXJlLm1vdGlvbl92YWxbMV1beHldWzFdLCB2LT5iZnJhY3Rpb24sIDAsIHMtPnF1YXJ0ZXJfc2FtcGxlKTsKKyAgICAgICAgcy0+bXZbMV1bMF1bMF0gPSBzY2FsZV9tdihzLT5uZXh0X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eV1bMF0sIHYtPmJmcmFjdGlvbiwgMSwgcy0+cXVhcnRlcl9zYW1wbGUpOworICAgICAgICBzLT5tdlsxXVswXVsxXSA9IHNjYWxlX212KHMtPm5leHRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3h5XVsxXSwgdi0+YmZyYWN0aW9uLCAxLCBzLT5xdWFydGVyX3NhbXBsZSk7CisKKyAgICAgICAgLyogUHVsbGJhY2sgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzIGFzIHNwZWNpZmllZCBpbiA4LjQuNS40ICovCisgICAgICAgIHMtPm12WzBdWzBdWzBdID0gYXZfY2xpcChzLT5tdlswXVswXVswXSwgLTYwIC0gKHMtPm1iX3ggPDwgNiksIChzLT5tYl93aWR0aCAgPDwgNikgLSA0IC0gKHMtPm1iX3ggPDwgNikpOworICAgICAgICBzLT5tdlswXVswXVsxXSA9IGF2X2NsaXAocy0+bXZbMF1bMF1bMV0sIC02MCAtIChzLT5tYl95IDw8IDYpLCAocy0+bWJfaGVpZ2h0IDw8IDYpIC0gNCAtIChzLT5tYl95IDw8IDYpKTsKKyAgICAgICAgcy0+bXZbMV1bMF1bMF0gPSBhdl9jbGlwKHMtPm12WzFdWzBdWzBdLCAtNjAgLSAocy0+bWJfeCA8PCA2KSwgKHMtPm1iX3dpZHRoICA8PCA2KSAtIDQgLSAocy0+bWJfeCA8PCA2KSk7CisgICAgICAgIHMtPm12WzFdWzBdWzFdID0gYXZfY2xpcChzLT5tdlsxXVswXVsxXSwgLTYwIC0gKHMtPm1iX3kgPDwgNiksIChzLT5tYl9oZWlnaHQgPDwgNikgLSA0IC0gKHMtPm1iX3kgPDwgNikpOworICAgIGlmIChkaXJlY3QpIHsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1beHldWzBdID0gcy0+bXZbMF1bMF1bMF07CisgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5XVsxXSA9IHMtPm12WzBdWzBdWzFdOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eV1bMF0gPSBzLT5tdlsxXVswXVswXTsKKyAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMV1beHldWzFdID0gcy0+bXZbMV1bMF1bMV07CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKG12dHlwZSA9PSBCTVZfVFlQRV9GT1JXQVJEKSB8fCAobXZ0eXBlID09IEJNVl9UWVBFX0lOVEVSUE9MQVRFRCkpIHsKKyAgICAgICAgQyAgID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1beHkgLSAyXTsKKyAgICAgICAgQSAgID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1beHkgLSB3cmFwICogMl07CisgICAgICAgIG9mZiA9IChzLT5tYl94ID09IChzLT5tYl93aWR0aCAtIDEpKSA/IC0yIDogMjsKKyAgICAgICAgQiAgID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1beHkgLSB3cmFwICogMiArIG9mZl07CisKKyAgICAgICAgaWYgKCFzLT5tYl94KSBDWzBdID0gQ1sxXSA9IDA7CisgICAgICAgIGlmICghcy0+Zmlyc3Rfc2xpY2VfbGluZSkgeyAvLyBwcmVkaWN0b3IgQSBpcyBub3Qgb3V0IG9mIGJvdW5kcworICAgICAgICAgICAgaWYgKHMtPm1iX3dpZHRoID09IDEpIHsKKyAgICAgICAgICAgICAgICBweCA9IEFbMF07CisgICAgICAgICAgICAgICAgcHkgPSBBWzFdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBweCA9IG1pZF9wcmVkKEFbMF0sIEJbMF0sIENbMF0pOworICAgICAgICAgICAgICAgIHB5ID0gbWlkX3ByZWQoQVsxXSwgQlsxXSwgQ1sxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+bWJfeCkgeyAvLyBwcmVkaWN0b3IgQyBpcyBub3Qgb3V0IG9mIGJvdW5kcworICAgICAgICAgICAgcHggPSBDWzBdOworICAgICAgICAgICAgcHkgPSBDWzFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHggPSBweSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLyogUHVsbGJhY2sgTVYgYXMgc3BlY2lmaWVkIGluIDguMy41LjMuNCAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgcXgsIHF5LCBYLCBZOworICAgICAgICAgICAgaWYgKHYtPnByb2ZpbGUgPCBQUk9GSUxFX0FEVkFOQ0VEKSB7CisgICAgICAgICAgICAgICAgcXggPSAocy0+bWJfeCA8PCA1KTsKKyAgICAgICAgICAgICAgICBxeSA9IChzLT5tYl95IDw8IDUpOworICAgICAgICAgICAgICAgIFggID0gKHMtPm1iX3dpZHRoICA8PCA1KSAtIDQ7CisgICAgICAgICAgICAgICAgWSAgPSAocy0+bWJfaGVpZ2h0IDw8IDUpIC0gNDsKKyAgICAgICAgICAgICAgICBpZiAocXggKyBweCA8IC0yOCkgcHggPSAtMjggLSBxeDsKKyAgICAgICAgICAgICAgICBpZiAocXkgKyBweSA8IC0yOCkgcHkgPSAtMjggLSBxeTsKKyAgICAgICAgICAgICAgICBpZiAocXggKyBweCA+IFgpIHB4ID0gWCAtIHF4OworICAgICAgICAgICAgICAgIGlmIChxeSArIHB5ID4gWSkgcHkgPSBZIC0gcXk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF4ID0gKHMtPm1iX3ggPDwgNik7CisgICAgICAgICAgICAgICAgcXkgPSAocy0+bWJfeSA8PCA2KTsKKyAgICAgICAgICAgICAgICBYICA9IChzLT5tYl93aWR0aCAgPDwgNikgLSA0OworICAgICAgICAgICAgICAgIFkgID0gKHMtPm1iX2hlaWdodCA8PCA2KSAtIDQ7CisgICAgICAgICAgICAgICAgaWYgKHF4ICsgcHggPCAtNjApIHB4ID0gLTYwIC0gcXg7CisgICAgICAgICAgICAgICAgaWYgKHF5ICsgcHkgPCAtNjApIHB5ID0gLTYwIC0gcXk7CisgICAgICAgICAgICAgICAgaWYgKHF4ICsgcHggPiBYKSBweCA9IFggLSBxeDsKKyAgICAgICAgICAgICAgICBpZiAocXkgKyBweSA+IFkpIHB5ID0gWSAtIHF5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIENhbGN1bGF0ZSBoeWJyaWQgcHJlZGljdGlvbiBhcyBzcGVjaWZpZWQgaW4gOC4zLjUuMy41ICovCisgICAgICAgIGlmICgwICYmICFzLT5maXJzdF9zbGljZV9saW5lICYmIHMtPm1iX3gpIHsKKyAgICAgICAgICAgIGlmIChpc19pbnRyYVt4eSAtIHdyYXBdKQorICAgICAgICAgICAgICAgIHN1bSA9IEZGQUJTKHB4KSArIEZGQUJTKHB5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdW0gPSBGRkFCUyhweCAtIEFbMF0pICsgRkZBQlMocHkgLSBBWzFdKTsKKyAgICAgICAgICAgIGlmIChzdW0gPiAzMikgeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgICAgICBweCA9IEFbMF07CisgICAgICAgICAgICAgICAgICAgIHB5ID0gQVsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBweCA9IENbMF07CisgICAgICAgICAgICAgICAgICAgIHB5ID0gQ1sxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpc19pbnRyYVt4eSAtIDJdKQorICAgICAgICAgICAgICAgICAgICBzdW0gPSBGRkFCUyhweCkgKyBGRkFCUyhweSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdW0gPSBGRkFCUyhweCAtIENbMF0pICsgRkZBQlMocHkgLSBDWzFdKTsKKyAgICAgICAgICAgICAgICBpZiAoc3VtID4gMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBweCA9IEFbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBweSA9IEFbMV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBweCA9IENbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBweSA9IENbMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogc3RvcmUgTVYgdXNpbmcgc2lnbmVkIG1vZHVsdXMgb2YgTVYgcmFuZ2UgZGVmaW5lZCBpbiA0LjExICovCisgICAgICAgIHMtPm12WzBdWzBdWzBdID0gKChweCArIGRtdl94WzBdICsgcl94KSAmICgocl94IDw8IDEpIC0gMSkpIC0gcl94OworICAgICAgICBzLT5tdlswXVswXVsxXSA9ICgocHkgKyBkbXZfeVswXSArIHJfeSkgJiAoKHJfeSA8PCAxKSAtIDEpKSAtIHJfeTsKKyAgICB9CisgICAgaWYgKChtdnR5cGUgPT0gQk1WX1RZUEVfQkFDS1dBUkQpIHx8IChtdnR5cGUgPT0gQk1WX1RZUEVfSU5URVJQT0xBVEVEKSkgeworICAgICAgICBDICAgPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSAtIDJdOworICAgICAgICBBICAgPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSAtIHdyYXAgKiAyXTsKKyAgICAgICAgb2ZmID0gKHMtPm1iX3ggPT0gKHMtPm1iX3dpZHRoIC0gMSkpID8gLTIgOiAyOworICAgICAgICBCICAgPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eSAtIHdyYXAgKiAyICsgb2ZmXTsKKworICAgICAgICBpZiAoIXMtPm1iX3gpCisgICAgICAgICAgICBDWzBdID0gQ1sxXSA9IDA7CisgICAgICAgIGlmICghcy0+Zmlyc3Rfc2xpY2VfbGluZSkgeyAvLyBwcmVkaWN0b3IgQSBpcyBub3Qgb3V0IG9mIGJvdW5kcworICAgICAgICAgICAgaWYgKHMtPm1iX3dpZHRoID09IDEpIHsKKyAgICAgICAgICAgICAgICBweCA9IEFbMF07CisgICAgICAgICAgICAgICAgcHkgPSBBWzFdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBweCA9IG1pZF9wcmVkKEFbMF0sIEJbMF0sIENbMF0pOworICAgICAgICAgICAgICAgIHB5ID0gbWlkX3ByZWQoQVsxXSwgQlsxXSwgQ1sxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+bWJfeCkgeyAvLyBwcmVkaWN0b3IgQyBpcyBub3Qgb3V0IG9mIGJvdW5kcworICAgICAgICAgICAgcHggPSBDWzBdOworICAgICAgICAgICAgcHkgPSBDWzFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHggPSBweSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLyogUHVsbGJhY2sgTVYgYXMgc3BlY2lmaWVkIGluIDguMy41LjMuNCAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgcXgsIHF5LCBYLCBZOworICAgICAgICAgICAgaWYgKHYtPnByb2ZpbGUgPCBQUk9GSUxFX0FEVkFOQ0VEKSB7CisgICAgICAgICAgICAgICAgcXggPSAocy0+bWJfeCA8PCA1KTsKKyAgICAgICAgICAgICAgICBxeSA9IChzLT5tYl95IDw8IDUpOworICAgICAgICAgICAgICAgIFggID0gKHMtPm1iX3dpZHRoICA8PCA1KSAtIDQ7CisgICAgICAgICAgICAgICAgWSAgPSAocy0+bWJfaGVpZ2h0IDw8IDUpIC0gNDsKKyAgICAgICAgICAgICAgICBpZiAocXggKyBweCA8IC0yOCkgcHggPSAtMjggLSBxeDsKKyAgICAgICAgICAgICAgICBpZiAocXkgKyBweSA8IC0yOCkgcHkgPSAtMjggLSBxeTsKKyAgICAgICAgICAgICAgICBpZiAocXggKyBweCA+IFgpIHB4ID0gWCAtIHF4OworICAgICAgICAgICAgICAgIGlmIChxeSArIHB5ID4gWSkgcHkgPSBZIC0gcXk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF4ID0gKHMtPm1iX3ggPDwgNik7CisgICAgICAgICAgICAgICAgcXkgPSAocy0+bWJfeSA8PCA2KTsKKyAgICAgICAgICAgICAgICBYICA9IChzLT5tYl93aWR0aCAgPDwgNikgLSA0OworICAgICAgICAgICAgICAgIFkgID0gKHMtPm1iX2hlaWdodCA8PCA2KSAtIDQ7CisgICAgICAgICAgICAgICAgaWYgKHF4ICsgcHggPCAtNjApIHB4ID0gLTYwIC0gcXg7CisgICAgICAgICAgICAgICAgaWYgKHF5ICsgcHkgPCAtNjApIHB5ID0gLTYwIC0gcXk7CisgICAgICAgICAgICAgICAgaWYgKHF4ICsgcHggPiBYKSBweCA9IFggLSBxeDsKKyAgICAgICAgICAgICAgICBpZiAocXkgKyBweSA+IFkpIHB5ID0gWSAtIHF5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIENhbGN1bGF0ZSBoeWJyaWQgcHJlZGljdGlvbiBhcyBzcGVjaWZpZWQgaW4gOC4zLjUuMy41ICovCisgICAgICAgIGlmICgwICYmICFzLT5maXJzdF9zbGljZV9saW5lICYmIHMtPm1iX3gpIHsKKyAgICAgICAgICAgIGlmIChpc19pbnRyYVt4eSAtIHdyYXBdKQorICAgICAgICAgICAgICAgIHN1bSA9IEZGQUJTKHB4KSArIEZGQUJTKHB5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdW0gPSBGRkFCUyhweCAtIEFbMF0pICsgRkZBQlMocHkgLSBBWzFdKTsKKyAgICAgICAgICAgIGlmIChzdW0gPiAzMikgeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgICAgICBweCA9IEFbMF07CisgICAgICAgICAgICAgICAgICAgIHB5ID0gQVsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBweCA9IENbMF07CisgICAgICAgICAgICAgICAgICAgIHB5ID0gQ1sxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpc19pbnRyYVt4eSAtIDJdKQorICAgICAgICAgICAgICAgICAgICBzdW0gPSBGRkFCUyhweCkgKyBGRkFCUyhweSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdW0gPSBGRkFCUyhweCAtIENbMF0pICsgRkZBQlMocHkgLSBDWzFdKTsKKyAgICAgICAgICAgICAgICBpZiAoc3VtID4gMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBweCA9IEFbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBweSA9IEFbMV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBweCA9IENbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBweSA9IENbMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogc3RvcmUgTVYgdXNpbmcgc2lnbmVkIG1vZHVsdXMgb2YgTVYgcmFuZ2UgZGVmaW5lZCBpbiA0LjExICovCisKKyAgICAgICAgcy0+bXZbMV1bMF1bMF0gPSAoKHB4ICsgZG12X3hbMV0gKyByX3gpICYgKChyX3ggPDwgMSkgLSAxKSkgLSByX3g7CisgICAgICAgIHMtPm12WzFdWzBdWzFdID0gKChweSArIGRtdl95WzFdICsgcl95KSAmICgocl95IDw8IDEpIC0gMSkpIC0gcl95OworICAgIH0KKyAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eV1bMF0gPSBzLT5tdlswXVswXVswXTsKKyAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eV1bMV0gPSBzLT5tdlswXVswXVsxXTsKKyAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eV1bMF0gPSBzLT5tdlsxXVswXVswXTsKKyAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVt4eV1bMV0gPSBzLT5tdlsxXVswXVsxXTsKK30KKwordm9pZCBmZl92YzFfcHJlZF9iX212X2ludGZpKFZDMUNvbnRleHQgKnYsIGludCBuLCBpbnQgKmRtdl94LCBpbnQgKmRtdl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtdjEsIGludCAqcHJlZF9mbGFnKQoreworICAgIGludCBkaXIgPSAodi0+Ym12dHlwZSA9PSBCTVZfVFlQRV9CQUNLV0FSRCkgPyAxIDogMDsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIGludCBtYl9wb3MgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKKworICAgIGlmICh2LT5ibXZ0eXBlID09IEJNVl9UWVBFX0RJUkVDVCkgeworICAgICAgICBpbnQgdG90YWxfb3BwLCBrLCBmOworICAgICAgICBpZiAocy0+bmV4dF9waWN0dXJlLm1iX3R5cGVbbWJfcG9zICsgdi0+bWJfb2ZmXSAhPSBNQl9UWVBFX0lOVFJBKSB7CisgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9IHNjYWxlX212KHMtPm5leHRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdICsgdi0+YmxvY2tzX29mZl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPmJmcmFjdGlvbiwgMCwgcy0+cXVhcnRlcl9zYW1wbGUpOworICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSBzY2FsZV9tdihzLT5uZXh0X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFswXSArIHYtPmJsb2Nrc19vZmZdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT5iZnJhY3Rpb24sIDAsIHMtPnF1YXJ0ZXJfc2FtcGxlKTsKKyAgICAgICAgICAgIHMtPm12WzFdWzBdWzBdID0gc2NhbGVfbXYocy0+bmV4dF9waWN0dXJlLm1vdGlvbl92YWxbMV1bcy0+YmxvY2tfaW5kZXhbMF0gKyB2LT5ibG9ja3Nfb2ZmXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+YmZyYWN0aW9uLCAxLCBzLT5xdWFydGVyX3NhbXBsZSk7CisgICAgICAgICAgICBzLT5tdlsxXVswXVsxXSA9IHNjYWxlX212KHMtPm5leHRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4WzBdICsgdi0+YmxvY2tzX29mZl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPmJmcmFjdGlvbiwgMSwgcy0+cXVhcnRlcl9zYW1wbGUpOworCisgICAgICAgICAgICB0b3RhbF9vcHAgPSB2LT5tdl9mX25leHRbMF1bcy0+YmxvY2tfaW5kZXhbMF0gKyB2LT5ibG9ja3Nfb2ZmXQorICAgICAgICAgICAgICAgICAgICAgICsgdi0+bXZfZl9uZXh0WzBdW3MtPmJsb2NrX2luZGV4WzFdICsgdi0+YmxvY2tzX29mZl0KKyAgICAgICAgICAgICAgICAgICAgICArIHYtPm12X2ZfbmV4dFswXVtzLT5ibG9ja19pbmRleFsyXSArIHYtPmJsb2Nrc19vZmZdCisgICAgICAgICAgICAgICAgICAgICAgKyB2LT5tdl9mX25leHRbMF1bcy0+YmxvY2tfaW5kZXhbM10gKyB2LT5ibG9ja3Nfb2ZmXTsKKyAgICAgICAgICAgIGYgPSAodG90YWxfb3BwID4gMikgPyAxIDogMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPm12WzBdWzBdWzBdID0gcy0+bXZbMF1bMF1bMV0gPSAwOworICAgICAgICAgICAgcy0+bXZbMV1bMF1bMF0gPSBzLT5tdlsxXVswXVsxXSA9IDA7CisgICAgICAgICAgICBmID0gMDsKKyAgICAgICAgfQorICAgICAgICB2LT5yZWZfZmllbGRfdHlwZVswXSA9IHYtPnJlZl9maWVsZF90eXBlWzFdID0gdi0+Y3VyX2ZpZWxkX3R5cGUgXiBmOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVtzLT5ibG9ja19pbmRleFtrXSArIHYtPmJsb2Nrc19vZmZdWzBdID0gcy0+bXZbMF1bMF1bMF07CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVtzLT5ibG9ja19pbmRleFtrXSArIHYtPmJsb2Nrc19vZmZdWzFdID0gcy0+bXZbMF1bMF1bMV07CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFtrXSArIHYtPmJsb2Nrc19vZmZdWzBdID0gcy0+bXZbMV1bMF1bMF07CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFsxXVtzLT5ibG9ja19pbmRleFtrXSArIHYtPmJsb2Nrc19vZmZdWzFdID0gcy0+bXZbMV1bMF1bMV07CisgICAgICAgICAgICB2LT5tdl9mWzBdW3MtPmJsb2NrX2luZGV4W2tdICsgdi0+YmxvY2tzX29mZl0gPSBmOworICAgICAgICAgICAgdi0+bXZfZlsxXVtzLT5ibG9ja19pbmRleFtrXSArIHYtPmJsb2Nrc19vZmZdID0gZjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh2LT5ibXZ0eXBlID09IEJNVl9UWVBFX0lOVEVSUE9MQVRFRCkgeworICAgICAgICBmZl92YzFfcHJlZF9tdih2LCAwLCBkbXZfeFswXSwgZG12X3lbMF0sICAgMSwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgcHJlZF9mbGFnWzBdLCAwKTsKKyAgICAgICAgZmZfdmMxX3ByZWRfbXYodiwgMCwgZG12X3hbMV0sIGRtdl95WzFdLCAgIDEsIHYtPnJhbmdlX3gsIHYtPnJhbmdlX3ksIHYtPm1iX3R5cGVbMF0sIHByZWRfZmxhZ1sxXSwgMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGRpcikgeyAvLyBiYWNrd2FyZAorICAgICAgICBmZl92YzFfcHJlZF9tdih2LCBuLCBkbXZfeFsxXSwgZG12X3lbMV0sIG12MSwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgcHJlZF9mbGFnWzFdLCAxKTsKKyAgICAgICAgaWYgKG4gPT0gMyB8fCBtdjEpIHsKKyAgICAgICAgICAgIGZmX3ZjMV9wcmVkX212KHYsIDAsIGRtdl94WzBdLCBkbXZfeVswXSwgICAxLCB2LT5yYW5nZV94LCB2LT5yYW5nZV95LCB2LT5tYl90eXBlWzBdLCAwLCAwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIGZvcndhcmQKKyAgICAgICAgZmZfdmMxX3ByZWRfbXYodiwgbiwgZG12X3hbMF0sIGRtdl95WzBdLCBtdjEsIHYtPnJhbmdlX3gsIHYtPnJhbmdlX3ksIHYtPm1iX3R5cGVbMF0sIHByZWRfZmxhZ1swXSwgMCk7CisgICAgICAgIGlmIChuID09IDMgfHwgbXYxKSB7CisgICAgICAgICAgICBmZl92YzFfcHJlZF9tdih2LCAwLCBkbXZfeFsxXSwgZG12X3lbMV0sICAgMSwgdi0+cmFuZ2VfeCwgdi0+cmFuZ2VfeSwgdi0+bWJfdHlwZVswXSwgMCwgMSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92YzFfcHJlZC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmMxX3ByZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQ3Zjg2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmMxX3ByZWQuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogVkMtMSBhbmQgV01WMyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLb25zdGFudGluIFNoaXNoa292CisgKiBQYXJ0bHkgYmFzZWQgb24gdmM5LmMgKGMpIDIwMDUgQW5vbnltb3VzLCBBbGV4IEJlcmVnc3phc3ppLCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WQzFfUFJFRF9ICisjZGVmaW5lIEFWQ09ERUNfVkMxX1BSRURfSAorCisjaW5jbHVkZSAidmMxLmgiCisjaW5jbHVkZSAidmMxZGF0YS5oIgorCit2b2lkIGZmX3ZjMV9wcmVkX212KFZDMUNvbnRleHQgKnYsIGludCBuLCBpbnQgZG12X3gsIGludCBkbXZfeSwKKyAgICAgICAgICAgICAgICAgICAgaW50IG12MSwgaW50IHJfeCwgaW50IHJfeSwgdWludDhfdCogaXNfaW50cmEsCisgICAgICAgICAgICAgICAgICAgIGludCBwcmVkX2ZsYWcsIGludCBkaXIpOwordm9pZCBmZl92YzFfcHJlZF9tdl9pbnRmcihWQzFDb250ZXh0ICp2LCBpbnQgbiwgaW50IGRtdl94LCBpbnQgZG12X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtdm4sIGludCByX3gsIGludCByX3ksIHVpbnQ4X3QqIGlzX2ludHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyKTsKK3ZvaWQgZmZfdmMxX3ByZWRfYl9tdihWQzFDb250ZXh0ICp2LCBpbnQgZG12X3hbMl0sIGludCBkbXZfeVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0LCBpbnQgbXZ0eXBlKTsKK3ZvaWQgZmZfdmMxX3ByZWRfYl9tdl9pbnRmaShWQzFDb250ZXh0ICp2LCBpbnQgbiwgaW50ICpkbXZfeCwgaW50ICpkbXZfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXYxLCBpbnQgKnByZWRfZmxhZyk7CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBzY2FsZV9tdihpbnQgdmFsdWUsIGludCBiZnJhYywgaW50IGludiwgaW50IHFzKQoreworICAgIGludCBuID0gYmZyYWM7CisKKyNpZiBCX0ZSQUNUSU9OX0RFTj09MjU2CisgICAgaWYgKGludikKKyAgICAgICAgbiAtPSAyNTY7CisgICAgaWYgKCFxcykKKyAgICAgICAgcmV0dXJuIDIgKiAoKHZhbHVlICogbiArIDI1NSkgPj4gOSk7CisgICAgcmV0dXJuICh2YWx1ZSAqIG4gKyAxMjgpID4+IDg7CisjZWxzZQorICAgIGlmIChpbnYpCisgICAgICAgIG4gLT0gQl9GUkFDVElPTl9ERU47CisgICAgaWYgKCFxcykKKyAgICAgICAgcmV0dXJuIDIgKiAoKHZhbHVlICogbiArIEJfRlJBQ1RJT05fREVOIC0gMSkgLyAoMiAqIEJfRlJBQ1RJT05fREVOKSk7CisgICAgcmV0dXJuICh2YWx1ZSAqIG4gKyBCX0ZSQUNUSU9OX0RFTi8yKSAvIEJfRlJBQ1RJT05fREVOOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBBVkNPREVDX1ZDMV9QUkVEX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMWFjZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmMxYWNkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwYjQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMWFjZGF0YS5oCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogVkMtMSBhbmQgV01WMyBkZWNvZGVyCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVkMxQUNEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19WQzFBQ0RBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJ2YzFkYXRhLmgiCisKKy8qIHdoaWNoIGluZGV4ZXMgcG9pbnQgdG8gbGFzdD0xIGVudHJpZXMgaW4gdGFibGVzICovCitzdGF0aWMgY29uc3QgaW50IHZjMV9sYXN0X2RlY29kZV90YWJsZVtBQ19NT0RFU10gPSB7CisgICAgMTE5LCA5OSwgODUsIDgxLCA2NywgNTgsIDEyNiwgMTA5Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2YzFfaW5kZXhfZGVjb2RlX3RhYmxlW0FDX01PREVTXVsxODVdWzJdID0geworeworeyAgMCwgIDF9LCB7ICAwLCAgMn0sIHsgIDAsICAzfSwgeyAgMCwgIDR9LCB7ICAwLCAgNX0sIHsgIDAsICA2fSwgeyAgMCwgIDd9LCB7ICAwLCAgOH0sCit7ICAwLCAgOX0sIHsgIDAsIDEwfSwgeyAgMCwgMTF9LCB7ICAwLCAxMn0sIHsgIDAsIDEzfSwgeyAgMCwgMTR9LCB7ICAwLCAxNX0sIHsgIDAsIDE2fSwKK3sgIDAsIDE3fSwgeyAgMCwgMTh9LCB7ICAwLCAxOX0sIHsgIDEsICAxfSwgeyAgMSwgIDJ9LCB7ICAxLCAgM30sIHsgIDEsICA0fSwgeyAgMSwgIDV9LAoreyAgMSwgIDZ9LCB7ICAxLCAgN30sIHsgIDEsICA4fSwgeyAgMSwgIDl9LCB7ICAxLCAxMH0sIHsgIDEsIDExfSwgeyAgMSwgMTJ9LCB7ICAxLCAxM30sCit7ICAxLCAxNH0sIHsgIDEsIDE1fSwgeyAgMiwgIDF9LCB7ICAyLCAgMn0sIHsgIDIsICAzfSwgeyAgMiwgIDR9LCB7ICAyLCAgNX0sIHsgIDIsICA2fSwKK3sgIDIsICA3fSwgeyAgMiwgIDh9LCB7ICAyLCAgOX0sIHsgIDIsIDEwfSwgeyAgMiwgMTF9LCB7ICAyLCAxMn0sIHsgIDMsICAxfSwgeyAgMywgIDJ9LAoreyAgMywgIDN9LCB7ICAzLCAgNH0sIHsgIDMsICA1fSwgeyAgMywgIDZ9LCB7ICAzLCAgN30sIHsgIDMsICA4fSwgeyAgMywgIDl9LCB7ICAzLCAxMH0sCit7ICAzLCAxMX0sIHsgIDQsICAxfSwgeyAgNCwgIDJ9LCB7ICA0LCAgM30sIHsgIDQsICA0fSwgeyAgNCwgIDV9LCB7ICA0LCAgNn0sIHsgIDUsICAxfSwKK3sgIDUsICAyfSwgeyAgNSwgIDN9LCB7ICA1LCAgNH0sIHsgIDUsICA1fSwgeyAgNiwgIDF9LCB7ICA2LCAgMn0sIHsgIDYsICAzfSwgeyAgNiwgIDR9LAoreyAgNywgIDF9LCB7ICA3LCAgMn0sIHsgIDcsICAzfSwgeyAgNywgIDR9LCB7ICA4LCAgMX0sIHsgIDgsICAyfSwgeyAgOCwgIDN9LCB7ICA4LCAgNH0sCit7ICA5LCAgMX0sIHsgIDksICAyfSwgeyAgOSwgIDN9LCB7ICA5LCAgNH0sIHsgMTAsICAxfSwgeyAxMCwgIDJ9LCB7IDEwLCAgM30sIHsgMTEsICAxfSwKK3sgMTEsICAyfSwgeyAxMSwgIDN9LCB7IDEyLCAgMX0sIHsgMTIsICAyfSwgeyAxMiwgIDN9LCB7IDEzLCAgMX0sIHsgMTMsICAyfSwgeyAxMywgIDN9LAoreyAxNCwgIDF9LCB7IDE0LCAgMn0sIHsgMTQsICAzfSwgeyAxNSwgIDF9LCB7IDE1LCAgMn0sIHsgMTUsICAzfSwgeyAxNiwgIDF9LCB7IDE2LCAgMn0sCit7IDE3LCAgMX0sIHsgMTcsICAyfSwgeyAxOCwgIDF9LCB7IDE5LCAgMX0sIHsgMjAsICAxfSwgeyAyMSwgIDF9LCB7IDIyLCAgMX0sIHsgMjMsICAxfSwKK3sgMjQsICAxfSwgeyAyNSwgIDF9LCB7IDI2LCAgMX0sIHsgMjcsICAxfSwgeyAyOCwgIDF9LCB7IDI5LCAgMX0sIHsgMzAsICAxfSwgeyAgMCwgIDF9LAoreyAgMCwgIDJ9LCB7ICAwLCAgM30sIHsgIDAsICA0fSwgeyAgMCwgIDV9LCB7ICAwLCAgNn0sIHsgIDEsICAxfSwgeyAgMSwgIDJ9LCB7ICAxLCAgM30sCit7ICAxLCAgNH0sIHsgIDEsICA1fSwgeyAgMiwgIDF9LCB7ICAyLCAgMn0sIHsgIDIsICAzfSwgeyAgMiwgIDR9LCB7ICAzLCAgMX0sIHsgIDMsICAyfSwKK3sgIDMsICAzfSwgeyAgMywgIDR9LCB7ICA0LCAgMX0sIHsgIDQsICAyfSwgeyAgNCwgIDN9LCB7ICA1LCAgMX0sIHsgIDUsICAyfSwgeyAgNiwgIDF9LAoreyAgNiwgIDJ9LCB7ICA3LCAgMX0sIHsgIDcsICAyfSwgeyAgOCwgIDF9LCB7ICA4LCAgMn0sIHsgIDksICAxfSwgeyAgOSwgIDJ9LCB7IDEwLCAgMX0sCit7IDEwLCAgMn0sIHsgMTEsICAxfSwgeyAxMSwgIDJ9LCB7IDEyLCAgMX0sIHsgMTIsICAyfSwgeyAxMywgIDF9LCB7IDEzLCAgMn0sIHsgMTQsICAxfSwKK3sgMTQsICAyfSwgeyAxNSwgIDF9LCB7IDE1LCAgMn0sIHsgMTYsICAxfSwgeyAxNywgIDF9LCB7IDE4LCAgMX0sIHsgMTksICAxfSwgeyAyMCwgIDF9LAoreyAyMSwgIDF9LCB7IDIyLCAgMX0sIHsgMjMsICAxfSwgeyAyNCwgIDF9LCB7IDI1LCAgMX0sIHsgMjYsICAxfSwgeyAyNywgIDF9LCB7IDI4LCAgMX0sCit7IDI5LCAgMX0sIHsgMzAsICAxfSwgeyAzMSwgIDF9LCB7IDMyLCAgMX0sIHsgMzMsICAxfSwgeyAzNCwgIDF9LCB7IDM1LCAgMX0sIHsgMzYsICAxfSwKK3sgMzcsICAxfQorfSwKK3sKK3sgIDAsICAxfSwgeyAgMCwgIDJ9LCB7ICAwLCAgM30sIHsgIDAsICA0fSwgeyAgMCwgIDV9LCB7ICAwLCAgNn0sIHsgIDAsICA3fSwgeyAgMCwgIDh9LAoreyAgMCwgIDl9LCB7ICAwLCAxMH0sIHsgIDAsIDExfSwgeyAgMCwgMTJ9LCB7ICAwLCAxM30sIHsgIDAsIDE0fSwgeyAgMCwgMTV9LCB7ICAwLCAxNn0sCit7ICAwLCAxN30sIHsgIDAsIDE4fSwgeyAgMCwgMTl9LCB7ICAwLCAyMH0sIHsgIDAsIDIxfSwgeyAgMCwgMjJ9LCB7ICAwLCAyM30sIHsgIDEsICAxfSwKK3sgIDEsICAyfSwgeyAgMSwgIDN9LCB7ICAxLCAgNH0sIHsgIDEsICA1fSwgeyAgMSwgIDZ9LCB7ICAxLCAgN30sIHsgIDEsICA4fSwgeyAgMSwgIDl9LAoreyAgMSwgMTB9LCB7ICAxLCAxMX0sIHsgIDIsICAxfSwgeyAgMiwgIDJ9LCB7ICAyLCAgM30sIHsgIDIsICA0fSwgeyAgMiwgIDV9LCB7ICAyLCAgNn0sCit7ICAyLCAgN30sIHsgIDIsICA4fSwgeyAgMywgIDF9LCB7ICAzLCAgMn0sIHsgIDMsICAzfSwgeyAgMywgIDR9LCB7ICAzLCAgNX0sIHsgIDMsICA2fSwKK3sgIDMsICA3fSwgeyAgNCwgIDF9LCB7ICA0LCAgMn0sIHsgIDQsICAzfSwgeyAgNCwgIDR9LCB7ICA0LCAgNX0sIHsgIDUsICAxfSwgeyAgNSwgIDJ9LAoreyAgNSwgIDN9LCB7ICA1LCAgNH0sIHsgIDUsICA1fSwgeyAgNiwgIDF9LCB7ICA2LCAgMn0sIHsgIDYsICAzfSwgeyAgNiwgIDR9LCB7ICA3LCAgMX0sCit7ICA3LCAgMn0sIHsgIDcsICAzfSwgeyAgNywgIDR9LCB7ICA4LCAgMX0sIHsgIDgsICAyfSwgeyAgOCwgIDN9LCB7ICA5LCAgMX0sIHsgIDksICAyfSwKK3sgIDksICAzfSwgeyAxMCwgIDF9LCB7IDEwLCAgMn0sIHsgMTAsICAzfSwgeyAxMSwgIDF9LCB7IDExLCAgMn0sIHsgMTEsICAzfSwgeyAxMiwgIDF9LAoreyAxMiwgIDJ9LCB7IDEzLCAgMX0sIHsgMTMsICAyfSwgeyAxNCwgIDF9LCB7IDE0LCAgMn0sIHsgMTUsICAxfSwgeyAxNSwgIDJ9LCB7IDE2LCAgMX0sCit7IDE2LCAgMn0sIHsgMTcsICAxfSwgeyAxOCwgIDF9LCB7IDE5LCAgMX0sIHsgMjAsICAxfSwgeyAyMSwgIDF9LCB7IDIyLCAgMX0sIHsgMjMsICAxfSwKK3sgMjQsICAxfSwgeyAyNSwgIDF9LCB7IDI2LCAgMX0sIHsgIDAsICAxfSwgeyAgMCwgIDJ9LCB7ICAwLCAgM30sIHsgIDAsICA0fSwgeyAgMCwgIDV9LAoreyAgMCwgIDZ9LCB7ICAwLCAgN30sIHsgIDAsICA4fSwgeyAgMCwgIDl9LCB7ICAxLCAgMX0sIHsgIDEsICAyfSwgeyAgMSwgIDN9LCB7ICAxLCAgNH0sCit7ICAxLCAgNX0sIHsgIDIsICAxfSwgeyAgMiwgIDJ9LCB7ICAyLCAgM30sIHsgIDIsICA0fSwgeyAgMywgIDF9LCB7ICAzLCAgMn0sIHsgIDMsICAzfSwKK3sgIDMsICA0fSwgeyAgNCwgIDF9LCB7ICA0LCAgMn0sIHsgIDQsICAzfSwgeyAgNSwgIDF9LCB7ICA1LCAgMn0sIHsgIDUsICAzfSwgeyAgNiwgIDF9LAoreyAgNiwgIDJ9LCB7ICA2LCAgM30sIHsgIDcsICAxfSwgeyAgNywgIDJ9LCB7ICA4LCAgMX0sIHsgIDgsICAyfSwgeyAgOSwgIDF9LCB7ICA5LCAgMn0sCit7IDEwLCAgMX0sIHsgMTAsICAyfSwgeyAxMSwgIDF9LCB7IDExLCAgMn0sIHsgMTIsICAxfSwgeyAxMiwgIDJ9LCB7IDEzLCAgMX0sIHsgMTMsICAyfSwKK3sgMTQsICAxfSwgeyAxNCwgIDJ9LCB7IDE1LCAgMX0sIHsgMTYsICAxfSwgeyAxNywgIDF9LCB7IDE4LCAgMX0sIHsgMTksICAxfSwgeyAyMCwgIDF9LAoreyAyMSwgIDF9LCB7IDIyLCAgMX0sIHsgMjMsICAxfSwgeyAyNCwgIDF9LCB7IDI1LCAgMX0sIHsgMjYsICAxfSwgeyAyNywgIDF9LCB7IDI4LCAgMX0sCit7IDI5LCAgMX0sIHsgMzAsICAxfSwgeyAzMSwgIDF9LCB7IDMyLCAgMX0sIHsgMzMsICAxfSwgeyAzNCwgIDF9LCB7IDM1LCAgMX0sIHsgMzYsICAxfQorfSwKK3sKK3sgIDAsICAxfSwgeyAgMCwgIDJ9LCB7ICAwLCAgM30sIHsgIDAsICA0fSwgeyAgMCwgIDV9LCB7ICAwLCAgNn0sIHsgIDAsICA3fSwgeyAgMCwgIDh9LAoreyAgMCwgIDl9LCB7ICAwLCAxMH0sIHsgIDAsIDExfSwgeyAgMCwgMTJ9LCB7ICAwLCAxM30sIHsgIDAsIDE0fSwgeyAgMCwgMTV9LCB7ICAwLCAxNn0sCit7ICAxLCAgMX0sIHsgIDEsICAyfSwgeyAgMSwgIDN9LCB7ICAxLCAgNH0sIHsgIDEsICA1fSwgeyAgMSwgIDZ9LCB7ICAxLCAgN30sIHsgIDEsICA4fSwKK3sgIDEsICA5fSwgeyAgMSwgMTB9LCB7ICAxLCAxMX0sIHsgIDIsICAxfSwgeyAgMiwgIDJ9LCB7ICAyLCAgM30sIHsgIDIsICA0fSwgeyAgMiwgIDV9LAoreyAgMiwgIDZ9LCB7ICAyLCAgN30sIHsgIDIsICA4fSwgeyAgMywgIDF9LCB7ICAzLCAgMn0sIHsgIDMsICAzfSwgeyAgMywgIDR9LCB7ICAzLCAgNX0sCit7ICAzLCAgNn0sIHsgIDMsICA3fSwgeyAgNCwgIDF9LCB7ICA0LCAgMn0sIHsgIDQsICAzfSwgeyAgNCwgIDR9LCB7ICA0LCAgNX0sIHsgIDUsICAxfSwKK3sgIDUsICAyfSwgeyAgNSwgIDN9LCB7ICA1LCAgNH0sIHsgIDYsICAxfSwgeyAgNiwgIDJ9LCB7ICA2LCAgM30sIHsgIDYsICA0fSwgeyAgNywgIDF9LAoreyAgNywgIDJ9LCB7ICA3LCAgM30sIHsgIDgsICAxfSwgeyAgOCwgIDJ9LCB7ICA4LCAgM30sIHsgIDksICAxfSwgeyAgOSwgIDJ9LCB7ICA5LCAgM30sCit7IDEwLCAgMX0sIHsgMTAsICAyfSwgeyAxMCwgIDN9LCB7IDExLCAgMX0sIHsgMTEsICAyfSwgeyAxMSwgIDN9LCB7IDEyLCAgMX0sIHsgMTIsICAyfSwKK3sgMTIsICAzfSwgeyAxMywgIDF9LCB7IDEzLCAgMn0sIHsgMTMsICAzfSwgeyAxNCwgIDF9LCB7IDE0LCAgMn0sIHsgMTUsICAxfSwgeyAxNSwgIDJ9LAoreyAxNiwgIDF9LCB7IDE3LCAgMX0sIHsgMTgsICAxfSwgeyAxOSwgIDF9LCB7IDIwLCAgMX0sIHsgIDAsICAxfSwgeyAgMCwgIDJ9LCB7ICAwLCAgM30sCit7ICAwLCAgNH0sIHsgIDEsICAxfSwgeyAgMSwgIDJ9LCB7ICAxLCAgM30sIHsgIDEsICA0fSwgeyAgMiwgIDF9LCB7ICAyLCAgMn0sIHsgIDIsICAzfSwKK3sgIDMsICAxfSwgeyAgMywgIDJ9LCB7ICAzLCAgM30sIHsgIDQsICAxfSwgeyAgNCwgIDJ9LCB7ICA1LCAgMX0sIHsgIDUsICAyfSwgeyAgNiwgIDF9LAoreyAgNiwgIDJ9LCB7ICA3LCAgMX0sIHsgIDcsICAyfSwgeyAgOCwgIDF9LCB7ICA4LCAgMn0sIHsgIDksICAxfSwgeyAgOSwgIDJ9LCB7IDEwLCAgMX0sCit7IDEwLCAgMn0sIHsgMTEsICAxfSwgeyAxMSwgIDJ9LCB7IDEyLCAgMX0sIHsgMTIsICAyfSwgeyAxMywgIDF9LCB7IDEzLCAgMn0sIHsgMTQsICAxfSwKK3sgMTUsICAxfSwgeyAxNiwgIDF9LCB7IDE3LCAgMX0sIHsgMTgsICAxfSwgeyAxOSwgIDF9LCB7IDIwLCAgMX0sIHsgMjEsICAxfSwgeyAyMiwgIDF9LAoreyAyMywgIDF9LCB7IDI0LCAgMX0sIHsgMjUsICAxfSwgeyAyNiwgIDF9Cit9LAoreworeyAgMCwgIDF9LCB7ICAwLCAgMn0sIHsgIDAsICAzfSwgeyAgMCwgIDR9LCB7ICAwLCAgNX0sIHsgIDAsICA2fSwgeyAgMCwgIDd9LCB7ICAwLCAgOH0sCit7ICAwLCAgOX0sIHsgIDAsIDEwfSwgeyAgMCwgMTF9LCB7ICAwLCAxMn0sIHsgIDAsIDEzfSwgeyAgMCwgMTR9LCB7ICAxLCAgMX0sIHsgIDEsICAyfSwKK3sgIDEsICAzfSwgeyAgMSwgIDR9LCB7ICAxLCAgNX0sIHsgIDEsICA2fSwgeyAgMSwgIDd9LCB7ICAxLCAgOH0sIHsgIDEsICA5fSwgeyAgMiwgIDF9LAoreyAgMiwgIDJ9LCB7ICAyLCAgM30sIHsgIDIsICA0fSwgeyAgMiwgIDV9LCB7ICAzLCAgMX0sIHsgIDMsICAyfSwgeyAgMywgIDN9LCB7ICAzLCAgNH0sCit7ICA0LCAgMX0sIHsgIDQsICAyfSwgeyAgNCwgIDN9LCB7ICA0LCAgNH0sIHsgIDUsICAxfSwgeyAgNSwgIDJ9LCB7ICA1LCAgM30sIHsgIDUsICA0fSwKK3sgIDYsICAxfSwgeyAgNiwgIDJ9LCB7ICA2LCAgM30sIHsgIDcsICAxfSwgeyAgNywgIDJ9LCB7ICA3LCAgM30sIHsgIDgsICAxfSwgeyAgOCwgIDJ9LAoreyAgOCwgIDN9LCB7ICA5LCAgMX0sIHsgIDksICAyfSwgeyAgOSwgIDN9LCB7IDEwLCAgMX0sIHsgMTAsICAyfSwgeyAxMCwgIDN9LCB7IDExLCAgMX0sCit7IDExLCAgMn0sIHsgMTEsICAzfSwgeyAxMiwgIDF9LCB7IDEyLCAgMn0sIHsgMTIsICAzfSwgeyAxMywgIDF9LCB7IDEzLCAgMn0sIHsgMTQsICAxfSwKK3sgMTQsICAyfSwgeyAxNSwgIDF9LCB7IDE1LCAgMn0sIHsgMTYsICAxfSwgeyAxNywgIDF9LCB7IDE4LCAgMX0sIHsgMTksICAxfSwgeyAyMCwgIDF9LAoreyAyMSwgIDF9LCB7IDIyLCAgMX0sIHsgMjMsICAxfSwgeyAyNCwgIDF9LCB7IDI1LCAgMX0sIHsgMjYsICAxfSwgeyAyNywgIDF9LCB7IDI4LCAgMX0sCit7IDI5LCAgMX0sIHsgIDAsICAxfSwgeyAgMCwgIDJ9LCB7ICAwLCAgM30sIHsgIDAsICA0fSwgeyAgMCwgIDV9LCB7ICAxLCAgMX0sIHsgIDEsICAyfSwKK3sgIDEsICAzfSwgeyAgMSwgIDR9LCB7ICAyLCAgMX0sIHsgIDIsICAyfSwgeyAgMiwgIDN9LCB7ICAzLCAgMX0sIHsgIDMsICAyfSwgeyAgMywgIDN9LAoreyAgNCwgIDF9LCB7ICA0LCAgMn0sIHsgIDUsICAxfSwgeyAgNSwgIDJ9LCB7ICA2LCAgMX0sIHsgIDYsICAyfSwgeyAgNywgIDF9LCB7ICA3LCAgMn0sCit7ICA4LCAgMX0sIHsgIDgsICAyfSwgeyAgOSwgIDF9LCB7ICA5LCAgMn0sIHsgMTAsICAxfSwgeyAxMCwgIDJ9LCB7IDExLCAgMX0sIHsgMTEsICAyfSwKK3sgMTIsICAxfSwgeyAxMiwgIDJ9LCB7IDEzLCAgMX0sIHsgMTMsICAyfSwgeyAxNCwgIDF9LCB7IDE0LCAgMn0sIHsgMTUsICAxfSwgeyAxNSwgIDJ9LAoreyAxNiwgIDF9LCB7IDE3LCAgMX0sIHsgMTgsICAxfSwgeyAxOSwgIDF9LCB7IDIwLCAgMX0sIHsgMjEsICAxfSwgeyAyMiwgIDF9LCB7IDIzLCAgMX0sCit7IDI0LCAgMX0sIHsgMjUsICAxfSwgeyAyNiwgIDF9LCB7IDI3LCAgMX0sIHsgMjgsICAxfSwgeyAyOSwgIDF9LCB7IDMwLCAgMX0sIHsgMzEsICAxfSwKK3sgMzIsICAxfSwgeyAzMywgIDF9LCB7IDM0LCAgMX0sIHsgMzUsICAxfSwgeyAzNiwgIDF9LCB7IDM3LCAgMX0sIHsgMzgsICAxfSwgeyAzOSwgIDF9LAoreyA0MCwgIDF9LCB7IDQxLCAgMX0sIHsgNDIsICAxfSwgeyA0MywgIDF9Cit9LAoreworeyAgMCwgIDF9LCB7ICAwLCAgMn0sIHsgIDAsICAzfSwgeyAgMCwgIDR9LCB7ICAwLCAgNX0sIHsgIDAsICA2fSwgeyAgMCwgIDd9LCB7ICAwLCAgOH0sCit7ICAwLCAgOX0sIHsgIDAsIDEwfSwgeyAgMCwgMTF9LCB7ICAwLCAxMn0sIHsgIDAsIDEzfSwgeyAgMCwgMTR9LCB7ICAwLCAxNX0sIHsgIDAsIDE2fSwKK3sgIDAsIDE3fSwgeyAgMCwgMTh9LCB7ICAwLCAxOX0sIHsgIDAsIDIwfSwgeyAgMCwgMjF9LCB7ICAwLCAyMn0sIHsgIDAsIDIzfSwgeyAgMCwgMjR9LAoreyAgMCwgMjV9LCB7ICAwLCAyNn0sIHsgIDAsIDI3fSwgeyAgMSwgIDF9LCB7ICAxLCAgMn0sIHsgIDEsICAzfSwgeyAgMSwgIDR9LCB7ICAxLCAgNX0sCit7ICAxLCAgNn0sIHsgIDEsICA3fSwgeyAgMSwgIDh9LCB7ICAxLCAgOX0sIHsgIDEsIDEwfSwgeyAgMiwgIDF9LCB7ICAyLCAgMn0sIHsgIDIsICAzfSwKK3sgIDIsICA0fSwgeyAgMiwgIDV9LCB7ICAzLCAgMX0sIHsgIDMsICAyfSwgeyAgMywgIDN9LCB7ICAzLCAgNH0sIHsgIDQsICAxfSwgeyAgNCwgIDJ9LAoreyAgNCwgIDN9LCB7ICA1LCAgMX0sIHsgIDUsICAyfSwgeyAgNSwgIDN9LCB7ICA2LCAgMX0sIHsgIDYsICAyfSwgeyAgNiwgIDN9LCB7ICA3LCAgMX0sCit7ICA3LCAgMn0sIHsgIDcsICAzfSwgeyAgOCwgIDF9LCB7ICA4LCAgMn0sIHsgIDksICAxfSwgeyAgOSwgIDJ9LCB7IDEwLCAgMX0sIHsgMTEsICAxfSwKK3sgMTIsICAxfSwgeyAxMywgIDF9LCB7IDE0LCAgMX0sIHsgIDAsICAxfSwgeyAgMCwgIDJ9LCB7ICAwLCAgM30sIHsgIDAsICA0fSwgeyAgMCwgIDV9LAoreyAgMCwgIDZ9LCB7ICAwLCAgN30sIHsgIDAsICA4fSwgeyAgMSwgIDF9LCB7ICAxLCAgMn0sIHsgIDEsICAzfSwgeyAgMiwgIDF9LCB7ICAyLCAgMn0sCit7ICAzLCAgMX0sIHsgIDMsICAyfSwgeyAgNCwgIDF9LCB7ICA0LCAgMn0sIHsgIDUsICAxfSwgeyAgNSwgIDJ9LCB7ICA2LCAgMX0sIHsgIDYsICAyfSwKK3sgIDcsICAxfSwgeyAgOCwgIDF9LCB7ICA5LCAgMX0sIHsgMTAsICAxfSwgeyAxMSwgIDF9LCB7IDEyLCAgMX0sIHsgMTMsICAxfSwgeyAxNCwgIDF9LAoreyAxNSwgIDF9LCB7IDE2LCAgMX0sIHsgMTcsICAxfSwgeyAxOCwgIDF9LCB7IDE5LCAgMX0sIHsgMjAsICAxfQorfSwKK3sKK3sgIDAsICAxfSwgeyAgMCwgIDJ9LCB7ICAwLCAgM30sIHsgIDAsICA0fSwgeyAgMCwgIDV9LCB7ICAwLCAgNn0sIHsgIDAsICA3fSwgeyAgMCwgIDh9LAoreyAgMCwgIDl9LCB7ICAwLCAxMH0sIHsgIDAsIDExfSwgeyAgMCwgMTJ9LCB7ICAxLCAgMX0sIHsgIDEsICAyfSwgeyAgMSwgIDN9LCB7ICAxLCAgNH0sCit7ICAxLCAgNX0sIHsgIDEsICA2fSwgeyAgMiwgIDF9LCB7ICAyLCAgMn0sIHsgIDIsICAzfSwgeyAgMiwgIDR9LCB7ICAzLCAgMX0sIHsgIDMsICAyfSwKK3sgIDMsICAzfSwgeyAgNCwgIDF9LCB7ICA0LCAgMn0sIHsgIDQsICAzfSwgeyAgNSwgIDF9LCB7ICA1LCAgMn0sIHsgIDUsICAzfSwgeyAgNiwgIDF9LAoreyAgNiwgIDJ9LCB7ICA2LCAgM30sIHsgIDcsICAxfSwgeyAgNywgIDJ9LCB7ICA4LCAgMX0sIHsgIDgsICAyfSwgeyAgOSwgIDF9LCB7ICA5LCAgMn0sCit7IDEwLCAgMX0sIHsgMTAsICAyfSwgeyAxMSwgIDF9LCB7IDEyLCAgMX0sIHsgMTMsICAxfSwgeyAxNCwgIDF9LCB7IDE1LCAgMX0sIHsgMTYsICAxfSwKK3sgMTcsICAxfSwgeyAxOCwgIDF9LCB7IDE5LCAgMX0sIHsgMjAsICAxfSwgeyAyMSwgIDF9LCB7IDIyLCAgMX0sIHsgMjMsICAxfSwgeyAyNCwgIDF9LAoreyAyNSwgIDF9LCB7IDI2LCAgMX0sIHsgIDAsICAxfSwgeyAgMCwgIDJ9LCB7ICAwLCAgM30sIHsgIDEsICAxfSwgeyAgMSwgIDJ9LCB7ICAyLCAgMX0sCit7ICAzLCAgMX0sIHsgIDQsICAxfSwgeyAgNSwgIDF9LCB7ICA2LCAgMX0sIHsgIDcsICAxfSwgeyAgOCwgIDF9LCB7ICA5LCAgMX0sIHsgMTAsICAxfSwKK3sgMTEsICAxfSwgeyAxMiwgIDF9LCB7IDEzLCAgMX0sIHsgMTQsICAxfSwgeyAxNSwgIDF9LCB7IDE2LCAgMX0sIHsgMTcsICAxfSwgeyAxOCwgIDF9LAoreyAxOSwgIDF9LCB7IDIwLCAgMX0sIHsgMjEsICAxfSwgeyAyMiwgIDF9LCB7IDIzLCAgMX0sIHsgMjQsICAxfSwgeyAyNSwgIDF9LCB7IDI2LCAgMX0sCit7IDI3LCAgMX0sIHsgMjgsICAxfSwgeyAyOSwgIDF9LCB7IDMwLCAgMX0sIHsgMzEsICAxfSwgeyAzMiwgIDF9LCB7IDMzLCAgMX0sIHsgMzQsICAxfSwKK3sgMzUsICAxfSwgeyAzNiwgIDF9LCB7IDM3LCAgMX0sIHsgMzgsICAxfSwgeyAzOSwgIDF9LCB7IDQwLCAgMX0KK30sCit7Cit7ICAwLCAgMX0sIHsgIDAsICAyfSwgeyAgMCwgIDN9LCB7ICAwLCAgNH0sIHsgIDAsICA1fSwgeyAgMCwgIDZ9LCB7ICAwLCAgN30sIHsgIDAsICA4fSwKK3sgIDAsICA5fSwgeyAgMCwgMTB9LCB7ICAwLCAxMX0sIHsgIDAsIDEyfSwgeyAgMCwgMTN9LCB7ICAwLCAxNH0sIHsgIDAsIDE1fSwgeyAgMCwgMTZ9LAoreyAgMCwgMTd9LCB7ICAwLCAxOH0sIHsgIDAsIDE5fSwgeyAgMCwgMjB9LCB7ICAwLCAyMX0sIHsgIDAsIDIyfSwgeyAgMCwgMjN9LCB7ICAwLCAyNH0sCit7ICAwLCAyNX0sIHsgIDAsIDI2fSwgeyAgMCwgMjd9LCB7ICAwLCAyOH0sIHsgIDAsIDI5fSwgeyAgMCwgMzB9LCB7ICAwLCAzMX0sIHsgIDAsIDMyfSwKK3sgIDAsIDMzfSwgeyAgMCwgMzR9LCB7ICAwLCAzNX0sIHsgIDAsIDM2fSwgeyAgMCwgMzd9LCB7ICAwLCAzOH0sIHsgIDAsIDM5fSwgeyAgMCwgNDB9LAoreyAgMCwgNDF9LCB7ICAwLCA0Mn0sIHsgIDAsIDQzfSwgeyAgMCwgNDR9LCB7ICAwLCA0NX0sIHsgIDAsIDQ2fSwgeyAgMCwgNDd9LCB7ICAwLCA0OH0sCit7ICAwLCA0OX0sIHsgIDAsIDUwfSwgeyAgMCwgNTF9LCB7ICAwLCA1Mn0sIHsgIDAsIDUzfSwgeyAgMCwgNTR9LCB7ICAwLCA1NX0sIHsgIDAsIDU2fSwKK3sgIDEsICAxfSwgeyAgMSwgIDJ9LCB7ICAxLCAgM30sIHsgIDEsICA0fSwgeyAgMSwgIDV9LCB7ICAxLCAgNn0sIHsgIDEsICA3fSwgeyAgMSwgIDh9LAoreyAgMSwgIDl9LCB7ICAxLCAxMH0sIHsgIDEsIDExfSwgeyAgMSwgMTJ9LCB7ICAxLCAxM30sIHsgIDEsIDE0fSwgeyAgMSwgMTV9LCB7ICAxLCAxNn0sCit7ICAxLCAxN30sIHsgIDEsIDE4fSwgeyAgMSwgMTl9LCB7ICAxLCAyMH0sIHsgIDIsICAxfSwgeyAgMiwgIDJ9LCB7ICAyLCAgM30sIHsgIDIsICA0fSwKK3sgIDIsICA1fSwgeyAgMiwgIDZ9LCB7ICAyLCAgN30sIHsgIDIsICA4fSwgeyAgMiwgIDl9LCB7ICAyLCAxMH0sIHsgIDMsICAxfSwgeyAgMywgIDJ9LAoreyAgMywgIDN9LCB7ICAzLCAgNH0sIHsgIDMsICA1fSwgeyAgMywgIDZ9LCB7ICAzLCAgN30sIHsgIDQsICAxfSwgeyAgNCwgIDJ9LCB7ICA0LCAgM30sCit7ICA0LCAgNH0sIHsgIDQsICA1fSwgeyAgNCwgIDZ9LCB7ICA1LCAgMX0sIHsgIDUsICAyfSwgeyAgNSwgIDN9LCB7ICA1LCAgNH0sIHsgIDUsICA1fSwKK3sgIDYsICAxfSwgeyAgNiwgIDJ9LCB7ICA2LCAgM30sIHsgIDYsICA0fSwgeyAgNywgIDF9LCB7ICA3LCAgMn0sIHsgIDcsICAzfSwgeyAgOCwgIDF9LAoreyAgOCwgIDJ9LCB7ICA4LCAgM30sIHsgIDksICAxfSwgeyAgOSwgIDJ9LCB7ICA5LCAgM30sIHsgMTAsICAxfSwgeyAxMCwgIDJ9LCB7IDExLCAgMX0sCit7IDExLCAgMn0sIHsgMTIsICAxfSwgeyAxMiwgIDJ9LCB7IDEzLCAgMX0sIHsgMTMsICAyfSwgeyAxNCwgIDF9LCB7ICAwLCAgMX0sIHsgIDAsICAyfSwKK3sgIDAsICAzfSwgeyAgMCwgIDR9LCB7ICAxLCAgMX0sIHsgIDEsICAyfSwgeyAgMSwgIDN9LCB7ICAyLCAgMX0sIHsgIDIsICAyfSwgeyAgMiwgIDN9LAoreyAgMywgIDF9LCB7ICAzLCAgMn0sIHsgIDQsICAxfSwgeyAgNCwgIDJ9LCB7ICA1LCAgMX0sIHsgIDUsICAyfSwgeyAgNiwgIDF9LCB7ICA2LCAgMn0sCit7ICA3LCAgMX0sIHsgIDcsICAyfSwgeyAgOCwgIDF9LCB7ICA4LCAgMn0sIHsgIDksICAxfSwgeyAgOSwgIDJ9LCB7IDEwLCAgMX0sIHsgMTAsICAyfSwKK3sgMTEsICAxfSwgeyAxMSwgIDJ9LCB7IDEyLCAgMX0sIHsgMTIsICAyfSwgeyAxMywgIDF9LCB7IDEzLCAgMn0sIHsgMTQsICAxfSwgeyAxNCwgIDJ9LAoreyAxNSwgIDF9LCB7IDE2LCAgMX0KK30sCit7Cit7ICAwLCAgMX0sIHsgIDAsICAyfSwgeyAgMCwgIDN9LCB7ICAwLCAgNH0sIHsgIDAsICA1fSwgeyAgMCwgIDZ9LCB7ICAwLCAgN30sIHsgIDAsICA4fSwKK3sgIDAsICA5fSwgeyAgMCwgMTB9LCB7ICAwLCAxMX0sIHsgIDAsIDEyfSwgeyAgMCwgMTN9LCB7ICAwLCAxNH0sIHsgIDAsIDE1fSwgeyAgMCwgMTZ9LAoreyAgMCwgMTd9LCB7ICAwLCAxOH0sIHsgIDAsIDE5fSwgeyAgMCwgMjB9LCB7ICAwLCAyMX0sIHsgIDAsIDIyfSwgeyAgMCwgMjN9LCB7ICAwLCAyNH0sCit7ICAwLCAyNX0sIHsgIDAsIDI2fSwgeyAgMCwgMjd9LCB7ICAwLCAyOH0sIHsgIDAsIDI5fSwgeyAgMCwgMzB9LCB7ICAwLCAzMX0sIHsgIDAsIDMyfSwKK3sgIDEsICAxfSwgeyAgMSwgIDJ9LCB7ICAxLCAgM30sIHsgIDEsICA0fSwgeyAgMSwgIDV9LCB7ICAxLCAgNn0sIHsgIDEsICA3fSwgeyAgMSwgIDh9LAoreyAgMSwgIDl9LCB7ICAxLCAxMH0sIHsgIDEsIDExfSwgeyAgMSwgMTJ9LCB7ICAxLCAxM30sIHsgIDIsICAxfSwgeyAgMiwgIDJ9LCB7ICAyLCAgM30sCit7ICAyLCAgNH0sIHsgIDIsICA1fSwgeyAgMiwgIDZ9LCB7ICAyLCAgN30sIHsgIDIsICA4fSwgeyAgMywgIDF9LCB7ICAzLCAgMn0sIHsgIDMsICAzfSwKK3sgIDMsICA0fSwgeyAgMywgIDV9LCB7ICAzLCAgNn0sIHsgIDQsICAxfSwgeyAgNCwgIDJ9LCB7ICA0LCAgM30sIHsgIDQsICA0fSwgeyAgNCwgIDV9LAoreyAgNSwgIDF9LCB7ICA1LCAgMn0sIHsgIDUsICAzfSwgeyAgNSwgIDR9LCB7ICA2LCAgMX0sIHsgIDYsICAyfSwgeyAgNiwgIDN9LCB7ICA2LCAgNH0sCit7ICA3LCAgMX0sIHsgIDcsICAyfSwgeyAgNywgIDN9LCB7ICA4LCAgMX0sIHsgIDgsICAyfSwgeyAgOCwgIDN9LCB7ICA5LCAgMX0sIHsgIDksICAyfSwKK3sgIDksICAzfSwgeyAxMCwgIDF9LCB7IDEwLCAgMn0sIHsgMTEsICAxfSwgeyAxMSwgIDJ9LCB7IDEyLCAgMX0sIHsgMTIsICAyfSwgeyAxMywgIDF9LAoreyAxMywgIDJ9LCB7IDE0LCAgMX0sIHsgMTQsICAyfSwgeyAxNSwgIDF9LCB7IDE1LCAgMn0sIHsgMTYsICAxfSwgeyAxNiwgIDJ9LCB7IDE3LCAgMX0sCit7IDE3LCAgMn0sIHsgMTgsICAxfSwgeyAxOCwgIDJ9LCB7IDE5LCAgMX0sIHsgMTksICAyfSwgeyAyMCwgIDF9LCB7IDIwLCAgMn0sIHsgMjEsICAxfSwKK3sgMjEsICAyfSwgeyAyMiwgIDF9LCB7IDIyLCAgMn0sIHsgMjMsICAxfSwgeyAyNCwgIDF9LCB7ICAwLCAgMX0sIHsgIDAsICAyfSwgeyAgMCwgIDN9LAoreyAgMCwgIDR9LCB7ICAxLCAgMX0sIHsgIDEsICAyfSwgeyAgMSwgIDN9LCB7ICAyLCAgMX0sIHsgIDIsICAyfSwgeyAgMiwgIDN9LCB7ICAzLCAgMX0sCit7ICAzLCAgMn0sIHsgIDMsICAzfSwgeyAgNCwgIDF9LCB7ICA0LCAgMn0sIHsgIDUsICAxfSwgeyAgNSwgIDJ9LCB7ICA2LCAgMX0sIHsgIDYsICAyfSwKK3sgIDcsICAxfSwgeyAgNywgIDJ9LCB7ICA4LCAgMX0sIHsgIDgsICAyfSwgeyAgOSwgIDF9LCB7ICA5LCAgMn0sIHsgMTAsICAxfSwgeyAxMCwgIDJ9LAoreyAxMSwgIDF9LCB7IDExLCAgMn0sIHsgMTIsICAxfSwgeyAxMiwgIDJ9LCB7IDEzLCAgMX0sIHsgMTMsICAyfSwgeyAxNCwgIDF9LCB7IDE0LCAgMn0sCit7IDE1LCAgMX0sIHsgMTUsICAyfSwgeyAxNiwgIDF9LCB7IDE2LCAgMn0sIHsgMTcsICAxfSwgeyAxNywgIDJ9LCB7IDE4LCAgMX0sIHsgMTgsICAyfSwKK3sgMTksICAxfSwgeyAxOSwgIDJ9LCB7IDIwLCAgMX0sIHsgMjAsICAyfSwgeyAyMSwgIDF9LCB7IDIxLCAgMn0sIHsgMjIsICAxfSwgeyAyMiwgIDJ9LAoreyAyMywgIDF9LCB7IDIzLCAgMn0sIHsgMjQsICAxfSwgeyAyNCwgIDJ9LCB7IDI1LCAgMX0sIHsgMjUsICAyfSwgeyAyNiwgIDF9LCB7IDI2LCAgMn0sCit7IDI3LCAgMX0sIHsgMjcsICAyfSwgeyAyOCwgIDF9LCB7IDI4LCAgMn0sIHsgMjksICAxfSwgeyAzMCwgIDF9Cit9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2YzFfZGVsdGFfbGV2ZWxfdGFibGVbQUNfTU9ERVNdWzMxXSA9IHsKK3sKKyAgICAgIDE5LCAgICAxNSwgICAgMTIsICAgIDExLCAgICAgNiwgICAgIDUsICAgICA0LCAgICAgNCwgICAgIDQsICAgICA0LAorICAgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxCit9LAoreworICAgICAgMjMsICAgIDExLCAgICAgOCwgICAgIDcsICAgICA1LCAgICAgNSwgICAgIDQsICAgICA0LCAgICAgMywgICAgIDMsCisgICAgICAgMywgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxCit9LAoreworICAgICAgMTYsICAgIDExLCAgICAgOCwgICAgIDcsICAgICA1LCAgICAgNCwgICAgIDQsICAgICAzLCAgICAgMywgICAgIDMsCisgICAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxCit9LAoreworICAgICAgMTQsICAgICA5LCAgICAgNSwgICAgIDQsICAgICA0LCAgICAgNCwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsCisgICAgICAgMywgICAgIDMsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMQorfSwKK3sKKyAgICAgIDI3LCAgICAxMCwgICAgIDUsICAgICA0LCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDIsICAgICAyLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxCit9LAoreworICAgICAgMTIsICAgICA2LCAgICAgNCwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxCit9LAoreworICAgICAgNTYsICAgIDIwLCAgICAxMCwgICAgIDcsICAgICA2LCAgICAgNSwgICAgIDQsICAgICAzLCAgICAgMywgICAgIDMsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEKK30sCit7CisgICAgICAzMiwgICAgMTMsICAgICA4LCAgICAgNiwgICAgIDUsICAgICA0LCAgICAgNCwgICAgIDMsICAgICAzLCAgICAgMywKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAxCit9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2YzFfbGFzdF9kZWx0YV9sZXZlbF90YWJsZVtBQ19NT0RFU11bNDRdID0geworeworICAgICAgIDYsICAgICA1LCAgICAgNCwgICAgIDQsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxCit9LAoreworICAgICAgIDksICAgICA1LCAgICAgNCwgICAgIDQsICAgICAzLCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEKK30sCit7CisgICAgICAgNCwgICAgIDQsICAgICAzLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEKK30sCit7CisgICAgICAgNSwgICAgIDQsICAgICAzLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxCit9LAoreworICAgICAgIDgsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxCit9LAoreworICAgICAgIDMsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMQorfSwKK3sKKyAgICAgICA0LCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDEKK30sCit7CisgICAgICAgNCwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsCisgICAgICAgMQorfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdmMxX2RlbHRhX3J1bl90YWJsZVtBQ19NT0RFU11bNTddID0geworeworICAgICAgLTEsICAgIDMwLCAgICAxNywgICAgMTUsICAgICA5LCAgICAgNSwgICAgIDQsICAgICAzLCAgICAgMywgICAgIDMsCisgICAgICAgMywgICAgIDMsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAKK30sCit7CisgICAgICAtMSwgICAgMjYsICAgIDE2LCAgICAxMSwgICAgIDcsICAgICA1LCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAKK30sCit7CisgICAgICAtMSwgICAgMjAsICAgIDE1LCAgICAxMywgICAgIDYsICAgICA0LCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwCit9LAoreworICAgICAgLTEsICAgIDI5LCAgICAxNSwgICAgMTIsICAgICA1LCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAKK30sCit7CisgICAgICAtMSwgICAgMTQsICAgICA5LCAgICAgNywgICAgIDMsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwCit9LAoreworICAgICAgLTEsICAgIDI2LCAgICAxMCwgICAgIDYsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwCit9LAoreworICAgICAgLTEsICAgIDE0LCAgICAxMywgICAgIDksICAgICA2LCAgICAgNSwgICAgIDQsICAgICAzLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwCit9LAoreworICAgICAgLTEsICAgIDI0LCAgICAyMiwgICAgIDksICAgICA2LCAgICAgNCwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMAorfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdmMxX2xhc3RfZGVsdGFfcnVuX3RhYmxlW0FDX01PREVTXVsxMF0gPSB7Cit7CisgICAgICAtMSwgICAgMzcsICAgIDE1LCAgICAgNCwgICAgIDMsICAgICAxLCAgICAgMAorfSwKK3sKKyAgICAgIC0xLCAgICAzNiwgICAgMTQsICAgICA2LCAgICAgMywgICAgIDEsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMAorfSwKK3sKKyAgICAgIC0xLCAgICAyNiwgICAgMTMsICAgICAzLCAgICAgMQorfSwKK3sKKyAgICAgIC0xLCAgICA0MywgICAgMTUsICAgICAzLCAgICAgMSwgICAgIDAKK30sCit7CisgICAgICAtMSwgICAgMjAsICAgICA2LCAgICAgMSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwCit9LAoreworICAgICAgLTEsICAgIDQwLCAgICAgMSwgICAgIDAKK30sCit7CisgICAgICAtMSwgICAgMTYsICAgIDE0LCAgICAgMiwgICAgIDAKK30sCit7CisgICAgICAtMSwgICAgMzAsICAgIDI4LCAgICAgMywgICAgIDAKK30KK307CisKKyNlbmRpZiAvKiBBVkNPREVDX1ZDMUFDREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92YzFkYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92YzFkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5YmE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMWRhdGEuYwpAQCAtMCwwICsxLDExMzUgQEAKKy8qCisgKiBWQy0xIGFuZCBXTVYzIGRlY29kZXIKKyAqIGNvcHlyaWdodCAoYykgMjAxMSBNYXNoaWF0IFNhcmtlciBTaGFra2hhcgorICogY29weXJpZ2h0IChjKSAyMDA2IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqIChjKSAyMDA1IGFub255bW91cywgQWxleCBCZXJlZ3N6YXN6aSwgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWQy0xIHRhYmxlcy4KKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInZjMS5oIgorI2luY2x1ZGUgInZjMWRhdGEuaCIKKworLyoqIFRhYmxlIGZvciBjb252ZXJzaW9uIGJldHdlZW4gVFRCTEsgYW5kIFRUTUIgKi8KK2NvbnN0IGludCBmZl92YzFfdHRibGtfdG9fdHRbM11bOF0gPSB7CisgICAgeyBUVF84WDQsIFRUXzRYOCwgVFRfOFg4LCBUVF80WDQsIFRUXzhYNF9UT1AsIFRUXzhYNF9CT1RUT00sIFRUXzRYOF9SSUdIVCwgVFRfNFg4X0xFRlQgfSwKKyAgICB7IFRUXzhYOCwgVFRfNFg4X1JJR0hULCBUVF80WDhfTEVGVCwgVFRfNFg0LCBUVF84WDQsIFRUXzRYOCwgVFRfOFg0X0JPVFRPTSwgVFRfOFg0X1RPUCB9LAorICAgIHsgVFRfOFg4LCBUVF80WDgsIFRUXzRYNCwgVFRfOFg0X0JPVFRPTSwgVFRfNFg4X1JJR0hULCBUVF80WDhfTEVGVCwgVFRfOFg0LCBUVF84WDRfVE9QIH0KK307CisKK2NvbnN0IGludCBmZl92YzFfdHRmcm1fdG9fdHRbNF0gPSB7IFRUXzhYOCwgVFRfOFg0LCBUVF80WDgsIFRUXzRYNCB9OworCisvKiogTVYgUCBtb2RlIC0gdGhlIDV0aCBlbGVtZW50IGlzIG9ubHkgdXNlZCBmb3IgbW9kZSAxICovCitjb25zdCB1aW50OF90IGZmX3ZjMV9tdl9wbW9kZV90YWJsZVsyXVs1XSA9IHsKKyAgICB7IE1WX1BNT0RFXzFNVl9IUEVMX0JJTElOLCBNVl9QTU9ERV8xTVYsIE1WX1BNT0RFXzFNVl9IUEVMLCBNVl9QTU9ERV9JTlRFTlNJVFlfQ09NUCwgTVZfUE1PREVfTUlYRURfTVYgfSwKKyAgICB7IE1WX1BNT0RFXzFNViwgTVZfUE1PREVfTUlYRURfTVYsIE1WX1BNT0RFXzFNVl9IUEVMLCBNVl9QTU9ERV9JTlRFTlNJVFlfQ09NUCwgTVZfUE1PREVfMU1WX0hQRUxfQklMSU4gfQorfTsKK2NvbnN0IHVpbnQ4X3QgZmZfdmMxX212X3Btb2RlX3RhYmxlMlsyXVs0XSA9IHsKKyAgICB7IE1WX1BNT0RFXzFNVl9IUEVMX0JJTElOLCBNVl9QTU9ERV8xTVYsIE1WX1BNT0RFXzFNVl9IUEVMLCBNVl9QTU9ERV9NSVhFRF9NViB9LAorICAgIHsgTVZfUE1PREVfMU1WLCBNVl9QTU9ERV9NSVhFRF9NViwgTVZfUE1PREVfMU1WX0hQRUwsIE1WX1BNT0RFXzFNVl9IUEVMX0JJTElOIH0KK307CisKKy8qIE1CTU9ERSB0YWJsZSBmb3IgaW50ZXJsYWNlZCBmcmFtZSBQLXBpY3R1cmUgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfdmMxX21ibW9kZV9pbnRmcnBbMl1bMTVdWzRdID0geworICAgIHsgLyogMTogNC1NViwgMDogbm9uLTQtTVYgKi8KKyAgICAgICAgLyogVHlwZSwgRklFTERUWCwgMS1NViBEaWZmZXJlbnRpYWwgcHJlc2VudCwgUmVzaWR1YWxzIChDQlApIHByZXNlbnQgKi8KKyAgICAgICAgLyogVGFibGUgMTY0IC0gVGFibGUgMTY3ICovCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMU1WICAgICAgLCAwLCAxLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMU1WICAgICAgLCAxLCAxLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMU1WICAgICAgLCAwLCAxLCAwIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMU1WICAgICAgLCAwLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMU1WICAgICAgLCAxLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMk1WX0ZJRUxELCAwLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMk1WX0ZJRUxELCAxLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMk1WX0ZJRUxELCAwLCAwLCAwIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfSU5UUkEgICAgLCAwLCAwLCAwIH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogVGFibGUgMTYwIC0gVGFibGUgMTYzICovCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMU1WICAgICAgLCAwLCAxLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMU1WICAgICAgLCAxLCAxLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMU1WICAgICAgLCAwLCAxLCAwIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMU1WICAgICAgLCAwLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMU1WICAgICAgLCAxLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMk1WX0ZJRUxELCAwLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMk1WX0ZJRUxELCAxLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfMk1WX0ZJRUxELCAwLCAwLCAwIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfNE1WICAgICAgLCAwLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfNE1WICAgICAgLCAxLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfNE1WICAgICAgLCAwLCAwLCAwIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfNE1WX0ZJRUxELCAwLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfNE1WX0ZJRUxELCAxLCAwLCAxIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfNE1WX0ZJRUxELCAwLCAwLCAwIH0sCisgICAgICAgIHsgTVZfUE1PREVfSU5URlJfSU5UUkEgICAgLCAwLCAwLCAwIH0KKyAgICB9Cit9OworCitjb25zdCBpbnQgZmZfdmMxX2Zwc19ucls3XSA9IHsgMjQsIDI1LCAzMCwgNTAsIDYwLCA0OCwgNzIgfSwKKyAgICAgICAgICBmZl92YzFfZnBzX2RyWzJdID0geyAxMDAwLCAxMDAxIH07Citjb25zdCB1aW50OF90IGZmX3ZjMV9wcXVhbnRfdGFibGVbM11bMzJdID0geworICAgIC8qIEltcGxpY2l0IHF1YW50aXplciAqLworICAgIHsgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsCisgICAgICAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjcsIDI5LCAzMSB9LAorICAgIC8qIEV4cGxpY2l0IHF1YW50aXplciwgcHF1YW50aXplciB1bmlmb3JtICovCisgICAgeyAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgICAgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxIH0sCisgICAgLyogRXhwbGljaXQgcXVhbnRpemVyLCBwcXVhbnRpemVyIG5vbi11bmlmb3JtICovCisgICAgeyAgMCwgIDEsICAxLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywKKyAgICAgIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjksIDMxIH0KK307CisKKy8qKiBAbmFtZSBWQy0xIFZMQyB0YWJsZXMgYW5kIGRlZmluZXMKKyAqICBAdG9kbyBUT0RPIG1vdmUgdGhpcyBpbnRvIHRoZSBjb250ZXh0CisgKi8KKy8vQHsKKyNkZWZpbmUgVkMxX0JGUkFDVElPTl9WTENfQklUUyA3CitWTEMgZmZfdmMxX2JmcmFjdGlvbl92bGM7CisjZGVmaW5lIFZDMV9JTU9ERV9WTENfQklUUyA0CitWTEMgZmZfdmMxX2ltb2RlX3ZsYzsKKyNkZWZpbmUgVkMxX05PUk0yX1ZMQ19CSVRTIDMKK1ZMQyBmZl92YzFfbm9ybTJfdmxjOworI2RlZmluZSBWQzFfTk9STTZfVkxDX0JJVFMgOQorVkxDIGZmX3ZjMV9ub3JtNl92bGM7CisvKiBDb3VsZCBiZSBvcHRpbWl6ZWQsIG9uZSB0YWJsZSBvbmx5IG5lZWRzIDggYml0cyAqLworI2RlZmluZSBWQzFfVFRNQl9WTENfQklUUyA5IC8vMTIKK1ZMQyBmZl92YzFfdHRtYl92bGNbM107CisjZGVmaW5lIFZDMV9NVl9ESUZGX1ZMQ19CSVRTIDkgLy8xNQorVkxDIGZmX3ZjMV9tdl9kaWZmX3ZsY1s0XTsKKyNkZWZpbmUgVkMxX0NCUENZX1BfVkxDX0JJVFMgOSAvLzE0CitWTEMgZmZfdmMxX2NicGN5X3BfdmxjWzRdOworI2RlZmluZSBWQzFfSUNCUENZX1ZMQ19CSVRTIDkKK1ZMQyBmZl92YzFfaWNicGN5X3ZsY1s4XTsKKyNkZWZpbmUgVkMxXzRNVl9CTE9DS19QQVRURVJOX1ZMQ19CSVRTIDYKK1ZMQyBmZl92YzFfNG12X2Jsb2NrX3BhdHRlcm5fdmxjWzRdOworI2RlZmluZSBWQzFfMk1WX0JMT0NLX1BBVFRFUk5fVkxDX0JJVFMgMworVkxDIGZmX3ZjMV8ybXZfYmxvY2tfcGF0dGVybl92bGNbNF07CisjZGVmaW5lIFZDMV9UVEJMS19WTENfQklUUyA1CitWTEMgZmZfdmMxX3R0YmxrX3ZsY1szXTsKKyNkZWZpbmUgVkMxX1NVQkJMS1BBVF9WTENfQklUUyA2CitWTEMgZmZfdmMxX3N1YmJsa3BhdF92bGNbM107CisjZGVmaW5lIFZDMV9JTlRGUl80TVZfTUJNT0RFX1ZMQ19CSVRTIDkKK1ZMQyBmZl92YzFfaW50ZnJfNG12X21ibW9kZV92bGNbNF07CisjZGVmaW5lIFZDMV9JTlRGUl9OT040TVZfTUJNT0RFX1ZMQ19CSVRTIDYKK1ZMQyBmZl92YzFfaW50ZnJfbm9uNG12X21ibW9kZV92bGNbNF07CisjZGVmaW5lIFZDMV9JRl9NTVZfTUJNT0RFX1ZMQ19CSVRTIDUKK1ZMQyBmZl92YzFfaWZfbW12X21ibW9kZV92bGNbOF07CisjZGVmaW5lIFZDMV9JRl8xTVZfTUJNT0RFX1ZMQ19CSVRTIDUKK1ZMQyBmZl92YzFfaWZfMW12X21ibW9kZV92bGNbOF07CisjZGVmaW5lIFZDMV8xUkVGX01WREFUQV9WTENfQklUUyA5CitWTEMgZmZfdmMxXzFyZWZfbXZkYXRhX3ZsY1s0XTsKKyNkZWZpbmUgVkMxXzJSRUZfTVZEQVRBX1ZMQ19CSVRTIDkKK1ZMQyBmZl92YzFfMnJlZl9tdmRhdGFfdmxjWzhdOworCitWTEMgZmZfdmMxX2FjX2NvZWZmX3RhYmxlWzhdOworCisjZGVmaW5lIFZDMV9JRl9NQk1PREVfVkxDX0JJVFMgNSAgICAvLyBhcyBhIHBsYWNlaG9sZGVyIGZvciBWQzFfSUZfTU1WX01CTU9ERV9WTENfQklUUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgVkMxX0lGXzFNVl9NQk1PREVfVkxDX0JJVFMgc2luY2UgdGhleSBhcmUgdGhlIHNhbWUKKy8vQH0KKworCisjaWYgQl9GUkFDVElPTl9ERU4gPT0gODQwIC8vIG9yaWdpbmFsIGJmcmFjdGlvbiBmcm9tIHZjOWRhdGEuaCwgbm90IGNvbmZvcm1pbmcgdG8gc3RhbmRhcmQKKy8qIGJmcmFjdGlvbiBpcyBmcmFjdGlvbmFsLCB3ZSBzY2FsZSB0byB0aGUgR0NEIDMqNSo3KjggPSA4NDAgKi8KK2NvbnN0IGludDE2X3QgZmZfdmMxX2JmcmFjdGlvbl9sdXRbMjNdID0geworICAgIDQyMCAvKjEvMiovLCAyODAgLyoxLzMqLywgNTYwIC8qMi8zKi8sIDIxMCAvKjEvNCovLAorICAgIDYzMCAvKjMvNCovLCAxNjggLyoxLzUqLywgMzM2IC8qMi81Ki8sCisgICAgNTA0IC8qMy81Ki8sIDY3MiAvKjQvNSovLCAxNDAgLyoxLzYqLywgNzAwIC8qNS82Ki8sCisgICAgMTIwIC8qMS83Ki8sIDI0MCAvKjIvNyovLCAzNjAgLyozLzcqLywgNDgwIC8qNC83Ki8sCisgICAgNjAwIC8qNS83Ki8sIDcyMCAvKjYvNyovLCAxMDUgLyoxLzgqLywgMzE1IC8qMy84Ki8sCisgICAgNTI1IC8qNS84Ki8sIDczNSAvKjcvOCovLAorICAgIC0xIC8qaW52LiovLCAwIC8qQkkgZm0qLworfTsKKyNlbHNlCisvKiBwcmUtY29tcHV0ZWQgc2NhbGVzIGZvciBhbGwgYmZyYWN0aW9ucyBhbmQgYmFzZT0yNTYgKi8KK2NvbnN0IGludDE2X3QgZmZfdmMxX2JmcmFjdGlvbl9sdXRbMjNdID0geworICAgIDEyOCAvKjEvMiovLCAgODUgLyoxLzMqLywgMTcwIC8qMi8zKi8sICA2NCAvKjEvNCovLAorICAgIDE5MiAvKjMvNCovLCAgNTEgLyoxLzUqLywgMTAyIC8qMi81Ki8sCisgICAgMTUzIC8qMy81Ki8sIDIwNCAvKjQvNSovLCAgNDMgLyoxLzYqLywgMjE1IC8qNS82Ki8sCisgICAgIDM3IC8qMS83Ki8sICA3NCAvKjIvNyovLCAxMTEgLyozLzcqLywgMTQ4IC8qNC83Ki8sCisgICAgMTg1IC8qNS83Ki8sIDIyMiAvKjYvNyovLCAgMzIgLyoxLzgqLywgIDk2IC8qMy84Ki8sCisgICAgMTYwIC8qNS84Ki8sIDIyNCAvKjcvOCovLAorICAgIC0xIC8qaW52LiovLCAwIC8qQkkgZm0qLworfTsKKyNlbmRpZgorCitjb25zdCB1aW50OF90IGZmX3ZjMV9iZnJhY3Rpb25fYml0c1syM10gPSB7CisgICAgMywgMywgMywgMywKKyAgICAzLCAzLCAzLAorICAgIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywKKyAgICA3LCA3LCA3LCA3LAorICAgIDcsIDcsCisgICAgNywgNworfTsKK2NvbnN0IHVpbnQ4X3QgZmZfdmMxX2JmcmFjdGlvbl9jb2Rlc1syM10gPSB7CisgICAgICAwLCAgIDEsICAgMiwgICAzLAorICAgICAgNCwgICA1LCAgIDYsCisgICAgMTEyLCAxMTMsIDExNCwgMTE1LAorICAgIDExNiwgMTE3LCAxMTgsIDExOSwKKyAgICAxMjAsIDEyMSwgMTIyLCAxMjMsCisgICAgMTI0LCAxMjUsCisgICAgMTI2LCAxMjcKK307CisKKy8vU2FtZSBhcyBILjI2NAorY29uc3QgQVZSYXRpb25hbCBmZl92YzFfcGl4ZWxfYXNwZWN0WzE2XSA9IHsKKyAgICB7ICAgMCwgIDEgfSwKKyAgICB7ICAgMSwgIDEgfSwKKyAgICB7ICAxMiwgMTEgfSwKKyAgICB7ICAxMCwgMTEgfSwKKyAgICB7ICAxNiwgMTEgfSwKKyAgICB7ICA0MCwgMzMgfSwKKyAgICB7ICAyNCwgMTEgfSwKKyAgICB7ICAyMCwgMTEgfSwKKyAgICB7ICAzMiwgMTEgfSwKKyAgICB7ICA4MCwgMzMgfSwKKyAgICB7ICAxOCwgMTEgfSwKKyAgICB7ICAxNSwgMTEgfSwKKyAgICB7ICA2NCwgMzMgfSwKKyAgICB7IDE2MCwgOTkgfSwKKyAgICB7ICAgMCwgIDEgfSwKKyAgICB7ICAgMCwgIDEgfQorfTsKKworLyogQml0UGxhbmUgSU1PREUgLSBzdWNoIGEgc21hbGwgdGFibGUuLi4gKi8KK2NvbnN0IHVpbnQ4X3QgZmZfdmMxX2ltb2RlX2NvZGVzWzddID0geworICAgIDAsIDIsIDEsIDMsIDEsIDIsIDMKK307Citjb25zdCB1aW50OF90IGZmX3ZjMV9pbW9kZV9iaXRzWzddID0geworICAgIDQsIDIsIDMsIDIsIDQsIDMsIDMKK307CisKKy8qIE5vcm1hbC0yIGltb2RlICovCitjb25zdCB1aW50OF90IGZmX3ZjMV9ub3JtMl9jb2Rlc1s0XSA9IHsKKyAgICAwLCA0LCA1LCAzCit9OworY29uc3QgdWludDhfdCBmZl92YzFfbm9ybTJfYml0c1s0XSA9IHsKKyAgICAxLCAzLCAzLCAyCit9OworCitjb25zdCB1aW50MTZfdCBmZl92YzFfbm9ybTZfY29kZXNbNjRdID0geworICAgIDB4MDAxLCAweDAwMiwgMHgwMDMsIDB4MDAwLCAweDAwNCwgMHgwMDEsIDB4MDAyLCAweDA0NywgMHgwMDUsIDB4MDAzLCAweDAwNCwgMHgwNEIsIDB4MDA1LCAweDA0RCwgMHgwNEUsIDB4MzBFLAorICAgIDB4MDA2LCAweDAwNiwgMHgwMDcsIDB4MDUzLCAweDAwOCwgMHgwNTUsIDB4MDU2LCAweDMwRCwgMHgwMDksIDB4MDU5LCAweDA1QSwgMHgzMEMsIDB4MDVDLCAweDMwQiwgMHgzMEEsIDB4MDM3LAorICAgIDB4MDA3LCAweDAwQSwgMHgwMEIsIDB4MDQzLCAweDAwQywgMHgwNDUsIDB4MDQ2LCAweDMwOSwgMHgwMEQsIDB4MDQ5LCAweDA0QSwgMHgzMDgsIDB4MDRDLCAweDMwNywgMHgzMDYsIDB4MDM2LAorICAgIDB4MDBFLCAweDA1MSwgMHgwNTIsIDB4MzA1LCAweDA1NCwgMHgzMDQsIDB4MzAzLCAweDAzNSwgMHgwNTgsIDB4MzAyLCAweDMwMSwgMHgwMzQsIDB4MzAwLCAweDAzMywgMHgwMzIsIDB4MDA3LAorfTsKKworY29uc3QgdWludDhfdCBmZl92YzFfbm9ybTZfYml0c1s2NF0gPSB7CisgICAgMSwgIDQsICA0LCAgOCwgIDQsICA4LCAgOCwgMTAsICA0LCAgOCwgIDgsIDEwLCAgOCwgMTAsIDEwLCAxMywKKyAgICA0LCAgOCwgIDgsIDEwLCAgOCwgMTAsIDEwLCAxMywgIDgsIDEwLCAxMCwgMTMsIDEwLCAxMywgMTMsICA5LAorICAgIDQsICA4LCAgOCwgMTAsICA4LCAxMCwgMTAsIDEzLCAgOCwgMTAsIDEwLCAxMywgMTAsIDEzLCAxMywgIDksCisgICAgOCwgMTAsIDEwLCAxMywgMTAsIDEzLCAxMywgIDksIDEwLCAxMywgMTMsICA5LCAxMywgIDksICA5LCAgNiwKK307CisKKy8qIDRNViBCbG9jayBwYXR0ZXJuIFZMQyB0YWJsZXMgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfdmMxXzRtdl9ibG9ja19wYXR0ZXJuX2NvZGVzWzRdWzE2XSA9IHsKKyAgICB7IDE0LCA1OCwgNTksIDI1LCAxMiwgMjYsIDE1LCAxNSwgMTMsIDI0LCAyNywgIDAsIDI4LCAgMSwgIDIsICAyIH0sCisgICAgeyAgOCwgMTgsIDE5LCAgNCwgMjAsICA1LCAzMCwgMTEsIDIxLCAzMSwgIDYsIDEyLCAgNywgMTMsIDE0LCAgMCB9LAorICAgIHsgMTUsICA2LCAgNywgIDIsICA4LCAgMywgMjgsICA5LCAxMCwgMjksICA0LCAxMSwgIDUsIDEyLCAxMywgIDAgfSwKKyAgICB7ICAwLCAxMSwgMTIsICA0LCAxMywgIDUsIDMwLCAxNiwgMTQsIDMxLCAgNiwgMTcsICA3LCAxOCwgMTksIDEwIH0KK307Citjb25zdCB1aW50OF90IGZmX3ZjMV80bXZfYmxvY2tfcGF0dGVybl9iaXRzWzRdWzE2XSA9IHsKKyAgICB7IDUsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDUsIDUsIDUsIDMsIDUsIDMsIDMsIDIgfSwKKyAgICB7IDQsIDUsIDUsIDQsIDUsIDQsIDUsIDQsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDIgfSwKKyAgICB7IDQsIDQsIDQsIDQsIDQsIDQsIDUsIDQsIDQsIDUsIDQsIDQsIDQsIDQsIDQsIDMgfSwKKyAgICB7IDIsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDUsIDQsIDUsIDQsIDUsIDUsIDQgfQorfTsKKworLyogMk1WIEJsb2NrIHBhdHRlcm4gVkxDIHRhYmxlcyAqLworY29uc3QgdWludDhfdCBmZl92YzFfMm12X2Jsb2NrX3BhdHRlcm5fY29kZXNbNF1bNF0gPSB7CisgICAgeyAyLCAxLCAwLCAzIH0sIHsgMSwgMCwgMiwgMyB9LCB7IDIsIDAsIDMsIDEgfSwgeyAxLCAzLCAyLCAwIH0KK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdmMxXzJtdl9ibG9ja19wYXR0ZXJuX2JpdHNbNF1bNF0gPSB7CisgICAgeyAyLCAyLCAyLCAyIH0sIHsgMSwgMiwgMywgMyB9LCB7IDMsIDIsIDMsIDEgfSwgeyAxLCAzLCAzLCAyIH0KK307CisKKy8qIEludGVybGFjZWQgZnJhbWUgcGljdHVyZSA0TVYgTUJNT0RFIFZMQyB0YWJsZXMgKHAuIDI0NiwgcC4gMzYwKSAqLworY29uc3QgdWludDE2X3QgZmZfdmMxX2ludGZyXzRtdl9tYm1vZGVfY29kZXNbNF1bMTVdID0geworICAgIHsgMjIsICAxNywgIDAsIDQ3LCAgMzIsIDEwLCAgMSwgIDMsIDY3LCAgMTMzLCAxMzIsICA5MiwgIDE5LCAgOTMsICAgMTggfSwKKyAgICB7ICAzLCAgNDUsICAwLCAgNywgIDIzLCAgNiwgIDEsICAyLCAxMCwgICAzOSwgIDQ0LCAgIDgsICAxOCwgIDc3LCAgIDc2IH0sCisgICAgeyAxNSwgICA2LCAyOCwgIDksICA0MSwgIDYsICAyLCAxNSwgMTQsICAgIDgsICA0MCwgIDI5LCAgIDAsICAyMSwgICAxMSB9LAorICAgIHsgIDcsIDE5OCwgIDEsICAyLCAxOTMsIDEzLCAyNSwgIDAsIDk3LCAxNTk5LCAgOTgsIDM5OCwgNzk4LCAxOTIsIDE1OTggfQorfTsKKworY29uc3QgdWludDhfdCBmZl92YzFfaW50ZnJfNG12X21ibW9kZV9iaXRzWzRdWzE1XSA9IHsKKyAgICB7IDUsIDUsIDIsIDYsIDYsIDQsIDIsIDIsIDcsICA4LCA4LCAgNywgIDUsIDcsICA1IH0sCisgICAgeyAzLCA2LCAzLCAzLCA1LCAzLCAzLCAzLCA0LCAgNiwgNiwgIDQsICA1LCA3LCAgNyB9LAorICAgIHsgNCwgMywgNSwgNSwgNywgNCwgMiwgNSwgNSwgIDUsIDcsICA1LCAgMiwgNiwgIDUgfSwKKyAgICB7IDQsIDksIDEsIDMsIDksIDUsIDYsIDIsIDgsIDEyLCA4LCAxMCwgMTEsIDksIDEyIH0KK307CisKKy8qIEludGVybGFjZWQgZnJhbWUgcGljdHVyZSBOT04tNE1WIE1CTU9ERSBWTEMgdGFibGVzIChwLiAzNjMpICovCitjb25zdCB1aW50OF90IGZmX3ZjMV9pbnRmcl9ub240bXZfbWJtb2RlX2NvZGVzWzRdWzldID0geworICAgIHsgIDksIDIyLCAgMCwgMTcsIDE2LCAxMCwgIDEsICAzLCAyMyB9LAorICAgIHsgIDcsICAwLCAgNSwgIDIsICAxLCAgMSwgIDYsICAzLCAgNCB9LAorICAgIHsgIDEsICAwLCAxMCwgMjMsIDQ0LCAgOCwgIDMsICA5LCA0NSB9LAorICAgIHsgIDcsIDk3LCAgMSwgIDIsIDQ5LCAxMywgMjUsICAwLCA5NiB9Cit9OworCitjb25zdCB1aW50OF90IGZmX3ZjMV9pbnRmcl9ub240bXZfbWJtb2RlX2JpdHNbNF1bOV0gPSB7CisgICAgeyAgNCwgIDUsICAyLCAgNSwgIDUsICA0LCAgMiwgIDIsICA1IH0sCisgICAgeyAgMywgIDQsICA2LCAgMiwgIDMsICAyLCAgMywgIDUsICA2IH0sCisgICAgeyAgMiwgIDIsICA0LCAgNSwgIDYsICA0LCAgMiwgIDQsICA2IH0sCisgICAgeyAgNCwgIDgsICAxLCAgMywgIDcsICA1LCAgNiwgIDIsICA4IH0KK307CisKKy8qIEludGVybGFjZWQgZmllbGQgcGljdHVyZSBNQk1PREUgVkxDIHRhYmxlcyAocC4gMzU2IC0gMTEuNC4xLCAxMS40LjIpICovCisvKiBtaXhlZC1NViAqLworY29uc3QgdWludDhfdCBmZl92YzFfaWZfbW12X21ibW9kZV9jb2Rlc1s4XVs4XSA9IHsKKyAgICB7IDE2LCAxNywgIDMsICAzLCAgMCwgIDUsICA5LCAgMiB9LAorICAgIHsgIDgsICA5LCAgMywgIDYsICA3LCAgMCwgIDUsICAyIH0sCisgICAgeyAxNiwgMTcsICA1LCAgMywgIDAsICAzLCAgOSwgIDIgfSwKKyAgICB7IDU2LCA1NywgMTUsICA0LCAgNSwgIDYsIDI5LCAgMCB9LAorICAgIHsgNTIsIDUzLCAyNywgMTQsIDE1LCAgMiwgMTIsICAwIH0sCisgICAgeyA1NiwgNTcsIDI5LCAgNSwgIDYsICAwLCAxNSwgIDQgfSwKKyAgICB7IDE2LCAxNywgIDYsICA3LCAgMCwgIDEsICA5LCAgNSB9LAorICAgIHsgNTYsIDU3LCAgMCwgIDUsICA2LCAyOSwgIDQsIDE1IH0KK307Citjb25zdCB1aW50OF90IGZmX3ZjMV9pZl9tbXZfbWJtb2RlX2JpdHNbOF1bOF0gPSB7CisgICAgeyA2LCA2LCAyLCAzLCAyLCA0LCA1LCAyIH0sCisgICAgeyA1LCA1LCAzLCAzLCAzLCAyLCA0LCAyIH0sCisgICAgeyA2LCA2LCA0LCAzLCAyLCAyLCA1LCAyIH0sCisgICAgeyA2LCA2LCA0LCAzLCAzLCAzLCA1LCAxIH0sCisgICAgeyA2LCA2LCA1LCA0LCA0LCAyLCA0LCAxIH0sCisgICAgeyA2LCA2LCA1LCAzLCAzLCAxLCA0LCAzIH0sCisgICAgeyA1LCA1LCAzLCAzLCAyLCAyLCA0LCAzIH0sCisgICAgeyA2LCA2LCAxLCAzLCAzLCA1LCAzLCA0IH0KK307CisvKiAxTVYgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfdmMxX2lmXzFtdl9tYm1vZGVfY29kZXNbOF1bNl0gPSB7CisgICAgeyAgMCwgIDEsICAxLCAgMSwgIDEsICAxIH0sCisgICAgeyAgMCwgIDEsICAxLCAgMSwgIDEsICAxIH0sCisgICAgeyAxNiwgMTcsICAzLCAgMCwgIDksICA1IH0sCisgICAgeyAyMCwgMjEsICAzLCAxMSwgIDAsICA0IH0sCisgICAgeyAgNCwgIDUsICAyLCAgMywgIDMsICAwIH0sCisgICAgeyAgNCwgIDUsICAzLCAgMiwgIDAsICAzIH0sCisgICAgeyAgMCwgIDEsICAxLCAgMSwgIDEsICAxIH0sCisgICAgeyAxNiwgMTcsICA5LCAgNSwgIDMsICAwIH0KK307Citjb25zdCB1aW50OF90IGZmX3ZjMV9pZl8xbXZfbWJtb2RlX2JpdHNbOF1bNl0gPSB7CisgICAgeyA1LCA1LCAxLCAzLCAyLCA0IH0sCisgICAgeyA1LCA1LCAxLCAyLCAzLCA0IH0sCisgICAgeyA1LCA1LCAyLCAxLCA0LCAzIH0sCisgICAgeyA1LCA1LCAyLCA0LCAxLCAzIH0sCisgICAgeyA0LCA0LCAyLCAzLCAyLCAyIH0sCisgICAgeyA0LCA0LCAzLCAyLCAyLCAyIH0sCisgICAgeyA1LCA1LCAzLCA0LCAxLCAyIH0sCisgICAgeyA1LCA1LCA0LCAzLCAyLCAxIH0KK307CisKKy8qIEludGVybGFjZWQgZnJhbWUvZmllbGQgcGljdHVyZSBNVkRBVEEgVkxDIHRhYmxlcyAqLworCisvKiAxLXJlZmVyZW5jZSB0YWJsZXMgKi8KK2NvbnN0IHVpbnQzMl90IGZmX3ZjMV8xcmVmX212ZGF0YV9jb2Rlc1s0XVs3Ml0gPSB7IC8qIHVpbnQzMl90IG1heSBiZSB0b28gYmlnICovCisgIHsKKyAgICAweDAwMDA1LCAweDAwMDBDLCAweDAwMDFFLCAweDAwMDEyLCAweDAwMDBDLCAweDAwMDM0LCAweDAwMDc1LCAweDAwMDcwLAorICAgIDB4MDAwMDAsIDB4MDAwMDgsIDB4MDAwMUIsIDB4MDAwMDgsIDB4MDAwMUQsIDB4MDAwN0MsIDB4MDAwRDYsIDB4MDAxREUsCisgICAgMHgwMDFBRiwgMHgwMDAwNSwgMHgwMDAxQiwgMHgwMDAyNiwgMHgwMDAxRSwgMHgwMDAxMiwgMHgwMDA3NiwgMHgwMDA0RCwKKyAgICAweDAwMUY2LCAweDAwMUY0LCAweDAwMDM5LCAweDAwMDdGLCAweDAwMDI3LCAweDAwMDZBLCAweDAwMDcxLCAweDAwMDM1LAorICAgIDB4MDAwNzEsIDB4MDAwNjgsIDB4MDAxREMsIDB4MDAwMjcsIDB4MDAwNzMsIDB4MDAwRkYsIDB4MDAwRTgsIDB4MDAwRTksCisgICAgMHgwMDA3RSwgMHgwMDFGOSwgMHgwMDFGNSwgMHgwMDFGRCwgMHgwMDAzRSwgMHgwMDFDQSwgMHgwMDNGOSwgMHgwMDA0QywKKyAgICAweDAwMDY5LCAweDAwMUZBLCAweDAwMURGLCAweDAwMUY3LCAweDAwMDcwLCAweDAwMURELCAweDAwRTRELCAweDAwNzI3LAorICAgIDB4MDAzOTIsIDB4MDAxQzgsIDB4MDAxQ0IsIDB4MDAzRjgsIDB4MDAxQUUsIDB4MDAxRjgsIDB4MDAxRkIsIDB4MEU0Q0UsCisgICAgMHgwRTRDRiwgMHgwNzI2MCwgMHgwNzI2MSwgMHgwNzI2MiwgMHgwNzI2MywgMHgwNzI2NCwgMHgwNzI2NSwgMHgwNzI2NgorICB9LAorICB7CisgICAgMHgwMDAwNywgMHgwMDAwMSwgMHgwMDAwNywgMHgwMDAxNiwgMHgwMDAwMSwgMHgwMDA0NSwgMHgwMDAxOCwgMHgwMDJCNiwKKyAgICAweDAwMDA2LCAweDAwMDA0LCAweDAwMDE3LCAweDAwMDEwLCAweDAwMDI5LCAweDAwMDJDLCAweDAwMTVBLCAweDAwMDY2LAorICAgIDB4MDAxOUUsIDB4MDAwMDksIDB4MDAwMjgsIDB4MDAwMTcsIDB4MDAwMDAsIDB4MDAwMkEsIDB4MDAwMDQsIDB4MDAwNUIsCisgICAgMHgwMDBCNSwgMHgwMDBDRSwgMHgwMDAwNiwgMHgwMDA0NCwgMHgwMDAwRiwgMHgwMDA0NiwgMHgwMDAwRSwgMHgwMDBBQywKKyAgICAweDAwMDMyLCAweDAwMDM3LCAweDAxMUVCLCAweDAwMDBBLCAweDAwMDFBLCAweDAwMTFGLCAweDAwMDE2LCAweDAwMDE0LAorICAgIDB4MDAwMkIsIDB4MDAxNjgsIDB4MDAwNTUsIDB4MDIzRDUsIDB4MDAwNTcsIDB4MDAwMkYsIDB4MDAwMzYsIDB4MDAwMkUsCisgICAgMHgwMDE2OSwgMHgwMDA1NCwgMHgwMDQ3QiwgMHgwMDE5RiwgMHgwMkI3RCwgMHgwMDA4RSwgMHgwMEFERSwgMHgwMDQ3OSwKKyAgICAweDAwNTZFLCAweDAwOEY0LCAweDAxNUJGLCAweDAwNDc4LCAweDAyM0Q0LCAweDBBREYxLCAweDA1NkY5LCAweEFERjBFLAorICAgIDB4QURGMEYsIDB4NTZGODAsIDB4NTZGODEsIDB4NTZGODIsIDB4NTZGODMsIDB4NTZGODQsIDB4NTZGODUsIDB4NTZGODYKKyAgfSwKKyAgeworICAgIDB4MDAwMDIsIDB4MDAwMDYsIDB4MDAwMDcsIDB4MDAwMEQsIDB4MDAwMDcsIDB4MDAwMzAsIDB4MDAwRkYsIDB4MDAxRjAsCisgICAgMHgwMDAwMiwgMHgwMDAwMCwgMHgwMDAwNSwgMHgwMDAxOSwgMHgwMDAxRSwgMHgwMDAwNywgMHgwMDA2MywgMHgwMDBGRCwKKyAgICAweDAwMDIzLCAweDAwMDBFLCAweDAwMDFCLCAweDAwMDFBLCAweDAwMDA2LCAweDAwMDA5LCAweDAwMDE4LCAweDAwMEM1LAorICAgIDB4MDAwMzMsIDB4MDAxRjEsIDB4MDAwMDIsIDB4MDAzRkIsIDB4MDAxRjMsIDB4MDAwMjIsIDB4MDAxRkMsIDB4MDAwNDIsCisgICAgMHgwMDYyMywgMHgwMDA4MywgMHgwMDYyMCwgMHgwMDA3RCwgMHgwMDA0MCwgMHgwMDA0MywgMHgwMDNFNCwgMHgwMDNFNSwKKyAgICAweDAwMTkxLCAweDAwRkU5LCAweDAwMTA1LCAweDAwMjA4LCAweDAwMEZDLCAweDAwNjI0LCAweDAwNjIyLCAweDAwMTkwLAorICAgIDB4MDA2MjYsIDB4MDA3RjUsIDB4MDBDNEIsIDB4MDFGRDAsIDB4MDEwNEQsIDB4MDAwNjUsIDB4MDBDNDIsIDB4MDAwQzksCisgICAgMHgwMDYyNywgMHgwMEM0MywgMHgwMEM0QSwgMHgwMTA0RSwgMHgwMUZEMSwgMHgwMTA0RiwgMHgwMDQxMiwgMHgxMDRDRSwKKyAgICAweDEwNENGLCAweDA4MjYwLCAweDA4MjYxLCAweDA4MjYyLCAweDA4MjYzLCAweDA4MjY0LCAweDA4MjY1LCAweDA4MjY2CisgIH0sCisgIHsKKyAgICAweDAwMDBELCAweDAwMDAxLCAweDAwMDA0LCAweDAwMDAwLCAweDAwMDE3LCAweDAwMDA1LCAweDAwMDdGLCAweDAwMDRELAorICAgIDB4MDAwMDMsIDB4MDAwMTEsIDB4MDAwM0UsIDB4MDAwM0IsIDB4MDAwMTcsIDB4MDAwNjcsIDB4MDAwNEEsIDB4MDAwQzMsCisgICAgMHgwMDBGMiwgMHgwMDAwQSwgMHgwMDAyQywgMHgwMDAzMiwgMHgwMDAzRCwgMHgwMDAxNSwgMHgwMDAyOCwgMHgwMDA5MywKKyAgICAweDAwMENDLCAweDAwMDk2LCAweDAwMDAzLCAweDAwMDc1LCAweDAwMDIwLCAweDAwMDJELCAweDAwMDIxLCAweDAwMDI5LAorICAgIDB4MDAwOTAsIDB4MDAxRDAsIDB4MDAxRkIsIDB4MDAwMUMsIDB4MDAwNEMsIDB4MDAwNjAsIDB4MDAwMDksIDB4MDAwMDgsCisgICAgMHgwMDAyRCwgMHgwMDA5RiwgMHgwMDFGQSwgMHgwMDEzRCwgMHgwMDAzMSwgMHgwMDBGQywgMHgwMDA1OCwgMHgwMDA5MiwKKyAgICAweDAwMEYwLCAweDAwMEYxLCAweDAwMENELCAweDAwMTg1LCAweDAwMTY1LCAweDAwMDRFLCAweDAwMDkxLCAweDAwMEU5LAorICAgIDB4MDAxODQsIDB4MDAxRDEsIDB4MDAxRTYsIDB4MDAwOTcsIDB4MDAxRTcsIDB4MDAwQjMsIDB4MDAxM0MsIDB4MDE2NEUsCisgICAgMHgwMTY0RiwgMHgwMEIyMCwgMHgwMEIyMSwgMHgwMEIyMiwgMHgwMEIyMywgMHgwMEIyNCwgMHgwMEIyNSwgMHgwMEIyNgorICB9Cit9OworCitjb25zdCB1aW50OF90IGZmX3ZjMV8xcmVmX212ZGF0YV9iaXRzWzRdWzcyXSA9IHsKKyAgeworICAgICAzLCAgNCwgIDUsICA1LCAgNSwgIDYsICA3LCAgNywgIDIsICA0LCAgNSwgIDUsICA2LCAgNywgIDgsICA5LCAgOSwgIDQsCisgICAgIDYsICA2LCAgNiwgIDYsICA3LCAgOCwgIDksICA5LCAgNiwgIDgsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA5LCAgNiwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA3LCAxMCwgMTAsICA4LCAgOCwgIDksICA5LCAgOSwgIDgsICA5LAorICAgIDEzLCAxMiwgMTEsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksIDE3LCAxNywgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKKyAgfSwKKyAgeworICAgICAzLCAgMywgIDQsICA1LCAgNSwgIDcsICA4LCAxMCwgIDMsICA0LCAgNSwgIDUsICA2LCAgNywgIDksIDEwLCAxMiwgIDQsCisgICAgIDYsICA2LCAgNSwgIDYsICA2LCAgOCwgIDksIDExLCAgNCwgIDcsICA3LCAgNywgIDcsICA4LCAgOSwgIDksIDEzLCAgNSwKKyAgICAgOCwgIDksICA4LCAgOCwgIDksIDEwLCAxMCwgMTQsICA3LCAgOSwgIDksICA5LCAxMCwgMTAsIDExLCAxMiwgMTQsICA4LAorICAgIDEyLCAxMSwgMTEsIDEyLCAxMywgMTEsIDE0LCAxNiwgMTUsIDIwLCAyMCwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTkKKyAgfSwKKyAgeworICAgICAzLCAgNCwgIDQsICA0LCAgNSwgIDYsICA4LCAgOSwgIDIsICA0LCAgNSwgIDUsICA1LCAgNiwgIDcsICA4LCAgOCwgIDQsCisgICAgIDcsICA3LCAgNiwgIDYsICA3LCAgOCwgIDgsICA5LCAgNSwgMTAsICA5LCAgOCwgIDksICA5LCAxMSwgMTAsIDExLCAgNywKKyAgICAgOSwgIDksIDEwLCAxMCwgMTEsIDEyLCAxMSwgMTIsICA4LCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMywgMTUsICA5LAorICAgIDEyLCAxMCwgMTEsIDEyLCAxMiwgMTUsIDEzLCAxNSwgMTMsIDE5LCAxOSwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgKKyAgfSwKKyAgeworICAgICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA3LCAgNywgIDMsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDQsCisgICAgIDYsICA2LCAgNiwgIDYsICA3LCAgOCwgIDgsICA4LCAgNCwgIDcsICA2LCAgNiwgIDYsICA3LCAgOCwgIDksICA5LCAgNSwKKyAgICAgNywgIDcsICA2LCAgNiwgIDcsICA4LCAgOSwgIDksICA2LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgMTAsICA3LAorICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDgsICA5LCAgOSwgIDksIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMKKyAgfQorfTsKKworLyogMi1yZWZlcmVuY2UgdGFibGVzICovCitjb25zdCB1aW50MzJfdCBmZl92YzFfMnJlZl9tdmRhdGFfY29kZXNbOF1bMTI2XSA9IHsgLyogdGFibGUgMTMyIC0gdGFibGUgMTM5ICovCisgIHsKKyAgICAweDAwMDBDLCAweDAwMDFDLCAweDAwMDBCLCAweDAwMDAwLCAweDAwMDBFLCAweDAwMDJBLCAweDAwMDUwLCAweDAwMzY4LAorICAgIDB4MDAwMDIsIDB4MDAwMUEsIDB4MDAwMDQsIDB4MDAwM0EsIDB4MDAwMUQsIDB4MDAwNkMsIDB4MDAwRUYsIDB4MDAxQkMsCisgICAgMHgwMDE1RiwgMHgwMDAwRiwgMHgwMDAwMywgMHgwMDAxQywgMHgwMDAwRCwgMHgwMDAwQiwgMHgwMDAzRSwgMHgwMDBBNywKKyAgICAweDAwMTQ2LCAweDAwMTk5LCAweDAwMDA2LCAweDAwMDFGLCAweDAwMDA0LCAweDAwMDNDLCAweDAwMDA3LCAweDAwMUJFLAorICAgIDB4MDAwOEIsIDB4MDAwMkMsIDB4MDA3QjMsIDB4MDAwMDUsIDB4MDAwREIsIDB4MDAwNTYsIDB4MDAwRUMsIDB4MDAwNTIsCisgICAgMHgwMDFCRCwgMHgwMDA3OCwgMHgwMDBDRiwgMHgwMDU3MywgMHgwMDAwOSwgMHgwMDAyMywgMHgwMDBFRCwgMHgwMDAxOCwKKyAgICAweDAwMDA2LCAweDAwMDQ0LCAweDAwMEY1LCAweDAwMDc5LCAweDAwNkQyLCAweDAwMDZFLCAweDAwMDJCLCAweDAwMTVELAorICAgIDB4MDAwMTcsIDB4MDAzN0YsIDB4MDAxNDQsIDB4MDAwQ0UsIDB4MDAwMjgsIDB4MDAwQUIsIDB4MDAwMTAsIDB4MDAxQjUsCisgICAgMHgwMDBGNywgMHgwMDBBNiwgMHgwMDA3QiwgMHgwMDAyOCwgMHgwMDFFRCwgMHgwMDFFOSwgMHgwMDZGRCwgMHgwMDAwNCwKKyAgICAweDAwMEY1LCAweDAwMDI5LCAweDAwMjhBLCAweDAwMjhCLCAweDAwMjhGLCAweDAwREY5LCAweDAwMzM1LCAweDAxRTg1LAorICAgIDB4MDAwRUUsIDB4MDAyQkQsIDB4MDAwMkIsIDB4MDAzRDgsIDB4MDAzRDEsIDB4MDAxOTgsIDB4MDAxRTksIDB4MDA1MUQsCisgICAgMHgwMDBCNCwgMHgwMDAzRiwgMHgwMDQ1NSwgMHgwMDIyQiwgMHgwMDIyOSwgMHgwMDQ1MSwgMHgwMDU3OCwgMHgwMDdCMiwKKyAgICAweDAwNTcwLCAweDAwMTU1LCAweDAwMDMyLCAweDAwM0QwLCAweDAwMDU0LCAweDAwNkQzLCAweDAwNTcxLCAweDAwNDU0LAorICAgIDB4MDAzMzQsIDB4MDFCRjEsIDB4MDAwQjcsIDB4MDAwMjksIDB4MDFFODQsIDB4MDAxNkMsIDB4MDAxOUIsIDB4MDFCRjAsCisgICAgMHgwMDU3OSwgMHgwMEY0MywgMHgwMDBCNSwgMHgwMDhBMSwgMHgwMDAyQSwgMHgwMDE2RCwgMHgwMDhBMCwgMHgwMDdBMCwKKyAgICAweDAwM0QxLCAweDAwQUU1LCAweDAwMTU0LCAweDAwQUU0LCAweDAwQTM5LCAweDAwQTM4CisgIH0sCisgIHsKKyAgICAweDAwMDAzLCAweDAwMDA5LCAweDAwMDE2LCAweDAwMDEwLCAweDAwMEQ3LCAweDAwMzM1LCAweDAwNTc0LCAweDAwNTU1LAorICAgIDB4MDAwMDAsIDB4MDAwMUQsIDB4MDAwMDksIDB4MDAwMTcsIDB4MDAwMkMsIDB4MDAwQUQsIDB4MDAzNzQsIDB4MDA2QjMsCisgICAgMHgwMDU3NywgMHgwMDAwRiwgMHgwMDAxOCwgMHgwMDAwQSwgMHgwMDAyRSwgMHgwMDAyMiwgMHgwMDE3QywgMHgwMEU3QiwKKyAgICAweDAxQjg5LCAweDAxNUQ4LCAweDAwMDA4LCAweDAwMDM0LCAweDAwMDZELCAweDAwMDIzLCAweDAwMUMyLCAweDAwMzc2LAorICAgIDB4MDAyRDMsIDB4MDFDNEEsIDB4MDMzMEEsIDB4MDAwMTQsIDB4MDAwNkEsIDB4MDAwNzIsIDB4MDAwNkMsIDB4MDAwRTMsCisgICAgMHgwMDE5QiwgMHgwMDczRiwgMHgwMUNGMCwgMHgwMEI0MSwgMHgwMDAzMiwgMHgwMDBFNiwgMHgwMDBFMCwgMHgwMDBDRiwKKyAgICAweDAwMEFCLCAweDAwMTlDLCAweDAwMkFCLCAweDAwRTJCLCAweDAxNUQ5LCAweDAwMDZGLCAweDAwMUMzLCAweDAwMEFGLAorICAgIDB4MDAwQkYsIDB4MDAwQUMsIDB4MDAxN0QsIDB4MDA2RTMsIDB4MDBFMjksIDB4MDE5ODQsIDB4MDAwNTQsIDB4MDAwQjUsCisgICAgMHgwMDE3QSwgMHgwMDFBRCwgMHgwMDE5OSwgMHgwMDE3OCwgMHgwMDM1OCwgMHgwMDJEMiwgMHgwMUM0QiwgMHgwMDA1QiwKKyAgICAweDAwMkE4LCAweDAwMzMxLCAweDAwMzg4LCAweDAwMzhCLCAweDAwMzcwLCAweDAwNzEzLCAweDAwQ0MzLCAweDAxQ0YxLAorICAgIDB4MDAxQjksIDB4MDA1RUYsIDB4MDA3MzgsIDB4MDAyRjIsIDB4MDAzM0IsIDB4MDAyQjksIDB4MDA2RUIsIDB4MDA1NzAsCisgICAgMHgwMEUyNCwgMHgwMDM5RCwgMHgwMDVBMiwgMHgwMDVBMywgMHgwMEU3RCwgMHgwMDVFRSwgMHgwMDczOSwgMHgwMDU1NCwKKyAgICAweDAwQUE1LCAweDAwQUE0LCAweDAwMzc3LCAweDAxQ0Y1LCAweDAwQkNFLCAweDAwRTc5LCAweDAwNjYwLCAweDAwNjc0LAorICAgIDB4MDA2RUEsIDB4MDBFN0MsIDB4MDBENjUsIDB4MDAyRjYsIDB4MDE1REEsIDB4MDFCODgsIDB4MDA1QTEsIDB4MDFDRjQsCisgICAgMHgwMDVFNiwgMHgwMEUyOCwgMHgwMDU3NSwgMHgwMEQ2NCwgMHgwMDMzNCwgMHgwMzMwQiwgMHgwMTVEQiwgMHgwMEI0MCwKKyAgICAweDAwQkNGLCAweDAwREM1LCAweDAwRTJBLCAweDAwNjc1LCAweDAwNTcxLCAweDAwNTUzCisgIH0sCisgIHsKKyAgICAweDAwMDA0LCAweDAwMDAyLCAweDAwMDEwLCAweDAwMDAzLCAweDAwMDE3LCAweDAwMDQ1LCAweDAwMDNFLCAweDAwMDdFLAorICAgIDB4MDAwMDMsIDB4MDAwMDIsIDB4MDAwMjgsIDB4MDAwMUUsIDB4MDAwMTUsIDB4MDAwNDcsIDB4MDAwMDIsIDB4MDAxNEQsCisgICAgMHgwMDA2MCwgMHgwMDAwQiwgMHgwMDAyNiwgMHgwMDAyNCwgMHgwMDAxNCwgMHgwMDAzMiwgMHgwMDA2RiwgMHgwMDBDMywKKyAgICAweDAwNTMxLCAweDAwNkU1LCAweDAwMDE1LCAweDAwMDNGLCAweDAwMDJELCAweDAwMDAxLCAweDAwMTNFLCAweDAwMERELAorICAgIDB4MDAwRjYsIDB4MDAzMDUsIDB4MDAzMzEsIDB4MDAwMEUsIDB4MDAwMDMsIDB4MDAwMzQsIDB4MDAwMzMsIDB4MDAwMUEsCisgICAgMHgwMDE0QSwgMHgwMDBDNSwgMHgwMDBGNCwgMHgwMDZFNCwgMHgwMDAwMSwgMHgwMDAzQywgMHgwMDA3RCwgMHgwMDA4RCwKKyAgICAweDAwMDlELCAweDAwMDMxLCAweDAwMDZFLCAweDAwMjk2LCAweDAwMENELCAweDAwMDI1LCAweDAwMTQ5LCAweDAwMDMyLAorICAgIDB4MDAwODksIDB4MDAwMzYsIDB4MDAwODgsIDB4MDAwNkYsIDB4MDAwMDMsIDB4MDAzMUQsIDB4MDAwMEUsIDB4MDAxQUEsCisgICAgMHgwMDI3RSwgMHgwMDA2MSwgMHgwMDE0RSwgMHgwMDE0RiwgMHgwMDA2NywgMHgwMDBGRiwgMHgwMDE4MywgMHgwMDAzNiwKKyAgICAweDAwMzU3LCAweDAwMEY1LCAweDAwMEM2LCAweDAwMEMyLCAweDAwMjk5LCAweDAwMTE5LCAweDAwMjMxLCAweDAwMzUwLAorICAgIDB4MDAwMkMsIDB4MDAxOEYsIDB4MDA1MzAsIDB4MDAyOTcsIDB4MDAwMDQsIDB4MDAxQjgsIDB4MDAwQzAsIDB4MDAyN0EsCisgICAgMHgwMDMxMSwgMHgwMDA5QywgMHgwMDYyMSwgMHgwMDE5OSwgMHgwMDMxQywgMHgwMDBGNywgMHgwMDNFMywgMHgwMDM1NiwKKyAgICAweDAwMTg5LCAweDAwMDA1LCAweDAwMDZCLCAweDAwOEMyLCAweDAwMzMwLCAweDAwNEZGLCAweDAwNEYwLCAweDAwMzUxLAorICAgIDB4MDA0RjIsIDB4MDAxRjIsIDB4MDAzNzMsIDB4MDAwMDAsIDB4MDBDNDEsIDB4MDA4QzMsIDB4MDA5RUMsIDB4MDAzRTIsCisgICAgMHgwMDMwNCwgMHgwMDRGNywgMHgwMDRGMSwgMHgwMDFGMCwgMHgwMDE0OCwgMHgwMEM0MCwgMHgwMDlFRCwgMHgwMDhDMCwKKyAgICAweDAwOEMxLCAweDAwNEYzLCAweDAwNEZFLCAweDAwMEZFLCAweDAwMUYzLCAweDAwMUE5CisgIH0sCisgIHsKKyAgICAweDAwMDAwLCAweDAwMDA0LCAweDAwMDJGLCAweDAwMDUyLCAweDAwMDEwLCAweDAwMEFELCAweDAwNTBCLCAweDAwMTkwLAorICAgIDB4MDAwMDMsIDB4MDAwMTYsIDB4MDAwMDcsIDB4MDAwMEQsIDB4MDAwQkIsIDB4MDAxNzMsIDB4MDAwQzksIDB4MDA1MEYsCisgICAgMHgwMTcyQywgMHgwMDAwMywgMHgwMDAxMSwgMHgwMDAwNSwgMHgwMDA0MywgMHgwMDAyMywgMHgwMDA0QiwgMHgwMDMyRSwKKyAgICAweDAyRTVCLCAweDAwNDgyLCAweDAwMDA5LCAweDAwMDJBLCAweDAwMDE0LCAweDAwMDJBLCAweDAwMTA4LCAweDAwNUNBLAorICAgIDB4MDA2NUEsIDB4MDIxMzYsIDB4MDIxMzIsIDB4MDAwMEIsIDB4MDAwMTMsIDB4MDAwNDEsIDB4MDAwQjgsIDB4MDAxNzQsCisgICAgMHgwMDEwMCwgMHgwMTREQSwgMHgwNDA0RSwgMHgwMTQzNywgMHgwMDAyQiwgMHgwMDA4NSwgMHgwMDBBNywgMHgwMDBBMCwKKyAgICAweDAwMTRDLCAweDAwMjlBLCAweDAwMzJDLCAweDAyMTMzLCAweDAxNDJBLCAweDAwMDUxLCAweDAwMjg0LCAweDAwMEFDLAorICAgIDB4MDAxMDIsIDB4MDAwNDUsIDB4MDAwNDQsIDB4MDA4MUIsIDB4MDA2NUUsIDB4MDBDQjcsIDB4MDAwMTgsIDB4MDA1MEMsCisgICAgMHgwMDIxMiwgMHgwMDJFNCwgMHgwMDIwMywgMHgwMDA5NCwgMHgwMDEyMiwgMHgwMDgxQSwgMHgwMDY1NSwgMHgwMDAzMywKKyAgICAweDAwMkJBLCAweDAwMjQ2LCAweDAwMjQyLCAweDAwQTZFLCAweDAwNDBDLCAweDAwODA4LCAweDAyMTM0LCAweDA0MDRGLAorICAgIDB4MDAxNzUsIDB4MDA0MDUsIDB4MDAyNDcsIDB4MDAxMkEsIDB4MDBBMTQsIDB4MDAyQkIsIDB4MDAxOTEsIDB4MDA4NEYsCisgICAgMHgwMTQzOCwgMHgwMDBBRiwgMHgwMEI5NywgMHgwMDQ4MywgMHgwMTQzQiwgMHgwMDMyQiwgMHgwMDI0MywgMHgwMTQyQiwKKyAgICAweDAwOTU4LCAweDAyOUJGLCAweDAwMDQ5LCAweDAwQTZDLCAweDAxNERCLCAweDAwNEFELCAweDAxNERFLCAweDAwODRFLAorICAgIDB4MDE0MzQsIDB4MDAyNTcsIDB4MDJFNUEsIDB4MDAyMDcsIDB4MDE0MzUsIDB4MDE0MzksIDB4MDBDQjYsIDB4MDE0M0EsCisgICAgMHgwMDE5NCwgMHgwMDY1NCwgMHgwMjEzNSwgMHgwNTM3QywgMHgwMDE1QywgMHgwMDI0MCwgMHgwMTAxMiwgMHgwNTM3RCwKKyAgICAweDAwOTU5LCAweDAxMDk4LCAweDAxNDM2LCAweDAwNjVGLCAweDAyMDI2LCAweDAyMTM3CisgIH0sCisgIHsKKyAgICAweDAwMDA1LCAweDAwMDE5LCAweDAwMDE2LCAweDAwMDExLCAweDAwMDNFLCAweDAwMDVFLCAweDAwMEVGLCAweDAwMEUyLAorICAgIDB4MDAwMDAsIDB4MDAwMzksIDB4MDAwMkIsIDB4MDAwMjYsIDB4MDAwMjgsIDB4MDAwMTIsIDB4MDAwQzIsIDB4MDAwRUQsCisgICAgMHgwMDExRCwgMHgwMDAwRCwgMHgwMDAzMSwgMHgwMDAyQSwgMHgwMDAyNSwgMHgwMDAyMCwgMHgwMDA1QywgMHgwMDFFRCwKKyAgICAweDAwMjRELCAweDAwNzcwLCAweDAwMDA2LCAweDAwMDdBLCAweDAwMDYwLCAweDAwMDRGLCAweDAwMDQ4LCAweDAwMDM5LAorICAgIDB4MDAxODYsIDB4MDAyMTMsIDB4MDBFQzYsIDB4MDAwMEYsIDB4MDAwMjYsIDB4MDAwNUYsIDB4MDAwNzUsIDB4MDAwNzAsCisgICAgMHgwMDAyNywgMHgwMDFEQiwgMHgwMDNDNiwgMHgwMDc4RiwgMHgwMDAzRiwgMHgwMDBBNiwgMHgwMDBGMCwgMHgwMDAzQSwKKyAgICAweDAwMDUyLCAweDAwMDRFLCAweDAwMEUzLCAweDAwMUQ5LCAweDAwMzBGLCAweDAwMDEwLCAweDAwMURELCAweDAwMEE3LAorICAgIDB4MDAwRjcsIDB4MDAwMjIsIDB4MDAwOTIsIDB4MDAzQzQsIDB4MDAyRUYsIDB4MDA3NjIsIDB4MDAwNzksIDB4MDAwOEYsCisgICAgMHgwMDFEQSwgMHgwMDA4NywgMHgwMDBFOCwgMHgwMDBCQSwgMHgwMDE3NiwgMHgwMDBFRSwgMHgwMDNCMCwgMHgwMDA4NSwKKyAgICAweDAwMTE5LCAweDAwMzBFLCAweDAwMTA4LCAweDAwMUQyLCAweDAwMTBDLCAweDAwNzczLCAweDAwNDI0LCAweDAwNDM0LAorICAgIDB4MDAwNzEsIDB4MDA1REQsIDB4MDAxQzEsIDB4MDAzQTcsIDB4MDAxMjcsIDB4MDAwOEQsIDB4MDAyMUIsIDB4MDA3QjIsCisgICAgMHgwMDFERiwgMHgwMDNEOCwgMHgwMDc2NCwgMHgwMEVFNCwgMHgwMDNCMywgMHgwMDc0RCwgMHgwMDFEOCwgMHgwMDVEQywKKyAgICAweDAwODRBLCAweDAwNDk5LCAweDAwM0M1LCAweDAxRDhFLCAweDAwNzY1LCAweDAwNDM1LCAweDAwNzcxLCAweDAwMUMyLAorICAgIDB4MDAxMTgsIDB4MDAzQkMsIDB4MDAzODEsIDB4MDAzODcsIDB4MDdCMzMsIDB4MDEwOTcsIDB4MDEwOTYsIDB4MDFFQ0QsCisgICAgMHgwMEU5OSwgMHgwMEYxQywgMHgwMEYxRCwgMHgwMEVFNSwgMHgwMDExQywgMHgwN0IzMiwgMHgwM0Q5OCwgMHgwMUQ4RiwKKyAgICAweDAwRTk4LCAweDAwRjY3LCAweDAwM0JELCAweDAwMzgwLCAweDAwNDk4LCAweDAwMzg2CisgIH0sCisgIHsKKyAgICAweDAwMDBELCAweDAwMDEwLCAweDAwMDJFLCAweDAwMDM5LCAweDAwMDBELCAweDAwMDc0LCAweDAwMEVELCAweDAwMEI2LAorICAgIDB4MDAwMDEsIDB4MDAwMDIsIDB4MDAwMDAsIDB4MDAwMzAsIDB4MDAwMjksIDB4MDAwNzAsIDB4MDAwRjMsIDB4MDAwOEMsCisgICAgMHgwMDE2NiwgMHgwMDAwOSwgMHgwMDAzMywgMHgwMDA3OCwgMHgwMDAwNiwgMHgwMDBDNCwgMHgwMDAwQiwgMHgwMDE2MywKKyAgICAweDAwMENDLCAweDAwNUJFLCAweDAwMDFGLCAweDAwMDJGLCAweDAwMDY0LCAweDAwMDE4LCAweDAwMEM2LCAweDAwMDBBLAorICAgIDB4MDAxNjIsIDB4MDAyQzAsIDB4MDBFRjMsIDB4MDAwMDcsIDB4MDAwMEYsIDB4MDAwRTMsIDB4MDAwQ0EsIDB4MDAwQjIsCisgICAgMHgwMDE4RiwgMHgwMDNBRSwgMHgwMDc1RiwgMHgwMEM1MSwgMHgwMDAxNSwgMHgwMDA0NywgMHgwMDBFRSwgMHgwMDBFMiwKKyAgICAweDAwMEVBLCAweDAwMDA5LCAweDAwMTZBLCAweDAwMkMzLCAweDAwNTlELCAweDAwMDNELCAweDAwMDA4LCAweDAwMUQ5LAorICAgIDB4MDAwMzIsIDB4MDAwMEUsIDB4MDAxNkUsIDB4MDAzMkMsIDB4MDA2NUIsIDB4MDE5NkIsIDB4MDAwMDIsIDB4MDAwMEYsCisgICAgMHgwMDFEOCwgMHgwMDA4RCwgMHgwMDBCNCwgMHgwMDFFNCwgMHgwMDA2NywgMHgwMDMxNywgMHgwMDc5NCwgMHgwMDAyMiwKKyAgICAweDAwM0JFLCAweDAwMzE1LCAweDAwMDM0LCAweDAwMDM3LCAweDAwMkRFLCAweDAwMDZDLCAweDAwRUZFLCAweDAwNjZDLAorICAgIDB4MDAwMjgsIDB4MDAzQ0IsIDB4MDAzQUMsIDB4MDAwMzUsIDB4MDAxNkIsIDB4MDAzQkQsIDB4MDAyQzEsIDB4MDA2MkMsCisgICAgMHgwMURGRSwgMHgwMDAwRSwgMHgwMDU5RSwgMHgwMDVCRiwgMHgwMDBEQSwgMHgwMDYyOSwgMHgwMDU4NCwgMHgwMEVCNywKKyAgICAweDAwQjBBLCAweDAwNjZELCAweDAwMDBDLCAweDAwNzdFLCAweDAwNTlDLCAweDAwNzc4LCAweDAwNzVFLCAweDAwNzVBLAorICAgIDB4MDA2MkQsIDB4MDAzMzcsIDB4MDAzMzQsIDB4MDAxOTcsIDB4MDFFNTcsIDB4MDFERTQsIDB4MDE5NkEsIDB4MDFFNTYsCisgICAgMHgwMEM1MCwgMHgwMEIzRiwgMHgwMUU1NCwgMHgwMEIwQiwgMHgwMDE4RSwgMHgwMDFCNiwgMHgwMUU1NSwgMHgwMENCNCwKKyAgICAweDAwQjNFLCAweDAwRUI2LCAweDAxREU1LCAweDAxREZGLCAweDAwMzM1LCAweDAwMUI3CisgIH0sCisgIHsKKyAgICAweDAwMDAxLCAweDAwMDBCLCAweDAwMDE5LCAweDAwMDZGLCAweDAwMDJBLCAweDAwMDc1LCAweDAwN0VCLCAweDAwMTYzLAorICAgIDB4MDAwMDEsIDB4MDAwMEUsIDB4MDAwMUEsIDB4MDAwM0UsIDB4MDAwMUMsIDB4MDAwMkQsIDB4MDAxNjQsIDB4MDA3RUMsCisgICAgMHgwMDE2NSwgMHgwMDAwNCwgMHgwMDAwNiwgMHgwMDAzNiwgMHgwMDA3RiwgMHgwMDBBRSwgMHgwMDE1OCwgMHgwMDE1QywKKyAgICAweDAwNTZELCAweEZENTEwLCAweDAwMDAwLCAweDAwMDA0LCAweDAwMDdCLCAweDAwMEYzLCAweDAwMDNCLCAweDAwN0VELAorICAgIDB4MDAyQjMsIDB4MDAyQ0MsIDB4MDA1NkUsIDB4MDAwMTgsIDB4MDAwM0UsIDB4MDAwMTcsIDB4MDAwMUUsIDB4MDAwQUYsCisgICAgMHgwMDNGNywgMHgwMDU2RiwgMHgwMDJDRCwgMHhGRDUxMSwgMHgwMDAxNCwgMHgwMDBBRCwgMHgwMDBBQSwgMHgwMDAxNCwKKyAgICAweDAwMEE4LCAweDAwMTUzLCAweDAwMEU4LCAweDAwMUZFLCAweDAwRENGLCAweDAwMDc4LCAweDAwMUI4LCAweDAwMTUyLAorICAgIDB4MDAwRkUsIDB4MDAyQjEsIDB4MDAxNUQsIDB4MDAxNjAsIDB4RkQ1MTIsIDB4RkQ1MTMsIDB4MDAwN0EsIDB4MDAyQjAsCisgICAgMHgwMDFFNSwgMHgwMDBFOSwgMHgwMDBGQywgMHgwMDZFNiwgMHgwMERDOCwgMHgwMDU4NCwgMHhGRDUxNCwgMHgwMDBBQiwKKyAgICAweDAwRERFLCAweDAwMTU5LCAweDAwM0Y0LCAweDAwREM5LCAweDAwRENBLCAweDAwMUZBLCAweEZENTE1LCAweEZENTE2LAorICAgIDB4MDAwRkMsIDB4MDAxRkYsIDB4MDAxRTQsIDB4MDAwQUYsIDB4MDAxNUEsIDB4MDAxNjcsIDB4MDBEQ0IsIDB4MDA1ODUsCisgICAgMHhGRDUxNywgMHgwMDNGNywgMHgwM0Y1NSwgMHhGRDUxOCwgMHgwMEREQywgMHgwMDU4NiwgMHgwM0Y1NiwgMHhGRDUxOSwKKyAgICAweDAzRjU3LCAweEZENTFBLCAweDAwMUJBLCAweDAwNTg3LCAweDAwNTg4LCAweDAwRERGLCAweDAwMkIyLCAweEZENTFCLAorICAgIDB4MDBEQ0UsIDB4MDAzRjYsIDB4RkQ1MUMsIDB4MDBGRDQsIDB4RkQ1MUQsIDB4RkQ1MUUsIDB4RkQ1MUYsIDB4N0VBODAsCisgICAgMHg3RUE4MSwgMHgwMDU2QywgMHg3RUE4MiwgMHg3RUE4MywgMHgwMDM3NiwgMHgwMDU4OSwgMHgwMDU4QSwgMHg3RUE4NCwKKyAgICAweDdFQTg1LCAweDAwRERELCAweDdFQTg2LCAweDdFQTg3LCAweDAwNThCLCAweDA3RUE5CisgIH0sCisgIHsKKyAgICAweDAwMDAzLCAweDAwMDBFLCAweDAwMDBGLCAweDAwMDdFLCAweDAwMDYyLCAweDAwMEM2LCAweDAwQ0Q5LCAweDAwNjNFLAorICAgIDB4MDAwMDIsIDB4MDAwMDIsIDB4MDAwMDAsIDB4MDAwMTgsIDB4MDAwMEMsIDB4MDAwNjksIDB4MDAwMzksIDB4MDA3MDcsCisgICAgMHgwMEM3RSwgMHgwMDAwMiwgMHgwMDAwRCwgMHgwMDAxQiwgMHgwMDAwRiwgMHgwMDE5QSwgMHgwMDY0NywgMHgwMUEzNywKKyAgICAweDM0NkM0LCAweDAzNDZELCAweDAwMDAxLCAweDAwMDFFLCAweDAwMDdGLCAweDAwMDBBLCAweDAwMEUxLCAweDAwNjYxLAorICAgIDB4MDBDRTQsIDB4MzQ2QzUsIDB4MzQ2QzYsIDB4MDAwMUQsIDB4MDAwMzAsIDB4MDAwMEQsIDB4MDAwQ0IsIDB4MDAxOTksCisgICAgMHgwMDMyMCwgMHgwMDA4RSwgMHgwNjUyRSwgMHgzNDZDNywgMHgwMDAzRSwgMHgwMDAzOSwgMHgwMDAzNSwgMHgwMDAzMywKKyAgICAweDAwMTlGLCAweDAwMUMwLCAweDAwQ0RBLCAweDM0NkM4LCAweDM0NkM5LCAweDAwMDBCLCAweDAwMEQwLCAweDAwMTlFLAorICAgIDB4MDAwMjIsIDB4MDAwMzgsIDB4MDAxOEUsIDB4MDAzMUUsIDB4MDMyOTQsIDB4MDAyM0MsIDB4MDAwMzIsIDB4MDAwMTIsCisgICAgMHgwMDAxMywgMHgwMDA3MSwgMHgwMDE5RCwgMHgwMDAyMCwgMHgwMEM4NywgMHgwMENDMCwgMHgzNDZDQSwgMHgwMDMzOCwKKyAgICAweDAwNjUzLCAweDAwMUEyLCAweDAwMzJBLCAweDAwMzIyLCAweDAwQ0U3LCAweDAwMDg0LCAweDAwMTFGLCAweDM0NkNCLAorICAgIDB4MDAzMjUsIDB4MDA2NDksIDB4MDAzMkIsIDB4MDAwNzcsIDB4MDA2NDgsIDB4MDA2NDIsIDB4MDBDODYsIDB4MDBDOEMsCisgICAgMHgzNDZDQywgMHgwMDAzQSwgMHgwMTlCNywgMHgwMDA0MywgMHgwMDMyNywgMHgwMDA4QywgMHgwMDA4RCwgMHgwMEM4RCwKKyAgICAweDM0NkNELCAweDM0NkNFLCAweDAwMzM3LCAweDAwQ0U1LCAweDAwMDg1LCAweDAwMzI2LCAweDAwMzQ3LCAweDAwQ0E0LAorICAgIDB4MDBDN0YsIDB4MDBEMUEsIDB4MzQ2Q0YsIDB4MDAzMjgsIDB4MUEzNjAsIDB4MUEzNjEsIDB4MDBDRDgsIDB4MDA2OEMsCisgICAgMHgwMzI5NSwgMHgwMzI5NiwgMHgwNjUyRiwgMHgwNjZEOCwgMHgwMDMzMSwgMHgwMDcwNiwgMHgwMDIzRCwgMHgwMDA3NiwKKyAgICAweDAwQ0MxLCAweDAwMzgyLCAweDAwQ0U2LCAweDA2NkQ5LCAweDA2NkRBLCAweDA2NkRCCisgIH0KK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdmMxXzJyZWZfbXZkYXRhX2JpdHNbOF1bMTI2XSA9IHsKKyAgeworICAgICA0LCAgNSwgIDUsICA1LCAgNiwgIDcsICA4LCAxMCwgIDIsICA1LCAgNSwgIDYsICA2LCAgNywgIDgsICA5LAorICAgIDEwLCAgNCwgIDUsICA2LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAgNCwgIDYsICA2LCAgNywgIDcsICA5LAorICAgICA5LCAxMCwgMTIsICA1LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAxMCwgMTIsICA1LCAgNywgIDgsICA3LAorICAgICA3LCAgOCwgIDksICA5LCAxMSwgIDcsICA5LCAxMCwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMiwgIDYsICA5LAorICAgICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDExLCAgNywgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDE0LAorICAgICA4LCAxMSwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsICA4LCAxMiwgMTEsIDExLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMywgIDgsIDEyLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMiwgIDksIDE0LCAxMywgMTEsIDEzLAorICAgIDEyLCAxMywgMTIsIDEzLCAgOSwgMTMsIDEzLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMworICB9LAorICB7CisgICAgIDMsICA0LCAgNSwgIDYsICA4LCAxMCwgMTEsIDExLCAgMiwgIDUsICA1LCAgNiwgIDcsICA4LCAxMCwgMTEsCisgICAgMTEsICA0LCAgNSwgIDUsICA2LCAgNywgIDksIDEyLCAxMywgMTMsICA0LCAgNiwgIDcsICA3LCAgOSwgMTAsCisgICAgMTEsIDEzLCAxNCwgIDUsICA3LCAgNywgIDcsICA4LCAgOSwgMTEsIDEzLCAxMywgIDYsICA4LCAgOCwgIDgsCisgICAgIDgsICA5LCAxMCwgMTIsIDEzLCAgNywgIDksICA4LCAgOCwgIDgsICA5LCAxMSwgMTIsIDEzLCAgNywgIDksCisgICAgIDksICA5LCAgOSwgIDksIDEwLCAxMSwgMTMsICA4LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMiwgMTMsCisgICAgIDksIDExLCAxMSwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMiwgMTAsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsCisgICAgMTIsIDEyLCAxMCwgMTMsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMCwgMTMsIDEzLCAxMiwgMTMsCisgICAgMTEsIDEyLCAxMSwgMTIsIDEwLCAxNCwgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExCisgIH0sCisgIHsKKyAgICAgNCwgIDQsICA1LCAgNSwgIDYsICA3LCAgOCwgIDksICAyLCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgOSwKKyAgICAgOSwgIDQsICA2LCAgNiwgIDYsICA3LCAgOCwgIDksIDExLCAxMiwgIDUsICA3LCAgNywgIDcsICA5LCAgOSwKKyAgICAxMCwgMTEsIDEyLCAgNSwgIDcsICA3LCAgNywgIDcsICA5LCAgOSwgMTAsIDEyLCAgNSwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDgsICA5LCAxMCwgMTAsICA2LCAgOSwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgMTEsICA2LCAxMCwKKyAgICAxMCwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgIDcsIDExLCAxMCwgIDksICA5LCAxMCwgIDksIDEwLCAxMSwKKyAgICAgNywgMTAsIDExLCAxMCwgMTAsIDEwLCAgOSwgMTAsIDExLCAgOCwgMTIsIDExLCAxMSwgMTAsIDExLCAxMSwKKyAgICAxMCwgMTAsICA4LCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMCwgMTEsICA4LCAxMywgMTIsIDEyLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMCwgIDksIDEzLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDEwLCAxMCwgMTAKKyAgfSwKKyAgeworICAgICAzLCAgNCwgIDYsICA3LCAgNywgIDksIDExLCAxMSwgIDIsICA1LCAgNSwgIDYsICA4LCAgOSwgMTAsIDExLAorICAgIDEzLCAgMywgIDUsICA1LCAgNywgIDgsICA5LCAxMiwgMTQsIDEzLCAgNCwgIDYsICA2LCAgNywgIDksIDExLAorICAgIDEzLCAxNCwgMTQsICA1LCAgNywgIDcsICA4LCAgOSwgIDksIDEzLCAxNSwgMTMsICA2LCAgOCwgIDgsICA4LAorICAgICA5LCAxMCwgMTIsIDE0LCAxMywgIDcsIDEwLCAgOSwgIDksICA5LCAgOSwgMTIsIDEzLCAxNCwgIDcsIDExLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTIsIDEzLCAgOCwgMTEsIDEyLCAxMiwgMTIsIDExLCAxMiwgMTQsIDE1LAorICAgICA5LCAxMSwgMTIsIDExLCAxMiwgMTEsIDExLCAxMiwgMTMsICA5LCAxMiwgMTMsIDEzLCAxMiwgMTIsIDEzLAorICAgIDE0LCAxNCwgIDksIDEyLCAxMywgMTMsIDEzLCAxMiwgMTMsIDEyLCAxNCwgMTAsIDEzLCAxMywgMTQsIDEzLAorICAgIDExLCAxMywgMTQsIDE1LCAxMCwgMTIsIDEzLCAxNSwgMTQsIDEzLCAxMywgMTMsIDE0LCAxNAorICB9LAorICB7CisgICAgIDQsICA1LCAgNSwgIDUsICA2LCAgNywgIDgsICA4LCAgMiwgIDYsICA2LCAgNiwgIDYsICA2LCAgOCwgIDksCisgICAgMTAsICA0LCAgNiwgIDYsICA2LCAgNiwgIDcsICA5LCAxMCwgMTEsICA0LCAgNywgIDcsICA3LCAgNywgIDcsCisgICAgIDksIDEwLCAxMiwgIDUsICA3LCAgNywgIDcsICA3LCAgNywgIDksIDEwLCAxMSwgIDYsICA4LCAgOCwgIDcsCisgICAgIDcsICA3LCAgOCwgIDksIDEwLCAgNiwgIDksICA4LCAgOCwgIDcsICA4LCAxMCwgMTAsIDExLCAgNywgIDksCisgICAgIDksICA4LCAgOCwgIDgsICA5LCAgOSwgMTAsICA4LCAxMCwgMTAsICA5LCAgOSwgIDksIDExLCAxMSwgMTEsCisgICAgIDgsIDExLCAxMCwgMTAsICA5LCAgOSwgMTAsIDExLCAxMCwgMTAsIDEyLCAxMiwgMTEsIDExLCAxMCwgMTEsCisgICAgMTIsIDExLCAxMCwgMTMsIDEyLCAxMSwgMTEsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTUsIDEzLCAxMywgMTMsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEwLCAxNSwgMTQsIDEzLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExCisgIH0sCisgIHsKKyAgICAgNCwgIDUsICA2LCAgNiwgIDYsICA3LCAgOCwgIDgsICAyLCAgNCwgIDUsICA2LCAgNiwgIDcsICA4LCAgOCwKKyAgICAgOSwgIDQsICA2LCAgNywgIDcsICA4LCAgOCwgIDksIDEwLCAxMSwgIDUsICA2LCAgNywgIDcsICA4LCAgOCwKKyAgICAgOSwgMTAsIDEyLCAgNSwgIDcsICA4LCAgOCwgIDgsICA5LCAxMCwgMTEsIDEyLCAgNSwgIDcsICA4LCAgOCwKKyAgICAgOCwgIDgsICA5LCAxMCwgMTEsICA2LCAgOCwgIDksICA4LCAgOCwgIDksIDEwLCAxMSwgMTMsICA1LCAgOCwKKyAgICAgOSwgIDgsICA4LCAgOSwgIDksIDEwLCAxMSwgIDYsIDEwLCAxMCwgIDksICA5LCAxMCwgMTAsIDEyLCAxMywKKyAgICAgNiwgMTAsIDEwLCAgOSwgIDksIDEwLCAxMCwgMTEsIDEzLCAgNywgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTMsICA3LCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsICA5LCAxMywgMTMsIDEzLCAxMywKKyAgICAxMiwgMTIsIDEzLCAxMiwgIDksIDEyLCAxMywgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMiwgMTIKKyAgfSwKKyAgeworICAgICAzLCAgNSwgIDYsICA4LCAgOSwgMTAsIDEyLCAxMiwgIDEsICA1LCAgNiwgIDcsICA4LCAgOSwgMTIsIDEyLAorICAgIDEyLCAgNCwgIDYsICA3LCAgOCwgIDksIDEyLCAxMiwgMTQsIDIxLCAgNCwgIDYsICA4LCAgOSwgIDksIDEyLAorICAgIDEzLCAxMywgMTQsICA2LCAgOSwgIDgsICA4LCAgOSwgMTMsIDE0LCAxMywgMjEsICA2LCAgOSwgIDksICA4LAorICAgICA5LCAxMCwgMTEsIDEyLCAxMywgIDgsIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDIxLCAyMSwgIDgsIDExLAorICAgIDEwLCAxMSwgMTEsIDEyLCAxMywgMTQsIDIxLCAgOSwgMTMsIDEwLCAxMSwgMTMsIDEzLCAxMiwgMjEsIDIxLAorICAgICA5LCAxMiwgMTAsIDExLCAxMiwgMTIsIDEzLCAxNCwgMjEsIDExLCAxNSwgMjEsIDEzLCAxNCwgMTUsIDIxLAorICAgIDE1LCAyMSwgMTAsIDE0LCAxNCwgMTMsIDEzLCAyMSwgMTMsIDEzLCAyMSwgMTMsIDIxLCAyMSwgMjEsIDIwLAorICAgIDIwLCAxNCwgMjAsIDIwLCAxMSwgMTQsIDE0LCAyMCwgMjAsIDEzLCAyMCwgMjAsIDE0LCAxNgorICB9LAorICB7CisgICAgIDIsICA1LCAgNiwgIDgsICA5LCAxMCwgMTMsIDEzLCAgMiwgIDQsICA1LCAgNiwgIDgsICA5LCAxMCwgMTMsCisgICAgMTQsICAzLCAgNSwgIDcsICA4LCAxMCwgMTIsIDE1LCAyMCwgMTYsICA0LCAgNiwgIDgsICA4LCAxMCwgMTIsCisgICAgMTMsIDIwLCAyMCwgIDcsICA4LCAgOCwgIDksIDEwLCAxMSwgMTIsIDE2LCAyMCwgIDcsICA4LCAgOCwgIDgsCisgICAgMTAsIDExLCAxMywgMjAsIDIwLCAgOCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMiwgMTUsIDE0LCAgOCwgIDksCisgICAgIDksICA5LCAxMCwgMTAsIDEzLCAxMywgMjAsIDExLCAxMiwgMTEsIDExLCAxMSwgMTMsIDEyLCAxMywgMjAsCisgICAgMTEsIDEyLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAyMCwgMTAsIDE0LCAxMSwgMTEsIDEyLCAxMiwgMTMsCisgICAgMjAsIDIwLCAxMSwgMTMsIDEyLCAxMSwgMTIsIDEzLCAxNCwgMTQsIDIwLCAxMSwgMTksIDE5LCAxMywgMTMsCisgICAgMTUsIDE1LCAxNiwgMTYsIDExLCAxMywgMTQsIDExLCAxMywgMTIsIDEzLCAxNiwgMTYsIDE2CisgIH0KK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfd212M19kY19zY2FsZV90YWJsZVszMl0gPSB7CisgICAgIDAsICAyLCAgNCwgIDgsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsCisgICAgMTQsIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEKK307CisKKy8qIFAtUGljdHVyZSBDQlBDWSBWTEMgdGFibGVzICovCisvLyBMb29rcyBsaWtlIG9yaWdpbmFsIHRhYmxlcyBhcmUgbm90IGNvbmZvcm1pbmcgdG8gc3RhbmRhcmQgYXQgYWxsLiBBcmUgdGhleSB1c2VkIGZvciBvbGQgV01WPworY29uc3QgdWludDE2X3QgZmZfdmMxX2NicGN5X3BfY29kZXNbNF1bNjRdID0geworICB7CisgICAgICAwLCAgIDYsICAxNSwgIDEzLCAgMTMsICAxMSwgICAzLCAgMTMsICAgNSwgICA4LCAgNDksICAxMCwgIDEyLCAxMTQsIDEwMiwgMTE5LAorICAgICAgMSwgIDU0LCAgOTYsICAgOCwgIDEwLCAxMTEsICAgNSwgIDE1LCAgMTIsICAxMCwgICAyLCAgMTIsICAxMywgMTE1LCAgNTMsICA2MywKKyAgICAgIDEsICAgNywgICAxLCAgIDcsICAxNCwgIDEyLCAgIDQsICAxNCwgICAxLCAgIDksICA5NywgIDExLCAgIDcsICA1OCwgIDUyLCAgNjIsCisgICAgICA0LCAxMDMsICAgMSwgICA5LCAgMTEsICA1NiwgMTAxLCAxMTgsICAgNCwgMTEwLCAxMDAsICAzMCwgICAyLCAgIDUsICAgNCwgICAzCisgIH0sCisgIHsKKyAgICAgIDAsICAgOSwgICAxLCAgMTgsICAgNSwgIDE0LCAyMzcsICAyNiwgICAzLCAxMjEsICAgMywgIDIyLCAgMTMsICAxNiwgICA2LCAgMzAsCisgICAgICAyLCAgMTAsICAgMSwgIDIwLCAgMTIsIDI0MSwgICA1LCAgMjgsICAxNiwgIDEyLCAgIDMsICAyNCwgIDI4LCAxMjQsIDIzOSwgMjQ3LAorICAgICAgMSwgMjQwLCAgIDEsICAxOSwgIDE4LCAgMTUsICAgNCwgIDI3LCAgIDEsIDEyMiwgICAyLCAgMjMsICAgMSwgIDE3LCAgIDcsICAzMSwKKyAgICAgIDEsICAxMSwgICAyLCAgMjEsICAxOSwgMjQ2LCAyMzgsICAyOSwgIDE3LCAgMTMsIDIzNiwgIDI1LCAgNTgsICA2MywgICA4LCAxMjUKKyAgfSwKKyAgeworICAgICAgMCwgMjAxLCAgMjUsIDIzMSwgICA1LCAyMjEsICAgMSwgICAzLCAgIDIsIDQxNCwgICAyLCAyNDEsICAxNiwgMjI1LCAxOTUsIDQ5MiwKKyAgICAgIDIsIDQxMiwgICAxLCAyNDAsICAgNywgMjI0LCAgOTgsIDI0NSwgICAxLCAyMjAsICA5NiwgICA1LCAgIDksIDIzMCwgMTAxLCAyNDcsCisgICAgICAxLCAxMDIsICAgMSwgNDE1LCAgMjQsICAgMywgICAyLCAyNDQsICAgMywgIDU0LCAgIDMsIDQ4NCwgIDE3LCAxMTQsIDIwMCwgNDkzLAorICAgICAgMywgNDEzLCAgIDEsICAgNCwgIDEzLCAxMTMsICA5OSwgNDg1LCAgIDQsIDExMSwgMTk0LCAyNDMsICAgNSwgIDI5LCAgMjYsICAzMQorICB9LAorICB7CisgICAgICAwLCAgMjgsICAxMiwgIDQ0LCAgIDMsICAzNiwgIDIwLCAgNTIsICAgMiwgIDMyLCAgMTYsICA0OCwgICA4LCAgNDAsICAyNCwgIDI4LAorICAgICAgMSwgIDMwLCAgMTQsICA0NiwgICA2LCAgMzgsICAyMiwgIDU0LCAgIDMsICAzNCwgIDE4LCAgNTAsICAxMCwgIDQyLCAgMjYsICAzMCwKKyAgICAgIDEsICAyOSwgIDEzLCAgNDUsICAgNSwgIDM3LCAgMjEsICA1MywgICAyLCAgMzMsICAxNywgIDQ5LCAgIDksICA0MSwgIDI1LCAgMjksCisgICAgICAxLCAgMzEsICAxNSwgIDQ3LCAgIDcsICAzOSwgIDIzLCAgNTUsICAgNCwgIDM1LCAgMTksICA1MSwgIDExLCAgNDMsICAyNywgIDMxCisgICB9Cit9OworCitjb25zdCB1aW50OF90IGZmX3ZjMV9jYnBjeV9wX2JpdHNbNF1bNjRdID0geworICB7CisgICAgMTMsICAxMywgICA3LCAgMTMsICAgNywgIDEzLCAgMTMsICAxMiwgICA2LCAgMTMsICAgNywgIDEyLCAgIDYsICAgOCwgICA4LCAgIDgsCisgICAgIDUsICAgNywgICA4LCAgMTIsICAgNiwgICA4LCAgMTMsICAxMiwgICA3LCAgMTMsICAxMywgIDEyLCAgIDYsICAgOCwgICA3LCAgIDcsCisgICAgIDYsICAxMywgICA4LCAgMTIsICAgNywgIDEzLCAgMTMsICAxMiwgICA3LCAgMTMsICAgOCwgIDEyLCAgIDUsICAgNywgICA3LCAgIDcsCisgICAgIDYsICAgOCwgIDEzLCAgMTIsICAgNiwgICA3LCAgIDgsICAgOCwgICA1LCAgIDgsICAgOCwgICA2LCAgIDMsICAgMywgICAzLCAgIDIKKyAgfSwKKyAgeworICAgIDE0LCAgMTMsICAgOCwgIDEzLCAgIDMsICAxMywgICA4LCAgMTMsICAgMywgICA3LCAgIDgsICAxMywgICA0LCAgMTMsICAxMywgIDEzLAorICAgICAzLCAgMTMsICAxMywgIDEzLCAgIDQsICAgOCwgIDEzLCAgMTMsICAgNSwgIDEzLCAgMTMsICAxMywgICA1LCAgIDcsICAgOCwgICA4LAorICAgICAzLCAgIDgsICAxNCwgIDEzLCAgIDUsICAxMywgIDEzLCAgMTMsICAgNCwgICA3LCAgMTMsICAxMywgICA2LCAgMTMsICAxMywgIDEzLAorICAgICA1LCAgMTMsICAgOCwgIDEzLCAgIDUsICAgOCwgICA4LCAgMTMsICAgNSwgIDEzLCAgIDgsICAxMywgICA2LCAgIDYsICAxMywgICA3CisgIH0sCisgIHsKKyAgICAxMywgICA4LCAgIDYsICAgOCwgICA0LCAgIDgsICAxMywgIDEyLCAgIDQsICAgOSwgICA4LCAgIDgsICAgNSwgICA4LCAgIDgsICAgOSwKKyAgICAgNSwgICA5LCAgMTAsICAgOCwgICA0LCAgIDgsICAgNywgICA4LCAgIDYsICAgOCwgICA3LCAgMTMsICAgNCwgICA4LCAgIDcsICAgOCwKKyAgICAgNSwgICA3LCAgIDgsICAgOSwgICA2LCAgMTMsICAxMywgICA4LCAgIDQsICAgNiwgICA4LCAgIDksICAgNSwgICA3LCAgIDgsICAgOSwKKyAgICAgNSwgICA5LCAgIDksICAxMywgICA1LCAgIDcsICAgNywgICA5LCAgIDQsICAgNywgICA4LCAgIDgsICAgMywgICA1LCAgIDUsICAgNQorICB9LAorICB7CisgICAgIDksICAgOSwgICA5LCAgIDksICAgMiwgICA5LCAgIDksICAgOSwgICAyLCAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDgsCisgICAgIDMsICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDgsCisgICAgIDIsICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDgsCisgICAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICA5LCAgIDgKKyAgfQorfTsKKworLyogSW50ZXJsYWNlZCBDQlBDWSBWTEMgdGFibGVzIChUYWJsZSAxMjQgLSBUYWJsZSAxMzEpICovCitjb25zdCB1aW50MTZfdCBmZl92YzFfaWNicGN5X3BfY29kZXNbOF1bNjNdID0geworICB7CisgICAgMHgyRjFBLCAweDJGMUIsIDB4MTc4QywgMHgwMDkwLCAweDAyQTgsIDB4MDJBOSwgMHgwQkM3LCAweDAwOTEsCisgICAgMHgwMkFBLCAweDAyQUIsIDB4MDVFMCwgMHgwMDRBLCAweDAwOTYsIDB4MDA5NywgMHgwMEJELCAweDAwOTIsCisgICAgMHgwMkFDLCAweDAyQUQsIDB4MDVFMSwgMHgwMDk4LCAweDAxMzIsIDB4MDEzMywgMHgwMTc5LCAweDAxMzQsCisgICAgMHgwMjZBLCAweDAyNkIsIDB4MDJGQywgMHgwMDRFLCAweDAwNDAsIDB4MDA0MSwgMHgwMDJCLCAweDAwOTMsCisgICAgMHgwMkFFLCAweDAyQUYsIDB4MDVFMiwgMHgwMTM2LCAweDAyNkUsIDB4MDI2RiwgMHgwMkZELCAweDAwOUUsCisgICAgMHgwMTNFLCAweDAxM0YsIDB4MDE3RiwgMHgwMDUwLCAweDAwNDIsIDB4MDA0MywgMHgwMDJDLCAweDAwNTEsCisgICAgMHgwMEE0LCAweDAwQTUsIDB4MDBCRSwgMHgwMDUzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDJELCAweDAwNTQsCisgICAgMHgwMDQ2LCAweDAwNDcsIDB4MDAyRSwgMHgwMDAzLCAweDAwMDAsIDB4MDAwMSwgMHgwMDAxCisgIH0sCisgIHsKKyAgICAweDAwNDEsIDB4MDA0MiwgMHgwMTAwLCAweDAwNDMsIDB4MDA4OCwgMHgwMDg5LCAweDAxMDEsIDB4MDA0NSwKKyAgICAweDAwOEMsIDB4MDA4RCwgMHgwMTAyLCAweDAwMTAsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDA0NywKKyAgICAweDAwMTAsIDB4MDAxMSwgMHgwMTAzLCAweDAwMjUsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwKKyAgICAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLCAweDAwMEMsIDB4MDAzMCwgMHgwMDMxLCAweDAwMTksIDB4MDAwOSwKKyAgICAweDAwMTQsIDB4MDAxNSwgMHgwMDJDLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDAyNiwKKyAgICAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLCAweDAwMEQsIDB4MDAzNCwgMHgwMDM1LCAweDAwMUIsIDB4MDAxNCwKKyAgICAweDAwMjcsIDB4MDAyQSwgMHgwMDJCLCAweDAwMEUsIDB4MDAzOCwgMHgwMDM5LCAweDAwMUQsIDB4MDAwRiwKKyAgICAweDAwM0MsIDB4MDAzRCwgMHgwMDFGLCAweDAwMDUsIDB4MDAwOSwgMHgwMDAwLCAweDAwMDMKKyAgfSwKKyAgeworICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMUEsIDB4MDAyNiwgMHgwMEU0LCAweDAwRTUsIDB4MDFFNiwgMHgwMDI3LAorICAgIDB4MDBFNiwgMHgwMEU3LCAweDAxRTcsIDB4MDAwRSwgMHgwMDYzLCAweDAwNkMsIDB4MDA3NywgMHgwMDI4LAorICAgIDB4MDBFOCwgMHgwMEU5LCAweDAxRTgsIDB4MDA3QiwgMHgwMERBLCAweDAwREIsIDB4MDBFQywgMHgwMEY1LAorICAgIDB4MDFCOCwgMHgwMUI5LCAweDAxREEsIDB4MDAyMSwgMHgwMDRCLCAweDAwNTQsIDB4MDAyQiwgMHgwMDI5LAorICAgIDB4MDBFQSwgMHgwMEVCLCAweDAxRTksIDB4MDA0QSwgMHgwMUJBLCAweDAxQkIsIDB4MDFEQiwgMHgwMDIwLAorICAgIDB4MDBERSwgMHgwMERGLCAweDAwRjIsIDB4MDAyMiwgMHgwMDU1LCAweDAwNTgsIDB4MDAyRCwgMHgwMDBGLAorICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzgsIDB4MDAyMywgMHgwMDU5LCAweDAwNUMsIDB4MDAyRiwgMHgwMDI0LAorICAgIDB4MDA1RCwgMHgwMDYyLCAweDAwMzAsIDB4MDAwMiwgMHgwMDFGLCAweDAwMDYsIDB4MDAwMAorICB9LAorICB7CisgICAgMHgwMDI4LCAweDAwMjksIDB4MDA5RCwgMHgwMDAwLCAweDAxRUEsIDB4MDFFQiwgMHgwMUVDLCAweDAwMDEsCisgICAgMHgwMUVELCAweDAxRUUsIDB4MDFFRiwgMHgwMDA1LCAweDAwRjAsIDB4MDBGMSwgMHgwMDNCLCAweDAwMDIsCisgICAgMHgwMUYwLCAweDAxRjEsIDB4MDFGMiwgMHgwMDNGLCAweDAxNUMsIDB4MDE1RCwgMHgwMDk5LCAweDAwMTAsCisgICAgMHgwM0QwLCAweDAzRDEsIDB4MDEzMCwgMHgwMDBGLCAweDAwOUUsIDB4MDA5RiwgMHgwMEZCLCAweDAwMDMsCisgICAgMHgwMUYzLCAweDAxRjQsIDB4MDFGNSwgMHgwMDExLCAweDAzRDIsIDB4MDNEMywgMHgwMTMxLCAweDAwMDksCisgICAgMHgwMTVFLCAweDAxNUYsIDB4MDA5QywgMHgwMDEwLCAweDAwQTgsIDB4MDBBOSwgMHgwMDM4LCAweDAwMDYsCisgICAgMHgwMEYyLCAweDAwRjMsIDB4MDA0RCwgMHgwMDExLCAweDAwQUEsIDB4MDBBQiwgMHgwMDM5LCAweDAwMTIsCisgICAgMHgwMEFDLCAweDAwQUQsIDB4MDAzQSwgMHgwMDA2LCAweDAwMTYsIDB4MDAxNywgMHgwMDBFCisgIH0sCisgIHsKKyAgICAweDAwM0MsIDB4MDAzRCwgMHgwMDFGLCAweDAwMEEsIDB4MDA2MSwgMHgwMDYyLCAweDAwMDIsIDB4MDAwQiwKKyAgICAweDAwNjMsIDB4MDA2NCwgMHgwMDAzLCAweDAwMDcsIDB4MDAwMywgMHgwMDA0LCAweDAwMEIsIDB4MDAwQywKKyAgICAweDAwNjUsIDB4MDA2NiwgMHgwMDA0LCAweDAwMTIsIDB4MDAwQSwgMHgwMDBCLCAweDAwMTQsIDB4MDAxQiwKKyAgICAweDAwMTgsIDB4MDAxOSwgMHgwMDM0LCAweDAwMkMsIDB4MDA2NywgMHgwMDY4LCAweDAwMzUsIDB4MDAwRCwKKyAgICAweDAwNjksIDB4MDA2QywgMHgwMDA1LCAweDAwNjAsIDB4MDAxQSwgMHgwMDFCLCAweDAwMzUsIDB4MDAxMywKKyAgICAweDAwMEUsIDB4MDAwRiwgMHgwMDE1LCAweDAwMkQsIDB4MDA2RCwgMHgwMDZFLCAweDAwMzgsIDB4MDAwOCwKKyAgICAweDAwMDgsIDB4MDAwOSwgMHgwMDBDLCAweDAwMkUsIDB4MDA2RiwgMHgwMDcyLCAweDAwM0EsIDB4MDAyRiwKKyAgICAweDAwNzMsIDB4MDAwMCwgMHgwMDNCLCAweDAwMDcsIDB4MDAxNCwgMHgwMDE1LCAweDAwMDQKKyAgfSwKKyAgeworICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwOUQsIDB4MDAwQSwgMHgwMDkxLCAweDAwOTIsIDB4MDA5MywgMHgwMDBCLAorICAgIDB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDAwMywgMHgwMEVFLCAweDAwRUYsIDB4MDAzNiwgMHgwMDBDLAorICAgIDB4MDA5NywgMHgwMDk4LCAweDAwOTksIDB4MDAwOCwgMHgwMUU0LCAweDAxRTUsIDB4MDA2QSwgMHgwMDE4LAorICAgIDB4MDNDQywgMHgwM0NELCAweDAwRDYsIDB4MDAwRSwgMHgwMDlFLCAweDAwOUYsIDB4MDBGNSwgMHgwMDBELAorICAgIDB4MDA5QSwgMHgwMDlCLCAweDAwOUMsIDB4MDAxOSwgMHgwM0NFLCAweDAzQ0YsIDB4MDBENywgMHgwMDA5LAorICAgIDB4MDFFOCwgMHgwMUU5LCAweDAwOTAsIDB4MDAwRiwgMHgwMEU4LCAweDAwRTksIDB4MDBGNiwgMHgwMDA1LAorICAgIDB4MDBGMCwgMHgwMEYxLCAweDAwMzcsIDB4MDAxMCwgMHgwMEVBLCAweDAwRUIsIDB4MDBGNywgMHgwMDExLAorICAgIDB4MDBFQywgMHgwMEVELCAweDAwMzQsIDB4MDAwMCwgMHgwMDNFLCAweDAwM0YsIDB4MDAwMgorICB9LAorICB7CisgICAgMHgwMDNDLCAweDAwM0QsIDB4MDFDRiwgMHgwMDAwLCAweDAwQkYsIDB4MDBFMCwgMHgwMUZDLCAweDAwMDEsCisgICAgMHgwMEUxLCAweDAwRTIsIDB4MDFGRCwgMHgwMDA5LCAweDAxRjEsIDB4MDFGMiwgMHgwMUYzLCAweDAwMDIsCisgICAgMHgwMEUzLCAweDAwRTQsIDB4MDFGRSwgMHgwMDExLCAweDAzRUUsIDB4MDNFRiwgMHgwM0YwLCAweDAwMjEsCisgICAgMHgwN0UyLCAweDA3RTMsIDB4MDdFNCwgMHgwMDE4LCAweDAzRjcsIDB4MDNGRSwgMHgwM0ZGLCAweDAwMDMsCisgICAgMHgwMEU1LCAweDAwRTYsIDB4MDA4MCwgMHgwMDJFLCAweDA3RTUsIDB4MDdFNiwgMHgwN0U3LCAweDAwMTYsCisgICAgMHgwM0Y0LCAweDAzRjUsIDB4MDNGNiwgMHgwMDE5LCAweDAxMDIsIDB4MDEwMywgMHgwMTA0LCAweDAwMEEsCisgICAgMHgwMUY0LCAweDAxRjUsIDB4MDFGNiwgMHgwMDFBLCAweDAxMDUsIDB4MDEwNiwgMHgwMTA3LCAweDAwMUIsCisgICAgMHgwMTc4LCAweDAxNzksIDB4MDFDRSwgMHgwMDFELCAweDAwQkQsIDB4MDBCRSwgMHgwMUYwCisgIH0sCisgIHsKKyAgICAweDAwMDMsIDB4MDAwNCwgMHgwMUI2LCAweDAwMDQsIDB4MDAyRSwgMHgwMDJGLCAweDAwMEUsIDB4MDAwNSwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDBGLCAweDAwMDMsIDB4MDAwQSwgMHgwMDBCLCAweDAwMTQsIDB4MDAwNiwKKyAgICAweDAwMzIsIDB4MDAzMywgMHgwMDEwLCAweDAwMDUsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAwOSwKKyAgICAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwMUQsIDB4MDFCNywgMHgwMUI4LCAweDAxQjksIDB4MDAwNywKKyAgICAweDAwMzQsIDB4MDAzNSwgMHgwMDExLCAweDAwMTYsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDAwQSwKKyAgICAweDAwMzYsIDB4MDAzNywgMHgwMEQ4LCAweDAwMUUsIDB4MDFCQSwgMHgwMUJCLCAweDAxQkMsIDB4MDAwNCwKKyAgICAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LCAweDAwMUYsIDB4MDFCRCwgMHgwMUJFLCAweDAxQkYsIDB4MDAwMCwKKyAgICAweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMUMsIDB4MDBEOSwgMHgwMERBLCAweDAwMTMKKyAgfQorfTsKKworY29uc3QgdWludDhfdCBmZl92YzFfaWNicGN5X3BfYml0c1s4XVs2M10gPSB7CisgIHsKKyAgICAxNSwgMTUsIDE0LCAgOSwgMTEsIDExLCAxMywgIDksIDExLCAxMSwgMTIsICA4LCAgOSwgIDksICA5LCAgOSwKKyAgICAxMSwgMTEsIDEyLCAgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsICA4LCAgOCwgIDgsICA3LCAgOSwKKyAgICAxMSwgMTEsIDEyLCAxMCwgMTEsIDExLCAxMSwgIDksIDEwLCAxMCwgMTAsICA4LCAgOCwgIDgsICA3LCAgOCwKKyAgICAgOSwgIDksICA5LCAgOCwgIDgsICA4LCAgNywgIDgsICA4LCAgOCwgIDcsICAzLCAgMywgIDMsICAxCisgIH0sCisgIHsKKyAgICAgNywgIDcsICA5LCAgNywgIDgsICA4LCAgOSwgIDcsICA4LCAgOCwgIDksICA2LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDcsICA5LCAgNywgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA2LCAgNywgIDcsICA2LCAgNiwKKyAgICAgNywgIDcsICA4LCAgOCwgIDksICA5LCAgOSwgIDcsICA4LCAgOCwgIDgsICA2LCAgNywgIDcsICA2LCAgNiwKKyAgICAgNywgIDcsICA3LCAgNiwgIDcsICA3LCAgNiwgIDYsICA3LCAgNywgIDYsICAzLCAgNCwgIDMsICAyCisgIH0sCisgIHsKKyAgICAgNiwgIDYsICA1LCAgNiwgIDgsICA4LCAgOSwgIDYsICA4LCAgOCwgIDksICA1LCAgNywgIDcsICA3LCAgNiwKKyAgICAgOCwgIDgsICA5LCAgNywgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA2LCAgNywgIDcsICA2LCAgNiwKKyAgICAgOCwgIDgsICA5LCAgNywgIDksICA5LCAgOSwgIDYsICA4LCAgOCwgIDgsICA2LCAgNywgIDcsICA2LCAgNSwKKyAgICAgNywgIDcsICA3LCAgNiwgIDcsICA3LCAgNiwgIDYsICA3LCAgNywgIDYsICAzLCAgNSwgIDQsICAyCisgIH0sCisgIHsKKyAgICAgNiwgIDYsICA4LCAgNCwgIDksICA5LCAgOSwgIDQsICA5LCAgOSwgIDksICA0LCAgOCwgIDgsICA3LCAgNCwKKyAgICAgOSwgIDksICA5LCAgNiwgIDksICA5LCAgOCwgIDYsIDEwLCAxMCwgIDksICA1LCAgOCwgIDgsICA4LCAgNCwKKyAgICAgOSwgIDksICA5LCAgNiwgMTAsIDEwLCAgOSwgIDUsICA5LCAgOSwgIDgsICA1LCAgOCwgIDgsICA3LCAgNCwKKyAgICAgOCwgIDgsICA3LCAgNSwgIDgsICA4LCAgNywgIDUsICA4LCAgOCwgIDcsICAzLCAgNSwgIDUsICA0CisgIH0sCisgIHsKKyAgICAgNiwgIDYsICA1LCAgNSwgIDcsICA3LCAgNywgIDUsICA3LCAgNywgIDcsICA1LCAgNiwgIDYsICA2LCAgNSwKKyAgICAgNywgIDcsICA3LCAgNiwgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA2LCAgNywgIDcsICA2LCAgNSwKKyAgICAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDYsICA3LCAgNywgIDcsICA2LCAgNywgIDcsICA2LCAgNSwKKyAgICAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNiwgIDYsICA3LCAgNiwgIDYsICA0LCAgNSwgIDUsICAzCisgIH0sCisgIHsKKyAgICAgNiwgIDYsICA4LCAgNCwgIDgsICA4LCAgOCwgIDQsICA4LCAgOCwgIDgsICA0LCAgOCwgIDgsICA3LCAgNCwKKyAgICAgOCwgIDgsICA4LCAgNSwgIDksICA5LCAgOCwgIDYsIDEwLCAxMCwgIDksICA1LCAgOCwgIDgsICA4LCAgNCwKKyAgICAgOCwgIDgsICA4LCAgNiwgMTAsIDEwLCAgOSwgIDUsICA5LCAgOSwgIDgsICA1LCAgOCwgIDgsICA4LCAgNCwKKyAgICAgOCwgIDgsICA3LCAgNSwgIDgsICA4LCAgOCwgIDUsICA4LCAgOCwgIDcsICAzLCAgNiwgIDYsICA0CisgIH0sCisgIHsKKyAgICAgNiwgIDYsICA5LCAgMywgIDgsICA4LCAgOSwgIDMsICA4LCAgOCwgIDksICA0LCAgOSwgIDksICA5LCAgMywKKyAgICAgOCwgIDgsICA5LCAgNSwgMTAsIDEwLCAxMCwgIDYsIDExLCAxMSwgMTEsICA1LCAxMCwgMTAsIDEwLCAgMywKKyAgICAgOCwgIDgsICA4LCAgNiwgMTEsIDExLCAxMSwgIDUsIDEwLCAxMCwgMTAsICA1LCAgOSwgIDksICA5LCAgNCwKKyAgICAgOSwgIDksICA5LCAgNSwgIDksICA5LCAgOSwgIDUsICA5LCAgOSwgIDksICA1LCAgOCwgIDgsICA5CisgIH0sCisgIHsKKyAgICAgNiwgIDYsIDEwLCAgMywgIDcsICA3LCAgNywgIDMsICA3LCAgNywgIDcsICA0LCAgOCwgIDgsICA4LCAgMywKKyAgICAgNywgIDcsICA3LCAgNSwgIDksICA5LCAgOSwgIDYsIDEwLCAxMCwgMTAsICA2LCAxMCwgMTAsIDEwLCAgMywKKyAgICAgNywgIDcsICA3LCAgNiwgMTAsIDEwLCAxMCwgIDUsICA5LCAgOSwgIDksICA2LCAxMCwgMTAsIDEwLCAgNCwKKyAgICAgOCwgIDgsICA4LCAgNiwgMTAsIDEwLCAxMCwgIDUsICA5LCAgOSwgIDksICA2LCAgOSwgIDksICA5CisgIH0KK307CisKKy8qIE1hY3JvQmxvY2sgVHJhbnNmb3JtIFR5cGU6IDcuMS4zLjExLCBwODkKKyAqIDh4ODpCCisgKiA4eDQ6QjpidG0gIDh4NDpCOnRvcCAgOHg0OkI6Ym90aCwKKyAqIDR4ODpCOnJpZ2h0ICA0eDg6QjpsZWZ0ICA0eDg6Qjpib3RoCisgKiA0eDQ6QiAgOHg4Ok1CCisgKiA4eDQ6TUI6YnRtICA4eDQ6TUI6dG9wICA4eDQsTUIsYm90aAorICogNHg4LE1CLHJpZ2h0ICA0eDgsTUIsbGVmdAorICogNHg0LE1CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitjb25zdCB1aW50MTZfdCBmZl92YzFfdHRtYl9jb2Rlc1szXVsxNl0gPSB7CisgIHsKKyAgICAweDAwMDMsCisgICAgMHgwMDJFLCAweDAwNUYsIDB4MDAwMCwKKyAgICAweDAwMTYsIDB4MDAxNSwgMHgwMDAxLAorICAgIDB4MDAwNCwgMHgwMDE0LAorICAgIDB4MDJGMSwgMHgwMTc5LCAweDAxN0IsCisgICAgMHgwQkMwLCAweDBCQzEsIDB4MDVFMSwKKyAgICAweDAxN0EKKyAgfSwKKyAgeworICAgIDB4MDAwNiwKKyAgICAweDAwMDYsIDB4MDAwMywgMHgwMDA3LAorICAgIDB4MDAwRiwgMHgwMDBFLCAweDAwMDAsCisgICAgMHgwMDAyLCAweDAwMDIsCisgICAgMHgwMDE0LCAweDAwMTEsIDB4MDAwQiwKKyAgICAweDAwMDksIDB4MDAyMSwgMHgwMDE1LAorICAgIDB4MDAyMAorICB9LAorICB7CisgICAgMHgwMDA2LAorICAgIDB4MDAwMCwgMHgwMDBFLCAweDAwMDUsCisgICAgMHgwMDAyLCAweDAwMDMsIDB4MDAwMywKKyAgICAweDAwMEYsIDB4MDAwMiwKKyAgICAweDAwODEsIDB4MDAyMSwgMHgwMDA5LAorICAgIDB4MDEwMSwgMHgwMDQxLCAweDAwMTEsCisgICAgMHgwMTAwCisgIH0KK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdmMxX3R0bWJfYml0c1szXVsxNl0gPSB7CisgIHsKKyAgICAgMiwKKyAgICAgNiwgIDcsICAyLAorICAgICA1LCAgNSwgIDIsCisgICAgIDMsICA1LAorICAgIDEwLCAgOSwgIDksCisgICAgMTIsIDEyLCAxMSwKKyAgICAgOQorICB9LAorICB7CisgICAgMywKKyAgICA0LCA0LCA0LAorICAgIDQsIDQsIDMsCisgICAgMywgMiwKKyAgICA3LCA3LCA2LAorICAgIDYsIDgsIDcsCisgICAgOAorICB9LAorICB7CisgICAgIDMsCisgICAgIDMsIDQsIDUsCisgICAgIDMsIDMsIDQsCisgICAgIDQsIDIsCisgICAgMTAsIDgsIDYsCisgICAgMTEsIDksIDcsCisgICAgMTEKKyAgfQorfTsKKworLyogVFRCTEsgKFRyYW5zZm9ybSBUeXBlIHBlciBCbG9jaykgdGFibGVzICovCitjb25zdCB1aW50OF90IGZmX3ZjMV90dGJsa19jb2Rlc1szXVs4XSA9IHsKKyAgICB7ICAwLCAgMSwgIDMsICA1LCAxNiwgMTcsIDE4LCAxOSB9LAorICAgIHsgIDMsICAwLCAgMSwgIDIsICAzLCAgNSwgIDgsICA5IH0sCisgICAgeyAgMSwgIDAsICAxLCAgNCwgIDYsICA3LCAxMCwgMTEgfQorfTsKK2NvbnN0IHVpbnQ4X3QgZmZfdmMxX3R0YmxrX2JpdHNbM11bOF0gPSB7CisgICAgeyAgMiwgIDIsICAyLCAgMywgIDUsICA1LCAgNSwgIDUgfSwKKyAgICB7ICAyLCAgMywgIDMsICAzLCAgMywgIDMsICA0LCAgNCB9LAorICAgIHsgIDIsICAzLCAgMywgIDMsICAzLCAgMywgIDQsICA0IH0KK307CisKKy8qIFNVQkJMS1BBVCB0YWJsZXMsIHA5My05NCwgcmVvcmRlcmVkICovCitjb25zdCB1aW50OF90IGZmX3ZjMV9zdWJibGtwYXRfY29kZXNbM11bMTVdID0geworICAgIHsgMTQsIDEyLCAgNywgMTEsICA5LCAyNiwgIDIsIDEwLCAyNywgIDgsICAwLCAgNiwgIDEsIDE1LCAgMSB9LAorICAgIHsgMTQsICAwLCAgOCwgMTUsIDEwLCAgNCwgMjMsIDEzLCAgNSwgIDksIDI1LCAgMywgMjQsIDIyLCAgMSB9LAorICAgIHsgIDUsICA2LCAgMiwgIDIsICA4LCAgMCwgMjgsICAzLCAgMSwgIDMsIDI5LCAgMSwgMTksIDE4LCAxNSB9Cit9OworY29uc3QgdWludDhfdCBmZl92YzFfc3ViYmxrcGF0X2JpdHNbM11bMTVdID0geworICAgIHsgIDUsICA1LCAgNSwgIDUsICA1LCAgNiwgIDQsICA1LCAgNiwgIDUsICA0LCAgNSwgIDQsICA1LCAgMX0sCisgICAgeyAgNCwgIDMsICA0LCAgNCwgIDQsICA1LCAgNSwgIDQsICA1LCAgNCwgIDUsICA0LCAgNSwgIDUsICAyfSwKKyAgICB7ICAzLCAgMywgIDQsICAzLCAgNCwgIDUsICA1LCAgMywgIDUsICA0LCAgNSwgIDQsICA1LCAgNSwgIDR9Cit9OworCisvKiBNViBkaWZmZXJlbnRpYWwgdGFibGVzLCBwMjY1ICovCitjb25zdCB1aW50MTZfdCBmZl92YzFfbXZfZGlmZl9jb2Rlc1s0XVs3M10gPSB7CisgIHsKKyAgICAgICAwLCAgICAyLCAgICAzLCAgICA4LCAgNTc2LCAgICAzLCAgICAyLCAgICA2LAorICAgICAgIDUsICA1NzcsICA1NzgsICAgIDcsICAgIDgsICAgIDksICAgNDAsICAgMTksCisgICAgICAzNywgICA4MiwgICAyMSwgICAyMiwgICAyMywgIDU3OSwgIDU4MCwgIDE2NiwKKyAgICAgIDk2LCAgMTY3LCAgIDQ5LCAgMTk0LCAgMTk1LCAgNTgxLCAgNTgyLCAgNTgzLAorICAgICAyOTIsICAyOTMsICAyOTQsICAgMTMsICAgIDIsICAgIDcsICAgMjQsICAgNTAsCisgICAgIDEwMiwgIDI5NSwgICAxMywgICAgNywgICAgOCwgICAxOCwgICA1MCwgIDEwMywKKyAgICAgIDM4LCAgIDIwLCAgIDIxLCAgIDIyLCAgIDM5LCAgMjA0LCAgMTAzLCAgIDIzLAorICAgICAgMjQsICAgMjUsICAxMDQsICA0MTAsICAxMDUsICAxMDYsICAxMDcsICAxMDgsCisgICAgIDEwOSwgIDIyMCwgIDQxMSwgIDQ0MiwgIDIyMiwgIDQ0MywgIDQ0NiwgIDQ0NywKKyAgICAgICA3IC8qIDczIGVsZW1lbnRzICovCisgIH0sCisgIHsKKyAgICAgICAwLCAgICA0LCAgICA1LCAgICAzLCAgICA0LCAgICAzLCAgICA0LCAgICA1LAorICAgICAgMjAsICAgIDYsICAgMjEsICAgNDQsICAgNDUsICAgNDYsIDMwMDgsICAgOTUsCisgICAgIDExMiwgIDExMywgICA1NywgMzAwOSwgMzAxMCwgIDExNiwgIDExNywgMzAxMSwKKyAgICAgMTE4LCAzMDEyLCAzMDEzLCAzMDE0LCAzMDE1LCAzMDE2LCAzMDE3LCAzMDE4LAorICAgIDMwMTksIDMwMjAsIDMwMjEsIDMwMjIsICAgIDEsICAgIDQsICAgMTUsICAxNjAsCisgICAgIDE2MSwgICA0MSwgICAgNiwgICAxMSwgICA0MiwgIDE2MiwgICA0MywgIDExOSwKKyAgICAgIDU2LCAgIDU3LCAgIDU4LCAgMTYzLCAgMjM2LCAgMjM3LCAzMDIzLCAgMTE5LAorICAgICAxMjAsICAyNDIsICAxMjIsICA0ODYsIDE1MTIsICA0ODcsICAyNDYsICA0OTQsCisgICAgMTUxMywgIDQ5NSwgMTUxNCwgMTUxNSwgMTUxNiwgMTUxNywgMTUxOCwgMTUxOSwKKyAgICAgIDMxIC8qIDczIGVsZW1lbnRzICovCisgIH0sCisgIHsKKyAgICAgICAwLCAgNTEyLCAgNTEzLCAgNTE0LCAgNTE1LCAgICAyLCAgICAzLCAgMjU4LAorICAgICAyNTksICAyNjAsICAyNjEsICAyNjIsICAyNjMsICAyNjQsICAyNjUsICAyNjYsCisgICAgIDI2NywgIDI2OCwgIDI2OSwgIDI3MCwgIDI3MSwgIDI3MiwgIDI3MywgIDI3NCwKKyAgICAgMjc1LCAgMjc2LCAgMjc3LCAgMjc4LCAgMjc5LCAgMjgwLCAgMjgxLCAgMjgyLAorICAgICAyODMsICAyODQsICAyODUsICAyODYsICAgIDEsICAgIDUsICAyODcsICAyODgsCisgICAgIDI4OSwgIDI5MCwgICAgNiwgICAgNywgIDI5MSwgIDI5MiwgIDI5MywgIDI5NCwKKyAgICAgMjk1LCAgMjk2LCAgMjk3LCAgMjk4LCAgMjk5LCAgMzAwLCAgMzAxLCAgMzAyLAorICAgICAzMDMsICAzMDQsICAzMDUsICAzMDYsICAzMDcsICAzMDgsICAzMDksICAzMTAsCisgICAgIDMxMSwgIDMxMiwgIDMxMywgIDMxNCwgIDMxNSwgIDMxNiwgIDMxNywgIDMxOCwKKyAgICAgMzE5IC8qIDczIGVsZW1lbnRzICovCisgIH0sCisgIHsKKyAgICAgICAwLCAgICAxLCAgICAxLCAgICAyLCAgICAzLCAgICA0LCAgICAxLCAgICA1LAorICAgICAgIDQsICAgIDMsICAgIDUsICAgIDgsICAgIDYsICAgIDksICAgMTAsICAgMTEsCisgICAgICAxMiwgICAgNywgIDEwNCwgICAxNCwgIDEwNSwgICAgNCwgICAxMCwgICAxNSwKKyAgICAgIDExLCAgICA2LCAgIDE0LCAgICA4LCAgMTA2LCAgMTA3LCAgMTA4LCAgIDE1LAorICAgICAxMDksICAgIDksICAgNTUsICAgMTAsICAgIDEsICAgIDIsICAgIDEsICAgIDIsCisgICAgICAgMywgICAxMiwgICAgNiwgICAgMiwgICAgNiwgICAgNywgICAyOCwgICAgNywKKyAgICAgIDE1LCAgICA4LCAgICA1LCAgIDE4LCAgIDI5LCAgMTUyLCAgIDc3LCAgIDI0LAorICAgICAgMjUsICAgMjYsICAgMzksICAxMDgsICAgMTMsICAxMDksICAgNTUsICAgNTYsCisgICAgICA1NywgIDExNiwgICAxMSwgIDE1MywgIDIzNCwgIDIzNSwgIDExOCwgIDExOSwKKyAgICAgIDE1IC8qIDczIGVsZW1lbnRzICovCisgIH0KK307Citjb25zdCB1aW50OF90IGZmX3ZjMV9tdl9kaWZmX2JpdHNbNF1bNzNdID0geworICB7CisgICAgIDYsICA3LCAgNywgIDgsIDE0LCAgNiwgIDUsICA2LCAgNywgMTQsIDE0LCAgNiwgIDYsICA2LCAgOCwgIDksCisgICAgMTAsICA5LCAgNywgIDcsICA3LCAxNCwgMTQsIDEwLCAgOSwgMTAsICA4LCAxMCwgMTAsIDE0LCAxNCwgMTQsCisgICAgMTMsIDEzLCAxMywgIDYsICAzLCAgNSwgIDYsICA4LCAgOSwgMTMsICA1LCAgNCwgIDQsICA1LCAgNywgIDksCisgICAgIDYsICA1LCAgNSwgIDUsICA2LCAgOSwgIDgsICA1LCAgNSwgIDUsICA3LCAxMCwgIDcsICA3LCAgNywgIDcsCisgICAgIDcsICA4LCAxMCwgIDksICA4LCAgOSwgIDksICA5LCAgMyAvKiA3MyBlbGVtZW50cyAqLworICB9LAorICB7CisgICAgIDUsICA3LCAgNywgIDYsICA2LCAgNSwgIDUsICA2LCAgNywgIDUsICA3LCAgOCwgIDgsICA4LCAxNCwgIDksCisgICAgIDksICA5LCAgOCwgMTQsIDE0LCAgOSwgIDksIDE0LCAgOSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsICAyLCAgMywgIDYsICA4LCAgOCwgIDYsICAzLCAgNCwgIDYsICA4LCAgNiwgIDksCisgICAgIDYsICA2LCAgNiwgIDgsICA4LCAgOCwgMTQsICA3LCAgNywgIDgsICA3LCAgOSwgMTMsICA5LCAgOCwgIDksCisgICAgMTMsICA5LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAgNSAvKiA3MyBlbGVtZW50cyAqLworCisgIH0sCisgIHsKKyAgICAgMywgMTIsIDEyLCAxMiwgMTIsICAzLCAgNCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgIDEsICA1LCAxMSwgMTEsIDExLCAxMSwgIDQsICA0LCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExIC8qIDczIGVsZW1lbnRzICovCisgIH0sCisgIHsKKyAgICAxNSwgMTEsIDE1LCAxNSwgMTUsIDE1LCAxMiwgMTUsIDEyLCAxMSwgMTIsIDEyLCAxNSwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTUsIDE1LCAxMiwgMTUsIDEwLCAxMSwgMTIsIDExLCAxMCwgMTEsIDEwLCAxNSwgMTUsIDE1LCAxMSwKKyAgICAxNSwgMTAsIDE0LCAxMCwgIDQsICA0LCAgNSwgIDcsICA4LCAgOSwgIDUsICAzLCAgNCwgIDUsICA2LCAgOCwKKyAgICAgNSwgIDQsICAzLCAgNSwgIDYsICA4LCAgNywgIDUsICA1LCAgNSwgIDYsICA3LCAgOSwgIDcsICA2LCAgNiwKKyAgICAgNiwgIDcsIDEwLCAgOCwgIDgsICA4LCAgNywgIDcsICA0IC8qIDczIGVsZW1lbnRzICovCisgIH0KK307CisKKy8qIERDIGRpZmZlcmVudGlhbHMgbG93K2hpLW1vLCBwMjE3IGFyZSB0aGUgc2FtZSBhcyBpbiBtc21wZWc0ZGF0YSAuaCAqLworCisvKiBUYWJsZSAyMzIgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfdmMxX3NpbXBsZV9wcm9ncmVzc2l2ZV80eDRfenogWzE2XSA9IHsKKyAgICAgMCwgICAgIDgsICAgIDE2LCAgICAgMSwKKyAgICAgOSwgICAgMjQsICAgIDE3LCAgICAgMiwKKyAgICAxMCwgICAgMTgsICAgIDI1LCAgICAgMywKKyAgICAxMSwgICAgMjYsICAgIDE5LCAgICAyNworfTsKKworY29uc3QgdWludDhfdCBmZl92YzFfYWR2X3Byb2dyZXNzaXZlXzh4NF96eiBbMzJdID0geyAvKiBUYWJsZSAyMzMgKi8KKyAgICAgMCwgICAgIDgsICAgICAxLCAgICAxNiwgICAgIDIsICAgICA5LCAgICAxMCwgICAgIDMsCisgICAgMjQsICAgIDE3LCAgICAgNCwgICAgMTEsICAgIDE4LCAgICAxMiwgICAgIDUsICAgIDE5LAorICAgIDI1LCAgICAxMywgICAgMjAsICAgIDI2LCAgICAyNywgICAgIDYsICAgIDIxLCAgICAyOCwKKyAgICAxNCwgICAgMjIsICAgIDI5LCAgICAgNywgICAgMzAsICAgIDE1LCAgICAyMywgICAgMzEKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdmMxX2Fkdl9wcm9ncmVzc2l2ZV80eDhfenogWzMyXSA9IHsgLyogVGFibGUgMjM0ICovCisgICAgIDAsICAgICAxLCAgICAgOCwgICAgIDIsCisgICAgIDksICAgIDE2LCAgICAxNywgICAgMjQsCisgICAgMTAsICAgIDMyLCAgICAyNSwgICAgMTgsCisgICAgNDAsICAgICAzLCAgICAzMywgICAgMjYsCisgICAgNDgsICAgIDExLCAgICA1NiwgICAgNDEsCisgICAgMzQsICAgIDQ5LCAgICA1NywgICAgNDIsCisgICAgMTksICAgIDUwLCAgICAyNywgICAgNTgsCisgICAgMzUsICAgIDQzLCAgICA1MSwgICAgNTkKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdmMxX2Fkdl9pbnRlcmxhY2VkXzh4OF96eiBbNjRdID0geyAvKiBUYWJsZSAyMzUgKi8KKyAgICAgMCwgICAgIDgsICAgICAxLCAgICAxNiwgICAgMjQsICAgICA5LCAgICAgMiwgICAgMzIsCisgICAgNDAsICAgIDQ4LCAgICA1NiwgICAgMTcsICAgIDEwLCAgICAgMywgICAgMjUsICAgIDE4LAorICAgIDExLCAgICAgNCwgICAgMzMsICAgIDQxLCAgICA0OSwgICAgNTcsICAgIDI2LCAgICAzNCwKKyAgICA0MiwgICAgNTAsICAgIDU4LCAgICAxOSwgICAgMTIsICAgICA1LCAgICAyNywgICAgMjAsCisgICAgMTMsICAgICA2LCAgICAzNSwgICAgMjgsICAgIDIxLCAgICAxNCwgICAgIDcsICAgIDE1LAorICAgIDIyLCAgICAyOSwgICAgMzYsICAgIDQzLCAgICA1MSwgICAgNTksICAgIDYwLCAgICA1MiwKKyAgICA0NCwgICAgMzcsICAgIDMwLCAgICAyMywgICAgMzEsICAgIDM4LCAgICA0NSwgICAgNTMsCisgICAgNjEsICAgIDYyLCAgICA1NCwgICAgNDYsICAgIDM5LCAgICA0NywgICAgNTUsICAgIDYzCit9OworCitjb25zdCB1aW50OF90IGZmX3ZjMV9hZHZfaW50ZXJsYWNlZF84eDRfenogWzMyXSA9IHsgLyogVGFibGUgMjM2ICovCisgICAgIDAsICAgICA4LCAgICAxNiwgICAgMjQsICAgICAxLCAgICAgOSwgICAgIDIsICAgIDE3LAorICAgIDI1LCAgICAxMCwgICAgIDMsICAgIDE4LCAgICAyNiwgICAgIDQsICAgIDExLCAgICAxOSwKKyAgICAxMiwgICAgIDUsICAgIDEzLCAgICAyMCwgICAgMjcsICAgICA2LCAgICAyMSwgICAgMjgsCisgICAgMTQsICAgIDIyLCAgICAyOSwgICAgIDcsICAgIDMwLCAgICAxNSwgICAgMjMsICAgIDMxCit9OworCitjb25zdCB1aW50OF90IGZmX3ZjMV9hZHZfaW50ZXJsYWNlZF80eDhfenogWzMyXSA9IHsgLyogVGFibGUgMjM3ICovCisgICAgIDAsICAgICAxLCAgICAgMiwgICAgIDgsCisgICAgMTYsICAgICA5LCAgICAyNCwgICAgMTcsCisgICAgMTAsICAgICAzLCAgICAzMiwgICAgNDAsCisgICAgNDgsICAgIDU2LCAgICAyNSwgICAgMTgsCisgICAgMzMsICAgIDI2LCAgICA0MSwgICAgMzQsCisgICAgNDksICAgIDU3LCAgICAxMSwgICAgNDIsCisgICAgMTksICAgIDUwLCAgICAyNywgICAgNTgsCisgICAgMzUsICAgIDQzLCAgICA1MSwgICAgNTkKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdmMxX2Fkdl9pbnRlcmxhY2VkXzR4NF96eiBbMTZdID0geyAvKiBUYWJsZSAyMzggKi8KKyAgICAgMCwgICAgIDgsICAgIDE2LCAgICAyNCwKKyAgICAgMSwgICAgIDksICAgIDE3LCAgICAgMiwKKyAgICAyNSwgICAgMTAsICAgIDE4LCAgICAgMywKKyAgICAyNiwgICAgMTEsICAgIDE5LCAgICAyNworfTsKKworCisvKiBEUVNjYWxlIGFzIHNwZWNpZmllZCBpbiA4LjEuMy45IC0gYWxtb3N0IGlkZW50aWNhbCB0byAweDQwMDAwL2kgKi8KK2NvbnN0IGludDMyX3QgZmZfdmMxX2Rxc2NhbGVbNjNdID0geworICAgIDB4NDAwMDAsIDB4MjAwMDAsIDB4MTU1NTUsIDB4MTAwMDAsIDB4Q0NDRCwgMHhBQUFCLCAweDkyNDksIDB4ODAwMCwKKyAgICAgMHg3MUM3LCAgMHg2NjY2LCAgMHg1RDE3LCAgMHg1NTU1LCAweDRFQzUsIDB4NDkyNSwgMHg0NDQ0LCAweDQwMDAsCisgICAgIDB4M0MzQywgIDB4MzhFNCwgIDB4MzVFNSwgIDB4MzMzMywgMHgzMEMzLCAweDJFOEMsIDB4MkM4NiwgMHgyQUFCLAorICAgICAweDI4RjYsICAweDI3NjIsICAweDI1RUQsICAweDI0OTIsIDB4MjM0RiwgMHgyMjIyLCAweDIxMDgsIDB4MjAwMCwKKyAgICAgMHgxRjA4LCAgMHgxRTFFLCAgMHgxRDQyLCAgMHgxQzcyLCAweDFCQUQsIDB4MUFGMywgMHgxQTQyLCAweDE5OUEsCisgICAgIDB4MThGQSwgIDB4MTg2MiwgIDB4MTdEMCwgIDB4MTc0NiwgMHgxNkMxLCAweDE2NDMsIDB4MTVDQSwgMHgxNTU1LAorICAgICAweDE0RTYsICAweDE0N0IsICAweDE0MTQsICAweDEzQjEsIDB4MTM1MiwgMHgxMkY3LCAweDEyOUUsIDB4MTI0OSwKKyAgICAgMHgxMUY3LCAgMHgxMUE4LCAgMHgxMTVCLCAgMHgxMTExLCAweDEwQzksIDB4MTA4NCwgMHgxMDAwCit9OworCisvKiBQIEludGVybGFjZWQgZmllbGQgcGljdHVyZSBNViBwcmVkaWN0b3Igc2NhbGluZyB2YWx1ZXMgKFRhYmxlIDExNCkgKi8KK2NvbnN0IHVpbnQxNl90IGZmX3ZjMV9maWVsZF9tdnByZWRfc2NhbGVzWzJdWzddWzRdID0geworLy8gUmVmZGlzdDoKKy8vICAgICAgMCAgICAgICAxICAgICAgIDIgICAgICAgMyBvciBncmVhdGVyCisgIHsgLy8gY3VycmVudCBmaWVsZCBpcyBmaXJzdAorICAgIHsgMTI4LCAgICAxOTIsICAgIDIxMywgICAgMjI0IH0sICAgLy8gU0NBTEVPUFAKKyAgICB7IDUxMiwgICAgMzQxLCAgICAzMDcsICAgIDI5MyB9LCAgIC8vIFNDQUxFU0FNRTEKKyAgICB7IDIxOSwgICAgMjM2LCAgICAyNDIsICAgIDI0NSB9LCAgIC8vIFNDQUxFU0FNRTIKKyAgICB7ICAzMiwgICAgIDQ4LCAgICAgNTMsICAgICA1NiB9LCAgIC8vIFNDQUxFWk9ORTFfWAorICAgIHsgICA4LCAgICAgMTIsICAgICAxMywgICAgIDE0IH0sICAgLy8gU0NBTEVaT05FMV9ZCisgICAgeyAgMzcsICAgICAyMCwgICAgIDE0LCAgICAgMTEgfSwgICAvLyBaT05FMU9GRlNFVF9YCisgICAgeyAgMTAsICAgICAgNSwgICAgICA0LCAgICAgIDMgfSAgICAvLyBaT05FMU9GRlNFVF9ZCisgIH0sCisgIHsgLy8gY3VycmVudCBmaWVsZCBpcyBzZWNvbmQKKyAgICB7IDEyOCwgICAgIDY0LCAgICAgNDMsICAgICAzMiB9LCAgIC8vIFNDQUxFT1BQCisgICAgeyA1MTIsICAgMTAyNCwgICAxNTM2LCAgIDIwNDggfSwgICAvLyBTQ0FMRVNBTUUxCisgICAgeyAyMTksICAgIDIwNCwgICAgMjAwLCAgICAxOTggfSwgICAvLyBTQ0FMRVNBTUUyCisgICAgeyAgMzIsICAgICAxNiwgICAgIDExLCAgICAgIDggfSwgICAvLyBTQ0FMRVpPTkUxX1gKKyAgICB7ICAgOCwgICAgICA0LCAgICAgIDMsICAgICAgMiB9LCAgIC8vIFNDQUxFWk9ORTFfWQorICAgIHsgIDM3LCAgICAgNTIsICAgICA1NiwgICAgIDU4IH0sICAgLy8gWk9ORTFPRkZTRVRfWAorICAgIHsgIDEwLCAgICAgMTMsICAgICAxNCwgICAgIDE1IH0gICAgLy8gWk9ORTFPRkZTRVRfWQorICB9Cit9OworCisvKiBCIEludGVybGFjZWQgZmllbGQgcGljdHVyZSBiYWNrd2FyZCBNViBwcmVkaWN0b3Igc2NhbGluZyB2YWx1ZXMgZm9yIGZpcnN0IGZpZWxkIChUYWJsZSAxMTUpICovCitjb25zdCB1aW50MTZfdCBmZl92YzFfYl9maWVsZF9tdnByZWRfc2NhbGVzWzddWzRdID0geworICAgIC8vIEJSRkQ6CisgICAgLy8gIDAgICAgICAgMSAgICAgICAyICAgICAgIDMgb3IgZ3JlYXRlcgorICAgIHsgMTcxLCAgICAyMDUsICAgIDIxOSwgICAgMjI4IH0sICAgLy8gU0NBTEVTQU1FCisgICAgeyAzODQsICAgIDMyMCwgICAgMjk5LCAgICAyODggfSwgICAvLyBTQ0FMRU9QUDEKKyAgICB7IDIzMCwgICAgMjM5LCAgICAyNDQsICAgIDI0NiB9LCAgIC8vIFNDQUxFT1BQMgorICAgIHsgIDQzLCAgICAgNTEsICAgICA1NSwgICAgIDU3IH0sICAgLy8gU0NBTEVaT05FMV9YCisgICAgeyAgMTEsICAgICAxMywgICAgIDE0LCAgICAgMTQgfSwgICAvLyBTQ0FMRVpPTkUxX1kKKyAgICB7ICAyNiwgICAgIDE3LCAgICAgMTIsICAgICAxMCB9LCAgIC8vIFpPTkUxT0ZGU0VUX1gKKyAgICB7ICAgNywgICAgICA0LCAgICAgIDMsICAgICAgMyB9ICAgIC8vIFpPTkUxT0ZGU0VUX1kKK307CisKK2NvbnN0IGludCBmZl92YzFfYWNfc2l6ZXNbQUNfTU9ERVNdID0geworICAgIDE4NiwgMTY5LCAxMzMsIDE0OSwgMTAzLCAxMDMsIDE2MywgMTc1Cit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmMxZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmMxZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2M2NkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92YzFkYXRhLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBWQy0xIGFuZCBXTVYzIGRlY29kZXIKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBLb25zdGFudGluIFNoaXNoa292CisgKiAoYykgMjAwNSBhbm9ueW1vdXMsIEFsZXggQmVyZWdzemFzemksIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVkMtMSB0YWJsZXMuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZDMURBVEFfSAorI2RlZmluZSBBVkNPREVDX1ZDMURBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL3JhdGlvbmFsLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworLyoqIFRhYmxlIGZvciBjb252ZXJzaW9uIGJldHdlZW4gVFRCTEsgYW5kIFRUTUIgKi8KK2V4dGVybiBjb25zdCBpbnQgZmZfdmMxX3R0YmxrX3RvX3R0WzNdWzhdOworCitleHRlcm4gY29uc3QgaW50IGZmX3ZjMV90dGZybV90b190dFs0XTsKKworLyoqIE1WIFAgbW9kZSAtIHRoZSA1dGggZWxlbWVudCBpcyBvbmx5IHVzZWQgZm9yIG1vZGUgMSAqLworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX212X3Btb2RlX3RhYmxlWzJdWzVdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX212X3Btb2RlX3RhYmxlMlsyXVs0XTsKKworZXh0ZXJuIGNvbnN0IGludCBmZl92YzFfZnBzX25yWzddLCBmZl92YzFfZnBzX2RyWzJdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX3BxdWFudF90YWJsZVszXVszMl07CisKKy8qIE1CTU9ERSB0YWJsZSBmb3IgaW50ZXJsYWNlZCBmcmFtZSBQLXBpY3R1cmUgKi8KK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZjMV9tYm1vZGVfaW50ZnJwWzJdWzE1XVs0XTsKKworLyoqIEBuYW1lIFZDLTEgVkxDIHRhYmxlcyBhbmQgZGVmaW5lcworICogIEB0b2RvIFRPRE8gbW92ZSB0aGlzIGludG8gdGhlIGNvbnRleHQKKyAqLworLy9AeworI2RlZmluZSBWQzFfQkZSQUNUSU9OX1ZMQ19CSVRTIDcKK2V4dGVybiBWTEMgZmZfdmMxX2JmcmFjdGlvbl92bGM7CisjZGVmaW5lIFZDMV9JTU9ERV9WTENfQklUUyA0CitleHRlcm4gVkxDIGZmX3ZjMV9pbW9kZV92bGM7CisjZGVmaW5lIFZDMV9OT1JNMl9WTENfQklUUyAzCitleHRlcm4gVkxDIGZmX3ZjMV9ub3JtMl92bGM7CisjZGVmaW5lIFZDMV9OT1JNNl9WTENfQklUUyA5CitleHRlcm4gVkxDIGZmX3ZjMV9ub3JtNl92bGM7CisvKiBDb3VsZCBiZSBvcHRpbWl6ZWQsIG9uZSB0YWJsZSBvbmx5IG5lZWRzIDggYml0cyAqLworI2RlZmluZSBWQzFfVFRNQl9WTENfQklUUyA5IC8vMTIKK2V4dGVybiBWTEMgZmZfdmMxX3R0bWJfdmxjWzNdOworI2RlZmluZSBWQzFfTVZfRElGRl9WTENfQklUUyA5IC8vMTUKK2V4dGVybiBWTEMgZmZfdmMxX212X2RpZmZfdmxjWzRdOworI2RlZmluZSBWQzFfQ0JQQ1lfUF9WTENfQklUUyA5IC8vMTQKK2V4dGVybiBWTEMgZmZfdmMxX2NicGN5X3BfdmxjWzRdOworI2RlZmluZSBWQzFfSUNCUENZX1ZMQ19CSVRTIDkKK2V4dGVybiBWTEMgZmZfdmMxX2ljYnBjeV92bGNbOF07CisjZGVmaW5lIFZDMV80TVZfQkxPQ0tfUEFUVEVSTl9WTENfQklUUyA2CitleHRlcm4gVkxDIGZmX3ZjMV80bXZfYmxvY2tfcGF0dGVybl92bGNbNF07CisjZGVmaW5lIFZDMV8yTVZfQkxPQ0tfUEFUVEVSTl9WTENfQklUUyAzCitleHRlcm4gVkxDIGZmX3ZjMV8ybXZfYmxvY2tfcGF0dGVybl92bGNbNF07CisjZGVmaW5lIFZDMV9UVEJMS19WTENfQklUUyA1CitleHRlcm4gVkxDIGZmX3ZjMV90dGJsa192bGNbM107CisjZGVmaW5lIFZDMV9TVUJCTEtQQVRfVkxDX0JJVFMgNgorZXh0ZXJuIFZMQyBmZl92YzFfc3ViYmxrcGF0X3ZsY1szXTsKKyNkZWZpbmUgVkMxX0lOVEZSXzRNVl9NQk1PREVfVkxDX0JJVFMgOQorZXh0ZXJuIFZMQyBmZl92YzFfaW50ZnJfNG12X21ibW9kZV92bGNbNF07CisjZGVmaW5lIFZDMV9JTlRGUl9OT040TVZfTUJNT0RFX1ZMQ19CSVRTIDYKK2V4dGVybiBWTEMgZmZfdmMxX2ludGZyX25vbjRtdl9tYm1vZGVfdmxjWzRdOworI2RlZmluZSBWQzFfSUZfTU1WX01CTU9ERV9WTENfQklUUyA1CitleHRlcm4gVkxDIGZmX3ZjMV9pZl9tbXZfbWJtb2RlX3ZsY1s4XTsKKyNkZWZpbmUgVkMxX0lGXzFNVl9NQk1PREVfVkxDX0JJVFMgNQorZXh0ZXJuIFZMQyBmZl92YzFfaWZfMW12X21ibW9kZV92bGNbOF07CisjZGVmaW5lIFZDMV8xUkVGX01WREFUQV9WTENfQklUUyA5CitleHRlcm4gVkxDIGZmX3ZjMV8xcmVmX212ZGF0YV92bGNbNF07CisjZGVmaW5lIFZDMV8yUkVGX01WREFUQV9WTENfQklUUyA5CitleHRlcm4gVkxDIGZmX3ZjMV8ycmVmX212ZGF0YV92bGNbOF07CisKK2V4dGVybiBWTEMgZmZfdmMxX2FjX2NvZWZmX3RhYmxlWzhdOworCisjZGVmaW5lIFZDMV9JRl9NQk1PREVfVkxDX0JJVFMgNQorLy9AfQorCisjZGVmaW5lIEJfRlJBQ1RJT05fREVOICAyNTYKKworLyogcHJlLWNvbXB1dGVkIHNjYWxlcyBmb3IgYWxsIGJmcmFjdGlvbnMgYW5kIGJhc2U9MjU2ICovCitleHRlcm4gY29uc3QgaW50MTZfdCBmZl92YzFfYmZyYWN0aW9uX2x1dFsyM107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfYmZyYWN0aW9uX2JpdHNbMjNdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX2JmcmFjdGlvbl9jb2Rlc1syM107CisKKy8vU2FtZSBhcyBILjI2NAorZXh0ZXJuIGNvbnN0IEFWUmF0aW9uYWwgZmZfdmMxX3BpeGVsX2FzcGVjdFsxNl07CisKKy8qIEJpdFBsYW5lIElNT0RFIC0gc3VjaCBhIHNtYWxsIHRhYmxlLi4uICovCitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfaW1vZGVfY29kZXNbN107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfaW1vZGVfYml0c1s3XTsKKworLyogTm9ybWFsLTIgaW1vZGUgKi8KK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZjMV9ub3JtMl9jb2Rlc1s0XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZjMV9ub3JtMl9iaXRzWzRdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3ZjMV9ub3JtNl9jb2Rlc1s2NF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfbm9ybTZfYml0c1s2NF07CisvKiBOb3JtYWwtNiBpbW9kZSAqLworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX25vcm02X3NwZWNbNjRdWzVdOworCisvKiA0TVYgQmxvY2sgcGF0dGVybiBWTEMgdGFibGVzICovCitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfNG12X2Jsb2NrX3BhdHRlcm5fY29kZXNbNF1bMTZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxXzRtdl9ibG9ja19wYXR0ZXJuX2JpdHNbNF1bMTZdOworCisvKiAyTVYgQmxvY2sgcGF0dGVybiBWTEMgdGFibGVzICovCitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfMm12X2Jsb2NrX3BhdHRlcm5fY29kZXNbNF1bNF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfMm12X2Jsb2NrX3BhdHRlcm5fYml0c1s0XVs0XTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfd212M19kY19zY2FsZV90YWJsZVszMl07CisKKy8qIFAtUGljdHVyZSBDQlBDWSBWTEMgdGFibGVzICovCitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfdmMxX2NicGN5X3BfY29kZXNbNF1bNjRdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX2NicGN5X3BfYml0c1s0XVs2NF07CisKKy8qIEludGVybGFjZWQgQ0JQQ1kgVkxDIHRhYmxlcyAoVGFibGUgMTI0IC0gVGFibGUgMTMxKSAqLworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3ZjMV9pY2JwY3lfcF9jb2Rlc1s4XVs2M107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfaWNicGN5X3BfYml0c1s4XVs2M107CisKKy8qIE1hY3JvQmxvY2sgVHJhbnNmb3JtIFR5cGU6IDcuMS4zLjExLCBwODkKKyAqIDh4ODpCCisgKiA4eDQ6QjpidG0gIDh4NDpCOnRvcCAgOHg0OkI6Ym90aCwKKyAqIDR4ODpCOnJpZ2h0ICA0eDg6QjpsZWZ0ICA0eDg6Qjpib3RoCisgKiA0eDQ6QiAgOHg4Ok1CCisgKiA4eDQ6TUI6YnRtICA4eDQ6TUI6dG9wICA4eDQsTUIsYm90aAorICogNHg4LE1CLHJpZ2h0ICA0eDgsTUIsbGVmdAorICogNHg0LE1CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfdmMxX3R0bWJfY29kZXNbM11bMTZdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfdHRtYl9iaXRzWzNdWzE2XTsKKworLyogVFRCTEsgKFRyYW5zZm9ybSBUeXBlIHBlciBCbG9jaykgdGFibGVzICovCitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfdHRibGtfY29kZXNbM11bOF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfdHRibGtfYml0c1szXVs4XTsKKworLyogU1VCQkxLUEFUIHRhYmxlcywgcDkzLTk0LCByZW9yZGVyZWQgKi8KK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZjMV9zdWJibGtwYXRfY29kZXNbM11bMTVdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX3N1YmJsa3BhdF9iaXRzWzNdWzE1XTsKKworLyogTVYgZGlmZmVyZW50aWFsIHRhYmxlcywgcDI2NSAqLworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3ZjMV9tdl9kaWZmX2NvZGVzWzRdWzczXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZjMV9tdl9kaWZmX2JpdHNbNF1bNzNdOworCisvKiBJbnRlcmxhY2VkIGZyYW1lIHBpY3R1cmUgTUJNT0RFIFZMQyB0YWJsZXMgKHAuIDI0NiwgcC4gMzYwKSAqLworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3ZjMV9pbnRmcl80bXZfbWJtb2RlX2NvZGVzWzRdWzE1XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZjMV9pbnRmcl80bXZfbWJtb2RlX2JpdHNbNF1bMTVdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX2ludGZyX25vbjRtdl9tYm1vZGVfY29kZXNbNF1bOV07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfaW50ZnJfbm9uNG12X21ibW9kZV9iaXRzWzRdWzldOworCisvKiBJbnRlcmxhY2VkIGZpZWxkIHBpY3R1cmUgTUJNT0RFIFZMQyB0YWJsZXMgKHAuIDM1NiAtIDExLjQuMSwgMTEuNC4yKSAqLworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX2lmX21tdl9tYm1vZGVfY29kZXNbOF1bOF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfaWZfbW12X21ibW9kZV9iaXRzWzhdWzhdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX2lmXzFtdl9tYm1vZGVfY29kZXNbOF1bNl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfaWZfMW12X21ibW9kZV9iaXRzWzhdWzZdOworCisvKiBJbnRlcmxhY2VkIGZyYW1lL2ZpZWxkIHBpY3R1cmUgTVZEQVRBIFZMQyB0YWJsZXMgKi8KKy8qIDEtcmVmZXJlbmNlIHRhYmxlcyAqLworZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGZmX3ZjMV8xcmVmX212ZGF0YV9jb2Rlc1s0XVs3Ml07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfMXJlZl9tdmRhdGFfYml0c1s0XVs3Ml07CisvKiAyLXJlZmVyZW5jZSB0YWJsZXMgKi8KK2V4dGVybiBjb25zdCB1aW50MzJfdCBmZl92YzFfMnJlZl9tdmRhdGFfY29kZXNbOF1bMTI2XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZjMV8ycmVmX212ZGF0YV9iaXRzWzhdWzEyNl07CisKKy8qIERDIGRpZmZlcmVudGlhbHMgbG93K2hpLW1vLCBwMjE3IGFyZSB0aGUgc2FtZSBhcyBpbiBtc21wZWc0ZGF0YSAuaCAqLworCisvKiBTY2FudGFibGVzL1paIHNjYW4gYXJlIGF0IDExLjkgKHAyNjIpIGFuZCA4LjEuMS4xMiAocDEwKSAqLworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX3NpbXBsZV9wcm9ncmVzc2l2ZV80eDRfenogWzE2XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZjMV9hZHZfcHJvZ3Jlc3NpdmVfOHg0X3p6IFszMl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfYWR2X3Byb2dyZXNzaXZlXzR4OF96eiBbMzJdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX2Fkdl9pbnRlcmxhY2VkXzh4OF96eiBbNjRdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX2Fkdl9pbnRlcmxhY2VkXzh4NF96eiBbMzJdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX2Fkdl9pbnRlcmxhY2VkXzR4OF96eiBbMzJdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX2Fkdl9pbnRlcmxhY2VkXzR4NF96eiBbMTZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdmMxX2ludHJhX2hvcnpfOHg4X3p6IFs2NF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92YzFfaW50cmFfdmVydF84eDhfenogWzY0XTsKKworLyogRFFTY2FsZSBhcyBzcGVjaWZpZWQgaW4gOC4xLjMuOSAtIGFsbW9zdCBpZGVudGljYWwgdG8gMHg0MDAwMC9pICovCitleHRlcm4gY29uc3QgaW50MzJfdCBmZl92YzFfZHFzY2FsZVs2M107CisKKy8qIFAgSW50ZXJsYWNlZCBmaWVsZCBwaWN0dXJlIE1WIHByZWRpY3RvciBzY2FsaW5nIHZhbHVlcyAoVGFibGUgMTE0KSAqLworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3ZjMV9maWVsZF9tdnByZWRfc2NhbGVzWzJdWzddWzRdOworLyogQiBJbnRlcmxhY2VkIGZpZWxkIHBpY3R1cmUgYmFja3dhcmQgTVYgcHJlZGljdG9yIHNjYWxpbmcgdmFsdWVzIGZvciBmaXJzdCBmaWVsZCAoVGFibGUgMTE1KSAqLworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3ZjMV9iX2ZpZWxkX212cHJlZF9zY2FsZXNbN11bNF07CisKKyNkZWZpbmUgQUNfTU9ERVMgOAorCitleHRlcm4gY29uc3QgaW50IGZmX3ZjMV9hY19zaXplc1tBQ19NT0RFU107CisKKyNlbmRpZiAvKiBBVkNPREVDX1ZDMURBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmMxZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92YzFkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTY3MjRjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmMxZGVjLmMKQEAgLTAsMCArMSwxMTgxIEBACisvKgorICogVkMtMSBhbmQgV01WMyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTWFzaGlhdCBTYXJrZXIgU2hha2toYXIKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqIFBhcnRseSBiYXNlZCBvbiB2YzkuYyAoYykgMjAwNSBBbm9ueW1vdXMsIEFsZXggQmVyZWdzemFzemksIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVkMtMSBhbmQgV01WMyBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJibG9ja2RzcC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtcGVnX2VyLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAibXNtcGVnNGRhdGEuaCIKKyNpbmNsdWRlICJ2YzEuaCIKKyNpbmNsdWRlICJ2YzFkYXRhLmgiCisjaW5jbHVkZSAidmRwYXVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworCisjaWYgQ09ORklHX1dNVjNJTUFHRV9ERUNPREVSIHx8IENPTkZJR19WQzFJTUFHRV9ERUNPREVSCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm0gY29lZmZpY2llbnRzIGZvciBib3RoIHNwcml0ZXMgaW4gMTYuMTYgZml4ZWQgcG9pbnQgZm9ybWF0LAorICAgICAqIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgYml0c3RyZWFtOgorICAgICAqICB4IHNjYWxlCisgICAgICogIHJvdGF0aW9uIDEgKHVudXNlZCkKKyAgICAgKiAgeCBvZmZzZXQKKyAgICAgKiAgcm90YXRpb24gMiAodW51c2VkKQorICAgICAqICB5IHNjYWxlCisgICAgICogIHkgb2Zmc2V0CisgICAgICogIGFscGhhCisgICAgICovCisgICAgaW50IGNvZWZzWzJdWzddOworCisgICAgaW50IGVmZmVjdF90eXBlLCBlZmZlY3RfZmxhZzsKKyAgICBpbnQgZWZmZWN0X3Bjb3VudDEsIGVmZmVjdF9wY291bnQyOyAgIC8vLzwgYW1vdW50IG9mIGVmZmVjdCBwYXJhbWV0ZXJzIHN0b3JlZCBpbiBlZmZlY3RfcGFyYW1zCisgICAgaW50IGVmZmVjdF9wYXJhbXMxWzE1XSwgZWZmZWN0X3BhcmFtczJbMTBdOyAvLy88IGVmZmVjdCBwYXJhbWV0ZXJzIGluIDE2LjE2IGZpeGVkIHBvaW50IGZvcm1hdAorfSBTcHJpdGVEYXRhOworCitzdGF0aWMgaW5saW5lIGludCBnZXRfZnBfdmFsKEdldEJpdENvbnRleHQqIGdiKQoreworICAgIHJldHVybiAoZ2V0X2JpdHNfbG9uZyhnYiwgMzApIC0gKDEgPDwgMjkpKSA8PCAxOworfQorCitzdGF0aWMgdm9pZCB2YzFfc3ByaXRlX3BhcnNlX3RyYW5zZm9ybShHZXRCaXRDb250ZXh0KiBnYiwgaW50IGNbN10pCit7CisgICAgY1sxXSA9IGNbM10gPSAwOworCisgICAgc3dpdGNoIChnZXRfYml0cyhnYiwgMikpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGNbMF0gPSAxIDw8IDE2OworICAgICAgICBjWzJdID0gZ2V0X2ZwX3ZhbChnYik7CisgICAgICAgIGNbNF0gPSAxIDw8IDE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGNbMF0gPSBjWzRdID0gZ2V0X2ZwX3ZhbChnYik7CisgICAgICAgIGNbMl0gPSBnZXRfZnBfdmFsKGdiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBjWzBdID0gZ2V0X2ZwX3ZhbChnYik7CisgICAgICAgIGNbMl0gPSBnZXRfZnBfdmFsKGdiKTsKKyAgICAgICAgY1s0XSA9IGdldF9mcF92YWwoZ2IpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGNbMF0gPSBnZXRfZnBfdmFsKGdiKTsKKyAgICAgICAgY1sxXSA9IGdldF9mcF92YWwoZ2IpOworICAgICAgICBjWzJdID0gZ2V0X2ZwX3ZhbChnYik7CisgICAgICAgIGNbM10gPSBnZXRfZnBfdmFsKGdiKTsKKyAgICAgICAgY1s0XSA9IGdldF9mcF92YWwoZ2IpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY1s1XSA9IGdldF9mcF92YWwoZ2IpOworICAgIGlmIChnZXRfYml0czEoZ2IpKQorICAgICAgICBjWzZdID0gZ2V0X2ZwX3ZhbChnYik7CisgICAgZWxzZQorICAgICAgICBjWzZdID0gMSA8PCAxNjsKK30KKworc3RhdGljIGludCB2YzFfcGFyc2Vfc3ByaXRlcyhWQzFDb250ZXh0ICp2LCBHZXRCaXRDb250ZXh0KiBnYiwgU3ByaXRlRGF0YSogc2QpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gdi0+cy5hdmN0eDsKKyAgICBpbnQgc3ByaXRlLCBpOworCisgICAgZm9yIChzcHJpdGUgPSAwOyBzcHJpdGUgPD0gdi0+dHdvX3Nwcml0ZXM7IHNwcml0ZSsrKSB7CisgICAgICAgIHZjMV9zcHJpdGVfcGFyc2VfdHJhbnNmb3JtKGdiLCBzZC0+Y29lZnNbc3ByaXRlXSk7CisgICAgICAgIGlmIChzZC0+Y29lZnNbc3ByaXRlXVsxXSB8fCBzZC0+Y29lZnNbc3ByaXRlXVszXSkKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIk5vbi16ZXJvIHJvdGF0aW9uIGNvZWZmaWNpZW50cyIpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgc3ByaXRlID8gIlMyOiIgOiAiUzE6Iik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAlZC4lLjNkIiwKKyAgICAgICAgICAgICAgICAgICBzZC0+Y29lZnNbc3ByaXRlXVtpXSAvICgxPDwxNiksCisgICAgICAgICAgICAgICAgICAgKGFicyhzZC0+Y29lZnNbc3ByaXRlXVtpXSkgJiAweEZGRkYpICogMTAwMCAvICgxIDw8IDE2KSk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKKyAgICB9CisKKyAgICBza2lwX2JpdHMoZ2IsIDIpOworICAgIGlmIChzZC0+ZWZmZWN0X3R5cGUgPSBnZXRfYml0c19sb25nKGdiLCAzMCkpIHsKKyAgICAgICAgc3dpdGNoIChzZC0+ZWZmZWN0X3Bjb3VudDEgPSBnZXRfYml0cyhnYiwgNCkpIHsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgdmMxX3Nwcml0ZV9wYXJzZV90cmFuc2Zvcm0oZ2IsIHNkLT5lZmZlY3RfcGFyYW1zMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgIHZjMV9zcHJpdGVfcGFyc2VfdHJhbnNmb3JtKGdiLCBzZC0+ZWZmZWN0X3BhcmFtczEpOworICAgICAgICAgICAgdmMxX3Nwcml0ZV9wYXJzZV90cmFuc2Zvcm0oZ2IsIHNkLT5lZmZlY3RfcGFyYW1zMSArIDcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2QtPmVmZmVjdF9wY291bnQxOyBpKyspCisgICAgICAgICAgICAgICAgc2QtPmVmZmVjdF9wYXJhbXMxW2ldID0gZ2V0X2ZwX3ZhbChnYik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNkLT5lZmZlY3RfdHlwZSAhPSAxMyB8fCBzZC0+ZWZmZWN0X3BhcmFtczFbMF0gIT0gc2QtPmNvZWZzWzBdWzZdKSB7CisgICAgICAgICAgICAvLyBlZmZlY3QgMTMgaXMgc2ltcGxlIGFscGhhIGJsZW5kaW5nIGFuZCBtYXRjaGVzIHRoZSBvcGFjaXR5IGFib3ZlCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkVmZmVjdDogJWQ7IHBhcmFtczogIiwgc2QtPmVmZmVjdF90eXBlKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZC0+ZWZmZWN0X3Bjb3VudDE7IGkrKykKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAlZC4lLjJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2QtPmVmZmVjdF9wYXJhbXMxW2ldIC8gKDEgPDwgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAoYWJzKHNkLT5lZmZlY3RfcGFyYW1zMVtpXSkgJiAweEZGRkYpICogMTAwMCAvICgxIDw8IDE2KSk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7CisgICAgICAgIH0KKworICAgICAgICBzZC0+ZWZmZWN0X3Bjb3VudDIgPSBnZXRfYml0cyhnYiwgMTYpOworICAgICAgICBpZiAoc2QtPmVmZmVjdF9wY291bnQyID4gMTApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgZWZmZWN0IHBhcmFtZXRlcnNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0gZWxzZSBpZiAoc2QtPmVmZmVjdF9wY291bnQyKSB7CisgICAgICAgICAgICBpID0gLTE7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkVmZmVjdCBwYXJhbXMgMjogIik7CisgICAgICAgICAgICB3aGlsZSAoKytpIDwgc2QtPmVmZmVjdF9wY291bnQyKSB7CisgICAgICAgICAgICAgICAgc2QtPmVmZmVjdF9wYXJhbXMyW2ldID0gZ2V0X2ZwX3ZhbChnYik7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgJWQuJS4yZCIsCisgICAgICAgICAgICAgICAgICAgICAgIHNkLT5lZmZlY3RfcGFyYW1zMltpXSAvICgxIDw8IDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGFicyhzZC0+ZWZmZWN0X3BhcmFtczJbaV0pICYgMHhGRkZGKSAqIDEwMDAgLyAoMSA8PCAxNikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzZC0+ZWZmZWN0X2ZsYWcgPSBnZXRfYml0czEoZ2IpKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkVmZmVjdCBmbGFnIHNldFxuIik7CisKKyAgICBpZiAoZ2V0X2JpdHNfY291bnQoZ2IpID49IGdiLT5zaXplX2luX2JpdHMgKworICAgICAgIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01WM0lNQUdFID8gNjQgOiAwKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJ1ZmZlciBvdmVycnVuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChnZXRfYml0c19jb3VudChnYikgPCBnYi0+c2l6ZV9pbl9iaXRzIC0gOCkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkJ1ZmZlciBub3QgZnVsbHkgcmVhZFxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmMxX2RyYXdfc3ByaXRlcyhWQzFDb250ZXh0ICp2LCBTcHJpdGVEYXRhKiBzZCkKK3sKKyAgICBpbnQgaSwgcGxhbmUsIHJvdywgc3ByaXRlOworICAgIGludCBzcl9jYWNoZVsyXVsyXSA9IHsgeyAtMSwgLTEgfSwgeyAtMSwgLTEgfSB9OworICAgIHVpbnQ4X3QqIHNyY19oWzJdWzJdOworICAgIGludCB4b2ZmWzJdLCB4YWR2WzJdLCB5b2ZmWzJdLCB5YWR2WzJdLCBhbHBoYTsKKyAgICBpbnQgeXN1YlsyXTsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworCisgICAgZm9yIChpID0gMDsgaSA8PSB2LT50d29fc3ByaXRlczsgaSsrKSB7CisgICAgICAgIHhvZmZbaV0gPSBhdl9jbGlwKHNkLT5jb2Vmc1tpXVsyXSwgMCwgdi0+c3ByaXRlX3dpZHRoLTEgPDwgMTYpOworICAgICAgICB4YWR2W2ldID0gc2QtPmNvZWZzW2ldWzBdOworICAgICAgICBpZiAoeGFkdltpXSAhPSAxPDwxNiB8fCAodi0+c3ByaXRlX3dpZHRoIDw8IDE2KSAtICh2LT5vdXRwdXRfd2lkdGggPDwgMTYpIC0geG9mZltpXSkKKyAgICAgICAgICAgIHhhZHZbaV0gPSBhdl9jbGlwKHhhZHZbaV0sIDAsICgodi0+c3ByaXRlX3dpZHRoPDwxNikgLSB4b2ZmW2ldIC0gMSkgLyB2LT5vdXRwdXRfd2lkdGgpOworCisgICAgICAgIHlvZmZbaV0gPSBhdl9jbGlwKHNkLT5jb2Vmc1tpXVs1XSwgMCwgdi0+c3ByaXRlX2hlaWdodC0xIDw8IDE2KTsKKyAgICAgICAgeWFkdltpXSA9IGF2X2NsaXAoc2QtPmNvZWZzW2ldWzRdLCAwLCAoKHYtPnNwcml0ZV9oZWlnaHQgPDwgMTYpIC0geW9mZltpXSkgLyB2LT5vdXRwdXRfaGVpZ2h0KTsKKyAgICB9CisgICAgYWxwaGEgPSBhdl9jbGlwKHNkLT5jb2Vmc1sxXVs2XSwgMCwgKDE8PDE2KSAtIDEpOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgKHMtPmZsYWdzJkNPREVDX0ZMQUdfR1JBWSA/IDEgOiAzKTsgcGxhbmUrKykgeworICAgICAgICBpbnQgd2lkdGggPSB2LT5vdXRwdXRfd2lkdGg+PiEhcGxhbmU7CisKKyAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCB2LT5vdXRwdXRfaGVpZ2h0Pj4hIXBsYW5lOyByb3crKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gdi0+c3ByaXRlX291dHB1dF9mcmFtZS0+ZGF0YVtwbGFuZV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+c3ByaXRlX291dHB1dF9mcmFtZS0+bGluZXNpemVbcGxhbmVdICogcm93OworCisgICAgICAgICAgICBmb3IgKHNwcml0ZSA9IDA7IHNwcml0ZSA8PSB2LT50d29fc3ByaXRlczsgc3ByaXRlKyspIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICppcGxhbmUgPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVtwbGFuZV07CisgICAgICAgICAgICAgICAgaW50ICAgICAgaWxpbmUgID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgICAgICBpbnQgICAgICB5Y29vcmQgPSB5b2ZmW3Nwcml0ZV0gKyB5YWR2W3Nwcml0ZV0gKiByb3c7CisgICAgICAgICAgICAgICAgaW50ICAgICAgeWxpbmUgID0geWNvb3JkID4+IDE2OworICAgICAgICAgICAgICAgIGludCAgICAgIG5leHRfbGluZTsKKyAgICAgICAgICAgICAgICB5c3ViW3Nwcml0ZV0gPSB5Y29vcmQgJiAweEZGRkY7CisgICAgICAgICAgICAgICAgaWYgKHNwcml0ZSkgeworICAgICAgICAgICAgICAgICAgICBpcGxhbmUgPSBzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVtwbGFuZV07CisgICAgICAgICAgICAgICAgICAgIGlsaW5lICA9IHMtPmxhc3RfcGljdHVyZS5mLT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5leHRfbGluZSA9IEZGTUlOKHlsaW5lICsgMSwgKHYtPnNwcml0ZV9oZWlnaHQgPj4gISFwbGFuZSkgLSAxKSAqIGlsaW5lOworICAgICAgICAgICAgICAgIGlmICghKHhvZmZbc3ByaXRlXSAmIDB4RkZGRikgJiYgeGFkdltzcHJpdGVdID09IDEgPDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY19oW3Nwcml0ZV1bMF0gPSBpcGxhbmUgKyAoeG9mZltzcHJpdGVdID4+IDE2KSArICB5bGluZSAgICAgICogaWxpbmU7CisgICAgICAgICAgICAgICAgICAgIGlmICh5c3ViW3Nwcml0ZV0pCisgICAgICAgICAgICAgICAgICAgICAgICBzcmNfaFtzcHJpdGVdWzFdID0gaXBsYW5lICsgKHhvZmZbc3ByaXRlXSA+PiAxNikgKyBuZXh0X2xpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyX2NhY2hlW3Nwcml0ZV1bMF0gIT0geWxpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcl9jYWNoZVtzcHJpdGVdWzFdID09IHlsaW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QqLCB2LT5zcl9yb3dzW3Nwcml0ZV1bMF0sIHYtPnNyX3Jvd3Nbc3ByaXRlXVsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZTV0FQKGludCwgICAgICAgIHNyX2NhY2hlW3Nwcml0ZV1bMF0sICAgc3JfY2FjaGVbc3ByaXRlXVsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC5zcHJpdGVfaCh2LT5zcl9yb3dzW3Nwcml0ZV1bMF0sIGlwbGFuZSArIHlsaW5lICogaWxpbmUsIHhvZmZbc3ByaXRlXSwgeGFkdltzcHJpdGVdLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JfY2FjaGVbc3ByaXRlXVswXSA9IHlsaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh5c3ViW3Nwcml0ZV0gJiYgc3JfY2FjaGVbc3ByaXRlXVsxXSAhPSB5bGluZSArIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC5zcHJpdGVfaCh2LT5zcl9yb3dzW3Nwcml0ZV1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBsYW5lICsgbmV4dF9saW5lLCB4b2ZmW3Nwcml0ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGFkdltzcHJpdGVdLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcl9jYWNoZVtzcHJpdGVdWzFdID0geWxpbmUgKyAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNyY19oW3Nwcml0ZV1bMF0gPSB2LT5zcl9yb3dzW3Nwcml0ZV1bMF07CisgICAgICAgICAgICAgICAgICAgIHNyY19oW3Nwcml0ZV1bMV0gPSB2LT5zcl9yb3dzW3Nwcml0ZV1bMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXYtPnR3b19zcHJpdGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHlzdWJbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgdi0+dmMxZHNwLnNwcml0ZV92X3NpbmdsZShkc3QsIHNyY19oWzBdWzBdLCBzcmNfaFswXVsxXSwgeXN1YlswXSwgd2lkdGgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyY19oWzBdWzBdLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoeXN1YlswXSAmJiB5c3ViWzFdKSB7CisgICAgICAgICAgICAgICAgICAgIHYtPnZjMWRzcC5zcHJpdGVfdl9kb3VibGVfdHdvc2NhbGUoZHN0LCBzcmNfaFswXVswXSwgc3JjX2hbMF1bMV0sIHlzdWJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2hbMV1bMF0sIHNyY19oWzFdWzFdLCB5c3ViWzFdLCBhbHBoYSwgd2lkdGgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeXN1YlswXSkgeworICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3Auc3ByaXRlX3ZfZG91YmxlX29uZXNjYWxlKGRzdCwgc3JjX2hbMF1bMF0sIHNyY19oWzBdWzFdLCB5c3ViWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19oWzFdWzBdLCBhbHBoYSwgd2lkdGgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeXN1YlsxXSkgeworICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3Auc3ByaXRlX3ZfZG91YmxlX29uZXNjYWxlKGRzdCwgc3JjX2hbMV1bMF0sIHNyY19oWzFdWzFdLCB5c3ViWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19oWzBdWzBdLCAoMTw8MTYpLTEtYWxwaGEsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2LT52YzFkc3Auc3ByaXRlX3ZfZG91YmxlX25vc2NhbGUoZHN0LCBzcmNfaFswXVswXSwgc3JjX2hbMV1bMF0sIGFscGhhLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwbGFuZSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSB2LT50d29fc3ByaXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgeG9mZltpXSA+Pj0gMTsKKyAgICAgICAgICAgICAgICB5b2ZmW2ldID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Cit9CisKKworc3RhdGljIGludCB2YzFfZGVjb2RlX3Nwcml0ZXMoVkMxQ29udGV4dCAqdiwgR2V0Qml0Q29udGV4dCogZ2IpCit7CisgICAgaW50IHJldDsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyAgICAgPSAmdi0+czsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5hdmN0eDsKKyAgICBTcHJpdGVEYXRhIHNkOworCisgICAgbWVtc2V0KCZzZCwgMCwgc2l6ZW9mKHNkKSk7CisKKyAgICByZXQgPSB2YzFfcGFyc2Vfc3ByaXRlcyh2LCBnYiwgJnNkKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICghcy0+Y3VycmVudF9waWN0dXJlLmYgfHwgIXMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhWzBdKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiR290IG5vIHNwcml0ZXNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHYtPnR3b19zcHJpdGVzICYmICghcy0+bGFzdF9waWN0dXJlX3B0ciB8fCAhcy0+bGFzdF9waWN0dXJlLmYtPmRhdGFbMF0pKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJOZWVkIHR3byBzcHJpdGVzLCBvbmx5IGdvdCBvbmVcbiIpOworICAgICAgICB2LT50d29fc3ByaXRlcyA9IDA7CisgICAgfQorCisgICAgYXZfZnJhbWVfdW5yZWYodi0+c3ByaXRlX291dHB1dF9mcmFtZSk7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCB2LT5zcHJpdGVfb3V0cHV0X2ZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgdmMxX2RyYXdfc3ByaXRlcyh2LCAmc2QpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZjMV9zcHJpdGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZDMUNvbnRleHQgKnYgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIEFWRnJhbWUgKmYgPSBzLT5jdXJyZW50X3BpY3R1cmUuZjsKKyAgICBpbnQgcGxhbmUsIGk7CisKKyAgICAvKiBXaW5kb3dzIE1lZGlhIEltYWdlIGNvZGVjcyBoYXZlIGEgY29udmVyZ2VuY2UgaW50ZXJ2YWwgb2YgdHdvIGtleWZyYW1lcy4KKyAgICAgICBTaW5jZSB3ZSBjYW4ndCBlbmZvcmNlIGl0LCBjbGVhciB0byBibGFjayB0aGUgbWlzc2luZyBzcHJpdGUuIFRoaXMgaXMKKyAgICAgICB3cm9uZyBidXQgaXQgbG9va3MgYmV0dGVyIHRoYW4gZG9pbmcgbm90aGluZy4gKi8KKworICAgIGlmIChmICYmIGYtPmRhdGFbMF0pCisgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IChzLT5mbGFncyZDT0RFQ19GTEFHX0dSQVkgPyAxIDogMyk7IHBsYW5lKyspCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdi0+c3ByaXRlX2hlaWdodD4+ISFwbGFuZTsgaSsrKQorICAgICAgICAgICAgICAgIG1lbXNldChmLT5kYXRhW3BsYW5lXSArIGkgKiBmLT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lID8gMTI4IDogMCwgZi0+bGluZXNpemVbcGxhbmVdKTsKK30KKworI2VuZGlmCisKK2F2X2NvbGQgaW50IGZmX3ZjMV9kZWNvZGVfaW5pdF9hbGxvY190YWJsZXMoVkMxQ29udGV4dCAqdikKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIGludCBpOworICAgIGludCBtYl9oZWlnaHQgPSBGRkFMSUdOKHMtPm1iX2hlaWdodCwgMik7CisKKyAgICAvKiBBbGxvY2F0ZSBtYiBiaXRwbGFuZXMgKi8KKyAgICB2LT5tdl90eXBlX21iX3BsYW5lID0gYXZfbWFsbG9jIChzLT5tYl9zdHJpZGUgKiBtYl9oZWlnaHQpOworICAgIHYtPmRpcmVjdF9tYl9wbGFuZSAgPSBhdl9tYWxsb2MgKHMtPm1iX3N0cmlkZSAqIG1iX2hlaWdodCk7CisgICAgdi0+Zm9yd2FyZF9tYl9wbGFuZSA9IGF2X21hbGxvYyAocy0+bWJfc3RyaWRlICogbWJfaGVpZ2h0KTsKKyAgICB2LT5maWVsZHR4X3BsYW5lICAgID0gYXZfbWFsbG9jeihzLT5tYl9zdHJpZGUgKiBtYl9oZWlnaHQpOworICAgIHYtPmFjcHJlZF9wbGFuZSAgICAgPSBhdl9tYWxsb2MgKHMtPm1iX3N0cmlkZSAqIG1iX2hlaWdodCk7CisgICAgdi0+b3Zlcl9mbGFnc19wbGFuZSA9IGF2X21hbGxvYyAocy0+bWJfc3RyaWRlICogbWJfaGVpZ2h0KTsKKworICAgIHYtPm5fYWxsb2NhdGVkX2Jsa3MgPSBzLT5tYl93aWR0aCArIDI7CisgICAgdi0+YmxvY2sgICAgICAgICAgICA9IGF2X21hbGxvYyhzaXplb2YoKnYtPmJsb2NrKSAqIHYtPm5fYWxsb2NhdGVkX2Jsa3MpOworICAgIHYtPmNicF9iYXNlICAgICAgICAgPSBhdl9tYWxsb2Moc2l6ZW9mKHYtPmNicF9iYXNlWzBdKSAqIDIgKiBzLT5tYl9zdHJpZGUpOworICAgIHYtPmNicCAgICAgICAgICAgICAgPSB2LT5jYnBfYmFzZSArIHMtPm1iX3N0cmlkZTsKKyAgICB2LT50dGJsa19iYXNlICAgICAgID0gYXZfbWFsbG9jKHNpemVvZih2LT50dGJsa19iYXNlWzBdKSAqIDIgKiBzLT5tYl9zdHJpZGUpOworICAgIHYtPnR0YmxrICAgICAgICAgICAgPSB2LT50dGJsa19iYXNlICsgcy0+bWJfc3RyaWRlOworICAgIHYtPmlzX2ludHJhX2Jhc2UgICAgPSBhdl9tYWxsb2N6KHNpemVvZih2LT5pc19pbnRyYV9iYXNlWzBdKSAqIDIgKiBzLT5tYl9zdHJpZGUpOworICAgIHYtPmlzX2ludHJhICAgICAgICAgPSB2LT5pc19pbnRyYV9iYXNlICsgcy0+bWJfc3RyaWRlOworICAgIHYtPmx1bWFfbXZfYmFzZSAgICAgPSBhdl9tYWxsb2N6KHNpemVvZih2LT5sdW1hX212X2Jhc2VbMF0pICogMiAqIHMtPm1iX3N0cmlkZSk7CisgICAgdi0+bHVtYV9tdiAgICAgICAgICA9IHYtPmx1bWFfbXZfYmFzZSArIHMtPm1iX3N0cmlkZTsKKworICAgIC8qIGFsbG9jYXRlIGJsb2NrIHR5cGUgaW5mbyBpbiB0aGF0IHdheSBzbyBpdCBjb3VsZCBiZSB1c2VkIHdpdGggcy0+YmxvY2tfaW5kZXhbXSAqLworICAgIHYtPm1iX3R5cGVfYmFzZSA9IGF2X21hbGxvYyhzLT5iOF9zdHJpZGUgKiAobWJfaGVpZ2h0ICogMiArIDEpICsgcy0+bWJfc3RyaWRlICogKG1iX2hlaWdodCArIDEpICogMik7CisgICAgdi0+bWJfdHlwZVswXSAgID0gdi0+bWJfdHlwZV9iYXNlICsgcy0+Yjhfc3RyaWRlICsgMTsKKyAgICB2LT5tYl90eXBlWzFdICAgPSB2LT5tYl90eXBlX2Jhc2UgKyBzLT5iOF9zdHJpZGUgKiAobWJfaGVpZ2h0ICogMiArIDEpICsgcy0+bWJfc3RyaWRlICsgMTsKKyAgICB2LT5tYl90eXBlWzJdICAgPSB2LT5tYl90eXBlWzFdICsgcy0+bWJfc3RyaWRlICogKG1iX2hlaWdodCArIDEpOworCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IHRvIHN0b3JlIGJsb2NrIGxldmVsIE1WIGluZm8gKi8KKyAgICB2LT5ibGtfbXZfdHlwZV9iYXNlID0gYXZfbWFsbG9jeiggICAgIHMtPmI4X3N0cmlkZSAqIChtYl9oZWlnaHQgKiAyICsgMSkgKyBzLT5tYl9zdHJpZGUgKiAobWJfaGVpZ2h0ICsgMSkgKiAyKTsKKyAgICB2LT5ibGtfbXZfdHlwZSAgICAgID0gdi0+YmxrX212X3R5cGVfYmFzZSArIHMtPmI4X3N0cmlkZSArIDE7CisgICAgdi0+bXZfZl9iYXNlICAgICAgICA9IGF2X21hbGxvY3ooMiAqIChzLT5iOF9zdHJpZGUgKiAobWJfaGVpZ2h0ICogMiArIDEpICsgcy0+bWJfc3RyaWRlICogKG1iX2hlaWdodCArIDEpICogMikpOworICAgIHYtPm12X2ZbMF0gICAgICAgICAgPSB2LT5tdl9mX2Jhc2UgKyBzLT5iOF9zdHJpZGUgKyAxOworICAgIHYtPm12X2ZbMV0gICAgICAgICAgPSB2LT5tdl9mWzBdICsgKHMtPmI4X3N0cmlkZSAqIChtYl9oZWlnaHQgKiAyICsgMSkgKyBzLT5tYl9zdHJpZGUgKiAobWJfaGVpZ2h0ICsgMSkgKiAyKTsKKyAgICB2LT5tdl9mX25leHRfYmFzZSAgID0gYXZfbWFsbG9jeigyICogKHMtPmI4X3N0cmlkZSAqIChtYl9oZWlnaHQgKiAyICsgMSkgKyBzLT5tYl9zdHJpZGUgKiAobWJfaGVpZ2h0ICsgMSkgKiAyKSk7CisgICAgdi0+bXZfZl9uZXh0WzBdICAgICA9IHYtPm12X2ZfbmV4dF9iYXNlICsgcy0+Yjhfc3RyaWRlICsgMTsKKyAgICB2LT5tdl9mX25leHRbMV0gICAgID0gdi0+bXZfZl9uZXh0WzBdICsgKHMtPmI4X3N0cmlkZSAqIChtYl9oZWlnaHQgKiAyICsgMSkgKyBzLT5tYl9zdHJpZGUgKiAobWJfaGVpZ2h0ICsgMSkgKiAyKTsKKworICAgIC8qIEluaXQgY29kZWQgYmxvY2tzIGluZm8gKi8KKyAgICBpZiAodi0+cHJvZmlsZSA9PSBQUk9GSUxFX0FEVkFOQ0VEKSB7CisvLyAgICAgICAgaWYgKGFsbG9jX2JpdHBsYW5lKCZ2LT5vdmVyX2ZsYWdzX3BsYW5lLCBzLT5tYl93aWR0aCwgcy0+bWJfaGVpZ2h0KSA8IDApCisvLyAgICAgICAgICAgIHJldHVybiAtMTsKKy8vICAgICAgICBpZiAoYWxsb2NfYml0cGxhbmUoJnYtPmFjX3ByZWRfcGxhbmUsIHMtPm1iX3dpZHRoLCBzLT5tYl9oZWlnaHQpIDwgMCkKKy8vICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZmX2ludHJheDhfY29tbW9uX2luaXQoJnYtPng4LHMpOworCisgICAgaWYgKHMtPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XTVYzSU1BR0UgfHwgcy0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMUlNQUdFKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBpZiAoISh2LT5zcl9yb3dzW2kgPj4gMV1baSAmIDFdID0gYXZfbWFsbG9jKHYtPm91dHB1dF93aWR0aCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaWYgKCF2LT5tdl90eXBlX21iX3BsYW5lIHx8ICF2LT5kaXJlY3RfbWJfcGxhbmUgfHwgIXYtPmFjcHJlZF9wbGFuZSB8fCAhdi0+b3Zlcl9mbGFnc19wbGFuZSB8fAorICAgICAgICAhdi0+YmxvY2sgfHwgIXYtPmNicF9iYXNlIHx8ICF2LT50dGJsa19iYXNlIHx8ICF2LT5pc19pbnRyYV9iYXNlIHx8ICF2LT5sdW1hX212X2Jhc2UgfHwKKyAgICAgICAgIXYtPm1iX3R5cGVfYmFzZSkgeworICAgICAgICBhdl9mcmVlcCgmdi0+bXZfdHlwZV9tYl9wbGFuZSk7CisgICAgICAgIGF2X2ZyZWVwKCZ2LT5kaXJlY3RfbWJfcGxhbmUpOworICAgICAgICBhdl9mcmVlcCgmdi0+YWNwcmVkX3BsYW5lKTsKKyAgICAgICAgYXZfZnJlZXAoJnYtPm92ZXJfZmxhZ3NfcGxhbmUpOworICAgICAgICBhdl9mcmVlcCgmdi0+YmxvY2spOworICAgICAgICBhdl9mcmVlcCgmdi0+Y2JwX2Jhc2UpOworICAgICAgICBhdl9mcmVlcCgmdi0+dHRibGtfYmFzZSk7CisgICAgICAgIGF2X2ZyZWVwKCZ2LT5pc19pbnRyYV9iYXNlKTsKKyAgICAgICAgYXZfZnJlZXAoJnYtPmx1bWFfbXZfYmFzZSk7CisgICAgICAgIGF2X2ZyZWVwKCZ2LT5tYl90eXBlX2Jhc2UpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIHZvaWQgZmZfdmMxX2luaXRfdHJhbnNwb3NlZF9zY2FudGFibGVzKFZDMUNvbnRleHQgKnYpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyNkZWZpbmUgdHJhbnNwb3NlKHgpICgoKHgpID4+IDMpIHwgKCgoeCkgJiA3KSA8PCAzKSkKKyAgICAgICAgdi0+enpfOHg4WzBdW2ldID0gdHJhbnNwb3NlKGZmX3dtdjFfc2NhbnRhYmxlWzBdW2ldKTsKKyAgICAgICAgdi0+enpfOHg4WzFdW2ldID0gdHJhbnNwb3NlKGZmX3dtdjFfc2NhbnRhYmxlWzFdW2ldKTsKKyAgICAgICAgdi0+enpfOHg4WzJdW2ldID0gdHJhbnNwb3NlKGZmX3dtdjFfc2NhbnRhYmxlWzJdW2ldKTsKKyAgICAgICAgdi0+enpfOHg4WzNdW2ldID0gdHJhbnNwb3NlKGZmX3dtdjFfc2NhbnRhYmxlWzNdW2ldKTsKKyAgICAgICAgdi0+enppXzh4OFtpXSAgID0gdHJhbnNwb3NlKGZmX3ZjMV9hZHZfaW50ZXJsYWNlZF84eDhfenpbaV0pOworICAgIH0KKyAgICB2LT5sZWZ0X2Jsa19zaCA9IDA7CisgICAgdi0+dG9wX2Jsa19zaCAgPSAzOworfQorCisvKiogSW5pdGlhbGl6ZSBhIFZDMS9XTVYzIGRlY29kZXIKKyAqIEB0b2RvIFRPRE86IEhhbmRsZSBWQy0xIElEVXMgKFRyYW5zcG9ydCBsZXZlbD8pCisgKiBAdG9kbyBUT0RPOiBEZWN5cGhlciByZW1haW5pbmcgYml0cyBpbiBleHRyYV9kYXRhCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCB2YzFfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZDMUNvbnRleHQgKnYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgcmV0OworCisgICAgLyogc2F2ZSB0aGUgY29udGFpbmVyIG91dHB1dCBzaXplIGZvciBXTUltYWdlICovCisgICAgdi0+b3V0cHV0X3dpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICB2LT5vdXRwdXRfaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YV9zaXplIHx8ICFhdmN0eC0+ZXh0cmFkYXRhKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCEoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19HUkFZKSkKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBmZl9nZXRfZm9ybWF0KGF2Y3R4LCBhdmN0eC0+Y29kZWMtPnBpeF9mbXRzKTsKKyAgICBlbHNlCisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZODsKKyAgICB2LT5zLmF2Y3R4ID0gYXZjdHg7CisKKyAgICBpZiAoKHJldCA9IGZmX3ZjMV9pbml0X2NvbW1vbih2KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIC8vIGVuc3VyZSBzdGF0aWMgVkxDIHRhYmxlcyBhcmUgaW5pdGlhbGl6ZWQKKyAgICBpZiAoKHJldCA9IGZmX21zbXBlZzRfZGVjb2RlX2luaXQoYXZjdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBmZl92YzFfZGVjb2RlX2luaXRfYWxsb2NfdGFibGVzKHYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgLy8gSGFjayB0byBlbnN1cmUgdGhlIGFib3ZlIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZAorICAgIC8vIGFnYWluIG9uY2Ugd2Uga25vdyBhbGwgbmVjZXNzYXJ5IHNldHRpbmdzLgorICAgIC8vIFRoYXQgdGhpcyBpcyBuZWNlc3NhcnkgbWlnaHQgaW5kaWNhdGUgYSBidWcuCisgICAgZmZfdmMxX2RlY29kZV9lbmQoYXZjdHgpOworCisgICAgZmZfYmxvY2tkc3BfaW5pdCgmcy0+YmRzcCwgYXZjdHgpOworICAgIGZmX2gyNjRjaHJvbWFfaW5pdCgmdi0+aDI2NGNocm9tYSwgOCk7CisgICAgZmZfcXBlbGRzcF9pbml0KCZzLT5xZHNwKTsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01WMyB8fCBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01WM0lNQUdFKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisKKyAgICAgICAgLy8gbG9va3MgbGlrZSBXTVYzIGhhcyBhIHNlcXVlbmNlIGhlYWRlciBzdG9yZWQgaW4gdGhlIGV4dHJhZGF0YQorICAgICAgICAvLyBhZHZhbmNlZCBzZXF1ZW5jZSBoZWFkZXIgbWF5IGJlIGJlZm9yZSB0aGUgZmlyc3QgZnJhbWUKKyAgICAgICAgLy8gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgZXh0cmFkYXRhIGlzIGEgdmVyc2lvbiBudW1iZXIsIDEgZm9yIHRoZQorICAgICAgICAvLyBzYW1wbGVzIHdlIGNhbiBkZWNvZGUKKworICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKjgpOworCisgICAgICAgIGlmICgocmV0ID0gZmZfdmMxX2RlY29kZV9zZXF1ZW5jZV9oZWFkZXIoYXZjdHgsIHYsICZnYikpIDwgMCkKKyAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGNvdW50ID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplKjggLSBnZXRfYml0c19jb3VudCgmZ2IpOworICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiRXh0cmEgZGF0YTogJWkgYml0cyBsZWZ0LCB2YWx1ZTogJVhcbiIsCisgICAgICAgICAgICAgICAgICAgY291bnQsIGdldF9iaXRzKCZnYiwgY291bnQpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJSZWFkICVpIGJpdHMgaW4gb3ZlcmZsb3dcbiIsIC1jb3VudCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBWQzEvV1ZDMS9XVlAyCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnN0YXJ0ID0gYXZjdHgtPmV4dHJhZGF0YTsKKyAgICAgICAgdWludDhfdCAqZW5kID0gYXZjdHgtPmV4dHJhZGF0YSArIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqbmV4dDsKKyAgICAgICAgaW50IHNpemUsIGJ1ZjJfc2l6ZTsKKyAgICAgICAgdWludDhfdCAqYnVmMiA9IE5VTEw7CisgICAgICAgIGludCBzZXFfaW5pdGlhbGl6ZWQgPSAwLCBlcF9pbml0aWFsaXplZCA9IDA7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDE2KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkV4dHJhZGF0YSBzaXplIHRvbyBzbWFsbDogJWlcbiIsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBidWYyICA9IGF2X21hbGxvY3ooYXZjdHgtPmV4dHJhZGF0YV9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIHN0YXJ0ID0gZmluZF9uZXh0X21hcmtlcihzdGFydCwgZW5kKTsgLy8gaW4gV1ZDMSBleHRyYWRhdGEgZmlyc3QgYnl0ZSBpcyBpdHMgc2l6ZSwgYnV0IGNhbiBiZSAwIGluIG1rdgorICAgICAgICBuZXh0ICA9IHN0YXJ0OworICAgICAgICBmb3IgKDsgbmV4dCA8IGVuZDsgc3RhcnQgPSBuZXh0KSB7CisgICAgICAgICAgICBuZXh0ID0gZmluZF9uZXh0X21hcmtlcihzdGFydCArIDQsIGVuZCk7CisgICAgICAgICAgICBzaXplID0gbmV4dCAtIHN0YXJ0IC0gNDsKKyAgICAgICAgICAgIGlmIChzaXplIDw9IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBidWYyX3NpemUgPSB2YzFfdW5lc2NhcGVfYnVmZmVyKHN0YXJ0ICsgNCwgc2l6ZSwgYnVmMik7CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmMiwgYnVmMl9zaXplICogOCk7CisgICAgICAgICAgICBzd2l0Y2ggKEFWX1JCMzIoc3RhcnQpKSB7CisgICAgICAgICAgICBjYXNlIFZDMV9DT0RFX1NFUUhEUjoKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX3ZjMV9kZWNvZGVfc2VxdWVuY2VfaGVhZGVyKGF2Y3R4LCB2LCAmZ2IpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShidWYyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VxX2luaXRpYWxpemVkID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkMxX0NPREVfRU5UUllQT0lOVDoKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX3ZjMV9kZWNvZGVfZW50cnlfcG9pbnQoYXZjdHgsIHYsICZnYikpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKGJ1ZjIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcF9pbml0aWFsaXplZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZShidWYyKTsKKyAgICAgICAgaWYgKCFzZXFfaW5pdGlhbGl6ZWQgfHwgIWVwX2luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29tcGxldGUgZXh0cmFkYXRhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB2LT5yZXNfc3ByaXRlID0gKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzFJTUFHRSk7CisgICAgfQorCisgICAgdi0+c3ByaXRlX291dHB1dF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCF2LT5zcHJpdGVfb3V0cHV0X2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZjdHgtPnByb2ZpbGUgPSB2LT5wcm9maWxlOworICAgIGlmICh2LT5wcm9maWxlID09IFBST0ZJTEVfQURWQU5DRUQpCisgICAgICAgIGF2Y3R4LT5sZXZlbCA9IHYtPmxldmVsOworCisgICAgYXZjdHgtPmhhc19iX2ZyYW1lcyA9ICEhYXZjdHgtPm1heF9iX2ZyYW1lczsKKworICAgIGlmICh2LT5jb2xvcl9wcmltID09IDEgfHwgdi0+Y29sb3JfcHJpbSA9PSA1IHx8IHYtPmNvbG9yX3ByaW0gPT0gNikKKyAgICAgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IHYtPmNvbG9yX3ByaW07CisgICAgaWYgKHYtPnRyYW5zZmVyX2NoYXIgPT0gMSB8fCB2LT50cmFuc2Zlcl9jaGFyID09IDcpCisgICAgICAgIGF2Y3R4LT5jb2xvcl90cmMgPSB2LT50cmFuc2Zlcl9jaGFyOworICAgIGlmICh2LT5tYXRyaXhfY29lZiA9PSAxIHx8IHYtPm1hdHJpeF9jb2VmID09IDYgfHwgdi0+bWF0cml4X2NvZWYgPT0gNykKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSB2LT5tYXRyaXhfY29lZjsKKworICAgIHMtPm1iX3dpZHRoICA9IChhdmN0eC0+Y29kZWRfd2lkdGggICsgMTUpID4+IDQ7CisgICAgcy0+bWJfaGVpZ2h0ID0gKGF2Y3R4LT5jb2RlZF9oZWlnaHQgKyAxNSkgPj4gNDsKKworICAgIGlmICh2LT5wcm9maWxlID09IFBST0ZJTEVfQURWQU5DRUQgfHwgdi0+cmVzX2Zhc3R0eCkgeworICAgICAgICBmZl92YzFfaW5pdF90cmFuc3Bvc2VkX3NjYW50YWJsZXModik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KHYtPnp6Xzh4OCwgZmZfd212MV9zY2FudGFibGUsIDQqNjQpOworICAgICAgICB2LT5sZWZ0X2Jsa19zaCA9IDM7CisgICAgICAgIHYtPnRvcF9ibGtfc2ggID0gMDsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNVjNJTUFHRSB8fCBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVkMxSU1BR0UpIHsKKyAgICAgICAgdi0+c3ByaXRlX3dpZHRoICA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICAgICAgdi0+c3ByaXRlX2hlaWdodCA9IGF2Y3R4LT5jb2RlZF9oZWlnaHQ7CisKKyAgICAgICAgYXZjdHgtPmNvZGVkX3dpZHRoICA9IGF2Y3R4LT53aWR0aCAgPSB2LT5vdXRwdXRfd2lkdGg7CisgICAgICAgIGF2Y3R4LT5jb2RlZF9oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0ID0gdi0+b3V0cHV0X2hlaWdodDsKKworICAgICAgICAvLyBwcmV2ZW50IDE2LjE2IG92ZXJmbG93cworICAgICAgICBpZiAodi0+c3ByaXRlX3dpZHRoICA+IDEgPDwgMTQgfHwKKyAgICAgICAgICAgIHYtPnNwcml0ZV9oZWlnaHQgPiAxIDw8IDE0IHx8CisgICAgICAgICAgICB2LT5vdXRwdXRfd2lkdGggID4gMSA8PCAxNCB8fAorICAgICAgICAgICAgdi0+b3V0cHV0X2hlaWdodCA+IDEgPDwgMTQpIHJldHVybiAtMTsKKworICAgICAgICBpZiAoKHYtPnNwcml0ZV93aWR0aCYxKSB8fCAodi0+c3ByaXRlX2hlaWdodCYxKSkgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAib2RkIHNwcml0ZXMgc3VwcG9ydCIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiogQ2xvc2UgYSBWQzEvV01WMyBkZWNvZGVyCisgKiBAd2FybmluZyBJbml0aWFsIHRyeSBhdCB1c2luZyBNcGVnRW5jQ29udGV4dCBzdHVmZgorICovCithdl9jb2xkIGludCBmZl92YzFfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkMxQ29udGV4dCAqdiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZ2LT5zcHJpdGVfb3V0cHV0X2ZyYW1lKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZ2LT5zcl9yb3dzW2kgPj4gMV1baSAmIDFdKTsKKyAgICBhdl9mcmVlcCgmdi0+aHJkX3JhdGUpOworICAgIGF2X2ZyZWVwKCZ2LT5ocmRfYnVmZmVyKTsKKyAgICBmZl9tcHZfY29tbW9uX2VuZCgmdi0+cyk7CisgICAgYXZfZnJlZXAoJnYtPm12X3R5cGVfbWJfcGxhbmUpOworICAgIGF2X2ZyZWVwKCZ2LT5kaXJlY3RfbWJfcGxhbmUpOworICAgIGF2X2ZyZWVwKCZ2LT5mb3J3YXJkX21iX3BsYW5lKTsKKyAgICBhdl9mcmVlcCgmdi0+ZmllbGR0eF9wbGFuZSk7CisgICAgYXZfZnJlZXAoJnYtPmFjcHJlZF9wbGFuZSk7CisgICAgYXZfZnJlZXAoJnYtPm92ZXJfZmxhZ3NfcGxhbmUpOworICAgIGF2X2ZyZWVwKCZ2LT5tYl90eXBlX2Jhc2UpOworICAgIGF2X2ZyZWVwKCZ2LT5ibGtfbXZfdHlwZV9iYXNlKTsKKyAgICBhdl9mcmVlcCgmdi0+bXZfZl9iYXNlKTsKKyAgICBhdl9mcmVlcCgmdi0+bXZfZl9uZXh0X2Jhc2UpOworICAgIGF2X2ZyZWVwKCZ2LT5ibG9jayk7CisgICAgYXZfZnJlZXAoJnYtPmNicF9iYXNlKTsKKyAgICBhdl9mcmVlcCgmdi0+dHRibGtfYmFzZSk7CisgICAgYXZfZnJlZXAoJnYtPmlzX2ludHJhX2Jhc2UpOyAvLyBGSVhNRSB1c2Ugdi0+bWJfdHlwZVtdCisgICAgYXZfZnJlZXAoJnYtPmx1bWFfbXZfYmFzZSk7CisgICAgZmZfaW50cmF4OF9jb21tb25fZW5kKCZ2LT54OCk7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqIERlY29kZSBhIFZDMS9XTVYzIGZyYW1lCisgKiBAdG9kbyBUT0RPOiBIYW5kbGUgVkMtMSBJRFVzIChUcmFuc3BvcnQgbGV2ZWw/KQorICovCitzdGF0aWMgaW50IHZjMV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemUsIG5fc2xpY2VzID0gMCwgaSwgcmV0OworICAgIFZDMUNvbnRleHQgKnYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgQVZGcmFtZSAqcGljdCA9IGRhdGE7CisgICAgdWludDhfdCAqYnVmMiA9IE5VTEw7CisgICAgY29uc3QgdWludDhfdCAqYnVmX3N0YXJ0ID0gYnVmLCAqYnVmX3N0YXJ0X3NlY29uZF9maWVsZCA9IE5VTEw7CisgICAgaW50IG1iX2hlaWdodCwgbl9zbGljZXMxPS0xOworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICAgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICAgICAgaW50IG1ieV9zdGFydDsKKyAgICB9ICpzbGljZXMgPSBOVUxMLCAqdG1wOworCisgICAgdi0+c2Vjb25kX2ZpZWxkID0gMDsKKworICAgIGlmKHMtPmZsYWdzICYgQ09ERUNfRkxBR19MT1dfREVMQVkpCisgICAgICAgIHMtPmxvd19kZWxheSA9IDE7CisKKyAgICAvKiBubyBzdXBwbGVtZW50YXJ5IHBpY3R1cmUgKi8KKyAgICBpZiAoYnVmX3NpemUgPT0gMCB8fCAoYnVmX3NpemUgPT0gNCAmJiBBVl9SQjMyKGJ1ZikgPT0gVkMxX0NPREVfRU5ET0ZTRVEpKSB7CisgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgbGFzdCBwaWN0dXJlICovCisgICAgICAgIGlmIChzLT5sb3dfZGVsYXkgPT0gMCAmJiBzLT5uZXh0X3BpY3R1cmVfcHRyKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihwaWN0LCBzLT5uZXh0X3BpY3R1cmVfcHRyLT5mKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBzLT5uZXh0X3BpY3R1cmVfcHRyID0gTlVMTDsKKworICAgICAgICAgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgaWYgKHMtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzJkNPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVKSB7CisgICAgICAgIGlmICh2LT5wcm9maWxlIDwgUFJPRklMRV9BRFZBTkNFRCkKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9WRFBBVV9XTVYzOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfVkRQQVVfVkMxOworICAgIH0KKworICAgIC8vZm9yIGFkdmFuY2VkIHByb2ZpbGUgd2UgbWF5IG5lZWQgdG8gcGFyc2UgYW5kIHVuZXNjYXBlIGRhdGEKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMSB8fCBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVkMxSU1BR0UpIHsKKyAgICAgICAgaW50IGJ1Zl9zaXplMiA9IDA7CisgICAgICAgIGJ1ZjIgPSBhdl9tYWxsb2N6KGJ1Zl9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIGlmICghYnVmMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgaWYgKElTX01BUktFUihBVl9SQjMyKGJ1ZikpKSB7IC8qIGZyYW1lIHN0YXJ0cyB3aXRoIG1hcmtlciBhbmQgbmVlZHMgdG8gYmUgcGFyc2VkICovCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzdGFydCwgKmVuZCwgKm5leHQ7CisgICAgICAgICAgICBpbnQgc2l6ZTsKKworICAgICAgICAgICAgbmV4dCA9IGJ1ZjsKKyAgICAgICAgICAgIGZvciAoc3RhcnQgPSBidWYsIGVuZCA9IGJ1ZiArIGJ1Zl9zaXplOyBuZXh0IDwgZW5kOyBzdGFydCA9IG5leHQpIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gZmluZF9uZXh0X21hcmtlcihzdGFydCArIDQsIGVuZCk7CisgICAgICAgICAgICAgICAgc2l6ZSA9IG5leHQgLSBzdGFydCAtIDQ7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPD0gMCkgY29udGludWU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChBVl9SQjMyKHN0YXJ0KSkgeworICAgICAgICAgICAgICAgIGNhc2UgVkMxX0NPREVfRlJBTUU6CisgICAgICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+aHdhY2NlbCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMmQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpCisgICAgICAgICAgICAgICAgICAgICAgICBidWZfc3RhcnQgPSBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUyID0gdmMxX3VuZXNjYXBlX2J1ZmZlcihzdGFydCArIDQsIHNpemUsIGJ1ZjIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZDMV9DT0RFX0ZJRUxEOiB7CisgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZTM7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+aHdhY2NlbCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMmQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpCisgICAgICAgICAgICAgICAgICAgICAgICBidWZfc3RhcnRfc2Vjb25kX2ZpZWxkID0gc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGF2X3JlYWxsb2NfYXJyYXkoc2xpY2VzLCBzaXplb2YoKnNsaWNlcyksIChuX3NsaWNlcysxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghdG1wKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgICAgIHNsaWNlcyA9IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2VzW25fc2xpY2VzXS5idWYgPSBhdl9tYWxsb2N6KGJ1Zl9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghc2xpY2VzW25fc2xpY2VzXS5idWYpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUzID0gdmMxX3VuZXNjYXBlX2J1ZmZlcihzdGFydCArIDQsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzW25fc2xpY2VzXS5idWYpOworICAgICAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZzbGljZXNbbl9zbGljZXNdLmdiLCBzbGljZXNbbl9zbGljZXNdLmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZTMgPDwgMyk7CisgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtaW5nIHRoYXQgdGhlIGZpZWxkIG1hcmtlciBpcyBhdCB0aGUgZXhhY3QgbWlkZGxlLAorICAgICAgICAgICAgICAgICAgICAgICBob3BlIGl0J3MgY29ycmVjdCAqLworICAgICAgICAgICAgICAgICAgICBzbGljZXNbbl9zbGljZXNdLm1ieV9zdGFydCA9IHMtPm1iX2hlaWdodCArIDEgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgbl9zbGljZXMxID0gbl9zbGljZXMgLSAxOyAvLyBpbmRleCBvZiB0aGUgbGFzdCBzbGljZSBvZiB0aGUgZmlyc3QgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgbl9zbGljZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgVkMxX0NPREVfRU5UUllQT0lOVDogLyogaXQgc2hvdWxkIGJlIGJlZm9yZSBmcmFtZSBkYXRhICovCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplMiA9IHZjMV91bmVzY2FwZV9idWZmZXIoc3RhcnQgKyA0LCBzaXplLCBidWYyKTsKKyAgICAgICAgICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1ZjIsIGJ1Zl9zaXplMiAqIDgpOworICAgICAgICAgICAgICAgICAgICBmZl92YzFfZGVjb2RlX2VudHJ5X3BvaW50KGF2Y3R4LCB2LCAmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZDMV9DT0RFX1NMSUNFOiB7CisgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZTM7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGF2X3JlYWxsb2NfYXJyYXkoc2xpY2VzLCBzaXplb2YoKnNsaWNlcyksIChuX3NsaWNlcysxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghdG1wKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgICAgIHNsaWNlcyA9IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2VzW25fc2xpY2VzXS5idWYgPSBhdl9tYWxsb2N6KGJ1Zl9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghc2xpY2VzW25fc2xpY2VzXS5idWYpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUzID0gdmMxX3VuZXNjYXBlX2J1ZmZlcihzdGFydCArIDQsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzW25fc2xpY2VzXS5idWYpOworICAgICAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZzbGljZXNbbl9zbGljZXNdLmdiLCBzbGljZXNbbl9zbGljZXNdLmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZTMgPDwgMyk7CisgICAgICAgICAgICAgICAgICAgIHNsaWNlc1tuX3NsaWNlc10ubWJ5X3N0YXJ0ID0gZ2V0X2JpdHMoJnNsaWNlc1tuX3NsaWNlc10uZ2IsIDkpOworICAgICAgICAgICAgICAgICAgICBuX3NsaWNlcysrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHYtPmludGVybGFjZSAmJiAoKGJ1ZlswXSAmIDB4QzApID09IDB4QzApKSB7IC8qIFdWQzEgaW50ZXJsYWNlZCBzdG9yZXMgYm90aCBmaWVsZHMgZGl2aWRlZCBieSBtYXJrZXIgKi8KKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpdmlkZXI7CisgICAgICAgICAgICBpbnQgYnVmX3NpemUzOworCisgICAgICAgICAgICBkaXZpZGVyID0gZmluZF9uZXh0X21hcmtlcihidWYsIGJ1ZiArIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIGlmICgoZGl2aWRlciA9PSAoYnVmICsgYnVmX3NpemUpKSB8fCBBVl9SQjMyKGRpdmlkZXIpICE9IFZDMV9DT0RFX0ZJRUxEKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBpbiBXVkMxIGludGVybGFjZWQgZnJhbWVcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gZm91bmQgZmllbGQgbWFya2VyLCB1bmVzY2FwZSBzZWNvbmQgZmllbGQKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmh3YWNjZWwgfHwKKyAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMmQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9zdGFydF9zZWNvbmRfZmllbGQgPSBkaXZpZGVyOworICAgICAgICAgICAgICAgIHRtcCA9IGF2X3JlYWxsb2NfYXJyYXkoc2xpY2VzLCBzaXplb2YoKnNsaWNlcyksIChuX3NsaWNlcysxKSk7CisgICAgICAgICAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgICAgIHNsaWNlcyA9IHRtcDsKKyAgICAgICAgICAgICAgICBzbGljZXNbbl9zbGljZXNdLmJ1ZiA9IGF2X21hbGxvY3ooYnVmX3NpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNsaWNlc1tuX3NsaWNlc10uYnVmKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICBidWZfc2l6ZTMgPSB2YzFfdW5lc2NhcGVfYnVmZmVyKGRpdmlkZXIgKyA0LCBidWYgKyBidWZfc2l6ZSAtIGRpdmlkZXIgLSA0LCBzbGljZXNbbl9zbGljZXNdLmJ1Zik7CisgICAgICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmc2xpY2VzW25fc2xpY2VzXS5nYiwgc2xpY2VzW25fc2xpY2VzXS5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZTMgPDwgMyk7CisgICAgICAgICAgICAgICAgc2xpY2VzW25fc2xpY2VzXS5tYnlfc3RhcnQgPSBzLT5tYl9oZWlnaHQgKyAxID4+IDE7CisgICAgICAgICAgICAgICAgbl9zbGljZXMxID0gbl9zbGljZXMgLSAxOworICAgICAgICAgICAgICAgIG5fc2xpY2VzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZfc2l6ZTIgPSB2YzFfdW5lc2NhcGVfYnVmZmVyKGJ1ZiwgZGl2aWRlciAtIGJ1ZiwgYnVmMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZfc2l6ZTIgPSB2YzFfdW5lc2NhcGVfYnVmZmVyKGJ1ZiwgYnVmX3NpemUsIGJ1ZjIpOworICAgICAgICB9CisgICAgICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBidWYyLCBidWZfc2l6ZTIqOCk7CisgICAgfSBlbHNlCisgICAgICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBidWYsIGJ1Zl9zaXplKjgpOworCisgICAgaWYgKHYtPnJlc19zcHJpdGUpIHsKKyAgICAgICAgdi0+bmV3X3Nwcml0ZSAgPSAhZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgIHYtPnR3b19zcHJpdGVzID0gIGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAvKiByZXNfc3ByaXRlIG1lYW5zIGEgV2luZG93cyBNZWRpYSBJbWFnZSBzdHJlYW0sIEFWX0NPREVDX0lEXypJTUFHRSBtZWFucworICAgICAgICAgICB3ZSdyZSB1c2luZyB0aGUgc3ByaXRlIGNvbXBvc2l0b3IuIFRoZXNlIGFyZSBpbnRlbnRpb25hbGx5IGtlcHQgc2VwYXJhdGUKKyAgICAgICAgICAgc28geW91IGNhbiBnZXQgdGhlIHJhdyBzcHJpdGVzIGJ5IHVzaW5nIHRoZSB3bXYzIGRlY29kZXIgZm9yIFdNVlAgb3IKKyAgICAgICAgICAgdGhlIHZjMSBvbmUgZm9yIFdWUDIgKi8KKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XTVYzSU1BR0UgfHwgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMUlNQUdFKSB7CisgICAgICAgICAgICBpZiAodi0+bmV3X3Nwcml0ZSkgeworICAgICAgICAgICAgICAgIC8vIHN3aXRjaCBBVkNvZGVjQ29udGV4dCBwYXJhbWV0ZXJzIHRvIHRob3NlIG9mIHRoZSBzcHJpdGVzCisgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoICA9IGF2Y3R4LT5jb2RlZF93aWR0aCAgPSB2LT5zcHJpdGVfd2lkdGg7CisgICAgICAgICAgICAgICAgYXZjdHgtPmhlaWdodCA9IGF2Y3R4LT5jb2RlZF9oZWlnaHQgPSB2LT5zcHJpdGVfaGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnb3RvIGltYWdlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPmNvbnRleHRfaW5pdGlhbGl6ZWQgJiYKKyAgICAgICAgKHMtPndpZHRoICAhPSBhdmN0eC0+Y29kZWRfd2lkdGggfHwKKyAgICAgICAgIHMtPmhlaWdodCAhPSBhdmN0eC0+Y29kZWRfaGVpZ2h0KSkgeworICAgICAgICBmZl92YzFfZGVjb2RlX2VuZChhdmN0eCk7CisgICAgfQorCisgICAgaWYgKCFzLT5jb250ZXh0X2luaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChmZl9tc21wZWc0X2RlY29kZV9pbml0KGF2Y3R4KSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgaWYgKGZmX3ZjMV9kZWNvZGVfaW5pdF9hbGxvY190YWJsZXModikgPCAwKSB7CisgICAgICAgICAgICBmZl9tcHZfY29tbW9uX2VuZChzKTsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisKKyAgICAgICAgcy0+bG93X2RlbGF5ID0gIWF2Y3R4LT5oYXNfYl9mcmFtZXMgfHwgdi0+cmVzX3Nwcml0ZTsKKworICAgICAgICBpZiAodi0+cHJvZmlsZSA9PSBQUk9GSUxFX0FEVkFOQ0VEKSB7CisgICAgICAgICAgICBpZihhdmN0eC0+Y29kZWRfd2lkdGg8PTEgfHwgYXZjdHgtPmNvZGVkX2hlaWdodDw9MSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIHMtPmhfZWRnZV9wb3MgPSBhdmN0eC0+Y29kZWRfd2lkdGg7CisgICAgICAgICAgICBzLT52X2VkZ2VfcG9zID0gYXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGRvIHBhcnNlIGZyYW1lIGhlYWRlcgorICAgIHYtPnBpY19oZWFkZXJfZmxhZyA9IDA7CisgICAgdi0+Zmlyc3RfcGljX2hlYWRlcl9mbGFnID0gMTsKKyAgICBpZiAodi0+cHJvZmlsZSA8IFBST0ZJTEVfQURWQU5DRUQpIHsKKyAgICAgICAgaWYgKGZmX3ZjMV9wYXJzZV9mcmFtZV9oZWFkZXIodiwgJnMtPmdiKSA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZmX3ZjMV9wYXJzZV9mcmFtZV9oZWFkZXJfYWR2KHYsICZzLT5nYikgPCAwKSB7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICB2LT5maXJzdF9waWNfaGVhZGVyX2ZsYWcgPSAwOworCisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKKyAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19ERUJVRywgInBpY3RfdHlwZTogJWNcbiIsIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihzLT5waWN0X3R5cGUpKTsKKworICAgIGlmICgoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNVjNJTUFHRSB8fCBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVkMxSU1BR0UpCisgICAgICAgICYmIHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU3ByaXRlIGRlY29kZXI6IGV4cGVjdGVkIEktZnJhbWVcbiIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoKHMtPm1iX2hlaWdodCA+PiB2LT5maWVsZF9tb2RlKSA9PSAwKSB7CisgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbWFnZSB0b28gc2hvcnRcbiIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICAvLyBmb3Igc2tpcHBpbmcgdGhlIGZyYW1lCisgICAgcy0+Y3VycmVudF9waWN0dXJlLmYtPnBpY3RfdHlwZSA9IHMtPnBpY3RfdHlwZTsKKyAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+a2V5X2ZyYW1lID0gcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgLyogc2tpcCBCLWZyYW1lcyBpZiB3ZSBkb24ndCBoYXZlIHJlZmVyZW5jZSBmcmFtZXMgKi8KKyAgICBpZiAoIXMtPmxhc3RfcGljdHVyZV9wdHIgJiYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiB8fCBzLT5kcm9wcGFibGUpKSB7CisgICAgICAgIGF2X2xvZyh2LT5zLmF2Y3R4LCBBVl9MT0dfREVCVUcsICJTa2lwcGluZyBCIGZyYW1lIHdpdGhvdXQgcmVmZXJlbmNlIGZyYW1lc1xuIik7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZiAoKGF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9OT05SRUYgJiYgcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB8fAorICAgICAgICAoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTktFWSAmJiBzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHx8CisgICAgICAgICBhdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfQUxMKSB7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmIChzLT5uZXh0X3BfZnJhbWVfZGFtYWdlZCkgeworICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPm5leHRfcF9mcmFtZV9kYW1hZ2VkID0gMDsKKyAgICB9CisKKyAgICBpZiAoZmZfbXB2X2ZyYW1lX3N0YXJ0KHMsIGF2Y3R4KSA8IDApIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgdi0+cy5jdXJyZW50X3BpY3R1cmVfcHRyLT5maWVsZF9waWN0dXJlID0gdi0+ZmllbGRfbW9kZTsKKyAgICB2LT5zLmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmludGVybGFjZWRfZnJhbWUgPSAodi0+ZmNtICE9IFBST0dSRVNTSVZFKTsKKyAgICB2LT5zLmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnRvcF9maWVsZF9maXJzdCAgPSB2LT50ZmY7CisKKyAgICAvLyBwcm9jZXNzIHB1bGxkb3duIGZsYWdzCisgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+cmVwZWF0X3BpY3QgPSAwOworICAgIC8vIFB1bGxkb3duIGZsYWdzIGFyZSBvbmx5IHZhbGlkIHdoZW4gJ2Jyb2FkY2FzdCcgaGFzIGJlZW4gc2V0LgorICAgIC8vIFNvIHRpY2tzX3Blcl9mcmFtZSB3aWxsIGJlIDIKKyAgICBpZiAodi0+cmZmKSB7CisgICAgICAgIC8vIHJlcGVhdCBmaWVsZAorICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5yZXBlYXRfcGljdCA9IDE7CisgICAgfSBlbHNlIGlmICh2LT5ycHRmcm0pIHsKKyAgICAgICAgLy8gcmVwZWF0IGZyYW1lcworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5yZXBlYXRfcGljdCA9IHYtPnJwdGZybSAqIDI7CisgICAgfQorCisgICAgcy0+bWUucXBlbF9wdXQgPSBzLT5xZHNwLnB1dF9xcGVsX3BpeGVsc190YWI7CisgICAgcy0+bWUucXBlbF9hdmcgPSBzLT5xZHNwLmF2Z19xcGVsX3BpeGVsc190YWI7CisKKyAgICBpZiAoKENPTkZJR19WQzFfVkRQQVVfREVDT0RFUikKKyAgICAgICAgJiZzLT5hdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyZDT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVSkgeworICAgICAgICBpZiAodi0+ZmllbGRfbW9kZSAmJiBidWZfc3RhcnRfc2Vjb25kX2ZpZWxkKSB7CisgICAgICAgICAgICBmZl92ZHBhdV92YzFfZGVjb2RlX3BpY3R1cmUocywgYnVmX3N0YXJ0LCBidWZfc3RhcnRfc2Vjb25kX2ZpZWxkIC0gYnVmX3N0YXJ0KTsKKyAgICAgICAgICAgIGZmX3ZkcGF1X3ZjMV9kZWNvZGVfcGljdHVyZShzLCBidWZfc3RhcnRfc2Vjb25kX2ZpZWxkLCAoYnVmICsgYnVmX3NpemUpIC0gYnVmX3N0YXJ0X3NlY29uZF9maWVsZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZl92ZHBhdV92YzFfZGVjb2RlX3BpY3R1cmUocywgYnVmX3N0YXJ0LCAoYnVmICsgYnVmX3NpemUpIC0gYnVmX3N0YXJ0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXZjdHgtPmh3YWNjZWwpIHsKKyAgICAgICAgaWYgKHYtPmZpZWxkX21vZGUgJiYgYnVmX3N0YXJ0X3NlY29uZF9maWVsZCkgeworICAgICAgICAgICAgLy8gZGVjb2RlIGZpcnN0IGZpZWxkCisgICAgICAgICAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfQk9UVE9NX0ZJRUxEIC0gdi0+dGZmOworICAgICAgICAgICAgaWYgKGF2Y3R4LT5od2FjY2VsLT5zdGFydF9mcmFtZShhdmN0eCwgYnVmX3N0YXJ0LCBidWZfc3RhcnRfc2Vjb25kX2ZpZWxkIC0gYnVmX3N0YXJ0KSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmh3YWNjZWwtPmRlY29kZV9zbGljZShhdmN0eCwgYnVmX3N0YXJ0LCBidWZfc3RhcnRfc2Vjb25kX2ZpZWxkIC0gYnVmX3N0YXJ0KSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmh3YWNjZWwtPmVuZF9mcmFtZShhdmN0eCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOworCisgICAgICAgICAgICAvLyBkZWNvZGUgc2Vjb25kIGZpZWxkCisgICAgICAgICAgICBzLT5nYiA9IHNsaWNlc1tuX3NsaWNlczEgKyAxXS5nYjsKKyAgICAgICAgICAgIHMtPnBpY3R1cmVfc3RydWN0dXJlID0gUElDVF9UT1BfRklFTEQgKyB2LT50ZmY7CisgICAgICAgICAgICB2LT5zZWNvbmRfZmllbGQgPSAxOworICAgICAgICAgICAgdi0+cGljX2hlYWRlcl9mbGFnID0gMDsKKyAgICAgICAgICAgIGlmIChmZl92YzFfcGFyc2VfZnJhbWVfaGVhZGVyX2Fkdih2LCAmcy0+Z2IpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGFyc2luZyBoZWFkZXIgZm9yIHNlY29uZCBmaWVsZCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHYtPnMuY3VycmVudF9waWN0dXJlX3B0ci0+Zi0+cGljdF90eXBlID0gdi0+cy5waWN0X3R5cGU7CisKKyAgICAgICAgICAgIGlmIChhdmN0eC0+aHdhY2NlbC0+c3RhcnRfZnJhbWUoYXZjdHgsIGJ1Zl9zdGFydF9zZWNvbmRfZmllbGQsIChidWYgKyBidWZfc2l6ZSkgLSBidWZfc3RhcnRfc2Vjb25kX2ZpZWxkKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmh3YWNjZWwtPmRlY29kZV9zbGljZShhdmN0eCwgYnVmX3N0YXJ0X3NlY29uZF9maWVsZCwgKGJ1ZiArIGJ1Zl9zaXplKSAtIGJ1Zl9zdGFydF9zZWNvbmRfZmllbGQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+aHdhY2NlbC0+ZW5kX2ZyYW1lKGF2Y3R4KSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfRlJBTUU7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmh3YWNjZWwtPnN0YXJ0X2ZyYW1lKGF2Y3R4LCBidWZfc3RhcnQsIChidWYgKyBidWZfc2l6ZSkgLSBidWZfc3RhcnQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+aHdhY2NlbC0+ZGVjb2RlX3NsaWNlKGF2Y3R4LCBidWZfc3RhcnQsIChidWYgKyBidWZfc2l6ZSkgLSBidWZfc3RhcnQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+aHdhY2NlbC0+ZW5kX2ZyYW1lKGF2Y3R4KSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaGVhZGVyX3JldCA9IDA7CisKKyAgICAgICAgZmZfbXBlZ19lcl9mcmFtZV9zdGFydChzKTsKKworICAgICAgICB2LT5iaXRzID0gYnVmX3NpemUgKiA4OworICAgICAgICB2LT5lbmRfbWJfeCA9IHMtPm1iX3dpZHRoOworICAgICAgICBpZiAodi0+ZmllbGRfbW9kZSkgeworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWzBdIDw8PSAxOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWzFdIDw8PSAxOworICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWzJdIDw8PSAxOworICAgICAgICAgICAgcy0+bGluZXNpemUgICAgICAgICAgICAgICAgICAgICAgPDw9IDE7CisgICAgICAgICAgICBzLT51dmxpbmVzaXplICAgICAgICAgICAgICAgICAgICA8PD0gMTsKKyAgICAgICAgfQorICAgICAgICBtYl9oZWlnaHQgPSBzLT5tYl9oZWlnaHQgPj4gdi0+ZmllbGRfbW9kZTsKKworICAgICAgICBhdl9hc3NlcnQwIChtYl9oZWlnaHQgPiAwKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG5fc2xpY2VzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMCAmJiAgc2xpY2VzW2kgLSAxXS5tYnlfc3RhcnQgPj0gbWJfaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgaWYgKHYtPmZpZWxkX21vZGUgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2xpY2UgJWQgc3RhcnRzIGJleW9uZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicGljdHVyZSBib3VuZGFyeSAoJWQgPj0gJWQpXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzW2kgLSAxXS5tYnlfc3RhcnQsIG1iX2hlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2LT5zZWNvbmRfZmllbGQgPSAxOworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoKHMtPm1iX2hlaWdodCAmIDEpID09IDApOworICAgICAgICAgICAgICAgIHYtPmJsb2Nrc19vZmYgICA9IHMtPmI4X3N0cmlkZSAqIChzLT5tYl9oZWlnaHQmfjEpOworICAgICAgICAgICAgICAgIHYtPm1iX29mZiAgICAgICA9IHMtPm1iX3N0cmlkZSAqIHMtPm1iX2hlaWdodCA+PiAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2LT5zZWNvbmRfZmllbGQgPSAwOworICAgICAgICAgICAgICAgIHYtPmJsb2Nrc19vZmYgICA9IDA7CisgICAgICAgICAgICAgICAgdi0+bWJfb2ZmICAgICAgID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpKSB7CisgICAgICAgICAgICAgICAgdi0+cGljX2hlYWRlcl9mbGFnID0gMDsKKyAgICAgICAgICAgICAgICBpZiAodi0+ZmllbGRfbW9kZSAmJiBpID09IG5fc2xpY2VzMSArIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChoZWFkZXJfcmV0ID0gZmZfdmMxX3BhcnNlX2ZyYW1lX2hlYWRlcl9hZHYodiwgJnMtPmdiKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmllbGQgaGVhZGVyIGRhbWFnZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgICAgIHYtPnBpY19oZWFkZXJfZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaGVhZGVyX3JldCA9IGZmX3ZjMV9wYXJzZV9mcmFtZV9oZWFkZXJfYWR2KHYsICZzLT5nYikpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNsaWNlIGhlYWRlciBkYW1hZ2VkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhlYWRlcl9yZXQgPCAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcy0+c3RhcnRfbWJfeSA9IChpID09IDApID8gMCA6IEZGTUFYKDAsIHNsaWNlc1tpLTFdLm1ieV9zdGFydCAlIG1iX2hlaWdodCk7CisgICAgICAgICAgICBpZiAoIXYtPmZpZWxkX21vZGUgfHwgdi0+c2Vjb25kX2ZpZWxkKQorICAgICAgICAgICAgICAgIHMtPmVuZF9tYl95ID0gKGkgPT0gbl9zbGljZXMgICAgICkgPyBtYl9oZWlnaHQgOiBGRk1JTihtYl9oZWlnaHQsIHNsaWNlc1tpXS5tYnlfc3RhcnQgJSBtYl9oZWlnaHQpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPj0gbl9zbGljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19FUlJPUiwgImZpcnN0IGZpZWxkIHNsaWNlIGNvdW50IHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT5lbmRfbWJfeSA9IChpIDw9IG5fc2xpY2VzMSArIDEpID8gbWJfaGVpZ2h0IDogRkZNSU4obWJfaGVpZ2h0LCBzbGljZXNbaV0ubWJ5X3N0YXJ0ICUgbWJfaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5lbmRfbWJfeSA8PSBzLT5zdGFydF9tYl95KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19FUlJPUiwgImVuZCBtYiB5ICVkICVkIGludmFsaWRcbiIsIHMtPmVuZF9tYl95LCBzLT5zdGFydF9tYl95KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdi0+cF9mcmFtZV9za2lwcGVkICYmIHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSAmJiAhdi0+Y2JwY3lfdmxjKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1pc3NpbmcgY2JwY3lfdmxjXG4iKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZmX3ZjMV9kZWNvZGVfYmxvY2tzKHYpOworICAgICAgICAgICAgaWYgKGkgIT0gbl9zbGljZXMpCisgICAgICAgICAgICAgICAgcy0+Z2IgPSBzbGljZXNbaV0uZ2I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHYtPmZpZWxkX21vZGUpIHsKKyAgICAgICAgICAgIHYtPnNlY29uZF9maWVsZCA9IDA7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbMF0gPj49IDE7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbMV0gPj49IDE7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbMl0gPj49IDE7CisgICAgICAgICAgICBzLT5saW5lc2l6ZSAgICAgICAgICAgICAgICAgICAgICA+Pj0gMTsKKyAgICAgICAgICAgIHMtPnV2bGluZXNpemUgICAgICAgICAgICAgICAgICAgID4+PSAxOworICAgICAgICAgICAgaWYgKHYtPnMucGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CSSAmJiB2LT5zLnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICAgICAgICAgIEZGU1dBUCh1aW50OF90ICosIHYtPm12X2ZfbmV4dFswXSwgdi0+bXZfZlswXSk7CisgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QgKiwgdi0+bXZfZl9uZXh0WzFdLCB2LT5tdl9mWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiQ29uc3VtZWQgJWkvJWkgYml0c1xuIiwKKyAgICAgICAgICAgICAgICBnZXRfYml0c19jb3VudCgmcy0+Z2IpLCBzLT5nYi5zaXplX2luX2JpdHMpOworLy8gIGlmIChnZXRfYml0c19jb3VudCgmcy0+Z2IpID4gYnVmX3NpemUgKiA4KQorLy8gICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmKHMtPmVyLmVycm9yX29jY3VycmVkICYmIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBpZiAoIXYtPmZpZWxkX21vZGUpCisgICAgICAgICAgICBmZl9lcl9mcmFtZV9lbmQoJnMtPmVyKTsKKyAgICB9CisKKyAgICBmZl9tcHZfZnJhbWVfZW5kKHMpOworCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XTVYzSU1BR0UgfHwgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMUlNQUdFKSB7CitpbWFnZToKKyAgICAgICAgYXZjdHgtPndpZHRoICA9IGF2Y3R4LT5jb2RlZF93aWR0aCAgPSB2LT5vdXRwdXRfd2lkdGg7CisgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSBhdmN0eC0+Y29kZWRfaGVpZ2h0ID0gdi0+b3V0cHV0X2hlaWdodDsKKyAgICAgICAgaWYgKGF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9OT05SRUYpCisgICAgICAgICAgICBnb3RvIGVuZDsKKyNpZiBDT05GSUdfV01WM0lNQUdFX0RFQ09ERVIgfHwgQ09ORklHX1ZDMUlNQUdFX0RFQ09ERVIKKyAgICAgICAgaWYgKHZjMV9kZWNvZGVfc3ByaXRlcyh2LCAmcy0+Z2IpKQorICAgICAgICAgICAgZ290byBlcnI7CisjZW5kaWYKKyAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYocGljdCwgdi0+c3ByaXRlX291dHB1dF9mcmFtZSkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CIHx8IHMtPmxvd19kZWxheSkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYocGljdCwgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+ZikpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIGZmX3ByaW50X2RlYnVnX2luZm8ocywgcy0+Y3VycmVudF9waWN0dXJlX3B0ciwgcGljdCk7CisgICAgICAgICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5sYXN0X3BpY3R1cmVfcHRyKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihwaWN0LCBzLT5sYXN0X3BpY3R1cmVfcHRyLT5mKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgZmZfcHJpbnRfZGVidWdfaW5mbyhzLCBzLT5sYXN0X3BpY3R1cmVfcHRyLCBwaWN0KTsKKyAgICAgICAgICAgICpnb3RfZnJhbWUgPSAxOworICAgICAgICB9CisgICAgfQorCitlbmQ6CisgICAgYXZfZnJlZShidWYyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9zbGljZXM7IGkrKykKKyAgICAgICAgYXZfZnJlZShzbGljZXNbaV0uYnVmKTsKKyAgICBhdl9mcmVlKHNsaWNlcyk7CisgICAgcmV0dXJuIGJ1Zl9zaXplOworCitlcnI6CisgICAgYXZfZnJlZShidWYyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9zbGljZXM7IGkrKykKKyAgICAgICAgYXZfZnJlZShzbGljZXNbaV0uYnVmKTsKKyAgICBhdl9mcmVlKHNsaWNlcyk7CisgICAgcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBjb25zdCBBVlByb2ZpbGUgcHJvZmlsZXNbXSA9IHsKKyAgICB7IEZGX1BST0ZJTEVfVkMxX1NJTVBMRSwgICAiU2ltcGxlIiAgIH0sCisgICAgeyBGRl9QUk9GSUxFX1ZDMV9NQUlOLCAgICAgIk1haW4iICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9WQzFfQ09NUExFWCwgICJDb21wbGV4IiAgfSwKKyAgICB7IEZGX1BST0ZJTEVfVkMxX0FEVkFOQ0VELCAiQWR2YW5jZWQiIH0sCisgICAgeyBGRl9QUk9GSUxFX1VOS05PV04gfSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgdmMxX2h3YWNjZWxfcGl4Zm10X2xpc3RfNDIwW10gPSB7CisjaWYgQ09ORklHX1ZDMV9EWFZBMl9IV0FDQ0VMCisgICAgQVZfUElYX0ZNVF9EWFZBMl9WTEQsCisjZW5kaWYKKyNpZiBDT05GSUdfVkMxX1ZBQVBJX0hXQUNDRUwKKyAgICBBVl9QSVhfRk1UX1ZBQVBJX1ZMRCwKKyNlbmRpZgorI2lmIENPTkZJR19WQzFfVkRQQVVfSFdBQ0NFTAorICAgIEFWX1BJWF9GTVRfVkRQQVUsCisjZW5kaWYKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitBVkNvZGVjIGZmX3ZjMV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2YzEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTTVBURSBWQy0xIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVkMxQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdmMxX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX3ZjMV9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHZjMV9kZWNvZGVfZnJhbWUsCisgICAgLmZsdXNoICAgICAgICAgID0gZmZfbXBlZ19mbHVzaCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5waXhfZm10cyAgICAgICA9IHZjMV9od2FjY2VsX3BpeGZtdF9saXN0XzQyMCwKKyAgICAucHJvZmlsZXMgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChwcm9maWxlcykKK307CisKKyNpZiBDT05GSUdfV01WM19ERUNPREVSCitBVkNvZGVjIGZmX3dtdjNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid212MyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldpbmRvd3MgTWVkaWEgVmlkZW8gOSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XTVYzLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWQzFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2YzFfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfdmMxX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gdmMxX2RlY29kZV9mcmFtZSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmZl9tcGVnX2ZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfREVMQVksCisgICAgLnBpeF9mbXRzICAgICAgID0gdmMxX2h3YWNjZWxfcGl4Zm10X2xpc3RfNDIwLAorICAgIC5wcm9maWxlcyAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKHByb2ZpbGVzKQorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1dNVjNfVkRQQVVfREVDT0RFUgorQVZDb2RlYyBmZl93bXYzX3ZkcGF1X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIndtdjNfdmRwYXUiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIFZpZGVvIDkgVkRQQVUiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV01WMywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVkMxQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdmMxX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX3ZjMV9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHZjMV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9ERUxBWSB8IENPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfVkRQQVVfV01WMywgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLnByb2ZpbGVzICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwocHJvZmlsZXMpCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfVkMxX1ZEUEFVX0RFQ09ERVIKK0FWQ29kZWMgZmZfdmMxX3ZkcGF1X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZjMV92ZHBhdSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNNUFRFIFZDLTEgVkRQQVUiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVkMxLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWQzFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2YzFfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfdmMxX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gdmMxX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0RFTEFZIHwgQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9WRFBBVV9WQzEsIEFWX1BJWF9GTVRfTk9ORSB9LAorICAgIC5wcm9maWxlcyAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKHByb2ZpbGVzKQorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1dNVjNJTUFHRV9ERUNPREVSCitBVkNvZGVjIGZmX3dtdjNpbWFnZV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ3bXYzaW1hZ2UiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIFZpZGVvIDkgSW1hZ2UiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV01WM0lNQUdFLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWQzFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2YzFfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfdmMxX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gdmMxX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5mbHVzaCAgICAgICAgICA9IHZjMV9zcHJpdGVfZmx1c2gsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19WQzFJTUFHRV9ERUNPREVSCitBVkNvZGVjIGZmX3ZjMWltYWdlX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZjMWltYWdlIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2luZG93cyBNZWRpYSBWaWRlbyA5IEltYWdlIHYyIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMUlNQUdFLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWQzFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2YzFfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfdmMxX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gdmMxX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5mbHVzaCAgICAgICAgICA9IHZjMV9zcHJpdGVfZmx1c2gsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMWRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmMxZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlMTAwMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMWRzcC5jCkBAIC0wLDAgKzEsMTAzOCBAQAorLyoKKyAqIFZDLTEgYW5kIFdNVjMgZGVjb2RlciAtIERTUCBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwNiBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZDLTEgYW5kIFdNVjMgZGVjb2RlcgorICoKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJoMjY0Y2hyb21hLmgiCisjaW5jbHVkZSAicXBlbGRzcC5oIgorI2luY2x1ZGUgInJuZF9hdmcuaCIKKyNpbmNsdWRlICJ2YzFkc3AuaCIKKyNpbmNsdWRlICJzdGFydGNvZGUuaCIKKworLyogQXBwbHkgb3ZlcmxhcCB0cmFuc2Zvcm0gdG8gaG9yaXpvbnRhbCBlZGdlICovCitzdGF0aWMgdm9pZCB2YzFfdl9vdmVybGFwX2ModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQoreworICAgIGludCBpOworICAgIGludCBhLCBiLCBjLCBkOworICAgIGludCBkMSwgZDI7CisgICAgaW50IHJuZCA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBhICA9IHNyY1stMiAqIHN0cmlkZV07CisgICAgICAgIGIgID0gc3JjWy1zdHJpZGVdOworICAgICAgICBjICA9IHNyY1swXTsKKyAgICAgICAgZCAgPSBzcmNbc3RyaWRlXTsKKyAgICAgICAgZDEgPSAoYSAtIGQgKyAzICsgcm5kKSA+PiAzOworICAgICAgICBkMiA9IChhIC0gZCArIGIgLSBjICsgNCAtIHJuZCkgPj4gMzsKKworICAgICAgICBzcmNbLTIgKiBzdHJpZGVdID0gYSAtIGQxOworICAgICAgICBzcmNbLXN0cmlkZV0gICAgID0gYXZfY2xpcF91aW50OChiIC0gZDIpOworICAgICAgICBzcmNbMF0gICAgICAgICAgID0gYXZfY2xpcF91aW50OChjICsgZDIpOworICAgICAgICBzcmNbc3RyaWRlXSAgICAgID0gZCArIGQxOworICAgICAgICBzcmMrKzsKKyAgICAgICAgcm5kID0gIXJuZDsKKyAgICB9Cit9CisKKy8qIEFwcGx5IG92ZXJsYXAgdHJhbnNmb3JtIHRvIHZlcnRpY2FsIGVkZ2UgKi8KK3N0YXRpYyB2b2lkIHZjMV9oX292ZXJsYXBfYyh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgaW50IGEsIGIsIGMsIGQ7CisgICAgaW50IGQxLCBkMjsKKyAgICBpbnQgcm5kID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGEgID0gc3JjWy0yXTsKKyAgICAgICAgYiAgPSBzcmNbLTFdOworICAgICAgICBjICA9IHNyY1swXTsKKyAgICAgICAgZCAgPSBzcmNbMV07CisgICAgICAgIGQxID0gKGEgLSBkICsgMyArIHJuZCkgPj4gMzsKKyAgICAgICAgZDIgPSAoYSAtIGQgKyBiIC0gYyArIDQgLSBybmQpID4+IDM7CisKKyAgICAgICAgc3JjWy0yXSA9IGEgLSBkMTsKKyAgICAgICAgc3JjWy0xXSA9IGF2X2NsaXBfdWludDgoYiAtIGQyKTsKKyAgICAgICAgc3JjWzBdICA9IGF2X2NsaXBfdWludDgoYyArIGQyKTsKKyAgICAgICAgc3JjWzFdICA9IGQgKyBkMTsKKyAgICAgICAgc3JjICAgICs9IHN0cmlkZTsKKyAgICAgICAgcm5kICAgICA9ICFybmQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2YzFfdl9zX292ZXJsYXBfYyhpbnQxNl90ICp0b3AsIGludDE2X3QgKmJvdHRvbSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgYSwgYiwgYywgZDsKKyAgICBpbnQgZDEsIGQyOworICAgIGludCBybmQxID0gNCwgcm5kMiA9IDM7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBhICA9IHRvcFs0OF07CisgICAgICAgIGIgID0gdG9wWzU2XTsKKyAgICAgICAgYyAgPSBib3R0b21bMF07CisgICAgICAgIGQgID0gYm90dG9tWzhdOworICAgICAgICBkMSA9IGEgLSBkOworICAgICAgICBkMiA9IGEgLSBkICsgYiAtIGM7CisKKyAgICAgICAgdG9wWzQ4XSAgID0gKChhIDw8IDMpIC0gZDEgKyBybmQxKSA+PiAzOworICAgICAgICB0b3BbNTZdICAgPSAoKGIgPDwgMykgLSBkMiArIHJuZDIpID4+IDM7CisgICAgICAgIGJvdHRvbVswXSA9ICgoYyA8PCAzKSArIGQyICsgcm5kMSkgPj4gMzsKKyAgICAgICAgYm90dG9tWzhdID0gKChkIDw8IDMpICsgZDEgKyBybmQyKSA+PiAzOworCisgICAgICAgIGJvdHRvbSsrOworICAgICAgICB0b3ArKzsKKyAgICAgICAgcm5kMiA9IDcgLSBybmQyOworICAgICAgICBybmQxID0gNyAtIHJuZDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2YzFfaF9zX292ZXJsYXBfYyhpbnQxNl90ICpsZWZ0LCBpbnQxNl90ICpyaWdodCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgYSwgYiwgYywgZDsKKyAgICBpbnQgZDEsIGQyOworICAgIGludCBybmQxID0gNCwgcm5kMiA9IDM7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBhICA9IGxlZnRbNl07CisgICAgICAgIGIgID0gbGVmdFs3XTsKKyAgICAgICAgYyAgPSByaWdodFswXTsKKyAgICAgICAgZCAgPSByaWdodFsxXTsKKyAgICAgICAgZDEgPSBhIC0gZDsKKyAgICAgICAgZDIgPSBhIC0gZCArIGIgLSBjOworCisgICAgICAgIGxlZnRbNl0gID0gKChhIDw8IDMpIC0gZDEgKyBybmQxKSA+PiAzOworICAgICAgICBsZWZ0WzddICA9ICgoYiA8PCAzKSAtIGQyICsgcm5kMikgPj4gMzsKKyAgICAgICAgcmlnaHRbMF0gPSAoKGMgPDwgMykgKyBkMiArIHJuZDEpID4+IDM7CisgICAgICAgIHJpZ2h0WzFdID0gKChkIDw8IDMpICsgZDEgKyBybmQyKSA+PiAzOworCisgICAgICAgIHJpZ2h0ICs9IDg7CisgICAgICAgIGxlZnQgICs9IDg7CisgICAgICAgIHJuZDIgICA9IDcgLSBybmQyOworICAgICAgICBybmQxICAgPSA3IC0gcm5kMTsKKyAgICB9Cit9CisKKy8qKgorICogVkMtMSBpbi1sb29wIGRlYmxvY2tpbmcgZmlsdGVyIGZvciBvbmUgbGluZQorICogQHBhcmFtIHNyYyBzb3VyY2UgYmxvY2sgdHlwZQorICogQHBhcmFtIHN0cmlkZSBibG9jayBzdHJpZGUKKyAqIEBwYXJhbSBwcSBibG9jayBxdWFudGl6ZXIKKyAqIEByZXR1cm4gd2hldGhlciBvdGhlciAzIHBhaXJzIHNob3VsZCBiZSBmaWx0ZXJlZCBvciBub3QKKyAqIEBzZWUgOC42CisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB2YzFfZmlsdGVyX2xpbmUodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCit7CisgICAgaW50IGEwID0gKDIgKiAoc3JjWy0yICogc3RyaWRlXSAtIHNyY1sxICogc3RyaWRlXSkgLQorICAgICAgICAgICAgICA1ICogKHNyY1stMSAqIHN0cmlkZV0gLSBzcmNbMCAqIHN0cmlkZV0pICsgNCkgPj4gMzsKKyAgICBpbnQgYTBfc2lnbiA9IGEwID4+IDMxOyAgICAgICAgLyogU3RvcmUgc2lnbiAqLworCisgICAgYTAgPSAoYTAgXiBhMF9zaWduKSAtIGEwX3NpZ247IC8qIGEwID0gRkZBQlMoYTApOyAqLworICAgIGlmIChhMCA8IHBxKSB7CisgICAgICAgIGludCBhMSA9IEZGQUJTKCgyICogKHNyY1stNCAqIHN0cmlkZV0gLSBzcmNbLTEgKiBzdHJpZGVdKSAtCisgICAgICAgICAgICAgICAgICAgICAgICA1ICogKHNyY1stMyAqIHN0cmlkZV0gLSBzcmNbLTIgKiBzdHJpZGVdKSArIDQpID4+IDMpOworICAgICAgICBpbnQgYTIgPSBGRkFCUygoMiAqIChzcmNbIDAgKiBzdHJpZGVdIC0gc3JjWyAzICogc3RyaWRlXSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgNSAqIChzcmNbIDEgKiBzdHJpZGVdIC0gc3JjWyAyICogc3RyaWRlXSkgKyA0KSA+PiAzKTsKKyAgICAgICAgaWYgKGExIDwgYTAgfHwgYTIgPCBhMCkgeworICAgICAgICAgICAgaW50IGNsaXAgICAgICA9IHNyY1stMSAqIHN0cmlkZV0gLSBzcmNbMCAqIHN0cmlkZV07CisgICAgICAgICAgICBpbnQgY2xpcF9zaWduID0gY2xpcCA+PiAzMTsKKworICAgICAgICAgICAgY2xpcCA9ICgoY2xpcCBeIGNsaXBfc2lnbikgLSBjbGlwX3NpZ24pID4+IDE7CisgICAgICAgICAgICBpZiAoY2xpcCkgeworICAgICAgICAgICAgICAgIGludCBhMyAgICAgPSBGRk1JTihhMSwgYTIpOworICAgICAgICAgICAgICAgIGludCBkICAgICAgPSA1ICogKGEzIC0gYTApOworICAgICAgICAgICAgICAgIGludCBkX3NpZ24gPSAoZCA+PiAzMSk7CisKKyAgICAgICAgICAgICAgICBkICAgICAgID0gKChkIF4gZF9zaWduKSAtIGRfc2lnbikgPj4gMzsKKyAgICAgICAgICAgICAgICBkX3NpZ24gXj0gYTBfc2lnbjsKKworICAgICAgICAgICAgICAgIGlmIChkX3NpZ24gXiBjbGlwX3NpZ24pCisgICAgICAgICAgICAgICAgICAgIGQgPSAwOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkID0gRkZNSU4oZCwgY2xpcCk7CisgICAgICAgICAgICAgICAgICAgIGQgPSAoZCBeIGRfc2lnbikgLSBkX3NpZ247IC8qIFJlc3RvcmUgc2lnbiAqLworICAgICAgICAgICAgICAgICAgICBzcmNbLTEgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChzcmNbLTEgKiBzdHJpZGVdIC0gZCk7CisgICAgICAgICAgICAgICAgICAgIHNyY1sgMCAqIHN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KHNyY1sgMCAqIHN0cmlkZV0gKyBkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogVkMtMSBpbi1sb29wIGRlYmxvY2tpbmcgZmlsdGVyCisgKiBAcGFyYW0gc3JjIHNvdXJjZSBibG9jayB0eXBlCisgKiBAcGFyYW0gc3RlcCBkaXN0YW5jZSBiZXR3ZWVuIGhvcml6b250YWxseSBhZGphY2VudCBlbGVtZW50cworICogQHBhcmFtIHN0cmlkZSBkaXN0YW5jZSBiZXR3ZWVuIHZlcnRpY2FsbHkgYWRqYWNlbnQgZWxlbWVudHMKKyAqIEBwYXJhbSBsZW4gZWRnZSBsZW5ndGggdG8gZmlsdGVyICg0IG9yIDggcGl4ZWxzKQorICogQHBhcmFtIHBxIGJsb2NrIHF1YW50aXplcgorICogQHNlZSA4LjYKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHZjMV9sb29wX2ZpbHRlcih1aW50OF90ICpzcmMsIGludCBzdGVwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgcHEpCit7CisgICAgaW50IGk7CisgICAgaW50IGZpbHQzOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7CisgICAgICAgIGZpbHQzID0gdmMxX2ZpbHRlcl9saW5lKHNyYyArIDIgKiBzdGVwLCBzdHJpZGUsIHBxKTsKKyAgICAgICAgaWYgKGZpbHQzKSB7CisgICAgICAgICAgICB2YzFfZmlsdGVyX2xpbmUoc3JjICsgMCAqIHN0ZXAsIHN0cmlkZSwgcHEpOworICAgICAgICAgICAgdmMxX2ZpbHRlcl9saW5lKHNyYyArIDEgKiBzdGVwLCBzdHJpZGUsIHBxKTsKKyAgICAgICAgICAgIHZjMV9maWx0ZXJfbGluZShzcmMgKyAzICogc3RlcCwgc3RyaWRlLCBwcSk7CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IHN0ZXAgKiA0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgdmMxX3ZfbG9vcF9maWx0ZXI0X2ModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCit7CisgICAgdmMxX2xvb3BfZmlsdGVyKHNyYywgMSwgc3RyaWRlLCA0LCBwcSk7Cit9CisKK3N0YXRpYyB2b2lkIHZjMV9oX2xvb3BfZmlsdGVyNF9jKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQoreworICAgIHZjMV9sb29wX2ZpbHRlcihzcmMsIHN0cmlkZSwgMSwgNCwgcHEpOworfQorCitzdGF0aWMgdm9pZCB2YzFfdl9sb29wX2ZpbHRlcjhfYyh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSkKK3sKKyAgICB2YzFfbG9vcF9maWx0ZXIoc3JjLCAxLCBzdHJpZGUsIDgsIHBxKTsKK30KKworc3RhdGljIHZvaWQgdmMxX2hfbG9vcF9maWx0ZXI4X2ModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCit7CisgICAgdmMxX2xvb3BfZmlsdGVyKHNyYywgc3RyaWRlLCAxLCA4LCBwcSk7Cit9CisKK3N0YXRpYyB2b2lkIHZjMV92X2xvb3BfZmlsdGVyMTZfYyh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSkKK3sKKyAgICB2YzFfbG9vcF9maWx0ZXIoc3JjLCAxLCBzdHJpZGUsIDE2LCBwcSk7Cit9CisKK3N0YXRpYyB2b2lkIHZjMV9oX2xvb3BfZmlsdGVyMTZfYyh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSkKK3sKKyAgICB2YzFfbG9vcF9maWx0ZXIoc3JjLCBzdHJpZGUsIDEsIDE2LCBwcSk7Cit9CisKKy8qIERvIGludmVyc2UgdHJhbnNmb3JtIG9uIDh4OCBibG9jayAqLworc3RhdGljIHZvaWQgdmMxX2ludl90cmFuc184eDhfZGNfYyh1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBpOworICAgIGludCBkYyA9IGJsb2NrWzBdOworCisgICAgZGMgPSAoMyAqIGRjICsgIDEpID4+IDE7CisgICAgZGMgPSAoMyAqIGRjICsgMTYpID4+IDU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGRlc3RbMF0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMF0gKyBkYyk7CisgICAgICAgIGRlc3RbMV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMV0gKyBkYyk7CisgICAgICAgIGRlc3RbMl0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMl0gKyBkYyk7CisgICAgICAgIGRlc3RbM10gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbM10gKyBkYyk7CisgICAgICAgIGRlc3RbNF0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbNF0gKyBkYyk7CisgICAgICAgIGRlc3RbNV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbNV0gKyBkYyk7CisgICAgICAgIGRlc3RbNl0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbNl0gKyBkYyk7CisgICAgICAgIGRlc3RbN10gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbN10gKyBkYyk7CisgICAgICAgIGRlc3QgKz0gbGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzh4OF9jKGludDE2X3QgYmxvY2tbNjRdKQoreworICAgIGludCBpOworICAgIHJlZ2lzdGVyIGludCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDg7CisgICAgaW50MTZfdCAqc3JjLCAqZHN0LCB0ZW1wWzY0XTsKKworICAgIHNyYyA9IGJsb2NrOworICAgIGRzdCA9IHRlbXA7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICB0MSA9IDEyICogKHNyY1sgMF0gKyBzcmNbMzJdKSArIDQ7CisgICAgICAgIHQyID0gMTIgKiAoc3JjWyAwXSAtIHNyY1szMl0pICsgNDsKKyAgICAgICAgdDMgPSAxNiAqIHNyY1sxNl0gKyAgNiAqIHNyY1s0OF07CisgICAgICAgIHQ0ID0gIDYgKiBzcmNbMTZdIC0gMTYgKiBzcmNbNDhdOworCisgICAgICAgIHQ1ID0gdDEgKyB0MzsKKyAgICAgICAgdDYgPSB0MiArIHQ0OworICAgICAgICB0NyA9IHQyIC0gdDQ7CisgICAgICAgIHQ4ID0gdDEgLSB0MzsKKworICAgICAgICB0MSA9IDE2ICogc3JjWyA4XSArIDE1ICogc3JjWzI0XSArICA5ICogc3JjWzQwXSArICA0ICogc3JjWzU2XTsKKyAgICAgICAgdDIgPSAxNSAqIHNyY1sgOF0gLSAgNCAqIHNyY1syNF0gLSAxNiAqIHNyY1s0MF0gLSAgOSAqIHNyY1s1Nl07CisgICAgICAgIHQzID0gIDkgKiBzcmNbIDhdIC0gMTYgKiBzcmNbMjRdICsgIDQgKiBzcmNbNDBdICsgMTUgKiBzcmNbNTZdOworICAgICAgICB0NCA9ICA0ICogc3JjWyA4XSAtICA5ICogc3JjWzI0XSArIDE1ICogc3JjWzQwXSAtIDE2ICogc3JjWzU2XTsKKworICAgICAgICBkc3RbMF0gPSAodDUgKyB0MSkgPj4gMzsKKyAgICAgICAgZHN0WzFdID0gKHQ2ICsgdDIpID4+IDM7CisgICAgICAgIGRzdFsyXSA9ICh0NyArIHQzKSA+PiAzOworICAgICAgICBkc3RbM10gPSAodDggKyB0NCkgPj4gMzsKKyAgICAgICAgZHN0WzRdID0gKHQ4IC0gdDQpID4+IDM7CisgICAgICAgIGRzdFs1XSA9ICh0NyAtIHQzKSA+PiAzOworICAgICAgICBkc3RbNl0gPSAodDYgLSB0MikgPj4gMzsKKyAgICAgICAgZHN0WzddID0gKHQ1IC0gdDEpID4+IDM7CisKKyAgICAgICAgc3JjICs9IDE7CisgICAgICAgIGRzdCArPSA4OworICAgIH0KKworICAgIHNyYyA9IHRlbXA7CisgICAgZHN0ID0gYmxvY2s7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICB0MSA9IDEyICogKHNyY1sgMF0gKyBzcmNbMzJdKSArIDY0OworICAgICAgICB0MiA9IDEyICogKHNyY1sgMF0gLSBzcmNbMzJdKSArIDY0OworICAgICAgICB0MyA9IDE2ICogc3JjWzE2XSArICA2ICogc3JjWzQ4XTsKKyAgICAgICAgdDQgPSAgNiAqIHNyY1sxNl0gLSAxNiAqIHNyY1s0OF07CisKKyAgICAgICAgdDUgPSB0MSArIHQzOworICAgICAgICB0NiA9IHQyICsgdDQ7CisgICAgICAgIHQ3ID0gdDIgLSB0NDsKKyAgICAgICAgdDggPSB0MSAtIHQzOworCisgICAgICAgIHQxID0gMTYgKiBzcmNbIDhdICsgMTUgKiBzcmNbMjRdICsgIDkgKiBzcmNbNDBdICsgIDQgKiBzcmNbNTZdOworICAgICAgICB0MiA9IDE1ICogc3JjWyA4XSAtICA0ICogc3JjWzI0XSAtIDE2ICogc3JjWzQwXSAtICA5ICogc3JjWzU2XTsKKyAgICAgICAgdDMgPSAgOSAqIHNyY1sgOF0gLSAxNiAqIHNyY1syNF0gKyAgNCAqIHNyY1s0MF0gKyAxNSAqIHNyY1s1Nl07CisgICAgICAgIHQ0ID0gIDQgKiBzcmNbIDhdIC0gIDkgKiBzcmNbMjRdICsgMTUgKiBzcmNbNDBdIC0gMTYgKiBzcmNbNTZdOworCisgICAgICAgIGRzdFsgMF0gPSAodDUgKyB0MSkgPj4gNzsKKyAgICAgICAgZHN0WyA4XSA9ICh0NiArIHQyKSA+PiA3OworICAgICAgICBkc3RbMTZdID0gKHQ3ICsgdDMpID4+IDc7CisgICAgICAgIGRzdFsyNF0gPSAodDggKyB0NCkgPj4gNzsKKyAgICAgICAgZHN0WzMyXSA9ICh0OCAtIHQ0ICsgMSkgPj4gNzsKKyAgICAgICAgZHN0WzQwXSA9ICh0NyAtIHQzICsgMSkgPj4gNzsKKyAgICAgICAgZHN0WzQ4XSA9ICh0NiAtIHQyICsgMSkgPj4gNzsKKyAgICAgICAgZHN0WzU2XSA9ICh0NSAtIHQxICsgMSkgPj4gNzsKKworICAgICAgICBzcmMrKzsKKyAgICAgICAgZHN0Kys7CisgICAgfQorfQorCisvKiBEbyBpbnZlcnNlIHRyYW5zZm9ybSBvbiA4eDQgcGFydCBvZiBibG9jayAqLworc3RhdGljIHZvaWQgdmMxX2ludl90cmFuc184eDRfZGNfYyh1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBpOworICAgIGludCBkYyA9IGJsb2NrWzBdOworCisgICAgZGMgPSAgKDMgKiBkYyArICAxKSA+PiAxOworICAgIGRjID0gKDE3ICogZGMgKyA2NCkgPj4gNzsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgZGVzdFswXSA9IGF2X2NsaXBfdWludDgoZGVzdFswXSArIGRjKTsKKyAgICAgICAgZGVzdFsxXSA9IGF2X2NsaXBfdWludDgoZGVzdFsxXSArIGRjKTsKKyAgICAgICAgZGVzdFsyXSA9IGF2X2NsaXBfdWludDgoZGVzdFsyXSArIGRjKTsKKyAgICAgICAgZGVzdFszXSA9IGF2X2NsaXBfdWludDgoZGVzdFszXSArIGRjKTsKKyAgICAgICAgZGVzdFs0XSA9IGF2X2NsaXBfdWludDgoZGVzdFs0XSArIGRjKTsKKyAgICAgICAgZGVzdFs1XSA9IGF2X2NsaXBfdWludDgoZGVzdFs1XSArIGRjKTsKKyAgICAgICAgZGVzdFs2XSA9IGF2X2NsaXBfdWludDgoZGVzdFs2XSArIGRjKTsKKyAgICAgICAgZGVzdFs3XSA9IGF2X2NsaXBfdWludDgoZGVzdFs3XSArIGRjKTsKKyAgICAgICAgZGVzdCArPSBsaW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZjMV9pbnZfdHJhbnNfOHg0X2ModWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgaTsKKyAgICByZWdpc3RlciBpbnQgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4OworICAgIGludDE2X3QgKnNyYywgKmRzdDsKKworICAgIHNyYyA9IGJsb2NrOworICAgIGRzdCA9IGJsb2NrOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICB0MSA9IDEyICogKHNyY1swXSArIHNyY1s0XSkgKyA0OworICAgICAgICB0MiA9IDEyICogKHNyY1swXSAtIHNyY1s0XSkgKyA0OworICAgICAgICB0MyA9IDE2ICogc3JjWzJdICsgIDYgKiBzcmNbNl07CisgICAgICAgIHQ0ID0gIDYgKiBzcmNbMl0gLSAxNiAqIHNyY1s2XTsKKworICAgICAgICB0NSA9IHQxICsgdDM7CisgICAgICAgIHQ2ID0gdDIgKyB0NDsKKyAgICAgICAgdDcgPSB0MiAtIHQ0OworICAgICAgICB0OCA9IHQxIC0gdDM7CisKKyAgICAgICAgdDEgPSAxNiAqIHNyY1sxXSArIDE1ICogc3JjWzNdICsgIDkgKiBzcmNbNV0gKyAgNCAqIHNyY1s3XTsKKyAgICAgICAgdDIgPSAxNSAqIHNyY1sxXSAtICA0ICogc3JjWzNdIC0gMTYgKiBzcmNbNV0gLSAgOSAqIHNyY1s3XTsKKyAgICAgICAgdDMgPSAgOSAqIHNyY1sxXSAtIDE2ICogc3JjWzNdICsgIDQgKiBzcmNbNV0gKyAxNSAqIHNyY1s3XTsKKyAgICAgICAgdDQgPSAgNCAqIHNyY1sxXSAtICA5ICogc3JjWzNdICsgMTUgKiBzcmNbNV0gLSAxNiAqIHNyY1s3XTsKKworICAgICAgICBkc3RbMF0gPSAodDUgKyB0MSkgPj4gMzsKKyAgICAgICAgZHN0WzFdID0gKHQ2ICsgdDIpID4+IDM7CisgICAgICAgIGRzdFsyXSA9ICh0NyArIHQzKSA+PiAzOworICAgICAgICBkc3RbM10gPSAodDggKyB0NCkgPj4gMzsKKyAgICAgICAgZHN0WzRdID0gKHQ4IC0gdDQpID4+IDM7CisgICAgICAgIGRzdFs1XSA9ICh0NyAtIHQzKSA+PiAzOworICAgICAgICBkc3RbNl0gPSAodDYgLSB0MikgPj4gMzsKKyAgICAgICAgZHN0WzddID0gKHQ1IC0gdDEpID4+IDM7CisKKyAgICAgICAgc3JjICs9IDg7CisgICAgICAgIGRzdCArPSA4OworICAgIH0KKworICAgIHNyYyA9IGJsb2NrOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgdDEgPSAxNyAqIChzcmNbIDBdICsgc3JjWzE2XSkgKyA2NDsKKyAgICAgICAgdDIgPSAxNyAqIChzcmNbIDBdIC0gc3JjWzE2XSkgKyA2NDsKKyAgICAgICAgdDMgPSAyMiAqIHNyY1sgOF0gKyAxMCAqIHNyY1syNF07CisgICAgICAgIHQ0ID0gMjIgKiBzcmNbMjRdIC0gMTAgKiBzcmNbIDhdOworCisgICAgICAgIGRlc3RbMCAqIGxpbmVzaXplXSA9IGF2X2NsaXBfdWludDgoZGVzdFswICogbGluZXNpemVdICsgKCh0MSArIHQzKSA+PiA3KSk7CisgICAgICAgIGRlc3RbMSAqIGxpbmVzaXplXSA9IGF2X2NsaXBfdWludDgoZGVzdFsxICogbGluZXNpemVdICsgKCh0MiAtIHQ0KSA+PiA3KSk7CisgICAgICAgIGRlc3RbMiAqIGxpbmVzaXplXSA9IGF2X2NsaXBfdWludDgoZGVzdFsyICogbGluZXNpemVdICsgKCh0MiArIHQ0KSA+PiA3KSk7CisgICAgICAgIGRlc3RbMyAqIGxpbmVzaXplXSA9IGF2X2NsaXBfdWludDgoZGVzdFszICogbGluZXNpemVdICsgKCh0MSAtIHQzKSA+PiA3KSk7CisKKyAgICAgICAgc3JjKys7CisgICAgICAgIGRlc3QrKzsKKyAgICB9Cit9CisKKy8qIERvIGludmVyc2UgdHJhbnNmb3JtIG9uIDR4OCBwYXJ0cyBvZiBibG9jayAqLworc3RhdGljIHZvaWQgdmMxX2ludl90cmFuc180eDhfZGNfYyh1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBpOworICAgIGludCBkYyA9IGJsb2NrWzBdOworCisgICAgZGMgPSAoMTcgKiBkYyArICA0KSA+PiAzOworICAgIGRjID0gKDEyICogZGMgKyA2NCkgPj4gNzsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgZGVzdFswXSA9IGF2X2NsaXBfdWludDgoZGVzdFswXSArIGRjKTsKKyAgICAgICAgZGVzdFsxXSA9IGF2X2NsaXBfdWludDgoZGVzdFsxXSArIGRjKTsKKyAgICAgICAgZGVzdFsyXSA9IGF2X2NsaXBfdWludDgoZGVzdFsyXSArIGRjKTsKKyAgICAgICAgZGVzdFszXSA9IGF2X2NsaXBfdWludDgoZGVzdFszXSArIGRjKTsKKyAgICAgICAgZGVzdCArPSBsaW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZjMV9pbnZfdHJhbnNfNHg4X2ModWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgaTsKKyAgICByZWdpc3RlciBpbnQgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4OworICAgIGludDE2X3QgKnNyYywgKmRzdDsKKworICAgIHNyYyA9IGJsb2NrOworICAgIGRzdCA9IGJsb2NrOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICB0MSA9IDE3ICogKHNyY1swXSArIHNyY1syXSkgKyA0OworICAgICAgICB0MiA9IDE3ICogKHNyY1swXSAtIHNyY1syXSkgKyA0OworICAgICAgICB0MyA9IDIyICogc3JjWzFdICsgMTAgKiBzcmNbM107CisgICAgICAgIHQ0ID0gMjIgKiBzcmNbM10gLSAxMCAqIHNyY1sxXTsKKworICAgICAgICBkc3RbMF0gPSAodDEgKyB0MykgPj4gMzsKKyAgICAgICAgZHN0WzFdID0gKHQyIC0gdDQpID4+IDM7CisgICAgICAgIGRzdFsyXSA9ICh0MiArIHQ0KSA+PiAzOworICAgICAgICBkc3RbM10gPSAodDEgLSB0MykgPj4gMzsKKworICAgICAgICBzcmMgKz0gODsKKyAgICAgICAgZHN0ICs9IDg7CisgICAgfQorCisgICAgc3JjID0gYmxvY2s7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICB0MSA9IDEyICogKHNyY1sgMF0gKyBzcmNbMzJdKSArIDY0OworICAgICAgICB0MiA9IDEyICogKHNyY1sgMF0gLSBzcmNbMzJdKSArIDY0OworICAgICAgICB0MyA9IDE2ICogc3JjWzE2XSArICA2ICogc3JjWzQ4XTsKKyAgICAgICAgdDQgPSAgNiAqIHNyY1sxNl0gLSAxNiAqIHNyY1s0OF07CisKKyAgICAgICAgdDUgPSB0MSArIHQzOworICAgICAgICB0NiA9IHQyICsgdDQ7CisgICAgICAgIHQ3ID0gdDIgLSB0NDsKKyAgICAgICAgdDggPSB0MSAtIHQzOworCisgICAgICAgIHQxID0gMTYgKiBzcmNbIDhdICsgMTUgKiBzcmNbMjRdICsgIDkgKiBzcmNbNDBdICsgIDQgKiBzcmNbNTZdOworICAgICAgICB0MiA9IDE1ICogc3JjWyA4XSAtICA0ICogc3JjWzI0XSAtIDE2ICogc3JjWzQwXSAtICA5ICogc3JjWzU2XTsKKyAgICAgICAgdDMgPSAgOSAqIHNyY1sgOF0gLSAxNiAqIHNyY1syNF0gKyAgNCAqIHNyY1s0MF0gKyAxNSAqIHNyY1s1Nl07CisgICAgICAgIHQ0ID0gIDQgKiBzcmNbIDhdIC0gIDkgKiBzcmNbMjRdICsgMTUgKiBzcmNbNDBdIC0gMTYgKiBzcmNbNTZdOworCisgICAgICAgIGRlc3RbMCAqIGxpbmVzaXplXSA9IGF2X2NsaXBfdWludDgoZGVzdFswICogbGluZXNpemVdICsgKCh0NSArIHQxKSAgICAgPj4gNykpOworICAgICAgICBkZXN0WzEgKiBsaW5lc2l6ZV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMSAqIGxpbmVzaXplXSArICgodDYgKyB0MikgICAgID4+IDcpKTsKKyAgICAgICAgZGVzdFsyICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzIgKiBsaW5lc2l6ZV0gKyAoKHQ3ICsgdDMpICAgICA+PiA3KSk7CisgICAgICAgIGRlc3RbMyAqIGxpbmVzaXplXSA9IGF2X2NsaXBfdWludDgoZGVzdFszICogbGluZXNpemVdICsgKCh0OCArIHQ0KSAgICAgPj4gNykpOworICAgICAgICBkZXN0WzQgKiBsaW5lc2l6ZV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbNCAqIGxpbmVzaXplXSArICgodDggLSB0NCArIDEpID4+IDcpKTsKKyAgICAgICAgZGVzdFs1ICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzUgKiBsaW5lc2l6ZV0gKyAoKHQ3IC0gdDMgKyAxKSA+PiA3KSk7CisgICAgICAgIGRlc3RbNiAqIGxpbmVzaXplXSA9IGF2X2NsaXBfdWludDgoZGVzdFs2ICogbGluZXNpemVdICsgKCh0NiAtIHQyICsgMSkgPj4gNykpOworICAgICAgICBkZXN0WzcgKiBsaW5lc2l6ZV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbNyAqIGxpbmVzaXplXSArICgodDUgLSB0MSArIDEpID4+IDcpKTsKKworICAgICAgICBzcmMrKzsKKyAgICAgICAgZGVzdCsrOworICAgIH0KK30KKworLyogRG8gaW52ZXJzZSB0cmFuc2Zvcm0gb24gNHg0IHBhcnQgb2YgYmxvY2sgKi8KK3N0YXRpYyB2b2lkIHZjMV9pbnZfdHJhbnNfNHg0X2RjX2ModWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZGMgPSBibG9ja1swXTsKKworICAgIGRjID0gKDE3ICogZGMgKyAgNCkgPj4gMzsKKyAgICBkYyA9ICgxNyAqIGRjICsgNjQpID4+IDc7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGRlc3RbMF0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMF0gKyBkYyk7CisgICAgICAgIGRlc3RbMV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMV0gKyBkYyk7CisgICAgICAgIGRlc3RbMl0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMl0gKyBkYyk7CisgICAgICAgIGRlc3RbM10gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbM10gKyBkYyk7CisgICAgICAgIGRlc3QgKz0gbGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzR4NF9jKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgaW50IGk7CisgICAgcmVnaXN0ZXIgaW50IHQxLCB0MiwgdDMsIHQ0OworICAgIGludDE2X3QgKnNyYywgKmRzdDsKKworICAgIHNyYyA9IGJsb2NrOworICAgIGRzdCA9IGJsb2NrOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgdDEgPSAxNyAqIChzcmNbMF0gKyBzcmNbMl0pICsgNDsKKyAgICAgICAgdDIgPSAxNyAqIChzcmNbMF0gLSBzcmNbMl0pICsgNDsKKyAgICAgICAgdDMgPSAyMiAqIHNyY1sxXSArIDEwICogc3JjWzNdOworICAgICAgICB0NCA9IDIyICogc3JjWzNdIC0gMTAgKiBzcmNbMV07CisKKyAgICAgICAgZHN0WzBdID0gKHQxICsgdDMpID4+IDM7CisgICAgICAgIGRzdFsxXSA9ICh0MiAtIHQ0KSA+PiAzOworICAgICAgICBkc3RbMl0gPSAodDIgKyB0NCkgPj4gMzsKKyAgICAgICAgZHN0WzNdID0gKHQxIC0gdDMpID4+IDM7CisKKyAgICAgICAgc3JjICs9IDg7CisgICAgICAgIGRzdCArPSA4OworICAgIH0KKworICAgIHNyYyA9IGJsb2NrOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgdDEgPSAxNyAqIChzcmNbMF0gKyBzcmNbMTZdKSArIDY0OworICAgICAgICB0MiA9IDE3ICogKHNyY1swXSAtIHNyY1sxNl0pICsgNjQ7CisgICAgICAgIHQzID0gMjIgKiBzcmNbOF0gKyAxMCAqIHNyY1syNF07CisgICAgICAgIHQ0ID0gMjIgKiBzcmNbMjRdIC0gMTAgKiBzcmNbOF07CisKKyAgICAgICAgZGVzdFswICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzAgKiBsaW5lc2l6ZV0gKyAoKHQxICsgdDMpID4+IDcpKTsKKyAgICAgICAgZGVzdFsxICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzEgKiBsaW5lc2l6ZV0gKyAoKHQyIC0gdDQpID4+IDcpKTsKKyAgICAgICAgZGVzdFsyICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzIgKiBsaW5lc2l6ZV0gKyAoKHQyICsgdDQpID4+IDcpKTsKKyAgICAgICAgZGVzdFszICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzMgKiBsaW5lc2l6ZV0gKyAoKHQxIC0gdDMpID4+IDcpKTsKKworICAgICAgICBzcmMrKzsKKyAgICAgICAgZGVzdCsrOworICAgIH0KK30KKworLyogbW90aW9uIGNvbXBlbnNhdGlvbiBmdW5jdGlvbnMgKi8KKworLyogRmlsdGVyIGluIGNhc2Ugb2YgMiBmaWx0ZXJzICovCisjZGVmaW5lIFZDMV9NU1BFTF9GSUxURVJfMTZCKERJUiwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgdmMxX21zcGVsXyAjIyBESVIgIyMgX2ZpbHRlcl8xNmJpdHMoY29uc3QgVFlQRSAqc3JjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUpICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3dpdGNoKG1vZGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAwOiAvKiBubyBzaGlmdCAtIHNob3VsZCBub3Qgb2NjdXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAxOiAvKiAxLzQgc2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAtNCAqIHNyY1stc3RyaWRlXSArIDUzICogc3JjWzBdICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAxOCAqIHNyY1tzdHJpZGVdICAtICAzICogc3JjW3N0cmlkZSAqIDJdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiAvKiAxLzIgc2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAtMSAqIHNyY1stc3RyaWRlXSArICA5ICogc3JjWzBdICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgOSAqIHNyY1tzdHJpZGVdICAtICAxICogc3JjW3N0cmlkZSAqIDJdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAzOiAvKiAzLzQgc2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAtMyAqIHNyY1stc3RyaWRlXSArIDE4ICogc3JjWzBdICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA1MyAqIHNyY1tzdHJpZGVdICAtICA0ICogc3JjW3N0cmlkZSAqIDJdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIDA7IC8qIHNob3VsZCBub3Qgb2NjdXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1ZDMV9NU1BFTF9GSUxURVJfMTZCKHZlciwgdWludDhfdCkKK1ZDMV9NU1BFTF9GSUxURVJfMTZCKGhvciwgaW50MTZfdCkKKworLyogRmlsdGVyIHVzZWQgdG8gaW50ZXJwb2xhdGUgZnJhY3Rpb25hbCBwZWwgdmFsdWVzICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgdmMxX21zcGVsX2ZpbHRlcihjb25zdCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgaW50IHIpCit7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSAwOiAvLyBubyBzaGlmdAorICAgICAgICByZXR1cm4gc3JjWzBdOworICAgIGNhc2UgMTogLy8gMS80IHNoaWZ0CisgICAgICAgIHJldHVybiAoLTQgKiBzcmNbLXN0cmlkZV0gKyA1MyAqIHNyY1swXSArCisgICAgICAgICAgICAgICAgMTggKiBzcmNbc3RyaWRlXSAgLSAgMyAqIHNyY1tzdHJpZGUgKiAyXSArIDMyIC0gcikgPj4gNjsKKyAgICBjYXNlIDI6IC8vIDEvMiBzaGlmdAorICAgICAgICByZXR1cm4gKC0xICogc3JjWy1zdHJpZGVdICsgIDkgKiBzcmNbMF0gKworICAgICAgICAgICAgICAgICA5ICogc3JjW3N0cmlkZV0gIC0gIDEgKiBzcmNbc3RyaWRlICogMl0gKyA4IC0gcikgPj4gNDsKKyAgICBjYXNlIDM6IC8vIDMvNCBzaGlmdAorICAgICAgICByZXR1cm4gKC0zICogc3JjWy1zdHJpZGVdICsgMTggKiBzcmNbMF0gKworICAgICAgICAgICAgICAgIDUzICogc3JjW3N0cmlkZV0gIC0gIDQgKiBzcmNbc3RyaWRlICogMl0gKyAzMiAtIHIpID4+IDY7CisgICAgfQorICAgIHJldHVybiAwOyAvLyBzaG91bGQgbm90IG9jY3VyCit9CisKKy8qIEZ1bmN0aW9uIHVzZWQgdG8gZG8gbW90aW9uIGNvbXBlbnNhdGlvbiB3aXRoIGJpY3ViaWMgaW50ZXJwb2xhdGlvbiAqLworI2RlZmluZSBWQzFfTVNQRUxfTUMoT1AsIE9QNCwgT1BOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBPUE5BTUUgIyMgdmMxX21zcGVsX21jKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBobW9kZSwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2bW9kZSwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBybmQpICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh2bW9kZSkgeyAvKiBIb3Jpem9udGFsIGZpbHRlciB0byBhcHBseSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaG1vZGUpIHsgLyogVmVydGljYWwgZmlsdGVyIHRvIGFwcGx5LCBvdXRwdXQgdG8gdG1wICovICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBzaGlmdF92YWx1ZVtdID0geyAwLCA1LCAxLCA1IH07ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IHNoaWZ0ID0gKHNoaWZ0X3ZhbHVlW2htb2RlXSArIHNoaWZ0X3ZhbHVlW3Ztb2RlXSkgPj4gMTsgICAgICAgXAorICAgICAgICAgICAgaW50MTZfdCB0bXBbMTEgKiA4XSwgKnRwdHIgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgciA9ICgxIDw8IChzaGlmdCAtIDEpKSArIHJuZCAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3JjIC09IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMTsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0cHRyW2ldID0gKHZjMV9tc3BlbF92ZXJfZmlsdGVyXzE2Yml0cyhzcmMgKyBpLCBzdHJpZGUsIHZtb2RlKSArIHIpID4+IHNoaWZ0OyBcCisgICAgICAgICAgICAgICAgc3JjICArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdHB0ciArPSAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByICAgID0gNjQgLSBybmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0cHRyID0gdG1wICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIE9QKGRzdFtpXSwgKHZjMV9tc3BlbF9ob3JfZmlsdGVyXzE2Yml0cyh0cHRyICsgaSwgMSwgaG1vZGUpICsgcikgPj4gNyk7IFwKKyAgICAgICAgICAgICAgICBkc3QgICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0cHRyICs9IDExOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgLyogTm8gaG9yaXpvbnRhbCBmaWx0ZXIsIG91dHB1dCA4IGxpbmVzIHRvIGRzdCAqLyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHIgPSAxIC0gcm5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgT1AoZHN0W2ldLCB2YzFfbXNwZWxfZmlsdGVyKHNyYyArIGksIHN0cmlkZSwgdm1vZGUsIHIpKTsgIFwKKyAgICAgICAgICAgICAgICBzcmMgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBIb3Jpem9udGFsIG1vZGUgd2l0aCBubyB2ZXJ0aWNhbCBtb2RlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE9QKGRzdFtpXSwgdmMxX21zcGVsX2ZpbHRlcihzcmMgKyBpLCAxLCBobW9kZSwgcm5kKSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK31cCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIE9QTkFNRSAjIyB2YzFfbXNwZWxfbWNfMTYodWludDhfdCAqZHN0LCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhtb2RlLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZtb2RlLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJuZCkgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHZtb2RlKSB7IC8qIEhvcml6b250YWwgZmlsdGVyIHRvIGFwcGx5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChobW9kZSkgeyAvKiBWZXJ0aWNhbCBmaWx0ZXIgdG8gYXBwbHksIG91dHB1dCB0byB0bXAgKi8gICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IHNoaWZ0X3ZhbHVlW10gPSB7IDAsIDUsIDEsIDUgfTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgc2hpZnQgPSAoc2hpZnRfdmFsdWVbaG1vZGVdICsgc2hpZnRfdmFsdWVbdm1vZGVdKSA+PiAxOyAgICAgICBcCisgICAgICAgICAgICBpbnQxNl90IHRtcFsxOSAqIDE2XSwgKnRwdHIgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByID0gKDEgPDwgKHNoaWZ0IC0gMSkpICsgcm5kIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzcmMgLT0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE5OyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHRwdHJbaV0gPSAodmMxX21zcGVsX3Zlcl9maWx0ZXJfMTZiaXRzKHNyYyArIGksIHN0cmlkZSwgdm1vZGUpICsgcikgPj4gc2hpZnQ7IFwKKyAgICAgICAgICAgICAgICBzcmMgICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0cHRyICs9IDE5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHIgICAgPSA2NCAtIHJuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRwdHIgPSB0bXAgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgT1AoZHN0W2ldLCAodmMxX21zcGVsX2hvcl9maWx0ZXJfMTZiaXRzKHRwdHIgKyBpLCAxLCBobW9kZSkgKyByKSA+PiA3KTsgXAorICAgICAgICAgICAgICAgIGRzdCAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRwdHIgKz0gMTk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAvKiBObyBob3Jpem9udGFsIGZpbHRlciwgb3V0cHV0IDggbGluZXMgdG8gZHN0ICovICAgICAgICAgICAgXAorICAgICAgICAgICAgciA9IDEgLSBybmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBPUChkc3RbaV0sIHZjMV9tc3BlbF9maWx0ZXIoc3JjICsgaSwgc3RyaWRlLCB2bW9kZSwgcikpOyAgXAorICAgICAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEhvcml6b250YWwgbW9kZSB3aXRoIG5vIHZlcnRpY2FsIG1vZGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgT1AoZHN0W2ldLCB2YzFfbXNwZWxfZmlsdGVyKHNyYyArIGksIDEsIGhtb2RlLCBybmQpKTsgICAgICAgICAgICAgXAorICAgICAgICBkc3QgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmMgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfVwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBwaXhlbHM4eDhfYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgcm5kKXtcCisgICAgaW50IGk7XAorICAgIGZvcihpPTA7IGk8ODsgaSsrKXtcCisgICAgICAgIE9QNCgqKHVpbnQzMl90KikoYmxvY2sgICksIEFWX1JOMzIocGl4ZWxzICApKTtcCisgICAgICAgIE9QNCgqKHVpbnQzMl90KikoYmxvY2srNCksIEFWX1JOMzIocGl4ZWxzKzQpKTtcCisgICAgICAgIHBpeGVscys9bGluZV9zaXplO1wKKyAgICAgICAgYmxvY2sgKz1saW5lX3NpemU7XAorICAgIH1cCit9XAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHBpeGVsczE2eDE2X2ModWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IHJuZCl7XAorICAgIGludCBpO1wKKyAgICBmb3IoaT0wOyBpPDE2OyBpKyspe1wKKyAgICAgICAgT1A0KCoodWludDMyX3QqKShibG9jayAgICksIEFWX1JOMzIocGl4ZWxzICAgKSk7XAorICAgICAgICBPUDQoKih1aW50MzJfdCopKGJsb2NrKyA0KSwgQVZfUk4zMihwaXhlbHMrIDQpKTtcCisgICAgICAgIE9QNCgqKHVpbnQzMl90KikoYmxvY2srIDgpLCBBVl9STjMyKHBpeGVscysgOCkpO1wKKyAgICAgICAgT1A0KCoodWludDMyX3QqKShibG9jaysxMiksIEFWX1JOMzIocGl4ZWxzKzEyKSk7XAorICAgICAgICBwaXhlbHMrPWxpbmVfc2l6ZTtcCisgICAgICAgIGJsb2NrICs9bGluZV9zaXplO1wKKyAgICB9XAorfQorCisjZGVmaW5lIG9wX3B1dChhLCBiKSBhID0gYXZfY2xpcF91aW50OChiKQorI2RlZmluZSBvcF9hdmcoYSwgYikgYSA9IChhICsgYXZfY2xpcF91aW50OChiKSArIDEpID4+IDEKKyNkZWZpbmUgb3A0X2F2ZyhhLCBiKSBhID0gcm5kX2F2ZzMyKGEsIGIpCisjZGVmaW5lIG9wNF9wdXQoYSwgYikgYSA9IGIKKworVkMxX01TUEVMX01DKG9wX3B1dCwgb3A0X3B1dCwgcHV0XykKK1ZDMV9NU1BFTF9NQyhvcF9hdmcsIG9wNF9hdmcsIGF2Z18pCisKKy8qIHBpeGVsIGZ1bmN0aW9ucyAtIHJlYWxseSBhcmUgZW50cnkgcG9pbnRzIHRvIHZjMV9tc3BlbF9tYyAqLworCisjZGVmaW5lIFBVVF9WQzFfTVNQRUwoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBwdXRfdmMxX21zcGVsX21jICMjIGEgIyMgYiAjIyBfYyh1aW50OF90ICpkc3QsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKSAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0X3ZjMV9tc3BlbF9tYyhkc3QsIHNyYywgc3RyaWRlLCBhLCBiLCBybmQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBhdmdfdmMxX21zcGVsX21jICMjIGEgIyMgYiAjIyBfYyh1aW50OF90ICpkc3QsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKSAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZnX3ZjMV9tc3BlbF9tYyhkc3QsIHNyYywgc3RyaWRlLCBhLCBiLCBybmQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBwdXRfdmMxX21zcGVsX21jICMjIGEgIyMgYiAjIyBfMTZfYyh1aW50OF90ICpkc3QsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHV0X3ZjMV9tc3BlbF9tY18xNihkc3QsIHNyYywgc3RyaWRlLCBhLCBiLCBybmQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBhdmdfdmMxX21zcGVsX21jICMjIGEgIyMgYiAjIyBfMTZfYyh1aW50OF90ICpkc3QsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZnX3ZjMV9tc3BlbF9tY18xNihkc3QsIHNyYywgc3RyaWRlLCBhLCBiLCBybmQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1BVVF9WQzFfTVNQRUwoMSwgMCkKK1BVVF9WQzFfTVNQRUwoMiwgMCkKK1BVVF9WQzFfTVNQRUwoMywgMCkKKworUFVUX1ZDMV9NU1BFTCgwLCAxKQorUFVUX1ZDMV9NU1BFTCgxLCAxKQorUFVUX1ZDMV9NU1BFTCgyLCAxKQorUFVUX1ZDMV9NU1BFTCgzLCAxKQorCitQVVRfVkMxX01TUEVMKDAsIDIpCitQVVRfVkMxX01TUEVMKDEsIDIpCitQVVRfVkMxX01TUEVMKDIsIDIpCitQVVRfVkMxX01TUEVMKDMsIDIpCisKK1BVVF9WQzFfTVNQRUwoMCwgMykKK1BVVF9WQzFfTVNQRUwoMSwgMykKK1BVVF9WQzFfTVNQRUwoMiwgMykKK1BVVF9WQzFfTVNQRUwoMywgMykKKworI2RlZmluZSBjaHJvbWFfbWMoYSkgXAorICAgICgoQSAqIHNyY1thXSArIEIgKiBzcmNbYSArIDFdICsgXAorICAgICAgQyAqIHNyY1tzdHJpZGUgKyBhXSArIEQgKiBzcmNbc3RyaWRlICsgYSArIDFdICsgMzIgLSA0KSA+PiA2KQorc3RhdGljIHZvaWQgcHV0X25vX3JuZF92YzFfY2hyb21hX21jOF9jKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiA4ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpCit7CisgICAgY29uc3QgaW50IEEgPSAoOCAtIHgpICogKDggLSB5KTsKKyAgICBjb25zdCBpbnQgQiA9ICAgICAoeCkgKiAoOCAtIHkpOworICAgIGNvbnN0IGludCBDID0gKDggLSB4KSAqICAgICAoeSk7CisgICAgY29uc3QgaW50IEQgPSAgICAgKHgpICogICAgICh5KTsKKyAgICBpbnQgaTsKKworICAgIGF2X2Fzc2VydDIoeCA8IDggJiYgeSA8IDggJiYgeCA+PSAwICYmIHkgPj0gMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIGRzdFswXSA9IGNocm9tYV9tYygwKTsKKyAgICAgICAgZHN0WzFdID0gY2hyb21hX21jKDEpOworICAgICAgICBkc3RbMl0gPSBjaHJvbWFfbWMoMik7CisgICAgICAgIGRzdFszXSA9IGNocm9tYV9tYygzKTsKKyAgICAgICAgZHN0WzRdID0gY2hyb21hX21jKDQpOworICAgICAgICBkc3RbNV0gPSBjaHJvbWFfbWMoNSk7CisgICAgICAgIGRzdFs2XSA9IGNocm9tYV9tYyg2KTsKKyAgICAgICAgZHN0WzddID0gY2hyb21hX21jKDcpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHV0X25vX3JuZF92YzFfY2hyb21hX21jNF9jKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpCit7CisgICAgY29uc3QgaW50IEEgPSAoOCAtIHgpICogKDggLSB5KTsKKyAgICBjb25zdCBpbnQgQiA9ICAgICAoeCkgKiAoOCAtIHkpOworICAgIGNvbnN0IGludCBDID0gKDggLSB4KSAqICAgICAoeSk7CisgICAgY29uc3QgaW50IEQgPSAgICAgKHgpICogICAgICh5KTsKKyAgICBpbnQgaTsKKworICAgIGF2X2Fzc2VydDIoeCA8IDggJiYgeSA8IDggJiYgeCA+PSAwICYmIHkgPj0gMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIGRzdFswXSA9IGNocm9tYV9tYygwKTsKKyAgICAgICAgZHN0WzFdID0gY2hyb21hX21jKDEpOworICAgICAgICBkc3RbMl0gPSBjaHJvbWFfbWMoMik7CisgICAgICAgIGRzdFszXSA9IGNocm9tYV9tYygzKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICB9Cit9CisKKyNkZWZpbmUgYXZnMihhLCBiKSAoKChhKSArIChiKSArIDEpID4+IDEpCitzdGF0aWMgdm9pZCBhdmdfbm9fcm5kX3ZjMV9jaHJvbWFfbWM4X2ModWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjIC8qIGFsaWduIDEgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSkKK3sKKyAgICBjb25zdCBpbnQgQSA9ICg4IC0geCkgKiAoOCAtIHkpOworICAgIGNvbnN0IGludCBCID0gICAgICh4KSAqICg4IC0geSk7CisgICAgY29uc3QgaW50IEMgPSAoOCAtIHgpICogICAgICh5KTsKKyAgICBjb25zdCBpbnQgRCA9ICAgICAoeCkgKiAgICAgKHkpOworICAgIGludCBpOworCisgICAgYXZfYXNzZXJ0Mih4IDwgOCAmJiB5IDwgOCAmJiB4ID49IDAgJiYgeSA+PSAwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgZHN0WzBdID0gYXZnMihkc3RbMF0sIGNocm9tYV9tYygwKSk7CisgICAgICAgIGRzdFsxXSA9IGF2ZzIoZHN0WzFdLCBjaHJvbWFfbWMoMSkpOworICAgICAgICBkc3RbMl0gPSBhdmcyKGRzdFsyXSwgY2hyb21hX21jKDIpKTsKKyAgICAgICAgZHN0WzNdID0gYXZnMihkc3RbM10sIGNocm9tYV9tYygzKSk7CisgICAgICAgIGRzdFs0XSA9IGF2ZzIoZHN0WzRdLCBjaHJvbWFfbWMoNCkpOworICAgICAgICBkc3RbNV0gPSBhdmcyKGRzdFs1XSwgY2hyb21hX21jKDUpKTsKKyAgICAgICAgZHN0WzZdID0gYXZnMihkc3RbNl0sIGNocm9tYV9tYyg2KSk7CisgICAgICAgIGRzdFs3XSA9IGF2ZzIoZHN0WzddLCBjaHJvbWFfbWMoNykpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYXZnX25vX3JuZF92YzFfY2hyb21hX21jNF9jKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiA4ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpCit7CisgICAgY29uc3QgaW50IEEgPSAoOCAtIHgpICogKDggLSB5KTsKKyAgICBjb25zdCBpbnQgQiA9ICggICAgeCkgKiAoOCAtIHkpOworICAgIGNvbnN0IGludCBDID0gKDggLSB4KSAqICggICAgeSk7CisgICAgY29uc3QgaW50IEQgPSAoICAgIHgpICogKCAgICB5KTsKKyAgICBpbnQgaTsKKworICAgIGF2X2Fzc2VydDIoeCA8IDggJiYgeSA8IDggJiYgeCA+PSAwICYmIHkgPj0gMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIGRzdFswXSA9IGF2ZzIoZHN0WzBdLCBjaHJvbWFfbWMoMCkpOworICAgICAgICBkc3RbMV0gPSBhdmcyKGRzdFsxXSwgY2hyb21hX21jKDEpKTsKKyAgICAgICAgZHN0WzJdID0gYXZnMihkc3RbMl0sIGNocm9tYV9tYygyKSk7CisgICAgICAgIGRzdFszXSA9IGF2ZzIoZHN0WzNdLCBjaHJvbWFfbWMoMykpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgIH0KK30KKworI2lmIENPTkZJR19XTVYzSU1BR0VfREVDT0RFUiB8fCBDT05GSUdfVkMxSU1BR0VfREVDT0RFUgorCitzdGF0aWMgdm9pZCBzcHJpdGVfaF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWR2YW5jZSwgaW50IGNvdW50KQoreworICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgIGludCBhID0gc3JjWyhvZmZzZXQgPj4gMTYpXTsKKyAgICAgICAgaW50IGIgPSBzcmNbKG9mZnNldCA+PiAxNikgKyAxXTsKKyAgICAgICAgKmRzdCsrICA9IGEgKyAoKGIgLSBhKSAqIChvZmZzZXQgJiAweEZGRkYpID4+IDE2KTsKKyAgICAgICAgb2Zmc2V0ICs9IGFkdmFuY2U7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHNwcml0ZV92X3RlbXBsYXRlKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR3b19zcHJpdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsIGludCBzY2FsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkKK3sKKyAgICBpbnQgYTEsIGIxLCBhMiwgYjI7CisgICAgd2hpbGUgKHdpZHRoLS0pIHsKKyAgICAgICAgYTEgPSAqc3JjMWErKzsKKyAgICAgICAgaWYgKHNjYWxlZCkgeworICAgICAgICAgICAgYjEgPSAqc3JjMWIrKzsKKyAgICAgICAgICAgIGExID0gYTEgKyAoKGIxIC0gYTEpICogb2Zmc2V0MSA+PiAxNik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR3b19zcHJpdGVzKSB7CisgICAgICAgICAgICBhMiA9ICpzcmMyYSsrOworICAgICAgICAgICAgaWYgKHNjYWxlZCA+IDEpIHsKKyAgICAgICAgICAgICAgICBiMiA9ICpzcmMyYisrOworICAgICAgICAgICAgICAgIGEyID0gYTIgKyAoKGIyIC0gYTIpICogb2Zmc2V0MiA+PiAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhMSA9IGExICsgKChhMiAtIGExKSAqIGFscGhhID4+IDE2KTsKKyAgICAgICAgfQorICAgICAgICAqZHN0KysgPSBhMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNwcml0ZV92X3NpbmdsZV9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCB3aWR0aCkKK3sKKyAgICBzcHJpdGVfdl90ZW1wbGF0ZShkc3QsIHNyYzFhLCBzcmMxYiwgb2Zmc2V0LCAwLCBOVUxMLCBOVUxMLCAwLCAwLCAxLCB3aWR0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHNwcml0ZV92X2RvdWJsZV9ub3NjYWxlX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgaW50IHdpZHRoKQoreworICAgIHNwcml0ZV92X3RlbXBsYXRlKGRzdCwgc3JjMWEsIE5VTEwsIDAsIDEsIHNyYzJhLCBOVUxMLCAwLCBhbHBoYSwgMCwgd2lkdGgpOworfQorCitzdGF0aWMgdm9pZCBzcHJpdGVfdl9kb3VibGVfb25lc2NhbGVfYyh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgaW50IHdpZHRoKQoreworICAgIHNwcml0ZV92X3RlbXBsYXRlKGRzdCwgc3JjMWEsIHNyYzFiLCBvZmZzZXQxLCAxLCBzcmMyYSwgTlVMTCwgMCwgYWxwaGEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworfQorCitzdGF0aWMgdm9pZCBzcHJpdGVfdl9kb3VibGVfdHdvc2NhbGVfYyh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCit7CisgICAgc3ByaXRlX3ZfdGVtcGxhdGUoZHN0LCBzcmMxYSwgc3JjMWIsIG9mZnNldDEsIDEsIHNyYzJhLCBzcmMyYiwgb2Zmc2V0MiwKKyAgICAgICAgICAgICAgICAgICAgICBhbHBoYSwgMiwgd2lkdGgpOworfQorCisjZW5kaWYgLyogQ09ORklHX1dNVjNJTUFHRV9ERUNPREVSIHx8IENPTkZJR19WQzFJTUFHRV9ERUNPREVSICovCisjZGVmaW5lIEZOX0FTU0lHTihYLCBZKSBcCisgICAgZHNwLT5wdXRfdmMxX21zcGVsX3BpeGVsc190YWJbMV1bWCs0KlldID0gcHV0X3ZjMV9tc3BlbF9tYyMjWCMjWSMjX2M7IFwKKyAgICBkc3AtPnB1dF92YzFfbXNwZWxfcGl4ZWxzX3RhYlswXVtYKzQqWV0gPSBwdXRfdmMxX21zcGVsX21jIyNYIyNZIyNfMTZfYzsgXAorICAgIGRzcC0+YXZnX3ZjMV9tc3BlbF9waXhlbHNfdGFiWzFdW1grNCpZXSA9IGF2Z192YzFfbXNwZWxfbWMjI1gjI1kjI19jOyBcCisgICAgZHNwLT5hdmdfdmMxX21zcGVsX3BpeGVsc190YWJbMF1bWCs0KlldID0gYXZnX3ZjMV9tc3BlbF9tYyMjWCMjWSMjXzE2X2MKKworYXZfY29sZCB2b2lkIGZmX3ZjMWRzcF9pbml0KFZDMURTUENvbnRleHQgKmRzcCkKK3sKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfOHg4ICAgID0gdmMxX2ludl90cmFuc184eDhfYzsKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfNHg4ICAgID0gdmMxX2ludl90cmFuc180eDhfYzsKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfOHg0ICAgID0gdmMxX2ludl90cmFuc184eDRfYzsKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfNHg0ICAgID0gdmMxX2ludl90cmFuc180eDRfYzsKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfOHg4X2RjID0gdmMxX2ludl90cmFuc184eDhfZGNfYzsKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfNHg4X2RjID0gdmMxX2ludl90cmFuc180eDhfZGNfYzsKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfOHg0X2RjID0gdmMxX2ludl90cmFuc184eDRfZGNfYzsKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfNHg0X2RjID0gdmMxX2ludl90cmFuc180eDRfZGNfYzsKKworICAgIGRzcC0+dmMxX2hfb3ZlcmxhcCAgICAgICAgPSB2YzFfaF9vdmVybGFwX2M7CisgICAgZHNwLT52YzFfdl9vdmVybGFwICAgICAgICA9IHZjMV92X292ZXJsYXBfYzsKKyAgICBkc3AtPnZjMV9oX3Nfb3ZlcmxhcCAgICAgID0gdmMxX2hfc19vdmVybGFwX2M7CisgICAgZHNwLT52YzFfdl9zX292ZXJsYXAgICAgICA9IHZjMV92X3Nfb3ZlcmxhcF9jOworCisgICAgZHNwLT52YzFfdl9sb29wX2ZpbHRlcjQgICA9IHZjMV92X2xvb3BfZmlsdGVyNF9jOworICAgIGRzcC0+dmMxX2hfbG9vcF9maWx0ZXI0ICAgPSB2YzFfaF9sb29wX2ZpbHRlcjRfYzsKKyAgICBkc3AtPnZjMV92X2xvb3BfZmlsdGVyOCAgID0gdmMxX3ZfbG9vcF9maWx0ZXI4X2M7CisgICAgZHNwLT52YzFfaF9sb29wX2ZpbHRlcjggICA9IHZjMV9oX2xvb3BfZmlsdGVyOF9jOworICAgIGRzcC0+dmMxX3ZfbG9vcF9maWx0ZXIxNiAgPSB2YzFfdl9sb29wX2ZpbHRlcjE2X2M7CisgICAgZHNwLT52YzFfaF9sb29wX2ZpbHRlcjE2ICA9IHZjMV9oX2xvb3BfZmlsdGVyMTZfYzsKKworICAgIGRzcC0+cHV0X3ZjMV9tc3BlbF9waXhlbHNfdGFiWzBdWzBdID0gcHV0X3BpeGVsczE2eDE2X2M7CisgICAgZHNwLT5hdmdfdmMxX21zcGVsX3BpeGVsc190YWJbMF1bMF0gPSBhdmdfcGl4ZWxzMTZ4MTZfYzsKKyAgICBkc3AtPnB1dF92YzFfbXNwZWxfcGl4ZWxzX3RhYlsxXVswXSA9IHB1dF9waXhlbHM4eDhfYzsKKyAgICBkc3AtPmF2Z192YzFfbXNwZWxfcGl4ZWxzX3RhYlsxXVswXSA9IGF2Z19waXhlbHM4eDhfYzsKKyAgICBGTl9BU1NJR04oMCwgMSk7CisgICAgRk5fQVNTSUdOKDAsIDIpOworICAgIEZOX0FTU0lHTigwLCAzKTsKKworICAgIEZOX0FTU0lHTigxLCAwKTsKKyAgICBGTl9BU1NJR04oMSwgMSk7CisgICAgRk5fQVNTSUdOKDEsIDIpOworICAgIEZOX0FTU0lHTigxLCAzKTsKKworICAgIEZOX0FTU0lHTigyLCAwKTsKKyAgICBGTl9BU1NJR04oMiwgMSk7CisgICAgRk5fQVNTSUdOKDIsIDIpOworICAgIEZOX0FTU0lHTigyLCAzKTsKKworICAgIEZOX0FTU0lHTigzLCAwKTsKKyAgICBGTl9BU1NJR04oMywgMSk7CisgICAgRk5fQVNTSUdOKDMsIDIpOworICAgIEZOX0FTU0lHTigzLCAzKTsKKworICAgIGRzcC0+cHV0X25vX3JuZF92YzFfY2hyb21hX3BpeGVsc190YWJbMF0gPSBwdXRfbm9fcm5kX3ZjMV9jaHJvbWFfbWM4X2M7CisgICAgZHNwLT5hdmdfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGF2Z19ub19ybmRfdmMxX2Nocm9tYV9tYzhfYzsKKyAgICBkc3AtPnB1dF9ub19ybmRfdmMxX2Nocm9tYV9waXhlbHNfdGFiWzFdID0gcHV0X25vX3JuZF92YzFfY2hyb21hX21jNF9jOworICAgIGRzcC0+YXZnX25vX3JuZF92YzFfY2hyb21hX3BpeGVsc190YWJbMV0gPSBhdmdfbm9fcm5kX3ZjMV9jaHJvbWFfbWM0X2M7CisKKyNpZiBDT05GSUdfV01WM0lNQUdFX0RFQ09ERVIgfHwgQ09ORklHX1ZDMUlNQUdFX0RFQ09ERVIKKyAgICBkc3AtPnNwcml0ZV9oICAgICAgICAgICAgICAgICA9IHNwcml0ZV9oX2M7CisgICAgZHNwLT5zcHJpdGVfdl9zaW5nbGUgICAgICAgICAgPSBzcHJpdGVfdl9zaW5nbGVfYzsKKyAgICBkc3AtPnNwcml0ZV92X2RvdWJsZV9ub3NjYWxlICA9IHNwcml0ZV92X2RvdWJsZV9ub3NjYWxlX2M7CisgICAgZHNwLT5zcHJpdGVfdl9kb3VibGVfb25lc2NhbGUgPSBzcHJpdGVfdl9kb3VibGVfb25lc2NhbGVfYzsKKyAgICBkc3AtPnNwcml0ZV92X2RvdWJsZV90d29zY2FsZSA9IHNwcml0ZV92X2RvdWJsZV90d29zY2FsZV9jOworI2VuZGlmIC8qIENPTkZJR19XTVYzSU1BR0VfREVDT0RFUiB8fCBDT05GSUdfVkMxSU1BR0VfREVDT0RFUiAqLworCisgICAgZHNwLT5zdGFydGNvZGVfZmluZF9jYW5kaWRhdGUgPSBmZl9zdGFydGNvZGVfZmluZF9jYW5kaWRhdGVfYzsKKworICAgIGlmIChBUkNIX0FBUkNINjQpCisgICAgICAgIGZmX3ZjMWRzcF9pbml0X2FhcmNoNjQoZHNwKTsKKyAgICBpZiAoQVJDSF9BUk0pCisgICAgICAgIGZmX3ZjMWRzcF9pbml0X2FybShkc3ApOworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfdmMxZHNwX2luaXRfcHBjKGRzcCk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl92YzFkc3BfaW5pdF94ODYoZHNwKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMWRzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmMxZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmNzVhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjMWRzcC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBWQy0xIGFuZCBXTVYzIGRlY29kZXIgLSBEU1AgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWQy0xIGFuZCBXTVYzIGRlY29kZXIKKyAqCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZDMURTUF9ICisjZGVmaW5lIEFWQ09ERUNfVkMxRFNQX0gKKworI2luY2x1ZGUgImhwZWxkc3AuaCIKKyNpbmNsdWRlICJoMjY0Y2hyb21hLmgiCisKK3R5cGVkZWYgdm9pZCAoKnZjMW9wX3BpeGVsc19mdW5jKSh1aW50OF90ICpibG9jay8qYWxpZ24gd2lkdGggKDggb3IgMTYpKi8sIGNvbnN0IHVpbnQ4X3QgKnBpeGVscy8qYWxpZ24gMSovLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CisKK3R5cGVkZWYgc3RydWN0IFZDMURTUENvbnRleHQgeworICAgIC8qIHZjMSBmdW5jdGlvbnMgKi8KKyAgICB2b2lkICgqdmMxX2ludl90cmFuc184eDgpKGludDE2X3QgKmIpOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzh4NCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4OCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4NCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzh4OF9kYykodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzh4NF9kYykodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4OF9kYykodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4NF9kYykodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfdl9vdmVybGFwKSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpOworICAgIHZvaWQgKCp2YzFfaF9vdmVybGFwKSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpOworICAgIHZvaWQgKCp2YzFfdl9zX292ZXJsYXApKGludDE2X3QgKnRvcCwgIGludDE2X3QgKmJvdHRvbSk7CisgICAgdm9pZCAoKnZjMV9oX3Nfb3ZlcmxhcCkoaW50MTZfdCAqbGVmdCwgaW50MTZfdCAqcmlnaHQpOworICAgIHZvaWQgKCp2YzFfdl9sb29wX2ZpbHRlcjQpKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKTsKKyAgICB2b2lkICgqdmMxX2hfbG9vcF9maWx0ZXI0KSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSk7CisgICAgdm9pZCAoKnZjMV92X2xvb3BfZmlsdGVyOCkodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpOworICAgIHZvaWQgKCp2YzFfaF9sb29wX2ZpbHRlcjgpKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKTsKKyAgICB2b2lkICgqdmMxX3ZfbG9vcF9maWx0ZXIxNikodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpOworICAgIHZvaWQgKCp2YzFfaF9sb29wX2ZpbHRlcjE2KSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSk7CisKKyAgICAvKiBwdXQgOHg4IGJsb2NrIHdpdGggYmljdWJpYyBpbnRlcnBvbGF0aW9uIGFuZCBxdWFydGVycGVsIHByZWNpc2lvbgorICAgICAqIGxhc3QgYXJndW1lbnQgaXMgYWN0dWFsbHkgcm91bmQgdmFsdWUgaW5zdGVhZCBvZiBoZWlnaHQKKyAgICAgKi8KKyAgICB2YzFvcF9waXhlbHNfZnVuYyBwdXRfdmMxX21zcGVsX3BpeGVsc190YWJbMl1bMTZdOworICAgIHZjMW9wX3BpeGVsc19mdW5jIGF2Z192YzFfbXNwZWxfcGl4ZWxzX3RhYlsyXVsxNl07CisKKyAgICAvKiBUaGlzIGlzIHJlYWxseSBvbmUgZnVuYyB1c2VkIGluIFZDLTEgZGVjb2RpbmcgKi8KKyAgICBoMjY0X2Nocm9tYV9tY19mdW5jIHB1dF9ub19ybmRfdmMxX2Nocm9tYV9waXhlbHNfdGFiWzNdOworICAgIGgyNjRfY2hyb21hX21jX2Z1bmMgYXZnX25vX3JuZF92YzFfY2hyb21hX3BpeGVsc190YWJbM107CisKKyAgICAvKiBXaW5kb3dzIE1lZGlhIEltYWdlIGZ1bmN0aW9ucyAqLworICAgIHZvaWQgKCpzcHJpdGVfaCkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBvZmZzZXQsIGludCBhZHZhbmNlLCBpbnQgY291bnQpOworICAgIHZvaWQgKCpzcHJpdGVfdl9zaW5nbGUpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMWEsIGNvbnN0IHVpbnQ4X3QgKnNyYzFiLCBpbnQgb2Zmc2V0LCBpbnQgd2lkdGgpOworICAgIHZvaWQgKCpzcHJpdGVfdl9kb3VibGVfbm9zY2FsZSkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxYSwgY29uc3QgdWludDhfdCAqc3JjMmEsIGludCBhbHBoYSwgaW50IHdpZHRoKTsKKyAgICB2b2lkICgqc3ByaXRlX3ZfZG91YmxlX29uZXNjYWxlKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzFhLCBjb25zdCB1aW50OF90ICpzcmMxYiwgaW50IG9mZnNldDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyYSwgaW50IGFscGhhLCBpbnQgd2lkdGgpOworICAgIHZvaWQgKCpzcHJpdGVfdl9kb3VibGVfdHdvc2NhbGUpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMWEsIGNvbnN0IHVpbnQ4X3QgKnNyYzFiLCBpbnQgb2Zmc2V0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzJhLCBjb25zdCB1aW50OF90ICpzcmMyYiwgaW50IG9mZnNldDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhLCBpbnQgd2lkdGgpOworCisgICAgLyoqCisgICAgICogU2VhcmNoIGJ1ZiBmcm9tIHRoZSBzdGFydCBmb3IgdXAgdG8gc2l6ZSBieXRlcy4gUmV0dXJuIHRoZSBpbmRleAorICAgICAqIG9mIGEgemVybyBieXRlLCBvciA+PSBzaXplIGlmIG5vdCBmb3VuZC4gSWRlYWxseSwgdXNlIGxvb2thaGVhZAorICAgICAqIHRvIGZpbHRlciBvdXQgYW55IHplcm8gYnl0ZXMgdGhhdCBhcmUga25vd24gdG8gbm90IGJlIGZvbGxvd2VkIGJ5CisgICAgICogb25lIG9yIG1vcmUgZnVydGhlciB6ZXJvIGJ5dGVzIGFuZCBhIG9uZSBieXRlLgorICAgICAqLworICAgIGludCAoKnN0YXJ0Y29kZV9maW5kX2NhbmRpZGF0ZSkoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSk7Cit9IFZDMURTUENvbnRleHQ7CisKK3ZvaWQgZmZfdmMxZHNwX2luaXQoVkMxRFNQQ29udGV4dCogYyk7Cit2b2lkIGZmX3ZjMWRzcF9pbml0X2FhcmNoNjQoVkMxRFNQQ29udGV4dCogZHNwKTsKK3ZvaWQgZmZfdmMxZHNwX2luaXRfYXJtKFZDMURTUENvbnRleHQqIGRzcCk7Cit2b2lkIGZmX3ZjMWRzcF9pbml0X3BwYyhWQzFEU1BDb250ZXh0ICpjKTsKK3ZvaWQgZmZfdmMxZHNwX2luaXRfeDg2KFZDMURTUENvbnRleHQqIGRzcCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1ZDMURTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92Y3IxLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92Y3IxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyODFlYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZjcjEuYwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIEFUSSBWQ1IxIGNvZGVjCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBVEkgVkNSMSBjb2RlYworICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVkNSMUNvbnRleHQgeworICAgIGludCBkZWx0YVsxNl07CisgICAgaW50IG9mZnNldFs0XTsKK30gVkNSMUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCB2Y3IxX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDEwUDsKKworICAgIGlmIChhdmN0eC0+d2lkdGggJSA4IHx8IGF2Y3R4LT5oZWlnaHQlNCkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJvZGQgZGltZW5zaW9ucyAoJWQgeCAlZCkgc3VwcG9ydCIsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZjcjFfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBWQ1IxQ29udGV4dCAqY29uc3QgYSAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpjb25zdCBwICAgICAgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpieXRlc3RyZWFtID0gYXZwa3QtPmRhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnl0ZXN0cmVhbV9lbmQgPSBieXRlc3RyZWFtICsgYXZwa3QtPnNpemU7CisgICAgaW50IGksIHgsIHksIHJldDsKKworICAgIGlmKGF2cGt0LT5zaXplIDwgMzIgKyBhdmN0eC0+aGVpZ2h0ICsgYXZjdHgtPndpZHRoKmF2Y3R4LT5oZWlnaHQqNS84KXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnN1ZmZpY2llbnQgaW5wdXQgZGF0YS4gJWQgPCAlZFxuIiwgYXZwa3QtPnNpemUgLCAgMzIgKyBhdmN0eC0+aGVpZ2h0ICsgYXZjdHgtPndpZHRoKmF2Y3R4LT5oZWlnaHQqNS84KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHAsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcC0+a2V5X2ZyYW1lID0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGEtPmRlbHRhW2ldID0gKmJ5dGVzdHJlYW0rKzsKKyAgICAgICAgYnl0ZXN0cmVhbSsrOworICAgIH0KKworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaW50IG9mZnNldDsKKyAgICAgICAgdWludDhfdCAqbHVtYSA9ICZwLT5kYXRhWzBdW3kgKiBwLT5saW5lc2l6ZVswXV07CisKKyAgICAgICAgaWYgKCh5ICYgMykgPT0gMCkgeworICAgICAgICAgICAgdWludDhfdCAqY2IgPSAmcC0+ZGF0YVsxXVsoeSA+PiAyKSAqIHAtPmxpbmVzaXplWzFdXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmNyID0gJnAtPmRhdGFbMl1bKHkgPj4gMikgKiBwLT5saW5lc2l6ZVsyXV07CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDAgKGJ5dGVzdHJlYW1fZW5kIC0gYnl0ZXN0cmVhbSA+PSA0ICsgYXZjdHgtPndpZHRoKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICBhLT5vZmZzZXRbaV0gPSAqYnl0ZXN0cmVhbSsrOworCisgICAgICAgICAgICBvZmZzZXQgPSBhLT5vZmZzZXRbMF0gLSBhLT5kZWx0YVtieXRlc3RyZWFtWzJdICYgMHhGXTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHggKz0gNCkgeworICAgICAgICAgICAgICAgIGx1bWFbMF0gICAgID0gb2Zmc2V0ICs9IGEtPmRlbHRhW2J5dGVzdHJlYW1bMl0gJiAweEZdOworICAgICAgICAgICAgICAgIGx1bWFbMV0gICAgID0gb2Zmc2V0ICs9IGEtPmRlbHRhW2J5dGVzdHJlYW1bMl0gPj4gIDRdOworICAgICAgICAgICAgICAgIGx1bWFbMl0gICAgID0gb2Zmc2V0ICs9IGEtPmRlbHRhW2J5dGVzdHJlYW1bMF0gJiAweEZdOworICAgICAgICAgICAgICAgIGx1bWFbM10gICAgID0gb2Zmc2V0ICs9IGEtPmRlbHRhW2J5dGVzdHJlYW1bMF0gPj4gIDRdOworICAgICAgICAgICAgICAgIGx1bWEgICAgICAgKz0gNDsKKworICAgICAgICAgICAgICAgICpjYisrICAgICAgID0gYnl0ZXN0cmVhbVszXTsKKyAgICAgICAgICAgICAgICAqY3IrKyAgICAgICA9IGJ5dGVzdHJlYW1bMV07CisKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9hc3NlcnQwIChieXRlc3RyZWFtX2VuZCAtIGJ5dGVzdHJlYW0gPj0gYXZjdHgtPndpZHRoIC8gMik7CisKKyAgICAgICAgICAgIG9mZnNldCA9IGEtPm9mZnNldFt5ICYgM10gLSBhLT5kZWx0YVtieXRlc3RyZWFtWzJdICYgMHhGXTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSA4KSB7CisgICAgICAgICAgICAgICAgbHVtYVswXSAgICAgPSBvZmZzZXQgKz0gYS0+ZGVsdGFbYnl0ZXN0cmVhbVsyXSAmIDB4Rl07CisgICAgICAgICAgICAgICAgbHVtYVsxXSAgICAgPSBvZmZzZXQgKz0gYS0+ZGVsdGFbYnl0ZXN0cmVhbVsyXSA+PiAgNF07CisgICAgICAgICAgICAgICAgbHVtYVsyXSAgICAgPSBvZmZzZXQgKz0gYS0+ZGVsdGFbYnl0ZXN0cmVhbVszXSAmIDB4Rl07CisgICAgICAgICAgICAgICAgbHVtYVszXSAgICAgPSBvZmZzZXQgKz0gYS0+ZGVsdGFbYnl0ZXN0cmVhbVszXSA+PiAgNF07CisgICAgICAgICAgICAgICAgbHVtYVs0XSAgICAgPSBvZmZzZXQgKz0gYS0+ZGVsdGFbYnl0ZXN0cmVhbVswXSAmIDB4Rl07CisgICAgICAgICAgICAgICAgbHVtYVs1XSAgICAgPSBvZmZzZXQgKz0gYS0+ZGVsdGFbYnl0ZXN0cmVhbVswXSA+PiAgNF07CisgICAgICAgICAgICAgICAgbHVtYVs2XSAgICAgPSBvZmZzZXQgKz0gYS0+ZGVsdGFbYnl0ZXN0cmVhbVsxXSAmIDB4Rl07CisgICAgICAgICAgICAgICAgbHVtYVs3XSAgICAgPSBvZmZzZXQgKz0gYS0+ZGVsdGFbYnl0ZXN0cmVhbVsxXSA+PiAgNF07CisgICAgICAgICAgICAgICAgbHVtYSAgICAgICArPSA4OworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0gKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGJ5dGVzdHJlYW0gLSBhdnBrdC0+ZGF0YTsKK30KKworQVZDb2RlYyBmZl92Y3IxX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZjcjEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVEkgVkNSMSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WQ1IxLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWQ1IxQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdmNyMV9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSB2Y3IxX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZkYS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwNTgwZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZkYS5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaW5jbHVkZSAidmRhLmgiCisjaW5jbHVkZSAidmRhX2ludGVybmFsLmgiCisKKyNpZiBDT05GSUdfSDI2NF9WREFfSFdBQ0NFTAorQVZWREFDb250ZXh0ICphdl92ZGFfYWxsb2NfY29udGV4dCh2b2lkKQoreworICAgIEFWVkRBQ29udGV4dCAqcmV0ID0gYXZfbWFsbG9jeihzaXplb2YoKnJldCkpOworCisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0LT5vdXRwdXRfY2FsbGJhY2sgPSBmZl92ZGFfb3V0cHV0X2NhbGxiYWNrOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2X3ZkYV9kZWZhdWx0X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2Y3R4LT5od2FjY2VsX2NvbnRleHQgPSBhdl92ZGFfYWxsb2NfY29udGV4dCgpOworICAgIGlmICghYXZjdHgtPmh3YWNjZWxfY29udGV4dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gZmZfdmRhX2RlZmF1bHRfaW5pdChhdmN0eCk7Cit9CisKK3ZvaWQgYXZfdmRhX2RlZmF1bHRfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgZmZfdmRhX2RlZmF1bHRfZnJlZShhdmN0eCk7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5od2FjY2VsX2NvbnRleHQpOworfQorCit2b2lkIGZmX3ZkYV9kZWZhdWx0X2ZyZWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFWVkRBQ29udGV4dCAqdmRhID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKyAgICBpZiAodmRhICYmIHZkYS0+ZGVjb2RlcikKKyAgICAgICAgVkRBRGVjb2RlckRlc3Ryb3kodmRhLT5kZWNvZGVyKTsKK30KKworI2Vsc2UKK0FWVkRBQ29udGV4dCAqYXZfdmRhX2FsbG9jX2NvbnRleHQodm9pZCkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IGF2X3ZkYV9kZWZhdWx0X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Cit9CisKK3ZvaWQgYXZfdmRhX2RlZmF1bHRfZnJlZShBVkNvZGVjQ29udGV4dCAqY3R4KQoreworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92ZGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZkYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzMwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92ZGEuaApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIFZEQSBIVyBhY2NlbGVyYXRpb24KKyAqCisgKiBjb3B5cmlnaHQgKGMpIDIwMTEgU2ViYXN0aWVuIFp3aWNrZXJ0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WREFfSAorI2RlZmluZSBBVkNPREVDX1ZEQV9ICisKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdmNfY29kZWNfaHdhY2NlbF92ZGEKKyAqIFB1YmxpYyBsaWJhdmNvZGVjIFZEQSBoZWFkZXIuCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGVtbWludHJpbi5oIGlzIHVuYWJsZSB0byBjb21waWxlIHdpdGggLXN0ZD1jOTkgLVdlcnJvcj1taXNzaW5nLXByb3RvdHlwZXMKKy8vIGh0dHA6Ly9vcGVucmFkYXIuYXBwc3BvdC5jb20vODAyNjM5MAorI3VuZGVmIF9fR05VQ19TVERDX0lOTElORV9fCisKKyNkZWZpbmUgUGljdHVyZSBRdWlja2RyYXdQaWN0dXJlCisjaW5jbHVkZSA8VmlkZW9EZWNvZGVBY2NlbGVyYXRpb24vVkRBRGVjb2Rlci5oPgorI3VuZGVmIFBpY3R1cmUKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvdmVyc2lvbi5oIgorCisvLyBleHRyYSBmbGFncyBub3QgZGVmaW5lZCBpbiBWREFEZWNvZGVyLmgKK2VudW0geworICAgIGtWREFEZWNvZGVJbmZvX0FzeW5jaHJvbm91cyA9IDFVTCA8PCAwLAorICAgIGtWREFEZWNvZGVJbmZvX0ZyYW1lRHJvcHBlZCA9IDFVTCA8PCAxCit9OworCisvKioKKyAqIEBkZWZncm91cCBsYXZjX2NvZGVjX2h3YWNjZWxfdmRhIFZEQQorICogQGluZ3JvdXAgbGF2Y19jb2RlY19od2FjY2VsCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb25zIGFuZCBkYXRhCisgKiB0byB0aGUgVkRBIEZGbXBlZyBIV0FjY2VsIGltcGxlbWVudGF0aW9uLgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG1ha2UgaXQgYXZhaWxhYmxlIGFzIEFWQ29kZWNDb250ZXh0Lmh3YWNjZWxfY29udGV4dC4KKyAqLworc3RydWN0IHZkYV9jb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBWREEgZGVjb2RlciBvYmplY3QuCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQvVW5zZXQgYnkgbGliYXZjb2RlYy4KKyAgICAgKi8KKyAgICBWREFEZWNvZGVyICAgICAgICAgIGRlY29kZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29yZSBWaWRlbyBwaXhlbCBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgY3VycmVudCBpbWFnZSBkYXRhLgorICAgICAqCisgICAgICogZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYy4gVW5zZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBDVlBpeGVsQnVmZmVyUmVmICAgIGN2X2J1ZmZlcjsKKworICAgIC8qKgorICAgICAqIFVzZSB0aGUgaGFyZHdhcmUgZGVjb2RlciBpbiBzeW5jaHJvbm91cyBtb2RlLgorICAgICAqCisgICAgICogZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHVzZV9zeW5jX2RlY29kaW5nOworCisgICAgLyoqCisgICAgICogVGhlIGZyYW1lIHdpZHRoLgorICAgICAqCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0L1Vuc2V0IGJ5IHVzZXIuCisgICAgICovCisgICAgaW50ICAgICAgICAgICAgICAgICB3aWR0aDsKKworICAgIC8qKgorICAgICAqIFRoZSBmcmFtZSBoZWlnaHQuCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQvVW5zZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGhlaWdodDsKKworICAgIC8qKgorICAgICAqIFRoZSBmcmFtZSBmb3JtYXQuCisgICAgICoKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQvVW5zZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGZvcm1hdDsKKworICAgIC8qKgorICAgICAqIFRoZSBwaXhlbCBmb3JtYXQgZm9yIG91dHB1dCBpbWFnZSBidWZmZXJzLgorICAgICAqCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0L1Vuc2V0IGJ5IHVzZXIuCisgICAgICovCisgICAgT1NUeXBlICAgICAgICAgICAgICBjdl9waXhfZm10X3R5cGU7CisKKyAgICAvKioKKyAgICAgKiB1bnVzZWQKKyAgICAgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICpwcml2X2JpdHN0cmVhbTsKKworICAgIC8qKgorICAgICAqIHVudXNlZAorICAgICAqLworICAgIGludCAgICAgICAgICAgICAgICAgcHJpdl9iaXRzdHJlYW1fc2l6ZTsKKworICAgIC8qKgorICAgICAqIHVudXNlZAorICAgICAqLworICAgIGludCAgICAgICAgICAgICAgICAgcHJpdl9hbGxvY2F0ZWRfc2l6ZTsKKworICAgIC8qKgorICAgICAqIFVzZSBhdl9idWZmZXIgdG8gbWFuYWdlIGJ1ZmZlci4KKyAgICAgKiBXaGVuIHRoZSBmbGFnIGlzIHNldCwgdGhlIENWUGl4ZWxCdWZmZXJzIHJldHVybmVkIGJ5IHRoZSBkZWNvZGVyIHdpbGwKKyAgICAgKiBiZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5LCBzbyB5b3UgaGF2ZSB0byByZXRhaW4gdGhlbSBpZiBuZWNlc3NhcnkuCisgICAgICogTm90IHNldHRpbmcgdGhpcyBmbGFnIG1heSBjYXVzZSBtZW1vcnkgbGVhay4KKyAgICAgKgorICAgICAqIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCisgICAgICovCisgICAgaW50ICAgICAgICAgICAgICAgICB1c2VfcmVmX2J1ZmZlcjsKK307CisKKy8qKiBDcmVhdGUgdGhlIHZpZGVvIGRlY29kZXIuICovCitpbnQgZmZfdmRhX2NyZWF0ZV9kZWNvZGVyKHN0cnVjdCB2ZGFfY29udGV4dCAqdmRhX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0cmFkYXRhX3NpemUpOworCisvKiogRGVzdHJveSB0aGUgdmlkZW8gZGVjb2Rlci4gKi8KK2ludCBmZl92ZGFfZGVzdHJveV9kZWNvZGVyKHN0cnVjdCB2ZGFfY29udGV4dCAqdmRhX2N0eCk7CisKKy8qKgorICogVGhpcyBzdHJ1Y3QgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHBhc3NlZAorICogYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCBsaWJhdmNvZGVjIGZvciBpbml0aWFsaXppbmcgVkRBIGRlY29kaW5nLgorICogSXRzIHNpemUgaXMgbm90IGEgcGFydCBvZiB0aGUgcHVibGljIEFCSSwgaXQgbXVzdCBiZSBhbGxvY2F0ZWQgd2l0aAorICogYXZfdmRhX2FsbG9jX2NvbnRleHQoKSBhbmQgZnJlZWQgd2l0aCBhdl9mcmVlKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWVkRBQ29udGV4dCB7CisgICAgLyoqCisgICAgICogVkRBIGRlY29kZXIgb2JqZWN0LiBDcmVhdGVkIGFuZCBmcmVlZCBieSB0aGUgY2FsbGVyLgorICAgICAqLworICAgIFZEQURlY29kZXIgZGVjb2RlcjsKKworICAgIC8qKgorICAgICAqIFRoZSBvdXRwdXQgY2FsbGJhY2sgdGhhdCBtdXN0IGJlIHBhc3NlZCB0byBWREFEZWNvZGVyQ3JlYXRlLgorICAgICAqIFNldCBieSBhdl92ZGFfYWxsb2NfY29udGV4dCgpLgorICAgICAqLworICAgIFZEQURlY29kZXJPdXRwdXRDYWxsYmFjayBvdXRwdXRfY2FsbGJhY2s7Cit9IEFWVkRBQ29udGV4dDsKKworLyoqCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIFZEQSBjb250ZXh0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBnZXRfZm9ybWF0KCkgY2FsbGJhY2sgd2hlbiB0aGUgY2FsbGVyCisgKiBzZWxlY3RzIHRoZSBBVl9QSVhfRk1UX1ZEQSBmb3JtYXQuIFRoZSBjYWxsZXIgbXVzdCB0aGVuIGNyZWF0ZSB0aGUgZGVjb2RlcgorICogb2JqZWN0ICh1c2luZyB0aGUgb3V0cHV0IGNhbGxiYWNrIHByb3ZpZGVkIGJ5IGxpYmF2Y29kZWMpIHRoYXQgd2lsbCBiZSB1c2VkCisgKiBmb3IgVkRBLWFjY2VsZXJhdGVkIGRlY29kaW5nLgorICoKKyAqIFdoZW4gZGVjb2Rpbmcgd2l0aCBWREEgaXMgZmluaXNoZWQsIHRoZSBjYWxsZXIgbXVzdCBkZXN0cm95IHRoZSBkZWNvZGVyCisgKiBvYmplY3QgYW5kIGZyZWUgdGhlIFZEQSBjb250ZXh0IHVzaW5nIGF2X2ZyZWUoKS4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgY29udGV4dCBvciBOVUxMIG9uIGZhaWx1cmUKKyAqLworQVZWREFDb250ZXh0ICphdl92ZGFfYWxsb2NfY29udGV4dCh2b2lkKTsKKworLyoqCisgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuZCBzZXRzIHVwIHRoZSBWREEgY29udGV4dCB1c2luZworICogYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIGF2Y3R4IHRoZSBjb3JyZXNwb25kaW5nIGNvZGVjIGNvbnRleHQKKyAqCisgKiBAcmV0dXJuID49IDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgYXZfdmRhX2RlZmF1bHRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gZnJlZSB0aGUgVkRBIGNvbnRleHQgaW5pdGlhbGl6ZWQgd2l0aAorICogYXZfdmRhX2RlZmF1bHRfaW5pdCgpLgorICoKKyAqIEBwYXJhbSBhdmN0eCB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBjb250ZXh0CisgKi8KK3ZvaWQgYXZfdmRhX2RlZmF1bHRfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWQ09ERUNfVkRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZkYV9oMjY0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy92ZGFfaDI2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZmIzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92ZGFfaDI2NC5jCkBAIC0wLDAgKzEsNTMxIEBACisvKgorICogVkRBIEgyNjQgSFcgYWNjZWxlcmF0aW9uLgorICoKKyAqIGNvcHlyaWdodCAoYykgMjAxMSBTZWJhc3RpZW4gWndpY2tlcnQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGRGljdGlvbmFyeS5oPgorI2luY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGTnVtYmVyLmg+CisjaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZEYXRhLmg+CisKKyNpbmNsdWRlICJ2ZGEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAiaDI2NC5oIgorCitzdHJ1Y3QgdmRhX2J1ZmZlciB7CisgICAgQ1ZQaXhlbEJ1ZmZlclJlZiBjdl9idWZmZXI7Cit9OworI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmRhX2ludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IFZEQUNvbnRleHQgeworICAgIC8vIFRoZSBjdXJyZW50IGJpdHN0cmVhbSBidWZmZXIuCisgICAgdWludDhfdCAgICAgICAgICAgICAqYml0c3RyZWFtOworCisgICAgLy8gVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYml0c3RyZWFtLgorICAgIGludCAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbV9zaXplOworCisgICAgLy8gVGhlIHJlZmVyZW5jZSBzaXplIHVzZWQgZm9yIGZhc3QgcmVhbGxvY2F0aW9uLgorICAgIGludCAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZF9zaXplOworCisgICAgQ1ZJbWFnZUJ1ZmZlclJlZiBmcmFtZTsKK30gVkRBQ29udGV4dDsKKworLyogRGVjb2RlciBjYWxsYmFjayB0aGF0IGFkZHMgdGhlIHZkYSBmcmFtZSB0byB0aGUgcXVldWUgaW4gZGlzcGxheSBvcmRlci4gKi8KK3N0YXRpYyB2b2lkIHZkYV9kZWNvZGVyX2NhbGxiYWNrKHZvaWQgKnZkYV9od19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWYgdXNlcl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1NTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5mb0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZJbWFnZUJ1ZmZlclJlZiBpbWFnZV9idWZmZXIpCit7CisgICAgc3RydWN0IHZkYV9jb250ZXh0ICp2ZGFfY3R4ID0gdmRhX2h3X2N0eDsKKworICAgIGlmIChpbmZvRmxhZ3MgJiBrVkRBRGVjb2RlSW5mb19GcmFtZURyb3BwZWQpCisgICAgICAgIHZkYV9jdHgtPmN2X2J1ZmZlciA9IE5VTEw7CisKKyAgICBpZiAoIWltYWdlX2J1ZmZlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHZkYV9jdHgtPmN2X3BpeF9mbXRfdHlwZSAhPSBDVlBpeGVsQnVmZmVyR2V0UGl4ZWxGb3JtYXRUeXBlKGltYWdlX2J1ZmZlcikpCisgICAgICAgIHJldHVybjsKKworICAgIHZkYV9jdHgtPmN2X2J1ZmZlciA9IENWUGl4ZWxCdWZmZXJSZXRhaW4oaW1hZ2VfYnVmZmVyKTsKK30KKworc3RhdGljIGludCB2ZGFfc3luY19kZWNvZGUoVkRBQ29udGV4dCAqY3R4LCBzdHJ1Y3QgdmRhX2NvbnRleHQgKnZkYV9jdHgpCit7CisgICAgT1NTdGF0dXMgc3RhdHVzOworICAgIENGRGF0YVJlZiBjb2RlZF9mcmFtZTsKKyAgICB1aW50MzJfdCBmbHVzaF9mbGFncyA9IDEgPDwgMDsgLy8vPCBrVkRBRGVjb2RlckZsdXNoX2VtaXRGcmFtZXMKKworICAgIGNvZGVkX2ZyYW1lID0gQ0ZEYXRhQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5iaXRzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5iaXRzdHJlYW1fc2l6ZSk7CisKKyAgICBzdGF0dXMgPSBWREFEZWNvZGVyRGVjb2RlKHZkYV9jdHgtPmRlY29kZXIsIDAsIGNvZGVkX2ZyYW1lLCBOVUxMKTsKKworICAgIGlmIChrVkRBRGVjb2Rlck5vRXJyID09IHN0YXR1cykKKyAgICAgICAgc3RhdHVzID0gVkRBRGVjb2RlckZsdXNoKHZkYV9jdHgtPmRlY29kZXIsIGZsdXNoX2ZsYWdzKTsKKworICAgIENGUmVsZWFzZShjb2RlZF9mcmFtZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQgdmRhX29sZF9oMjY0X3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIHVpbnQzMl90IHNpemUpCit7CisgICAgVkRBQ29udGV4dCAqdmRhID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgdmRhX2NvbnRleHQgKnZkYV9jdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworCisgICAgaWYgKCF2ZGFfY3R4LT5kZWNvZGVyKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICB2ZGEtPmJpdHN0cmVhbV9zaXplID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZkYV9vbGRfaDI2NF9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBWREFDb250ZXh0ICp2ZGEgICAgICAgICAgICAgPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOworICAgIHN0cnVjdCB2ZGFfY29udGV4dCAqdmRhX2N0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgdm9pZCAqdG1wOworCisgICAgaWYgKCF2ZGFfY3R4LT5kZWNvZGVyKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICB0bXAgPSBhdl9mYXN0X3JlYWxsb2ModmRhLT5iaXRzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZGEtPmFsbG9jYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGEtPmJpdHN0cmVhbV9zaXplICsgc2l6ZSArIDQpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgdmRhLT5iaXRzdHJlYW0gPSB0bXA7CisKKyAgICBBVl9XQjMyKHZkYS0+Yml0c3RyZWFtICsgdmRhLT5iaXRzdHJlYW1fc2l6ZSwgc2l6ZSk7CisgICAgbWVtY3B5KHZkYS0+Yml0c3RyZWFtICsgdmRhLT5iaXRzdHJlYW1fc2l6ZSArIDQsIGJ1ZmZlciwgc2l6ZSk7CisKKyAgICB2ZGEtPmJpdHN0cmVhbV9zaXplICs9IHNpemUgKyA0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZkYV9oMjY0X3JlbGVhc2VfYnVmZmVyKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgdmRhX2J1ZmZlciAqY29udGV4dCA9IG9wYXF1ZTsKKyAgICBDVlBpeGVsQnVmZmVyUmVsZWFzZShjb250ZXh0LT5jdl9idWZmZXIpOworICAgIGF2X2ZyZWUoY29udGV4dCk7Cit9CisKK3N0YXRpYyBpbnQgdmRhX29sZF9oMjY0X2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSDI2NENvbnRleHQgKmggICAgICAgICAgICAgICAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZEQUNvbnRleHQgKnZkYSAgICAgICAgICAgICAgICAgICAgID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgdmRhX2NvbnRleHQgKnZkYV9jdHggICAgICAgICA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgICAgICAgICAgICAgICAgICAgPSAmaC0+Y3VyX3BpY19wdHItPmY7CisgICAgc3RydWN0IHZkYV9idWZmZXIgKmNvbnRleHQ7CisgICAgQVZCdWZmZXJSZWYgKmJ1ZmZlcjsKKyAgICBpbnQgc3RhdHVzOworCisgICAgaWYgKCF2ZGFfY3R4LT5kZWNvZGVyIHx8ICF2ZGEtPmJpdHN0cmVhbSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgc3RhdHVzID0gdmRhX3N5bmNfZGVjb2RlKHZkYSwgdmRhX2N0eCk7CisgICAgZnJhbWUtPmRhdGFbM10gPSAodm9pZCopdmRhX2N0eC0+Y3ZfYnVmZmVyOworCisgICAgaWYgKHN0YXR1cykKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlIGZyYW1lICglZClcbiIsIHN0YXR1cyk7CisKKyAgICBpZiAoIXZkYV9jdHgtPnVzZV9yZWZfYnVmZmVyIHx8IHN0YXR1cykKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKworICAgIGNvbnRleHQgPSBhdl9tYWxsb2N6KHNpemVvZigqY29udGV4dCkpOworICAgIGJ1ZmZlciA9IGF2X2J1ZmZlcl9jcmVhdGUoTlVMTCwgMCwgdmRhX2gyNjRfcmVsZWFzZV9idWZmZXIsIGNvbnRleHQsIDApOworICAgIGlmICghY29udGV4dCB8fCAhYnVmZmVyKSB7CisgICAgICAgIENWUGl4ZWxCdWZmZXJSZWxlYXNlKHZkYV9jdHgtPmN2X2J1ZmZlcik7CisgICAgICAgIGF2X2ZyZWUoY29udGV4dCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjb250ZXh0LT5jdl9idWZmZXIgPSB2ZGFfY3R4LT5jdl9idWZmZXI7CisgICAgZnJhbWUtPmJ1ZlszXSA9IGJ1ZmZlcjsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2ludCBmZl92ZGFfY3JlYXRlX2RlY29kZXIoc3RydWN0IHZkYV9jb250ZXh0ICp2ZGFfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpleHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHRyYWRhdGFfc2l6ZSkKK3sKKyAgICBPU1N0YXR1cyBzdGF0dXM7CisgICAgQ0ZOdW1iZXJSZWYgaGVpZ2h0OworICAgIENGTnVtYmVyUmVmIHdpZHRoOworICAgIENGTnVtYmVyUmVmIGZvcm1hdDsKKyAgICBDRkRhdGFSZWYgYXZjX2RhdGE7CisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBjb25maWdfaW5mbzsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGJ1ZmZlcl9hdHRyaWJ1dGVzOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgaW9fc3VyZmFjZV9wcm9wZXJ0aWVzOworICAgIENGTnVtYmVyUmVmIGN2X3BpeF9mbXQ7CisKKyAgICB2ZGFfY3R4LT5wcml2X2JpdHN0cmVhbSA9IE5VTEw7CisgICAgdmRhX2N0eC0+cHJpdl9hbGxvY2F0ZWRfc2l6ZSA9IDA7CisKKyAgICAvKiBFYWNoIFZDTCBOQUwgaW4gdGhlIGJpdHN0cmVhbSBzZW50IHRvIHRoZSBkZWNvZGVyCisgICAgICogaXMgcHJlY2VkZWQgYnkgYSA0IGJ5dGVzIGxlbmd0aCBoZWFkZXIuCisgICAgICogQ2hhbmdlIHRoZSBhdmNDIGF0b20gaGVhZGVyIGlmIG5lZWRlZCwgdG8gc2lnbmFsIGhlYWRlcnMgb2YgNCBieXRlcy4gKi8KKyAgICBpZiAoZXh0cmFkYXRhX3NpemUgPj0gNCAmJiAoZXh0cmFkYXRhWzRdICYgMHgwMykgIT0gMHgwMykgeworICAgICAgICB1aW50OF90ICpyd19leHRyYWRhdGE7CisKKyAgICAgICAgaWYgKCEocndfZXh0cmFkYXRhID0gYXZfbWFsbG9jKGV4dHJhZGF0YV9zaXplKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIG1lbWNweShyd19leHRyYWRhdGEsIGV4dHJhZGF0YSwgZXh0cmFkYXRhX3NpemUpOworCisgICAgICAgIHJ3X2V4dHJhZGF0YVs0XSB8PSAweDAzOworCisgICAgICAgIGF2Y19kYXRhID0gQ0ZEYXRhQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIHJ3X2V4dHJhZGF0YSwgZXh0cmFkYXRhX3NpemUpOworCisgICAgICAgIGF2X2ZyZWVwKCZyd19leHRyYWRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2Y19kYXRhID0gQ0ZEYXRhQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGV4dHJhZGF0YSwgZXh0cmFkYXRhX3NpemUpOworICAgIH0KKworICAgIGNvbmZpZ19pbmZvID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKworICAgIGhlaWdodCAgID0gQ0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVyU0ludDMyVHlwZSwgJnZkYV9jdHgtPmhlaWdodCk7CisgICAgd2lkdGggICAgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmdmRhX2N0eC0+d2lkdGgpOworICAgIGZvcm1hdCAgID0gQ0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVyU0ludDMyVHlwZSwgJnZkYV9jdHgtPmZvcm1hdCk7CisKKyAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShjb25maWdfaW5mbywga1ZEQURlY29kZXJDb25maWd1cmF0aW9uX0hlaWdodCwgaGVpZ2h0KTsKKyAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShjb25maWdfaW5mbywga1ZEQURlY29kZXJDb25maWd1cmF0aW9uX1dpZHRoLCB3aWR0aCk7CisgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoY29uZmlnX2luZm8sIGtWREFEZWNvZGVyQ29uZmlndXJhdGlvbl9Tb3VyY2VGb3JtYXQsIGZvcm1hdCk7CisgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoY29uZmlnX2luZm8sIGtWREFEZWNvZGVyQ29uZmlndXJhdGlvbl9hdmNDRGF0YSwgYXZjX2RhdGEpOworCisgICAgYnVmZmVyX2F0dHJpYnV0ZXMgPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOworICAgIGlvX3N1cmZhY2VfcHJvcGVydGllcyA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyk7CisgICAgY3ZfcGl4X2ZtdCAgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGTnVtYmVyU0ludDMyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZGFfY3R4LT5jdl9waXhfZm10X3R5cGUpOworICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGJ1ZmZlcl9hdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtDVlBpeGVsQnVmZmVyUGl4ZWxGb3JtYXRUeXBlS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGN2X3BpeF9mbXQpOworICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGJ1ZmZlcl9hdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtDVlBpeGVsQnVmZmVySU9TdXJmYWNlUHJvcGVydGllc0tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpb19zdXJmYWNlX3Byb3BlcnRpZXMpOworCisgICAgc3RhdHVzID0gVkRBRGVjb2RlckNyZWF0ZShjb25maWdfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9hdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZEQURlY29kZXJPdXRwdXRDYWxsYmFjayAqKXZkYV9kZWNvZGVyX2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRhX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZGFfY3R4LT5kZWNvZGVyKTsKKworICAgIENGUmVsZWFzZShoZWlnaHQpOworICAgIENGUmVsZWFzZSh3aWR0aCk7CisgICAgQ0ZSZWxlYXNlKGZvcm1hdCk7CisgICAgQ0ZSZWxlYXNlKGF2Y19kYXRhKTsKKyAgICBDRlJlbGVhc2UoY29uZmlnX2luZm8pOworICAgIENGUmVsZWFzZShpb19zdXJmYWNlX3Byb3BlcnRpZXMpOworICAgIENGUmVsZWFzZShjdl9waXhfZm10KTsKKyAgICBDRlJlbGVhc2UoYnVmZmVyX2F0dHJpYnV0ZXMpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworaW50IGZmX3ZkYV9kZXN0cm95X2RlY29kZXIoc3RydWN0IHZkYV9jb250ZXh0ICp2ZGFfY3R4KQoreworICAgIE9TU3RhdHVzIHN0YXR1cyA9IGtWREFEZWNvZGVyTm9FcnI7CisKKyAgICBpZiAodmRhX2N0eC0+ZGVjb2RlcikKKyAgICAgICAgc3RhdHVzID0gVkRBRGVjb2RlckRlc3Ryb3kodmRhX2N0eC0+ZGVjb2Rlcik7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHZkYV9oMjY0X3VuaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkRBQ29udGV4dCAqdmRhID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBpZiAodmRhKSB7CisgICAgICAgIGF2X2ZyZWVwKCZ2ZGEtPmJpdHN0cmVhbSk7CisgICAgICAgIGlmICh2ZGEtPmZyYW1lKQorICAgICAgICAgICAgQ1ZQaXhlbEJ1ZmZlclJlbGVhc2UodmRhLT5mcmFtZSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitBVkhXQWNjZWwgZmZfaDI2NF92ZGFfb2xkX2h3YWNjZWwgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImgyNjRfdmRhIiwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1ZEQV9WTEQsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gdmRhX29sZF9oMjY0X3N0YXJ0X2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICA9IHZkYV9vbGRfaDI2NF9kZWNvZGVfc2xpY2UsCisgICAgLmVuZF9mcmFtZSAgICAgID0gdmRhX29sZF9oMjY0X2VuZF9mcmFtZSwKKyAgICAudW5pbml0ICAgICAgICAgPSB2ZGFfaDI2NF91bmluaXQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZEQUNvbnRleHQpLAorfTsKKwordm9pZCBmZl92ZGFfb3V0cHV0X2NhbGxiYWNrKHZvaWQgKm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWYgdXNlcl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmZvRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZJbWFnZUJ1ZmZlclJlZiBpbWFnZV9idWZmZXIpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmN0eCA9IG9wYXF1ZTsKKyAgICBWREFDb250ZXh0ICp2ZGEgPSBjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKworCisgICAgaWYgKHZkYS0+ZnJhbWUpIHsKKyAgICAgICAgQ1ZQaXhlbEJ1ZmZlclJlbGVhc2UodmRhLT5mcmFtZSk7CisgICAgICAgIHZkYS0+ZnJhbWUgPSBOVUxMOworICAgIH0KKworICAgIGlmICghaW1hZ2VfYnVmZmVyKQorICAgICAgICByZXR1cm47CisKKyAgICB2ZGEtPmZyYW1lID0gQ1ZQaXhlbEJ1ZmZlclJldGFpbihpbWFnZV9idWZmZXIpOworfQorCitzdGF0aWMgaW50IHZkYV9oMjY0X3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKQoreworICAgIFZEQUNvbnRleHQgKnZkYSA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisKKyAgICB2ZGEtPmJpdHN0cmVhbV9zaXplID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZkYV9oMjY0X2RlY29kZV9zbGljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKQoreworICAgIFZEQUNvbnRleHQgKnZkYSAgICAgICA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgdm9pZCAqdG1wOworCisgICAgdG1wID0gYXZfZmFzdF9yZWFsbG9jKHZkYS0+Yml0c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmRhLT5hbGxvY2F0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmRhLT5iaXRzdHJlYW1fc2l6ZSArIHNpemUgKyA0KTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHZkYS0+Yml0c3RyZWFtID0gdG1wOworCisgICAgQVZfV0IzMih2ZGEtPmJpdHN0cmVhbSArIHZkYS0+Yml0c3RyZWFtX3NpemUsIHNpemUpOworICAgIG1lbWNweSh2ZGEtPmJpdHN0cmVhbSArIHZkYS0+Yml0c3RyZWFtX3NpemUgKyA0LCBidWZmZXIsIHNpemUpOworCisgICAgdmRhLT5iaXRzdHJlYW1fc2l6ZSArPSBzaXplICsgNDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2J1ZmZlcih2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCit7CisgICAgQ1ZJbWFnZUJ1ZmZlclJlZiBmcmFtZSA9IChDVkltYWdlQnVmZmVyUmVmKWRhdGE7CisgICAgQ1ZQaXhlbEJ1ZmZlclJlbGVhc2UoZnJhbWUpOworfQorCitzdGF0aWMgaW50IHZkYV9oMjY0X2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSDI2NENvbnRleHQgKmggICAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWREFDb250ZXh0ICp2ZGEgICAgICAgPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOworICAgIEFWVkRBQ29udGV4dCAqdmRhX2N0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgICAgID0gJmgtPmN1cl9waWNfcHRyLT5mOworICAgIHVpbnQzMl90IGZsdXNoX2ZsYWdzICA9IDEgPDwgMDsgLy8vPCBrVkRBRGVjb2RlckZsdXNoX2VtaXRGcmFtZXMKKyAgICBDRkRhdGFSZWYgY29kZWRfZnJhbWU7CisgICAgT1NTdGF0dXMgc3RhdHVzOworCisgICAgaWYgKCF2ZGEtPmJpdHN0cmVhbV9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworCisgICAgY29kZWRfZnJhbWUgPSBDRkRhdGFDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGEtPmJpdHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGEtPmJpdHN0cmVhbV9zaXplKTsKKworICAgIHN0YXR1cyA9IFZEQURlY29kZXJEZWNvZGUodmRhX2N0eC0+ZGVjb2RlciwgMCwgY29kZWRfZnJhbWUsIE5VTEwpOworCisgICAgaWYgKHN0YXR1cyA9PSBrVkRBRGVjb2Rlck5vRXJyKQorICAgICAgICBzdGF0dXMgPSBWREFEZWNvZGVyRmx1c2godmRhX2N0eC0+ZGVjb2RlciwgZmx1c2hfZmxhZ3MpOworCisgICAgQ0ZSZWxlYXNlKGNvZGVkX2ZyYW1lKTsKKworICAgIGlmIChzdGF0dXMgIT0ga1ZEQURlY29kZXJOb0VycikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBkZWNvZGUgZnJhbWUgKCVkKVxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAodmRhLT5mcmFtZSkgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lLT5idWZbMF0pOworCisgICAgICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfY3JlYXRlKCh1aW50OF90Kil2ZGEtPmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmRhLT5mcmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfYnVmZmVyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9CVUZGRVJfRkxBR19SRUFET05MWSk7CisgICAgICAgIGlmICghZnJhbWUtPmJ1ZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgZnJhbWUtPmRhdGFbM10gPSAodWludDhfdCopdmRhLT5mcmFtZTsKKyAgICAgICAgdmRhLT5mcmFtZSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl92ZGFfZGVmYXVsdF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBVlZEQUNvbnRleHQgKnZkYV9jdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworICAgIE9TU3RhdHVzIHN0YXR1cyA9IGtWREFEZWNvZGVyTm9FcnI7CisgICAgQ0ZOdW1iZXJSZWYgaGVpZ2h0OworICAgIENGTnVtYmVyUmVmIHdpZHRoOworICAgIENGTnVtYmVyUmVmIGZvcm1hdDsKKyAgICBDRkRhdGFSZWYgYXZjX2RhdGE7CisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBjb25maWdfaW5mbzsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGJ1ZmZlcl9hdHRyaWJ1dGVzOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgaW9fc3VyZmFjZV9wcm9wZXJ0aWVzOworICAgIENGTnVtYmVyUmVmIGN2X3BpeF9mbXQ7CisgICAgaW50MzJfdCBmbXQgPSAnYXZjMScsIHBpeF9mbXQgPSBrQ1ZQaXhlbEZvcm1hdFR5cGVfNDIyWXBDYkNyODsKKworICAgIC8vIGtDVlBpeGVsRm9ybWF0VHlwZV80MjBZcENiQ3I4UGxhbmFyOworCisgICAgLyogRWFjaCBWQ0wgTkFMIGluIHRoZSBiaXRzdHJlYW0gc2VudCB0byB0aGUgZGVjb2RlcgorICAgICAqIGlzIHByZWNlZGVkIGJ5IGEgNCBieXRlcyBsZW5ndGggaGVhZGVyLgorICAgICAqIENoYW5nZSB0aGUgYXZjQyBhdG9tIGhlYWRlciBpZiBuZWVkZWQsIHRvIHNpZ25hbCBoZWFkZXJzIG9mIDQgYnl0ZXMuICovCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSA0ICYmIChhdmN0eC0+ZXh0cmFkYXRhWzRdICYgMHgwMykgIT0gMHgwMykgeworICAgICAgICB1aW50OF90ICpyd19leHRyYWRhdGE7CisKKyAgICAgICAgaWYgKCEocndfZXh0cmFkYXRhID0gYXZfbWFsbG9jKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBtZW1jcHkocndfZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgICAgIHJ3X2V4dHJhZGF0YVs0XSB8PSAweDAzOworCisgICAgICAgIGF2Y19kYXRhID0gQ0ZEYXRhQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIHJ3X2V4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKworICAgICAgICBhdl9mcmVlcCgmcndfZXh0cmFkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmNfZGF0YSA9IENGRGF0YUNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgIH0KKworICAgIGNvbmZpZ19pbmZvID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKworICAgIGhlaWdodCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlclNJbnQzMlR5cGUsICZhdmN0eC0+aGVpZ2h0KTsKKyAgICB3aWR0aCAgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmYXZjdHgtPndpZHRoKTsKKyAgICBmb3JtYXQgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmZm10KTsKKyAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShjb25maWdfaW5mbywga1ZEQURlY29kZXJDb25maWd1cmF0aW9uX0hlaWdodCwgaGVpZ2h0KTsKKyAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShjb25maWdfaW5mbywga1ZEQURlY29kZXJDb25maWd1cmF0aW9uX1dpZHRoLCB3aWR0aCk7CisgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoY29uZmlnX2luZm8sIGtWREFEZWNvZGVyQ29uZmlndXJhdGlvbl9hdmNDRGF0YSwgYXZjX2RhdGEpOworICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGNvbmZpZ19pbmZvLCBrVkRBRGVjb2RlckNvbmZpZ3VyYXRpb25fU291cmNlRm9ybWF0LCBmb3JtYXQpOworCisgICAgYnVmZmVyX2F0dHJpYnV0ZXMgPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOworICAgIGlvX3N1cmZhY2VfcHJvcGVydGllcyA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyk7CisgICAgY3ZfcGl4X2ZtdCAgICAgID0gQ0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZOdW1iZXJTSW50MzJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaXhfZm10KTsKKworICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGJ1ZmZlcl9hdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtDVlBpeGVsQnVmZmVyUGl4ZWxGb3JtYXRUeXBlS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGN2X3BpeF9mbXQpOworICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGJ1ZmZlcl9hdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtDVlBpeGVsQnVmZmVySU9TdXJmYWNlUHJvcGVydGllc0tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpb19zdXJmYWNlX3Byb3BlcnRpZXMpOworCisgICAgc3RhdHVzID0gVkRBRGVjb2RlckNyZWF0ZShjb25maWdfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9hdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZEQURlY29kZXJPdXRwdXRDYWxsYmFjayAqKWZmX3ZkYV9vdXRwdXRfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZGFfY3R4LT5kZWNvZGVyKTsKKworICAgIENGUmVsZWFzZShmb3JtYXQpOworICAgIENGUmVsZWFzZShoZWlnaHQpOworICAgIENGUmVsZWFzZSh3aWR0aCk7CisgICAgQ0ZSZWxlYXNlKGF2Y19kYXRhKTsKKyAgICBDRlJlbGVhc2UoY29uZmlnX2luZm8pOworICAgIENGUmVsZWFzZShjdl9waXhfZm10KTsKKyAgICBDRlJlbGVhc2UoaW9fc3VyZmFjZV9wcm9wZXJ0aWVzKTsKKyAgICBDRlJlbGVhc2UoYnVmZmVyX2F0dHJpYnV0ZXMpOworCisgICAgaWYgKHN0YXR1cyAhPSBrVkRBRGVjb2Rlck5vRXJyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGluaXRpYWxpemUgVkRBICVkXG4iLCBzdGF0dXMpOworICAgIH0KKworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBrVkRBRGVjb2RlckhhcmR3YXJlTm90U3VwcG9ydGVkRXJyOgorICAgIGNhc2Uga1ZEQURlY29kZXJGb3JtYXROb3RTdXBwb3J0ZWRFcnI6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgY2FzZSBrVkRBRGVjb2RlckNvbmZpZ3VyYXRpb25FcnJvcjoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBjYXNlIGtWREFEZWNvZGVyRGVjb2RlckZhaWxlZEVycjoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgY2FzZSBrVkRBRGVjb2Rlck5vRXJyOgorICAgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KK30KKworc3RhdGljIGludCB2ZGFfaDI2NF9hbGxvY19mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGZyYW1lLT53aWR0aCAgPSBhdmN0eC0+d2lkdGg7CisgICAgZnJhbWUtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgZnJhbWUtPmZvcm1hdCA9IGF2Y3R4LT5waXhfZm10OworICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfYWxsb2MoMSk7CisKKyAgICBpZiAoIWZyYW1lLT5idWZbMF0pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSFdBY2NlbCBmZl9oMjY0X3ZkYV9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoMjY0X3ZkYSIsCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9WREEsCisgICAgLmFsbG9jX2ZyYW1lICAgID0gdmRhX2gyNjRfYWxsb2NfZnJhbWUsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gdmRhX2gyNjRfc3RhcnRfZnJhbWUsCisgICAgLmRlY29kZV9zbGljZSAgID0gdmRhX2gyNjRfZGVjb2RlX3NsaWNlLAorICAgIC5lbmRfZnJhbWUgICAgICA9IHZkYV9oMjY0X2VuZF9mcmFtZSwKKyAgICAudW5pbml0ICAgICAgICAgPSB2ZGFfaDI2NF91bmluaXQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZEQUNvbnRleHQpLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZkYV9oMjY0X2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmRhX2gyNjRfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwZTdlNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZkYV9oMjY0X2RlYy5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBYaWRvcm4gUXVhbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2NCBkZWNvZGVyIHZpYSBWREEKKyAqIEBhdXRob3IgWGlkb3JuIFF1YW4gPHF1YW54dW56aGVuQGdtYWlsLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ29yZUZvdW5kYXRpb24uaD4KKworI2luY2x1ZGUgInZkYS5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKKyNpZm5kZWYga0NGQ29yZUZvdW5kYXRpb25WZXJzaW9uTnVtYmVyMTBfNworI2RlZmluZSBrQ0ZDb3JlRm91bmRhdGlvblZlcnNpb25OdW1iZXIxMF83ICAgICAgNjM1LjAwCisjZW5kaWYKKworZXh0ZXJuIEFWQ29kZWMgZmZfaDI2NF9kZWNvZGVyLCBmZl9oMjY0X3ZkYV9kZWNvZGVyOworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHZkYV9waXhmbXRzX3ByaW9yXzEwXzdbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1VZVlk0MjIsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCB2ZGFfcGl4Zm10c1tdID0geworICAgIEFWX1BJWF9GTVRfVVlWWTQyMiwKKyAgICBBVl9QSVhfRk1UX1lVWVY0MjIsCisgICAgQVZfUElYX0ZNVF9OVjEyLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBIMjY0Q29udGV4dCBoMjY0Y3R4OworICAgIGludCBoMjY0X2luaXRpYWxpemVkOworICAgIHN0cnVjdCB2ZGFfY29udGV4dCB2ZGFfY3R4OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworCisgICAgLyogZm9yIGJhY2tpbmctdXAgZmllbGRzIHNldCBieSB1c2VyLgorICAgICAqIHdlIGhhdmUgdG8gZ2FpbiBmdWxsIGNvbnRyb2wgb2Ygc3VjaCBmaWVsZHMgaGVyZSAqLworICAgIHZvaWQgKmh3YWNjZWxfY29udGV4dDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKCpnZXRfZm9ybWF0KShzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKnMsIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqIGZtdCk7CisgICAgaW50ICgqZ2V0X2J1ZmZlcjIpKHN0cnVjdCBBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncyk7CisjaWYgRkZfQVBJX0dFVF9CVUZGRVIKKyAgICBpbnQgKCpnZXRfYnVmZmVyKShzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKmMsIEFWRnJhbWUgKnBpYyk7CisjZW5kaWYKK30gVkRBRGVjb2RlckNvbnRleHQ7CisKK3N0YXRpYyBlbnVtIEFWUGl4ZWxGb3JtYXQgZ2V0X2Zvcm1hdChzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKmZtdCkKK3sKKyAgICByZXR1cm4gQVZfUElYX0ZNVF9WREFfVkxEOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ1ZQaXhlbEJ1ZmZlclJlZiBjdl9idWZmZXI7Cit9IFZEQUJ1ZmZlckNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYnVmZmVyKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBWREFCdWZmZXJDb250ZXh0ICpjb250ZXh0ID0gb3BhcXVlOworICAgIENWUGl4ZWxCdWZmZXJVbmxvY2tCYXNlQWRkcmVzcyhjb250ZXh0LT5jdl9idWZmZXIsIDApOworICAgIENWUGl4ZWxCdWZmZXJSZWxlYXNlKGNvbnRleHQtPmN2X2J1ZmZlcik7CisgICAgYXZfZnJlZShjb250ZXh0KTsKK30KKworc3RhdGljIGludCBnZXRfYnVmZmVyMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnBpYywgaW50IGZsYWcpCit7CisgICAgVkRBQnVmZmVyQ29udGV4dCAqY29udGV4dCA9IGF2X21hbGxvY3ooc2l6ZW9mKFZEQUJ1ZmZlckNvbnRleHQpKTsKKyAgICBBVkJ1ZmZlclJlZiAqYnVmZmVyID0gYXZfYnVmZmVyX2NyZWF0ZShOVUxMLCAwLCByZWxlYXNlX2J1ZmZlciwgY29udGV4dCwgMCk7CisgICAgaWYgKCFjb250ZXh0IHx8ICFidWZmZXIpIHsKKyAgICAgICAgYXZfZnJlZShjb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBwaWMtPmJ1ZlswXSA9IGJ1ZmZlcjsKKyAgICBwaWMtPmRhdGFbMF0gPSAodm9pZCAqKTE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkRBRGVjb2RlckNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY3R4LT5od2FjY2VsX2NvbnRleHQgPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworICAgIGF2Y3R4LT5od2FjY2VsX2NvbnRleHQgPSAmY3R4LT52ZGFfY3R4OworICAgIGN0eC0+Z2V0X2Zvcm1hdCA9IGF2Y3R4LT5nZXRfZm9ybWF0OworICAgIGF2Y3R4LT5nZXRfZm9ybWF0ID0gZ2V0X2Zvcm1hdDsKKyAgICBjdHgtPmdldF9idWZmZXIyID0gYXZjdHgtPmdldF9idWZmZXIyOworICAgIGF2Y3R4LT5nZXRfYnVmZmVyMiA9IGdldF9idWZmZXIyOworI2lmIEZGX0FQSV9HRVRfQlVGRkVSCisgICAgY3R4LT5nZXRfYnVmZmVyID0gYXZjdHgtPmdldF9idWZmZXI7CisgICAgYXZjdHgtPmdldF9idWZmZXIgPSBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZEQURlY29kZXJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGF2Y3R4LT5od2FjY2VsX2NvbnRleHQgPSBjdHgtPmh3YWNjZWxfY29udGV4dDsKKyAgICBhdmN0eC0+Z2V0X2Zvcm1hdCA9IGN0eC0+Z2V0X2Zvcm1hdDsKKyAgICBhdmN0eC0+Z2V0X2J1ZmZlcjIgPSBjdHgtPmdldF9idWZmZXIyOworI2lmIEZGX0FQSV9HRVRfQlVGRkVSCisgICAgYXZjdHgtPmdldF9idWZmZXIgPSBjdHgtPmdldF9idWZmZXI7CisjZW5kaWYKK30KKworc3RhdGljIGludCB2ZGFkZWNfZGVjb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBWREFEZWNvZGVyQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpwaWMgPSBkYXRhOworICAgIGludCByZXQ7CisKKyAgICBzZXRfY29udGV4dChhdmN0eCk7CisgICAgcmV0ID0gZmZfaDI2NF9kZWNvZGVyLmRlY29kZShhdmN0eCwgZGF0YSwgZ290X2ZyYW1lLCBhdnBrdCk7CisgICAgcmVzdG9yZV9jb250ZXh0KGF2Y3R4KTsKKyAgICBpZiAoKmdvdF9mcmFtZSkgeworICAgICAgICBBVkJ1ZmZlclJlZiAqYnVmZmVyID0gcGljLT5idWZbMF07CisgICAgICAgIFZEQUJ1ZmZlckNvbnRleHQgKmNvbnRleHQgPSBhdl9idWZmZXJfZ2V0X29wYXF1ZShidWZmZXIpOworICAgICAgICBDVlBpeGVsQnVmZmVyUmVmIGN2X2J1ZmZlciA9IChDVlBpeGVsQnVmZmVyUmVmKXBpYy0+ZGF0YVszXTsKKworICAgICAgICBDVlBpeGVsQnVmZmVyUmV0YWluKGN2X2J1ZmZlcik7CisgICAgICAgIENWUGl4ZWxCdWZmZXJMb2NrQmFzZUFkZHJlc3MoY3ZfYnVmZmVyLCAwKTsKKyAgICAgICAgY29udGV4dC0+Y3ZfYnVmZmVyID0gY3ZfYnVmZmVyOworICAgICAgICBwaWMtPmZvcm1hdCA9IGN0eC0+cGl4X2ZtdDsKKyAgICAgICAgaWYgKENWUGl4ZWxCdWZmZXJJc1BsYW5hcihjdl9idWZmZXIpKSB7CisgICAgICAgICAgICBpbnQgaSwgY291bnQgPSBDVlBpeGVsQnVmZmVyR2V0UGxhbmVDb3VudChjdl9idWZmZXIpOworICAgICAgICAgICAgYXZfYXNzZXJ0MChjb3VudCA8IDQpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBwaWMtPmRhdGFbaV0gPSBDVlBpeGVsQnVmZmVyR2V0QmFzZUFkZHJlc3NPZlBsYW5lKGN2X2J1ZmZlciwgaSk7CisgICAgICAgICAgICAgICAgcGljLT5saW5lc2l6ZVtpXSA9IENWUGl4ZWxCdWZmZXJHZXRCeXRlc1BlclJvd09mUGxhbmUoY3ZfYnVmZmVyLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBpYy0+ZGF0YVswXSA9IENWUGl4ZWxCdWZmZXJHZXRCYXNlQWRkcmVzcyhjdl9idWZmZXIpOworICAgICAgICAgICAgcGljLT5saW5lc2l6ZVswXSA9IENWUGl4ZWxCdWZmZXJHZXRCeXRlc1BlclJvdyhjdl9idWZmZXIpOworICAgICAgICB9CisgICAgfQorICAgIGF2Y3R4LT5waXhfZm10ID0gY3R4LT5waXhfZm10OworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHZkYWRlY19jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkRBRGVjb2RlckNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgLyogcmVsZWFzZSBidWZmZXJzIGFuZCBkZWNvZGVyICovCisgICAgZmZfdmRhX2Rlc3Ryb3lfZGVjb2RlcigmY3R4LT52ZGFfY3R4KTsKKyAgICAvKiBjbG9zZSBILjI2NCBkZWNvZGVyICovCisgICAgaWYgKGN0eC0+aDI2NF9pbml0aWFsaXplZCkgeworICAgICAgICBzZXRfY29udGV4dChhdmN0eCk7CisgICAgICAgIGZmX2gyNjRfZGVjb2Rlci5jbG9zZShhdmN0eCk7CisgICAgICAgIHJlc3RvcmVfY29udGV4dChhdmN0eCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdmRhZGVjX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZEQURlY29kZXJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCB2ZGFfY29udGV4dCAqdmRhX2N0eCA9ICZjdHgtPnZkYV9jdHg7CisgICAgT1NTdGF0dXMgc3RhdHVzOworICAgIGludCByZXQsIGk7CisKKyAgICBjdHgtPmgyNjRfaW5pdGlhbGl6ZWQgPSAwOworCisgICAgLyogaW5pdCBwaXhfZm10cyBvZiBjb2RlYyAqLworICAgIGlmICghZmZfaDI2NF92ZGFfZGVjb2Rlci5waXhfZm10cykgeworICAgICAgICBpZiAoa0NGQ29yZUZvdW5kYXRpb25WZXJzaW9uTnVtYmVyIDwga0NGQ29yZUZvdW5kYXRpb25WZXJzaW9uTnVtYmVyMTBfNykKKyAgICAgICAgICAgIGZmX2gyNjRfdmRhX2RlY29kZXIucGl4X2ZtdHMgPSB2ZGFfcGl4Zm10c19wcmlvcl8xMF83OworICAgICAgICBlbHNlCisgICAgICAgICAgICBmZl9oMjY0X3ZkYV9kZWNvZGVyLnBpeF9mbXRzID0gdmRhX3BpeGZtdHM7CisgICAgfQorCisgICAgLyogaW5pdCB2ZGEgKi8KKyAgICBtZW1zZXQodmRhX2N0eCwgMCwgc2l6ZW9mKHN0cnVjdCB2ZGFfY29udGV4dCkpOworICAgIHZkYV9jdHgtPndpZHRoID0gYXZjdHgtPndpZHRoOworICAgIHZkYV9jdHgtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgdmRhX2N0eC0+Zm9ybWF0ID0gJ2F2YzEnOworICAgIHZkYV9jdHgtPnVzZV9zeW5jX2RlY29kaW5nID0gMTsKKyAgICB2ZGFfY3R4LT51c2VfcmVmX2J1ZmZlciA9IDE7CisgICAgY3R4LT5waXhfZm10ID0gYXZjdHgtPmdldF9mb3JtYXQoYXZjdHgsIGF2Y3R4LT5jb2RlYy0+cGl4X2ZtdHMpOworICAgIHN3aXRjaCAoY3R4LT5waXhfZm10KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1VZVlk0MjI6CisgICAgICAgIHZkYV9jdHgtPmN2X3BpeF9mbXRfdHlwZSA9ICcydnV5JzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVWVY0MjI6CisgICAgICAgIHZkYV9jdHgtPmN2X3BpeF9mbXRfdHlwZSA9ICd5dXZzJzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX05WMTI6CisgICAgICAgIHZkYV9jdHgtPmN2X3BpeF9mbXRfdHlwZSA9ICc0MjB2JzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgICAgIHZkYV9jdHgtPmN2X3BpeF9mbXRfdHlwZSA9ICd5NDIwJzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQ6ICVkXG4iLCBhdmN0eC0+cGl4X2ZtdCk7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgICBzdGF0dXMgPSBmZl92ZGFfY3JlYXRlX2RlY29kZXIodmRhX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICBpZiAoc3RhdHVzICE9IGtWREFEZWNvZGVyTm9FcnIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbml0IFZEQSBkZWNvZGVyOiAlZC5cbiIsIHN0YXR1cyk7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAgIC8qIGluaXQgSC4yNjQgZGVjb2RlciAqLworICAgIHNldF9jb250ZXh0KGF2Y3R4KTsKKyAgICByZXQgPSBmZl9oMjY0X2RlY29kZXIuaW5pdChhdmN0eCk7CisgICAgcmVzdG9yZV9jb250ZXh0KGF2Y3R4KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIEguMjY0IGRlY29kZXIuXG4iKTsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIGN0eC0+aDI2NF9pbml0aWFsaXplZCA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1NQU19DT1VOVDsgaSsrKSB7CisgICAgICAgIFNQUyAqc3BzID0gY3R4LT5oMjY0Y3R4LnNwc19idWZmZXJzW2ldOworICAgICAgICBpZiAoc3BzICYmIChzcHMtPmJpdF9kZXB0aF9sdW1hICE9IDggfHwKKyAgICAgICAgICAgICAgICBzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIgfHwKKyAgICAgICAgICAgICAgICBzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworCitmYWlsZWQ6CisgICAgdmRhZGVjX2Nsb3NlKGF2Y3R4KTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHZkYWRlY19mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgc2V0X2NvbnRleHQoYXZjdHgpOworICAgIGZmX2gyNjRfZGVjb2Rlci5mbHVzaChhdmN0eCk7CisgICAgcmVzdG9yZV9jb250ZXh0KGF2Y3R4KTsKK30KKworQVZDb2RlYyBmZl9oMjY0X3ZkYV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoMjY0X3ZkYSIsCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZEQURlY29kZXJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2ZGFkZWNfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB2ZGFkZWNfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gdmRhZGVjX2RlY29kZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfREVMQVksCisgICAgLmZsdXNoICAgICAgICAgID0gdmRhZGVjX2ZsdXNoLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJILjI2NCAoVkRBIGFjY2VsZXJhdGlvbikiKSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92ZGFfaW50ZXJuYWwuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZkYV9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzkxNmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92ZGFfaW50ZXJuYWwuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WREFfSU5URVJOQUxfSAorI2RlZmluZSBBVkNPREVDX1ZEQV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlICJ2ZGEuaCIKKwordm9pZCBmZl92ZGFfb3V0cHV0X2NhbGxiYWNrKHZvaWQgKnZkYV9od19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmIHVzZXJfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPU1N0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5mb0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWSW1hZ2VCdWZmZXJSZWYgaW1hZ2VfYnVmZmVyKTsKKworaW50IGZmX3ZkYV9kZWZhdWx0X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK3ZvaWQgZmZfdmRhX2RlZmF1bHRfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisjZW5kaWYgLyogQVZDT0RFQ19WREFfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmRwYXUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZkcGF1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxMTZmNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZkcGF1LmMKQEAgLTAsMCArMSw3MDggQEAKKy8qCisgKiBWaWRlbyBEZWNvZGUgYW5kIFByZXNlbnRhdGlvbiBBUEkgZm9yIFVOSVggKFZEUEFVKSBpcyB1c2VkIGZvcgorICogSFcgZGVjb2RlIGFjY2VsZXJhdGlvbiBmb3IgTVBFRy0xLzIsIE1QRUctNCBBU1AsIEguMjY0IGFuZCBWQy0xLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBOVklESUEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJ2YzEuaCIKKworI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAidmRwYXUuaCIKKyNpbmNsdWRlICJ2ZHBhdV9pbnRlcm5hbC5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIFZEUEFVX0RlY29kaW5nCisgKgorICogQHsKKyAqLworCitzdGF0aWMgaW50IHZkcGF1X2Vycm9yKFZkcFN0YXR1cyBzdGF0dXMpCit7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIFZEUF9TVEFUVVNfT0s6CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgVkRQX1NUQVRVU19OT19JTVBMRU1FTlRBVElPTjoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICBjYXNlIFZEUF9TVEFUVVNfRElTUExBWV9QUkVFTVBURUQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgY2FzZSBWRFBfU1RBVFVTX0lOVkFMSURfSEFORExFOgorICAgICAgICByZXR1cm4gQVZFUlJPUihFQkFERik7CisgICAgY2FzZSBWRFBfU1RBVFVTX0lOVkFMSURfUE9JTlRFUjoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUZBVUxUKTsKKyAgICBjYXNlIFZEUF9TVEFUVVNfUkVTT1VSQ0VTOgorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9CVUZTKTsKKyAgICBjYXNlIFZEUF9TVEFUVVNfSEFORExFX0RFVklDRV9NSVNNQVRDSDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRVhERVYpOworICAgIGNhc2UgVkRQX1NUQVRVU19FUlJPUjoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KK30KKworQVZWRFBBVUNvbnRleHQgKmF2X2FsbG9jX3ZkcGF1Y29udGV4dCh2b2lkKQoreworICAgIHJldHVybiBhdl92ZHBhdV9hbGxvY19jb250ZXh0KCk7Cit9CisKK01BS0VfQUNDRVNTT1JTKEFWVkRQQVVDb250ZXh0LCB2ZHBhdV9od2FjY2VsLCBBVlZEUEFVX1JlbmRlcjIsIHJlbmRlcjIpCisKK2ludCBmZl92ZHBhdV9jb21tb25faW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFZkcERlY29kZXJQcm9maWxlIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKQoreworICAgIFZEUEFVSFdDb250ZXh0ICpod2N0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgVkRQQVVDb250ZXh0ICp2ZGN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgVmRwVmlkZW9TdXJmYWNlUXVlcnlDYXBhYmlsaXRpZXMgKnN1cmZhY2VfcXVlcnlfY2FwczsKKyAgICBWZHBEZWNvZGVyUXVlcnlDYXBhYmlsaXRpZXMgKmRlY29kZXJfcXVlcnlfY2FwczsKKyAgICBWZHBEZWNvZGVyQ3JlYXRlICpjcmVhdGU7CisgICAgdm9pZCAqZnVuYzsKKyAgICBWZHBTdGF0dXMgc3RhdHVzOworICAgIFZkcEJvb2wgc3VwcG9ydGVkOworICAgIHVpbnQzMl90IG1heF9sZXZlbCwgbWF4X21iLCBtYXhfd2lkdGgsIG1heF9oZWlnaHQ7CisgICAgLyogU2VlIHZkcGF1L3ZkcGF1LmggZm9yIGFsaWdubWVudCBjb25zdHJhaW50cy4gKi8KKyAgICB1aW50MzJfdCB3aWR0aCAgPSAoYXZjdHgtPmNvZGVkX3dpZHRoICsgMSkgJiB+MTsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSAoYXZjdHgtPmNvZGVkX2hlaWdodCArIDMpICYgfjM7CisKKyAgICB2ZGN0eC0+d2lkdGggICAgICAgICAgICA9IFVJTlQzMl9NQVg7CisgICAgdmRjdHgtPmhlaWdodCAgICAgICAgICAgPSBVSU5UMzJfTUFYOworCisgICAgaWYgKCFod2N0eCkgeworICAgICAgICB2ZGN0eC0+ZGV2aWNlICA9IFZEUF9JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImh3YWNjZWxfY29udGV4dCBoYXMgbm90IGJlZW4gc2V0dXAgYnkgdGhlIHVzZXIgYXBwbGljYXRpb24sIGNhbm5vdCBpbml0aWFsaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGh3Y3R4LT5jb250ZXh0LmRlY29kZXIgIT0gVkRQX0lOVkFMSURfSEFORExFKSB7CisgICAgICAgIHZkY3R4LT5kZWNvZGVyID0gaHdjdHgtPmNvbnRleHQuZGVjb2RlcjsKKyAgICAgICAgdmRjdHgtPnJlbmRlciAgPSBod2N0eC0+Y29udGV4dC5yZW5kZXI7CisgICAgICAgIHZkY3R4LT5kZXZpY2UgID0gVkRQX0lOVkFMSURfSEFORExFOworICAgICAgICByZXR1cm4gMDsgLyogRGVjb2RlciBjcmVhdGVkIGJ5IHVzZXIgKi8KKyAgICB9CisgICAgaHdjdHgtPnJlc2V0ICAgICAgICAgICAgPSAwOworCisgICAgdmRjdHgtPmRldmljZSAgICAgICAgICAgPSBod2N0eC0+ZGV2aWNlOworICAgIHZkY3R4LT5nZXRfcHJvY19hZGRyZXNzID0gaHdjdHgtPmdldF9wcm9jX2FkZHJlc3M7CisKKyAgICBpZiAoaHdjdHgtPmZsYWdzICYgQVZfSFdBQ0NFTF9GTEFHX0lHTk9SRV9MRVZFTCkKKyAgICAgICAgbGV2ZWwgPSAwOworICAgIGVsc2UgaWYgKGxldmVsIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PVFNVUCk7CisKKyAgICBzdGF0dXMgPSB2ZGN0eC0+Z2V0X3Byb2NfYWRkcmVzcyh2ZGN0eC0+ZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZEUF9GVU5DX0lEX1ZJREVPX1NVUkZBQ0VfUVVFUllfQ0FQQUJJTElUSUVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmdW5jKTsKKyAgICBpZiAoc3RhdHVzICE9IFZEUF9TVEFUVVNfT0spCisgICAgICAgIHJldHVybiB2ZHBhdV9lcnJvcihzdGF0dXMpOworICAgIGVsc2UKKyAgICAgICAgc3VyZmFjZV9xdWVyeV9jYXBzID0gZnVuYzsKKworICAgIHN0YXR1cyA9IHN1cmZhY2VfcXVlcnlfY2Fwcyh2ZGN0eC0+ZGV2aWNlLCBWRFBfQ0hST01BX1RZUEVfNDIwLCAmc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4X3dpZHRoLCAmbWF4X2hlaWdodCk7CisgICAgaWYgKHN0YXR1cyAhPSBWRFBfU1RBVFVTX09LKQorICAgICAgICByZXR1cm4gdmRwYXVfZXJyb3Ioc3RhdHVzKTsKKyAgICBpZiAoc3VwcG9ydGVkICE9IFZEUF9UUlVFIHx8CisgICAgICAgIG1heF93aWR0aCA8IHdpZHRoIHx8IG1heF9oZWlnaHQgPCBoZWlnaHQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1RTVVApOworCisgICAgc3RhdHVzID0gdmRjdHgtPmdldF9wcm9jX2FkZHJlc3ModmRjdHgtPmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRFBfRlVOQ19JRF9ERUNPREVSX1FVRVJZX0NBUEFCSUxJVElFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVuYyk7CisgICAgaWYgKHN0YXR1cyAhPSBWRFBfU1RBVFVTX09LKQorICAgICAgICByZXR1cm4gdmRwYXVfZXJyb3Ioc3RhdHVzKTsKKyAgICBlbHNlCisgICAgICAgIGRlY29kZXJfcXVlcnlfY2FwcyA9IGZ1bmM7CisKKyAgICBzdGF0dXMgPSBkZWNvZGVyX3F1ZXJ5X2NhcHModmRjdHgtPmRldmljZSwgcHJvZmlsZSwgJnN1cHBvcnRlZCwgJm1heF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heF9tYiwgJm1heF93aWR0aCwgJm1heF9oZWlnaHQpOworICAgIGlmIChzdGF0dXMgIT0gVkRQX1NUQVRVU19PSykKKyAgICAgICAgcmV0dXJuIHZkcGF1X2Vycm9yKHN0YXR1cyk7CisKKyAgICBpZiAoc3VwcG9ydGVkICE9IFZEUF9UUlVFIHx8IG1heF9sZXZlbCA8IGxldmVsIHx8CisgICAgICAgIG1heF93aWR0aCA8IHdpZHRoIHx8IG1heF9oZWlnaHQgPCBoZWlnaHQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1RTVVApOworCisgICAgc3RhdHVzID0gdmRjdHgtPmdldF9wcm9jX2FkZHJlc3ModmRjdHgtPmRldmljZSwgVkRQX0ZVTkNfSURfREVDT0RFUl9DUkVBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bmMpOworICAgIGlmIChzdGF0dXMgIT0gVkRQX1NUQVRVU19PSykKKyAgICAgICAgcmV0dXJuIHZkcGF1X2Vycm9yKHN0YXR1cyk7CisgICAgZWxzZQorICAgICAgICBjcmVhdGUgPSBmdW5jOworCisgICAgc3RhdHVzID0gdmRjdHgtPmdldF9wcm9jX2FkZHJlc3ModmRjdHgtPmRldmljZSwgVkRQX0ZVTkNfSURfREVDT0RFUl9SRU5ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bmMpOworICAgIGlmIChzdGF0dXMgIT0gVkRQX1NUQVRVU19PSykKKyAgICAgICAgcmV0dXJuIHZkcGF1X2Vycm9yKHN0YXR1cyk7CisgICAgZWxzZQorICAgICAgICB2ZGN0eC0+cmVuZGVyID0gZnVuYzsKKworICAgIHN0YXR1cyA9IGNyZWF0ZSh2ZGN0eC0+ZGV2aWNlLCBwcm9maWxlLCB3aWR0aCwgaGVpZ2h0LCBhdmN0eC0+cmVmcywKKyAgICAgICAgICAgICAgICAgICAgJnZkY3R4LT5kZWNvZGVyKTsKKyAgICBpZiAoc3RhdHVzID09IFZEUF9TVEFUVVNfT0spIHsKKyAgICAgICAgdmRjdHgtPndpZHRoICA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICAgICAgdmRjdHgtPmhlaWdodCA9IGF2Y3R4LT5jb2RlZF9oZWlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIHZkcGF1X2Vycm9yKHN0YXR1cyk7Cit9CisKK2ludCBmZl92ZHBhdV9jb21tb25fdW5pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWRFBBVUNvbnRleHQgKnZkY3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBWZHBEZWNvZGVyRGVzdHJveSAqZGVzdHJveTsKKyAgICB2b2lkICpmdW5jOworICAgIFZkcFN0YXR1cyBzdGF0dXM7CisKKyAgICBpZiAodmRjdHgtPmRldmljZSA9PSBWRFBfSU5WQUxJRF9IQU5ETEUpCisgICAgICAgIHJldHVybiAwOyAvKiBEZWNvZGVyIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCBieSB1c2VyICovCisgICAgaWYgKHZkY3R4LT53aWR0aCA9PSBVSU5UMzJfTUFYICYmIHZkY3R4LT5oZWlnaHQgPT0gVUlOVDMyX01BWCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdGF0dXMgPSB2ZGN0eC0+Z2V0X3Byb2NfYWRkcmVzcyh2ZGN0eC0+ZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZEUF9GVU5DX0lEX0RFQ09ERVJfREVTVFJPWSwgJmZ1bmMpOworICAgIGlmIChzdGF0dXMgIT0gVkRQX1NUQVRVU19PSykKKyAgICAgICAgcmV0dXJuIHZkcGF1X2Vycm9yKHN0YXR1cyk7CisgICAgZWxzZQorICAgICAgICBkZXN0cm95ID0gZnVuYzsKKworICAgIHN0YXR1cyA9IGRlc3Ryb3kodmRjdHgtPmRlY29kZXIpOworICAgIHJldHVybiB2ZHBhdV9lcnJvcihzdGF0dXMpOworfQorCitzdGF0aWMgaW50IGZmX3ZkcGF1X2NvbW1vbl9yZWluaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZEUEFVSFdDb250ZXh0ICpod2N0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgVkRQQVVDb250ZXh0ICp2ZGN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisKKyAgICBpZiAodmRjdHgtPmRldmljZSA9PSBWRFBfSU5WQUxJRF9IQU5ETEUpCisgICAgICAgIHJldHVybiAwOyAvKiBEZWNvZGVyIGNyZWF0ZWQgYnkgdXNlciAqLworICAgIGlmIChhdmN0eC0+Y29kZWRfd2lkdGggPT0gdmRjdHgtPndpZHRoICYmCisgICAgICAgIGF2Y3R4LT5jb2RlZF9oZWlnaHQgPT0gdmRjdHgtPmhlaWdodCAmJiAhaHdjdHgtPnJlc2V0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF2Y3R4LT5od2FjY2VsLT51bmluaXQoYXZjdHgpOworICAgIHJldHVybiBhdmN0eC0+aHdhY2NlbC0+aW5pdChhdmN0eCk7Cit9CisKK2ludCBmZl92ZHBhdV9jb21tb25fc3RhcnRfZnJhbWUoc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCAqcGljX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIHVpbnQzMl90IHNpemUpCit7CisgICAgcGljX2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnNfYWxsb2NhdGVkID0gMDsKKyAgICBwaWNfY3R4LT5iaXRzdHJlYW1fYnVmZmVyc191c2VkICAgICAgPSAwOworICAgIHBpY19jdHgtPmJpdHN0cmVhbV9idWZmZXJzICAgICAgICAgICA9IE5VTEw7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl92ZHBhdV9jb21tb25fZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0ICpwaWNfY3R4KQoreworICAgIFZEUEFVQ29udGV4dCAqdmRjdHggPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOworICAgIEFWVkRQQVVDb250ZXh0ICpod2N0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgVmRwVmlkZW9TdXJmYWNlIHN1cmYgPSBmZl92ZHBhdV9nZXRfc3VyZmFjZV9pZChmcmFtZSk7CisgICAgVmRwU3RhdHVzIHN0YXR1czsKKyAgICBpbnQgdmFsOworCisgICAgdmFsID0gZmZfdmRwYXVfY29tbW9uX3JlaW5pdChhdmN0eCk7CisgICAgaWYgKHZhbCA8IDApCisgICAgICAgIHJldHVybiB2YWw7CisKKyNpZiBGRl9BUElfQlVGU19WRFBBVQorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGh3Y3R4LT5pbmZvID0gcGljX2N0eC0+aW5mbzsKKyAgICBod2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnMgPSBwaWNfY3R4LT5iaXRzdHJlYW1fYnVmZmVyczsKKyAgICBod2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnNfdXNlZCA9IHBpY19jdHgtPmJpdHN0cmVhbV9idWZmZXJzX3VzZWQ7CisgICAgaHdjdHgtPmJpdHN0cmVhbV9idWZmZXJzX2FsbG9jYXRlZCA9IHBpY19jdHgtPmJpdHN0cmVhbV9idWZmZXJzX2FsbG9jYXRlZDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisKKyAgICBpZiAoIWh3Y3R4LT5yZW5kZXIgJiYgaHdjdHgtPnJlbmRlcjIpIHsKKyAgICAgICAgc3RhdHVzID0gaHdjdHgtPnJlbmRlcjIoYXZjdHgsIGZyYW1lLCAodm9pZCAqKSZwaWNfY3R4LT5pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfY3R4LT5iaXRzdHJlYW1fYnVmZmVyc191c2VkLCBwaWNfY3R4LT5iaXRzdHJlYW1fYnVmZmVycyk7CisgICAgfSBlbHNlCisgICAgc3RhdHVzID0gdmRjdHgtPnJlbmRlcih2ZGN0eC0+ZGVjb2Rlciwgc3VyZiwgKHZvaWQgKikmcGljX2N0eC0+aW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY19jdHgtPmJpdHN0cmVhbV9idWZmZXJzX3VzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfY3R4LT5iaXRzdHJlYW1fYnVmZmVycyk7CisKKyAgICBhdl9mcmVlcCgmcGljX2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnMpOworCisjaWYgRkZfQVBJX0JVRlNfVkRQQVUKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBod2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnMgPSBOVUxMOworICAgIGh3Y3R4LT5iaXRzdHJlYW1fYnVmZmVyc191c2VkID0gMDsKKyAgICBod2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnNfYWxsb2NhdGVkID0gMDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisKKyAgICByZXR1cm4gdmRwYXVfZXJyb3Ioc3RhdHVzKTsKK30KKworI2lmIENPTkZJR19IMjYzX1ZEUEFVX0hXQUNDRUwgIHx8IENPTkZJR19NUEVHMV9WRFBBVV9IV0FDQ0VMIHx8IFwKKyAgICBDT05GSUdfTVBFRzJfVkRQQVVfSFdBQ0NFTCB8fCBDT05GSUdfTVBFRzRfVkRQQVVfSFdBQ0NFTCB8fCBcCisgICAgQ09ORklHX1ZDMV9WRFBBVV9IV0FDQ0VMICAgfHwgQ09ORklHX1dNVjNfVkRQQVVfSFdBQ0NFTAoraW50IGZmX3ZkcGF1X21wZWdfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgUGljdHVyZSAqcGljID0gcy0+Y3VycmVudF9waWN0dXJlX3B0cjsKKyAgICBzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0ICpwaWNfY3R4ID0gcGljLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKyAgICBpbnQgdmFsOworCisgICAgdmFsID0gZmZfdmRwYXVfY29tbW9uX2VuZF9mcmFtZShhdmN0eCwgcGljLT5mLCBwaWNfY3R4KTsKKyAgICBpZiAodmFsIDwgMCkKKyAgICAgICAgcmV0dXJuIHZhbDsKKworICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIDAsIHMtPmF2Y3R4LT5oZWlnaHQpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBmZl92ZHBhdV9hZGRfYnVmZmVyKHN0cnVjdCB2ZHBhdV9waWN0dXJlX2NvbnRleHQgKnBpY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIHVpbnQzMl90IHNpemUpCit7CisgICAgVmRwQml0c3RyZWFtQnVmZmVyICpidWZmZXJzID0gcGljX2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnM7CisKKyAgICBidWZmZXJzID0gYXZfZmFzdF9yZWFsbG9jKGJ1ZmZlcnMsICZwaWNfY3R4LT5iaXRzdHJlYW1fYnVmZmVyc19hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGljX2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnNfdXNlZCArIDEpICogc2l6ZW9mKCpidWZmZXJzKSk7CisgICAgaWYgKCFidWZmZXJzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcGljX2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnMgPSBidWZmZXJzOworICAgIGJ1ZmZlcnMgKz0gcGljX2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnNfdXNlZCsrOworCisgICAgYnVmZmVycy0+c3RydWN0X3ZlcnNpb24gID0gVkRQX0JJVFNUUkVBTV9CVUZGRVJfVkVSU0lPTjsKKyAgICBidWZmZXJzLT5iaXRzdHJlYW0gICAgICAgPSBidWY7CisgICAgYnVmZmVycy0+Yml0c3RyZWFtX2J5dGVzID0gc2l6ZTsKKyAgICByZXR1cm4gMDsKK30KKworLyogT2Jzb2xldGUgbm9uLWh3YWNjZWwgVkRQQVUgc3VwcG9ydCBiZWxvdy4uLiAqLworCit2b2lkIGZmX3ZkcGF1X2gyNjRfc2V0X3JlZmVyZW5jZV9mcmFtZXMoSDI2NENvbnRleHQgKmgpCit7CisgICAgc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyLCAqcmVuZGVyX3JlZjsKKyAgICBWZHBSZWZlcmVuY2VGcmFtZUgyNjQgKnJmLCAqcmYyOworICAgIEgyNjRQaWN0dXJlICpwaWM7CisgICAgaW50IGksIGxpc3QsIHBpY19mcmFtZV9pZHg7CisKKyAgICByZW5kZXIgPSAoc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSAqKWgtPmN1cl9waWNfcHRyLT5mLmRhdGFbMF07CisgICAgYXNzZXJ0KHJlbmRlcik7CisKKyAgICByZiA9ICZyZW5kZXItPmluZm8uaDI2NC5yZWZlcmVuY2VGcmFtZXNbMF07CisjZGVmaW5lIEgyNjRfUkZfQ09VTlQgRkZfQVJSQVlfRUxFTVMocmVuZGVyLT5pbmZvLmgyNjQucmVmZXJlbmNlRnJhbWVzKQorCisgICAgZm9yIChsaXN0ID0gMDsgbGlzdCA8IDI7ICsrbGlzdCkgeworICAgICAgICBIMjY0UGljdHVyZSAqKmxwID0gbGlzdCA/IGgtPmxvbmdfcmVmIDogaC0+c2hvcnRfcmVmOworICAgICAgICBpbnQgbHMgPSBsaXN0ID8gMTYgOiBoLT5zaG9ydF9yZWZfY291bnQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxzOyArK2kpIHsKKyAgICAgICAgICAgIHBpYyA9IGxwW2ldOworICAgICAgICAgICAgaWYgKCFwaWMgfHwgIXBpYy0+cmVmZXJlbmNlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcGljX2ZyYW1lX2lkeCA9IHBpYy0+bG9uZ19yZWYgPyBwaWMtPnBpY19pZCA6IHBpYy0+ZnJhbWVfbnVtOworCisgICAgICAgICAgICByZW5kZXJfcmVmID0gKHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKilwaWMtPmYuZGF0YVswXTsKKyAgICAgICAgICAgIGFzc2VydChyZW5kZXJfcmVmKTsKKworICAgICAgICAgICAgcmYyID0gJnJlbmRlci0+aW5mby5oMjY0LnJlZmVyZW5jZUZyYW1lc1swXTsKKyAgICAgICAgICAgIHdoaWxlIChyZjIgIT0gcmYpIHsKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgIChyZjItPnN1cmZhY2UgPT0gcmVuZGVyX3JlZi0+c3VyZmFjZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHJmMi0+aXNfbG9uZ190ZXJtID09IHBpYy0+bG9uZ19yZWYpCisgICAgICAgICAgICAgICAgICAgICYmIChyZjItPmZyYW1lX2lkeCA9PSBwaWNfZnJhbWVfaWR4KQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgKytyZjI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmYyICE9IHJmKSB7CisgICAgICAgICAgICAgICAgcmYyLT50b3BfaXNfcmVmZXJlbmNlICAgIHw9IChwaWMtPnJlZmVyZW5jZSAmIFBJQ1RfVE9QX0ZJRUxEKSAgICA/IFZEUF9UUlVFIDogVkRQX0ZBTFNFOworICAgICAgICAgICAgICAgIHJmMi0+Ym90dG9tX2lzX3JlZmVyZW5jZSB8PSAocGljLT5yZWZlcmVuY2UgJiBQSUNUX0JPVFRPTV9GSUVMRCkgPyBWRFBfVFJVRSA6IFZEUF9GQUxTRTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJmID49ICZyZW5kZXItPmluZm8uaDI2NC5yZWZlcmVuY2VGcmFtZXNbSDI2NF9SRl9DT1VOVF0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHJmLT5zdXJmYWNlICAgICAgICAgICAgID0gcmVuZGVyX3JlZi0+c3VyZmFjZTsKKyAgICAgICAgICAgIHJmLT5pc19sb25nX3Rlcm0gICAgICAgID0gcGljLT5sb25nX3JlZjsKKyAgICAgICAgICAgIHJmLT50b3BfaXNfcmVmZXJlbmNlICAgID0gKHBpYy0+cmVmZXJlbmNlICYgUElDVF9UT1BfRklFTEQpICAgID8gVkRQX1RSVUUgOiBWRFBfRkFMU0U7CisgICAgICAgICAgICByZi0+Ym90dG9tX2lzX3JlZmVyZW5jZSA9IChwaWMtPnJlZmVyZW5jZSAmIFBJQ1RfQk9UVE9NX0ZJRUxEKSA/IFZEUF9UUlVFIDogVkRQX0ZBTFNFOworICAgICAgICAgICAgcmYtPmZpZWxkX29yZGVyX2NudFswXSAgPSBwaWMtPmZpZWxkX3BvY1swXTsKKyAgICAgICAgICAgIHJmLT5maWVsZF9vcmRlcl9jbnRbMV0gID0gcGljLT5maWVsZF9wb2NbMV07CisgICAgICAgICAgICByZi0+ZnJhbWVfaWR4ICAgICAgICAgICA9IHBpY19mcmFtZV9pZHg7CisKKyAgICAgICAgICAgICsrcmY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKDsgcmYgPCAmcmVuZGVyLT5pbmZvLmgyNjQucmVmZXJlbmNlRnJhbWVzW0gyNjRfUkZfQ09VTlRdOyArK3JmKSB7CisgICAgICAgIHJmLT5zdXJmYWNlICAgICAgICAgICAgID0gVkRQX0lOVkFMSURfSEFORExFOworICAgICAgICByZi0+aXNfbG9uZ190ZXJtICAgICAgICA9IDA7CisgICAgICAgIHJmLT50b3BfaXNfcmVmZXJlbmNlICAgID0gMDsKKyAgICAgICAgcmYtPmJvdHRvbV9pc19yZWZlcmVuY2UgPSAwOworICAgICAgICByZi0+ZmllbGRfb3JkZXJfY250WzBdICA9IDA7CisgICAgICAgIHJmLT5maWVsZF9vcmRlcl9jbnRbMV0gID0gMDsKKyAgICAgICAgcmYtPmZyYW1lX2lkeCAgICAgICAgICAgPSAwOworICAgIH0KK30KKwordm9pZCBmZl92ZHBhdV9hZGRfZGF0YV9jaHVuayh1aW50OF90ICpkYXRhLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlICpyZW5kZXIgPSAoc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSopZGF0YTsKKyAgICBhc3NlcnQocmVuZGVyKTsKKworICAgIHJlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnM9IGF2X2Zhc3RfcmVhbGxvYygKKyAgICAgICAgcmVuZGVyLT5iaXRzdHJlYW1fYnVmZmVycywKKyAgICAgICAgJnJlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnNfYWxsb2NhdGVkLAorICAgICAgICBzaXplb2YoKnJlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnMpKihyZW5kZXItPmJpdHN0cmVhbV9idWZmZXJzX3VzZWQgKyAxKQorICAgICk7CisKKyAgICByZW5kZXItPmJpdHN0cmVhbV9idWZmZXJzW3JlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnNfdXNlZF0uc3RydWN0X3ZlcnNpb24gID0gVkRQX0JJVFNUUkVBTV9CVUZGRVJfVkVSU0lPTjsKKyAgICByZW5kZXItPmJpdHN0cmVhbV9idWZmZXJzW3JlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnNfdXNlZF0uYml0c3RyZWFtICAgICAgID0gYnVmOworICAgIHJlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnNbcmVuZGVyLT5iaXRzdHJlYW1fYnVmZmVyc191c2VkXS5iaXRzdHJlYW1fYnl0ZXMgPSBidWZfc2l6ZTsKKyAgICByZW5kZXItPmJpdHN0cmVhbV9idWZmZXJzX3VzZWQrKzsKK30KKworI2lmIENPTkZJR19IMjY0X1ZEUEFVX0RFQ09ERVIKK3ZvaWQgZmZfdmRwYXVfaDI2NF9waWN0dXJlX3N0YXJ0KEgyNjRDb250ZXh0ICpoKQoreworICAgIHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKnJlbmRlcjsKKyAgICBpbnQgaTsKKworICAgIHJlbmRlciA9IChzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlICopaC0+Y3VyX3BpY19wdHItPmYuZGF0YVswXTsKKyAgICBhc3NlcnQocmVuZGVyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgaW50IGZvYyA9IGgtPmN1cl9waWNfcHRyLT5maWVsZF9wb2NbaV07CisgICAgICAgIGlmIChmb2MgPT0gSU5UX01BWCkKKyAgICAgICAgICAgIGZvYyA9IDA7CisgICAgICAgIHJlbmRlci0+aW5mby5oMjY0LmZpZWxkX29yZGVyX2NudFtpXSA9IGZvYzsKKyAgICB9CisKKyAgICByZW5kZXItPmluZm8uaDI2NC5mcmFtZV9udW0gPSBoLT5mcmFtZV9udW07Cit9CisKK3ZvaWQgZmZfdmRwYXVfaDI2NF9waWN0dXJlX2NvbXBsZXRlKEgyNjRDb250ZXh0ICpoKQoreworICAgIHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKnJlbmRlcjsKKworICAgIHJlbmRlciA9IChzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlICopaC0+Y3VyX3BpY19wdHItPmYuZGF0YVswXTsKKyAgICBhc3NlcnQocmVuZGVyKTsKKworICAgIHJlbmRlci0+aW5mby5oMjY0LnNsaWNlX2NvdW50ID0gaC0+c2xpY2VfbnVtOworICAgIGlmIChyZW5kZXItPmluZm8uaDI2NC5zbGljZV9jb3VudCA8IDEpCisgICAgICAgIHJldHVybjsKKworICAgIHJlbmRlci0+aW5mby5oMjY0LmlzX3JlZmVyZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKGgtPmN1cl9waWNfcHRyLT5yZWZlcmVuY2UgJiAzKSA/IFZEUF9UUlVFIDogVkRQX0ZBTFNFOworICAgIHJlbmRlci0+aW5mby5oMjY0LmZpZWxkX3BpY19mbGFnICAgICAgICAgICAgICAgICAgICAgICAgID0gaC0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRTsKKyAgICByZW5kZXItPmluZm8uaDI2NC5ib3R0b21fZmllbGRfZmxhZyAgICAgICAgICAgICAgICAgICAgICA9IGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEOworICAgIHJlbmRlci0+aW5mby5oMjY0Lm51bV9yZWZfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgID0gaC0+c3BzLnJlZl9mcmFtZV9jb3VudDsKKyAgICByZW5kZXItPmluZm8uaDI2NC5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnICAgICAgICAgICA9IGgtPnNwcy5tYl9hZmYgJiYgIXJlbmRlci0+aW5mby5oMjY0LmZpZWxkX3BpY19mbGFnOworICAgIHJlbmRlci0+aW5mby5oMjY0LmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyAgICAgICAgICAgID0gaC0+cHBzLmNvbnN0cmFpbmVkX2ludHJhX3ByZWQ7CisgICAgcmVuZGVyLT5pbmZvLmgyNjQud2VpZ2h0ZWRfcHJlZF9mbGFnICAgICAgICAgICAgICAgICAgICAgPSBoLT5wcHMud2VpZ2h0ZWRfcHJlZDsKKyAgICByZW5kZXItPmluZm8uaDI2NC53ZWlnaHRlZF9iaXByZWRfaWRjICAgICAgICAgICAgICAgICAgICA9IGgtPnBwcy53ZWlnaHRlZF9iaXByZWRfaWRjOworICAgIHJlbmRlci0+aW5mby5oMjY0LmZyYW1lX21ic19vbmx5X2ZsYWcgICAgICAgICAgICAgICAgICAgID0gaC0+c3BzLmZyYW1lX21ic19vbmx5X2ZsYWc7CisgICAgcmVuZGVyLT5pbmZvLmgyNjQudHJhbnNmb3JtXzh4OF9tb2RlX2ZsYWcgICAgICAgICAgICAgICAgPSBoLT5wcHMudHJhbnNmb3JtXzh4OF9tb2RlOworICAgIHJlbmRlci0+aW5mby5oMjY0LmNocm9tYV9xcF9pbmRleF9vZmZzZXQgICAgICAgICAgICAgICAgID0gaC0+cHBzLmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMF07CisgICAgcmVuZGVyLT5pbmZvLmgyNjQuc2Vjb25kX2Nocm9tYV9xcF9pbmRleF9vZmZzZXQgICAgICAgICAgPSBoLT5wcHMuY2hyb21hX3FwX2luZGV4X29mZnNldFsxXTsKKyAgICByZW5kZXItPmluZm8uaDI2NC5waWNfaW5pdF9xcF9taW51czI2ICAgICAgICAgICAgICAgICAgICA9IGgtPnBwcy5pbml0X3FwIC0gMjY7CisgICAgcmVuZGVyLT5pbmZvLmgyNjQubnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSAgICAgICAgICAgPSBoLT5wcHMucmVmX2NvdW50WzBdIC0gMTsKKyAgICByZW5kZXItPmluZm8uaDI2NC5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICAgICAgICAgICA9IGgtPnBwcy5yZWZfY291bnRbMV0gLSAxOworICAgIHJlbmRlci0+aW5mby5oMjY0LmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgICAgICAgICAgICAgID0gaC0+c3BzLmxvZzJfbWF4X2ZyYW1lX251bSAtIDQ7CisgICAgcmVuZGVyLT5pbmZvLmgyNjQucGljX29yZGVyX2NudF90eXBlICAgICAgICAgICAgICAgICAgICAgPSBoLT5zcHMucG9jX3R5cGU7CisgICAgcmVuZGVyLT5pbmZvLmgyNjQubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICAgICAgPSBoLT5zcHMucG9jX3R5cGUgPyAwIDogaC0+c3BzLmxvZzJfbWF4X3BvY19sc2IgLSA0OworICAgIHJlbmRlci0+aW5mby5oMjY0LmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnICAgICAgID0gaC0+c3BzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOworICAgIHJlbmRlci0+aW5mby5oMjY0LmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgICAgICAgICAgICAgID0gaC0+c3BzLmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWc7CisgICAgcmVuZGVyLT5pbmZvLmgyNjQuZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnICAgICAgICAgICAgICAgPSBoLT5wcHMuY2FiYWM7CisgICAgcmVuZGVyLT5pbmZvLmgyNjQucGljX29yZGVyX3ByZXNlbnRfZmxhZyAgICAgICAgICAgICAgICAgPSBoLT5wcHMucGljX29yZGVyX3ByZXNlbnQ7CisgICAgcmVuZGVyLT5pbmZvLmgyNjQuZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgPSBoLT5wcHMuZGVibG9ja2luZ19maWx0ZXJfcGFyYW1ldGVyc19wcmVzZW50OworICAgIHJlbmRlci0+aW5mby5oMjY0LnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyAgICAgICAgID0gaC0+cHBzLnJlZHVuZGFudF9waWNfY250X3ByZXNlbnQ7CisgICAgbWVtY3B5KHJlbmRlci0+aW5mby5oMjY0LnNjYWxpbmdfbGlzdHNfNHg0LCBoLT5wcHMuc2NhbGluZ19tYXRyaXg0LCBzaXplb2YocmVuZGVyLT5pbmZvLmgyNjQuc2NhbGluZ19saXN0c180eDQpKTsKKyAgICBtZW1jcHkocmVuZGVyLT5pbmZvLmgyNjQuc2NhbGluZ19saXN0c184eDhbMF0sIGgtPnBwcy5zY2FsaW5nX21hdHJpeDhbMF0sIHNpemVvZihyZW5kZXItPmluZm8uaDI2NC5zY2FsaW5nX2xpc3RzXzh4OFswXSkpOworICAgIG1lbWNweShyZW5kZXItPmluZm8uaDI2NC5zY2FsaW5nX2xpc3RzXzh4OFsxXSwgaC0+cHBzLnNjYWxpbmdfbWF0cml4OFszXSwgc2l6ZW9mKHJlbmRlci0+aW5mby5oMjY0LnNjYWxpbmdfbGlzdHNfOHg4WzBdKSk7CisKKyAgICBmZl9oMjY0X2RyYXdfaG9yaXpfYmFuZChoLCAwLCBoLT5hdmN0eC0+aGVpZ2h0KTsKKyAgICByZW5kZXItPmJpdHN0cmVhbV9idWZmZXJzX3VzZWQgPSAwOworfQorI2VuZGlmIC8qIENPTkZJR19IMjY0X1ZEUEFVX0RFQ09ERVIgKi8KKworI2lmIENPTkZJR19NUEVHX1ZEUEFVX0RFQ09ERVIgfHwgQ09ORklHX01QRUcxX1ZEUEFVX0RFQ09ERVIKK3ZvaWQgZmZfdmRwYXVfbXBlZ19waWN0dXJlX2NvbXBsZXRlKE1wZWdFbmNDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUsIGludCBzbGljZV9jb3VudCkKK3sKKyAgICBzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlICpyZW5kZXIsICpsYXN0LCAqbmV4dDsKKyAgICBpbnQgaTsKKworICAgIGlmICghcy0+Y3VycmVudF9waWN0dXJlX3B0cikgcmV0dXJuOworCisgICAgcmVuZGVyID0gKHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKilzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5kYXRhWzBdOworICAgIGFzc2VydChyZW5kZXIpOworCisgICAgLyogZmlsbCBWZHBQaWN0dXJlSW5mb01QRUcxT3IyIHN0cnVjdCAqLworICAgIHJlbmRlci0+aW5mby5tcGVnLnBpY3R1cmVfc3RydWN0dXJlICAgICAgICAgID0gcy0+cGljdHVyZV9zdHJ1Y3R1cmU7CisgICAgcmVuZGVyLT5pbmZvLm1wZWcucGljdHVyZV9jb2RpbmdfdHlwZSAgICAgICAgPSBzLT5waWN0X3R5cGU7CisgICAgcmVuZGVyLT5pbmZvLm1wZWcuaW50cmFfZGNfcHJlY2lzaW9uICAgICAgICAgPSBzLT5pbnRyYV9kY19wcmVjaXNpb247CisgICAgcmVuZGVyLT5pbmZvLm1wZWcuZnJhbWVfcHJlZF9mcmFtZV9kY3QgICAgICAgPSBzLT5mcmFtZV9wcmVkX2ZyYW1lX2RjdDsKKyAgICByZW5kZXItPmluZm8ubXBlZy5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycyA9IHMtPmNvbmNlYWxtZW50X21vdGlvbl92ZWN0b3JzOworICAgIHJlbmRlci0+aW5mby5tcGVnLmludHJhX3ZsY19mb3JtYXQgICAgICAgICAgID0gcy0+aW50cmFfdmxjX2Zvcm1hdDsKKyAgICByZW5kZXItPmluZm8ubXBlZy5hbHRlcm5hdGVfc2NhbiAgICAgICAgICAgICA9IHMtPmFsdGVybmF0ZV9zY2FuOworICAgIHJlbmRlci0+aW5mby5tcGVnLnFfc2NhbGVfdHlwZSAgICAgICAgICAgICAgID0gcy0+cV9zY2FsZV90eXBlOworICAgIHJlbmRlci0+aW5mby5tcGVnLnRvcF9maWVsZF9maXJzdCAgICAgICAgICAgID0gcy0+dG9wX2ZpZWxkX2ZpcnN0OworICAgIHJlbmRlci0+aW5mby5tcGVnLmZ1bGxfcGVsX2ZvcndhcmRfdmVjdG9yICAgID0gcy0+ZnVsbF9wZWxbMF07IC8vIE1QRUctMSBvbmx5LiAgU2V0IDAgZm9yIE1QRUctMgorICAgIHJlbmRlci0+aW5mby5tcGVnLmZ1bGxfcGVsX2JhY2t3YXJkX3ZlY3RvciAgID0gcy0+ZnVsbF9wZWxbMV07IC8vIE1QRUctMSBvbmx5LiAgU2V0IDAgZm9yIE1QRUctMgorICAgIHJlbmRlci0+aW5mby5tcGVnLmZfY29kZVswXVswXSAgICAgICAgICAgICAgID0gcy0+bXBlZ19mX2NvZGVbMF1bMF07IC8vIEZvciBNUEVHLTEgZmlsbCBib3RoIGhvcml6LiAmIHZlcnQuCisgICAgcmVuZGVyLT5pbmZvLm1wZWcuZl9jb2RlWzBdWzFdICAgICAgICAgICAgICAgPSBzLT5tcGVnX2ZfY29kZVswXVsxXTsKKyAgICByZW5kZXItPmluZm8ubXBlZy5mX2NvZGVbMV1bMF0gICAgICAgICAgICAgICA9IHMtPm1wZWdfZl9jb2RlWzFdWzBdOworICAgIHJlbmRlci0+aW5mby5tcGVnLmZfY29kZVsxXVsxXSAgICAgICAgICAgICAgID0gcy0+bXBlZ19mX2NvZGVbMV1bMV07CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyArK2kpIHsKKyAgICAgICAgcmVuZGVyLT5pbmZvLm1wZWcuaW50cmFfcXVhbnRpemVyX21hdHJpeFtpXSAgICAgPSBzLT5pbnRyYV9tYXRyaXhbaV07CisgICAgICAgIHJlbmRlci0+aW5mby5tcGVnLm5vbl9pbnRyYV9xdWFudGl6ZXJfbWF0cml4W2ldID0gcy0+aW50ZXJfbWF0cml4W2ldOworICAgIH0KKworICAgIHJlbmRlci0+aW5mby5tcGVnLmZvcndhcmRfcmVmZXJlbmNlICAgICAgICAgID0gVkRQX0lOVkFMSURfSEFORExFOworICAgIHJlbmRlci0+aW5mby5tcGVnLmJhY2t3YXJkX3JlZmVyZW5jZSAgICAgICAgID0gVkRQX0lOVkFMSURfSEFORExFOworCisgICAgc3dpdGNoKHMtPnBpY3RfdHlwZSl7CisgICAgY2FzZSAgQVZfUElDVFVSRV9UWVBFX0I6CisgICAgICAgIG5leHQgPSAoc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSAqKXMtPm5leHRfcGljdHVyZS5mLT5kYXRhWzBdOworICAgICAgICBhc3NlcnQobmV4dCk7CisgICAgICAgIHJlbmRlci0+aW5mby5tcGVnLmJhY2t3YXJkX3JlZmVyZW5jZSAgICAgPSBuZXh0LT5zdXJmYWNlOworICAgICAgICAvLyBubyByZXR1cm4gaGVyZSwgZ29pbmcgdG8gc2V0IGZvcndhcmQgcHJlZGljdGlvbgorICAgIGNhc2UgIEFWX1BJQ1RVUkVfVFlQRV9QOgorICAgICAgICBsYXN0ID0gKHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKilzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVswXTsKKyAgICAgICAgaWYgKCFsYXN0KSAvLyBGSVhNRTogRG9lcyB0aGlzIHRlc3QgbWFrZSBzZW5zZT8KKyAgICAgICAgICAgIGxhc3QgPSByZW5kZXI7IC8vIHByZWRpY3Qgc2Vjb25kIGZpZWxkIGZyb20gdGhlIGZpcnN0CisgICAgICAgIHJlbmRlci0+aW5mby5tcGVnLmZvcndhcmRfcmVmZXJlbmNlICAgICAgPSBsYXN0LT5zdXJmYWNlOworICAgIH0KKworICAgIGZmX3ZkcGF1X2FkZF9kYXRhX2NodW5rKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmRhdGFbMF0sIGJ1ZiwgYnVmX3NpemUpOworCisgICAgcmVuZGVyLT5pbmZvLm1wZWcuc2xpY2VfY291bnQgICAgICAgICAgICAgICAgPSBzbGljZV9jb3VudDsKKworICAgIGlmIChzbGljZV9jb3VudCkKKyAgICAgICAgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQocywgMCwgcy0+YXZjdHgtPmhlaWdodCk7CisgICAgcmVuZGVyLT5iaXRzdHJlYW1fYnVmZmVyc191c2VkICAgICAgICAgICAgICAgPSAwOworfQorI2VuZGlmIC8qIENPTkZJR19NUEVHX1ZEUEFVX0RFQ09ERVIgfHwgQ09ORklHX01QRUcxX1ZEUEFVX0RFQ09ERVIgKi8KKworI2lmIENPTkZJR19WQzFfVkRQQVVfREVDT0RFUgordm9pZCBmZl92ZHBhdV92YzFfZGVjb2RlX3BpY3R1cmUoTXBlZ0VuY0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSkKK3sKKyAgICBWQzFDb250ZXh0ICp2ID0gcy0+YXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlICpyZW5kZXIsICpsYXN0LCAqbmV4dDsKKworICAgIHJlbmRlciA9IChzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlICopcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMF07CisgICAgYXNzZXJ0KHJlbmRlcik7CisKKyAgICAvKiAgZmlsbCBMdlBpY3R1cmVJbmZvVkMxIHN0cnVjdCAqLworICAgIHJlbmRlci0+aW5mby52YzEuZnJhbWVfY29kaW5nX21vZGUgID0gdi0+ZmNtID8gdi0+ZmNtICsgMSA6IDA7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5wb3N0cHJvY2ZsYWcgICAgICAgPSB2LT5wb3N0cHJvY2ZsYWc7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5wdWxsZG93biAgICAgICAgICAgPSB2LT5icm9hZGNhc3Q7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5pbnRlcmxhY2UgICAgICAgICAgPSB2LT5pbnRlcmxhY2U7CisgICAgcmVuZGVyLT5pbmZvLnZjMS50ZmNudHJmbGFnICAgICAgICAgPSB2LT50ZmNudHJmbGFnOworICAgIHJlbmRlci0+aW5mby52YzEuZmludGVycGZsYWcgICAgICAgID0gdi0+ZmludGVycGZsYWc7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5wc2YgICAgICAgICAgICAgICAgPSB2LT5wc2Y7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5kcXVhbnQgICAgICAgICAgICAgPSB2LT5kcXVhbnQ7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5wYW5zY2FuX2ZsYWcgICAgICAgPSB2LT5wYW5zY2FuZmxhZzsKKyAgICByZW5kZXItPmluZm8udmMxLnJlZmRpc3RfZmxhZyAgICAgICA9IHYtPnJlZmRpc3RfZmxhZzsKKyAgICByZW5kZXItPmluZm8udmMxLnF1YW50aXplciAgICAgICAgICA9IHYtPnF1YW50aXplcl9tb2RlOworICAgIHJlbmRlci0+aW5mby52YzEuZXh0ZW5kZWRfbXYgICAgICAgID0gdi0+ZXh0ZW5kZWRfbXY7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5leHRlbmRlZF9kbXYgICAgICAgPSB2LT5leHRlbmRlZF9kbXY7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5vdmVybGFwICAgICAgICAgICAgPSB2LT5vdmVybGFwOworICAgIHJlbmRlci0+aW5mby52YzEudnN0cmFuc2Zvcm0gICAgICAgID0gdi0+dnN0cmFuc2Zvcm07CisgICAgcmVuZGVyLT5pbmZvLnZjMS5sb29wZmlsdGVyICAgICAgICAgPSB2LT5zLmxvb3BfZmlsdGVyOworICAgIHJlbmRlci0+aW5mby52YzEuZmFzdHV2bWMgICAgICAgICAgID0gdi0+ZmFzdHV2bWM7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5yYW5nZV9tYXB5X2ZsYWcgICAgPSB2LT5yYW5nZV9tYXB5X2ZsYWc7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5yYW5nZV9tYXB5ICAgICAgICAgPSB2LT5yYW5nZV9tYXB5OworICAgIHJlbmRlci0+aW5mby52YzEucmFuZ2VfbWFwdXZfZmxhZyAgID0gdi0+cmFuZ2VfbWFwdXZfZmxhZzsKKyAgICByZW5kZXItPmluZm8udmMxLnJhbmdlX21hcHV2ICAgICAgICA9IHYtPnJhbmdlX21hcHV2OworICAgIC8qIFNwZWNpZmljIHRvIHNpbXBsZS9tYWluIHByb2ZpbGUgb25seSAqLworICAgIHJlbmRlci0+aW5mby52YzEubXVsdGlyZXMgICAgICAgICAgID0gdi0+bXVsdGlyZXM7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5zeW5jbWFya2VyICAgICAgICAgPSB2LT5yZXN5bmNfbWFya2VyOworICAgIHJlbmRlci0+aW5mby52YzEucmFuZ2VyZWQgICAgICAgICAgID0gdi0+cmFuZ2VyZWQgfCAodi0+cmFuZ2VyZWRmcm0gPDwgMSk7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5tYXhiZnJhbWVzICAgICAgICAgPSB2LT5zLm1heF9iX2ZyYW1lczsKKworICAgIHJlbmRlci0+aW5mby52YzEuZGVibG9ja0VuYWJsZSAgICAgID0gdi0+cG9zdHByb2NmbGFnICYgMTsKKyAgICByZW5kZXItPmluZm8udmMxLnBxdWFudCAgICAgICAgICAgICA9IHYtPnBxOworCisgICAgcmVuZGVyLT5pbmZvLnZjMS5mb3J3YXJkX3JlZmVyZW5jZSAgPSBWRFBfSU5WQUxJRF9IQU5ETEU7CisgICAgcmVuZGVyLT5pbmZvLnZjMS5iYWNrd2FyZF9yZWZlcmVuY2UgPSBWRFBfSU5WQUxJRF9IQU5ETEU7CisKKyAgICBpZiAodi0+YmlfdHlwZSkKKyAgICAgICAgcmVuZGVyLT5pbmZvLnZjMS5waWN0dXJlX3R5cGUgPSA0OworICAgIGVsc2UKKyAgICAgICAgcmVuZGVyLT5pbmZvLnZjMS5waWN0dXJlX3R5cGUgPSBzLT5waWN0X3R5cGUgLSAxICsgcy0+cGljdF90eXBlIC8gMzsKKworICAgIHN3aXRjaChzLT5waWN0X3R5cGUpeworICAgIGNhc2UgIEFWX1BJQ1RVUkVfVFlQRV9COgorICAgICAgICBuZXh0ID0gKHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKilzLT5uZXh0X3BpY3R1cmUuZi0+ZGF0YVswXTsKKyAgICAgICAgYXNzZXJ0KG5leHQpOworICAgICAgICByZW5kZXItPmluZm8udmMxLmJhY2t3YXJkX3JlZmVyZW5jZSA9IG5leHQtPnN1cmZhY2U7CisgICAgICAgIC8vIG5vIGJyZWFrIGhlcmUsIGdvaW5nIHRvIHNldCBmb3J3YXJkIHByZWRpY3Rpb24KKyAgICBjYXNlICBBVl9QSUNUVVJFX1RZUEVfUDoKKyAgICAgICAgbGFzdCA9IChzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlICopcy0+bGFzdF9waWN0dXJlLmYtPmRhdGFbMF07CisgICAgICAgIGlmICghbGFzdCkgLy8gRklYTUU6IERvZXMgdGhpcyB0ZXN0IG1ha2Ugc2Vuc2U/CisgICAgICAgICAgICBsYXN0ID0gcmVuZGVyOyAvLyBwcmVkaWN0IHNlY29uZCBmaWVsZCBmcm9tIHRoZSBmaXJzdAorICAgICAgICByZW5kZXItPmluZm8udmMxLmZvcndhcmRfcmVmZXJlbmNlID0gbGFzdC0+c3VyZmFjZTsKKyAgICB9CisKKyAgICBmZl92ZHBhdV9hZGRfZGF0YV9jaHVuayhzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5kYXRhWzBdLCBidWYsIGJ1Zl9zaXplKTsKKworICAgIHJlbmRlci0+aW5mby52YzEuc2xpY2VfY291bnQgICAgICAgICAgPSAxOworCisgICAgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQocywgMCwgcy0+YXZjdHgtPmhlaWdodCk7CisgICAgcmVuZGVyLT5iaXRzdHJlYW1fYnVmZmVyc191c2VkICAgICAgICA9IDA7Cit9CisjZW5kaWYgLyogKENPTkZJR19WQzFfVkRQQVVfREVDT0RFUiAqLworCisjaWYgQ09ORklHX01QRUc0X1ZEUEFVX0RFQ09ERVIKK3ZvaWQgZmZfdmRwYXVfbXBlZzRfZGVjb2RlX3BpY3R1cmUoTXBlZzREZWNDb250ZXh0ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKKyAgICBzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlICpyZW5kZXIsICpsYXN0LCAqbmV4dDsKKyAgICBpbnQgaTsKKworICAgIGlmICghcy0+Y3VycmVudF9waWN0dXJlX3B0cikgcmV0dXJuOworCisgICAgcmVuZGVyID0gKHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKilzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5kYXRhWzBdOworICAgIGFzc2VydChyZW5kZXIpOworCisgICAgLyogZmlsbCBWZHBQaWN0dXJlSW5mb01QRUc0UGFydDIgc3RydWN0ICovCisgICAgcmVuZGVyLT5pbmZvLm1wZWc0LnRyZFswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPnBwX3RpbWU7CisgICAgcmVuZGVyLT5pbmZvLm1wZWc0LnRyYlswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPnBiX3RpbWU7CisgICAgcmVuZGVyLT5pbmZvLm1wZWc0LnRyZFsxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPnBwX2ZpZWxkX3RpbWUgPj4gMTsKKyAgICByZW5kZXItPmluZm8ubXBlZzQudHJiWzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cGJfZmllbGRfdGltZSA+PiAxOworICAgIHJlbmRlci0+aW5mby5tcGVnNC52b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiAgICAgPSBzLT5hdmN0eC0+dGltZV9iYXNlLmRlbjsKKyAgICByZW5kZXItPmluZm8ubXBlZzQudm9wX2NvZGluZ190eXBlICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICByZW5kZXItPmluZm8ubXBlZzQudm9wX2Zjb2RlX2ZvcndhcmQgICAgICAgICAgICAgICAgID0gcy0+Zl9jb2RlOworICAgIHJlbmRlci0+aW5mby5tcGVnNC52b3BfZmNvZGVfYmFja3dhcmQgICAgICAgICAgICAgICAgPSBzLT5iX2NvZGU7CisgICAgcmVuZGVyLT5pbmZvLm1wZWc0LnJlc3luY19tYXJrZXJfZGlzYWJsZSAgICAgICAgICAgICA9ICFjdHgtPnJlc3luY19tYXJrZXI7CisgICAgcmVuZGVyLT5pbmZvLm1wZWc0LmludGVybGFjZWQgICAgICAgICAgICAgICAgICAgICAgICA9ICFzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZTsKKyAgICByZW5kZXItPmluZm8ubXBlZzQucXVhbnRfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+bXBlZ19xdWFudDsKKyAgICByZW5kZXItPmluZm8ubXBlZzQucXVhcnRlcl9zYW1wbGUgICAgICAgICAgICAgICAgICAgID0gcy0+cXVhcnRlcl9zYW1wbGU7CisgICAgcmVuZGVyLT5pbmZvLm1wZWc0LnNob3J0X3ZpZGVvX2hlYWRlciAgICAgICAgICAgICAgICA9IHMtPmF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfSDI2MzsKKyAgICByZW5kZXItPmluZm8ubXBlZzQucm91bmRpbmdfY29udHJvbCAgICAgICAgICAgICAgICAgID0gcy0+bm9fcm91bmRpbmc7CisgICAgcmVuZGVyLT5pbmZvLm1wZWc0LmFsdGVybmF0ZV92ZXJ0aWNhbF9zY2FuX2ZsYWcgICAgICA9IHMtPmFsdGVybmF0ZV9zY2FuOworICAgIHJlbmRlci0+aW5mby5tcGVnNC50b3BfZmllbGRfZmlyc3QgICAgICAgICAgICAgICAgICAgPSBzLT50b3BfZmllbGRfZmlyc3Q7CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyArK2kpIHsKKyAgICAgICAgcmVuZGVyLT5pbmZvLm1wZWc0LmludHJhX3F1YW50aXplcl9tYXRyaXhbaV0gICAgID0gcy0+aW50cmFfbWF0cml4W2ldOworICAgICAgICByZW5kZXItPmluZm8ubXBlZzQubm9uX2ludHJhX3F1YW50aXplcl9tYXRyaXhbaV0gPSBzLT5pbnRlcl9tYXRyaXhbaV07CisgICAgfQorICAgIHJlbmRlci0+aW5mby5tcGVnNC5mb3J3YXJkX3JlZmVyZW5jZSAgICAgICAgICAgICAgICAgPSBWRFBfSU5WQUxJRF9IQU5ETEU7CisgICAgcmVuZGVyLT5pbmZvLm1wZWc0LmJhY2t3YXJkX3JlZmVyZW5jZSAgICAgICAgICAgICAgICA9IFZEUF9JTlZBTElEX0hBTkRMRTsKKworICAgIHN3aXRjaCAocy0+cGljdF90eXBlKSB7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfQjoKKyAgICAgICAgbmV4dCA9IChzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlICopcy0+bmV4dF9waWN0dXJlLmYtPmRhdGFbMF07CisgICAgICAgIGFzc2VydChuZXh0KTsKKyAgICAgICAgcmVuZGVyLT5pbmZvLm1wZWc0LmJhY2t3YXJkX3JlZmVyZW5jZSAgICAgPSBuZXh0LT5zdXJmYWNlOworICAgICAgICByZW5kZXItPmluZm8ubXBlZzQudm9wX2NvZGluZ190eXBlICAgICAgICA9IDI7CisgICAgICAgIC8vIG5vIGJyZWFrIGhlcmUsIGdvaW5nIHRvIHNldCBmb3J3YXJkIHByZWRpY3Rpb24KKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9QOgorICAgICAgICBsYXN0ID0gKHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKilzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVswXTsKKyAgICAgICAgYXNzZXJ0KGxhc3QpOworICAgICAgICByZW5kZXItPmluZm8ubXBlZzQuZm9yd2FyZF9yZWZlcmVuY2UgICAgICA9IGxhc3QtPnN1cmZhY2U7CisgICAgfQorCisgICAgZmZfdmRwYXVfYWRkX2RhdGFfY2h1bmsocy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVswXSwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICBmZl9tcGVnX2RyYXdfaG9yaXpfYmFuZChzLCAwLCBzLT5hdmN0eC0+aGVpZ2h0KTsKKyAgICByZW5kZXItPmJpdHN0cmVhbV9idWZmZXJzX3VzZWQgPSAwOworfQorI2VuZGlmIC8qIENPTkZJR19NUEVHNF9WRFBBVV9ERUNPREVSICovCisKK2ludCBhdl92ZHBhdV9nZXRfcHJvZmlsZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFZkcERlY29kZXJQcm9maWxlICpwcm9maWxlKQoreworI2RlZmluZSBQUk9GSUxFKHByb2YpICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKnByb2ZpbGUgPSBwcm9mOyAgICAgICAgXAorICAgIHJldHVybiAwOyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTzogICAgICAgICAgICAgICBQUk9GSUxFKFZEUF9ERUNPREVSX1BST0ZJTEVfTVBFRzEpOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzJWSURFTzoKKyAgICAgICAgc3dpdGNoIChhdmN0eC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfTVBFRzJfTUFJTjogICAgICAgICAgICBQUk9GSUxFKFZEUF9ERUNPREVSX1BST0ZJTEVfTVBFRzJfTUFJTik7CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9NUEVHMl9TSU1QTEU6ICAgICAgICAgIFBST0ZJTEUoVkRQX0RFQ09ERVJfUFJPRklMRV9NUEVHMl9TSU1QTEUpOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzOiAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEUoVkRQX0RFQ09ERVJfUFJPRklMRV9NUEVHNF9QQVJUMl9BU1ApOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzQ6CisgICAgICAgIHN3aXRjaCAoYXZjdHgtPnByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX01QRUc0X1NJTVBMRTogICAgICAgICAgUFJPRklMRShWRFBfREVDT0RFUl9QUk9GSUxFX01QRUc0X1BBUlQyX1NQKTsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX01QRUc0X0FEVkFOQ0VEX1NJTVBMRTogUFJPRklMRShWRFBfREVDT0RFUl9QUk9GSUxFX01QRUc0X1BBUlQyX0FTUCk7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjQ6CisgICAgICAgIHN3aXRjaCAoYXZjdHgtPnByb2ZpbGUgJiB+RkZfUFJPRklMRV9IMjY0X0lOVFJBKSB7CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0JBU0VMSU5FOiAgICAgICAgIFBST0ZJTEUoVkRQX0RFQ09ERVJfUFJPRklMRV9IMjY0X0JBU0VMSU5FKTsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfQ09OU1RSQUlORURfQkFTRUxJTkU6CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X01BSU46ICAgICAgICAgICAgIFBST0ZJTEUoVkRQX0RFQ09ERVJfUFJPRklMRV9IMjY0X01BSU4pOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIOiAgICAgICAgICAgICBQUk9GSUxFKFZEUF9ERUNPREVSX1BST0ZJTEVfSDI2NF9ISUdIKTsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIGNhc2UgQVZfQ09ERUNfSURfV01WMzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1ZDMToKKyAgICAgICAgc3dpdGNoIChhdmN0eC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfVkMxX1NJTVBMRTogICAgICAgICAgICBQUk9GSUxFKFZEUF9ERUNPREVSX1BST0ZJTEVfVkMxX1NJTVBMRSk7CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9WQzFfTUFJTjogICAgICAgICAgICAgIFBST0ZJTEUoVkRQX0RFQ09ERVJfUFJPRklMRV9WQzFfTUFJTik7CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9WQzFfQURWQU5DRUQ6ICAgICAgICAgIFBST0ZJTEUoVkRQX0RFQ09ERVJfUFJPRklMRV9WQzFfQURWQU5DRUQpOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKK0FWVkRQQVVDb250ZXh0ICphdl92ZHBhdV9hbGxvY19jb250ZXh0KHZvaWQpCit7CisgICAgcmV0dXJuIGF2X21hbGxvY3ooc2l6ZW9mKEFWVkRQQVVDb250ZXh0KSk7Cit9CisKK2ludCBhdl92ZHBhdV9iaW5kX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWZHBEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWZHBHZXRQcm9jQWRkcmVzcyAqZ2V0X3Byb2MsIHVuc2lnbmVkIGZsYWdzKQoreworICAgIFZEUEFVSFdDb250ZXh0ICpod2N0eDsKKworICAgIGlmIChmbGFncyAmIH5BVl9IV0FDQ0VMX0ZMQUdfSUdOT1JFX0xFVkVMKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKGF2X3JlYWxsb2NwKCZhdmN0eC0+aHdhY2NlbF9jb250ZXh0LCBzaXplb2YoKmh3Y3R4KSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBod2N0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisKKyAgICBtZW1zZXQoaHdjdHgsIDAsIHNpemVvZigqaHdjdHgpKTsKKyAgICBod2N0eC0+Y29udGV4dC5kZWNvZGVyICA9IFZEUF9JTlZBTElEX0hBTkRMRTsKKyAgICBod2N0eC0+ZGV2aWNlICAgICAgICAgICA9IGRldmljZTsKKyAgICBod2N0eC0+Z2V0X3Byb2NfYWRkcmVzcyA9IGdldF9wcm9jOworICAgIGh3Y3R4LT5mbGFncyAgICAgICAgICAgID0gZmxhZ3M7CisgICAgaHdjdHgtPnJlc2V0ICAgICAgICAgICAgPSAxOworICAgIHJldHVybiAwOworfQorCisvKiBAfSovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92ZHBhdS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmRwYXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDA2Nzc5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmRwYXUuaApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIFRoZSBWaWRlbyBEZWNvZGUgYW5kIFByZXNlbnRhdGlvbiBBUEkgZm9yIFVOSVggKFZEUEFVKSBpcyB1c2VkIGZvcgorICogaGFyZHdhcmUtYWNjZWxlcmF0ZWQgZGVjb2Rpbmcgb2YgTVBFRy0xLzIsIEguMjY0IGFuZCBWQy0xLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOVklESUEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZEUEFVX0gKKyNkZWZpbmUgQVZDT0RFQ19WRFBBVV9ICisKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdmNfY29kZWNfaHdhY2NlbF92ZHBhdQorICogUHVibGljIGxpYmF2Y29kZWMgVkRQQVUgaGVhZGVyLgorICovCisKKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2Y19jb2RlY19od2FjY2VsX3ZkcGF1IFZEUEFVIERlY29kZXIgYW5kIFJlbmRlcmVyCisgKiBAaW5ncm91cCBsYXZjX2NvZGVjX2h3YWNjZWwKKyAqCisgKiBWRFBBVSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaGFzIHR3byBtb2R1bGVzCisgKiAtIFZEUEFVIGRlY29kaW5nCisgKiAtIFZEUEFVIHByZXNlbnRhdGlvbgorICoKKyAqIFRoZSBWRFBBVSBkZWNvZGluZyBtb2R1bGUgcGFyc2VzIGFsbCBoZWFkZXJzIHVzaW5nIEZGbXBlZworICogcGFyc2luZyBtZWNoYW5pc21zIGFuZCB1c2VzIFZEUEFVIGZvciB0aGUgYWN0dWFsIGRlY29kaW5nLgorICoKKyAqIEFzIHBlciB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIGFjdHVhbCBkZWNvZGluZworICogYW5kIHJlbmRlcmluZyAoQVBJIGNhbGxzKSBhcmUgZG9uZSBhcyBwYXJ0IG9mIHRoZSBWRFBBVQorICogcHJlc2VudGF0aW9uICh2b192ZHBhdS5jKSBtb2R1bGUuCisgKgorICogQHsKKyAqLworCisjaW5jbHVkZSA8dmRwYXUvdmRwYXUuaD4KKyNpbmNsdWRlIDx2ZHBhdS92ZHBhdV94MTEuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2lmIEZGX0FQSV9CVUZTX1ZEUEFVCit1bmlvbiBBVlZEUEFVUGljdHVyZUluZm8geworICAgIFZkcFBpY3R1cmVJbmZvSDI2NCAgICAgICAgaDI2NDsKKyAgICBWZHBQaWN0dXJlSW5mb01QRUcxT3IyICAgIG1wZWc7CisgICAgVmRwUGljdHVyZUluZm9WQzEgICAgICAgICAgdmMxOworICAgIFZkcFBpY3R1cmVJbmZvTVBFRzRQYXJ0MiBtcGVnNDsKK307CisjZW5kaWYKKworc3RydWN0IEFWQ29kZWNDb250ZXh0Oworc3RydWN0IEFWRnJhbWU7CisKK3R5cGVkZWYgaW50ICgqQVZWRFBBVV9SZW5kZXIyKShzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKiwgc3RydWN0IEFWRnJhbWUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZHBQaWN0dXJlSW5mbyAqLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZHBCaXRzdHJlYW1CdWZmZXIgKik7CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGhlIGxpYmF2Y29kZWMgbGlicmFyeSBhbmQKKyAqIHRoZSBjbGllbnQgdmlkZW8gYXBwbGljYXRpb24uCisgKiBUaGUgdXNlciBzaGFsbCBhbGxvY2F0ZSB0aGUgc3RydWN0dXJlIHZpYSB0aGUgYXZfYWxsb2NfdmRwYXVfaHdhY2NlbAorICogZnVuY3Rpb24gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIGFzCisgKiBBVkNvZGVjQ29udGV4dC5od2FjY2VsX2NvbnRleHQuIE1lbWJlcnMgY2FuIGJlIHNldCBieSB0aGUgdXNlciBvbmNlCisgKiBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb3IgdGhyb3VnaCBlYWNoIEFWQ29kZWNDb250ZXh0LmdldF9idWZmZXIoKQorICogZnVuY3Rpb24gY2FsbC4gSW4gYW55IGNhc2UsIHRoZXkgbXVzdCBiZSB2YWxpZCBwcmlvciB0byBjYWxsaW5nCisgKiBkZWNvZGluZyBmdW5jdGlvbnMuCisgKgorICogVGhlIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgbm90IGEgcGFydCBvZiB0aGUgcHVibGljIEFCSSBhbmQgbXVzdCBub3QKKyAqIGJlIHVzZWQgb3V0c2lkZSBvZiBsaWJhdmNvZGVjLiBVc2UgYXZfdmRwYXVfYWxsb2NfY29udGV4dCgpIHRvIGFsbG9jYXRlIGFuCisgKiBBVlZEUEFVQ29udGV4dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZWRFBBVUNvbnRleHQgeworICAgIC8qKgorICAgICAqIFZEUEFVIGRlY29kZXIgaGFuZGxlCisgICAgICoKKyAgICAgKiBTZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBWZHBEZWNvZGVyIGRlY29kZXI7CisKKyAgICAvKioKKyAgICAgKiBWRFBBVSBkZWNvZGVyIHJlbmRlciBjYWxsYmFjaworICAgICAqCisgICAgICogU2V0IGJ5IHRoZSB1c2VyLgorICAgICAqLworICAgIFZkcERlY29kZXJSZW5kZXIgKnJlbmRlcjsKKworI2lmIEZGX0FQSV9CVUZTX1ZEUEFVCisgICAgLyoqCisgICAgICogVkRQQVUgcGljdHVyZSBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICogU2V0IGJ5IGxpYmF2Y29kZWMuCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICB1bmlvbiBBVlZEUEFVUGljdHVyZUluZm8gaW5mbzsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlZCBzaXplIG9mIHRoZSBiaXRzdHJlYW1fYnVmZmVycyB0YWJsZS4KKyAgICAgKgorICAgICAqIFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgaW50IGJpdHN0cmVhbV9idWZmZXJzX2FsbG9jYXRlZDsKKworICAgIC8qKgorICAgICAqIFVzZWZ1bCBiaXRzdHJlYW0gYnVmZmVycyBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlcnMgdGFibGUuCisgICAgICoKKyAgICAgKiBTZXQgYnkgbGliYXZjb2RlYy4KKyAgICAgKi8KKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorICAgIGludCBiaXRzdHJlYW1fYnVmZmVyc191c2VkOworCisgICAvKioKKyAgICAgKiBUYWJsZSBvZiBiaXRzdHJlYW0gYnVmZmVycy4KKyAgICAgKiBUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGlzIGJ1ZmZlciB1c2luZyBhdl9mcmVlcCgpLgorICAgICAqCisgICAgICogU2V0IGJ5IGxpYmF2Y29kZWMuCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICBWZHBCaXRzdHJlYW1CdWZmZXIgKmJpdHN0cmVhbV9idWZmZXJzOworI2VuZGlmCisgICAgQVZWRFBBVV9SZW5kZXIyIHJlbmRlcjI7Cit9IEFWVkRQQVVDb250ZXh0OworCisvKioKKyAqIEBicmllZiBhbGxvY2F0aW9uIGZ1bmN0aW9uIGZvciBBVlZEUEFVQ29udGV4dAorICoKKyAqIEFsbG93cyBleHRlbmRpbmcgdGhlIHN0cnVjdCB3aXRob3V0IGJyZWFraW5nIEFQSS9BQkkKKyAqLworQVZWRFBBVUNvbnRleHQgKmF2X2FsbG9jX3ZkcGF1Y29udGV4dCh2b2lkKTsKKworQVZWRFBBVV9SZW5kZXIyIGF2X3ZkcGF1X2h3YWNjZWxfZ2V0X3JlbmRlcjIoY29uc3QgQVZWRFBBVUNvbnRleHQgKik7Cit2b2lkIGF2X3ZkcGF1X2h3YWNjZWxfc2V0X3JlbmRlcjIoQVZWRFBBVUNvbnRleHQgKiwgQVZWRFBBVV9SZW5kZXIyKTsKKworLyoqCisgKiBBc3NvY2lhdGUgYSBWRFBBVSBkZXZpY2Ugd2l0aCBhIGNvZGVjIGNvbnRleHQgZm9yIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIGdldF9mb3JtYXQoKSBjb2RlYyBjYWxsYmFjaywKKyAqIG9yIGVhcmxpZXIuIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBhZnRlciBhdmNvZGVjX2ZsdXNoX2J1ZmZlcnMoKSB0byBjaGFuZ2UKKyAqIHRoZSB1bmRlcmx5aW5nIFZEUEFVIGRldmljZSBtaWQtc3RyZWFtIChlLmcuIHRvIHJlY292ZXIgZnJvbSBub24tdHJhbnNwYXJlbnQKKyAqIGRpc3BsYXkgcHJlZW1wdGlvbikuCisgKgorICogQG5vdGUgZ2V0X2Zvcm1hdCgpIG11c3QgcmV0dXJuIEFWX1BJWF9GTVRfVkRQQVUgaWYgdGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMKKyAqIHN1Y2Nlc3NmdWxseS4KKyAqCisgKiBAcGFyYW0gYXZjdHggZGVjb2RpbmcgY29udGV4dCB3aG9zZSBnZXRfZm9ybWF0KCkgY2FsbGJhY2sgaXMgaW52b2tlZAorICogQHBhcmFtIGRldmljZSBWRFBBVSBkZXZpY2UgaGFuZGxlIHRvIHVzZSBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0aW9uCisgKiBAcGFyYW0gZ2V0X3Byb2NfYWRkcmVzcyBWRFBBVSBkZXZpY2UgZHJpdmVyCisgKiBAcGFyYW0gZmxhZ3MgemVybyBvZiBtb3JlIE9SJ2QgQVZfSFdBQ0NFTF9GTEFHXyogZmxhZ3MKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYW4gQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBhdl92ZHBhdV9iaW5kX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWZHBEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWZHBHZXRQcm9jQWRkcmVzcyAqZ2V0X3Byb2NfYWRkcmVzcywgdW5zaWduZWQgZmxhZ3MpOworCisvKioKKyAqIEFsbG9jYXRlIGFuIEFWVkRQQVVDb250ZXh0LgorICoKKyAqIEByZXR1cm4gTmV3bHktYWxsb2NhdGVkIEFWVkRQQVVDb250ZXh0IG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqLworQVZWRFBBVUNvbnRleHQgKmF2X3ZkcGF1X2FsbG9jX2NvbnRleHQodm9pZCk7CisKKy8qKgorICogR2V0IGEgZGVjb2RlciBwcm9maWxlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGluaXRpYWxpemluZyBhIFZEUEFVIGRlY29kZXIuCisgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIEFWQ29kZWNDb250ZXh0LmdldF9mb3JtYXQoKSBjYWxsYmFjay4KKyAqCisgKiBAcGFyYW0gYXZjdHggdGhlIGNvZGVjIGNvbnRleHQgYmVpbmcgdXNlZCBmb3IgZGVjb2RpbmcgdGhlIHN0cmVhbQorICogQHBhcmFtIHByb2ZpbGUgYSBwb2ludGVyIGludG8gd2hpY2ggdGhlIHJlc3VsdCB3aWxsIGJlIHdyaXR0ZW4gb24gc3VjY2Vzcy4KKyAqICAgICAgICAgICAgICAgIFRoZSBjb250ZW50cyBvZiBwcm9maWxlIGFyZSB1bmRlZmluZWQgaWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKiAgICAgICAgICAgICAgICBhbiBlcnJvci4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcyAobm9uLW5lZ2F0aXZlKSwgYSBuZWdhdGl2ZSBBVkVSUk9SIG9uIGZhaWx1cmUuCisgKi8KK2ludCBhdl92ZHBhdV9nZXRfcHJvZmlsZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFZkcERlY29kZXJQcm9maWxlICpwcm9maWxlKTsKKworI2lmIEZGX0FQSV9DQVBfVkRQQVUKKy8qKiBAYnJpZWYgVGhlIHZpZGVvU3VyZmFjZSBpcyB1c2VkIGZvciByZW5kZXJpbmcuICovCisjZGVmaW5lIEZGX1ZEUEFVX1NUQVRFX1VTRURfRk9SX1JFTkRFUiAxCisKKy8qKgorICogQGJyaWVmIFRoZSB2aWRlb1N1cmZhY2UgaXMgbmVlZGVkIGZvciByZWZlcmVuY2UvcHJlZGljdGlvbi4KKyAqIFRoZSBjb2RlYyBtYW5pcHVsYXRlcyB0aGlzLgorICovCisjZGVmaW5lIEZGX1ZEUEFVX1NUQVRFX1VTRURfRk9SX1JFRkVSRU5DRSAyCisKKy8qKgorICogQGJyaWVmIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYXMgYSBjYWxsYmFjayBiZXR3ZWVuIHRoZSBGRm1wZWcKKyAqIGRlY29kZXIgKHZkXykgYW5kIHByZXNlbnRhdGlvbiAodm9fKSBtb2R1bGUuCisgKiBUaGlzIGlzIHVzZWQgZm9yIGRlZmluaW5nIGEgdmlkZW8gZnJhbWUgY29udGFpbmluZyBzdXJmYWNlLAorICogcGljdHVyZSBwYXJhbWV0ZXIsIGJpdHN0cmVhbSBpbmZvcm1hdGlvbiBldGMgd2hpY2ggYXJlIHBhc3NlZAorICogYmV0d2VlbiB0aGUgRkZtcGVnIGRlY29kZXIgYW5kIGl0cyBjbGllbnRzLgorICovCitzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlIHsKKyAgICBWZHBWaWRlb1N1cmZhY2Ugc3VyZmFjZTsgLy8vPCBVc2VkIGFzIHJlbmRlcmVkIHN1cmZhY2UsIG5ldmVyIGNoYW5nZWQuCisKKyAgICBpbnQgc3RhdGU7IC8vLzwgSG9sZHMgRkZfVkRQQVVfU1RBVEVfKiB2YWx1ZXMuCisKKyNpZiBBVl9IQVZFX0lOQ09NUEFUSUJMRV9MSUJBVl9BQkkKKyAgICAvKiogcGljdHVyZSBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gZm9yIGFsbCBzdXBwb3J0ZWQgY29kZWNzICovCisgICAgdW5pb24gQVZWRFBBVVBpY3R1cmVJbmZvIGluZm87CisjZW5kaWYKKworICAgIC8qKiBEZXNjcmliZSBzaXplL2xvY2F0aW9uIG9mIHRoZSBjb21wcmVzc2VkIHZpZGVvIGRhdGEuCisgICAgICAgIFNldCB0byAwIHdoZW4gZnJlZWluZyBiaXRzdHJlYW1fYnVmZmVycy4gKi8KKyAgICBpbnQgYml0c3RyZWFtX2J1ZmZlcnNfYWxsb2NhdGVkOworICAgIGludCBiaXRzdHJlYW1fYnVmZmVyc191c2VkOworICAgIC8qKiBUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGlzIGJ1ZmZlciB1c2luZyBhdl9mcmVlcCgpLiAqLworICAgIFZkcEJpdHN0cmVhbUJ1ZmZlciAqYml0c3RyZWFtX2J1ZmZlcnM7CisKKyNpZiAhQVZfSEFWRV9JTkNPTVBBVElCTEVfTElCQVZfQUJJCisgICAgLyoqIHBpY3R1cmUgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGZvciBhbGwgc3VwcG9ydGVkIGNvZGVjcyAqLworICAgIHVuaW9uIEFWVkRQQVVQaWN0dXJlSW5mbyBpbmZvOworI2VuZGlmCit9OworI2VuZGlmCisKKy8qIEB9Ki8KKworI2VuZGlmIC8qIEFWQ09ERUNfVkRQQVVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmRwYXVfaDI2NC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmRwYXVfaDI2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzA3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92ZHBhdV9oMjY0LmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBNUEVHLTQgUGFydCAxMCAvIEFWQyAvIEguMjY0IEhXIGRlY29kZSBhY2NlbGVyYXRpb24gdGhyb3VnaCBWRFBBVQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBOVklESUEKKyAqIENvcHlyaWdodCAoYykgMjAxMyBSw6ltaSBEZW5pcy1Db3VybW9udAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8dmRwYXUvdmRwYXUuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJ2ZHBhdS5oIgorI2luY2x1ZGUgInZkcGF1X2ludGVybmFsLmgiCisKK3N0YXRpYyBpbnQzMl90IGgyNjRfZm9jKGludCBmb2MpCit7CisgICAgaWYgKGZvYyA9PSBJTlRfTUFYKQorICAgICAgICBmb2MgPSAwOworICAgIHJldHVybiBmb2M7Cit9CisKK3N0YXRpYyB2b2lkIHZkcGF1X2gyNjRfY2xlYXJfcmYoVmRwUmVmZXJlbmNlRnJhbWVIMjY0ICpyZikKK3sKKyAgICByZi0+c3VyZmFjZSAgICAgICAgICAgICA9IFZEUF9JTlZBTElEX0hBTkRMRTsKKyAgICByZi0+aXNfbG9uZ190ZXJtICAgICAgICA9IFZEUF9GQUxTRTsKKyAgICByZi0+dG9wX2lzX3JlZmVyZW5jZSAgICA9IFZEUF9GQUxTRTsKKyAgICByZi0+Ym90dG9tX2lzX3JlZmVyZW5jZSA9IFZEUF9GQUxTRTsKKyAgICByZi0+ZmllbGRfb3JkZXJfY250WzBdICA9IDA7CisgICAgcmYtPmZpZWxkX29yZGVyX2NudFsxXSAgPSAwOworICAgIHJmLT5mcmFtZV9pZHggICAgICAgICAgID0gMDsKK30KKworc3RhdGljIHZvaWQgdmRwYXVfaDI2NF9zZXRfcmYoVmRwUmVmZXJlbmNlRnJhbWVIMjY0ICpyZiwgSDI2NFBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWNfc3RydWN0dXJlKQoreworICAgIFZkcFZpZGVvU3VyZmFjZSBzdXJmYWNlID0gZmZfdmRwYXVfZ2V0X3N1cmZhY2VfaWQoJnBpYy0+Zik7CisKKyAgICBpZiAocGljX3N0cnVjdHVyZSA9PSAwKQorICAgICAgICBwaWNfc3RydWN0dXJlID0gcGljLT5yZWZlcmVuY2U7CisKKyAgICByZi0+c3VyZmFjZSAgICAgICAgICAgICA9IHN1cmZhY2U7CisgICAgcmYtPmlzX2xvbmdfdGVybSAgICAgICAgPSBwaWMtPnJlZmVyZW5jZSAmJiBwaWMtPmxvbmdfcmVmOworICAgIHJmLT50b3BfaXNfcmVmZXJlbmNlICAgID0gKHBpY19zdHJ1Y3R1cmUgJiBQSUNUX1RPUF9GSUVMRCkgICAgIT0gMDsKKyAgICByZi0+Ym90dG9tX2lzX3JlZmVyZW5jZSA9IChwaWNfc3RydWN0dXJlICYgUElDVF9CT1RUT01fRklFTEQpICE9IDA7CisgICAgcmYtPmZpZWxkX29yZGVyX2NudFswXSAgPSBoMjY0X2ZvYyhwaWMtPmZpZWxkX3BvY1swXSk7CisgICAgcmYtPmZpZWxkX29yZGVyX2NudFsxXSAgPSBoMjY0X2ZvYyhwaWMtPmZpZWxkX3BvY1sxXSk7CisgICAgcmYtPmZyYW1lX2lkeCAgICAgICAgICAgPSBwaWMtPmxvbmdfcmVmID8gcGljLT5waWNfaWQgOiBwaWMtPmZyYW1lX251bTsKK30KKworc3RhdGljIHZvaWQgdmRwYXVfaDI2NF9zZXRfcmVmZXJlbmNlX2ZyYW1lcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSDI2NENvbnRleHQgKiBjb25zdCBoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0ICpwaWNfY3R4ID0gaC0+Y3VyX3BpY19wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIFZkcFBpY3R1cmVJbmZvSDI2NCAqaW5mbyA9ICZwaWNfY3R4LT5pbmZvLmgyNjQ7CisgICAgaW50IGxpc3Q7CisKKyAgICBWZHBSZWZlcmVuY2VGcmFtZUgyNjQgKnJmID0gJmluZm8tPnJlZmVyZW5jZUZyYW1lc1swXTsKKyNkZWZpbmUgSDI2NF9SRl9DT1VOVCBGRl9BUlJBWV9FTEVNUyhpbmZvLT5yZWZlcmVuY2VGcmFtZXMpCisKKyAgICBmb3IgKGxpc3QgPSAwOyBsaXN0IDwgMjsgKytsaXN0KSB7CisgICAgICAgIEgyNjRQaWN0dXJlICoqbHAgPSBsaXN0ID8gaC0+bG9uZ19yZWYgOiBoLT5zaG9ydF9yZWY7CisgICAgICAgIGludCBpLCBscyAgICA9IGxpc3QgPyAxNiAgICAgICAgICA6IGgtPnNob3J0X3JlZl9jb3VudDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbHM7ICsraSkgeworICAgICAgICAgICAgSDI2NFBpY3R1cmUgKnBpYyA9IGxwW2ldOworICAgICAgICAgICAgVmRwUmVmZXJlbmNlRnJhbWVIMjY0ICpyZjI7CisgICAgICAgICAgICBWZHBWaWRlb1N1cmZhY2Ugc3VyZmFjZV9yZWY7CisgICAgICAgICAgICBpbnQgcGljX2ZyYW1lX2lkeDsKKworICAgICAgICAgICAgaWYgKCFwaWMgfHwgIXBpYy0+cmVmZXJlbmNlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcGljX2ZyYW1lX2lkeCA9IHBpYy0+bG9uZ19yZWYgPyBwaWMtPnBpY19pZCA6IHBpYy0+ZnJhbWVfbnVtOworICAgICAgICAgICAgc3VyZmFjZV9yZWYgPSBmZl92ZHBhdV9nZXRfc3VyZmFjZV9pZCgmcGljLT5mKTsKKworICAgICAgICAgICAgcmYyID0gJmluZm8tPnJlZmVyZW5jZUZyYW1lc1swXTsKKyAgICAgICAgICAgIHdoaWxlIChyZjIgIT0gcmYpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJmMi0+c3VyZmFjZSAgICAgID09IHN1cmZhY2VfcmVmKSAgICYmCisgICAgICAgICAgICAgICAgICAgIChyZjItPmlzX2xvbmdfdGVybSA9PSBwaWMtPmxvbmdfcmVmKSAmJgorICAgICAgICAgICAgICAgICAgICAocmYyLT5mcmFtZV9pZHggICAgPT0gcGljX2ZyYW1lX2lkeCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICsrcmYyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJmMiAhPSByZikgeworICAgICAgICAgICAgICAgIHJmMi0+dG9wX2lzX3JlZmVyZW5jZSAgICB8PSAocGljLT5yZWZlcmVuY2UgJiBQSUNUX1RPUF9GSUVMRCkgICAgPyBWRFBfVFJVRSA6IFZEUF9GQUxTRTsKKyAgICAgICAgICAgICAgICByZjItPmJvdHRvbV9pc19yZWZlcmVuY2UgfD0gKHBpYy0+cmVmZXJlbmNlICYgUElDVF9CT1RUT01fRklFTEQpID8gVkRQX1RSVUUgOiBWRFBfRkFMU0U7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZiA+PSAmaW5mby0+cmVmZXJlbmNlRnJhbWVzW0gyNjRfUkZfQ09VTlRdKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICB2ZHBhdV9oMjY0X3NldF9yZihyZiwgcGljLCBwaWMtPnJlZmVyZW5jZSk7CisgICAgICAgICAgICArK3JmOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICg7IHJmIDwgJmluZm8tPnJlZmVyZW5jZUZyYW1lc1tIMjY0X1JGX0NPVU5UXTsgKytyZikKKyAgICAgICAgdmRwYXVfaDI2NF9jbGVhcl9yZihyZik7Cit9CisKK3N0YXRpYyBpbnQgdmRwYXVfaDI2NF9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQoreworICAgIEgyNjRDb250ZXh0ICogY29uc3QgaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgSDI2NFBpY3R1cmUgKnBpYyA9IGgtPmN1cl9waWNfcHRyOworICAgIHN0cnVjdCB2ZHBhdV9waWN0dXJlX2NvbnRleHQgKnBpY19jdHggPSBwaWMtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIFZkcFBpY3R1cmVJbmZvSDI2NCAqaW5mbyA9ICZwaWNfY3R4LT5pbmZvLmgyNjQ7CisKKyAgICAvKiBpbml0IFZkcFBpY3R1cmVJbmZvSDI2NCAqLworICAgIGluZm8tPnNsaWNlX2NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBpbmZvLT5maWVsZF9vcmRlcl9jbnRbMF0gICAgICAgICAgICAgICAgICAgICA9IGgyNjRfZm9jKHBpYy0+ZmllbGRfcG9jWzBdKTsKKyAgICBpbmZvLT5maWVsZF9vcmRlcl9jbnRbMV0gICAgICAgICAgICAgICAgICAgICA9IGgyNjRfZm9jKHBpYy0+ZmllbGRfcG9jWzFdKTsKKyAgICBpbmZvLT5pc19yZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPm5hbF9yZWZfaWRjICE9IDA7CisgICAgaW5mby0+ZnJhbWVfbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5mcmFtZV9udW07CisgICAgaW5mby0+ZmllbGRfcGljX2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FOworICAgIGluZm8tPmJvdHRvbV9maWVsZF9mbGFnICAgICAgICAgICAgICAgICAgICAgID0gaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQ7CisgICAgaW5mby0+bnVtX3JlZl9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5zcHMucmVmX2ZyYW1lX2NvdW50OworICAgIGluZm8tPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgICAgICAgICAgID0gaC0+c3BzLm1iX2FmZiAmJiAhaW5mby0+ZmllbGRfcGljX2ZsYWc7CisgICAgaW5mby0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnICAgICAgICAgICAgPSBoLT5wcHMuY29uc3RyYWluZWRfaW50cmFfcHJlZDsKKyAgICBpbmZvLT53ZWlnaHRlZF9wcmVkX2ZsYWcgICAgICAgICAgICAgICAgICAgICA9IGgtPnBwcy53ZWlnaHRlZF9wcmVkOworICAgIGluZm8tPndlaWdodGVkX2JpcHJlZF9pZGMgICAgICAgICAgICAgICAgICAgID0gaC0+cHBzLndlaWdodGVkX2JpcHJlZF9pZGM7CisgICAgaW5mby0+ZnJhbWVfbWJzX29ubHlfZmxhZyAgICAgICAgICAgICAgICAgICAgPSBoLT5zcHMuZnJhbWVfbWJzX29ubHlfZmxhZzsKKyAgICBpbmZvLT50cmFuc2Zvcm1fOHg4X21vZGVfZmxhZyAgICAgICAgICAgICAgICA9IGgtPnBwcy50cmFuc2Zvcm1fOHg4X21vZGU7CisgICAgaW5mby0+Y2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgICAgICAgICAgPSBoLT5wcHMuY2hyb21hX3FwX2luZGV4X29mZnNldFswXTsKKyAgICBpbmZvLT5zZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgICA9IGgtPnBwcy5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzFdOworICAgIGluZm8tPnBpY19pbml0X3FwX21pbnVzMjYgICAgICAgICAgICAgICAgICAgID0gaC0+cHBzLmluaXRfcXAgLSAyNjsKKyAgICBpbmZvLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICAgICAgICAgICA9IGgtPnBwcy5yZWZfY291bnRbMF0gLSAxOworICAgIGluZm8tPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgICAgICAgICAgID0gaC0+cHBzLnJlZl9jb3VudFsxXSAtIDE7CisgICAgaW5mby0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCAgICAgICAgICAgICAgPSBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtIC0gNDsKKyAgICBpbmZvLT5waWNfb3JkZXJfY250X3R5cGUgICAgICAgICAgICAgICAgICAgICA9IGgtPnNwcy5wb2NfdHlwZTsKKyAgICBpbmZvLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgICAgICA9IGgtPnNwcy5wb2NfdHlwZSA/IDAgOiBoLT5zcHMubG9nMl9tYXhfcG9jX2xzYiAtIDQ7CisgICAgaW5mby0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgICAgICAgPSBoLT5zcHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7CisgICAgaW5mby0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyAgICAgICAgICAgICAgPSBoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKKyAgICBpbmZvLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgICAgICAgICAgICAgICA9IGgtPnBwcy5jYWJhYzsKKyAgICBpbmZvLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnICAgICAgICAgICAgICAgICA9IGgtPnBwcy5waWNfb3JkZXJfcHJlc2VudDsKKyAgICBpbmZvLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IGgtPnBwcy5kZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQ7CisgICAgaW5mby0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnICAgICAgICAgPSBoLT5wcHMucmVkdW5kYW50X3BpY19jbnRfcHJlc2VudDsKKworICAgIG1lbWNweShpbmZvLT5zY2FsaW5nX2xpc3RzXzR4NCwgaC0+cHBzLnNjYWxpbmdfbWF0cml4NCwKKyAgICAgICAgICAgc2l6ZW9mKGluZm8tPnNjYWxpbmdfbGlzdHNfNHg0KSk7CisgICAgbWVtY3B5KGluZm8tPnNjYWxpbmdfbGlzdHNfOHg4WzBdLCBoLT5wcHMuc2NhbGluZ19tYXRyaXg4WzBdLAorICAgICAgICAgICBzaXplb2YoaW5mby0+c2NhbGluZ19saXN0c184eDhbMF0pKTsKKyAgICBtZW1jcHkoaW5mby0+c2NhbGluZ19saXN0c184eDhbMV0sIGgtPnBwcy5zY2FsaW5nX21hdHJpeDhbM10sCisgICAgICAgICAgIHNpemVvZihpbmZvLT5zY2FsaW5nX2xpc3RzXzh4OFsxXSkpOworCisgICAgdmRwYXVfaDI2NF9zZXRfcmVmZXJlbmNlX2ZyYW1lcyhhdmN0eCk7CisKKyAgICByZXR1cm4gZmZfdmRwYXVfY29tbW9uX3N0YXJ0X2ZyYW1lKHBpY19jdHgsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHN0YXJ0X2NvZGVfcHJlZml4WzNdID0geyAweDAwLCAweDAwLCAweDAxIH07CisKK3N0YXRpYyBpbnQgdmRwYXVfaDI2NF9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IHNpemUpCit7CisgICAgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEgyNjRQaWN0dXJlICpwaWMgPSBoLT5jdXJfcGljX3B0cjsKKyAgICBzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0ICpwaWNfY3R4ID0gcGljLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKyAgICBpbnQgdmFsOworCisgICAgdmFsID0gZmZfdmRwYXVfYWRkX2J1ZmZlcihwaWNfY3R4LCBzdGFydF9jb2RlX3ByZWZpeCwgMyk7CisgICAgaWYgKHZhbCkKKyAgICAgICAgcmV0dXJuIHZhbDsKKworICAgIHZhbCA9IGZmX3ZkcGF1X2FkZF9idWZmZXIocGljX2N0eCwgYnVmZmVyLCBzaXplKTsKKyAgICBpZiAodmFsKQorICAgICAgICByZXR1cm4gdmFsOworCisgICAgcGljX2N0eC0+aW5mby5oMjY0LnNsaWNlX2NvdW50Kys7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmRwYXVfaDI2NF9lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEgyNjRDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBIMjY0UGljdHVyZSAqcGljID0gaC0+Y3VyX3BpY19wdHI7CisgICAgc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCAqcGljX2N0eCA9IHBpYy0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgaW50IHZhbDsKKworICAgIHZhbCA9IGZmX3ZkcGF1X2NvbW1vbl9lbmRfZnJhbWUoYXZjdHgsICZwaWMtPmYsIHBpY19jdHgpOworICAgIGlmICh2YWwgPCAwKQorICAgICAgICByZXR1cm4gdmFsOworCisgICAgZmZfaDI2NF9kcmF3X2hvcml6X2JhbmQoaCwgMCwgaC0+YXZjdHgtPmhlaWdodCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmRwYXVfaDI2NF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWZHBEZWNvZGVyUHJvZmlsZSBwcm9maWxlOworICAgIHVpbnQzMl90IGxldmVsID0gYXZjdHgtPmxldmVsOworCisgICAgc3dpdGNoIChhdmN0eC0+cHJvZmlsZSAmIH5GRl9QUk9GSUxFX0gyNjRfSU5UUkEpIHsKKyAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9CQVNFTElORToKKyAgICAgICAgcHJvZmlsZSA9IFZEUF9ERUNPREVSX1BST0ZJTEVfSDI2NF9CQVNFTElORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfQ09OU1RSQUlORURfQkFTRUxJTkU6CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfTUFJTjoKKyAgICAgICAgcHJvZmlsZSA9IFZEUF9ERUNPREVSX1BST0ZJTEVfSDI2NF9NQUlOOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIOgorICAgICAgICBwcm9maWxlID0gVkRQX0RFQ09ERVJfUFJPRklMRV9IMjY0X0hJR0g7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1RTVVApOworICAgIH0KKworICAgIGlmICgoYXZjdHgtPnByb2ZpbGUgJiBGRl9QUk9GSUxFX0gyNjRfSU5UUkEpICYmIGF2Y3R4LT5sZXZlbCA9PSAxMSkKKyAgICAgICAgbGV2ZWwgPSBWRFBfREVDT0RFUl9MRVZFTF9IMjY0XzFiOworCisgICAgcmV0dXJuIGZmX3ZkcGF1X2NvbW1vbl9pbml0KGF2Y3R4LCBwcm9maWxlLCBsZXZlbCk7Cit9CisKK0FWSFdBY2NlbCBmZl9oMjY0X3ZkcGF1X2h3YWNjZWwgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImgyNjRfdmRwYXUiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAorICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfVkRQQVUsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gdmRwYXVfaDI2NF9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSB2ZHBhdV9oMjY0X2VuZF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSB2ZHBhdV9oMjY0X2RlY29kZV9zbGljZSwKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdmRwYXVfaDI2NF9pbml0LAorICAgIC51bmluaXQgICAgICAgICA9IGZmX3ZkcGF1X2NvbW1vbl91bmluaXQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZEUEFVQ29udGV4dCksCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmRwYXVfaW50ZXJuYWwuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZkcGF1X2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlYTQzMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZkcGF1X2ludGVybmFsLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBWaWRlbyBEZWNvZGUgYW5kIFByZXNlbnRhdGlvbiBBUEkgZm9yIFVOSVggKFZEUEFVKSBpcyB1c2VkIGZvcgorICogSFcgZGVjb2RlIGFjY2VsZXJhdGlvbiBmb3IgTVBFRy0xLzIsIEguMjY0IGFuZCBWQy0xLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOVklESUEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZEUEFVX0lOVEVSTkFMX0gKKyNkZWZpbmUgQVZDT0RFQ19WRFBBVV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZiBDT05GSUdfVkRQQVUKKyNpbmNsdWRlIDx2ZHBhdS92ZHBhdS5oPgorI2VuZGlmCisjaW5jbHVkZSAiaDI2NC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKy8qKiBFeHRyYWN0IFZkcFZpZGVvU3VyZmFjZSBmcm9tIGFuIEFWRnJhbWUgKi8KK3N0YXRpYyBpbmxpbmUgdWludHB0cl90IGZmX3ZkcGF1X2dldF9zdXJmYWNlX2lkKEFWRnJhbWUgKnBpYykKK3sKKyAgICByZXR1cm4gKHVpbnRwdHJfdClwaWMtPmRhdGFbM107Cit9CisKK3N0cnVjdCB2ZHBhdV9waWN0dXJlX2NvbnRleHQ7CisjaWYgQ09ORklHX1ZEUEFVCisjaWYgIUZGX0FQSV9CVUZTX1ZEUEFVCit1bmlvbiBBVlZEUEFVUGljdHVyZUluZm8geworICAgIFZkcFBpY3R1cmVJbmZvSDI2NCAgICAgICAgaDI2NDsKKyAgICBWZHBQaWN0dXJlSW5mb01QRUcxT3IyICAgIG1wZWc7CisgICAgVmRwUGljdHVyZUluZm9WQzEgICAgICAgICAgdmMxOworICAgIFZkcFBpY3R1cmVJbmZvTVBFRzRQYXJ0MiBtcGVnNDsKK307CisjZWxzZQorI2luY2x1ZGUgInZkcGF1LmgiCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgVkRQQVVIV0NvbnRleHQgeworICAgIEFWVkRQQVVDb250ZXh0IGNvbnRleHQ7CisgICAgVmRwRGV2aWNlIGRldmljZTsKKyAgICBWZHBHZXRQcm9jQWRkcmVzcyAqZ2V0X3Byb2NfYWRkcmVzczsKKyAgICBjaGFyIHJlc2V0OworICAgIHVuc2lnbmVkIGNoYXIgZmxhZ3M7Cit9IFZEUEFVSFdDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBWRFBBVUNvbnRleHQgeworICAgIC8qKgorICAgICAqIFZEUEFVIGRldmljZSBoYW5kbGUKKyAgICAgKi8KKyAgICBWZHBEZXZpY2UgZGV2aWNlOworCisgICAgLyoqCisgICAgICogVkRQQVUgZGVjb2RlciBoYW5kbGUKKyAgICAgKi8KKyAgICBWZHBEZWNvZGVyIGRlY29kZXI7CisKKyAgICAvKioKKyAgICAgKiBWRFBBVSBkZXZpY2UgZHJpdmVyCisgICAgICovCisgICAgVmRwR2V0UHJvY0FkZHJlc3MgKmdldF9wcm9jX2FkZHJlc3M7CisKKyAgICAvKioKKyAgICAgKiBWRFBBVSBkZWNvZGVyIHJlbmRlciBjYWxsYmFjaworICAgICAqLworICAgIFZkcERlY29kZXJSZW5kZXIgKnJlbmRlcjsKKworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKK30gVkRQQVVDb250ZXh0OworCitzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBWRFBBVSBwaWN0dXJlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHVuaW9uIEFWVkRQQVVQaWN0dXJlSW5mbyBpbmZvOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVkIHNpemUgb2YgdGhlIGJpdHN0cmVhbV9idWZmZXJzIHRhYmxlLgorICAgICAqLworICAgIGludCBiaXRzdHJlYW1fYnVmZmVyc19hbGxvY2F0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBVc2VmdWwgYml0c3RyZWFtIGJ1ZmZlcnMgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXJzIHRhYmxlLgorICAgICAqLworICAgIGludCBiaXRzdHJlYW1fYnVmZmVyc191c2VkOworCisgICAvKioKKyAgICAgKiBUYWJsZSBvZiBiaXRzdHJlYW0gYnVmZmVycy4KKyAgICAgKi8KKyAgICBWZHBCaXRzdHJlYW1CdWZmZXIgKmJpdHN0cmVhbV9idWZmZXJzOworfTsKKworaW50IGZmX3ZkcGF1X2NvbW1vbl9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVmRwRGVjb2RlclByb2ZpbGUgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpOworI2VuZGlmIC8vQ09ORklHX1ZEUEFVCisKK2ludCBmZl92ZHBhdV9jb21tb25fdW5pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK2ludCBmZl92ZHBhdV9jb21tb25fc3RhcnRfZnJhbWUoc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IHNpemUpOworaW50IGZmX3ZkcGF1X2NvbW1vbl9lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2ZHBhdV9waWN0dXJlX2NvbnRleHQgKnBpYyk7CitpbnQgZmZfdmRwYXVfbXBlZ19lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK2ludCBmZl92ZHBhdV9hZGRfYnVmZmVyKHN0cnVjdCB2ZHBhdV9waWN0dXJlX2NvbnRleHQgKnBpYywgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX3NpemUpOworCisKK3ZvaWQgZmZfdmRwYXVfYWRkX2RhdGFfY2h1bmsodWludDhfdCAqZGF0YSwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUpOworCit2b2lkIGZmX3ZkcGF1X21wZWdfcGljdHVyZV9jb21wbGV0ZShNcGVnRW5jQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplLCBpbnQgc2xpY2VfY291bnQpOworCit2b2lkIGZmX3ZkcGF1X2gyNjRfcGljdHVyZV9zdGFydChIMjY0Q29udGV4dCAqaCk7Cit2b2lkIGZmX3ZkcGF1X2gyNjRfc2V0X3JlZmVyZW5jZV9mcmFtZXMoSDI2NENvbnRleHQgKmgpOwordm9pZCBmZl92ZHBhdV9oMjY0X3BpY3R1cmVfY29tcGxldGUoSDI2NENvbnRleHQgKmgpOworCit2b2lkIGZmX3ZkcGF1X3ZjMV9kZWNvZGVfcGljdHVyZShNcGVnRW5jQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKTsKKwordm9pZCBmZl92ZHBhdV9tcGVnNF9kZWNvZGVfcGljdHVyZShNcGVnNERlY0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVkRQQVVfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmRwYXVfbXBlZzEyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92ZHBhdV9tcGVnMTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDdlNTBlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmRwYXVfbXBlZzEyLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBNUEVHLTEvMiBIVyBkZWNvZGUgYWNjZWxlcmF0aW9uIHRocm91Z2ggVkRQQVUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTlZJRElBCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUsOpbWkgRGVuaXMtQ291cm1vbnQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHZkcGF1L3ZkcGF1Lmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAidmRwYXUuaCIKKyNpbmNsdWRlICJ2ZHBhdV9pbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IHZkcGF1X21wZWdfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFBpY3R1cmUgKnBpYyAgICAgICAgICAgICA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHI7CisgICAgc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCAqcGljX2N0eCA9IHBpYy0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgVmRwUGljdHVyZUluZm9NUEVHMU9yMiAqaW5mbyA9ICZwaWNfY3R4LT5pbmZvLm1wZWc7CisgICAgVmRwVmlkZW9TdXJmYWNlIHJlZjsKKyAgICBpbnQgaTsKKworICAgIC8qIGZpbGwgVmRwUGljdHVyZUluZm9NUEVHMU9yMiBzdHJ1Y3QgKi8KKyAgICBpbmZvLT5mb3J3YXJkX3JlZmVyZW5jZSAgPSBWRFBfSU5WQUxJRF9IQU5ETEU7CisgICAgaW5mby0+YmFja3dhcmRfcmVmZXJlbmNlID0gVkRQX0lOVkFMSURfSEFORExFOworCisgICAgc3dpdGNoIChzLT5waWN0X3R5cGUpIHsKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9COgorICAgICAgICByZWYgPSBmZl92ZHBhdV9nZXRfc3VyZmFjZV9pZChzLT5uZXh0X3BpY3R1cmUuZik7CisgICAgICAgIGFzc2VydChyZWYgIT0gVkRQX0lOVkFMSURfSEFORExFKTsKKyAgICAgICAgaW5mby0+YmFja3dhcmRfcmVmZXJlbmNlID0gcmVmOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gZm9yd2FyZCBwcmVkaWN0aW9uICovCisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfUDoKKyAgICAgICAgcmVmID0gZmZfdmRwYXVfZ2V0X3N1cmZhY2VfaWQocy0+bGFzdF9waWN0dXJlLmYpOworICAgICAgICBpbmZvLT5mb3J3YXJkX3JlZmVyZW5jZSAgPSByZWY7CisgICAgfQorCisgICAgaW5mby0+c2xpY2VfY291bnQgICAgICAgICAgICAgICAgPSAwOworICAgIGluZm8tPnBpY3R1cmVfc3RydWN0dXJlICAgICAgICAgID0gcy0+cGljdHVyZV9zdHJ1Y3R1cmU7CisgICAgaW5mby0+cGljdHVyZV9jb2RpbmdfdHlwZSAgICAgICAgPSBzLT5waWN0X3R5cGU7CisgICAgaW5mby0+aW50cmFfZGNfcHJlY2lzaW9uICAgICAgICAgPSBzLT5pbnRyYV9kY19wcmVjaXNpb247CisgICAgaW5mby0+ZnJhbWVfcHJlZF9mcmFtZV9kY3QgICAgICAgPSBzLT5mcmFtZV9wcmVkX2ZyYW1lX2RjdDsKKyAgICBpbmZvLT5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycyA9IHMtPmNvbmNlYWxtZW50X21vdGlvbl92ZWN0b3JzOworICAgIGluZm8tPmludHJhX3ZsY19mb3JtYXQgICAgICAgICAgID0gcy0+aW50cmFfdmxjX2Zvcm1hdDsKKyAgICBpbmZvLT5hbHRlcm5hdGVfc2NhbiAgICAgICAgICAgICA9IHMtPmFsdGVybmF0ZV9zY2FuOworICAgIGluZm8tPnFfc2NhbGVfdHlwZSAgICAgICAgICAgICAgID0gcy0+cV9zY2FsZV90eXBlOworICAgIGluZm8tPnRvcF9maWVsZF9maXJzdCAgICAgICAgICAgID0gcy0+dG9wX2ZpZWxkX2ZpcnN0OworICAgIC8vIEJvdGggZm9yIE1QRUctMSBvbmx5LCB6ZXJvIGZvciBNUEVHLTI6CisgICAgaW5mby0+ZnVsbF9wZWxfZm9yd2FyZF92ZWN0b3IgICAgPSBzLT5mdWxsX3BlbFswXTsKKyAgICBpbmZvLT5mdWxsX3BlbF9iYWNrd2FyZF92ZWN0b3IgICA9IHMtPmZ1bGxfcGVsWzFdOworICAgIC8vIEZvciBNUEVHLTEgZmlsbCBib3RoIGhvcml6b250YWwgJiB2ZXJ0aWNhbDoKKyAgICBpbmZvLT5mX2NvZGVbMF1bMF0gICAgICAgICAgICAgICA9IHMtPm1wZWdfZl9jb2RlWzBdWzBdOworICAgIGluZm8tPmZfY29kZVswXVsxXSAgICAgICAgICAgICAgID0gcy0+bXBlZ19mX2NvZGVbMF1bMV07CisgICAgaW5mby0+Zl9jb2RlWzFdWzBdICAgICAgICAgICAgICAgPSBzLT5tcGVnX2ZfY29kZVsxXVswXTsKKyAgICBpbmZvLT5mX2NvZGVbMV1bMV0gICAgICAgICAgICAgICA9IHMtPm1wZWdfZl9jb2RlWzFdWzFdOworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgKytpKSB7CisgICAgICAgIGluZm8tPmludHJhX3F1YW50aXplcl9tYXRyaXhbaV0gICAgID0gcy0+aW50cmFfbWF0cml4W2ldOworICAgICAgICBpbmZvLT5ub25faW50cmFfcXVhbnRpemVyX21hdHJpeFtpXSA9IHMtPmludGVyX21hdHJpeFtpXTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfdmRwYXVfY29tbW9uX3N0YXJ0X2ZyYW1lKHBpY19jdHgsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgdmRwYXVfbXBlZ19kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IHNpemUpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBQaWN0dXJlICpwaWMgICAgICAgICAgICAgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyOworICAgIHN0cnVjdCB2ZHBhdV9waWN0dXJlX2NvbnRleHQgKnBpY19jdHggPSBwaWMtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIGludCB2YWw7CisKKyAgICB2YWwgPSBmZl92ZHBhdV9hZGRfYnVmZmVyKHBpY19jdHgsIGJ1ZmZlciwgc2l6ZSk7CisgICAgaWYgKHZhbCA8IDApCisgICAgICAgIHJldHVybiB2YWw7CisKKyAgICBwaWNfY3R4LT5pbmZvLm1wZWcuc2xpY2VfY291bnQrKzsKKyAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19NUEVHMV9WRFBBVV9IV0FDQ0VMCitzdGF0aWMgaW50IHZkcGF1X21wZWcxX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHJldHVybiBmZl92ZHBhdV9jb21tb25faW5pdChhdmN0eCwgVkRQX0RFQ09ERVJfUFJPRklMRV9NUEVHMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkRQX0RFQ09ERVJfTEVWRUxfTVBFRzFfTkEpOworfQorCitBVkhXQWNjZWwgZmZfbXBlZzFfdmRwYXVfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzFfdmRwYXUiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLAorICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfVkRQQVUsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gdmRwYXVfbXBlZ19zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSBmZl92ZHBhdV9tcGVnX2VuZF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSB2ZHBhdV9tcGVnX2RlY29kZV9zbGljZSwKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdmRwYXVfbXBlZzFfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl92ZHBhdV9jb21tb25fdW5pbml0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWRFBBVUNvbnRleHQpLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX01QRUcyX1ZEUEFVX0hXQUNDRUwKK3N0YXRpYyBpbnQgdmRwYXVfbXBlZzJfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVmRwRGVjb2RlclByb2ZpbGUgcHJvZmlsZTsKKworICAgIHN3aXRjaCAoYXZjdHgtPnByb2ZpbGUpIHsKKyAgICBjYXNlIEZGX1BST0ZJTEVfTVBFRzJfTUFJTjoKKyAgICAgICAgcHJvZmlsZSA9IFZEUF9ERUNPREVSX1BST0ZJTEVfTVBFRzJfTUFJTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX01QRUcyX1NJTVBMRToKKyAgICAgICAgcHJvZmlsZSA9IFZEUF9ERUNPREVSX1BST0ZJTEVfTVBFRzJfU0lNUExFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiBmZl92ZHBhdV9jb21tb25faW5pdChhdmN0eCwgcHJvZmlsZSwgVkRQX0RFQ09ERVJfTEVWRUxfTVBFRzJfSEwpOworfQorCitBVkhXQWNjZWwgZmZfbXBlZzJfdmRwYXVfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzJfdmRwYXUiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfVkRQQVUsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gdmRwYXVfbXBlZ19zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSBmZl92ZHBhdV9tcGVnX2VuZF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSB2ZHBhdV9tcGVnX2RlY29kZV9zbGljZSwKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdmRwYXVfbXBlZzJfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl92ZHBhdV9jb21tb25fdW5pbml0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWRFBBVUNvbnRleHQpLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmRwYXVfbXBlZzQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZkcGF1X21wZWc0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0MWJlYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZkcGF1X21wZWc0LmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBNUEVHLTQgUGFydCAyIC8gSC4yNjMgZGVjb2RlIGFjY2VsZXJhdGlvbiB0aHJvdWdoIFZEUEFVCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE5WSURJQQorICogQ29weXJpZ2h0IChjKSAyMDEzIFLDqW1pIERlbmlzLUNvdXJtb250CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDx2ZHBhdS92ZHBhdS5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKKyNpbmNsdWRlICJ2ZHBhdS5oIgorI2luY2x1ZGUgInZkcGF1X2ludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgdmRwYXVfbXBlZzRfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IHNpemUpCit7CisgICAgTXBlZzREZWNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3QgcyA9ICZjdHgtPm07CisgICAgUGljdHVyZSAqcGljICAgICAgICAgICAgID0gcy0+Y3VycmVudF9waWN0dXJlX3B0cjsKKyAgICBzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0ICpwaWNfY3R4ID0gcGljLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKyAgICBWZHBQaWN0dXJlSW5mb01QRUc0UGFydDIgKmluZm8gPSAmcGljX2N0eC0+aW5mby5tcGVnNDsKKyAgICBWZHBWaWRlb1N1cmZhY2UgcmVmOworICAgIGludCBpOworCisgICAgLyogZmlsbCBWZHBQaWN0dXJlSW5mb01QRUc0UGFydDIgc3RydWN0ICovCisgICAgaW5mby0+Zm9yd2FyZF9yZWZlcmVuY2UgID0gVkRQX0lOVkFMSURfSEFORExFOworICAgIGluZm8tPmJhY2t3YXJkX3JlZmVyZW5jZSA9IFZEUF9JTlZBTElEX0hBTkRMRTsKKyAgICBpbmZvLT52b3BfY29kaW5nX3R5cGUgICAgPSAwOworCisgICAgc3dpdGNoIChzLT5waWN0X3R5cGUpIHsKKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9COgorICAgICAgICByZWYgPSBmZl92ZHBhdV9nZXRfc3VyZmFjZV9pZChzLT5uZXh0X3BpY3R1cmUuZik7CisgICAgICAgIGFzc2VydChyZWYgIT0gVkRQX0lOVkFMSURfSEFORExFKTsKKyAgICAgICAgaW5mby0+YmFja3dhcmRfcmVmZXJlbmNlID0gcmVmOworICAgICAgICBpbmZvLT52b3BfY29kaW5nX3R5cGUgICAgPSAyOworICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9QOgorICAgICAgICByZWYgPSBmZl92ZHBhdV9nZXRfc3VyZmFjZV9pZChzLT5sYXN0X3BpY3R1cmUuZik7CisgICAgICAgIGFzc2VydChyZWYgIT0gVkRQX0lOVkFMSURfSEFORExFKTsKKyAgICAgICAgaW5mby0+Zm9yd2FyZF9yZWZlcmVuY2UgID0gcmVmOworICAgIH0KKworICAgIGluZm8tPnRyZFswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPnBwX3RpbWU7CisgICAgaW5mby0+dHJiWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cGJfdGltZTsKKyAgICBpbmZvLT50cmRbMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5wcF9maWVsZF90aW1lID4+IDE7CisgICAgaW5mby0+dHJiWzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cGJfZmllbGRfdGltZSA+PiAxOworICAgIGluZm8tPnZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uICAgICA9IHMtPmF2Y3R4LT5mcmFtZXJhdGUubnVtOworICAgIGluZm8tPnZvcF9mY29kZV9mb3J3YXJkICAgICAgICAgICAgICAgICA9IHMtPmZfY29kZTsKKyAgICBpbmZvLT52b3BfZmNvZGVfYmFja3dhcmQgICAgICAgICAgICAgICAgPSBzLT5iX2NvZGU7CisgICAgaW5mby0+cmVzeW5jX21hcmtlcl9kaXNhYmxlICAgICAgICAgICAgID0gIWN0eC0+cmVzeW5jX21hcmtlcjsKKyAgICBpbmZvLT5pbnRlcmxhY2VkICAgICAgICAgICAgICAgICAgICAgICAgPSAhcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2U7CisgICAgaW5mby0+cXVhbnRfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+bXBlZ19xdWFudDsKKyAgICBpbmZvLT5xdWFydGVyX3NhbXBsZSAgICAgICAgICAgICAgICAgICAgPSBzLT5xdWFydGVyX3NhbXBsZTsKKyAgICBpbmZvLT5zaG9ydF92aWRlb19oZWFkZXIgICAgICAgICAgICAgICAgPSBhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX0gyNjM7CisgICAgaW5mby0+cm91bmRpbmdfY29udHJvbCAgICAgICAgICAgICAgICAgID0gcy0+bm9fcm91bmRpbmc7CisgICAgaW5mby0+YWx0ZXJuYXRlX3ZlcnRpY2FsX3NjYW5fZmxhZyAgICAgID0gcy0+YWx0ZXJuYXRlX3NjYW47CisgICAgaW5mby0+dG9wX2ZpZWxkX2ZpcnN0ICAgICAgICAgICAgICAgICAgID0gcy0+dG9wX2ZpZWxkX2ZpcnN0OworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgKytpKSB7CisgICAgICAgIGluZm8tPmludHJhX3F1YW50aXplcl9tYXRyaXhbaV0gICAgID0gcy0+aW50cmFfbWF0cml4W2ldOworICAgICAgICBpbmZvLT5ub25faW50cmFfcXVhbnRpemVyX21hdHJpeFtpXSA9IHMtPmludGVyX21hdHJpeFtpXTsKKyAgICB9CisKKyAgICBmZl92ZHBhdV9jb21tb25fc3RhcnRfZnJhbWUocGljX2N0eCwgYnVmZmVyLCBzaXplKTsKKyAgICByZXR1cm4gZmZfdmRwYXVfYWRkX2J1ZmZlcihwaWNfY3R4LCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50IHZkcGF1X21wZWc0X2RlY29kZV9zbGljZShhdl91bnVzZWQgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3VudXNlZCB1aW50MzJfdCBzaXplKQoreworICAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19IMjYzX1ZEUEFVX0hXQUNDRUwKK3N0YXRpYyBpbnQgdmRwYXVfaDI2M19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICByZXR1cm4gZmZfdmRwYXVfY29tbW9uX2luaXQoYXZjdHgsIFZEUF9ERUNPREVSX1BST0ZJTEVfTVBFRzRfUEFSVDJfQVNQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRFBfREVDT0RFUl9MRVZFTF9NUEVHNF9QQVJUMl9BU1BfTDUpOworfQorCitBVkhXQWNjZWwgZmZfaDI2M192ZHBhdV9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoMjYzX3ZkcGF1IiwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2MywKKyAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1ZEUEFVLAorICAgIC5zdGFydF9mcmFtZSAgICA9IHZkcGF1X21wZWc0X3N0YXJ0X2ZyYW1lLAorICAgIC5lbmRfZnJhbWUgICAgICA9IGZmX3ZkcGF1X21wZWdfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICA9IHZkcGF1X21wZWc0X2RlY29kZV9zbGljZSwKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdmRwYXVfaDI2M19pbml0LAorICAgIC51bmluaXQgICAgICAgICA9IGZmX3ZkcGF1X2NvbW1vbl91bmluaXQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZEUEFVQ29udGV4dCksCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfTVBFRzRfVkRQQVVfSFdBQ0NFTAorc3RhdGljIGludCB2ZHBhdV9tcGVnNF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWZHBEZWNvZGVyUHJvZmlsZSBwcm9maWxlOworCisgICAgc3dpdGNoIChhdmN0eC0+cHJvZmlsZSkgeworICAgIGNhc2UgRkZfUFJPRklMRV9NUEVHNF9TSU1QTEU6CisgICAgICAgIHByb2ZpbGUgPSBWRFBfREVDT0RFUl9QUk9GSUxFX01QRUc0X1BBUlQyX1NQOworICAgICAgICBicmVhazsKKyAgICAvLyBBcyBhbnkgQVNQIGRlY29kZXIgbXVzdCBiZSBhYmxlIHRvIGRlY29kZSBTUCwgdGhpcworICAgIC8vIHNob3VsZCBiZSBhIHNhZmUgZmFsbGJhY2sgaWYgcHJvZmlsZSBpcyB1bmtub3duL3Vuc3BlY2lmaWVkLgorICAgIGNhc2UgRkZfUFJPRklMRV9VTktOT1dOOgorICAgIGNhc2UgRkZfUFJPRklMRV9NUEVHNF9BRFZBTkNFRF9TSU1QTEU6CisgICAgICAgIHByb2ZpbGUgPSBWRFBfREVDT0RFUl9QUk9GSUxFX01QRUc0X1BBUlQyX0FTUDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PVFNVUCk7CisgICAgfQorCisgICAgcmV0dXJuIGZmX3ZkcGF1X2NvbW1vbl9pbml0KGF2Y3R4LCBwcm9maWxlLCBhdmN0eC0+bGV2ZWwpOworfQorCitBVkhXQWNjZWwgZmZfbXBlZzRfdmRwYXVfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzRfdmRwYXUiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKKyAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1ZEUEFVLAorICAgIC5zdGFydF9mcmFtZSAgICA9IHZkcGF1X21wZWc0X3N0YXJ0X2ZyYW1lLAorICAgIC5lbmRfZnJhbWUgICAgICA9IGZmX3ZkcGF1X21wZWdfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICA9IHZkcGF1X21wZWc0X2RlY29kZV9zbGljZSwKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdmRwYXVfbXBlZzRfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl92ZHBhdV9jb21tb25fdW5pbml0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWRFBBVUNvbnRleHQpLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmRwYXVfdmMxLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92ZHBhdV92YzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQ2NTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmRwYXVfdmMxLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBWQy0xIGRlY29kZSBhY2NlbGVyYXRpb24gdGhyb3VnaCBWRFBBVQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBOVklESUEKKyAqIENvcHlyaWdodCAoYykgMjAxMyBSw6ltaSBEZW5pcy1Db3VybW9udAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8dmRwYXUvdmRwYXUuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJ2YzEuaCIKKyNpbmNsdWRlICJ2ZHBhdS5oIgorI2luY2x1ZGUgInZkcGF1X2ludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgdmRwYXVfdmMxX3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBWQzFDb250ZXh0ICogY29uc3QgdiAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3QgcyA9ICZ2LT5zOworICAgIFBpY3R1cmUgKnBpYyAgICAgICAgICA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHI7CisgICAgc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCAqcGljX2N0eCA9IHBpYy0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgVmRwUGljdHVyZUluZm9WQzEgKmluZm8gPSAmcGljX2N0eC0+aW5mby52YzE7CisgICAgVmRwVmlkZW9TdXJmYWNlIHJlZjsKKworICAgIC8qICBmaWxsIEx2UGljdHVyZUluZm9WQzEgc3RydWN0ICovCisgICAgaW5mby0+Zm9yd2FyZF9yZWZlcmVuY2UgID0gVkRQX0lOVkFMSURfSEFORExFOworICAgIGluZm8tPmJhY2t3YXJkX3JlZmVyZW5jZSA9IFZEUF9JTlZBTElEX0hBTkRMRTsKKworICAgIHN3aXRjaCAocy0+cGljdF90eXBlKSB7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfQjoKKyAgICAgICAgaWYgKHMtPm5leHRfcGljdHVyZV9wdHIpIHsKKyAgICAgICAgcmVmID0gZmZfdmRwYXVfZ2V0X3N1cmZhY2VfaWQocy0+bmV4dF9waWN0dXJlLmYpOworICAgICAgICBhc3NlcnQocmVmICE9IFZEUF9JTlZBTElEX0hBTkRMRSk7CisgICAgICAgIGluZm8tPmJhY2t3YXJkX3JlZmVyZW5jZSA9IHJlZjsKKyAgICAgICAgfQorICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9QOgorICAgICAgICBpZiAocy0+bGFzdF9waWN0dXJlX3B0cikgeworICAgICAgICByZWYgPSBmZl92ZHBhdV9nZXRfc3VyZmFjZV9pZChzLT5sYXN0X3BpY3R1cmUuZik7CisgICAgICAgIGFzc2VydChyZWYgIT0gVkRQX0lOVkFMSURfSEFORExFKTsKKyAgICAgICAgaW5mby0+Zm9yd2FyZF9yZWZlcmVuY2UgID0gcmVmOworICAgICAgICB9CisgICAgfQorCisgICAgaW5mby0+c2xpY2VfY291bnQgICAgICAgPSAwOworICAgIGlmICh2LT5iaV90eXBlKQorICAgICAgICBpbmZvLT5waWN0dXJlX3R5cGUgID0gNDsKKyAgICBlbHNlCisgICAgICAgIGluZm8tPnBpY3R1cmVfdHlwZSAgPSBzLT5waWN0X3R5cGUgLSAxICsgcy0+cGljdF90eXBlIC8gMzsKKworICAgIGluZm8tPmZyYW1lX2NvZGluZ19tb2RlID0gdi0+ZmNtID8gKHYtPmZjbSArIDEpIDogMDsKKyAgICBpbmZvLT5wb3N0cHJvY2ZsYWcgICAgICA9IHYtPnBvc3Rwcm9jZmxhZzsKKyAgICBpbmZvLT5wdWxsZG93biAgICAgICAgICA9IHYtPmJyb2FkY2FzdDsKKyAgICBpbmZvLT5pbnRlcmxhY2UgICAgICAgICA9IHYtPmludGVybGFjZTsKKyAgICBpbmZvLT50ZmNudHJmbGFnICAgICAgICA9IHYtPnRmY250cmZsYWc7CisgICAgaW5mby0+ZmludGVycGZsYWcgICAgICAgPSB2LT5maW50ZXJwZmxhZzsKKyAgICBpbmZvLT5wc2YgICAgICAgICAgICAgICA9IHYtPnBzZjsKKyAgICBpbmZvLT5kcXVhbnQgICAgICAgICAgICA9IHYtPmRxdWFudDsKKyAgICBpbmZvLT5wYW5zY2FuX2ZsYWcgICAgICA9IHYtPnBhbnNjYW5mbGFnOworICAgIGluZm8tPnJlZmRpc3RfZmxhZyAgICAgID0gdi0+cmVmZGlzdF9mbGFnOworICAgIGluZm8tPnF1YW50aXplciAgICAgICAgID0gdi0+cXVhbnRpemVyX21vZGU7CisgICAgaW5mby0+ZXh0ZW5kZWRfbXYgICAgICAgPSB2LT5leHRlbmRlZF9tdjsKKyAgICBpbmZvLT5leHRlbmRlZF9kbXYgICAgICA9IHYtPmV4dGVuZGVkX2RtdjsKKyAgICBpbmZvLT5vdmVybGFwICAgICAgICAgICA9IHYtPm92ZXJsYXA7CisgICAgaW5mby0+dnN0cmFuc2Zvcm0gICAgICAgPSB2LT52c3RyYW5zZm9ybTsKKyAgICBpbmZvLT5sb29wZmlsdGVyICAgICAgICA9IHYtPnMubG9vcF9maWx0ZXI7CisgICAgaW5mby0+ZmFzdHV2bWMgICAgICAgICAgPSB2LT5mYXN0dXZtYzsKKyAgICBpbmZvLT5yYW5nZV9tYXB5X2ZsYWcgICA9IHYtPnJhbmdlX21hcHlfZmxhZzsKKyAgICBpbmZvLT5yYW5nZV9tYXB5ICAgICAgICA9IHYtPnJhbmdlX21hcHk7CisgICAgaW5mby0+cmFuZ2VfbWFwdXZfZmxhZyAgPSB2LT5yYW5nZV9tYXB1dl9mbGFnOworICAgIGluZm8tPnJhbmdlX21hcHV2ICAgICAgID0gdi0+cmFuZ2VfbWFwdXY7CisgICAgLyogU3BlY2lmaWMgdG8gc2ltcGxlL21haW4gcHJvZmlsZSBvbmx5ICovCisgICAgaW5mby0+bXVsdGlyZXMgICAgICAgICAgPSB2LT5tdWx0aXJlczsKKyAgICBpbmZvLT5zeW5jbWFya2VyICAgICAgICA9IHYtPnJlc3luY19tYXJrZXI7CisgICAgaW5mby0+cmFuZ2VyZWQgICAgICAgICAgPSB2LT5yYW5nZXJlZCB8ICh2LT5yYW5nZXJlZGZybSA8PCAxKTsKKyAgICBpbmZvLT5tYXhiZnJhbWVzICAgICAgICA9IHYtPnMubWF4X2JfZnJhbWVzOworICAgIGluZm8tPmRlYmxvY2tFbmFibGUgICAgID0gdi0+cG9zdHByb2NmbGFnICYgMTsKKyAgICBpbmZvLT5wcXVhbnQgICAgICAgICAgICA9IHYtPnBxOworCisgICAgcmV0dXJuIGZmX3ZkcGF1X2NvbW1vbl9zdGFydF9mcmFtZShwaWNfY3R4LCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50IHZkcGF1X3ZjMV9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBWQzFDb250ZXh0ICogY29uc3QgdiAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3QgcyA9ICZ2LT5zOworICAgIFBpY3R1cmUgKnBpYyAgICAgICAgICA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHI7CisgICAgc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCAqcGljX2N0eCA9IHBpYy0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgaW50IHZhbDsKKworICAgIHZhbCA9IGZmX3ZkcGF1X2FkZF9idWZmZXIocGljX2N0eCwgYnVmZmVyLCBzaXplKTsKKyAgICBpZiAodmFsIDwgMCkKKyAgICAgICAgcmV0dXJuIHZhbDsKKworICAgIHBpY19jdHgtPmluZm8udmMxLnNsaWNlX2NvdW50Kys7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmRwYXVfdmMxX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZkcERlY29kZXJQcm9maWxlIHByb2ZpbGU7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5wcm9maWxlKSB7CisgICAgY2FzZSBGRl9QUk9GSUxFX1ZDMV9TSU1QTEU6CisgICAgICAgIHByb2ZpbGUgPSBWRFBfREVDT0RFUl9QUk9GSUxFX1ZDMV9TSU1QTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfUFJPRklMRV9WQzFfTUFJTjoKKyAgICAgICAgcHJvZmlsZSA9IFZEUF9ERUNPREVSX1BST0ZJTEVfVkMxX01BSU47CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfUFJPRklMRV9WQzFfQURWQU5DRUQ6CisgICAgICAgIHByb2ZpbGUgPSBWRFBfREVDT0RFUl9QUk9GSUxFX1ZDMV9BRFZBTkNFRDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PVFNVUCk7CisgICAgfQorCisgICAgcmV0dXJuIGZmX3ZkcGF1X2NvbW1vbl9pbml0KGF2Y3R4LCBwcm9maWxlLCBhdmN0eC0+bGV2ZWwpOworfQorCisjaWYgQ09ORklHX1dNVjNfVkRQQVVfSFdBQ0NFTAorQVZIV0FjY2VsIGZmX3dtdjNfdmRwYXVfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid20zX3ZkcGF1IiwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV01WMywKKyAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1ZEUEFVLAorICAgIC5zdGFydF9mcmFtZSAgICA9IHZkcGF1X3ZjMV9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSBmZl92ZHBhdV9tcGVnX2VuZF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSB2ZHBhdV92YzFfZGVjb2RlX3NsaWNlLAorICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2ZHBhdV92YzFfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl92ZHBhdV9jb21tb25fdW5pbml0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWRFBBVUNvbnRleHQpLAorfTsKKyNlbmRpZgorCitBVkhXQWNjZWwgZmZfdmMxX3ZkcGF1X2h3YWNjZWwgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZjMV92ZHBhdSIsCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMSwKKyAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1ZEUEFVLAorICAgIC5zdGFydF9mcmFtZSAgICA9IHZkcGF1X3ZjMV9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSBmZl92ZHBhdV9tcGVnX2VuZF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSB2ZHBhdV92YzFfZGVjb2RlX3NsaWNlLAorICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2ZHBhdV92YzFfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl92ZHBhdV9jb21tb25fdW5pbml0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWRFBBVUNvbnRleHQpLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZlcnNpb24uaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQ0M2VkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmVyc2lvbi5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVkVSU0lPTl9ICisjZGVmaW5lIEFWQ09ERUNfVkVSU0lPTl9ICisKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxpYmF2YworICogTGliYXZjb2RlYyB2ZXJzaW9uIG1hY3Jvcy4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3ZlcnNpb24uaCIKKworI2RlZmluZSBMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgNTYKKyNkZWZpbmUgTElCQVZDT0RFQ19WRVJTSU9OX01JTk9SICAxMworI2RlZmluZSBMSUJBVkNPREVDX1ZFUlNJT05fTUlDUk8gMTAwCisKKyNkZWZpbmUgTElCQVZDT0RFQ19WRVJTSU9OX0lOVCAgQVZfVkVSU0lPTl9JTlQoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWQ09ERUNfVkVSU0lPTl9NSU5PUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJBVkNPREVDX1ZFUlNJT05fTUlDUk8pCisjZGVmaW5lIExJQkFWQ09ERUNfVkVSU0lPTiAgICAgIEFWX1ZFUlNJT04oTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCQVZDT0RFQ19WRVJTSU9OX01JTk9SLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCQVZDT0RFQ19WRVJTSU9OX01JQ1JPKQorI2RlZmluZSBMSUJBVkNPREVDX0JVSUxEICAgICAgICBMSUJBVkNPREVDX1ZFUlNJT05fSU5UCisKKyNkZWZpbmUgTElCQVZDT0RFQ19JREVOVCAgICAgICAgIkxhdmMiIEFWX1NUUklOR0lGWShMSUJBVkNPREVDX1ZFUlNJT04pCisKKy8qKgorICogRkZfQVBJXyogZGVmaW5lcyBtYXkgYmUgcGxhY2VkIGJlbG93IHRvIGluZGljYXRlIHB1YmxpYyBBUEkgdGhhdCB3aWxsIGJlCisgKiBkcm9wcGVkIGF0IGEgZnV0dXJlIHZlcnNpb24gYnVtcC4gVGhlIGRlZmluZXMgdGhlbXNlbHZlcyBhcmUgbm90IHBhcnQgb2YKKyAqIHRoZSBwdWJsaWMgQVBJIGFuZCBtYXkgY2hhbmdlLCBicmVhayBvciBkaXNhcHBlYXIgYXQgYW55IHRpbWUuCisgKi8KKworI2lmbmRlZiBGRl9BUElfUkVRVUVTVF9DSEFOTkVMUworI2RlZmluZSBGRl9BUElfUkVRVUVTVF9DSEFOTkVMUyAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX09MRF9ERUNPREVfQVVESU8KKyNkZWZpbmUgRkZfQVBJX09MRF9ERUNPREVfQVVESU8gKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9PTERfRU5DT0RFX0FVRElPCisjZGVmaW5lIEZGX0FQSV9PTERfRU5DT0RFX0FVRElPIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfT0xEX0VOQ09ERV9WSURFTworI2RlZmluZSBGRl9BUElfT0xEX0VOQ09ERV9WSURFTyAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0NPREVDX0lECisjZGVmaW5lIEZGX0FQSV9DT0RFQ19JRCAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0FVRElPX0NPTlZFUlQKKyNkZWZpbmUgRkZfQVBJX0FVRElPX0NPTlZFUlQgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfQVZDT0RFQ19SRVNBTVBMRQorI2RlZmluZSBGRl9BUElfQVZDT0RFQ19SRVNBTVBMRSAgRkZfQVBJX0FVRElPX0NPTlZFUlQKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfREVJTlRFUkxBQ0UKKyNkZWZpbmUgRkZfQVBJX0RFSU5URVJMQUNFICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfREVTVFJVQ1RfUEFDS0VUCisjZGVmaW5lIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0dFVF9CVUZGRVIKKyNkZWZpbmUgRkZfQVBJX0dFVF9CVUZGRVIgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfTUlTU0lOR19TQU1QTEUKKyNkZWZpbmUgRkZfQVBJX01JU1NJTkdfU0FNUExFICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfTE9XUkVTCisjZGVmaW5lIEZGX0FQSV9MT1dSRVMgICAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0NBUF9WRFBBVQorI2RlZmluZSBGRl9BUElfQ0FQX1ZEUEFVICAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9CVUZTX1ZEUEFVCisjZGVmaW5lIEZGX0FQSV9CVUZTX1ZEUEFVICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX1ZPWFdBUkUKKyNkZWZpbmUgRkZfQVBJX1ZPWFdBUkUgICAgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfU0VUX0RJTUVOU0lPTlMKKyNkZWZpbmUgRkZfQVBJX1NFVF9ESU1FTlNJT05TICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfREVCVUdfTVYKKyNkZWZpbmUgRkZfQVBJX0RFQlVHX01WICAgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfQUNfVkxDCisjZGVmaW5lIEZGX0FQSV9BQ19WTEMgICAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX09MRF9NU01QRUc0CisjZGVmaW5lIEZGX0FQSV9PTERfTVNNUEVHNCAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0FTUEVDVF9FWFRFTkRFRAorI2RlZmluZSBGRl9BUElfQVNQRUNUX0VYVEVOREVEICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9USFJFQURfT1BBUVVFCisjZGVmaW5lIEZGX0FQSV9USFJFQURfT1BBUVVFICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0NPREVDX1BLVAorI2RlZmluZSBGRl9BUElfQ09ERUNfUEtUICAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9BUkNIX0FMUEhBCisjZGVmaW5lIEZGX0FQSV9BUkNIX0FMUEhBICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX1hWTUMKKyNkZWZpbmUgRkZfQVBJX1hWTUMgICAgICAgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfRVJST1JfUkFURQorI2RlZmluZSBGRl9BUElfRVJST1JfUkFURSAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9RU0NBTEVfVFlQRQorI2RlZmluZSBGRl9BUElfUVNDQUxFX1RZUEUgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9NQl9UWVBFCisjZGVmaW5lIEZGX0FQSV9NQl9UWVBFICAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX01BWF9CRlJBTUVTCisjZGVmaW5lIEZGX0FQSV9NQVhfQkZSQU1FUyAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX05FR19MSU5FU0laRVMKKyNkZWZpbmUgRkZfQVBJX05FR19MSU5FU0laRVMgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfRU1VX0VER0UKKyNkZWZpbmUgRkZfQVBJX0VNVV9FREdFICAgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfQVJDSF9TSDQKKyNkZWZpbmUgRkZfQVBJX0FSQ0hfU0g0ICAgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfQVJDSF9TUEFSQworI2RlZmluZSBGRl9BUElfQVJDSF9TUEFSQyAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9VTlVTRURfTUVNQkVSUworI2RlZmluZSBGRl9BUElfVU5VU0VEX01FTUJFUlMgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9JRENUX1hWSURNTVgKKyNkZWZpbmUgRkZfQVBJX0lEQ1RfWFZJRE1NWCAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfSU5QVVRfUFJFU0VSVkVECisjZGVmaW5lIEZGX0FQSV9JTlBVVF9QUkVTRVJWRUQgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX05PUk1BTElaRV9BUVAKKyNkZWZpbmUgRkZfQVBJX05PUk1BTElaRV9BUVAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfR01DCisjZGVmaW5lIEZGX0FQSV9HTUMgICAgICAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX01WMAorI2RlZmluZSBGRl9BUElfTVYwICAgICAgICAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9DT0RFQ19OQU1FCisjZGVmaW5lIEZGX0FQSV9DT0RFQ19OQU1FICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0FGRAorI2RlZmluZSBGRl9BUElfQUZEICAgICAgICAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9WSVNNVgorLyogWFhYOiBkb24ndCBmb3JnZXQgdG8gZHJvcCB0aGUgLXZpc212IGRvY3VtZW50YXRpb24gKi8KKyNkZWZpbmUgRkZfQVBJX1ZJU01WICAgICAgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfRFZfRlJBTUVfUFJPRklMRQorI2RlZmluZSBGRl9BUElfRFZfRlJBTUVfUFJPRklMRSAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9BVURJT0VOQ19ERUxBWQorI2RlZmluZSBGRl9BUElfQVVESU9FTkNfREVMQVkgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9BVkNUWF9USU1FQkFTRQorI2RlZmluZSBGRl9BUElfQVZDVFhfVElNRUJBU0UgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9NUFZfT1BUCisjZGVmaW5lIEZGX0FQSV9NUFZfT1BUICAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTkpCisjZW5kaWYKKworI2VuZGlmIC8qIEFWQ09ERUNfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92aWRlb2RzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmlkZW9kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTYxOGE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmlkZW9kc3AuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFJvbmFsZCBTLiBCdWx0amUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgInZpZGVvZHNwLmgiCisKKyNkZWZpbmUgQklUX0RFUFRIIDgKKyNpbmNsdWRlICJ2aWRlb2RzcF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCAxNgorI2luY2x1ZGUgInZpZGVvZHNwX3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisKK3N0YXRpYyB2b2lkIGp1c3RfcmV0dXJuKHVpbnQ4X3QgKmJ1ZiwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl92aWRlb2RzcF9pbml0KFZpZGVvRFNQQ29udGV4dCAqY3R4LCBpbnQgYnBjKQoreworICAgIGN0eC0+cHJlZmV0Y2ggPSBqdXN0X3JldHVybjsKKyAgICBpZiAoYnBjIDw9IDgpIHsKKyAgICAgICAgY3R4LT5lbXVsYXRlZF9lZGdlX21jID0gZmZfZW11bGF0ZWRfZWRnZV9tY184OworICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+ZW11bGF0ZWRfZWRnZV9tYyA9IGZmX2VtdWxhdGVkX2VkZ2VfbWNfMTY7CisgICAgfQorCisgICAgaWYgKEFSQ0hfQUFSQ0g2NCkKKyAgICAgICAgZmZfdmlkZW9kc3BfaW5pdF9hYXJjaDY0KGN0eCwgYnBjKTsKKyAgICBpZiAoQVJDSF9BUk0pCisgICAgICAgIGZmX3ZpZGVvZHNwX2luaXRfYXJtKGN0eCwgYnBjKTsKKyAgICBpZiAoQVJDSF9QUEMpCisgICAgICAgIGZmX3ZpZGVvZHNwX2luaXRfcHBjKGN0eCwgYnBjKTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX3ZpZGVvZHNwX2luaXRfeDg2KGN0eCwgYnBjKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZpZGVvZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy92aWRlb2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMDFhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92aWRlb2RzcC5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgUm9uYWxkIFMuIEJ1bHRqZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDb3JlIHZpZGVvIERTUCBoZWxwZXIgZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZJREVPRFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19WSURFT0RTUF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBFTVVMQVRFRF9FREdFKGRlcHRoKSBcCit2b2lkIGZmX2VtdWxhdGVkX2VkZ2VfbWNfICMjIGRlcHRoKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfdywgaW50IGJsb2NrX2gsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IHcsIGludCBoKTsKKworRU1VTEFURURfRURHRSg4KQorRU1VTEFURURfRURHRSgxNikKKwordHlwZWRlZiBzdHJ1Y3QgVmlkZW9EU1BDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBDb3B5IGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBzYW1wbGVzIHRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgcmVwbGljYXRlCisgICAgICogdGhlIGJvcmRlciBzYW1wbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRzdCBkZXN0aW5hdGlvbiBidWZmZXIKKyAgICAgKiBAcGFyYW0gZHN0X3N0cmlkZSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiAyIHZlcnRpY2FsbHkgYWRqYWNlbnQgc2FtcGxlcworICAgICAqICAgICAgICAgICAgICAgICAgIGluIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICAgICAqIEBwYXJhbSBzcmMgc291cmNlIGJ1ZmZlcgorICAgICAqIEBwYXJhbSBkc3RfbGluZXNpemUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gMiB2ZXJ0aWNhbGx5IGFkamFjZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIGluIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAgICAgKiBAcGFyYW0gc3JjX2xpbmVzaXplIG51bWJlciBvZiBieXRlcyBiZXR3ZWVuIDIgdmVydGljYWxseSBhZGphY2VudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBpbiBib3RoIHRoZSBzb3VyY2UgYnVmZmVyCisgICAgICogQHBhcmFtIGJsb2NrX3cgd2lkdGggb2YgYmxvY2sKKyAgICAgKiBAcGFyYW0gYmxvY2tfaCBoZWlnaHQgb2YgYmxvY2sKKyAgICAgKiBAcGFyYW0gc3JjX3ggeCBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBzYW1wbGUgb2YgdGhlIGJsb2NrIGluIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHNvdXJjZSBidWZmZXIKKyAgICAgKiBAcGFyYW0gc3JjX3kgeSBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBzYW1wbGUgb2YgdGhlIGJsb2NrIGluIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHNvdXJjZSBidWZmZXIKKyAgICAgKiBAcGFyYW0gdyB3aWR0aCBvZiB0aGUgc291cmNlIGJ1ZmZlcgorICAgICAqIEBwYXJhbSBoIGhlaWdodCBvZiB0aGUgc291cmNlIGJ1ZmZlcgorICAgICAqLworICAgIHZvaWQgKCplbXVsYXRlZF9lZGdlX21jKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3csIGludCBibG9ja19oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IHcsIGludCBoKTsKKworICAgIC8qKgorICAgICAqIFByZWZldGNoIG1lbW9yeSBpbnRvIGNhY2hlIChpZiBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUpLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZiAgICBwb2ludGVyIHRvIGJ1ZmZlciB0byBwcmVmZXRjaCBtZW1vcnkgZnJvbQorICAgICAqIEBwYXJhbSBzdHJpZGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gbGluZXMgb2YgYnVmIChpbiBieXRlcykKKyAgICAgKiBAcGFyYW0gaCAgICAgIG51bWJlciBvZiBsaW5lcyB0byBwcmVmZXRjaAorICAgICAqLworICAgIHZvaWQgKCpwcmVmZXRjaCkodWludDhfdCAqYnVmLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCk7Cit9IFZpZGVvRFNQQ29udGV4dDsKKwordm9pZCBmZl92aWRlb2RzcF9pbml0KFZpZGVvRFNQQ29udGV4dCAqY3R4LCBpbnQgYnBjKTsKKworLyogZm9yIGludGVybmFsIHVzZSBvbmx5IChpLmUuIGNhbGxlZCBieSBmZl92aWRlb2RzcF9pbml0KCkgKi8KK3ZvaWQgZmZfdmlkZW9kc3BfaW5pdF9hYXJjaDY0KFZpZGVvRFNQQ29udGV4dCAqY3R4LCBpbnQgYnBjKTsKK3ZvaWQgZmZfdmlkZW9kc3BfaW5pdF9hcm0oVmlkZW9EU1BDb250ZXh0ICpjdHgsIGludCBicGMpOwordm9pZCBmZl92aWRlb2RzcF9pbml0X3BwYyhWaWRlb0RTUENvbnRleHQgKmN0eCwgaW50IGJwYyk7Cit2b2lkIGZmX3ZpZGVvZHNwX2luaXRfeDg2KFZpZGVvRFNQQ29udGV4dCAqY3R4LCBpbnQgYnBjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVklERU9EU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmlkZW9kc3BfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZpZGVvZHNwX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmZjJiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZpZGVvZHNwX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgUm9uYWxkIFMuIEJ1bHRqZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJiaXRfZGVwdGhfdGVtcGxhdGUuYyIKK3ZvaWQgRlVOQyhmZl9lbXVsYXRlZF9lZGdlX21jKSh1aW50OF90ICpidWYsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgYnVmX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3csIGludCBibG9ja19oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfeCwgaW50IHNyY195LCBpbnQgdywgaW50IGgpCit7CisgICAgaW50IHgsIHk7CisgICAgaW50IHN0YXJ0X3ksIHN0YXJ0X3gsIGVuZF95LCBlbmRfeDsKKworICAgIGlmICghdyB8fCAhaCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHNyY195ID49IGgpIHsKKyAgICAgICAgc3JjIC09IHNyY195ICogc3JjX2xpbmVzaXplOworICAgICAgICBzcmMgKz0gKGggLSAxKSAqIHNyY19saW5lc2l6ZTsKKyAgICAgICAgc3JjX3kgPSBoIC0gMTsKKyAgICB9IGVsc2UgaWYgKHNyY195IDw9IC1ibG9ja19oKSB7CisgICAgICAgIHNyYyAtPSBzcmNfeSAqIHNyY19saW5lc2l6ZTsKKyAgICAgICAgc3JjICs9ICgxIC0gYmxvY2tfaCkgKiBzcmNfbGluZXNpemU7CisgICAgICAgIHNyY195ID0gMSAtIGJsb2NrX2g7CisgICAgfQorICAgIGlmIChzcmNfeCA+PSB3KSB7CisgICAgICAgIHNyYyAgKz0gKHcgLSAxIC0gc3JjX3gpICogc2l6ZW9mKHBpeGVsKTsKKyAgICAgICAgc3JjX3ggPSB3IC0gMTsKKyAgICB9IGVsc2UgaWYgKHNyY194IDw9IC1ibG9ja193KSB7CisgICAgICAgIHNyYyAgKz0gKDEgLSBibG9ja193IC0gc3JjX3gpICogc2l6ZW9mKHBpeGVsKTsKKyAgICAgICAgc3JjX3ggPSAxIC0gYmxvY2tfdzsKKyAgICB9CisKKyAgICBzdGFydF95ID0gRkZNQVgoMCwgLXNyY195KTsKKyAgICBzdGFydF94ID0gRkZNQVgoMCwgLXNyY194KTsKKyAgICBlbmRfeSA9IEZGTUlOKGJsb2NrX2gsIGgtc3JjX3kpOworICAgIGVuZF94ID0gRkZNSU4oYmxvY2tfdywgdy1zcmNfeCk7CisgICAgYXZfYXNzZXJ0MihzdGFydF95IDwgZW5kX3kgJiYgYmxvY2tfaCk7CisgICAgYXZfYXNzZXJ0MihzdGFydF94IDwgZW5kX3ggJiYgYmxvY2tfdyk7CisKKyAgICB3ICAgID0gZW5kX3ggLSBzdGFydF94OworICAgIHNyYyArPSBzdGFydF95ICogc3JjX2xpbmVzaXplICsgc3RhcnRfeCAqIHNpemVvZihwaXhlbCk7CisgICAgYnVmICs9IHN0YXJ0X3ggKiBzaXplb2YocGl4ZWwpOworCisgICAgLy8gdG9wCisgICAgZm9yICh5ID0gMDsgeSA8IHN0YXJ0X3k7IHkrKykgeworICAgICAgICBtZW1jcHkoYnVmLCBzcmMsIHcgKiBzaXplb2YocGl4ZWwpKTsKKyAgICAgICAgYnVmICs9IGJ1Zl9saW5lc2l6ZTsKKyAgICB9CisKKyAgICAvLyBjb3B5IGV4aXN0aW5nIHBhcnQKKyAgICBmb3IgKDsgeSA8IGVuZF95OyB5KyspIHsKKyAgICAgICAgbWVtY3B5KGJ1Ziwgc3JjLCB3ICogc2l6ZW9mKHBpeGVsKSk7CisgICAgICAgIHNyYyArPSBzcmNfbGluZXNpemU7CisgICAgICAgIGJ1ZiArPSBidWZfbGluZXNpemU7CisgICAgfQorCisgICAgLy8gYm90dG9tCisgICAgc3JjIC09IHNyY19saW5lc2l6ZTsKKyAgICBmb3IgKDsgeSA8IGJsb2NrX2g7IHkrKykgeworICAgICAgICBtZW1jcHkoYnVmLCBzcmMsIHcgKiBzaXplb2YocGl4ZWwpKTsKKyAgICAgICAgYnVmICs9IGJ1Zl9saW5lc2l6ZTsKKyAgICB9CisKKyAgICBidWYgLT0gYmxvY2tfaCAqIGJ1Zl9saW5lc2l6ZSArIHN0YXJ0X3ggKiBzaXplb2YocGl4ZWwpOworICAgIHdoaWxlIChibG9ja19oLS0pIHsKKyAgICAgICAgcGl4ZWwgKmJ1ZnAgPSAocGl4ZWwgKikgYnVmOworCisgICAgICAgIC8vIGxlZnQKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgc3RhcnRfeDsgeCsrKSB7CisgICAgICAgICAgICBidWZwW3hdID0gYnVmcFtzdGFydF94XTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJpZ2h0CisgICAgICAgIGZvciAoeCA9IGVuZF94OyB4IDwgYmxvY2tfdzsgeCsrKSB7CisgICAgICAgICAgICBidWZwW3hdID0gYnVmcFtlbmRfeCAtIDFdOworICAgICAgICB9CisgICAgICAgIGJ1ZiArPSBidWZfbGluZXNpemU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdmltYS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdmltYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2YwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92aW1hLmMKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBMdWNhc0FydHMgVklNQSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEx1Y2FzQXJ0cyBWSU1BIGF1ZGlvIGRlY29kZXIKKyAqIEBhdXRob3IgUGF1bCBCIE1haG9sCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorCisjaW5jbHVkZSAiYWRwY21fZGF0YS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgcHJlZGljdF90YWJsZV9pbml0ID0gMDsKK3N0YXRpYyB1aW50MTZfdCBwcmVkaWN0X3RhYmxlWzU3ODYgKiAyXTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2l6ZV90YWJsZVtdID0geworICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3Cit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGluZGV4X3RhYmxlMVtdID0geworICAgIC0xLCA0LCAtMSwgNAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBpbmRleF90YWJsZTJbXSA9IHsKKyAgICAtMSwgLTEsIDIsIDYsIC0xLCAtMSwgMiwgNgorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBpbmRleF90YWJsZTNbXSA9IHsKKyAgICAtMSwgLTEsIC0xLCAtMSwgMSwgMiwgNCwgNiwgLTEsIC0xLCAtMSwgLTEsIDEsIDIsIDQsIDYKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgaW5kZXhfdGFibGU0W10gPSB7CisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxLCAgMSwgIDEsICAyLCAgMiwgIDQsICA1LCAgNiwKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEsICAxLCAgMSwgIDIsICAyLCAgNCwgIDUsICA2Cit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGluZGV4X3RhYmxlNVtdID0geworICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICA0LCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICA0LCAgNCwgIDQsICA1LCAgNSwgIDYsICA2Cit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGluZGV4X3RhYmxlNltdID0geworICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2Cit9OworCitzdGF0aWMgY29uc3QgaW50OF90ICpjb25zdCBzdGVwX2luZGV4X3RhYmxlc1tdID0geworICAgIGluZGV4X3RhYmxlMSwgaW5kZXhfdGFibGUyLCBpbmRleF90YWJsZTMsCisgICAgaW5kZXhfdGFibGU0LCBpbmRleF90YWJsZTUsIGluZGV4X3RhYmxlNgorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgc3RhcnRfcG9zOworCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKworICAgIGlmIChwcmVkaWN0X3RhYmxlX2luaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChzdGFydF9wb3MgPSAwOyBzdGFydF9wb3MgPCA2NDsgc3RhcnRfcG9zKyspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGRlc3RfcG9zLCB0YWJsZV9wb3M7CisKKyAgICAgICAgZm9yICh0YWJsZV9wb3MgPSAwLCBkZXN0X3BvcyA9IHN0YXJ0X3BvczsKKyAgICAgICAgICAgICB0YWJsZV9wb3MgPCBGRl9BUlJBWV9FTEVNUyhmZl9hZHBjbV9zdGVwX3RhYmxlKTsKKyAgICAgICAgICAgICB0YWJsZV9wb3MrKywgZGVzdF9wb3MgKz0gNjQpIHsKKyAgICAgICAgICAgIGludCBwdXQgPSAwLCBjb3VudCwgdGFibGVfdmFsdWU7CisKKyAgICAgICAgICAgIHRhYmxlX3ZhbHVlID0gZmZfYWRwY21fc3RlcF90YWJsZVt0YWJsZV9wb3NdOworICAgICAgICAgICAgZm9yIChjb3VudCA9IDMyOyBjb3VudCAhPSAwOyBjb3VudCA+Pj0gMSkgeworICAgICAgICAgICAgICAgIGlmIChzdGFydF9wb3MgJiBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgcHV0ICs9IHRhYmxlX3ZhbHVlOworICAgICAgICAgICAgICAgIHRhYmxlX3ZhbHVlID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJlZGljdF90YWJsZVtkZXN0X3Bvc10gPSBwdXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJlZGljdF90YWJsZV9pbml0ID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICpwa3QpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisgICAgaW50MTZfdCBwY21fZGF0YVsyXTsKKyAgICB1aW50MzJfdCBzYW1wbGVzOworICAgIGludDhfdCBjaGFubmVsX2hpbnRbMl07CisgICAgaW50IHJldCwgY2hhbjsKKyAgICBpbnQgY2hhbm5lbHMgPSAxOworCisgICAgaWYgKHBrdC0+c2l6ZSA8IDEzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHNhbXBsZXMgPSBnZXRfYml0c19sb25nKCZnYiwgMzIpOworICAgIGlmIChzYW1wbGVzID09IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCAzMik7CisgICAgICAgIHNhbXBsZXMgPSBnZXRfYml0c19sb25nKCZnYiwgMzIpOworICAgIH0KKworICAgIGlmIChzYW1wbGVzID4gcGt0LT5zaXplICogMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBjaGFubmVsX2hpbnRbMF0gPSBnZXRfc2JpdHMoJmdiLCA4KTsKKyAgICBpZiAoY2hhbm5lbF9oaW50WzBdICYgMHg4MCkgeworICAgICAgICBjaGFubmVsX2hpbnRbMF0gPSB+Y2hhbm5lbF9oaW50WzBdOworICAgICAgICBjaGFubmVscyA9IDI7CisgICAgfQorICAgIGF2Y3R4LT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IChjaGFubmVscyA9PSAyKSA/IEFWX0NIX0xBWU9VVF9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBwY21fZGF0YVswXSA9IGdldF9zYml0cygmZ2IsIDE2KTsKKyAgICBpZiAoY2hhbm5lbHMgPiAxKSB7CisgICAgICAgIGNoYW5uZWxfaGludFsxXSA9IGdldF9zYml0cygmZ2IsIDgpOworICAgICAgICBwY21fZGF0YVsxXSAgICAgPSBnZXRfc2JpdHMoJmdiLCAxNik7CisgICAgfQorCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBzYW1wbGVzOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgY2hhbm5lbHM7IGNoYW4rKykgeworICAgICAgICB1aW50MTZfdCAqZGVzdCA9ICh1aW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdICsgY2hhbjsKKyAgICAgICAgaW50IHN0ZXBfaW5kZXggPSBjaGFubmVsX2hpbnRbY2hhbl07CisgICAgICAgIGludCBvdXRwdXQgPSBwY21fZGF0YVtjaGFuXTsKKyAgICAgICAgaW50IHNhbXBsZTsKKworICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IHNhbXBsZXM7IHNhbXBsZSsrKSB7CisgICAgICAgICAgICBpbnQgbG9va3VwX3NpemUsIGxvb2t1cCwgaGlnaGJpdCwgbG93Yml0czsKKworICAgICAgICAgICAgc3RlcF9pbmRleCAgPSBhdl9jbGlwKHN0ZXBfaW5kZXgsIDAsIDg4KTsKKyAgICAgICAgICAgIGxvb2t1cF9zaXplID0gc2l6ZV90YWJsZVtzdGVwX2luZGV4XTsKKyAgICAgICAgICAgIGxvb2t1cCAgICAgID0gZ2V0X2JpdHMoJmdiLCBsb29rdXBfc2l6ZSk7CisgICAgICAgICAgICBoaWdoYml0ICAgICA9IDEgPDwgKGxvb2t1cF9zaXplIC0gMSk7CisgICAgICAgICAgICBsb3diaXRzICAgICA9IGhpZ2hiaXQgLSAxOworCisgICAgICAgICAgICBpZiAobG9va3VwICYgaGlnaGJpdCkKKyAgICAgICAgICAgICAgICBsb29rdXAgXj0gaGlnaGJpdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBoaWdoYml0ID0gMDsKKworICAgICAgICAgICAgaWYgKGxvb2t1cCA9PSBsb3diaXRzKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gZ2V0X3NiaXRzKCZnYiwgMTYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcHJlZGljdF9pbmRleCwgZGlmZjsKKworICAgICAgICAgICAgICAgIHByZWRpY3RfaW5kZXggPSAobG9va3VwIDw8ICg3IC0gbG9va3VwX3NpemUpKSB8IChzdGVwX2luZGV4IDw8IDYpOworICAgICAgICAgICAgICAgIHByZWRpY3RfaW5kZXggPSBhdl9jbGlwKHByZWRpY3RfaW5kZXgsIDAsIDU3ODUpOworICAgICAgICAgICAgICAgIGRpZmYgICAgICAgICAgPSBwcmVkaWN0X3RhYmxlW3ByZWRpY3RfaW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChsb29rdXApCisgICAgICAgICAgICAgICAgICAgIGRpZmYgKz0gZmZfYWRwY21fc3RlcF90YWJsZVtzdGVwX2luZGV4XSA+PiAobG9va3VwX3NpemUgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAoaGlnaGJpdCkKKyAgICAgICAgICAgICAgICAgICAgZGlmZiA9IC1kaWZmOworCisgICAgICAgICAgICAgICAgb3V0cHV0ID0gYXZfY2xpcF9pbnQxNihvdXRwdXQgKyBkaWZmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKmRlc3QgPSBvdXRwdXQ7CisgICAgICAgICAgICBkZXN0ICs9IGNoYW5uZWxzOworCisgICAgICAgICAgICBzdGVwX2luZGV4ICs9IHN0ZXBfaW5kZXhfdGFibGVzW2xvb2t1cF9zaXplIC0gMl1bbG9va3VwXTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfYWRwY21fdmltYV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAiYWRwY21fdmltYSIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMdWNhc0FydHMgVklNQSBhdWRpbyIpLAorICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX1ZJTUEsCisgICAgLmluaXQgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyA9IENPREVDX0NBUF9EUjEsCit9OworCitBVkNvZGVjIGZmX3ZpbWFfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gInZpbWEiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTHVjYXNBcnRzIFZJTUEgYXVkaW8iKSwKKyAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9WSU1BLAorICAgIC5pbml0ICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZtZGF1ZGlvLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92bWRhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTBmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92bWRhdWRpby5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogU2llcnJhIFZNRCBhdWRpbyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNpZXJyYSBWTUQgYXVkaW8gZGVjb2RlcgorICogYnkgVmxhZGltaXIgIlZBRyIgR25ldXNoZXYgKHZhZ3NvZnQgYXQgbWFpbC5ydSkKKyAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBTaWVycmEgVk1EIGZvcm1hdCwgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzLworICoKKyAqIFRoZSBhdWRpbyBkZWNvZGVyLCBleHBlY3RzIGVhY2ggZW5jb2RlZCBkYXRhCisgKiBjaHVuayB0byBiZSBwcmVwZW5kZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgMTYtYnl0ZSBmcmFtZSBpbmZvcm1hdGlvbgorICogcmVjb3JkIGZyb20gdGhlIFZNRCBmaWxlLiBJdCBkb2VzIG5vdCByZXF1aXJlIHRoZSAweDMzMC1ieXRlIFZNRCBmaWxlCisgKiBoZWFkZXIsIGJ1dCBpdCBkb2VzIG5lZWQgdGhlIGF1ZGlvIHNldHVwIHBhcmFtZXRlcnMgcGFzc2VkIGluIHRocm91Z2gKKyAqIG5vcm1hbCBsaWJhdmNvZGVjIEFQSSBtZWFucy4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgQkxPQ0tfVFlQRV9BVURJTyAgICAxCisjZGVmaW5lIEJMT0NLX1RZUEVfSU5JVElBTCAgMgorI2RlZmluZSBCTE9DS19UWVBFX1NJTEVOQ0UgIDMKKwordHlwZWRlZiBzdHJ1Y3QgVm1kQXVkaW9Db250ZXh0IHsKKyAgICBpbnQgb3V0X2JwczsKKyAgICBpbnQgY2h1bmtfc2l6ZTsKK30gVm1kQXVkaW9Db250ZXh0OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgdm1kYXVkaW9fdGFibGVbMTI4XSA9IHsKKyAgICAweDAwMCwgMHgwMDgsIDB4MDEwLCAweDAyMCwgMHgwMzAsIDB4MDQwLCAweDA1MCwgMHgwNjAsIDB4MDcwLCAweDA4MCwKKyAgICAweDA5MCwgMHgwQTAsIDB4MEIwLCAweDBDMCwgMHgwRDAsIDB4MEUwLCAweDBGMCwgMHgxMDAsIDB4MTEwLCAweDEyMCwKKyAgICAweDEzMCwgMHgxNDAsIDB4MTUwLCAweDE2MCwgMHgxNzAsIDB4MTgwLCAweDE5MCwgMHgxQTAsIDB4MUIwLCAweDFDMCwKKyAgICAweDFEMCwgMHgxRTAsIDB4MUYwLCAweDIwMCwgMHgyMDgsIDB4MjEwLCAweDIxOCwgMHgyMjAsIDB4MjI4LCAweDIzMCwKKyAgICAweDIzOCwgMHgyNDAsIDB4MjQ4LCAweDI1MCwgMHgyNTgsIDB4MjYwLCAweDI2OCwgMHgyNzAsIDB4Mjc4LCAweDI4MCwKKyAgICAweDI4OCwgMHgyOTAsIDB4Mjk4LCAweDJBMCwgMHgyQTgsIDB4MkIwLCAweDJCOCwgMHgyQzAsIDB4MkM4LCAweDJEMCwKKyAgICAweDJEOCwgMHgyRTAsIDB4MkU4LCAweDJGMCwgMHgyRjgsIDB4MzAwLCAweDMwOCwgMHgzMTAsIDB4MzE4LCAweDMyMCwKKyAgICAweDMyOCwgMHgzMzAsIDB4MzM4LCAweDM0MCwgMHgzNDgsIDB4MzUwLCAweDM1OCwgMHgzNjAsIDB4MzY4LCAweDM3MCwKKyAgICAweDM3OCwgMHgzODAsIDB4Mzg4LCAweDM5MCwgMHgzOTgsIDB4M0EwLCAweDNBOCwgMHgzQjAsIDB4M0I4LCAweDNDMCwKKyAgICAweDNDOCwgMHgzRDAsIDB4M0Q4LCAweDNFMCwgMHgzRTgsIDB4M0YwLCAweDNGOCwgMHg0MDAsIDB4NDQwLCAweDQ4MCwKKyAgICAweDRDMCwgMHg1MDAsIDB4NTQwLCAweDU4MCwgMHg1QzAsIDB4NjAwLCAweDY0MCwgMHg2ODAsIDB4NkMwLCAweDcwMCwKKyAgICAweDc0MCwgMHg3ODAsIDB4N0MwLCAweDgwMCwgMHg5MDAsIDB4QTAwLCAweEIwMCwgMHhDMDAsIDB4RDAwLCAweEUwMCwKKyAgICAweEYwMCwgMHgxMDAwLCAweDE0MDAsIDB4MTgwMCwgMHgxQzAwLCAweDIwMDAsIDB4MzAwMCwgMHg0MDAwCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgdm1kYXVkaW9fZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZtZEF1ZGlvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDwgMSB8fCBhdmN0eC0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoYXZjdHgtPmJsb2NrX2FsaWduIDwgMSB8fCBhdmN0eC0+YmxvY2tfYWxpZ24gJSBhdmN0eC0+Y2hhbm5lbHMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGJsb2NrIGFsaWduXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBhdmN0eC0+Y2hhbm5lbHMgPT0gMSA/IEFWX0NIX0xBWU9VVF9NT05PIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU87CisKKyAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNikKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKyAgICBlbHNlCisgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9VODsKKyAgICBzLT5vdXRfYnBzID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoYXZjdHgtPnNhbXBsZV9mbXQpOworCisgICAgcy0+Y2h1bmtfc2l6ZSA9IGF2Y3R4LT5ibG9ja19hbGlnbiArIGF2Y3R4LT5jaGFubmVscyAqIChzLT5vdXRfYnBzID09IDIpOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIlZCBjaGFubmVscywgJWQgYml0cy9zYW1wbGUsICIKKyAgICAgICAgICAgImJsb2NrIGFsaWduID0gJWQsIHNhbXBsZSByYXRlID0gJWRcbiIsCisgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscywgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSwgYXZjdHgtPmJsb2NrX2FsaWduLAorICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9hdWRpb19zMTYoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKQoreworICAgIGludCBjaDsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisgICAgaW50IHByZWRpY3RvclsyXTsKKyAgICBpbnQgc3QgPSBjaGFubmVscyAtIDE7CisKKyAgICAvKiBkZWNvZGUgaW5pdGlhbCByYXcgc2FtcGxlICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgcHJlZGljdG9yW2NoXSA9IChpbnQxNl90KUFWX1JMMTYoYnVmKTsKKyAgICAgICAgYnVmICs9IDI7CisgICAgICAgICpvdXQrKyA9IHByZWRpY3RvcltjaF07CisgICAgfQorCisgICAgLyogZGVjb2RlIERQQ00gc2FtcGxlcyAqLworICAgIGNoID0gMDsKKyAgICB3aGlsZSAoYnVmIDwgYnVmX2VuZCkgeworICAgICAgICB1aW50OF90IGIgPSAqYnVmKys7CisgICAgICAgIGlmIChiICYgMHg4MCkKKyAgICAgICAgICAgIHByZWRpY3RvcltjaF0gLT0gdm1kYXVkaW9fdGFibGVbYiAmIDB4N0ZdOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmVkaWN0b3JbY2hdICs9IHZtZGF1ZGlvX3RhYmxlW2JdOworICAgICAgICBwcmVkaWN0b3JbY2hdID0gYXZfY2xpcF9pbnQxNihwcmVkaWN0b3JbY2hdKTsKKyAgICAgICAgKm91dCsrID0gcHJlZGljdG9yW2NoXTsKKyAgICAgICAgY2ggXj0gc3Q7CisgICAgfQorfQorCitzdGF0aWMgaW50IHZtZGF1ZGlvX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQ7CisgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CisgICAgVm1kQXVkaW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgYmxvY2tfdHlwZSwgc2lsZW50X2NodW5rcywgYXVkaW9fY2h1bmtzOworICAgIGludCByZXQ7CisgICAgdWludDhfdCAqb3V0cHV0X3NhbXBsZXNfdTg7CisgICAgaW50MTZfdCAqb3V0cHV0X3NhbXBsZXNfczE2OworCisgICAgaWYgKGJ1Zl9zaXplIDwgMTYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgInNraXBwaW5nIHNtYWxsIGp1bmsgcGFja2V0XG4iKTsKKyAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgYmxvY2tfdHlwZSA9IGJ1Zls2XTsKKyAgICBpZiAoYmxvY2tfdHlwZSA8IEJMT0NLX1RZUEVfQVVESU8gfHwgYmxvY2tfdHlwZSA+IEJMT0NLX1RZUEVfU0lMRU5DRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInVua25vd24gYmxvY2sgdHlwZTogJWRcbiIsIGJsb2NrX3R5cGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBidWYgICAgICArPSAxNjsKKyAgICBidWZfc2l6ZSAtPSAxNjsKKworICAgIC8qIGdldCBudW1iZXIgb2Ygc2lsZW50IGNodW5rcyAqLworICAgIHNpbGVudF9jaHVua3MgPSAwOworICAgIGlmIChibG9ja190eXBlID09IEJMT0NLX1RZUEVfSU5JVElBTCkgeworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgNCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwYWNrZXQgaXMgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgICAgICAgICA9IEFWX1JCMzIoYnVmKTsKKyAgICAgICAgc2lsZW50X2NodW5rcyA9IGF2X3BvcGNvdW50KGZsYWdzKTsKKyAgICAgICAgYnVmICAgICAgKz0gNDsKKyAgICAgICAgYnVmX3NpemUgLT0gNDsKKyAgICB9IGVsc2UgaWYgKGJsb2NrX3R5cGUgPT0gQkxPQ0tfVFlQRV9TSUxFTkNFKSB7CisgICAgICAgIHNpbGVudF9jaHVua3MgPSAxOworICAgICAgICBidWZfc2l6ZSA9IDA7IC8vIHNob3VsZCBhbHJlYWR5IGJlIHplcm8gYnV0IHNldCBpdCBqdXN0IHRvIGJlIHN1cmUKKyAgICB9CisKKyAgICAvKiBlbnN1cmUgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggKi8KKyAgICBhdWRpb19jaHVua3MgPSBidWZfc2l6ZSAvIHMtPmNodW5rX3NpemU7CisKKyAgICAvKiBkcm9wIGluY29tcGxldGUgY2h1bmtzICovCisgICAgYnVmX3NpemUgICAgID0gYXVkaW9fY2h1bmtzICogcy0+Y2h1bmtfc2l6ZTsKKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSAoKHNpbGVudF9jaHVua3MgKyBhdWRpb19jaHVua3MpICogYXZjdHgtPmJsb2NrX2FsaWduKSAvCisgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHM7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBvdXRwdXRfc2FtcGxlc191OCAgPSAgICAgICAgICAgIGZyYW1lLT5kYXRhWzBdOworICAgIG91dHB1dF9zYW1wbGVzX3MxNiA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICAvKiBkZWNvZGUgc2lsZW50IGNodW5rcyAqLworICAgIGlmIChzaWxlbnRfY2h1bmtzID4gMCkgeworICAgICAgICBpbnQgc2lsZW50X3NpemUgPSBhdmN0eC0+YmxvY2tfYWxpZ24gKiBzaWxlbnRfY2h1bmtzOworICAgICAgICBhdl9hc3NlcnQwKGF2Y3R4LT5ibG9ja19hbGlnbiAqIHNpbGVudF9jaHVua3MgPD0gZnJhbWUtPm5iX3NhbXBsZXMgKiBhdmN0eC0+Y2hhbm5lbHMpOworCisgICAgICAgIGlmIChzLT5vdXRfYnBzID09IDIpIHsKKyAgICAgICAgICAgIG1lbXNldChvdXRwdXRfc2FtcGxlc19zMTYsIDB4MDAsIHNpbGVudF9zaXplICogMik7CisgICAgICAgICAgICBvdXRwdXRfc2FtcGxlc19zMTYgKz0gc2lsZW50X3NpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQob3V0cHV0X3NhbXBsZXNfdTgsICAweDgwLCBzaWxlbnRfc2l6ZSk7CisgICAgICAgICAgICBvdXRwdXRfc2FtcGxlc191OCArPSBzaWxlbnRfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGRlY29kZSBhdWRpbyBjaHVua3MgKi8KKyAgICBpZiAoYXVkaW9fY2h1bmtzID4gMCkgeworICAgICAgICBidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisgICAgICAgIGF2X2Fzc2VydDAoKGJ1Zl9zaXplICYgKGF2Y3R4LT5jaGFubmVscyA+IDEpKSA9PSAwKTsKKyAgICAgICAgd2hpbGUgKGJ1Zl9lbmQgLSBidWYgPj0gcy0+Y2h1bmtfc2l6ZSkgeworICAgICAgICAgICAgaWYgKHMtPm91dF9icHMgPT0gMikgeworICAgICAgICAgICAgICAgIGRlY29kZV9hdWRpb19zMTYob3V0cHV0X3NhbXBsZXNfczE2LCBidWYsIHMtPmNodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgIG91dHB1dF9zYW1wbGVzX3MxNiArPSBhdmN0eC0+YmxvY2tfYWxpZ247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweShvdXRwdXRfc2FtcGxlc191OCwgYnVmLCBzLT5jaHVua19zaXplKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRfc2FtcGxlc191OCAgKz0gYXZjdHgtPmJsb2NrX2FsaWduOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmICs9IHMtPmNodW5rX3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfdm1kYXVkaW9fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidm1kYXVkaW8iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTaWVycmEgVk1EIGF1ZGlvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZNREFVRElPLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWbWRBdWRpb0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHZtZGF1ZGlvX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IHZtZGF1ZGlvX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZtZHZpZGVvLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92bWR2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMGZiZTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92bWR2aWRlby5jCkBAIC0wLDAgKzEsNDcyIEBACisvKgorICogU2llcnJhIFZNRCB2aWRlbyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNpZXJyYSBWTUQgdmlkZW8gZGVjb2RlcgorICogYnkgVmxhZGltaXIgIlZBRyIgR25ldXNoZXYgKHZhZ3NvZnQgYXQgbWFpbC5ydSkKKyAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBTaWVycmEgVk1EIGZvcm1hdCwgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzLworICoKKyAqIFRoZSB2aWRlbyBkZWNvZGVyIG91dHB1dHMgUEFMOCBjb2xvcnNwYWNlIGRhdGEuIFRoZSBkZWNvZGVyIGV4cGVjdHMKKyAqIGEgMHgzMzAtYnl0ZSBWTUQgZmlsZSBoZWFkZXIgdG8gYmUgdHJhbnNtaXR0ZWQgdmlhIGV4dHJhZGF0YSBkdXJpbmcKKyAqIGNvZGVjIGluaXRpYWxpemF0aW9uLiBFYWNoIGVuY29kZWQgZnJhbWUgdGhhdCBpcyBzZW50IHRvIHRoaXMgZGVjb2RlcgorICogaXMgZXhwZWN0ZWQgdG8gYmUgcHJlcGVuZGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIDE2LWJ5dGUgZnJhbWUKKyAqIGluZm9ybWF0aW9uIHJlY29yZCBmcm9tIHRoZSBWTUQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorCisjZGVmaW5lIFZNRF9IRUFERVJfU0laRSAweDMzMAorI2RlZmluZSBQQUxFVFRFX0NPVU5UIDI1NgorCit0eXBlZGVmIHN0cnVjdCBWbWRWaWRlb0NvbnRleHQgeworCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRnJhbWUgKnByZXZfZnJhbWU7CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgaW50IHNpemU7CisKKyAgICB1bnNpZ25lZCBjaGFyIHBhbGV0dGVbUEFMRVRURV9DT1VOVCAqIDRdOworICAgIHVuc2lnbmVkIGNoYXIgKnVucGFja19idWZmZXI7CisgICAgaW50IHVucGFja19idWZmZXJfc2l6ZTsKKworICAgIGludCB4X29mZiwgeV9vZmY7Cit9IFZtZFZpZGVvQ29udGV4dDsKKworI2RlZmluZSBRVUVVRV9TSVpFIDB4MTAwMAorI2RlZmluZSBRVUVVRV9NQVNLIDB4MEZGRgorCitzdGF0aWMgaW50IGx6X3VucGFjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBkZXN0X2xlbikKK3sKKyAgICB1bnNpZ25lZCBjaGFyICpkOworICAgIHVuc2lnbmVkIGNoYXIgKmRfZW5kOworICAgIHVuc2lnbmVkIGNoYXIgcXVldWVbUVVFVUVfU0laRV07CisgICAgdW5zaWduZWQgaW50IHFwb3M7CisgICAgdW5zaWduZWQgaW50IGRhdGFsZWZ0OworICAgIHVuc2lnbmVkIGludCBjaGFpbm9mczsKKyAgICB1bnNpZ25lZCBpbnQgY2hhaW5sZW47CisgICAgdW5zaWduZWQgaW50IHNwZWNsZW47CisgICAgdW5zaWduZWQgY2hhciB0YWc7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgc3JjLCBzcmNfbGVuKTsKKyAgICBkID0gZGVzdDsKKyAgICBkX2VuZCA9IGQgKyBkZXN0X2xlbjsKKyAgICBkYXRhbGVmdCA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgbWVtc2V0KHF1ZXVlLCAweDIwLCBRVUVVRV9TSVpFKTsKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IDQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChieXRlc3RyZWFtMl9wZWVrX2xlMzIoJmdiKSA9PSAweDU2NzgxMjM0KSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgNCk7CisgICAgICAgIHFwb3MgPSAweDExMTsKKyAgICAgICAgc3BlY2xlbiA9IDB4RiArIDM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcXBvcyA9IDB4RkVFOworICAgICAgICBzcGVjbGVuID0gMTAwOyAgLyogbm8gc3BlY2xlbiAqLworICAgIH0KKworICAgIHdoaWxlIChkYXRhbGVmdCA+IDAgJiYgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA+IDApIHsKKyAgICAgICAgdGFnID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgIGlmICgodGFnID09IDB4RkYpICYmIChkYXRhbGVmdCA+IDgpKSB7CisgICAgICAgICAgICBpZiAoZF9lbmQgLSBkIDwgOCB8fCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBxdWV1ZVtxcG9zKytdID0gKmQrKyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOworICAgICAgICAgICAgICAgIHFwb3MgJj0gUVVFVUVfTUFTSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGFsZWZ0IC09IDg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGFsZWZ0ID09IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICh0YWcgJiAweDAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkX2VuZCAtIGQgPCAxIHx8IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIHF1ZXVlW3Fwb3MrK10gPSAqZCsrID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgICAgICAgICAgICAgIHFwb3MgJj0gUVVFVUVfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgZGF0YWxlZnQtLTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjaGFpbm9mcyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgICAgICAgICAgICAgIGNoYWlub2ZzIHw9ICgoYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZnYikgJiAweEYwKSA8PCA0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhaW5sZW4gPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSAmIDB4MEYpICsgMzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYWlubGVuID09IHNwZWNsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYWlubGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSArIDB4RiArIDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfZW5kIC0gZCA8IGNoYWlubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFpbmxlbjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZCA9IHF1ZXVlW2NoYWlub2ZzKysgJiBRVUVVRV9NQVNLXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlW3Fwb3MrK10gPSAqZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgcXBvcyAmPSBRVUVVRV9NQVNLOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRhdGFsZWZ0IC09IGNoYWlubGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0YWcgPj49IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGQgLSBkZXN0OworfQorc3RhdGljIGludCBybGVfdW5wYWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvdW50LCBpbnQgc3JjX3NpemUsIGludCBkZXN0X2xlbikKK3sKKyAgICB1bnNpZ25lZCBjaGFyICpwZDsKKyAgICBpbnQgaSwgbCwgdXNlZCA9IDA7CisgICAgdW5zaWduZWQgY2hhciAqZGVzdF9lbmQgPSBkZXN0ICsgZGVzdF9sZW47CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgdWludDE2X3QgcnVuX3ZhbDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBzcmMsIHNyY19zaXplKTsKKyAgICBwZCA9IGRlc3Q7CisgICAgaWYgKHNyY19jb3VudCAmIDEpIHsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCAxKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICpwZCsrID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgIHVzZWQrKzsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBsID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgIGlmIChsICYgMHg4MCkgeworICAgICAgICAgICAgbCA9IChsICYgMHg3RikgKiAyOworICAgICAgICAgICAgaWYgKGRlc3RfZW5kIC0gcGQgPCBsIHx8IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCBsKQorICAgICAgICAgICAgICAgIHJldHVybiBieXRlc3RyZWFtMl90ZWxsKCZnYik7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVydSgmZ2IsIHBkLCBsKTsKKyAgICAgICAgICAgIHBkICs9IGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZGVzdF9lbmQgLSBwZCA8IDIqbCB8fCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgMikKKyAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpOworICAgICAgICAgICAgcnVuX3ZhbCA9IGJ5dGVzdHJlYW0yX2dldF9uZTE2KCZnYik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQVZfV04xNihwZCwgcnVuX3ZhbCk7CisgICAgICAgICAgICAgICAgcGQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGwgKj0gMjsKKyAgICAgICAgfQorICAgICAgICB1c2VkICs9IGw7CisgICAgfSB3aGlsZSAodXNlZCA8IHNyY19jb3VudCk7CisKKyAgICByZXR1cm4gYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpOworfQorCitzdGF0aWMgaW50IHZtZF9kZWNvZGUoVm1kVmlkZW9Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBpbnQgKnBhbGV0dGUzMjsKKyAgICB1bnNpZ25lZCBjaGFyIHIsIGcsIGI7CisKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKworICAgIHVuc2lnbmVkIGNoYXIgbWV0aDsKKyAgICB1bnNpZ25lZCBjaGFyICpkcDsgICAvKiBwb2ludGVyIHRvIGN1cnJlbnQgZnJhbWUgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpwcDsgICAvKiBwb2ludGVyIHRvIHByZXZpb3VzIGZyYW1lICovCisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgaW50IG9mczsKKworICAgIGludCBmcmFtZV94LCBmcmFtZV95OworICAgIGludCBmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0OworCisgICAgZnJhbWVfeCA9IEFWX1JMMTYoJnMtPmJ1Zls2XSk7CisgICAgZnJhbWVfeSA9IEFWX1JMMTYoJnMtPmJ1Zls4XSk7CisgICAgZnJhbWVfd2lkdGggPSBBVl9STDE2KCZzLT5idWZbMTBdKSAtIGZyYW1lX3ggKyAxOworICAgIGZyYW1lX2hlaWdodCA9IEFWX1JMMTYoJnMtPmJ1ZlsxMl0pIC0gZnJhbWVfeSArIDE7CisKKyAgICBpZiAoKGZyYW1lX3dpZHRoID09IHMtPmF2Y3R4LT53aWR0aCAmJiBmcmFtZV9oZWlnaHQgPT0gcy0+YXZjdHgtPmhlaWdodCkgJiYKKyAgICAgICAgKGZyYW1lX3ggfHwgZnJhbWVfeSkpIHsKKworICAgICAgICBzLT54X29mZiA9IGZyYW1lX3g7CisgICAgICAgIHMtPnlfb2ZmID0gZnJhbWVfeTsKKyAgICB9CisgICAgZnJhbWVfeCAtPSBzLT54X29mZjsKKyAgICBmcmFtZV95IC09IHMtPnlfb2ZmOworCisgICAgaWYgKGZyYW1lX3ggPCAwIHx8IGZyYW1lX3dpZHRoIDwgMCB8fAorICAgICAgICBmcmFtZV94ID49IHMtPmF2Y3R4LT53aWR0aCB8fAorICAgICAgICBmcmFtZV93aWR0aCA+IHMtPmF2Y3R4LT53aWR0aCB8fAorICAgICAgICBmcmFtZV94ICsgZnJhbWVfd2lkdGggPiBzLT5hdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBob3Jpem9udGFsIHJhbmdlICVkLSVkXG4iLAorICAgICAgICAgICAgICAgZnJhbWVfeCwgZnJhbWVfd2lkdGgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGZyYW1lX3kgPCAwIHx8IGZyYW1lX2hlaWdodCA8IDAgfHwKKyAgICAgICAgZnJhbWVfeSA+PSBzLT5hdmN0eC0+aGVpZ2h0IHx8CisgICAgICAgIGZyYW1lX2hlaWdodCA+IHMtPmF2Y3R4LT5oZWlnaHQgfHwKKyAgICAgICAgZnJhbWVfeSArIGZyYW1lX2hlaWdodCA+IHMtPmF2Y3R4LT5oZWlnaHQpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCB2ZXJ0aWNhbCByYW5nZSAlZC0lZFxuIiwKKyAgICAgICAgICAgICAgIGZyYW1lX3gsIGZyYW1lX3dpZHRoKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogaWYgb25seSBhIGNlcnRhaW4gcmVnaW9uIHdpbGwgYmUgdXBkYXRlZCwgY29weSB0aGUgZW50aXJlIHByZXZpb3VzCisgICAgICogZnJhbWUgYmVmb3JlIHRoZSBkZWNvZGUgKi8KKyAgICBpZiAocy0+cHJldl9mcmFtZS0+ZGF0YVswXSAmJgorICAgICAgICAoZnJhbWVfeCB8fCBmcmFtZV95IHx8IChmcmFtZV93aWR0aCAhPSBzLT5hdmN0eC0+d2lkdGgpIHx8CisgICAgICAgIChmcmFtZV9oZWlnaHQgIT0gcy0+YXZjdHgtPmhlaWdodCkpKSB7CisKKyAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzBdLCBzLT5wcmV2X2ZyYW1lLT5kYXRhWzBdLAorICAgICAgICAgICAgcy0+YXZjdHgtPmhlaWdodCAqIGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgYSBuZXcgcGFsZXR0ZSAqLworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBzLT5idWYgKyAxNiwgcy0+c2l6ZSAtIDE2KTsKKyAgICBpZiAocy0+YnVmWzE1XSAmIDB4MDIpIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDIpOworICAgICAgICBwYWxldHRlMzIgPSAodW5zaWduZWQgaW50ICopcy0+cGFsZXR0ZTsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPj0gUEFMRVRURV9DT1VOVCAqIDMpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQQUxFVFRFX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgICAgICByID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYikgKiA0OworICAgICAgICAgICAgICAgIGcgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKSAqIDQ7CisgICAgICAgICAgICAgICAgYiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpICogNDsKKyAgICAgICAgICAgICAgICBwYWxldHRlMzJbaV0gPSAweEZGVSA8PCAyNCB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgKGIpOworICAgICAgICAgICAgICAgIHBhbGV0dGUzMltpXSB8PSBwYWxldHRlMzJbaV0gPj4gNiAmIDB4MzAzMDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29tcGxldGUgcGFsZXR0ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcy0+c2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBvcmlnaW5hbGx5IFVucGFja0ZyYW1lIGluIFZBRydzIGNvZGUgKi8KKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIG1ldGggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICBpZiAobWV0aCAmIDB4ODApIHsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGlmICghcy0+dW5wYWNrX2J1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVHJ5aW5nIHRvIHVucGFjayBMWi1jb21wcmVzc2VkIGZyYW1lIHdpdGggbm8gTFogYnVmZmVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHNpemUgPSBsel91bnBhY2soZ2IuYnVmZmVyLCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnVucGFja19idWZmZXIsIHMtPnVucGFja19idWZmZXJfc2l6ZSk7CisgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICBtZXRoICY9IDB4N0Y7CisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBzLT51bnBhY2tfYnVmZmVyLCBzaXplKTsKKyAgICB9CisKKyAgICBkcCA9ICZmcmFtZS0+ZGF0YVswXVtmcmFtZV95ICogZnJhbWUtPmxpbmVzaXplWzBdICsgZnJhbWVfeF07CisgICAgcHAgPSAmcy0+cHJldl9mcmFtZS0+ZGF0YVswXVtmcmFtZV95ICogcy0+cHJldl9mcmFtZS0+bGluZXNpemVbMF0gKyBmcmFtZV94XTsKKyAgICBzd2l0Y2ggKG1ldGgpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgb2ZzID0gMDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICAgICAgICAgIGlmIChsZW4gJiAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IChsZW4gJiAweDdGKSArIDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZnMgKyBsZW4gPiBmcmFtZV93aWR0aCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IGxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVydSgmZ2IsICZkcFtvZnNdLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBvZnMgKz0gbGVuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGludGVyZnJhbWUgcGl4ZWwgY29weSAqLworICAgICAgICAgICAgICAgICAgICBpZiAob2ZzICsgbGVuICsgMSA+IGZyYW1lX3dpZHRoIHx8ICFzLT5wcmV2X2ZyYW1lLT5kYXRhWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmZHBbb2ZzXSwgJnBwW29mc10sIGxlbiArIDEpOworICAgICAgICAgICAgICAgICAgICBvZnMgKz0gbGVuICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChvZnMgPCBmcmFtZV93aWR0aCk7CisgICAgICAgICAgICBpZiAob2ZzID4gZnJhbWVfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCA+IHdpZHRoICglZCA+ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgb2ZzLCBmcmFtZV93aWR0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkcCArPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICBwcCArPSBzLT5wcmV2X2ZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lX2hlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnYiwgZHAsIGZyYW1lX3dpZHRoKTsKKyAgICAgICAgICAgIGRwICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIHBwICs9IHMtPnByZXZfZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVfaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIG9mcyA9IDA7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuICYgMHg4MCkgeworICAgICAgICAgICAgICAgICAgICBsZW4gPSAobGVuICYgMHg3RikgKyAxOworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZnYikgPT0gMHhGRikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNsZW4gPSBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmxlX3VucGFjayhnYi5idWZmZXIsICZkcFtvZnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3dpZHRoIC0gb2ZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBzbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnYiwgJmRwW29mc10sIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gbGVuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJmcmFtZSBwaXhlbCBjb3B5ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChvZnMgKyBsZW4gKyAxID4gZnJhbWVfd2lkdGggfHwgIXMtPnByZXZfZnJhbWUtPmRhdGFbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZkcFtvZnNdLCAmcHBbb2ZzXSwgbGVuICsgMSk7CisgICAgICAgICAgICAgICAgICAgIG9mcyArPSBsZW4gKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKG9mcyA8IGZyYW1lX3dpZHRoKTsKKyAgICAgICAgICAgIGlmIChvZnMgPiBmcmFtZV93aWR0aCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ID4gd2lkdGggKCVkID4gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBvZnMsIGZyYW1lX3dpZHRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRwICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIHBwICs9IHMtPnByZXZfZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHZtZHZpZGVvX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZtZFZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2X2ZyYW1lKTsKKyAgICBhdl9mcmVlcCgmcy0+dW5wYWNrX2J1ZmZlcik7CisgICAgcy0+dW5wYWNrX2J1ZmZlcl9zaXplID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdm1kdmlkZW9fZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZtZFZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgaW50ICpwYWxldHRlMzI7CisgICAgaW50IHBhbGV0dGVfaW5kZXggPSAwOworICAgIHVuc2lnbmVkIGNoYXIgciwgZywgYjsKKyAgICB1bnNpZ25lZCBjaGFyICp2bWRfaGVhZGVyOworICAgIHVuc2lnbmVkIGNoYXIgKnJhd19wYWxldHRlOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKworICAgIC8qIG1ha2Ugc3VyZSB0aGUgVk1EIGhlYWRlciBtYWRlIGl0ICovCisgICAgaWYgKHMtPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAhPSBWTURfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJleHBlY3RlZCBleHRyYWRhdGEgc2l6ZSBvZiAlZFxuIiwKKyAgICAgICAgICAgIFZNRF9IRUFERVJfU0laRSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICB2bWRfaGVhZGVyID0gKHVuc2lnbmVkIGNoYXIgKilhdmN0eC0+ZXh0cmFkYXRhOworCisgICAgcy0+dW5wYWNrX2J1ZmZlcl9zaXplID0gQVZfUkwzMigmdm1kX2hlYWRlcls4MDBdKTsKKyAgICBpZiAocy0+dW5wYWNrX2J1ZmZlcl9zaXplKSB7CisgICAgICAgIHMtPnVucGFja19idWZmZXIgPSBhdl9tYWxsb2Mocy0+dW5wYWNrX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgaWYgKCFzLT51bnBhY2tfYnVmZmVyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICAvKiBsb2FkIHVwIHRoZSBpbml0aWFsIHBhbGV0dGUgKi8KKyAgICByYXdfcGFsZXR0ZSA9ICZ2bWRfaGVhZGVyWzI4XTsKKyAgICBwYWxldHRlMzIgPSAodW5zaWduZWQgaW50ICopcy0+cGFsZXR0ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUEFMRVRURV9DT1VOVDsgaSsrKSB7CisgICAgICAgIHIgPSByYXdfcGFsZXR0ZVtwYWxldHRlX2luZGV4KytdICogNDsKKyAgICAgICAgZyA9IHJhd19wYWxldHRlW3BhbGV0dGVfaW5kZXgrK10gKiA0OworICAgICAgICBiID0gcmF3X3BhbGV0dGVbcGFsZXR0ZV9pbmRleCsrXSAqIDQ7CisgICAgICAgIHBhbGV0dGUzMltpXSA9IDB4RkZVIDw8IDI0IHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYik7CisgICAgICAgIHBhbGV0dGUzMltpXSB8PSBwYWxldHRlMzJbaV0gPj4gNiAmIDB4MzAzMDM7CisgICAgfQorCisgICAgcy0+cHJldl9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5wcmV2X2ZyYW1lKSB7CisgICAgICAgIHZtZHZpZGVvX2RlY29kZV9lbmQoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZtZHZpZGVvX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBWbWRWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgcy0+YnVmID0gYnVmOworICAgIHMtPnNpemUgPSBidWZfc2l6ZTsKKworICAgIGlmIChidWZfc2l6ZSA8IDE2KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IHZtZF9kZWNvZGUocywgZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBtYWtlIHRoZSBwYWxldHRlIGF2YWlsYWJsZSBvbiB0aGUgd2F5IG91dCAqLworICAgIG1lbWNweShmcmFtZS0+ZGF0YVsxXSwgcy0+cGFsZXR0ZSwgUEFMRVRURV9DT1VOVCAqIDQpOworCisgICAgLyogc2h1ZmZsZSBmcmFtZXMgKi8KKyAgICBhdl9mcmFtZV91bnJlZihzLT5wcmV2X2ZyYW1lKTsKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihzLT5wcmV2X2ZyYW1lLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWUgICAgICA9IDE7CisKKyAgICAvKiByZXBvcnQgdGhhdCB0aGUgYnVmZmVyIHdhcyBjb21wbGV0ZWx5IGNvbnN1bWVkICovCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitBVkNvZGVjIGZmX3ZtZHZpZGVvX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZtZHZpZGVvIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2llcnJhIFZNRCB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WTURWSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVm1kVmlkZW9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2bWR2aWRlb19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB2bWR2aWRlb19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHZtZHZpZGVvX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZtbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZtbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmJkNTJlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm1uYy5jCkBAIC0wLDAgKzEsNTc3IEBACisvKgorICogVk13YXJlIFNjcmVlbiBDb2RlYyAoVk1uYykgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA2IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVk13YXJlIFNjcmVlbiBDb2RlYyAoVk1uYykgZGVjb2RlcgorICogQXMgQWxleCBCZXJlZ3N6YXN6aSBkaXNjb3ZlcmVkLCB0aGlzIGlzIGVmZmVjdGl2ZWx5IFJGQiBkYXRhIGR1bXAKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorCitlbnVtIEVuY1R5cGVzIHsKKyAgICBNQUdJQ19XTVZkID0gMHg1NzRENTY2NCwKKyAgICBNQUdJQ19XTVZlLAorICAgIE1BR0lDX1dNVmYsCisgICAgTUFHSUNfV01WZywKKyAgICBNQUdJQ19XTVZoLAorICAgIE1BR0lDX1dNVmksCisgICAgTUFHSUNfV01WagorfTsKKworZW51bSBIZXhUaWxlX0ZsYWdzIHsKKyAgICBIVF9SQVcgPSAgMSwgLy8gdGlsZSBpcyByYXcKKyAgICBIVF9CS0cgPSAgMiwgLy8gYmFja2dyb3VuZCBjb2xvciBpcyBwcmVzZW50CisgICAgSFRfRkcgID0gIDQsIC8vIGZvcmVncm91bmQgY29sb3IgaXMgcHJlc2VudAorICAgIEhUX1NVQiA9ICA4LCAvLyBzdWJyZWN0cyBhcmUgcHJlc2VudAorICAgIEhUX0NMUiA9IDE2ICAvLyBlYWNoIHN1YnJlY3QgaGFzIG93biBjb2xvcgorfTsKKworLyoKKyAqIERlY29kZXIgY29udGV4dAorICovCit0eXBlZGVmIHN0cnVjdCBWbW5jQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRnJhbWUgKnBpYzsKKworICAgIGludCBicHA7CisgICAgaW50IGJwcDI7CisgICAgaW50IGJpZ2VuZGlhbjsKKyAgICB1aW50OF90IHBhbFs3NjhdOworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgLyogY3Vyc29yIGRhdGEgKi8KKyAgICBpbnQgY3VyX3csIGN1cl9oOworICAgIGludCBjdXJfeCwgY3VyX3k7CisgICAgaW50IGN1cl9oeCwgY3VyX2h5OworICAgIHVpbnQ4X3QgKmN1cmJpdHMsICpjdXJtYXNrOworICAgIHVpbnQ4X3QgKnNjcmVlbmR0YTsKK30gVm1uY0NvbnRleHQ7CisKKy8qIHJlYWQgcGl4ZWwgdmFsdWUgZnJvbSBzdHJlYW0gKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB2bW5jX2dldF9waXhlbChHZXRCeXRlQ29udGV4dCAqZ2IsIGludCBicHAsIGludCBiZSkKK3sKKyAgICBzd2l0Y2ggKGJwcCAqIDIgKyBiZSkgeworICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgY2FzZSA0OgorICAgICAgICByZXR1cm4gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgIGNhc2UgNToKKyAgICAgICAgcmV0dXJuIGJ5dGVzdHJlYW0yX2dldF9iZTE2KGdiKTsKKyAgICBjYXNlIDg6CisgICAgICAgIHJldHVybiBieXRlc3RyZWFtMl9nZXRfbGUzMihnYik7CisgICAgY2FzZSA5OgorICAgICAgICByZXR1cm4gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoZ2IpOworICAgIGRlZmF1bHQ6IHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbG9hZF9jdXJzb3IoVm1uY0NvbnRleHQgKmMpCit7CisgICAgaW50IGksIGosIHA7CisgICAgY29uc3QgaW50IGJwcCAgID0gYy0+YnBwMjsKKyAgICB1aW50OF90ICpkc3Q4ICAgPSAgICAgICAgICAgICBjLT5jdXJiaXRzOworICAgIHVpbnQxNl90ICpkc3QxNiA9ICh1aW50MTZfdCAqKWMtPmN1cmJpdHM7CisgICAgdWludDMyX3QgKmRzdDMyID0gKHVpbnQzMl90ICopYy0+Y3VyYml0czsKKworICAgIGZvciAoaiA9IDA7IGogPCBjLT5jdXJfaDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5jdXJfdzsgaSsrKSB7CisgICAgICAgICAgICBwID0gdm1uY19nZXRfcGl4ZWwoJmMtPmdiLCBicHAsIGMtPmJpZ2VuZGlhbik7CisgICAgICAgICAgICBpZiAoYnBwID09IDEpCisgICAgICAgICAgICAgICAgKmRzdDgrKyA9IHA7CisgICAgICAgICAgICBpZiAoYnBwID09IDIpCisgICAgICAgICAgICAgICAgKmRzdDE2KysgPSBwOworICAgICAgICAgICAgaWYgKGJwcCA9PSA0KQorICAgICAgICAgICAgICAgICpkc3QzMisrID0gcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBkc3Q4ICA9ICAgICAgICAgICAgYy0+Y3VybWFzazsKKyAgICBkc3QxNiA9ICh1aW50MTZfdCopYy0+Y3VybWFzazsKKyAgICBkc3QzMiA9ICh1aW50MzJfdCopYy0+Y3VybWFzazsKKyAgICBmb3IgKGogPSAwOyBqIDwgYy0+Y3VyX2g7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+Y3VyX3c7IGkrKykgeworICAgICAgICAgICAgcCA9IHZtbmNfZ2V0X3BpeGVsKCZjLT5nYiwgYnBwLCBjLT5iaWdlbmRpYW4pOworICAgICAgICAgICAgaWYgKGJwcCA9PSAxKQorICAgICAgICAgICAgICAgICpkc3Q4KysgPSBwOworICAgICAgICAgICAgaWYgKGJwcCA9PSAyKQorICAgICAgICAgICAgICAgICpkc3QxNisrID0gcDsKKyAgICAgICAgICAgIGlmIChicHAgPT0gNCkKKyAgICAgICAgICAgICAgICAqZHN0MzIrKyA9IHA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9jdXJzb3IodWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLCBWbW5jQ29udGV4dCAqYywgaW50IGR4LCBpbnQgZHkpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHcsIGgsIHgsIHk7CisgICAgdyA9IGMtPmN1cl93OworICAgIGlmIChjLT53aWR0aCA8IGMtPmN1cl94ICsgYy0+Y3VyX3cpCisgICAgICAgIHcgPSBjLT53aWR0aCAtIGMtPmN1cl94OworICAgIGggPSBjLT5jdXJfaDsKKyAgICBpZiAoYy0+aGVpZ2h0IDwgYy0+Y3VyX3kgKyBjLT5jdXJfaCkKKyAgICAgICAgaCA9IGMtPmhlaWdodCAtIGMtPmN1cl95OworICAgIHggPSBjLT5jdXJfeDsKKyAgICB5ID0gYy0+Y3VyX3k7CisgICAgaWYgKHggPCAwKSB7CisgICAgICAgIHcgKz0geDsKKyAgICAgICAgeCAgPSAwOworICAgIH0KKyAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgaCArPSB5OworICAgICAgICB5ICA9IDA7CisgICAgfQorCisgICAgaWYgKCh3IDwgMSkgfHwgKGggPCAxKSkKKyAgICAgICAgcmV0dXJuOworICAgIGRzdCArPSB4ICogYy0+YnBwMiArIHkgKiBzdHJpZGU7CisKKyAgICBpZiAoYy0+YnBwMiA9PSAxKSB7CisgICAgICAgIHVpbnQ4X3QgKmNkID0gYy0+Y3VyYml0cywgKm1zayA9IGMtPmN1cm1hc2s7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBoOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspCisgICAgICAgICAgICAgICAgZHN0W2ldID0gKGRzdFtpXSAmIGNkW2ldKSBeIG1za1tpXTsKKyAgICAgICAgICAgIG1zayArPSBjLT5jdXJfdzsKKyAgICAgICAgICAgIGNkICArPSBjLT5jdXJfdzsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMtPmJwcDIgPT0gMikgeworICAgICAgICB1aW50MTZfdCAqY2QgPSAodWludDE2X3QqKWMtPmN1cmJpdHMsICptc2sgPSAodWludDE2X3QqKWMtPmN1cm1hc2s7CisgICAgICAgIHVpbnQxNl90ICpkc3QyOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgICAgICBkc3QyID0gKHVpbnQxNl90Kilkc3Q7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKQorICAgICAgICAgICAgICAgIGRzdDJbaV0gPSAoZHN0MltpXSAmIGNkW2ldKSBeIG1za1tpXTsKKyAgICAgICAgICAgIG1zayArPSBjLT5jdXJfdzsKKyAgICAgICAgICAgIGNkICArPSBjLT5jdXJfdzsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMtPmJwcDIgPT0gNCkgeworICAgICAgICB1aW50MzJfdCAqY2QgPSAodWludDMyX3QqKWMtPmN1cmJpdHMsICptc2sgPSAodWludDMyX3QqKWMtPmN1cm1hc2s7CisgICAgICAgIHVpbnQzMl90ICpkc3QyOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgICAgICBkc3QyID0gKHVpbnQzMl90Kilkc3Q7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKQorICAgICAgICAgICAgICAgIGRzdDJbaV0gPSAoZHN0MltpXSAmIGNkW2ldKSBeIG1za1tpXTsKKyAgICAgICAgICAgIG1zayArPSBjLT5jdXJfdzsKKyAgICAgICAgICAgIGNkICArPSBjLT5jdXJfdzsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIGZpbGwgcmVjdGFuZ2xlIHdpdGggZ2l2ZW4gY29sb3IgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcGFpbnRfcmVjdCh1aW50OF90ICpkc3QsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicHAsIGludCBzdHJpZGUpCit7CisgICAgaW50IGksIGo7CisgICAgZHN0ICs9IGR4ICogYnBwICsgZHkgKiBzdHJpZGU7CisgICAgaWYgKGJwcCA9PSAxKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBoOyBqKyspIHsKKyAgICAgICAgICAgIG1lbXNldChkc3QsIGNvbG9yLCB3KTsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJwcCA9PSAyKSB7CisgICAgICAgIHVpbnQxNl90ICpkc3QyOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgICAgICBkc3QyID0gKHVpbnQxNl90Kilkc3Q7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKQorICAgICAgICAgICAgICAgICpkc3QyKysgPSBjb2xvcjsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJwcCA9PSA0KSB7CisgICAgICAgIHVpbnQzMl90ICpkc3QyOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgICAgICBkc3QyID0gKHVpbnQzMl90Kilkc3Q7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKQorICAgICAgICAgICAgICAgIGRzdDJbaV0gPSBjb2xvcjsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcGFpbnRfcmF3KHVpbnQ4X3QgKmRzdCwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgKmdiLCBpbnQgYnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJlLCBpbnQgc3RyaWRlKQoreworICAgIGludCBpLCBqLCBwOworICAgIGZvciAoaiA9IDA7IGogPCBoOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICAgICAgcCA9IHZtbmNfZ2V0X3BpeGVsKGdiLCBicHAsIGJlKTsKKyAgICAgICAgICAgIHN3aXRjaCAoYnBwKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgZHN0W2ldID0gcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAoKHVpbnQxNl90Kilkc3QpW2ldID0gcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAoKHVpbnQzMl90Kilkc3QpW2ldID0gcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGludCBkZWNvZGVfaGV4dGlsZShWbW5jQ29udGV4dCAqYywgdWludDhfdCogZHN0LCBHZXRCeXRlQ29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgaSwgaiwgazsKKyAgICBpbnQgYmcgPSAwLCBmZyA9IDAsIHJlY3RzLCBjb2xvciwgZmxhZ3MsIHh5LCB3aDsKKyAgICBjb25zdCBpbnQgYnBwID0gYy0+YnBwMjsKKyAgICB1aW50OF90ICpkc3QyOworICAgIGludCBidyA9IDE2LCBiaCA9IDE2OworCisgICAgZm9yIChqID0gMDsgaiA8IGg7IGogKz0gMTYpIHsKKyAgICAgICAgZHN0MiA9IGRzdDsKKyAgICAgICAgYncgICA9IDE2OworICAgICAgICBpZiAoaiArIDE2ID4gaCkKKyAgICAgICAgICAgIGJoID0gaCAtIGo7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpICs9IDE2LCBkc3QyICs9IDE2ICogYnBwKSB7CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlByZW1hdHVyZSBlbmQgb2YgZGF0YSFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgKyAxNiA+IHcpCisgICAgICAgICAgICAgICAgYncgPSB3IC0gaTsKKyAgICAgICAgICAgIGZsYWdzID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgaWYgKGZsYWdzICYgSFRfUkFXKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8IGJ3ICogYmggKiBicHApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcmVtYXR1cmUgZW5kIG9mIGRhdGEhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhaW50X3Jhdyhkc3QyLCBidywgYmgsIGdiLCBicHAsIGMtPmJpZ2VuZGlhbiwgc3RyaWRlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgSFRfQktHKQorICAgICAgICAgICAgICAgICAgICBiZyA9IHZtbmNfZ2V0X3BpeGVsKGdiLCBicHAsIGMtPmJpZ2VuZGlhbik7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgSFRfRkcpCisgICAgICAgICAgICAgICAgICAgIGZnID0gdm1uY19nZXRfcGl4ZWwoZ2IsIGJwcCwgYy0+YmlnZW5kaWFuKTsKKyAgICAgICAgICAgICAgICByZWN0cyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgSFRfU1VCKQorICAgICAgICAgICAgICAgICAgICByZWN0cyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgICAgICBjb2xvciA9ICEhKGZsYWdzICYgSFRfQ0xSKTsKKworICAgICAgICAgICAgICAgIHBhaW50X3JlY3QoZHN0MiwgMCwgMCwgYncsIGJoLCBiZywgYnBwLCBzdHJpZGUpOworCisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8IHJlY3RzICogKGNvbG9yICogYnBwICsgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcmVtYXR1cmUgZW5kIG9mIGRhdGEhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCByZWN0czsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGZnID0gdm1uY19nZXRfcGl4ZWwoZ2IsIGJwcCwgYy0+YmlnZW5kaWFuKTsKKyAgICAgICAgICAgICAgICAgICAgeHkgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICAgICAgICAgIHdoID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKHh5ID4+IDQpICsgKHdoID4+IDQpICsgMSA+IHcgLSBpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoeHkgJiAweEYpICsgKHdoICYgMHhGKSsxID4gaCAtIGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVjdGFuZ2xlIG91dHNpZGUgcGljdHVyZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYWludF9yZWN0KGRzdDIsIHh5ID4+IDQsIHh5ICYgMHhGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aD4+NCkrMSwgKHdoICYgMHhGKSsxLCBmZywgYnBwLCBzdHJpZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gc3RyaWRlICogMTY7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZXNldF9idWZmZXJzKFZtbmNDb250ZXh0ICpjKQoreworICAgIGF2X2ZyZWVwKCZjLT5jdXJiaXRzKTsKKyAgICBhdl9mcmVlcCgmYy0+Y3VybWFzayk7CisgICAgYXZfZnJlZXAoJmMtPnNjcmVlbmR0YSk7CisgICAgYy0+Y3VyX3cgPSBjLT5jdXJfaCA9IDA7CisgICAgYy0+Y3VyX2h4ID0gYy0+Y3VyX2h5ID0gMDsKKworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIFZtbmNDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qnl0ZUNvbnRleHQgKmdiID0gJmMtPmdiOworICAgIHVpbnQ4X3QgKm91dHB0cjsKKyAgICBpbnQgZHgsIGR5LCB3LCBoLCBkZXB0aCwgZW5jLCBjaHVua3MsIHJlcywgc2l6ZV9sZWZ0LCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgYy0+cGljKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYnl0ZXN0cmVhbTJfaW5pdChnYiwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICBjLT5waWMtPmtleV9mcmFtZSA9IDA7CisgICAgYy0+cGljLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKworICAgIC8vIHJlc3RvcmUgc2NyZWVuIGFmdGVyIGN1cnNvcgorICAgIGlmIChjLT5zY3JlZW5kdGEpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHcgPSBjLT5jdXJfdzsKKyAgICAgICAgaWYgKGMtPndpZHRoIDwgYy0+Y3VyX3ggKyB3KQorICAgICAgICAgICAgdyA9IGMtPndpZHRoIC0gYy0+Y3VyX3g7CisgICAgICAgIGggPSBjLT5jdXJfaDsKKyAgICAgICAgaWYgKGMtPmhlaWdodCA8IGMtPmN1cl95ICsgaCkKKyAgICAgICAgICAgIGggPSBjLT5oZWlnaHQgLSBjLT5jdXJfeTsKKyAgICAgICAgZHggPSBjLT5jdXJfeDsKKyAgICAgICAgaWYgKGR4IDwgMCkgeworICAgICAgICAgICAgdyArPSBkeDsKKyAgICAgICAgICAgIGR4ID0gMDsKKyAgICAgICAgfQorICAgICAgICBkeSA9IGMtPmN1cl95OworICAgICAgICBpZiAoZHkgPCAwKSB7CisgICAgICAgICAgICBoICs9IGR5OworICAgICAgICAgICAgZHkgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICgodyA+IDApICYmIChoID4gMCkpIHsKKyAgICAgICAgICAgIG91dHB0ciA9IGMtPnBpYy0+ZGF0YVswXSArIGR4ICogYy0+YnBwMiArIGR5ICogYy0+cGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkob3V0cHRyLCBjLT5zY3JlZW5kdGEgKyBpICogYy0+Y3VyX3cgKiBjLT5icHAyLAorICAgICAgICAgICAgICAgICAgICAgICB3ICogYy0+YnBwMik7CisgICAgICAgICAgICAgICAgb3V0cHRyICs9IGMtPnBpYy0+bGluZXNpemVbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMik7CisgICAgY2h1bmtzID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoZ2IpOworICAgIHdoaWxlIChjaHVua3MtLSkgeworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIDwgMTIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUHJlbWF0dXJlIGVuZCBvZiBkYXRhIVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZHggID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoZ2IpOworICAgICAgICBkeSAgPSBieXRlc3RyZWFtMl9nZXRfYmUxNihnYik7CisgICAgICAgIHcgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KGdiKTsKKyAgICAgICAgaCAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoZ2IpOworICAgICAgICBlbmMgPSBieXRlc3RyZWFtMl9nZXRfYmUzMihnYik7CisgICAgICAgIG91dHB0ciA9IGMtPnBpYy0+ZGF0YVswXSArIGR4ICogYy0+YnBwMiArIGR5ICogYy0+cGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgc2l6ZV9sZWZ0ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpOworICAgICAgICBzd2l0Y2ggKGVuYykgeworICAgICAgICBjYXNlIE1BR0lDX1dNVmQ6IC8vIGN1cnNvcgorICAgICAgICAgICAgaWYgKHcqKGludDY0X3QpaCpjLT5icHAyID4gSU5UX01BWC8yIC0gMikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGltZW5zaW9ucyB0b28gbGFyZ2VcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemVfbGVmdCA8IDIgKyB3ICogaCAqIGMtPmJwcDIgKiAyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJQcmVtYXR1cmUgZW5kIG9mIGRhdGEhIChuZWVkICVpIGdvdCAlaSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIDIgKyB3ICogaCAqIGMtPmJwcDIgKiAyLCBzaXplX2xlZnQpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMik7CisgICAgICAgICAgICBjLT5jdXJfdyAgPSB3OworICAgICAgICAgICAgYy0+Y3VyX2ggID0gaDsKKyAgICAgICAgICAgIGMtPmN1cl9oeCA9IGR4OworICAgICAgICAgICAgYy0+Y3VyX2h5ID0gZHk7CisgICAgICAgICAgICBpZiAoKGMtPmN1cl9oeCA+IGMtPmN1cl93KSB8fCAoYy0+Y3VyX2h5ID4gYy0+Y3VyX2gpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJDdXJzb3IgaG90IHNwb3QgaXMgbm90IGluIGltYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICIlaXglaSBvZiAlaXglaSBjdXJzb3Igc2l6ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYy0+Y3VyX2h4LCBjLT5jdXJfaHksIGMtPmN1cl93LCBjLT5jdXJfaCk7CisgICAgICAgICAgICAgICAgYy0+Y3VyX2h4ID0gYy0+Y3VyX2h5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjLT5jdXJfdyAqIGMtPmN1cl9oID49IElOVF9NQVggLyBjLT5icHAyKSB7CisgICAgICAgICAgICAgICAgcmVzZXRfYnVmZmVycyhjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgc2NyZWVuX3NpemUgPSBjLT5jdXJfdyAqIGMtPmN1cl9oICogYy0+YnBwMjsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGF2X3JlYWxsb2NwKCZjLT5jdXJiaXRzLCBzY3JlZW5fc2l6ZSkpIDwgMCB8fAorICAgICAgICAgICAgICAgICAgICAocmV0ID0gYXZfcmVhbGxvY3AoJmMtPmN1cm1hc2ssIHNjcmVlbl9zaXplKSkgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgIChyZXQgPSBhdl9yZWFsbG9jcCgmYy0+c2NyZWVuZHRhLCBzY3JlZW5fc2l6ZSkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXNldF9idWZmZXJzKGMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRfY3Vyc29yKGMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFHSUNfV01WZTogLy8gdW5rbm93bgorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQUdJQ19XTVZmOiAvLyB1cGRhdGUgY3Vyc29yIHBvc2l0aW9uCisgICAgICAgICAgICBjLT5jdXJfeCA9IGR4IC0gYy0+Y3VyX2h4OworICAgICAgICAgICAgYy0+Y3VyX3kgPSBkeSAtIGMtPmN1cl9oeTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BR0lDX1dNVmc6IC8vIHVua25vd24KKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BR0lDX1dNVmg6IC8vIHVua25vd24KKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIDQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFHSUNfV01WaTogLy8gU2VydmVySW5pdGlhbGl6YXRpb24gc3RydWN0CisgICAgICAgICAgICBjLT5waWMtPmtleV9mcmFtZSA9IDE7CisgICAgICAgICAgICBjLT5waWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICAgICAgZGVwdGggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICBpZiAoZGVwdGggIT0gYy0+YnBwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIkRlcHRoIG1pc21hdGNoLiBDb250YWluZXIgJWkgYnBwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZSBkYXRhOiAlaSBicHBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGMtPmJwcCwgZGVwdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMSk7CisgICAgICAgICAgICBjLT5iaWdlbmRpYW4gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICBpZiAoYy0+YmlnZW5kaWFuICYgKH4xKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGhlYWRlcjogYmlnZW5kaWFuIGZsYWcgPSAlaVxuIiwgYy0+YmlnZW5kaWFuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vc2tpcCB0aGUgcmVzdCBvZiBwaXhlbCBmb3JtYXQgZGF0YQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMTMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFHSUNfV01WajogLy8gdW5rbm93bgorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMDAwMDAwOiAvLyByYXcgcmVjdGFuZ2xlIGRhdGEKKyAgICAgICAgICAgIGlmICgoZHggKyB3ID4gYy0+d2lkdGgpIHx8IChkeSArIGggPiBjLT5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJJbmNvcnJlY3QgZnJhbWUgc2l6ZTogJWl4JWkrJWl4JWkgb2YgJWl4JWlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHcsIGgsIGR4LCBkeSwgYy0+d2lkdGgsIGMtPmhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZV9sZWZ0IDwgdyAqIGggKiBjLT5icHAyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJQcmVtYXR1cmUgZW5kIG9mIGRhdGEhIChuZWVkICVpIGdvdCAlaSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHcgKiBoICogYy0+YnBwMiwgc2l6ZV9sZWZ0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhaW50X3JhdyhvdXRwdHIsIHcsIGgsIGdiLCBjLT5icHAyLCBjLT5iaWdlbmRpYW4sCisgICAgICAgICAgICAgICAgICAgICAgYy0+cGljLT5saW5lc2l6ZVswXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMDAwMDA1OiAvLyBIZXhUaWxlIGVuY29kZWQgcmVjdGFuZ2xlCisgICAgICAgICAgICBpZiAoKGR4ICsgdyA+IGMtPndpZHRoKSB8fCAoZHkgKyBoID4gYy0+aGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IGZyYW1lIHNpemU6ICVpeCVpKyVpeCVpIG9mICVpeCVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB3LCBoLCBkeCwgZHksIGMtPndpZHRoLCBjLT5oZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gZGVjb2RlX2hleHRpbGUoYywgb3V0cHRyLCBnYiwgdywgaCwgYy0+cGljLT5saW5lc2l6ZVswXSk7CisgICAgICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGJsb2NrIHR5cGUgMHglMDhYXG4iLCBlbmMpOworICAgICAgICAgICAgY2h1bmtzID0gMDsgLy8gbGVhdmUgY2h1bmtzIGRlY29kaW5nIGxvb3AKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYy0+c2NyZWVuZHRhKSB7CisgICAgICAgIGludCBpOworICAgICAgICAvLyBzYXZlIHNjcmVlbiBkYXRhIGJlZm9yZSBwYWludGluZyBjdXJzb3IKKyAgICAgICAgdyA9IGMtPmN1cl93OworICAgICAgICBpZiAoYy0+d2lkdGggPCBjLT5jdXJfeCArIHcpCisgICAgICAgICAgICB3ID0gYy0+d2lkdGggLSBjLT5jdXJfeDsKKyAgICAgICAgaCA9IGMtPmN1cl9oOworICAgICAgICBpZiAoYy0+aGVpZ2h0IDwgYy0+Y3VyX3kgKyBoKQorICAgICAgICAgICAgaCA9IGMtPmhlaWdodCAtIGMtPmN1cl95OworICAgICAgICBkeCA9IGMtPmN1cl94OworICAgICAgICBpZiAoZHggPCAwKSB7CisgICAgICAgICAgICB3ICs9IGR4OworICAgICAgICAgICAgZHggPSAwOworICAgICAgICB9CisgICAgICAgIGR5ID0gYy0+Y3VyX3k7CisgICAgICAgIGlmIChkeSA8IDApIHsKKyAgICAgICAgICAgIGggKz0gZHk7CisgICAgICAgICAgICBkeSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh3ID4gMCkgJiYgKGggPiAwKSkgeworICAgICAgICAgICAgb3V0cHRyID0gYy0+cGljLT5kYXRhWzBdICsgZHggKiBjLT5icHAyICsgZHkgKiBjLT5waWMtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICAgICAgICAgIG1lbWNweShjLT5zY3JlZW5kdGEgKyBpICogYy0+Y3VyX3cgKiBjLT5icHAyLCBvdXRwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIHcgKiBjLT5icHAyKTsKKyAgICAgICAgICAgICAgICBvdXRwdHIgKz0gYy0+cGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHB0ciA9IGMtPnBpYy0+ZGF0YVswXTsKKyAgICAgICAgICAgIHB1dF9jdXJzb3Iob3V0cHRyLCBjLT5waWMtPmxpbmVzaXplWzBdLCBjLCBjLT5jdXJfeCwgYy0+Y3VyX3kpOworICAgICAgICB9CisgICAgfQorICAgICpnb3RfZnJhbWUgPSAxOworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIGMtPnBpYykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGFsd2F5cyByZXBvcnQgdGhhdCB0aGUgYnVmZmVyIHdhcyBjb21wbGV0ZWx5IGNvbnN1bWVkICovCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZtbmNDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBjLT5hdmN0eCAgPSBhdmN0eDsKKyAgICBjLT53aWR0aCAgPSBhdmN0eC0+d2lkdGg7CisgICAgYy0+aGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKyAgICBjLT5icHAgICAgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgIGMtPmJwcDIgICA9IGMtPmJwcCAvIDg7CisKKyAgICBzd2l0Y2ggKGMtPmJwcCkgeworICAgIGNhc2UgODoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IzMjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBiaXRkZXB0aCAlaVxuIiwgYy0+YnBwKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYy0+cGljID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWMtPnBpYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVm1uY0NvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmMtPnBpYyk7CisKKyAgICBhdl9mcmVlcCgmYy0+Y3VyYml0cyk7CisgICAgYXZfZnJlZXAoJmMtPmN1cm1hc2spOworICAgIGF2X2ZyZWVwKCZjLT5zY3JlZW5kdGEpOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3ZtbmNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidm1uYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZNd2FyZSBTY3JlZW4gQ29kZWMgLyBWTXdhcmUgVmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVk1OQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVm1uY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92b3JiaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmQxMDQwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzLmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qKgorICogQGZpbGUKKyAqIENvbW1vbiBjb2RlIGZvciBWb3JiaXMgSSBlbmNvZGVyIGFuZCBkZWNvZGVyCisgKiBAYXV0aG9yIERlbmVzIEJhbGF0b25pICAoIGRiYWxhdG9uaSBwcm9ncmFtb3pvIGh1ICkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ29tbW9uIGNvZGUgZm9yIFZvcmJpcyBJIGVuY29kZXIgYW5kIGRlY29kZXIKKyAqIEBhdXRob3IgRGVuZXMgQmFsYXRvbmkgICggZGJhbGF0b25pIHByb2dyYW1vem8gaHUgKQorICovCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorCisjaW5jbHVkZSAidm9yYmlzLmgiCisKKworLyogSGVscGVyIGZ1bmN0aW9ucyAqLworCisvLyB4XigxL24pCit1bnNpZ25lZCBpbnQgZmZfdm9yYmlzX250aF9yb290KHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgbikKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmV0ID0gMCwgaSwgajsKKworICAgIGRvIHsKKyAgICAgICAgKytyZXQ7CisgICAgICAgIGZvciAoaSA9IDAsIGogPSByZXQ7IGkgPCBuIC0gMTsgaSsrKQorICAgICAgICAgICAgaiAqPSByZXQ7CisgICAgfSB3aGlsZSAoaiA8PSB4KTsKKworICAgIHJldHVybiByZXQgLSAxOworfQorCisvLyBHZW5lcmF0ZSB2bGMgY29kZXMgZnJvbSB2b3JiaXMgaHVmZm1hbiBjb2RlIGxlbmd0aHMKKworLy8gdGhlIHR3byBiaXRzW3BdID4gMzIgY2hlY2tzIHNob3VsZCBiZSByZWR1bmRhbnQsIGFsbCBjYWxsaW5nIGNvZGUgc2hvdWxkCisvLyBhbHJlYWR5IGVuc3VyZSB0aGF0LCBidXQgc2luY2UgaXQgYWxsb3dzIG92ZXJ3cml0aW5nIHRoZSBzdGFjayBpdCBzZWVtcworLy8gcmVhc29uYWJsZSB0byBjaGVjayByZWR1bmRhbnRseS4KK2ludCBmZl92b3JiaXNfbGVuMnZsYyh1aW50OF90ICpiaXRzLCB1aW50MzJfdCAqY29kZXMsIHVuc2lnbmVkIG51bSkKK3sKKyAgICB1aW50MzJfdCBleGl0X2F0X2xldmVsWzMzXSA9IHsgNDA0IH07CisKKyAgICB1bnNpZ25lZCBpLCBqLCBwLCBjb2RlOworCisjaWZkZWYgREVCVUcKKyAgICBHZXRCaXRDb250ZXh0IGdiOworI2VuZGlmCisKKyAgICBmb3IgKHAgPSAwOyAoYml0c1twXSA9PSAwKSAmJiAocCA8IG51bSk7ICsrcCkKKyAgICAgICAgOworICAgIGlmIChwID09IG51bSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjb2Rlc1twXSA9IDA7CisgICAgaWYgKGJpdHNbcF0gPiAzMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgZm9yIChpID0gMDsgaSA8IGJpdHNbcF07ICsraSkKKyAgICAgICAgZXhpdF9hdF9sZXZlbFtpKzFdID0gMSA8PCBpOworCisjaWZkZWYgREVCVUcKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgJXUuIG9mICV1IGNvZGUgbGVuICVkIGNvZGUgJWQgLSAiLCBwLCBudW0sIGJpdHNbcF0sIGNvZGVzW3BdKTsKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgKHVpbnQ4X3QgKikmY29kZXNbcF0sIGJpdHNbcF0pOworICAgIGZvciAoaSA9IDA7IGkgPCBiaXRzW3BdOyArK2kpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiVzIiwgZ2V0X2JpdHMxKCZnYikgPyAiMSIgOiAiMCIpOworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlxuIik7CisjZW5kaWYKKworICAgICsrcDsKKworICAgIGZvciAoaSA9IHA7IChiaXRzW2ldID09IDApICYmIChpIDwgbnVtKTsgKytpKQorICAgICAgICA7CisgICAgaWYgKGkgPT0gbnVtKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoOyBwIDwgbnVtOyArK3ApIHsKKyAgICAgICAgaWYgKGJpdHNbcF0gPiAzMikKKyAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKGJpdHNbcF0gPT0gMCkKKyAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLy8gZmluZCBjb3JyZXNwb25kaW5nIGV4aXQobm9kZSB3aGljaCB0aGUgdHJlZSBjYW4gZ3JvdyBmdXJ0aGVyIGZyb20pCisgICAgICAgIGZvciAoaSA9IGJpdHNbcF07IGkgPiAwOyAtLWkpCisgICAgICAgICAgICBpZiAoZXhpdF9hdF9sZXZlbFtpXSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKCFpKSAvLyBvdmVyc3BlY2lmaWVkIHRyZWUKKyAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgY29kZSA9IGV4aXRfYXRfbGV2ZWxbaV07CisgICAgICAgIGV4aXRfYXRfbGV2ZWxbaV0gPSAwOworICAgICAgICAvLyBjb25zdHJ1Y3QgY29kZSAoYXBwZW5kIDBzIHRvIGVuZCkgYW5kIGludHJvZHVjZSBuZXcgZXhpdHMKKyAgICAgICAgZm9yIChqID0gaSArIDEgO2ogPD0gYml0c1twXTsgKytqKQorICAgICAgICAgICAgZXhpdF9hdF9sZXZlbFtqXSA9IGNvZGUgKyAoMSA8PCAoaiAtIDEpKTsKKyAgICAgICAgY29kZXNbcF0gPSBjb2RlOworCisjaWZkZWYgREVCVUcKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiICVkLiBjb2RlIGxlbiAlZCBjb2RlICVkIC0gIiwgcCwgYml0c1twXSwgY29kZXNbcF0pOworICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgKHVpbnQ4X3QgKikmY29kZXNbcF0sIGJpdHNbcF0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYml0c1twXTsgKytpKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJXMiLCBnZXRfYml0czEoJmdiKSA/ICIxIiA6ICIwIik7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlxuIik7CisjZW5kaWYKKworICAgIH0KKworICAgIC8vbm8gZXhpdHMgc2hvdWxkIGJlIGxlZnQgKHVuZGVyc3BlY2lmaWVkIHRyZWUgLSBpZS4gdW51c2VkIHZhbGlkIHZsY3MgLSBub3QgYWxsb3dlZCBieSBTUEVDKQorICAgIGZvciAocCA9IDE7IHAgPCAzMzsgcCsrKQorICAgICAgICBpZiAoZXhpdF9hdF9sZXZlbFtwXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl92b3JiaXNfcmVhZHlfZmxvb3IxX2xpc3QoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfZmxvb3IxX2VudHJ5ICpsaXN0LCBpbnQgdmFsdWVzKQoreworICAgIGludCBpOworICAgIGxpc3RbMF0uc29ydCA9IDA7CisgICAgbGlzdFsxXS5zb3J0ID0gMTsKKyAgICBmb3IgKGkgPSAyOyBpIDwgdmFsdWVzOyBpKyspIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGxpc3RbaV0ubG93ICA9IDA7CisgICAgICAgIGxpc3RbaV0uaGlnaCA9IDE7CisgICAgICAgIGxpc3RbaV0uc29ydCA9IGk7CisgICAgICAgIGZvciAoaiA9IDI7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgIGludCB0bXAgPSBsaXN0W2pdLng7CisgICAgICAgICAgICBpZiAodG1wIDwgbGlzdFtpXS54KSB7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA+IGxpc3RbbGlzdFtpXS5sb3ddLngpCisgICAgICAgICAgICAgICAgICAgIGxpc3RbaV0ubG93ICA9ICBqOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodG1wIDwgbGlzdFtsaXN0W2ldLmhpZ2hdLngpCisgICAgICAgICAgICAgICAgICAgIGxpc3RbaV0uaGlnaCA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlcyAtIDE7IGkrKykgeworICAgICAgICBpbnQgajsKKyAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCB2YWx1ZXM7IGorKykgeworICAgICAgICAgICAgaWYgKGxpc3RbaV0ueCA9PSBsaXN0W2pdLngpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB2YWx1ZSBmb3VuZCBpbiBmbG9vciAxIFggY29vcmRpbmF0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpc3RbbGlzdFtpXS5zb3J0XS54ID4gbGlzdFtsaXN0W2pdLnNvcnRdLngpIHsKKyAgICAgICAgICAgICAgICBpbnQgdG1wID0gbGlzdFtpXS5zb3J0OworICAgICAgICAgICAgICAgIGxpc3RbaV0uc29ydCA9IGxpc3Rbal0uc29ydDsKKyAgICAgICAgICAgICAgICBsaXN0W2pdLnNvcnQgPSB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW5kZXJfbGluZV91bnJvbGxlZChpbnRwdHJfdCB4LCBpbnQgeSwgaW50IHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHN5LCBpbnQgYWR5LCBpbnQgYWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpidWYpCit7CisgICAgaW50IGVyciA9IC1hZHg7CisgICAgeCAtPSB4MSAtIDE7CisgICAgYnVmICs9IHgxIC0gMTsKKyAgICB3aGlsZSAoKyt4IDwgMCkgeworICAgICAgICBlcnIgKz0gYWR5OworICAgICAgICBpZiAoZXJyID49IDApIHsKKyAgICAgICAgICAgIGVyciArPSBhZHkgLSBhZHg7CisgICAgICAgICAgICB5ICAgKz0gc3k7CisgICAgICAgICAgICBidWZbeCsrXSA9IGZmX3ZvcmJpc19mbG9vcjFfaW52ZXJzZV9kYl90YWJsZVthdl9jbGlwX3VpbnQ4KHkpXTsKKyAgICAgICAgfQorICAgICAgICBidWZbeF0gPSBmZl92b3JiaXNfZmxvb3IxX2ludmVyc2VfZGJfdGFibGVbYXZfY2xpcF91aW50OCh5KV07CisgICAgfQorICAgIGlmICh4IDw9IDApIHsKKyAgICAgICAgaWYgKGVyciArIGFkeSA+PSAwKQorICAgICAgICAgICAgeSArPSBzeTsKKyAgICAgICAgYnVmW3hdID0gZmZfdm9yYmlzX2Zsb29yMV9pbnZlcnNlX2RiX3RhYmxlW2F2X2NsaXBfdWludDgoeSldOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVuZGVyX2xpbmUoaW50IHgwLCBpbnQgeTAsIGludCB4MSwgaW50IHkxLCBmbG9hdCAqYnVmKQoreworICAgIGludCBkeSAgPSB5MSAtIHkwOworICAgIGludCBhZHggPSB4MSAtIHgwOworICAgIGludCBhZHkgPSBGRkFCUyhkeSk7CisgICAgaW50IHN5ICA9IGR5IDwgMCA/IC0xIDogMTsKKyAgICBidWZbeDBdID0gZmZfdm9yYmlzX2Zsb29yMV9pbnZlcnNlX2RiX3RhYmxlW2F2X2NsaXBfdWludDgoeTApXTsKKyAgICBpZiAoYWR5KjIgPD0gYWR4KSB7IC8vIG9wdGltaXplZCBjb21tb24gY2FzZQorICAgICAgICByZW5kZXJfbGluZV91bnJvbGxlZCh4MCwgeTAsIHgxLCBzeSwgYWR5LCBhZHgsIGJ1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGJhc2UgID0gZHkgLyBhZHg7CisgICAgICAgIGludCB4ICAgICA9IHgwOworICAgICAgICBpbnQgeSAgICAgPSB5MDsKKyAgICAgICAgaW50IGVyciAgID0gLWFkeDsKKyAgICAgICAgYWR5IC09IEZGQUJTKGJhc2UpICogYWR4OworICAgICAgICB3aGlsZSAoKyt4IDwgeDEpIHsKKyAgICAgICAgICAgIHkgKz0gYmFzZTsKKyAgICAgICAgICAgIGVyciArPSBhZHk7CisgICAgICAgICAgICBpZiAoZXJyID49IDApIHsKKyAgICAgICAgICAgICAgICBlcnIgLT0gYWR4OworICAgICAgICAgICAgICAgIHkgICArPSBzeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zlt4XSA9IGZmX3ZvcmJpc19mbG9vcjFfaW52ZXJzZV9kYl90YWJsZVthdl9jbGlwX3VpbnQ4KHkpXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl92b3JiaXNfZmxvb3IxX3JlbmRlcl9saXN0KHZvcmJpc19mbG9vcjFfZW50cnkgKiBsaXN0LCBpbnQgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICp5X2xpc3QsIGludCAqZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXVsdGlwbGllciwgZmxvYXQgKm91dCwgaW50IHNhbXBsZXMpCit7CisgICAgaW50IGx4LCBseSwgaTsKKyAgICBseCA9IDA7CisgICAgbHkgPSB5X2xpc3RbMF0gKiBtdWx0aXBsaWVyOworICAgIGZvciAoaSA9IDE7IGkgPCB2YWx1ZXM7IGkrKykgeworICAgICAgICBpbnQgcG9zID0gbGlzdFtpXS5zb3J0OworICAgICAgICBpZiAoZmxhZ1twb3NdKSB7CisgICAgICAgICAgICBpbnQgeDEgPSBsaXN0W3Bvc10ueDsKKyAgICAgICAgICAgIGludCB5MSA9IHlfbGlzdFtwb3NdICogbXVsdGlwbGllcjsKKyAgICAgICAgICAgIGlmIChseCA8IHNhbXBsZXMpCisgICAgICAgICAgICAgICAgcmVuZGVyX2xpbmUobHgsIGx5LCBGRk1JTih4MSxzYW1wbGVzKSwgeTEsIG91dCk7CisgICAgICAgICAgICBseCA9IHgxOworICAgICAgICAgICAgbHkgPSB5MTsKKyAgICAgICAgfQorICAgICAgICBpZiAobHggPj0gc2FtcGxlcykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAobHggPCBzYW1wbGVzKQorICAgICAgICByZW5kZXJfbGluZShseCwgbHksIHNhbXBsZXMsIGx5LCBvdXQpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzLmggYi9mZm1wZWcvbGliYXZjb2RlYy92b3JiaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGRkMTRmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBPZGVkIFNoaW1vbiA8b2RzMTVAb2RzMTUuZHluZG5zLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZPUkJJU19ICisjZGVmaW5lIEFWQ09ERUNfVk9SQklTX0gKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX3ZvcmJpc19mbG9vcjFfaW52ZXJzZV9kYl90YWJsZVsyNTZdOworZXh0ZXJuIGNvbnN0IGZsb2F0ICogY29uc3QgZmZfdm9yYmlzX3Z3aW5bOF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92b3JiaXNfY2hhbm5lbF9sYXlvdXRfb2Zmc2V0c1s4XVs4XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZvcmJpc19lbmNvZGluZ19jaGFubmVsX2xheW91dF9vZmZzZXRzWzhdWzhdOworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX3ZvcmJpc19jaGFubmVsX2xheW91dHNbOV07CisKK3R5cGVkZWYgc3RydWN0IHZvcmJpc19mbG9vcjFfZW50cnkgeworICAgIHVpbnQxNl90IHg7CisgICAgdWludDE2X3Qgc29ydDsKKyAgICB1aW50MTZfdCBsb3c7CisgICAgdWludDE2X3QgaGlnaDsKK30gdm9yYmlzX2Zsb29yMV9lbnRyeTsKKworaW50IGZmX3ZvcmJpc19yZWFkeV9mbG9vcjFfbGlzdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc19mbG9vcjFfZW50cnkgKmxpc3QsIGludCB2YWx1ZXMpOwordW5zaWduZWQgaW50IGZmX3ZvcmJpc19udGhfcm9vdCh1bnNpZ25lZCBpbnQgeCwgdW5zaWduZWQgaW50IG4pOyAvLyB4XigxL24pCitpbnQgZmZfdm9yYmlzX2xlbjJ2bGModWludDhfdCAqYml0cywgdWludDMyX3QgKmNvZGVzLCB1bnNpZ25lZCBudW0pOwordm9pZCBmZl92b3JiaXNfZmxvb3IxX3JlbmRlcl9saXN0KHZvcmJpc19mbG9vcjFfZW50cnkgKiBsaXN0LCBpbnQgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICp5X2xpc3QsIGludCAqZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXVsdGlwbGllciwgZmxvYXQgKiBvdXQsIGludCBzYW1wbGVzKTsKK3ZvaWQgZmZfdm9yYmlzX2ludmVyc2VfY291cGxpbmcoZmxvYXQgKm1hZywgZmxvYXQgKmFuZywgaW50cHRyX3QgYmxvY2tzaXplKTsKKworI2RlZmluZSBpbG9nKGkpIGF2X2xvZzIoMiooaSkpCisKKyNlbmRpZiAvKiBBVkNPREVDX1ZPUkJJU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92b3JiaXNfZGF0YS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjNhMDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzX2RhdGEuYwpAQCAtMCwwICsxLDIxOTMgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDUgRGVuZXMgQmFsYXRvbmkgKCBkYmFsYXRvbmkgcHJvZ3JhbW96byBodSApCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAidm9yYmlzLmgiCisKK2NvbnN0IHVpbnQ4X3QgZmZfdm9yYmlzX2NoYW5uZWxfbGF5b3V0X29mZnNldHNbOF1bOF0gPSB7CisgICAgeyAwIH0sCisgICAgeyAwLCAxIH0sCisgICAgeyAwLCAyLCAxIH0sCisgICAgeyAwLCAxLCAyLCAzIH0sCisgICAgeyAwLCAyLCAxLCAzLCA0IH0sCisgICAgeyAwLCAyLCAxLCA1LCAzLCA0IH0sCisgICAgeyAwLCAyLCAxLCA2LCA1LCAzLCA0IH0sCisgICAgeyAwLCAyLCAxLCA3LCA1LCA2LCAzLCA0IH0sCit9OworCitjb25zdCB1aW50OF90IGZmX3ZvcmJpc19lbmNvZGluZ19jaGFubmVsX2xheW91dF9vZmZzZXRzWzhdWzhdID0geworICAgIHsgMCB9LAorICAgIHsgMCwgMSB9LAorICAgIHsgMCwgMiwgMSB9LAorICAgIHsgMCwgMSwgMiwgMyB9LAorICAgIHsgMCwgMiwgMSwgMywgNCB9LAorICAgIHsgMCwgMiwgMSwgNCwgNSwgMyB9LAorICAgIHsgMCwgMiwgMSwgNSwgNiwgNCwgMyB9LAorICAgIHsgMCwgMiwgMSwgNiwgNywgNCwgNSwgMyB9LAorfTsKKworY29uc3QgdWludDY0X3QgZmZfdm9yYmlzX2NoYW5uZWxfbGF5b3V0c1s5XSA9IHsKKyAgICBBVl9DSF9MQVlPVVRfTU9OTywKKyAgICBBVl9DSF9MQVlPVVRfU1RFUkVPLAorICAgIEFWX0NIX0xBWU9VVF9TVVJST1VORCwKKyAgICBBVl9DSF9MQVlPVVRfUVVBRCwKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0ssCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDF8QVZfQ0hfQkFDS19DRU5URVIsCisgICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDEsCisgICAgMAorfTsKKworREVDTEFSRV9BTElHTkVEKDE2LCBzdGF0aWMgY29uc3QgZmxvYXQsIHZ3aW42NClbMzJdID0geworICAgIDAuMDAwOTQ2MDQ2M0YsIDAuMDA4NTAwNjQ2OEYsIDAuMDIzNTM1MjI1NEYsIDAuMDQ1ODk1MDU2N0YsCisgICAgMC4wNzUzMzUxOTA4RiwgMC4xMTE1MDczMDc3RiwgMC4xNTM5NDU3OTczRiwgMC4yMDIwNTU3NDc1RiwKKyAgICAwLjI1NTEwNTY3NTlGLCAwLjMxMjIyNzY2NDVGLCAwLjM3MjQyNzAyODdGLCAwLjQzNDYwMjc3OTJGLAorICAgIDAuNDk3NTc4OTk3NEYsIDAuNTYwMTQ1OTUyMUYsIDAuNjIxMTA4NTA1MUYsIDAuNjc5MzM4MjY4OUYsCisgICAgMC43MzM4MjUyNjI5RiwgMC43ODM3MjQ1ODQ5RiwgMC44MjgzOTM5MzU1RiwgMC44Njc0MTg2NjU2RiwKKyAgICAwLjkwMDYyMjI0MjlGLCAwLjkyODA2MTQ3ODdGLCAwLjk1MDAwNzMwODFGLCAwLjk2NjkxMzE3ODJGLAorICAgIDAuOTc5Mzc0MDIyMEYsIDAuOTg4MDc5Mjk0MUYsIDAuOTkzNzYzNjEzOUYsIDAuOTk3MTU4MjY2OEYsCisgICAgMC45OTg5NDYyNjY3RiwgMC45OTk3MjMwMDgyRiwgMC45OTk5NjM4Njg4RiwgMC45OTk5OTk1NTI1RiwKK307CisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGNvbnN0IGZsb2F0LCB2d2luMTI4KVs2NF0gPSB7CisgICAgMC4wMDAyMzY1NDcyRiwgMC4wMDIxMjgwNjg3RiwgMC4wMDU5MDY1MjU0RiwgMC4wMTE1NjI2NTUwRiwKKyAgICAwLjAxOTA4MjM0NDJGLCAwLjAyODQ0NjM3MzVGLCAwLjAzOTYzMDA5MzVGLCAwLjA1MjYwMzA0MzBGLAorICAgIDAuMDY3MzI4NTI4MUYsIDAuMDgzNzYzMTc2M0YsIDAuMTAxODU2NDg4N0YsIDAuMTIxNTUwNDA5NUYsCisgICAgMC4xNDI3Nzg5MzY3RiwgMC4xNjU0Njc3OTYwRiwgMC4xODk1MzQyMDAxRiwgMC4yMTQ4ODY3MTYwRiwKKyAgICAwLjI0MTQyNTI1NzZGLCAwLjI2OTA0MTIyNDBGLCAwLjI5NzYxNzc5NTJGLCAwLjMyNzAzMDM5NjBGLAorICAgIDAuMzU3MTQ3MzM1MEYsIDAuMzg3ODMwNjE4OUYsIDAuNDE4OTM2OTM4N0YsIDAuNDUwMzE4ODE4OEYsCisgICAgMC40ODE4MjU5MTM1RiwgMC41MTMzMDY0MzM0RiwgMC41NDQ2MDg2NzUxRiwgMC41NzU1ODI2Mjc4RiwKKyAgICAwLjYwNjA4MTYyNDhGLCAwLjYzNTk2NDAwNDdGLCAwLjY2NTA5NDc0ODNGLCAwLjY5MzM0NzA1NDNGLAorICAgIDAuNzIwNjAzODE3OUYsIDAuNzQ2NzU4OTgxMEYsIDAuNzcxNzE4NzIxM0YsIDAuNzk1NDAyNDU0MkYsCisgICAgMC44MTc3NDM2MjY0RiwgMC44Mzg2OTAyODMxRiwgMC44NTgyMDUzOTgxRiwgMC44NzYyNjY5NjIyRiwKKyAgICAwLjg5Mjg2NzgyOThGLCAwLjkwODAxNTMzMTBGLCAwLjkyMTczMDY2MDhGLCAwLjkzNDA0ODA2MTVGLAorICAgIDAuOTQ1MDEzODIwMEYsIDAuOTU0Njg1MTA0MUYsIDAuOTYzMTI4NjYyMUYsIDAuOTcwNDE5NDE3MUYsCisgICAgMC45NzY2Mzg5ODEwRiwgMC45ODE4NzQxMTk3RiwgMC45ODYyMTUxOTM4RiwgMC45ODk3NTQ2MDM1RiwKKyAgICAwLjk5MjU4NTI1OThGLCAwLjk5NDc5OTEwMzJGLCAwLjk5NjQ4NTY5MDBGLCAwLjk5NzczMDg2MDJGLAorICAgIDAuOTk4NjE1NTAxNUYsIDAuOTk5MjE0NDE5M0YsIDAuOTk5NTk1MzIwMEYsIDAuOTk5ODE3OTE1NUYsCisgICAgMC45OTk5MzMxNTAzRiwgMC45OTk5ODI1NTYzRiwgMC45OTk5OTc3MzU3RiwgMC45OTk5OTk5NzIwRiwKK307CisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGNvbnN0IGZsb2F0LCB2d2luMjU2KVsxMjhdID0geworICAgIDAuMDAwMDU5MTM5MEYsIDAuMDAwNTMyMTk3OUYsIDAuMDAxNDc4MDMwMUYsIDAuMDAyODk2MDYzNkYsCisgICAgMC4wMDQ3ODU0MzYzRiwgMC4wMDcxNDQ5OTI2RiwgMC4wMDk5NzMyNzc1RiwgMC4wMTMyNjg1Mjk4RiwKKyAgICAwLjAxNzAyODY3NDFGLCAwLjAyMTI1MTMxMTlGLCAwLjAyNTkzMzcxMTFGLCAwLjAzMTA3Mjc5NTBGLAorICAgIDAuMDM2NjY1MTMwMkYsIDAuMDQyNzA2OTE0MEYsIDAuMDQ5MTkzOTYxNEYsIDAuMDU2MTIxNjkwN0YsCisgICAgMC4wNjM0ODUxMTAyRiwgMC4wNzEyNzg4MDM1RiwgMC4wNzk0OTY5MTYwRiwgMC4wODgxMzMxNDAyRiwKKyAgICAwLjA5NzE4MDcwMjhGLCAwLjEwNjYzMjM1MTVGLCAwLjExNjQ4MDM0MjZGLCAwLjEyNjcxNjQyOTdGLAorICAgIDAuMTM3MzMxODUzNEYsIDAuMTQ4MzE3MzMyM0YsIDAuMTU5NjYzMDU1M0YsIDAuMTcxMzU4Njc1NUYsCisgICAgMC4xODMzOTMzMDYyRiwgMC4xOTU3NTU1MTg0RiwgMC4yMDg0MzMzNDA0RiwgMC4yMjE0MTQyNTk5RiwKKyAgICAwLjIzNDY4NTIyODBGLCAwLjI0ODIzMjY2NjRGLCAwLjI2MjA0MjQ3NTdGLCAwLjI3NjEwMDA0ODFGLAorICAgIDAuMjkwMzkwMjgxM0YsIDAuMzA0ODk3NTk1OUYsIDAuMzE5NjA1OTU1M0YsIDAuMzM0NDk4ODg4N0YsCisgICAgMC4zNDk1NTk1MTYwRiwgMC4zNjQ3NzA1NzY2RiwgMC4zODAxMTQ0NTk3RiwgMC4zOTU1NzMyMzgyRiwKKyAgICAwLjQxMTEyODcwNDdGLCAwLjQyNjc2MjQwOTNGLCAwLjQ0MjQ1NTcwMDlGLCAwLjQ1ODE4OTc2OTZGLAorICAgIDAuNDczOTQ1NjkxM0YsIDAuNDg5NzA0NDc0NEYsIDAuNTA1NDQ3MTA3NUYsIDAuNTIxMTU0NjA4OEYsCisgICAgMC41MzY4MDgwNzYzRiwgMC41NTIzODg3Mzk1RiwgMC41Njc4NzgwMTAzRiwgMC41ODMyNTc1MzYxRiwKKyAgICAwLjU5ODUwOTI1MDhGLCAwLjYxMzYxNTQyNzdGLCAwLjYyODU1ODczMDBGLCAwLjY0MzMyMjI2MTlGLAorICAgIDAuNjU3ODg5NjE3NUYsIDAuNjcyMjQ0OTI5NEYsIDAuNjg2MzcyOTE0NEYsIDAuNzAwMjU4OTE4N0YsCisgICAgMC43MTM4ODg5NTk3RiwgMC43MjcyNDk3NjYyRiwgMC43NDAzMjg4MTU0RiwgMC43NTMxMTQzNjc5RiwKKyAgICAwLjc2NTU5NTQ5ODVGLCAwLjc3Nzc2MjEyNDlGLCAwLjc4OTYwNTAzMjJGLCAwLjgwMTExNTg5NDdGLAorICAgIDAuODEyMjg3MjkzMkYsIDAuODIzMTEyNzI5NEYsIDAuODMzNTg2NjM2NUYsIDAuODQzNzA0Mzg1MEYsCisgICAgMC44NTM0NjIyODYxRiwgMC44NjI4NTc1OTA1RiwgMC44NzE4ODg0ODM1RiwgMC44ODA1NTQwNzY1RiwKKyAgICAwLjg4ODg1NDM5NDdGLCAwLjg5Njc5MDM2MTZGLCAwLjkwNDM2Mzc3OTdGLCAwLjkxMTU3NzMwNzhGLAorICAgIDAuOTE4NDM0NDM2MEYsIDAuOTI0OTM5NDU2MkYsIDAuOTMxMDk3NDMxMkYsIDAuOTM2OTE0MTYwOEYsCisgICAgMC45NDIzOTYxNDQ2RiwgMC45NDc1NTA1NDM5RiwgMC45NTIzODUxNDA2RiwgMC45NTY5MDgyOTQ3RiwKKyAgICAwLjk2MTEyODkwMDVGLCAwLjk2NTA1NjM0MDhGLCAwLjk2ODcwMDQ0MDVGLCAwLjk3MjA3MTQxOTFGLAorICAgIDAuOTc1MTc5ODQyN0YsIDAuOTc4MDM2NTc1M0YsIDAuOTgwNjUyNzMwMUYsIDAuOTgzMDM5NjIwNEYsCisgICAgMC45ODUyMDg3MTExRiwgMC45ODcxNzE1NzAxRiwgMC45ODg5Mzk4MjA3RiwgMC45OTA1MjUwOTQxRiwKKyAgICAwLjk5MTkzODk4MzJGLCAwLjk5MzE5Mjk5NzNGLCAwLjk5NDI5ODUxNzRGLCAwLjk5NTI2Njc1MzdGLAorICAgIDAuOTk2MTA4NzAzN0YsIDAuOTk2ODM1MTExOUYsIDAuOTk3NDU2NDMxMkYsIDAuOTk3OTgyNzg1OEYsCisgICAgMC45OTg0MjM5MzU5RiwgMC45OTg3ODkyNDQxRiwgMC45OTkwODc2NDM1RiwgMC45OTkzMjc2MDgxRiwKKyAgICAwLjk5OTUxNzEyNDFGLCAwLjk5OTY2MzY2NDhGLCAwLjk5OTc3NDE2NTRGLCAwLjk5OTg1NTAwMTZGLAorICAgIDAuOTk5OTExOTY5MkYsIDAuOTk5OTUwMjY1NkYsIDAuOTk5OTc0NDc0MkYsIDAuOTk5OTg4NTQ5N0YsCisgICAgMC45OTk5OTU4MDY0RiwgMC45OTk5OTg5MDc3RiwgMC45OTk5OTk4NTg0RiwgMC45OTk5OTk5OTgzRiwKK307CisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGNvbnN0IGZsb2F0LCB2d2luNTEyKVsyNTZdID0geworICAgIDAuMDAwMDE0Nzg0OUYsIDAuMDAwMTMzMDYwN0YsIDAuMDAwMzY5NTk0NkYsIDAuMDAwNzI0MzUwOUYsCisgICAgMC4wMDExOTcyNzU5RiwgMC4wMDE3ODgyOTgzRiwgMC4wMDI0OTczMjg1RiwgMC4wMDMzMjQyNTg4RiwKKyAgICAwLjAwNDI2ODk2MzJGLCAwLjAwNTMzMTI5NzNGLCAwLjAwNjUxMTA5ODJGLCAwLjAwNzgwODE4NDFGLAorICAgIDAuMDA5MjIyMzU0MEYsIDAuMDEwNzUzMzg4MEYsIDAuMDEyNDAxMDQ2NkYsIDAuMDE0MTY1MDcwM0YsCisgICAgMC4wMTYwNDUxODAwRiwgMC4wMTgwNDEwNzU4RiwgMC4wMjAxNTI0MzczRiwgMC4wMjIzNzg5MjMzRiwKKyAgICAwLjAyNDcyMDE3MTBGLCAwLjAyNzE3NTc5NThGLCAwLjAyOTc0NTM5MTRGLCAwLjAzMjQyODUyODZGLAorICAgIDAuMDM1MjI0NzU1NkYsIDAuMDM4MTMzNTk3MkYsIDAuMDQxMTU0NTU0NUYsIDAuMDQ0Mjg3MTA0NUYsCisgICAgMC4wNDc1MzA2OTk3RiwgMC4wNTA4ODQ3Njc2RiwgMC4wNTQzNDg3MTAzRiwgMC4wNTc5MjE5MDM4RiwKKyAgICAwLjA2MTYwMzY5ODJGLCAwLjA2NTM5MzQxNjRGLCAwLjA2OTI5MDM1NDZGLCAwLjA3MzI5Mzc4MDlGLAorICAgIDAuMDc3NDAyOTM1NkYsIDAuMDgxNjE3MDMwNUYsIDAuMDg1OTM1MjQ4NUYsIDAuMDkwMzU2NzQyOEYsCisgICAgMC4wOTQ4ODA2Mzc1RiwgMC4wOTk1MDYwMjU5RiwgMC4xMDQyMzE5NzEyRiwgMC4xMDkwNTc1MDU2RiwKKyAgICAwLjExMzk4MTYzMDBGLCAwLjExOTAwMzMxMzdGLCAwLjEyNDEyMTQ5NDFGLCAwLjEyOTMzNTA3NjRGLAorICAgIDAuMTM0NjQyOTMzM0YsIDAuMTQwMDQzOTA0NkYsIDAuMTQ1NTM2Nzk3NEYsIDAuMTUxMTIwMzg1MkYsCisgICAgMC4xNTY3OTM0MDgzRiwgMC4xNjI1NTQ1NzM1RiwgMC4xNjg0MDI1NTM3RiwgMC4xNzQzMzU5ODgxRiwKKyAgICAwLjE4MDM1MzQ4MjBGLCAwLjE4NjQ1MzYwNjlGLCAwLjE5MjYzNDkwMDBGLCAwLjE5ODg5NTg2NTBGLAorICAgIDAuMjA1MjM0OTcxNUYsIDAuMjExNjUwNjU1NUYsIDAuMjE4MTQxMzE5MUYsIDAuMjI0NzA1MzMxM0YsCisgICAgMC4yMzEzNDEwMjc1RiwgMC4yMzgwNDY3MTA1RiwgMC4yNDQ4MjA2NTAwRiwgMC4yNTE2NjEwODM1RiwKKyAgICAwLjI1ODU2NjIxNjRGLCAwLjI2NTUzNDIyMjZGLCAwLjI3MjU2MzI0NDhGLCAwLjI3OTY1MTM5NTBGLAorICAgIDAuMjg2Nzk2NzU1MUYsIDAuMjkzOTk3Mzc3M0YsIDAuMzAxMjUxMjg1MkYsIDAuMzA4NTU2NDczOUYsCisgICAgMC4zMTU5MTA5MTExRiwgMC4zMjMzMTI1Mzc1RiwgMC4zMzA3NTkyNjgwRiwgMC4zMzgyNDg5OTIyRiwKKyAgICAwLjM0NTc3OTU3NTZGLCAwLjM1MzM0ODg2MDJGLCAwLjM2MDk1NDY2NTdGLCAwLjM2ODU5NDc5MDRGLAorICAgIDAuMzc2MjY3MDEyMUYsIDAuMzgzOTY5MDg5NkYsIDAuMzkxNjk4NzYzNEYsIDAuMzk5NDUzNzU3MkYsCisgICAgMC40MDcyMzE3Nzg4RiwgMC40MTUwMzA1MjE1RiwgMC40MjI4NDc2NjUzRiwgMC40MzA2ODA4NzgzRiwKKyAgICAwLjQzODUyNzgxODFGLCAwLjQ0NjM4NjEzMjlGLCAwLjQ1NDI1MzQ2MzBGLCAwLjQ2MjEyNzQ0MjRGLAorICAgIDAuNDcwMDA1NzAwMUYsIDAuNDc3ODg1ODYxNUYsIDAuNDg1NzY1NTUwMkYsIDAuNDkzNjQyMzg5MUYsCisgICAgMC41MDE1MTQwMDIzRiwgMC41MDkzNzgwMTY1RiwgMC41MTcyMzIwNjI2RiwgMC41MjUwNzM3NzcyRiwKKyAgICAwLjUzMjkwMDgwNDNGLCAwLjU0MDcxMDc5NzFGLCAwLjU0ODUwMTQxOTJGLCAwLjU1NjI3MDM0NjVGLAorICAgIDAuNTY0MDE1MjY4OEYsIDAuNTcxNzMzODkxNEYsIDAuNTc5NDIzOTM2NkYsIDAuNTg3MDgzMTQ1N0YsCisgICAgMC41OTQ3MDkyODAxRiwgMC42MDIzMDAxMjM1RiwgMC42MDk4NTM0ODI5RiwgMC42MTczNjcxOTA3RiwKKyAgICAwLjYyNDgzOTEwNTlGLCAwLjYzMjI2NzExNjFGLCAwLjYzOTY0OTEzODRGLCAwLjY0Njk4MzEyMTdGLAorICAgIDAuNjU0MjY3MDQ3NUYsIDAuNjYxNDk4OTMxOUYsIDAuNjY4Njc2ODI2N0YsIDAuNjc1Nzk4ODIxMEYsCisgICAgMC42ODI4NjMwNDI2RiwgMC42ODk4Njc2NTkyRiwgMC42OTY4MTA4Nzk5RiwgMC43MDM2OTA5NTY0RiwKKyAgICAwLjcxMDUwNjE4NDNGLCAwLjcxNzI1NDkwNDNGLCAwLjcyMzkzNTUwMzJGLCAwLjczMDU0NjQxNTRGLAorICAgIDAuNzM3MDg2MTIzNUYsIDAuNzQzNTUzMTU5OEYsIDAuNzQ5OTQ2MTA2OEYsIDAuNzU2MjYzNTk4NkYsCisgICAgMC43NjI1MDQzMjE0RiwgMC43Njg2NjcwMTQ4RiwgMC43NzQ3NTA0NzIxRiwgMC43ODA3NTM1NDEwRiwKKyAgICAwLjc4NjY3NTEyNDdGLCAwLjc5MjUxNDE4MjVGLCAwLjc5ODI2OTcyOTZGLCAwLjgwMzk0MDgzODdGLAorICAgIDAuODA5NTI2NjM5NUYsIDAuODE1MDI2MzE5NkYsIDAuODIwNDM5MTI0OEYsIDAuODI1NzY0MzU5MEYsCisgICAgMC44MzEwMDEzODQ4RiwgMC44MzYxNDk2MjM2RiwgMC44NDEyMDg1NTU1RiwgMC44NDYxNzc3MTk0RiwKKyAgICAwLjg1MTA1NjcxMjlGLCAwLjg1NTg0NTE5MjRGLCAwLjg2MDU0Mjg3MzBGLCAwLjg2NTE0OTUyNzhGLAorICAgIDAuODY5NjY0OTg4MkYsIDAuODc0MDg5MTQzMkYsIDAuODc4NDIxOTM5MkYsIDAuODgyNjYzMzc5N0YsCisgICAgMC44ODY4MTM1MjQ0RiwgMC44OTA4NzI0ODg4RiwgMC44OTQ4NDA0NDQxRiwgMC44OTg3MTc2MTU3RiwKKyAgICAwLjkwMjUwNDI4MzFGLCAwLjkwNjIwMDc3OTFGLCAwLjkwOTgwNzQ4ODZGLCAwLjkxMzMyNDg0ODJGLAorICAgIDAuOTE2NzUzMzQ1MUYsIDAuOTIwMDkzNTE2M0YsIDAuOTIzMzQ1OTQ3MkYsIDAuOTI2NTExMjcxMkYsCisgICAgMC45Mjk1OTAxNjgwRiwgMC45MzI1ODMzNjMyRiwgMC45MzU0OTE2MjYzRiwgMC45MzgzMTU3NzA1RiwKKyAgICAwLjk0MTA1NjY1MDRGLCAwLjk0MzcxNTE2MThGLCAwLjk0NjI5MjIzOThGLCAwLjk0ODc4ODg1NzZGLAorICAgIDAuOTUxMjA2MDI1MkYsIDAuOTUzNTQ0Nzg4MkYsIDAuOTU1ODA2MjI2MkYsIDAuOTU3OTkxNDUxNkYsCisgICAgMC45NjAxMDE2MDc4RiwgMC45NjIxMzc4NjgzRiwgMC45NjQxMDE0MzQ4RiwgMC45NjU5OTM1MzYxRiwKKyAgICAwLjk2NzgxNTQyNjFGLCAwLjk2OTU2ODM4MzBGLCAwLjk3MTI1MzcwNzFGLCAwLjk3Mjg3MjcxOThGLAorICAgIDAuOTc0NDI2NzYxOEYsIDAuOTc1OTE3MTkxNkYsIDAuOTc3MzQ1Mzg0MkYsIDAuOTc4NzEyNzI5M0YsCisgICAgMC45ODAwMjA2Mjk4RiwgMC45ODEyNzA1MDA2RiwgMC45ODI0NjM3NjY1RiwgMC45ODM2MDE4NjEzRiwKKyAgICAwLjk4NDY4NjIyNThGLCAwLjk4NTcxODMwNjZGLCAwLjk4NjY5OTU1NDRGLCAwLjk4NzYzMTQyMjdGLAorICAgIDAuOTg4NTE1MzY2MkYsIDAuOTg5MzUyODM5M0YsIDAuOTkwMTQ1Mjk0OEYsIDAuOTkwODk0MTgyM0YsCisgICAgMC45OTE2MDA5NDcwRiwgMC45OTIyNjcwMjc5RiwgMC45OTI4OTM4NTcwRiwgMC45OTM0ODI4NTc0RiwKKyAgICAwLjk5NDAzNTQ0MjNGLCAwLjk5NDU1MzAxMzNGLCAwLjk5NTAzNjk1OTVGLCAwLjk5NTQ4ODY1NjJGLAorICAgIDAuOTk1OTA5NDYzM0YsIDAuOTk2MzAwNzI0MkYsIDAuOTk2NjYzNzY0OUYsIDAuOTk2OTk5ODkyNUYsCisgICAgMC45OTczMTAzOTM5RiwgMC45OTc1OTY1MzUxRiwgMC45OTc4NTk1NTk4RiwgMC45OTgxMDA2ODg1RiwKKyAgICAwLjk5ODMyMTExNzJGLCAwLjk5ODUyMjAxNjZGLCAwLjk5ODcwNDUzMTFGLCAwLjk5ODg2OTc3NzZGLAorICAgIDAuOTk5MDE4ODQ0OUYsIDAuOTk5MTUyNzkyNEYsIDAuOTk5MjcyNjQ5OUYsIDAuOTk5Mzc5NDE1N0YsCisgICAgMC45OTk0NzQwNTcwRiwgMC45OTk1NTc1MDc5RiwgMC45OTk2MzA2Njk5RiwgMC45OTk2OTQ0MDk5RiwKKyAgICAwLjk5OTc0OTU2MDVGLCAwLjk5OTc5NjkxOTBGLCAwLjk5OTgzNzI0NjVGLCAwLjk5OTg3MTI2NzhGLAorICAgIDAuOTk5ODk5NjcwNEYsIDAuOTk5OTIzMTA0MUYsIDAuOTk5OTQyMTgwN0YsIDAuOTk5OTU3NDczMkYsCisgICAgMC45OTk5Njk1MTU3RiwgMC45OTk5Nzg4MDI2RiwgMC45OTk5ODU3ODg1RiwgMC45OTk5OTA4ODc5RiwKKyAgICAwLjk5OTk5NDQ3NDZGLCAwLjk5OTk5Njg4MTdGLCAwLjk5OTk5ODQwMTBGLCAwLjk5OTk5OTI4MzNGLAorICAgIDAuOTk5OTk5NzM3N0YsIDAuOTk5OTk5OTMxN0YsIDAuOTk5OTk5OTkxMUYsIDAuOTk5OTk5OTk5OUYsCit9OworCitERUNMQVJFX0FMSUdORUQoMTYsIHN0YXRpYyBjb25zdCBmbG9hdCwgdndpbjEwMjQpWzUxMl0gPSB7CisgICAgMC4wMDAwMDM2OTYyRiwgMC4wMDAwMzMyNjU5RiwgMC4wMDAwOTI0MDQxRiwgMC4wMDAxODExMDg2RiwKKyAgICAwLjAwMDI5OTM3NjFGLCAwLjAwMDQ0NzIwMjFGLCAwLjAwMDYyNDU4MTFGLCAwLjAwMDgzMTUwNjNGLAorICAgIDAuMDAxMDY3OTY5OUYsIDAuMDAxMzMzOTYzMUYsIDAuMDAxNjI5NDc1N0YsIDAuMDAxOTU0NDk2NUYsCisgICAgMC4wMDIzMDkwMTMzRiwgMC4wMDI2OTMwMTI1RiwgMC4wMDMxMDY0Nzk3RiwgMC4wMDM1NDkzOTg5RiwKKyAgICAwLjAwNDAyMTc1MzNGLCAwLjAwNDUyMzUyNTBGLCAwLjAwNTA1NDY5NDZGLCAwLjAwNTYxNTI0MThGLAorICAgIDAuMDA2MjA1MTQ1MUYsIDAuMDA2ODI0MzgxN0YsIDAuMDA3NDcyOTI3OEYsIDAuMDA4MTUwNzU4MkYsCisgICAgMC4wMDg4NTc4NDY2RiwgMC4wMDk1OTQxNjU1RiwgMC4wMTAzNTk2ODYzRiwgMC4wMTExNTQzNzg5RiwKKyAgICAwLjAxMTk3ODIxMjJGLCAwLjAxMjgzMTE1MzhGLCAwLjAxMzcxMzE3MDFGLCAwLjAxNDYyNDIyNjBGLAorICAgIDAuMDE1NTY0Mjg1NUYsIDAuMDE2NTMzMzExMUYsIDAuMDE3NTMxMjY0MEYsIDAuMDE4NTU4MTA0MkYsCisgICAgMC4wMTk2MTM3OTAzRiwgMC4wMjA2OTgyNzk3RiwgMC4wMjE4MTE1Mjg0RiwgMC4wMjI5NTM0OTEwRiwKKyAgICAwLjAyNDEyNDEyMDhGLCAwLjAyNTMyMzM2OThGLCAwLjAyNjU1MTE4ODZGLCAwLjAyNzgwNzUyNjNGLAorICAgIDAuMDI5MDkyMzMwOEYsIDAuMDMwNDA1NTQ4NEYsIDAuMDMxNzQ3MTI0MUYsIDAuMDMzMTE3MDAxM0YsCisgICAgMC4wMzQ1MTUxMjIyRiwgMC4wMzU5NDE0Mjc0RiwgMC4wMzczOTU4NTYwRiwgMC4wMzg4NzgzNDU2RiwKKyAgICAwLjA0MDM4ODgzMjVGLCAwLjA0MTkyNzI1MTFGLCAwLjA0MzQ5MzUzNDdGLCAwLjA0NTA4NzYxNDhGLAorICAgIDAuMDQ2NzA5NDIxM0YsIDAuMDQ4MzU4ODgyOEYsIDAuMDUwMDM1OTI2MUYsIDAuMDUxNzQwNDc2NUYsCisgICAgMC4wNTM0NzI0NTc1RiwgMC4wNTUyMzE3OTEzRiwgMC4wNTcwMTgzOTgzRiwgMC4wNTg4MzIxOTcxRiwKKyAgICAwLjA2MDY3MzEwNDhGLCAwLjA2MjU0MTAzNjlGLCAwLjA2NDQzNTkwNzBGLCAwLjA2NjM1NzYyNzJGLAorICAgIDAuMDY4MzA2MTA3N0YsIDAuMDcwMjgxMjU3MUYsIDAuMDcyMjgyOTgyMUYsIDAuMDc0MzExMTg3OEYsCisgICAgMC4wNzYzNjU3Nzc1RiwgMC4wNzg0NDY2NTI2RiwgMC4wODA1NTM3MTI5RiwgMC4wODI2ODY4NTYxRiwKKyAgICAwLjA4NDg0NTk3ODJGLCAwLjA4NzAzMDk3MzZGLCAwLjA4OTI0MTczNDVGLCAwLjA5MTQ3ODE1MTRGLAorICAgIDAuMDkzNzQwMTEyOEYsIDAuMDk2MDI3NTA1NkYsIDAuMDk4MzQwMjE0NUYsIDAuMTAwNjc4MTIyM0YsCisgICAgMC4xMDMwNDExMTAxRiwgMC4xMDU0MjkwNTY4RiwgMC4xMDc4NDE4Mzk3RiwgMC4xMTAyNzkzMzM2RiwKKyAgICAwLjExMjc0MTQxMTlGLCAwLjExNTIyNzk0NTdGLCAwLjExNzczODgwNDJGLCAwLjEyMDI3Mzg1NDRGLAorICAgIDAuMTIyODMyOTYxOEYsIDAuMTI1NDE1OTg5MkYsIDAuMTI4MDIyNzk4MEYsIDAuMTMwNjUzMjQ3MUYsCisgICAgMC4xMzMzMDcxOTM3RiwgMC4xMzU5ODQ0OTI3RiwgMC4xMzg2ODQ5OTcwRiwgMC4xNDE0MDg1NTc1RiwKKyAgICAwLjE0NDE1NTAyMzBGLCAwLjE0NjkyNDI0MDNGLCAwLjE0OTcxNjA1MzlGLCAwLjE1MjUzMDMwNjNGLAorICAgIDAuMTU1MzY2ODM4MUYsIDAuMTU4MjI1NDg3NUYsIDAuMTYxMTA2MDkwOUYsIDAuMTY0MDA4NDgyMkYsCisgICAgMC4xNjY5MzI0OTM2RiwgMC4xNjk4Nzc5NTQ5RiwgMC4xNzI4NDQ2OTM5RiwgMC4xNzU4MzI1MzYyRiwKKyAgICAwLjE3ODg0MTMwNTVGLCAwLjE4MTg3MDgyMzJGLCAwLjE4NDkyMDkwODRGLCAwLjE4Nzk5MTM3ODVGLAorICAgIDAuMTkxMDgyMDQ4NUYsIDAuMTk0MTkyNzMxMkYsIDAuMTk3MzIzMjM3NkYsIDAuMjAwNDczMzc2NEYsCisgICAgMC4yMDM2NDI5NTQxRiwgMC4yMDY4MzE3NzUyRiwgMC4yMTAwMzk2NDIxRiwgMC4yMTMyNjYzNTUyRiwKKyAgICAwLjIxNjUxMTcxMjVGLCAwLjIxOTc3NTUxMDJGLCAwLjIyMzA1NzU0MjJGLCAwLjIyNjM1NzYwMDdGLAorICAgIDAuMjI5Njc1NDc1M0YsIDAuMjMzMDEwOTU0MEYsIDAuMjM2MzYzODIyNUYsIDAuMjM5NzMzODY0NkYsCisgICAgMC4yNDMxMjA4NjE5RiwgMC4yNDY1MjQ1OTQxRiwgMC4yNDk5NDQ4Mzg5RiwgMC4yNTMzODEzNzE5RiwKKyAgICAwLjI1NjgzMzk2NjlGLCAwLjI2MDMwMjM5NTZGLCAwLjI2Mzc4NjQyNzdGLCAwLjI2NzI4NTgzMTJGLAorICAgIDAuMjcwODAwMzcxOEYsIDAuMjc0MzI5ODEzNUYsIDAuMjc3ODczOTE4NkYsIDAuMjgxNDMyNDQ3MkYsCisgICAgMC4yODUwMDUxNTc2RiwgMC4yODg1OTE4MDY1RiwgMC4yOTIxOTIxNDg1RiwgMC4yOTU4MDU5MzY2RiwKKyAgICAwLjI5OTQzMjkyMTlGLCAwLjMwMzA3Mjg1MzhGLCAwLjMwNjcyNTQ3OTlGLCAwLjMxMDM5MDU0NjJGLAorICAgIDAuMzE0MDY3Nzk2OUYsIDAuMzE3NzU2OTc0N0YsIDAuMzIxNDU3ODIwNUYsIDAuMzI1MTcwMDczNkYsCisgICAgMC4zMjg4OTM0NzE4RiwgMC4zMzI2Mjc3NTEzRiwgMC4zMzYzNzI2NDY4RiwgMC4zNDAxMjc4OTE0RiwKKyAgICAwLjM0Mzg5MzIxNjhGLCAwLjM0NzY2ODM1MzNGLCAwLjM1MTQ1MzAyOTdGLCAwLjM1NTI0Njk3MzRGLAorICAgIDAuMzU5MDQ5OTEwNkYsIDAuMzYyODYxNTY1OUYsIDAuMzY2NjgxNjYzMEYsIDAuMzcwNTA5OTIzOUYsCisgICAgMC4zNzQzNDYwNjk4RiwgMC4zNzgxODk4MjA0RiwgMC4zODIwNDA4OTQ1RiwgMC4zODU4OTkwMDk1RiwKKyAgICAwLjM4OTc2Mzg4MjBGLCAwLjM5MzYzNTIyNzRGLCAwLjM5NzUxMjc2MDFGLCAwLjQwMTM5NjE5MzZGLAorICAgIDAuNDA1Mjg1MjQwNUYsIDAuNDA5MTc5NjEyM0YsIDAuNDEzMDc5MDE5OEYsIDAuNDE2OTgzMTczMkYsCisgICAgMC40MjA4OTE3ODE1RiwgMC40MjQ4MDQ1NTM0RiwgMC40Mjg3MjExOTY1RiwgMC40MzI2NDE0MTgxRiwKKyAgICAwLjQzNjU2NDkyNDhGLCAwLjQ0MDQ5MTQyMjVGLCAwLjQ0NDQyMDYxNjdGLCAwLjQ0ODM1MjIxMjVGLAorICAgIDAuNDUyMjg1OTE0NkYsIDAuNDU2MjIxNDI3MEYsIDAuNDYwMTU4NDUzOEYsIDAuNDY0MDk2Njk4NEYsCisgICAgMC40NjgwMzU4NjQ0RiwgMC40NzE5NzU2NTQ4RiwgMC40NzU5MTU3NzI2RiwgMC40Nzk4NTU5MjA5RiwKKyAgICAwLjQ4Mzc5NTgwMjRGLCAwLjQ4NzczNTExOTlGLCAwLjQ5MTY3MzU3NjVGLCAwLjQ5NTYxMDg3NTFGLAorICAgIDAuNDk5NTQ2NzE4OEYsIDAuNTAzNDgwODEwOUYsIDAuNTA3NDEyODU1MEYsIDAuNTExMzQyNTU1MEYsCisgICAgMC41MTUyNjk2MTQ5RiwgMC41MTkxOTM3Mzk1RiwgMC41MjMxMTQ2MzM2RiwgMC41MjcwMzIwMDI4RiwKKyAgICAwLjUzMDk0NTU1MzBGLCAwLjUzNDg1NDk5MTBGLCAwLjUzODc2MDAyMzlGLCAwLjU0MjY2MDM1OTdGLAorICAgIDAuNTQ2NTU1NzA3MEYsIDAuNTUwNDQ1Nzc1NEYsIDAuNTU0MzMwMjc1MkYsIDAuNTU4MjA4OTE3NUYsCisgICAgMC41NjIwODE0MTQ1RiwgMC41NjU5NDc0NzkzRiwgMC41Njk4MDY4MjYyRiwgMC41NzM2NTkxNzA0RiwKKyAgICAwLjU3NzUwNDIyODNGLCAwLjU4MTM0MTcxNzZGLCAwLjU4NTE3MTM1NzFGLCAwLjU4ODk5Mjg2NzBGLAorICAgIDAuNTkyODA1OTY4OUYsIDAuNTk2NjEwMzg1NkYsIDAuNjAwNDA1ODQxNUYsIDAuNjA0MTkyMDYyNkYsCisgICAgMC42MDc5Njg3NzYxRiwgMC42MTE3MzU3MTEzRiwgMC42MTU0OTI1OTg2RiwgMC42MTkyMzkxNzA1RiwKKyAgICAwLjYyMjk3NTE2MTJGLCAwLjYyNjcwMDMwNjRGLCAwLjYzMDQxNDM0NDFGLCAwLjYzNDExNzAxMzdGLAorICAgIDAuNjM3ODA4MDU2OUYsIDAuNjQxNDg3MjE3M0YsIDAuNjQ1MTU0MjQwNUYsIDAuNjQ4ODA4ODc0MUYsCisgICAgMC42NTI0NTA4NjgxRiwgMC42NTYwNzk5NzQyRiwgMC42NTk2OTU5NDY5RiwgMC42NjMyOTg1NDI0RiwKKyAgICAwLjY2Njg4NzUxOTdGLCAwLjY3MDQ2MjYzOThGLCAwLjY3NDAyMzY2NjJGLCAwLjY3NzU3MDM2NDlGLAorICAgIDAuNjgxMTAyNTA0M0YsIDAuNjg0NjE5ODU1NEYsIDAuNjg4MTIyMTkxNkYsIDAuNjkxNjA5Mjg5MkYsCisgICAgMC42OTUwODA5MjY5RiwgMC42OTg1MzY4ODYxRiwgMC43MDE5NzY5NTEwRiwgMC43MDU0MDA5MDg1RiwKKyAgICAwLjcwODgwODU0ODRGLCAwLjcxMjE5OTY2MzJGLCAwLjcxNTU3NDA0ODRGLCAwLjcxODkzMTUwMjNGLAorICAgIDAuNzIyMjcxODI2M0YsIDAuNzI1NTk0ODI0NUYsIDAuNzI4OTAwMzA0M0YsIDAuNzMyMTg4MDc2MEYsCisgICAgMC43MzU0NTc5NTMwRiwgMC43Mzg3MDk3NTE4RiwgMC43NDE5NDMyOTIxRiwgMC43NDUxNTgzOTY2RiwKKyAgICAwLjc0ODM1NDg5MTVGLCAwLjc1MTUzMjYwNTlGLCAwLjc1NDY5MTM3MjNGLCAwLjc1NzgzMTAyNjVGLAorICAgIDAuNzYwOTUxNDA3N0YsIDAuNzY0MDUyMzU4MUYsIDAuNzY3MTMzNzIzN0YsIDAuNzcwMTk1MzUzNUYsCisgICAgMC43NzMyMzcxMDAxRiwgMC43NzYyNTg4MTk1RiwgMC43NzkyNjAzNzExRiwgMC43ODIyNDE2MTc4RiwKKyAgICAwLjc4NTIwMjQyNTlGLCAwLjc4ODE0MjY2NTRGLCAwLjc5MTA2MjIwOTdGLCAwLjc5Mzk2MDkzNTZGLAorICAgIDAuNzk2ODM4NzIzN0YsIDAuNzk5Njk1NDU3OUYsIDAuODAyNTMxMDI2MUYsIDAuODA1MzQ1MzE5M0YsCisgICAgMC44MDgxMzgyMzI0RiwgMC44MTA5MDk2NjM4RiwgMC44MTM2NTk1MTU2RiwgMC44MTYzODc2OTM2RiwKKyAgICAwLjgxOTA5NDEwNzFGLCAwLjgyMTc3ODY2OTBGLCAwLjgyNDQ0MTI5NjBGLCAwLjgyNzA4MTkwODZGLAorICAgIDAuODI5NzAwNDMwNUYsIDAuODMyMjk2Nzg5NkYsIDAuODM0ODcwOTE3MUYsIDAuODM3NDIyNzQ4MUYsCisgICAgMC44Mzk5NTIyMjEzRiwgMC44NDI0NTkyNzg5RiwgMC44NDQ5NDM4NjcyRiwgMC44NDc0MDU5MzU2RiwKKyAgICAwLjg0OTg0NTQzNzhGLCAwLjg1MjI2MjMzMDZGLCAwLjg1NDY1NjU3NDhGLCAwLjg1NzAyODEzNDhGLAorICAgIDAuODU5Mzc2OTc4N0YsIDAuODYxNzAzMDc3OUYsIDAuODY0MDA2NDA4MEYsIDAuODY2Mjg2OTQ3N0YsCisgICAgMC44Njg1NDQ2Nzk2RiwgMC44NzA3Nzk1ODk5RiwgMC44NzI5OTE2NjgyRiwgMC44NzUxODA5MDc5RiwKKyAgICAwLjg3NzM0NzMwNTlGLCAwLjg3OTQ5MDg2MjZGLCAwLjg4MTYxMTU4MTlGLCAwLjg4MzcwOTQ3MTNGLAorICAgIDAuODg1Nzg0NTQxOEYsIDAuODg3ODM2ODA3OUYsIDAuODg5ODY2Mjg3NEYsIDAuODkxODczMDAxOUYsCisgICAgMC44OTM4NTY5NzYwRiwgMC44OTU4MTgyMzgwRiwgMC44OTc3NTY4MTk0RiwgMC44OTk2NzI3NTUyRiwKKyAgICAwLjkwMTU2NjA4MzdGLCAwLjkwMzQzNjg0NjVGLCAwLjkwNTI4NTA4ODVGLCAwLjkwNzExMDg1NzdGLAorICAgIDAuOTA4OTE0MjA1N0YsIDAuOTEwNjk1MTg2OUYsIDAuOTEyNDUzODU5MUYsIDAuOTE0MTkwMjgzMkYsCisgICAgMC45MTU5MDQ1MjMzRiwgMC45MTc1OTY2NDY0RiwgMC45MTkyNjY3MjI4RiwgMC45MjA5MTQ4MjU3RiwKKyAgICAwLjkyMjU0MTAzMTNGLCAwLjkyNDE0NTQxODdGLCAwLjkyNTcyODA3MDFGLCAwLjkyNzI4OTA3MDRGLAorICAgIDAuOTI4ODI4NTA3NUYsIDAuOTMwMzQ2NDcyMEYsIDAuOTMxODQzMDU3NkYsIDAuOTMzMzE4MzYwM0YsCisgICAgMC45MzQ3NzI0NzkyRiwgMC45MzYyMDU1MTU4RiwgMC45Mzc2MTc1NzQ1RiwgMC45MzkwMDg3NjIyRiwKKyAgICAwLjk0MDM3OTE4ODFGLCAwLjk0MTcyODk2NDRGLCAwLjk0MzA1ODIwNTVGLCAwLjk0NDM2NzAyODNGLAorICAgIDAuOTQ1NjU1NTUyMUYsIDAuOTQ2OTIzODk4NkYsIDAuOTQ4MTcyMTkxN0YsIDAuOTQ5NDAwNTU3N0YsCisgICAgMC45NTA2MDkxMjUyRiwgMC45NTE3OTgwMjQ4RiwgMC45NTI5NjczODk0RiwgMC45NTQxMTczNTQwRiwKKyAgICAwLjk1NTI0ODA1NTdGLCAwLjk1NjM1OTYzMzRGLCAwLjk1NzQ1MjIyODJGLCAwLjk1ODUyNTk4MzBGLAorICAgIDAuOTU5NTgxMDQyOEYsIDAuOTYwNjE3NTU0MkYsIDAuOTYxNjM1NjY1NkYsIDAuOTYyNjM1NTI3NEYsCisgICAgMC45NjM2MTcyOTE1RiwgMC45NjQ1ODExMTE0RiwgMC45NjU1MjcxNDI1RiwgMC45NjY0NTU1NDE0RiwKKyAgICAwLjk2NzM2NjQ2NjRGLCAwLjk2ODI2MDA3NzRGLCAwLjk2OTEzNjUzNTVGLCAwLjk2OTk5NjAwMzRGLAorICAgIDAuOTcwODM4NjQ0OEYsIDAuOTcxNjY0NjI1MEYsIDAuOTcyNDc0MTEwM0YsIDAuOTczMjY3MjY4NUYsCisgICAgMC45NzQwNDQyNjgzRiwgMC45NzQ4MDUyNzk1RiwgMC45NzU1NTA0NzI5RiwgMC45NzYyODAwMjA1RiwKKyAgICAwLjk3Njk5NDA5NTBGLCAwLjk3NzY5Mjg3MDNGLCAwLjk3ODM3NjUyMTBGLCAwLjk3OTA0NTIyMjNGLAorICAgIDAuOTc5Njk5MTUwNEYsIDAuOTgwMzM4NDgyM0YsIDAuOTgwOTYzMzk1NEYsIDAuOTgxNTc0MDY3OUYsCisgICAgMC45ODIxNzA2Nzg0RiwgMC45ODI3NTM0MDYzRiwgMC45ODMzMjI0MzEyRiwgMC45ODM4Nzc5MzMyRiwKKyAgICAwLjk4NDQyMDA5MjhGLCAwLjk4NDk0OTA5MTBGLCAwLjk4NTQ2NTEwODdGLCAwLjk4NTk2ODMyNzRGLAorICAgIDAuOTg2NDU4OTI4NkYsIDAuOTg2OTM3MDk0MEYsIDAuOTg3NDAzMDA1NEYsIDAuOTg3ODU2ODQ0N0YsCisgICAgMC45ODgyOTg3OTM3RiwgMC45ODg3MjkwMzQzRiwgMC45ODkxNDc3NDgxRiwgMC45ODk1NTUxMTY5RiwKKyAgICAwLjk4OTk1MTMyMjBGLCAwLjk5MDMzNjU0NDZGLCAwLjk5MDcxMDk2NThGLCAwLjk5MTA3NDc2NjJGLAorICAgIDAuOTkxNDI4MTI2MEYsIDAuOTkxNzcxMjI1MkYsIDAuOTkyMTA0MjQzM0YsIDAuOTkyNDI3MzU5M0YsCisgICAgMC45OTI3NDA3NTE2RiwgMC45OTMwNDQ1OTgyRiwgMC45OTMzMzkwNzYzRiwgMC45OTM2MjQzNjI2RiwKKyAgICAwLjk5MzkwMDYzMzFGLCAwLjk5NDE2ODA2MzFGLCAwLjk5NDQyNjgyNjlGLCAwLjk5NDY3NzA5ODJGLAorICAgIDAuOTk0OTE5MDQ5OEYsIDAuOTk1MTUyODUzN0YsIDAuOTk1Mzc4NjgwOEYsIDAuOTk1NTk2NzAxMUYsCisgICAgMC45OTU4MDcwODM2RiwgMC45OTYwMDk5OTYzRiwgMC45OTYyMDU2MDYxRiwgMC45OTYzOTQwNzg3RiwKKyAgICAwLjk5NjU3NTU3ODZGLCAwLjk5Njc1MDI2OTNGLCAwLjk5NjkxODMxMjlGLCAwLjk5NzA3OTg3MDRGLAorICAgIDAuOTk3MjM1MTAxM0YsIDAuOTk3Mzg0MTY0MEYsIDAuOTk3NTI3MjE1MUYsIDAuOTk3NjY0NDEwM0YsCisgICAgMC45OTc3OTU5MDM2RiwgMC45OTc5MjE4NDc2RiwgMC45OTgwNDIzOTMyRiwgMC45OTgxNTc2OTAxRiwKKyAgICAwLjk5ODI2Nzg4NjJGLCAwLjk5ODM3MzEyNzhGLCAwLjk5ODQ3MzU1OTZGLCAwLjk5ODU2OTMyNDdGLAorICAgIDAuOTk4NjYwNTY0NUYsIDAuOTk4NzQ3NDE4NkYsIDAuOTk4ODMwMDI0OEYsIDAuOTk4OTA4NTE5M0YsCisgICAgMC45OTg5ODMwMzY0RiwgMC45OTkwNTM3MDg1RiwgMC45OTkxMjA2NjYyRiwgMC45OTkxODQwMzgyRiwKKyAgICAwLjk5OTI0Mzk1MTNGLCAwLjk5OTMwMDUzMDNGLCAwLjk5OTM1Mzg5ODJGLCAwLjk5OTQwNDE3NTdGLAorICAgIDAuOTk5NDUxNDgxN0YsIDAuOTk5NDk1OTMzMEYsIDAuOTk5NTM3NjQ0NEYsIDAuOTk5NTc2NzI4NkYsCisgICAgMC45OTk2MTMyOTYwRiwgMC45OTk2NDc0NTUwRiwgMC45OTk2NzkzMTIxRiwgMC45OTk3MDg5NzEwRiwKKyAgICAwLjk5OTczNjUzMzlGLCAwLjk5OTc2MjEwMDNGLCAwLjk5OTc4NTc2NzdGLCAwLjk5OTgwNzYzMTFGLAorICAgIDAuOTk5ODI3NzgzNkYsIDAuOTk5ODQ2MzE1NkYsIDAuOTk5ODYzMzE1NUYsIDAuOTk5ODc4ODY5MkYsCisgICAgMC45OTk4OTMwNjAzRiwgMC45OTk5MDU5NzAxRiwgMC45OTk5MTc2Nzc0RiwgMC45OTk5MjgyNTg2RiwKKyAgICAwLjk5OTkzNzc4ODBGLCAwLjk5OTk0NjMzNzBGLCAwLjk5OTk1Mzk3NDlGLCAwLjk5OTk2MDc2ODVGLAorICAgIDAuOTk5OTY2NzgyMEYsIDAuOTk5OTcyMDc3M0YsIDAuOTk5OTc2NzEzNkYsIDAuOTk5OTgwNzQ3OUYsCisgICAgMC45OTk5ODQyMzQ0RiwgMC45OTk5ODcyMjQ5RiwgMC45OTk5ODk3Njg4RiwgMC45OTk5OTE5MTI3RiwKKyAgICAwLjk5OTk5MzcwMDlGLCAwLjk5OTk5NTE3NDlGLCAwLjk5OTk5NjM3MzhGLCAwLjk5OTk5NzMzNDJGLAorICAgIDAuOTk5OTk4MDkwMEYsIDAuOTk5OTk4NjcyNEYsIDAuOTk5OTk5MTEwM0YsIDAuOTk5OTk5NDI5N0YsCisgICAgMC45OTk5OTk2NTQzRiwgMC45OTk5OTk4MDQ5RiwgMC45OTk5OTk5MDAwRiwgMC45OTk5OTk5NTUyRiwKKyAgICAwLjk5OTk5OTk4MzZGLCAwLjk5OTk5OTk5NTdGLCAwLjk5OTk5OTk5OTRGLCAxLjAwMDAwMDAwMDBGLAorfTsKKworREVDTEFSRV9BTElHTkVEKDE2LCBzdGF0aWMgY29uc3QgZmxvYXQsIHZ3aW4yMDQ4KVsxMDI0XSA9IHsKKyAgICAwLjAwMDAwMDkyNDFGLCAwLjAwMDAwODMxNjVGLCAwLjAwMDAyMzEwMTRGLCAwLjAwMDA0NTI3ODVGLAorICAgIDAuMDAwMDc0ODQ3NkYsIDAuMDAwMTExODA4NUYsIDAuMDAwMTU2MTYwOEYsIDAuMDAwMjA3OTA0MUYsCisgICAgMC4wMDAyNjcwMzc5RiwgMC4wMDAzMzM1NjE3RiwgMC4wMDA0MDc0NzQ4RiwgMC4wMDA0ODg3NzY1RiwKKyAgICAwLjAwMDU3NzQ2NjFGLCAwLjAwMDY3MzU0MjdGLCAwLjAwMDc3NzAwNTRGLCAwLjAwMDg4Nzg1MzNGLAorICAgIDAuMDAxMDA2MDg1M0YsIDAuMDAxMTMxNzAwMkYsIDAuMDAxMjY0Njk2OUYsIDAuMDAxNDA1MDc0MkYsCisgICAgMC4wMDE1NTI4MzA3RiwgMC4wMDE3MDc5NjUwRiwgMC4wMDE4NzA0NzU2RiwgMC4wMDIwNDAzNjEwRiwKKyAgICAwLjAwMjIxNzYxOTZGLCAwLjAwMjQwMjI0OTdGLCAwLjAwMjU5NDI0OTVGLCAwLjAwMjc5MzYxNzNGLAorICAgIDAuMDAzMDAwMzUxMUYsIDAuMDAzMjE0NDQ5MEYsIDAuMDAzNDM1OTA4OEYsIDAuMDAzNjY0NzI4NkYsCisgICAgMC4wMDM5MDA5MDYxRiwgMC4wMDQxNDQ0MzkxRiwgMC4wMDQzOTUzMjUzRiwgMC4wMDQ2NTM1NjIxRiwKKyAgICAwLjAwNDkxOTE0NzJGLCAwLjAwNTE5MjA3ODFGLCAwLjAwNTQ3MjM1MjBGLCAwLjAwNTc1OTk2NjRGLAorICAgIDAuMDA2MDU0OTE4NEYsIDAuMDA2MzU3MjA1MkYsIDAuMDA2NjY2ODIzOUYsIDAuMDA2OTgzNzcxNUYsCisgICAgMC4wMDczMDgwNDQ5RiwgMC4wMDc2Mzk2NDEwRiwgMC4wMDc5Nzg1NTY2RiwgMC4wMDgzMjQ3ODg0RiwKKyAgICAwLjAwODY3ODMzMzBGLCAwLjAwOTAzOTE4NzFGLCAwLjAwOTQwNzM0NzBGLCAwLjAwOTc4MjgwOTJGLAorICAgIDAuMDEwMTY1NTcwMEYsIDAuMDEwNTU1NjI1OEYsIDAuMDEwOTUyOTcyNkYsIDAuMDExMzU3NjA2NUYsCisgICAgMC4wMTE3Njk1MjM3RiwgMC4wMTIxODg3MjAwRiwgMC4wMTI2MTUxOTEzRiwgMC4wMTMwNDg5MzM1RiwKKyAgICAwLjAxMzQ4OTk0MjJGLCAwLjAxMzkzODIxMzBGLCAwLjAxNDM5Mzc0MTVGLCAwLjAxNDg1NjUyMzNGLAorICAgIDAuMDE1MzI2NTUzNkYsIDAuMDE1ODAzODI3OUYsIDAuMDE2Mjg4MzQxM0YsIDAuMDE2NzgwMDg4OUYsCisgICAgMC4wMTcyNzkwNjYwRiwgMC4wMTc3ODUyNjc1RiwgMC4wMTgyOTg2ODgyRiwgMC4wMTg4MTkzMjMxRiwKKyAgICAwLjAxOTM0NzE2NjhGLCAwLjAxOTg4MjIxNDFGLCAwLjAyMDQyNDQ1OTRGLCAwLjAyMDk3Mzg5NzRGLAorICAgIDAuMDIxNTMwNTIyNUYsIDAuMDIyMDk0MzI4OUYsIDAuMDIyNjY1MzEwOUYsIDAuMDIzMjQzNDYyN0YsCisgICAgMC4wMjM4Mjg3Nzg0RiwgMC4wMjQ0MjEyNTE5RiwgMC4wMjUwMjA4NzcyRiwgMC4wMjU2Mjc2NDgxRiwKKyAgICAwLjAyNjI0MTU1ODJGLCAwLjAyNjg2MjYwMTRGLCAwLjAyNzQ5MDc3MTFGLCAwLjAyODEyNjA2MDhGLAorICAgIDAuMDI4NzY4NDYzOEYsIDAuMDI5NDE3OTczNkYsIDAuMDMwMDc0NTgzM0YsIDAuMDMwNzM4Mjg1OUYsCisgICAgMC4wMzE0MDkwNzQ3RiwgMC4wMzIwODY5NDI0RiwgMC4wMzI3NzE4ODE5RiwgMC4wMzM0NjM4ODYwRiwKKyAgICAwLjAzNDE2Mjk0NzRGLCAwLjAzNDg2OTA1ODZGLCAwLjAzNTU4MjIxMjJGLCAwLjAzNjMwMjQwMDRGLAorICAgIDAuMDM3MDI5NjE1N0YsIDAuMDM3NzYzODUwMkYsIDAuMDM4NTA1MDk2MEYsIDAuMDM5MjUzMzQ1MUYsCisgICAgMC4wNDAwMDg1ODk2RiwgMC4wNDA3NzA4MjExRiwgMC4wNDE1NDAwMzE1RiwgMC4wNDIzMTYyMTIzRiwKKyAgICAwLjA0MzA5OTM1NTJGLCAwLjA0Mzg4OTQ1MTVGLCAwLjA0NDY4NjQ5MjZGLCAwLjA0NTQ5MDQ2OThGLAorICAgIDAuMDQ2MzAxMzc0MkYsIDAuMDQ3MTE5MTk2OUYsIDAuMDQ3OTQzOTI4OEYsIDAuMDQ4Nzc1NTYwN0YsCisgICAgMC4wNDk2MTQwODM2RiwgMC4wNTA0NTk0ODc5RiwgMC4wNTEzMTE3NjQyRiwgMC4wNTIxNzA5MDMxRiwKKyAgICAwLjA1MzAzNjg5NDlGLCAwLjA1MzkwOTcyOTdGLCAwLjA1NDc4OTM5NzlGLCAwLjA1NTY3NTg4OTRGLAorICAgIDAuMDU2NTY5MTk0MUYsIDAuMDU3NDY5MzAxOUYsIDAuMDU4Mzc2MjAyNkYsIDAuMDU5Mjg5ODg1OEYsCisgICAgMC4wNjAyMTAzNDEwRiwgMC4wNjExMzc1NTc2RiwgMC4wNjIwNzE1MjUwRiwgMC4wNjMwMTIyMzI0RiwKKyAgICAwLjA2Mzk1OTY2ODhGLCAwLjA2NDkxMzgyMzRGLCAwLjA2NTg3NDY4NDhGLCAwLjA2Njg0MjI0MjFGLAorICAgIDAuMDY3ODE2NDgzOEYsIDAuMDY4Nzk3Mzk4NUYsIDAuMDY5Nzg0OTc0NkYsIDAuMDcwNzc5MjAwNUYsCisgICAgMC4wNzE3ODAwNjQ1RiwgMC4wNzI3ODc1NTQ3RiwgMC4wNzM4MDE2NTkxRiwgMC4wNzQ4MjIzNjU2RiwKKyAgICAwLjA3NTg0OTY2MjBGLCAwLjA3Njg4MzUzNTlGLCAwLjA3NzkyMzk3NTFGLCAwLjA3ODk3MDk2NjhGLAorICAgIDAuMDgwMDI0NDk4NUYsIDAuMDgxMDg0NTU3NEYsIDAuMDgyMTUxMTMwNkYsIDAuMDgzMjI0MjA1MkYsCisgICAgMC4wODQzMDM3Njc5RiwgMC4wODUzODk4MDU2RiwgMC4wODY0ODIzMDUwRiwgMC4wODc1ODEyNTI1RiwKKyAgICAwLjA4ODY4NjYzNDdGLCAwLjA4OTc5ODQzNzhGLCAwLjA5MDkxNjY0ODBGLCAwLjA5MjA0MTI1MTNGLAorICAgIDAuMDkzMTcyMjMzOEYsIDAuMDk0MzA5NTgxM0YsIDAuMDk1NDUzMjc5NUYsIDAuMDk2NjAzMzE0MEYsCisgICAgMC4wOTc3NTk2NzAyRiwgMC4wOTg5MjIzMzM2RiwgMC4xMDAwOTEyODk0RiwgMC4xMDEyNjY1MjI3RiwKKyAgICAwLjEwMjQ0ODAxODVGLCAwLjEwMzYzNTc2MTZGLCAwLjEwNDgyOTczNjlGLCAwLjEwNjAyOTkyOTBGLAorICAgIDAuMTA3MjM2MzIyNEYsIDAuMTA4NDQ4OTAxNEYsIDAuMTA5NjY3NjUwNEYsIDAuMTEwODkyNTUzNEYsCisgICAgMC4xMTIxMjM1OTQ2RiwgMC4xMTMzNjA3NTc3RiwgMC4xMTQ2MDQwMjY3RiwgMC4xMTU4NTMzODUwRiwKKyAgICAwLjExNzEwODgxNjNGLCAwLjExODM3MDMwNDBGLCAwLjExOTYzNzgzMTJGLCAwLjEyMDkxMTM4MTJGLAorICAgIDAuMTIyMTkwOTM3MEYsIDAuMTIzNDc2NDgxNUYsIDAuMTI0NzY3OTk3NEYsIDAuMTI2MDY1NDY3NEYsCisgICAgMC4xMjczNjg4NzQwRiwgMC4xMjg2NzgxOTk1RiwgMC4xMjk5OTM0MjYzRiwgMC4xMzEzMTQ1MzY1RiwKKyAgICAwLjEzMjY0MTUxMjFGLCAwLjEzMzk3NDMzNDlGLCAwLjEzNTMxMjk4NjZGLCAwLjEzNjY1NzQ0OTBGLAorICAgIDAuMTM4MDA3NzAzNUYsIDAuMTM5MzYzNzMxNUYsIDAuMTQwNzI1NTE0MUYsIDAuMTQyMDkzMDMyNUYsCisgICAgMC4xNDM0NjYyNjc3RiwgMC4xNDQ4NDUyMDA0RiwgMC4xNDYyMjk4MTE1RiwgMC4xNDc2MjAwODE0RiwKKyAgICAwLjE0OTAxNTk5MDZGLCAwLjE1MDQxNzUxOTVGLCAwLjE1MTgyNDY0ODJGLCAwLjE1MzIzNzM1NjlGLAorICAgIDAuMTU0NjU1NjI1M0YsIDAuMTU2MDc5NDMzM0YsIDAuMTU3NTA4NzYwNkYsIDAuMTU4OTQzNTg2NkYsCisgICAgMC4xNjAzODM4OTA5RiwgMC4xNjE4Mjk2NTI2RiwgMC4xNjMyODA4NTA5RiwgMC4xNjQ3Mzc0NjQ4RiwKKyAgICAwLjE2NjE5OTQ3MzFGLCAwLjE2NzY2Njg1NDZGLCAwLjE2OTEzOTU4ODBGLCAwLjE3MDYxNzY1MTZGLAorICAgIDAuMTcyMTAxMDIzOEYsIDAuMTczNTg5NjgyOUYsIDAuMTc1MDgzNjA2OEYsIDAuMTc2NTgyNzczNkYsCisgICAgMC4xNzgwODcxNjEwRiwgMC4xNzk1OTY3NDY4RiwgMC4xODExMTE1MDg0RiwgMC4xODI2MzE0MjM0RiwKKyAgICAwLjE4NDE1NjQ2ODlGLCAwLjE4NTY4NjYyMjFGLCAwLjE4NzIyMTg2MDBGLCAwLjE4ODc2MjE1OTVGLAorICAgIDAuMTkwMzA3NDk3NEYsIDAuMTkxODU3ODUwM0YsIDAuMTkzNDEzMTk0N0YsIDAuMTk0OTczNTA2OEYsCisgICAgMC4xOTY1Mzg3NjMwRiwgMC4xOTgxMDg5MzkzRiwgMC4xOTk2ODQwMTE3RiwgMC4yMDEyNjM5NTYwRiwKKyAgICAwLjIwMjg0ODc0NzlGLCAwLjIwNDQzODM2MzBGLCAwLjIwNjAzMjc3NjZGLCAwLjIwNzYzMTk2NDJGLAorICAgIDAuMjA5MjM1OTAwN0YsIDAuMjEwODQ0NTYxNEYsIDAuMjEyNDU3OTIxMUYsIDAuMjE0MDc1OTU0NUYsCisgICAgMC4yMTU2OTg2MzY0RiwgMC4yMTczMjU5NDExRiwgMC4yMTg5NTc4NDMyRiwgMC4yMjA1OTQzMTY4RiwKKyAgICAwLjIyMjIzNTMzNjFGLCAwLjIyMzg4MDg3NTFGLCAwLjIyNTUzMDkwNzZGLCAwLjIyNzE4NTQwNzNGLAorICAgIDAuMjI4ODQ0MzQ4MEYsIDAuMjMwNTA3NzAzMEYsIDAuMjMyMTc1NDQ1N0YsIDAuMjMzODQ3NTQ5M0YsCisgICAgMC4yMzU1MjM5ODY5RiwgMC4yMzcyMDQ3MzE1RiwgMC4yMzg4ODk3NTYwRiwgMC4yNDA1NzkwMzI5RiwKKyAgICAwLjI0MjI3MjUzNTBGLCAwLjI0Mzk3MDIzNDdGLCAwLjI0NTY3MjEwNDNGLCAwLjI0NzM3ODExNTlGLAorICAgIDAuMjQ5MDg4MjQxOEYsIDAuMjUwODAyNDUzOUYsIDAuMjUyNTIwNzI0MEYsIDAuMjU0MjQzMDIzN0YsCisgICAgMC4yNTU5NjkzMjQ4RiwgMC4yNTc2OTk1OTg2RiwgMC4yNTk0MzM4MTY2RiwgMC4yNjExNzE5NDk4RiwKKyAgICAwLjI2MjkxMzk2OTVGLCAwLjI2NDY1OTg0NjZGLCAwLjI2NjQwOTU1MjBGLCAwLjI2ODE2MzA1NjRGLAorICAgIDAuMjY5OTIwMzMwNEYsIDAuMjcxNjgxMzQ0NUYsIDAuMjczNDQ2MDY5MUYsIDAuMjc1MjE0NDc0NEYsCisgICAgMC4yNzY5ODY1MzA3RiwgMC4yNzg3NjIyMDc5RiwgMC4yODA1NDE0NzYwRiwgMC4yODIzMjQzMDQ3RiwKKyAgICAwLjI4NDExMDY2MzdGLCAwLjI4NTkwMDUyMjdGLCAwLjI4NzY5Mzg1MDlGLCAwLjI4OTQ5MDYxNzlGLAorICAgIDAuMjkxMjkwNzkyOEYsIDAuMjkzMDk0MzQ0N0YsIDAuMjk0OTAxMjQyNkYsIDAuMjk2NzExNDU1NEYsCisgICAgMC4yOTg1MjQ5NTIwRiwgMC4zMDAzNDE3MDA5RiwgMC4zMDIxNjE2NzA4RiwgMC4zMDM5ODQ4MzAxRiwKKyAgICAwLjMwNTgxMTE0NzFGLCAwLjMwNzY0MDU5MDFGLCAwLjMwOTQ3MzEyNzNGLCAwLjMxMTMwODcyNjZGLAorICAgIDAuMzEzMTQ3MzU2MEYsIDAuMzE0OTg4OTgzM0YsIDAuMzE2ODMzNTc2MkYsIDAuMzE4NjgxMTAyNEYsCisgICAgMC4zMjA1MzE1Mjk0RiwgMC4zMjIzODQ4MjQ1RiwgMC4zMjQyNDA5NTUyRiwgMC4zMjYwOTk4ODg2RiwKKyAgICAwLjMyNzk2MTU5MThGLCAwLjMyOTgyNjAzMTlGLCAwLjMzMTY5MzE3NThGLCAwLjMzMzU2Mjk5MDNGLAorICAgIDAuMzM1NDM1NDQyM0YsIDAuMzM3MzEwNDk4MkYsIDAuMzM5MTg4MTI0N0YsIDAuMzQxMDY4Mjg4MkYsCisgICAgMC4zNDI5NTA5NTUxRiwgMC4zNDQ4MzYwOTE3RiwgMC4zNDY3MjM2NjQyRiwgMC4zNDg2MTM2Mzg3RiwKKyAgICAwLjM1MDUwNTk4MTFGLCAwLjM1MjQwMDY1NzVGLCAwLjM1NDI5NzYzMzZGLCAwLjM1NjE5Njg3NTNGLAorICAgIDAuMzU4MDk4MzQ4MkYsIDAuMzYwMDAyMDE3OUYsIDAuMzYxOTA3ODQ5OUYsIDAuMzYzODE1ODA5NkYsCisgICAgMC4zNjU3MjU4NjI1RiwgMC4zNjc2Mzc5NzM3RiwgMC4zNjk1NTIxMDg2RiwgMC4zNzE0NjgyMzIxRiwKKyAgICAwLjM3MzM4NjMwOTRGLCAwLjM3NTMwNjMwNTVGLCAwLjM3NzIyODE4NTJGLCAwLjM3OTE1MTkxMzRGLAorICAgIDAuMzgxMDc3NDU0OEYsIDAuMzgzMDA0Nzc0MkYsIDAuMzg0OTMzODM2MkYsIDAuMzg2ODY0NjA1M0YsCisgICAgMC4zODg3OTcwNDU5RiwgMC4zOTA3MzExMjI3RiwgMC4zOTI2NjY3OTk4RiwgMC4zOTQ2MDQwNDE3RiwKKyAgICAwLjM5NjU0MjgxMjVGLCAwLjM5ODQ4MzA3NjVGLCAwLjQwMDQyNDc5NzhGLCAwLjQwMjM2Nzk0MDNGLAorICAgIDAuNDA0MzEyNDY4M0YsIDAuNDA2MjU4MzQ1NUYsIDAuNDA4MjA1NTM1OUYsIDAuNDEwMTU0MDAzNEYsCisgICAgMC40MTIxMDM3MTE3RiwgMC40MTQwNTQ2MjQ2RiwgMC40MTYwMDY3MDU4RiwgMC40MTc5NTk5MTkwRiwKKyAgICAwLjQxOTkxNDIyNzdGLCAwLjQyMTg2OTU5NTZGLCAwLjQyMzgyNTk4NjFGLCAwLjQyNTc4MzM2MjdGLAorICAgIDAuNDI3NzQxNjg4OEYsIDAuNDI5NzAwOTI3OUYsIDAuNDMxNjYxMDQzM0YsIDAuNDMzNjIxOTk4M0YsCisgICAgMC40MzU1ODM3NTYyRiwgMC40Mzc1NDYyODAzRiwgMC40Mzk1MDk1MzM3RiwgMC40NDE0NzM0Nzk3RiwKKyAgICAwLjQ0MzQzODA4MTVGLCAwLjQ0NTQwMzMwMjFGLCAwLjQ0NzM2OTEwNDZGLCAwLjQ0OTMzNTQ1MjFGLAorICAgIDAuNDUxMzAyMzA3OEYsIDAuNDUzMjY5NjM0NUYsIDAuNDU1MjM3Mzk1NEYsIDAuNDU3MjA1NTUzM0YsCisgICAgMC40NTkxNzQwNzEzRiwgMC40NjExNDI5MTIzRiwgMC40NjMxMTIwMzkzRiwgMC40NjUwODE0MTUxRiwKKyAgICAwLjQ2NzA1MTAwMjhGLCAwLjQ2OTAyMDc2NTBGLCAwLjQ3MDk5MDY2NDlGLCAwLjQ3Mjk2MDY2NTFGLAorICAgIDAuNDc0OTMwNzI4N0YsIDAuNDc2OTAwODE4NUYsIDAuNDc4ODcwODk3MkYsIDAuNDgwODQwOTI3OUYsCisgICAgMC40ODI4MTA4NzMyRiwgMC40ODQ3ODA2OTYyRiwgMC40ODY3NTAzNTk3RiwgMC40ODg3MTk4MjY0RiwKKyAgICAwLjQ5MDY4OTA1OTNGLCAwLjQ5MjY1ODAyMTNGLCAwLjQ5NDYyNjY3NTNGLCAwLjQ5NjU5NDk4NDBGLAorICAgIDAuNDk4NTYyOTEwNUYsIDAuNTAwNTMwNDE3NkYsIDAuNTAyNDk3NDY4M0YsIDAuNTA0NDY0MDI1NUYsCisgICAgMC41MDY0MzAwNTIyRiwgMC41MDgzOTU1MTE0RiwgMC41MTAzNjAzNjU5RiwgMC41MTIzMjQ1NzkwRiwKKyAgICAwLjUxNDI4ODExMzZGLCAwLjUxNjI1MDkzMjhGLCAwLjUxODIxMjk5OTdGLCAwLjUyMDE3NDI3NzRGLAorICAgIDAuNTIyMTM0NzI5MEYsIDAuNTI0MDk0MzE3OEYsIDAuNTI2MDUzMDA3MEYsIDAuNTI4MDEwNzU5OEYsCisgICAgMC41Mjk5Njc1Mzk1RiwgMC41MzE5MjMzMDk1RiwgMC41MzM4NzgwMzMwRiwgMC41MzU4MzE2NzM2RiwKKyAgICAwLjUzNzc4NDE5NDZGLCAwLjUzOTczNTU1OTZGLCAwLjU0MTY4NTczMjBGLCAwLjU0MzYzNDY3NTVGLAorICAgIDAuNTQ1NTgyMzUzOEYsIDAuNTQ3NTI4NzMwNEYsIDAuNTQ5NDczNzY5MUYsIDAuNTUxNDE3NDMzN0YsCisgICAgMC41NTMzNTk2ODgxRiwgMC41NTUzMDA0OTYyRiwgMC41NTcyMzk4MjE4RiwgMC41NTkxNzc2MjkxRiwKKyAgICAwLjU2MTExMzg4MjFGLCAwLjU2MzA0ODU0NDlGLCAwLjU2NDk4MTU4MThGLCAwLjU2NjkxMjk1NzBGLAorICAgIDAuNTY4ODQyNjM0OUYsIDAuNTcwNzcwNTc5OUYsIDAuNTcyNjk2NzU2NEYsIDAuNTc0NjIxMTI5MEYsCisgICAgMC41NzY1NDM2NjI0RiwgMC41Nzg0NjQzMjEyRiwgMC41ODAzODMwNzAyRiwgMC41ODIyOTk4NzQzRiwKKyAgICAwLjU4NDIxNDY5ODRGLCAwLjU4NjEyNzUwNzZGLCAwLjU4ODAzODI2NjlGLCAwLjU4OTk0Njk0MTZGLAorICAgIDAuNTkxODUzNDk2OEYsIDAuNTkzNzU3ODk4MUYsIDAuNTk1NjYwMTEwN0YsIDAuNTk3NTYwMTAwNEYsCisgICAgMC41OTk0NTc4MzI2RiwgMC42MDEzNTMyNzMyRiwgMC42MDMyNDYzODgwRiwgMC42MDUxMzcxNDI5RiwKKyAgICAwLjYwNzAyNTUwMzlGLCAwLjYwODkxMTQzNzJGLCAwLjYxMDc5NDkwOTBGLCAwLjYxMjY3NTg4NTZGLAorICAgIDAuNjE0NTU0MzMzNEYsIDAuNjE2NDMwMjE5MUYsIDAuNjE4MzAzNTA5MkYsIDAuNjIwMTc0MTcwNkYsCisgICAgMC42MjIwNDIxNzAwRiwgMC42MjM5MDc0NzQ1RiwgMC42MjU3NzAwNTEzRiwgMC42Mjc2Mjk4Njc0RiwKKyAgICAwLjYyOTQ4Njg5MDNGLCAwLjYzMTM0MTA4NzNGLCAwLjYzMzE5MjQyNjJGLCAwLjYzNTA0MDg3NDVGLAorICAgIDAuNjM2ODg2NDAwMUYsIDAuNjM4NzI4OTcxMEYsIDAuNjQwNTY4NTU1MkYsIDAuNjQyNDA1MTIwOUYsCisgICAgMC42NDQyMzg2MzY0RiwgMC42NDYwNjkwNzAyRiwgMC42NDc4OTYzOTEwRiwgMC42NDk3MjA1NjczRiwKKyAgICAwLjY1MTU0MTU2ODJGLCAwLjY1MzM1OTM2MjVGLCAwLjY1NTE3MzkxOTRGLCAwLjY1Njk4NTIwODJGLAorICAgIDAuNjU4NzkzMTk4NEYsIDAuNjYwNTk3ODU5M0YsIDAuNjYyMzk5MTYwOUYsIDAuNjY0MTk3MDcyOEYsCisgICAgMC42NjU5OTE1NjUyRiwgMC42Njc3ODI2MDgxRiwgMC42Njk1NzAxNzE4RiwgMC42NzEzNTQyMjY4RiwKKyAgICAwLjY3MzEzNDc0MzdGLCAwLjY3NDkxMTY5MzJGLCAwLjY3NjY4NTA0NjFGLCAwLjY3ODQ1NDc3MzZGLAorICAgIDAuNjgwMjIwODQ2OUYsIDAuNjgxOTgzMjM3NEYsIDAuNjgzNzQxOTE2NEYsIDAuNjg1NDk2ODU1OUYsCisgICAgMC42ODcyNDgwMjc1RiwgMC42ODg5OTU0MDM0RiwgMC42OTA3Mzg5NTU2RiwgMC42OTI0Nzg2NTY2RiwKKyAgICAwLjY5NDIxNDQ3ODhGLCAwLjY5NTk0NjM5NTBGLCAwLjY5NzY3NDM3ODBGLCAwLjY5OTM5ODQwMDhGLAorICAgIDAuNzAxMTE4NDM2NUYsIDAuNzAyODM0NDU4N0YsIDAuNzA0NTQ2NDQwN0YsIDAuNzA2MjU0MzU2NEYsCisgICAgMC43MDc5NTgxNzk2RiwgMC43MDk2NTc4ODQ0RiwgMC43MTEzNTM0NDUwRiwgMC43MTMwNDQ4MzU5RiwKKyAgICAwLjcxNDczMjAzMTZGLCAwLjcxNjQxNTAwNzBGLCAwLjcxODA5MzczNzFGLCAwLjcxOTc2ODE5NzBGLAorICAgIDAuNzIxNDM4MzYyMEYsIDAuNzIzMTA0MjA3N0YsIDAuNzI0NzY1NzA5OEYsIDAuNzI2NDIyODQ0M0YsCisgICAgMC43MjgwNzU1ODcxRiwgMC43Mjk3MjM5MTQ3RiwgMC43MzEzNjc4MDM1RiwgMC43MzMwMDcyMzAxRiwKKyAgICAwLjczNDY0MjE3MTVGLCAwLjczNjI3MjYwNDZGLCAwLjczNzg5ODUwNjlGLCAwLjczOTUxOTg1NTZGLAorICAgIDAuNzQxMTM2NjI4NUYsIDAuNzQyNzQ4ODAzNEYsIDAuNzQ0MzU2MzU4NEYsIDAuNzQ1OTU5MjcxN0YsCisgICAgMC43NDc1NTc1MjE4RiwgMC43NDkxNTEwODczRiwgMC43NTA3Mzk5NDcxRiwgMC43NTIzMjQwODAzRiwKKyAgICAwLjc1MzkwMzQ2NjFGLCAwLjc1NTQ3ODA4MzlGLCAwLjc1NzA0NzkxMzZGLCAwLjc1ODYxMjkzNDlGLAorICAgIDAuNzYwMTczMTI3OUYsIDAuNzYxNzI4NDczMEYsIDAuNzYzMjc4OTUwNkYsIDAuNzY0ODI0NTQxNkYsCisgICAgMC43NjYzNjUyMjY3RiwgMC43Njc5MDA5ODcyRiwgMC43Njk0MzE4MDQ0RiwgMC43NzA5NTc2NTk5RiwKKyAgICAwLjc3MjQ3ODUzNTRGLCAwLjc3Mzk5NDQxMzBGLCAwLjc3NTUwNTI3NDlGLCAwLjc3NzAxMTEwMzVGLAorICAgIDAuNzc4NTExODgxNUYsIDAuNzgwMDA3NTkxNkYsIDAuNzgxNDk4MjE3MEYsIDAuNzgyOTgzNzQxMEYsCisgICAgMC43ODQ0NjQxNDcyRiwgMC43ODU5Mzk0MTkxRiwgMC43ODc0MDk1NDA4RiwgMC43ODg4NzQ0OTY1RiwKKyAgICAwLjc5MDMzNDI3MDZGLCAwLjc5MTc4ODg0NzZGLCAwLjc5MzIzODIxMjRGLCAwLjc5NDY4MjM1MDFGLAorICAgIDAuNzk2MTIxMjQ2MEYsIDAuNzk3NTU0ODg1NUYsIDAuNzk4OTgzMjU0NEYsIDAuODAwNDA2MzM4NkYsCisgICAgMC44MDE4MjQxMjQ0RiwgMC44MDMyMzY1OTgxRiwgMC44MDQ2NDM3NDYzRiwgMC44MDYwNDU1NTYwRiwKKyAgICAwLjgwNzQ0MjAxNDFGLCAwLjgwODgzMzEwODBGLCAwLjgxMDIxODgyNTNGLCAwLjgxMTU5OTE1MzZGLAorICAgIDAuODEyOTc0MDgxMEYsIDAuODE0MzQzNTk1N0YsIDAuODE1NzA3Njg2MUYsIDAuODE3MDY2MzQwOUYsCisgICAgMC44MTg0MTk1NDg5RiwgMC44MTk3NjcyOTk0RiwgMC44MjExMDk1ODE3RiwgMC44MjI0NDYzODUzRiwKKyAgICAwLjgyMzc3NzcwMDFGLCAwLjgyNTEwMzUxNjFGLCAwLjgyNjQyMzgyMzVGLCAwLjgyNzczODYxMjlGLAorICAgIDAuODI5MDQ3ODc1MEYsIDAuODMwMzUxNjAwOEYsIDAuODMxNjQ5NzgxNEYsIDAuODMyOTQyNDA4M0YsCisgICAgMC44MzQyMjk0NzMxRiwgMC44MzU1MTA5Njc3RiwgMC44MzY3ODY4ODQxRiwgMC44MzgwNTcyMTQ4RiwKKyAgICAwLjgzOTMyMTk1MjNGLCAwLjg0MDU4MTA4OTNGLCAwLjg0MTgzNDYxOTBGLCAwLjg0MzA4MjUzNDVGLAorICAgIDAuODQ0MzI0ODI5NEYsIDAuODQ1NTYxNDk3NEYsIDAuODQ2NzkyNTMyM0YsIDAuODQ4MDE3OTI4NUYsCisgICAgMC44NDkyMzc2ODAyRiwgMC44NTA0NTE3ODIyRiwgMC44NTE2NjAyMjkyRiwgMC44NTI4NjMwMTY0RiwKKyAgICAwLjg1NDA2MDEzOTFGLCAwLjg1NTI1MTU5MjhGLCAwLjg1NjQzNzM3MzNGLCAwLjg1NzYxNzQ3NjZGLAorICAgIDAuODU4NzkxODk5MEYsIDAuODU5OTYwNjM2OEYsIDAuODYxMTIzNjg2OEYsIDAuODYyMjgxMDQ2MEYsCisgICAgMC44NjM0MzI3MTEzRiwgMC44NjQ1Nzg2ODAyRiwgMC44NjU3MTg5NTA0RiwgMC44NjY4NTM1MTk1RiwKKyAgICAwLjg2Nzk4MjM4NTdGLCAwLjg2OTEwNTU0NzJGLCAwLjg3MDIyMzAwMjVGLCAwLjg3MTMzNDc1MDNGLAorICAgIDAuODcyNDQwNzg5NkYsIDAuODczNTQxMTE5NEYsIDAuODc0NjM1NzM5NEYsIDAuODc1NzI0NjQ4OUYsCisgICAgMC44NzY4MDc4NDc5RiwgMC44Nzc4ODUzMzY0RiwgMC44Nzg5NTcxMTQ2RiwgMC44ODAwMjMxODMyRiwKKyAgICAwLjg4MTA4MzU0MjdGLCAwLjg4MjEzODE5NDJGLCAwLjg4MzE4NzEzODdGLCAwLjg4NDIzMDM3NzdGLAorICAgIDAuODg1MjY3OTEyN0YsIDAuODg2Mjk5NzQ1NkYsIDAuODg3MzI1ODc4NEYsIDAuODg4MzQ2MzEzMkYsCisgICAgMC44ODkzNjEwNTI3RiwgMC44OTAzNzAwOTk0RiwgMC44OTEzNzM0NTYyRiwgMC44OTIzNzExMjYzRiwKKyAgICAwLjg5MzM2MzExMjlGLCAwLjg5NDM0OTQxOTZGLCAwLjg5NTMzMDA1MDBGLCAwLjg5NjMwNTAwODNGLAorICAgIDAuODk3Mjc0Mjk4NUYsIDAuODk4MjM3OTI0OUYsIDAuODk5MTk1ODkyMkYsIDAuOTAwMTQ4MjA1MkYsCisgICAgMC45MDEwOTQ4Njg4RiwgMC45MDIwMzU4ODgzRiwgMC45MDI5NzEyNjkwRiwgMC45MDM5MDEwMTY1RiwKKyAgICAwLjkwNDgyNTEzNjdGLCAwLjkwNTc0MzYzNTdGLCAwLjkwNjY1NjUxOTVGLCAwLjkwNzU2Mzc5NDZGLAorICAgIDAuOTA4NDY1NDY3OEYsIDAuOTA5MzYxNTQ1NkYsIDAuOTEwMjUyMDM1M0YsIDAuOTExMTM2OTQ0MEYsCisgICAgMC45MTIwMTYyNzkyRiwgMC45MTI4OTAwNDg0RiwgMC45MTM3NTgyNTk1RiwgMC45MTQ2MjA5MjA0RiwKKyAgICAwLjkxNTQ3ODAzOTRGLCAwLjkxNjMyOTYyNDhGLCAwLjkxNzE3NTY4NTNGLCAwLjkxODAxNjIyOTZGLAorICAgIDAuOTE4ODUxMjY2N0YsIDAuOTE5NjgwODA1N0YsIDAuOTIwNTA0ODU1OUYsIDAuOTIxMzIzNDI3MEYsCisgICAgMC45MjIxMzY1Mjg1RiwgMC45MjI5NDQxNzA0RiwgMC45MjM3NDYzNjI5RiwgMC45MjQ1NDMxMTYwRiwKKyAgICAwLjkyNTMzNDQ0MDRGLCAwLjkyNjEyMDM0NjVGLCAwLjkyNjkwMDg0NTNGLCAwLjkyNzY3NTk0NzdGLAorICAgIDAuOTI4NDQ1NjY0OEYsIDAuOTI5MjEwMDA4MEYsIDAuOTI5OTY4OTg4OUYsIDAuOTMwNzIyNjE5MEYsCisgICAgMC45MzE0NzA5MTAzRiwgMC45MzIyMTM4NzQ3RiwgMC45MzI5NTE1MjQ1RiwgMC45MzM2ODM4NzIxRiwKKyAgICAwLjkzNDQxMDkzMDBGLCAwLjkzNTEzMjcxMDhGLCAwLjkzNTg0OTIyNzVGLCAwLjkzNjU2MDQ5MzFGLAorICAgIDAuOTM3MjY2NTIwOEYsIDAuOTM3OTY3MzIzOUYsIDAuOTM4NjYyOTE2MEYsIDAuOTM5MzUzMzEwN0YsCisgICAgMC45NDAwMzg1MjIwRiwgMC45NDA3MTg1NjM3RiwgMC45NDEzOTM0NTAxRiwgMC45NDIwNjMxOTU0RiwKKyAgICAwLjk0MjcyNzgxNDFGLCAwLjk0MzM4NzMyMDhGLCAwLjk0NDA0MTczMDRGLCAwLjk0NDY5MTA1NzZGLAorICAgIDAuOTQ1MzM1MzE3NkYsIDAuOTQ1OTc0NTI1NUYsIDAuOTQ2NjA4Njk2OEYsIDAuOTQ3MjM3ODQ2OUYsCisgICAgMC45NDc4NjE5OTE1RiwgMC45NDg0ODExNDYzRiwgMC45NDkwOTUzMjc0RiwgMC45NDk3MDQ1NTA2RiwKKyAgICAwLjk1MDMwODgzMjNGLCAwLjk1MDkwODE4ODhGLCAwLjk1MTUwMjYzNjVGLCAwLjk1MjA5MjE5MjFGLAorICAgIDAuOTUyNjc2ODcyM0YsIDAuOTUzMjU2Njk0MEYsIDAuOTUzODMxNjc0MkYsIDAuOTU0NDAxODMwMEYsCisgICAgMC45NTQ5NjcxNzg2RiwgMC45NTU1Mjc3Mzc1RiwgMC45NTYwODM1MjQxRiwgMC45NTY2MzQ1NTYyRiwKKyAgICAwLjk1NzE4MDg1MTNGLCAwLjk1NzcyMjQyNzVGLCAwLjk1ODI1OTMwMjdGLCAwLjk1ODc5MTQ5NDlGLAorICAgIDAuOTU5MzE5MDIyNUYsIDAuOTU5ODQxOTAzOEYsIDAuOTYwMzYwMTU3MUYsIDAuOTYwODczODAxMkYsCisgICAgMC45NjEzODI4NTQ2RiwgMC45NjE4ODczMzYxRiwgMC45NjIzODcyNjQ2RiwgMC45NjI4ODI2NTkxRiwKKyAgICAwLjk2MzM3MzUzODhGLCAwLjk2Mzg1OTkyMjdGLCAwLjk2NDM0MTgzMDNGLCAwLjk2NDgxOTI4MDhGLAorICAgIDAuOTY1MjkyMjkzOUYsIDAuOTY1NzYwODg5MEYsIDAuOTY2MjI1MDg2MEYsIDAuOTY2Njg0OTA0NkYsCisgICAgMC45NjcxNDAzNjQ2RiwgMC45Njc1OTE0ODYxRiwgMC45NjgwMzgyODkxRiwgMC45Njg0ODA3OTM3RiwKKyAgICAwLjk2ODkxOTAyMDJGLCAwLjk2OTM1Mjk4OTBGLCAwLjk2OTc4MjcyMDNGLCAwLjk3MDIwODIzNDdGLAorICAgIDAuOTcwNjI5NTUyOUYsIDAuOTcxMDQ2Njk1M0YsIDAuOTcxNDU5NjgyOEYsIDAuOTcxODY4NTM2MkYsCisgICAgMC45NzIyNzMyNzYyRiwgMC45NzI2NzM5MjQwRiwgMC45NzMwNzA1MDA1RiwgMC45NzM0NjMwMjY3RiwKKyAgICAwLjk3Mzg1MTUyMzlGLCAwLjk3NDIzNjAxMzRGLCAwLjk3NDYxNjUxNjNGLCAwLjk3NDk5MzA1NDBGLAorICAgIDAuOTc1MzY1NjQ4MUYsIDAuOTc1NzM0MzE5OEYsIDAuOTc2MDk5MDkwOUYsIDAuOTc2NDU5OTgyOUYsCisgICAgMC45NzY4MTcwMTc1RiwgMC45NzcxNzAyMTY0RiwgMC45Nzc1MTk2MDEzRiwgMC45Nzc4NjUxOTQxRiwKKyAgICAwLjk3ODIwNzAxNjdGLCAwLjk3ODU0NTA5MDlGLCAwLjk3ODg3OTQzODhGLCAwLjk3OTIxMDA4MjRGLAorICAgIDAuOTc5NTM3MDQzN0YsIDAuOTc5ODYwMzQ0OUYsIDAuOTgwMTgwMDA4MEYsIDAuOTgwNDk2MDU1NEYsCisgICAgMC45ODA4MDg1MDkyRiwgMC45ODExMTczOTE2RiwgMC45ODE0MjI3MjUxRiwgMC45ODE3MjQ1MzE4RiwKKyAgICAwLjk4MjAyMjgzNDNGLCAwLjk4MjMxNzY1NDlGLCAwLjk4MjYwOTAxNjBGLCAwLjk4Mjg5Njk0MDJGLAorICAgIDAuOTgzMTgxNDQ5OEYsIDAuOTgzNDYyNTY3NEYsIDAuOTgzNzQwMzE1NkYsIDAuOTg0MDE0NzE2OUYsCisgICAgMC45ODQyODU3OTM5RiwgMC45ODQ1NTM1NjkyRiwgMC45ODQ4MTgwNjU0RiwgMC45ODUwNzkzMDUyRiwKKyAgICAwLjk4NTMzNzMxMTNGLCAwLjk4NTU5MjEwNjJGLCAwLjk4NTg0MzcxMjdGLCAwLjk4NjA5MjE1MzVGLAorICAgIDAuOTg2MzM3NDUxMkYsIDAuOTg2NTc5NjI4N0YsIDAuOTg2ODE4NzA4NUYsIDAuOTg3MDU0NzEzNkYsCisgICAgMC45ODcyODc2NjY0RiwgMC45ODc1MTc1ODk5RiwgMC45ODc3NDQ1MDY3RiwgMC45ODc5Njg0Mzk2RiwKKyAgICAwLjk4ODE4OTQxMTJGLCAwLjk4ODQwNzQ0NDRGLCAwLjk4ODYyMjU2MTlGLCAwLjk4ODgzNDc4NjNGLAorICAgIDAuOTg5MDQ0MTQwNEYsIDAuOTg5MjUwNjQ2OEYsIDAuOTg5NDU0MzI4NEYsIDAuOTg5NjU1MjA3N0YsCisgICAgMC45ODk4NTMzMDc0RiwgMC45OTAwNDg2NTAyRiwgMC45OTAyNDEyNTg3RiwgMC45OTA0MzExNTU1RiwKKyAgICAwLjk5MDYxODM2MzNGLCAwLjk5MDgwMjkwNDVGLCAwLjk5MDk4NDgwMTlGLCAwLjk5MTE2NDA3NzlGLAorICAgIDAuOTkxMzQwNzU1MEYsIDAuOTkxNTE0ODU1N0YsIDAuOTkxNjg2NDAyNUYsIDAuOTkxODU1NDE3OUYsCisgICAgMC45OTIwMjE5MjQxRiwgMC45OTIxODU5NDM3RiwgMC45OTIzNDc0OTg5RiwgMC45OTI1MDY2MTIwRiwKKyAgICAwLjk5MjY2MzMwNTRGLCAwLjk5MjgxNzYwMTJGLCAwLjk5Mjk2OTUyMThGLCAwLjk5MzExOTA4OTFGLAorICAgIDAuOTkzMjY2MzI1NEYsIDAuOTkzNDExMjUyN0YsIDAuOTkzNTUzODkzMkYsIDAuOTkzNjk0MjY4NkYsCisgICAgMC45OTM4MzI0MDEyRiwgMC45OTM5NjgzMTI2RiwgMC45OTQxMDIwMjQ4RiwgMC45OTQyMzM1NTk3RiwKKyAgICAwLjk5NDM2MjkzODhGLCAwLjk5NDQ5MDE4NDFGLCAwLjk5NDYxNTMxNzBGLCAwLjk5NDczODM1OTNGLAorICAgIDAuOTk0ODU5MzMyNUYsIDAuOTk0OTc4MjU3OUYsIDAuOTk1MDk1MTU3MkYsIDAuOTk1MjEwMDUxNkYsCisgICAgMC45OTUzMjI5NjI1RiwgMC45OTU0MzM5MTExRiwgMC45OTU1NDI5MTg2RiwgMC45OTU2NTAwMDYyRiwKKyAgICAwLjk5NTc1NTE5NDhGLCAwLjk5NTg1ODUwNTZGLCAwLjk5NTk1OTk1OTNGLCAwLjk5NjA1OTU3NjlGLAorICAgIDAuOTk2MTU3Mzc5MkYsIDAuOTk2MjUzMzg2OUYsIDAuOTk2MzQ3NjIwNkYsIDAuOTk2NDQwMTAwOUYsCisgICAgMC45OTY1MzA4NDgzRiwgMC45OTY2MTk4ODMzRiwgMC45OTY3MDcyMjYxRiwgMC45OTY3OTI4OTcxRiwKKyAgICAwLjk5Njg3NjkxNjRGLCAwLjk5Njk1OTMwNDFGLCAwLjk5NzA0MDA4MDRGLCAwLjk5NzExOTI2NTFGLAorICAgIDAuOTk3MTk2ODc4MUYsIDAuOTk3MjcyOTM5MUYsIDAuOTk3MzQ3NDY4MEYsIDAuOTk3NDIwNDg0MkYsCisgICAgMC45OTc0OTIwMDc0RiwgMC45OTc1NjIwNTY5RiwgMC45OTc2MzA2NTIxRiwgMC45OTc2OTc4MTIyRiwKKyAgICAwLjk5Nzc2MzU1NjVGLCAwLjk5NzgyNzkwMzlGLCAwLjk5Nzg5MDg3MzZGLCAwLjk5Nzk1MjQ4NDJGLAorICAgIDAuOTk4MDEyNzU0N0YsIDAuOTk4MDcxNzAzN0YsIDAuOTk4MTI5MzQ5OUYsIDAuOTk4MTg1NzExNkYsCisgICAgMC45OTgyNDA4MDczRiwgMC45OTgyOTQ2NTU0RiwgMC45OTgzNDcyNzM5RiwgMC45OTgzOTg2ODEwRiwKKyAgICAwLjk5ODQ0ODg5NDdGLCAwLjk5ODQ5NzkzMjhGLCAwLjk5ODU0NTgxMzJGLCAwLjk5ODU5MjU1MzRGLAorICAgIDAuOTk4NjM4MTcxMUYsIDAuOTk4NjgyNjgzOEYsIDAuOTk4NzI2MTA4NkYsIDAuOTk4NzY4NDYzMEYsCisgICAgMC45OTg4MDk3NjQwRiwgMC45OTg4NTAwMjg2RiwgMC45OTg4ODkyNzM4RiwgMC45OTg5Mjc1MTYzRiwKKyAgICAwLjk5ODk2NDc3MjdGLCAwLjk5OTAwMTA1OTdGLCAwLjk5OTAzNjM5MzhGLCAwLjk5OTA3MDc5MTFGLAorICAgIDAuOTk5MTA0MjY3OUYsIDAuOTk5MTM2ODQwNEYsIDAuOTk5MTY4NTI0NEYsIDAuOTk5MTk5MzM1OEYsCisgICAgMC45OTkyMjkyOTA1RiwgMC45OTkyNTg0MDM4RiwgMC45OTkyODY2OTE0RiwgMC45OTkzMTQxNjg2RiwKKyAgICAwLjk5OTM0MDg1MDZGLCAwLjk5OTM2Njc1MjZGLCAwLjk5OTM5MTg4OTVGLCAwLjk5OTQxNjI3NjFGLAorICAgIDAuOTk5NDM5OTI3M0YsIDAuOTk5NDYyODU3NkYsIDAuOTk5NDg1MDgxNUYsIDAuOTk5NTA2NjEzM0YsCisgICAgMC45OTk1Mjc0NjcyRiwgMC45OTk1NDc2NTc0RiwgMC45OTk1NjcxOTc4RiwgMC45OTk1ODYxMDIxRiwKKyAgICAwLjk5OTYwNDM4NDFGLCAwLjk5OTYyMjA1NzNGLCAwLjk5OTYzOTEzNTJGLCAwLjk5OTY1NTYzMTBGLAorICAgIDAuOTk5NjcxNTU3OUYsIDAuOTk5Njg2OTI4OEYsIDAuOTk5NzAxNzU2OEYsIDAuOTk5NzE2MDU0M0YsCisgICAgMC45OTk3Mjk4MzQyRiwgMC45OTk3NDMxMDg4RiwgMC45OTk3NTU4OTA1RiwgMC45OTk3NjgxOTE0RiwKKyAgICAwLjk5OTc4MDAyMzZGLCAwLjk5OTc5MTM5OTBGLCAwLjk5OTgwMjMyOTJGLCAwLjk5OTgxMjgyNjFGLAorICAgIDAuOTk5ODIyOTAwOUYsIDAuOTk5ODMyNTY1MEYsIDAuOTk5ODQxODI5NkYsIDAuOTk5ODUwNzA1OEYsCisgICAgMC45OTk4NTkyMDQ0RiwgMC45OTk4NjczMzYyRiwgMC45OTk4NzUxMTE3RiwgMC45OTk4ODI1NDE1RiwKKyAgICAwLjk5OTg4OTYzNThGLCAwLjk5OTg5NjQwNDdGLCAwLjk5OTkwMjg1ODRGLCAwLjk5OTkwOTAwNjZGLAorICAgIDAuOTk5OTE0ODU5MEYsIDAuOTk5OTIwNDI1M0YsIDAuOTk5OTI1NzE0OEYsIDAuOTk5OTMwNzM2OEYsCisgICAgMC45OTk5MzU1MDAzRiwgMC45OTk5NDAwMTQ0RiwgMC45OTk5NDQyODc4RiwgMC45OTk5NDgzMjkzRiwKKyAgICAwLjk5OTk1MjE0NzJGLCAwLjk5OTk1NTc0OTlGLCAwLjk5OTk1OTE0NTdGLCAwLjk5OTk2MjM0MjZGLAorICAgIDAuOTk5OTY1MzQ4M0YsIDAuOTk5OTY4MTcwOEYsIDAuOTk5OTcwODE3NUYsIDAuOTk5OTczMjk1OUYsCisgICAgMC45OTk5NzU2MTMyRiwgMC45OTk5Nzc3NzY1RiwgMC45OTk5Nzk3OTI4RiwgMC45OTk5ODE2Njg4RiwKKyAgICAwLjk5OTk4MzQxMTNGLCAwLjk5OTk4NTAyNjZGLCAwLjk5OTk4NjUyMTFGLCAwLjk5OTk4NzkwMDlGLAorICAgIDAuOTk5OTg5MTcyMUYsIDAuOTk5OTkwMzQwNUYsIDAuOTk5OTkxNDExOEYsIDAuOTk5OTkyMzkxNEYsCisgICAgMC45OTk5OTMyODQ5RiwgMC45OTk5OTQwOTcyRiwgMC45OTk5OTQ4MzM2RiwgMC45OTk5OTU0OTg5RiwKKyAgICAwLjk5OTk5NjA5NzhGLCAwLjk5OTk5NjYzNDlGLCAwLjk5OTk5NzExNDZGLCAwLjk5OTk5NzU0MTFGLAorICAgIDAuOTk5OTk3OTE4NUYsIDAuOTk5OTk4MjUwN0YsIDAuOTk5OTk4NTQxNEYsIDAuOTk5OTk4Nzk0NEYsCisgICAgMC45OTk5OTkwMTI5RiwgMC45OTk5OTkyMDAzRiwgMC45OTk5OTkzNTk2RiwgMC45OTk5OTk0OTM5RiwKKyAgICAwLjk5OTk5OTYwNTlGLCAwLjk5OTk5OTY5ODFGLCAwLjk5OTk5OTc3MzJGLCAwLjk5OTk5OTgzMzNGLAorICAgIDAuOTk5OTk5ODgwNUYsIDAuOTk5OTk5OTE3MEYsIDAuOTk5OTk5OTQ0NEYsIDAuOTk5OTk5OTY0M0YsCisgICAgMC45OTk5OTk5Nzg0RiwgMC45OTk5OTk5ODc4RiwgMC45OTk5OTk5OTM3RiwgMC45OTk5OTk5OTcyRiwKKyAgICAwLjk5OTk5OTk5OTBGLCAwLjk5OTk5OTk5OTdGLCAxLjAwMDAwMDAwMDBGLCAxLjAwMDAwMDAwMDBGLAorfTsKKworREVDTEFSRV9BTElHTkVEKDE2LCBzdGF0aWMgY29uc3QgZmxvYXQsIHZ3aW40MDk2KVsyMDQ4XSA9IHsKKyAgICAwLjAwMDAwMDIzMTBGLCAwLjAwMDAwMjA3OTFGLCAwLjAwMDAwNTc3NTRGLCAwLjAwMDAxMTMxOTdGLAorICAgIDAuMDAwMDE4NzEyMUYsIDAuMDAwMDI3OTUyNkYsIDAuMDAwMDM5MDQxMkYsIDAuMDAwMDUxOTc3N0YsCisgICAgMC4wMDAwNjY3NjIzRiwgMC4wMDAwODMzOTQ5RiwgMC4wMDAxMDE4NzUzRiwgMC4wMDAxMjIyMDM2RiwKKyAgICAwLjAwMDE0NDM3OThGLCAwLjAwMDE2ODQwMzdGLCAwLjAwMDE5NDI3NTRGLCAwLjAwMDIyMTk5NDdGLAorICAgIDAuMDAwMjUxNTYxNkYsIDAuMDAwMjgyOTc2MUYsIDAuMDAwMzE2MjM4MEYsIDAuMDAwMzUxMzQ3MkYsCisgICAgMC4wMDAzODgzMDM4RiwgMC4wMDA0MjcxMDc2RiwgMC4wMDA0Njc3NTg0RiwgMC4wMDA1MTAyNTYzRiwKKyAgICAwLjAwMDU1NDYwMTFGLCAwLjAwMDYwMDc5MjhGLCAwLjAwMDY0ODgzMTFGLCAwLjAwMDY5ODcxNjBGLAorICAgIDAuMDAwNzUwNDQ3NEYsIDAuMDAwODA0MDI1MUYsIDAuMDAwODU5NDQ5MEYsIDAuMDAwOTE2NzE5MUYsCisgICAgMC4wMDA5NzU4MzUxRiwgMC4wMDEwMzY3OTY5RiwgMC4wMDEwOTk2MDQ0RiwgMC4wMDExNjQyNTc0RiwKKyAgICAwLjAwMTIzMDc1NThGLCAwLjAwMTI5OTA5OTRGLCAwLjAwMTM2OTI4ODBGLCAwLjAwMTQ0MTMyMTZGLAorICAgIDAuMDAxNTE1MTk5OEYsIDAuMDAxNTkwOTIyNkYsIDAuMDAxNjY4NDg5OEYsIDAuMDAxNzQ3OTAxMUYsCisgICAgMC4wMDE4MjkxNTY1RiwgMC4wMDE5MTIyNTU2RiwgMC4wMDE5OTcxOTgzRiwgMC4wMDIwODM5ODQ1RiwKKyAgICAwLjAwMjE3MjYxMzhGLCAwLjAwMjI2MzA4NjFGLCAwLjAwMjM1NTQwMTJGLCAwLjAwMjQ0OTU1ODhGLAorICAgIDAuMDAyNTQ1NTU4OEYsIDAuMDAyNjQzNDAwOEYsIDAuMDAyNzQzMDg0N0YsIDAuMDAyODQ0NjEwM0YsCisgICAgMC4wMDI5NDc5NzcyRiwgMC4wMDMwNTMxODUzRiwgMC4wMDMxNjAyMzQyRiwgMC4wMDMyNjkxMjM4RiwKKyAgICAwLjAwMzM3OTg1MzhGLCAwLjAwMzQ5MjQyMzlGLCAwLjAwMzYwNjgzMzhGLCAwLjAwMzcyMzA4MzNGLAorICAgIDAuMDAzODQxMTcyMUYsIDAuMDAzOTYxMDk5OUYsIDAuMDA0MDgyODY2NEYsIDAuMDA0MjA2NDcxNEYsCisgICAgMC4wMDQzMzE5MTQ1RiwgMC4wMDQ0NTkxOTU0RiwgMC4wMDQ1ODgzMTM5RiwgMC4wMDQ3MTkyNjk2RiwKKyAgICAwLjAwNDg1MjA2MjJGLCAwLjAwNDk4NjY5MTRGLCAwLjAwNTEyMzE1NjlGLCAwLjAwNTI2MTQ1ODNGLAorICAgIDAuMDA1NDAxNTk1M0YsIDAuMDA1NTQzNTY3NkYsIDAuMDA1Njg3Mzc0OEYsIDAuMDA1ODMzMDE2NkYsCisgICAgMC4wMDU5ODA0OTI2RiwgMC4wMDYxMjk4MDI2RiwgMC4wMDYyODA5NDYwRiwgMC4wMDY0MzM5MjI2RiwKKyAgICAwLjAwNjU4ODczMjBGLCAwLjAwNjc0NTM3MzhGLCAwLjAwNjkwMzg0NzZGLCAwLjAwNzA2NDE1MzFGLAorICAgIDAuMDA3MjI2Mjg5OUYsIDAuMDA3MzkwMjU3NUYsIDAuMDA3NTU2MDU1NkYsIDAuMDA3NzIzNjgzOEYsCisgICAgMC4wMDc4OTMxNDE3RiwgMC4wMDgwNjQ0Mjg4RiwgMC4wMDgyMzc1NDQ3RiwgMC4wMDg0MTI0ODkxRiwKKyAgICAwLjAwODU4OTI2MTVGLCAwLjAwODc2Nzg2MTRGLCAwLjAwODk0ODI4ODVGLCAwLjAwOTEzMDU0MjJGLAorICAgIDAuMDA5MzE0NjIyM0YsIDAuMDA5NTAwNTI4MUYsIDAuMDA5Njg4MjU5MkYsIDAuMDA5ODc3ODE1M0YsCisgICAgMC4wMTAwNjkxOTU4RiwgMC4wMTAyNjI0MDAyRiwgMC4wMTA0NTc0MjgxRiwgMC4wMTA2NTQyNzkxRiwKKyAgICAwLjAxMDg1Mjk1MjVGLCAwLjAxMTA1MzQ0ODBGLCAwLjAxMTI1NTc2NTFGLCAwLjAxMTQ1OTkwMzJGLAorICAgIDAuMDExNjY1ODYxOEYsIDAuMDExODczNjQwNUYsIDAuMDEyMDgzMjM4N0YsIDAuMDEyMjk0NjU2MEYsCisgICAgMC4wMTI1MDc4OTE3RiwgMC4wMTI3MjI5NDU0RiwgMC4wMTI5Mzk4MTY2RiwgMC4wMTMxNTg1MDQ2RiwKKyAgICAwLjAxMzM3OTAwOTBGLCAwLjAxMzYwMTMyOTJGLCAwLjAxMzgyNTQ2NDdGLCAwLjAxNDA1MTQxNDlGLAorICAgIDAuMDE0Mjc5MTc5MkYsIDAuMDE0NTA4NzU3MkYsIDAuMDE0NzQwMTQ4MUYsIDAuMDE0OTczMzUxNUYsCisgICAgMC4wMTUyMDgzNjY3RiwgMC4wMTU0NDUxOTMyRiwgMC4wMTU2ODM4MzA0RiwgMC4wMTU5MjQyNzc3RiwKKyAgICAwLjAxNjE2NjUzNDVGLCAwLjAxNjQxMDYwMDFGLCAwLjAxNjY1NjQ3NDFGLCAwLjAxNjkwNDE1NTdGLAorICAgIDAuMDE3MTUzNjQ0M0YsIDAuMDE3NDA0OTM5M0YsIDAuMDE3NjU4MDQwMUYsIDAuMDE3OTEyOTQ2MUYsCisgICAgMC4wMTgxNjk2NTY1RiwgMC4wMTg0MjgxNzA4RiwgMC4wMTg2ODg0ODgzRiwgMC4wMTg5NTA2MDg0RiwKKyAgICAwLjAxOTIxNDUzMDNGLCAwLjAxOTQ4MDI1MzVGLCAwLjAxOTc0Nzc3NzJGLCAwLjAyMDAxNzEwMDhGLAorICAgIDAuMDIwMjg4MjIzNkYsIDAuMDIwNTYxMTQ0OUYsIDAuMDIwODM1ODYzOUYsIDAuMDIxMTEyMzgwMUYsCisgICAgMC4wMjEzOTA2OTI3RiwgMC4wMjE2NzA4MDExRiwgMC4wMjE5NTI3MDQzRiwgMC4wMjIyMzY0MDE5RiwKKyAgICAwLjAyMjUyMTg5MzBGLCAwLjAyMjgwOTE3NjlGLCAwLjAyMzA5ODI1MjlGLCAwLjAyMzM4OTEyMDNGLAorICAgIDAuMDIzNjgxNzc4MkYsIDAuMDIzOTc2MjI1OUYsIDAuMDI0MjcyNDYyOEYsIDAuMDI0NTcwNDg4MEYsCisgICAgMC4wMjQ4NzAzMDA3RiwgMC4wMjUxNzE5MDAyRiwgMC4wMjU0NzUyODU4RiwgMC4wMjU3ODA0NTY1RiwKKyAgICAwLjAyNjA4NzQxMTdGLCAwLjAyNjM5NjE1MDZGLCAwLjAyNjcwNjY3MjJGLCAwLjAyNzAxODk3NjBGLAorICAgIDAuMDI3MzMzMDYwOUYsIDAuMDI3NjQ4OTI2M0YsIDAuMDI3OTY2NTcxMkYsIDAuMDI4Mjg1OTk0OUYsCisgICAgMC4wMjg2MDcxOTY2RiwgMC4wMjg5MzAxNzUzRiwgMC4wMjkyNTQ5MzAzRiwgMC4wMjk1ODE0NjA3RiwKKyAgICAwLjAyOTkwOTc2NTZGLCAwLjAzMDIzOTg0NDJGLCAwLjAzMDU3MTY5NTdGLCAwLjAzMDkwNTMxOTFGLAorICAgIDAuMDMxMjQwNzEzNUYsIDAuMDMxNTc3ODc4MkYsIDAuMDMxOTE2ODEyMkYsIDAuMDMyMjU3NTE0NUYsCisgICAgMC4wMzI1OTk5ODQ0RiwgMC4wMzI5NDQyMjA5RiwgMC4wMzMyOTAyMjMxRiwgMC4wMzM2Mzc5OTAwRiwKKyAgICAwLjAzMzk4NzUyMDhGLCAwLjAzNDMzODgxNDZGLCAwLjAzNDY5MTg3MDNGLCAwLjAzNTA0NjY4NzFGLAorICAgIDAuMDM1NDAzMjY0MEYsIDAuMDM1NzYxNjAwMEYsIDAuMDM2MTIxNjk0M0YsIDAuMDM2NDgzNTQ1OEYsCisgICAgMC4wMzY4NDcxNTM1RiwgMC4wMzcyMTI1MTY2RiwgMC4wMzc1Nzk2MzM5RiwgMC4wMzc5NDg1MDQ2RiwKKyAgICAwLjAzODMxOTEyNzZGLCAwLjAzODY5MTUwMjBGLCAwLjAzOTA2NTYyNjdGLCAwLjAzOTQ0MTUwMDhGLAorICAgIDAuMDM5ODE5MTIzMUYsIDAuMDQwMTk4NDkyN0YsIDAuMDQwNTc5NjA4NkYsIDAuMDQwOTYyNDY5OEYsCisgICAgMC4wNDEzNDcwNzUxRiwgMC4wNDE3MzM0MjM1RiwgMC4wNDIxMjE1MTQxRiwgMC4wNDI1MTEzNDU3RiwKKyAgICAwLjA0MjkwMjkxNzJGLCAwLjA0MzI5NjIyNzdGLCAwLjA0MzY5MTI3NjBGLCAwLjA0NDA4ODA2MTBGLAorICAgIDAuMDQ0NDg2NTgxN0YsIDAuMDQ0ODg2ODM3MEYsIDAuMDQ1Mjg4ODI1N0YsIDAuMDQ1NjkyNTQ2OEYsCisgICAgMC4wNDYwOTc5OTkyRiwgMC4wNDY1MDUxODE2RiwgMC4wNDY5MTQwOTMxRiwgMC4wNDczMjQ3MzI1RiwKKyAgICAwLjA0NzczNzA5ODZGLCAwLjA0ODE1MTE5MDJGLCAwLjA0ODU2NzAwNjRGLCAwLjA0ODk4NDU0NThGLAorICAgIDAuMDQ5NDAzODA3NEYsIDAuMDQ5ODI0Nzg5OUYsIDAuMDUwMjQ3NDkyMkYsIDAuMDUwNjcxOTEzMUYsCisgICAgMC4wNTEwOTgwNTE0RiwgMC4wNTE1MjU5MDYwRiwgMC4wNTE5NTU0NzU2RiwgMC4wNTIzODY3NTkwRiwKKyAgICAwLjA1MjgxOTc1NTBGLCAwLjA1MzI1NDQ2MjRGLCAwLjA1MzY5MDg4MDBGLCAwLjA1NDEyOTAwNjZGLAorICAgIDAuMDU0NTY4ODQwOEYsIDAuMDU1MDEwMzgxNUYsIDAuMDU1NDUzNjI3NEYsIDAuMDU1ODk4NTc3MkYsCisgICAgMC4wNTYzNDUyMjk3RiwgMC4wNTY3OTM1ODM3RiwgMC4wNTcyNDM2Mzc3RiwgMC4wNTc2OTUzOTA3RiwKKyAgICAwLjA1ODE0ODg0MTJGLCAwLjA1ODYwMzk4ODBGLCAwLjA1OTA2MDgyOTdGLCAwLjA1OTUxOTM2NTFGLAorICAgIDAuMDU5OTc5NTkyOUYsIDAuMDYwNDQxNTExN0YsIDAuMDYwOTA1MTIwMkYsIDAuMDYxMzcwNDE3MEYsCisgICAgMC4wNjE4Mzc0MDA5RiwgMC4wNjIzMDYwNzA0RiwgMC4wNjI3NzY0MjQzRiwgMC4wNjMyNDg0NjExRiwKKyAgICAwLjA2MzcyMjE3OTVGLCAwLjA2NDE5NzU3ODFGLCAwLjA2NDY3NDY1NTVGLCAwLjA2NTE1MzQxMDRGLAorICAgIDAuMDY1NjMzODQxM0YsIDAuMDY2MTE1OTQ2OUYsIDAuMDY2NTk5NzI1N0YsIDAuMDY3MDg1MTc2M0YsCisgICAgMC4wNjc1NzIyOTczRiwgMC4wNjgwNjEwODczRiwgMC4wNjg1NTE1NDQ4RiwgMC4wNjkwNDM2Njg0RiwKKyAgICAwLjA2OTUzNzQ1NjdGLCAwLjA3MDAzMjkwODFGLCAwLjA3MDUzMDAyMTNGLCAwLjA3MTAyODc5NDdGLAorICAgIDAuMDcxNTI5MjI2OUYsIDAuMDcyMDMxMzE2M0YsIDAuMDcyNTM1MDYxNkYsIDAuMDczMDQwNDYxMkYsCisgICAgMC4wNzM1NDc1MTM2RiwgMC4wNzQwNTYyMTcyRiwgMC4wNzQ1NjY1NzA3RiwgMC4wNzUwNzg1NzIzRiwKKyAgICAwLjA3NTU5MjIyMDdGLCAwLjA3NjEwNzUxNDNGLCAwLjA3NjYyNDQ1MTVGLCAwLjA3NzE0MzAzMDdGLAorICAgIDAuMDc3NjYzMjUwNUYsIDAuMDc4MTg1MTA5MkYsIDAuMDc4NzA4NjA1MkYsIDAuMDc5MjMzNzM3MUYsCisgICAgMC4wNzk3NjA1MDMyRiwgMC4wODAyODg5MDE4RiwgMC4wODA4MTg5MzE1RiwgMC4wODEzNTA1OTA1RiwKKyAgICAwLjA4MTg4Mzg3NzNGLCAwLjA4MjQxODc5MDNGLCAwLjA4Mjk1NTMyNzdGLCAwLjA4MzQ5MzQ4ODFGLAorICAgIDAuMDg0MDMzMjY5N0YsIDAuMDg0NTc0NjcwOEYsIDAuMDg1MTE3Njg5OUYsIDAuMDg1NjYyMzI1MkYsCisgICAgMC4wODYyMDg1NzUxRiwgMC4wODY3NTY0Mzc5RiwgMC4wODczMDU5MTE5RiwgMC4wODc4NTY5OTU0RiwKKyAgICAwLjA4ODQwOTY4NjdGLCAwLjA4ODk2Mzk4NDBGLCAwLjA4OTUxOTg4NThGLCAwLjA5MDA3NzM5MDJGLAorICAgIDAuMDkwNjM2NDk1NUYsIDAuMDkxMTk3MjAwMEYsIDAuMDkxNzU5NTAxOUYsIDAuMDkyMzIzMzk5NUYsCisgICAgMC4wOTI4ODg4OTA5RiwgMC4wOTM0NTU5NzQ1RiwgMC4wOTQwMjQ2NDg1RiwgMC4wOTQ1OTQ5MTEwRiwKKyAgICAwLjA5NTE2Njc2MDRGLCAwLjA5NTc0MDE5NDZGLCAwLjA5NjMxNTIxMjFGLCAwLjA5Njg5MTgxMDlGLAorICAgIDAuMDk3NDY5OTg5M0YsIDAuMDk4MDQ5NzQ1NEYsIDAuMDk4NjMxMDc3M0YsIDAuMDk5MjEzOTgzMkYsCisgICAgMC4wOTk3OTg0NjE0RiwgMC4xMDAzODQ1MDk4RiwgMC4xMDA5NzIxMjY3RiwgMC4xMDE1NjEzMTAxRiwKKyAgICAwLjEwMjE1MjA1ODJGLCAwLjEwMjc0NDM2OTJGLCAwLjEwMzMzODI0MTBGLCAwLjEwMzkzMzY3MThGLAorICAgIDAuMTA0NTMwNjU5N0YsIDAuMTA1MTI5MjAyN0YsIDAuMTA1NzI5Mjk5MEYsIDAuMTA2MzMwOTQ2NkYsCisgICAgMC4xMDY5MzQxNDM1RiwgMC4xMDc1Mzg4ODc4RiwgMC4xMDgxNDUxNzc2RiwgMC4xMDg3NTMwMTA4RiwKKyAgICAwLjEwOTM2MjM4NTZGLCAwLjEwOTk3MzI5OThGLCAwLjExMDU4NTc1MTZGLCAwLjExMTE5OTczODlGLAorICAgIDAuMTExODE1MjU5N0YsIDAuMTEyNDMyMzEyMUYsIDAuMTEzMDUwODkzOUYsIDAuMTEzNjcxMDAzMkYsCisgICAgMC4xMTQyOTI2Mzc5RiwgMC4xMTQ5MTU3OTYwRiwgMC4xMTU1NDA0NzU1RiwgMC4xMTYxNjY2NzQyRiwKKyAgICAwLjExNjc5NDM5MDFGLCAwLjExNzQyMzYyMTFGLCAwLjExODA1NDM2NTJGLCAwLjExODY4NjYyMDJGLAorICAgIDAuMTE5MzIwMzg0MUYsIDAuMTE5OTU1NjU0OEYsIDAuMTIwNTkyNDMwMEYsIDAuMTIxMjMwNzA3OEYsCisgICAgMC4xMjE4NzA0ODYwRiwgMC4xMjI1MTE3NjI0RiwgMC4xMjMxNTQ1MzQ5RiwgMC4xMjM3OTg4MDEzRiwKKyAgICAwLjEyNDQ0NDU1OTZGLCAwLjEyNTA5MTgwNzRGLCAwLjEyNTc0MDU0MjdGLCAwLjEyNjM5MDc2MzJGLAorICAgIDAuMTI3MDQyNDY2N0YsIDAuMTI3Njk1NjUxMkYsIDAuMTI4MzUwMzE0MkYsIDAuMTI5MDA2NDUzN0YsCisgICAgMC4xMjk2NjQwNjc0RiwgMC4xMzAzMjMxNTMwRiwgMC4xMzA5ODM3MDg0RiwgMC4xMzE2NDU3MzEyRiwKKyAgICAwLjEzMjMwOTIxOTNGLCAwLjEzMjk3NDE3MDNGLCAwLjEzMzY0MDU4MjBGLCAwLjEzNDMwODQ1MjBGLAorICAgIDAuMTM0OTc3Nzc4MkYsIDAuMTM1NjQ4NTU4MkYsIDAuMTM2MzIwNzg5N0YsIDAuMTM2OTk0NDcwNEYsCisgICAgMC4xMzc2Njk1OTc5RiwgMC4xMzgzNDYxNzAwRiwgMC4xMzkwMjQxODQyRiwgMC4xMzk3MDM2Mzg0RiwKKyAgICAwLjE0MDM4NDUzMDBGLCAwLjE0MTA2Njg1NjdGLCAwLjE0MTc1MDYxNjJGLCAwLjE0MjQzNTgwNjFGLAorICAgIDAuMTQzMTIyNDI0MEYsIDAuMTQzODEwNDY3NEYsIDAuMTQ0NDk5OTM0MUYsIDAuMTQ1MTkwODIxNkYsCisgICAgMC4xNDU4ODMxMjc0RiwgMC4xNDY1NzY4NDkyRiwgMC4xNDcyNzE5ODQ0RiwgMC4xNDc5Njg1MzA4RiwKKyAgICAwLjE0ODY2NjQ4NTdGLCAwLjE0OTM2NTg0NjhGLCAwLjE1MDA2NjYxMTVGLCAwLjE1MDc2ODc3NzVGLAorICAgIDAuMTUxNDcyMzQyMkYsIDAuMTUyMTc3MzAzMUYsIDAuMTUyODgzNjU3N0YsIDAuMTUzNTkxNDAzNUYsCisgICAgMC4xNTQzMDA1MzgwRiwgMC4xNTUwMTEwNTg3RiwgMC4xNTU3MjI5NjMxRiwgMC4xNTY0MzYyNDg1RiwKKyAgICAwLjE1NzE1MDkxMjRGLCAwLjE1Nzg2Njk1MjRGLCAwLjE1ODU4NDM2NTdGLCAwLjE1OTMwMzE0OTlGLAorICAgIDAuMTYwMDIzMzAyNEYsIDAuMTYwNzQ0ODIwNUYsIDAuMTYxNDY3NzAxN0YsIDAuMTYyMTkxOTQzM0YsCisgICAgMC4xNjI5MTc1NDI4RiwgMC4xNjM2NDQ0OTc1RiwgMC4xNjQzNzI4MDQ3RiwgMC4xNjUxMDI0NjE5RiwKKyAgICAwLjE2NTgzMzQ2NjVGLCAwLjE2NjU2NTgxNTZGLCAwLjE2NzI5OTUwNjdGLCAwLjE2ODAzNDUzNzFGLAorICAgIDAuMTY4NzcwOTA0MUYsIDAuMTY5NTA4NjA1MEYsIDAuMTcwMjQ3NjM3MkYsIDAuMTcwOTg3OTk3OEYsCisgICAgMC4xNzE3Mjk2ODQzRiwgMC4xNzI0NzI2OTM4RiwgMC4xNzMyMTcwMjM3RiwgMC4xNzM5NjI2NzExRiwKKyAgICAwLjE3NDcwOTYzMzVGLCAwLjE3NTQ1NzkwNzlGLCAwLjE3NjIwNzQ5MTZGLCAwLjE3Njk1ODM4MTlGLAorICAgIDAuMTc3NzEwNTc2MEYsIDAuMTc4NDY0MDcxMEYsIDAuMTc5MjE4ODY0MkYsIDAuMTc5OTc0OTUyOUYsCisgICAgMC4xODA3MzIzMzQwRiwgMC4xODE0OTEwMDQ5RiwgMC4xODIyNTA5NjI4RiwgMC4xODMwMTIyMDQ2RiwKKyAgICAwLjE4Mzc3NDcyNzdGLCAwLjE4NDUzODUyOTJGLCAwLjE4NTMwMzYwNjJGLCAwLjE4NjA2OTk1NThGLAorICAgIDAuMTg2ODM3NTc1MUYsIDAuMTg3NjA2NDYxM0YsIDAuMTg4Mzc2NjExNEYsIDAuMTg5MTQ4MDIyNkYsCisgICAgMC4xODk5MjA2OTE5RiwgMC4xOTA2OTQ2MTY0RiwgMC4xOTE0Njk3OTMyRiwgMC4xOTIyNDYyMTk0RiwKKyAgICAwLjE5MzAyMzg5MTlGLCAwLjE5MzgwMjgwNzlGLCAwLjE5NDU4Mjk2NDNGLCAwLjE5NTM2NDM1ODNGLAorICAgIDAuMTk2MTQ2OTg2OEYsIDAuMTk2OTMwODQ2OEYsIDAuMTk3NzE1OTM1M0YsIDAuMTk4NTAyMjQ5NEYsCisgICAgMC4xOTkyODk3ODU5RiwgMC4yMDAwNzg1NDIwRiwgMC4yMDA4Njg1MTQ1RiwgMC4yMDE2NTk3MDA1RiwKKyAgICAwLjIwMjQ1MjA5NjhGLCAwLjIwMzI0NTcwMDVGLCAwLjIwNDA0MDUwODRGLCAwLjIwNDgzNjUxNzVGLAorICAgIDAuMjA1NjMzNzI0N0YsIDAuMjA2NDMyMTI2OUYsIDAuMjA3MjMxNzIxMUYsIDAuMjA4MDMyNTA0MUYsCisgICAgMC4yMDg4MzQ0NzI3RiwgMC4yMDk2Mzc2MjQwRiwgMC4yMTA0NDE5NTQ3RiwgMC4yMTEyNDc0NjE4RiwKKyAgICAwLjIxMjA1NDE0MjBGLCAwLjIxMjg2MTk5MjNGLCAwLjIxMzY3MTAwOTRGLCAwLjIxNDQ4MTE5MDJGLAorICAgIDAuMjE1MjkyNTMxNUYsIDAuMjE2MTA1MDMwMUYsIDAuMjE2OTE4NjgyOUYsIDAuMjE3NzMzNDg2NkYsCisgICAgMC4yMTg1NDk0MzgxRiwgMC4yMTkzNjY1MzQwRiwgMC4yMjAxODQ3NzEyRiwgMC4yMjEwMDQxNDY1RiwKKyAgICAwLjIyMTgyNDY1NjVGLCAwLjIyMjY0NjI5ODFGLCAwLjIyMzQ2OTA2ODBGLCAwLjIyNDI5Mjk2MjlGLAorICAgIDAuMjI1MTE3OTc5NkYsIDAuMjI1OTQ0MTE0N0YsIDAuMjI2NzcxMzY1MEYsIDAuMjI3NTk5NzI3MkYsCisgICAgMC4yMjg0MjkxOTc5RiwgMC4yMjkyNTk3NzM5RiwgMC4yMzAwOTE0NTE4RiwgMC4yMzA5MjQyMjgzRiwKKyAgICAwLjIzMTc1ODEwMDFGLCAwLjIzMjU5MzA2MzhGLCAwLjIzMzQyOTExNjBGLCAwLjIzNDI2NjI1MzRGLAorICAgIDAuMjM1MTA0NDcyN0YsIDAuMjM1OTQzNzcwM0YsIDAuMjM2Nzg0MTQzMUYsIDAuMjM3NjI1NTg3NUYsCisgICAgMC4yMzg0NjgxMDAxRiwgMC4yMzkzMTE2Nzc2RiwgMC4yNDAxNTYzMTY1RiwgMC4yNDEwMDIwMTM0RiwKKyAgICAwLjI0MTg0ODc2NDlGLCAwLjI0MjY5NjU2NzVGLCAwLjI0MzU0NTQxNzhGLCAwLjI0NDM5NTMxMjJGLAorICAgIDAuMjQ1MjQ2MjQ3NEYsIDAuMjQ2MDk4MjE5OUYsIDAuMjQ2OTUxMjI2MkYsIDAuMjQ3ODA1MjYyOEYsCisgICAgMC4yNDg2NjAzMjYyRiwgMC4yNDk1MTY0MTI5RiwgMC4yNTAzNzM1MTk0RiwgMC4yNTEyMzE2NDIxRiwKKyAgICAwLjI1MjA5MDc3NzZGLCAwLjI1Mjk1MDkyMjJGLCAwLjI1MzgxMjA3MjZGLCAwLjI1NDY3NDIyNTBGLAorICAgIDAuMjU1NTM3Mzc2MEYsIDAuMjU2NDAxNTIxOUYsIDAuMjU3MjY2NjU5M0YsIDAuMjU4MTMyNzg0NUYsCisgICAgMC4yNTg5OTk4OTM5RiwgMC4yNTk4Njc5ODQwRiwgMC4yNjA3MzcwNTEwRiwgMC4yNjE2MDcwOTE2RiwKKyAgICAwLjI2MjQ3ODEwMTlGLCAwLjI2MzM1MDA3ODNGLCAwLjI2NDIyMzAxNzNGLCAwLjI2NTA5NjkxNTJGLAorICAgIDAuMjY1OTcxNzY4NEYsIDAuMjY2ODQ3NTczMUYsIDAuMjY3NzI0MzI1N0YsIDAuMjY4NjAyMDIyNkYsCisgICAgMC4yNjk0ODA2NjAxRiwgMC4yNzAzNjAyMzQ0RiwgMC4yNzEyNDA3NDE5RiwgMC4yNzIxMjIxNzg5RiwKKyAgICAwLjI3MzAwNDU0MTdGLCAwLjI3Mzg4NzgyNjVGLCAwLjI3NDc3MjAyOTdGLCAwLjI3NTY1NzE0NzRGLAorICAgIDAuMjc2NTQzMTc2MEYsIDAuMjc3NDMwMTExN0YsIDAuMjc4MzE3OTUwOEYsIDAuMjc5MjA2Njg5NUYsCisgICAgMC4yODAwOTYzMjQwRiwgMC4yODA5ODY4NTA1RiwgMC4yODE4NzgyNjU0RiwgMC4yODI3NzA1NjQ3RiwKKyAgICAwLjI4MzY2Mzc0NDdGLCAwLjI4NDU1NzgwMTZGLCAwLjI4NTQ1MjczMTVGLCAwLjI4NjM0ODUzMDdGLAorICAgIDAuMjg3MjQ1MTk1M0YsIDAuMjg4MTQyNzIxNUYsIDAuMjg5MDQxMTA1NUYsIDAuMjg5OTQwMzQzM0YsCisgICAgMC4yOTA4NDA0MzEyRiwgMC4yOTE3NDEzNjU0RiwgMC4yOTI2NDMxNDE4RiwgMC4yOTM1NDU3NTY3RiwKKyAgICAwLjI5NDQ0OTIwNjFGLCAwLjI5NTM1MzQ4NjNGLCAwLjI5NjI1ODU5MzJGLCAwLjI5NzE2NDUyMzBGLAorICAgIDAuMjk4MDcxMjcxN0YsIDAuMjk4OTc4ODM1NkYsIDAuMjk5ODg3MjEwNUYsIDAuMzAwNzk2MzkyN0YsCisgICAgMC4zMDE3MDYzNzgxRiwgMC4zMDI2MTcxNjI5RiwgMC4zMDM1Mjg3NDMwRiwgMC4zMDQ0NDExMTQ1RiwKKyAgICAwLjMwNTM1NDI3MzZGLCAwLjMwNjI2ODIxNjFGLCAwLjMwNzE4MjkzODFGLCAwLjMwODA5ODQzNTZGLAorICAgIDAuMzA5MDE0NzA0N0YsIDAuMzA5OTMxNzQxM0YsIDAuMzEwODQ5NTQxNEYsIDAuMzExNzY4MTAxMUYsCisgICAgMC4zMTI2ODc0MTYzRiwgMC4zMTM2MDc0ODMwRiwgMC4zMTQ1MjgyOTcyRiwgMC4zMTU0NDk4NTQ4RiwKKyAgICAwLjMxNjM3MjE1MTdGLCAwLjMxNzI5NTE4NDFGLCAwLjMxODIxODk0NzdGLCAwLjMxOTE0MzQzODVGLAorICAgIDAuMzIwMDY4NjUyNUYsIDAuMzIwOTk0NTg1NkYsIDAuMzIxOTIxMjMzNkYsIDAuMzIyODQ4NTkyN0YsCisgICAgMC4zMjM3NzY2NTg1RiwgMC4zMjQ3MDU0MjcxRiwgMC4zMjU2MzQ4OTQzRiwgMC4zMjY1NjUwNTYwRiwKKyAgICAwLjMyNzQ5NTkwODFGLCAwLjMyODQyNzQ0NjVGLCAwLjMyOTM1OTY2NzFGLCAwLjMzMDI5MjU2NTdGLAorICAgIDAuMzMxMjI2MTM4MkYsIDAuMzMyMTYwMzgwNEYsIDAuMzMzMDk1Mjg4MkYsIDAuMzM0MDMwODU3NEYsCisgICAgMC4zMzQ5NjcwODM4RiwgMC4zMzU5MDM5NjM0RiwgMC4zMzY4NDE0OTE5RiwgMC4zMzc3Nzk2NjUxRiwKKyAgICAwLjMzODcxODQ3ODlGLCAwLjMzOTY1NzkyOTBGLCAwLjM0MDU5ODAxMTNGLCAwLjM0MTUzODcyMTZGLAorICAgIDAuMzQyNDgwMDU1NkYsIDAuMzQzNDIyMDA5MUYsIDAuMzQ0MzY0NTc3OUYsIDAuMzQ1MzA3NzU3OEYsCisgICAgMC4zNDYyNTE1NDQ2RiwgMC4zNDcxOTU5MzQwRiwgMC4zNDgxNDA5MjE3RiwgMC4zNDkwODY1MDM2RiwKKyAgICAwLjM1MDAzMjY3NTRGLCAwLjM1MDk3OTQzMjhGLCAwLjM1MTkyNjc3MTVGLCAwLjM1Mjg3NDY4NzNGLAorICAgIDAuMzUzODIzMTc1OUYsIDAuMzU0NzcyMjMzMEYsIDAuMzU1NzIxODU0NEYsIDAuMzU2NjcyMDM1N0YsCisgICAgMC4zNTc2MjI3NzI3RiwgMC4zNTg1NzQwNjEwRiwgMC4zNTk1MjU4OTY0RiwgMC4zNjA0NzgyNzQ1RiwKKyAgICAwLjM2MTQzMTE5MTBGLCAwLjM2MjM4NDY0MTdGLCAwLjM2MzMzODYyMjFGLCAwLjM2NDI5MzEyODBGLAorICAgIDAuMzY1MjQ4MTU0OUYsIDAuMzY2MjAzNjk4N0YsIDAuMzY3MTU5NzU0OEYsIDAuMzY4MTE2MzE5MUYsCisgICAgMC4zNjkwNzMzODcwRiwgMC4zNzAwMzA5NTQ0RiwgMC4zNzA5ODkwMTY3RiwgMC4zNzE5NDc1Njk2RiwKKyAgICAwLjM3MjkwNjYwODlGLCAwLjM3Mzg2NjEyOTlGLCAwLjM3NDgyNjEyODVGLCAwLjM3NTc4NjYwMDJGLAorICAgIDAuMzc2NzQ3NTQwNkYsIDAuMzc3NzA4OTQ1M0YsIDAuMzc4NjcwODEwMEYsIDAuMzc5NjMzMTMwMkYsCisgICAgMC4zODA1OTU5MDE0RiwgMC4zODE1NTkxMTk0RiwgMC4zODI1MjI3Nzk2RiwgMC4zODM0ODY4Nzc3RiwKKyAgICAwLjM4NDQ1MTQwOTNGLCAwLjM4NTQxNjM2OThGLCAwLjM4NjM4MTc1NDlGLCAwLjM4NzM0NzU2MDFGLAorICAgIDAuMzg4MzEzNzgxMEYsIDAuMzg5MjgwNDEzMUYsIDAuMzkwMjQ3NDUyMUYsIDAuMzkxMjE0ODkzM0YsCisgICAgMC4zOTIxODI3MzI1RiwgMC4zOTMxNTA5NjUwRiwgMC4zOTQxMTk1ODY1RiwgMC4zOTUwODg1OTI1RiwKKyAgICAwLjM5NjA1Nzk3ODVGLCAwLjM5NzAyNzc0MDBGLCAwLjM5Nzk5Nzg3MjVGLCAwLjM5ODk2ODM3MTZGLAorICAgIDAuMzk5OTM5MjMyOEYsIDAuNDAwOTEwNDUxNkYsIDAuNDAxODgyMDIzNEYsIDAuNDAyODUzOTQzOEYsCisgICAgMC40MDM4MjYyMDg0RiwgMC40MDQ3OTg4MTI1RiwgMC40MDU3NzE3NTE2RiwgMC40MDY3NDUwMjE0RiwKKyAgICAwLjQwNzcxODYxNzJGLCAwLjQwODY5MjUzNDVGLCAwLjQwOTY2Njc2ODhGLCAwLjQxMDY0MTMxNTVGLAorICAgIDAuNDExNjE2MTcwM0YsIDAuNDEyNTkxMzI4NEYsIDAuNDEzNTY2Nzg1NEYsIDAuNDE0NTQyNTM2OEYsCisgICAgMC40MTU1MTg1NzgwRiwgMC40MTY0OTQ5MDQ0RiwgMC40MTc0NzE1MTE2RiwgMC40MTg0NDgzOTQ5RiwKKyAgICAwLjQxOTQyNTU0OThGLCAwLjQyMDQwMjk3MThGLCAwLjQyMTM4MDY1NjNGLCAwLjQyMjM1ODU5ODdGLAorICAgIDAuNDIzMzM2Nzk0NkYsIDAuNDI0MzE1MjM5MkYsIDAuNDI1MjkzOTI4MUYsIDAuNDI2MjcyODU2NkYsCisgICAgMC40MjcyNTIwMjAyRiwgMC40MjgyMzE0MTQ0RiwgMC40MjkyMTEwMzQ1RiwgMC40MzAxOTA4NzYwRiwKKyAgICAwLjQzMTE3MDkzNDNGLCAwLjQzMjE1MTIwNDdGLCAwLjQzMzEzMTY4MjhGLCAwLjQzNDExMjM2MzlGLAorICAgIDAuNDM1MDkzMjQzNUYsIDAuNDM2MDc0MzE2OEYsIDAuNDM3MDU1NTc5NEYsIDAuNDM4MDM3MDI2N0YsCisgICAgMC40MzkwMTg2NTQwRiwgMC40NDAwMDA0NTY3RiwgMC40NDA5ODI0MzAzRiwgMC40NDE5NjQ1NzAxRiwKKyAgICAwLjQ0Mjk0Njg3MTZGLCAwLjQ0MzkyOTMzMDBGLCAwLjQ0NDkxMTk0MDlGLCAwLjQ0NTg5NDY5OTZGLAorICAgIDAuNDQ2ODc3NjAxNEYsIDAuNDQ3ODYwNjQxOEYsIDAuNDQ4ODQzODE2MkYsIDAuNDQ5ODI3MTE5OUYsCisgICAgMC40NTA4MTA1NDgzRiwgMC40NTE3OTQwOTY3RiwgMC40NTI3Nzc3NjA3RiwgMC40NTM3NjE1MzU1RiwKKyAgICAwLjQ1NDc0NTQxNjVGLCAwLjQ1NTcyOTM5OTFGLCAwLjQ1NjcxMzQ3ODZGLCAwLjQ1NzY5NzY1MDVGLAorICAgIDAuNDU4NjgxOTEwMUYsIDAuNDU5NjY2MjUyN0YsIDAuNDYwNjUwNjczOEYsIDAuNDYxNjM1MTY4N0YsCisgICAgMC40NjI2MTk3MzI4RiwgMC40NjM2MDQzNjE0RiwgMC40NjQ1ODkwNDk5RiwgMC40NjU1NzM3OTM2RiwKKyAgICAwLjQ2NjU1ODU4ODBGLCAwLjQ2NzU0MzQyODRGLCAwLjQ2ODUyODMxMDFGLCAwLjQ2OTUxMzIyODZGLAorICAgIDAuNDcwNDk4MTc5MUYsIDAuNDcxNDgzMTU3MEYsIDAuNDcyNDY4MTU3N0YsIDAuNDczNDUzMTc2NkYsCisgICAgMC40NzQ0MzgyMDg5RiwgMC40NzU0MjMyNTAxRiwgMC40NzY0MDgyOTU2RiwgMC40NzczOTMzNDA2RiwKKyAgICAwLjQ3ODM3ODM4MDZGLCAwLjQ3OTM2MzQxMDhGLCAwLjQ4MDM0ODQyNjdGLCAwLjQ4MTMzMzQyMzdGLAorICAgIDAuNDgyMzE4Mzk2OUYsIDAuNDgzMzAzMzQxOUYsIDAuNDg0Mjg4MjU0MEYsIDAuNDg1MjczMTI4NUYsCisgICAgMC40ODYyNTc5NjA4RiwgMC40ODcyNDI3NDYyRiwgMC40ODgyMjc0ODAyRiwgMC40ODkyMTIxNTgwRiwKKyAgICAwLjQ5MDE5Njc3NTFGLCAwLjQ5MTE4MTMyNjdGLCAwLjQ5MjE2NTgwODNGLCAwLjQ5MzE1MDIxNTFGLAorICAgIDAuNDk0MTM0NTQyN0YsIDAuNDk1MTE4Nzg2M0YsIDAuNDk2MTAyOTQxMkYsIDAuNDk3MDg3MDAyOUYsCisgICAgMC40OTgwNzA5NjY3RiwgMC40OTkwNTQ4MjgwRiwgMC41MDAwMzg1ODIyRiwgMC41MDEwMjIyMjQ1RiwKKyAgICAwLjUwMjAwNTc1MDVGLCAwLjUwMjk4OTE1NTNGLCAwLjUwMzk3MjQzNDVGLCAwLjUwNDk1NTU4MzRGLAorICAgIDAuNTA1OTM4NTk3M0YsIDAuNTA2OTIxNDcxNkYsIDAuNTA3OTA0MjAxOEYsIDAuNTA4ODg2NzgzMUYsCisgICAgMC41MDk4NjkyMTEwRiwgMC41MTA4NTE0ODA4RiwgMC41MTE4MzM1ODc5RiwgMC41MTI4MTU1Mjc3RiwKKyAgICAwLjUxMzc5NzI5NTZGLCAwLjUxNDc3ODg4NjlGLCAwLjUxNTc2MDI5NzFGLCAwLjUxNjc0MTUyMTVGLAorICAgIDAuNTE3NzIyNTU1NUYsIDAuNTE4NzAzMzk0NUYsIDAuNTE5Njg0MDMzOUYsIDAuNTIwNjY0NDY5MkYsCisgICAgMC41MjE2NDQ2OTU2RiwgMC41MjI2MjQ3MDg2RiwgMC41MjM2MDQ1MDM1RiwgMC41MjQ1ODQwNzU5RiwKKyAgICAwLjUyNTU2MzQyMTFGLCAwLjUyNjU0MjUzNDRGLCAwLjUyNzUyMTQxMTRGLCAwLjUyODUwMDA0NzRGLAorICAgIDAuNTI5NDc4NDM3OEYsIDAuNTMwNDU2NTc4MUYsIDAuNTMxNDM0NDYzN0YsIDAuNTMyNDEyMDg5OUYsCisgICAgMC41MzMzODk0NTIyRiwgMC41MzQzNjY1NDYxRiwgMC41MzUzNDMzNjcwRiwgMC41MzYzMTk5MTAyRiwKKyAgICAwLjUzNzI5NjE3MTNGLCAwLjUzODI3MjE0NTdGLCAwLjUzOTI0NzgyODdGLCAwLjU0MDIyMzIxNTlGLAorICAgIDAuNTQxMTk4MzAyN0YsIDAuNTQyMTczMDg0NUYsIDAuNTQzMTQ3NTU2OUYsIDAuNTQ0MTIxNzE1MUYsCisgICAgMC41NDUwOTU1NTQ4RiwgMC41NDYwNjkwNzE0RiwgMC41NDcwNDIyNjAyRiwgMC41NDgwMTUxMTY5RiwKKyAgICAwLjU0ODk4NzYzNjhGLCAwLjU0OTk1OTgxNTVGLCAwLjU1MDkzMTY0ODRGLCAwLjU1MTkwMzEzMTBGLAorICAgIDAuNTUyODc0MjU4N0YsIDAuNTUzODQ1MDI3MUYsIDAuNTU0ODE1NDMxN0YsIDAuNTU1Nzg1NDY4MEYsCisgICAgMC41NTY3NTUxMzE0RiwgMC41NTc3MjQ0MTc0RiwgMC41NTg2OTMzMjE2RiwgMC41NTk2NjE4Mzk1RiwKKyAgICAwLjU2MDYyOTk2NjVGLCAwLjU2MTU5NzY5ODNGLCAwLjU2MjU2NTAzMDJGLCAwLjU2MzUzMTk1ODBGLAorICAgIDAuNTY0NDk4NDc3MEYsIDAuNTY1NDY0NTgyOEYsIDAuNTY2NDMwMjcwOUYsIDAuNTY3Mzk1NTM3MEYsCisgICAgMC41NjgzNjAzNzY1RiwgMC41NjkzMjQ3ODUwRiwgMC41NzAyODg3NTgwRiwgMC41NzEyNTIyOTEyRiwKKyAgICAwLjU3MjIxNTM4MDBGLCAwLjU3MzE3ODAyMDBGLCAwLjU3NDE0MDIwNjlGLCAwLjU3NTEwMTkzNjJGLAorICAgIDAuNTc2MDYzMjAzNEYsIDAuNTc3MDI0MDA0MkYsIDAuNTc3OTg0MzM0MUYsIDAuNTc4OTQ0MTg4OUYsCisgICAgMC41Nzk5MDM1NjM5RiwgMC41ODA4NjI0NTQ5RiwgMC41ODE4MjA4NTc1RiwgMC41ODI3Nzg3NjczRiwKKyAgICAwLjU4MzczNjE4MDBGLCAwLjU4NDY5MzA5MTBGLCAwLjU4NTY0OTQ5NjFGLCAwLjU4NjYwNTM5MTBGLAorICAgIDAuNTg3NTYwNzcxMkYsIDAuNTg4NTE1NjMyNEYsIDAuNTg5NDY5OTcwM0YsIDAuNTkwNDIzNzgwNEYsCisgICAgMC41OTEzNzcwNTg2RiwgMC41OTIzMjk4MDA0RiwgMC41OTMyODIwMDE2RiwgMC41OTQyMzM2NTc4RiwKKyAgICAwLjU5NTE4NDc2NDZGLCAwLjU5NjEzNTMxNzlGLCAwLjU5NzA4NTMxMzJGLCAwLjU5ODAzNDc0NjRGLAorICAgIDAuNTk4OTgzNjEzMUYsIDAuNTk5OTMxOTA5MEYsIDAuNjAwODc5NjI5OEYsIDAuNjAxODI2NzcxM0YsCisgICAgMC42MDI3NzMzMjkyRiwgMC42MDM3MTkyOTkzRiwgMC42MDQ2NjQ2NzczRiwgMC42MDU2MDk0NTg5RiwKKyAgICAwLjYwNjU1MzY0MDBGLCAwLjYwNzQ5NzIxNjJGLCAwLjYwODQ0MDE4MzNGLCAwLjYwOTM4MjUzNzJGLAorICAgIDAuNjEwMzI0MjczNkYsIDAuNjExMjY1Mzg4NEYsIDAuNjEyMjA1ODc3MkYsIDAuNjEzMTQ1NzM1OUYsCisgICAgMC42MTQwODQ5NjA0RiwgMC42MTUwMjM1NDY0RiwgMC42MTU5NjE0ODk3RiwgMC42MTY4OTg3ODYyRiwKKyAgICAwLjYxNzgzNTQzMThGLCAwLjYxODc3MTQyMjNGLCAwLjYxOTcwNjc1MzVGLCAwLjYyMDY0MTQyMTNGLAorICAgIDAuNjIxNTc1NDIxNUYsIDAuNjIyNTA4NzUwMUYsIDAuNjIzNDQxNDAyOEYsIDAuNjI0MzczMzc1N0YsCisgICAgMC42MjUzMDQ2NjQ2RiwgMC42MjYyMzUyNjU0RiwgMC42MjcxNjUxNzM5RiwgMC42MjgwOTQzODYyRiwKKyAgICAwLjYyOTAyMjg5ODJGLCAwLjYyOTk1MDcwNTdGLCAwLjYzMDg3NzgwNDhGLCAwLjYzMTgwNDE5MTNGLAorICAgIDAuNjMyNzI5ODYxMkYsIDAuNjMzNjU0ODEwNUYsIDAuNjM0NTc5MDM1MkYsIDAuNjM1NTAyNTMxMkYsCisgICAgMC42MzY0MjUyOTQ1RiwgMC42MzczNDczMjExRiwgMC42MzgyNjg2MDcwRiwgMC42MzkxODkxNDgzRiwKKyAgICAwLjY0MDEwODk0MDlGLCAwLjY0MTAyNzk4MDhGLCAwLjY0MTk0NjI2NDJGLCAwLjY0Mjg2Mzc4NjlGLAorICAgIDAuNjQzNzgwNTQ1MkYsIDAuNjQ0Njk2NTM1MEYsIDAuNjQ1NjExNzUyNEYsIDAuNjQ2NTI2MTkzNUYsCisgICAgMC42NDc0Mzk4NTQ0RiwgMC42NDgzNTI3MzExRiwgMC42NDkyNjQ4MTk3RiwgMC42NTAxNzYxMTY1RiwKKyAgICAwLjY1MTA4NjYxNzRGLCAwLjY1MTk5NjMxODZGLCAwLjY1MjkwNTIxNjJGLCAwLjY1MzgxMzMwNjRGLAorICAgIDAuNjU0NzIwNTg1NEYsIDAuNjU1NjI3MDQ5MkYsIDAuNjU2NTMyNjk0MUYsIDAuNjU3NDM3NTE2MkYsCisgICAgMC42NTgzNDE1MTE3RiwgMC42NTkyNDQ2NzY5RiwgMC42NjAxNDcwMDc5RiwgMC42NjEwNDg1MDA5RiwKKyAgICAwLjY2MTk0OTE1MjFGLCAwLjY2Mjg0ODk1NzhGLCAwLjY2Mzc0NzkxNDNGLCAwLjY2NDY0NjAxNzdGLAorICAgIDAuNjY1NTQzMjY0M0YsIDAuNjY2NDM5NjUwNUYsIDAuNjY3MzM1MTcyNEYsIDAuNjY4MjI5ODI2NEYsCisgICAgMC42NjkxMjM2MDg3RiwgMC42NzAwMTY1MTU3RiwgMC42NzA5MDg1NDM2RiwgMC42NzE3OTk2ODg5RiwKKyAgICAwLjY3MjY4OTk0NzhGLCAwLjY3MzU3OTMxNjdGLCAwLjY3NDQ2Nzc5MThGLCAwLjY3NTM1NTM2OTdGLAorICAgIDAuNjc2MjQyMDQ2NkYsIDAuNjc3MTI3ODE5MEYsIDAuNjc4MDEyNjgzMkYsIDAuNjc4ODk2NjM1N0YsCisgICAgMC42Nzk3Nzk2NzI4RiwgMC42ODA2NjE3OTA5RiwgMC42ODE1NDI5ODY2RiwgMC42ODI0MjMyNTYyRiwKKyAgICAwLjY4MzMwMjU5NjFGLCAwLjY4NDE4MTAwMzBGLCAwLjY4NTA1ODQ3MzFGLCAwLjY4NTkzNTAwMzFGLAorICAgIDAuNjg2ODEwNTg5NEYsIDAuNjg3Njg1MjI4NEYsIDAuNjg4NTU4OTE2OEYsIDAuNjg5NDMxNjUxMEYsCisgICAgMC42OTAzMDM0Mjc1RiwgMC42OTExNzQyNDMwRiwgMC42OTIwNDQwOTM5RiwgMC42OTI5MTI5NzY5RiwKKyAgICAwLjY5Mzc4MDg4ODRGLCAwLjY5NDY0NzgyNTFGLCAwLjY5NTUxMzc4MzdGLCAwLjY5NjM3ODc2MDZGLAorICAgIDAuNjk3MjQyNzUyNUYsIDAuNjk4MTA1NzU2MEYsIDAuNjk4OTY3NzY3OEYsIDAuNjk5ODI4Nzg0NUYsCisgICAgMC43MDA2ODg4MDI4RiwgMC43MDE1NDc4MTk0RiwgMC43MDI0MDU4MzA5RiwgMC43MDMyNjI4MzQwRiwKKyAgICAwLjcwNDExODgyNTRGLCAwLjcwNDk3MzgwMTlGLCAwLjcwNTgyNzc2MDFGLCAwLjcwNjY4MDY5NjlGLAorICAgIDAuNzA3NTMyNjA4OUYsIDAuNzA4MzgzNDkyOUYsIDAuNzA5MjMzMzQ1N0YsIDAuNzEwMDgyMTY0MEYsCisgICAgMC43MTA5Mjk5NDQ3RiwgMC43MTE3NzY2ODQ2RiwgMC43MTI2MjIzODA0RiwgMC43MTM0NjcwMjkxRiwKKyAgICAwLjcxNDMxMDYyNzNGLCAwLjcxNTE1MzE3MjFGLCAwLjcxNTk5NDY2MDJGLCAwLjcxNjgzNTA4ODVGLAorICAgIDAuNzE3Njc0NDUzOUYsIDAuNzE4NTEyNzUzNEYsIDAuNzE5MzQ5OTgzN0YsIDAuNzIwMTg2MTQxOEYsCisgICAgMC43MjEwMjEyMjQ3RiwgMC43MjE4NTUyMjkzRiwgMC43MjI2ODgxNTI2RiwgMC43MjM1MTk5OTE0RiwKKyAgICAwLjcyNDM1MDc0MjhGLCAwLjcyNTE4MDQwMzlGLCAwLjcyNjAwODk3MTVGLCAwLjcyNjgzNjQ0MjZGLAorICAgIDAuNzI3NjYyODE0NEYsIDAuNzI4NDg4MDgzOUYsIDAuNzI5MzEyMjQ4MUYsIDAuNzMwMTM1MzA0MEYsCisgICAgMC43MzA5NTcyNDg3RiwgMC43MzE3NzgwNzk0RiwgMC43MzI1OTc3OTMwRiwgMC43MzM0MTYzODY4RiwKKyAgICAwLjczNDIzMzg1NzlGLCAwLjczNTA1MDIwMzNGLCAwLjczNTg2NTQyMDJGLCAwLjczNjY3OTUwNTlGLAorICAgIDAuNzM3NDkyNDU3M0YsIDAuNzM4MzA0MjcxOEYsIDAuNzM5MTE0OTQ2NUYsIDAuNzM5OTI0NDc4N0YsCisgICAgMC43NDA3MzI4NjU1RiwgMC43NDE1NDAxMDQxRiwgMC43NDIzNDYxOTIwRiwgMC43NDMxNTExMjYxRiwKKyAgICAwLjc0Mzk1NDkwNDBGLCAwLjc0NDc1NzUyMjdGLCAwLjc0NTU1ODk3OTdGLCAwLjc0NjM1OTI3MjNGLAorICAgIDAuNzQ3MTU4Mzk3NkYsIDAuNzQ3OTU2MzUzMkYsIDAuNzQ4NzUzMTM2M0YsIDAuNzQ5NTQ4NzQ0M0YsCisgICAgMC43NTAzNDMxNzQ1RiwgMC43NTExMzY0MjQ0RiwgMC43NTE5Mjg0OTEzRiwgMC43NTI3MTkzNzI2RiwKKyAgICAwLjc1MzUwOTA2NThGLCAwLjc1NDI5NzU2ODNGLCAwLjc1NTA4NDg3NzZGLCAwLjc1NTg3MDk5MTBGLAorICAgIDAuNzU2NjU1OTA2MkYsIDAuNzU3NDM5NjIwNUYsIDAuNzU4MjIyMTMxNEYsIDAuNzU5MDAzNDM2NkYsCisgICAgMC43NTk3ODM1MzM0RiwgMC43NjA1NjI0MTk0RiwgMC43NjEzNDAwOTIzRiwgMC43NjIxMTY1NDk1RiwKKyAgICAwLjc2Mjg5MTc4ODZGLCAwLjc2MzY2NTgwNzJGLCAwLjc2NDQzODYwMzBGLCAwLjc2NTIxMDE3MzVGLAorICAgIDAuNzY1OTgwNTE2NEYsIDAuNzY2NzQ5NjI5MkYsIDAuNzY3NTE3NTA5OEYsIDAuNzY4Mjg0MTU1NkYsCisgICAgMC43NjkwNDk1NjQ1RiwgMC43Njk4MTM3MzQxRiwgMC43NzA1NzY2NjIyRiwgMC43NzEzMzgzNDYzRiwKKyAgICAwLjc3MjA5ODc4NDRGLCAwLjc3Mjg1Nzk3NDFGLCAwLjc3MzYxNTkxMzJGLCAwLjc3NDM3MjU5OTRGLAorICAgIDAuNzc1MTI4MDMwNkYsIDAuNzc1ODgyMjA0NkYsIDAuNzc2NjM1MTE5MkYsIDAuNzc3Mzg2NzcyMkYsCisgICAgMC43NzgxMzcxNjE0RiwgMC43Nzg4ODYyODQ4RiwgMC43Nzk2MzQxNDAxRiwgMC43ODAzODA3MjUzRiwKKyAgICAwLjc4MTEyNjAzODNGLCAwLjc4MTg3MDA3NjlGLCAwLjc4MjYxMjgzOTJGLCAwLjc4MzM1NDMyMzBGLAorICAgIDAuNzg0MDk0NTI2M0YsIDAuNzg0ODMzNDQ3MUYsIDAuNzg1NTcxMDgzM0YsIDAuNzg2MzA3NDMzMEYsCisgICAgMC43ODcwNDI0OTQxRiwgMC43ODc3NzYyNjQ3RiwgMC43ODg1MDg3NDI4RiwgMC43ODkyMzk5MjY0RiwKKyAgICAwLjc4OTk2OTgxMzdGLCAwLjc5MDY5ODQwMjZGLCAwLjc5MTQyNTY5MTRGLCAwLjc5MjE1MTY3ODBGLAorICAgIDAuNzkyODc2MzYwN0YsIDAuNzkzNTk5NzM3NUYsIDAuNzk0MzIxODA2NUYsIDAuNzk1MDQyNTY2MUYsCisgICAgMC43OTU3NjIwMTQyRiwgMC43OTY0ODAxNDkyRiwgMC43OTcxOTY5NjkyRiwgMC43OTc5MTI0NzI0RiwKKyAgICAwLjc5ODYyNjY1NzBGLCAwLjc5OTMzOTUyMTRGLCAwLjgwMDA1MTA2MzhGLCAwLjgwMDc2MTI4MjNGLAorICAgIDAuODAxNDcwMTc1NEYsIDAuODAyMTc3NzQxM0YsIDAuODAyODgzOTc4NEYsIDAuODAzNTg4ODg0OUYsCisgICAgMC44MDQyOTI0NTkyRiwgMC44MDQ5OTQ2OTk3RiwgMC44MDU2OTU2MDQ4RiwgMC44MDYzOTUxNzI3RiwKKyAgICAwLjgwNzA5MzQwMjBGLCAwLjgwNzc5MDI5MTBGLCAwLjgwODQ4NTgzODFGLCAwLjgwOTE4MDA0MTlGLAorICAgIDAuODA5ODcyOTAwN0YsIDAuODEwNTY0NDEzMEYsIDAuODExMjU0NTc3NEYsIDAuODExOTQzMzkyMkYsCisgICAgMC44MTI2MzA4NTYxRiwgMC44MTMzMTY5Njc2RiwgMC44MTQwMDE3MjUxRiwgMC44MTQ2ODUxMjcyRiwKKyAgICAwLjgxNTM2NzE3MjZGLCAwLjgxNjA0Nzg1OThGLCAwLjgxNjcyNzE4NzRGLCAwLjgxNzQwNTE1MzlGLAorICAgIDAuODE4MDgxNzU4MkYsIDAuODE4NzU2OTk4NkYsIDAuODE5NDMwODc0MUYsIDAuODIwMTAzMzgzMUYsCisgICAgMC44MjA3NzQ1MjQ0RiwgMC44MjE0NDQyOTY2RiwgMC44MjIxMTI2OTg2RiwgMC44MjI3Nzk3MjkwRiwKKyAgICAwLjgyMzQ0NTM4NjVGLCAwLjgyNDEwOTY3MDBGLCAwLjgyNDc3MjU3ODFGLCAwLjgyNTQzNDEwOTdGLAorICAgIDAuODI2MDk0MjYzNkYsIDAuODI2NzUzMDM4NUYsIDAuODI3NDEwNDMzNEYsIDAuODI4MDY2NDQ3MEYsCisgICAgMC44Mjg3MjEwNzgyRiwgMC44MjkzNzQzMjU5RiwgMC44MzAwMjYxODg5RiwgMC44MzA2NzY2NjYyRiwKKyAgICAwLjgzMTMyNTc1NjZGLCAwLjgzMTk3MzQ1OTFGLCAwLjgzMjYxOTc3MjdGLCAwLjgzMzI2NDY5NjNGLAorICAgIDAuODMzOTA4MjI4OEYsIDAuODM0NTUwMzY5MkYsIDAuODM1MTkxMTE2N0YsIDAuODM1ODMwNDcwMEYsCisgICAgMC44MzY0Njg0Mjg0RiwgMC44MzcxMDQ5OTA3RiwgMC44Mzc3NDAxNTYyRiwgMC44MzgzNzM5MjM4RiwKKyAgICAwLjgzOTAwNjI5MjdGLCAwLjgzOTYzNzI2MThGLCAwLjg0MDI2NjgzMDVGLCAwLjg0MDg5NDk5NzdGLAorICAgIDAuODQxNTIxNzYyNkYsIDAuODQyMTQ3MTI0NUYsIDAuODQyNzcxMDgyM0YsIDAuODQzMzkzNjM1NEYsCisgICAgMC44NDQwMTQ3ODMwRiwgMC44NDQ2MzQ1MjQyRiwgMC44NDUyNTI4NTgyRiwgMC44NDU4Njk3ODQ0RiwKKyAgICAwLjg0NjQ4NTMwMjBGLCAwLjg0NzA5OTQxMDJGLCAwLjg0NzcxMjEwODRGLCAwLjg0ODMyMzM5NThGLAorICAgIDAuODQ4OTMzMjcxOEYsIDAuODQ5NTQxNzM1NkYsIDAuODUwMTQ4Nzg2NkYsIDAuODUwNzU0NDI0M0YsCisgICAgMC44NTEzNTg2NDc5RiwgMC44NTE5NjE0NTY4RiwgMC44NTI1NjI4NTA1RiwgMC44NTMxNjI4MjgzRiwKKyAgICAwLjg1Mzc2MTM4OTdGLCAwLjg1NDM1ODUzNDFGLCAwLjg1NDk1NDI2MTFGLCAwLjg1NTU0ODU2OTlGLAorICAgIDAuODU2MTQxNDYwM0YsIDAuODU2NzMyOTMxNUYsIDAuODU3MzIyOTgzMkYsIDAuODU3OTExNjE0OUYsCisgICAgMC44NTg0OTg4MjYyRiwgMC44NTkwODQ2MTY1RiwgMC44NTk2Njg5ODU1RiwgMC44NjAyNTE5MzI3RiwKKyAgICAwLjg2MDgzMzQ1NzdGLCAwLjg2MTQxMzU2MDNGLCAwLjg2MTk5MjIzOTlGLCAwLjg2MjU2OTQ5NjJGLAorICAgIDAuODYzMTQ1MzI4OUYsIDAuODYzNzE5NzM3N0YsIDAuODY0MjkyNzIyMkYsIDAuODY0ODY0MjgyMUYsCisgICAgMC44NjU0MzQ0MTcyRiwgMC44NjYwMDMxMjcyRiwgMC44NjY1NzA0MTE4RiwgMC44NjcxMzYyNzA4RiwKKyAgICAwLjg2NzcwMDcwMzlGLCAwLjg2ODI2MzcxMDlGLCAwLjg2ODgyNTI5MTdGLCAwLjg2OTM4NTQ0NjBGLAorICAgIDAuODY5OTQ0MTczN0YsIDAuODcwNTAxNDc0NUYsIDAuODcxMDU3MzQ4NUYsIDAuODcxNjExNzk1M0YsCisgICAgMC44NzIxNjQ4MTUwRiwgMC44NzI3MTY0MDczRiwgMC44NzMyNjY1NzIzRiwgMC44NzM4MTUzMDk4RiwKKyAgICAwLjg3NDM2MjYxOTdGLCAwLjg3NDkwODUwMjFGLCAwLjg3NTQ1Mjk1NjlGLCAwLjg3NTk5NTk4NDBGLAorICAgIDAuODc2NTM3NTgzNUYsIDAuODc3MDc3NzU1M0YsIDAuODc3NjE2NDk5NkYsIDAuODc4MTUzODE2MkYsCisgICAgMC44Nzg2ODk3MDU0RiwgMC44NzkyMjQxNjcwRiwgMC44Nzk3NTcyMDEzRiwgMC44ODAyODg4MDgyRiwKKyAgICAwLjg4MDgxODk4ODBGLCAwLjg4MTM0Nzc0MDdGLCAwLjg4MTg3NTA2NjRGLCAwLjg4MjQwMDk2NTNGLAorICAgIDAuODgyOTI1NDM3NUYsIDAuODgzNDQ4NDgzM0YsIDAuODgzOTcwMTAyOEYsIDAuODg0NDkwMjk2MUYsCisgICAgMC44ODUwMDkwNjM2RiwgMC44ODU1MjY0MDU0RiwgMC44ODYwNDIzMjE4RiwgMC44ODY1NTY4MTMxRiwKKyAgICAwLjg4NzA2OTg3OTRGLCAwLjg4NzU4MTUyMTJGLCAwLjg4ODA5MTczODZGLCAwLjg4ODYwMDUzMTlGLAorICAgIDAuODg5MTA3OTAxNkYsIDAuODg5NjEzODQ3OUYsIDAuODkwMTE4MzcxMkYsIDAuODkwNjIxNDcxOUYsCisgICAgMC44OTExMjMxNTAzRiwgMC44OTE2MjM0MDY3RiwgMC44OTIxMjIyNDE3RiwgMC44OTI2MTk2NTU2RiwKKyAgICAwLjg5MzExNTY0ODlGLCAwLjg5MzYxMDIyMTlGLCAwLjg5NDEwMzM3NTJGLCAwLjg5NDU5NTEwOTJGLAorICAgIDAuODk1MDg1NDI0NEYsIDAuODk1NTc0MzIxMkYsIDAuODk2MDYxODAwM0YsIDAuODk2NTQ3ODYyMUYsCisgICAgMC44OTcwMzI1MDcxRiwgMC44OTc1MTU3MzU5RiwgMC44OTc5OTc1NDkwRiwgMC44OTg0Nzc5NDcxRiwKKyAgICAwLjg5ODk1NjkzMDdGLCAwLjg5OTQzNDUwMDRGLCAwLjg5OTkxMDY1NjhGLCAwLjkwMDM4NTQwMDVGLAorICAgIDAuOTAwODU4NzMyM0YsIDAuOTAxMzMwNjUyNkYsIDAuOTAxODAxMTYyM0YsIDAuOTAyMjcwMjYxOUYsCisgICAgMC45MDI3Mzc5NTIxRiwgMC45MDMyMDQyMzM3RiwgMC45MDM2NjkxMDc0RiwgMC45MDQxMzI1NzM5RiwKKyAgICAwLjkwNDU5NDYzMzlGLCAwLjkwNTA1NTI4ODJGLCAwLjkwNTUxNDUzNzZGLCAwLjkwNTk3MjM4MjhGLAorICAgIDAuOTA2NDI4ODI0NkYsIDAuOTA2ODgzODYzOEYsIDAuOTA3MzM3NTAxM0YsIDAuOTA3Nzg5NzM3OUYsCisgICAgMC45MDgyNDA1NzQzRiwgMC45MDg2OTAwMTE1RiwgMC45MDkxMzgwNTAzRiwgMC45MDk1ODQ2OTE3RiwKKyAgICAwLjkxMDAyOTkzNjRGLCAwLjkxMDQ3Mzc4NTRGLCAwLjkxMDkxNjIzOTdGLCAwLjkxMTM1NzMwMDFGLAorICAgIDAuOTExNzk2OTY3NUYsIDAuOTEyMjM1MjQzMEYsIDAuOTEyNjcyMTI3NUYsIDAuOTEzMTA3NjIxOUYsCisgICAgMC45MTM1NDE3MjczRiwgMC45MTM5NzQ0NDQ3RiwgMC45MTQ0MDU3NzUwRiwgMC45MTQ4MzU3MTk0RiwKKyAgICAwLjkxNTI2NDI3ODdGLCAwLjkxNTY5MTQ1NDJGLCAwLjkxNjExNzI0NjhGLCAwLjkxNjU0MTY1NzZGLAorICAgIDAuOTE2OTY0Njg3N0YsIDAuOTE3Mzg2MzM4MkYsIDAuOTE3ODA2NjEwMkYsIDAuOTE4MjI1NTA0OEYsCisgICAgMC45MTg2NDMwMjMyRiwgMC45MTkwNTkxNjY1RiwgMC45MTk0NzM5MzU5RiwgMC45MTk4ODczMzI0RiwKKyAgICAwLjkyMDI5OTM1NzRGLCAwLjkyMDcxMDAxMjBGLCAwLjkyMTExOTI5NzNGLCAwLjkyMTUyNzIxNDdGLAorICAgIDAuOTIxOTMzNzY1M0YsIDAuOTIyMzM4OTUwNEYsIDAuOTIyNzQyNzcxM0YsIDAuOTIzMTQ1MjI5MEYsCisgICAgMC45MjM1NDYzMjUxRiwgMC45MjM5NDYwNjA3RiwgMC45MjQzNDQ0MzcxRiwgMC45MjQ3NDE0NTU3RiwKKyAgICAwLjkyNTEzNzExNzdGLCAwLjkyNTUzMTQyNDVGLCAwLjkyNTkyNDM3NzRGLCAwLjkyNjMxNTk3NzhGLAorICAgIDAuOTI2NzA2MjI3MEYsIDAuOTI3MDk1MTI2NEYsIDAuOTI3NDgyNjc3NEYsIDAuOTI3ODY4ODgxNEYsCisgICAgMC45MjgyNTM3Mzk4RiwgMC45Mjg2MzcyNTQwRiwgMC45MjkwMTk0MjU0RiwgMC45Mjk0MDAyNTU1RiwKKyAgICAwLjkyOTc3OTc0NThGLCAwLjkzMDE1Nzg5NzZGLCAwLjkzMDUzNDcxMjVGLCAwLjkzMDkxMDE5MTlGLAorICAgIDAuOTMxMjg0MzM3M0YsIDAuOTMxNjU3MTUwM0YsIDAuOTMyMDI4NjMyM0YsIDAuOTMyMzk4Nzg0OUYsCisgICAgMC45MzI3Njc2MDk3RiwgMC45MzMxMzUxMDgwRiwgMC45MzM1MDEyODE2RiwgMC45MzM4NjYxMzIwRiwKKyAgICAwLjkzNDIyOTY2MDdGLCAwLjkzNDU5MTg2OTRGLCAwLjkzNDk1Mjc1OTZGLCAwLjkzNTMxMjMzMzBGLAorICAgIDAuOTM1NjcwNTkxMUYsIDAuOTM2MDI3NTM1N0YsIDAuOTM2MzgzMTY4M0YsIDAuOTM2NzM3NDkwNUYsCisgICAgMC45MzcwOTA1MDQyRiwgMC45Mzc0NDIyMTA4RiwgMC45Mzc3OTI2MTIyRiwgMC45MzgxNDE3MDk5RiwKKyAgICAwLjkzODQ4OTUwNTdGLCAwLjkzODgzNjAwMTRGLCAwLjkzOTE4MTE5ODVGLCAwLjkzOTUyNTA5ODlGLAorICAgIDAuOTM5ODY3NzA0M0YsIDAuOTQwMjA5MDE2NUYsIDAuOTQwNTQ5MDM3MUYsIDAuOTQwODg3NzY4MEYsCisgICAgMC45NDEyMjUyMTEwRiwgMC45NDE1NjEzNjc4RiwgMC45NDE4OTYyNDAyRiwgMC45NDIyMjk4MzAxRiwKKyAgICAwLjk0MjU2MjEzOTJGLCAwLjk0Mjg5MzE2OTVGLCAwLjk0MzIyMjkyMjZGLCAwLjk0MzU1MTQwMDVGLAorICAgIDAuOTQzODc4NjA1MEYsIDAuOTQ0MjA0NTM4MUYsIDAuOTQ0NTI5MjAxNEYsIDAuOTQ0ODUyNTk3MUYsCisgICAgMC45NDUxNzQ3MjY4RiwgMC45NDU0OTU1OTI2RiwgMC45NDU4MTUxOTYzRiwgMC45NDYxMzM1Mzk5RiwKKyAgICAwLjk0NjQ1MDYyNTNGLCAwLjk0Njc2NjQ1NDVGLCAwLjk0NzA4MTAyOTNGLCAwLjk0NzM5NDM1MTdGLAorICAgIDAuOTQ3NzA2NDIzOEYsIDAuOTQ4MDE3MjQ3NEYsIDAuOTQ4MzI2ODI0NkYsIDAuOTQ4NjM1MTU3M0YsCisgICAgMC45NDg5NDIyNDc1RiwgMC45NDkyNDgwOTczRiwgMC45NDk1NTI3MDg3RiwgMC45NDk4NTYwODM3RiwKKyAgICAwLjk1MDE1ODIyNDNGLCAwLjk1MDQ1OTEzMjVGLCAwLjk1MDc1ODgxMDVGLCAwLjk1MTA1NzI2MDNGLAorICAgIDAuOTUxMzU0NDgzOUYsIDAuOTUxNjUwNDgzNEYsIDAuOTUxOTQ1MjYwOUYsIDAuOTUyMjM4ODE4NkYsCisgICAgMC45NTI1MzExNTg0RiwgMC45NTI4MjIyODI2RiwgMC45NTMxMTIxOTMyRiwgMC45NTM0MDA4OTIzRiwKKyAgICAwLjk1MzY4ODM4MjFGLCAwLjk1Mzk3NDY2NDdGLCAwLjk1NDI1OTc0MjRGLCAwLjk1NDU0MzYxNzFGLAorICAgIDAuOTU0ODI2MjkxMkYsIDAuOTU1MTA3NzY2N0YsIDAuOTU1Mzg4MDQ1OUYsIDAuOTU1NjY3MTMwOUYsCisgICAgMC45NTU5NDUwMjM5RiwgMC45NTYyMjE3MjcyRiwgMC45NTY0OTcyNDI5RiwgMC45NTY3NzE1NzMzRiwKKyAgICAwLjk1NzA0NDcyMDZGLCAwLjk1NzMxNjY4NzFGLCAwLjk1NzU4NzQ3NDlGLCAwLjk1Nzg1NzA4NjNGLAorICAgIDAuOTU4MTI1NTIzNkYsIDAuOTU4MzkyNzg5MEYsIDAuOTU4NjU4ODg0OUYsIDAuOTU4OTIzODEzNEYsCisgICAgMC45NTkxODc1NzY5RiwgMC45NTk0NTAxNzc3RiwgMC45NTk3MTE2MTgwRiwgMC45NTk5NzE5MDAzRiwKKyAgICAwLjk2MDIzMTAyNjdGLCAwLjk2MDQ4ODk5OTVGLCAwLjk2MDc0NTgyMTNGLCAwLjk2MTAwMTQ5NDJGLAorICAgIDAuOTYxMjU2MDIwNkYsIDAuOTYxNTA5NDAyOEYsIDAuOTYxNzYxNjQzM0YsIDAuOTYyMDEyNzQ0M0YsCisgICAgMC45NjIyNjI3MDgzRiwgMC45NjI1MTE1Mzc2RiwgMC45NjI3NTkyMzQ1RiwgMC45NjMwMDU4MDE2RiwKKyAgICAwLjk2MzI1MTI0MTFGLCAwLjk2MzQ5NTU1NTVGLCAwLjk2MzczODc0NzFGLCAwLjk2Mzk4MDgxODVGLAorICAgIDAuOTY0MjIxNzcyMEYsIDAuOTY0NDYxNjEwMEYsIDAuOTY0NzAwMzM0OUYsIDAuOTY0OTM3OTQ5M0YsCisgICAgMC45NjUxNzQ0NTU2RiwgMC45NjU0MDk4NTYxRiwgMC45NjU2NDQxNTM0RiwgMC45NjU4NzczNDk5RiwKKyAgICAwLjk2NjEwOTQ0ODBGLCAwLjk2NjM0MDQ1MDRGLCAwLjk2NjU3MDM1OTNGLCAwLjk2Njc5OTE3NzRGLAorICAgIDAuOTY3MDI2OTA3MUYsIDAuOTY3MjUzNTUwOUYsIDAuOTY3NDc5MTExNEYsIDAuOTY3NzAzNTkwOUYsCisgICAgMC45Njc5MjY5OTIxRiwgMC45NjgxNDkzMTc0RiwgMC45NjgzNzA1Njk0RiwgMC45Njg1OTA3NTA2RiwKKyAgICAwLjk2ODgwOTg2MzZGLCAwLjk2OTAyNzkxMDhGLCAwLjk2OTI0NDg5NDhGLCAwLjk2OTQ2MDgxODJGLAorICAgIDAuOTY5Njc1NjgzNkYsIDAuOTY5ODg5NDkzNEYsIDAuOTcwMTAyMjUwM0YsIDAuOTcwMzEzOTU2OUYsCisgICAgMC45NzA1MjQ2MTU2RiwgMC45NzA3MzQyMjkxRiwgMC45NzA5NDI4MDAwRiwgMC45NzExNTAzMzA5RiwKKyAgICAwLjk3MTM1NjgyNDNGLCAwLjk3MTU2MjI4MjlGLCAwLjk3MTc2NjcwOTNGLCAwLjk3MTk3MDEwNjBGLAorICAgIDAuOTcyMTcyNDc1N0YsIDAuOTcyMzczODIxMEYsIDAuOTcyNTc0MTQ0NkYsIDAuOTcyNzczNDQ5MEYsCisgICAgMC45NzI5NzE3MzY5RiwgMC45NzMxNjkwMTA5RiwgMC45NzMzNjUyNzM3RiwgMC45NzM1NjA1Mjc5RiwKKyAgICAwLjk3Mzc1NDc3NjJGLCAwLjk3Mzk0ODAyMTJGLCAwLjk3NDE0MDI2NTZGLCAwLjk3NDMzMTUxMjBGLAorICAgIDAuOTc0NTIxNzYzMUYsIDAuOTc0NzExMDIxNkYsIDAuOTc0ODk5MjkwMUYsIDAuOTc1MDg2NTcxNEYsCisgICAgMC45NzUyNzI4NjgxRiwgMC45NzU0NTgxODI5RiwgMC45NzU2NDI1MTg0RiwgMC45NzU4MjU4Nzc1RiwKKyAgICAwLjk3NjAwODI2MjdGLCAwLjk3NjE4OTY3NjhGLCAwLjk3NjM3MDEyMjRGLCAwLjk3NjU0OTYwMjRGLAorICAgIDAuOTc2NzI4MTE5M0YsIDAuOTc2OTA1Njc2MEYsIDAuOTc3MDgyMjc1MUYsIDAuOTc3MjU3OTE5M0YsCisgICAgMC45Nzc0MzI2MTE0RiwgMC45Nzc2MDYzNTQyRiwgMC45Nzc3NzkxNTAyRiwgMC45Nzc5NTEwMDIzRiwKKyAgICAwLjk3ODEyMTkxMzNGLCAwLjk3ODI5MTg4NThGLCAwLjk3ODQ2MDkyMjZGLCAwLjk3ODYyOTAyNjRGLAorICAgIDAuOTc4Nzk2MjAwMEYsIDAuOTc4OTYyNDQ2MUYsIDAuOTc5MTI3NzY3NkYsIDAuOTc5MjkyMTY3MUYsCisgICAgMC45Nzk0NTU2NDc0RiwgMC45Nzk2MTgyMTEzRiwgMC45Nzk3Nzk4NjE1RiwgMC45Nzk5NDA2MDA5RiwKKyAgICAwLjk4MDEwMDQzMjFGLCAwLjk4MDI1OTM1ODBGLCAwLjk4MDQxNzM4MTNGLCAwLjk4MDU3NDUwNDlGLAorICAgIDAuOTgwNzMwNzMxNEYsIDAuOTgwODg2MDYzN0YsIDAuOTgxMDQwNTA0NkYsIDAuOTgxMTk0MDU2OEYsCisgICAgMC45ODEzNDY3MjMyRiwgMC45ODE0OTg1MDY1RiwgMC45ODE2NDk0MDk1RiwgMC45ODE3OTk0MzUxRiwKKyAgICAwLjk4MTk0ODU4NjBGLCAwLjk4MjA5Njg2NTBGLCAwLjk4MjI0NDI3NTBGLCAwLjk4MjM5MDgxODZGLAorICAgIDAuOTgyNTM2NDk4OEYsIDAuOTgyNjgxMzE4NEYsIDAuOTgyODI1MjgwMUYsIDAuOTgyOTY4Mzg2OEYsCisgICAgMC45ODMxMTA2NDEzRiwgMC45ODMyNTIwNDYzRiwgMC45ODMzOTI2MDQ4RiwgMC45ODM1MzIzMTk1RiwKKyAgICAwLjk4MzY3MTE5MzJGLCAwLjk4MzgwOTIyODhGLCAwLjk4Mzk0NjQyOTFGLCAwLjk4NDA4Mjc5NjlGLAorICAgIDAuOTg0MjE4MzM1MUYsIDAuOTg0MzUzMDQ2NEYsIDAuOTg0NDg2OTMzN0YsIDAuOTg0NjE5OTk5OEYsCisgICAgMC45ODQ3NTIyNDc1RiwgMC45ODQ4ODM2Nzk4RiwgMC45ODUwMTQyOTkzRiwgMC45ODUxNDQxMDkwRiwKKyAgICAwLjk4NTI3MzExMTdGLCAwLjk4NTQwMTMxMDFGLCAwLjk4NTUyODcwNzNGLCAwLjk4NTY1NTMwNThGLAorICAgIDAuOTg1NzgxMTA4N0YsIDAuOTg1OTA2MTE4OEYsIDAuOTg2MDMwMzM4OEYsIDAuOTg2MTUzNzcxN0YsCisgICAgMC45ODYyNzY0MjAyRiwgMC45ODYzOTgyODcyRiwgMC45ODY1MTkzNzU2RiwgMC45ODY2Mzk2ODgyRiwKKyAgICAwLjk4Njc1OTIyNzdGLCAwLjk4Njg3Nzk5NzJGLCAwLjk4Njk5NTk5OTNGLCAwLjk4NzExMzIzNzBGLAorICAgIDAuOTg3MjI5NzEzMUYsIDAuOTg3MzQ1NDMwNEYsIDAuOTg3NDYwMzkxOEYsIDAuOTg3NTc0NjAwMUYsCisgICAgMC45ODc2ODgwNTgxRiwgMC45ODc4MDA3Njg4RiwgMC45ODc5MTI3MzQ4RiwgMC45ODgwMjM5NTkyRiwKKyAgICAwLjk4ODEzNDQ0NDdGLCAwLjk4ODI0NDE5NDFGLCAwLjk4ODM1MzIxMDRGLCAwLjk4ODQ2MTQ5NjJGLAorICAgIDAuOTg4NTY5MDU0NkYsIDAuOTg4Njc1ODg4M0YsIDAuOTg4NzgyMDAwMUYsIDAuOTg4ODg3MzkzMEYsCisgICAgMC45ODg5OTIwNjk3RiwgMC45ODkwOTYwMzMxRiwgMC45ODkxOTkyODU5RiwgMC45ODkzMDE4MzEyRiwKKyAgICAwLjk4OTQwMzY3MTZGLCAwLjk4OTUwNDgxMDBGLCAwLjk4OTYwNTI0OTNGLCAwLjk4OTcwNDk5MjNGLAorICAgIDAuOTg5ODA0MDQxOEYsIDAuOTg5OTAyNDAwNkYsIDAuOTkwMDAwMDcxN0YsIDAuOTkwMDk3MDU3N0YsCisgICAgMC45OTAxOTMzNjE2RiwgMC45OTAyODg5ODYyRiwgMC45OTAzODM5MzQzRiwgMC45OTA0NzgyMDg3RiwKKyAgICAwLjk5MDU3MTgxMjJGLCAwLjk5MDY2NDc0NzdGLCAwLjk5MDc1NzAxODBGLCAwLjk5MDg0ODYyNTlGLAorICAgIDAuOTkwOTM5NTc0MkYsIDAuOTkxMDI5ODY1OEYsIDAuOTkxMTE5NTAzNEYsIDAuOTkxMjA4NDg5OUYsCisgICAgMC45OTEyOTY4MjgxRiwgMC45OTEzODQ1MjA4RiwgMC45OTE0NzE1NzA4RiwgMC45OTE1NTc5ODEwRiwKKyAgICAwLjk5MTY0Mzc1NDBGLCAwLjk5MTcyODg5MjhGLCAwLjk5MTgxMzQwMDFGLCAwLjk5MTg5NzI3ODhGLAorICAgIDAuOTkxOTgwNTMxNkYsIDAuOTkyMDYzMTYxM0YsIDAuOTkyMTQ1MTcwN0YsIDAuOTkyMjI2NTYyNkYsCisgICAgMC45OTIzMDczMzk5RiwgMC45OTIzODc1MDUyRiwgMC45OTI0NjcwNjE1RiwgMC45OTI1NDYwMTE0RiwKKyAgICAwLjk5MjYyNDM1NzdGLCAwLjk5MjcwMjEwMzNGLCAwLjk5Mjc3OTI1MDhGLCAwLjk5Mjg1NTgwMzJGLAorICAgIDAuOTkyOTMxNzYzMUYsIDAuOTkzMDA3MTMzM0YsIDAuOTkzMDgxOTE2N0YsIDAuOTkzMTU2MTE1OEYsCisgICAgMC45OTMyMjk3MzM3RiwgMC45OTMzMDI3NzI4RiwgMC45OTMzNzUyMzYyRiwgMC45OTM0NDcxMjY0RiwKKyAgICAwLjk5MzUxODQ0NjJGLCAwLjk5MzU4OTE5ODVGLCAwLjk5MzY1OTM4NTlGLCAwLjk5MzcyOTAxMTJGLAorICAgIDAuOTkzNzk4MDc3MUYsIDAuOTkzODY2NTg2NEYsIDAuOTkzOTM0NTQxOEYsIDAuOTk0MDAxOTQ2MEYsCisgICAgMC45OTQwNjg4MDE4RiwgMC45OTQxMzUxMTE4RiwgMC45OTQyMDA4Nzg5RiwgMC45OTQyNjYxMDU3RiwKKyAgICAwLjk5NDMzMDc5NTBGLCAwLjk5NDM5NDk0OTRGLCAwLjk5NDQ1ODU3MTdGLCAwLjk5NDUyMTY2NDVGLAorICAgIDAuOTk0NTg0MjMwN0YsIDAuOTk0NjQ2MjcyOEYsIDAuOTk0NzA3NzkzNkYsIDAuOTk0NzY4Nzk1N0YsCisgICAgMC45OTQ4MjkyODIwRiwgMC45OTQ4ODkyNTUwRiwgMC45OTQ5NDg3MTc0RiwgMC45OTUwMDc2NzE5RiwKKyAgICAwLjk5NTA2NjEyMTJGLCAwLjk5NTEyNDA2NzlGLCAwLjk5NTE4MTUxNDhGLCAwLjk5NTIzODQ2NDVGLAorICAgIDAuOTk1Mjk0OTE5NkYsIDAuOTk1MzUwODgyOEYsIDAuOTk1NDA2MzU2OEYsIDAuOTk1NDYxMzQ0MkYsCisgICAgMC45OTU1MTU4NDc2RiwgMC45OTU1Njk4Njk3RiwgMC45OTU2MjM0MTMyRiwgMC45OTU2NzY0ODA2RiwKKyAgICAwLjk5NTcyOTA3NDZGLCAwLjk5NTc4MTE5NzhGLCAwLjk5NTgzMjg1MjhGLCAwLjk5NTg4NDA0MjNGLAorICAgIDAuOTk1OTM0NzY4OEYsIDAuOTk1OTg1MDM1MUYsIDAuOTk2MDM0ODQzNUYsIDAuOTk2MDg0MTk2OUYsCisgICAgMC45OTYxMzMwOTc3RiwgMC45OTYxODE1NDg2RiwgMC45OTYyMjk1NTIxRiwgMC45OTYyNzcxMTA4RiwKKyAgICAwLjk5NjMyNDIyNzRGLCAwLjk5NjM3MDkwNDNGLCAwLjk5NjQxNzE0NDFGLCAwLjk5NjQ2Mjk0OTRGLAorICAgIDAuOTk2NTA4MzIyOEYsIDAuOTk2NTUzMjY2OEYsIDAuOTk2NTk3Nzg0MEYsIDAuOTk2NjQxODc2OEYsCisgICAgMC45OTY2ODU1NDc5RiwgMC45OTY3Mjg3OTk4RiwgMC45OTY3NzE2MzUwRiwgMC45OTY4MTQwNTU5RiwKKyAgICAwLjk5Njg1NjA2NTNGLCAwLjk5Njg5NzY2NTVGLCAwLjk5NjkzODg1OTFGLCAwLjk5Njk3OTY0ODVGLAorICAgIDAuOTk3MDIwMDM2M0YsIDAuOTk3MDYwMDI1MEYsIDAuOTk3MDk5NjE3MEYsIDAuOTk3MTM4ODE0OUYsCisgICAgMC45OTcxNzc2MjExRiwgMC45OTcyMTYwMzgwRiwgMC45OTcyNTQwNjgzRiwgMC45OTcyOTE3MTQyRiwKKyAgICAwLjk5NzMyODk3ODNGLCAwLjk5NzM2NTg2MzFGLCAwLjk5NzQwMjM3MDlGLCAwLjk5NzQzODUwNDJGLAorICAgIDAuOTk3NDc0MjY1NUYsIDAuOTk3NTA5NjU3MUYsIDAuOTk3NTQ0NjgxNkYsIDAuOTk3NTc5MzQxM0YsCisgICAgMC45OTc2MTM2Mzg2RiwgMC45OTc2NDc1NzU5RiwgMC45OTc2ODExNTU3RiwgMC45OTc3MTQzODAzRiwKKyAgICAwLjk5Nzc0NzI1MjFGLCAwLjk5Nzc3OTc3MzZGLCAwLjk5NzgxMTk0NzBGLCAwLjk5Nzg0Mzc3NDhGLAorICAgIDAuOTk3ODc1MjU5M0YsIDAuOTk3OTA2NDAyOUYsIDAuOTk3OTM3MjA3OUYsIDAuOTk3OTY3Njc2OEYsCisgICAgMC45OTc5OTc4MTE3RiwgMC45OTgwMjc2MTUxRiwgMC45OTgwNTcwODkzRiwgMC45OTgwODYyMzY3RiwKKyAgICAwLjk5ODExNTA1OTVGLCAwLjk5ODE0MzU2MDBGLCAwLjk5ODE3MTc0MDZGLCAwLjk5ODE5OTYwMzVGLAorICAgIDAuOTk4MjI3MTUxMUYsIDAuOTk4MjU0Mzg1NkYsIDAuOTk4MjgxMzA5M0YsIDAuOTk4MzA3OTI0NkYsCisgICAgMC45OTgzMzQyMzM2RiwgMC45OTgzNjAyMzg2RiwgMC45OTgzODU5NDE4RiwgMC45OTg0MTEzNDU2RiwKKyAgICAwLjk5ODQzNjQ1MjJGLCAwLjk5ODQ2MTI2MzhGLCAwLjk5ODQ4NTc4MjVGLCAwLjk5ODUxMDAxMDhGLAorICAgIDAuOTk4NTMzOTUwN0YsIDAuOTk4NTU3NjA0NEYsIDAuOTk4NTgwOTc0M0YsIDAuOTk4NjA0MDYyNEYsCisgICAgMC45OTg2MjY4NzEwRiwgMC45OTg2NDk0MDIyRiwgMC45OTg2NzE2NTgzRiwgMC45OTg2OTM2NDEzRiwKKyAgICAwLjk5ODcxNTM1MzVGLCAwLjk5ODczNjc5NjlGLCAwLjk5ODc1Nzk3MzhGLCAwLjk5ODc3ODg4NjRGLAorICAgIDAuOTk4Nzk5NTM2NkYsIDAuOTk4ODE5OTI2N0YsIDAuOTk4ODQwMDU4N0YsIDAuOTk4ODU5OTM0OEYsCisgICAgMC45OTg4Nzk1NTcyRiwgMC45OTg4OTg5Mjc4RiwgMC45OTg5MTgwNDg3RiwgMC45OTg5MzY5MjIyRiwKKyAgICAwLjk5ODk1NTU1MDFGLCAwLjk5ODk3MzkzNDdGLCAwLjk5ODk5MjA3ODBGLCAwLjk5OTAwOTk4MjBGLAorICAgIDAuOTk5MDI3NjQ4N0YsIDAuOTk5MDQ1MDgwM0YsIDAuOTk5MDYyMjc4N0YsIDAuOTk5MDc5MjQ2MEYsCisgICAgMC45OTkwOTU5ODQxRiwgMC45OTkxMTI0OTUyRiwgMC45OTkxMjg3ODEyRiwgMC45OTkxNDQ4NDQwRiwKKyAgICAwLjk5OTE2MDY4NThGLCAwLjk5OTE3NjMwODRGLCAwLjk5OTE5MTcxMzlGLCAwLjk5OTIwNjkwNDJGLAorICAgIDAuOTk5MjIxODgxM0YsIDAuOTk5MjM2NjQ3MUYsIDAuOTk5MjUxMjAzNUYsIDAuOTk5MjY1NTUyNUYsCisgICAgMC45OTkyNzk2OTYxRiwgMC45OTkyOTM2MzYxRiwgMC45OTkzMDczNzQ0RiwgMC45OTkzMjA5MTMxRiwKKyAgICAwLjk5OTMzNDI1MzhGLCAwLjk5OTM0NzM5ODdGLCAwLjk5OTM2MDM0OTRGLCAwLjk5OTM3MzEwODBGLAorICAgIDAuOTk5Mzg1Njc2MkYsIDAuOTk5Mzk4MDU1OUYsIDAuOTk5NDEwMjQ5MEYsIDAuOTk5NDIyMjU3M0YsCisgICAgMC45OTk0MzQwODI3RiwgMC45OTk0NDU3MjY5RiwgMC45OTk0NTcxOTE4RiwgMC45OTk0Njg0NzkzRiwKKyAgICAwLjk5OTQ3OTU5MTBGLCAwLjk5OTQ5MDUyODhGLCAwLjk5OTUwMTI5NDVGLCAwLjk5OTUxMTg4OThGLAorICAgIDAuOTk5NTIyMzE2NUYsIDAuOTk5NTMyNTc2NUYsIDAuOTk5NTQyNjcxM0YsIDAuOTk5NTUyNjAyOUYsCisgICAgMC45OTk1NjIzNzI4RiwgMC45OTk1NzE5ODI5RiwgMC45OTk1ODE0MzQ5RiwgMC45OTk1OTA3MzA0RiwKKyAgICAwLjk5OTU5OTg3MTJGLCAwLjk5OTYwODg1OTBGLCAwLjk5OTYxNzY5NTRGLCAwLjk5OTYyNjM4MjFGLAorICAgIDAuOTk5NjM0OTIwOEYsIDAuOTk5NjQzMzEzMkYsIDAuOTk5NjUxNTYwOUYsIDAuOTk5NjU5NjY1NkYsCisgICAgMC45OTk2Njc2Mjg4RiwgMC45OTk2NzU0NTIyRiwgMC45OTk2ODMxMzc1RiwgMC45OTk2OTA2ODYyRiwKKyAgICAwLjk5OTY5ODEwMDBGLCAwLjk5OTcwNTM4MDRGLCAwLjk5OTcxMjUyOTBGLCAwLjk5OTcxOTU0NzRGLAorICAgIDAuOTk5NzI2NDM3MUYsIDAuOTk5NzMzMTk5OEYsIDAuOTk5NzM5ODM2OUYsIDAuOTk5NzQ2MzUwMEYsCisgICAgMC45OTk3NTI3NDA2RiwgMC45OTk3NTkwMTAzRiwgMC45OTk3NjUxNjA2RiwgMC45OTk3NzExOTMwRiwKKyAgICAwLjk5OTc3NzEwODlGLCAwLjk5OTc4MjkwOThGLCAwLjk5OTc4ODU5NzNGLCAwLjk5OTc5NDE3MjhGLAorICAgIDAuOTk5Nzk5NjM3OEYsIDAuOTk5ODA0OTkzNkYsIDAuOTk5ODEwMjQxOUYsIDAuOTk5ODE1MzgzOUYsCisgICAgMC45OTk4MjA0MjExRiwgMC45OTk4MjUzNTUwRiwgMC45OTk4MzAxODY4RiwgMC45OTk4MzQ5MTgyRiwKKyAgICAwLjk5OTgzOTU1MDNGLCAwLjk5OTg0NDA4NDdGLCAwLjk5OTg0ODUyMjZGLCAwLjk5OTg1Mjg2NTRGLAorICAgIDAuOTk5ODU3MTE0NkYsIDAuOTk5ODYxMjcxM0YsIDAuOTk5ODY1MzM3MEYsIDAuOTk5ODY5MzEzMEYsCisgICAgMC45OTk4NzMyMDA3RiwgMC45OTk4NzcwMDEyRiwgMC45OTk4ODA3MTU5RiwgMC45OTk4ODQzNDYxRiwKKyAgICAwLjk5OTg4Nzg5MzFGLCAwLjk5OTg5MTM1ODFGLCAwLjk5OTg5NDc0MjRGLCAwLjk5OTg5ODA0NzNGLAorICAgIDAuOTk5OTAxMjc0MEYsIDAuOTk5OTA0NDIzN0YsIDAuOTk5OTA3NDk3NkYsIDAuOTk5OTEwNDk3MUYsCisgICAgMC45OTk5MTM0MjMxRiwgMC45OTk5MTYyNzcxRiwgMC45OTk5MTkwNjAxRiwgMC45OTk5MjE3NzMzRiwKKyAgICAwLjk5OTkyNDQxNzlGLCAwLjk5OTkyNjk5NTBGLCAwLjk5OTkyOTUwNThGLCAwLjk5OTkzMTk1MTVGLAorICAgIDAuOTk5OTM0MzMzMkYsIDAuOTk5OTM2NjUxOUYsIDAuOTk5OTM4OTA4OEYsIDAuOTk5OTQxMTA1MEYsCisgICAgMC45OTk5NDMyNDE2RiwgMC45OTk5NDUzMTk2RiwgMC45OTk5NDczNDAyRiwgMC45OTk5NDkzMDQ0RiwKKyAgICAwLjk5OTk1MTIxMzJGLCAwLjk5OTk1MzA2NzdGLCAwLjk5OTk1NDg2OTBGLCAwLjk5OTk1NjYxODBGLAorICAgIDAuOTk5OTU4MzE1N0YsIDAuOTk5OTU5OTYzM0YsIDAuOTk5OTYxNTYxNkYsIDAuOTk5OTYzMTExNkYsCisgICAgMC45OTk5NjQ2MTQ0RiwgMC45OTk5NjYwNzA5RiwgMC45OTk5Njc0ODIwRiwgMC45OTk5Njg4NDg3RiwKKyAgICAwLjk5OTk3MDE3MTlGLCAwLjk5OTk3MTQ1MjZGLCAwLjk5OTk3MjY5MTdGLCAwLjk5OTk3Mzg5MDBGLAorICAgIDAuOTk5OTc1MDQ4NkYsIDAuOTk5OTc2MTY4MkYsIDAuOTk5OTc3MjQ5N0YsIDAuOTk5OTc4Mjk0MUYsCisgICAgMC45OTk5NzkzMDIxRiwgMC45OTk5ODAyNzQ3RiwgMC45OTk5ODEyMTI2RiwgMC45OTk5ODIxMTY3RiwKKyAgICAwLjk5OTk4Mjk4NzhGLCAwLjk5OTk4MzgyNjhGLCAwLjk5OTk4NDYzNDNGLCAwLjk5OTk4NTQxMTNGLAorICAgIDAuOTk5OTg2MTU4NEYsIDAuOTk5OTg2ODc2NUYsIDAuOTk5OTg3NTY2NEYsIDAuOTk5OTg4MjI4N0YsCisgICAgMC45OTk5ODg4NjQyRiwgMC45OTk5ODk0NzM2RiwgMC45OTk5OTAwNTc3RiwgMC45OTk5OTA2MTcyRiwKKyAgICAwLjk5OTk5MTE1MjhGLCAwLjk5OTk5MTY2NTFGLCAwLjk5OTk5MjE1NDhGLCAwLjk5OTk5MjYyMjdGLAorICAgIDAuOTk5OTkzMDY5M0YsIDAuOTk5OTkzNDk1NEYsIDAuOTk5OTkzOTAxNUYsIDAuOTk5OTk0Mjg4M0YsCisgICAgMC45OTk5OTQ2NTY0RiwgMC45OTk5OTUwMDY0RiwgMC45OTk5OTUzMzkwRiwgMC45OTk5OTU2NTQ3RiwKKyAgICAwLjk5OTk5NTk1NDFGLCAwLjk5OTk5NjIzNzdGLCAwLjk5OTk5NjUwNjJGLCAwLjk5OTk5Njc2MDFGLAorICAgIDAuOTk5OTk2OTk5OEYsIDAuOTk5OTk3MjI2MEYsIDAuOTk5OTk3NDM5MkYsIDAuOTk5OTk3NjM5OUYsCisgICAgMC45OTk5OTc4Mjg1RiwgMC45OTk5OTgwMDU2RiwgMC45OTk5OTgxNzE2RiwgMC45OTk5OTgzMjcxRiwKKyAgICAwLjk5OTk5ODQ3MjRGLCAwLjk5OTk5ODYwODFGLCAwLjk5OTk5ODczNDVGLCAwLjk5OTk5ODg1MjFGLAorICAgIDAuOTk5OTk4OTYxM0YsIDAuOTk5OTk5MDYyNUYsIDAuOTk5OTk5MTU2MkYsIDAuOTk5OTk5MjQyNkYsCisgICAgMC45OTk5OTkzMjIzRiwgMC45OTk5OTkzOTU0RiwgMC45OTk5OTk0NjI1RiwgMC45OTk5OTk1MjM5RiwKKyAgICAwLjk5OTk5OTU3OThGLCAwLjk5OTk5OTYzMDdGLCAwLjk5OTk5OTY3NjhGLCAwLjk5OTk5OTcxODRGLAorICAgIDAuOTk5OTk5NzU1OUYsIDAuOTk5OTk5Nzg5NUYsIDAuOTk5OTk5ODE5NUYsIDAuOTk5OTk5ODQ2MkYsCisgICAgMC45OTk5OTk4Njk4RiwgMC45OTk5OTk4OTA2RiwgMC45OTk5OTk5MDg4RiwgMC45OTk5OTk5MjQ2RiwKKyAgICAwLjk5OTk5OTkzODNGLCAwLjk5OTk5OTk1MDBGLCAwLjk5OTk5OTk2MDBGLCAwLjk5OTk5OTk2ODRGLAorICAgIDAuOTk5OTk5OTc1NEYsIDAuOTk5OTk5OTgxMUYsIDAuOTk5OTk5OTg1OEYsIDAuOTk5OTk5OTg5NkYsCisgICAgMC45OTk5OTk5OTI1RiwgMC45OTk5OTk5OTQ4RiwgMC45OTk5OTk5OTY1RiwgMC45OTk5OTk5OTc4RiwKKyAgICAwLjk5OTk5OTk5ODZGLCAwLjk5OTk5OTk5OTJGLCAwLjk5OTk5OTk5OTZGLCAwLjk5OTk5OTk5OThGLAorICAgIDAuOTk5OTk5OTk5OUYsIDEuMDAwMDAwMDAwMEYsIDEuMDAwMDAwMDAwMEYsIDEuMDAwMDAwMDAwMEYsCit9OworCitERUNMQVJFX0FMSUdORUQoMTYsIHN0YXRpYyBjb25zdCBmbG9hdCwgdndpbjgxOTIpWzQwOTZdID0geworICAgIDAuMDAwMDAwMDU3OEYsIDAuMDAwMDAwNTE5OEYsIDAuMDAwMDAxNDQzOEYsIDAuMDAwMDAyODI5OUYsCisgICAgMC4wMDAwMDQ2NzgwRiwgMC4wMDAwMDY5ODgyRiwgMC4wMDAwMDk3NjA0RiwgMC4wMDAwMTI5OTQ1RiwKKyAgICAwLjAwMDAxNjY5MDhGLCAwLjAwMDAyMDg0OTBGLCAwLjAwMDAyNTQ2OTJGLCAwLjAwMDAzMDU1MTVGLAorICAgIDAuMDAwMDM2MDk1OEYsIDAuMDAwMDQyMTAyMUYsIDAuMDAwMDQ4NTcwNEYsIDAuMDAwMDU1NTAwNkYsCisgICAgMC4wMDAwNjI4OTI5RiwgMC4wMDAwNzA3NDcyRiwgMC4wMDAwNzkwNjM1RiwgMC4wMDAwODc4NDE3RiwKKyAgICAwLjAwMDA5NzA4MjBGLCAwLjAwMDEwNjc4NDJGLCAwLjAwMDExNjk0ODNGLCAwLjAwMDEyNzU3NDRGLAorICAgIDAuMDAwMTM4NjYyNUYsIDAuMDAwMTUwMjEyNkYsIDAuMDAwMTYyMjI0NUYsIDAuMDAwMTc0Njk4NEYsCisgICAgMC4wMDAxODc2MzQzRiwgMC4wMDAyMDEwMzIwRiwgMC4wMDAyMTQ4OTE3RiwgMC4wMDAyMjkyMTMyRiwKKyAgICAwLjAwMDI0Mzk5NjdGLCAwLjAwMDI1OTI0MjFGLCAwLjAwMDI3NDk0OTNGLCAwLjAwMDI5MTExODRGLAorICAgIDAuMDAwMzA3NzQ5M0YsIDAuMDAwMzI0ODQyMUYsIDAuMDAwMzQyMzk2N0YsIDAuMDAwMzYwNDEzMkYsCisgICAgMC4wMDAzNzg4OTE1RiwgMC4wMDAzOTc4MzE2RiwgMC4wMDA0MTcyMzM1RiwgMC4wMDA0MzcwOTcxRiwKKyAgICAwLjAwMDQ1NzQyMjZGLCAwLjAwMDQ3ODIwOThGLCAwLjAwMDQ5OTQ1ODdGLCAwLjAwMDUyMTE2OTRGLAorICAgIDAuMDAwNTQzMzQxOEYsIDAuMDAwNTY1OTc1OUYsIDAuMDAwNTg5MDcxN0YsIDAuMDAwNjEyNjI5MkYsCisgICAgMC4wMDA2MzY2NDg0RiwgMC4wMDA2NjExMjkyRiwgMC4wMDA2ODYwNzE2RiwgMC4wMDA3MTE0NzU3RiwKKyAgICAwLjAwMDczNzM0MTRGLCAwLjAwMDc2MzY2ODdGLCAwLjAwMDc5MDQ1NzZGLCAwLjAwMDgxNzcwODBGLAorICAgIDAuMDAwODQ1NDIwMEYsIDAuMDAwODczNTkzNUYsIDAuMDAwOTAyMjI4NUYsIDAuMDAwOTMxMzI1MEYsCisgICAgMC4wMDA5NjA4ODMwRiwgMC4wMDA5OTA5MDI1RiwgMC4wMDEwMjEzODM0RiwgMC4wMDEwNTIzMjU3RiwKKyAgICAwLjAwMTA4MzcyOTVGLCAwLjAwMTExNTU5NDZGLCAwLjAwMTE0NzkyMTFGLCAwLjAwMTE4MDcwOTBGLAorICAgIDAuMDAxMjEzOTU4MkYsIDAuMDAxMjQ3NjY4N0YsIDAuMDAxMjgxODQwNUYsIDAuMDAxMzE2NDczNkYsCisgICAgMC4wMDEzNTE1Njc5RiwgMC4wMDEzODcxMjM1RiwgMC4wMDE0MjMxNDAyRiwgMC4wMDE0NTk2MTgyRiwKKyAgICAwLjAwMTQ5NjU1NzNGLCAwLjAwMTUzMzk1NzZGLCAwLjAwMTU3MTgxOTBGLCAwLjAwMTYxMDE0MTVGLAorICAgIDAuMDAxNjQ4OTI1MUYsIDAuMDAxNjg4MTY5OEYsIDAuMDAxNzI3ODc1NEYsIDAuMDAxNzY4MDQyMUYsCisgICAgMC4wMDE4MDg2Njk4RiwgMC4wMDE4NDk3NTg0RiwgMC4wMDE4OTEzMDgwRiwgMC4wMDE5MzMzMTg1RiwKKyAgICAwLjAwMTk3NTc4OThGLCAwLjAwMjAxODcyMjFGLCAwLjAwMjA2MjExNTFGLCAwLjAwMjEwNTk2OTBGLAorICAgIDAuMDAyMTUwMjgzN0YsIDAuMDAyMTk1MDU5MUYsIDAuMDAyMjQwMjk1M0YsIDAuMDAyMjg1OTkyMUYsCisgICAgMC4wMDIzMzIxNDk3RiwgMC4wMDIzNzg3Njc5RiwgMC4wMDI0MjU4NDY3RiwgMC4wMDI0NzMzODYxRiwKKyAgICAwLjAwMjUyMTM4NjFGLCAwLjAwMjU2OTg0NjZGLCAwLjAwMjYxODc2NzZGLCAwLjAwMjY2ODE0OTFGLAorICAgIDAuMDAyNzE3OTkxMUYsIDAuMDAyNzY4MjkzNUYsIDAuMDAyODE5MDU2MkYsIDAuMDAyODcwMjc5NEYsCisgICAgMC4wMDI5MjE5NjI4RiwgMC4wMDI5NzQxMDY2RiwgMC4wMDMwMjY3MTA3RiwgMC4wMDMwNzk3NzQ5RiwKKyAgICAwLjAwMzEzMzI5OTRGLCAwLjAwMzE4NzI4NDFGLCAwLjAwMzI0MTcyODlGLCAwLjAwMzI5NjYzMzhGLAorICAgIDAuMDAzMzUxOTk4OEYsIDAuMDAzNDA3ODIzOEYsIDAuMDAzNDY0MTA4OUYsIDAuMDAzNTIwODUzOUYsCisgICAgMC4wMDM1NzgwNTg5RiwgMC4wMDM2MzU3MjM3RiwgMC4wMDM2OTM4NDg1RiwgMC4wMDM3NTI0MzMxRiwKKyAgICAwLjAwMzgxMTQ3NzVGLCAwLjAwMzg3MDk4MTdGLCAwLjAwMzkzMDk0NTZGLCAwLjAwMzk5MTM2OTJGLAorICAgIDAuMDA0MDUyMjUyNEYsIDAuMDA0MTEzNTk1M0YsIDAuMDA0MTc1Mzk3OEYsIDAuMDA0MjM3NjU5OUYsCisgICAgMC4wMDQzMDAzODE0RiwgMC4wMDQzNjM1NjI0RiwgMC4wMDQ0MjcyMDI5RiwgMC4wMDQ0OTEzMDI4RiwKKyAgICAwLjAwNDU1NTg2MjBGLCAwLjAwNDYyMDg4MDZGLCAwLjAwNDY4NjM1ODVGLCAwLjAwNDc1MjI5NTVGLAorICAgIDAuMDA0ODE4NjkxOUYsIDAuMDA0ODg1NTQ3M0YsIDAuMDA0OTUyODYxOUYsIDAuMDA1MDIwNjM1NkYsCisgICAgMC4wMDUwODg4Njg0RiwgMC4wMDUxNTc1NjAxRiwgMC4wMDUyMjY3MTA4RiwgMC4wMDUyOTYzMjA0RiwKKyAgICAwLjAwNTM2NjM4OTBGLCAwLjAwNTQzNjkxNjNGLCAwLjAwNTUwNzkwMjVGLCAwLjAwNTU3OTM0NzRGLAorICAgIDAuMDA1NjUxMjUxMEYsIDAuMDA1NzIzNjEzM0YsIDAuMDA1Nzk2NDM0MkYsIDAuMDA1ODY5NzEzN0YsCisgICAgMC4wMDU5NDM0NTE3RiwgMC4wMDYwMTc2NDgyRiwgMC4wMDYwOTIzMDMyRiwgMC4wMDYxNjc0MTY2RiwKKyAgICAwLjAwNjI0Mjk4ODNGLCAwLjAwNjMxOTAxODNGLCAwLjAwNjM5NTUwNjZGLCAwLjAwNjQ3MjQ1MzJGLAorICAgIDAuMDA2NTQ5ODU3OUYsIDAuMDA2NjI3NzIwN0YsIDAuMDA2NzA2MDQxNkYsIDAuMDA2Nzg0ODIwNUYsCisgICAgMC4wMDY4NjQwNTc1RiwgMC4wMDY5NDM3NTIzRiwgMC4wMDcwMjM5MDUxRiwgMC4wMDcxMDQ1MTU3RiwKKyAgICAwLjAwNzE4NTU4NDBGLCAwLjAwNzI2NzExMDJGLCAwLjAwNzM0OTA5NDBGLCAwLjAwNzQzMTUzNTVGLAorICAgIDAuMDA3NTE0NDM0NUYsIDAuMDA3NTk3NzkxMUYsIDAuMDA3NjgxNjA1MkYsIDAuMDA3NzY1ODc2OEYsCisgICAgMC4wMDc4NTA2MDU3RiwgMC4wMDc5MzU3OTIwRiwgMC4wMDgwMjE0MzU1RiwgMC4wMDgxMDc1MzYzRiwKKyAgICAwLjAwODE5NDA5NDNGLCAwLjAwODI4MTEwOTRGLCAwLjAwODM2ODU4MTZGLCAwLjAwODQ1NjUxMDhGLAorICAgIDAuMDA4NTQ0ODk3MEYsIDAuMDA4NjMzNzQwMUYsIDAuMDA4NzIzMDQwMUYsIDAuMDA4ODEyNzk2OUYsCisgICAgMC4wMDg5MDMwMTA0RiwgMC4wMDg5OTM2ODA3RiwgMC4wMDkwODQ4MDc2RiwgMC4wMDkxNzYzOTExRiwKKyAgICAwLjAwOTI2ODQzMTFGLCAwLjAwOTM2MDkyNzZGLCAwLjAwOTQ1Mzg4MDVGLCAwLjAwOTU0NzI4OThGLAorICAgIDAuMDA5NjQxMTU1NEYsIDAuMDA5NzM1NDc3MkYsIDAuMDA5ODMwMjU1MkYsIDAuMDA5OTI1NDg5NEYsCisgICAgMC4wMTAwMjExNzk2RiwgMC4wMTAxMTczMjU5RiwgMC4wMTAyMTM5MjgxRiwgMC4wMTAzMTA5ODYzRiwKKyAgICAwLjAxMDQwODUwMDJGLCAwLjAxMDUwNjQ3MDBGLCAwLjAxMDYwNDg5NTVGLCAwLjAxMDcwMzc3NjZGLAorICAgIDAuMDEwODAzMTEzM0YsIDAuMDEwOTAyOTA1NkYsIDAuMDExMDAzMTUzNEYsIDAuMDExMTAzODU2NUYsCisgICAgMC4wMTEyMDUwMTUxRiwgMC4wMTEzMDY2Mjg5RiwgMC4wMTE0MDg2OTgwRiwgMC4wMTE1MTEyMjIyRiwKKyAgICAwLjAxMTYxNDIwMTVGLCAwLjAxMTcxNzYzNTlGLCAwLjAxMTgyMTUyNTJGLCAwLjAxMTkyNTg2OTVGLAorICAgIDAuMDEyMDMwNjY4NkYsIDAuMDEyMTM1OTIyNUYsIDAuMDEyMjQxNjMxMkYsIDAuMDEyMzQ3Nzk0NEYsCisgICAgMC4wMTI0NTQ0MTIzRiwgMC4wMTI1NjE0ODQ3RiwgMC4wMTI2NjkwMTE2RiwgMC4wMTI3NzY5OTI4RiwKKyAgICAwLjAxMjg4NTQyODRGLCAwLjAxMjk5NDMxODJGLCAwLjAxMzEwMzY2MjNGLCAwLjAxMzIxMzQ2MDRGLAorICAgIDAuMDEzMzIzNzEyNkYsIDAuMDEzNDM0NDE4OEYsIDAuMDEzNTQ1NTc5MEYsIDAuMDEzNjU3MTkyOUYsCisgICAgMC4wMTM3NjkyNjA3RiwgMC4wMTM4ODE3ODIxRiwgMC4wMTM5OTQ3NTcyRiwgMC4wMTQxMDgxODU5RiwKKyAgICAwLjAxNDIyMjA2ODFGLCAwLjAxNDMzNjQwMzdGLCAwLjAxNDQ1MTE5MjdGLCAwLjAxNDU2NjQzNTBGLAorICAgIDAuMDE0NjgyMTMwNEYsIDAuMDE0Nzk4Mjc5MUYsIDAuMDE0OTE0ODgwOEYsIDAuMDE1MDMxOTM1NUYsCisgICAgMC4wMTUxNDk0NDMxRiwgMC4wMTUyNjc0MDM2RiwgMC4wMTUzODU4MTY4RiwgMC4wMTU1MDQ2ODI4RiwKKyAgICAwLjAxNTYyNDAwMTRGLCAwLjAxNTc0Mzc3MjZGLCAwLjAxNTg2Mzk5NjJGLCAwLjAxNTk4NDY3MjNGLAorICAgIDAuMDE2MTA1ODAwN0YsIDAuMDE2MjI3MzgxNEYsIDAuMDE2MzQ5NDE0MkYsIDAuMDE2NDcxODk5MUYsCisgICAgMC4wMTY1OTQ4MzYxRiwgMC4wMTY3MTgyMjUwRiwgMC4wMTY4NDIwNjU4RiwgMC4wMTY5NjYzNTg0RiwKKyAgICAwLjAxNzA5MTEwMjdGLCAwLjAxNzIxNjI5ODdGLCAwLjAxNzM0MTk0NjJGLCAwLjAxNzQ2ODA0NTJGLAorICAgIDAuMDE3NTk0NTk1NkYsIDAuMDE3NzIxNTk3NEYsIDAuMDE3ODQ5MDUwNEYsIDAuMDE3OTc2OTU0NUYsCisgICAgMC4wMTgxMDUzMDk4RiwgMC4wMTgyMzQxMTYwRiwgMC4wMTgzNjMzNzMyRiwgMC4wMTg0OTMwODEyRiwKKyAgICAwLjAxODYyMzIzOTlGLCAwLjAxODc1Mzg0OTRGLCAwLjAxODg4NDkwOTRGLCAwLjAxOTAxNjQyMDBGLAorICAgIDAuMDE5MTQ4MzgwOUYsIDAuMDE5MjgwNzkyM0YsIDAuMDE5NDEzNjUzOUYsIDAuMDE5NTQ2OTY1NkYsCisgICAgMC4wMTk2ODA3Mjc1RiwgMC4wMTk4MTQ5Mzk0RiwgMC4wMTk5NDk2MDEyRiwgMC4wMjAwODQ3MTI4RiwKKyAgICAwLjAyMDIyMDI3NDJGLCAwLjAyMDM1NjI4NTNGLCAwLjAyMDQ5Mjc0NjBGLCAwLjAyMDYyOTY1NjFGLAorICAgIDAuMDIwNzY3MDE1N0YsIDAuMDIwOTA0ODI0NUYsIDAuMDIxMDQzMDgyNkYsIDAuMDIxMTgxNzg5OUYsCisgICAgMC4wMjEzMjA5NDYyRiwgMC4wMjE0NjA1NTE1RiwgMC4wMjE2MDA2MDU3RiwgMC4wMjE3NDExMDg2RiwKKyAgICAwLjAyMTg4MjA2MDNGLCAwLjAyMjAyMzQ2MDVGLCAwLjAyMjE2NTMwOTNGLCAwLjAyMjMwNzYwNjZGLAorICAgIDAuMDIyNDUwMzUyMUYsIDAuMDIyNTkzNTQ1OUYsIDAuMDIyNzM3MTg3OUYsIDAuMDIyODgxMjc3OUYsCisgICAgMC4wMjMwMjU4MTYwRiwgMC4wMjMxNzA4MDE4RiwgMC4wMjMzMTYyMzU1RiwgMC4wMjM0NjIxMTY5RiwKKyAgICAwLjAyMzYwODQ0NTlGLCAwLjAyMzc1NTIyMjRGLCAwLjAyMzkwMjQ0NjJGLCAwLjAyNDA1MDExNzVGLAorICAgIDAuMDI0MTk4MjM1OUYsIDAuMDI0MzQ2ODAxNUYsIDAuMDI0NDk1ODE0MUYsIDAuMDI0NjQ1MjczNkYsCisgICAgMC4wMjQ3OTUxODAwRiwgMC4wMjQ5NDU1MzMxRiwgMC4wMjUwOTYzMzI5RiwgMC4wMjUyNDc1NzkyRiwKKyAgICAwLjAyNTM5OTI3MjBGLCAwLjAyNTU1MTQxMTFGLCAwLjAyNTcwMzk5NjVGLCAwLjAyNTg1NzAyODFGLAorICAgIDAuMDI2MDEwNTA1N0YsIDAuMDI2MTY0NDI5M0YsIDAuMDI2MzE4Nzk4N0YsIDAuMDI2NDczNjEzOUYsCisgICAgMC4wMjY2Mjg4NzQ3RiwgMC4wMjY3ODQ1ODExRiwgMC4wMjY5NDA3MzMwRiwgMC4wMjcwOTczMzAyRiwKKyAgICAwLjAyNzI1NDM3MjdGLCAwLjAyNzQxMTg2MDRGLCAwLjAyNzU2OTc5MzBGLCAwLjAyNzcyODE3MDdGLAorICAgIDAuMDI3ODg2OTkzMkYsIDAuMDI4MDQ2MjYwNEYsIDAuMDI4MjA1OTcyM0YsIDAuMDI4MzY2MTI4N0YsCisgICAgMC4wMjg1MjY3Mjk1RiwgMC4wMjg2ODc3NzQ3RiwgMC4wMjg4NDkyNjQxRiwgMC4wMjkwMTExOTc2RiwKKyAgICAwLjAyOTE3MzU3NTFGLCAwLjAyOTMzNjM5NjVGLCAwLjAyOTQ5OTY2MTdGLCAwLjAyOTY2MzM3MDZGLAorICAgIDAuMDI5ODI3NTIzMUYsIDAuMDI5OTkyMTE5MEYsIDAuMDMwMTU3MTU4M0YsIDAuMDMwMzIyNjQwOUYsCisgICAgMC4wMzA0ODg1NjY3RiwgMC4wMzA2NTQ5MzU0RiwgMC4wMzA4MjE3NDcyRiwgMC4wMzA5ODkwMDE3RiwKKyAgICAwLjAzMTE1NjY5ODlGLCAwLjAzMTMyNDgzODhGLCAwLjAzMTQ5MzQyMTFGLCAwLjAzMTY2MjQ0NTlGLAorICAgIDAuMDMxODMxOTEyOEYsIDAuMDMyMDAxODIyMEYsIDAuMDMyMTcyMTczMkYsIDAuMDMyMzQyOTY2M0YsCisgICAgMC4wMzI1MTQyMDEzRiwgMC4wMzI2ODU4Nzc5RiwgMC4wMzI4NTc5OTYyRiwgMC4wMzMwMzA1NTU5RiwKKyAgICAwLjAzMzIwMzU1NzBGLCAwLjAzMzM3Njk5OTRGLCAwLjAzMzU1MDg4MjlGLCAwLjAzMzcyNTIwNzRGLAorICAgIDAuMDMzODk5OTcyOEYsIDAuMDM0MDc1MTc5MEYsIDAuMDM0MjUwODI1OUYsIDAuMDM0NDI2OTEzNEYsCisgICAgMC4wMzQ2MDM0NDEyRiwgMC4wMzQ3ODA0MDk0RiwgMC4wMzQ5NTc4MTc4RiwgMC4wMzUxMzU2NjYzRiwKKyAgICAwLjAzNTMxMzk1NDhGLCAwLjAzNTQ5MjY4MzFGLCAwLjAzNTY3MTg1MTFGLCAwLjAzNTg1MTQ1ODhGLAorICAgIDAuMDM2MDMxNTA1OUYsIDAuMDM2MjExOTkyNEYsIDAuMDM2MzkyOTE4MkYsIDAuMDM2NTc0MjgzMUYsCisgICAgMC4wMzY3NTYwODcwRiwgMC4wMzY5MzgzMjk3RiwgMC4wMzcxMjEwMTEzRiwgMC4wMzczMDQxMzE1RiwKKyAgICAwLjAzNzQ4NzY5MDJGLCAwLjAzNzY3MTY4NzNGLCAwLjAzNzg1NjEyMjZGLCAwLjAzODA0MDk5NjFGLAorICAgIDAuMDM4MjI2MzA3N0YsIDAuMDM4NDEyMDU3MUYsIDAuMDM4NTk4MjQ0M0YsIDAuMDM4Nzg0ODY5MUYsCisgICAgMC4wMzg5NzE5MzE1RiwgMC4wMzkxNTk0MzEzRiwgMC4wMzkzNDczNjgzRiwgMC4wMzk1MzU3NDI1RiwKKyAgICAwLjAzOTcyNDU1MzdGLCAwLjAzOTkxMzgwMTdGLCAwLjA0MDEwMzQ4NjZGLCAwLjA0MDI5MzYwODBGLAorICAgIDAuMDQwNDg0MTY2MEYsIDAuMDQwNjc1MTYwM0YsIDAuMDQwODY2NTkwOUYsIDAuMDQxMDU4NDU3NkYsCisgICAgMC4wNDEyNTA3NjAzRiwgMC4wNDE0NDM0OTg4RiwgMC4wNDE2MzY2NzMxRiwgMC4wNDE4MzAyODI5RiwKKyAgICAwLjA0MjAyNDMyODJGLCAwLjA0MjIxODgwODhGLCAwLjA0MjQxMzcyNDZGLCAwLjA0MjYwOTA3NTVGLAorICAgIDAuMDQyODA0ODYxM0YsIDAuMDQzMDAxMDgxOUYsIDAuMDQzMTk3NzM3MUYsIDAuMDQzMzk0ODI2OUYsCisgICAgMC4wNDM1OTIzNTExRiwgMC4wNDM3OTAzMDk1RiwgMC4wNDM5ODg3MDIwRiwgMC4wNDQxODc1Mjg1RiwKKyAgICAwLjA0NDM4Njc4ODlGLCAwLjA0NDU4NjQ4MzBGLCAwLjA0NDc4NjYxMDZGLCAwLjA0NDk4NzE3MTdGLAorICAgIDAuMDQ1MTg4MTY2MUYsIDAuMDQ1Mzg5NTkzNkYsIDAuMDQ1NTkxNDU0MkYsIDAuMDQ1NzkzNzQ3N0YsCisgICAgMC4wNDU5OTY0NzM4RiwgMC4wNDYxOTk2MzI2RiwgMC4wNDY0MDMyMjM5RiwgMC4wNDY2MDcyNDc1RiwKKyAgICAwLjA0NjgxMTcwMzJGLCAwLjA0NzAxNjU5MTBGLCAwLjA0NzIyMTkxMDdGLCAwLjA0NzQyNzY2MjJGLAorICAgIDAuMDQ3NjMzODQ1MkYsIDAuMDQ3ODQwNDU5N0YsIDAuMDQ4MDQ3NTA1NkYsIDAuMDQ4MjU0OTgyN0YsCisgICAgMC4wNDg0NjI4OTA3RiwgMC4wNDg2NzEyMjk3RiwgMC4wNDg4Nzk5OTk0RiwgMC4wNDkwODkxOTk4RiwKKyAgICAwLjA0OTI5ODgzMDZGLCAwLjA0OTUwODg5MTdGLCAwLjA0OTcxOTM4MzBGLCAwLjA0OTkzMDMwNDNGLAorICAgIDAuMDUwMTQxNjU1NEYsIDAuMDUwMzUzNDM2M0YsIDAuMDUwNTY1NjQ2OEYsIDAuMDUwNzc4Mjg2N0YsCisgICAgMC4wNTA5OTEzNTU5RiwgMC4wNTEyMDQ4NTQyRiwgMC4wNTE0MTg3ODE1RiwgMC4wNTE2MzMxMzc2RiwKKyAgICAwLjA1MTg0NzkyMjVGLCAwLjA1MjA2MzEzNThGLCAwLjA1MjI3ODc3NzVGLCAwLjA1MjQ5NDg0NzVGLAorICAgIDAuMDUyNzExMzQ1NUYsIDAuMDUyOTI4MjcxNUYsIDAuMDUzMTQ1NjI1MkYsIDAuMDUzMzYzNDA2NkYsCisgICAgMC4wNTM1ODE2MTU0RiwgMC4wNTM4MDAyNTE1RiwgMC4wNTQwMTkzMTQ4RiwgMC4wNTQyMzg4MDUxRiwKKyAgICAwLjA1NDQ1ODcyMjJGLCAwLjA1NDY3OTA2NjBGLCAwLjA1NDg5OTgzNjRGLCAwLjA1NTEyMTAzMzFGLAorICAgIDAuMDU1MzQyNjU2MUYsIDAuMDU1NTY0NzA1MUYsIDAuMDU1Nzg3MTgwMUYsIDAuMDU2MDEwMDgwN0YsCisgICAgMC4wNTYyMzM0MDcwRiwgMC4wNTY0NTcxNTg3RiwgMC4wNTY2ODEzMzU3RiwgMC4wNTY5MDU5Mzc4RiwKKyAgICAwLjA1NzEzMDk2NDlGLCAwLjA1NzM1NjQxNjhGLCAwLjA1NzU4MjI5MzNGLCAwLjA1NzgwODU5NDJGLAorICAgIDAuMDU4MDM1MzE5NUYsIDAuMDU4MjYyNDY4OUYsIDAuMDU4NDkwMDQyM0YsIDAuMDU4NzE4MDM5NkYsCisgICAgMC4wNTg5NDY0NjA1RiwgMC4wNTkxNzUzMDQ5RiwgMC4wNTk0MDQ1NzI2RiwgMC4wNTk2MzQyNjM1RiwKKyAgICAwLjA1OTg2NDM3NzRGLCAwLjA2MDA5NDkxNDFGLCAwLjA2MDMyNTg3MzVGLCAwLjA2MDU1NzI1NTVGLAorICAgIDAuMDYwNzg5MDU5N0YsIDAuMDYxMDIxMjg2MkYsIDAuMDYxMjUzOTM0NkYsIDAuMDYxNDg3MDA0OUYsCisgICAgMC4wNjE3MjA0OTY4RiwgMC4wNjE5NTQ0MTAzRiwgMC4wNjIxODg3NDUxRiwgMC4wNjI0MjM1MDEwRiwKKyAgICAwLjA2MjY1ODY3ODBGLCAwLjA2Mjg5NDI3NThGLCAwLjA2MzEzMDI5NDJGLCAwLjA2MzM2NjczMzFGLAorICAgIDAuMDYzNjAzNTkyM0YsIDAuMDYzODQwODcxN0YsIDAuMDY0MDc4NTcxMEYsIDAuMDY0MzE2NjkwMUYsCisgICAgMC4wNjQ1NTUyMjg4RiwgMC4wNjQ3OTQxODcwRiwgMC4wNjUwMzM1NjQ1RiwgMC4wNjUyNzMzNjEwRiwKKyAgICAwLjA2NTUxMzU3NjVGLCAwLjA2NTc1NDIxMDhGLCAwLjA2NTk5NTI2MzZGLCAwLjA2NjIzNjczNDhGLAorICAgIDAuMDY2NDc4NjI0MkYsIDAuMDY2NzIwOTMxNkYsIDAuMDY2OTYzNjU3MEYsIDAuMDY3MjA2ODAwMEYsCisgICAgMC4wNjc0NTAzNjA1RiwgMC4wNjc2OTQzMzg0RiwgMC4wNjc5Mzg3MzM0RiwgMC4wNjgxODM1NDU0RiwKKyAgICAwLjA2ODQyODc3NDJGLCAwLjA2ODY3NDQxOTZGLCAwLjA2ODkyMDQ4MTRGLCAwLjA2OTE2Njk1OTVGLAorICAgIDAuMDY5NDEzODUzNkYsIDAuMDY5NjYxMTYzN0YsIDAuMDY5OTA4ODg5NEYsIDAuMDcwMTU3MDMwN0YsCisgICAgMC4wNzA0MDU1ODczRiwgMC4wNzA2NTQ1NTkwRiwgMC4wNzA5MDM5NDU4RiwgMC4wNzExNTM3NDczRiwKKyAgICAwLjA3MTQwMzk2MzRGLCAwLjA3MTY1NDU5MzlGLCAwLjA3MTkwNTYzODdGLCAwLjA3MjE1NzA5NzVGLAorICAgIDAuMDcyNDA4OTcwMkYsIDAuMDcyNjYxMjU2NUYsIDAuMDcyOTEzOTU2M0YsIDAuMDczMTY3MDY5NEYsCisgICAgMC4wNzM0MjA1OTU2RiwgMC4wNzM2NzQ1MzQ3RiwgMC4wNzM5Mjg4ODY2RiwgMC4wNzQxODM2NTEwRiwKKyAgICAwLjA3NDQzODgyNzdGLCAwLjA3NDY5NDQxNjZGLCAwLjA3NDk1MDQxNzVGLCAwLjA3NTIwNjgzMDFGLAorICAgIDAuMDc1NDYzNjU0M0YsIDAuMDc1NzIwODg5OUYsIDAuMDc1OTc4NTM2N0YsIDAuMDc2MjM2NTk0NkYsCisgICAgMC4wNzY0OTUwNjMyRiwgMC4wNzY3NTM5NDI0RiwgMC4wNzcwMTMyMzIwRiwgMC4wNzcyNzI5MzE5RiwKKyAgICAwLjA3NzUzMzA0MThGLCAwLjA3Nzc5MzU2MTZGLCAwLjA3ODA1NDQ5MDlGLCAwLjA3ODMxNTgyOThGLAorICAgIDAuMDc4NTc3NTc3OEYsIDAuMDc4ODM5NzM0OUYsIDAuMDc5MTAyMzAwOUYsIDAuMDc5MzY1Mjc1NUYsCisgICAgMC4wNzk2Mjg2NTg1RiwgMC4wNzk4OTI0NDk4RiwgMC4wODAxNTY2NDkyRiwgMC4wODA0MjEyNTY0RiwKKyAgICAwLjA4MDY4NjI3MTJGLCAwLjA4MDk1MTY5MzVGLCAwLjA4MTIxNzUyMzFGLCAwLjA4MTQ4Mzc1OTdGLAorICAgIDAuMDgxNzUwNDAzMUYsIDAuMDgyMDE3NDUzMkYsIDAuMDgyMjg0OTA5N0YsIDAuMDgyNTUyNzcyNEYsCisgICAgMC4wODI4MjEwNDEyRiwgMC4wODMwODk3MTU4RiwgMC4wODMzNTg3OTYwRiwgMC4wODM2MjgyODE2RiwKKyAgICAwLjA4Mzg5ODE3MjRGLCAwLjA4NDE2ODQ2ODJGLCAwLjA4NDQzOTE2ODhGLCAwLjA4NDcxMDI3NDBGLAorICAgIDAuMDg0OTgxNzgzNUYsIDAuMDg1MjUzNjk3M0YsIDAuMDg1NTI2MDE1MEYsIDAuMDg1Nzk4NzM2NEYsCisgICAgMC4wODYwNzE4NjE0RiwgMC4wODYzNDUzODk3RiwgMC4wODY2MTkzMjExRiwgMC4wODY4OTM2NTU0RiwKKyAgICAwLjA4NzE2ODM5MjRGLCAwLjA4NzQ0MzUzMTlGLCAwLjA4NzcxOTA3MzdGLCAwLjA4Nzk5NTAxNzVGLAorICAgIDAuMDg4MjcxMzYzMkYsIDAuMDg4NTQ4MTEwNUYsIDAuMDg4ODI1MjU5MkYsIDAuMDg5MTAyODA5MUYsCisgICAgMC4wODkzODA3NjAwRiwgMC4wODk2NTkxMTE3RiwgMC4wODk5Mzc4NjM5RiwgMC4wOTAyMTcwMTY1RiwKKyAgICAwLjA5MDQ5NjU2OTJGLCAwLjA5MDc3NjUyMThGLCAwLjA5MTA1Njg3NDBGLCAwLjA5MTMzNzYyNThGLAorICAgIDAuMDkxNjE4Nzc2N0YsIDAuMDkxOTAwMzI2OEYsIDAuMDkyMTgyMjc1NkYsIDAuMDkyNDY0NjIzMEYsCisgICAgMC4wOTI3NDczNjg3RiwgMC4wOTMwMzA1MTI2RiwgMC4wOTMzMTQwNTQ1RiwgMC4wOTM1OTc5OTQwRiwKKyAgICAwLjA5Mzg4MjMzMTBGLCAwLjA5NDE2NzA2NTNGLCAwLjA5NDQ1MjE5NjZGLCAwLjA5NDczNzcyNDdGLAorICAgIDAuMDk1MDIzNjQ5NEYsIDAuMDk1MzA5OTcwNEYsIDAuMDk1NTk2Njg3NkYsIDAuMDk1ODgzODAwN0YsCisgICAgMC4wOTYxNzEzMDk0RiwgMC4wOTY0NTkyMTM2RiwgMC4wOTY3NDc1MTMxRiwgMC4wOTcwMzYyMDc1RiwKKyAgICAwLjA5NzMyNTI5NjdGLCAwLjA5NzYxNDc4MDVGLCAwLjA5NzkwNDY1ODVGLCAwLjA5ODE5NDkzMDdGLAorICAgIDAuMDk4NDg1NTk2N0YsIDAuMDk4Nzc2NjU2M0YsIDAuMDk5MDY4MTA5M0YsIDAuMDk5MzU5OTU1NUYsCisgICAgMC4wOTk2NTIxOTQ1RiwgMC4wOTk5NDQ4MjYzRiwgMC4xMDAyMzc4NTA2RiwgMC4xMDA1MzEyNjcxRiwKKyAgICAwLjEwMDgyNTA3NTVGLCAwLjEwMTExOTI3NTdGLCAwLjEwMTQxMzg2NzVGLCAwLjEwMTcwODg1MDVGLAorICAgIDAuMTAyMDA0MjI0NkYsIDAuMTAyMjk5OTg5NUYsIDAuMTAyNTk2MTQ1MEYsIDAuMTAyODkyNjkwOUYsCisgICAgMC4xMDMxODk2MjY4RiwgMC4xMDM0ODY5NTI2RiwgMC4xMDM3ODQ2NjgwRiwgMC4xMDQwODI3NzI5RiwKKyAgICAwLjEwNDM4MTI2NjhGLCAwLjEwNDY4MDE0OTdGLCAwLjEwNDk3OTQyMTNGLCAwLjEwNTI3OTA4MTNGLAorICAgIDAuMTA1NTc5MTI5NEYsIDAuMTA1ODc5NTY1NkYsIDAuMTA2MTgwMzg5NEYsIDAuMTA2NDgxNjAwNkYsCisgICAgMC4xMDY3ODMxOTkxRiwgMC4xMDcwODUxODQ2RiwgMC4xMDczODc1NTY4RiwgMC4xMDc2OTAzMTU1RiwKKyAgICAwLjEwNzk5MzQ2MDRGLCAwLjEwODI5Njk5MTNGLCAwLjEwODYwMDkwNzlGLCAwLjEwODkwNTIxMDFGLAorICAgIDAuMTA5MjA5ODk3NUYsIDAuMTA5NTE0OTY5OUYsIDAuMTA5ODIwNDI3MEYsIDAuMTEwMTI2MjY4N0YsCisgICAgMC4xMTA0MzI0OTQ2RiwgMC4xMTA3MzkxMDQ1RiwgMC4xMTEwNDYwOTgyRiwgMC4xMTEzNTM0NzU0RiwKKyAgICAwLjExMTY2MTIzNTlGLCAwLjExMTk2OTM3OTNGLCAwLjExMjI3NzkwNTVGLCAwLjExMjU4NjgxNDJGLAorICAgIDAuMTEyODk2MTA1MkYsIDAuMTEzMjA1Nzc4MUYsIDAuMTEzNTE1ODMyOEYsIDAuMTEzODI2MjY5MEYsCisgICAgMC4xMTQxMzcwODYzRiwgMC4xMTQ0NDgyODQ3RiwgMC4xMTQ3NTk4NjM4RiwgMC4xMTUwNzE4MjMzRiwKKyAgICAwLjExNTM4NDE2MzFGLCAwLjExNTY5Njg4MjhGLCAwLjExNjAwOTk4MjJGLCAwLjExNjMyMzQ2MTBGLAorICAgIDAuMTE2NjM3MzE5MEYsIDAuMTE2OTUxNTU1OUYsIDAuMTE3MjY2MTcxNEYsIDAuMTE3NTgxMTY1NEYsCisgICAgMC4xMTc4OTY1Mzc0RiwgMC4xMTgyMTIyODc0RiwgMC4xMTg1Mjg0MTQ5RiwgMC4xMTg4NDQ5MTk4RiwKKyAgICAwLjExOTE2MTgwMThGLCAwLjExOTQ3OTA2MDZGLCAwLjExOTc5NjY5NjBGLCAwLjEyMDExNDcwNzZGLAorICAgIDAuMTIwNDMzMDk1M0YsIDAuMTIwNzUxODU4N0YsIDAuMTIxMDcwOTk3NkYsIDAuMTIxMzkwNTExOEYsCisgICAgMC4xMjE3MTA0MDA5RiwgMC4xMjIwMzA2NjQ3RiwgMC4xMjIzNTEzMDI5RiwgMC4xMjI2NzIzMTUzRiwKKyAgICAwLjEyMjk5MzcwMTZGLCAwLjEyMzMxNTQ2MTVGLCAwLjEyMzYzNzU5NDhGLCAwLjEyMzk2MDEwMTFGLAorICAgIDAuMTI0MjgyOTgwM0YsIDAuMTI0NjA2MjMxOUYsIDAuMTI0OTI5ODU1OUYsIDAuMTI1MjUzODUxOEYsCisgICAgMC4xMjU1NzgyMTk1RiwgMC4xMjU5MDI5NTg2RiwgMC4xMjYyMjgwNjg5RiwgMC4xMjY1NTM1NTAxRiwKKyAgICAwLjEyNjg3OTQwMTlGLCAwLjEyNzIwNTYyNDFGLCAwLjEyNzUzMjIxNjNGLCAwLjEyNzg1OTE3ODRGLAorICAgIDAuMTI4MTg2NTA5OUYsIDAuMTI4NTE0MjEwOEYsIDAuMTI4ODQyMjgwNUYsIDAuMTI5MTcwNzE5MEYsCisgICAgMC4xMjk0OTk1MjU5RiwgMC4xMjk4Mjg3MDA5RiwgMC4xMzAxNTgyNDM3RiwgMC4xMzA0ODgxNTQyRiwKKyAgICAwLjEzMDgxODQzMTlGLCAwLjEzMTE0OTA3NjZGLCAwLjEzMTQ4MDA4ODFGLCAwLjEzMTgxMTQ2NjBGLAorICAgIDAuMTMyMTQzMjEwMEYsIDAuMTMyNDc1MzIwMEYsIDAuMTMyODA3Nzk1NUYsIDAuMTMzMTQwNjM2NEYsCisgICAgMC4xMzM0NzM4NDIyRiwgMC4xMzM4MDc0MTI5RiwgMC4xMzQxNDEzNDc5RiwgMC4xMzQ0NzU2NDcyRiwKKyAgICAwLjEzNDgxMDMxMDNGLCAwLjEzNTE0NTMzNzBGLCAwLjEzNTQ4MDcyNzBGLCAwLjEzNTgxNjQ4MDFGLAorICAgIDAuMTM2MTUyNTk1OUYsIDAuMTM2NDg5MDc0MUYsIDAuMTM2ODI1OTE0NUYsIDAuMTM3MTYzMTE2N0YsCisgICAgMC4xMzc1MDA2ODA1RiwgMC4xMzc4Mzg2MDU2RiwgMC4xMzgxNzY4OTE3RiwgMC4xMzg1MTU1Mzg0RiwKKyAgICAwLjEzODg1NDU0NTZGLCAwLjEzOTE5MzkxMjlGLCAwLjEzOTUzMzY0MDBGLCAwLjEzOTg3MzcyNjZGLAorICAgIDAuMTQwMjE0MTcyNEYsIDAuMTQwNTU0OTc3MkYsIDAuMTQwODk2MTQwNkYsIDAuMTQxMjM3NjYyM0YsCisgICAgMC4xNDE1Nzk1NDIxRiwgMC4xNDE5MjE3Nzk3RiwgMC4xNDIyNjQzNzQ2RiwgMC4xNDI2MDczMjY4RiwKKyAgICAwLjE0Mjk1MDYzNThGLCAwLjE0MzI5NDMwMTNGLCAwLjE0MzYzODMyMzFGLCAwLjE0Mzk4MjcwMDhGLAorICAgIDAuMTQ0MzI3NDM0MkYsIDAuMTQ0NjcyNTIyOUYsIDAuMTQ1MDE3OTY2N0YsIDAuMTQ1MzYzNzY1MkYsCisgICAgMC4xNDU3MDk5MTgxRiwgMC4xNDYwNTY0MjUyRiwgMC4xNDY0MDMyODYxRiwgMC4xNDY3NTA1MDA2RiwKKyAgICAwLjE0NzA5ODA2ODJGLCAwLjE0NzQ0NTk4ODhGLCAwLjE0Nzc5NDI2MjBGLCAwLjE0ODE0Mjg4NzVGLAorICAgIDAuMTQ4NDkxODY1MUYsIDAuMTQ4ODQxMTk0MkYsIDAuMTQ5MTkwODc0OEYsIDAuMTQ5NTQwOTA2NUYsCisgICAgMC4xNDk4OTEyODg5RiwgMC4xNTAyNDIwMjE4RiwgMC4xNTA1OTMxMDQ4RiwgMC4xNTA5NDQ1Mzc2RiwKKyAgICAwLjE1MTI5NjMyMDBGLCAwLjE1MTY0ODQ1MTZGLCAwLjE1MjAwMDkzMjFGLCAwLjE1MjM1Mzc2MTJGLAorICAgIDAuMTUyNzA2OTM4NUYsIDAuMTUzMDYwNDYzOEYsIDAuMTUzNDE0MzM2OEYsIDAuMTUzNzY4NTU3MUYsCisgICAgMC4xNTQxMjMxMjQ0RiwgMC4xNTQ0NzgwMzg0RiwgMC4xNTQ4MzMyOTg3RiwgMC4xNTUxODg5MDUyRiwKKyAgICAwLjE1NTU0NDg1NzRGLCAwLjE1NTkwMTE1NTBGLCAwLjE1NjI1Nzc5NzhGLCAwLjE1NjYxNDc4NTNGLAorICAgIDAuMTU2OTcyMTE3M0YsIDAuMTU3MzI5NzkzNUYsIDAuMTU3Njg3ODEzNUYsIDAuMTU4MDQ2MTc3MUYsCisgICAgMC4xNTg0MDQ4ODM4RiwgMC4xNTg3NjM5MzM0RiwgMC4xNTkxMjMzMjU1RiwgMC4xNTk0ODMwNTk5RiwKKyAgICAwLjE1OTg0MzEzNjFGLCAwLjE2MDIwMzU1NDBGLCAwLjE2MDU2NDMxMzFGLCAwLjE2MDkyNTQxMzFGLAorICAgIDAuMTYxMjg2ODUzN0YsIDAuMTYxNjQ4NjM0NkYsIDAuMTYyMDEwNzU1NUYsIDAuMTYyMzczMjE2MEYsCisgICAgMC4xNjI3MzYwMTU4RiwgMC4xNjMwOTkxNTQ1RiwgMC4xNjM0NjI2MzE5RiwgMC4xNjM4MjY0NDc2RiwKKyAgICAwLjE2NDE5MDYwMTNGLCAwLjE2NDU1NTA5MjZGLCAwLjE2NDkxOTkyMTJGLCAwLjE2NTI4NTA4NjlGLAorICAgIDAuMTY1NjUwNTg5MkYsIDAuMTY2MDE2NDI3OEYsIDAuMTY2MzgyNjAyNEYsIDAuMTY2NzQ5MTEyN0YsCisgICAgMC4xNjcxMTU5NTgzRiwgMC4xNjc0ODMxMzg4RiwgMC4xNjc4NTA2NTQxRiwgMC4xNjgyMTg1MDM2RiwKKyAgICAwLjE2ODU4NjY4NzJGLCAwLjE2ODk1NTIwNDRGLCAwLjE2OTMyNDA1NDlGLCAwLjE2OTY5MzIzODRGLAorICAgIDAuMTcwMDYyNzU0NUYsIDAuMTcwNDMyNjAyOUYsIDAuMTcwODAyNzgzM0YsIDAuMTcxMTczMjk1MkYsCisgICAgMC4xNzE1NDQxMzg1RiwgMC4xNzE5MTUzMTI3RiwgMC4xNzIyODY4MTc1RiwgMC4xNzI2NTg2NTI2RiwKKyAgICAwLjE3MzAzMDgxNzZGLCAwLjE3MzQwMzMxMjFGLCAwLjE3Mzc3NjEzNTlGLCAwLjE3NDE0OTI4ODZGLAorICAgIDAuMTc0NTIyNzY5OEYsIDAuMTc0ODk2NTc5MkYsIDAuMTc1MjcwNzE2NEYsIDAuMTc1NjQ1MTgxMkYsCisgICAgMC4xNzYwMTk5NzMxRiwgMC4xNzYzOTUwOTE4RiwgMC4xNzY3NzA1MzcwRiwgMC4xNzcxNDYzMDgzRiwKKyAgICAwLjE3NzUyMjQwNTRGLCAwLjE3Nzg5ODgyNzlGLCAwLjE3ODI3NTU3NTRGLCAwLjE3ODY1MjY0NzdGLAorICAgIDAuMTc5MDMwMDQ0NEYsIDAuMTc5NDA3NzY1MUYsIDAuMTc5Nzg1ODA5NEYsIDAuMTgwMTY0MTc3MUYsCisgICAgMC4xODA1NDI4Njc3RiwgMC4xODA5MjE4ODEwRiwgMC4xODEzMDEyMTY1RiwgMC4xODE2ODA4NzM5RiwKKyAgICAwLjE4MjA2MDg1MjhGLCAwLjE4MjQ0MTE1MzBGLCAwLjE4MjgyMTc3MzlGLCAwLjE4MzIwMjcxNTRGLAorICAgIDAuMTgzNTgzOTc3MEYsIDAuMTgzOTY1NTU4NEYsIDAuMTg0MzQ3NDU5MkYsIDAuMTg0NzI5Njc5MEYsCisgICAgMC4xODUxMTIyMTc1RiwgMC4xODU0OTUwNzQ0RiwgMC4xODU4NzgyNDkyRiwgMC4xODYyNjE3NDE3RiwKKyAgICAwLjE4NjY0NTU1MTRGLCAwLjE4NzAyOTY3ODBGLCAwLjE4NzQxNDEyMTFGLCAwLjE4Nzc5ODg4MDRGLAorICAgIDAuMTg4MTgzOTU1NUYsIDAuMTg4NTY5MzQ2MUYsIDAuMTg4OTU1MDUxN0YsIDAuMTg5MzQxMDcyMUYsCisgICAgMC4xODk3Mjc0MDY4RiwgMC4xOTAxMTQwNTU1RiwgMC4xOTA1MDEwMTc4RiwgMC4xOTA4ODgyOTMzRiwKKyAgICAwLjE5MTI3NTg4MThGLCAwLjE5MTY2Mzc4MjhGLCAwLjE5MjA1MTk5NTlGLCAwLjE5MjQ0MDUyMDhGLAorICAgIDAuMTkyODI5MzU3MUYsIDAuMTkzMjE4NTA0NEYsIDAuMTkzNjA3OTYyNUYsIDAuMTkzOTk3NzMwOEYsCisgICAgMC4xOTQzODc4MDkxRiwgMC4xOTQ3NzgxOTY5RiwgMC4xOTUxNjg4OTM5RiwgMC4xOTU1NTk4OTk4RiwKKyAgICAwLjE5NTk1MTIxNDFGLCAwLjE5NjM0MjgzNjRGLCAwLjE5NjczNDc2NjVGLCAwLjE5NzEyNzAwMzhGLAorICAgIDAuMTk3NTE5NTQ4MkYsIDAuMTk3OTEyMzk5MEYsIDAuMTk4MzA1NTU2MUYsIDAuMTk4Njk5MDE5MEYsCisgICAgMC4xOTkwOTI3ODczRiwgMC4xOTk0ODY4NjA3RiwgMC4xOTk4ODEyMzg4RiwgMC4yMDAyNzU5MjEyRiwKKyAgICAwLjIwMDY3MDkwNzVGLCAwLjIwMTA2NjE5NzRGLCAwLjIwMTQ2MTc5MDRGLCAwLjIwMTg1NzY4NjJGLAorICAgIDAuMjAyMjUzODg0NEYsIDAuMjAyNjUwMzg0N0YsIDAuMjAzMDQ3MTg2NUYsIDAuMjAzNDQ0Mjg5N0YsCisgICAgMC4yMDM4NDE2OTM3RiwgMC4yMDQyMzkzOTgyRiwgMC4yMDQ2Mzc0MDI4RiwgMC4yMDUwMzU3MDcxRiwKKyAgICAwLjIwNTQzNDMxMDdGLCAwLjIwNTgzMzIxMzNGLCAwLjIwNjIzMjQxNDVGLCAwLjIwNjYzMTkxMzhGLAorICAgIDAuMjA3MDMxNzExMEYsIDAuMjA3NDMxODA1NUYsIDAuMjA3ODMyMTk3MEYsIDAuMjA4MjMyODg1MkYsCisgICAgMC4yMDg2MzM4Njk2RiwgMC4yMDkwMzUxNDk4RiwgMC4yMDk0MzY3MjU1RiwgMC4yMDk4Mzg1OTYyRiwKKyAgICAwLjIxMDI0MDc2MTdGLCAwLjIxMDY0MzIyMTNGLCAwLjIxMTA0NTk3NDlGLCAwLjIxMTQ0OTAyMjBGLAorICAgIDAuMjExODUyMzYyMUYsIDAuMjEyMjU1OTk1MEYsIDAuMjEyNjU5OTIwMkYsIDAuMjEzMDY0MTM3M0YsCisgICAgMC4yMTM0Njg2NDU5RiwgMC4yMTM4NzM0NDU2RiwgMC4yMTQyNzg1MzYxRiwgMC4yMTQ2ODM5MTY4RiwKKyAgICAwLjIxNTA4OTU4NzVGLCAwLjIxNTQ5NTU0NzhGLCAwLjIxNTkwMTc5NzJGLCAwLjIxNjMwODMzNTNGLAorICAgIDAuMjE2NzE1MTYxN0YsIDAuMjE3MTIyMjc2MUYsIDAuMjE3NTI5Njc4MEYsIDAuMjE3OTM3MzY3MEYsCisgICAgMC4yMTgzNDUzNDI4RiwgMC4yMTg3NTM2MDQ5RiwgMC4yMTkxNjIxNTI5RiwgMC4yMTk1NzA5ODY0RiwKKyAgICAwLjIxOTk4MDEwNTFGLCAwLjIyMDM4OTUwODVGLCAwLjIyMDc5OTE5NjFGLCAwLjIyMTIwOTE2NzdGLAorICAgIDAuMjIxNjE5NDIyOEYsIDAuMjIyMDI5OTYxMEYsIDAuMjIyNDQwNzgxOEYsIDAuMjIyODUxODg1MEYsCisgICAgMC4yMjMyNjMyNjk5RiwgMC4yMjM2NzQ5MzY0RiwgMC4yMjQwODY4ODM5RiwgMC4yMjQ0OTkxMTIxRiwKKyAgICAwLjIyNDkxMTYyMDRGLCAwLjIyNTMyNDQwODZGLCAwLjIyNTczNzQ3NjNGLCAwLjIyNjE1MDgyMjlGLAorICAgIDAuMjI2NTY0NDQ4MUYsIDAuMjI2OTc4MzUxNEYsIDAuMjI3MzkyNTMyNkYsIDAuMjI3ODA2OTkxMUYsCisgICAgMC4yMjgyMjE3MjY1RiwgMC4yMjg2MzY3Mzg0RiwgMC4yMjkwNTIwMjY1RiwgMC4yMjk0Njc1OTAyRiwKKyAgICAwLjIyOTg4MzQyOTJGLCAwLjIzMDI5OTU0MzFGLCAwLjIzMDcxNTkzMTRGLCAwLjIzMTEzMjU5MzdGLAorICAgIDAuMjMxNTQ5NTI5N0YsIDAuMjMxOTY2NzM4OEYsIDAuMjMyMzg0MjIwN0YsIDAuMjMyODAxOTc0OUYsCisgICAgMC4yMzMyMjAwMDExRiwgMC4yMzM2MzgyOTg4RiwgMC4yMzQwNTY4Njc1RiwgMC4yMzQ0NzU3MDcwRiwKKyAgICAwLjIzNDg5NDgxNjZGLCAwLjIzNTMxNDE5NjFGLCAwLjIzNTczMzg0NTBGLCAwLjIzNjE1Mzc2MjlGLAorICAgIDAuMjM2NTczOTQ5M0YsIDAuMjM2OTk0NDAzOEYsIDAuMjM3NDE1MTI2MUYsIDAuMjM3ODM2MTE1NkYsCisgICAgMC4yMzgyNTczNzIwRiwgMC4yMzg2Nzg4OTQ4RiwgMC4yMzkxMDA2ODM2RiwgMC4yMzk1MjI3MzgwRiwKKyAgICAwLjIzOTk0NTA1NzVGLCAwLjI0MDM2NzY0MTdGLCAwLjI0MDc5MDQ5MDJGLCAwLjI0MTIxMzYwMjZGLAorICAgIDAuMjQxNjM2OTc4M0YsIDAuMjQyMDYwNjE3MUYsIDAuMjQyNDg0NTE4NUYsIDAuMjQyOTA4NjgyMEYsCisgICAgMC4yNDMzMzMxMDcyRiwgMC4yNDM3NTc3OTM2RiwgMC4yNDQxODI3NDA5RiwgMC4yNDQ2MDc5NDg2RiwKKyAgICAwLjI0NTAzMzQxNjNGLCAwLjI0NTQ1OTE0MzVGLCAwLjI0NTg4NTEyOThGLCAwLjI0NjMxMTM3NDdGLAorICAgIDAuMjQ2NzM3ODc3OUYsIDAuMjQ3MTY0NjM4OUYsIDAuMjQ3NTkxNjU3M0YsIDAuMjQ4MDE4OTMyNUYsCisgICAgMC4yNDg0NDY0NjQzRiwgMC4yNDg4NzQyNTIxRiwgMC4yNDkzMDIyOTU1RiwgMC4yNDk3MzA1OTQwRiwKKyAgICAwLjI1MDE1OTE0NzNGLCAwLjI1MDU4Nzk1NDlGLCAwLjI1MTAxNzAxNjNGLCAwLjI1MTQ0NjMzMTFGLAorICAgIDAuMjUxODc1ODk4OUYsIDAuMjUyMzA1NzE5M0YsIDAuMjUyNzM1NzkxNkYsIDAuMjUzMTY2MTE1N0YsCisgICAgMC4yNTM1OTY2OTA5RiwgMC4yNTQwMjc1MTY5RiwgMC4yNTQ0NTg1OTMxRiwgMC4yNTQ4ODk5MTkzRiwKKyAgICAwLjI1NTMyMTQ5NDhGLCAwLjI1NTc1MzMxOTNGLCAwLjI1NjE4NTM5MjRGLCAwLjI1NjYxNzcxMzVGLAorICAgIDAuMjU3MDUwMjgyMkYsIDAuMjU3NDgzMDk4MUYsIDAuMjU3OTE2MTYwOEYsIDAuMjU4MzQ5NDY5N0YsCisgICAgMC4yNTg3ODMwMjQ1RiwgMC4yNTkyMTY4MjQ2RiwgMC4yNTk2NTA4Njk3RiwgMC4yNjAwODUxNTkzRiwKKyAgICAwLjI2MDUxOTY5MjlGLCAwLjI2MDk1NDQ3MDFGLCAwLjI2MTM4OTQ5MDRGLCAwLjI2MTgyNDc1MzRGLAorICAgIDAuMjYyMjYwMjU4NkYsIDAuMjYyNjk2MDA1NUYsIDAuMjYzMTMxOTkzOEYsIDAuMjYzNTY4MjIzMEYsCisgICAgMC4yNjQwMDQ2OTI1RiwgMC4yNjQ0NDE0MDIxRiwgMC4yNjQ4NzgzNTExRiwgMC4yNjUzMTU1MzkxRiwKKyAgICAwLjI2NTc1Mjk2NTdGLCAwLjI2NjE5MDYzMDVGLCAwLjI2NjYyODUzMjlGLCAwLjI2NzA2NjY3MjVGLAorICAgIDAuMjY3NTA1MDQ4OUYsIDAuMjY3OTQzNjYxNkYsIDAuMjY4MzgyNTEwMUYsIDAuMjY4ODIxNTk0MEYsCisgICAgMC4yNjkyNjA5MTI3RiwgMC4yNjk3MDA0NjYwRiwgMC4yNzAxNDAyNTMyRiwgMC4yNzA1ODAyNzM5RiwKKyAgICAwLjI3MTAyMDUyNzhGLCAwLjI3MTQ2MTAxNDJGLCAwLjI3MTkwMTczMjdGLCAwLjI3MjM0MjY4MzBGLAorICAgIDAuMjcyNzgzODY0NEYsIDAuMjczMjI1Mjc2NkYsIDAuMjczNjY2OTE5MUYsIDAuMjc0MTA4NzkxNEYsCisgICAgMC4yNzQ1NTA4OTMwRiwgMC4yNzQ5OTMyMjM1RiwgMC4yNzU0MzU3ODI0RiwgMC4yNzU4Nzg1NjkzRiwKKyAgICAwLjI3NjMyMTU4MzdGLCAwLjI3Njc2NDgyNTFGLCAwLjI3NzIwODI5MzBGLCAwLjI3NzY1MTk4NzBGLAorICAgIDAuMjc4MDk1OTA2NkYsIDAuMjc4NTQwMDUxM0YsIDAuMjc4OTg0NDIwN0YsIDAuMjc5NDI5MDE0M0YsCisgICAgMC4yNzk4NzM4MzE2RiwgMC4yODAzMTg4NzIyRiwgMC4yODA3NjQxMzU1RiwgMC4yODEyMDk2MjExRiwKKyAgICAwLjI4MTY1NTMyODZGLCAwLjI4MjEwMTI1NzRGLCAwLjI4MjU0NzQwNzFGLCAwLjI4Mjk5Mzc3NzNGLAorICAgIDAuMjgzNDQwMzY3M0YsIDAuMjgzODg3MTc2OEYsIDAuMjg0MzM0MjA1M0YsIDAuMjg0NzgxNDUyM0YsCisgICAgMC4yODUyMjg5MTc0RiwgMC4yODU2NzY1OTk5RiwgMC4yODYxMjQ0OTk2RiwgMC4yODY1NzI2MTU5RiwKKyAgICAwLjI4NzAyMDk0ODJGLCAwLjI4NzQ2OTQ5NjJGLCAwLjI4NzkxODI1OTRGLCAwLjI4ODM2NzIzNzJGLAorICAgIDAuMjg4ODE2NDI5M0YsIDAuMjg5MjY1ODM1MEYsIDAuMjg5NzE1NDU0MEYsIDAuMjkwMTY1Mjg1OEYsCisgICAgMC4yOTA2MTUzMjk4RiwgMC4yOTEwNjU1ODU2RiwgMC4yOTE1MTYwNTI3RiwgMC4yOTE5NjY3MzA2RiwKKyAgICAwLjI5MjQxNzYxODlGLCAwLjI5Mjg2ODcxNzFGLCAwLjI5MzMyMDAyNDZGLCAwLjI5Mzc3MTU0MDlGLAorICAgIDAuMjk0MjIzMjY1N0YsIDAuMjk0Njc1MTk4NEYsIDAuMjk1MTI3MzM4NkYsIDAuMjk1NTc5Njg1NkYsCisgICAgMC4yOTYwMzIyMzkxRiwgMC4yOTY0ODQ5OTg2RiwgMC4yOTY5Mzc5NjM2RiwgMC4yOTczOTExMzM1RiwKKyAgICAwLjI5Nzg0NDUwODBGLCAwLjI5ODI5ODA4NjRGLCAwLjI5ODc1MTg2ODRGLCAwLjI5OTIwNTg1MzRGLAorICAgIDAuMjk5NjYwMDQwOUYsIDAuMzAwMTE0NDMwNUYsIDAuMzAwNTY5MDIxN0YsIDAuMzAxMDIzODEzOUYsCisgICAgMC4zMDE0Nzg4MDY3RiwgMC4zMDE5MzM5OTk1RiwgMC4zMDIzODkzOTIwRiwgMC4zMDI4NDQ5ODM1RiwKKyAgICAwLjMwMzMwMDc3MzZGLCAwLjMwMzc1Njc2MThGLCAwLjMwNDIxMjk0NzdGLCAwLjMwNDY2OTMzMDZGLAorICAgIDAuMzA1MTI1OTEwMkYsIDAuMzA1NTgyNjg1OUYsIDAuMzA2MDM5NjU3MkYsIDAuMzA2NDk2ODIzNkYsCisgICAgMC4zMDY5NTQxODQ3RiwgMC4zMDc0MTE3Mzk5RiwgMC4zMDc4Njk0ODg3RiwgMC4zMDgzMjc0MzA3RiwKKyAgICAwLjMwODc4NTU2NTNGLCAwLjMwOTI0Mzg5MjBGLCAwLjMwOTcwMjQxMDRGLCAwLjMxMDE2MTExOTlGLAorICAgIDAuMzEwNjIwMDIwMEYsIDAuMzExMDc5MTEwM0YsIDAuMzExNTM4MzkwMkYsIDAuMzExOTk3ODU5MkYsCisgICAgMC4zMTI0NTc1MTY5RiwgMC4zMTI5MTczNjI3RiwgMC4zMTMzNzczOTYxRiwgMC4zMTM4Mzc2MTY2RiwKKyAgICAwLjMxNDI5ODAyMzhGLCAwLjMxNDc1ODYxNzBGLCAwLjMxNTIxOTM5NTlGLCAwLjMxNTY4MDM1OThGLAorICAgIDAuMzE2MTQxNTA4NEYsIDAuMzE2NjAyODQxMEYsIDAuMzE3MDY0MzU3M0YsIDAuMzE3NTI2MDU2NkYsCisgICAgMC4zMTc5ODc5Mzg0RiwgMC4zMTg0NTAwMDIzRiwgMC4zMTg5MTIyNDc4RiwgMC4zMTkzNzQ2NzQzRiwKKyAgICAwLjMxOTgzNzI4MTRGLCAwLjMyMDMwMDA2ODVGLCAwLjMyMDc2MzAzNTFGLCAwLjMyMTIyNjE4MDdGLAorICAgIDAuMzIxNjg5NTA0OEYsIDAuMzIyMTUzMDA2OUYsIDAuMzIyNjE2Njg2NUYsIDAuMzIzMDgwNTQzMEYsCisgICAgMC4zMjM1NDQ1NzYwRiwgMC4zMjQwMDg3ODQ5RiwgMC4zMjQ0NzMxNjkzRiwgMC4zMjQ5Mzc3Mjg1RiwKKyAgICAwLjMyNTQwMjQ2MjJGLCAwLjMyNTg2NzM2OThGLCAwLjMyNjMzMjQ1MDdGLCAwLjMyNjc5NzcwNDVGLAorICAgIDAuMzI3MjYzMTMwNkYsIDAuMzI3NzI4NzI4NkYsIDAuMzI4MTk0NDk3OEYsIDAuMzI4NjYwNDM3OUYsCisgICAgMC4zMjkxMjY1NDgyRiwgMC4zMjk1OTI4Mjg0RiwgMC4zMzAwNTkyNzc3RiwgMC4zMzA1MjU4OTU4RiwKKyAgICAwLjMzMDk5MjY4MjFGLCAwLjMzMTQ1OTYzNjFGLCAwLjMzMTkyNjc1NzNGLCAwLjMzMjM5NDA0NTFGLAorICAgIDAuMzMyODYxNDk5MEYsIDAuMzMzMzI5MTE4NkYsIDAuMzMzNzk2OTAzM0YsIDAuMzM0MjY0ODUyNUYsCisgICAgMC4zMzQ3MzI5NjU4RiwgMC4zMzUyMDEyNDI3RiwgMC4zMzU2Njk2ODI1RiwgMC4zMzYxMzgyODQ5RiwKKyAgICAwLjMzNjYwNzA0OTJGLCAwLjMzNzA3NTk3NDlGLCAwLjMzNzU0NTA2MTZGLCAwLjMzODAxNDMwODdGLAorICAgIDAuMzM4NDgzNzE1NkYsIDAuMzM4OTUzMjgxOUYsIDAuMzM5NDIzMDA3MUYsIDAuMzM5ODkyODkwNUYsCisgICAgMC4zNDAzNjI5MzE3RiwgMC4zNDA4MzMxMzAyRiwgMC4zNDEzMDM0ODU0RiwgMC4zNDE3NzM5OTY3RiwKKyAgICAwLjM0MjI0NDY2MzhGLCAwLjM0MjcxNTQ4NjBGLCAwLjM0MzE4NjQ2MjhGLCAwLjM0MzY1NzU5MzhGLAorICAgIDAuMzQ0MTI4ODc4MkYsIDAuMzQ0NjAwMzE1OEYsIDAuMzQ1MDcxOTA1OEYsIDAuMzQ1NTQzNjQ3OEYsCisgICAgMC4zNDYwMTU1NDEyRiwgMC4zNDY0ODc1ODU2RiwgMC4zNDY5NTk3ODA0RiwgMC4zNDc0MzIxMjUwRiwKKyAgICAwLjM0NzkwNDYxODlGLCAwLjM0ODM3NzI2MTdGLCAwLjM0ODg1MDA1MjdGLCAwLjM0OTMyMjk5MTRGLAorICAgIDAuMzQ5Nzk2MDc3NEYsIDAuMzUwMjY5MzEwMEYsIDAuMzUwNzQyNjg4N0YsIDAuMzUxMjE2MjEzMUYsCisgICAgMC4zNTE2ODk4ODI1RiwgMC4zNTIxNjM2OTY1RiwgMC4zNTI2Mzc2NTQ1RiwgMC4zNTMxMTE3NTU5RiwKKyAgICAwLjM1MzU4NjAwMDNGLCAwLjM1NDA2MDM4NzBGLCAwLjM1NDUzNDkxNTdGLCAwLjM1NTAwOTU4NTZGLAorICAgIDAuMzU1NDg0Mzk2NEYsIDAuMzU1OTU5MzQ3NEYsIDAuMzU2NDM0NDM4MUYsIDAuMzU2OTA5NjY4MEYsCisgICAgMC4zNTczODUwMzY2RiwgMC4zNTc4NjA1NDMyRiwgMC4zNTgzMzYxODc1RiwgMC4zNTg4MTE5Njg3RiwKKyAgICAwLjM1OTI4Nzg4NjVGLCAwLjM1OTc2Mzk0MDJGLCAwLjM2MDI0MDEyOTNGLCAwLjM2MDcxNjQ1MzNGLAorICAgIDAuMzYxMTkyOTExN0YsIDAuMzYxNjY5NTAzOEYsIDAuMzYyMTQ2MjI5MkYsIDAuMzYyNjIzMDg3M0YsCisgICAgMC4zNjMxMDAwNzc2RiwgMC4zNjM1NzcxOTk1RiwgMC4zNjQwNTQ0NTI1RiwgMC4zNjQ1MzE4MzYwRiwKKyAgICAwLjM2NTAwOTM0OTZGLCAwLjM2NTQ4Njk5MjZGLCAwLjM2NTk2NDc2NDVGLCAwLjM2NjQ0MjY2NDhGLAorICAgIDAuMzY2OTIwNjkzMEYsIDAuMzY3Mzk4ODQ4NEYsIDAuMzY3ODc3MTMwNkYsIDAuMzY4MzU1NTM5MEYsCisgICAgMC4zNjg4MzQwNzMxRiwgMC4zNjkzMTI3MzIyRiwgMC4zNjk3OTE1MTYwRiwgMC4zNzAyNzA0MjM3RiwKKyAgICAwLjM3MDc0OTQ1NDlGLCAwLjM3MTIyODYwOTFGLCAwLjM3MTcwNzg4NTdGLCAwLjM3MjE4NzI4NDBGLAorICAgIDAuMzcyNjY2ODAzN0YsIDAuMzczMTQ2NDQ0MUYsIDAuMzczNjI2MjA0N0YsIDAuMzc0MTA2MDg1MEYsCisgICAgMC4zNzQ1ODYwODQzRiwgMC4zNzUwNjYyMDIzRiwgMC4zNzU1NDY0MzgyRiwgMC4zNzYwMjY3OTE1RiwKKyAgICAwLjM3NjUwNzI2MThGLCAwLjM3Njk4Nzg0ODRGLCAwLjM3NzQ2ODU1MDlGLCAwLjM3Nzk0OTM2ODZGLAorICAgIDAuMzc4NDMwMzAxMEYsIDAuMzc4OTExMzQ3NUYsIDAuMzc5MzkyNTA3NkYsIDAuMzc5ODczNzgwOUYsCisgICAgMC4zODAzNTUxNjY2RiwgMC4zODA4MzY2NjQyRiwgMC4zODEzMTgyNzMzRiwgMC4zODE3OTk5OTMyRiwKKyAgICAwLjM4MjI4MTgyMzRGLCAwLjM4Mjc2Mzc2MzNGLCAwLjM4MzI0NTgxMjRGLCAwLjM4MzcyNzk3MDJGLAorICAgIDAuMzg0MjEwMjM2MEYsIDAuMzg0NjkyNjA5M0YsIDAuMzg1MTc1MDg5N0YsIDAuMzg1NjU3Njc2NEYsCisgICAgMC4zODYxNDAzNjkwRiwgMC4zODY2MjMxNjcwRiwgMC4zODcxMDYwNjk2RiwgMC4zODc1ODkwNzY1RiwKKyAgICAwLjM4ODA3MjE4NzBGLCAwLjM4ODU1NTQwMDdGLCAwLjM4OTAzODcxNjhGLCAwLjM4OTUyMjEzNDlGLAorICAgIDAuMzkwMDA1NjU0NEYsIDAuMzkwNDg5Mjc0OEYsIDAuMzkwOTcyOTk1NUYsIDAuMzkxNDU2ODE2MEYsCisgICAgMC4zOTE5NDA3MzU2RiwgMC4zOTI0MjQ3NTM5RiwgMC4zOTI5MDg4NzAyRiwgMC4zOTMzOTMwODQxRiwKKyAgICAwLjM5Mzg3NzM5NDlGLCAwLjM5NDM2MTgwMjFGLCAwLjM5NDg0NjMwNTJGLCAwLjM5NTMzMDkwMzVGLAorICAgIDAuMzk1ODE1NTk2NkYsIDAuMzk2MzAwMzgzOEYsIDAuMzk2Nzg1MjY0NkYsIDAuMzk3MjcwMjM4NUYsCisgICAgMC4zOTc3NTUzMDQ4RiwgMC4zOTgyNDA0NjMxRiwgMC4zOTg3MjU3MTI3RiwgMC4zOTkyMTEwNTMxRiwKKyAgICAwLjM5OTY5NjQ4MzhGLCAwLjQwMDE4MjAwNDFGLCAwLjQwMDY2NzYxMzZGLCAwLjQwMTE1MzMxMTZGLAorICAgIDAuNDAxNjM5MDk3NkYsIDAuNDAyMTI0OTcxMEYsIDAuNDAyNjEwOTMxM0YsIDAuNDAzMDk2OTc3OUYsCisgICAgMC40MDM1ODMxMTAyRiwgMC40MDQwNjkzMjc3RiwgMC40MDQ1NTU2Mjk5RiwgMC40MDUwNDIwMTYwRiwKKyAgICAwLjQwNTUyODQ4NTdGLCAwLjQwNjAxNTAzODNGLCAwLjQwNjUwMTY3MzJGLCAwLjQwNjk4ODM4OTlGLAorICAgIDAuNDA3NDc1MTg3OUYsIDAuNDA3OTYyMDY2NUYsIDAuNDA4NDQ5MDI1MkYsIDAuNDA4OTM2MDYzNUYsCisgICAgMC40MDk0MjMxODA3RiwgMC40MDk5MTAzNzYzRiwgMC40MTAzOTc2NDk4RiwgMC40MTA4ODUwMDA1RiwKKyAgICAwLjQxMTM3MjQyODBGLCAwLjQxMTg1OTkzMTVGLCAwLjQxMjM0NzUxMDdGLCAwLjQxMjgzNTE2NDhGLAorICAgIDAuNDEzMzIyODkzNEYsIDAuNDEzODEwNjk1OUYsIDAuNDE0Mjk4NTcxNkYsIDAuNDE0Nzg2NTIwMUYsCisgICAgMC40MTUyNzQ1NDA4RiwgMC40MTU3NjI2MzMwRiwgMC40MTYyNTA3OTYzRiwgMC40MTY3MzkwMzAxRiwKKyAgICAwLjQxNzIyNzMzMzdGLCAwLjQxNzcxNTcwNjdGLCAwLjQxODIwNDE0ODRGLCAwLjQxODY5MjY1ODNGLAorICAgIDAuNDE5MTgxMjM1OUYsIDAuNDE5NjY5ODgwNUYsIDAuNDIwMTU4NTkxNUYsIDAuNDIwNjQ3MzY4NUYsCisgICAgMC40MjExMzYyMTA4RiwgMC40MjE2MjUxMTc5RiwgMC40MjIxMTQwODkyRiwgMC40MjI2MDMxMjQxRiwKKyAgICAwLjQyMzA5MjIyMjFGLCAwLjQyMzU4MTM4MjZGLCAwLjQyNDA3MDYwNTBGLCAwLjQyNDU1OTg4ODdGLAorICAgIDAuNDI1MDQ5MjMzMkYsIDAuNDI1NTM4NjM3OUYsIDAuNDI2MDI4MTAyMkYsIDAuNDI2NTE3NjI1NkYsCisgICAgMC40MjcwMDcyMDc1RiwgMC40Mjc0OTY4NDczRiwgMC40Mjc5ODY1NDQ1RiwgMC40Mjg0NzYyOTg0RiwKKyAgICAwLjQyODk2NjEwODZGLCAwLjQyOTQ1NTk3NDNGLCAwLjQyOTk0NTg5NTFGLCAwLjQzMDQzNTg3MDRGLAorICAgIDAuNDMwOTI1ODk5NkYsIDAuNDMxNDE1OTgyMkYsIDAuNDMxOTA2MTE3NUYsIDAuNDMyMzk2MzA1MEYsCisgICAgMC40MzI4ODY1NDQxRiwgMC40MzMzNzY4MzQyRiwgMC40MzM4NjcxNzQ5RiwgMC40MzQzNTc1NjU0RiwKKyAgICAwLjQzNDg0ODAwNTJGLCAwLjQzNTMzODQ5MzhGLCAwLjQzNTgyOTAzMDZGLCAwLjQzNjMxOTYxNDlGLAorICAgIDAuNDM2ODEwMjQ2M0YsIDAuNDM3MzAwOTI0MUYsIDAuNDM3NzkxNjQ3OEYsIDAuNDM4MjgyNDE2OEYsCisgICAgMC40Mzg3NzMyMzA1RiwgMC40MzkyNjQwODg0RiwgMC40Mzk3NTQ5ODk5RiwgMC40NDAyNDU5MzQzRiwKKyAgICAwLjQ0MDczNjkyMTJGLCAwLjQ0MTIyNzk0OTlGLCAwLjQ0MTcxOTAxOThGLCAwLjQ0MjIxMDEzMDVGLAorICAgIDAuNDQyNzAxMjgxM0YsIDAuNDQzMTkyNDcxN0YsIDAuNDQzNjgzNzAxMEYsIDAuNDQ0MTc0OTY4NkYsCisgICAgMC40NDQ2NjYyNzQyRiwgMC40NDUxNTc2MTY5RiwgMC40NDU2NDg5OTYzRiwgMC40NDYxNDA0MTE4RiwKKyAgICAwLjQ0NjYzMTg2MjhGLCAwLjQ0NzEyMzM0ODdGLCAwLjQ0NzYxNDg2OTBGLCAwLjQ0ODEwNjQyMzBGLAorICAgIDAuNDQ4NTk4MDEwM0YsIDAuNDQ5MDg5NjMwMkYsIDAuNDQ5NTgxMjgyMUYsIDAuNDUwMDcyOTY1NEYsCisgICAgMC40NTA1NjQ2Nzk3RiwgMC40NTEwNTY0MjQzRiwgMC40NTE1NDgxOTg2RiwgMC40NTIwNDAwMDIxRiwKKyAgICAwLjQ1MjUzMTgzNDFGLCAwLjQ1MzAyMzY5NDJGLCAwLjQ1MzUxNTU4MTZGLCAwLjQ1NDAwNzQ5NTlGLAorICAgIDAuNDU0NDk5NDM2NUYsIDAuNDU0OTkxNDAyOEYsIDAuNDU1NDgzMzk0MUYsIDAuNDU1OTc1NDEwMEYsCisgICAgMC40NTY0Njc0NDk5RiwgMC40NTY5NTk1MTMxRiwgMC40NTc0NTE1OTkxRiwgMC40NTc5NDM3MDc0RiwKKyAgICAwLjQ1ODQzNTgzNzJGLCAwLjQ1ODkyNzk4ODFGLCAwLjQ1OTQyMDE1OTVGLCAwLjQ1OTkxMjM1MDhGLAorICAgIDAuNDYwNDA0NTYxNUYsIDAuNDYwODk2NzkwOEYsIDAuNDYxMzg5MDM4M0YsIDAuNDYxODgxMzAzNEYsCisgICAgMC40NjIzNzM1ODU1RiwgMC40NjI4NjU4ODQxRiwgMC40NjMzNTgxOTg0RiwgMC40NjM4NTA1MjgxRiwKKyAgICAwLjQ2NDM0Mjg3MjRGLCAwLjQ2NDgzNTIzMDhGLCAwLjQ2NTMyNzYwMjhGLCAwLjQ2NTgxOTk4NzdGLAorICAgIDAuNDY2MzEyMzg0OUYsIDAuNDY2ODA0Nzk0MEYsIDAuNDY3Mjk3MjE0M0YsIDAuNDY3Nzg5NjQ1MUYsCisgICAgMC40NjgyODIwODYxRiwgMC40Njg3NzQ1MzY1RiwgMC40NjkyNjY5OTU4RiwgMC40Njk3NTk0NjM0RiwKKyAgICAwLjQ3MDI1MTkzODdGLCAwLjQ3MDc0NDQyMTFGLCAwLjQ3MTIzNjkxMDJGLCAwLjQ3MTcyOTQwNTJGLAorICAgIDAuNDcyMjIxOTA1NkYsIDAuNDcyNzE0NDEwOUYsIDAuNDczMjA2OTIwNEYsIDAuNDczNjk5NDMzNkYsCisgICAgMC40NzQxOTE5NDk4RiwgMC40NzQ2ODQ0Njg2RiwgMC40NzUxNzY5ODkzRiwgMC40NzU2Njk1MTEzRiwKKyAgICAwLjQ3NjE2MjAzNDFGLCAwLjQ3NjY1NDU1NzFGLCAwLjQ3NzE0NzA3OTdGLCAwLjQ3NzYzOTYwMTNGLAorICAgIDAuNDc4MTMyMTIxM0YsIDAuNDc4NjI0NjM5MkYsIDAuNDc5MTE3MTU0NEYsIDAuNDc5NjA5NjY2M0YsCisgICAgMC40ODAxMDIxNzQ0RiwgMC40ODA1OTQ2Nzc5RiwgMC40ODEwODcxNzY1RiwgMC40ODE1Nzk2Njk0RiwKKyAgICAwLjQ4MjA3MjE1NjFGLCAwLjQ4MjU2NDYzNjBGLCAwLjQ4MzA1NzEwODZGLCAwLjQ4MzU0OTU3MzJGLAorICAgIDAuNDg0MDQyMDI5M0YsIDAuNDg0NTM0NDc2M0YsIDAuNDg1MDI2OTEzNkYsIDAuNDg1NTE5MzQwN0YsCisgICAgMC40ODYwMTE3NTY5RiwgMC40ODY1MDQxNjE3RiwgMC40ODY5OTY1NTQ1RiwgMC40ODc0ODg5MzQ3RiwKKyAgICAwLjQ4Nzk4MTMwMThGLCAwLjQ4ODQ3MzY1NTFGLCAwLjQ4ODk2NTk5NDFGLCAwLjQ4OTQ1ODMxODJGLAorICAgIDAuNDg5OTUwNjI2OEYsIDAuNDkwNDQyOTE5M0YsIDAuNDkwOTM1MTk1MkYsIDAuNDkxNDI3NDUzOEYsCisgICAgMC40OTE5MTk2OTQ3RiwgMC40OTI0MTE5MTcyRiwgMC40OTI5MDQxMjA3RiwgMC40OTMzOTYzMDQ2RiwKKyAgICAwLjQ5Mzg4ODQ2ODVGLCAwLjQ5NDM4MDYxMTZGLCAwLjQ5NDg3MjczMzVGLCAwLjQ5NTM2NDgzMzVGLAorICAgIDAuNDk1ODU2OTExMEYsIDAuNDk2MzQ4OTY1NkYsIDAuNDk2ODQwOTk2NUYsIDAuNDk3MzMzMDAzMkYsCisgICAgMC40OTc4MjQ5ODUyRiwgMC40OTgzMTY5NDE5RiwgMC40OTg4MDg4NzI2RiwgMC40OTkzMDA3NzY4RiwKKyAgICAwLjQ5OTc5MjY1MzlGLCAwLjUwMDI4NDUwMzRGLCAwLjUwMDc3NjMyNDdGLCAwLjUwMTI2ODExNzFGLAorICAgIDAuNTAxNzU5ODgwMUYsIDAuNTAyMjUxNjEzMkYsIDAuNTAyNzQzMzE1N0YsIDAuNTAzMjM0OTg3MUYsCisgICAgMC41MDM3MjY2MjY4RiwgMC41MDQyMTgyMzQxRiwgMC41MDQ3MDk4MDg2RiwgMC41MDUyMDEzNDk3RiwKKyAgICAwLjUwNTY5Mjg1NjdGLCAwLjUwNjE4NDMyOTJGLCAwLjUwNjY3NTc2NjRGLCAwLjUwNzE2NzE2NzlGLAorICAgIDAuNTA3NjU4NTMzMEYsIDAuNTA4MTQ5ODYxM0YsIDAuNTA4NjQxMTUyMEYsIDAuNTA5MTMyNDA0N0YsCisgICAgMC41MDk2MjM2MTg3RiwgMC41MTAxMTQ3OTM0RiwgMC41MTA2MDU5Mjg0RiwgMC41MTEwOTcwMjMwRiwKKyAgICAwLjUxMTU4ODA3NjZGLCAwLjUxMjA3OTA4ODdGLCAwLjUxMjU3MDA1ODdGLCAwLjUxMzA2MDk4NjBGLAorICAgIDAuNTEzNTUxODcwMEYsIDAuNTE0MDQyNzEwMkYsIDAuNTE0NTMzNTA1OUYsIDAuNTE1MDI0MjU2NkYsCisgICAgMC41MTU1MTQ5NjE4RiwgMC41MTYwMDU2MjA4RiwgMC41MTY0OTYyMzMxRiwgMC41MTY5ODY3OTgwRiwKKyAgICAwLjUxNzQ3NzMxNTFGLCAwLjUxNzk2Nzc4MzdGLCAwLjUxODQ1ODIwMzNGLCAwLjUxODk0ODU3MzNGLAorICAgIDAuNTE5NDM4ODkzMUYsIDAuNTE5OTI5MTYyMUYsIDAuNTIwNDE5Mzc5OEYsIDAuNTIwOTA5NTQ1NUYsCisgICAgMC41MjEzOTk2NTg4RiwgMC41MjE4ODk3MTkwRiwgMC41MjIzNzk3MjU2RiwgMC41MjI4Njk2Nzc5RiwKKyAgICAwLjUyMzM1OTU3NTVGLCAwLjUyMzg0OTQxNzdGLCAwLjUyNDMzOTIwMzlGLCAwLjUyNDgyODkzMzdGLAorICAgIDAuNTI1MzE4NjA2M0YsIDAuNTI1ODA4MjIxM0YsIDAuNTI2Mjk3Nzc4MUYsIDAuNTI2Nzg3Mjc2MEYsCisgICAgMC41MjcyNzY3MTQ2RiwgMC41Mjc3NjYwOTMyRiwgMC41MjgyNTU0MTEyRiwgMC41Mjg3NDQ2NjgyRiwKKyAgICAwLjUyOTIzMzg2MzVGLCAwLjUyOTcyMjk5NjVGLCAwLjUzMDIxMjA2NjdGLCAwLjUzMDcwMTA3MzZGLAorICAgIDAuNTMxMTkwMDE2NEYsIDAuNTMxNjc4ODk0N0YsIDAuNTMyMTY3NzA3OUYsIDAuNTMyNjU2NDU1NEYsCisgICAgMC41MzMxNDUxMzY2RiwgMC41MzM2MzM3NTExRiwgMC41MzQxMjIyOTgxRiwgMC41MzQ2MTA3NzcxRiwKKyAgICAwLjUzNTA5OTE4NzZGLCAwLjUzNTU4NzUyOTBGLCAwLjUzNjA3NTgwMDdGLCAwLjUzNjU2NDAwMjFGLAorICAgIDAuNTM3MDUyMTMyN0YsIDAuNTM3NTQwMTkyMEYsIDAuNTM4MDI4MTc5MkYsIDAuNTM4NTE2MDkzOUYsCisgICAgMC41MzkwMDM5MzU1RiwgMC41Mzk0OTE3MDM0RiwgMC41Mzk5NzkzOTcxRiwgMC41NDA0NjcwMTU5RiwKKyAgICAwLjU0MDk1NDU1OTRGLCAwLjU0MTQ0MjAyNjlGLCAwLjU0MTkyOTQxNzlGLCAwLjU0MjQxNjczMThGLAorICAgIDAuNTQyOTAzOTY4MEYsIDAuNTQzMzkxMTI2MUYsIDAuNTQzODc4MjA1M0YsIDAuNTQ0MzY1MjA1MUYsCisgICAgMC41NDQ4NTIxMjUwRiwgMC41NDUzMzg5NjQ0RiwgMC41NDU4MjU3MjI4RiwgMC41NDYzMTIzOTk1RiwKKyAgICAwLjU0Njc5ODk5NDBGLCAwLjU0NzI4NTUwNTdGLCAwLjU0Nzc3MTkzNDFGLCAwLjU0ODI1ODI3ODZGLAorICAgIDAuNTQ4NzQ0NTM4N0YsIDAuNTQ5MjMwNzEzN0YsIDAuNTQ5NzE2ODAzMUYsIDAuNTUwMjAyODA2M0YsCisgICAgMC41NTA2ODg3MjI4RiwgMC41NTExNzQ1NTIwRiwgMC41NTE2NjAyOTM0RiwgMC41NTIxNDU5NDYzRiwKKyAgICAwLjU1MjYzMTUxMDNGLCAwLjU1MzExNjk4NDdGLCAwLjU1MzYwMjM2OTBGLCAwLjU1NDA4NzY2MjZGLAorICAgIDAuNTU0NTcyODY0OUYsIDAuNTU1MDU3OTc1NUYsIDAuNTU1NTQyOTkzN0YsIDAuNTU2MDI3OTE4OUYsCisgICAgMC41NTY1MTI3NTA3RiwgMC41NTY5OTc0ODg0RiwgMC41NTc0ODIxMzE1RiwgMC41NTc5NjY2Nzk0RiwKKyAgICAwLjU1ODQ1MTEzMTZGLCAwLjU1ODkzNTQ4NzVGLCAwLjU1OTQxOTc0NjVGLCAwLjU1OTkwMzkwODBGLAorICAgIDAuNTYwMzg3OTcxNkYsIDAuNTYwODcxOTM2N0YsIDAuNTYxMzU1ODAyNkYsIDAuNTYxODM5NTY4OUYsCisgICAgMC41NjIzMjMyMzUwRiwgMC41NjI4MDY4MDAyRiwgMC41NjMyOTAyNjQyRiwgMC41NjM3NzM2MjYyRiwKKyAgICAwLjU2NDI1Njg4NThGLCAwLjU2NDc0MDA0MjNGLCAwLjU2NTIyMzA5NTNGLCAwLjU2NTcwNjA0NDJGLAorICAgIDAuNTY2MTg4ODg4M0YsIDAuNTY2NjcxNjI3MkYsIDAuNTY3MTU0MjYwM0YsIDAuNTY3NjM2Nzg3MEYsCisgICAgMC41NjgxMTkyMDY5RiwgMC41Njg2MDE1MTkyRiwgMC41NjkwODM3MjM1RiwgMC41Njk1NjU4MTkyRiwKKyAgICAwLjU3MDA0NzgwNThGLCAwLjU3MDUyOTY4MjdGLCAwLjU3MTAxMTQ0OTRGLCAwLjU3MTQ5MzEwNTJGLAorICAgIDAuNTcxOTc0NjQ5N0YsIDAuNTcyNDU2MDgyMkYsIDAuNTcyOTM3NDAyM0YsIDAuNTczNDE4NjA5NEYsCisgICAgMC41NzM4OTk3MDI5RiwgMC41NzQzODA2ODIzRiwgMC41NzQ4NjE1NDcwRiwgMC41NzUzNDIyOTY1RiwKKyAgICAwLjU3NTgyMjkzMDFGLCAwLjU3NjMwMzQ0NzVGLCAwLjU3Njc4Mzg0ODBGLCAwLjU3NzI2NDEzMTBGLAorICAgIDAuNTc3NzQ0Mjk2MEYsIDAuNTc4MjI0MzQyNkYsIDAuNTc4NzA0MjcwMEYsIDAuNTc5MTg0MDc3OEYsCisgICAgMC41Nzk2NjM3NjU0RiwgMC41ODAxNDMzMzIyRiwgMC41ODA2MjI3Nzc4RiwgMC41ODExMDIxMDE2RiwKKyAgICAwLjU4MTU4MTMwMjlGLCAwLjU4MjA2MDM4MTRGLCAwLjU4MjUzOTMzNjNGLCAwLjU4MzAxODE2NzNGLAorICAgIDAuNTgzNDk2ODczN0YsIDAuNTgzOTc1NDU0OUYsIDAuNTg0NDUzOTEwNUYsIDAuNTg0OTMyMjM5OUYsCisgICAgMC41ODU0MTA0NDI1RiwgMC41ODU4ODg1MTc5RiwgMC41ODYzNjY0NjUzRiwgMC41ODY4NDQyODQ0RiwKKyAgICAwLjU4NzMyMTk3NDZGLCAwLjU4Nzc5OTUzNTNGLCAwLjU4ODI3Njk2NjBGLCAwLjU4ODc1NDI2NjFGLAorICAgIDAuNTg5MjMxNDM1MUYsIDAuNTg5NzA4NDcyNEYsIDAuNTkwMTg1Mzc3NkYsIDAuNTkwNjYyMTUwMEYsCisgICAgMC41OTExMzg3ODkyRiwgMC41OTE2MTUyOTQ1RiwgMC41OTIwOTE2NjU1RiwgMC41OTI1Njc5MDE2RiwKKyAgICAwLjU5MzA0NDAwMjJGLCAwLjU5MzUxOTk2NjlGLCAwLjU5Mzk5NTc5NTBGLCAwLjU5NDQ3MTQ4NjFGLAorICAgIDAuNTk0OTQ3MDM5NkYsIDAuNTk1NDIyNDU1MEYsIDAuNTk1ODk3NzMxN0YsIDAuNTk2MzcyODY5MkYsCisgICAgMC41OTY4NDc4NjY5RiwgMC41OTczMjI3MjQ0RiwgMC41OTc3OTc0NDExRiwgMC41OTgyNzIwMTYzRiwKKyAgICAwLjU5ODc0NjQ0OTdGLCAwLjU5OTIyMDc0MDdGLCAwLjU5OTY5NDg4ODdGLCAwLjYwMDE2ODg5MzJGLAorICAgIDAuNjAwNjQyNzUzN0YsIDAuNjAxMTE2NDY5NkYsIDAuNjAxNTkwMDQwNUYsIDAuNjAyMDYzNDY1N0YsCisgICAgMC42MDI1MzY3NDQ3RiwgMC42MDMwMDk4NzcwRiwgMC42MDM0ODI4NjIxRiwgMC42MDM5NTU2OTk1RiwKKyAgICAwLjYwNDQyODM4ODVGLCAwLjYwNDkwMDkyODhGLCAwLjYwNTM3MzMxOTZGLCAwLjYwNTg0NTU2MDZGLAorICAgIDAuNjA2MzE3NjUxMkYsIDAuNjA2Nzg5NTkwOUYsIDAuNjA3MjYxMzc5MEYsIDAuNjA3NzMzMDE1MkYsCisgICAgMC42MDgyMDQ0OTg5RiwgMC42MDg2NzU4Mjk1RiwgMC42MDkxNDcwMDY1RiwgMC42MDk2MTgwMjk0RiwKKyAgICAwLjYxMDA4ODg5NzdGLCAwLjYxMDU1OTYxMDhGLCAwLjYxMTAzMDE2ODJGLCAwLjYxMTUwMDU2OTRGLAorICAgIDAuNjExOTcwODEzOUYsIDAuNjEyNDQwOTAxMUYsIDAuNjEyOTEwODMwNUYsIDAuNjEzMzgwNjAxN0YsCisgICAgMC42MTM4NTAyMTM5RiwgMC42MTQzMTk2NjY5RiwgMC42MTQ3ODg5NTk5RiwgMC42MTUyNTgwOTI2RiwKKyAgICAwLjYxNTcyNzA2NDNGLCAwLjYxNjE5NTg3NDZGLCAwLjYxNjY2NDUyMzBGLCAwLjYxNzEzMzAwODhGLAorICAgIDAuNjE3NjAxMzMxN0YsIDAuNjE4MDY5NDkxMEYsIDAuNjE4NTM3NDg2M0YsIDAuNjE5MDA1MzE3MUYsCisgICAgMC42MTk0NzI5ODI3RiwgMC42MTk5NDA0ODI4RiwgMC42MjA0MDc4MTY3RiwgMC42MjA4NzQ5ODQxRiwKKyAgICAwLjYyMTM0MTk4NDJGLCAwLjYyMTgwODgxNjhGLCAwLjYyMjI3NTQ4MTFGLCAwLjYyMjc0MTk3NjhGLAorICAgIDAuNjIzMjA4MzAzMkYsIDAuNjIzNjc0NDYwMEYsIDAuNjI0MTQwNDQ2NUYsIDAuNjI0NjA2MjYyMkYsCisgICAgMC42MjUwNzE5MDY3RiwgMC42MjU1MzczNzk1RiwgMC42MjYwMDI2Nzk5RiwgMC42MjY0Njc4MDc2RiwKKyAgICAwLjYyNjkzMjc2MTlGLCAwLjYyNzM5NzU0MjVGLCAwLjYyNzg2MjE0ODdGLCAwLjYyODMyNjU4MDBGLAorICAgIDAuNjI4NzkwODM2MUYsIDAuNjI5MjU0OTE2M0YsIDAuNjI5NzE4ODIwMUYsIDAuNjMwMTgyNTQ3MUYsCisgICAgMC42MzA2NDYwOTY2RiwgMC42MzExMDk0NjgzRiwgMC42MzE1NzI2NjE3RiwgMC42MzIwMzU2NzYxRiwKKyAgICAwLjYzMjQ5ODUxMTFGLCAwLjYzMjk2MTE2NjJGLCAwLjYzMzQyMzY0MTBGLCAwLjYzMzg4NTkzNDhGLAorICAgIDAuNjM0MzQ4MDQ3MkYsIDAuNjM0ODA5OTc3N0YsIDAuNjM1MjcxNzI1N0YsIDAuNjM1NzMzMjkwOUYsCisgICAgMC42MzYxOTQ2NzI2RiwgMC42MzY2NTU4NzA0RiwgMC42MzcxMTY4ODM3RiwgMC42Mzc1Nzc3MTIyRiwKKyAgICAwLjYzODAzODM1NTJGLCAwLjYzODQ5ODgxMjNGLCAwLjYzODk1OTA4MzBGLCAwLjYzOTQxOTE2NjhGLAorICAgIDAuNjM5ODc5MDYzMUYsIDAuNjQwMzM4NzcxNkYsIDAuNjQwNzk4MjkxNkYsIDAuNjQxMjU3NjIyOEYsCisgICAgMC42NDE3MTY3NjQ1RiwgMC42NDIxNzU3MTYzRiwgMC42NDI2MzQ0Nzc4RiwgMC42NDMwOTMwNDgzRiwKKyAgICAwLjY0MzU1MTQyNzVGLCAwLjY0NDAwOTYxNDlGLCAwLjY0NDQ2NzYwOThGLCAwLjY0NDkyNTQxMTlGLAorICAgIDAuNjQ1MzgzMDIwN0YsIDAuNjQ1ODQwNDM1NkYsIDAuNjQ2Mjk3NjU2MkYsIDAuNjQ2NzU0NjgyMEYsCisgICAgMC42NDcyMTE1MTI1RiwgMC42NDc2NjgxNDcyRiwgMC42NDgxMjQ1ODU2RiwgMC42NDg1ODA4MjczRiwKKyAgICAwLjY0OTAzNjg3MTdGLCAwLjY0OTQ5MjcxODNGLCAwLjY0OTk0ODM2NjdGLCAwLjY1MDQwMzgxNjRGLAorICAgIDAuNjUwODU5MDY3MEYsIDAuNjUxMzE0MTE3OEYsIDAuNjUxNzY4OTY4NEYsIDAuNjUyMjIzNjE4NUYsCisgICAgMC42NTI2NzgwNjczRiwgMC42NTMxMzIzMTQ2RiwgMC42NTM1ODYzNTk4RiwgMC42NTQwNDAyMDI0RiwKKyAgICAwLjY1NDQ5Mzg0MTlGLCAwLjY1NDk0NzI3NzlGLCAwLjY1NTQwMDUwOTlGLCAwLjY1NTg1MzUzNzNGLAorICAgIDAuNjU2MzA2MzU5OEYsIDAuNjU2NzU4OTc2OUYsIDAuNjU3MjExMzg4MEYsIDAuNjU3NjYzNTkyN0YsCisgICAgMC42NTgxMTU1OTA2RiwgMC42NTg1NjczODEwRiwgMC42NTkwMTg5NjM3RiwgMC42NTk0NzAzMzgwRiwKKyAgICAwLjY1OTkyMTUwMzVGLCAwLjY2MDM3MjQ1OThGLCAwLjY2MDgyMzIwNjRGLCAwLjY2MTI3Mzc0MjdGLAorICAgIDAuNjYxNzI0MDY4NEYsIDAuNjYyMTc0MTgyOUYsIDAuNjYyNjI0MDg1OUYsIDAuNjYzMDczNzc2N0YsCisgICAgMC42NjM1MjMyNTUwRiwgMC42NjM5NzI1MjAyRiwgMC42NjQ0MjE1NzIwRiwgMC42NjQ4NzA0MDk4RiwKKyAgICAwLjY2NTMxOTAzMzJGLCAwLjY2NTc2NzQ0MTdGLCAwLjY2NjIxNTYzNDhGLCAwLjY2NjY2MzYxMjFGLAorICAgIDAuNjY3MTExMzczMUYsIDAuNjY3NTU4OTE3NEYsIDAuNjY4MDA2MjQ0NUYsIDAuNjY4NDUzMzUzOEYsCisgICAgMC42Njg5MDAyNDUwRiwgMC42NjkzNDY5MTc3RiwgMC42Njk3OTMzNzEyRiwgMC42NzAyMzk2MDUyRiwKKyAgICAwLjY3MDY4NTYxOTNGLCAwLjY3MTEzMTQxMjlGLCAwLjY3MTU3Njk4NTVGLCAwLjY3MjAyMjMzNjlGLAorICAgIDAuNjcyNDY3NDY2NEYsIDAuNjcyOTEyMzczNkYsIDAuNjczMzU3MDU4MUYsIDAuNjczODAxNTE5NEYsCisgICAgMC42NzQyNDU3NTcwRiwgMC42NzQ2ODk3NzA2RiwgMC42NzUxMzM1NTk2RiwgMC42NzU1NzcxMjM2RiwKKyAgICAwLjY3NjAyMDQ2MjFGLCAwLjY3NjQ2MzU3NDdGLCAwLjY3NjkwNjQ2MDlGLCAwLjY3NzM0OTEyMDRGLAorICAgIDAuNjc3NzkxNTUyNUYsIDAuNjc4MjMzNzU3MEYsIDAuNjc4Njc1NzMzMkYsIDAuNjc5MTE3NDgwOUYsCisgICAgMC42Nzk1NTg5OTk1RiwgMC42ODAwMDAyODg2RiwgMC42ODA0NDEzNDc3RiwgMC42ODA4ODIxNzY1RiwKKyAgICAwLjY4MTMyMjc3NDNGLCAwLjY4MTc2MzE0MDlGLCAwLjY4MjIwMzI3NThGLCAwLjY4MjY0MzE3ODVGLAorICAgIDAuNjgzMDgyODQ4NUYsIDAuNjgzNTIyMjg1NUYsIDAuNjgzOTYxNDg5MEYsIDAuNjg0NDAwNDU4NUYsCisgICAgMC42ODQ4MzkxOTM2RiwgMC42ODUyNzc2OTM5RiwgMC42ODU3MTU5NTg5RiwgMC42ODYxNTM5ODgzRiwKKyAgICAwLjY4NjU5MTc4MTVGLCAwLjY4NzAyOTMzODFGLCAwLjY4NzQ2NjY1NzZGLCAwLjY4NzkwMzczOThGLAorICAgIDAuNjg4MzQwNTg0MEYsIDAuNjg4Nzc3MTg5OUYsIDAuNjg5MjEzNTU3MUYsIDAuNjg5NjQ5Njg1MEYsCisgICAgMC42OTAwODU1NzMzRiwgMC42OTA1MjEyMjE2RiwgMC42OTA5NTY2Mjk0RiwgMC42OTEzOTE3OTYzRiwKKyAgICAwLjY5MTgyNjcyMThGLCAwLjY5MjI2MTQwNTVGLCAwLjY5MjY5NTg0NzFGLCAwLjY5MzEzMDA0NTlGLAorICAgIDAuNjkzNTY0MDAxOEYsIDAuNjkzOTk3NzE0MUYsIDAuNjk0NDMxMTgyNUYsIDAuNjk0ODY0NDA2NkYsCisgICAgMC42OTUyOTczODU5RiwgMC42OTU3MzAxMjAwRiwgMC42OTYxNjI2MDg1RiwgMC42OTY1OTQ4NTEwRiwKKyAgICAwLjY5NzAyNjg0NzBGLCAwLjY5NzQ1ODU5NjFGLCAwLjY5Nzg5MDA5ODBGLCAwLjY5ODMyMTM1MjFGLAorICAgIDAuNjk4NzUyMzU4MEYsIDAuNjk5MTgzMTE1NEYsIDAuNjk5NjEzNjIzOEYsIDAuNzAwMDQzODgyOEYsCisgICAgMC43MDA0NzM4OTIxRiwgMC43MDA5MDM2NTEwRiwgMC43MDEzMzMxNTk0RiwgMC43MDE3NjI0MTY2RiwKKyAgICAwLjcwMjE5MTQyMjRGLCAwLjcwMjYyMDE3NjNGLCAwLjcwMzA0ODY3NzlGLCAwLjcwMzQ3NjkyNjhGLAorICAgIDAuNzAzOTA0OTIyNkYsIDAuNzA0MzMyNjY0OEYsIDAuNzA0NzYwMTUzMUYsIDAuNzA1MTg3Mzg3MEYsCisgICAgMC43MDU2MTQzNjYyRiwgMC43MDYwNDEwOTAyRiwgMC43MDY0Njc1NTg2RiwgMC43MDY4OTM3NzExRiwKKyAgICAwLjcwNzMxOTcyNzFGLCAwLjcwNzc0NTQyNjRGLCAwLjcwODE3MDg2ODRGLCAwLjcwODU5NjA1MjlGLAorICAgIDAuNzA5MDIwOTc5M0YsIDAuNzA5NDQ1NjQ3NEYsIDAuNzA5ODcwMDU2NkYsIDAuNzEwMjk0MjA2NkYsCisgICAgMC43MTA3MTgwOTcwRiwgMC43MTExNDE3Mjc0RiwgMC43MTE1NjUwOTc0RiwgMC43MTE5ODgyMDY2RiwKKyAgICAwLjcxMjQxMTA1NDVGLCAwLjcxMjgzMzY0MDlGLCAwLjcxMzI1NTk2NTNGLCAwLjcxMzY3ODAyNzJGLAorICAgIDAuNzE0MDk5ODI2NEYsIDAuNzE0NTIxMzYyNEYsIDAuNzE0OTQyNjM0OEYsIDAuNzE1MzYzNjQzM0YsCisgICAgMC43MTU3ODQzODc0RiwgMC43MTYyMDQ4NjY4RiwgMC43MTY2MjUwODEwRiwgMC43MTcwNDUwMjk2RiwKKyAgICAwLjcxNzQ2NDcxMjRGLCAwLjcxNzg4NDEyODlGLCAwLjcxODMwMzI3ODZGLCAwLjcxODcyMjE2MTNGLAorICAgIDAuNzE5MTQwNzc2NUYsIDAuNzE5NTU5MTIzOUYsIDAuNzE5OTc3MjAzMEYsIDAuNzIwMzk1MDEzNUYsCisgICAgMC43MjA4MTI1NTUwRiwgMC43MjEyMjk4MjcxRiwgMC43MjE2NDY4Mjk0RiwgMC43MjIwNjM1NjE2RiwKKyAgICAwLjcyMjQ4MDAyMzNGLCAwLjcyMjg5NjIxNDBGLCAwLjcyMzMxMjEzMzVGLCAwLjcyMzcyNzc4MTNGLAorICAgIDAuNzI0MTQzMTU3MUYsIDAuNzI0NTU4MjYwNEYsIDAuNzI0OTczMDkxMEYsIDAuNzI1Mzg3NjQ4NEYsCisgICAgMC43MjU4MDE5MzIyRiwgMC43MjYyMTU5NDIyRiwgMC43MjY2Mjk2Nzc4RiwgMC43MjcwNDMxMzg4RiwKKyAgICAwLjcyNzQ1NjMyNDdGLCAwLjcyNzg2OTIzNTNGLCAwLjcyODI4MTg3MDBGLCAwLjcyODY5NDIyODdGLAorICAgIDAuNzI5MTA2MzEwOEYsIDAuNzI5NTE4MTE2MEYsIDAuNzI5OTI5NjQ0MEYsIDAuNzMwMzQwODk0NEYsCisgICAgMC43MzA3NTE4NjY5RiwgMC43MzExNjI1NjA5RiwgMC43MzE1NzI5NzYzRiwgMC43MzE5ODMxMTI2RiwKKyAgICAwLjczMjM5Mjk2OTVGLCAwLjczMjgwMjU0NjZGLCAwLjczMzIxMTg0MzVGLCAwLjczMzYyMDg2MDBGLAorICAgIDAuNzM0MDI5NTk1NUYsIDAuNzM0NDM4MDQ5OUYsIDAuNzM0ODQ2MjIyNkYsIDAuNzM1MjU0MTEzNEYsCisgICAgMC43MzU2NjE3MjIwRiwgMC43MzYwNjkwNDc4RiwgMC43MzY0NzYwOTA3RiwgMC43MzY4ODI4NTAyRiwKKyAgICAwLjczNzI4OTMyNTlGLCAwLjczNzY5NTUxNzZGLCAwLjczODEwMTQyNDlGLCAwLjczODUwNzA0NzVGLAorICAgIDAuNzM4OTEyMzg0OUYsIDAuNzM5MzE3NDM2OEYsIDAuNzM5NzIyMjAyOUYsIDAuNzQwMTI2NjgyOUYsCisgICAgMC43NDA1MzA4NzYzRiwgMC43NDA5MzQ3ODI5RiwgMC43NDEzMzg0MDIzRiwgMC43NDE3NDE3MzQxRiwKKyAgICAwLjc0MjE0NDc3ODBGLCAwLjc0MjU0NzUzMzhGLCAwLjc0Mjk1MDAwMDlGLCAwLjc0MzM1MjE3OTFGLAorICAgIDAuNzQzNzU0MDY4MUYsIDAuNzQ0MTU1NjY3NEYsIDAuNzQ0NTU2OTc2OUYsIDAuNzQ0OTU3OTk2MEYsCisgICAgMC43NDUzNTg3MjQ1RiwgMC43NDU3NTkxNjIxRiwgMC43NDYxNTkzMDg0RiwgMC43NDY1NTkxNjMxRiwKKyAgICAwLjc0Njk1ODcyNTlGLCAwLjc0NzM1Nzk5NjNGLCAwLjc0Nzc1Njk3NDFGLCAwLjc0ODE1NTY1OTBGLAorICAgIDAuNzQ4NTU0MDUwNkYsIDAuNzQ4OTUyMTQ4NkYsIDAuNzQ5MzQ5OTUyNkYsIDAuNzQ5NzQ3NDYyM0YsCisgICAgMC43NTAxNDQ2Nzc1RiwgMC43NTA1NDE1OTc3RiwgMC43NTA5MzgyMjI3RiwgMC43NTEzMzQ1NTIxRiwKKyAgICAwLjc1MTczMDU4NTZGLCAwLjc1MjEyNjMyMjlGLCAwLjc1MjUyMTc2MzZGLCAwLjc1MjkxNjkwNzRGLAorICAgIDAuNzUzMzExNzU0MUYsIDAuNzUzNzA2MzAzMkYsIDAuNzU0MTAwNTU0NUYsIDAuNzU0NDk0NTA3NkYsCisgICAgMC43NTQ4ODgxNjIzRiwgMC43NTUyODE1MTgyRiwgMC43NTU2NzQ1NzQ5RiwgMC43NTYwNjczMzIzRiwKKyAgICAwLjc1NjQ1OTc4OTlGLCAwLjc1Njg1MTk0NzRGLCAwLjc1NzI0MzgwNDZGLCAwLjc1NzYzNTM2MTFGLAorICAgIDAuNzU4MDI2NjE2NkYsIDAuNzU4NDE3NTcwOEYsIDAuNzU4ODA4MjIzNUYsIDAuNzU5MTk4NTc0MUYsCisgICAgMC43NTk1ODg2MjI2RiwgMC43NTk5NzgzNjg1RiwgMC43NjAzNjc4MTE2RiwgMC43NjA3NTY5NTE1RiwKKyAgICAwLjc2MTE0NTc4NzlGLCAwLjc2MTUzNDMyMDZGLCAwLjc2MTkyMjU0OTNGLCAwLjc2MjMxMDQ3MzVGLAorICAgIDAuNzYyNjk4MDkzMUYsIDAuNzYzMDg1NDA3OEYsIDAuNzYzNDcyNDE3MUYsIDAuNzYzODU5MTIwOUYsCisgICAgMC43NjQyNDU1MTg4RiwgMC43NjQ2MzE2MTA2RiwgMC43NjUwMTczOTU5RiwgMC43NjU0MDI4NzQ0RiwKKyAgICAwLjc2NTc4ODA0NTlGLCAwLjc2NjE3MjkxMDBGLCAwLjc2NjU1NzQ2NjRGLCAwLjc2Njk0MTcxNTBGLAorICAgIDAuNzY3MzI1NjU1M0YsIDAuNzY3NzA5Mjg3MUYsIDAuNzY4MDkyNjEwMEYsIDAuNzY4NDc1NjIzOUYsCisgICAgMC43Njg4NTgzMjg0RiwgMC43NjkyNDA3MjMyRiwgMC43Njk2MjI4MDgwRiwgMC43NzAwMDQ1ODI2RiwKKyAgICAwLjc3MDM4NjA0NjdGLCAwLjc3MDc2NzE5OTlGLCAwLjc3MTE0ODA0MjBGLCAwLjc3MTUyODU3MjhGLAorICAgIDAuNzcxOTA4NzkxOEYsIDAuNzcyMjg4Njk4OUYsIDAuNzcyNjY4MjkzOEYsIDAuNzczMDQ3NTc2MkYsCisgICAgMC43NzM0MjY1NDU4RiwgMC43NzM4MDUyMDIzRiwgMC43NzQxODM1NDU0RiwgMC43NzQ1NjE1NzUwRiwKKyAgICAwLjc3NDkzOTI5MDZGLCAwLjc3NTMxNjY5MjFGLCAwLjc3NTY5Mzc3OTFGLCAwLjc3NjA3MDU1MTRGLAorICAgIDAuNzc2NDQ3MDA4N0YsIDAuNzc2ODIzMTUwOEYsIDAuNzc3MTk4OTc3M0YsIDAuNzc3NTc0NDg4MEYsCisgICAgMC43Nzc5NDk2ODI3RiwgMC43NzgzMjQ1NjEwRiwgMC43Nzg2OTkxMjI3RiwgMC43NzkwNzMzNjc2RiwKKyAgICAwLjc3OTQ0NzI5NTNGLCAwLjc3OTgyMDkwNTZGLCAwLjc4MDE5NDE5ODJGLCAwLjc4MDU2NzE3MjlGLAorICAgIDAuNzgwOTM5ODI5NEYsIDAuNzgxMzEyMTY3NUYsIDAuNzgxNjg0MTg2OUYsIDAuNzgyMDU1ODg3M0YsCisgICAgMC43ODI0MjcyNjg0RiwgMC43ODI3OTgzMzAxRiwgMC43ODMxNjkwNzIwRiwgMC43ODM1Mzk0OTQwRiwKKyAgICAwLjc4MzkwOTU5NTdGLCAwLjc4NDI3OTM3NjhGLCAwLjc4NDY0ODgzNzNGLCAwLjc4NTAxNzk3NjdGLAorICAgIDAuNzg1Mzg2Nzk0OEYsIDAuNzg1NzU1MjkxNEYsIDAuNzg2MTIzNDY2M0YsIDAuNzg2NDkxMzE5MUYsCisgICAgMC43ODY4NTg4NDk3RiwgMC43ODcyMjYwNTc4RiwgMC43ODc1OTI5NDMxRiwgMC43ODc5NTk1MDU1RiwKKyAgICAwLjc4ODMyNTc0NDVGLCAwLjc4ODY5MTY2MDFGLCAwLjc4OTA1NzI1MjBGLCAwLjc4OTQyMjUxOThGLAorICAgIDAuNzg5Nzg3NDYzNUYsIDAuNzkwMTUyMDgyN0YsIDAuNzkwNTE2Mzc3MkYsIDAuNzkwODgwMzQ2OEYsCisgICAgMC43OTEyNDM5OTEyRiwgMC43OTE2MDczMTAyRiwgMC43OTE5NzAzMDM1RiwgMC43OTIzMzI5NzEwRiwKKyAgICAwLjc5MjY5NTMxMjRGLCAwLjc5MzA1NzMyNzRGLCAwLjc5MzQxOTAxNThGLCAwLjc5Mzc4MDM3NzRGLAorICAgIDAuNzk0MTQxNDEyMEYsIDAuNzk0NTAyMTE5M0YsIDAuNzk0ODYyNDk5MUYsIDAuNzk1MjIyNTUxMUYsCisgICAgMC43OTU1ODIyNzUyRiwgMC43OTU5NDE2NzExRiwgMC43OTYzMDA3Mzg3RiwgMC43OTY2NTk0Nzc1RiwKKyAgICAwLjc5NzAxNzg4NzVGLCAwLjc5NzM3NTk2ODVGLCAwLjc5NzczMzcyMDFGLCAwLjc5ODA5MTE0MjJGLAorICAgIDAuNzk4NDQ4MjM0NkYsIDAuNzk4ODA0OTk3MEYsIDAuNzk5MTYxNDI5MkYsIDAuNzk5NTE3NTMxMEYsCisgICAgMC43OTk4NzMzMDIyRiwgMC44MDAyMjg3NDI2RiwgMC44MDA1ODM4NTE5RiwgMC44MDA5Mzg2Mjk5RiwKKyAgICAwLjgwMTI5MzA3NjVGLCAwLjgwMTY0NzE5MTRGLCAwLjgwMjAwMDk3NDRGLCAwLjgwMjM1NDQyNTNGLAorICAgIDAuODAyNzA3NTQzOEYsIDAuODAzMDYwMzI5OEYsIDAuODAzNDEyNzgzMUYsIDAuODAzNzY0OTAzNUYsCisgICAgMC44MDQxMTY2OTA2RiwgMC44MDQ0NjgxNDQ1RiwgMC44MDQ4MTkyNjQ3RiwgMC44MDUxNzAwNTEyRiwKKyAgICAwLjgwNTUyMDUwMzhGLCAwLjgwNTg3MDYyMjJGLCAwLjgwNjIyMDQwNjJGLCAwLjgwNjU2OTg1NTZGLAorICAgIDAuODA2OTE4OTcwMkYsIDAuODA3MjY3NzQ5OUYsIDAuODA3NjE2MTk0NEYsIDAuODA3OTY0MzAzNkYsCisgICAgMC44MDgzMTIwNzcyRiwgMC44MDg2NTk1MTUxRiwgMC44MDkwMDY2MTcwRiwgMC44MDkzNTMzODI3RiwKKyAgICAwLjgwOTY5OTgxMjJGLCAwLjgxMDA0NTkwNTFGLCAwLjgxMDM5MTY2MTNGLCAwLjgxMDczNzA4MDZGLAorICAgIDAuODExMDgyMTYyOEYsIDAuODExNDI2OTA3N0YsIDAuODExNzcxMzE1MUYsIDAuODEyMTE1Mzg0OUYsCisgICAgMC44MTI0NTkxMTY5RiwgMC44MTI4MDI1MTA4RiwgMC44MTMxNDU1NjY2RiwgMC44MTM0ODgyODM5RiwKKyAgICAwLjgxMzgzMDY2MjdGLCAwLjgxNDE3MjcwMjdGLCAwLjgxNDUxNDQwMzhGLCAwLjgxNDg1NTc2NThGLAorICAgIDAuODE1MTk2Nzg4NkYsIDAuODE1NTM3NDcxOEYsIDAuODE1ODc3ODE1NEYsIDAuODE2MjE3ODE5MkYsCisgICAgMC44MTY1NTc0ODMwRiwgMC44MTY4OTY4MDY3RiwgMC44MTcyMzU3OTAwRiwgMC44MTc1NzQ0MzI4RiwKKyAgICAwLjgxNzkxMjczNDlGLCAwLjgxODI1MDY5NjJGLCAwLjgxODU4ODMxNjRGLCAwLjgxODkyNTU5NTVGLAorICAgIDAuODE5MjYyNTMzMkYsIDAuODE5NTk5MTI5NUYsIDAuODE5OTM1Mzg0MEYsIDAuODIwMjcxMjk2N0YsCisgICAgMC44MjA2MDY4NjczRiwgMC44MjA5NDIwOTU4RiwgMC44MjEyNzY5ODIwRiwgMC44MjE2MTE1MjU2RiwKKyAgICAwLjgyMTk0NTcyNjZGLCAwLjgyMjI3OTU4NDhGLCAwLjgyMjYxMzEwMDBGLCAwLjgyMjk0NjI3MjFGLAorICAgIDAuODIzMjc5MTAwOUYsIDAuODIzNjExNTg2M0YsIDAuODIzOTQzNzI4MEYsIDAuODI0Mjc1NTI2MEYsCisgICAgMC44MjQ2MDY5ODAxRiwgMC44MjQ5MzgwOTAxRiwgMC44MjUyNjg4NTU5RiwgMC44MjU1OTkyNzc0RiwKKyAgICAwLjgyNTkyOTM1NDRGLCAwLjgyNjI1OTA4NjdGLCAwLjgyNjU4ODQ3NDFGLCAwLjgyNjkxNzUxNjdGLAorICAgIDAuODI3MjQ2MjE0MUYsIDAuODI3NTc0NTY2M0YsIDAuODI3OTAyNTczMkYsIDAuODI4MjMwMjM0NEYsCisgICAgMC44Mjg1NTc1NTAxRiwgMC44Mjg4ODQ1MTk5RiwgMC44MjkyMTExNDM3RiwgMC44Mjk1Mzc0MjE1RiwKKyAgICAwLjgyOTg2MzM1MzBGLCAwLjgzMDE4ODkzODJGLCAwLjgzMDUxNDE3NjhGLCAwLjgzMDgzOTA2ODhGLAorICAgIDAuODMxMTYzNjE0MUYsIDAuODMxNDg3ODEyNEYsIDAuODMxODExNjYzN0YsIDAuODMyMTM1MTY3OEYsCisgICAgMC44MzI0NTgzMjQ2RiwgMC44MzI3ODExMzQwRiwgMC44MzMxMDM1OTU3RiwgMC44MzM0MjU3MDk4RiwKKyAgICAwLjgzMzc0NzQ3NjFGLCAwLjgzNDA2ODg5NDRGLCAwLjgzNDM4OTk2NDdGLCAwLjgzNDcxMDY4NjdGLAorICAgIDAuODM1MDMxMDYwNUYsIDAuODM1MzUxMDg1N0YsIDAuODM1NjcwNzYyNEYsIDAuODM1OTkwMDkwNEYsCisgICAgMC44MzYzMDkwNjk2RiwgMC44MzY2Mjc2OTk5RiwgMC44MzY5NDU5ODExRiwgMC44MzcyNjM5MTMxRiwKKyAgICAwLjgzNzU4MTQ5NThGLCAwLjgzNzg5ODcyOTJGLCAwLjgzODIxNTYxMzBGLCAwLjgzODUzMjE0NzJGLAorICAgIDAuODM4ODQ4MzMxNkYsIDAuODM5MTY0MTY2MkYsIDAuODM5NDc5NjUwOEYsIDAuODM5Nzk0Nzg1M0YsCisgICAgMC44NDAxMDk1Njk3RiwgMC44NDA0MjQwMDM3RiwgMC44NDA3MzgwODczRiwgMC44NDEwNTE4MjA0RiwKKyAgICAwLjg0MTM2NTIwMjlGLCAwLjg0MTY3ODIzNDdGLCAwLjg0MTk5MDkxNTZGLCAwLjg0MjMwMzI0NTZGLAorICAgIDAuODQyNjE1MjI0NUYsIDAuODQyOTI2ODUyM0YsIDAuODQzMjM4MTI4OUYsIDAuODQzNTQ5MDU0MUYsCisgICAgMC44NDM4NTk2Mjc5RiwgMC44NDQxNjk4NTAyRiwgMC44NDQ0Nzk3MjA4RiwgMC44NDQ3ODkyMzk2RiwKKyAgICAwLjg0NTA5ODQwNjdGLCAwLjg0NTQwNzIyMThGLCAwLjg0NTcxNTY4NDlGLCAwLjg0NjAyMzc5NTlGLAorICAgIDAuODQ2MzMxNTU0N0YsIDAuODQ2NjM4OTYxMkYsIDAuODQ2OTQ2MDE1NEYsIDAuODQ3MjUyNzE3MEYsCisgICAgMC44NDc1NTkwNjYxRiwgMC44NDc4NjUwNjI1RiwgMC44NDgxNzA3MDYzRiwgMC44NDg0NzU5OTcxRiwKKyAgICAwLjg0ODc4MDkzNTFGLCAwLjg0OTA4NTUyMDFGLCAwLjg0OTM4OTc1MjFGLCAwLjg0OTY5MzYzMDhGLAorICAgIDAuODQ5OTk3MTU2NEYsIDAuODUwMzAwMzI4NkYsIDAuODUwNjAzMTQ3NEYsIDAuODUwOTA1NjEyOEYsCisgICAgMC44NTEyMDc3MjQ2RiwgMC44NTE1MDk0ODI4RiwgMC44NTE4MTA4ODcyRiwgMC44NTIxMTE5Mzc5RiwKKyAgICAwLjg1MjQxMjYzNDhGLCAwLjg1MjcxMjk3NzdGLCAwLjg1MzAxMjk2NjZGLCAwLjg1MzMxMjYwMTVGLAorICAgIDAuODUzNjExODgyMkYsIDAuODUzOTEwODA4N0YsIDAuODU0MjA5MzgwOUYsIDAuODU0NTA3NTk4OEYsCisgICAgMC44NTQ4MDU0NjIzRiwgMC44NTUxMDI5NzEyRiwgMC44NTU0MDAxMjU3RiwgMC44NTU2OTY5MjU1RiwKKyAgICAwLjg1NTk5MzM3MDdGLCAwLjg1NjI4OTQ2MTFGLCAwLjg1NjU4NTE5NjhGLCAwLjg1Njg4MDU3NzVGLAorICAgIDAuODU3MTc1NjAzNEYsIDAuODU3NDcwMjc0M0YsIDAuODU3NzY0NTkwMkYsIDAuODU4MDU4NTUwOUYsCisgICAgMC44NTgzNTIxNTY2RiwgMC44NTg2NDU0MDcwRiwgMC44NTg5MzgzMDIxRiwgMC44NTkyMzA4NDIwRiwKKyAgICAwLjg1OTUyMzAyNjVGLCAwLjg1OTgxNDg1NTZGLCAwLjg2MDEwNjMyOTJGLCAwLjg2MDM5NzQ0NzNGLAorICAgIDAuODYwNjg4MjA5OEYsIDAuODYwOTc4NjE2N0YsIDAuODYxMjY4NjY4MEYsIDAuODYxNTU4MzYzNkYsCisgICAgMC44NjE4NDc3MDM0RiwgMC44NjIxMzY2ODc0RiwgMC44NjI0MjUzMTU2RiwgMC44NjI3MTM1ODc4RiwKKyAgICAwLjg2MzAwMTUwNDJGLCAwLjg2MzI4OTA2NDZGLCAwLjg2MzU3NjI2OTBGLCAwLjg2Mzg2MzExNzNGLAorICAgIDAuODY0MTQ5NjA5NkYsIDAuODY0NDM1NzQ1N0YsIDAuODY0NzIxNTI1N0YsIDAuODY1MDA2OTQ5NUYsCisgICAgMC44NjUyOTIwMTcxRiwgMC44NjU1NzY3MjgzRiwgMC44NjU4NjEwODMzRiwgMC44NjYxNDUwODIwRiwKKyAgICAwLjg2NjQyODcyNDNGLCAwLjg2NjcxMjAxMDJGLCAwLjg2Njk5NDkzOTdGLCAwLjg2NzI3NzUxMjdGLAorICAgIDAuODY3NTU5NzI5M0YsIDAuODY3ODQxNTg5NEYsIDAuODY4MTIzMDkyOUYsIDAuODY4NDA0MjM5OEYsCisgICAgMC44Njg2ODUwMzAyRiwgMC44Njg5NjU0NjQwRiwgMC44NjkyNDU1NDEyRiwgMC44Njk1MjUyNjE3RiwKKyAgICAwLjg2OTgwNDYyNTVGLCAwLjg3MDA4MzYzMjdGLCAwLjg3MDM2MjI4MzFGLCAwLjg3MDY0MDU3NjhGLAorICAgIDAuODcwOTE4NTEzOEYsIDAuODcxMTk2MDk0MEYsIDAuODcxNDczMzE3NEYsIDAuODcxNzUwMTg0MEYsCisgICAgMC44NzIwMjY2OTM5RiwgMC44NzIzMDI4NDY5RiwgMC44NzI1Nzg2NDMwRiwgMC44NzI4NTQwODI0RiwKKyAgICAwLjg3MzEyOTE2NDhGLCAwLjg3MzQwMzg5MDVGLCAwLjg3MzY3ODI1OTJGLCAwLjg3Mzk1MjI3MTFGLAorICAgIDAuODc0MjI1OTI2MUYsIDAuODc0NDk5MjI0MkYsIDAuODc0NzcyMTY1M0YsIDAuODc1MDQ0NzQ5NkYsCisgICAgMC44NzUzMTY5NzcwRiwgMC44NzU1ODg4NDc1RiwgMC44NzU4NjAzNjExRiwgMC44NzYxMzE1MTc3RiwKKyAgICAwLjg3NjQwMjMxNzVGLCAwLjg3NjY3Mjc2MDNGLCAwLjg3Njk0Mjg0NjJGLCAwLjg3NzIxMjU3NTJGLAorICAgIDAuODc3NDgxOTQ3NEYsIDAuODc3NzUwOTYyNkYsIDAuODc4MDE5NjIwOUYsIDAuODc4Mjg3OTIyNEYsCisgICAgMC44Nzg1NTU4NjY5RiwgMC44Nzg4MjM0NTQ2RiwgMC44NzkwOTA2ODU0RiwgMC44NzkzNTc1NTk0RiwKKyAgICAwLjg3OTYyNDA3NjVGLCAwLjg3OTg5MDIzNjhGLCAwLjg4MDE1NjA0MDNGLCAwLjg4MDQyMTQ4NzBGLAorICAgIDAuODgwNjg2NTc2OEYsIDAuODgwOTUxMzA5OUYsIDAuODgxMjE1Njg2M0YsIDAuODgxNDc5NzA1OUYsCisgICAgMC44ODE3NDMzNjg3RiwgMC44ODIwMDY2NzQ5RiwgMC44ODIyNjk2MjQzRiwgMC44ODI1MzIyMTcxRiwKKyAgICAwLjg4Mjc5NDQ1MzJGLCAwLjg4MzA1NjMzMjdGLCAwLjg4MzMxNzg1NTZGLCAwLjg4MzU3OTAyMTlGLAorICAgIDAuODgzODM5ODMxNkYsIDAuODg0MTAwMjg0OEYsIDAuODg0MzYwMzgxNUYsIDAuODg0NjIwMTIxN0YsCisgICAgMC44ODQ4Nzk1MDU0RiwgMC44ODUxMzg1MzI3RiwgMC44ODUzOTcyMDM2RiwgMC44ODU2NTU1MTgyRiwKKyAgICAwLjg4NTkxMzQ3NjRGLCAwLjg4NjE3MTA3ODNGLCAwLjg4NjQyODMyMzlGLCAwLjg4NjY4NTIxMzNGLAorICAgIDAuODg2OTQxNzQ2NEYsIDAuODg3MTk3OTIzNEYsIDAuODg3NDUzNzQ0M0YsIDAuODg3NzA5MjA5MEYsCisgICAgMC44ODc5NjQzMTc3RiwgMC44ODgyMTkwNzA0RiwgMC44ODg0NzM0NjcxRiwgMC44ODg3Mjc1MDc4RiwKKyAgICAwLjg4ODk4MTE5MjdGLCAwLjg4OTIzNDUyMTZGLCAwLjg4OTQ4NzQ5NDhGLCAwLjg4OTc0MDExMjJGLAorICAgIDAuODg5OTkyMzczOEYsIDAuODkwMjQ0Mjc5OEYsIDAuODkwNDk1ODMwMUYsIDAuODkwNzQ3MDI0OEYsCisgICAgMC44OTA5OTc4NjQwRiwgMC44OTEyNDgzNDc3RiwgMC44OTE0OTg0NzU5RiwgMC44OTE3NDgyNDg3RiwKKyAgICAwLjg5MTk5NzY2NjJGLCAwLjg5MjI0NjcyODRGLCAwLjg5MjQ5NTQzNTNGLCAwLjg5Mjc0Mzc4NzFGLAorICAgIDAuODkyOTkxNzgzN0YsIDAuODkzMjM5NDI1MkYsIDAuODkzNDg2NzExOEYsIDAuODkzNzMzNjQzM0YsCisgICAgMC44OTM5ODAyMTk5RiwgMC44OTQyMjY0NDE3RiwgMC44OTQ0NzIzMDg3RiwgMC44OTQ3MTc4MjEwRiwKKyAgICAwLjg5NDk2Mjk3ODVGLCAwLjg5NTIwNzc4MTVGLCAwLjg5NTQ1MjIyOTlGLCAwLjg5NTY5NjMyMzlGLAorICAgIDAuODk1OTQwMDYzNEYsIDAuODk2MTgzNDQ4NkYsIDAuODk2NDI2NDc5NUYsIDAuODk2NjY5MTU2MUYsCisgICAgMC44OTY5MTE0Nzg2RiwgMC44OTcxNTM0NDcwRiwgMC44OTczOTUwNjE0RiwgMC44OTc2MzYzMjE5RiwKKyAgICAwLjg5Nzg3NzIyODRGLCAwLjg5ODExNzc4MTJGLCAwLjg5ODM1Nzk4MDJGLCAwLjg5ODU5NzgyNTZGLAorICAgIDAuODk4ODM3MzE3NEYsIDAuODk5MDc2NDU1NkYsIDAuODk5MzE1MjQwNUYsIDAuODk5NTUzNjcyMEYsCisgICAgMC44OTk3OTE3NTAyRiwgMC45MDAwMjk0NzUxRiwgMC45MDAyNjY4NDcwRiwgMC45MDA1MDM4NjU4RiwKKyAgICAwLjkwMDc0MDUzMTdGLCAwLjkwMDk3Njg0NDZGLCAwLjkwMTIxMjgwNDhGLCAwLjkwMTQ0ODQxMjNGLAorICAgIDAuOTAxNjgzNjY3MUYsIDAuOTAxOTE4NTY5M0YsIDAuOTAyMTUzMTE5MUYsIDAuOTAyMzg3MzE2NUYsCisgICAgMC45MDI2MjExNjE2RiwgMC45MDI4NTQ2NTQ2RiwgMC45MDMwODc3OTU0RiwgMC45MDMzMjA1ODQxRiwKKyAgICAwLjkwMzU1MzAyMTBGLCAwLjkwMzc4NTEwNTlGLCAwLjkwNDAxNjgzOTJGLCAwLjkwNDI0ODIyMDdGLAorICAgIDAuOTA0NDc5MjUwN0YsIDAuOTA0NzA5OTI5M0YsIDAuOTA0OTQwMjU2NEYsIDAuOTA1MTcwMjMyM0YsCisgICAgMC45MDUzOTk4NTY5RiwgMC45MDU2MjkxMzA1RiwgMC45MDU4NTgwNTMxRiwgMC45MDYwODY2MjQ4RiwKKyAgICAwLjkwNjMxNDg0NTdGLCAwLjkwNjU0MjcxNTlGLCAwLjkwNjc3MDIzNTVGLCAwLjkwNjk5NzQwNDZGLAorICAgIDAuOTA3MjI0MjIzM0YsIDAuOTA3NDUwNjkxN0YsIDAuOTA3Njc2ODEwMEYsIDAuOTA3OTAyNTc4MkYsCisgICAgMC45MDgxMjc5OTY0RiwgMC45MDgzNTMwNjQ3RiwgMC45MDg1Nzc3ODMzRiwgMC45MDg4MDIxNTIzRiwKKyAgICAwLjkwOTAyNjE3MTdGLCAwLjkwOTI0OTg0MTdGLCAwLjkwOTQ3MzE2MjNGLCAwLjkwOTY5NjEzMzhGLAorICAgIDAuOTA5OTE4NzU2MUYsIDAuOTEwMTQxMDI5NUYsIDAuOTEwMzYyOTU0MEYsIDAuOTEwNTg0NTI5N0YsCisgICAgMC45MTA4MDU3NTY4RiwgMC45MTEwMjY2MzU0RiwgMC45MTEyNDcxNjU2RiwgMC45MTE0NjczNDc1RiwKKyAgICAwLjkxMTY4NzE4MTJGLCAwLjkxMTkwNjY2NjhGLCAwLjkxMjEyNTgwNDZGLCAwLjkxMjM0NDU5NDVGLAorICAgIDAuOTEyNTYzMDM2N0YsIDAuOTEyNzgxMTMxNEYsIDAuOTEyOTk4ODc4NkYsIDAuOTEzMjE2Mjc4NUYsCisgICAgMC45MTM0MzMzMzEyRiwgMC45MTM2NTAwMzY4RiwgMC45MTM4NjYzOTU0RiwgMC45MTQwODI0MDczRiwKKyAgICAwLjkxNDI5ODA3MjRGLCAwLjkxNDUxMzM5MTBGLCAwLjkxNDcyODM2MzJGLCAwLjkxNDk0Mjk4OTBGLAorICAgIDAuOTE1MTU3MjY4N0YsIDAuOTE1MzcxMjAyM0YsIDAuOTE1NTg0NzkwMEYsIDAuOTE1Nzk4MDMxOUYsCisgICAgMC45MTYwMTA5MjgyRiwgMC45MTYyMjM0NzkwRiwgMC45MTY0MzU2ODQ0RiwgMC45MTY2NDc1NDQ1RiwKKyAgICAwLjkxNjg1OTA1OTVGLCAwLjkxNzA3MDIyOTZGLCAwLjkxNzI4MTA1NDhGLCAwLjkxNzQ5MTUzNTRGLAorICAgIDAuOTE3NzAxNjcxNEYsIDAuOTE3OTExNDYyOUYsIDAuOTE4MTIwOTEwMkYsIDAuOTE4MzMwMDEzNEYsCisgICAgMC45MTg1Mzg3NzI2RiwgMC45MTg3NDcxODc5RiwgMC45MTg5NTUyNTk1RiwgMC45MTkxNjI5ODc2RiwKKyAgICAwLjkxOTM3MDM3MjNGLCAwLjkxOTU3NzQxMzZGLCAwLjkxOTc4NDExMTlGLCAwLjkxOTk5MDQ2NzJGLAorICAgIDAuOTIwMTk2NDc5N0YsIDAuOTIwNDAyMTQ5NUYsIDAuOTIwNjA3NDc2N0YsIDAuOTIwODEyNDYxNkYsCisgICAgMC45MjEwMTcxMDQzRiwgMC45MjEyMjE0MDQ5RiwgMC45MjE0MjUzNjM2RiwgMC45MjE2Mjg5ODA1RiwKKyAgICAwLjkyMTgzMjI1NThGLCAwLjkyMjAzNTE4OTZGLCAwLjkyMjIzNzc4MjFGLCAwLjkyMjQ0MDAzMzVGLAorICAgIDAuOTIyNjQxOTQzOUYsIDAuOTIyODQzNTEzNEYsIDAuOTIzMDQ0NzQyM0YsIDAuOTIzMjQ1NjMwN0YsCisgICAgMC45MjM0NDYxNzg3RiwgMC45MjM2NDYzODY1RiwgMC45MjM4NDYyNTQzRiwgMC45MjQwNDU3ODIyRiwKKyAgICAwLjkyNDI0NDk3MDRGLCAwLjkyNDQ0MzgxOTBGLCAwLjkyNDY0MjMyODJGLCAwLjkyNDg0MDQ5ODNGLAorICAgIDAuOTI1MDM4MzI5M0YsIDAuOTI1MjM1ODIxNEYsIDAuOTI1NDMyOTc0N0YsIDAuOTI1NjI5Nzg5NkYsCisgICAgMC45MjU4MjYyNjYwRiwgMC45MjYwMjI0MDQyRiwgMC45MjYyMTgyMDQ0RiwgMC45MjY0MTM2NjY3RiwKKyAgICAwLjkyNjYwODc5MTNGLCAwLjkyNjgwMzU3ODNGLCAwLjkyNjk5ODAyODBGLCAwLjkyNzE5MjE0MDVGLAorICAgIDAuOTI3Mzg1OTE2MEYsIDAuOTI3NTc5MzU0NkYsIDAuOTI3NzcyNDU2NkYsIDAuOTI3OTY1MjIyMUYsCisgICAgMC45MjgxNTc2NTEzRiwgMC45MjgzNDk3NDQzRiwgMC45Mjg1NDE1MDE0RiwgMC45Mjg3MzI5MjI3RiwKKyAgICAwLjkyODkyNDAwODRGLCAwLjkyOTExNDc1ODZGLCAwLjkyOTMwNTE3MzdGLCAwLjkyOTQ5NTI1MzZGLAorICAgIDAuOTI5Njg0OTk4N0YsIDAuOTI5ODc0NDA5MUYsIDAuOTMwMDYzNDg1MEYsIDAuOTMwMjUyMjI2NkYsCisgICAgMC45MzA0NDA2MzQwRiwgMC45MzA2Mjg3MDc0RiwgMC45MzA4MTY0NDcxRiwgMC45MzEwMDM4NTMyRiwKKyAgICAwLjkzMTE5MDkyNTlGLCAwLjkzMTM3NzY2NTRGLCAwLjkzMTU2NDA3MTlGLCAwLjkzMTc1MDE0NTVGLAorICAgIDAuOTMxOTM1ODg2NUYsIDAuOTMyMTIxMjk1MUYsIDAuOTMyMzA2MzcxM0YsIDAuOTMyNDkxMTE1NUYsCisgICAgMC45MzI2NzU1Mjc5RiwgMC45MzI4NTk2MDg1RiwgMC45MzMwNDMzNTc3RiwgMC45MzMyMjY3NzU2RiwKKyAgICAwLjkzMzQwOTg2MjNGLCAwLjkzMzU5MjYxODJGLCAwLjkzMzc3NTA0MzRGLCAwLjkzMzk1NzEzODBGLAorICAgIDAuOTM0MTM4OTAyM0YsIDAuOTM0MzIwMzM2NkYsIDAuOTM0NTAxNDQwOUYsIDAuOTM0NjgyMjE1NUYsCisgICAgMC45MzQ4NjI2NjA2RiwgMC45MzUwNDI3NzYzRiwgMC45MzUyMjI1NjMwRiwgMC45MzU0MDIwMjA3RiwKKyAgICAwLjkzNTU4MTE0OThGLCAwLjkzNTc1OTk1MDNGLCAwLjkzNTkzODQyMjZGLCAwLjkzNjExNjU2NjdGLAorICAgIDAuOTM2Mjk0MzgzMEYsIDAuOTM2NDcxODcxNkYsIDAuOTM2NjQ5MDMyN0YsIDAuOTM2ODI1ODY2NkYsCisgICAgMC45MzcwMDIzNzMzRiwgMC45MzcxNzg1NTMzRiwgMC45MzczNTQ0MDY2RiwgMC45Mzc1Mjk5MzM1RiwKKyAgICAwLjkzNzcwNTEzNDFGLCAwLjkzNzg4MDAwODdGLCAwLjkzODA1NDU1NzZGLCAwLjkzODIyODc4MDlGLAorICAgIDAuOTM4NDAyNjc4N0YsIDAuOTM4NTc2MjUxNUYsIDAuOTM4NzQ5NDk5M0YsIDAuOTM4OTIyNDIyM0YsCisgICAgMC45MzkwOTUwMjA5RiwgMC45MzkyNjcyOTUxRiwgMC45Mzk0MzkyNDUzRiwgMC45Mzk2MTA4NzE2RiwKKyAgICAwLjkzOTc4MjE3NDNGLCAwLjkzOTk1MzE1MzZGLCAwLjk0MDEyMzgwOTZGLCAwLjk0MDI5NDE0MjdGLAorICAgIDAuOTQwNDY0MTUzMEYsIDAuOTQwNjMzODQwN0YsIDAuOTQwODAzMjA2MUYsIDAuOTQwOTcyMjQ5NUYsCisgICAgMC45NDExNDA5NzA5RiwgMC45NDEzMDkzNzA3RiwgMC45NDE0Nzc0NDkxRiwgMC45NDE2NDUyMDYyRiwKKyAgICAwLjk0MTgxMjY0MjRGLCAwLjk0MTk3OTc1NzlGLCAwLjk0MjE0NjU1MjhGLCAwLjk0MjMxMzAyNzRGLAorICAgIDAuOTQyNDc5MTgxOUYsIDAuOTQyNjQ1MDE2NkYsIDAuOTQyODEwNTMxN0YsIDAuOTQyOTc1NzI3NEYsCisgICAgMC45NDMxNDA2MDM5RiwgMC45NDMzMDUxNjE2RiwgMC45NDM0Njk0MDA1RiwgMC45NDM2MzMzMjA5RiwKKyAgICAwLjk0Mzc5NjkyMzJGLCAwLjk0Mzk2MDIwNzRGLCAwLjk0NDEyMzE3MzlGLCAwLjk0NDI4NTgyMjlGLAorICAgIDAuOTQ0NDQ4MTU0NUYsIDAuOTQ0NjEwMTY5MUYsIDAuOTQ0NzcxODY2OUYsIDAuOTQ0OTMzMjQ4MUYsCisgICAgMC45NDUwOTQzMTI5RiwgMC45NDUyNTUwNjE3RiwgMC45NDU0MTU0OTQ1RiwgMC45NDU1NzU2MTE4RiwKKyAgICAwLjk0NTczNTQxMzZGLCAwLjk0NTg5NDkwMDNGLCAwLjk0NjA1NDA3MjFGLCAwLjk0NjIxMjkyOTJGLAorICAgIDAuOTQ2MzcxNDcxOUYsIDAuOTQ2NTI5NzAwM0YsIDAuOTQ2Njg3NjE0OUYsIDAuOTQ2ODQ1MjE1N0YsCisgICAgMC45NDcwMDI1MDMxRiwgMC45NDcxNTk0NzcyRiwgMC45NDczMTYxMzg0RiwgMC45NDc0NzI0ODY5RiwKKyAgICAwLjk0NzYyODUyMjlGLCAwLjk0Nzc4NDI0NjZGLCAwLjk0NzkzOTY1ODRGLCAwLjk0ODA5NDc1ODVGLAorICAgIDAuOTQ4MjQ5NTQ3MEYsIDAuOTQ4NDA0MDI0M0YsIDAuOTQ4NTU4MTkwNkYsIDAuOTQ4NzEyMDQ2MkYsCisgICAgMC45NDg4NjU1OTEzRiwgMC45NDkwMTg4MjYyRiwgMC45NDkxNzE3NTExRiwgMC45NDkzMjQzNjYyRiwKKyAgICAwLjk0OTQ3NjY3MThGLCAwLjk0OTYyODY2ODNGLCAwLjk0OTc4MDM1NTdGLCAwLjk0OTkzMTczNDVGLAorICAgIDAuOTUwMDgyODA0N0YsIDAuOTUwMjMzNTY2OEYsIDAuOTUwMzg0MDIwOUYsIDAuOTUwNTM0MTY3M0YsCisgICAgMC45NTA2ODQwMDYyRiwgMC45NTA4MzM1MzgwRiwgMC45NTA5ODI3NjI5RiwgMC45NTExMzE2ODEwRiwKKyAgICAwLjk1MTI4MDI5MjhGLCAwLjk1MTQyODU5ODRGLCAwLjk1MTU3NjU5ODJGLCAwLjk1MTcyNDI5MjNGLAorICAgIDAuOTUxODcxNjgxMEYsIDAuOTUyMDE4NzY0NkYsIDAuOTUyMTY1NTQzNEYsIDAuOTUyMzEyMDE3NkYsCisgICAgMC45NTI0NTgxODc1RiwgMC45NTI2MDQwNTM0RiwgMC45NTI3NDk2MTU0RiwgMC45NTI4OTQ4NzM5RiwKKyAgICAwLjk1MzAzOTgyOTJGLCAwLjk1MzE4NDQ4MTRGLCAwLjk1MzMyODgzMTBGLCAwLjk1MzQ3Mjg3ODBGLAorICAgIDAuOTUzNjE2NjIyOUYsIDAuOTUzNzYwMDY1OUYsIDAuOTUzOTAzMjA3MUYsIDAuOTU0MDQ2MDQ3MEYsCisgICAgMC45NTQxODg1ODU4RiwgMC45NTQzMzA4MjM3RiwgMC45NTQ0NzI3NjExRiwgMC45NTQ2MTQzOTgxRiwKKyAgICAwLjk1NDc1NTczNTFGLCAwLjk1NDg5Njc3MjNGLCAwLjk1NTAzNzUxMDBGLCAwLjk1NTE3Nzk0ODVGLAorICAgIDAuOTU1MzE4MDg4MUYsIDAuOTU1NDU3OTI5MEYsIDAuOTU1NTk3NDcxNEYsIDAuOTU1NzM2NzE1OEYsCisgICAgMC45NTU4NzU2NjIzRiwgMC45NTYwMTQzMTEyRiwgMC45NTYxNTI2NjI4RiwgMC45NTYyOTA3MTc0RiwKKyAgICAwLjk1NjQyODQ3NTJGLCAwLjk1NjU2NTkzNjZGLCAwLjk1NjcwMzEwMTdGLCAwLjk1NjgzOTk3MTBGLAorICAgIDAuOTU2OTc2NTQ0NkYsIDAuOTU3MTEyODIyOUYsIDAuOTU3MjQ4ODA2MUYsIDAuOTU3Mzg0NDk0NEYsCisgICAgMC45NTc1MTk4ODgzRiwgMC45NTc2NTQ5ODc5RiwgMC45NTc3ODk3OTM2RiwgMC45NTc5MjQzMDU2RiwKKyAgICAwLjk1ODA1ODUyNDJGLCAwLjk1ODE5MjQ0OTdGLCAwLjk1ODMyNjA4MjRGLCAwLjk1ODQ1OTQyMjZGLAorICAgIDAuOTU4NTkyNDcwNUYsIDAuOTU4NzI1MjI2NEYsIDAuOTU4ODU3NjkwNkYsIDAuOTU4OTg5ODYzNEYsCisgICAgMC45NTkxMjE3NDUyRiwgMC45NTkyNTMzMzYwRiwgMC45NTkzODQ2MzY0RiwgMC45NTk1MTU2NDY1RiwKKyAgICAwLjk1OTY0NjM2NjZGLCAwLjk1OTc3Njc5NzFGLCAwLjk1OTkwNjkzODJGLCAwLjk2MDAzNjc5MDFGLAorICAgIDAuOTYwMTY2MzUzM0YsIDAuOTYwMjk1NjI3OUYsIDAuOTYwNDI0NjE0M0YsIDAuOTYwNTUzMzEyOEYsCisgICAgMC45NjA2ODE3MjM2RiwgMC45NjA4MDk4NDcxRiwgMC45NjA5Mzc2ODM1RiwgMC45NjEwNjUyMzMyRiwKKyAgICAwLjk2MTE5MjQ5NjNGLCAwLjk2MTMxOTQ3MzNGLCAwLjk2MTQ0NjE2NDRGLCAwLjk2MTU3MjU2OTlGLAorICAgIDAuOTYxNjk4NjkwMUYsIDAuOTYxODI0NTI1M0YsIDAuOTYxOTUwMDc1N0YsIDAuOTYyMDc1MzQxOEYsCisgICAgMC45NjIyMDAzMjM4RiwgMC45NjIzMjUwMjE5RiwgMC45NjI0NDk0MzY1RiwgMC45NjI1NzM1Njc5RiwKKyAgICAwLjk2MjY5NzQxNjNGLCAwLjk2MjgyMDk4MjFGLCAwLjk2Mjk0NDI2NTZGLCAwLjk2MzA2NzI2NzFGLAorICAgIDAuOTYzMTg5OTg2OEYsIDAuOTYzMzEyNDI1MUYsIDAuOTYzNDM0NTgyMkYsIDAuOTYzNTU2NDU4NUYsCisgICAgMC45NjM2NzgwNTQzRiwgMC45NjM3OTkzNjk5RiwgMC45NjM5MjA0MDU2RiwgMC45NjQwNDExNjE2RiwKKyAgICAwLjk2NDE2MTYzODNGLCAwLjk2NDI4MTgzNTlGLCAwLjk2NDQwMTc1NDlGLCAwLjk2NDUyMTM5NTVGLAorICAgIDAuOTY0NjQwNzU3OUYsIDAuOTY0NzU5ODQyNkYsIDAuOTY0ODc4NjQ5N0YsIDAuOTY0OTk3MTc5N0YsCisgICAgMC45NjUxMTU0MzI4RiwgMC45NjUyMzM0MDkyRiwgMC45NjUzNTExMDk1RiwgMC45NjU0Njg1MzM3RiwKKyAgICAwLjk2NTU4NTY4MjNGLCAwLjk2NTcwMjU1NTZGLCAwLjk2NTgxOTE1MzhGLCAwLjk2NTkzNTQ3NzNGLAorICAgIDAuOTY2MDUxNTI2M0YsIDAuOTY2MTY3MzAxM0YsIDAuOTY2MjgyODAyNEYsIDAuOTY2Mzk4MDMwMEYsCisgICAgMC45NjY1MTI5ODQ1RiwgMC45NjY2Mjc2NjYwRiwgMC45NjY3NDIwNzUwRiwgMC45NjY4NTYyMTE4RiwKKyAgICAwLjk2Njk3MDA3NjZGLCAwLjk2NzA4MzY2OThGLCAwLjk2NzE5Njk5MTdGLCAwLjk2NzMxMDA0MjVGLAorICAgIDAuOTY3NDIyODIyN0YsIDAuOTY3NTM1MzMyNUYsIDAuOTY3NjQ3NTcyMkYsIDAuOTY3NzU5NTQyMkYsCisgICAgMC45Njc4NzEyNDI4RiwgMC45Njc5ODI2NzQyRiwgMC45NjgwOTM4MzY4RiwgMC45NjgyMDQ3MzA5RiwKKyAgICAwLjk2ODMxNTM1NjlGLCAwLjk2ODQyNTcxNTBGLCAwLjk2ODUzNTgwNTZGLCAwLjk2ODY0NTYyODlGLAorICAgIDAuOTY4NzU1MTg1M0YsIDAuOTY4ODY0NDc1MkYsIDAuOTY4OTczNDk4N0YsIDAuOTY5MDgyMjU2NEYsCisgICAgMC45NjkxOTA3NDgzRiwgMC45NjkyOTg5NzUwRiwgMC45Njk0MDY5MzY3RiwgMC45Njk1MTQ2MzM3RiwKKyAgICAwLjk2OTYyMjA2NjNGLCAwLjk2OTcyOTIzNDlGLCAwLjk2OTgzNjEzOThGLCAwLjk2OTk0Mjc4MTNGLAorICAgIDAuOTcwMDQ5MTU5N0YsIDAuOTcwMTU1Mjc1NEYsIDAuOTcwMjYxMTI4NkYsIDAuOTcwMzY2NzE5N0YsCisgICAgMC45NzA0NzIwNDkwRiwgMC45NzA1NzcxMTY5RiwgMC45NzA2ODE5MjM2RiwgMC45NzA3ODY0Njk1RiwKKyAgICAwLjk3MDg5MDc1NDlGLCAwLjk3MDk5NDc4MDJGLCAwLjk3MTA5ODU0NTZGLCAwLjk3MTIwMjA1MTRGLAorICAgIDAuOTcxMzA1Mjk4MUYsIDAuOTcxNDA4Mjg1OUYsIDAuOTcxNTExMDE1MUYsIDAuOTcxNjEzNDg2MkYsCisgICAgMC45NzE3MTU2OTkzRiwgMC45NzE4MTc2NTQ5RiwgMC45NzE5MTkzNTMyRiwgMC45NzIwMjA3OTQ2RiwKKyAgICAwLjk3MjEyMTk3OTRGLCAwLjk3MjIyMjkwODBGLCAwLjk3MjMyMzU4MDZGLCAwLjk3MjQyMzk5NzZGLAorICAgIDAuOTcyNTI0MTU5M0YsIDAuOTcyNjI0MDY2MUYsIDAuOTcyNzIzNzE4M0YsIDAuOTcyODIzMTE2MUYsCisgICAgMC45NzI5MjIyNjAxRiwgMC45NzMwMjExNTAzRiwgMC45NzMxMTk3ODczRiwgMC45NzMyMTgxNzEzRiwKKyAgICAwLjk3MzMxNjMwMjdGLCAwLjk3MzQxNDE4MTdGLCAwLjk3MzUxMTgwODhGLCAwLjk3MzYwOTE4NDJGLAorICAgIDAuOTczNzA2MzA4M0YsIDAuOTczODAzMTgxNEYsIDAuOTczODk5ODAzOUYsIDAuOTczOTk2MTc2MEYsCisgICAgMC45NzQwOTIyOTgxRiwgMC45NzQxODgxNzA2RiwgMC45NzQyODM3OTM4RiwgMC45NzQzNzkxNjgwRiwKKyAgICAwLjk3NDQ3NDI5MzVGLCAwLjk3NDU2OTE3MDdGLCAwLjk3NDY2Mzc5OTlGLCAwLjk3NDc1ODE4MTRGLAorICAgIDAuOTc0ODUyMzE1N0YsIDAuOTc0OTQ2MjAyOUYsIDAuOTc1MDM5ODQzNUYsIDAuOTc1MTMzMjM3OEYsCisgICAgMC45NzUyMjYzODYxRiwgMC45NzUzMTkyODg3RiwgMC45NzU0MTE5NDYxRiwgMC45NzU1MDQzNTg1RiwKKyAgICAwLjk3NTU5NjUyNjJGLCAwLjk3NTY4ODQ0OTZGLCAwLjk3NTc4MDEyOTFGLCAwLjk3NTg3MTU2NTBGLAorICAgIDAuOTc1OTYyNzU3NUYsIDAuOTc2MDUzNzA3MUYsIDAuOTc2MTQ0NDE0MUYsIDAuOTc2MjM0ODc4OUYsCisgICAgMC45NzYzMjUxMDE2RiwgMC45NzY0MTUwODI4RiwgMC45NzY1MDQ4MjI4RiwgMC45NzY1OTQzMjE4RiwKKyAgICAwLjk3NjY4MzU4MDJGLCAwLjk3Njc3MjU5ODRGLCAwLjk3Njg2MTM3NjdGLCAwLjk3Njk0OTkxNTRGLAorICAgIDAuOTc3MDM4MjE0OUYsIDAuOTc3MTI2Mjc1NUYsIDAuOTc3MjE0MDk3NkYsIDAuOTc3MzAxNjgxNUYsCisgICAgMC45NzczODkwMjc1RiwgMC45Nzc0NzYxMzYwRiwgMC45Nzc1NjMwMDczRiwgMC45Nzc2NDk2NDE4RiwKKyAgICAwLjk3NzczNjAzOThGLCAwLjk3NzgyMjIwMTZGLCAwLjk3NzkwODEyNzdGLCAwLjk3Nzk5MzgxODJGLAorICAgIDAuOTc4MDc5MjczNkYsIDAuOTc4MTY0NDk0M0YsIDAuOTc4MjQ5NDgwNUYsIDAuOTc4MzM0MjMyNkYsCisgICAgMC45Nzg0MTg3NTA5RiwgMC45Nzg1MDMwMzU5RiwgMC45Nzg1ODcwODc3RiwgMC45Nzg2NzA5MDY5RiwKKyAgICAwLjk3ODc1NDQ5MzZGLCAwLjk3ODgzNzg0ODRGLCAwLjk3ODkyMDk3MTRGLCAwLjk3OTAwMzg2MzFGLAorICAgIDAuOTc5MDg2NTIzOEYsIDAuOTc5MTY4OTUzOEYsIDAuOTc5MjUxMTUzNUYsIDAuOTc5MzMzMTIzMkYsCisgICAgMC45Nzk0MTQ4NjMzRiwgMC45Nzk0OTYzNzQyRiwgMC45Nzk1Nzc2NTYxRiwgMC45Nzk2NTg3MDk0RiwKKyAgICAwLjk3OTczOTUzNDVGLCAwLjk3OTgyMDEzMTZGLCAwLjk3OTkwMDUwMTNGLCAwLjk3OTk4MDY0MzdGLAorICAgIDAuOTgwMDYwNTU5M0YsIDAuOTgwMTQwMjQ4M0YsIDAuOTgwMjE5NzExMkYsIDAuOTgwMjk4OTQ4M0YsCisgICAgMC45ODAzNzc5NjAwRiwgMC45ODA0NTY3NDY1RiwgMC45ODA1MzUzMDgyRiwgMC45ODA2MTM2NDU1RiwKKyAgICAwLjk4MDY5MTc1ODdGLCAwLjk4MDc2OTY0ODJGLCAwLjk4MDg0NzMxNDNGLCAwLjk4MDkyNDc1NzRGLAorICAgIDAuOTgxMDAxOTc3OEYsIDAuOTgxMDc4OTc1OUYsIDAuOTgxMTU1NzUxOUYsIDAuOTgxMjMyMzA2NEYsCisgICAgMC45ODEzMDg2Mzk1RiwgMC45ODEzODQ3NTE3RiwgMC45ODE0NjA2NDMzRiwgMC45ODE1MzYzMTQ3RiwKKyAgICAwLjk4MTYxMTc2NjJGLCAwLjk4MTY4Njk5ODFGLCAwLjk4MTc2MjAxMDhGLCAwLjk4MTgzNjgwNDdGLAorICAgIDAuOTgxOTExMzgwMUYsIDAuOTgxOTg1NzM3NEYsIDAuOTgyMDU5ODc2OUYsIDAuOTgyMTMzNzk4OUYsCisgICAgMC45ODIyMDc1MDM4RiwgMC45ODIyODA5OTIwRiwgMC45ODIzNTQyNjM4RiwgMC45ODI0MjczMTk1RiwKKyAgICAwLjk4MjUwMDE1OTZGLCAwLjk4MjU3Mjc4NDNGLCAwLjk4MjY0NTE5NDBGLCAwLjk4MjcxNzM4OTFGLAorICAgIDAuOTgyNzg5MzcwMEYsIDAuOTgyODYxMTM2OEYsIDAuOTgyOTMyNjkwMUYsIDAuOTgzMDA0MDMwMkYsCisgICAgMC45ODMwNzUxNTc0RiwgMC45ODMxNDYwNzIwRiwgMC45ODMyMTY3NzQ1RiwgMC45ODMyODcyNjUyRiwKKyAgICAwLjk4MzM1NzU0NDRGLCAwLjk4MzQyNzYxMjRGLCAwLjk4MzQ5NzQ2OTdGLCAwLjk4MzU2NzExNjZGLAorICAgIDAuOTgzNjM2NTUzNUYsIDAuOTgzNzA1NzgwNkYsIDAuOTgzNzc0Nzk4M0YsIDAuOTgzODQzNjA3MUYsCisgICAgMC45ODM5MTIyMDcyRiwgMC45ODM5ODA1OTkwRiwgMC45ODQwNDg3ODI5RiwgMC45ODQxMTY3NTkxRiwKKyAgICAwLjk4NDE4NDUyODJGLCAwLjk4NDI1MjA5MDNGLCAwLjk4NDMxOTQ0NTlGLCAwLjk4NDM4NjU5NTNGLAorICAgIDAuOTg0NDUzNTM4OUYsIDAuOTg0NTIwMjc3MUYsIDAuOTg0NTg2ODEwMUYsIDAuOTg0NjUzMTM4M0YsCisgICAgMC45ODQ3MTkyNjIyRiwgMC45ODQ3ODUxODIwRiwgMC45ODQ4NTA4OTgwRiwgMC45ODQ5MTY0MTA4RiwKKyAgICAwLjk4NDk4MTcyMDVGLCAwLjk4NTA0NjgyNzZGLCAwLjk4NTExMTczMjRGLCAwLjk4NTE3NjQzNTJGLAorICAgIDAuOTg1MjQwOTM2NUYsIDAuOTg1MzA1MjM2NkYsIDAuOTg1MzY5MzM1OEYsIDAuOTg1NDMzMjM0NEYsCisgICAgMC45ODU0OTY5MzMwRiwgMC45ODU1NjA0MzE3RiwgMC45ODU2MjM3MzA5RiwgMC45ODU2ODY4MzEwRiwKKyAgICAwLjk4NTc0OTczMjVGLCAwLjk4NTgxMjQzNTVGLCAwLjk4NTg3NDk0MDRGLCAwLjk4NTkzNzI0NzdGLAorICAgIDAuOTg1OTk5MzU3N0YsIDAuOTg2MDYxMjcwN0YsIDAuOTg2MTIyOTg3MUYsIDAuOTg2MTg0NTA3MkYsCisgICAgMC45ODYyNDU4MzE1RiwgMC45ODYzMDY5NjAxRiwgMC45ODYzNjc4OTM2RiwgMC45ODY0Mjg2MzIyRiwKKyAgICAwLjk4NjQ4OTE3NjRGLCAwLjk4NjU0OTUyNjRGLCAwLjk4NjYwOTY4MjZGLCAwLjk4NjY2OTY0NTRGLAorICAgIDAuOTg2NzI5NDE1MkYsIDAuOTg2Nzg4OTkyMkYsIDAuOTg2ODQ4Mzc2OUYsIDAuOTg2OTA3NTY5NUYsCisgICAgMC45ODY5NjY1NzA2RiwgMC45ODcwMjUzODAzRiwgMC45ODcwODM5OTkxRiwgMC45ODcxNDI0MjczRiwKKyAgICAwLjk4NzIwMDY2NTNGLCAwLjk4NzI1ODcxMzVGLCAwLjk4NzMxNjU3MjFGLCAwLjk4NzM3NDI0MTVGLAorICAgIDAuOTg3NDMxNzIyMkYsIDAuOTg3NDg5MDE0NEYsIDAuOTg3NTQ2MTE4NUYsIDAuOTg3NjAzMDM0OEYsCisgICAgMC45ODc2NTk3NjM4RiwgMC45ODc3MTYzMDU3RiwgMC45ODc3NzI2NjEwRiwgMC45ODc4Mjg4MzAwRiwKKyAgICAwLjk4Nzg4NDgxMzBGLCAwLjk4Nzk0MDYxMDRGLCAwLjk4Nzk5NjIyMjVGLCAwLjk4ODA1MTY0OTdGLAorICAgIDAuOTg4MTA2ODkyNEYsIDAuOTg4MTYxOTUwOUYsIDAuOTg4MjE2ODI1NkYsIDAuOTg4MjcxNTE2OEYsCisgICAgMC45ODgzMjYwMjQ5RiwgMC45ODgzODAzNTAyRiwgMC45ODg0MzQ0OTMxRiwgMC45ODg0ODg0NTM5RiwKKyAgICAwLjk4ODU0MjIzMzFGLCAwLjk4ODU5NTgzMDlGLCAwLjk4ODY0OTI0NzdGLCAwLjk4ODcwMjQ4MzhGLAorICAgIDAuOTg4NzU1NTM5N0YsIDAuOTg4ODA4NDE1N0YsIDAuOTg4ODYxMTEyMEYsIDAuOTg4OTEzNjI5MkYsCisgICAgMC45ODg5NjU5Njc1RiwgMC45ODkwMTgxMjczRiwgMC45ODkwNzAxMDg5RiwgMC45ODkxMjE5MTI4RiwKKyAgICAwLjk4OTE3MzUzOTJGLCAwLjk4OTIyNDk4ODVGLCAwLjk4OTI3NjI2MTBGLCAwLjk4OTMyNzM1NzJGLAorICAgIDAuOTg5Mzc4Mjc3NEYsIDAuOTg5NDI5MDIxOUYsIDAuOTg5NDc5NTkxMUYsIDAuOTg5NTI5OTg1M0YsCisgICAgMC45ODk1ODAyMDQ5RiwgMC45ODk2MzAyNTAyRiwgMC45ODk2ODAxMjE3RiwgMC45ODk3Mjk4MTk2RiwKKyAgICAwLjk4OTc3OTM0NDNGLCAwLjk4OTgyODY5NjFGLCAwLjk4OTg3Nzg3NTVGLCAwLjk4OTkyNjg4MjhGLAorICAgIDAuOTg5OTc1NzE4M0YsIDAuOTkwMDI0MzgyM0YsIDAuOTkwMDcyODc1M0YsIDAuOTkwMTIxMTk3NkYsCisgICAgMC45OTAxNjkzNDk1RiwgMC45OTAyMTczMzE0RiwgMC45OTAyNjUxNDM2RiwgMC45OTAzMTI3ODY1RiwKKyAgICAwLjk5MDM2MDI2MDVGLCAwLjk5MDQwNzU2NTlGLCAwLjk5MDQ1NDcwMzFGLCAwLjk5MDUwMTY3MjNGLAorICAgIDAuOTkwNTQ4NDc0MEYsIDAuOTkwNTk1MTA4NkYsIDAuOTkwNjQxNTc2M0YsIDAuOTkwNjg3ODc3NUYsCisgICAgMC45OTA3MzQwMTI2RiwgMC45OTA3Nzk5ODE5RiwgMC45OTA4MjU3ODU4RiwgMC45OTA4NzE0MjQ3RiwKKyAgICAwLjk5MDkxNjg5ODhGLCAwLjk5MDk2MjIwODZGLCAwLjk5MTAwNzM1NDNGLCAwLjk5MTA1MjMzNjRGLAorICAgIDAuOTkxMDk3MTU1MkYsIDAuOTkxMTQxODExMEYsIDAuOTkxMTg2MzA0MkYsIDAuOTkxMjMwNjM1MUYsCisgICAgMC45OTEyNzQ4MDQyRiwgMC45OTEzMTg4MTE3RiwgMC45OTEzNjI2NTgwRiwgMC45OTE0MDYzNDM1RiwKKyAgICAwLjk5MTQ0OTg2ODRGLCAwLjk5MTQ5MzIzMzNGLCAwLjk5MTUzNjQzODNGLCAwLjk5MTU3OTQ4MzlGLAorICAgIDAuOTkxNjIyMzcwM0YsIDAuOTkxNjY1MDk4MUYsIDAuOTkxNzA3NjY3NEYsIDAuOTkxNzUwMDc4N0YsCisgICAgMC45OTE3OTIzMzIzRiwgMC45OTE4MzQ0Mjg2RiwgMC45OTE4NzYzNjc5RiwgMC45OTE5MTgxNTA1RiwKKyAgICAwLjk5MTk1OTc3NjlGLCAwLjk5MjAwMTI0NzNGLCAwLjk5MjA0MjU2MjFGLCAwLjk5MjA4MzcyMTdGLAorICAgIDAuOTkyMTI0NzI2M0YsIDAuOTkyMTY1NTc2NUYsIDAuOTkyMjA2MjcyNEYsIDAuOTkyMjQ2ODE0NUYsCisgICAgMC45OTIyODcyMDMwRiwgMC45OTIzMjc0Mzg1RiwgMC45OTIzNjc1MjExRiwgMC45OTI0MDc0NTEzRiwKKyAgICAwLjk5MjQ0NzIyOTRGLCAwLjk5MjQ4Njg1NTdGLCAwLjk5MjUyNjMzMDZGLCAwLjk5MjU2NTY1NDRGLAorICAgIDAuOTkyNjA0ODI3NUYsIDAuOTkyNjQzODUwM0YsIDAuOTkyNjgyNzIzMEYsIDAuOTkyNzIxNDQ2MUYsCisgICAgMC45OTI3NjAwMTk5RiwgMC45OTI3OTg0NDQ2RiwgMC45OTI4MzY3MjA4RiwgMC45OTI4NzQ4NDg2RiwKKyAgICAwLjk5MjkxMjgyODVGLCAwLjk5Mjk1MDY2MDhGLCAwLjk5Mjk4ODM0NTlGLCAwLjk5MzAyNTg4NDFGLAorICAgIDAuOTkzMDYzMjc1N0YsIDAuOTkzMTAwNTIxMUYsIDAuOTkzMTM3NjIwN0YsIDAuOTkzMTc0NTc0N0YsCisgICAgMC45OTMyMTEzODM2RiwgMC45OTMyNDgwNDc2RiwgMC45OTMyODQ1NjcxRiwgMC45OTMzMjA5NDI1RiwKKyAgICAwLjk5MzM1NzE3NDJGLCAwLjk5MzM5MzI2MjNGLCAwLjk5MzQyOTIwNzRGLCAwLjk5MzQ2NTAwOTdGLAorICAgIDAuOTkzNTAwNjY5NkYsIDAuOTkzNTM2MTg3NEYsIDAuOTkzNTcxNTYzNUYsIDAuOTkzNjA2Nzk4MkYsCisgICAgMC45OTM2NDE4OTE5RiwgMC45OTM2NzY4NDQ4RiwgMC45OTM3MTE2NTc0RiwgMC45OTM3NDYzMzAwRiwKKyAgICAwLjk5Mzc4MDg2MjlGLCAwLjk5MzgxNTI1NjVGLCAwLjk5Mzg0OTUxMTFGLCAwLjk5Mzg4MzYyNzFGLAorICAgIDAuOTkzOTE3NjA0N0YsIDAuOTkzOTUxNDQ0NEYsIDAuOTkzOTg1MTQ2NUYsIDAuOTk0MDE4NzExMkYsCisgICAgMC45OTQwNTIxMzkxRiwgMC45OTQwODU0MzAzRiwgMC45OTQxMTg1ODUzRiwgMC45OTQxNTE2MDQ0RiwKKyAgICAwLjk5NDE4NDQ4NzlGLCAwLjk5NDIxNzIzNjFGLCAwLjk5NDI0OTg0OTVGLCAwLjk5NDI4MjMyODNGLAorICAgIDAuOTk0MzE0NjcyOUYsIDAuOTk0MzQ2ODgzNkYsIDAuOTk0Mzc4OTYwOEYsIDAuOTk0NDEwOTA0N0YsCisgICAgMC45OTQ0NDI3MTU4RiwgMC45OTQ0NzQzOTQ0RiwgMC45OTQ1MDU5NDA4RiwgMC45OTQ1MzczNTUzRiwKKyAgICAwLjk5NDU2ODYzODRGLCAwLjk5NDU5OTc5MDJGLCAwLjk5NDYzMDgxMTJGLCAwLjk5NDY2MTcwMTdGLAorICAgIDAuOTk0NjkyNDYyMUYsIDAuOTk0NzIzMDkyNkYsIDAuOTk0NzUzNTkzN0YsIDAuOTk0NzgzOTY1NkYsCisgICAgMC45OTQ4MTQyMDg2RiwgMC45OTQ4NDQzMjMyRiwgMC45OTQ4NzQzMDk3RiwgMC45OTQ5MDQxNjgzRiwKKyAgICAwLjk5NDkzMzg5OTVGLCAwLjk5NDk2MzUwMzVGLCAwLjk5NDk5Mjk4MDdGLCAwLjk5NTAyMjMzMTVGLAorICAgIDAuOTk1MDUxNTU2MUYsIDAuOTk1MDgwNjU0OUYsIDAuOTk1MTA5NjI4MkYsIDAuOTk1MTM4NDc2NEYsCisgICAgMC45OTUxNjcxOTk4RiwgMC45OTUxOTU3OTg3RiwgMC45OTUyMjQyNzM1RiwgMC45OTUyNTI2MjQ1RiwKKyAgICAwLjk5NTI4MDg1MjBGLCAwLjk5NTMwODk1NjRGLCAwLjk5NTMzNjkzODBGLCAwLjk5NTM2NDc5NzFGLAorICAgIDAuOTk1MzkyNTM0MEYsIDAuOTk1NDIwMTQ5MUYsIDAuOTk1NDQ3NjQyOEYsIDAuOTk1NDc1MDE1M0YsCisgICAgMC45OTU1MDIyNjcwRiwgMC45OTU1MjkzOTgxRiwgMC45OTU1NTY0MDkyRiwgMC45OTU1ODMzMDAzRiwKKyAgICAwLjk5NTYxMDA3MjBGLCAwLjk5NTYzNjcyNDVGLCAwLjk5NTY2MzI1ODJGLCAwLjk5NTY4OTY3MzNGLAorICAgIDAuOTk1NzE1OTcwM0YsIDAuOTk1NzQyMTQ5NEYsIDAuOTk1NzY4MjExMEYsIDAuOTk1Nzk0MTU1M0YsCisgICAgMC45OTU4MTk5ODI4RiwgMC45OTU4NDU2OTM3RiwgMC45OTU4NzEyODg0RiwgMC45OTU4OTY3NjcyRiwKKyAgICAwLjk5NTkyMjEzMDVGLCAwLjk5NTk0NzM3ODRGLCAwLjk5NTk3MjUxMTVGLCAwLjk5NTk5NzUzMDBGLAorICAgIDAuOTk2MDIyNDM0MkYsIDAuOTk2MDQ3MjI0NEYsIDAuOTk2MDcxOTAxMUYsIDAuOTk2MDk2NDY0NEYsCisgICAgMC45OTYxMjA5MTQ4RiwgMC45OTYxNDUyNTI1RiwgMC45OTYxNjk0Nzc5RiwgMC45OTYxOTM1OTEzRiwKKyAgICAwLjk5NjIxNzU5MzBGLCAwLjk5NjI0MTQ4MzRGLCAwLjk5NjI2NTI2MjdGLCAwLjk5NjI4ODkzMTNGLAorICAgIDAuOTk2MzEyNDg5NUYsIDAuOTk2MzM1OTM3N0YsIDAuOTk2MzU5Mjc2MUYsIDAuOTk2MzgyNTA1MUYsCisgICAgMC45OTY0MDU2MjUwRiwgMC45OTY0Mjg2MzYxRiwgMC45OTY0NTE1Mzg3RiwgMC45OTY0NzQzMzMyRiwKKyAgICAwLjk5NjQ5NzAxOThGLCAwLjk5NjUxOTU5OTBGLCAwLjk5NjU0MjA3MDlGLCAwLjk5NjU2NDQzNjBGLAorICAgIDAuOTk2NTg2Njk0NkYsIDAuOTk2NjA4ODQ2OUYsIDAuOTk2NjMwODkzMkYsIDAuOTk2NjUyODM0MEYsCisgICAgMC45OTY2NzQ2Njk1RiwgMC45OTY2OTY0MDAxRiwgMC45OTY3MTgwMjYwRiwgMC45OTY3Mzk1NDc1RiwKKyAgICAwLjk5Njc2MDk2NTFGLCAwLjk5Njc4MjI3ODlGLCAwLjk5NjgwMzQ4OTRGLCAwLjk5NjgyNDU5NjhGLAorICAgIDAuOTk2ODQ1NjAxNEYsIDAuOTk2ODY2NTAzNkYsIDAuOTk2ODg3MzAzN0YsIDAuOTk2OTA4MDAxOUYsCisgICAgMC45OTY5Mjg1OTg3RiwgMC45OTY5NDkwOTQyRiwgMC45OTY5Njk0ODg5RiwgMC45OTY5ODk3ODMwRiwKKyAgICAwLjk5NzAwOTk3NjlGLCAwLjk5NzAzMDA3MDhGLCAwLjk5NzA1MDA2NTFGLCAwLjk5NzA2OTk2MDFGLAorICAgIDAuOTk3MDg5NzU2MUYsIDAuOTk3MTA5NDUzM0YsIDAuOTk3MTI5MDUyMkYsIDAuOTk3MTQ4NTUzMUYsCisgICAgMC45OTcxNjc5NTYxRiwgMC45OTcxODcyNjE3RiwgMC45OTcyMDY0NzAyRiwgMC45OTcyMjU1ODE4RiwKKyAgICAwLjk5NzI0NDU5NjhGLCAwLjk5NzI2MzUxNTdGLCAwLjk5NzI4MjMzODZGLCAwLjk5NzMwMTA2NTlGLAorICAgIDAuOTk3MzE5Njk4MEYsIDAuOTk3MzM4MjM1MEYsIDAuOTk3MzU2Njc3M0YsIDAuOTk3Mzc1MDI1M0YsCisgICAgMC45OTczOTMyNzkxRiwgMC45OTc0MTE0MzkyRiwgMC45OTc0Mjk1MDU5RiwgMC45OTc0NDc0NzkzRiwKKyAgICAwLjk5NzQ2NTM1OTlGLCAwLjk5NzQ4MzE0ODBGLCAwLjk5NzUwMDg0MzhGLCAwLjk5NzUxODQ0NzZGLAorICAgIDAuOTk3NTM1OTU5OEYsIDAuOTk3NTUzMzgwNkYsIDAuOTk3NTcwNzEwNEYsIDAuOTk3NTg3OTQ5NUYsCisgICAgMC45OTc2MDUwOTgxRiwgMC45OTc2MjIxNTY2RiwgMC45OTc2MzkxMjUyRiwgMC45OTc2NTYwMDQzRiwKKyAgICAwLjk5NzY3Mjc5NDFGLCAwLjk5NzY4OTQ5NTBGLCAwLjk5NzcwNjEwNzNGLCAwLjk5NzcyMjYzMTJGLAorICAgIDAuOTk3NzM5MDY3MUYsIDAuOTk3NzU1NDE1MkYsIDAuOTk3NzcxNjc1OUYsIDAuOTk3Nzg3ODQ5NUYsCisgICAgMC45OTc4MDM5MzYxRiwgMC45OTc4MTk5MzYzRiwgMC45OTc4MzU4NTAxRiwgMC45OTc4NTE2NzgwRiwKKyAgICAwLjk5Nzg2NzQyMDJGLCAwLjk5Nzg4MzA3NzFGLCAwLjk5Nzg5ODY0ODhGLCAwLjk5NzkxNDEzNThGLAorICAgIDAuOTk3OTI5NTM4M0YsIDAuOTk3OTQ0ODU2NkYsIDAuOTk3OTYwMDkwOUYsIDAuOTk3OTc1MjQxN0YsCisgICAgMC45OTc5OTAzMDkxRiwgMC45OTgwMDUyOTM2RiwgMC45OTgwMjAxOTUyRiwgMC45OTgwMzUwMTQ1RiwKKyAgICAwLjk5ODA0OTc1MTVGLCAwLjk5ODA2NDQwNjdGLCAwLjk5ODA3ODk4MDRGLCAwLjk5ODA5MzQ3MjdGLAorICAgIDAuOTk4MTA3ODg0MUYsIDAuOTk4MTIyMjE0N0YsIDAuOTk4MTM2NDY0OUYsIDAuOTk4MTUwNjM1MEYsCisgICAgMC45OTgxNjQ3MjUzRiwgMC45OTgxNzg3MzYwRiwgMC45OTgxOTI2Njc0RiwgMC45OTgyMDY1MTk5RiwKKyAgICAwLjk5ODIyMDI5MzZGLCAwLjk5ODIzMzk4OTBGLCAwLjk5ODI0NzYwNjJGLCAwLjk5ODI2MTE0NTZGLAorICAgIDAuOTk4Mjc0NjA3NEYsIDAuOTk4Mjg3OTkyMEYsIDAuOTk4MzAxMjk5NkYsIDAuOTk4MzE0NTMwNEYsCisgICAgMC45OTgzMjc2ODQ5RiwgMC45OTgzNDA3NjMyRiwgMC45OTgzNTM3NjU3RiwgMC45OTgzNjY2OTI2RiwKKyAgICAwLjk5ODM3OTU0NDJGLCAwLjk5ODM5MjMyMDhGLCAwLjk5ODQwNTAyMjZGLCAwLjk5ODQxNzY1MDFGLAorICAgIDAuOTk4NDMwMjAzM0YsIDAuOTk4NDQyNjgyN0YsIDAuOTk4NDU1MDg4NEYsIDAuOTk4NDY3NDIwOEYsCisgICAgMC45OTg0Nzk2ODAyRiwgMC45OTg0OTE4NjY3RiwgMC45OTg1MDM5ODA4RiwgMC45OTg1MTYwMjI3RiwKKyAgICAwLjk5ODUyNzk5MjZGLCAwLjk5ODUzOTg5MDlGLCAwLjk5ODU1MTcxNzdGLCAwLjk5ODU2MzQ3MzRGLAorICAgIDAuOTk4NTc1MTU4M0YsIDAuOTk4NTg2NzcyN0YsIDAuOTk4NTk4MzE2N0YsIDAuOTk4NjA5NzkwN0YsCisgICAgMC45OTg2MjExOTQ5RiwgMC45OTg2MzI1Mjk3RiwgMC45OTg2NDM3OTUzRiwgMC45OTg2NTQ5OTE5RiwKKyAgICAwLjk5ODY2NjExOTlGLCAwLjk5ODY3NzE3OTVGLCAwLjk5ODY4ODE3MTBGLCAwLjk5ODY5OTA5NDZGLAorICAgIDAuOTk4NzA5OTUwN0YsIDAuOTk4NzIwNzM5NEYsIDAuOTk4NzMxNDYxMUYsIDAuOTk4NzQyMTE2MUYsCisgICAgMC45OTg3NTI3MDQ1RiwgMC45OTg3NjMyMjY3RiwgMC45OTg3NzM2ODI5RiwgMC45OTg3ODQwNzM0RiwKKyAgICAwLjk5ODc5NDM5ODVGLCAwLjk5ODgwNDY1ODRGLCAwLjk5ODgxNDg1MzRGLCAwLjk5ODgyNDk4MzhGLAorICAgIDAuOTk4ODM1MDQ5OEYsIDAuOTk4ODQ1MDUxNkYsIDAuOTk4ODU0OTg5N0YsIDAuOTk4ODY0ODY0MUYsCisgICAgMC45OTg4NzQ2NzUzRiwgMC45OTg4ODQ0MjMzRiwgMC45OTg4OTQxMDg2RiwgMC45OTg5MDM3MzEzRiwKKyAgICAwLjk5ODkxMzI5MThGLCAwLjk5ODkyMjc5MDJGLCAwLjk5ODkzMjIyNjlGLCAwLjk5ODk0MTYwMjFGLAorICAgIDAuOTk4OTUwOTE2MEYsIDAuOTk4OTYwMTY5MEYsIDAuOTk4OTY5MzYxM0YsIDAuOTk4OTc4NDkzMUYsCisgICAgMC45OTg5ODc1NjQ3RiwgMC45OTg5OTY1NzYzRiwgMC45OTkwMDU1MjgzRiwgMC45OTkwMTQ0MjA4RiwKKyAgICAwLjk5OTAyMzI1NDFGLCAwLjk5OTAzMjAyODZGLCAwLjk5OTA0MDc0NDNGLCAwLjk5OTA0OTQwMTZGLAorICAgIDAuOTk5MDU4MDAwOEYsIDAuOTk5MDY2NTQyMUYsIDAuOTk5MDc1MDI1N0YsIDAuOTk5MDgzNDUxOUYsCisgICAgMC45OTkwOTE4MjA5RiwgMC45OTkxMDAxMzMxRiwgMC45OTkxMDgzODg2RiwgMC45OTkxMTY1ODc3RiwKKyAgICAwLjk5OTEyNDczMDdGLCAwLjk5OTEzMjgxNzdGLCAwLjk5OTE0MDg0OTFGLCAwLjk5OTE0ODgyNTFGLAorICAgIDAuOTk5MTU2NzQ2MEYsIDAuOTk5MTY0NjExOUYsIDAuOTk5MTcyNDIzMkYsIDAuOTk5MTgwMTgwMUYsCisgICAgMC45OTkxODc4ODI4RiwgMC45OTkxOTU1MzE2RiwgMC45OTkyMDMxMjY3RiwgMC45OTkyMTA2Njg0RiwKKyAgICAwLjk5OTIxODE1NjlGLCAwLjk5OTIyNTU5MjVGLCAwLjk5OTIzMjk3NTNGLCAwLjk5OTI0MDMwNTdGLAorICAgIDAuOTk5MjQ3NTgzOUYsIDAuOTk5MjU0ODEwMUYsIDAuOTk5MjYxOTg0NkYsIDAuOTk5MjY5MTA3NkYsCisgICAgMC45OTkyNzYxNzkzRiwgMC45OTkyODMyMDAxRiwgMC45OTkyOTAxNzAxRiwgMC45OTkyOTcwODk1RiwKKyAgICAwLjk5OTMwMzk1ODdGLCAwLjk5OTMxMDc3NzdGLCAwLjk5OTMxNzU0NzBGLCAwLjk5OTMyNDI2NjdGLAorICAgIDAuOTk5MzMwOTM3MUYsIDAuOTk5MzM3NTU4M0YsIDAuOTk5MzQ0MTMwN0YsIDAuOTk5MzUwNjU0NUYsCisgICAgMC45OTkzNTcxMjk4RiwgMC45OTkzNjM1NTcwRiwgMC45OTkzNjk5MzYyRiwgMC45OTkzNzYyNjc4RiwKKyAgICAwLjk5OTM4MjU1MTlGLCAwLjk5OTM4ODc4ODdGLCAwLjk5OTM5NDk3ODVGLCAwLjk5OTQwMTEyMTZGLAorICAgIDAuOTk5NDA3MjE4MUYsIDAuOTk5NDEzMjY4M0YsIDAuOTk5NDE5MjcyNUYsIDAuOTk5NDI1MjMwN0YsCisgICAgMC45OTk0MzExNDM0RiwgMC45OTk0MzcwMTA3RiwgMC45OTk0NDI4MzI3RiwgMC45OTk0NDg2MDk5RiwKKyAgICAwLjk5OTQ1NDM0MjNGLCAwLjk5OTQ2MDAzMDNGLCAwLjk5OTQ2NTY3MzlGLCAwLjk5OTQ3MTI3MzZGLAorICAgIDAuOTk5NDc2ODI5NEYsIDAuOTk5NDgyMzQxN0YsIDAuOTk5NDg3ODEwNUYsIDAuOTk5NDkzMjM2M0YsCisgICAgMC45OTk0OTg2MTkxRiwgMC45OTk1MDM5NTkyRiwgMC45OTk1MDkyNTY4RiwgMC45OTk1MTQ1MTIyRiwKKyAgICAwLjk5OTUxOTcyNTZGLCAwLjk5OTUyNDg5NzFGLCAwLjk5OTUzMDAyNzBGLCAwLjk5OTUzNTExNTZGLAorICAgIDAuOTk5NTQwMTYzMEYsIDAuOTk5NTQ1MTY5NUYsIDAuOTk5NTUwMTM1MkYsIDAuOTk5NTU1MDYwNEYsCisgICAgMC45OTk1NTk5NDU0RiwgMC45OTk1NjQ3OTAzRiwgMC45OTk1Njk1OTUzRiwgMC45OTk1NzQzNjA3RiwKKyAgICAwLjk5OTU3OTA4NjZGLCAwLjk5OTU4Mzc3MzRGLCAwLjk5OTU4ODQyMTFGLCAwLjk5OTU5MzAzMDBGLAorICAgIDAuOTk5NTk3NjAwNEYsIDAuOTk5NjAyMTMyNEYsIDAuOTk5NjA2NjI2M0YsIDAuOTk5NjExMDgyMkYsCisgICAgMC45OTk2MTU1MDA0RiwgMC45OTk2MTk4ODEwRiwgMC45OTk2MjQyMjQ0RiwgMC45OTk2Mjg1MzA2RiwKKyAgICAwLjk5OTYzMjc5OTlGLCAwLjk5OTYzNzAzMjZGLCAwLjk5OTY0MTIyODdGLCAwLjk5OTY0NTM4ODZGLAorICAgIDAuOTk5NjQ5NTEyNUYsIDAuOTk5NjUzNjAwNEYsIDAuOTk5NjU3NjUyN0YsIDAuOTk5NjYxNjY5NkYsCisgICAgMC45OTk2NjU2NTEyRiwgMC45OTk2Njk1OTc3RiwgMC45OTk2NzM1MDk0RiwgMC45OTk2NzczODY1RiwKKyAgICAwLjk5OTY4MTIyOTFGLCAwLjk5OTY4NTAzNzRGLCAwLjk5OTY4ODgxMThGLCAwLjk5OTY5MjU1MjNGLAorICAgIDAuOTk5Njk2MjU5MUYsIDAuOTk5Njk5OTMyNUYsIDAuOTk5NzAzNTcyN0YsIDAuOTk5NzA3MTc5OEYsCisgICAgMC45OTk3MTA3NTQxRiwgMC45OTk3MTQyOTU3RiwgMC45OTk3MTc4MDQ5RiwgMC45OTk3MjEyODE4RiwKKyAgICAwLjk5OTcyNDcyNjZGLCAwLjk5OTcyODEzOTZGLCAwLjk5OTczMTUyMDlGLCAwLjk5OTczNDg3MDhGLAorICAgIDAuOTk5NzM4MTg5M0YsIDAuOTk5NzQxNDc2N0YsIDAuOTk5NzQ0NzMzM0YsIDAuOTk5NzQ3OTU5MUYsCisgICAgMC45OTk3NTExNTQ0RiwgMC45OTk3NTQzMTk0RiwgMC45OTk3NTc0NTQyRiwgMC45OTk3NjA1NTkxRiwKKyAgICAwLjk5OTc2MzYzNDJGLCAwLjk5OTc2NjY3OTdGLCAwLjk5OTc2OTY5NThGLCAwLjk5OTc3MjY4MjhGLAorICAgIDAuOTk5Nzc1NjQwN0YsIDAuOTk5Nzc4NTY5OEYsIDAuOTk5NzgxNDcwM0YsIDAuOTk5Nzg0MzQyM0YsCisgICAgMC45OTk3ODcxODYwRiwgMC45OTk3OTAwMDE2RiwgMC45OTk3OTI3ODk0RiwgMC45OTk3OTU1NDk0RiwKKyAgICAwLjk5OTc5ODI4MThGLCAwLjk5OTgwMDk4NjlGLCAwLjk5OTgwMzY2NDhGLCAwLjk5OTgwNjMxNTdGLAorICAgIDAuOTk5ODA4OTM5OEYsIDAuOTk5ODExNTM3M0YsIDAuOTk5ODE0MTA4MkYsIDAuOTk5ODE2NjUyOUYsCisgICAgMC45OTk4MTkxNzE1RiwgMC45OTk4MjE2NjQyRiwgMC45OTk4MjQxMzExRiwgMC45OTk4MjY1NzI0RiwKKyAgICAwLjk5OTgyODk4ODRGLCAwLjk5OTgzMTM3OTBGLCAwLjk5OTgzMzc0NDdGLCAwLjk5OTgzNjA4NTRGLAorICAgIDAuOTk5ODM4NDAxNUYsIDAuOTk5ODQwNjkzMEYsIDAuOTk5ODQyOTYwMkYsIDAuOTk5ODQ1MjAzMUYsCisgICAgMC45OTk4NDc0MjIxRiwgMC45OTk4NDk2MTcxRiwgMC45OTk4NTE3ODg1RiwgMC45OTk4NTM5MzY0RiwKKyAgICAwLjk5OTg1NjA2MTBGLCAwLjk5OTg1ODE2MjRGLCAwLjk5OTg2MDI0MDdGLCAwLjk5OTg2MjI5NjJGLAorICAgIDAuOTk5ODY0MzI5MUYsIDAuOTk5ODY2MzM5NEYsIDAuOTk5ODY4MzI3NEYsIDAuOTk5ODcwMjkzMkYsCisgICAgMC45OTk4NzIyMzcwRiwgMC45OTk4NzQxNTg5RiwgMC45OTk4NzYwNTkxRiwgMC45OTk4Nzc5Mzc4RiwKKyAgICAwLjk5OTg3OTc5NTJGLCAwLjk5OTg4MTYzMTNGLCAwLjk5OTg4MzQ0NjRGLCAwLjk5OTg4NTI0MDZGLAorICAgIDAuOTk5ODg3MDE0MUYsIDAuOTk5ODg4NzY3MEYsIDAuOTk5ODkwNDk5NUYsIDAuOTk5ODkyMjExN0YsCisgICAgMC45OTk4OTM5MDM5RiwgMC45OTk4OTU1NzYxRiwgMC45OTk4OTcyMjg1RiwgMC45OTk4OTg4NjEzRiwKKyAgICAwLjk5OTkwMDQ3NDZGLCAwLjk5OTkwMjA2ODZGLCAwLjk5OTkwMzY0MzRGLCAwLjk5OTkwNTE5OTJGLAorICAgIDAuOTk5OTA2NzM2MkYsIDAuOTk5OTA4MjU0NEYsIDAuOTk5OTA5NzU0MUYsIDAuOTk5OTExMjM1NEYsCisgICAgMC45OTk5MTI2OTg0RiwgMC45OTk5MTQxNDMzRiwgMC45OTk5MTU1NzAzRiwgMC45OTk5MTY5Nzk0RiwKKyAgICAwLjk5OTkxODM3MDlGLCAwLjk5OTkxOTc0NDlGLCAwLjk5OTkyMTEwMTRGLCAwLjk5OTkyMjQ0MDhGLAorICAgIDAuOTk5OTIzNzYzMUYsIDAuOTk5OTI1MDY4NEYsIDAuOTk5OTI2MzU3MEYsIDAuOTk5OTI3NjI4OUYsCisgICAgMC45OTk5Mjg4ODQzRiwgMC45OTk5MzAxMjMzRiwgMC45OTk5MzEzNDYxRiwgMC45OTk5MzI1NTI5RiwKKyAgICAwLjk5OTkzMzc0MzdGLCAwLjk5OTkzNDkxODdGLCAwLjk5OTkzNjA3ODBGLCAwLjk5OTkzNzIyMThGLAorICAgIDAuOTk5OTM4MzUwM0YsIDAuOTk5OTM5NDYzNUYsIDAuOTk5OTQwNTYxNkYsIDAuOTk5OTQxNjQ0N0YsCisgICAgMC45OTk5NDI3MTI5RiwgMC45OTk5NDM3NjY1RiwgMC45OTk5NDQ4MDU1RiwgMC45OTk5NDU4MzAxRiwKKyAgICAwLjk5OTk0Njg0MDRGLCAwLjk5OTk0NzgzNjVGLCAwLjk5OTk0ODgxODVGLCAwLjk5OTk0OTc4NjdGLAorICAgIDAuOTk5OTUwNzQxMUYsIDAuOTk5OTUxNjgxOUYsIDAuOTk5OTUyNjA5MUYsIDAuOTk5OTUzNTIzMEYsCisgICAgMC45OTk5NTQ0MjM2RiwgMC45OTk5NTUzMTExRiwgMC45OTk5NTYxODU2RiwgMC45OTk5NTcwNDcyRiwKKyAgICAwLjk5OTk1Nzg5NjBGLCAwLjk5OTk1ODczMjNGLCAwLjk5OTk1OTU1NjBGLCAwLjk5OTk2MDM2NzRGLAorICAgIDAuOTk5OTYxMTY2NkYsIDAuOTk5OTYxOTUzNkYsIDAuOTk5OTYyNzI4NkYsIDAuOTk5OTYzNDkxN0YsCisgICAgMC45OTk5NjQyNDMxRiwgMC45OTk5NjQ5ODI4RiwgMC45OTk5NjU3MTEwRiwgMC45OTk5NjY0Mjc4RiwKKyAgICAwLjk5OTk2NzEzMzRGLCAwLjk5OTk2NzgyNzhGLCAwLjk5OTk2ODUxMTFGLCAwLjk5OTk2OTE4MzVGLAorICAgIDAuOTk5OTY5ODQ1MUYsIDAuOTk5OTcwNDk2MEYsIDAuOTk5OTcxMTM2NEYsIDAuOTk5OTcxNzY2MkYsCisgICAgMC45OTk5NzIzODU4RiwgMC45OTk5NzI5OTUwRiwgMC45OTk5NzM1OTQyRiwgMC45OTk5NzQxODM0RiwKKyAgICAwLjk5OTk3NDc2MjZGLCAwLjk5OTk3NTMzMjFGLCAwLjk5OTk3NTg5MTlGLCAwLjk5OTk3NjQ0MjFGLAorICAgIDAuOTk5OTc2OTgyOEYsIDAuOTk5OTc3NTE0M0YsIDAuOTk5OTc4MDM2NEYsIDAuOTk5OTc4NTQ5NUYsCisgICAgMC45OTk5NzkwNTM1RiwgMC45OTk5Nzk1NDg1RiwgMC45OTk5ODAwMzQ4RiwgMC45OTk5ODA1MTI0RiwKKyAgICAwLjk5OTk4MDk4MTNGLCAwLjk5OTk4MTQ0MTdGLCAwLjk5OTk4MTg5MzhGLCAwLjk5OTk4MjMzNzVGLAorICAgIDAuOTk5OTgyNzczMUYsIDAuOTk5OTgzMjAwNUYsIDAuOTk5OTgzNjIwMEYsIDAuOTk5OTg0MDMxNkYsCisgICAgMC45OTk5ODQ0MzUzRiwgMC45OTk5ODQ4MzE0RiwgMC45OTk5ODUyMTk5RiwgMC45OTk5ODU2MDA4RiwKKyAgICAwLjk5OTk4NTk3NDRGLCAwLjk5OTk4NjM0MDdGLCAwLjk5OTk4NjY5OTdGLCAwLjk5OTk4NzA1MTZGLAorICAgIDAuOTk5OTg3Mzk2NUYsIDAuOTk5OTg3NzM0NUYsIDAuOTk5OTg4MDY1NkYsIDAuOTk5OTg4MzkwMEYsCisgICAgMC45OTk5ODg3MDc4RiwgMC45OTk5ODkwMTkwRiwgMC45OTk5ODkzMjM3RiwgMC45OTk5ODk2MjIwRiwKKyAgICAwLjk5OTk4OTkxNDBGLCAwLjk5OTk5MDE5OTlGLCAwLjk5OTk5MDQ3OTZGLCAwLjk5OTk5MDc1MzNGLAorICAgIDAuOTk5OTkxMDIxMUYsIDAuOTk5OTkxMjgzMEYsIDAuOTk5OTkxNTM5MUYsIDAuOTk5OTkxNzg5NkYsCisgICAgMC45OTk5OTIwMzQ1RiwgMC45OTk5OTIyNzM4RiwgMC45OTk5OTI1MDc3RiwgMC45OTk5OTI3MzYzRiwKKyAgICAwLjk5OTk5Mjk1OTZGLCAwLjk5OTk5MzE3NzdGLCAwLjk5OTk5MzM5MDdGLCAwLjk5OTk5MzU5ODdGLAorICAgIDAuOTk5OTkzODAxOEYsIDAuOTk5OTk0MDAwMEYsIDAuOTk5OTk0MTkzNEYsIDAuOTk5OTk0MzgyMEYsCisgICAgMC45OTk5OTQ1NjYxRiwgMC45OTk5OTQ3NDU2RiwgMC45OTk5OTQ5MjA2RiwgMC45OTk5OTUwOTEyRiwKKyAgICAwLjk5OTk5NTI1NzVGLCAwLjk5OTk5NTQxOTVGLCAwLjk5OTk5NTU3NzNGLCAwLjk5OTk5NTczMTFGLAorICAgIDAuOTk5OTk1ODgwN0YsIDAuOTk5OTk2MDI2NUYsIDAuOTk5OTk2MTY4M0YsIDAuOTk5OTk2MzA2M0YsCisgICAgMC45OTk5OTY0NDA1RiwgMC45OTk5OTY1NzEwRiwgMC45OTk5OTY2OTc5RiwgMC45OTk5OTY4MjEzRiwKKyAgICAwLjk5OTk5Njk0MTJGLCAwLjk5OTk5NzA1NzZGLCAwLjk5OTk5NzE3MDdGLCAwLjk5OTk5NzI4MDVGLAorICAgIDAuOTk5OTk3Mzg3MUYsIDAuOTk5OTk3NDkwNUYsIDAuOTk5OTk3NTkwOUYsIDAuOTk5OTk3Njg4MUYsCisgICAgMC45OTk5OTc3ODI0RiwgMC45OTk5OTc4NzM4RiwgMC45OTk5OTc5NjI0RiwgMC45OTk5OTgwNDgxRiwKKyAgICAwLjk5OTk5ODEzMTFGLCAwLjk5OTk5ODIxMTVGLCAwLjk5OTk5ODI4OTJGLCAwLjk5OTk5ODM2NDRGLAorICAgIDAuOTk5OTk4NDM3MEYsIDAuOTk5OTk4NTA3MkYsIDAuOTk5OTk4NTc1MEYsIDAuOTk5OTk4NjQwNUYsCisgICAgMC45OTk5OTg3MDM3RiwgMC45OTk5OTg3NjQ3RiwgMC45OTk5OTg4MjM1RiwgMC45OTk5OTg4ODAyRiwKKyAgICAwLjk5OTk5ODkzNDhGLCAwLjk5OTk5ODk4NzNGLCAwLjk5OTk5OTAzNzlGLCAwLjk5OTk5OTA4NjZGLAorICAgIDAuOTk5OTk5MTMzNEYsIDAuOTk5OTk5MTc4NEYsIDAuOTk5OTk5MjIxN0YsIDAuOTk5OTk5MjYzMkYsCisgICAgMC45OTk5OTkzMDMwRiwgMC45OTk5OTkzNDExRiwgMC45OTk5OTkzNzc3RiwgMC45OTk5OTk0MTI4RiwKKyAgICAwLjk5OTk5OTQ0NjNGLCAwLjk5OTk5OTQ3ODRGLCAwLjk5OTk5OTUwOTFGLCAwLjk5OTk5OTUzODRGLAorICAgIDAuOTk5OTk5NTY2M0YsIDAuOTk5OTk5NTkzMEYsIDAuOTk5OTk5NjE4NEYsIDAuOTk5OTk5NjQyNkYsCisgICAgMC45OTk5OTk2NjU3RiwgMC45OTk5OTk2ODc2RiwgMC45OTk5OTk3MDg0RiwgMC45OTk5OTk3MjgyRiwKKyAgICAwLjk5OTk5OTc0NjlGLCAwLjk5OTk5OTc2NDdGLCAwLjk5OTk5OTc4MTVGLCAwLjk5OTk5OTc5NzNGLAorICAgIDAuOTk5OTk5ODEyM0YsIDAuOTk5OTk5ODI2NUYsIDAuOTk5OTk5ODM5OEYsIDAuOTk5OTk5ODUyNEYsCisgICAgMC45OTk5OTk4NjQyRiwgMC45OTk5OTk4NzUzRiwgMC45OTk5OTk4ODU3RiwgMC45OTk5OTk4OTU0RiwKKyAgICAwLjk5OTk5OTkwNDVGLCAwLjk5OTk5OTkxMzBGLCAwLjk5OTk5OTkyMDlGLCAwLjk5OTk5OTkyODJGLAorICAgIDAuOTk5OTk5OTM1MUYsIDAuOTk5OTk5OTQxNEYsIDAuOTk5OTk5OTQ3MkYsIDAuOTk5OTk5OTUyNkYsCisgICAgMC45OTk5OTk5NTc2RiwgMC45OTk5OTk5NjIyRiwgMC45OTk5OTk5NjY0RiwgMC45OTk5OTk5NzAyRiwKKyAgICAwLjk5OTk5OTk3MzdGLCAwLjk5OTk5OTk3NjlGLCAwLjk5OTk5OTk3OThGLCAwLjk5OTk5OTk4MjRGLAorICAgIDAuOTk5OTk5OTg0N0YsIDAuOTk5OTk5OTg2OEYsIDAuOTk5OTk5OTg4N0YsIDAuOTk5OTk5OTkwNEYsCisgICAgMC45OTk5OTk5OTE5RiwgMC45OTk5OTk5OTMyRiwgMC45OTk5OTk5OTQzRiwgMC45OTk5OTk5OTUzRiwKKyAgICAwLjk5OTk5OTk5NjFGLCAwLjk5OTk5OTk5NjlGLCAwLjk5OTk5OTk5NzVGLCAwLjk5OTk5OTk5ODBGLAorICAgIDAuOTk5OTk5OTk4NUYsIDAuOTk5OTk5OTk4OEYsIDAuOTk5OTk5OTk5MUYsIDAuOTk5OTk5OTk5M0YsCisgICAgMC45OTk5OTk5OTk1RiwgMC45OTk5OTk5OTk3RiwgMC45OTk5OTk5OTk4RiwgMC45OTk5OTk5OTk5RiwKKyAgICAwLjk5OTk5OTk5OTlGLCAxLjAwMDAwMDAwMDBGLCAxLjAwMDAwMDAwMDBGLCAxLjAwMDAwMDAwMDBGLAorICAgIDEuMDAwMDAwMDAwMEYsIDEuMDAwMDAwMDAwMEYsIDEuMDAwMDAwMDAwMEYsIDEuMDAwMDAwMDAwMEYsCit9OworCitjb25zdCBmbG9hdCBmZl92b3JiaXNfZmxvb3IxX2ludmVyc2VfZGJfdGFibGVbMjU2XT17CisgICAgMS4wNjQ5ODYzZS0wN0YsIDEuMTM0MTk1MWUtMDdGLCAxLjIwNzkwMTVlLTA3RiwgMS4yODYzOTc4ZS0wN0YsCisgICAgMS4zNjk5OTUxZS0wN0YsIDEuNDU5MDI1MWUtMDdGLCAxLjU1Mzg0MDhlLTA3RiwgMS42NTQ4MTgxZS0wN0YsCisgICAgMS43NjIzNTc1ZS0wN0YsIDEuODc2ODg1NWUtMDdGLCAxLjk5ODg1NjFlLTA3RiwgMi4xMjg3NTNlLTA3RiwKKyAgICAyLjI2NzA5MTNlLTA3RiwgMi40MTQ0MTk3ZS0wN0YsIDIuNTcxMzIyM2UtMDdGLCAyLjczODQyMTNlLTA3RiwKKyAgICAyLjkxNjM3OTNlLTA3RiwgMy4xMDU5MDIxZS0wN0YsIDMuMzA3NzQxMWUtMDdGLCAzLjUyMjY5NjhlLTA3RiwKKyAgICAzLjc1MTYyMTRlLTA3RiwgMy45OTU0MjI5ZS0wN0YsIDQuMjU1MDY4MGUtMDdGLCA0LjUzMTU4NjNlLTA3RiwKKyAgICA0LjgyNjA3NDNlLTA3RiwgNS4xMzk2OTk4ZS0wN0YsIDUuNDczNzA2NWUtMDdGLCA1LjgyOTQxODdlLTA3RiwKKyAgICA2LjIwODI0NzJlLTA3RiwgNi42MTE2OTQxZS0wN0YsIDcuMDQxMzU5MmUtMDdGLCA3LjQ5ODk0NjRlLTA3RiwKKyAgICA3Ljk4NjI3MDFlLTA3RiwgOC41MDUyNjMwZS0wN0YsIDkuMDU3OTgyOGUtMDdGLCA5LjY0NjYyMTZlLTA3RiwKKyAgICAxLjAyNzM1MTNlLTA2RiwgMS4wOTQxMTQ0ZS0wNkYsIDEuMTY1MjE2MWUtMDZGLCAxLjI0MDkzODRlLTA2RiwKKyAgICAxLjMyMTU4MTZlLTA2RiwgMS40MDc0NjU0ZS0wNkYsIDEuNDk4OTMwNWUtMDZGLCAxLjU5NjMzOTRlLTA2RiwKKyAgICAxLjcwMDA3ODVlLTA2RiwgMS44MTA1NTkyZS0wNkYsIDEuOTI4MjE5NWUtMDZGLCAyLjA1MzUyNjFlLTA2RiwKKyAgICAyLjE4Njk3NThlLTA2RiwgMi4zMjkwOTc4ZS0wNkYsIDIuNDgwNDU1N2UtMDZGLCAyLjY0MTY0OTdlLTA2RiwKKyAgICAyLjgxMzMxOTBlLTA2RiwgMi45OTYxNDQzZS0wNkYsIDMuMTkwODUwNmUtMDZGLCAzLjM5ODIxMDFlLTA2RiwKKyAgICAzLjYxOTA0NDllLTA2RiwgMy44NTQyMzA4ZS0wNkYsIDQuMTA0NzAwNGUtMDZGLCA0LjM3MTQ0NzBlLTA2RiwKKyAgICA0LjY1NTUyODJlLTA2RiwgNC45NTgwNzA3ZS0wNkYsIDUuMjgwMjc0MGUtMDZGLCA1LjYyMzQxNjBlLTA2RiwKKyAgICA1Ljk4ODg1NzJlLTA2RiwgNi4zNzgwNDY5ZS0wNkYsIDYuNzkyNTI4M2UtMDZGLCA3LjIzMzk0NTFlLTA2RiwKKyAgICA3LjcwNDA0NzZlLTA2RiwgOC4yMDQ3MDAwZS0wNkYsIDguNzM3ODg3NmUtMDZGLCA5LjMwNTcyNDhlLTA2RiwKKyAgICA5LjkxMDQ2MzJlLTA2RiwgMS4wNTU0NTAxZS0wNUYsIDEuMTI0MDM5MmUtMDVGLCAxLjE5NzA4NTZlLTA1RiwKKyAgICAxLjI3NDg3ODllLTA1RiwgMS4zNTc3Mjc4ZS0wNUYsIDEuNDQ1OTYwNmUtMDVGLCAxLjUzOTkyNzJlLTA1RiwKKyAgICAxLjY0MDAwMDRlLTA1RiwgMS43NDY1NzY4ZS0wNUYsIDEuODYwMDc5MmUtMDVGLCAxLjk4MDk1NzZlLTA1RiwKKyAgICAyLjEwOTY5MTRlLTA1RiwgMi4yNDY3OTExZS0wNUYsIDIuMzkyODAwMmUtMDVGLCAyLjU0ODI5NzhlLTA1RiwKKyAgICAyLjcxMzkwMDZlLTA1RiwgMi44OTAyNjUxZS0wNUYsIDMuMDc4MDkwOGUtMDVGLCAzLjI3ODEyMjVlLTA1RiwKKyAgICAzLjQ5MTE1MzRlLTA1RiwgMy43MTgwMjgyZS0wNUYsIDMuOTU5NjQ2NmUtMDVGLCA0LjIxNjk2NjdlLTA1RiwKKyAgICA0LjQ5MTAwOTBlLTA1RiwgNC43ODI4NjAxZS0wNUYsIDUuMDkzNjc3M2UtMDVGLCA1LjQyNDY5MzFlLTA1RiwKKyAgICA1Ljc3NzIyMDJlLTA1RiwgNi4xNTI2NTY1ZS0wNUYsIDYuNTUyNDkwOGUtMDVGLCA2Ljk3ODMwODVlLTA1RiwKKyAgICA3LjQzMTc5ODNlLTA1RiwgNy45MTQ3NTg1ZS0wNUYsIDguNDI5MTA0MGUtMDVGLCA4Ljk3Njg3NDdlLTA1RiwKKyAgICA5LjU2MDI0MjZlLTA1RiwgMC4wMDAxMDE4MTUyMUYsIDAuMDAwMTA4NDMxNzRGLCAwLjAwMDExNTQ3ODI0RiwKKyAgICAwLjAwMDEyMjk4MjY3RiwgMC4wMDAxMzA5NzQ3N0YsIDAuMDAwMTM5NDg2MjVGLCAwLjAwMDE0ODU1MDg1RiwKKyAgICAwLjAwMDE1ODIwNDUzRiwgMC4wMDAxNjg0ODU1NUYsIDAuMDAwMTc5NDM0NjlGLCAwLjAwMDE5MTA5NTM2RiwKKyAgICAwLjAwMDIwMzUxMzgyRiwgMC4wMDAyMTY3MzkyOUYsIDAuMDAwMjMwODI0MjNGLCAwLjAwMDI0NTgyNDQ5RiwKKyAgICAwLjAwMDI2MTc5OTU1RiwgMC4wMDAyNzg4MTI3NkYsIDAuMDAwMjk2OTMxNThGLCAwLjAwMDMxNjIyNzg3RiwKKyAgICAwLjAwMDMzNjc3ODE0RiwgMC4wMDAzNTg2NjM4OEYsIDAuMDAwMzgxOTcxODhGLCAwLjAwMDQwNjc5NDU2RiwKKyAgICAwLjAwMDQzMzIzMDM2RiwgMC4wMDA0NjEzODQxMUYsIDAuMDAwNDkxMzY3NDVGLCAwLjAwMDUyMzI5OTI3RiwKKyAgICAwLjAwMDU1NzMwNjIxRiwgMC4wMDA1OTM1MjMxMUYsIDAuMDAwNjMyMDkzNThGLCAwLjAwMDY3MzE3MDU4RiwKKyAgICAwLjAwMDcxNjkxNzAwRiwgMC4wMDA3NjM1MDYzMEYsIDAuMDAwODEzMTIzMjRGLCAwLjAwMDg2NTk2NDU3RiwKKyAgICAwLjAwMDkyMjIzOTgzRiwgMC4wMDA5ODIxNzIxNkYsIDAuMDAxMDQ1OTk5MkYsICAwLjAwMTExMzk3NDJGLAorICAgIDAuMDAxMTg2MzY2NUYsICAwLjAwMTI2MzQ2MzNGLCAgMC4wMDEzNDU1NzAyRiwgIDAuMDAxNDMzMDEyOUYsCisgICAgMC4wMDE1MjYxMzgyRiwgIDAuMDAxNjI1MzE1M0YsICAwLjAwMTczMDkzNzRGLCAgMC4wMDE4NDM0MjM1RiwKKyAgICAwLjAwMTk2MzIxOTVGLCAgMC4wMDIwOTA4MDA2RiwgIDAuMDAyMjI2NjcyNkYsICAwLjAwMjM3MTM3NDNGLAorICAgIDAuMDAyNTI1NDc5NUYsICAwLjAwMjY4OTU5OTRGLCAgMC4wMDI4NjQzODQ3RiwgIDAuMDAzMDUwNTI4NkYsCisgICAgMC4wMDMyNDg3NjkxRiwgIDAuMDAzNDU5ODkyNUYsICAwLjAwMzY4NDczNThGLCAgMC4wMDM5MjQxOTA2RiwKKyAgICAwLjAwNDE3OTIwNjZGLCAgMC4wMDQ0NTA3OTUwRiwgIDAuMDA0NzQwMDMyOEYsICAwLjAwNTA0ODA2NjhGLAorICAgIDAuMDA1Mzc2MTE4NkYsICAwLjAwNTcyNTQ4OTFGLCAgMC4wMDYwOTc1NjM2RiwgIDAuMDA2NDkzODE3NkYsCisgICAgMC4wMDY5MTU4MjI1RiwgIDAuMDA3MzY1MjUxNkYsICAwLjAwNzg0Mzg4NzFGLCAgMC4wMDgzNTM2MjcxRiwKKyAgICAwLjAwODg5NjQ5MjhGLCAgMC4wMDk0NzQ2MzdGLCAgIDAuMDEwMDkwMzUyRiwgICAwLjAxMDc0NjA4MEYsCisgICAgMC4wMTE0NDQ0MjFGLCAgIDAuMDEyMTg4MTQ0RiwgICAwLjAxMjk4MDE5OEYsICAgMC4wMTM4MjM3MjVGLAorICAgIDAuMDE0NzIyMDY4RiwgICAwLjAxNTY3ODc5MUYsICAgMC4wMTY2OTc2ODdGLCAgIDAuMDE3NzgyNzk3RiwKKyAgICAwLjAxODkzODQyM0YsICAgMC4wMjAxNjkxNDlGLCAgIDAuMDIxNDc5ODU0RiwgICAwLjAyMjg3NTczNUYsCisgICAgMC4wMjQzNjIzMzBGLCAgIDAuMDI1OTQ1NTMxRiwgICAwLjAyNzYzMTYxOEYsICAgMC4wMjk0MjcyNzZGLAorICAgIDAuMDMxMzM5NjI2RiwgICAwLjAzMzM3NjI1MkYsICAgMC4wMzU1NDUyMjhGLCAgIDAuMDM3ODU1MTU3RiwKKyAgICAwLjA0MDMxNTE5OUYsICAgMC4wNDI5MzUxMDhGLCAgIDAuMDQ1NzI1MjczRiwgICAwLjA0ODY5Njc1OEYsCisgICAgMC4wNTE4NjEzNDhGLCAgIDAuMDU1MjMxNTkxRiwgICAwLjA1ODgyMDg1MEYsICAgMC4wNjI2NDMzNjFGLAorICAgIDAuMDY2NzE0Mjc5RiwgICAwLjA3MTA0OTc0OUYsICAgMC4wNzU2NjY5NjJGLCAgIDAuMDgwNTg0MjI3RiwKKyAgICAwLjA4NTgyMTA0NEYsICAgMC4wOTEzOTgxNzlGLCAgIDAuMDk3MzM3NzQ3RiwgICAwLjEwMzY2MzMwRiwKKyAgICAwLjExMDM5OTkzRiwgICAgMC4xMTc1NzQzNEYsICAgIDAuMTI1MjE0OThGLCAgICAwLjEzMzM1MjE1RiwKKyAgICAwLjE0MjAxODEzRiwgICAgMC4xNTEyNDcyN0YsICAgIDAuMTYxMDc2MTdGLCAgICAwLjE3MTU0MzgwRiwKKyAgICAwLjE4MjY5MTY4RiwgICAgMC4xOTQ1NjQwMkYsICAgIDAuMjA3MjA3ODhGLCAgICAwLjIyMDY3MzQyRiwKKyAgICAwLjIzNTAxNDAyRiwgICAgMC4yNTAyODY1NkYsICAgIDAuMjY2NTUxNTlGLCAgICAwLjI4Mzg3MzYxRiwKKyAgICAwLjMwMjMyMTMyRiwgICAgMC4zMjE5Njc4NkYsICAgIDAuMzQyODkxMTRGLCAgICAwLjM2NTE3NDE0RiwKKyAgICAwLjM4ODkwNTIxRiwgICAgMC40MTQxNzg0N0YsICAgIDAuNDQxMDk0MTJGLCAgICAwLjQ2OTc1ODkwRiwKKyAgICAwLjUwMDI4NjQ4RiwgICAgMC41MzI3OTc5MUYsICAgIDAuNTY3NDIyMTJGLCAgICAwLjYwNDI5NjQwRiwKKyAgICAwLjY0MzU2Njk5RiwgICAgMC42ODUzODk1OUYsICAgIDAuNzI5OTMwMDdGLCAgICAwLjc3NzM2NTA0RiwKKyAgICAwLjgyNzg4MjYwRiwgICAgMC44ODE2ODMwN0YsICAgIDAuOTM4OTc5OEYsICAgICAxLkYsCit9OworCitjb25zdCBmbG9hdCAqIGNvbnN0IGZmX3ZvcmJpc192d2luWzhdID0geworICAgICAgdndpbjY0LCAgdndpbjEyOCwgIHZ3aW4yNTYsICB2d2luNTEyLAorICAgIHZ3aW4xMDI0LCB2d2luMjA0OCwgdndpbjQwOTYsIHZ3aW44MTkyCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzX2VuY19kYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy92b3JiaXNfZW5jX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTFhYWVjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzX2VuY19kYXRhLmgKQEAgLTAsMCArMSw1MDQgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgT2RlZCBTaGltb24gPG9kczE1QG9kczE1LmR5bmRucy5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WT1JCSVNfRU5DX0RBVEFfSAorI2RlZmluZSBBVkNPREVDX1ZPUkJJU19FTkNfREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2swW10gPSB7CisgICAgMiwgMTAsICA4LCAxNCwgIDcsIDEyLCAxMSwgMTQsICAxLCAgNSwgIDMsICA3LCAgNCwgIDksICA3LCAxMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZGVib29rMVtdID0geworICAgIDEsICA0LCAgMiwgIDYsICAzLCAgNywgIDUsICA3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2syW10gPSB7CisgICAgIDEsICA1LCAgNywgMjEsICA1LCAgOCwgIDksIDIxLCAxMCwgIDksIDEyLCAyMCwgMjAsIDE2LCAyMCwKKyAgICAyMCwgIDQsICA4LCAgOSwgMjAsICA2LCAgOCwgIDksIDIwLCAxMSwgMTEsIDEzLCAyMCwgMjAsIDE1LAorICAgIDE3LCAyMCwgIDksIDExLCAxNCwgMjAsICA4LCAxMCwgMTUsIDIwLCAxMSwgMTMsIDE1LCAyMCwgMjAsCisgICAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDEzLCAyMCwgMjAsIDIwLCAxOCwgMTgsIDIwLCAyMCwKKyAgICAyMCwgMjAsIDIwLCAyMCwgIDMsICA2LCAgOCwgMjAsICA2LCAgNywgIDksIDIwLCAxMCwgIDksIDEyLAorICAgIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDUsICA3LCAgOSwgMjAsICA2LCAgNiwgIDksIDIwLCAxMCwgIDksCisgICAgMTIsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDgsIDEwLCAxMywgMjAsICA4LCAgOSwgMTIsIDIwLCAxMSwKKyAgICAxMCwgMTIsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMTgsIDIwLCAyMCwgMjAsIDE1LCAxNywgMTgsIDIwLAorICAgIDE4LCAxNywgMTgsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDcsIDEwLCAxMiwgMjAsICA4LCAgOSwgMTEsCisgICAgMjAsIDE0LCAxMywgMTQsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDYsICA5LCAxMiwgMjAsICA3LCAgOCwKKyAgICAxMSwgMjAsIDEyLCAxMSwgMTMsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDksIDExLCAxNSwgMjAsICA4LAorICAgIDEwLCAxNCwgMjAsIDEyLCAxMSwgMTQsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsCisgICAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMTEsIDE2LCAxOCwKKyAgICAyMCwgMTUsIDE1LCAxNywgMjAsIDIwLCAxNywgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDksIDE0LAorICAgIDE2LCAyMCwgMTIsIDEyLCAxNSwgMjAsIDE3LCAxNSwgMTgsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMTYsCisgICAgMTksIDE4LCAyMCwgMTUsIDE2LCAyMCwgMjAsIDE3LCAxNywgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwKKyAgICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLAorICAgIDIwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2szW10gPSB7CisgICAgIDIsICAzLCAgNywgMTMsICA0LCAgNCwgIDcsIDE1LCAgOCwgIDYsICA5LCAxNywgMjEsIDE2LCAxNSwKKyAgICAyMSwgIDIsICA1LCAgNywgMTEsICA1LCAgNSwgIDcsIDE0LCAgOSwgIDcsIDEwLCAxNiwgMTcsIDE1LAorICAgIDE2LCAyMSwgIDQsICA3LCAxMCwgMTcsICA3LCAgNywgIDksIDE1LCAxMSwgIDksIDExLCAxNiwgMjEsCisgICAgMTgsIDE1LCAyMSwgMTgsIDIxLCAyMSwgMjEsIDE1LCAxNywgMTcsIDE5LCAyMSwgMTksIDE4LCAyMCwKKyAgICAyMSwgMjEsIDIxLCAyMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZGVib29rNFtdID0geworICAgICA1LCAgNSwgIDUsICA1LCAgNiwgIDUsICA2LCAgNSwgIDYsICA1LCAgNiwgIDUsICA2LCAgNSwgIDYsCisgICAgIDUsICA2LCAgNSwgIDYsICA1LCAgNiwgIDUsICA2LCAgNSwgIDcsICA1LCAgNywgIDUsICA3LCAgNSwKKyAgICAgNywgIDUsICA4LCAgNiwgIDgsICA2LCAgOCwgIDYsICA5LCAgNiwgIDksICA2LCAxMCwgIDYsIDEwLAorICAgICA2LCAxMSwgIDYsIDExLCAgNywgMTEsICA3LCAxMiwgIDcsIDEyLCAgNywgMTIsICA3LCAxMiwgIDcsCisgICAgMTIsICA3LCAxMiwgIDcsIDEyLCAgNywgMTIsICA4LCAxMywgIDgsIDEyLCAgOCwgMTIsICA4LCAxMywKKyAgICAgOCwgMTMsICA5LCAxMywgIDksIDEzLCAgOSwgMTMsICA5LCAxMiwgMTAsIDEyLCAxMCwgMTMsIDEwLAorICAgIDE0LCAxMSwgMTQsIDEyLCAxNCwgMTMsIDE0LCAxMywgMTQsIDE0LCAxNSwgMTYsIDE1LCAxNSwgMTUsCisgICAgMTQsIDE1LCAxNywgMjEsIDIyLCAyMiwgMjEsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIxLCAyMSwKKyAgICAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb2RlYm9vazVbXSA9IHsKKyAgICAgMiwgIDUsICA1LCAgNCwgIDUsICA0LCAgNSwgIDQsICA1LCAgNCwgIDYsICA1LCAgNiwgIDUsICA2LAorICAgICA1LCAgNiwgIDUsICA3LCAgNSwgIDcsICA2LCAgOCwgIDYsICA4LCAgNiwgIDgsICA2LCAgOSwgIDYsCisgICAgIDksICA2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2s2W10gPSB7CisgICAgIDgsICA1LCAgOCwgIDQsICA5LCAgNCwgIDksICA0LCAgOSwgIDQsICA5LCAgNCwgIDksICA0LCAgOSwKKyAgICAgNCwgIDksICA0LCAgOSwgIDQsICA5LCAgNCwgIDgsICA0LCAgOCwgIDQsICA5LCAgNSwgIDksICA1LAorICAgICA5LCAgNSwgIDksICA1LCAgOSwgIDYsIDEwLCAgNiwgMTAsICA3LCAxMCwgIDgsIDExLCAgOSwgMTEsCisgICAgMTEsIDEyLCAxMywgMTIsIDE0LCAxMywgMTUsIDEzLCAxNSwgMTQsIDE2LCAxNCwgMTcsIDE1LCAxNywKKyAgICAxNSwgMTUsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE1LCAxOCwgMTYsIDE1LCAxNywgMTcsIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZGVib29rN1tdID0geworICAgICAxLCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA1LCAgNiwgIDUsICA2LCAgNSwgIDYsCisgICAgIDUsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA4LCAgNywgIDgsICA4LCAgOSwgIDgsIDEwLCAgOSwKKyAgICAxMCwgIDksCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb2RlYm9vazhbXSA9IHsKKyAgICAgNCwgIDMsICA0LCAgMywgIDQsICA0LCAgNSwgIDQsICA1LCAgNCwgIDUsICA1LCAgNiwgIDUsICA2LAorICAgICA1LCAgNywgIDUsICA3LCAgNiwgIDcsICA2LCAgOCwgIDcsICA4LCAgNywgIDgsICA3LCAgOSwgIDgsCisgICAgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDExLCAgOSwgMTIsICA5LCAxMiwgIDksIDE1LCAxMCwKKyAgICAxNCwgIDksIDEzLCAxMCwgMTMsIDEwLCAxMiwgMTAsIDEyLCAxMCwgMTMsIDEwLCAxMiwgMTEsIDEzLAorICAgIDExLCAxNCwgMTIsIDEzLCAxMywgMTQsIDE0LCAxMywgMTQsIDE1LCAxNCwgMTYsIDEzLCAxMywgMTQsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2s5W10gPSB7CisgICAgIDQsICA1LCAgNCwgIDUsICAzLCAgNSwgIDMsICA1LCAgMywgIDUsICA0LCAgNCwgIDQsICA0LCAgNSwKKyAgICAgNSwgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb2RlYm9vazEwW10gPSB7CisgICAgIDMsICAzLCAgNCwgIDMsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNSwKKyAgICAgNywgIDUsICA4LCAgNiwgIDgsICA2LCAgOSwgIDcsIDEwLCAgNywgMTAsICA4LCAxMCwgIDgsIDExLAorICAgICA5LCAxMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZGVib29rMTFbXSA9IHsKKyAgIDMsICA3LCAgMywgIDgsICAzLCAxMCwgIDMsICA4LCAgMywgIDksICAzLCAgOCwgIDQsICA5LCAgNCwKKyAgIDksICA1LCAgOSwgIDYsIDEwLCAgNiwgIDksICA3LCAxMSwgIDcsIDEyLCAgOSwgMTMsIDEwLCAxMywKKyAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgMTIsIDEyLCAxMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZGVib29rMTJbXSA9IHsKKyAgICAgNCwgIDUsICA0LCAgNSwgIDQsICA1LCAgNCwgIDUsICAzLCAgNSwgIDMsICA1LCAgMywgIDUsICA0LAorICAgICA1LCAgNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZGVib29rMTNbXSA9IHsKKyAgICAgNCwgIDIsICA0LCAgMiwgIDUsICAzLCAgNSwgIDQsICA2LCAgNiwgIDYsICA3LCAgNywgIDgsICA3LAorICAgICA4LCAgNywgIDgsICA3LCAgOSwgIDgsICA5LCAgOCwgIDksICA4LCAxMCwgIDgsIDExLCAgOSwgMTIsCisgICAgIDksIDEyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2sxNFtdID0geworICAgICAyLCAgNSwgIDIsICA2LCAgMywgIDYsICA0LCAgNywgIDQsICA3LCAgNSwgIDksICA1LCAxMSwgIDYsCisgICAgMTEsICA2LCAxMSwgIDcsIDExLCAgNiwgMTEsICA2LCAxMSwgIDksIDExLCAgOCwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2sxNVtdID0geworICAgICA1LCAgNiwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTIsIDExLCAgNSwgIDIsIDExLCAgNSwgIDYsCisgICAgIDYsICA3LCAgOSwgMTEsIDEzLCAxMywgMTAsICA3LCAxMSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMiwKKyAgICAxMSwgIDUsIDExLCAgNiwgIDgsICA3LCAgOSwgMTEsIDE0LCAxNSwgMTEsICA2LCAgNiwgIDgsICA0LAorICAgICA1LCAgNywgIDgsIDEwLCAxMywgMTAsICA1LCAgNywgIDcsICA1LCAgNSwgIDYsICA4LCAxMCwgMTEsCisgICAgMTAsICA3LCAgNywgIDgsICA2LCAgNSwgIDUsICA3LCAgOSwgIDksIDExLCAgOCwgIDgsIDExLCAgOCwKKyAgICAgNywgIDYsICA2LCAgNywgIDksIDEyLCAxMSwgMTAsIDEzLCAgOSwgIDksICA3LCAgNywgIDcsICA5LAorICAgIDExLCAxMywgMTIsIDE1LCAxMiwgMTEsICA5LCAgOCwgIDgsICA4LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2sxNltdID0geworICAgICAyLCAgNCwgIDQsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA1LCAgNiwgIDYsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDUsICA2LCAgNiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgNSwgIDcsICA3LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICA3LCAgOCwgIDgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA2LCAgNywgIDgsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDUsICA3LCAgNywKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgNiwgIDgsICA3LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICA3LCAgOCwgIDgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA1LCAgNywgIDcsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDcsICA4LCAgOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDcsICA4LCAgOCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICA3LCAgOCwgIDgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA4LCAgOCwgIDksICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDgsICA5LCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgNiwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICA3LCAgOSwgIDgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA4LCAgOSwgIDksICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDUsICA3LCAgNywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDcsICA4LCAgOCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgNywgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA2LCAgOCwgIDgsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDgsICA5LCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDcsICA4LCAgOSwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICA2LCAgOCwgIDgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA4LCAgOSwgIDksICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDgsICA5LCAgOCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZGVib29rMTdbXSA9IHsKKyAgICAgMiwgIDUsICA1LCAgMCwgIDAsICAwLCAgNSwgIDUsICAwLCAgMCwgIDAsICA1LCAgNSwgIDAsICAwLAorICAgICAwLCAgNywgIDgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgNSwgIDYsICA2LCAgMCwgIDAsCisgICAgIDAsICA3LCAgNywgIDAsICAwLCAgMCwgIDcsICA3LCAgMCwgIDAsICAwLCAxMCwgMTAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICA1LCAgNiwgIDYsICAwLCAgMCwgIDAsICA3LCAgNywgIDAsICAwLAorICAgICAwLCAgNywgIDcsICAwLCAgMCwgIDAsIDEwLCAxMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICA1LCAgNywgIDcsICAwLCAgMCwgIDAsICA3LCAgNywgIDAsICAwLCAgMCwgIDcsICA3LCAgMCwgIDAsCisgICAgIDAsICA5LCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA1LCAgNywgIDcsICAwLCAgMCwKKyAgICAgMCwgIDcsICA3LCAgMCwgIDAsICAwLCAgNywgIDcsICAwLCAgMCwgIDAsICA5LCAgOSwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICA1LCAgNywgIDcsICAwLCAgMCwgIDAsICA3LCAgNywgIDAsICAwLAorICAgICAwLCAgNywgIDcsICAwLCAgMCwgIDAsICA5LCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDUsICA3LCAgNywgIDAsICAwLCAgMCwgIDcsICA3LCAgMCwgIDAsICAwLCAgNywgIDcsICAwLCAgMCwKKyAgICAgMCwgIDksICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA4LCAxMCwgMTAsICAwLCAgMCwKKyAgICAgMCwgIDksICA5LCAgMCwgIDAsICAwLCAgOSwgIDksICAwLCAgMCwgIDAsIDEwLCAxMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDgsIDEwLCAxMCwgIDAsICAwLCAgMCwgIDksICA5LCAgMCwgIDAsCisgICAgIDAsICA5LCAgOSwgIDAsICAwLCAgMCwgMTAsIDEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2sxOFtdID0geworICAgICAyLCAgNCwgIDMsICA2LCAgNiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA0LCAgNCwgIDQsICA2LCAgNiwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDQsICA0LCAgNCwgIDYsICA2LCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgNiwgIDYsICA2LCAgOSwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgNiwgIDYsICA3LCAgOSwgIDksCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb2RlYm9vazE5W10gPSB7CisgICAgIDIsICAzLCAgMywgIDYsICA2LCAgMCwgIDAsICAwLCAgMCwgIDAsICA0LCAgNCwgIDYsICA2LCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDQsICA0LCAgNiwgIDYsICAwLCAgMCwgIDAsICAwLCAgMCwgIDUsICA1LAorICAgICA2LCAgNiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA2LCAgNiwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDcsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDcsICA3LCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDksCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb2RlYm9vazIwW10gPSB7CisgICAgIDEsICAzLCAgNCwgIDYsICA2LCAgNywgIDcsICA5LCAgOSwgIDAsICA1LCAgNSwgIDcsICA3LCAgNywKKyAgICAgOCwgIDksICA5LCAgMCwgIDUsICA1LCAgNywgIDcsICA4LCAgOCwgIDksICA5LCAgMCwgIDcsICA3LAorICAgICA4LCAgOCwgIDgsICA4LCAxMCwgMTAsICAwLCAgMCwgIDAsICA4LCAgOCwgIDgsICA4LCAxMCwgMTAsCisgICAgIDAsICAwLCAgMCwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgIDAsICAwLCAgMCwgIDksICA5LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAgMCwgIDAsICAwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgMTAsIDEwLCAxMSwgMTEsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb2RlYm9vazIxW10gPSB7CisgICAgIDIsICAzLCAgMywgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwKKyAgICAxMSwgMTAsICAwLCAgNSwgIDUsICA3LCAgNywgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTEsIDExLCAgMCwgIDUsICA1LCAgNywgIDcsICA4LCAgOCwgIDksICA5LCAgOSwgIDksCisgICAgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgIDAsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwKKyAgICAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsICAwLCAgMCwgIDAsICA3LCAgNywgIDgsICA4LAorICAgICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAgMCwgIDAsICAwLCAgOCwgIDgsCisgICAgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgIDAsICAwLCAgMCwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsICAwLAorICAgICAwLCAgMCwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTAsIDExLCAxMSwgMTIsCisgICAgMTIsICAwLCAgMCwgIDAsICAwLCAgMCwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTIsIDEyLCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLAorICAgIDExLCAxMiwgMTIsIDEyLCAxMiwgIDAsICAwLCAgMCwgIDAsICAwLCAgOCwgIDgsICA5LCAgOSwgMTAsCisgICAgMTAsIDExLCAxMSwgMTIsIDExLCAxMiwgMTIsICAwLCAgMCwgIDAsICAwLCAgMCwgIDksIDEwLCAxMCwKKyAgICAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsCisgICAgMTMsIDEzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMywgMTMsIDEzLCAxMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZGVib29rMjJbXSA9IHsKKyAgICAgMSwgIDQsICA0LCAgNywgIDYsICA2LCAgNywgIDYsICA2LCAgNCwgIDcsICA3LCAxMCwgIDksICA5LAorICAgIDExLCAgOSwgIDksICA0LCAgNywgIDcsIDEwLCAgOSwgIDksIDExLCAgOSwgIDksICA3LCAxMCwgMTAsCisgICAgMTEsIDExLCAxMCwgMTIsIDExLCAxMSwgIDYsICA5LCAgOSwgMTEsIDEwLCAxMCwgMTEsIDEwLCAxMCwKKyAgICAgNiwgIDksICA5LCAxMSwgMTAsIDEwLCAxMSwgMTAsIDEwLCAgNywgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDEyLCAxMSwgMTEsICA2LCAgOSwgIDksIDExLCAxMCwgMTAsIDExLCAxMCwgMTAsICA2LCAgOSwgIDksCisgICAgMTEsIDEwLCAxMCwgMTEsIDEwLCAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZGVib29rMjNbXSA9IHsKKyAgICAgMiwgIDQsICA0LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsIDEwLCAgNSwgIDUsICA2LAorICAgICA2LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAxMCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywgIDgsCisgICAgIDgsICA4LCAgOCwgMTAsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMCwKKyAgICAxMCwgMTAsICA3LCAgNywgIDgsICA3LCAgOCwgIDgsICA4LCAgOCwgMTAsIDEwLCAxMCwgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsIDEwLCAxMCwgMTAsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA4LCAxMCwgMTAsIDEwLCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMCwgMTAsIDEwLCAxMCwgMTAsICA5LAorICAgICA5LCAgOCwgIDgsICA5LCAgOCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb2RlYm9vazI0W10gPSB7CisgICAgIDEsICA0LCAgNCwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsICA2LCAgNSwKKyAgICAgNSwgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsICA3LCAgNSwgIDUsICA3LAorICAgICA3LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAxMSwgMTAsICAwLCAgOCwgIDgsICA4LCAgOCwgIDksCisgICAgIDksICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsICAwLCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMSwgMTEsICAwLCAxMiwgMTIsICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDExLAorICAgIDExLCAxMSwgMTIsICAwLCAxMywgMTMsICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsCisgICAgMTIsICAwLCAgMCwgIDAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAgMCwKKyAgICAgMCwgIDAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAgMCwgIDAsICAwLAorICAgIDE0LCAxNCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAgMCwgIDAsICAwLCAxNCwgMTQsCisgICAgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAgMCwgIDAsICAwLCAgMCwgIDAsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEzLCAxMywgMTQsIDEzLCAgMCwgIDAsICAwLCAgMCwgIDAsIDEzLCAxMywgMTIsIDEyLAorICAgIDEzLCAxMiwgMTQsIDEzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2syNVtdID0geworICAgICAyLCAgNCwgIDQsICA1LCAgNSwgIDYsICA1LCAgNSwgIDUsICA1LCAgNiwgIDQsICA1LCAgNSwgIDUsCisgICAgIDYsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNSwgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb2RlYm9vazI2W10gPSB7CisgICAgIDEsICA0LCAgNCwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsICA0LCAgOSwKKyAgICAgOCwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsICAyLCAgOSwgIDcsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2syN1tdID0geworICAgICAxLCAgNCwgIDQsICA2LCAgNiwgIDcsICA3LCAgOCwgIDcsICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsCisgICAgIDYsICA1LCAgNSwgIDcsICA3LCAgOCwgIDgsIDEwLCAgOCwgMTEsIDEwLCAxMiwgMTIsIDEzLCAxMywKKyAgICAgNiwgIDUsICA1LCAgNywgIDcsICA4LCAgOCwgMTAsICA5LCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEyLAorICAgIDE4LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAxMCwgIDksIDExLCAxMCwgMTIsIDEyLCAxMywgMTMsCisgICAgMTgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMywgMTIsIDE0LCAxMywKKyAgICAxOCwgMTEsIDExLCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEzLCAxMiwgMTMsIDE0LAorICAgIDE4LCAxMSwgMTEsICA5LCAgOCwgMTEsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxNCwgMTMsCisgICAgMTgsIDE4LCAxOCwgMTAsIDExLCAxMCwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTIsIDE0LCAxMywKKyAgICAxOCwgMTgsIDE4LCAxMCwgMTEsIDExLCAgOSwgMTIsIDExLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDE4LCAxOCwgMTcsIDE0LCAxNCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMiwgMTQsIDEyLCAxNCwgMTMsCisgICAgMTgsIDE4LCAxOCwgMTQsIDE0LCAxMSwgMTAsIDEyLCAgOSwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxOCwgMTgsIDE3LCAxNiwgMTgsIDEzLCAxMywgMTIsIDEyLCAxMywgMTEsIDE0LCAxMiwgMTQsIDE0LAorICAgIDE3LCAxOCwgMTgsIDE3LCAxOCwgMTMsIDEyLCAxMywgMTAsIDEyLCAxMSwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTcsIDE4LCAxOCwgMTgsIDE4LCAxNSwgMTYsIDEyLCAxMiwgMTMsIDEwLCAxNCwgMTIsIDE0LCAxNSwKKyAgICAxOCwgMTgsIDE4LCAxNiwgMTcsIDE2LCAxNCwgMTIsIDExLCAxMywgMTAsIDEzLCAxMywgMTQsIDE1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZWJvb2syOFtdID0geworICAgICAyLCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA4LCAxMCwgIDYsICA2LCAgNywgIDcsICA4LCAgNywgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgMTAsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LAorICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsCisgICAgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAgNywgIDcsICA4LCAgOCwKKyAgICAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTEsIDExLCAxMSwgIDgsICA4LAorICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsCisgICAgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwKKyAgICAxMCwgMTAsICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLAorICAgICA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgMTEsIDEwLCAxMSwgMTEsIDExLCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwKKyAgICAxMCwgIDksICA5LCAxMCwgIDksIDExLCAxMCwgMTEsIDExLCAxMSwgIDksICA5LCAgOSwgIDksICA5LAorICAgICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsICA5LCAxMSwgMTEsIDExLCAxMSwgMTEsICA5LCAgOSwgIDksCisgICAgIDksIDEwLCAxMCwgIDksICA5LCAgOSwgIDksIDEwLCAgOSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDEwLCAgOSwgMTAsIDEwLCAgOSwgMTAsICA5LCAgOSwgMTAsICA5LCAxMSwgMTAsCisgICAgMTAsIDExLCAxMSwgMTEsIDExLCAgOSwgMTAsICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLCAgOSwgIDksIDEwLCAgOSwgMTAsICA5LAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgIDksICA5LCAgOSwgIDksCisgICAgIDksIDEwLCAxMCwgMTAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBpbnQgZGltOworICAgIGludCBsZW47CisgICAgaW50IHJlYWxfbGVuOworICAgIGNvbnN0IHVpbnQ4X3QgKmNsZW5zOworICAgIGludCBsb29rdXA7CisgICAgZmxvYXQgbWluOworICAgIGZsb2F0IGRlbHRhOworICAgIGNvbnN0IHVpbnQ4X3QgKnF1YW50OworfSBjdmVjdG9yc1tdID0geworICAgIHsgMiwgICAxNiwgICAxNiwgY29kZWJvb2swLCAgMCB9LAorICAgIHsgMiwgICAgOCwgICAgOCwgY29kZWJvb2sxLCAgMCB9LAorICAgIHsgMiwgIDI1NiwgIDI1NiwgY29kZWJvb2syLCAgMCB9LAorICAgIHsgMiwgICA2NCwgICA2NCwgY29kZWJvb2szLCAgMCB9LAorICAgIHsgMiwgIDEyOCwgIDEyOCwgY29kZWJvb2s0LCAgMCB9LAorICAgIHsgMiwgICAzMiwgICAzMiwgY29kZWJvb2s1LCAgMCB9LAorICAgIHsgMiwgICA5NiwgICA5NiwgY29kZWJvb2s2LCAgMCB9LAorICAgIHsgMiwgICAzMiwgICAzMiwgY29kZWJvb2s3LCAgMCB9LAorICAgIHsgMiwgICA5NiwgICA5NiwgY29kZWJvb2s4LCAgMCB9LAorICAgIHsgMiwgICAxNywgICAxNywgY29kZWJvb2s5LCAgMCB9LAorICAgIHsgMiwgICAzMiwgICAzMiwgY29kZWJvb2sxMCwgMCB9LAorICAgIHsgMiwgICA3OCwgICA3OCwgY29kZWJvb2sxMSwgMCB9LAorICAgIHsgMiwgICAxNywgICAxNywgY29kZWJvb2sxMiwgMCB9LAorICAgIHsgMiwgICAzMiwgICAzMiwgY29kZWJvb2sxMywgMCB9LAorICAgIHsgMiwgICA3OCwgICA3OCwgY29kZWJvb2sxNCwgMCB9LAorICAgIHsgMiwgIDEwMCwgIDEwMCwgY29kZWJvb2sxNSwgMCB9LAorICAgIHsgOCwgMTY0MSwgNjU2MSwgY29kZWJvb2sxNiwgMSwgICAgLTEuMCwgICAxLjAsIChjb25zdCB1aW50OF90W10peyAxLCAwLCAyLCB9IH0sCisgICAgeyA0LCAgNDQzLCAgNjI1LCBjb2RlYm9vazE3LCAxLCAgICAtMi4wLCAgIDEuMCwgKGNvbnN0IHVpbnQ4X3RbXSl7IDIsIDEsIDMsIDAsIDQsIH0gfSwKKyAgICB7IDQsICAxMDUsICA2MjUsIGNvZGVib29rMTgsIDEsICAgIC0yLjAsICAgMS4wLCAoY29uc3QgdWludDhfdFtdKXsgMiwgMSwgMywgMCwgNCwgfSB9LAorICAgIHsgMiwgICA2OCwgICA4MSwgY29kZWJvb2sxOSwgMSwgICAgLTQuMCwgICAxLjAsIChjb25zdCB1aW50OF90W10peyA0LCAzLCA1LCAyLCA2LCAxLCA3LCAwLCA4LCB9IH0sCisgICAgeyAyLCAgIDgxLCAgIDgxLCBjb2RlYm9vazIwLCAxLCAgICAtNC4wLCAgIDEuMCwgKGNvbnN0IHVpbnQ4X3RbXSl7IDQsIDMsIDUsIDIsIDYsIDEsIDcsIDAsIDgsIH0gfSwKKyAgICB7IDIsICAyODksICAyODksIGNvZGVib29rMjEsIDEsICAgIC04LjAsICAgMS4wLCAoY29uc3QgdWludDhfdFtdKXsgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSwgMCwgMTYsIH0gfSwKKyAgICB7IDQsICAgODEsICAgODEsIGNvZGVib29rMjIsIDEsICAgLTExLjAsICAxMS4wLCAoY29uc3QgdWludDhfdFtdKXsgMSwgMCwgMiwgfSB9LAorICAgIHsgMiwgIDEyMSwgIDEyMSwgY29kZWJvb2syMywgMSwgICAgLTUuMCwgICAxLjAsIChjb25zdCB1aW50OF90W10peyA1LCA0LCA2LCAzLCA3LCAyLCA4LCAxLCA5LCAwLCAxMCwgfSB9LAorICAgIHsgMiwgIDE2OSwgIDE2OSwgY29kZWJvb2syNCwgMSwgICAtMzAuMCwgICA1LjAsIChjb25zdCB1aW50OF90W10peyA2LCA1LCA3LCA0LCA4LCAzLCA5LCAyLCAxMCwgMSwgMTEsIDAsIDEyLCB9IH0sCisgICAgeyAyLCAgIDI1LCAgIDI1LCBjb2RlYm9vazI1LCAxLCAgICAtMi4wLCAgIDEuMCwgKGNvbnN0IHVpbnQ4X3RbXSl7IDIsIDEsIDMsIDAsIDQsIH0gfSwKKyAgICB7IDIsICAxNjksICAxNjksIGNvZGVib29rMjYsIDEsIC0xNTMwLjAsIDI1NS4wLCAoY29uc3QgdWludDhfdFtdKXsgNiwgNSwgNywgNCwgOCwgMywgOSwgMiwgMTAsIDEsIDExLCAwLCAxMiwgfSB9LAorICAgIHsgMiwgIDIyNSwgIDIyNSwgY29kZWJvb2syNywgMSwgIC0xMTkuMCwgIDE3LjAsIChjb25zdCB1aW50OF90W10peyA3LCA2LCA4LCA1LCA5LCA0LCAxMCwgMywgMTEsIDIsIDEyLCAxLCAxMywgMCwgMTQsIH0gfSwKKyAgICB7IDIsICAyODksICAyODksIGNvZGVib29rMjgsIDEsICAgIC04LjAsICAgMS4wLCAoY29uc3QgdWludDhfdFtdKXsgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSwgMCwgMTYsIH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGludCBkaW07CisgICAgaW50IHN1YmNsYXNzOworICAgIGludCBtYXN0ZXJib29rOworICAgIGNvbnN0IGludCBuYm9va3NbNF07Cit9IGZsb29yX2NsYXNzZXNbXSA9IHsKKyAgICB7IDMsIDAsIDAsIHsgIDQgICAgICAgICAgICAgfSB9LAorICAgIHsgNCwgMSwgMCwgeyAgNSwgIDYgICAgICAgICB9IH0sCisgICAgeyAzLCAxLCAxLCB7ICA3LCAgOCAgICAgICAgIH0gfSwKKyAgICB7IDQsIDIsIDIsIHsgLTEsICA5LCAxMCwgMTEgfSB9LAorICAgIHsgMywgMiwgMywgeyAtMSwgMTIsIDEzLCAxNCB9IH0sCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19WT1JCSVNfRU5DX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzX3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OWYxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92b3JiaXNfcGFyc2VyLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSnVzdGluIFJ1Z2dsZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVm9yYmlzIGF1ZGlvIHBhcnNlcgorICoKKyAqIERldGVybWluZXMgdGhlIGR1cmF0aW9uIGZvciBlYWNoIHBhY2tldC4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJ4aXBoLmgiCisjaW5jbHVkZSAidm9yYmlzX3BhcnNlcl9pbnRlcm5hbC5oIgorCitzdGF0aWMgY29uc3QgQVZDbGFzcyB2b3JiaXNfcGFyc2VyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlZvcmJpcyBwYXJzZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgaW50IHBhcnNlX2lkX2hlYWRlcihBVlZvcmJpc1BhcnNlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIC8qIElkIGhlYWRlciBzaG91bGQgYmUgMzAgYnl0ZXMgKi8KKyAgICBpZiAoYnVmX3NpemUgPCAzMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSWQgaGVhZGVyIGlzIHRvbyBzaG9ydFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIG1ha2Ugc3VyZSB0aGlzIGlzIHRoZSBJZCBoZWFkZXIgKi8KKyAgICBpZiAoYnVmWzBdICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIldyb25nIHBhY2tldCB0eXBlIGluIElkIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIGNoZWNrIGZvciBoZWFkZXIgc2lnbmF0dXJlICovCisgICAgaWYgKG1lbWNtcCgmYnVmWzFdLCAidm9yYmlzIiwgNikpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGFja2V0IHNpZ25hdHVyZSBpbiBJZCBoZWFkZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoIShidWZbMjldICYgMHgxKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtaW5nIGJpdCBpbiBJZCBoZWFkZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5ibG9ja3NpemVbMF0gPSAxIDw8IChidWZbMjhdICYgMHhGKTsKKyAgICBzLT5ibG9ja3NpemVbMV0gPSAxIDw8IChidWZbMjhdID4+ICA0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3NldHVwX2hlYWRlcihBVlZvcmJpc1BhcnNlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIEdldEJpdENvbnRleHQgZ2IsIGdiMDsKKyAgICB1aW50OF90ICpyZXZfYnVmOworICAgIGludCBpLCByZXQgPSAwOworICAgIGludCBnb3RfZnJhbWluZ19iaXQsIG1vZGVfY291bnQsIGdvdF9tb2RlX2hlYWRlciwgbGFzdF9tb2RlX2NvdW50ID0gMDsKKworICAgIC8qIGF2b2lkIG92ZXJyZWFkICovCisgICAgaWYgKGJ1Zl9zaXplIDwgNykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU2V0dXAgaGVhZGVyIGlzIHRvbyBzaG9ydFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIG1ha2Ugc3VyZSB0aGlzIGlzIHRoZSBTZXR1cCBoZWFkZXIgKi8KKyAgICBpZiAoYnVmWzBdICE9IDUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIldyb25nIHBhY2tldCB0eXBlIGluIFNldHVwIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIGNoZWNrIGZvciBoZWFkZXIgc2lnbmF0dXJlICovCisgICAgaWYgKG1lbWNtcCgmYnVmWzFdLCAidm9yYmlzIiwgNikpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGFja2V0IHNpZ25hdHVyZSBpbiBTZXR1cCBoZWFkZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiByZXZlcnNlIGJ5dGVzIHNvIHdlIGNhbiBlYXNpbHkgcmVhZCBiYWNrd2FyZHMgd2l0aCBnZXRfYml0cygpICovCisgICAgaWYgKCEocmV2X2J1ZiA9IGF2X21hbGxvYyhidWZfc2l6ZSkpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspCisgICAgICAgIHJldl9idWZbaV0gPSBidWZbYnVmX3NpemUgLSAxIC0gaV07CisgICAgaW5pdF9nZXRfYml0cygmZ2IsIHJldl9idWYsIGJ1Zl9zaXplICogOCk7CisKKyAgICBnb3RfZnJhbWluZ19iaXQgPSAwOworICAgIHdoaWxlIChnZXRfYml0c19sZWZ0KCZnYikgPiA5NykgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKCZnYikpIHsKKyAgICAgICAgICAgIGdvdF9mcmFtaW5nX2JpdCA9IGdldF9iaXRzX2NvdW50KCZnYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWdvdF9mcmFtaW5nX2JpdCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBTZXR1cCBoZWFkZXJcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGJhZF9oZWFkZXI7CisgICAgfQorCisgICAgLyogTm93IHdlIHNlYXJjaCBiYWNrd2FyZHMgdG8gZmluZCBwb3NzaWJsZSB2YWxpZCBtb2RlIGNvdW50cy4gVGhpcyBpcyBub3QKKyAgICAgKiBmb29sLXByb29mIGJlY2F1c2Ugd2UgY291bGQgaGF2ZSBmYWxzZSBwb3NpdGl2ZSBtYXRjaGVzIGFuZCByZWFkIHRvbworICAgICAqIGZhciwgYnV0IHRoZXJlIGlzbid0IHJlYWxseSBhbnkgd2F5IHRvIGJlIHN1cmUgd2l0aG91dCBwYXJzaW5nIHRocm91Z2gKKyAgICAgKiBhbGwgdGhlIG1hbnkgdmFyaWFibGUtc2l6ZWQgZmllbGRzIGJlZm9yZSB0aGUgbW9kZXMuIFRoaXMgYXBwcm9hY2ggc2VlbXMKKyAgICAgKiB0byB3b3JrIHdlbGwgaW4gdGVzdGluZywgYW5kIGl0IGlzIHNpbWlsYXIgdG8gaG93IGl0IGlzIGhhbmRsZWQgaW4KKyAgICAgKiBsaWJvZ2d6LiAqLworICAgIG1vZGVfY291bnQgPSAwOworICAgIGdvdF9tb2RlX2hlYWRlciA9IDA7CisgICAgd2hpbGUgKGdldF9iaXRzX2xlZnQoJmdiKSA+PSA5NykgeworICAgICAgICBpZiAoZ2V0X2JpdHMoJmdiLCA4KSA+IDYzIHx8IGdldF9iaXRzKCZnYiwgMTYpIHx8IGdldF9iaXRzKCZnYiwgMTYpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNraXBfYml0cygmZ2IsIDEpOworICAgICAgICBtb2RlX2NvdW50Kys7CisgICAgICAgIGlmIChtb2RlX2NvdW50ID4gNjQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZ2IwID0gZ2I7CisgICAgICAgIGlmIChnZXRfYml0cygmZ2IwLCA2KSArIDEgPT0gbW9kZV9jb3VudCkgeworICAgICAgICAgICAgZ290X21vZGVfaGVhZGVyID0gMTsKKyAgICAgICAgICAgIGxhc3RfbW9kZV9jb3VudCA9IG1vZGVfY291bnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFnb3RfbW9kZV9oZWFkZXIpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgU2V0dXAgaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBiYWRfaGVhZGVyOworICAgIH0KKyAgICAvKiBBbGwgc2FtcGxlcyBJJ3ZlIHNlZW4gdXNlIDw9IDIgbW9kZXMsIHNvIGFzayBmb3IgYSBzYW1wbGUgaWYgd2UgZmluZAorICAgICAqIG1vcmUgdGhhbiB0aGF0LCBhcyBpdCBpcyBtb3N0IGxpa2VseSBhIGZhbHNlIHBvc2l0aXZlLiBJZiB3ZSBnZXQgYW55CisgICAgICogd2UgbWF5IG5lZWQgdG8gYXBwcm9hY2ggdGhpcyB0aGUgbG9uZyB3YXkgYW5kIHBhcnNlIHRoZSB3aG9sZSBTZXR1cAorICAgICAqIGhlYWRlciwgYnV0IEkgaG9wZSB2ZXJ5IG11Y2ggdGhhdCBpdCBuZXZlciBjb21lcyB0byB0aGF0LiAqLworICAgIGlmIChsYXN0X21vZGVfY291bnQgPiAyKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIG1vZGVzIChlaXRoZXIgYSBmYWxzZSBwb3NpdGl2ZSBvciBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGUgZnJvbSBhbiB1bmtub3duIGVuY29kZXIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbW9kZV9jb3VudCk7CisgICAgfQorICAgIC8qIFdlJ3JlIGxpbWl0aW5nIHRoZSBtb2RlIGNvdW50IHRvIDYzIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoZSBwcmV2aW91cworICAgICAqIGJsb2NrIGZsYWcgd2lsbCBiZSBpbiB0aGUgZmlyc3QgcGFja2V0IGJ5dGUuICovCisgICAgaWYgKGxhc3RfbW9kZV9jb3VudCA+IDYzKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBtb2RlIGNvdW50OiAlZFxuIiwKKyAgICAgICAgICAgICAgIGxhc3RfbW9kZV9jb3VudCk7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gYmFkX2hlYWRlcjsKKyAgICB9CisgICAgcy0+bW9kZV9jb3VudCA9IG1vZGVfY291bnQgPSBsYXN0X21vZGVfY291bnQ7CisgICAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBjb2RlIHRoZSBtb2RlIGFuZCB0dXJuIHRoYXQKKyAgICAgKiBpbnRvIGEgYml0bWFzayB0byBkaXJlY3RseSBhY2Nlc3MgdGhlIG1vZGUgZnJvbSB0aGUgZmlyc3QgZnJhbWUgYnl0ZS4gKi8KKyAgICBzLT5tb2RlX21hc2sgPSAoKDEgPDwgKGF2X2xvZzIobW9kZV9jb3VudCAtIDEpICsgMSkpIC0gMSkgPDwgMTsKKyAgICAvKiBUaGUgcHJldmlvdXMgd2luZG93IGZsYWcgaXMgdGhlIG5leHQgYml0IGFmdGVyIHRoZSBtb2RlICovCisgICAgcy0+cHJldl9tYXNrID0gKHMtPm1vZGVfbWFzayB8IDB4MSkgKyAxOworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIHJldl9idWYsIGJ1Zl9zaXplICogOCk7CisgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCBnb3RfZnJhbWluZ19iaXQpOworICAgIGZvciAoaSA9IG1vZGVfY291bnQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDQwKTsKKyAgICAgICAgcy0+bW9kZV9ibG9ja3NpemVbaV0gPSBnZXRfYml0czEoJmdiKTsKKyAgICB9CisKK2JhZF9oZWFkZXI6CisgICAgYXZfZnJlZShyZXZfYnVmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvcmJpc19wYXJzZV9pbml0KEFWVm9yYmlzUGFyc2VDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpleHRyYWRhdGEsIGludCBleHRyYWRhdGFfc2l6ZSkKK3sKKyAgICB1aW50OF90ICpoZWFkZXJfc3RhcnRbM107CisgICAgaW50IGhlYWRlcl9sZW5bM107CisgICAgaW50IHJldDsKKworICAgIHMtPmNsYXNzID0gJnZvcmJpc19wYXJzZXJfY2xhc3M7CisgICAgcy0+ZXh0cmFkYXRhX3BhcnNlZCA9IDE7CisKKyAgICBpZiAoKHJldCA9IGF2cHJpdl9zcGxpdF94aXBoX2hlYWRlcnMoZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWRhdGFfc2l6ZSwgMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9zdGFydCwgaGVhZGVyX2xlbikpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXh0cmFkYXRhIGNvcnJ1cHQuXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHBhcnNlX2lkX2hlYWRlcihzLCBoZWFkZXJfc3RhcnRbMF0sIGhlYWRlcl9sZW5bMF0pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IHBhcnNlX3NldHVwX2hlYWRlcihzLCBoZWFkZXJfc3RhcnRbMl0sIGhlYWRlcl9sZW5bMl0pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT52YWxpZF9leHRyYWRhdGEgPSAxOworICAgIHMtPnByZXZpb3VzX2Jsb2Nrc2l6ZSA9IHMtPmJsb2Nrc2l6ZVtzLT5tb2RlX2Jsb2Nrc2l6ZVswXV07CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X3ZvcmJpc19wYXJzZV9mcmFtZV9mbGFncyhBVlZvcmJpc1BhcnNlQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUsIGludCAqZmxhZ3MpCit7CisgICAgaW50IGR1cmF0aW9uID0gMDsKKworICAgIGlmIChzLT52YWxpZF9leHRyYWRhdGEgJiYgYnVmX3NpemUgPiAwKSB7CisgICAgICAgIGludCBtb2RlLCBjdXJyZW50X2Jsb2Nrc2l6ZTsKKyAgICAgICAgaW50IHByZXZpb3VzX2Jsb2Nrc2l6ZSA9IHMtPnByZXZpb3VzX2Jsb2Nrc2l6ZTsKKworICAgICAgICBpZiAoYnVmWzBdICYgMSkgeworICAgICAgICAgICAgLyogSWYgdGhlIHVzZXIgZG9lc24ndCBjYXJlIGFib3V0IHNwZWNpYWwgcGFja2V0cywgaXQncyBhIGJhZCBvbmUuICovCisgICAgICAgICAgICBpZiAoIWZsYWdzKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3BhY2tldDsKKworICAgICAgICAgICAgLyogU2V0IHRoZSBmbGFnIGZvciB3aGljaCBraW5kIG9mIHNwZWNpYWwgcGFja2V0IGl0IGlzLiAqLworICAgICAgICAgICAgaWYgKGJ1ZlswXSA9PSAxKQorICAgICAgICAgICAgICAgICpmbGFncyB8PSBWT1JCSVNfRkxBR19IRUFERVI7CisgICAgICAgICAgICBlbHNlIGlmIChidWZbMF0gPT0gMykKKyAgICAgICAgICAgICAgICAqZmxhZ3MgfD0gVk9SQklTX0ZMQUdfQ09NTUVOVDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9wYWNrZXQ7CisKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgcGFja2V0cyBoYXZlIG5vIGR1cmF0aW9uLiAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisKK2JhZF9wYWNrZXQ6CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYWNrZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPm1vZGVfY291bnQgPT0gMSkKKyAgICAgICAgICAgIG1vZGUgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtb2RlID0gKGJ1ZlswXSAmIHMtPm1vZGVfbWFzaykgPj4gMTsKKyAgICAgICAgaWYgKG1vZGUgPj0gcy0+bW9kZV9jb3VudCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbW9kZSBpbiBwYWNrZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYocy0+bW9kZV9ibG9ja3NpemVbbW9kZV0peworICAgICAgICAgICAgaW50IGZsYWcgPSAhIShidWZbMF0gJiBzLT5wcmV2X21hc2spOworICAgICAgICAgICAgcHJldmlvdXNfYmxvY2tzaXplID0gcy0+YmxvY2tzaXplW2ZsYWddOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRfYmxvY2tzaXplICAgICA9IHMtPmJsb2Nrc2l6ZVtzLT5tb2RlX2Jsb2Nrc2l6ZVttb2RlXV07CisgICAgICAgIGR1cmF0aW9uICAgICAgICAgICAgICA9IChwcmV2aW91c19ibG9ja3NpemUgKyBjdXJyZW50X2Jsb2Nrc2l6ZSkgPj4gMjsKKyAgICAgICAgcy0+cHJldmlvdXNfYmxvY2tzaXplID0gY3VycmVudF9ibG9ja3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIGR1cmF0aW9uOworfQorCitpbnQgYXZfdm9yYmlzX3BhcnNlX2ZyYW1lKEFWVm9yYmlzUGFyc2VDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSkKK3sKKyAgICByZXR1cm4gYXZfdm9yYmlzX3BhcnNlX2ZyYW1lX2ZsYWdzKHMsIGJ1ZiwgYnVmX3NpemUsIE5VTEwpOworfQorCit2b2lkIGF2X3ZvcmJpc19wYXJzZV9yZXNldChBVlZvcmJpc1BhcnNlQ29udGV4dCAqcykKK3sKKyAgICBpZiAocy0+dmFsaWRfZXh0cmFkYXRhKQorICAgICAgICBzLT5wcmV2aW91c19ibG9ja3NpemUgPSBzLT5ibG9ja3NpemVbMF07Cit9CisKK3ZvaWQgYXZfdm9yYmlzX3BhcnNlX2ZyZWUoQVZWb3JiaXNQYXJzZUNvbnRleHQgKipzKQoreworICAgIGF2X2ZyZWVwKHMpOworfQorCitBVlZvcmJpc1BhcnNlQ29udGV4dCAqYXZfdm9yYmlzX3BhcnNlX2luaXQoY29uc3QgdWludDhfdCAqZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHRyYWRhdGFfc2l6ZSkKK3sKKyAgICBBVlZvcmJpc1BhcnNlQ29udGV4dCAqcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzKSk7CisgICAgaW50IHJldDsKKworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXQgPSB2b3JiaXNfcGFyc2VfaW5pdChzLCBleHRyYWRhdGEsIGV4dHJhZGF0YV9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl92b3JiaXNfcGFyc2VfZnJlZSgmcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzOworfQorCisjaWYgTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTcKK2ludCBhdnByaXZfdm9yYmlzX3BhcnNlX2V4dHJhZGF0YShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWVm9yYmlzUGFyc2VDb250ZXh0ICpzKQoreworICAgIHJldHVybiB2b3JiaXNfcGFyc2VfaW5pdChzLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworfQordm9pZCBhdnByaXZfdm9yYmlzX3BhcnNlX3Jlc2V0KEFWVm9yYmlzUGFyc2VDb250ZXh0ICpzKQoreworICAgIGF2X3ZvcmJpc19wYXJzZV9yZXNldChzKTsKK30KK2ludCBhdnByaXZfdm9yYmlzX3BhcnNlX2ZyYW1lKEFWVm9yYmlzUGFyc2VDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUpCit7CisgICAgcmV0dXJuIGF2X3ZvcmJpc19wYXJzZV9mcmFtZShzLCBidWYsIGJ1Zl9zaXplKTsKK30KK2ludCBhdnByaXZfdm9yYmlzX3BhcnNlX2ZyYW1lX2ZsYWdzKEFWVm9yYmlzUGFyc2VDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUsIGludCAqZmxhZ3MpCit7CisgICAgcmV0dXJuIGF2X3ZvcmJpc19wYXJzZV9mcmFtZV9mbGFncyhzLCBidWYsIGJ1Zl9zaXplLCBmbGFncyk7Cit9CisjZW5kaWYKKworI2lmIENPTkZJR19WT1JCSVNfUEFSU0VSCisKK3R5cGVkZWYgc3RydWN0IFZvcmJpc1BhcnNlQ29udGV4dCB7CisgICAgQVZWb3JiaXNQYXJzZUNvbnRleHQgKnZwOworfSBWb3JiaXNQYXJzZUNvbnRleHQ7CisKK3N0YXRpYyBpbnQgdm9yYmlzX3BhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzMSwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgVm9yYmlzUGFyc2VDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBpbnQgZHVyYXRpb247CisKKyAgICBpZiAoIXMtPnZwICYmIGF2Y3R4LT5leHRyYWRhdGEgJiYgYXZjdHgtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgIHMtPnZwID0gYXZfdm9yYmlzX3BhcnNlX2luaXQoYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICB9CisgICAgaWYgKCFzLT52cCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBpZiAoKGR1cmF0aW9uID0gYXZfdm9yYmlzX3BhcnNlX2ZyYW1lKHMtPnZwLCBidWYsIGJ1Zl9zaXplKSkgPj0gMCkKKyAgICAgICAgczEtPmR1cmF0aW9uID0gZHVyYXRpb247CisKK2VuZDoKKyAgICAvKiBhbHdheXMgcmV0dXJuIHRoZSBmdWxsIHBhY2tldC4gdGhpcyBwYXJzZXIgaXNuJ3QgZG9pbmcgYW55IHNwbGl0dGluZyBvcgorICAgICAgIGNvbWJpbmluZywgb25seSBwYWNrZXQgYW5hbHlzaXMgKi8KKyAgICAqcG91dGJ1ZiAgICAgID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIHZvcmJpc19wYXJzZXJfY2xvc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKmN0eCkKK3sKKyAgICBWb3JiaXNQYXJzZUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBhdl92b3JiaXNfcGFyc2VfZnJlZSgmcy0+dnApOworfQorCitBVkNvZGVjUGFyc2VyIGZmX3ZvcmJpc19wYXJzZXIgPSB7CisgICAgLmNvZGVjX2lkcyAgICAgID0geyBBVl9DT0RFQ19JRF9WT1JCSVMgfSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVm9yYmlzUGFyc2VDb250ZXh0KSwKKyAgICAucGFyc2VyX3BhcnNlICAgPSB2b3JiaXNfcGFyc2UsCisgICAgLnBhcnNlcl9jbG9zZSAgID0gdm9yYmlzX3BhcnNlcl9jbG9zZSwKK307CisjZW5kaWYgLyogQ09ORklHX1ZPUkJJU19QQVJTRVIgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZvcmJpc19wYXJzZXIuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZvcmJpc19wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjczNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzX3BhcnNlci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEEgcHVibGljIEFQSSBmb3IgVm9yYmlzIHBhcnNpbmcKKyAqCisgKiBEZXRlcm1pbmVzIHRoZSBkdXJhdGlvbiBmb3IgZWFjaCBwYWNrZXQuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZPUkJJU19QQVJTRV9ICisjZGVmaW5lIEFWQ09ERUNfVk9SQklTX1BBUlNFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHN0cnVjdCBBVlZvcmJpc1BhcnNlQ29udGV4dCBBVlZvcmJpc1BhcnNlQ29udGV4dDsKKworLyoqCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgVm9yYmlzIHBhcnNlciB1c2luZyBoZWFkZXJzIGluIHRoZSBleHRyYWRhdGEuCisgKgorICogQHBhcmFtIGF2Y3R4IGNvZGVjIGNvbnRleHQKKyAqIEBwYXJhbSBzICAgICBWb3JiaXMgcGFyc2VyIGNvbnRleHQKKyAqLworQVZWb3JiaXNQYXJzZUNvbnRleHQgKmF2X3ZvcmJpc19wYXJzZV9pbml0KGNvbnN0IHVpbnQ4X3QgKmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0cmFkYXRhX3NpemUpOworCisvKioKKyAqIEZyZWUgdGhlIHBhcnNlciBhbmQgZXZlcnl0aGluZyBhc3NvY2lhdGVkIHdpdGggaXQuCisgKi8KK3ZvaWQgYXZfdm9yYmlzX3BhcnNlX2ZyZWUoQVZWb3JiaXNQYXJzZUNvbnRleHQgKipzKTsKKworI2RlZmluZSBWT1JCSVNfRkxBR19IRUFERVIgIDB4MDAwMDAwMDEKKyNkZWZpbmUgVk9SQklTX0ZMQUdfQ09NTUVOVCAweDAwMDAwMDAyCisKKy8qKgorICogR2V0IHRoZSBkdXJhdGlvbiBmb3IgYSBWb3JiaXMgcGFja2V0LgorICoKKyAqIElmIEBwIGZsYWdzIGlzIEBjIE5VTEwsCisgKiBzcGVjaWFsIGZyYW1lcyBhcmUgY29uc2lkZXJlZCBpbnZhbGlkLgorICoKKyAqIEBwYXJhbSBzICAgICAgICBWb3JiaXMgcGFyc2VyIGNvbnRleHQKKyAqIEBwYXJhbSBidWYgICAgICBidWZmZXIgY29udGFpbmluZyBhIFZvcmJpcyBmcmFtZQorICogQHBhcmFtIGJ1Zl9zaXplIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogQHBhcmFtIGZsYWdzICAgIGZsYWdzIGZvciBzcGVjaWFsIGZyYW1lcworICovCitpbnQgYXZfdm9yYmlzX3BhcnNlX2ZyYW1lX2ZsYWdzKEFWVm9yYmlzUGFyc2VDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSwgaW50ICpmbGFncyk7CisKKy8qKgorICogR2V0IHRoZSBkdXJhdGlvbiBmb3IgYSBWb3JiaXMgcGFja2V0LgorICoKKyAqIEBwYXJhbSBzICAgICAgICBWb3JiaXMgcGFyc2VyIGNvbnRleHQKKyAqIEBwYXJhbSBidWYgICAgICBidWZmZXIgY29udGFpbmluZyBhIFZvcmJpcyBmcmFtZQorICogQHBhcmFtIGJ1Zl9zaXplIHNpemUgb2YgdGhlIGJ1ZmZlcgorICovCitpbnQgYXZfdm9yYmlzX3BhcnNlX2ZyYW1lKEFWVm9yYmlzUGFyc2VDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSk7CisKK3ZvaWQgYXZfdm9yYmlzX3BhcnNlX3Jlc2V0KEFWVm9yYmlzUGFyc2VDb250ZXh0ICpzKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVk9SQklTX1BBUlNFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZvcmJpc19wYXJzZXJfaW50ZXJuYWwuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZvcmJpc19wYXJzZXJfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQ4MWVlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzX3BhcnNlcl9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSnVzdGluIFJ1Z2dsZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVm9yYmlzIGF1ZGlvIHBhcnNlcgorICoKKyAqIERldGVybWluZXMgdGhlIGR1cmF0aW9uIGZvciBlYWNoIHBhY2tldC4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVk9SQklTX1BBUlNFUl9ICisjZGVmaW5lIEFWQ09ERUNfVk9SQklTX1BBUlNFUl9ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAidm9yYmlzX3BhcnNlci5oIgorCitzdHJ1Y3QgQVZWb3JiaXNQYXJzZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBleHRyYWRhdGFfcGFyc2VkOyAgICAgICAvLy88IHdlIGhhdmUgYXR0ZW1wdGVkIHRvIHBhcnNlIGV4dHJhZGF0YQorICAgIGludCB2YWxpZF9leHRyYWRhdGE7ICAgICAgICAvLy88IGV4dHJhZGF0YSBpcyB2YWxpZCwgc28gd2UgY2FuIGNhbGN1bGF0ZSBkdXJhdGlvbgorICAgIGludCBibG9ja3NpemVbMl07ICAgICAgICAgICAvLy88IHNob3J0IGFuZCBsb25nIHdpbmRvdyBzaXplcworICAgIGludCBwcmV2aW91c19ibG9ja3NpemU7ICAgICAvLy88IHByZXZpb3VzIHdpbmRvdyBzaXplCisgICAgaW50IG1vZGVfYmxvY2tzaXplWzY0XTsgICAgIC8vLzwgd2luZG93IHNpemUgbWFwcGluZyBmb3IgZWFjaCBtb2RlCisgICAgaW50IG1vZGVfY291bnQ7ICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIG1vZGVzCisgICAgaW50IG1vZGVfbWFzazsgICAgICAgICAgICAgIC8vLzwgYml0bWFzayB1c2VkIHRvIGdldCB0aGUgbW9kZSBpbiBlYWNoIHBhY2tldAorICAgIGludCBwcmV2X21hc2s7ICAgICAgICAgICAgICAvLy88IGJpdG1hc2sgdXNlZCB0byBnZXQgdGhlIHByZXZpb3VzIG1vZGUgZmxhZyBpbiBlYWNoIHBhY2tldAorfTsKKworI2lmIExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU3CisvKioKKyAqIEluaXRpYWxpemUgdGhlIFZvcmJpcyBwYXJzZXIgdXNpbmcgaGVhZGVycyBpbiB0aGUgZXh0cmFkYXRhLgorICoKKyAqIEBwYXJhbSBhdmN0eCBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW0gcyAgICAgVm9yYmlzIHBhcnNlciBjb250ZXh0CisgKi8KK2ludCBhdnByaXZfdm9yYmlzX3BhcnNlX2V4dHJhZGF0YShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWVm9yYmlzUGFyc2VDb250ZXh0ICpzKTsKKworLyoqCisgKiBHZXQgdGhlIGR1cmF0aW9uIGZvciBhIFZvcmJpcyBwYWNrZXQuCisgKgorICogYXZwcml2X3ZvcmJpc19wYXJzZV9leHRyYWRhdGEoKSBtdXN0IGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgY2FsbGVkIHByaW9yIHRvCisgKiB0aGlzIGluIG9yZGVyIGZvciBhIGNvcnJlY3QgZHVyYXRpb24gdG8gYmUgcmV0dXJuZWQuIElmIEBwIGZsYWdzIGlzIEBjIE5VTEwsCisgKiBzcGVjaWFsIGZyYW1lcyBhcmUgY29uc2lkZXJlZCBpbnZhbGlkLgorICoKKyAqIEBwYXJhbSBzICAgICAgICBWb3JiaXMgcGFyc2VyIGNvbnRleHQKKyAqIEBwYXJhbSBidWYgICAgICBidWZmZXIgY29udGFpbmluZyBhIFZvcmJpcyBmcmFtZQorICogQHBhcmFtIGJ1Zl9zaXplIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogQHBhcmFtIGZsYWdzICAgIGZsYWdzIGZvciBzcGVjaWFsIGZyYW1lcworICovCitpbnQgYXZwcml2X3ZvcmJpc19wYXJzZV9mcmFtZV9mbGFncyhBVlZvcmJpc1BhcnNlQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplLCBpbnQgKmZsYWdzKTsKKworLyoqCisgKiBHZXQgdGhlIGR1cmF0aW9uIGZvciBhIFZvcmJpcyBwYWNrZXQuCisgKgorICogYXZwcml2X3ZvcmJpc19wYXJzZV9leHRyYWRhdGEoKSBtdXN0IGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgY2FsbGVkIHByaW9yIHRvCisgKiB0aGlzIGluIG9yZGVyIGZvciBhIGNvcnJlY3QgZHVyYXRpb24gdG8gYmUgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIHMgICAgICAgIFZvcmJpcyBwYXJzZXIgY29udGV4dAorICogQHBhcmFtIGJ1ZiAgICAgIGJ1ZmZlciBjb250YWluaW5nIGEgVm9yYmlzIGZyYW1lCisgKiBAcGFyYW0gYnVmX3NpemUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKi8KK2ludCBhdnByaXZfdm9yYmlzX3BhcnNlX2ZyYW1lKEFWVm9yYmlzUGFyc2VDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUpOworCit2b2lkIGF2cHJpdl92b3JiaXNfcGFyc2VfcmVzZXQoQVZWb3JiaXNQYXJzZUNvbnRleHQgKnMpOworI2VuZGlmCisKKyNlbmRpZiAvKiBBVkNPREVDX1ZPUkJJU19QQVJTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92b3JiaXNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjE2MDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzZGVjLmMKQEAgLTAsMCArMSwxODUzIEBACisvKioKKyAqIEBmaWxlCisgKiBWb3JiaXMgSSBkZWNvZGVyCisgKiBAYXV0aG9yIERlbmVzIEJhbGF0b25pICAoIGRiYWxhdG9uaSBwcm9ncmFtb3pvIGh1ICkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVm9yYmlzIEkgZGVjb2RlcgorICogQGF1dGhvciBEZW5lcyBCYWxhdG9uaSAgKCBkYmFsYXRvbmkgcHJvZ3JhbW96byBodSApCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZmZ0LmgiCisjaW5jbHVkZSAiZm10Y29udmVydC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJ2b3JiaXMuaCIKKyNpbmNsdWRlICJ2b3JiaXNkc3AuaCIKKyNpbmNsdWRlICJ4aXBoLmgiCisKKyNkZWZpbmUgVl9OQl9CSVRTIDgKKyNkZWZpbmUgVl9OQl9CSVRTMiAxMQorI2RlZmluZSBWX01BWF9WTENTICgxIDw8IDE2KQorI2RlZmluZSBWX01BWF9QQVJUSVRJT05TICgxIDw8IDIwKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgIGRpbWVuc2lvbnM7CisgICAgdWludDhfdCAgICAgIGxvb2t1cF90eXBlOworICAgIHVpbnQ4X3QgICAgICBtYXhkZXB0aDsKKyAgICBWTEMgICAgICAgICAgdmxjOworICAgIGZsb2F0ICAgICAgICpjb2RldmVjdG9yczsKKyAgICB1bnNpZ25lZCBpbnQgbmJfYml0czsKK30gdm9yYmlzX2NvZGVib29rOworCit0eXBlZGVmIHVuaW9uICB2b3JiaXNfZmxvb3JfdSAgdm9yYmlzX2Zsb29yX2RhdGE7Cit0eXBlZGVmIHN0cnVjdCB2b3JiaXNfZmxvb3IwX3Mgdm9yYmlzX2Zsb29yMDsKK3R5cGVkZWYgc3RydWN0IHZvcmJpc19mbG9vcjFfcyB2b3JiaXNfZmxvb3IxOworc3RydWN0IHZvcmJpc19jb250ZXh0X3M7Cit0eXBlZGVmCitpbnQgKCogdm9yYmlzX2Zsb29yX2RlY29kZV9mdW5jKQorICAgIChzdHJ1Y3Qgdm9yYmlzX2NvbnRleHRfcyAqLCB2b3JiaXNfZmxvb3JfZGF0YSAqLCBmbG9hdCAqKTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IGZsb29yX3R5cGU7CisgICAgdm9yYmlzX2Zsb29yX2RlY29kZV9mdW5jIGRlY29kZTsKKyAgICB1bmlvbiB2b3JiaXNfZmxvb3JfdSB7CisgICAgICAgIHN0cnVjdCB2b3JiaXNfZmxvb3IwX3MgeworICAgICAgICAgICAgdWludDhfdCAgICAgICBvcmRlcjsKKyAgICAgICAgICAgIHVpbnQxNl90ICAgICAgcmF0ZTsKKyAgICAgICAgICAgIHVpbnQxNl90ICAgICAgYmFya19tYXBfc2l6ZTsKKyAgICAgICAgICAgIGludDMyX3QgICAgICAqbWFwWzJdOworICAgICAgICAgICAgdWludDMyX3QgICAgICBtYXBfc2l6ZVsyXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgYW1wbGl0dWRlX2JpdHM7CisgICAgICAgICAgICB1aW50OF90ICAgICAgIGFtcGxpdHVkZV9vZmZzZXQ7CisgICAgICAgICAgICB1aW50OF90ICAgICAgIG51bV9ib29rczsKKyAgICAgICAgICAgIHVpbnQ4X3QgICAgICAqYm9va19saXN0OworICAgICAgICAgICAgZmxvYXQgICAgICAgICpsc3A7CisgICAgICAgIH0gdDA7CisgICAgICAgIHN0cnVjdCB2b3JiaXNfZmxvb3IxX3MgeworICAgICAgICAgICAgdWludDhfdCAgICAgICBwYXJ0aXRpb25zOworICAgICAgICAgICAgdWludDhfdCAgICAgICBwYXJ0aXRpb25fY2xhc3NbMzJdOworICAgICAgICAgICAgdWludDhfdCAgICAgICBjbGFzc19kaW1lbnNpb25zWzE2XTsKKyAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgY2xhc3Nfc3ViY2xhc3Nlc1sxNl07CisgICAgICAgICAgICB1aW50OF90ICAgICAgIGNsYXNzX21hc3RlcmJvb2tbMTZdOworICAgICAgICAgICAgaW50MTZfdCAgICAgICBzdWJjbGFzc19ib29rc1sxNl1bOF07CisgICAgICAgICAgICB1aW50OF90ICAgICAgIG11bHRpcGxpZXI7CisgICAgICAgICAgICB1aW50MTZfdCAgICAgIHhfbGlzdF9kaW07CisgICAgICAgICAgICB2b3JiaXNfZmxvb3IxX2VudHJ5ICpsaXN0OworICAgICAgICB9IHQxOworICAgIH0gZGF0YTsKK30gdm9yYmlzX2Zsb29yOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgICAgICB0eXBlOworICAgIHVpbnQzMl90ICAgICAgYmVnaW47CisgICAgdWludDMyX3QgICAgICBlbmQ7CisgICAgdW5zaWduZWQgICAgICBwYXJ0aXRpb25fc2l6ZTsKKyAgICB1aW50OF90ICAgICAgIGNsYXNzaWZpY2F0aW9uczsKKyAgICB1aW50OF90ICAgICAgIGNsYXNzYm9vazsKKyAgICBpbnQxNl90ICAgICAgIGJvb2tzWzY0XVs4XTsKKyAgICB1aW50OF90ICAgICAgIG1heHBhc3M7CisgICAgdWludDE2X3QgICAgICBwdG5zX3RvX3JlYWQ7CisgICAgdWludDhfdCAgICAgICpjbGFzc2lmczsKK30gdm9yYmlzX3Jlc2lkdWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICAgIHN1Ym1hcHM7CisgICAgdWludDE2X3QgICAgICBjb3VwbGluZ19zdGVwczsKKyAgICB1aW50OF90ICAgICAgKm1hZ25pdHVkZTsKKyAgICB1aW50OF90ICAgICAgKmFuZ2xlOworICAgIHVpbnQ4X3QgICAgICAqbXV4OworICAgIHVpbnQ4X3QgICAgICAgc3VibWFwX2Zsb29yWzE2XTsKKyAgICB1aW50OF90ICAgICAgIHN1Ym1hcF9yZXNpZHVlWzE2XTsKK30gdm9yYmlzX21hcHBpbmc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICAgIGJsb2NrZmxhZzsKKyAgICB1aW50MTZfdCAgICAgIHdpbmRvd3R5cGU7CisgICAgdWludDE2X3QgICAgICB0cmFuc2Zvcm10eXBlOworICAgIHVpbnQ4X3QgICAgICAgbWFwcGluZzsKK30gdm9yYmlzX21vZGU7CisKK3R5cGVkZWYgc3RydWN0IHZvcmJpc19jb250ZXh0X3MgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIFZvcmJpc0RTUENvbnRleHQgZHNwOworICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOworICAgIEZtdENvbnZlcnRDb250ZXh0IGZtdF9jb252OworCisgICAgRkZUQ29udGV4dCBtZGN0WzJdOworICAgIHVpbnQ4X3QgICAgICAgZmlyc3RfZnJhbWU7CisgICAgdWludDMyX3QgICAgICB2ZXJzaW9uOworICAgIHVpbnQ4X3QgICAgICAgYXVkaW9fY2hhbm5lbHM7CisgICAgdWludDMyX3QgICAgICBhdWRpb19zYW1wbGVyYXRlOworICAgIHVpbnQzMl90ICAgICAgYml0cmF0ZV9tYXhpbXVtOworICAgIHVpbnQzMl90ICAgICAgYml0cmF0ZV9ub21pbmFsOworICAgIHVpbnQzMl90ICAgICAgYml0cmF0ZV9taW5pbXVtOworICAgIHVpbnQzMl90ICAgICAgYmxvY2tzaXplWzJdOworICAgIGNvbnN0IGZsb2F0ICAqd2luWzJdOworICAgIHVpbnQxNl90ICAgICAgY29kZWJvb2tfY291bnQ7CisgICAgdm9yYmlzX2NvZGVib29rICpjb2RlYm9va3M7CisgICAgdWludDhfdCAgICAgICBmbG9vcl9jb3VudDsKKyAgICB2b3JiaXNfZmxvb3IgKmZsb29yczsKKyAgICB1aW50OF90ICAgICAgIHJlc2lkdWVfY291bnQ7CisgICAgdm9yYmlzX3Jlc2lkdWUgKnJlc2lkdWVzOworICAgIHVpbnQ4X3QgICAgICAgbWFwcGluZ19jb3VudDsKKyAgICB2b3JiaXNfbWFwcGluZyAqbWFwcGluZ3M7CisgICAgdWludDhfdCAgICAgICBtb2RlX2NvdW50OworICAgIHZvcmJpc19tb2RlICAqbW9kZXM7CisgICAgdWludDhfdCAgICAgICBtb2RlX251bWJlcjsgLy8gbW9kZSBudW1iZXIgZm9yIHRoZSBjdXJyZW50IHBhY2tldAorICAgIGludDhfdCAgICAgICBwcmV2aW91c193aW5kb3c7CisgICAgZmxvYXQgICAgICAgICpjaGFubmVsX3Jlc2lkdWVzOworICAgIGZsb2F0ICAgICAgICAqc2F2ZWQ7Cit9IHZvcmJpc19jb250ZXh0OworCisvKiBIZWxwZXIgZnVuY3Rpb25zICovCisKKyNkZWZpbmUgQkFSSyh4KSBcCisgICAgKDEzLjFmICogYXRhbigwLjAwMDc0ZiAqICh4KSkgKyAyLjI0ZiAqIGF0YW4oMS44NWUtOGYgKiAoeCkgKiAoeCkpICsgMWUtNGYgKiAoeCkpCisKK3N0YXRpYyBjb25zdCBjaGFyIGlkeF9lcnJfc3RyW10gPSAiSW5kZXggdmFsdWUgJWQgb3V0IG9mIHJhbmdlICgwIC0gJWQpIGZvciAlcyBhdCAlczolaVxuIjsKKyNkZWZpbmUgVkFMSURBVEVfSU5ERVgoaWR4LCBsaW1pdCkgXAorICAgIGlmIChpZHggPj0gbGltaXQpIHtcCisgICAgICAgIGF2X2xvZyh2Yy0+YXZjdHgsIEFWX0xPR19FUlJPUixcCisgICAgICAgICAgICAgICBpZHhfZXJyX3N0cixcCisgICAgICAgICAgICAgICAoaW50KShpZHgpLCAoaW50KShsaW1pdCAtIDEpLCAjaWR4LCBfX0ZJTEVfXywgX19MSU5FX18pO1wKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7XAorICAgIH0KKyNkZWZpbmUgR0VUX1ZBTElEQVRFRF9JTkRFWChpZHgsIGJpdHMsIGxpbWl0KSBcCisgICAge1wKKyAgICAgICAgaWR4ID0gZ2V0X2JpdHMoZ2IsIGJpdHMpO1wKKyAgICAgICAgVkFMSURBVEVfSU5ERVgoaWR4LCBsaW1pdClcCisgICAgfQorCitzdGF0aWMgZmxvYXQgdm9yYmlzZmxvYXQyZmxvYXQodW5zaWduZWQgdmFsKQoreworICAgIGRvdWJsZSBtYW50ID0gdmFsICYgMHgxZmZmZmY7CisgICAgbG9uZyBleHAgICAgPSAodmFsICYgMHg3ZmUwMDAwMEwpID4+IDIxOworICAgIGlmICh2YWwgJiAweDgwMDAwMDAwKQorICAgICAgICBtYW50ID0gLW1hbnQ7CisgICAgcmV0dXJuIGxkZXhwKG1hbnQsIGV4cCAtIDIwIC0gNzY4KTsKK30KKworCisvLyBGcmVlIGFsbCBhbGxvY2F0ZWQgbWVtb3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIHZvcmJpc19mcmVlKHZvcmJpc19jb250ZXh0ICp2YykKK3sKKyAgICBpbnQgaTsKKworICAgIGF2X2ZyZWVwKCZ2Yy0+Y2hhbm5lbF9yZXNpZHVlcyk7CisgICAgYXZfZnJlZXAoJnZjLT5zYXZlZCk7CisgICAgYXZfZnJlZXAoJnZjLT5mZHNwKTsKKworICAgIGlmICh2Yy0+cmVzaWR1ZXMpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2Yy0+cmVzaWR1ZV9jb3VudDsgaSsrKQorICAgICAgICAgICAgYXZfZnJlZXAoJnZjLT5yZXNpZHVlc1tpXS5jbGFzc2lmcyk7CisgICAgYXZfZnJlZXAoJnZjLT5yZXNpZHVlcyk7CisgICAgYXZfZnJlZXAoJnZjLT5tb2Rlcyk7CisKKyAgICBmZl9tZGN0X2VuZCgmdmMtPm1kY3RbMF0pOworICAgIGZmX21kY3RfZW5kKCZ2Yy0+bWRjdFsxXSk7CisKKyAgICBpZiAodmMtPmNvZGVib29rcykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHZjLT5jb2RlYm9va19jb3VudDsgKytpKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmdmMtPmNvZGVib29rc1tpXS5jb2RldmVjdG9ycyk7CisgICAgICAgICAgICBmZl9mcmVlX3ZsYygmdmMtPmNvZGVib29rc1tpXS52bGMpOworICAgICAgICB9CisgICAgYXZfZnJlZXAoJnZjLT5jb2RlYm9va3MpOworCisgICAgaWYgKHZjLT5mbG9vcnMpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2Yy0+Zmxvb3JfY291bnQ7ICsraSkgeworICAgICAgICAgICAgaWYgKHZjLT5mbG9vcnNbaV0uZmxvb3JfdHlwZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnZjLT5mbG9vcnNbaV0uZGF0YS50MC5tYXBbMF0pOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZ2Yy0+Zmxvb3JzW2ldLmRhdGEudDAubWFwWzFdKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmdmMtPmZsb29yc1tpXS5kYXRhLnQwLmJvb2tfbGlzdCk7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnZjLT5mbG9vcnNbaV0uZGF0YS50MC5sc3ApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmdmMtPmZsb29yc1tpXS5kYXRhLnQxLmxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgYXZfZnJlZXAoJnZjLT5mbG9vcnMpOworCisgICAgaWYgKHZjLT5tYXBwaW5ncykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHZjLT5tYXBwaW5nX2NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ2Yy0+bWFwcGluZ3NbaV0ubWFnbml0dWRlKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ2Yy0+bWFwcGluZ3NbaV0uYW5nbGUpOworICAgICAgICAgICAgYXZfZnJlZXAoJnZjLT5tYXBwaW5nc1tpXS5tdXgpOworICAgICAgICB9CisgICAgYXZfZnJlZXAoJnZjLT5tYXBwaW5ncyk7Cit9CisKKy8vIFBhcnNlIHNldHVwIGhlYWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFByb2Nlc3MgY29kZWJvb2tzIHBhcnQKKworc3RhdGljIGludCB2b3JiaXNfcGFyc2Vfc2V0dXBfaGRyX2NvZGVib29rcyh2b3JiaXNfY29udGV4dCAqdmMpCit7CisgICAgdW5zaWduZWQgY2I7CisgICAgdWludDhfdCAgKnRtcF92bGNfYml0cyAgPSBOVUxMOworICAgIHVpbnQzMl90ICp0bXBfdmxjX2NvZGVzID0gTlVMTDsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZ2Yy0+Z2I7CisgICAgdWludDE2X3QgKmNvZGVib29rX211bHRpcGxpY2FuZHMgPSBOVUxMOworICAgIGludCByZXQgPSAwOworCisgICAgdmMtPmNvZGVib29rX2NvdW50ID0gZ2V0X2JpdHMoZ2IsIDgpICsgMTsKKworICAgIGF2X2Rsb2coTlVMTCwgIiBDb2RlYm9va3M6ICVkIFxuIiwgdmMtPmNvZGVib29rX2NvdW50KTsKKworICAgIHZjLT5jb2RlYm9va3MgPSBhdl9tYWxsb2N6KHZjLT5jb2RlYm9va19jb3VudCAqIHNpemVvZigqdmMtPmNvZGVib29rcykpOworICAgIHRtcF92bGNfYml0cyAgPSBhdl9tYWxsb2N6KFZfTUFYX1ZMQ1MgKiBzaXplb2YoKnRtcF92bGNfYml0cykpOworICAgIHRtcF92bGNfY29kZXMgPSBhdl9tYWxsb2N6KFZfTUFYX1ZMQ1MgKiBzaXplb2YoKnRtcF92bGNfY29kZXMpKTsKKyAgICBjb2RlYm9va19tdWx0aXBsaWNhbmRzID0gYXZfbWFsbG9jKFZfTUFYX1ZMQ1MgKiBzaXplb2YoKmNvZGVib29rX211bHRpcGxpY2FuZHMpKTsKKyAgICBpZiAoIXZjLT5jb2RlYm9va3MgfHwKKyAgICAgICAgIXRtcF92bGNfYml0cyB8fCAhdG1wX3ZsY19jb2RlcyB8fCAhY29kZWJvb2tfbXVsdGlwbGljYW5kcykgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZm9yIChjYiA9IDA7IGNiIDwgdmMtPmNvZGVib29rX2NvdW50OyArK2NiKSB7CisgICAgICAgIHZvcmJpc19jb2RlYm9vayAqY29kZWJvb2tfc2V0dXAgPSAmdmMtPmNvZGVib29rc1tjYl07CisgICAgICAgIHVuc2lnbmVkIG9yZGVyZWQsIHQsIGVudHJpZXMsIHVzZWRfZW50cmllcyA9IDA7CisKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiICV1LiBDb2RlYm9va1xuIiwgY2IpOworCisgICAgICAgIGlmIChnZXRfYml0cyhnYiwgMjQpICE9IDB4NTY0MzQyKSB7CisgICAgICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiAldS4gQ29kZWJvb2sgc2V0dXAgZGF0YSBjb3JydXB0LlxuIiwgY2IpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBjb2RlYm9va19zZXR1cC0+ZGltZW5zaW9ucz1nZXRfYml0cyhnYiwgMTYpOworICAgICAgICBpZiAoY29kZWJvb2tfc2V0dXAtPmRpbWVuc2lvbnMgPiAxNiB8fCBjb2RlYm9va19zZXR1cC0+ZGltZW5zaW9ucyA9PSAwKSB7CisgICAgICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiAldS4gQ29kZWJvb2sncyBkaW1lbnNpb24gaXMgaW52YWxpZCAoJWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICBjYiwgY29kZWJvb2tfc2V0dXAtPmRpbWVuc2lvbnMpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZW50cmllcyA9IGdldF9iaXRzKGdiLCAyNCk7CisgICAgICAgIGlmIChlbnRyaWVzID4gVl9NQVhfVkxDUykgeworICAgICAgICAgICAgYXZfbG9nKHZjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICIgJXUuIENvZGVib29rIGhhcyB0b28gbWFueSBlbnRyaWVzICgldSkuXG4iLAorICAgICAgICAgICAgICAgICAgIGNiLCBlbnRyaWVzKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgb3JkZXJlZCA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiIGNvZGVib29rX2RpbWVuc2lvbnMgJWQsIGNvZGVib29rX2VudHJpZXMgJXVcbiIsCisgICAgICAgICAgICAgICAgY29kZWJvb2tfc2V0dXAtPmRpbWVuc2lvbnMsIGVudHJpZXMpOworCisgICAgICAgIGlmICghb3JkZXJlZCkgeworICAgICAgICAgICAgdW5zaWduZWQgY2UsIGZsYWc7CisgICAgICAgICAgICB1bnNpZ25lZCBzcGFyc2UgPSBnZXRfYml0czEoZ2IpOworCisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIgbm90IG9yZGVyZWQgXG4iKTsKKworICAgICAgICAgICAgaWYgKHNwYXJzZSkgeworICAgICAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgIiBzcGFyc2UgXG4iKTsKKworICAgICAgICAgICAgICAgIHVzZWRfZW50cmllcyA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChjZSA9IDA7IGNlIDwgZW50cmllczsgKytjZSkgeworICAgICAgICAgICAgICAgICAgICBmbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcF92bGNfYml0c1tjZV0gPSBnZXRfYml0cyhnYiwgNSkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgKyt1c2VkX2VudHJpZXM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wX3ZsY19iaXRzW2NlXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIgbm90IHNwYXJzZSBcbiIpOworCisgICAgICAgICAgICAgICAgdXNlZF9lbnRyaWVzID0gZW50cmllczsKKyAgICAgICAgICAgICAgICBmb3IgKGNlID0gMDsgY2UgPCBlbnRyaWVzOyArK2NlKQorICAgICAgICAgICAgICAgICAgICB0bXBfdmxjX2JpdHNbY2VdID0gZ2V0X2JpdHMoZ2IsIDUpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZW50cnkgID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfbGVuZ3RoID0gZ2V0X2JpdHMoZ2IsIDUpICsgMTsKKworICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiIG9yZGVyZWQsIGN1cnJlbnQgbGVuZ3RoOiAldVxuIiwgY3VycmVudF9sZW5ndGgpOyAgLy9GSVhNRQorCisgICAgICAgICAgICB1c2VkX2VudHJpZXMgPSBlbnRyaWVzOworICAgICAgICAgICAgZm9yICg7IGN1cnJlbnRfZW50cnkgPCB1c2VkX2VudHJpZXMgJiYgY3VycmVudF9sZW5ndGggPD0gMzI7ICsrY3VycmVudF9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpLCBudW1iZXI7CisKKyAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIgbnVtYmVyIGJpdHM6ICV1ICIsIGlsb2coZW50cmllcyAtIGN1cnJlbnRfZW50cnkpKTsKKworICAgICAgICAgICAgICAgIG51bWJlciA9IGdldF9iaXRzKGdiLCBpbG9nKGVudHJpZXMgLSBjdXJyZW50X2VudHJ5KSk7CisKKyAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIgbnVtYmVyOiAldVxuIiwgbnVtYmVyKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRfZW50cnk7IGkgPCBudW1iZXIrY3VycmVudF9lbnRyeTsgKytpKQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHVzZWRfZW50cmllcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcF92bGNfYml0c1tpXSA9IGN1cnJlbnRfbGVuZ3RoOworCisgICAgICAgICAgICAgICAgY3VycmVudF9lbnRyeSs9bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN1cnJlbnRfZW50cnk+dXNlZF9lbnRyaWVzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHZjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiIE1vcmUgY29kZWxlbmd0aHMgdGhhbiBjb2RlcyBpbiBjb2RlYm9vay4gXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb2RlYm9va19zZXR1cC0+bG9va3VwX3R5cGUgPSBnZXRfYml0cyhnYiwgNCk7CisKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiIGxvb2t1cCB0eXBlOiAlZCA6ICVzIFxuIiwgY29kZWJvb2tfc2V0dXAtPmxvb2t1cF90eXBlLAorICAgICAgICAgICAgICAgIGNvZGVib29rX3NldHVwLT5sb29rdXBfdHlwZSA/ICJ2cSIgOiAibm8gbG9va3VwIik7CisKKy8vIElmIHRoZSBjb2RlYm9vayBpcyB1c2VkIGZvciAoaW52ZXJzZSkgVlEsIGNhbGN1bGF0ZSBjb2RldmVjdG9ycy4KKworICAgICAgICBpZiAoY29kZWJvb2tfc2V0dXAtPmxvb2t1cF90eXBlID09IDEpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGksIGosIGs7CisgICAgICAgICAgICB1bnNpZ25lZCBjb2RlYm9va19sb29rdXBfdmFsdWVzID0gZmZfdm9yYmlzX250aF9yb290KGVudHJpZXMsIGNvZGVib29rX3NldHVwLT5kaW1lbnNpb25zKTsKKworICAgICAgICAgICAgZmxvYXQgY29kZWJvb2tfbWluaW11bV92YWx1ZSA9IHZvcmJpc2Zsb2F0MmZsb2F0KGdldF9iaXRzX2xvbmcoZ2IsIDMyKSk7CisgICAgICAgICAgICBmbG9hdCBjb2RlYm9va19kZWx0YV92YWx1ZSAgID0gdm9yYmlzZmxvYXQyZmxvYXQoZ2V0X2JpdHNfbG9uZyhnYiwgMzIpKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNvZGVib29rX3ZhbHVlX2JpdHMgPSBnZXRfYml0cyhnYiwgNCkgKyAxOworICAgICAgICAgICAgdW5zaWduZWQgY29kZWJvb2tfc2VxdWVuY2VfcCA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgIiBXZSBleHBlY3QgJWQgbnVtYmVycyBmb3IgYnVpbGRpbmcgdGhlIGNvZGV2ZWN0b3JzLiBcbiIsCisgICAgICAgICAgICAgICAgICAgIGNvZGVib29rX2xvb2t1cF92YWx1ZXMpOworICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiICBkZWx0YSAlZiBtaW5tdW0gJWYgXG4iLAorICAgICAgICAgICAgICAgICAgICBjb2RlYm9va19kZWx0YV92YWx1ZSwgY29kZWJvb2tfbWluaW11bV92YWx1ZSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2RlYm9va19sb29rdXBfdmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb2RlYm9va19tdWx0aXBsaWNhbmRzW2ldID0gZ2V0X2JpdHMoZ2IsIGNvZGVib29rX3ZhbHVlX2JpdHMpOworCisgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiIG11bHRpcGxpY2FuZHMqZGVsdGErbWlubXVtIDogJWUgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWNvZGVib29rX211bHRpcGxpY2FuZHNbaV0gKiBjb2RlYm9va19kZWx0YV92YWx1ZSArIGNvZGVib29rX21pbmltdW1fdmFsdWUpOworICAgICAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgIiBtdWx0aXBsaWNhbmQgJXVcbiIsIGNvZGVib29rX211bHRpcGxpY2FuZHNbaV0pOworICAgICAgICAgICAgfQorCisvLyBXZWVkIG91dCB1bnVzZWQgdmxjcyBhbmQgYnVpbGQgY29kZXZlY3RvciB2ZWN0b3IKKyAgICAgICAgICAgIGNvZGVib29rX3NldHVwLT5jb2RldmVjdG9ycyA9IHVzZWRfZW50cmllcyA/IGF2X21hbGxvY3pfYXJyYXkodXNlZF9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYm9va19zZXR1cC0+ZGltZW5zaW9ucyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY29kZWJvb2tfc2V0dXAtPmNvZGV2ZWN0b3JzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgICAgICBmb3IgKGogPSAwLCBpID0gMDsgaSA8IGVudHJpZXM7ICsraSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRpbSA9IGNvZGVib29rX3NldHVwLT5kaW1lbnNpb25zOworCisgICAgICAgICAgICAgICAgaWYgKHRtcF92bGNfYml0c1tpXSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBsYXN0ID0gMC4wOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb29rdXBfb2Zmc2V0ID0gaTsKKworICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKHZjLT5hdmN0eCwgIkxvb2t1cCBvZmZzZXQgJXUgLCIsIGkpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBkaW07ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXVsdGlwbGljYW5kX29mZnNldCA9IGxvb2t1cF9vZmZzZXQgJSBjb2RlYm9va19sb29rdXBfdmFsdWVzOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZWJvb2tfc2V0dXAtPmNvZGV2ZWN0b3JzW2ogKiBkaW0gKyBrXSA9IGNvZGVib29rX211bHRpcGxpY2FuZHNbbXVsdGlwbGljYW5kX29mZnNldF0gKiBjb2RlYm9va19kZWx0YV92YWx1ZSArIGNvZGVib29rX21pbmltdW1fdmFsdWUgKyBsYXN0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVib29rX3NlcXVlbmNlX3ApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGNvZGVib29rX3NldHVwLT5jb2RldmVjdG9yc1tqICogZGltICsga107CisgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBfb2Zmc2V0Lz1jb2RlYm9va19sb29rdXBfdmFsdWVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRtcF92bGNfYml0c1tqXSA9IHRtcF92bGNfYml0c1tpXTsKKworICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKHZjLT5hdmN0eCwgInJlYWwgbG9va3VwIG9mZnNldCAldSwgdmVjdG9yOiAiLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGRpbTsgKytrKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfZGxvZyh2Yy0+YXZjdHgsICIgJWYgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWJvb2tfc2V0dXAtPmNvZGV2ZWN0b3JzW2ogKiBkaW0gKyBrXSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Rsb2codmMtPmF2Y3R4LCAiXG4iKTsKKworICAgICAgICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGogIT0gdXNlZF9lbnRyaWVzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHZjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQnVnIGluIGNvZGV2ZWN0b3IgdmVjdG9yIGJ1aWxkaW5nIGNvZGUuIFxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW50cmllcyA9IHVzZWRfZW50cmllczsKKyAgICAgICAgfSBlbHNlIGlmIChjb2RlYm9va19zZXR1cC0+bG9va3VwX3R5cGUgPj0gMikgeworICAgICAgICAgICAgYXZfbG9nKHZjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29kZWJvb2sgbG9va3VwIHR5cGUgbm90IHN1cHBvcnRlZC4gXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKy8vIEluaXRpYWxpemUgVkxDIHRhYmxlCisgICAgICAgIGlmIChmZl92b3JiaXNfbGVuMnZsYyh0bXBfdmxjX2JpdHMsIHRtcF92bGNfY29kZXMsIGVudHJpZXMpKSB7CisgICAgICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgSW52YWxpZCBjb2RlIGxlbmd0aHMgd2hpbGUgZ2VuZXJhdGluZyB2bGNzLiBcbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgY29kZWJvb2tfc2V0dXAtPm1heGRlcHRoID0gMDsKKyAgICAgICAgZm9yICh0ID0gMDsgdCA8IGVudHJpZXM7ICsrdCkKKyAgICAgICAgICAgIGlmICh0bXBfdmxjX2JpdHNbdF0gPj0gY29kZWJvb2tfc2V0dXAtPm1heGRlcHRoKQorICAgICAgICAgICAgICAgIGNvZGVib29rX3NldHVwLT5tYXhkZXB0aCA9IHRtcF92bGNfYml0c1t0XTsKKworICAgICAgICBpZiAoY29kZWJvb2tfc2V0dXAtPm1heGRlcHRoID4gMyAqIFZfTkJfQklUUykKKyAgICAgICAgICAgIGNvZGVib29rX3NldHVwLT5uYl9iaXRzID0gVl9OQl9CSVRTMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29kZWJvb2tfc2V0dXAtPm5iX2JpdHMgPSBWX05CX0JJVFM7CisKKyAgICAgICAgY29kZWJvb2tfc2V0dXAtPm1heGRlcHRoID0gKGNvZGVib29rX3NldHVwLT5tYXhkZXB0aCtjb2RlYm9va19zZXR1cC0+bmJfYml0cyAtIDEpIC8gY29kZWJvb2tfc2V0dXAtPm5iX2JpdHM7CisKKyAgICAgICAgaWYgKChyZXQgPSBpbml0X3ZsYygmY29kZWJvb2tfc2V0dXAtPnZsYywgY29kZWJvb2tfc2V0dXAtPm5iX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywgdG1wX3ZsY19iaXRzLCBzaXplb2YoKnRtcF92bGNfYml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCp0bXBfdmxjX2JpdHMpLCB0bXBfdmxjX2NvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqdG1wX3ZsY19jb2RlcyksIHNpemVvZigqdG1wX3ZsY19jb2RlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5JVF9WTENfTEUpKSkgeworICAgICAgICAgICAgYXZfbG9nKHZjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiIEVycm9yIGdlbmVyYXRpbmcgdmxjIHRhYmxlcy4gXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9mcmVlKHRtcF92bGNfYml0cyk7CisgICAgYXZfZnJlZSh0bXBfdmxjX2NvZGVzKTsKKyAgICBhdl9mcmVlKGNvZGVib29rX211bHRpcGxpY2FuZHMpOworICAgIHJldHVybiAwOworCisvLyBFcnJvcjoKK2Vycm9yOgorICAgIGF2X2ZyZWUodG1wX3ZsY19iaXRzKTsKKyAgICBhdl9mcmVlKHRtcF92bGNfY29kZXMpOworICAgIGF2X2ZyZWUoY29kZWJvb2tfbXVsdGlwbGljYW5kcyk7CisgICAgcmV0dXJuIHJldDsKK30KKworLy8gUHJvY2VzcyB0aW1lIGRvbWFpbiB0cmFuc2Zvcm1zIHBhcnQgKHVudXNlZCBpbiBWb3JiaXMgSSkKKworc3RhdGljIGludCB2b3JiaXNfcGFyc2Vfc2V0dXBfaGRyX3RkdHJhbnNmb3Jtcyh2b3JiaXNfY29udGV4dCAqdmMpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmdmMtPmdiOworICAgIHVuc2lnbmVkIGksIHZvcmJpc190aW1lX2NvdW50ID0gZ2V0X2JpdHMoZ2IsIDYpICsgMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB2b3JiaXNfdGltZV9jb3VudDsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIHZvcmJpc190ZHRyYW5zZm9ybSA9IGdldF9iaXRzKGdiLCAxNik7CisKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiIFZvcmJpcyB0aW1lIGRvbWFpbiB0cmFuc2Zvcm0gJXU6ICV1XG4iLAorICAgICAgICAgICAgICAgIHZvcmJpc190aW1lX2NvdW50LCB2b3JiaXNfdGR0cmFuc2Zvcm0pOworCisgICAgICAgIGlmICh2b3JiaXNfdGR0cmFuc2Zvcm0pIHsKKyAgICAgICAgICAgIGF2X2xvZyh2Yy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlZvcmJpcyB0aW1lIGRvbWFpbiB0cmFuc2Zvcm0gZGF0YSBub256ZXJvLiBcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFByb2Nlc3MgZmxvb3JzIHBhcnQKKworc3RhdGljIGludCB2b3JiaXNfZmxvb3IwX2RlY29kZSh2b3JiaXNfY29udGV4dCAqdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc19mbG9vcl9kYXRhICp2ZnUsIGZsb2F0ICp2ZWMpOworc3RhdGljIGludCBjcmVhdGVfbWFwKHZvcmJpc19jb250ZXh0ICp2YywgdW5zaWduZWQgZmxvb3JfbnVtYmVyKTsKK3N0YXRpYyBpbnQgdm9yYmlzX2Zsb29yMV9kZWNvZGUodm9yYmlzX2NvbnRleHQgKnZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfZmxvb3JfZGF0YSAqdmZ1LCBmbG9hdCAqdmVjKTsKK3N0YXRpYyBpbnQgdm9yYmlzX3BhcnNlX3NldHVwX2hkcl9mbG9vcnModm9yYmlzX2NvbnRleHQgKnZjKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnZjLT5nYjsKKyAgICBpbnQgaSwgaiwgaywgcmV0OworCisgICAgdmMtPmZsb29yX2NvdW50ID0gZ2V0X2JpdHMoZ2IsIDYpICsgMTsKKworICAgIHZjLT5mbG9vcnMgPSBhdl9tYWxsb2N6KHZjLT5mbG9vcl9jb3VudCAqIHNpemVvZigqdmMtPmZsb29ycykpOworICAgIGlmICghdmMtPmZsb29ycykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB2Yy0+Zmxvb3JfY291bnQ7ICsraSkgeworICAgICAgICB2b3JiaXNfZmxvb3IgKmZsb29yX3NldHVwID0gJnZjLT5mbG9vcnNbaV07CisKKyAgICAgICAgZmxvb3Jfc2V0dXAtPmZsb29yX3R5cGUgPSBnZXRfYml0cyhnYiwgMTYpOworCisgICAgICAgIGF2X2Rsb2coTlVMTCwgIiAlZC4gZmxvb3IgdHlwZSAlZCBcbiIsIGksIGZsb29yX3NldHVwLT5mbG9vcl90eXBlKTsKKworICAgICAgICBpZiAoZmxvb3Jfc2V0dXAtPmZsb29yX3R5cGUgPT0gMSkgeworICAgICAgICAgICAgaW50IG1heGltdW1fY2xhc3MgPSAtMTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHJhbmdlYml0cywgcmFuZ2VtYXgsIGZsb29yMV92YWx1ZXMgPSAyOworCisgICAgICAgICAgICBmbG9vcl9zZXR1cC0+ZGVjb2RlID0gdm9yYmlzX2Zsb29yMV9kZWNvZGU7CisKKyAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQxLnBhcnRpdGlvbnMgPSBnZXRfYml0cyhnYiwgNSk7CisKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgIiAlZC5mbG9vcjogJWQgcGFydGl0aW9ucyBcbiIsCisgICAgICAgICAgICAgICAgICAgIGksIGZsb29yX3NldHVwLT5kYXRhLnQxLnBhcnRpdGlvbnMpOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmxvb3Jfc2V0dXAtPmRhdGEudDEucGFydGl0aW9uczsgKytqKSB7CisgICAgICAgICAgICAgICAgZmxvb3Jfc2V0dXAtPmRhdGEudDEucGFydGl0aW9uX2NsYXNzW2pdID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICAgICAgICAgIGlmIChmbG9vcl9zZXR1cC0+ZGF0YS50MS5wYXJ0aXRpb25fY2xhc3Nbal0gPiBtYXhpbXVtX2NsYXNzKQorICAgICAgICAgICAgICAgICAgICBtYXhpbXVtX2NsYXNzID0gZmxvb3Jfc2V0dXAtPmRhdGEudDEucGFydGl0aW9uX2NsYXNzW2pdOworCisgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiICVkLiBmbG9vciAlZCBwYXJ0aXRpb24gY2xhc3MgJWQgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgaiwgZmxvb3Jfc2V0dXAtPmRhdGEudDEucGFydGl0aW9uX2NsYXNzW2pdKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIgbWF4aW11bSBjbGFzcyAlZCBcbiIsIG1heGltdW1fY2xhc3MpOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IG1heGltdW1fY2xhc3M7ICsraikgeworICAgICAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQxLmNsYXNzX2RpbWVuc2lvbnNbal0gPSBnZXRfYml0cyhnYiwgMykgKyAxOworICAgICAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQxLmNsYXNzX3N1YmNsYXNzZXNbal0gPSBnZXRfYml0cyhnYiwgMik7CisKKyAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIgJWQgZmxvb3IgJWQgY2xhc3MgZGltOiAlZCBzdWJjbGFzc2VzICVkIFxuIiwgaSwgaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQxLmNsYXNzX2RpbWVuc2lvbnNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9vcl9zZXR1cC0+ZGF0YS50MS5jbGFzc19zdWJjbGFzc2VzW2pdKTsKKworICAgICAgICAgICAgICAgIGlmIChmbG9vcl9zZXR1cC0+ZGF0YS50MS5jbGFzc19zdWJjbGFzc2VzW2pdKSB7CisgICAgICAgICAgICAgICAgICAgIEdFVF9WQUxJREFURURfSU5ERVgoZmxvb3Jfc2V0dXAtPmRhdGEudDEuY2xhc3NfbWFzdGVyYm9va1tqXSwgOCwgdmMtPmNvZGVib29rX2NvdW50KQorCisgICAgICAgICAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgIiAgIG1hc3RlcmJvb2s6ICVkIFxuIiwgZmxvb3Jfc2V0dXAtPmRhdGEudDEuY2xhc3NfbWFzdGVyYm9va1tqXSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8ICgxIDw8IGZsb29yX3NldHVwLT5kYXRhLnQxLmNsYXNzX3N1YmNsYXNzZXNbal0pOyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBiaXRzID0gZ2V0X2JpdHMoZ2IsIDgpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURV9JTkRFWChiaXRzLCB2Yy0+Y29kZWJvb2tfY291bnQpCisgICAgICAgICAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQxLnN1YmNsYXNzX2Jvb2tzW2pdW2tdID0gYml0czsKKworICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIgICAgYm9vayAlZC4gOiAlZCBcbiIsIGssIGZsb29yX3NldHVwLT5kYXRhLnQxLnN1YmNsYXNzX2Jvb2tzW2pdW2tdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQxLm11bHRpcGxpZXIgPSBnZXRfYml0cyhnYiwgMikgKyAxOworICAgICAgICAgICAgZmxvb3Jfc2V0dXAtPmRhdGEudDEueF9saXN0X2RpbSA9IDI7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmbG9vcl9zZXR1cC0+ZGF0YS50MS5wYXJ0aXRpb25zOyArK2opCisgICAgICAgICAgICAgICAgZmxvb3Jfc2V0dXAtPmRhdGEudDEueF9saXN0X2RpbSs9Zmxvb3Jfc2V0dXAtPmRhdGEudDEuY2xhc3NfZGltZW5zaW9uc1tmbG9vcl9zZXR1cC0+ZGF0YS50MS5wYXJ0aXRpb25fY2xhc3Nbal1dOworCisgICAgICAgICAgICBmbG9vcl9zZXR1cC0+ZGF0YS50MS5saXN0ID0gYXZfbWFsbG9jel9hcnJheShmbG9vcl9zZXR1cC0+ZGF0YS50MS54X2xpc3RfZGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpmbG9vcl9zZXR1cC0+ZGF0YS50MS5saXN0KSk7CisgICAgICAgICAgICBpZiAoIWZsb29yX3NldHVwLT5kYXRhLnQxLmxpc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgcmFuZ2ViaXRzID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICAgICAgcmFuZ2VtYXggPSAoMSA8PCByYW5nZWJpdHMpOworICAgICAgICAgICAgaWYgKHJhbmdlbWF4ID4gdmMtPmJsb2Nrc2l6ZVsxXSAvIDIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJGbG9vciB2YWx1ZSBpcyB0b28gbGFyZ2UgZm9yIGJsb2Nrc2l6ZTogJXUgKCUiUFJJdTMyIilcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlbWF4LCB2Yy0+YmxvY2tzaXplWzFdIC8gMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9vcl9zZXR1cC0+ZGF0YS50MS5saXN0WzBdLnggPSAwOworICAgICAgICAgICAgZmxvb3Jfc2V0dXAtPmRhdGEudDEubGlzdFsxXS54ID0gcmFuZ2VtYXg7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmbG9vcl9zZXR1cC0+ZGF0YS50MS5wYXJ0aXRpb25zOyArK2opIHsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZmxvb3Jfc2V0dXAtPmRhdGEudDEuY2xhc3NfZGltZW5zaW9uc1tmbG9vcl9zZXR1cC0+ZGF0YS50MS5wYXJ0aXRpb25fY2xhc3Nbal1dOyArK2ssICsrZmxvb3IxX3ZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICBmbG9vcl9zZXR1cC0+ZGF0YS50MS5saXN0W2Zsb29yMV92YWx1ZXNdLnggPSBnZXRfYml0cyhnYiwgcmFuZ2ViaXRzKTsKKworICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIgJXUuIGZsb29yMSBZIGNvb3JkLiAlZFxuIiwgZmxvb3IxX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vcl9zZXR1cC0+ZGF0YS50MS5saXN0W2Zsb29yMV92YWx1ZXNdLngpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworLy8gUHJlY2FsY3VsYXRlIG9yZGVyIG9mIHggY29vcmRpbmF0ZXMgLSBuZWVkZWQgZm9yIGRlY29kZQorICAgICAgICAgICAgaWYgKGZmX3ZvcmJpc19yZWFkeV9mbG9vcjFfbGlzdCh2Yy0+YXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQxLmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQxLnhfbGlzdF9kaW0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZmxvb3Jfc2V0dXAtPmZsb29yX3R5cGUgPT0gMCkgeworICAgICAgICAgICAgdW5zaWduZWQgbWF4X2NvZGVib29rX2RpbSA9IDA7CisKKyAgICAgICAgICAgIGZsb29yX3NldHVwLT5kZWNvZGUgPSB2b3JiaXNfZmxvb3IwX2RlY29kZTsKKworICAgICAgICAgICAgZmxvb3Jfc2V0dXAtPmRhdGEudDAub3JkZXIgICAgICAgICAgPSBnZXRfYml0cyhnYiwgIDgpOworICAgICAgICAgICAgaWYgKCFmbG9vcl9zZXR1cC0+ZGF0YS50MC5vcmRlcikgeworICAgICAgICAgICAgICAgIGF2X2xvZyh2Yy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkZsb29yIDAgb3JkZXIgaXMgMC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvb3Jfc2V0dXAtPmRhdGEudDAucmF0ZSAgICAgICAgICAgPSBnZXRfYml0cyhnYiwgMTYpOworICAgICAgICAgICAgaWYgKCFmbG9vcl9zZXR1cC0+ZGF0YS50MC5yYXRlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHZjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmxvb3IgMCByYXRlIGlzIDAuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQwLmJhcmtfbWFwX3NpemUgID0gZ2V0X2JpdHMoZ2IsIDE2KTsKKyAgICAgICAgICAgIGlmICghZmxvb3Jfc2V0dXAtPmRhdGEudDAuYmFya19tYXBfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyh2Yy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkZsb29yIDAgYmFyayBtYXAgc2l6ZSBpcyAwLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9vcl9zZXR1cC0+ZGF0YS50MC5hbXBsaXR1ZGVfYml0cyA9IGdldF9iaXRzKGdiLCAgNik7CisgICAgICAgICAgICBmbG9vcl9zZXR1cC0+ZGF0YS50MC5hbXBsaXR1ZGVfb2Zmc2V0ID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgZmxvb3Jfc2V0dXAtPmRhdGEudDAubnVtX2Jvb2tzICAgICAgICA9IGdldF9iaXRzKGdiLCA0KSArIDE7CisKKyAgICAgICAgICAgIC8qIGFsbG9jYXRlIG1lbSBmb3IgYm9va2xpc3QgKi8KKyAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQwLmJvb2tfbGlzdCA9CisgICAgICAgICAgICAgICAgYXZfbWFsbG9jKGZsb29yX3NldHVwLT5kYXRhLnQwLm51bV9ib29rcyk7CisgICAgICAgICAgICBpZiAoIWZsb29yX3NldHVwLT5kYXRhLnQwLmJvb2tfbGlzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgLyogcmVhZCBib29rIGluZGV4ZXMgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4OworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJvb2tfaWR4OworICAgICAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgZmxvb3Jfc2V0dXAtPmRhdGEudDAubnVtX2Jvb2tzOyArK2lkeCkgeworICAgICAgICAgICAgICAgICAgICBHRVRfVkFMSURBVEVEX0lOREVYKGJvb2tfaWR4LCA4LCB2Yy0+Y29kZWJvb2tfY291bnQpCisgICAgICAgICAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQwLmJvb2tfbGlzdFtpZHhdID0gYm9va19pZHg7CisgICAgICAgICAgICAgICAgICAgIGlmICh2Yy0+Y29kZWJvb2tzW2Jvb2tfaWR4XS5kaW1lbnNpb25zID4gbWF4X2NvZGVib29rX2RpbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jb2RlYm9va19kaW0gPSB2Yy0+Y29kZWJvb2tzW2Jvb2tfaWR4XS5kaW1lbnNpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChyZXQgPSBjcmVhdGVfbWFwKHZjLCBpKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIC8qIGNvZGVib29rIGRpbSBpcyBmb3IgcGFkZGluZyBpZiBjb2RlYm9vayBkaW0gZG9lc24ndCAqCisgICAgICAgICAgICAgKiBkaXZpZGUgb3JkZXIrMSB0aGVuIHdlIG5lZWQgdG8gcmVhZCBtb3JlIGRhdGEgICAgICAgKi8KKyAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQwLmxzcCA9CisgICAgICAgICAgICAgICAgYXZfbWFsbG9jX2FycmF5KChmbG9vcl9zZXR1cC0+ZGF0YS50MC5vcmRlciArIDEgKyBtYXhfY29kZWJvb2tfZGltKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpmbG9vcl9zZXR1cC0+ZGF0YS50MC5sc3ApKTsKKyAgICAgICAgICAgIGlmICghZmxvb3Jfc2V0dXAtPmRhdGEudDAubHNwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgIC8qIGRlYnVnIG91dHB1dCBwYXJzZWQgaGVhZGVycyAqLworICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiZmxvb3IwIG9yZGVyOiAldVxuIiwgZmxvb3Jfc2V0dXAtPmRhdGEudDAub3JkZXIpOworICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiZmxvb3IwIHJhdGU6ICV1XG4iLCBmbG9vcl9zZXR1cC0+ZGF0YS50MC5yYXRlKTsKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgImZsb29yMCBiYXJrIG1hcCBzaXplOiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZmxvb3Jfc2V0dXAtPmRhdGEudDAuYmFya19tYXBfc2l6ZSk7CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJmbG9vcjAgYW1wbGl0dWRlIGJpdHM6ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBmbG9vcl9zZXR1cC0+ZGF0YS50MC5hbXBsaXR1ZGVfYml0cyk7CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJmbG9vcjAgYW1wbGl0dWRlIG9mZnNldDogJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQwLmFtcGxpdHVkZV9vZmZzZXQpOworICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiZmxvb3IwIG51bWJlciBvZiBib29rczogJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIGZsb29yX3NldHVwLT5kYXRhLnQwLm51bV9ib29rcyk7CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJmbG9vcjAgYm9vayBsaXN0IHBvaW50ZXI6ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBmbG9vcl9zZXR1cC0+ZGF0YS50MC5ib29rX2xpc3QpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHg7CisgICAgICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBmbG9vcl9zZXR1cC0+ZGF0YS50MC5udW1fYm9va3M7ICsraWR4KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgIiAgQm9vayAlZDogJXVcbiIsIGlkeCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3Jfc2V0dXAtPmRhdGEudDAuYm9va19saXN0W2lkeF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyh2Yy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZmxvb3IgdHlwZSFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFByb2Nlc3MgcmVzaWR1ZXMgcGFydAorCitzdGF0aWMgaW50IHZvcmJpc19wYXJzZV9zZXR1cF9oZHJfcmVzaWR1ZXModm9yYmlzX2NvbnRleHQgKnZjKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnZjLT5nYjsKKyAgICB1bnNpZ25lZCBpLCBqLCBrOworCisgICAgdmMtPnJlc2lkdWVfY291bnQgPSBnZXRfYml0cyhnYiwgNikrMTsKKyAgICB2Yy0+cmVzaWR1ZXMgICAgICA9IGF2X21hbGxvY3oodmMtPnJlc2lkdWVfY291bnQgKiBzaXplb2YoKnZjLT5yZXNpZHVlcykpOworICAgIGlmICghdmMtPnJlc2lkdWVzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZfZGxvZyhOVUxMLCAiIFRoZXJlIGFyZSAlZCByZXNpZHVlcy4gXG4iLCB2Yy0+cmVzaWR1ZV9jb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmMtPnJlc2lkdWVfY291bnQ7ICsraSkgeworICAgICAgICB2b3JiaXNfcmVzaWR1ZSAqcmVzX3NldHVwID0gJnZjLT5yZXNpZHVlc1tpXTsKKyAgICAgICAgdWludDhfdCBjYXNjYWRlWzY0XTsKKyAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRzLCBsb3dfYml0czsKKworICAgICAgICByZXNfc2V0dXAtPnR5cGUgPSBnZXRfYml0cyhnYiwgMTYpOworCisgICAgICAgIGF2X2Rsb2coTlVMTCwgIiAldS4gcmVzaWR1ZSB0eXBlICVkXG4iLCBpLCByZXNfc2V0dXAtPnR5cGUpOworCisgICAgICAgIHJlc19zZXR1cC0+YmVnaW4gICAgICAgICAgPSBnZXRfYml0cyhnYiwgMjQpOworICAgICAgICByZXNfc2V0dXAtPmVuZCAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDI0KTsKKyAgICAgICAgcmVzX3NldHVwLT5wYXJ0aXRpb25fc2l6ZSA9IGdldF9iaXRzKGdiLCAyNCkgKyAxOworICAgICAgICAvKiBWYWxpZGF0aW9ucyB0byBwcmV2ZW50IGEgYnVmZmVyIG92ZXJmbG93IGxhdGVyLiAqLworICAgICAgICBpZiAocmVzX3NldHVwLT5iZWdpbj5yZXNfc2V0dXAtPmVuZCB8fAorICAgICAgICAgICAgKHJlc19zZXR1cC0+ZW5kLXJlc19zZXR1cC0+YmVnaW4pIC8gcmVzX3NldHVwLT5wYXJ0aXRpb25fc2l6ZSA+IEZGTUlOKFZfTUFYX1BBUlRJVElPTlMsIDY1NTM1KSkgeworICAgICAgICAgICAgYXZfbG9nKHZjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJwYXJ0aXRpb24gb3V0IG9mIGJvdW5kczogdHlwZSwgYmVnaW4sIGVuZCwgc2l6ZSwgYmxvY2tzaXplOiAlIlBSSXUxNiIsICUiUFJJdTMyIiwgJSJQUkl1MzIiLCAldSwgJSJQUkl1MzIiXG4iLAorICAgICAgICAgICAgICAgICAgIHJlc19zZXR1cC0+dHlwZSwgcmVzX3NldHVwLT5iZWdpbiwgcmVzX3NldHVwLT5lbmQsCisgICAgICAgICAgICAgICAgICAgcmVzX3NldHVwLT5wYXJ0aXRpb25fc2l6ZSwgdmMtPmJsb2Nrc2l6ZVsxXSAvIDIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICByZXNfc2V0dXAtPmNsYXNzaWZpY2F0aW9ucyA9IGdldF9iaXRzKGdiLCA2KSArIDE7CisgICAgICAgIEdFVF9WQUxJREFURURfSU5ERVgocmVzX3NldHVwLT5jbGFzc2Jvb2ssIDgsIHZjLT5jb2RlYm9va19jb3VudCkKKworICAgICAgICByZXNfc2V0dXAtPnB0bnNfdG9fcmVhZCA9CisgICAgICAgICAgICAocmVzX3NldHVwLT5lbmQgLSByZXNfc2V0dXAtPmJlZ2luKSAvIHJlc19zZXR1cC0+cGFydGl0aW9uX3NpemU7CisgICAgICAgIHJlc19zZXR1cC0+Y2xhc3NpZnMgPSBhdl9tYWxsb2NfYXJyYXkocmVzX3NldHVwLT5wdG5zX3RvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmMtPmF1ZGlvX2NoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnJlc19zZXR1cC0+Y2xhc3NpZnMpKTsKKyAgICAgICAgaWYgKCFyZXNfc2V0dXAtPmNsYXNzaWZzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBhdl9kbG9nKE5VTEwsICIgICAgYmVnaW4gJWQgZW5kICVkIHBhcnQuc2l6ZSAlZCBjbGFzc2lmLnMgJWQgY2xhc3Nib29rICVkIFxuIiwKKyAgICAgICAgICAgICAgICByZXNfc2V0dXAtPmJlZ2luLCByZXNfc2V0dXAtPmVuZCwgcmVzX3NldHVwLT5wYXJ0aXRpb25fc2l6ZSwKKyAgICAgICAgICAgICAgICByZXNfc2V0dXAtPmNsYXNzaWZpY2F0aW9ucywgcmVzX3NldHVwLT5jbGFzc2Jvb2spOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCByZXNfc2V0dXAtPmNsYXNzaWZpY2F0aW9uczsgKytqKSB7CisgICAgICAgICAgICBoaWdoX2JpdHMgPSAwOworICAgICAgICAgICAgbG93X2JpdHMgID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpCisgICAgICAgICAgICAgICAgaGlnaF9iaXRzID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgICAgICAgICAgY2FzY2FkZVtqXSA9IChoaWdoX2JpdHMgPDwgMykgKyBsb3dfYml0czsKKworICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiICAgICAldSBjbGFzcyBjYXNjYWRlIGRlcHRoOiAlZFxuIiwgaiwgaWxvZyhjYXNjYWRlW2pdKSk7CisgICAgICAgIH0KKworICAgICAgICByZXNfc2V0dXAtPm1heHBhc3MgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmVzX3NldHVwLT5jbGFzc2lmaWNhdGlvbnM7ICsraikgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDg7ICsraykgeworICAgICAgICAgICAgICAgIGlmIChjYXNjYWRlW2pdJigxIDw8IGspKSB7CisgICAgICAgICAgICAgICAgICAgIEdFVF9WQUxJREFURURfSU5ERVgocmVzX3NldHVwLT5ib29rc1tqXVtrXSwgOCwgdmMtPmNvZGVib29rX2NvdW50KQorCisgICAgICAgICAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgIiAgICAgJXUgY2xhc3MgY2FzY2FkZSBkZXB0aCAldSBib29rOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBrLCByZXNfc2V0dXAtPmJvb2tzW2pdW2tdKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaz5yZXNfc2V0dXAtPm1heHBhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICByZXNfc2V0dXAtPm1heHBhc3MgPSBrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc19zZXR1cC0+Ym9va3Nbal1ba10gPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFByb2Nlc3MgbWFwcGluZ3MgcGFydAorCitzdGF0aWMgaW50IHZvcmJpc19wYXJzZV9zZXR1cF9oZHJfbWFwcGluZ3Modm9yYmlzX2NvbnRleHQgKnZjKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnZjLT5nYjsKKyAgICB1bnNpZ25lZCBpLCBqOworCisgICAgdmMtPm1hcHBpbmdfY291bnQgPSBnZXRfYml0cyhnYiwgNikrMTsKKyAgICB2Yy0+bWFwcGluZ3MgICAgICA9IGF2X21hbGxvY3oodmMtPm1hcHBpbmdfY291bnQgKiBzaXplb2YoKnZjLT5tYXBwaW5ncykpOworICAgIGlmICghdmMtPm1hcHBpbmdzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZfZGxvZyhOVUxMLCAiIFRoZXJlIGFyZSAlZCBtYXBwaW5ncy4gXG4iLCB2Yy0+bWFwcGluZ19jb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmMtPm1hcHBpbmdfY291bnQ7ICsraSkgeworICAgICAgICB2b3JiaXNfbWFwcGluZyAqbWFwcGluZ19zZXR1cCA9ICZ2Yy0+bWFwcGluZ3NbaV07CisKKyAgICAgICAgaWYgKGdldF9iaXRzKGdiLCAxNikpIHsKKyAgICAgICAgICAgIGF2X2xvZyh2Yy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk90aGVyIG1hcHBpbmdzIHRoYW4gdHlwZSAwIGFyZSBub3QgY29tcGxpYW50IHdpdGggdGhlIFZvcmJpcyBJIHNwZWNpZmljYXRpb24uIFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgbWFwcGluZ19zZXR1cC0+c3VibWFwcyA9IGdldF9iaXRzKGdiLCA0KSArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXBwaW5nX3NldHVwLT5zdWJtYXBzID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBtYXBwaW5nX3NldHVwLT5jb3VwbGluZ19zdGVwcyA9IGdldF9iaXRzKGdiLCA4KSArIDE7CisgICAgICAgICAgICBtYXBwaW5nX3NldHVwLT5tYWduaXR1ZGUgICAgICA9IGF2X21hbGxvY3oobWFwcGluZ19zZXR1cC0+Y291cGxpbmdfc3RlcHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqbWFwcGluZ19zZXR1cC0+bWFnbml0dWRlKSk7CisgICAgICAgICAgICBtYXBwaW5nX3NldHVwLT5hbmdsZSAgICAgICAgICA9IGF2X21hbGxvY3oobWFwcGluZ19zZXR1cC0+Y291cGxpbmdfc3RlcHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqbWFwcGluZ19zZXR1cC0+YW5nbGUpKTsKKyAgICAgICAgICAgIGlmICghbWFwcGluZ19zZXR1cC0+YW5nbGUgfHwgIW1hcHBpbmdfc2V0dXAtPm1hZ25pdHVkZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWFwcGluZ19zZXR1cC0+Y291cGxpbmdfc3RlcHM7ICsraikgeworICAgICAgICAgICAgICAgIEdFVF9WQUxJREFURURfSU5ERVgobWFwcGluZ19zZXR1cC0+bWFnbml0dWRlW2pdLCBpbG9nKHZjLT5hdWRpb19jaGFubmVscyAtIDEpLCB2Yy0+YXVkaW9fY2hhbm5lbHMpCisgICAgICAgICAgICAgICAgR0VUX1ZBTElEQVRFRF9JTkRFWChtYXBwaW5nX3NldHVwLT5hbmdsZVtqXSwgICAgIGlsb2codmMtPmF1ZGlvX2NoYW5uZWxzIC0gMSksIHZjLT5hdWRpb19jaGFubmVscykKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hcHBpbmdfc2V0dXAtPmNvdXBsaW5nX3N0ZXBzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Rsb2coTlVMTCwgIiAgICV1IG1hcHBpbmcgY291cGxpbmcgc3RlcHM6ICVkXG4iLAorICAgICAgICAgICAgICAgIGksIG1hcHBpbmdfc2V0dXAtPmNvdXBsaW5nX3N0ZXBzKTsKKworICAgICAgICBpZiAoZ2V0X2JpdHMoZ2IsIDIpKSB7CisgICAgICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIldS4gbWFwcGluZyBzZXR1cCBkYXRhIGludmFsaWQuXG4iLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAvLyBmb2xsb3dpbmcgc3BlYy4KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYXBwaW5nX3NldHVwLT5zdWJtYXBzPjEpIHsKKyAgICAgICAgICAgIG1hcHBpbmdfc2V0dXAtPm11eCA9IGF2X21hbGxvY3pfYXJyYXkodmMtPmF1ZGlvX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKm1hcHBpbmdfc2V0dXAtPm11eCkpOworICAgICAgICAgICAgaWYgKCFtYXBwaW5nX3NldHVwLT5tdXgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHZjLT5hdWRpb19jaGFubmVsczsgKytqKQorICAgICAgICAgICAgICAgIG1hcHBpbmdfc2V0dXAtPm11eFtqXSA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBtYXBwaW5nX3NldHVwLT5zdWJtYXBzOyArK2opIHsKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgOCk7IC8vIEZJWE1FIGNoZWNrPworICAgICAgICAgICAgR0VUX1ZBTElEQVRFRF9JTkRFWChtYXBwaW5nX3NldHVwLT5zdWJtYXBfZmxvb3Jbal0sICAgOCwgdmMtPmZsb29yX2NvdW50KQorICAgICAgICAgICAgR0VUX1ZBTElEQVRFRF9JTkRFWChtYXBwaW5nX3NldHVwLT5zdWJtYXBfcmVzaWR1ZVtqXSwgOCwgdmMtPnJlc2lkdWVfY291bnQpCisKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgIiAgICV1IG1hcHBpbmcgJXUgc3VibWFwIDogZmxvb3IgJWQsIHJlc2lkdWUgJWRcbiIsIGksIGosCisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdfc2V0dXAtPnN1Ym1hcF9mbG9vcltqXSwKKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZ19zZXR1cC0+c3VibWFwX3Jlc2lkdWVbal0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvLyBQcm9jZXNzIG1vZGVzIHBhcnQKKworc3RhdGljIGludCBjcmVhdGVfbWFwKHZvcmJpc19jb250ZXh0ICp2YywgdW5zaWduZWQgZmxvb3JfbnVtYmVyKQoreworICAgIHZvcmJpc19mbG9vciAqZmxvb3JzID0gdmMtPmZsb29yczsKKyAgICB2b3JiaXNfZmxvb3IwICp2ZjsKKyAgICBpbnQgaWR4OworICAgIGludCBibG9ja2ZsYWcsIG47CisgICAgaW50MzJfdCAqbWFwOworCisgICAgZm9yIChibG9ja2ZsYWcgPSAwOyBibG9ja2ZsYWcgPCAyOyArK2Jsb2NrZmxhZykgeworICAgICAgICBuID0gdmMtPmJsb2Nrc2l6ZVtibG9ja2ZsYWddIC8gMjsKKyAgICAgICAgZmxvb3JzW2Zsb29yX251bWJlcl0uZGF0YS50MC5tYXBbYmxvY2tmbGFnXSA9CisgICAgICAgICAgICBhdl9tYWxsb2NfYXJyYXkobiArIDEsIHNpemVvZihpbnQzMl90KSk7IC8vIG4gKyBzZW50aW5lbAorICAgICAgICBpZiAoIWZsb29yc1tmbG9vcl9udW1iZXJdLmRhdGEudDAubWFwW2Jsb2NrZmxhZ10pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIG1hcCA9ICBmbG9vcnNbZmxvb3JfbnVtYmVyXS5kYXRhLnQwLm1hcFtibG9ja2ZsYWddOworICAgICAgICB2ZiAgPSAmZmxvb3JzW2Zsb29yX251bWJlcl0uZGF0YS50MDsKKworICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG47ICsraWR4KSB7CisgICAgICAgICAgICBtYXBbaWR4XSA9IGZsb29yKEJBUksoKHZmLT5yYXRlICogaWR4KSAvICgyLjBmICogbikpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZmLT5iYXJrX21hcF9zaXplIC8gQkFSSyh2Zi0+cmF0ZSAvIDIuMGYpKSk7CisgICAgICAgICAgICBpZiAodmYtPmJhcmtfbWFwX3NpemUtMSA8IG1hcFtpZHhdKQorICAgICAgICAgICAgICAgIG1hcFtpZHhdID0gdmYtPmJhcmtfbWFwX3NpemUgLSAxOworICAgICAgICB9CisgICAgICAgIG1hcFtuXSA9IC0xOworICAgICAgICB2Zi0+bWFwX3NpemVbYmxvY2tmbGFnXSA9IG47CisgICAgfQorCisgICAgZm9yIChpZHggPSAwOyBpZHggPD0gbjsgKytpZHgpIHsKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiZmxvb3IwIG1hcDogbWFwIGF0IHBvcyAlZCBpcyAlZFxuIiwgaWR4LCBtYXBbaWR4XSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm9yYmlzX3BhcnNlX3NldHVwX2hkcl9tb2Rlcyh2b3JiaXNfY29udGV4dCAqdmMpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmdmMtPmdiOworICAgIHVuc2lnbmVkIGk7CisKKyAgICB2Yy0+bW9kZV9jb3VudCA9IGdldF9iaXRzKGdiLCA2KSArIDE7CisgICAgdmMtPm1vZGVzICAgICAgPSBhdl9tYWxsb2N6KHZjLT5tb2RlX2NvdW50ICogc2l6ZW9mKCp2Yy0+bW9kZXMpKTsKKyAgICBpZiAoIXZjLT5tb2RlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2X2Rsb2coTlVMTCwgIiBUaGVyZSBhcmUgJWQgbW9kZXMuXG4iLCB2Yy0+bW9kZV9jb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmMtPm1vZGVfY291bnQ7ICsraSkgeworICAgICAgICB2b3JiaXNfbW9kZSAqbW9kZV9zZXR1cCA9ICZ2Yy0+bW9kZXNbaV07CisKKyAgICAgICAgbW9kZV9zZXR1cC0+YmxvY2tmbGFnICAgICA9IGdldF9iaXRzMShnYik7CisgICAgICAgIG1vZGVfc2V0dXAtPndpbmRvd3R5cGUgICAgPSBnZXRfYml0cyhnYiwgMTYpOyAvL0ZJWE1FIGNoZWNrCisgICAgICAgIG1vZGVfc2V0dXAtPnRyYW5zZm9ybXR5cGUgPSBnZXRfYml0cyhnYiwgMTYpOyAvL0ZJWE1FIGNoZWNrCisgICAgICAgIEdFVF9WQUxJREFURURfSU5ERVgobW9kZV9zZXR1cC0+bWFwcGluZywgOCwgdmMtPm1hcHBpbmdfY291bnQpOworCisgICAgICAgIGF2X2Rsb2coTlVMTCwgIiAldSBtb2RlOiBibG9ja2ZsYWcgJWQsIHdpbmRvd3R5cGUgJWQsIHRyYW5zZm9ybXR5cGUgJWQsIG1hcHBpbmcgJWRcbiIsCisgICAgICAgICAgICAgICAgaSwgbW9kZV9zZXR1cC0+YmxvY2tmbGFnLCBtb2RlX3NldHVwLT53aW5kb3d0eXBlLAorICAgICAgICAgICAgICAgIG1vZGVfc2V0dXAtPnRyYW5zZm9ybXR5cGUsIG1vZGVfc2V0dXAtPm1hcHBpbmcpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy8gUHJvY2VzcyB0aGUgd2hvbGUgc2V0dXAgaGVhZGVyIHVzaW5nIHRoZSBmdW5jdGlvbnMgYWJvdmUKKworc3RhdGljIGludCB2b3JiaXNfcGFyc2Vfc2V0dXBfaGRyKHZvcmJpc19jb250ZXh0ICp2YykKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZ2Yy0+Z2I7CisgICAgaW50IHJldDsKKworICAgIGlmICgoZ2V0X2JpdHMoZ2IsIDgpICE9ICd2JykgfHwgKGdldF9iaXRzKGdiLCA4KSAhPSAnbycpIHx8CisgICAgICAgIChnZXRfYml0cyhnYiwgOCkgIT0gJ3InKSB8fCAoZ2V0X2JpdHMoZ2IsIDgpICE9ICdiJykgfHwKKyAgICAgICAgKGdldF9iaXRzKGdiLCA4KSAhPSAnaScpIHx8IChnZXRfYml0cyhnYiwgOCkgIT0gJ3MnKSkgeworICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgVm9yYmlzIHNldHVwIGhlYWRlciBwYWNrZXQgY29ycnVwdCAobm8gdm9yYmlzIHNpZ25hdHVyZSkuIFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gdm9yYmlzX3BhcnNlX3NldHVwX2hkcl9jb2RlYm9va3ModmMpKSkgeworICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgVm9yYmlzIHNldHVwIGhlYWRlciBwYWNrZXQgY29ycnVwdCAoY29kZWJvb2tzKS4gXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKChyZXQgPSB2b3JiaXNfcGFyc2Vfc2V0dXBfaGRyX3RkdHJhbnNmb3Jtcyh2YykpKSB7CisgICAgICAgIGF2X2xvZyh2Yy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIiBWb3JiaXMgc2V0dXAgaGVhZGVyIHBhY2tldCBjb3JydXB0ICh0aW1lIGRvbWFpbiB0cmFuc2Zvcm1zKS4gXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKChyZXQgPSB2b3JiaXNfcGFyc2Vfc2V0dXBfaGRyX2Zsb29ycyh2YykpKSB7CisgICAgICAgIGF2X2xvZyh2Yy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIiBWb3JiaXMgc2V0dXAgaGVhZGVyIHBhY2tldCBjb3JydXB0IChmbG9vcnMpLiBcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoKHJldCA9IHZvcmJpc19wYXJzZV9zZXR1cF9oZHJfcmVzaWR1ZXModmMpKSkgeworICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgVm9yYmlzIHNldHVwIGhlYWRlciBwYWNrZXQgY29ycnVwdCAocmVzaWR1ZXMpLiBcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoKHJldCA9IHZvcmJpc19wYXJzZV9zZXR1cF9oZHJfbWFwcGluZ3ModmMpKSkgeworICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgVm9yYmlzIHNldHVwIGhlYWRlciBwYWNrZXQgY29ycnVwdCAobWFwcGluZ3MpLiBcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoKHJldCA9IHZvcmJpc19wYXJzZV9zZXR1cF9oZHJfbW9kZXModmMpKSkgeworICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgVm9yYmlzIHNldHVwIGhlYWRlciBwYWNrZXQgY29ycnVwdCAobW9kZXMpLiBcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoIWdldF9iaXRzMShnYikpIHsKKyAgICAgICAgYXZfbG9nKHZjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiIFZvcmJpcyBzZXR1cCBoZWFkZXIgcGFja2V0IGNvcnJ1cHQgKGZyYW1pbmcgZmxhZykuIFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAvLyBmcmFtaW5nIGZsYWcgYml0IHVuc2V0IGVycm9yCisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFByb2Nlc3MgdGhlIGlkZW50aWZpY2F0aW9uIGhlYWRlcgorCitzdGF0aWMgaW50IHZvcmJpc19wYXJzZV9pZF9oZHIodm9yYmlzX2NvbnRleHQgKnZjKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnZjLT5nYjsKKyAgICB1bnNpZ25lZCBibDAsIGJsMTsKKworICAgIGlmICgoZ2V0X2JpdHMoZ2IsIDgpICE9ICd2JykgfHwgKGdldF9iaXRzKGdiLCA4KSAhPSAnbycpIHx8CisgICAgICAgIChnZXRfYml0cyhnYiwgOCkgIT0gJ3InKSB8fCAoZ2V0X2JpdHMoZ2IsIDgpICE9ICdiJykgfHwKKyAgICAgICAgKGdldF9iaXRzKGdiLCA4KSAhPSAnaScpIHx8IChnZXRfYml0cyhnYiwgOCkgIT0gJ3MnKSkgeworICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgVm9yYmlzIGlkIGhlYWRlciBwYWNrZXQgY29ycnVwdCAobm8gdm9yYmlzIHNpZ25hdHVyZSkuIFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHZjLT52ZXJzaW9uICAgICAgICA9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsgICAgLy9GSVhNRSBjaGVjayAwCisgICAgdmMtPmF1ZGlvX2NoYW5uZWxzID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgIGlmICh2Yy0+YXVkaW9fY2hhbm5lbHMgPD0gMCkgeworICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVsc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICB2Yy0+YXVkaW9fc2FtcGxlcmF0ZSA9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKKyAgICBpZiAodmMtPmF1ZGlvX3NhbXBsZXJhdGUgPD0gMCkgeworICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZXJhdGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgdmMtPmJpdHJhdGVfbWF4aW11bSA9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKKyAgICB2Yy0+Yml0cmF0ZV9ub21pbmFsID0gZ2V0X2JpdHNfbG9uZyhnYiwgMzIpOworICAgIHZjLT5iaXRyYXRlX21pbmltdW0gPSBnZXRfYml0c19sb25nKGdiLCAzMik7CisgICAgYmwwID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgIGJsMSA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICBpZiAoYmwwID4gMTMgfHwgYmwwIDwgNiB8fCBibDEgPiAxMyB8fCBibDEgPCA2IHx8IGJsMSA8IGJsMCkgeworICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgVm9yYmlzIGlkIGhlYWRlciBwYWNrZXQgY29ycnVwdCAoaWxsZWdhbCBibG9ja3NpemUpLiBcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgdmMtPmJsb2Nrc2l6ZVswXSA9ICgxIDw8IGJsMCk7CisgICAgdmMtPmJsb2Nrc2l6ZVsxXSA9ICgxIDw8IGJsMSk7CisgICAgdmMtPndpblswXSA9IGZmX3ZvcmJpc192d2luW2JsMCAtIDZdOworICAgIHZjLT53aW5bMV0gPSBmZl92b3JiaXNfdndpbltibDEgLSA2XTsKKworICAgIGlmICgoZ2V0X2JpdHMxKGdiKSkgPT0gMCkgeworICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgVm9yYmlzIGlkIGhlYWRlciBwYWNrZXQgY29ycnVwdCAoZnJhbWluZyBmbGFnIG5vdCBzZXQpLiBcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB2Yy0+Y2hhbm5lbF9yZXNpZHVlcyA9ICBhdl9tYWxsb2NfYXJyYXkodmMtPmJsb2Nrc2l6ZVsxXSAgLyAyLCB2Yy0+YXVkaW9fY2hhbm5lbHMgKiBzaXplb2YoKnZjLT5jaGFubmVsX3Jlc2lkdWVzKSk7CisgICAgdmMtPnNhdmVkICAgICAgICAgICAgPSAgYXZfbWFsbG9jel9hcnJheSh2Yy0+YmxvY2tzaXplWzFdIC8gNCwgdmMtPmF1ZGlvX2NoYW5uZWxzICogc2l6ZW9mKCp2Yy0+c2F2ZWQpKTsKKyAgICBpZiAoIXZjLT5jaGFubmVsX3Jlc2lkdWVzIHx8ICF2Yy0+c2F2ZWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB2Yy0+cHJldmlvdXNfd2luZG93ICA9IC0xOworCisgICAgZmZfbWRjdF9pbml0KCZ2Yy0+bWRjdFswXSwgYmwwLCAxLCAtMS4wKTsKKyAgICBmZl9tZGN0X2luaXQoJnZjLT5tZGN0WzFdLCBibDEsIDEsIC0xLjApOworICAgIHZjLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyh2Yy0+YXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCk7CisgICAgaWYgKCF2Yy0+ZmRzcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2X2Rsb2coTlVMTCwgIiB2b3JiaXMgdmVyc2lvbiAlZCBcbiBhdWRpb19jaGFubmVscyAlZCBcbiBhdWRpb19zYW1wbGVyYXRlICVkIFxuIGJpdHJhdGVfbWF4ICVkIFxuIGJpdHJhdGVfbm9tICVkIFxuIGJpdHJhdGVfbWluICVkIFxuIGJsa18wICVkIGJsa18xICVkIFxuICIsCisgICAgICAgICAgICB2Yy0+dmVyc2lvbiwgdmMtPmF1ZGlvX2NoYW5uZWxzLCB2Yy0+YXVkaW9fc2FtcGxlcmF0ZSwgdmMtPmJpdHJhdGVfbWF4aW11bSwgdmMtPmJpdHJhdGVfbm9taW5hbCwgdmMtPmJpdHJhdGVfbWluaW11bSwgdmMtPmJsb2Nrc2l6ZVswXSwgdmMtPmJsb2Nrc2l6ZVsxXSk7CisKKy8qCisgICAgQkxLID0gdmMtPmJsb2Nrc2l6ZVswXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkxLIC8gMjsgKytpKSB7CisgICAgICAgIHZjLT53aW5bMF1baV0gPSBzaW4oMC41KjMuMTQxNTkyNjUzNTgqKHNpbigoKGZsb2F0KWkgKyAwLjUpIC8gKGZsb2F0KUJMSyozLjE0MTU5MjY1MzU4KSkqKHNpbigoKGZsb2F0KWkgKyAwLjUpIC8gKGZsb2F0KUJMSyozLjE0MTU5MjY1MzU4KSkpOworICAgIH0KKyovCisKKyAgICByZXR1cm4gMDsKK30KKworLy8gUHJvY2VzcyB0aGUgZXh0cmFkYXRhIHVzaW5nIHRoZSBmdW5jdGlvbnMgYWJvdmUgKGlkZW50aWZpY2F0aW9uIGhlYWRlciwgc2V0dXAgaGVhZGVyKQorCitzdGF0aWMgYXZfY29sZCBpbnQgdm9yYmlzX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICB2b3JiaXNfY29udGV4dCAqdmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKmhlYWRlcnMgICA9IGF2Y3R4LT5leHRyYWRhdGE7CisgICAgaW50IGhlYWRlcnNfbGVuICAgID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplOworICAgIHVpbnQ4X3QgKmhlYWRlcl9zdGFydFszXTsKKyAgICBpbnQgaGVhZGVyX2xlblszXTsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZ2Yy0+Z2I7CisgICAgaW50IGhkcl90eXBlLCByZXQ7CisKKyAgICB2Yy0+YXZjdHggPSBhdmN0eDsKKyAgICBmZl92b3JiaXNkc3BfaW5pdCgmdmMtPmRzcCk7CisgICAgZmZfZm10X2NvbnZlcnRfaW5pdCgmdmMtPmZtdF9jb252LCBhdmN0eCk7CisKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfRkxUUDsKKworICAgIGlmICghaGVhZGVyc19sZW4pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFeHRyYWRhdGEgbWlzc2luZy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2cHJpdl9zcGxpdF94aXBoX2hlYWRlcnMoaGVhZGVycywgaGVhZGVyc19sZW4sIDMwLCBoZWFkZXJfc3RhcnQsIGhlYWRlcl9sZW4pKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFeHRyYWRhdGEgY29ycnVwdC5cbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGluaXRfZ2V0X2JpdHMoZ2IsIGhlYWRlcl9zdGFydFswXSwgaGVhZGVyX2xlblswXSo4KTsKKyAgICBoZHJfdHlwZSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICBpZiAoaGRyX3R5cGUgIT0gMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZpcnN0IGhlYWRlciBpcyBub3QgdGhlIGlkIGhlYWRlci5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKChyZXQgPSB2b3JiaXNfcGFyc2VfaWRfaGRyKHZjKSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJZCBoZWFkZXIgY29ycnVwdC5cbiIpOworICAgICAgICB2b3JiaXNfZnJlZSh2Yyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaW5pdF9nZXRfYml0cyhnYiwgaGVhZGVyX3N0YXJ0WzJdLCBoZWFkZXJfbGVuWzJdKjgpOworICAgIGhkcl90eXBlID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgIGlmIChoZHJfdHlwZSAhPSA1KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGhpcmQgaGVhZGVyIGlzIG5vdCB0aGUgc2V0dXAgaGVhZGVyLlxuIik7CisgICAgICAgIHZvcmJpc19mcmVlKHZjKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICgocmV0ID0gdm9yYmlzX3BhcnNlX3NldHVwX2hkcih2YykpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2V0dXAgaGVhZGVyIGNvcnJ1cHQuXG4iKTsKKyAgICAgICAgdm9yYmlzX2ZyZWUodmMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICh2Yy0+YXVkaW9fY2hhbm5lbHMgPiA4KQorICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSAwOworICAgIGVsc2UKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gZmZfdm9yYmlzX2NoYW5uZWxfbGF5b3V0c1t2Yy0+YXVkaW9fY2hhbm5lbHMgLSAxXTsKKworICAgIGF2Y3R4LT5jaGFubmVscyAgICA9IHZjLT5hdWRpb19jaGFubmVsczsKKyAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSB2Yy0+YXVkaW9fc2FtcGxlcmF0ZTsKKworICAgIHJldHVybiAwOworfQorCisvLyBEZWNvZGUgYXVkaW9wYWNrZXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmVhZCBhbmQgZGVjb2RlIGZsb29yCisKK3N0YXRpYyBpbnQgdm9yYmlzX2Zsb29yMF9kZWNvZGUodm9yYmlzX2NvbnRleHQgKnZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfZmxvb3JfZGF0YSAqdmZ1LCBmbG9hdCAqdmVjKQoreworICAgIHZvcmJpc19mbG9vcjAgKnZmID0gJnZmdS0+dDA7CisgICAgZmxvYXQgKmxzcCA9IHZmLT5sc3A7CisgICAgdW5zaWduZWQgYW1wbGl0dWRlLCBib29rX2lkeDsKKyAgICB1bnNpZ25lZCBibG9ja2ZsYWcgPSB2Yy0+bW9kZXNbdmMtPm1vZGVfbnVtYmVyXS5ibG9ja2ZsYWc7CisKKyAgICBpZiAoIXZmLT5hbXBsaXR1ZGVfYml0cykKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBhbXBsaXR1ZGUgPSBnZXRfYml0cygmdmMtPmdiLCB2Zi0+YW1wbGl0dWRlX2JpdHMpOworICAgIGlmIChhbXBsaXR1ZGUgPiAwKSB7CisgICAgICAgIGZsb2F0IGxhc3QgPSAwOworICAgICAgICB1bnNpZ25lZCBpZHgsIGxzcF9sZW4gPSAwOworICAgICAgICB2b3JiaXNfY29kZWJvb2sgY29kZWJvb2s7CisKKyAgICAgICAgYm9va19pZHggPSBnZXRfYml0cygmdmMtPmdiLCBpbG9nKHZmLT5udW1fYm9va3MpKTsKKyAgICAgICAgaWYgKGJvb2tfaWR4ID49IHZmLT5udW1fYm9va3MpIHsKKyAgICAgICAgICAgIGF2X2xvZyh2Yy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImZsb29yMCBkZWM6IGJvb2tudW1iZXIgdG9vIGhpZ2ghXG4iKTsKKyAgICAgICAgICAgIGJvb2tfaWR4ID0gIDA7CisgICAgICAgIH0KKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiZmxvb3IwIGRlYzogYm9va251bWJlcjogJXVcbiIsIGJvb2tfaWR4KTsKKyAgICAgICAgY29kZWJvb2sgPSB2Yy0+Y29kZWJvb2tzW3ZmLT5ib29rX2xpc3RbYm9va19pZHhdXTsKKyAgICAgICAgLyogSW52YWxpZCBjb2RlYm9vayEgKi8KKyAgICAgICAgaWYgKCFjb2RlYm9vay5jb2RldmVjdG9ycykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHdoaWxlIChsc3BfbGVuPHZmLT5vcmRlcikgeworICAgICAgICAgICAgaW50IHZlY19vZmY7CisKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgImZsb29yMCBkZWM6IGJvb2sgZGltZW5zaW9uOiAlZFxuIiwgY29kZWJvb2suZGltZW5zaW9ucyk7CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJmbG9vcjAgZGVjOiBtYXhpbXVtIGRlcHRoOiAlZFxuIiwgY29kZWJvb2subWF4ZGVwdGgpOworICAgICAgICAgICAgLyogcmVhZCB0ZW1wIHZlY3RvciAqLworICAgICAgICAgICAgdmVjX29mZiA9IGdldF92bGMyKCZ2Yy0+Z2IsIGNvZGVib29rLnZsYy50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYm9vay5uYl9iaXRzLCBjb2RlYm9vay5tYXhkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgICAqIGNvZGVib29rLmRpbWVuc2lvbnM7CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJmbG9vcjAgZGVjOiB2ZWN0b3Igb2Zmc2V0OiAlZFxuIiwgdmVjX29mZik7CisgICAgICAgICAgICAvKiBjb3B5IGVhY2ggdmVjdG9yIGNvbXBvbmVudCBhbmQgYWRkIGxhc3QgdG8gaXQgKi8KKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY29kZWJvb2suZGltZW5zaW9uczsgKytpZHgpCisgICAgICAgICAgICAgICAgbHNwW2xzcF9sZW4raWR4XSA9IGNvZGVib29rLmNvZGV2ZWN0b3JzW3ZlY19vZmYraWR4XSArIGxhc3Q7CisgICAgICAgICAgICBsYXN0ID0gbHNwW2xzcF9sZW4raWR4LTFdOyAvKiBzZXQgbGFzdCB0byBsYXN0IHZlY3RvciBjb21wb25lbnQgKi8KKworICAgICAgICAgICAgbHNwX2xlbiArPSBjb2RlYm9vay5kaW1lbnNpb25zOworICAgICAgICB9CisgICAgICAgIC8qIERFQlVHOiBvdXRwdXQgbHNwIGNvZWZmcyAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaWR4OworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBsc3BfbGVuOyArK2lkeCkKKyAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJmbG9vcjAgZGVjOiBjb2VmZiBhdCAlZCBpcyAlZlxuIiwgaWR4LCBsc3BbaWR4XSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBzeW50aGVzaXplIGZsb29yIG91dHB1dCB2ZWN0b3IgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpbnQgb3JkZXIgPSB2Zi0+b3JkZXI7CisgICAgICAgICAgICBmbG9hdCB3c3RlcCA9IE1fUEkgLyB2Zi0+YmFya19tYXBfc2l6ZTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspCisgICAgICAgICAgICAgICAgbHNwW2ldID0gMi4wZiAqIGNvcyhsc3BbaV0pOworCisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJmbG9vcjAgc3ludGg6IG1hcF9zaXplID0gJSJQUkl1MzIiOyBtID0gJWQ7IHdzdGVwID0gJWZcbiIsCisgICAgICAgICAgICAgICAgICAgIHZmLT5tYXBfc2l6ZVtibG9ja2ZsYWddLCBvcmRlciwgd3N0ZXApOworCisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChpIDwgdmYtPm1hcF9zaXplW2Jsb2NrZmxhZ10pIHsKKyAgICAgICAgICAgICAgICBpbnQgaiwgaXRlcl9jb25kID0gdmYtPm1hcFtibG9ja2ZsYWddW2ldOworICAgICAgICAgICAgICAgIGZsb2F0IHAgPSAwLjVmOworICAgICAgICAgICAgICAgIGZsb2F0IHEgPSAwLjVmOworICAgICAgICAgICAgICAgIGZsb2F0IHR3b19jb3NfdyA9IDIuMGYgKiBjb3Mod3N0ZXAgKiBpdGVyX2NvbmQpOyAvLyBuZWVkZWQgYWxsIHRpbWVzCisKKyAgICAgICAgICAgICAgICAvKiBzaW1pbGFyIHBhcnQgZm9yIHRoZSBxIGFuZCBwIHByb2R1Y3RzICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiArIDEgPCBvcmRlcjsgaiArPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHEgKj0gbHNwW2pdICAgICAtIHR3b19jb3NfdzsKKyAgICAgICAgICAgICAgICAgICAgcCAqPSBsc3BbaiArIDFdIC0gdHdvX2Nvc193OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBvcmRlcikgeyAvLyBldmVuIG9yZGVyCisgICAgICAgICAgICAgICAgICAgIHAgKj0gcCAqICgyLjBmIC0gdHdvX2Nvc193KTsKKyAgICAgICAgICAgICAgICAgICAgcSAqPSBxICogKDIuMGYgKyB0d29fY29zX3cpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG9kZCBvcmRlcgorICAgICAgICAgICAgICAgICAgICBxICo9IHR3b19jb3Nfdy1sc3Bbal07IC8vIG9uZSBtb3JlIHRpbWUgZm9yIHEKKworICAgICAgICAgICAgICAgICAgICAvKiBmaW5hbCBzdGVwIGFuZCBzcXVhcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgcCAqPSBwICogKDQuZiAtIHR3b19jb3NfdyAqIHR3b19jb3Nfdyk7CisgICAgICAgICAgICAgICAgICAgIHEgKj0gcTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgbGluZWFyIGZsb29yIHZhbHVlICovCisgICAgICAgICAgICAgICAgcSA9IGV4cCgoKChhbXBsaXR1ZGUqdmYtPmFtcGxpdHVkZV9vZmZzZXQpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoMSA8PCB2Zi0+YW1wbGl0dWRlX2JpdHMpIC0gMSkgKiBzcXJ0KHAgKyBxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLSB2Zi0+YW1wbGl0dWRlX29mZnNldCkgKiAuMTE1MTI5MjVmKTsKKworICAgICAgICAgICAgICAgIC8qIGZpbGwgdmVjdG9yICovCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB2ZWNbaV0gPSBxOyArK2k7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAodmYtPm1hcFtibG9ja2ZsYWddW2ldID09IGl0ZXJfY29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiB0aGlzIGNoYW5uZWwgaXMgdW51c2VkICovCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGF2X2Rsb2coTlVMTCwgIiBGbG9vcjAgZGVjb2RlZFxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2b3JiaXNfZmxvb3IxX2RlY29kZSh2b3JiaXNfY29udGV4dCAqdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc19mbG9vcl9kYXRhICp2ZnUsIGZsb2F0ICp2ZWMpCit7CisgICAgdm9yYmlzX2Zsb29yMSAqdmYgPSAmdmZ1LT50MTsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZ2Yy0+Z2I7CisgICAgdWludDE2X3QgcmFuZ2Vfdls0XSA9IHsgMjU2LCAxMjgsIDg2LCA2NCB9OworICAgIHVuc2lnbmVkIHJhbmdlID0gcmFuZ2Vfdlt2Zi0+bXVsdGlwbGllciAtIDFdOworICAgIHVpbnQxNl90IGZsb29yMV9ZWzI1OF07CisgICAgdWludDE2X3QgZmxvb3IxX1lfZmluYWxbMjU4XTsKKyAgICBpbnQgZmxvb3IxX2ZsYWdbMjU4XTsKKyAgICB1bnNpZ25lZCBwYXJ0aXRpb25fY2xhc3MsIGNkaW0sIGNiaXRzLCBjc3ViLCBjdmFsLCBvZmZzZXQsIGksIGo7CisgICAgaW50IGJvb2ssIGFkeCwgYWR5LCBkeSwgb2ZmLCBwcmVkaWN0ZWQsIGVycjsKKworCisgICAgaWYgKCFnZXRfYml0czEoZ2IpKSAvLyBzaWxlbmNlCisgICAgICAgIHJldHVybiAxOworCisvLyBSZWFkIHZhbHVlcyAob3IgZGlmZmVyZW5jZXMpIGZvciB0aGUgZmxvb3IncyBwb2ludHMKKworICAgIGZsb29yMV9ZWzBdID0gZ2V0X2JpdHMoZ2IsIGlsb2cocmFuZ2UgLSAxKSk7CisgICAgZmxvb3IxX1lbMV0gPSBnZXRfYml0cyhnYiwgaWxvZyhyYW5nZSAtIDEpKTsKKworICAgIGF2X2Rsb2coTlVMTCwgImZsb29yIDAgWSAlZCBmbG9vciAxIFkgJWQgXG4iLCBmbG9vcjFfWVswXSwgZmxvb3IxX1lbMV0pOworCisgICAgb2Zmc2V0ID0gMjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmYtPnBhcnRpdGlvbnM7ICsraSkgeworICAgICAgICBwYXJ0aXRpb25fY2xhc3MgPSB2Zi0+cGFydGl0aW9uX2NsYXNzW2ldOworICAgICAgICBjZGltICAgPSB2Zi0+Y2xhc3NfZGltZW5zaW9uc1twYXJ0aXRpb25fY2xhc3NdOworICAgICAgICBjYml0cyAgPSB2Zi0+Y2xhc3Nfc3ViY2xhc3Nlc1twYXJ0aXRpb25fY2xhc3NdOworICAgICAgICBjc3ViID0gKDEgPDwgY2JpdHMpIC0gMTsKKyAgICAgICAgY3ZhbCA9IDA7CisKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiQ2JpdHMgJXVcbiIsIGNiaXRzKTsKKworICAgICAgICBpZiAoY2JpdHMpIC8vIHRoaXMgcmVhZHMgYWxsIHN1YmNsYXNzZXMgZm9yIHRoaXMgcGFydGl0aW9uJ3MgY2xhc3MKKyAgICAgICAgICAgIGN2YWwgPSBnZXRfdmxjMihnYiwgdmMtPmNvZGVib29rc1t2Zi0+Y2xhc3NfbWFzdGVyYm9va1twYXJ0aXRpb25fY2xhc3NdXS52bGMudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmMtPmNvZGVib29rc1t2Zi0+Y2xhc3NfbWFzdGVyYm9va1twYXJ0aXRpb25fY2xhc3NdXS5uYl9iaXRzLCAzKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2RpbTsgKytqKSB7CisgICAgICAgICAgICBib29rID0gdmYtPnN1YmNsYXNzX2Jvb2tzW3BhcnRpdGlvbl9jbGFzc11bY3ZhbCAmIGNzdWJdOworCisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJib29rICVkIENiaXRzICV1IGN2YWwgJXUgIGJpdHM6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGJvb2ssIGNiaXRzLCBjdmFsLCBnZXRfYml0c19jb3VudChnYikpOworCisgICAgICAgICAgICBjdmFsID0gY3ZhbCA+PiBjYml0czsKKyAgICAgICAgICAgIGlmIChib29rID4gLTEpIHsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IGdldF92bGMyKGdiLCB2Yy0+Y29kZWJvb2tzW2Jvb2tdLnZsYy50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjLT5jb2RlYm9va3NbYm9va10ubmJfYml0cywgMyk7CisgICAgICAgICAgICAgICAgaWYgKHYgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBmbG9vcjFfWVtvZmZzZXQral0gPSB2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbG9vcjFfWVtvZmZzZXQral0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIgZmxvb3IoJWQpID0gJWQgXG4iLAorICAgICAgICAgICAgICAgICAgICB2Zi0+bGlzdFtvZmZzZXQral0ueCwgZmxvb3IxX1lbb2Zmc2V0K2pdKTsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQrPWNkaW07CisgICAgfQorCisvLyBBbXBsaXR1ZGUgY2FsY3VsYXRpb24gZnJvbSB0aGUgZGlmZmVyZW5jZXMKKworICAgIGZsb29yMV9mbGFnWzBdID0gMTsKKyAgICBmbG9vcjFfZmxhZ1sxXSA9IDE7CisgICAgZmxvb3IxX1lfZmluYWxbMF0gPSBmbG9vcjFfWVswXTsKKyAgICBmbG9vcjFfWV9maW5hbFsxXSA9IGZsb29yMV9ZWzFdOworCisgICAgZm9yIChpID0gMjsgaSA8IHZmLT54X2xpc3RfZGltOyArK2kpIHsKKyAgICAgICAgdW5zaWduZWQgdmFsLCBoaWdocm9vbSwgbG93cm9vbSwgcm9vbSwgaGlnaF9uZWlnaF9vZmZzLCBsb3dfbmVpZ2hfb2ZmczsKKworICAgICAgICBsb3dfbmVpZ2hfb2ZmcyAgPSB2Zi0+bGlzdFtpXS5sb3c7CisgICAgICAgIGhpZ2hfbmVpZ2hfb2ZmcyA9IHZmLT5saXN0W2ldLmhpZ2g7CisgICAgICAgIGR5ICA9IGZsb29yMV9ZX2ZpbmFsW2hpZ2hfbmVpZ2hfb2Zmc10gLSBmbG9vcjFfWV9maW5hbFtsb3dfbmVpZ2hfb2Zmc107ICAvLyByZW5kZXJfcG9pbnQgYmVnaW4KKyAgICAgICAgYWR4ID0gdmYtPmxpc3RbaGlnaF9uZWlnaF9vZmZzXS54IC0gdmYtPmxpc3RbbG93X25laWdoX29mZnNdLng7CisgICAgICAgIGFkeSA9IEZGQUJTKGR5KTsKKyAgICAgICAgZXJyID0gYWR5ICogKHZmLT5saXN0W2ldLnggLSB2Zi0+bGlzdFtsb3dfbmVpZ2hfb2Zmc10ueCk7CisgICAgICAgIG9mZiA9IGVyciAvIGFkeDsKKyAgICAgICAgaWYgKGR5IDwgMCkgeworICAgICAgICAgICAgcHJlZGljdGVkID0gZmxvb3IxX1lfZmluYWxbbG93X25laWdoX29mZnNdIC0gb2ZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJlZGljdGVkID0gZmxvb3IxX1lfZmluYWxbbG93X25laWdoX29mZnNdICsgb2ZmOworICAgICAgICB9IC8vIHJlbmRlcl9wb2ludCBlbmQKKworICAgICAgICB2YWwgPSBmbG9vcjFfWVtpXTsKKyAgICAgICAgaGlnaHJvb20gPSByYW5nZS1wcmVkaWN0ZWQ7CisgICAgICAgIGxvd3Jvb20gID0gcHJlZGljdGVkOworICAgICAgICBpZiAoaGlnaHJvb20gPCBsb3dyb29tKSB7CisgICAgICAgICAgICByb29tID0gaGlnaHJvb20gKiAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcm9vbSA9IGxvd3Jvb20gKiAyOyAgIC8vIFNQRUMgbWlzc3BlbGxpbmcKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsKSB7CisgICAgICAgICAgICBmbG9vcjFfZmxhZ1tsb3dfbmVpZ2hfb2Zmc10gID0gMTsKKyAgICAgICAgICAgIGZsb29yMV9mbGFnW2hpZ2hfbmVpZ2hfb2Zmc10gPSAxOworICAgICAgICAgICAgZmxvb3IxX2ZsYWdbaV0gICAgICAgICAgICAgICA9IDE7CisgICAgICAgICAgICBpZiAodmFsID49IHJvb20pIHsKKyAgICAgICAgICAgICAgICBpZiAoaGlnaHJvb20gPiBsb3dyb29tKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb29yMV9ZX2ZpbmFsW2ldID0gYXZfY2xpcF91aW50MTYodmFsIC0gbG93cm9vbSArIHByZWRpY3RlZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvb3IxX1lfZmluYWxbaV0gPSBhdl9jbGlwX3VpbnQxNihwcmVkaWN0ZWQgLSB2YWwgKyBoaWdocm9vbSAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbCAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvb3IxX1lfZmluYWxbaV0gPSBhdl9jbGlwX3VpbnQxNihwcmVkaWN0ZWQgLSAodmFsICsgMSkgLyAyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmbG9vcjFfWV9maW5hbFtpXSA9IGF2X2NsaXBfdWludDE2KHByZWRpY3RlZCArIHZhbCAvIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsb29yMV9mbGFnW2ldICAgID0gMDsKKyAgICAgICAgICAgIGZsb29yMV9ZX2ZpbmFsW2ldID0gYXZfY2xpcF91aW50MTYocHJlZGljdGVkKTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Rsb2coTlVMTCwgIiBEZWNvZGVkIGZsb29yKCVkKSA9ICV1IC8gdmFsICV1XG4iLAorICAgICAgICAgICAgICAgIHZmLT5saXN0W2ldLngsIGZsb29yMV9ZX2ZpbmFsW2ldLCB2YWwpOworICAgIH0KKworLy8gQ3VydmUgc3ludGggLSBjb25uZWN0IHRoZSBjYWxjdWxhdGVkIGRvdHMgYW5kIGNvbnZlcnQgZnJvbSBkQiBzY2FsZSBGSVhNRSBvcHRpbWl6ZSA/CisKKyAgICBmZl92b3JiaXNfZmxvb3IxX3JlbmRlcl9saXN0KHZmLT5saXN0LCB2Zi0+eF9saXN0X2RpbSwgZmxvb3IxX1lfZmluYWwsIGZsb29yMV9mbGFnLCB2Zi0+bXVsdGlwbGllciwgdmVjLCB2Zi0+bGlzdFsxXS54KTsKKworICAgIGF2X2Rsb2coTlVMTCwgIiBGbG9vciBkZWNvZGVkXG4iKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgc2V0dXBfY2xhc3NpZnModm9yYmlzX2NvbnRleHQgKnZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc19yZXNpZHVlICp2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkb19ub3RfZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoX3VzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcnRpdGlvbl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHRuc190b19yZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgaW50IHAsIGosIGk7CisgICAgdW5zaWduZWQgY19wX2MgICAgICAgICA9IHZjLT5jb2RlYm9va3NbdnItPmNsYXNzYm9va10uZGltZW5zaW9uczsKKyAgICB1bnNpZ25lZCBpbnZlcnNlX2NsYXNzID0gZmZfaW52ZXJzZVt2ci0+Y2xhc3NpZmljYXRpb25zXTsKKyAgICB1bnNpZ25lZCB0ZW1wLCB0ZW1wMjsKKyAgICBmb3IgKHAgPSAwLCBqID0gMDsgaiA8IGNoX3VzZWQ7ICsraikgeworICAgICAgICBpZiAoIWRvX25vdF9kZWNvZGVbal0pIHsKKyAgICAgICAgICAgIHRlbXAgPSBnZXRfdmxjMigmdmMtPmdiLCB2Yy0+Y29kZWJvb2tzW3ZyLT5jbGFzc2Jvb2tdLnZsYy50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Yy0+Y29kZWJvb2tzW3ZyLT5jbGFzc2Jvb2tdLm5iX2JpdHMsIDMpOworCisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJDbGFzc3dvcmQ6ICV1XG4iLCB0ZW1wKTsKKworICAgICAgICAgICAgaWYgKChpbnQpdGVtcCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXA7CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDAodnItPmNsYXNzaWZpY2F0aW9ucyA+IDEpOyAvL25lZWRlZCBmb3IgaW52ZXJzZVtdCisKKyAgICAgICAgICAgIGlmICh0ZW1wIDw9IDY1NTM2KSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gcGFydGl0aW9uX2NvdW50ICsgY19wX2MgLSAxOyBpID49IHBhcnRpdGlvbl9jb3VudDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAyID0gKCgodWludDY0X3QpdGVtcCkgKiBpbnZlcnNlX2NsYXNzKSA+PiAzMjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHB0bnNfdG9fcmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZyLT5jbGFzc2lmc1twICsgaV0gPSB0ZW1wIC0gdGVtcDIgKiB2ci0+Y2xhc3NpZmljYXRpb25zOworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBwYXJ0aXRpb25fY291bnQgKyBjX3BfYyAtIDE7IGkgPj0gcGFydGl0aW9uX2NvdW50OyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSB0ZW1wIC8gdnItPmNsYXNzaWZpY2F0aW9uczsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHB0bnNfdG9fcmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZyLT5jbGFzc2lmc1twICsgaV0gPSB0ZW1wIC0gdGVtcDIgKiB2ci0+Y2xhc3NpZmljYXRpb25zOworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHAgKz0gcHRuc190b19yZWFkOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKy8vIFJlYWQgYW5kIGRlY29kZSByZXNpZHVlCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB2b3JiaXNfcmVzaWR1ZV9kZWNvZGVfaW50ZXJuYWwodm9yYmlzX2NvbnRleHQgKnZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfcmVzaWR1ZSAqdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkb19ub3RfZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB2bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnJfdHlwZSkKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZ2Yy0+Z2I7CisgICAgdW5zaWduZWQgY19wX2MgICAgICAgID0gdmMtPmNvZGVib29rc1t2ci0+Y2xhc3Nib29rXS5kaW1lbnNpb25zOworICAgIHVpbnQ4X3QgKmNsYXNzaWZzID0gdnItPmNsYXNzaWZzOworICAgIHVuc2lnbmVkIHBhc3MsIGNoX3VzZWQsIGksIGosIGssIGw7CisgICAgdW5zaWduZWQgbWF4X291dHB1dCA9IChjaCAtIDEpICogdmxlbjsKKyAgICBpbnQgcHRuc190b19yZWFkID0gdnItPnB0bnNfdG9fcmVhZDsKKyAgICBpbnQgbGlidm9yYmlzX2J1ZyA9IDA7CisKKyAgICBpZiAodnJfdHlwZSA9PSAyKSB7CisgICAgICAgIGZvciAoaiA9IDE7IGogPCBjaDsgKytqKQorICAgICAgICAgICAgZG9fbm90X2RlY29kZVswXSAmPSBkb19ub3RfZGVjb2RlW2pdOyAgLy8gRklYTUUgLSBjbG9iYmVyaW5nIGlucHV0CisgICAgICAgIGlmIChkb19ub3RfZGVjb2RlWzBdKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNoX3VzZWQgPSAxOworICAgICAgICBtYXhfb3V0cHV0ICs9IHZyLT5lbmQgLyBjaDsKKyAgICB9IGVsc2UgeworICAgICAgICBjaF91c2VkID0gY2g7CisgICAgICAgIG1heF9vdXRwdXQgKz0gdnItPmVuZDsKKyAgICB9CisKKyAgICBpZiAobWF4X291dHB1dCA+IGNoX2xlZnQgKiB2bGVuKSB7CisgICAgICAgIGlmIChtYXhfb3V0cHV0IDw9IGNoX2xlZnQgKiB2bGVuICsgdnItPnBhcnRpdGlvbl9zaXplKmNoX3VzZWQvY2gpIHsKKyAgICAgICAgICAgIHB0bnNfdG9fcmVhZC0tOworICAgICAgICAgICAgbGlidm9yYmlzX2J1ZyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnN1ZmZpY2llbnQgb3V0cHV0IGJ1ZmZlclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2Rsb2coTlVMTCwgIiByZXNpZHVlIHR5cGUgMC8xLzIgZGVjb2RlIGJlZ2luLCBjaDogJWQgIGNwYyAlZCAgXG4iLCBjaCwgY19wX2MpOworCisgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8PSB2ci0+bWF4cGFzczsgKytwYXNzKSB7IC8vIEZJWE1FIE9QVElNSVpFPworICAgICAgICBpbnQgdm9mZnNldCwgcGFydGl0aW9uX2NvdW50LCBqX3RpbWVzX3B0bnNfdG9fcmVhZDsKKworICAgICAgICB2b2Zmc2V0ID0gdnItPmJlZ2luOworICAgICAgICBmb3IgKHBhcnRpdGlvbl9jb3VudCA9IDA7IHBhcnRpdGlvbl9jb3VudCA8IHB0bnNfdG9fcmVhZDspIHsgIC8vIFNQRUMgICAgICAgIGVycm9yCisgICAgICAgICAgICBpZiAoIXBhc3MpIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gc2V0dXBfY2xhc3NpZnModmMsIHZyLCBkb19ub3RfZGVjb2RlLCBjaF91c2VkLCBwYXJ0aXRpb25fY291bnQsIHB0bnNfdG9fcmVhZCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwgY19wX2MpICYmIChwYXJ0aXRpb25fY291bnQgPCBwdG5zX3RvX3JlYWQpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGpfdGltZXNfcHRuc190b19yZWFkID0gMCwgaiA9IDA7IGogPCBjaF91c2VkOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdm9mZnM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkb19ub3RfZGVjb2RlW2pdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB2cWNsYXNzID0gY2xhc3NpZnNbal90aW1lc19wdG5zX3RvX3JlYWQgKyBwYXJ0aXRpb25fY291bnRdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZxYm9vayAgPSB2ci0+Ym9va3NbdnFjbGFzc11bcGFzc107CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cWJvb2sgPj0gMCAmJiB2Yy0+Y29kZWJvb2tzW3ZxYm9va10uY29kZXZlY3RvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb2ZmczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBkaW0gID0gdmMtPmNvZGVib29rc1t2cWJvb2tdLmRpbWVuc2lvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3RlcCA9IEZBU1RESVYodnItPnBhcnRpdGlvbl9zaXplIDw8IDEsIGRpbSA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfY29kZWJvb2sgY29kZWJvb2sgPSB2Yy0+Y29kZWJvb2tzW3ZxYm9va107CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnJfdHlwZSA9PSAwKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9mZnMgPSB2b2Zmc2V0K2oqdmxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHN0ZXA7ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29mZnMgPSBnZXRfdmxjMihnYiwgY29kZWJvb2sudmxjLnRhYmxlLCBjb2RlYm9vay5uYl9iaXRzLCAzKSAqIGRpbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBkaW07ICsrbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbdm9mZnMgKyBrICsgbCAqIHN0ZXBdICs9IGNvZGVib29rLmNvZGV2ZWN0b3JzW2NvZmZzICsgbF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZyX3R5cGUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2ZmcyA9IHZvZmZzZXQgKyBqICogdmxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHN0ZXA7ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29mZnMgPSBnZXRfdmxjMihnYiwgY29kZWJvb2sudmxjLnRhYmxlLCBjb2RlYm9vay5uYl9iaXRzLCAzKSAqIGRpbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBkaW07ICsrbCwgKyt2b2ZmcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY1t2b2Zmc10rPWNvZGVib29rLmNvZGV2ZWN0b3JzW2NvZmZzK2xdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiIHBhc3MgJWQgb2ZmczogJWQgY3VycjogJWYgY2hhbmdlOiAlZiBjdiBvZmZzLjogJWQgIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MsIHZvZmZzLCB2ZWNbdm9mZnNdLCBjb2RlYm9vay5jb2RldmVjdG9yc1tjb2ZmcytsXSwgY29mZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2cl90eXBlID09IDIgJiYgY2ggPT0gMiAmJiAodm9mZnNldCAmIDEpID09IDAgJiYgKGRpbSAmIDEpID09IDApIHsgLy8gbW9zdCBmcmVxdWVudCBjYXNlIG9wdGltaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2ZmcyA9IHZvZmZzZXQgPj4gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGltID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzdGVwOyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2ZmcyA9IGdldF92bGMyKGdiLCBjb2RlYm9vay52bGMudGFibGUsIGNvZGVib29rLm5iX2JpdHMsIDMpICogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbdm9mZnMgKyBrICAgICAgIF0gKz0gY29kZWJvb2suY29kZXZlY3RvcnNbY29mZnMgICAgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbdm9mZnMgKyBrICsgdmxlbl0gKz0gY29kZWJvb2suY29kZXZlY3RvcnNbY29mZnMgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaW0gPT0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHN0ZXA7ICsraywgdm9mZnMgKz0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZmZzID0gZ2V0X3ZsYzIoZ2IsIGNvZGVib29rLnZsYy50YWJsZSwgY29kZWJvb2submJfYml0cywgMykgKiA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY1t2b2ZmcyAgICAgICAgICAgXSArPSBjb2RlYm9vay5jb2RldmVjdG9yc1tjb2ZmcyAgICBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY1t2b2ZmcyArIDEgICAgICAgXSArPSBjb2RlYm9vay5jb2RldmVjdG9yc1tjb2ZmcyArIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY1t2b2ZmcyArIHZsZW4gICAgXSArPSBjb2RlYm9vay5jb2RldmVjdG9yc1tjb2ZmcyArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY1t2b2ZmcyArIHZsZW4gKyAxXSArPSBjb2RlYm9vay5jb2RldmVjdG9yc1tjb2ZmcyArIDNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHN0ZXA7ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29mZnMgPSBnZXRfdmxjMihnYiwgY29kZWJvb2sudmxjLnRhYmxlLCBjb2RlYm9vay5uYl9iaXRzLCAzKSAqIGRpbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBkaW07IGwgKz0gMiwgdm9mZnMrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY1t2b2ZmcyAgICAgICBdICs9IGNvZGVib29rLmNvZGV2ZWN0b3JzW2NvZmZzICsgbCAgICBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY1t2b2ZmcyArIHZsZW5dICs9IGNvZGVib29rLmNvZGV2ZWN0b3JzW2NvZmZzICsgbCArIDFdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiIHBhc3MgJWQgb2ZmczogJWQgY3VycjogJWYgY2hhbmdlOiAlZiBjdiBvZmZzLjogJWQrJWQgIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MsIHZvZmZzZXQgLyBjaCArICh2b2ZmcyAlIGNoKSAqIHZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbdm9mZnNldCAvIGNoICsgKHZvZmZzICUgY2gpICogdmxlbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYm9vay5jb2RldmVjdG9yc1tjb2ZmcyArIGxdLCBjb2ZmcywgbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodnJfdHlwZSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZvZmZzX2RpdiA9IEZBU1RESVYodm9mZnNldCA8PCAxLCBjaCA8PDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB2b2Zmc19tb2QgPSB2b2Zmc2V0IC0gdm9mZnNfZGl2ICogY2g7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHN0ZXA7ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29mZnMgPSBnZXRfdmxjMihnYiwgY29kZWJvb2sudmxjLnRhYmxlLCBjb2RlYm9vay5uYl9iaXRzLCAzKSAqIGRpbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBkaW07ICsrbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY1t2b2Zmc19kaXYgKyB2b2Zmc19tb2QgKiB2bGVuXSArPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYm9vay5jb2RldmVjdG9yc1tjb2ZmcyArIGxdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiIHBhc3MgJWQgb2ZmczogJWQgY3VycjogJWYgY2hhbmdlOiAlZiBjdiBvZmZzLjogJWQrJWQgIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MsIHZvZmZzX2RpdiArIHZvZmZzX21vZCAqIHZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbdm9mZnNfZGl2ICsgdm9mZnNfbW9kICogdmxlbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYm9vay5jb2RldmVjdG9yc1tjb2ZmcyArIGxdLCBjb2ZmcywgbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKyt2b2Zmc19tb2QgPT0gY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9mZnNfZGl2Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvZmZzX21vZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGpfdGltZXNfcHRuc190b19yZWFkICs9IHB0bnNfdG9fcmVhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytwYXJ0aXRpb25fY291bnQ7CisgICAgICAgICAgICAgICAgdm9mZnNldCArPSB2ci0+cGFydGl0aW9uX3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpYnZvcmJpc19idWcgJiYgIXBhc3MpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaF91c2VkOyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRvX25vdF9kZWNvZGVbal0pIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3ZsYzIoJnZjLT5nYiwgdmMtPmNvZGVib29rc1t2ci0+Y2xhc3Nib29rXS52bGMudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjLT5jb2RlYm9va3NbdnItPmNsYXNzYm9va10ubmJfYml0cywgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB2b3JiaXNfcmVzaWR1ZV9kZWNvZGUodm9yYmlzX2NvbnRleHQgKnZjLCB2b3JiaXNfcmVzaWR1ZSAqdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZG9fbm90X2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqdmVjLCB1bnNpZ25lZCB2bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoX2xlZnQpCit7CisgICAgaWYgKHZyLT50eXBlID09IDIpCisgICAgICAgIHJldHVybiB2b3JiaXNfcmVzaWR1ZV9kZWNvZGVfaW50ZXJuYWwodmMsIHZyLCBjaCwgZG9fbm90X2RlY29kZSwgdmVjLCB2bGVuLCBjaF9sZWZ0LCAyKTsKKyAgICBlbHNlIGlmICh2ci0+dHlwZSA9PSAxKQorICAgICAgICByZXR1cm4gdm9yYmlzX3Jlc2lkdWVfZGVjb2RlX2ludGVybmFsKHZjLCB2ciwgY2gsIGRvX25vdF9kZWNvZGUsIHZlYywgdmxlbiwgY2hfbGVmdCwgMSk7CisgICAgZWxzZSBpZiAodnItPnR5cGUgPT0gMCkKKyAgICAgICAgcmV0dXJuIHZvcmJpc19yZXNpZHVlX2RlY29kZV9pbnRlcm5hbCh2YywgdnIsIGNoLCBkb19ub3RfZGVjb2RlLCB2ZWMsIHZsZW4sIGNoX2xlZnQsIDApOworICAgIGVsc2UgeworICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgSW52YWxpZCByZXNpZHVlIHR5cGUgd2hpbGUgcmVzaWR1ZSBkZWNvZGU/ISBcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfdm9yYmlzX2ludmVyc2VfY291cGxpbmcoZmxvYXQgKm1hZywgZmxvYXQgKmFuZywgaW50cHRyX3QgYmxvY2tzaXplKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7ICBpIDwgYmxvY2tzaXplOyAgaSsrKSB7CisgICAgICAgIGlmIChtYWdbaV0gPiAwLjApIHsKKyAgICAgICAgICAgIGlmIChhbmdbaV0gPiAwLjApIHsKKyAgICAgICAgICAgICAgICBhbmdbaV0gPSBtYWdbaV0gLSBhbmdbaV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAgPSBhbmdbaV07CisgICAgICAgICAgICAgICAgYW5nW2ldICAgICA9IG1hZ1tpXTsKKyAgICAgICAgICAgICAgICBtYWdbaV0gICAgKz0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhbmdbaV0gPiAwLjApIHsKKyAgICAgICAgICAgICAgICBhbmdbaV0gKz0gbWFnW2ldOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ZW1wID0gYW5nW2ldOworICAgICAgICAgICAgICAgIGFuZ1tpXSAgICAgPSBtYWdbaV07CisgICAgICAgICAgICAgICAgbWFnW2ldICAgIC09IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIERlY29kZSB0aGUgYXVkaW8gcGFja2V0IHVzaW5nIHRoZSBmdW5jdGlvbnMgYWJvdmUKKworc3RhdGljIGludCB2b3JiaXNfcGFyc2VfYXVkaW9fcGFja2V0KHZvcmJpc19jb250ZXh0ICp2YywgZmxvYXQgKipmbG9vcl9wdHIpCit7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmdmMtPmdiOworICAgIEZGVENvbnRleHQgKm1kY3Q7CisgICAgaW50IHByZXZpb3VzX3dpbmRvdyA9IHZjLT5wcmV2aW91c193aW5kb3c7CisgICAgdW5zaWduZWQgbW9kZV9udW1iZXIsIGJsb2NrZmxhZywgYmxvY2tzaXplOworICAgIGludCBpLCBqOworICAgIHVpbnQ4X3Qgbm9fcmVzaWR1ZVsyNTVdOworICAgIHVpbnQ4X3QgZG9fbm90X2RlY29kZVsyNTVdOworICAgIHZvcmJpc19tYXBwaW5nICptYXBwaW5nOworICAgIGZsb2F0ICpjaF9yZXNfcHRyICAgPSB2Yy0+Y2hhbm5lbF9yZXNpZHVlczsKKyAgICB1aW50OF90IHJlc19jaGFuWzI1NV07CisgICAgdW5zaWduZWQgcmVzX251bSA9IDA7CisgICAgaW50IHJldGxlbiAgPSAwOworICAgIHVuc2lnbmVkIGNoX2xlZnQgPSB2Yy0+YXVkaW9fY2hhbm5lbHM7CisgICAgdW5zaWduZWQgdmxlbjsKKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGF2X2xvZyh2Yy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCBhIFZvcmJpcyBJIGF1ZGlvIHBhY2tldC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgLy8gcGFja2V0IHR5cGUgbm90IGF1ZGlvCisgICAgfQorCisgICAgaWYgKHZjLT5tb2RlX2NvdW50ID09IDEpIHsKKyAgICAgICAgbW9kZV9udW1iZXIgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIEdFVF9WQUxJREFURURfSU5ERVgobW9kZV9udW1iZXIsIGlsb2codmMtPm1vZGVfY291bnQtMSksIHZjLT5tb2RlX2NvdW50KQorICAgIH0KKyAgICB2Yy0+bW9kZV9udW1iZXIgPSBtb2RlX251bWJlcjsKKyAgICBtYXBwaW5nID0gJnZjLT5tYXBwaW5nc1t2Yy0+bW9kZXNbbW9kZV9udW1iZXJdLm1hcHBpbmddOworCisgICAgYXZfZGxvZyhOVUxMLCAiIE1vZGUgbnVtYmVyOiAldSAsIG1hcHBpbmc6ICVkICwgYmxvY2t0eXBlICVkXG4iLCBtb2RlX251bWJlciwKKyAgICAgICAgICAgIHZjLT5tb2Rlc1ttb2RlX251bWJlcl0ubWFwcGluZywgdmMtPm1vZGVzW21vZGVfbnVtYmVyXS5ibG9ja2ZsYWcpOworCisgICAgYmxvY2tmbGFnID0gdmMtPm1vZGVzW21vZGVfbnVtYmVyXS5ibG9ja2ZsYWc7CisgICAgYmxvY2tzaXplID0gdmMtPmJsb2Nrc2l6ZVtibG9ja2ZsYWddOworICAgIHZsZW4gPSBibG9ja3NpemUgLyAyOworICAgIGlmIChibG9ja2ZsYWcpIHsKKyAgICAgICAgaW50IGNvZGUgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIGlmIChwcmV2aW91c193aW5kb3cgPCAwKQorICAgICAgICAgICAgcHJldmlvdXNfd2luZG93ID0gY29kZT4+MTsKKyAgICB9IGVsc2UgaWYgKHByZXZpb3VzX3dpbmRvdyA8IDApCisgICAgICAgIHByZXZpb3VzX3dpbmRvdyA9IDA7CisKKyAgICBtZW1zZXQoY2hfcmVzX3B0ciwgICAwLCBzaXplb2YoZmxvYXQpICogdmMtPmF1ZGlvX2NoYW5uZWxzICogdmxlbik7IC8vRklYTUUgY2FuIHRoaXMgYmUgcmVtb3ZlZCA/CisgICAgZm9yIChpID0gMDsgaSA8IHZjLT5hdWRpb19jaGFubmVsczsgKytpKQorICAgICAgICBtZW1zZXQoZmxvb3JfcHRyW2ldLCAwLCB2bGVuICogc2l6ZW9mKGZsb29yX3B0clswXVswXSkpOyAvL0ZJWE1FIGNhbiB0aGlzIGJlIHJlbW92ZWQgPworCisvLyBEZWNvZGUgZmxvb3IKKworICAgIGZvciAoaSA9IDA7IGkgPCB2Yy0+YXVkaW9fY2hhbm5lbHM7ICsraSkgeworICAgICAgICB2b3JiaXNfZmxvb3IgKmZsb29yOworICAgICAgICBpbnQgcmV0OworICAgICAgICBpZiAobWFwcGluZy0+c3VibWFwcyA+IDEpIHsKKyAgICAgICAgICAgIGZsb29yID0gJnZjLT5mbG9vcnNbbWFwcGluZy0+c3VibWFwX2Zsb29yW21hcHBpbmctPm11eFtpXV1dOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxvb3IgPSAmdmMtPmZsb29yc1ttYXBwaW5nLT5zdWJtYXBfZmxvb3JbMF1dOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZmxvb3ItPmRlY29kZSh2YywgJmZsb29yLT5kYXRhLCBmbG9vcl9wdHJbaV0pOworCisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2codmMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNvZGVib29rIGluIHZvcmJpc19mbG9vcl9kZWNvZGUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIG5vX3Jlc2lkdWVbaV0gPSByZXQ7CisgICAgfQorCisvLyBOb256ZXJvIHZlY3RvciBwcm9wYWdhdGUKKworICAgIGZvciAoaSA9IG1hcHBpbmctPmNvdXBsaW5nX3N0ZXBzIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgaWYgKCEobm9fcmVzaWR1ZVttYXBwaW5nLT5tYWduaXR1ZGVbaV1dICYgbm9fcmVzaWR1ZVttYXBwaW5nLT5hbmdsZVtpXV0pKSB7CisgICAgICAgICAgICBub19yZXNpZHVlW21hcHBpbmctPm1hZ25pdHVkZVtpXV0gPSAwOworICAgICAgICAgICAgbm9fcmVzaWR1ZVttYXBwaW5nLT5hbmdsZVtpXV0gICAgID0gMDsKKyAgICAgICAgfQorICAgIH0KKworLy8gRGVjb2RlIHJlc2lkdWUKKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXBwaW5nLT5zdWJtYXBzOyArK2kpIHsKKyAgICAgICAgdm9yYmlzX3Jlc2lkdWUgKnJlc2lkdWU7CisgICAgICAgIHVuc2lnbmVkIGNoID0gMDsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdmMtPmF1ZGlvX2NoYW5uZWxzOyArK2opIHsKKyAgICAgICAgICAgIGlmICgobWFwcGluZy0+c3VibWFwcyA9PSAxKSB8fCAoaSA9PSBtYXBwaW5nLT5tdXhbal0pKSB7CisgICAgICAgICAgICAgICAgcmVzX2NoYW5bal0gPSByZXNfbnVtOworICAgICAgICAgICAgICAgIGlmIChub19yZXNpZHVlW2pdKSB7CisgICAgICAgICAgICAgICAgICAgIGRvX25vdF9kZWNvZGVbY2hdID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkb19ub3RfZGVjb2RlW2NoXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrY2g7CisgICAgICAgICAgICAgICAgKytyZXNfbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc2lkdWUgPSAmdmMtPnJlc2lkdWVzW21hcHBpbmctPnN1Ym1hcF9yZXNpZHVlW2ldXTsKKyAgICAgICAgaWYgKGNoX2xlZnQgPCBjaCkgeworICAgICAgICAgICAgYXZfbG9nKHZjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgY2hhbm5lbHMgaW4gdm9yYmlzX2Zsb29yX2RlY29kZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoKSB7CisgICAgICAgICAgICByZXQgPSB2b3JiaXNfcmVzaWR1ZV9kZWNvZGUodmMsIHJlc2lkdWUsIGNoLCBkb19ub3RfZGVjb2RlLCBjaF9yZXNfcHRyLCB2bGVuLCBjaF9sZWZ0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBjaF9yZXNfcHRyICs9IGNoICogdmxlbjsKKyAgICAgICAgY2hfbGVmdCAtPSBjaDsKKyAgICB9CisKKyAgICBpZiAoY2hfbGVmdCA+IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisvLyBJbnZlcnNlIGNvdXBsaW5nCisKKyAgICBmb3IgKGkgPSBtYXBwaW5nLT5jb3VwbGluZ19zdGVwcyAtIDE7IGkgPj0gMDsgLS1pKSB7IC8vd2FybmluZzogaSBoYXMgdG8gYmUgc2lnbmVkCisgICAgICAgIGZsb2F0ICptYWcsICphbmc7CisKKyAgICAgICAgbWFnID0gdmMtPmNoYW5uZWxfcmVzaWR1ZXMrcmVzX2NoYW5bbWFwcGluZy0+bWFnbml0dWRlW2ldXSAqIGJsb2Nrc2l6ZSAvIDI7CisgICAgICAgIGFuZyA9IHZjLT5jaGFubmVsX3Jlc2lkdWVzK3Jlc19jaGFuW21hcHBpbmctPmFuZ2xlW2ldXSAgICAgKiBibG9ja3NpemUgLyAyOworICAgICAgICB2Yy0+ZHNwLnZvcmJpc19pbnZlcnNlX2NvdXBsaW5nKG1hZywgYW5nLCBibG9ja3NpemUgLyAyKTsKKyAgICB9CisKKy8vIERvdHByb2R1Y3QsIE1EQ1QKKworICAgIG1kY3QgPSAmdmMtPm1kY3RbYmxvY2tmbGFnXTsKKworICAgIGZvciAoaiA9IHZjLT5hdWRpb19jaGFubmVscy0xO2ogPj0gMDsgai0tKSB7CisgICAgICAgIGNoX3Jlc19wdHIgICA9IHZjLT5jaGFubmVsX3Jlc2lkdWVzICsgcmVzX2NoYW5bal0gKiBibG9ja3NpemUgLyAyOworICAgICAgICB2Yy0+ZmRzcC0+dmVjdG9yX2ZtdWwoZmxvb3JfcHRyW2pdLCBmbG9vcl9wdHJbal0sIGNoX3Jlc19wdHIsIGJsb2Nrc2l6ZSAvIDIpOworICAgICAgICBtZGN0LT5pbWRjdF9oYWxmKG1kY3QsIGNoX3Jlc19wdHIsIGZsb29yX3B0cltqXSk7CisgICAgfQorCisvLyBPdmVybGFwL2FkZCwgc2F2ZSBkYXRhIGZvciBuZXh0IG92ZXJsYXBwaW5nCisKKyAgICByZXRsZW4gPSAoYmxvY2tzaXplICsgdmMtPmJsb2Nrc2l6ZVtwcmV2aW91c193aW5kb3ddKSAvIDQ7CisgICAgZm9yIChqID0gMDsgaiA8IHZjLT5hdWRpb19jaGFubmVsczsgaisrKSB7CisgICAgICAgIHVuc2lnbmVkIGJzMCA9IHZjLT5ibG9ja3NpemVbMF07CisgICAgICAgIHVuc2lnbmVkIGJzMSA9IHZjLT5ibG9ja3NpemVbMV07CisgICAgICAgIGZsb2F0ICpyZXNpZHVlICAgID0gdmMtPmNoYW5uZWxfcmVzaWR1ZXMgKyByZXNfY2hhbltqXSAqIGJsb2Nrc2l6ZSAvIDI7CisgICAgICAgIGZsb2F0ICpzYXZlZCAgICAgID0gdmMtPnNhdmVkICsgaiAqIGJzMSAvIDQ7CisgICAgICAgIGZsb2F0ICpyZXQgICAgICAgID0gZmxvb3JfcHRyW2pdOworICAgICAgICBmbG9hdCAqYnVmICAgICAgICA9IHJlc2lkdWU7CisgICAgICAgIGNvbnN0IGZsb2F0ICp3aW4gID0gdmMtPndpbltibG9ja2ZsYWcgJiBwcmV2aW91c193aW5kb3ddOworCisgICAgICAgIGlmIChibG9ja2ZsYWcgPT0gcHJldmlvdXNfd2luZG93KSB7CisgICAgICAgICAgICB2Yy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KHJldCwgc2F2ZWQsIGJ1Ziwgd2luLCBibG9ja3NpemUgLyA0KTsKKyAgICAgICAgfSBlbHNlIGlmIChibG9ja2ZsYWcgPiBwcmV2aW91c193aW5kb3cpIHsKKyAgICAgICAgICAgIHZjLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3cocmV0LCBzYXZlZCwgYnVmLCB3aW4sIGJzMCAvIDQpOworICAgICAgICAgICAgbWVtY3B5KHJldCticzAvMiwgYnVmK2JzMC80LCAoKGJzMS1iczApLzQpICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkocmV0LCBzYXZlZCwgKChiczEgLSBiczApIC8gNCkgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgIHZjLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3cocmV0ICsgKGJzMSAtIGJzMCkgLyA0LCBzYXZlZCArIChiczEgLSBiczApIC8gNCwgYnVmLCB3aW4sIGJzMCAvIDQpOworICAgICAgICB9CisgICAgICAgIG1lbWNweShzYXZlZCwgYnVmICsgYmxvY2tzaXplIC8gNCwgYmxvY2tzaXplIC8gNCAqIHNpemVvZihmbG9hdCkpOworICAgIH0KKworICAgIHZjLT5wcmV2aW91c193aW5kb3cgPSBibG9ja2ZsYWc7CisgICAgcmV0dXJuIHJldGxlbjsKK30KKworLy8gUmV0dXJuIHRoZSBkZWNvZGVkIGF1ZGlvIHBhY2tldCB0aHJvdWdoIHRoZSBzdGFuZGFyZCBhcGkKKworc3RhdGljIGludCB2b3JiaXNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICB2b3JiaXNfY29udGV4dCAqdmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lICAgICA9IGRhdGE7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmdmMtPmdiOworICAgIGZsb2F0ICpjaGFubmVsX3B0cnNbMjU1XTsKKyAgICBpbnQgaSwgbGVuLCByZXQ7CisKKyAgICBhdl9kbG9nKE5VTEwsICJwYWNrZXQgbGVuZ3RoICVkIFxuIiwgYnVmX3NpemUpOworCisgICAgaWYgKCpidWYgPT0gMSAmJiBidWZfc2l6ZSA+IDcpIHsKKyAgICAgICAgaW5pdF9nZXRfYml0cyhnYiwgYnVmKzEsIGJ1Zl9zaXplKjggLSA4KTsKKyAgICAgICAgdm9yYmlzX2ZyZWUodmMpOworICAgICAgICBpZiAoKHJldCA9IHZvcmJpc19wYXJzZV9pZF9oZHIodmMpKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJZCBoZWFkZXIgY29ycnVwdC5cbiIpOworICAgICAgICAgICAgdm9yYmlzX2ZyZWUodmMpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2Yy0+YXVkaW9fY2hhbm5lbHMgPiA4KQorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gZmZfdm9yYmlzX2NoYW5uZWxfbGF5b3V0c1t2Yy0+YXVkaW9fY2hhbm5lbHMgLSAxXTsKKworICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgICAgPSB2Yy0+YXVkaW9fY2hhbm5lbHM7CisgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IHZjLT5hdWRpb19zYW1wbGVyYXRlOworICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgfQorCisgICAgaWYgKCpidWYgPT0gMyAmJiBidWZfc2l6ZSA+IDcpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJJZ25vcmluZyBjb21tZW50IGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoKmJ1ZiA9PSA1ICYmIGJ1Zl9zaXplID4gNyAmJiB2Yy0+Y2hhbm5lbF9yZXNpZHVlcyAmJiAhdmMtPm1vZGVzKSB7CisgICAgICAgIGluaXRfZ2V0X2JpdHMoZ2IsIGJ1ZisxLCBidWZfc2l6ZSo4IC0gOCk7CisgICAgICAgIGlmICgocmV0ID0gdm9yYmlzX3BhcnNlX3NldHVwX2hkcih2YykpKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNldHVwIGhlYWRlciBjb3JydXB0LlxuIik7CisgICAgICAgICAgICB2b3JiaXNfZnJlZSh2Yyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIXZjLT5jaGFubmVsX3Jlc2lkdWVzIHx8ICF2Yy0+bW9kZXMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEYXRhIHBhY2tldCBiZWZvcmUgdmFsaWQgaGVhZGVyc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSB2Yy0+YmxvY2tzaXplWzFdIC8gMjsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHZjLT5hdWRpb19jaGFubmVscyA+IDgpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHZjLT5hdWRpb19jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgY2hhbm5lbF9wdHJzW2ldID0gKGZsb2F0ICopZnJhbWUtPmV4dGVuZGVkX2RhdGFbaV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHZjLT5hdWRpb19jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBpbnQgY2ggPSBmZl92b3JiaXNfY2hhbm5lbF9sYXlvdXRfb2Zmc2V0c1t2Yy0+YXVkaW9fY2hhbm5lbHMgLSAxXVtpXTsKKyAgICAgICAgICAgIGNoYW5uZWxfcHRyc1tjaF0gPSAoZmxvYXQgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluaXRfZ2V0X2JpdHMoZ2IsIGJ1ZiwgYnVmX3NpemUqOCk7CisKKyAgICBpZiAoKGxlbiA9IHZvcmJpc19wYXJzZV9hdWRpb19wYWNrZXQodmMsIGNoYW5uZWxfcHRycykpIDw9IDApCisgICAgICAgIHJldHVybiBsZW47CisKKyAgICBpZiAoIXZjLT5maXJzdF9mcmFtZSkgeworICAgICAgICB2Yy0+Zmlyc3RfZnJhbWUgPSAxOworICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKworICAgIGF2X2Rsb2coTlVMTCwgInBhcnNlZCAlZCBieXRlcyAlZCBiaXRzLCByZXR1cm5lZCAlZCBzYW1wbGVzICgqY2gqYml0cykgXG4iLAorICAgICAgICAgICAgZ2V0X2JpdHNfY291bnQoZ2IpIC8gOCwgZ2V0X2JpdHNfY291bnQoZ2IpICUgOCwgbGVuKTsKKworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gbGVuOworICAgICpnb3RfZnJhbWVfcHRyICAgID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworLy8gQ2xvc2UgZGVjb2RlcgorCitzdGF0aWMgYXZfY29sZCBpbnQgdm9yYmlzX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgdm9yYmlzX2NvbnRleHQgKnZjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHZvcmJpc19mcmVlKHZjKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHZvcmJpc19kZWNvZGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHZvcmJpc19jb250ZXh0ICp2YyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAodmMtPnNhdmVkKSB7CisgICAgICAgIG1lbXNldCh2Yy0+c2F2ZWQsIDAsICh2Yy0+YmxvY2tzaXplWzFdIC8gNCkgKiB2Yy0+YXVkaW9fY2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnZjLT5zYXZlZCkpOworICAgIH0KKyAgICB2Yy0+cHJldmlvdXNfd2luZG93ID0gLTE7CisgICAgdmMtPmZpcnN0X2ZyYW1lID0gMDsKK30KKworQVZDb2RlYyBmZl92b3JiaXNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgID0gInZvcmJpcyIsCisgICAgLmxvbmdfbmFtZSAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWb3JiaXMiKSwKKyAgICAudHlwZSAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WT1JCSVMsCisgICAgLnByaXZfZGF0YV9zaXplICA9IHNpemVvZih2b3JiaXNfY29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICA9IHZvcmJpc19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgID0gdm9yYmlzX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgID0gdm9yYmlzX2RlY29kZV9mcmFtZSwKKyAgICAuZmx1c2ggICAgICAgICAgID0gdm9yYmlzX2RlY29kZV9mbHVzaCwKKyAgICAuY2FwYWJpbGl0aWVzICAgID0gQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2hhbm5lbF9sYXlvdXRzID0gZmZfdm9yYmlzX2NoYW5uZWxfbGF5b3V0cywKKyAgICAuc2FtcGxlX2ZtdHMgICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92b3JiaXNkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjJhMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzZHNwLmMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJ2b3JiaXNkc3AuaCIKKyNpbmNsdWRlICJ2b3JiaXMuaCIKKworYXZfY29sZCB2b2lkIGZmX3ZvcmJpc2RzcF9pbml0KFZvcmJpc0RTUENvbnRleHQgKmRzcCkKK3sKKyAgICBkc3AtPnZvcmJpc19pbnZlcnNlX2NvdXBsaW5nID0gZmZfdm9yYmlzX2ludmVyc2VfY291cGxpbmc7CisKKyAgICBpZiAoQVJDSF9BQVJDSDY0KQorICAgICAgICBmZl92b3JiaXNkc3BfaW5pdF9hYXJjaDY0KGRzcCk7CisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl92b3JiaXNkc3BfaW5pdF9hcm0oZHNwKTsKKyAgICBpZiAoQVJDSF9QUEMpCisgICAgICAgIGZmX3ZvcmJpc2RzcF9pbml0X3BwYyhkc3ApOworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfdm9yYmlzZHNwX2luaXRfeDg2KGRzcCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92b3JiaXNkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZvcmJpc2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYmVjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92b3JiaXNkc3AuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WT1JCSVNEU1BfSAorI2RlZmluZSBBVkNPREVDX1ZPUkJJU0RTUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgVm9yYmlzRFNQQ29udGV4dCB7CisgICAgLyogYXNzdW1lIGxlbiBpcyBhIG11bHRpcGxlIG9mIDQsIGFuZCBhcnJheXMgYXJlIDE2LWJ5dGUgYWxpZ25lZCAqLworICAgIHZvaWQgKCp2b3JiaXNfaW52ZXJzZV9jb3VwbGluZykoZmxvYXQgKm1hZywgZmxvYXQgKmFuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGJsb2Nrc2l6ZSk7Cit9IFZvcmJpc0RTUENvbnRleHQ7CisKK3ZvaWQgZmZfdm9yYmlzZHNwX2luaXQoVm9yYmlzRFNQQ29udGV4dCAqZHNwKTsKKworLyogZm9yIGludGVybmFsIHVzZSBvbmx5ICovCit2b2lkIGZmX3ZvcmJpc2RzcF9pbml0X2FhcmNoNjQoVm9yYmlzRFNQQ29udGV4dCAqZHNwKTsKK3ZvaWQgZmZfdm9yYmlzZHNwX2luaXRfeDg2KFZvcmJpc0RTUENvbnRleHQgKmRzcCk7Cit2b2lkIGZmX3ZvcmJpc2RzcF9pbml0X2FybShWb3JiaXNEU1BDb250ZXh0ICpkc3ApOwordm9pZCBmZl92b3JiaXNkc3BfaW5pdF9wcGMoVm9yYmlzRFNQQ29udGV4dCAqZHNwKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVk9SQklTRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZvcmJpc2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdm9yYmlzZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2MDkzZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZvcmJpc2VuYy5jCkBAIC0wLDAgKzEsMTIxMSBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBPZGVkIFNoaW1vbiA8b2RzMTVAb2RzMTUuZHluZG5zLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTmF0aXZlIFZvcmJpcyBlbmNvZGVyLgorICogQGF1dGhvciBPZGVkIFNoaW1vbiA8b2RzMTVAb2RzMTUuZHluZG5zLm9yZz4KKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImZmdC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJ2b3JiaXMuaCIKKyNpbmNsdWRlICJ2b3JiaXNfZW5jX2RhdGEuaCIKKworI2RlZmluZSBCSVRTVFJFQU1fV1JJVEVSX0xFCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKworI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGFzc2VydC5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IG5lbnRyaWVzOworICAgIHVpbnQ4X3QgKmxlbnM7CisgICAgdWludDMyX3QgKmNvZGV3b3JkczsKKyAgICBpbnQgbmRpbWVuc2lvbnM7CisgICAgZmxvYXQgbWluOworICAgIGZsb2F0IGRlbHRhOworICAgIGludCBzZXFfcDsKKyAgICBpbnQgbG9va3VwOworICAgIGludCAqcXVhbnRsaXN0OworICAgIGZsb2F0ICpkaW1lbnNpb25zOworICAgIGZsb2F0ICpwb3cyOworfSB2b3JiaXNfZW5jX2NvZGVib29rOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGRpbTsKKyAgICBpbnQgc3ViY2xhc3M7CisgICAgaW50IG1hc3RlcmJvb2s7CisgICAgaW50ICpib29rczsKK30gdm9yYmlzX2VuY19mbG9vcl9jbGFzczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBwYXJ0aXRpb25zOworICAgIGludCAqcGFydGl0aW9uX3RvX2NsYXNzOworICAgIGludCBuY2xhc3NlczsKKyAgICB2b3JiaXNfZW5jX2Zsb29yX2NsYXNzICpjbGFzc2VzOworICAgIGludCBtdWx0aXBsaWVyOworICAgIGludCByYW5nZWJpdHM7CisgICAgaW50IHZhbHVlczsKKyAgICB2b3JiaXNfZmxvb3IxX2VudHJ5ICpsaXN0OworfSB2b3JiaXNfZW5jX2Zsb29yOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CisgICAgaW50IGJlZ2luOworICAgIGludCBlbmQ7CisgICAgaW50IHBhcnRpdGlvbl9zaXplOworICAgIGludCBjbGFzc2lmaWNhdGlvbnM7CisgICAgaW50IGNsYXNzYm9vazsKKyAgICBpbnQ4X3QgKCpib29rcylbOF07CisgICAgZmxvYXQgKCptYXhlcylbMl07Cit9IHZvcmJpc19lbmNfcmVzaWR1ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBzdWJtYXBzOworICAgIGludCAqbXV4OworICAgIGludCAqZmxvb3I7CisgICAgaW50ICpyZXNpZHVlOworICAgIGludCBjb3VwbGluZ19zdGVwczsKKyAgICBpbnQgKm1hZ25pdHVkZTsKKyAgICBpbnQgKmFuZ2xlOworfSB2b3JiaXNfZW5jX21hcHBpbmc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgYmxvY2tmbGFnOworICAgIGludCBtYXBwaW5nOworfSB2b3JiaXNfZW5jX21vZGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGludCBsb2cyX2Jsb2Nrc2l6ZVsyXTsKKyAgICBGRlRDb250ZXh0IG1kY3RbMl07CisgICAgY29uc3QgZmxvYXQgKndpblsyXTsKKyAgICBpbnQgaGF2ZV9zYXZlZDsKKyAgICBmbG9hdCAqc2F2ZWQ7CisgICAgZmxvYXQgKnNhbXBsZXM7CisgICAgZmxvYXQgKmZsb29yOyAgLy8gYWxzbyB1c2VkIGZvciB0bXAgdmFsdWVzIGZvciBtZGN0CisgICAgZmxvYXQgKmNvZWZmczsgLy8gYWxzbyB1c2VkIGZvciByZXNpZHVlIGFmdGVyIGZsb29yCisgICAgZmxvYXQgcXVhbGl0eTsKKworICAgIGludCBuY29kZWJvb2tzOworICAgIHZvcmJpc19lbmNfY29kZWJvb2sgKmNvZGVib29rczsKKworICAgIGludCBuZmxvb3JzOworICAgIHZvcmJpc19lbmNfZmxvb3IgKmZsb29yczsKKworICAgIGludCBucmVzaWR1ZXM7CisgICAgdm9yYmlzX2VuY19yZXNpZHVlICpyZXNpZHVlczsKKworICAgIGludCBubWFwcGluZ3M7CisgICAgdm9yYmlzX2VuY19tYXBwaW5nICptYXBwaW5nczsKKworICAgIGludCBubW9kZXM7CisgICAgdm9yYmlzX2VuY19tb2RlICptb2RlczsKKworICAgIGludDY0X3QgbmV4dF9wdHM7Cit9IHZvcmJpc19lbmNfY29udGV4dDsKKworI2RlZmluZSBNQVhfQ0hBTk5FTFMgICAgIDIKKyNkZWZpbmUgTUFYX0NPREVCT09LX0RJTSA4CisKKyNkZWZpbmUgTUFYX0ZMT09SX0NMQVNTX0RJTSAgNAorI2RlZmluZSBOVU1fRkxPT1JfUEFSVElUSU9OUyA4CisjZGVmaW5lIE1BWF9GTE9PUl9WQUxVRVMgICAgIChNQVhfRkxPT1JfQ0xBU1NfRElNKk5VTV9GTE9PUl9QQVJUSVRJT05TKzIpCisKKyNkZWZpbmUgUkVTSURVRV9TSVpFICAgICAgICAgICAxNjAwCisjZGVmaW5lIFJFU0lEVUVfUEFSVF9TSVpFICAgICAgMzIKKyNkZWZpbmUgTlVNX1JFU0lEVUVfUEFSVElUSU9OUyAoUkVTSURVRV9TSVpFL1JFU0lEVUVfUEFSVF9TSVpFKQorCitzdGF0aWMgaW5saW5lIGludCBwdXRfY29kZXdvcmQoUHV0Qml0Q29udGV4dCAqcGIsIHZvcmJpc19lbmNfY29kZWJvb2sgKmNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbnRyeSkKK3sKKyAgICBhdl9hc3NlcnQyKGVudHJ5ID49IDApOworICAgIGF2X2Fzc2VydDIoZW50cnkgPCBjYi0+bmVudHJpZXMpOworICAgIGF2X2Fzc2VydDIoY2ItPmxlbnNbZW50cnldKTsKKyAgICBpZiAocGItPnNpemVfaW5fYml0cyAtIHB1dF9iaXRzX2NvdW50KHBiKSA8IGNiLT5sZW5zW2VudHJ5XSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBwdXRfYml0cyhwYiwgY2ItPmxlbnNbZW50cnldLCBjYi0+Y29kZXdvcmRzW2VudHJ5XSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2JfbG9va3VwX3ZhbHMoaW50IGxvb2t1cCwgaW50IGRpbWVuc2lvbnMsIGludCBlbnRyaWVzKQoreworICAgIGlmIChsb29rdXAgPT0gMSkKKyAgICAgICAgcmV0dXJuIGZmX3ZvcmJpc19udGhfcm9vdChlbnRyaWVzLCBkaW1lbnNpb25zKTsKKyAgICBlbHNlIGlmIChsb29rdXAgPT0gMikKKyAgICAgICAgcmV0dXJuIGRpbWVuc2lvbnMgKmVudHJpZXM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZHlfY29kZWJvb2sodm9yYmlzX2VuY19jb2RlYm9vayAqY2IpCit7CisgICAgaW50IGk7CisKKyAgICBmZl92b3JiaXNfbGVuMnZsYyhjYi0+bGVucywgY2ItPmNvZGV3b3JkcywgY2ItPm5lbnRyaWVzKTsKKworICAgIGlmICghY2ItPmxvb2t1cCkgeworICAgICAgICBjYi0+cG93MiA9IGNiLT5kaW1lbnNpb25zID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgdmFscyA9IGNiX2xvb2t1cF92YWxzKGNiLT5sb29rdXAsIGNiLT5uZGltZW5zaW9ucywgY2ItPm5lbnRyaWVzKTsKKyAgICAgICAgY2ItPmRpbWVuc2lvbnMgPSBhdl9tYWxsb2NfYXJyYXkoY2ItPm5lbnRyaWVzLCBzaXplb2YoZmxvYXQpICogY2ItPm5kaW1lbnNpb25zKTsKKyAgICAgICAgY2ItPnBvdzIgPSBhdl9tYWxsb2N6X2FycmF5KGNiLT5uZW50cmllcywgc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIGlmICghY2ItPmRpbWVuc2lvbnMgfHwgIWNiLT5wb3cyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNiLT5uZW50cmllczsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCBsYXN0ID0gMDsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgaW50IGRpdiA9IDE7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2ItPm5kaW1lbnNpb25zOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgb2ZmOworICAgICAgICAgICAgICAgIGlmIChjYi0+bG9va3VwID09IDEpCisgICAgICAgICAgICAgICAgICAgIG9mZiA9IChpIC8gZGl2KSAlIHZhbHM7IC8vIGxvb2t1cCB0eXBlIDEKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG9mZiA9IGkgKiBjYi0+bmRpbWVuc2lvbnMgKyBqOyAvLyBsb29rdXAgdHlwZSAyCisKKyAgICAgICAgICAgICAgICBjYi0+ZGltZW5zaW9uc1tpICogY2ItPm5kaW1lbnNpb25zICsgal0gPSBsYXN0ICsgY2ItPm1pbiArIGNiLT5xdWFudGxpc3Rbb2ZmXSAqIGNiLT5kZWx0YTsKKyAgICAgICAgICAgICAgICBpZiAoY2ItPnNlcV9wKQorICAgICAgICAgICAgICAgICAgICBsYXN0ID0gY2ItPmRpbWVuc2lvbnNbaSAqIGNiLT5uZGltZW5zaW9ucyArIGpdOworICAgICAgICAgICAgICAgIGNiLT5wb3cyW2ldICs9IGNiLT5kaW1lbnNpb25zW2kgKiBjYi0+bmRpbWVuc2lvbnMgKyBqXSAqIGNiLT5kaW1lbnNpb25zW2kgKiBjYi0+bmRpbWVuc2lvbnMgKyBqXTsKKyAgICAgICAgICAgICAgICBkaXYgKj0gdmFsczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNiLT5wb3cyW2ldIC89IDIuMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkeV9yZXNpZHVlKHZvcmJpc19lbmNfcmVzaWR1ZSAqcmMsIHZvcmJpc19lbmNfY29udGV4dCAqdmVuYykKK3sKKyAgICBpbnQgaTsKKyAgICBhdl9hc3NlcnQwKHJjLT50eXBlID09IDIpOworICAgIHJjLT5tYXhlcyA9IGF2X21hbGxvY3pfYXJyYXkocmMtPmNsYXNzaWZpY2F0aW9ucywgc2l6ZW9mKGZsb2F0WzJdKSk7CisgICAgaWYgKCFyYy0+bWF4ZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZm9yIChpID0gMDsgaSA8IHJjLT5jbGFzc2lmaWNhdGlvbnM7IGkrKykgeworICAgICAgICBpbnQgajsKKyAgICAgICAgdm9yYmlzX2VuY19jb2RlYm9vayAqIGNiOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgaWYgKHJjLT5ib29rc1tpXVtqXSAhPSAtMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGogPT0gOCkgLy8gemVybworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNiID0gJnZlbmMtPmNvZGVib29rc1tyYy0+Ym9va3NbaV1bal1dOworICAgICAgICBhc3NlcnQoY2ItPm5kaW1lbnNpb25zID49IDIpOworICAgICAgICBhc3NlcnQoY2ItPmxvb2t1cCk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGNiLT5uZW50cmllczsgaisrKSB7CisgICAgICAgICAgICBmbG9hdCBhOworICAgICAgICAgICAgaWYgKCFjYi0+bGVuc1tqXSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGEgPSBmYWJzKGNiLT5kaW1lbnNpb25zW2ogKiBjYi0+bmRpbWVuc2lvbnNdKTsKKyAgICAgICAgICAgIGlmIChhID4gcmMtPm1heGVzW2ldWzBdKQorICAgICAgICAgICAgICAgIHJjLT5tYXhlc1tpXVswXSA9IGE7CisgICAgICAgICAgICBhID0gZmFicyhjYi0+ZGltZW5zaW9uc1tqICogY2ItPm5kaW1lbnNpb25zICsgMV0pOworICAgICAgICAgICAgaWYgKGEgPiByYy0+bWF4ZXNbaV1bMV0pCisgICAgICAgICAgICAgICAgcmMtPm1heGVzW2ldWzFdID0gYTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBzbWFsbCBiaWFzCisgICAgZm9yIChpID0gMDsgaSA8IHJjLT5jbGFzc2lmaWNhdGlvbnM7IGkrKykgeworICAgICAgICByYy0+bWF4ZXNbaV1bMF0gKz0gMC44OworICAgICAgICByYy0+bWF4ZXNbaV1bMV0gKz0gMC44OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcmVhdGVfdm9yYmlzX2NvbnRleHQodm9yYmlzX2VuY19jb250ZXh0ICp2ZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHZvcmJpc19lbmNfZmxvb3IgICAqZmM7CisgICAgdm9yYmlzX2VuY19yZXNpZHVlICpyYzsKKyAgICB2b3JiaXNfZW5jX21hcHBpbmcgKm1jOworICAgIGludCBpLCBib29rLCByZXQ7CisKKyAgICB2ZW5jLT5jaGFubmVscyAgICA9IGF2Y3R4LT5jaGFubmVsczsKKyAgICB2ZW5jLT5zYW1wbGVfcmF0ZSA9IGF2Y3R4LT5zYW1wbGVfcmF0ZTsKKyAgICB2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVswXSA9IHZlbmMtPmxvZzJfYmxvY2tzaXplWzFdID0gMTE7CisKKyAgICB2ZW5jLT5uY29kZWJvb2tzID0gRkZfQVJSQVlfRUxFTVMoY3ZlY3RvcnMpOworICAgIHZlbmMtPmNvZGVib29rcyAgPSBhdl9tYWxsb2Moc2l6ZW9mKHZvcmJpc19lbmNfY29kZWJvb2spICogdmVuYy0+bmNvZGVib29rcyk7CisgICAgaWYgKCF2ZW5jLT5jb2RlYm9va3MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvLyBjb2RlYm9vayAwLi4xNCAtIGZsb29yMSBib29rLCB2YWx1ZXMgMC4uMjU1CisgICAgLy8gY29kZWJvb2sgMTUgcmVzaWR1ZSBtYXN0ZXJib29rCisgICAgLy8gY29kZWJvb2sgMTYuLjI5IHJlc2lkdWUKKyAgICBmb3IgKGJvb2sgPSAwOyBib29rIDwgdmVuYy0+bmNvZGVib29rczsgYm9vaysrKSB7CisgICAgICAgIHZvcmJpc19lbmNfY29kZWJvb2sgKmNiID0gJnZlbmMtPmNvZGVib29rc1tib29rXTsKKyAgICAgICAgaW50IHZhbHM7CisgICAgICAgIGNiLT5uZGltZW5zaW9ucyA9IGN2ZWN0b3JzW2Jvb2tdLmRpbTsKKyAgICAgICAgY2ItPm5lbnRyaWVzICAgID0gY3ZlY3RvcnNbYm9va10ucmVhbF9sZW47CisgICAgICAgIGNiLT5taW4gICAgICAgICA9IGN2ZWN0b3JzW2Jvb2tdLm1pbjsKKyAgICAgICAgY2ItPmRlbHRhICAgICAgID0gY3ZlY3RvcnNbYm9va10uZGVsdGE7CisgICAgICAgIGNiLT5sb29rdXAgICAgICA9IGN2ZWN0b3JzW2Jvb2tdLmxvb2t1cDsKKyAgICAgICAgY2ItPnNlcV9wICAgICAgID0gMDsKKworICAgICAgICBjYi0+bGVucyAgICAgID0gYXZfbWFsbG9jX2FycmF5KGNiLT5uZW50cmllcywgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgY2ItPmNvZGV3b3JkcyA9IGF2X21hbGxvY19hcnJheShjYi0+bmVudHJpZXMsIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICBpZiAoIWNiLT5sZW5zIHx8ICFjYi0+Y29kZXdvcmRzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KGNiLT5sZW5zLCBjdmVjdG9yc1tib29rXS5jbGVucywgY3ZlY3RvcnNbYm9va10ubGVuKTsKKyAgICAgICAgbWVtc2V0KGNiLT5sZW5zICsgY3ZlY3RvcnNbYm9va10ubGVuLCAwLCBjYi0+bmVudHJpZXMgLSBjdmVjdG9yc1tib29rXS5sZW4pOworCisgICAgICAgIGlmIChjYi0+bG9va3VwKSB7CisgICAgICAgICAgICB2YWxzID0gY2JfbG9va3VwX3ZhbHMoY2ItPmxvb2t1cCwgY2ItPm5kaW1lbnNpb25zLCBjYi0+bmVudHJpZXMpOworICAgICAgICAgICAgY2ItPnF1YW50bGlzdCA9IGF2X21hbGxvY19hcnJheSh2YWxzLCBzaXplb2YoaW50KSk7CisgICAgICAgICAgICBpZiAoIWNiLT5xdWFudGxpc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWxzOyBpKyspCisgICAgICAgICAgICAgICAgY2ItPnF1YW50bGlzdFtpXSA9IGN2ZWN0b3JzW2Jvb2tdLnF1YW50W2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2ItPnF1YW50bGlzdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSByZWFkeV9jb2RlYm9vayhjYikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgdmVuYy0+bmZsb29ycyA9IDE7CisgICAgdmVuYy0+Zmxvb3JzICA9IGF2X21hbGxvYyhzaXplb2Yodm9yYmlzX2VuY19mbG9vcikgKiB2ZW5jLT5uZmxvb3JzKTsKKyAgICBpZiAoIXZlbmMtPmZsb29ycykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8vIGp1c3QgMSBmbG9vcgorICAgIGZjID0gJnZlbmMtPmZsb29yc1swXTsKKyAgICBmYy0+cGFydGl0aW9ucyAgICAgICAgID0gTlVNX0ZMT09SX1BBUlRJVElPTlM7CisgICAgZmMtPnBhcnRpdGlvbl90b19jbGFzcyA9IGF2X21hbGxvYyhzaXplb2YoaW50KSAqIGZjLT5wYXJ0aXRpb25zKTsKKyAgICBpZiAoIWZjLT5wYXJ0aXRpb25fdG9fY2xhc3MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmMtPm5jbGFzc2VzICAgICAgICAgICA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGZjLT5wYXJ0aXRpb25zOyBpKyspIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBhW10gPSB7MCwgMSwgMiwgMiwgMywgMywgNCwgNH07CisgICAgICAgIGZjLT5wYXJ0aXRpb25fdG9fY2xhc3NbaV0gPSBhW2ldOworICAgICAgICBmYy0+bmNsYXNzZXMgPSBGRk1BWChmYy0+bmNsYXNzZXMsIGZjLT5wYXJ0aXRpb25fdG9fY2xhc3NbaV0pOworICAgIH0KKyAgICBmYy0+bmNsYXNzZXMrKzsKKyAgICBmYy0+Y2xhc3NlcyA9IGF2X21hbGxvY19hcnJheShmYy0+bmNsYXNzZXMsIHNpemVvZih2b3JiaXNfZW5jX2Zsb29yX2NsYXNzKSk7CisgICAgaWYgKCFmYy0+Y2xhc3NlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmMtPm5jbGFzc2VzOyBpKyspIHsKKyAgICAgICAgdm9yYmlzX2VuY19mbG9vcl9jbGFzcyAqIGMgPSAmZmMtPmNsYXNzZXNbaV07CisgICAgICAgIGludCBqLCBib29rczsKKyAgICAgICAgYy0+ZGltICAgICAgICA9IGZsb29yX2NsYXNzZXNbaV0uZGltOworICAgICAgICBjLT5zdWJjbGFzcyAgID0gZmxvb3JfY2xhc3Nlc1tpXS5zdWJjbGFzczsKKyAgICAgICAgYy0+bWFzdGVyYm9vayA9IGZsb29yX2NsYXNzZXNbaV0ubWFzdGVyYm9vazsKKyAgICAgICAgYm9va3MgICAgICAgICA9ICgxIDw8IGMtPnN1YmNsYXNzKTsKKyAgICAgICAgYy0+Ym9va3MgICAgICA9IGF2X21hbGxvY19hcnJheShib29rcywgc2l6ZW9mKGludCkpOworICAgICAgICBpZiAoIWMtPmJvb2tzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJvb2tzOyBqKyspCisgICAgICAgICAgICBjLT5ib29rc1tqXSA9IGZsb29yX2NsYXNzZXNbaV0ubmJvb2tzW2pdOworICAgIH0KKyAgICBmYy0+bXVsdGlwbGllciA9IDI7CisgICAgZmMtPnJhbmdlYml0cyAgPSB2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVswXSAtIDE7CisKKyAgICBmYy0+dmFsdWVzID0gMjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmMtPnBhcnRpdGlvbnM7IGkrKykKKyAgICAgICAgZmMtPnZhbHVlcyArPSBmYy0+Y2xhc3Nlc1tmYy0+cGFydGl0aW9uX3RvX2NsYXNzW2ldXS5kaW07CisKKyAgICBmYy0+bGlzdCA9IGF2X21hbGxvY19hcnJheShmYy0+dmFsdWVzLCBzaXplb2Yodm9yYmlzX2Zsb29yMV9lbnRyeSkpOworICAgIGlmICghZmMtPmxpc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmMtPmxpc3RbMF0ueCA9IDA7CisgICAgZmMtPmxpc3RbMV0ueCA9IDEgPDwgZmMtPnJhbmdlYml0czsKKyAgICBmb3IgKGkgPSAyOyBpIDwgZmMtPnZhbHVlczsgaSsrKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgYVtdID0geworICAgICAgICAgICAgIDkzLCAyMywzNzIsICA2LCA0NiwxODYsNzUwLCAxNCwgMzMsIDY1LAorICAgICAgICAgICAgMTMwLDI2MCw1NTYsICAzLCAxMCwgMTgsIDI4LCAzOSwgNTUsIDc5LAorICAgICAgICAgICAgMTExLDE1OCwyMjAsMzEyLDQ2NCw2NTAsODUwCisgICAgICAgIH07CisgICAgICAgIGZjLT5saXN0W2ldLnggPSBhW2kgLSAyXTsKKyAgICB9CisgICAgaWYgKGZmX3ZvcmJpc19yZWFkeV9mbG9vcjFfbGlzdChhdmN0eCwgZmMtPmxpc3QsIGZjLT52YWx1ZXMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisKKyAgICB2ZW5jLT5ucmVzaWR1ZXMgPSAxOworICAgIHZlbmMtPnJlc2lkdWVzICA9IGF2X21hbGxvYyhzaXplb2Yodm9yYmlzX2VuY19yZXNpZHVlKSAqIHZlbmMtPm5yZXNpZHVlcyk7CisgICAgaWYgKCF2ZW5jLT5yZXNpZHVlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8vIHNpbmdsZSByZXNpZHVlCisgICAgcmMgPSAmdmVuYy0+cmVzaWR1ZXNbMF07CisgICAgcmMtPnR5cGUgICAgICAgICAgICA9IDI7CisgICAgcmMtPmJlZ2luICAgICAgICAgICA9IDA7CisgICAgcmMtPmVuZCAgICAgICAgICAgICA9IDE2MDA7CisgICAgcmMtPnBhcnRpdGlvbl9zaXplICA9IDMyOworICAgIHJjLT5jbGFzc2lmaWNhdGlvbnMgPSAxMDsKKyAgICByYy0+Y2xhc3Nib29rICAgICAgID0gMTU7CisgICAgcmMtPmJvb2tzICAgICAgICAgICA9IGF2X21hbGxvYyhzaXplb2YoKnJjLT5ib29rcykgKiByYy0+Y2xhc3NpZmljYXRpb25zKTsKKyAgICBpZiAoIXJjLT5ib29rcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgYVsxMF1bOF0gPSB7CisgICAgICAgICAgICB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgfSwKKyAgICAgICAgICAgIHsgLTEsIC0xLCAxNiwgLTEsIC0xLCAtMSwgLTEsIC0xLCB9LAorICAgICAgICAgICAgeyAtMSwgLTEsIDE3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIH0sCisgICAgICAgICAgICB7IC0xLCAtMSwgMTgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgfSwKKyAgICAgICAgICAgIHsgLTEsIC0xLCAxOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCB9LAorICAgICAgICAgICAgeyAtMSwgLTEsIDIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIH0sCisgICAgICAgICAgICB7IC0xLCAtMSwgMjEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgfSwKKyAgICAgICAgICAgIHsgMjIsIDIzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCB9LAorICAgICAgICAgICAgeyAyNCwgMjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIH0sCisgICAgICAgICAgICB7IDI2LCAyNywgMjgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgfSwKKyAgICAgICAgfTsKKyAgICAgICAgbWVtY3B5KHJjLT5ib29rcywgYSwgc2l6ZW9mIGEpOworICAgIH0KKyAgICBpZiAoKHJldCA9IHJlYWR5X3Jlc2lkdWUocmMsIHZlbmMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICB2ZW5jLT5ubWFwcGluZ3MgPSAxOworICAgIHZlbmMtPm1hcHBpbmdzICA9IGF2X21hbGxvYyhzaXplb2Yodm9yYmlzX2VuY19tYXBwaW5nKSAqIHZlbmMtPm5tYXBwaW5ncyk7CisgICAgaWYgKCF2ZW5jLT5tYXBwaW5ncykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8vIHNpbmdsZSBtYXBwaW5nCisgICAgbWMgPSAmdmVuYy0+bWFwcGluZ3NbMF07CisgICAgbWMtPnN1Ym1hcHMgPSAxOworICAgIG1jLT5tdXggICAgID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICogdmVuYy0+Y2hhbm5lbHMpOworICAgIGlmICghbWMtPm11eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmVuYy0+Y2hhbm5lbHM7IGkrKykKKyAgICAgICAgbWMtPm11eFtpXSA9IDA7CisgICAgbWMtPmZsb29yICAgPSBhdl9tYWxsb2Moc2l6ZW9mKGludCkgKiBtYy0+c3VibWFwcyk7CisgICAgbWMtPnJlc2lkdWUgPSBhdl9tYWxsb2Moc2l6ZW9mKGludCkgKiBtYy0+c3VibWFwcyk7CisgICAgaWYgKCFtYy0+Zmxvb3IgfHwgIW1jLT5yZXNpZHVlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZvciAoaSA9IDA7IGkgPCBtYy0+c3VibWFwczsgaSsrKSB7CisgICAgICAgIG1jLT5mbG9vcltpXSAgID0gMDsKKyAgICAgICAgbWMtPnJlc2lkdWVbaV0gPSAwOworICAgIH0KKyAgICBtYy0+Y291cGxpbmdfc3RlcHMgPSB2ZW5jLT5jaGFubmVscyA9PSAyID8gMSA6IDA7CisgICAgbWMtPm1hZ25pdHVkZSAgICAgID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICogbWMtPmNvdXBsaW5nX3N0ZXBzKTsKKyAgICBtYy0+YW5nbGUgICAgICAgICAgPSBhdl9tYWxsb2Moc2l6ZW9mKGludCkgKiBtYy0+Y291cGxpbmdfc3RlcHMpOworICAgIGlmICghbWMtPm1hZ25pdHVkZSB8fCAhbWMtPmFuZ2xlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmIChtYy0+Y291cGxpbmdfc3RlcHMpIHsKKyAgICAgICAgbWMtPm1hZ25pdHVkZVswXSA9IDA7CisgICAgICAgIG1jLT5hbmdsZVswXSAgICAgPSAxOworICAgIH0KKworICAgIHZlbmMtPm5tb2RlcyA9IDE7CisgICAgdmVuYy0+bW9kZXMgID0gYXZfbWFsbG9jKHNpemVvZih2b3JiaXNfZW5jX21vZGUpICogdmVuYy0+bm1vZGVzKTsKKyAgICBpZiAoIXZlbmMtPm1vZGVzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLy8gc2luZ2xlIG1vZGUKKyAgICB2ZW5jLT5tb2Rlc1swXS5ibG9ja2ZsYWcgPSAwOworICAgIHZlbmMtPm1vZGVzWzBdLm1hcHBpbmcgICA9IDA7CisKKyAgICB2ZW5jLT5oYXZlX3NhdmVkID0gMDsKKyAgICB2ZW5jLT5zYXZlZCAgICAgID0gYXZfbWFsbG9jX2FycmF5KHNpemVvZihmbG9hdCkgKiB2ZW5jLT5jaGFubmVscywgKDEgPDwgdmVuYy0+bG9nMl9ibG9ja3NpemVbMV0pIC8gMik7CisgICAgdmVuYy0+c2FtcGxlcyAgICA9IGF2X21hbGxvY19hcnJheShzaXplb2YoZmxvYXQpICogdmVuYy0+Y2hhbm5lbHMsICgxIDw8IHZlbmMtPmxvZzJfYmxvY2tzaXplWzFdKSk7CisgICAgdmVuYy0+Zmxvb3IgICAgICA9IGF2X21hbGxvY19hcnJheShzaXplb2YoZmxvYXQpICogdmVuYy0+Y2hhbm5lbHMsICgxIDw8IHZlbmMtPmxvZzJfYmxvY2tzaXplWzFdKSAvIDIpOworICAgIHZlbmMtPmNvZWZmcyAgICAgPSBhdl9tYWxsb2NfYXJyYXkoc2l6ZW9mKGZsb2F0KSAqIHZlbmMtPmNoYW5uZWxzLCAoMSA8PCB2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVsxXSkgLyAyKTsKKyAgICBpZiAoIXZlbmMtPnNhdmVkIHx8ICF2ZW5jLT5zYW1wbGVzIHx8ICF2ZW5jLT5mbG9vciB8fCAhdmVuYy0+Y29lZmZzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgdmVuYy0+d2luWzBdID0gZmZfdm9yYmlzX3Z3aW5bdmVuYy0+bG9nMl9ibG9ja3NpemVbMF0gLSA2XTsKKyAgICB2ZW5jLT53aW5bMV0gPSBmZl92b3JiaXNfdndpblt2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVsxXSAtIDZdOworCisgICAgaWYgKChyZXQgPSBmZl9tZGN0X2luaXQoJnZlbmMtPm1kY3RbMF0sIHZlbmMtPmxvZzJfYmxvY2tzaXplWzBdLCAwLCAxLjApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBmZl9tZGN0X2luaXQoJnZlbmMtPm1kY3RbMV0sIHZlbmMtPmxvZzJfYmxvY2tzaXplWzFdLCAwLCAxLjApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHV0X2Zsb2F0KFB1dEJpdENvbnRleHQgKnBiLCBmbG9hdCBmKQoreworICAgIGludCBleHAsIG1hbnQ7CisgICAgdWludDMyX3QgcmVzID0gMDsKKyAgICBtYW50ID0gKGludClsZGV4cChmcmV4cChmLCAmZXhwKSwgMjApOworICAgIGV4cCArPSA3ODggLSAyMDsKKyAgICBpZiAobWFudCA8IDApIHsKKyAgICAgICAgcmVzIHw9ICgxVSA8PCAzMSk7CisgICAgICAgIG1hbnQgPSAtbWFudDsKKyAgICB9CisgICAgcmVzIHw9IG1hbnQgfCAoZXhwIDw8IDIxKTsKKyAgICBwdXRfYml0czMyKHBiLCByZXMpOworfQorCitzdGF0aWMgdm9pZCBwdXRfY29kZWJvb2tfaGVhZGVyKFB1dEJpdENvbnRleHQgKnBiLCB2b3JiaXNfZW5jX2NvZGVib29rICpjYikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgb3JkZXJlZCA9IDA7CisKKyAgICBwdXRfYml0cyhwYiwgMjQsIDB4NTY0MzQyKTsgLy9tYWdpYworICAgIHB1dF9iaXRzKHBiLCAxNiwgY2ItPm5kaW1lbnNpb25zKTsKKyAgICBwdXRfYml0cyhwYiwgMjQsIGNiLT5uZW50cmllcyk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgY2ItPm5lbnRyaWVzOyBpKyspCisgICAgICAgIGlmIChjYi0+bGVuc1tpXSA8IGNiLT5sZW5zW2ktMV0pCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaSA9PSBjYi0+bmVudHJpZXMpCisgICAgICAgIG9yZGVyZWQgPSAxOworCisgICAgcHV0X2JpdHMocGIsIDEsIG9yZGVyZWQpOworICAgIGlmIChvcmRlcmVkKSB7CisgICAgICAgIGludCBsZW4gPSBjYi0+bGVuc1swXTsKKyAgICAgICAgcHV0X2JpdHMocGIsIDUsIGxlbiAtIDEpOworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBjYi0+bmVudHJpZXMpIHsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgZm9yIChqID0gMDsgaitpIDwgY2ItPm5lbnRyaWVzOyBqKyspCisgICAgICAgICAgICAgICAgaWYgKGNiLT5sZW5zW2oraV0gIT0gbGVuKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBpbG9nKGNiLT5uZW50cmllcyAtIGkpLCBqKTsKKyAgICAgICAgICAgIGkgKz0gajsKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHNwYXJzZSA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYi0+bmVudHJpZXM7IGkrKykKKyAgICAgICAgICAgIGlmICghY2ItPmxlbnNbaV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChpICE9IGNiLT5uZW50cmllcykKKyAgICAgICAgICAgIHNwYXJzZSA9IDE7CisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCBzcGFyc2UpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYi0+bmVudHJpZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNwYXJzZSkKKyAgICAgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgISFjYi0+bGVuc1tpXSk7CisgICAgICAgICAgICBpZiAoY2ItPmxlbnNbaV0pCisgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIsIDUsIGNiLT5sZW5zW2ldIC0gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdXRfYml0cyhwYiwgNCwgY2ItPmxvb2t1cCk7CisgICAgaWYgKGNiLT5sb29rdXApIHsKKyAgICAgICAgaW50IHRtcCAgPSBjYl9sb29rdXBfdmFscyhjYi0+bG9va3VwLCBjYi0+bmRpbWVuc2lvbnMsIGNiLT5uZW50cmllcyk7CisgICAgICAgIGludCBiaXRzID0gaWxvZyhjYi0+cXVhbnRsaXN0WzBdKTsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgdG1wOyBpKyspCisgICAgICAgICAgICBiaXRzID0gRkZNQVgoYml0cywgaWxvZyhjYi0+cXVhbnRsaXN0W2ldKSk7CisKKyAgICAgICAgcHV0X2Zsb2F0KHBiLCBjYi0+bWluKTsKKyAgICAgICAgcHV0X2Zsb2F0KHBiLCBjYi0+ZGVsdGEpOworCisgICAgICAgIHB1dF9iaXRzKHBiLCA0LCBiaXRzIC0gMSk7CisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCBjYi0+c2VxX3ApOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0bXA7IGkrKykKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBiaXRzLCBjYi0+cXVhbnRsaXN0W2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9mbG9vcl9oZWFkZXIoUHV0Qml0Q29udGV4dCAqcGIsIHZvcmJpc19lbmNfZmxvb3IgKmZjKQoreworICAgIGludCBpOworCisgICAgcHV0X2JpdHMocGIsIDE2LCAxKTsgLy8gdHlwZSwgb25seSBmbG9vcjEgaXMgc3VwcG9ydGVkCisKKyAgICBwdXRfYml0cyhwYiwgNSwgZmMtPnBhcnRpdGlvbnMpOworCisgICAgZm9yIChpID0gMDsgaSA8IGZjLT5wYXJ0aXRpb25zOyBpKyspCisgICAgICAgIHB1dF9iaXRzKHBiLCA0LCBmYy0+cGFydGl0aW9uX3RvX2NsYXNzW2ldKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmYy0+bmNsYXNzZXM7IGkrKykgeworICAgICAgICBpbnQgaiwgYm9va3M7CisKKyAgICAgICAgcHV0X2JpdHMocGIsIDMsIGZjLT5jbGFzc2VzW2ldLmRpbSAtIDEpOworICAgICAgICBwdXRfYml0cyhwYiwgMiwgZmMtPmNsYXNzZXNbaV0uc3ViY2xhc3MpOworCisgICAgICAgIGlmIChmYy0+Y2xhc3Nlc1tpXS5zdWJjbGFzcykKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCA4LCBmYy0+Y2xhc3Nlc1tpXS5tYXN0ZXJib29rKTsKKworICAgICAgICBib29rcyA9ICgxIDw8IGZjLT5jbGFzc2VzW2ldLnN1YmNsYXNzKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYm9va3M7IGorKykKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCA4LCBmYy0+Y2xhc3Nlc1tpXS5ib29rc1tqXSArIDEpOworICAgIH0KKworICAgIHB1dF9iaXRzKHBiLCAyLCBmYy0+bXVsdGlwbGllciAtIDEpOworICAgIHB1dF9iaXRzKHBiLCA0LCBmYy0+cmFuZ2ViaXRzKTsKKworICAgIGZvciAoaSA9IDI7IGkgPCBmYy0+dmFsdWVzOyBpKyspCisgICAgICAgIHB1dF9iaXRzKHBiLCBmYy0+cmFuZ2ViaXRzLCBmYy0+bGlzdFtpXS54KTsKK30KKworc3RhdGljIHZvaWQgcHV0X3Jlc2lkdWVfaGVhZGVyKFB1dEJpdENvbnRleHQgKnBiLCB2b3JiaXNfZW5jX3Jlc2lkdWUgKnJjKQoreworICAgIGludCBpOworCisgICAgcHV0X2JpdHMocGIsIDE2LCByYy0+dHlwZSk7CisKKyAgICBwdXRfYml0cyhwYiwgMjQsIHJjLT5iZWdpbik7CisgICAgcHV0X2JpdHMocGIsIDI0LCByYy0+ZW5kKTsKKyAgICBwdXRfYml0cyhwYiwgMjQsIHJjLT5wYXJ0aXRpb25fc2l6ZSAtIDEpOworICAgIHB1dF9iaXRzKHBiLCA2LCByYy0+Y2xhc3NpZmljYXRpb25zIC0gMSk7CisgICAgcHV0X2JpdHMocGIsIDgsIHJjLT5jbGFzc2Jvb2spOworCisgICAgZm9yIChpID0gMDsgaSA8IHJjLT5jbGFzc2lmaWNhdGlvbnM7IGkrKykgeworICAgICAgICBpbnQgaiwgdG1wID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgIHRtcCB8PSAocmMtPmJvb2tzW2ldW2pdICE9IC0xKSA8PCBqOworCisgICAgICAgIHB1dF9iaXRzKHBiLCAzLCB0bXAgJiA3KTsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIHRtcCA+IDcpOworCisgICAgICAgIGlmICh0bXAgPiA3KQorICAgICAgICAgICAgcHV0X2JpdHMocGIsIDUsIHRtcCA+PiAzKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmMtPmNsYXNzaWZpY2F0aW9uczsgaSsrKSB7CisgICAgICAgIGludCBqOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgaWYgKHJjLT5ib29rc1tpXVtqXSAhPSAtMSkKKyAgICAgICAgICAgICAgICBwdXRfYml0cyhwYiwgOCwgcmMtPmJvb2tzW2ldW2pdKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcHV0X21haW5faGVhZGVyKHZvcmJpc19lbmNfY29udGV4dCAqdmVuYywgdWludDhfdCAqKm91dCkKK3sKKyAgICBpbnQgaTsKKyAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIGludCBsZW4sIGhsZW5zWzNdOworICAgIGludCBidWZmZXJfbGVuID0gNTAwMDA7CisgICAgdWludDhfdCAqYnVmZmVyID0gYXZfbWFsbG9jeihidWZmZXJfbGVuKSwgKnAgPSBidWZmZXI7CisgICAgaWYgKCFidWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvLyBpZGVudGlmaWNhdGlvbiBoZWFkZXIKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgcCwgYnVmZmVyX2xlbik7CisgICAgcHV0X2JpdHMoJnBiLCA4LCAxKTsgLy9tYWdpYworICAgIGZvciAoaSA9IDA7ICJ2b3JiaXMiW2ldOyBpKyspCisgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgInZvcmJpcyJbaV0pOworICAgIHB1dF9iaXRzMzIoJnBiLCAwKTsgLy8gdmVyc2lvbgorICAgIHB1dF9iaXRzKCZwYiwgIDgsIHZlbmMtPmNoYW5uZWxzKTsKKyAgICBwdXRfYml0czMyKCZwYiwgdmVuYy0+c2FtcGxlX3JhdGUpOworICAgIHB1dF9iaXRzMzIoJnBiLCAwKTsgLy8gYml0cmF0ZQorICAgIHB1dF9iaXRzMzIoJnBiLCAwKTsgLy8gYml0cmF0ZQorICAgIHB1dF9iaXRzMzIoJnBiLCAwKTsgLy8gYml0cmF0ZQorICAgIHB1dF9iaXRzKCZwYiwgIDQsIHZlbmMtPmxvZzJfYmxvY2tzaXplWzBdKTsKKyAgICBwdXRfYml0cygmcGIsICA0LCB2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVsxXSk7CisgICAgcHV0X2JpdHMoJnBiLCAgMSwgMSk7IC8vIGZyYW1pbmcKKworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgaGxlbnNbMF0gPSBwdXRfYml0c19jb3VudCgmcGIpID4+IDM7CisgICAgYnVmZmVyX2xlbiAtPSBobGVuc1swXTsKKyAgICBwICs9IGhsZW5zWzBdOworCisgICAgLy8gY29tbWVudCBoZWFkZXIKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgcCwgYnVmZmVyX2xlbik7CisgICAgcHV0X2JpdHMoJnBiLCA4LCAzKTsgLy9tYWdpYworICAgIGZvciAoaSA9IDA7ICJ2b3JiaXMiW2ldOyBpKyspCisgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgInZvcmJpcyJbaV0pOworICAgIHB1dF9iaXRzMzIoJnBiLCAwKTsgLy8gdmVuZG9yIGxlbmd0aCBUT0RPCisgICAgcHV0X2JpdHMzMigmcGIsIDApOyAvLyBhbW91bnQgb2YgY29tbWVudHMKKyAgICBwdXRfYml0cygmcGIsICAxLCAxKTsgLy8gZnJhbWluZworCisgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKyAgICBobGVuc1sxXSA9IHB1dF9iaXRzX2NvdW50KCZwYikgPj4gMzsKKyAgICBidWZmZXJfbGVuIC09IGhsZW5zWzFdOworICAgIHAgKz0gaGxlbnNbMV07CisKKyAgICAvLyBzZXR1cCBoZWFkZXIKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgcCwgYnVmZmVyX2xlbik7CisgICAgcHV0X2JpdHMoJnBiLCA4LCA1KTsgLy9tYWdpYworICAgIGZvciAoaSA9IDA7ICJ2b3JiaXMiW2ldOyBpKyspCisgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgInZvcmJpcyJbaV0pOworCisgICAgLy8gY29kZWJvb2tzCisgICAgcHV0X2JpdHMoJnBiLCA4LCB2ZW5jLT5uY29kZWJvb2tzIC0gMSk7CisgICAgZm9yIChpID0gMDsgaSA8IHZlbmMtPm5jb2RlYm9va3M7IGkrKykKKyAgICAgICAgcHV0X2NvZGVib29rX2hlYWRlcigmcGIsICZ2ZW5jLT5jb2RlYm9va3NbaV0pOworCisgICAgLy8gdGltZSBkb21haW4sIHJlc2VydmVkLCB6ZXJvCisgICAgcHV0X2JpdHMoJnBiLCAgNiwgMCk7CisgICAgcHV0X2JpdHMoJnBiLCAxNiwgMCk7CisKKyAgICAvLyBmbG9vcnMKKyAgICBwdXRfYml0cygmcGIsIDYsIHZlbmMtPm5mbG9vcnMgLSAxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmVuYy0+bmZsb29yczsgaSsrKQorICAgICAgICBwdXRfZmxvb3JfaGVhZGVyKCZwYiwgJnZlbmMtPmZsb29yc1tpXSk7CisKKyAgICAvLyByZXNpZHVlcworICAgIHB1dF9iaXRzKCZwYiwgNiwgdmVuYy0+bnJlc2lkdWVzIC0gMSk7CisgICAgZm9yIChpID0gMDsgaSA8IHZlbmMtPm5yZXNpZHVlczsgaSsrKQorICAgICAgICBwdXRfcmVzaWR1ZV9oZWFkZXIoJnBiLCAmdmVuYy0+cmVzaWR1ZXNbaV0pOworCisgICAgLy8gbWFwcGluZ3MKKyAgICBwdXRfYml0cygmcGIsIDYsIHZlbmMtPm5tYXBwaW5ncyAtIDEpOworICAgIGZvciAoaSA9IDA7IGkgPCB2ZW5jLT5ubWFwcGluZ3M7IGkrKykgeworICAgICAgICB2b3JiaXNfZW5jX21hcHBpbmcgKm1jID0gJnZlbmMtPm1hcHBpbmdzW2ldOworICAgICAgICBpbnQgajsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxNiwgMCk7IC8vIG1hcHBpbmcgdHlwZQorCisgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgbWMtPnN1Ym1hcHMgPiAxKTsKKyAgICAgICAgaWYgKG1jLT5zdWJtYXBzID4gMSkKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgNCwgbWMtPnN1Ym1hcHMgLSAxKTsKKworICAgICAgICBwdXRfYml0cygmcGIsIDEsICEhbWMtPmNvdXBsaW5nX3N0ZXBzKTsKKyAgICAgICAgaWYgKG1jLT5jb3VwbGluZ19zdGVwcykgeworICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCA4LCBtYy0+Y291cGxpbmdfc3RlcHMgLSAxKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtYy0+Y291cGxpbmdfc3RlcHM7IGorKykgeworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgaWxvZyh2ZW5jLT5jaGFubmVscyAtIDEpLCBtYy0+bWFnbml0dWRlW2pdKTsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcGIsIGlsb2codmVuYy0+Y2hhbm5lbHMgLSAxKSwgbWMtPmFuZ2xlW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1dF9iaXRzKCZwYiwgMiwgMCk7IC8vIHJlc2VydmVkCisKKyAgICAgICAgaWYgKG1jLT5zdWJtYXBzID4gMSkKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB2ZW5jLT5jaGFubmVsczsgaisrKQorICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgNCwgbWMtPm11eFtqXSk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG1jLT5zdWJtYXBzOyBqKyspIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgMCk7IC8vIHJlc2VydmVkIHRpbWUgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCA4LCBtYy0+Zmxvb3Jbal0pOworICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCA4LCBtYy0+cmVzaWR1ZVtqXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBtb2RlcworICAgIHB1dF9iaXRzKCZwYiwgNiwgdmVuYy0+bm1vZGVzIC0gMSk7CisgICAgZm9yIChpID0gMDsgaSA8IHZlbmMtPm5tb2RlczsgaSsrKSB7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgdmVuYy0+bW9kZXNbaV0uYmxvY2tmbGFnKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxNiwgMCk7IC8vIHJlc2VydmVkIHdpbmRvdyB0eXBlCisgICAgICAgIHB1dF9iaXRzKCZwYiwgMTYsIDApOyAvLyByZXNlcnZlZCB0cmFuc2Zvcm0gdHlwZQorICAgICAgICBwdXRfYml0cygmcGIsIDgsIHZlbmMtPm1vZGVzW2ldLm1hcHBpbmcpOworICAgIH0KKworICAgIHB1dF9iaXRzKCZwYiwgMSwgMSk7IC8vIGZyYW1pbmcKKworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgaGxlbnNbMl0gPSBwdXRfYml0c19jb3VudCgmcGIpID4+IDM7CisKKyAgICBsZW4gPSBobGVuc1swXSArIGhsZW5zWzFdICsgaGxlbnNbMl07CisgICAgcCA9ICpvdXQgPSBhdl9tYWxsb2N6KDY0ICsgbGVuICsgbGVuLzI1NSk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgKnArKyA9IDI7CisgICAgcCArPSBhdl94aXBobGFjaW5nKHAsIGhsZW5zWzBdKTsKKyAgICBwICs9IGF2X3hpcGhsYWNpbmcocCwgaGxlbnNbMV0pOworICAgIGJ1ZmZlcl9sZW4gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KHAsIGJ1ZmZlciArIGJ1ZmZlcl9sZW4sIGhsZW5zW2ldKTsKKyAgICAgICAgcCArPSBobGVuc1tpXTsKKyAgICAgICAgYnVmZmVyX2xlbiArPSBobGVuc1tpXTsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmYnVmZmVyKTsKKyAgICByZXR1cm4gcCAtICpvdXQ7Cit9CisKK3N0YXRpYyBmbG9hdCBnZXRfZmxvb3JfYXZlcmFnZSh2b3JiaXNfZW5jX2Zsb29yICogZmMsIGZsb2F0ICpjb2VmZnMsIGludCBpKQoreworICAgIGludCBiZWdpbiA9IGZjLT5saXN0W2ZjLT5saXN0W0ZGTUFYKGktMSwgMCldLnNvcnRdLng7CisgICAgaW50IGVuZCAgID0gZmMtPmxpc3RbZmMtPmxpc3RbRkZNSU4oaSsxLCBmYy0+dmFsdWVzIC0gMSldLnNvcnRdLng7CisgICAgaW50IGo7CisgICAgZmxvYXQgYXZlcmFnZSA9IDA7CisKKyAgICBmb3IgKGogPSBiZWdpbjsgaiA8IGVuZDsgaisrKQorICAgICAgICBhdmVyYWdlICs9IGZhYnMoY29lZmZzW2pdKTsKKyAgICByZXR1cm4gYXZlcmFnZSAvIChlbmQgLSBiZWdpbik7Cit9CisKK3N0YXRpYyB2b2lkIGZsb29yX2ZpdCh2b3JiaXNfZW5jX2NvbnRleHQgKnZlbmMsIHZvcmJpc19lbmNfZmxvb3IgKmZjLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb2VmZnMsIHVpbnQxNl90ICpwb3N0cywgaW50IHNhbXBsZXMpCit7CisgICAgaW50IHJhbmdlID0gMjU1IC8gZmMtPm11bHRpcGxpZXIgKyAxOworICAgIGludCBpOworICAgIGZsb2F0IHRvdF9hdmVyYWdlID0gMC4wOworICAgIGZsb2F0IGF2ZXJhZ2VzW01BWF9GTE9PUl9WQUxVRVNdOworICAgIGZvciAoaSA9IDA7IGkgPCBmYy0+dmFsdWVzOyBpKyspIHsKKyAgICAgICAgYXZlcmFnZXNbaV0gPSBnZXRfZmxvb3JfYXZlcmFnZShmYywgY29lZmZzLCBpKTsKKyAgICAgICAgdG90X2F2ZXJhZ2UgKz0gYXZlcmFnZXNbaV07CisgICAgfQorICAgIHRvdF9hdmVyYWdlIC89IGZjLT52YWx1ZXM7CisgICAgdG90X2F2ZXJhZ2UgLz0gdmVuYy0+cXVhbGl0eTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmYy0+dmFsdWVzOyBpKyspIHsKKyAgICAgICAgaW50IHBvc2l0aW9uICA9IGZjLT5saXN0W2ZjLT5saXN0W2ldLnNvcnRdLng7CisgICAgICAgIGZsb2F0IGF2ZXJhZ2UgPSBhdmVyYWdlc1tpXTsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgYXZlcmFnZSA9IHNxcnQodG90X2F2ZXJhZ2UgKiBhdmVyYWdlKSAqIHBvdygxLjI1ZiwgcG9zaXRpb24qMC4wMDVmKTsgLy8gTUFHSUMhCisgICAgICAgIGZvciAoaiA9IDA7IGogPCByYW5nZSAtIDE7IGorKykKKyAgICAgICAgICAgIGlmIChmZl92b3JiaXNfZmxvb3IxX2ludmVyc2VfZGJfdGFibGVbaiAqIGZjLT5tdWx0aXBsaWVyXSA+IGF2ZXJhZ2UpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHBvc3RzW2ZjLT5saXN0W2ldLnNvcnRdID0gajsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcmVuZGVyX3BvaW50KGludCB4MCwgaW50IHkwLCBpbnQgeDEsIGludCB5MSwgaW50IHgpCit7CisgICAgcmV0dXJuIHkwICsgICh4IC0geDApICogKHkxIC0geTApIC8gKHgxIC0geDApOworfQorCitzdGF0aWMgaW50IGZsb29yX2VuY29kZSh2b3JiaXNfZW5jX2NvbnRleHQgKnZlbmMsIHZvcmJpc19lbmNfZmxvb3IgKmZjLAorICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqcGIsIHVpbnQxNl90ICpwb3N0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpmbG9vciwgaW50IHNhbXBsZXMpCit7CisgICAgaW50IHJhbmdlID0gMjU1IC8gZmMtPm11bHRpcGxpZXIgKyAxOworICAgIGludCBjb2RlZFtNQVhfRkxPT1JfVkFMVUVTXTsgLy8gZmlyc3QgMiB2YWx1ZXMgYXJlIHVudXNlZAorICAgIGludCBpLCBjb3VudGVyOworCisgICAgaWYgKHBiLT5zaXplX2luX2JpdHMgLSBwdXRfYml0c19jb3VudChwYikgPCAxICsgMiAqIGlsb2cocmFuZ2UgLSAxKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBwdXRfYml0cyhwYiwgMSwgMSk7IC8vIG5vbiB6ZXJvCisgICAgcHV0X2JpdHMocGIsIGlsb2cocmFuZ2UgLSAxKSwgcG9zdHNbMF0pOworICAgIHB1dF9iaXRzKHBiLCBpbG9nKHJhbmdlIC0gMSksIHBvc3RzWzFdKTsKKyAgICBjb2RlZFswXSA9IGNvZGVkWzFdID0gMTsKKworICAgIGZvciAoaSA9IDI7IGkgPCBmYy0+dmFsdWVzOyBpKyspIHsKKyAgICAgICAgaW50IHByZWRpY3RlZCA9IHJlbmRlcl9wb2ludChmYy0+bGlzdFtmYy0+bGlzdFtpXS5sb3ddLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHNbZmMtPmxpc3RbaV0ubG93XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYy0+bGlzdFtmYy0+bGlzdFtpXS5oaWdoXS54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RzW2ZjLT5saXN0W2ldLmhpZ2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjLT5saXN0W2ldLngpOworICAgICAgICBpbnQgaGlnaHJvb20gPSByYW5nZSAtIHByZWRpY3RlZDsKKyAgICAgICAgaW50IGxvd3Jvb20gPSBwcmVkaWN0ZWQ7CisgICAgICAgIGludCByb29tID0gRkZNSU4oaGlnaHJvb20sIGxvd3Jvb20pOworICAgICAgICBpZiAocHJlZGljdGVkID09IHBvc3RzW2ldKSB7CisgICAgICAgICAgICBjb2RlZFtpXSA9IDA7IC8vIG11c3QgYmUgdXNlZCBsYXRlciBhcyBmbGFnIQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWNvZGVkW2ZjLT5saXN0W2ldLmxvdyBdKQorICAgICAgICAgICAgICAgIGNvZGVkW2ZjLT5saXN0W2ldLmxvdyBdID0gLTE7CisgICAgICAgICAgICBpZiAoIWNvZGVkW2ZjLT5saXN0W2ldLmhpZ2hdKQorICAgICAgICAgICAgICAgIGNvZGVkW2ZjLT5saXN0W2ldLmhpZ2hdID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBvc3RzW2ldID4gcHJlZGljdGVkKSB7CisgICAgICAgICAgICBpZiAocG9zdHNbaV0gLSBwcmVkaWN0ZWQgPiByb29tKQorICAgICAgICAgICAgICAgIGNvZGVkW2ldID0gcG9zdHNbaV0gLSBwcmVkaWN0ZWQgKyBsb3dyb29tOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvZGVkW2ldID0gKHBvc3RzW2ldIC0gcHJlZGljdGVkKSA8PCAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHByZWRpY3RlZCAtIHBvc3RzW2ldID4gcm9vbSkKKyAgICAgICAgICAgICAgICBjb2RlZFtpXSA9IHByZWRpY3RlZCAtIHBvc3RzW2ldICsgaGlnaHJvb20gLSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvZGVkW2ldID0gKChwcmVkaWN0ZWQgLSBwb3N0c1tpXSkgPDwgMSkgLSAxOworICAgICAgICB9CisgICAgfQorCisgICAgY291bnRlciA9IDI7CisgICAgZm9yIChpID0gMDsgaSA8IGZjLT5wYXJ0aXRpb25zOyBpKyspIHsKKyAgICAgICAgdm9yYmlzX2VuY19mbG9vcl9jbGFzcyAqIGMgPSAmZmMtPmNsYXNzZXNbZmMtPnBhcnRpdGlvbl90b19jbGFzc1tpXV07CisgICAgICAgIGludCBrLCBjdmFsID0gMCwgY3N1YiA9IDE8PGMtPnN1YmNsYXNzOworICAgICAgICBpZiAoYy0+c3ViY2xhc3MpIHsKKyAgICAgICAgICAgIHZvcmJpc19lbmNfY29kZWJvb2sgKiBib29rID0gJnZlbmMtPmNvZGVib29rc1tjLT5tYXN0ZXJib29rXTsKKyAgICAgICAgICAgIGludCBjc2hpZnQgPSAwOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGMtPmRpbTsgaysrKSB7CisgICAgICAgICAgICAgICAgaW50IGw7CisgICAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IGNzdWI7IGwrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4dmFsID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMtPmJvb2tzW2xdICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgbWF4dmFsID0gdmVuYy0+Y29kZWJvb2tzW2MtPmJvb2tzW2xdXS5uZW50cmllczsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29kZWQgY291bGQgYmUgLTEsIGJ1dCB0aGlzIHN0aWxsIHdvcmtzLCBjYXVzZSB0aGF0IGlzIDAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVkW2NvdW50ZXIgKyBrXSA8IG1heHZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnQobCAhPSBjc3ViKTsKKyAgICAgICAgICAgICAgICBjdmFsICAgfD0gbCA8PCBjc2hpZnQ7CisgICAgICAgICAgICAgICAgY3NoaWZ0ICs9IGMtPnN1YmNsYXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB1dF9jb2Rld29yZChwYiwgYm9vaywgY3ZhbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGsgPSAwOyBrIDwgYy0+ZGltOyBrKyspIHsKKyAgICAgICAgICAgIGludCBib29rICA9IGMtPmJvb2tzW2N2YWwgJiAoY3N1Yi0xKV07CisgICAgICAgICAgICBpbnQgZW50cnkgPSBjb2RlZFtjb3VudGVyKytdOworICAgICAgICAgICAgY3ZhbCA+Pj0gYy0+c3ViY2xhc3M7CisgICAgICAgICAgICBpZiAoYm9vayA9PSAtMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChlbnRyeSA9PSAtMSkKKyAgICAgICAgICAgICAgICBlbnRyeSA9IDA7CisgICAgICAgICAgICBpZiAocHV0X2NvZGV3b3JkKHBiLCAmdmVuYy0+Y29kZWJvb2tzW2Jvb2tdLCBlbnRyeSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZmX3ZvcmJpc19mbG9vcjFfcmVuZGVyX2xpc3QoZmMtPmxpc3QsIGZjLT52YWx1ZXMsIHBvc3RzLCBjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjLT5tdWx0aXBsaWVyLCBmbG9vciwgc2FtcGxlcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGZsb2F0ICpwdXRfdmVjdG9yKHZvcmJpc19lbmNfY29kZWJvb2sgKmJvb2ssIFB1dEJpdENvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpudW0pCit7CisgICAgaW50IGksIGVudHJ5ID0gLTE7CisgICAgZmxvYXQgZGlzdGFuY2UgPSBGTFRfTUFYOworICAgIGFzc2VydChib29rLT5kaW1lbnNpb25zKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYm9vay0+bmVudHJpZXM7IGkrKykgeworICAgICAgICBmbG9hdCAqIHZlYyA9IGJvb2stPmRpbWVuc2lvbnMgKyBpICogYm9vay0+bmRpbWVuc2lvbnMsIGQgPSBib29rLT5wb3cyW2ldOworICAgICAgICBpbnQgajsKKyAgICAgICAgaWYgKCFib29rLT5sZW5zW2ldKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBib29rLT5uZGltZW5zaW9uczsgaisrKQorICAgICAgICAgICAgZCAtPSB2ZWNbal0gKiBudW1bal07CisgICAgICAgIGlmIChkaXN0YW5jZSA+IGQpIHsKKyAgICAgICAgICAgIGVudHJ5ICAgID0gaTsKKyAgICAgICAgICAgIGRpc3RhbmNlID0gZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocHV0X2NvZGV3b3JkKHBiLCBib29rLCBlbnRyeSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAmYm9vay0+ZGltZW5zaW9uc1tlbnRyeSAqIGJvb2stPm5kaW1lbnNpb25zXTsKK30KKworc3RhdGljIGludCByZXNpZHVlX2VuY29kZSh2b3JiaXNfZW5jX2NvbnRleHQgKnZlbmMsIHZvcmJpc19lbmNfcmVzaWR1ZSAqcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKnBiLCBmbG9hdCAqY29lZmZzLCBpbnQgc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlYWxfY2gpCit7CisgICAgaW50IHBhc3MsIGksIGosIHAsIGs7CisgICAgaW50IHBzaXplICAgICAgPSByYy0+cGFydGl0aW9uX3NpemU7CisgICAgaW50IHBhcnRpdGlvbnMgPSAocmMtPmVuZCAtIHJjLT5iZWdpbikgLyBwc2l6ZTsKKyAgICBpbnQgY2hhbm5lbHMgICA9IChyYy0+dHlwZSA9PSAyKSA/IDEgOiByZWFsX2NoOworICAgIGludCBjbGFzc2VzW01BWF9DSEFOTkVMU11bTlVNX1JFU0lEVUVfUEFSVElUSU9OU107CisgICAgaW50IGNsYXNzd29yZHMgPSB2ZW5jLT5jb2RlYm9va3NbcmMtPmNsYXNzYm9va10ubmRpbWVuc2lvbnM7CisKKyAgICBhdl9hc3NlcnQwKHJjLT50eXBlID09IDIpOworICAgIGF2X2Fzc2VydDAocmVhbF9jaCA9PSAyKTsKKyAgICBmb3IgKHAgPSAwOyBwIDwgcGFydGl0aW9uczsgcCsrKSB7CisgICAgICAgIGZsb2F0IG1heDEgPSAwLjAsIG1heDIgPSAwLjA7CisgICAgICAgIGludCBzID0gcmMtPmJlZ2luICsgcCAqIHBzaXplOworICAgICAgICBmb3IgKGsgPSBzOyBrIDwgcyArIHBzaXplOyBrICs9IDIpIHsKKyAgICAgICAgICAgIG1heDEgPSBGRk1BWChtYXgxLCBmYWJzKGNvZWZmc1sgICAgICAgICAgayAvIHJlYWxfY2hdKSk7CisgICAgICAgICAgICBtYXgyID0gRkZNQVgobWF4MiwgZmFicyhjb2VmZnNbc2FtcGxlcyArIGsgLyByZWFsX2NoXSkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJjLT5jbGFzc2lmaWNhdGlvbnMgLSAxOyBpKyspCisgICAgICAgICAgICBpZiAobWF4MSA8IHJjLT5tYXhlc1tpXVswXSAmJiBtYXgyIDwgcmMtPm1heGVzW2ldWzFdKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjbGFzc2VzWzBdW3BdID0gaTsKKyAgICB9CisKKyAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgODsgcGFzcysrKSB7CisgICAgICAgIHAgPSAwOworICAgICAgICB3aGlsZSAocCA8IHBhcnRpdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChwYXNzID09IDApCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2VuY19jb2RlYm9vayAqIGJvb2sgPSAmdmVuYy0+Y29kZWJvb2tzW3JjLT5jbGFzc2Jvb2tdOworICAgICAgICAgICAgICAgICAgICBpbnQgZW50cnkgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2xhc3N3b3JkczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSAqPSByYy0+Y2xhc3NpZmljYXRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgKz0gY2xhc3Nlc1tqXVtwICsgaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHB1dF9jb2Rld29yZChwYiwgYm9vaywgZW50cnkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2xhc3N3b3JkcyAmJiBwIDwgcGFydGl0aW9uczsgaSsrLCBwKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgbmJvb2sgPSByYy0+Ym9va3NbY2xhc3Nlc1tqXVtwXV1bcGFzc107CisgICAgICAgICAgICAgICAgICAgIHZvcmJpc19lbmNfY29kZWJvb2sgKiBib29rID0gJnZlbmMtPmNvZGVib29rc1tuYm9va107CisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpidWYgPSBjb2VmZnMgKyBzYW1wbGVzKmogKyByYy0+YmVnaW4gKyBwKnBzaXplOworICAgICAgICAgICAgICAgICAgICBpZiAobmJvb2sgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmMtPnR5cGUgPT0gMCB8fCByYy0+dHlwZSA9PSAyKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCEocHNpemUgJSBib29rLT5uZGltZW5zaW9ucykpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyYy0+dHlwZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcHNpemU7IGsgKz0gYm9vay0+bmRpbWVuc2lvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqYSA9IHB1dF92ZWN0b3IoYm9vaywgcGIsICZidWZba10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgYm9vay0+bmRpbWVuc2lvbnM7IGwrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2sgKyBsXSAtPSBhW2xdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHMgPSByYy0+YmVnaW4gKyBwICogcHNpemUsIGExLCBiMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGExID0gKHMgJSByZWFsX2NoKSAqIHNhbXBsZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICBzIC8gcmVhbF9jaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgID0gcmVhbF9jaCAqIHNhbXBsZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcHNpemU7IGsgKz0gYm9vay0+bmRpbWVuc2lvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGltLCBhMiA9IGExLCBiMiA9IGIxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZlY1tNQVhfQ09ERUJPT0tfRElNXSwgKnB2ID0gdmVjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZGltID0gYm9vay0+bmRpbWVuc2lvbnM7IGRpbS0tOyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB2KysgPSBjb2VmZnNbYTIgKyBiMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYTIgKz0gc2FtcGxlcykgPT0gcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdiA9IHB1dF92ZWN0b3IoYm9vaywgcGIsIHZlYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGRpbSA9IGJvb2stPm5kaW1lbnNpb25zOyBkaW0tLTsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmc1thMSArIGIxXSAtPSAqcHYrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhMSArPSBzYW1wbGVzKSA9PSBzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwcGx5X3dpbmRvd19hbmRfbWRjdCh2b3JiaXNfZW5jX2NvbnRleHQgKnZlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKmF1ZGlvLCBpbnQgc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgY2hhbm5lbDsKKyAgICBjb25zdCBmbG9hdCAqIHdpbiA9IHZlbmMtPndpblswXTsKKyAgICBpbnQgd2luZG93X2xlbiA9IDEgPDwgKHZlbmMtPmxvZzJfYmxvY2tzaXplWzBdIC0gMSk7CisgICAgZmxvYXQgbiA9IChmbG9hdCkoMSA8PCB2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVswXSkgLyA0LjA7CisgICAgLy8gRklYTUUgdXNlIGRzcAorCisgICAgaWYgKCF2ZW5jLT5oYXZlX3NhdmVkICYmICFzYW1wbGVzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICh2ZW5jLT5oYXZlX3NhdmVkKSB7CisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB2ZW5jLT5jaGFubmVsczsgY2hhbm5lbCsrKQorICAgICAgICAgICAgbWVtY3B5KHZlbmMtPnNhbXBsZXMgKyBjaGFubmVsICogd2luZG93X2xlbiAqIDIsCisgICAgICAgICAgICAgICAgICAgdmVuYy0+c2F2ZWQgKyBjaGFubmVsICogd2luZG93X2xlbiwgc2l6ZW9mKGZsb2F0KSAqIHdpbmRvd19sZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB2ZW5jLT5jaGFubmVsczsgY2hhbm5lbCsrKQorICAgICAgICAgICAgbWVtc2V0KHZlbmMtPnNhbXBsZXMgKyBjaGFubmVsICogd2luZG93X2xlbiAqIDIsIDAsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSAqIHdpbmRvd19sZW4pOworICAgIH0KKworICAgIGlmIChzYW1wbGVzKSB7CisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB2ZW5jLT5jaGFubmVsczsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICBmbG9hdCAqIG9mZnNldCA9IHZlbmMtPnNhbXBsZXMgKyBjaGFubmVsKndpbmRvd19sZW4qMiArIHdpbmRvd19sZW47CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKQorICAgICAgICAgICAgICAgIG9mZnNldFtpXSA9IGF1ZGlvW2NoYW5uZWxdW2ldIC8gbiAqIHdpblt3aW5kb3dfbGVuIC0gaSAtIDFdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHZlbmMtPmNoYW5uZWxzOyBjaGFubmVsKyspCisgICAgICAgICAgICBtZW1zZXQodmVuYy0+c2FtcGxlcyArIGNoYW5uZWwgKiB3aW5kb3dfbGVuICogMiArIHdpbmRvd19sZW4sCisgICAgICAgICAgICAgICAgICAgMCwgc2l6ZW9mKGZsb2F0KSAqIHdpbmRvd19sZW4pOworICAgIH0KKworICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB2ZW5jLT5jaGFubmVsczsgY2hhbm5lbCsrKQorICAgICAgICB2ZW5jLT5tZGN0WzBdLm1kY3RfY2FsYygmdmVuYy0+bWRjdFswXSwgdmVuYy0+Y29lZmZzICsgY2hhbm5lbCAqIHdpbmRvd19sZW4sCisgICAgICAgICAgICAgICAgICAgICB2ZW5jLT5zYW1wbGVzICsgY2hhbm5lbCAqIHdpbmRvd19sZW4gKiAyKTsKKworICAgIGlmIChzYW1wbGVzKSB7CisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB2ZW5jLT5jaGFubmVsczsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICBmbG9hdCAqb2Zmc2V0ID0gdmVuYy0+c2F2ZWQgKyBjaGFubmVsICogd2luZG93X2xlbjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzOyBpKyspCisgICAgICAgICAgICAgICAgb2Zmc2V0W2ldID0gYXVkaW9bY2hhbm5lbF1baV0gLyBuICogd2luW2ldOworICAgICAgICB9CisgICAgICAgIHZlbmMtPmhhdmVfc2F2ZWQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHZlbmMtPmhhdmVfc2F2ZWQgPSAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB2b3JiaXNfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIHZvcmJpc19lbmNfY29udGV4dCAqdmVuYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZmxvYXQgKiphdWRpbyA9IGZyYW1lID8gKGZsb2F0ICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhIDogTlVMTDsKKyAgICBpbnQgc2FtcGxlcyA9IGZyYW1lID8gZnJhbWUtPm5iX3NhbXBsZXMgOiAwOworICAgIHZvcmJpc19lbmNfbW9kZSAqbW9kZTsKKyAgICB2b3JiaXNfZW5jX21hcHBpbmcgKm1hcHBpbmc7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKCFhcHBseV93aW5kb3dfYW5kX21kY3QodmVuYywgYXVkaW8sIHNhbXBsZXMpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzYW1wbGVzID0gMSA8PCAodmVuYy0+bG9nMl9ibG9ja3NpemVbMF0gLSAxKTsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIDgxOTIpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIGlmIChwYi5zaXplX2luX2JpdHMgLSBwdXRfYml0c19jb3VudCgmcGIpIDwgMSArIGlsb2codmVuYy0+bm1vZGVzIC0gMSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJvdXRwdXQgYnVmZmVyIGlzIHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgLy8gbWFnaWMgYml0CisKKyAgICBwdXRfYml0cygmcGIsIGlsb2codmVuYy0+bm1vZGVzIC0gMSksIDApOyAvLyAwIGJpdHMsIHRoZSBtb2RlCisKKyAgICBtb2RlICAgID0gJnZlbmMtPm1vZGVzWzBdOworICAgIG1hcHBpbmcgPSAmdmVuYy0+bWFwcGluZ3NbbW9kZS0+bWFwcGluZ107CisgICAgaWYgKG1vZGUtPmJsb2NrZmxhZykgeworICAgICAgICBwdXRfYml0cygmcGIsIDEsIDApOworICAgICAgICBwdXRfYml0cygmcGIsIDEsIDApOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCB2ZW5jLT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgIHZvcmJpc19lbmNfZmxvb3IgKmZjID0gJnZlbmMtPmZsb29yc1ttYXBwaW5nLT5mbG9vclttYXBwaW5nLT5tdXhbaV1dXTsKKyAgICAgICAgdWludDE2X3QgcG9zdHNbTUFYX0ZMT09SX1ZBTFVFU107CisgICAgICAgIGZsb29yX2ZpdCh2ZW5jLCBmYywgJnZlbmMtPmNvZWZmc1tpICogc2FtcGxlc10sIHBvc3RzLCBzYW1wbGVzKTsKKyAgICAgICAgaWYgKGZsb29yX2VuY29kZSh2ZW5jLCBmYywgJnBiLCBwb3N0cywgJnZlbmMtPmZsb29yW2kgKiBzYW1wbGVzXSwgc2FtcGxlcykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAib3V0cHV0IGJ1ZmZlciBpcyB0b28gc21hbGxcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCB2ZW5jLT5jaGFubmVscyAqIHNhbXBsZXM7IGkrKykKKyAgICAgICAgdmVuYy0+Y29lZmZzW2ldIC89IHZlbmMtPmZsb29yW2ldOworCisgICAgZm9yIChpID0gMDsgaSA8IG1hcHBpbmctPmNvdXBsaW5nX3N0ZXBzOyBpKyspIHsKKyAgICAgICAgZmxvYXQgKm1hZyA9IHZlbmMtPmNvZWZmcyArIG1hcHBpbmctPm1hZ25pdHVkZVtpXSAqIHNhbXBsZXM7CisgICAgICAgIGZsb2F0ICphbmcgPSB2ZW5jLT5jb2VmZnMgKyBtYXBwaW5nLT5hbmdsZVtpXSAgICAgKiBzYW1wbGVzOworICAgICAgICBpbnQgajsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNhbXBsZXM7IGorKykgeworICAgICAgICAgICAgZmxvYXQgYSA9IGFuZ1tqXTsKKyAgICAgICAgICAgIGFuZ1tqXSAtPSBtYWdbal07CisgICAgICAgICAgICBpZiAobWFnW2pdID4gMCkKKyAgICAgICAgICAgICAgICBhbmdbal0gPSAtYW5nW2pdOworICAgICAgICAgICAgaWYgKGFuZ1tqXSA8IDApCisgICAgICAgICAgICAgICAgbWFnW2pdID0gYTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXNpZHVlX2VuY29kZSh2ZW5jLCAmdmVuYy0+cmVzaWR1ZXNbbWFwcGluZy0+cmVzaWR1ZVttYXBwaW5nLT5tdXhbMF1dXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBiLCB2ZW5jLT5jb2VmZnMsIHNhbXBsZXMsIHZlbmMtPmNoYW5uZWxzKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm91dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworICAgIGF2cGt0LT5zaXplID0gcHV0X2JpdHNfY291bnQoJnBiKSA+PiAzOworCisgICAgYXZwa3QtPmR1cmF0aW9uID0gZmZfc2FtcGxlc190b190aW1lX2Jhc2UoYXZjdHgsIGF2Y3R4LT5mcmFtZV9zaXplKTsKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgaWYgKGZyYW1lLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBhdnBrdC0+cHRzID0gZmZfc2FtcGxlc190b190aW1lX2Jhc2UoYXZjdHgsIGZyYW1lLT5wdHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2cGt0LT5wdHMgPSB2ZW5jLT5uZXh0X3B0czsKKyAgICB9CisgICAgaWYgKGF2cGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHZlbmMtPm5leHRfcHRzID0gYXZwa3QtPnB0cyArIGF2cGt0LT5kdXJhdGlvbjsKKworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IHZvcmJpc19lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHZvcmJpc19lbmNfY29udGV4dCAqdmVuYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBpZiAodmVuYy0+Y29kZWJvb2tzKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmVuYy0+bmNvZGVib29rczsgaSsrKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmdmVuYy0+Y29kZWJvb2tzW2ldLmxlbnMpOworICAgICAgICAgICAgYXZfZnJlZXAoJnZlbmMtPmNvZGVib29rc1tpXS5jb2Rld29yZHMpOworICAgICAgICAgICAgYXZfZnJlZXAoJnZlbmMtPmNvZGVib29rc1tpXS5xdWFudGxpc3QpOworICAgICAgICAgICAgYXZfZnJlZXAoJnZlbmMtPmNvZGVib29rc1tpXS5kaW1lbnNpb25zKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ2ZW5jLT5jb2RlYm9va3NbaV0ucG93Mik7CisgICAgICAgIH0KKyAgICBhdl9mcmVlcCgmdmVuYy0+Y29kZWJvb2tzKTsKKworICAgIGlmICh2ZW5jLT5mbG9vcnMpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2ZW5jLT5uZmxvb3JzOyBpKyspIHsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgaWYgKHZlbmMtPmZsb29yc1tpXS5jbGFzc2VzKQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB2ZW5jLT5mbG9vcnNbaV0ubmNsYXNzZXM7IGorKykKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnZlbmMtPmZsb29yc1tpXS5jbGFzc2VzW2pdLmJvb2tzKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ2ZW5jLT5mbG9vcnNbaV0uY2xhc3Nlcyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmdmVuYy0+Zmxvb3JzW2ldLnBhcnRpdGlvbl90b19jbGFzcyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmdmVuYy0+Zmxvb3JzW2ldLmxpc3QpOworICAgICAgICB9CisgICAgYXZfZnJlZXAoJnZlbmMtPmZsb29ycyk7CisKKyAgICBpZiAodmVuYy0+cmVzaWR1ZXMpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2ZW5jLT5ucmVzaWR1ZXM7IGkrKykgeworICAgICAgICAgICAgYXZfZnJlZXAoJnZlbmMtPnJlc2lkdWVzW2ldLmJvb2tzKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ2ZW5jLT5yZXNpZHVlc1tpXS5tYXhlcyk7CisgICAgICAgIH0KKyAgICBhdl9mcmVlcCgmdmVuYy0+cmVzaWR1ZXMpOworCisgICAgaWYgKHZlbmMtPm1hcHBpbmdzKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmVuYy0+bm1hcHBpbmdzOyBpKyspIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ2ZW5jLT5tYXBwaW5nc1tpXS5tdXgpOworICAgICAgICAgICAgYXZfZnJlZXAoJnZlbmMtPm1hcHBpbmdzW2ldLmZsb29yKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ2ZW5jLT5tYXBwaW5nc1tpXS5yZXNpZHVlKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ2ZW5jLT5tYXBwaW5nc1tpXS5tYWduaXR1ZGUpOworICAgICAgICAgICAgYXZfZnJlZXAoJnZlbmMtPm1hcHBpbmdzW2ldLmFuZ2xlKTsKKyAgICAgICAgfQorICAgIGF2X2ZyZWVwKCZ2ZW5jLT5tYXBwaW5ncyk7CisKKyAgICBhdl9mcmVlcCgmdmVuYy0+bW9kZXMpOworCisgICAgYXZfZnJlZXAoJnZlbmMtPnNhdmVkKTsKKyAgICBhdl9mcmVlcCgmdmVuYy0+c2FtcGxlcyk7CisgICAgYXZfZnJlZXAoJnZlbmMtPmZsb29yKTsKKyAgICBhdl9mcmVlcCgmdmVuYy0+Y29lZmZzKTsKKworICAgIGZmX21kY3RfZW5kKCZ2ZW5jLT5tZGN0WzBdKTsKKyAgICBmZl9tZGN0X2VuZCgmdmVuYy0+bWRjdFsxXSk7CisKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmV4dHJhZGF0YSk7CisKKyAgICByZXR1cm4gMCA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2b3JiaXNfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHZvcmJpc19lbmNfY29udGV4dCAqdmVuYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgIT0gMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkN1cnJlbnQgRkZtcGVnIFZvcmJpcyBlbmNvZGVyIG9ubHkgc3VwcG9ydHMgMiBjaGFubmVscy5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBjcmVhdGVfdm9yYmlzX2NvbnRleHQodmVuYywgYXZjdHgpKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBhdmN0eC0+Yml0X3JhdGUgPSAwOworICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FTQ0FMRSkKKyAgICAgICAgdmVuYy0+cXVhbGl0eSA9IGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSAvIChmbG9hdClGRl9RUDJMQU1CREE7CisgICAgZWxzZQorICAgICAgICB2ZW5jLT5xdWFsaXR5ID0gODsKKyAgICB2ZW5jLT5xdWFsaXR5ICo9IHZlbmMtPnF1YWxpdHk7CisKKyAgICBpZiAoKHJldCA9IHB1dF9tYWluX2hlYWRlcih2ZW5jLCAodWludDhfdCoqKSZhdmN0eC0+ZXh0cmFkYXRhKSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHJldDsKKworICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gMSA8PCAodmVuYy0+bG9nMl9ibG9ja3NpemVbMF0gLSAxKTsKKworICAgIHJldHVybiAwOworZXJyb3I6CisgICAgdm9yYmlzX2VuY29kZV9jbG9zZShhdmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworQVZDb2RlYyBmZl92b3JiaXNfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidm9yYmlzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVm9yYmlzIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZPUkJJUywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yodm9yYmlzX2VuY19jb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2b3JiaXNfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gdm9yYmlzX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSB2b3JiaXNfZW5jb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9ERUxBWSB8IENPREVDX0NBUF9FWFBFUklNRU5UQUwsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnAzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92cDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNhODNhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnAzLmMKQEAgLTAsMCArMSwyNTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE9uMiBWUDMgVmlkZW8gRGVjb2RlcgorICoKKyAqIFZQMyBWaWRlbyBEZWNvZGVyIGJ5IE1pa2UgTWVsYW5zb24gKG1pa2UgYXQgbXVsdGltZWRpYS5jeCkKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBWUDMgY29kaW5nIHByb2Nlc3MsIHZpc2l0OgorICogICBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1PbjJfVlAzCisgKgorICogVGhlb3JhIGRlY29kZXIgYnkgQWxleCBCZXJlZ3N6YXN6aQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJocGVsZHNwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAidmlkZW9kc3AuaCIKKyNpbmNsdWRlICJ2cDNkYXRhLmgiCisjaW5jbHVkZSAidnAzZHNwLmgiCisjaW5jbHVkZSAieGlwaC5oIgorCisjZGVmaW5lIEZSQUdNRU5UX1BJWEVMUyA4CisKKy8vIEZJWE1FIHNwbGl0IHRoaW5ncyBvdXQgaW50byB0aGVpciBvd24gYXJyYXlzCit0eXBlZGVmIHN0cnVjdCBWcDNGcmFnbWVudCB7CisgICAgaW50MTZfdCBkYzsKKyAgICB1aW50OF90IGNvZGluZ19tZXRob2Q7CisgICAgdWludDhfdCBxcGk7Cit9IFZwM0ZyYWdtZW50OworCisjZGVmaW5lIFNCX05PVF9DT0RFRCAgICAgICAgMAorI2RlZmluZSBTQl9QQVJUSUFMTFlfQ09ERUQgIDEKKyNkZWZpbmUgU0JfRlVMTFlfQ09ERUQgICAgICAyCisKKy8vIFRoaXMgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc2luZ2xlIGxvbmcgYml0IHJ1biB0aGF0IGNhbiBiZSBlbmNvZGVkCisvLyBmb3Igc3VwZXJibG9jayBjb2Rpbmcgb3IgYmxvY2sgcXBzLiBUaGVvcmEgc3BlY2lhbC1jYXNlcyB0aGlzIHRvIHJlYWQgYQorLy8gYml0IGluc3RlYWQgb2YgZmxpcHBpbmcgdGhlIGN1cnJlbnQgYml0IHRvIGFsbG93IGZvciBydW5zIGxvbmdlciB0aGFuIDQxMjkuCisjZGVmaW5lIE1BWElNVU1fTE9OR19CSVRfUlVOIDQxMjkKKworI2RlZmluZSBNT0RFX0lOVEVSX05PX01WICAgICAgMAorI2RlZmluZSBNT0RFX0lOVFJBICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFX0lOVEVSX1BMVVNfTVYgICAgMgorI2RlZmluZSBNT0RFX0lOVEVSX0xBU1RfTVYgICAgMworI2RlZmluZSBNT0RFX0lOVEVSX1BSSU9SX0xBU1QgNAorI2RlZmluZSBNT0RFX1VTSU5HX0dPTERFTiAgICAgNQorI2RlZmluZSBNT0RFX0dPTERFTl9NViAgICAgICAgNgorI2RlZmluZSBNT0RFX0lOVEVSX0ZPVVJNViAgICAgNworI2RlZmluZSBDT0RJTkdfTU9ERV9DT1VOVCAgICAgOAorCisvKiBzcGVjaWFsIGludGVybmFsIG1vZGUgKi8KKyNkZWZpbmUgTU9ERV9DT1BZICAgICAgICAgICAgIDgKKworc3RhdGljIGludCB0aGVvcmFfZGVjb2RlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEdldEJpdENvbnRleHQgKmdiKTsKK3N0YXRpYyBpbnQgdGhlb3JhX2RlY29kZV90YWJsZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYik7CisKKworLyogVGhlcmUgYXJlIDYgcHJlc2V0IHNjaGVtZXMsIHBsdXMgYSBmcmVlLWZvcm0gc2NoZW1lICovCitzdGF0aWMgY29uc3QgaW50IE1vZGVBbHBoYWJldFs2XVtDT0RJTkdfTU9ERV9DT1VOVF0gPSB7CisgICAgLyogc2NoZW1lIDE6IExhc3QgbW90aW9uIHZlY3RvciBkb21pbmF0ZXMgKi8KKyAgICB7IE1PREVfSU5URVJfTEFTVF9NViwgICAgTU9ERV9JTlRFUl9QUklPUl9MQVNULAorICAgICAgTU9ERV9JTlRFUl9QTFVTX01WLCAgICBNT0RFX0lOVEVSX05PX01WLAorICAgICAgTU9ERV9JTlRSQSwgICAgICAgICAgICBNT0RFX1VTSU5HX0dPTERFTiwKKyAgICAgIE1PREVfR09MREVOX01WLCAgICAgICAgTU9ERV9JTlRFUl9GT1VSTVYgfSwKKworICAgIC8qIHNjaGVtZSAyICovCisgICAgeyBNT0RFX0lOVEVSX0xBU1RfTVYsICAgIE1PREVfSU5URVJfUFJJT1JfTEFTVCwKKyAgICAgIE1PREVfSU5URVJfTk9fTVYsICAgICAgTU9ERV9JTlRFUl9QTFVTX01WLAorICAgICAgTU9ERV9JTlRSQSwgICAgICAgICAgICBNT0RFX1VTSU5HX0dPTERFTiwKKyAgICAgIE1PREVfR09MREVOX01WLCAgICAgICAgTU9ERV9JTlRFUl9GT1VSTVYgfSwKKworICAgIC8qIHNjaGVtZSAzICovCisgICAgeyBNT0RFX0lOVEVSX0xBU1RfTVYsICAgIE1PREVfSU5URVJfUExVU19NViwKKyAgICAgIE1PREVfSU5URVJfUFJJT1JfTEFTVCwgTU9ERV9JTlRFUl9OT19NViwKKyAgICAgIE1PREVfSU5UUkEsICAgICAgICAgICAgTU9ERV9VU0lOR19HT0xERU4sCisgICAgICBNT0RFX0dPTERFTl9NViwgICAgICAgIE1PREVfSU5URVJfRk9VUk1WIH0sCisKKyAgICAvKiBzY2hlbWUgNCAqLworICAgIHsgTU9ERV9JTlRFUl9MQVNUX01WLCAgICBNT0RFX0lOVEVSX1BMVVNfTVYsCisgICAgICBNT0RFX0lOVEVSX05PX01WLCAgICAgIE1PREVfSU5URVJfUFJJT1JfTEFTVCwKKyAgICAgIE1PREVfSU5UUkEsICAgICAgICAgICAgTU9ERV9VU0lOR19HT0xERU4sCisgICAgICBNT0RFX0dPTERFTl9NViwgICAgICAgIE1PREVfSU5URVJfRk9VUk1WIH0sCisKKyAgICAvKiBzY2hlbWUgNTogTm8gbW90aW9uIHZlY3RvciBkb21pbmF0ZXMgKi8KKyAgICB7IE1PREVfSU5URVJfTk9fTVYsICAgICAgTU9ERV9JTlRFUl9MQVNUX01WLAorICAgICAgTU9ERV9JTlRFUl9QUklPUl9MQVNULCBNT0RFX0lOVEVSX1BMVVNfTVYsCisgICAgICBNT0RFX0lOVFJBLCAgICAgICAgICAgIE1PREVfVVNJTkdfR09MREVOLAorICAgICAgTU9ERV9HT0xERU5fTVYsICAgICAgICBNT0RFX0lOVEVSX0ZPVVJNViB9LAorCisgICAgLyogc2NoZW1lIDYgKi8KKyAgICB7IE1PREVfSU5URVJfTk9fTVYsICAgICAgTU9ERV9VU0lOR19HT0xERU4sCisgICAgICBNT0RFX0lOVEVSX0xBU1RfTVYsICAgIE1PREVfSU5URVJfUFJJT1JfTEFTVCwKKyAgICAgIE1PREVfSU5URVJfUExVU19NViwgICAgTU9ERV9JTlRSQSwKKyAgICAgIE1PREVfR09MREVOX01WLCAgICAgICAgTU9ERV9JTlRFUl9GT1VSTVYgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGhpbGJlcnRfb2Zmc2V0WzE2XVsyXSA9IHsKKyAgICB7IDAsIDAgfSwgeyAxLCAwIH0sIHsgMSwgMSB9LCB7IDAsIDEgfSwKKyAgICB7IDAsIDIgfSwgeyAwLCAzIH0sIHsgMSwgMyB9LCB7IDEsIDIgfSwKKyAgICB7IDIsIDIgfSwgeyAyLCAzIH0sIHsgMywgMyB9LCB7IDMsIDIgfSwKKyAgICB7IDMsIDEgfSwgeyAyLCAxIH0sIHsgMiwgMCB9LCB7IDMsIDAgfQorfTsKKworI2RlZmluZSBNSU5fREVRVUFOVF9WQUwgMgorCit0eXBlZGVmIHN0cnVjdCBWcDNEZWNvZGVDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgaW50IHRoZW9yYSwgdGhlb3JhX3RhYmxlczsKKyAgICBpbnQgdmVyc2lvbjsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgY2hyb21hX3hfc2hpZnQsIGNocm9tYV95X3NoaWZ0OworICAgIFRocmVhZEZyYW1lIGdvbGRlbl9mcmFtZTsKKyAgICBUaHJlYWRGcmFtZSBsYXN0X2ZyYW1lOworICAgIFRocmVhZEZyYW1lIGN1cnJlbnRfZnJhbWU7CisgICAgaW50IGtleWZyYW1lOworICAgIHVpbnQ4X3QgaWRjdF9wZXJtdXRhdGlvbls2NF07CisgICAgdWludDhfdCBpZGN0X3NjYW50YWJsZVs2NF07CisgICAgSHBlbERTUENvbnRleHQgaGRzcDsKKyAgICBWaWRlb0RTUENvbnRleHQgdmRzcDsKKyAgICBWUDNEU1BDb250ZXh0IHZwM2RzcDsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrKVs2NF07CisgICAgaW50IGZsaXBwZWRfaW1hZ2U7CisgICAgaW50IGxhc3Rfc2xpY2VfZW5kOworICAgIGludCBza2lwX2xvb3BfZmlsdGVyOworCisgICAgaW50IHFwc1szXTsKKyAgICBpbnQgbnFwczsKKyAgICBpbnQgbGFzdF9xcHNbM107CisKKyAgICBpbnQgc3VwZXJibG9ja19jb3VudDsKKyAgICBpbnQgeV9zdXBlcmJsb2NrX3dpZHRoOworICAgIGludCB5X3N1cGVyYmxvY2tfaGVpZ2h0OworICAgIGludCB5X3N1cGVyYmxvY2tfY291bnQ7CisgICAgaW50IGNfc3VwZXJibG9ja193aWR0aDsKKyAgICBpbnQgY19zdXBlcmJsb2NrX2hlaWdodDsKKyAgICBpbnQgY19zdXBlcmJsb2NrX2NvdW50OworICAgIGludCB1X3N1cGVyYmxvY2tfc3RhcnQ7CisgICAgaW50IHZfc3VwZXJibG9ja19zdGFydDsKKyAgICB1bnNpZ25lZCBjaGFyICpzdXBlcmJsb2NrX2NvZGluZzsKKworICAgIGludCBtYWNyb2Jsb2NrX2NvdW50OworICAgIGludCBtYWNyb2Jsb2NrX3dpZHRoOworICAgIGludCBtYWNyb2Jsb2NrX2hlaWdodDsKKworICAgIGludCBmcmFnbWVudF9jb3VudDsKKyAgICBpbnQgZnJhZ21lbnRfd2lkdGhbMl07CisgICAgaW50IGZyYWdtZW50X2hlaWdodFsyXTsKKworICAgIFZwM0ZyYWdtZW50ICphbGxfZnJhZ21lbnRzOworICAgIGludCBmcmFnbWVudF9zdGFydFszXTsKKyAgICBpbnQgZGF0YV9vZmZzZXRbM107CisKKyAgICBpbnQ4X3QgKCptb3Rpb25fdmFsWzJdKVsyXTsKKworICAgIC8qIHRhYmxlcyAqLworICAgIHVpbnQxNl90IGNvZGVkX2RjX3NjYWxlX2ZhY3Rvcls2NF07CisgICAgdWludDMyX3QgY29kZWRfYWNfc2NhbGVfZmFjdG9yWzY0XTsKKyAgICB1aW50OF90IGJhc2VfbWF0cml4WzM4NF1bNjRdOworICAgIHVpbnQ4X3QgcXJfY291bnRbMl1bM107CisgICAgdWludDhfdCBxcl9zaXplWzJdWzNdWzY0XTsKKyAgICB1aW50MTZfdCBxcl9iYXNlWzJdWzNdWzY0XTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCB0b2tlbnMgaW4gYml0c3RyZWFtIG9yZGVyLiBSZW9yZGVyaW5nIHRha2VzIHBsYWNlCisgICAgICogYnkgcHVsbGluZyBmcm9tIGVhY2ggbGV2ZWwgZHVyaW5nIElEQ1QuIEFzIGEgY29uc2VxdWVuY2UsIElEQ1QgbXVzdCBiZQorICAgICAqIGluIEhpbGJlcnQgb3JkZXIsIG1ha2luZyB0aGUgbWluaW11bSBzbGljZSBoZWlnaHQgNjQgZm9yIDQ6MjowIGFuZCAzMgorICAgICAqIG90aGVyd2lzZS4gVGhlIDMyIGRpZmZlcmVudCB0b2tlbnMgd2l0aCB1cCB0byAxMiBiaXRzIG9mIGV4dHJhZGF0YSBhcmUKKyAgICAgKiBjb2xsYXBzZWQgaW50byAzIHR5cGVzLCBwYWNrZWQgYXMgZm9sbG93czoKKyAgICAgKiAgIChmcm9tIHRoZSBsb3cgdG8gaGlnaCBiaXRzKQorICAgICAqCisgICAgICogMiBiaXRzOiB0eXBlICgwLDEsMikKKyAgICAgKiAgIDA6IEVPQiBydW4sIDE0IGJpdHMgZm9yIHJ1biBsZW5ndGggKDEyIG5lZWRlZCkKKyAgICAgKiAgIDE6IHplcm8gcnVuLCA3IGJpdHMgZm9yIHJ1biBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgICAgICA3IGJpdHMgZm9yIHRoZSBuZXh0IGNvZWZmaWNpZW50ICgzIG5lZWRlZCkKKyAgICAgKiAgIDI6IGNvZWZmaWNpZW50LCAxNCBiaXRzICgxMSBuZWVkZWQpCisgICAgICoKKyAgICAgKiBDb2VmZmljaWVudHMgYXJlIHNpZ25lZCwgc28gYXJlIHBhY2tlZCBpbiB0aGUgaGlnaGVzdCBiaXRzIGZvciBhdXRvbWF0aWMKKyAgICAgKiBzaWduIGV4dGVuc2lvbi4KKyAgICAgKi8KKyAgICBpbnQxNl90ICpkY3RfdG9rZW5zWzNdWzY0XTsKKyAgICBpbnQxNl90ICpkY3RfdG9rZW5zX2Jhc2U7CisjZGVmaW5lIFRPS0VOX0VPQihlb2JfcnVuKSAgICAgICAgICAgICAgKChlb2JfcnVuKSA8PCAyKQorI2RlZmluZSBUT0tFTl9aRVJPX1JVTihjb2VmZiwgemVyb19ydW4pICgoKGNvZWZmKSA8PCA5KSArICgoemVyb19ydW4pIDw8IDIpICsgMSkKKyNkZWZpbmUgVE9LRU5fQ09FRkYoY29lZmYpICAgICAgICAgICAgICAoKChjb2VmZikgPDwgMikgKyAyKQorCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGNvbnRhaW4gRENUIGNvZWZmaWNpZW50cyBhdAorICAgICAqIHRoZSBnaXZlbiBsZXZlbCBvciBoaWdoZXIKKyAgICAgKi8KKyAgICBpbnQgbnVtX2NvZGVkX2ZyYWdzWzNdWzY0XTsKKyAgICBpbnQgdG90YWxfbnVtX2NvZGVkX2ZyYWdzOworCisgICAgLyogdGhpcyBpcyBhIGxpc3Qgb2YgaW5kZXhlcyBpbnRvIHRoZSBhbGxfZnJhZ21lbnRzIGFycmF5IGluZGljYXRpbmcKKyAgICAgKiB3aGljaCBvZiB0aGUgZnJhZ21lbnRzIGFyZSBjb2RlZCAqLworICAgIGludCAqY29kZWRfZnJhZ21lbnRfbGlzdFszXTsKKworICAgIFZMQyBkY192bGNbMTZdOworICAgIFZMQyBhY192bGNfMVsxNl07CisgICAgVkxDIGFjX3ZsY18yWzE2XTsKKyAgICBWTEMgYWNfdmxjXzNbMTZdOworICAgIFZMQyBhY192bGNfNFsxNl07CisKKyAgICBWTEMgc3VwZXJibG9ja19ydW5fbGVuZ3RoX3ZsYzsKKyAgICBWTEMgZnJhZ21lbnRfcnVuX2xlbmd0aF92bGM7CisgICAgVkxDIG1vZGVfY29kZV92bGM7CisgICAgVkxDIG1vdGlvbl92ZWN0b3JfdmxjOworCisgICAgLyogdGhlc2UgYXJyYXlzIG5lZWQgdG8gYmUgb24gMTYtYnl0ZSBib3VuZGFyaWVzIHNpbmNlIFNTRTIgb3BlcmF0aW9ucworICAgICAqIGluZGV4IGludG8gdGhlbSAqLworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgcW1hdClbM11bMl1bM11bNjRdOyAgICAgLy8vPCBxbWF0W3FwaV1baXNfaW50ZXJdW3BsYW5lXQorCisgICAgLyogVGhpcyB0YWJsZSBjb250YWlucyBzdXBlcmJsb2NrX2NvdW50ICogMTYgZW50cmllcy4gRWFjaCBzZXQgb2YgMTYKKyAgICAgKiBudW1iZXJzIGNvcnJlc3BvbmRzIHRvIHRoZSBmcmFnbWVudCBpbmRleGVzIDAuLjE1IG9mIHRoZSBzdXBlcmJsb2NrLgorICAgICAqIEFuIGVudHJ5IHdpbGwgYmUgLTEgdG8gaW5kaWNhdGUgdGhhdCBubyBlbnRyeSBjb3JyZXNwb25kcyB0byB0aGF0CisgICAgICogaW5kZXguICovCisgICAgaW50ICpzdXBlcmJsb2NrX2ZyYWdtZW50czsKKworICAgIC8qIFRoaXMgaXMgYW4gYXJyYXkgdGhhdCBpbmRpY2F0ZXMgaG93IGEgcGFydGljdWxhciBtYWNyb2Jsb2NrCisgICAgICogaXMgY29kZWQuICovCisgICAgdW5zaWduZWQgY2hhciAqbWFjcm9ibG9ja19jb2Rpbmc7CisKKyAgICB1aW50OF90ICplZGdlX2VtdV9idWZmZXI7CisKKyAgICAvKiBIdWZmbWFuIGRlY29kZSAqLworICAgIGludCBodGk7CisgICAgdW5zaWduZWQgaW50IGhiaXRzOworICAgIGludCBlbnRyaWVzOworICAgIGludCBodWZmX2NvZGVfc2l6ZTsKKyAgICB1aW50MzJfdCBodWZmbWFuX3RhYmxlWzgwXVszMl1bMl07CisKKyAgICB1aW50OF90IGZpbHRlcl9saW1pdF92YWx1ZXNbNjRdOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCBpbnQsIGJvdW5kaW5nX3ZhbHVlc19hcnJheSlbMjU2ICsgMl07Cit9IFZwM0RlY29kZUNvbnRleHQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZQMyBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZnJlZV90YWJsZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZwM0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJnMtPnN1cGVyYmxvY2tfY29kaW5nKTsKKyAgICBhdl9mcmVlcCgmcy0+YWxsX2ZyYWdtZW50cyk7CisgICAgYXZfZnJlZXAoJnMtPmNvZGVkX2ZyYWdtZW50X2xpc3RbMF0pOworICAgIGF2X2ZyZWVwKCZzLT5kY3RfdG9rZW5zX2Jhc2UpOworICAgIGF2X2ZyZWVwKCZzLT5zdXBlcmJsb2NrX2ZyYWdtZW50cyk7CisgICAgYXZfZnJlZXAoJnMtPm1hY3JvYmxvY2tfY29kaW5nKTsKKyAgICBhdl9mcmVlcCgmcy0+bW90aW9uX3ZhbFswXSk7CisgICAgYXZfZnJlZXAoJnMtPm1vdGlvbl92YWxbMV0pOworfQorCitzdGF0aWMgdm9pZCB2cDNfZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWcDNEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChzLT5nb2xkZW5fZnJhbWUuZikKKyAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGF2Y3R4LCAmcy0+Z29sZGVuX2ZyYW1lKTsKKyAgICBpZiAocy0+bGFzdF9mcmFtZS5mKQorICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoYXZjdHgsICZzLT5sYXN0X2ZyYW1lKTsKKyAgICBpZiAocy0+Y3VycmVudF9mcmFtZS5mKQorICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoYXZjdHgsICZzLT5jdXJyZW50X2ZyYW1lKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHZwM19kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWcDNEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZyZWVfdGFibGVzKGF2Y3R4KTsKKyAgICBhdl9mcmVlcCgmcy0+ZWRnZV9lbXVfYnVmZmVyKTsKKworICAgIHMtPnRoZW9yYV90YWJsZXMgPSAwOworCisgICAgLyogcmVsZWFzZSBhbGwgZnJhbWVzICovCisgICAgdnAzX2RlY29kZV9mbHVzaChhdmN0eCk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+Y3VycmVudF9mcmFtZS5mKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5sYXN0X2ZyYW1lLmYpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmdvbGRlbl9mcmFtZS5mKTsKKworICAgIGlmIChhdmN0eC0+aW50ZXJuYWwtPmlzX2NvcHkpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgZmZfZnJlZV92bGMoJnMtPmRjX3ZsY1tpXSk7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZzLT5hY192bGNfMVtpXSk7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZzLT5hY192bGNfMltpXSk7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZzLT5hY192bGNfM1tpXSk7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZzLT5hY192bGNfNFtpXSk7CisgICAgfQorCisgICAgZmZfZnJlZV92bGMoJnMtPnN1cGVyYmxvY2tfcnVuX2xlbmd0aF92bGMpOworICAgIGZmX2ZyZWVfdmxjKCZzLT5mcmFnbWVudF9ydW5fbGVuZ3RoX3ZsYyk7CisgICAgZmZfZnJlZV92bGMoJnMtPm1vZGVfY29kZV92bGMpOworICAgIGZmX2ZyZWVfdmxjKCZzLT5tb3Rpb25fdmVjdG9yX3ZsYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgYWxsIG9mIHRoZSB2YXJpb3VzIGJsb2NrcyBtYXBwaW5nczoKKyAqIHN1cGVyYmxvY2tzIDwtPiBmcmFnbWVudHMsIG1hY3JvYmxvY2tzIDwtPiBmcmFnbWVudHMsCisgKiBzdXBlcmJsb2NrcyA8LT4gbWFjcm9ibG9ja3MKKyAqCisgKiBAcmV0dXJuIDAgaXMgc3VjY2Vzc2Z1bDsgcmV0dXJucyAxIGlmICphbnl0aGluZyogd2VudCB3cm9uZy4KKyAqLworc3RhdGljIGludCBpbml0X2Jsb2NrX21hcHBpbmcoVnAzRGVjb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgc2JfeCwgc2JfeSwgcGxhbmU7CisgICAgaW50IHgsIHksIGksIGogPSAwOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMzsgcGxhbmUrKykgeworICAgICAgICBpbnQgc2Jfd2lkdGggICAgPSBwbGFuZSA/IHMtPmNfc3VwZXJibG9ja193aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHMtPnlfc3VwZXJibG9ja193aWR0aDsKKyAgICAgICAgaW50IHNiX2hlaWdodCAgID0gcGxhbmUgPyBzLT5jX3N1cGVyYmxvY2tfaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcy0+eV9zdXBlcmJsb2NrX2hlaWdodDsKKyAgICAgICAgaW50IGZyYWdfd2lkdGggID0gcy0+ZnJhZ21lbnRfd2lkdGhbISFwbGFuZV07CisgICAgICAgIGludCBmcmFnX2hlaWdodCA9IHMtPmZyYWdtZW50X2hlaWdodFshIXBsYW5lXTsKKworICAgICAgICBmb3IgKHNiX3kgPSAwOyBzYl95IDwgc2JfaGVpZ2h0OyBzYl95KyspCisgICAgICAgICAgICBmb3IgKHNiX3ggPSAwOyBzYl94IDwgc2Jfd2lkdGg7IHNiX3grKykKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB4ID0gNCAqIHNiX3ggKyBoaWxiZXJ0X29mZnNldFtpXVswXTsKKyAgICAgICAgICAgICAgICAgICAgeSA9IDQgKiBzYl95ICsgaGlsYmVydF9vZmZzZXRbaV1bMV07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPCBmcmFnX3dpZHRoICYmIHkgPCBmcmFnX2hlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN1cGVyYmxvY2tfZnJhZ21lbnRzW2orK10gPSBzLT5mcmFnbWVudF9zdGFydFtwbGFuZV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgKiBmcmFnX3dpZHRoICsgeDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3VwZXJibG9ja19mcmFnbWVudHNbaisrXSA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsgIC8qIHN1Y2Nlc3NmdWwgcGF0aCBvdXQgKi8KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgZGVxdWFudGl6YXRpb24gdGFibGVzIHVzZWQgZm9yIGEgcGFydGljdWxhcgorICogZnJhbWUuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfZGVxdWFudGl6ZXIoVnAzRGVjb2RlQ29udGV4dCAqcywgaW50IHFwaSkKK3sKKyAgICBpbnQgYWNfc2NhbGVfZmFjdG9yID0gcy0+Y29kZWRfYWNfc2NhbGVfZmFjdG9yW3MtPnFwc1txcGldXTsKKyAgICBpbnQgZGNfc2NhbGVfZmFjdG9yID0gcy0+Y29kZWRfZGNfc2NhbGVfZmFjdG9yW3MtPnFwc1txcGldXTsKKyAgICBpbnQgaSwgcGxhbmUsIGludGVyLCBxcmksIGJtaSwgYm1qLCBxaXN0YXJ0OworCisgICAgZm9yIChpbnRlciA9IDA7IGludGVyIDwgMjsgaW50ZXIrKykgeworICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciAocXJpID0gMDsgcXJpIDwgcy0+cXJfY291bnRbaW50ZXJdW3BsYW5lXTsgcXJpKyspIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gcy0+cXJfc2l6ZVtpbnRlcl1bcGxhbmVdW3FyaV07CisgICAgICAgICAgICAgICAgaWYgKHMtPnFwc1txcGldIDw9IHN1bSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxaXN0YXJ0ID0gc3VtIC0gcy0+cXJfc2l6ZVtpbnRlcl1bcGxhbmVdW3FyaV07CisgICAgICAgICAgICBibWkgICAgID0gcy0+cXJfYmFzZVtpbnRlcl1bcGxhbmVdW3FyaV07CisgICAgICAgICAgICBibWogICAgID0gcy0+cXJfYmFzZVtpbnRlcl1bcGxhbmVdW3FyaSArIDFdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY29lZmYgPSAoMiAqIChzdW0gICAgIC0gcy0+cXBzW3FwaV0pICogcy0+YmFzZV9tYXRyaXhbYm1pXVtpXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiAocWlzdGFydCAtIHMtPnFwc1txcGldKSAqIHMtPmJhc2VfbWF0cml4W2Jtal1baV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5xcl9zaXplW2ludGVyXVtwbGFuZV1bcXJpXSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyICogcy0+cXJfc2l6ZVtpbnRlcl1bcGxhbmVdW3FyaV0pOworCisgICAgICAgICAgICAgICAgaW50IHFtaW4gICA9IDggPDwgKGludGVyICsgIWkpOworICAgICAgICAgICAgICAgIGludCBxc2NhbGUgPSBpID8gYWNfc2NhbGVfZmFjdG9yIDogZGNfc2NhbGVfZmFjdG9yOworCisgICAgICAgICAgICAgICAgcy0+cW1hdFtxcGldW2ludGVyXVtwbGFuZV1bcy0+aWRjdF9wZXJtdXRhdGlvbltpXV0gPQorICAgICAgICAgICAgICAgICAgICBhdl9jbGlwKChxc2NhbGUgKiBjb2VmZikgLyAxMDAgKiA0LCBxbWluLCA0MDk2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGFsbCBEQyBjb2VmZmljaWVudHMgdXNlIHRoZSBzYW1lIHF1YW50IHNvIGFzIG5vdCB0byBpbnRlcmZlcmUKKyAgICAgICAgICAgICAqIHdpdGggREMgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgcy0+cW1hdFtxcGldW2ludGVyXVtwbGFuZV1bMF0gPSBzLT5xbWF0WzBdW2ludGVyXVtwbGFuZV1bMF07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBsb29wIGZpbHRlciBib3VuZGFyeSBsaW1pdHMgaWYgdGhlIGZyYW1lJ3MKKyAqIHF1YWxpdHkgaW5kZXggaXMgZGlmZmVyZW50IGZyb20gdGhlIHByZXZpb3VzIGZyYW1lJ3MuCisgKgorICogVGhlIGZpbHRlcl9saW1pdF92YWx1ZXMgbWF5IG5vdCBiZSBsYXJnZXIgdGhhbiAxMjcuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfbG9vcF9maWx0ZXIoVnAzRGVjb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgKmJvdW5kaW5nX3ZhbHVlcyA9IHMtPmJvdW5kaW5nX3ZhbHVlc19hcnJheSArIDEyNzsKKyAgICBpbnQgZmlsdGVyX2xpbWl0OworICAgIGludCB4OworICAgIGludCB2YWx1ZTsKKworICAgIGZpbHRlcl9saW1pdCA9IHMtPmZpbHRlcl9saW1pdF92YWx1ZXNbcy0+cXBzWzBdXTsKKyAgICBhdl9hc3NlcnQwKGZpbHRlcl9saW1pdCA8IDEyOFUpOworCisgICAgLyogc2V0IHVwIHRoZSBib3VuZGluZyB2YWx1ZXMgKi8KKyAgICBtZW1zZXQocy0+Ym91bmRpbmdfdmFsdWVzX2FycmF5LCAwLCAyNTYgKiBzaXplb2YoaW50KSk7CisgICAgZm9yICh4ID0gMDsgeCA8IGZpbHRlcl9saW1pdDsgeCsrKSB7CisgICAgICAgIGJvdW5kaW5nX3ZhbHVlc1steF0gPSAteDsKKyAgICAgICAgYm91bmRpbmdfdmFsdWVzW3hdID0geDsKKyAgICB9CisgICAgZm9yICh4ID0gdmFsdWUgPSBmaWx0ZXJfbGltaXQ7IHggPCAxMjggJiYgdmFsdWU7IHgrKywgdmFsdWUtLSkgeworICAgICAgICBib3VuZGluZ192YWx1ZXNbIHhdID0gIHZhbHVlOworICAgICAgICBib3VuZGluZ192YWx1ZXNbLXhdID0gLXZhbHVlOworICAgIH0KKyAgICBpZiAodmFsdWUpCisgICAgICAgIGJvdW5kaW5nX3ZhbHVlc1sxMjhdID0gdmFsdWU7CisgICAgYm91bmRpbmdfdmFsdWVzWzEyOV0gPSBib3VuZGluZ192YWx1ZXNbMTMwXSA9IGZpbHRlcl9saW1pdCAqIDB4MDIwMjAyMDI7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHVucGFja3MgYWxsIG9mIHRoZSBzdXBlcmJsb2NrL21hY3JvYmxvY2svZnJhZ21lbnQgY29kaW5nCisgKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiaXRzdHJlYW0uCisgKi8KK3N0YXRpYyBpbnQgdW5wYWNrX3N1cGVyYmxvY2tzKFZwM0RlY29kZUNvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBzdXBlcmJsb2NrX3N0YXJ0c1szXSA9IHsKKyAgICAgICAgMCwgcy0+dV9zdXBlcmJsb2NrX3N0YXJ0LCBzLT52X3N1cGVyYmxvY2tfc3RhcnQKKyAgICB9OworICAgIGludCBiaXQgPSAwOworICAgIGludCBjdXJyZW50X3N1cGVyYmxvY2sgPSAwOworICAgIGludCBjdXJyZW50X3J1biA9IDA7CisgICAgaW50IG51bV9wYXJ0aWFsX3N1cGVyYmxvY2tzID0gMDsKKworICAgIGludCBpLCBqOworICAgIGludCBjdXJyZW50X2ZyYWdtZW50OworICAgIGludCBwbGFuZTsKKworICAgIGlmIChzLT5rZXlmcmFtZSkgeworICAgICAgICBtZW1zZXQocy0+c3VwZXJibG9ja19jb2RpbmcsIFNCX0ZVTExZX0NPREVELCBzLT5zdXBlcmJsb2NrX2NvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiB1bnBhY2sgdGhlIGxpc3Qgb2YgcGFydGlhbGx5LWNvZGVkIHN1cGVyYmxvY2tzICovCisgICAgICAgIGJpdCAgICAgICAgID0gZ2V0X2JpdHMxKGdiKSBeIDE7CisgICAgICAgIGN1cnJlbnRfcnVuID0gMDsKKworICAgICAgICB3aGlsZSAoY3VycmVudF9zdXBlcmJsb2NrIDwgcy0+c3VwZXJibG9ja19jb3VudCAmJiBnZXRfYml0c19sZWZ0KGdiKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChzLT50aGVvcmEgJiYgY3VycmVudF9ydW4gPT0gTUFYSU1VTV9MT05HX0JJVF9SVU4pCisgICAgICAgICAgICAgICAgYml0ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiaXQgXj0gMTsKKworICAgICAgICAgICAgY3VycmVudF9ydW4gPSBnZXRfdmxjMihnYiwgcy0+c3VwZXJibG9ja19ydW5fbGVuZ3RoX3ZsYy50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMikgKyAxOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfcnVuID09IDM0KQorICAgICAgICAgICAgICAgIGN1cnJlbnRfcnVuICs9IGdldF9iaXRzKGdiLCAxMik7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50X3N1cGVyYmxvY2sgKyBjdXJyZW50X3J1biA+IHMtPnN1cGVyYmxvY2tfY291bnQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcGFydGlhbGx5IGNvZGVkIHN1cGVyYmxvY2sgcnVuIGxlbmd0aFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1zZXQocy0+c3VwZXJibG9ja19jb2RpbmcgKyBjdXJyZW50X3N1cGVyYmxvY2ssIGJpdCwgY3VycmVudF9ydW4pOworCisgICAgICAgICAgICBjdXJyZW50X3N1cGVyYmxvY2sgKz0gY3VycmVudF9ydW47CisgICAgICAgICAgICBpZiAoYml0KQorICAgICAgICAgICAgICAgIG51bV9wYXJ0aWFsX3N1cGVyYmxvY2tzICs9IGN1cnJlbnRfcnVuOworICAgICAgICB9CisKKyAgICAgICAgLyogdW5wYWNrIHRoZSBsaXN0IG9mIGZ1bGx5IGNvZGVkIHN1cGVyYmxvY2tzIGlmIGFueSBvZiB0aGUgYmxvY2tzIHdlcmUKKyAgICAgICAgICogbm90IG1hcmtlZCBhcyBwYXJ0aWFsbHkgY29kZWQgaW4gdGhlIHByZXZpb3VzIHN0ZXAgKi8KKyAgICAgICAgaWYgKG51bV9wYXJ0aWFsX3N1cGVyYmxvY2tzIDwgcy0+c3VwZXJibG9ja19jb3VudCkgeworICAgICAgICAgICAgaW50IHN1cGVyYmxvY2tzX2RlY29kZWQgPSAwOworCisgICAgICAgICAgICBjdXJyZW50X3N1cGVyYmxvY2sgPSAwOworICAgICAgICAgICAgYml0ICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKSBeIDE7CisgICAgICAgICAgICBjdXJyZW50X3J1biAgICAgICAgPSAwOworCisgICAgICAgICAgICB3aGlsZSAoc3VwZXJibG9ja3NfZGVjb2RlZCA8IHMtPnN1cGVyYmxvY2tfY291bnQgLSBudW1fcGFydGlhbF9zdXBlcmJsb2NrcyAmJgorICAgICAgICAgICAgICAgICAgIGdldF9iaXRzX2xlZnQoZ2IpID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChzLT50aGVvcmEgJiYgY3VycmVudF9ydW4gPT0gTUFYSU1VTV9MT05HX0JJVF9SVU4pCisgICAgICAgICAgICAgICAgICAgIGJpdCA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBiaXQgXj0gMTsKKworICAgICAgICAgICAgICAgIGN1cnJlbnRfcnVuID0gZ2V0X3ZsYzIoZ2IsIHMtPnN1cGVyYmxvY2tfcnVuX2xlbmd0aF92bGMudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAyKSArIDE7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfcnVuID09IDM0KQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3J1biArPSBnZXRfYml0cyhnYiwgMTIpOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1cnJlbnRfcnVuOyBjdXJyZW50X3N1cGVyYmxvY2srKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudF9zdXBlcmJsb2NrID49IHMtPnN1cGVyYmxvY2tfY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZ1bGx5IGNvZGVkIHN1cGVyYmxvY2sgcnVuIGxlbmd0aFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBza2lwIGFueSBzdXBlcmJsb2NrcyBhbHJlYWR5IG1hcmtlZCBhcyBwYXJ0aWFsbHkgY29kZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnN1cGVyYmxvY2tfY29kaW5nW2N1cnJlbnRfc3VwZXJibG9ja10gPT0gU0JfTk9UX0NPREVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdXBlcmJsb2NrX2NvZGluZ1tjdXJyZW50X3N1cGVyYmxvY2tdID0gMiAqIGJpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdXBlcmJsb2Nrc19kZWNvZGVkICs9IGN1cnJlbnRfcnVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogaWYgdGhlcmUgd2VyZSBwYXJ0aWFsIGJsb2NrcywgaW5pdGlhbGl6ZSBiaXRzdHJlYW0gZm9yCisgICAgICAgICAqIHVucGFja2luZyBmcmFnbWVudCBjb2RpbmdzICovCisgICAgICAgIGlmIChudW1fcGFydGlhbF9zdXBlcmJsb2NrcykgeworICAgICAgICAgICAgY3VycmVudF9ydW4gPSAwOworICAgICAgICAgICAgYml0ICAgICAgICAgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgLyogdG9nZ2xlIHRoZSBiaXQgYmVjYXVzZSBhcyBzb29uIGFzIHRoZSBmaXJzdCBydW4gbGVuZ3RoIGlzCisgICAgICAgICAgICAgKiBmZXRjaGVkIHRoZSBiaXQgd2lsbCBiZSB0b2dnbGVkIGFnYWluICovCisgICAgICAgICAgICBiaXQgXj0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGZpZ3VyZSBvdXQgd2hpY2ggZnJhZ21lbnRzIGFyZSBjb2RlZDsgaXRlcmF0ZSB0aHJvdWdoIGVhY2gKKyAgICAgKiBzdXBlcmJsb2NrIChhbGwgcGxhbmVzKSAqLworICAgIHMtPnRvdGFsX251bV9jb2RlZF9mcmFncyA9IDA7CisgICAgbWVtc2V0KHMtPm1hY3JvYmxvY2tfY29kaW5nLCBNT0RFX0NPUFksIHMtPm1hY3JvYmxvY2tfY291bnQpOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMzsgcGxhbmUrKykgeworICAgICAgICBpbnQgc2Jfc3RhcnQgPSBzdXBlcmJsb2NrX3N0YXJ0c1twbGFuZV07CisgICAgICAgIGludCBzYl9lbmQgICA9IHNiX3N0YXJ0ICsgKHBsYW5lID8gcy0+Y19zdXBlcmJsb2NrX2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcy0+eV9zdXBlcmJsb2NrX2NvdW50KTsKKyAgICAgICAgaW50IG51bV9jb2RlZF9mcmFncyA9IDA7CisKKyAgICAgICAgZm9yIChpID0gc2Jfc3RhcnQ7IGkgPCBzYl9lbmQgJiYgZ2V0X2JpdHNfbGVmdChnYikgPiAwOyBpKyspIHsKKyAgICAgICAgICAgIC8qIGl0ZXJhdGUgdGhyb3VnaCBhbGwgMTYgZnJhZ21lbnRzIGluIGEgc3VwZXJibG9jayAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKyAgICAgICAgICAgICAgICAvKiBpZiB0aGUgZnJhZ21lbnQgaXMgaW4gYm91bmRzLCBjaGVjayBpdHMgY29kaW5nIHN0YXR1cyAqLworICAgICAgICAgICAgICAgIGN1cnJlbnRfZnJhZ21lbnQgPSBzLT5zdXBlcmJsb2NrX2ZyYWdtZW50c1tpICogMTYgKyBqXTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudF9mcmFnbWVudCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29kZWQgPSBzLT5zdXBlcmJsb2NrX2NvZGluZ1tpXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocy0+c3VwZXJibG9ja19jb2RpbmdbaV0gPT0gU0JfUEFSVElBTExZX0NPREVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcmFnbWVudCBtYXkgb3IgbWF5IG5vdCBiZSBjb2RlZDsgdGhpcyBpcyB0aGUgY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICogdGhhdCBjYXJlcyBhYm91dCB0aGUgZnJhZ21lbnQgY29kaW5nIHJ1bnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3J1bi0tID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgICAgICAgIF49IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ydW4gPSBnZXRfdmxjMihnYiwgcy0+ZnJhZ21lbnRfcnVuX2xlbmd0aF92bGMudGFibGUsIDUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29kZWQgPSBiaXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgbW9kZTsgYWN0dWFsIG1vZGUgd2lsbCBiZSBkZWNvZGVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbmV4dCBwaGFzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWxsX2ZyYWdtZW50c1tjdXJyZW50X2ZyYWdtZW50XS5jb2RpbmdfbWV0aG9kID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RFX0lOVEVSX05PX01WOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29kZWRfZnJhZ21lbnRfbGlzdFtwbGFuZV1bbnVtX2NvZGVkX2ZyYWdzKytdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2ZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGNvZGVkOyBjb3B5IHRoaXMgZnJhZ21lbnQgZnJvbSB0aGUgcHJpb3IgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmFsbF9mcmFnbWVudHNbY3VycmVudF9mcmFnbWVudF0uY29kaW5nX21ldGhvZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ERV9DT1BZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHMtPnRvdGFsX251bV9jb2RlZF9mcmFncyArPSBudW1fY29kZWRfZnJhZ3M7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgcy0+bnVtX2NvZGVkX2ZyYWdzW3BsYW5lXVtpXSA9IG51bV9jb2RlZF9mcmFnczsKKyAgICAgICAgaWYgKHBsYW5lIDwgMikKKyAgICAgICAgICAgIHMtPmNvZGVkX2ZyYWdtZW50X2xpc3RbcGxhbmUgKyAxXSA9IHMtPmNvZGVkX2ZyYWdtZW50X2xpc3RbcGxhbmVdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb2RlZF9mcmFnczsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHVucGFja3MgYWxsIHRoZSBjb2RpbmcgbW9kZSBkYXRhIGZvciBpbmRpdmlkdWFsIG1hY3JvYmxvY2tzCisgKiBmcm9tIHRoZSBiaXRzdHJlYW0uCisgKi8KK3N0YXRpYyBpbnQgdW5wYWNrX21vZGVzKFZwM0RlY29kZUNvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBpLCBqLCBrLCBzYl94LCBzYl95OworICAgIGludCBzY2hlbWU7CisgICAgaW50IGN1cnJlbnRfbWFjcm9ibG9jazsKKyAgICBpbnQgY3VycmVudF9mcmFnbWVudDsKKyAgICBpbnQgY29kaW5nX21vZGU7CisgICAgaW50IGN1c3RvbV9tb2RlX2FscGhhYmV0W0NPRElOR19NT0RFX0NPVU5UXTsKKyAgICBjb25zdCBpbnQgKmFscGhhYmV0OworICAgIFZwM0ZyYWdtZW50ICpmcmFnOworCisgICAgaWYgKHMtPmtleWZyYW1lKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFnbWVudF9jb3VudDsgaSsrKQorICAgICAgICAgICAgcy0+YWxsX2ZyYWdtZW50c1tpXS5jb2RpbmdfbWV0aG9kID0gTU9ERV9JTlRSQTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBmZXRjaCB0aGUgbW9kZSBjb2Rpbmcgc2NoZW1lIGZvciB0aGlzIGZyYW1lICovCisgICAgICAgIHNjaGVtZSA9IGdldF9iaXRzKGdiLCAzKTsKKworICAgICAgICAvKiBpcyBpdCBhIGN1c3RvbSBjb2Rpbmcgc2NoZW1lPyAqLworICAgICAgICBpZiAoc2NoZW1lID09IDApIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICAgICAgY3VzdG9tX21vZGVfYWxwaGFiZXRbaV0gPSBNT0RFX0lOVEVSX05PX01WOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgICAgICBjdXN0b21fbW9kZV9hbHBoYWJldFtnZXRfYml0cyhnYiwgMyldID0gaTsKKyAgICAgICAgICAgIGFscGhhYmV0ID0gY3VzdG9tX21vZGVfYWxwaGFiZXQ7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYWxwaGFiZXQgPSBNb2RlQWxwaGFiZXRbc2NoZW1lIC0gMV07CisKKyAgICAgICAgLyogaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgbWFjcm9ibG9ja3MgdGhhdCBjb250YWluIDEgb3IgbW9yZQorICAgICAgICAgKiBjb2RlZCBmcmFnbWVudHMgKi8KKyAgICAgICAgZm9yIChzYl95ID0gMDsgc2JfeSA8IHMtPnlfc3VwZXJibG9ja19oZWlnaHQ7IHNiX3krKykgeworICAgICAgICAgICAgZm9yIChzYl94ID0gMDsgc2JfeCA8IHMtPnlfc3VwZXJibG9ja193aWR0aDsgc2JfeCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDw9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1iX3ggPSAyICogc2JfeCArIChqID4+IDEpOworICAgICAgICAgICAgICAgICAgICBpbnQgbWJfeSA9IDIgKiBzYl95ICsgKCgoaiA+PiAxKSArIGopICYgMSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbWFjcm9ibG9jayA9IG1iX3kgKiBzLT5tYWNyb2Jsb2NrX3dpZHRoICsgbWJfeDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobWJfeCA+PSBzLT5tYWNyb2Jsb2NrX3dpZHRoIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtYl95ID49IHMtPm1hY3JvYmxvY2tfaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyNkZWZpbmUgQkxPQ0tfWCAoMiAqIG1iX3ggKyAoayAmIDEpKQorI2RlZmluZSBCTE9DS19ZICgyICogbWJfeSArIChrID4+IDEpKQorICAgICAgICAgICAgICAgICAgICAvKiBjb2RpbmcgbW9kZXMgYXJlIG9ubHkgc3RvcmVkIGlmIHRoZSBtYWNyb2Jsb2NrIGhhcworICAgICAgICAgICAgICAgICAgICAgKiBhdCBsZWFzdCBvbmUgbHVtYSBibG9jayBjb2RlZCwgb3RoZXJ3aXNlIGl0IG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICogSU5URVJfTk9fTVYgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9mcmFnbWVudCA9IEJMT0NLX1kgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYWdtZW50X3dpZHRoWzBdICsgQkxPQ0tfWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5hbGxfZnJhZ21lbnRzW2N1cnJlbnRfZnJhZ21lbnRdLmNvZGluZ19tZXRob2QgIT0gTU9ERV9DT1BZKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChrID09IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1hY3JvYmxvY2tfY29kaW5nW2N1cnJlbnRfbWFjcm9ibG9ja10gPSBNT0RFX0lOVEVSX05PX01WOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBtb2RlIDcgbWVhbnMgZ2V0IDMgYml0cyBmb3IgZWFjaCBjb2RpbmcgbW9kZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1lID09IDcpCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RpbmdfbW9kZSA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nX21vZGUgPSBhbHBoYWJldFtnZXRfdmxjMihnYiwgcy0+bW9kZV9jb2RlX3ZsYy50YWJsZSwgMywgMyldOworCisgICAgICAgICAgICAgICAgICAgIHMtPm1hY3JvYmxvY2tfY29kaW5nW2N1cnJlbnRfbWFjcm9ibG9ja10gPSBjb2RpbmdfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhZyA9IHMtPmFsbF9mcmFnbWVudHMgKyBCTE9DS19ZICogcy0+ZnJhZ21lbnRfd2lkdGhbMF0gKyBCTE9DS19YOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWctPmNvZGluZ19tZXRob2QgIT0gTU9ERV9DT1BZKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWctPmNvZGluZ19tZXRob2QgPSBjb2RpbmdfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisjZGVmaW5lIFNFVF9DSFJPTUFfTU9ERVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyYWdbcy0+ZnJhZ21lbnRfc3RhcnRbMV1dLmNvZGluZ19tZXRob2QgIT0gTU9ERV9DT1BZKSAgICAgICAgICAgICAgICBcCisgICAgICAgIGZyYWdbcy0+ZnJhZ21lbnRfc3RhcnRbMV1dLmNvZGluZ19tZXRob2QgPSBjb2RpbmdfbW9kZTsgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyYWdbcy0+ZnJhZ21lbnRfc3RhcnRbMl1dLmNvZGluZ19tZXRob2QgIT0gTU9ERV9DT1BZKSAgICAgICAgICAgICAgICBcCisgICAgICAgIGZyYWdbcy0+ZnJhZ21lbnRfc3RhcnRbMl1dLmNvZGluZ19tZXRob2QgPSBjb2RpbmdfbW9kZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Y2hyb21hX3lfc2hpZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcgPSBzLT5hbGxfZnJhZ21lbnRzICsgbWJfeSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhZ21lbnRfd2lkdGhbMV0gKyBtYl94OworICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0NIUk9NQV9NT0RFUworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmNocm9tYV94X3NoaWZ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnID0gcy0+YWxsX2ZyYWdtZW50cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIG1iX3kgKiBzLT5mcmFnbWVudF93aWR0aFsxXSArIG1iX3g7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0NIUk9NQV9NT0RFUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcgKz0gcy0+ZnJhZ21lbnRfd2lkdGhbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZyA9IHMtPmFsbF9mcmFnbWVudHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19ZICogcy0+ZnJhZ21lbnRfd2lkdGhbMV0gKyBCTE9DS19YOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9DSFJPTUFfTU9ERVMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB1bnBhY2tzIGFsbCB0aGUgbW90aW9uIHZlY3RvcnMgZm9yIHRoZSBpbmRpdmlkdWFsCisgKiBtYWNyb2Jsb2NrcyBmcm9tIHRoZSBiaXRzdHJlYW0uCisgKi8KK3N0YXRpYyBpbnQgdW5wYWNrX3ZlY3RvcnMoVnAzRGVjb2RlQ29udGV4dCAqcywgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IGosIGssIHNiX3gsIHNiX3k7CisgICAgaW50IGNvZGluZ19tb2RlOworICAgIGludCBtb3Rpb25feFs0XTsKKyAgICBpbnQgbW90aW9uX3lbNF07CisgICAgaW50IGxhc3RfbW90aW9uX3ggPSAwOworICAgIGludCBsYXN0X21vdGlvbl95ID0gMDsKKyAgICBpbnQgcHJpb3JfbGFzdF9tb3Rpb25feCA9IDA7CisgICAgaW50IHByaW9yX2xhc3RfbW90aW9uX3kgPSAwOworICAgIGludCBjdXJyZW50X21hY3JvYmxvY2s7CisgICAgaW50IGN1cnJlbnRfZnJhZ21lbnQ7CisgICAgaW50IGZyYWc7CisKKyAgICBpZiAocy0+a2V5ZnJhbWUpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogY29kaW5nIG1vZGUgMCBpcyB0aGUgVkxDIHNjaGVtZTsgMSBpcyB0aGUgZml4ZWQgY29kZSBzY2hlbWUgKi8KKyAgICBjb2RpbmdfbW9kZSA9IGdldF9iaXRzMShnYik7CisKKyAgICAvKiBpdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBtYWNyb2Jsb2NrcyB0aGF0IGNvbnRhaW4gMSBvciBtb3JlCisgICAgICogY29kZWQgZnJhZ21lbnRzICovCisgICAgZm9yIChzYl95ID0gMDsgc2JfeSA8IHMtPnlfc3VwZXJibG9ja19oZWlnaHQ7IHNiX3krKykgeworICAgICAgICBmb3IgKHNiX3ggPSAwOyBzYl94IDwgcy0+eV9zdXBlcmJsb2NrX3dpZHRoOyBzYl94KyspIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCBtYl94ID0gMiAqIHNiX3ggKyAoaiA+PiAxKTsKKyAgICAgICAgICAgICAgICBpbnQgbWJfeSA9IDIgKiBzYl95ICsgKCgoaiA+PiAxKSArIGopICYgMSk7CisgICAgICAgICAgICAgICAgY3VycmVudF9tYWNyb2Jsb2NrID0gbWJfeSAqIHMtPm1hY3JvYmxvY2tfd2lkdGggKyBtYl94OworCisgICAgICAgICAgICAgICAgaWYgKG1iX3ggPj0gcy0+bWFjcm9ibG9ja193aWR0aCAgfHwKKyAgICAgICAgICAgICAgICAgICAgbWJfeSA+PSBzLT5tYWNyb2Jsb2NrX2hlaWdodCB8fAorICAgICAgICAgICAgICAgICAgICBzLT5tYWNyb2Jsb2NrX2NvZGluZ1tjdXJyZW50X21hY3JvYmxvY2tdID09IE1PREVfQ09QWSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHMtPm1hY3JvYmxvY2tfY29kaW5nW2N1cnJlbnRfbWFjcm9ibG9ja10pIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1PREVfSU5URVJfUExVU19NVjoKKyAgICAgICAgICAgICAgICBjYXNlIE1PREVfR09MREVOX01WOgorICAgICAgICAgICAgICAgICAgICAvKiBhbGwgNiBmcmFnbWVudHMgdXNlIHRoZSBzYW1lIG1vdGlvbiB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGluZ19tb2RlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl94WzBdID0gbW90aW9uX3ZlY3Rvcl90YWJsZVtnZXRfdmxjMihnYiwgcy0+bW90aW9uX3ZlY3Rvcl92bGMudGFibGUsIDYsIDIpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95WzBdID0gbW90aW9uX3ZlY3Rvcl90YWJsZVtnZXRfdmxjMihnYiwgcy0+bW90aW9uX3ZlY3Rvcl92bGMudGFibGUsIDYsIDIpXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl94WzBdID0gZml4ZWRfbW90aW9uX3ZlY3Rvcl90YWJsZVtnZXRfYml0cyhnYiwgNildOworICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3lbMF0gPSBmaXhlZF9tb3Rpb25fdmVjdG9yX3RhYmxlW2dldF9iaXRzKGdiLCA2KV07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiB2ZWN0b3IgbWFpbnRlbmFuY2UsIG9ubHkgb24gTU9ERV9JTlRFUl9QTFVTX01WICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tYWNyb2Jsb2NrX2NvZGluZ1tjdXJyZW50X21hY3JvYmxvY2tdID09IE1PREVfSU5URVJfUExVU19NVikgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JfbGFzdF9tb3Rpb25feCA9IGxhc3RfbW90aW9uX3g7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcl9sYXN0X21vdGlvbl95ID0gbGFzdF9tb3Rpb25feTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbW90aW9uX3ggICAgICAgPSBtb3Rpb25feFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbW90aW9uX3kgICAgICAgPSBtb3Rpb25feVswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTU9ERV9JTlRFUl9GT1VSTVY6CisgICAgICAgICAgICAgICAgICAgIC8qIHZlY3RvciBtYWludGVuYW5jZSAqLworICAgICAgICAgICAgICAgICAgICBwcmlvcl9sYXN0X21vdGlvbl94ID0gbGFzdF9tb3Rpb25feDsKKyAgICAgICAgICAgICAgICAgICAgcHJpb3JfbGFzdF9tb3Rpb25feSA9IGxhc3RfbW90aW9uX3k7CisKKyAgICAgICAgICAgICAgICAgICAgLyogZmV0Y2ggNCB2ZWN0b3JzIGZyb20gdGhlIGJpdHN0cmVhbSwgb25lIGZvciBlYWNoCisgICAgICAgICAgICAgICAgICAgICAqIFkgZnJhZ21lbnQsIHRoZW4gYXZlcmFnZSBmb3IgdGhlIEMgZnJhZ21lbnQgdmVjdG9ycyAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2ZyYWdtZW50ID0gQkxPQ0tfWSAqIHMtPmZyYWdtZW50X3dpZHRoWzBdICsgQkxPQ0tfWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5hbGxfZnJhZ21lbnRzW2N1cnJlbnRfZnJhZ21lbnRdLmNvZGluZ19tZXRob2QgIT0gTU9ERV9DT1BZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGluZ19tb2RlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3hba10gPSBtb3Rpb25fdmVjdG9yX3RhYmxlW2dldF92bGMyKGdiLCBzLT5tb3Rpb25fdmVjdG9yX3ZsYy50YWJsZSwgNiwgMildOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feVtrXSA9IG1vdGlvbl92ZWN0b3JfdGFibGVbZ2V0X3ZsYzIoZ2IsIHMtPm1vdGlvbl92ZWN0b3JfdmxjLnRhYmxlLCA2LCAyKV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3hba10gPSBmaXhlZF9tb3Rpb25fdmVjdG9yX3RhYmxlW2dldF9iaXRzKGdiLCA2KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95W2tdID0gZml4ZWRfbW90aW9uX3ZlY3Rvcl90YWJsZVtnZXRfYml0cyhnYiwgNildOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X21vdGlvbl94ID0gbW90aW9uX3hba107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9tb3Rpb25feSA9IG1vdGlvbl95W2tdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feFtrXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3lba10gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNT0RFX0lOVEVSX0xBU1RfTVY6CisgICAgICAgICAgICAgICAgICAgIC8qIGFsbCA2IGZyYWdtZW50cyB1c2UgdGhlIGxhc3QgbW90aW9uIHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICBtb3Rpb25feFswXSA9IGxhc3RfbW90aW9uX3g7CisgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95WzBdID0gbGFzdF9tb3Rpb25feTsKKworICAgICAgICAgICAgICAgICAgICAvKiBubyB2ZWN0b3IgbWFpbnRlbmFuY2UgKGxhc3QgdmVjdG9yIHJlbWFpbnMgdGhlCisgICAgICAgICAgICAgICAgICAgICAqIGxhc3QgdmVjdG9yKSAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTU9ERV9JTlRFUl9QUklPUl9MQVNUOgorICAgICAgICAgICAgICAgICAgICAvKiBhbGwgNiBmcmFnbWVudHMgdXNlIHRoZSBtb3Rpb24gdmVjdG9yIHByaW9yIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiBsYXN0IG1vdGlvbiB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3hbMF0gPSBwcmlvcl9sYXN0X21vdGlvbl94OworICAgICAgICAgICAgICAgICAgICBtb3Rpb25feVswXSA9IHByaW9yX2xhc3RfbW90aW9uX3k7CisKKyAgICAgICAgICAgICAgICAgICAgLyogdmVjdG9yIG1haW50ZW5hbmNlICovCisgICAgICAgICAgICAgICAgICAgIHByaW9yX2xhc3RfbW90aW9uX3ggPSBsYXN0X21vdGlvbl94OworICAgICAgICAgICAgICAgICAgICBwcmlvcl9sYXN0X21vdGlvbl95ID0gbGFzdF9tb3Rpb25feTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9tb3Rpb25feCAgICAgICA9IG1vdGlvbl94WzBdOworICAgICAgICAgICAgICAgICAgICBsYXN0X21vdGlvbl95ICAgICAgID0gbW90aW9uX3lbMF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLyogY292ZXJzIGludHJhLCBpbnRlciB3aXRob3V0IE1WLCBnb2xkZW4gd2l0aG91dCBNViAqLworICAgICAgICAgICAgICAgICAgICBtb3Rpb25feFswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95WzBdID0gMDsKKworICAgICAgICAgICAgICAgICAgICAvKiBubyB2ZWN0b3IgbWFpbnRlbmFuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogYXNzaWduIHRoZSBtb3Rpb24gdmVjdG9ycyB0byB0aGUgY29ycmVjdCBmcmFnbWVudHMgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZnJhZ21lbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfWSAqIHMtPmZyYWdtZW50X3dpZHRoWzBdICsgQkxPQ0tfWDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm1hY3JvYmxvY2tfY29kaW5nW2N1cnJlbnRfbWFjcm9ibG9ja10gPT0gTU9ERV9JTlRFUl9GT1VSTVYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1vdGlvbl92YWxbMF1bY3VycmVudF9mcmFnbWVudF1bMF0gPSBtb3Rpb25feFtrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1vdGlvbl92YWxbMF1bY3VycmVudF9mcmFnbWVudF1bMV0gPSBtb3Rpb25feVtrXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1vdGlvbl92YWxbMF1bY3VycmVudF9mcmFnbWVudF1bMF0gPSBtb3Rpb25feFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1vdGlvbl92YWxbMF1bY3VycmVudF9mcmFnbWVudF1bMV0gPSBtb3Rpb25feVswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzLT5jaHJvbWFfeV9zaGlmdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bWFjcm9ibG9ja19jb2RpbmdbY3VycmVudF9tYWNyb2Jsb2NrXSA9PSBNT0RFX0lOVEVSX0ZPVVJNVikgeworICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3hbMF0gPSBSU0hJRlQobW90aW9uX3hbMF0gKyBtb3Rpb25feFsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feFsyXSArIG1vdGlvbl94WzNdLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95WzBdID0gUlNISUZUKG1vdGlvbl95WzBdICsgbW90aW9uX3lbMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3lbMl0gKyBtb3Rpb25feVszXSwgMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3hbMF0gPSAobW90aW9uX3hbMF0gPj4gMSkgfCAobW90aW9uX3hbMF0gJiAxKTsKKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3lbMF0gPSAobW90aW9uX3lbMF0gPj4gMSkgfCAobW90aW9uX3lbMF0gJiAxKTsKKyAgICAgICAgICAgICAgICAgICAgZnJhZyA9IG1iX3kgKiBzLT5mcmFnbWVudF93aWR0aFsxXSArIG1iX3g7CisgICAgICAgICAgICAgICAgICAgIHMtPm1vdGlvbl92YWxbMV1bZnJhZ11bMF0gPSBtb3Rpb25feFswXTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bW90aW9uX3ZhbFsxXVtmcmFnXVsxXSA9IG1vdGlvbl95WzBdOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+Y2hyb21hX3hfc2hpZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm1hY3JvYmxvY2tfY29kaW5nW2N1cnJlbnRfbWFjcm9ibG9ja10gPT0gTU9ERV9JTlRFUl9GT1VSTVYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl94WzBdID0gUlNISUZUKG1vdGlvbl94WzBdICsgbW90aW9uX3hbMV0sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3lbMF0gPSBSU0hJRlQobW90aW9uX3lbMF0gKyBtb3Rpb25feVsxXSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feFsxXSA9IFJTSElGVChtb3Rpb25feFsyXSArIG1vdGlvbl94WzNdLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95WzFdID0gUlNISUZUKG1vdGlvbl95WzJdICsgbW90aW9uX3lbM10sIDEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3hbMV0gPSBtb3Rpb25feFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl95WzFdID0gbW90aW9uX3lbMF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3hbMF0gPSAobW90aW9uX3hbMF0gPj4gMSkgfCAobW90aW9uX3hbMF0gJiAxKTsKKyAgICAgICAgICAgICAgICAgICAgbW90aW9uX3hbMV0gPSAobW90aW9uX3hbMV0gPj4gMSkgfCAobW90aW9uX3hbMV0gJiAxKTsKKworICAgICAgICAgICAgICAgICAgICBmcmFnID0gMiAqIG1iX3kgKiBzLT5mcmFnbWVudF93aWR0aFsxXSArIG1iX3g7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAyOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1vdGlvbl92YWxbMV1bZnJhZ11bMF0gPSBtb3Rpb25feFtrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1vdGlvbl92YWxbMV1bZnJhZ11bMV0gPSBtb3Rpb25feVtrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcgKz0gcy0+ZnJhZ21lbnRfd2lkdGhbMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnID0gQkxPQ0tfWSAqIHMtPmZyYWdtZW50X3dpZHRoWzFdICsgQkxPQ0tfWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tYWNyb2Jsb2NrX2NvZGluZ1tjdXJyZW50X21hY3JvYmxvY2tdID09IE1PREVfSU5URVJfRk9VUk1WKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bW90aW9uX3ZhbFsxXVtmcmFnXVswXSA9IG1vdGlvbl94W2tdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1vdGlvbl92YWxbMV1bZnJhZ11bMV0gPSBtb3Rpb25feVtrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bW90aW9uX3ZhbFsxXVtmcmFnXVswXSA9IG1vdGlvbl94WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1vdGlvbl92YWxbMV1bZnJhZ11bMV0gPSBtb3Rpb25feVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVucGFja19ibG9ja19xcGlzKFZwM0RlY29kZUNvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBxcGksIGksIGosIGJpdCwgcnVuX2xlbmd0aCwgYmxvY2tzX2RlY29kZWQsIG51bV9ibG9ja3NfYXRfcXBpOworICAgIGludCBudW1fYmxvY2tzID0gcy0+dG90YWxfbnVtX2NvZGVkX2ZyYWdzOworCisgICAgZm9yIChxcGkgPSAwOyBxcGkgPCBzLT5ucXBzIC0gMSAmJiBudW1fYmxvY2tzID4gMDsgcXBpKyspIHsKKyAgICAgICAgaSA9IGJsb2Nrc19kZWNvZGVkID0gbnVtX2Jsb2Nrc19hdF9xcGkgPSAwOworCisgICAgICAgIGJpdCAgICAgICAgPSBnZXRfYml0czEoZ2IpIF4gMTsKKyAgICAgICAgcnVuX2xlbmd0aCA9IDA7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKHJ1bl9sZW5ndGggPT0gTUFYSU1VTV9MT05HX0JJVF9SVU4pCisgICAgICAgICAgICAgICAgYml0ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiaXQgXj0gMTsKKworICAgICAgICAgICAgcnVuX2xlbmd0aCA9IGdldF92bGMyKGdiLCBzLT5zdXBlcmJsb2NrX3J1bl9sZW5ndGhfdmxjLnRhYmxlLCA2LCAyKSArIDE7CisgICAgICAgICAgICBpZiAocnVuX2xlbmd0aCA9PSAzNCkKKyAgICAgICAgICAgICAgICBydW5fbGVuZ3RoICs9IGdldF9iaXRzKGdiLCAxMik7CisgICAgICAgICAgICBibG9ja3NfZGVjb2RlZCArPSBydW5fbGVuZ3RoOworCisgICAgICAgICAgICBpZiAoIWJpdCkKKyAgICAgICAgICAgICAgICBudW1fYmxvY2tzX2F0X3FwaSArPSBydW5fbGVuZ3RoOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcnVuX2xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPj0gcy0+dG90YWxfbnVtX2NvZGVkX2ZyYWdzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgICAgICBpZiAocy0+YWxsX2ZyYWdtZW50c1tzLT5jb2RlZF9mcmFnbWVudF9saXN0WzBdW2ldXS5xcGkgPT0gcXBpKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmFsbF9mcmFnbWVudHNbcy0+Y29kZWRfZnJhZ21lbnRfbGlzdFswXVtpXV0ucXBpICs9IGJpdDsKKyAgICAgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoYmxvY2tzX2RlY29kZWQgPCBudW1fYmxvY2tzICYmIGdldF9iaXRzX2xlZnQoZ2IpID4gMCk7CisKKyAgICAgICAgbnVtX2Jsb2NrcyAtPSBudW1fYmxvY2tzX2F0X3FwaTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHVucGFja19kY3RfY29lZmZzKCkgdG8gZXh0cmFjdCB0aGUgVkxDcyBmcm9tCisgKiB0aGUgYml0c3RyZWFtLiBUaGUgVkxDcyBlbmNvZGUgdG9rZW5zIHdoaWNoIGFyZSB1c2VkIHRvIHVucGFjayBEQ1QKKyAqIGRhdGEuIFRoaXMgZnVuY3Rpb24gdW5wYWNrcyBhbGwgdGhlIFZMQ3MgZm9yIGVpdGhlciB0aGUgWSBwbGFuZSBvciBib3RoCisgKiBDIHBsYW5lcywgYW5kIGlzIGNhbGxlZCBmb3IgREMgY29lZmZpY2llbnRzIG9yIGRpZmZlcmVudCBBQyBjb2VmZmljaWVudAorICogbGV2ZWxzIChzaW5jZSBkaWZmZXJlbnQgY29lZmZpY2llbnQgdHlwZXMgcmVxdWlyZSBkaWZmZXJlbnQgVkxDIHRhYmxlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSByZXNpZHVhbCBlb2IgcnVuLiBFLmcsIGlmIGEgcGFydGljdWxhciB0b2tlbiBnYXZlCisgKiBpbnN0cnVjdGlvbnMgdG8gRU9CIHRoZSBuZXh0IDUgZnJhZ21lbnRzIGFuZCB0aGVyZSB3ZXJlIG9ubHkgMiBmcmFnbWVudHMKKyAqIGxlZnQgaW4gdGhlIGN1cnJlbnQgZnJhZ21lbnQgcmFuZ2UsIDMgd291bGQgYmUgcmV0dXJuZWQgc28gdGhhdCBpdCBjb3VsZAorICogYmUgcGFzc2VkIGludG8gdGhlIG5leHQgY2FsbCB0byB0aGlzIHNhbWUgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgdW5wYWNrX3ZsY3MoVnAzRGVjb2RlQ29udGV4dCAqcywgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgIFZMQyAqdGFibGUsIGludCBjb2VmZl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW9iX3J1bikKK3sKKyAgICBpbnQgaSwgaiA9IDA7CisgICAgaW50IHRva2VuOworICAgIGludCB6ZXJvX3J1biAgPSAwOworICAgIGludDE2X3QgY29lZmYgPSAwOworICAgIGludCBiaXRzX3RvX2dldDsKKyAgICBpbnQgYmxvY2tzX2VuZGVkOworICAgIGludCBjb2VmZl9pID0gMDsKKyAgICBpbnQgbnVtX2NvZWZmcyAgICAgID0gcy0+bnVtX2NvZGVkX2ZyYWdzW3BsYW5lXVtjb2VmZl9pbmRleF07CisgICAgaW50MTZfdCAqZGN0X3Rva2VucyA9IHMtPmRjdF90b2tlbnNbcGxhbmVdW2NvZWZmX2luZGV4XTsKKworICAgIC8qIGxvY2FsIHJlZmVyZW5jZXMgdG8gc3RydWN0dXJlIG1lbWJlcnMgdG8gYXZvaWQgcmVwZWF0ZWQgZGVmZXJlbmNlcyAqLworICAgIGludCAqY29kZWRfZnJhZ21lbnRfbGlzdCAgID0gcy0+Y29kZWRfZnJhZ21lbnRfbGlzdFtwbGFuZV07CisgICAgVnAzRnJhZ21lbnQgKmFsbF9mcmFnbWVudHMgPSBzLT5hbGxfZnJhZ21lbnRzOworICAgIFZMQ19UWVBFKCp2bGNfdGFibGUpWzJdID0gdGFibGUtPnRhYmxlOworCisgICAgaWYgKG51bV9jb2VmZnMgPCAwKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiBjb2VmZmljZW50cyBhdCBsZXZlbCAlZFxuIiwgY29lZmZfaW5kZXgpOworCisgICAgaWYgKGVvYl9ydW4gPiBudW1fY29lZmZzKSB7CisgICAgICAgIGNvZWZmX2kgICAgICA9CisgICAgICAgIGJsb2Nrc19lbmRlZCA9IG51bV9jb2VmZnM7CisgICAgICAgIGVvYl9ydW4gICAgIC09IG51bV9jb2VmZnM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29lZmZfaSAgICAgID0KKyAgICAgICAgYmxvY2tzX2VuZGVkID0gZW9iX3J1bjsKKyAgICAgICAgZW9iX3J1biAgICAgID0gMDsKKyAgICB9CisKKyAgICAvLyBpbnNlcnQgZmFrZSBFT0IgdG9rZW4gdG8gY292ZXIgdGhlIHNwbGl0IGJldHdlZW4gcGxhbmVzIG9yIHp6aQorICAgIGlmIChibG9ja3NfZW5kZWQpCisgICAgICAgIGRjdF90b2tlbnNbaisrXSA9IGJsb2Nrc19lbmRlZCA8PCAyOworCisgICAgd2hpbGUgKGNvZWZmX2kgPCBudW1fY29lZmZzICYmIGdldF9iaXRzX2xlZnQoZ2IpID4gMCkgeworICAgICAgICAvKiBkZWNvZGUgYSBWTEMgaW50byBhIHRva2VuICovCisgICAgICAgIHRva2VuID0gZ2V0X3ZsYzIoZ2IsIHZsY190YWJsZSwgMTEsIDMpOworICAgICAgICAvKiB1c2UgdGhlIHRva2VuIHRvIGdldCBhIHplcm8gcnVuLCBhIGNvZWZmaWNpZW50LCBhbmQgYW4gZW9iIHJ1biAqLworICAgICAgICBpZiAoKHVuc2lnbmVkKSB0b2tlbiA8PSA2VSkgeworICAgICAgICAgICAgZW9iX3J1biA9IGVvYl9ydW5fYmFzZVt0b2tlbl07CisgICAgICAgICAgICBpZiAoZW9iX3J1bl9nZXRfYml0c1t0b2tlbl0pCisgICAgICAgICAgICAgICAgZW9iX3J1biArPSBnZXRfYml0cyhnYiwgZW9iX3J1bl9nZXRfYml0c1t0b2tlbl0pOworCisgICAgICAgICAgICAvLyByZWNvcmQgb25seSB0aGUgbnVtYmVyIG9mIGJsb2NrcyBlbmRlZCBpbiB0aGlzIHBsYW5lLAorICAgICAgICAgICAgLy8gYW55IHNwaWxsIHdpbGwgYmUgcmVjb3JkZWQgaW4gdGhlIG5leHQgcGxhbmUuCisgICAgICAgICAgICBpZiAoZW9iX3J1biA+IG51bV9jb2VmZnMgLSBjb2VmZl9pKSB7CisgICAgICAgICAgICAgICAgZGN0X3Rva2Vuc1tqKytdID0gVE9LRU5fRU9CKG51bV9jb2VmZnMgLSBjb2VmZl9pKTsKKyAgICAgICAgICAgICAgICBibG9ja3NfZW5kZWQgICArPSBudW1fY29lZmZzIC0gY29lZmZfaTsKKyAgICAgICAgICAgICAgICBlb2JfcnVuICAgICAgICAtPSBudW1fY29lZmZzIC0gY29lZmZfaTsKKyAgICAgICAgICAgICAgICBjb2VmZl9pICAgICAgICAgPSBudW1fY29lZmZzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkY3RfdG9rZW5zW2orK10gPSBUT0tFTl9FT0IoZW9iX3J1bik7CisgICAgICAgICAgICAgICAgYmxvY2tzX2VuZGVkICAgKz0gZW9iX3J1bjsKKyAgICAgICAgICAgICAgICBjb2VmZl9pICAgICAgICArPSBlb2JfcnVuOworICAgICAgICAgICAgICAgIGVvYl9ydW4gICAgICAgICA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPj0gMCkgeworICAgICAgICAgICAgYml0c190b19nZXQgPSBjb2VmZl9nZXRfYml0c1t0b2tlbl07CisgICAgICAgICAgICBpZiAoYml0c190b19nZXQpCisgICAgICAgICAgICAgICAgYml0c190b19nZXQgPSBnZXRfYml0cyhnYiwgYml0c190b19nZXQpOworICAgICAgICAgICAgY29lZmYgPSBjb2VmZl90YWJsZXNbdG9rZW5dW2JpdHNfdG9fZ2V0XTsKKworICAgICAgICAgICAgemVyb19ydW4gPSB6ZXJvX3J1bl9iYXNlW3Rva2VuXTsKKyAgICAgICAgICAgIGlmICh6ZXJvX3J1bl9nZXRfYml0c1t0b2tlbl0pCisgICAgICAgICAgICAgICAgemVyb19ydW4gKz0gZ2V0X2JpdHMoZ2IsIHplcm9fcnVuX2dldF9iaXRzW3Rva2VuXSk7CisKKyAgICAgICAgICAgIGlmICh6ZXJvX3J1bikgeworICAgICAgICAgICAgICAgIGRjdF90b2tlbnNbaisrXSA9IFRPS0VOX1pFUk9fUlVOKGNvZWZmLCB6ZXJvX3J1bik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFNhdmUgREMgaW50byB0aGUgZnJhZ21lbnQgc3RydWN0dXJlLiBEQyBwcmVkaWN0aW9uIGlzCisgICAgICAgICAgICAgICAgLy8gZG9uZSBpbiByYXN0ZXIgb3JkZXIsIHNvIHRoZSBhY3R1YWwgREMgY2FuJ3QgYmUgaW4gd2l0aAorICAgICAgICAgICAgICAgIC8vIG90aGVyIHRva2Vucy4gV2Ugc3RpbGwgbmVlZCB0aGUgdG9rZW4gaW4gZGN0X3Rva2Vuc1tdCisgICAgICAgICAgICAgICAgLy8gaG93ZXZlciwgb3IgZWxzZSB0aGUgc3RydWN0dXJlIGNvbGxhcHNlcyBvbiBpdHNlbGYuCisgICAgICAgICAgICAgICAgaWYgKCFjb2VmZl9pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgYWxsX2ZyYWdtZW50c1tjb2RlZF9mcmFnbWVudF9saXN0W2NvZWZmX2ldXS5kYyA9IGNvZWZmOworCisgICAgICAgICAgICAgICAgZGN0X3Rva2Vuc1tqKytdID0gVE9LRU5fQ09FRkYoY29lZmYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29lZmZfaW5kZXggKyB6ZXJvX3J1biA+IDY0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHplcm8gcnVuIG9mICVkIHdpdGggJWQgY29lZmZzIGxlZnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHplcm9fcnVuLCA2NCAtIGNvZWZmX2luZGV4KTsKKyAgICAgICAgICAgICAgICB6ZXJvX3J1biA9IDY0IC0gY29lZmZfaW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHplcm8gcnVucyBjb2RlIG11bHRpcGxlIGNvZWZmaWNpZW50cywKKyAgICAgICAgICAgIC8vIHNvIGRvbid0IHRyeSB0byBkZWNvZGUgY29lZmZzIGZvciB0aG9zZSBoaWdoZXIgbGV2ZWxzCisgICAgICAgICAgICBmb3IgKGkgPSBjb2VmZl9pbmRleCArIDE7IGkgPD0gY29lZmZfaW5kZXggKyB6ZXJvX3J1bjsgaSsrKQorICAgICAgICAgICAgICAgIHMtPm51bV9jb2RlZF9mcmFnc1twbGFuZV1baV0tLTsKKyAgICAgICAgICAgIGNvZWZmX2krKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCB0b2tlbiAlZFxuIiwgdG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJsb2Nrc19lbmRlZCA+IHMtPm51bV9jb2RlZF9mcmFnc1twbGFuZV1bY29lZmZfaW5kZXhdKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1vcmUgYmxvY2tzIGVuZGVkIHRoYW4gY29kZWQhXG4iKTsKKworICAgIC8vIGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGhhdmUgaGlnaGVyIGNvZWZmaWNpZW50cyBmb3IgZWFjaAorICAgIC8vIEVPQiBydW4gYXQgdGhpcyBsZXZlbAorICAgIGlmIChibG9ja3NfZW5kZWQpCisgICAgICAgIGZvciAoaSA9IGNvZWZmX2luZGV4ICsgMTsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICBzLT5udW1fY29kZWRfZnJhZ3NbcGxhbmVdW2ldIC09IGJsb2Nrc19lbmRlZDsKKworICAgIC8vIHNldHVwIHRoZSBuZXh0IGJ1ZmZlcgorICAgIGlmIChwbGFuZSA8IDIpCisgICAgICAgIHMtPmRjdF90b2tlbnNbcGxhbmUgKyAxXVtjb2VmZl9pbmRleF0gPSBkY3RfdG9rZW5zICsgajsKKyAgICBlbHNlIGlmIChjb2VmZl9pbmRleCA8IDYzKQorICAgICAgICBzLT5kY3RfdG9rZW5zWzBdW2NvZWZmX2luZGV4ICsgMV0gPSBkY3RfdG9rZW5zICsgajsKKworICAgIHJldHVybiBlb2JfcnVuOworfQorCitzdGF0aWMgdm9pZCByZXZlcnNlX2RjX3ByZWRpY3Rpb24oVnAzRGVjb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RfZnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYWdtZW50X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFnbWVudF9oZWlnaHQpOworLyoKKyAqIFRoaXMgZnVuY3Rpb24gdW5wYWNrcyBhbGwgb2YgdGhlIERDVCBjb2VmZmljaWVudCBkYXRhIGZyb20gdGhlCisgKiBiaXRzdHJlYW0uCisgKi8KK3N0YXRpYyBpbnQgdW5wYWNrX2RjdF9jb2VmZnMoVnAzRGVjb2RlQ29udGV4dCAqcywgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IGk7CisgICAgaW50IGRjX3lfdGFibGU7CisgICAgaW50IGRjX2NfdGFibGU7CisgICAgaW50IGFjX3lfdGFibGU7CisgICAgaW50IGFjX2NfdGFibGU7CisgICAgaW50IHJlc2lkdWFsX2VvYl9ydW4gPSAwOworICAgIFZMQyAqeV90YWJsZXNbNjRdOworICAgIFZMQyAqY190YWJsZXNbNjRdOworCisgICAgcy0+ZGN0X3Rva2Vuc1swXVswXSA9IHMtPmRjdF90b2tlbnNfYmFzZTsKKworICAgIC8qIGZldGNoIHRoZSBEQyB0YWJsZSBpbmRleGVzICovCisgICAgZGNfeV90YWJsZSA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICBkY19jX3RhYmxlID0gZ2V0X2JpdHMoZ2IsIDQpOworCisgICAgLyogdW5wYWNrIHRoZSBZIHBsYW5lIERDIGNvZWZmaWNpZW50cyAqLworICAgIHJlc2lkdWFsX2VvYl9ydW4gPSB1bnBhY2tfdmxjcyhzLCBnYiwgJnMtPmRjX3ZsY1tkY195X3RhYmxlXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcmVzaWR1YWxfZW9iX3J1bik7CisgICAgaWYgKHJlc2lkdWFsX2VvYl9ydW4gPCAwKQorICAgICAgICByZXR1cm4gcmVzaWR1YWxfZW9iX3J1bjsKKworICAgIC8qIHJldmVyc2UgcHJlZGljdGlvbiBvZiB0aGUgWS1wbGFuZSBEQyBjb2VmZmljaWVudHMgKi8KKyAgICByZXZlcnNlX2RjX3ByZWRpY3Rpb24ocywgMCwgcy0+ZnJhZ21lbnRfd2lkdGhbMF0sIHMtPmZyYWdtZW50X2hlaWdodFswXSk7CisKKyAgICAvKiB1bnBhY2sgdGhlIEMgcGxhbmUgREMgY29lZmZpY2llbnRzICovCisgICAgcmVzaWR1YWxfZW9iX3J1biA9IHVucGFja192bGNzKHMsIGdiLCAmcy0+ZGNfdmxjW2RjX2NfdGFibGVdLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCByZXNpZHVhbF9lb2JfcnVuKTsKKyAgICBpZiAocmVzaWR1YWxfZW9iX3J1biA8IDApCisgICAgICAgIHJldHVybiByZXNpZHVhbF9lb2JfcnVuOworICAgIHJlc2lkdWFsX2VvYl9ydW4gPSB1bnBhY2tfdmxjcyhzLCBnYiwgJnMtPmRjX3ZsY1tkY19jX3RhYmxlXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgcmVzaWR1YWxfZW9iX3J1bik7CisgICAgaWYgKHJlc2lkdWFsX2VvYl9ydW4gPCAwKQorICAgICAgICByZXR1cm4gcmVzaWR1YWxfZW9iX3J1bjsKKworICAgIC8qIHJldmVyc2UgcHJlZGljdGlvbiBvZiB0aGUgQy1wbGFuZSBEQyBjb2VmZmljaWVudHMgKi8KKyAgICBpZiAoIShzLT5hdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgICAgIHJldmVyc2VfZGNfcHJlZGljdGlvbihzLCBzLT5mcmFnbWVudF9zdGFydFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYWdtZW50X3dpZHRoWzFdLCBzLT5mcmFnbWVudF9oZWlnaHRbMV0pOworICAgICAgICByZXZlcnNlX2RjX3ByZWRpY3Rpb24ocywgcy0+ZnJhZ21lbnRfc3RhcnRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFnbWVudF93aWR0aFsxXSwgcy0+ZnJhZ21lbnRfaGVpZ2h0WzFdKTsKKyAgICB9CisKKyAgICAvKiBmZXRjaCB0aGUgQUMgdGFibGUgaW5kZXhlcyAqLworICAgIGFjX3lfdGFibGUgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgYWNfY190YWJsZSA9IGdldF9iaXRzKGdiLCA0KTsKKworICAgIC8qIGJ1aWxkIHRhYmxlcyBvZiBBQyBWTEMgdGFibGVzICovCisgICAgZm9yIChpID0gMTsgaSA8PSA1OyBpKyspIHsKKyAgICAgICAgeV90YWJsZXNbaV0gPSAmcy0+YWNfdmxjXzFbYWNfeV90YWJsZV07CisgICAgICAgIGNfdGFibGVzW2ldID0gJnMtPmFjX3ZsY18xW2FjX2NfdGFibGVdOworICAgIH0KKyAgICBmb3IgKGkgPSA2OyBpIDw9IDE0OyBpKyspIHsKKyAgICAgICAgeV90YWJsZXNbaV0gPSAmcy0+YWNfdmxjXzJbYWNfeV90YWJsZV07CisgICAgICAgIGNfdGFibGVzW2ldID0gJnMtPmFjX3ZsY18yW2FjX2NfdGFibGVdOworICAgIH0KKyAgICBmb3IgKGkgPSAxNTsgaSA8PSAyNzsgaSsrKSB7CisgICAgICAgIHlfdGFibGVzW2ldID0gJnMtPmFjX3ZsY18zW2FjX3lfdGFibGVdOworICAgICAgICBjX3RhYmxlc1tpXSA9ICZzLT5hY192bGNfM1thY19jX3RhYmxlXTsKKyAgICB9CisgICAgZm9yIChpID0gMjg7IGkgPD0gNjM7IGkrKykgeworICAgICAgICB5X3RhYmxlc1tpXSA9ICZzLT5hY192bGNfNFthY195X3RhYmxlXTsKKyAgICAgICAgY190YWJsZXNbaV0gPSAmcy0+YWNfdmxjXzRbYWNfY190YWJsZV07CisgICAgfQorCisgICAgLyogZGVjb2RlIGFsbCBBQyBjb2VmZmljZW50cyAqLworICAgIGZvciAoaSA9IDE7IGkgPD0gNjM7IGkrKykgeworICAgICAgICByZXNpZHVhbF9lb2JfcnVuID0gdW5wYWNrX3ZsY3MocywgZ2IsIHlfdGFibGVzW2ldLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcmVzaWR1YWxfZW9iX3J1bik7CisgICAgICAgIGlmIChyZXNpZHVhbF9lb2JfcnVuIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXNpZHVhbF9lb2JfcnVuOworCisgICAgICAgIHJlc2lkdWFsX2VvYl9ydW4gPSB1bnBhY2tfdmxjcyhzLCBnYiwgY190YWJsZXNbaV0sIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCByZXNpZHVhbF9lb2JfcnVuKTsKKyAgICAgICAgaWYgKHJlc2lkdWFsX2VvYl9ydW4gPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlc2lkdWFsX2VvYl9ydW47CisgICAgICAgIHJlc2lkdWFsX2VvYl9ydW4gPSB1bnBhY2tfdmxjcyhzLCBnYiwgY190YWJsZXNbaV0sIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCByZXNpZHVhbF9lb2JfcnVuKTsKKyAgICAgICAgaWYgKHJlc2lkdWFsX2VvYl9ydW4gPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlc2lkdWFsX2VvYl9ydW47CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJldmVyc2VzIHRoZSBEQyBwcmVkaWN0aW9uIGZvciBlYWNoIGNvZGVkIGZyYWdtZW50IGluCisgKiB0aGUgZnJhbWUuIE11Y2ggb2YgdGhpcyBmdW5jdGlvbiBpcyBhZGFwdGVkIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsCisgKiBWUDMgc291cmNlIGNvZGUuCisgKi8KKyNkZWZpbmUgQ09NUEFUSUJMRV9GUkFNRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoY29tcGF0aWJsZV9mcmFtZVtzLT5hbGxfZnJhZ21lbnRzW3hdLmNvZGluZ19tZXRob2RdID09IGN1cnJlbnRfZnJhbWVfdHlwZSkKKyNkZWZpbmUgRENfQ09FRkYodSkgcy0+YWxsX2ZyYWdtZW50c1t1XS5kYworCitzdGF0aWMgdm9pZCByZXZlcnNlX2RjX3ByZWRpY3Rpb24oVnAzRGVjb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RfZnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYWdtZW50X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFnbWVudF9oZWlnaHQpCit7CisjZGVmaW5lIFBVTCA4CisjZGVmaW5lIFBVIDQKKyNkZWZpbmUgUFVSIDIKKyNkZWZpbmUgUEwgMQorCisgICAgaW50IHgsIHk7CisgICAgaW50IGkgPSBmaXJzdF9mcmFnbWVudDsKKworICAgIGludCBwcmVkaWN0ZWRfZGM7CisKKyAgICAvKiBEQyB2YWx1ZXMgZm9yIHRoZSBsZWZ0LCB1cC1sZWZ0LCB1cCwgYW5kIHVwLXJpZ2h0IGZyYWdtZW50cyAqLworICAgIGludCB2bCwgdnVsLCB2dSwgdnVyOworCisgICAgLyogaW5kZXhlcyBmb3IgdGhlIGxlZnQsIHVwLWxlZnQsIHVwLCBhbmQgdXAtcmlnaHQgZnJhZ21lbnRzICovCisgICAgaW50IGwsIHVsLCB1LCB1cjsKKworICAgIC8qCisgICAgICogVGhlIDYgZmllbGRzIG1lYW46CisgICAgICogICAwOiB1cC1sZWZ0IG11bHRpcGxpZXIKKyAgICAgKiAgIDE6IHVwIG11bHRpcGxpZXIKKyAgICAgKiAgIDI6IHVwLXJpZ2h0IG11bHRpcGxpZXIKKyAgICAgKiAgIDM6IGxlZnQgbXVsdGlwbGllcgorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgcHJlZGljdG9yX3RyYW5zZm9ybVsxNl1bNF0gPSB7CisgICAgICAgIHsgICAgMCwgICAwLCAgIDAsICAgMCB9LAorICAgICAgICB7ICAgIDAsICAgMCwgICAwLCAxMjggfSwgLy8gUEwKKyAgICAgICAgeyAgICAwLCAgIDAsIDEyOCwgICAwIH0sIC8vIFBVUgorICAgICAgICB7ICAgIDAsICAgMCwgIDUzLCAgNzUgfSwgLy8gUFVSfFBMCisgICAgICAgIHsgICAgMCwgMTI4LCAgIDAsICAgMCB9LCAvLyBQVQorICAgICAgICB7ICAgIDAsICA2NCwgICAwLCAgNjQgfSwgLy8gUFUgfFBMCisgICAgICAgIHsgICAgMCwgMTI4LCAgIDAsICAgMCB9LCAvLyBQVSB8UFVSCisgICAgICAgIHsgICAgMCwgICAwLCAgNTMsICA3NSB9LCAvLyBQVSB8UFVSfFBMCisgICAgICAgIHsgIDEyOCwgICAwLCAgIDAsICAgMCB9LCAvLyBQVUwKKyAgICAgICAgeyAgICAwLCAgIDAsICAgMCwgMTI4IH0sIC8vIFBVTHxQTAorICAgICAgICB7ICAgNjQsICAgMCwgIDY0LCAgIDAgfSwgLy8gUFVMfFBVUgorICAgICAgICB7ICAgIDAsICAgMCwgIDUzLCAgNzUgfSwgLy8gUFVMfFBVUnxQTAorICAgICAgICB7ICAgIDAsIDEyOCwgICAwLCAgIDAgfSwgLy8gUFVMfFBVCisgICAgICAgIHsgLTEwNCwgMTE2LCAgIDAsIDExNiB9LCAvLyBQVUx8UFUgfFBMCisgICAgICAgIHsgICAyNCwgIDgwLCAgMjQsICAgMCB9LCAvLyBQVUx8UFUgfFBVUgorICAgICAgICB7IC0xMDQsIDExNiwgICAwLCAxMTYgfSAgLy8gUFVMfFBVIHxQVVJ8UEwKKyAgICB9OworCisgICAgLyogVGhpcyB0YWJsZSBzaG93cyB3aGljaCB0eXBlcyBvZiBibG9ja3MgY2FuIHVzZSBvdGhlciBibG9ja3MgZm9yCisgICAgICogcHJlZGljdGlvbi4gRm9yIGV4YW1wbGUsIElOVFJBIGlzIHRoZSBvbmx5IG1vZGUgaW4gdGhpcyB0YWJsZSB0bworICAgICAqIGhhdmUgYSBmcmFtZSBudW1iZXIgb2YgMC4gVGhhdCBtZWFucyBJTlRSQSBibG9ja3MgY2FuIG9ubHkgcHJlZGljdAorICAgICAqIGZyb20gb3RoZXIgSU5UUkEgYmxvY2tzLiBUaGVyZSBhcmUgMiBnb2xkZW4gZnJhbWUgY29kaW5nIHR5cGVzOworICAgICAqIGJsb2NrcyBlbmNvZGluZyBpbiB0aGVzZSBtb2RlcyBjYW4gb25seSBwcmVkaWN0IGZyb20gb3RoZXIgYmxvY2tzCisgICAgICogdGhhdCB3ZXJlIGVuY29kZWQgd2l0aCB0aGVzZSAxIG9mIHRoZXNlIDIgbW9kZXMuICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY29tcGF0aWJsZV9mcmFtZVs5XSA9IHsKKyAgICAgICAgMSwgICAgLyogTU9ERV9JTlRFUl9OT19NViAqLworICAgICAgICAwLCAgICAvKiBNT0RFX0lOVFJBICovCisgICAgICAgIDEsICAgIC8qIE1PREVfSU5URVJfUExVU19NViAqLworICAgICAgICAxLCAgICAvKiBNT0RFX0lOVEVSX0xBU1RfTVYgKi8KKyAgICAgICAgMSwgICAgLyogTU9ERV9JTlRFUl9QUklPUl9NViAqLworICAgICAgICAyLCAgICAvKiBNT0RFX1VTSU5HX0dPTERFTiAqLworICAgICAgICAyLCAgICAvKiBNT0RFX0dPTERFTl9NViAqLworICAgICAgICAxLCAgICAvKiBNT0RFX0lOVEVSX0ZPVVJfTVYgKi8KKyAgICAgICAgMyAgICAgLyogTU9ERV9DT1BZICovCisgICAgfTsKKyAgICBpbnQgY3VycmVudF9mcmFtZV90eXBlOworCisgICAgLyogdGhlcmUgaXMgYSBsYXN0IERDIHByZWRpY3RvciBmb3IgZWFjaCBvZiB0aGUgMyBmcmFtZSB0eXBlcyAqLworICAgIHNob3J0IGxhc3RfZGNbM107CisKKyAgICBpbnQgdHJhbnNmb3JtID0gMDsKKworICAgIHZ1bCA9CisgICAgdnUgID0KKyAgICB2dXIgPQorICAgIHZsICA9IDA7CisgICAgbGFzdF9kY1swXSA9CisgICAgbGFzdF9kY1sxXSA9CisgICAgbGFzdF9kY1syXSA9IDA7CisKKyAgICAvKiBmb3IgZWFjaCBmcmFnbWVudCByb3cuLi4gKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgZnJhZ21lbnRfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgLyogZm9yIGVhY2ggZnJhZ21lbnQgaW4gYSByb3cuLi4gKi8KKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGZyYWdtZW50X3dpZHRoOyB4KyssIGkrKykgeworCisgICAgICAgICAgICAvKiByZXZlcnNlIHByZWRpY3Rpb24gaWYgdGhpcyBibG9jayB3YXMgY29kZWQgKi8KKyAgICAgICAgICAgIGlmIChzLT5hbGxfZnJhZ21lbnRzW2ldLmNvZGluZ19tZXRob2QgIT0gTU9ERV9DT1BZKSB7CisgICAgICAgICAgICAgICAgY3VycmVudF9mcmFtZV90eXBlID0KKyAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZV9mcmFtZVtzLT5hbGxfZnJhZ21lbnRzW2ldLmNvZGluZ19tZXRob2RdOworCisgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoeCkgeworICAgICAgICAgICAgICAgICAgICBsICA9IGkgLSAxOworICAgICAgICAgICAgICAgICAgICB2bCA9IERDX0NPRUZGKGwpOworICAgICAgICAgICAgICAgICAgICBpZiAoQ09NUEFUSUJMRV9GUkFNRShsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSB8PSBQTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHkpIHsKKyAgICAgICAgICAgICAgICAgICAgdSAgPSBpIC0gZnJhZ21lbnRfd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIHZ1ID0gRENfQ09FRkYodSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChDT01QQVRJQkxFX0ZSQU1FKHUpKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtIHw9IFBVOworICAgICAgICAgICAgICAgICAgICBpZiAoeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdWwgID0gaSAtIGZyYWdtZW50X3dpZHRoIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZ1bCA9IERDX0NPRUZGKHVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDT01QQVRJQkxFX0ZSQU1FKHVsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gfD0gUFVMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh4ICsgMSA8IGZyYWdtZW50X3dpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1ciAgPSBpIC0gZnJhZ21lbnRfd2lkdGggKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgdnVyID0gRENfQ09FRkYodXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENPTVBBVElCTEVfRlJBTUUodXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSB8PSBQVVI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlcmUgd2VyZSBubyBmcmFnbWVudHMgdG8gcHJlZGljdCBmcm9tLCB1c2UgbGFzdAorICAgICAgICAgICAgICAgICAgICAgKiBEQyBzYXZlZCAqLworICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWRfZGMgPSBsYXN0X2RjW2N1cnJlbnRfZnJhbWVfdHlwZV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYXBwbHkgdGhlIGFwcHJvcHJpYXRlIHByZWRpY3RvciB0cmFuc2Zvcm0gKi8KKyAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX2RjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChwcmVkaWN0b3JfdHJhbnNmb3JtW3RyYW5zZm9ybV1bMF0gKiB2dWwpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChwcmVkaWN0b3JfdHJhbnNmb3JtW3RyYW5zZm9ybV1bMV0gKiB2dSkgKworICAgICAgICAgICAgICAgICAgICAgICAgKHByZWRpY3Rvcl90cmFuc2Zvcm1bdHJhbnNmb3JtXVsyXSAqIHZ1cikgKworICAgICAgICAgICAgICAgICAgICAgICAgKHByZWRpY3Rvcl90cmFuc2Zvcm1bdHJhbnNmb3JtXVszXSAqIHZsKTsKKworICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWRfZGMgLz0gMTI4OworCisgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGZvciBvdXRyYW5naW5nIG9uIHRoZSBbdWwgdSBsXSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICogW3VsIHUgdXIgbF0gcHJlZGljdG9ycyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKHRyYW5zZm9ybSA9PSAxNSkgfHwgKHRyYW5zZm9ybSA9PSAxMykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGRkFCUyhwcmVkaWN0ZWRfZGMgLSB2dSkgPiAxMjgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX2RjID0gdnU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChGRkFCUyhwcmVkaWN0ZWRfZGMgLSB2bCkgPiAxMjgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX2RjID0gdmw7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChGRkFCUyhwcmVkaWN0ZWRfZGMgLSB2dWwpID4gMTI4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RlZF9kYyA9IHZ1bDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGF0IGxvbmcgbGFzdCwgYXBwbHkgdGhlIHByZWRpY3RvciAqLworICAgICAgICAgICAgICAgIERDX0NPRUZGKGkpICs9IHByZWRpY3RlZF9kYzsKKyAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBEQyAqLworICAgICAgICAgICAgICAgIGxhc3RfZGNbY3VycmVudF9mcmFtZV90eXBlXSA9IERDX0NPRUZGKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhcHBseV9sb29wX2ZpbHRlcihWcDNEZWNvZGVDb250ZXh0ICpzLCBpbnQgcGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0YXJ0LCBpbnQgeWVuZCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgKmJvdW5kaW5nX3ZhbHVlcyA9IHMtPmJvdW5kaW5nX3ZhbHVlc19hcnJheSArIDEyNzsKKworICAgIGludCB3aWR0aCAgICAgICAgICAgPSBzLT5mcmFnbWVudF93aWR0aFshIXBsYW5lXTsKKyAgICBpbnQgaGVpZ2h0ICAgICAgICAgID0gcy0+ZnJhZ21lbnRfaGVpZ2h0WyEhcGxhbmVdOworICAgIGludCBmcmFnbWVudCAgICAgICAgPSBzLT5mcmFnbWVudF9zdGFydFtwbGFuZV0gKyB5c3RhcnQgKiB3aWR0aDsKKyAgICBwdHJkaWZmX3Qgc3RyaWRlICAgID0gcy0+Y3VycmVudF9mcmFtZS5mLT5saW5lc2l6ZVtwbGFuZV07CisgICAgdWludDhfdCAqcGxhbmVfZGF0YSA9IHMtPmN1cnJlbnRfZnJhbWUuZi0+ZGF0YVtwbGFuZV07CisgICAgaWYgKCFzLT5mbGlwcGVkX2ltYWdlKQorICAgICAgICBzdHJpZGUgPSAtc3RyaWRlOworICAgIHBsYW5lX2RhdGEgKz0gcy0+ZGF0YV9vZmZzZXRbcGxhbmVdICsgOCAqIHlzdGFydCAqIHN0cmlkZTsKKworICAgIGZvciAoeSA9IHlzdGFydDsgeSA8IHllbmQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgLyogVGhpcyBjb2RlIGJhc2ljYWxseSBqdXN0IGRlYmxvY2tzIG9uIHRoZSBlZGdlcyBvZiBjb2RlZCBibG9ja3MuCisgICAgICAgICAgICAgKiBIb3dldmVyLCBpdCBoYXMgdG8gYmUgbXVjaCBtb3JlIGNvbXBsaWNhdGVkIGJlY2F1c2Ugb2YgdGhlCisgICAgICAgICAgICAgKiBicmFpbmRhbWFnZWQgZGVibG9jayBvcmRlcmluZyB1c2VkIGluIFZQMy9UaGVvcmEuIE9yZGVyIG1hdHRlcnMKKyAgICAgICAgICAgICAqIGJlY2F1c2Ugc29tZSBwaXhlbHMgZ2V0IGZpbHRlcmVkIHR3aWNlLiAqLworICAgICAgICAgICAgaWYgKHMtPmFsbF9mcmFnbWVudHNbZnJhZ21lbnRdLmNvZGluZ19tZXRob2QgIT0gTU9ERV9DT1BZKSB7CisgICAgICAgICAgICAgICAgLyogZG8gbm90IHBlcmZvcm0gbGVmdCBlZGdlIGZpbHRlciBmb3IgbGVmdCBjb2x1bW5zIGZyYWdzICovCisgICAgICAgICAgICAgICAgaWYgKHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnZwM2RzcC5oX2xvb3BfZmlsdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfZGF0YSArIDggKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBib3VuZGluZ192YWx1ZXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGRvIG5vdCBwZXJmb3JtIHRvcCBlZGdlIGZpbHRlciBmb3IgdG9wIHJvdyBmcmFnbWVudHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoeSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+dnAzZHNwLnZfbG9vcF9maWx0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9kYXRhICsgOCAqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIGJvdW5kaW5nX3ZhbHVlcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogZG8gbm90IHBlcmZvcm0gcmlnaHQgZWRnZSBmaWx0ZXIgZm9yIHJpZ2h0IGNvbHVtbgorICAgICAgICAgICAgICAgICAqIGZyYWdtZW50cyBvciBpZiByaWdodCBmcmFnbWVudCBuZWlnaGJvciBpcyBhbHNvIGNvZGVkCisgICAgICAgICAgICAgICAgICogaW4gdGhpcyBmcmFtZSAoaXQgd2lsbCBiZSBmaWx0ZXJlZCBpbiBuZXh0IGl0ZXJhdGlvbikgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHggPCB3aWR0aCAtIDEpICYmCisgICAgICAgICAgICAgICAgICAgIChzLT5hbGxfZnJhZ21lbnRzW2ZyYWdtZW50ICsgMV0uY29kaW5nX21ldGhvZCA9PSBNT0RFX0NPUFkpKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnZwM2RzcC5oX2xvb3BfZmlsdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfZGF0YSArIDggKiB4ICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgYm91bmRpbmdfdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBkbyBub3QgcGVyZm9ybSBib3R0b20gZWRnZSBmaWx0ZXIgZm9yIGJvdHRvbSByb3cKKyAgICAgICAgICAgICAgICAgKiBmcmFnbWVudHMgb3IgaWYgYm90dG9tIGZyYWdtZW50IG5laWdoYm9yIGlzIGFsc28gY29kZWQKKyAgICAgICAgICAgICAgICAgKiBpbiB0aGlzIGZyYW1lIChpdCB3aWxsIGJlIGZpbHRlcmVkIGluIHRoZSBuZXh0IHJvdykgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHkgPCBoZWlnaHQgLSAxKSAmJgorICAgICAgICAgICAgICAgICAgICAocy0+YWxsX2ZyYWdtZW50c1tmcmFnbWVudCArIHdpZHRoXS5jb2RpbmdfbWV0aG9kID09IE1PREVfQ09QWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+dnAzZHNwLnZfbG9vcF9maWx0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9kYXRhICsgOCAqIHggKyA4ICogc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBib3VuZGluZ192YWx1ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnJhZ21lbnQrKzsKKyAgICAgICAgfQorICAgICAgICBwbGFuZV9kYXRhICs9IDggKiBzdHJpZGU7CisgICAgfQorfQorCisvKioKKyAqIFB1bGwgRENUIHRva2VucyBmcm9tIHRoZSA2NCBsZXZlbHMgdG8gZGVjb2RlIGFuZCBkZXF1YW50IHRoZSBjb2VmZmljaWVudHMKKyAqIGZvciB0aGUgbmV4dCBibG9jayBpbiBjb2Rpbmcgb3JkZXIKKyAqLworc3RhdGljIGlubGluZSBpbnQgdnAzX2RlcXVhbnQoVnAzRGVjb2RlQ29udGV4dCAqcywgVnAzRnJhZ21lbnQgKmZyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhbmUsIGludCBpbnRlciwgaW50MTZfdCBibG9ja1s2NF0pCit7CisgICAgaW50MTZfdCAqZGVxdWFudGl6ZXIgPSBzLT5xbWF0W2ZyYWctPnFwaV1baW50ZXJdW3BsYW5lXTsKKyAgICB1aW50OF90ICpwZXJtID0gcy0+aWRjdF9zY2FudGFibGU7CisgICAgaW50IGkgPSAwOworCisgICAgZG8geworICAgICAgICBpbnQgdG9rZW4gPSAqcy0+ZGN0X3Rva2Vuc1twbGFuZV1baV07CisgICAgICAgIHN3aXRjaCAodG9rZW4gJiAzKSB7CisgICAgICAgIGNhc2UgMDogLy8gRU9CCisgICAgICAgICAgICBpZiAoLS10b2tlbiA8IDQpIC8vIDAtMyBhcmUgdG9rZW4gdHlwZXMgc28gdGhlIEVPQiBydW4gbXVzdCBub3cgYmUgMAorICAgICAgICAgICAgICAgIHMtPmRjdF90b2tlbnNbcGxhbmVdW2ldKys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKnMtPmRjdF90b2tlbnNbcGxhbmVdW2ldID0gdG9rZW4gJiB+MzsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBjYXNlIDE6IC8vIHplcm8gcnVuCisgICAgICAgICAgICBzLT5kY3RfdG9rZW5zW3BsYW5lXVtpXSsrOworICAgICAgICAgICAgaSArPSAodG9rZW4gPj4gMikgJiAweDdmOworICAgICAgICAgICAgaWYgKGkgPiA2MykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29lZmZpY2llbnQgaW5kZXggb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxvY2tbcGVybVtpXV0gPSAodG9rZW4gPj4gOSkgKiBkZXF1YW50aXplcltwZXJtW2ldXTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IC8vIGNvZWZmCisgICAgICAgICAgICBibG9ja1twZXJtW2ldXSA9ICh0b2tlbiA+PiAyKSAqIGRlcXVhbnRpemVyW3Blcm1baV1dOworICAgICAgICAgICAgcy0+ZGN0X3Rva2Vuc1twbGFuZV1baSsrXSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIHNob3VsZG4ndCBoYXBwZW4KKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfSB3aGlsZSAoaSA8IDY0KTsKKyAgICAvLyByZXR1cm4gdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgYSB2YWxpZCBsZXZlbAorICAgIGktLTsKK2VuZDoKKyAgICAvLyB0aGUgYWN0dWFsIERDK3ByZWRpY3Rpb24gaXMgaW4gdGhlIGZyYWdtZW50IHN0cnVjdHVyZQorICAgIGJsb2NrWzBdID0gZnJhZy0+ZGMgKiBzLT5xbWF0WzBdW2ludGVyXVtwbGFuZV1bMF07CisgICAgcmV0dXJuIGk7Cit9CisKKy8qKgorICogY2FsbGVkIHdoZW4gYWxsIHBpeGVscyB1cCB0byByb3cgeSBhcmUgY29tcGxldGUKKyAqLworc3RhdGljIHZvaWQgdnAzX2RyYXdfaG9yaXpfYmFuZChWcDNEZWNvZGVDb250ZXh0ICpzLCBpbnQgeSkKK3sKKyAgICBpbnQgaCwgY3ksIGk7CisgICAgaW50IG9mZnNldFtBVl9OVU1fREFUQV9QT0lOVEVSU107CisKKyAgICBpZiAoSEFWRV9USFJFQURTICYmIHMtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpIHsKKyAgICAgICAgaW50IHlfZmxpcHBlZCA9IHMtPmZsaXBwZWRfaW1hZ2UgPyBzLT5hdmN0eC0+aGVpZ2h0IC0geSA6IHk7CisKKyAgICAgICAgLyogQXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUsIHJlcG9ydCBJTlRfTUFYIGluc3RlYWQgb2YgdGhlIGhlaWdodCBvZgorICAgICAgICAgKiB0aGUgZnJhbWUuIFRoaXMgbWFrZXMgdGhlIG90aGVyIHRocmVhZHMnIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygpCisgICAgICAgICAqIGNhbGxzIGNoZWFwZXIsIGJlY2F1c2UgdGhleSBkb24ndCBoYXZlIHRvIGNsaXAgdGhlaXIgdmFsdWVzLiAqLworICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5jdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfZmxpcHBlZCA9PSBzLT5hdmN0eC0+aGVpZ2h0ID8gSU5UX01BWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeV9mbGlwcGVkIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICB9CisKKyAgICBpZiAoIXMtPmF2Y3R4LT5kcmF3X2hvcml6X2JhbmQpCisgICAgICAgIHJldHVybjsKKworICAgIGggPSB5IC0gcy0+bGFzdF9zbGljZV9lbmQ7CisgICAgcy0+bGFzdF9zbGljZV9lbmQgPSB5OworICAgIHkgLT0gaDsKKworICAgIGlmICghcy0+ZmxpcHBlZF9pbWFnZSkKKyAgICAgICAgeSA9IHMtPmF2Y3R4LT5oZWlnaHQgLSB5IC0gaDsKKworICAgIGN5ICAgICAgICA9IHkgPj4gcy0+Y2hyb21hX3lfc2hpZnQ7CisgICAgb2Zmc2V0WzBdID0gcy0+Y3VycmVudF9mcmFtZS5mLT5saW5lc2l6ZVswXSAqIHk7CisgICAgb2Zmc2V0WzFdID0gcy0+Y3VycmVudF9mcmFtZS5mLT5saW5lc2l6ZVsxXSAqIGN5OworICAgIG9mZnNldFsyXSA9IHMtPmN1cnJlbnRfZnJhbWUuZi0+bGluZXNpemVbMl0gKiBjeTsKKyAgICBmb3IgKGkgPSAzOyBpIDwgQVZfTlVNX0RBVEFfUE9JTlRFUlM7IGkrKykKKyAgICAgICAgb2Zmc2V0W2ldID0gMDsKKworICAgIGVtbXNfYygpOworICAgIHMtPmF2Y3R4LT5kcmF3X2hvcml6X2JhbmQocy0+YXZjdHgsIHMtPmN1cnJlbnRfZnJhbWUuZiwgb2Zmc2V0LCB5LCAzLCBoKTsKK30KKworLyoqCisgKiBXYWl0IGZvciB0aGUgcmVmZXJlbmNlIGZyYW1lIG9mIHRoZSBjdXJyZW50IGZyYWdtZW50LgorICogVGhlIHByb2dyZXNzIHZhbHVlIGlzIGluIGx1bWEgcGl4ZWwgcm93cy4KKyAqLworc3RhdGljIHZvaWQgYXdhaXRfcmVmZXJlbmNlX3JvdyhWcDNEZWNvZGVDb250ZXh0ICpzLCBWcDNGcmFnbWVudCAqZnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feSwgaW50IHkpCit7CisgICAgVGhyZWFkRnJhbWUgKnJlZl9mcmFtZTsKKyAgICBpbnQgcmVmX3JvdzsKKyAgICBpbnQgYm9yZGVyID0gbW90aW9uX3kgJiAxOworCisgICAgaWYgKGZyYWdtZW50LT5jb2RpbmdfbWV0aG9kID09IE1PREVfVVNJTkdfR09MREVOIHx8CisgICAgICAgIGZyYWdtZW50LT5jb2RpbmdfbWV0aG9kID09IE1PREVfR09MREVOX01WKQorICAgICAgICByZWZfZnJhbWUgPSAmcy0+Z29sZGVuX2ZyYW1lOworICAgIGVsc2UKKyAgICAgICAgcmVmX2ZyYW1lID0gJnMtPmxhc3RfZnJhbWU7CisKKyAgICByZWZfcm93ID0geSArIChtb3Rpb25feSA+PiAxKTsKKyAgICByZWZfcm93ID0gRkZNQVgoRkZBQlMocmVmX3JvdyksIHJlZl9yb3cgKyA4ICsgYm9yZGVyKTsKKworICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhyZWZfZnJhbWUsIHJlZl9yb3csIDApOworfQorCisvKgorICogUGVyZm9ybSB0aGUgZmluYWwgcmVuZGVyaW5nIGZvciBhIHBhcnRpY3VsYXIgc2xpY2Ugb2YgZGF0YS4KKyAqIFRoZSBzbGljZSBudW1iZXIgcmFuZ2VzIGZyb20gMC4uKGNfc3VwZXJibG9ja19oZWlnaHQgLSAxKS4KKyAqLworc3RhdGljIHZvaWQgcmVuZGVyX3NsaWNlKFZwM0RlY29kZUNvbnRleHQgKnMsIGludCBzbGljZSkKK3sKKyAgICBpbnQgeCwgeSwgaSwgaiwgZnJhZ21lbnQ7CisgICAgaW50MTZfdCAqYmxvY2sgPSBzLT5ibG9jazsKKyAgICBpbnQgbW90aW9uX3ggPSAweGRlYWRiZWVmLCBtb3Rpb25feSA9IDB4ZGVhZGJlZWY7CisgICAgaW50IG1vdGlvbl9oYWxmcGVsX2luZGV4OworICAgIHVpbnQ4X3QgKm1vdGlvbl9zb3VyY2U7CisgICAgaW50IHBsYW5lLCBmaXJzdF9waXhlbDsKKworICAgIGlmIChzbGljZSA+PSBzLT5jX3N1cGVyYmxvY2tfaGVpZ2h0KQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisgICAgICAgIHVpbnQ4X3QgKm91dHB1dF9wbGFuZSA9IHMtPmN1cnJlbnRfZnJhbWUuZi0+ZGF0YVtwbGFuZV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kYXRhX29mZnNldFtwbGFuZV07CisgICAgICAgIHVpbnQ4X3QgKmxhc3RfcGxhbmUgPSBzLT5sYXN0X2ZyYW1lLmYtPmRhdGFbcGxhbmVdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRhdGFfb2Zmc2V0W3BsYW5lXTsKKyAgICAgICAgdWludDhfdCAqZ29sZGVuX3BsYW5lID0gcy0+Z29sZGVuX2ZyYW1lLmYtPmRhdGFbcGxhbmVdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGF0YV9vZmZzZXRbcGxhbmVdOworICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlID0gcy0+Y3VycmVudF9mcmFtZS5mLT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIGludCBwbGFuZV93aWR0aCAgPSBzLT53aWR0aCAgPj4gKHBsYW5lICYmIHMtPmNocm9tYV94X3NoaWZ0KTsKKyAgICAgICAgaW50IHBsYW5lX2hlaWdodCA9IHMtPmhlaWdodCA+PiAocGxhbmUgJiYgcy0+Y2hyb21hX3lfc2hpZnQpOworICAgICAgICBpbnQ4X3QoKm1vdGlvbl92YWwpWzJdID0gcy0+bW90aW9uX3ZhbFshIXBsYW5lXTsKKworICAgICAgICBpbnQgc2JfeCwgc2JfeSA9IHNsaWNlIDw8ICghcGxhbmUgJiYgcy0+Y2hyb21hX3lfc2hpZnQpOworICAgICAgICBpbnQgc2xpY2VfaGVpZ2h0ID0gc2JfeSArIDEgKyAoIXBsYW5lICYmIHMtPmNocm9tYV95X3NoaWZ0KTsKKyAgICAgICAgaW50IHNsaWNlX3dpZHRoICA9IHBsYW5lID8gcy0+Y19zdXBlcmJsb2NrX3dpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHMtPnlfc3VwZXJibG9ja193aWR0aDsKKworICAgICAgICBpbnQgZnJhZ21lbnRfd2lkdGggID0gcy0+ZnJhZ21lbnRfd2lkdGhbISFwbGFuZV07CisgICAgICAgIGludCBmcmFnbWVudF9oZWlnaHQgPSBzLT5mcmFnbWVudF9oZWlnaHRbISFwbGFuZV07CisgICAgICAgIGludCBmcmFnbWVudF9zdGFydCAgPSBzLT5mcmFnbWVudF9zdGFydFtwbGFuZV07CisKKyAgICAgICAgaW50IGRvX2F3YWl0ID0gIXBsYW5lICYmIEhBVkVfVEhSRUFEUyAmJgorICAgICAgICAgICAgICAgICAgICAgICAocy0+YXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSk7CisKKyAgICAgICAgaWYgKCFzLT5mbGlwcGVkX2ltYWdlKQorICAgICAgICAgICAgc3RyaWRlID0gLXN0cmlkZTsKKyAgICAgICAgaWYgKENPTkZJR19HUkFZICYmIHBsYW5lICYmIChzLT5hdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0dSQVkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogZm9yIGVhY2ggc3VwZXJibG9jayByb3cgaW4gdGhlIHNsaWNlIChib3RoIG9mIHRoZW0pLi4uICovCisgICAgICAgIGZvciAoOyBzYl95IDwgc2xpY2VfaGVpZ2h0OyBzYl95KyspIHsKKyAgICAgICAgICAgIC8qIGZvciBlYWNoIHN1cGVyYmxvY2sgaW4gYSByb3cuLi4gKi8KKyAgICAgICAgICAgIGZvciAoc2JfeCA9IDA7IHNiX3ggPCBzbGljZV93aWR0aDsgc2JfeCsrKSB7CisgICAgICAgICAgICAgICAgLyogZm9yIGVhY2ggYmxvY2sgaW4gYSBzdXBlcmJsb2NrLi4uICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgeCAgICAgICAgPSA0ICogc2JfeCArIGhpbGJlcnRfb2Zmc2V0W2pdWzBdOworICAgICAgICAgICAgICAgICAgICB5ICAgICAgICA9IDQgKiBzYl95ICsgaGlsYmVydF9vZmZzZXRbal1bMV07CisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0geSAqIGZyYWdtZW50X3dpZHRoICsgeDsKKworICAgICAgICAgICAgICAgICAgICBpID0gZnJhZ21lbnRfc3RhcnQgKyBmcmFnbWVudDsKKworICAgICAgICAgICAgICAgICAgICAvLyBib3VuZHMgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPj0gZnJhZ21lbnRfd2lkdGggfHwgeSA+PSBmcmFnbWVudF9oZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBmaXJzdF9waXhlbCA9IDggKiB5ICogc3RyaWRlICsgOCAqIHg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRvX2F3YWl0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5hbGxfZnJhZ21lbnRzW2ldLmNvZGluZ19tZXRob2QgIT0gTU9ERV9JTlRSQSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0X3JlZmVyZW5jZV9yb3cocywgJnMtPmFsbF9mcmFnbWVudHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl92YWxbZnJhZ21lbnRdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTYgKiB5KSA+PiBzLT5jaHJvbWFfeV9zaGlmdCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogdHJhbnNmb3JtIGlmIHRoaXMgYmxvY2sgd2FzIGNvZGVkICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5hbGxfZnJhZ21lbnRzW2ldLmNvZGluZ19tZXRob2QgIT0gTU9ERV9DT1BZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHMtPmFsbF9mcmFnbWVudHNbaV0uY29kaW5nX21ldGhvZCA9PSBNT0RFX1VTSU5HX0dPTERFTikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+YWxsX2ZyYWdtZW50c1tpXS5jb2RpbmdfbWV0aG9kID09IE1PREVfR09MREVOX01WKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25fc291cmNlID0gZ29sZGVuX3BsYW5lOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl9zb3VyY2UgPSBsYXN0X3BsYW5lOworCisgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25fc291cmNlICAgICAgICs9IGZpcnN0X3BpeGVsOworICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX2hhbGZwZWxfaW5kZXggPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb3J0IG91dCB0aGUgbW90aW9uIHZlY3RvciBpZiB0aGlzIGZyYWdtZW50IGlzIGNvZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB1c2luZyBhIG1vdGlvbiB2ZWN0b3IgbWV0aG9kICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHMtPmFsbF9mcmFnbWVudHNbaV0uY29kaW5nX21ldGhvZCA+IE1PREVfSU5UUkEpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmFsbF9mcmFnbWVudHNbaV0uY29kaW5nX21ldGhvZCAhPSBNT0RFX1VTSU5HX0dPTERFTikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIHNyY195OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl94ID0gbW90aW9uX3ZhbFtmcmFnbWVudF1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3kgPSBtb3Rpb25fdmFsW2ZyYWdtZW50XVsxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY194ID0gKG1vdGlvbl94ID4+IDEpICsgOCAqIHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3kgPSAobW90aW9uX3kgPj4gMSkgKyA4ICogeTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl9oYWxmcGVsX2luZGV4ID0gbW90aW9uX3ggJiAweDAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl9zb3VyY2UgICAgICAgKz0gKG1vdGlvbl94ID4+IDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX2hhbGZwZWxfaW5kZXggfD0gKG1vdGlvbl95ICYgMHgwMSkgPDwgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25fc291cmNlICAgICAgICArPSAoKG1vdGlvbl95ID4+IDEpICogc3RyaWRlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfeCA8IDAgfHwgc3JjX3kgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY194ICsgOSA+PSBwbGFuZV93aWR0aCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfeSArIDkgPj0gcGxhbmVfaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRlbXAgPSBzLT5lZGdlX2VtdV9idWZmZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpZGUgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCAtPSA4ICogc3RyaWRlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh0ZW1wLCBtb3Rpb25fc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LCA5LCBzcmNfeCwgc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX2hlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl9zb3VyY2UgPSB0ZW1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QsIHRha2UgY2FyZSBvZiBjb3B5aW5nIGEgYmxvY2sgZnJvbSBlaXRoZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwcmV2aW91cyBvciB0aGUgZ29sZGVuIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+YWxsX2ZyYWdtZW50c1tpXS5jb2RpbmdfbWV0aG9kICE9IE1PREVfSU5UUkEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3RlLCBpdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYWxsIE1DIGNhc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aCBwdXRfbm9fcm5kX3BpeGVsc19sMiB3aGljaCB3b3VsZCBsb29rIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsaWtlIHRoZSBWUDMgc291cmNlIGJ1dCB0aGlzIHdvdWxkIGJlIHNsb3dlciBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHB1dF9ub19ybmRfcGl4ZWxzX3RhYiBpcyBiZXR0ZXIgb3B0aW16ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uX2hhbGZwZWxfaW5kZXggIT0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oZHNwLnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVttb3Rpb25faGFsZnBlbF9pbmRleF0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcGxhbmUgKyBmaXJzdF9waXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl9zb3VyY2UsIHN0cmlkZSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZCBpcyAwIGlmIG1vdGlvbl94IGFuZCBfeSBoYXZlIHRoZSBzYW1lIHNpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGVsc2UgLTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGQgPSAobW90aW9uX3ggXiBtb3Rpb25feSkgPj4gMzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnZwM2RzcC5wdXRfbm9fcm5kX3BpeGVsc19sMihvdXRwdXRfcGxhbmUgKyBmaXJzdF9waXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbl9zb3VyY2UgLSBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3NvdXJjZSArIHN0cmlkZSArIDEgKyBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludmVydCBEQ1QgYW5kIHBsYWNlIChvciBhZGQpIGluIGZpbmFsIG91dHB1dCAqLworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+YWxsX2ZyYWdtZW50c1tpXS5jb2RpbmdfbWV0aG9kID09IE1PREVfSU5UUkEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDNfZGVxdWFudChzLCBzLT5hbGxfZnJhZ21lbnRzICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZSwgMCwgYmxvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnZwM2RzcC5pZGN0X3B1dChvdXRwdXRfcGxhbmUgKyBmaXJzdF9waXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cDNfZGVxdWFudChzLCBzLT5hbGxfZnJhZ21lbnRzICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUsIDEsIGJsb2NrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT52cDNkc3AuaWRjdF9hZGQob3V0cHV0X3BsYW5lICsgZmlyc3RfcGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dnAzZHNwLmlkY3RfZGNfYWRkKG91dHB1dF9wbGFuZSArIGZpcnN0X3BpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBibG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBkaXJlY3RseSBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYlsxXVswXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcGxhbmUgKyBmaXJzdF9waXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3BsYW5lICsgZmlyc3RfcGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmlsdGVyIHVwIHRvIHRoZSBsYXN0IHJvdyBpbiB0aGUgc3VwZXJibG9jayByb3cKKyAgICAgICAgICAgIGlmICghcy0+c2tpcF9sb29wX2ZpbHRlcikKKyAgICAgICAgICAgICAgICBhcHBseV9sb29wX2ZpbHRlcihzLCBwbGFuZSwgNCAqIHNiX3kgLSAhIXNiX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oNCAqIHNiX3kgKyAzLCBmcmFnbWVudF9oZWlnaHQgLSAxKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB0aGlzIGxvb2tzIGxpa2UgYSBnb29kIHBsYWNlIGZvciBzbGljZSBkaXNwYXRjaC4uLiAqLworICAgIC8qIGFsZ29yaXRobToKKyAgICAgKiAgIGlmIChzbGljZSA9PSBzLT5tYWNyb2Jsb2NrX2hlaWdodCAtIDEpCisgICAgICogICAgIGRpc3BhdGNoIChib3RoIGxhc3Qgc2xpY2UgJiAybmQtdG8tbGFzdCBzbGljZSk7CisgICAgICogICBlbHNlIGlmIChzbGljZSA+IDApCisgICAgICogICAgIGRpc3BhdGNoIChzbGljZSAtIDEpOworICAgICAqLworCisgICAgdnAzX2RyYXdfaG9yaXpfYmFuZChzLCBGRk1JTigoMzIgPDwgcy0+Y2hyb21hX3lfc2hpZnQpICogKHNsaWNlICsgMSkgLSAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhlaWdodCAtIDE2KSk7Cit9CisKKy8vLyBBbGxvY2F0ZSB0YWJsZXMgZm9yIHBlci1mcmFtZSBkYXRhIGluIFZwM0RlY29kZUNvbnRleHQKK3N0YXRpYyBhdl9jb2xkIGludCBhbGxvY2F0ZV90YWJsZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZwM0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCB5X2ZyYWdtZW50X2NvdW50LCBjX2ZyYWdtZW50X2NvdW50OworCisgICAgZnJlZV90YWJsZXMoYXZjdHgpOworCisgICAgeV9mcmFnbWVudF9jb3VudCA9IHMtPmZyYWdtZW50X3dpZHRoWzBdICogcy0+ZnJhZ21lbnRfaGVpZ2h0WzBdOworICAgIGNfZnJhZ21lbnRfY291bnQgPSBzLT5mcmFnbWVudF93aWR0aFsxXSAqIHMtPmZyYWdtZW50X2hlaWdodFsxXTsKKworICAgIHMtPnN1cGVyYmxvY2tfY29kaW5nID0gYXZfbWFsbG9jeihzLT5zdXBlcmJsb2NrX2NvdW50KTsKKyAgICBzLT5hbGxfZnJhZ21lbnRzICAgICA9IGF2X21hbGxvY3pfYXJyYXkocy0+ZnJhZ21lbnRfY291bnQsIHNpemVvZihWcDNGcmFnbWVudCkpOworCisgICAgcy0+Y29kZWRfZnJhZ21lbnRfbGlzdFswXSA9IGF2X21hbGxvY3pfYXJyYXkocy0+ZnJhZ21lbnRfY291bnQsIHNpemVvZihpbnQpKTsKKworICAgIHMtPmRjdF90b2tlbnNfYmFzZSA9IGF2X21hbGxvY3pfYXJyYXkocy0+ZnJhZ21lbnRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCAqIHNpemVvZigqcy0+ZGN0X3Rva2Vuc19iYXNlKSk7CisgICAgcy0+bW90aW9uX3ZhbFswXSA9IGF2X21hbGxvY3pfYXJyYXkoeV9mcmFnbWVudF9jb3VudCwgc2l6ZW9mKCpzLT5tb3Rpb25fdmFsWzBdKSk7CisgICAgcy0+bW90aW9uX3ZhbFsxXSA9IGF2X21hbGxvY3pfYXJyYXkoY19mcmFnbWVudF9jb3VudCwgc2l6ZW9mKCpzLT5tb3Rpb25fdmFsWzFdKSk7CisKKyAgICAvKiB3b3JrIG91dCB0aGUgYmxvY2sgbWFwcGluZyB0YWJsZXMgKi8KKyAgICBzLT5zdXBlcmJsb2NrX2ZyYWdtZW50cyA9IGF2X21hbGxvY3pfYXJyYXkocy0+c3VwZXJibG9ja19jb3VudCwgMTYgKiBzaXplb2YoaW50KSk7CisgICAgcy0+bWFjcm9ibG9ja19jb2RpbmcgICAgPSBhdl9tYWxsb2N6KHMtPm1hY3JvYmxvY2tfY291bnQgKyAxKTsKKworICAgIGlmICghcy0+c3VwZXJibG9ja19jb2RpbmcgICAgfHwgIXMtPmFsbF9mcmFnbWVudHMgICAgICAgICAgfHwKKyAgICAgICAgIXMtPmRjdF90b2tlbnNfYmFzZSAgICAgIHx8ICFzLT5jb2RlZF9mcmFnbWVudF9saXN0WzBdIHx8CisgICAgICAgICFzLT5zdXBlcmJsb2NrX2ZyYWdtZW50cyB8fCAhcy0+bWFjcm9ibG9ja19jb2RpbmcgICAgICB8fAorICAgICAgICAhcy0+bW90aW9uX3ZhbFswXSAgICAgICAgfHwgIXMtPm1vdGlvbl92YWxbMV0pIHsKKyAgICAgICAgdnAzX2RlY29kZV9lbmQoYXZjdHgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW5pdF9ibG9ja19tYXBwaW5nKHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0X2ZyYW1lcyhWcDNEZWNvZGVDb250ZXh0ICpzKQoreworICAgIHMtPmN1cnJlbnRfZnJhbWUuZiA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgcy0+bGFzdF9mcmFtZS5mICAgID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBzLT5nb2xkZW5fZnJhbWUuZiAgPSBhdl9mcmFtZV9hbGxvYygpOworCisgICAgaWYgKCFzLT5jdXJyZW50X2ZyYW1lLmYgfHwgIXMtPmxhc3RfZnJhbWUuZiB8fCAhcy0+Z29sZGVuX2ZyYW1lLmYpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+Y3VycmVudF9mcmFtZS5mKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9mcmFtZS5mKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+Z29sZGVuX2ZyYW1lLmYpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdnAzX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWcDNEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgaW50ZXIsIHBsYW5lLCByZXQ7CisgICAgaW50IGNfd2lkdGg7CisgICAgaW50IGNfaGVpZ2h0OworICAgIGludCB5X2ZyYWdtZW50X2NvdW50LCBjX2ZyYWdtZW50X2NvdW50OworCisgICAgcmV0ID0gaW5pdF9mcmFtZXMocyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdmN0eC0+aW50ZXJuYWwtPmFsbG9jYXRlX3Byb2dyZXNzID0gMTsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdWJywgJ1AnLCAnMycsICcwJykpCisgICAgICAgIHMtPnZlcnNpb24gPSAwOworICAgIGVsc2UKKyAgICAgICAgcy0+dmVyc2lvbiA9IDE7CisKKyAgICBzLT5hdmN0eCAgPSBhdmN0eDsKKyAgICBzLT53aWR0aCAgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgMTYpOworICAgIHMtPmhlaWdodCA9IEZGQUxJR04oYXZjdHgtPmhlaWdodCwgMTYpOworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEhFT1JBKQorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICBhdmN0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbiA9IEFWQ0hST01BX0xPQ19DRU5URVI7CisgICAgZmZfaHBlbGRzcF9pbml0KCZzLT5oZHNwLCBhdmN0eC0+ZmxhZ3MgfCBDT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBmZl92aWRlb2RzcF9pbml0KCZzLT52ZHNwLCA4KTsKKyAgICBmZl92cDNkc3BfaW5pdCgmcy0+dnAzZHNwLCBhdmN0eC0+ZmxhZ3MpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyNkZWZpbmUgVFJBTlNQT1NFKHgpICgoKHgpID4+IDMpIHwgKCgoeCkgJiA3KSA8PCAzKSkKKyAgICAgICAgcy0+aWRjdF9wZXJtdXRhdGlvbltpXSA9IFRSQU5TUE9TRShpKTsKKyAgICAgICAgcy0+aWRjdF9zY2FudGFibGVbaV0gICA9IFRSQU5TUE9TRShmZl96aWd6YWdfZGlyZWN0W2ldKTsKKyN1bmRlZiBUUkFOU1BPU0UKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIHRvIGFuIGltcG9zc2libGUgdmFsdWUgd2hpY2ggd2lsbCBmb3JjZSBhIHJlY2FsY3VsYXRpb24KKyAgICAgKiBpbiB0aGUgZmlyc3QgZnJhbWUgZGVjb2RlICovCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgcy0+cXBzW2ldID0gLTE7CisKKyAgICBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmN0eC0+cGl4X2ZtdCwgJnMtPmNocm9tYV94X3NoaWZ0LCAmcy0+Y2hyb21hX3lfc2hpZnQpOworCisgICAgcy0+eV9zdXBlcmJsb2NrX3dpZHRoICA9IChzLT53aWR0aCAgKyAzMSkgLyAzMjsKKyAgICBzLT55X3N1cGVyYmxvY2tfaGVpZ2h0ID0gKHMtPmhlaWdodCArIDMxKSAvIDMyOworICAgIHMtPnlfc3VwZXJibG9ja19jb3VudCAgPSBzLT55X3N1cGVyYmxvY2tfd2lkdGggKiBzLT55X3N1cGVyYmxvY2tfaGVpZ2h0OworCisgICAgLyogd29yayBvdXQgdGhlIGRpbWVuc2lvbnMgZm9yIHRoZSBDIHBsYW5lcyAqLworICAgIGNfd2lkdGggICAgICAgICAgICAgICAgPSBzLT53aWR0aCA+PiBzLT5jaHJvbWFfeF9zaGlmdDsKKyAgICBjX2hlaWdodCAgICAgICAgICAgICAgID0gcy0+aGVpZ2h0ID4+IHMtPmNocm9tYV95X3NoaWZ0OworICAgIHMtPmNfc3VwZXJibG9ja193aWR0aCAgPSAoY193aWR0aCAgKyAzMSkgLyAzMjsKKyAgICBzLT5jX3N1cGVyYmxvY2tfaGVpZ2h0ID0gKGNfaGVpZ2h0ICsgMzEpIC8gMzI7CisgICAgcy0+Y19zdXBlcmJsb2NrX2NvdW50ICA9IHMtPmNfc3VwZXJibG9ja193aWR0aCAqIHMtPmNfc3VwZXJibG9ja19oZWlnaHQ7CisKKyAgICBzLT5zdXBlcmJsb2NrX2NvdW50ICAgPSBzLT55X3N1cGVyYmxvY2tfY291bnQgKyAocy0+Y19zdXBlcmJsb2NrX2NvdW50ICogMik7CisgICAgcy0+dV9zdXBlcmJsb2NrX3N0YXJ0ID0gcy0+eV9zdXBlcmJsb2NrX2NvdW50OworICAgIHMtPnZfc3VwZXJibG9ja19zdGFydCA9IHMtPnVfc3VwZXJibG9ja19zdGFydCArIHMtPmNfc3VwZXJibG9ja19jb3VudDsKKworICAgIHMtPm1hY3JvYmxvY2tfd2lkdGggID0gKHMtPndpZHRoICArIDE1KSAvIDE2OworICAgIHMtPm1hY3JvYmxvY2tfaGVpZ2h0ID0gKHMtPmhlaWdodCArIDE1KSAvIDE2OworICAgIHMtPm1hY3JvYmxvY2tfY291bnQgID0gcy0+bWFjcm9ibG9ja193aWR0aCAqIHMtPm1hY3JvYmxvY2tfaGVpZ2h0OworCisgICAgcy0+ZnJhZ21lbnRfd2lkdGhbMF0gID0gcy0+d2lkdGggLyBGUkFHTUVOVF9QSVhFTFM7CisgICAgcy0+ZnJhZ21lbnRfaGVpZ2h0WzBdID0gcy0+aGVpZ2h0IC8gRlJBR01FTlRfUElYRUxTOworICAgIHMtPmZyYWdtZW50X3dpZHRoWzFdICA9IHMtPmZyYWdtZW50X3dpZHRoWzBdID4+IHMtPmNocm9tYV94X3NoaWZ0OworICAgIHMtPmZyYWdtZW50X2hlaWdodFsxXSA9IHMtPmZyYWdtZW50X2hlaWdodFswXSA+PiBzLT5jaHJvbWFfeV9zaGlmdDsKKworICAgIC8qIGZyYWdtZW50IGNvdW50IGNvdmVycyBhbGwgOHg4IGJsb2NrcyBmb3IgYWxsIDMgcGxhbmVzICovCisgICAgeV9mcmFnbWVudF9jb3VudCAgICAgPSBzLT5mcmFnbWVudF93aWR0aFswXSAqIHMtPmZyYWdtZW50X2hlaWdodFswXTsKKyAgICBjX2ZyYWdtZW50X2NvdW50ICAgICA9IHMtPmZyYWdtZW50X3dpZHRoWzFdICogcy0+ZnJhZ21lbnRfaGVpZ2h0WzFdOworICAgIHMtPmZyYWdtZW50X2NvdW50ICAgID0geV9mcmFnbWVudF9jb3VudCArIDIgKiBjX2ZyYWdtZW50X2NvdW50OworICAgIHMtPmZyYWdtZW50X3N0YXJ0WzFdID0geV9mcmFnbWVudF9jb3VudDsKKyAgICBzLT5mcmFnbWVudF9zdGFydFsyXSA9IHlfZnJhZ21lbnRfY291bnQgKyBjX2ZyYWdtZW50X2NvdW50OworCisgICAgaWYgKCFzLT50aGVvcmFfdGFibGVzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICBzLT5jb2RlZF9kY19zY2FsZV9mYWN0b3JbaV0gPSB2cDMxX2RjX3NjYWxlX2ZhY3RvcltpXTsKKyAgICAgICAgICAgIHMtPmNvZGVkX2FjX3NjYWxlX2ZhY3RvcltpXSA9IHZwMzFfYWNfc2NhbGVfZmFjdG9yW2ldOworICAgICAgICAgICAgcy0+YmFzZV9tYXRyaXhbMF1baV0gICAgICAgID0gdnAzMV9pbnRyYV95X2RlcXVhbnRbaV07CisgICAgICAgICAgICBzLT5iYXNlX21hdHJpeFsxXVtpXSAgICAgICAgPSB2cDMxX2ludHJhX2NfZGVxdWFudFtpXTsKKyAgICAgICAgICAgIHMtPmJhc2VfbWF0cml4WzJdW2ldICAgICAgICA9IHZwMzFfaW50ZXJfZGVxdWFudFtpXTsKKyAgICAgICAgICAgIHMtPmZpbHRlcl9saW1pdF92YWx1ZXNbaV0gICA9IHZwMzFfZmlsdGVyX2xpbWl0X3ZhbHVlc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50ZXIgPSAwOyBpbnRlciA8IDI7IGludGVyKyspIHsKKyAgICAgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDM7IHBsYW5lKyspIHsKKyAgICAgICAgICAgICAgICBzLT5xcl9jb3VudFtpbnRlcl1bcGxhbmVdICAgPSAxOworICAgICAgICAgICAgICAgIHMtPnFyX3NpemVbaW50ZXJdW3BsYW5lXVswXSA9IDYzOworICAgICAgICAgICAgICAgIHMtPnFyX2Jhc2VbaW50ZXJdW3BsYW5lXVswXSA9CisgICAgICAgICAgICAgICAgcy0+cXJfYmFzZVtpbnRlcl1bcGxhbmVdWzFdID0gMiAqIGludGVyICsgKCEhcGxhbmUpICogIWludGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogaW5pdCBWTEMgdGFibGVzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAvKiBEQyBoaXN0b2dyYW1zICovCisgICAgICAgICAgICBpbml0X3ZsYygmcy0+ZGNfdmxjW2ldLCAxMSwgMzIsCisgICAgICAgICAgICAgICAgICAgICAmZGNfYmlhc1tpXVswXVsxXSwgNCwgMiwKKyAgICAgICAgICAgICAgICAgICAgICZkY19iaWFzW2ldWzBdWzBdLCA0LCAyLCAwKTsKKworICAgICAgICAgICAgLyogZ3JvdXAgMSBBQyBoaXN0b2dyYW1zICovCisgICAgICAgICAgICBpbml0X3ZsYygmcy0+YWNfdmxjXzFbaV0sIDExLCAzMiwKKyAgICAgICAgICAgICAgICAgICAgICZhY19iaWFzXzBbaV1bMF1bMV0sIDQsIDIsCisgICAgICAgICAgICAgICAgICAgICAmYWNfYmlhc18wW2ldWzBdWzBdLCA0LCAyLCAwKTsKKworICAgICAgICAgICAgLyogZ3JvdXAgMiBBQyBoaXN0b2dyYW1zICovCisgICAgICAgICAgICBpbml0X3ZsYygmcy0+YWNfdmxjXzJbaV0sIDExLCAzMiwKKyAgICAgICAgICAgICAgICAgICAgICZhY19iaWFzXzFbaV1bMF1bMV0sIDQsIDIsCisgICAgICAgICAgICAgICAgICAgICAmYWNfYmlhc18xW2ldWzBdWzBdLCA0LCAyLCAwKTsKKworICAgICAgICAgICAgLyogZ3JvdXAgMyBBQyBoaXN0b2dyYW1zICovCisgICAgICAgICAgICBpbml0X3ZsYygmcy0+YWNfdmxjXzNbaV0sIDExLCAzMiwKKyAgICAgICAgICAgICAgICAgICAgICZhY19iaWFzXzJbaV1bMF1bMV0sIDQsIDIsCisgICAgICAgICAgICAgICAgICAgICAmYWNfYmlhc18yW2ldWzBdWzBdLCA0LCAyLCAwKTsKKworICAgICAgICAgICAgLyogZ3JvdXAgNCBBQyBoaXN0b2dyYW1zICovCisgICAgICAgICAgICBpbml0X3ZsYygmcy0+YWNfdmxjXzRbaV0sIDExLCAzMiwKKyAgICAgICAgICAgICAgICAgICAgICZhY19iaWFzXzNbaV1bMF1bMV0sIDQsIDIsCisgICAgICAgICAgICAgICAgICAgICAmYWNfYmlhc18zW2ldWzBdWzBdLCA0LCAyLCAwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAvKiBEQyBoaXN0b2dyYW1zICovCisgICAgICAgICAgICBpZiAoaW5pdF92bGMoJnMtPmRjX3ZsY1tpXSwgMTEsIDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5odWZmbWFuX3RhYmxlW2ldWzBdWzFdLCA4LCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5odWZmbWFuX3RhYmxlW2ldWzBdWzBdLCA4LCA0LCAwKSA8IDApCisgICAgICAgICAgICAgICAgZ290byB2bGNfZmFpbDsKKworICAgICAgICAgICAgLyogZ3JvdXAgMSBBQyBoaXN0b2dyYW1zICovCisgICAgICAgICAgICBpZiAoaW5pdF92bGMoJnMtPmFjX3ZsY18xW2ldLCAxMSwgMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmh1ZmZtYW5fdGFibGVbaSArIDE2XVswXVsxXSwgOCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aHVmZm1hbl90YWJsZVtpICsgMTZdWzBdWzBdLCA4LCA0LCAwKSA8IDApCisgICAgICAgICAgICAgICAgZ290byB2bGNfZmFpbDsKKworICAgICAgICAgICAgLyogZ3JvdXAgMiBBQyBoaXN0b2dyYW1zICovCisgICAgICAgICAgICBpZiAoaW5pdF92bGMoJnMtPmFjX3ZsY18yW2ldLCAxMSwgMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmh1ZmZtYW5fdGFibGVbaSArIDE2ICogMl1bMF1bMV0sIDgsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmh1ZmZtYW5fdGFibGVbaSArIDE2ICogMl1bMF1bMF0sIDgsIDQsIDApIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIHZsY19mYWlsOworCisgICAgICAgICAgICAvKiBncm91cCAzIEFDIGhpc3RvZ3JhbXMgKi8KKyAgICAgICAgICAgIGlmIChpbml0X3ZsYygmcy0+YWNfdmxjXzNbaV0sIDExLCAzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aHVmZm1hbl90YWJsZVtpICsgMTYgKiAzXVswXVsxXSwgOCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aHVmZm1hbl90YWJsZVtpICsgMTYgKiAzXVswXVswXSwgOCwgNCwgMCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gdmxjX2ZhaWw7CisKKyAgICAgICAgICAgIC8qIGdyb3VwIDQgQUMgaGlzdG9ncmFtcyAqLworICAgICAgICAgICAgaWYgKGluaXRfdmxjKCZzLT5hY192bGNfNFtpXSwgMTEsIDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5odWZmbWFuX3RhYmxlW2kgKyAxNiAqIDRdWzBdWzFdLCA4LCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5odWZmbWFuX3RhYmxlW2kgKyAxNiAqIDRdWzBdWzBdLCA4LCA0LCAwKSA8IDApCisgICAgICAgICAgICAgICAgZ290byB2bGNfZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluaXRfdmxjKCZzLT5zdXBlcmJsb2NrX3J1bl9sZW5ndGhfdmxjLCA2LCAzNCwKKyAgICAgICAgICAgICAmc3VwZXJibG9ja19ydW5fbGVuZ3RoX3ZsY190YWJsZVswXVsxXSwgNCwgMiwKKyAgICAgICAgICAgICAmc3VwZXJibG9ja19ydW5fbGVuZ3RoX3ZsY190YWJsZVswXVswXSwgNCwgMiwgMCk7CisKKyAgICBpbml0X3ZsYygmcy0+ZnJhZ21lbnRfcnVuX2xlbmd0aF92bGMsIDUsIDMwLAorICAgICAgICAgICAgICZmcmFnbWVudF9ydW5fbGVuZ3RoX3ZsY190YWJsZVswXVsxXSwgNCwgMiwKKyAgICAgICAgICAgICAmZnJhZ21lbnRfcnVuX2xlbmd0aF92bGNfdGFibGVbMF1bMF0sIDQsIDIsIDApOworCisgICAgaW5pdF92bGMoJnMtPm1vZGVfY29kZV92bGMsIDMsIDgsCisgICAgICAgICAgICAgJm1vZGVfY29kZV92bGNfdGFibGVbMF1bMV0sIDIsIDEsCisgICAgICAgICAgICAgJm1vZGVfY29kZV92bGNfdGFibGVbMF1bMF0sIDIsIDEsIDApOworCisgICAgaW5pdF92bGMoJnMtPm1vdGlvbl92ZWN0b3JfdmxjLCA2LCA2MywKKyAgICAgICAgICAgICAmbW90aW9uX3ZlY3Rvcl92bGNfdGFibGVbMF1bMV0sIDIsIDEsCisgICAgICAgICAgICAgJm1vdGlvbl92ZWN0b3JfdmxjX3RhYmxlWzBdWzBdLCAyLCAxLCAwKTsKKworICAgIHJldHVybiBhbGxvY2F0ZV90YWJsZXMoYXZjdHgpOworCit2bGNfZmFpbDoKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgaHVmZm1hbiB0YWJsZVxuIik7CisgICAgcmV0dXJuIC0xOworfQorCisvLy8gUmVsZWFzZSBhbmQgc2h1ZmZsZSBmcmFtZXMgYWZ0ZXIgZGVjb2RlIGZpbmlzaGVzCitzdGF0aWMgaW50IHVwZGF0ZV9mcmFtZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZwM0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQgPSAwOworCisgICAgLyogc2h1ZmZsZSBmcmFtZXMgKGxhc3QgPSBjdXJyZW50KSAqLworICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJnMtPmxhc3RfZnJhbWUpOworICAgIHJldCA9IGZmX3RocmVhZF9yZWZfZnJhbWUoJnMtPmxhc3RfZnJhbWUsICZzLT5jdXJyZW50X2ZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKHMtPmtleWZyYW1lKSB7CisgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJnMtPmdvbGRlbl9mcmFtZSk7CisgICAgICAgIHJldCA9IGZmX3RocmVhZF9yZWZfZnJhbWUoJnMtPmdvbGRlbl9mcmFtZSwgJnMtPmN1cnJlbnRfZnJhbWUpOworICAgIH0KKworZmFpbDoKKyAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoYXZjdHgsICZzLT5jdXJyZW50X2ZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlZl9mcmFtZShWcDNEZWNvZGVDb250ZXh0ICpzLCBUaHJlYWRGcmFtZSAqZHN0LCBUaHJlYWRGcmFtZSAqc3JjKQoreworICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihzLT5hdmN0eCwgZHN0KTsKKyAgICBpZiAoc3JjLT5mLT5kYXRhWzBdKQorICAgICAgICByZXR1cm4gZmZfdGhyZWFkX3JlZl9mcmFtZShkc3QsIHNyYyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVmX2ZyYW1lcyhWcDNEZWNvZGVDb250ZXh0ICpkc3QsIFZwM0RlY29kZUNvbnRleHQgKnNyYykKK3sKKyAgICBpbnQgcmV0OworICAgIGlmICgocmV0ID0gcmVmX2ZyYW1lKGRzdCwgJmRzdC0+Y3VycmVudF9mcmFtZSwgJnNyYy0+Y3VycmVudF9mcmFtZSkpIDwgMCB8fAorICAgICAgICAocmV0ID0gcmVmX2ZyYW1lKGRzdCwgJmRzdC0+Z29sZGVuX2ZyYW1lLCAgJnNyYy0+Z29sZGVuX2ZyYW1lKSkgPCAwICB8fAorICAgICAgICAocmV0ID0gcmVmX2ZyYW1lKGRzdCwgJmRzdC0+bGFzdF9mcmFtZSwgICAgJnNyYy0+bGFzdF9mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDNfdXBkYXRlX3RocmVhZF9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICpkc3QsIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpzcmMpCit7CisgICAgVnAzRGVjb2RlQ29udGV4dCAqcyA9IGRzdC0+cHJpdl9kYXRhLCAqczEgPSBzcmMtPnByaXZfZGF0YTsKKyAgICBpbnQgcXBzX2NoYW5nZWQgPSAwLCBpLCBlcnI7CisKKyNkZWZpbmUgY29weV9maWVsZHModG8sIGZyb20sIHN0YXJ0X2ZpZWxkLCBlbmRfZmllbGQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1jcHkoJnRvLT5zdGFydF9maWVsZCwgJmZyb20tPnN0YXJ0X2ZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKGNoYXIgKikgJnRvLT5lbmRfZmllbGQgLSAoY2hhciAqKSAmdG8tPnN0YXJ0X2ZpZWxkKQorCisgICAgaWYgKCFzMS0+Y3VycmVudF9mcmFtZS5mLT5kYXRhWzBdIHx8CisgICAgICAgIHMtPndpZHRoICE9IHMxLT53aWR0aCB8fCBzLT5oZWlnaHQgIT0gczEtPmhlaWdodCkgeworICAgICAgICBpZiAocyAhPSBzMSkKKyAgICAgICAgICAgIHJlZl9mcmFtZXMocywgczEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHMgIT0gczEpIHsKKyAgICAgICAgLy8gaW5pdCB0YWJsZXMgaWYgdGhlIGZpcnN0IGZyYW1lIGhhc24ndCBiZWVuIGRlY29kZWQKKyAgICAgICAgaWYgKCFzLT5jdXJyZW50X2ZyYW1lLmYtPmRhdGFbMF0pIHsKKyAgICAgICAgICAgIGludCB5X2ZyYWdtZW50X2NvdW50LCBjX2ZyYWdtZW50X2NvdW50OworICAgICAgICAgICAgcy0+YXZjdHggPSBkc3Q7CisgICAgICAgICAgICBlcnIgPSBhbGxvY2F0ZV90YWJsZXMoZHN0KTsKKyAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHlfZnJhZ21lbnRfY291bnQgPSBzLT5mcmFnbWVudF93aWR0aFswXSAqIHMtPmZyYWdtZW50X2hlaWdodFswXTsKKyAgICAgICAgICAgIGNfZnJhZ21lbnRfY291bnQgPSBzLT5mcmFnbWVudF93aWR0aFsxXSAqIHMtPmZyYWdtZW50X2hlaWdodFsxXTsKKyAgICAgICAgICAgIG1lbWNweShzLT5tb3Rpb25fdmFsWzBdLCBzMS0+bW90aW9uX3ZhbFswXSwKKyAgICAgICAgICAgICAgICAgICB5X2ZyYWdtZW50X2NvdW50ICogc2l6ZW9mKCpzLT5tb3Rpb25fdmFsWzBdKSk7CisgICAgICAgICAgICBtZW1jcHkocy0+bW90aW9uX3ZhbFsxXSwgczEtPm1vdGlvbl92YWxbMV0sCisgICAgICAgICAgICAgICAgICAgY19mcmFnbWVudF9jb3VudCAqIHNpemVvZigqcy0+bW90aW9uX3ZhbFsxXSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29weSBwcmV2aW91cyBmcmFtZSBkYXRhCisgICAgICAgIGlmICgoZXJyID0gcmVmX2ZyYW1lcyhzLCBzMSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgcy0+a2V5ZnJhbWUgPSBzMS0+a2V5ZnJhbWU7CisKKyAgICAgICAgLy8gY29weSBxc2NhbGUgZGF0YSBpZiBuZWNlc3NhcnkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgaWYgKHMtPnFwc1tpXSAhPSBzMS0+cXBzWzFdKSB7CisgICAgICAgICAgICAgICAgcXBzX2NoYW5nZWQgPSAxOworICAgICAgICAgICAgICAgIG1lbWNweSgmcy0+cW1hdFtpXSwgJnMxLT5xbWF0W2ldLCBzaXplb2Yocy0+cW1hdFtpXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnFwc1swXSAhPSBzMS0+cXBzWzBdKQorICAgICAgICAgICAgbWVtY3B5KCZzLT5ib3VuZGluZ192YWx1ZXNfYXJyYXksICZzMS0+Ym91bmRpbmdfdmFsdWVzX2FycmF5LAorICAgICAgICAgICAgICAgICAgIHNpemVvZihzLT5ib3VuZGluZ192YWx1ZXNfYXJyYXkpKTsKKworICAgICAgICBpZiAocXBzX2NoYW5nZWQpCisgICAgICAgICAgICBjb3B5X2ZpZWxkcyhzLCBzMSwgcXBzLCBzdXBlcmJsb2NrX2NvdW50KTsKKyN1bmRlZiBjb3B5X2ZpZWxkcworICAgIH0KKworICAgIHJldHVybiB1cGRhdGVfZnJhbWVzKGRzdCk7Cit9CisKK3N0YXRpYyBpbnQgdnAzX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiAgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgVnAzRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgYnVmX3NpemUgKiA4KTsKKworI2lmIENPTkZJR19USEVPUkFfREVDT0RFUgorICAgIGlmIChzLT50aGVvcmEgJiYgZ2V0X2JpdHMxKCZnYikpIHsKKyAgICAgICAgaW50IHR5cGUgPSBnZXRfYml0cygmZ2IsIDcpOworICAgICAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDYqOCk7IC8qICJ0aGVvcmEiICovCisKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUmRkZfVEhSRUFEX0ZSQU1FKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1pZHN0cmVhbSByZWNvbmZpZ3VyYXRpb24gd2l0aCBtdWx0aXRocmVhZGluZyBpcyB1bnN1cHBvcnRlZCwgdHJ5IC10aHJlYWRzIDFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IDApIHsKKyAgICAgICAgICAgIHZwM19kZWNvZGVfZW5kKGF2Y3R4KTsKKyAgICAgICAgICAgIHJldCA9IHRoZW9yYV9kZWNvZGVfaGVhZGVyKGF2Y3R4LCAmZ2IpOworCisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIHZwM19kZWNvZGVfZW5kKGF2Y3R4KTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IHZwM19kZWNvZGVfaW5pdChhdmN0eCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMikgeworICAgICAgICAgICAgcmV0ID0gdGhlb3JhX2RlY29kZV90YWJsZXMoYXZjdHgsICZnYik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIHZwM19kZWNvZGVfZW5kKGF2Y3R4KTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IHZwM19kZWNvZGVfaW5pdChhdmN0eCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSGVhZGVyIHBhY2tldCBwYXNzZWQgdG8gZnJhbWUgZGVjb2Rlciwgc2tpcHBpbmdcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorI2VuZGlmCisKKyAgICBzLT5rZXlmcmFtZSA9ICFnZXRfYml0czEoJmdiKTsKKyAgICBpZiAoIXMtPmFsbF9mcmFnbWVudHMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEYXRhIHBhY2tldCB3aXRob3V0IHByaW9yIHZhbGlkIGhlYWRlcnNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghcy0+dGhlb3JhKQorICAgICAgICBza2lwX2JpdHMoJmdiLCAxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICBzLT5sYXN0X3Fwc1tpXSA9IHMtPnFwc1tpXTsKKworICAgIHMtPm5xcHMgPSAwOworICAgIGRvIHsKKyAgICAgICAgcy0+cXBzW3MtPm5xcHMrK10gPSBnZXRfYml0cygmZ2IsIDYpOworICAgIH0gd2hpbGUgKHMtPnRoZW9yYSA+PSAweDAzMDIwMCAmJiBzLT5ucXBzIDwgMyAmJiBnZXRfYml0czEoJmdiKSk7CisgICAgZm9yIChpID0gcy0+bnFwczsgaSA8IDM7IGkrKykKKyAgICAgICAgcy0+cXBzW2ldID0gLTE7CisKKyAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiIFZQMyAlc2ZyYW1lICMlZDogUSBpbmRleCA9ICVkXG4iLAorICAgICAgICAgICAgICAgcy0+a2V5ZnJhbWUgPyAia2V5IiA6ICIiLCBhdmN0eC0+ZnJhbWVfbnVtYmVyICsgMSwgcy0+cXBzWzBdKTsKKworICAgIHMtPnNraXBfbG9vcF9maWx0ZXIgPSAhcy0+ZmlsdGVyX2xpbWl0X3ZhbHVlc1tzLT5xcHNbMF1dIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5za2lwX2xvb3BfZmlsdGVyID49IChzLT5rZXlmcmFtZSA/IEFWRElTQ0FSRF9BTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZESVNDQVJEX05PTktFWSk7CisKKyAgICBpZiAocy0+cXBzWzBdICE9IHMtPmxhc3RfcXBzWzBdKQorICAgICAgICBpbml0X2xvb3BfZmlsdGVyKHMpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5xcHM7IGkrKykKKyAgICAgICAgLy8gcmVpbml0IGFsbCBkZXF1YW50aXplcnMgaWYgdGhlIGZpcnN0IG9uZSBjaGFuZ2VkLCBiZWNhdXNlCisgICAgICAgIC8vIHRoZSBEQyBvZiB0aGUgZmlyc3QgcXVhbnRpemVyIG11c3QgYmUgdXNlZCBmb3IgYWxsIG1hdHJpY2VzCisgICAgICAgIGlmIChzLT5xcHNbaV0gIT0gcy0+bGFzdF9xcHNbaV0gfHwgcy0+cXBzWzBdICE9IHMtPmxhc3RfcXBzWzBdKQorICAgICAgICAgICAgaW5pdF9kZXF1YW50aXplcihzLCBpKTsKKworICAgIGlmIChhdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfTk9OS0VZICYmICFzLT5rZXlmcmFtZSkKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworCisgICAgcy0+Y3VycmVudF9mcmFtZS5mLT5waWN0X3R5cGUgPSBzLT5rZXlmcmFtZSA/IEFWX1BJQ1RVUkVfVFlQRV9JCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgIHMtPmN1cnJlbnRfZnJhbWUuZi0+a2V5X2ZyYW1lID0gcy0+a2V5ZnJhbWU7CisgICAgaWYgKGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmcy0+Y3VycmVudF9mcmFtZSwgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRikgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKCFzLT5lZGdlX2VtdV9idWZmZXIpCisgICAgICAgIHMtPmVkZ2VfZW11X2J1ZmZlciA9IGF2X21hbGxvYyg5ICogRkZBQlMocy0+Y3VycmVudF9mcmFtZS5mLT5saW5lc2l6ZVswXSkpOworCisgICAgaWYgKHMtPmtleWZyYW1lKSB7CisgICAgICAgIGlmICghcy0+dGhlb3JhKSB7CisgICAgICAgICAgICBza2lwX2JpdHMoJmdiLCA0KTsgLyogd2lkdGggY29kZSAqLworICAgICAgICAgICAgc2tpcF9iaXRzKCZnYiwgNCk7IC8qIGhlaWdodCBjb2RlICovCisgICAgICAgICAgICBpZiAocy0+dmVyc2lvbikgeworICAgICAgICAgICAgICAgIHMtPnZlcnNpb24gPSBnZXRfYml0cygmZ2IsIDUpOworICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+ZnJhbWVfbnVtYmVyID09IDApCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZQIHZlcnNpb246ICVkXG4iLCBzLT52ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocy0+dmVyc2lvbiB8fCBzLT50aGVvcmEpIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJmdiKSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmcsIHVuc3VwcG9ydGVkIGtleWZyYW1lIGNvZGluZyB0eXBlPyFcbiIpOworICAgICAgICAgICAgc2tpcF9iaXRzKCZnYiwgMik7IC8qIHJlc2VydmVkPyAqLworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFzLT5nb2xkZW5fZnJhbWUuZi0+ZGF0YVswXSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAidnAzOiBmaXJzdCBmcmFtZSBub3QgYSBrZXlmcmFtZVxuIik7CisKKyAgICAgICAgICAgIHMtPmdvbGRlbl9mcmFtZS5mLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgICAgIGlmIChmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJnMtPmdvbGRlbl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJnMtPmxhc3RfZnJhbWUpOworICAgICAgICAgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfcmVmX2ZyYW1lKCZzLT5sYXN0X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5nb2xkZW5fZnJhbWUpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPmxhc3RfZnJhbWUsIElOVF9NQVgsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgbWVtc2V0KHMtPmFsbF9mcmFnbWVudHMsIDAsIHMtPmZyYWdtZW50X2NvdW50ICogc2l6ZW9mKFZwM0ZyYWdtZW50KSk7CisgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChhdmN0eCk7CisKKyAgICBpZiAodW5wYWNrX3N1cGVyYmxvY2tzKHMsICZnYikpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBpbiB1bnBhY2tfc3VwZXJibG9ja3NcbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAodW5wYWNrX21vZGVzKHMsICZnYikpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBpbiB1bnBhY2tfbW9kZXNcbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAodW5wYWNrX3ZlY3RvcnMocywgJmdiKSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGluIHVucGFja192ZWN0b3JzXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKHVucGFja19ibG9ja19xcGlzKHMsICZnYikpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBpbiB1bnBhY2tfYmxvY2tfcXBpc1xuIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGlmICh1bnBhY2tfZGN0X2NvZWZmcyhzLCAmZ2IpKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgaW4gdW5wYWNrX2RjdF9jb2VmZnNcbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaW50IGhlaWdodCA9IHMtPmhlaWdodCA+PiAoaSAmJiBzLT5jaHJvbWFfeV9zaGlmdCk7CisgICAgICAgIGlmIChzLT5mbGlwcGVkX2ltYWdlKQorICAgICAgICAgICAgcy0+ZGF0YV9vZmZzZXRbaV0gPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5kYXRhX29mZnNldFtpXSA9IChoZWlnaHQgLSAxKSAqIHMtPmN1cnJlbnRfZnJhbWUuZi0+bGluZXNpemVbaV07CisgICAgfQorCisgICAgcy0+bGFzdF9zbGljZV9lbmQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jX3N1cGVyYmxvY2tfaGVpZ2h0OyBpKyspCisgICAgICAgIHJlbmRlcl9zbGljZShzLCBpKTsKKworICAgIC8vIGZpbHRlciB0aGUgbGFzdCByb3cKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGludCByb3cgPSAocy0+aGVpZ2h0ID4+ICgzICsgKGkgJiYgcy0+Y2hyb21hX3lfc2hpZnQpKSkgLSAxOworICAgICAgICBhcHBseV9sb29wX2ZpbHRlcihzLCBpLCByb3csIHJvdyArIDEpOworICAgIH0KKyAgICB2cDNfZHJhd19ob3Jpel9iYW5kKHMsIHMtPmF2Y3R4LT5oZWlnaHQpOworCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+Y3VycmVudF9mcmFtZS5mKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgaWYgKCFIQVZFX1RIUkVBRFMgfHwgIShzLT5hdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSkgeworICAgICAgICByZXQgPSB1cGRhdGVfZnJhbWVzKGF2Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiBidWZfc2l6ZTsKKworZXJyb3I6CisgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmcy0+Y3VycmVudF9mcmFtZSwgSU5UX01BWCwgMCk7CisKKyAgICBpZiAoIUhBVkVfVEhSRUFEUyB8fCAhKHMtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpKQorICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5jdXJyZW50X2ZyYW1lLmYpOworCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHJlYWRfaHVmZm1hbl90cmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgVnAzRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBpbnQgdG9rZW47CisgICAgICAgIGlmIChzLT5lbnRyaWVzID49IDMyKSB7IC8qIG92ZXJmbG93ICovCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImh1ZmZtYW4gdHJlZSBvdmVyZmxvd1xuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdG9rZW4gPSBnZXRfYml0cyhnYiwgNSk7CisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJodGkgJWQgaGJpdHMgJXggdG9rZW4gJWQgZW50cnkgOiAlZCBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgIHMtPmh0aSwgcy0+aGJpdHMsIHRva2VuLCBzLT5lbnRyaWVzLCBzLT5odWZmX2NvZGVfc2l6ZSk7CisgICAgICAgIHMtPmh1ZmZtYW5fdGFibGVbcy0+aHRpXVt0b2tlbl1bMF0gPSBzLT5oYml0czsKKyAgICAgICAgcy0+aHVmZm1hbl90YWJsZVtzLT5odGldW3Rva2VuXVsxXSA9IHMtPmh1ZmZfY29kZV9zaXplOworICAgICAgICBzLT5lbnRyaWVzKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPmh1ZmZfY29kZV9zaXplID49IDMyKSB7IC8qIG92ZXJmbG93ICovCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImh1ZmZtYW4gdHJlZSBvdmVyZmxvd1xuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcy0+aHVmZl9jb2RlX3NpemUrKzsKKyAgICAgICAgcy0+aGJpdHMgPDw9IDE7CisgICAgICAgIGlmIChyZWFkX2h1ZmZtYW5fdHJlZShhdmN0eCwgZ2IpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzLT5oYml0cyB8PSAxOworICAgICAgICBpZiAocmVhZF9odWZmbWFuX3RyZWUoYXZjdHgsIGdiKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcy0+aGJpdHMgPj49IDE7CisgICAgICAgIHMtPmh1ZmZfY29kZV9zaXplLS07CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwM19pbml0X3RocmVhZF9jb3B5KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWcDNEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHMtPnN1cGVyYmxvY2tfY29kaW5nICAgICAgPSBOVUxMOworICAgIHMtPmFsbF9mcmFnbWVudHMgICAgICAgICAgPSBOVUxMOworICAgIHMtPmNvZGVkX2ZyYWdtZW50X2xpc3RbMF0gPSBOVUxMOworICAgIHMtPmRjdF90b2tlbnNfYmFzZSAgICAgICAgPSBOVUxMOworICAgIHMtPnN1cGVyYmxvY2tfZnJhZ21lbnRzICAgPSBOVUxMOworICAgIHMtPm1hY3JvYmxvY2tfY29kaW5nICAgICAgPSBOVUxMOworICAgIHMtPm1vdGlvbl92YWxbMF0gICAgICAgICAgPSBOVUxMOworICAgIHMtPm1vdGlvbl92YWxbMV0gICAgICAgICAgPSBOVUxMOworICAgIHMtPmVkZ2VfZW11X2J1ZmZlciAgICAgICAgPSBOVUxMOworCisgICAgcmV0dXJuIGluaXRfZnJhbWVzKHMpOworfQorCisjaWYgQ09ORklHX1RIRU9SQV9ERUNPREVSCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHRoZW9yYV9waXhfZm10c1s0XSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfTk9ORSwgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVjQ0NFAKK307CisKK3N0YXRpYyBpbnQgdGhlb3JhX2RlY29kZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBWcDNEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgdmlzaWJsZV93aWR0aCwgdmlzaWJsZV9oZWlnaHQsIGNvbG9yc3BhY2U7CisgICAgaW50IG9mZnNldF94ID0gMCwgb2Zmc2V0X3kgPSAwOworICAgIGludCByZXQ7CisgICAgQVZSYXRpb25hbCBmcHMsIGFzcGVjdDsKKworICAgIHMtPnRoZW9yYSA9IGdldF9iaXRzX2xvbmcoZ2IsIDI0KTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlRoZW9yYSBiaXRzdHJlYW0gdmVyc2lvbiAlWFxuIiwgcy0+dGhlb3JhKTsKKworICAgIC8qIDMuMi4wIGFrYSBhbHBoYTMgaGFzIHRoZSBzYW1lIGZyYW1lIG9yaWVudGF0aW9uIGFzIG9yaWdpbmFsIHZwMworICAgICAqIGJ1dCBwcmV2aW91cyB2ZXJzaW9ucyBoYXZlIHRoZSBpbWFnZSBmbGlwcGVkIHJlbGF0aXZlIHRvIHZwMyAqLworICAgIGlmIChzLT50aGVvcmEgPCAweDAzMDIwMCkgeworICAgICAgICBzLT5mbGlwcGVkX2ltYWdlID0gMTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiT2xkICg8YWxwaGEzKSBUaGVvcmEgYml0c3RyZWFtLCBmbGlwcGVkIGltYWdlXG4iKTsKKyAgICB9CisKKyAgICB2aXNpYmxlX3dpZHRoICA9CisgICAgcy0+d2lkdGggICAgICAgPSBnZXRfYml0cyhnYiwgMTYpIDw8IDQ7CisgICAgdmlzaWJsZV9oZWlnaHQgPQorICAgIHMtPmhlaWdodCAgICAgID0gZ2V0X2JpdHMoZ2IsIDE2KSA8PCA0OworCisgICAgaWYgKHMtPnRoZW9yYSA+PSAweDAzMDIwMCkgeworICAgICAgICB2aXNpYmxlX3dpZHRoICA9IGdldF9iaXRzX2xvbmcoZ2IsIDI0KTsKKyAgICAgICAgdmlzaWJsZV9oZWlnaHQgPSBnZXRfYml0c19sb25nKGdiLCAyNCk7CisKKyAgICAgICAgb2Zmc2V0X3ggPSBnZXRfYml0cyhnYiwgOCk7IC8qIG9mZnNldCB4ICovCisgICAgICAgIG9mZnNldF95ID0gZ2V0X2JpdHMoZ2IsIDgpOyAvKiBvZmZzZXQgeSwgZnJvbSBib3R0b20gKi8KKyAgICB9CisKKyAgICBmcHMubnVtID0gZ2V0X2JpdHNfbG9uZyhnYiwgMzIpOworICAgIGZwcy5kZW4gPSBnZXRfYml0c19sb25nKGdiLCAzMik7CisgICAgaWYgKGZwcy5udW0gJiYgZnBzLmRlbikgeworICAgICAgICBpZiAoZnBzLm51bSA8IDAgfHwgZnBzLmRlbiA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZXJhdGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYXZfcmVkdWNlKCZhdmN0eC0+ZnJhbWVyYXRlLmRlbiwgJmF2Y3R4LT5mcmFtZXJhdGUubnVtLAorICAgICAgICAgICAgICAgICAgZnBzLmRlbiwgZnBzLm51bSwgMSA8PCAzMCk7CisgICAgfQorCisgICAgYXNwZWN0Lm51bSA9IGdldF9iaXRzX2xvbmcoZ2IsIDI0KTsKKyAgICBhc3BlY3QuZGVuID0gZ2V0X2JpdHNfbG9uZyhnYiwgMjQpOworICAgIGlmIChhc3BlY3QubnVtICYmIGFzcGVjdC5kZW4pIHsKKyAgICAgICAgYXZfcmVkdWNlKCZhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCisgICAgICAgICAgICAgICAgICAmYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAorICAgICAgICAgICAgICAgICAgYXNwZWN0Lm51bSwgYXNwZWN0LmRlbiwgMSA8PCAzMCk7CisgICAgICAgIGZmX3NldF9zYXIoYXZjdHgsIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvKTsKKyAgICB9CisKKyAgICBpZiAocy0+dGhlb3JhIDwgMHgwMzAyMDApCisgICAgICAgIHNraXBfYml0cyhnYiwgNSk7IC8qIGtleWZyYW1lIGZyZXF1ZW5jeSBmb3JjZSAqLworICAgIGNvbG9yc3BhY2UgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgc2tpcF9iaXRzKGdiLCAyNCk7IC8qIGJpdHJhdGUgKi8KKworICAgIHNraXBfYml0cyhnYiwgNik7IC8qIHF1YWxpdHkgaGludCAqLworCisgICAgaWYgKHMtPnRoZW9yYSA+PSAweDAzMDIwMCkgeworICAgICAgICBza2lwX2JpdHMoZ2IsIDUpOyAvKiBrZXlmcmFtZSBmcmVxdWVuY3kgZm9yY2UgKi8KKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSB0aGVvcmFfcGl4X2ZtdHNbZ2V0X2JpdHMoZ2IsIDIpXTsKKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBpeGVsIGZvcm1hdFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBza2lwX2JpdHMoZ2IsIDMpOyAvKiByZXNlcnZlZCAqLworICAgIH0KKworLy8gICAgYWxpZ25fZ2V0X2JpdHMoZ2IpOworCisgICAgaWYgKHZpc2libGVfd2lkdGggIDw9IHMtPndpZHRoICAmJiB2aXNpYmxlX3dpZHRoICA+IHMtPndpZHRoICAtIDE2ICYmCisgICAgICAgIHZpc2libGVfaGVpZ2h0IDw9IHMtPmhlaWdodCAmJiB2aXNpYmxlX2hlaWdodCA+IHMtPmhlaWdodCAtIDE2ICYmCisgICAgICAgICFvZmZzZXRfeCAmJiAob2Zmc2V0X3kgPT0gcy0+aGVpZ2h0IC0gdmlzaWJsZV9oZWlnaHQpKQorICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgdmlzaWJsZV93aWR0aCwgdmlzaWJsZV9oZWlnaHQpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHMtPndpZHRoLCBzLT5oZWlnaHQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGNvbG9yc3BhY2UgPT0gMSkKKyAgICAgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IEFWQ09MX1BSSV9CVDQ3ME07CisgICAgZWxzZSBpZiAoY29sb3JzcGFjZSA9PSAyKQorICAgICAgICBhdmN0eC0+Y29sb3JfcHJpbWFyaWVzID0gQVZDT0xfUFJJX0JUNDcwQkc7CisKKyAgICBpZiAoY29sb3JzcGFjZSA9PSAxIHx8IGNvbG9yc3BhY2UgPT0gMikgeworICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOworICAgICAgICBhdmN0eC0+Y29sb3JfdHJjICA9IEFWQ09MX1RSQ19CVDcwOTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aGVvcmFfZGVjb2RlX3RhYmxlcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIFZwM0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCBuLCBtYXRyaWNlcywgaW50ZXIsIHBsYW5lOworCisgICAgaWYgKHMtPnRoZW9yYSA+PSAweDAzMDIwMCkgeworICAgICAgICBuID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAvKiBsb29wIGZpbHRlciBsaW1pdCB2YWx1ZXMgdGFibGUgKi8KKyAgICAgICAgaWYgKG4pCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgICAgICBzLT5maWx0ZXJfbGltaXRfdmFsdWVzW2ldID0gZ2V0X2JpdHMoZ2IsIG4pOworICAgIH0KKworICAgIGlmIChzLT50aGVvcmEgPj0gMHgwMzAyMDApCisgICAgICAgIG4gPSBnZXRfYml0cyhnYiwgNCkgKyAxOworICAgIGVsc2UKKyAgICAgICAgbiA9IDE2OworICAgIC8qIHF1YWxpdHkgdGhyZXNob2xkIHRhYmxlICovCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgIHMtPmNvZGVkX2FjX3NjYWxlX2ZhY3RvcltpXSA9IGdldF9iaXRzKGdiLCBuKTsKKworICAgIGlmIChzLT50aGVvcmEgPj0gMHgwMzAyMDApCisgICAgICAgIG4gPSBnZXRfYml0cyhnYiwgNCkgKyAxOworICAgIGVsc2UKKyAgICAgICAgbiA9IDE2OworICAgIC8qIGRjIHNjYWxlIGZhY3RvciB0YWJsZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICBzLT5jb2RlZF9kY19zY2FsZV9mYWN0b3JbaV0gPSBnZXRfYml0cyhnYiwgbik7CisKKyAgICBpZiAocy0+dGhlb3JhID49IDB4MDMwMjAwKQorICAgICAgICBtYXRyaWNlcyA9IGdldF9iaXRzKGdiLCA5KSArIDE7CisgICAgZWxzZQorICAgICAgICBtYXRyaWNlcyA9IDM7CisKKyAgICBpZiAobWF0cmljZXMgPiAzODQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG51bWJlciBvZiBiYXNlIG1hdHJpeGVzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZvciAobiA9IDA7IG4gPCBtYXRyaWNlczsgbisrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIHMtPmJhc2VfbWF0cml4W25dW2ldID0gZ2V0X2JpdHMoZ2IsIDgpOworCisgICAgZm9yIChpbnRlciA9IDA7IGludGVyIDw9IDE7IGludGVyKyspIHsKKyAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDw9IDI7IHBsYW5lKyspIHsKKyAgICAgICAgICAgIGludCBuZXdxciA9IDE7CisgICAgICAgICAgICBpZiAoaW50ZXIgfHwgcGxhbmUgPiAwKQorICAgICAgICAgICAgICAgIG5ld3FyID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGlmICghbmV3cXIpIHsKKyAgICAgICAgICAgICAgICBpbnQgcXRqLCBwbGo7CisgICAgICAgICAgICAgICAgaWYgKGludGVyICYmIGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgICAgICAgICAgcXRqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcGxqID0gcGxhbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcXRqID0gKDMgKiBpbnRlciArIHBsYW5lIC0gMSkgLyAzOworICAgICAgICAgICAgICAgICAgICBwbGogPSAocGxhbmUgKyAyKSAlIDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPnFyX2NvdW50W2ludGVyXVtwbGFuZV0gPSBzLT5xcl9jb3VudFtxdGpdW3Bsal07CisgICAgICAgICAgICAgICAgbWVtY3B5KHMtPnFyX3NpemVbaW50ZXJdW3BsYW5lXSwgcy0+cXJfc2l6ZVtxdGpdW3Bsal0sCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzLT5xcl9zaXplWzBdWzBdKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHMtPnFyX2Jhc2VbaW50ZXJdW3BsYW5lXSwgcy0+cXJfYmFzZVtxdGpdW3Bsal0sCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzLT5xcl9iYXNlWzBdWzBdKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBxcmkgPSAwOworICAgICAgICAgICAgICAgIGludCBxaSAgPSAwOworCisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBpID0gZ2V0X2JpdHMoZ2IsIGF2X2xvZzIobWF0cmljZXMgLSAxKSArIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBtYXRyaWNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgYmFzZSBtYXRyaXggaW5kZXhcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMtPnFyX2Jhc2VbaW50ZXJdW3BsYW5lXVtxcmldID0gaTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHFpID49IDYzKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGkgPSBnZXRfYml0cyhnYiwgYXZfbG9nMig2MyAtIHFpKSArIDEpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgcy0+cXJfc2l6ZVtpbnRlcl1bcGxhbmVdW3FyaSsrXSA9IGk7CisgICAgICAgICAgICAgICAgICAgIHFpICs9IGk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHFpID4gNjMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHFpICVkID4gNjNcbiIsIHFpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT5xcl9jb3VudFtpbnRlcl1bcGxhbmVdID0gcXJpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogSHVmZm1hbiB0YWJsZXMgKi8KKyAgICBmb3IgKHMtPmh0aSA9IDA7IHMtPmh0aSA8IDgwOyBzLT5odGkrKykgeworICAgICAgICBzLT5lbnRyaWVzICAgICAgICA9IDA7CisgICAgICAgIHMtPmh1ZmZfY29kZV9zaXplID0gMTsKKyAgICAgICAgaWYgKCFnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBzLT5oYml0cyA9IDA7CisgICAgICAgICAgICBpZiAocmVhZF9odWZmbWFuX3RyZWUoYXZjdHgsIGdiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzLT5oYml0cyA9IDE7CisgICAgICAgICAgICBpZiAocmVhZF9odWZmbWFuX3RyZWUoYXZjdHgsIGdiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT50aGVvcmFfdGFibGVzID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdGhlb3JhX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWcDNEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBwdHlwZTsKKyAgICB1aW50OF90ICpoZWFkZXJfc3RhcnRbM107CisgICAgaW50IGhlYWRlcl9sZW5bM107CisgICAgaW50IGk7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKworICAgIHMtPnRoZW9yYSA9IDE7CisKKyAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgZXh0cmFkYXRhIVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoYXZwcml2X3NwbGl0X3hpcGhfaGVhZGVycyhhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIsIGhlYWRlcl9zdGFydCwgaGVhZGVyX2xlbikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29ycnVwdCBleHRyYWRhdGFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBpZiAoaGVhZGVyX2xlbltpXSA8PSAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBoZWFkZXJfc3RhcnRbaV0sIGhlYWRlcl9sZW5baV0gKiA4KTsKKworICAgICAgICBwdHlwZSA9IGdldF9iaXRzKCZnYiwgOCk7CisKKyAgICAgICAgaWYgKCEocHR5cGUgJiAweDgwKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGV4dHJhZGF0YSFcbiIpOworLy8gICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUU6IENoZWNrIGZvciB0aGlzIGFzIHdlbGwuCisgICAgICAgIHNraXBfYml0c19sb25nKCZnYiwgNiAqIDgpOyAvKiAidGhlb3JhIiAqLworCisgICAgICAgIHN3aXRjaCAocHR5cGUpIHsKKyAgICAgICAgY2FzZSAweDgwOgorICAgICAgICAgICAgaWYgKHRoZW9yYV9kZWNvZGVfaGVhZGVyKGF2Y3R4LCAmZ2IpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDgxOgorLy8gRklYTUU6IGlzIHRoaXMgbmVlZGVkPyBpdCBicmVha3Mgc29tZXRpbWVzCisvLyAgICAgICAgICAgIHRoZW9yYV9kZWNvZGVfY29tbWVudHMoYXZjdHgsIGdiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ODI6CisgICAgICAgICAgICBpZiAodGhlb3JhX2RlY29kZV90YWJsZXMoYXZjdHgsICZnYikpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVW5rbm93biBUaGVvcmEgY29uZmlnIHBhY2tldDogJWRcbiIsIHB0eXBlICYgfjB4ODApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB0eXBlICE9IDB4ODEgJiYgOCAqIGhlYWRlcl9sZW5baV0gIT0gZ2V0X2JpdHNfY291bnQoJmdiKSkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIiVkIGJpdHMgbGVmdCBpbiBwYWNrZXQgJVhcbiIsCisgICAgICAgICAgICAgICAgICAgOCAqIGhlYWRlcl9sZW5baV0gLSBnZXRfYml0c19jb3VudCgmZ2IpLCBwdHlwZSk7CisgICAgICAgIGlmIChzLT50aGVvcmEgPCAweDAzMDIwMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiB2cDNfZGVjb2RlX2luaXQoYXZjdHgpOworfQorCitBVkNvZGVjIGZmX3RoZW9yYV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAidGhlb3JhIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRoZW9yYSIpLAorICAgIC50eXBlICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1RIRU9SQSwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKFZwM0RlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSB0aGVvcmFfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgICAgICAgICA9IHZwM19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICAgICAgICAgPSB2cDNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICAgICAgICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5mbHVzaCAgICAgICAgICAgICAgICAgPSB2cDNfZGVjb2RlX2ZsdXNoLAorICAgIC5pbml0X3RocmVhZF9jb3B5ICAgICAgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh2cDNfaW5pdF90aHJlYWRfY29weSksCisgICAgLnVwZGF0ZV90aHJlYWRfY29udGV4dCA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKHZwM191cGRhdGVfdGhyZWFkX2NvbnRleHQpCit9OworI2VuZGlmCisKK0FWQ29kZWMgZmZfdnAzX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgICA9ICJ2cDMiLAorICAgIC5sb25nX25hbWUgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT24yIFZQMyIpLAorICAgIC50eXBlICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZQMywKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKFZwM0RlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSB2cDNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgICAgICAgICA9IHZwM19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICAgICAgICAgPSB2cDNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICAgICAgICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5mbHVzaCAgICAgICAgICAgICAgICAgPSB2cDNfZGVjb2RlX2ZsdXNoLAorICAgIC5pbml0X3RocmVhZF9jb3B5ICAgICAgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh2cDNfaW5pdF90aHJlYWRfY29weSksCisgICAgLnVwZGF0ZV90aHJlYWRfY29udGV4dCA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKHZwM191cGRhdGVfdGhyZWFkX2NvbnRleHQpLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZwM19wYXJzZXIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwM19wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWUwNDZjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnAzX3BhcnNlci5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAicGFyc2VyLmgiCisKK3N0YXRpYyBpbnQgcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RIRU9SQSkKKyAgICAgICAgcy0+cGljdF90eXBlID0gKGJ1ZlswXSAmIDB4NDApID8gQVZfUElDVFVSRV9UWVBFX1AgOiBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBlbHNlCisgICAgICAgIHMtPnBpY3RfdHlwZSA9IChidWZbMF0gJiAweDgwKSA/IEFWX1BJQ1RVUkVfVFlQRV9QIDogQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICAqcG91dGJ1ZiAgICAgID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK0FWQ29kZWNQYXJzZXIgZmZfdnAzX3BhcnNlciA9IHsKKyAgICAuY29kZWNfaWRzICAgID0geworICAgICAgICBBVl9DT0RFQ19JRF9USEVPUkEsIEFWX0NPREVDX0lEX1ZQMywKKyAgICAgICAgQVZfQ09ERUNfSURfVlA2LCBBVl9DT0RFQ19JRF9WUDZGLCBBVl9DT0RFQ19JRF9WUDZBCisgICAgfSwKKyAgICAucGFyc2VyX3BhcnNlID0gcGFyc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnAzZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnAzZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzFmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDNkYXRhLmgKQEAgLTAsMCArMSwzMTgxIEBACisvKgorICogY29weXJpZ2h0IChDKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVlAzREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfVlAzREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogdGhlc2UgY29lZmZpY2llbnRzIGRlcXVhbnRpemUgaW50cmFmcmFtZSBZIHBsYW5lIGNvZWZmaWNpZW50cworICogKG5vdGU6IHNhbWUgYXMgSlBFRykgKi8KK3N0YXRpYyBjb25zdCBpbnQ4X3QgdnAzMV9pbnRyYV95X2RlcXVhbnRbNjRdID0geworICAgIDE2LCAxMSwgMTAsIDE2LCAgMjQsICA0MCwgIDUxLCAgNjEsCisgICAgMTIsIDEyLCAxNCwgMTksICAyNiwgIDU4LCAgNjAsICA1NSwKKyAgICAxNCwgMTMsIDE2LCAyNCwgIDQwLCAgNTcsICA2OSwgIDU2LAorICAgIDE0LCAxNywgMjIsIDI5LCAgNTEsICA4NywgIDgwLCAgNjIsCisgICAgMTgsIDIyLCAzNywgNTgsICA2OCwgMTA5LCAxMDMsICA3NywKKyAgICAyNCwgMzUsIDU1LCA2NCwgIDgxLCAxMDQsIDExMywgIDkyLAorICAgIDQ5LCA2NCwgNzgsIDg3LCAxMDMsIDEyMSwgMTIwLCAxMDEsCisgICAgNzIsIDkyLCA5NSwgOTgsIDExMiwgMTAwLCAxMDMsICA5OQorfTsKKworLyogdGhlc2UgY29lZmZpY2llbnRzIGRlcXVhbnRpemUgaW50cmFmcmFtZSBDIHBsYW5lIGNvZWZmaWNpZW50cworICogKG5vdGU6IHNhbWUgYXMgSlBFRykgKi8KK3N0YXRpYyBjb25zdCBpbnQ4X3QgdnAzMV9pbnRyYV9jX2RlcXVhbnRbNjRdID0geworICAgIDE3LCAxOCwgMjQsIDQ3LCA5OSwgOTksIDk5LCA5OSwKKyAgICAxOCwgMjEsIDI2LCA2NiwgOTksIDk5LCA5OSwgOTksCisgICAgMjQsIDI2LCA1NiwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgIDQ3LCA2NiwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksCisgICAgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTkKK307CisKKy8qIHRoZXNlIGNvZWZmaWNpZW50cyBkZXF1YW50aXplIGludGVyZnJhbWUgY29lZmZpY2llbnRzIChhbGwgcGxhbmVzKSAqLworc3RhdGljIGNvbnN0IGludDhfdCB2cDMxX2ludGVyX2RlcXVhbnRbNjRdID0geworICAgIDE2LCAxNiwgMTYsIDIwLCAyNCwgMjgsICAzMiwgIDQwLAorICAgIDE2LCAxNiwgMjAsIDI0LCAyOCwgMzIsICA0MCwgIDQ4LAorICAgIDE2LCAyMCwgMjQsIDI4LCAzMiwgNDAsICA0OCwgIDY0LAorICAgIDIwLCAyNCwgMjgsIDMyLCA0MCwgNDgsICA2NCwgIDY0LAorICAgIDI0LCAyOCwgMzIsIDQwLCA0OCwgNjQsICA2NCwgIDY0LAorICAgIDI4LCAzMiwgNDAsIDQ4LCA2NCwgNjQsICA2NCwgIDk2LAorICAgIDMyLCA0MCwgNDgsIDY0LCA2NCwgNjQsICA5NiwgMTI4LAorICAgIDQwLCA0OCwgNjQsIDY0LCA2NCwgOTYsIDEyOCwgMTI4Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDMxX2RjX3NjYWxlX2ZhY3Rvcls2NF0gPSB7CisgICAgMjIwLCAyMDAsIDE5MCwgMTgwLCAxNzAsIDE3MCwgMTYwLCAxNjAsCisgICAgMTUwLCAxNTAsIDE0MCwgMTQwLCAxMzAsIDEzMCwgMTIwLCAxMjAsCisgICAgMTEwLCAxMTAsIDEwMCwgMTAwLCAgOTAsICA5MCwgIDkwLCAgODAsCisgICAgIDgwLCAgODAsICA3MCwgIDcwLCAgNzAsICA2MCwgIDYwLCAgNjAsCisgICAgIDYwLCAgNTAsICA1MCwgIDUwLCAgNTAsICA0MCwgIDQwLCAgNDAsCisgICAgIDQwLCAgNDAsICAzMCwgIDMwLCAgMzAsICAzMCwgIDMwLCAgMzAsCisgICAgIDMwLCAgMjAsICAyMCwgIDIwLCAgMjAsICAyMCwgIDIwLCAgMjAsCisgICAgIDIwLCAgMTAsICAxMCwgIDEwLCAgMTAsICAxMCwgIDEwLCAgMTAKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB2cDMxX2FjX3NjYWxlX2ZhY3Rvcls2NF0gPSB7CisgICAgNTAwLCA0NTAsIDQwMCwgMzcwLCAzNDAsIDMxMCwgMjg1LCAyNjUsCisgICAgMjQ1LCAyMjUsIDIxMCwgMTk1LCAxODUsIDE4MCwgMTcwLCAxNjAsCisgICAgMTUwLCAxNDUsIDEzNSwgMTMwLCAxMjUsIDExNSwgMTEwLCAxMDcsCisgICAgMTAwLCAgOTYsICA5MywgIDg5LCAgODUsICA4MiwgIDc1LCAgNzQsCisgICAgIDcwLCAgNjgsICA2NCwgIDYwLCAgNTcsICA1NiwgIDUyLCAgNTAsCisgICAgIDQ5LCAgNDUsICA0NCwgIDQzLCAgNDAsICAzOCwgIDM3LCAgMzUsCisgICAgIDMzLCAgMzIsICAzMCwgIDI5LCAgMjgsICAyNSwgIDI0LCAgMjIsCisgICAgIDIxLCAgMTksICAxOCwgIDE3LCAgMTUsICAxMywgIDEyLCAgMTAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwMzFfZmlsdGVyX2xpbWl0X3ZhbHVlc1s2NF0gPSB7CisgICAgMzAsIDI1LCAyMCwgMjAsIDE1LCAxNSwgMTQsIDE0LAorICAgIDEzLCAxMywgMTIsIDEyLCAxMSwgMTEsIDEwLCAxMCwKKyAgICAgOSwgIDksICA4LCAgOCwgIDcsICA3LCAgNywgIDcsCisgICAgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LAorICAgICA0LCAgNCwgIDQsICA0LCAgMywgIDMsICAzLCAgMywKKyAgICAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN1cGVyYmxvY2tfcnVuX2xlbmd0aF92bGNfdGFibGVbMzRdWzJdID0geworICAgIHsgICAgIDAsICAxIH0sCisKKyAgICB7ICAgICA0LCAgMyB9LCB7ICAgICA1LCAgMyB9LAorCisgICAgeyAgIDB4QywgIDQgfSwgeyAgIDB4RCwgIDQgfSwKKworICAgIHsgIDB4MzgsICA2IH0sIHsgIDB4MzksICA2IH0sIHsgIDB4M0EsICA2IH0sIHsgIDB4M0IsICA2IH0sCisKKyAgICB7ICAweEYwLCAgOCB9LCB7ICAweEYxLCAgOCB9LCB7ICAweEYyLCAgOCB9LCB7ICAweEYzLCAgOCB9LAorICAgIHsgIDB4RjQsICA4IH0sIHsgIDB4RjUsICA4IH0sIHsgIDB4RjYsICA4IH0sIHsgIDB4RjcsICA4IH0sCisKKyAgICB7IDB4M0UwLCAxMCB9LCB7IDB4M0UxLCAxMCB9LCB7IDB4M0UyLCAxMCB9LCB7IDB4M0UzLCAxMCB9LAorICAgIHsgMHgzRTQsIDEwIH0sIHsgMHgzRTUsIDEwIH0sIHsgMHgzRTYsIDEwIH0sIHsgMHgzRTcsIDEwIH0sCisgICAgeyAweDNFOCwgMTAgfSwgeyAweDNFOSwgMTAgfSwgeyAweDNFQSwgMTAgfSwgeyAweDNFQiwgMTAgfSwKKyAgICB7IDB4M0VDLCAxMCB9LCB7IDB4M0VELCAxMCB9LCB7IDB4M0VFLCAxMCB9LCB7IDB4M0VGLCAxMCB9LAorCisgICAgeyAgMHgzRiwgIDYgfSAvKiB0aGlzIGxhc3QgVkxDIGlzIGEgc3BlY2lhbCBjYXNlIGZvciByZWFkaW5nIDEyIG1vcmUKKyAgICAgICAgICAgICAgICAgICAqIGJpdHMgZnJvbSBzdHJlYW0gYW5kIGFkZGluZyB0aGUgdmFsdWUgMzQgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBmcmFnbWVudF9ydW5fbGVuZ3RoX3ZsY190YWJsZVszMF1bMl0gPSB7CisgICAgLyogMSAtPiAyICovCisgICAgeyAgIDB4MCwgMiB9LCB7ICAgMHgxLCAyIH0sCisKKyAgICAvKiAzIC0+IDQgKi8KKyAgICB7ICAgMHg0LCAzIH0sIHsgICAweDUsIDMgfSwKKworICAgIC8qIDUgLT4gNiAqLworICAgIHsgICAweEMsIDQgfSwgeyAgIDB4RCwgNCB9LAorCisgICAgLyogNyAtPiAxMCAqLworICAgIHsgIDB4MzgsIDYgfSwgeyAgMHgzOSwgNiB9LAorICAgIHsgIDB4M0EsIDYgfSwgeyAgMHgzQiwgNiB9LAorCisgICAgLyogMTEgLT4gMTQgKi8KKyAgICB7ICAweDc4LCA3IH0sIHsgIDB4NzksIDcgfSwKKyAgICB7ICAweDdBLCA3IH0sIHsgIDB4N0IsIDcgfSwKKworICAgIC8qIDE1IC0+IDMwICovCisgICAgeyAweDFGMCwgOSB9LCB7IDB4MUYxLCA5IH0sIHsgMHgxRjIsIDkgfSwgeyAweDFGMywgOSB9LAorICAgIHsgMHgxRjQsIDkgfSwgeyAweDFGNSwgOSB9LCB7IDB4MUY2LCA5IH0sIHsgMHgxRjcsIDkgfSwKKyAgICB7IDB4MUY4LCA5IH0sIHsgMHgxRjksIDkgfSwgeyAweDFGQSwgOSB9LCB7IDB4MUZCLCA5IH0sCisgICAgeyAweDFGQywgOSB9LCB7IDB4MUZELCA5IH0sIHsgMHgxRkUsIDkgfSwgeyAweDFGRiwgOSB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtb2RlX2NvZGVfdmxjX3RhYmxlWzhdWzJdID0geworICAgIHsgICAwLCAxIH0sIHsgICAyLCAyIH0sCisgICAgeyAgIDYsIDMgfSwgeyAgMTQsIDQgfSwKKyAgICB7ICAzMCwgNSB9LCB7ICA2MiwgNiB9LAorICAgIHsgMTI2LCA3IH0sIHsgMTI3LCA3IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1vdGlvbl92ZWN0b3JfdmxjX3RhYmxlWzYzXVsyXSA9IHsKKyAgICB7ICAgIDAsIDMgfSwKKyAgICB7ICAgIDEsIDMgfSwKKyAgICB7ICAgIDIsIDMgfSwKKworICAgIHsgICAgNiwgNCB9LCB7ICAgIDcsIDQgfSwKKworICAgIHsgICAgOCwgNCB9LCB7ICAgIDksIDQgfSwKKworICAgIHsgICA0MCwgNiB9LCB7ICAgNDEsIDYgfSwgeyAgIDQyLCA2IH0sIHsgICA0MywgNiB9LAorICAgIHsgICA0NCwgNiB9LCB7ICAgNDUsIDYgfSwgeyAgIDQ2LCA2IH0sIHsgICA0NywgNiB9LAorCisgICAgeyAgIDk2LCA3IH0sIHsgICA5NywgNyB9LCB7ICAgOTgsIDcgfSwgeyAgIDk5LCA3IH0sCisgICAgeyAgMTAwLCA3IH0sIHsgIDEwMSwgNyB9LCB7ICAxMDIsIDcgfSwgeyAgMTAzLCA3IH0sCisgICAgeyAgMTA0LCA3IH0sIHsgIDEwNSwgNyB9LCB7ICAxMDYsIDcgfSwgeyAgMTA3LCA3IH0sCisgICAgeyAgMTA4LCA3IH0sIHsgIDEwOSwgNyB9LCB7ICAxMTAsIDcgfSwgeyAgMTExLCA3IH0sCisKKyAgICB7IDB4RTAsIDggfSwgeyAweEUxLCA4IH0sIHsgMHhFMiwgOCB9LCB7IDB4RTMsIDggfSwKKyAgICB7IDB4RTQsIDggfSwgeyAweEU1LCA4IH0sIHsgMHhFNiwgOCB9LCB7IDB4RTcsIDggfSwKKyAgICB7IDB4RTgsIDggfSwgeyAweEU5LCA4IH0sIHsgMHhFQSwgOCB9LCB7IDB4RUIsIDggfSwKKyAgICB7IDB4RUMsIDggfSwgeyAweEVELCA4IH0sIHsgMHhFRSwgOCB9LCB7IDB4RUYsIDggfSwKKworICAgIHsgMHhGMCwgOCB9LCB7IDB4RjEsIDggfSwgeyAweEYyLCA4IH0sIHsgMHhGMywgOCB9LAorICAgIHsgMHhGNCwgOCB9LCB7IDB4RjUsIDggfSwgeyAweEY2LCA4IH0sIHsgMHhGNywgOCB9LAorICAgIHsgMHhGOCwgOCB9LCB7IDB4RjksIDggfSwgeyAweEZBLCA4IH0sIHsgMHhGQiwgOCB9LAorICAgIHsgMHhGQywgOCB9LCB7IDB4RkQsIDggfSwgeyAweEZFLCA4IH0sIHsgMHhGRiwgOCB9Cit9OworCitzdGF0aWMgY29uc3QgaW50OF90IG1vdGlvbl92ZWN0b3JfdGFibGVbNjNdID0geworICAgICAwLCAgIDEsIC0xLAorICAgICAyLCAgLTIsCisgICAgIDMsICAtMywKKyAgICAgNCwgIC00LCAgNSwgIC01LCAgNiwgIC02LCAgNywgIC03LAorICAgICA4LCAgLTgsICA5LCAgLTksIDEwLCAtMTAsIDExLCAtMTEsIDEyLCAtMTIsIDEzLCAtMTMsIDE0LCAtMTQsIDE1LCAtMTUsCisgICAgMTYsIC0xNiwgMTcsIC0xNywgMTgsIC0xOCwgMTksIC0xOSwgMjAsIC0yMCwgMjEsIC0yMSwgMjIsIC0yMiwgMjMsIC0yMywKKyAgICAyNCwgLTI0LCAyNSwgLTI1LCAyNiwgLTI2LCAyNywgLTI3LCAyOCwgLTI4LCAyOSwgLTI5LCAzMCwgLTMwLCAzMSwgLTMxCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IGZpeGVkX21vdGlvbl92ZWN0b3JfdGFibGVbNjRdID0geworICAgICAwLCAgIDAsICAxLCAgLTEsICAyLCAgLTIsICAzLCAgLTMsCisgICAgIDQsICAtNCwgIDUsICAtNSwgIDYsICAtNiwgIDcsICAtNywKKyAgICAgOCwgIC04LCAgOSwgIC05LCAxMCwgLTEwLCAxMSwgLTExLAorICAgIDEyLCAtMTIsIDEzLCAtMTMsIDE0LCAtMTQsIDE1LCAtMTUsCisgICAgMTYsIC0xNiwgMTcsIC0xNywgMTgsIC0xOCwgMTksIC0xOSwKKyAgICAyMCwgLTIwLCAyMSwgLTIxLCAyMiwgLTIyLCAyMywgLTIzLAorICAgIDI0LCAtMjQsIDI1LCAtMjUsIDI2LCAtMjYsIDI3LCAtMjcsCisgICAgMjgsIC0yOCwgMjksIC0yOSwgMzAsIC0zMCwgMzEsIC0zMQorfTsKKworLyogb25seSB0b2tlbnMgMC4uNiBpbmRpY2F0ZSBlb2IgcnVucyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZW9iX3J1bl9iYXNlWzddID0geworICAgIDEsIDIsIDMsIDQsIDgsIDE2LCAwCit9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZW9iX3J1bl9nZXRfYml0c1s3XSA9IHsKKyAgICAwLCAwLCAwLCAyLCAzLCA0LCAxMgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgemVyb19ydW5fYmFzZVszMl0gPSB7CisgICAgMCwgIDAsIDAsIDAsIDAsIDAsIDAsICAgLyogMC4uNiBhcmUgbmV2ZXIgdXNlZCAqLworICAgIDAsICAwLCAgICAgICAgICAgICAgICAgIC8qIDcuLjggKi8KKyAgICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLyogOS4uMjIgKi8KKyAgICAxLCAgMiwgMywgNCwgNSwgICAgICAgICAvKiAyMy4uMjcgKi8KKyAgICA2LCAxMCwgMSwgMiAgICAgICAgICAgICAvKiAyOC4uMzEgKi8KK307CitzdGF0aWMgY29uc3QgdWludDhfdCB6ZXJvX3J1bl9nZXRfYml0c1szMl0gPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgLyogMC4uNiBhcmUgbmV2ZXIgdXNlZCAqLworICAgIDMsIDYsICAgICAgICAgICAgICAgICAgIC8qIDcuLjggKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvKiA5Li4yMiAqLworICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgIC8qIDIzLi4yNyAqLworICAgIDIsIDMsIDAsIDEgICAgICAgICAgICAgIC8qIDI4Li4zMSAqLworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29lZmZfZ2V0X2JpdHNbMzJdID0geworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgIC8qIDAuLjYgYXJlIG5ldmVyIHVzZWQgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAvKiA3Li4xMiB1c2UgY29uc3RhbnQgY29lZmZzICovCisgICAgMSwgMSwgMSwgMSwgICAgICAgICAgICAgLyogMTMuLjE2IGFyZSBjb25zdGFudHMgYnV0IHN0aWxsIG5lZWQgc2lnbiBiaXQgKi8KKyAgICAyLCAzLCA0LCA1LCA2LDEwLCAgICAgICAvKiAxNy4uMjIsIGZvciByZWFkaW5nIGxhcmdlIGNvZWZmcyAqLworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAgIC8qIDIzLi4yOSBhcmUgY29uc3RhbnRzIGJ1dCBzdGlsbCBuZWVkIHNpZ24gYml0ICovCisgICAgMiwgMiAgICAgICAgICAgICAgICAgICAgLyogMzAuLjMxICovCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjb2VmZl90YWJsZV90b2tlbl83XzhbMV0gPSB7IDAgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNvZWZmX3RhYmxlX3Rva2VuXzlbMV0gPSB7IDEgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNvZWZmX3RhYmxlX3Rva2VuXzEwWzFdID0geyAtMSB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgY29lZmZfdGFibGVfdG9rZW5fMTFbMV0gPSB7IDIgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNvZWZmX3RhYmxlX3Rva2VuXzEyWzFdID0geyAtMiB9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjb2VmZl90YWJsZV90b2tlbl8xM1syXSA9IHsgMywgLTMgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNvZWZmX3RhYmxlX3Rva2VuXzE0WzJdID0geyA0LCAtNCB9Oworc3RhdGljIGNvbnN0IGludDE2X3QgY29lZmZfdGFibGVfdG9rZW5fMTVbMl0gPSB7IDUsIC01IH07CitzdGF0aWMgY29uc3QgaW50MTZfdCBjb2VmZl90YWJsZV90b2tlbl8xNlsyXSA9IHsgNiwgLTYgfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY29lZmZfdGFibGVfdG9rZW5fMjNfMjRfMjVfMjZfMjdfMjhfMjlbMl0gPSB7IDEsIC0xIH07CitzdGF0aWMgY29uc3QgaW50MTZfdCBjb2VmZl90YWJsZV90b2tlbl8zMFs0XSA9IHsgMiwgMywgLTIsIC0zIH07CitzdGF0aWMgY29uc3QgaW50MTZfdCBjb2VmZl90YWJsZV90b2tlbl8zMVs0XSA9IHsgMiwgMywgLTIsIC0zIH07CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNvZWZmX3RhYmxlX3Rva2VuXzE3WzRdID0geworICAgIDcsIDgsIC03LCAtOAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY29lZmZfdGFibGVfdG9rZW5fMThbOF0gPSB7CisgICAgOSwgMTAsIDExLCAxMiwgLTksIC0xMCwgLTExLCAtMTIKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNvZWZmX3RhYmxlX3Rva2VuXzE5WzE2XSA9IHsKKyAgICAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIC0xMywgLTE0LCAtMTUsIC0xNiwgLTE3LCAtMTgsIC0xOSwgLTIwCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBjb2VmZl90YWJsZV90b2tlbl8yMFszMl0gPSB7CisgICAgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsCisgICAgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsCisgICAgLTIxLCAtMjIsIC0yMywgLTI0LCAtMjUsIC0yNiwgLTI3LCAtMjgsCisgICAgLTI5LCAtMzAsIC0zMSwgLTMyLCAtMzMsIC0zNCwgLTM1LCAtMzYKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGNvZWZmX3RhYmxlX3Rva2VuXzIxWzY0XSA9IHsKKyAgICAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwKKyAgICAgNDUsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwKKyAgICAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwKKyAgICAgNjEsICA2MiwgIDYzLCAgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwKKyAgICAtMzcsIC0zOCwgLTM5LCAtNDAsIC00MSwgLTQyLCAtNDMsIC00NCwKKyAgICAtNDUsIC00NiwgLTQ3LCAtNDgsIC00OSwgLTUwLCAtNTEsIC01MiwKKyAgICAtNTMsIC01NCwgLTU1LCAtNTYsIC01NywgLTU4LCAtNTksIC02MCwKKyAgICAtNjEsIC02MiwgLTYzLCAtNjQsIC02NSwgLTY2LCAtNjcsIC02OAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgY29lZmZfdGFibGVfdG9rZW5fMjJbMTAyNF0gPSB7CisgICAgICA2OSwgICA3MCwgICA3MSwgICA3MiwgICA3MywgICA3NCwgICA3NSwgICA3NiwKKyAgICAgIDc3LCAgIDc4LCAgIDc5LCAgIDgwLCAgIDgxLCAgIDgyLCAgIDgzLCAgIDg0LAorICAgICAgODUsICAgODYsICAgODcsICAgODgsICAgODksICAgOTAsICAgOTEsICAgOTIsCisgICAgICA5MywgICA5NCwgICA5NSwgICA5NiwgICA5NywgICA5OCwgICA5OSwgIDEwMCwKKyAgICAgMTAxLCAgMTAyLCAgMTAzLCAgMTA0LCAgMTA1LCAgMTA2LCAgMTA3LCAgMTA4LAorICAgICAxMDksICAxMTAsICAxMTEsICAxMTIsICAxMTMsICAxMTQsICAxMTUsICAxMTYsCisgICAgIDExNywgIDExOCwgIDExOSwgIDEyMCwgIDEyMSwgIDEyMiwgIDEyMywgIDEyNCwKKyAgICAgMTI1LCAgMTI2LCAgMTI3LCAgMTI4LCAgMTI5LCAgMTMwLCAgMTMxLCAgMTMyLAorICAgICAxMzMsICAxMzQsICAxMzUsICAxMzYsICAxMzcsICAxMzgsICAxMzksICAxNDAsCisgICAgIDE0MSwgIDE0MiwgIDE0MywgIDE0NCwgIDE0NSwgIDE0NiwgIDE0NywgIDE0OCwKKyAgICAgMTQ5LCAgMTUwLCAgMTUxLCAgMTUyLCAgMTUzLCAgMTU0LCAgMTU1LCAgMTU2LAorICAgICAxNTcsICAxNTgsICAxNTksICAxNjAsICAxNjEsICAxNjIsICAxNjMsICAxNjQsCisgICAgIDE2NSwgIDE2NiwgIDE2NywgIDE2OCwgIDE2OSwgIDE3MCwgIDE3MSwgIDE3MiwKKyAgICAgMTczLCAgMTc0LCAgMTc1LCAgMTc2LCAgMTc3LCAgMTc4LCAgMTc5LCAgMTgwLAorICAgICAxODEsICAxODIsICAxODMsICAxODQsICAxODUsICAxODYsICAxODcsICAxODgsCisgICAgIDE4OSwgIDE5MCwgIDE5MSwgIDE5MiwgIDE5MywgIDE5NCwgIDE5NSwgIDE5NiwKKyAgICAgMTk3LCAgMTk4LCAgMTk5LCAgMjAwLCAgMjAxLCAgMjAyLCAgMjAzLCAgMjA0LAorICAgICAyMDUsICAyMDYsICAyMDcsICAyMDgsICAyMDksICAyMTAsICAyMTEsICAyMTIsCisgICAgIDIxMywgIDIxNCwgIDIxNSwgIDIxNiwgIDIxNywgIDIxOCwgIDIxOSwgIDIyMCwKKyAgICAgMjIxLCAgMjIyLCAgMjIzLCAgMjI0LCAgMjI1LCAgMjI2LCAgMjI3LCAgMjI4LAorICAgICAyMjksICAyMzAsICAyMzEsICAyMzIsICAyMzMsICAyMzQsICAyMzUsICAyMzYsCisgICAgIDIzNywgIDIzOCwgIDIzOSwgIDI0MCwgIDI0MSwgIDI0MiwgIDI0MywgIDI0NCwKKyAgICAgMjQ1LCAgMjQ2LCAgMjQ3LCAgMjQ4LCAgMjQ5LCAgMjUwLCAgMjUxLCAgMjUyLAorICAgICAyNTMsICAyNTQsICAyNTUsICAyNTYsICAyNTcsICAyNTgsICAyNTksICAyNjAsCisgICAgIDI2MSwgIDI2MiwgIDI2MywgIDI2NCwgIDI2NSwgIDI2NiwgIDI2NywgIDI2OCwKKyAgICAgMjY5LCAgMjcwLCAgMjcxLCAgMjcyLCAgMjczLCAgMjc0LCAgMjc1LCAgMjc2LAorICAgICAyNzcsICAyNzgsICAyNzksICAyODAsICAyODEsICAyODIsICAyODMsICAyODQsCisgICAgIDI4NSwgIDI4NiwgIDI4NywgIDI4OCwgIDI4OSwgIDI5MCwgIDI5MSwgIDI5MiwKKyAgICAgMjkzLCAgMjk0LCAgMjk1LCAgMjk2LCAgMjk3LCAgMjk4LCAgMjk5LCAgMzAwLAorICAgICAzMDEsICAzMDIsICAzMDMsICAzMDQsICAzMDUsICAzMDYsICAzMDcsICAzMDgsCisgICAgIDMwOSwgIDMxMCwgIDMxMSwgIDMxMiwgIDMxMywgIDMxNCwgIDMxNSwgIDMxNiwKKyAgICAgMzE3LCAgMzE4LCAgMzE5LCAgMzIwLCAgMzIxLCAgMzIyLCAgMzIzLCAgMzI0LAorICAgICAzMjUsICAzMjYsICAzMjcsICAzMjgsICAzMjksICAzMzAsICAzMzEsICAzMzIsCisgICAgIDMzMywgIDMzNCwgIDMzNSwgIDMzNiwgIDMzNywgIDMzOCwgIDMzOSwgIDM0MCwKKyAgICAgMzQxLCAgMzQyLCAgMzQzLCAgMzQ0LCAgMzQ1LCAgMzQ2LCAgMzQ3LCAgMzQ4LAorICAgICAzNDksICAzNTAsICAzNTEsICAzNTIsICAzNTMsICAzNTQsICAzNTUsICAzNTYsCisgICAgIDM1NywgIDM1OCwgIDM1OSwgIDM2MCwgIDM2MSwgIDM2MiwgIDM2MywgIDM2NCwKKyAgICAgMzY1LCAgMzY2LCAgMzY3LCAgMzY4LCAgMzY5LCAgMzcwLCAgMzcxLCAgMzcyLAorICAgICAzNzMsICAzNzQsICAzNzUsICAzNzYsICAzNzcsICAzNzgsICAzNzksICAzODAsCisgICAgIDM4MSwgIDM4MiwgIDM4MywgIDM4NCwgIDM4NSwgIDM4NiwgIDM4NywgIDM4OCwKKyAgICAgMzg5LCAgMzkwLCAgMzkxLCAgMzkyLCAgMzkzLCAgMzk0LCAgMzk1LCAgMzk2LAorICAgICAzOTcsICAzOTgsICAzOTksICA0MDAsICA0MDEsICA0MDIsICA0MDMsICA0MDQsCisgICAgIDQwNSwgIDQwNiwgIDQwNywgIDQwOCwgIDQwOSwgIDQxMCwgIDQxMSwgIDQxMiwKKyAgICAgNDEzLCAgNDE0LCAgNDE1LCAgNDE2LCAgNDE3LCAgNDE4LCAgNDE5LCAgNDIwLAorICAgICA0MjEsICA0MjIsICA0MjMsICA0MjQsICA0MjUsICA0MjYsICA0MjcsICA0MjgsCisgICAgIDQyOSwgIDQzMCwgIDQzMSwgIDQzMiwgIDQzMywgIDQzNCwgIDQzNSwgIDQzNiwKKyAgICAgNDM3LCAgNDM4LCAgNDM5LCAgNDQwLCAgNDQxLCAgNDQyLCAgNDQzLCAgNDQ0LAorICAgICA0NDUsICA0NDYsICA0NDcsICA0NDgsICA0NDksICA0NTAsICA0NTEsICA0NTIsCisgICAgIDQ1MywgIDQ1NCwgIDQ1NSwgIDQ1NiwgIDQ1NywgIDQ1OCwgIDQ1OSwgIDQ2MCwKKyAgICAgNDYxLCAgNDYyLCAgNDYzLCAgNDY0LCAgNDY1LCAgNDY2LCAgNDY3LCAgNDY4LAorICAgICA0NjksICA0NzAsICA0NzEsICA0NzIsICA0NzMsICA0NzQsICA0NzUsICA0NzYsCisgICAgIDQ3NywgIDQ3OCwgIDQ3OSwgIDQ4MCwgIDQ4MSwgIDQ4MiwgIDQ4MywgIDQ4NCwKKyAgICAgNDg1LCAgNDg2LCAgNDg3LCAgNDg4LCAgNDg5LCAgNDkwLCAgNDkxLCAgNDkyLAorICAgICA0OTMsICA0OTQsICA0OTUsICA0OTYsICA0OTcsICA0OTgsICA0OTksICA1MDAsCisgICAgIDUwMSwgIDUwMiwgIDUwMywgIDUwNCwgIDUwNSwgIDUwNiwgIDUwNywgIDUwOCwKKyAgICAgNTA5LCAgNTEwLCAgNTExLCAgNTEyLCAgNTEzLCAgNTE0LCAgNTE1LCAgNTE2LAorICAgICA1MTcsICA1MTgsICA1MTksICA1MjAsICA1MjEsICA1MjIsICA1MjMsICA1MjQsCisgICAgIDUyNSwgIDUyNiwgIDUyNywgIDUyOCwgIDUyOSwgIDUzMCwgIDUzMSwgIDUzMiwKKyAgICAgNTMzLCAgNTM0LCAgNTM1LCAgNTM2LCAgNTM3LCAgNTM4LCAgNTM5LCAgNTQwLAorICAgICA1NDEsICA1NDIsICA1NDMsICA1NDQsICA1NDUsICA1NDYsICA1NDcsICA1NDgsCisgICAgIDU0OSwgIDU1MCwgIDU1MSwgIDU1MiwgIDU1MywgIDU1NCwgIDU1NSwgIDU1NiwKKyAgICAgNTU3LCAgNTU4LCAgNTU5LCAgNTYwLCAgNTYxLCAgNTYyLCAgNTYzLCAgNTY0LAorICAgICA1NjUsICA1NjYsICA1NjcsICA1NjgsICA1NjksICA1NzAsICA1NzEsICA1NzIsCisgICAgIDU3MywgIDU3NCwgIDU3NSwgIDU3NiwgIDU3NywgIDU3OCwgIDU3OSwgIDU4MCwKKyAgICAgLTY5LCAgLTcwLCAgLTcxLCAgLTcyLCAgLTczLCAgLTc0LCAgLTc1LCAgLTc2LAorICAgICAtNzcsICAtNzgsICAtNzksICAtODAsICAtODEsICAtODIsICAtODMsICAtODQsCisgICAgIC04NSwgIC04NiwgIC04NywgIC04OCwgIC04OSwgIC05MCwgIC05MSwgIC05MiwKKyAgICAgLTkzLCAgLTk0LCAgLTk1LCAgLTk2LCAgLTk3LCAgLTk4LCAgLTk5LCAtMTAwLAorICAgIC0xMDEsIC0xMDIsIC0xMDMsIC0xMDQsIC0xMDUsIC0xMDYsIC0xMDcsIC0xMDgsCisgICAgLTEwOSwgLTExMCwgLTExMSwgLTExMiwgLTExMywgLTExNCwgLTExNSwgLTExNiwKKyAgICAtMTE3LCAtMTE4LCAtMTE5LCAtMTIwLCAtMTIxLCAtMTIyLCAtMTIzLCAtMTI0LAorICAgIC0xMjUsIC0xMjYsIC0xMjcsIC0xMjgsIC0xMjksIC0xMzAsIC0xMzEsIC0xMzIsCisgICAgLTEzMywgLTEzNCwgLTEzNSwgLTEzNiwgLTEzNywgLTEzOCwgLTEzOSwgLTE0MCwKKyAgICAtMTQxLCAtMTQyLCAtMTQzLCAtMTQ0LCAtMTQ1LCAtMTQ2LCAtMTQ3LCAtMTQ4LAorICAgIC0xNDksIC0xNTAsIC0xNTEsIC0xNTIsIC0xNTMsIC0xNTQsIC0xNTUsIC0xNTYsCisgICAgLTE1NywgLTE1OCwgLTE1OSwgLTE2MCwgLTE2MSwgLTE2MiwgLTE2MywgLTE2NCwKKyAgICAtMTY1LCAtMTY2LCAtMTY3LCAtMTY4LCAtMTY5LCAtMTcwLCAtMTcxLCAtMTcyLAorICAgIC0xNzMsIC0xNzQsIC0xNzUsIC0xNzYsIC0xNzcsIC0xNzgsIC0xNzksIC0xODAsCisgICAgLTE4MSwgLTE4MiwgLTE4MywgLTE4NCwgLTE4NSwgLTE4NiwgLTE4NywgLTE4OCwKKyAgICAtMTg5LCAtMTkwLCAtMTkxLCAtMTkyLCAtMTkzLCAtMTk0LCAtMTk1LCAtMTk2LAorICAgIC0xOTcsIC0xOTgsIC0xOTksIC0yMDAsIC0yMDEsIC0yMDIsIC0yMDMsIC0yMDQsCisgICAgLTIwNSwgLTIwNiwgLTIwNywgLTIwOCwgLTIwOSwgLTIxMCwgLTIxMSwgLTIxMiwKKyAgICAtMjEzLCAtMjE0LCAtMjE1LCAtMjE2LCAtMjE3LCAtMjE4LCAtMjE5LCAtMjIwLAorICAgIC0yMjEsIC0yMjIsIC0yMjMsIC0yMjQsIC0yMjUsIC0yMjYsIC0yMjcsIC0yMjgsCisgICAgLTIyOSwgLTIzMCwgLTIzMSwgLTIzMiwgLTIzMywgLTIzNCwgLTIzNSwgLTIzNiwKKyAgICAtMjM3LCAtMjM4LCAtMjM5LCAtMjQwLCAtMjQxLCAtMjQyLCAtMjQzLCAtMjQ0LAorICAgIC0yNDUsIC0yNDYsIC0yNDcsIC0yNDgsIC0yNDksIC0yNTAsIC0yNTEsIC0yNTIsCisgICAgLTI1MywgLTI1NCwgLTI1NSwgLTI1NiwgLTI1NywgLTI1OCwgLTI1OSwgLTI2MCwKKyAgICAtMjYxLCAtMjYyLCAtMjYzLCAtMjY0LCAtMjY1LCAtMjY2LCAtMjY3LCAtMjY4LAorICAgIC0yNjksIC0yNzAsIC0yNzEsIC0yNzIsIC0yNzMsIC0yNzQsIC0yNzUsIC0yNzYsCisgICAgLTI3NywgLTI3OCwgLTI3OSwgLTI4MCwgLTI4MSwgLTI4MiwgLTI4MywgLTI4NCwKKyAgICAtMjg1LCAtMjg2LCAtMjg3LCAtMjg4LCAtMjg5LCAtMjkwLCAtMjkxLCAtMjkyLAorICAgIC0yOTMsIC0yOTQsIC0yOTUsIC0yOTYsIC0yOTcsIC0yOTgsIC0yOTksIC0zMDAsCisgICAgLTMwMSwgLTMwMiwgLTMwMywgLTMwNCwgLTMwNSwgLTMwNiwgLTMwNywgLTMwOCwKKyAgICAtMzA5LCAtMzEwLCAtMzExLCAtMzEyLCAtMzEzLCAtMzE0LCAtMzE1LCAtMzE2LAorICAgIC0zMTcsIC0zMTgsIC0zMTksIC0zMjAsIC0zMjEsIC0zMjIsIC0zMjMsIC0zMjQsCisgICAgLTMyNSwgLTMyNiwgLTMyNywgLTMyOCwgLTMyOSwgLTMzMCwgLTMzMSwgLTMzMiwKKyAgICAtMzMzLCAtMzM0LCAtMzM1LCAtMzM2LCAtMzM3LCAtMzM4LCAtMzM5LCAtMzQwLAorICAgIC0zNDEsIC0zNDIsIC0zNDMsIC0zNDQsIC0zNDUsIC0zNDYsIC0zNDcsIC0zNDgsCisgICAgLTM0OSwgLTM1MCwgLTM1MSwgLTM1MiwgLTM1MywgLTM1NCwgLTM1NSwgLTM1NiwKKyAgICAtMzU3LCAtMzU4LCAtMzU5LCAtMzYwLCAtMzYxLCAtMzYyLCAtMzYzLCAtMzY0LAorICAgIC0zNjUsIC0zNjYsIC0zNjcsIC0zNjgsIC0zNjksIC0zNzAsIC0zNzEsIC0zNzIsCisgICAgLTM3MywgLTM3NCwgLTM3NSwgLTM3NiwgLTM3NywgLTM3OCwgLTM3OSwgLTM4MCwKKyAgICAtMzgxLCAtMzgyLCAtMzgzLCAtMzg0LCAtMzg1LCAtMzg2LCAtMzg3LCAtMzg4LAorICAgIC0zODksIC0zOTAsIC0zOTEsIC0zOTIsIC0zOTMsIC0zOTQsIC0zOTUsIC0zOTYsCisgICAgLTM5NywgLTM5OCwgLTM5OSwgLTQwMCwgLTQwMSwgLTQwMiwgLTQwMywgLTQwNCwKKyAgICAtNDA1LCAtNDA2LCAtNDA3LCAtNDA4LCAtNDA5LCAtNDEwLCAtNDExLCAtNDEyLAorICAgIC00MTMsIC00MTQsIC00MTUsIC00MTYsIC00MTcsIC00MTgsIC00MTksIC00MjAsCisgICAgLTQyMSwgLTQyMiwgLTQyMywgLTQyNCwgLTQyNSwgLTQyNiwgLTQyNywgLTQyOCwKKyAgICAtNDI5LCAtNDMwLCAtNDMxLCAtNDMyLCAtNDMzLCAtNDM0LCAtNDM1LCAtNDM2LAorICAgIC00MzcsIC00MzgsIC00MzksIC00NDAsIC00NDEsIC00NDIsIC00NDMsIC00NDQsCisgICAgLTQ0NSwgLTQ0NiwgLTQ0NywgLTQ0OCwgLTQ0OSwgLTQ1MCwgLTQ1MSwgLTQ1MiwKKyAgICAtNDUzLCAtNDU0LCAtNDU1LCAtNDU2LCAtNDU3LCAtNDU4LCAtNDU5LCAtNDYwLAorICAgIC00NjEsIC00NjIsIC00NjMsIC00NjQsIC00NjUsIC00NjYsIC00NjcsIC00NjgsCisgICAgLTQ2OSwgLTQ3MCwgLTQ3MSwgLTQ3MiwgLTQ3MywgLTQ3NCwgLTQ3NSwgLTQ3NiwKKyAgICAtNDc3LCAtNDc4LCAtNDc5LCAtNDgwLCAtNDgxLCAtNDgyLCAtNDgzLCAtNDg0LAorICAgIC00ODUsIC00ODYsIC00ODcsIC00ODgsIC00ODksIC00OTAsIC00OTEsIC00OTIsCisgICAgLTQ5MywgLTQ5NCwgLTQ5NSwgLTQ5NiwgLTQ5NywgLTQ5OCwgLTQ5OSwgLTUwMCwKKyAgICAtNTAxLCAtNTAyLCAtNTAzLCAtNTA0LCAtNTA1LCAtNTA2LCAtNTA3LCAtNTA4LAorICAgIC01MDksIC01MTAsIC01MTEsIC01MTIsIC01MTMsIC01MTQsIC01MTUsIC01MTYsCisgICAgLTUxNywgLTUxOCwgLTUxOSwgLTUyMCwgLTUyMSwgLTUyMiwgLTUyMywgLTUyNCwKKyAgICAtNTI1LCAtNTI2LCAtNTI3LCAtNTI4LCAtNTI5LCAtNTMwLCAtNTMxLCAtNTMyLAorICAgIC01MzMsIC01MzQsIC01MzUsIC01MzYsIC01MzcsIC01MzgsIC01MzksIC01NDAsCisgICAgLTU0MSwgLTU0MiwgLTU0MywgLTU0NCwgLTU0NSwgLTU0NiwgLTU0NywgLTU0OCwKKyAgICAtNTQ5LCAtNTUwLCAtNTUxLCAtNTUyLCAtNTUzLCAtNTU0LCAtNTU1LCAtNTU2LAorICAgIC01NTcsIC01NTgsIC01NTksIC01NjAsIC01NjEsIC01NjIsIC01NjMsIC01NjQsCisgICAgLTU2NSwgLTU2NiwgLTU2NywgLTU2OCwgLTU2OSwgLTU3MCwgLTU3MSwgLTU3MiwKKyAgICAtNTczLCAtNTc0LCAtNTc1LCAtNTc2LCAtNTc3LCAtNTc4LCAtNTc5LCAtNTgwCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCAqY29uc3QgY29lZmZfdGFibGVzWzMyXSA9IHsKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIGNvZWZmX3RhYmxlX3Rva2VuXzdfOCwKKworICAgIGNvZWZmX3RhYmxlX3Rva2VuXzdfOCwKKyAgICBjb2VmZl90YWJsZV90b2tlbl85LAorICAgIGNvZWZmX3RhYmxlX3Rva2VuXzEwLAorICAgIGNvZWZmX3RhYmxlX3Rva2VuXzExLAorICAgIGNvZWZmX3RhYmxlX3Rva2VuXzEyLAorICAgIGNvZWZmX3RhYmxlX3Rva2VuXzEzLAorICAgIGNvZWZmX3RhYmxlX3Rva2VuXzE0LAorICAgIGNvZWZmX3RhYmxlX3Rva2VuXzE1LAorCisgICAgY29lZmZfdGFibGVfdG9rZW5fMTYsCisgICAgY29lZmZfdGFibGVfdG9rZW5fMTcsCisgICAgY29lZmZfdGFibGVfdG9rZW5fMTgsCisgICAgY29lZmZfdGFibGVfdG9rZW5fMTksCisgICAgY29lZmZfdGFibGVfdG9rZW5fMjAsCisgICAgY29lZmZfdGFibGVfdG9rZW5fMjEsCisgICAgY29lZmZfdGFibGVfdG9rZW5fMjIsCisgICAgY29lZmZfdGFibGVfdG9rZW5fMjNfMjRfMjVfMjZfMjdfMjhfMjksCisKKyAgICBjb2VmZl90YWJsZV90b2tlbl8yM18yNF8yNV8yNl8yN18yOF8yOSwKKyAgICBjb2VmZl90YWJsZV90b2tlbl8yM18yNF8yNV8yNl8yN18yOF8yOSwKKyAgICBjb2VmZl90YWJsZV90b2tlbl8yM18yNF8yNV8yNl8yN18yOF8yOSwKKyAgICBjb2VmZl90YWJsZV90b2tlbl8yM18yNF8yNV8yNl8yN18yOF8yOSwKKyAgICBjb2VmZl90YWJsZV90b2tlbl8yM18yNF8yNV8yNl8yN18yOF8yOSwKKyAgICBjb2VmZl90YWJsZV90b2tlbl8yM18yNF8yNV8yNl8yN18yOF8yOSwKKyAgICBjb2VmZl90YWJsZV90b2tlbl8zMCwKKyAgICBjb2VmZl90YWJsZV90b2tlbl8zMQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGRjX2JpYXNbMTZdWzMyXVsyXSA9IHsKKyAgICB7IC8qIERDIGJpYXMgdGFibGUgMCAqLworICAgICAgICB7ICAgMHgyRCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MjYsICA3IH0sCisgICAgICAgIHsgIDB4MTY2LCAgOSB9LAorICAgICAgICB7ICAgMHg0RSwgIDggfSwKKyAgICAgICAgeyAgMHgyQ0UsIDEwIH0sCisgICAgICAgIHsgIDB4NTlFLCAxMSB9LAorICAgICAgICB7ICAweDI3RCwgMTEgfSwKKyAgICAgICAgeyAgICAweDgsICA1IH0sCisgICAgICAgIHsgIDB4NEY5LCAxMiB9LAorICAgICAgICB7ICAgIDB4RiwgIDQgfSwKKyAgICAgICAgeyAgICAweEUsICA0IH0sCisgICAgICAgIHsgICAweDFCLCAgNSB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAgMHg1LCAgNCB9LAorICAgICAgICB7ICAgMHgxQSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTUsICA1IH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4OSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTcsICA1IH0sCisgICAgICAgIHsgICAweDI5LCAgNiB9LAorICAgICAgICB7ICAgMHgyOCwgIDYgfSwKKyAgICAgICAgeyAgIDB4QjIsICA4IH0sCisgICAgICAgIHsgIDB4NEY4LCAxMiB9LAorICAgICAgICB7ICAweDU5RiwgMTEgfSwKKyAgICAgICAgeyAgIDB4OUUsICA5IH0sCisgICAgICAgIHsgIDB4MTNGLCAxMCB9LAorICAgICAgICB7ICAgMHgxMiwgIDYgfSwKKyAgICAgICAgeyAgIDB4NTgsICA3IH0KKyAgICB9LAorICAgIHsgLyogREMgYmlhcyB0YWJsZSAxICovCisgICAgICAgIHsgICAweDEwLCAgNSB9LAorICAgICAgICB7ICAgMHg0NywgIDcgfSwKKyAgICAgICAgeyAgMHgxRkYsICA5IH0sCisgICAgICAgIHsgICAweDhDLCAgOCB9LAorICAgICAgICB7ICAweDNGQywgMTAgfSwKKyAgICAgICAgeyAgMHg0NkEsIDExIH0sCisgICAgICAgIHsgIDB4NDY5LCAxMSB9LAorICAgICAgICB7ICAgMHgyMiwgIDYgfSwKKyAgICAgICAgeyAweDExQTEsIDEzIH0sCisgICAgICAgIHsgICAgMHhFLCAgNCB9LAorICAgICAgICB7ICAgIDB4RCwgIDQgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgICAgMHg1LCAgNCB9LAorICAgICAgICB7ICAgIDB4OSwgIDQgfSwKKyAgICAgICAgeyAgICAweDYsICA0IH0sCisgICAgICAgIHsgICAweDFFLCAgNSB9LAorICAgICAgICB7ICAgMHgxNiwgIDUgfSwKKyAgICAgICAgeyAgICAweDcsICA0IH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAgIDB4MSwgIDMgfSwKKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgMHgxNywgIDUgfSwKKyAgICAgICAgeyAgIDB4N0QsICA3IH0sCisgICAgICAgIHsgICAweDdFLCAgNyB9LAorICAgICAgICB7ICAweDExQiwgIDkgfSwKKyAgICAgICAgeyAgMHg4RDEsIDEyIH0sCisgICAgICAgIHsgIDB4M0ZELCAxMCB9LAorICAgICAgICB7ICAweDQ2QiwgMTEgfSwKKyAgICAgICAgeyAweDExQTAsIDEzIH0sCisgICAgICAgIHsgICAweDdDLCAgNyB9LAorICAgICAgICB7ICAgMHhGRSwgIDggfQorICAgIH0sCisgICAgeyAvKiBEQyBiaWFzIHRhYmxlIDIgKi8KKyAgICAgICAgeyAgIDB4MTYsICA1IH0sCisgICAgICAgIHsgICAweDIwLCAgNiB9LAorICAgICAgICB7ICAgMHg4NiwgIDggfSwKKyAgICAgICAgeyAgIDB4ODcsICA4IH0sCisgICAgICAgIHsgIDB4MzY3LCAxMCB9LAorICAgICAgICB7ICAweDZDQywgMTEgfSwKKyAgICAgICAgeyAgMHg2Q0IsIDExIH0sCisgICAgICAgIHsgICAweDZFLCAgNyB9LAorICAgICAgICB7IDB4MzY2RCwgMTQgfSwKKyAgICAgICAgeyAgICAweEYsICA0IH0sCisgICAgICAgIHsgICAgMHhFLCAgNCB9LAorICAgICAgICB7ICAgIDB4NCwgIDQgfSwKKyAgICAgICAgeyAgICAweDUsICA0IH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUEsICA1IH0sCisgICAgICAgIHsgICAweDExLCAgNSB9LAorICAgICAgICB7ICAgIDB4NywgIDQgfSwKKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAgMHgxLCAgMyB9LAorICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgICAweDksICA0IH0sCisgICAgICAgIHsgICAweDE3LCAgNSB9LAorICAgICAgICB7ICAgMHg2RiwgIDcgfSwKKyAgICAgICAgeyAgIDB4NkQsICA3IH0sCisgICAgICAgIHsgIDB4MzY0LCAxMCB9LAorICAgICAgICB7ICAweEQ5QSwgMTIgfSwKKyAgICAgICAgeyAgMHg2Q0EsIDExIH0sCisgICAgICAgIHsgMHgxQjM3LCAxMyB9LAorICAgICAgICB7IDB4MzY2QywgMTQgfSwKKyAgICAgICAgeyAgIDB4NDIsICA3IH0sCisgICAgICAgIHsgICAweEQ4LCAgOCB9CisgICAgfSwKKyAgICB7IC8qIERDIGJpYXMgdGFibGUgMyAqLworICAgICAgICB7ICAgIDB4MCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MkQsICA2IH0sCisgICAgICAgIHsgICAweEY3LCAgOCB9LAorICAgICAgICB7ICAgMHg1OCwgIDcgfSwKKyAgICAgICAgeyAgMHgxNjcsICA5IH0sCisgICAgICAgIHsgIDB4MkNCLCAxMCB9LAorICAgICAgICB7ICAweDJDQSwgMTAgfSwKKyAgICAgICAgeyAgICAweEUsICA2IH0sCisgICAgICAgIHsgMHgxNjYxLCAxMyB9LAorICAgICAgICB7ICAgIDB4MywgIDMgfSwKKyAgICAgICAgeyAgICAweDIsICAzIH0sCisgICAgICAgIHsgICAgMHg4LCAgNCB9LAorICAgICAgICB7ICAgIDB4OSwgIDQgfSwKKyAgICAgICAgeyAgICAweEQsICA0IH0sCisgICAgICAgIHsgICAgMHgyLCAgNCB9LAorICAgICAgICB7ICAgMHgxRiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTcsICA1IH0sCisgICAgICAgIHsgICAgMHgxLCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweEUsICA0IH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgIDB4NiwgIDUgfSwKKyAgICAgICAgeyAgIDB4NzgsICA3IH0sCisgICAgICAgIHsgICAgMHhGLCAgNiB9LAorICAgICAgICB7ICAgMHg3QSwgIDcgfSwKKyAgICAgICAgeyAgMHgxNjQsICA5IH0sCisgICAgICAgIHsgIDB4NTk5LCAxMSB9LAorICAgICAgICB7ICAweDJDRCwgMTAgfSwKKyAgICAgICAgeyAgMHhCMzEsIDEyIH0sCisgICAgICAgIHsgMHgxNjYwLCAxMyB9LAorICAgICAgICB7ICAgMHg3OSwgIDcgfSwKKyAgICAgICAgeyAgIDB4RjYsICA4IH0KKyAgICB9LAorICAgIHsgLyogREMgYmlhcyB0YWJsZSA0ICovCisgICAgICAgIHsgICAgMHgzLCAgNCB9LAorICAgICAgICB7ICAgMHgzQywgIDYgfSwKKyAgICAgICAgeyAgICAweEYsICA3IH0sCisgICAgICAgIHsgICAweDdBLCAgNyB9LAorICAgICAgICB7ICAgMHgxRCwgIDggfSwKKyAgICAgICAgeyAgIDB4MjAsICA5IH0sCisgICAgICAgIHsgICAweDcyLCAxMCB9LAorICAgICAgICB7ICAgIDB4NiwgIDYgfSwKKyAgICAgICAgeyAgMHgzOTksIDEzIH0sCisgICAgICAgIHsgICAgMHg0LCAgMyB9LAorICAgICAgICB7ICAgIDB4NSwgIDMgfSwKKyAgICAgICAgeyAgICAweDUsICA0IH0sCisgICAgICAgIHsgICAgMHg2LCAgNCB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgICAgMHgwLCAgNCB9LAorICAgICAgICB7ICAgMHgxOSwgIDUgfSwKKyAgICAgICAgeyAgICAweDIsICA0IH0sCisgICAgICAgIHsgICAgMHhELCAgNCB9LAorICAgICAgICB7ICAgIDB4NywgIDQgfSwKKyAgICAgICAgeyAgIDB4MUYsICA1IH0sCisgICAgICAgIHsgICAweDMwLCAgNiB9LAorICAgICAgICB7ICAgMHgxMSwgIDggfSwKKyAgICAgICAgeyAgIDB4MzEsICA2IH0sCisgICAgICAgIHsgICAgMHg1LCAgNiB9LAorICAgICAgICB7ICAgMHgyMSwgIDkgfSwKKyAgICAgICAgeyAgIDB4RTcsIDExIH0sCisgICAgICAgIHsgICAweDM4LCAgOSB9LAorICAgICAgICB7ICAweDFDRCwgMTIgfSwKKyAgICAgICAgeyAgMHgzOTgsIDEzIH0sCisgICAgICAgIHsgICAweDdCLCAgNyB9LAorICAgICAgICB7ICAgIDB4OSwgIDcgfQorICAgIH0sCisgICAgeyAvKiBEQyBiaWFzIHRhYmxlIDUgKi8KKyAgICAgICAgeyAgICAweDksICA0IH0sCisgICAgICAgIHsgICAgMHgyLCAgNSB9LAorICAgICAgICB7ICAgMHg3NCwgIDcgfSwKKyAgICAgICAgeyAgICAweDcsICA2IH0sCisgICAgICAgIHsgICAweEVDLCAgOCB9LAorICAgICAgICB7ICAgMHhEMSwgIDkgfSwKKyAgICAgICAgeyAgMHgxQTYsIDEwIH0sCisgICAgICAgIHsgICAgMHg2LCAgNiB9LAorICAgICAgICB7ICAweEQyMSwgMTMgfSwKKyAgICAgICAgeyAgICAweDUsICAzIH0sCisgICAgICAgIHsgICAgMHg2LCAgMyB9LAorICAgICAgICB7ICAgIDB4OCwgIDQgfSwKKyAgICAgICAgeyAgICAweDcsICA0IH0sCisgICAgICAgIHsgICAgMHhGLCAgNCB9LAorICAgICAgICB7ICAgIDB4NCwgIDQgfSwKKyAgICAgICAgeyAgICAweDAsICA0IH0sCisgICAgICAgIHsgICAweDFDLCAgNSB9LAorICAgICAgICB7ICAgIDB4MiwgIDQgfSwKKyAgICAgICAgeyAgICAweDUsICA0IH0sCisgICAgICAgIHsgICAgMHgzLCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDUgfSwKKyAgICAgICAgeyAgIDB4MzUsICA3IH0sCisgICAgICAgIHsgIDB4MUE3LCAxMCB9LAorICAgICAgICB7ICAgMHgxQiwgIDYgfSwKKyAgICAgICAgeyAgIDB4NzcsICA3IH0sCisgICAgICAgIHsgIDB4MUE1LCAxMCB9LAorICAgICAgICB7ICAweDM0OSwgMTEgfSwKKyAgICAgICAgeyAgIDB4RDAsICA5IH0sCisgICAgICAgIHsgIDB4NjkxLCAxMiB9LAorICAgICAgICB7ICAweEQyMCwgMTMgfSwKKyAgICAgICAgeyAgIDB4NzUsICA3IH0sCisgICAgICAgIHsgICAweEVELCAgOCB9CisgICAgfSwKKyAgICB7IC8qIERDIGJpYXMgdGFibGUgNiAqLworICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgICAweEMsICA1IH0sCisgICAgICAgIHsgICAweDEyLCAgNiB9LAorICAgICAgICB7ICAgMHgxQiwgIDYgfSwKKyAgICAgICAgeyAgIDB4QjcsICA4IH0sCisgICAgICAgIHsgIDB4MTZDLCAgOSB9LAorICAgICAgICB7ICAgMHg5OSwgIDkgfSwKKyAgICAgICAgeyAgIDB4NUEsICA3IH0sCisgICAgICAgIHsgMHgxNkQ4LCAxMyB9LAorICAgICAgICB7ICAgIDB4NywgIDMgfSwKKyAgICAgICAgeyAgICAweDYsICAzIH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4OCwgIDQgfSwKKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAgMHg1LCAgNCB9LAorICAgICAgICB7ICAgMHgxNywgIDUgfSwKKyAgICAgICAgeyAgICAweEUsICA1IH0sCisgICAgICAgIHsgICAgMHgyLCAgNCB9LAorICAgICAgICB7ICAgIDB4MywgIDQgfSwKKyAgICAgICAgeyAgICAweEYsICA1IH0sCisgICAgICAgIHsgICAweDFBLCAgNiB9LAorICAgICAgICB7ICAgMHg0RCwgIDggfSwKKyAgICAgICAgeyAweDJEQjMsIDE0IH0sCisgICAgICAgIHsgICAweDJDLCAgNiB9LAorICAgICAgICB7ICAgMHgxMSwgIDYgfSwKKyAgICAgICAgeyAgMHgyREEsIDEwIH0sCisgICAgICAgIHsgIDB4NUI3LCAxMSB9LAorICAgICAgICB7ICAgMHg5OCwgIDkgfSwKKyAgICAgICAgeyAgMHhCNkQsIDEyIH0sCisgICAgICAgIHsgMHgyREIyLCAxNCB9LAorICAgICAgICB7ICAgMHgxMCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MjcsICA3IH0KKyAgICB9LAorICAgIHsgLyogREMgYmlhcyB0YWJsZSA3ICovCisgICAgICAgIHsgICAgMHhELCAgNCB9LAorICAgICAgICB7ICAgIDB4RiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUQsICA2IH0sCisgICAgICAgIHsgICAgMHg4LCAgNSB9LAorICAgICAgICB7ICAgMHg1MSwgIDcgfSwKKyAgICAgICAgeyAgIDB4NTYsICA4IH0sCisgICAgICAgIHsgICAweEFGLCAgOSB9LAorICAgICAgICB7ICAgMHgyQSwgIDcgfSwKKyAgICAgICAgeyAweDE0OEEsIDEzIH0sCisgICAgICAgIHsgICAgMHg3LCAgMyB9LAorICAgICAgICB7ICAgIDB4MCwgIDIgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweDYsICA0IH0sCisgICAgICAgIHsgICAweDE3LCAgNSB9LAorICAgICAgICB7ICAgIDB4QiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTYsICA1IH0sCisgICAgICAgIHsgICAweDE1LCAgNSB9LAorICAgICAgICB7ICAgIDB4OSwgIDUgfSwKKyAgICAgICAgeyAgIDB4NTAsICA3IH0sCisgICAgICAgIHsgICAweEFFLCAgOSB9LAorICAgICAgICB7IDB4MjkxNywgMTQgfSwKKyAgICAgICAgeyAgIDB4MUMsICA2IH0sCisgICAgICAgIHsgICAweDE0LCAgNiB9LAorICAgICAgICB7ICAweDI5MCwgMTAgfSwKKyAgICAgICAgeyAgMHg1MjMsIDExIH0sCisgICAgICAgIHsgIDB4MTQ5LCAgOSB9LAorICAgICAgICB7ICAweEE0NCwgMTIgfSwKKyAgICAgICAgeyAweDI5MTYsIDE0IH0sCisgICAgICAgIHsgICAweDUzLCAgNyB9LAorICAgICAgICB7ICAgMHhBNSwgIDggfQorICAgIH0sCisgICAgeyAvKiBEQyBiaWFzIHRhYmxlIDggKi8KKyAgICAgICAgeyAgICAweDEsICA0IH0sCisgICAgICAgIHsgICAweDFELCAgNiB9LAorICAgICAgICB7ICAgMHhGNSwgIDggfSwKKyAgICAgICAgeyAgIDB4RjQsICA4IH0sCisgICAgICAgIHsgIDB4MjRELCAxMCB9LAorICAgICAgICB7ICAweDQ5OSwgMTEgfSwKKyAgICAgICAgeyAgMHg0OTgsIDExIH0sCisgICAgICAgIHsgICAgMHgxLCAgNSB9LAorICAgICAgICB7ICAgMHgyMSwgIDYgfSwKKyAgICAgICAgeyAgICAweDYsICAzIH0sCisgICAgICAgIHsgICAgMHg1LCAgMyB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgICAweDUsICA0IH0sCisgICAgICAgIHsgICAgMHgyLCAgNCB9LAorICAgICAgICB7ICAgIDB4NywgIDUgfSwKKyAgICAgICAgeyAgIDB4MjUsICA2IH0sCisgICAgICAgIHsgICAweDdCLCAgNyB9LAorICAgICAgICB7ICAgMHgxQywgIDYgfSwKKyAgICAgICAgeyAgIDB4MjAsICA2IH0sCisgICAgICAgIHsgICAgMHhELCAgNiB9LAorICAgICAgICB7ICAgMHg0OCwgIDcgfSwKKyAgICAgICAgeyAgIDB4OTIsICA4IH0sCisgICAgICAgIHsgIDB4MTI3LCAgOSB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgICAweDExLCAgNSB9LAorICAgICAgICB7ICAgIDB4QywgIDYgfSwKKyAgICAgICAgeyAgIDB4M0MsICA2IH0sCisgICAgICAgIHsgICAgMHhGLCAgNSB9LAorICAgICAgICB7ICAgIDB4MCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUYsICA1IH0sCisgICAgICAgIHsgICAweDEzLCAgNSB9CisgICAgfSwKKyAgICB7IC8qIERDIGJpYXMgdGFibGUgOSAqLworICAgICAgICB7ICAgIDB4NSwgIDQgfSwKKyAgICAgICAgeyAgIDB4M0MsICA2IH0sCisgICAgICAgIHsgICAweDQwLCAgNyB9LAorICAgICAgICB7ICAgIDB4RCwgIDcgfSwKKyAgICAgICAgeyAgIDB4MzEsICA5IH0sCisgICAgICAgIHsgICAweDYxLCAxMCB9LAorICAgICAgICB7ICAgMHg2MCwgMTAgfSwKKyAgICAgICAgeyAgICAweDIsICA1IH0sCisgICAgICAgIHsgICAweEY1LCAgOCB9LAorICAgICAgICB7ICAgIDB4NiwgIDMgfSwKKyAgICAgICAgeyAgICAweDUsICAzIH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgICAweDIsICA0IH0sCisgICAgICAgIHsgICAgMHg5LCAgNSB9LAorICAgICAgICB7ICAgMHgyNSwgIDYgfSwKKyAgICAgICAgeyAgICAweDcsICA2IH0sCisgICAgICAgIHsgICAweDIxLCAgNiB9LAorICAgICAgICB7ICAgMHgyNCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MTAsICA2IH0sCisgICAgICAgIHsgICAweDQxLCAgNyB9LAorICAgICAgICB7ICAgMHhGNCwgIDggfSwKKyAgICAgICAgeyAgIDB4MTksICA4IH0sCisgICAgICAgIHsgICAgMHhFLCAgNCB9LAorICAgICAgICB7ICAgIDB4MywgIDQgfSwKKyAgICAgICAgeyAgIDB4MTEsICA1IH0sCisgICAgICAgIHsgICAweDExLCAgNiB9LAorICAgICAgICB7ICAgMHgzRiwgIDYgfSwKKyAgICAgICAgeyAgIDB4M0UsICA2IH0sCisgICAgICAgIHsgICAweDdCLCAgNyB9LAorICAgICAgICB7ICAgIDB4MCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTMsICA1IH0KKyAgICB9LAorICAgIHsgLyogREMgYmlhcyB0YWJsZSAxMCAqLworICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgICAweDcsICA1IH0sCisgICAgICAgIHsgICAgMHgxLCAgNiB9LAorICAgICAgICB7ICAgIDB4OSwgIDYgfSwKKyAgICAgICAgeyAgMHgxMzEsICA5IH0sCisgICAgICAgIHsgIDB4MjYxLCAxMCB9LAorICAgICAgICB7ICAweDI2MCwgMTAgfSwKKyAgICAgICAgeyAgIDB4MTUsICA2IH0sCisgICAgICAgIHsgICAgMHgxLCAgNyB9LAorICAgICAgICB7ICAgIDB4NywgIDMgfSwKKyAgICAgICAgeyAgICAweDYsICAzIH0sCisgICAgICAgIHsgICAgMHg4LCAgNCB9LAorICAgICAgICB7ICAgIDB4NywgIDQgfSwKKyAgICAgICAgeyAgICAweDYsICA0IH0sCisgICAgICAgIHsgICAweDEyLCAgNSB9LAorICAgICAgICB7ICAgMHgyRiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MTQsICA2IH0sCisgICAgICAgIHsgICAweDI3LCAgNiB9LAorICAgICAgICB7ICAgMHgyRCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MTYsICA2IH0sCisgICAgICAgIHsgICAweDRELCAgNyB9LAorICAgICAgICB7ICAgMHg5OSwgIDggfSwKKyAgICAgICAgeyAgICAweDAsICA3IH0sCisgICAgICAgIHsgICAgMHg0LCAgNCB9LAorICAgICAgICB7ICAgIDB4MSwgIDQgfSwKKyAgICAgICAgeyAgICAweDUsICA1IH0sCisgICAgICAgIHsgICAweDE3LCAgNiB9LAorICAgICAgICB7ICAgMHgyRSwgIDYgfSwKKyAgICAgICAgeyAgIDB4MkMsICA2IH0sCisgICAgICAgIHsgICAgMHg4LCAgNiB9LAorICAgICAgICB7ICAgIDB4NiwgIDUgfSwKKyAgICAgICAgeyAgICAweDEsICA1IH0KKyAgICB9LAorICAgIHsgLyogREMgYmlhcyB0YWJsZSAxMSAqLworICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgICAweEUsICA1IH0sCisgICAgICAgIHsgICAweDE3LCAgNiB9LAorICAgICAgICB7ICAgMHgyQSwgIDYgfSwKKyAgICAgICAgeyAgIDB4MTAsICA3IH0sCisgICAgICAgIHsgICAweEY5LCAxMCB9LAorICAgICAgICB7ICAgMHhGOCwgMTAgfSwKKyAgICAgICAgeyAgIDB4MUUsICA3IH0sCisgICAgICAgIHsgICAweDNGLCAgOCB9LAorICAgICAgICB7ICAgIDB4NywgIDMgfSwKKyAgICAgICAgeyAgICAweDYsICAzIH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4OCwgIDQgfSwKKyAgICAgICAgeyAgICAweDYsICA0IH0sCisgICAgICAgIHsgICAgMHhGLCAgNSB9LAorICAgICAgICB7ICAgIDB4NSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTYsICA2IH0sCisgICAgICAgIHsgICAweDI5LCAgNiB9LAorICAgICAgICB7ICAgMHgyQiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MTUsICA2IH0sCisgICAgICAgIHsgICAweDUwLCAgNyB9LAorICAgICAgICB7ICAgMHgxMSwgIDcgfSwKKyAgICAgICAgeyAgIDB4N0QsICA5IH0sCisgICAgICAgIHsgICAgMHg0LCAgNCB9LAorICAgICAgICB7ICAgMHgxNywgIDUgfSwKKyAgICAgICAgeyAgICAweDYsICA1IH0sCisgICAgICAgIHsgICAweDE0LCAgNiB9LAorICAgICAgICB7ICAgMHgyQywgIDYgfSwKKyAgICAgICAgeyAgIDB4MkQsICA2IH0sCisgICAgICAgIHsgICAgMHhFLCAgNiB9LAorICAgICAgICB7ICAgIDB4OSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NTEsICA3IH0KKyAgICB9LAorICAgIHsgLyogREMgYmlhcyB0YWJsZSAxMiAqLworICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgIDB4MTgsICA1IH0sCisgICAgICAgIHsgICAweDJGLCAgNiB9LAorICAgICAgICB7ICAgIDB4RCwgIDUgfSwKKyAgICAgICAgeyAgIDB4NTMsICA3IH0sCisgICAgICAgIHsgIDB4Mjk1LCAxMCB9LAorICAgICAgICB7ICAweDI5NCwgMTAgfSwKKyAgICAgICAgeyAgIDB4QTQsICA4IH0sCisgICAgICAgIHsgICAweDdDLCAgOCB9LAorICAgICAgICB7ICAgIDB4MCwgIDIgfSwKKyAgICAgICAgeyAgICAweDcsICAzIH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4OCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUIsICA1IH0sCisgICAgICAgIHsgICAgMHhDLCAgNSB9LAorICAgICAgICB7ICAgMHgyOCwgIDYgfSwKKyAgICAgICAgeyAgIDB4NkEsICA3IH0sCisgICAgICAgIHsgICAweDFFLCAgNiB9LAorICAgICAgICB7ICAgMHgxRCwgIDYgfSwKKyAgICAgICAgeyAgIDB4NjksICA3IH0sCisgICAgICAgIHsgICAweEQ3LCAgOCB9LAorICAgICAgICB7ICAgMHg3RCwgIDggfSwKKyAgICAgICAgeyAgMHgxNEIsICA5IH0sCisgICAgICAgIHsgICAweDE5LCAgNSB9LAorICAgICAgICB7ICAgMHgxNiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MkUsICA2IH0sCisgICAgICAgIHsgICAweDFDLCAgNiB9LAorICAgICAgICB7ICAgMHgyQiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MkEsICA2IH0sCisgICAgICAgIHsgICAweDY4LCAgNyB9LAorICAgICAgICB7ICAgMHgzRiwgIDcgfSwKKyAgICAgICAgeyAgIDB4RDYsICA4IH0KKyAgICB9LAorICAgIHsgLyogREMgYmlhcyB0YWJsZSAxMyAqLworICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgIDB4MUIsICA1IH0sCisgICAgICAgIHsgICAgMHhDLCAgNSB9LAorICAgICAgICB7ICAgMHgxOCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MjksICA2IH0sCisgICAgICAgIHsgICAweDdGLCAgOCB9LAorICAgICAgICB7ICAweDJGMCwgMTAgfSwKKyAgICAgICAgeyAgMHgxOTgsICA5IH0sCisgICAgICAgIHsgIDB4MTc5LCAgOSB9LAorICAgICAgICB7ICAgIDB4MCwgIDIgfSwKKyAgICAgICAgeyAgICAweDcsICAzIH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4OCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUEsICA1IH0sCisgICAgICAgIHsgICAgMHhELCAgNSB9LAorICAgICAgICB7ICAgMHgyQSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NjQsICA3IH0sCisgICAgICAgIHsgICAweDFFLCAgNiB9LAorICAgICAgICB7ICAgMHg2NywgIDcgfSwKKyAgICAgICAgeyAgIDB4NUYsICA3IH0sCisgICAgICAgIHsgICAweENELCAgOCB9LAorICAgICAgICB7ICAgMHg3RSwgIDggfSwKKyAgICAgICAgeyAgMHgyRjEsIDEwIH0sCisgICAgICAgIHsgICAweDE2LCAgNSB9LAorICAgICAgICB7ICAgIDB4RSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MkUsICA2IH0sCisgICAgICAgIHsgICAweDY1LCAgNyB9LAorICAgICAgICB7ICAgMHgyQiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MjgsICA2IH0sCisgICAgICAgIHsgICAweDNFLCAgNyB9LAorICAgICAgICB7ICAgMHhCRCwgIDggfSwKKyAgICAgICAgeyAgMHgxOTksICA5IH0KKyAgICB9LAorICAgIHsgLyogREMgYmlhcyB0YWJsZSAxNCAqLworICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgICAweDcsICA0IH0sCisgICAgICAgIHsgICAweDE2LCAgNSB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgIDB4MzYsICA2IH0sCisgICAgICAgIHsgICAweDVDLCAgNyB9LAorICAgICAgICB7ICAweDE1RCwgIDkgfSwKKyAgICAgICAgeyAgMHgxNUMsICA5IH0sCisgICAgICAgIHsgIDB4MkJGLCAxMCB9LAorICAgICAgICB7ICAgIDB4MCwgIDIgfSwKKyAgICAgICAgeyAgICAweDcsICAzIH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4OCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTgsICA1IH0sCisgICAgICAgIHsgICAweDM0LCAgNiB9LAorICAgICAgICB7ICAgMHgyQSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NUUsICA3IH0sCisgICAgICAgIHsgICAweDZBLCAgNyB9LAorICAgICAgICB7ICAgMHg2NCwgIDcgfSwKKyAgICAgICAgeyAgIDB4NUQsICA3IH0sCisgICAgICAgIHsgICAweENCLCAgOCB9LAorICAgICAgICB7ICAgMHhBRCwgIDggfSwKKyAgICAgICAgeyAgMHgyQkUsIDEwIH0sCisgICAgICAgIHsgICAweDE0LCAgNSB9LAorICAgICAgICB7ICAgMHgzMywgIDYgfSwKKyAgICAgICAgeyAgIDB4NkUsICA3IH0sCisgICAgICAgIHsgICAweDVGLCAgNyB9LAorICAgICAgICB7ICAgMHg2RiwgIDcgfSwKKyAgICAgICAgeyAgIDB4NkIsICA3IH0sCisgICAgICAgIHsgICAweENBLCAgOCB9LAorICAgICAgICB7ICAgMHhBQywgIDggfSwKKyAgICAgICAgeyAgMHgxNUUsICA5IH0KKyAgICB9LAorICAgIHsgLyogREMgYmlhcyB0YWJsZSAxNSAqLworICAgICAgICB7ICAgIDB4RiwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUQsICA1IH0sCisgICAgICAgIHsgICAweDE4LCAgNSB9LAorICAgICAgICB7ICAgIDB4QiwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTksICA1IH0sCisgICAgICAgIHsgICAweDI5LCAgNiB9LAorICAgICAgICB7ICAgMHhENiwgIDggfSwKKyAgICAgICAgeyAgMHg1NTEsIDExIH0sCisgICAgICAgIHsgIDB4QUExLCAxMiB9LAorICAgICAgICB7ICAgIDB4MSwgIDIgfSwKKyAgICAgICAgeyAgICAweDAsICAyIH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4OCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUIsICA1IH0sCisgICAgICAgIHsgICAweDM4LCAgNiB9LAorICAgICAgICB7ICAgMHgyOCwgIDYgfSwKKyAgICAgICAgeyAgIDB4NTcsICA3IH0sCisgICAgICAgIHsgICAweDZBLCAgNyB9LAorICAgICAgICB7ICAgMHg2OCwgIDcgfSwKKyAgICAgICAgeyAgIDB4NTYsICA3IH0sCisgICAgICAgIHsgICAweEU1LCAgOCB9LAorICAgICAgICB7ICAweDE1NSwgIDkgfSwKKyAgICAgICAgeyAgMHhBQTAsIDEyIH0sCisgICAgICAgIHsgICAweDczLCAgNyB9LAorICAgICAgICB7ICAgMHg2OSwgIDcgfSwKKyAgICAgICAgeyAgIDB4RDcsICA4IH0sCisgICAgICAgIHsgICAweEFCLCAgOCB9LAorICAgICAgICB7ICAgMHhFNCwgIDggfSwKKyAgICAgICAgeyAgIDB4QTksICA4IH0sCisgICAgICAgIHsgIDB4MTUxLCAgOSB9LAorICAgICAgICB7ICAweDE1MCwgIDkgfSwKKyAgICAgICAgeyAgMHgyQTksIDEwIH0KKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfYmlhc18wWzE2XVszMl1bMl0gPSB7CisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDEsIHRhYmxlIDAgKi8KKyAgICAgICAgeyAgICAweDgsICA1IH0sCisgICAgICAgIHsgICAweDI1LCAgNyB9LAorICAgICAgICB7ICAweDE3QSwgIDkgfSwKKyAgICAgICAgeyAgMHgyRjcsIDEwIH0sCisgICAgICAgIHsgIDB4QkRCLCAxMiB9LAorICAgICAgICB7IDB4MTdCNCwgMTMgfSwKKyAgICAgICAgeyAweDJGNkIsIDE0IH0sCisgICAgICAgIHsgICAweDFELCAgNSB9LAorICAgICAgICB7IDB4MkY2QSwgMTQgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgIDB4MSwgIDQgfSwKKyAgICAgICAgeyAgICAweDIsICA0IH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgICAweDAsICA0IH0sCisgICAgICAgIHsgICAweDFDLCAgNSB9LAorICAgICAgICB7ICAgIDB4OSwgIDQgfSwKKyAgICAgICAgeyAgICAweEQsICA0IH0sCisgICAgICAgIHsgICAgMHhGLCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweDMsICA0IH0sCisgICAgICAgIHsgICAgMHhBLCAgNSB9LAorICAgICAgICB7ICAgMHgxNiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTMsICA2IH0sCisgICAgICAgIHsgICAweDVELCAgNyB9LAorICAgICAgICB7ICAgMHgyNCwgIDcgfSwKKyAgICAgICAgeyAgIDB4QkMsICA4IH0sCisgICAgICAgIHsgICAweDVDLCAgNyB9LAorICAgICAgICB7ICAweDVFQywgMTEgfSwKKyAgICAgICAgeyAgICAweEIsICA1IH0sCisgICAgICAgIHsgICAweDVGLCAgNyB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMSwgdGFibGUgMSAqLworICAgICAgICB7ICAgIDB4RiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTAsICA2IH0sCisgICAgICAgIHsgICAweDRCLCAgOCB9LAorICAgICAgICB7ICAgMHhDNiwgIDggfSwKKyAgICAgICAgeyAgMHgzMUQsIDEwIH0sCisgICAgICAgIHsgIDB4QzcxLCAxMiB9LAorICAgICAgICB7ICAweEM3MCwgMTIgfSwKKyAgICAgICAgeyAgICAweDEsICA0IH0sCisgICAgICAgIHsgIDB4QzczLCAxMiB9LAorICAgICAgICB7ICAgIDB4OCwgIDQgfSwKKyAgICAgICAgeyAgICAweDksICA0IH0sCisgICAgICAgIHsgICAgMHgyLCAgNCB9LAorICAgICAgICB7ICAgIDB4MywgIDQgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAgMHg2LCAgNCB9LAorICAgICAgICB7ICAgIDB4MCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUMsICA1IH0sCisgICAgICAgIHsgICAgMHg1LCAgNCB9LAorICAgICAgICB7ICAgIDB4RCwgIDQgfSwKKyAgICAgICAgeyAgICAweEYsICA0IH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgMHgxOSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTMsICA2IH0sCisgICAgICAgIHsgICAweDFELCAgNSB9LAorICAgICAgICB7ICAgMHgzMCwgIDYgfSwKKyAgICAgICAgeyAgIDB4NjIsICA3IH0sCisgICAgICAgIHsgICAweDI0LCAgNyB9LAorICAgICAgICB7ICAgMHg0QSwgIDggfSwKKyAgICAgICAgeyAgMHgxOEYsICA5IH0sCisgICAgICAgIHsgIDB4QzcyLCAxMiB9LAorICAgICAgICB7ICAgIDB4RSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTEsICA2IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAxLCB0YWJsZSAyICovCisgICAgICAgIHsgICAweDFCLCAgNSB9LAorICAgICAgICB7ICAgIDB4MywgIDYgfSwKKyAgICAgICAgeyAgIDB4OEQsICA4IH0sCisgICAgICAgIHsgICAweDQwLCAgNyB9LAorICAgICAgICB7ICAweDIzOSwgMTAgfSwKKyAgICAgICAgeyAgMHg0NzEsIDExIH0sCisgICAgICAgIHsgIDB4OEUwLCAxMiB9LAorICAgICAgICB7ICAgIDB4MywgIDQgfSwKKyAgICAgICAgeyAweDExQzMsIDEzIH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgIDB4OSwgIDQgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgICAgMHg1LCAgNCB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgICAweDcsICA0IH0sCisgICAgICAgIHsgICAgMHgxLCAgNCB9LAorICAgICAgICB7ICAgMHgxRSwgIDUgfSwKKyAgICAgICAgeyAgICAweDYsICA0IH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAgIDB4QiwgIDQgfSwKKyAgICAgICAgeyAgICAweDIsICA0IH0sCisgICAgICAgIHsgICAgMHgwLCAgNSB9LAorICAgICAgICB7ICAgMHg0MSwgIDcgfSwKKyAgICAgICAgeyAgIDB4MUYsICA1IH0sCisgICAgICAgIHsgICAweDIyLCAgNiB9LAorICAgICAgICB7ICAgIDB4MiwgIDYgfSwKKyAgICAgICAgeyAgIDB4OEYsICA4IH0sCisgICAgICAgIHsgICAweDhDLCAgOCB9LAorICAgICAgICB7ICAweDExRCwgIDkgfSwKKyAgICAgICAgeyAweDExQzIsIDEzIH0sCisgICAgICAgIHsgICAweDFBLCAgNSB9LAorICAgICAgICB7ICAgMHgyMSwgIDYgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDEsIHRhYmxlIDMgKi8KKyAgICAgICAgeyAgIDB4MUYsICA1IH0sCisgICAgICAgIHsgICAgMHgzLCAgNiB9LAorICAgICAgICB7ICAgIDB4MywgIDcgfSwKKyAgICAgICAgeyAgIDB4NDMsICA3IH0sCisgICAgICAgIHsgICAgMHhCLCAgOSB9LAorICAgICAgICB7ICAgMHgxNSwgMTAgfSwKKyAgICAgICAgeyAgIDB4NTEsIDEyIH0sCisgICAgICAgIHsgICAgMHgzLCAgNCB9LAorICAgICAgICB7ICAgMHg1MCwgMTIgfSwKKyAgICAgICAgeyAgICAweEQsICA0IH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAgIDB4NCwgIDQgfSwKKyAgICAgICAgeyAgICAweDYsICA0IH0sCisgICAgICAgIHsgICAgMHhFLCAgNCB9LAorICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgICAweDEsICA0IH0sCisgICAgICAgIHsgICAweDFFLCAgNSB9LAorICAgICAgICB7ICAgIDB4NSwgIDQgfSwKKyAgICAgICAgeyAgICAweDksICA0IH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgMHgxMSwgIDUgfSwKKyAgICAgICAgeyAgICAweDIsICA2IH0sCisgICAgICAgIHsgICAgMHg0LCAgOCB9LAorICAgICAgICB7ICAgIDB4MiwgIDQgfSwKKyAgICAgICAgeyAgIDB4MkQsICA2IH0sCisgICAgICAgIHsgICAweDIwLCAgNiB9LAorICAgICAgICB7ICAgMHg0MiwgIDcgfSwKKyAgICAgICAgeyAgICAweDEsICA3IH0sCisgICAgICAgIHsgICAgMHgwLCAgNyB9LAorICAgICAgICB7ICAgMHgyOSwgMTEgfSwKKyAgICAgICAgeyAgIDB4MTcsICA1IH0sCisgICAgICAgIHsgICAweDJDLCAgNiB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMSwgdGFibGUgNCAqLworICAgICAgICB7ICAgIDB4MywgIDQgfSwKKyAgICAgICAgeyAgIDB4MUYsICA2IH0sCisgICAgICAgIHsgICAweDNBLCAgNyB9LAorICAgICAgICB7ICAgMHg1RCwgIDcgfSwKKyAgICAgICAgeyAgMHgxNzMsICA5IH0sCisgICAgICAgIHsgIDB4MkU0LCAxMCB9LAorICAgICAgICB7IDB4MTcyRCwgMTMgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgMHgxNzJDLCAxMyB9LAorICAgICAgICB7ICAgIDB4RiwgIDQgfSwKKyAgICAgICAgeyAgICAweEUsICA0IH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4OCwgIDQgfSwKKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgIDB4MSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTYsICA1IH0sCisgICAgICAgIHsgICAgMHgyLCAgNCB9LAorICAgICAgICB7ICAgIDB4NSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUEsICA1IH0sCisgICAgICAgIHsgICAweDJGLCAgNiB9LAorICAgICAgICB7ICAgMHgzOCwgIDcgfSwKKyAgICAgICAgeyAgMHg1Q0EsIDExIH0sCisgICAgICAgIHsgICAgMHg2LCAgNCB9LAorICAgICAgICB7ICAgMHgzNywgIDYgfSwKKyAgICAgICAgeyAgIDB4MUUsICA2IH0sCisgICAgICAgIHsgICAweDNCLCAgNyB9LAorICAgICAgICB7ICAgMHgzOSwgIDcgfSwKKyAgICAgICAgeyAgIDB4QjgsICA4IH0sCisgICAgICAgIHsgIDB4Qjk3LCAxMiB9LAorICAgICAgICB7ICAgIDB4MCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MzYsICA2IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAxLCB0YWJsZSA1ICovCisgICAgICAgIHsgICAgMHg2LCAgNCB9LAorICAgICAgICB7ICAgMHgzNywgIDYgfSwKKyAgICAgICAgeyAgIDB4NUQsICA3IH0sCisgICAgICAgIHsgICAgMHhDLCAgNiB9LAorICAgICAgICB7ICAgMHhCOSwgIDggfSwKKyAgICAgICAgeyAgMHgyRTMsIDEwIH0sCisgICAgICAgIHsgIDB4NUM0LCAxMSB9LAorICAgICAgICB7ICAgIDB4NCwgIDQgfSwKKyAgICAgICAgeyAweDE3MTUsIDEzIH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4RiwgIDQgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweDksICA0IH0sCisgICAgICAgIHsgICAweDFELCAgNSB9LAorICAgICAgICB7ICAgMHgxNiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUMsICA1IH0sCisgICAgICAgIHsgICAweDFBLCAgNSB9LAorICAgICAgICB7ICAgIDB4QiwgIDUgfSwKKyAgICAgICAgeyAgIDB4NUUsICA3IH0sCisgICAgICAgIHsgIDB4MTcwLCAgOSB9LAorICAgICAgICB7IDB4MTcxNCwgMTMgfSwKKyAgICAgICAgeyAgICAweEEsICA0IH0sCisgICAgICAgIHsgICAgMHhBLCAgNSB9LAorICAgICAgICB7ICAgMHgzNiwgIDYgfSwKKyAgICAgICAgeyAgIDB4NUYsICA3IH0sCisgICAgICAgIHsgICAweDFCLCAgNyB9LAorICAgICAgICB7ICAgMHgxQSwgIDcgfSwKKyAgICAgICAgeyAgMHhCOEIsIDEyIH0sCisgICAgICAgIHsgICAgMHgyLCAgNCB9LAorICAgICAgICB7ICAgIDB4NywgIDUgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDEsIHRhYmxlIDYgKi8KKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAgMHhCLCAgNSB9LAorICAgICAgICB7ICAgMHg3OSwgIDcgfSwKKyAgICAgICAgeyAgIDB4MjIsICA2IH0sCisgICAgICAgIHsgICAweEYwLCAgOCB9LAorICAgICAgICB7ICAweDExOSwgIDkgfSwKKyAgICAgICAgeyAgMHgyMzAsIDEwIH0sCisgICAgICAgIHsgICAweDFELCAgNSB9LAorICAgICAgICB7ICAweDhDNCwgMTIgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgICAweDksICA0IH0sCisgICAgICAgIHsgICAgMHhCLCAgNCB9LAorICAgICAgICB7ICAgIDB4NywgIDQgfSwKKyAgICAgICAgeyAgIDB4MUMsICA1IH0sCisgICAgICAgIHsgICAweDNELCAgNiB9LAorICAgICAgICB7ICAgIDB4RCwgIDUgfSwKKyAgICAgICAgeyAgICAweDgsICA1IH0sCisgICAgICAgIHsgICAweDE1LCAgNiB9LAorICAgICAgICB7ICAgMHg4RCwgIDggfSwKKyAgICAgICAgeyAweDExOEIsIDEzIH0sCisgICAgICAgIHsgMHgxMThBLCAxMyB9LAorICAgICAgICB7ICAgIDB4RCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTAsICA1IH0sCisgICAgICAgIHsgICAgMHg5LCAgNSB9LAorICAgICAgICB7ICAgMHgxNCwgIDYgfSwKKyAgICAgICAgeyAgIDB4NDcsICA3IH0sCisgICAgICAgIHsgICAweEYxLCAgOCB9LAorICAgICAgICB7ICAweDQ2MywgMTEgfSwKKyAgICAgICAgeyAgIDB4MUYsICA1IH0sCisgICAgICAgIHsgICAgMHhDLCAgNSB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMSwgdGFibGUgNyAqLworICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgIDB4MUEsICA1IH0sCisgICAgICAgIHsgICAweDMzLCAgNiB9LAorICAgICAgICB7ICAgIDB4QywgIDUgfSwKKyAgICAgICAgeyAgIDB4NDYsICA3IH0sCisgICAgICAgIHsgIDB4MUUzLCAgOSB9LAorICAgICAgICB7ICAweDNDNSwgMTAgfSwKKyAgICAgICAgeyAgIDB4MTcsICA1IH0sCisgICAgICAgIHsgMHgxRTIxLCAxMyB9LAorICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgICAweDcsICA0IH0sCisgICAgICAgIHsgICAweDFCLCAgNSB9LAorICAgICAgICB7ICAgMHgzRCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MUIsICA2IH0sCisgICAgICAgIHsgICAweDIyLCAgNiB9LAorICAgICAgICB7ICAgMHg3OSwgIDcgfSwKKyAgICAgICAgeyAgIDB4RjAsICA4IH0sCisgICAgICAgIHsgMHgxRTIwLCAxMyB9LAorICAgICAgICB7IDB4MUUyMywgMTMgfSwKKyAgICAgICAgeyAweDFFMjIsIDEzIH0sCisgICAgICAgIHsgICAgMHhFLCAgNCB9LAorICAgICAgICB7ICAgMHgxNiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTgsICA1IH0sCisgICAgICAgIHsgICAweDMyLCAgNiB9LAorICAgICAgICB7ICAgMHgxQSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NDcsICA3IH0sCisgICAgICAgIHsgIDB4Nzg5LCAxMSB9LAorICAgICAgICB7ICAgMHgxRiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTAsICA1IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAxLCB0YWJsZSA4ICovCisgICAgICAgIHsgICAweDFELCAgNSB9LAorICAgICAgICB7ICAgMHg2MSwgIDcgfSwKKyAgICAgICAgeyAgIDB4NEUsICA4IH0sCisgICAgICAgIHsgICAweDlFLCAgOSB9LAorICAgICAgICB7ICAweDI3QywgMTEgfSwKKyAgICAgICAgeyAgMHg5RjUsIDEzIH0sCisgICAgICAgIHsgIDB4OUY0LCAxMyB9LAorICAgICAgICB7ICAgIDB4MywgIDQgfSwKKyAgICAgICAgeyAgIDB4NjAsICA3IH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4RiwgIDQgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgIDB4OSwgIDQgfSwKKyAgICAgICAgeyAgICAweDUsICA0IH0sCisgICAgICAgIHsgICAgMHhELCAgNSB9LAorICAgICAgICB7ICAgMHgzMSwgIDYgfSwKKyAgICAgICAgeyAgICAweDgsICA1IH0sCisgICAgICAgIHsgICAweDM4LCAgNiB9LAorICAgICAgICB7ICAgMHgxMiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MjYsICA3IH0sCisgICAgICAgIHsgIDB4MTNGLCAxMCB9LAorICAgICAgICB7ICAweDRGQiwgMTIgfSwKKyAgICAgICAgeyAgICAweEQsICA0IH0sCisgICAgICAgIHsgICAgMHgyLCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDUgfSwKKyAgICAgICAgeyAgIDB4MzksICA2IH0sCisgICAgICAgIHsgICAweDFDLCAgNiB9LAorICAgICAgICB7ICAgIDB4RiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUQsICA2IH0sCisgICAgICAgIHsgICAgMHg4LCAgNCB9LAorICAgICAgICB7ICAgMHgxOSwgIDUgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDEsIHRhYmxlIDkgKi8KKyAgICAgICAgeyAgICAweDcsICA0IH0sCisgICAgICAgIHsgICAweDE5LCAgNiB9LAorICAgICAgICB7ICAgMHhBQiwgIDggfSwKKyAgICAgICAgeyAgIDB4QUEsICA4IH0sCisgICAgICAgIHsgIDB4MTE5LCAxMCB9LAorICAgICAgICB7ICAweDQ2MSwgMTIgfSwKKyAgICAgICAgeyAgMHg0NjAsIDEyIH0sCisgICAgICAgIHsgICAweDFCLCAgNSB9LAorICAgICAgICB7ICAgMHg0NywgIDggfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4NSwgIDQgfSwKKyAgICAgICAgeyAgICAweEQsICA1IH0sCisgICAgICAgIHsgICAweDM1LCAgNiB9LAorICAgICAgICB7ICAgMHgzRCwgIDYgfSwKKyAgICAgICAgeyAgIDB4M0MsICA2IH0sCisgICAgICAgIHsgICAweDE4LCAgNiB9LAorICAgICAgICB7ICAgMHgyMiwgIDcgfSwKKyAgICAgICAgeyAgIDB4OEQsICA5IH0sCisgICAgICAgIHsgIDB4MjMxLCAxMSB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUYsICA1IH0sCisgICAgICAgIHsgICAgMHg5LCAgNSB9LAorICAgICAgICB7ICAgMHgyQiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MTAsICA2IH0sCisgICAgICAgIHsgICAweDM0LCAgNiB9LAorICAgICAgICB7ICAgMHg1NCwgIDcgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAweDE0LCAgNSB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMSwgdGFibGUgMTAgKi8KKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAgMHg1LCAgNSB9LAorICAgICAgICB7ICAgIDB4OCwgIDYgfSwKKyAgICAgICAgeyAgIDB4NUIsICA3IH0sCisgICAgICAgIHsgICAweDRELCAgOSB9LAorICAgICAgICB7ICAweDEzMSwgMTEgfSwKKyAgICAgICAgeyAgMHgyNjEsIDEyIH0sCisgICAgICAgIHsgICAweDFBLCAgNSB9LAorICAgICAgICB7ICAgMHgxMiwgIDcgfSwKKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAgMHhGLCAgNCB9LAorICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgICAweDksICA0IH0sCisgICAgICAgIHsgICAgMHg2LCAgNCB9LAorICAgICAgICB7ICAgMHgxQiwgIDUgfSwKKyAgICAgICAgeyAgICAweDYsICA1IH0sCisgICAgICAgIHsgICAweDFDLCAgNiB9LAorICAgICAgICB7ICAgMHgyQywgIDYgfSwKKyAgICAgICAgeyAgIDB4MTUsICA2IH0sCisgICAgICAgIHsgICAweDVBLCAgNyB9LAorICAgICAgICB7ICAgMHgyNywgIDggfSwKKyAgICAgICAgeyAgIDB4OTksIDEwIH0sCisgICAgICAgIHsgIDB4MjYwLCAxMiB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgICAgMHhGLCAgNSB9LAorICAgICAgICB7ICAgIDB4NywgIDUgfSwKKyAgICAgICAgeyAgIDB4MUQsICA2IH0sCisgICAgICAgIHsgICAgMHhCLCAgNSB9LAorICAgICAgICB7ICAgMHgxNCwgIDYgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAweDE3LCAgNSB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMSwgdGFibGUgMTEgKi8KKyAgICAgICAgeyAgICAweEYsICA0IH0sCisgICAgICAgIHsgICAweDEzLCAgNSB9LAorICAgICAgICB7ICAgMHg3NSwgIDcgfSwKKyAgICAgICAgeyAgIDB4MjQsICA2IH0sCisgICAgICAgIHsgICAweDk1LCAgOCB9LAorICAgICAgICB7ICAweDI1MSwgMTAgfSwKKyAgICAgICAgeyAgMHg0QTAsIDExIH0sCisgICAgICAgIHsgICAweDEwLCAgNSB9LAorICAgICAgICB7ICAgMHhDOCwgIDggfSwKKyAgICAgICAgeyAgICAweDIsICAzIH0sCisgICAgICAgIHsgICAgMHgxLCAgMyB9LAorICAgICAgICB7ICAgIDB4MSwgIDQgfSwKKyAgICAgICAgeyAgICAweDAsICA0IH0sCisgICAgICAgIHsgICAweDFBLCAgNSB9LAorICAgICAgICB7ICAgMHgxMSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MkMsICA2IH0sCisgICAgICAgIHsgICAweDY1LCAgNyB9LAorICAgICAgICB7ICAgMHg3NCwgIDcgfSwKKyAgICAgICAgeyAgIDB4NEIsICA3IH0sCisgICAgICAgIHsgICAweEM5LCAgOCB9LAorICAgICAgICB7ICAweDEyOSwgIDkgfSwKKyAgICAgICAgeyAgMHg5NDMsIDEyIH0sCisgICAgICAgIHsgIDB4OTQyLCAxMiB9LAorICAgICAgICB7ICAgIDB4MywgIDMgfSwKKyAgICAgICAgeyAgICAweEEsICA0IH0sCisgICAgICAgIHsgICAweDFDLCAgNSB9LAorICAgICAgICB7ICAgMHgxOCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MzMsICA2IH0sCisgICAgICAgIHsgICAweDE3LCAgNSB9LAorICAgICAgICB7ICAgMHgyRCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MUIsICA1IH0sCisgICAgICAgIHsgICAweDNCLCAgNiB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMSwgdGFibGUgMTIgKi8KKyAgICAgICAgeyAgICAweDMsICAzIH0sCisgICAgICAgIHsgICAweDFBLCAgNSB9LAorICAgICAgICB7ICAgMHgyRCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MzgsICA2IH0sCisgICAgICAgIHsgICAweDI4LCAgNyB9LAorICAgICAgICB7ICAweDM5NSwgMTAgfSwKKyAgICAgICAgeyAgMHhFNTEsIDEyIH0sCisgICAgICAgIHsgICAweDM3LCAgNiB9LAorICAgICAgICB7ICAgMHhFNCwgIDggfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgMHgxRiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUUsICA1IH0sCisgICAgICAgIHsgICAweDE3LCAgNSB9LAorICAgICAgICB7ICAgMHgzQSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NzMsICA3IH0sCisgICAgICAgIHsgICAweDJBLCAgNyB9LAorICAgICAgICB7ICAgMHgyQiwgIDcgfSwKKyAgICAgICAgeyAgIDB4MjksICA3IH0sCisgICAgICAgIHsgIDB4MUNCLCAgOSB9LAorICAgICAgICB7ICAweDcyOSwgMTEgfSwKKyAgICAgICAgeyAweDFDQTEsIDEzIH0sCisgICAgICAgIHsgMHgxQ0EwLCAxMyB9LAorICAgICAgICB7ICAgIDB4NCwgIDMgfSwKKyAgICAgICAgeyAgICAweEEsICA0IH0sCisgICAgICAgIHsgICAgMHg0LCAgNCB9LAorICAgICAgICB7ICAgMHgxOCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MzYsICA2IH0sCisgICAgICAgIHsgICAgMHhCLCAgNSB9LAorICAgICAgICB7ICAgMHgyQywgIDYgfSwKKyAgICAgICAgeyAgIDB4MTksICA1IH0sCisgICAgICAgIHsgICAweDNCLCAgNiB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMSwgdGFibGUgMTMgKi8KKyAgICAgICAgeyAgICAweDQsICAzIH0sCisgICAgICAgIHsgICAgMHg0LCAgNCB9LAorICAgICAgICB7ICAgMHgzRiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MTcsICA1IH0sCisgICAgICAgIHsgICAweDc1LCAgNyB9LAorICAgICAgICB7ICAweDFGNSwgIDkgfSwKKyAgICAgICAgeyAgMHg3RDEsIDExIH0sCisgICAgICAgIHsgICAweDE3LCAgNiB9LAorICAgICAgICB7ICAweDFGNiwgIDkgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgMHgxQiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUEsICA1IH0sCisgICAgICAgIHsgICAgMHhBLCAgNSB9LAorICAgICAgICB7ICAgMHgzMiwgIDYgfSwKKyAgICAgICAgeyAgIDB4NzQsICA3IH0sCisgICAgICAgIHsgICAweEY4LCAgOCB9LAorICAgICAgICB7ICAgMHhGOSwgIDggfSwKKyAgICAgICAgeyAgMHgxRjcsICA5IH0sCisgICAgICAgIHsgIDB4M0U5LCAxMCB9LAorICAgICAgICB7ICAweEZBMCwgMTIgfSwKKyAgICAgICAgeyAweDFGNDMsIDEzIH0sCisgICAgICAgIHsgMHgxRjQyLCAxMyB9LAorICAgICAgICB7ICAgIDB4MywgIDMgfSwKKyAgICAgICAgeyAgICAweEEsICA0IH0sCisgICAgICAgIHsgICAweDFFLCAgNSB9LAorICAgICAgICB7ICAgMHgxQywgIDUgfSwKKyAgICAgICAgeyAgIDB4M0IsICA2IH0sCisgICAgICAgIHsgICAweDE4LCAgNSB9LAorICAgICAgICB7ICAgMHgxNiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MTYsICA1IH0sCisgICAgICAgIHsgICAweDMzLCAgNiB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMSwgdGFibGUgMTQgKi8KKyAgICAgICAgeyAgICAweDQsICAzIH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgMHgxOCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUUsICA1IH0sCisgICAgICAgIHsgICAweDM2LCAgNiB9LAorICAgICAgICB7ICAgMHgzMSwgIDcgfSwKKyAgICAgICAgeyAgMHgxNzcsICA5IH0sCisgICAgICAgIHsgICAweDc3LCAgNyB9LAorICAgICAgICB7ICAweDE3NiwgIDkgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgMHgxQSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTksICA1IH0sCisgICAgICAgIHsgICAweDNBLCAgNiB9LAorICAgICAgICB7ICAgMHgxOSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NUMsICA3IH0sCisgICAgICAgIHsgICAweEJBLCAgOCB9LAorICAgICAgICB7ICAgMHg2MSwgIDggfSwKKyAgICAgICAgeyAgIDB4QzEsICA5IH0sCisgICAgICAgIHsgIDB4MTgwLCAxMCB9LAorICAgICAgICB7ICAweDMwMiwgMTEgfSwKKyAgICAgICAgeyAgMHg2MDcsIDEyIH0sCisgICAgICAgIHsgIDB4NjA2LCAxMiB9LAorICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgICAweEEsICA0IH0sCisgICAgICAgIHsgICAweDFGLCAgNSB9LAorICAgICAgICB7ICAgMHgxQywgIDUgfSwKKyAgICAgICAgeyAgIDB4MzcsICA2IH0sCisgICAgICAgIHsgICAweDE2LCAgNSB9LAorICAgICAgICB7ICAgMHg3NiwgIDcgfSwKKyAgICAgICAgeyAgICAweEQsICA1IH0sCisgICAgICAgIHsgICAweDJGLCAgNiB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMSwgdGFibGUgMTUgKi8KKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgMHgxQSwgIDUgfSwKKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAweDFELCAgNSB9LAorICAgICAgICB7ICAgMHgzOSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NzgsICA3IH0sCisgICAgICAgIHsgICAweDVFLCAgNyB9LAorICAgICAgICB7ICAweDM5MywgMTEgfSwKKyAgICAgICAgeyAgICAweDIsICAzIH0sCisgICAgICAgIHsgICAgMHgxLCAgMyB9LAorICAgICAgICB7ICAgMHgxNiwgIDUgfSwKKyAgICAgICAgeyAgICAweEYsICA1IH0sCisgICAgICAgIHsgICAweDJFLCAgNiB9LAorICAgICAgICB7ICAgMHg1RiwgIDcgfSwKKyAgICAgICAgeyAgIDB4NzMsICA4IH0sCisgICAgICAgIHsgICAweEU1LCAgOSB9LAorICAgICAgICB7ICAweDFDOCwgMTAgfSwKKyAgICAgICAgeyAgMHhFNEEsIDEzIH0sCisgICAgICAgIHsgMHgxQzk3LCAxNCB9LAorICAgICAgICB7IDB4MUM5NiwgMTQgfSwKKyAgICAgICAgeyAgMHhFNDksIDEzIH0sCisgICAgICAgIHsgIDB4RTQ4LCAxMyB9LAorICAgICAgICB7ICAgIDB4NCwgIDMgfSwKKyAgICAgICAgeyAgICAweDYsICA0IH0sCisgICAgICAgIHsgICAweDFGLCAgNSB9LAorICAgICAgICB7ICAgMHgxQiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUQsICA2IH0sCisgICAgICAgIHsgICAweDM4LCAgNiB9LAorICAgICAgICB7ICAgMHgzOCwgIDcgfSwKKyAgICAgICAgeyAgIDB4M0QsICA2IH0sCisgICAgICAgIHsgICAweDc5LCAgNyB9CisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGFjX2JpYXNfMVsxNl1bMzJdWzJdID0geworICAgIHsgLyogQUMgYmlhcyBncm91cCAyLCB0YWJsZSAwICovCisgICAgICAgIHsgICAgMHhCLCAgNSB9LAorICAgICAgICB7ICAgMHgyQiwgIDcgfSwKKyAgICAgICAgeyAgIDB4NTQsICA4IH0sCisgICAgICAgIHsgIDB4MUI3LCAgOSB9LAorICAgICAgICB7ICAweDZEOSwgMTEgfSwKKyAgICAgICAgeyAgMHhEQjEsIDEyIH0sCisgICAgICAgIHsgIDB4REIwLCAxMiB9LAorICAgICAgICB7ICAgIDB4MiwgIDQgfSwKKyAgICAgICAgeyAgIDB4QUIsICA5IH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgICAweDcsICA0IH0sCisgICAgICAgIHsgICAgMHg4LCAgNCB9LAorICAgICAgICB7ICAgIDB4RiwgIDQgfSwKKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAgMHgzLCAgNCB9LAorICAgICAgICB7ICAgMHgxRCwgIDUgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgICAgMHhCLCAgNCB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUEsICA1IH0sCisgICAgICAgIHsgICAgMHgzLCAgNiB9LAorICAgICAgICB7ICAgMHhBQSwgIDkgfSwKKyAgICAgICAgeyAgICAweDEsICA0IH0sCisgICAgICAgIHsgICAgMHgwLCAgNSB9LAorICAgICAgICB7ICAgMHgxNCwgIDYgfSwKKyAgICAgICAgeyAgIDB4NkMsICA3IH0sCisgICAgICAgIHsgICAweERBLCAgOCB9LAorICAgICAgICB7ICAgIDB4MiwgIDYgfSwKKyAgICAgICAgeyAgMHgzNkQsIDEwIH0sCisgICAgICAgIHsgICAweDFDLCAgNSB9LAorICAgICAgICB7ICAgMHgzNywgIDYgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDIsIHRhYmxlIDEgKi8KKyAgICAgICAgeyAgIDB4MUQsICA1IH0sCisgICAgICAgIHsgICAgMHg0LCAgNiB9LAorICAgICAgICB7ICAgMHhCNiwgIDggfSwKKyAgICAgICAgeyAgIDB4NkEsICA4IH0sCisgICAgICAgIHsgIDB4NUI5LCAxMSB9LAorICAgICAgICB7IDB4MTZFMSwgMTMgfSwKKyAgICAgICAgeyAweDE2RTAsIDEzIH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAweDE2RiwgIDkgfSwKKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAgMHhELCAgNCB9LAorICAgICAgICB7ICAgIDB4OSwgIDQgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAgMHhGLCAgNCB9LAorICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgICAweDMsICA0IH0sCisgICAgICAgIHsgICAweDE3LCAgNSB9LAorICAgICAgICB7ICAgIDB4MiwgIDQgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgICAweDFDLCAgNSB9LAorICAgICAgICB7ICAgMHgyQywgIDYgfSwKKyAgICAgICAgeyAgIDB4NkIsICA4IH0sCisgICAgICAgIHsgIDB4QjcxLCAxMiB9LAorICAgICAgICB7ICAgIDB4NSwgIDQgfSwKKyAgICAgICAgeyAgICAweDMsICA1IH0sCisgICAgICAgIHsgICAweDFCLCAgNiB9LAorICAgICAgICB7ICAgMHg1QSwgIDcgfSwKKyAgICAgICAgeyAgIDB4MzQsICA3IH0sCisgICAgICAgIHsgICAgMHg1LCAgNiB9LAorICAgICAgICB7ICAweDJERCwgMTAgfSwKKyAgICAgICAgeyAgICAweDAsICA0IH0sCisgICAgICAgIHsgICAgMHhDLCAgNSB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMiwgdGFibGUgMiAqLworICAgICAgICB7ICAgIDB4MywgIDQgfSwKKyAgICAgICAgeyAgIDB4N0YsICA3IH0sCisgICAgICAgIHsgICAweEExLCAgOCB9LAorICAgICAgICB7ICAgMHhBMCwgIDggfSwKKyAgICAgICAgeyAgMHgyMEMsIDEwIH0sCisgICAgICAgIHsgIDB4ODM0LCAxMiB9LAorICAgICAgICB7IDB4MTA2QiwgMTMgfSwKKyAgICAgICAgeyAgICAweDcsICA0IH0sCisgICAgICAgIHsgICAweDgyLCAgOCB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgICAweEQsICA0IH0sCisgICAgICAgIHsgICAgMHhCLCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4MiwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTEsICA1IH0sCisgICAgICAgIHsgICAweDFFLCAgNSB9LAorICAgICAgICB7ICAgMHgxNSwgIDUgfSwKKyAgICAgICAgeyAgIDB4M0UsICA2IH0sCisgICAgICAgIHsgICAweDQwLCAgNyB9LAorICAgICAgICB7ICAweDQxQiwgMTEgfSwKKyAgICAgICAgeyAweDEwNkEsIDEzIH0sCisgICAgICAgIHsgICAgMHg2LCAgNCB9LAorICAgICAgICB7ICAgIDB4QSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MjksICA2IH0sCisgICAgICAgIHsgICAweDdFLCAgNyB9LAorICAgICAgICB7ICAgMHg1MSwgIDcgfSwKKyAgICAgICAgeyAgIDB4MjEsICA2IH0sCisgICAgICAgIHsgIDB4MTA3LCAgOSB9LAorICAgICAgICB7ICAgIDB4NCwgIDQgfSwKKyAgICAgICAgeyAgICAweEIsICA1IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAyLCB0YWJsZSAzICovCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgMHgxQiwgIDYgfSwKKyAgICAgICAgeyAgIDB4RjYsICA4IH0sCisgICAgICAgIHsgICAweEU5LCAgOCB9LAorICAgICAgICB7ICAweDNBMSwgMTAgfSwKKyAgICAgICAgeyAgMHg3NDAsIDExIH0sCisgICAgICAgIHsgIDB4RTgyLCAxMiB9LAorICAgICAgICB7ICAgMHgxRiwgIDUgfSwKKyAgICAgICAgeyAgMHgxRUYsICA5IH0sCisgICAgICAgIHsgICAgMHgxLCAgMyB9LAorICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAgIDB4RCwgIDQgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAweDFDLCAgNSB9LAorICAgICAgICB7ICAgIDB4MywgIDUgfSwKKyAgICAgICAgeyAgIDB4MTIsICA1IH0sCisgICAgICAgIHsgICAgMHgyLCAgNSB9LAorICAgICAgICB7ICAgMHg3NSwgIDcgfSwKKyAgICAgICAgeyAgMHgxRDEsICA5IH0sCisgICAgICAgIHsgMHgxRDA3LCAxMyB9LAorICAgICAgICB7IDB4MUQwNiwgMTMgfSwKKyAgICAgICAgeyAgICAweEEsICA0IH0sCisgICAgICAgIHsgICAweDEzLCAgNSB9LAorICAgICAgICB7ICAgMHgzQiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MUEsICA2IH0sCisgICAgICAgIHsgICAweDdBLCAgNyB9LAorICAgICAgICB7ICAgMHgzQywgIDYgfSwKKyAgICAgICAgeyAgMHgxRUUsICA5IH0sCisgICAgICAgIHsgICAgMHgwLCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDUgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDIsIHRhYmxlIDQgKi8KKyAgICAgICAgeyAgICAweEQsICA0IH0sCisgICAgICAgIHsgICAweDNELCAgNiB9LAorICAgICAgICB7ICAgMHg0MiwgIDcgfSwKKyAgICAgICAgeyAgIDB4MzcsICA3IH0sCisgICAgICAgIHsgICAweEQ5LCAgOSB9LAorICAgICAgICB7ICAweDM2MiwgMTEgfSwKKyAgICAgICAgeyAgMHg2QzYsIDEyIH0sCisgICAgICAgIHsgICAweDFGLCAgNSB9LAorICAgICAgICB7ICAgMHg4NiwgIDggfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHgyLCAgMyB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgIDB4MSwgIDQgfSwKKyAgICAgICAgeyAgICAweEYsICA1IH0sCisgICAgICAgIHsgICAweDI1LCAgNiB9LAorICAgICAgICB7ICAgMHgzQywgIDYgfSwKKyAgICAgICAgeyAgIDB4MUEsICA2IH0sCisgICAgICAgIHsgICAweDg3LCAgOCB9LAorICAgICAgICB7ICAweDFCMCwgMTAgfSwKKyAgICAgICAgeyAgMHhEOEYsIDEzIH0sCisgICAgICAgIHsgIDB4RDhFLCAxMyB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTMsICA1IH0sCisgICAgICAgIHsgICAgMHhDLCAgNSB9LAorICAgICAgICB7ICAgMHgyNCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MjAsICA2IH0sCisgICAgICAgIHsgICAweDExLCAgNSB9LAorICAgICAgICB7ICAgMHg2RCwgIDggfSwKKyAgICAgICAgeyAgICAweDAsICA0IH0sCisgICAgICAgIHsgICAgMHhFLCAgNSB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMiwgdGFibGUgNSAqLworICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgIDB4MTIsICA1IH0sCisgICAgICAgIHsgICAweDc2LCAgNyB9LAorICAgICAgICB7ICAgMHg3NywgIDcgfSwKKyAgICAgICAgeyAgMHgxNEQsICA5IH0sCisgICAgICAgIHsgIDB4NTMzLCAxMSB9LAorICAgICAgICB7IDB4MTRDOSwgMTMgfSwKKyAgICAgICAgeyAgIDB4MTMsICA1IH0sCisgICAgICAgIHsgICAweEE1LCAgOCB9LAorICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgICAweDMsICAzIH0sCisgICAgICAgIHsgICAgMHhCLCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAweDFBLCAgNSB9LAorICAgICAgICB7ICAgMHgyQiwgIDYgfSwKKyAgICAgICAgeyAgIDB4NzUsICA3IH0sCisgICAgICAgIHsgICAweDc0LCAgNyB9LAorICAgICAgICB7ICAgMHhBNywgIDggfSwKKyAgICAgICAgeyAgMHgyOTgsIDEwIH0sCisgICAgICAgIHsgMHgxNEM4LCAxMyB9LAorICAgICAgICB7IDB4MTRDQiwgMTMgfSwKKyAgICAgICAgeyAweDE0Q0EsIDEzIH0sCisgICAgICAgIHsgICAgMHhGLCAgNCB9LAorICAgICAgICB7ICAgMHgxQywgIDUgfSwKKyAgICAgICAgeyAgICAweDcsICA1IH0sCisgICAgICAgIHsgICAweDJBLCAgNiB9LAorICAgICAgICB7ICAgMHgyOCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MUIsICA1IH0sCisgICAgICAgIHsgICAweEE0LCAgOCB9LAorICAgICAgICB7ICAgIDB4MiwgIDQgfSwKKyAgICAgICAgeyAgICAweDYsICA1IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAyLCB0YWJsZSA2ICovCisgICAgICAgIHsgICAgMHgyLCAgMyB9LAorICAgICAgICB7ICAgMHgxQSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MkIsICA2IH0sCisgICAgICAgIHsgICAweDNBLCAgNiB9LAorICAgICAgICB7ICAgMHhFRCwgIDggfSwKKyAgICAgICAgeyAgMHgyODMsIDEwIH0sCisgICAgICAgIHsgIDB4QTBBLCAxMiB9LAorICAgICAgICB7ICAgIDB4NCwgIDUgfSwKKyAgICAgICAgeyAgIDB4QTEsICA4IH0sCisgICAgICAgIHsgICAgMHg0LCAgMyB9LAorICAgICAgICB7ICAgIDB4MywgIDMgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAgMHgxRiwgIDUgfSwKKyAgICAgICAgeyAgICAweDYsICA1IH0sCisgICAgICAgIHsgICAweDc3LCAgNyB9LAorICAgICAgICB7ICAgMHhBMywgIDggfSwKKyAgICAgICAgeyAgIDB4QTIsICA4IH0sCisgICAgICAgIHsgIDB4MTQwLCAgOSB9LAorICAgICAgICB7IDB4MTQxNywgMTMgfSwKKyAgICAgICAgeyAweDE0MTYsIDEzIH0sCisgICAgICAgIHsgIDB4QTA5LCAxMiB9LAorICAgICAgICB7ICAweEEwOCwgMTIgfSwKKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAweDFFLCAgNSB9LAorICAgICAgICB7ICAgIDB4NywgIDUgfSwKKyAgICAgICAgeyAgIDB4MkEsICA2IH0sCisgICAgICAgIHsgICAweDI5LCAgNiB9LAorICAgICAgICB7ICAgMHgxQywgIDUgfSwKKyAgICAgICAgeyAgIDB4RUMsICA4IH0sCisgICAgICAgIHsgICAweDFCLCAgNSB9LAorICAgICAgICB7ICAgIDB4NSwgIDUgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDIsIHRhYmxlIDcgKi8KKyAgICAgICAgeyAgICAweDIsICAzIH0sCisgICAgICAgIHsgICAgMHgyLCAgNCB9LAorICAgICAgICB7ICAgMHgxOCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUQsICA1IH0sCisgICAgICAgIHsgICAweDM1LCAgNiB9LAorICAgICAgICB7ICAgMHhFNCwgIDggfSwKKyAgICAgICAgeyAgMHgxQ0YsIDExIH0sCisgICAgICAgIHsgICAweDFELCAgNyB9LAorICAgICAgICB7ICAgMHg3MiwgIDkgfSwKKyAgICAgICAgeyAgICAweDQsICAzIH0sCisgICAgICAgIHsgICAgMHg1LCAgMyB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgICAweDcsICA0IH0sCisgICAgICAgIHsgICAgMHg2LCAgNSB9LAorICAgICAgICB7ICAgMHg3MywgIDcgfSwKKyAgICAgICAgeyAgIDB4MzgsICA4IH0sCisgICAgICAgIHsgIDB4MUNFLCAxMSB9LAorICAgICAgICB7ICAweDM5QiwgMTIgfSwKKyAgICAgICAgeyAgMHgzOTgsIDEyIH0sCisgICAgICAgIHsgIDB4NzMzLCAxMyB9LAorICAgICAgICB7ICAweDczMiwgMTMgfSwKKyAgICAgICAgeyAgMHg3MzUsIDEzIH0sCisgICAgICAgIHsgIDB4NzM0LCAxMyB9LAorICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgIDB4MUYsICA1IH0sCisgICAgICAgIHsgICAweDFCLCAgNSB9LAorICAgICAgICB7ICAgMHgzNCwgIDYgfSwKKyAgICAgICAgeyAgICAweEYsICA2IH0sCisgICAgICAgIHsgICAweDFFLCAgNSB9LAorICAgICAgICB7ICAgMHhFNSwgIDggfSwKKyAgICAgICAgeyAgIDB4MTksICA1IH0sCisgICAgICAgIHsgICAweDM4LCAgNiB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMiwgdGFibGUgOCAqLworICAgICAgICB7ICAgMHgxNiwgIDUgfSwKKyAgICAgICAgeyAgIDB4NTAsICA3IH0sCisgICAgICAgIHsgIDB4MTcyLCAgOSB9LAorICAgICAgICB7ICAweDJFNywgMTAgfSwKKyAgICAgICAgeyAweDE3MzIsIDEzIH0sCisgICAgICAgIHsgMHgyRTY3LCAxNCB9LAorICAgICAgICB7IDB4MkU2NiwgMTQgfSwKKyAgICAgICAgeyAgICAweDYsICA0IH0sCisgICAgICAgIHsgICAweDUxLCAgNyB9LAorICAgICAgICB7ICAgIDB4MSwgIDMgfSwKKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAgMHhELCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweDksICA0IH0sCisgICAgICAgIHsgICAweDFDLCAgNSB9LAorICAgICAgICB7ICAgIDB4OSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUMsICA2IH0sCisgICAgICAgIHsgICAweDFELCAgNiB9LAorICAgICAgICB7ICAgMHg1RCwgIDcgfSwKKyAgICAgICAgeyAgIDB4QjgsICA4IH0sCisgICAgICAgIHsgIDB4NUNELCAxMSB9LAorICAgICAgICB7IDB4MTczMSwgMTMgfSwKKyAgICAgICAgeyAweDE3MzAsIDEzIH0sCisgICAgICAgIHsgICAgMHhGLCAgNCB9LAorICAgICAgICB7ICAgIDB4NSwgIDQgfSwKKyAgICAgICAgeyAgICAweEYsICA1IH0sCisgICAgICAgIHsgICAgMHg4LCAgNSB9LAorICAgICAgICB7ICAgMHgyOSwgIDYgfSwKKyAgICAgICAgeyAgIDB4MUQsICA1IH0sCisgICAgICAgIHsgICAweDJGLCAgNiB9LAorICAgICAgICB7ICAgIDB4OCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTUsICA1IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAyLCB0YWJsZSA5ICovCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgMHgyMSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NDAsICA3IH0sCisgICAgICAgIHsgICAweEFELCAgOCB9LAorICAgICAgICB7ICAweDJCMCwgMTAgfSwKKyAgICAgICAgeyAweDE1ODksIDEzIH0sCisgICAgICAgIHsgMHgxNTg4LCAxMyB9LAorICAgICAgICB7ICAgMHgxQywgIDUgfSwKKyAgICAgICAgeyAgIDB4NUYsICA3IH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4RiwgIDQgfSwKKyAgICAgICAgeyAgICAweEQsICA0IH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTEsICA1IH0sCisgICAgICAgIHsgICAweDJBLCAgNiB9LAorICAgICAgICB7ICAgMHg1NywgIDcgfSwKKyAgICAgICAgeyAgIDB4NUUsICA3IH0sCisgICAgICAgIHsgICAweDQxLCAgNyB9LAorICAgICAgICB7ICAweDE1OSwgIDkgfSwKKyAgICAgICAgeyAgMHg1NjMsIDExIH0sCisgICAgICAgIHsgMHgxNThCLCAxMyB9LAorICAgICAgICB7IDB4MTU4QSwgMTMgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHg1LCAgNCB9LAorICAgICAgICB7ICAgMHgxNCwgIDUgfSwKKyAgICAgICAgeyAgIDB4M0IsICA2IH0sCisgICAgICAgIHsgICAweDJFLCAgNiB9LAorICAgICAgICB7ICAgIDB4NCwgIDQgfSwKKyAgICAgICAgeyAgIDB4M0EsICA2IH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgMHgxNiwgIDUgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDIsIHRhYmxlIDEwICovCisgICAgICAgIHsgICAgMHhFLCAgNCB9LAorICAgICAgICB7ICAgIDB4NywgIDUgfSwKKyAgICAgICAgeyAgIDB4NDYsICA3IH0sCisgICAgICAgIHsgICAweDQ1LCAgNyB9LAorICAgICAgICB7ICAgMHg2NCwgIDkgfSwKKyAgICAgICAgeyAgMHgzMkEsIDEyIH0sCisgICAgICAgIHsgIDB4NjU3LCAxMyB9LAorICAgICAgICB7ICAgMHgxOCwgIDUgfSwKKyAgICAgICAgeyAgICAweEQsICA2IH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4RiwgIDQgfSwKKyAgICAgICAgeyAgICAweEEsICA0IH0sCisgICAgICAgIHsgICAgMHhCLCAgNCB9LAorICAgICAgICB7ICAgMHgxQSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MzYsICA2IH0sCisgICAgICAgIHsgICAweDQ3LCAgNyB9LAorICAgICAgICB7ICAgMHg0NCwgIDcgfSwKKyAgICAgICAgeyAgIDB4MTgsICA3IH0sCisgICAgICAgIHsgICAweDMzLCAgOCB9LAorICAgICAgICB7ICAgMHhDQiwgMTAgfSwKKyAgICAgICAgeyAgMHg2NTYsIDEzIH0sCisgICAgICAgIHsgIDB4MzI5LCAxMiB9LAorICAgICAgICB7ICAweDMyOCwgMTIgfSwKKyAgICAgICAgeyAgICAweDIsICAzIH0sCisgICAgICAgIHsgICAgMHg2LCAgNCB9LAorICAgICAgICB7ICAgMHgxOSwgIDUgfSwKKyAgICAgICAgeyAgICAweEUsICA1IH0sCisgICAgICAgIHsgICAweDM3LCAgNiB9LAorICAgICAgICB7ICAgIDB4OSwgIDQgfSwKKyAgICAgICAgeyAgICAweEYsICA1IH0sCisgICAgICAgIHsgICAgMHgyLCAgNCB9LAorICAgICAgICB7ICAgMHgxMCwgIDUgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDIsIHRhYmxlIDExICovCisgICAgICAgIHsgICAgMHgzLCAgMyB9LAorICAgICAgICB7ICAgMHgxOCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MjMsICA2IH0sCisgICAgICAgIHsgICAweDc3LCAgNyB9LAorICAgICAgICB7ICAweDE5NCwgIDkgfSwKKyAgICAgICAgeyAweDE5NTYsIDEzIH0sCisgICAgICAgIHsgMHgzMkFGLCAxNCB9LAorICAgICAgICB7ICAgMHgzQSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NzYsICA3IH0sCisgICAgICAgIHsgICAgMHgyLCAgMyB9LAorICAgICAgICB7ICAgIDB4MSwgIDMgfSwKKyAgICAgICAgeyAgIDB4MUYsICA1IH0sCisgICAgICAgIHsgICAweDFFLCAgNSB9LAorICAgICAgICB7ICAgMHgxNCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MjIsICA2IH0sCisgICAgICAgIHsgICAweDY0LCAgNyB9LAorICAgICAgICB7ICAweDE5NywgIDkgfSwKKyAgICAgICAgeyAgMHgxOTYsICA5IH0sCisgICAgICAgIHsgIDB4MzJCLCAxMCB9LAorICAgICAgICB7ICAweDY1NCwgMTEgfSwKKyAgICAgICAgeyAweDMyQUUsIDE0IH0sCisgICAgICAgIHsgMHgxOTU1LCAxMyB9LAorICAgICAgICB7IDB4MTk1NCwgMTMgfSwKKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgMHgxQywgIDUgfSwKKyAgICAgICAgeyAgIDB4MTUsICA1IH0sCisgICAgICAgIHsgICAweDEwLCAgNSB9LAorICAgICAgICB7ICAgIDB4RCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTcsICA1IH0sCisgICAgICAgIHsgICAweDE2LCAgNSB9LAorICAgICAgICB7ICAgMHgzMywgIDYgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDIsIHRhYmxlIDEyICovCisgICAgICAgIHsgICAgMHg1LCAgMyB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgIDB4M0UsICA2IH0sCisgICAgICAgIHsgICAweDEwLCAgNSB9LAorICAgICAgICB7ICAgMHg0OCwgIDcgfSwKKyAgICAgICAgeyAgMHg5M0YsIDEyIH0sCisgICAgICAgIHsgMHgyNEZBLCAxNCB9LAorICAgICAgICB7ICAgMHgzMiwgIDYgfSwKKyAgICAgICAgeyAgIDB4NjcsICA3IH0sCisgICAgICAgIHsgICAgMHgyLCAgMyB9LAorICAgICAgICB7ICAgIDB4MSwgIDMgfSwKKyAgICAgICAgeyAgIDB4MUIsICA1IH0sCisgICAgICAgIHsgICAweDFFLCAgNSB9LAorICAgICAgICB7ICAgMHgzNCwgIDYgfSwKKyAgICAgICAgeyAgIDB4NjYsICA3IH0sCisgICAgICAgIHsgICAweDkyLCAgOCB9LAorICAgICAgICB7ICAweDEyNiwgIDkgfSwKKyAgICAgICAgeyAgMHgyNEUsIDEwIH0sCisgICAgICAgIHsgIDB4NDlFLCAxMSB9LAorICAgICAgICB7IDB4NDlGNywgMTUgfSwKKyAgICAgICAgeyAweDQ5RjYsIDE1IH0sCisgICAgICAgIHsgMHgyNEY5LCAxNCB9LAorICAgICAgICB7IDB4MjRGOCwgMTQgfSwKKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgMHgxOCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTEsICA1IH0sCisgICAgICAgIHsgICAweDNGLCAgNiB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTMsICA1IH0sCisgICAgICAgIHsgICAweDM1LCAgNiB9LAorICAgICAgICB7ICAgMHgyNSwgIDYgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDIsIHRhYmxlIDEzICovCisgICAgICAgIHsgICAgMHg1LCAgMyB9LAorICAgICAgICB7ICAgIDB4OCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTIsICA1IH0sCisgICAgICAgIHsgICAweDFDLCAgNSB9LAorICAgICAgICB7ICAgMHgxQywgIDYgfSwKKyAgICAgICAgeyAgIDB4RUEsICA5IH0sCisgICAgICAgIHsgMHgxRDc1LCAxNCB9LAorICAgICAgICB7ICAgMHgxRSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NjYsICA3IH0sCisgICAgICAgIHsgICAgMHgxLCAgMyB9LAorICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgIDB4MUIsICA1IH0sCisgICAgICAgIHsgICAweDFBLCAgNSB9LAorICAgICAgICB7ICAgMHgxRiwgIDYgfSwKKyAgICAgICAgeyAgIDB4M0IsICA3IH0sCisgICAgICAgIHsgICAweDc0LCAgOCB9LAorICAgICAgICB7ICAweDFENiwgMTAgfSwKKyAgICAgICAgeyAgMHgzQUYsIDExIH0sCisgICAgICAgIHsgMHgxRDc0LCAxNCB9LAorICAgICAgICB7IDB4MUQ3NywgMTQgfSwKKyAgICAgICAgeyAweDFENzYsIDE0IH0sCisgICAgICAgIHsgIDB4RUI5LCAxMyB9LAorICAgICAgICB7ICAweEVCOCwgMTMgfSwKKyAgICAgICAgeyAgICAweEYsICA0IH0sCisgICAgICAgIHsgICAgMHg2LCAgNCB9LAorICAgICAgICB7ICAgMHgxMywgIDUgfSwKKyAgICAgICAgeyAgIDB4M0IsICA2IH0sCisgICAgICAgIHsgICAweDNBLCAgNiB9LAorICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgIDB4MTgsICA1IH0sCisgICAgICAgIHsgICAweDMyLCAgNiB9LAorICAgICAgICB7ICAgMHg2NywgIDcgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDIsIHRhYmxlIDE0ICovCisgICAgICAgIHsgICAgMHg0LCAgMyB9LAorICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUIsICA1IH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAgIDB4RCwgIDUgfSwKKyAgICAgICAgeyAgIDB4RTYsICA4IH0sCisgICAgICAgIHsgIDB4Njg0LCAxMSB9LAorICAgICAgICB7ICAgMHg3MiwgIDcgfSwKKyAgICAgICAgeyAgIDB4RTcsICA4IH0sCisgICAgICAgIHsgICAgMHgyLCAgMyB9LAorICAgICAgICB7ICAgIDB4MSwgIDMgfSwKKyAgICAgICAgeyAgIDB4MTcsICA1IH0sCisgICAgICAgIHsgICAweDE2LCAgNSB9LAorICAgICAgICB7ICAgMHgxOCwgIDYgfSwKKyAgICAgICAgeyAgIDB4RDEsICA4IH0sCisgICAgICAgIHsgIDB4MUEwLCAgOSB9LAorICAgICAgICB7ICAweDY4NiwgMTEgfSwKKyAgICAgICAgeyAgMHhEMEYsIDEyIH0sCisgICAgICAgIHsgIDB4RDBBLCAxMiB9LAorICAgICAgICB7IDB4MUExNywgMTMgfSwKKyAgICAgICAgeyAweDFBMTYsIDEzIH0sCisgICAgICAgIHsgMHgxQTFELCAxMyB9LAorICAgICAgICB7IDB4MUExQywgMTMgfSwKKyAgICAgICAgeyAgICAweEYsICA0IH0sCisgICAgICAgIHsgICAweDFELCAgNSB9LAorICAgICAgICB7ICAgIDB4RSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MzUsICA2IH0sCisgICAgICAgIHsgICAweDM4LCAgNiB9LAorICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgICAweEYsICA1IH0sCisgICAgICAgIHsgICAweDE5LCAgNiB9LAorICAgICAgICB7ICAgMHg2OSwgIDcgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDIsIHRhYmxlIDE1ICovCisgICAgICAgIHsgICAgMHgzLCAgMyB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgIDB4MUIsICA1IH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4MywgIDQgfSwKKyAgICAgICAgeyAgIDB4MkUsICA2IH0sCisgICAgICAgIHsgICAweDUxLCAgOSB9LAorICAgICAgICB7ICAgMHhCQywgIDggfSwKKyAgICAgICAgeyAgIDB4NTMsICA5IH0sCisgICAgICAgIHsgICAgMHg0LCAgMyB9LAorICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgIDB4MTYsICA1IH0sCisgICAgICAgIHsgICAweDE1LCAgNSB9LAorICAgICAgICB7ICAgMHgxNSwgIDcgfSwKKyAgICAgICAgeyAgIDB4NTAsICA5IH0sCisgICAgICAgIHsgICAweEE0LCAxMCB9LAorICAgICAgICB7ICAweDI5NCwgMTIgfSwKKyAgICAgICAgeyAgMHg1MkIsIDEzIH0sCisgICAgICAgIHsgIDB4NTJBLCAxMyB9LAorICAgICAgICB7ICAweDUyRCwgMTMgfSwKKyAgICAgICAgeyAgMHg1MkMsIDEzIH0sCisgICAgICAgIHsgIDB4NTJGLCAxMyB9LAorICAgICAgICB7ICAweDUyRSwgMTMgfSwKKyAgICAgICAgeyAgICAweEUsICA0IH0sCisgICAgICAgIHsgICAweDFBLCAgNSB9LAorICAgICAgICB7ICAgIDB4NCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MjgsICA2IH0sCisgICAgICAgIHsgICAweDI5LCAgNiB9LAorICAgICAgICB7ICAgIDB4RiwgIDQgfSwKKyAgICAgICAgeyAgICAweEIsICA2IH0sCisgICAgICAgIHsgICAweDVGLCAgNyB9LAorICAgICAgICB7ICAgMHhCRCwgIDggfQorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhY19iaWFzXzJbMTZdWzMyXVsyXSA9IHsKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMywgdGFibGUgMCAqLworICAgICAgICB7ICAgIDB4MywgIDQgfSwKKyAgICAgICAgeyAgICAweDksICA2IH0sCisgICAgICAgIHsgICAweEQwLCAgOCB9LAorICAgICAgICB7ICAweDFBMywgIDkgfSwKKyAgICAgICAgeyAgMHgzNDQsIDEwIH0sCisgICAgICAgIHsgIDB4RDE0LCAxMiB9LAorICAgICAgICB7IDB4MUEyQiwgMTMgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgICAweDE1LCAgNyB9LAorICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgICAweEYsICA0IH0sCisgICAgICAgIHsgICAgMHhCLCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweEUsICA0IH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgMHgxQiwgIDUgfSwKKyAgICAgICAgeyAgICAweEEsICA1IH0sCisgICAgICAgIHsgICAweDE0LCAgNSB9LAorICAgICAgICB7ICAgIDB4RCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MkEsICA2IH0sCisgICAgICAgIHsgICAweDE0LCAgNyB9LAorICAgICAgICB7ICAweDY4QiwgMTEgfSwKKyAgICAgICAgeyAweDFBMkEsIDEzIH0sCisgICAgICAgIHsgICAgMHg4LCAgNCB9LAorICAgICAgICB7ICAgIDB4QiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MkIsICA2IH0sCisgICAgICAgIHsgICAgMHhCLCAgNiB9LAorICAgICAgICB7ICAgMHg2OSwgIDcgfSwKKyAgICAgICAgeyAgIDB4MzUsICA2IH0sCisgICAgICAgIHsgICAgMHg4LCAgNiB9LAorICAgICAgICB7ICAgIDB4NywgIDQgfSwKKyAgICAgICAgeyAgICAweEMsICA1IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAzLCB0YWJsZSAxICovCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgMHgzQywgIDYgfSwKKyAgICAgICAgeyAgIDB4MzIsICA3IH0sCisgICAgICAgIHsgICAweDMwLCAgNyB9LAorICAgICAgICB7ICAgMHhDNSwgIDkgfSwKKyAgICAgICAgeyAgMHg2MjEsIDEyIH0sCisgICAgICAgIHsgIDB4NjIwLCAxMiB9LAorICAgICAgICB7ICAgMHgxRiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MzMsICA3IH0sCisgICAgICAgIHsgICAgMHgxLCAgMyB9LAorICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgICAweEUsICA0IH0sCisgICAgICAgIHsgICAgMHhELCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgICAgMHhELCAgNSB9LAorICAgICAgICB7ICAgMHgyNiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MjcsICA2IH0sCisgICAgICAgIHsgICAweDE0LCAgNiB9LAorICAgICAgICB7ICAgMHg2MywgIDggfSwKKyAgICAgICAgeyAgMHgxODksIDEwIH0sCisgICAgICAgIHsgIDB4NjIzLCAxMiB9LAorICAgICAgICB7ICAweDYyMiwgMTIgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAweDEyLCAgNSB9LAorICAgICAgICB7ICAgMHgzRCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MjIsICA2IH0sCisgICAgICAgIHsgICAweDE1LCAgNiB9LAorICAgICAgICB7ICAgIDB4QiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MjMsICA2IH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgMHgxMCwgIDUgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDMsIHRhYmxlIDIgKi8KKyAgICAgICAgeyAgICAweEYsICA0IH0sCisgICAgICAgIHsgICAgMHhDLCAgNSB9LAorICAgICAgICB7ICAgMHg0MywgIDcgfSwKKyAgICAgICAgeyAgIDB4MTAsICA2IH0sCisgICAgICAgIHsgICAweDQ0LCAgOCB9LAorICAgICAgICB7ICAweDExNCwgMTAgfSwKKyAgICAgICAgeyAgMHg0NTUsIDEyIH0sCisgICAgICAgIHsgICAweDE4LCAgNSB9LAorICAgICAgICB7ICAgMHgyMywgIDcgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgICAweEQsICA0IH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgMHgxOSwgIDUgfSwKKyAgICAgICAgeyAgICAweDksICA1IH0sCisgICAgICAgIHsgICAweDE3LCAgNiB9LAorICAgICAgICB7ICAgMHgxNiwgIDYgfSwKKyAgICAgICAgeyAgIDB4NDIsICA3IH0sCisgICAgICAgIHsgICAweDhCLCAgOSB9LAorICAgICAgICB7ICAweDQ1NCwgMTIgfSwKKyAgICAgICAgeyAgMHg0NTcsIDEyIH0sCisgICAgICAgIHsgIDB4NDU2LCAxMiB9LAorICAgICAgICB7ICAgIDB4QiwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTUsICA1IH0sCisgICAgICAgIHsgICAgMHhBLCAgNSB9LAorICAgICAgICB7ICAgMHgyOSwgIDYgfSwKKyAgICAgICAgeyAgIDB4MjAsICA2IH0sCisgICAgICAgIHsgICAgMHhELCAgNSB9LAorICAgICAgICB7ICAgMHgyOCwgIDYgfSwKKyAgICAgICAgeyAgICAweDcsICA0IH0sCisgICAgICAgIHsgICAweDExLCAgNSB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMywgdGFibGUgMyAqLworICAgICAgICB7ICAgIDB4MSwgIDMgfSwKKyAgICAgICAgeyAgIDB4MUEsICA1IH0sCisgICAgICAgIHsgICAweDI5LCAgNiB9LAorICAgICAgICB7ICAgMHgyQSwgIDYgfSwKKyAgICAgICAgeyAgIDB4QTAsICA4IH0sCisgICAgICAgIHsgIDB4Mjg1LCAxMCB9LAorICAgICAgICB7IDB4MTQyNSwgMTMgfSwKKyAgICAgICAgeyAgICAweDIsICA1IH0sCisgICAgICAgIHsgICAgMHgwLCAgNyB9LAorICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgICAweDMsICAzIH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAgIDB4QiwgIDQgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAweDEyLCAgNSB9LAorICAgICAgICB7ICAgIDB4MSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NTEsICA3IH0sCisgICAgICAgIHsgICAgMHgxLCAgNyB9LAorICAgICAgICB7ICAweDE0MywgIDkgfSwKKyAgICAgICAgeyAgMHg1MDgsIDExIH0sCisgICAgICAgIHsgMHgxNDI0LCAxMyB9LAorICAgICAgICB7IDB4MTQyNywgMTMgfSwKKyAgICAgICAgeyAweDE0MjYsIDEzIH0sCisgICAgICAgIHsgICAgMHhGLCAgNCB9LAorICAgICAgICB7ICAgMHgxQywgIDUgfSwKKyAgICAgICAgeyAgICAweDMsICA1IH0sCisgICAgICAgIHsgICAweDM3LCAgNiB9LAorICAgICAgICB7ICAgMHgyQiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MTMsICA1IH0sCisgICAgICAgIHsgICAweDM2LCAgNiB9LAorICAgICAgICB7ICAgMHgxRCwgIDUgfSwKKyAgICAgICAgeyAgICAweDEsICA1IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAzLCB0YWJsZSA0ICovCisgICAgICAgIHsgICAgMHg0LCAgMyB9LAorICAgICAgICB7ICAgMHgxRiwgIDUgfSwKKyAgICAgICAgeyAgIDB4M0QsICA2IH0sCisgICAgICAgIHsgICAgMHg2LCAgNSB9LAorICAgICAgICB7ICAgMHgxNiwgIDcgfSwKKyAgICAgICAgeyAgIDB4NTMsICA5IH0sCisgICAgICAgIHsgIDB4MTRBLCAxMSB9LAorICAgICAgICB7ICAgMHgzNCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MkEsICA4IH0sCisgICAgICAgIHsgICAgMHgyLCAgMyB9LAorICAgICAgICB7ICAgIDB4MywgIDMgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAgMHgxQywgIDUgfSwKKyAgICAgICAgeyAgIDB4MzcsICA2IH0sCisgICAgICAgIHsgICAweDE3LCAgNyB9LAorICAgICAgICB7ICAgMHgyQiwgIDggfSwKKyAgICAgICAgeyAgIDB4MjgsICA4IH0sCisgICAgICAgIHsgICAweEE0LCAxMCB9LAorICAgICAgICB7ICAweDUyRCwgMTMgfSwKKyAgICAgICAgeyAgMHg1MkMsIDEzIH0sCisgICAgICAgIHsgIDB4NTJGLCAxMyB9LAorICAgICAgICB7ICAweDUyRSwgMTMgfSwKKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAweDFELCAgNSB9LAorICAgICAgICB7ICAgIDB4NywgIDUgfSwKKyAgICAgICAgeyAgICAweDQsICA1IH0sCisgICAgICAgIHsgICAweDM1LCAgNiB9LAorICAgICAgICB7ICAgMHgxNCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MzYsICA2IH0sCisgICAgICAgIHsgICAweDE1LCAgNSB9LAorICAgICAgICB7ICAgMHgzQywgIDYgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDMsIHRhYmxlIDUgKi8KKyAgICAgICAgeyAgICAweDQsICAzIH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgIDB4NywgIDUgfSwKKyAgICAgICAgeyAgIDB4MUQsICA1IH0sCisgICAgICAgIHsgICAgMHg5LCAgNiB9LAorICAgICAgICB7ICAweDFGMywgIDkgfSwKKyAgICAgICAgeyAgMHg3QzcsIDExIH0sCisgICAgICAgIHsgICAgMHg4LCAgNiB9LAorICAgICAgICB7ICAweDFGMCwgIDkgfSwKKyAgICAgICAgeyAgICAweDMsICAzIH0sCisgICAgICAgIHsgICAgMHgyLCAgMyB9LAorICAgICAgICB7ICAgIDB4RCwgIDQgfSwKKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAweDE3LCAgNSB9LAorICAgICAgICB7ICAgMHg3RCwgIDcgfSwKKyAgICAgICAgeyAgMHgxRjIsICA5IH0sCisgICAgICAgIHsgIDB4N0M2LCAxMSB9LAorICAgICAgICB7ICAweDdDNSwgMTEgfSwKKyAgICAgICAgeyAweDFGMTIsIDEzIH0sCisgICAgICAgIHsgMHgzRTI3LCAxNCB9LAorICAgICAgICB7IDB4M0UyNiwgMTQgfSwKKyAgICAgICAgeyAweDFGMTEsIDEzIH0sCisgICAgICAgIHsgMHgxRjEwLCAxMyB9LAorICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgIDB4MUUsICA1IH0sCisgICAgICAgIHsgICAgMHg2LCAgNSB9LAorICAgICAgICB7ICAgMHgzOSwgIDYgfSwKKyAgICAgICAgeyAgIDB4MzgsICA2IH0sCisgICAgICAgIHsgICAweDNGLCAgNiB9LAorICAgICAgICB7ICAgMHgyQywgIDYgfSwKKyAgICAgICAgeyAgICAweDUsICA1IH0sCisgICAgICAgIHsgICAweDJELCAgNiB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMywgdGFibGUgNiAqLworICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgICAweDcsICA0IH0sCisgICAgICAgIHsgICAweDE4LCAgNSB9LAorICAgICAgICB7ICAgIDB4MywgIDQgfSwKKyAgICAgICAgeyAgICAweDUsICA1IH0sCisgICAgICAgIHsgICAweDM1LCAgNyB9LAorICAgICAgICB7ICAgMHg0RiwgIDkgfSwKKyAgICAgICAgeyAgIDB4MTIsICA3IH0sCisgICAgICAgIHsgIDB4NEU1LCAxMyB9LAorICAgICAgICB7ICAgIDB4NSwgIDMgfSwKKyAgICAgICAgeyAgICAweDQsICAzIH0sCisgICAgICAgIHsgICAgMHhELCAgNCB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MzMsICA2IH0sCisgICAgICAgIHsgICAweDI2LCAgOCB9LAorICAgICAgICB7ICAgMHg5RCwgMTAgfSwKKyAgICAgICAgeyAgMHg0RTQsIDEzIH0sCisgICAgICAgIHsgIDB4NEU3LCAxMyB9LAorICAgICAgICB7ICAweDRFNiwgMTMgfSwKKyAgICAgICAgeyAgMHg0RTEsIDEzIH0sCisgICAgICAgIHsgIDB4NEUwLCAxMyB9LAorICAgICAgICB7ICAweDRFMywgMTMgfSwKKyAgICAgICAgeyAgMHg0RTIsIDEzIH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgMHgxRiwgIDUgfSwKKyAgICAgICAgeyAgICAweEMsICA1IH0sCisgICAgICAgIHsgICAweDNELCAgNiB9LAorICAgICAgICB7ICAgMHgzQywgIDYgfSwKKyAgICAgICAgeyAgIDB4MzIsICA2IH0sCisgICAgICAgIHsgICAweDM0LCAgNyB9LAorICAgICAgICB7ICAgMHgxQiwgIDYgfSwKKyAgICAgICAgeyAgICAweDgsICA2IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAzLCB0YWJsZSA3ICovCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4NCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUMsICA1IH0sCisgICAgICAgIHsgICAgMHhGLCAgNCB9LAorICAgICAgICB7ICAgIDB4MiwgIDQgfSwKKyAgICAgICAgeyAgICAweDcsICA1IH0sCisgICAgICAgIHsgICAweDc1LCAgNyB9LAorICAgICAgICB7ICAgMHhFOCwgIDggfSwKKyAgICAgICAgeyAweDFEMkEsIDEzIH0sCisgICAgICAgIHsgICAgMHg1LCAgMyB9LAorICAgICAgICB7ICAgIDB4NCwgIDMgfSwKKyAgICAgICAgeyAgICAweEQsICA0IH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAgMHg3NywgIDcgfSwKKyAgICAgICAgeyAgMHhFOTYsIDEyIH0sCisgICAgICAgIHsgMHgzQTU3LCAxNCB9LAorICAgICAgICB7IDB4M0E1NiwgMTQgfSwKKyAgICAgICAgeyAweDNBNUQsIDE0IH0sCisgICAgICAgIHsgMHgzQTVDLCAxNCB9LAorICAgICAgICB7IDB4M0E1RiwgMTQgfSwKKyAgICAgICAgeyAweDNBNUUsIDE0IH0sCisgICAgICAgIHsgMHgxRDI5LCAxMyB9LAorICAgICAgICB7IDB4MUQyOCwgMTMgfSwKKyAgICAgICAgeyAgICAweDMsICAzIH0sCisgICAgICAgIHsgICAgMHg2LCAgNSB9LAorICAgICAgICB7ICAgIDB4QSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MkMsICA3IH0sCisgICAgICAgIHsgICAweDE3LCAgNiB9LAorICAgICAgICB7ICAgMHg3NiwgIDcgfSwKKyAgICAgICAgeyAgMHgxRDMsICA5IH0sCisgICAgICAgIHsgIDB4M0E0LCAxMCB9LAorICAgICAgICB7ICAgMHgyRCwgIDcgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDMsIHRhYmxlIDggKi8KKyAgICAgICAgeyAgICAweEEsICA0IH0sCisgICAgICAgIHsgICAweDI0LCAgNiB9LAorICAgICAgICB7ICAgMHhCRiwgIDggfSwKKyAgICAgICAgeyAgIDB4ODUsICA4IH0sCisgICAgICAgIHsgIDB4MjExLCAxMCB9LAorICAgICAgICB7ICAweDg0MiwgMTIgfSwKKyAgICAgICAgeyAweDEwODcsIDEzIH0sCisgICAgICAgIHsgICAweDE4LCAgNSB9LAorICAgICAgICB7ICAgMHgyMCwgIDYgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHgyLCAgMyB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgICAweEQsICA0IH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgMHgxMywgIDUgfSwKKyAgICAgICAgeyAgIDB4MjUsICA2IH0sCisgICAgICAgIHsgICAweDVFLCAgNyB9LAorICAgICAgICB7ICAgMHg0MywgIDcgfSwKKyAgICAgICAgeyAgIDB4QkUsICA4IH0sCisgICAgICAgIHsgIDB4MTA5LCAgOSB9LAorICAgICAgICB7IDB4MTA4NiwgMTMgfSwKKyAgICAgICAgeyAgMHg4NDEsIDEyIH0sCisgICAgICAgIHsgIDB4ODQwLCAxMiB9LAorICAgICAgICB7ICAgIDB4RiwgIDQgfSwKKyAgICAgICAgeyAgICAweDEsICA0IH0sCisgICAgICAgIHsgICAweDExLCAgNSB9LAorICAgICAgICB7ICAgIDB4MCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MkUsICA2IH0sCisgICAgICAgIHsgICAweDE5LCAgNSB9LAorICAgICAgICB7ICAgIDB4MSwgIDUgfSwKKyAgICAgICAgeyAgICAweDYsICA0IH0sCisgICAgICAgIHsgICAweDE2LCAgNSB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgMywgdGFibGUgOSAqLworICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgICAweEYsICA1IH0sCisgICAgICAgIHsgICAweDZGLCAgNyB9LAorICAgICAgICB7ICAgMHg2MSwgIDcgfSwKKyAgICAgICAgeyAgMHgzNzQsIDEwIH0sCisgICAgICAgIHsgMHgxQkE4LCAxMyB9LAorICAgICAgICB7IDB4Mzc1MywgMTQgfSwKKyAgICAgICAgeyAgIDB4MTIsICA1IH0sCisgICAgICAgIHsgICAweDM2LCAgNiB9LAorICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgIDB4QiwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUEsICA1IH0sCisgICAgICAgIHsgICAweDMxLCAgNiB9LAorICAgICAgICB7ICAgMHg2MCwgIDcgfSwKKyAgICAgICAgeyAgIDB4REMsICA4IH0sCisgICAgICAgIHsgIDB4MUJCLCAgOSB9LAorICAgICAgICB7ICAweDZFQiwgMTEgfSwKKyAgICAgICAgeyAweDFCQUIsIDEzIH0sCisgICAgICAgIHsgMHgzNzUyLCAxNCB9LAorICAgICAgICB7IDB4Mzc1NSwgMTQgfSwKKyAgICAgICAgeyAweDM3NTQsIDE0IH0sCisgICAgICAgIHsgICAgMHhFLCAgNCB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgIDB4MTMsICA1IH0sCisgICAgICAgIHsgICAgMHhFLCAgNSB9LAorICAgICAgICB7ICAgMHgzRSwgIDYgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAweDFFLCAgNSB9LAorICAgICAgICB7ICAgMHgxOSwgIDUgfSwKKyAgICAgICAgeyAgIDB4M0YsICA2IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAzLCB0YWJsZSAxMCAqLworICAgICAgICB7ICAgIDB4MywgIDMgfSwKKyAgICAgICAgeyAgIDB4MUMsICA1IH0sCisgICAgICAgIHsgICAweDI1LCAgNiB9LAorICAgICAgICB7ICAgMHgyNCwgIDYgfSwKKyAgICAgICAgeyAgMHgxREEsICA5IH0sCisgICAgICAgIHsgMHgxREJELCAxMyB9LAorICAgICAgICB7IDB4M0I3QywgMTQgfSwKKyAgICAgICAgeyAgIDB4M0MsICA2IH0sCisgICAgICAgIHsgICAweDNELCAgNiB9LAorICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHhCLCAgNCB9LAorICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgICAweEIsICA1IH0sCisgICAgICAgIHsgICAweDc3LCAgNyB9LAorICAgICAgICB7ICAgMHhFQywgIDggfSwKKyAgICAgICAgeyAgMHgzQjYsIDEwIH0sCisgICAgICAgIHsgIDB4NzZFLCAxMSB9LAorICAgICAgICB7IDB4MURCRiwgMTMgfSwKKyAgICAgICAgeyAweDc2RkIsIDE1IH0sCisgICAgICAgIHsgMHg3NkZBLCAxNSB9LAorICAgICAgICB7IDB4M0I3OSwgMTQgfSwKKyAgICAgICAgeyAweDNCNzgsIDE0IH0sCisgICAgICAgIHsgICAgMHhELCAgNCB9LAorICAgICAgICB7ICAgMHgxRiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTMsICA1IH0sCisgICAgICAgIHsgICAgMHhBLCAgNSB9LAorICAgICAgICB7ICAgIDB4OCwgIDUgfSwKKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAgMHg4LCAgNCB9LAorICAgICAgICB7ICAgIDB4OSwgIDUgfSwKKyAgICAgICAgeyAgIDB4M0EsICA2IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAzLCB0YWJsZSAxMSAqLworICAgICAgICB7ICAgIDB4NSwgIDMgfSwKKyAgICAgICAgeyAgICAweDMsICA0IH0sCisgICAgICAgIHsgICAgMHg0LCAgNSB9LAorICAgICAgICB7ICAgMHgxMCwgIDUgfSwKKyAgICAgICAgeyAgIDB4OEYsICA4IH0sCisgICAgICAgIHsgIDB4NDc1LCAxMSB9LAorICAgICAgICB7IDB4MTFEMSwgMTMgfSwKKyAgICAgICAgeyAgIDB4NzksICA3IH0sCisgICAgICAgIHsgICAweDI3LCAgNiB9LAorICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgICAweDMsICAzIH0sCisgICAgICAgIHsgICAgMHgxLCAgNCB9LAorICAgICAgICB7ICAgIDB4MCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MjYsICA2IH0sCisgICAgICAgIHsgICAweDQ2LCAgNyB9LAorICAgICAgICB7ICAweDExQywgIDkgfSwKKyAgICAgICAgeyAgMHg0NzcsIDExIH0sCisgICAgICAgIHsgIDB4OEVELCAxMiB9LAorICAgICAgICB7IDB4MTFEMCwgMTMgfSwKKyAgICAgICAgeyAweDExRDMsIDEzIH0sCisgICAgICAgIHsgMHgxMUQyLCAxMyB9LAorICAgICAgICB7IDB4MTFEOSwgMTMgfSwKKyAgICAgICAgeyAweDExRDgsIDEzIH0sCisgICAgICAgIHsgICAgMHhELCAgNCB9LAorICAgICAgICB7ICAgMHgxRiwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTIsICA1IH0sCisgICAgICAgIHsgICAgMHg1LCAgNSB9LAorICAgICAgICB7ICAgMHgzRCwgIDYgfSwKKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAgMHhFLCAgNCB9LAorICAgICAgICB7ICAgMHgyMiwgIDYgfSwKKyAgICAgICAgeyAgIDB4NzgsICA3IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAzLCB0YWJsZSAxMiAqLworICAgICAgICB7ICAgIDB4NSwgIDMgfSwKKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAweDFCLCAgNSB9LAorICAgICAgICB7ICAgIDB4MCwgIDQgfSwKKyAgICAgICAgeyAgICAweDYsICA2IH0sCisgICAgICAgIHsgIDB4M0UyLCAxMCB9LAorICAgICAgICB7IDB4M0UzRCwgMTQgfSwKKyAgICAgICAgeyAgICAweEYsICA3IH0sCisgICAgICAgIHsgICAweDM0LCAgNiB9LAorICAgICAgICB7ICAgIDB4MywgIDMgfSwKKyAgICAgICAgeyAgICAweDIsICAzIH0sCisgICAgICAgIHsgICAweDFFLCAgNSB9LAorICAgICAgICB7ICAgMHgxRCwgIDUgfSwKKyAgICAgICAgeyAgIDB4N0QsICA3IH0sCisgICAgICAgIHsgIDB4MUYwLCAgOSB9LAorICAgICAgICB7ICAweDdDNiwgMTEgfSwKKyAgICAgICAgeyAweDNFM0MsIDE0IH0sCisgICAgICAgIHsgMHgzRTNGLCAxNCB9LAorICAgICAgICB7IDB4M0UzRSwgMTQgfSwKKyAgICAgICAgeyAweDNFMzksIDE0IH0sCisgICAgICAgIHsgMHgzRTM4LCAxNCB9LAorICAgICAgICB7IDB4M0UzQiwgMTQgfSwKKyAgICAgICAgeyAweDNFM0EsIDE0IH0sCisgICAgICAgIHsgICAgMHg4LCAgNCB9LAorICAgICAgICB7ICAgMHgxQywgIDUgfSwKKyAgICAgICAgeyAgICAweDIsICA1IH0sCisgICAgICAgIHsgICAweDNGLCAgNiB9LAorICAgICAgICB7ICAgMHgzNSwgIDYgfSwKKyAgICAgICAgeyAgICAweDksICA0IH0sCisgICAgICAgIHsgICAgMHgxLCAgMyB9LAorICAgICAgICB7ICAgIDB4RSwgIDcgfSwKKyAgICAgICAgeyAgIDB4RjksICA4IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAzLCB0YWJsZSAxMyAqLworICAgICAgICB7ICAgIDB4NCwgIDMgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAgMHgxLCAgNCB9LAorICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUUsICA2IH0sCisgICAgICAgIHsgICAweEUwLCAgOSB9LAorICAgICAgICB7ICAweEUxRSwgMTMgfSwKKyAgICAgICAgeyAgIDB4NzEsICA4IH0sCisgICAgICAgIHsgICAweDM5LCAgNyB9LAorICAgICAgICB7ICAgIDB4NywgIDMgfSwKKyAgICAgICAgeyAgICAweDYsICAzIH0sCisgICAgICAgIHsgICAgMHhELCAgNSB9LAorICAgICAgICB7ICAgIDB4QywgIDUgfSwKKyAgICAgICAgeyAgIDB4MjAsICA3IH0sCisgICAgICAgIHsgIDB4MUMyLCAxMCB9LAorICAgICAgICB7IDB4MUMzRiwgMTQgfSwKKyAgICAgICAgeyAweDFDM0UsIDE0IH0sCisgICAgICAgIHsgIDB4RTE5LCAxMyB9LAorICAgICAgICB7ICAweEUxOCwgMTMgfSwKKyAgICAgICAgeyAgMHhFMUIsIDEzIH0sCisgICAgICAgIHsgIDB4RTFBLCAxMyB9LAorICAgICAgICB7ICAweEUxRCwgMTMgfSwKKyAgICAgICAgeyAgMHhFMUMsIDEzIH0sCisgICAgICAgIHsgICAgMHgwLCAgNCB9LAorICAgICAgICB7ICAgIDB4OSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUQsICA2IH0sCisgICAgICAgIHsgICAweDFGLCAgNiB9LAorICAgICAgICB7ICAgMHgxMSwgIDYgfSwKKyAgICAgICAgeyAgICAweDUsICA0IH0sCisgICAgICAgIHsgICAgMHgxLCAgMyB9LAorICAgICAgICB7ICAgMHg0MywgIDggfSwKKyAgICAgICAgeyAgIDB4NDIsICA4IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAzLCB0YWJsZSAxNCAqLworICAgICAgICB7ICAgIDB4NCwgIDMgfSwKKyAgICAgICAgeyAgICAweEQsICA0IH0sCisgICAgICAgIHsgICAgMHg3LCAgNCB9LAorICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgIDB4MTQsICA1IH0sCisgICAgICAgIHsgIDB4MTZDLCAgOSB9LAorICAgICAgICB7IDB4MTZEMSwgMTMgfSwKKyAgICAgICAgeyAgMHgyREYsIDEwIH0sCisgICAgICAgIHsgIDB4MTZFLCAgOSB9LAorICAgICAgICB7ICAgIDB4MCwgIDIgfSwKKyAgICAgICAgeyAgICAweDcsICAzIH0sCisgICAgICAgIHsgICAweDJDLCAgNiB9LAorICAgICAgICB7ICAgMHgyQiwgIDYgfSwKKyAgICAgICAgeyAgMHgyREUsIDEwIH0sCisgICAgICAgIHsgMHgxNkQwLCAxMyB9LAorICAgICAgICB7IDB4MTZEMywgMTMgfSwKKyAgICAgICAgeyAweDE2RDIsIDEzIH0sCisgICAgICAgIHsgMHgyREI1LCAxNCB9LAorICAgICAgICB7IDB4MkRCNCwgMTQgfSwKKyAgICAgICAgeyAweDJEQjcsIDE0IH0sCisgICAgICAgIHsgMHgyREI2LCAxNCB9LAorICAgICAgICB7IDB4MTZEOSwgMTMgfSwKKyAgICAgICAgeyAweDE2RDgsIDEzIH0sCisgICAgICAgIHsgICAgMHhDLCAgNSB9LAorICAgICAgICB7ICAgMHgyQSwgIDYgfSwKKyAgICAgICAgeyAgIDB4NUEsICA3IH0sCisgICAgICAgIHsgICAweDFCLCAgNiB9LAorICAgICAgICB7ICAgMHgxQSwgIDYgfSwKKyAgICAgICAgeyAgIDB4MTcsICA1IH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAweDVCNywgMTEgfSwKKyAgICAgICAgeyAgMHg1QjUsIDExIH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCAzLCB0YWJsZSAxNSAqLworICAgICAgICB7ICAgIDB4MiwgIDIgfSwKKyAgICAgICAgeyAgICAweEYsICA0IH0sCisgICAgICAgIHsgICAweDFDLCAgNSB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgIDB4M0IsICA2IH0sCisgICAgICAgIHsgIDB4MUFDLCAgOSB9LAorICAgICAgICB7IDB4MUFEOCwgMTMgfSwKKyAgICAgICAgeyAweDM1QjMsIDE0IH0sCisgICAgICAgIHsgMHgzNUIyLCAxNCB9LAorICAgICAgICB7ICAgIDB4MSwgIDIgfSwKKyAgICAgICAgeyAgICAweDAsICAyIH0sCisgICAgICAgIHsgICAweDY5LCAgNyB9LAorICAgICAgICB7ICAgMHg2OCwgIDcgfSwKKyAgICAgICAgeyAweDM1QkQsIDE0IH0sCisgICAgICAgIHsgMHgzNUJDLCAxNCB9LAorICAgICAgICB7IDB4MzVCRiwgMTQgfSwKKyAgICAgICAgeyAweDM1QkUsIDE0IH0sCisgICAgICAgIHsgMHgzNUI5LCAxNCB9LAorICAgICAgICB7IDB4MzVCOCwgMTQgfSwKKyAgICAgICAgeyAweDM1QkIsIDE0IH0sCisgICAgICAgIHsgMHgzNUJBLCAxNCB9LAorICAgICAgICB7IDB4MzVCNSwgMTQgfSwKKyAgICAgICAgeyAweDM1QjQsIDE0IH0sCisgICAgICAgIHsgIDB4MUE5LCAgOSB9LAorICAgICAgICB7ICAweDFBOCwgIDkgfSwKKyAgICAgICAgeyAgMHgzNUEsIDEwIH0sCisgICAgICAgIHsgICAweEQ3LCAgOCB9LAorICAgICAgICB7ICAgMHhENSwgIDggfSwKKyAgICAgICAgeyAgIDB4M0EsICA2IH0sCisgICAgICAgIHsgICAweDFCLCAgNSB9LAorICAgICAgICB7IDB4MzVCNywgMTQgfSwKKyAgICAgICAgeyAweDM1QjYsIDE0IH0KKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYWNfYmlhc18zWzE2XVszMl1bMl0gPSB7CisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDQsIHRhYmxlIDAgKi8KKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAweDEwLCAgNSB9LAorICAgICAgICB7ICAgMHg3MiwgIDcgfSwKKyAgICAgICAgeyAgIDB4NzEsICA3IH0sCisgICAgICAgIHsgIDB4MTU0LCAgOSB9LAorICAgICAgICB7ICAweEFBQiwgMTIgfSwKKyAgICAgICAgeyAgMHhBQTgsIDEyIH0sCisgICAgICAgIHsgICAweDE0LCAgNSB9LAorICAgICAgICB7ICAgMHg3MCwgIDcgfSwKKyAgICAgICAgeyAgICAweDIsICAzIH0sCisgICAgICAgIHsgICAgMHgzLCAgMyB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAgMHgzLCAgNCB9LAorICAgICAgICB7ICAgMHgxMSwgIDUgfSwKKyAgICAgICAgeyAgIDB4NzMsICA3IH0sCisgICAgICAgIHsgICAweDU0LCAgNyB9LAorICAgICAgICB7ICAgMHhBQiwgIDggfSwKKyAgICAgICAgeyAgMHgyQUIsIDEwIH0sCisgICAgICAgIHsgMHgxNTUzLCAxMyB9LAorICAgICAgICB7IDB4MTU1MiwgMTMgfSwKKyAgICAgICAgeyAweDE1NTUsIDEzIH0sCisgICAgICAgIHsgMHgxNTU0LCAxMyB9LAorICAgICAgICB7ICAgIDB4RCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUUsICA1IH0sCisgICAgICAgIHsgICAweDEyLCAgNSB9LAorICAgICAgICB7ICAgMHgzRSwgIDYgfSwKKyAgICAgICAgeyAgIDB4MkIsICA2IH0sCisgICAgICAgIHsgICAgMHgyLCAgNCB9LAorICAgICAgICB7ICAgMHgzRiwgIDYgfSwKKyAgICAgICAgeyAgIDB4MUQsICA1IH0sCisgICAgICAgIHsgICAweDEzLCAgNSB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgNCwgdGFibGUgMSAqLworICAgICAgICB7ICAgIDB4MywgIDMgfSwKKyAgICAgICAgeyAgIDB4MUYsICA1IH0sCisgICAgICAgIHsgICAweDI5LCAgNiB9LAorICAgICAgICB7ICAgMHgzRCwgIDYgfSwKKyAgICAgICAgeyAgICAweEMsICA3IH0sCisgICAgICAgIHsgICAweDY5LCAxMCB9LAorICAgICAgICB7ICAweDM0NSwgMTMgfSwKKyAgICAgICAgeyAgICAweDIsICA1IH0sCisgICAgICAgIHsgICAweDI4LCAgNiB9LAorICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHhFLCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgIDB4MTUsICA1IH0sCisgICAgICAgIHsgICAgMHg3LCAgNiB9LAorICAgICAgICB7ICAgMHgxQiwgIDggfSwKKyAgICAgICAgeyAgIDB4NkIsIDEwIH0sCisgICAgICAgIHsgICAweDZBLCAxMCB9LAorICAgICAgICB7ICAweDM0NCwgMTMgfSwKKyAgICAgICAgeyAgMHgzNDcsIDEzIH0sCisgICAgICAgIHsgIDB4MzQ2LCAxMyB9LAorICAgICAgICB7ICAweDFBMSwgMTIgfSwKKyAgICAgICAgeyAgMHgxQTAsIDEyIH0sCisgICAgICAgIHsgICAgMHhCLCAgNCB9LAorICAgICAgICB7ICAgMHgxQSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTIsICA1IH0sCisgICAgICAgIHsgICAgMHgwLCAgNSB9LAorICAgICAgICB7ICAgMHgzQywgIDYgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAweDFCLCAgNSB9LAorICAgICAgICB7ICAgMHgxMywgIDUgfSwKKyAgICAgICAgeyAgICAweDEsICA1IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCA0LCB0YWJsZSAyICovCisgICAgICAgIHsgICAgMHg0LCAgMyB9LAorICAgICAgICB7ICAgIDB4NCwgIDQgfSwKKyAgICAgICAgeyAgIDB4M0YsICA2IH0sCisgICAgICAgIHsgICAweDE0LCAgNSB9LAorICAgICAgICB7ICAgMHg1NiwgIDcgfSwKKyAgICAgICAgeyAgMHgxNUMsICA5IH0sCisgICAgICAgIHsgMHgxNUQ1LCAxMyB9LAorICAgICAgICB7ICAgMHgzQywgIDYgfSwKKyAgICAgICAgeyAgIDB4MkEsICA2IH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4MSwgIDMgfSwKKyAgICAgICAgeyAgICAweEUsICA0IH0sCisgICAgICAgIHsgICAgMHhELCAgNCB9LAorICAgICAgICB7ICAgIDB4QywgIDUgfSwKKyAgICAgICAgeyAgIDB4QUYsICA4IH0sCisgICAgICAgIHsgIDB4MkJCLCAxMCB9LAorICAgICAgICB7IDB4MTVENCwgMTMgfSwKKyAgICAgICAgeyAweDE1RDcsIDEzIH0sCisgICAgICAgIHsgMHgxNUQ2LCAxMyB9LAorICAgICAgICB7IDB4MTVEMSwgMTMgfSwKKyAgICAgICAgeyAweDE1RDAsIDEzIH0sCisgICAgICAgIHsgMHgxNUQzLCAxMyB9LAorICAgICAgICB7IDB4MTVEMiwgMTMgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAweDE5LCAgNSB9LAorICAgICAgICB7ICAgIDB4RCwgIDUgfSwKKyAgICAgICAgeyAgIDB4M0UsICA2IH0sCisgICAgICAgIHsgICAweDMxLCAgNiB9LAorICAgICAgICB7ICAgIDB4NywgIDQgfSwKKyAgICAgICAgeyAgICAweDUsICA0IH0sCisgICAgICAgIHsgICAweDNELCAgNiB9LAorICAgICAgICB7ICAgMHgzMCwgIDYgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDQsIHRhYmxlIDMgKi8KKyAgICAgICAgeyAgICAweDUsICAzIH0sCisgICAgICAgIHsgICAgMHg4LCAgNCB9LAorICAgICAgICB7ICAgMHgxQSwgIDUgfSwKKyAgICAgICAgeyAgICAweDAsICA0IH0sCisgICAgICAgIHsgICAweDM2LCAgNiB9LAorICAgICAgICB7ICAgMHgxMSwgIDggfSwKKyAgICAgICAgeyAgMHgxMDYsIDEyIH0sCisgICAgICAgIHsgICAgMHhBLCAgNyB9LAorICAgICAgICB7ICAgMHg2RSwgIDcgfSwKKyAgICAgICAgeyAgICAweDIsICAzIH0sCisgICAgICAgIHsgICAgMHgzLCAgMyB9LAorICAgICAgICB7ICAgIDB4MywgIDQgfSwKKyAgICAgICAgeyAgICAweDIsICA0IH0sCisgICAgICAgIHsgICAweDZGLCAgNyB9LAorICAgICAgICB7ICAgMHgyMSwgIDkgfSwKKyAgICAgICAgeyAgMHgyMEYsIDEzIH0sCisgICAgICAgIHsgIDB4MjBFLCAxMyB9LAorICAgICAgICB7ICAweDEwMSwgMTIgfSwKKyAgICAgICAgeyAgMHgxMDAsIDEyIH0sCisgICAgICAgIHsgIDB4MTAzLCAxMiB9LAorICAgICAgICB7ICAweDEwMiwgMTIgfSwKKyAgICAgICAgeyAgMHgxMDUsIDEyIH0sCisgICAgICAgIHsgIDB4MTA0LCAxMiB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgIDB4MUUsICA1IH0sCisgICAgICAgIHsgICAgMHgzLCAgNSB9LAorICAgICAgICB7ICAgMHgzRSwgIDYgfSwKKyAgICAgICAgeyAgIDB4M0YsICA2IH0sCisgICAgICAgIHsgICAgMHg5LCAgNCB9LAorICAgICAgICB7ICAgIDB4RSwgIDQgfSwKKyAgICAgICAgeyAgICAweEIsICA3IH0sCisgICAgICAgIHsgICAgMHg5LCAgNyB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgNCwgdGFibGUgNCAqLworICAgICAgICB7ICAgIDB4MiwgIDMgfSwKKyAgICAgICAgeyAgICAweEUsICA0IH0sCisgICAgICAgIHsgICAweDFFLCAgNSB9LAorICAgICAgICB7ICAgIDB4QywgIDQgfSwKKyAgICAgICAgeyAgIDB4MUYsICA1IH0sCisgICAgICAgIHsgICAweDZFLCAgNyB9LAorICAgICAgICB7ICAgMHhBRCwgMTAgfSwKKyAgICAgICAgeyAgIDB4QUYsIDEwIH0sCisgICAgICAgIHsgICAweDE0LCAgNyB9LAorICAgICAgICB7ICAgIDB4NCwgIDMgfSwKKyAgICAgICAgeyAgICAweDMsICAzIH0sCisgICAgICAgIHsgICAweDFBLCAgNSB9LAorICAgICAgICB7ICAgMHgxNywgIDUgfSwKKyAgICAgICAgeyAgIDB4MkEsICA4IH0sCisgICAgICAgIHsgIDB4NTc2LCAxMyB9LAorICAgICAgICB7ICAweEFFRiwgMTQgfSwKKyAgICAgICAgeyAgMHhBRUUsIDE0IH0sCisgICAgICAgIHsgIDB4NTcxLCAxMyB9LAorICAgICAgICB7ICAweDU3MCwgMTMgfSwKKyAgICAgICAgeyAgMHg1NzMsIDEzIH0sCisgICAgICAgIHsgIDB4NTcyLCAxMyB9LAorICAgICAgICB7ICAweDU3NSwgMTMgfSwKKyAgICAgICAgeyAgMHg1NzQsIDEzIH0sCisgICAgICAgIHsgICAgMHgzLCAgNCB9LAorICAgICAgICB7ICAgMHgxNiwgIDUgfSwKKyAgICAgICAgeyAgICAweDQsICA1IH0sCisgICAgICAgIHsgICAweDM2LCAgNiB9LAorICAgICAgICB7ICAgIDB4QiwgIDYgfSwKKyAgICAgICAgeyAgICAweEEsICA0IH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgMHg2RiwgIDcgfSwKKyAgICAgICAgeyAgIDB4QUMsIDEwIH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCA0LCB0YWJsZSA1ICovCisgICAgICAgIHsgICAgMHg0LCAgMyB9LAorICAgICAgICB7ICAgIDB4NSwgIDQgfSwKKyAgICAgICAgeyAgICAweDMsICAzIH0sCisgICAgICAgIHsgICAgMHgxLCAgMyB9LAorICAgICAgICB7ICAgIDB4NCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MkYsICA2IH0sCisgICAgICAgIHsgIDB4NTI2LCAxMSB9LAorICAgICAgICB7IDB4MTQ5NSwgMTMgfSwKKyAgICAgICAgeyAgIDB4QTYsICA4IH0sCisgICAgICAgIHsgICAgMHg3LCAgMyB9LAorICAgICAgICB7ICAgIDB4NiwgIDMgfSwKKyAgICAgICAgeyAgIDB4MkQsICA2IH0sCisgICAgICAgIHsgICAweDJDLCAgNiB9LAorICAgICAgICB7IDB4MTQ5NCwgMTMgfSwKKyAgICAgICAgeyAweDE0OTcsIDEzIH0sCisgICAgICAgIHsgMHgxNDk2LCAxMyB9LAorICAgICAgICB7IDB4MTQ5MSwgMTMgfSwKKyAgICAgICAgeyAweDE0OTAsIDEzIH0sCisgICAgICAgIHsgMHgxNDkzLCAxMyB9LAorICAgICAgICB7IDB4MTQ5MiwgMTMgfSwKKyAgICAgICAgeyAweDI5M0QsIDE0IH0sCisgICAgICAgIHsgMHgyOTNDLCAxNCB9LAorICAgICAgICB7IDB4MjkzRiwgMTQgfSwKKyAgICAgICAgeyAgICAweDAsICAzIH0sCisgICAgICAgIHsgICAweDI4LCAgNiB9LAorICAgICAgICB7ICAgMHhBNSwgIDggfSwKKyAgICAgICAgeyAgMHgxNDgsICA5IH0sCisgICAgICAgIHsgICAweEE3LCAgOCB9LAorICAgICAgICB7ICAgMHgyRSwgIDYgfSwKKyAgICAgICAgeyAgIDB4MTUsICA1IH0sCisgICAgICAgIHsgIDB4QTRFLCAxMiB9LAorICAgICAgICB7IDB4MjkzRSwgMTQgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDQsIHRhYmxlIDYgKi8KKyAgICAgICAgeyAgICAweDQsICAzIH0sCisgICAgICAgIHsgICAgMHg1LCAgNCB9LAorICAgICAgICB7ICAgIDB4MywgIDMgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHg0LCAgNCB9LAorICAgICAgICB7ICAgMHgyRiwgIDYgfSwKKyAgICAgICAgeyAgMHg1MjYsIDExIH0sCisgICAgICAgIHsgMHgxNDk1LCAxMyB9LAorICAgICAgICB7ICAgMHhBNiwgIDggfSwKKyAgICAgICAgeyAgICAweDcsICAzIH0sCisgICAgICAgIHsgICAgMHg2LCAgMyB9LAorICAgICAgICB7ICAgMHgyRCwgIDYgfSwKKyAgICAgICAgeyAgIDB4MkMsICA2IH0sCisgICAgICAgIHsgMHgxNDk0LCAxMyB9LAorICAgICAgICB7IDB4MTQ5NywgMTMgfSwKKyAgICAgICAgeyAweDE0OTYsIDEzIH0sCisgICAgICAgIHsgMHgxNDkxLCAxMyB9LAorICAgICAgICB7IDB4MTQ5MCwgMTMgfSwKKyAgICAgICAgeyAweDE0OTMsIDEzIH0sCisgICAgICAgIHsgMHgxNDkyLCAxMyB9LAorICAgICAgICB7IDB4MjkzRCwgMTQgfSwKKyAgICAgICAgeyAweDI5M0MsIDE0IH0sCisgICAgICAgIHsgMHgyOTNGLCAxNCB9LAorICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgIDB4MjgsICA2IH0sCisgICAgICAgIHsgICAweEE1LCAgOCB9LAorICAgICAgICB7ICAweDE0OCwgIDkgfSwKKyAgICAgICAgeyAgIDB4QTcsICA4IH0sCisgICAgICAgIHsgICAweDJFLCAgNiB9LAorICAgICAgICB7ICAgMHgxNSwgIDUgfSwKKyAgICAgICAgeyAgMHhBNEUsIDEyIH0sCisgICAgICAgIHsgMHgyOTNFLCAxNCB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgNCwgdGFibGUgNyAqLworICAgICAgICB7ICAgIDB4NCwgIDMgfSwKKyAgICAgICAgeyAgICAweDUsICA0IH0sCisgICAgICAgIHsgICAgMHgzLCAgMyB9LAorICAgICAgICB7ICAgIDB4MSwgIDMgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgICAweDJGLCAgNiB9LAorICAgICAgICB7ICAweDUyNiwgMTEgfSwKKyAgICAgICAgeyAweDE0OTUsIDEzIH0sCisgICAgICAgIHsgICAweEE2LCAgOCB9LAorICAgICAgICB7ICAgIDB4NywgIDMgfSwKKyAgICAgICAgeyAgICAweDYsICAzIH0sCisgICAgICAgIHsgICAweDJELCAgNiB9LAorICAgICAgICB7ICAgMHgyQywgIDYgfSwKKyAgICAgICAgeyAweDE0OTQsIDEzIH0sCisgICAgICAgIHsgMHgxNDk3LCAxMyB9LAorICAgICAgICB7IDB4MTQ5NiwgMTMgfSwKKyAgICAgICAgeyAweDE0OTEsIDEzIH0sCisgICAgICAgIHsgMHgxNDkwLCAxMyB9LAorICAgICAgICB7IDB4MTQ5MywgMTMgfSwKKyAgICAgICAgeyAweDE0OTIsIDEzIH0sCisgICAgICAgIHsgMHgyOTNELCAxNCB9LAorICAgICAgICB7IDB4MjkzQywgMTQgfSwKKyAgICAgICAgeyAweDI5M0YsIDE0IH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgMHgyOCwgIDYgfSwKKyAgICAgICAgeyAgIDB4QTUsICA4IH0sCisgICAgICAgIHsgIDB4MTQ4LCAgOSB9LAorICAgICAgICB7ICAgMHhBNywgIDggfSwKKyAgICAgICAgeyAgIDB4MkUsICA2IH0sCisgICAgICAgIHsgICAweDE1LCAgNSB9LAorICAgICAgICB7ICAweEE0RSwgMTIgfSwKKyAgICAgICAgeyAweDI5M0UsIDE0IH0KKyAgICB9LAorICAgIHsgLyogQUMgYmlhcyBncm91cCA0LCB0YWJsZSA4ICovCisgICAgICAgIHsgICAgMHgzLCAgMyB9LAorICAgICAgICB7ICAgMHgxMSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MjAsICA2IH0sCisgICAgICAgIHsgICAweDc0LCAgNyB9LAorICAgICAgICB7ICAweDEwRCwgIDkgfSwKKyAgICAgICAgeyAgMHg4NjMsIDEyIH0sCisgICAgICAgIHsgIDB4ODYwLCAxMiB9LAorICAgICAgICB7ICAgIDB4QSwgIDUgfSwKKyAgICAgICAgeyAgIDB4NzUsICA3IH0sCisgICAgICAgIHsgICAgMHgxLCAgMyB9LAorICAgICAgICB7ICAgIDB4MCwgIDMgfSwKKyAgICAgICAgeyAgICAweEIsICA0IH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgMHgxOCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MzgsICA2IH0sCisgICAgICAgIHsgICAweDQyLCAgNyB9LAorICAgICAgICB7ICAweDEwRiwgIDkgfSwKKyAgICAgICAgeyAgMHgxMEUsICA5IH0sCisgICAgICAgIHsgIDB4MjE5LCAxMCB9LAorICAgICAgICB7IDB4MTBDMywgMTMgfSwKKyAgICAgICAgeyAweDEwQzIsIDEzIH0sCisgICAgICAgIHsgMHgxMEM1LCAxMyB9LAorICAgICAgICB7IDB4MTBDNCwgMTMgfSwKKyAgICAgICAgeyAgICAweEYsICA0IH0sCisgICAgICAgIHsgICAgMHg0LCAgNCB9LAorICAgICAgICB7ICAgMHgxOSwgIDUgfSwKKyAgICAgICAgeyAgICAweEIsICA1IH0sCisgICAgICAgIHsgICAweDM5LCAgNiB9LAorICAgICAgICB7ICAgIDB4OSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUIsICA1IH0sCisgICAgICAgIHsgICAweDFBLCAgNSB9LAorICAgICAgICB7ICAgMHgzQiwgIDYgfQorICAgIH0sCisgICAgeyAvKiBBQyBiaWFzIGdyb3VwIDQsIHRhYmxlIDkgKi8KKyAgICAgICAgeyAgICAweDUsICAzIH0sCisgICAgICAgIHsgICAgMHgxLCAgNCB9LAorICAgICAgICB7ICAgMHgzRSwgIDYgfSwKKyAgICAgICAgeyAgICAweDEsICA1IH0sCisgICAgICAgIHsgICAweEUyLCAgOCB9LAorICAgICAgICB7IDB4MUM2RiwgMTMgfSwKKyAgICAgICAgeyAweDM4RDksIDE0IH0sCisgICAgICAgIHsgICAweDM5LCAgNiB9LAorICAgICAgICB7ICAgMHgxRiwgIDYgfSwKKyAgICAgICAgeyAgICAweDIsICAzIH0sCisgICAgICAgIHsgICAgMHgxLCAgMyB9LAorICAgICAgICB7ICAgIDB4OSwgIDQgfSwKKyAgICAgICAgeyAgICAweDgsICA0IH0sCisgICAgICAgIHsgICAgMHgwLCAgNSB9LAorICAgICAgICB7ICAgMHg3MCwgIDcgfSwKKyAgICAgICAgeyAgMHgxQzcsICA5IH0sCisgICAgICAgIHsgIDB4MzhDLCAxMCB9LAorICAgICAgICB7ICAweDcxQSwgMTEgfSwKKyAgICAgICAgeyAweDM4RDgsIDE0IH0sCisgICAgICAgIHsgMHgzOERCLCAxNCB9LAorICAgICAgICB7IDB4MzhEQSwgMTQgfSwKKyAgICAgICAgeyAweDM4REQsIDE0IH0sCisgICAgICAgIHsgMHgzOERDLCAxNCB9LAorICAgICAgICB7ICAgIDB4RCwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUQsICA1IH0sCisgICAgICAgIHsgICAgMHhFLCAgNSB9LAorICAgICAgICB7ICAgMHgzRiwgIDYgfSwKKyAgICAgICAgeyAgIDB4M0MsICA2IH0sCisgICAgICAgIHsgICAgMHhDLCAgNCB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgIDB4M0QsICA2IH0sCisgICAgICAgIHsgICAweDFFLCAgNiB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgNCwgdGFibGUgMTAgKi8KKyAgICAgICAgeyAgICAweDYsICAzIH0sCisgICAgICAgIHsgICAgMHhCLCAgNCB9LAorICAgICAgICB7ICAgMHgxMSwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUUsICA1IH0sCisgICAgICAgIHsgICAweDc0LCAgNyB9LAorICAgICAgICB7ICAweDNBQSwgMTAgfSwKKyAgICAgICAgeyAweDFENUMsIDEzIH0sCisgICAgICAgIHsgICAgMHgxLCAgNiB9LAorICAgICAgICB7ICAgMHgyMSwgIDYgfSwKKyAgICAgICAgeyAgICAweDEsICAzIH0sCisgICAgICAgIHsgICAgMHgyLCAgMyB9LAorICAgICAgICB7ICAgIDB4NywgIDQgfSwKKyAgICAgICAgeyAgICAweDYsICA0IH0sCisgICAgICAgIHsgICAweDNFLCAgNiB9LAorICAgICAgICB7ICAgMHhFQiwgIDggfSwKKyAgICAgICAgeyAgMHgxRDQsICA5IH0sCisgICAgICAgIHsgIDB4RUFGLCAxMiB9LAorICAgICAgICB7IDB4M0FCQiwgMTQgfSwKKyAgICAgICAgeyAweDNBQkEsIDE0IH0sCisgICAgICAgIHsgMHgxRDU5LCAxMyB9LAorICAgICAgICB7IDB4MUQ1OCwgMTMgfSwKKyAgICAgICAgeyAweDFENUIsIDEzIH0sCisgICAgICAgIHsgMHgxRDVBLCAxMyB9LAorICAgICAgICB7ICAgIDB4QSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MUMsICA1IH0sCisgICAgICAgIHsgICAgMHgxLCAgNSB9LAorICAgICAgICB7ICAgMHgzRiwgIDYgfSwKKyAgICAgICAgeyAgIDB4M0IsICA2IH0sCisgICAgICAgIHsgICAgMHgxLCAgNCB9LAorICAgICAgICB7ICAgIDB4OSwgIDQgfSwKKyAgICAgICAgeyAgIDB4MjAsICA2IH0sCisgICAgICAgIHsgICAgMHgwLCAgNiB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgNCwgdGFibGUgMTEgKi8KKyAgICAgICAgeyAgICAweDQsICAzIH0sCisgICAgICAgIHsgICAgMHhBLCAgNCB9LAorICAgICAgICB7ICAgMHgxNywgIDUgfSwKKyAgICAgICAgeyAgICAweDQsICA0IH0sCisgICAgICAgIHsgICAweDE2LCAgNiB9LAorICAgICAgICB7ICAweDE2QSwgIDkgfSwKKyAgICAgICAgeyAweDE2QjEsIDEzIH0sCisgICAgICAgIHsgICAweDE3LCAgNyB9LAorICAgICAgICB7ICAgMHg1QiwgIDcgfSwKKyAgICAgICAgeyAgICAweDYsICAzIH0sCisgICAgICAgIHsgICAgMHg3LCAgMyB9LAorICAgICAgICB7ICAgIDB4MSwgIDQgfSwKKyAgICAgICAgeyAgICAweDAsICA0IH0sCisgICAgICAgIHsgICAgMHhBLCAgNiB9LAorICAgICAgICB7ICAweDJENywgMTAgfSwKKyAgICAgICAgeyAgMHhCNUEsIDEyIH0sCisgICAgICAgIHsgMHgxNkIwLCAxMyB9LAorICAgICAgICB7IDB4MTZCMywgMTMgfSwKKyAgICAgICAgeyAweDE2QjIsIDEzIH0sCisgICAgICAgIHsgMHgyRDZELCAxNCB9LAorICAgICAgICB7IDB4MkQ2QywgMTQgfSwKKyAgICAgICAgeyAweDJENkYsIDE0IH0sCisgICAgICAgIHsgMHgyRDZFLCAxNCB9LAorICAgICAgICB7ICAgIDB4NiwgIDQgfSwKKyAgICAgICAgeyAgICAweEEsICA1IH0sCisgICAgICAgIHsgICAgMHg0LCAgNSB9LAorICAgICAgICB7ICAgMHgyQywgIDYgfSwKKyAgICAgICAgeyAgIDB4MTcsICA2IH0sCisgICAgICAgIHsgICAgMHgzLCAgNCB9LAorICAgICAgICB7ICAgIDB4NywgIDQgfSwKKyAgICAgICAgeyAgIDB4MTYsICA3IH0sCisgICAgICAgIHsgICAweEI0LCAgOCB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgNCwgdGFibGUgMTIgKi8KKyAgICAgICAgeyAgICAweDUsICAzIH0sCisgICAgICAgIHsgICAgMHhELCAgNCB9LAorICAgICAgICB7ICAgIDB4NSwgIDQgfSwKKyAgICAgICAgeyAgICAweDksICA0IH0sCisgICAgICAgIHsgICAweDMzLCAgNiB9LAorICAgICAgICB7ICAweDE5MywgIDkgfSwKKyAgICAgICAgeyAweDE5MkMsIDEzIH0sCisgICAgICAgIHsgICAweDYxLCAgOCB9LAorICAgICAgICB7ICAgMHgzMSwgIDcgfSwKKyAgICAgICAgeyAgICAweDAsICAyIH0sCisgICAgICAgIHsgICAgMHg3LCAgMyB9LAorICAgICAgICB7ICAgMHgxMCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MTEsICA1IH0sCisgICAgICAgIHsgICAweEM4LCAgOCB9LAorICAgICAgICB7IDB4MTkyRiwgMTMgfSwKKyAgICAgICAgeyAweDMyNUIsIDE0IH0sCisgICAgICAgIHsgMHgzMjVBLCAxNCB9LAorICAgICAgICB7IDB4MTkyOSwgMTMgfSwKKyAgICAgICAgeyAweDE5MjgsIDEzIH0sCisgICAgICAgIHsgMHgxOTJCLCAxMyB9LAorICAgICAgICB7IDB4MTkyQSwgMTMgfSwKKyAgICAgICAgeyAweDMyNUQsIDE0IH0sCisgICAgICAgIHsgMHgzMjVDLCAxNCB9LAorICAgICAgICB7ICAgMHgxOCwgIDUgfSwKKyAgICAgICAgeyAgIDB4MUEsICA2IH0sCisgICAgICAgIHsgICAweDFCLCAgNiB9LAorICAgICAgICB7ICAgMHg2NSwgIDcgfSwKKyAgICAgICAgeyAgIDB4MTksICA2IH0sCisgICAgICAgIHsgICAgMHg0LCAgNCB9LAorICAgICAgICB7ICAgIDB4NywgIDQgfSwKKyAgICAgICAgeyAgIDB4NjAsICA4IH0sCisgICAgICAgIHsgIDB4MzI0LCAxMCB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgNCwgdGFibGUgMTMgKi8KKyAgICAgICAgeyAgICAweDYsICAzIH0sCisgICAgICAgIHsgICAgMHgwLCAgMyB9LAorICAgICAgICB7ICAgIDB4MiwgIDQgfSwKKyAgICAgICAgeyAgICAweEYsICA0IH0sCisgICAgICAgIHsgICAweDM5LCAgNiB9LAorICAgICAgICB7ICAweDFEOSwgIDkgfSwKKyAgICAgICAgeyAweDFEODIsIDEzIH0sCisgICAgICAgIHsgIDB4NzYxLCAxMSB9LAorICAgICAgICB7ICAweDNCRSwgMTAgfSwKKyAgICAgICAgeyAgICAweDEsICAyIH0sCisgICAgICAgIHsgICAgMHgyLCAgMiB9LAorICAgICAgICB7ICAgIDB4RiwgIDYgfSwKKyAgICAgICAgeyAgICAweEUsICA2IH0sCisgICAgICAgIHsgIDB4NzYyLCAxMSB9LAorICAgICAgICB7IDB4M0IwNywgMTQgfSwKKyAgICAgICAgeyAweDNCMDYsIDE0IH0sCisgICAgICAgIHsgMHgzQjFELCAxNCB9LAorICAgICAgICB7IDB4M0IxQywgMTQgfSwKKyAgICAgICAgeyAweDNCMUYsIDE0IH0sCisgICAgICAgIHsgMHgzQjFFLCAxNCB9LAorICAgICAgICB7IDB4M0IxOSwgMTQgfSwKKyAgICAgICAgeyAweDNCMTgsIDE0IH0sCisgICAgICAgIHsgMHgzQjFCLCAxNCB9LAorICAgICAgICB7ICAgMHgzOCwgIDYgfSwKKyAgICAgICAgeyAgMHgxREUsICA5IH0sCisgICAgICAgIHsgICAweEVELCAgOCB9LAorICAgICAgICB7ICAweDNCRiwgMTAgfSwKKyAgICAgICAgeyAgIDB4RUUsICA4IH0sCisgICAgICAgIHsgICAweDNBLCAgNiB9LAorICAgICAgICB7ICAgIDB4NiwgIDUgfSwKKyAgICAgICAgeyAgMHhFQzAsIDEyIH0sCisgICAgICAgIHsgMHgzQjFBLCAxNCB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgNCwgdGFibGUgMTQgKi8KKyAgICAgICAgeyAgICAweDAsICAyIH0sCisgICAgICAgIHsgICAgMHgyLCAgMyB9LAorICAgICAgICB7ICAgIDB4RiwgIDUgfSwKKyAgICAgICAgeyAgICAweDYsICA0IH0sCisgICAgICAgIHsgICAweDFDLCAgNiB9LAorICAgICAgICB7ICAweDFEMCwgMTAgfSwKKyAgICAgICAgeyAgMHhFOEMsIDEzIH0sCisgICAgICAgIHsgMHgxRDFCLCAxNCB9LAorICAgICAgICB7IDB4MUQxQSwgMTQgfSwKKyAgICAgICAgeyAgICAweDMsICAyIH0sCisgICAgICAgIHsgICAgMHgyLCAgMiB9LAorICAgICAgICB7ICAgMHhFQSwgIDkgfSwKKyAgICAgICAgeyAgIDB4RTksICA5IH0sCisgICAgICAgIHsgIDB4RTg5LCAxMyB9LAorICAgICAgICB7ICAweEU4OCwgMTMgfSwKKyAgICAgICAgeyAgMHhFOEIsIDEzIH0sCisgICAgICAgIHsgIDB4RThBLCAxMyB9LAorICAgICAgICB7IDB4MUQ2NSwgMTQgfSwKKyAgICAgICAgeyAweDFENjQsIDE0IH0sCisgICAgICAgIHsgMHgxRDY3LCAxNCB9LAorICAgICAgICB7IDB4MUQ2NiwgMTQgfSwKKyAgICAgICAgeyAweDFENjEsIDE0IH0sCisgICAgICAgIHsgMHgxRDYwLCAxNCB9LAorICAgICAgICB7ICAweDNBRCwgMTEgfSwKKyAgICAgICAgeyAweDFENjMsIDE0IH0sCisgICAgICAgIHsgMHgxRDYyLCAxNCB9LAorICAgICAgICB7IDB4MUQxRCwgMTQgfSwKKyAgICAgICAgeyAweDFEMUMsIDE0IH0sCisgICAgICAgIHsgICAweDNCLCAgNyB9LAorICAgICAgICB7ICAweDFENywgMTAgfSwKKyAgICAgICAgeyAweDFEMUYsIDE0IH0sCisgICAgICAgIHsgMHgxRDFFLCAxNCB9CisgICAgfSwKKyAgICB7IC8qIEFDIGJpYXMgZ3JvdXAgNCwgdGFibGUgMTUgKi8KKyAgICAgICAgeyAgICAweDIsICAyIH0sCisgICAgICAgIHsgICAgMHhGLCAgNCB9LAorICAgICAgICB7ICAgMHgxQywgIDUgfSwKKyAgICAgICAgeyAgICAweEMsICA0IH0sCisgICAgICAgIHsgICAweDNCLCAgNiB9LAorICAgICAgICB7ICAweDFBQywgIDkgfSwKKyAgICAgICAgeyAweDFBRDgsIDEzIH0sCisgICAgICAgIHsgMHgzNUIzLCAxNCB9LAorICAgICAgICB7IDB4MzVCMiwgMTQgfSwKKyAgICAgICAgeyAgICAweDEsICAyIH0sCisgICAgICAgIHsgICAgMHgwLCAgMiB9LAorICAgICAgICB7ICAgMHg2OSwgIDcgfSwKKyAgICAgICAgeyAgIDB4NjgsICA3IH0sCisgICAgICAgIHsgMHgzNUJELCAxNCB9LAorICAgICAgICB7IDB4MzVCQywgMTQgfSwKKyAgICAgICAgeyAweDM1QkYsIDE0IH0sCisgICAgICAgIHsgMHgzNUJFLCAxNCB9LAorICAgICAgICB7IDB4MzVCOSwgMTQgfSwKKyAgICAgICAgeyAweDM1QjgsIDE0IH0sCisgICAgICAgIHsgMHgzNUJCLCAxNCB9LAorICAgICAgICB7IDB4MzVCQSwgMTQgfSwKKyAgICAgICAgeyAweDM1QjUsIDE0IH0sCisgICAgICAgIHsgMHgzNUI0LCAxNCB9LAorICAgICAgICB7ICAweDFBOSwgIDkgfSwKKyAgICAgICAgeyAgMHgxQTgsICA5IH0sCisgICAgICAgIHsgIDB4MzVBLCAxMCB9LAorICAgICAgICB7ICAgMHhENywgIDggfSwKKyAgICAgICAgeyAgIDB4RDUsICA4IH0sCisgICAgICAgIHsgICAweDNBLCAgNiB9LAorICAgICAgICB7ICAgMHgxQiwgIDUgfSwKKyAgICAgICAgeyAweDM1QjcsIDE0IH0sCisgICAgICAgIHsgMHgzNUI2LCAxNCB9CisgICAgfQorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVlAzREFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92cDNkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwM2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTNlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDNkc3AuYwpAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU3RhbmRhcmQgQyBEU1Atb3JpZW50ZWQgZnVuY3Rpb25zIGNyaWJiZWQgZnJvbSB0aGUgb3JpZ2luYWwgVlAzCisgKiBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgInJuZF9hdmcuaCIKKyNpbmNsdWRlICJ2cDNkc3AuaCIKKworI2RlZmluZSBJZGN0QWRqdXN0QmVmb3JlU2hpZnQgOAorI2RlZmluZSB4QzFTNyA2NDI3NworI2RlZmluZSB4QzJTNiA2MDU0NworI2RlZmluZSB4QzNTNSA1NDQ5MQorI2RlZmluZSB4QzRTNCA0NjM0MQorI2RlZmluZSB4QzVTMyAzNjQxMAorI2RlZmluZSB4QzZTMiAyNTA4MAorI2RlZmluZSB4QzdTMSAxMjc4NQorCisjZGVmaW5lIE0oYSwgYikgKCgoYSkgKiAoYikpID4+IDE2KQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGlkY3QodWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmlucHV0LCBpbnQgdHlwZSkKK3sKKyAgICBpbnQxNl90ICppcCA9IGlucHV0OworCisgICAgaW50IEEsIEIsIEMsIEQsIEFkLCBCZCwgQ2QsIERkLCBFLCBGLCBHLCBIOworICAgIGludCBFZCwgR2QsIEFkZCwgQmRkLCBGZCwgSGQ7CisKKyAgICBpbnQgaTsKKworICAgIC8qIEludmVyc2UgRENUIG9uIHRoZSByb3dzIG5vdyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgLyogQ2hlY2sgZm9yIG5vbi16ZXJvIHZhbHVlcyAqLworICAgICAgICBpZiAoaXBbMCAqIDhdIHwgaXBbMSAqIDhdIHwgaXBbMiAqIDhdIHwgaXBbMyAqIDhdIHwKKyAgICAgICAgICAgIGlwWzQgKiA4XSB8IGlwWzUgKiA4XSB8IGlwWzYgKiA4XSB8IGlwWzcgKiA4XSkgeworICAgICAgICAgICAgQSA9IE0oeEMxUzcsIGlwWzEgKiA4XSkgKyBNKHhDN1MxLCBpcFs3ICogOF0pOworICAgICAgICAgICAgQiA9IE0oeEM3UzEsIGlwWzEgKiA4XSkgLSBNKHhDMVM3LCBpcFs3ICogOF0pOworICAgICAgICAgICAgQyA9IE0oeEMzUzUsIGlwWzMgKiA4XSkgKyBNKHhDNVMzLCBpcFs1ICogOF0pOworICAgICAgICAgICAgRCA9IE0oeEMzUzUsIGlwWzUgKiA4XSkgLSBNKHhDNVMzLCBpcFszICogOF0pOworCisgICAgICAgICAgICBBZCA9IE0oeEM0UzQsIChBIC0gQykpOworICAgICAgICAgICAgQmQgPSBNKHhDNFM0LCAoQiAtIEQpKTsKKworICAgICAgICAgICAgQ2QgPSBBICsgQzsKKyAgICAgICAgICAgIERkID0gQiArIEQ7CisKKyAgICAgICAgICAgIEUgPSBNKHhDNFM0LCAoaXBbMCAqIDhdICsgaXBbNCAqIDhdKSk7CisgICAgICAgICAgICBGID0gTSh4QzRTNCwgKGlwWzAgKiA4XSAtIGlwWzQgKiA4XSkpOworCisgICAgICAgICAgICBHID0gTSh4QzJTNiwgaXBbMiAqIDhdKSArIE0oeEM2UzIsIGlwWzYgKiA4XSk7CisgICAgICAgICAgICBIID0gTSh4QzZTMiwgaXBbMiAqIDhdKSAtIE0oeEMyUzYsIGlwWzYgKiA4XSk7CisKKyAgICAgICAgICAgIEVkID0gRSAtIEc7CisgICAgICAgICAgICBHZCA9IEUgKyBHOworCisgICAgICAgICAgICBBZGQgPSBGICsgQWQ7CisgICAgICAgICAgICBCZGQgPSBCZCAtIEg7CisKKyAgICAgICAgICAgIEZkID0gRiAtIEFkOworICAgICAgICAgICAgSGQgPSBCZCArIEg7CisKKyAgICAgICAgICAgIC8qICBGaW5hbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIG92ZXItd3JpdGUgb3JpZ2luYWwgaW5wdXRzLiAqLworICAgICAgICAgICAgaXBbMCAqIDhdID0gR2QgKyBDZDsKKyAgICAgICAgICAgIGlwWzcgKiA4XSA9IEdkIC0gQ2Q7CisKKyAgICAgICAgICAgIGlwWzEgKiA4XSA9IEFkZCArIEhkOworICAgICAgICAgICAgaXBbMiAqIDhdID0gQWRkIC0gSGQ7CisKKyAgICAgICAgICAgIGlwWzMgKiA4XSA9IEVkICsgRGQ7CisgICAgICAgICAgICBpcFs0ICogOF0gPSBFZCAtIERkOworCisgICAgICAgICAgICBpcFs1ICogOF0gPSBGZCArIEJkZDsKKyAgICAgICAgICAgIGlwWzYgKiA4XSA9IEZkIC0gQmRkOworICAgICAgICB9CisKKyAgICAgICAgaXAgKz0gMTsgICAgICAgICAgICAvKiBuZXh0IHJvdyAqLworICAgIH0KKworICAgIGlwID0gaW5wdXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIC8qIENoZWNrIGZvciBub24temVybyB2YWx1ZXMgKGJpdHdpc2Ugb3IgZmFzdGVyIHRoYW4gfHwpICovCisgICAgICAgIGlmIChpcFsxXSB8IGlwWzJdIHwgaXBbM10gfAorICAgICAgICAgICAgaXBbNF0gfCBpcFs1XSB8IGlwWzZdIHwgaXBbN10pIHsKKyAgICAgICAgICAgIEEgPSBNKHhDMVM3LCBpcFsxXSkgKyBNKHhDN1MxLCBpcFs3XSk7CisgICAgICAgICAgICBCID0gTSh4QzdTMSwgaXBbMV0pIC0gTSh4QzFTNywgaXBbN10pOworICAgICAgICAgICAgQyA9IE0oeEMzUzUsIGlwWzNdKSArIE0oeEM1UzMsIGlwWzVdKTsKKyAgICAgICAgICAgIEQgPSBNKHhDM1M1LCBpcFs1XSkgLSBNKHhDNVMzLCBpcFszXSk7CisKKyAgICAgICAgICAgIEFkID0gTSh4QzRTNCwgKEEgLSBDKSk7CisgICAgICAgICAgICBCZCA9IE0oeEM0UzQsIChCIC0gRCkpOworCisgICAgICAgICAgICBDZCA9IEEgKyBDOworICAgICAgICAgICAgRGQgPSBCICsgRDsKKworICAgICAgICAgICAgRSA9IE0oeEM0UzQsIChpcFswXSArIGlwWzRdKSkgKyA4OworICAgICAgICAgICAgRiA9IE0oeEM0UzQsIChpcFswXSAtIGlwWzRdKSkgKyA4OworCisgICAgICAgICAgICBpZiAodHlwZSA9PSAxKSB7IC8vIEhBQ0sKKyAgICAgICAgICAgICAgICBFICs9IDE2ICogMTI4OworICAgICAgICAgICAgICAgIEYgKz0gMTYgKiAxMjg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEcgPSBNKHhDMlM2LCBpcFsyXSkgKyBNKHhDNlMyLCBpcFs2XSk7CisgICAgICAgICAgICBIID0gTSh4QzZTMiwgaXBbMl0pIC0gTSh4QzJTNiwgaXBbNl0pOworCisgICAgICAgICAgICBFZCA9IEUgLSBHOworICAgICAgICAgICAgR2QgPSBFICsgRzsKKworICAgICAgICAgICAgQWRkID0gRiArIEFkOworICAgICAgICAgICAgQmRkID0gQmQgLSBIOworCisgICAgICAgICAgICBGZCA9IEYgLSBBZDsKKyAgICAgICAgICAgIEhkID0gQmQgKyBIOworCisgICAgICAgICAgICAvKiBGaW5hbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIG92ZXItd3JpdGUgb3JpZ2luYWwgaW5wdXRzLiAqLworICAgICAgICAgICAgaWYgKHR5cGUgPT0gMSkgeworICAgICAgICAgICAgICAgIGRzdFswICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoKEdkICsgQ2QpID4+IDQpOworICAgICAgICAgICAgICAgIGRzdFs3ICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoKEdkIC0gQ2QpID4+IDQpOworCisgICAgICAgICAgICAgICAgZHN0WzEgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OCgoQWRkICsgSGQpID4+IDQpOworICAgICAgICAgICAgICAgIGRzdFsyICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoKEFkZCAtIEhkKSA+PiA0KTsKKworICAgICAgICAgICAgICAgIGRzdFszICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoKEVkICsgRGQpID4+IDQpOworICAgICAgICAgICAgICAgIGRzdFs0ICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoKEVkIC0gRGQpID4+IDQpOworCisgICAgICAgICAgICAgICAgZHN0WzUgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OCgoRmQgKyBCZGQpID4+IDQpOworICAgICAgICAgICAgICAgIGRzdFs2ICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoKEZkIC0gQmRkKSA+PiA0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHN0WzAgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkc3RbMCAqIHN0cmlkZV0gKyAoKEdkICsgQ2QpID4+IDQpKTsKKyAgICAgICAgICAgICAgICBkc3RbNyAqIHN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFs3ICogc3RyaWRlXSArICgoR2QgLSBDZCkgPj4gNCkpOworCisgICAgICAgICAgICAgICAgZHN0WzEgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkc3RbMSAqIHN0cmlkZV0gKyAoKEFkZCArIEhkKSA+PiA0KSk7CisgICAgICAgICAgICAgICAgZHN0WzIgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkc3RbMiAqIHN0cmlkZV0gKyAoKEFkZCAtIEhkKSA+PiA0KSk7CisKKyAgICAgICAgICAgICAgICBkc3RbMyAqIHN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFszICogc3RyaWRlXSArICgoRWQgKyBEZCkgPj4gNCkpOworICAgICAgICAgICAgICAgIGRzdFs0ICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZHN0WzQgKiBzdHJpZGVdICsgKChFZCAtIERkKSA+PiA0KSk7CisKKyAgICAgICAgICAgICAgICBkc3RbNSAqIHN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFs1ICogc3RyaWRlXSArICgoRmQgKyBCZGQpID4+IDQpKTsKKyAgICAgICAgICAgICAgICBkc3RbNiAqIHN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFs2ICogc3RyaWRlXSArICgoRmQgLSBCZGQpID4+IDQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHsKKyAgICAgICAgICAgICAgICBkc3RbMCpzdHJpZGVdID0KKyAgICAgICAgICAgICAgICBkc3RbMSpzdHJpZGVdID0KKyAgICAgICAgICAgICAgICBkc3RbMipzdHJpZGVdID0KKyAgICAgICAgICAgICAgICBkc3RbMypzdHJpZGVdID0KKyAgICAgICAgICAgICAgICBkc3RbNCpzdHJpZGVdID0KKyAgICAgICAgICAgICAgICBkc3RbNSpzdHJpZGVdID0KKyAgICAgICAgICAgICAgICBkc3RbNipzdHJpZGVdID0KKyAgICAgICAgICAgICAgICBkc3RbNypzdHJpZGVdID0gYXZfY2xpcF91aW50OCgxMjggKyAoKHhDNFM0ICogaXBbMF0gKyAoSWRjdEFkanVzdEJlZm9yZVNoaWZ0IDw8IDE2KSkgPj4gMjApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGlwWzBdKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2ID0gKHhDNFM0ICogaXBbMF0gKyAoSWRjdEFkanVzdEJlZm9yZVNoaWZ0IDw8IDE2KSkgPj4gMjA7CisgICAgICAgICAgICAgICAgICAgIGRzdFswICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZHN0WzAgKiBzdHJpZGVdICsgdik7CisgICAgICAgICAgICAgICAgICAgIGRzdFsxICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZHN0WzEgKiBzdHJpZGVdICsgdik7CisgICAgICAgICAgICAgICAgICAgIGRzdFsyICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZHN0WzIgKiBzdHJpZGVdICsgdik7CisgICAgICAgICAgICAgICAgICAgIGRzdFszICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZHN0WzMgKiBzdHJpZGVdICsgdik7CisgICAgICAgICAgICAgICAgICAgIGRzdFs0ICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZHN0WzQgKiBzdHJpZGVdICsgdik7CisgICAgICAgICAgICAgICAgICAgIGRzdFs1ICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZHN0WzUgKiBzdHJpZGVdICsgdik7CisgICAgICAgICAgICAgICAgICAgIGRzdFs2ICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZHN0WzYgKiBzdHJpZGVdICsgdik7CisgICAgICAgICAgICAgICAgICAgIGRzdFs3ICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZHN0WzcgKiBzdHJpZGVdICsgdik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaXAgKz0gODsgICAgICAgICAgICAvKiBuZXh0IGNvbHVtbiAqLworICAgICAgICBkc3QrKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZwM19pZGN0X3B1dF9jKHVpbnQ4X3QgKmRlc3QgLyogYWxpZ24gOCAqLywgaW50IGxpbmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovKQoreworICAgIGlkY3QoZGVzdCwgbGluZV9zaXplLCBibG9jaywgMSk7CisgICAgbWVtc2V0KGJsb2NrLCAwLCBzaXplb2YoKmJsb2NrKSAqIDY0KTsKK30KKworc3RhdGljIHZvaWQgdnAzX2lkY3RfYWRkX2ModWludDhfdCAqZGVzdCAvKiBhbGlnbiA4ICovLCBpbnQgbGluZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2sgLyogYWxpZ24gMTYgKi8pCit7CisgICAgaWRjdChkZXN0LCBsaW5lX3NpemUsIGJsb2NrLCAyKTsKKyAgICBtZW1zZXQoYmxvY2ssIDAsIHNpemVvZigqYmxvY2spICogNjQpOworfQorCitzdGF0aWMgdm9pZCB2cDNfaWRjdF9kY19hZGRfYyh1aW50OF90ICpkZXN0IC8qIGFsaWduIDggKi8sIGludCBsaW5lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jayAvKiBhbGlnbiAxNiAqLykKK3sKKyAgICBpbnQgaSwgZGMgPSAoYmxvY2tbMF0gKyAxNSkgPj4gNTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgZGVzdFswXSA9IGF2X2NsaXBfdWludDgoZGVzdFswXSArIGRjKTsKKyAgICAgICAgZGVzdFsxXSA9IGF2X2NsaXBfdWludDgoZGVzdFsxXSArIGRjKTsKKyAgICAgICAgZGVzdFsyXSA9IGF2X2NsaXBfdWludDgoZGVzdFsyXSArIGRjKTsKKyAgICAgICAgZGVzdFszXSA9IGF2X2NsaXBfdWludDgoZGVzdFszXSArIGRjKTsKKyAgICAgICAgZGVzdFs0XSA9IGF2X2NsaXBfdWludDgoZGVzdFs0XSArIGRjKTsKKyAgICAgICAgZGVzdFs1XSA9IGF2X2NsaXBfdWludDgoZGVzdFs1XSArIGRjKTsKKyAgICAgICAgZGVzdFs2XSA9IGF2X2NsaXBfdWludDgoZGVzdFs2XSArIGRjKTsKKyAgICAgICAgZGVzdFs3XSA9IGF2X2NsaXBfdWludDgoZGVzdFs3XSArIGRjKTsKKyAgICAgICAgZGVzdCAgICs9IGxpbmVfc2l6ZTsKKyAgICB9CisgICAgYmxvY2tbMF0gPSAwOworfQorCitzdGF0aWMgdm9pZCB2cDNfdl9sb29wX2ZpbHRlcl9jKHVpbnQ4X3QgKmZpcnN0X3BpeGVsLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJvdW5kaW5nX3ZhbHVlcykKK3sKKyAgICB1bnNpZ25lZCBjaGFyICplbmQ7CisgICAgaW50IGZpbHRlcl92YWx1ZTsKKyAgICBjb25zdCBpbnQgbnN0cmlkZSA9IC1zdHJpZGU7CisKKyAgICBmb3IgKGVuZCA9IGZpcnN0X3BpeGVsICsgODsgZmlyc3RfcGl4ZWwgPCBlbmQ7IGZpcnN0X3BpeGVsKyspIHsKKyAgICAgICAgZmlsdGVyX3ZhbHVlID0gKGZpcnN0X3BpeGVsWzIgKiBuc3RyaWRlXSAtIGZpcnN0X3BpeGVsW3N0cmlkZV0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0X3BpeGVsWzBdIC0gZmlyc3RfcGl4ZWxbbnN0cmlkZV0pICogMzsKKyAgICAgICAgZmlsdGVyX3ZhbHVlID0gYm91bmRpbmdfdmFsdWVzWyhmaWx0ZXJfdmFsdWUgKyA0KSA+PiAzXTsKKworICAgICAgICBmaXJzdF9waXhlbFtuc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZmlyc3RfcGl4ZWxbbnN0cmlkZV0gKyBmaWx0ZXJfdmFsdWUpOworICAgICAgICBmaXJzdF9waXhlbFswXSAgICAgICA9IGF2X2NsaXBfdWludDgoZmlyc3RfcGl4ZWxbMF0gLSBmaWx0ZXJfdmFsdWUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdnAzX2hfbG9vcF9maWx0ZXJfYyh1aW50OF90ICpmaXJzdF9waXhlbCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpib3VuZGluZ192YWx1ZXMpCit7CisgICAgdW5zaWduZWQgY2hhciAqZW5kOworICAgIGludCBmaWx0ZXJfdmFsdWU7CisKKyAgICBmb3IgKGVuZCA9IGZpcnN0X3BpeGVsICsgOCAqIHN0cmlkZTsgZmlyc3RfcGl4ZWwgIT0gZW5kOyBmaXJzdF9waXhlbCArPSBzdHJpZGUpIHsKKyAgICAgICAgZmlsdGVyX3ZhbHVlID0gKGZpcnN0X3BpeGVsWy0yXSAtIGZpcnN0X3BpeGVsWzFdKSArCisgICAgICAgICAgICAgICAgICAgICAgIChmaXJzdF9waXhlbFsgMF0gLSBmaXJzdF9waXhlbFstMV0pICogMzsKKyAgICAgICAgZmlsdGVyX3ZhbHVlID0gYm91bmRpbmdfdmFsdWVzWyhmaWx0ZXJfdmFsdWUgKyA0KSA+PiAzXTsKKworICAgICAgICBmaXJzdF9waXhlbFstMV0gPSBhdl9jbGlwX3VpbnQ4KGZpcnN0X3BpeGVsWy0xXSArIGZpbHRlcl92YWx1ZSk7CisgICAgICAgIGZpcnN0X3BpeGVsWyAwXSA9IGF2X2NsaXBfdWludDgoZmlyc3RfcGl4ZWxbIDBdIC0gZmlsdGVyX3ZhbHVlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9ub19ybmRfcGl4ZWxzX2wyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICB1aW50MzJfdCBhLCBiOworCisgICAgICAgIGEgPSBBVl9STjMyKCZzcmMxW2kgKiBzdHJpZGVdKTsKKyAgICAgICAgYiA9IEFWX1JOMzIoJnNyYzJbaSAqIHN0cmlkZV0pOworICAgICAgICBBVl9XTjMyQSgmZHN0W2kgKiBzdHJpZGVdLCBub19ybmRfYXZnMzIoYSwgYikpOworICAgICAgICBhID0gQVZfUk4zMigmc3JjMVtpICogc3RyaWRlICsgNF0pOworICAgICAgICBiID0gQVZfUk4zMigmc3JjMltpICogc3RyaWRlICsgNF0pOworICAgICAgICBBVl9XTjMyQSgmZHN0W2kgKiBzdHJpZGUgKyA0XSwgbm9fcm5kX2F2ZzMyKGEsIGIpKTsKKyAgICB9Cit9CisKK2F2X2NvbGQgdm9pZCBmZl92cDNkc3BfaW5pdChWUDNEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MpCit7CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfbDIgPSBwdXRfbm9fcm5kX3BpeGVsc19sMjsKKworICAgIGMtPmlkY3RfcHV0ICAgICAgPSB2cDNfaWRjdF9wdXRfYzsKKyAgICBjLT5pZGN0X2FkZCAgICAgID0gdnAzX2lkY3RfYWRkX2M7CisgICAgYy0+aWRjdF9kY19hZGQgICA9IHZwM19pZGN0X2RjX2FkZF9jOworICAgIGMtPnZfbG9vcF9maWx0ZXIgPSB2cDNfdl9sb29wX2ZpbHRlcl9jOworICAgIGMtPmhfbG9vcF9maWx0ZXIgPSB2cDNfaF9sb29wX2ZpbHRlcl9jOworCisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl92cDNkc3BfaW5pdF9hcm0oYywgZmxhZ3MpOworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfdnAzZHNwX2luaXRfcHBjKGMsIGZsYWdzKTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX3ZwM2RzcF9pbml0X3g4NihjLCBmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92cDNkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwM2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWFkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDNkc3AuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WUDNEU1BfSAorI2RlZmluZSBBVkNPREVDX1ZQM0RTUF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgVlAzRFNQQ29udGV4dCB7CisgICAgLyoqCisgICAgICogQ29weSA4eEggcGl4ZWxzIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlciB1c2luZyBhIGJpbGluZWFyCisgICAgICogZmlsdGVyIHdpdGggbm8gcm91bmRpbmcgKGkuZS4gKmRzdCA9ICgqYSArICpiKSA+PiAxKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gYnVmZmVyLCBhbGlnbmVkIGJ5IDgKKyAgICAgKiBAcGFyYW0gYSBmaXJzdCBzb3VyY2UgYnVmZmVyLCBubyBhbGlnbm1lbnQKKyAgICAgKiBAcGFyYW0gYiBzZWNvbmQgc291cmNlIGJ1ZmZlciwgbm8gYWxpZ25tZW50CisgICAgICogQHBhcmFtIHN0cmlkZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBsaW5lcyBpbiBzb3VyY2UvZGVzdCBidWZmZXJzCisgICAgICogQHBhcmFtIGggaGVpZ2h0CisgICAgICovCisgICAgdm9pZCAoKnB1dF9ub19ybmRfcGl4ZWxzX2wyKSh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKTsKKworICAgIHZvaWQgKCppZGN0X3B1dCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCppZGN0X2FkZCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCppZGN0X2RjX2FkZCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2X2xvb3BfZmlsdGVyKSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCAqYm91bmRpbmdfdmFsdWVzKTsKKyAgICB2b2lkICgqaF9sb29wX2ZpbHRlcikodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgKmJvdW5kaW5nX3ZhbHVlcyk7Cit9IFZQM0RTUENvbnRleHQ7CisKK3ZvaWQgZmZfdnAzZHNwX2luaXQoVlAzRFNQQ29udGV4dCAqYywgaW50IGZsYWdzKTsKK3ZvaWQgZmZfdnAzZHNwX2luaXRfYXJtKFZQM0RTUENvbnRleHQgKmMsIGludCBmbGFncyk7Cit2b2lkIGZmX3ZwM2RzcF9pbml0X3BwYyhWUDNEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MpOwordm9pZCBmZl92cDNkc3BfaW5pdF94ODYoVlAzRFNQQ29udGV4dCAqYywgaW50IGZsYWdzKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVlAzRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZwNS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkyM2Q2MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwNS5jCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZQNSBjb21wYXRpYmxlIHZpZGVvIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAidnA1Ni5oIgorI2luY2x1ZGUgInZwNTZkYXRhLmgiCisjaW5jbHVkZSAidnA1ZGF0YS5oIgorCisKK3N0YXRpYyBpbnQgdnA1X3BhcnNlX2hlYWRlcihWUDU2Q29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgVlA1NlJhbmdlQ29kZXIgKmMgPSAmcy0+YzsKKyAgICBpbnQgcm93cywgY29sczsKKworICAgIGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKCZzLT5jLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBzLT5mcmFtZXNbVlA1Nl9GUkFNRV9DVVJSRU5UXS0+a2V5X2ZyYW1lID0gIXZwNTZfcmFjX2dldChjKTsKKyAgICB2cDU2X3JhY19nZXQoYyk7CisgICAgZmZfdnA1Nl9pbml0X2RlcXVhbnQocywgdnA1Nl9yYWNfZ2V0cyhjLCA2KSk7CisgICAgaWYgKHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdLT5rZXlfZnJhbWUpCisgICAgeworICAgICAgICB2cDU2X3JhY19nZXRzKGMsIDgpOworICAgICAgICBpZih2cDU2X3JhY19nZXRzKGMsIDUpID4gNSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB2cDU2X3JhY19nZXRzKGMsIDIpOworICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0KGMpKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludGVybGFjaW5nIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgICAgIHJvd3MgPSB2cDU2X3JhY19nZXRzKGMsIDgpOyAgLyogbnVtYmVyIG9mIHN0b3JlZCBtYWNyb2Jsb2NrIHJvd3MgKi8KKyAgICAgICAgY29scyA9IHZwNTZfcmFjX2dldHMoYywgOCk7ICAvKiBudW1iZXIgb2Ygc3RvcmVkIG1hY3JvYmxvY2sgY29scyAqLworICAgICAgICBpZiAoIXJvd3MgfHwgIWNvbHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzaXplICVkeCVkXG4iLAorICAgICAgICAgICAgICAgICAgIGNvbHMgPDwgNCwgcm93cyA8PCA0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHZwNTZfcmFjX2dldHMoYywgOCk7ICAvKiBudW1iZXIgb2YgZGlzcGxheWVkIG1hY3JvYmxvY2sgcm93cyAqLworICAgICAgICB2cDU2X3JhY19nZXRzKGMsIDgpOyAgLyogbnVtYmVyIG9mIGRpc3BsYXllZCBtYWNyb2Jsb2NrIGNvbHMgKi8KKyAgICAgICAgdnA1Nl9yYWNfZ2V0cyhjLCAyKTsKKyAgICAgICAgaWYgKCFzLT5tYWNyb2Jsb2NrcyB8fCAvKiBmaXJzdCBmcmFtZSAqLworICAgICAgICAgICAgMTYqY29scyAhPSBzLT5hdmN0eC0+Y29kZWRfd2lkdGggfHwKKyAgICAgICAgICAgIDE2KnJvd3MgIT0gcy0+YXZjdHgtPmNvZGVkX2hlaWdodCkgeworICAgICAgICAgICAgaW50IHJldCA9IGZmX3NldF9kaW1lbnNpb25zKHMtPmF2Y3R4LCAxNiAqIGNvbHMsIDE2ICogcm93cyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcmV0dXJuIFZQNTZfU0laRV9DSEFOR0U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzLT5tYWNyb2Jsb2NrcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZwNV9wYXJzZV92ZWN0b3JfYWRqdXN0bWVudChWUDU2Q29udGV4dCAqcywgVlA1Nm12ICp2ZWN0KQoreworICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CisgICAgVlA1Nk1vZGVsICptb2RlbCA9IHMtPm1vZGVscDsKKyAgICBpbnQgY29tcCwgZGk7CisKKyAgICBmb3IgKGNvbXA9MDsgY29tcDwyOyBjb21wKyspIHsKKyAgICAgICAgaW50IGRlbHRhID0gMDsKKyAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgbW9kZWwtPnZlY3Rvcl9kY3RbY29tcF0pKSB7CisgICAgICAgICAgICBpbnQgc2lnbiA9IHZwNTZfcmFjX2dldF9wcm9iKGMsIG1vZGVsLT52ZWN0b3Jfc2lnW2NvbXBdKTsKKyAgICAgICAgICAgIGRpICA9IHZwNTZfcmFjX2dldF9wcm9iKGMsIG1vZGVsLT52ZWN0b3JfcGRpW2NvbXBdWzBdKTsKKyAgICAgICAgICAgIGRpIHw9IHZwNTZfcmFjX2dldF9wcm9iKGMsIG1vZGVsLT52ZWN0b3JfcGRpW2NvbXBdWzFdKSA8PCAxOworICAgICAgICAgICAgZGVsdGEgPSB2cDU2X3JhY19nZXRfdHJlZShjLCBmZl92cDU2X3B2YV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC0+dmVjdG9yX3Bkdltjb21wXSk7CisgICAgICAgICAgICBkZWx0YSA9IGRpIHwgKGRlbHRhIDw8IDIpOworICAgICAgICAgICAgZGVsdGEgPSAoZGVsdGEgXiAtc2lnbikgKyBzaWduOworICAgICAgICB9CisgICAgICAgIGlmICghY29tcCkKKyAgICAgICAgICAgIHZlY3QtPnggPSBkZWx0YTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmVjdC0+eSA9IGRlbHRhOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdnA1X3BhcnNlX3ZlY3Rvcl9tb2RlbHMoVlA1NkNvbnRleHQgKnMpCit7CisgICAgVlA1NlJhbmdlQ29kZXIgKmMgPSAmcy0+YzsKKyAgICBWUDU2TW9kZWwgKm1vZGVsID0gcy0+bW9kZWxwOworICAgIGludCBjb21wLCBub2RlOworCisgICAgZm9yIChjb21wPTA7IGNvbXA8MjsgY29tcCsrKSB7CisgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHZwNV92bWNfcGN0W2NvbXBdWzBdKSkKKyAgICAgICAgICAgIG1vZGVsLT52ZWN0b3JfZGN0W2NvbXBdID0gdnA1Nl9yYWNfZ2V0c19ubihjLCA3KTsKKyAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdnA1X3ZtY19wY3RbY29tcF1bMV0pKQorICAgICAgICAgICAgbW9kZWwtPnZlY3Rvcl9zaWdbY29tcF0gPSB2cDU2X3JhY19nZXRzX25uKGMsIDcpOworICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB2cDVfdm1jX3BjdFtjb21wXVsyXSkpCisgICAgICAgICAgICBtb2RlbC0+dmVjdG9yX3BkaVtjb21wXVswXSA9IHZwNTZfcmFjX2dldHNfbm4oYywgNyk7CisgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHZwNV92bWNfcGN0W2NvbXBdWzNdKSkKKyAgICAgICAgICAgIG1vZGVsLT52ZWN0b3JfcGRpW2NvbXBdWzFdID0gdnA1Nl9yYWNfZ2V0c19ubihjLCA3KTsKKyAgICB9CisKKyAgICBmb3IgKGNvbXA9MDsgY29tcDwyOyBjb21wKyspCisgICAgICAgIGZvciAobm9kZT0wOyBub2RlPDc7IG5vZGUrKykKKyAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHZwNV92bWNfcGN0W2NvbXBdWzQgKyBub2RlXSkpCisgICAgICAgICAgICAgICAgbW9kZWwtPnZlY3Rvcl9wZHZbY29tcF1bbm9kZV0gPSB2cDU2X3JhY19nZXRzX25uKGMsIDcpOworfQorCitzdGF0aWMgaW50IHZwNV9wYXJzZV9jb2VmZl9tb2RlbHMoVlA1NkNvbnRleHQgKnMpCit7CisgICAgVlA1NlJhbmdlQ29kZXIgKmMgPSAmcy0+YzsKKyAgICBWUDU2TW9kZWwgKm1vZGVsID0gcy0+bW9kZWxwOworICAgIHVpbnQ4X3QgZGVmX3Byb2JbMTFdOworICAgIGludCBub2RlLCBjZywgY3R4OworICAgIGludCBjdDsgICAgLyogY29kZSB0eXBlICovCisgICAgaW50IHB0OyAgICAvKiBwbGFuZSB0eXBlICgwIGZvciBZLCAxIGZvciBVIG9yIFYpICovCisKKyAgICBtZW1zZXQoZGVmX3Byb2IsIDB4ODAsIHNpemVvZihkZWZfcHJvYikpOworCisgICAgZm9yIChwdD0wOyBwdDwyOyBwdCsrKQorICAgICAgICBmb3IgKG5vZGU9MDsgbm9kZTwxMTsgbm9kZSsrKQorICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdnA1X2RjY3ZfcGN0W3B0XVtub2RlXSkpIHsKKyAgICAgICAgICAgICAgICBkZWZfcHJvYltub2RlXSA9IHZwNTZfcmFjX2dldHNfbm4oYywgNyk7CisgICAgICAgICAgICAgICAgbW9kZWwtPmNvZWZmX2RjY3ZbcHRdW25vZGVdID0gZGVmX3Byb2Jbbm9kZV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdLT5rZXlfZnJhbWUpIHsKKyAgICAgICAgICAgICAgICBtb2RlbC0+Y29lZmZfZGNjdltwdF1bbm9kZV0gPSBkZWZfcHJvYltub2RlXTsKKyAgICAgICAgICAgIH0KKworICAgIGZvciAoY3Q9MDsgY3Q8MzsgY3QrKykKKyAgICAgICAgZm9yIChwdD0wOyBwdDwyOyBwdCsrKQorICAgICAgICAgICAgZm9yIChjZz0wOyBjZzw2OyBjZysrKQorICAgICAgICAgICAgICAgIGZvciAobm9kZT0wOyBub2RlPDExOyBub2RlKyspCisgICAgICAgICAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHZwNV9yYWN0X3BjdFtjdF1bcHRdW2NnXVtub2RlXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZl9wcm9iW25vZGVdID0gdnA1Nl9yYWNfZ2V0c19ubihjLCA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLT5jb2VmZl9yYWN0W3B0XVtjdF1bY2ddW25vZGVdID0gZGVmX3Byb2Jbbm9kZV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+ZnJhbWVzW1ZQNTZfRlJBTUVfQ1VSUkVOVF0tPmtleV9mcmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwtPmNvZWZmX3JhY3RbcHRdW2N0XVtjZ11bbm9kZV0gPSBkZWZfcHJvYltub2RlXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgLyogY29lZmZfZGNjdCBpcyBhIGxpbmVhciBjb21iaW5hdGlvbiBvZiBjb2VmZl9kY2N2ICovCisgICAgZm9yIChwdD0wOyBwdDwyOyBwdCsrKQorICAgICAgICBmb3IgKGN0eD0wOyBjdHg8MzY7IGN0eCsrKQorICAgICAgICAgICAgZm9yIChub2RlPTA7IG5vZGU8NTsgbm9kZSsrKQorICAgICAgICAgICAgICAgIG1vZGVsLT5jb2VmZl9kY2N0W3B0XVtjdHhdW25vZGVdID0gYXZfY2xpcCgoKG1vZGVsLT5jb2VmZl9kY2N2W3B0XVtub2RlXSAqIHZwNV9kY2N2X2xjW25vZGVdW2N0eF1bMF0gKyAxMjgpID4+IDgpICsgdnA1X2RjY3ZfbGNbbm9kZV1bY3R4XVsxXSwgMSwgMjU0KTsKKworICAgIC8qIGNvZWZmX2FjY3QgaXMgYSBsaW5lYXIgY29tYmluYXRpb24gb2YgY29lZmZfcmFjdCAqLworICAgIGZvciAoY3Q9MDsgY3Q8MzsgY3QrKykKKyAgICAgICAgZm9yIChwdD0wOyBwdDwyOyBwdCsrKQorICAgICAgICAgICAgZm9yIChjZz0wOyBjZzwzOyBjZysrKQorICAgICAgICAgICAgICAgIGZvciAoY3R4PTA7IGN0eDw2OyBjdHgrKykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChub2RlPTA7IG5vZGU8NTsgbm9kZSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwtPmNvZWZmX2FjY3RbcHRdW2N0XVtjZ11bY3R4XVtub2RlXSA9IGF2X2NsaXAoKChtb2RlbC0+Y29lZmZfcmFjdFtwdF1bY3RdW2NnXVtub2RlXSAqIHZwNV9yYWN0X2xjW2N0XVtjZ11bbm9kZV1bY3R4XVswXSArIDEyOCkgPj4gOCkgKyB2cDVfcmFjdF9sY1tjdF1bY2ddW25vZGVdW2N0eF1bMV0sIDEsIDI1NCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZwNV9wYXJzZV9jb2VmZihWUDU2Q29udGV4dCAqcykKK3sKKyAgICBWUDU2UmFuZ2VDb2RlciAqYyA9ICZzLT5jOworICAgIFZQNTZNb2RlbCAqbW9kZWwgPSBzLT5tb2RlbHA7CisgICAgdWludDhfdCAqcGVybXV0ZSA9IHMtPmlkY3Rfc2NhbnRhYmxlOworICAgIHVpbnQ4X3QgKm1vZGVsMSwgKm1vZGVsMjsKKyAgICBpbnQgY29lZmYsIHNpZ24sIGNvZWZmX2lkeDsKKyAgICBpbnQgYiwgaSwgY2csIGlkeCwgY3R4LCBjdHhfbGFzdDsKKyAgICBpbnQgcHQgPSAwOyAgICAvKiBwbGFuZSB0eXBlICgwIGZvciBZLCAxIGZvciBVIG9yIFYpICovCisKKyAgICBmb3IgKGI9MDsgYjw2OyBiKyspIHsKKyAgICAgICAgaW50IGN0ID0gMTsgICAgLyogY29kZSB0eXBlICovCisKKyAgICAgICAgaWYgKGIgPiAzKSBwdCA9IDE7CisKKyAgICAgICAgY3R4ID0gNipzLT5jb2VmZl9jdHhbZmZfdnA1Nl9iNnRvNFtiXV1bMF0KKyAgICAgICAgICAgICAgKyBzLT5hYm92ZV9ibG9ja3Nbcy0+YWJvdmVfYmxvY2tfaWR4W2JdXS5ub3RfbnVsbF9kYzsKKyAgICAgICAgbW9kZWwxID0gbW9kZWwtPmNvZWZmX2RjY3ZbcHRdOworICAgICAgICBtb2RlbDIgPSBtb2RlbC0+Y29lZmZfZGNjdFtwdF1bY3R4XTsKKworICAgICAgICBjb2VmZl9pZHggPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCBtb2RlbDJbMF0pKSB7CisgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgbW9kZWwyWzJdKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCBtb2RlbDJbM10pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb2VmZl9jdHhbZmZfdnA1Nl9iNnRvNFtiXV1bY29lZmZfaWR4XSA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSB2cDU2X3JhY19nZXRfdHJlZShjLCBmZl92cDU2X3BjX3RyZWUsIG1vZGVsMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gdnA1Nl9yYWNfZ2V0KGMpOworICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgPSBmZl92cDU2X2NvZWZmX2JpYXNbaWR4KzVdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPWZmX3ZwNTZfY29lZmZfYml0X2xlbmd0aFtpZHhdOyBpPj0wOyBpLS0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKz0gdnA1Nl9yYWNfZ2V0X3Byb2IoYywgZmZfdnA1Nl9jb2VmZl9wYXJzZV90YWJsZVtpZHhdW2ldKSA8PCBpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgbW9kZWwyWzRdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gMyArIHZwNTZfcmFjX2dldF9wcm9iKGMsIG1vZGVsMVs1XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29lZmZfY3R4W2ZmX3ZwNTZfYjZ0bzRbYl1dW2NvZWZmX2lkeF0gPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZiA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29lZmZfY3R4W2ZmX3ZwNTZfYjZ0bzRbYl1dW2NvZWZmX2lkeF0gPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IHZwNTZfcmFjX2dldChjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjdCA9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3QgPSAxOworICAgICAgICAgICAgICAgICAgICBzLT5jb2VmZl9jdHhbZmZfdnA1Nl9iNnRvNFtiXV1bY29lZmZfaWR4XSA9IDE7CisgICAgICAgICAgICAgICAgICAgIHNpZ24gPSB2cDU2X3JhY19nZXQoYyk7CisgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29lZmYgPSAoY29lZmYgXiAtc2lnbikgKyBzaWduOworICAgICAgICAgICAgICAgIGlmIChjb2VmZl9pZHgpCisgICAgICAgICAgICAgICAgICAgIGNvZWZmICo9IHMtPmRlcXVhbnRfYWM7CisgICAgICAgICAgICAgICAgcy0+YmxvY2tfY29lZmZbYl1bcGVybXV0ZVtjb2VmZl9pZHhdXSA9IGNvZWZmOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY3QgJiYgIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgbW9kZWwyWzFdKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY3QgPSAwOworICAgICAgICAgICAgICAgIHMtPmNvZWZmX2N0eFtmZl92cDU2X2I2dG80W2JdXVtjb2VmZl9pZHhdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZWZmX2lkeCsrOworICAgICAgICAgICAgaWYgKGNvZWZmX2lkeCA+PSA2NCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2cgPSB2cDVfY29lZmZfZ3JvdXBzW2NvZWZmX2lkeF07CisgICAgICAgICAgICBjdHggPSBzLT5jb2VmZl9jdHhbZmZfdnA1Nl9iNnRvNFtiXV1bY29lZmZfaWR4XTsKKyAgICAgICAgICAgIG1vZGVsMSA9IG1vZGVsLT5jb2VmZl9yYWN0W3B0XVtjdF1bY2ddOworICAgICAgICAgICAgbW9kZWwyID0gY2cgPiAyID8gbW9kZWwxIDogbW9kZWwtPmNvZWZmX2FjY3RbcHRdW2N0XVtjZ11bY3R4XTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eF9sYXN0ID0gRkZNSU4ocy0+Y29lZmZfY3R4X2xhc3RbZmZfdnA1Nl9iNnRvNFtiXV0sIDI0KTsKKyAgICAgICAgcy0+Y29lZmZfY3R4X2xhc3RbZmZfdnA1Nl9iNnRvNFtiXV0gPSBjb2VmZl9pZHg7CisgICAgICAgIGlmIChjb2VmZl9pZHggPCBjdHhfbGFzdCkKKyAgICAgICAgICAgIGZvciAoaT1jb2VmZl9pZHg7IGk8PWN0eF9sYXN0OyBpKyspCisgICAgICAgICAgICAgICAgcy0+Y29lZmZfY3R4W2ZmX3ZwNTZfYjZ0bzRbYl1dW2ldID0gNTsKKyAgICAgICAgcy0+YWJvdmVfYmxvY2tzW3MtPmFib3ZlX2Jsb2NrX2lkeFtiXV0ubm90X251bGxfZGMgPSBzLT5jb2VmZl9jdHhbZmZfdnA1Nl9iNnRvNFtiXV1bMF07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2cDVfZGVmYXVsdF9tb2RlbHNfaW5pdChWUDU2Q29udGV4dCAqcykKK3sKKyAgICBWUDU2TW9kZWwgKm1vZGVsID0gcy0+bW9kZWxwOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGk8MjsgaSsrKSB7CisgICAgICAgIG1vZGVsLT52ZWN0b3Jfc2lnW2ldID0gMHg4MDsKKyAgICAgICAgbW9kZWwtPnZlY3Rvcl9kY3RbaV0gPSAweDgwOworICAgICAgICBtb2RlbC0+dmVjdG9yX3BkaVtpXVswXSA9IDB4NTU7CisgICAgICAgIG1vZGVsLT52ZWN0b3JfcGRpW2ldWzFdID0gMHg4MDsKKyAgICB9CisgICAgbWVtY3B5KG1vZGVsLT5tYl90eXBlc19zdGF0cywgZmZfdnA1Nl9kZWZfbWJfdHlwZXNfc3RhdHMsIHNpemVvZihtb2RlbC0+bWJfdHlwZXNfc3RhdHMpKTsKKyAgICBtZW1zZXQobW9kZWwtPnZlY3Rvcl9wZHYsIDB4ODAsIHNpemVvZihtb2RlbC0+dmVjdG9yX3BkdikpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdnA1X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWUDU2Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfdnA1Nl9pbml0KGF2Y3R4LCAxLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHMtPnZwNTZfY29vcmRfZGl2ID0gdnA1X2Nvb3JkX2RpdjsKKyAgICBzLT5wYXJzZV92ZWN0b3JfYWRqdXN0bWVudCA9IHZwNV9wYXJzZV92ZWN0b3JfYWRqdXN0bWVudDsKKyAgICBzLT5wYXJzZV9jb2VmZiA9IHZwNV9wYXJzZV9jb2VmZjsKKyAgICBzLT5kZWZhdWx0X21vZGVsc19pbml0ID0gdnA1X2RlZmF1bHRfbW9kZWxzX2luaXQ7CisgICAgcy0+cGFyc2VfdmVjdG9yX21vZGVscyA9IHZwNV9wYXJzZV92ZWN0b3JfbW9kZWxzOworICAgIHMtPnBhcnNlX2NvZWZmX21vZGVscyA9IHZwNV9wYXJzZV9jb2VmZl9tb2RlbHM7CisgICAgcy0+cGFyc2VfaGVhZGVyID0gdnA1X3BhcnNlX2hlYWRlcjsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3ZwNV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2cDUiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPbjIgVlA1IiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZQNSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVlA1NkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHZwNV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl92cDU2X2ZyZWUsCisgICAgLmRlY29kZSAgICAgICAgID0gZmZfdnA1Nl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92cDU2LmMgYi9mZm1wZWcvbGliYXZjb2RlYy92cDU2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzOWI1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwNTYuYwpAQCAtMCwwICsxLDc2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWUDUgYW5kIFZQNiBjb21wYXRpYmxlIHZpZGVvIGRlY29kZXIgKGNvbW1vbiBmZWF0dXJlcykKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImgyNjRjaHJvbWEuaCIKKyNpbmNsdWRlICJ2cDU2LmgiCisjaW5jbHVkZSAidnA1NmRhdGEuaCIKKworCit2b2lkIGZmX3ZwNTZfaW5pdF9kZXF1YW50KFZQNTZDb250ZXh0ICpzLCBpbnQgcXVhbnRpemVyKQoreworICAgIHMtPnF1YW50aXplciA9IHF1YW50aXplcjsKKyAgICBzLT5kZXF1YW50X2RjID0gZmZfdnA1Nl9kY19kZXF1YW50W3F1YW50aXplcl0gPDwgMjsKKyAgICBzLT5kZXF1YW50X2FjID0gZmZfdnA1Nl9hY19kZXF1YW50W3F1YW50aXplcl0gPDwgMjsKK30KKworc3RhdGljIGludCB2cDU2X2dldF92ZWN0b3JzX3ByZWRpY3RvcnMoVlA1NkNvbnRleHQgKnMsIGludCByb3csIGludCBjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDU2RnJhbWUgcmVmX2ZyYW1lKQoreworICAgIGludCBuYl9wcmVkID0gMDsKKyAgICBWUDU2bXYgdmVjdFsyXSA9IHt7MCwwfSwgezAsMH19OworICAgIGludCBwb3MsIG9mZnNldDsKKyAgICBWUDU2bXYgbXZwOworCisgICAgZm9yIChwb3M9MDsgcG9zPDEyOyBwb3MrKykgeworICAgICAgICBtdnAueCA9IGNvbCArIGZmX3ZwNTZfY2FuZGlkYXRlX3ByZWRpY3Rvcl9wb3NbcG9zXVswXTsKKyAgICAgICAgbXZwLnkgPSByb3cgKyBmZl92cDU2X2NhbmRpZGF0ZV9wcmVkaWN0b3JfcG9zW3Bvc11bMV07CisgICAgICAgIGlmIChtdnAueCA8IDAgfHwgbXZwLnggPj0gcy0+bWJfd2lkdGggfHwKKyAgICAgICAgICAgIG12cC55IDwgMCB8fCBtdnAueSA+PSBzLT5tYl9oZWlnaHQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgb2Zmc2V0ID0gbXZwLnggKyBzLT5tYl93aWR0aCptdnAueTsKKworICAgICAgICBpZiAoZmZfdnA1Nl9yZWZlcmVuY2VfZnJhbWVbcy0+bWFjcm9ibG9ja3Nbb2Zmc2V0XS50eXBlXSAhPSByZWZfZnJhbWUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKChzLT5tYWNyb2Jsb2Nrc1tvZmZzZXRdLm12LnggPT0gdmVjdFswXS54ICYmCisgICAgICAgICAgICAgcy0+bWFjcm9ibG9ja3Nbb2Zmc2V0XS5tdi55ID09IHZlY3RbMF0ueSkgfHwKKyAgICAgICAgICAgIChzLT5tYWNyb2Jsb2Nrc1tvZmZzZXRdLm12LnggPT0gMCAmJgorICAgICAgICAgICAgIHMtPm1hY3JvYmxvY2tzW29mZnNldF0ubXYueSA9PSAwKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHZlY3RbbmJfcHJlZCsrXSA9IHMtPm1hY3JvYmxvY2tzW29mZnNldF0ubXY7CisgICAgICAgIGlmIChuYl9wcmVkID4gMSkgeworICAgICAgICAgICAgbmJfcHJlZCA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy0+dmVjdG9yX2NhbmRpZGF0ZV9wb3MgPSBwb3M7CisgICAgfQorCisgICAgcy0+dmVjdG9yX2NhbmRpZGF0ZVswXSA9IHZlY3RbMF07CisgICAgcy0+dmVjdG9yX2NhbmRpZGF0ZVsxXSA9IHZlY3RbMV07CisKKyAgICByZXR1cm4gbmJfcHJlZCsxOworfQorCitzdGF0aWMgdm9pZCB2cDU2X3BhcnNlX21iX3R5cGVfbW9kZWxzKFZQNTZDb250ZXh0ICpzKQoreworICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CisgICAgVlA1Nk1vZGVsICptb2RlbCA9IHMtPm1vZGVscDsKKyAgICBpbnQgaSwgY3R4LCB0eXBlOworCisgICAgZm9yIChjdHg9MDsgY3R4PDM7IGN0eCsrKSB7CisgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIDE3NCkpIHsKKyAgICAgICAgICAgIGludCBpZHggPSB2cDU2X3JhY19nZXRzKGMsIDQpOworICAgICAgICAgICAgbWVtY3B5KG1vZGVsLT5tYl90eXBlc19zdGF0c1tjdHhdLAorICAgICAgICAgICAgICAgICAgIGZmX3ZwNTZfcHJlX2RlZl9tYl90eXBlX3N0YXRzW2lkeF1bY3R4XSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YobW9kZWwtPm1iX3R5cGVzX3N0YXRzW2N0eF0pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCAyNTQpKSB7CisgICAgICAgICAgICBmb3IgKHR5cGU9MDsgdHlwZTwxMDsgdHlwZSsrKSB7CisgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgMjA1KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhLCBzaWduID0gdnA1Nl9yYWNfZ2V0KGMpOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IHZwNTZfcmFjX2dldF90cmVlKGMsIGZmX3ZwNTZfcG1idG1fdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdnA1Nl9tYl90eXBlX21vZGVsX21vZGVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVsdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSA0ICogdnA1Nl9yYWNfZ2V0cyhjLCA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLT5tYl90eXBlc19zdGF0c1tjdHhdW3R5cGVdW2ldICs9IChkZWx0YSBeIC1zaWduKSArIHNpZ247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjb21wdXRlIE1CIHR5cGUgcHJvYmFiaWxpdHkgdGFibGVzIGJhc2VkIG9uIHByZXZpb3VzIE1CIHR5cGUgKi8KKyAgICBmb3IgKGN0eD0wOyBjdHg8MzsgY3R4KyspIHsKKyAgICAgICAgaW50IHBbMTBdOworCisgICAgICAgIGZvciAodHlwZT0wOyB0eXBlPDEwOyB0eXBlKyspCisgICAgICAgICAgICBwW3R5cGVdID0gMTAwICogbW9kZWwtPm1iX3R5cGVzX3N0YXRzW2N0eF1bdHlwZV1bMV07CisKKyAgICAgICAgZm9yICh0eXBlPTA7IHR5cGU8MTA7IHR5cGUrKykgeworICAgICAgICAgICAgaW50IHAwMiwgcDM0LCBwMDIzNCwgcDE3LCBwNTYsIHA4OSwgcDU2ODksIHAxNTY3ODk7CisKKyAgICAgICAgICAgIC8qIGNvbnNlcnZhdGl2ZSBNQiB0eXBlIHByb2JhYmlsaXR5ICovCisgICAgICAgICAgICBtb2RlbC0+bWJfdHlwZVtjdHhdW3R5cGVdWzBdID0gMjU1IC0gKDI1NSAqIG1vZGVsLT5tYl90eXBlc19zdGF0c1tjdHhdW3R5cGVdWzBdKSAvICgxICsgbW9kZWwtPm1iX3R5cGVzX3N0YXRzW2N0eF1bdHlwZV1bMF0gKyBtb2RlbC0+bWJfdHlwZXNfc3RhdHNbY3R4XVt0eXBlXVsxXSk7CisKKyAgICAgICAgICAgIHBbdHlwZV0gPSAwOyAgICAvKiBzYW1lIE1CIHR5cGUgPT4gd2VpZ2h0IGlzIG51bGwgKi8KKworICAgICAgICAgICAgLyogYmluYXJ5IHRyZWUgcGFyc2luZyBwcm9iYWJpbGl0aWVzICovCisgICAgICAgICAgICBwMDIgPSBwWzBdICsgcFsyXTsKKyAgICAgICAgICAgIHAzNCA9IHBbM10gKyBwWzRdOworICAgICAgICAgICAgcDAyMzQgPSBwMDIgKyBwMzQ7CisgICAgICAgICAgICBwMTcgPSBwWzFdICsgcFs3XTsKKyAgICAgICAgICAgIHA1NiA9IHBbNV0gKyBwWzZdOworICAgICAgICAgICAgcDg5ID0gcFs4XSArIHBbOV07CisgICAgICAgICAgICBwNTY4OSA9IHA1NiArIHA4OTsKKyAgICAgICAgICAgIHAxNTY3ODkgPSBwMTcgKyBwNTY4OTsKKworICAgICAgICAgICAgbW9kZWwtPm1iX3R5cGVbY3R4XVt0eXBlXVsxXSA9IDEgKyAyNTUgKiBwMDIzNC8oMStwMDIzNCtwMTU2Nzg5KTsKKyAgICAgICAgICAgIG1vZGVsLT5tYl90eXBlW2N0eF1bdHlwZV1bMl0gPSAxICsgMjU1ICogcDAyICAvICgxK3AwMjM0KTsKKyAgICAgICAgICAgIG1vZGVsLT5tYl90eXBlW2N0eF1bdHlwZV1bM10gPSAxICsgMjU1ICogcDE3ICAvICgxK3AxNTY3ODkpOworICAgICAgICAgICAgbW9kZWwtPm1iX3R5cGVbY3R4XVt0eXBlXVs0XSA9IDEgKyAyNTUgKiBwWzBdIC8gKDErcDAyKTsKKyAgICAgICAgICAgIG1vZGVsLT5tYl90eXBlW2N0eF1bdHlwZV1bNV0gPSAxICsgMjU1ICogcFszXSAvICgxK3AzNCk7CisgICAgICAgICAgICBtb2RlbC0+bWJfdHlwZVtjdHhdW3R5cGVdWzZdID0gMSArIDI1NSAqIHBbMV0gLyAoMStwMTcpOworICAgICAgICAgICAgbW9kZWwtPm1iX3R5cGVbY3R4XVt0eXBlXVs3XSA9IDEgKyAyNTUgKiBwNTYgIC8gKDErcDU2ODkpOworICAgICAgICAgICAgbW9kZWwtPm1iX3R5cGVbY3R4XVt0eXBlXVs4XSA9IDEgKyAyNTUgKiBwWzVdIC8gKDErcDU2KTsKKyAgICAgICAgICAgIG1vZGVsLT5tYl90eXBlW2N0eF1bdHlwZV1bOV0gPSAxICsgMjU1ICogcFs4XSAvICgxK3A4OSk7CisKKyAgICAgICAgICAgIC8qIHJlc3RvcmUgaW5pdGlhbCB2YWx1ZSAqLworICAgICAgICAgICAgcFt0eXBlXSA9IDEwMCAqIG1vZGVsLT5tYl90eXBlc19zdGF0c1tjdHhdW3R5cGVdWzFdOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgVlA1Nm1iIHZwNTZfcGFyc2VfbWJfdHlwZShWUDU2Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQNTZtYiBwcmV2X3R5cGUsIGludCBjdHgpCit7CisgICAgdWludDhfdCAqbWJfdHlwZV9tb2RlbCA9IHMtPm1vZGVscC0+bWJfdHlwZVtjdHhdW3ByZXZfdHlwZV07CisgICAgVlA1NlJhbmdlQ29kZXIgKmMgPSAmcy0+YzsKKworICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIG1iX3R5cGVfbW9kZWxbMF0pKQorICAgICAgICByZXR1cm4gcHJldl90eXBlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHZwNTZfcmFjX2dldF90cmVlKGMsIGZmX3ZwNTZfcG1idF90cmVlLCBtYl90eXBlX21vZGVsKTsKK30KKworc3RhdGljIHZvaWQgdnA1Nl9kZWNvZGVfNG12KFZQNTZDb250ZXh0ICpzLCBpbnQgcm93LCBpbnQgY29sKQoreworICAgIFZQNTZtdiBtdiA9IHswLDB9OworICAgIGludCB0eXBlWzRdOworICAgIGludCBiOworCisgICAgLyogcGFyc2UgZWFjaCBibG9jayB0eXBlICovCisgICAgZm9yIChiPTA7IGI8NDsgYisrKSB7CisgICAgICAgIHR5cGVbYl0gPSB2cDU2X3JhY19nZXRzKCZzLT5jLCAyKTsKKyAgICAgICAgaWYgKHR5cGVbYl0pCisgICAgICAgICAgICB0eXBlW2JdKys7ICAvKiBvbmx5IHJldHVybnMgMCwgMiwgMyBvciA0IChhbGwgSU5URVJfUEYpICovCisgICAgfQorCisgICAgLyogZ2V0IHZlY3RvcnMgKi8KKyAgICBmb3IgKGI9MDsgYjw0OyBiKyspIHsKKyAgICAgICAgc3dpdGNoICh0eXBlW2JdKSB7CisgICAgICAgICAgICBjYXNlIFZQNTZfTUJfSU5URVJfTk9WRUNfUEY6CisgICAgICAgICAgICAgICAgcy0+bXZbYl0gPSAoVlA1Nm12KSB7MCwwfTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVlA1Nl9NQl9JTlRFUl9ERUxUQV9QRjoKKyAgICAgICAgICAgICAgICBzLT5wYXJzZV92ZWN0b3JfYWRqdXN0bWVudChzLCAmcy0+bXZbYl0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWUDU2X01CX0lOVEVSX1YxX1BGOgorICAgICAgICAgICAgICAgIHMtPm12W2JdID0gcy0+dmVjdG9yX2NhbmRpZGF0ZVswXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVlA1Nl9NQl9JTlRFUl9WMl9QRjoKKyAgICAgICAgICAgICAgICBzLT5tdltiXSA9IHMtPnZlY3Rvcl9jYW5kaWRhdGVbMV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbXYueCArPSBzLT5tdltiXS54OworICAgICAgICBtdi55ICs9IHMtPm12W2JdLnk7CisgICAgfQorCisgICAgLyogdGhpcyBpcyB0aGUgb25lIHNlbGVjdGVkIGZvciB0aGUgd2hvbGUgTUIgZm9yIHByZWRpY3Rpb24gKi8KKyAgICBzLT5tYWNyb2Jsb2Nrc1tyb3cgKiBzLT5tYl93aWR0aCArIGNvbF0ubXYgPSBzLT5tdlszXTsKKworICAgIC8qIGNocm9tYSB2ZWN0b3JzIGFyZSBhdmVyYWdlIGx1bWEgdmVjdG9ycyAqLworICAgIGlmIChzLT5hdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX1ZQNSkgeworICAgICAgICBzLT5tdls0XS54ID0gcy0+bXZbNV0ueCA9IFJTSElGVChtdi54LDIpOworICAgICAgICBzLT5tdls0XS55ID0gcy0+bXZbNV0ueSA9IFJTSElGVChtdi55LDIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPm12WzRdID0gcy0+bXZbNV0gPSAoVlA1Nm12KSB7bXYueC80LCBtdi55LzR9OworICAgIH0KK30KKworc3RhdGljIFZQNTZtYiB2cDU2X2RlY29kZV9tdihWUDU2Q29udGV4dCAqcywgaW50IHJvdywgaW50IGNvbCkKK3sKKyAgICBWUDU2bXYgKm12LCB2ZWN0ID0gezAsMH07CisgICAgaW50IGN0eCwgYjsKKworICAgIGN0eCA9IHZwNTZfZ2V0X3ZlY3RvcnNfcHJlZGljdG9ycyhzLCByb3csIGNvbCwgVlA1Nl9GUkFNRV9QUkVWSU9VUyk7CisgICAgcy0+bWJfdHlwZSA9IHZwNTZfcGFyc2VfbWJfdHlwZShzLCBzLT5tYl90eXBlLCBjdHgpOworICAgIHMtPm1hY3JvYmxvY2tzW3JvdyAqIHMtPm1iX3dpZHRoICsgY29sXS50eXBlID0gcy0+bWJfdHlwZTsKKworICAgIHN3aXRjaCAocy0+bWJfdHlwZSkgeworICAgICAgICBjYXNlIFZQNTZfTUJfSU5URVJfVjFfUEY6CisgICAgICAgICAgICBtdiA9ICZzLT52ZWN0b3JfY2FuZGlkYXRlWzBdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWUDU2X01CX0lOVEVSX1YyX1BGOgorICAgICAgICAgICAgbXYgPSAmcy0+dmVjdG9yX2NhbmRpZGF0ZVsxXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVlA1Nl9NQl9JTlRFUl9WMV9HRjoKKyAgICAgICAgICAgIHZwNTZfZ2V0X3ZlY3RvcnNfcHJlZGljdG9ycyhzLCByb3csIGNvbCwgVlA1Nl9GUkFNRV9HT0xERU4pOworICAgICAgICAgICAgbXYgPSAmcy0+dmVjdG9yX2NhbmRpZGF0ZVswXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVlA1Nl9NQl9JTlRFUl9WMl9HRjoKKyAgICAgICAgICAgIHZwNTZfZ2V0X3ZlY3RvcnNfcHJlZGljdG9ycyhzLCByb3csIGNvbCwgVlA1Nl9GUkFNRV9HT0xERU4pOworICAgICAgICAgICAgbXYgPSAmcy0+dmVjdG9yX2NhbmRpZGF0ZVsxXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVlA1Nl9NQl9JTlRFUl9ERUxUQV9QRjoKKyAgICAgICAgICAgIHMtPnBhcnNlX3ZlY3Rvcl9hZGp1c3RtZW50KHMsICZ2ZWN0KTsKKyAgICAgICAgICAgIG12ID0gJnZlY3Q7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZQNTZfTUJfSU5URVJfREVMVEFfR0Y6CisgICAgICAgICAgICB2cDU2X2dldF92ZWN0b3JzX3ByZWRpY3RvcnMocywgcm93LCBjb2wsIFZQNTZfRlJBTUVfR09MREVOKTsKKyAgICAgICAgICAgIHMtPnBhcnNlX3ZlY3Rvcl9hZGp1c3RtZW50KHMsICZ2ZWN0KTsKKyAgICAgICAgICAgIG12ID0gJnZlY3Q7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZQNTZfTUJfSU5URVJfNFY6CisgICAgICAgICAgICB2cDU2X2RlY29kZV80bXYocywgcm93LCBjb2wpOworICAgICAgICAgICAgcmV0dXJuIHMtPm1iX3R5cGU7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG12ID0gJnZlY3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzLT5tYWNyb2Jsb2Nrc1tyb3cqcy0+bWJfd2lkdGggKyBjb2xdLm12ID0gKm12OworCisgICAgLyogc2FtZSB2ZWN0b3IgZm9yIGFsbCBibG9ja3MgKi8KKyAgICBmb3IgKGI9MDsgYjw2OyBiKyspCisgICAgICAgIHMtPm12W2JdID0gKm12OworCisgICAgcmV0dXJuIHMtPm1iX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkIHZwNTZfYWRkX3ByZWRpY3RvcnNfZGMoVlA1NkNvbnRleHQgKnMsIFZQNTZGcmFtZSByZWZfZnJhbWUpCit7CisgICAgaW50IGlkeCA9IHMtPmlkY3Rfc2NhbnRhYmxlWzBdOworICAgIGludCBiOworCisgICAgZm9yIChiPTA7IGI8NjsgYisrKSB7CisgICAgICAgIFZQNTZSZWZEYyAqYWIgPSAmcy0+YWJvdmVfYmxvY2tzW3MtPmFib3ZlX2Jsb2NrX2lkeFtiXV07CisgICAgICAgIFZQNTZSZWZEYyAqbGIgPSAmcy0+bGVmdF9ibG9ja1tmZl92cDU2X2I2dG80W2JdXTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgaW50IGRjID0gMDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYgKHJlZl9mcmFtZSA9PSBsYi0+cmVmX2ZyYW1lKSB7CisgICAgICAgICAgICBkYyArPSBsYi0+ZGNfY29lZmY7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgICAgIGlmIChyZWZfZnJhbWUgPT0gYWItPnJlZl9mcmFtZSkgeworICAgICAgICAgICAgZGMgKz0gYWItPmRjX2NvZWZmOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+YXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9WUDUpCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMiAmJiByZWZfZnJhbWUgPT0gYWJbLTErMippXS5yZWZfZnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGMgKz0gYWJbLTErMippXS5kY19jb2VmZjsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgICAgZGMgPSBzLT5wcmV2X2RjW2ZmX3ZwNTZfYjJwW2JdXVtyZWZfZnJhbWVdOworICAgICAgICBlbHNlIGlmIChjb3VudCA9PSAyKQorICAgICAgICAgICAgZGMgLz0gMjsKKworICAgICAgICBzLT5ibG9ja19jb2VmZltiXVtpZHhdICs9IGRjOworICAgICAgICBzLT5wcmV2X2RjW2ZmX3ZwNTZfYjJwW2JdXVtyZWZfZnJhbWVdID0gcy0+YmxvY2tfY29lZmZbYl1baWR4XTsKKyAgICAgICAgYWItPmRjX2NvZWZmID0gcy0+YmxvY2tfY29lZmZbYl1baWR4XTsKKyAgICAgICAgYWItPnJlZl9mcmFtZSA9IHJlZl9mcmFtZTsKKyAgICAgICAgbGItPmRjX2NvZWZmID0gcy0+YmxvY2tfY29lZmZbYl1baWR4XTsKKyAgICAgICAgbGItPnJlZl9mcmFtZSA9IHJlZl9mcmFtZTsKKyAgICAgICAgcy0+YmxvY2tfY29lZmZbYl1baWR4XSAqPSBzLT5kZXF1YW50X2RjOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdnA1Nl9kZWJsb2NrX2ZpbHRlcihWUDU2Q29udGV4dCAqcywgdWludDhfdCAqeXV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgZHgsIGludCBkeSkKK3sKKyAgICBpbnQgdCA9IGZmX3ZwNTZfZmlsdGVyX3RocmVzaG9sZFtzLT5xdWFudGl6ZXJdOworICAgIGlmIChkeCkgIHMtPnZwNTZkc3AuZWRnZV9maWx0ZXJfaG9yKHl1diArICAgICAgICAgMTAtZHggLCBzdHJpZGUsIHQpOworICAgIGlmIChkeSkgIHMtPnZwNTZkc3AuZWRnZV9maWx0ZXJfdmVyKHl1diArIHN0cmlkZSooMTAtZHkpLCBzdHJpZGUsIHQpOworfQorCitzdGF0aWMgdm9pZCB2cDU2X21jKFZQNTZDb250ZXh0ICpzLCBpbnQgYiwgaW50IHBsYW5lLCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCB4LCBpbnQgeSkKK3sKKyAgICB1aW50OF90ICpkc3QgPSBzLT5mcmFtZXNbVlA1Nl9GUkFNRV9DVVJSRU5UXS0+ZGF0YVtwbGFuZV0gKyBzLT5ibG9ja19vZmZzZXRbYl07CisgICAgdWludDhfdCAqc3JjX2Jsb2NrOworICAgIGludCBzcmNfb2Zmc2V0OworICAgIGludCBvdmVybGFwX29mZnNldCA9IDA7CisgICAgaW50IG1hc2sgPSBzLT52cDU2X2Nvb3JkX2RpdltiXSAtIDE7CisgICAgaW50IGRlYmxvY2tfZmlsdGVyaW5nID0gcy0+ZGVibG9ja19maWx0ZXJpbmc7CisgICAgaW50IGR4OworICAgIGludCBkeTsKKworICAgIGlmIChzLT5hdmN0eC0+c2tpcF9sb29wX2ZpbHRlciA+PSBBVkRJU0NBUkRfQUxMIHx8CisgICAgICAgIChzLT5hdmN0eC0+c2tpcF9sb29wX2ZpbHRlciA+PSBBVkRJU0NBUkRfTk9OS0VZCisgICAgICAgICAmJiAhcy0+ZnJhbWVzW1ZQNTZfRlJBTUVfQ1VSUkVOVF0tPmtleV9mcmFtZSkpCisgICAgICAgIGRlYmxvY2tfZmlsdGVyaW5nID0gMDsKKworICAgIGR4ID0gcy0+bXZbYl0ueCAvIHMtPnZwNTZfY29vcmRfZGl2W2JdOworICAgIGR5ID0gcy0+bXZbYl0ueSAvIHMtPnZwNTZfY29vcmRfZGl2W2JdOworCisgICAgaWYgKGIgPj0gNCkgeworICAgICAgICB4IC89IDI7CisgICAgICAgIHkgLz0gMjsKKyAgICB9CisgICAgeCArPSBkeCAtIDI7CisgICAgeSArPSBkeSAtIDI7CisKKyAgICBpZiAoeDwwIHx8IHgrMTI+PXMtPnBsYW5lX3dpZHRoW3BsYW5lXSB8fAorICAgICAgICB5PDAgfHwgeSsxMj49cy0+cGxhbmVfaGVpZ2h0W3BsYW5lXSkgeworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgcy0+YmxvY2tfb2Zmc2V0W2JdICsgKGR5LTIpKnN0cmlkZSArIChkeC0yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEyLCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVfd2lkdGhbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVfaGVpZ2h0W3BsYW5lXSk7CisgICAgICAgIHNyY19ibG9jayA9IHMtPmVkZ2VfZW11X2J1ZmZlcjsKKyAgICAgICAgc3JjX29mZnNldCA9IDIgKyAyKnN0cmlkZTsKKyAgICB9IGVsc2UgaWYgKGRlYmxvY2tfZmlsdGVyaW5nKSB7CisgICAgICAgIC8qIG9ubHkgbmVlZCBhIDEyeDEyIGJsb2NrLCBidXQgdGhlcmUgaXMgbm8gc3VjaCBkc3AgZnVuY3Rpb24sICovCisgICAgICAgIC8qIHNvIGNvcHkgYSAxNngxMiBibG9jayAqLworICAgICAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiWzBdWzBdKHMtPmVkZ2VfZW11X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgKyBzLT5ibG9ja19vZmZzZXRbYl0gKyAoZHktMikqc3RyaWRlICsgKGR4LTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgMTIpOworICAgICAgICBzcmNfYmxvY2sgPSBzLT5lZGdlX2VtdV9idWZmZXI7CisgICAgICAgIHNyY19vZmZzZXQgPSAyICsgMipzdHJpZGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjX2Jsb2NrID0gc3JjOworICAgICAgICBzcmNfb2Zmc2V0ID0gcy0+YmxvY2tfb2Zmc2V0W2JdICsgZHkqc3RyaWRlICsgZHg7CisgICAgfQorCisgICAgaWYgKGRlYmxvY2tfZmlsdGVyaW5nKQorICAgICAgICB2cDU2X2RlYmxvY2tfZmlsdGVyKHMsIHNyY19ibG9jaywgc3RyaWRlLCBkeCY3LCBkeSY3KTsKKworICAgIGlmIChzLT5tdltiXS54ICYgbWFzaykKKyAgICAgICAgb3ZlcmxhcF9vZmZzZXQgKz0gKHMtPm12W2JdLnggPiAwKSA/IDEgOiAtMTsKKyAgICBpZiAocy0+bXZbYl0ueSAmIG1hc2spCisgICAgICAgIG92ZXJsYXBfb2Zmc2V0ICs9IChzLT5tdltiXS55ID4gMCkgPyBzdHJpZGUgOiAtc3RyaWRlOworCisgICAgaWYgKG92ZXJsYXBfb2Zmc2V0KSB7CisgICAgICAgIGlmIChzLT5maWx0ZXIpCisgICAgICAgICAgICBzLT5maWx0ZXIocywgZHN0LCBzcmNfYmxvY2ssIHNyY19vZmZzZXQsIHNyY19vZmZzZXQrb3ZlcmxhcF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBzLT5tdltiXSwgbWFzaywgcy0+ZmlsdGVyX3NlbGVjdGlvbiwgYjw0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+dnAzZHNwLnB1dF9ub19ybmRfcGl4ZWxzX2wyKGRzdCwgc3JjX2Jsb2NrK3NyY19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2Jsb2NrK3NyY19vZmZzZXQrb3ZlcmxhcF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCA4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiWzFdWzBdKGRzdCwgc3JjX2Jsb2NrK3NyY19vZmZzZXQsIHN0cmlkZSwgOCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2cDU2X2RlY29kZV9tYihWUDU2Q29udGV4dCAqcywgaW50IHJvdywgaW50IGNvbCwgaW50IGlzX2FscGhhKQoreworICAgIEFWRnJhbWUgKmZyYW1lX2N1cnJlbnQsICpmcmFtZV9yZWY7CisgICAgVlA1Nm1iIG1iX3R5cGU7CisgICAgVlA1NkZyYW1lIHJlZl9mcmFtZTsKKyAgICBpbnQgYiwgYWIsIGJfbWF4LCBwbGFuZSwgb2ZmOworCisgICAgaWYgKHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdLT5rZXlfZnJhbWUpCisgICAgICAgIG1iX3R5cGUgPSBWUDU2X01CX0lOVFJBOworICAgIGVsc2UKKyAgICAgICAgbWJfdHlwZSA9IHZwNTZfZGVjb2RlX212KHMsIHJvdywgY29sKTsKKyAgICByZWZfZnJhbWUgPSBmZl92cDU2X3JlZmVyZW5jZV9mcmFtZVttYl90eXBlXTsKKworICAgIHMtPnBhcnNlX2NvZWZmKHMpOworCisgICAgdnA1Nl9hZGRfcHJlZGljdG9yc19kYyhzLCByZWZfZnJhbWUpOworCisgICAgZnJhbWVfY3VycmVudCA9IHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdOworICAgIGZyYW1lX3JlZiA9IHMtPmZyYW1lc1tyZWZfZnJhbWVdOworICAgIGlmIChtYl90eXBlICE9IFZQNTZfTUJfSU5UUkEgJiYgIWZyYW1lX3JlZi0+ZGF0YVswXSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYWIgPSA2KmlzX2FscGhhOworICAgIGJfbWF4ID0gNiAtIDIqaXNfYWxwaGE7CisKKyAgICBzd2l0Y2ggKG1iX3R5cGUpIHsKKyAgICAgICAgY2FzZSBWUDU2X01CX0lOVFJBOgorICAgICAgICAgICAgZm9yIChiPTA7IGI8Yl9tYXg7IGIrKykgeworICAgICAgICAgICAgICAgIHBsYW5lID0gZmZfdnA1Nl9iMnBbYithYl07CisgICAgICAgICAgICAgICAgcy0+dnAzZHNwLmlkY3RfcHV0KGZyYW1lX2N1cnJlbnQtPmRhdGFbcGxhbmVdICsgcy0+YmxvY2tfb2Zmc2V0W2JdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJpZGVbcGxhbmVdLCBzLT5ibG9ja19jb2VmZltiXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZQNTZfTUJfSU5URVJfTk9WRUNfUEY6CisgICAgICAgIGNhc2UgVlA1Nl9NQl9JTlRFUl9OT1ZFQ19HRjoKKyAgICAgICAgICAgIGZvciAoYj0wOyBiPGJfbWF4OyBiKyspIHsKKyAgICAgICAgICAgICAgICBwbGFuZSA9IGZmX3ZwNTZfYjJwW2IrYWJdOworICAgICAgICAgICAgICAgIG9mZiA9IHMtPmJsb2NrX29mZnNldFtiXTsKKyAgICAgICAgICAgICAgICBzLT5oZHNwLnB1dF9waXhlbHNfdGFiWzFdWzBdKGZyYW1lX2N1cnJlbnQtPmRhdGFbcGxhbmVdICsgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfcmVmLT5kYXRhW3BsYW5lXSArIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmlkZVtwbGFuZV0sIDgpOworICAgICAgICAgICAgICAgIHMtPnZwM2RzcC5pZGN0X2FkZChmcmFtZV9jdXJyZW50LT5kYXRhW3BsYW5lXSArIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyaWRlW3BsYW5lXSwgcy0+YmxvY2tfY29lZmZbYl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWUDU2X01CX0lOVEVSX0RFTFRBX1BGOgorICAgICAgICBjYXNlIFZQNTZfTUJfSU5URVJfVjFfUEY6CisgICAgICAgIGNhc2UgVlA1Nl9NQl9JTlRFUl9WMl9QRjoKKyAgICAgICAgY2FzZSBWUDU2X01CX0lOVEVSX0RFTFRBX0dGOgorICAgICAgICBjYXNlIFZQNTZfTUJfSU5URVJfNFY6CisgICAgICAgIGNhc2UgVlA1Nl9NQl9JTlRFUl9WMV9HRjoKKyAgICAgICAgY2FzZSBWUDU2X01CX0lOVEVSX1YyX0dGOgorICAgICAgICAgICAgZm9yIChiPTA7IGI8Yl9tYXg7IGIrKykgeworICAgICAgICAgICAgICAgIGludCB4X29mZiA9IGI9PTEgfHwgYj09MyA/IDggOiAwOworICAgICAgICAgICAgICAgIGludCB5X29mZiA9IGI9PTIgfHwgYj09MyA/IDggOiAwOworICAgICAgICAgICAgICAgIHBsYW5lID0gZmZfdnA1Nl9iMnBbYithYl07CisgICAgICAgICAgICAgICAgdnA1Nl9tYyhzLCBiLCBwbGFuZSwgZnJhbWVfcmVmLT5kYXRhW3BsYW5lXSwgcy0+c3RyaWRlW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2KmNvbCt4X29mZiwgMTYqcm93K3lfb2ZmKTsKKyAgICAgICAgICAgICAgICBzLT52cDNkc3AuaWRjdF9hZGQoZnJhbWVfY3VycmVudC0+ZGF0YVtwbGFuZV0gKyBzLT5ibG9ja19vZmZzZXRbYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmlkZVtwbGFuZV0sIHMtPmJsb2NrX2NvZWZmW2JdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpc19hbHBoYSkgeworICAgICAgICBzLT5ibG9ja19jb2VmZls0XVswXSA9IDA7CisgICAgICAgIHMtPmJsb2NrX2NvZWZmWzVdWzBdID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdnA1Nl9zaXplX2NoYW5nZWQoVlA1NkNvbnRleHQgKnMpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gcy0+YXZjdHg7CisgICAgaW50IHN0cmlkZSA9IHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdLT5saW5lc2l6ZVswXTsKKyAgICBpbnQgaTsKKworICAgIHMtPnBsYW5lX3dpZHRoWzBdICA9IHMtPnBsYW5lX3dpZHRoWzNdICA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICBzLT5wbGFuZV93aWR0aFsxXSAgPSBzLT5wbGFuZV93aWR0aFsyXSAgPSBhdmN0eC0+Y29kZWRfd2lkdGgvMjsKKyAgICBzLT5wbGFuZV9oZWlnaHRbMF0gPSBzLT5wbGFuZV9oZWlnaHRbM10gPSBhdmN0eC0+Y29kZWRfaGVpZ2h0OworICAgIHMtPnBsYW5lX2hlaWdodFsxXSA9IHMtPnBsYW5lX2hlaWdodFsyXSA9IGF2Y3R4LT5jb2RlZF9oZWlnaHQvMjsKKworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgcy0+c3RyaWRlW2ldID0gcy0+ZmxpcCAqIHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdLT5saW5lc2l6ZVtpXTsKKworICAgIHMtPm1iX3dpZHRoICA9IChhdmN0eC0+Y29kZWRfd2lkdGggKzE1KSAvIDE2OworICAgIHMtPm1iX2hlaWdodCA9IChhdmN0eC0+Y29kZWRfaGVpZ2h0KzE1KSAvIDE2OworCisgICAgaWYgKHMtPm1iX3dpZHRoID4gMTAwMCB8fCBzLT5tYl9oZWlnaHQgPiAxMDAwKSB7CisgICAgICAgIGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCAwLCAwKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwaWN0dXJlIHRvbyBiaWdcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYXZfcmVhbGxvY3BfYXJyYXkoJnMtPmFib3ZlX2Jsb2NrcywgNCpzLT5tYl93aWR0aCs2LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+YWJvdmVfYmxvY2tzKSk7CisgICAgYXZfcmVhbGxvY3BfYXJyYXkoJnMtPm1hY3JvYmxvY2tzLCBzLT5tYl93aWR0aCpzLT5tYl9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5tYWNyb2Jsb2NrcykpOworICAgIGF2X2ZyZWUocy0+ZWRnZV9lbXVfYnVmZmVyX2FsbG9jKTsKKyAgICBzLT5lZGdlX2VtdV9idWZmZXJfYWxsb2MgPSBhdl9tYWxsb2MoMTYqc3RyaWRlKTsKKyAgICBzLT5lZGdlX2VtdV9idWZmZXIgPSBzLT5lZGdlX2VtdV9idWZmZXJfYWxsb2M7CisgICAgaWYgKCFzLT5hYm92ZV9ibG9ja3MgfHwgIXMtPm1hY3JvYmxvY2tzIHx8ICFzLT5lZGdlX2VtdV9idWZmZXJfYWxsb2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaWYgKHMtPmZsaXAgPCAwKQorICAgICAgICBzLT5lZGdlX2VtdV9idWZmZXIgKz0gMTUgKiBzdHJpZGU7CisKKyAgICBpZiAocy0+YWxwaGFfY29udGV4dCkKKyAgICAgICAgcmV0dXJuIHZwNTZfc2l6ZV9jaGFuZ2VkKHMtPmFscGhhX2NvbnRleHQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmZfdnA1Nl9kZWNvZGVfbWJzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqLCBpbnQsIGludCk7CisKK2ludCBmZl92cDU2X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBWUDU2Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqY29uc3QgcCA9IHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdOworICAgIGludCByZW1haW5pbmdfYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBpbnQgYXZfdW5pbml0KGFscGhhX29mZnNldCk7CisgICAgaW50IGksIHJlczsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHMtPmhhc19hbHBoYSkgeworICAgICAgICBpZiAocmVtYWluaW5nX2J1Zl9zaXplIDwgMykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYWxwaGFfb2Zmc2V0ID0gYnl0ZXN0cmVhbV9nZXRfYmUyNCgmYnVmKTsKKyAgICAgICAgcmVtYWluaW5nX2J1Zl9zaXplIC09IDM7CisgICAgICAgIGlmIChyZW1haW5pbmdfYnVmX3NpemUgPCBhbHBoYV9vZmZzZXQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmVzID0gcy0+cGFyc2VfaGVhZGVyKHMsIGJ1ZiwgcmVtYWluaW5nX2J1Zl9zaXplKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIGlmIChyZXMgPT0gVlA1Nl9TSVpFX0NIQU5HRSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5mcmFtZXNbaV0pOworICAgICAgICAgICAgaWYgKHMtPmFscGhhX2NvbnRleHQpCisgICAgICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+YWxwaGFfY29udGV4dC0+ZnJhbWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVkE0MjBQKSB7CisgICAgICAgIGF2X2ZyYW1lX3VucmVmKHMtPmFscGhhX2NvbnRleHQtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdKTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYocy0+YWxwaGFfY29udGV4dC0+ZnJhbWVzW1ZQNTZfRlJBTUVfQ1VSUkVOVF0sIHApKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKHApOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXMgPT0gVlA1Nl9TSVpFX0NIQU5HRSkgeworICAgICAgICBpZiAodnA1Nl9zaXplX2NoYW5nZWQocykpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKHApOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWQTQyMFApIHsKKyAgICAgICAgaW50IGJha193ID0gYXZjdHgtPndpZHRoOworICAgICAgICBpbnQgYmFrX2ggPSBhdmN0eC0+aGVpZ2h0OworICAgICAgICBpbnQgYmFrX2N3ID0gYXZjdHgtPmNvZGVkX3dpZHRoOworICAgICAgICBpbnQgYmFrX2NoID0gYXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICAgICAgYnVmICs9IGFscGhhX29mZnNldDsKKyAgICAgICAgcmVtYWluaW5nX2J1Zl9zaXplIC09IGFscGhhX29mZnNldDsKKworICAgICAgICByZXMgPSBzLT5hbHBoYV9jb250ZXh0LT5wYXJzZV9oZWFkZXIocy0+YWxwaGFfY29udGV4dCwgYnVmLCByZW1haW5pbmdfYnVmX3NpemUpOworICAgICAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgICAgIGlmKHJlcz09VlA1Nl9TSVpFX0NIQU5HRSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQWxwaGEgcmVjb25maWd1cmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggID0gYmFrX3c7CisgICAgICAgICAgICAgICAgYXZjdHgtPmhlaWdodCA9IGJha19oOworICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlZF93aWR0aCAgPSBiYWtfY3c7CisgICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVkX2hlaWdodCA9IGJha19jaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKHApOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgYXZjdHgtPmV4ZWN1dGUyKGF2Y3R4LCBmZl92cDU2X2RlY29kZV9tYnMsIDAsIDAsIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVkE0MjBQKSArIDEpOworCisgICAgaWYgKChyZXMgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGludCBmZl92cDU2X2RlY29kZV9tYnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIpCit7CisgICAgVlA1NkNvbnRleHQgKnMwID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaXNfYWxwaGEgPSAoam9ibnIgPT0gMSk7CisgICAgVlA1NkNvbnRleHQgKnMgPSBpc19hbHBoYSA/IHMwLT5hbHBoYV9jb250ZXh0IDogczA7CisgICAgQVZGcmFtZSAqY29uc3QgcCA9IHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdOworICAgIGludCBtYl9yb3csIG1iX2NvbCwgbWJfcm93X2ZsaXAsIG1iX29mZnNldCA9IDA7CisgICAgaW50IGJsb2NrLCB5LCB1djsKKyAgICBwdHJkaWZmX3Qgc3RyaWRlX3ksIHN0cmlkZV91djsKKyAgICBpbnQgcmVzOworCisgICAgaWYgKHAtPmtleV9mcmFtZSkgeworICAgICAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgcy0+ZGVmYXVsdF9tb2RlbHNfaW5pdChzKTsKKyAgICAgICAgZm9yIChibG9jaz0wOyBibG9jazxzLT5tYl9oZWlnaHQqcy0+bWJfd2lkdGg7IGJsb2NrKyspCisgICAgICAgICAgICBzLT5tYWNyb2Jsb2Nrc1tibG9ja10udHlwZSA9IFZQNTZfTUJfSU5UUkE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgICAgIHZwNTZfcGFyc2VfbWJfdHlwZV9tb2RlbHMocyk7CisgICAgICAgIHMtPnBhcnNlX3ZlY3Rvcl9tb2RlbHMocyk7CisgICAgICAgIHMtPm1iX3R5cGUgPSBWUDU2X01CX0lOVEVSX05PVkVDX1BGOworICAgIH0KKworICAgIGlmIChzLT5wYXJzZV9jb2VmZl9tb2RlbHMocykpCisgICAgICAgIGdvdG8gbmV4dDsKKworICAgIG1lbXNldChzLT5wcmV2X2RjLCAwLCBzaXplb2Yocy0+cHJldl9kYykpOworICAgIHMtPnByZXZfZGNbMV1bVlA1Nl9GUkFNRV9DVVJSRU5UXSA9IDEyODsKKyAgICBzLT5wcmV2X2RjWzJdW1ZQNTZfRlJBTUVfQ1VSUkVOVF0gPSAxMjg7CisKKyAgICBmb3IgKGJsb2NrPTA7IGJsb2NrIDwgNCpzLT5tYl93aWR0aCs2OyBibG9jaysrKSB7CisgICAgICAgIHMtPmFib3ZlX2Jsb2Nrc1tibG9ja10ucmVmX2ZyYW1lID0gVlA1Nl9GUkFNRV9OT05FOworICAgICAgICBzLT5hYm92ZV9ibG9ja3NbYmxvY2tdLmRjX2NvZWZmID0gMDsKKyAgICAgICAgcy0+YWJvdmVfYmxvY2tzW2Jsb2NrXS5ub3RfbnVsbF9kYyA9IDA7CisgICAgfQorICAgIHMtPmFib3ZlX2Jsb2Nrc1syKnMtPm1iX3dpZHRoICsgMl0ucmVmX2ZyYW1lID0gVlA1Nl9GUkFNRV9DVVJSRU5UOworICAgIHMtPmFib3ZlX2Jsb2Nrc1szKnMtPm1iX3dpZHRoICsgNF0ucmVmX2ZyYW1lID0gVlA1Nl9GUkFNRV9DVVJSRU5UOworCisgICAgc3RyaWRlX3kgID0gcC0+bGluZXNpemVbMF07CisgICAgc3RyaWRlX3V2ID0gcC0+bGluZXNpemVbMV07CisKKyAgICBpZiAocy0+ZmxpcCA8IDApCisgICAgICAgIG1iX29mZnNldCA9IDc7CisKKyAgICAvKiBtYWluIG1hY3JvYmxvY2tzIGxvb3AgKi8KKyAgICBmb3IgKG1iX3Jvdz0wOyBtYl9yb3c8cy0+bWJfaGVpZ2h0OyBtYl9yb3crKykgeworICAgICAgICBpZiAocy0+ZmxpcCA8IDApCisgICAgICAgICAgICBtYl9yb3dfZmxpcCA9IHMtPm1iX2hlaWdodCAtIG1iX3JvdyAtIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1iX3Jvd19mbGlwID0gbWJfcm93OworCisgICAgICAgIGZvciAoYmxvY2s9MDsgYmxvY2s8NDsgYmxvY2srKykgeworICAgICAgICAgICAgcy0+bGVmdF9ibG9ja1tibG9ja10ucmVmX2ZyYW1lID0gVlA1Nl9GUkFNRV9OT05FOworICAgICAgICAgICAgcy0+bGVmdF9ibG9ja1tibG9ja10uZGNfY29lZmYgPSAwOworICAgICAgICAgICAgcy0+bGVmdF9ibG9ja1tibG9ja10ubm90X251bGxfZGMgPSAwOworICAgICAgICB9CisgICAgICAgIG1lbXNldChzLT5jb2VmZl9jdHgsIDAsIHNpemVvZihzLT5jb2VmZl9jdHgpKTsKKyAgICAgICAgbWVtc2V0KHMtPmNvZWZmX2N0eF9sYXN0LCAyNCwgc2l6ZW9mKHMtPmNvZWZmX2N0eF9sYXN0KSk7CisKKyAgICAgICAgcy0+YWJvdmVfYmxvY2tfaWR4WzBdID0gMTsKKyAgICAgICAgcy0+YWJvdmVfYmxvY2tfaWR4WzFdID0gMjsKKyAgICAgICAgcy0+YWJvdmVfYmxvY2tfaWR4WzJdID0gMTsKKyAgICAgICAgcy0+YWJvdmVfYmxvY2tfaWR4WzNdID0gMjsKKyAgICAgICAgcy0+YWJvdmVfYmxvY2tfaWR4WzRdID0gMipzLT5tYl93aWR0aCArIDIgKyAxOworICAgICAgICBzLT5hYm92ZV9ibG9ja19pZHhbNV0gPSAzKnMtPm1iX3dpZHRoICsgNCArIDE7CisKKyAgICAgICAgcy0+YmxvY2tfb2Zmc2V0W3MtPmZyYmldID0gKG1iX3Jvd19mbGlwKjE2ICsgbWJfb2Zmc2V0KSAqIHN0cmlkZV95OworICAgICAgICBzLT5ibG9ja19vZmZzZXRbcy0+c3JiaV0gPSBzLT5ibG9ja19vZmZzZXRbcy0+ZnJiaV0gKyA4KnN0cmlkZV95OworICAgICAgICBzLT5ibG9ja19vZmZzZXRbMV0gPSBzLT5ibG9ja19vZmZzZXRbMF0gKyA4OworICAgICAgICBzLT5ibG9ja19vZmZzZXRbM10gPSBzLT5ibG9ja19vZmZzZXRbMl0gKyA4OworICAgICAgICBzLT5ibG9ja19vZmZzZXRbNF0gPSAobWJfcm93X2ZsaXAqOCArIG1iX29mZnNldCkgKiBzdHJpZGVfdXY7CisgICAgICAgIHMtPmJsb2NrX29mZnNldFs1XSA9IHMtPmJsb2NrX29mZnNldFs0XTsKKworICAgICAgICBmb3IgKG1iX2NvbD0wOyBtYl9jb2w8cy0+bWJfd2lkdGg7IG1iX2NvbCsrKSB7CisgICAgICAgICAgICB2cDU2X2RlY29kZV9tYihzLCBtYl9yb3csIG1iX2NvbCwgaXNfYWxwaGEpOworCisgICAgICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspIHsKKyAgICAgICAgICAgICAgICBzLT5hYm92ZV9ibG9ja19pZHhbeV0gKz0gMjsKKyAgICAgICAgICAgICAgICBzLT5ibG9ja19vZmZzZXRbeV0gKz0gMTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAodXY9NDsgdXY8NjsgdXYrKykgeworICAgICAgICAgICAgICAgIHMtPmFib3ZlX2Jsb2NrX2lkeFt1dl0gKz0gMTsKKyAgICAgICAgICAgICAgICBzLT5ibG9ja19vZmZzZXRbdXZdICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK25leHQ6CisgICAgaWYgKHAtPmtleV9mcmFtZSB8fCBzLT5nb2xkZW5fZnJhbWUpIHsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+ZnJhbWVzW1ZQNTZfRlJBTUVfR09MREVOXSk7CisgICAgICAgIGlmICgocmVzID0gYXZfZnJhbWVfcmVmKHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0dPTERFTl0sIHApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGF2X2ZyYW1lX3VucmVmKHMtPmZyYW1lc1tWUDU2X0ZSQU1FX1BSRVZJT1VTXSk7CisgICAgRkZTV0FQKEFWRnJhbWUgKiwgcy0+ZnJhbWVzW1ZQNTZfRlJBTUVfQ1VSUkVOVF0sCisgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWVzW1ZQNTZfRlJBTUVfUFJFVklPVVNdKTsKKyAgICByZXR1cm4gMDsKK30KKworYXZfY29sZCBpbnQgZmZfdnA1Nl9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGZsaXAsIGludCBoYXNfYWxwaGEpCit7CisgICAgVlA1NkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl92cDU2X2luaXRfY29udGV4dChhdmN0eCwgcywgZmxpcCwgaGFzX2FscGhhKTsKK30KKworYXZfY29sZCBpbnQgZmZfdnA1Nl9pbml0X2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWUDU2Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxpcCwgaW50IGhhc19hbHBoYSkKK3sKKyAgICBpbnQgaTsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBoYXNfYWxwaGEgPyBBVl9QSVhfRk1UX1lVVkE0MjBQIDogQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgIGlmIChhdmN0eC0+c2tpcF9hbHBoYSkgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisKKyAgICBmZl9oMjY0Y2hyb21hX2luaXQoJnMtPmgyNjRjaHJvbWEsIDgpOworICAgIGZmX2hwZWxkc3BfaW5pdCgmcy0+aGRzcCwgYXZjdHgtPmZsYWdzKTsKKyAgICBmZl92aWRlb2RzcF9pbml0KCZzLT52ZHNwLCA4KTsKKyAgICBmZl92cDNkc3BfaW5pdCgmcy0+dnAzZHNwLCBhdmN0eC0+ZmxhZ3MpOworICAgIGZmX3ZwNTZkc3BfaW5pdCgmcy0+dnA1NmRzcCwgYXZjdHgtPmNvZGVjLT5pZCk7CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyNkZWZpbmUgVFJBTlNQT1NFKHgpICh4ID4+IDMpIHwgKCh4ICYgNykgPDwgMykKKyAgICAgICAgcy0+aWRjdF9zY2FudGFibGVbaV0gPSBUUkFOU1BPU0UoZmZfemlnemFnX2RpcmVjdFtpXSk7CisjdW5kZWYgVFJBTlNQT1NFCisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPmZyYW1lcyk7IGkrKykgeworICAgICAgICBzLT5mcmFtZXNbaV0gPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICBpZiAoIXMtPmZyYW1lc1tpXSkgeworICAgICAgICAgICAgZmZfdnA1Nl9mcmVlKGF2Y3R4KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+ZWRnZV9lbXVfYnVmZmVyX2FsbG9jID0gTlVMTDsKKworICAgIHMtPmFib3ZlX2Jsb2NrcyA9IE5VTEw7CisgICAgcy0+bWFjcm9ibG9ja3MgPSBOVUxMOworICAgIHMtPnF1YW50aXplciA9IC0xOworICAgIHMtPmRlYmxvY2tfZmlsdGVyaW5nID0gMTsKKyAgICBzLT5nb2xkZW5fZnJhbWUgPSAwOworCisgICAgcy0+ZmlsdGVyID0gTlVMTDsKKworICAgIHMtPmhhc19hbHBoYSA9IGhhc19hbHBoYTsKKworICAgIHMtPm1vZGVscCA9ICZzLT5tb2RlbDsKKworICAgIGlmIChmbGlwKSB7CisgICAgICAgIHMtPmZsaXAgPSAtMTsKKyAgICAgICAgcy0+ZnJiaSA9IDI7CisgICAgICAgIHMtPnNyYmkgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmZsaXAgPSAxOworICAgICAgICBzLT5mcmJpID0gMDsKKyAgICAgICAgcy0+c3JiaSA9IDI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgaW50IGZmX3ZwNTZfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVlA1NkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl92cDU2X2ZyZWVfY29udGV4dChzKTsKK30KKworYXZfY29sZCBpbnQgZmZfdnA1Nl9mcmVlX2NvbnRleHQoVlA1NkNvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBhdl9mcmVlcCgmcy0+YWJvdmVfYmxvY2tzKTsKKyAgICBhdl9mcmVlcCgmcy0+bWFjcm9ibG9ja3MpOworICAgIGF2X2ZyZWVwKCZzLT5lZGdlX2VtdV9idWZmZXJfYWxsb2MpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPmZyYW1lcyk7IGkrKykKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWVzW2ldKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnA1Ni5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA1Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzMwOTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDU2LmgKQEAgLTAsMCArMSw0MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVlA1IGFuZCBWUDYgY29tcGF0aWJsZSB2aWRlbyBkZWNvZGVyIChjb21tb24gZmVhdHVyZXMpCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZQNTZfSAorI2RlZmluZSBBVkNPREVDX1ZQNTZfSAorCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJocGVsZHNwLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRjaHJvbWEuaCIKKyNpbmNsdWRlICJ2aWRlb2RzcC5oIgorI2luY2x1ZGUgInZwM2RzcC5oIgorI2luY2x1ZGUgInZwNTZkc3AuaCIKKwordHlwZWRlZiBzdHJ1Y3QgdnA1Nl9jb250ZXh0IFZQNTZDb250ZXh0OworCit0eXBlZGVmIGVudW0geworICAgIFZQNTZfRlJBTUVfTk9ORSAgICAgPS0xLAorICAgIFZQNTZfRlJBTUVfQ1VSUkVOVCAgPSAwLAorICAgIFZQNTZfRlJBTUVfUFJFVklPVVMgPSAxLAorICAgIFZQNTZfRlJBTUVfR09MREVOICAgPSAyLAorICAgIFZQNTZfRlJBTUVfR09MREVOMiAgPSAzLAorfSBWUDU2RnJhbWU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgVlA1Nl9NQl9JTlRFUl9OT1ZFQ19QRiA9IDAsICAvKio8IEludGVyIE1CLCBubyB2ZWN0b3IsIGZyb20gcHJldmlvdXMgZnJhbWUgKi8KKyAgICBWUDU2X01CX0lOVFJBICAgICAgICAgID0gMSwgIC8qKjwgSW50cmEgTUIgKi8KKyAgICBWUDU2X01CX0lOVEVSX0RFTFRBX1BGID0gMiwgIC8qKjwgSW50ZXIgTUIsIGFib3ZlL2xlZnQgdmVjdG9yICsgZGVsdGEsIGZyb20gcHJldmlvdXMgZnJhbWUgKi8KKyAgICBWUDU2X01CX0lOVEVSX1YxX1BGICAgID0gMywgIC8qKjwgSW50ZXIgTUIsIGZpcnN0IHZlY3RvciwgZnJvbSBwcmV2aW91cyBmcmFtZSAqLworICAgIFZQNTZfTUJfSU5URVJfVjJfUEYgICAgPSA0LCAgLyoqPCBJbnRlciBNQiwgc2Vjb25kIHZlY3RvciwgZnJvbSBwcmV2aW91cyBmcmFtZSAqLworICAgIFZQNTZfTUJfSU5URVJfTk9WRUNfR0YgPSA1LCAgLyoqPCBJbnRlciBNQiwgbm8gdmVjdG9yLCBmcm9tIGdvbGRlbiBmcmFtZSAqLworICAgIFZQNTZfTUJfSU5URVJfREVMVEFfR0YgPSA2LCAgLyoqPCBJbnRlciBNQiwgYWJvdmUvbGVmdCB2ZWN0b3IgKyBkZWx0YSwgZnJvbSBnb2xkZW4gZnJhbWUgKi8KKyAgICBWUDU2X01CX0lOVEVSXzRWICAgICAgID0gNywgIC8qKjwgSW50ZXIgTUIsIDQgdmVjdG9ycywgZnJvbSBwcmV2aW91cyBmcmFtZSAqLworICAgIFZQNTZfTUJfSU5URVJfVjFfR0YgICAgPSA4LCAgLyoqPCBJbnRlciBNQiwgZmlyc3QgdmVjdG9yLCBmcm9tIGdvbGRlbiBmcmFtZSAqLworICAgIFZQNTZfTUJfSU5URVJfVjJfR0YgICAgPSA5LCAgLyoqPCBJbnRlciBNQiwgc2Vjb25kIHZlY3RvciwgZnJvbSBnb2xkZW4gZnJhbWUgKi8KK30gVlA1Nm1iOworCit0eXBlZGVmIHN0cnVjdCBWUDU2VHJlZSB7CisgIGludDhfdCB2YWw7CisgIGludDhfdCBwcm9iX2lkeDsKK30gVlA1NlRyZWU7CisKK3R5cGVkZWYgc3RydWN0IFZQNTZtdiB7CisgICAgREVDTEFSRV9BTElHTkVEKDQsIGludDE2X3QsIHgpOworICAgIGludDE2X3QgeTsKK30gVlA1Nm12OworCisjZGVmaW5lIFZQNTZfU0laRV9DSEFOR0UgMQorCit0eXBlZGVmIHZvaWQgKCpWUDU2UGFyc2VWZWN0b3JBZGp1c3RtZW50KShWUDU2Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQNTZtdiAqdmVjdCk7Cit0eXBlZGVmIHZvaWQgKCpWUDU2RmlsdGVyKShWUDU2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MSwgaW50IG9mZnNldDIsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDU2bXYgbXYsIGludCBtYXNrLCBpbnQgc2VsZWN0LCBpbnQgbHVtYSk7Cit0eXBlZGVmIHZvaWQgKCpWUDU2UGFyc2VDb2VmZikoVlA1NkNvbnRleHQgKnMpOwordHlwZWRlZiB2b2lkICgqVlA1NkRlZmF1bHRNb2RlbHNJbml0KShWUDU2Q29udGV4dCAqcyk7Cit0eXBlZGVmIHZvaWQgKCpWUDU2UGFyc2VWZWN0b3JNb2RlbHMpKFZQNTZDb250ZXh0ICpzKTsKK3R5cGVkZWYgaW50ICAoKlZQNTZQYXJzZUNvZWZmTW9kZWxzKShWUDU2Q29udGV4dCAqcyk7Cit0eXBlZGVmIGludCAgKCpWUDU2UGFyc2VIZWFkZXIpKFZQNTZDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSk7CisKK3R5cGVkZWYgc3RydWN0IFZQNTZSYW5nZUNvZGVyIHsKKyAgICBpbnQgaGlnaDsKKyAgICBpbnQgYml0czsgLyogc3RvcmVkIG5lZ2F0ZWQgKGkuZS4gbmVnYXRpdmUgImJpdHMiIGlzIGEgcG9zaXRpdmUgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgIGJpdHMgbGVmdCkgaW4gb3JkZXIgdG8gZWxpbWluYXRlIGEgbmVnYXRlIGluIGNhY2hlIHJlZmlsbGluZyAqLworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlcjsKKyAgICBjb25zdCB1aW50OF90ICplbmQ7CisgICAgdW5zaWduZWQgaW50IGNvZGVfd29yZDsKK30gVlA1NlJhbmdlQ29kZXI7CisKK3R5cGVkZWYgc3RydWN0IFZQNTZSZWZEYyB7CisgICAgdWludDhfdCBub3RfbnVsbF9kYzsKKyAgICBWUDU2RnJhbWUgcmVmX2ZyYW1lOworICAgIGludDE2X3QgZGNfY29lZmY7Cit9IFZQNTZSZWZEYzsKKwordHlwZWRlZiBzdHJ1Y3QgVlA1Nk1hY3JvYmxvY2sgeworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICBWUDU2bXYgbXY7Cit9IFZQNTZNYWNyb2Jsb2NrOworCit0eXBlZGVmIHN0cnVjdCBWUDU2TW9kZWwgeworICAgIHVpbnQ4X3QgY29lZmZfcmVvcmRlcls2NF07ICAgICAgIC8qIHVzZWQgaW4gdnA2IG9ubHkgKi8KKyAgICB1aW50OF90IGNvZWZmX2luZGV4X3RvX3Bvc1s2NF07ICAvKiB1c2VkIGluIHZwNiBvbmx5ICovCisgICAgdWludDhfdCB2ZWN0b3Jfc2lnWzJdOyAgICAgICAgICAgLyogZGVsdGEgc2lnbiAqLworICAgIHVpbnQ4X3QgdmVjdG9yX2RjdFsyXTsgICAgICAgICAgIC8qIGRlbHRhIGNvZGluZyB0eXBlcyAqLworICAgIHVpbnQ4X3QgdmVjdG9yX3BkaVsyXVsyXTsgICAgICAgIC8qIHByZWRlZmluZWQgZGVsdGEgaW5pdCAqLworICAgIHVpbnQ4X3QgdmVjdG9yX3BkdlsyXVs3XTsgICAgICAgIC8qIHByZWRlZmluZWQgZGVsdGEgdmFsdWVzICovCisgICAgdWludDhfdCB2ZWN0b3JfZmR2WzJdWzhdOyAgICAgICAgLyogOCBiaXQgZGVsdGEgdmFsdWUgZGVmaW5pdGlvbiAqLworICAgIHVpbnQ4X3QgY29lZmZfZGNjdlsyXVsxMV07ICAgICAgIC8qIERDIGNvZWZmIHZhbHVlICovCisgICAgdWludDhfdCBjb2VmZl9yYWN0WzJdWzNdWzZdWzExXTsgLyogUnVuL0FDIGNvZGluZyB0eXBlIGFuZCBBQyBjb2VmZiB2YWx1ZSAqLworICAgIHVpbnQ4X3QgY29lZmZfYWNjdFsyXVszXVszXVs2XVs1XTsvKiB2cDUgb25seSBBQyBjb2RpbmcgdHlwZSBmb3IgY29kaW5nIGdyb3VwIDwgMyAqLworICAgIHVpbnQ4X3QgY29lZmZfZGNjdFsyXVszNl1bNV07ICAgIC8qIERDIGNvZWZmIGNvZGluZyB0eXBlICovCisgICAgdWludDhfdCBjb2VmZl9ydW52WzJdWzE0XTsgICAgICAgLyogcnVuIHZhbHVlICh2cDYgb25seSkgKi8KKyAgICB1aW50OF90IG1iX3R5cGVbM11bMTBdWzEwXTsgICAgICAvKiBtb2RlbCBmb3IgZGVjb2RpbmcgTUIgdHlwZSAqLworICAgIHVpbnQ4X3QgbWJfdHlwZXNfc3RhdHNbM11bMTBdWzJdOy8qIGNvbnRleHR1YWwsIG5leHQgTUIgdHlwZSBzdGF0cyAqLworfSBWUDU2TW9kZWw7CisKK3N0cnVjdCB2cDU2X2NvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBIMjY0Q2hyb21hQ29udGV4dCBoMjY0Y2hyb21hOworICAgIEhwZWxEU1BDb250ZXh0IGhkc3A7CisgICAgVmlkZW9EU1BDb250ZXh0IHZkc3A7CisgICAgVlAzRFNQQ29udGV4dCB2cDNkc3A7CisgICAgVlA1NkRTUENvbnRleHQgdnA1NmRzcDsKKyAgICB1aW50OF90IGlkY3Rfc2NhbnRhYmxlWzY0XTsKKyAgICBBVkZyYW1lICpmcmFtZXNbNF07CisgICAgdWludDhfdCAqZWRnZV9lbXVfYnVmZmVyX2FsbG9jOworICAgIHVpbnQ4X3QgKmVkZ2VfZW11X2J1ZmZlcjsKKyAgICBWUDU2UmFuZ2VDb2RlciBjOworICAgIFZQNTZSYW5nZUNvZGVyIGNjOworICAgIFZQNTZSYW5nZUNvZGVyICpjY3A7CisgICAgaW50IHN1Yl92ZXJzaW9uOworCisgICAgLyogZnJhbWUgaW5mbyAqLworICAgIGludCBnb2xkZW5fZnJhbWU7CisgICAgaW50IHBsYW5lX3dpZHRoWzRdOworICAgIGludCBwbGFuZV9oZWlnaHRbNF07CisgICAgaW50IG1iX3dpZHRoOyAgIC8qIG51bWJlciBvZiBob3Jpem9udGFsIE1CICovCisgICAgaW50IG1iX2hlaWdodDsgIC8qIG51bWJlciBvZiB2ZXJ0aWNhbCBNQiAqLworICAgIGludCBibG9ja19vZmZzZXRbNl07CisKKyAgICBpbnQgcXVhbnRpemVyOworICAgIHVpbnQxNl90IGRlcXVhbnRfZGM7CisgICAgdWludDE2X3QgZGVxdWFudF9hYzsKKworICAgIC8qIERDIHByZWRpY3RvcnMgbWFuYWdlbWVudCAqLworICAgIFZQNTZSZWZEYyAqYWJvdmVfYmxvY2tzOworICAgIFZQNTZSZWZEYyBsZWZ0X2Jsb2NrWzRdOworICAgIGludCBhYm92ZV9ibG9ja19pZHhbNl07CisgICAgaW50MTZfdCBwcmV2X2RjWzNdWzNdOyAgICAvKiBbcGxhbl1bcmVmX2ZyYW1lXSAqLworCisgICAgLyogYmxvY2tzIC8gbWFjcm9ibG9jayAqLworICAgIFZQNTZtYiBtYl90eXBlOworICAgIFZQNTZNYWNyb2Jsb2NrICptYWNyb2Jsb2NrczsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrX2NvZWZmKVs2XVs2NF07CisKKyAgICAvKiBtb3Rpb24gdmVjdG9ycyAqLworICAgIFZQNTZtdiBtdls2XTsgIC8qIHZlY3RvcnMgZm9yIGVhY2ggYmxvY2sgaW4gTUIgKi8KKyAgICBWUDU2bXYgdmVjdG9yX2NhbmRpZGF0ZVsyXTsKKyAgICBpbnQgdmVjdG9yX2NhbmRpZGF0ZV9wb3M7CisKKyAgICAvKiBmaWx0ZXJpbmcgaGludHMgKi8KKyAgICBpbnQgZmlsdGVyX2hlYWRlcjsgICAgICAgICAgICAgICAvKiB1c2VkIGluIHZwNiBvbmx5ICovCisgICAgaW50IGRlYmxvY2tfZmlsdGVyaW5nOworICAgIGludCBmaWx0ZXJfc2VsZWN0aW9uOworICAgIGludCBmaWx0ZXJfbW9kZTsKKyAgICBpbnQgbWF4X3ZlY3Rvcl9sZW5ndGg7CisgICAgaW50IHNhbXBsZV92YXJpYW5jZV90aHJlc2hvbGQ7CisKKyAgICB1aW50OF90IGNvZWZmX2N0eFs0XVs2NF07ICAgICAgICAgICAgICAvKiB1c2VkIGluIHZwNSBvbmx5ICovCisgICAgdWludDhfdCBjb2VmZl9jdHhfbGFzdFs0XTsgICAgICAgICAgICAgLyogdXNlZCBpbiB2cDUgb25seSAqLworCisgICAgaW50IGhhc19hbHBoYTsKKworICAgIC8qIHVwc2lkZS1kb3duIGZsaXBwaW5nIGhpbnRzICovCisgICAgaW50IGZsaXA7ICAvKiBhcmUgd2UgZmxpcHBpbmcgPyAqLworICAgIGludCBmcmJpOyAgLyogZmlyc3Qgcm93IGJsb2NrIGluZGV4IGluIE1CICovCisgICAgaW50IHNyYmk7ICAvKiBzZWNvbmQgcm93IGJsb2NrIGluZGV4IGluIE1CICovCisgICAgaW50IHN0cmlkZVs0XTsgIC8qIHN0cmlkZSBmb3IgZWFjaCBwbGFuICovCisKKyAgICBjb25zdCB1aW50OF90ICp2cDU2X2Nvb3JkX2RpdjsKKyAgICBWUDU2UGFyc2VWZWN0b3JBZGp1c3RtZW50IHBhcnNlX3ZlY3Rvcl9hZGp1c3RtZW50OworICAgIFZQNTZGaWx0ZXIgZmlsdGVyOworICAgIFZQNTZQYXJzZUNvZWZmIHBhcnNlX2NvZWZmOworICAgIFZQNTZEZWZhdWx0TW9kZWxzSW5pdCBkZWZhdWx0X21vZGVsc19pbml0OworICAgIFZQNTZQYXJzZVZlY3Rvck1vZGVscyBwYXJzZV92ZWN0b3JfbW9kZWxzOworICAgIFZQNTZQYXJzZUNvZWZmTW9kZWxzIHBhcnNlX2NvZWZmX21vZGVsczsKKyAgICBWUDU2UGFyc2VIZWFkZXIgcGFyc2VfaGVhZGVyOworCisgICAgLyogZm9yICJzbGljZSIgcGFyYWxsZWxpc20gYmV0d2VlbiBZVVYgYW5kIEEgKi8KKyAgICBWUDU2Q29udGV4dCAqYWxwaGFfY29udGV4dDsKKworICAgIFZQNTZNb2RlbCAqbW9kZWxwOworICAgIFZQNTZNb2RlbCBtb2RlbDsKKworICAgIC8qIGh1ZmZtYW4gZGVjb2RpbmcgKi8KKyAgICBpbnQgdXNlX2h1ZmZtYW47CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBWTEMgZGNjdl92bGNbMl07CisgICAgVkxDIHJ1bnZfdmxjWzJdOworICAgIFZMQyByYWN0X3ZsY1syXVszXVs2XTsKKyAgICB1bnNpZ25lZCBpbnQgbmJfbnVsbFsyXVsyXTsgICAgICAgLyogbnVtYmVyIG9mIGNvbnNlY3V0aXZlIE5VTEwgREMvQUMgKi8KK307CisKKworaW50IGZmX3ZwNTZfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBmbGlwLCBpbnQgaGFzX2FscGhhKTsKK2ludCBmZl92cDU2X2luaXRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFZQNTZDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxpcCwgaW50IGhhc19hbHBoYSk7CitpbnQgZmZfdnA1Nl9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CitpbnQgZmZfdnA1Nl9mcmVlX2NvbnRleHQoVlA1NkNvbnRleHQgKnMpOwordm9pZCBmZl92cDU2X2luaXRfZGVxdWFudChWUDU2Q29udGV4dCAqcywgaW50IHF1YW50aXplcik7CitpbnQgZmZfdnA1Nl9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpOworCisKKy8qKgorICogdnA1NiBzcGVjaWZpYyByYW5nZSBjb2RlciBpbXBsZW1lbnRhdGlvbgorICovCisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZwNTZfbm9ybV9zaGlmdFsyNTZdOwordm9pZCBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2RlcihWUDU2UmFuZ2VDb2RlciAqYywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpOworCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQgdnA1Nl9yYWNfcmVub3JtKFZQNTZSYW5nZUNvZGVyICpjKQoreworICAgIGludCBzaGlmdCA9IGZmX3ZwNTZfbm9ybV9zaGlmdFtjLT5oaWdoXTsKKyAgICBpbnQgYml0cyA9IGMtPmJpdHM7CisgICAgdW5zaWduZWQgaW50IGNvZGVfd29yZCA9IGMtPmNvZGVfd29yZDsKKworICAgIGMtPmhpZ2ggICA8PD0gc2hpZnQ7CisgICAgY29kZV93b3JkIDw8PSBzaGlmdDsKKyAgICBiaXRzICAgICAgICs9IHNoaWZ0OworICAgIGlmKGJpdHMgPj0gMCAmJiBjLT5idWZmZXIgPCBjLT5lbmQpIHsKKyAgICAgICAgY29kZV93b3JkIHw9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmMtPmJ1ZmZlcikgPDwgYml0czsKKyAgICAgICAgYml0cyAtPSAxNjsKKyAgICB9CisgICAgYy0+Yml0cyA9IGJpdHM7CisgICAgcmV0dXJuIGNvZGVfd29yZDsKK30KKworI2lmICAgQVJDSF9BUk0KKyNpbmNsdWRlICJhcm0vdnA1Nl9hcml0aC5oIgorI2VsaWYgQVJDSF9YODYKKyNpbmNsdWRlICJ4ODYvdnA1Nl9hcml0aC5oIgorI2VuZGlmCisKKyNpZm5kZWYgdnA1Nl9yYWNfZ2V0X3Byb2IKKyNkZWZpbmUgdnA1Nl9yYWNfZ2V0X3Byb2IgdnA1Nl9yYWNfZ2V0X3Byb2IKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB2cDU2X3JhY19nZXRfcHJvYihWUDU2UmFuZ2VDb2RlciAqYywgdWludDhfdCBwcm9iKQoreworICAgIHVuc2lnbmVkIGludCBjb2RlX3dvcmQgPSB2cDU2X3JhY19yZW5vcm0oYyk7CisgICAgdW5zaWduZWQgaW50IGxvdyA9IDEgKyAoKChjLT5oaWdoIC0gMSkgKiBwcm9iKSA+PiA4KTsKKyAgICB1bnNpZ25lZCBpbnQgbG93X3NoaWZ0ID0gbG93IDw8IDE2OworICAgIGludCBiaXQgPSBjb2RlX3dvcmQgPj0gbG93X3NoaWZ0OworCisgICAgYy0+aGlnaCA9IGJpdCA/IGMtPmhpZ2ggLSBsb3cgOiBsb3c7CisgICAgYy0+Y29kZV93b3JkID0gYml0ID8gY29kZV93b3JkIC0gbG93X3NoaWZ0IDogY29kZV93b3JkOworCisgICAgcmV0dXJuIGJpdDsKK30KKyNlbmRpZgorCisjaWZuZGVmIHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkKKy8vIGJyYW5jaHkgdmFyaWFudCwgdG8gYmUgdXNlZCB3aGVyZSB0aGVyZSdzIGEgYnJhbmNoIGJhc2VkIG9uIHRoZSBiaXQgZGVjb2RlZAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoVlA1NlJhbmdlQ29kZXIgKmMsIGludCBwcm9iKQoreworICAgIHVuc2lnbmVkIGxvbmcgY29kZV93b3JkID0gdnA1Nl9yYWNfcmVub3JtKGMpOworICAgIHVuc2lnbmVkIGxvdyA9IDEgKyAoKChjLT5oaWdoIC0gMSkgKiBwcm9iKSA+PiA4KTsKKyAgICB1bnNpZ25lZCBsb3dfc2hpZnQgPSBsb3cgPDwgMTY7CisKKyAgICBpZiAoY29kZV93b3JkID49IGxvd19zaGlmdCkgeworICAgICAgICBjLT5oaWdoICAgICAtPSBsb3c7CisgICAgICAgIGMtPmNvZGVfd29yZCA9IGNvZGVfd29yZCAtIGxvd19zaGlmdDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgYy0+aGlnaCA9IGxvdzsKKyAgICBjLT5jb2RlX3dvcmQgPSBjb2RlX3dvcmQ7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHZwNTZfcmFjX2dldChWUDU2UmFuZ2VDb2RlciAqYykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY29kZV93b3JkID0gdnA1Nl9yYWNfcmVub3JtKGMpOworICAgIC8qIGVxdWlwcm9iYWJsZSAqLworICAgIGludCBsb3cgPSAoYy0+aGlnaCArIDEpID4+IDE7CisgICAgdW5zaWduZWQgaW50IGxvd19zaGlmdCA9IGxvdyA8PCAxNjsKKyAgICBpbnQgYml0ID0gY29kZV93b3JkID49IGxvd19zaGlmdDsKKyAgICBpZiAoYml0KSB7CisgICAgICAgIGMtPmhpZ2ggICAtPSBsb3c7CisgICAgICAgIGNvZGVfd29yZCAtPSBsb3dfc2hpZnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+aGlnaCA9IGxvdzsKKyAgICB9CisKKyAgICBjLT5jb2RlX3dvcmQgPSBjb2RlX3dvcmQ7CisgICAgcmV0dXJuIGJpdDsKK30KKworLy8gcm91bmRpbmcgaXMgZGlmZmVyZW50IHRoYW4gdnA1Nl9yYWNfZ2V0LCBpcyB2cDU2X3JhY19nZXQgd3Jvbmc/CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgdnA4X3JhY19nZXQoVlA1NlJhbmdlQ29kZXIgKmMpCit7CisgICAgcmV0dXJuIHZwNTZfcmFjX2dldF9wcm9iKGMsIDEyOCk7Cit9CisKK3N0YXRpYyBpbnQgdnA1Nl9yYWNfZ2V0cyhWUDU2UmFuZ2VDb2RlciAqYywgaW50IGJpdHMpCit7CisgICAgaW50IHZhbHVlID0gMDsKKworICAgIHdoaWxlIChiaXRzLS0pIHsKKyAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgMSkgfCB2cDU2X3JhY19nZXQoYyk7CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IHZwOF9yYWNfZ2V0X3VpbnQoVlA1NlJhbmdlQ29kZXIgKmMsIGludCBiaXRzKQoreworICAgIGludCB2YWx1ZSA9IDA7CisKKyAgICB3aGlsZSAoYml0cy0tKSB7CisgICAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDEpIHwgdnA4X3JhY19nZXQoYyk7CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworfQorCisvLyBmaXhtZTogYWRkIDEgYml0IHRvIGFsbCB0aGUgY2FsbHMgdG8gdGhpcz8KK3N0YXRpYyBhdl91bnVzZWQgaW50IHZwOF9yYWNfZ2V0X3NpbnQoVlA1NlJhbmdlQ29kZXIgKmMsIGludCBiaXRzKQoreworICAgIGludCB2OworCisgICAgaWYgKCF2cDhfcmFjX2dldChjKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB2ID0gdnA4X3JhY19nZXRfdWludChjLCBiaXRzKTsKKworICAgIGlmICh2cDhfcmFjX2dldChjKSkKKyAgICAgICAgdiA9IC12OworCisgICAgcmV0dXJuIHY7Cit9CisKKy8vIFAoNykKK3N0YXRpYyBhdl91bnVzZWQgaW50IHZwNTZfcmFjX2dldHNfbm4oVlA1NlJhbmdlQ29kZXIgKmMsIGludCBiaXRzKQoreworICAgIGludCB2ID0gdnA1Nl9yYWNfZ2V0cyhjLCA3KSA8PCAxOworICAgIHJldHVybiB2ICsgIXY7Cit9CisKK3N0YXRpYyBhdl91bnVzZWQgaW50IHZwOF9yYWNfZ2V0X25uKFZQNTZSYW5nZUNvZGVyICpjKQoreworICAgIGludCB2ID0gdnA4X3JhY19nZXRfdWludChjLCA3KSA8PCAxOworICAgIHJldHVybiB2ICsgIXY7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCitpbnQgdnA1Nl9yYWNfZ2V0X3RyZWUoVlA1NlJhbmdlQ29kZXIgKmMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA1NlRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcHJvYnMpCit7CisgICAgd2hpbGUgKHRyZWUtPnZhbCA+IDApIHsKKyAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgcHJvYnNbdHJlZS0+cHJvYl9pZHhdKSkKKyAgICAgICAgICAgIHRyZWUgKz0gdHJlZS0+dmFsOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0cmVlKys7CisgICAgfQorICAgIHJldHVybiAtdHJlZS0+dmFsOworfQorCisvLyBob3cgcHJvYmFiaWxpdGllcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGRlY2lzaW9ucyBpcyBkaWZmZXJlbnQgSSB0aGluaworLy8gd2VsbCwgdGhlIG5ldyBzY2hlbWUgZml0cyBpbiB0aGUgb2xkIGJ1dCB0aGlzIHdheSBoYXMgb25lIGZld2VyIGJyYW5jaGVzIHBlciBkZWNpc2lvbgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHZwOF9yYWNfZ2V0X3RyZWUoVlA1NlJhbmdlQ29kZXIgKmMsIGNvbnN0IGludDhfdCAoKnRyZWUpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwcm9icykKK3sKKyAgICBpbnQgaSA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGkgPSB0cmVlW2ldW3ZwNTZfcmFjX2dldF9wcm9iKGMsIHByb2JzW2ldKV07CisgICAgfSB3aGlsZSAoaSA+IDApOworCisgICAgcmV0dXJuIC1pOworfQorCisvLyBEQ1RleHRyYQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHZwOF9yYWNfZ2V0X2NvZWZmKFZQNTZSYW5nZUNvZGVyICpjLCBjb25zdCB1aW50OF90ICpwcm9iKQoreworICAgIGludCB2ID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgdiA9ICh2PDwxKSArIHZwNTZfcmFjX2dldF9wcm9iKGMsICpwcm9iKyspOworICAgIH0gd2hpbGUgKCpwcm9iKTsKKworICAgIHJldHVybiB2OworfQorCisjZW5kaWYgLyogQVZDT0RFQ19WUDU2X0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZwNTZkYXRhLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92cDU2ZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwODAzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDU2ZGF0YS5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZQNSBhbmQgVlA2IGNvbXBhdGlibGUgdmlkZW8gZGVjb2RlciAoY29tbW9uIGRhdGEpCisgKi8KKworI2luY2x1ZGUgInZwNTZkYXRhLmgiCisKK2NvbnN0IHVpbnQ4X3QgZmZfdnA1Nl9iMnBbXSAgID0geyAwLCAwLCAwLCAwLCAxLCAyLCAzLCAzLCAzLCAzIH07Citjb25zdCB1aW50OF90IGZmX3ZwNTZfYjZ0bzRbXSA9IHsgMCwgMCwgMSwgMSwgMiwgMyB9OworCitjb25zdCB1aW50OF90IGZmX3ZwNTZfY29lZmZfcGFyc2VfdGFibGVbNl1bMTFdID0geworICAgIHsgMTU5LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwKKyAgICB7IDE0NSwgMTY1LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sCisgICAgeyAxNDAsIDE0OCwgMTczLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LAorICAgIHsgMTM1LCAxNDAsIDE1NSwgMTc2LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwKKyAgICB7IDEzMCwgMTM0LCAxNDEsIDE1NywgMTgwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sCisgICAgeyAxMjksIDEzMCwgMTMzLCAxNDAsIDE1MywgMTc3LCAxOTYsIDIzMCwgMjQzLCAyNTQsIDI1NCB9LAorfTsKKworY29uc3QgdWludDhfdCBmZl92cDU2X2RlZl9tYl90eXBlc19zdGF0c1szXVsxMF1bMl0gPSB7CisgICAgeyB7ICA2OSwgNDIgfSwgeyAgIDEsICAyIH0sIHsgIDEsICAgNyB9LCB7ICA0NCwgNDIgfSwgeyAgNiwgMjIgfSwKKyAgICAgIHsgICAxLCAgMyB9LCB7ICAgMCwgIDIgfSwgeyAgMSwgICA1IH0sIHsgICAwLCAgMSB9LCB7ICAwLCAgMCB9LCB9LAorICAgIHsgeyAyMjksICA4IH0sIHsgICAxLCAgMSB9LCB7ICAwLCAgIDggfSwgeyAgIDAsICAwIH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMSwgIDIgfSwgeyAgIDAsICAxIH0sIHsgIDAsICAgMCB9LCB7ICAgMSwgIDEgfSwgeyAgMCwgIDAgfSwgfSwKKyAgICB7IHsgMTIyLCAzNSB9LCB7ICAgMSwgIDEgfSwgeyAgMSwgICA2IH0sIHsgIDQ2LCAzNCB9LCB7ICAwLCAgMCB9LAorICAgICAgeyAgIDEsICAyIH0sIHsgICAwLCAgMSB9LCB7ICAwLCAgIDEgfSwgeyAgIDEsICAxIH0sIHsgIDAsICAwIH0sIH0sCit9OworCitjb25zdCBWUDU2VHJlZSBmZl92cDU2X3B2YV90cmVlW10gPSB7CisgICAgeyA4LCAwfSwKKyAgICB7IDQsIDF9LAorICAgIHsgMiwgMn0sIHstMH0sIHstMX0sCisgICAgeyAyLCAzfSwgey0yfSwgey0zfSwKKyAgICB7IDQsIDR9LAorICAgIHsgMiwgNX0sIHstNH0sIHstNX0sCisgICAgeyAyLCA2fSwgey02fSwgey03fSwKK307CisKK2NvbnN0IFZQNTZUcmVlIGZmX3ZwNTZfcGNfdHJlZVtdID0geworICAgIHsgNCwgNn0sCisgICAgeyAyLCA3fSwgey0wfSwgey0xfSwKKyAgICB7IDQsIDh9LAorICAgIHsgMiwgOX0sIHstMn0sIHstM30sCisgICAgeyAyLDEwfSwgey00fSwgey01fSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdnA1Nl9jb2VmZl9iaWFzW10gPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDcsIDExLCAxOSwgMzUsIDY3IH07Citjb25zdCB1aW50OF90IGZmX3ZwNTZfY29lZmZfYml0X2xlbmd0aFtdID0geyAwLCAxLCAyLCAzLCA0LCAxMCB9OworCitjb25zdCBWUDU2RnJhbWUgZmZfdnA1Nl9yZWZlcmVuY2VfZnJhbWVbXSA9IHsKKyAgICBWUDU2X0ZSQU1FX1BSRVZJT1VTLCAgLyogVlA1Nl9NQl9JTlRFUl9OT1ZFQ19QRiAqLworICAgIFZQNTZfRlJBTUVfQ1VSUkVOVCwgICAvKiBWUDU2X01CX0lOVFJBICovCisgICAgVlA1Nl9GUkFNRV9QUkVWSU9VUywgIC8qIFZQNTZfTUJfSU5URVJfREVMVEFfUEYgKi8KKyAgICBWUDU2X0ZSQU1FX1BSRVZJT1VTLCAgLyogVlA1Nl9NQl9JTlRFUl9WMV9QRiAqLworICAgIFZQNTZfRlJBTUVfUFJFVklPVVMsICAvKiBWUDU2X01CX0lOVEVSX1YyX1BGICovCisgICAgVlA1Nl9GUkFNRV9HT0xERU4sICAgIC8qIFZQNTZfTUJfSU5URVJfTk9WRUNfR0YgKi8KKyAgICBWUDU2X0ZSQU1FX0dPTERFTiwgICAgLyogVlA1Nl9NQl9JTlRFUl9ERUxUQV9HRiAqLworICAgIFZQNTZfRlJBTUVfUFJFVklPVVMsICAvKiBWUDU2X01CX0lOVEVSXzRWICovCisgICAgVlA1Nl9GUkFNRV9HT0xERU4sICAgIC8qIFZQNTZfTUJfSU5URVJfVjFfR0YgKi8KKyAgICBWUDU2X0ZSQU1FX0dPTERFTiwgICAgLyogVlA1Nl9NQl9JTlRFUl9WMl9HRiAqLworfTsKKworY29uc3QgdWludDhfdCBmZl92cDU2X2FjX2RlcXVhbnRbNjRdID0geworICAgIDk0LCA5MiwgOTAsIDg4LCA4NiwgODIsIDc4LCA3NCwKKyAgICA3MCwgNjYsIDYyLCA1OCwgNTQsIDUzLCA1MiwgNTEsCisgICAgNTAsIDQ5LCA0OCwgNDcsIDQ2LCA0NSwgNDQsIDQzLAorICAgIDQyLCA0MCwgMzksIDM3LCAzNiwgMzUsIDM0LCAzMywKKyAgICAzMiwgMzEsIDMwLCAyOSwgMjgsIDI3LCAyNiwgMjUsCisgICAgMjQsIDIzLCAyMiwgMjEsIDIwLCAxOSwgMTgsIDE3LAorICAgIDE2LCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCAgOSwKKyAgICAgOCwgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsCit9OworCitjb25zdCB1aW50OF90IGZmX3ZwNTZfZGNfZGVxdWFudFs2NF0gPSB7CisgICAgNDcsIDQ3LCA0NywgNDcsIDQ1LCA0MywgNDMsIDQzLAorICAgIDQzLCA0MywgNDIsIDQxLCA0MSwgNDAsIDQwLCA0MCwKKyAgICA0MCwgMzUsIDM1LCAzNSwgMzUsIDMzLCAzMywgMzMsCisgICAgMzMsIDMyLCAzMiwgMzIsIDI3LCAyNywgMjYsIDI2LAorICAgIDI1LCAyNSwgMjQsIDI0LCAyMywgMjMsIDE5LCAxOSwKKyAgICAxOSwgMTksIDE4LCAxOCwgMTcsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNSwgMTEsIDExLCAxMSwgMTAsIDEwLAorICAgICA5LCAgOCwgIDcsICA1LCAgMywgIDMsICAyLCAgMiwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdnA1Nl9wcmVfZGVmX21iX3R5cGVfc3RhdHNbMTZdWzNdWzEwXVsyXSA9IHsKKyAgeyB7IHsgICA5LCAxNSB9LCB7ICAzMiwgMjUgfSwgeyAgNywgIDE5IH0sIHsgICA5LCAyMSB9LCB7ICAxLCAxMiB9LAorICAgICAgeyAgMTQsIDEyIH0sIHsgICAzLCAxOCB9LCB7IDE0LCAgMjMgfSwgeyAgIDMsIDEwIH0sIHsgIDAsICA0IH0sIH0sCisgICAgeyB7ICA0MSwgMjIgfSwgeyAgIDEsICAwIH0sIHsgIDEsICAzMSB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAwLCAgMSB9LCB7ICAgMSwgIDcgfSwgeyAgMCwgICAxIH0sIHsgIDk4LCAyNSB9LCB7ICA0LCAxMCB9LCB9LAorICAgIHsgeyAgIDIsICAzIH0sIHsgICAyLCAgMyB9LCB7ICAwLCAgIDIgfSwgeyAgIDAsICAyIH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAxMSwgIDQgfSwgeyAgIDEsICA0IH0sIHsgIDAsICAgMiB9LCB7ICAgMywgIDIgfSwgeyAgMCwgIDQgfSwgfSwgfSwKKyAgeyB7IHsgIDQ4LCAzOSB9LCB7ICAgMSwgIDIgfSwgeyAxMSwgIDI3IH0sIHsgIDI5LCA0NCB9LCB7ICA3LCAyNyB9LAorICAgICAgeyAgIDEsICA0IH0sIHsgICAwLCAgMyB9LCB7ICAxLCAgIDYgfSwgeyAgIDEsICAyIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7IDEyMywgMzcgfSwgeyAgIDYsICA0IH0sIHsgIDEsICAyNyB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICA1LCAgOCB9LCB7ICAgMSwgIDcgfSwgeyAgMCwgICAxIH0sIHsgIDEyLCAxMCB9LCB7ICAwLCAgMiB9LCB9LAorICAgIHsgeyAgNDksIDQ2IH0sIHsgICAzLCAgNCB9LCB7ICA3LCAgMzEgfSwgeyAgNDIsIDQxIH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMiwgIDYgfSwgeyAgIDEsICA3IH0sIHsgIDEsICAgNCB9LCB7ICAgMiwgIDQgfSwgeyAgMCwgIDEgfSwgfSwgfSwKKyAgeyB7IHsgIDIxLCAzMiB9LCB7ICAgMSwgIDIgfSwgeyAgNCwgIDEwIH0sIHsgIDMyLCA0MyB9LCB7ICA2LCAyMyB9LAorICAgICAgeyAgIDIsICAzIH0sIHsgICAxLCAxOSB9LCB7ICAxLCAgIDYgfSwgeyAgMTIsIDIxIH0sIHsgIDAsICA3IH0sIH0sCisgICAgeyB7ICAyNiwgMTQgfSwgeyAgMTQsIDEyIH0sIHsgIDAsICAyNCB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgIDU1LCAxNyB9LCB7ICAgMSwgIDkgfSwgeyAgMCwgIDM2IH0sIHsgICA1LCAgNyB9LCB7ICAxLCAgMyB9LCB9LAorICAgIHsgeyAgMjYsIDI1IH0sIHsgICAxLCAgMSB9LCB7ICAyLCAgMTAgfSwgeyAgNjcsIDM5IH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMSwgIDEgfSwgeyAgIDAsIDE0IH0sIHsgIDAsICAgMiB9LCB7ICAzMSwgMjYgfSwgeyAgMSwgIDYgfSwgfSwgfSwKKyAgeyB7IHsgIDY5LCA4MyB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgICAyIH0sIHsgIDEwLCAyOSB9LCB7ICAzLCAxMiB9LAorICAgICAgeyAgIDAsICAxIH0sIHsgICAwLCAgMyB9LCB7ICAwLCAgIDMgfSwgeyAgIDIsICAyIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7IDIwOSwgIDUgfSwgeyAgIDAsICAwIH0sIHsgIDAsICAyNyB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAwLCAgMSB9LCB7ICAgMCwgIDEgfSwgeyAgMCwgICAxIH0sIHsgICAwLCAgMCB9LCB7ICAwLCAgMCB9LCB9LAorICAgIHsgeyAxMDMsIDQ2IH0sIHsgICAxLCAgMiB9LCB7ICAyLCAgMTAgfSwgeyAgMzMsIDQyIH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMSwgIDQgfSwgeyAgIDAsICAzIH0sIHsgIDAsICAgMSB9LCB7ICAgMSwgIDMgfSwgeyAgMCwgIDAgfSwgfSwgfSwKKyAgeyB7IHsgIDExLCAyMCB9LCB7ICAgMSwgIDQgfSwgeyAxOCwgIDM2IH0sIHsgIDQzLCA0OCB9LCB7IDEzLCAzNSB9LAorICAgICAgeyAgIDAsICAyIH0sIHsgICAwLCAgNSB9LCB7ICAzLCAgMTIgfSwgeyAgIDEsICAyIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7ICAgMiwgIDUgfSwgeyAgIDQsICA1IH0sIHsgIDAsIDEyMSB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAwLCAgMyB9LCB7ICAgMiwgIDQgfSwgeyAgMSwgICA0IH0sIHsgICAyLCAgMiB9LCB7ICAwLCAgMSB9LCB9LAorICAgIHsgeyAgMTQsIDMxIH0sIHsgICA5LCAxMyB9LCB7IDE0LCAgNTQgfSwgeyAgMjIsIDI5IH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMiwgIDYgfSwgeyAgIDQsIDE4IH0sIHsgIDYsICAxMyB9LCB7ICAgMSwgIDUgfSwgeyAgMCwgIDEgfSwgfSwgfSwKKyAgeyB7IHsgIDcwLCA0NCB9LCB7ICAgMCwgIDEgfSwgeyAgMiwgIDEwIH0sIHsgIDM3LCA0NiB9LCB7ICA4LCAyNiB9LAorICAgICAgeyAgIDAsICAyIH0sIHsgICAwLCAgMiB9LCB7ICAwLCAgIDIgfSwgeyAgIDAsICAxIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7IDE3NSwgIDUgfSwgeyAgIDAsICAxIH0sIHsgIDAsICA0OCB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAwLCAgMiB9LCB7ICAgMCwgIDEgfSwgeyAgMCwgICAyIH0sIHsgICAwLCAgMSB9LCB7ICAwLCAgMCB9LCB9LAorICAgIHsgeyAgODUsIDM5IH0sIHsgICAwLCAgMCB9LCB7ICAxLCAgIDkgfSwgeyAgNjksIDQwIH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMCwgIDEgfSwgeyAgIDAsICAzIH0sIHsgIDAsICAgMSB9LCB7ICAgMiwgIDMgfSwgeyAgMCwgIDAgfSwgfSwgfSwKKyAgeyB7IHsgICA4LCAxNSB9LCB7ICAgMCwgIDEgfSwgeyAgOCwgIDIxIH0sIHsgIDc0LCA1MyB9LCB7IDIyLCA0MiB9LAorICAgICAgeyAgIDAsICAxIH0sIHsgICAwLCAgMiB9LCB7ICAwLCAgIDMgfSwgeyAgIDEsICAyIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7ICA4MywgIDUgfSwgeyAgIDIsICAzIH0sIHsgIDAsIDEwMiB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAxLCAgMyB9LCB7ICAgMCwgIDIgfSwgeyAgMCwgICAxIH0sIHsgICAwLCAgMCB9LCB7ICAwLCAgMCB9LCB9LAorICAgIHsgeyAgMzEsIDI4IH0sIHsgICAwLCAgMCB9LCB7ICAzLCAgMTQgfSwgeyAxMzAsIDM0IH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMCwgIDEgfSwgeyAgIDAsICAzIH0sIHsgIDAsICAgMSB9LCB7ICAgMywgIDMgfSwgeyAgMCwgIDEgfSwgfSwgfSwKKyAgeyB7IHsgMTQxLCA0MiB9LCB7ICAgMCwgIDAgfSwgeyAgMSwgICA0IH0sIHsgIDExLCAyNCB9LCB7ICAxLCAxMSB9LAorICAgICAgeyAgIDAsICAxIH0sIHsgICAwLCAgMSB9LCB7ICAwLCAgIDIgfSwgeyAgIDAsICAwIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7IDIzMywgIDYgfSwgeyAgIDAsICAwIH0sIHsgIDAsICAgOCB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAwLCAgMSB9LCB7ICAgMCwgIDEgfSwgeyAgMCwgICAwIH0sIHsgICAwLCAgMSB9LCB7ICAwLCAgMCB9LCB9LAorICAgIHsgeyAxNzEsIDI1IH0sIHsgICAwLCAgMCB9LCB7ICAxLCAgIDUgfSwgeyAgMjUsIDIxIH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMCwgIDEgfSwgeyAgIDAsICAxIH0sIHsgIDAsICAgMCB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwgfSwgfSwKKyAgeyB7IHsgICA4LCAxOSB9LCB7ICAgNCwgMTAgfSwgeyAyNCwgIDQ1IH0sIHsgIDIxLCAzNyB9LCB7ICA5LCAyOSB9LAorICAgICAgeyAgIDAsICAzIH0sIHsgICAxLCAgNyB9LCB7IDExLCAgMjUgfSwgeyAgIDAsICAyIH0sIHsgIDAsICAxIH0sIH0sCisgICAgeyB7ICAzNCwgMTYgfSwgeyAxMTIsIDIxIH0sIHsgIDEsICAyOCB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICA2LCAgOCB9LCB7ICAgMSwgIDcgfSwgeyAgMCwgICAzIH0sIHsgICAyLCAgNSB9LCB7ICAwLCAgMiB9LCB9LAorICAgIHsgeyAgMTcsIDIxIH0sIHsgIDY4LCAyOSB9LCB7ICA2LCAgMTUgfSwgeyAgMTMsIDIyIH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgNiwgMTIgfSwgeyAgIDMsIDE0IH0sIHsgIDQsICAxMCB9LCB7ICAgMSwgIDcgfSwgeyAgMCwgIDMgfSwgfSwgfSwKKyAgeyB7IHsgIDQ2LCA0MiB9LCB7ICAgMCwgIDEgfSwgeyAgMiwgIDEwIH0sIHsgIDU0LCA1MSB9LCB7IDEwLCAzMCB9LAorICAgICAgeyAgIDAsICAyIH0sIHsgICAwLCAgMiB9LCB7ICAwLCAgIDEgfSwgeyAgIDAsICAxIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7IDE1OSwgMzUgfSwgeyAgIDIsICAyIH0sIHsgIDAsICAyNSB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAzLCAgNiB9LCB7ICAgMCwgIDUgfSwgeyAgMCwgICAxIH0sIHsgICA0LCAgNCB9LCB7ICAwLCAgMSB9LCB9LAorICAgIHsgeyAgNTEsIDM5IH0sIHsgICAwLCAgMSB9LCB7ICAyLCAgMTIgfSwgeyAgOTEsIDQ0IH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMCwgIDIgfSwgeyAgIDAsICAzIH0sIHsgIDAsICAgMSB9LCB7ICAgMiwgIDMgfSwgeyAgMCwgIDEgfSwgfSwgfSwKKyAgeyB7IHsgIDI4LCAzMiB9LCB7ICAgMCwgIDAgfSwgeyAgMywgIDEwIH0sIHsgIDc1LCA1MSB9LCB7IDE0LCAzMyB9LAorICAgICAgeyAgIDAsICAxIH0sIHsgICAwLCAgMiB9LCB7ICAwLCAgIDEgfSwgeyAgIDEsICAyIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7ICA3NSwgMzkgfSwgeyAgIDUsICA3IH0sIHsgIDIsICA0OCB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAzLCAxMSB9LCB7ICAgMiwgMTYgfSwgeyAgMSwgICA0IH0sIHsgICA3LCAxMCB9LCB7ICAwLCAgMiB9LCB9LAorICAgIHsgeyAgODEsIDI1IH0sIHsgICAwLCAgMCB9LCB7ICAyLCAgIDkgfSwgeyAxMDYsIDI2IH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMCwgIDEgfSwgeyAgIDAsICAxIH0sIHsgIDAsICAgMSB9LCB7ICAgMSwgIDEgfSwgeyAgMCwgIDAgfSwgfSwgfSwKKyAgeyB7IHsgMTAwLCA0NiB9LCB7ICAgMCwgIDEgfSwgeyAgMywgICA5IH0sIHsgIDIxLCAzNyB9LCB7ICA1LCAyMCB9LAorICAgICAgeyAgIDAsICAxIH0sIHsgICAwLCAgMiB9LCB7ICAxLCAgIDIgfSwgeyAgIDAsICAxIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7IDIxMiwgMjEgfSwgeyAgIDAsICAxIH0sIHsgIDAsICAgOSB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAxLCAgMiB9LCB7ICAgMCwgIDIgfSwgeyAgMCwgICAwIH0sIHsgICAyLCAgMiB9LCB7ICAwLCAgMCB9LCB9LAorICAgIHsgeyAxNDAsIDM3IH0sIHsgICAwLCAgMSB9LCB7ICAxLCAgIDggfSwgeyAgMjQsIDMzIH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMSwgIDIgfSwgeyAgIDAsICAyIH0sIHsgIDAsICAgMSB9LCB7ICAgMSwgIDIgfSwgeyAgMCwgIDAgfSwgfSwgfSwKKyAgeyB7IHsgIDI3LCAyOSB9LCB7ICAgMCwgIDEgfSwgeyAgOSwgIDI1IH0sIHsgIDUzLCA1MSB9LCB7IDEyLCAzNCB9LAorICAgICAgeyAgIDAsICAxIH0sIHsgICAwLCAgMyB9LCB7ICAxLCAgIDUgfSwgeyAgIDAsICAyIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7ICAgNCwgIDIgfSwgeyAgIDAsICAwIH0sIHsgIDAsIDE3MiB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAwLCAgMSB9LCB7ICAgMCwgIDIgfSwgeyAgMCwgICAwIH0sIHsgICAyLCAgMCB9LCB7ICAwLCAgMCB9LCB9LAorICAgIHsgeyAgMTQsIDIzIH0sIHsgICAxLCAgMyB9LCB7IDExLCAgNTMgfSwgeyAgOTAsIDMxIH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMCwgIDMgfSwgeyAgIDEsICA1IH0sIHsgIDIsICAgNiB9LCB7ICAgMSwgIDIgfSwgeyAgMCwgIDAgfSwgfSwgfSwKKyAgeyB7IHsgIDgwLCAzOCB9LCB7ICAgMCwgIDAgfSwgeyAgMSwgICA0IH0sIHsgIDY5LCAzMyB9LCB7ICA1LCAxNiB9LAorICAgICAgeyAgIDAsICAxIH0sIHsgICAwLCAgMSB9LCB7ICAwLCAgIDAgfSwgeyAgIDAsICAxIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7IDE4NywgMjIgfSwgeyAgIDEsICAxIH0sIHsgIDAsICAxNyB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAzLCAgNiB9LCB7ICAgMCwgIDQgfSwgeyAgMCwgICAxIH0sIHsgICA0LCAgNCB9LCB7ICAwLCAgMSB9LCB9LAorICAgIHsgeyAxMjMsIDI5IH0sIHsgICAwLCAgMCB9LCB7ICAxLCAgIDcgfSwgeyAgNTcsIDMwIH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMCwgIDEgfSwgeyAgIDAsICAxIH0sIHsgIDAsICAgMSB9LCB7ICAgMCwgIDEgfSwgeyAgMCwgIDAgfSwgfSwgfSwKKyAgeyB7IHsgIDE2LCAyMCB9LCB7ICAgMCwgIDAgfSwgeyAgMiwgICA4IH0sIHsgMTA0LCA0OSB9LCB7IDE1LCAzMyB9LAorICAgICAgeyAgIDAsICAxIH0sIHsgICAwLCAgMSB9LCB7ICAwLCAgIDEgfSwgeyAgIDEsICAxIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7IDEzMywgIDYgfSwgeyAgIDEsICAyIH0sIHsgIDEsICA3MCB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAwLCAgMiB9LCB7ICAgMCwgIDQgfSwgeyAgMCwgICAzIH0sIHsgICAxLCAgMSB9LCB7ICAwLCAgMCB9LCB9LAorICAgIHsgeyAgMTMsIDE0IH0sIHsgICAwLCAgMCB9LCB7ICA0LCAgMjAgfSwgeyAxNzUsIDIwIH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMCwgIDEgfSwgeyAgIDAsICAxIH0sIHsgIDAsICAgMSB9LCB7ICAgMSwgIDEgfSwgeyAgMCwgIDAgfSwgfSwgfSwKKyAgeyB7IHsgMTk0LCAxNiB9LCB7ICAgMCwgIDAgfSwgeyAgMSwgICAxIH0sIHsgICAxLCAgOSB9LCB7ICAxLCAgMyB9LAorICAgICAgeyAgIDAsICAwIH0sIHsgICAwLCAgMSB9LCB7ICAwLCAgIDEgfSwgeyAgIDAsICAwIH0sIHsgIDAsICAwIH0sIH0sCisgICAgeyB7IDI1MSwgIDEgfSwgeyAgIDAsICAwIH0sIHsgIDAsICAgMiB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwKKyAgICAgIHsgICAwLCAgMCB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgICAwIH0sIHsgICAwLCAgMCB9LCB7ICAwLCAgMCB9LCB9LAorICAgIHsgeyAyMDIsIDIzIH0sIHsgICAwLCAgMCB9LCB7ICAxLCAgIDMgfSwgeyAgIDIsICA5IH0sIHsgIDAsICAwIH0sCisgICAgICB7ICAgMCwgIDEgfSwgeyAgIDAsICAxIH0sIHsgIDAsICAgMSB9LCB7ICAgMCwgIDAgfSwgeyAgMCwgIDAgfSwgfSwgfSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdnA1Nl9maWx0ZXJfdGhyZXNob2xkW10gPSB7CisgICAgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTAsIDEwLAorICAgIDEwLCAxMCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsCisgICAgIDUsICA1LCAgNSwgIDUsICA0LCAgNCwgIDQsICA0LAorICAgICA0LCAgNCwgIDQsICAzLCAgMywgIDMsICAzLCAgMiwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdnA1Nl9tYl90eXBlX21vZGVsX21vZGVsW10gPSB7CisgICAgMTcxLCA4MywgMTk5LCAxNDAsIDEyNSwgMTA0LAorfTsKKworY29uc3QgVlA1NlRyZWUgZmZfdnA1Nl9wbWJ0bV90cmVlW10gPSB7CisgICAgeyA0LCAwfSwKKyAgICB7IDIsIDF9LCB7LTh9LCB7LTR9LAorICAgIHsgOCwgMn0sCisgICAgeyA2LCAzfSwKKyAgICB7IDQsIDR9LAorICAgIHsgMiwgNX0sIHstMjR9LCB7LTIwfSwgey0xNn0sIHstMTJ9LCB7LTB9LAorfTsKKworY29uc3QgVlA1NlRyZWUgZmZfdnA1Nl9wbWJ0X3RyZWVbXSA9IHsKKyAgICB7IDgsIDF9LAorICAgIHsgNCwgMn0sCisgICAgeyAyLCA0fSwgey1WUDU2X01CX0lOVEVSX05PVkVDX1BGfSwgey1WUDU2X01CX0lOVEVSX0RFTFRBX1BGfSwKKyAgICB7IDIsIDV9LCB7LVZQNTZfTUJfSU5URVJfVjFfUEZ9LCAgICB7LVZQNTZfTUJfSU5URVJfVjJfUEZ9LAorICAgIHsgNCwgM30sCisgICAgeyAyLCA2fSwgey1WUDU2X01CX0lOVFJBfSwgICAgICAgICAgey1WUDU2X01CX0lOVEVSXzRWfSwKKyAgICB7IDQsIDd9LAorICAgIHsgMiwgOH0sIHstVlA1Nl9NQl9JTlRFUl9OT1ZFQ19HRn0sIHstVlA1Nl9NQl9JTlRFUl9ERUxUQV9HRn0sCisgICAgeyAyLCA5fSwgey1WUDU2X01CX0lOVEVSX1YxX0dGfSwgICAgey1WUDU2X01CX0lOVEVSX1YyX0dGfSwKK307CisKKy8qIHJlbGF0aXZlIHBvcyBvZiBzdXJyb3VuZGluZyBibG9ja3MsIGZyb20gY2xvc2VzdCB0byBmYXJ0aGVzdCAqLworY29uc3QgaW50OF90IGZmX3ZwNTZfY2FuZGlkYXRlX3ByZWRpY3Rvcl9wb3NbMTJdWzJdID0geworICAgIHsgIDAsIC0xIH0sCisgICAgeyAtMSwgIDAgfSwKKyAgICB7IC0xLCAtMSB9LAorICAgIHsgIDEsIC0xIH0sCisgICAgeyAgMCwgLTIgfSwKKyAgICB7IC0yLCAgMCB9LAorICAgIHsgLTIsIC0xIH0sCisgICAgeyAtMSwgLTIgfSwKKyAgICB7ICAxLCAtMiB9LAorICAgIHsgIDIsIC0xIH0sCisgICAgeyAtMiwgLTIgfSwKKyAgICB7ICAyLCAtMiB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZwNTZkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy92cDU2ZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTI2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDU2ZGF0YS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVlA1IGFuZCBWUDYgY29tcGF0aWJsZSB2aWRlbyBkZWNvZGVyIChjb21tb24gZGF0YSkKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVlA1NkRBVEFfSAorI2RlZmluZSBBVkNPREVDX1ZQNTZEQVRBX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJ2cDU2LmgiCisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZwNTZfYjJwW107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92cDU2X2I2dG80W107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92cDU2X2NvZWZmX3BhcnNlX3RhYmxlWzZdWzExXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZwNTZfZGVmX21iX3R5cGVzX3N0YXRzWzNdWzEwXVsyXTsKK2V4dGVybiBjb25zdCBWUDU2VHJlZSBmZl92cDU2X3B2YV90cmVlW107CitleHRlcm4gY29uc3QgVlA1NlRyZWUgZmZfdnA1Nl9wY190cmVlW107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92cDU2X2NvZWZmX2JpYXNbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZwNTZfY29lZmZfYml0X2xlbmd0aFtdOworCitleHRlcm4gY29uc3QgVlA1NkZyYW1lIGZmX3ZwNTZfcmVmZXJlbmNlX2ZyYW1lW107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92cDU2X2FjX2RlcXVhbnRbNjRdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdnA1Nl9kY19kZXF1YW50WzY0XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZwNTZfcHJlX2RlZl9tYl90eXBlX3N0YXRzWzE2XVszXVsxMF1bMl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92cDU2X2ZpbHRlcl90aHJlc2hvbGRbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZwNTZfbWJfdHlwZV9tb2RlbF9tb2RlbFtdOworZXh0ZXJuIGNvbnN0IFZQNTZUcmVlIGZmX3ZwNTZfcG1idG1fdHJlZVtdOworZXh0ZXJuIGNvbnN0IFZQNTZUcmVlIGZmX3ZwNTZfcG1idF90cmVlW107CitleHRlcm4gY29uc3QgaW50OF90IGZmX3ZwNTZfY2FuZGlkYXRlX3ByZWRpY3Rvcl9wb3NbMTJdWzJdOworCisjZW5kaWYgLyogQVZDT0RFQ19WUDU2REFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92cDU2ZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92cDU2ZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1MzNlYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwNTZkc3AuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAidnA1NmRzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworLyogR2l2ZXMgdmVyeSBzaW1pbGFyIHJlc3VsdCB0aGFuIHRoZSB2cDYgdmVyc2lvbiBleGNlcHQgaW4gYSBmZXcgY2FzZXMgKi8KK3N0YXRpYyBpbnQgdnA1X2FkanVzdChpbnQgdiwgaW50IHQpCit7CisgICAgaW50IHMyLCBzMSA9IHYgPj4gMzE7CisgICAgdiBePSBzMTsKKyAgICB2IC09IHMxOworICAgIHYgKj0gdiA8IDIqdDsKKyAgICB2IC09IHQ7CisgICAgczIgPSB2ID4+IDMxOworICAgIHYgXj0gczI7CisgICAgdiAtPSBzMjsKKyAgICB2ID0gdCAtIHY7CisgICAgdiArPSBzMTsKKyAgICB2IF49IHMxOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgaW50IHZwNl9hZGp1c3QoaW50IHYsIGludCB0KQoreworICAgIGludCBWID0gdiwgcyA9IHYgPj4gMzE7CisgICAgViBePSBzOworICAgIFYgLT0gczsKKyAgICBpZiAoVi10LTEgPj0gKHVuc2lnbmVkKSh0LTEpKQorICAgICAgICByZXR1cm4gdjsKKyAgICBWID0gMip0IC0gVjsKKyAgICBWICs9IHM7CisgICAgViBePSBzOworICAgIHJldHVybiBWOworfQorCisKKyNkZWZpbmUgVlA1Nl9FREdFX0ZJTFRFUihwZngsIHN1ZiwgcGl4X2luYywgbGluZV9pbmMpICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHBmeCMjX2VkZ2VfZmlsdGVyXyMjc3VmKHVpbnQ4X3QgKnl1diwgaW50IHN0cmlkZSwgaW50IHQpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgcGl4Ml9pbmMgPSAyICogcGl4X2luYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGk9MDsgaTwxMjsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdiA9ICh5dXZbLXBpeDJfaW5jXSArIDMqKHl1dlswXS15dXZbLXBpeF9pbmNdKSAtIHl1dltwaXhfaW5jXSArIDQpPj4zO1wKKyAgICAgICAgdiA9IHBmeCMjX2FkanVzdCh2LCB0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeXV2Wy1waXhfaW5jXSA9IGF2X2NsaXBfdWludDgoeXV2Wy1waXhfaW5jXSArIHYpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgeXV2WzBdID0gYXZfY2xpcF91aW50OCh5dXZbMF0gLSB2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeXV2ICs9IGxpbmVfaW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVlA1Nl9FREdFX0ZJTFRFUih2cDUsIGhvciwgMSwgc3RyaWRlKQorVlA1Nl9FREdFX0ZJTFRFUih2cDUsIHZlciwgc3RyaWRlLCAxKQorVlA1Nl9FREdFX0ZJTFRFUih2cDYsIGhvciwgMSwgc3RyaWRlKQorVlA1Nl9FREdFX0ZJTFRFUih2cDYsIHZlciwgc3RyaWRlLCAxKQorCithdl9jb2xkIHZvaWQgZmZfdnA1NmRzcF9pbml0KFZQNTZEU1BDb250ZXh0ICpzLCBlbnVtIEFWQ29kZWNJRCBjb2RlYykKK3sKKyAgICBpZiAoY29kZWMgPT0gQVZfQ09ERUNfSURfVlA1KSB7CisgICAgICAgIHMtPmVkZ2VfZmlsdGVyX2hvciA9IHZwNV9lZGdlX2ZpbHRlcl9ob3I7CisgICAgICAgIHMtPmVkZ2VfZmlsdGVyX3ZlciA9IHZwNV9lZGdlX2ZpbHRlcl92ZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+ZWRnZV9maWx0ZXJfaG9yID0gdnA2X2VkZ2VfZmlsdGVyX2hvcjsKKyAgICAgICAgcy0+ZWRnZV9maWx0ZXJfdmVyID0gdnA2X2VkZ2VfZmlsdGVyX3ZlcjsKKworICAgICAgICBpZiAoQ09ORklHX1ZQNl9ERUNPREVSKSB7CisgICAgICAgICAgICBzLT52cDZfZmlsdGVyX2RpYWc0ID0gZmZfdnA2X2ZpbHRlcl9kaWFnNF9jOworCisgICAgICAgICAgICBpZiAoQVJDSF9BUk0pCisgICAgICAgICAgICAgICAgZmZfdnA2ZHNwX2luaXRfYXJtKHMsIGNvZGVjKTsKKyAgICAgICAgICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgICAgICAgICBmZl92cDZkc3BfaW5pdF94ODYocywgY29kZWMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnA1NmRzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA1NmRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDdiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDU2ZHNwLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZQNTZEU1BfSAorI2RlZmluZSBBVkNPREVDX1ZQNTZEU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCit0eXBlZGVmIHN0cnVjdCBWUDU2RFNQQ29udGV4dCB7CisgICAgdm9pZCAoKmVkZ2VfZmlsdGVyX2hvcikodWludDhfdCAqeXV2LCBpbnQgc3RyaWRlLCBpbnQgdCk7CisgICAgdm9pZCAoKmVkZ2VfZmlsdGVyX3ZlcikodWludDhfdCAqeXV2LCBpbnQgc3RyaWRlLCBpbnQgdCk7CisKKyAgICB2b2lkICgqdnA2X2ZpbHRlcl9kaWFnNCkodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmhfd2VpZ2h0cyxjb25zdCBpbnQxNl90ICp2X3dlaWdodHMpOworfSBWUDU2RFNQQ29udGV4dDsKKwordm9pZCBmZl92cDZfZmlsdGVyX2RpYWc0X2ModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpoX3dlaWdodHMsIGNvbnN0IGludDE2X3QgKnZfd2VpZ2h0cyk7CisKK3ZvaWQgZmZfdnA1NmRzcF9pbml0KFZQNTZEU1BDb250ZXh0ICpzLCBlbnVtIEFWQ29kZWNJRCBjb2RlYyk7Cit2b2lkIGZmX3ZwNmRzcF9pbml0X2FybShWUDU2RFNQQ29udGV4dCAqcywgZW51bSBBVkNvZGVjSUQgY29kZWMpOwordm9pZCBmZl92cDZkc3BfaW5pdF94ODYoVlA1NkRTUENvbnRleHQqIGMsIGVudW0gQVZDb2RlY0lEIGNvZGVjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVlA1NkRTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92cDU2cmFjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92cDU2cmFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2MWI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwNTZyYWMuYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogVlA1LzYvOCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgRmlvbmEgR2xhc2VyIDxmaW9uYUB4MjY0LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJ2cDU2LmgiCisKK2NvbnN0IHVpbnQ4X3QgZmZfdnA1Nl9ub3JtX3NoaWZ0WzI1Nl09IHsKKyA4LDcsNiw2LDUsNSw1LDUsNCw0LDQsNCw0LDQsNCw0LAorIDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsCisgMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKKyAyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAorIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorfTsKKwordm9pZCBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2RlcihWUDU2UmFuZ2VDb2RlciAqYywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgYy0+aGlnaCA9IDI1NTsKKyAgICBjLT5iaXRzID0gLTE2OworICAgIGMtPmJ1ZmZlciA9IGJ1ZjsKKyAgICBjLT5lbmQgPSBidWYgKyBidWZfc2l6ZTsKKyAgICBjLT5jb2RlX3dvcmQgPSBieXRlc3RyZWFtX2dldF9iZTI0KCZjLT5idWZmZXIpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnA1ZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA1ZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmZmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDVkYXRhLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVlA1IGNvbXBhdGlibGUgdmlkZW8gZGVjb2RlcgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WUDVEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19WUDVEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDVfY29lZmZfZ3JvdXBzW10gPSB7CisgICAgLTEsIDAsIDEsIDEsIDIsIDEsIDEsIDIsCisgICAgIDIsIDEsIDEsIDIsIDIsIDIsIDEsIDIsCisgICAgIDIsIDIsIDIsIDIsIDEsIDEsIDIsIDIsCisgICAgIDMsIDMsIDQsIDMsIDQsIDQsIDQsIDMsCisgICAgIDMsIDMsIDMsIDMsIDQsIDMsIDMsIDMsCisgICAgIDQsIDQsIDQsIDQsIDQsIDMsIDMsIDQsCisgICAgIDQsIDQsIDMsIDQsIDQsIDQsIDQsIDQsCisgICAgIDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDVfdm1jX3BjdFsyXVsxMV0gPSB7CisgICAgeyAyNDMsIDIyMCwgMjUxLCAyNTMsIDIzNywgMjMyLCAyNDEsIDI0NSwgMjQ3LCAyNTEsIDI1MyB9LAorICAgIHsgMjM1LCAyMTEsIDI0NiwgMjQ5LCAyMzQsIDIzMSwgMjQ4LCAyNDksIDI1MiwgMjUyLCAyNTQgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwNV9kY2N2X3BjdFsyXVsxMV0gPSB7CisgICAgeyAxNDYsIDE5NywgMTgxLCAyMDcsIDIzMiwgMjQzLCAyMzgsIDI1MSwgMjQ0LCAyNTAsIDI0OSB9LAorICAgIHsgMTc5LCAyMTksIDIxNCwgMjQwLCAyNTAsIDI1NCwgMjQ0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwNV9yYWN0X3BjdFszXVsyXVs2XVsxMV0gPSB7CisgICAgeyB7IHsgMjI3LCAyNDYsIDIzMCwgMjQ3LCAyNDQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSwKKyAgICAgICAgeyAyMDIsIDI1NCwgMjA5LCAyMzEsIDIzMSwgMjQ5LCAyNDksIDI1MywgMjU0LCAyNTQsIDI1NCB9LAorICAgICAgICB7IDIwNiwgMjU0LCAyMjUsIDI0MiwgMjQxLCAyNTEsIDI1MywgMjU0LCAyNTQsIDI1NCwgMjU0IH0sCisgICAgICAgIHsgMjM1LCAyNTQsIDI0MSwgMjUzLCAyNTIsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSwKKyAgICAgICAgeyAyMzQsIDI1NCwgMjQ4LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCB9LAorICAgICAgICB7IDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0IH0gfSwKKyAgICAgIHsgeyAyNDAsIDI1NCwgMjQ4LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCB9LAorICAgICAgICB7IDIzOCwgMjU0LCAyNDAsIDI1MywgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0IH0sCisgICAgICAgIHsgMjQ0LCAyNTQsIDI1MSwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSwKKyAgICAgICAgeyAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCB9LAorICAgICAgICB7IDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0IH0sCisgICAgICAgIHsgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSB9IH0sCisgICAgeyB7IHsgMjA2LCAyMDMsIDIyNywgMjM5LCAyNDcsIDI1NCwgMjUzLCAyNTQsIDI1NCwgMjU0LCAyNTQgfSwKKyAgICAgICAgeyAyMDcsIDE5OSwgMjIwLCAyMzYsIDI0MywgMjUyLCAyNTIsIDI1NCwgMjU0LCAyNTQsIDI1NCB9LAorICAgICAgICB7IDIxMiwgMjE5LCAyMzAsIDI0MywgMjQ0LCAyNTMsIDI1MiwgMjU0LCAyNTQsIDI1NCwgMjU0IH0sCisgICAgICAgIHsgMjM2LCAyMzcsIDI0NywgMjUyLCAyNTMsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSwKKyAgICAgICAgeyAyNDAsIDI0MCwgMjQ4LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCB9LAorICAgICAgICB7IDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0IH0gfSwKKyAgICAgIHsgeyAyMzAsIDIzMywgMjQ5LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCB9LAorICAgICAgICB7IDIzOCwgMjM4LCAyNTAsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0IH0sCisgICAgICAgIHsgMjQ4LCAyNTEsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSwKKyAgICAgICAgeyAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCB9LAorICAgICAgICB7IDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0IH0sCisgICAgICAgIHsgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSB9IH0sCisgICAgeyB7IHsgMjI1LCAyMzksIDIyNywgMjMxLCAyNDQsIDI1MywgMjQzLCAyNTQsIDI1NCwgMjUzLCAyNTQgfSwKKyAgICAgICAgeyAyMzIsIDIzNCwgMjI0LCAyMjgsIDI0MiwgMjQ5LCAyNDIsIDI1MiwgMjUxLCAyNTEsIDI1NCB9LAorICAgICAgICB7IDIzNSwgMjQ5LCAyMzgsIDI0MCwgMjUxLCAyNTQsIDI0OSwgMjU0LCAyNTMsIDI1MywgMjU0IH0sCisgICAgICAgIHsgMjQ5LCAyNTMsIDI1MSwgMjUwLCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSwKKyAgICAgICAgeyAyNTEsIDI1MCwgMjQ5LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCB9LAorICAgICAgICB7IDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0IH0gfSwKKyAgICAgIHsgeyAyNDMsIDI0NCwgMjUwLCAyNTAsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCB9LAorICAgICAgICB7IDI0OSwgMjQ4LCAyNTAsIDI1MywgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0IH0sCisgICAgICAgIHsgMjUzLCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSwKKyAgICAgICAgeyAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCB9LAorICAgICAgICB7IDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0IH0sCisgICAgICAgIHsgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCB2cDVfZGNjdl9sY1s1XVszNl1bMl0gPSB7CisgICAgeyB7MTU0LCAgNjF9LCB7MTQxLCAgNTR9LCB7IDkwLCAgNDV9LCB7IDU0LCAgMzR9LCB7IDU0LCAgMTN9LCB7MTI4LCAxMDl9LAorICAgICAgezEzNiwgIDU0fSwgezE0OCwgIDQ1fSwgeyA5MiwgIDQxfSwgeyA1NCwgIDMzfSwgeyA1MSwgIDE1fSwgeyA4NywgMTEzfSwKKyAgICAgIHsgODcsICA0NH0sIHsgOTcsICA0MH0sIHsgNjcsICAzNn0sIHsgNDYsICAyOX0sIHsgNDEsICAxNX0sIHsgNjQsICA4MH0sCisgICAgICB7IDU5LCAgMzN9LCB7IDYxLCAgMzF9LCB7IDUxLCAgMjh9LCB7IDQ0LCAgMjJ9LCB7IDMzLCAgMTJ9LCB7IDQ5LCAgNjN9LAorICAgICAgeyA2OSwgIDEyfSwgeyA1OSwgIDE2fSwgeyA0NiwgIDE0fSwgeyAzMSwgIDEzfSwgeyAyNiwgICA2fSwgeyA5MiwgIDI2fSwKKyAgICAgIHsxMjgsIDEwOH0sIHsgNzcsIDExOX0sIHsgNTQsICA4NH0sIHsgMjYsICA3MX0sIHsgODcsICAxOX0sIHsgOTUsIDE1NX0gfSwKKyAgICB7IHsxNTQsICAgNH0sIHsxODIsICAgMH0sIHsxNTksICAtOH0sIHsxMjgsICAtNX0sIHsxNDMsICAtNX0sIHsxODcsICA1NX0sCisgICAgICB7MTgyLCAgIDB9LCB7MjI4LCAgLTN9LCB7MTg3LCAgLTd9LCB7MTc0LCAgLTl9LCB7MTg5LCAtMTF9LCB7MTY5LCAgNzl9LAorICAgICAgezE2MSwgIC05fSwgezE5MiwgIC04fSwgezE4NywgIC05fSwgezE2OSwgLTEwfSwgezEzNiwgIC05fSwgezE4NCwgIDQwfSwKKyAgICAgIHsxNjQsIC0xMX0sIHsxNzksIC0xMH0sIHsxNzQsIC0xMH0sIHsxNjEsIC0xMH0sIHsxMTUsICAtN30sIHsxOTcsICAyMH0sCisgICAgICB7MTk1LCAtMTF9LCB7MTk1LCAtMTF9LCB7MTQ2LCAtMTB9LCB7MTEwLCAgLTZ9LCB7IDk1LCAgLTR9LCB7MTk1LCAgMzl9LAorICAgICAgezE4MiwgIDU1fSwgezE3MiwgIDc3fSwgezE3NywgIDM3fSwgezE2OSwgIDI5fSwgezE3MiwgIDUyfSwgeyA5MiwgMTYyfSB9LAorICAgIHsgezE3NCwgIDgwfSwgezE2NCwgIDgwfSwgeyA5NSwgIDgwfSwgeyA0NiwgIDY2fSwgeyA1NiwgIDI0fSwgeyAzNiwgMTkzfSwKKyAgICAgIHsxNjQsICA4MH0sIHsxNjYsICA3N30sIHsxMDUsICA3Nn0sIHsgNDksICA2OH0sIHsgNDYsICAzMX0sIHsgNDksIDE4Nn0sCisgICAgICB7IDk3LCAgNzh9LCB7MTEwLCAgNzR9LCB7IDcyLCAgNzJ9LCB7IDQ0LCAgNjB9LCB7IDMzLCAgMzB9LCB7IDY5LCAxMzF9LAorICAgICAgeyA2MSwgIDYxfSwgeyA2OSwgIDYzfSwgeyA1MSwgIDU3fSwgeyAzMSwgIDQ4fSwgeyAyNiwgIDI3fSwgeyA2NCwgIDg5fSwKKyAgICAgIHsgNjcsICAyM30sIHsgNTEsICAzMn0sIHsgMzYsICAzM30sIHsgMjYsICAyOH0sIHsgMjAsICAxMn0sIHsgNDQsICA2OH0sCisgICAgICB7IDI2LCAxOTd9LCB7IDQxLCAxODl9LCB7IDYxLCAxMjl9LCB7IDI4LCAxMDN9LCB7IDQ5LCAgNTJ9LCB7LTEyLCAyNDV9IH0sCisgICAgeyB7MTAyLCAxNDF9LCB7IDc5LCAxNjZ9LCB7IDcyLCAxNjJ9LCB7IDk3LCAxMjV9LCB7MTc5LCAgIDR9LCB7MzA3LCAgIDB9LAorICAgICAgeyA3MiwgMTY4fSwgeyA2OSwgMTc1fSwgeyA4NCwgMTYwfSwgezEwNSwgMTI3fSwgezE0OCwgIDM0fSwgezMxMCwgICAwfSwKKyAgICAgIHsgODQsIDE1MX0sIHsgODIsIDE2MX0sIHsgODcsIDE1M30sIHsgODcsIDEzNX0sIHsxMTUsICA1MX0sIHszMTcsICAgMH0sCisgICAgICB7IDk3LCAxMjV9LCB7MTAyLCAxMzF9LCB7MTA1LCAxMjV9LCB7IDg3LCAxMjJ9LCB7IDg0LCAgNjR9LCB7IDU0LCAxODR9LAorICAgICAgezE2NiwgIDE4fSwgezE0NiwgIDQzfSwgezEyNSwgIDUxfSwgeyA5MCwgIDY0fSwgeyA5NSwgICA3fSwgeyAzOCwgMTU0fSwKKyAgICAgIHsyOTQsICAgMH0sIHsgMTMsIDIyNX0sIHsgMTAsIDIyNX0sIHsgNjcsIDE2OH0sIHsgIDAsIDE2N30sIHsxNjEsICA5NH0gfSwKKyAgICB7IHsxNzIsICA3Nn0sIHsxNzIsICA3NX0sIHsxMzYsICA4MH0sIHsgNjQsICA5OH0sIHsgNzQsICA2N30sIHszMTUsICAgMH0sCisgICAgICB7MTY5LCAgNzZ9LCB7MjA3LCAgNTZ9LCB7MTY0LCAgNjZ9LCB7IDk3LCAgODB9LCB7IDY3LCAgNzJ9LCB7MzI4LCAgIDB9LAorICAgICAgezEzNiwgIDgwfSwgezE4NywgIDUzfSwgezE1NCwgIDYyfSwgeyA3MiwgIDg1fSwgeyAtMiwgMTA1fSwgezMwNSwgICAwfSwKKyAgICAgIHsgNzQsICA5MX0sIHsxMjgsICA2NH0sIHsxMTMsICA2NH0sIHsgNjEsICA3N30sIHsgNDEsICA3NX0sIHsyNTksICAgMH0sCisgICAgICB7IDQ2LCAgODR9LCB7IDUxLCAgODF9LCB7IDI4LCAgODl9LCB7IDMxLCAgNzh9LCB7IDIzLCAgNzd9LCB7MjAyLCAgIDB9LAorICAgICAgezMyMywgICAwfSwgezMyMywgICAwfSwgezMwMCwgICAwfSwgezIzNiwgICAwfSwgezE5NSwgICAwfSwgezMyOCwgICAwfSB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdnA1X3JhY3RfbGNbM11bM11bNV1bNl1bMl0gPSB7CisgICAgeyB7IHsgezI3NiwgIDB9LCB7MjM4LCAgMH0sIHsxOTUsICAwfSwgezE1NiwgIDB9LCB7MTEzLCAgMH0sIHsyNzQsICAwfSB9LAorICAgICAgICB7IHsgIDAsICAxfSwgeyAgMCwgIDF9LCB7ICAwLCAgMX0sIHsgIDAsICAxfSwgeyAgMCwgIDF9LCB7ICAwLCAgMX0gfSwKKyAgICAgICAgeyB7MTkyLCA1OX0sIHsxODIsIDUwfSwgezE0MSwgNDh9LCB7MTEwLCA0MH0sIHsgOTIsIDE5fSwgezEyNSwxMjh9IH0sCisgICAgICAgIHsgezE2OSwgODd9LCB7MTY5LCA4M30sIHsxODQsIDYyfSwgezIyMCwgMTZ9LCB7MTg0LCAgMH0sIHsyNjQsICAwfSB9LAorICAgICAgICB7IHsyMTIsIDQwfSwgezIxMiwgMzZ9LCB7MTY5LCA0OX0sIHsxNzQsIDI3fSwgeyAgOCwxMjB9LCB7MTgyLCA3MX0gfSB9LAorICAgICAgeyB7IHsyNTksIDEwfSwgezE5NywgMTl9LCB7MTQzLCAyMn0sIHsxMjMsIDE2fSwgezExMCwgIDh9LCB7MTMzLCA4OH0gfSwKKyAgICAgICAgeyB7ICAwLCAgMX0sIHsyNTYsICAwfSwgeyAgMCwgIDF9LCB7ICAwLCAgMX0sIHsgIDAsICAxfSwgeyAgMCwgIDF9IH0sCisgICAgICAgIHsgezIwNywgNDZ9LCB7MTg3LCA1MH0sIHsgOTcsIDgzfSwgeyAyMywxMDB9LCB7IDQxLCA1Nn0sIHsgNTYsMTg4fSB9LAorICAgICAgICB7IHsxNjYsIDkwfSwgezE0NiwxMDh9LCB7MTYxLCA4OH0sIHsxMzYsIDk1fSwgezE3NCwgIDB9LCB7MjY2LCAgMH0gfSwKKyAgICAgICAgeyB7MjY0LCAgN30sIHsyNDMsIDE4fSwgezE4NCwgNDN9LCB7LTE0LDE1NH0sIHsgMjAsMTEyfSwgeyAyMCwxOTl9IH0gfSwKKyAgICAgIHsgeyB7MjMwLCAyNn0sIHsxOTcsIDIyfSwgezE1OSwgMjB9LCB7MTQ2LCAxMn0sIHsxMzYsICA0fSwgeyA1NCwxNjJ9IH0sCisgICAgICAgIHsgeyAgMCwgIDF9LCB7ICAwLCAgMX0sIHsgIDAsICAxfSwgeyAgMCwgIDF9LCB7ICAwLCAgMX0sIHsgIDAsICAxfSB9LAorICAgICAgICB7IHsxOTIsIDU5fSwgezE1NiwgNzJ9LCB7IDg0LDEwMX0sIHsgNDksMTAxfSwgeyA3OSwgNDd9LCB7IDc5LDE2N30gfSwKKyAgICAgICAgeyB7MTM4LDExNX0sIHsxMzYsMTE2fSwgezE2NiwgODB9LCB7MjM4LCAgMH0sIHsxOTUsICAwfSwgezI2MSwgIDB9IH0sCisgICAgICAgIHsgezIyNSwgMzN9LCB7MjA1LCA0Mn0sIHsxNTksIDYxfSwgeyA3OSwgOTZ9LCB7IDkyLCA2Nn0sIHsgMjgsMTk1fSB9IH0sCisgICAgfSwgeworICAgICAgeyB7IHsyMDAsIDM3fSwgezE5NywgMTh9LCB7MTU5LCAxM30sIHsxNDMsICA3fSwgezEwMiwgIDV9LCB7MTIzLDEyNn0gfSwKKyAgICAgICAgeyB7MTk3LCAgM30sIHsyMjAsIC05fSwgezIxMCwtMTJ9LCB7MTg3LCAtNn0sIHsxNTEsIC0yfSwgezE3NCwgODB9IH0sCisgICAgICAgIHsgezIwMCwgNTN9LCB7MTg3LCA0N30sIHsxNTksIDQwfSwgezExOCwgMzh9LCB7MTAwLCAxOH0sIHsxNDEsMTExfSB9LAorICAgICAgICB7IHsxNzksIDc4fSwgezE2NiwgODZ9LCB7MTk3LCA1MH0sIHsyMDcsIDI3fSwgezE4NywgIDB9LCB7MTE1LDEzOX0gfSwKKyAgICAgICAgeyB7MjE4LCAzNH0sIHsyMjAsIDI5fSwgezE3NCwgNDZ9LCB7MTI4LCA2MX0sIHsgNTQsIDg5fSwgezE4NywgNjV9IH0gfSwKKyAgICAgIHsgeyB7MjM4LCAxNH0sIHsxOTcsIDE4fSwgezEyNSwgMjZ9LCB7IDkwLCAyNX0sIHsgODIsIDEzfSwgezE2MSwgODZ9IH0sCisgICAgICAgIHsgezE4OSwgIDF9LCB7MjA1LCAtMn0sIHsxNTYsIC00fSwgezE0MywgLTR9LCB7MTQ2LCAtNH0sIHsxNzIsIDcyfSB9LAorICAgICAgICB7IHsyMzAsIDMxfSwgezE5MiwgNDV9LCB7MTAyLCA3Nn0sIHsgMzgsIDg1fSwgeyA1NiwgNDF9LCB7IDY0LDE3M30gfSwKKyAgICAgICAgeyB7MTY2LCA5MX0sIHsxNDEsMTExfSwgezEyOCwxMTZ9LCB7MTE4LDEwOX0sIHsxNzcsICAwfSwgeyAyMywyMjJ9IH0sCisgICAgICAgIHsgezI1MywgMTR9LCB7MjM2LCAyMX0sIHsxNzQsIDQ5fSwgeyAzMywxMTh9LCB7IDQ0LCA5M30sIHsgMjMsMTg3fSB9IH0sCisgICAgICB7IHsgezIxOCwgMjh9LCB7MTc5LCAyOH0sIHsxMTgsIDM1fSwgeyA5NSwgMzB9LCB7IDcyLCAyNH0sIHsxMjgsMTA4fSB9LAorICAgICAgICB7IHsxODcsICAxfSwgezE3NCwgLTF9LCB7MTI1LCAtMX0sIHsxMTAsIC0xfSwgezEwOCwgLTF9LCB7MjAyLCA1Mn0gfSwKKyAgICAgICAgeyB7MTk3LCA1M30sIHsxNDYsIDc1fSwgeyA0NiwxMTh9LCB7IDMzLDEwM30sIHsgNjQsIDUwfSwgezExOCwxMjZ9IH0sCisgICAgICAgIHsgezEzOCwxMTR9LCB7MTI4LDEyMn0sIHsxNjEsIDg2fSwgezI0MywgLTZ9LCB7MTk1LCAgMH0sIHsgMzgsMjEwfSB9LAorICAgICAgICB7IHsyMTUsIDM5fSwgezE3OSwgNTh9LCB7IDk3LDEwMX0sIHsgOTUsIDg1fSwgeyA4NywgNzB9LCB7IDY5LDE1Mn0gfSB9LAorICAgIH0sIHsKKyAgICAgIHsgeyB7MjM2LCAyNH0sIHsyMDUsIDE4fSwgezE3MiwgMTJ9LCB7MTU0LCAgNn0sIHsxMjUsICAxfSwgezE2OSwgNzV9IH0sCisgICAgICAgIHsgezE4NywgIDR9LCB7MjMwLCAtMn0sIHsyMjgsIC00fSwgezIzNiwgLTR9LCB7MjQxLCAtMn0sIHsxOTIsIDY2fSB9LAorICAgICAgICB7IHsyMDAsIDQ2fSwgezE4NywgNDJ9LCB7MTU5LCAzNH0sIHsxMzYsIDI1fSwgezEwNSwgMTB9LCB7MTc5LCA2Mn0gfSwKKyAgICAgICAgeyB7MjA3LCA1NX0sIHsxOTIsIDYzfSwgezE5MiwgNTR9LCB7MTk1LCAzNn0sIHsxNzcsICAxfSwgezE0MywgOTh9IH0sCisgICAgICAgIHsgezIyNSwgMjd9LCB7MjA3LCAzNH0sIHsyMDAsIDMwfSwgezEzMSwgNTd9LCB7IDk3LCA2MH0sIHsxOTcsIDQ1fSB9IH0sCisgICAgICB7IHsgezI3MSwgIDh9LCB7MjE4LCAxM30sIHsxMzMsIDE5fSwgeyA5MCwgMTl9LCB7IDcyLCAgN30sIHsxODIsIDUxfSB9LAorICAgICAgICB7IHsxNzksICAxfSwgezIyNSwgLTF9LCB7MTU0LCAtMn0sIHsxMTAsIC0xfSwgeyA5MiwgIDB9LCB7MTk1LCA0MX0gfSwKKyAgICAgICAgeyB7MjQxLCAyNn0sIHsxODksIDQwfSwgeyA4MiwgNjR9LCB7IDMzLCA2MH0sIHsgNjcsIDE3fSwgezEyMCwgOTR9IH0sCisgICAgICAgIHsgezE5MiwgNjh9LCB7MTUxLCA5NH0sIHsxNDYsIDkwfSwgezE0MywgNzJ9LCB7MTYxLCAgMH0sIHsxMTMsMTI4fSB9LAorICAgICAgICB7IHsyNTYsIDEyfSwgezIxOCwgMjl9LCB7MTY2LCA0OH0sIHsgNDQsIDk5fSwgeyAzMSwgODd9LCB7MTQ4LCA3OH0gfSB9LAorICAgICAgeyB7IHsyMzgsIDIwfSwgezE4NCwgMjJ9LCB7MTEzLCAyN30sIHsgOTAsIDIyfSwgeyA3NCwgIDl9LCB7MTkyLCAzN30gfSwKKyAgICAgICAgeyB7MTg0LCAgMH0sIHsyMTUsIC0xfSwgezE0MSwgLTF9LCB7IDk3LCAgMH0sIHsgNDksICAwfSwgezI2NCwgMTN9IH0sCisgICAgICAgIHsgezE4MiwgNTF9LCB7MTM4LCA2MX0sIHsgOTUsIDYzfSwgeyA1NCwgNTl9LCB7IDY0LCAyNX0sIHsyMDAsIDQ1fSB9LAorICAgICAgICB7IHsxNzksIDc1fSwgezE1NiwgODd9LCB7MTc0LCA2NX0sIHsxNzcsIDQ0fSwgezE3NCwgIDB9LCB7MTY0LCA4NX0gfSwKKyAgICAgICAgeyB7MTk1LCA0NX0sIHsxNDgsIDY1fSwgezEwNSwgNzl9LCB7IDk1LCA3Mn0sIHsgODcsIDYwfSwgezE2OSwgNjN9IH0gfSwKKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDVfY29vcmRfZGl2W10gPSB7IDIsIDIsIDIsIDIsIDQsIDQgfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVlA1REFUQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92cDYuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5N2VmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDYuYwpAQCAtMCwwICsxLDcwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWUDYgY29tcGF0aWJsZSB2aWRlbyBkZWNvZGVyCisgKgorICogVGhlIFZQNkYgZGVjb2RlciBhY2NlcHRzIGFuIG9wdGlvbmFsIDEgYnl0ZSBleHRyYWRhdGEuIEl0IGlzIGNvbXBvc2VkIG9mOgorICogIC0gdXBwZXIgNCBiaXRzOiBkaWZmZXJlbmNlIGJldHdlZW4gZW5jb2RlZCB3aWR0aCBhbmQgdmlzaWJsZSB3aWR0aAorICogIC0gbG93ZXIgNCBiaXRzOiBkaWZmZXJlbmNlIGJldHdlZW4gZW5jb2RlZCBoZWlnaHQgYW5kIHZpc2libGUgaGVpZ2h0CisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaHVmZm1hbi5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJ2cDU2LmgiCisjaW5jbHVkZSAidnA1NmRhdGEuaCIKKyNpbmNsdWRlICJ2cDZkYXRhLmgiCisKKyNkZWZpbmUgVlA2X01BWF9IVUZGX1NJWkUgMTIKKworc3RhdGljIHZvaWQgdnA2X3BhcnNlX2NvZWZmKFZQNTZDb250ZXh0ICpzKTsKK3N0YXRpYyB2b2lkIHZwNl9wYXJzZV9jb2VmZl9odWZmbWFuKFZQNTZDb250ZXh0ICpzKTsKKworc3RhdGljIGludCB2cDZfcGFyc2VfaGVhZGVyKFZQNTZDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBWUDU2UmFuZ2VDb2RlciAqYyA9ICZzLT5jOworICAgIGludCBwYXJzZV9maWx0ZXJfaW5mbyA9IDA7CisgICAgaW50IGNvZWZmX29mZnNldCA9IDA7CisgICAgaW50IHZydF9zaGlmdCA9IDA7CisgICAgaW50IHN1Yl92ZXJzaW9uOworICAgIGludCByb3dzLCBjb2xzOworICAgIGludCByZXMgPSAwOworICAgIGludCBzZXBhcmF0ZWRfY29lZmYgPSBidWZbMF0gJiAxOworCisgICAgcy0+ZnJhbWVzW1ZQNTZfRlJBTUVfQ1VSUkVOVF0tPmtleV9mcmFtZSA9ICEoYnVmWzBdICYgMHg4MCk7CisgICAgZmZfdnA1Nl9pbml0X2RlcXVhbnQocywgKGJ1ZlswXSA+PiAxKSAmIDB4M0YpOworCisgICAgaWYgKHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdLT5rZXlfZnJhbWUpIHsKKyAgICAgICAgc3ViX3ZlcnNpb24gPSBidWZbMV0gPj4gMzsKKyAgICAgICAgaWYgKHN1Yl92ZXJzaW9uID4gOCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBzLT5maWx0ZXJfaGVhZGVyID0gYnVmWzFdICYgMHgwNjsKKyAgICAgICAgaWYgKGJ1ZlsxXSAmIDEpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiSW50ZXJsYWNpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VwYXJhdGVkX2NvZWZmIHx8ICFzLT5maWx0ZXJfaGVhZGVyKSB7CisgICAgICAgICAgICBjb2VmZl9vZmZzZXQgPSBBVl9SQjE2KGJ1ZisyKSAtIDI7CisgICAgICAgICAgICBidWYgKz0gMjsKKyAgICAgICAgICAgIGJ1Zl9zaXplIC09IDI7CisgICAgICAgIH0KKworICAgICAgICByb3dzID0gYnVmWzJdOyAgLyogbnVtYmVyIG9mIHN0b3JlZCBtYWNyb2Jsb2NrIHJvd3MgKi8KKyAgICAgICAgY29scyA9IGJ1ZlszXTsgIC8qIG51bWJlciBvZiBzdG9yZWQgbWFjcm9ibG9jayBjb2xzICovCisgICAgICAgIC8qIGJ1Zls0XSBpcyBudW1iZXIgb2YgZGlzcGxheWVkIG1hY3JvYmxvY2sgcm93cyAqLworICAgICAgICAvKiBidWZbNV0gaXMgbnVtYmVyIG9mIGRpc3BsYXllZCBtYWNyb2Jsb2NrIGNvbHMgKi8KKyAgICAgICAgaWYgKCFyb3dzIHx8ICFjb2xzKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2l6ZSAlZHglZFxuIiwgY29scyA8PCA0LCByb3dzIDw8IDQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXMtPm1hY3JvYmxvY2tzIHx8IC8qIGZpcnN0IGZyYW1lICovCisgICAgICAgICAgICAxNipjb2xzICE9IHMtPmF2Y3R4LT5jb2RlZF93aWR0aCB8fAorICAgICAgICAgICAgMTYqcm93cyAhPSBzLT5hdmN0eC0+Y29kZWRfaGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmV4dHJhZGF0YV9zaXplID09IDAgJiYKKyAgICAgICAgICAgICAgICBGRkFMSUdOKHMtPmF2Y3R4LT53aWR0aCwgIDE2KSA9PSAxNiAqIGNvbHMgJiYKKyAgICAgICAgICAgICAgICBGRkFMSUdOKHMtPmF2Y3R4LT5oZWlnaHQsIDE2KSA9PSAxNiAqIHJvd3MpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhpcyBpcyBwcm9wZXJseSBzaWduYWxsZWQgY29udGFpbmVyIGNyb3BwaW5nLAorICAgICAgICAgICAgICAgIC8vIGluIGFuIEY0ViBmaWxlLiBKdXN0IHNldCB0aGUgY29kZWRfd2lkdGgvaGVpZ2h0LCBkb24ndAorICAgICAgICAgICAgICAgIC8vIHRvdWNoIHRoZSBjcm9wcGVkIG9uZXMuCisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmNvZGVkX3dpZHRoICA9IDE2ICogY29sczsKKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+Y29kZWRfaGVpZ2h0ID0gMTYgKiByb3dzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMocy0+YXZjdHgsIDE2ICogY29scywgMTYgKiByb3dzKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+ZXh0cmFkYXRhX3NpemUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+d2lkdGggIC09IHMtPmF2Y3R4LT5leHRyYWRhdGFbMF0gPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmhlaWdodCAtPSBzLT5hdmN0eC0+ZXh0cmFkYXRhWzBdICYgMHgwRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBWUDU2X1NJWkVfQ0hBTkdFOworICAgICAgICB9CisKKyAgICAgICAgZmZfdnA1Nl9pbml0X3JhbmdlX2RlY29kZXIoYywgYnVmKzYsIGJ1Zl9zaXplLTYpOworICAgICAgICB2cDU2X3JhY19nZXRzKGMsIDIpOworCisgICAgICAgIHBhcnNlX2ZpbHRlcl9pbmZvID0gcy0+ZmlsdGVyX2hlYWRlcjsKKyAgICAgICAgaWYgKHN1Yl92ZXJzaW9uIDwgOCkKKyAgICAgICAgICAgIHZydF9zaGlmdCA9IDU7CisgICAgICAgIHMtPnN1Yl92ZXJzaW9uID0gc3ViX3ZlcnNpb247CisgICAgICAgIHMtPmdvbGRlbl9mcmFtZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFzLT5zdWJfdmVyc2lvbiB8fCAhcy0+YXZjdHgtPmNvZGVkX3dpZHRoIHx8ICFzLT5hdmN0eC0+Y29kZWRfaGVpZ2h0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKHNlcGFyYXRlZF9jb2VmZiB8fCAhcy0+ZmlsdGVyX2hlYWRlcikgeworICAgICAgICAgICAgY29lZmZfb2Zmc2V0ID0gQVZfUkIxNihidWYrMSkgLSAyOworICAgICAgICAgICAgYnVmICs9IDI7CisgICAgICAgICAgICBidWZfc2l6ZSAtPSAyOworICAgICAgICB9CisgICAgICAgIGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKGMsIGJ1ZisxLCBidWZfc2l6ZS0xKTsKKworICAgICAgICBzLT5nb2xkZW5fZnJhbWUgPSB2cDU2X3JhY19nZXQoYyk7CisgICAgICAgIGlmIChzLT5maWx0ZXJfaGVhZGVyKSB7CisgICAgICAgICAgICBzLT5kZWJsb2NrX2ZpbHRlcmluZyA9IHZwNTZfcmFjX2dldChjKTsKKyAgICAgICAgICAgIGlmIChzLT5kZWJsb2NrX2ZpbHRlcmluZykKKyAgICAgICAgICAgICAgICB2cDU2X3JhY19nZXQoYyk7CisgICAgICAgICAgICBpZiAocy0+c3ViX3ZlcnNpb24gPiA3KQorICAgICAgICAgICAgICAgIHBhcnNlX2ZpbHRlcl9pbmZvID0gdnA1Nl9yYWNfZ2V0KGMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBhcnNlX2ZpbHRlcl9pbmZvKSB7CisgICAgICAgIGlmICh2cDU2X3JhY19nZXQoYykpIHsKKyAgICAgICAgICAgIHMtPmZpbHRlcl9tb2RlID0gMjsKKyAgICAgICAgICAgIHMtPnNhbXBsZV92YXJpYW5jZV90aHJlc2hvbGQgPSB2cDU2X3JhY19nZXRzKGMsIDUpIDw8IHZydF9zaGlmdDsKKyAgICAgICAgICAgIHMtPm1heF92ZWN0b3JfbGVuZ3RoID0gMiA8PCB2cDU2X3JhY19nZXRzKGMsIDMpOworICAgICAgICB9IGVsc2UgaWYgKHZwNTZfcmFjX2dldChjKSkgeworICAgICAgICAgICAgcy0+ZmlsdGVyX21vZGUgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+ZmlsdGVyX21vZGUgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5zdWJfdmVyc2lvbiA+IDcpCisgICAgICAgICAgICBzLT5maWx0ZXJfc2VsZWN0aW9uID0gdnA1Nl9yYWNfZ2V0cyhjLCA0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+ZmlsdGVyX3NlbGVjdGlvbiA9IDE2OworICAgIH0KKworICAgIHMtPnVzZV9odWZmbWFuID0gdnA1Nl9yYWNfZ2V0KGMpOworCisgICAgcy0+cGFyc2VfY29lZmYgPSB2cDZfcGFyc2VfY29lZmY7CisgICAgaWYgKGNvZWZmX29mZnNldCkgeworICAgICAgICBidWYgICAgICArPSBjb2VmZl9vZmZzZXQ7CisgICAgICAgIGJ1Zl9zaXplIC09IGNvZWZmX29mZnNldDsKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgMCkgeworICAgICAgICAgICAgaWYgKHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdLT5rZXlfZnJhbWUpCisgICAgICAgICAgICAgICAgZmZfc2V0X2RpbWVuc2lvbnMocy0+YXZjdHgsIDAsIDApOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnVzZV9odWZmbWFuKSB7CisgICAgICAgICAgICBzLT5wYXJzZV9jb2VmZiA9IHZwNl9wYXJzZV9jb2VmZl9odWZmbWFuOworICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1ZiwgYnVmX3NpemU8PDMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmZfdnA1Nl9pbml0X3JhbmdlX2RlY29kZXIoJnMtPmNjLCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIHMtPmNjcCA9ICZzLT5jYzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmNjcCA9ICZzLT5jOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHZwNl9jb2VmZl9vcmRlcl90YWJsZV9pbml0KFZQNTZDb250ZXh0ICpzKQoreworICAgIGludCBpLCBwb3MsIGlkeCA9IDE7CisKKyAgICBzLT5tb2RlbHAtPmNvZWZmX2luZGV4X3RvX3Bvc1swXSA9IDA7CisgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICAgICAgZm9yIChwb3M9MTsgcG9zPDY0OyBwb3MrKykKKyAgICAgICAgICAgIGlmIChzLT5tb2RlbHAtPmNvZWZmX3Jlb3JkZXJbcG9zXSA9PSBpKQorICAgICAgICAgICAgICAgIHMtPm1vZGVscC0+Y29lZmZfaW5kZXhfdG9fcG9zW2lkeCsrXSA9IHBvczsKK30KKworc3RhdGljIHZvaWQgdnA2X2RlZmF1bHRfbW9kZWxzX2luaXQoVlA1NkNvbnRleHQgKnMpCit7CisgICAgVlA1Nk1vZGVsICptb2RlbCA9IHMtPm1vZGVscDsKKworICAgIG1vZGVsLT52ZWN0b3JfZGN0WzBdID0gMHhBMjsKKyAgICBtb2RlbC0+dmVjdG9yX2RjdFsxXSA9IDB4QTQ7CisgICAgbW9kZWwtPnZlY3Rvcl9zaWdbMF0gPSAweDgwOworICAgIG1vZGVsLT52ZWN0b3Jfc2lnWzFdID0gMHg4MDsKKworICAgIG1lbWNweShtb2RlbC0+bWJfdHlwZXNfc3RhdHMsIGZmX3ZwNTZfZGVmX21iX3R5cGVzX3N0YXRzLCBzaXplb2YobW9kZWwtPm1iX3R5cGVzX3N0YXRzKSk7CisgICAgbWVtY3B5KG1vZGVsLT52ZWN0b3JfZmR2LCB2cDZfZGVmX2Zkdl92ZWN0b3JfbW9kZWwsIHNpemVvZihtb2RlbC0+dmVjdG9yX2ZkdikpOworICAgIG1lbWNweShtb2RlbC0+dmVjdG9yX3BkdiwgdnA2X2RlZl9wZHZfdmVjdG9yX21vZGVsLCBzaXplb2YobW9kZWwtPnZlY3Rvcl9wZHYpKTsKKyAgICBtZW1jcHkobW9kZWwtPmNvZWZmX3J1bnYsIHZwNl9kZWZfcnVudl9jb2VmZl9tb2RlbCwgc2l6ZW9mKG1vZGVsLT5jb2VmZl9ydW52KSk7CisgICAgbWVtY3B5KG1vZGVsLT5jb2VmZl9yZW9yZGVyLCB2cDZfZGVmX2NvZWZmX3Jlb3JkZXIsIHNpemVvZihtb2RlbC0+Y29lZmZfcmVvcmRlcikpOworCisgICAgdnA2X2NvZWZmX29yZGVyX3RhYmxlX2luaXQocyk7Cit9CisKK3N0YXRpYyB2b2lkIHZwNl9wYXJzZV92ZWN0b3JfbW9kZWxzKFZQNTZDb250ZXh0ICpzKQoreworICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CisgICAgVlA1Nk1vZGVsICptb2RlbCA9IHMtPm1vZGVscDsKKyAgICBpbnQgY29tcCwgbm9kZTsKKworICAgIGZvciAoY29tcD0wOyBjb21wPDI7IGNvbXArKykgeworICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB2cDZfc2lnX2RjdF9wY3RbY29tcF1bMF0pKQorICAgICAgICAgICAgbW9kZWwtPnZlY3Rvcl9kY3RbY29tcF0gPSB2cDU2X3JhY19nZXRzX25uKGMsIDcpOworICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB2cDZfc2lnX2RjdF9wY3RbY29tcF1bMV0pKQorICAgICAgICAgICAgbW9kZWwtPnZlY3Rvcl9zaWdbY29tcF0gPSB2cDU2X3JhY19nZXRzX25uKGMsIDcpOworICAgIH0KKworICAgIGZvciAoY29tcD0wOyBjb21wPDI7IGNvbXArKykKKyAgICAgICAgZm9yIChub2RlPTA7IG5vZGU8Nzsgbm9kZSsrKQorICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdnA2X3Bkdl9wY3RbY29tcF1bbm9kZV0pKQorICAgICAgICAgICAgICAgIG1vZGVsLT52ZWN0b3JfcGR2W2NvbXBdW25vZGVdID0gdnA1Nl9yYWNfZ2V0c19ubihjLCA3KTsKKworICAgIGZvciAoY29tcD0wOyBjb21wPDI7IGNvbXArKykKKyAgICAgICAgZm9yIChub2RlPTA7IG5vZGU8ODsgbm9kZSsrKQorICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdnA2X2Zkdl9wY3RbY29tcF1bbm9kZV0pKQorICAgICAgICAgICAgICAgIG1vZGVsLT52ZWN0b3JfZmR2W2NvbXBdW25vZGVdID0gdnA1Nl9yYWNfZ2V0c19ubihjLCA3KTsKK30KKworLyogbm9kZXMgbXVzdCBhc2NlbmQgYnkgY291bnQsIGJ1dCB3aXRoIGRlc2NlbmRpbmcgc3ltYm9sIG9yZGVyICovCitzdGF0aWMgaW50IHZwNl9odWZmX2NtcChjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpCit7CisgICAgY29uc3QgTm9kZSAqYSA9IHZhLCAqYiA9IHZiOworICAgIHJldHVybiAoYS0+Y291bnQgLSBiLT5jb3VudCkqMTYgKyAoYi0+c3ltIC0gYS0+c3ltKTsKK30KKworc3RhdGljIGludCB2cDZfYnVpbGRfaHVmZl90cmVlKFZQNTZDb250ZXh0ICpzLCB1aW50OF90IGNvZWZmX21vZGVsW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFwLCB1bnNpZ25lZCBzaXplLCBWTEMgKnZsYykKK3sKKyAgICBOb2RlIG5vZGVzWzIqVlA2X01BWF9IVUZGX1NJWkVdLCAqdG1wID0gJm5vZGVzW3NpemVdOworICAgIGludCBhLCBiLCBpOworCisgICAgLyogZmlyc3QgY29tcHV0ZSBwcm9iYWJpbGl0aWVzIGZyb20gbW9kZWwgKi8KKyAgICB0bXBbMF0uY291bnQgPSAyNTY7CisgICAgZm9yIChpPTA7IGk8c2l6ZS0xOyBpKyspIHsKKyAgICAgICAgYSA9IHRtcFtpXS5jb3VudCAqICAgICAgICBjb2VmZl9tb2RlbFtpXSAgPj4gODsKKyAgICAgICAgYiA9IHRtcFtpXS5jb3VudCAqICgyNTUgLSBjb2VmZl9tb2RlbFtpXSkgPj4gODsKKyAgICAgICAgbm9kZXNbbWFwWzIqaSAgXV0uY291bnQgPSBhICsgIWE7CisgICAgICAgIG5vZGVzW21hcFsyKmkrMV1dLmNvdW50ID0gYiArICFiOworICAgIH0KKworICAgIGZmX2ZyZWVfdmxjKHZsYyk7CisgICAgLyogdGhlbiBidWlsZCB0aGUgaHVmZm1hbiB0cmVlIGFjY29yZGluZyB0byBwcm9iYWJpbGl0aWVzICovCisgICAgcmV0dXJuIGZmX2h1ZmZfYnVpbGRfdHJlZShzLT5hdmN0eCwgdmxjLCBzaXplLCBGRl9IVUZGTUFOX0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlcywgdnA2X2h1ZmZfY21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSFVGRk1BTl9GTEFHX0hOT0RFX0ZJUlNUKTsKK30KKworc3RhdGljIGludCB2cDZfcGFyc2VfY29lZmZfbW9kZWxzKFZQNTZDb250ZXh0ICpzKQoreworICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CisgICAgVlA1Nk1vZGVsICptb2RlbCA9IHMtPm1vZGVscDsKKyAgICBpbnQgZGVmX3Byb2JbMTFdOworICAgIGludCBub2RlLCBjZywgY3R4LCBwb3M7CisgICAgaW50IGN0OyAgICAvKiBjb2RlIHR5cGUgKi8KKyAgICBpbnQgcHQ7ICAgIC8qIHBsYW5lIHR5cGUgKDAgZm9yIFksIDEgZm9yIFUgb3IgVikgKi8KKworICAgIG1lbXNldChkZWZfcHJvYiwgMHg4MCwgc2l6ZW9mKGRlZl9wcm9iKSk7CisKKyAgICBmb3IgKHB0PTA7IHB0PDI7IHB0KyspCisgICAgICAgIGZvciAobm9kZT0wOyBub2RlPDExOyBub2RlKyspCisgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB2cDZfZGNjdl9wY3RbcHRdW25vZGVdKSkgeworICAgICAgICAgICAgICAgIGRlZl9wcm9iW25vZGVdID0gdnA1Nl9yYWNfZ2V0c19ubihjLCA3KTsKKyAgICAgICAgICAgICAgICBtb2RlbC0+Y29lZmZfZGNjdltwdF1bbm9kZV0gPSBkZWZfcHJvYltub2RlXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+ZnJhbWVzW1ZQNTZfRlJBTUVfQ1VSUkVOVF0tPmtleV9mcmFtZSkgeworICAgICAgICAgICAgICAgIG1vZGVsLT5jb2VmZl9kY2N2W3B0XVtub2RlXSA9IGRlZl9wcm9iW25vZGVdOworICAgICAgICAgICAgfQorCisgICAgaWYgKHZwNTZfcmFjX2dldChjKSkgeworICAgICAgICBmb3IgKHBvcz0xOyBwb3M8NjQ7IHBvcysrKQorICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdnA2X2NvZWZmX3Jlb3JkZXJfcGN0W3Bvc10pKQorICAgICAgICAgICAgICAgIG1vZGVsLT5jb2VmZl9yZW9yZGVyW3Bvc10gPSB2cDU2X3JhY19nZXRzKGMsIDQpOworICAgICAgICB2cDZfY29lZmZfb3JkZXJfdGFibGVfaW5pdChzKTsKKyAgICB9CisKKyAgICBmb3IgKGNnPTA7IGNnPDI7IGNnKyspCisgICAgICAgIGZvciAobm9kZT0wOyBub2RlPDE0OyBub2RlKyspCisgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB2cDZfcnVudl9wY3RbY2ddW25vZGVdKSkKKyAgICAgICAgICAgICAgICBtb2RlbC0+Y29lZmZfcnVudltjZ11bbm9kZV0gPSB2cDU2X3JhY19nZXRzX25uKGMsIDcpOworCisgICAgZm9yIChjdD0wOyBjdDwzOyBjdCsrKQorICAgICAgICBmb3IgKHB0PTA7IHB0PDI7IHB0KyspCisgICAgICAgICAgICBmb3IgKGNnPTA7IGNnPDY7IGNnKyspCisgICAgICAgICAgICAgICAgZm9yIChub2RlPTA7IG5vZGU8MTE7IG5vZGUrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdnA2X3JhY3RfcGN0W2N0XVtwdF1bY2ddW25vZGVdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmX3Byb2Jbbm9kZV0gPSB2cDU2X3JhY19nZXRzX25uKGMsIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwtPmNvZWZmX3JhY3RbcHRdW2N0XVtjZ11bbm9kZV0gPSBkZWZfcHJvYltub2RlXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5mcmFtZXNbVlA1Nl9GUkFNRV9DVVJSRU5UXS0+a2V5X2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC0+Y29lZmZfcmFjdFtwdF1bY3RdW2NnXVtub2RlXSA9IGRlZl9wcm9iW25vZGVdOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICBpZiAocy0+dXNlX2h1ZmZtYW4pIHsKKyAgICAgICAgZm9yIChwdD0wOyBwdDwyOyBwdCsrKSB7CisgICAgICAgICAgICBpZiAodnA2X2J1aWxkX2h1ZmZfdHJlZShzLCBtb2RlbC0+Y29lZmZfZGNjdltwdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDZfaHVmZl9jb2VmZl9tYXAsIDEyLCAmcy0+ZGNjdl92bGNbcHRdKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAodnA2X2J1aWxkX2h1ZmZfdHJlZShzLCBtb2RlbC0+Y29lZmZfcnVudltwdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDZfaHVmZl9ydW5fbWFwLCA5LCAmcy0+cnVudl92bGNbcHRdKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBmb3IgKGN0PTA7IGN0PDM7IGN0KyspCisgICAgICAgICAgICAgICAgZm9yIChjZyA9IDA7IGNnIDwgNjsgY2crKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwNl9idWlsZF9odWZmX3RyZWUocywgbW9kZWwtPmNvZWZmX3JhY3RbcHRdW2N0XVtjZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwNl9odWZmX2NvZWZmX21hcCwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5yYWN0X3ZsY1twdF1bY3RdW2NnXSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KHMtPm5iX251bGwsIDAsIHNpemVvZihzLT5uYl9udWxsKSk7CisgICAgfSBlbHNlIHsKKyAgICAvKiBjb2VmZl9kY2N0IGlzIGEgbGluZWFyIGNvbWJpbmF0aW9uIG9mIGNvZWZmX2RjY3YgKi8KKyAgICBmb3IgKHB0PTA7IHB0PDI7IHB0KyspCisgICAgICAgIGZvciAoY3R4PTA7IGN0eDwzOyBjdHgrKykKKyAgICAgICAgICAgIGZvciAobm9kZT0wOyBub2RlPDU7IG5vZGUrKykKKyAgICAgICAgICAgICAgICBtb2RlbC0+Y29lZmZfZGNjdFtwdF1bY3R4XVtub2RlXSA9IGF2X2NsaXAoKChtb2RlbC0+Y29lZmZfZGNjdltwdF1bbm9kZV0gKiB2cDZfZGNjdl9sY1tjdHhdW25vZGVdWzBdICsgMTI4KSA+PiA4KSArIHZwNl9kY2N2X2xjW2N0eF1bbm9kZV1bMV0sIDEsIDI1NSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2cDZfcGFyc2VfdmVjdG9yX2FkanVzdG1lbnQoVlA1NkNvbnRleHQgKnMsIFZQNTZtdiAqdmVjdCkKK3sKKyAgICBWUDU2UmFuZ2VDb2RlciAqYyA9ICZzLT5jOworICAgIFZQNTZNb2RlbCAqbW9kZWwgPSBzLT5tb2RlbHA7CisgICAgaW50IGNvbXA7CisKKyAgICAqdmVjdCA9IChWUDU2bXYpIHswLDB9OworICAgIGlmIChzLT52ZWN0b3JfY2FuZGlkYXRlX3BvcyA8IDIpCisgICAgICAgICp2ZWN0ID0gcy0+dmVjdG9yX2NhbmRpZGF0ZVswXTsKKworICAgIGZvciAoY29tcD0wOyBjb21wPDI7IGNvbXArKykgeworICAgICAgICBpbnQgaSwgZGVsdGEgPSAwOworCisgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIG1vZGVsLT52ZWN0b3JfZGN0W2NvbXBdKSkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcHJvYl9vcmRlcltdID0gezAsIDEsIDIsIDcsIDYsIDUsIDR9OworICAgICAgICAgICAgZm9yIChpPTA7IGk8c2l6ZW9mKHByb2Jfb3JkZXIpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaiA9IHByb2Jfb3JkZXJbaV07CisgICAgICAgICAgICAgICAgZGVsdGEgfD0gdnA1Nl9yYWNfZ2V0X3Byb2IoYywgbW9kZWwtPnZlY3Rvcl9mZHZbY29tcF1bal0pPDxqOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlbHRhICYgMHhGMCkKKyAgICAgICAgICAgICAgICBkZWx0YSB8PSB2cDU2X3JhY19nZXRfcHJvYihjLCBtb2RlbC0+dmVjdG9yX2Zkdltjb21wXVszXSk8PDM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGVsdGEgfD0gODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbHRhID0gdnA1Nl9yYWNfZ2V0X3RyZWUoYywgZmZfdnA1Nl9wdmFfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwtPnZlY3Rvcl9wZHZbY29tcF0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlbHRhICYmIHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgbW9kZWwtPnZlY3Rvcl9zaWdbY29tcF0pKQorICAgICAgICAgICAgZGVsdGEgPSAtZGVsdGE7CisKKyAgICAgICAgaWYgKCFjb21wKQorICAgICAgICAgICAgdmVjdC0+eCArPSBkZWx0YTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmVjdC0+eSArPSBkZWx0YTsKKyAgICB9Cit9CisKKy8qKgorICogUmVhZCBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmxvY2tzIHdpdGggbnVsbCBEQyBvciBBQy4KKyAqIFRoaXMgdmFsdWUgaXMgPCA3NC4KKyAqLworc3RhdGljIHVuc2lnbmVkIHZwNl9nZXRfbmJfbnVsbChWUDU2Q29udGV4dCAqcykKK3sKKyAgICB1bnNpZ25lZCB2YWwgPSBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgIGlmICh2YWwgPT0gMikKKyAgICAgICAgdmFsICs9IGdldF9iaXRzKCZzLT5nYiwgMik7CisgICAgZWxzZSBpZiAodmFsID09IDMpIHsKKyAgICAgICAgdmFsID0gZ2V0X2JpdHMxKCZzLT5nYikgPDwgMjsKKyAgICAgICAgdmFsID0gNit2YWwgKyBnZXRfYml0cygmcy0+Z2IsIDIrdmFsKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgdnA2X3BhcnNlX2NvZWZmX2h1ZmZtYW4oVlA1NkNvbnRleHQgKnMpCit7CisgICAgVlA1Nk1vZGVsICptb2RlbCA9IHMtPm1vZGVscDsKKyAgICB1aW50OF90ICpwZXJtdXRlID0gcy0+aWRjdF9zY2FudGFibGU7CisgICAgVkxDICp2bGNfY29lZmY7CisgICAgaW50IGNvZWZmLCBzaWduLCBjb2VmZl9pZHg7CisgICAgaW50IGIsIGNnLCBpZHg7CisgICAgaW50IHB0ID0gMDsgICAgLyogcGxhbmUgdHlwZSAoMCBmb3IgWSwgMSBmb3IgVSBvciBWKSAqLworCisgICAgZm9yIChiPTA7IGI8NjsgYisrKSB7CisgICAgICAgIGludCBjdCA9IDA7ICAgIC8qIGNvZGUgdHlwZSAqLworICAgICAgICBpZiAoYiA+IDMpIHB0ID0gMTsKKyAgICAgICAgdmxjX2NvZWZmID0gJnMtPmRjY3ZfdmxjW3B0XTsKKworICAgICAgICBmb3IgKGNvZWZmX2lkeCA9IDA7OykgeworICAgICAgICAgICAgaW50IHJ1biA9IDE7CisgICAgICAgICAgICBpZiAoY29lZmZfaWR4PDIgJiYgcy0+bmJfbnVsbFtjb2VmZl9pZHhdW3B0XSkgeworICAgICAgICAgICAgICAgIHMtPm5iX251bGxbY29lZmZfaWR4XVtwdF0tLTsKKyAgICAgICAgICAgICAgICBpZiAoY29lZmZfaWR4KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgY29lZmYgPSBnZXRfdmxjMigmcy0+Z2IsIHZsY19jb2VmZi0+dGFibGUsIEZGX0hVRkZNQU5fQklUUywgMyk7CisgICAgICAgICAgICAgICAgaWYgKGNvZWZmID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZWZmX2lkeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHB0ID0gKGNvZWZmX2lkeCA+PSA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1biArPSBnZXRfdmxjMigmcy0+Z2IsIHMtPnJ1bnZfdmxjW3B0XS50YWJsZSwgRkZfSFVGRk1BTl9CSVRTLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW4gPj0gOSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gKz0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5uYl9udWxsWzBdW3B0XSA9IHZwNl9nZXRfbmJfbnVsbChzKTsKKyAgICAgICAgICAgICAgICAgICAgY3QgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29lZmYgPT0gMTEpIHsgIC8qIGVuZCBvZiBibG9jayAqLworICAgICAgICAgICAgICAgICAgICBpZiAoY29lZmZfaWR4ID09IDEpICAgIC8qIGZpcnN0IEFDIGNvZWZmID8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5iX251bGxbMV1bcHRdID0gdnA2X2dldF9uYl9udWxsKHMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29lZmYyID0gZmZfdnA1Nl9jb2VmZl9iaWFzW2NvZWZmXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZWZmID4gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmMiArPSBnZXRfYml0cygmcy0+Z2IsIGNvZWZmIDw9IDkgPyBjb2VmZiAtIDQgOiAxMSk7CisgICAgICAgICAgICAgICAgICAgIGN0ID0gMSArIChjb2VmZjIgPiAxKTsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICBjb2VmZjIgPSAoY29lZmYyIF4gLXNpZ24pICsgc2lnbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZWZmX2lkeCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmMiAqPSBzLT5kZXF1YW50X2FjOworICAgICAgICAgICAgICAgICAgICBpZHggPSBtb2RlbC0+Y29lZmZfaW5kZXhfdG9fcG9zW2NvZWZmX2lkeF07CisgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX2NvZWZmW2JdW3Blcm11dGVbaWR4XV0gPSBjb2VmZjI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29lZmZfaWR4Kz1ydW47CisgICAgICAgICAgICBpZiAoY29lZmZfaWR4ID49IDY0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2cgPSBGRk1JTih2cDZfY29lZmZfZ3JvdXBzW2NvZWZmX2lkeF0sIDMpOworICAgICAgICAgICAgdmxjX2NvZWZmID0gJnMtPnJhY3RfdmxjW3B0XVtjdF1bY2ddOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2cDZfcGFyc2VfY29lZmYoVlA1NkNvbnRleHQgKnMpCit7CisgICAgVlA1NlJhbmdlQ29kZXIgKmMgPSBzLT5jY3A7CisgICAgVlA1Nk1vZGVsICptb2RlbCA9IHMtPm1vZGVscDsKKyAgICB1aW50OF90ICpwZXJtdXRlID0gcy0+aWRjdF9zY2FudGFibGU7CisgICAgdWludDhfdCAqbW9kZWwxLCAqbW9kZWwyLCAqbW9kZWwzOworICAgIGludCBjb2VmZiwgc2lnbiwgY29lZmZfaWR4OworICAgIGludCBiLCBpLCBjZywgaWR4LCBjdHg7CisgICAgaW50IHB0ID0gMDsgICAgLyogcGxhbmUgdHlwZSAoMCBmb3IgWSwgMSBmb3IgVSBvciBWKSAqLworCisgICAgZm9yIChiPTA7IGI8NjsgYisrKSB7CisgICAgICAgIGludCBjdCA9IDE7ICAgIC8qIGNvZGUgdHlwZSAqLworICAgICAgICBpbnQgcnVuID0gMTsKKworICAgICAgICBpZiAoYiA+IDMpIHB0ID0gMTsKKworICAgICAgICBjdHggPSBzLT5sZWZ0X2Jsb2NrW2ZmX3ZwNTZfYjZ0bzRbYl1dLm5vdF9udWxsX2RjCisgICAgICAgICAgICAgICsgcy0+YWJvdmVfYmxvY2tzW3MtPmFib3ZlX2Jsb2NrX2lkeFtiXV0ubm90X251bGxfZGM7CisgICAgICAgIG1vZGVsMSA9IG1vZGVsLT5jb2VmZl9kY2N2W3B0XTsKKyAgICAgICAgbW9kZWwyID0gbW9kZWwtPmNvZWZmX2RjY3RbcHRdW2N0eF07CisKKyAgICAgICAgY29lZmZfaWR4ID0gMDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaWYgKChjb2VmZl9pZHg+MSAmJiBjdD09MCkgfHwgdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCBtb2RlbDJbMF0pKSB7CisgICAgICAgICAgICAgICAgLyogcGFyc2UgYSBjb2VmZiAqLworICAgICAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIG1vZGVsMlsyXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgbW9kZWwyWzNdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gdnA1Nl9yYWNfZ2V0X3RyZWUoYywgZmZfdnA1Nl9wY190cmVlLCBtb2RlbDEpOworICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgPSBmZl92cDU2X2NvZWZmX2JpYXNbaWR4KzVdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPWZmX3ZwNTZfY29lZmZfYml0X2xlbmd0aFtpZHhdOyBpPj0wOyBpLS0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKz0gdnA1Nl9yYWNfZ2V0X3Byb2IoYywgZmZfdnA1Nl9jb2VmZl9wYXJzZV90YWJsZVtpZHhdW2ldKSA8PCBpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgbW9kZWwyWzRdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZiA9IDMgKyB2cDU2X3JhY19nZXRfcHJvYihjLCBtb2RlbDFbNV0pOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjdCA9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3QgPSAxOworICAgICAgICAgICAgICAgICAgICBjb2VmZiA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpZ24gPSB2cDU2X3JhY19nZXQoYyk7CisgICAgICAgICAgICAgICAgY29lZmYgPSAoY29lZmYgXiAtc2lnbikgKyBzaWduOworICAgICAgICAgICAgICAgIGlmIChjb2VmZl9pZHgpCisgICAgICAgICAgICAgICAgICAgIGNvZWZmICo9IHMtPmRlcXVhbnRfYWM7CisgICAgICAgICAgICAgICAgaWR4ID0gbW9kZWwtPmNvZWZmX2luZGV4X3RvX3Bvc1tjb2VmZl9pZHhdOworICAgICAgICAgICAgICAgIHMtPmJsb2NrX2NvZWZmW2JdW3Blcm11dGVbaWR4XV0gPSBjb2VmZjsKKyAgICAgICAgICAgICAgICBydW4gPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBwYXJzZSBhIHJ1biAqLworICAgICAgICAgICAgICAgIGN0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoY29lZmZfaWR4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgbW9kZWwyWzFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIG1vZGVsMyA9IG1vZGVsLT5jb2VmZl9ydW52W2NvZWZmX2lkeCA+PSA2XTsKKyAgICAgICAgICAgICAgICAgICAgcnVuID0gdnA1Nl9yYWNfZ2V0X3RyZWUoYywgdnA2X3Bjcl90cmVlLCBtb2RlbDMpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bikKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocnVuPTksIGk9MDsgaTw2OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuICs9IHZwNTZfcmFjX2dldF9wcm9iKGMsIG1vZGVsM1tpKzhdKSA8PCBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZWZmX2lkeCArPSBydW47CisgICAgICAgICAgICBpZiAoY29lZmZfaWR4ID49IDY0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2cgPSB2cDZfY29lZmZfZ3JvdXBzW2NvZWZmX2lkeF07CisgICAgICAgICAgICBtb2RlbDEgPSBtb2RlbDIgPSBtb2RlbC0+Y29lZmZfcmFjdFtwdF1bY3RdW2NnXTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmxlZnRfYmxvY2tbZmZfdnA1Nl9iNnRvNFtiXV0ubm90X251bGxfZGMgPQorICAgICAgICBzLT5hYm92ZV9ibG9ja3Nbcy0+YWJvdmVfYmxvY2tfaWR4W2JdXS5ub3RfbnVsbF9kYyA9ICEhcy0+YmxvY2tfY29lZmZbYl1bMF07CisgICAgfQorfQorCitzdGF0aWMgaW50IHZwNl9ibG9ja192YXJpYW5jZSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCit7CisgICAgaW50IHN1bSA9IDAsIHNxdWFyZV9zdW0gPSAwOworICAgIGludCB5LCB4OworCisgICAgZm9yICh5PTA7IHk8ODsgeSs9MikgeworICAgICAgICBmb3IgKHg9MDsgeDw4OyB4Kz0yKSB7CisgICAgICAgICAgICBzdW0gKz0gc3JjW3hdOworICAgICAgICAgICAgc3F1YXJlX3N1bSArPSBzcmNbeF0qc3JjW3hdOworICAgICAgICB9CisgICAgICAgIHNyYyArPSAyKnN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuICgxNipzcXVhcmVfc3VtIC0gc3VtKnN1bSkgPj4gODsKK30KKworc3RhdGljIHZvaWQgdnA2X2ZpbHRlcl9odjQodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEsIGNvbnN0IGludDE2X3QgKndlaWdodHMpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHk9MDsgeTw4OyB5KyspIHsKKyAgICAgICAgZm9yICh4PTA7IHg8ODsgeCsrKSB7CisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3VpbnQ4KCggIHNyY1t4LWRlbHRhICBdICogd2VpZ2h0c1swXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzcmNbeCAgICAgICAgXSAqIHdlaWdodHNbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3JjW3grZGVsdGEgIF0gKiB3ZWlnaHRzWzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNyY1t4KzIqZGVsdGFdICogd2VpZ2h0c1szXSArIDY0KSA+PiA3KTsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdnA2X2ZpbHRlcl9kaWFnMihWUDU2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoX3dlaWdodCwgaW50IHZfd2VpZ2h0KQoreworICAgIHVpbnQ4X3QgKnRtcCA9IHMtPmVkZ2VfZW11X2J1ZmZlcisxNjsKKyAgICBzLT5oMjY0Y2hyb21hLnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdKHRtcCwgc3JjLCBzdHJpZGUsIDksIGhfd2VpZ2h0LCAwKTsKKyAgICBzLT5oMjY0Y2hyb21hLnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdKGRzdCwgdG1wLCBzdHJpZGUsIDgsIDAsIHZfd2VpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgdnA2X2ZpbHRlcihWUDU2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQxLCBpbnQgb2Zmc2V0MiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgVlA1Nm12IG12LCBpbnQgbWFzaywgaW50IHNlbGVjdCwgaW50IGx1bWEpCit7CisgICAgaW50IGZpbHRlcjQgPSAwOworICAgIGludCB4OCA9IG12LnggJiBtYXNrOworICAgIGludCB5OCA9IG12LnkgJiBtYXNrOworCisgICAgaWYgKGx1bWEpIHsKKyAgICAgICAgeDggKj0gMjsKKyAgICAgICAgeTggKj0gMjsKKyAgICAgICAgZmlsdGVyNCA9IHMtPmZpbHRlcl9tb2RlOworICAgICAgICBpZiAoZmlsdGVyNCA9PSAyKSB7CisgICAgICAgICAgICBpZiAocy0+bWF4X3ZlY3Rvcl9sZW5ndGggJiYKKyAgICAgICAgICAgICAgICAoRkZBQlMobXYueCkgPiBzLT5tYXhfdmVjdG9yX2xlbmd0aCB8fAorICAgICAgICAgICAgICAgICBGRkFCUyhtdi55KSA+IHMtPm1heF92ZWN0b3JfbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIGZpbHRlcjQgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5zYW1wbGVfdmFyaWFuY2VfdGhyZXNob2xkCisgICAgICAgICAgICAgICAgICAgICAgICYmICh2cDZfYmxvY2tfdmFyaWFuY2Uoc3JjK29mZnNldDEsIHN0cmlkZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgcy0+c2FtcGxlX3ZhcmlhbmNlX3RocmVzaG9sZCkpIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXI0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoeTggJiYgKG9mZnNldDItb2Zmc2V0MSkqcy0+ZmxpcDwwKSB8fCAoIXk4ICYmIG9mZnNldDEgPiBvZmZzZXQyKSkgeworICAgICAgICBvZmZzZXQxID0gb2Zmc2V0MjsKKyAgICB9CisKKyAgICBpZiAoZmlsdGVyNCkgeworICAgICAgICBpZiAoIXk4KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGxlZnQgb3IgcmlnaHQgY29tYmluZSAqLworICAgICAgICAgICAgdnA2X2ZpbHRlcl9odjQoZHN0LCBzcmMrb2Zmc2V0MSwgc3RyaWRlLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA2X2Jsb2NrX2NvcHlfZmlsdGVyW3NlbGVjdF1beDhdKTsKKyAgICAgICAgfSBlbHNlIGlmICgheDgpIHsgICAgICAgICAgICAgICAvKiBhYm92ZSBvciBiZWxvdyBjb21iaW5lICovCisgICAgICAgICAgICB2cDZfZmlsdGVyX2h2NChkc3QsIHNyYytvZmZzZXQxLCBzdHJpZGUsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwNl9ibG9ja19jb3B5X2ZpbHRlcltzZWxlY3RdW3k4XSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT52cDU2ZHNwLnZwNl9maWx0ZXJfZGlhZzQoZHN0LCBzcmMrb2Zmc2V0MSsoKG12LnhebXYueSk+PjMxKSwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDZfYmxvY2tfY29weV9maWx0ZXJbc2VsZWN0XVt4OF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwNl9ibG9ja19jb3B5X2ZpbHRlcltzZWxlY3RdW3k4XSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXg4IHx8ICF5OCkgeworICAgICAgICAgICAgcy0+aDI2NGNocm9tYS5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlswXShkc3QsIHNyYyArIG9mZnNldDEsIHN0cmlkZSwgOCwgeDgsIHk4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZwNl9maWx0ZXJfZGlhZzIocywgZHN0LCBzcmMrb2Zmc2V0MSArICgobXYueF5tdi55KT4+MzEpLCBzdHJpZGUsIHg4LCB5OCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdnA2X2RlY29kZV9pbml0X2NvbnRleHQoVlA1NkNvbnRleHQgKnMpOworCitzdGF0aWMgYXZfY29sZCBpbnQgdnA2X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWUDU2Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfdnA1Nl9pbml0KGF2Y3R4LCBhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX1ZQNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX1ZQNkEpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICB2cDZfZGVjb2RlX2luaXRfY29udGV4dChzKTsKKworICAgIGlmIChzLT5oYXNfYWxwaGEpIHsKKyAgICAgICAgcy0+YWxwaGFfY29udGV4dCA9IGF2X21hbGxvY3ooc2l6ZW9mKFZQNTZDb250ZXh0KSk7CisgICAgICAgIGZmX3ZwNTZfaW5pdF9jb250ZXh0KGF2Y3R4LCBzLT5hbHBoYV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mbGlwID09IC0xLCBzLT5oYXNfYWxwaGEpOworICAgICAgICB2cDZfZGVjb2RlX2luaXRfY29udGV4dChzLT5hbHBoYV9jb250ZXh0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB2cDZfZGVjb2RlX2luaXRfY29udGV4dChWUDU2Q29udGV4dCAqcykKK3sKKyAgICBzLT5kZWJsb2NrX2ZpbHRlcmluZyA9IDA7CisgICAgcy0+dnA1Nl9jb29yZF9kaXYgPSB2cDZfY29vcmRfZGl2OworICAgIHMtPnBhcnNlX3ZlY3Rvcl9hZGp1c3RtZW50ID0gdnA2X3BhcnNlX3ZlY3Rvcl9hZGp1c3RtZW50OworICAgIHMtPmZpbHRlciA9IHZwNl9maWx0ZXI7CisgICAgcy0+ZGVmYXVsdF9tb2RlbHNfaW5pdCA9IHZwNl9kZWZhdWx0X21vZGVsc19pbml0OworICAgIHMtPnBhcnNlX3ZlY3Rvcl9tb2RlbHMgPSB2cDZfcGFyc2VfdmVjdG9yX21vZGVsczsKKyAgICBzLT5wYXJzZV9jb2VmZl9tb2RlbHMgPSB2cDZfcGFyc2VfY29lZmZfbW9kZWxzOworICAgIHMtPnBhcnNlX2hlYWRlciA9IHZwNl9wYXJzZV9oZWFkZXI7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdnA2X2RlY29kZV9mcmVlX2NvbnRleHQoVlA1NkNvbnRleHQgKnMpOworCitzdGF0aWMgYXZfY29sZCBpbnQgdnA2X2RlY29kZV9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWUDU2Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmZl92cDU2X2ZyZWUoYXZjdHgpOworICAgIHZwNl9kZWNvZGVfZnJlZV9jb250ZXh0KHMpOworCisgICAgaWYgKHMtPmFscGhhX2NvbnRleHQpIHsKKyAgICAgICAgZmZfdnA1Nl9mcmVlX2NvbnRleHQocy0+YWxwaGFfY29udGV4dCk7CisgICAgICAgIHZwNl9kZWNvZGVfZnJlZV9jb250ZXh0KHMtPmFscGhhX2NvbnRleHQpOworICAgICAgICBhdl9mcmVlcCgmcy0+YWxwaGFfY29udGV4dCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdnA2X2RlY29kZV9mcmVlX2NvbnRleHQoVlA1NkNvbnRleHQgKnMpCit7CisgICAgaW50IHB0LCBjdCwgY2c7CisKKyAgICBmb3IgKHB0PTA7IHB0PDI7IHB0KyspIHsKKyAgICAgICAgZmZfZnJlZV92bGMoJnMtPmRjY3ZfdmxjW3B0XSk7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZzLT5ydW52X3ZsY1twdF0pOworICAgICAgICBmb3IgKGN0PTA7IGN0PDM7IGN0KyspCisgICAgICAgICAgICBmb3IgKGNnPTA7IGNnPDY7IGNnKyspCisgICAgICAgICAgICAgICAgZmZfZnJlZV92bGMoJnMtPnJhY3RfdmxjW3B0XVtjdF1bY2ddKTsKKyAgICB9Cit9CisKK0FWQ29kZWMgZmZfdnA2X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZwNiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9uMiBWUDYiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVlA2LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWUDU2Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdnA2X2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHZwNl9kZWNvZGVfZnJlZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBmZl92cDU2X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKKworLyogZmxhc2ggdmVyc2lvbiwgbm90IGZsaXBwZWQgdXBzaWRlLWRvd24gKi8KK0FWQ29kZWMgZmZfdnA2Zl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2cDZmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT24yIFZQNiAoRmxhc2ggdmVyc2lvbikiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVlA2RiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVlA1NkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHZwNl9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB2cDZfZGVjb2RlX2ZyZWUsCisgICAgLmRlY29kZSAgICAgICAgID0gZmZfdnA1Nl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CisKKy8qIGZsYXNoIHZlcnNpb24sIG5vdCBmbGlwcGVkIHVwc2lkZS1kb3duLCB3aXRoIGFscGhhIGNoYW5uZWwgKi8KK0FWQ29kZWMgZmZfdnA2YV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2cDZhIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT24yIFZQNiAoRmxhc2ggdmVyc2lvbiwgd2l0aCBhbHBoYSBjaGFubmVsKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDZBLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWUDU2Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gdnA2X2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHZwNl9kZWNvZGVfZnJlZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBmZl92cDU2X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxIHwgQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnA2ZGF0YS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA2ZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWUxOWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDZkYXRhLmgKQEAgLTAsMCArMSwzMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVlA2IGNvbXBhdGlibGUgdmlkZW8gZGVjb2RlcgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WUDZEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19WUDZEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAidnA1Ni5oIgorCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDZfZGVmX2Zkdl92ZWN0b3JfbW9kZWxbMl1bOF0gPSB7CisgICAgeyAyNDcsIDIxMCwgMTM1LCA2OCwgMTM4LCAyMjAsIDIzOSwgMjQ2IH0sCisgICAgeyAyNDQsIDE4NCwgMjAxLCA0NCwgMTczLCAyMjEsIDIzOSwgMjUzIH0sCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDZfZGVmX3Bkdl92ZWN0b3JfbW9kZWxbMl1bN10gPSB7CisgICAgeyAyMjUsIDE0NiwgMTcyLCAxNDcsIDIxNCwgIDM5LCAxNTYgfSwKKyAgICB7IDIwNCwgMTcwLCAxMTksIDIzNSwgMTQwLCAyMzAsIDIyOCB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA2X2RlZl9jb2VmZl9yZW9yZGVyW10gPSB7CisgICAgIDAsICAwLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNCwKKyAgICAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsCisgICAgIDcsICA3LCAgNywgIDgsICA4LCAgOSwgIDksICA5LAorICAgICA5LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LAorICAgIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwNl9kZWZfcnVudl9jb2VmZl9tb2RlbFsyXVsxNF0gPSB7CisgICAgeyAxOTgsIDE5NywgMTk2LCAxNDYsIDE5OCwgMjA0LCAxNjksIDE0MiwgMTMwLCAxMzYsIDE0OSwgMTQ5LCAxOTEsIDI0OSB9LAorICAgIHsgMTM1LCAyMDEsIDE4MSwgMTU0LCAgOTgsIDExNywgMTMyLCAxMjYsIDE0NiwgMTY5LCAxODQsIDI0MCwgMjQ2LCAyNTQgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwNl9zaWdfZGN0X3BjdFsyXVsyXSA9IHsKKyAgICB7IDIzNywgMjQ2IH0sCisgICAgeyAyMzEsIDI0MyB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA2X3Bkdl9wY3RbMl1bN10gPSB7CisgICAgeyAyNTMsIDI1MywgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQgfSwKKyAgICB7IDI0NSwgMjUzLCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA2X2Zkdl9wY3RbMl1bOF0gPSB7CisgICAgeyAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjUwLCAyNTAsIDI1MiB9LAorICAgIHsgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1MSwgMjUxLCAyNTQgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwNl9kY2N2X3BjdFsyXVsxMV0gPSB7CisgICAgeyAxNDYsIDI1NSwgMTgxLCAyMDcsIDIzMiwgMjQzLCAyMzgsIDI1MSwgMjQ0LCAyNTAsIDI0OSB9LAorICAgIHsgMTc5LCAyNTUsIDIxNCwgMjQwLCAyNTAsIDI1NSwgMjQ0LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwNl9jb2VmZl9yZW9yZGVyX3BjdFtdID0gIHsKKyAgICAyNTUsIDEzMiwgMTMyLCAxNTksIDE1MywgMTUxLCAxNjEsIDE3MCwKKyAgICAxNjQsIDE2MiwgMTM2LCAxMTAsIDEwMywgMTE0LCAxMjksIDExOCwKKyAgICAxMjQsIDEyNSwgMTMyLCAxMzYsIDExNCwgMTEwLCAxNDIsIDEzNSwKKyAgICAxMzQsIDEyMywgMTQzLCAxMjYsIDE1MywgMTgzLCAxNjYsIDE2MSwKKyAgICAxNzEsIDE4MCwgMTc5LCAxNjQsIDIwMywgMjE4LCAyMjUsIDIxNywKKyAgICAyMTUsIDIwNiwgMjAzLCAyMTcsIDIyOSwgMjQxLCAyNDgsIDI0MywKKyAgICAyNTMsIDI1NSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwNl9ydW52X3BjdFsyXVsxNF0gPSB7CisgIHsgMjE5LCAyNDYsIDIzOCwgMjQ5LCAyMzIsIDIzOSwgMjQ5LCAyNTUsIDI0OCwgMjUzLCAyMzksIDI0NCwgMjQxLCAyNDggfSwKKyAgeyAxOTgsIDIzMiwgMjUxLCAyNTMsIDIxOSwgMjQxLCAyNTMsIDI1NSwgMjQ4LCAyNDksIDI0NCwgMjM4LCAyNTEsIDI1NSB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA2X3JhY3RfcGN0WzNdWzJdWzZdWzExXSA9IHsKKyAgeyB7IHsgMjI3LCAyNDYsIDIzMCwgMjQ3LCAyNDQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDIwOSwgMjMxLCAyMzEsIDI0OSwgMjQ5LCAyNTMsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDIyNSwgMjQyLCAyNDEsIDI1MSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI0MSwgMjUzLCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI0OCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSB9LAorICAgIHsgeyAyNDAsIDI1NSwgMjQ4LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjQwLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9IH0gfSwKKyAgeyB7IHsgMjA2LCAyMDMsIDIyNywgMjM5LCAyNDcsIDI1NSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjA3LCAxOTksIDIyMCwgMjM2LCAyNDMsIDI1MiwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjEyLCAyMTksIDIzMCwgMjQzLCAyNDQsIDI1MywgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjM2LCAyMzcsIDI0NywgMjUyLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjQwLCAyNDAsIDI0OCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSB9LAorICAgIHsgeyAyMzAsIDIzMywgMjQ5LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMzgsIDIzOCwgMjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDgsIDI1MSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9IH0gfSwKKyAgeyB7IHsgMjI1LCAyMzksIDIyNywgMjMxLCAyNDQsIDI1MywgMjQzLCAyNTUsIDI1NSwgMjUzLCAyNTUgfSwKKyAgICAgIHsgMjMyLCAyMzQsIDIyNCwgMjI4LCAyNDIsIDI0OSwgMjQyLCAyNTIsIDI1MSwgMjUxLCAyNTUgfSwKKyAgICAgIHsgMjM1LCAyNDksIDIzOCwgMjQwLCAyNTEsIDI1NSwgMjQ5LCAyNTUsIDI1MywgMjUzLCAyNTUgfSwKKyAgICAgIHsgMjQ5LCAyNTMsIDI1MSwgMjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUxLCAyNTAsIDI0OSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSB9LAorICAgIHsgeyAyNDMsIDI0NCwgMjUwLCAyNTAsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDksIDI0OCwgMjUwLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9IH0gfQorfTsKKworc3RhdGljIGNvbnN0IGludCB2cDZfZGNjdl9sY1szXVs1XVsyXSA9IHsKKyAgeyB7IDEyMiwgMTMzIH0sIHsgMCwgMSB9LCB7IDc4LCAgMTcxIH0sIHsgMTM5LCAxMTcgfSwgeyAxNjgsIDc5IH0gfSwKKyAgeyB7IDEzMywgIDUxIH0sIHsgMCwgMSB9LCB7IDE2OSwgIDcxIH0sIHsgMjE0LCAgNDQgfSwgeyAyMTAsIDM4IH0gfSwKKyAgeyB7IDE0MiwgLTE2IH0sIHsgMCwgMSB9LCB7IDIyMSwgLTMwIH0sIHsgMjQ2LCAgLTMgfSwgeyAyMDMsIDE3IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwNl9jb2VmZl9ncm91cHNbXSA9IHsKKyAgICAwLCAwLCAxLCAxLCAxLCAyLCAyLCAyLAorICAgIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsCisgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKyAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCB2cDZfYmxvY2tfY29weV9maWx0ZXJbMTddWzhdWzRdID0geworICB7IHsgICAwLCAxMjgsICAgMCwgICAwICB9LCAgLyogMCAqLworICAgIHsgIC0zLCAxMjIsICAgOSwgICAwICB9LAorICAgIHsgIC00LCAxMDksICAyNCwgIC0xICB9LAorICAgIHsgIC01LCAgOTEsICA0NSwgIC0zICB9LAorICAgIHsgIC00LCAgNjgsICA2OCwgIC00ICB9LAorICAgIHsgIC0zLCAgNDUsICA5MSwgIC01ICB9LAorICAgIHsgIC0xLCAgMjQsIDEwOSwgIC00ICB9LAorICAgIHsgICAwLCAgIDksIDEyMiwgIC0zICB9IH0sCisgIHsgeyAgIDAsIDEyOCwgICAwLCAgIDAgIH0sICAvKiAxICovCisgICAgeyAgLTQsIDEyNCwgICA5LCAgLTEgIH0sCisgICAgeyAgLTUsIDExMCwgIDI1LCAgLTIgIH0sCisgICAgeyAgLTYsICA5MSwgIDQ2LCAgLTMgIH0sCisgICAgeyAgLTUsICA2OSwgIDY5LCAgLTUgIH0sCisgICAgeyAgLTMsICA0NiwgIDkxLCAgLTYgIH0sCisgICAgeyAgLTIsICAyNSwgMTEwLCAgLTUgIH0sCisgICAgeyAgLTEsICAgOSwgMTI0LCAgLTQgIH0gfSwKKyAgeyB7ICAgMCwgMTI4LCAgIDAsICAgMCAgfSwgIC8qIDIgKi8KKyAgICB7ICAtNCwgMTIzLCAgMTAsICAtMSAgfSwKKyAgICB7ICAtNiwgMTEwLCAgMjYsICAtMiAgfSwKKyAgICB7ICAtNywgIDkyLCAgNDcsICAtNCAgfSwKKyAgICB7ICAtNiwgIDcwLCAgNzAsICAtNiAgfSwKKyAgICB7ICAtNCwgIDQ3LCAgOTIsICAtNyAgfSwKKyAgICB7ICAtMiwgIDI2LCAxMTAsICAtNiAgfSwKKyAgICB7ICAtMSwgIDEwLCAxMjMsICAtNCAgfSB9LAorICB7IHsgICAwLCAxMjgsICAgMCwgICAwICB9LCAgLyogMyAqLworICAgIHsgIC01LCAxMjQsICAxMCwgIC0xICB9LAorICAgIHsgIC03LCAxMTAsICAyNywgIC0yICB9LAorICAgIHsgIC03LCAgOTEsICA0OCwgIC00ICB9LAorICAgIHsgIC02LCAgNzAsICA3MCwgIC02ICB9LAorICAgIHsgIC00LCAgNDgsICA5MiwgIC04ICB9LAorICAgIHsgIC0yLCAgMjcsIDExMCwgIC03ICB9LAorICAgIHsgIC0xLCAgMTAsIDEyNCwgIC01ICB9IH0sCisgIHsgeyAgIDAsIDEyOCwgICAwLCAgIDAgIH0sICAvKiA0ICovCisgICAgeyAgLTYsIDEyNCwgIDExLCAgLTEgIH0sCisgICAgeyAgLTgsIDExMSwgIDI4LCAgLTMgIH0sCisgICAgeyAgLTgsICA5MiwgIDQ5LCAgLTUgIH0sCisgICAgeyAgLTcsICA3MSwgIDcxLCAgLTcgIH0sCisgICAgeyAgLTUsICA0OSwgIDkyLCAgLTggIH0sCisgICAgeyAgLTMsICAyOCwgMTExLCAgLTggIH0sCisgICAgeyAgLTEsICAxMSwgMTI0LCAgLTYgIH0gfSwKKyAgeyB7ICAwLCAgMTI4LCAgIDAsICAgMCAgfSwgIC8qIDUgKi8KKyAgICB7ICAtNiwgMTIzLCAgMTIsICAtMSAgfSwKKyAgICB7ICAtOSwgMTExLCAgMjksICAtMyAgfSwKKyAgICB7ICAtOSwgIDkzLCAgNTAsICAtNiAgfSwKKyAgICB7ICAtOCwgIDcyLCAgNzIsICAtOCAgfSwKKyAgICB7ICAtNiwgIDUwLCAgOTMsICAtOSAgfSwKKyAgICB7ICAtMywgIDI5LCAxMTEsICAtOSAgfSwKKyAgICB7ICAtMSwgIDEyLCAxMjMsICAtNiAgfSB9LAorICB7IHsgICAwLCAxMjgsICAgMCwgICAwICB9LCAgLyogNiAqLworICAgIHsgIC03LCAxMjQsICAxMiwgIC0xICB9LAorICAgIHsgLTEwLCAxMTEsICAzMCwgIC0zICB9LAorICAgIHsgLTEwLCAgOTMsICA1MSwgIC02ICB9LAorICAgIHsgIC05LCAgNzMsICA3MywgIC05ICB9LAorICAgIHsgIC02LCAgNTEsICA5MywgLTEwICB9LAorICAgIHsgIC0zLCAgMzAsIDExMSwgLTEwICB9LAorICAgIHsgIC0xLCAgMTIsIDEyNCwgIC03ICB9IH0sCisgIHsgeyAgIDAsIDEyOCwgICAwLCAgIDAgIH0sICAvKiA3ICovCisgICAgeyAgLTcsIDEyMywgIDEzLCAgLTEgIH0sCisgICAgeyAtMTEsIDExMiwgIDMxLCAgLTQgIH0sCisgICAgeyAtMTEsICA5NCwgIDUyLCAgLTcgIH0sCisgICAgeyAtMTAsICA3NCwgIDc0LCAtMTAgIH0sCisgICAgeyAgLTcsICA1MiwgIDk0LCAtMTEgIH0sCisgICAgeyAgLTQsICAzMSwgMTEyLCAtMTEgIH0sCisgICAgeyAgLTEsICAxMywgMTIzLCAgLTcgIH0gfSwKKyAgeyB7ICAgMCwgMTI4LCAgIDAsICAwICB9LCAgLyogOCAqLworICAgIHsgIC04LCAxMjQsICAxMywgIC0xICB9LAorICAgIHsgLTEyLCAxMTIsICAzMiwgIC00ICB9LAorICAgIHsgLTEyLCAgOTQsICA1MywgIC03ICB9LAorICAgIHsgLTEwLCAgNzQsICA3NCwgLTEwICB9LAorICAgIHsgIC03LCAgNTMsICA5NCwgLTEyICB9LAorICAgIHsgIC00LCAgMzIsIDExMiwgLTEyICB9LAorICAgIHsgIC0xLCAgMTMsIDEyNCwgIC04ICB9IH0sCisgIHsgeyAgIDAsIDEyOCwgICAwLCAgIDAgIH0sICAvKiA5ICovCisgICAgeyAgLTksIDEyNCwgIDE0LCAgLTEgIH0sCisgICAgeyAtMTMsIDExMiwgIDMzLCAgLTQgIH0sCisgICAgeyAtMTMsICA5NSwgIDU0LCAgLTggIH0sCisgICAgeyAtMTEsICA3NSwgIDc1LCAtMTEgIH0sCisgICAgeyAgLTgsICA1NCwgIDk1LCAtMTMgIH0sCisgICAgeyAgLTQsICAzMywgMTEyLCAtMTMgIH0sCisgICAgeyAgLTEsICAxNCwgMTI0LCAgLTkgIH0gfSwKKyAgeyB7ICAgMCwgMTI4LCAgIDAsICAgMCAgfSwgIC8qIDEwICovCisgICAgeyAgLTksIDEyMywgIDE1LCAgLTEgIH0sCisgICAgeyAtMTQsIDExMywgIDM0LCAgLTUgIH0sCisgICAgeyAtMTQsICA5NSwgIDU1LCAgLTggIH0sCisgICAgeyAtMTIsICA3NiwgIDc2LCAtMTIgIH0sCisgICAgeyAgLTgsICA1NSwgIDk1LCAtMTQgIH0sCisgICAgeyAgLTUsICAzNCwgMTEyLCAtMTMgIH0sCisgICAgeyAgLTEsICAxNSwgMTIzLCAgLTkgIH0gfSwKKyAgeyB7ICAgMCwgMTI4LCAgIDAsICAgMCAgfSwgIC8qIDExICovCisgICAgeyAtMTAsIDEyNCwgIDE1LCAgLTEgIH0sCisgICAgeyAtMTQsIDExMywgIDM0LCAgLTUgIH0sCisgICAgeyAtMTUsICA5NiwgIDU2LCAgLTkgIH0sCisgICAgeyAtMTMsICA3NywgIDc3LCAtMTMgIH0sCisgICAgeyAgLTksICA1NiwgIDk2LCAtMTUgIH0sCisgICAgeyAgLTUsICAzNCwgMTEzLCAtMTQgIH0sCisgICAgeyAgLTEsICAxNSwgMTI0LCAtMTAgIH0gfSwKKyAgeyB7ICAgMCwgMTI4LCAgIDAsICAgMCAgfSwgIC8qIDEyICovCisgICAgeyAtMTAsIDEyMywgIDE2LCAgLTEgIH0sCisgICAgeyAtMTUsIDExMywgIDM1LCAgLTUgIH0sCisgICAgeyAtMTYsICA5OCwgIDU2LCAtMTAgIH0sCisgICAgeyAtMTQsICA3OCwgIDc4LCAtMTQgIH0sCisgICAgeyAtMTAsICA1NiwgIDk4LCAtMTYgIH0sCisgICAgeyAgLTUsICAzNSwgMTEzLCAtMTUgIH0sCisgICAgeyAgLTEsICAxNiwgMTIzLCAtMTAgIH0gfSwKKyAgeyB7ICAgMCwgMTI4LCAgIDAsICAgMCAgfSwgIC8qIDEzICovCisgICAgeyAtMTEsIDEyNCwgIDE3LCAgLTIgIH0sCisgICAgeyAtMTYsIDExMywgIDM2LCAgLTUgIH0sCisgICAgeyAtMTcsICA5OCwgIDU3LCAtMTAgIH0sCisgICAgeyAtMTQsICA3OCwgIDc4LCAtMTQgIH0sCisgICAgeyAtMTAsICA1NywgIDk4LCAtMTcgIH0sCisgICAgeyAgLTUsICAzNiwgMTEzLCAtMTYgIH0sCisgICAgeyAgLTIsICAxNywgMTI0LCAtMTEgIH0gfSwKKyAgeyB7ICAgMCwgMTI4LCAgIDAsICAgMCAgfSwgIC8qIDE0ICovCisgICAgeyAtMTIsIDEyNSwgIDE3LCAgLTIgIH0sCisgICAgeyAtMTcsIDExNCwgIDM3LCAgLTYgIH0sCisgICAgeyAtMTgsICA5OSwgIDU4LCAtMTEgIH0sCisgICAgeyAtMTUsICA3OSwgIDc5LCAtMTUgIH0sCisgICAgeyAtMTEsICA1OCwgIDk5LCAtMTggIH0sCisgICAgeyAgLTYsICAzNywgMTE0LCAtMTcgIH0sCisgICAgeyAgLTIsICAxNywgMTI1LCAtMTIgIH0gfSwKKyAgeyB7ICAgMCwgMTI4LCAgIDAsICAgMCAgfSwgIC8qIDE1ICovCisgICAgeyAtMTIsIDEyNCwgIDE4LCAgLTIgIH0sCisgICAgeyAtMTgsIDExNCwgIDM4LCAgLTYgIH0sCisgICAgeyAtMTksICA5OSwgIDU5LCAtMTEgIH0sCisgICAgeyAtMTYsICA4MCwgIDgwLCAtMTYgIH0sCisgICAgeyAtMTEsICA1OSwgIDk5LCAtMTkgIH0sCisgICAgeyAgLTYsICAzOCwgMTE0LCAtMTggIH0sCisgICAgeyAgLTIsICAxOCwgMTI0LCAtMTIgIH0gfSwKKyAgeyB7ICAgMCwgMTI4LCAgIDAsICAgMCAgfSwgIC8qIDE2ICovCisgICAgeyAgLTQsIDExOCwgIDE2LCAgLTIgIH0sCisgICAgeyAgLTcsIDEwNiwgIDM0LCAgLTUgIH0sCisgICAgeyAgLTgsICA5MCwgIDUzLCAgLTcgIH0sCisgICAgeyAgLTgsICA3MiwgIDcyLCAgLTggIH0sCisgICAgeyAgLTcsICA1MywgIDkwLCAgLTggIH0sCisgICAgeyAgLTUsICAzNCwgMTA2LCAgLTcgIH0sCisgICAgeyAgLTIsICAxNiwgMTE4LCAgLTQgIH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBWUDU2VHJlZSB2cDZfcGNyX3RyZWVbXSA9IHsKKyAgICB7IDgsIDB9LAorICAgIHsgNCwgMX0sCisgICAgeyAyLCAyfSwgey0xfSwgey0yfSwKKyAgICB7IDIsIDN9LCB7LTN9LCB7LTR9LAorICAgIHsgOCwgNH0sCisgICAgeyA0LCA1fSwKKyAgICB7IDIsIDZ9LCB7LTV9LCB7LTZ9LAorICAgIHsgMiwgN30sIHstN30sIHstOH0sCisgICAgICAgICAgICAgey0wfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwNl9jb29yZF9kaXZbXSA9IHsgNCwgNCwgNCwgNCwgOCwgOCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDZfaHVmZl9jb2VmZl9tYXBbXSA9IHsKKyAgICAxMywgMTQsIDExLCAwLCAxLCAxNSwgMTYsIDE4LCAyLCAxNywgMywgNCwgMTksIDIwLCA1LCA2LCAyMSwgMjIsIDcsIDgsIDksIDEwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDZfaHVmZl9ydW5fbWFwW10gPSB7CisgICAgMTAsIDEzLCAxMSwgMTIsIDAsIDEsIDIsIDMsIDE0LCA4LCAxNSwgMTYsIDQsIDUsIDYsIDcKK307CisKKyNlbmRpZiAvKiBBVkNPREVDX1ZQNkRBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnA2ZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92cDZkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2M2YmUwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA2ZHNwLmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWUDYgRFNQLW9yaWVudGVkIGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAidnA1NmRzcC5oIgorCisKK3ZvaWQgZmZfdnA2X2ZpbHRlcl9kaWFnNF9jKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqaF93ZWlnaHRzLCBjb25zdCBpbnQxNl90ICp2X3dlaWdodHMpCit7CisgICAgaW50IHgsIHk7CisgICAgaW50IHRtcFs4KjExXTsKKyAgICBpbnQgKnQgPSB0bXA7CisKKyAgICBzcmMgLT0gc3RyaWRlOworCisgICAgZm9yICh5PTA7IHk8MTE7IHkrKykgeworICAgICAgICBmb3IgKHg9MDsgeDw4OyB4KyspIHsKKyAgICAgICAgICAgIHRbeF0gPSBhdl9jbGlwX3VpbnQ4KCggIHNyY1t4LTFdICogaF93ZWlnaHRzWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzcmNbeCAgXSAqIGhfd2VpZ2h0c1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3JjW3grMV0gKiBoX3dlaWdodHNbMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNyY1t4KzJdICogaF93ZWlnaHRzWzNdICsgNjQpID4+IDcpOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIHQgKz0gODsKKyAgICB9CisKKyAgICB0ID0gdG1wICsgODsKKyAgICBmb3IgKHk9MDsgeTw4OyB5KyspIHsKKyAgICAgICAgZm9yICh4PTA7IHg8ODsgeCsrKSB7CisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3VpbnQ4KCggIHRbeC04IF0gKiB2X3dlaWdodHNbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdFt4ICAgXSAqIHZfd2VpZ2h0c1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0W3grOCBdICogdl93ZWlnaHRzWzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRbeCsxNl0gKiB2X3dlaWdodHNbM10gKyA2NCkgPj4gNyk7CisgICAgICAgIH0KKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgdCArPSA4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkMjZmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOC5jCkBAIC0wLDAgKzEsMjgzNCBAQAorLyoKKyAqIFZQNy9WUDggY29tcGF0aWJsZSB2aWRlbyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIERhdmlkIENvbnJhZAorICogQ29weXJpZ2h0IChDKSAyMDEwIFJvbmFsZCBTLiBCdWx0amUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBGaW9uYSBHbGFzZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEYW5pZWwgS2FuZworICogQ29weXJpZ2h0IChDKSAyMDE0IFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicmVjdGFuZ2xlLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAidnA4LmgiCisjaW5jbHVkZSAidnA4ZGF0YS5oIgorCisjaWYgQVJDSF9BUk0KKyMgICBpbmNsdWRlICJhcm0vdnA4LmgiCisjZW5kaWYKKworI2lmIENPTkZJR19WUDdfREVDT0RFUiAmJiBDT05GSUdfVlA4X0RFQ09ERVIKKyNkZWZpbmUgVlBYKHZwNywgZikgKHZwNyA/IHZwN18gIyMgZiA6IHZwOF8gIyMgZikKKyNlbGlmIENPTkZJR19WUDdfREVDT0RFUgorI2RlZmluZSBWUFgodnA3LCBmKSB2cDdfICMjIGYKKyNlbHNlIC8vIENPTkZJR19WUDhfREVDT0RFUgorI2RlZmluZSBWUFgodnA3LCBmKSB2cDhfICMjIGYKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcnMoVlA4Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAocy0+dGhyZWFkX2RhdGEpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVEhSRUFEUzsgaSsrKSB7CisjaWYgSEFWRV9USFJFQURTCisgICAgICAgICAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcy0+dGhyZWFkX2RhdGFbaV0uY29uZCk7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnMtPnRocmVhZF9kYXRhW2ldLmxvY2spOworI2VuZGlmCisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+dGhyZWFkX2RhdGFbaV0uZmlsdGVyX3N0cmVuZ3RoKTsKKyAgICAgICAgfQorICAgIGF2X2ZyZWVwKCZzLT50aHJlYWRfZGF0YSk7CisgICAgYXZfZnJlZXAoJnMtPm1hY3JvYmxvY2tzX2Jhc2UpOworICAgIGF2X2ZyZWVwKCZzLT5pbnRyYTR4NF9wcmVkX21vZGVfdG9wKTsKKyAgICBhdl9mcmVlcCgmcy0+dG9wX25ueik7CisgICAgYXZfZnJlZXAoJnMtPnRvcF9ib3JkZXIpOworCisgICAgcy0+bWFjcm9ibG9ja3MgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHZwOF9hbGxvY19mcmFtZShWUDhDb250ZXh0ICpzLCBWUDhGcmFtZSAqZiwgaW50IHJlZikKK3sKKyAgICBpbnQgcmV0OworICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIocy0+YXZjdHgsICZmLT50ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA/IEFWX0dFVF9CVUZGRVJfRkxBR19SRUYgOiAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICghKGYtPnNlZ19tYXAgPSBhdl9idWZmZXJfYWxsb2N6KHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0KSkpIHsKKyAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKHMtPmF2Y3R4LCAmZi0+dGYpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdnA4X3JlbGVhc2VfZnJhbWUoVlA4Q29udGV4dCAqcywgVlA4RnJhbWUgKmYpCit7CisgICAgYXZfYnVmZmVyX3VucmVmKCZmLT5zZWdfbWFwKTsKKyAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIocy0+YXZjdHgsICZmLT50Zik7Cit9CisKKyNpZiBDT05GSUdfVlA4X0RFQ09ERVIKK3N0YXRpYyBpbnQgdnA4X3JlZl9mcmFtZShWUDhDb250ZXh0ICpzLCBWUDhGcmFtZSAqZHN0LCBWUDhGcmFtZSAqc3JjKQoreworICAgIGludCByZXQ7CisKKyAgICB2cDhfcmVsZWFzZV9mcmFtZShzLCBkc3QpOworCisgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfcmVmX2ZyYW1lKCZkc3QtPnRmLCAmc3JjLT50ZikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoc3JjLT5zZWdfbWFwICYmCisgICAgICAgICEoZHN0LT5zZWdfbWFwID0gYXZfYnVmZmVyX3JlZihzcmMtPnNlZ19tYXApKSkgeworICAgICAgICB2cDhfcmVsZWFzZV9mcmFtZShzLCBkc3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19WUDhfREVDT0RFUiAqLworCitzdGF0aWMgdm9pZCB2cDhfZGVjb2RlX2ZsdXNoX2ltcGwoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgZnJlZV9tZW0pCit7CisgICAgVlA4Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+ZnJhbWVzKTsgaSsrKQorICAgICAgICB2cDhfcmVsZWFzZV9mcmFtZShzLCAmcy0+ZnJhbWVzW2ldKTsKKyAgICBtZW1zZXQocy0+ZnJhbWVwLCAwLCBzaXplb2Yocy0+ZnJhbWVwKSk7CisKKyAgICBpZiAoZnJlZV9tZW0pCisgICAgICAgIGZyZWVfYnVmZmVycyhzKTsKK30KKworc3RhdGljIHZvaWQgdnA4X2RlY29kZV9mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgdnA4X2RlY29kZV9mbHVzaF9pbXBsKGF2Y3R4LCAwKTsKK30KKworc3RhdGljIFZQOEZyYW1lICp2cDhfZmluZF9mcmVlX2J1ZmZlcihWUDhDb250ZXh0ICpzKQoreworICAgIFZQOEZyYW1lICpmcmFtZSA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICAvLyBmaW5kIGEgZnJlZSBidWZmZXIKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICBpZiAoJnMtPmZyYW1lc1tpXSAhPSBzLT5mcmFtZXBbVlA1Nl9GUkFNRV9DVVJSRU5UXSAgJiYKKyAgICAgICAgICAgICZzLT5mcmFtZXNbaV0gIT0gcy0+ZnJhbWVwW1ZQNTZfRlJBTUVfUFJFVklPVVNdICYmCisgICAgICAgICAgICAmcy0+ZnJhbWVzW2ldICE9IHMtPmZyYW1lcFtWUDU2X0ZSQU1FX0dPTERFTl0gICAmJgorICAgICAgICAgICAgJnMtPmZyYW1lc1tpXSAhPSBzLT5mcmFtZXBbVlA1Nl9GUkFNRV9HT0xERU4yXSkgeworICAgICAgICAgICAgZnJhbWUgPSAmcy0+ZnJhbWVzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBpZiAoaSA9PSA1KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0ZBVEFMLCAiUmFuIG91dCBvZiBmcmVlIGZyYW1lcyFcbiIpOworICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICBpZiAoZnJhbWUtPnRmLmYtPmRhdGFbMF0pCisgICAgICAgIHZwOF9yZWxlYXNlX2ZyYW1lKHMsIGZyYW1lKTsKKworICAgIHJldHVybiBmcmFtZTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK2ludCB1cGRhdGVfZGltZW5zaW9ucyhWUDhDb250ZXh0ICpzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBpc192cDcpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gcy0+YXZjdHg7CisgICAgaW50IGksIHJldDsKKworICAgIGlmICh3aWR0aCAgIT0gcy0+YXZjdHgtPndpZHRoIHx8ICgod2lkdGgrMTUpLzE2ICE9IHMtPm1iX3dpZHRoIHx8IChoZWlnaHQrMTUpLzE2ICE9IHMtPm1iX2hlaWdodCkgJiYgcy0+bWFjcm9ibG9ja3NfYmFzZSB8fAorICAgICAgICBoZWlnaHQgIT0gcy0+YXZjdHgtPmhlaWdodCkgeworICAgICAgICB2cDhfZGVjb2RlX2ZsdXNoX2ltcGwocy0+YXZjdHgsIDEpOworCisgICAgICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKHMtPmF2Y3R4LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHMtPm1iX3dpZHRoICA9IChzLT5hdmN0eC0+Y29kZWRfd2lkdGggICsgMTUpIC8gMTY7CisgICAgcy0+bWJfaGVpZ2h0ID0gKHMtPmF2Y3R4LT5jb2RlZF9oZWlnaHQgKyAxNSkgLyAxNjsKKworICAgIHMtPm1iX2xheW91dCA9IGlzX3ZwNyB8fCBhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlID09IEZGX1RIUkVBRF9TTElDRSAmJgorICAgICAgICAgICAgICAgICAgIEZGTUlOKHMtPm51bV9jb2VmZl9wYXJ0aXRpb25zLCBhdmN0eC0+dGhyZWFkX2NvdW50KSA+IDE7CisgICAgaWYgKCFzLT5tYl9sYXlvdXQpIHsgLy8gRnJhbWUgdGhyZWFkaW5nIGFuZCBvbmUgdGhyZWFkCisgICAgICAgIHMtPm1hY3JvYmxvY2tzX2Jhc2UgICAgICAgPSBhdl9tYWxsb2N6KChzLT5tYl93aWR0aCArIHMtPm1iX2hlaWdodCAqIDIgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+bWFjcm9ibG9ja3MpKTsKKyAgICAgICAgcy0+aW50cmE0eDRfcHJlZF9tb2RlX3RvcCA9IGF2X21hbGxvY3oocy0+bWJfd2lkdGggKiA0KTsKKyAgICB9IGVsc2UgLy8gU2xpY2VkIHRocmVhZGluZworICAgICAgICBzLT5tYWNyb2Jsb2Nrc19iYXNlID0gYXZfbWFsbG9jeigocy0+bWJfd2lkdGggKyAyKSAqIChzLT5tYl9oZWlnaHQgKyAyKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+bWFjcm9ibG9ja3MpKTsKKyAgICBzLT50b3Bfbm56ICAgICA9IGF2X21hbGxvY3oocy0+bWJfd2lkdGggKiBzaXplb2YoKnMtPnRvcF9ubnopKTsKKyAgICBzLT50b3BfYm9yZGVyICA9IGF2X21hbGxvY3ooKHMtPm1iX3dpZHRoICsgMSkgKiBzaXplb2YoKnMtPnRvcF9ib3JkZXIpKTsKKyAgICBzLT50aHJlYWRfZGF0YSA9IGF2X21hbGxvY3ooTUFYX1RIUkVBRFMgKiBzaXplb2YoVlA4VGhyZWFkRGF0YSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9USFJFQURTOyBpKyspIHsKKyAgICAgICAgcy0+dGhyZWFkX2RhdGFbaV0uZmlsdGVyX3N0cmVuZ3RoID0KKyAgICAgICAgICAgIGF2X21hbGxvY3oocy0+bWJfd2lkdGggKiBzaXplb2YoKnMtPnRocmVhZF9kYXRhWzBdLmZpbHRlcl9zdHJlbmd0aCkpOworI2lmIEhBVkVfVEhSRUFEUworICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJnMtPnRocmVhZF9kYXRhW2ldLmxvY2ssIE5VTEwpOworICAgICAgICBwdGhyZWFkX2NvbmRfaW5pdCgmcy0+dGhyZWFkX2RhdGFbaV0uY29uZCwgTlVMTCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoIXMtPm1hY3JvYmxvY2tzX2Jhc2UgfHwgIXMtPnRvcF9ubnogfHwgIXMtPnRvcF9ib3JkZXIgfHwKKyAgICAgICAgKCFzLT5pbnRyYTR4NF9wcmVkX21vZGVfdG9wICYmICFzLT5tYl9sYXlvdXQpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+bWFjcm9ibG9ja3MgPSBzLT5tYWNyb2Jsb2Nrc19iYXNlICsgMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwN191cGRhdGVfZGltZW5zaW9ucyhWUDhDb250ZXh0ICpzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgcmV0dXJuIHVwZGF0ZV9kaW1lbnNpb25zKHMsIHdpZHRoLCBoZWlnaHQsIElTX1ZQNyk7Cit9CisKK3N0YXRpYyBpbnQgdnA4X3VwZGF0ZV9kaW1lbnNpb25zKFZQOENvbnRleHQgKnMsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICByZXR1cm4gdXBkYXRlX2RpbWVuc2lvbnMocywgd2lkdGgsIGhlaWdodCwgSVNfVlA4KTsKK30KKworCitzdGF0aWMgdm9pZCBwYXJzZV9zZWdtZW50X2luZm8oVlA4Q29udGV4dCAqcykKK3sKKyAgICBWUDU2UmFuZ2VDb2RlciAqYyA9ICZzLT5jOworICAgIGludCBpOworCisgICAgcy0+c2VnbWVudGF0aW9uLnVwZGF0ZV9tYXAgPSB2cDhfcmFjX2dldChjKTsKKworICAgIGlmICh2cDhfcmFjX2dldChjKSkgeyAvLyB1cGRhdGUgc2VnbWVudCBmZWF0dXJlIGRhdGEKKyAgICAgICAgcy0+c2VnbWVudGF0aW9uLmFic29sdXRlX3ZhbHMgPSB2cDhfcmFjX2dldChjKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgcy0+c2VnbWVudGF0aW9uLmJhc2VfcXVhbnRbaV0gICA9IHZwOF9yYWNfZ2V0X3NpbnQoYywgNyk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIHMtPnNlZ21lbnRhdGlvbi5maWx0ZXJfbGV2ZWxbaV0gPSB2cDhfcmFjX2dldF9zaW50KGMsIDYpOworICAgIH0KKyAgICBpZiAocy0+c2VnbWVudGF0aW9uLnVwZGF0ZV9tYXApCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICBzLT5wcm9iLT5zZWdtZW50aWRbaV0gPSB2cDhfcmFjX2dldChjKSA/IHZwOF9yYWNfZ2V0X3VpbnQoYywgOCkgOiAyNTU7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9sZl9kZWx0YXMoVlA4Q29udGV4dCAqcykKK3sKKyAgICBWUDU2UmFuZ2VDb2RlciAqYyA9ICZzLT5jOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpZiAodnA4X3JhY19nZXQoYykpIHsKKyAgICAgICAgICAgIHMtPmxmX2RlbHRhLnJlZltpXSA9IHZwOF9yYWNfZ2V0X3VpbnQoYywgNik7CisKKyAgICAgICAgICAgIGlmICh2cDhfcmFjX2dldChjKSkKKyAgICAgICAgICAgICAgICBzLT5sZl9kZWx0YS5yZWZbaV0gPSAtcy0+bGZfZGVsdGEucmVmW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gTU9ERV9JNHg0OyBpIDw9IFZQOF9NVk1PREVfU1BMSVQ7IGkrKykgeworICAgICAgICBpZiAodnA4X3JhY19nZXQoYykpIHsKKyAgICAgICAgICAgIHMtPmxmX2RlbHRhLm1vZGVbaV0gPSB2cDhfcmFjX2dldF91aW50KGMsIDYpOworCisgICAgICAgICAgICBpZiAodnA4X3JhY19nZXQoYykpCisgICAgICAgICAgICAgICAgcy0+bGZfZGVsdGEubW9kZVtpXSA9IC1zLT5sZl9kZWx0YS5tb2RlW2ldOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IHNldHVwX3BhcnRpdGlvbnMoVlA4Q29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgY29uc3QgdWludDhfdCAqc2l6ZXMgPSBidWY7CisgICAgaW50IGk7CisKKyAgICBzLT5udW1fY29lZmZfcGFydGl0aW9ucyA9IDEgPDwgdnA4X3JhY19nZXRfdWludCgmcy0+YywgMik7CisKKyAgICBidWYgICAgICArPSAzICogKHMtPm51bV9jb2VmZl9wYXJ0aXRpb25zIC0gMSk7CisgICAgYnVmX3NpemUgLT0gMyAqIChzLT5udW1fY29lZmZfcGFydGl0aW9ucyAtIDEpOworICAgIGlmIChidWZfc2l6ZSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fY29lZmZfcGFydGl0aW9ucyAtIDE7IGkrKykgeworICAgICAgICBpbnQgc2l6ZSA9IEFWX1JMMjQoc2l6ZXMgKyAzICogaSk7CisgICAgICAgIGlmIChidWZfc2l6ZSAtIHNpemUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKCZzLT5jb2VmZl9wYXJ0aXRpb25baV0sIGJ1Ziwgc2l6ZSk7CisgICAgICAgIGJ1ZiAgICAgICs9IHNpemU7CisgICAgICAgIGJ1Zl9zaXplIC09IHNpemU7CisgICAgfQorICAgIGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKCZzLT5jb2VmZl9wYXJ0aXRpb25baV0sIGJ1ZiwgYnVmX3NpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZwN19nZXRfcXVhbnRzKFZQOENvbnRleHQgKnMpCit7CisgICAgVlA1NlJhbmdlQ29kZXIgKmMgPSAmcy0+YzsKKworICAgIGludCB5YWNfcWkgID0gdnA4X3JhY19nZXRfdWludChjLCA3KTsKKyAgICBpbnQgeWRjX3FpICA9IHZwOF9yYWNfZ2V0KGMpID8gdnA4X3JhY19nZXRfdWludChjLCA3KSA6IHlhY19xaTsKKyAgICBpbnQgeTJkY19xaSA9IHZwOF9yYWNfZ2V0KGMpID8gdnA4X3JhY19nZXRfdWludChjLCA3KSA6IHlhY19xaTsKKyAgICBpbnQgeTJhY19xaSA9IHZwOF9yYWNfZ2V0KGMpID8gdnA4X3JhY19nZXRfdWludChjLCA3KSA6IHlhY19xaTsKKyAgICBpbnQgdXZkY19xaSA9IHZwOF9yYWNfZ2V0KGMpID8gdnA4X3JhY19nZXRfdWludChjLCA3KSA6IHlhY19xaTsKKyAgICBpbnQgdXZhY19xaSA9IHZwOF9yYWNfZ2V0KGMpID8gdnA4X3JhY19nZXRfdWludChjLCA3KSA6IHlhY19xaTsKKworICAgIHMtPnFtYXRbMF0ubHVtYV9xbXVsWzBdICAgID0gICAgICAgdnA3X3lkY19xbG9va3VwW3lkY19xaV07CisgICAgcy0+cW1hdFswXS5sdW1hX3FtdWxbMV0gICAgPSAgICAgICB2cDdfeWFjX3Fsb29rdXBbeWFjX3FpXTsKKyAgICBzLT5xbWF0WzBdLmx1bWFfZGNfcW11bFswXSA9ICAgICAgIHZwN195MmRjX3Fsb29rdXBbeTJkY19xaV07CisgICAgcy0+cW1hdFswXS5sdW1hX2RjX3FtdWxbMV0gPSAgICAgICB2cDdfeTJhY19xbG9va3VwW3kyYWNfcWldOworICAgIHMtPnFtYXRbMF0uY2hyb21hX3FtdWxbMF0gID0gRkZNSU4odnA3X3lkY19xbG9va3VwW3V2ZGNfcWldLCAxMzIpOworICAgIHMtPnFtYXRbMF0uY2hyb21hX3FtdWxbMV0gID0gICAgICAgdnA3X3lhY19xbG9va3VwW3V2YWNfcWldOworfQorCitzdGF0aWMgdm9pZCB2cDhfZ2V0X3F1YW50cyhWUDhDb250ZXh0ICpzKQoreworICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CisgICAgaW50IGksIGJhc2VfcWk7CisKKyAgICBpbnQgeWFjX3FpICAgICA9IHZwOF9yYWNfZ2V0X3VpbnQoYywgNyk7CisgICAgaW50IHlkY19kZWx0YSAgPSB2cDhfcmFjX2dldF9zaW50KGMsIDQpOworICAgIGludCB5MmRjX2RlbHRhID0gdnA4X3JhY19nZXRfc2ludChjLCA0KTsKKyAgICBpbnQgeTJhY19kZWx0YSA9IHZwOF9yYWNfZ2V0X3NpbnQoYywgNCk7CisgICAgaW50IHV2ZGNfZGVsdGEgPSB2cDhfcmFjX2dldF9zaW50KGMsIDQpOworICAgIGludCB1dmFjX2RlbHRhID0gdnA4X3JhY19nZXRfc2ludChjLCA0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaWYgKHMtPnNlZ21lbnRhdGlvbi5lbmFibGVkKSB7CisgICAgICAgICAgICBiYXNlX3FpID0gcy0+c2VnbWVudGF0aW9uLmJhc2VfcXVhbnRbaV07CisgICAgICAgICAgICBpZiAoIXMtPnNlZ21lbnRhdGlvbi5hYnNvbHV0ZV92YWxzKQorICAgICAgICAgICAgICAgIGJhc2VfcWkgKz0geWFjX3FpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJhc2VfcWkgPSB5YWNfcWk7CisKKyAgICAgICAgcy0+cW1hdFtpXS5sdW1hX3FtdWxbMF0gICAgPSB2cDhfZGNfcWxvb2t1cFthdl9jbGlwX3VpbnRwMihiYXNlX3FpICsgeWRjX2RlbHRhLCAgNyldOworICAgICAgICBzLT5xbWF0W2ldLmx1bWFfcW11bFsxXSAgICA9IHZwOF9hY19xbG9va3VwW2F2X2NsaXBfdWludHAyKGJhc2VfcWksICAgICAgICAgICAgICA3KV07CisgICAgICAgIHMtPnFtYXRbaV0ubHVtYV9kY19xbXVsWzBdID0gdnA4X2RjX3Fsb29rdXBbYXZfY2xpcF91aW50cDIoYmFzZV9xaSArIHkyZGNfZGVsdGEsIDcpXSAqIDI7CisgICAgICAgIC8qIDEwMTU4MT4+MTYgaXMgZXF1aXZhbGVudCB0byAxNTUvMTAwICovCisgICAgICAgIHMtPnFtYXRbaV0ubHVtYV9kY19xbXVsWzFdID0gdnA4X2FjX3Fsb29rdXBbYXZfY2xpcF91aW50cDIoYmFzZV9xaSArIHkyYWNfZGVsdGEsIDcpXSAqIDEwMTU4MSA+PiAxNjsKKyAgICAgICAgcy0+cW1hdFtpXS5jaHJvbWFfcW11bFswXSAgPSB2cDhfZGNfcWxvb2t1cFthdl9jbGlwX3VpbnRwMihiYXNlX3FpICsgdXZkY19kZWx0YSwgNyldOworICAgICAgICBzLT5xbWF0W2ldLmNocm9tYV9xbXVsWzFdICA9IHZwOF9hY19xbG9va3VwW2F2X2NsaXBfdWludHAyKGJhc2VfcWkgKyB1dmFjX2RlbHRhLCA3KV07CisKKyAgICAgICAgcy0+cW1hdFtpXS5sdW1hX2RjX3FtdWxbMV0gPSBGRk1BWChzLT5xbWF0W2ldLmx1bWFfZGNfcW11bFsxXSwgOCk7CisgICAgICAgIHMtPnFtYXRbaV0uY2hyb21hX3FtdWxbMF0gID0gRkZNSU4ocy0+cW1hdFtpXS5jaHJvbWFfcW11bFswXSwgMTMyKTsKKyAgICB9Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIHdoaWNoIGJ1ZmZlcnMgZ29sZGVuIGFuZCBhbHRyZWYgc2hvdWxkIGJlIHVwZGF0ZWQgd2l0aCBhZnRlciB0aGlzIGZyYW1lLgorICogVGhlIHNwZWMgaXNuJ3QgY2xlYXIgaGVyZSwgc28gSSdtIGdvaW5nIGJ5IG15IHVuZGVyc3RhbmRpbmcgb2Ygd2hhdCBsaWJ2cHggZG9lcworICoKKyAqIEludHJhIGZyYW1lcyB1cGRhdGUgYWxsIDMgcmVmZXJlbmNlcworICogSW50ZXIgZnJhbWVzIHVwZGF0ZSBWUDU2X0ZSQU1FX1BSRVZJT1VTIGlmIHRoZSB1cGRhdGVfbGFzdCBmbGFnIGlzIHNldAorICogSWYgdGhlIHVwZGF0ZSAoZ29sZGVufGFsdHJlZikgZmxhZyBpcyBzZXQsIGl0J3MgdXBkYXRlZCB3aXRoIHRoZSBjdXJyZW50IGZyYW1lCisgKiAgICAgIGlmIHVwZGF0ZV9sYXN0IGlzIHNldCwgYW5kIFZQNTZfRlJBTUVfUFJFVklPVVMgb3RoZXJ3aXNlLgorICogSWYgdGhlIGZsYWcgaXMgbm90IHNldCwgdGhlIG51bWJlciByZWFkIG1lYW5zOgorICogICAgICAwOiBubyB1cGRhdGUKKyAqICAgICAgMTogVlA1Nl9GUkFNRV9QUkVWSU9VUworICogICAgICAyOiB1cGRhdGUgZ29sZGVuIHdpdGggYWx0cmVmLCBvciB1cGRhdGUgYWx0cmVmIHdpdGggZ29sZGVuCisgKi8KK3N0YXRpYyBWUDU2RnJhbWUgcmVmX3RvX3VwZGF0ZShWUDhDb250ZXh0ICpzLCBpbnQgdXBkYXRlLCBWUDU2RnJhbWUgcmVmKQoreworICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CisKKyAgICBpZiAodXBkYXRlKQorICAgICAgICByZXR1cm4gVlA1Nl9GUkFNRV9DVVJSRU5UOworCisgICAgc3dpdGNoICh2cDhfcmFjX2dldF91aW50KGMsIDIpKSB7CisgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gVlA1Nl9GUkFNRV9QUkVWSU9VUzsKKyAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiAocmVmID09IFZQNTZfRlJBTUVfR09MREVOKSA/IFZQNTZfRlJBTUVfR09MREVOMiA6IFZQNTZfRlJBTUVfR09MREVOOworICAgIH0KKyAgICByZXR1cm4gVlA1Nl9GUkFNRV9OT05FOworfQorCitzdGF0aWMgdm9pZCB2cDc4X3Jlc2V0X3Byb2JhYmlsaXR5X3RhYmxlcyhWUDhDb250ZXh0ICpzKQoreworICAgIGludCBpLCBqOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgbWVtY3B5KHMtPnByb2ItPnRva2VuW2ldW2pdLCB2cDhfdG9rZW5fZGVmYXVsdF9wcm9ic1tpXVt2cDhfY29lZmZfYmFuZFtqXV0sCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHMtPnByb2ItPnRva2VuW2ldW2pdKSk7Cit9CisKK3N0YXRpYyB2b2lkIHZwNzhfdXBkYXRlX3Byb2JhYmlsaXR5X3RhYmxlcyhWUDhDb250ZXh0ICpzKQoreworICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CisgICAgaW50IGksIGosIGssIGwsIG07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykKKyAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgTlVNX0RDVF9UT0tFTlMtMTsgbCsrKQorICAgICAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB2cDhfdG9rZW5fdXBkYXRlX3Byb2JzW2ldW2pdW2tdW2xdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb2IgPSB2cDhfcmFjX2dldF91aW50KGMsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgdnA4X2NvZWZmX2JhbmRfaW5kZXhlc1tqXVttXSA+PSAwOyBtKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi0+dG9rZW5baV1bdnA4X2NvZWZmX2JhbmRfaW5kZXhlc1tqXVttXV1ba11bbF0gPSBwcm9iOworICAgICAgICAgICAgICAgICAgICB9Cit9CisKKyNkZWZpbmUgVlA3X01WQ19TSVpFIDE3CisjZGVmaW5lIFZQOF9NVkNfU0laRSAxOQorCitzdGF0aWMgdm9pZCB2cDc4X3VwZGF0ZV9wcmVkMTZ4MTZfcHJlZDh4OF9tdmNfcHJvYmFiaWxpdGllcyhWUDhDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG12Y19zaXplKQoreworICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CisgICAgaW50IGksIGo7CisKKyAgICBpZiAodnA4X3JhY19nZXQoYykpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBzLT5wcm9iLT5wcmVkMTZ4MTZbaV0gPSB2cDhfcmFjX2dldF91aW50KGMsIDgpOworICAgIGlmICh2cDhfcmFjX2dldChjKSkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHMtPnByb2ItPnByZWQ4eDhjW2ldICA9IHZwOF9yYWNfZ2V0X3VpbnQoYywgOCk7CisKKyAgICAvLyAxNy4yIE1WIHByb2JhYmlsaXR5IHVwZGF0ZQorICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBtdmNfc2l6ZTsgaisrKQorICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdnA4X212X3VwZGF0ZV9wcm9iW2ldW2pdKSkKKyAgICAgICAgICAgICAgICBzLT5wcm9iLT5tdmNbaV1bal0gPSB2cDhfcmFjX2dldF9ubihjKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3JlZnMoVlA4Q29udGV4dCAqcykKK3sKKyAgICBWUDU2UmFuZ2VDb2RlciAqYyA9ICZzLT5jOworCisgICAgaW50IHVwZGF0ZV9nb2xkZW4gPSB2cDhfcmFjX2dldChjKTsKKyAgICBpbnQgdXBkYXRlX2FsdHJlZiA9IHZwOF9yYWNfZ2V0KGMpOworCisgICAgcy0+dXBkYXRlX2dvbGRlbiA9IHJlZl90b191cGRhdGUocywgdXBkYXRlX2dvbGRlbiwgVlA1Nl9GUkFNRV9HT0xERU4pOworICAgIHMtPnVwZGF0ZV9hbHRyZWYgPSByZWZfdG9fdXBkYXRlKHMsIHVwZGF0ZV9hbHRyZWYsIFZQNTZfRlJBTUVfR09MREVOMik7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfY2hyb21hKEFWRnJhbWUgKmRzdCwgQVZGcmFtZSAqc3JjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGogPSAxOyBqIDwgMzsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyBpKyspCisgICAgICAgICAgICBtZW1jcHkoZHN0LT5kYXRhW2pdICsgaSAqIGRzdC0+bGluZXNpemVbal0sCisgICAgICAgICAgICAgICAgICAgc3JjLT5kYXRhW2pdICsgaSAqIHNyYy0+bGluZXNpemVbal0sIHdpZHRoIC8gMik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmYWRlKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgaW50IGJldGEpCit7CisgICAgaW50IGksIGo7CisgICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgICAgICB1aW50OF90IHkgPSBzcmNbaiAqIHNyY19saW5lc2l6ZSArIGldOworICAgICAgICAgICAgZHN0W2ogKiBkc3RfbGluZXNpemUgKyBpXSA9IGF2X2NsaXBfdWludDgoeSArICgoeSAqIGJldGEpID4+IDgpICsgYWxwaGEpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IHZwN19mYWRlX2ZyYW1lKFZQOENvbnRleHQgKnMsIFZQNTZSYW5nZUNvZGVyICpjKQoreworICAgIGludCBhbHBoYSA9IChpbnQ4X3QpIHZwOF9yYWNfZ2V0X3VpbnQoYywgOCk7CisgICAgaW50IGJldGEgID0gKGludDhfdCkgdnA4X3JhY19nZXRfdWludChjLCA4KTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFzLT5rZXlmcmFtZSAmJiAoYWxwaGEgfHwgYmV0YSkpIHsKKyAgICAgICAgaW50IHdpZHRoICA9IHMtPm1iX3dpZHRoICogMTY7CisgICAgICAgIGludCBoZWlnaHQgPSBzLT5tYl9oZWlnaHQgKiAxNjsKKyAgICAgICAgQVZGcmFtZSAqc3JjLCAqZHN0OworCisgICAgICAgIGlmICghcy0+ZnJhbWVwW1ZQNTZfRlJBTUVfUFJFVklPVVNdIHx8CisgICAgICAgICAgICAhcy0+ZnJhbWVwW1ZQNTZfRlJBTUVfR09MREVOXSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkRpc2NhcmRpbmcgaW50ZXJmcmFtZSB3aXRob3V0IGEgcHJpb3Iga2V5ZnJhbWUhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgZHN0ID0KKyAgICAgICAgc3JjID0gcy0+ZnJhbWVwW1ZQNTZfRlJBTUVfUFJFVklPVVNdLT50Zi5mOworCisgICAgICAgIC8qIHByZXNlcnZlIHRoZSBnb2xkZW4gZnJhbWUsIHdyaXRlIGEgbmV3IHByZXZpb3VzIGZyYW1lICovCisgICAgICAgIGlmIChzLT5mcmFtZXBbVlA1Nl9GUkFNRV9HT0xERU5dID09IHMtPmZyYW1lcFtWUDU2X0ZSQU1FX1BSRVZJT1VTXSkgeworICAgICAgICAgICAgcy0+ZnJhbWVwW1ZQNTZfRlJBTUVfUFJFVklPVVNdID0gdnA4X2ZpbmRfZnJlZV9idWZmZXIocyk7CisgICAgICAgICAgICBpZiAoKHJldCA9IHZwOF9hbGxvY19mcmFtZShzLCBzLT5mcmFtZXBbVlA1Nl9GUkFNRV9QUkVWSU9VU10sIDEpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgZHN0ID0gcy0+ZnJhbWVwW1ZQNTZfRlJBTUVfUFJFVklPVVNdLT50Zi5mOworCisgICAgICAgICAgICBjb3B5X2Nocm9tYShkc3QsIHNyYywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBmYWRlKGRzdC0+ZGF0YVswXSwgZHN0LT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICBzcmMtPmRhdGFbMF0sIHNyYy0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYWxwaGEsIGJldGEpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwN19kZWNvZGVfZnJhbWVfaGVhZGVyKFZQOENvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CisgICAgaW50IHBhcnQxX3NpemUsIGhzY2FsZSwgdnNjYWxlLCBpLCBqLCByZXQ7CisgICAgaW50IHdpZHRoICA9IHMtPmF2Y3R4LT53aWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gcy0+YXZjdHgtPmhlaWdodDsKKworICAgIHMtPnByb2ZpbGUgPSAoYnVmWzBdID4+IDEpICYgNzsKKyAgICBpZiAocy0+cHJvZmlsZSA+IDEpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiVW5rbm93biBwcm9maWxlICVkIiwgcy0+cHJvZmlsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPmtleWZyYW1lICA9ICEoYnVmWzBdICYgMSk7CisgICAgcy0+aW52aXNpYmxlID0gMDsKKyAgICBwYXJ0MV9zaXplICAgPSBBVl9STDI0KGJ1ZikgPj4gNDsKKworICAgIGlmIChidWZfc2l6ZSA8IDQgLSBzLT5wcm9maWxlICsgcGFydDFfc2l6ZSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkJ1ZmZlciBzaXplICVkIGlzIHRvbyBzbWFsbCwgbmVlZGVkIDogJWRcbiIsIGJ1Zl9zaXplLCA0IC0gcy0+cHJvZmlsZSArIHBhcnQxX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBidWYgICAgICArPSA0IC0gcy0+cHJvZmlsZTsKKyAgICBidWZfc2l6ZSAtPSA0IC0gcy0+cHJvZmlsZTsKKworICAgIG1lbWNweShzLT5wdXRfcGl4ZWxzX3RhYiwgcy0+dnA4ZHNwLnB1dF92cDhfZXBlbF9waXhlbHNfdGFiLCBzaXplb2Yocy0+cHV0X3BpeGVsc190YWIpKTsKKworICAgIGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKGMsIGJ1ZiwgcGFydDFfc2l6ZSk7CisgICAgYnVmICAgICAgKz0gcGFydDFfc2l6ZTsKKyAgICBidWZfc2l6ZSAtPSBwYXJ0MV9zaXplOworCisgICAgLyogQS4gRGltZW5zaW9uIGluZm9ybWF0aW9uIChrZXlmcmFtZXMgb25seSkgKi8KKyAgICBpZiAocy0+a2V5ZnJhbWUpIHsKKyAgICAgICAgd2lkdGggID0gdnA4X3JhY19nZXRfdWludChjLCAxMik7CisgICAgICAgIGhlaWdodCA9IHZwOF9yYWNfZ2V0X3VpbnQoYywgMTIpOworICAgICAgICBoc2NhbGUgPSB2cDhfcmFjX2dldF91aW50KGMsIDIpOworICAgICAgICB2c2NhbGUgPSB2cDhfcmFjX2dldF91aW50KGMsIDIpOworICAgICAgICBpZiAoaHNjYWxlIHx8IHZzY2FsZSkKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIlVwc2NhbGluZyIpOworCisgICAgICAgIHMtPnVwZGF0ZV9nb2xkZW4gPSBzLT51cGRhdGVfYWx0cmVmID0gVlA1Nl9GUkFNRV9DVVJSRU5UOworICAgICAgICB2cDc4X3Jlc2V0X3Byb2JhYmlsaXR5X3RhYmxlcyhzKTsKKyAgICAgICAgbWVtY3B5KHMtPnByb2ItPnByZWQxNngxNiwgdnA4X3ByZWQxNngxNl9wcm9iX2ludGVyLAorICAgICAgICAgICAgICAgc2l6ZW9mKHMtPnByb2ItPnByZWQxNngxNikpOworICAgICAgICBtZW1jcHkocy0+cHJvYi0+cHJlZDh4OGMsIHZwOF9wcmVkOHg4Y19wcm9iX2ludGVyLAorICAgICAgICAgICAgICAgc2l6ZW9mKHMtPnByb2ItPnByZWQ4eDhjKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICBtZW1jcHkocy0+cHJvYi0+bXZjW2ldLCB2cDdfbXZfZGVmYXVsdF9wcm9iW2ldLAorICAgICAgICAgICAgICAgICAgIHNpemVvZih2cDdfbXZfZGVmYXVsdF9wcm9iW2ldKSk7CisgICAgICAgIG1lbXNldCgmcy0+c2VnbWVudGF0aW9uLCAwLCBzaXplb2Yocy0+c2VnbWVudGF0aW9uKSk7CisgICAgICAgIG1lbXNldCgmcy0+bGZfZGVsdGEsIDAsIHNpemVvZihzLT5sZl9kZWx0YSkpOworICAgICAgICBtZW1jcHkocy0+cHJvYlswXS5zY2FuLCB6aWd6YWdfc2Nhbiwgc2l6ZW9mKHMtPnByb2JbMF0uc2NhbikpOworICAgIH0KKworICAgIGlmIChzLT5rZXlmcmFtZSB8fCBzLT5wcm9maWxlID4gMCkKKyAgICAgICAgbWVtc2V0KHMtPmludGVyX2RjX3ByZWQsIDAgLCBzaXplb2Yocy0+aW50ZXJfZGNfcHJlZCkpOworCisgICAgLyogQi4gRGVjb2RpbmcgaW5mb3JtYXRpb24gZm9yIGFsbCBmb3VyIG1hY3JvYmxvY2stbGV2ZWwgZmVhdHVyZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHMtPmZlYXR1cmVfZW5hYmxlZFtpXSA9IHZwOF9yYWNfZ2V0KGMpOworICAgICAgICBpZiAocy0+ZmVhdHVyZV9lbmFibGVkW2ldKSB7CisgICAgICAgICAgICAgcy0+ZmVhdHVyZV9wcmVzZW50X3Byb2JbaV0gPSB2cDhfcmFjX2dldF91aW50KGMsIDgpOworCisgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKKyAgICAgICAgICAgICAgICAgcy0+ZmVhdHVyZV9pbmRleF9wcm9iW2ldW2pdID0KKyAgICAgICAgICAgICAgICAgICAgIHZwOF9yYWNfZ2V0KGMpID8gdnA4X3JhY19nZXRfdWludChjLCA4KSA6IDI1NTsKKworICAgICAgICAgICAgIGlmICh2cDdfZmVhdHVyZV92YWx1ZV9zaXplW3MtPnByb2ZpbGVdW2ldKQorICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgICAgICAgICAgcy0+ZmVhdHVyZV92YWx1ZVtpXVtqXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB2cDhfcmFjX2dldChjKSA/IHZwOF9yYWNfZ2V0X3VpbnQoYywgdnA3X2ZlYXR1cmVfdmFsdWVfc2l6ZVtzLT5wcm9maWxlXVtpXSkgOiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+c2VnbWVudGF0aW9uLmVuYWJsZWQgICAgPSAwOworICAgIHMtPnNlZ21lbnRhdGlvbi51cGRhdGVfbWFwID0gMDsKKyAgICBzLT5sZl9kZWx0YS5lbmFibGVkICAgICAgICA9IDA7CisKKyAgICBzLT5udW1fY29lZmZfcGFydGl0aW9ucyA9IDE7CisgICAgZmZfdnA1Nl9pbml0X3JhbmdlX2RlY29kZXIoJnMtPmNvZWZmX3BhcnRpdGlvblswXSwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICBpZiAoIXMtPm1hY3JvYmxvY2tzX2Jhc2UgfHwgLyogZmlyc3QgZnJhbWUgKi8KKyAgICAgICAgd2lkdGggIT0gcy0+YXZjdHgtPndpZHRoIHx8IGhlaWdodCAhPSBzLT5hdmN0eC0+aGVpZ2h0IHx8CisgICAgICAgICh3aWR0aCArIDE1KSAvIDE2ICE9IHMtPm1iX3dpZHRoIHx8IChoZWlnaHQgKyAxNSkgLyAxNiAhPSBzLT5tYl9oZWlnaHQpIHsKKyAgICAgICAgaWYgKChyZXQgPSB2cDdfdXBkYXRlX2RpbWVuc2lvbnMocywgd2lkdGgsIGhlaWdodCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogQy4gRGVxdWFudGl6YXRpb24gaW5kaWNlcyAqLworICAgIHZwN19nZXRfcXVhbnRzKHMpOworCisgICAgLyogRC4gR29sZGVuIGZyYW1lIHVwZGF0ZSBmbGFnIChhIEZsYWcpIGZvciBpbnRlcmZyYW1lcyBvbmx5ICovCisgICAgaWYgKCFzLT5rZXlmcmFtZSkgeworICAgICAgICBzLT51cGRhdGVfZ29sZGVuID0gdnA4X3JhY19nZXQoYykgPyBWUDU2X0ZSQU1FX0NVUlJFTlQgOiBWUDU2X0ZSQU1FX05PTkU7CisgICAgICAgIHMtPnNpZ25fYmlhc1tWUDU2X0ZSQU1FX0dPTERFTl0gPSAwOworICAgIH0KKworICAgIHMtPnVwZGF0ZV9sYXN0ICAgICAgICAgID0gMTsKKyAgICBzLT51cGRhdGVfcHJvYmFiaWxpdGllcyA9IDE7CisgICAgcy0+ZmFkZV9wcmVzZW50ICAgICAgICAgPSAxOworCisgICAgaWYgKHMtPnByb2ZpbGUgPiAwKSB7CisgICAgICAgIHMtPnVwZGF0ZV9wcm9iYWJpbGl0aWVzID0gdnA4X3JhY19nZXQoYyk7CisgICAgICAgIGlmICghcy0+dXBkYXRlX3Byb2JhYmlsaXRpZXMpCisgICAgICAgICAgICBzLT5wcm9iWzFdID0gcy0+cHJvYlswXTsKKworICAgICAgICBpZiAoIXMtPmtleWZyYW1lKQorICAgICAgICAgICAgcy0+ZmFkZV9wcmVzZW50ID0gdnA4X3JhY19nZXQoYyk7CisgICAgfQorCisgICAgLyogRS4gRmFkaW5nIGluZm9ybWF0aW9uIGZvciBwcmV2aW91cyBmcmFtZSAqLworICAgIGlmIChzLT5mYWRlX3ByZXNlbnQgJiYgdnA4X3JhY19nZXQoYykpIHsKKyAgICAgICAgaWYgKChyZXQgPSB2cDdfZmFkZV9mcmFtZShzICxjKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBGLiBMb29wIGZpbHRlciB0eXBlICovCisgICAgaWYgKCFzLT5wcm9maWxlKQorICAgICAgICBzLT5maWx0ZXIuc2ltcGxlID0gdnA4X3JhY19nZXQoYyk7CisKKyAgICAvKiBHLiBEQ1QgY29lZmZpY2llbnQgb3JkZXJpbmcgc3BlY2lmaWNhdGlvbiAqLworICAgIGlmICh2cDhfcmFjX2dldChjKSkKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICBzLT5wcm9iWzBdLnNjYW5baV0gPSB6aWd6YWdfc2Nhblt2cDhfcmFjX2dldF91aW50KGMsIDQpXTsKKworICAgIC8qIEguIExvb3AgZmlsdGVyIGxldmVscyAgKi8KKyAgICBpZiAocy0+cHJvZmlsZSA+IDApCisgICAgICAgIHMtPmZpbHRlci5zaW1wbGUgPSB2cDhfcmFjX2dldChjKTsKKyAgICBzLT5maWx0ZXIubGV2ZWwgICAgID0gdnA4X3JhY19nZXRfdWludChjLCA2KTsKKyAgICBzLT5maWx0ZXIuc2hhcnBuZXNzID0gdnA4X3JhY19nZXRfdWludChjLCAzKTsKKworICAgIC8qIEkuIERDVCBjb2VmZmljaWVudCBwcm9iYWJpbGl0eSB1cGRhdGU7IDEzLjMgVG9rZW4gUHJvYmFiaWxpdHkgVXBkYXRlcyAqLworICAgIHZwNzhfdXBkYXRlX3Byb2JhYmlsaXR5X3RhYmxlcyhzKTsKKworICAgIHMtPm1ic2tpcF9lbmFibGVkID0gMDsKKworICAgIC8qIEouIFRoZSByZW1haW5pbmcgZnJhbWUgaGVhZGVyIGRhdGEgb2NjdXJzIE9OTFkgRk9SIElOVEVSRlJBTUVTICovCisgICAgaWYgKCFzLT5rZXlmcmFtZSkgeworICAgICAgICBzLT5wcm9iLT5pbnRyYSAgPSB2cDhfcmFjX2dldF91aW50KGMsIDgpOworICAgICAgICBzLT5wcm9iLT5sYXN0ICAgPSB2cDhfcmFjX2dldF91aW50KGMsIDgpOworICAgICAgICB2cDc4X3VwZGF0ZV9wcmVkMTZ4MTZfcHJlZDh4OF9tdmNfcHJvYmFiaWxpdGllcyhzLCBWUDdfTVZDX1NJWkUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwOF9kZWNvZGVfZnJhbWVfaGVhZGVyKFZQOENvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CisgICAgaW50IGhlYWRlcl9zaXplLCBoc2NhbGUsIHZzY2FsZSwgcmV0OworICAgIGludCB3aWR0aCAgPSBzLT5hdmN0eC0+d2lkdGg7CisgICAgaW50IGhlaWdodCA9IHMtPmF2Y3R4LT5oZWlnaHQ7CisKKyAgICBzLT5rZXlmcmFtZSAgPSAhKGJ1ZlswXSAmIDEpOworICAgIHMtPnByb2ZpbGUgICA9ICAoYnVmWzBdPj4xKSAmIDc7CisgICAgcy0+aW52aXNpYmxlID0gIShidWZbMF0gJiAweDEwKTsKKyAgICBoZWFkZXJfc2l6ZSAgPSBBVl9STDI0KGJ1ZikgPj4gNTsKKyAgICBidWYgICAgICArPSAzOworICAgIGJ1Zl9zaXplIC09IDM7CisKKyAgICBpZiAocy0+cHJvZmlsZSA+IDMpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIHByb2ZpbGUgJWRcbiIsIHMtPnByb2ZpbGUpOworCisgICAgaWYgKCFzLT5wcm9maWxlKQorICAgICAgICBtZW1jcHkocy0+cHV0X3BpeGVsc190YWIsIHMtPnZwOGRzcC5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYiwKKyAgICAgICAgICAgICAgIHNpemVvZihzLT5wdXRfcGl4ZWxzX3RhYikpOworICAgIGVsc2UgICAgLy8gcHJvZmlsZSAxLTMgdXNlIGJpbGluZWFyLCA0KyBhcmVuJ3QgZGVmaW5lZCBzbyB3aGF0ZXZlcgorICAgICAgICBtZW1jcHkocy0+cHV0X3BpeGVsc190YWIsIHMtPnZwOGRzcC5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWIsCisgICAgICAgICAgICAgICBzaXplb2Yocy0+cHV0X3BpeGVsc190YWIpKTsKKworICAgIGlmIChoZWFkZXJfc2l6ZSA+IGJ1Zl9zaXplIC0gNyAqIHMtPmtleWZyYW1lKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSGVhZGVyIHNpemUgbGFyZ2VyIHRoYW4gZGF0YSBwcm92aWRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzLT5rZXlmcmFtZSkgeworICAgICAgICBpZiAoQVZfUkwyNChidWYpICE9IDB4MmEwMTlkKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBzdGFydCBjb2RlIDB4JXhcbiIsIEFWX1JMMjQoYnVmKSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICB3aWR0aCAgICAgPSBBVl9STDE2KGJ1ZiArIDMpICYgMHgzZmZmOworICAgICAgICBoZWlnaHQgICAgPSBBVl9STDE2KGJ1ZiArIDUpICYgMHgzZmZmOworICAgICAgICBoc2NhbGUgICAgPSBidWZbNF0gPj4gNjsKKyAgICAgICAgdnNjYWxlICAgID0gYnVmWzZdID4+IDY7CisgICAgICAgIGJ1ZiAgICAgICs9IDc7CisgICAgICAgIGJ1Zl9zaXplIC09IDc7CisKKyAgICAgICAgaWYgKGhzY2FsZSB8fCB2c2NhbGUpCisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJVcHNjYWxpbmciKTsKKworICAgICAgICBzLT51cGRhdGVfZ29sZGVuID0gcy0+dXBkYXRlX2FsdHJlZiA9IFZQNTZfRlJBTUVfQ1VSUkVOVDsKKyAgICAgICAgdnA3OF9yZXNldF9wcm9iYWJpbGl0eV90YWJsZXMocyk7CisgICAgICAgIG1lbWNweShzLT5wcm9iLT5wcmVkMTZ4MTYsIHZwOF9wcmVkMTZ4MTZfcHJvYl9pbnRlciwKKyAgICAgICAgICAgICAgIHNpemVvZihzLT5wcm9iLT5wcmVkMTZ4MTYpKTsKKyAgICAgICAgbWVtY3B5KHMtPnByb2ItPnByZWQ4eDhjLCB2cDhfcHJlZDh4OGNfcHJvYl9pbnRlciwKKyAgICAgICAgICAgICAgIHNpemVvZihzLT5wcm9iLT5wcmVkOHg4YykpOworICAgICAgICBtZW1jcHkocy0+cHJvYi0+bXZjLCB2cDhfbXZfZGVmYXVsdF9wcm9iLAorICAgICAgICAgICAgICAgc2l6ZW9mKHMtPnByb2ItPm12YykpOworICAgICAgICBtZW1zZXQoJnMtPnNlZ21lbnRhdGlvbiwgMCwgc2l6ZW9mKHMtPnNlZ21lbnRhdGlvbikpOworICAgICAgICBtZW1zZXQoJnMtPmxmX2RlbHRhLCAwLCBzaXplb2Yocy0+bGZfZGVsdGEpKTsKKyAgICB9CisKKyAgICBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2RlcihjLCBidWYsIGhlYWRlcl9zaXplKTsKKyAgICBidWYgICAgICArPSBoZWFkZXJfc2l6ZTsKKyAgICBidWZfc2l6ZSAtPSBoZWFkZXJfc2l6ZTsKKworICAgIGlmIChzLT5rZXlmcmFtZSkgeworICAgICAgICBzLT5jb2xvcnNwYWNlID0gdnA4X3JhY19nZXQoYyk7CisgICAgICAgIGlmIChzLT5jb2xvcnNwYWNlKQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlVuc3BlY2lmaWVkIGNvbG9yc3BhY2VcbiIpOworICAgICAgICBzLT5mdWxscmFuZ2UgPSB2cDhfcmFjX2dldChjKTsKKyAgICB9CisKKyAgICBpZiAoKHMtPnNlZ21lbnRhdGlvbi5lbmFibGVkID0gdnA4X3JhY19nZXQoYykpKQorICAgICAgICBwYXJzZV9zZWdtZW50X2luZm8ocyk7CisgICAgZWxzZQorICAgICAgICBzLT5zZWdtZW50YXRpb24udXBkYXRlX21hcCA9IDA7IC8vIEZJWE1FOiBtb3ZlIHRoaXMgdG8gc29tZSBpbml0IGZ1bmN0aW9uPworCisgICAgcy0+ZmlsdGVyLnNpbXBsZSAgICA9IHZwOF9yYWNfZ2V0KGMpOworICAgIHMtPmZpbHRlci5sZXZlbCAgICAgPSB2cDhfcmFjX2dldF91aW50KGMsIDYpOworICAgIHMtPmZpbHRlci5zaGFycG5lc3MgPSB2cDhfcmFjX2dldF91aW50KGMsIDMpOworCisgICAgaWYgKChzLT5sZl9kZWx0YS5lbmFibGVkID0gdnA4X3JhY19nZXQoYykpKQorICAgICAgICBpZiAodnA4X3JhY19nZXQoYykpCisgICAgICAgICAgICB1cGRhdGVfbGZfZGVsdGFzKHMpOworCisgICAgaWYgKHNldHVwX3BhcnRpdGlvbnMocywgYnVmLCBidWZfc2l6ZSkpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBhcnRpdGlvbnNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoIXMtPm1hY3JvYmxvY2tzX2Jhc2UgfHwgLyogZmlyc3QgZnJhbWUgKi8KKyAgICAgICAgd2lkdGggIT0gcy0+YXZjdHgtPndpZHRoIHx8IGhlaWdodCAhPSBzLT5hdmN0eC0+aGVpZ2h0IHx8CisgICAgICAgICh3aWR0aCsxNSkvMTYgIT0gcy0+bWJfd2lkdGggfHwgKGhlaWdodCsxNSkvMTYgIT0gcy0+bWJfaGVpZ2h0KQorICAgICAgICBpZiAoKHJldCA9IHZwOF91cGRhdGVfZGltZW5zaW9ucyhzLCB3aWR0aCwgaGVpZ2h0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHZwOF9nZXRfcXVhbnRzKHMpOworCisgICAgaWYgKCFzLT5rZXlmcmFtZSkgeworICAgICAgICB1cGRhdGVfcmVmcyhzKTsKKyAgICAgICAgcy0+c2lnbl9iaWFzW1ZQNTZfRlJBTUVfR09MREVOXSAgICAgICAgICAgICAgID0gdnA4X3JhY19nZXQoYyk7CisgICAgICAgIHMtPnNpZ25fYmlhc1tWUDU2X0ZSQU1FX0dPTERFTjIgLyogYWx0cmVmICovXSA9IHZwOF9yYWNfZ2V0KGMpOworICAgIH0KKworICAgIC8vIGlmIHdlIGFyZW4ndCBzYXZpbmcgdGhpcyBmcmFtZSdzIHByb2JhYmlsaXRpZXMgZm9yIGZ1dHVyZSBmcmFtZXMsCisgICAgLy8gbWFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgcHJvYmFiaWxpdGllcworICAgIGlmICghKHMtPnVwZGF0ZV9wcm9iYWJpbGl0aWVzID0gdnA4X3JhY19nZXQoYykpKQorICAgICAgICBzLT5wcm9iWzFdID0gcy0+cHJvYlswXTsKKworICAgIHMtPnVwZGF0ZV9sYXN0ID0gcy0+a2V5ZnJhbWUgfHwgdnA4X3JhY19nZXQoYyk7CisKKyAgICB2cDc4X3VwZGF0ZV9wcm9iYWJpbGl0eV90YWJsZXMocyk7CisKKyAgICBpZiAoKHMtPm1ic2tpcF9lbmFibGVkID0gdnA4X3JhY19nZXQoYykpKQorICAgICAgICBzLT5wcm9iLT5tYnNraXAgPSB2cDhfcmFjX2dldF91aW50KGMsIDgpOworCisgICAgaWYgKCFzLT5rZXlmcmFtZSkgeworICAgICAgICBzLT5wcm9iLT5pbnRyYSAgPSB2cDhfcmFjX2dldF91aW50KGMsIDgpOworICAgICAgICBzLT5wcm9iLT5sYXN0ICAgPSB2cDhfcmFjX2dldF91aW50KGMsIDgpOworICAgICAgICBzLT5wcm9iLT5nb2xkZW4gPSB2cDhfcmFjX2dldF91aW50KGMsIDgpOworICAgICAgICB2cDc4X3VwZGF0ZV9wcmVkMTZ4MTZfcHJlZDh4OF9tdmNfcHJvYmFiaWxpdGllcyhzLCBWUDhfTVZDX1NJWkUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZQordm9pZCBjbGFtcF9tdihWUDhDb250ZXh0ICpzLCBWUDU2bXYgKmRzdCwgY29uc3QgVlA1Nm12ICpzcmMpCit7CisgICAgZHN0LT54ID0gYXZfY2xpcChzcmMtPngsIHMtPm12X21pbi54LCBzLT5tdl9tYXgueCk7CisgICAgZHN0LT55ID0gYXZfY2xpcChzcmMtPnksIHMtPm12X21pbi55LCBzLT5tdl9tYXgueSk7Cit9CisKKy8qKgorICogTW90aW9uIHZlY3RvciBjb2RpbmcsIDE3LjEuCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCByZWFkX212X2NvbXBvbmVudChWUDU2UmFuZ2VDb2RlciAqYywgY29uc3QgdWludDhfdCAqcCwgaW50IHZwNykKK3sKKyAgICBpbnQgYml0LCB4ID0gMDsKKworICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHBbMF0pKSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICB4ICs9IHZwNTZfcmFjX2dldF9wcm9iKGMsIHBbOSArIGldKSA8PCBpOworICAgICAgICBmb3IgKGkgPSAodnA3ID8gNyA6IDkpOyBpID4gMzsgaS0tKQorICAgICAgICAgICAgeCArPSB2cDU2X3JhY19nZXRfcHJvYihjLCBwWzkgKyBpXSkgPDwgaTsKKyAgICAgICAgaWYgKCEoeCAmICh2cDcgPyAweEYwIDogMHhGRkYwKSkgfHwgdnA1Nl9yYWNfZ2V0X3Byb2IoYywgcFsxMl0pKQorICAgICAgICAgICAgeCArPSA4OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHNtYWxsX212dHJlZQorICAgICAgICBjb25zdCB1aW50OF90ICpwcyA9IHAgKyAyOworICAgICAgICBiaXQgPSB2cDU2X3JhY19nZXRfcHJvYihjLCAqcHMpOworICAgICAgICBwcyArPSAxICsgMyAqIGJpdDsKKyAgICAgICAgeCAgKz0gNCAqIGJpdDsKKyAgICAgICAgYml0ID0gdnA1Nl9yYWNfZ2V0X3Byb2IoYywgKnBzKTsKKyAgICAgICAgcHMgKz0gMSArIGJpdDsKKyAgICAgICAgeCAgKz0gMiAqIGJpdDsKKyAgICAgICAgeCAgKz0gdnA1Nl9yYWNfZ2V0X3Byb2IoYywgKnBzKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHggJiYgdnA1Nl9yYWNfZ2V0X3Byb2IoYywgcFsxXSkpID8gLXggOiB4OworfQorCitzdGF0aWMgaW50IHZwN19yZWFkX212X2NvbXBvbmVudChWUDU2UmFuZ2VDb2RlciAqYywgY29uc3QgdWludDhfdCAqcCkKK3sKKyAgICByZXR1cm4gcmVhZF9tdl9jb21wb25lbnQoYywgcCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgdnA4X3JlYWRfbXZfY29tcG9uZW50KFZQNTZSYW5nZUNvZGVyICpjLCBjb25zdCB1aW50OF90ICpwKQoreworICAgIHJldHVybiByZWFkX212X2NvbXBvbmVudChjLCBwLCAwKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK2NvbnN0IHVpbnQ4X3QgKmdldF9zdWJtdl9wcm9iKHVpbnQzMl90IGxlZnQsIHVpbnQzMl90IHRvcCwgaW50IGlzX3ZwNykKK3sKKyAgICBpZiAoaXNfdnA3KQorICAgICAgICByZXR1cm4gdnA3X3N1Ym12X3Byb2I7CisKKyAgICBpZiAobGVmdCA9PSB0b3ApCisgICAgICAgIHJldHVybiB2cDhfc3VibXZfcHJvYls0IC0gISFsZWZ0XTsKKyAgICBpZiAoIXRvcCkKKyAgICAgICAgcmV0dXJuIHZwOF9zdWJtdl9wcm9iWzJdOworICAgIHJldHVybiB2cDhfc3VibXZfcHJvYlsxIC0gISFsZWZ0XTsKK30KKworLyoqCisgKiBTcGxpdCBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIDE2LjQuCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1vdGlvbiB2ZWN0b3JzIHBhcnNlZCAoMiwgNCBvciAxNikKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK2ludCBkZWNvZGVfc3BsaXRtdnMoVlA4Q29udGV4dCAqcywgVlA1NlJhbmdlQ29kZXIgKmMsIFZQOE1hY3JvYmxvY2sgKm1iLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGF5b3V0LCBpbnQgaXNfdnA3KQoreworICAgIGludCBwYXJ0X2lkeDsKKyAgICBpbnQgbiwgbnVtOworICAgIFZQOE1hY3JvYmxvY2sgKnRvcF9tYjsKKyAgICBWUDhNYWNyb2Jsb2NrICpsZWZ0X21iID0gJm1iWy0xXTsKKyAgICBjb25zdCB1aW50OF90ICptYnNwbGl0c19sZWZ0ID0gdnA4X21ic3BsaXRzW2xlZnRfbWItPnBhcnRpdGlvbmluZ107CisgICAgY29uc3QgdWludDhfdCAqbWJzcGxpdHNfdG9wLCAqbWJzcGxpdHNfY3VyLCAqZmlyc3RpZHg7CisgICAgVlA1Nm12ICp0b3BfbXY7CisgICAgVlA1Nm12ICpsZWZ0X212ID0gbGVmdF9tYi0+Ym12OworICAgIFZQNTZtdiAqY3VyX212ICA9IG1iLT5ibXY7CisKKyAgICBpZiAoIWxheW91dCkgLy8gbGF5b3V0IGlzIGlubGluZWQsIHMtPm1iX2xheW91dCBpcyBub3QKKyAgICAgICAgdG9wX21iID0gJm1iWzJdOworICAgIGVsc2UKKyAgICAgICAgdG9wX21iID0gJm1iWy1zLT5tYl93aWR0aCAtIDFdOworICAgIG1ic3BsaXRzX3RvcCA9IHZwOF9tYnNwbGl0c1t0b3BfbWItPnBhcnRpdGlvbmluZ107CisgICAgdG9wX212ICAgICAgID0gdG9wX21iLT5ibXY7CisKKyAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB2cDhfbWJzcGxpdF9wcm9iWzBdKSkgeworICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB2cDhfbWJzcGxpdF9wcm9iWzFdKSkKKyAgICAgICAgICAgIHBhcnRfaWR4ID0gVlA4X1NQTElUTVZNT0RFXzE2eDggKyB2cDU2X3JhY19nZXRfcHJvYihjLCB2cDhfbWJzcGxpdF9wcm9iWzJdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGFydF9pZHggPSBWUDhfU1BMSVRNVk1PREVfOHg4OworICAgIH0gZWxzZSB7CisgICAgICAgIHBhcnRfaWR4ID0gVlA4X1NQTElUTVZNT0RFXzR4NDsKKyAgICB9CisKKyAgICBudW0gICAgICAgICAgICAgID0gdnA4X21ic3BsaXRfY291bnRbcGFydF9pZHhdOworICAgIG1ic3BsaXRzX2N1ciAgICAgPSB2cDhfbWJzcGxpdHNbcGFydF9pZHhdLAorICAgIGZpcnN0aWR4ICAgICAgICAgPSB2cDhfbWJmaXJzdGlkeFtwYXJ0X2lkeF07CisgICAgbWItPnBhcnRpdGlvbmluZyA9IHBhcnRfaWR4OworCisgICAgZm9yIChuID0gMDsgbiA8IG51bTsgbisrKSB7CisgICAgICAgIGludCBrID0gZmlyc3RpZHhbbl07CisgICAgICAgIHVpbnQzMl90IGxlZnQsIGFib3ZlOworICAgICAgICBjb25zdCB1aW50OF90ICpzdWJtdl9wcm9iOworCisgICAgICAgIGlmICghKGsgJiAzKSkKKyAgICAgICAgICAgIGxlZnQgPSBBVl9STjMyQSgmbGVmdF9tdlttYnNwbGl0c19sZWZ0W2sgKyAzXV0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsZWZ0ID0gQVZfUk4zMkEoJmN1cl9tdlttYnNwbGl0c19jdXJbayAtIDFdXSk7CisgICAgICAgIGlmIChrIDw9IDMpCisgICAgICAgICAgICBhYm92ZSA9IEFWX1JOMzJBKCZ0b3BfbXZbbWJzcGxpdHNfdG9wW2sgKyAxMl1dKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWJvdmUgPSBBVl9STjMyQSgmY3VyX212W21ic3BsaXRzX2N1cltrIC0gNF1dKTsKKworICAgICAgICBzdWJtdl9wcm9iID0gZ2V0X3N1Ym12X3Byb2IobGVmdCwgYWJvdmUsIGlzX3ZwNyk7CisKKyAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgc3VibXZfcHJvYlswXSkpIHsKKyAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHN1Ym12X3Byb2JbMV0pKSB7CisgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgc3VibXZfcHJvYlsyXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWItPmJtdltuXS55ID0gbWItPm12LnkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX212X2NvbXBvbmVudChjLCBzLT5wcm9iLT5tdmNbMF0sIGlzX3ZwNyk7CisgICAgICAgICAgICAgICAgICAgIG1iLT5ibXZbbl0ueCA9IG1iLT5tdi54ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9tdl9jb21wb25lbnQoYywgcy0+cHJvYi0+bXZjWzFdLCBpc192cDcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFWX1pFUk8zMigmbWItPmJtdltuXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBVl9XTjMyQSgmbWItPmJtdltuXSwgYWJvdmUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVZfV04zMkEoJm1iLT5ibXZbbl0sIGxlZnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bTsKK30KKworLyoqCisgKiBUaGUgdnA3IHJlZmVyZW5jZSBkZWNvZGVyIHVzZXMgYSBwYWRkaW5nIG1hY3JvYmxvY2sgY29sdW1uIChhZGRlZCB0byByaWdodAorICogZWRnZSBvZiB0aGUgZnJhbWUpIHRvIGd1YXJkIGFnYWluc3QgaWxsZWdhbCBtYWNyb2Jsb2NrIG9mZnNldHMuIFRoZQorICogYWxnb3JpdGhtIGhhcyBidWdzIHRoYXQgcGVybWl0IG9mZnNldHMgdG8gc3RyYWRkbGUgdGhlIHBhZGRpbmcgY29sdW1uLgorICogVGhpcyBmdW5jdGlvbiByZXBsaWNhdGVzIHRob3NlIGJ1Z3MuCisgKgorICogQHBhcmFtW291dF0gZWRnZV94IG1hY3JvYmxvY2sgeCBhZGRyZXNzCisgKiBAcGFyYW1bb3V0XSBlZGdlX3kgbWFjcm9ibG9jayB5IGFkZHJlc3MKKyAqCisgKiBAcmV0dXJuIG1hY3JvYmxvY2sgb2Zmc2V0IGxlZ2FsIChib29sZWFuKQorICovCitzdGF0aWMgaW50IHZwN19jYWxjdWxhdGVfbWJfb2Zmc2V0KGludCBtYl94LCBpbnQgbWJfeSwgaW50IG1iX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeG9mZnNldCwgaW50IHlvZmZzZXQsIGludCBib3VuZGFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplZGdlX3gsIGludCAqZWRnZV95KQoreworICAgIGludCB2d2lkdGggPSBtYl93aWR0aCArIDE7CisgICAgaW50IG5ldyA9IChtYl95ICsgeW9mZnNldCkgKiB2d2lkdGggKyBtYl94ICsgeG9mZnNldDsKKyAgICBpZiAobmV3IDwgYm91bmRhcnkgfHwgbmV3ICUgdndpZHRoID09IHZ3aWR0aCAtIDEpCisgICAgICAgIHJldHVybiAwOworICAgICplZGdlX3kgPSBuZXcgLyB2d2lkdGg7CisgICAgKmVkZ2VfeCA9IG5ldyAlIHZ3aWR0aDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IFZQNTZtdiAqZ2V0X2Jtdl9wdHIoY29uc3QgVlA4TWFjcm9ibG9jayAqbWIsIGludCBzdWJibG9jaykKK3sKKyAgICByZXR1cm4gJm1iLT5ibXZbbWItPm1vZGUgPT0gVlA4X01WTU9ERV9TUExJVCA/IHZwOF9tYnNwbGl0c1ttYi0+cGFydGl0aW9uaW5nXVtzdWJibG9ja10gOiAwXTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgdnA3X2RlY29kZV9tdnMoVlA4Q29udGV4dCAqcywgVlA4TWFjcm9ibG9jayAqbWIsCisgICAgICAgICAgICAgICAgICAgIGludCBtYl94LCBpbnQgbWJfeSwgaW50IGxheW91dCkKK3sKKyAgICBWUDhNYWNyb2Jsb2NrICptYl9lZGdlWzEyXTsKKyAgICBlbnVtIHsgQ05UX1pFUk8sIENOVF9ORUFSRVNULCBDTlRfTkVBUiB9OworICAgIGVudW0geyBWUDhfRURHRV9UT1AsIFZQOF9FREdFX0xFRlQsIFZQOF9FREdFX1RPUExFRlQgfTsKKyAgICBpbnQgaWR4ID0gQ05UX1pFUk87CisgICAgVlA1Nm12IG5lYXJfbXZbM107CisgICAgdWludDhfdCBjbnRbM10gPSB7IDAgfTsKKyAgICBWUDU2UmFuZ2VDb2RlciAqYyA9ICZzLT5jOworICAgIGludCBpOworCisgICAgQVZfWkVSTzMyKCZuZWFyX212WzBdKTsKKyAgICBBVl9aRVJPMzIoJm5lYXJfbXZbMV0pOworICAgIEFWX1pFUk8zMigmbmVhcl9tdlsyXSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVlA3X01WX1BSRURfQ09VTlQ7IGkrKykgeworICAgICAgICBjb25zdCBWUDdNVlByZWQgKiBwcmVkID0gJnZwN19tdl9wcmVkW2ldOworICAgICAgICBpbnQgZWRnZV94LCBlZGdlX3k7CisKKyAgICAgICAgaWYgKHZwN19jYWxjdWxhdGVfbWJfb2Zmc2V0KG1iX3gsIG1iX3ksIHMtPm1iX3dpZHRoLCBwcmVkLT54b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZC0+eW9mZnNldCwgIXMtPnByb2ZpbGUsICZlZGdlX3gsICZlZGdlX3kpKSB7CisgICAgICAgICAgICBWUDhNYWNyb2Jsb2NrICplZGdlID0gbWJfZWRnZVtpXSA9IChzLT5tYl9sYXlvdXQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcy0+bWFjcm9ibG9ja3NfYmFzZSArIDEgKyBlZGdlX3ggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+bWJfd2lkdGggKyAxKSAqIChlZGdlX3kgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzLT5tYWNyb2Jsb2NrcyArIGVkZ2VfeCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tYl9oZWlnaHQgLSBlZGdlX3kgLSAxKSAqIDI7CisgICAgICAgICAgICB1aW50MzJfdCBtdiA9IEFWX1JOMzJBKGdldF9ibXZfcHRyKGVkZ2UsIHZwN19tdl9wcmVkW2ldLnN1YmJsb2NrKSk7CisgICAgICAgICAgICBpZiAobXYpIHsKKyAgICAgICAgICAgICAgICBpZiAoQVZfUk4zMkEoJm5lYXJfbXZbQ05UX05FQVJFU1RdKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobXYgPT0gQVZfUk4zMkEoJm5lYXJfbXZbQ05UX05FQVJFU1RdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gQ05UX05FQVJFU1Q7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVZfUk4zMkEoJm5lYXJfbXZbQ05UX05FQVJdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG12ICE9IEFWX1JOMzJBKCZuZWFyX212W0NOVF9ORUFSXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBDTlRfTkVBUjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dOMzJBKCZuZWFyX212W0NOVF9ORUFSXSwgbXYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gQ05UX05FQVI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQSgmbmVhcl9tdltDTlRfTkVBUkVTVF0sIG12KTsKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gQ05UX05FQVJFU1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZHggPSBDTlRfWkVSTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlkeCA9IENOVF9aRVJPOworICAgICAgICB9CisgICAgICAgIGNudFtpZHhdICs9IHZwN19tdl9wcmVkW2ldLnNjb3JlOworICAgIH0KKworICAgIG1iLT5wYXJ0aXRpb25pbmcgPSBWUDhfU1BMSVRNVk1PREVfTk9ORTsKKworICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHZwN19tb2RlX2NvbnRleHRzW2NudFtDTlRfWkVST11dWzBdKSkgeworICAgICAgICBtYi0+bW9kZSA9IFZQOF9NVk1PREVfTVY7CisKKyAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdnA3X21vZGVfY29udGV4dHNbY250W0NOVF9ORUFSRVNUXV1bMV0pKSB7CisKKyAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHZwN19tb2RlX2NvbnRleHRzW2NudFtDTlRfTkVBUl1dWzJdKSkgeworCisgICAgICAgICAgICAgICAgaWYgKGNudFtDTlRfTkVBUkVTVF0gPiBjbnRbQ05UX05FQVJdKQorICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQSgmbWItPm12LCBjbnRbQ05UX1pFUk9dID4gY250W0NOVF9ORUFSRVNUXSA/IDAgOiBBVl9STjMyQSgmbmVhcl9tdltDTlRfTkVBUkVTVF0pKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIEFWX1dOMzJBKCZtYi0+bXYsIGNudFtDTlRfWkVST10gPiBjbnRbQ05UX05FQVJdICAgID8gMCA6IEFWX1JOMzJBKCZuZWFyX212W0NOVF9ORUFSXSkpOworCisgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdnA3X21vZGVfY29udGV4dHNbY250W0NOVF9ORUFSXV1bM10pKSB7CisgICAgICAgICAgICAgICAgICAgIG1iLT5tb2RlID0gVlA4X01WTU9ERV9TUExJVDsKKyAgICAgICAgICAgICAgICAgICAgbWItPm12ID0gbWItPmJtdltkZWNvZGVfc3BsaXRtdnMocywgYywgbWIsIGxheW91dCwgSVNfVlA3KSAtIDFdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1iLT5tdi55ICs9IHZwN19yZWFkX212X2NvbXBvbmVudChjLCBzLT5wcm9iLT5tdmNbMF0pOworICAgICAgICAgICAgICAgICAgICBtYi0+bXYueCArPSB2cDdfcmVhZF9tdl9jb21wb25lbnQoYywgcy0+cHJvYi0+bXZjWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgbWItPmJtdlswXSA9IG1iLT5tdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1iLT5tdiA9IG5lYXJfbXZbQ05UX05FQVJdOworICAgICAgICAgICAgICAgIG1iLT5ibXZbMF0gPSBtYi0+bXY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYi0+bXYgPSBuZWFyX212W0NOVF9ORUFSRVNUXTsKKyAgICAgICAgICAgIG1iLT5ibXZbMF0gPSBtYi0+bXY7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtYi0+bW9kZSA9IFZQOF9NVk1PREVfWkVSTzsKKyAgICAgICAgQVZfWkVSTzMyKCZtYi0+bXYpOworICAgICAgICBtYi0+Ym12WzBdID0gbWItPm12OworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgdnA4X2RlY29kZV9tdnMoVlA4Q29udGV4dCAqcywgVlA4TWFjcm9ibG9jayAqbWIsCisgICAgICAgICAgICAgICAgICAgIGludCBtYl94LCBpbnQgbWJfeSwgaW50IGxheW91dCkKK3sKKyAgICBWUDhNYWNyb2Jsb2NrICptYl9lZGdlWzNdID0geyAwICAgICAgLyogdG9wICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iIC0gMSAvKiBsZWZ0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAvKiB0b3AtbGVmdCAqLyB9OworICAgIGVudW0geyBDTlRfWkVSTywgQ05UX05FQVJFU1QsIENOVF9ORUFSLCBDTlRfU1BMSVRNViB9OworICAgIGVudW0geyBWUDhfRURHRV9UT1AsIFZQOF9FREdFX0xFRlQsIFZQOF9FREdFX1RPUExFRlQgfTsKKyAgICBpbnQgaWR4ID0gQ05UX1pFUk87CisgICAgaW50IGN1cl9zaWduX2JpYXMgPSBzLT5zaWduX2JpYXNbbWItPnJlZl9mcmFtZV07CisgICAgaW50OF90ICpzaWduX2JpYXMgPSBzLT5zaWduX2JpYXM7CisgICAgVlA1Nm12IG5lYXJfbXZbNF07CisgICAgdWludDhfdCBjbnRbNF0gPSB7IDAgfTsKKyAgICBWUDU2UmFuZ2VDb2RlciAqYyA9ICZzLT5jOworCisgICAgaWYgKCFsYXlvdXQpIHsgLy8gbGF5b3V0IGlzIGlubGluZWQgKHMtPm1iX2xheW91dCBpcyBub3QpCisgICAgICAgIG1iX2VkZ2VbMF0gPSBtYiArIDI7CisgICAgICAgIG1iX2VkZ2VbMl0gPSBtYiArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWJfZWRnZVswXSA9IG1iIC0gcy0+bWJfd2lkdGggLSAxOworICAgICAgICBtYl9lZGdlWzJdID0gbWIgLSBzLT5tYl93aWR0aCAtIDI7CisgICAgfQorCisgICAgQVZfWkVSTzMyKCZuZWFyX212WzBdKTsKKyAgICBBVl9aRVJPMzIoJm5lYXJfbXZbMV0pOworICAgIEFWX1pFUk8zMigmbmVhcl9tdlsyXSk7CisKKyAgICAvKiBQcm9jZXNzIE1CIG9uIHRvcCwgbGVmdCBhbmQgdG9wLWxlZnQgKi8KKyNkZWZpbmUgTVZfRURHRV9DSEVDSyhuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVlA4TWFjcm9ibG9jayAqZWRnZSA9IG1iX2VkZ2Vbbl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGVkZ2VfcmVmID0gZWRnZS0+cmVmX2ZyYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGVkZ2VfcmVmICE9IFZQNTZfRlJBTUVfQ1VSUkVOVCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQzMl90IG12ID0gQVZfUk4zMkEoJmVkZ2UtPm12KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChtdikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoY3VyX3NpZ25fYmlhcyAhPSBzaWduX2JpYXNbZWRnZV9yZWZdKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgLyogU1dBUiBuZWdhdGUgb2YgdGhlIHZhbHVlcyBpbiBtdi4gKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgbXYgPSB+bXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgbXYgPSAoKG12ICYgMHg3ZmZmN2ZmZikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMSkgXiAobXYgJiAweDgwMDA4MDAwKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoIW4gfHwgbXYgIT0gQVZfUk4zMkEoJm5lYXJfbXZbaWR4XSkpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEoJm5lYXJfbXZbKytpZHhdLCBtdik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjbnRbaWR4XSArPSAxICsgKG4gIT0gMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjbnRbQ05UX1pFUk9dICs9IDEgKyAobiAhPSAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyAgICBNVl9FREdFX0NIRUNLKDApCisgICAgTVZfRURHRV9DSEVDSygxKQorICAgIE1WX0VER0VfQ0hFQ0soMikKKworICAgIG1iLT5wYXJ0aXRpb25pbmcgPSBWUDhfU1BMSVRNVk1PREVfTk9ORTsKKyAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB2cDhfbW9kZV9jb250ZXh0c1tjbnRbQ05UX1pFUk9dXVswXSkpIHsKKyAgICAgICAgbWItPm1vZGUgPSBWUDhfTVZNT0RFX01WOworCisgICAgICAgIC8qIElmIHdlIGhhdmUgdGhyZWUgZGlzdGluY3QgTVZzLCBtZXJnZSBmaXJzdCBhbmQgbGFzdCBpZiB0aGV5J3JlIHRoZSBzYW1lICovCisgICAgICAgIGlmIChjbnRbQ05UX1NQTElUTVZdICYmCisgICAgICAgICAgICBBVl9STjMyQSgmbmVhcl9tdlsxICsgVlA4X0VER0VfVE9QXSkgPT0gQVZfUk4zMkEoJm5lYXJfbXZbMSArIFZQOF9FREdFX1RPUExFRlRdKSkKKyAgICAgICAgICAgIGNudFtDTlRfTkVBUkVTVF0gKz0gMTsKKworICAgICAgICAvKiBTd2FwIG5lYXIgYW5kIG5lYXJlc3QgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgIGlmIChjbnRbQ05UX05FQVJdID4gY250W0NOVF9ORUFSRVNUXSkgeworICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QsICAgICBjbnRbQ05UX05FQVJFU1RdLCAgICAgY250W0NOVF9ORUFSXSk7CisgICAgICAgICAgICBGRlNXQVAoIFZQNTZtdiwgbmVhcl9tdltDTlRfTkVBUkVTVF0sIG5lYXJfbXZbQ05UX05FQVJdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHZwOF9tb2RlX2NvbnRleHRzW2NudFtDTlRfTkVBUkVTVF1dWzFdKSkgeworICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdnA4X21vZGVfY29udGV4dHNbY250W0NOVF9ORUFSXV1bMl0pKSB7CisgICAgICAgICAgICAgICAgLyogQ2hvb3NlIHRoZSBiZXN0IG12IG91dCBvZiAwLDAgYW5kIHRoZSBuZWFyZXN0IG12ICovCisgICAgICAgICAgICAgICAgY2xhbXBfbXYocywgJm1iLT5tdiwgJm5lYXJfbXZbQ05UX1pFUk8gKyAoY250W0NOVF9ORUFSRVNUXSA+PSBjbnRbQ05UX1pFUk9dKV0pOworICAgICAgICAgICAgICAgIGNudFtDTlRfU1BMSVRNVl0gPSAoKG1iX2VkZ2VbVlA4X0VER0VfTEVGVF0tPm1vZGUgICAgPT0gVlA4X01WTU9ERV9TUExJVCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1iX2VkZ2VbVlA4X0VER0VfVE9QXS0+bW9kZSAgICAgPT0gVlA4X01WTU9ERV9TUExJVCkpICogMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWJfZWRnZVtWUDhfRURHRV9UT1BMRUZUXS0+bW9kZSA9PSBWUDhfTVZNT0RFX1NQTElUKTsKKworICAgICAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHZwOF9tb2RlX2NvbnRleHRzW2NudFtDTlRfU1BMSVRNVl1dWzNdKSkgeworICAgICAgICAgICAgICAgICAgICBtYi0+bW9kZSA9IFZQOF9NVk1PREVfU1BMSVQ7CisgICAgICAgICAgICAgICAgICAgIG1iLT5tdiA9IG1iLT5ibXZbZGVjb2RlX3NwbGl0bXZzKHMsIGMsIG1iLCBsYXlvdXQsIElTX1ZQOCkgLSAxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtYi0+bXYueSAgKz0gdnA4X3JlYWRfbXZfY29tcG9uZW50KGMsIHMtPnByb2ItPm12Y1swXSk7CisgICAgICAgICAgICAgICAgICAgIG1iLT5tdi54ICArPSB2cDhfcmVhZF9tdl9jb21wb25lbnQoYywgcy0+cHJvYi0+bXZjWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgbWItPmJtdlswXSA9IG1iLT5tdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNsYW1wX212KHMsICZtYi0+bXYsICZuZWFyX212W0NOVF9ORUFSXSk7CisgICAgICAgICAgICAgICAgbWItPmJtdlswXSA9IG1iLT5tdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsYW1wX212KHMsICZtYi0+bXYsICZuZWFyX212W0NOVF9ORUFSRVNUXSk7CisgICAgICAgICAgICBtYi0+Ym12WzBdID0gbWItPm12OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWItPm1vZGUgPSBWUDhfTVZNT0RFX1pFUk87CisgICAgICAgIEFWX1pFUk8zMigmbWItPm12KTsKKyAgICAgICAgbWItPmJtdlswXSA9IG1iLT5tdjsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIGRlY29kZV9pbnRyYTR4NF9tb2RlcyhWUDhDb250ZXh0ICpzLCBWUDU2UmFuZ2VDb2RlciAqYywgVlA4TWFjcm9ibG9jayAqbWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfeCwgaW50IGtleWZyYW1lLCBpbnQgbGF5b3V0KQoreworICAgIHVpbnQ4X3QgKmludHJhNHg0ID0gbWItPmludHJhNHg0X3ByZWRfbW9kZV9tYjsKKworICAgIGlmIChsYXlvdXQpIHsKKyAgICAgICAgVlA4TWFjcm9ibG9jayAqbWJfdG9wID0gbWIgLSBzLT5tYl93aWR0aCAtIDE7CisgICAgICAgIG1lbWNweShtYi0+aW50cmE0eDRfcHJlZF9tb2RlX3RvcCwgbWJfdG9wLT5pbnRyYTR4NF9wcmVkX21vZGVfdG9wLCA0KTsKKyAgICB9CisgICAgaWYgKGtleWZyYW1lKSB7CisgICAgICAgIGludCB4LCB5OworICAgICAgICB1aW50OF90ICp0b3A7CisgICAgICAgIHVpbnQ4X3QgKmNvbnN0IGxlZnQgPSBzLT5pbnRyYTR4NF9wcmVkX21vZGVfbGVmdDsKKyAgICAgICAgaWYgKGxheW91dCkKKyAgICAgICAgICAgIHRvcCA9IG1iLT5pbnRyYTR4NF9wcmVkX21vZGVfdG9wOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0b3AgPSBzLT5pbnRyYTR4NF9wcmVkX21vZGVfdG9wICsgNCAqIG1iX3g7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdHg7CisgICAgICAgICAgICAgICAgY3R4ICAgICAgID0gdnA4X3ByZWQ0eDRfcHJvYl9pbnRyYVt0b3BbeF1dW2xlZnRbeV1dOworICAgICAgICAgICAgICAgICppbnRyYTR4NCA9IHZwOF9yYWNfZ2V0X3RyZWUoYywgdnA4X3ByZWQ0eDRfdHJlZSwgY3R4KTsKKyAgICAgICAgICAgICAgICBsZWZ0W3ldICAgPSB0b3BbeF0gPSAqaW50cmE0eDQ7CisgICAgICAgICAgICAgICAgaW50cmE0eDQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIGludHJhNHg0W2ldID0gdnA4X3JhY19nZXRfdHJlZShjLCB2cDhfcHJlZDR4NF90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOF9wcmVkNHg0X3Byb2JfaW50ZXIpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgZGVjb2RlX21iX21vZGUoVlA4Q29udGV4dCAqcywgVlA4TWFjcm9ibG9jayAqbWIsIGludCBtYl94LCBpbnQgbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc2VnbWVudCwgdWludDhfdCAqcmVmLCBpbnQgbGF5b3V0LCBpbnQgaXNfdnA3KQoreworICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CisgICAgY29uc3QgY2hhciAqdnA3X2ZlYXR1cmVfbmFtZVtdID0geyAicS1pbmRleCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGYtZGVsdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpYWwtZ29sZGVuLXVwZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmxpdC1waXRjaCIgfTsKKyAgICBpZiAoaXNfdnA3KSB7CisgICAgICAgIGludCBpOworICAgICAgICAqc2VnbWVudCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5mZWF0dXJlX2VuYWJsZWRbaV0pIHsKKyAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCBzLT5mZWF0dXJlX3ByZXNlbnRfcHJvYltpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB2cDhfcmFjX2dldF90cmVlKGMsIHZwN19mZWF0dXJlX2luZGV4X3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mZWF0dXJlX2luZGV4X3Byb2JbaV0pOworICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGZWF0dXJlICVzIHByZXNlbnQgaW4gbWFjcm9ibG9jayAodmFsdWUgMHgleClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwN19mZWF0dXJlX25hbWVbaV0sIHMtPmZlYXR1cmVfdmFsdWVbaV1baW5kZXhdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocy0+c2VnbWVudGF0aW9uLnVwZGF0ZV9tYXApIHsKKyAgICAgICAgaW50IGJpdCAgPSB2cDU2X3JhY19nZXRfcHJvYihjLCBzLT5wcm9iLT5zZWdtZW50aWRbMF0pOworICAgICAgICAqc2VnbWVudCA9IHZwNTZfcmFjX2dldF9wcm9iKGMsIHMtPnByb2ItPnNlZ21lbnRpZFsxK2JpdF0pICsgMipiaXQ7CisgICAgfSBlbHNlIGlmIChzLT5zZWdtZW50YXRpb24uZW5hYmxlZCkKKyAgICAgICAgKnNlZ21lbnQgPSByZWYgPyAqcmVmIDogKnNlZ21lbnQ7CisgICAgbWItPnNlZ21lbnQgPSAqc2VnbWVudDsKKworICAgIG1iLT5za2lwID0gcy0+bWJza2lwX2VuYWJsZWQgPyB2cDU2X3JhY19nZXRfcHJvYihjLCBzLT5wcm9iLT5tYnNraXApIDogMDsKKworICAgIGlmIChzLT5rZXlmcmFtZSkgeworICAgICAgICBtYi0+bW9kZSA9IHZwOF9yYWNfZ2V0X3RyZWUoYywgdnA4X3ByZWQxNngxNl90cmVlX2ludHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA4X3ByZWQxNngxNl9wcm9iX2ludHJhKTsKKworICAgICAgICBpZiAobWItPm1vZGUgPT0gTU9ERV9JNHg0KSB7CisgICAgICAgICAgICBkZWNvZGVfaW50cmE0eDRfbW9kZXMocywgYywgbWIsIG1iX3gsIDEsIGxheW91dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtb2RlcyA9IChpc192cDcgPyB2cDdfcHJlZDR4NF9tb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB2cDhfcHJlZDR4NF9tb2RlKVttYi0+bW9kZV0gKiAweDAxMDEwMTAxdTsKKyAgICAgICAgICAgIGlmIChzLT5tYl9sYXlvdXQpCisgICAgICAgICAgICAgICAgQVZfV04zMkEobWItPmludHJhNHg0X3ByZWRfbW9kZV90b3AsIG1vZGVzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBVl9XTjMyQShzLT5pbnRyYTR4NF9wcmVkX21vZGVfdG9wICsgNCAqIG1iX3gsIG1vZGVzKTsKKyAgICAgICAgICAgIEFWX1dOMzJBKHMtPmludHJhNHg0X3ByZWRfbW9kZV9sZWZ0LCBtb2Rlcyk7CisgICAgICAgIH0KKworICAgICAgICBtYi0+Y2hyb21hX3ByZWRfbW9kZSA9IHZwOF9yYWNfZ2V0X3RyZWUoYywgdnA4X3ByZWQ4eDhjX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDhfcHJlZDh4OGNfcHJvYl9pbnRyYSk7CisgICAgICAgIG1iLT5yZWZfZnJhbWUgICAgICAgID0gVlA1Nl9GUkFNRV9DVVJSRU5UOworICAgIH0gZWxzZSBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCBzLT5wcm9iLT5pbnRyYSkpIHsKKyAgICAgICAgLy8gaW50ZXIgTUIsIDE2LjIKKyAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgcy0+cHJvYi0+bGFzdCkpCisgICAgICAgICAgICBtYi0+cmVmX2ZyYW1lID0KKyAgICAgICAgICAgICAgICAoIWlzX3ZwNyAmJiB2cDU2X3JhY19nZXRfcHJvYihjLCBzLT5wcm9iLT5nb2xkZW4pKSA/IFZQNTZfRlJBTUVfR09MREVOMiAvKiBhbHRyZWYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZQNTZfRlJBTUVfR09MREVOOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtYi0+cmVmX2ZyYW1lID0gVlA1Nl9GUkFNRV9QUkVWSU9VUzsKKyAgICAgICAgcy0+cmVmX2NvdW50W21iLT5yZWZfZnJhbWUgLSAxXSsrOworCisgICAgICAgIC8vIG1vdGlvbiB2ZWN0b3JzLCAxNi4zCisgICAgICAgIGlmIChpc192cDcpCisgICAgICAgICAgICB2cDdfZGVjb2RlX212cyhzLCBtYiwgbWJfeCwgbWJfeSwgbGF5b3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdnA4X2RlY29kZV9tdnMocywgbWIsIG1iX3gsIG1iX3ksIGxheW91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gaW50cmEgTUIsIDE2LjEKKyAgICAgICAgbWItPm1vZGUgPSB2cDhfcmFjX2dldF90cmVlKGMsIHZwOF9wcmVkMTZ4MTZfdHJlZV9pbnRlciwgcy0+cHJvYi0+cHJlZDE2eDE2KTsKKworICAgICAgICBpZiAobWItPm1vZGUgPT0gTU9ERV9JNHg0KQorICAgICAgICAgICAgZGVjb2RlX2ludHJhNHg0X21vZGVzKHMsIGMsIG1iLCBtYl94LCAwLCBsYXlvdXQpOworCisgICAgICAgIG1iLT5jaHJvbWFfcHJlZF9tb2RlID0gdnA4X3JhY19nZXRfdHJlZShjLCB2cDhfcHJlZDh4OGNfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2ItPnByZWQ4eDhjKTsKKyAgICAgICAgbWItPnJlZl9mcmFtZSAgICAgICAgPSBWUDU2X0ZSQU1FX0NVUlJFTlQ7CisgICAgICAgIG1iLT5wYXJ0aXRpb25pbmcgICAgID0gVlA4X1NQTElUTVZNT0RFX05PTkU7CisgICAgICAgIEFWX1pFUk8zMigmbWItPmJtdlswXSk7CisgICAgfQorfQorCisvKioKKyAqIEBwYXJhbSByICAgICBhcml0aG1ldGljIGJpdHN0cmVhbSByZWFkZXIgY29udGV4dAorICogQHBhcmFtIGJsb2NrIGRlc3RpbmF0aW9uIGZvciBibG9jayBjb2VmZmljaWVudHMKKyAqIEBwYXJhbSBwcm9icyBwcm9iYWJpbGl0aWVzIHRvIHVzZSB3aGVuIHJlYWRpbmcgdHJlZXMgZnJvbSB0aGUgYml0c3RyZWFtCisgKiBAcGFyYW0gaSAgICAgaW5pdGlhbCBjb2VmZiBpbmRleCwgMCB1bmxlc3MgYSBzZXBhcmF0ZSBEQyBibG9jayBpcyBjb2RlZAorICogQHBhcmFtIHFtdWwgIGFycmF5IGhvbGRpbmcgdGhlIGRjL2FjIGRlcXVhbnQgZmFjdG9yIGF0IHBvc2l0aW9uIDAvMQorICoKKyAqIEByZXR1cm4gMCBpZiBubyBjb2VmZnMgd2VyZSBkZWNvZGVkCisgKiAgICAgICAgIG90aGVyd2lzZSwgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNvZWZmIGRlY29kZWQgcGx1cyBvbmUKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK2ludCBkZWNvZGVfYmxvY2tfY29lZmZzX2ludGVybmFsKFZQNTZSYW5nZUNvZGVyICpyLCBpbnQxNl90IGJsb2NrWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcHJvYnNbMTZdWzNdW05VTV9EQ1RfVE9LRU5TIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgdWludDhfdCAqdG9rZW5fcHJvYiwgaW50MTZfdCBxbXVsWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBzY2FuWzE2XSwgaW50IHZwNykKK3sKKyAgICBWUDU2UmFuZ2VDb2RlciBjID0gKnI7CisgICAgZ290byBza2lwX2VvYjsKKyAgICBkbyB7CisgICAgICAgIGludCBjb2VmZjsKK3Jlc3RhcnQ6CisgICAgICAgIGlmICghdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmYywgdG9rZW5fcHJvYlswXSkpICAgLy8gRENUX0VPQgorICAgICAgICAgICAgYnJlYWs7CisKK3NraXBfZW9iOgorICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoJmMsIHRva2VuX3Byb2JbMV0pKSB7IC8vIERDVF8wCisgICAgICAgICAgICBpZiAoKytpID09IDE2KQorICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpbnZhbGlkIGlucHV0OyBibG9ja3Mgc2hvdWxkIGVuZCB3aXRoIEVPQgorICAgICAgICAgICAgdG9rZW5fcHJvYiA9IHByb2JzW2ldWzBdOworICAgICAgICAgICAgaWYgKHZwNykKKyAgICAgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgICAgICBnb3RvIHNraXBfZW9iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZjLCB0b2tlbl9wcm9iWzJdKSkgeyAvLyBEQ1RfMQorICAgICAgICAgICAgY29lZmYgPSAxOworICAgICAgICAgICAgdG9rZW5fcHJvYiA9IHByb2JzW2kgKyAxXVsxXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmYywgdG9rZW5fcHJvYlszXSkpIHsgLy8gRENUIDIsMyw0CisgICAgICAgICAgICAgICAgY29lZmYgPSB2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZjLCB0b2tlbl9wcm9iWzRdKTsKKyAgICAgICAgICAgICAgICBpZiAoY29lZmYpCisgICAgICAgICAgICAgICAgICAgIGNvZWZmICs9IHZwNTZfcmFjX2dldF9wcm9iKCZjLCB0b2tlbl9wcm9iWzVdKTsKKyAgICAgICAgICAgICAgICBjb2VmZiArPSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBEQ1RfQ0FUKgorICAgICAgICAgICAgICAgIGlmICghdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmYywgdG9rZW5fcHJvYls2XSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZjLCB0b2tlbl9wcm9iWzddKSkgeyAvLyBEQ1RfQ0FUMQorICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgPSA1ICsgdnA1Nl9yYWNfZ2V0X3Byb2IoJmMsIHZwOF9kY3RfY2F0MV9wcm9iWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEQ1RfQ0FUMgorICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgID0gNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmICs9IHZwNTZfcmFjX2dldF9wcm9iKCZjLCB2cDhfZGN0X2NhdDJfcHJvYlswXSkgPDwgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmICs9IHZwNTZfcmFjX2dldF9wcm9iKCZjLCB2cDhfZGN0X2NhdDJfcHJvYlsxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAvLyBEQ1RfQ0FUMyBhbmQgdXAKKyAgICAgICAgICAgICAgICAgICAgaW50IGEgICA9IHZwNTZfcmFjX2dldF9wcm9iKCZjLCB0b2tlbl9wcm9iWzhdKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGIgICA9IHZwNTZfcmFjX2dldF9wcm9iKCZjLCB0b2tlbl9wcm9iWzkgKyBhXSk7CisgICAgICAgICAgICAgICAgICAgIGludCBjYXQgPSAoYSA8PCAxKSArIGI7CisgICAgICAgICAgICAgICAgICAgIGNvZWZmICA9IDMgKyAoOCA8PCBjYXQpOworICAgICAgICAgICAgICAgICAgICBjb2VmZiArPSB2cDhfcmFjX2dldF9jb2VmZigmYywgZmZfdnA4X2RjdF9jYXRfcHJvYltjYXRdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b2tlbl9wcm9iID0gcHJvYnNbaSArIDFdWzJdOworICAgICAgICB9CisgICAgICAgIGJsb2NrW3NjYW5baV1dID0gKHZwOF9yYWNfZ2V0KCZjKSA/IC1jb2VmZiA6IGNvZWZmKSAqIHFtdWxbISFpXTsKKyAgICB9IHdoaWxlICgrK2kgPCAxNik7CisKKyAgICAqciA9IGM7CisgICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCitpbnQgaW50ZXJfcHJlZGljdF9kYyhpbnQxNl90IGJsb2NrWzE2XSwgaW50MTZfdCBwcmVkWzJdKQoreworICAgIGludDE2X3QgZGMgPSBibG9ja1swXTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChwcmVkWzFdID4gMykgeworICAgICAgICBkYyArPSBwcmVkWzBdOworICAgICAgICByZXQgPSAxOworICAgIH0KKworICAgIGlmICghcHJlZFswXSB8ICFkYyB8ICgoaW50MzJfdClwcmVkWzBdIF4gKGludDMyX3QpZGMpID4+IDMxKSB7CisgICAgICAgIGJsb2NrWzBdID0gcHJlZFswXSA9IGRjOworICAgICAgICBwcmVkWzFdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocHJlZFswXSA9PSBkYykKKyAgICAgICAgICAgIHByZWRbMV0rKzsKKyAgICAgICAgYmxvY2tbMF0gPSBwcmVkWzBdID0gZGM7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2cDdfZGVjb2RlX2Jsb2NrX2NvZWZmc19pbnRlcm5hbChWUDU2UmFuZ2VDb2RlciAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBibG9ja1sxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcHJvYnNbMTZdWzNdW05VTV9EQ1RfVE9LRU5TIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCB1aW50OF90ICp0b2tlbl9wcm9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHFtdWxbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgc2NhblsxNl0pCit7CisgICAgcmV0dXJuIGRlY29kZV9ibG9ja19jb2VmZnNfaW50ZXJuYWwociwgYmxvY2ssIHByb2JzLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuX3Byb2IsIHFtdWwsIHNjYW4sIElTX1ZQNyk7Cit9CisKKyNpZm5kZWYgdnA4X2RlY29kZV9ibG9ja19jb2VmZnNfaW50ZXJuYWwKK3N0YXRpYyBpbnQgdnA4X2RlY29kZV9ibG9ja19jb2VmZnNfaW50ZXJuYWwoVlA1NlJhbmdlQ29kZXIgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgYmxvY2tbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHByb2JzWzE2XVszXVtOVU1fRENUX1RPS0VOUyAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgdWludDhfdCAqdG9rZW5fcHJvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBxbXVsWzJdKQoreworICAgIHJldHVybiBkZWNvZGVfYmxvY2tfY29lZmZzX2ludGVybmFsKHIsIGJsb2NrLCBwcm9icywgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbl9wcm9iLCBxbXVsLCB6aWd6YWdfc2NhbiwgSVNfVlA4KTsKK30KKyNlbmRpZgorCisvKioKKyAqIEBwYXJhbSBjICAgICAgICAgIGFyaXRobWV0aWMgYml0c3RyZWFtIHJlYWRlciBjb250ZXh0CisgKiBAcGFyYW0gYmxvY2sgICAgICBkZXN0aW5hdGlvbiBmb3IgYmxvY2sgY29lZmZpY2llbnRzCisgKiBAcGFyYW0gcHJvYnMgICAgICBwcm9iYWJpbGl0aWVzIHRvIHVzZSB3aGVuIHJlYWRpbmcgdHJlZXMgZnJvbSB0aGUgYml0c3RyZWFtCisgKiBAcGFyYW0gaSAgICAgICAgICBpbml0aWFsIGNvZWZmIGluZGV4LCAwIHVubGVzcyBhIHNlcGFyYXRlIERDIGJsb2NrIGlzIGNvZGVkCisgKiBAcGFyYW0gemVyb19uaG9vZCB0aGUgaW5pdGlhbCBwcmVkaWN0aW9uIGNvbnRleHQgZm9yIG51bWJlciBvZiBzdXJyb3VuZGluZworICogICAgICAgICAgICAgICAgICAgYWxsLXplcm8gYmxvY2tzIChvbmx5IGxlZnQvdG9wLCBzbyAwLTIpCisgKiBAcGFyYW0gcW11bCAgICAgICBhcnJheSBob2xkaW5nIHRoZSBkYy9hYyBkZXF1YW50IGZhY3RvciBhdCBwb3NpdGlvbiAwLzEKKyAqIEBwYXJhbSBzY2FuICAgICAgIHNjYW4gcGF0dGVybiAoVlA3IG9ubHkpCisgKgorICogQHJldHVybiAwIGlmIG5vIGNvZWZmcyB3ZXJlIGRlY29kZWQKKyAqICAgICAgICAgb3RoZXJ3aXNlLCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY29lZmYgZGVjb2RlZCBwbHVzIG9uZQorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZQoraW50IGRlY29kZV9ibG9ja19jb2VmZnMoVlA1NlJhbmdlQ29kZXIgKmMsIGludDE2X3QgYmxvY2tbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwcm9ic1sxNl1bM11bTlVNX0RDVF9UT0tFTlMgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgemVyb19uaG9vZCwgaW50MTZfdCBxbXVsWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBzY2FuWzE2XSwgaW50IHZwNykKK3sKKyAgICB1aW50OF90ICp0b2tlbl9wcm9iID0gcHJvYnNbaV1bemVyb19uaG9vZF07CisgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRva2VuX3Byb2JbMF0pKSAgIC8vIERDVF9FT0IKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHZwNyA/IHZwN19kZWNvZGVfYmxvY2tfY29lZmZzX2ludGVybmFsKGMsIGJsb2NrLCBwcm9icywgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5fcHJvYiwgcW11bCwgc2NhbikKKyAgICAgICAgICAgICAgIDogdnA4X2RlY29kZV9ibG9ja19jb2VmZnNfaW50ZXJuYWwoYywgYmxvY2ssIHByb2JzLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbl9wcm9iLCBxbXVsKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgZGVjb2RlX21iX2NvZWZmcyhWUDhDb250ZXh0ICpzLCBWUDhUaHJlYWREYXRhICp0ZCwgVlA1NlJhbmdlQ29kZXIgKmMsCisgICAgICAgICAgICAgICAgICAgICAgVlA4TWFjcm9ibG9jayAqbWIsIHVpbnQ4X3QgdF9ubnpbOV0sIHVpbnQ4X3QgbF9ubnpbOV0sCisgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3ZwNykKK3sKKyAgICBpbnQgaSwgeCwgeSwgbHVtYV9zdGFydCA9IDAsIGx1bWFfY3R4ID0gMzsKKyAgICBpbnQgbm56X3ByZWQsIG5ueiwgbm56X3RvdGFsID0gMDsKKyAgICBpbnQgc2VnbWVudCA9IG1iLT5zZWdtZW50OworICAgIGludCBibG9ja19kYyA9IDA7CisKKyAgICBpZiAobWItPm1vZGUgIT0gTU9ERV9JNHg0ICYmIChpc192cDcgfHwgbWItPm1vZGUgIT0gVlA4X01WTU9ERV9TUExJVCkpIHsKKyAgICAgICAgbm56X3ByZWQgPSB0X25uels4XSArIGxfbm56WzhdOworCisgICAgICAgIC8vIGRlY29kZSBEQyB2YWx1ZXMgYW5kIGRvIGhhZGFtYXJkCisgICAgICAgIG5ueiA9IGRlY29kZV9ibG9ja19jb2VmZnMoYywgdGQtPmJsb2NrX2RjLCBzLT5wcm9iLT50b2tlblsxXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubnpfcHJlZCwgcy0+cW1hdFtzZWdtZW50XS5sdW1hX2RjX3FtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnX3NjYW4sIGlzX3ZwNyk7CisgICAgICAgIGxfbm56WzhdID0gdF9ubnpbOF0gPSAhIW5uejsKKworICAgICAgICBpZiAoaXNfdnA3ICYmIG1iLT5tb2RlID4gTU9ERV9JNHg0KSB7CisgICAgICAgICAgICBubnogfD0gIGludGVyX3ByZWRpY3RfZGModGQtPmJsb2NrX2RjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmludGVyX2RjX3ByZWRbbWItPnJlZl9mcmFtZSAtIDFdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChubnopIHsKKyAgICAgICAgICAgIG5uel90b3RhbCArPSBubno7CisgICAgICAgICAgICBibG9ja19kYyAgID0gMTsKKyAgICAgICAgICAgIGlmIChubnogPT0gMSkKKyAgICAgICAgICAgICAgICBzLT52cDhkc3AudnA4X2x1bWFfZGNfd2h0X2RjKHRkLT5ibG9jaywgdGQtPmJsb2NrX2RjKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzLT52cDhkc3AudnA4X2x1bWFfZGNfd2h0KHRkLT5ibG9jaywgdGQtPmJsb2NrX2RjKTsKKyAgICAgICAgfQorICAgICAgICBsdW1hX3N0YXJ0ID0gMTsKKyAgICAgICAgbHVtYV9jdHggICA9IDA7CisgICAgfQorCisgICAgLy8gbHVtYSBibG9ja3MKKyAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7CisgICAgICAgICAgICBubnpfcHJlZCA9IGxfbm56W3ldICsgdF9ubnpbeF07CisgICAgICAgICAgICBubnogPSBkZWNvZGVfYmxvY2tfY29lZmZzKGMsIHRkLT5ibG9ja1t5XVt4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi0+dG9rZW5bbHVtYV9jdHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdW1hX3N0YXJ0LCBubnpfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cW1hdFtzZWdtZW50XS5sdW1hX3FtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2JbMF0uc2NhbiwgaXNfdnA3KTsKKyAgICAgICAgICAgIC8qIG5ueitibG9ja19kYyBtYXkgYmUgb25lIG1vcmUgdGhhbiB0aGUgYWN0dWFsIGxhc3QgaW5kZXgsCisgICAgICAgICAgICAgKiBidXQgd2UgZG9uJ3QgY2FyZSAqLworICAgICAgICAgICAgdGQtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3ldW3hdID0gbm56ICsgYmxvY2tfZGM7CisgICAgICAgICAgICB0X25uelt4XSA9IGxfbm56W3ldID0gISFubno7CisgICAgICAgICAgICBubnpfdG90YWwgKz0gbm56OworICAgICAgICB9CisKKyAgICAvLyBjaHJvbWEgYmxvY2tzCisgICAgLy8gVE9ETzogd2hhdCB0byBkbyBhYm91dCBkaW1lbnNpb25zPyAybmQgZGltIGZvciBsdW1hIGlzIHgsCisgICAgLy8gYnV0IGZvciBjaHJvbWEgaXQncyAoeTw8MSl8eAorICAgIGZvciAoaSA9IDQ7IGkgPCA2OyBpKyspCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCAyOyB5KyspCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7CisgICAgICAgICAgICAgICAgbm56X3ByZWQgPSBsX25ueltpICsgMiAqIHldICsgdF9ubnpbaSArIDIgKiB4XTsKKyAgICAgICAgICAgICAgICBubnogPSBkZWNvZGVfYmxvY2tfY29lZmZzKGMsIHRkLT5ibG9ja1tpXVsoeSA8PCAxKSArIHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi0+dG9rZW5bMl0sIDAsIG5uel9wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cW1hdFtzZWdtZW50XS5jaHJvbWFfcW11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2JbMF0uc2NhbiwgaXNfdnA3KTsKKyAgICAgICAgICAgICAgICB0ZC0+bm9uX3plcm9fY291bnRfY2FjaGVbaV1bKHkgPDwgMSkgKyB4XSA9IG5uejsKKyAgICAgICAgICAgICAgICB0X25ueltpICsgMiAqIHhdID0gbF9ubnpbaSArIDIgKiB5XSA9ICEhbm56OworICAgICAgICAgICAgICAgIG5uel90b3RhbCArPSBubno7CisgICAgICAgICAgICB9CisKKyAgICAvLyBpZiB0aGVyZSB3ZXJlIG5vIGNvZGVkIGNvZWZmcyBkZXNwaXRlIHRoZSBtYWNyb2Jsb2NrIG5vdCBiZWluZyBtYXJrZWQgc2tpcCwKKyAgICAvLyB3ZSBNVVNUIG5vdCBkbyB0aGUgaW5uZXIgbG9vcCBmaWx0ZXIgYW5kIHNob3VsZCBub3QgZG8gSURDVAorICAgIC8vIFNpbmNlIHNraXAgaXNuJ3QgdXNlZCBmb3IgYml0c3RyZWFtIHByZWRpY3Rpb24sIGp1c3QgbWFudWFsbHkgc2V0IGl0LgorICAgIGlmICghbm56X3RvdGFsKQorICAgICAgICBtYi0+c2tpcCA9IDE7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIGJhY2t1cF9tYl9ib3JkZXIodWludDhfdCAqdG9wX2JvcmRlciwgdWludDhfdCAqc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjX2NiLCB1aW50OF90ICpzcmNfY3IsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLCBpbnQgdXZsaW5lc2l6ZSwgaW50IHNpbXBsZSkKK3sKKyAgICBBVl9DT1BZMTI4KHRvcF9ib3JkZXIsIHNyY195ICsgMTUgKiBsaW5lc2l6ZSk7CisgICAgaWYgKCFzaW1wbGUpIHsKKyAgICAgICAgQVZfQ09QWTY0KHRvcF9ib3JkZXIgKyAxNiwgc3JjX2NiICsgNyAqIHV2bGluZXNpemUpOworICAgICAgICBBVl9DT1BZNjQodG9wX2JvcmRlciArIDI0LCBzcmNfY3IgKyA3ICogdXZsaW5lc2l6ZSk7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZQordm9pZCB4Y2hnX21iX2JvcmRlcih1aW50OF90ICp0b3BfYm9yZGVyLCB1aW50OF90ICpzcmNfeSwgdWludDhfdCAqc3JjX2NiLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmNfY3IsIGludCBsaW5lc2l6ZSwgaW50IHV2bGluZXNpemUsIGludCBtYl94LAorICAgICAgICAgICAgICAgICAgICBpbnQgbWJfeSwgaW50IG1iX3dpZHRoLCBpbnQgc2ltcGxlLCBpbnQgeGNoZykKK3sKKyAgICB1aW50OF90ICp0b3BfYm9yZGVyX20xID0gdG9wX2JvcmRlciAtIDMyOyAgICAgLy8gZm9yIFRMIHByZWRpY3Rpb24KKyAgICBzcmNfeSAgLT0gbGluZXNpemU7CisgICAgc3JjX2NiIC09IHV2bGluZXNpemU7CisgICAgc3JjX2NyIC09IHV2bGluZXNpemU7CisKKyNkZWZpbmUgWENIRyhhLCBiLCB4Y2hnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHhjaGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFWX1NXQVA2NChiLCBhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFWX0NPUFk2NChiLCBhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgWENIRyh0b3BfYm9yZGVyX20xICsgOCwgc3JjX3kgLSA4LCB4Y2hnKTsKKyAgICBYQ0hHKHRvcF9ib3JkZXIsIHNyY195LCB4Y2hnKTsKKyAgICBYQ0hHKHRvcF9ib3JkZXIgKyA4LCBzcmNfeSArIDgsIDEpOworICAgIGlmIChtYl94IDwgbWJfd2lkdGggLSAxKQorICAgICAgICBYQ0hHKHRvcF9ib3JkZXIgKyAzMiwgc3JjX3kgKyAxNiwgMSk7CisKKyAgICAvLyBvbmx5IGNvcHkgY2hyb21hIGZvciBub3JtYWwgbG9vcCBmaWx0ZXIKKyAgICAvLyBvciB0byBpbml0aWFsaXplIHRoZSB0b3Agcm93IHRvIDEyNworICAgIGlmICghc2ltcGxlIHx8ICFtYl95KSB7CisgICAgICAgIFhDSEcodG9wX2JvcmRlcl9tMSArIDE2LCBzcmNfY2IgLSA4LCB4Y2hnKTsKKyAgICAgICAgWENIRyh0b3BfYm9yZGVyX20xICsgMjQsIHNyY19jciAtIDgsIHhjaGcpOworICAgICAgICBYQ0hHKHRvcF9ib3JkZXIgKyAxNiwgc3JjX2NiLCAxKTsKKyAgICAgICAgWENIRyh0b3BfYm9yZGVyICsgMjQsIHNyY19jciwgMSk7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZQoraW50IGNoZWNrX2RjX3ByZWQ4eDhfbW9kZShpbnQgbW9kZSwgaW50IG1iX3gsIGludCBtYl95KQoreworICAgIGlmICghbWJfeCkKKyAgICAgICAgcmV0dXJuIG1iX3kgPyBUT1BfRENfUFJFRDh4OCA6IERDXzEyOF9QUkVEOHg4OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1iX3kgPyBtb2RlIDogTEVGVF9EQ19QUkVEOHg4OworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZQoraW50IGNoZWNrX3RtX3ByZWQ4eDhfbW9kZShpbnQgbW9kZSwgaW50IG1iX3gsIGludCBtYl95LCBpbnQgdnA3KQoreworICAgIGlmICghbWJfeCkKKyAgICAgICAgcmV0dXJuIG1iX3kgPyBWRVJUX1BSRUQ4eDggOiAodnA3ID8gRENfMTI4X1BSRUQ4eDggOiBEQ18xMjlfUFJFRDh4OCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gbWJfeSA/IG1vZGUgOiBIT1JfUFJFRDh4ODsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK2ludCBjaGVja19pbnRyYV9wcmVkOHg4X21vZGVfZW11ZWRnZShpbnQgbW9kZSwgaW50IG1iX3gsIGludCBtYl95LCBpbnQgdnA3KQoreworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgRENfUFJFRDh4ODoKKyAgICAgICAgcmV0dXJuIGNoZWNrX2RjX3ByZWQ4eDhfbW9kZShtb2RlLCBtYl94LCBtYl95KTsKKyAgICBjYXNlIFZFUlRfUFJFRDh4ODoKKyAgICAgICAgcmV0dXJuICFtYl95ID8gKHZwNyA/IERDXzEyOF9QUkVEOHg4IDogRENfMTI3X1BSRUQ4eDgpIDogbW9kZTsKKyAgICBjYXNlIEhPUl9QUkVEOHg4OgorICAgICAgICByZXR1cm4gIW1iX3ggPyAodnA3ID8gRENfMTI4X1BSRUQ4eDggOiBEQ18xMjlfUFJFRDh4OCkgOiBtb2RlOworICAgIGNhc2UgUExBTkVfUFJFRDh4ODogLyogVE0gKi8KKyAgICAgICAgcmV0dXJuIGNoZWNrX3RtX3ByZWQ4eDhfbW9kZShtb2RlLCBtYl94LCBtYl95LCB2cDcpOworICAgIH0KKyAgICByZXR1cm4gbW9kZTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK2ludCBjaGVja190bV9wcmVkNHg0X21vZGUoaW50IG1vZGUsIGludCBtYl94LCBpbnQgbWJfeSwgaW50IHZwNykKK3sKKyAgICBpZiAoIW1iX3gpIHsKKyAgICAgICAgcmV0dXJuIG1iX3kgPyBWRVJUX1ZQOF9QUkVEIDogKHZwNyA/IERDXzEyOF9QUkVEIDogRENfMTI5X1BSRUQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtYl95ID8gbW9kZSA6IEhPUl9WUDhfUFJFRDsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCitpbnQgY2hlY2tfaW50cmFfcHJlZDR4NF9tb2RlX2VtdWVkZ2UoaW50IG1vZGUsIGludCBtYl94LCBpbnQgbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvcHlfYnVmLCBpbnQgdnA3KQoreworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgVkVSVF9QUkVEOgorICAgICAgICBpZiAoIW1iX3ggJiYgbWJfeSkgeworICAgICAgICAgICAgKmNvcHlfYnVmID0gMTsKKyAgICAgICAgICAgIHJldHVybiBtb2RlOworICAgICAgICB9CisgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgIGNhc2UgRElBR19ET1dOX0xFRlRfUFJFRDoKKyAgICBjYXNlIFZFUlRfTEVGVF9QUkVEOgorICAgICAgICByZXR1cm4gIW1iX3kgPyAodnA3ID8gRENfMTI4X1BSRUQgOiBEQ18xMjdfUFJFRCkgOiBtb2RlOworICAgIGNhc2UgSE9SX1BSRUQ6CisgICAgICAgIGlmICghbWJfeSkgeworICAgICAgICAgICAgKmNvcHlfYnVmID0gMTsKKyAgICAgICAgICAgIHJldHVybiBtb2RlOworICAgICAgICB9CisgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgIGNhc2UgSE9SX1VQX1BSRUQ6CisgICAgICAgIHJldHVybiAhbWJfeCA/ICh2cDcgPyBEQ18xMjhfUFJFRCA6IERDXzEyOV9QUkVEKSA6IG1vZGU7CisgICAgY2FzZSBUTV9WUDhfUFJFRDoKKyAgICAgICAgcmV0dXJuIGNoZWNrX3RtX3ByZWQ0eDRfbW9kZShtb2RlLCBtYl94LCBtYl95LCB2cDcpOworICAgIGNhc2UgRENfUFJFRDogLyogNHg0IERDIGRvZXNuJ3QgdXNlIHRoZSBzYW1lICJILjI2NC1zdHlsZSIgZXhjZXB0aW9ucworICAgICAgICAgICAgICAgICAgICogYXMgMTZ4MTYvOHg4IERDICovCisgICAgY2FzZSBESUFHX0RPV05fUklHSFRfUFJFRDoKKyAgICBjYXNlIFZFUlRfUklHSFRfUFJFRDoKKyAgICBjYXNlIEhPUl9ET1dOX1BSRUQ6CisgICAgICAgIGlmICghbWJfeSB8fCAhbWJfeCkKKyAgICAgICAgICAgICpjb3B5X2J1ZiA9IDE7CisgICAgICAgIHJldHVybiBtb2RlOworICAgIH0KKyAgICByZXR1cm4gbW9kZTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgaW50cmFfcHJlZGljdChWUDhDb250ZXh0ICpzLCBWUDhUaHJlYWREYXRhICp0ZCwgdWludDhfdCAqZHN0WzNdLAorICAgICAgICAgICAgICAgICAgIFZQOE1hY3JvYmxvY2sgKm1iLCBpbnQgbWJfeCwgaW50IG1iX3ksIGludCBpc192cDcpCit7CisgICAgaW50IHgsIHksIG1vZGUsIG5uejsKKyAgICB1aW50MzJfdCB0cjsKKworICAgIC8qIGZvciB0aGUgZmlyc3Qgcm93LCB3ZSBuZWVkIHRvIHJ1biB4Y2hnX21iX2JvcmRlciB0byBpbml0IHRoZSB0b3AgZWRnZQorICAgICAqIHRvIDEyNyBvdGhlcndpc2UsIHNraXAgaXQgaWYgd2UgYXJlbid0IGdvaW5nIHRvIGRlYmxvY2sgKi8KKyAgICBpZiAobWJfeSAmJiAocy0+ZGVibG9ja19maWx0ZXIgfHwgIW1iX3kpICYmIHRkLT50aHJlYWRfbnIgPT0gMCkKKyAgICAgICAgeGNoZ19tYl9ib3JkZXIocy0+dG9wX2JvcmRlclttYl94ICsgMV0sIGRzdFswXSwgZHN0WzFdLCBkc3RbMl0sCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVzaXplLCBzLT51dmxpbmVzaXplLCBtYl94LCBtYl95LCBzLT5tYl93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmlsdGVyLnNpbXBsZSwgMSk7CisKKyAgICBpZiAobWItPm1vZGUgPCBNT0RFX0k0eDQpIHsKKyAgICAgICAgbW9kZSA9IGNoZWNrX2ludHJhX3ByZWQ4eDhfbW9kZV9lbXVlZGdlKG1iLT5tb2RlLCBtYl94LCBtYl95LCBpc192cDcpOworICAgICAgICBzLT5ocGMucHJlZDE2eDE2W21vZGVdKGRzdFswXSwgcy0+bGluZXNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IGRzdFswXTsKKyAgICAgICAgdWludDhfdCAqaW50cmE0eDQgPSBtYi0+aW50cmE0eDRfcHJlZF9tb2RlX21iOworICAgICAgICBjb25zdCB1aW50OF90IGxvID0gaXNfdnA3ID8gMTI4IDogMTI3OworICAgICAgICBjb25zdCB1aW50OF90IGhpID0gaXNfdnA3ID8gMTI4IDogMTI5OworICAgICAgICB1aW50OF90IHRyX3RvcFs0XSA9IHsgbG8sIGxvLCBsbywgbG8gfTsKKworICAgICAgICAvLyBhbGwgYmxvY2tzIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZSBtYWNyb2Jsb2NrIHVzZSBib3R0b20gZWRnZQorICAgICAgICAvLyB0aGUgdG9wIG1hY3JvYmxvY2sgZm9yIHRoZWlyIHRvcHJpZ2h0IGVkZ2UKKyAgICAgICAgdWludDhfdCAqdHJfcmlnaHQgPSBwdHIgLSBzLT5saW5lc2l6ZSArIDE2OworCisgICAgICAgIC8vIGlmIHdlJ3JlIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZSBmcmFtZSwgc2FpZCBlZGdlIGlzIGV4dGVuZGVkCisgICAgICAgIC8vIGZyb20gdGhlIHRvcCBtYWNyb2Jsb2NrCisgICAgICAgIGlmIChtYl95ICYmIG1iX3ggPT0gcy0+bWJfd2lkdGggLSAxKSB7CisgICAgICAgICAgICB0ciAgICAgICA9IHRyX3JpZ2h0Wy0xXSAqIDB4MDEwMTAxMDF1OworICAgICAgICAgICAgdHJfcmlnaHQgPSAodWludDhfdCAqKSAmdHI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWItPnNraXApCisgICAgICAgICAgICBBVl9aRVJPMTI4KHRkLT5ub25femVyb19jb3VudF9jYWNoZSk7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykgeworICAgICAgICAgICAgdWludDhfdCAqdG9wcmlnaHQgPSBwdHIgKyA0IC0gcy0+bGluZXNpemU7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7CisgICAgICAgICAgICAgICAgaW50IGNvcHkgPSAwLCBsaW5lc2l6ZSA9IHMtPmxpbmVzaXplOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IHB0ciArIDQgKiB4OworICAgICAgICAgICAgICAgIERFQ0xBUkVfQUxJR05FRCg0LCB1aW50OF90LCBjb3B5X2RzdClbNSAqIDhdOworCisgICAgICAgICAgICAgICAgaWYgKCh5ID09IDAgfHwgeCA9PSAzKSAmJiBtYl95ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdG9wcmlnaHQgPSB0cl90b3A7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4ID09IDMpCisgICAgICAgICAgICAgICAgICAgIHRvcHJpZ2h0ID0gdHJfcmlnaHQ7CisKKyAgICAgICAgICAgICAgICBtb2RlID0gY2hlY2tfaW50cmFfcHJlZDR4NF9tb2RlX2VtdWVkZ2UoaW50cmE0eDRbeF0sIG1iX3ggKyB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl95ICsgeSwgJmNvcHksIGlzX3ZwNyk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0ICAgICAgPSBjb3B5X2RzdCArIDEyOworICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSA9IDg7CisgICAgICAgICAgICAgICAgICAgIGlmICghKG1iX3kgKyB5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29weV9kc3RbM10gPSBsbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dOMzJBKGNvcHlfZHN0ICsgNCwgbG8gKiAweDAxMDEwMTAxVSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIoY29weV9kc3QgKyA0LCBwdHIgKyA0ICogeCAtIHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1iX3ggKyB4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfZHN0WzNdID0gaGk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfZHN0WzNdID0gcHRyWzQgKiB4IC0gcy0+bGluZXNpemUgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIShtYl94ICsgeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfZHN0WzExXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X2RzdFsxOV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgY29weV9kc3RbMjddID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfZHN0WzM1XSA9IGhpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29weV9kc3RbMTFdID0gcHRyWzQgKiB4ICAgICAgICAgICAgICAgICAgIC0gMV07CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X2RzdFsxOV0gPSBwdHJbNCAqIHggKyBzLT5saW5lc2l6ZSAgICAgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfZHN0WzI3XSA9IHB0cls0ICogeCArIHMtPmxpbmVzaXplICogMiAtIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgY29weV9kc3RbMzVdID0gcHRyWzQgKiB4ICsgcy0+bGluZXNpemUgKiAzIC0gMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+aHBjLnByZWQ0eDRbbW9kZV0oZHN0LCB0b3ByaWdodCwgbGluZXNpemUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkzMihwdHIgKyA0ICogeCwgICAgICAgICAgICAgICAgICAgY29weV9kc3QgKyAxMik7CisgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkzMihwdHIgKyA0ICogeCArIHMtPmxpbmVzaXplLCAgICAgY29weV9kc3QgKyAyMCk7CisgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkzMihwdHIgKyA0ICogeCArIHMtPmxpbmVzaXplICogMiwgY29weV9kc3QgKyAyOCk7CisgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkzMihwdHIgKyA0ICogeCArIHMtPmxpbmVzaXplICogMywgY29weV9kc3QgKyAzNik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbm56ID0gdGQtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3ldW3hdOworICAgICAgICAgICAgICAgIGlmIChubnopIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ueiA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+dnA4ZHNwLnZwOF9pZGN0X2RjX2FkZChwdHIgKyA0ICogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmJsb2NrW3ldW3hdLCBzLT5saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnZwOGRzcC52cDhfaWRjdF9hZGQocHRyICsgNCAqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5ibG9ja1t5XVt4XSwgcy0+bGluZXNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3ByaWdodCArPSA0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdHIgICAgICArPSA0ICogcy0+bGluZXNpemU7CisgICAgICAgICAgICBpbnRyYTR4NCArPSA0OworICAgICAgICB9CisgICAgfQorCisgICAgbW9kZSA9IGNoZWNrX2ludHJhX3ByZWQ4eDhfbW9kZV9lbXVlZGdlKG1iLT5jaHJvbWFfcHJlZF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl94LCBtYl95LCBpc192cDcpOworICAgIHMtPmhwYy5wcmVkOHg4W21vZGVdKGRzdFsxXSwgcy0+dXZsaW5lc2l6ZSk7CisgICAgcy0+aHBjLnByZWQ4eDhbbW9kZV0oZHN0WzJdLCBzLT51dmxpbmVzaXplKTsKKworICAgIGlmIChtYl95ICYmIChzLT5kZWJsb2NrX2ZpbHRlciB8fCAhbWJfeSkgJiYgdGQtPnRocmVhZF9uciA9PSAwKQorICAgICAgICB4Y2hnX21iX2JvcmRlcihzLT50b3BfYm9yZGVyW21iX3ggKyAxXSwgZHN0WzBdLCBkc3RbMV0sIGRzdFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemUsIHMtPnV2bGluZXNpemUsIG1iX3gsIG1iX3ksIHMtPm1iX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5maWx0ZXIuc2ltcGxlLCAwKTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3VicGVsX2lkeFszXVs4XSA9IHsKKyAgICB7IDAsIDEsIDIsIDEsIDIsIDEsIDIsIDEgfSwgLy8gbnIuIG9mIGxlZnQgZXh0cmEgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGZ1bmN0aW9uIHBvaW50ZXIgaW5kZXgKKyAgICB7IDAsIDMsIDUsIDMsIDUsIDMsIDUsIDMgfSwgLy8gbnIuIG9mIGV4dHJhIHBpeGVscyByZXF1aXJlZAorICAgIHsgMCwgMiwgMywgMiwgMywgMiwgMywgMiB9LCAvLyBuci4gb2YgcmlnaHQgZXh0cmEgcGl4ZWxzCit9OworCisvKioKKyAqIGx1bWEgTUMgZnVuY3Rpb24KKyAqCisgKiBAcGFyYW0gcyAgICAgICAgVlA4IGRlY29kaW5nIGNvbnRleHQKKyAqIEBwYXJhbSBkc3QgICAgICB0YXJnZXQgYnVmZmVyIGZvciBibG9jayBkYXRhIGF0IGJsb2NrIHBvc2l0aW9uCisgKiBAcGFyYW0gcmVmICAgICAgcmVmZXJlbmNlIHBpY3R1cmUgYnVmZmVyIGF0IG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSBtdiAgICAgICBtb3Rpb24gdmVjdG9yIChyZWxhdGl2ZSB0byBibG9jayBwb3NpdGlvbikgdG8gZ2V0IHBpeGVsIGRhdGEgZnJvbQorICogQHBhcmFtIHhfb2ZmICAgIGhvcml6b250YWwgcG9zaXRpb24gb2YgYmxvY2sgZnJvbSBvcmlnaW4gKDAsIDApCisgKiBAcGFyYW0geV9vZmYgICAgdmVydGljYWwgcG9zaXRpb24gb2YgYmxvY2sgZnJvbSBvcmlnaW4gKDAsIDApCisgKiBAcGFyYW0gYmxvY2tfdyAgd2lkdGggb2YgYmxvY2sgKDE2LCA4IG9yIDQpCisgKiBAcGFyYW0gYmxvY2tfaCAgaGVpZ2h0IG9mIGJsb2NrIChhbHdheXMgc2FtZSBhcyBibG9ja193KQorICogQHBhcmFtIHdpZHRoICAgIHdpZHRoIG9mIHNyYy9kc3QgcGxhbmUgZGF0YQorICogQHBhcmFtIGhlaWdodCAgIGhlaWdodCBvZiBzcmMvZHN0IHBsYW5lIGRhdGEKKyAqIEBwYXJhbSBsaW5lc2l6ZSBzaXplIG9mIGEgc2luZ2xlIGxpbmUgb2YgcGxhbmUgZGF0YSwgaW5jbHVkaW5nIHBhZGRpbmcKKyAqIEBwYXJhbSBtY19mdW5jICBtb3Rpb24gY29tcGVuc2F0aW9uIGZ1bmN0aW9uIHBvaW50ZXJzIChiaWxpbmVhciBvciBzaXh0YXAgTUMpCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIHZwOF9tY19sdW1hKFZQOENvbnRleHQgKnMsIFZQOFRocmVhZERhdGEgKnRkLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgIFRocmVhZEZyYW1lICpyZWYsIGNvbnN0IFZQNTZtdiAqbXYsCisgICAgICAgICAgICAgICAgIGludCB4X29mZiwgaW50IHlfb2ZmLCBpbnQgYmxvY2tfdywgaW50IGJsb2NrX2gsCisgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgcHRyZGlmZl90IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICB2cDhfbWNfZnVuYyBtY19mdW5jWzNdWzNdKQoreworICAgIHVpbnQ4X3QgKnNyYyA9IHJlZi0+Zi0+ZGF0YVswXTsKKworICAgIGlmIChBVl9STjMyQShtdikpIHsKKyAgICAgICAgaW50IHNyY19saW5lc2l6ZSA9IGxpbmVzaXplOworCisgICAgICAgIGludCBteCA9IChtdi0+eCA8PCAxKSAmIDcsIG14X2lkeCA9IHN1YnBlbF9pZHhbMF1bbXhdOworICAgICAgICBpbnQgbXkgPSAobXYtPnkgPDwgMSkgJiA3LCBteV9pZHggPSBzdWJwZWxfaWR4WzBdW215XTsKKworICAgICAgICB4X29mZiArPSBtdi0+eCA+PiAyOworICAgICAgICB5X29mZiArPSBtdi0+eSA+PiAyOworCisgICAgICAgIC8vIGVkZ2UgZW11bGF0aW9uCisgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhyZWYsICgzICsgeV9vZmYgKyBibG9ja19oICsgc3VicGVsX2lkeFsyXVtteV0pID4+IDQsIDApOworICAgICAgICBzcmMgKz0geV9vZmYgKiBsaW5lc2l6ZSArIHhfb2ZmOworICAgICAgICBpZiAoeF9vZmYgPCBteF9pZHggfHwgeF9vZmYgPj0gd2lkdGggIC0gYmxvY2tfdyAtIHN1YnBlbF9pZHhbMl1bbXhdIHx8CisgICAgICAgICAgICB5X29mZiA8IG15X2lkeCB8fCB5X29mZiA+PSBoZWlnaHQgLSBibG9ja19oIC0gc3VicGVsX2lkeFsyXVtteV0pIHsKKyAgICAgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh0ZC0+ZWRnZV9lbXVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIG15X2lkeCAqIGxpbmVzaXplIC0gbXhfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVER0VfRU1VX0xJTkVTSVpFLCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja193ICsgc3VicGVsX2lkeFsxXVtteF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaCArIHN1YnBlbF9pZHhbMV1bbXldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfb2ZmIC0gbXhfaWR4LCB5X29mZiAtIG15X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHNyYyA9IHRkLT5lZGdlX2VtdV9idWZmZXIgKyBteF9pZHggKyBFREdFX0VNVV9MSU5FU0laRSAqIG15X2lkeDsKKyAgICAgICAgICAgIHNyY19saW5lc2l6ZSA9IEVER0VfRU1VX0xJTkVTSVpFOworICAgICAgICB9CisgICAgICAgIG1jX2Z1bmNbbXlfaWR4XVtteF9pZHhdKGRzdCwgbGluZXNpemUsIHNyYywgc3JjX2xpbmVzaXplLCBibG9ja19oLCBteCwgbXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhyZWYsICgzICsgeV9vZmYgKyBibG9ja19oKSA+PiA0LCAwKTsKKyAgICAgICAgbWNfZnVuY1swXVswXShkc3QsIGxpbmVzaXplLCBzcmMgKyB5X29mZiAqIGxpbmVzaXplICsgeF9vZmYsCisgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUsIGJsb2NrX2gsIDAsIDApOworICAgIH0KK30KKworLyoqCisgKiBjaHJvbWEgTUMgZnVuY3Rpb24KKyAqCisgKiBAcGFyYW0gcyAgICAgICAgVlA4IGRlY29kaW5nIGNvbnRleHQKKyAqIEBwYXJhbSBkc3QxICAgICB0YXJnZXQgYnVmZmVyIGZvciBibG9jayBkYXRhIGF0IGJsb2NrIHBvc2l0aW9uIChVIHBsYW5lKQorICogQHBhcmFtIGRzdDIgICAgIHRhcmdldCBidWZmZXIgZm9yIGJsb2NrIGRhdGEgYXQgYmxvY2sgcG9zaXRpb24gKFYgcGxhbmUpCisgKiBAcGFyYW0gcmVmICAgICAgcmVmZXJlbmNlIHBpY3R1cmUgYnVmZmVyIGF0IG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSBtdiAgICAgICBtb3Rpb24gdmVjdG9yIChyZWxhdGl2ZSB0byBibG9jayBwb3NpdGlvbikgdG8gZ2V0IHBpeGVsIGRhdGEgZnJvbQorICogQHBhcmFtIHhfb2ZmICAgIGhvcml6b250YWwgcG9zaXRpb24gb2YgYmxvY2sgZnJvbSBvcmlnaW4gKDAsIDApCisgKiBAcGFyYW0geV9vZmYgICAgdmVydGljYWwgcG9zaXRpb24gb2YgYmxvY2sgZnJvbSBvcmlnaW4gKDAsIDApCisgKiBAcGFyYW0gYmxvY2tfdyAgd2lkdGggb2YgYmxvY2sgKDE2LCA4IG9yIDQpCisgKiBAcGFyYW0gYmxvY2tfaCAgaGVpZ2h0IG9mIGJsb2NrIChhbHdheXMgc2FtZSBhcyBibG9ja193KQorICogQHBhcmFtIHdpZHRoICAgIHdpZHRoIG9mIHNyYy9kc3QgcGxhbmUgZGF0YQorICogQHBhcmFtIGhlaWdodCAgIGhlaWdodCBvZiBzcmMvZHN0IHBsYW5lIGRhdGEKKyAqIEBwYXJhbSBsaW5lc2l6ZSBzaXplIG9mIGEgc2luZ2xlIGxpbmUgb2YgcGxhbmUgZGF0YSwgaW5jbHVkaW5nIHBhZGRpbmcKKyAqIEBwYXJhbSBtY19mdW5jICBtb3Rpb24gY29tcGVuc2F0aW9uIGZ1bmN0aW9uIHBvaW50ZXJzIChiaWxpbmVhciBvciBzaXh0YXAgTUMpCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIHZwOF9tY19jaHJvbWEoVlA4Q29udGV4dCAqcywgVlA4VGhyZWFkRGF0YSAqdGQsIHVpbnQ4X3QgKmRzdDEsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0MiwgVGhyZWFkRnJhbWUgKnJlZiwgY29uc3QgVlA1Nm12ICptdiwKKyAgICAgICAgICAgICAgICAgICBpbnQgeF9vZmYsIGludCB5X29mZiwgaW50IGJsb2NrX3csIGludCBibG9ja19oLAorICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgcHRyZGlmZl90IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgIHZwOF9tY19mdW5jIG1jX2Z1bmNbM11bM10pCit7CisgICAgdWludDhfdCAqc3JjMSA9IHJlZi0+Zi0+ZGF0YVsxXSwgKnNyYzIgPSByZWYtPmYtPmRhdGFbMl07CisKKyAgICBpZiAoQVZfUk4zMkEobXYpKSB7CisgICAgICAgIGludCBteCA9IG12LT54ICYgNywgbXhfaWR4ID0gc3VicGVsX2lkeFswXVtteF07CisgICAgICAgIGludCBteSA9IG12LT55ICYgNywgbXlfaWR4ID0gc3VicGVsX2lkeFswXVtteV07CisKKyAgICAgICAgeF9vZmYgKz0gbXYtPnggPj4gMzsKKyAgICAgICAgeV9vZmYgKz0gbXYtPnkgPj4gMzsKKworICAgICAgICAvLyBlZGdlIGVtdWxhdGlvbgorICAgICAgICBzcmMxICs9IHlfb2ZmICogbGluZXNpemUgKyB4X29mZjsKKyAgICAgICAgc3JjMiArPSB5X29mZiAqIGxpbmVzaXplICsgeF9vZmY7CisgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhyZWYsICgzICsgeV9vZmYgKyBibG9ja19oICsgc3VicGVsX2lkeFsyXVtteV0pID4+IDMsIDApOworICAgICAgICBpZiAoeF9vZmYgPCBteF9pZHggfHwgeF9vZmYgPj0gd2lkdGggIC0gYmxvY2tfdyAtIHN1YnBlbF9pZHhbMl1bbXhdIHx8CisgICAgICAgICAgICB5X29mZiA8IG15X2lkeCB8fCB5X29mZiA+PSBoZWlnaHQgLSBibG9ja19oIC0gc3VicGVsX2lkeFsyXVtteV0pIHsKKyAgICAgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh0ZC0+ZWRnZV9lbXVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgLSBteV9pZHggKiBsaW5lc2l6ZSAtIG14X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREdFX0VNVV9MSU5FU0laRSwgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfdyArIHN1YnBlbF9pZHhbMV1bbXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2ggKyBzdWJwZWxfaWR4WzFdW215XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X29mZiAtIG14X2lkeCwgeV9vZmYgLSBteV9pZHgsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgc3JjMSA9IHRkLT5lZGdlX2VtdV9idWZmZXIgKyBteF9pZHggKyBFREdFX0VNVV9MSU5FU0laRSAqIG15X2lkeDsKKyAgICAgICAgICAgIG1jX2Z1bmNbbXlfaWR4XVtteF9pZHhdKGRzdDEsIGxpbmVzaXplLCBzcmMxLCBFREdFX0VNVV9MSU5FU0laRSwgYmxvY2tfaCwgbXgsIG15KTsKKworICAgICAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHRkLT5lZGdlX2VtdV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiAtIG15X2lkeCAqIGxpbmVzaXplIC0gbXhfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVER0VfRU1VX0xJTkVTSVpFLCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja193ICsgc3VicGVsX2lkeFsxXVtteF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaCArIHN1YnBlbF9pZHhbMV1bbXldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfb2ZmIC0gbXhfaWR4LCB5X29mZiAtIG15X2lkeCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBzcmMyID0gdGQtPmVkZ2VfZW11X2J1ZmZlciArIG14X2lkeCArIEVER0VfRU1VX0xJTkVTSVpFICogbXlfaWR4OworICAgICAgICAgICAgbWNfZnVuY1tteV9pZHhdW214X2lkeF0oZHN0MiwgbGluZXNpemUsIHNyYzIsIEVER0VfRU1VX0xJTkVTSVpFLCBibG9ja19oLCBteCwgbXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWNfZnVuY1tteV9pZHhdW214X2lkeF0oZHN0MSwgbGluZXNpemUsIHNyYzEsIGxpbmVzaXplLCBibG9ja19oLCBteCwgbXkpOworICAgICAgICAgICAgbWNfZnVuY1tteV9pZHhdW214X2lkeF0oZHN0MiwgbGluZXNpemUsIHNyYzIsIGxpbmVzaXplLCBibG9ja19oLCBteCwgbXkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKHJlZiwgKDMgKyB5X29mZiArIGJsb2NrX2gpID4+IDMsIDApOworICAgICAgICBtY19mdW5jWzBdWzBdKGRzdDEsIGxpbmVzaXplLCBzcmMxICsgeV9vZmYgKiBsaW5lc2l6ZSArIHhfb2ZmLCBsaW5lc2l6ZSwgYmxvY2tfaCwgMCwgMCk7CisgICAgICAgIG1jX2Z1bmNbMF1bMF0oZHN0MiwgbGluZXNpemUsIHNyYzIgKyB5X29mZiAqIGxpbmVzaXplICsgeF9vZmYsIGxpbmVzaXplLCBibG9ja19oLCAwLCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIHZwOF9tY19wYXJ0KFZQOENvbnRleHQgKnMsIFZQOFRocmVhZERhdGEgKnRkLCB1aW50OF90ICpkc3RbM10sCisgICAgICAgICAgICAgICAgIFRocmVhZEZyYW1lICpyZWZfZnJhbWUsIGludCB4X29mZiwgaW50IHlfb2ZmLAorICAgICAgICAgICAgICAgICBpbnQgYnhfb2ZmLCBpbnQgYnlfb2ZmLCBpbnQgYmxvY2tfdywgaW50IGJsb2NrX2gsCisgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgVlA1Nm12ICptdikKK3sKKyAgICBWUDU2bXYgdXZtdiA9ICptdjsKKworICAgIC8qIFkgKi8KKyAgICB2cDhfbWNfbHVtYShzLCB0ZCwgZHN0WzBdICsgYnlfb2ZmICogcy0+bGluZXNpemUgKyBieF9vZmYsCisgICAgICAgICAgICAgICAgcmVmX2ZyYW1lLCBtdiwgeF9vZmYgKyBieF9vZmYsIHlfb2ZmICsgYnlfb2ZmLAorICAgICAgICAgICAgICAgIGJsb2NrX3csIGJsb2NrX2gsIHdpZHRoLCBoZWlnaHQsIHMtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgIHMtPnB1dF9waXhlbHNfdGFiW2Jsb2NrX3cgPT0gOF0pOworCisgICAgLyogVS9WICovCisgICAgaWYgKHMtPnByb2ZpbGUgPT0gMykgeworICAgICAgICAvKiB0aGlzIGJsb2NrIG9ubHkgYXBwbGllcyBWUDg7IGl0IGlzIHNhZmUgdG8gY2hlY2sKKyAgICAgICAgICogb25seSB0aGUgcHJvZmlsZSwgYXMgVlA3IHByb2ZpbGUgPD0gMSAqLworICAgICAgICB1dm12LnggJj0gfjc7CisgICAgICAgIHV2bXYueSAmPSB+NzsKKyAgICB9CisgICAgeF9vZmYgICA+Pj0gMTsKKyAgICB5X29mZiAgID4+PSAxOworICAgIGJ4X29mZiAgPj49IDE7CisgICAgYnlfb2ZmICA+Pj0gMTsKKyAgICB3aWR0aCAgID4+PSAxOworICAgIGhlaWdodCAgPj49IDE7CisgICAgYmxvY2tfdyA+Pj0gMTsKKyAgICBibG9ja19oID4+PSAxOworICAgIHZwOF9tY19jaHJvbWEocywgdGQsIGRzdFsxXSArIGJ5X29mZiAqIHMtPnV2bGluZXNpemUgKyBieF9vZmYsCisgICAgICAgICAgICAgICAgICBkc3RbMl0gKyBieV9vZmYgKiBzLT51dmxpbmVzaXplICsgYnhfb2ZmLCByZWZfZnJhbWUsCisgICAgICAgICAgICAgICAgICAmdXZtdiwgeF9vZmYgKyBieF9vZmYsIHlfb2ZmICsgYnlfb2ZmLAorICAgICAgICAgICAgICAgICAgYmxvY2tfdywgYmxvY2tfaCwgd2lkdGgsIGhlaWdodCwgcy0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgIHMtPnB1dF9waXhlbHNfdGFiWzEgKyAoYmxvY2tfdyA9PSA0KV0pOworfQorCisvKiBGZXRjaCBwaXhlbHMgZm9yIGVzdGltYXRlZCBtdiA0IG1hY3JvYmxvY2tzIGFoZWFkLgorICogT3B0aW1pemVkIGZvciA2NC1ieXRlIGNhY2hlIGxpbmVzLiBJbnNwaXJlZCBieSBmZmgyNjQgcHJlZmV0Y2hfbW90aW9uLiAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgcHJlZmV0Y2hfbW90aW9uKFZQOENvbnRleHQgKnMsIFZQOE1hY3JvYmxvY2sgKm1iLCBpbnQgbWJfeCwgaW50IG1iX3ksCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfeHksIGludCByZWYpCit7CisgICAgLyogRG9uJ3QgcHJlZmV0Y2ggcmVmcyB0aGF0IGhhdmVuJ3QgYmVlbiB1c2VkIHZlcnkgb2Z0ZW4gdGhpcyBmcmFtZS4gKi8KKyAgICBpZiAocy0+cmVmX2NvdW50W3JlZiAtIDFdID4gKG1iX3h5ID4+IDUpKSB7CisgICAgICAgIGludCB4X29mZiA9IG1iX3ggPDwgNCwgeV9vZmYgPSBtYl95IDw8IDQ7CisgICAgICAgIGludCBteCA9IChtYi0+bXYueCA+PiAyKSArIHhfb2ZmICsgODsKKyAgICAgICAgaW50IG15ID0gKG1iLT5tdi55ID4+IDIpICsgeV9vZmY7CisgICAgICAgIHVpbnQ4X3QgKipzcmMgPSBzLT5mcmFtZXBbcmVmXS0+dGYuZi0+ZGF0YTsKKyAgICAgICAgaW50IG9mZiA9IG14ICsgKG15ICsgKG1iX3ggJiAzKSAqIDQpICogcy0+bGluZXNpemUgKyA2NDsKKyAgICAgICAgLyogRm9yIHRocmVhZGluZywgYSBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MgaGVyZSBtaWdodCBiZSB1c2VmdWwsIGJ1dAorICAgICAgICAgKiBpdCBhY3R1YWxseSBzbG93cyBkb3duIHRoZSBkZWNvZGVyLiBTaW5jZSBhIGJhZCBwcmVmZXRjaCBkb2Vzbid0CisgICAgICAgICAqIGdlbmVyYXRlIGJhZCBkZWNvZGVyIG91dHB1dCwgd2UgZG9uJ3QgcnVuIGl0IGhlcmUuICovCisgICAgICAgIHMtPnZkc3AucHJlZmV0Y2goc3JjWzBdICsgb2ZmLCBzLT5saW5lc2l6ZSwgNCk7CisgICAgICAgIG9mZiA9IChteCA+PiAxKSArICgobXkgPj4gMSkgKyAobWJfeCAmIDcpKSAqIHMtPnV2bGluZXNpemUgKyA2NDsKKyAgICAgICAgcy0+dmRzcC5wcmVmZXRjaChzcmNbMV0gKyBvZmYsIHNyY1syXSAtIHNyY1sxXSwgMik7CisgICAgfQorfQorCisvKioKKyAqIEFwcGx5IG1vdGlvbiB2ZWN0b3JzIHRvIHByZWRpY3Rpb24gYnVmZmVyLCBjaGFwdGVyIDE4LgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZQordm9pZCBpbnRlcl9wcmVkaWN0KFZQOENvbnRleHQgKnMsIFZQOFRocmVhZERhdGEgKnRkLCB1aW50OF90ICpkc3RbM10sCisgICAgICAgICAgICAgICAgICAgVlA4TWFjcm9ibG9jayAqbWIsIGludCBtYl94LCBpbnQgbWJfeSkKK3sKKyAgICBpbnQgeF9vZmYgPSBtYl94IDw8IDQsIHlfb2ZmID0gbWJfeSA8PCA0OworICAgIGludCB3aWR0aCA9IDE2ICogcy0+bWJfd2lkdGgsIGhlaWdodCA9IDE2ICogcy0+bWJfaGVpZ2h0OworICAgIFRocmVhZEZyYW1lICpyZWYgPSAmcy0+ZnJhbWVwW21iLT5yZWZfZnJhbWVdLT50ZjsKKyAgICBWUDU2bXYgKmJtdiA9IG1iLT5ibXY7CisKKyAgICBzd2l0Y2ggKG1iLT5wYXJ0aXRpb25pbmcpIHsKKyAgICBjYXNlIFZQOF9TUExJVE1WTU9ERV9OT05FOgorICAgICAgICB2cDhfbWNfcGFydChzLCB0ZCwgZHN0LCByZWYsIHhfb2ZmLCB5X29mZiwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCwgMTYsIDE2LCB3aWR0aCwgaGVpZ2h0LCAmbWItPm12KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWUDhfU1BMSVRNVk1PREVfNHg0OiB7CisgICAgICAgIGludCB4LCB5OworICAgICAgICBWUDU2bXYgdXZtdjsKKworICAgICAgICAvKiBZICovCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspIHsKKyAgICAgICAgICAgICAgICB2cDhfbWNfbHVtYShzLCB0ZCwgZHN0WzBdICsgNCAqIHkgKiBzLT5saW5lc2l6ZSArIHggKiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiwgJmJtdls0ICogeSArIHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKiB4ICsgeF9vZmYsIDQgKiB5ICsgeV9vZmYsIDQsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHV0X3BpeGVsc190YWJbMl0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogVS9WICovCisgICAgICAgIHhfb2ZmICA+Pj0gMTsKKyAgICAgICAgeV9vZmYgID4+PSAxOworICAgICAgICB3aWR0aCAgPj49IDE7CisgICAgICAgIGhlaWdodCA+Pj0gMTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IDI7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgeworICAgICAgICAgICAgICAgIHV2bXYueCA9IG1iLT5ibXZbMiAqIHkgICAgICAgKiA0ICsgMiAqIHggICAgXS54ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYi0+Ym12WzIgKiB5ICAgICAgICogNCArIDIgKiB4ICsgMV0ueCArCisgICAgICAgICAgICAgICAgICAgICAgICAgbWItPmJtdlsoMiAqIHkgKyAxKSAqIDQgKyAyICogeCAgICBdLnggKworICAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5ibXZbKDIgKiB5ICsgMSkgKiA0ICsgMiAqIHggKyAxXS54OworICAgICAgICAgICAgICAgIHV2bXYueSA9IG1iLT5ibXZbMiAqIHkgICAgICAgKiA0ICsgMiAqIHggICAgXS55ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYi0+Ym12WzIgKiB5ICAgICAgICogNCArIDIgKiB4ICsgMV0ueSArCisgICAgICAgICAgICAgICAgICAgICAgICAgbWItPmJtdlsoMiAqIHkgKyAxKSAqIDQgKyAyICogeCAgICBdLnkgKworICAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5ibXZbKDIgKiB5ICsgMSkgKiA0ICsgMiAqIHggKyAxXS55OworICAgICAgICAgICAgICAgIHV2bXYueCA9ICh1dm12LnggKyAyICsgRkZfU0lHTkJJVCh1dm12LngpKSA+PiAyOworICAgICAgICAgICAgICAgIHV2bXYueSA9ICh1dm12LnkgKyAyICsgRkZfU0lHTkJJVCh1dm12LnkpKSA+PiAyOworICAgICAgICAgICAgICAgIGlmIChzLT5wcm9maWxlID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgdXZtdi54ICY9IH43OworICAgICAgICAgICAgICAgICAgICB1dm12LnkgJj0gfjc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZwOF9tY19jaHJvbWEocywgdGQsIGRzdFsxXSArIDQgKiB5ICogcy0+dXZsaW5lc2l6ZSArIHggKiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzJdICsgNCAqIHkgKiBzLT51dmxpbmVzaXplICsgeCAqIDQsIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dm12LCA0ICogeCArIHhfb2ZmLCA0ICogeSArIHlfb2ZmLCA0LCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcy0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnB1dF9waXhlbHNfdGFiWzJdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWUDhfU1BMSVRNVk1PREVfMTZ4ODoKKyAgICAgICAgdnA4X21jX3BhcnQocywgdGQsIGRzdCwgcmVmLCB4X29mZiwgeV9vZmYsCisgICAgICAgICAgICAgICAgICAgIDAsIDAsIDE2LCA4LCB3aWR0aCwgaGVpZ2h0LCAmYm12WzBdKTsKKyAgICAgICAgdnA4X21jX3BhcnQocywgdGQsIGRzdCwgcmVmLCB4X29mZiwgeV9vZmYsCisgICAgICAgICAgICAgICAgICAgIDAsIDgsIDE2LCA4LCB3aWR0aCwgaGVpZ2h0LCAmYm12WzFdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWUDhfU1BMSVRNVk1PREVfOHgxNjoKKyAgICAgICAgdnA4X21jX3BhcnQocywgdGQsIGRzdCwgcmVmLCB4X29mZiwgeV9vZmYsCisgICAgICAgICAgICAgICAgICAgIDAsIDAsIDgsIDE2LCB3aWR0aCwgaGVpZ2h0LCAmYm12WzBdKTsKKyAgICAgICAgdnA4X21jX3BhcnQocywgdGQsIGRzdCwgcmVmLCB4X29mZiwgeV9vZmYsCisgICAgICAgICAgICAgICAgICAgIDgsIDAsIDgsIDE2LCB3aWR0aCwgaGVpZ2h0LCAmYm12WzFdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWUDhfU1BMSVRNVk1PREVfOHg4OgorICAgICAgICB2cDhfbWNfcGFydChzLCB0ZCwgZHN0LCByZWYsIHhfb2ZmLCB5X29mZiwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCwgOCwgOCwgd2lkdGgsIGhlaWdodCwgJmJtdlswXSk7CisgICAgICAgIHZwOF9tY19wYXJ0KHMsIHRkLCBkc3QsIHJlZiwgeF9vZmYsIHlfb2ZmLAorICAgICAgICAgICAgICAgICAgICA4LCAwLCA4LCA4LCB3aWR0aCwgaGVpZ2h0LCAmYm12WzFdKTsKKyAgICAgICAgdnA4X21jX3BhcnQocywgdGQsIGRzdCwgcmVmLCB4X29mZiwgeV9vZmYsCisgICAgICAgICAgICAgICAgICAgIDAsIDgsIDgsIDgsIHdpZHRoLCBoZWlnaHQsICZibXZbMl0pOworICAgICAgICB2cDhfbWNfcGFydChzLCB0ZCwgZHN0LCByZWYsIHhfb2ZmLCB5X29mZiwKKyAgICAgICAgICAgICAgICAgICAgOCwgOCwgOCwgOCwgd2lkdGgsIGhlaWdodCwgJmJtdlszXSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgaWRjdF9tYihWUDhDb250ZXh0ICpzLCBWUDhUaHJlYWREYXRhICp0ZCwgdWludDhfdCAqZHN0WzNdLCBWUDhNYWNyb2Jsb2NrICptYikKK3sKKyAgICBpbnQgeCwgeSwgY2g7CisKKyAgICBpZiAobWItPm1vZGUgIT0gTU9ERV9JNHg0KSB7CisgICAgICAgIHVpbnQ4X3QgKnlfZHN0ID0gZHN0WzBdOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBubno0ID0gQVZfUkwzMih0ZC0+bm9uX3plcm9fY291bnRfY2FjaGVbeV0pOworICAgICAgICAgICAgaWYgKG5uejQpIHsKKyAgICAgICAgICAgICAgICBpZiAobm56NCAmIH4weDAxMDEwMTAxKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodWludDhfdCkgbm56NCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnZwOGRzcC52cDhfaWRjdF9kY19hZGQoeV9kc3QgKyA0ICogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5ibG9ja1t5XVt4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh1aW50OF90KSBubno0ID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT52cDhkc3AudnA4X2lkY3RfYWRkKHlfZHN0ICsgNCAqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+YmxvY2tbeV1beF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBubno0ID4+PSA4OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFubno0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+dnA4ZHNwLnZwOF9pZGN0X2RjX2FkZDR5KHlfZHN0LCB0ZC0+YmxvY2tbeV0sIHMtPmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5X2RzdCArPSA0ICogcy0+bGluZXNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCAyOyBjaCsrKSB7CisgICAgICAgIHVpbnQzMl90IG5uejQgPSBBVl9STDMyKHRkLT5ub25femVyb19jb3VudF9jYWNoZVs0ICsgY2hdKTsKKyAgICAgICAgaWYgKG5uejQpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmNoX2RzdCA9IGRzdFsxICsgY2hdOworICAgICAgICAgICAgaWYgKG5uejQgJiB+MHgwMTAxMDEwMSkgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAyOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50OF90KSBubno0ID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dnA4ZHNwLnZwOF9pZGN0X2RjX2FkZChjaF9kc3QgKyA0ICogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5ibG9ja1s0ICsgY2hdWyh5IDw8IDEpICsgeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT51dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh1aW50OF90KSBubno0ID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT52cDhkc3AudnA4X2lkY3RfYWRkKGNoX2RzdCArIDQgKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmJsb2NrWzQgKyBjaF1bKHkgPDwgMSkgKyB4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnV2bGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbm56NCA+Pj0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm56NCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNocm9tYV9pZGN0X2VuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaF9kc3QgKz0gNCAqIHMtPnV2bGluZXNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT52cDhkc3AudnA4X2lkY3RfZGNfYWRkNHV2KGNoX2RzdCwgdGQtPmJsb2NrWzQgKyBjaF0sIHMtPnV2bGluZXNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CitjaHJvbWFfaWRjdF9lbmQ6CisgICAgICAgIDsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIGZpbHRlcl9sZXZlbF9mb3JfbWIoVlA4Q29udGV4dCAqcywgVlA4TWFjcm9ibG9jayAqbWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RmlsdGVyU3RyZW5ndGggKmYsIGludCBpc192cDcpCit7CisgICAgaW50IGludGVyaW9yX2xpbWl0LCBmaWx0ZXJfbGV2ZWw7CisKKyAgICBpZiAocy0+c2VnbWVudGF0aW9uLmVuYWJsZWQpIHsKKyAgICAgICAgZmlsdGVyX2xldmVsID0gcy0+c2VnbWVudGF0aW9uLmZpbHRlcl9sZXZlbFttYi0+c2VnbWVudF07CisgICAgICAgIGlmICghcy0+c2VnbWVudGF0aW9uLmFic29sdXRlX3ZhbHMpCisgICAgICAgICAgICBmaWx0ZXJfbGV2ZWwgKz0gcy0+ZmlsdGVyLmxldmVsOworICAgIH0gZWxzZQorICAgICAgICBmaWx0ZXJfbGV2ZWwgPSBzLT5maWx0ZXIubGV2ZWw7CisKKyAgICBpZiAocy0+bGZfZGVsdGEuZW5hYmxlZCkgeworICAgICAgICBmaWx0ZXJfbGV2ZWwgKz0gcy0+bGZfZGVsdGEucmVmW21iLT5yZWZfZnJhbWVdOworICAgICAgICBmaWx0ZXJfbGV2ZWwgKz0gcy0+bGZfZGVsdGEubW9kZVttYi0+bW9kZV07CisgICAgfQorCisgICAgZmlsdGVyX2xldmVsID0gYXZfY2xpcF91aW50cDIoZmlsdGVyX2xldmVsLCA2KTsKKworICAgIGludGVyaW9yX2xpbWl0ID0gZmlsdGVyX2xldmVsOworICAgIGlmIChzLT5maWx0ZXIuc2hhcnBuZXNzKSB7CisgICAgICAgIGludGVyaW9yX2xpbWl0ID4+PSAocy0+ZmlsdGVyLnNoYXJwbmVzcyArIDMpID4+IDI7CisgICAgICAgIGludGVyaW9yX2xpbWl0ID0gRkZNSU4oaW50ZXJpb3JfbGltaXQsIDkgLSBzLT5maWx0ZXIuc2hhcnBuZXNzKTsKKyAgICB9CisgICAgaW50ZXJpb3JfbGltaXQgPSBGRk1BWChpbnRlcmlvcl9saW1pdCwgMSk7CisKKyAgICBmLT5maWx0ZXJfbGV2ZWwgPSBmaWx0ZXJfbGV2ZWw7CisgICAgZi0+aW5uZXJfbGltaXQgPSBpbnRlcmlvcl9saW1pdDsKKyAgICBmLT5pbm5lcl9maWx0ZXIgPSBpc192cDcgfHwgIW1iLT5za2lwIHx8IG1iLT5tb2RlID09IE1PREVfSTR4NCB8fAorICAgICAgICAgICAgICAgICAgICAgIG1iLT5tb2RlID09IFZQOF9NVk1PREVfU1BMSVQ7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCit2b2lkIGZpbHRlcl9tYihWUDhDb250ZXh0ICpzLCB1aW50OF90ICpkc3RbM10sIFZQOEZpbHRlclN0cmVuZ3RoICpmLAorICAgICAgICAgICAgICAgaW50IG1iX3gsIGludCBtYl95LCBpbnQgaXNfdnA3KQoreworICAgIGludCBtYmVkZ2VfbGltLCBiZWRnZV9saW1feSwgYmVkZ2VfbGltX3V2LCBoZXZfdGhyZXNoOworICAgIGludCBmaWx0ZXJfbGV2ZWwgPSBmLT5maWx0ZXJfbGV2ZWw7CisgICAgaW50IGlubmVyX2xpbWl0ID0gZi0+aW5uZXJfbGltaXQ7CisgICAgaW50IGlubmVyX2ZpbHRlciA9IGYtPmlubmVyX2ZpbHRlcjsKKyAgICBpbnQgbGluZXNpemUgPSBzLT5saW5lc2l6ZTsKKyAgICBpbnQgdXZsaW5lc2l6ZSA9IHMtPnV2bGluZXNpemU7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaGV2X3RocmVzaF9sdXRbMl1bNjRdID0geworICAgICAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsCisgICAgICAgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAgICAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgICAgICAgIDMsIDMsIDMsIDMgfSwKKyAgICAgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLAorICAgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgICAgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAgICAgICAyLCAyLCAyLCAyIH0KKyAgICB9OworCisgICAgaWYgKCFmaWx0ZXJfbGV2ZWwpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChpc192cDcpIHsKKyAgICAgICAgYmVkZ2VfbGltX3kgID0gZmlsdGVyX2xldmVsOworICAgICAgICBiZWRnZV9saW1fdXYgPSBmaWx0ZXJfbGV2ZWwgKiAyOworICAgICAgICBtYmVkZ2VfbGltICAgPSBmaWx0ZXJfbGV2ZWwgKyAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGJlZGdlX2xpbV95ICA9CisgICAgICAgIGJlZGdlX2xpbV91diA9IGZpbHRlcl9sZXZlbCAqIDIgKyBpbm5lcl9saW1pdDsKKyAgICAgICAgbWJlZGdlX2xpbSAgID0gYmVkZ2VfbGltX3kgKyA0OworICAgIH0KKworICAgIGhldl90aHJlc2ggPSBoZXZfdGhyZXNoX2x1dFtzLT5rZXlmcmFtZV1bZmlsdGVyX2xldmVsXTsKKworICAgIGlmIChtYl94KSB7CisgICAgICAgIHMtPnZwOGRzcC52cDhfaF9sb29wX2ZpbHRlcjE2eShkc3RbMF0sIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJlZGdlX2xpbSwgaW5uZXJfbGltaXQsIGhldl90aHJlc2gpOworICAgICAgICBzLT52cDhkc3AudnA4X2hfbG9vcF9maWx0ZXI4dXYoZHN0WzFdLCBkc3RbMl0sIHV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmVkZ2VfbGltLCBpbm5lcl9saW1pdCwgaGV2X3RocmVzaCk7CisgICAgfQorCisjZGVmaW5lIEhfTE9PUF9GSUxURVJfMTZZX0lOTkVSKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNvbmQgJiYgaW5uZXJfZmlsdGVyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMtPnZwOGRzcC52cDhfaF9sb29wX2ZpbHRlcjE2eV9pbm5lcihkc3RbMF0gKyAgNCwgbGluZXNpemUsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWRnZV9saW1feSwgaW5uZXJfbGltaXQsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXZfdGhyZXNoKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMtPnZwOGRzcC52cDhfaF9sb29wX2ZpbHRlcjE2eV9pbm5lcihkc3RbMF0gKyAgOCwgbGluZXNpemUsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWRnZV9saW1feSwgaW5uZXJfbGltaXQsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXZfdGhyZXNoKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMtPnZwOGRzcC52cDhfaF9sb29wX2ZpbHRlcjE2eV9pbm5lcihkc3RbMF0gKyAxMiwgbGluZXNpemUsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWRnZV9saW1feSwgaW5uZXJfbGltaXQsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXZfdGhyZXNoKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMtPnZwOGRzcC52cDhfaF9sb29wX2ZpbHRlcjh1dl9pbm5lcihkc3RbMV0gKyAgNCwgZHN0WzJdICsgNCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dmxpbmVzaXplLCAgYmVkZ2VfbGltX3V2LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lcl9saW1pdCwgaGV2X3RocmVzaCk7ICAgICAgICBcCisgICAgfQorCisgICAgSF9MT09QX0ZJTFRFUl8xNllfSU5ORVIoIWlzX3ZwNykKKworICAgIGlmIChtYl95KSB7CisgICAgICAgIHMtPnZwOGRzcC52cDhfdl9sb29wX2ZpbHRlcjE2eShkc3RbMF0sIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJlZGdlX2xpbSwgaW5uZXJfbGltaXQsIGhldl90aHJlc2gpOworICAgICAgICBzLT52cDhkc3AudnA4X3ZfbG9vcF9maWx0ZXI4dXYoZHN0WzFdLCBkc3RbMl0sIHV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmVkZ2VfbGltLCBpbm5lcl9saW1pdCwgaGV2X3RocmVzaCk7CisgICAgfQorCisgICAgaWYgKGlubmVyX2ZpbHRlcikgeworICAgICAgICBzLT52cDhkc3AudnA4X3ZfbG9vcF9maWx0ZXIxNnlfaW5uZXIoZHN0WzBdICsgIDQgKiBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplLCBiZWRnZV9saW1feSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyX2xpbWl0LCBoZXZfdGhyZXNoKTsKKyAgICAgICAgcy0+dnA4ZHNwLnZwOF92X2xvb3BfZmlsdGVyMTZ5X2lubmVyKGRzdFswXSArICA4ICogbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwgYmVkZ2VfbGltX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lcl9saW1pdCwgaGV2X3RocmVzaCk7CisgICAgICAgIHMtPnZwOGRzcC52cDhfdl9sb29wX2ZpbHRlcjE2eV9pbm5lcihkc3RbMF0gKyAxMiAqIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUsIGJlZGdlX2xpbV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJfbGltaXQsIGhldl90aHJlc2gpOworICAgICAgICBzLT52cDhkc3AudnA4X3ZfbG9vcF9maWx0ZXI4dXZfaW5uZXIoZHN0WzFdICsgIDQgKiB1dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzJdICsgIDQgKiB1dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgYmVkZ2VfbGltX3V2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJfbGltaXQsIGhldl90aHJlc2gpOworICAgIH0KKworICAgIEhfTE9PUF9GSUxURVJfMTZZX0lOTkVSKGlzX3ZwNykKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK3ZvaWQgZmlsdGVyX21iX3NpbXBsZShWUDhDb250ZXh0ICpzLCB1aW50OF90ICpkc3QsIFZQOEZpbHRlclN0cmVuZ3RoICpmLAorICAgICAgICAgICAgICAgICAgICAgIGludCBtYl94LCBpbnQgbWJfeSkKK3sKKyAgICBpbnQgbWJlZGdlX2xpbSwgYmVkZ2VfbGltOworICAgIGludCBmaWx0ZXJfbGV2ZWwgPSBmLT5maWx0ZXJfbGV2ZWw7CisgICAgaW50IGlubmVyX2xpbWl0ICA9IGYtPmlubmVyX2xpbWl0OworICAgIGludCBpbm5lcl9maWx0ZXIgPSBmLT5pbm5lcl9maWx0ZXI7CisgICAgaW50IGxpbmVzaXplICAgICA9IHMtPmxpbmVzaXplOworCisgICAgaWYgKCFmaWx0ZXJfbGV2ZWwpCisgICAgICAgIHJldHVybjsKKworICAgIGJlZGdlX2xpbSAgPSAyICogZmlsdGVyX2xldmVsICsgaW5uZXJfbGltaXQ7CisgICAgbWJlZGdlX2xpbSA9IGJlZGdlX2xpbSArIDQ7CisKKyAgICBpZiAobWJfeCkKKyAgICAgICAgcy0+dnA4ZHNwLnZwOF9oX2xvb3BfZmlsdGVyX3NpbXBsZShkc3QsIGxpbmVzaXplLCBtYmVkZ2VfbGltKTsKKyAgICBpZiAoaW5uZXJfZmlsdGVyKSB7CisgICAgICAgIHMtPnZwOGRzcC52cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGUoZHN0ICsgIDQsIGxpbmVzaXplLCBiZWRnZV9saW0pOworICAgICAgICBzLT52cDhkc3AudnA4X2hfbG9vcF9maWx0ZXJfc2ltcGxlKGRzdCArICA4LCBsaW5lc2l6ZSwgYmVkZ2VfbGltKTsKKyAgICAgICAgcy0+dnA4ZHNwLnZwOF9oX2xvb3BfZmlsdGVyX3NpbXBsZShkc3QgKyAxMiwgbGluZXNpemUsIGJlZGdlX2xpbSk7CisgICAgfQorCisgICAgaWYgKG1iX3kpCisgICAgICAgIHMtPnZwOGRzcC52cDhfdl9sb29wX2ZpbHRlcl9zaW1wbGUoZHN0LCBsaW5lc2l6ZSwgbWJlZGdlX2xpbSk7CisgICAgaWYgKGlubmVyX2ZpbHRlcikgeworICAgICAgICBzLT52cDhkc3AudnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlKGRzdCArICA0ICogbGluZXNpemUsIGxpbmVzaXplLCBiZWRnZV9saW0pOworICAgICAgICBzLT52cDhkc3AudnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlKGRzdCArICA4ICogbGluZXNpemUsIGxpbmVzaXplLCBiZWRnZV9saW0pOworICAgICAgICBzLT52cDhkc3AudnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlKGRzdCArIDEyICogbGluZXNpemUsIGxpbmVzaXplLCBiZWRnZV9saW0pOworICAgIH0KK30KKworI2RlZmluZSBNQVJHSU4gKDE2IDw8IDIpCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZQordm9pZCB2cDc4X2RlY29kZV9tdl9tYl9tb2RlcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFZQOEZyYW1lICpjdXJmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEZyYW1lICpwcmV2X2ZyYW1lLCBpbnQgaXNfdnA3KQoreworICAgIFZQOENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBtYl94LCBtYl95OworCisgICAgcy0+bXZfbWluLnkgPSAtTUFSR0lOOworICAgIHMtPm12X21heC55ID0gKChzLT5tYl9oZWlnaHQgLSAxKSA8PCA2KSArIE1BUkdJTjsKKyAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgcy0+bWJfaGVpZ2h0OyBtYl95KyspIHsKKyAgICAgICAgVlA4TWFjcm9ibG9jayAqbWIgPSBzLT5tYWNyb2Jsb2Nrc19iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHMtPm1iX3dpZHRoICsgMSkgKiAobWJfeSArIDEpICsgMSk7CisgICAgICAgIGludCBtYl94eSA9IG1iX3kgKiBzLT5tYl93aWR0aDsKKworICAgICAgICBBVl9XTjMyQShzLT5pbnRyYTR4NF9wcmVkX21vZGVfbGVmdCwgRENfUFJFRCAqIDB4MDEwMTAxMDEpOworCisgICAgICAgIHMtPm12X21pbi54ID0gLU1BUkdJTjsKKyAgICAgICAgcy0+bXZfbWF4LnggPSAoKHMtPm1iX3dpZHRoIC0gMSkgPDwgNikgKyBNQVJHSU47CisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrLCBtYl94eSsrLCBtYisrKSB7CisgICAgICAgICAgICBpZiAobWJfeSA9PSAwKQorICAgICAgICAgICAgICAgIEFWX1dOMzJBKChtYiAtIHMtPm1iX3dpZHRoIC0gMSktPmludHJhNHg0X3ByZWRfbW9kZV90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgRENfUFJFRCAqIDB4MDEwMTAxMDEpOworICAgICAgICAgICAgZGVjb2RlX21iX21vZGUocywgbWIsIG1iX3gsIG1iX3ksIGN1cmZyYW1lLT5zZWdfbWFwLT5kYXRhICsgbWJfeHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2ZyYW1lICYmIHByZXZfZnJhbWUtPnNlZ19tYXAgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9mcmFtZS0+c2VnX21hcC0+ZGF0YSArIG1iX3h5IDogTlVMTCwgMSwgaXNfdnA3KTsKKyAgICAgICAgICAgIHMtPm12X21pbi54IC09IDY0OworICAgICAgICAgICAgcy0+bXZfbWF4LnggLT0gNjQ7CisgICAgICAgIH0KKyAgICAgICAgcy0+bXZfbWluLnkgLT0gNjQ7CisgICAgICAgIHMtPm12X21heC55IC09IDY0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgdnA3X2RlY29kZV9tdl9tYl9tb2RlcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFZQOEZyYW1lICpjdXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEZyYW1lICpwcmV2X2ZyYW1lKQoreworICAgIHZwNzhfZGVjb2RlX212X21iX21vZGVzKGF2Y3R4LCBjdXJfZnJhbWUsIHByZXZfZnJhbWUsIElTX1ZQNyk7Cit9CisKK3N0YXRpYyB2b2lkIHZwOF9kZWNvZGVfbXZfbWJfbW9kZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWUDhGcmFtZSAqY3VyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhGcmFtZSAqcHJldl9mcmFtZSkKK3sKKyAgICB2cDc4X2RlY29kZV9tdl9tYl9tb2RlcyhhdmN0eCwgY3VyX2ZyYW1lLCBwcmV2X2ZyYW1lLCBJU19WUDgpOworfQorCisjaWYgSEFWRV9USFJFQURTCisjZGVmaW5lIGNoZWNrX3RocmVhZF9wb3ModGQsIG90ZCwgbWJfeF9jaGVjaywgbWJfeV9jaGVjaykgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB0bXAgPSAobWJfeV9jaGVjayA8PCAxNikgfCAobWJfeF9jaGVjayAmIDB4RkZGRik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChvdGQtPnRocmVhZF9tYl9wb3MgPCB0bXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm90ZC0+bG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZC0+d2FpdF9tYl9wb3MgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKG90ZC0+dGhyZWFkX21iX3BvcyA+PSB0bXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJm90ZC0+Y29uZCwgJm90ZC0+bG9jayk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IHdoaWxlICgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZC0+d2FpdF9tYl9wb3MgPSBJTlRfTUFYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmb3RkLT5sb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgdXBkYXRlX3Bvcyh0ZCwgbWJfeSwgbWJfeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHBvcyAgICAgICAgICAgICAgPSAobWJfeSA8PCAxNikgfCAobWJfeCAmIDB4RkZGRik7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHNsaWNlZF90aHJlYWRpbmcgPSAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSA9PSBGRl9USFJFQURfU0xJQ0UpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVtX2pvYnMgPiAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGlzX251bGwgICAgICAgICAgPSAhbmV4dF90ZCB8fCAhcHJldl90ZDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHBvc19jaGVjayAgICAgICAgPSAoaXNfbnVsbCkgPyAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobmV4dF90ZCAhPSB0ZCAmJiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID49IG5leHRfdGQtPndhaXRfbWJfcG9zKSB8fCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldl90ZCAhPSB0ZCAmJiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID49IHByZXZfdGQtPndhaXRfbWJfcG9zKTsgICAgIFwKKyAgICAgICAgdGQtPnRocmVhZF9tYl9wb3MgPSBwb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNsaWNlZF90aHJlYWRpbmcgJiYgcG9zX2NoZWNrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGQtPmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnRkLT5jb25kKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0ZC0+bG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsKKyNlbHNlCisjZGVmaW5lIGNoZWNrX3RocmVhZF9wb3ModGQsIG90ZCwgbWJfeF9jaGVjaywgbWJfeV9jaGVjaykKKyNkZWZpbmUgdXBkYXRlX3Bvcyh0ZCwgbWJfeSwgbWJfeCkKKyNlbmRpZgorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGRlY29kZV9tYl9yb3dfbm9fZmlsdGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIsIGludCBpc192cDcpCit7CisgICAgVlA4Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVlA4VGhyZWFkRGF0YSAqcHJldl90ZCwgKm5leHRfdGQsICp0ZCA9ICZzLT50aHJlYWRfZGF0YVt0aHJlYWRucl07CisgICAgaW50IG1iX3kgPSB0ZC0+dGhyZWFkX21iX3BvcyA+PiAxNjsKKyAgICBpbnQgbWJfeCwgbWJfeHkgPSBtYl95ICogcy0+bWJfd2lkdGg7CisgICAgaW50IG51bV9qb2JzID0gcy0+bnVtX2pvYnM7CisgICAgVlA4RnJhbWUgKmN1cmZyYW1lID0gcy0+Y3VyZnJhbWUsICpwcmV2X2ZyYW1lID0gcy0+cHJldl9mcmFtZTsKKyAgICBWUDU2UmFuZ2VDb2RlciAqYyAgPSAmcy0+Y29lZmZfcGFydGl0aW9uW21iX3kgJiAocy0+bnVtX2NvZWZmX3BhcnRpdGlvbnMgLSAxKV07CisgICAgVlA4TWFjcm9ibG9jayAqbWI7CisgICAgdWludDhfdCAqZHN0WzNdID0geworICAgICAgICBjdXJmcmFtZS0+dGYuZi0+ZGF0YVswXSArIDE2ICogbWJfeSAqIHMtPmxpbmVzaXplLAorICAgICAgICBjdXJmcmFtZS0+dGYuZi0+ZGF0YVsxXSArICA4ICogbWJfeSAqIHMtPnV2bGluZXNpemUsCisgICAgICAgIGN1cmZyYW1lLT50Zi5mLT5kYXRhWzJdICsgIDggKiBtYl95ICogcy0+dXZsaW5lc2l6ZQorICAgIH07CisgICAgaWYgKG1iX3kgPT0gMCkKKyAgICAgICAgcHJldl90ZCA9IHRkOworICAgIGVsc2UKKyAgICAgICAgcHJldl90ZCA9ICZzLT50aHJlYWRfZGF0YVsoam9ibnIgKyBudW1fam9icyAtIDEpICUgbnVtX2pvYnNdOworICAgIGlmIChtYl95ID09IHMtPm1iX2hlaWdodCAtIDEpCisgICAgICAgIG5leHRfdGQgPSB0ZDsKKyAgICBlbHNlCisgICAgICAgIG5leHRfdGQgPSAmcy0+dGhyZWFkX2RhdGFbKGpvYm5yICsgMSkgJSBudW1fam9ic107CisgICAgaWYgKHMtPm1iX2xheW91dCA9PSAxKQorICAgICAgICBtYiA9IHMtPm1hY3JvYmxvY2tzX2Jhc2UgKyAoKHMtPm1iX3dpZHRoICsgMSkgKiAobWJfeSArIDEpICsgMSk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJldmlvdXMgZnJhbWUgaGFzIHJlYWQgaXRzIHNlZ21lbnRhdGlvbiBtYXAsCisgICAgICAgIC8vIGlmIHdlIHJlLXVzZSB0aGUgc2FtZSBtYXAuCisgICAgICAgIGlmIChwcmV2X2ZyYW1lICYmIHMtPnNlZ21lbnRhdGlvbi5lbmFibGVkICYmCisgICAgICAgICAgICAhcy0+c2VnbWVudGF0aW9uLnVwZGF0ZV9tYXApCisgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnByZXZfZnJhbWUtPnRmLCBtYl95LCAwKTsKKyAgICAgICAgbWIgPSBzLT5tYWNyb2Jsb2NrcyArIChzLT5tYl9oZWlnaHQgLSBtYl95IC0gMSkgKiAyOworICAgICAgICBtZW1zZXQobWIgLSAxLCAwLCBzaXplb2YoKm1iKSk7IC8vIHplcm8gbGVmdCBtYWNyb2Jsb2NrCisgICAgICAgIEFWX1dOMzJBKHMtPmludHJhNHg0X3ByZWRfbW9kZV9sZWZ0LCBEQ19QUkVEICogMHgwMTAxMDEwMSk7CisgICAgfQorCisgICAgaWYgKCFpc192cDcgfHwgbWJfeSA9PSAwKQorICAgICAgICBtZW1zZXQodGQtPmxlZnRfbm56LCAwLCBzaXplb2YodGQtPmxlZnRfbm56KSk7CisKKyAgICBzLT5tdl9taW4ueCA9IC1NQVJHSU47CisgICAgcy0+bXZfbWF4LnggPSAoKHMtPm1iX3dpZHRoIC0gMSkgPDwgNikgKyBNQVJHSU47CisKKyAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKywgbWJfeHkrKywgbWIrKykgeworICAgICAgICAvLyBXYWl0IGZvciBwcmV2aW91cyB0aHJlYWQgdG8gcmVhZCBtYl94KzIsIGFuZCByZWFjaCBtYl95LTEuCisgICAgICAgIGlmIChwcmV2X3RkICE9IHRkKSB7CisgICAgICAgICAgICBpZiAodGhyZWFkbnIgIT0gMCkgeworICAgICAgICAgICAgICAgIGNoZWNrX3RocmVhZF9wb3ModGQsIHByZXZfdGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl94ICsgKGlzX3ZwNyA/IDIgOiAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3kgLSAoaXNfdnA3ID8gMiA6IDEpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hlY2tfdGhyZWFkX3Bvcyh0ZCwgcHJldl90ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3ggKyAoaXNfdnA3ID8gMiA6IDEpICsgcy0+bWJfd2lkdGggKyAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfeSAtIChpc192cDcgPyAyIDogMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcy0+dmRzcC5wcmVmZXRjaChkc3RbMF0gKyAobWJfeCAmIDMpICogNCAqIHMtPmxpbmVzaXplICsgNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemUsIDQpOworICAgICAgICBzLT52ZHNwLnByZWZldGNoKGRzdFsxXSArIChtYl94ICYgNykgKiBzLT51dmxpbmVzaXplICsgNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzJdIC0gZHN0WzFdLCAyKTsKKworICAgICAgICBpZiAoIXMtPm1iX2xheW91dCkKKyAgICAgICAgICAgIGRlY29kZV9tYl9tb2RlKHMsIG1iLCBtYl94LCBtYl95LCBjdXJmcmFtZS0+c2VnX21hcC0+ZGF0YSArIG1iX3h5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9mcmFtZSAmJiBwcmV2X2ZyYW1lLT5zZWdfbWFwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfZnJhbWUtPnNlZ19tYXAtPmRhdGEgKyBtYl94eSA6IE5VTEwsIDAsIGlzX3ZwNyk7CisKKyAgICAgICAgcHJlZmV0Y2hfbW90aW9uKHMsIG1iLCBtYl94LCBtYl95LCBtYl94eSwgVlA1Nl9GUkFNRV9QUkVWSU9VUyk7CisKKyAgICAgICAgaWYgKCFtYi0+c2tpcCkKKyAgICAgICAgICAgIGRlY29kZV9tYl9jb2VmZnMocywgdGQsIGMsIG1iLCBzLT50b3Bfbm56W21iX3hdLCB0ZC0+bGVmdF9ubnosIGlzX3ZwNyk7CisKKyAgICAgICAgaWYgKG1iLT5tb2RlIDw9IE1PREVfSTR4NCkKKyAgICAgICAgICAgIGludHJhX3ByZWRpY3QocywgdGQsIGRzdCwgbWIsIG1iX3gsIG1iX3ksIGlzX3ZwNyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGludGVyX3ByZWRpY3QocywgdGQsIGRzdCwgbWIsIG1iX3gsIG1iX3kpOworCisgICAgICAgIHByZWZldGNoX21vdGlvbihzLCBtYiwgbWJfeCwgbWJfeSwgbWJfeHksIFZQNTZfRlJBTUVfR09MREVOKTsKKworICAgICAgICBpZiAoIW1iLT5za2lwKSB7CisgICAgICAgICAgICBpZGN0X21iKHMsIHRkLCBkc3QsIG1iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFWX1pFUk82NCh0ZC0+bGVmdF9ubnopOworICAgICAgICAgICAgQVZfV042NChzLT50b3Bfbm56W21iX3hdLCAwKTsgICAvLyBhcnJheSBvZiA5LCBzbyB1bmFsaWduZWQKKworICAgICAgICAgICAgLyogUmVzZXQgREMgYmxvY2sgcHJlZGljdG9ycyBpZiB0aGV5IHdvdWxkIGV4aXN0CisgICAgICAgICAgICAgKiBpZiB0aGUgbWIgaGFkIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgICAgaWYgKG1iLT5tb2RlICE9IE1PREVfSTR4NCAmJiBtYi0+bW9kZSAhPSBWUDhfTVZNT0RFX1NQTElUKSB7CisgICAgICAgICAgICAgICAgdGQtPmxlZnRfbm56WzhdICAgICA9IDA7CisgICAgICAgICAgICAgICAgcy0+dG9wX25uelttYl94XVs4XSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+ZGVibG9ja19maWx0ZXIpCisgICAgICAgICAgICBmaWx0ZXJfbGV2ZWxfZm9yX21iKHMsIG1iLCAmdGQtPmZpbHRlcl9zdHJlbmd0aFttYl94XSwgaXNfdnA3KTsKKworICAgICAgICBpZiAocy0+ZGVibG9ja19maWx0ZXIgJiYgbnVtX2pvYnMgIT0gMSAmJiB0aHJlYWRuciA9PSBudW1fam9icyAtIDEpIHsKKyAgICAgICAgICAgIGlmIChzLT5maWx0ZXIuc2ltcGxlKQorICAgICAgICAgICAgICAgIGJhY2t1cF9tYl9ib3JkZXIocy0+dG9wX2JvcmRlclttYl94ICsgMV0sIGRzdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIHMtPmxpbmVzaXplLCAwLCAxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiYWNrdXBfbWJfYm9yZGVyKHMtPnRvcF9ib3JkZXJbbWJfeCArIDFdLCBkc3RbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMV0sIGRzdFsyXSwgcy0+bGluZXNpemUsIHMtPnV2bGluZXNpemUsIDApOworICAgICAgICB9CisKKyAgICAgICAgcHJlZmV0Y2hfbW90aW9uKHMsIG1iLCBtYl94LCBtYl95LCBtYl94eSwgVlA1Nl9GUkFNRV9HT0xERU4yKTsKKworICAgICAgICBkc3RbMF0gICAgICArPSAxNjsKKyAgICAgICAgZHN0WzFdICAgICAgKz0gODsKKyAgICAgICAgZHN0WzJdICAgICAgKz0gODsKKyAgICAgICAgcy0+bXZfbWluLnggLT0gNjQ7CisgICAgICAgIHMtPm12X21heC54IC09IDY0OworCisgICAgICAgIGlmIChtYl94ID09IHMtPm1iX3dpZHRoICsgMSkgeworICAgICAgICAgICAgdXBkYXRlX3Bvcyh0ZCwgbWJfeSwgcy0+bWJfd2lkdGggKyAzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVwZGF0ZV9wb3ModGQsIG1iX3ksIG1iX3gpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2cDdfZGVjb2RlX21iX3Jvd19ub19maWx0ZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICp0ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgam9ibnIsIGludCB0aHJlYWRucikKK3sKKyAgICBkZWNvZGVfbWJfcm93X25vX2ZpbHRlcihhdmN0eCwgdGRhdGEsIGpvYm5yLCB0aHJlYWRuciwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHZwOF9kZWNvZGVfbWJfcm93X25vX2ZpbHRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnRkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqb2JuciwgaW50IHRocmVhZG5yKQoreworICAgIGRlY29kZV9tYl9yb3dfbm9fZmlsdGVyKGF2Y3R4LCB0ZGF0YSwgam9ibnIsIHRocmVhZG5yLCAwKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmaWx0ZXJfbWJfcm93KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgam9ibnIsIGludCB0aHJlYWRuciwgaW50IGlzX3ZwNykKK3sKKyAgICBWUDhDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWUDhUaHJlYWREYXRhICp0ZCA9ICZzLT50aHJlYWRfZGF0YVt0aHJlYWRucl07CisgICAgaW50IG1iX3gsIG1iX3kgPSB0ZC0+dGhyZWFkX21iX3BvcyA+PiAxNiwgbnVtX2pvYnMgPSBzLT5udW1fam9iczsKKyAgICBBVkZyYW1lICpjdXJmcmFtZSA9IHMtPmN1cmZyYW1lLT50Zi5mOworICAgIFZQOE1hY3JvYmxvY2sgKm1iOworICAgIFZQOFRocmVhZERhdGEgKnByZXZfdGQsICpuZXh0X3RkOworICAgIHVpbnQ4X3QgKmRzdFszXSA9IHsKKyAgICAgICAgY3VyZnJhbWUtPmRhdGFbMF0gKyAxNiAqIG1iX3kgKiBzLT5saW5lc2l6ZSwKKyAgICAgICAgY3VyZnJhbWUtPmRhdGFbMV0gKyAgOCAqIG1iX3kgKiBzLT51dmxpbmVzaXplLAorICAgICAgICBjdXJmcmFtZS0+ZGF0YVsyXSArICA4ICogbWJfeSAqIHMtPnV2bGluZXNpemUKKyAgICB9OworCisgICAgaWYgKHMtPm1iX2xheW91dCA9PSAxKQorICAgICAgICBtYiA9IHMtPm1hY3JvYmxvY2tzX2Jhc2UgKyAoKHMtPm1iX3dpZHRoICsgMSkgKiAobWJfeSArIDEpICsgMSk7CisgICAgZWxzZQorICAgICAgICBtYiA9IHMtPm1hY3JvYmxvY2tzICsgKHMtPm1iX2hlaWdodCAtIG1iX3kgLSAxKSAqIDI7CisKKyAgICBpZiAobWJfeSA9PSAwKQorICAgICAgICBwcmV2X3RkID0gdGQ7CisgICAgZWxzZQorICAgICAgICBwcmV2X3RkID0gJnMtPnRocmVhZF9kYXRhWyhqb2JuciArIG51bV9qb2JzIC0gMSkgJSBudW1fam9ic107CisgICAgaWYgKG1iX3kgPT0gcy0+bWJfaGVpZ2h0IC0gMSkKKyAgICAgICAgbmV4dF90ZCA9IHRkOworICAgIGVsc2UKKyAgICAgICAgbmV4dF90ZCA9ICZzLT50aHJlYWRfZGF0YVsoam9ibnIgKyAxKSAlIG51bV9qb2JzXTsKKworICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrLCBtYisrKSB7CisgICAgICAgIFZQOEZpbHRlclN0cmVuZ3RoICpmID0gJnRkLT5maWx0ZXJfc3RyZW5ndGhbbWJfeF07CisgICAgICAgIGlmIChwcmV2X3RkICE9IHRkKQorICAgICAgICAgICAgY2hlY2tfdGhyZWFkX3Bvcyh0ZCwgcHJldl90ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1iX3ggKyAxKSArIChzLT5tYl93aWR0aCArIDMpLCBtYl95IC0gMSk7CisgICAgICAgIGlmIChuZXh0X3RkICE9IHRkKQorICAgICAgICAgICAgaWYgKG5leHRfdGQgIT0gJnMtPnRocmVhZF9kYXRhWzBdKQorICAgICAgICAgICAgICAgIGNoZWNrX3RocmVhZF9wb3ModGQsIG5leHRfdGQsIG1iX3ggKyAxLCBtYl95ICsgMSk7CisKKyAgICAgICAgaWYgKG51bV9qb2JzID09IDEpIHsKKyAgICAgICAgICAgIGlmIChzLT5maWx0ZXIuc2ltcGxlKQorICAgICAgICAgICAgICAgIGJhY2t1cF9tYl9ib3JkZXIocy0+dG9wX2JvcmRlclttYl94ICsgMV0sIGRzdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIHMtPmxpbmVzaXplLCAwLCAxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiYWNrdXBfbWJfYm9yZGVyKHMtPnRvcF9ib3JkZXJbbWJfeCArIDFdLCBkc3RbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMV0sIGRzdFsyXSwgcy0+bGluZXNpemUsIHMtPnV2bGluZXNpemUsIDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPmZpbHRlci5zaW1wbGUpCisgICAgICAgICAgICBmaWx0ZXJfbWJfc2ltcGxlKHMsIGRzdFswXSwgZiwgbWJfeCwgbWJfeSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpbHRlcl9tYihzLCBkc3QsIGYsIG1iX3gsIG1iX3ksIGlzX3ZwNyk7CisgICAgICAgIGRzdFswXSArPSAxNjsKKyAgICAgICAgZHN0WzFdICs9IDg7CisgICAgICAgIGRzdFsyXSArPSA4OworCisgICAgICAgIHVwZGF0ZV9wb3ModGQsIG1iX3ksIChzLT5tYl93aWR0aCArIDMpICsgbWJfeCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2cDdfZmlsdGVyX21iX3JvdyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnRkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIpCit7CisgICAgZmlsdGVyX21iX3JvdyhhdmN0eCwgdGRhdGEsIGpvYm5yLCB0aHJlYWRuciwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHZwOF9maWx0ZXJfbWJfcm93KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgam9ibnIsIGludCB0aHJlYWRucikKK3sKKyAgICBmaWx0ZXJfbWJfcm93KGF2Y3R4LCB0ZGF0YSwgam9ibnIsIHRocmVhZG5yLCAwKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK2ludCB2cDc4X2RlY29kZV9tYl9yb3dfc2xpY2VkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEsIGludCBqb2JuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlYWRuciwgaW50IGlzX3ZwNykKK3sKKyAgICBWUDhDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWUDhUaHJlYWREYXRhICp0ZCA9ICZzLT50aHJlYWRfZGF0YVtqb2Jucl07CisgICAgVlA4VGhyZWFkRGF0YSAqbmV4dF90ZCA9IE5VTEwsICpwcmV2X3RkID0gTlVMTDsKKyAgICBWUDhGcmFtZSAqY3VyZnJhbWUgPSBzLT5jdXJmcmFtZTsKKyAgICBpbnQgbWJfeSwgbnVtX2pvYnMgPSBzLT5udW1fam9iczsKKworICAgIHRkLT50aHJlYWRfbnIgPSB0aHJlYWRucjsKKyAgICBmb3IgKG1iX3kgPSBqb2JucjsgbWJfeSA8IHMtPm1iX2hlaWdodDsgbWJfeSArPSBudW1fam9icykgeworICAgICAgICBpZiAobWJfeSA+PSBzLT5tYl9oZWlnaHQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdGQtPnRocmVhZF9tYl9wb3MgPSBtYl95IDw8IDE2OworICAgICAgICBzLT5kZWNvZGVfbWJfcm93X25vX2ZpbHRlcihhdmN0eCwgdGRhdGEsIGpvYm5yLCB0aHJlYWRucik7CisgICAgICAgIGlmIChzLT5kZWJsb2NrX2ZpbHRlcikKKyAgICAgICAgICAgIHMtPmZpbHRlcl9tYl9yb3coYXZjdHgsIHRkYXRhLCBqb2JuciwgdGhyZWFkbnIpOworICAgICAgICB1cGRhdGVfcG9zKHRkLCBtYl95LCBJTlRfTUFYICYgMHhGRkZGKTsKKworICAgICAgICBzLT5tdl9taW4ueSAtPSA2NDsKKyAgICAgICAgcy0+bXZfbWF4LnkgLT0gNjQ7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgPT0gRkZfVEhSRUFEX0ZSQU1FKQorICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmY3VyZnJhbWUtPnRmLCBtYl95LCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDdfZGVjb2RlX21iX3Jvd19zbGljZWQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICp0ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqb2JuciwgaW50IHRocmVhZG5yKQoreworICAgIHJldHVybiB2cDc4X2RlY29kZV9tYl9yb3dfc2xpY2VkKGF2Y3R4LCB0ZGF0YSwgam9ibnIsIHRocmVhZG5yLCBJU19WUDcpOworfQorCitzdGF0aWMgaW50IHZwOF9kZWNvZGVfbWJfcm93X3NsaWNlZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnRkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIpCit7CisgICAgcmV0dXJuIHZwNzhfZGVjb2RlX21iX3Jvd19zbGljZWQoYXZjdHgsIHRkYXRhLCBqb2JuciwgdGhyZWFkbnIsIElTX1ZQOCk7Cit9CisKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK2ludCB2cDc4X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCwgaW50IGlzX3ZwNykKK3sKKyAgICBWUDhDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBpLCByZWZlcmVuY2VkLCBudW1fam9iczsKKyAgICBlbnVtIEFWRGlzY2FyZCBza2lwX3RocmVzaDsKKyAgICBWUDhGcmFtZSAqYXZfdW5pbml0KGN1cmZyYW1lKSwgKnByZXZfZnJhbWU7CisKKyAgICBpZiAoaXNfdnA3KQorICAgICAgICByZXQgPSB2cDdfZGVjb2RlX2ZyYW1lX2hlYWRlcihzLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gdnA4X2RlY29kZV9mcmFtZV9oZWFkZXIocywgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVycjsKKworICAgIHByZXZfZnJhbWUgPSBzLT5mcmFtZXBbVlA1Nl9GUkFNRV9DVVJSRU5UXTsKKworICAgIHJlZmVyZW5jZWQgPSBzLT51cGRhdGVfbGFzdCB8fCBzLT51cGRhdGVfZ29sZGVuID09IFZQNTZfRlJBTUVfQ1VSUkVOVCB8fAorICAgICAgICAgICAgICAgICBzLT51cGRhdGVfYWx0cmVmID09IFZQNTZfRlJBTUVfQ1VSUkVOVDsKKworICAgIHNraXBfdGhyZXNoID0gIXJlZmVyZW5jZWQgPyBBVkRJU0NBUkRfTk9OUkVGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICFzLT5rZXlmcmFtZSA/IEFWRElTQ0FSRF9OT05LRVkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZESVNDQVJEX0FMTDsKKworICAgIGlmIChhdmN0eC0+c2tpcF9mcmFtZSA+PSBza2lwX3RocmVzaCkgeworICAgICAgICBzLT5pbnZpc2libGUgPSAxOworICAgICAgICBtZW1jcHkoJnMtPm5leHRfZnJhbWVwWzBdLCAmcy0+ZnJhbWVwWzBdLCBzaXplb2Yocy0+ZnJhbWVwWzBdKSAqIDQpOworICAgICAgICBnb3RvIHNraXBfZGVjb2RlOworICAgIH0KKyAgICBzLT5kZWJsb2NrX2ZpbHRlciA9IHMtPmZpbHRlci5sZXZlbCAmJiBhdmN0eC0+c2tpcF9sb29wX2ZpbHRlciA8IHNraXBfdGhyZXNoOworCisgICAgLy8gcmVsZWFzZSBubyBsb25nZXIgcmVmZXJlbmNlZCBmcmFtZXMKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICBpZiAocy0+ZnJhbWVzW2ldLnRmLmYtPmRhdGFbMF0gJiYKKyAgICAgICAgICAgICZzLT5mcmFtZXNbaV0gIT0gcHJldl9mcmFtZSAmJgorICAgICAgICAgICAgJnMtPmZyYW1lc1tpXSAhPSBzLT5mcmFtZXBbVlA1Nl9GUkFNRV9QUkVWSU9VU10gJiYKKyAgICAgICAgICAgICZzLT5mcmFtZXNbaV0gIT0gcy0+ZnJhbWVwW1ZQNTZfRlJBTUVfR09MREVOXSAgICYmCisgICAgICAgICAgICAmcy0+ZnJhbWVzW2ldICE9IHMtPmZyYW1lcFtWUDU2X0ZSQU1FX0dPTERFTjJdKQorICAgICAgICAgICAgdnA4X3JlbGVhc2VfZnJhbWUocywgJnMtPmZyYW1lc1tpXSk7CisKKyAgICBjdXJmcmFtZSA9IHMtPmZyYW1lcFtWUDU2X0ZSQU1FX0NVUlJFTlRdID0gdnA4X2ZpbmRfZnJlZV9idWZmZXIocyk7CisKKyAgICBpZiAoIXMtPmNvbG9yc3BhY2UpCisgICAgICAgIGF2Y3R4LT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNDcwQkc7CisgICAgaWYgKHMtPmZ1bGxyYW5nZSkKKyAgICAgICAgYXZjdHgtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfSlBFRzsKKyAgICBlbHNlCisgICAgICAgIGF2Y3R4LT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX01QRUc7CisKKyAgICAvKiBHaXZlbiB0aGF0IGFyaXRobWV0aWMgcHJvYmFiaWxpdGllcyBhcmUgdXBkYXRlZCBldmVyeSBmcmFtZSwgaXQncyBxdWl0ZQorICAgICAqIGxpa2VseSB0aGF0IHRoZSB2YWx1ZXMgd2UgaGF2ZSBvbiBhIHJhbmRvbSBpbnRlcmZyYW1lIGFyZSBjb21wbGV0ZQorICAgICAqIGp1bmsgaWYgd2UgZGlkbid0IHN0YXJ0IGRlY29kZSBvbiBhIGtleWZyYW1lLiBTbyBqdXN0IGRvbid0IGRpc3BsYXkKKyAgICAgKiBhbnl0aGluZyByYXRoZXIgdGhhbiBqdW5rLiAqLworICAgIGlmICghcy0+a2V5ZnJhbWUgJiYgKCFzLT5mcmFtZXBbVlA1Nl9GUkFNRV9QUkVWSU9VU10gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAhcy0+ZnJhbWVwW1ZQNTZfRlJBTUVfR09MREVOXSAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIXMtPmZyYW1lcFtWUDU2X0ZSQU1FX0dPTERFTjJdKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkRpc2NhcmRpbmcgaW50ZXJmcmFtZSB3aXRob3V0IGEgcHJpb3Iga2V5ZnJhbWUhXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgY3VyZnJhbWUtPnRmLmYtPmtleV9mcmFtZSA9IHMtPmtleWZyYW1lOworICAgIGN1cmZyYW1lLT50Zi5mLT5waWN0X3R5cGUgPSBzLT5rZXlmcmFtZSA/IEFWX1BJQ1RVUkVfVFlQRV9JCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZfUElDVFVSRV9UWVBFX1A7CisgICAgaWYgKChyZXQgPSB2cDhfYWxsb2NfZnJhbWUocywgY3VyZnJhbWUsIHJlZmVyZW5jZWQpKSA8IDApCisgICAgICAgIGdvdG8gZXJyOworCisgICAgLy8gY2hlY2sgaWYgZ29sZGVuIGFuZCBhbHRyZWYgYXJlIHN3YXBwZWQKKyAgICBpZiAocy0+dXBkYXRlX2FsdHJlZiAhPSBWUDU2X0ZSQU1FX05PTkUpCisgICAgICAgIHMtPm5leHRfZnJhbWVwW1ZQNTZfRlJBTUVfR09MREVOMl0gPSBzLT5mcmFtZXBbcy0+dXBkYXRlX2FsdHJlZl07CisgICAgZWxzZQorICAgICAgICBzLT5uZXh0X2ZyYW1lcFtWUDU2X0ZSQU1FX0dPTERFTjJdID0gcy0+ZnJhbWVwW1ZQNTZfRlJBTUVfR09MREVOMl07CisKKyAgICBpZiAocy0+dXBkYXRlX2dvbGRlbiAhPSBWUDU2X0ZSQU1FX05PTkUpCisgICAgICAgIHMtPm5leHRfZnJhbWVwW1ZQNTZfRlJBTUVfR09MREVOXSA9IHMtPmZyYW1lcFtzLT51cGRhdGVfZ29sZGVuXTsKKyAgICBlbHNlCisgICAgICAgIHMtPm5leHRfZnJhbWVwW1ZQNTZfRlJBTUVfR09MREVOXSA9IHMtPmZyYW1lcFtWUDU2X0ZSQU1FX0dPTERFTl07CisKKyAgICBpZiAocy0+dXBkYXRlX2xhc3QpCisgICAgICAgIHMtPm5leHRfZnJhbWVwW1ZQNTZfRlJBTUVfUFJFVklPVVNdID0gY3VyZnJhbWU7CisgICAgZWxzZQorICAgICAgICBzLT5uZXh0X2ZyYW1lcFtWUDU2X0ZSQU1FX1BSRVZJT1VTXSA9IHMtPmZyYW1lcFtWUDU2X0ZSQU1FX1BSRVZJT1VTXTsKKworICAgIHMtPm5leHRfZnJhbWVwW1ZQNTZfRlJBTUVfQ1VSUkVOVF0gPSBjdXJmcmFtZTsKKworICAgIGlmIChhdmN0eC0+Y29kZWMtPnVwZGF0ZV90aHJlYWRfY29udGV4dCkKKyAgICAgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChhdmN0eCk7CisKKyAgICBzLT5saW5lc2l6ZSAgID0gY3VyZnJhbWUtPnRmLmYtPmxpbmVzaXplWzBdOworICAgIHMtPnV2bGluZXNpemUgPSBjdXJmcmFtZS0+dGYuZi0+bGluZXNpemVbMV07CisKKyAgICBtZW1zZXQocy0+dG9wX25ueiwgMCwgcy0+bWJfd2lkdGggKiBzaXplb2YoKnMtPnRvcF9ubnopKTsKKyAgICAvKiBaZXJvIG1hY3JvYmxvY2sgc3RydWN0dXJlcyBmb3IgdG9wL3RvcC1sZWZ0IHByZWRpY3Rpb24KKyAgICAgKiBmcm9tIG91dHNpZGUgdGhlIGZyYW1lLiAqLworICAgIGlmICghcy0+bWJfbGF5b3V0KQorICAgICAgICBtZW1zZXQocy0+bWFjcm9ibG9ja3MgKyBzLT5tYl9oZWlnaHQgKiAyIC0gMSwgMCwKKyAgICAgICAgICAgICAgIChzLT5tYl93aWR0aCArIDEpICogc2l6ZW9mKCpzLT5tYWNyb2Jsb2NrcykpOworICAgIGlmICghcy0+bWJfbGF5b3V0ICYmIHMtPmtleWZyYW1lKQorICAgICAgICBtZW1zZXQocy0+aW50cmE0eDRfcHJlZF9tb2RlX3RvcCwgRENfUFJFRCwgcy0+bWJfd2lkdGggKiA0KTsKKworICAgIG1lbXNldChzLT5yZWZfY291bnQsIDAsIHNpemVvZihzLT5yZWZfY291bnQpKTsKKworICAgIGlmIChzLT5tYl9sYXlvdXQgPT0gMSkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByZXZpb3VzIGZyYW1lIGhhcyByZWFkIGl0cyBzZWdtZW50YXRpb24gbWFwLAorICAgICAgICAvLyBpZiB3ZSByZS11c2UgdGhlIHNhbWUgbWFwLgorICAgICAgICBpZiAocHJldl9mcmFtZSAmJiBzLT5zZWdtZW50YXRpb24uZW5hYmxlZCAmJgorICAgICAgICAgICAgIXMtPnNlZ21lbnRhdGlvbi51cGRhdGVfbWFwKQorICAgICAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKCZwcmV2X2ZyYW1lLT50ZiwgMSwgMCk7CisgICAgICAgIGlmIChpc192cDcpCisgICAgICAgICAgICB2cDdfZGVjb2RlX212X21iX21vZGVzKGF2Y3R4LCBjdXJmcmFtZSwgcHJldl9mcmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZwOF9kZWNvZGVfbXZfbWJfbW9kZXMoYXZjdHgsIGN1cmZyYW1lLCBwcmV2X2ZyYW1lKTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSA9PSBGRl9USFJFQURfRlJBTUUpCisgICAgICAgIG51bV9qb2JzID0gMTsKKyAgICBlbHNlCisgICAgICAgIG51bV9qb2JzID0gRkZNSU4ocy0+bnVtX2NvZWZmX3BhcnRpdGlvbnMsIGF2Y3R4LT50aHJlYWRfY291bnQpOworICAgIHMtPm51bV9qb2JzICAgPSBudW1fam9iczsKKyAgICBzLT5jdXJmcmFtZSAgID0gY3VyZnJhbWU7CisgICAgcy0+cHJldl9mcmFtZSA9IHByZXZfZnJhbWU7CisgICAgcy0+bXZfbWluLnkgICA9IC1NQVJHSU47CisgICAgcy0+bXZfbWF4LnkgICA9ICgocy0+bWJfaGVpZ2h0IC0gMSkgPDwgNikgKyBNQVJHSU47CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9USFJFQURTOyBpKyspIHsKKyAgICAgICAgcy0+dGhyZWFkX2RhdGFbaV0udGhyZWFkX21iX3BvcyA9IDA7CisgICAgICAgIHMtPnRocmVhZF9kYXRhW2ldLndhaXRfbWJfcG9zICAgPSBJTlRfTUFYOworICAgIH0KKyAgICBpZiAoaXNfdnA3KQorICAgICAgICBhdmN0eC0+ZXhlY3V0ZTIoYXZjdHgsIHZwN19kZWNvZGVfbWJfcm93X3NsaWNlZCwgcy0+dGhyZWFkX2RhdGEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fam9icyk7CisgICAgZWxzZQorICAgICAgICBhdmN0eC0+ZXhlY3V0ZTIoYXZjdHgsIHZwOF9kZWNvZGVfbWJfcm93X3NsaWNlZCwgcy0+dGhyZWFkX2RhdGEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fam9icyk7CisKKyAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZjdXJmcmFtZS0+dGYsIElOVF9NQVgsIDApOworICAgIG1lbWNweSgmcy0+ZnJhbWVwWzBdLCAmcy0+bmV4dF9mcmFtZXBbMF0sIHNpemVvZihzLT5mcmFtZXBbMF0pICogNCk7CisKK3NraXBfZGVjb2RlOgorICAgIC8vIGlmIGZ1dHVyZSBmcmFtZXMgZG9uJ3QgdXNlIHRoZSB1cGRhdGVkIHByb2JhYmlsaXRpZXMsCisgICAgLy8gcmVzZXQgdGhlbSB0byB0aGUgdmFsdWVzIHdlIHNhdmVkCisgICAgaWYgKCFzLT51cGRhdGVfcHJvYmFiaWxpdGllcykKKyAgICAgICAgcy0+cHJvYlswXSA9IHMtPnByb2JbMV07CisKKyAgICBpZiAoIXMtPmludmlzaWJsZSkgeworICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBjdXJmcmFtZS0+dGYuZikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICpnb3RfZnJhbWUgPSAxOworICAgIH0KKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK2VycjoKKyAgICBtZW1jcHkoJnMtPm5leHRfZnJhbWVwWzBdLCAmcy0+ZnJhbWVwWzBdLCBzaXplb2Yocy0+ZnJhbWVwWzBdKSAqIDQpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl92cDhfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgcmV0dXJuIHZwNzhfZGVjb2RlX2ZyYW1lKGF2Y3R4LCBkYXRhLCBnb3RfZnJhbWUsIGF2cGt0LCBJU19WUDgpOworfQorCisjaWYgQ09ORklHX1ZQN19ERUNPREVSCitzdGF0aWMgaW50IHZwN19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgcmV0dXJuIHZwNzhfZGVjb2RlX2ZyYW1lKGF2Y3R4LCBkYXRhLCBnb3RfZnJhbWUsIGF2cGt0LCBJU19WUDcpOworfQorI2VuZGlmIC8qIENPTkZJR19WUDdfREVDT0RFUiAqLworCithdl9jb2xkIGludCBmZl92cDhfZGVjb2RlX2ZyZWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZQOENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgdnA4X2RlY29kZV9mbHVzaF9pbXBsKGF2Y3R4LCAxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+ZnJhbWVzKTsgaSsrKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZXNbaV0udGYuZik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHZwOF9pbml0X2ZyYW1lcyhWUDhDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5mcmFtZXMpOyBpKyspIHsKKyAgICAgICAgcy0+ZnJhbWVzW2ldLnRmLmYgPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICBpZiAoIXMtPmZyYW1lc1tpXS50Zi5mKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lCitpbnQgdnA3OF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBpc192cDcpCit7CisgICAgVlA4Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgcy0+dnA3ICAgPSBhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX1ZQNzsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICBhdmN0eC0+aW50ZXJuYWwtPmFsbG9jYXRlX3Byb2dyZXNzID0gMTsKKworICAgIGZmX3ZpZGVvZHNwX2luaXQoJnMtPnZkc3AsIDgpOworCisgICAgZmZfdnA3OGRzcF9pbml0KCZzLT52cDhkc3ApOworICAgIGlmIChDT05GSUdfVlA3X0RFQ09ERVIgJiYgaXNfdnA3KSB7CisgICAgICAgIGZmX2gyNjRfcHJlZF9pbml0KCZzLT5ocGMsIEFWX0NPREVDX0lEX1ZQNywgOCwgMSk7CisgICAgICAgIGZmX3ZwN2RzcF9pbml0KCZzLT52cDhkc3ApOworICAgICAgICBzLT5kZWNvZGVfbWJfcm93X25vX2ZpbHRlciA9IHZwN19kZWNvZGVfbWJfcm93X25vX2ZpbHRlcjsKKyAgICAgICAgcy0+ZmlsdGVyX21iX3JvdyAgICAgICAgICAgPSB2cDdfZmlsdGVyX21iX3JvdzsKKyAgICB9IGVsc2UgaWYgKENPTkZJR19WUDhfREVDT0RFUiAmJiAhaXNfdnA3KSB7CisgICAgICAgIGZmX2gyNjRfcHJlZF9pbml0KCZzLT5ocGMsIEFWX0NPREVDX0lEX1ZQOCwgOCwgMSk7CisgICAgICAgIGZmX3ZwOGRzcF9pbml0KCZzLT52cDhkc3ApOworICAgICAgICBzLT5kZWNvZGVfbWJfcm93X25vX2ZpbHRlciA9IHZwOF9kZWNvZGVfbWJfcm93X25vX2ZpbHRlcjsKKyAgICAgICAgcy0+ZmlsdGVyX21iX3JvdyAgICAgICAgICAgPSB2cDhfZmlsdGVyX21iX3JvdzsKKyAgICB9CisKKyAgICAvKiBkb2VzIG5vdCBjaGFuZ2UgZm9yIFZQOCAqLworICAgIG1lbWNweShzLT5wcm9iWzBdLnNjYW4sIHppZ3phZ19zY2FuLCBzaXplb2Yocy0+cHJvYlswXS5zY2FuKSk7CisKKyAgICBpZiAoKHJldCA9IHZwOF9pbml0X2ZyYW1lcyhzKSkgPCAwKSB7CisgICAgICAgIGZmX3ZwOF9kZWNvZGVfZnJlZShhdmN0eCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfVlA3X0RFQ09ERVIKK3N0YXRpYyBpbnQgdnA3X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICByZXR1cm4gdnA3OF9kZWNvZGVfaW5pdChhdmN0eCwgSVNfVlA3KTsKK30KKyNlbmRpZiAvKiBDT05GSUdfVlA3X0RFQ09ERVIgKi8KKworYXZfY29sZCBpbnQgZmZfdnA4X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICByZXR1cm4gdnA3OF9kZWNvZGVfaW5pdChhdmN0eCwgSVNfVlA4KTsKK30KKworI2lmIENPTkZJR19WUDhfREVDT0RFUgorc3RhdGljIGF2X2NvbGQgaW50IHZwOF9kZWNvZGVfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVlA4Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICBpZiAoKHJldCA9IHZwOF9pbml0X2ZyYW1lcyhzKSkgPCAwKSB7CisgICAgICAgIGZmX3ZwOF9kZWNvZGVfZnJlZShhdmN0eCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUkVCQVNFKHBpYykgKChwaWMpID8gKHBpYykgLSAmc19zcmMtPmZyYW1lc1swXSArICZzLT5mcmFtZXNbMF0gOiBOVUxMKQorCitzdGF0aWMgaW50IHZwOF9kZWNvZGVfdXBkYXRlX3RocmVhZF9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpzcmMpCit7CisgICAgVlA4Q29udGV4dCAqcyA9IGRzdC0+cHJpdl9kYXRhLCAqc19zcmMgPSBzcmMtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGlmIChzLT5tYWNyb2Jsb2Nrc19iYXNlICYmCisgICAgICAgIChzX3NyYy0+bWJfd2lkdGggIT0gcy0+bWJfd2lkdGggfHwgc19zcmMtPm1iX2hlaWdodCAhPSBzLT5tYl9oZWlnaHQpKSB7CisgICAgICAgIGZyZWVfYnVmZmVycyhzKTsKKyAgICAgICAgcy0+bWJfd2lkdGggID0gc19zcmMtPm1iX3dpZHRoOworICAgICAgICBzLT5tYl9oZWlnaHQgPSBzX3NyYy0+bWJfaGVpZ2h0OworICAgIH0KKworICAgIHMtPnByb2JbMF0gICAgICA9IHNfc3JjLT5wcm9iWyFzX3NyYy0+dXBkYXRlX3Byb2JhYmlsaXRpZXNdOworICAgIHMtPnNlZ21lbnRhdGlvbiA9IHNfc3JjLT5zZWdtZW50YXRpb247CisgICAgcy0+bGZfZGVsdGEgICAgID0gc19zcmMtPmxmX2RlbHRhOworICAgIG1lbWNweShzLT5zaWduX2JpYXMsIHNfc3JjLT5zaWduX2JpYXMsIHNpemVvZihzLT5zaWduX2JpYXMpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzX3NyYy0+ZnJhbWVzKTsgaSsrKSB7CisgICAgICAgIGlmIChzX3NyYy0+ZnJhbWVzW2ldLnRmLmYtPmRhdGFbMF0pIHsKKyAgICAgICAgICAgIGludCByZXQgPSB2cDhfcmVmX2ZyYW1lKHMsICZzLT5mcmFtZXNbaV0sICZzX3NyYy0+ZnJhbWVzW2ldKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5mcmFtZXBbMF0gPSBSRUJBU0Uoc19zcmMtPm5leHRfZnJhbWVwWzBdKTsKKyAgICBzLT5mcmFtZXBbMV0gPSBSRUJBU0Uoc19zcmMtPm5leHRfZnJhbWVwWzFdKTsKKyAgICBzLT5mcmFtZXBbMl0gPSBSRUJBU0Uoc19zcmMtPm5leHRfZnJhbWVwWzJdKTsKKyAgICBzLT5mcmFtZXBbM10gPSBSRUJBU0Uoc19zcmMtPm5leHRfZnJhbWVwWzNdKTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19WUDhfREVDT0RFUiAqLworCisjaWYgQ09ORklHX1ZQN19ERUNPREVSCitBVkNvZGVjIGZmX3ZwN19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAidnA3IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9uMiBWUDciKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDcsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihWUDhDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gdnA3X2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSBmZl92cDhfZGVjb2RlX2ZyZWUsCisgICAgLmRlY29kZSAgICAgICAgICAgICAgICA9IHZwN19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgICAgICA9IENPREVDX0NBUF9EUjEsCisgICAgLmZsdXNoICAgICAgICAgICAgICAgICA9IHZwOF9kZWNvZGVfZmx1c2gsCit9OworI2VuZGlmIC8qIENPTkZJR19WUDdfREVDT0RFUiAqLworCisjaWYgQ09ORklHX1ZQOF9ERUNPREVSCitBVkNvZGVjIGZmX3ZwOF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAidnA4IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9uMiBWUDgiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDgsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihWUDhDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gZmZfdnA4X2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSBmZl92cDhfZGVjb2RlX2ZyZWUsCisgICAgLmRlY29kZSAgICAgICAgICAgICAgICA9IGZmX3ZwOF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgICAgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IENPREVDX0NBUF9TTElDRV9USFJFQURTLAorICAgIC5mbHVzaCAgICAgICAgICAgICAgICAgPSB2cDhfZGVjb2RlX2ZsdXNoLAorICAgIC5pbml0X3RocmVhZF9jb3B5ICAgICAgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh2cDhfZGVjb2RlX2luaXRfdGhyZWFkX2NvcHkpLAorICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh2cDhfZGVjb2RlX3VwZGF0ZV90aHJlYWRfY29udGV4dCksCit9OworI2VuZGlmIC8qIENPTkZJR19WUDdfREVDT0RFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnA4LmggYi9mZm1wZWcvbGliYXZjb2RlYy92cDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjUwODkyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA4LmgKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBWUDggY29tcGF0aWJsZSB2aWRlbyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIERhdmlkIENvbnJhZAorICogQ29weXJpZ2h0IChDKSAyMDEwIFJvbmFsZCBTLiBCdWx0amUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBGaW9uYSBHbGFzZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEYW5pZWwgS2FuZworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVlA4X0gKKyNkZWZpbmUgQVZDT0RFQ19WUDhfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2J1ZmZlci5oIgorCisjaW5jbHVkZSAiaDI2NHByZWQuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ2cDU2LmgiCisjaW5jbHVkZSAidnA4ZHNwLmgiCisKKyNpZiBIQVZFX1BUSFJFQURTCisjICAgaW5jbHVkZSA8cHRocmVhZC5oPgorI2VsaWYgSEFWRV9PUzJUSFJFQURTCisjICAgaW5jbHVkZSAiY29tcGF0L29zMnRocmVhZHMuaCIKKyNlbGlmIEhBVkVfVzMyVEhSRUFEUworIyAgIGluY2x1ZGUgImNvbXBhdC93MzJwdGhyZWFkcy5oIgorI2VuZGlmCisKKyNkZWZpbmUgVlA4X01BWF9RVUFOVCAxMjcKKworZW51bSBkY3RfdG9rZW4geworICAgIERDVF8wLAorICAgIERDVF8xLAorICAgIERDVF8yLAorICAgIERDVF8zLAorICAgIERDVF80LAorICAgIERDVF9DQVQxLAorICAgIERDVF9DQVQyLAorICAgIERDVF9DQVQzLAorICAgIERDVF9DQVQ0LAorICAgIERDVF9DQVQ1LAorICAgIERDVF9DQVQ2LAorICAgIERDVF9FT0IsCisKKyAgICBOVU1fRENUX1RPS0VOUworfTsKKworLy8gdXNlZCB0byBzaWduYWwgNHg0IGludHJhIHByZWQgaW4gbHVtYSBNQnMKKyNkZWZpbmUgTU9ERV9JNHg0IDQKKworZW51bSBpbnRlcl9tdm1vZGUgeworICAgIFZQOF9NVk1PREVfWkVSTyA9IE1PREVfSTR4NCArIDEsCisgICAgVlA4X01WTU9ERV9NViwKKyAgICBWUDhfTVZNT0RFX1NQTElUCit9OworCitlbnVtIGludGVyX3NwbGl0bXZtb2RlIHsKKyAgICBWUDhfU1BMSVRNVk1PREVfMTZ4OCA9IDAsICAgIC8vLzwgMiAxNng4IGJsb2NrcyAodmVydGljYWwpCisgICAgVlA4X1NQTElUTVZNT0RFXzh4MTYsICAgICAgICAvLy88IDIgOHgxNiBibG9ja3MgKGhvcml6b250YWwpCisgICAgVlA4X1NQTElUTVZNT0RFXzh4OCwgICAgICAgICAvLy88IDJ4MiBibG9ja3Mgb2YgOHg4cHggZWFjaAorICAgIFZQOF9TUExJVE1WTU9ERV80eDQsICAgICAgICAgLy8vPCA0eDQgYmxvY2tzIG9mIDR4NHB4IGVhY2gKKyAgICBWUDhfU1BMSVRNVk1PREVfTk9ORSwgICAgICAgIC8vLzwgKG9ubHkgdXNlZCBpbiBwcmVkaWN0aW9uKSBubyBzcGxpdCBNVnMKK307CisKK3R5cGVkZWYgc3RydWN0IFZQOEZpbHRlclN0cmVuZ3RoIHsKKyAgICB1aW50OF90IGZpbHRlcl9sZXZlbDsKKyAgICB1aW50OF90IGlubmVyX2xpbWl0OworICAgIHVpbnQ4X3QgaW5uZXJfZmlsdGVyOworfSBWUDhGaWx0ZXJTdHJlbmd0aDsKKwordHlwZWRlZiBzdHJ1Y3QgVlA4TWFjcm9ibG9jayB7CisgICAgdWludDhfdCBza2lwOworICAgIC8vIFRPRE86IG1ha2UgaXQgcG9zc2libGUgdG8gY2hlY2sgZm9yIGF0IGxlYXN0IChpNHg0IG9yIHNwbGl0X212KQorICAgIC8vIGluIG9uZSBvcC4gYXJlIG90aGVycyBuZWVkZWQ/CisgICAgdWludDhfdCBtb2RlOworICAgIHVpbnQ4X3QgcmVmX2ZyYW1lOworICAgIHVpbnQ4X3QgcGFydGl0aW9uaW5nOworICAgIHVpbnQ4X3QgY2hyb21hX3ByZWRfbW9kZTsKKyAgICB1aW50OF90IHNlZ21lbnQ7CisgICAgdWludDhfdCBpbnRyYTR4NF9wcmVkX21vZGVfbWJbMTZdOworICAgIERFQ0xBUkVfQUxJR05FRCg0LCB1aW50OF90LCBpbnRyYTR4NF9wcmVkX21vZGVfdG9wKVs0XTsKKyAgICBWUDU2bXYgbXY7CisgICAgVlA1Nm12IGJtdlsxNl07Cit9IFZQOE1hY3JvYmxvY2s7CisKK3R5cGVkZWYgc3RydWN0IFZQOFRocmVhZERhdGEgeworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYmxvY2spWzZdWzRdWzE2XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGJsb2NrX2RjKVsxNl07CisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgaW5kZXggcGx1cyBvbmUgb2YgdGhlIGxhc3Qgbm9uLXplcm8gY29lZmYKKyAgICAgKiBmb3IgZWFjaCBvZiB0aGUgYmxvY2tzIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suCisgICAgICogU28sIDAgLT4gbm8gY29lZmZzCisgICAgICogICAgIDEgLT4gZGMtb25seSAoc3BlY2lhbCB0cmFuc2Zvcm0pCisgICAgICogICAgIDIrLT4gZnVsbCB0cmFuc2Zvcm0KKyAgICAgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHVpbnQ4X3QsIG5vbl96ZXJvX2NvdW50X2NhY2hlKVs2XVs0XTsKKyAgICAvKioKKyAgICAgKiBGb3IgY29lZmYgZGVjb2RlLCB3ZSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGUgYWJvdmUgYmxvY2sgaGFkIG5vbi16ZXJvCisgICAgICogY29lZmZpY2llbnRzLiBUaGlzIG1lYW5zIGZvciBlYWNoIG1hY3JvYmxvY2ssIHdlIG5lZWQgZGF0YSBmb3IgNCBsdW1hCisgICAgICogYmxvY2tzLCAyIHUgYmxvY2tzLCAyIHYgYmxvY2tzLCBhbmQgdGhlIGx1bWEgZGMgYmxvY2ssIGZvciBhIHRvdGFsIG9mIDkKKyAgICAgKiBwZXIgbWFjcm9ibG9jay4gV2Uga2VlcCB0aGUgbGFzdCByb3cgaW4gdG9wX25uei4KKyAgICAgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9ubnopWzldOworICAgIGludCB0aHJlYWRfbnI7CisjaWYgSEFWRV9USFJFQURTCisgICAgcHRocmVhZF9tdXRleF90IGxvY2s7CisgICAgcHRocmVhZF9jb25kX3QgY29uZDsKKyNlbmRpZgorICAgIGludCB0aHJlYWRfbWJfcG9zOyAvLyAobWJfeSA8PCAxNikgfCAobWJfeCAmIDB4RkZGRikKKyAgICBpbnQgd2FpdF9tYl9wb3M7IC8vIFdoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHdhaXRpbmcgb24uCisKKyNkZWZpbmUgRURHRV9FTVVfTElORVNJWkUgMzIKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHVpbnQ4X3QsIGVkZ2VfZW11X2J1ZmZlcilbMjEgKiBFREdFX0VNVV9MSU5FU0laRV07CisgICAgVlA4RmlsdGVyU3RyZW5ndGggKmZpbHRlcl9zdHJlbmd0aDsKK30gVlA4VGhyZWFkRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgVlA4RnJhbWUgeworICAgIFRocmVhZEZyYW1lIHRmOworICAgIEFWQnVmZmVyUmVmICpzZWdfbWFwOworfSBWUDhGcmFtZTsKKworI2RlZmluZSBNQVhfVEhSRUFEUyA4Cit0eXBlZGVmIHN0cnVjdCBWUDhDb250ZXh0IHsKKyAgICBWUDhUaHJlYWREYXRhICp0aHJlYWRfZGF0YTsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgVlA4RnJhbWUgKmZyYW1lcFs0XTsKKyAgICBWUDhGcmFtZSAqbmV4dF9mcmFtZXBbNF07CisgICAgVlA4RnJhbWUgKmN1cmZyYW1lOworICAgIFZQOEZyYW1lICpwcmV2X2ZyYW1lOworCisgICAgdWludDE2X3QgbWJfd2lkdGg7ICAgLyogbnVtYmVyIG9mIGhvcml6b250YWwgTUIgKi8KKyAgICB1aW50MTZfdCBtYl9oZWlnaHQ7ICAvKiBudW1iZXIgb2YgdmVydGljYWwgTUIgKi8KKyAgICBpbnQgbGluZXNpemU7CisgICAgaW50IHV2bGluZXNpemU7CisKKyAgICB1aW50OF90IGtleWZyYW1lOworICAgIHVpbnQ4X3QgZGVibG9ja19maWx0ZXI7CisgICAgdWludDhfdCBtYnNraXBfZW5hYmxlZDsKKyAgICB1aW50OF90IHByb2ZpbGU7CisgICAgVlA1Nm12IG12X21pbjsKKyAgICBWUDU2bXYgbXZfbWF4OworCisgICAgaW50OF90IHNpZ25fYmlhc1s0XTsgLy8vPCBvbmUgc3RhdGUgWzAsIDFdIHBlciByZWYgZnJhbWUgdHlwZQorICAgIGludCByZWZfY291bnRbM107CisKKyAgICAvKioKKyAgICAgKiBCYXNlIHBhcmFtZXRlcnMgZm9yIHNlZ21lbnRhdGlvbiwgaS5lLiBwZXItbWFjcm9ibG9jayBwYXJhbWV0ZXJzLgorICAgICAqIFRoZXNlIG11c3QgYmUga2VwdCB1bmNoYW5nZWQgZXZlbiBpZiBzZWdtZW50YXRpb24gaXMgbm90IHVzZWQgZm9yCisgICAgICogYSBmcmFtZSwgc2luY2UgdGhlIHZhbHVlcyBwZXJzaXN0IGJldHdlZW4gaW50ZXJmcmFtZXMuCisgICAgICovCisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDhfdCBlbmFibGVkOworICAgICAgICB1aW50OF90IGFic29sdXRlX3ZhbHM7CisgICAgICAgIHVpbnQ4X3QgdXBkYXRlX21hcDsKKyAgICAgICAgaW50OF90IGJhc2VfcXVhbnRbNF07CisgICAgICAgIGludDhfdCBmaWx0ZXJfbGV2ZWxbNF07ICAgICAvLy88IGJhc2UgbG9vcCBmaWx0ZXIgbGV2ZWwKKyAgICB9IHNlZ21lbnRhdGlvbjsKKworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3Qgc2ltcGxlOworICAgICAgICB1aW50OF90IGxldmVsOworICAgICAgICB1aW50OF90IHNoYXJwbmVzczsKKyAgICB9IGZpbHRlcjsKKworICAgIFZQOE1hY3JvYmxvY2sgKm1hY3JvYmxvY2tzOworCisgICAgdWludDhfdCAqaW50cmE0eDRfcHJlZF9tb2RlX3RvcDsKKyAgICB1aW50OF90IGludHJhNHg0X3ByZWRfbW9kZV9sZWZ0WzRdOworCisgICAgLyoqCisgICAgICogTWFjcm9ibG9ja3MgY2FuIGhhdmUgb25lIG9mIDQgZGlmZmVyZW50IHF1YW50cyBpbiBhIGZyYW1lIHdoZW4KKyAgICAgKiBzZWdtZW50YXRpb24gaXMgZW5hYmxlZC4KKyAgICAgKiBJZiBzZWdtZW50YXRpb24gaXMgZGlzYWJsZWQsIG9ubHkgdGhlIGZpcnN0IHNlZ21lbnQncyB2YWx1ZXMgYXJlIHVzZWQuCisgICAgICovCisgICAgc3RydWN0IHsKKyAgICAgICAgLy8gWzBdIC0gREMgcW11bCAgWzFdIC0gQUMgcW11bAorICAgICAgICBpbnQxNl90IGx1bWFfcW11bFsyXTsKKyAgICAgICAgaW50MTZfdCBsdW1hX2RjX3FtdWxbMl07ICAgIC8vLzwgbHVtYSBkYy1vbmx5IGJsb2NrIHF1YW50CisgICAgICAgIGludDE2X3QgY2hyb21hX3FtdWxbMl07CisgICAgfSBxbWF0WzRdOworCisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDhfdCBlbmFibGVkOyAgICAvLy88IHdoZXRoZXIgZWFjaCBtYiBjYW4gaGF2ZSBhIGRpZmZlcmVudCBzdHJlbmd0aCBiYXNlZCBvbiBtb2RlL3JlZgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBmaWx0ZXIgc3RyZW5ndGggYWRqdXN0bWVudCBmb3IgdGhlIGZvbGxvd2luZyBtYWNyb2Jsb2NrIG1vZGVzOgorICAgICAgICAgKiBbMC0zXSAtIGkxNngxNiAoYWx3YXlzIHplcm8pCisgICAgICAgICAqIFs0XSAgIC0gaTR4NAorICAgICAgICAgKiBbNV0gICAtIHplcm8gbXYKKyAgICAgICAgICogWzZdICAgLSBpbnRlciBtb2RlcyBleGNlcHQgZm9yIHplcm8gb3Igc3BsaXQgbXYKKyAgICAgICAgICogWzddICAgLSBzcGxpdCBtdgorICAgICAgICAgKiAgaTE2eDE2IG1vZGVzIG5ldmVyIGhhdmUgYW55IGFkanVzdG1lbnQKKyAgICAgICAgICovCisgICAgICAgIGludDhfdCBtb2RlW1ZQOF9NVk1PREVfU1BMSVQgKyAxXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogZmlsdGVyIHN0cmVuZ3RoIGFkanVzdG1lbnQgZm9yIG1hY3JvYmxvY2tzIHRoYXQgcmVmZXJlbmNlOgorICAgICAgICAgKiBbMF0gLSBpbnRyYSAvIFZQNTZfRlJBTUVfQ1VSUkVOVAorICAgICAgICAgKiBbMV0gLSBWUDU2X0ZSQU1FX1BSRVZJT1VTCisgICAgICAgICAqIFsyXSAtIFZQNTZfRlJBTUVfR09MREVOCisgICAgICAgICAqIFszXSAtIGFsdHJlZiAvIFZQNTZfRlJBTUVfR09MREVOMgorICAgICAgICAgKi8KKyAgICAgICAgaW50OF90IHJlZls0XTsKKyAgICB9IGxmX2RlbHRhOworCisgICAgdWludDhfdCAoKnRvcF9ib3JkZXIpWzE2ICsgOCArIDhdOworICAgIHVpbnQ4X3QgKCp0b3Bfbm56KVs5XTsKKworICAgIFZQNTZSYW5nZUNvZGVyIGM7ICAgLy8vPCBoZWFkZXIgY29udGV4dCwgaW5jbHVkZXMgbWIgbW9kZXMgYW5kIG1vdGlvbiB2ZWN0b3JzCisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBhcmUgYWxsIG9mIHRoZSB1cGRhdGFibGUgcHJvYmFiaWxpdGllcyBmb3IgYmluYXJ5IGRlY2lzaW9ucy4KKyAgICAgKiBUaGV5IGFyZSBvbmx5IGltcGxpY3RseSByZXNldCBvbiBrZXlmcmFtZXMsIG1ha2luZyBpdCBxdWl0ZSBsaWtlbHkKKyAgICAgKiBmb3IgYW4gaW50ZXJmcmFtZSB0byBkZXN5bmMgaWYgYSBwcmlvciBmcmFtZSdzIGhlYWRlciB3YXMgY29ycnVwdAorICAgICAqIG9yIG1pc3Npbmcgb3V0cmlnaHQhCisgICAgICovCisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDhfdCBzZWdtZW50aWRbM107CisgICAgICAgIHVpbnQ4X3QgbWJza2lwOworICAgICAgICB1aW50OF90IGludHJhOworICAgICAgICB1aW50OF90IGxhc3Q7CisgICAgICAgIHVpbnQ4X3QgZ29sZGVuOworICAgICAgICB1aW50OF90IHByZWQxNngxNls0XTsKKyAgICAgICAgdWludDhfdCBwcmVkOHg4Y1szXTsKKyAgICAgICAgdWludDhfdCB0b2tlbls0XVsxNl1bM11bTlVNX0RDVF9UT0tFTlMgLSAxXTsKKyAgICAgICAgdWludDhfdCBtdmNbMl1bMTldOworICAgICAgICB1aW50OF90IHNjYW5bMTZdOworICAgIH0gcHJvYlsyXTsKKworICAgIFZQOE1hY3JvYmxvY2sgKm1hY3JvYmxvY2tzX2Jhc2U7CisgICAgaW50IGludmlzaWJsZTsKKyAgICBpbnQgdXBkYXRlX2xhc3Q7ICAgIC8vLzwgdXBkYXRlIFZQNTZfRlJBTUVfUFJFVklPVVMgd2l0aCB0aGUgY3VycmVudCBvbmUKKyAgICBpbnQgdXBkYXRlX2dvbGRlbjsgIC8vLzwgVlA1Nl9GUkFNRV9OT05FIGlmIG5vdCB1cGRhdGVkLCBvciB3aGljaCBmcmFtZSB0byBjb3B5IGlmIHNvCisgICAgaW50IHVwZGF0ZV9hbHRyZWY7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgYWxsIHRoZSBwcm9iYWJpbGl0eSB1cGRhdGVzCisgICAgICogYXJlIGRpc2NhcmRlZCBhZnRlciB0aGlzIGZyYW1lIGlzIGRlY29kZWQuCisgICAgICovCisgICAgaW50IHVwZGF0ZV9wcm9iYWJpbGl0aWVzOworCisgICAgLyoqCisgICAgICogQWxsIGNvZWZmaWNpZW50cyBhcmUgY29udGFpbmVkIGluIHNlcGFyYXRlIGFyaXRoIGNvZGluZyBjb250ZXh0cy4KKyAgICAgKiBUaGVyZSBjYW4gYmUgMSwgMiwgNCwgb3IgOCBvZiB0aGVzZSBhZnRlciB0aGUgaGVhZGVyIGNvbnRleHQuCisgICAgICovCisgICAgaW50IG51bV9jb2VmZl9wYXJ0aXRpb25zOworICAgIFZQNTZSYW5nZUNvZGVyIGNvZWZmX3BhcnRpdGlvbls4XTsKKyAgICBWaWRlb0RTUENvbnRleHQgdmRzcDsKKyAgICBWUDhEU1BDb250ZXh0IHZwOGRzcDsKKyAgICBIMjY0UHJlZENvbnRleHQgaHBjOworICAgIHZwOF9tY19mdW5jIHB1dF9waXhlbHNfdGFiWzNdWzNdWzNdOworICAgIFZQOEZyYW1lIGZyYW1lc1s1XTsKKworICAgIHVpbnQ4X3QgY29sb3JzcGFjZTsgLy8vPCAwIGlzIHRoZSBvbmx5IHZhbHVlIGFsbG93ZWQgKG1lYW5pbmcgYnQ2MDEpCisgICAgdWludDhfdCBmdWxscmFuZ2U7ICAvLy88IHdoZXRoZXIgd2UgY2FuIHNraXAgY2xhbXBpbmcgaW4gZHNwIGZ1bmN0aW9ucworCisgICAgaW50IG51bV9qb2JzOworICAgIC8qKgorICAgICAqIFRoaXMgZGVzY3JpYmVzIHRoZSBtYWNyb2Jsb2NrIG1lbW9yeSBsYXlvdXQuCisgICAgICogMCAtPiBPbmx5IHdpZHRoK2hlaWdodCoyKzEgbWFjcm9ibG9ja3MgYWxsb2NhdGVkIChmcmFtZS9zaW5nbGUgdGhyZWFkKS4KKyAgICAgKiAxIC0+IE1hY3JvYmxvY2tzIGZvciBlbnRpcmUgZnJhbWUgYWxsb2NlZCAoc2xpY2VkIHRocmVhZCkuCisgICAgICovCisgICAgaW50IG1iX2xheW91dDsKKworICAgIHZvaWQgKCpkZWNvZGVfbWJfcm93X25vX2ZpbHRlcikoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICp0ZGF0YSwgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIpOworICAgIHZvaWQgKCpmaWx0ZXJfbWJfcm93KShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnRkYXRhLCBpbnQgam9ibnIsIGludCB0aHJlYWRucik7CisKKyAgICBpbnQgdnA3OworCisgICAgLyoqCisgICAgICogRmFkZSBiaXQgcHJlc2VudCBpbiBiaXRzdHJlYW0gKFZQNykKKyAgICAgKi8KKyAgICBpbnQgZmFkZV9wcmVzZW50OworCisgICAgLyoqCisgICAgICogSW50ZXJmcmFtZSBEQyBwcmVkaWN0aW9uIChWUDcpCisgICAgICogWzBdIFZQNTZfRlJBTUVfUFJFVklPVVMKKyAgICAgKiBbMV0gVlA1Nl9GUkFNRV9HT0xERU4KKyAgICAgKi8KKyAgICB1aW50MTZfdCBpbnRlcl9kY19wcmVkWzJdWzJdOworCisgICAgLyoqCisgICAgICogTWFjcm9ibG9jayBmZWF0dXJlcyAoVlA3KQorICAgICAqLworICAgIHVpbnQ4X3QgZmVhdHVyZV9lbmFibGVkWzRdOworICAgIHVpbnQ4X3QgZmVhdHVyZV9wcmVzZW50X3Byb2JbNF07CisgICAgdWludDhfdCBmZWF0dXJlX2luZGV4X3Byb2JbNF1bM107CisgICAgdWludDhfdCBmZWF0dXJlX3ZhbHVlWzRdWzRdOworfSBWUDhDb250ZXh0OworCitpbnQgZmZfdnA4X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK2ludCBmZl92cDhfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpOworCitpbnQgZmZfdnA4X2RlY29kZV9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1ZQOF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92cDhfcGFyc2VyLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92cDhfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjN2Y5OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOF9wYXJzZXIuYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInBhcnNlci5oIgorCitzdGF0aWMgaW50IHBhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgcy0+cGljdF90eXBlID0gKGJ1ZlswXSAmIDB4MDEpID8gQVZfUElDVFVSRV9UWVBFX1AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgICpwb3V0YnVmICAgICAgPSBidWY7CisgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworQVZDb2RlY1BhcnNlciBmZl92cDhfcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgPSB7IEFWX0NPREVDX0lEX1ZQOCB9LAorICAgIC5wYXJzZXJfcGFyc2UgPSBwYXJzZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92cDhkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy92cDhkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkYmY1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOGRhdGEuaApAQCAtMCwwICsxLDgzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBEYXZpZCBDb25yYWQKKyAqIENvcHlyaWdodCAoQykgMjAxMCBSb25hbGQgUy4gQnVsdGplCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZQOCBjb21wYXRpYmxlIHZpZGVvIGRlY29kZXIKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVlA4REFUQV9ICisjZGVmaW5lIEFWQ09ERUNfVlA4REFUQV9ICisKKyNpbmNsdWRlICJ2cDguaCIKKyNpbmNsdWRlICJoMjY0cHJlZC5oIgorCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDdfcHJlZDR4NF9tb2RlW10gPSB7CisgICAgW0RDX1BSRUQ4eDhdICAgID0gRENfUFJFRCwKKyAgICBbVkVSVF9QUkVEOHg4XSAgPSBUTV9WUDhfUFJFRCwKKyAgICBbSE9SX1BSRUQ4eDhdICAgPSBUTV9WUDhfUFJFRCwKKyAgICBbUExBTkVfUFJFRDh4OF0gPSBUTV9WUDhfUFJFRCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOF9wcmVkNHg0X21vZGVbXSA9IHsKKyAgICBbRENfUFJFRDh4OF0gICAgPSBEQ19QUkVELAorICAgIFtWRVJUX1BSRUQ4eDhdICA9IFZFUlRfUFJFRCwKKyAgICBbSE9SX1BSRUQ4eDhdICAgPSBIT1JfUFJFRCwKKyAgICBbUExBTkVfUFJFRDh4OF0gPSBUTV9WUDhfUFJFRCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgdnA4X3ByZWQxNngxNl90cmVlX2ludHJhWzRdWzJdID0geworICAgIHsgICAtTU9ERV9JNHg0LCAgICAgICAgICAgICAgMSB9LCAvLyAnMCcKKyAgICB7ICAgICAgICAgICAgMiwgICAgICAgICAgICAgIDMgfSwKKyAgICB7ICAtRENfUFJFRDh4OCwgIC1WRVJUX1BSRUQ4eDggfSwgLy8gJzEwMCcsICcxMDEnCisgICAgeyAtSE9SX1BSRUQ4eDgsIC1QTEFORV9QUkVEOHg4IH0sIC8vICcxMTAnLCAnMTExJworfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB2cDhfcHJlZDE2eDE2X3RyZWVfaW50ZXJbNF1bMl0gPSB7CisgICAgeyAgICAtRENfUFJFRDh4OCwgICAgICAgICAgICAxIH0sIC8vICcwJworICAgIHsgICAgICAgICAgICAgIDIsICAgICAgICAgICAgMyB9LAorICAgIHsgIC1WRVJUX1BSRUQ4eDgsIC1IT1JfUFJFRDh4OCB9LCAvLyAnMTAwJywgJzEwMScKKyAgICB7IC1QTEFORV9QUkVEOHg4LCAgIC1NT0RFX0k0eDQgfSwgLy8gJzExMCcsICcxMTEnCit9OworCit0eXBlZGVmIHN0cnVjdCBWUDdNVlByZWQgeworICAgIGludDhfdCB5b2Zmc2V0OworICAgIGludDhfdCB4b2Zmc2V0OworICAgIHVpbnQ4X3Qgc3ViYmxvY2s7CisgICAgdWludDhfdCBzY29yZTsKK30gVlA3TVZQcmVkOworCisjZGVmaW5lIFZQN19NVl9QUkVEX0NPVU5UIDEyCitzdGF0aWMgY29uc3QgVlA3TVZQcmVkIHZwN19tdl9wcmVkW1ZQN19NVl9QUkVEX0NPVU5UXSA9IHsKKyAgICB7IC0xLCAgMCwgMTIsIDggfSwKKyAgICB7ICAwLCAtMSwgIDMsIDggfSwKKyAgICB7IC0xLCAtMSwgMTUsIDIgfSwKKyAgICB7IC0xLCAgMSwgMTIsIDIgfSwKKyAgICB7IC0yLCAgMCwgMTIsIDIgfSwKKyAgICB7ICAwLCAtMiwgIDMsIDIgfSwKKyAgICB7IC0xLCAtMiwgMTUsIDEgfSwKKyAgICB7IC0yLCAtMSwgMTUsIDEgfSwKKyAgICB7IC0yLCAgMSwgMTIsIDEgfSwKKyAgICB7IC0xLCAgMiwgMTIsIDEgfSwKKyAgICB7IC0yLCAtMiwgMTUsIDEgfSwKKyAgICB7IC0yLCAgMiwgMTIsIDEgfSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgdnA3X21vZGVfY29udGV4dHNbMzFdWzRdID0geworICAgIHsgICAzLCAgIDMsICAgMSwgMjQ2IH0sCisgICAgeyAgIDcsICA4OSwgIDY2LCAyMzkgfSwKKyAgICB7ICAxMCwgIDkwLCAgNzgsIDIzOCB9LAorICAgIHsgIDE0LCAxMTgsICA5NSwgMjQxIH0sCisgICAgeyAgMTQsIDEyMywgMTA2LCAyMzggfSwKKyAgICB7ICAyMCwgMTQwLCAxMDksIDI0MCB9LAorICAgIHsgIDEzLCAxNTUsIDEwMywgMjM4IH0sCisgICAgeyAgMjEsIDE1OCwgIDk5LCAyNDAgfSwKKyAgICB7ICAyNywgIDgyLCAxMDgsIDIzMiB9LAorICAgIHsgIDE5LCAgOTksIDEyMywgMjE3IH0sCisgICAgeyAgNDUsIDEzOSwgMTQ4LCAyMzYgfSwKKyAgICB7ICA1MCwgMTE3LCAxNDQsIDIzNSB9LAorICAgIHsgIDU3LCAxMjgsIDE2NCwgMjM4IH0sCisgICAgeyAgNjksIDEzOSwgMTcxLCAyMzkgfSwKKyAgICB7ICA3NCwgMTU0LCAxNzksIDIzOCB9LAorICAgIHsgMTEyLCAxNjUsIDE4NiwgMjQyIH0sCisgICAgeyAgOTgsIDE0MywgMTg1LCAyNDUgfSwKKyAgICB7IDEwNSwgMTUzLCAxOTAsIDI1MCB9LAorICAgIHsgMTI0LCAxNjcsIDE5MiwgMjQ1IH0sCisgICAgeyAxMzEsIDE4NiwgMjAzLCAyNDYgfSwKKyAgICB7ICA1OSwgMTg0LCAyMjIsIDIyNCB9LAorICAgIHsgMTQ4LCAyMTUsIDIxNCwgMjEzIH0sCisgICAgeyAxMzcsIDIxMSwgMjEwLCAyMTkgfSwKKyAgICB7IDE5MCwgMjI3LCAxMjgsIDIyOCB9LAorICAgIHsgMTgzLCAyMjgsIDEyOCwgMjI4IH0sCisgICAgeyAxOTQsIDIzNCwgMTI4LCAyMjggfSwKKyAgICB7IDIwMiwgMjM2LCAxMjgsIDIyOCB9LAorICAgIHsgMjA1LCAyNDAsIDEyOCwgMjI4IH0sCisgICAgeyAyMDUsIDI0NCwgMTI4LCAyMjggfSwKKyAgICB7IDIyNSwgMjQ2LCAxMjgsIDIyOCB9LAorICAgIHsgMjMzLCAyNTEsIDEyOCwgMjI4IH0sCit9OworCitzdGF0aWMgY29uc3QgaW50IHZwOF9tb2RlX2NvbnRleHRzWzZdWzRdID0geworICAgIHsgICA3LCAgIDEsICAgMSwgMTQzIH0sCisgICAgeyAgMTQsICAxOCwgIDE0LCAxMDcgfSwKKyAgICB7IDEzNSwgIDY0LCAgNTcsICA2OCB9LAorICAgIHsgIDYwLCAgNTYsIDEyOCwgIDY1IH0sCisgICAgeyAxNTksIDEzNCwgMTI4LCAgMzQgfSwKKyAgICB7IDIzNCwgMTg4LCAxMjgsICAyOCB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA4X21ic3BsaXRzWzVdWzE2XSA9IHsKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEgfSwKKyAgICB7IDAsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDAsIDAsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEgfSwKKyAgICB7IDAsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDIsIDIsICAzLCAgMywgIDIsICAyLCAgMywgIDMgfSwKKyAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA4X21iZmlyc3RpZHhbNF1bMTZdID0geworICAgIHsgMCwgOCB9LAorICAgIHsgMCwgMiB9LAorICAgIHsgMCwgMiwgOCwgMTAgfSwKKyAgICB7IDAsIDEsIDIsICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOF9tYnNwbGl0X2NvdW50WzRdID0geworICAgIDIsIDIsIDQsIDE2Cit9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA4X21ic3BsaXRfcHJvYlszXSA9IHsKKyAgICAxMTAsIDExMSwgMTUwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDdfc3VibXZfcHJvYlszXSA9IHsKKyAgICAxODAsIDE2MiwgMjUKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOF9zdWJtdl9wcm9iWzVdWzNdID0geworICAgIHsgMTQ3LCAxMzYsICAxOCB9LAorICAgIHsgMTA2LCAxNDUsICAgMSB9LAorICAgIHsgMTc5LCAxMjEsICAgMSB9LAorICAgIHsgMjIzLCAgIDEsICAzNCB9LAorICAgIHsgMjA4LCAgIDEsICAgMSB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDhfcHJlZDE2eDE2X3Byb2JfaW50cmFbNF0gPSB7CisgICAgMTQ1LCAxNTYsIDE2MywgMTI4Cit9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA4X3ByZWQxNngxNl9wcm9iX2ludGVyWzRdID0geworICAgIDExMiwgIDg2LCAxNDAsICAzNworfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB2cDhfcHJlZDR4NF90cmVlWzldWzJdID0geworICAgIHsgICAgICAgICAgICAgIC1EQ19QUkVELCAgICAgICAgICAgICAgICAxIH0sIC8vICcwJworICAgIHsgICAgICAgICAgLVRNX1ZQOF9QUkVELCAgICAgICAgICAgICAgICAyIH0sIC8vICcxMCcKKyAgICB7ICAgICAgICAgICAgLVZFUlRfUFJFRCwgICAgICAgICAgICAgICAgMyB9LCAvLyAnMTEwJworICAgIHsgICAgICAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICA2IH0sCisgICAgeyAgICAgICAgICAgICAtSE9SX1BSRUQsICAgICAgICAgICAgICAgIDUgfSwgLy8gJzExMTAwJworICAgIHsgLURJQUdfRE9XTl9SSUdIVF9QUkVELCAtVkVSVF9SSUdIVF9QUkVEIH0sIC8vICcxMTEwMTAnLCAnMTExMDExJworICAgIHsgIC1ESUFHX0RPV05fTEVGVF9QUkVELCAgICAgICAgICAgICAgICA3IH0sIC8vICcxMTExMCcKKyAgICB7ICAgICAgIC1WRVJUX0xFRlRfUFJFRCwgICAgICAgICAgICAgICAgOCB9LCAvLyAnMTExMTEwJworICAgIHsgICAgICAgIC1IT1JfRE9XTl9QUkVELCAgICAgLUhPUl9VUF9QUkVEIH0sIC8vICcxMTExMTEwJywgJzExMTExMTEnCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IHZwOF9wcmVkOHg4Y190cmVlWzNdWzJdID0geworICAgIHsgICAtRENfUFJFRDh4OCwgICAgICAgICAgICAgIDEgfSwgIC8vICcwJworICAgIHsgLVZFUlRfUFJFRDh4OCwgICAgICAgICAgICAgIDIgfSwgIC8vICcxMAorICAgIHsgIC1IT1JfUFJFRDh4OCwgLVBMQU5FX1BSRUQ4eDggfSwgIC8vICcxMTAnLCAnMTExJworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA4X3ByZWQ4eDhjX3Byb2JfaW50cmFbM10gPSB7CisgICAgMTQyLCAxMTQsIDE4MworfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOF9wcmVkOHg4Y19wcm9iX2ludGVyWzNdID0geworICAgIDE2MiwgMTAxLCAyMDQKK307CitzdGF0aWMgY29uc3QgdWludDhfdCB2cDhfcHJlZDR4NF9wcm9iX2ludGVyWzldID0geworICAgIDEyMCwgOTAsIDc5LCAxMzMsIDg3LCA4NSwgODAsIDExMSwgMTUxCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDhfcHJlZDR4NF9wcm9iX2ludHJhWzEwXVsxMF1bOV0gPSB7CisgICAgeworICAgICAgICB7ICAzOSwgIDUzLCAyMDAsICA4NywgIDI2LCAgMjEsICA0MywgMjMyLCAxNzEgfSwKKyAgICAgICAgeyAgNTYsICAzNCwgIDUxLCAxMDQsIDExNCwgMTAyLCAgMjksICA5MywgIDc3IH0sCisgICAgICAgIHsgIDg4LCAgODgsIDE0NywgMTUwLCAgNDIsICA0NiwgIDQ1LCAxOTYsIDIwNSB9LAorICAgICAgICB7IDEwNywgIDU0LCAgMzIsICAyNiwgIDUxLCAgIDEsICA4MSwgIDQzLCAgMzEgfSwKKyAgICAgICAgeyAgMzksICAyOCwgIDg1LCAxNzEsICA1OCwgMTY1LCAgOTAsICA5OCwgIDY0IH0sCisgICAgICAgIHsgIDM0LCAgMjIsIDExNiwgMjA2LCAgMjMsICAzNCwgIDQzLCAxNjYsICA3MyB9LAorICAgICAgICB7ICAzNCwgIDE5LCAgMjEsIDEwMiwgMTMyLCAxODgsICAxNiwgIDc2LCAxMjQgfSwKKyAgICAgICAgeyAgNjgsICAyNSwgMTA2LCAgMjIsICA2NCwgMTcxLCAgMzYsIDIyNSwgMTE0IH0sCisgICAgICAgIHsgIDYyLCAgMTgsICA3OCwgIDk1LCAgODUsICA1NywgIDUwLCAgNDgsICA1MSB9LAorICAgICAgICB7ICA0MywgIDk3LCAxODMsIDExNywgIDg1LCAgMzgsICAzNSwgMTc5LCAgNjEgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgeyAxMTIsIDExMywgIDc3LCAgODUsIDE3OSwgMjU1LCAgMzgsIDEyMCwgMTE0IH0sCisgICAgICAgIHsgIDQwLCAgNDIsICAgMSwgMTk2LCAyNDUsIDIwOSwgIDEwLCAgMjUsIDEwOSB9LAorICAgICAgICB7IDE5MywgMTAxLCAgMzUsIDE1OSwgMjE1LCAxMTEsICA4OSwgIDQ2LCAxMTEgfSwKKyAgICAgICAgeyAxMDAsICA4MCwgICA4LCAgNDMsIDE1NCwgICAxLCAgNTEsICAyNiwgIDcxIH0sCisgICAgICAgIHsgIDg4LCAgNDMsICAyOSwgMTQwLCAxNjYsIDIxMywgIDM3LCAgNDMsIDE1NCB9LAorICAgICAgICB7ICA2MSwgIDYzLCAgMzAsIDE1NSwgIDY3LCAgNDUsICA2OCwgICAxLCAyMDkgfSwKKyAgICAgICAgeyAgNDEsICA0MCwgICA1LCAxMDIsIDIxMSwgMTgzLCAgIDQsICAgMSwgMjIxIH0sCisgICAgICAgIHsgMTQyLCAgNzgsICA3OCwgIDE2LCAyNTUsIDEyOCwgIDM0LCAxOTcsIDE3MSB9LAorICAgICAgICB7ICA1MSwgIDUwLCAgMTcsIDE2OCwgMjA5LCAxOTIsICAyMywgIDI1LCAgODIgfSwKKyAgICAgICAgeyAgNjAsIDE0OCwgIDMxLCAxNzIsIDIxOSwgMjI4LCAgMjEsICAxOCwgMTExIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMTc1LCAgNjksIDE0MywgIDgwLCAgODUsICA4MiwgIDcyLCAxNTUsIDEwMyB9LAorICAgICAgICB7ICA1NiwgIDU4LCAgMTAsIDE3MSwgMjE4LCAxODksICAxNywgIDEzLCAxNTIgfSwKKyAgICAgICAgeyAyMzEsIDEyMCwgIDQ4LCAgODksIDExNSwgMTEzLCAxMjAsIDE1MiwgMTEyIH0sCisgICAgICAgIHsgMTQ0LCAgNzEsICAxMCwgIDM4LCAxNzEsIDIxMywgMTQ0LCAgMzQsICAyNiB9LAorICAgICAgICB7IDExNCwgIDI2LCAgMTcsIDE2MywgIDQ0LCAxOTUsICAyMSwgIDEwLCAxNzMgfSwKKyAgICAgICAgeyAxMjEsICAyNCwgIDgwLCAxOTUsICAyNiwgIDYyLCAgNDQsICA2NCwgIDg1IH0sCisgICAgICAgIHsgIDYzLCAgMjAsICAgOCwgMTE0LCAxMTQsIDIwOCwgIDEyLCAgIDksIDIyNiB9LAorICAgICAgICB7IDE3MCwgIDQ2LCAgNTUsICAxOSwgMTM2LCAxNjAsICAzMywgMjA2LCAgNzEgfSwKKyAgICAgICAgeyAgODEsICA0MCwgIDExLCAgOTYsIDE4MiwgIDg0LCAgMjksICAxNiwgIDM2IH0sCisgICAgICAgIHsgMTUyLCAxNzksICA2NCwgMTI2LCAxNzAsIDExOCwgIDQ2LCAgNzAsICA5NSB9LAorICAgIH0sCisgICAgeworICAgICAgICB7ICA3NSwgIDc5LCAxMjMsICA0NywgIDUxLCAxMjgsICA4MSwgMTcxLCAgIDEgfSwKKyAgICAgICAgeyAgNTcsICAxNywgICA1LCAgNzEsIDEwMiwgIDU3LCAgNTMsICA0MSwgIDQ5IH0sCisgICAgICAgIHsgMTI1LCAgOTgsICA0MiwgIDg4LCAxMDQsICA4NSwgMTE3LCAxNzUsICA4MiB9LAorICAgICAgICB7IDExNSwgIDIxLCAgIDIsICAxMCwgMTAyLCAyNTUsIDE2NiwgIDIzLCAgIDYgfSwKKyAgICAgICAgeyAgMzgsICAzMywgIDEzLCAxMjEsICA1NywgIDczLCAgMjYsICAgMSwgIDg1IH0sCisgICAgICAgIHsgIDQxLCAgMTAsICA2NywgMTM4LCAgNzcsIDExMCwgIDkwLCAgNDcsIDExNCB9LAorICAgICAgICB7ICA1NywgIDE4LCAgMTAsIDEwMiwgMTAyLCAyMTMsICAzNCwgIDIwLCAgNDMgfSwKKyAgICAgICAgeyAxMDEsICAyOSwgIDE2LCAgMTAsICA4NSwgMTI4LCAxMDEsIDE5NiwgIDI2IH0sCisgICAgICAgIHsgMTE3LCAgMjAsICAxNSwgIDM2LCAxNjMsIDEyOCwgIDY4LCAgIDEsICAyNiB9LAorICAgICAgICB7ICA5NSwgIDg0LCAgNTMsICA4OSwgMTI4LCAxMDAsIDExMywgMTAxLCAgNDUgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgeyAgNjMsICA1OSwgIDkwLCAxODAsICA1OSwgMTY2LCAgOTMsICA3MywgMTU0IH0sCisgICAgICAgIHsgIDQwLCAgNDAsICAyMSwgMTE2LCAxNDMsIDIwOSwgIDM0LCAgMzksIDE3NSB9LAorICAgICAgICB7IDEzOCwgIDMxLCAgMzYsIDE3MSwgIDI3LCAxNjYsICAzOCwgIDQ0LCAyMjkgfSwKKyAgICAgICAgeyAgNTcsICA0NiwgIDIyLCAgMjQsIDEyOCwgICAxLCAgNTQsICAxNywgIDM3IH0sCisgICAgICAgIHsgIDQ3LCAgMTUsICAxNiwgMTgzLCAgMzQsIDIyMywgIDQ5LCAgNDUsIDE4MyB9LAorICAgICAgICB7ICA0NiwgIDE3LCAgMzMsIDE4MywgICA2LCAgOTgsICAxNSwgIDMyLCAxODMgfSwKKyAgICAgICAgeyAgNDAsICAgMywgICA5LCAxMTUsICA1MSwgMTkyLCAgMTgsICAgNiwgMjIzIH0sCisgICAgICAgIHsgIDY1LCAgMzIsICA3MywgMTE1LCAgMjgsIDEyOCwgIDIzLCAxMjgsIDIwNSB9LAorICAgICAgICB7ICA4NywgIDM3LCAgIDksIDExNSwgIDU5LCAgNzcsICA2NCwgIDIxLCAgNDcgfSwKKyAgICAgICAgeyAgNjcsICA4NywgIDU4LCAxNjksICA4MiwgMTE1LCAgMjYsICA1OSwgMTc5IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIHsgIDU0LCAgNTcsIDExMiwgMTg0LCAgIDUsICA0MSwgIDM4LCAxNjYsIDIxMyB9LAorICAgICAgICB7ICAzMCwgIDM0LCAgMjYsIDEzMywgMTUyLCAxMTYsICAxMCwgIDMyLCAxMzQgfSwKKyAgICAgICAgeyAxMDQsICA1NSwgIDQ0LCAyMTgsICAgOSwgIDU0LCAgNTMsIDEzMCwgMjI2IH0sCisgICAgICAgIHsgIDc1LCAgMzIsICAxMiwgIDUxLCAxOTIsIDI1NSwgMTYwLCAgNDMsICA1MSB9LAorICAgICAgICB7ICAzOSwgIDE5LCAgNTMsIDIyMSwgIDI2LCAxMTQsICAzMiwgIDczLCAyNTUgfSwKKyAgICAgICAgeyAgMzEsICAgOSwgIDY1LCAyMzQsICAgMiwgIDE1LCAgIDEsIDExOCwgIDczIH0sCisgICAgICAgIHsgIDU2LCAgMjEsICAyMywgMTExLCAgNTksIDIwNSwgIDQ1LCAgMzcsIDE5MiB9LAorICAgICAgICB7ICA4OCwgIDMxLCAgMzUsICA2NywgMTAyLCAgODUsICA1NSwgMTg2LCAgODUgfSwKKyAgICAgICAgeyAgNTUsICAzOCwgIDcwLCAxMjQsICA3MywgMTAyLCAgIDEsICAzNCwgIDk4IH0sCisgICAgICAgIHsgIDY0LCAgOTAsICA3MCwgMjA1LCAgNDAsICA0MSwgIDIzLCAgMjYsICA1NyB9LAorICAgIH0sCisgICAgeworICAgICAgICB7ICA4NiwgIDQwLCAgNjQsIDEzNSwgMTQ4LCAyMjQsICA0NSwgMTgzLCAxMjggfSwKKyAgICAgICAgeyAgMjIsICAyNiwgIDE3LCAxMzEsIDI0MCwgMTU0LCAgMTQsICAgMSwgMjA5IH0sCisgICAgICAgIHsgMTY0LCAgNTAsICAzMSwgMTM3LCAxNTQsIDEzMywgIDI1LCAgMzUsIDIxOCB9LAorICAgICAgICB7ICA4MywgIDEyLCAgMTMsICA1NCwgMTkyLCAyNTUsICA2OCwgIDQ3LCAgMjggfSwKKyAgICAgICAgeyAgNDUsICAxNiwgIDIxLCAgOTEsICA2NCwgMjIyLCAgIDcsICAgMSwgMTk3IH0sCisgICAgICAgIHsgIDU2LCAgMjEsICAzOSwgMTU1LCAgNjAsIDEzOCwgIDIzLCAxMDIsIDIxMyB9LAorICAgICAgICB7ICAxOCwgIDExLCAgIDcsICA2MywgMTQ0LCAxNzEsICAgNCwgICA0LCAyNDYgfSwKKyAgICAgICAgeyAgODUsICAyNiwgIDg1LCAgODUsIDEyOCwgMTI4LCAgMzIsIDE0NiwgMTcxIH0sCisgICAgICAgIHsgIDM1LCAgMjcsICAxMCwgMTQ2LCAxNzQsIDE3MSwgIDEyLCAgMjYsIDEyOCB9LAorICAgICAgICB7ICA1MSwgMTAzLCAgNDQsIDEzMSwgMTMxLCAxMjMsICAzMSwgICA2LCAxNTggfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgeyAgNjgsICA0NSwgMTI4LCAgMzQsICAgMSwgIDQ3LCAgMTEsIDI0NSwgMTcxIH0sCisgICAgICAgIHsgIDYyLCAgMTcsICAxOSwgIDcwLCAxNDYsICA4NSwgIDU1LCAgNjIsICA3MCB9LAorICAgICAgICB7IDEwMiwgIDYxLCAgNzEsICAzNywgIDM0LCAgNTMsICAzMSwgMjQzLCAxOTIgfSwKKyAgICAgICAgeyAgNzUsICAxNSwgICA5LCAgIDksICA2NCwgMjU1LCAxODQsIDExOSwgIDE2IH0sCisgICAgICAgIHsgIDM3LCAgNDMsICAzNywgMTU0LCAxMDAsIDE2MywgIDg1LCAxNjAsICAgMSB9LAorICAgICAgICB7ICA2MywgICA5LCAgOTIsIDEzNiwgIDI4LCAgNjQsICAzMiwgMjAxLCAgODUgfSwKKyAgICAgICAgeyAgNTYsICAgOCwgIDE3LCAxMzIsIDEzNywgMjU1LCAgNTUsIDExNiwgMTI4IH0sCisgICAgICAgIHsgIDg2LCAgIDYsICAyOCwgICA1LCAgNjQsIDI1NSwgIDI1LCAyNDgsICAgMSB9LAorICAgICAgICB7ICA1OCwgIDE1LCAgMjAsICA4MiwgMTM1LCAgNTcsICAyNiwgMTIxLCAgNDAgfSwKKyAgICAgICAgeyAgNjksICA2MCwgIDcxLCAgMzgsICA3MywgMTE5LCAgMjgsIDIyMiwgIDM3IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIHsgMTAxLCAgNzUsIDEyOCwgMTM5LCAxMTgsIDE0NiwgMTE2LCAxMjgsICA4NSB9LAorICAgICAgICB7ICA1NiwgIDQxLCAgMTUsIDE3NiwgMjM2LCAgODUsICAzNywgICA5LCAgNjIgfSwKKyAgICAgICAgeyAxOTAsICA4MCwgIDM1LCAgOTksIDE4MCwgIDgwLCAxMjYsICA1NCwgIDQ1IH0sCisgICAgICAgIHsgMTQ2LCAgMzYsICAxOSwgIDMwLCAxNzEsIDI1NSwgIDk3LCAgMjcsICAyMCB9LAorICAgICAgICB7ICA3MSwgIDMwLCAgMTcsIDExOSwgMTE4LCAyNTUsICAxNywgIDE4LCAxMzggfSwKKyAgICAgICAgeyAxMDEsICAzOCwgIDYwLCAxMzgsICA1NSwgIDcwLCAgNDMsICAyNiwgMTQyIH0sCisgICAgICAgIHsgIDMyLCAgNDEsICAyMCwgMTE3LCAxNTEsIDE0MiwgIDIwLCAgMjEsIDE2MyB9LAorICAgICAgICB7IDEzOCwgIDQ1LCAgNjEsICA2MiwgMjE5LCAgIDEsICA4MSwgMTg4LCAgNjQgfSwKKyAgICAgICAgeyAxMTIsICAxOSwgIDEyLCAgNjEsIDE5NSwgMTI4LCAgNDgsICAgNCwgIDI0IH0sCisgICAgICAgIHsgIDg1LCAxMjYsICA0NywgIDg3LCAxNzYsICA1MSwgIDQxLCAgMjAsICAzMiB9LAorICAgIH0sCisgICAgeworICAgICAgICB7ICA2NiwgMTAyLCAxNjcsICA5OSwgIDc0LCAgNjIsICA0MCwgMjM0LCAxMjggfSwKKyAgICAgICAgeyAgNDEsICA1MywgICA5LCAxNzgsIDI0MSwgMTQxLCAgMjYsICAgOCwgMTA3IH0sCisgICAgICAgIHsgMTM0LCAxODMsICA4OSwgMTM3LCAgOTgsIDEwMSwgMTA2LCAxNjUsIDE0OCB9LAorICAgICAgICB7IDEwNCwgIDc5LCAgMTIsICAyNywgMjE3LCAyNTUsICA4NywgIDE3LCAgIDcgfSwKKyAgICAgICAgeyAgNzQsICA0MywgIDI2LCAxNDYsICA3MywgMTY2LCAgNDksICAyMywgMTU3IH0sCisgICAgICAgIHsgIDY1LCAgMzgsIDEwNSwgMTYwLCAgNTEsICA1MiwgIDMxLCAxMTUsIDEyOCB9LAorICAgICAgICB7ICA0NywgIDQxLCAgMTQsIDExMCwgMTgyLCAxODMsICAyMSwgIDE3LCAxOTQgfSwKKyAgICAgICAgeyAgODcsICA2OCwgIDcxLCAgNDQsIDExNCwgIDUxLCAgMTUsIDE4NiwgIDIzIH0sCisgICAgICAgIHsgIDY2LCAgNDUsICAyNSwgMTAyLCAxOTcsIDE4OSwgIDIzLCAgMTgsICAyMiB9LAorICAgICAgICB7ICA3MiwgMTg3LCAxMDAsIDEzMCwgMTU3LCAxMTEsICAzMiwgIDc1LCAgODAgfSwKKyAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB2cDhfc2VnbWVudGlkX3RyZWVbXVsyXSA9IHsKKyAgICB7ICAxLCAgMiB9LAorICAgIHsgLTAsIC0xIH0sIC8vICcwMCcsICcwMScKKyAgICB7IC0yLCAtMyB9LCAvLyAnMTAnLCAnMTEnCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDhfY29lZmZfYmFuZFsxNl0gPSB7CisgICAgMCwgMSwgMiwgMywgNiwgNCwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNworfTsKKworLyogSW52ZXJzZSBvZiB2cDhfY29lZmZfYmFuZDogbWFwcGluZ3Mgb2YgYmFuZHMgdG8gY29lZmZpY2llbnQgaW5kZXhlcy4KKyAqIEVhY2ggbGlzdCBpcyAtMS10ZXJtaW5hdGVkLiAqLworc3RhdGljIGNvbnN0IGludDhfdCB2cDhfY29lZmZfYmFuZF9pbmRleGVzWzhdWzEwXSA9IHsKKyAgICB7ICAwLCAtMSB9LAorICAgIHsgIDEsIC0xIH0sCisgICAgeyAgMiwgLTEgfSwKKyAgICB7ICAzLCAtMSB9LAorICAgIHsgIDUsIC0xIH0sCisgICAgeyAgNiwgLTEgfSwKKyAgICB7ICA0LCAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAtMSB9LAorICAgIHsgMTUsIC0xIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOF9kY3RfY2F0MV9wcm9iW10gPSB7CisgICAgMTU5LCAwCit9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA4X2RjdF9jYXQyX3Byb2JbXSA9IHsKKyAgICAxNjUsIDE0NSwgMAorfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOF9kY3RfY2F0M19wcm9iW10gPSB7CisgICAgMTczLCAxNDgsIDE0MCwgMAorfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOF9kY3RfY2F0NF9wcm9iW10gPSB7CisgICAgMTc2LCAxNTUsIDE0MCwgMTM1LCAwCit9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA4X2RjdF9jYXQ1X3Byb2JbXSA9IHsKKyAgICAxODAsIDE1NywgMTQxLCAxMzQsIDEzMCwgMAorfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOF9kY3RfY2F0Nl9wcm9iW10gPSB7CisgICAgMjU0LCAyNTQsIDI0MywgMjMwLCAxOTYsIDE3NywgMTUzLCAxNDAsIDEzMywgMTMwLCAxMjksIDAKK307CisKKy8vIG9ubHkgdXNlZCBmb3IgY2F0MyBhbmQgYWJvdmU7IGNhdCAxIGFuZCAyIGFyZSByZWZlcmVuY2VkIGRpcmVjdGx5Citjb25zdCB1aW50OF90ICpjb25zdCBmZl92cDhfZGN0X2NhdF9wcm9iW10gPSB7CisgICAgdnA4X2RjdF9jYXQzX3Byb2IsCisgICAgdnA4X2RjdF9jYXQ0X3Byb2IsCisgICAgdnA4X2RjdF9jYXQ1X3Byb2IsCisgICAgdnA4X2RjdF9jYXQ2X3Byb2IsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDhfdG9rZW5fZGVmYXVsdF9wcm9ic1s0XVs4XVszXVtOVU1fRENUX1RPS0VOUyAtIDFdID0geworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7IDI1MywgMTM2LCAyNTQsIDI1NSwgMjI4LCAyMTksIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDE4OSwgMTI5LCAyNDIsIDI1NSwgMjI3LCAyMTMsIDI1NSwgMjE5LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDEwNiwgMTI2LCAyMjcsIDI1MiwgMjE0LCAyMDksIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgICAxLCAgOTgsIDI0OCwgMjU1LCAyMzYsIDIyNiwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTgxLCAxMzMsIDIzOCwgMjU0LCAyMjEsIDIzNCwgMjU1LCAxNTQsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgIDc4LCAxMzQsIDIwMiwgMjQ3LCAxOTgsIDE4MCwgMjU1LCAyMTksIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAgIDEsIDE4NSwgMjQ5LCAyNTUsIDI0MywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxODQsIDE1MCwgMjQ3LCAyNTUsIDIzNiwgMjI0LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgNzcsIDExMCwgMjE2LCAyNTUsIDIzNiwgMjMwLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ICAgMSwgMTAxLCAyNTEsIDI1NSwgMjQxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDE3MCwgMTM5LCAyNDEsIDI1MiwgMjM2LCAyMDksIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICAzNywgMTE2LCAxOTYsIDI0MywgMjI4LCAyNTUsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgICAxLCAyMDQsIDI1NCwgMjU1LCAyNDUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMjA3LCAxNjAsIDI1MCwgMjU1LCAyMzgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTAyLCAxMDMsIDIzMSwgMjU1LCAyMTEsIDE3MSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAgIDEsIDE1MiwgMjUyLCAyNTUsIDI0MCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxNzcsIDEzNSwgMjQzLCAyNTUsIDIzNCwgMjI1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgODAsIDEyOSwgMjExLCAyNTUsIDE5NCwgMjI0LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ICAgMSwgICAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDI0NiwgICAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMTk4LCAgMzUsIDIzNywgMjIzLCAxOTMsIDE4NywgMTYyLCAxNjAsIDE0NSwgMTU1LCAgNjIgfSwKKyAgICAgICAgICAgIHsgMTMxLCAgNDUsIDE5OCwgMjIxLCAxNzIsIDE3NiwgMjIwLCAxNTcsIDI1MiwgMjIxLCAgIDEgfSwKKyAgICAgICAgICAgIHsgIDY4LCAgNDcsIDE0NiwgMjA4LCAxNDksIDE2NywgMjIxLCAxNjIsIDI1NSwgMjIzLCAxMjggfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAgIDEsIDE0OSwgMjQxLCAyNTUsIDIyMSwgMjI0LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxODQsIDE0MSwgMjM0LCAyNTMsIDIyMiwgMjIwLCAyNTUsIDE5OSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgODEsICA5OSwgMTgxLCAyNDIsIDE3NiwgMTkwLCAyNDksIDIwMiwgMjU1LCAyNTUsIDEyOCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ICAgMSwgMTI5LCAyMzIsIDI1MywgMjE0LCAxOTcsIDI0MiwgMTk2LCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICAgICAgICB7ICA5OSwgMTIxLCAyMTAsIDI1MCwgMjAxLCAxOTgsIDI1NSwgMjAyLCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICAyMywgIDkxLCAxNjMsIDI0MiwgMTcwLCAxODcsIDI0NywgMjEwLCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgICAxLCAyMDAsIDI0NiwgMjU1LCAyMzQsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTA5LCAxNzgsIDI0MSwgMjU1LCAyMzEsIDI0NSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgIDQ0LCAxMzAsIDIwMSwgMjUzLCAyMDUsIDE5MiwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAgIDEsIDEzMiwgMjM5LCAyNTEsIDIxOSwgMjA5LCAyNTUsIDE2NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgOTQsIDEzNiwgMjI1LCAyNTEsIDIxOCwgMTkwLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgMjIsIDEwMCwgMTc0LCAyNDUsIDE4NiwgMTYxLCAyNTUsIDE5OSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ICAgMSwgMTgyLCAyNDksIDI1NSwgMjMyLCAyMzUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDEyNCwgMTQzLCAyNDEsIDI1NSwgMjI3LCAyMzQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICAzNSwgIDc3LCAxODEsIDI1MSwgMTkzLCAyMTEsIDI1NSwgMjA1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgICAxLCAxNTcsIDI0NywgMjU1LCAyMzYsIDIzMSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTIxLCAxNDEsIDIzNSwgMjU1LCAyMjUsIDIyNywgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgIDQ1LCAgOTksIDE4OCwgMjUxLCAxOTUsIDIxNywgMjU1LCAyMjQsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAgIDEsICAgMSwgMjUxLCAyNTUsIDIxMywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAyMDMsICAgMSwgMjQ4LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxMzcsICAgMSwgMTc3LCAyNTUsIDIyNCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICB7IDI1MywgICA5LCAyNDgsIDI1MSwgMjA3LCAyMDgsIDI1NSwgMTkyLCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDE3NSwgIDEzLCAyMjQsIDI0MywgMTkzLCAxODUsIDI0OSwgMTk4LCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICAgICAgICB7ICA3MywgIDE3LCAxNzEsIDIyMSwgMTYxLCAxNzksIDIzNiwgMTY3LCAyNTUsIDIzNCwgMTI4IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgICAxLCAgOTUsIDI0NywgMjUzLCAyMTIsIDE4MywgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMjM5LCAgOTAsIDI0NCwgMjUwLCAyMTEsIDIwOSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTU1LCAgNzcsIDE5NSwgMjQ4LCAxODgsIDE5NSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAgIDEsICAyNCwgMjM5LCAyNTEsIDIxOCwgMjE5LCAyNTUsIDIwNSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAyMDEsICA1MSwgMjE5LCAyNTUsIDE5NiwgMTg2LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgNjksICA0NiwgMTkwLCAyMzksIDIwMSwgMjE4LCAyNTUsIDIyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ICAgMSwgMTkxLCAyNTEsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDIyMywgMTY1LCAyNDksIDI1NSwgMjEzLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDE0MSwgMTI0LCAyNDgsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgICAxLCAgMTYsIDI0OCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTkwLCAgMzYsIDIzMCwgMjU1LCAyMzYsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTQ5LCAgIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAgIDEsIDIyNiwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAyNDcsIDE5MiwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAyNDAsIDEyOCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ICAgMSwgMTM0LCAyNTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDIxMywgIDYyLCAyNTAsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICA1NSwgIDkzLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgeyAyMDIsICAyNCwgMjEzLCAyMzUsIDE4NiwgMTkxLCAyMjAsIDE2MCwgMjQwLCAxNzUsIDI1NSB9LAorICAgICAgICAgICAgeyAxMjYsICAzOCwgMTgyLCAyMzIsIDE2OSwgMTg0LCAyMjgsIDE3NCwgMjU1LCAxODcsIDEyOCB9LAorICAgICAgICAgICAgeyAgNjEsICA0NiwgMTM4LCAyMTksIDE1MSwgMTc4LCAyNDAsIDE3MCwgMjU1LCAyMTYsIDEyOCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ICAgMSwgMTEyLCAyMzAsIDI1MCwgMTk5LCAxOTEsIDI0NywgMTU5LCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICAgICAgICB7IDE2NiwgMTA5LCAyMjgsIDI1MiwgMjExLCAyMTUsIDI1NSwgMTc0LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICAzOSwgIDc3LCAxNjIsIDIzMiwgMTcyLCAxODAsIDI0NSwgMTc4LCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgICAxLCAgNTIsIDIyMCwgMjQ2LCAxOTgsIDE5OSwgMjQ5LCAyMjAsIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTI0LCAgNzQsIDE5MSwgMjQzLCAxODMsIDE5MywgMjUwLCAyMjEsIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgICAgICAgIHsgIDI0LCAgNzEsIDEzMCwgMjE5LCAxNTQsIDE3MCwgMjQzLCAxODIsIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAgIDEsIDE4MiwgMjI1LCAyNDksIDIxOSwgMjQwLCAyNTUsIDIyNCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxNDksIDE1MCwgMjI2LCAyNTIsIDIxNiwgMjA1LCAyNTUsIDE3MSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgMjgsIDEwOCwgMTcwLCAyNDIsIDE4MywgMTk0LCAyNTQsIDIyMywgMjU1LCAyNTUsIDEyOCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ICAgMSwgIDgxLCAyMzAsIDI1MiwgMjA0LCAyMDMsIDI1NSwgMTkyLCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDEyMywgMTAyLCAyMDksIDI0NywgMTg4LCAxOTYsIDI1NSwgMjMzLCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7ICAyMCwgIDk1LCAxNTMsIDI0MywgMTY0LCAxNzMsIDI1NSwgMjAzLCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgICAxLCAyMjIsIDI0OCwgMjU1LCAyMTYsIDIxMywgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgMTY4LCAxNzUsIDI0NiwgMjUyLCAyMzUsIDIwNSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgICAgIHsgIDQ3LCAxMTYsIDIxNSwgMjU1LCAyMTEsIDIxMiwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAgIDEsIDEyMSwgMjM2LCAyNTMsIDIxMiwgMjE0LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAxNDEsICA4NCwgMjEzLCAyNTIsIDIwMSwgMjAyLCAyNTUsIDIxOSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICAgICAgeyAgNDIsICA4MCwgMTYwLCAyNDAsIDE2MiwgMTg1LCAyNTUsIDIwNSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ICAgMSwgICAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDI0NCwgICAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgICAgICB7IDIzOCwgICAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICAgIH0sCisgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOF90b2tlbl91cGRhdGVfcHJvYnNbNF1bOF1bM11bTlVNX0RDVF9UT0tFTlMgLSAxXSA9IHsKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAxNzYsIDI0NiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyMjMsIDI0MSwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNDksIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7IDI1NSwgMjQ0LCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDIzNCwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMjU1LCAyNDYsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjM5LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTEsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7IDI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1MSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMjU1LCAyNTQsIDI1MywgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjUwLCAyNTUsIDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICB7IDIxNywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDIyNSwgMjUyLCAyNDEsIDI1MywgMjU1LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDIzNCwgMjUwLCAyNDEsIDI1MCwgMjUzLCAyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjIzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjM4LCAyNTMsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNDksIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7IDI1NSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI0NywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAyNTUsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7IDI1NSwgMjU0LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1MCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgeyAxODYsIDI1MSwgMjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyMzQsIDI1MSwgMjQ0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTEsIDI1MSwgMjQzLCAyNTMsIDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7IDI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDIzNiwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1MSwgMjUzLCAyNTMsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU0LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMjQ4LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjUwLCAyNTQsIDI1MiwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjQ4LCAyNTQsIDI0OSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAyNTUsIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNDYsIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTIsIDI1NCwgMjUxLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7IDI1NSwgMjU0LCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI0OCwgMjU0LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1MywgMjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMjU1LCAyNTEsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjQ1LCAyNTEsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjUzLCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAyNTUsIDI1MSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7IDI1NSwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI0OSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgICAgICB7IDI1NSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgICB9LAorICAgIH0sCit9OworCisvLyBmaXhtZTogY29waWVkIGZyb20gaDI2NGRhdGEuaAorc3RhdGljIGNvbnN0IHVpbnQ4X3QgemlnemFnX3NjYW5bMTZdPXsKKyAgICAwICsgMCAqIDQsIDEgKyAwICogNCwgMCArIDEgKiA0LCAwICsgMiAqIDQsCisgICAgMSArIDEgKiA0LCAyICsgMCAqIDQsIDMgKyAwICogNCwgMiArIDEgKiA0LAorICAgIDEgKyAyICogNCwgMCArIDMgKiA0LCAxICsgMyAqIDQsIDIgKyAyICogNCwKKyAgICAzICsgMSAqIDQsIDMgKyAyICogNCwgMiArIDMgKiA0LCAzICsgMyAqIDQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDhfZGNfcWxvb2t1cFtWUDhfTUFYX1FVQU5UICsgMV0gPSB7CisgICAgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE3LAorICAgICAxOCwgIDE5LCAgMjAsICAyMCwgIDIxLCAgMjEsICAyMiwgIDIyLCAgMjMsICAyMywgIDI0LCAgMjUsICAyNSwgIDI2LCAgMjcsICAyOCwKKyAgICAgMjksICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsCisgICAgIDQ0LCAgNDUsICA0NiwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LAorICAgICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLCAgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwKKyAgICAgNzUsICA3NiwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksCisgICAgIDkxLCAgOTMsICA5NSwgIDk2LCAgOTgsIDEwMCwgMTAxLCAxMDIsIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLCAxMTQsIDExNiwgMTE4LAorICAgIDEyMiwgMTI0LCAxMjYsIDEyOCwgMTMwLCAxMzIsIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQzLCAxNDUsIDE0OCwgMTUxLCAxNTQsIDE1NywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB2cDhfYWNfcWxvb2t1cFtWUDhfTUFYX1FVQU5UICsgMV0gPSB7CisgICAgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LAorICAgICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwKKyAgICAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsCisgICAgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNjAsICA2MiwgIDY0LCAgNjYsICA2OCwgIDcwLCAgNzIsICA3NCwgIDc2LAorICAgICA3OCwgIDgwLCAgODIsICA4NCwgIDg2LCAgODgsICA5MCwgIDkyLCAgOTQsICA5NiwgIDk4LCAxMDAsIDEwMiwgMTA0LCAxMDYsIDEwOCwKKyAgICAxMTAsIDExMiwgMTE0LCAxMTYsIDExOSwgMTIyLCAxMjUsIDEyOCwgMTMxLCAxMzQsIDEzNywgMTQwLCAxNDMsIDE0NiwgMTQ5LCAxNTIsCisgICAgMTU1LCAxNTgsIDE2MSwgMTY0LCAxNjcsIDE3MCwgMTczLCAxNzcsIDE4MSwgMTg1LCAxODksIDE5MywgMTk3LCAyMDEsIDIwNSwgMjA5LAorICAgIDIxMywgMjE3LCAyMjEsIDIyNSwgMjI5LCAyMzQsIDIzOSwgMjQ1LCAyNDksIDI1NCwgMjU5LCAyNjQsIDI2OSwgMjc0LCAyNzksIDI4NCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOF9tdl91cGRhdGVfcHJvYlsyXVsxOV0gPSB7CisgICAgeyAyMzcsCisgICAgICAyNDYsCisgICAgICAyNTMsIDI1MywgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsCisgICAgICAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjUwLCAyNTAsIDI1MiwgLyogVlA4IG9ubHk6ICovIDI1NCwgMjU0IH0sCisgICAgeyAyMzEsCisgICAgICAyNDMsCisgICAgICAyNDUsIDI1MywgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsCisgICAgICAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjUxLCAyNTEsIDI1NCwgLyogVlA4IG9ubHk6ICovIDI1NCwgMjU0IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwN19tdl9kZWZhdWx0X3Byb2JbMl1bMTddID0geworICAgIHsgMTYyLAorICAgICAgMTI4LAorICAgICAgMjI1LCAxNDYsIDE3MiwgMTQ3LCAyMTQsICAzOSwgMTU2LAorICAgICAgMjQ3LCAyMTAsIDEzNSwgIDY4LCAxMzgsIDIyMCwgMjM5LCAyNDYgfSwKKyAgICB7IDE2NCwKKyAgICAgIDEyOCwKKyAgICAgIDIwNCwgMTcwLCAxMTksIDIzNSwgMTQwLCAyMzAsIDIyOCwKKyAgICAgIDI0NCwgMTg0LCAyMDEsICA0NCwgMTczLCAyMjEsIDIzOSwgMjUzIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOF9tdl9kZWZhdWx0X3Byb2JbMl1bMTldID0geworICAgIHsgMTYyLAorICAgICAgMTI4LAorICAgICAgMjI1LCAxNDYsIDE3MiwgMTQ3LCAyMTQsIDM5LCAxNTYsCisgICAgICAxMjgsIDEyOSwgMTMyLCAgNzUsIDE0NSwgMTc4LCAyMDYsIDIzOSwgMjU0LCAyNTQgfSwKKyAgICB7IDE2NCwKKyAgICAgIDEyOCwKKyAgICAgIDIwNCwgMTcwLCAxMTksIDIzNSwgMTQwLCAyMzAsIDIyOCwKKyAgICAgIDEyOCwgMTMwLCAxMzAsICA3NCwgMTQ4LCAxODAsIDIwMywgMjM2LCAyNTQsIDI1NCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDdfZmVhdHVyZV92YWx1ZV9zaXplWzJdWzRdID0geworICAgIHsgNywgNiwgMCwgOCB9LAorICAgIHsgNywgNiwgMCwgNSB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB2cDdfZmVhdHVyZV9pbmRleF90cmVlWzRdWzJdID0KK3sKKyAgICB7ICAxLCAgMiB9LAorICAgIHsgLTAsIC0xIH0sIC8vICcwMCcsICcwMScKKyAgICB7IC0yLCAtMyB9LCAvLyAnMTAnLCAnMTEnCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgdnA3X3lkY19xbG9va3VwW10gPSB7CisgICAgICA0LCAgIDQsICAgNSwgICA2LCAgIDYsICAgNywgICA4LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAgICAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LAorICAgICAzMCwgIDMxLCAgMzIsICAzMywgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzYsICAzNywgIDM4LCAgMzksICAzOSwgIDQwLCAgNDEsCisgICAgIDQxLCAgNDIsICA0MywgIDQzLCAgNDQsICA0NSwgIDQ1LCAgNDYsICA0NywgIDQ4LCAgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwKKyAgICAgNTMsICA1MywgIDU0LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYyLCAgNjMsICA2NSwgIDY2LCAgNjgsICA3MCwgIDcyLAorICAgICA3NCwgIDc2LCAgNzksICA4MSwgIDg0LCAgODcsICA5MCwgIDkzLCAgOTYsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjEsCisgICAgMTI2LCAxMzEsIDEzNiwgMTQyLCAxNDgsIDE1NCwgMTYwLCAxNjcsIDE3NCwgMTgyLCAxODksIDE5OCwgMjA2LCAyMTUsIDIyNCwKKyAgICAyMzQsIDI0NCwgMjU0LCAyNjUsIDI3NywgMjg4LCAzMDEsIDMxMywgMzI3LCAzNDAsIDM1NSwgMzcwLCAzODUsIDQwMSwgNDE3LAorICAgIDQzNCwgNDUyLCA0NzAsIDQ4OSwgNTA5LCA1MjksIDU1MCwgNTcyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHZwN195YWNfcWxvb2t1cFtdID0geworICAgICAgIDQsICAgIDQsICAgNSwgICA1LCAgIDYsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgICAxMywgICAxNSwKKyAgICAgIDE2LCAgIDE3LCAgMTksICAyMCwgIDIyLCAgMjMsICAyNSwgIDI2LCAgMjgsICAyOSwgIDMxLCAgMzIsICAgMzQsICAgMzUsCisgICAgICAzNywgICAzOCwgIDQwLCAgNDEsICA0MiwgIDQ0LCAgNDUsICA0NiwgIDQ4LCAgNDksICA1MCwgIDUxLCAgIDUzLCAgIDU0LAorICAgICAgNTUsICAgNTYsICA1NywgIDU4LCAgNTksICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjcsICA2OCwgICA2OSwgICA3MCwKKyAgICAgIDcyLCAgIDczLCAgNzUsICA3NiwgIDc4LCAgODAsICA4MiwgIDg0LCAgODYsICA4OCwgIDkxLCAgOTMsICAgOTYsICAgOTksCisgICAgIDEwMiwgIDEwNSwgMTA5LCAxMTIsIDExNiwgMTIxLCAxMjUsIDEzMCwgMTM1LCAxNDAsIDE0NiwgMTUyLCAgMTU4LCAgMTY1LAorICAgICAxNzIsICAxODAsIDE4OCwgMTk2LCAyMDUsIDIxNCwgMjI0LCAyMzQsIDI0NSwgMjU2LCAyNjgsIDI4MSwgIDI5NCwgIDMwOCwKKyAgICAgMzIyLCAgMzM3LCAzNTMsIDM2OSwgMzg2LCA0MDQsIDQyMywgNDQzLCA0NjMsIDQ4NCwgNTA2LCA1MjksICA1NTMsICA1NzgsCisgICAgIDYwNCwgIDYzMSwgNjU5LCA2ODgsIDcxOCwgNzQ5LCA3ODEsIDgxNCwgODQ5LCA4ODUsIDkyMiwgOTYwLCAxMDAwLCAxMDQxLAorICAgIDEwODMsIDExMjcsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgdnA3X3kyZGNfcWxvb2t1cFtdID0geworICAgICAgIDcsICAgIDksICAxMSwgIDEzLCAgMTUsICAxNywgIDE5LCAgMjEsICAyMywgIDI2LCAgMjgsICAzMCwgICAzMywgICAzNSwKKyAgICAgIDM3LCAgIDM5LCAgNDIsICA0NCwgIDQ2LCAgNDgsICA1MSwgIDUzLCAgNTUsICA1NywgIDU5LCAgNjEsICAgNjMsICAgNjUsCisgICAgICA2NywgICA2OSwgIDcwLCAgNzIsICA3NCwgIDc1LCAgNzcsICA3OCwgIDgwLCAgODEsICA4MywgIDg0LCAgIDg1LCAgIDg3LAorICAgICAgODgsICAgODksICA5MCwgIDkyLCAgOTMsICA5NCwgIDk1LCAgOTYsICA5NywgIDk5LCAxMDAsIDEwMSwgIDEwMiwgIDEwNCwKKyAgICAgMTA1LCAgMTA2LCAxMDgsIDEwOSwgMTExLCAxMTMsIDExNCwgMTE2LCAxMTgsIDEyMCwgMTIzLCAxMjUsICAxMjgsICAxMzEsCisgICAgIDEzNCwgIDEzNywgMTQwLCAxNDQsIDE0OCwgMTUyLCAxNTYsIDE2MSwgMTY2LCAxNzEsIDE3NiwgMTgyLCAgMTg4LCAgMTk1LAorICAgICAyMDIsICAyMDksIDIxNywgMjI1LCAyMzQsIDI0MywgMjUzLCAyNjMsIDI3NCwgMjg1LCAyOTcsIDMwOSwgIDMyMiwgIDMzNiwKKyAgICAgMzUwLCAgMzY1LCAzODEsIDM5NywgNDE0LCA0MzIsIDQ1MCwgNDcwLCA0OTAsIDUxMSwgNTMzLCA1NTYsICA1NzksICA2MDQsCisgICAgIDYzMCwgIDY1NiwgNjg0LCA3MTMsIDc0MiwgNzczLCA4MDUsIDgzOCwgODczLCA5MDgsIDk0NSwgOTgzLCAxMDIyLCAxMDYzLAorICAgIDExMDUsIDExNDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgdnA3X3kyYWNfcWxvb2t1cFtdID0geworICAgICAgIDcsICAgIDksICAgMTEsICAgMTMsICAgMTYsICAgMTgsICAgMjEsICAgMjQsICAgMjYsICAgMjksICAgMzIsICAgMzUsCisgICAgICAzOCwgICA0MSwgICA0MywgICA0NiwgICA0OSwgICA1MiwgICA1NSwgICA1OCwgICA2MSwgICA2NCwgICA2NiwgICA2OSwKKyAgICAgIDcyLCAgIDc0LCAgIDc3LCAgIDc5LCAgIDgyLCAgIDg0LCAgIDg2LCAgIDg4LCAgIDkxLCAgIDkzLCAgIDk1LCAgIDk3LAorICAgICAgOTgsICAxMDAsICAxMDIsICAxMDQsICAxMDUsICAxMDcsICAxMDksICAxMTAsICAxMTIsICAxMTMsICAxMTUsICAxMTYsCisgICAgIDExNywgIDExOSwgIDEyMCwgIDEyMiwgIDEyMywgIDEyNSwgIDEyNywgIDEyOCwgIDEzMCwgIDEzMiwgIDEzNCwgIDEzNiwKKyAgICAgMTM4LCAgMTQxLCAgMTQzLCAgMTQ2LCAgMTQ5LCAgMTUyLCAgMTU1LCAgMTU4LCAgMTYyLCAgMTY2LCAgMTcxLCAgMTc1LAorICAgICAxODAsICAxODUsICAxOTEsICAxOTcsICAyMDQsICAyMTAsICAyMTgsICAyMjYsICAyMzQsICAyNDMsICAyNTIsICAyNjIsCisgICAgIDI3MywgIDI4NCwgIDI5NSwgIDMwOCwgIDMyMSwgIDMzNSwgIDM1MCwgIDM2NSwgIDM4MSwgIDM5OCwgIDQxNiwgIDQzNSwKKyAgICAgNDU1LCAgNDc2LCAgNDk3LCAgNTIwLCAgNTQ0LCAgNTY5LCAgNTk1LCAgNjIyLCAgNjUwLCAgNjgwLCAgNzExLCAgNzQzLAorICAgICA3NzYsICA4MTEsICA4NDgsICA4ODUsICA5MjUsICA5NjUsIDEwMDgsIDEwNTIsIDEwOTcsIDExNDQsIDExOTMsIDEyNDQsCisgICAgMTI5NywgMTM1MSwgMTQwNywgMTQ2NiwgMTUyNiwgMTU4OCwgMTY1MiwgMTcxOSwKK307CisKKyNlbmRpZiAvKiBBVkNPREVDX1ZQOERBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnA4ZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy92cDhkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWE5MWJiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA4ZHNwLmMKQEAgLTAsMCArMSw3MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGF2aWQgQ29ucmFkCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUm9uYWxkIFMuIEJ1bHRqZQorICogQ29weXJpZ2h0IChDKSAyMDE0IFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVlA4IGNvbXBhdGlibGUgdmlkZW8gZGVjb2RlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgInZwOGRzcC5oIgorCisjZGVmaW5lIE1LX0lEQ1RfRENfQURENF9DKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBuYW1lICMjIF9pZGN0X2RjX2FkZDR1dl9jKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1s0XVsxNl0sICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZSAjIyBfaWRjdF9kY19hZGRfYyhkc3QgKyBzdHJpZGUgKiAwICsgMCwgYmxvY2tbMF0sIHN0cmlkZSk7ICAgICAgICAgICBcCisgICAgbmFtZSAjIyBfaWRjdF9kY19hZGRfYyhkc3QgKyBzdHJpZGUgKiAwICsgNCwgYmxvY2tbMV0sIHN0cmlkZSk7ICAgICAgICAgICBcCisgICAgbmFtZSAjIyBfaWRjdF9kY19hZGRfYyhkc3QgKyBzdHJpZGUgKiA0ICsgMCwgYmxvY2tbMl0sIHN0cmlkZSk7ICAgICAgICAgICBcCisgICAgbmFtZSAjIyBfaWRjdF9kY19hZGRfYyhkc3QgKyBzdHJpZGUgKiA0ICsgNCwgYmxvY2tbM10sIHN0cmlkZSk7ICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBuYW1lICMjIF9pZGN0X2RjX2FkZDR5X2ModWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzRdWzE2XSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZSAjIyBfaWRjdF9kY19hZGRfYyhkc3QgKyAgMCwgYmxvY2tbMF0sIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZSAjIyBfaWRjdF9kY19hZGRfYyhkc3QgKyAgNCwgYmxvY2tbMV0sIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZSAjIyBfaWRjdF9kY19hZGRfYyhkc3QgKyAgOCwgYmxvY2tbMl0sIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZSAjIyBfaWRjdF9kY19hZGRfYyhkc3QgKyAxMiwgYmxvY2tbM10sIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNpZiBDT05GSUdfVlA3X0RFQ09ERVIKK3N0YXRpYyB2b2lkIHZwN19sdW1hX2RjX3dodF9jKGludDE2X3QgYmxvY2tbNF1bNF1bMTZdLCBpbnQxNl90IGRjWzE2XSkKK3sKKyAgICBpbnQgaSwgYTEsIGIxLCBjMSwgZDE7CisgICAgaW50MTZfdCB0bXBbMTZdOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBhMSA9IChkY1tpICogNCArIDBdICsgZGNbaSAqIDQgKyAyXSkgKiAyMzE3MDsKKyAgICAgICAgYjEgPSAoZGNbaSAqIDQgKyAwXSAtIGRjW2kgKiA0ICsgMl0pICogMjMxNzA7CisgICAgICAgIGMxID0gZGNbaSAqIDQgKyAxXSAqIDEyNTQwIC0gZGNbaSAqIDQgKyAzXSAqIDMwMjc0OworICAgICAgICBkMSA9IGRjW2kgKiA0ICsgMV0gKiAzMDI3NCArIGRjW2kgKiA0ICsgM10gKiAxMjU0MDsKKyAgICAgICAgdG1wW2kgKiA0ICsgMF0gPSAoYTEgKyBkMSkgPj4gMTQ7CisgICAgICAgIHRtcFtpICogNCArIDNdID0gKGExIC0gZDEpID4+IDE0OworICAgICAgICB0bXBbaSAqIDQgKyAxXSA9IChiMSArIGMxKSA+PiAxNDsKKyAgICAgICAgdG1wW2kgKiA0ICsgMl0gPSAoYjEgLSBjMSkgPj4gMTQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBhMSA9ICh0bXBbaSArIDBdICsgdG1wW2kgKyA4XSkgKiAyMzE3MDsKKyAgICAgICAgYjEgPSAodG1wW2kgKyAwXSAtIHRtcFtpICsgOF0pICogMjMxNzA7CisgICAgICAgIGMxID0gdG1wW2kgKyA0XSAqIDEyNTQwIC0gdG1wW2kgKyAxMl0gKiAzMDI3NDsKKyAgICAgICAgZDEgPSB0bXBbaSArIDRdICogMzAyNzQgKyB0bXBbaSArIDEyXSAqIDEyNTQwOworICAgICAgICBBVl9aRVJPNjQoZGMgKyBpICogNCk7CisgICAgICAgIGJsb2NrWzBdW2ldWzBdID0gKGExICsgZDEgKyAweDIwMDAwKSA+PiAxODsKKyAgICAgICAgYmxvY2tbM11baV1bMF0gPSAoYTEgLSBkMSArIDB4MjAwMDApID4+IDE4OworICAgICAgICBibG9ja1sxXVtpXVswXSA9IChiMSArIGMxICsgMHgyMDAwMCkgPj4gMTg7CisgICAgICAgIGJsb2NrWzJdW2ldWzBdID0gKGIxIC0gYzEgKyAweDIwMDAwKSA+PiAxODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZwN19sdW1hX2RjX3dodF9kY19jKGludDE2X3QgYmxvY2tbNF1bNF1bMTZdLCBpbnQxNl90IGRjWzE2XSkKK3sKKyAgICBpbnQgaSwgdmFsID0gKDIzMTcwICogKDIzMTcwICogZGNbMF0gPj4gMTQpICsgMHgyMDAwMCkgPj4gMTg7CisgICAgZGNbMF0gPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBibG9ja1tpXVswXVswXSA9IHZhbDsKKyAgICAgICAgYmxvY2tbaV1bMV1bMF0gPSB2YWw7CisgICAgICAgIGJsb2NrW2ldWzJdWzBdID0gdmFsOworICAgICAgICBibG9ja1tpXVszXVswXSA9IHZhbDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZwN19pZGN0X2FkZF9jKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGksIGExLCBiMSwgYzEsIGQxOworICAgIGludDE2X3QgdG1wWzE2XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgYTEgPSAoYmxvY2tbaSAqIDQgKyAwXSArIGJsb2NrW2kgKiA0ICsgMl0pICogMjMxNzA7CisgICAgICAgIGIxID0gKGJsb2NrW2kgKiA0ICsgMF0gLSBibG9ja1tpICogNCArIDJdKSAqIDIzMTcwOworICAgICAgICBjMSA9IGJsb2NrW2kgKiA0ICsgMV0gKiAxMjU0MCAtIGJsb2NrW2kgKiA0ICsgM10gKiAzMDI3NDsKKyAgICAgICAgZDEgPSBibG9ja1tpICogNCArIDFdICogMzAyNzQgKyBibG9ja1tpICogNCArIDNdICogMTI1NDA7CisgICAgICAgIEFWX1pFUk82NChibG9jayArIGkgKiA0KTsKKyAgICAgICAgdG1wW2kgKiA0ICsgMF0gPSAoYTEgKyBkMSkgPj4gMTQ7CisgICAgICAgIHRtcFtpICogNCArIDNdID0gKGExIC0gZDEpID4+IDE0OworICAgICAgICB0bXBbaSAqIDQgKyAxXSA9IChiMSArIGMxKSA+PiAxNDsKKyAgICAgICAgdG1wW2kgKiA0ICsgMl0gPSAoYjEgLSBjMSkgPj4gMTQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBhMSA9ICh0bXBbaSArIDBdICsgdG1wW2kgKyA4XSkgKiAyMzE3MDsKKyAgICAgICAgYjEgPSAodG1wW2kgKyAwXSAtIHRtcFtpICsgOF0pICogMjMxNzA7CisgICAgICAgIGMxID0gdG1wW2kgKyA0XSAqIDEyNTQwIC0gdG1wW2kgKyAxMl0gKiAzMDI3NDsKKyAgICAgICAgZDEgPSB0bXBbaSArIDRdICogMzAyNzQgKyB0bXBbaSArIDEyXSAqIDEyNTQwOworICAgICAgICBkc3RbMCAqIHN0cmlkZSArIGldID0gYXZfY2xpcF91aW50OChkc3RbMCAqIHN0cmlkZSArIGldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhMSArIGQxICsgMHgyMDAwMCkgPj4gMTgpKTsKKyAgICAgICAgZHN0WzMgKiBzdHJpZGUgKyBpXSA9IGF2X2NsaXBfdWludDgoZHN0WzMgKiBzdHJpZGUgKyBpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYTEgLSBkMSArIDB4MjAwMDApID4+IDE4KSk7CisgICAgICAgIGRzdFsxICogc3RyaWRlICsgaV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFsxICogc3RyaWRlICsgaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGIxICsgYzEgKyAweDIwMDAwKSA+PiAxOCkpOworICAgICAgICBkc3RbMiAqIHN0cmlkZSArIGldID0gYXZfY2xpcF91aW50OChkc3RbMiAqIHN0cmlkZSArIGldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiMSAtIGMxICsgMHgyMDAwMCkgPj4gMTgpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZwN19pZGN0X2RjX2FkZF9jKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGksIGRjID0gKDIzMTcwICogKDIzMTcwICogYmxvY2tbMF0gPj4gMTQpICsgMHgyMDAwMCkgPj4gMTg7CisgICAgYmxvY2tbMF0gPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBkc3RbMF0gPSBhdl9jbGlwX3VpbnQ4KGRzdFswXSArIGRjKTsKKyAgICAgICAgZHN0WzFdID0gYXZfY2xpcF91aW50OChkc3RbMV0gKyBkYyk7CisgICAgICAgIGRzdFsyXSA9IGF2X2NsaXBfdWludDgoZHN0WzJdICsgZGMpOworICAgICAgICBkc3RbM10gPSBhdl9jbGlwX3VpbnQ4KGRzdFszXSArIGRjKTsKKyAgICAgICAgZHN0ICAgKz0gc3RyaWRlOworICAgIH0KK30KKworTUtfSURDVF9EQ19BREQ0X0ModnA3KQorI2VuZGlmIC8qIENPTkZJR19WUDdfREVDT0RFUiAqLworCisvLyBUT0RPOiBNYXliZSBhZGQgZGVxdWFudAorI2lmIENPTkZJR19WUDhfREVDT0RFUgorc3RhdGljIHZvaWQgdnA4X2x1bWFfZGNfd2h0X2MoaW50MTZfdCBibG9ja1s0XVs0XVsxNl0sIGludDE2X3QgZGNbMTZdKQoreworICAgIGludCBpLCB0MCwgdDEsIHQyLCB0MzsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgdDAgPSBkY1swICogNCArIGldICsgZGNbMyAqIDQgKyBpXTsKKyAgICAgICAgdDEgPSBkY1sxICogNCArIGldICsgZGNbMiAqIDQgKyBpXTsKKyAgICAgICAgdDIgPSBkY1sxICogNCArIGldIC0gZGNbMiAqIDQgKyBpXTsKKyAgICAgICAgdDMgPSBkY1swICogNCArIGldIC0gZGNbMyAqIDQgKyBpXTsKKworICAgICAgICBkY1swICogNCArIGldID0gdDAgKyB0MTsKKyAgICAgICAgZGNbMSAqIDQgKyBpXSA9IHQzICsgdDI7CisgICAgICAgIGRjWzIgKiA0ICsgaV0gPSB0MCAtIHQxOworICAgICAgICBkY1szICogNCArIGldID0gdDMgLSB0MjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHQwID0gZGNbaSAqIDQgKyAwXSArIGRjW2kgKiA0ICsgM10gKyAzOyAvLyByb3VuZGluZworICAgICAgICB0MSA9IGRjW2kgKiA0ICsgMV0gKyBkY1tpICogNCArIDJdOworICAgICAgICB0MiA9IGRjW2kgKiA0ICsgMV0gLSBkY1tpICogNCArIDJdOworICAgICAgICB0MyA9IGRjW2kgKiA0ICsgMF0gLSBkY1tpICogNCArIDNdICsgMzsgLy8gcm91bmRpbmcKKyAgICAgICAgQVZfWkVSTzY0KGRjICsgaSAqIDQpOworCisgICAgICAgIGJsb2NrW2ldWzBdWzBdID0gKHQwICsgdDEpID4+IDM7CisgICAgICAgIGJsb2NrW2ldWzFdWzBdID0gKHQzICsgdDIpID4+IDM7CisgICAgICAgIGJsb2NrW2ldWzJdWzBdID0gKHQwIC0gdDEpID4+IDM7CisgICAgICAgIGJsb2NrW2ldWzNdWzBdID0gKHQzIC0gdDIpID4+IDM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2cDhfbHVtYV9kY193aHRfZGNfYyhpbnQxNl90IGJsb2NrWzRdWzRdWzE2XSwgaW50MTZfdCBkY1sxNl0pCit7CisgICAgaW50IGksIHZhbCA9IChkY1swXSArIDMpID4+IDM7CisgICAgZGNbMF0gPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBibG9ja1tpXVswXVswXSA9IHZhbDsKKyAgICAgICAgYmxvY2tbaV1bMV1bMF0gPSB2YWw7CisgICAgICAgIGJsb2NrW2ldWzJdWzBdID0gdmFsOworICAgICAgICBibG9ja1tpXVszXVswXSA9IHZhbDsKKyAgICB9Cit9CisKKyNkZWZpbmUgTVVMXzIwMDkxKGEpICgoKChhKSAqIDIwMDkxKSA+PiAxNikgKyAoYSkpCisjZGVmaW5lIE1VTF8zNTQ2OChhKSAgKCgoYSkgKiAzNTQ2OCkgPj4gMTYpCisKK3N0YXRpYyB2b2lkIHZwOF9pZGN0X2FkZF9jKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGksIHQwLCB0MSwgdDIsIHQzOworICAgIGludDE2X3QgdG1wWzE2XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgdDAgPSBibG9ja1swICogNCArIGldICsgYmxvY2tbMiAqIDQgKyBpXTsKKyAgICAgICAgdDEgPSBibG9ja1swICogNCArIGldIC0gYmxvY2tbMiAqIDQgKyBpXTsKKyAgICAgICAgdDIgPSBNVUxfMzU0NjgoYmxvY2tbMSAqIDQgKyBpXSkgLSBNVUxfMjAwOTEoYmxvY2tbMyAqIDQgKyBpXSk7CisgICAgICAgIHQzID0gTVVMXzIwMDkxKGJsb2NrWzEgKiA0ICsgaV0pICsgTVVMXzM1NDY4KGJsb2NrWzMgKiA0ICsgaV0pOworICAgICAgICBibG9ja1swICogNCArIGldID0gMDsKKyAgICAgICAgYmxvY2tbMSAqIDQgKyBpXSA9IDA7CisgICAgICAgIGJsb2NrWzIgKiA0ICsgaV0gPSAwOworICAgICAgICBibG9ja1szICogNCArIGldID0gMDsKKworICAgICAgICB0bXBbaSAqIDQgKyAwXSA9IHQwICsgdDM7CisgICAgICAgIHRtcFtpICogNCArIDFdID0gdDEgKyB0MjsKKyAgICAgICAgdG1wW2kgKiA0ICsgMl0gPSB0MSAtIHQyOworICAgICAgICB0bXBbaSAqIDQgKyAzXSA9IHQwIC0gdDM7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICB0MCA9IHRtcFswICogNCArIGldICsgdG1wWzIgKiA0ICsgaV07CisgICAgICAgIHQxID0gdG1wWzAgKiA0ICsgaV0gLSB0bXBbMiAqIDQgKyBpXTsKKyAgICAgICAgdDIgPSBNVUxfMzU0NjgodG1wWzEgKiA0ICsgaV0pIC0gTVVMXzIwMDkxKHRtcFszICogNCArIGldKTsKKyAgICAgICAgdDMgPSBNVUxfMjAwOTEodG1wWzEgKiA0ICsgaV0pICsgTVVMXzM1NDY4KHRtcFszICogNCArIGldKTsKKworICAgICAgICBkc3RbMF0gPSBhdl9jbGlwX3VpbnQ4KGRzdFswXSArICgodDAgKyB0MyArIDQpID4+IDMpKTsKKyAgICAgICAgZHN0WzFdID0gYXZfY2xpcF91aW50OChkc3RbMV0gKyAoKHQxICsgdDIgKyA0KSA+PiAzKSk7CisgICAgICAgIGRzdFsyXSA9IGF2X2NsaXBfdWludDgoZHN0WzJdICsgKCh0MSAtIHQyICsgNCkgPj4gMykpOworICAgICAgICBkc3RbM10gPSBhdl9jbGlwX3VpbnQ4KGRzdFszXSArICgodDAgLSB0MyArIDQpID4+IDMpKTsKKyAgICAgICAgZHN0ICAgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdnA4X2lkY3RfZGNfYWRkX2ModWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzE2XSwgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgaSwgZGMgPSAoYmxvY2tbMF0gKyA0KSA+PiAzOworICAgIGJsb2NrWzBdID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgZHN0WzBdID0gYXZfY2xpcF91aW50OChkc3RbMF0gKyBkYyk7CisgICAgICAgIGRzdFsxXSA9IGF2X2NsaXBfdWludDgoZHN0WzFdICsgZGMpOworICAgICAgICBkc3RbMl0gPSBhdl9jbGlwX3VpbnQ4KGRzdFsyXSArIGRjKTsKKyAgICAgICAgZHN0WzNdID0gYXZfY2xpcF91aW50OChkc3RbM10gKyBkYyk7CisgICAgICAgIGRzdCAgICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK01LX0lEQ1RfRENfQURENF9DKHZwOCkKKyNlbmRpZiAvKiBDT05GSUdfVlA4X0RFQ09ERVIgKi8KKworLy8gYmVjYXVzZSBJIGxpa2Ugb25seSBoYXZpbmcgdHdvIHBhcmFtZXRlcnMgdG8gcGFzcyBmdW5jdGlvbnMuLi4KKyNkZWZpbmUgTE9BRF9QSVhFTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYXZfdW51c2VkIHAzID0gcFstNCAqIHN0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYXZfdW51c2VkIHAyID0gcFstMyAqIHN0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYXZfdW51c2VkIHAxID0gcFstMiAqIHN0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYXZfdW51c2VkIHAwID0gcFstMSAqIHN0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYXZfdW51c2VkIHEwID0gcFsgMCAqIHN0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYXZfdW51c2VkIHExID0gcFsgMSAqIHN0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYXZfdW51c2VkIHEyID0gcFsgMiAqIHN0cmlkZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYXZfdW51c2VkIHEzID0gcFsgMyAqIHN0cmlkZV07CisKKyNkZWZpbmUgY2xpcF9pbnQ4KG4pIChjbVsobikgKyAweDgwXSAtIDB4ODApCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmlsdGVyX2NvbW1vbih1aW50OF90ICpwLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpczR0YXAsIGludCBpc192cDcpCit7CisgICAgTE9BRF9QSVhFTFMKKyAgICBpbnQgYSwgZjEsIGYyOworICAgIGNvbnN0IHVpbnQ4X3QgKmNtID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisKKyAgICBhID0gMyAqIChxMCAtIHAwKTsKKworICAgIGlmIChpczR0YXApCisgICAgICAgIGEgKz0gY2xpcF9pbnQ4KHAxIC0gcTEpOworCisgICAgYSA9IGNsaXBfaW50OChhKTsKKworICAgIC8vIFdlIGRldmlhdGUgZnJvbSB0aGUgc3BlYyBoZXJlIHdpdGggYyhhKzMpID4+IDMKKyAgICAvLyBzaW5jZSB0aGF0J3Mgd2hhdCBsaWJ2cHggZG9lcy4KKyAgICBmMSA9IEZGTUlOKGEgKyA0LCAxMjcpID4+IDM7CisKKyAgICBpZiAoaXNfdnA3KQorICAgICAgICBmMiA9IGYxIC0gKChhICYgNykgPT0gNCk7CisgICAgZWxzZQorICAgICAgICBmMiA9IEZGTUlOKGEgKyAzLCAxMjcpID4+IDM7CisKKyAgICAvLyBEZXNwaXRlIHdoYXQgdGhlIHNwZWMgc2F5cywgd2UgZG8gbmVlZCB0byBjbGFtcCBoZXJlIHRvCisgICAgLy8gYmUgYml0ZXhhY3Qgd2l0aCBsaWJ2cHguCisgICAgcFstMSAqIHN0cmlkZV0gPSBjbVtwMCArIGYyXTsKKyAgICBwWyAwICogc3RyaWRlXSA9IGNtW3EwIC0gZjFdOworCisgICAgLy8gb25seSB1c2VkIGZvciBfaW5uZXIgb24gYmxvY2tzIHdpdGhvdXQgaGlnaCBlZGdlIHZhcmlhbmNlCisgICAgaWYgKCFpczR0YXApIHsKKyAgICAgICAgYSAgICAgICAgICAgICAgPSAoZjEgKyAxKSA+PiAxOworICAgICAgICBwWy0yICogc3RyaWRlXSA9IGNtW3AxICsgYV07CisgICAgICAgIHBbIDEgKiBzdHJpZGVdID0gY21bcTEgLSBhXTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgdnA3X2ZpbHRlcl9jb21tb24odWludDhfdCAqcCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzNHRhcCkKK3sKKyAgICBmaWx0ZXJfY29tbW9uKHAsIHN0cmlkZSwgaXM0dGFwLCBJU19WUDcpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHZwOF9maWx0ZXJfY29tbW9uKHVpbnQ4X3QgKnAsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpczR0YXApCit7CisgICAgZmlsdGVyX2NvbW1vbihwLCBzdHJpZGUsIGlzNHRhcCwgSVNfVlA4KTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHZwN19zaW1wbGVfbGltaXQodWludDhfdCAqcCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGltKQoreworICAgIExPQURfUElYRUxTCisgICAgcmV0dXJuIEZGQUJTKHAwIC0gcTApIDw9IGZsaW07Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB2cDhfc2ltcGxlX2xpbWl0KHVpbnQ4X3QgKnAsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxpbSkKK3sKKyAgICBMT0FEX1BJWEVMUworICAgIHJldHVybiAyICogRkZBQlMocDAgLSBxMCkgKyAoRkZBQlMocDEgLSBxMSkgPj4gMSkgPD0gZmxpbTsKK30KKworLyoqCisgKiBFIC0gbGltaXQgYXQgdGhlIG1hY3JvYmxvY2sgZWRnZQorICogSSAtIGxpbWl0IGZvciBpbnRlcmlvciBkaWZmZXJlbmNlCisgKi8KKyNkZWZpbmUgTk9STUFMX0xJTUlUKHZwbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB2cCAjIyB2cG4gIyMgX25vcm1hbF9saW1pdCh1aW50OF90ICpwLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRSwgaW50IEkpICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMT0FEX1BJWEVMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdnAgIyMgdnBuICMjIF9zaW1wbGVfbGltaXQocCwgc3RyaWRlLCBFKSAmJiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgRkZBQlMocDMgLSBwMikgPD0gSSAmJiBGRkFCUyhwMiAtIHAxKSA8PSBJICYmICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgRkZBQlMocDEgLSBwMCkgPD0gSSAmJiBGRkFCUyhxMyAtIHEyKSA8PSBJICYmICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgRkZBQlMocTIgLSBxMSkgPD0gSSAmJiBGRkFCUyhxMSAtIHEwKSA8PSBJOyAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworTk9STUFMX0xJTUlUKDcpCitOT1JNQUxfTElNSVQoOCkKKworLy8gaGlnaCBlZGdlIHZhcmlhbmNlCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaGV2KHVpbnQ4X3QgKnAsIHB0cmRpZmZfdCBzdHJpZGUsIGludCB0aHJlc2gpCit7CisgICAgTE9BRF9QSVhFTFMKKyAgICByZXR1cm4gRkZBQlMocDEgLSBwMCkgPiB0aHJlc2ggfHwgRkZBQlMocTEgLSBxMCkgPiB0aHJlc2g7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmlsdGVyX21iZWRnZSh1aW50OF90ICpwLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludCBhMCwgYTEsIGEyLCB3OworICAgIGNvbnN0IHVpbnQ4X3QgKmNtID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisKKyAgICBMT0FEX1BJWEVMUworCisgICAgdyA9IGNsaXBfaW50OChwMSAtIHExKTsKKyAgICB3ID0gY2xpcF9pbnQ4KHcgKyAzICogKHEwIC0gcDApKTsKKworICAgIGEwID0gKDI3ICogdyArIDYzKSA+PiA3OworICAgIGExID0gKDE4ICogdyArIDYzKSA+PiA3OworICAgIGEyID0gICg5ICogdyArIDYzKSA+PiA3OworCisgICAgcFstMyAqIHN0cmlkZV0gPSBjbVtwMiArIGEyXTsKKyAgICBwWy0yICogc3RyaWRlXSA9IGNtW3AxICsgYTFdOworICAgIHBbLTEgKiBzdHJpZGVdID0gY21bcDAgKyBhMF07CisgICAgcFsgMCAqIHN0cmlkZV0gPSBjbVtxMCAtIGEwXTsKKyAgICBwWyAxICogc3RyaWRlXSA9IGNtW3ExIC0gYTFdOworICAgIHBbIDIgKiBzdHJpZGVdID0gY21bcTIgLSBhMl07Cit9CisKKyNkZWZpbmUgTE9PUF9GSUxURVIodnBuLCBkaXIsIHNpemUsIHN0cmlkZWEsIHN0cmlkZWIsIG1heWJlX2lubGluZSkgICAgICAgICAgIFwKK3N0YXRpYyBtYXliZV9pbmxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgdnBuICMjIF8gIyMgZGlyICMjIF9sb29wX2ZpbHRlciAjIyBzaXplICMjIF9jKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGltX0UsIGludCBmbGltX0ksICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZXZfdGhyZXNoKSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHZwbiAjIyBfbm9ybWFsX2xpbWl0KGRzdCArIGkgKiBzdHJpZGVhLCBzdHJpZGViLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaW1fRSwgZmxpbV9JKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChoZXYoZHN0ICsgaSAqIHN0cmlkZWEsIHN0cmlkZWIsIGhldl90aHJlc2gpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB2cG4gIyMgX2ZpbHRlcl9jb21tb24oZHN0ICsgaSAqIHN0cmlkZWEsIHN0cmlkZWIsIDEpOyAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmaWx0ZXJfbWJlZGdlKGRzdCArIGkgKiBzdHJpZGVhLCBzdHJpZGViKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBtYXliZV9pbmxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgdnBuICMjIF8gIyMgZGlyICMjIF9sb29wX2ZpbHRlciAjIyBzaXplICMjIF9pbm5lcl9jKHVpbnQ4X3QgKmRzdCwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGltX0UsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGltX0ksICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZXZfdGhyZXNoKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHZwbiAjIyBfbm9ybWFsX2xpbWl0KGRzdCArIGkgKiBzdHJpZGVhLCBzdHJpZGViLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaW1fRSwgZmxpbV9JKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBodiA9IGhldihkc3QgKyBpICogc3RyaWRlYSwgc3RyaWRlYiwgaGV2X3RocmVzaCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChodikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB2cG4gIyMgX2ZpbHRlcl9jb21tb24oZHN0ICsgaSAqIHN0cmlkZWEsIHN0cmlkZWIsIDEpOyAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB2cG4gIyMgX2ZpbHRlcl9jb21tb24oZHN0ICsgaSAqIHN0cmlkZWEsIHN0cmlkZWIsIDApOyAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBVVl9MT09QX0ZJTFRFUih2cG4sIGRpciwgc3RyaWRlYSwgc3RyaWRlYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorTE9PUF9GSUxURVIodnBuLCBkaXIsIDgsIHN0cmlkZWEsIHN0cmlkZWIsIGF2X2Fsd2F5c19pbmxpbmUpICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgdnBuICMjIF8gIyMgZGlyICMjIF9sb29wX2ZpbHRlcjh1dl9jKHVpbnQ4X3QgKmRzdFUsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFYsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBmRSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmSSwgaW50IGhldl90aHJlc2gpICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZwbiAjIyBfICMjIGRpciAjIyBfbG9vcF9maWx0ZXI4X2MoZHN0VSwgc3RyaWRlLCBmRSwgZkksIGhldl90aHJlc2gpOyAgICAgXAorICAgIHZwbiAjIyBfICMjIGRpciAjIyBfbG9vcF9maWx0ZXI4X2MoZHN0Viwgc3RyaWRlLCBmRSwgZkksIGhldl90aHJlc2gpOyAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgdnBuICMjIF8gIyMgZGlyICMjIF9sb29wX2ZpbHRlcjh1dl9pbm5lcl9jKHVpbnQ4X3QgKmRzdFUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFYsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmRSwgaW50IGZJLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZXZfdGhyZXNoKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZwbiAjIyBfICMjIGRpciAjIyBfbG9vcF9maWx0ZXI4X2lubmVyX2MoZHN0VSwgc3RyaWRlLCBmRSwgZkksICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV2X3RocmVzaCk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZwbiAjIyBfICMjIGRpciAjIyBfbG9vcF9maWx0ZXI4X2lubmVyX2MoZHN0Viwgc3RyaWRlLCBmRSwgZkksICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV2X3RocmVzaCk7ICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIExPT1BfRklMVEVSX1NJTVBMRSh2cG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCB2cG4gIyMgX3ZfbG9vcF9maWx0ZXJfc2ltcGxlX2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsaW0pICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh2cG4gIyMgX3NpbXBsZV9saW1pdChkc3QgKyBpLCBzdHJpZGUsIGZsaW0pKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2cG4gIyMgX2ZpbHRlcl9jb21tb24oZHN0ICsgaSwgc3RyaWRlLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCB2cG4gIyMgX2hfbG9vcF9maWx0ZXJfc2ltcGxlX2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsaW0pICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh2cG4gIyMgX3NpbXBsZV9saW1pdChkc3QgKyBpICogc3RyaWRlLCAxLCBmbGltKSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2cG4gIyMgX2ZpbHRlcl9jb21tb24oZHN0ICsgaSAqIHN0cmlkZSwgMSwgMSk7ICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgTE9PUF9GSUxURVJTKHZwbikgICAgICAgICAgICAgICAgXAorICAgIExPT1BfRklMVEVSKHZwbiwgdiwgMTYsIDEsIHN0cmlkZSwgKSBcCisgICAgTE9PUF9GSUxURVIodnBuLCBoLCAxNiwgc3RyaWRlLCAxLCApIFwKKyAgICBVVl9MT09QX0ZJTFRFUih2cG4sIHYsIDEsIHN0cmlkZSkgICAgXAorICAgIFVWX0xPT1BfRklMVEVSKHZwbiwgaCwgc3RyaWRlLCAxKSAgICBcCisgICAgTE9PUF9GSUxURVJfU0lNUExFKHZwbikgICAgICAgICAgICAgIFwKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3VicGVsX2ZpbHRlcnNbN11bNl0gPSB7CisgICAgeyAwLCAgNiwgMTIzLCAgMTIsICAxLCAwIH0sCisgICAgeyAyLCAxMSwgMTA4LCAgMzYsICA4LCAxIH0sCisgICAgeyAwLCAgOSwgIDkzLCAgNTAsICA2LCAwIH0sCisgICAgeyAzLCAxNiwgIDc3LCAgNzcsIDE2LCAzIH0sCisgICAgeyAwLCAgNiwgIDUwLCAgOTMsICA5LCAwIH0sCisgICAgeyAxLCAgOCwgIDM2LCAxMDgsIDExLCAyIH0sCisgICAgeyAwLCAgMSwgIDEyLCAxMjMsICA2LCAwIH0sCit9OworCisjZGVmaW5lIFBVVF9QSVhFTFMoV0lEVEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBwdXRfdnA4X3BpeGVscyAjIyBXSURUSCAjIyBfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKywgZHN0ICs9IGRzdHN0cmlkZSwgc3JjICs9IHNyY3N0cmlkZSkgICAgICAgICAgICAgICBcCisgICAgICAgIG1lbWNweShkc3QsIHNyYywgV0lEVEgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1BVVF9QSVhFTFMoMTYpCitQVVRfUElYRUxTKDgpCitQVVRfUElYRUxTKDQpCisKKyNkZWZpbmUgRklMVEVSXzZUQVAoc3JjLCBGLCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbVsoRlsyXSAqIHNyY1t4ICsgMCAqIHN0cmlkZV0gLSBGWzFdICogc3JjW3ggLSAxICogc3RyaWRlXSArICAgICAgICAgICAgIFwKKyAgICAgICAgRlswXSAqIHNyY1t4IC0gMiAqIHN0cmlkZV0gKyBGWzNdICogc3JjW3ggKyAxICogc3RyaWRlXSAtICAgICAgICAgICAgIFwKKyAgICAgICAgRls0XSAqIHNyY1t4ICsgMiAqIHN0cmlkZV0gKyBGWzVdICogc3JjW3ggKyAzICogc3RyaWRlXSArIDY0KSA+PiA3XQorCisjZGVmaW5lIEZJTFRFUl80VEFQKHNyYywgRiwgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY21bKEZbMl0gKiBzcmNbeCArIDAgKiBzdHJpZGVdIC0gRlsxXSAqIHNyY1t4IC0gMSAqIHN0cmlkZV0gKyAgICAgICAgICAgICBcCisgICAgICAgIEZbM10gKiBzcmNbeCArIDEgKiBzdHJpZGVdIC0gRls0XSAqIHNyY1t4ICsgMiAqIHN0cmlkZV0gKyA2NCkgPj4gN10KKworI2RlZmluZSBWUDhfRVBFTF9IKFNJWkUsIFRBUFMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgcHV0X3ZwOF9lcGVsICMjIFNJWkUgIyMgX2ggIyMgVEFQUyAjIyBfYyh1aW50OF90ICpkc3QsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0c3RyaWRlLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4X3QgKmZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW214IC0gMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4X3QgKmNtICAgICA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB4LCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHggPSAwOyB4IDwgU0laRTsgeCsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W3hdID0gRklMVEVSXyAjIyBUQVBTICMjIFRBUChzcmMsIGZpbHRlciwgMSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFZQOF9FUEVMX1YoU0laRSwgVEFQUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBwdXRfdnA4X2VwZWwgIyMgU0laRSAjIyBfdiAjIyBUQVBTICMjIF9jKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkc3RzdHJpZGUsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSkgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCAqZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCAqY20gICAgID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHgsIHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBTSVpFOyB4KyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbeF0gPSBGSUxURVJfICMjIFRBUFMgIyMgVEFQKHNyYywgZmlsdGVyLCBzcmNzdHJpZGUpOyAgICAgICAgICBcCisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgVlA4X0VQRUxfSFYoU0laRSwgSFRBUFMsIFZUQVBTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3B1dF92cDhfZXBlbCAjIyBTSVpFICMjIF9oICMjIEhUQVBTICMjIHYgIyMgVlRBUFMgIyMgX2ModWludDhfdCAqZHN0LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRzdHN0cmlkZSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG15KSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OF90ICpmaWx0ZXIgPSBzdWJwZWxfZmlsdGVyc1tteCAtIDFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OF90ICpjbSAgICAgPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeCwgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90IHRtcF9hcnJheVsoMiAqIFNJWkUgKyBWVEFQUyAtIDEpICogU0laRV07ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmMgLT0gKDIgLSAoVlRBUFMgPT0gNCkpICogc3Jjc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSAwOyB5IDwgaCArIFZUQVBTIC0gMTsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IFNJWkU7IHgrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRtcFt4XSA9IEZJTFRFUl8gIyMgSFRBUFMgIyMgVEFQKHNyYywgZmlsdGVyLCAxKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdG1wICs9IFNJWkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAgICAgPSB0bXBfYXJyYXkgKyAoMiAtIChWVEFQUyA9PSA0KSkgKiBTSVpFOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaWx0ZXIgPSBzdWJwZWxfZmlsdGVyc1tteSAtIDFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IFNJWkU7IHgrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl8gIyMgVlRBUFMgIyMgVEFQKHRtcCwgZmlsdGVyLCBTSVpFKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0ICs9IGRzdHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdG1wICs9IFNJWkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVlA4X0VQRUxfSCgxNiwgNCkKK1ZQOF9FUEVMX0goOCwgIDQpCitWUDhfRVBFTF9IKDQsICA0KQorVlA4X0VQRUxfSCgxNiwgNikKK1ZQOF9FUEVMX0goOCwgIDYpCitWUDhfRVBFTF9IKDQsICA2KQorVlA4X0VQRUxfVigxNiwgNCkKK1ZQOF9FUEVMX1YoOCwgIDQpCitWUDhfRVBFTF9WKDQsICA0KQorVlA4X0VQRUxfVigxNiwgNikKK1ZQOF9FUEVMX1YoOCwgIDYpCitWUDhfRVBFTF9WKDQsICA2KQorCitWUDhfRVBFTF9IVigxNiwgNCwgNCkKK1ZQOF9FUEVMX0hWKDgsICA0LCA0KQorVlA4X0VQRUxfSFYoNCwgIDQsIDQpCitWUDhfRVBFTF9IVigxNiwgNCwgNikKK1ZQOF9FUEVMX0hWKDgsICA0LCA2KQorVlA4X0VQRUxfSFYoNCwgIDQsIDYpCitWUDhfRVBFTF9IVigxNiwgNiwgNCkKK1ZQOF9FUEVMX0hWKDgsICA2LCA0KQorVlA4X0VQRUxfSFYoNCwgIDYsIDQpCitWUDhfRVBFTF9IVigxNiwgNiwgNikKK1ZQOF9FUEVMX0hWKDgsICA2LCA2KQorVlA4X0VQRUxfSFYoNCwgIDYsIDYpCisKKyNkZWZpbmUgVlA4X0JJTElORUFSKFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHB1dF92cDhfYmlsaW5lYXIgIyMgU0laRSAjIyBfaF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNzdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYSA9IDggLSBteCwgYiA9IG14OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeCwgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IFNJWkU7IHgrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4XSA9IChhICogc3JjW3hdICsgYiAqIHNyY1t4ICsgMV0gKyA0KSA+PiAzOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0ICs9IGRzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjICs9IHNzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHB1dF92cDhfYmlsaW5lYXIgIyMgU0laRSAjIyBfdl9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNzdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYyA9IDggLSBteSwgZCA9IG15OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeCwgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IFNJWkU7IHgrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4XSA9IChjICogc3JjW3hdICsgZCAqIHNyY1t4ICsgc3N0cmlkZV0gKyA0KSA+PiAzOyAgICAgICAgICAgIFwKKyAgICAgICAgZHN0ICs9IGRzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjICs9IHNzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHB1dF92cDhfYmlsaW5lYXIgIyMgU0laRSAjIyBfaHZfYyh1aW50OF90ICpkc3QsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0cmlkZSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3N0cmlkZSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYSA9IDggLSBteCwgYiA9IG14OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYyA9IDggLSBteSwgZCA9IG15OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeCwgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90IHRtcF9hcnJheVsoMiAqIFNJWkUgKyAxKSAqIFNJWkVdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSAwOyB5IDwgaCArIDE7IHkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IFNJWkU7IHgrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRtcFt4XSA9IChhICogc3JjW3hdICsgYiAqIHNyY1t4ICsgMV0gKyA0KSA+PiAzOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdG1wICs9IFNJWkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjICs9IHNzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAgPSB0bXBfYXJyYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IFNJWkU7IHgrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4XSA9IChjICogdG1wW3hdICsgZCAqIHRtcFt4ICsgU0laRV0gKyA0KSA+PiAzOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0ICs9IGRzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdG1wICs9IFNJWkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVlA4X0JJTElORUFSKDE2KQorVlA4X0JJTElORUFSKDgpCitWUDhfQklMSU5FQVIoNCkKKworI2RlZmluZSBWUDc4X01DX0ZVTkMoSURYLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbSURYXVswXVswXSA9IHB1dF92cDhfcGl4ZWxzICMjIFNJWkUgIyMgX2M7ICAgXAorICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbSURYXVswXVsxXSA9IHB1dF92cDhfZXBlbCAjIyBTSVpFICMjIF9oNF9jOyAgXAorICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbSURYXVswXVsyXSA9IHB1dF92cDhfZXBlbCAjIyBTSVpFICMjIF9oNl9jOyAgXAorICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbSURYXVsxXVswXSA9IHB1dF92cDhfZXBlbCAjIyBTSVpFICMjIF92NF9jOyAgXAorICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbSURYXVsxXVsxXSA9IHB1dF92cDhfZXBlbCAjIyBTSVpFICMjIF9oNHY0X2M7IFwKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiW0lEWF1bMV1bMl0gPSBwdXRfdnA4X2VwZWwgIyMgU0laRSAjIyBfaDZ2NF9jOyBcCisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYltJRFhdWzJdWzBdID0gcHV0X3ZwOF9lcGVsICMjIFNJWkUgIyMgX3Y2X2M7ICBcCisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYltJRFhdWzJdWzFdID0gcHV0X3ZwOF9lcGVsICMjIFNJWkUgIyMgX2g0djZfYzsgXAorICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbSURYXVsyXVsyXSA9IHB1dF92cDhfZXBlbCAjIyBTSVpFICMjIF9oNnY2X2MKKworI2RlZmluZSBWUDc4X0JJTElORUFSX01DX0ZVTkMoSURYLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiW0lEWF1bMF1bMF0gPSBwdXRfdnA4X3BpeGVscyAgICMjIFNJWkUgIyMgX2M7IFwKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYltJRFhdWzBdWzFdID0gcHV0X3ZwOF9iaWxpbmVhciAjIyBTSVpFICMjIF9oX2M7IFwKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYltJRFhdWzBdWzJdID0gcHV0X3ZwOF9iaWxpbmVhciAjIyBTSVpFICMjIF9oX2M7IFwKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYltJRFhdWzFdWzBdID0gcHV0X3ZwOF9iaWxpbmVhciAjIyBTSVpFICMjIF92X2M7IFwKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYltJRFhdWzFdWzFdID0gcHV0X3ZwOF9iaWxpbmVhciAjIyBTSVpFICMjIF9odl9jOyBcCisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbSURYXVsxXVsyXSA9IHB1dF92cDhfYmlsaW5lYXIgIyMgU0laRSAjIyBfaHZfYzsgXAorICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiW0lEWF1bMl1bMF0gPSBwdXRfdnA4X2JpbGluZWFyICMjIFNJWkUgIyMgX3ZfYzsgXAorICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiW0lEWF1bMl1bMV0gPSBwdXRfdnA4X2JpbGluZWFyICMjIFNJWkUgIyMgX2h2X2M7IFwKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYltJRFhdWzJdWzJdID0gcHV0X3ZwOF9iaWxpbmVhciAjIyBTSVpFICMjIF9odl9jCisKK2F2X2NvbGQgdm9pZCBmZl92cDc4ZHNwX2luaXQoVlA4RFNQQ29udGV4dCAqZHNwKQoreworICAgIFZQNzhfTUNfRlVOQygwLCAxNik7CisgICAgVlA3OF9NQ19GVU5DKDEsIDgpOworICAgIFZQNzhfTUNfRlVOQygyLCA0KTsKKworICAgIFZQNzhfQklMSU5FQVJfTUNfRlVOQygwLCAxNik7CisgICAgVlA3OF9CSUxJTkVBUl9NQ19GVU5DKDEsIDgpOworICAgIFZQNzhfQklMSU5FQVJfTUNfRlVOQygyLCA0KTsKKworICAgIGlmIChBUkNIX0FSTSkKKyAgICAgICAgZmZfdnA3OGRzcF9pbml0X2FybShkc3ApOworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfdnA3OGRzcF9pbml0X3BwYyhkc3ApOworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfdnA3OGRzcF9pbml0X3g4Nihkc3ApOworfQorCisjaWYgQ09ORklHX1ZQN19ERUNPREVSCitMT09QX0ZJTFRFUlModnA3KQorCithdl9jb2xkIHZvaWQgZmZfdnA3ZHNwX2luaXQoVlA4RFNQQ29udGV4dCAqZHNwKQoreworICAgIGRzcC0+dnA4X2x1bWFfZGNfd2h0ICAgID0gdnA3X2x1bWFfZGNfd2h0X2M7CisgICAgZHNwLT52cDhfbHVtYV9kY193aHRfZGMgPSB2cDdfbHVtYV9kY193aHRfZGNfYzsKKyAgICBkc3AtPnZwOF9pZGN0X2FkZCAgICAgICA9IHZwN19pZGN0X2FkZF9jOworICAgIGRzcC0+dnA4X2lkY3RfZGNfYWRkICAgID0gdnA3X2lkY3RfZGNfYWRkX2M7CisgICAgZHNwLT52cDhfaWRjdF9kY19hZGQ0eSAgPSB2cDdfaWRjdF9kY19hZGQ0eV9jOworICAgIGRzcC0+dnA4X2lkY3RfZGNfYWRkNHV2ID0gdnA3X2lkY3RfZGNfYWRkNHV2X2M7CisKKyAgICBkc3AtPnZwOF92X2xvb3BfZmlsdGVyMTZ5ID0gdnA3X3ZfbG9vcF9maWx0ZXIxNl9jOworICAgIGRzcC0+dnA4X2hfbG9vcF9maWx0ZXIxNnkgPSB2cDdfaF9sb29wX2ZpbHRlcjE2X2M7CisgICAgZHNwLT52cDhfdl9sb29wX2ZpbHRlcjh1diA9IHZwN192X2xvb3BfZmlsdGVyOHV2X2M7CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcjh1diA9IHZwN19oX2xvb3BfZmlsdGVyOHV2X2M7CisKKyAgICBkc3AtPnZwOF92X2xvb3BfZmlsdGVyMTZ5X2lubmVyID0gdnA3X3ZfbG9vcF9maWx0ZXIxNl9pbm5lcl9jOworICAgIGRzcC0+dnA4X2hfbG9vcF9maWx0ZXIxNnlfaW5uZXIgPSB2cDdfaF9sb29wX2ZpbHRlcjE2X2lubmVyX2M7CisgICAgZHNwLT52cDhfdl9sb29wX2ZpbHRlcjh1dl9pbm5lciA9IHZwN192X2xvb3BfZmlsdGVyOHV2X2lubmVyX2M7CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcjh1dl9pbm5lciA9IHZwN19oX2xvb3BfZmlsdGVyOHV2X2lubmVyX2M7CisKKyAgICBkc3AtPnZwOF92X2xvb3BfZmlsdGVyX3NpbXBsZSA9IHZwN192X2xvb3BfZmlsdGVyX3NpbXBsZV9jOworICAgIGRzcC0+dnA4X2hfbG9vcF9maWx0ZXJfc2ltcGxlID0gdnA3X2hfbG9vcF9maWx0ZXJfc2ltcGxlX2M7Cit9CisjZW5kaWYgLyogQ09ORklHX1ZQN19ERUNPREVSICovCisKKyNpZiBDT05GSUdfVlA4X0RFQ09ERVIKK0xPT1BfRklMVEVSUyh2cDgpCisKK2F2X2NvbGQgdm9pZCBmZl92cDhkc3BfaW5pdChWUDhEU1BDb250ZXh0ICpkc3ApCit7CisgICAgZHNwLT52cDhfbHVtYV9kY193aHQgICAgPSB2cDhfbHVtYV9kY193aHRfYzsKKyAgICBkc3AtPnZwOF9sdW1hX2RjX3dodF9kYyA9IHZwOF9sdW1hX2RjX3dodF9kY19jOworICAgIGRzcC0+dnA4X2lkY3RfYWRkICAgICAgID0gdnA4X2lkY3RfYWRkX2M7CisgICAgZHNwLT52cDhfaWRjdF9kY19hZGQgICAgPSB2cDhfaWRjdF9kY19hZGRfYzsKKyAgICBkc3AtPnZwOF9pZGN0X2RjX2FkZDR5ICA9IHZwOF9pZGN0X2RjX2FkZDR5X2M7CisgICAgZHNwLT52cDhfaWRjdF9kY19hZGQ0dXYgPSB2cDhfaWRjdF9kY19hZGQ0dXZfYzsKKworICAgIGRzcC0+dnA4X3ZfbG9vcF9maWx0ZXIxNnkgPSB2cDhfdl9sb29wX2ZpbHRlcjE2X2M7CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcjE2eSA9IHZwOF9oX2xvb3BfZmlsdGVyMTZfYzsKKyAgICBkc3AtPnZwOF92X2xvb3BfZmlsdGVyOHV2ID0gdnA4X3ZfbG9vcF9maWx0ZXI4dXZfYzsKKyAgICBkc3AtPnZwOF9oX2xvb3BfZmlsdGVyOHV2ID0gdnA4X2hfbG9vcF9maWx0ZXI4dXZfYzsKKworICAgIGRzcC0+dnA4X3ZfbG9vcF9maWx0ZXIxNnlfaW5uZXIgPSB2cDhfdl9sb29wX2ZpbHRlcjE2X2lubmVyX2M7CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcjE2eV9pbm5lciA9IHZwOF9oX2xvb3BfZmlsdGVyMTZfaW5uZXJfYzsKKyAgICBkc3AtPnZwOF92X2xvb3BfZmlsdGVyOHV2X2lubmVyID0gdnA4X3ZfbG9vcF9maWx0ZXI4dXZfaW5uZXJfYzsKKyAgICBkc3AtPnZwOF9oX2xvb3BfZmlsdGVyOHV2X2lubmVyID0gdnA4X2hfbG9vcF9maWx0ZXI4dXZfaW5uZXJfYzsKKworICAgIGRzcC0+dnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlID0gdnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlX2M7CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGUgPSB2cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGVfYzsKKworICAgIGlmIChBUkNIX0FSTSkKKyAgICAgICAgZmZfdnA4ZHNwX2luaXRfYXJtKGRzcCk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl92cDhkc3BfaW5pdF94ODYoZHNwKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfVlA4X0RFQ09ERVIgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOGRzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA4ZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkZDNhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOGRzcC5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIERhdmlkIENvbnJhZAorICogQ29weXJpZ2h0IChDKSAyMDEwIFJvbmFsZCBTLiBCdWx0amUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVlA4IGNvbXBhdGlibGUgdmlkZW8gZGVjb2RlcgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WUDhEU1BfSAorI2RlZmluZSBBVkNPREVDX1ZQOERTUF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiB2b2lkICgqdnA4X21jX2Z1bmMpKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiA4ICovLCBwdHJkaWZmX3QgZHN0U3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLCBwdHJkaWZmX3Qgc3JjU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgeCwgaW50IHkpOworCit0eXBlZGVmIHN0cnVjdCBWUDhEU1BDb250ZXh0IHsKKyAgICB2b2lkICgqdnA4X2x1bWFfZGNfd2h0KShpbnQxNl90IGJsb2NrWzRdWzRdWzE2XSwgaW50MTZfdCBkY1sxNl0pOworICAgIHZvaWQgKCp2cDhfbHVtYV9kY193aHRfZGMpKGludDE2X3QgYmxvY2tbNF1bNF1bMTZdLCBpbnQxNl90IGRjWzE2XSk7CisgICAgdm9pZCAoKnZwOF9pZGN0X2FkZCkodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzE2XSwgcHRyZGlmZl90IHN0cmlkZSk7CisgICAgdm9pZCAoKnZwOF9pZGN0X2RjX2FkZCkodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzE2XSwgcHRyZGlmZl90IHN0cmlkZSk7CisgICAgdm9pZCAoKnZwOF9pZGN0X2RjX2FkZDR5KSh1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbNF1bMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7CisgICAgdm9pZCAoKnZwOF9pZGN0X2RjX2FkZDR1dikodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzRdWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKKworICAgIC8vIGxvb3AgZmlsdGVyIGFwcGxpZWQgdG8gZWRnZXMgYmV0d2VlbiBtYWNyb2Jsb2NrcworICAgIHZvaWQgKCp2cDhfdl9sb29wX2ZpbHRlcjE2eSkodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsaW1fRSwgaW50IGZsaW1fSSwgaW50IGhldl90aHJlc2gpOworICAgIHZvaWQgKCp2cDhfaF9sb29wX2ZpbHRlcjE2eSkodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsaW1fRSwgaW50IGZsaW1fSSwgaW50IGhldl90aHJlc2gpOworICAgIHZvaWQgKCp2cDhfdl9sb29wX2ZpbHRlcjh1dikodWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKTsKKyAgICB2b2lkICgqdnA4X2hfbG9vcF9maWx0ZXI4dXYpKHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxpbV9FLCBpbnQgZmxpbV9JLCBpbnQgaGV2X3RocmVzaCk7CisKKyAgICAvLyBsb29wIGZpbHRlciBhcHBsaWVkIHRvIGlubmVyIG1hY3JvYmxvY2sgZWRnZXMKKyAgICB2b2lkICgqdnA4X3ZfbG9vcF9maWx0ZXIxNnlfaW5uZXIpKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKTsKKyAgICB2b2lkICgqdnA4X2hfbG9vcF9maWx0ZXIxNnlfaW5uZXIpKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKTsKKyAgICB2b2lkICgqdnA4X3ZfbG9vcF9maWx0ZXI4dXZfaW5uZXIpKHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsaW1fRSwgaW50IGZsaW1fSSwgaW50IGhldl90aHJlc2gpOworICAgIHZvaWQgKCp2cDhfaF9sb29wX2ZpbHRlcjh1dl9pbm5lcikodWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxpbV9FLCBpbnQgZmxpbV9JLCBpbnQgaGV2X3RocmVzaCk7CisKKyAgICB2b2lkICgqdnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBmbGltKTsKKyAgICB2b2lkICgqdnA4X2hfbG9vcF9maWx0ZXJfc2ltcGxlKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBmbGltKTsKKworICAgIC8qKgorICAgICAqIGZpcnN0IGRpbWVuc2lvbjogd2lkdGg+PjMsIGhlaWdodCBpcyBhc3N1bWVkIGVxdWFsIHRvIHdpZHRoCisgICAgICogc2Vjb25kIGRpbWVuc2lvbjogMCBpZiBubyB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGlzIG5lZWRlZDsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAxIDQtdGFwIHZlcnRpY2FsIGludGVycG9sYXRpb24gZmlsdGVyIChteSAmIDEpCisgICAgICogICAgICAgICAgICAgICAgICAgMiA2LXRhcCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGZpbHRlciAoIShteSAmIDEpKQorICAgICAqIHRoaXJkIGRpbWVuc2lvbjogc2FtZSBhcyBzZWNvbmQgZGltZW5zaW9uLCBmb3IgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uCisgICAgICogc28gc29tZXRoaW5nIGxpa2UgcHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbd2lkdGg+PjNdWzIqISFteS0obXkmMSldWzIqISFteC0obXgmMSldKC4uLiwgbXgsIG15KQorICAgICAqLworICAgIHZwOF9tY19mdW5jIHB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzNdWzNdWzNdOworICAgIHZwOF9tY19mdW5jIHB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlszXVszXVszXTsKK30gVlA4RFNQQ29udGV4dDsKKwordm9pZCBmZl9wdXRfdnA4X3BpeGVsczE2X2ModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfcHV0X3ZwOF9waXhlbHM4X2ModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9wdXRfdnA4X3BpeGVsczRfYyh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7CisKK3ZvaWQgZmZfdnA3ZHNwX2luaXQoVlA4RFNQQ29udGV4dCAqYyk7CisKK3ZvaWQgZmZfdnA3OGRzcF9pbml0KFZQOERTUENvbnRleHQgKmMpOwordm9pZCBmZl92cDc4ZHNwX2luaXRfYXJtKFZQOERTUENvbnRleHQgKmMpOwordm9pZCBmZl92cDc4ZHNwX2luaXRfcHBjKFZQOERTUENvbnRleHQgKmMpOwordm9pZCBmZl92cDc4ZHNwX2luaXRfeDg2KFZQOERTUENvbnRleHQgKmMpOworCit2b2lkIGZmX3ZwOGRzcF9pbml0KFZQOERTUENvbnRleHQgKmMpOwordm9pZCBmZl92cDhkc3BfaW5pdF9hcm0oVlA4RFNQQ29udGV4dCAqYyk7Cit2b2lkIGZmX3ZwOGRzcF9pbml0X3g4NihWUDhEU1BDb250ZXh0ICpjKTsKKworI2RlZmluZSBJU19WUDcgMQorI2RlZmluZSBJU19WUDggMAorCisjZW5kaWYgLyogQVZDT0RFQ19WUDhEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnA5LmMgYi9mZm1wZWcvbGliYXZjb2RlYy92cDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RmOWVmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA5LmMKQEAgLTAsMCArMSw0MDg3IEBACisvKgorICogVlA5IGNvbXBhdGlibGUgdmlkZW8gZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZSBnbWFpbCBjb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2zDqW1lbnQgQsWTc2NoIDx1IHBraCBtZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAidmlkZW9kc3AuaCIKKyNpbmNsdWRlICJ2cDU2LmgiCisjaW5jbHVkZSAidnA5LmgiCisjaW5jbHVkZSAidnA5ZGF0YS5oIgorI2luY2x1ZGUgInZwOWRzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorCisjZGVmaW5lIFZQOV9TWU5DQ09ERSAweDQ5ODM0MgorCitlbnVtIENvbXBQcmVkTW9kZSB7CisgICAgUFJFRF9TSU5HTEVSRUYsCisgICAgUFJFRF9DT01QUkVGLAorICAgIFBSRURfU1dJVENIQUJMRSwKK307CisKK2VudW0gQmxvY2tMZXZlbCB7CisgICAgQkxfNjRYNjQsCisgICAgQkxfMzJYMzIsCisgICAgQkxfMTZYMTYsCisgICAgQkxfOFg4LAorfTsKKworZW51bSBCbG9ja1NpemUgeworICAgIEJTXzY0eDY0LAorICAgIEJTXzY0eDMyLAorICAgIEJTXzMyeDY0LAorICAgIEJTXzMyeDMyLAorICAgIEJTXzMyeDE2LAorICAgIEJTXzE2eDMyLAorICAgIEJTXzE2eDE2LAorICAgIEJTXzE2eDgsCisgICAgQlNfOHgxNiwKKyAgICBCU184eDgsCisgICAgQlNfOHg0LAorICAgIEJTXzR4OCwKKyAgICBCU180eDQsCisgICAgTl9CU19TSVpFUywKK307CisKK3N0cnVjdCBWUDltdnJlZlBhaXIgeworICAgIFZQNTZtdiBtdlsyXTsKKyAgICBpbnQ4X3QgcmVmWzJdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgVlA5RnJhbWUgeworICAgIFRocmVhZEZyYW1lIHRmOworICAgIEFWQnVmZmVyUmVmICpleHRyYWRhdGE7CisgICAgdWludDhfdCAqc2VnbWVudGF0aW9uX21hcDsKKyAgICBzdHJ1Y3QgVlA5bXZyZWZQYWlyICptdjsKK30gVlA5RnJhbWU7CisKK3N0cnVjdCBWUDlGaWx0ZXIgeworICAgIHVpbnQ4X3QgbGV2ZWxbOCAqIDhdOworICAgIHVpbnQ4X3QgLyogYml0PWNvbCAqLyBtYXNrWzIgLyogMD15LCAxPXV2ICovXVsyIC8qIDA9Y29sLCAxPXJvdyAqL10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs4IC8qIHJvd3MgKi9dWzQgLyogMD0xNiwgMT04LCAyPTQsIDM9aW5uZXI0ICovXTsKK307CisKK3R5cGVkZWYgc3RydWN0IFZQOUJsb2NrIHsKKyAgICB1aW50OF90IHNlZ19pZCwgaW50cmEsIGNvbXAsIHJlZlsyXSwgbW9kZVs0XSwgdXZtb2RlLCBza2lwOworICAgIGVudW0gRmlsdGVyTW9kZSBmaWx0ZXI7CisgICAgVlA1Nm12IG12WzQgLyogYl9pZHggKi9dWzIgLyogcmVmICovXTsKKyAgICBlbnVtIEJsb2NrU2l6ZSBiczsKKyAgICBlbnVtIFR4Zm1Nb2RlIHR4LCB1dnR4OworICAgIGVudW0gQmxvY2tMZXZlbCBibDsKKyAgICBlbnVtIEJsb2NrUGFydGl0aW9uIGJwOworfSBWUDlCbG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgVlA5Q29udGV4dCB7CisgICAgVlA5RFNQQ29udGV4dCBkc3A7CisgICAgVmlkZW9EU1BDb250ZXh0IHZkc3A7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBWUDU2UmFuZ2VDb2RlciBjOworICAgIFZQNTZSYW5nZUNvZGVyICpjX2I7CisgICAgdW5zaWduZWQgY19iX3NpemU7CisgICAgVlA5QmxvY2sgKmJfYmFzZSwgKmI7CisgICAgaW50IHBhc3MsIHVzZXNfMnBhc3MsIGxhc3RfdXNlc18ycGFzczsKKyAgICBpbnQgcm93LCByb3c3LCBjb2wsIGNvbDc7CisgICAgdWludDhfdCAqZHN0WzNdOworICAgIHB0cmRpZmZfdCB5X3N0cmlkZSwgdXZfc3RyaWRlOworCisgICAgLy8gYml0c3RyZWFtIGhlYWRlcgorICAgIHVpbnQ4X3QgcHJvZmlsZTsKKyAgICB1aW50OF90IGtleWZyYW1lLCBsYXN0X2tleWZyYW1lOworICAgIHVpbnQ4X3QgaW52aXNpYmxlOworICAgIHVpbnQ4X3QgdXNlX2xhc3RfZnJhbWVfbXZzOworICAgIHVpbnQ4X3QgZXJyb3JyZXM7CisgICAgdWludDhfdCBjb2xvcnNwYWNlOworICAgIHVpbnQ4X3QgZnVsbHJhbmdlOworICAgIHVpbnQ4X3QgaW50cmFvbmx5OworICAgIHVpbnQ4X3QgcmVzZXRjdHg7CisgICAgdWludDhfdCByZWZyZXNocmVmbWFzazsKKyAgICB1aW50OF90IGhpZ2hwcmVjaXNpb25tdnM7CisgICAgZW51bSBGaWx0ZXJNb2RlIGZpbHRlcm1vZGU7CisgICAgdWludDhfdCBhbGxvd2NvbXBpbnRlcjsKKyAgICB1aW50OF90IGZpeGNvbXByZWY7CisgICAgdWludDhfdCByZWZyZXNoY3R4OworICAgIHVpbnQ4X3QgcGFyYWxsZWxtb2RlOworICAgIHVpbnQ4X3QgZnJhbWVjdHhpZDsKKyAgICB1aW50OF90IHJlZmlkeFszXTsKKyAgICB1aW50OF90IHNpZ25iaWFzWzNdOworICAgIHVpbnQ4X3QgdmFyY29tcHJlZlsyXTsKKyAgICBUaHJlYWRGcmFtZSByZWZzWzhdLCBuZXh0X3JlZnNbOF07CisjZGVmaW5lIENVUl9GUkFNRSAwCisjZGVmaW5lIExBU1RfRlJBTUUgMQorICAgIFZQOUZyYW1lIGZyYW1lc1syXTsKKworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3QgbGV2ZWw7CisgICAgICAgIGludDhfdCBzaGFycG5lc3M7CisgICAgICAgIHVpbnQ4X3QgbGltX2x1dFs2NF07CisgICAgICAgIHVpbnQ4X3QgbWJsaW1fbHV0WzY0XTsKKyAgICB9IGZpbHRlcjsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50OF90IGVuYWJsZWQ7CisgICAgICAgIGludDhfdCBtb2RlWzJdOworICAgICAgICBpbnQ4X3QgcmVmWzRdOworICAgIH0gbGZfZGVsdGE7CisgICAgdWludDhfdCB5YWNfcWk7CisgICAgaW50OF90IHlkY19xZGVsdGEsIHV2ZGNfcWRlbHRhLCB1dmFjX3FkZWx0YTsKKyAgICB1aW50OF90IGxvc3NsZXNzOworI2RlZmluZSBNQVhfU0VHTUVOVCA4CisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDhfdCBlbmFibGVkOworICAgICAgICB1aW50OF90IHRlbXBvcmFsOworICAgICAgICB1aW50OF90IGFic29sdXRlX3ZhbHM7CisgICAgICAgIHVpbnQ4X3QgdXBkYXRlX21hcDsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcV9lbmFibGVkOworICAgICAgICAgICAgdWludDhfdCBsZl9lbmFibGVkOworICAgICAgICAgICAgdWludDhfdCByZWZfZW5hYmxlZDsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc2tpcF9lbmFibGVkOworICAgICAgICAgICAgdWludDhfdCByZWZfdmFsOworICAgICAgICAgICAgaW50MTZfdCBxX3ZhbDsKKyAgICAgICAgICAgIGludDhfdCBsZl92YWw7CisgICAgICAgICAgICBpbnQxNl90IHFtdWxbMl1bMl07CisgICAgICAgICAgICB1aW50OF90IGxmbHZsWzRdWzJdOworICAgICAgICB9IGZlYXRbTUFYX1NFR01FTlRdOworICAgIH0gc2VnbWVudGF0aW9uOworICAgIHN0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIGxvZzJfdGlsZV9jb2xzLCBsb2cyX3RpbGVfcm93czsKKyAgICAgICAgdW5zaWduZWQgdGlsZV9jb2xzLCB0aWxlX3Jvd3M7CisgICAgICAgIHVuc2lnbmVkIHRpbGVfcm93X3N0YXJ0LCB0aWxlX3Jvd19lbmQsIHRpbGVfY29sX3N0YXJ0LCB0aWxlX2NvbF9lbmQ7CisgICAgfSB0aWxpbmc7CisgICAgdW5zaWduZWQgc2JfY29scywgc2Jfcm93cywgcm93cywgY29sczsKKyAgICBzdHJ1Y3QgeworICAgICAgICBwcm9iX2NvbnRleHQgcDsKKyAgICAgICAgdWludDhfdCBjb2VmWzRdWzJdWzJdWzZdWzZdWzNdOworICAgIH0gcHJvYl9jdHhbNF07CisgICAgc3RydWN0IHsKKyAgICAgICAgcHJvYl9jb250ZXh0IHA7CisgICAgICAgIHVpbnQ4X3QgY29lZls0XVsyXVsyXVs2XVs2XVsxMV07CisgICAgICAgIHVpbnQ4X3Qgc2VnWzddOworICAgICAgICB1aW50OF90IHNlZ3ByZWRbM107CisgICAgfSBwcm9iOworICAgIHN0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIHlfbW9kZVs0XVsxMF07CisgICAgICAgIHVuc2lnbmVkIHV2X21vZGVbMTBdWzEwXTsKKyAgICAgICAgdW5zaWduZWQgZmlsdGVyWzRdWzNdOworICAgICAgICB1bnNpZ25lZCBtdl9tb2RlWzddWzRdOworICAgICAgICB1bnNpZ25lZCBpbnRyYVs0XVsyXTsKKyAgICAgICAgdW5zaWduZWQgY29tcFs1XVsyXTsKKyAgICAgICAgdW5zaWduZWQgc2luZ2xlX3JlZls1XVsyXVsyXTsKKyAgICAgICAgdW5zaWduZWQgY29tcF9yZWZbNV1bMl07CisgICAgICAgIHVuc2lnbmVkIHR4MzJwWzJdWzRdOworICAgICAgICB1bnNpZ25lZCB0eDE2cFsyXVszXTsKKyAgICAgICAgdW5zaWduZWQgdHg4cFsyXVsyXTsKKyAgICAgICAgdW5zaWduZWQgc2tpcFszXVsyXTsKKyAgICAgICAgdW5zaWduZWQgbXZfam9pbnRbNF07CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1bnNpZ25lZCBzaWduWzJdOworICAgICAgICAgICAgdW5zaWduZWQgY2xhc3Nlc1sxMV07CisgICAgICAgICAgICB1bnNpZ25lZCBjbGFzczBbMl07CisgICAgICAgICAgICB1bnNpZ25lZCBiaXRzWzEwXVsyXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNsYXNzMF9mcFsyXVs0XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGZwWzRdOworICAgICAgICAgICAgdW5zaWduZWQgY2xhc3MwX2hwWzJdOworICAgICAgICAgICAgdW5zaWduZWQgaHBbMl07CisgICAgICAgIH0gbXZfY29tcFsyXTsKKyAgICAgICAgdW5zaWduZWQgcGFydGl0aW9uWzRdWzRdWzRdOworICAgICAgICB1bnNpZ25lZCBjb2VmWzRdWzJdWzJdWzZdWzZdWzNdOworICAgICAgICB1bnNpZ25lZCBlb2JbNF1bMl1bMl1bNl1bNl1bMl07CisgICAgfSBjb3VudHM7CisgICAgZW51bSBUeGZtTW9kZSB0eGZtbW9kZTsKKyAgICBlbnVtIENvbXBQcmVkTW9kZSBjb21wcHJlZG1vZGU7CisKKyAgICAvLyBjb250ZXh0dWFsIChsZWZ0L2Fib3ZlKSBjYWNoZQorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgbGVmdF95X25uel9jdHgpWzE2XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHVpbnQ4X3QsIGxlZnRfbW9kZV9jdHgpWzE2XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIFZQNTZtdiwgbGVmdF9tdl9jdHgpWzE2XVsyXTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF91dl9ubnpfY3R4KVsyXVs4XTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9wYXJ0aXRpb25fY3R4KVs4XTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9za2lwX2N0eClbOF07CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIGxlZnRfdHhmbV9jdHgpWzhdOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCBsZWZ0X3NlZ3ByZWRfY3R4KVs4XTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9pbnRyYV9jdHgpWzhdOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCBsZWZ0X2NvbXBfY3R4KVs4XTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9yZWZfY3R4KVs4XTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9maWx0ZXJfY3R4KVs4XTsKKyAgICB1aW50OF90ICphYm92ZV9wYXJ0aXRpb25fY3R4OworICAgIHVpbnQ4X3QgKmFib3ZlX21vZGVfY3R4OworICAgIC8vIEZJWE1FIG1heWJlIG1lcmdlIHNvbWUgb2YgdGhlIGJlbG93IGluIGEgZmxhZ3MgZmllbGQ/CisgICAgdWludDhfdCAqYWJvdmVfeV9ubnpfY3R4OworICAgIHVpbnQ4X3QgKmFib3ZlX3V2X25uel9jdHhbMl07CisgICAgdWludDhfdCAqYWJvdmVfc2tpcF9jdHg7IC8vIDFiaXQKKyAgICB1aW50OF90ICphYm92ZV90eGZtX2N0eDsgLy8gMmJpdAorICAgIHVpbnQ4X3QgKmFib3ZlX3NlZ3ByZWRfY3R4OyAvLyAxYml0CisgICAgdWludDhfdCAqYWJvdmVfaW50cmFfY3R4OyAvLyAxYml0CisgICAgdWludDhfdCAqYWJvdmVfY29tcF9jdHg7IC8vIDFiaXQKKyAgICB1aW50OF90ICphYm92ZV9yZWZfY3R4OyAvLyAyYml0CisgICAgdWludDhfdCAqYWJvdmVfZmlsdGVyX2N0eDsKKyAgICBWUDU2bXYgKCphYm92ZV9tdl9jdHgpWzJdOworCisgICAgLy8gd2hvbGUtZnJhbWUgY2FjaGUKKyAgICB1aW50OF90ICppbnRyYV9wcmVkX2RhdGFbM107CisgICAgc3RydWN0IFZQOUZpbHRlciAqbGZsdmw7CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCB1aW50OF90LCBlZGdlX2VtdV9idWZmZXIpWzcxKjgwXTsKKworICAgIC8vIGJsb2NrIHJlY29uc3RydWN0aW9uIGludGVybWVkaWF0ZXMKKyAgICBpbnQgYmxvY2tfYWxsb2NfdXNpbmdfMnBhc3M7CisgICAgaW50MTZfdCAqYmxvY2tfYmFzZSwgKmJsb2NrLCAqdXZibG9ja19iYXNlWzJdLCAqdXZibG9ja1syXTsKKyAgICB1aW50OF90ICplb2JfYmFzZSwgKnV2ZW9iX2Jhc2VbMl0sICplb2IsICp1dmVvYlsyXTsKKyAgICBzdHJ1Y3QgeyBpbnQgeCwgeTsgfSBtaW5fbXYsIG1heF9tdjsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIHVpbnQ4X3QsIHRtcF95KVs2NCo2NF07CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCB1aW50OF90LCB0bXBfdXYpWzJdWzMyKjMyXTsKK30gVlA5Q29udGV4dDsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYndoX3RhYlsyXVtOX0JTX1NJWkVTXVsyXSA9IHsKKyAgICB7CisgICAgICAgIHsgMTYsIDE2IH0sIHsgMTYsIDggfSwgeyA4LCAxNiB9LCB7IDgsIDggfSwgeyA4LCA0IH0sIHsgNCwgOCB9LAorICAgICAgICB7IDQsIDQgfSwgeyA0LCAyIH0sIHsgMiwgNCB9LCB7IDIsIDIgfSwgeyAyLCAxIH0sIHsgMSwgMiB9LCB7IDEsIDEgfSwKKyAgICB9LCB7CisgICAgICAgIHsgOCwgOCB9LCB7IDgsIDQgfSwgeyA0LCA4IH0sIHsgNCwgNCB9LCB7IDQsIDIgfSwgeyAyLCA0IH0sCisgICAgICAgIHsgMiwgMiB9LCB7IDIsIDEgfSwgeyAxLCAyIH0sIHsgMSwgMSB9LCB7IDEsIDEgfSwgeyAxLCAxIH0sIHsgMSwgMSB9LAorICAgIH0KK307CisKK3N0YXRpYyBpbnQgdnA5X2FsbG9jX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICpjdHgsIFZQOUZyYW1lICpmKQoreworICAgIFZQOUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBzejsKKworICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoY3R4LCAmZi0+dGYsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgc3ogPSA2NCAqIHMtPnNiX2NvbHMgKiBzLT5zYl9yb3dzOworICAgIGlmICghKGYtPmV4dHJhZGF0YSA9IGF2X2J1ZmZlcl9hbGxvY3ooc3ogKiAoMSArIHNpemVvZihzdHJ1Y3QgVlA5bXZyZWZQYWlyKSkpKSkgeworICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoY3R4LCAmZi0+dGYpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGYtPnNlZ21lbnRhdGlvbl9tYXAgPSBmLT5leHRyYWRhdGEtPmRhdGE7CisgICAgZi0+bXYgPSAoc3RydWN0IFZQOW12cmVmUGFpciAqKSAoZi0+ZXh0cmFkYXRhLT5kYXRhICsgc3opOworCisgICAgLy8gcmV0YWluIHNlZ21lbnRhdGlvbiBtYXAgaWYgaXQgZG9lc24ndCB1cGRhdGUKKyAgICBpZiAocy0+c2VnbWVudGF0aW9uLmVuYWJsZWQgJiYgIXMtPnNlZ21lbnRhdGlvbi51cGRhdGVfbWFwICYmCisgICAgICAgICFzLT5pbnRyYW9ubHkgJiYgIXMtPmtleWZyYW1lICYmICFzLT5lcnJvcnJlcykgeworICAgICAgICBtZW1jcHkoZi0+c2VnbWVudGF0aW9uX21hcCwgcy0+ZnJhbWVzW0xBU1RfRlJBTUVdLnNlZ21lbnRhdGlvbl9tYXAsIHN6KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdnA5X3VucmVmX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICpjdHgsIFZQOUZyYW1lICpmKQoreworICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihjdHgsICZmLT50Zik7CisgICAgYXZfYnVmZmVyX3VucmVmKCZmLT5leHRyYWRhdGEpOworfQorCitzdGF0aWMgaW50IHZwOV9yZWZfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmN0eCwgVlA5RnJhbWUgKmRzdCwgVlA5RnJhbWUgKnNyYykKK3sKKyAgICBpbnQgcmVzOworCisgICAgaWYgKChyZXMgPSBmZl90aHJlYWRfcmVmX2ZyYW1lKCZkc3QtPnRmLCAmc3JjLT50ZikpIDwgMCkgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0gZWxzZSBpZiAoIShkc3QtPmV4dHJhZGF0YSA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5leHRyYWRhdGEpKSkgeworICAgICAgICB2cDlfdW5yZWZfZnJhbWUoY3R4LCBkc3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGRzdC0+c2VnbWVudGF0aW9uX21hcCA9IHNyYy0+c2VnbWVudGF0aW9uX21hcDsKKyAgICBkc3QtPm12ID0gc3JjLT5tdjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9zaXplKEFWQ29kZWNDb250ZXh0ICpjdHgsIGludCB3LCBpbnQgaCkKK3sKKyAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqcDsKKworICAgIGF2X2Fzc2VydDAodyA+IDAgJiYgaCA+IDApOworCisgICAgaWYgKHMtPmludHJhX3ByZWRfZGF0YVswXSAmJiB3ID09IGN0eC0+d2lkdGggJiYgaCA9PSBjdHgtPmhlaWdodCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjdHgtPndpZHRoICA9IHc7CisgICAgY3R4LT5oZWlnaHQgPSBoOworICAgIHMtPnNiX2NvbHMgID0gKHcgKyA2MykgPj4gNjsKKyAgICBzLT5zYl9yb3dzICA9IChoICsgNjMpID4+IDY7CisgICAgcy0+Y29scyAgICAgPSAodyArIDcpID4+IDM7CisgICAgcy0+cm93cyAgICAgPSAoaCArIDcpID4+IDM7CisKKyNkZWZpbmUgYXNzaWduKHZhciwgdHlwZSwgbikgdmFyID0gKHR5cGUpIHA7IHAgKz0gcy0+c2JfY29scyAqIChuKSAqIHNpemVvZigqdmFyKQorICAgIGF2X2ZyZWVwKCZzLT5pbnRyYV9wcmVkX2RhdGFbMF0pOworICAgIHAgPSBhdl9tYWxsb2Mocy0+c2JfY29scyAqICgyNDAgKyBzaXplb2YoKnMtPmxmbHZsKSArIDE2ICogc2l6ZW9mKCpzLT5hYm92ZV9tdl9jdHgpKSk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGFzc2lnbihzLT5pbnRyYV9wcmVkX2RhdGFbMF0sICB1aW50OF90ICosICAgICAgICAgICAgIDY0KTsKKyAgICBhc3NpZ24ocy0+aW50cmFfcHJlZF9kYXRhWzFdLCAgdWludDhfdCAqLCAgICAgICAgICAgICAzMik7CisgICAgYXNzaWduKHMtPmludHJhX3ByZWRfZGF0YVsyXSwgIHVpbnQ4X3QgKiwgICAgICAgICAgICAgMzIpOworICAgIGFzc2lnbihzLT5hYm92ZV95X25uel9jdHgsICAgICB1aW50OF90ICosICAgICAgICAgICAgIDE2KTsKKyAgICBhc3NpZ24ocy0+YWJvdmVfbW9kZV9jdHgsICAgICAgdWludDhfdCAqLCAgICAgICAgICAgICAxNik7CisgICAgYXNzaWduKHMtPmFib3ZlX212X2N0eCwgICAgICAgIFZQNTZtdigqKVsyXSwgICAgICAgICAgMTYpOworICAgIGFzc2lnbihzLT5hYm92ZV9wYXJ0aXRpb25fY3R4LCB1aW50OF90ICosICAgICAgICAgICAgICA4KTsKKyAgICBhc3NpZ24ocy0+YWJvdmVfc2tpcF9jdHgsICAgICAgdWludDhfdCAqLCAgICAgICAgICAgICAgOCk7CisgICAgYXNzaWduKHMtPmFib3ZlX3R4Zm1fY3R4LCAgICAgIHVpbnQ4X3QgKiwgICAgICAgICAgICAgIDgpOworICAgIGFzc2lnbihzLT5hYm92ZV91dl9ubnpfY3R4WzBdLCB1aW50OF90ICosICAgICAgICAgICAgICA4KTsKKyAgICBhc3NpZ24ocy0+YWJvdmVfdXZfbm56X2N0eFsxXSwgdWludDhfdCAqLCAgICAgICAgICAgICAgOCk7CisgICAgYXNzaWduKHMtPmFib3ZlX3NlZ3ByZWRfY3R4LCAgIHVpbnQ4X3QgKiwgICAgICAgICAgICAgIDgpOworICAgIGFzc2lnbihzLT5hYm92ZV9pbnRyYV9jdHgsICAgICB1aW50OF90ICosICAgICAgICAgICAgICA4KTsKKyAgICBhc3NpZ24ocy0+YWJvdmVfY29tcF9jdHgsICAgICAgdWludDhfdCAqLCAgICAgICAgICAgICAgOCk7CisgICAgYXNzaWduKHMtPmFib3ZlX3JlZl9jdHgsICAgICAgIHVpbnQ4X3QgKiwgICAgICAgICAgICAgIDgpOworICAgIGFzc2lnbihzLT5hYm92ZV9maWx0ZXJfY3R4LCAgICB1aW50OF90ICosICAgICAgICAgICAgICA4KTsKKyAgICBhc3NpZ24ocy0+bGZsdmwsICAgICAgICAgICAgICAgc3RydWN0IFZQOUZpbHRlciAqLCAgICAgMSk7CisjdW5kZWYgYXNzaWduCisKKyAgICAvLyB0aGVzZSB3aWxsIGJlIHJlLWFsbG9jYXRlZCBhIGxpdHRsZSBsYXRlcgorICAgIGF2X2ZyZWVwKCZzLT5iX2Jhc2UpOworICAgIGF2X2ZyZWVwKCZzLT5ibG9ja19iYXNlKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9ibG9ja19idWZmZXJzKEFWQ29kZWNDb250ZXh0ICpjdHgpCit7CisgICAgVlA5Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKHMtPmJfYmFzZSAmJiBzLT5ibG9ja19iYXNlICYmIHMtPmJsb2NrX2FsbG9jX3VzaW5nXzJwYXNzID09IHMtPnVzZXNfMnBhc3MpCisgICAgICAgIHJldHVybiAwOworCisgICAgYXZfZnJlZShzLT5iX2Jhc2UpOworICAgIGF2X2ZyZWUocy0+YmxvY2tfYmFzZSk7CisgICAgaWYgKHMtPnVzZXNfMnBhc3MpIHsKKyAgICAgICAgaW50IHNicyA9IHMtPnNiX2NvbHMgKiBzLT5zYl9yb3dzOworCisgICAgICAgIHMtPmJfYmFzZSA9IGF2X21hbGxvY19hcnJheShzLT5jb2xzICogcy0+cm93cywgc2l6ZW9mKFZQOUJsb2NrKSk7CisgICAgICAgIHMtPmJsb2NrX2Jhc2UgPSBhdl9tYWxsb2N6KCg2NCAqIDY0ICsgMTI4KSAqIHNicyAqIDMpOworICAgICAgICBpZiAoIXMtPmJfYmFzZSB8fCAhcy0+YmxvY2tfYmFzZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHMtPnV2YmxvY2tfYmFzZVswXSA9IHMtPmJsb2NrX2Jhc2UgKyBzYnMgKiA2NCAqIDY0OworICAgICAgICBzLT51dmJsb2NrX2Jhc2VbMV0gPSBzLT51dmJsb2NrX2Jhc2VbMF0gKyBzYnMgKiAzMiAqIDMyOworICAgICAgICBzLT5lb2JfYmFzZSA9ICh1aW50OF90ICopIChzLT51dmJsb2NrX2Jhc2VbMV0gKyBzYnMgKiAzMiAqIDMyKTsKKyAgICAgICAgcy0+dXZlb2JfYmFzZVswXSA9IHMtPmVvYl9iYXNlICsgMjU2ICogc2JzOworICAgICAgICBzLT51dmVvYl9iYXNlWzFdID0gcy0+dXZlb2JfYmFzZVswXSArIDY0ICogc2JzOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmJfYmFzZSA9IGF2X21hbGxvYyhzaXplb2YoVlA5QmxvY2spKTsKKyAgICAgICAgcy0+YmxvY2tfYmFzZSA9IGF2X21hbGxvY3ooKDY0ICogNjQgKyAxMjgpICogMyk7CisgICAgICAgIGlmICghcy0+Yl9iYXNlIHx8ICFzLT5ibG9ja19iYXNlKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcy0+dXZibG9ja19iYXNlWzBdID0gcy0+YmxvY2tfYmFzZSArIDY0ICogNjQ7CisgICAgICAgIHMtPnV2YmxvY2tfYmFzZVsxXSA9IHMtPnV2YmxvY2tfYmFzZVswXSArIDMyICogMzI7CisgICAgICAgIHMtPmVvYl9iYXNlID0gKHVpbnQ4X3QgKikgKHMtPnV2YmxvY2tfYmFzZVsxXSArIDMyICogMzIpOworICAgICAgICBzLT51dmVvYl9iYXNlWzBdID0gcy0+ZW9iX2Jhc2UgKyAyNTY7CisgICAgICAgIHMtPnV2ZW9iX2Jhc2VbMV0gPSBzLT51dmVvYl9iYXNlWzBdICsgNjQ7CisgICAgfQorICAgIHMtPmJsb2NrX2FsbG9jX3VzaW5nXzJwYXNzID0gcy0+dXNlc18ycGFzczsKKworICAgIHJldHVybiAwOworfQorCisvLyBmb3Igc29tZSByZWFzb24gdGhlIHNpZ24gYml0IGlzIGF0IHRoZSBlbmQsIG5vdCB0aGUgc3RhcnQsIG9mIGEgYml0IHNlcXVlbmNlCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X3NiaXRzX2ludihHZXRCaXRDb250ZXh0ICpnYiwgaW50IG4pCit7CisgICAgaW50IHYgPSBnZXRfYml0cyhnYiwgbik7CisgICAgcmV0dXJuIGdldF9iaXRzMShnYikgPyAtdiA6IHY7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBpbnZfcmVjZW50ZXJfbm9ubmVnKGludCB2LCBpbnQgbSkKK3sKKyAgICByZXR1cm4gdiA+IDIgKiBtID8gdiA6IHYgJiAxID8gbSAtICgodiArIDEpID4+IDEpIDogbSArICh2ID4+IDEpOworfQorCisvLyBkaWZmZXJlbnRpYWwgZm9yd2FyZCBwcm9iYWJpbGl0eSB1cGRhdGVzCitzdGF0aWMgaW50IHVwZGF0ZV9wcm9iKFZQNTZSYW5nZUNvZGVyICpjLCBpbnQgcCkKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IGludl9tYXBfdGFibGVbMjU0XSA9IHsKKyAgICAgICAgICA3LCAgMjAsICAzMywgIDQ2LCAgNTksICA3MiwgIDg1LCAgOTgsIDExMSwgMTI0LCAxMzcsIDE1MCwgMTYzLCAxNzYsCisgICAgICAgIDE4OSwgMjAyLCAyMTUsIDIyOCwgMjQxLCAyNTQsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgOCwgICA5LAorICAgICAgICAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMSwgIDIyLCAgMjMsICAyNCwKKyAgICAgICAgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLCAgMzIsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksCisgICAgICAgICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LAorICAgICAgICAgNTUsICA1NiwgIDU3LCAgNTgsICA2MCwgIDYxLCAgNjIsICA2MywgIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwKKyAgICAgICAgIDcwLCAgNzEsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwgIDgwLCAgODEsICA4MiwgIDgzLCAgODQsCisgICAgICAgICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwgIDk2LCAgOTcsICA5OSwgMTAwLAorICAgICAgICAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMiwgMTEzLCAxMTQsIDExNSwKKyAgICAgICAgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsCisgICAgICAgIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsIDE0NCwgMTQ1LAorICAgICAgICAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksIDE2MCwKKyAgICAgICAgMTYxLCAxNjIsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3MywgMTc0LCAxNzUsCisgICAgICAgIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE5MCwgMTkxLAorICAgICAgICAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMywgMjA0LCAyMDUsIDIwNiwKKyAgICAgICAgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsCisgICAgICAgIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LAorICAgICAgICAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwKKyAgICAgICAgMjUyLCAyNTMsCisgICAgfTsKKyAgICBpbnQgZDsKKworICAgIC8qIFRoaXMgY29kZSBpcyB0cnlpbmcgdG8gZG8gYSBkaWZmZXJlbnRpYWwgcHJvYmFiaWxpdHkgdXBkYXRlLiBGb3IgYQorICAgICAqIGN1cnJlbnQgcHJvYmFiaWxpdHkgQSBpbiB0aGUgcmFuZ2UgWzEsIDI1NV0sIHRoZSBkaWZmZXJlbmNlIHRvIGEgbmV3CisgICAgICogcHJvYmFiaWxpdHkgb2YgYW55IHZhbHVlIGNhbiBiZSBleHByZXNzZWQgZGlmZmVyZW50aWFsbHkgYXMgMS1BLDI1NS1BCisgICAgICogd2hlcmUgc29tZSBwYXJ0IG9mIHRoaXMgKGFic29sdXRlIHJhbmdlKSBleGlzdHMgYm90aCBpbiBwb3NpdGl2ZSBhcworICAgICAqIHdlbGwgYXMgdGhlIG5lZ2F0aXZlIHBhcnQsIHdoZXJlYXMgYW5vdGhlciBwYXJ0IG9ubHkgZXhpc3RzIGluIG9uZQorICAgICAqIGhhbGYuIFdlJ3JlIHRyeWluZyB0byBjb2RlIHRoaXMgc2hhcmVkIHBhcnQgZGlmZmVyZW50aWFsbHksIGkuZS4KKyAgICAgKiB0aW1lcyB0d28gd2hlcmUgdGhlIHZhbHVlIG9mIHRoZSBsb3dlc3QgYml0IHNwZWNpZmllcyB0aGUgc2lnbiwgYW5kCisgICAgICogdGhlIHNpbmdsZSBwYXJ0IGlzIHRoZW4gY29kZWQgb24gdG9wIG9mIHRoaXMuIFRoaXMgYWJzb2x1dGUgZGlmZmVyZW5jZQorICAgICAqIHRoZW4gYWdhaW4gaGFzIGEgdmFsdWUgb2YgWzAsMjU0XSwgYnV0IGEgYmlnZ2VyIHZhbHVlIGluIHRoaXMgcmFuZ2UKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCB3ZSdyZSBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWUgQSwgc28gd2UKKyAgICAgKiBjYW4gY29kZSB0aGlzIGFzIGEgVkxDIGNvZGUsIHNpbmNlIGhpZ2hlciB2YWx1ZXMgYXJlIGluY3JlYXNpbmdseQorICAgICAqIHVubGlrZWx5LiBUaGUgZmlyc3QgMjAgdmFsdWVzIGluIGludl9tYXBfdGFibGVbXSBhbGxvdyAnY2hlYXAsIHJvdWdoJworICAgICAqIHVwZGF0ZXMgdnMuIHRoZSAnZmluZSwgZXhhY3QnIHVwZGF0ZXMgZnVydGhlciBkb3duIHRoZSByYW5nZSwgd2hpY2gKKyAgICAgKiBhZGRzIG9uZSBleHRyYSBkaW1lbnNpb24gdG8gdGhpcyBkaWZmZXJlbnRpYWwgdXBkYXRlIG1vZGVsLiAqLworCisgICAgaWYgKCF2cDhfcmFjX2dldChjKSkgeworICAgICAgICBkID0gdnA4X3JhY19nZXRfdWludChjLCA0KSArIDA7CisgICAgfSBlbHNlIGlmICghdnA4X3JhY19nZXQoYykpIHsKKyAgICAgICAgZCA9IHZwOF9yYWNfZ2V0X3VpbnQoYywgNCkgKyAxNjsKKyAgICB9IGVsc2UgaWYgKCF2cDhfcmFjX2dldChjKSkgeworICAgICAgICBkID0gdnA4X3JhY19nZXRfdWludChjLCA1KSArIDMyOworICAgIH0gZWxzZSB7CisgICAgICAgIGQgPSB2cDhfcmFjX2dldF91aW50KGMsIDcpOworICAgICAgICBpZiAoZCA+PSA2NSkKKyAgICAgICAgICAgIGQgPSAoZCA8PCAxKSAtIDY1ICsgdnA4X3JhY19nZXQoYyk7CisgICAgICAgIGQgKz0gNjQ7CisgICAgfQorCisgICAgcmV0dXJuIHAgPD0gMTI4ID8gMSArIGludl9yZWNlbnRlcl9ub25uZWcoaW52X21hcF90YWJsZVtkXSwgcCAtIDEpIDoKKyAgICAgICAgICAgICAgICAgICAgMjU1IC0gaW52X3JlY2VudGVyX25vbm5lZyhpbnZfbWFwX3RhYmxlW2RdLCAyNTUgLSBwKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IHNpemUsIGludCAqcmVmKQoreworICAgIFZQOUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgYywgaSwgaiwgaywgbCwgbSwgbiwgdywgaCwgbWF4LCBzaXplMiwgcmVzLCBzaGFycDsKKyAgICBpbnQgbGFzdF9pbnZpc2libGU7CisgICAgY29uc3QgdWludDhfdCAqZGF0YTI7CisKKyAgICAvKiBnZW5lcmFsIGhlYWRlciAqLworICAgIGlmICgocmVzID0gaW5pdF9nZXRfYml0czgoJnMtPmdiLCBkYXRhLCBzaXplKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGJpdHN0cmVhbSByZWFkZXJcbiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAoZ2V0X2JpdHMoJnMtPmdiLCAyKSAhPSAweDIpIHsgLy8gZnJhbWUgbWFya2VyCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHMtPnByb2ZpbGUgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsgLy8gcmVzZXJ2ZWQgYml0CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlJlc2VydmVkIGJpdCBzaG91bGQgYmUgemVyb1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgKnJlZiA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzLT5sYXN0X3VzZXNfMnBhc3MgPSBzLT51c2VzXzJwYXNzOworICAgIHMtPmxhc3Rfa2V5ZnJhbWUgID0gcy0+a2V5ZnJhbWU7CisgICAgcy0+a2V5ZnJhbWUgICAgICAgPSAhZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgbGFzdF9pbnZpc2libGUgICAgPSBzLT5pbnZpc2libGU7CisgICAgcy0+aW52aXNpYmxlICAgICAgPSAhZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgcy0+ZXJyb3JyZXMgICAgICAgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICBzLT51c2VfbGFzdF9mcmFtZV9tdnMgPSAhcy0+ZXJyb3JyZXMgJiYgIWxhc3RfaW52aXNpYmxlOworICAgIGlmIChzLT5rZXlmcmFtZSkgeworICAgICAgICBpZiAoZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIDI0KSAhPSBWUDlfU1lOQ0NPREUpIHsgLy8gc3luY2NvZGUKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc3luYyBjb2RlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHMtPmNvbG9yc3BhY2UgPSBnZXRfYml0cygmcy0+Z2IsIDMpOworICAgICAgICBpZiAocy0+Y29sb3JzcGFjZSA9PSA3KSB7IC8vIFJHQiA9IHByb2ZpbGUgMQorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUkdCIG5vdCBzdXBwb3J0ZWQgaW4gcHJvZmlsZSAwXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHMtPmZ1bGxyYW5nZSAgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgLy8gZm9yIHByb2ZpbGUgMSwgaGVyZSBmb2xsb3dzIHRoZSBzdWJzYW1wbGluZyBiaXRzCisgICAgICAgIHMtPnJlZnJlc2hyZWZtYXNrID0gMHhmZjsKKyAgICAgICAgdyA9IGdldF9iaXRzKCZzLT5nYiwgMTYpICsgMTsKKyAgICAgICAgaCA9IGdldF9iaXRzKCZzLT5nYiwgMTYpICsgMTsKKyAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSAvLyBkaXNwbGF5IHNpemUKKyAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5pbnRyYW9ubHkgID0gcy0+aW52aXNpYmxlID8gZ2V0X2JpdHMxKCZzLT5nYikgOiAwOworICAgICAgICBzLT5yZXNldGN0eCAgID0gcy0+ZXJyb3JyZXMgPyAwIDogZ2V0X2JpdHMoJnMtPmdiLCAyKTsKKyAgICAgICAgaWYgKHMtPmludHJhb25seSkgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xvbmcoJnMtPmdiLCAyNCkgIT0gVlA5X1NZTkNDT0RFKSB7IC8vIHN5bmNjb2RlCisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzeW5jIGNvZGVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+cmVmcmVzaHJlZm1hc2sgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgdyA9IGdldF9iaXRzKCZzLT5nYiwgMTYpICsgMTsKKyAgICAgICAgICAgIGggPSBnZXRfYml0cygmcy0+Z2IsIDE2KSArIDE7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIC8vIGRpc3BsYXkgc2l6ZQorICAgICAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnJlZnJlc2hyZWZtYXNrID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIHMtPnJlZmlkeFswXSAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICAgICAgICAgIHMtPnNpZ25iaWFzWzBdICAgID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBzLT5yZWZpZHhbMV0gICAgICA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CisgICAgICAgICAgICBzLT5zaWduYmlhc1sxXSAgICA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgcy0+cmVmaWR4WzJdICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDMpOworICAgICAgICAgICAgcy0+c2lnbmJpYXNbMl0gICAgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgIGlmICghcy0+cmVmc1tzLT5yZWZpZHhbMF1dLmYtPmRhdGFbMF0gfHwKKyAgICAgICAgICAgICAgICAhcy0+cmVmc1tzLT5yZWZpZHhbMV1dLmYtPmRhdGFbMF0gfHwKKyAgICAgICAgICAgICAgICAhcy0+cmVmc1tzLT5yZWZpZHhbMl1dLmYtPmRhdGFbMF0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJOb3QgYWxsIHJlZmVyZW5jZXMgYXJlIGF2YWlsYWJsZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgICAgICAgICB3ID0gcy0+cmVmc1tzLT5yZWZpZHhbMF1dLmYtPndpZHRoOworICAgICAgICAgICAgICAgIGggPSBzLT5yZWZzW3MtPnJlZmlkeFswXV0uZi0+aGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgIHcgPSBzLT5yZWZzW3MtPnJlZmlkeFsxXV0uZi0+d2lkdGg7CisgICAgICAgICAgICAgICAgaCA9IHMtPnJlZnNbcy0+cmVmaWR4WzFdXS5mLT5oZWlnaHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgdyA9IHMtPnJlZnNbcy0+cmVmaWR4WzJdXS5mLT53aWR0aDsKKyAgICAgICAgICAgICAgICBoID0gcy0+cmVmc1tzLT5yZWZpZHhbMl1dLmYtPmhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdyA9IGdldF9iaXRzKCZzLT5nYiwgMTYpICsgMTsKKyAgICAgICAgICAgICAgICBoID0gZ2V0X2JpdHMoJnMtPmdiLCAxNikgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGluIHRoaXMgY29kZSwgIkNVUl9GUkFNRSIgaXMgYWN0dWFsbHkgYmVmb3JlIHdlCisgICAgICAgICAgICAvLyBoYXZlIGZvcm1hbGx5IGFsbG9jYXRlZCBhIGZyYW1lLCBhbmQgdGh1cyBhY3R1YWxseSByZXByZXNlbnRzCisgICAgICAgICAgICAvLyB0aGUgX2xhc3RfIGZyYW1lCisgICAgICAgICAgICBzLT51c2VfbGFzdF9mcmFtZV9tdnMgJj0gcy0+ZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+d2lkdGggPT0gdyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmhlaWdodCA9PSBoOworICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSAvLyBkaXNwbGF5IHNpemUKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzMik7CisgICAgICAgICAgICBzLT5oaWdocHJlY2lzaW9ubXZzID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBzLT5maWx0ZXJtb2RlID0gZ2V0X2JpdHMxKCZzLT5nYikgPyBGSUxURVJfU1dJVENIQUJMRSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgICAgICAgICAgcy0+YWxsb3djb21waW50ZXIgPSBzLT5zaWduYmlhc1swXSAhPSBzLT5zaWduYmlhc1sxXSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaWduYmlhc1swXSAhPSBzLT5zaWduYmlhc1syXTsKKyAgICAgICAgICAgIGlmIChzLT5hbGxvd2NvbXBpbnRlcikgeworICAgICAgICAgICAgICAgIGlmIChzLT5zaWduYmlhc1swXSA9PSBzLT5zaWduYmlhc1sxXSkgeworICAgICAgICAgICAgICAgICAgICBzLT5maXhjb21wcmVmICAgID0gMjsKKyAgICAgICAgICAgICAgICAgICAgcy0+dmFyY29tcHJlZlswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPnZhcmNvbXByZWZbMV0gPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c2lnbmJpYXNbMF0gPT0gcy0+c2lnbmJpYXNbMl0pIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+Zml4Y29tcHJlZiAgICA9IDE7CisgICAgICAgICAgICAgICAgICAgIHMtPnZhcmNvbXByZWZbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICBzLT52YXJjb21wcmVmWzFdID0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzLT5maXhjb21wcmVmICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+dmFyY29tcHJlZlswXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIHMtPnZhcmNvbXByZWZbMV0gPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5yZWZyZXNoY3R4ICAgPSBzLT5lcnJvcnJlcyA/IDAgOiBnZXRfYml0czEoJnMtPmdiKTsKKyAgICBzLT5wYXJhbGxlbG1vZGUgPSBzLT5lcnJvcnJlcyA/IDEgOiBnZXRfYml0czEoJnMtPmdiKTsKKyAgICBzLT5mcmFtZWN0eGlkICAgPSBjID0gZ2V0X2JpdHMoJnMtPmdiLCAyKTsKKworICAgIC8qIGxvb3BmaWx0ZXIgaGVhZGVyIGRhdGEgKi8KKyAgICBzLT5maWx0ZXIubGV2ZWwgPSBnZXRfYml0cygmcy0+Z2IsIDYpOworICAgIHNoYXJwID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICAvLyBpZiBzaGFycG5lc3MgY2hhbmdlZCwgcmVpbml0IGxpbS9tYmxpbSBMVVRzLiBpZiBpdCBkaWRuJ3QgY2hhbmdlLCBrZWVwCisgICAgLy8gdGhlIG9sZCBjYWNoZSB2YWx1ZXMgc2luY2UgdGhleSBhcmUgc3RpbGwgdmFsaWQKKyAgICBpZiAocy0+ZmlsdGVyLnNoYXJwbmVzcyAhPSBzaGFycCkKKyAgICAgICAgbWVtc2V0KHMtPmZpbHRlci5saW1fbHV0LCAwLCBzaXplb2Yocy0+ZmlsdGVyLmxpbV9sdXQpKTsKKyAgICBzLT5maWx0ZXIuc2hhcnBuZXNzID0gc2hhcnA7CisgICAgaWYgKChzLT5sZl9kZWx0YS5lbmFibGVkID0gZ2V0X2JpdHMxKCZzLT5nYikpKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgICAgICAgICAgICAgIHMtPmxmX2RlbHRhLnJlZltpXSA9IGdldF9zYml0c19pbnYoJnMtPmdiLCA2KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICAgICAgICAgICAgICBzLT5sZl9kZWx0YS5tb2RlW2ldID0gZ2V0X3NiaXRzX2ludigmcy0+Z2IsIDYpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KCZzLT5sZl9kZWx0YSwgMCwgc2l6ZW9mKHMtPmxmX2RlbHRhKSk7CisgICAgfQorCisgICAgLyogcXVhbnRpemF0aW9uIGhlYWRlciBkYXRhICovCisgICAgcy0+eWFjX3FpICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgIHMtPnlkY19xZGVsdGEgID0gZ2V0X2JpdHMxKCZzLT5nYikgPyBnZXRfc2JpdHNfaW52KCZzLT5nYiwgNCkgOiAwOworICAgIHMtPnV2ZGNfcWRlbHRhID0gZ2V0X2JpdHMxKCZzLT5nYikgPyBnZXRfc2JpdHNfaW52KCZzLT5nYiwgNCkgOiAwOworICAgIHMtPnV2YWNfcWRlbHRhID0gZ2V0X2JpdHMxKCZzLT5nYikgPyBnZXRfc2JpdHNfaW52KCZzLT5nYiwgNCkgOiAwOworICAgIHMtPmxvc3NsZXNzICAgID0gcy0+eWFjX3FpID09IDAgJiYgcy0+eWRjX3FkZWx0YSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICBzLT51dmRjX3FkZWx0YSA9PSAwICYmIHMtPnV2YWNfcWRlbHRhID09IDA7CisKKyAgICAvKiBzZWdtZW50YXRpb24gaGVhZGVyIGluZm8gKi8KKyAgICBpZiAoKHMtPnNlZ21lbnRhdGlvbi5lbmFibGVkID0gZ2V0X2JpdHMxKCZzLT5nYikpKSB7CisgICAgICAgIGlmICgocy0+c2VnbWVudGF0aW9uLnVwZGF0ZV9tYXAgPSBnZXRfYml0czEoJnMtPmdiKSkpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisgICAgICAgICAgICAgICAgcy0+cHJvYi5zZWdbaV0gPSBnZXRfYml0czEoJnMtPmdiKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0cygmcy0+Z2IsIDgpIDogMjU1OworICAgICAgICAgICAgaWYgKChzLT5zZWdtZW50YXRpb24udGVtcG9yYWwgPSBnZXRfYml0czEoJnMtPmdiKSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnNlZ3ByZWRbaV0gPSBnZXRfYml0czEoJnMtPmdiKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzKCZzLT5nYiwgOCkgOiAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCghcy0+c2VnbWVudGF0aW9uLnVwZGF0ZV9tYXAgfHwgcy0+c2VnbWVudGF0aW9uLnRlbXBvcmFsKSAmJgorICAgICAgICAgICAgKHcgIT0gcy0+ZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+d2lkdGggfHwKKyAgICAgICAgICAgICBoICE9IHMtPmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmhlaWdodCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiUmVmZXJlbmNlIHNlZ21hcCAodGVtcD0lZCx1cGRhdGU9JWQpIGVuYWJsZWQgb24gc2l6ZS1jaGFuZ2UhXG4iLAorICAgICAgICAgICAgICAgICAgIHMtPnNlZ21lbnRhdGlvbi50ZW1wb3JhbCwgcy0+c2VnbWVudGF0aW9uLnVwZGF0ZV9tYXApOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgICAgIHMtPnNlZ21lbnRhdGlvbi5hYnNvbHV0ZV92YWxzID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChzLT5zZWdtZW50YXRpb24uZmVhdFtpXS5xX2VuYWJsZWQgPSBnZXRfYml0czEoJnMtPmdiKSkpCisgICAgICAgICAgICAgICAgICAgIHMtPnNlZ21lbnRhdGlvbi5mZWF0W2ldLnFfdmFsID0gZ2V0X3NiaXRzX2ludigmcy0+Z2IsIDgpOworICAgICAgICAgICAgICAgIGlmICgocy0+c2VnbWVudGF0aW9uLmZlYXRbaV0ubGZfZW5hYmxlZCA9IGdldF9iaXRzMSgmcy0+Z2IpKSkKKyAgICAgICAgICAgICAgICAgICAgcy0+c2VnbWVudGF0aW9uLmZlYXRbaV0ubGZfdmFsID0gZ2V0X3NiaXRzX2ludigmcy0+Z2IsIDYpOworICAgICAgICAgICAgICAgIGlmICgocy0+c2VnbWVudGF0aW9uLmZlYXRbaV0ucmVmX2VuYWJsZWQgPSBnZXRfYml0czEoJnMtPmdiKSkpCisgICAgICAgICAgICAgICAgICAgIHMtPnNlZ21lbnRhdGlvbi5mZWF0W2ldLnJlZl92YWwgPSBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgICAgICAgICAgICAgIHMtPnNlZ21lbnRhdGlvbi5mZWF0W2ldLnNraXBfZW5hYmxlZCA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+c2VnbWVudGF0aW9uLmZlYXRbMF0ucV9lbmFibGVkICAgID0gMDsKKyAgICAgICAgcy0+c2VnbWVudGF0aW9uLmZlYXRbMF0ubGZfZW5hYmxlZCAgID0gMDsKKyAgICAgICAgcy0+c2VnbWVudGF0aW9uLmZlYXRbMF0uc2tpcF9lbmFibGVkID0gMDsKKyAgICAgICAgcy0+c2VnbWVudGF0aW9uLmZlYXRbMF0ucmVmX2VuYWJsZWQgID0gMDsKKyAgICB9CisKKyAgICAvLyBzZXQgcW11bFtdIGJhc2VkIG9uIFkvVVYsIEFDL0RDIGFuZCBzZWdtZW50YXRpb24gUSBpZHggZGVsdGFzCisgICAgZm9yIChpID0gMDsgaSA8IChzLT5zZWdtZW50YXRpb24uZW5hYmxlZCA/IDggOiAxKTsgaSsrKSB7CisgICAgICAgIGludCBxeWFjLCBxeWRjLCBxdXZhYywgcXV2ZGMsIGxmbHZsLCBzaDsKKworICAgICAgICBpZiAocy0+c2VnbWVudGF0aW9uLmZlYXRbaV0ucV9lbmFibGVkKSB7CisgICAgICAgICAgICBpZiAocy0+c2VnbWVudGF0aW9uLmFic29sdXRlX3ZhbHMpCisgICAgICAgICAgICAgICAgcXlhYyA9IHMtPnNlZ21lbnRhdGlvbi5mZWF0W2ldLnFfdmFsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHF5YWMgPSBzLT55YWNfcWkgKyBzLT5zZWdtZW50YXRpb24uZmVhdFtpXS5xX3ZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHF5YWMgID0gcy0+eWFjX3FpOworICAgICAgICB9CisgICAgICAgIHF5ZGMgID0gYXZfY2xpcF91aW50cDIocXlhYyArIHMtPnlkY19xZGVsdGEsIDgpOworICAgICAgICBxdXZkYyA9IGF2X2NsaXBfdWludHAyKHF5YWMgKyBzLT51dmRjX3FkZWx0YSwgOCk7CisgICAgICAgIHF1dmFjID0gYXZfY2xpcF91aW50cDIocXlhYyArIHMtPnV2YWNfcWRlbHRhLCA4KTsKKyAgICAgICAgcXlhYyAgPSBhdl9jbGlwX3VpbnRwMihxeWFjLCA4KTsKKworICAgICAgICBzLT5zZWdtZW50YXRpb24uZmVhdFtpXS5xbXVsWzBdWzBdID0gdnA5X2RjX3Fsb29rdXBbcXlkY107CisgICAgICAgIHMtPnNlZ21lbnRhdGlvbi5mZWF0W2ldLnFtdWxbMF1bMV0gPSB2cDlfYWNfcWxvb2t1cFtxeWFjXTsKKyAgICAgICAgcy0+c2VnbWVudGF0aW9uLmZlYXRbaV0ucW11bFsxXVswXSA9IHZwOV9kY19xbG9va3VwW3F1dmRjXTsKKyAgICAgICAgcy0+c2VnbWVudGF0aW9uLmZlYXRbaV0ucW11bFsxXVsxXSA9IHZwOV9hY19xbG9va3VwW3F1dmFjXTsKKworICAgICAgICBzaCA9IHMtPmZpbHRlci5sZXZlbCA+PSAzMjsKKyAgICAgICAgaWYgKHMtPnNlZ21lbnRhdGlvbi5mZWF0W2ldLmxmX2VuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmIChzLT5zZWdtZW50YXRpb24uYWJzb2x1dGVfdmFscykKKyAgICAgICAgICAgICAgICBsZmx2bCA9IHMtPnNlZ21lbnRhdGlvbi5mZWF0W2ldLmxmX3ZhbDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZmx2bCA9IHMtPmZpbHRlci5sZXZlbCArIHMtPnNlZ21lbnRhdGlvbi5mZWF0W2ldLmxmX3ZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxmbHZsICA9IHMtPmZpbHRlci5sZXZlbDsKKyAgICAgICAgfQorICAgICAgICBzLT5zZWdtZW50YXRpb24uZmVhdFtpXS5sZmx2bFswXVswXSA9CisgICAgICAgIHMtPnNlZ21lbnRhdGlvbi5mZWF0W2ldLmxmbHZsWzBdWzFdID0KKyAgICAgICAgICAgIGF2X2NsaXBfdWludHAyKGxmbHZsICsgKHMtPmxmX2RlbHRhLnJlZlswXSA8PCBzaCksIDYpOworICAgICAgICBmb3IgKGogPSAxOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICBzLT5zZWdtZW50YXRpb24uZmVhdFtpXS5sZmx2bFtqXVswXSA9CisgICAgICAgICAgICAgICAgYXZfY2xpcF91aW50cDIobGZsdmwgKyAoKHMtPmxmX2RlbHRhLnJlZltqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxmX2RlbHRhLm1vZGVbMF0pIDw8IHNoKSwgNik7CisgICAgICAgICAgICBzLT5zZWdtZW50YXRpb24uZmVhdFtpXS5sZmx2bFtqXVsxXSA9CisgICAgICAgICAgICAgICAgYXZfY2xpcF91aW50cDIobGZsdmwgKyAoKHMtPmxmX2RlbHRhLnJlZltqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxmX2RlbHRhLm1vZGVbMV0pIDw8IHNoKSwgNik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB0aWxpbmcgaW5mbyAqLworICAgIGlmICgocmVzID0gdXBkYXRlX3NpemUoY3R4LCB3LCBoKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIgZm9yICVkeCVkXG4iLCB3LCBoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgZm9yIChzLT50aWxpbmcubG9nMl90aWxlX2NvbHMgPSAwOworICAgICAgICAgKHMtPnNiX2NvbHMgPj4gcy0+dGlsaW5nLmxvZzJfdGlsZV9jb2xzKSA+IDY0OworICAgICAgICAgcy0+dGlsaW5nLmxvZzJfdGlsZV9jb2xzKyspIDsKKyAgICBmb3IgKG1heCA9IDA7IChzLT5zYl9jb2xzID4+IG1heCkgPj0gNDsgbWF4KyspIDsKKyAgICBtYXggPSBGRk1BWCgwLCBtYXggLSAxKTsKKyAgICB3aGlsZSAobWF4ID4gcy0+dGlsaW5nLmxvZzJfdGlsZV9jb2xzKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkKKyAgICAgICAgICAgIHMtPnRpbGluZy5sb2cyX3RpbGVfY29scysrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcy0+dGlsaW5nLmxvZzJfdGlsZV9yb3dzID0gZGVjb2RlMDEyKCZzLT5nYik7CisgICAgcy0+dGlsaW5nLnRpbGVfcm93cyA9IDEgPDwgcy0+dGlsaW5nLmxvZzJfdGlsZV9yb3dzOworICAgIGlmIChzLT50aWxpbmcudGlsZV9jb2xzICE9ICgxIDw8IHMtPnRpbGluZy5sb2cyX3RpbGVfY29scykpIHsKKyAgICAgICAgcy0+dGlsaW5nLnRpbGVfY29scyA9IDEgPDwgcy0+dGlsaW5nLmxvZzJfdGlsZV9jb2xzOworICAgICAgICBzLT5jX2IgPSBhdl9mYXN0X3JlYWxsb2Mocy0+Y19iLCAmcy0+Y19iX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVlA1NlJhbmdlQ29kZXIpICogcy0+dGlsaW5nLnRpbGVfY29scyk7CisgICAgICAgIGlmICghcy0+Y19iKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJSYW4gb3V0IG9mIG1lbW9yeSBkdXJpbmcgcmFuZ2UgY29kZXIgaW5pdFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPmtleWZyYW1lIHx8IHMtPmVycm9ycmVzIHx8IHMtPmludHJhb25seSkgeworICAgICAgICBzLT5wcm9iX2N0eFswXS5wID0gcy0+cHJvYl9jdHhbMV0ucCA9IHMtPnByb2JfY3R4WzJdLnAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYl9jdHhbM10ucCA9IHZwOV9kZWZhdWx0X3Byb2JzOworICAgICAgICBtZW1jcHkocy0+cHJvYl9jdHhbMF0uY29lZiwgdnA5X2RlZmF1bHRfY29lZl9wcm9icywKKyAgICAgICAgICAgICAgIHNpemVvZih2cDlfZGVmYXVsdF9jb2VmX3Byb2JzKSk7CisgICAgICAgIG1lbWNweShzLT5wcm9iX2N0eFsxXS5jb2VmLCB2cDlfZGVmYXVsdF9jb2VmX3Byb2JzLAorICAgICAgICAgICAgICAgc2l6ZW9mKHZwOV9kZWZhdWx0X2NvZWZfcHJvYnMpKTsKKyAgICAgICAgbWVtY3B5KHMtPnByb2JfY3R4WzJdLmNvZWYsIHZwOV9kZWZhdWx0X2NvZWZfcHJvYnMsCisgICAgICAgICAgICAgICBzaXplb2YodnA5X2RlZmF1bHRfY29lZl9wcm9icykpOworICAgICAgICBtZW1jcHkocy0+cHJvYl9jdHhbM10uY29lZiwgdnA5X2RlZmF1bHRfY29lZl9wcm9icywKKyAgICAgICAgICAgICAgIHNpemVvZih2cDlfZGVmYXVsdF9jb2VmX3Byb2JzKSk7CisgICAgfQorCisgICAgLy8gbmV4dCAxNiBiaXRzIGlzIHNpemUgb2YgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciAoYXJpdGgtY29kZWQpCisgICAgc2l6ZTIgPSBnZXRfYml0cygmcy0+Z2IsIDE2KTsKKyAgICBkYXRhMiA9IGFsaWduX2dldF9iaXRzKCZzLT5nYik7CisgICAgaWYgKHNpemUyID4gc2l6ZSAtIChkYXRhMiAtIGRhdGEpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY29tcHJlc3NlZCBoZWFkZXIgc2l6ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2Rlcigmcy0+YywgZGF0YTIsIHNpemUyKTsKKyAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMTI4KSkgeyAvLyBtYXJrZXIgYml0CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk1hcmtlciBiaXQgd2FzIHNldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzLT5rZXlmcmFtZSB8fCBzLT5pbnRyYW9ubHkpIHsKKyAgICAgICAgbWVtc2V0KHMtPmNvdW50cy5jb2VmLCAwLCBzaXplb2Yocy0+Y291bnRzLmNvZWYpICsgc2l6ZW9mKHMtPmNvdW50cy5lb2IpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1zZXQoJnMtPmNvdW50cywgMCwgc2l6ZW9mKHMtPmNvdW50cykpOworICAgIH0KKyAgICAvLyBGSVhNRSBpcyBpdCBmYXN0ZXIgdG8gbm90IGNvcHkgaGVyZSwgYnV0IGRvIGl0IGRvd24gaW4gdGhlIGZ3IHVwZGF0ZXMKKyAgICAvLyBhcyBleHBsaWNpdCBjb3BpZXMgaWYgdGhlIGZ3IHVwZGF0ZSBpcyBtaXNzaW5nIChhbmQgc2tpcCB0aGUgY29weSB1cG9uCisgICAgLy8gZncgdXBkYXRlKT8KKyAgICBzLT5wcm9iLnAgPSBzLT5wcm9iX2N0eFtjXS5wOworCisgICAgLy8gdHhmbSB1cGRhdGVzCisgICAgaWYgKHMtPmxvc3NsZXNzKSB7CisgICAgICAgIHMtPnR4Zm1tb2RlID0gVFhfNFg0OworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPnR4Zm1tb2RlID0gdnA4X3JhY19nZXRfdWludCgmcy0+YywgMik7CisgICAgICAgIGlmIChzLT50eGZtbW9kZSA9PSAzKQorICAgICAgICAgICAgcy0+dHhmbW1vZGUgKz0gdnA4X3JhY19nZXQoJnMtPmMpOworCisgICAgICAgIGlmIChzLT50eGZtbW9kZSA9PSBUWF9TV0lUQ0hBQkxFKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQorICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAudHg4cFtpXSA9IHVwZGF0ZV9wcm9iKCZzLT5jLCBzLT5wcm9iLnAudHg4cFtpXSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLnR4MTZwW2ldW2pdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfcHJvYigmcy0+Yywgcy0+cHJvYi5wLnR4MTZwW2ldW2pdKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoJnMtPmMsIDI1MikpCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAudHgzMnBbaV1bal0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9wcm9iKCZzLT5jLCBzLT5wcm9iLnAudHgzMnBbaV1bal0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY29lZiB1cGRhdGVzCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICB1aW50OF90ICgqcmVmKVsyXVs2XVs2XVszXSA9IHMtPnByb2JfY3R4W2NdLmNvZWZbaV07CisgICAgICAgIGlmICh2cDhfcmFjX2dldCgmcy0+YykpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IDY7IGwrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCA2OyBtKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwID0gcy0+cHJvYi5jb2VmW2ldW2pdW2tdW2xdW21dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnIgPSByZWZbal1ba11bbF1bbV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gPj0gMyAmJiBsID09IDApIC8vIGRjIG9ubHkgaGFzIDMgcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IDM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMjUyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFtuXSA9IHVwZGF0ZV9wcm9iKCZzLT5jLCByW25dKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbbl0gPSByW25dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbM10gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjsgaysrKQorICAgICAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgNjsgbCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IDY7IG0rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnAgPSBzLT5wcm9iLmNvZWZbaV1bal1ba11bbF1bbV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqciA9IHJlZltqXVtrXVtsXVttXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSA+IDMgJiYgbCA9PSAwKSAvLyBkYyBvbmx5IGhhcyAzIHB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwLCByLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWzNdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocy0+dHhmbW1vZGUgPT0gaSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIG1vZGUgdXBkYXRlcworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQorICAgICAgICAgICAgcy0+cHJvYi5wLnNraXBbaV0gPSB1cGRhdGVfcHJvYigmcy0+Yywgcy0+cHJvYi5wLnNraXBbaV0pOworICAgIGlmICghcy0+a2V5ZnJhbWUgJiYgIXMtPmludHJhb25seSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKKyAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMjUyKSkKKyAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X21vZGVbaV1bal0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3Byb2IoJnMtPmMsIHMtPnByb2IucC5tdl9tb2RlW2ldW2pdKTsKKworICAgICAgICBpZiAocy0+ZmlsdGVybW9kZSA9PSBGSUxURVJfU1dJVENIQUJMRSkKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoJnMtPmMsIDI1MikpCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAuZmlsdGVyW2ldW2pdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfcHJvYigmcy0+Yywgcy0+cHJvYi5wLmZpbHRlcltpXVtqXSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQorICAgICAgICAgICAgICAgIHMtPnByb2IucC5pbnRyYVtpXSA9IHVwZGF0ZV9wcm9iKCZzLT5jLCBzLT5wcm9iLnAuaW50cmFbaV0pOworCisgICAgICAgIGlmIChzLT5hbGxvd2NvbXBpbnRlcikgeworICAgICAgICAgICAgcy0+Y29tcHByZWRtb2RlID0gdnA4X3JhY19nZXQoJnMtPmMpOworICAgICAgICAgICAgaWYgKHMtPmNvbXBwcmVkbW9kZSkKKyAgICAgICAgICAgICAgICBzLT5jb21wcHJlZG1vZGUgKz0gdnA4X3JhY19nZXQoJnMtPmMpOworICAgICAgICAgICAgaWYgKHMtPmNvbXBwcmVkbW9kZSA9PSBQUkVEX1NXSVRDSEFCTEUpCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoJnMtPmMsIDI1MikpCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAuY29tcFtpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3Byb2IoJnMtPmMsIHMtPnByb2IucC5jb21wW2ldKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPmNvbXBwcmVkbW9kZSA9IFBSRURfU0lOR0xFUkVGOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPmNvbXBwcmVkbW9kZSAhPSBQUkVEX0NPTVBSRUYpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMjUyKSkKKyAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLnNpbmdsZV9yZWZbaV1bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3Byb2IoJnMtPmMsIHMtPnByb2IucC5zaW5nbGVfcmVmW2ldWzBdKTsKKyAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMjUyKSkKKyAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLnNpbmdsZV9yZWZbaV1bMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3Byb2IoJnMtPmMsIHMtPnByb2IucC5zaW5nbGVfcmVmW2ldWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5jb21wcHJlZG1vZGUgIT0gUFJFRF9TSU5HTEVSRUYpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoJnMtPmMsIDI1MikpCisgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC5jb21wX3JlZltpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfcHJvYigmcy0+Yywgcy0+cHJvYi5wLmNvbXBfcmVmW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgOTsgaisrKQorICAgICAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQorICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAueV9tb2RlW2ldW2pdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9wcm9iKCZzLT5jLCBzLT5wcm9iLnAueV9tb2RlW2ldW2pdKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKQorICAgICAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMjUyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC5wYXJ0aXRpb25bMyAtIGldW2pdW2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfcHJvYigmcy0+Yywgcy0+cHJvYi5wLnBhcnRpdGlvblszIC0gaV1bal1ba10pOworCisgICAgICAgIC8vIG12IGZpZWxkcyBkb24ndCB1c2UgdGhlIHVwZGF0ZV9wcm9iIHN1YmV4cCBtb2RlbCBmb3Igc29tZSByZWFzb24KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQorICAgICAgICAgICAgICAgIHMtPnByb2IucC5tdl9qb2ludFtpXSA9ICh2cDhfcmFjX2dldF91aW50KCZzLT5jLCA3KSA8PCAxKSB8IDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoJnMtPmMsIDI1MikpCisgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X2NvbXBbaV0uc2lnbiA9ICh2cDhfcmFjX2dldF91aW50KCZzLT5jLCA3KSA8PCAxKSB8IDE7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMDsgaisrKQorICAgICAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQorICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfY29tcFtpXS5jbGFzc2VzW2pdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2cDhfcmFjX2dldF91aW50KCZzLT5jLCA3KSA8PCAxKSB8IDE7CisKKyAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQorICAgICAgICAgICAgICAgIHMtPnByb2IucC5tdl9jb21wW2ldLmNsYXNzMCA9ICh2cDhfcmFjX2dldF91aW50KCZzLT5jLCA3KSA8PCAxKSB8IDE7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMDsgaisrKQorICAgICAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQorICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfY29tcFtpXS5iaXRzW2pdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2cDhfcmFjX2dldF91aW50KCZzLT5jLCA3KSA8PCAxKSB8IDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAzOyBrKyspCisgICAgICAgICAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X2NvbXBbaV0uY2xhc3MwX2ZwW2pdW2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodnA4X3JhY19nZXRfdWludCgmcy0+YywgNykgPDwgMSkgfCAxOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQorICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfY29tcFtpXS5mcFtqXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAodnA4X3JhY19nZXRfdWludCgmcy0+YywgNykgPDwgMSkgfCAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPmhpZ2hwcmVjaXNpb25tdnMpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMjUyKSkKKyAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X2NvbXBbaV0uY2xhc3MwX2hwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2cDhfcmFjX2dldF91aW50KCZzLT5jLCA3KSA8PCAxKSB8IDE7CisKKyAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMjUyKSkKKyAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X2NvbXBbaV0uaHAgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHZwOF9yYWNfZ2V0X3VpbnQoJnMtPmMsIDcpIDw8IDEpIHwgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoZGF0YTIgLSBkYXRhKSArIHNpemUyOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGNsYW1wX212KFZQNTZtdiAqZHN0LCBjb25zdCBWUDU2bXYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA5Q29udGV4dCAqcykKK3sKKyAgICBkc3QtPnggPSBhdl9jbGlwKHNyYy0+eCwgcy0+bWluX212LngsIHMtPm1heF9tdi54KTsKKyAgICBkc3QtPnkgPSBhdl9jbGlwKHNyYy0+eSwgcy0+bWluX212LnksIHMtPm1heF9tdi55KTsKK30KKworc3RhdGljIHZvaWQgZmluZF9yZWZfbXZzKFZQOUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA1Nm12ICpwbXYsIGludCByZWYsIGludCB6LCBpbnQgaWR4LCBpbnQgc2IpCit7CisgICAgc3RhdGljIGNvbnN0IGludDhfdCBtdl9yZWZfYmxrX29mZltOX0JTX1NJWkVTXVs4XVsyXSA9IHsKKyAgICAgICAgW0JTXzY0eDY0XSA9IHt7ICAzLCAtMSB9LCB7IC0xLCAgMyB9LCB7ICA0LCAtMSB9LCB7IC0xLCAgNCB9LAorICAgICAgICAgICAgICAgICAgICAgIHsgLTEsIC0xIH0sIHsgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgIDYsIC0xIH19LAorICAgICAgICBbQlNfNjR4MzJdID0ge3sgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgIDQsIC0xIH0sIHsgLTEsICAyIH0sCisgICAgICAgICAgICAgICAgICAgICAgeyAtMSwgLTEgfSwgeyAgMCwgLTMgfSwgeyAtMywgIDAgfSwgeyAgMiwgLTEgfX0sCisgICAgICAgIFtCU18zMng2NF0gPSB7eyAtMSwgIDAgfSwgeyAgMCwgLTEgfSwgeyAtMSwgIDQgfSwgeyAgMiwgLTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICB7IC0xLCAtMSB9LCB7IC0zLCAgMCB9LCB7ICAwLCAtMyB9LCB7IC0xLCAgMiB9fSwKKyAgICAgICAgW0JTXzMyeDMyXSA9IHt7ICAxLCAtMSB9LCB7IC0xLCAgMSB9LCB7ICAyLCAtMSB9LCB7IC0xLCAgMiB9LAorICAgICAgICAgICAgICAgICAgICAgIHsgLTEsIC0xIH0sIHsgIDAsIC0zIH0sIHsgLTMsICAwIH0sIHsgLTMsIC0zIH19LAorICAgICAgICBbQlNfMzJ4MTZdID0ge3sgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgIDIsIC0xIH0sIHsgLTEsIC0xIH0sCisgICAgICAgICAgICAgICAgICAgICAgeyAtMSwgIDEgfSwgeyAgMCwgLTMgfSwgeyAtMywgIDAgfSwgeyAtMywgLTMgfX0sCisgICAgICAgIFtCU18xNngzMl0gPSB7eyAtMSwgIDAgfSwgeyAgMCwgLTEgfSwgeyAtMSwgIDIgfSwgeyAtMSwgLTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAtMSB9LCB7IC0zLCAgMCB9LCB7ICAwLCAtMyB9LCB7IC0zLCAtMyB9fSwKKyAgICAgICAgW0JTXzE2eDE2XSA9IHt7ICAwLCAtMSB9LCB7IC0xLCAgMCB9LCB7ICAxLCAtMSB9LCB7IC0xLCAgMSB9LAorICAgICAgICAgICAgICAgICAgICAgIHsgLTEsIC0xIH0sIHsgIDAsIC0zIH0sIHsgLTMsICAwIH0sIHsgLTMsIC0zIH19LAorICAgICAgICBbQlNfMTZ4OF0gID0ge3sgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgIDEsIC0xIH0sIHsgLTEsIC0xIH0sCisgICAgICAgICAgICAgICAgICAgICAgeyAgMCwgLTIgfSwgeyAtMiwgIDAgfSwgeyAtMiwgLTEgfSwgeyAtMSwgLTIgfX0sCisgICAgICAgIFtCU184eDE2XSAgPSB7eyAtMSwgIDAgfSwgeyAgMCwgLTEgfSwgeyAtMSwgIDEgfSwgeyAtMSwgLTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICB7IC0yLCAgMCB9LCB7ICAwLCAtMiB9LCB7IC0xLCAtMiB9LCB7IC0yLCAtMSB9fSwKKyAgICAgICAgW0JTXzh4OF0gICA9IHt7ICAwLCAtMSB9LCB7IC0xLCAgMCB9LCB7IC0xLCAtMSB9LCB7ICAwLCAtMiB9LAorICAgICAgICAgICAgICAgICAgICAgIHsgLTIsICAwIH0sIHsgLTEsIC0yIH0sIHsgLTIsIC0xIH0sIHsgLTIsIC0yIH19LAorICAgICAgICBbQlNfOHg0XSAgID0ge3sgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgLTEsIC0xIH0sIHsgIDAsIC0yIH0sCisgICAgICAgICAgICAgICAgICAgICAgeyAtMiwgIDAgfSwgeyAtMSwgLTIgfSwgeyAtMiwgLTEgfSwgeyAtMiwgLTIgfX0sCisgICAgICAgIFtCU180eDhdICAgPSB7eyAgMCwgLTEgfSwgeyAtMSwgIDAgfSwgeyAtMSwgLTEgfSwgeyAgMCwgLTIgfSwKKyAgICAgICAgICAgICAgICAgICAgICB7IC0yLCAgMCB9LCB7IC0xLCAtMiB9LCB7IC0yLCAtMSB9LCB7IC0yLCAtMiB9fSwKKyAgICAgICAgW0JTXzR4NF0gICA9IHt7ICAwLCAtMSB9LCB7IC0xLCAgMCB9LCB7IC0xLCAtMSB9LCB7ICAwLCAtMiB9LAorICAgICAgICAgICAgICAgICAgICAgIHsgLTIsICAwIH0sIHsgLTEsIC0yIH0sIHsgLTIsIC0xIH0sIHsgLTIsIC0yIH19LAorICAgIH07CisgICAgVlA5QmxvY2sgKmIgPSBzLT5iOworICAgIGludCByb3cgPSBzLT5yb3csIGNvbCA9IHMtPmNvbCwgcm93NyA9IHMtPnJvdzc7CisgICAgY29uc3QgaW50OF90ICgqcClbMl0gPSBtdl9yZWZfYmxrX29mZltiLT5ic107CisjZGVmaW5lIElOVkFMSURfTVYgMHg4MDAwODAwMFUKKyAgICB1aW50MzJfdCBtZW0gPSBJTlZBTElEX01WOworICAgIGludCBpOworCisjZGVmaW5lIFJFVFVSTl9ESVJFQ1RfTVYobXYpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgdWludDMyX3QgbSA9IEFWX1JOMzJBKCZtdik7IFwKKyAgICAgICAgaWYgKCFpZHgpIHsgXAorICAgICAgICAgICAgQVZfV04zMkEocG12LCBtKTsgXAorICAgICAgICAgICAgcmV0dXJuOyBcCisgICAgICAgIH0gZWxzZSBpZiAobWVtID09IElOVkFMSURfTVYpIHsgXAorICAgICAgICAgICAgbWVtID0gbTsgXAorICAgICAgICB9IGVsc2UgaWYgKG0gIT0gbWVtKSB7IFwKKyAgICAgICAgICAgIEFWX1dOMzJBKHBtdiwgbSk7IFwKKyAgICAgICAgICAgIHJldHVybjsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgaWYgKHNiID49IDApIHsKKyAgICAgICAgaWYgKHNiID09IDIgfHwgc2IgPT0gMSkgeworICAgICAgICAgICAgUkVUVVJOX0RJUkVDVF9NVihiLT5tdlswXVt6XSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2IgPT0gMykgeworICAgICAgICAgICAgUkVUVVJOX0RJUkVDVF9NVihiLT5tdlsyXVt6XSk7CisgICAgICAgICAgICBSRVRVUk5fRElSRUNUX01WKGItPm12WzFdW3pdKTsKKyAgICAgICAgICAgIFJFVFVSTl9ESVJFQ1RfTVYoYi0+bXZbMF1bel0pOworICAgICAgICB9CisKKyNkZWZpbmUgUkVUVVJOX01WKG12KSBcCisgICAgZG8geyBcCisgICAgICAgIGlmIChzYiA+IDApIHsgXAorICAgICAgICAgICAgVlA1Nm12IHRtcDsgXAorICAgICAgICAgICAgdWludDMyX3QgbTsgXAorICAgICAgICAgICAgY2xhbXBfbXYoJnRtcCwgJm12LCBzKTsgXAorICAgICAgICAgICAgbSA9IEFWX1JOMzJBKCZ0bXApOyBcCisgICAgICAgICAgICBpZiAoIWlkeCkgeyBcCisgICAgICAgICAgICAgICAgQVZfV04zMkEocG12LCBtKTsgXAorICAgICAgICAgICAgICAgIHJldHVybjsgXAorICAgICAgICAgICAgfSBlbHNlIGlmIChtZW0gPT0gSU5WQUxJRF9NVikgeyBcCisgICAgICAgICAgICAgICAgbWVtID0gbTsgXAorICAgICAgICAgICAgfSBlbHNlIGlmIChtICE9IG1lbSkgeyBcCisgICAgICAgICAgICAgICAgQVZfV04zMkEocG12LCBtKTsgXAorICAgICAgICAgICAgICAgIHJldHVybjsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgIHVpbnQzMl90IG0gPSBBVl9STjMyQSgmbXYpOyBcCisgICAgICAgICAgICBpZiAoIWlkeCkgeyBcCisgICAgICAgICAgICAgICAgY2xhbXBfbXYocG12LCAmbXYsIHMpOyBcCisgICAgICAgICAgICAgICAgcmV0dXJuOyBcCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lbSA9PSBJTlZBTElEX01WKSB7IFwKKyAgICAgICAgICAgICAgICBtZW0gPSBtOyBcCisgICAgICAgICAgICB9IGVsc2UgaWYgKG0gIT0gbWVtKSB7IFwKKyAgICAgICAgICAgICAgICBjbGFtcF9tdihwbXYsICZtdiwgcyk7IFwKKyAgICAgICAgICAgICAgICByZXR1cm47IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgICAgIGlmIChyb3cgPiAwKSB7CisgICAgICAgICAgICBzdHJ1Y3QgVlA5bXZyZWZQYWlyICptdiA9ICZzLT5mcmFtZXNbQ1VSX0ZSQU1FXS5tdlsocm93IC0gMSkgKiBzLT5zYl9jb2xzICogOCArIGNvbF07CisgICAgICAgICAgICBpZiAobXYtPnJlZlswXSA9PSByZWYpIHsKKyAgICAgICAgICAgICAgICBSRVRVUk5fTVYocy0+YWJvdmVfbXZfY3R4WzIgKiBjb2wgKyAoc2IgJiAxKV1bMF0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChtdi0+cmVmWzFdID09IHJlZikgeworICAgICAgICAgICAgICAgIFJFVFVSTl9NVihzLT5hYm92ZV9tdl9jdHhbMiAqIGNvbCArIChzYiAmIDEpXVsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbCA+IHMtPnRpbGluZy50aWxlX2NvbF9zdGFydCkgeworICAgICAgICAgICAgc3RydWN0IFZQOW12cmVmUGFpciAqbXYgPSAmcy0+ZnJhbWVzW0NVUl9GUkFNRV0ubXZbcm93ICogcy0+c2JfY29scyAqIDggKyBjb2wgLSAxXTsKKyAgICAgICAgICAgIGlmIChtdi0+cmVmWzBdID09IHJlZikgeworICAgICAgICAgICAgICAgIFJFVFVSTl9NVihzLT5sZWZ0X212X2N0eFsyICogcm93NyArIChzYiA+PiAxKV1bMF0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChtdi0+cmVmWzFdID09IHJlZikgeworICAgICAgICAgICAgICAgIFJFVFVSTl9NVihzLT5sZWZ0X212X2N0eFsyICogcm93NyArIChzYiA+PiAxKV1bMV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGkgPSAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGkgPSAwOworICAgIH0KKworICAgIC8vIHByZXZpb3VzbHkgY29kZWQgTVZzIGluIHRoaXMgbmVpZ2hib3VyaG9vZCwgdXNpbmcgc2FtZSByZWZlcmVuY2UgZnJhbWUKKyAgICBmb3IgKDsgaSA8IDg7IGkrKykgeworICAgICAgICBpbnQgYyA9IHBbaV1bMF0gKyBjb2wsIHIgPSBwW2ldWzFdICsgcm93OworCisgICAgICAgIGlmIChjID49IHMtPnRpbGluZy50aWxlX2NvbF9zdGFydCAmJiBjIDwgcy0+Y29scyAmJiByID49IDAgJiYgciA8IHMtPnJvd3MpIHsKKyAgICAgICAgICAgIHN0cnVjdCBWUDltdnJlZlBhaXIgKm12ID0gJnMtPmZyYW1lc1tDVVJfRlJBTUVdLm12W3IgKiBzLT5zYl9jb2xzICogOCArIGNdOworCisgICAgICAgICAgICBpZiAobXYtPnJlZlswXSA9PSByZWYpIHsKKyAgICAgICAgICAgICAgICBSRVRVUk5fTVYobXYtPm12WzBdKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobXYtPnJlZlsxXSA9PSByZWYpIHsKKyAgICAgICAgICAgICAgICBSRVRVUk5fTVYobXYtPm12WzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE1WIGF0IHRoaXMgcG9zaXRpb24gaW4gcHJldmlvdXMgZnJhbWUsIHVzaW5nIHNhbWUgcmVmZXJlbmNlIGZyYW1lCisgICAgaWYgKHMtPnVzZV9sYXN0X2ZyYW1lX212cykgeworICAgICAgICBzdHJ1Y3QgVlA5bXZyZWZQYWlyICptdiA9ICZzLT5mcmFtZXNbTEFTVF9GUkFNRV0ubXZbcm93ICogcy0+c2JfY29scyAqIDggKyBjb2xdOworCisgICAgICAgIGlmICghcy0+bGFzdF91c2VzXzJwYXNzKQorICAgICAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKCZzLT5mcmFtZXNbTEFTVF9GUkFNRV0udGYsIHJvdyA+PiAzLCAwKTsKKyAgICAgICAgaWYgKG12LT5yZWZbMF0gPT0gcmVmKSB7CisgICAgICAgICAgICBSRVRVUk5fTVYobXYtPm12WzBdKTsKKyAgICAgICAgfSBlbHNlIGlmIChtdi0+cmVmWzFdID09IHJlZikgeworICAgICAgICAgICAgUkVUVVJOX01WKG12LT5tdlsxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyNkZWZpbmUgUkVUVVJOX1NDQUxFX01WKG12LCBzY2FsZSkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAoc2NhbGUpIHsgXAorICAgICAgICAgICAgVlA1Nm12IG12X3RlbXAgPSB7IC1tdi54LCAtbXYueSB9OyBcCisgICAgICAgICAgICBSRVRVUk5fTVYobXZfdGVtcCk7IFwKKyAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgUkVUVVJOX01WKG12KTsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgLy8gcHJldmlvdXNseSBjb2RlZCBNVnMgaW4gdGhpcyBuZWlnaGJvdXJob29kLCB1c2luZyBkaWZmZXJlbnQgcmVmZXJlbmNlIGZyYW1lCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBpbnQgYyA9IHBbaV1bMF0gKyBjb2wsIHIgPSBwW2ldWzFdICsgcm93OworCisgICAgICAgIGlmIChjID49IHMtPnRpbGluZy50aWxlX2NvbF9zdGFydCAmJiBjIDwgcy0+Y29scyAmJiByID49IDAgJiYgciA8IHMtPnJvd3MpIHsKKyAgICAgICAgICAgIHN0cnVjdCBWUDltdnJlZlBhaXIgKm12ID0gJnMtPmZyYW1lc1tDVVJfRlJBTUVdLm12W3IgKiBzLT5zYl9jb2xzICogOCArIGNdOworCisgICAgICAgICAgICBpZiAobXYtPnJlZlswXSAhPSByZWYgJiYgbXYtPnJlZlswXSA+PSAwKSB7CisgICAgICAgICAgICAgICAgUkVUVVJOX1NDQUxFX01WKG12LT5tdlswXSwgcy0+c2lnbmJpYXNbbXYtPnJlZlswXV0gIT0gcy0+c2lnbmJpYXNbcmVmXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXYtPnJlZlsxXSAhPSByZWYgJiYgbXYtPnJlZlsxXSA+PSAwICYmCisgICAgICAgICAgICAgICAgLy8gQlVHIC0gbGlidnB4IGhhcyB0aGlzIGNvbmRpdGlvbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAgICAgICAgICAgICAgICAvLyB3ZSB1c2VkIHRoZSBmaXJzdCByZWYgTVYgYW5kIHByZS1zY2FsaW5nCisgICAgICAgICAgICAgICAgQVZfUk4zMkEoJm12LT5tdlswXSkgIT0gQVZfUk4zMkEoJm12LT5tdlsxXSkpIHsKKyAgICAgICAgICAgICAgICBSRVRVUk5fU0NBTEVfTVYobXYtPm12WzFdLCBzLT5zaWduYmlhc1ttdi0+cmVmWzFdXSAhPSBzLT5zaWduYmlhc1tyZWZdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE1WIGF0IHRoaXMgcG9zaXRpb24gaW4gcHJldmlvdXMgZnJhbWUsIHVzaW5nIGRpZmZlcmVudCByZWZlcmVuY2UgZnJhbWUKKyAgICBpZiAocy0+dXNlX2xhc3RfZnJhbWVfbXZzKSB7CisgICAgICAgIHN0cnVjdCBWUDltdnJlZlBhaXIgKm12ID0gJnMtPmZyYW1lc1tMQVNUX0ZSQU1FXS5tdltyb3cgKiBzLT5zYl9jb2xzICogOCArIGNvbF07CisKKyAgICAgICAgLy8gbm8gbmVlZCB0byBhd2FpdF9wcm9ncmVzcywgYmVjYXVzZSB3ZSBhbHJlYWR5IGRpZCB0aGF0IGFib3ZlCisgICAgICAgIGlmIChtdi0+cmVmWzBdICE9IHJlZiAmJiBtdi0+cmVmWzBdID49IDApIHsKKyAgICAgICAgICAgIFJFVFVSTl9TQ0FMRV9NVihtdi0+bXZbMF0sIHMtPnNpZ25iaWFzW212LT5yZWZbMF1dICE9IHMtPnNpZ25iaWFzW3JlZl0pOworICAgICAgICB9CisgICAgICAgIGlmIChtdi0+cmVmWzFdICE9IHJlZiAmJiBtdi0+cmVmWzFdID49IDAgJiYKKyAgICAgICAgICAgIC8vIEJVRyAtIGxpYnZweCBoYXMgdGhpcyBjb25kaXRpb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyCisgICAgICAgICAgICAvLyB3ZSB1c2VkIHRoZSBmaXJzdCByZWYgTVYgYW5kIHByZS1zY2FsaW5nCisgICAgICAgICAgICBBVl9STjMyQSgmbXYtPm12WzBdKSAhPSBBVl9STjMyQSgmbXYtPm12WzFdKSkgeworICAgICAgICAgICAgUkVUVVJOX1NDQUxFX01WKG12LT5tdlsxXSwgcy0+c2lnbmJpYXNbbXYtPnJlZlsxXV0gIT0gcy0+c2lnbmJpYXNbcmVmXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBVl9aRVJPMzIocG12KTsKKyN1bmRlZiBJTlZBTElEX01WCisjdW5kZWYgUkVUVVJOX01WCisjdW5kZWYgUkVUVVJOX1NDQUxFX01WCit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCByZWFkX212X2NvbXBvbmVudChWUDlDb250ZXh0ICpzLCBpbnQgaWR4LCBpbnQgaHApCit7CisgICAgaW50IGJpdCwgc2lnbiA9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAubXZfY29tcFtpZHhdLnNpZ24pOworICAgIGludCBuLCBjID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X212X2NsYXNzX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC5tdl9jb21wW2lkeF0uY2xhc3Nlcyk7CisKKyAgICBzLT5jb3VudHMubXZfY29tcFtpZHhdLnNpZ25bc2lnbl0rKzsKKyAgICBzLT5jb3VudHMubXZfY29tcFtpZHhdLmNsYXNzZXNbY10rKzsKKyAgICBpZiAoYykgeworICAgICAgICBpbnQgbTsKKworICAgICAgICBmb3IgKG4gPSAwLCBtID0gMDsgbSA8IGM7IG0rKykgeworICAgICAgICAgICAgYml0ID0gdnA1Nl9yYWNfZ2V0X3Byb2IoJnMtPmMsIHMtPnByb2IucC5tdl9jb21wW2lkeF0uYml0c1ttXSk7CisgICAgICAgICAgICBuIHw9IGJpdCA8PCBtOworICAgICAgICAgICAgcy0+Y291bnRzLm12X2NvbXBbaWR4XS5iaXRzW21dW2JpdF0rKzsKKyAgICAgICAgfQorICAgICAgICBuIDw8PSAzOworICAgICAgICBiaXQgPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfbXZfZnBfdHJlZSwgcy0+cHJvYi5wLm12X2NvbXBbaWR4XS5mcCk7CisgICAgICAgIG4gfD0gYml0IDw8IDE7CisgICAgICAgIHMtPmNvdW50cy5tdl9jb21wW2lkeF0uZnBbYml0XSsrOworICAgICAgICBpZiAoaHApIHsKKyAgICAgICAgICAgIGJpdCA9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAubXZfY29tcFtpZHhdLmhwKTsKKyAgICAgICAgICAgIHMtPmNvdW50cy5tdl9jb21wW2lkeF0uaHBbYml0XSsrOworICAgICAgICAgICAgbiB8PSBiaXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuIHw9IDE7CisgICAgICAgICAgICAvLyBidWcgaW4gbGlidnB4IC0gd2UgY291bnQgZm9yIGJ3IGVudHJvcHkgcHVycG9zZXMgZXZlbiBpZiB0aGUKKyAgICAgICAgICAgIC8vIGJpdCB3YXNuJ3QgY29kZWQKKyAgICAgICAgICAgIHMtPmNvdW50cy5tdl9jb21wW2lkeF0uaHBbMV0rKzsKKyAgICAgICAgfQorICAgICAgICBuICs9IDggPDwgYzsKKyAgICB9IGVsc2UgeworICAgICAgICBuID0gdnA1Nl9yYWNfZ2V0X3Byb2IoJnMtPmMsIHMtPnByb2IucC5tdl9jb21wW2lkeF0uY2xhc3MwKTsKKyAgICAgICAgcy0+Y291bnRzLm12X2NvbXBbaWR4XS5jbGFzczBbbl0rKzsKKyAgICAgICAgYml0ID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X212X2ZwX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X2NvbXBbaWR4XS5jbGFzczBfZnBbbl0pOworICAgICAgICBzLT5jb3VudHMubXZfY29tcFtpZHhdLmNsYXNzMF9mcFtuXVtiaXRdKys7CisgICAgICAgIG4gPSAobiA8PCAzKSB8IChiaXQgPDwgMSk7CisgICAgICAgIGlmIChocCkgeworICAgICAgICAgICAgYml0ID0gdnA1Nl9yYWNfZ2V0X3Byb2IoJnMtPmMsIHMtPnByb2IucC5tdl9jb21wW2lkeF0uY2xhc3MwX2hwKTsKKyAgICAgICAgICAgIHMtPmNvdW50cy5tdl9jb21wW2lkeF0uY2xhc3MwX2hwW2JpdF0rKzsKKyAgICAgICAgICAgIG4gfD0gYml0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbiB8PSAxOworICAgICAgICAgICAgLy8gYnVnIGluIGxpYnZweCAtIHdlIGNvdW50IGZvciBidyBlbnRyb3B5IHB1cnBvc2VzIGV2ZW4gaWYgdGhlCisgICAgICAgICAgICAvLyBiaXQgd2Fzbid0IGNvZGVkCisgICAgICAgICAgICBzLT5jb3VudHMubXZfY29tcFtpZHhdLmNsYXNzMF9ocFsxXSsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpZ24gPyAtKG4gKyAxKSA6IChuICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfbXYoVlA5Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgVlA1Nm12ICptdiwgaW50IG1vZGUsIGludCBzYikKK3sKKyAgICBWUDlCbG9jayAqYiA9IHMtPmI7CisKKyAgICBpZiAobW9kZSA9PSBaRVJPTVYpIHsKKyAgICAgICAgQVZfWkVSTzY0KG12KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaHA7CisKKyAgICAgICAgLy8gRklYTUUgY2FjaGUgdGhpcyB2YWx1ZSBhbmQgcmV1c2UgZm9yIG90aGVyIHN1YmJsb2NrcworICAgICAgICBmaW5kX3JlZl9tdnMocywgJm12WzBdLCBiLT5yZWZbMF0sIDAsIG1vZGUgPT0gTkVBUk1WLAorICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBORVdNViA/IC0xIDogc2IpOworICAgICAgICAvLyBGSVhNRSBtYXliZSBtb3ZlIHRoaXMgY29kZSBpbnRvIGZpbmRfcmVmX212cygpCisgICAgICAgIGlmICgobW9kZSA9PSBORVdNViB8fCBzYiA9PSAtMSkgJiYKKyAgICAgICAgICAgICEoaHAgPSBzLT5oaWdocHJlY2lzaW9ubXZzICYmIGFicyhtdlswXS54KSA8IDY0ICYmIGFicyhtdlswXS55KSA8IDY0KSkgeworICAgICAgICAgICAgaWYgKG12WzBdLnkgJiAxKSB7CisgICAgICAgICAgICAgICAgaWYgKG12WzBdLnkgPCAwKQorICAgICAgICAgICAgICAgICAgICBtdlswXS55Kys7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBtdlswXS55LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXZbMF0ueCAmIDEpIHsKKyAgICAgICAgICAgICAgICBpZiAobXZbMF0ueCA8IDApCisgICAgICAgICAgICAgICAgICAgIG12WzBdLngrKzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG12WzBdLngtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobW9kZSA9PSBORVdNVikgeworICAgICAgICAgICAgZW51bSBNVkpvaW50IGogPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfbXZfam9pbnRfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfam9pbnQpOworCisgICAgICAgICAgICBzLT5jb3VudHMubXZfam9pbnRbal0rKzsKKyAgICAgICAgICAgIGlmIChqID49IE1WX0pPSU5UX1YpCisgICAgICAgICAgICAgICAgbXZbMF0ueSArPSByZWFkX212X2NvbXBvbmVudChzLCAwLCBocCk7CisgICAgICAgICAgICBpZiAoaiAmIDEpCisgICAgICAgICAgICAgICAgbXZbMF0ueCArPSByZWFkX212X2NvbXBvbmVudChzLCAxLCBocCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYi0+Y29tcCkgeworICAgICAgICAgICAgLy8gRklYTUUgY2FjaGUgdGhpcyB2YWx1ZSBhbmQgcmV1c2UgZm9yIG90aGVyIHN1YmJsb2NrcworICAgICAgICAgICAgZmluZF9yZWZfbXZzKHMsICZtdlsxXSwgYi0+cmVmWzFdLCAxLCBtb2RlID09IE5FQVJNViwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID09IE5FV01WID8gLTEgOiBzYik7CisgICAgICAgICAgICBpZiAoKG1vZGUgPT0gTkVXTVYgfHwgc2IgPT0gLTEpICYmCisgICAgICAgICAgICAgICAgIShocCA9IHMtPmhpZ2hwcmVjaXNpb25tdnMgJiYgYWJzKG12WzFdLngpIDwgNjQgJiYgYWJzKG12WzFdLnkpIDwgNjQpKSB7CisgICAgICAgICAgICAgICAgaWYgKG12WzFdLnkgJiAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtdlsxXS55IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG12WzFdLnkrKzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbXZbMV0ueS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobXZbMV0ueCAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG12WzFdLnggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbXZbMV0ueCsrOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBtdlsxXS54LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vZGUgPT0gTkVXTVYpIHsKKyAgICAgICAgICAgICAgICBlbnVtIE1WSm9pbnQgaiA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9tdl9qb2ludF90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfam9pbnQpOworCisgICAgICAgICAgICAgICAgcy0+Y291bnRzLm12X2pvaW50W2pdKys7CisgICAgICAgICAgICAgICAgaWYgKGogPj0gTVZfSk9JTlRfVikKKyAgICAgICAgICAgICAgICAgICAgbXZbMV0ueSArPSByZWFkX212X2NvbXBvbmVudChzLCAwLCBocCk7CisgICAgICAgICAgICAgICAgaWYgKGogJiAxKQorICAgICAgICAgICAgICAgICAgICBtdlsxXS54ICs9IHJlYWRfbXZfY29tcG9uZW50KHMsIDEsIGhwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBzZXRjdHhfMmQodWludDhfdCAqcHRyLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgdikKK3sKKyAgICBzd2l0Y2ggKHcpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICpwdHIgPSB2OworICAgICAgICAgICAgcHRyICs9IHN0cmlkZTsKKyAgICAgICAgfSB3aGlsZSAoLS1oKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiB7CisgICAgICAgIGludCB2MTYgPSB2ICogMHgwMTAxOworICAgICAgICBkbyB7CisgICAgICAgICAgICBBVl9XTjE2QShwdHIsIHYxNik7CisgICAgICAgICAgICBwdHIgKz0gc3RyaWRlOworICAgICAgICB9IHdoaWxlICgtLWgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA0OiB7CisgICAgICAgIHVpbnQzMl90IHYzMiA9IHYgKiAweDAxMDEwMTAxOworICAgICAgICBkbyB7CisgICAgICAgICAgICBBVl9XTjMyQShwdHIsIHYzMik7CisgICAgICAgICAgICBwdHIgKz0gc3RyaWRlOworICAgICAgICB9IHdoaWxlICgtLWgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA4OiB7CisjaWYgSEFWRV9GQVNUXzY0QklUCisgICAgICAgIHVpbnQ2NF90IHY2NCA9IHYgKiAweDAxMDEwMTAxMDEwMTAxMDFVTEw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIEFWX1dONjRBKHB0ciwgdjY0KTsKKyAgICAgICAgICAgIHB0ciArPSBzdHJpZGU7CisgICAgICAgIH0gd2hpbGUgKC0taCk7CisjZWxzZQorICAgICAgICB1aW50MzJfdCB2MzIgPSB2ICogMHgwMTAxMDEwMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgQVZfV04zMkEocHRyLCAgICAgdjMyKTsKKyAgICAgICAgICAgIEFWX1dOMzJBKHB0ciArIDQsIHYzMik7CisgICAgICAgICAgICBwdHIgKz0gc3RyaWRlOworICAgICAgICB9IHdoaWxlICgtLWgpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9tb2RlKEFWQ29kZWNDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgbGVmdF9jdHhbTl9CU19TSVpFU10gPSB7CisgICAgICAgIDB4MCwgMHg4LCAweDAsIDB4OCwgMHhjLCAweDgsIDB4YywgMHhlLCAweGMsIDB4ZSwgMHhmLCAweGUsIDB4ZgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWJvdmVfY3R4W05fQlNfU0laRVNdID0geworICAgICAgICAweDAsIDB4MCwgMHg4LCAweDgsIDB4OCwgMHhjLCAweGMsIDB4YywgMHhlLCAweGUsIDB4ZSwgMHhmLCAweGYKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG1heF90eF9mb3JfYmxfYnBbTl9CU19TSVpFU10gPSB7CisgICAgICAgIFRYXzMyWDMyLCBUWF8zMlgzMiwgVFhfMzJYMzIsIFRYXzMyWDMyLCBUWF8xNlgxNiwgVFhfMTZYMTYsCisgICAgICAgIFRYXzE2WDE2LCBUWF84WDgsIFRYXzhYOCwgVFhfOFg4LCBUWF80WDQsIFRYXzRYNCwgVFhfNFg0CisgICAgfTsKKyAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgVlA5QmxvY2sgKmIgPSBzLT5iOworICAgIGludCByb3cgPSBzLT5yb3csIGNvbCA9IHMtPmNvbCwgcm93NyA9IHMtPnJvdzc7CisgICAgZW51bSBUeGZtTW9kZSBtYXhfdHggPSBtYXhfdHhfZm9yX2JsX2JwW2ItPmJzXTsKKyAgICBpbnQgdzQgPSBGRk1JTihzLT5jb2xzIC0gY29sLCBid2hfdGFiWzFdW2ItPmJzXVswXSk7CisgICAgaW50IGg0ID0gRkZNSU4ocy0+cm93cyAtIHJvdywgYndoX3RhYlsxXVtiLT5ic11bMV0pLCB5OworICAgIGludCBoYXZlX2EgPSByb3cgPiAwLCBoYXZlX2wgPSBjb2wgPiBzLT50aWxpbmcudGlsZV9jb2xfc3RhcnQ7CisgICAgaW50IHZyZWYsIGZpbHRlcl9pZDsKKworICAgIGlmICghcy0+c2VnbWVudGF0aW9uLmVuYWJsZWQpIHsKKyAgICAgICAgYi0+c2VnX2lkID0gMDsKKyAgICB9IGVsc2UgaWYgKHMtPmtleWZyYW1lIHx8IHMtPmludHJhb25seSkgeworICAgICAgICBiLT5zZWdfaWQgPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfc2VnbWVudGF0aW9uX3RyZWUsIHMtPnByb2Iuc2VnKTsKKyAgICB9IGVsc2UgaWYgKCFzLT5zZWdtZW50YXRpb24udXBkYXRlX21hcCB8fAorICAgICAgICAgICAgICAgKHMtPnNlZ21lbnRhdGlvbi50ZW1wb3JhbCAmJgorICAgICAgICAgICAgICAgIHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoJnMtPmMsCisgICAgICAgICAgICAgICAgICAgIHMtPnByb2Iuc2VncHJlZFtzLT5hYm92ZV9zZWdwcmVkX2N0eFtjb2xdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxlZnRfc2VncHJlZF9jdHhbcm93N11dKSkpIHsKKyAgICAgICAgaWYgKCFzLT5lcnJvcnJlcykgeworICAgICAgICAgICAgaW50IHByZWQgPSA4LCB4OworICAgICAgICAgICAgdWludDhfdCAqcmVmc2VnbWFwID0gcy0+ZnJhbWVzW0xBU1RfRlJBTUVdLnNlZ21lbnRhdGlvbl9tYXA7CisKKyAgICAgICAgICAgIGlmICghcy0+bGFzdF91c2VzXzJwYXNzKQorICAgICAgICAgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcy0+ZnJhbWVzW0xBU1RfRlJBTUVdLnRmLCByb3cgPj4gMywgMCk7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDQ7IHkrKykKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzQ7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgcHJlZCA9IEZGTUlOKHByZWQsIHJlZnNlZ21hcFsoeSArIHJvdykgKiA4ICogcy0+c2JfY29scyArIHggKyBjb2xdKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDEocHJlZCA8IDgpOworICAgICAgICAgICAgYi0+c2VnX2lkID0gcHJlZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGItPnNlZ19pZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJnMtPmFib3ZlX3NlZ3ByZWRfY3R4W2NvbF0sIDEsIHc0KTsKKyAgICAgICAgbWVtc2V0KCZzLT5sZWZ0X3NlZ3ByZWRfY3R4W3JvdzddLCAxLCBoNCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYi0+c2VnX2lkID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X3NlZ21lbnRhdGlvbl90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2Iuc2VnKTsKKworICAgICAgICBtZW1zZXQoJnMtPmFib3ZlX3NlZ3ByZWRfY3R4W2NvbF0sIDAsIHc0KTsKKyAgICAgICAgbWVtc2V0KCZzLT5sZWZ0X3NlZ3ByZWRfY3R4W3JvdzddLCAwLCBoNCk7CisgICAgfQorICAgIGlmIChzLT5zZWdtZW50YXRpb24uZW5hYmxlZCAmJgorICAgICAgICAocy0+c2VnbWVudGF0aW9uLnVwZGF0ZV9tYXAgfHwgcy0+a2V5ZnJhbWUgfHwgcy0+aW50cmFvbmx5KSkgeworICAgICAgICBzZXRjdHhfMmQoJnMtPmZyYW1lc1tDVVJfRlJBTUVdLnNlZ21lbnRhdGlvbl9tYXBbcm93ICogOCAqIHMtPnNiX2NvbHMgKyBjb2xdLAorICAgICAgICAgICAgICAgICAgdzQsIGg0LCA4ICogcy0+c2JfY29scywgYi0+c2VnX2lkKTsKKyAgICB9CisKKyAgICBiLT5za2lwID0gcy0+c2VnbWVudGF0aW9uLmVuYWJsZWQgJiYKKyAgICAgICAgcy0+c2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5za2lwX2VuYWJsZWQ7CisgICAgaWYgKCFiLT5za2lwKSB7CisgICAgICAgIGludCBjID0gcy0+bGVmdF9za2lwX2N0eFtyb3c3XSArIHMtPmFib3ZlX3NraXBfY3R4W2NvbF07CisgICAgICAgIGItPnNraXAgPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLnNraXBbY10pOworICAgICAgICBzLT5jb3VudHMuc2tpcFtjXVtiLT5za2lwXSsrOworICAgIH0KKworICAgIGlmIChzLT5rZXlmcmFtZSB8fCBzLT5pbnRyYW9ubHkpIHsKKyAgICAgICAgYi0+aW50cmEgPSAxOworICAgIH0gZWxzZSBpZiAocy0+c2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5yZWZfZW5hYmxlZCkgeworICAgICAgICBiLT5pbnRyYSA9ICFzLT5zZWdtZW50YXRpb24uZmVhdFtiLT5zZWdfaWRdLnJlZl92YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGMsIGJpdDsKKworICAgICAgICBpZiAoaGF2ZV9hICYmIGhhdmVfbCkgeworICAgICAgICAgICAgYyA9IHMtPmFib3ZlX2ludHJhX2N0eFtjb2xdICsgcy0+bGVmdF9pbnRyYV9jdHhbcm93N107CisgICAgICAgICAgICBjICs9IChjID09IDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYyA9IGhhdmVfYSA/IDIgKiBzLT5hYm92ZV9pbnRyYV9jdHhbY29sXSA6CisgICAgICAgICAgICAgICAgaGF2ZV9sID8gMiAqIHMtPmxlZnRfaW50cmFfY3R4W3JvdzddIDogMDsKKyAgICAgICAgfQorICAgICAgICBiaXQgPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLmludHJhW2NdKTsKKyAgICAgICAgcy0+Y291bnRzLmludHJhW2NdW2JpdF0rKzsKKyAgICAgICAgYi0+aW50cmEgPSAhYml0OworICAgIH0KKworICAgIGlmICgoYi0+aW50cmEgfHwgIWItPnNraXApICYmIHMtPnR4Zm1tb2RlID09IFRYX1NXSVRDSEFCTEUpIHsKKyAgICAgICAgaW50IGM7CisgICAgICAgIGlmIChoYXZlX2EpIHsKKyAgICAgICAgICAgIGlmIChoYXZlX2wpIHsKKyAgICAgICAgICAgICAgICBjID0gKHMtPmFib3ZlX3NraXBfY3R4W2NvbF0gPyBtYXhfdHggOgorICAgICAgICAgICAgICAgICAgICAgcy0+YWJvdmVfdHhmbV9jdHhbY29sXSkgKworICAgICAgICAgICAgICAgICAgICAocy0+bGVmdF9za2lwX2N0eFtyb3c3XSA/IG1heF90eCA6CisgICAgICAgICAgICAgICAgICAgICBzLT5sZWZ0X3R4Zm1fY3R4W3JvdzddKSA+IG1heF90eDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYyA9IHMtPmFib3ZlX3NraXBfY3R4W2NvbF0gPyAxIDoKKyAgICAgICAgICAgICAgICAgICAgKHMtPmFib3ZlX3R4Zm1fY3R4W2NvbF0gKiAyID4gbWF4X3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChoYXZlX2wpIHsKKyAgICAgICAgICAgIGMgPSBzLT5sZWZ0X3NraXBfY3R4W3JvdzddID8gMSA6CisgICAgICAgICAgICAgICAgKHMtPmxlZnRfdHhmbV9jdHhbcm93N10gKiAyID4gbWF4X3R4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGMgPSAxOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAobWF4X3R4KSB7CisgICAgICAgIGNhc2UgVFhfMzJYMzI6CisgICAgICAgICAgICBiLT50eCA9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAudHgzMnBbY11bMF0pOworICAgICAgICAgICAgaWYgKGItPnR4KSB7CisgICAgICAgICAgICAgICAgYi0+dHggKz0gdnA1Nl9yYWNfZ2V0X3Byb2IoJnMtPmMsIHMtPnByb2IucC50eDMycFtjXVsxXSk7CisgICAgICAgICAgICAgICAgaWYgKGItPnR4ID09IDIpCisgICAgICAgICAgICAgICAgICAgIGItPnR4ICs9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAudHgzMnBbY11bMl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+Y291bnRzLnR4MzJwW2NdW2ItPnR4XSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFhfMTZYMTY6CisgICAgICAgICAgICBiLT50eCA9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAudHgxNnBbY11bMF0pOworICAgICAgICAgICAgaWYgKGItPnR4KQorICAgICAgICAgICAgICAgIGItPnR4ICs9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAudHgxNnBbY11bMV0pOworICAgICAgICAgICAgcy0+Y291bnRzLnR4MTZwW2NdW2ItPnR4XSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFhfOFg4OgorICAgICAgICAgICAgYi0+dHggPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLnR4OHBbY10pOworICAgICAgICAgICAgcy0+Y291bnRzLnR4OHBbY11bYi0+dHhdKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWF80WDQ6CisgICAgICAgICAgICBiLT50eCA9IFRYXzRYNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYi0+dHggPSBGRk1JTihtYXhfdHgsIHMtPnR4Zm1tb2RlKTsKKyAgICB9CisKKyAgICBpZiAocy0+a2V5ZnJhbWUgfHwgcy0+aW50cmFvbmx5KSB7CisgICAgICAgIHVpbnQ4X3QgKmEgPSAmcy0+YWJvdmVfbW9kZV9jdHhbY29sICogMl07CisgICAgICAgIHVpbnQ4X3QgKmwgPSAmcy0+bGVmdF9tb2RlX2N0eFsocm93NykgPDwgMV07CisKKyAgICAgICAgYi0+Y29tcCA9IDA7CisgICAgICAgIGlmIChiLT5icyA+IEJTXzh4OCkgeworICAgICAgICAgICAgLy8gRklYTUUgdGhlIG1lbW9yeSBzdG9yYWdlIGludGVybWVkaWF0ZXMgaGVyZSBhcmVuJ3QgcmVhbGx5CisgICAgICAgICAgICAvLyBuZWNlc3NhcnksIHRoZXkncmUganVzdCB0aGVyZSB0byBtYWtlIHRoZSBjb2RlIHNsaWdodGx5CisgICAgICAgICAgICAvLyBzaW1wbGVyIGZvciBub3cKKyAgICAgICAgICAgIGItPm1vZGVbMF0gPSBhWzBdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludHJhbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA5X2RlZmF1bHRfa2ZfeW1vZGVfcHJvYnNbYVswXV1bbFswXV0pOworICAgICAgICAgICAgaWYgKGItPmJzICE9IEJTXzh4NCkgeworICAgICAgICAgICAgICAgIGItPm1vZGVbMV0gPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfaW50cmFtb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDlfZGVmYXVsdF9rZl95bW9kZV9wcm9ic1thWzFdXVtiLT5tb2RlWzBdXSk7CisgICAgICAgICAgICAgICAgbFswXSA9IGFbMV0gPSBiLT5tb2RlWzFdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsWzBdID0gYVsxXSA9IGItPm1vZGVbMV0gPSBiLT5tb2RlWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGItPmJzICE9IEJTXzR4OCkgeworICAgICAgICAgICAgICAgIGItPm1vZGVbMl0gPSBhWzBdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludHJhbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOV9kZWZhdWx0X2tmX3ltb2RlX3Byb2JzW2FbMF1dW2xbMV1dKTsKKyAgICAgICAgICAgICAgICBpZiAoYi0+YnMgIT0gQlNfOHg0KSB7CisgICAgICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfaW50cmFtb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA5X2RlZmF1bHRfa2ZfeW1vZGVfcHJvYnNbYVsxXV1bYi0+bW9kZVsyXV0pOworICAgICAgICAgICAgICAgICAgICBsWzFdID0gYVsxXSA9IGItPm1vZGVbM107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbFsxXSA9IGFbMV0gPSBiLT5tb2RlWzNdID0gYi0+bW9kZVsyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGItPm1vZGVbMl0gPSBiLT5tb2RlWzBdOworICAgICAgICAgICAgICAgIGxbMV0gPSBhWzFdID0gYi0+bW9kZVszXSA9IGItPm1vZGVbMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiLT5tb2RlWzBdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludHJhbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA5X2RlZmF1bHRfa2ZfeW1vZGVfcHJvYnNbKmFdWypsXSk7CisgICAgICAgICAgICBiLT5tb2RlWzNdID0gYi0+bW9kZVsyXSA9IGItPm1vZGVbMV0gPSBiLT5tb2RlWzBdOworICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBjYW4gcHJvYmFibHkgYmUgb3B0aW1pemVkCisgICAgICAgICAgICBtZW1zZXQoYSwgYi0+bW9kZVswXSwgYndoX3RhYlswXVtiLT5ic11bMF0pOworICAgICAgICAgICAgbWVtc2V0KGwsIGItPm1vZGVbMF0sIGJ3aF90YWJbMF1bYi0+YnNdWzFdKTsKKyAgICAgICAgfQorICAgICAgICBiLT51dm1vZGUgPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfaW50cmFtb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA5X2RlZmF1bHRfa2ZfdXZtb2RlX3Byb2JzW2ItPm1vZGVbM11dKTsKKyAgICB9IGVsc2UgaWYgKGItPmludHJhKSB7CisgICAgICAgIGItPmNvbXAgPSAwOworICAgICAgICBpZiAoYi0+YnMgPiBCU184eDgpIHsKKyAgICAgICAgICAgIGItPm1vZGVbMF0gPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfaW50cmFtb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAueV9tb2RlWzBdKTsKKyAgICAgICAgICAgIHMtPmNvdW50cy55X21vZGVbMF1bYi0+bW9kZVswXV0rKzsKKyAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU184eDQpIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzFdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludHJhbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC55X21vZGVbMF0pOworICAgICAgICAgICAgICAgIHMtPmNvdW50cy55X21vZGVbMF1bYi0+bW9kZVsxXV0rKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYi0+bW9kZVsxXSA9IGItPm1vZGVbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYi0+YnMgIT0gQlNfNHg4KSB7CisgICAgICAgICAgICAgICAgYi0+bW9kZVsyXSA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9pbnRyYW1vZGVfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAueV9tb2RlWzBdKTsKKyAgICAgICAgICAgICAgICBzLT5jb3VudHMueV9tb2RlWzBdW2ItPm1vZGVbMl1dKys7CisgICAgICAgICAgICAgICAgaWYgKGItPmJzICE9IEJTXzh4NCkgeworICAgICAgICAgICAgICAgICAgICBiLT5tb2RlWzNdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludHJhbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAueV9tb2RlWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+Y291bnRzLnlfbW9kZVswXVtiLT5tb2RlWzNdXSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSBiLT5tb2RlWzJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYi0+bW9kZVsyXSA9IGItPm1vZGVbMF07CisgICAgICAgICAgICAgICAgYi0+bW9kZVszXSA9IGItPm1vZGVbMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBzaXplX2dyb3VwWzEwXSA9IHsKKyAgICAgICAgICAgICAgICAzLCAzLCAzLCAzLCAyLCAyLCAyLCAxLCAxLCAxCisgICAgICAgICAgICB9OworICAgICAgICAgICAgaW50IHN6ID0gc2l6ZV9ncm91cFtiLT5ic107CisKKyAgICAgICAgICAgIGItPm1vZGVbMF0gPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfaW50cmFtb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAueV9tb2RlW3N6XSk7CisgICAgICAgICAgICBiLT5tb2RlWzFdID0gYi0+bW9kZVsyXSA9IGItPm1vZGVbM10gPSBiLT5tb2RlWzBdOworICAgICAgICAgICAgcy0+Y291bnRzLnlfbW9kZVtzel1bYi0+bW9kZVszXV0rKzsKKyAgICAgICAgfQorICAgICAgICBiLT51dm1vZGUgPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfaW50cmFtb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLnV2X21vZGVbYi0+bW9kZVszXV0pOworICAgICAgICBzLT5jb3VudHMudXZfbW9kZVtiLT5tb2RlWzNdXVtiLT51dm1vZGVdKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW50ZXJfbW9kZV9jdHhfbHV0WzE0XVsxNF0gPSB7CisgICAgICAgICAgICB7IDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUgfSwKKyAgICAgICAgICAgIHsgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSB9LAorICAgICAgICAgICAgeyA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1IH0sCisgICAgICAgICAgICB7IDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUgfSwKKyAgICAgICAgICAgIHsgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSB9LAorICAgICAgICAgICAgeyA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1IH0sCisgICAgICAgICAgICB7IDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUgfSwKKyAgICAgICAgICAgIHsgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSB9LAorICAgICAgICAgICAgeyA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1IH0sCisgICAgICAgICAgICB7IDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUgfSwKKyAgICAgICAgICAgIHsgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgMiwgMiwgMSwgMyB9LAorICAgICAgICAgICAgeyA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCAyLCAyLCAxLCAzIH0sCisgICAgICAgICAgICB7IDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDEsIDEsIDAsIDMgfSwKKyAgICAgICAgICAgIHsgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgMywgMywgMywgNCB9LAorICAgICAgICB9OworCisgICAgICAgIGlmIChzLT5zZWdtZW50YXRpb24uZmVhdFtiLT5zZWdfaWRdLnJlZl9lbmFibGVkKSB7CisgICAgICAgICAgICBhdl9hc3NlcnQyKHMtPnNlZ21lbnRhdGlvbi5mZWF0W2ItPnNlZ19pZF0ucmVmX3ZhbCAhPSAwKTsKKyAgICAgICAgICAgIGItPmNvbXAgPSAwOworICAgICAgICAgICAgYi0+cmVmWzBdID0gcy0+c2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5yZWZfdmFsIC0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHJlYWQgY29tcF9wcmVkIGZsYWcKKyAgICAgICAgICAgIGlmIChzLT5jb21wcHJlZG1vZGUgIT0gUFJFRF9TV0lUQ0hBQkxFKSB7CisgICAgICAgICAgICAgICAgYi0+Y29tcCA9IHMtPmNvbXBwcmVkbW9kZSA9PSBQUkVEX0NPTVBSRUY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBjOworCisgICAgICAgICAgICAgICAgLy8gRklYTUUgYWRkIGludHJhIGFzIHJlZj0weGZmIChvciAtMSkgdG8gbWFrZSB0aGVzZSBlYXNpZXI/CisgICAgICAgICAgICAgICAgaWYgKGhhdmVfYSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZV9sKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+YWJvdmVfY29tcF9jdHhbY29sXSAmJiBzLT5sZWZ0X2NvbXBfY3R4W3JvdzddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMiArIChzLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxlZnRfcmVmX2N0eFtyb3c3XSA9PSBzLT5maXhjb21wcmVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+bGVmdF9jb21wX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyICsgKHMtPmFib3ZlX2ludHJhX2N0eFtjb2xdIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IHMtPmZpeGNvbXByZWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKCFzLT5hYm92ZV9pbnRyYV9jdHhbY29sXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IHMtPmZpeGNvbXByZWYpIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIXMtPmxlZnRfaW50cmFfY3R4W3JvdzddICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxlZnRfcmVmX2N0eFtyb3cgJiA3XSA9PSBzLT5maXhjb21wcmVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLT5hYm92ZV9jb21wX2N0eFtjb2xdID8gMyA6CisgICAgICAgICAgICAgICAgICAgICAgICAoIXMtPmFib3ZlX2ludHJhX2N0eFtjb2xdICYmIHMtPmFib3ZlX3JlZl9jdHhbY29sXSA9PSBzLT5maXhjb21wcmVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGF2ZV9sKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBzLT5sZWZ0X2NvbXBfY3R4W3JvdzddID8gMyA6CisgICAgICAgICAgICAgICAgICAgICghcy0+bGVmdF9pbnRyYV9jdHhbcm93N10gJiYgcy0+bGVmdF9yZWZfY3R4W3JvdzddID09IHMtPmZpeGNvbXByZWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiLT5jb21wID0gdnA1Nl9yYWNfZ2V0X3Byb2IoJnMtPmMsIHMtPnByb2IucC5jb21wW2NdKTsKKyAgICAgICAgICAgICAgICBzLT5jb3VudHMuY29tcFtjXVtiLT5jb21wXSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZWFkIGFjdHVhbCByZWZlcmVuY2VzCisgICAgICAgICAgICAvLyBGSVhNRSBwcm9iYWJseSBjYWNoZSBhIGZldyB2YXJpYWJsZXMgaGVyZSB0byBwcmV2ZW50IHJlcGV0aXRpdmUKKyAgICAgICAgICAgIC8vIG1lbW9yeSBhY2Nlc3NlcyBiZWxvdworICAgICAgICAgICAgaWYgKGItPmNvbXApIC8qIHR3byByZWZlcmVuY2VzICovIHsKKyAgICAgICAgICAgICAgICBpbnQgZml4X2lkeCA9IHMtPnNpZ25iaWFzW3MtPmZpeGNvbXByZWZdLCB2YXJfaWR4ID0gIWZpeF9pZHgsIGMsIGJpdDsKKworICAgICAgICAgICAgICAgIGItPnJlZltmaXhfaWR4XSA9IHMtPmZpeGNvbXByZWY7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgY2FuIHRoaXMgY29kZWJsb2IgYmUgcmVwbGFjZWQgYnkgc29tZSBzb3J0IG9mIExVVD8KKyAgICAgICAgICAgICAgICBpZiAoaGF2ZV9hKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlX2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5hYm92ZV9pbnRyYV9jdHhbY29sXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArIDIgKiAocy0+bGVmdF9yZWZfY3R4W3JvdzddICE9IHMtPnZhcmNvbXByZWZbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArIDIgKiAocy0+YWJvdmVfcmVmX2N0eFtjb2xdICE9IHMtPnZhcmNvbXByZWZbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVmbCA9IHMtPmxlZnRfcmVmX2N0eFtyb3c3XSwgcmVmYSA9IHMtPmFib3ZlX3JlZl9jdHhbY29sXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZsID09IHJlZmEgJiYgcmVmYSA9PSBzLT52YXJjb21wcmVmWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXMtPmxlZnRfY29tcF9jdHhbcm93N10gJiYgIXMtPmFib3ZlX2NvbXBfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZWZhID09IHMtPmZpeGNvbXByZWYgJiYgcmVmbCA9PSBzLT52YXJjb21wcmVmWzBdKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlZmwgPT0gcy0+Zml4Y29tcHJlZiAmJiByZWZhID09IHMtPnZhcmNvbXByZWZbMF0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAocmVmYSA9PSByZWZsKSA/IDMgOiAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcy0+bGVmdF9jb21wX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmYSA9PSBzLT52YXJjb21wcmVmWzFdICYmIHJlZmwgIT0gcy0+dmFyY29tcHJlZlsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKHJlZmwgPT0gcy0+dmFyY29tcHJlZlsxXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZhICE9IHMtPnZhcmNvbXByZWZbMV0pID8gMiA6IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZsID09IHMtPnZhcmNvbXByZWZbMV0gJiYgcmVmYSAhPSBzLT52YXJjb21wcmVmWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAocmVmYSA9PSBzLT52YXJjb21wcmVmWzFdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmwgIT0gcy0+dmFyY29tcHJlZlsxXSkgPyAyIDogNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAocmVmbCA9PSByZWZhKSA/IDQgOiAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5hYm92ZV9pbnRyYV9jdHhbY29sXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDQgKiAocy0+YWJvdmVfcmVmX2N0eFtjb2xdICE9IHMtPnZhcmNvbXByZWZbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMyAqIChzLT5hYm92ZV9yZWZfY3R4W2NvbF0gIT0gcy0+dmFyY29tcHJlZlsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhdmVfbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKHMtPmxlZnRfcmVmX2N0eFtyb3c3XSAhPSBzLT52YXJjb21wcmVmWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAzICogKHMtPmxlZnRfcmVmX2N0eFtyb3c3XSAhPSBzLT52YXJjb21wcmVmWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiaXQgPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLmNvbXBfcmVmW2NdKTsKKyAgICAgICAgICAgICAgICBiLT5yZWZbdmFyX2lkeF0gPSBzLT52YXJjb21wcmVmW2JpdF07CisgICAgICAgICAgICAgICAgcy0+Y291bnRzLmNvbXBfcmVmW2NdW2JpdF0rKzsKKyAgICAgICAgICAgIH0gZWxzZSAvKiBzaW5nbGUgcmVmZXJlbmNlICovIHsKKyAgICAgICAgICAgICAgICBpbnQgYml0LCBjOworCisgICAgICAgICAgICAgICAgaWYgKGhhdmVfYSAmJiAhcy0+YWJvdmVfaW50cmFfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVfbCAmJiAhcy0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5sZWZ0X2NvbXBfY3R4W3JvdzddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDEgKyAoIXMtPmZpeGNvbXByZWYgfHwgIXMtPmxlZnRfcmVmX2N0eFtyb3c3XSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcy0+YWJvdmVfcmVmX2N0eFtjb2xdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKDMgKiAhcy0+YWJvdmVfcmVmX2N0eFtjb2xdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIXMtPmZpeGNvbXByZWYgfHwgIXMtPmxlZnRfcmVmX2N0eFtyb3c3XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICgzICogIXMtPmxlZnRfcmVmX2N0eFtyb3c3XSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIXMtPmZpeGNvbXByZWYgfHwgIXMtPmFib3ZlX3JlZl9jdHhbY29sXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyICogIXMtPmxlZnRfcmVmX2N0eFtyb3c3XSArIDIgKiAhcy0+YWJvdmVfcmVmX2N0eFtjb2xdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmFib3ZlX2ludHJhX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArICghcy0+Zml4Y29tcHJlZiB8fCAhcy0+YWJvdmVfcmVmX2N0eFtjb2xdKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKCFzLT5hYm92ZV9yZWZfY3R4W2NvbF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYXZlX2wgJiYgIXMtPmxlZnRfaW50cmFfY3R4W3JvdzddKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+bGVmdF9jb21wX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDEgKyAoIXMtPmZpeGNvbXByZWYgfHwgIXMtPmxlZnRfcmVmX2N0eFtyb3c3XSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gNCAqICghcy0+bGVmdF9yZWZfY3R4W3JvdzddKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiaXQgPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLnNpbmdsZV9yZWZbY11bMF0pOworICAgICAgICAgICAgICAgIHMtPmNvdW50cy5zaW5nbGVfcmVmW2NdWzBdW2JpdF0rKzsKKyAgICAgICAgICAgICAgICBpZiAoIWJpdCkgeworICAgICAgICAgICAgICAgICAgICBiLT5yZWZbMF0gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNhbiB0aGlzIGNvZGVibG9iIGJlIHJlcGxhY2VkIGJ5IHNvbWUgc29ydCBvZiBMVVQ/CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlX2EpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlX2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmFib3ZlX2ludHJhX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArIDIgKiAocy0+Zml4Y29tcHJlZiA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzLT5hYm92ZV9yZWZfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDQgKiAocy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9pbnRyYV9jdHhbY29sXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxICsgMiAqIChzLT5maXhjb21wcmVmID09IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXMtPmxlZnRfcmVmX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gNCAqIChzLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gcy0+YWJvdmVfcmVmX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMgKiAocy0+Zml4Y29tcHJlZiA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcy0+bGVmdF9yZWZfY3R4W3JvdzddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArIDIgKiAocy0+Zml4Y29tcHJlZiA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMgKiAocy0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5maXhjb21wcmVmID09IDEgfHwgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5sZWZ0X2NvbXBfY3R4W3JvdzddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy0+YWJvdmVfcmVmX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArIDIgKiAocy0+Zml4Y29tcHJlZiA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMgKiAocy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5maXhjb21wcmVmID09IDEgfHwgcy0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcy0+YWJvdmVfcmVmX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy0+bGVmdF9yZWZfY3R4W3JvdzddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKHMtPmxlZnRfcmVmX2N0eFtyb3c3XSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXMtPmxlZnRfcmVmX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gNCAqIChzLT5hYm92ZV9yZWZfY3R4W2NvbF0gPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDIgKiAocy0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIChzLT5hYm92ZV9yZWZfY3R4W2NvbF0gPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+YWJvdmVfaW50cmFfY3R4W2NvbF0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzLT5hYm92ZV9jb21wX2N0eFtjb2xdICYmICFzLT5hYm92ZV9yZWZfY3R4W2NvbF0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+YWJvdmVfY29tcF9jdHhbY29sXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMyAqIChzLT5maXhjb21wcmVmID09IDEgfHwgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKHMtPmFib3ZlX3JlZl9jdHhbY29sXSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGF2ZV9sKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+bGVmdF9pbnRyYV9jdHhbcm93N10gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIXMtPmxlZnRfY29tcF9jdHhbcm93N10gJiYgIXMtPmxlZnRfcmVmX2N0eFtyb3c3XSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+bGVmdF9jb21wX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAzICogKHMtPmZpeGNvbXByZWYgPT0gMSB8fCBzLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKHMtPmxlZnRfcmVmX2N0eFtyb3c3XSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJpdCA9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAuc2luZ2xlX3JlZltjXVsxXSk7CisgICAgICAgICAgICAgICAgICAgIHMtPmNvdW50cy5zaW5nbGVfcmVmW2NdWzFdW2JpdF0rKzsKKyAgICAgICAgICAgICAgICAgICAgYi0+cmVmWzBdID0gMSArIGJpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYi0+YnMgPD0gQlNfOHg4KSB7CisgICAgICAgICAgICBpZiAocy0+c2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5za2lwX2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzBdID0gYi0+bW9kZVsxXSA9IGItPm1vZGVbMl0gPSBiLT5tb2RlWzNdID0gWkVST01WOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBvZmZbMTBdID0geworICAgICAgICAgICAgICAgICAgICAzLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgbmVlZHMgdG8gdXNlIHRoZSBMVVQgdGFibGVzIGZyb20gZmluZF9yZWZfbXZzCisgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBub3QgYWxsIGFyZSAtMSwwLzAsLTEKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGludGVyX21vZGVfY3R4X2x1dFtzLT5hYm92ZV9tb2RlX2N0eFtjb2wgKyBvZmZbYi0+YnNdXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzLT5sZWZ0X21vZGVfY3R4W3JvdzcgKyBvZmZbYi0+YnNdXV07CisKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzBdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludGVyX21vZGVfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfbW9kZVtjXSk7CisgICAgICAgICAgICAgICAgYi0+bW9kZVsxXSA9IGItPm1vZGVbMl0gPSBiLT5tb2RlWzNdID0gYi0+bW9kZVswXTsKKyAgICAgICAgICAgICAgICBzLT5jb3VudHMubXZfbW9kZVtjXVtiLT5tb2RlWzBdIC0gMTBdKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+ZmlsdGVybW9kZSA9PSBGSUxURVJfU1dJVENIQUJMRSkgeworICAgICAgICAgICAgaW50IGM7CisKKyAgICAgICAgICAgIGlmIChoYXZlX2EgJiYgcy0+YWJvdmVfbW9kZV9jdHhbY29sXSA+PSBORUFSRVNUTVYpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGF2ZV9sICYmIHMtPmxlZnRfbW9kZV9jdHhbcm93N10gPj0gTkVBUkVTVE1WKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBzLT5hYm92ZV9maWx0ZXJfY3R4W2NvbF0gPT0gcy0+bGVmdF9maWx0ZXJfY3R4W3JvdzddID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxlZnRfZmlsdGVyX2N0eFtyb3c3XSA6IDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHMtPmFib3ZlX2ZpbHRlcl9jdHhbY29sXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGhhdmVfbCAmJiBzLT5sZWZ0X21vZGVfY3R4W3JvdzddID49IE5FQVJFU1RNVikgeworICAgICAgICAgICAgICAgIGMgPSBzLT5sZWZ0X2ZpbHRlcl9jdHhbcm93N107CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMgPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWx0ZXJfaWQgPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfZmlsdGVyX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC5maWx0ZXJbY10pOworICAgICAgICAgICAgcy0+Y291bnRzLmZpbHRlcltjXVtmaWx0ZXJfaWRdKys7CisgICAgICAgICAgICBiLT5maWx0ZXIgPSB2cDlfZmlsdGVyX2x1dFtmaWx0ZXJfaWRdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYi0+ZmlsdGVyID0gcy0+ZmlsdGVybW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiLT5icyA+IEJTXzh4OCkgeworICAgICAgICAgICAgaW50IGMgPSBpbnRlcl9tb2RlX2N0eF9sdXRbcy0+YWJvdmVfbW9kZV9jdHhbY29sXV1bcy0+bGVmdF9tb2RlX2N0eFtyb3c3XV07CisKKyAgICAgICAgICAgIGItPm1vZGVbMF0gPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfaW50ZXJfbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X21vZGVbY10pOworICAgICAgICAgICAgcy0+Y291bnRzLm12X21vZGVbY11bYi0+bW9kZVswXSAtIDEwXSsrOworICAgICAgICAgICAgZmlsbF9tdihzLCBiLT5tdlswXSwgYi0+bW9kZVswXSwgMCk7CisKKyAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU184eDQpIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzFdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludGVyX21vZGVfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfbW9kZVtjXSk7CisgICAgICAgICAgICAgICAgcy0+Y291bnRzLm12X21vZGVbY11bYi0+bW9kZVsxXSAtIDEwXSsrOworICAgICAgICAgICAgICAgIGZpbGxfbXYocywgYi0+bXZbMV0sIGItPm1vZGVbMV0sIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzFdID0gYi0+bW9kZVswXTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzFdWzBdLCAmYi0+bXZbMF1bMF0pOworICAgICAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbMV1bMV0sICZiLT5tdlswXVsxXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU180eDgpIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzJdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludGVyX21vZGVfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfbW9kZVtjXSk7CisgICAgICAgICAgICAgICAgcy0+Y291bnRzLm12X21vZGVbY11bYi0+bW9kZVsyXSAtIDEwXSsrOworICAgICAgICAgICAgICAgIGZpbGxfbXYocywgYi0+bXZbMl0sIGItPm1vZGVbMl0sIDIpOworCisgICAgICAgICAgICAgICAgaWYgKGItPmJzICE9IEJTXzh4NCkgeworICAgICAgICAgICAgICAgICAgICBiLT5tb2RlWzNdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludGVyX21vZGVfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X21vZGVbY10pOworICAgICAgICAgICAgICAgICAgICBzLT5jb3VudHMubXZfbW9kZVtjXVtiLT5tb2RlWzNdIC0gMTBdKys7CisgICAgICAgICAgICAgICAgICAgIGZpbGxfbXYocywgYi0+bXZbM10sIGItPm1vZGVbM10sIDMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSBiLT5tb2RlWzJdOworICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzNdWzBdLCAmYi0+bXZbMl1bMF0pOworICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzNdWzFdLCAmYi0+bXZbMl1bMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYi0+bW9kZVsyXSA9IGItPm1vZGVbMF07CisgICAgICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlsyXVswXSwgJmItPm12WzBdWzBdKTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzJdWzFdLCAmYi0+bXZbMF1bMV0pOworICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSBiLT5tb2RlWzFdOworICAgICAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbM11bMF0sICZiLT5tdlsxXVswXSk7CisgICAgICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlszXVsxXSwgJmItPm12WzFdWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxfbXYocywgYi0+bXZbMF0sIGItPm1vZGVbMF0sIC0xKTsKKyAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbMV1bMF0sICZiLT5tdlswXVswXSk7CisgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzJdWzBdLCAmYi0+bXZbMF1bMF0pOworICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlszXVswXSwgJmItPm12WzBdWzBdKTsKKyAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbMV1bMV0sICZiLT5tdlswXVsxXSk7CisgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzJdWzFdLCAmYi0+bXZbMF1bMV0pOworICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlszXVsxXSwgJmItPm12WzBdWzFdKTsKKyAgICAgICAgfQorCisgICAgICAgIHZyZWYgPSBiLT5yZWZbYi0+Y29tcCA/IHMtPnNpZ25iaWFzW3MtPnZhcmNvbXByZWZbMF1dIDogMF07CisgICAgfQorCisjaWYgSEFWRV9GQVNUXzY0QklUCisjZGVmaW5lIFNQTEFUX0NUWCh2YXIsIHZhbCwgbikgXAorICAgIHN3aXRjaCAobikgeyBcCisgICAgY2FzZSAxOiAgdmFyID0gdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgY2FzZSAyOiAgQVZfV04xNkEoJnZhciwgdmFsICogICAgICAgICAgICAgMHgwMTAxKTsgICAgIGJyZWFrOyBcCisgICAgY2FzZSA0OiAgQVZfV04zMkEoJnZhciwgdmFsICogICAgICAgICAweDAxMDEwMTAxKTsgICAgIGJyZWFrOyBcCisgICAgY2FzZSA4OiAgQVZfV042NEEoJnZhciwgdmFsICogMHgwMTAxMDEwMTAxMDEwMTAxVUxMKTsgIGJyZWFrOyBcCisgICAgY2FzZSAxNjogeyBcCisgICAgICAgIHVpbnQ2NF90IHY2NCA9IHZhbCAqIDB4MDEwMTAxMDEwMTAxMDEwMVVMTDsgXAorICAgICAgICBBVl9XTjY0QSggICAgICAgICAgICAgICZ2YXIsICAgICB2NjQpOyBcCisgICAgICAgIEFWX1dONjRBKCYoKHVpbnQ4X3QgKikgJnZhcilbOF0sIHY2NCk7IFwKKyAgICAgICAgYnJlYWs7IFwKKyAgICB9IFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBTUExBVF9DVFgodmFyLCB2YWwsIG4pIFwKKyAgICBzd2l0Y2ggKG4pIHsgXAorICAgIGNhc2UgMTogIHZhciA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IFwKKyAgICBjYXNlIDI6ICBBVl9XTjE2QSgmdmFyLCB2YWwgKiAgICAgMHgwMTAxKTsgIGJyZWFrOyBcCisgICAgY2FzZSA0OiAgQVZfV04zMkEoJnZhciwgdmFsICogMHgwMTAxMDEwMSk7ICBicmVhazsgXAorICAgIGNhc2UgODogeyBcCisgICAgICAgIHVpbnQzMl90IHYzMiA9IHZhbCAqIDB4MDEwMTAxMDE7IFwKKyAgICAgICAgQVZfV04zMkEoICAgICAgICAgICAgICAmdmFyLCAgICAgdjMyKTsgXAorICAgICAgICBBVl9XTjMyQSgmKCh1aW50OF90ICopICZ2YXIpWzRdLCB2MzIpOyBcCisgICAgICAgIGJyZWFrOyBcCisgICAgfSBcCisgICAgY2FzZSAxNjogeyBcCisgICAgICAgIHVpbnQzMl90IHYzMiA9IHZhbCAqIDB4MDEwMTAxMDE7IFwKKyAgICAgICAgQVZfV04zMkEoICAgICAgICAgICAgICAmdmFyLCAgICAgIHYzMik7IFwKKyAgICAgICAgQVZfV04zMkEoJigodWludDhfdCAqKSAmdmFyKVs0XSwgIHYzMik7IFwKKyAgICAgICAgQVZfV04zMkEoJigodWludDhfdCAqKSAmdmFyKVs4XSwgIHYzMik7IFwKKyAgICAgICAgQVZfV04zMkEoJigodWludDhfdCAqKSAmdmFyKVsxMl0sIHYzMik7IFwKKyAgICAgICAgYnJlYWs7IFwKKyAgICB9IFwKKyAgICB9CisjZW5kaWYKKworICAgIHN3aXRjaCAoYndoX3RhYlsxXVtiLT5ic11bMF0pIHsKKyNkZWZpbmUgU0VUX0NUWFMoZGlyLCBvZmYsIG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgU1BMQVRfQ1RYKHMtPmRpciMjX3NraXBfY3R4W29mZl0sICAgICAgYi0+c2tpcCwgICAgICAgICAgbik7IFwKKyAgICAgICAgU1BMQVRfQ1RYKHMtPmRpciMjX3R4Zm1fY3R4W29mZl0sICAgICAgYi0+dHgsICAgICAgICAgICAgbik7IFwKKyAgICAgICAgU1BMQVRfQ1RYKHMtPmRpciMjX3BhcnRpdGlvbl9jdHhbb2ZmXSwgZGlyIyNfY3R4W2ItPmJzXSwgbik7IFwKKyAgICAgICAgaWYgKCFzLT5rZXlmcmFtZSAmJiAhcy0+aW50cmFvbmx5KSB7IFwKKyAgICAgICAgICAgIFNQTEFUX0NUWChzLT5kaXIjI19pbnRyYV9jdHhbb2ZmXSwgYi0+aW50cmEsICAgbik7IFwKKyAgICAgICAgICAgIFNQTEFUX0NUWChzLT5kaXIjI19jb21wX2N0eFtvZmZdLCAgYi0+Y29tcCwgICAgbik7IFwKKyAgICAgICAgICAgIFNQTEFUX0NUWChzLT5kaXIjI19tb2RlX2N0eFtvZmZdLCAgYi0+bW9kZVszXSwgbik7IFwKKyAgICAgICAgICAgIGlmICghYi0+aW50cmEpIHsgXAorICAgICAgICAgICAgICAgIFNQTEFUX0NUWChzLT5kaXIjI19yZWZfY3R4W29mZl0sIHZyZWYsIG4pOyBcCisgICAgICAgICAgICAgICAgaWYgKHMtPmZpbHRlcm1vZGUgPT0gRklMVEVSX1NXSVRDSEFCTEUpIHsgXAorICAgICAgICAgICAgICAgICAgICBTUExBVF9DVFgocy0+ZGlyIyNfZmlsdGVyX2N0eFtvZmZdLCBmaWx0ZXJfaWQsIG4pOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKyAgICBjYXNlIDE6IFNFVF9DVFhTKGFib3ZlLCBjb2wsIDEpOyBicmVhazsKKyAgICBjYXNlIDI6IFNFVF9DVFhTKGFib3ZlLCBjb2wsIDIpOyBicmVhazsKKyAgICBjYXNlIDQ6IFNFVF9DVFhTKGFib3ZlLCBjb2wsIDQpOyBicmVhazsKKyAgICBjYXNlIDg6IFNFVF9DVFhTKGFib3ZlLCBjb2wsIDgpOyBicmVhazsKKyAgICB9CisgICAgc3dpdGNoIChid2hfdGFiWzFdW2ItPmJzXVsxXSkgeworICAgIGNhc2UgMTogU0VUX0NUWFMobGVmdCwgcm93NywgMSk7IGJyZWFrOworICAgIGNhc2UgMjogU0VUX0NUWFMobGVmdCwgcm93NywgMik7IGJyZWFrOworICAgIGNhc2UgNDogU0VUX0NUWFMobGVmdCwgcm93NywgNCk7IGJyZWFrOworICAgIGNhc2UgODogU0VUX0NUWFMobGVmdCwgcm93NywgOCk7IGJyZWFrOworICAgIH0KKyN1bmRlZiBTUExBVF9DVFgKKyN1bmRlZiBTRVRfQ1RYUworCisgICAgaWYgKCFzLT5rZXlmcmFtZSAmJiAhcy0+aW50cmFvbmx5KSB7CisgICAgICAgIGlmIChiLT5icyA+IEJTXzh4OCkgeworICAgICAgICAgICAgaW50IG12MCA9IEFWX1JOMzJBKCZiLT5tdlszXVswXSksIG12MSA9IEFWX1JOMzJBKCZiLT5tdlszXVsxXSk7CisKKyAgICAgICAgICAgIEFWX0NPUFkzMigmcy0+bGVmdF9tdl9jdHhbcm93NyAqIDIgKyAwXVswXSwgJmItPm12WzFdWzBdKTsKKyAgICAgICAgICAgIEFWX0NPUFkzMigmcy0+bGVmdF9tdl9jdHhbcm93NyAqIDIgKyAwXVsxXSwgJmItPm12WzFdWzFdKTsKKyAgICAgICAgICAgIEFWX1dOMzJBKCZzLT5sZWZ0X212X2N0eFtyb3c3ICogMiArIDFdWzBdLCBtdjApOworICAgICAgICAgICAgQVZfV04zMkEoJnMtPmxlZnRfbXZfY3R4W3JvdzcgKiAyICsgMV1bMV0sIG12MSk7CisgICAgICAgICAgICBBVl9DT1BZMzIoJnMtPmFib3ZlX212X2N0eFtjb2wgKiAyICsgMF1bMF0sICZiLT5tdlsyXVswXSk7CisgICAgICAgICAgICBBVl9DT1BZMzIoJnMtPmFib3ZlX212X2N0eFtjb2wgKiAyICsgMF1bMV0sICZiLT5tdlsyXVsxXSk7CisgICAgICAgICAgICBBVl9XTjMyQSgmcy0+YWJvdmVfbXZfY3R4W2NvbCAqIDIgKyAxXVswXSwgbXYwKTsKKyAgICAgICAgICAgIEFWX1dOMzJBKCZzLT5hYm92ZV9tdl9jdHhbY29sICogMiArIDFdWzFdLCBtdjEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IG4sIG12MCA9IEFWX1JOMzJBKCZiLT5tdlszXVswXSksIG12MSA9IEFWX1JOMzJBKCZiLT5tdlszXVsxXSk7CisKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCB3NCAqIDI7IG4rKykgeworICAgICAgICAgICAgICAgIEFWX1dOMzJBKCZzLT5hYm92ZV9tdl9jdHhbY29sICogMiArIG5dWzBdLCBtdjApOworICAgICAgICAgICAgICAgIEFWX1dOMzJBKCZzLT5hYm92ZV9tdl9jdHhbY29sICogMiArIG5dWzFdLCBtdjEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGg0ICogMjsgbisrKSB7CisgICAgICAgICAgICAgICAgQVZfV04zMkEoJnMtPmxlZnRfbXZfY3R4W3JvdzcgKiAyICsgbl1bMF0sIG12MCk7CisgICAgICAgICAgICAgICAgQVZfV04zMkEoJnMtPmxlZnRfbXZfY3R4W3JvdzcgKiAyICsgbl1bMV0sIG12MSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGSVhNRSBraW5kYSB1Z2x5CisgICAgZm9yICh5ID0gMDsgeSA8IGg0OyB5KyspIHsKKyAgICAgICAgaW50IHgsIG8gPSAocm93ICsgeSkgKiBzLT5zYl9jb2xzICogOCArIGNvbDsKKyAgICAgICAgc3RydWN0IFZQOW12cmVmUGFpciAqbXYgPSAmcy0+ZnJhbWVzW0NVUl9GUkFNRV0ubXZbb107CisKKyAgICAgICAgaWYgKGItPmludHJhKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzQ7IHgrKykgeworICAgICAgICAgICAgICAgIG12W3hdLnJlZlswXSA9CisgICAgICAgICAgICAgICAgbXZbeF0ucmVmWzFdID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYi0+Y29tcCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc0OyB4KyspIHsKKyAgICAgICAgICAgICAgICBtdlt4XS5yZWZbMF0gPSBiLT5yZWZbMF07CisgICAgICAgICAgICAgICAgbXZbeF0ucmVmWzFdID0gYi0+cmVmWzFdOworICAgICAgICAgICAgICAgIEFWX0NPUFkzMigmbXZbeF0ubXZbMF0sICZiLT5tdlszXVswXSk7CisgICAgICAgICAgICAgICAgQVZfQ09QWTMyKCZtdlt4XS5tdlsxXSwgJmItPm12WzNdWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3NDsgeCsrKSB7CisgICAgICAgICAgICAgICAgbXZbeF0ucmVmWzBdID0gYi0+cmVmWzBdOworICAgICAgICAgICAgICAgIG12W3hdLnJlZlsxXSA9IC0xOworICAgICAgICAgICAgICAgIEFWX0NPUFkzMigmbXZbeF0ubXZbMF0sICZiLT5tdlszXVswXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEZJWE1FIG1lcmdlIGNudC9lb2IgYXJndW1lbnRzPworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50CitkZWNvZGVfY29lZmZzX2JfZ2VuZXJpYyhWUDU2UmFuZ2VDb2RlciAqYywgaW50MTZfdCAqY29lZiwgaW50IG5fY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3R4MzJ4MzIsIHVuc2lnbmVkICgqY250KVs2XVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICgqZW9iKVs2XVsyXSwgdWludDhfdCAoKnApWzZdWzExXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBubnosIGNvbnN0IGludDE2X3QgKnNjYW4sIGNvbnN0IGludDE2X3QgKCpuYilbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpiYW5kX2NvdW50cywgY29uc3QgaW50MTZfdCAqcW11bCkKK3sKKyAgICBpbnQgaSA9IDAsIGJhbmQgPSAwLCBiYW5kX2xlZnQgPSBiYW5kX2NvdW50c1tiYW5kXTsKKyAgICB1aW50OF90ICp0cCA9IHBbMF1bbm56XTsKKyAgICB1aW50OF90IGNhY2hlWzEwMjRdOworCisgICAgZG8geworICAgICAgICBpbnQgdmFsLCByYzsKKworICAgICAgICB2YWwgPSB2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzBdKTsgLy8gZW9iCisgICAgICAgIGVvYltiYW5kXVtubnpdW3ZhbF0rKzsKKyAgICAgICAgaWYgKCF2YWwpCisgICAgICAgICAgICBicmVhazsKKworICAgIHNraXBfZW9iOgorICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbMV0pKSB7IC8vIHplcm8KKyAgICAgICAgICAgIGNudFtiYW5kXVtubnpdWzBdKys7CisgICAgICAgICAgICBpZiAoIS0tYmFuZF9sZWZ0KQorICAgICAgICAgICAgICAgIGJhbmRfbGVmdCA9IGJhbmRfY291bnRzWysrYmFuZF07CisgICAgICAgICAgICBjYWNoZVtzY2FuW2ldXSA9IDA7CisgICAgICAgICAgICBubnogPSAoMSArIGNhY2hlW25iW2ldWzBdXSArIGNhY2hlW25iW2ldWzFdXSkgPj4gMTsKKyAgICAgICAgICAgIHRwID0gcFtiYW5kXVtubnpdOworICAgICAgICAgICAgaWYgKCsraSA9PSBuX2NvZWZmcykKKyAgICAgICAgICAgICAgICBicmVhazsgLy9pbnZhbGlkIGlucHV0OyBibG9ja3Mgc2hvdWxkIGVuZCB3aXRoIEVPQgorICAgICAgICAgICAgZ290byBza2lwX2VvYjsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gc2NhbltpXTsKKyAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzJdKSkgeyAvLyBvbmUKKyAgICAgICAgICAgIGNudFtiYW5kXVtubnpdWzFdKys7CisgICAgICAgICAgICB2YWwgPSAxOworICAgICAgICAgICAgY2FjaGVbcmNdID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGZpbGwgaW4gcFszLTEwXSAobW9kZWwgZmlsbCkgLSBvbmx5IG9uY2UgcGVyIGZyYW1lIGZvciBlYWNoIHBvcworICAgICAgICAgICAgaWYgKCF0cFszXSkKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnRwWzNdLCB2cDlfbW9kZWxfcGFyZXRvOFt0cFsyXV0sIDgpOworCisgICAgICAgICAgICBjbnRbYmFuZF1bbm56XVsyXSsrOworICAgICAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzNdKSkgeyAvLyAyLCAzLCA0CisgICAgICAgICAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzRdKSkgeworICAgICAgICAgICAgICAgICAgICBjYWNoZVtyY10gPSB2YWwgPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IDMgKyB2cDU2X3JhY19nZXRfcHJvYihjLCB0cFs1XSk7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlW3JjXSA9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB0cFs2XSkpIHsgLy8gY2F0MS8yCisgICAgICAgICAgICAgICAgY2FjaGVbcmNdID0gNDsKKyAgICAgICAgICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbN10pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IDUgKyB2cDU2X3JhY19nZXRfcHJvYihjLCAxNTkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbCAgPSA3ICsgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE2NSkgPDwgMSk7CisgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgIHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0NSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gY2F0IDMtNgorICAgICAgICAgICAgICAgIGNhY2hlW3JjXSA9IDU7CisgICAgICAgICAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzhdKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbOV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgID0gMTEgKyAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTczKSA8PCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNDgpIDw8IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgIHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0MCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgID0gMTkgKyAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTc2KSA8PCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNTUpIDw8IDIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0MCkgPDwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAgdnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTM1KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbMTBdKSkgeworICAgICAgICAgICAgICAgICAgICB2YWwgID0gMzUgKyAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTgwKSA8PCA0KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE1NykgPDwgMyk7CisgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNDEpIDw8IDIpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTM0KSA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgIHZwNTZfcmFjX2dldF9wcm9iKGMsIDEzMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsICA9IDY3ICsgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDI1NCkgPDwgMTMpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMjU0KSA8PCAxMik7CisgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAyNTQpIDw8IDExKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDI1MikgPDwgMTApOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMjQ5KSA8PCA5KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDI0MykgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAyMzApIDw8IDcpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTk2KSA8PCA2KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE3NykgPDwgNSk7CisgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNTMpIDw8IDQpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTQwKSA8PCAzKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDEzMykgPDwgMik7CisgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxMzApIDw8IDEpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAgdnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTI5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEtLWJhbmRfbGVmdCkKKyAgICAgICAgICAgIGJhbmRfbGVmdCA9IGJhbmRfY291bnRzWysrYmFuZF07CisgICAgICAgIGlmIChpc190eDMyeDMyKQorICAgICAgICAgICAgY29lZltyY10gPSAoKHZwOF9yYWNfZ2V0KGMpID8gLXZhbCA6IHZhbCkgKiBxbXVsWyEhaV0pIC8gMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29lZltyY10gPSAodnA4X3JhY19nZXQoYykgPyAtdmFsIDogdmFsKSAqIHFtdWxbISFpXTsKKyAgICAgICAgbm56ID0gKDEgKyBjYWNoZVtuYltpXVswXV0gKyBjYWNoZVtuYltpXVsxXV0pID4+IDE7CisgICAgICAgIHRwID0gcFtiYW5kXVtubnpdOworICAgIH0gd2hpbGUgKCsraSA8IG5fY29lZmZzKTsKKworICAgIHJldHVybiBpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jb2VmZnNfYihWUDU2UmFuZ2VDb2RlciAqYywgaW50MTZfdCAqY29lZiwgaW50IG5fY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKCpjbnQpWzZdWzNdLCB1bnNpZ25lZCAoKmVvYilbNl1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICgqcClbNl1bMTFdLCBpbnQgbm56LCBjb25zdCBpbnQxNl90ICpzY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAoKm5iKVsyXSwgY29uc3QgaW50MTZfdCAqYmFuZF9jb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpxbXVsKQoreworICAgIHJldHVybiBkZWNvZGVfY29lZmZzX2JfZ2VuZXJpYyhjLCBjb2VmLCBuX2NvZWZmcywgMCwgY250LCBlb2IsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ueiwgc2NhbiwgbmIsIGJhbmRfY291bnRzLCBxbXVsKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfY29lZmZzX2IzMihWUDU2UmFuZ2VDb2RlciAqYywgaW50MTZfdCAqY29lZiwgaW50IG5fY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAoKmNudClbNl1bM10sIHVuc2lnbmVkICgqZW9iKVs2XVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAoKnApWzZdWzExXSwgaW50IG5ueiwgY29uc3QgaW50MTZfdCAqc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAoKm5iKVsyXSwgY29uc3QgaW50MTZfdCAqYmFuZF9jb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnFtdWwpCit7CisgICAgcmV0dXJuIGRlY29kZV9jb2VmZnNfYl9nZW5lcmljKGMsIGNvZWYsIG5fY29lZmZzLCAxLCBjbnQsIGVvYiwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm56LCBzY2FuLCBuYiwgYmFuZF9jb3VudHMsIHFtdWwpOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfY29lZmZzKEFWQ29kZWNDb250ZXh0ICpjdHgpCit7CisgICAgVlA5Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIFZQOUJsb2NrICpiID0gcy0+YjsKKyAgICBpbnQgcm93ID0gcy0+cm93LCBjb2wgPSBzLT5jb2w7CisgICAgdWludDhfdCAoKnApWzZdWzExXSA9IHMtPnByb2IuY29lZltiLT50eF1bMCAvKiB5ICovXVshYi0+aW50cmFdOworICAgIHVuc2lnbmVkICgqYylbNl1bM10gPSBzLT5jb3VudHMuY29lZltiLT50eF1bMCAvKiB5ICovXVshYi0+aW50cmFdOworICAgIHVuc2lnbmVkICgqZSlbNl1bMl0gPSBzLT5jb3VudHMuZW9iW2ItPnR4XVswIC8qIHkgKi9dWyFiLT5pbnRyYV07CisgICAgaW50IHc0ID0gYndoX3RhYlsxXVtiLT5ic11bMF0gPDwgMSwgaDQgPSBid2hfdGFiWzFdW2ItPmJzXVsxXSA8PCAxOworICAgIGludCBlbmRfeCA9IEZGTUlOKDIgKiAocy0+Y29scyAtIGNvbCksIHc0KTsKKyAgICBpbnQgZW5kX3kgPSBGRk1JTigyICogKHMtPnJvd3MgLSByb3cpLCBoNCk7CisgICAgaW50IG4sIHBsLCB4LCB5LCByZXM7CisgICAgaW50MTZfdCAoKnFtdWwpWzJdID0gcy0+c2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5xbXVsOworICAgIGludCB0eCA9IDQgKiBzLT5sb3NzbGVzcyArIGItPnR4OworICAgIGNvbnN0IGludDE2X3QgKiBjb25zdCAqeXNjYW5zID0gdnA5X3NjYW5zW3R4XTsKKyAgICBjb25zdCBpbnQxNl90ICgqIGNvbnN0ICp5bmJzKVsyXSA9IHZwOV9zY2Fuc19uYlt0eF07CisgICAgY29uc3QgaW50MTZfdCAqdXZzY2FuID0gdnA5X3NjYW5zW2ItPnV2dHhdW0RDVF9EQ1RdOworICAgIGNvbnN0IGludDE2X3QgKCp1dm5iKVsyXSA9IHZwOV9zY2Fuc19uYltiLT51dnR4XVtEQ1RfRENUXTsKKyAgICB1aW50OF90ICphID0gJnMtPmFib3ZlX3lfbm56X2N0eFtjb2wgKiAyXTsKKyAgICB1aW50OF90ICpsID0gJnMtPmxlZnRfeV9ubnpfY3R4Wyhyb3cgJiA3KSA8PCAxXTsKKyAgICBzdGF0aWMgY29uc3QgaW50MTZfdCBiYW5kX2NvdW50c1s0XVs4XSA9IHsKKyAgICAgICAgeyAxLCAyLCAzLCA0LCAgMywgICAxNiAtIDEzIH0sCisgICAgICAgIHsgMSwgMiwgMywgNCwgMTEsICAgNjQgLSAyMSB9LAorICAgICAgICB7IDEsIDIsIDMsIDQsIDExLCAgMjU2IC0gMjEgfSwKKyAgICAgICAgeyAxLCAyLCAzLCA0LCAxMSwgMTAyNCAtIDIxIH0sCisgICAgfTsKKyAgICBjb25zdCBpbnQxNl90ICp5X2JhbmRfY291bnRzID0gYmFuZF9jb3VudHNbYi0+dHhdOworICAgIGNvbnN0IGludDE2X3QgKnV2X2JhbmRfY291bnRzID0gYmFuZF9jb3VudHNbYi0+dXZ0eF07CisKKyNkZWZpbmUgTUVSR0UobGEsIGVuZCwgc3RlcCwgcmQpIFwKKyAgICBmb3IgKG4gPSAwOyBuIDwgZW5kOyBuICs9IHN0ZXApIFwKKyAgICAgICAgbGFbbl0gPSAhIXJkKCZsYVtuXSkKKyNkZWZpbmUgTUVSR0VfQ1RYKHN0ZXAsIHJkKSBcCisgICAgZG8geyBcCisgICAgICAgIE1FUkdFKGwsIGVuZF95LCBzdGVwLCByZCk7IFwKKyAgICAgICAgTUVSR0UoYSwgZW5kX3gsIHN0ZXAsIHJkKTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgREVDT0RFX1lfQ09FRl9MT09QKHN0ZXAsIG1vZGVfaW5kZXgsIHYpIFwKKyAgICBmb3IgKG4gPSAwLCB5ID0gMDsgeSA8IGVuZF95OyB5ICs9IHN0ZXApIHsgXAorICAgICAgICBmb3IgKHggPSAwOyB4IDwgZW5kX3g7IHggKz0gc3RlcCwgbiArPSBzdGVwICogc3RlcCkgeyBcCisgICAgICAgICAgICBlbnVtIFR4Zm1UeXBlIHR4dHAgPSB2cDlfaW50cmFfdHhmbV90eXBlW2ItPm1vZGVbbW9kZV9pbmRleF1dOyBcCisgICAgICAgICAgICByZXMgPSBkZWNvZGVfY29lZmZzX2IjI3YoJnMtPmMsIHMtPmJsb2NrICsgMTYgKiBuLCAxNiAqIHN0ZXAgKiBzdGVwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywgZSwgcCwgYVt4XSArIGxbeV0sIHlzY2Fuc1t0eHRwXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHluYnNbdHh0cF0sIHlfYmFuZF9jb3VudHMsIHFtdWxbMF0pOyBcCisgICAgICAgICAgICBhW3hdID0gbFt5XSA9ICEhcmVzOyBcCisgICAgICAgICAgICBpZiAoc3RlcCA+PSA0KSB7IFwKKyAgICAgICAgICAgICAgICBBVl9XTjE2QSgmcy0+ZW9iW25dLCByZXMpOyBcCisgICAgICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICAgICAgcy0+ZW9iW25dID0gcmVzOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZGVmaW5lIFNQTEFUKGxhLCBlbmQsIHN0ZXAsIGNvbmQpIFwKKyAgICBpZiAoc3RlcCA9PSAyKSB7IFwKKyAgICAgICAgZm9yIChuID0gMTsgbiA8IGVuZDsgbiArPSBzdGVwKSBcCisgICAgICAgICAgICBsYVtuXSA9IGxhW24gLSAxXTsgXAorICAgIH0gZWxzZSBpZiAoc3RlcCA9PSA0KSB7IFwKKyAgICAgICAgaWYgKGNvbmQpIHsgXAorICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGVuZDsgbiArPSBzdGVwKSBcCisgICAgICAgICAgICAgICAgQVZfV04zMkEoJmxhW25dLCBsYVtuXSAqIDB4MDEwMTAxMDEpOyBcCisgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBlbmQ7IG4gKz0gc3RlcCkgXAorICAgICAgICAgICAgICAgIG1lbXNldCgmbGFbbiArIDFdLCBsYVtuXSwgRkZNSU4oZW5kIC0gbiAtIDEsIDMpKTsgXAorICAgICAgICB9IFwKKyAgICB9IGVsc2UgLyogc3RlcCA9PSA4ICovIHsgXAorICAgICAgICBpZiAoY29uZCkgeyBcCisgICAgICAgICAgICBpZiAoSEFWRV9GQVNUXzY0QklUKSB7IFwKKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZW5kOyBuICs9IHN0ZXApIFwKKyAgICAgICAgICAgICAgICAgICAgQVZfV042NEEoJmxhW25dLCBsYVtuXSAqIDB4MDEwMTAxMDEwMTAxMDEwMVVMTCk7IFwKKyAgICAgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZW5kOyBuICs9IHN0ZXApIHsgXAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2MzIgPSBsYVtuXSAqIDB4MDEwMTAxMDE7IFwKKyAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEoJmxhW25dLCAgICAgdjMyKTsgXAorICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQSgmbGFbbiArIDRdLCB2MzIpOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGVuZDsgbiArPSBzdGVwKSBcCisgICAgICAgICAgICAgICAgbWVtc2V0KCZsYVtuICsgMV0sIGxhW25dLCBGRk1JTihlbmQgLSBuIC0gMSwgNykpOyBcCisgICAgICAgIH0gXAorICAgIH0KKyNkZWZpbmUgU1BMQVRfQ1RYKHN0ZXApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgU1BMQVQoYSwgZW5kX3gsIHN0ZXAsIGVuZF94ID09IHc0KTsgXAorICAgICAgICBTUExBVChsLCBlbmRfeSwgc3RlcCwgZW5kX3kgPT0gaDQpOyBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIC8qIHkgdG9rZW5zICovCisgICAgc3dpdGNoIChiLT50eCkgeworICAgIGNhc2UgVFhfNFg0OgorICAgICAgICBERUNPREVfWV9DT0VGX0xPT1AoMSwgYi0+YnMgPiBCU184eDggPyBuIDogMCwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRYXzhYODoKKyAgICAgICAgTUVSR0VfQ1RYKDIsIEFWX1JOMTZBKTsKKyAgICAgICAgREVDT0RFX1lfQ09FRl9MT09QKDIsIDAsKTsKKyAgICAgICAgU1BMQVRfQ1RYKDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRYXzE2WDE2OgorICAgICAgICBNRVJHRV9DVFgoNCwgQVZfUk4zMkEpOworICAgICAgICBERUNPREVfWV9DT0VGX0xPT1AoNCwgMCwpOworICAgICAgICBTUExBVF9DVFgoNCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFhfMzJYMzI6CisgICAgICAgIE1FUkdFX0NUWCg4LCBBVl9STjY0QSk7CisgICAgICAgIERFQ09ERV9ZX0NPRUZfTE9PUCg4LCAwLCAzMik7CisgICAgICAgIFNQTEFUX0NUWCg4KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjZGVmaW5lIERFQ09ERV9VVl9DT0VGX0xPT1Aoc3RlcCkgXAorICAgIGZvciAobiA9IDAsIHkgPSAwOyB5IDwgZW5kX3k7IHkgKz0gc3RlcCkgeyBcCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBlbmRfeDsgeCArPSBzdGVwLCBuICs9IHN0ZXAgKiBzdGVwKSB7IFwKKyAgICAgICAgICAgIHJlcyA9IGRlY29kZV9jb2VmZnNfYigmcy0+Yywgcy0+dXZibG9ja1twbF0gKyAxNiAqIG4sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAqIHN0ZXAgKiBzdGVwLCBjLCBlLCBwLCBhW3hdICsgbFt5XSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c2NhbiwgdXZuYiwgdXZfYmFuZF9jb3VudHMsIHFtdWxbMV0pOyBcCisgICAgICAgICAgICBhW3hdID0gbFt5XSA9ICEhcmVzOyBcCisgICAgICAgICAgICBpZiAoc3RlcCA+PSA0KSB7IFwKKyAgICAgICAgICAgICAgICBBVl9XTjE2QSgmcy0+dXZlb2JbcGxdW25dLCByZXMpOyBcCisgICAgICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICAgICAgcy0+dXZlb2JbcGxdW25dID0gcmVzOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfQorCisgICAgcCA9IHMtPnByb2IuY29lZltiLT51dnR4XVsxIC8qIHV2ICovXVshYi0+aW50cmFdOworICAgIGMgPSBzLT5jb3VudHMuY29lZltiLT51dnR4XVsxIC8qIHV2ICovXVshYi0+aW50cmFdOworICAgIGUgPSBzLT5jb3VudHMuZW9iW2ItPnV2dHhdWzEgLyogdXYgKi9dWyFiLT5pbnRyYV07CisgICAgdzQgPj49IDE7CisgICAgaDQgPj49IDE7CisgICAgZW5kX3ggPj49IDE7CisgICAgZW5kX3kgPj49IDE7CisgICAgZm9yIChwbCA9IDA7IHBsIDwgMjsgcGwrKykgeworICAgICAgICBhID0gJnMtPmFib3ZlX3V2X25uel9jdHhbcGxdW2NvbF07CisgICAgICAgIGwgPSAmcy0+bGVmdF91dl9ubnpfY3R4W3BsXVtyb3cgJiA3XTsKKyAgICAgICAgc3dpdGNoIChiLT51dnR4KSB7CisgICAgICAgIGNhc2UgVFhfNFg0OgorICAgICAgICAgICAgREVDT0RFX1VWX0NPRUZfTE9PUCgxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRYXzhYODoKKyAgICAgICAgICAgIE1FUkdFX0NUWCgyLCBBVl9STjE2QSk7CisgICAgICAgICAgICBERUNPREVfVVZfQ09FRl9MT09QKDIpOworICAgICAgICAgICAgU1BMQVRfQ1RYKDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFhfMTZYMTY6CisgICAgICAgICAgICBNRVJHRV9DVFgoNCwgQVZfUk4zMkEpOworICAgICAgICAgICAgREVDT0RFX1VWX0NPRUZfTE9PUCg0KTsKKyAgICAgICAgICAgIFNQTEFUX0NUWCg0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRYXzMyWDMyOgorICAgICAgICAgICAgTUVSR0VfQ1RYKDgsIEFWX1JONjRBKTsKKyAgICAgICAgICAgIC8vIGEgNjR4NjQgKG1heCkgdXYgYmxvY2sgY2FuIGV2ZXIgb25seSBjb250YWluIDEgdHgzMngzMiBibG9jaworICAgICAgICAgICAgLy8gc28gdGhlcmUgaXMgbm8gbmVlZCB0byBsb29wCisgICAgICAgICAgICByZXMgPSBkZWNvZGVfY29lZmZzX2IzMigmcy0+Yywgcy0+dXZibG9ja1twbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0LCBjLCBlLCBwLCBhWzBdICsgbFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c2NhbiwgdXZuYiwgdXZfYmFuZF9jb3VudHMsIHFtdWxbMV0pOworICAgICAgICAgICAgYVswXSA9IGxbMF0gPSAhIXJlczsKKyAgICAgICAgICAgIEFWX1dOMTZBKCZzLT51dmVvYltwbF1bMF0sIHJlcyk7CisgICAgICAgICAgICBTUExBVF9DVFgoOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGNoZWNrX2ludHJhX21vZGUoVlA5Q29udGV4dCAqcywgaW50IG1vZGUsIHVpbnQ4X3QgKiphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0X2VkZ2UsIHB0cmRpZmZfdCBzdHJpZGVfZWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdF9pbm5lciwgcHRyZGlmZl90IHN0cmlkZV9pbm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmwsIGludCBjb2wsIGludCB4LCBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCB5LCBlbnVtIFR4Zm1Nb2RlIHR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHApCit7CisgICAgaW50IGhhdmVfdG9wID0gcm93ID4gMCB8fCB5ID4gMDsKKyAgICBpbnQgaGF2ZV9sZWZ0ID0gY29sID4gcy0+dGlsaW5nLnRpbGVfY29sX3N0YXJ0IHx8IHggPiAwOworICAgIGludCBoYXZlX3JpZ2h0ID0geCA8IHcgLSAxOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG1vZGVfY29udlsxMF1bMiAvKiBoYXZlX2xlZnQgKi9dWzIgLyogaGF2ZV90b3AgKi9dID0geworICAgICAgICBbVkVSVF9QUkVEXSAgICAgICAgICAgID0geyB7IERDXzEyN19QUkVELCAgICAgICAgICBWRVJUX1BSRUQgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBEQ18xMjdfUFJFRCwgICAgICAgICAgVkVSVF9QUkVEIH0gfSwKKyAgICAgICAgW0hPUl9QUkVEXSAgICAgICAgICAgICA9IHsgeyBEQ18xMjlfUFJFRCwgICAgICAgICAgRENfMTI5X1BSRUQgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBIT1JfUFJFRCwgICAgICAgICAgICAgSE9SX1BSRUQgfSB9LAorICAgICAgICBbRENfUFJFRF0gICAgICAgICAgICAgID0geyB7IERDXzEyOF9QUkVELCAgICAgICAgICBUT1BfRENfUFJFRCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IExFRlRfRENfUFJFRCwgICAgICAgICBEQ19QUkVEIH0gfSwKKyAgICAgICAgW0RJQUdfRE9XTl9MRUZUX1BSRURdICA9IHsgeyBEQ18xMjdfUFJFRCwgICAgICAgICAgRElBR19ET1dOX0xFRlRfUFJFRCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IERDXzEyN19QUkVELCAgICAgICAgICBESUFHX0RPV05fTEVGVF9QUkVEIH0gfSwKKyAgICAgICAgW0RJQUdfRE9XTl9SSUdIVF9QUkVEXSA9IHsgeyBESUFHX0RPV05fUklHSFRfUFJFRCwgRElBR19ET1dOX1JJR0hUX1BSRUQgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBESUFHX0RPV05fUklHSFRfUFJFRCwgRElBR19ET1dOX1JJR0hUX1BSRUQgfSB9LAorICAgICAgICBbVkVSVF9SSUdIVF9QUkVEXSAgICAgID0geyB7IFZFUlRfUklHSFRfUFJFRCwgICAgICBWRVJUX1JJR0hUX1BSRUQgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBWRVJUX1JJR0hUX1BSRUQsICAgICAgVkVSVF9SSUdIVF9QUkVEIH0gfSwKKyAgICAgICAgW0hPUl9ET1dOX1BSRURdICAgICAgICA9IHsgeyBIT1JfRE9XTl9QUkVELCAgICAgICAgSE9SX0RPV05fUFJFRCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEhPUl9ET1dOX1BSRUQsICAgICAgICBIT1JfRE9XTl9QUkVEIH0gfSwKKyAgICAgICAgW1ZFUlRfTEVGVF9QUkVEXSAgICAgICA9IHsgeyBEQ18xMjdfUFJFRCwgICAgICAgICAgVkVSVF9MRUZUX1BSRUQgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBEQ18xMjdfUFJFRCwgICAgICAgICAgVkVSVF9MRUZUX1BSRUQgfSB9LAorICAgICAgICBbSE9SX1VQX1BSRURdICAgICAgICAgID0geyB7IERDXzEyOV9QUkVELCAgICAgICAgICBEQ18xMjlfUFJFRCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEhPUl9VUF9QUkVELCAgICAgICAgICBIT1JfVVBfUFJFRCB9IH0sCisgICAgICAgIFtUTV9WUDhfUFJFRF0gICAgICAgICAgPSB7IHsgRENfMTI5X1BSRUQsICAgICAgICAgIFZFUlRfUFJFRCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEhPUl9QUkVELCAgICAgICAgICAgICBUTV9WUDhfUFJFRCB9IH0sCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgdWludDhfdCBuZWVkc19sZWZ0OjE7CisgICAgICAgIHVpbnQ4X3QgbmVlZHNfdG9wOjE7CisgICAgICAgIHVpbnQ4X3QgbmVlZHNfdG9wbGVmdDoxOworICAgICAgICB1aW50OF90IG5lZWRzX3RvcHJpZ2h0OjE7CisgICAgfSBlZGdlc1tOX0lOVFJBX1BSRURfTU9ERVNdID0geworICAgICAgICBbVkVSVF9QUkVEXSAgICAgICAgICAgID0geyAubmVlZHNfdG9wICA9IDEgfSwKKyAgICAgICAgW0hPUl9QUkVEXSAgICAgICAgICAgICA9IHsgLm5lZWRzX2xlZnQgPSAxIH0sCisgICAgICAgIFtEQ19QUkVEXSAgICAgICAgICAgICAgPSB7IC5uZWVkc190b3AgID0gMSwgLm5lZWRzX2xlZnQgPSAxIH0sCisgICAgICAgIFtESUFHX0RPV05fTEVGVF9QUkVEXSAgPSB7IC5uZWVkc190b3AgID0gMSwgLm5lZWRzX3RvcHJpZ2h0ID0gMSB9LAorICAgICAgICBbRElBR19ET1dOX1JJR0hUX1BSRURdID0geyAubmVlZHNfbGVmdCA9IDEsIC5uZWVkc190b3AgPSAxLCAubmVlZHNfdG9wbGVmdCA9IDEgfSwKKyAgICAgICAgW1ZFUlRfUklHSFRfUFJFRF0gICAgICA9IHsgLm5lZWRzX2xlZnQgPSAxLCAubmVlZHNfdG9wID0gMSwgLm5lZWRzX3RvcGxlZnQgPSAxIH0sCisgICAgICAgIFtIT1JfRE9XTl9QUkVEXSAgICAgICAgPSB7IC5uZWVkc19sZWZ0ID0gMSwgLm5lZWRzX3RvcCA9IDEsIC5uZWVkc190b3BsZWZ0ID0gMSB9LAorICAgICAgICBbVkVSVF9MRUZUX1BSRURdICAgICAgID0geyAubmVlZHNfdG9wICA9IDEsIC5uZWVkc190b3ByaWdodCA9IDEgfSwKKyAgICAgICAgW0hPUl9VUF9QUkVEXSAgICAgICAgICA9IHsgLm5lZWRzX2xlZnQgPSAxIH0sCisgICAgICAgIFtUTV9WUDhfUFJFRF0gICAgICAgICAgPSB7IC5uZWVkc19sZWZ0ID0gMSwgLm5lZWRzX3RvcCA9IDEsIC5uZWVkc190b3BsZWZ0ID0gMSB9LAorICAgICAgICBbTEVGVF9EQ19QUkVEXSAgICAgICAgID0geyAubmVlZHNfbGVmdCA9IDEgfSwKKyAgICAgICAgW1RPUF9EQ19QUkVEXSAgICAgICAgICA9IHsgLm5lZWRzX3RvcCAgPSAxIH0sCisgICAgICAgIFtEQ18xMjhfUFJFRF0gICAgICAgICAgPSB7IDAgfSwKKyAgICAgICAgW0RDXzEyN19QUkVEXSAgICAgICAgICA9IHsgMCB9LAorICAgICAgICBbRENfMTI5X1BSRURdICAgICAgICAgID0geyAwIH0KKyAgICB9OworCisgICAgYXZfYXNzZXJ0Mihtb2RlID49IDAgJiYgbW9kZSA8IDEwKTsKKyAgICBtb2RlID0gbW9kZV9jb252W21vZGVdW2hhdmVfbGVmdF1baGF2ZV90b3BdOworICAgIGlmIChlZGdlc1ttb2RlXS5uZWVkc190b3ApIHsKKyAgICAgICAgdWludDhfdCAqdG9wLCAqdG9wbGVmdDsKKyAgICAgICAgaW50IG5fcHhfbmVlZCA9IDQgPDwgdHgsIG5fcHhfaGF2ZSA9ICgoKHMtPmNvbHMgLSBjb2wpIDw8ICFwKSAtIHgpICogNDsKKyAgICAgICAgaW50IG5fcHhfbmVlZF90ciA9IDA7CisKKyAgICAgICAgaWYgKHR4ID09IFRYXzRYNCAmJiBlZGdlc1ttb2RlXS5uZWVkc190b3ByaWdodCAmJiBoYXZlX3JpZ2h0KQorICAgICAgICAgICAgbl9weF9uZWVkX3RyID0gNDsKKworICAgICAgICAvLyBpZiB0b3Agb2Ygc2I2NC1yb3csIHVzZSBzLT5pbnRyYV9wcmVkX2RhdGFbXSBpbnN0ZWFkIG9mCisgICAgICAgIC8vIGRzdFstc3RyaWRlXSBmb3IgaW50cmEgcHJlZGljdGlvbiAoaXQgY29udGFpbnMgcHJlLSBpbnN0ZWFkIG9mCisgICAgICAgIC8vIHBvc3QtbG9vcGZpbHRlciBkYXRhKQorICAgICAgICBpZiAoaGF2ZV90b3ApIHsKKyAgICAgICAgICAgIHRvcCA9ICEocm93ICYgNykgJiYgIXkgPworICAgICAgICAgICAgICAgIHMtPmludHJhX3ByZWRfZGF0YVtwXSArIGNvbCAqICg4ID4+ICEhcCkgKyB4ICogNCA6CisgICAgICAgICAgICAgICAgeSA9PSAwID8gJmRzdF9lZGdlWy1zdHJpZGVfZWRnZV0gOiAmZHN0X2lubmVyWy1zdHJpZGVfaW5uZXJdOworICAgICAgICAgICAgaWYgKGhhdmVfbGVmdCkKKyAgICAgICAgICAgICAgICB0b3BsZWZ0ID0gIShyb3cgJiA3KSAmJiAheSA/CisgICAgICAgICAgICAgICAgICAgIHMtPmludHJhX3ByZWRfZGF0YVtwXSArIGNvbCAqICg4ID4+ICEhcCkgKyB4ICogNCA6CisgICAgICAgICAgICAgICAgICAgIHkgPT0gMCB8fCB4ID09IDAgPyAmZHN0X2VkZ2VbLXN0cmlkZV9lZGdlXSA6CisgICAgICAgICAgICAgICAgICAgICZkc3RfaW5uZXJbLXN0cmlkZV9pbm5lcl07CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGF2ZV90b3AgJiYKKyAgICAgICAgICAgICghZWRnZXNbbW9kZV0ubmVlZHNfdG9wbGVmdCB8fCAoaGF2ZV9sZWZ0ICYmIHRvcCA9PSB0b3BsZWZ0KSkgJiYKKyAgICAgICAgICAgICh0eCAhPSBUWF80WDQgfHwgIWVkZ2VzW21vZGVdLm5lZWRzX3RvcHJpZ2h0IHx8IGhhdmVfcmlnaHQpICYmCisgICAgICAgICAgICBuX3B4X25lZWQgKyBuX3B4X25lZWRfdHIgPD0gbl9weF9oYXZlKSB7CisgICAgICAgICAgICAqYSA9IHRvcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChoYXZlX3RvcCkgeworICAgICAgICAgICAgICAgIGlmIChuX3B4X25lZWQgPD0gbl9weF9oYXZlKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgqYSwgdG9wLCBuX3B4X25lZWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgqYSwgdG9wLCBuX3B4X2hhdmUpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJigqYSlbbl9weF9oYXZlXSwgKCphKVtuX3B4X2hhdmUgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fcHhfbmVlZCAtIG5fcHhfaGF2ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoKmEsIDEyNywgbl9weF9uZWVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlZGdlc1ttb2RlXS5uZWVkc190b3BsZWZ0KSB7CisgICAgICAgICAgICAgICAgaWYgKGhhdmVfbGVmdCAmJiBoYXZlX3RvcCkgeworICAgICAgICAgICAgICAgICAgICAoKmEpWy0xXSA9IHRvcGxlZnRbLTFdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICgqYSlbLTFdID0gaGF2ZV90b3AgPyAxMjkgOiAxMjc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR4ID09IFRYXzRYNCAmJiBlZGdlc1ttb2RlXS5uZWVkc190b3ByaWdodCkgeworICAgICAgICAgICAgICAgIGlmIChoYXZlX3RvcCAmJiBoYXZlX3JpZ2h0ICYmCisgICAgICAgICAgICAgICAgICAgIG5fcHhfbmVlZCArIG5fcHhfbmVlZF90ciA8PSBuX3B4X2hhdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCYoKmEpWzRdLCAmdG9wWzRdLCA0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJigqYSlbNF0sICgqYSlbM10sIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZWRnZXNbbW9kZV0ubmVlZHNfbGVmdCkgeworICAgICAgICBpZiAoaGF2ZV9sZWZ0KSB7CisgICAgICAgICAgICBpbnQgbl9weF9uZWVkID0gNCA8PCB0eCwgaSwgbl9weF9oYXZlID0gKCgocy0+cm93cyAtIHJvdykgPDwgIXApIC0geSkgKiA0OworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0geCA9PSAwID8gZHN0X2VkZ2UgOiBkc3RfaW5uZXI7CisgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlID0geCA9PSAwID8gc3RyaWRlX2VkZ2UgOiBzdHJpZGVfaW5uZXI7CisKKyAgICAgICAgICAgIGlmIChuX3B4X25lZWQgPD0gbl9weF9oYXZlKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5fcHhfbmVlZDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBsW25fcHhfbmVlZCAtIDEgLSBpXSA9IGRzdFtpICogc3RyaWRlIC0gMV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX3B4X2hhdmU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgbFtuX3B4X25lZWQgLSAxIC0gaV0gPSBkc3RbaSAqIHN0cmlkZSAtIDFdOworICAgICAgICAgICAgICAgIG1lbXNldChsLCBsW25fcHhfbmVlZCAtIG5fcHhfaGF2ZV0sIG5fcHhfbmVlZCAtIG5fcHhfaGF2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQobCwgMTI5LCA0IDw8IHR4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtb2RlOworfQorCitzdGF0aWMgdm9pZCBpbnRyYV9yZWNvbihBVkNvZGVjQ29udGV4dCAqY3R4LCBwdHJkaWZmX3QgeV9vZmYsIHB0cmRpZmZfdCB1dl9vZmYpCit7CisgICAgVlA5Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIFZQOUJsb2NrICpiID0gcy0+YjsKKyAgICBpbnQgcm93ID0gcy0+cm93LCBjb2wgPSBzLT5jb2w7CisgICAgaW50IHc0ID0gYndoX3RhYlsxXVtiLT5ic11bMF0gPDwgMSwgc3RlcDFkID0gMSA8PCBiLT50eCwgbjsKKyAgICBpbnQgaDQgPSBid2hfdGFiWzFdW2ItPmJzXVsxXSA8PCAxLCB4LCB5LCBzdGVwID0gMSA8PCAoYi0+dHggKiAyKTsKKyAgICBpbnQgZW5kX3ggPSBGRk1JTigyICogKHMtPmNvbHMgLSBjb2wpLCB3NCk7CisgICAgaW50IGVuZF95ID0gRkZNSU4oMiAqIChzLT5yb3dzIC0gcm93KSwgaDQpOworICAgIGludCB0eCA9IDQgKiBzLT5sb3NzbGVzcyArIGItPnR4LCB1dnR4ID0gYi0+dXZ0eCArIDQgKiBzLT5sb3NzbGVzczsKKyAgICBpbnQgdXZzdGVwMWQgPSAxIDw8IGItPnV2dHgsIHA7CisgICAgdWludDhfdCAqZHN0ID0gcy0+ZHN0WzBdLCAqZHN0X3IgPSBzLT5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mLT5kYXRhWzBdICsgeV9vZmY7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBhX2J1ZiwgWzY0XSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBsLCBbMzJdKTsKKworICAgIGZvciAobiA9IDAsIHkgPSAwOyB5IDwgZW5kX3k7IHkgKz0gc3RlcDFkKSB7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IGRzdCwgKnB0cl9yID0gZHN0X3I7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBlbmRfeDsgeCArPSBzdGVwMWQsIHB0ciArPSA0ICogc3RlcDFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9yICs9IDQgKiBzdGVwMWQsIG4gKz0gc3RlcCkgeworICAgICAgICAgICAgaW50IG1vZGUgPSBiLT5tb2RlW2ItPmJzID4gQlNfOHg4ICYmIGItPnR4ID09IFRYXzRYNCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAqIDIgKyB4IDogMF07CisgICAgICAgICAgICB1aW50OF90ICphID0gJmFfYnVmWzMyXTsKKyAgICAgICAgICAgIGVudW0gVHhmbVR5cGUgdHh0cCA9IHZwOV9pbnRyYV90eGZtX3R5cGVbbW9kZV07CisgICAgICAgICAgICBpbnQgZW9iID0gYi0+c2tpcCA/IDAgOiBiLT50eCA+IFRYXzhYOCA/IEFWX1JOMTZBKCZzLT5lb2Jbbl0pIDogcy0+ZW9iW25dOworCisgICAgICAgICAgICBtb2RlID0gY2hlY2tfaW50cmFfbW9kZShzLCBtb2RlLCAmYSwgcHRyX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgcy0+eV9zdHJpZGUsIGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHgsIHc0LCByb3csIHksIGItPnR4LCAwKTsKKyAgICAgICAgICAgIHMtPmRzcC5pbnRyYV9wcmVkW2ItPnR4XVttb2RlXShwdHIsIHMtPnlfc3RyaWRlLCBsLCBhKTsKKyAgICAgICAgICAgIGlmIChlb2IpCisgICAgICAgICAgICAgICAgcy0+ZHNwLml0eGZtX2FkZFt0eF1bdHh0cF0ocHRyLCBzLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9jayArIDE2ICogbiwgZW9iKTsKKyAgICAgICAgfQorICAgICAgICBkc3RfciArPSA0ICogc3RlcDFkICogcy0+ZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+bGluZXNpemVbMF07CisgICAgICAgIGRzdCAgICs9IDQgKiBzdGVwMWQgKiBzLT55X3N0cmlkZTsKKyAgICB9CisKKyAgICAvLyBVL1YKKyAgICB3NCA+Pj0gMTsKKyAgICBlbmRfeCA+Pj0gMTsKKyAgICBlbmRfeSA+Pj0gMTsKKyAgICBzdGVwID0gMSA8PCAoYi0+dXZ0eCAqIDIpOworICAgIGZvciAocCA9IDA7IHAgPCAyOyBwKyspIHsKKyAgICAgICAgZHN0ICAgPSBzLT5kc3RbMSArIHBdOworICAgICAgICBkc3RfciA9IHMtPmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmRhdGFbMSArIHBdICsgdXZfb2ZmOworICAgICAgICBmb3IgKG4gPSAwLCB5ID0gMDsgeSA8IGVuZF95OyB5ICs9IHV2c3RlcDFkKSB7CisgICAgICAgICAgICB1aW50OF90ICpwdHIgPSBkc3QsICpwdHJfciA9IGRzdF9yOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGVuZF94OyB4ICs9IHV2c3RlcDFkLCBwdHIgKz0gNCAqIHV2c3RlcDFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfciArPSA0ICogdXZzdGVwMWQsIG4gKz0gc3RlcCkgeworICAgICAgICAgICAgICAgIGludCBtb2RlID0gYi0+dXZtb2RlOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmEgPSAmYV9idWZbMTZdOworICAgICAgICAgICAgICAgIGludCBlb2IgPSBiLT5za2lwID8gMCA6IGItPnV2dHggPiBUWF84WDggPyBBVl9STjE2QSgmcy0+dXZlb2JbcF1bbl0pIDogcy0+dXZlb2JbcF1bbl07CisKKyAgICAgICAgICAgICAgICBtb2RlID0gY2hlY2tfaW50cmFfbW9kZShzLCBtb2RlLCAmYSwgcHRyX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLCBzLT51dl9zdHJpZGUsIGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCB4LCB3NCwgcm93LCB5LCBiLT51dnR4LCBwICsgMSk7CisgICAgICAgICAgICAgICAgcy0+ZHNwLmludHJhX3ByZWRbYi0+dXZ0eF1bbW9kZV0ocHRyLCBzLT51dl9zdHJpZGUsIGwsIGEpOworICAgICAgICAgICAgICAgIGlmIChlb2IpCisgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5pdHhmbV9hZGRbdXZ0eF1bRENUX0RDVF0ocHRyLCBzLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZibG9ja1twXSArIDE2ICogbiwgZW9iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdF9yICs9IDQgKiB1dnN0ZXAxZCAqIHMtPmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmxpbmVzaXplWzFdOworICAgICAgICAgICAgZHN0ICAgKz0gNCAqIHV2c3RlcDFkICogcy0+dXZfc3RyaWRlOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIG1jX2x1bWFfZGlyKFZQOUNvbnRleHQgKnMsIHZwOV9tY19mdW5jICgqbWMpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWYsIHB0cmRpZmZfdCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRGcmFtZSAqcmVmX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgeSwgcHRyZGlmZl90IHgsIGNvbnN0IFZQNTZtdiAqbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidywgaW50IGJoLCBpbnQgdywgaW50IGgpCit7CisgICAgaW50IG14ID0gbXYtPngsIG15ID0gbXYtPnksIHRoOworCisgICAgeSArPSBteSA+PiAzOworICAgIHggKz0gbXggPj4gMzsKKyAgICByZWYgKz0geSAqIHJlZl9zdHJpZGUgKyB4OworICAgIG14ICY9IDc7CisgICAgbXkgJj0gNzsKKyAgICAvLyBGSVhNRSBiaWxpbmVhciBmaWx0ZXIgb25seSBuZWVkcyAwLzEgcGl4ZWxzLCBub3QgMy80CisgICAgLy8gd2UgdXNlICs3IGJlY2F1c2UgdGhlIGxhc3QgNyBwaXhlbHMgb2YgZWFjaCBzYnJvdyBjYW4gYmUgY2hhbmdlZCBpbgorICAgIC8vIHRoZSBsb25nZXN0IGxvb3BmaWx0ZXIgb2YgdGhlIG5leHQgc2Jyb3cKKyAgICB0aCA9ICh5ICsgYmggKyA0ICogISFteSArIDcpID4+IDY7CisgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKHJlZl9mcmFtZSwgRkZNQVgodGgsIDApLCAwKTsKKyAgICBpZiAoeCA8ICEhbXggKiAzIHx8IHkgPCAhIW15ICogMyB8fAorICAgICAgICB4ICsgISFteCAqIDQgPiB3IC0gYncgfHwgeSArICEhbXkgKiA0ID4gaCAtIGJoKSB7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYgLSAhIW15ICogMyAqIHJlZl9zdHJpZGUgLSAhIW14ICogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwLCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncgKyAhIW14ICogNywgYmggKyAhIW15ICogNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLSAhIW14ICogMywgeSAtICEhbXkgKiAzLCB3LCBoKTsKKyAgICAgICAgcmVmID0gcy0+ZWRnZV9lbXVfYnVmZmVyICsgISFteSAqIDMgKiA4MCArICEhbXggKiAzOworICAgICAgICByZWZfc3RyaWRlID0gODA7CisgICAgfQorICAgIG1jWyEhbXhdWyEhbXldKGRzdCwgZHN0X3N0cmlkZSwgcmVmLCByZWZfc3RyaWRlLCBiaCwgbXggPDwgMSwgbXkgPDwgMSk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgbWNfY2hyb21hX2RpcihWUDlDb250ZXh0ICpzLCB2cDlfbWNfZnVuYyAoKm1jKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RfdSwgdWludDhfdCAqZHN0X3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmX3UsIHB0cmRpZmZfdCBzcmNfc3RyaWRlX3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmX3YsIHB0cmRpZmZfdCBzcmNfc3RyaWRlX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkRnJhbWUgKnJlZl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgeSwgcHRyZGlmZl90IHgsIGNvbnN0IFZQNTZtdiAqbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ3LCBpbnQgYmgsIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgbXggPSBtdi0+eCwgbXkgPSBtdi0+eSwgdGg7CisKKyAgICB5ICs9IG15ID4+IDQ7CisgICAgeCArPSBteCA+PiA0OworICAgIHJlZl91ICs9IHkgKiBzcmNfc3RyaWRlX3UgKyB4OworICAgIHJlZl92ICs9IHkgKiBzcmNfc3RyaWRlX3YgKyB4OworICAgIG14ICY9IDE1OworICAgIG15ICY9IDE1OworICAgIC8vIEZJWE1FIGJpbGluZWFyIGZpbHRlciBvbmx5IG5lZWRzIDAvMSBwaXhlbHMsIG5vdCAzLzQKKyAgICAvLyB3ZSB1c2UgKzcgYmVjYXVzZSB0aGUgbGFzdCA3IHBpeGVscyBvZiBlYWNoIHNicm93IGNhbiBiZSBjaGFuZ2VkIGluCisgICAgLy8gdGhlIGxvbmdlc3QgbG9vcGZpbHRlciBvZiB0aGUgbmV4dCBzYnJvdworICAgIHRoID0gKHkgKyBiaCArIDQgKiAhIW15ICsgNykgPj4gNTsKKyAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MocmVmX2ZyYW1lLCBGRk1BWCh0aCwgMCksIDApOworICAgIGlmICh4IDwgISFteCAqIDMgfHwgeSA8ICEhbXkgKiAzIHx8CisgICAgICAgIHggKyAhIW14ICogNCA+IHcgLSBidyB8fCB5ICsgISFteSAqIDQgPiBoIC0gYmgpIHsKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl91IC0gISFteSAqIDMgKiBzcmNfc3RyaWRlX3UgLSAhIW14ICogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwLCBzcmNfc3RyaWRlX3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidyArICEhbXggKiA3LCBiaCArICEhbXkgKiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtICEhbXggKiAzLCB5IC0gISFteSAqIDMsIHcsIGgpOworICAgICAgICByZWZfdSA9IHMtPmVkZ2VfZW11X2J1ZmZlciArICEhbXkgKiAzICogODAgKyAhIW14ICogMzsKKyAgICAgICAgbWNbISFteF1bISFteV0oZHN0X3UsIGRzdF9zdHJpZGUsIHJlZl91LCA4MCwgYmgsIG14LCBteSk7CisKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl92IC0gISFteSAqIDMgKiBzcmNfc3RyaWRlX3YgLSAhIW14ICogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwLCBzcmNfc3RyaWRlX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidyArICEhbXggKiA3LCBiaCArICEhbXkgKiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtICEhbXggKiAzLCB5IC0gISFteSAqIDMsIHcsIGgpOworICAgICAgICByZWZfdiA9IHMtPmVkZ2VfZW11X2J1ZmZlciArICEhbXkgKiAzICogODAgKyAhIW14ICogMzsKKyAgICAgICAgbWNbISFteF1bISFteV0oZHN0X3YsIGRzdF9zdHJpZGUsIHJlZl92LCA4MCwgYmgsIG14LCBteSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWNbISFteF1bISFteV0oZHN0X3UsIGRzdF9zdHJpZGUsIHJlZl91LCBzcmNfc3RyaWRlX3UsIGJoLCBteCwgbXkpOworICAgICAgICBtY1shIW14XVshIW15XShkc3RfdiwgZHN0X3N0cmlkZSwgcmVmX3YsIHNyY19zdHJpZGVfdiwgYmgsIG14LCBteSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpbnRlcl9yZWNvbihBVkNvZGVjQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJ3bG9nX3RhYlsyXVtOX0JTX1NJWkVTXSA9IHsKKyAgICAgICAgeyAwLCAwLCAxLCAxLCAxLCAyLCAyLCAyLCAzLCAzLCAzLCA0LCA0IH0sCisgICAgICAgIHsgMSwgMSwgMiwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNCwgNCB9LAorICAgIH07CisgICAgVlA5Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIFZQOUJsb2NrICpiID0gcy0+YjsKKyAgICBpbnQgcm93ID0gcy0+cm93LCBjb2wgPSBzLT5jb2w7CisgICAgVGhyZWFkRnJhbWUgKnRyZWYxID0gJnMtPnJlZnNbcy0+cmVmaWR4W2ItPnJlZlswXV1dLCAqdHJlZjI7CisgICAgQVZGcmFtZSAqcmVmMSA9IHRyZWYxLT5mLCAqcmVmMjsKKyAgICBpbnQgdzEgPSByZWYxLT53aWR0aCwgaDEgPSByZWYxLT5oZWlnaHQsIHcyLCBoMjsKKyAgICBwdHJkaWZmX3QgbHNfeSA9IHMtPnlfc3RyaWRlLCBsc191diA9IHMtPnV2X3N0cmlkZTsKKworICAgIGlmIChiLT5jb21wKSB7CisgICAgICAgIHRyZWYyID0gJnMtPnJlZnNbcy0+cmVmaWR4W2ItPnJlZlsxXV1dOworICAgICAgICByZWYyID0gdHJlZjItPmY7CisgICAgICAgIHcyID0gcmVmMi0+d2lkdGg7CisgICAgICAgIGgyID0gcmVmMi0+aGVpZ2h0OworICAgIH0KKworICAgIC8vIHkgaW50ZXIgcHJlZAorICAgIGlmIChiLT5icyA+IEJTXzh4OCkgeworICAgICAgICBpZiAoYi0+YnMgPT0gQlNfOHg0KSB7CisgICAgICAgICAgICBtY19sdW1hX2RpcihzLCBzLT5kc3AubWNbM11bYi0+ZmlsdGVyXVswXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVswXSwgcmVmMS0+bGluZXNpemVbMF0sIHRyZWYxLAorICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDMsIGNvbCA8PCAzLCAmYi0+bXZbMF1bMF0sIDgsIDQsIHcxLCBoMSk7CisgICAgICAgICAgICBtY19sdW1hX2RpcihzLCBzLT5kc3AubWNbM11bYi0+ZmlsdGVyXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFswXSArIDQgKiBsc195LCBsc195LAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVswXSwgcmVmMS0+bGluZXNpemVbMF0sIHRyZWYxLAorICAgICAgICAgICAgICAgICAgICAgICAgKHJvdyA8PCAzKSArIDQsIGNvbCA8PCAzLCAmYi0+bXZbMl1bMF0sIDgsIDQsIHcxLCBoMSk7CisKKyAgICAgICAgICAgIGlmIChiLT5jb21wKSB7CisgICAgICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgcy0+ZHNwLm1jWzNdW2ItPmZpbHRlcl1bMV0sIHMtPmRzdFswXSwgbHNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzBdLCByZWYyLT5saW5lc2l6ZVswXSwgdHJlZjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDMsIGNvbCA8PCAzLCAmYi0+bXZbMF1bMV0sIDgsIDQsIHcyLCBoMik7CisgICAgICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgcy0+ZHNwLm1jWzNdW2ItPmZpbHRlcl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzBdICsgNCAqIGxzX3ksIGxzX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVswXSwgcmVmMi0+bGluZXNpemVbMF0sIHRyZWYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3cgPDwgMykgKyA0LCBjb2wgPDwgMywgJmItPm12WzJdWzFdLCA4LCA0LCB3MiwgaDIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGItPmJzID09IEJTXzR4OCkgeworICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgcy0+ZHNwLm1jWzRdW2ItPmZpbHRlcl1bMF0sIHMtPmRzdFswXSwgbHNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMF0sIHJlZjEtPmxpbmVzaXplWzBdLCB0cmVmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAzLCBjb2wgPDwgMywgJmItPm12WzBdWzBdLCA0LCA4LCB3MSwgaDEpOworICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgcy0+ZHNwLm1jWzRdW2ItPmZpbHRlcl1bMF0sIHMtPmRzdFswXSArIDQsIGxzX3ksCisgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzBdLCByZWYxLT5saW5lc2l6ZVswXSwgdHJlZjEsCisgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgKGNvbCA8PCAzKSArIDQsICZiLT5tdlsxXVswXSwgNCwgOCwgdzEsIGgxKTsKKworICAgICAgICAgICAgaWYgKGItPmNvbXApIHsKKyAgICAgICAgICAgICAgICBtY19sdW1hX2RpcihzLCBzLT5kc3AubWNbNF1bYi0+ZmlsdGVyXVsxXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMF0sIHJlZjItPmxpbmVzaXplWzBdLCB0cmVmMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgY29sIDw8IDMsICZiLT5tdlswXVsxXSwgNCwgOCwgdzIsIGgyKTsKKyAgICAgICAgICAgICAgICBtY19sdW1hX2RpcihzLCBzLT5kc3AubWNbNF1bYi0+ZmlsdGVyXVsxXSwgcy0+ZHN0WzBdICsgNCwgbHNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzBdLCByZWYyLT5saW5lc2l6ZVswXSwgdHJlZjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDMsIChjb2wgPDwgMykgKyA0LCAmYi0+bXZbMV1bMV0sIDQsIDgsIHcyLCBoMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9hc3NlcnQyKGItPmJzID09IEJTXzR4NCk7CisKKyAgICAgICAgICAgIC8vIEZJWE1FIGlmIHR3byBob3Jpem9udGFsbHkgYWRqYWNlbnQgYmxvY2tzIGhhdmUgdGhlIHNhbWUgTVYsCisgICAgICAgICAgICAvLyBkbyBhIHc4IGluc3RlYWQgb2YgYSB3NCBjYWxsCisgICAgICAgICAgICBtY19sdW1hX2RpcihzLCBzLT5kc3AubWNbNF1bYi0+ZmlsdGVyXVswXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVswXSwgcmVmMS0+bGluZXNpemVbMF0sIHRyZWYxLAorICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDMsIGNvbCA8PCAzLCAmYi0+bXZbMF1bMF0sIDQsIDQsIHcxLCBoMSk7CisgICAgICAgICAgICBtY19sdW1hX2RpcihzLCBzLT5kc3AubWNbNF1bYi0+ZmlsdGVyXVswXSwgcy0+ZHN0WzBdICsgNCwgbHNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMF0sIHJlZjEtPmxpbmVzaXplWzBdLCB0cmVmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAzLCAoY29sIDw8IDMpICsgNCwgJmItPm12WzFdWzBdLCA0LCA0LCB3MSwgaDEpOworICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgcy0+ZHNwLm1jWzRdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMF0gKyA0ICogbHNfeSwgbHNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMF0sIHJlZjEtPmxpbmVzaXplWzBdLCB0cmVmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyb3cgPDwgMykgKyA0LCBjb2wgPDwgMywgJmItPm12WzJdWzBdLCA0LCA0LCB3MSwgaDEpOworICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgcy0+ZHNwLm1jWzRdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMF0gKyA0ICogbHNfeSArIDQsIGxzX3ksCisgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzBdLCByZWYxLT5saW5lc2l6ZVswXSwgdHJlZjEsCisgICAgICAgICAgICAgICAgICAgICAgICAocm93IDw8IDMpICsgNCwgKGNvbCA8PCAzKSArIDQsICZiLT5tdlszXVswXSwgNCwgNCwgdzEsIGgxKTsKKworICAgICAgICAgICAgaWYgKGItPmNvbXApIHsKKyAgICAgICAgICAgICAgICBtY19sdW1hX2RpcihzLCBzLT5kc3AubWNbNF1bYi0+ZmlsdGVyXVsxXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMF0sIHJlZjItPmxpbmVzaXplWzBdLCB0cmVmMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgY29sIDw8IDMsICZiLT5tdlswXVsxXSwgNCwgNCwgdzIsIGgyKTsKKyAgICAgICAgICAgICAgICBtY19sdW1hX2RpcihzLCBzLT5kc3AubWNbNF1bYi0+ZmlsdGVyXVsxXSwgcy0+ZHN0WzBdICsgNCwgbHNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzBdLCByZWYyLT5saW5lc2l6ZVswXSwgdHJlZjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDMsIChjb2wgPDwgMykgKyA0LCAmYi0+bXZbMV1bMV0sIDQsIDQsIHcyLCBoMik7CisgICAgICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgcy0+ZHNwLm1jWzRdW2ItPmZpbHRlcl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzBdICsgNCAqIGxzX3ksIGxzX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVswXSwgcmVmMi0+bGluZXNpemVbMF0sIHRyZWYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3cgPDwgMykgKyA0LCBjb2wgPDwgMywgJmItPm12WzJdWzFdLCA0LCA0LCB3MiwgaDIpOworICAgICAgICAgICAgICAgIG1jX2x1bWFfZGlyKHMsIHMtPmRzcC5tY1s0XVtiLT5maWx0ZXJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFswXSArIDQgKiBsc195ICsgNCwgbHNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzBdLCByZWYyLT5saW5lc2l6ZVswXSwgdHJlZjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvdyA8PCAzKSArIDQsIChjb2wgPDwgMykgKyA0LCAmYi0+bXZbM11bMV0sIDQsIDQsIHcyLCBoMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgYndsID0gYndsb2dfdGFiWzBdW2ItPmJzXTsKKyAgICAgICAgaW50IGJ3ID0gYndoX3RhYlswXVtiLT5ic11bMF0gKiA0LCBiaCA9IGJ3aF90YWJbMF1bYi0+YnNdWzFdICogNDsKKworICAgICAgICBtY19sdW1hX2RpcihzLCBzLT5kc3AubWNbYndsXVtiLT5maWx0ZXJdWzBdLCBzLT5kc3RbMF0sIGxzX3ksCisgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMF0sIHJlZjEtPmxpbmVzaXplWzBdLCB0cmVmMSwKKyAgICAgICAgICAgICAgICAgICAgcm93IDw8IDMsIGNvbCA8PCAzLCAmYi0+bXZbMF1bMF0sYncsIGJoLCB3MSwgaDEpOworCisgICAgICAgIGlmIChiLT5jb21wKQorICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgcy0+ZHNwLm1jW2J3bF1bYi0+ZmlsdGVyXVsxXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVswXSwgcmVmMi0+bGluZXNpemVbMF0sIHRyZWYyLAorICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDMsIGNvbCA8PCAzLCAmYi0+bXZbMF1bMV0sIGJ3LCBiaCwgdzIsIGgyKTsKKyAgICB9CisKKyAgICAvLyB1diBpbnRlciBwcmVkCisgICAgeworICAgICAgICBpbnQgYndsID0gYndsb2dfdGFiWzFdW2ItPmJzXTsKKyAgICAgICAgaW50IGJ3ID0gYndoX3RhYlsxXVtiLT5ic11bMF0gKiA0LCBiaCA9IGJ3aF90YWJbMV1bYi0+YnNdWzFdICogNDsKKyAgICAgICAgVlA1Nm12IG12dXY7CisKKyAgICAgICAgdzEgPSAodzEgKyAxKSA+PiAxOworICAgICAgICBoMSA9IChoMSArIDEpID4+IDE7CisgICAgICAgIGlmIChiLT5jb21wKSB7CisgICAgICAgICAgICB3MiA9ICh3MiArIDEpID4+IDE7CisgICAgICAgICAgICBoMiA9IChoMiArIDEpID4+IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGItPmJzID4gQlNfOHg4KSB7CisgICAgICAgICAgICBtdnV2LnggPSBST1VOREVEX0RJVihiLT5tdlswXVswXS54ICsgYi0+bXZbMV1bMF0ueCArIGItPm12WzJdWzBdLnggKyBiLT5tdlszXVswXS54LCA0KTsKKyAgICAgICAgICAgIG12dXYueSA9IFJPVU5ERURfRElWKGItPm12WzBdWzBdLnkgKyBiLT5tdlsxXVswXS55ICsgYi0+bXZbMl1bMF0ueSArIGItPm12WzNdWzBdLnksIDQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXZ1diA9IGItPm12WzBdWzBdOworICAgICAgICB9CisKKyAgICAgICAgbWNfY2hyb21hX2RpcihzLCBzLT5kc3AubWNbYndsXVtiLT5maWx0ZXJdWzBdLAorICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSwgcy0+ZHN0WzJdLCBsc191diwKKyAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzFdLCByZWYxLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzJdLCByZWYxLT5saW5lc2l6ZVsyXSwgdHJlZjEsCisgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDIsIGNvbCA8PCAyLCAmbXZ1diwgYncsIGJoLCB3MSwgaDEpOworCisgICAgICAgIGlmIChiLT5jb21wKSB7CisgICAgICAgICAgICBpZiAoYi0+YnMgPiBCU184eDgpIHsKKyAgICAgICAgICAgICAgICBtdnV2LnggPSBST1VOREVEX0RJVihiLT5tdlswXVsxXS54ICsgYi0+bXZbMV1bMV0ueCArIGItPm12WzJdWzFdLnggKyBiLT5tdlszXVsxXS54LCA0KTsKKyAgICAgICAgICAgICAgICBtdnV2LnkgPSBST1VOREVEX0RJVihiLT5tdlswXVsxXS55ICsgYi0+bXZbMV1bMV0ueSArIGItPm12WzJdWzFdLnkgKyBiLT5tdlszXVsxXS55LCA0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXZ1diA9IGItPm12WzBdWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWNfY2hyb21hX2RpcihzLCBzLT5kc3AubWNbYndsXVtiLT5maWx0ZXJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0sIHMtPmRzdFsyXSwgbHNfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMV0sIHJlZjItPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzJdLCByZWYyLT5saW5lc2l6ZVsyXSwgdHJlZjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAyLCBjb2wgPDwgMiwgJm12dXYsIGJ3LCBiaCwgdzIsIGgyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYi0+c2tpcCkgeworICAgICAgICAvKiBtb3N0bHkgY29waWVkIGludHJhX3JlY29ubigpICovCisKKyAgICAgICAgaW50IHc0ID0gYndoX3RhYlsxXVtiLT5ic11bMF0gPDwgMSwgc3RlcDFkID0gMSA8PCBiLT50eCwgbjsKKyAgICAgICAgaW50IGg0ID0gYndoX3RhYlsxXVtiLT5ic11bMV0gPDwgMSwgeCwgeSwgc3RlcCA9IDEgPDwgKGItPnR4ICogMik7CisgICAgICAgIGludCBlbmRfeCA9IEZGTUlOKDIgKiAocy0+Y29scyAtIGNvbCksIHc0KTsKKyAgICAgICAgaW50IGVuZF95ID0gRkZNSU4oMiAqIChzLT5yb3dzIC0gcm93KSwgaDQpOworICAgICAgICBpbnQgdHggPSA0ICogcy0+bG9zc2xlc3MgKyBiLT50eCwgdXZ0eCA9IGItPnV2dHggKyA0ICogcy0+bG9zc2xlc3M7CisgICAgICAgIGludCB1dnN0ZXAxZCA9IDEgPDwgYi0+dXZ0eCwgcDsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gcy0+ZHN0WzBdOworCisgICAgICAgIC8vIHkgaXR4Zm0gYWRkCisgICAgICAgIGZvciAobiA9IDAsIHkgPSAwOyB5IDwgZW5kX3k7IHkgKz0gc3RlcDFkKSB7CisgICAgICAgICAgICB1aW50OF90ICpwdHIgPSBkc3Q7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgZW5kX3g7IHggKz0gc3RlcDFkLCBwdHIgKz0gNCAqIHN0ZXAxZCwgbiArPSBzdGVwKSB7CisgICAgICAgICAgICAgICAgaW50IGVvYiA9IGItPnR4ID4gVFhfOFg4ID8gQVZfUk4xNkEoJnMtPmVvYltuXSkgOiBzLT5lb2Jbbl07CisKKyAgICAgICAgICAgICAgICBpZiAoZW9iKQorICAgICAgICAgICAgICAgICAgICBzLT5kc3AuaXR4Zm1fYWRkW3R4XVtEQ1RfRENUXShwdHIsIHMtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9jayArIDE2ICogbiwgZW9iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCArPSA0ICogcy0+eV9zdHJpZGUgKiBzdGVwMWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyB1diBpdHhmbSBhZGQKKyAgICAgICAgZW5kX3ggPj49IDE7CisgICAgICAgIGVuZF95ID4+PSAxOworICAgICAgICBzdGVwID0gMSA8PCAoYi0+dXZ0eCAqIDIpOworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgMjsgcCsrKSB7CisgICAgICAgICAgICBkc3QgPSBzLT5kc3RbcCArIDFdOworICAgICAgICAgICAgZm9yIChuID0gMCwgeSA9IDA7IHkgPCBlbmRfeTsgeSArPSB1dnN0ZXAxZCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9IGRzdDsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgZW5kX3g7IHggKz0gdXZzdGVwMWQsIHB0ciArPSA0ICogdXZzdGVwMWQsIG4gKz0gc3RlcCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZW9iID0gYi0+dXZ0eCA+IFRYXzhYOCA/IEFWX1JOMTZBKCZzLT51dmVvYltwXVtuXSkgOiBzLT51dmVvYltwXVtuXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZW9iKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLml0eGZtX2FkZFt1dnR4XVtEQ1RfRENUXShwdHIsIHMtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZibG9ja1twXSArIDE2ICogbiwgZW9iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHN0ICs9IDQgKiB1dnN0ZXAxZCAqIHMtPnV2X3N0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtYXNrX2VkZ2VzKHN0cnVjdCBWUDlGaWx0ZXIgKmxmbHZsLCBpbnQgaXNfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19hbmRfNywgaW50IGNvbF9hbmRfNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBjb2xfZW5kLCBpbnQgcm93X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFR4Zm1Nb2RlIHR4LCBpbnQgc2tpcF9pbnRlcikKK3sKKyAgICAvLyBGSVhNRSBJJ20gcHJldHR5IHN1cmUgYWxsIGxvb3BzIGNhbiBiZSByZXBsYWNlZCBieSBhIHNpbmdsZSBMVVQgaWYKKyAgICAvLyB3ZSBtYWtlIFZQOUZpbHRlci5tYXNrIHVpbnQ2NF90IChpLmUuIHJvdy9jb2wgYWxsIHNpbmdsZSB2YXJpYWJsZSkKKyAgICAvLyBhbmQgbWFrZSB0aGUgTFVUIDUtaW5kZXhlZCAoYmwsIGJwLCBpc191diwgdHggYW5kIHJvdy9jb2wpLCBhbmQgdGhlbgorICAgIC8vIHVzZSByb3dfYW5kXzcvY29sX2FuZF83IGFzIHNoaWZ0cyAoMSpjb2xfYW5kXzcrOCpyb3dfYW5kXzcpCisKKyAgICAvLyB0aGUgaW50ZW5kZWQgYmVoYXZpb3VyIG9mIHRoZSB2cDkgbG9vcGZpbHRlciBpcyB0byB3b3JrIG9uIDgtcGl4ZWwKKyAgICAvLyBlZGdlcy4gVGhpcyBtZWFucyB0aGF0IGZvciBVViwgd2Ugd29yayBvbiB0d28gc3Vic2FtcGxlZCBibG9ja3MgYXQKKyAgICAvLyBhIHRpbWUsIGFuZCB3ZSBvbmx5IHVzZSB0aGUgdG9wbGVmdCBibG9jaydzIG1vZGUgaW5mb3JtYXRpb24gdG8gc2V0CisgICAgLy8gdGhpbmdzIGxpa2UgYmxvY2sgc3RyZW5ndGguIFRodXMsIGZvciBhbnkgYmxvY2sgc2l6ZSBzbWFsbGVyIHRoYW4KKyAgICAvLyAxNngxNiwgaWdub3JlIHRoZSBvZGQgcG9ydGlvbiBvZiB0aGUgYmxvY2suCisgICAgaWYgKHR4ID09IFRYXzRYNCAmJiBpc191dikgeworICAgICAgICBpZiAoaCA9PSAxKSB7CisgICAgICAgICAgICBpZiAocm93X2FuZF83ICYgMSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoIXJvd19lbmQpCisgICAgICAgICAgICAgICAgaCArPSAxOworICAgICAgICB9CisgICAgICAgIGlmICh3ID09IDEpIHsKKyAgICAgICAgICAgIGlmIChjb2xfYW5kXzcgJiAxKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGlmICghY29sX2VuZCkKKyAgICAgICAgICAgICAgICB3ICs9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHggPT0gVFhfNFg0ICYmICFza2lwX2ludGVyKSB7CisgICAgICAgIGludCB0ID0gMSA8PCBjb2xfYW5kXzcsIG1fY29sID0gKHQgPDwgdykgLSB0LCB5OworICAgICAgICBpbnQgbV9jb2xfb2RkID0gKHQgPDwgKHcgLSAxKSkgLSB0OworCisgICAgICAgIC8vIG9uIDMyLXB4IGVkZ2VzLCB1c2UgdGhlIDgtcHggd2lkZSBsb29wZmlsdGVyOyBlbHNlLCB1c2UgNC1weCB3aWRlCisgICAgICAgIGlmIChpc191dikgeworICAgICAgICAgICAgaW50IG1fcm93XzggPSBtX2NvbCAmIDB4MDEsIG1fcm93XzQgPSBtX2NvbCAtIG1fcm93Xzg7CisKKyAgICAgICAgICAgIGZvciAoeSA9IHJvd19hbmRfNzsgeSA8IGggKyByb3dfYW5kXzc7IHkrKykgeworICAgICAgICAgICAgICAgIGludCBjb2xfbWFza19pZCA9IDIgLSAhKHkgJiA3KTsKKworICAgICAgICAgICAgICAgIGxmbHZsLT5tYXNrW2lzX3V2XVswXVt5XVsxXSB8PSBtX3Jvd184OworICAgICAgICAgICAgICAgIGxmbHZsLT5tYXNrW2lzX3V2XVswXVt5XVsyXSB8PSBtX3Jvd180OworICAgICAgICAgICAgICAgIC8vIGZvciBvZGQgbGluZXMsIGlmIHRoZSBvZGQgY29sIGlzIG5vdCBiZWluZyBmaWx0ZXJlZCwKKyAgICAgICAgICAgICAgICAvLyBza2lwIG9kZCByb3cgYWxzbzoKKyAgICAgICAgICAgICAgICAvLyAuLS0tLiA8LS0gYQorICAgICAgICAgICAgICAgIC8vIHwgICB8CisgICAgICAgICAgICAgICAgLy8gfF9fX3wgPC0tIGIKKyAgICAgICAgICAgICAgICAvLyBeICAgXgorICAgICAgICAgICAgICAgIC8vIGMgICBkCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBpZiBhL2MgYXJlIGV2ZW4gcm93L2NvbCBhbmQgYi9kIGFyZSBvZGQsIGFuZCBkIGlzIHNraXBwZWQsCisgICAgICAgICAgICAgICAgLy8gZS5nLiByaWdodCBlZGdlIG9mIHNpemUtNjZ4NjYud2VibSwgdGhlbiBza2lwIGIgYWxzbyAoYnVnKQorICAgICAgICAgICAgICAgIGlmICgoY29sX2VuZCAmIDEpICYmICh5ICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzFdW3ldW2NvbF9tYXNrX2lkXSB8PSBtX2NvbF9vZGQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzFdW3ldW2NvbF9tYXNrX2lkXSB8PSBtX2NvbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgbV9yb3dfOCA9IG1fY29sICYgMHgxMSwgbV9yb3dfNCA9IG1fY29sIC0gbV9yb3dfODsKKworICAgICAgICAgICAgZm9yICh5ID0gcm93X2FuZF83OyB5IDwgaCArIHJvd19hbmRfNzsgeSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGNvbF9tYXNrX2lkID0gMiAtICEoeSAmIDMpOworCisgICAgICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzBdW3ldWzFdIHw9IG1fcm93Xzg7IC8vIHJvdyBlZGdlCisgICAgICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzBdW3ldWzJdIHw9IG1fcm93XzQ7CisgICAgICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzFdW3ldW2NvbF9tYXNrX2lkXSB8PSBtX2NvbDsgLy8gY29sIGVkZ2UKKyAgICAgICAgICAgICAgICBsZmx2bC0+bWFza1tpc191dl1bMF1beV1bM10gfD0gbV9jb2w7CisgICAgICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzFdW3ldWzNdIHw9IG1fY29sOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHksIHQgPSAxIDw8IGNvbF9hbmRfNywgbV9jb2wgPSAodCA8PCB3KSAtIHQ7CisKKyAgICAgICAgaWYgKCFza2lwX2ludGVyKSB7CisgICAgICAgICAgICBpbnQgbWFza19pZCA9ICh0eCA9PSBUWF84WDgpOworICAgICAgICAgICAgaW50IGwyID0gdHggKyBpc191diAtIDEsIHN0ZXAxZCA9IDEgPDwgbDI7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWFza3NbNF0gPSB7IDB4ZmYsIDB4NTUsIDB4MTEsIDB4MDEgfTsKKyAgICAgICAgICAgIGludCBtX3JvdyA9IG1fY29sICYgbWFza3NbbDJdOworCisgICAgICAgICAgICAvLyBhdCBvZGQgVVYgY29sL3JvdyBlZGdlcyB0eDE2L3R4MzIgbG9vcGZpbHRlciBlZGdlcywgZm9yY2UKKyAgICAgICAgICAgIC8vIDh3ZCBsb29wZmlsdGVyIHRvIHByZXZlbnQgZ29pbmcgb2ZmIHRoZSB2aXNpYmxlIGVkZ2UuCisgICAgICAgICAgICBpZiAoaXNfdXYgJiYgdHggPiBUWF84WDggJiYgKHcgXiAodyAtIDEpKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgaW50IG1fcm93XzE2ID0gKCh0IDw8ICh3IC0gMSkpIC0gdCkgJiBtYXNrc1tsMl07CisgICAgICAgICAgICAgICAgaW50IG1fcm93XzggPSBtX3JvdyAtIG1fcm93XzE2OworCisgICAgICAgICAgICAgICAgZm9yICh5ID0gcm93X2FuZF83OyB5IDwgaCArIHJvd19hbmRfNzsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxmbHZsLT5tYXNrW2lzX3V2XVswXVt5XVswXSB8PSBtX3Jvd18xNjsKKyAgICAgICAgICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzBdW3ldWzFdIHw9IG1fcm93Xzg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSByb3dfYW5kXzc7IHkgPCBoICsgcm93X2FuZF83OyB5KyspCisgICAgICAgICAgICAgICAgICAgIGxmbHZsLT5tYXNrW2lzX3V2XVswXVt5XVttYXNrX2lkXSB8PSBtX3JvdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzX3V2ICYmIHR4ID4gVFhfOFg4ICYmIChoIF4gKGggLSAxKSkgPT0gMSkgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IHJvd19hbmRfNzsgeSA8IGggKyByb3dfYW5kXzcgLSAxOyB5ICs9IHN0ZXAxZCkKKyAgICAgICAgICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzFdW3ldWzBdIHw9IG1fY29sOworICAgICAgICAgICAgICAgIGlmICh5IC0gcm93X2FuZF83ID09IGggLSAxKQorICAgICAgICAgICAgICAgICAgICBsZmx2bC0+bWFza1tpc191dl1bMV1beV1bMV0gfD0gbV9jb2w7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IHJvd19hbmRfNzsgeSA8IGggKyByb3dfYW5kXzc7IHkgKz0gc3RlcDFkKQorICAgICAgICAgICAgICAgICAgICBsZmx2bC0+bWFza1tpc191dl1bMV1beV1bbWFza19pZF0gfD0gbV9jb2w7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHggIT0gVFhfNFg0KSB7CisgICAgICAgICAgICBpbnQgbWFza19pZDsKKworICAgICAgICAgICAgbWFza19pZCA9ICh0eCA9PSBUWF84WDgpIHx8IChpc191diAmJiBoID09IDEpOworICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzFdW3Jvd19hbmRfN11bbWFza19pZF0gfD0gbV9jb2w7CisgICAgICAgICAgICBtYXNrX2lkID0gKHR4ID09IFRYXzhYOCkgfHwgKGlzX3V2ICYmIHcgPT0gMSk7CisgICAgICAgICAgICBmb3IgKHkgPSByb3dfYW5kXzc7IHkgPCBoICsgcm93X2FuZF83OyB5KyspCisgICAgICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzBdW3ldW21hc2tfaWRdIHw9IHQ7CisgICAgICAgIH0gZWxzZSBpZiAoaXNfdXYpIHsKKyAgICAgICAgICAgIGludCB0OCA9IHQgJiAweDAxLCB0NCA9IHQgLSB0ODsKKworICAgICAgICAgICAgZm9yICh5ID0gcm93X2FuZF83OyB5IDwgaCArIHJvd19hbmRfNzsgeSsrKSB7CisgICAgICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzBdW3ldWzJdIHw9IHQ0OworICAgICAgICAgICAgICAgIGxmbHZsLT5tYXNrW2lzX3V2XVswXVt5XVsxXSB8PSB0ODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxmbHZsLT5tYXNrW2lzX3V2XVsxXVtyb3dfYW5kXzddWzIgLSAhKHJvd19hbmRfNyAmIDcpXSB8PSBtX2NvbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCB0OCA9IHQgJiAweDExLCB0NCA9IHQgLSB0ODsKKworICAgICAgICAgICAgZm9yICh5ID0gcm93X2FuZF83OyB5IDwgaCArIHJvd19hbmRfNzsgeSsrKSB7CisgICAgICAgICAgICAgICAgbGZsdmwtPm1hc2tbaXNfdXZdWzBdW3ldWzJdIHw9IHQ0OworICAgICAgICAgICAgICAgIGxmbHZsLT5tYXNrW2lzX3V2XVswXVt5XVsxXSB8PSB0ODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxmbHZsLT5tYXNrW2lzX3V2XVsxXVtyb3dfYW5kXzddWzIgLSAhKHJvd19hbmRfNyAmIDMpXSB8PSBtX2NvbDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2IoQVZDb2RlY0NvbnRleHQgKmN0eCwgaW50IHJvdywgaW50IGNvbCwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBWUDlGaWx0ZXIgKmxmbHZsLCBwdHJkaWZmX3QgeW9mZiwgcHRyZGlmZl90IHV2b2ZmLAorICAgICAgICAgICAgICAgICAgICAgZW51bSBCbG9ja0xldmVsIGJsLCBlbnVtIEJsb2NrUGFydGl0aW9uIGJwKQoreworICAgIFZQOUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBWUDlCbG9jayAqYiA9IHMtPmI7CisgICAgZW51bSBCbG9ja1NpemUgYnMgPSBibCAqIDMgKyBicDsKKyAgICBpbnQgdzQgPSBid2hfdGFiWzFdW2JzXVswXSwgaDQgPSBid2hfdGFiWzFdW2JzXVsxXSwgbHZsOworICAgIGludCBlbXVbMl07CisgICAgQVZGcmFtZSAqZiA9IHMtPmZyYW1lc1tDVVJfRlJBTUVdLnRmLmY7CisKKyAgICBzLT5yb3cgPSByb3c7CisgICAgcy0+cm93NyA9IHJvdyAmIDc7CisgICAgcy0+Y29sID0gY29sOworICAgIHMtPmNvbDcgPSBjb2wgJiA3OworICAgIHMtPm1pbl9tdi54ID0gLSgxMjggKyBjb2wgKiA2NCk7CisgICAgcy0+bWluX212LnkgPSAtKDEyOCArIHJvdyAqIDY0KTsKKyAgICBzLT5tYXhfbXYueCA9IDEyOCArIChzLT5jb2xzIC0gY29sIC0gdzQpICogNjQ7CisgICAgcy0+bWF4X212LnkgPSAxMjggKyAocy0+cm93cyAtIHJvdyAtIGg0KSAqIDY0OworICAgIGlmIChzLT5wYXNzIDwgMikgeworICAgICAgICBiLT5icyA9IGJzOworICAgICAgICBiLT5ibCA9IGJsOworICAgICAgICBiLT5icCA9IGJwOworICAgICAgICBkZWNvZGVfbW9kZShjdHgpOworICAgICAgICBiLT51dnR4ID0gYi0+dHggLSAodzQgKiAyID09ICgxIDw8IGItPnR4KSB8fCBoNCAqIDIgPT0gKDEgPDwgYi0+dHgpKTsKKworICAgICAgICBpZiAoIWItPnNraXApIHsKKyAgICAgICAgICAgIGRlY29kZV9jb2VmZnMoY3R4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCByb3c3ID0gcy0+cm93NzsKKworI2RlZmluZSBTUExBVF9aRVJPX0NUWCh2LCBuKSBcCisgICAgc3dpdGNoIChuKSB7IFwKKyAgICBjYXNlIDE6ICB2ID0gMDsgICAgICAgICAgYnJlYWs7IFwKKyAgICBjYXNlIDI6ICBBVl9aRVJPMTYoJnYpOyAgYnJlYWs7IFwKKyAgICBjYXNlIDQ6ICBBVl9aRVJPMzIoJnYpOyAgYnJlYWs7IFwKKyAgICBjYXNlIDg6ICBBVl9aRVJPNjQoJnYpOyAgYnJlYWs7IFwKKyAgICBjYXNlIDE2OiBBVl9aRVJPMTI4KCZ2KTsgYnJlYWs7IFwKKyAgICB9CisjZGVmaW5lIFNQTEFUX1pFUk9fWVVWKGRpciwgdmFyLCBvZmYsIG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgU1BMQVRfWkVST19DVFgocy0+ZGlyIyNfeV8jI3ZhcltvZmYgKiAyXSwgbiAqIDIpOyBcCisgICAgICAgIFNQTEFUX1pFUk9fQ1RYKHMtPmRpciMjX3V2XyMjdmFyWzBdW29mZl0sIG4pOyBcCisgICAgICAgIFNQTEFUX1pFUk9fQ1RYKHMtPmRpciMjX3V2XyMjdmFyWzFdW29mZl0sIG4pOyBcCisgICAgfSB3aGlsZSAoMCkKKworICAgICAgICAgICAgc3dpdGNoICh3NCkgeworICAgICAgICAgICAgY2FzZSAxOiBTUExBVF9aRVJPX1lVVihhYm92ZSwgbm56X2N0eCwgY29sLCAxKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IFNQTEFUX1pFUk9fWVVWKGFib3ZlLCBubnpfY3R4LCBjb2wsIDIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDogU1BMQVRfWkVST19ZVVYoYWJvdmUsIG5uel9jdHgsIGNvbCwgNCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OiBTUExBVF9aRVJPX1lVVihhYm92ZSwgbm56X2N0eCwgY29sLCA4KTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGg0KSB7CisgICAgICAgICAgICBjYXNlIDE6IFNQTEFUX1pFUk9fWVVWKGxlZnQsIG5uel9jdHgsIHJvdzcsIDEpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogU1BMQVRfWkVST19ZVVYobGVmdCwgbm56X2N0eCwgcm93NywgMik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiBTUExBVF9aRVJPX1lVVihsZWZ0LCBubnpfY3R4LCByb3c3LCA0KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6IFNQTEFUX1pFUk9fWVVWKGxlZnQsIG5uel9jdHgsIHJvdzcsIDgpOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocy0+cGFzcyA9PSAxKSB7CisgICAgICAgICAgICBzLT5iKys7CisgICAgICAgICAgICBzLT5ibG9jayArPSB3NCAqIGg0ICogNjQ7CisgICAgICAgICAgICBzLT51dmJsb2NrWzBdICs9IHc0ICogaDQgKiAxNjsKKyAgICAgICAgICAgIHMtPnV2YmxvY2tbMV0gKz0gdzQgKiBoNCAqIDE2OworICAgICAgICAgICAgcy0+ZW9iICs9IDQgKiB3NCAqIGg0OworICAgICAgICAgICAgcy0+dXZlb2JbMF0gKz0gdzQgKiBoNDsKKyAgICAgICAgICAgIHMtPnV2ZW9iWzFdICs9IHc0ICogaDQ7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGVtdWxhdGVkIG92ZXJoYW5ncyBpZiB0aGUgc3RyaWRlIG9mIHRoZSB0YXJnZXQgYnVmZmVyIGNhbid0IGhvbGQuIFRoaXMKKyAgICAvLyBhbGxvd3MgdG8gc3VwcG9ydCBlbXUtZWRnZSBhbmQgc28gb24gZXZlbiBpZiB3ZSBoYXZlIGxhcmdlIGJsb2NrCisgICAgLy8gb3ZlcmhhbmdzCisgICAgZW11WzBdID0gKGNvbCArIHc0KSAqIDggPiBmLT5saW5lc2l6ZVswXSB8fAorICAgICAgICAgICAgIChyb3cgKyBoNCkgPiBzLT5yb3dzOworICAgIGVtdVsxXSA9IChjb2wgKyB3NCkgKiA0ID4gZi0+bGluZXNpemVbMV0gfHwKKyAgICAgICAgICAgICAocm93ICsgaDQpID4gcy0+cm93czsKKyAgICBpZiAoZW11WzBdKSB7CisgICAgICAgIHMtPmRzdFswXSA9IHMtPnRtcF95OworICAgICAgICBzLT55X3N0cmlkZSA9IDY0OworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmRzdFswXSA9IGYtPmRhdGFbMF0gKyB5b2ZmOworICAgICAgICBzLT55X3N0cmlkZSA9IGYtPmxpbmVzaXplWzBdOworICAgIH0KKyAgICBpZiAoZW11WzFdKSB7CisgICAgICAgIHMtPmRzdFsxXSA9IHMtPnRtcF91dlswXTsKKyAgICAgICAgcy0+ZHN0WzJdID0gcy0+dG1wX3V2WzFdOworICAgICAgICBzLT51dl9zdHJpZGUgPSAzMjsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5kc3RbMV0gPSBmLT5kYXRhWzFdICsgdXZvZmY7CisgICAgICAgIHMtPmRzdFsyXSA9IGYtPmRhdGFbMl0gKyB1dm9mZjsKKyAgICAgICAgcy0+dXZfc3RyaWRlID0gZi0+bGluZXNpemVbMV07CisgICAgfQorICAgIGlmIChiLT5pbnRyYSkgeworICAgICAgICBpbnRyYV9yZWNvbihjdHgsIHlvZmYsIHV2b2ZmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnRlcl9yZWNvbihjdHgpOworICAgIH0KKyAgICBpZiAoZW11WzBdKSB7CisgICAgICAgIGludCB3ID0gRkZNSU4ocy0+Y29scyAtIGNvbCwgdzQpICogOCwgaCA9IEZGTUlOKHMtPnJvd3MgLSByb3csIGg0KSAqIDgsIG4sIG8gPSAwOworCisgICAgICAgIGZvciAobiA9IDA7IG8gPCB3OyBuKyspIHsKKyAgICAgICAgICAgIGludCBidyA9IDY0ID4+IG47CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDIobiA8PSA0KTsKKyAgICAgICAgICAgIGlmICh3ICYgYncpIHsKKyAgICAgICAgICAgICAgICBzLT5kc3AubWNbbl1bMF1bMF1bMF1bMF0oZi0+ZGF0YVswXSArIHlvZmYgKyBvLCBmLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dG1wX3kgKyBvLCA2NCwgaCwgMCwgMCk7CisgICAgICAgICAgICAgICAgbyArPSBidzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZW11WzFdKSB7CisgICAgICAgIGludCB3ID0gRkZNSU4ocy0+Y29scyAtIGNvbCwgdzQpICogNCwgaCA9IEZGTUlOKHMtPnJvd3MgLSByb3csIGg0KSAqIDQsIG4sIG8gPSAwOworCisgICAgICAgIGZvciAobiA9IDE7IG8gPCB3OyBuKyspIHsKKyAgICAgICAgICAgIGludCBidyA9IDY0ID4+IG47CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDIobiA8PSA0KTsKKyAgICAgICAgICAgIGlmICh3ICYgYncpIHsKKyAgICAgICAgICAgICAgICBzLT5kc3AubWNbbl1bMF1bMF1bMF1bMF0oZi0+ZGF0YVsxXSArIHV2b2ZmICsgbywgZi0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRtcF91dlswXSArIG8sIDMyLCBoLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBzLT5kc3AubWNbbl1bMF1bMF1bMF1bMF0oZi0+ZGF0YVsyXSArIHV2b2ZmICsgbywgZi0+bGluZXNpemVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRtcF91dlsxXSArIG8sIDMyLCBoLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBvICs9IGJ3OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gcGljayBmaWx0ZXIgbGV2ZWwgYW5kIGZpbmQgZWRnZXMgdG8gYXBwbHkgZmlsdGVyIHRvCisgICAgaWYgKHMtPmZpbHRlci5sZXZlbCAmJgorICAgICAgICAobHZsID0gcy0+c2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5sZmx2bFtiLT5pbnRyYSA/IDAgOiBiLT5yZWZbMF0gKyAxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiLT5tb2RlWzNdICE9IFpFUk9NVl0pID4gMCkgeworICAgICAgICBpbnQgeF9lbmQgPSBGRk1JTihzLT5jb2xzIC0gY29sLCB3NCksIHlfZW5kID0gRkZNSU4ocy0+cm93cyAtIHJvdywgaDQpOworICAgICAgICBpbnQgc2tpcF9pbnRlciA9ICFiLT5pbnRyYSAmJiBiLT5za2lwLCBjb2w3ID0gcy0+Y29sNywgcm93NyA9IHMtPnJvdzc7CisKKyAgICAgICAgc2V0Y3R4XzJkKCZsZmx2bC0+bGV2ZWxbcm93NyAqIDggKyBjb2w3XSwgdzQsIGg0LCA4LCBsdmwpOworICAgICAgICBtYXNrX2VkZ2VzKGxmbHZsLCAwLCByb3c3LCBjb2w3LCB4X2VuZCwgeV9lbmQsIDAsIDAsIGItPnR4LCBza2lwX2ludGVyKTsKKyAgICAgICAgbWFza19lZGdlcyhsZmx2bCwgMSwgcm93NywgY29sNywgeF9lbmQsIHlfZW5kLAorICAgICAgICAgICAgICAgICAgIHMtPmNvbHMgJiAxICYmIGNvbCArIHc0ID49IHMtPmNvbHMgPyBzLT5jb2xzICYgNyA6IDAsCisgICAgICAgICAgICAgICAgICAgcy0+cm93cyAmIDEgJiYgcm93ICsgaDQgPj0gcy0+cm93cyA/IHMtPnJvd3MgJiA3IDogMCwKKyAgICAgICAgICAgICAgICAgICBiLT51dnR4LCBza2lwX2ludGVyKTsKKworICAgICAgICBpZiAoIXMtPmZpbHRlci5saW1fbHV0W2x2bF0pIHsKKyAgICAgICAgICAgIGludCBzaGFycCA9IHMtPmZpbHRlci5zaGFycG5lc3M7CisgICAgICAgICAgICBpbnQgbGltaXQgPSBsdmw7CisKKyAgICAgICAgICAgIGlmIChzaGFycCA+IDApIHsKKyAgICAgICAgICAgICAgICBsaW1pdCA+Pj0gKHNoYXJwICsgMykgPj4gMjsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IEZGTUlOKGxpbWl0LCA5IC0gc2hhcnApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGltaXQgPSBGRk1BWChsaW1pdCwgMSk7CisKKyAgICAgICAgICAgIHMtPmZpbHRlci5saW1fbHV0W2x2bF0gPSBsaW1pdDsKKyAgICAgICAgICAgIHMtPmZpbHRlci5tYmxpbV9sdXRbbHZsXSA9IDIgKiAobHZsICsgMikgKyBsaW1pdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5wYXNzID09IDIpIHsKKyAgICAgICAgcy0+YisrOworICAgICAgICBzLT5ibG9jayArPSB3NCAqIGg0ICogNjQ7CisgICAgICAgIHMtPnV2YmxvY2tbMF0gKz0gdzQgKiBoNCAqIDE2OworICAgICAgICBzLT51dmJsb2NrWzFdICs9IHc0ICogaDQgKiAxNjsKKyAgICAgICAgcy0+ZW9iICs9IDQgKiB3NCAqIGg0OworICAgICAgICBzLT51dmVvYlswXSArPSB3NCAqIGg0OworICAgICAgICBzLT51dmVvYlsxXSArPSB3NCAqIGg0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3NiKEFWQ29kZWNDb250ZXh0ICpjdHgsIGludCByb3csIGludCBjb2wsIHN0cnVjdCBWUDlGaWx0ZXIgKmxmbHZsLAorICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB5b2ZmLCBwdHJkaWZmX3QgdXZvZmYsIGVudW0gQmxvY2tMZXZlbCBibCkKK3sKKyAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGMgPSAoKHMtPmFib3ZlX3BhcnRpdGlvbl9jdHhbY29sXSA+PiAoMyAtIGJsKSkgJiAxKSB8CisgICAgICAgICAgICAoKChzLT5sZWZ0X3BhcnRpdGlvbl9jdHhbcm93ICYgMHg3XSA+PiAoMyAtIGJsKSkgJiAxKSA8PCAxKTsKKyAgICBjb25zdCB1aW50OF90ICpwID0gcy0+a2V5ZnJhbWUgPyB2cDlfZGVmYXVsdF9rZl9wYXJ0aXRpb25fcHJvYnNbYmxdW2NdIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAucGFydGl0aW9uW2JsXVtjXTsKKyAgICBlbnVtIEJsb2NrUGFydGl0aW9uIGJwOworICAgIHB0cmRpZmZfdCBoYnMgPSA0ID4+IGJsOworICAgIEFWRnJhbWUgKmYgPSBzLT5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mOworICAgIHB0cmRpZmZfdCB5X3N0cmlkZSA9IGYtPmxpbmVzaXplWzBdLCB1dl9zdHJpZGUgPSBmLT5saW5lc2l6ZVsxXTsKKworICAgIGlmIChibCA9PSBCTF84WDgpIHsKKyAgICAgICAgYnAgPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfcGFydGl0aW9uX3RyZWUsIHApOworICAgICAgICBkZWNvZGVfYihjdHgsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsLCBicCk7CisgICAgfSBlbHNlIGlmIChjb2wgKyBoYnMgPCBzLT5jb2xzKSB7IC8vIEZJWE1FIHdoeSBub3QgPD0/CisgICAgICAgIGlmIChyb3cgKyBoYnMgPCBzLT5yb3dzKSB7IC8vIEZJWE1FIHdoeSBub3QgPD0/CisgICAgICAgICAgICBicCA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9wYXJ0aXRpb25fdHJlZSwgcCk7CisgICAgICAgICAgICBzd2l0Y2ggKGJwKSB7CisgICAgICAgICAgICBjYXNlIFBBUlRJVElPTl9OT05FOgorICAgICAgICAgICAgICAgIGRlY29kZV9iKGN0eCwgcm93LCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwsIGJwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUEFSVElUSU9OX0g6CisgICAgICAgICAgICAgICAgZGVjb2RlX2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCwgYnApOworICAgICAgICAgICAgICAgIHlvZmYgICs9IGhicyAqIDggKiB5X3N0cmlkZTsKKyAgICAgICAgICAgICAgICB1dm9mZiArPSBoYnMgKiA0ICogdXZfc3RyaWRlOworICAgICAgICAgICAgICAgIGRlY29kZV9iKGN0eCwgcm93ICsgaGJzLCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwsIGJwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUEFSVElUSU9OX1Y6CisgICAgICAgICAgICAgICAgZGVjb2RlX2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCwgYnApOworICAgICAgICAgICAgICAgIHlvZmYgICs9IGhicyAqIDg7CisgICAgICAgICAgICAgICAgdXZvZmYgKz0gaGJzICogNDsKKyAgICAgICAgICAgICAgICBkZWNvZGVfYihjdHgsIHJvdywgY29sICsgaGJzLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsLCBicCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBBUlRJVElPTl9TUExJVDoKKyAgICAgICAgICAgICAgICBkZWNvZGVfc2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOworICAgICAgICAgICAgICAgIGRlY29kZV9zYihjdHgsIHJvdywgY29sICsgaGJzLCBsZmx2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeW9mZiArIDggKiBoYnMsIHV2b2ZmICsgNCAqIGhicywgYmwgKyAxKTsKKyAgICAgICAgICAgICAgICB5b2ZmICArPSBoYnMgKiA4ICogeV9zdHJpZGU7CisgICAgICAgICAgICAgICAgdXZvZmYgKz0gaGJzICogNCAqIHV2X3N0cmlkZTsKKyAgICAgICAgICAgICAgICBkZWNvZGVfc2IoY3R4LCByb3cgKyBoYnMsIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOworICAgICAgICAgICAgICAgIGRlY29kZV9zYihjdHgsIHJvdyArIGhicywgY29sICsgaGJzLCBsZmx2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeW9mZiArIDggKiBoYnMsIHV2b2ZmICsgNCAqIGhicywgYmwgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCBwWzFdKSkgeworICAgICAgICAgICAgYnAgPSBQQVJUSVRJT05fU1BMSVQ7CisgICAgICAgICAgICBkZWNvZGVfc2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOworICAgICAgICAgICAgZGVjb2RlX3NiKGN0eCwgcm93LCBjb2wgKyBoYnMsIGxmbHZsLAorICAgICAgICAgICAgICAgICAgICAgIHlvZmYgKyA4ICogaGJzLCB1dm9mZiArIDQgKiBoYnMsIGJsICsgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicCA9IFBBUlRJVElPTl9IOworICAgICAgICAgICAgZGVjb2RlX2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCwgYnApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChyb3cgKyBoYnMgPCBzLT5yb3dzKSB7IC8vIEZJWE1FIHdoeSBub3QgPD0/CisgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCBwWzJdKSkgeworICAgICAgICAgICAgYnAgPSBQQVJUSVRJT05fU1BMSVQ7CisgICAgICAgICAgICBkZWNvZGVfc2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOworICAgICAgICAgICAgeW9mZiAgKz0gaGJzICogOCAqIHlfc3RyaWRlOworICAgICAgICAgICAgdXZvZmYgKz0gaGJzICogNCAqIHV2X3N0cmlkZTsKKyAgICAgICAgICAgIGRlY29kZV9zYihjdHgsIHJvdyArIGhicywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicCA9IFBBUlRJVElPTl9WOworICAgICAgICAgICAgZGVjb2RlX2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCwgYnApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnAgPSBQQVJUSVRJT05fU1BMSVQ7CisgICAgICAgIGRlY29kZV9zYihjdHgsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7CisgICAgfQorICAgIHMtPmNvdW50cy5wYXJ0aXRpb25bYmxdW2NdW2JwXSsrOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfc2JfbWVtKEFWQ29kZWNDb250ZXh0ICpjdHgsIGludCByb3csIGludCBjb2wsIHN0cnVjdCBWUDlGaWx0ZXIgKmxmbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgeW9mZiwgcHRyZGlmZl90IHV2b2ZmLCBlbnVtIEJsb2NrTGV2ZWwgYmwpCit7CisgICAgVlA5Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIFZQOUJsb2NrICpiID0gcy0+YjsKKyAgICBwdHJkaWZmX3QgaGJzID0gNCA+PiBibDsKKyAgICBBVkZyYW1lICpmID0gcy0+ZnJhbWVzW0NVUl9GUkFNRV0udGYuZjsKKyAgICBwdHJkaWZmX3QgeV9zdHJpZGUgPSBmLT5saW5lc2l6ZVswXSwgdXZfc3RyaWRlID0gZi0+bGluZXNpemVbMV07CisKKyAgICBpZiAoYmwgPT0gQkxfOFg4KSB7CisgICAgICAgIGF2X2Fzc2VydDIoYi0+YmwgPT0gQkxfOFg4KTsKKyAgICAgICAgZGVjb2RlX2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBiLT5ibCwgYi0+YnApOworICAgIH0gZWxzZSBpZiAocy0+Yi0+YmwgPT0gYmwpIHsKKyAgICAgICAgZGVjb2RlX2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBiLT5ibCwgYi0+YnApOworICAgICAgICBpZiAoYi0+YnAgPT0gUEFSVElUSU9OX0ggJiYgcm93ICsgaGJzIDwgcy0+cm93cykgeworICAgICAgICAgICAgeW9mZiAgKz0gaGJzICogOCAqIHlfc3RyaWRlOworICAgICAgICAgICAgdXZvZmYgKz0gaGJzICogNCAqIHV2X3N0cmlkZTsKKyAgICAgICAgICAgIGRlY29kZV9iKGN0eCwgcm93ICsgaGJzLCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYi0+YmwsIGItPmJwKTsKKyAgICAgICAgfSBlbHNlIGlmIChiLT5icCA9PSBQQVJUSVRJT05fViAmJiBjb2wgKyBoYnMgPCBzLT5jb2xzKSB7CisgICAgICAgICAgICB5b2ZmICArPSBoYnMgKiA4OworICAgICAgICAgICAgdXZvZmYgKz0gaGJzICogNDsKKyAgICAgICAgICAgIGRlY29kZV9iKGN0eCwgcm93LCBjb2wgKyBoYnMsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYi0+YmwsIGItPmJwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRlY29kZV9zYl9tZW0oY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOworICAgICAgICBpZiAoY29sICsgaGJzIDwgcy0+Y29scykgeyAvLyBGSVhNRSB3aHkgbm90IDw9PworICAgICAgICAgICAgaWYgKHJvdyArIGhicyA8IHMtPnJvd3MpIHsKKyAgICAgICAgICAgICAgICBkZWNvZGVfc2JfbWVtKGN0eCwgcm93LCBjb2wgKyBoYnMsIGxmbHZsLCB5b2ZmICsgOCAqIGhicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2b2ZmICsgNCAqIGhicywgYmwgKyAxKTsKKyAgICAgICAgICAgICAgICB5b2ZmICArPSBoYnMgKiA4ICogeV9zdHJpZGU7CisgICAgICAgICAgICAgICAgdXZvZmYgKz0gaGJzICogNCAqIHV2X3N0cmlkZTsKKyAgICAgICAgICAgICAgICBkZWNvZGVfc2JfbWVtKGN0eCwgcm93ICsgaGJzLCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwgKyAxKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVfc2JfbWVtKGN0eCwgcm93ICsgaGJzLCBjb2wgKyBoYnMsIGxmbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW9mZiArIDggKiBoYnMsIHV2b2ZmICsgNCAqIGhicywgYmwgKyAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgeW9mZiAgKz0gaGJzICogODsKKyAgICAgICAgICAgICAgICB1dm9mZiArPSBoYnMgKiA0OworICAgICAgICAgICAgICAgIGRlY29kZV9zYl9tZW0oY3R4LCByb3csIGNvbCArIGhicywgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJvdyArIGhicyA8IHMtPnJvd3MpIHsKKyAgICAgICAgICAgIHlvZmYgICs9IGhicyAqIDggKiB5X3N0cmlkZTsKKyAgICAgICAgICAgIHV2b2ZmICs9IGhicyAqIDQgKiB1dl9zdHJpZGU7CisgICAgICAgICAgICBkZWNvZGVfc2JfbWVtKGN0eCwgcm93ICsgaGJzLCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwgKyAxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgbG9vcGZpbHRlcl9zYihBVkNvZGVjQ29udGV4dCAqY3R4LCBzdHJ1Y3QgVlA5RmlsdGVyICpsZmx2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IGNvbCwgcHRyZGlmZl90IHlvZmYsIHB0cmRpZmZfdCB1dm9mZikKK3sKKyAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZiA9IHMtPmZyYW1lc1tDVVJfRlJBTUVdLnRmLmY7CisgICAgdWludDhfdCAqZHN0ID0gZi0+ZGF0YVswXSArIHlvZmYsICpsdmwgPSBsZmx2bC0+bGV2ZWw7CisgICAgcHRyZGlmZl90IGxzX3kgPSBmLT5saW5lc2l6ZVswXSwgbHNfdXYgPSBmLT5saW5lc2l6ZVsxXTsKKyAgICBpbnQgeSwgeCwgcDsKKworICAgIC8vIEZJWE1FIGluIGhvdyBmYXIgY2FuIHdlIGludGVybGVhdmUgdGhlIHYvaCBsb29wZmlsdGVyIGNhbGxzPyBFLmcuCisgICAgLy8gaWYgeW91IHRoaW5rIG9mIHRoZW0gYXMgYWN0aW5nIG9uIGEgOHg4IGJsb2NrIG1heCwgd2UgY2FuIGludGVybGVhdmUKKyAgICAvLyBlYWNoIHYvaCB3aXRoaW4gdGhlIHNpbmdsZSB4IGxvb3AsIGJ1dCB0aGF0IG9ubHkgd29ya3MgaWYgd2Ugd29yayBvbgorICAgIC8vIDggcGl4ZWwgYmxvY2tzLCBhbmQgd2Ugd29uJ3QgYWx3YXlzIGRvIHRoYXQgKHdlIHdhbnQgYXQgbGVhc3QgMTZweAorICAgIC8vIHRvIHVzZSBTU0UyIG9wdGltaXphdGlvbnMsIHBlcmhhcHMgMzIgZm9yIEFWWDIpCisKKyAgICAvLyBmaWx0ZXIgZWRnZXMgYmV0d2VlbiBjb2x1bW5zLCBZIHBsYW5lIChlLmcuIGJsb2NrMSB8IGJsb2NrMikKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSArPSAyLCBkc3QgKz0gMTYgKiBsc195LCBsdmwgKz0gMTYpIHsKKyAgICAgICAgdWludDhfdCAqcHRyID0gZHN0LCAqbCA9IGx2bCwgKmhtYXNrMSA9IGxmbHZsLT5tYXNrWzBdWzBdW3ldOworICAgICAgICB1aW50OF90ICpobWFzazIgPSBsZmx2bC0+bWFza1swXVswXVt5ICsgMV07CisgICAgICAgIHVuc2lnbmVkIGhtMSA9IGhtYXNrMVswXSB8IGhtYXNrMVsxXSB8IGhtYXNrMVsyXSwgaG0xMyA9IGhtYXNrMVszXTsKKyAgICAgICAgdW5zaWduZWQgaG0yID0gaG1hc2syWzFdIHwgaG1hc2syWzJdLCBobTIzID0gaG1hc2syWzNdOworICAgICAgICB1bnNpZ25lZCBobSA9IGhtMSB8IGhtMiB8IGhtMTMgfCBobTIzOworCisgICAgICAgIGZvciAoeCA9IDE7IGhtICYgfih4IC0gMSk7IHggPDw9IDEsIHB0ciArPSA4LCBsKyspIHsKKyAgICAgICAgICAgIGlmIChobTEgJiB4KSB7CisgICAgICAgICAgICAgICAgaW50IEwgPSAqbCwgSCA9IEwgPj4gNDsKKyAgICAgICAgICAgICAgICBpbnQgRSA9IHMtPmZpbHRlci5tYmxpbV9sdXRbTF0sIEkgPSBzLT5maWx0ZXIubGltX2x1dFtMXTsKKworICAgICAgICAgICAgICAgIGlmIChjb2wgfHwgeCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhtYXNrMVswXSAmIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobWFzazJbMF0gJiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihsWzhdID09IEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl8xNlswXShwdHIsIGxzX3ksIEUsIEksIEgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFsyXVswXShwdHIsIGxzX3ksIEUsIEksIEgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhtMiAmIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEwgPSBsWzhdOworICAgICAgICAgICAgICAgICAgICAgICAgSCB8PSAoTCA+PiA0KSA8PCA4OworICAgICAgICAgICAgICAgICAgICAgICAgRSB8PSBzLT5maWx0ZXIubWJsaW1fbHV0W0xdIDw8IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBJIHw9IHMtPmZpbHRlci5saW1fbHV0W0xdIDw8IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfbWl4MlshIShobWFzazFbMV0gJiB4KV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyEhKGhtYXNrMlsxXSAmIHgpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0ocHRyLCBsc195LCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl84WyEhKGhtYXNrMVsxXSAmIHgpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0ocHRyLCBsc195LCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0yICYgeCkgeworICAgICAgICAgICAgICAgIGludCBMID0gbFs4XSwgSCA9IEwgPj4gNDsKKyAgICAgICAgICAgICAgICBpbnQgRSA9IHMtPmZpbHRlci5tYmxpbV9sdXRbTF0sIEkgPSBzLT5maWx0ZXIubGltX2x1dFtMXTsKKworICAgICAgICAgICAgICAgIGlmIChjb2wgfHwgeCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzhbISEoaG1hc2syWzFdICYgeCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzBdKHB0ciArIDggKiBsc195LCBsc195LCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaG0xMyAmIHgpIHsKKyAgICAgICAgICAgICAgICBpbnQgTCA9ICpsLCBIID0gTCA+PiA0OworICAgICAgICAgICAgICAgIGludCBFID0gcy0+ZmlsdGVyLm1ibGltX2x1dFtMXSwgSSA9IHMtPmZpbHRlci5saW1fbHV0W0xdOworCisgICAgICAgICAgICAgICAgaWYgKGhtMjMgJiB4KSB7CisgICAgICAgICAgICAgICAgICAgIEwgPSBsWzhdOworICAgICAgICAgICAgICAgICAgICBIIHw9IChMID4+IDQpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIEUgfD0gcy0+ZmlsdGVyLm1ibGltX2x1dFtMXSA8PCA4OworICAgICAgICAgICAgICAgICAgICBJIHw9IHMtPmZpbHRlci5saW1fbHV0W0xdIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl9taXgyWzBdWzBdWzBdKHB0ciArIDQsIGxzX3ksIEUsIEksIEgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl84WzBdWzBdKHB0ciArIDQsIGxzX3ksIEUsIEksIEgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0yMyAmIHgpIHsKKyAgICAgICAgICAgICAgICBpbnQgTCA9IGxbOF0sIEggPSBMID4+IDQ7CisgICAgICAgICAgICAgICAgaW50IEUgPSBzLT5maWx0ZXIubWJsaW1fbHV0W0xdLCBJID0gcy0+ZmlsdGVyLmxpbV9sdXRbTF07CisKKyAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFswXVswXShwdHIgKyA4ICogbHNfeSArIDQsIGxzX3ksIEUsIEksIEgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jazEKKyAgICAvLyBmaWx0ZXIgZWRnZXMgYmV0d2VlbiByb3dzLCBZIHBsYW5lIChlLmcuIC0tLS0tLSkKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrMgorICAgIGRzdCA9IGYtPmRhdGFbMF0gKyB5b2ZmOworICAgIGx2bCA9IGxmbHZsLT5sZXZlbDsKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrLCBkc3QgKz0gOCAqIGxzX3ksIGx2bCArPSA4KSB7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IGRzdCwgKmwgPSBsdmwsICp2bWFzayA9IGxmbHZsLT5tYXNrWzBdWzFdW3ldOworICAgICAgICB1bnNpZ25lZCB2bSA9IHZtYXNrWzBdIHwgdm1hc2tbMV0gfCB2bWFza1syXSwgdm0zID0gdm1hc2tbM107CisKKyAgICAgICAgZm9yICh4ID0gMTsgdm0gJiB+KHggLSAxKTsgeCA8PD0gMiwgcHRyICs9IDE2LCBsICs9IDIpIHsKKyAgICAgICAgICAgIGlmIChyb3cgfHwgeSkgeworICAgICAgICAgICAgICAgIGlmICh2bSAmIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IEwgPSAqbCwgSCA9IEwgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgaW50IEUgPSBzLT5maWx0ZXIubWJsaW1fbHV0W0xdLCBJID0gcy0+ZmlsdGVyLmxpbV9sdXRbTF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZtYXNrWzBdICYgeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZtYXNrWzBdICYgKHggPDwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKGxbMV0gPT0gTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzE2WzFdKHB0ciwgbHNfeSwgRSwgSSwgSCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl84WzJdWzFdKHB0ciwgbHNfeSwgRSwgSSwgSCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodm0gJiAoeCA8PCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTCA9IGxbMV07CisgICAgICAgICAgICAgICAgICAgICAgICBIIHw9IChMID4+IDQpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBFIHw9IHMtPmZpbHRlci5tYmxpbV9sdXRbTF0gPDwgODsKKyAgICAgICAgICAgICAgICAgICAgICAgIEkgfD0gcy0+ZmlsdGVyLmxpbV9sdXRbTF0gPDwgODsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl9taXgyWyEhKHZtYXNrWzFdICYgIHgpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbISEodm1hc2tbMV0gJiAoeCA8PCAxKSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXShwdHIsIGxzX3ksIEUsIEksIEgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzhbISEodm1hc2tbMV0gJiB4KV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzFdKHB0ciwgbHNfeSwgRSwgSSwgSCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZtICYgKHggPDwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IEwgPSBsWzFdLCBIID0gTCA+PiA0OworICAgICAgICAgICAgICAgICAgICBpbnQgRSA9IHMtPmZpbHRlci5tYmxpbV9sdXRbTF0sIEkgPSBzLT5maWx0ZXIubGltX2x1dFtMXTsKKworICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFshISh2bWFza1sxXSAmICh4IDw8IDEpKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV0ocHRyICsgOCwgbHNfeSwgRSwgSSwgSCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZtMyAmIHgpIHsKKyAgICAgICAgICAgICAgICBpbnQgTCA9ICpsLCBIID0gTCA+PiA0OworICAgICAgICAgICAgICAgIGludCBFID0gcy0+ZmlsdGVyLm1ibGltX2x1dFtMXSwgSSA9IHMtPmZpbHRlci5saW1fbHV0W0xdOworCisgICAgICAgICAgICAgICAgaWYgKHZtMyAmICh4IDw8IDEpKSB7CisgICAgICAgICAgICAgICAgICAgIEwgPSBsWzFdOworICAgICAgICAgICAgICAgICAgICBIIHw9IChMID4+IDQpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIEUgfD0gcy0+ZmlsdGVyLm1ibGltX2x1dFtMXSA8PCA4OworICAgICAgICAgICAgICAgICAgICBJIHw9IHMtPmZpbHRlci5saW1fbHV0W0xdIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl9taXgyWzBdWzBdWzFdKHB0ciArIGxzX3kgKiA0LCBsc195LCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFswXVsxXShwdHIgKyBsc195ICogNCwgbHNfeSwgRSwgSSwgSCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh2bTMgJiAoeCA8PCAxKSkgeworICAgICAgICAgICAgICAgIGludCBMID0gbFsxXSwgSCA9IEwgPj4gNDsKKyAgICAgICAgICAgICAgICBpbnQgRSA9IHMtPmZpbHRlci5tYmxpbV9sdXRbTF0sIEkgPSBzLT5maWx0ZXIubGltX2x1dFtMXTsKKworICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl84WzBdWzFdKHB0ciArIGxzX3kgKiA0ICsgOCwgbHNfeSwgRSwgSSwgSCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzYW1lIHByaW5jaXBsZSBidXQgZm9yIFUvViBwbGFuZXMKKyAgICBmb3IgKHAgPSAwOyBwIDwgMjsgcCsrKSB7CisgICAgICAgIGx2bCA9IGxmbHZsLT5sZXZlbDsKKyAgICAgICAgZHN0ID0gZi0+ZGF0YVsxICsgcF0gKyB1dm9mZjsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkgKz0gNCwgZHN0ICs9IDE2ICogbHNfdXYsIGx2bCArPSAzMikgeworICAgICAgICAgICAgdWludDhfdCAqcHRyID0gZHN0LCAqbCA9IGx2bCwgKmhtYXNrMSA9IGxmbHZsLT5tYXNrWzFdWzBdW3ldOworICAgICAgICAgICAgdWludDhfdCAqaG1hc2syID0gbGZsdmwtPm1hc2tbMV1bMF1beSArIDJdOworICAgICAgICAgICAgdW5zaWduZWQgaG0xID0gaG1hc2sxWzBdIHwgaG1hc2sxWzFdIHwgaG1hc2sxWzJdOworICAgICAgICAgICAgdW5zaWduZWQgaG0yID0gaG1hc2syWzFdIHwgaG1hc2syWzJdLCBobSA9IGhtMSB8IGhtMjsKKworICAgICAgICAgICAgZm9yICh4ID0gMTsgaG0gJiB+KHggLSAxKTsgeCA8PD0gMSwgcHRyICs9IDQpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29sIHx8IHggPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChobTEgJiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTCA9ICpsLCBIID0gTCA+PiA0OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IEUgPSBzLT5maWx0ZXIubWJsaW1fbHV0W0xdLCBJID0gcy0+ZmlsdGVyLmxpbV9sdXRbTF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobWFzazFbMF0gJiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhtYXNrMlswXSAmIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihsWzE2XSA9PSBMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzE2WzBdKHB0ciwgbHNfdXYsIEUsIEksIEgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl84WzJdWzBdKHB0ciwgbHNfdXYsIEUsIEksIEgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0yICYgeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwgPSBsWzE2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIIHw9IChMID4+IDQpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSB8PSBzLT5maWx0ZXIubWJsaW1fbHV0W0xdIDw8IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSB8PSBzLT5maWx0ZXIubGltX2x1dFtMXSA8PCA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl9taXgyWyEhKGhtYXNrMVsxXSAmIHgpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyEhKGhtYXNrMlsxXSAmIHgpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzBdKHB0ciwgbHNfdXYsIEUsIEksIEgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFshIShobWFzazFbMV0gJiB4KV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswXShwdHIsIGxzX3V2LCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChobTIgJiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTCA9IGxbMTZdLCBIID0gTCA+PiA0OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IEUgPSBzLT5maWx0ZXIubWJsaW1fbHV0W0xdLCBJID0gcy0+ZmlsdGVyLmxpbV9sdXRbTF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl84WyEhKGhtYXNrMlsxXSAmIHgpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0ocHRyICsgOCAqIGxzX3V2LCBsc191diwgRSwgSSwgSCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHggJiAweEFBKQorICAgICAgICAgICAgICAgICAgICBsICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbHZsID0gbGZsdmwtPmxldmVsOworICAgICAgICBkc3QgPSBmLT5kYXRhWzEgKyBwXSArIHV2b2ZmOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrLCBkc3QgKz0gNCAqIGxzX3V2KSB7CisgICAgICAgICAgICB1aW50OF90ICpwdHIgPSBkc3QsICpsID0gbHZsLCAqdm1hc2sgPSBsZmx2bC0+bWFza1sxXVsxXVt5XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHZtID0gdm1hc2tbMF0gfCB2bWFza1sxXSB8IHZtYXNrWzJdOworCisgICAgICAgICAgICBmb3IgKHggPSAxOyB2bSAmIH4oeCAtIDEpOyB4IDw8PSA0LCBwdHIgKz0gMTYsIGwgKz0gNCkgeworICAgICAgICAgICAgICAgIGlmIChyb3cgfHwgeSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodm0gJiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTCA9ICpsLCBIID0gTCA+PiA0OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IEUgPSBzLT5maWx0ZXIubWJsaW1fbHV0W0xdLCBJID0gcy0+ZmlsdGVyLmxpbV9sdXRbTF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bWFza1swXSAmIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm1hc2tbMF0gJiAoeCA8PCAyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKGxbMl0gPT0gTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl8xNlsxXShwdHIsIGxzX3V2LCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFsyXVsxXShwdHIsIGxzX3V2LCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZtICYgKHggPDwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMID0gbFsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIIHw9IChMID4+IDQpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSB8PSBzLT5maWx0ZXIubWJsaW1fbHV0W0xdIDw8IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSB8PSBzLT5maWx0ZXIubGltX2x1dFtMXSA8PCA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl9taXgyWyEhKHZtYXNrWzFdICYgIHgpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyEhKHZtYXNrWzFdICYgKHggPDwgMikpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzFdKHB0ciwgbHNfdXYsIEUsIEksIEgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFshISh2bWFza1sxXSAmIHgpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzFdKHB0ciwgbHNfdXYsIEUsIEksIEgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZtICYgKHggPDwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMID0gbFsyXSwgSCA9IEwgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBFID0gcy0+ZmlsdGVyLm1ibGltX2x1dFtMXSwgSSA9IHMtPmZpbHRlci5saW1fbHV0W0xdOworCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFshISh2bWFza1sxXSAmICh4IDw8IDIpKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzFdKHB0ciArIDgsIGxzX3V2LCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh5ICYgMSkKKyAgICAgICAgICAgICAgICBsdmwgKz0gMTY7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNldF90aWxlX29mZnNldChpbnQgKnN0YXJ0LCBpbnQgKmVuZCwgaW50IGlkeCwgaW50IGxvZzJfbiwgaW50IG4pCit7CisgICAgaW50IHNiX3N0YXJ0ID0gKCBpZHggICAgICAqIG4pID4+IGxvZzJfbjsKKyAgICBpbnQgc2JfZW5kICAgPSAoKGlkeCArIDEpICogbikgPj4gbG9nMl9uOworICAgICpzdGFydCA9IEZGTUlOKHNiX3N0YXJ0LCBuKSA8PCAzOworICAgICplbmQgICA9IEZGTUlOKHNiX2VuZCwgICBuKSA8PCAzOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGFkYXB0X3Byb2IodWludDhfdCAqcCwgdW5zaWduZWQgY3QwLCB1bnNpZ25lZCBjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jb3VudCwgaW50IHVwZGF0ZV9mYWN0b3IpCit7CisgICAgdW5zaWduZWQgY3QgPSBjdDAgKyBjdDEsIHAyLCBwMTsKKworICAgIGlmICghY3QpCisgICAgICAgIHJldHVybjsKKworICAgIHAxID0gKnA7CisgICAgcDIgPSAoKGN0MCA8PCA4KSArIChjdCA+PiAxKSkgLyBjdDsKKyAgICBwMiA9IGF2X2NsaXAocDIsIDEsIDI1NSk7CisgICAgY3QgPSBGRk1JTihjdCwgbWF4X2NvdW50KTsKKyAgICB1cGRhdGVfZmFjdG9yID0gRkFTVERJVih1cGRhdGVfZmFjdG9yICogY3QsIG1heF9jb3VudCk7CisKKyAgICAvLyAocDEgKiAoMjU2IC0gdXBkYXRlX2ZhY3RvcikgKyBwMiAqIHVwZGF0ZV9mYWN0b3IgKyAxMjgpID4+IDgKKyAgICAqcCA9IHAxICsgKCgocDIgLSBwMSkgKiB1cGRhdGVfZmFjdG9yICsgMTI4KSA+PiA4KTsKK30KKworc3RhdGljIHZvaWQgYWRhcHRfcHJvYnMoVlA5Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgaiwgaywgbCwgbTsKKyAgICBwcm9iX2NvbnRleHQgKnAgPSAmcy0+cHJvYl9jdHhbcy0+ZnJhbWVjdHhpZF0ucDsKKyAgICBpbnQgdWYgPSAocy0+a2V5ZnJhbWUgfHwgcy0+aW50cmFvbmx5IHx8ICFzLT5sYXN0X2tleWZyYW1lKSA/IDExMiA6IDEyODsKKworICAgIC8vIGNvZWZmaWNpZW50cworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjsgaysrKQorICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCA2OyBsKyspCisgICAgICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCA2OyBtKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBwID0gcy0+cHJvYl9jdHhbcy0+ZnJhbWVjdHhpZF0uY29lZltpXVtqXVtrXVtsXVttXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICplID0gcy0+Y291bnRzLmVvYltpXVtqXVtrXVtsXVttXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpjID0gcy0+Y291bnRzLmNvZWZbaV1bal1ba11bbF1bbV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsID09IDAgJiYgbSA+PSAzKSAvLyBkYyBvbmx5IGhhcyAzIHB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBlWzBdLCBlWzFdLCAyNCwgdWYpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbMV0sIGNbMF0sIGNbMV0gKyBjWzJdLCAyNCwgdWYpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbMl0sIGNbMV0sIGNbMl0sIDI0LCB1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGlmIChzLT5rZXlmcmFtZSB8fCBzLT5pbnRyYW9ubHkpIHsKKyAgICAgICAgbWVtY3B5KHAtPnNraXAsICBzLT5wcm9iLnAuc2tpcCwgIHNpemVvZihwLT5za2lwKSk7CisgICAgICAgIG1lbWNweShwLT50eDMycCwgcy0+cHJvYi5wLnR4MzJwLCBzaXplb2YocC0+dHgzMnApKTsKKyAgICAgICAgbWVtY3B5KHAtPnR4MTZwLCBzLT5wcm9iLnAudHgxNnAsIHNpemVvZihwLT50eDE2cCkpOworICAgICAgICBtZW1jcHkocC0+dHg4cCwgIHMtPnByb2IucC50eDhwLCAgc2l6ZW9mKHAtPnR4OHApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHNraXAgZmxhZworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGFkYXB0X3Byb2IoJnAtPnNraXBbaV0sIHMtPmNvdW50cy5za2lwW2ldWzBdLCBzLT5jb3VudHMuc2tpcFtpXVsxXSwgMjAsIDEyOCk7CisKKyAgICAvLyBpbnRyYS9pbnRlciBmbGFnCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgYWRhcHRfcHJvYigmcC0+aW50cmFbaV0sIHMtPmNvdW50cy5pbnRyYVtpXVswXSwgcy0+Y291bnRzLmludHJhW2ldWzFdLCAyMCwgMTI4KTsKKworICAgIC8vIGNvbXBwcmVkIGZsYWcKKyAgICBpZiAocy0+Y29tcHByZWRtb2RlID09IFBSRURfU1dJVENIQUJMRSkgeworICAgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgICBhZGFwdF9wcm9iKCZwLT5jb21wW2ldLCBzLT5jb3VudHMuY29tcFtpXVswXSwgcy0+Y291bnRzLmNvbXBbaV1bMV0sIDIwLCAxMjgpOworICAgIH0KKworICAgIC8vIHJlZmVyZW5jZSBmcmFtZXMKKyAgICBpZiAocy0+Y29tcHByZWRtb2RlICE9IFBSRURfU0lOR0xFUkVGKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICAgIGFkYXB0X3Byb2IoJnAtPmNvbXBfcmVmW2ldLCBzLT5jb3VudHMuY29tcF9yZWZbaV1bMF0sCisgICAgICAgICAgICAgICAgICAgICBzLT5jb3VudHMuY29tcF9yZWZbaV1bMV0sIDIwLCAxMjgpOworICAgIH0KKworICAgIGlmIChzLT5jb21wcHJlZG1vZGUgIT0gUFJFRF9DT01QUkVGKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgdWludDhfdCAqcHAgPSBwLT5zaW5nbGVfcmVmW2ldOworICAgICAgICAgIHVuc2lnbmVkICgqYylbMl0gPSBzLT5jb3VudHMuc2luZ2xlX3JlZltpXTsKKworICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzBdWzBdLCBjWzBdWzFdLCAyMCwgMTI4KTsKKyAgICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1sxXVswXSwgY1sxXVsxXSwgMjAsIDEyOCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gYmxvY2sgcGFydGl0aW9uaW5nCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgdWludDhfdCAqcHAgPSBwLT5wYXJ0aXRpb25baV1bal07CisgICAgICAgICAgICB1bnNpZ25lZCAqYyA9IHMtPmNvdW50cy5wYXJ0aXRpb25baV1bal07CisKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzBdLCBjWzFdICsgY1syXSArIGNbM10sIDIwLCAxMjgpOworICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbMV0sIGNbMV0sIGNbMl0gKyBjWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzJdLCBjWzJdLCBjWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgfQorCisgICAgLy8gdHggc2l6ZQorICAgIGlmIChzLT50eGZtbW9kZSA9PSBUWF9TV0lUQ0hBQkxFKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgdW5zaWduZWQgKmMxNiA9IHMtPmNvdW50cy50eDE2cFtpXSwgKmMzMiA9IHMtPmNvdW50cy50eDMycFtpXTsKKworICAgICAgICAgIGFkYXB0X3Byb2IoJnAtPnR4OHBbaV0sIHMtPmNvdW50cy50eDhwW2ldWzBdLCBzLT5jb3VudHMudHg4cFtpXVsxXSwgMjAsIDEyOCk7CisgICAgICAgICAgYWRhcHRfcHJvYigmcC0+dHgxNnBbaV1bMF0sIGMxNlswXSwgYzE2WzFdICsgYzE2WzJdLCAyMCwgMTI4KTsKKyAgICAgICAgICBhZGFwdF9wcm9iKCZwLT50eDE2cFtpXVsxXSwgYzE2WzFdLCBjMTZbMl0sIDIwLCAxMjgpOworICAgICAgICAgIGFkYXB0X3Byb2IoJnAtPnR4MzJwW2ldWzBdLCBjMzJbMF0sIGMzMlsxXSArIGMzMlsyXSArIGMzMlszXSwgMjAsIDEyOCk7CisgICAgICAgICAgYWRhcHRfcHJvYigmcC0+dHgzMnBbaV1bMV0sIGMzMlsxXSwgYzMyWzJdICsgYzMyWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgICBhZGFwdF9wcm9iKCZwLT50eDMycFtpXVsyXSwgYzMyWzJdLCBjMzJbM10sIDIwLCAxMjgpOworICAgICAgfQorICAgIH0KKworICAgIC8vIGludGVycG9sYXRpb24gZmlsdGVyCisgICAgaWYgKHMtPmZpbHRlcm1vZGUgPT0gRklMVEVSX1NXSVRDSEFCTEUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgdWludDhfdCAqcHAgPSBwLT5maWx0ZXJbaV07CisgICAgICAgICAgICB1bnNpZ25lZCAqYyA9IHMtPmNvdW50cy5maWx0ZXJbaV07CisKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzBdLCBjWzFdICsgY1syXSwgMjAsIDEyOCk7CisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1sxXSwgY1syXSwgMjAsIDEyOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpbnRlciBtb2RlcworICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKyAgICAgICAgdWludDhfdCAqcHAgPSBwLT5tdl9tb2RlW2ldOworICAgICAgICB1bnNpZ25lZCAqYyA9IHMtPmNvdW50cy5tdl9tb2RlW2ldOworCisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzJdLCBjWzFdICsgY1swXSArIGNbM10sIDIwLCAxMjgpOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1swXSwgY1sxXSArIGNbM10sIDIwLCAxMjgpOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsyXSwgY1sxXSwgY1szXSwgMjAsIDEyOCk7CisgICAgfQorCisgICAgLy8gbXYgam9pbnRzCisgICAgeworICAgICAgICB1aW50OF90ICpwcCA9IHAtPm12X2pvaW50OworICAgICAgICB1bnNpZ25lZCAqYyA9IHMtPmNvdW50cy5tdl9qb2ludDsKKworICAgICAgICBhZGFwdF9wcm9iKCZwcFswXSwgY1swXSwgY1sxXSArIGNbMl0gKyBjWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbMV0sIGNbMV0sIGNbMl0gKyBjWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbMl0sIGNbMl0sIGNbM10sIDIwLCAxMjgpOworICAgIH0KKworICAgIC8vIG12IGNvbXBvbmVudHMKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgKnBwOworICAgICAgICB1bnNpZ25lZCAqYywgKCpjMilbMl0sIHN1bTsKKworICAgICAgICBhZGFwdF9wcm9iKCZwLT5tdl9jb21wW2ldLnNpZ24sIHMtPmNvdW50cy5tdl9jb21wW2ldLnNpZ25bMF0sCisgICAgICAgICAgICAgICAgICAgcy0+Y291bnRzLm12X2NvbXBbaV0uc2lnblsxXSwgMjAsIDEyOCk7CisKKyAgICAgICAgcHAgPSBwLT5tdl9jb21wW2ldLmNsYXNzZXM7CisgICAgICAgIGMgPSBzLT5jb3VudHMubXZfY29tcFtpXS5jbGFzc2VzOworICAgICAgICBzdW0gPSBjWzFdICsgY1syXSArIGNbM10gKyBjWzRdICsgY1s1XSArIGNbNl0gKyBjWzddICsgY1s4XSArIGNbOV0gKyBjWzEwXTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbMF0sIGNbMF0sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIHN1bSAtPSBjWzFdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1sxXSwgc3VtLCAyMCwgMTI4KTsKKyAgICAgICAgc3VtIC09IGNbMl0gKyBjWzNdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsyXSwgY1syXSArIGNbM10sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzNdLCBjWzJdLCBjWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgc3VtIC09IGNbNF0gKyBjWzVdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs0XSwgY1s0XSArIGNbNV0sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzVdLCBjWzRdLCBjWzVdLCAyMCwgMTI4KTsKKyAgICAgICAgc3VtIC09IGNbNl07CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzZdLCBjWzZdLCBzdW0sIDIwLCAxMjgpOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs3XSwgY1s3XSArIGNbOF0sIGNbOV0gKyBjWzEwXSwgMjAsIDEyOCk7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzhdLCBjWzddLCBjWzhdLCAyMCwgMTI4KTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbOV0sIGNbOV0sIGNbMTBdLCAyMCwgMTI4KTsKKworICAgICAgICBhZGFwdF9wcm9iKCZwLT5tdl9jb21wW2ldLmNsYXNzMCwgcy0+Y291bnRzLm12X2NvbXBbaV0uY2xhc3MwWzBdLAorICAgICAgICAgICAgICAgICAgIHMtPmNvdW50cy5tdl9jb21wW2ldLmNsYXNzMFsxXSwgMjAsIDEyOCk7CisgICAgICAgIHBwID0gcC0+bXZfY29tcFtpXS5iaXRzOworICAgICAgICBjMiA9IHMtPmNvdW50cy5tdl9jb21wW2ldLmJpdHM7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMDsgaisrKQorICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbal0sIGMyW2pdWzBdLCBjMltqXVsxXSwgMjAsIDEyOCk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgcHAgPSBwLT5tdl9jb21wW2ldLmNsYXNzMF9mcFtqXTsKKyAgICAgICAgICAgIGMgPSBzLT5jb3VudHMubXZfY29tcFtpXS5jbGFzczBfZnBbal07CisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwcFswXSwgY1swXSwgY1sxXSArIGNbMl0gKyBjWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjWzFdLCBjWzJdICsgY1szXSwgMjAsIDEyOCk7CisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwcFsyXSwgY1syXSwgY1szXSwgMjAsIDEyOCk7CisgICAgICAgIH0KKyAgICAgICAgcHAgPSBwLT5tdl9jb21wW2ldLmZwOworICAgICAgICBjID0gcy0+Y291bnRzLm12X2NvbXBbaV0uZnA7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzBdLCBjWzFdICsgY1syXSArIGNbM10sIDIwLCAxMjgpOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1sxXSwgY1syXSArIGNbM10sIDIwLCAxMjgpOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsyXSwgY1syXSwgY1szXSwgMjAsIDEyOCk7CisKKyAgICAgICAgaWYgKHMtPmhpZ2hwcmVjaXNpb25tdnMpIHsKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnAtPm12X2NvbXBbaV0uY2xhc3MwX2hwLCBzLT5jb3VudHMubXZfY29tcFtpXS5jbGFzczBfaHBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvdW50cy5tdl9jb21wW2ldLmNsYXNzMF9ocFsxXSwgMjAsIDEyOCk7CisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwLT5tdl9jb21wW2ldLmhwLCBzLT5jb3VudHMubXZfY29tcFtpXS5ocFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+Y291bnRzLm12X2NvbXBbaV0uaHBbMV0sIDIwLCAxMjgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8geSBpbnRyYSBtb2RlcworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgdWludDhfdCAqcHAgPSBwLT55X21vZGVbaV07CisgICAgICAgIHVuc2lnbmVkICpjID0gcy0+Y291bnRzLnlfbW9kZVtpXSwgc3VtLCBzMjsKKworICAgICAgICBzdW0gPSBjWzBdICsgY1sxXSArIGNbM10gKyBjWzRdICsgY1s1XSArIGNbNl0gKyBjWzddICsgY1s4XSArIGNbOV07CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjW0RDX1BSRURdLCBzdW0sIDIwLCAxMjgpOworICAgICAgICBzdW0gLT0gY1tUTV9WUDhfUFJFRF07CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjW1RNX1ZQOF9QUkVEXSwgc3VtLCAyMCwgMTI4KTsKKyAgICAgICAgc3VtIC09IGNbVkVSVF9QUkVEXTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbMl0sIGNbVkVSVF9QUkVEXSwgc3VtLCAyMCwgMTI4KTsKKyAgICAgICAgczIgPSBjW0hPUl9QUkVEXSArIGNbRElBR19ET1dOX1JJR0hUX1BSRURdICsgY1tWRVJUX1JJR0hUX1BSRURdOworICAgICAgICBzdW0gLT0gczI7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzNdLCBzMiwgc3VtLCAyMCwgMTI4KTsKKyAgICAgICAgczIgLT0gY1tIT1JfUFJFRF07CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzRdLCBjW0hPUl9QUkVEXSwgczIsIDIwLCAxMjgpOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs1XSwgY1tESUFHX0RPV05fUklHSFRfUFJFRF0sIGNbVkVSVF9SSUdIVF9QUkVEXSwgMjAsIDEyOCk7CisgICAgICAgIHN1bSAtPSBjW0RJQUdfRE9XTl9MRUZUX1BSRURdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs2XSwgY1tESUFHX0RPV05fTEVGVF9QUkVEXSwgc3VtLCAyMCwgMTI4KTsKKyAgICAgICAgc3VtIC09IGNbVkVSVF9MRUZUX1BSRURdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs3XSwgY1tWRVJUX0xFRlRfUFJFRF0sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzhdLCBjW0hPUl9ET1dOX1BSRURdLCBjW0hPUl9VUF9QUkVEXSwgMjAsIDEyOCk7CisgICAgfQorCisgICAgLy8gdXYgaW50cmEgbW9kZXMKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICB1aW50OF90ICpwcCA9IHAtPnV2X21vZGVbaV07CisgICAgICAgIHVuc2lnbmVkICpjID0gcy0+Y291bnRzLnV2X21vZGVbaV0sIHN1bSwgczI7CisKKyAgICAgICAgc3VtID0gY1swXSArIGNbMV0gKyBjWzNdICsgY1s0XSArIGNbNV0gKyBjWzZdICsgY1s3XSArIGNbOF0gKyBjWzldOworICAgICAgICBhZGFwdF9wcm9iKCZwcFswXSwgY1tEQ19QUkVEXSwgc3VtLCAyMCwgMTI4KTsKKyAgICAgICAgc3VtIC09IGNbVE1fVlA4X1BSRURdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1tUTV9WUDhfUFJFRF0sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIHN1bSAtPSBjW1ZFUlRfUFJFRF07CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzJdLCBjW1ZFUlRfUFJFRF0sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIHMyID0gY1tIT1JfUFJFRF0gKyBjW0RJQUdfRE9XTl9SSUdIVF9QUkVEXSArIGNbVkVSVF9SSUdIVF9QUkVEXTsKKyAgICAgICAgc3VtIC09IHMyOworICAgICAgICBhZGFwdF9wcm9iKCZwcFszXSwgczIsIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIHMyIC09IGNbSE9SX1BSRURdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs0XSwgY1tIT1JfUFJFRF0sIHMyLCAyMCwgMTI4KTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbNV0sIGNbRElBR19ET1dOX1JJR0hUX1BSRURdLCBjW1ZFUlRfUklHSFRfUFJFRF0sIDIwLCAxMjgpOworICAgICAgICBzdW0gLT0gY1tESUFHX0RPV05fTEVGVF9QUkVEXTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbNl0sIGNbRElBR19ET1dOX0xFRlRfUFJFRF0sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIHN1bSAtPSBjW1ZFUlRfTEVGVF9QUkVEXTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbN10sIGNbVkVSVF9MRUZUX1BSRURdLCBzdW0sIDIwLCAxMjgpOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs4XSwgY1tIT1JfRE9XTl9QUkVEXSwgY1tIT1JfVVBfUFJFRF0sIDIwLCAxMjgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZnJlZV9idWZmZXJzKFZQOUNvbnRleHQgKnMpCit7CisgICAgYXZfZnJlZXAoJnMtPmludHJhX3ByZWRfZGF0YVswXSk7CisgICAgYXZfZnJlZXAoJnMtPmJfYmFzZSk7CisgICAgYXZfZnJlZXAoJnMtPmJsb2NrX2Jhc2UpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdnA5X2RlY29kZV9mcmVlKEFWQ29kZWNDb250ZXh0ICpjdHgpCit7CisgICAgVlA5Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpZiAocy0+ZnJhbWVzW2ldLnRmLmYtPmRhdGFbMF0pCisgICAgICAgICAgICB2cDlfdW5yZWZfZnJhbWUoY3R4LCAmcy0+ZnJhbWVzW2ldKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWVzW2ldLnRmLmYpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGlmIChzLT5yZWZzW2ldLmYtPmRhdGFbMF0pCisgICAgICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoY3R4LCAmcy0+cmVmc1tpXSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnJlZnNbaV0uZik7CisgICAgICAgIGlmIChzLT5uZXh0X3JlZnNbaV0uZi0+ZGF0YVswXSkKKyAgICAgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihjdHgsICZzLT5uZXh0X3JlZnNbaV0pOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5uZXh0X3JlZnNbaV0uZik7CisgICAgfQorICAgIGZyZWVfYnVmZmVycyhzKTsKKyAgICBhdl9mcmVlcCgmcy0+Y19iKTsKKyAgICBzLT5jX2Jfc2l6ZSA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHZwOV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmN0eCwgdm9pZCAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICpwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IHBrdC0+ZGF0YTsKKyAgICBpbnQgc2l6ZSA9IHBrdC0+c2l6ZTsKKyAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJlcywgdGlsZV9yb3csIHRpbGVfY29sLCBpLCByZWYsIHJvdywgY29sOworICAgIHB0cmRpZmZfdCB5b2ZmLCB1dm9mZiwgbHNfeSwgbHNfdXY7CisgICAgQVZGcmFtZSAqZjsKKworICAgIGlmICgocmVzID0gZGVjb2RlX2ZyYW1lX2hlYWRlcihjdHgsIGRhdGEsIHNpemUsICZyZWYpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgIGlmICghcy0+cmVmc1tyZWZdLmYtPmRhdGFbMF0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlJlcXVlc3RlZCByZWZlcmVuY2UgJWQgbm90IGF2YWlsYWJsZVxuIiwgcmVmKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmICgocmVzID0gYXZfZnJhbWVfcmVmKGZyYW1lLCBzLT5yZWZzW3JlZl0uZikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICpnb3RfZnJhbWUgPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZGF0YSArPSByZXM7CisgICAgc2l6ZSAtPSByZXM7CisKKyAgICBpZiAocy0+ZnJhbWVzW0xBU1RfRlJBTUVdLnRmLmYtPmRhdGFbMF0pCisgICAgICAgIHZwOV91bnJlZl9mcmFtZShjdHgsICZzLT5mcmFtZXNbTEFTVF9GUkFNRV0pOworICAgIGlmICghcy0+a2V5ZnJhbWUgJiYgcy0+ZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+ZGF0YVswXSAmJgorICAgICAgICAocmVzID0gdnA5X3JlZl9mcmFtZShjdHgsICZzLT5mcmFtZXNbTEFTVF9GUkFNRV0sICZzLT5mcmFtZXNbQ1VSX0ZSQU1FXSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBpZiAocy0+ZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+ZGF0YVswXSkKKyAgICAgICAgdnA5X3VucmVmX2ZyYW1lKGN0eCwgJnMtPmZyYW1lc1tDVVJfRlJBTUVdKTsKKyAgICBpZiAoKHJlcyA9IHZwOV9hbGxvY19mcmFtZShjdHgsICZzLT5mcmFtZXNbQ1VSX0ZSQU1FXSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBmID0gcy0+ZnJhbWVzW0NVUl9GUkFNRV0udGYuZjsKKyAgICBmLT5rZXlfZnJhbWUgPSBzLT5rZXlmcmFtZTsKKyAgICBmLT5waWN0X3R5cGUgPSBzLT5rZXlmcmFtZSA/IEFWX1BJQ1RVUkVfVFlQRV9JIDogQVZfUElDVFVSRV9UWVBFX1A7CisgICAgbHNfeSA9IGYtPmxpbmVzaXplWzBdOworICAgIGxzX3V2ID1mLT5saW5lc2l6ZVsxXTsKKworICAgIC8vIHJlZiBmcmFtZSBzZXR1cAorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgaWYgKHMtPm5leHRfcmVmc1tpXS5mLT5kYXRhWzBdKQorICAgICAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGN0eCwgJnMtPm5leHRfcmVmc1tpXSk7CisgICAgICAgIGlmIChzLT5yZWZyZXNocmVmbWFzayAmICgxIDw8IGkpKSB7CisgICAgICAgICAgICByZXMgPSBmZl90aHJlYWRfcmVmX2ZyYW1lKCZzLT5uZXh0X3JlZnNbaV0sICZzLT5mcmFtZXNbQ1VSX0ZSQU1FXS50Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBmZl90aHJlYWRfcmVmX2ZyYW1lKCZzLT5uZXh0X3JlZnNbaV0sICZzLT5yZWZzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKHMtPmZ1bGxyYW5nZSkKKyAgICAgICAgY3R4LT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgZWxzZQorICAgICAgICBjdHgtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfTVBFRzsKKworICAgIHN3aXRjaCAocy0+Y29sb3JzcGFjZSkgeworICAgIGNhc2UgMTogY3R4LT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNDcwQkc7IGJyZWFrOworICAgIGNhc2UgMjogY3R4LT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNzA5OyBicmVhazsKKyAgICBjYXNlIDM6IGN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19TTVBURTE3ME07IGJyZWFrOworICAgIGNhc2UgNDogY3R4LT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX1NNUFRFMjQwTTsgYnJlYWs7CisgICAgfQorCisgICAgLy8gbWFpbiB0aWxlIGRlY29kZSBsb29wCisgICAgbWVtc2V0KHMtPmFib3ZlX3BhcnRpdGlvbl9jdHgsIDAsIHMtPmNvbHMpOworICAgIG1lbXNldChzLT5hYm92ZV9za2lwX2N0eCwgMCwgcy0+Y29scyk7CisgICAgaWYgKHMtPmtleWZyYW1lIHx8IHMtPmludHJhb25seSkgeworICAgICAgICBtZW1zZXQocy0+YWJvdmVfbW9kZV9jdHgsIERDX1BSRUQsIHMtPmNvbHMgKiAyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1zZXQocy0+YWJvdmVfbW9kZV9jdHgsIE5FQVJFU1RNViwgcy0+Y29scyk7CisgICAgfQorICAgIG1lbXNldChzLT5hYm92ZV95X25uel9jdHgsIDAsIHMtPnNiX2NvbHMgKiAxNik7CisgICAgbWVtc2V0KHMtPmFib3ZlX3V2X25uel9jdHhbMF0sIDAsIHMtPnNiX2NvbHMgKiA4KTsKKyAgICBtZW1zZXQocy0+YWJvdmVfdXZfbm56X2N0eFsxXSwgMCwgcy0+c2JfY29scyAqIDgpOworICAgIG1lbXNldChzLT5hYm92ZV9zZWdwcmVkX2N0eCwgMCwgcy0+Y29scyk7CisgICAgcy0+cGFzcyA9IHMtPnVzZXNfMnBhc3MgPQorICAgICAgICBjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSA9PSBGRl9USFJFQURfRlJBTUUgJiYgcy0+cmVmcmVzaGN0eCAmJiAhcy0+cGFyYWxsZWxtb2RlOworICAgIGlmICgocmVzID0gdXBkYXRlX2Jsb2NrX2J1ZmZlcnMoY3R4KSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgYmxvY2sgYnVmZmVyc1xuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlmIChzLT5yZWZyZXNoY3R4ICYmIHMtPnBhcmFsbGVsbW9kZSkgeworICAgICAgICBpbnQgaiwgaywgbCwgbTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAyOyBrKyspCisgICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCA2OyBsKyspCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgNjsgbSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5wcm9iX2N0eFtzLT5mcmFtZWN0eGlkXS5jb2VmW2ldW2pdW2tdW2xdW21dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLmNvZWZbaV1bal1ba11bbF1bbV0sIDMpOworICAgICAgICAgICAgaWYgKHMtPnR4Zm1tb2RlID09IGkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy0+cHJvYl9jdHhbcy0+ZnJhbWVjdHhpZF0ucCA9IHMtPnByb2IucDsKKyAgICAgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChjdHgpOworICAgIH0gZWxzZSBpZiAoIXMtPnJlZnJlc2hjdHgpIHsKKyAgICAgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChjdHgpOworICAgIH0KKworICAgIGRvIHsKKyAgICAgICAgeW9mZiA9IHV2b2ZmID0gMDsKKyAgICAgICAgcy0+YiA9IHMtPmJfYmFzZTsKKyAgICAgICAgcy0+YmxvY2sgPSBzLT5ibG9ja19iYXNlOworICAgICAgICBzLT51dmJsb2NrWzBdID0gcy0+dXZibG9ja19iYXNlWzBdOworICAgICAgICBzLT51dmJsb2NrWzFdID0gcy0+dXZibG9ja19iYXNlWzFdOworICAgICAgICBzLT5lb2IgPSBzLT5lb2JfYmFzZTsKKyAgICAgICAgcy0+dXZlb2JbMF0gPSBzLT51dmVvYl9iYXNlWzBdOworICAgICAgICBzLT51dmVvYlsxXSA9IHMtPnV2ZW9iX2Jhc2VbMV07CisKKyAgICAgICAgZm9yICh0aWxlX3JvdyA9IDA7IHRpbGVfcm93IDwgcy0+dGlsaW5nLnRpbGVfcm93czsgdGlsZV9yb3crKykgeworICAgICAgICAgICAgc2V0X3RpbGVfb2Zmc2V0KCZzLT50aWxpbmcudGlsZV9yb3dfc3RhcnQsICZzLT50aWxpbmcudGlsZV9yb3dfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfcm93LCBzLT50aWxpbmcubG9nMl90aWxlX3Jvd3MsIHMtPnNiX3Jvd3MpOworICAgICAgICAgICAgaWYgKHMtPnBhc3MgIT0gMikgeworICAgICAgICAgICAgICAgIGZvciAodGlsZV9jb2wgPSAwOyB0aWxlX2NvbCA8IHMtPnRpbGluZy50aWxlX2NvbHM7IHRpbGVfY29sKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdGlsZV9zaXplOworCisgICAgICAgICAgICAgICAgICAgIGlmICh0aWxlX2NvbCA9PSBzLT50aWxpbmcudGlsZV9jb2xzIC0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9yb3cgPT0gcy0+dGlsaW5nLnRpbGVfcm93cyAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfc2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWxlX3NpemUgPSBBVl9SQjMyKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtPSA0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0aWxlX3NpemUgPiBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5mcmFtZXNbQ1VSX0ZSQU1FXS50ZiwgSU5UX01BWCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2Rlcigmcy0+Y19iW3RpbGVfY29sXSwgZGF0YSwgdGlsZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoJnMtPmNfYlt0aWxlX2NvbF0sIDEyOCkpIHsgLy8gbWFya2VyIGJpdAorICAgICAgICAgICAgICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmcy0+ZnJhbWVzW0NVUl9GUkFNRV0udGYsIElOVF9NQVgsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSB0aWxlX3NpemU7CisgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gdGlsZV9zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChyb3cgPSBzLT50aWxpbmcudGlsZV9yb3dfc3RhcnQ7IHJvdyA8IHMtPnRpbGluZy50aWxlX3Jvd19lbmQ7CisgICAgICAgICAgICAgICAgIHJvdyArPSA4LCB5b2ZmICs9IGxzX3kgKiA2NCwgdXZvZmYgKz0gbHNfdXYgKiAzMikgeworICAgICAgICAgICAgICAgIHN0cnVjdCBWUDlGaWx0ZXIgKmxmbHZsX3B0ciA9IHMtPmxmbHZsOworICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB5b2ZmMiA9IHlvZmYsIHV2b2ZmMiA9IHV2b2ZmOworCisgICAgICAgICAgICAgICAgZm9yICh0aWxlX2NvbCA9IDA7IHRpbGVfY29sIDwgcy0+dGlsaW5nLnRpbGVfY29sczsgdGlsZV9jb2wrKykgeworICAgICAgICAgICAgICAgICAgICBzZXRfdGlsZV9vZmZzZXQoJnMtPnRpbGluZy50aWxlX2NvbF9zdGFydCwgJnMtPnRpbGluZy50aWxlX2NvbF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2NvbCwgcy0+dGlsaW5nLmxvZzJfdGlsZV9jb2xzLCBzLT5zYl9jb2xzKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGFzcyAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocy0+bGVmdF9wYXJ0aXRpb25fY3R4LCAwLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChzLT5sZWZ0X3NraXBfY3R4LCAwLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5rZXlmcmFtZSB8fCBzLT5pbnRyYW9ubHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocy0+bGVmdF9tb2RlX2N0eCwgRENfUFJFRCwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocy0+bGVmdF9tb2RlX2N0eCwgTkVBUkVTVE1WLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChzLT5sZWZ0X3lfbm56X2N0eCwgMCwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmxlZnRfdXZfbm56X2N0eCwgMCwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmxlZnRfc2VncHJlZF9jdHgsIDAsIDgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnMtPmMsICZzLT5jX2JbdGlsZV9jb2xdLCBzaXplb2Yocy0+YykpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb2wgPSBzLT50aWxpbmcudGlsZV9jb2xfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29sIDwgcy0+dGlsaW5nLnRpbGVfY29sX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgKz0gOCwgeW9mZjIgKz0gNjQsIHV2b2ZmMiArPSAzMiwgbGZsdmxfcHRyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGludGVncmF0ZSB3aXRoIGxmIGNvZGUgKGkuZS4gemVybyBhZnRlciBlYWNoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UsIHNpbWlsYXIgdG8gaW52dHhmbSBjb2VmZmljaWVudHMsIG9yIHNpbWlsYXIpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGFzcyAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGxmbHZsX3B0ci0+bWFzaywgMCwgc2l6ZW9mKGxmbHZsX3B0ci0+bWFzaykpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGFzcyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3NiX21lbShjdHgsIHJvdywgY29sLCBsZmx2bF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b2ZmMiwgdXZvZmYyLCBCTF82NFg2NCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9zYihjdHgsIHJvdywgY29sLCBsZmx2bF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvZmYyLCB1dm9mZjIsIEJMXzY0WDY0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGFzcyAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnMtPmNfYlt0aWxlX2NvbF0sICZzLT5jLCBzaXplb2Yocy0+YykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHMtPnBhc3MgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBiYWNrdXAgcHJlLWxvb3BmaWx0ZXIgcmVjb25zdHJ1Y3Rpb24gZGF0YSBmb3IgaW50cmEKKyAgICAgICAgICAgICAgICAvLyBwcmVkaWN0aW9uIG9mIG5leHQgcm93IG9mIHNiNjRzCisgICAgICAgICAgICAgICAgaWYgKHJvdyArIDggPCBzLT5yb3dzKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5pbnRyYV9wcmVkX2RhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5kYXRhWzBdICsgeW9mZiArIDYzICogbHNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDggKiBzLT5jb2xzKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHMtPmludHJhX3ByZWRfZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmRhdGFbMV0gKyB1dm9mZiArIDMxICogbHNfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICogcy0+Y29scyk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5pbnRyYV9wcmVkX2RhdGFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5kYXRhWzJdICsgdXZvZmYgKyAzMSAqIGxzX3V2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAqIHMtPmNvbHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGxvb3BmaWx0ZXIgb25lIHJvdworICAgICAgICAgICAgICAgIGlmIChzLT5maWx0ZXIubGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgeW9mZjIgPSB5b2ZmOworICAgICAgICAgICAgICAgICAgICB1dm9mZjIgPSB1dm9mZjsKKyAgICAgICAgICAgICAgICAgICAgbGZsdmxfcHRyID0gcy0+bGZsdmw7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgcy0+Y29sczsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgKz0gOCwgeW9mZjIgKz0gNjQsIHV2b2ZmMiArPSAzMiwgbGZsdmxfcHRyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BmaWx0ZXJfc2IoY3R4LCBsZmx2bF9wdHIsIHJvdywgY29sLCB5b2ZmMiwgdXZvZmYyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEZJWE1FIG1heWJlIHdlIGNhbiBtYWtlIHRoaXMgbW9yZSBmaW5lZ3JhaW5lZCBieSBydW5uaW5nIHRoZQorICAgICAgICAgICAgICAgIC8vIGxvb3BmaWx0ZXIgcGVyLWJsb2NrIGluc3RlYWQgb2YgYWZ0ZXIgZWFjaCBzYnJvdworICAgICAgICAgICAgICAgIC8vIEluIGZhY3QgdGhhdCB3b3VsZCBhbHNvIG1ha2UgaW50cmEgcHJlZCBsZWZ0IHByZXBhcmF0aW9uIGVhc2llcj8KKyAgICAgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5mcmFtZXNbQ1VSX0ZSQU1FXS50Ziwgcm93ID4+IDMsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnBhc3MgPCAyICYmIHMtPnJlZnJlc2hjdHggJiYgIXMtPnBhcmFsbGVsbW9kZSkgeworICAgICAgICAgICAgYWRhcHRfcHJvYnMocyk7CisgICAgICAgICAgICBmZl90aHJlYWRfZmluaXNoX3NldHVwKGN0eCk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChzLT5wYXNzKysgPT0gMSk7CisgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmcy0+ZnJhbWVzW0NVUl9GUkFNRV0udGYsIElOVF9NQVgsIDApOworCisgICAgLy8gcmVmIGZyYW1lIHNldHVwCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBpZiAocy0+cmVmc1tpXS5mLT5kYXRhWzBdKQorICAgICAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGN0eCwgJnMtPnJlZnNbaV0pOworICAgICAgICBmZl90aHJlYWRfcmVmX2ZyYW1lKCZzLT5yZWZzW2ldLCAmcy0+bmV4dF9yZWZzW2ldKTsKKyAgICB9CisKKyAgICBpZiAoIXMtPmludmlzaWJsZSkgeworICAgICAgICBpZiAoKHJlcyA9IGF2X2ZyYW1lX3JlZihmcmFtZSwgcy0+ZnJhbWVzW0NVUl9GUkFNRV0udGYuZikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICpnb3RfZnJhbWUgPSAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2cDlfZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICpjdHgpCit7CisgICAgVlA5Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgdnA5X3VucmVmX2ZyYW1lKGN0eCwgJnMtPmZyYW1lc1tpXSk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGN0eCwgJnMtPnJlZnNbaV0pOworfQorCitzdGF0aWMgaW50IGluaXRfZnJhbWVzKEFWQ29kZWNDb250ZXh0ICpjdHgpCit7CisgICAgVlA5Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBzLT5mcmFtZXNbaV0udGYuZiA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgIGlmICghcy0+ZnJhbWVzW2ldLnRmLmYpIHsKKyAgICAgICAgICAgIHZwOV9kZWNvZGVfZnJlZShjdHgpOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciAlZFxuIiwgaSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgcy0+cmVmc1tpXS5mID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICAgICAgcy0+bmV4dF9yZWZzW2ldLmYgPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICBpZiAoIXMtPnJlZnNbaV0uZiB8fCAhcy0+bmV4dF9yZWZzW2ldLmYpIHsKKyAgICAgICAgICAgIHZwOV9kZWNvZGVfZnJlZShjdHgpOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciAlZFxuIiwgaSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2cDlfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmN0eCkKK3sKKyAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisKKyAgICBjdHgtPmludGVybmFsLT5hbGxvY2F0ZV9wcm9ncmVzcyA9IDE7CisgICAgY3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgIGZmX3ZwOWRzcF9pbml0KCZzLT5kc3ApOworICAgIGZmX3ZpZGVvZHNwX2luaXQoJnMtPnZkc3AsIDgpOworICAgIHMtPmZpbHRlci5zaGFycG5lc3MgPSAtMTsKKworICAgIHJldHVybiBpbml0X2ZyYW1lcyhjdHgpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdnA5X2RlY29kZV9pbml0X3RocmVhZF9jb3B5KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICByZXR1cm4gaW5pdF9mcmFtZXMoYXZjdHgpOworfQorCitzdGF0aWMgaW50IHZwOV9kZWNvZGVfdXBkYXRlX3RocmVhZF9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICpkc3QsIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpzcmMpCit7CisgICAgaW50IGksIHJlczsKKyAgICBWUDlDb250ZXh0ICpzID0gZHN0LT5wcml2X2RhdGEsICpzc3JjID0gc3JjLT5wcml2X2RhdGE7CisKKyAgICAvLyBkZXRlY3Qgc2l6ZSBjaGFuZ2VzIGluIG90aGVyIHRocmVhZHMKKyAgICBpZiAocy0+aW50cmFfcHJlZF9kYXRhWzBdICYmCisgICAgICAgICghc3NyYy0+aW50cmFfcHJlZF9kYXRhWzBdIHx8IHMtPmNvbHMgIT0gc3NyYy0+Y29scyB8fCBzLT5yb3dzICE9IHNzcmMtPnJvd3MpKSB7CisgICAgICAgIGZyZWVfYnVmZmVycyhzKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGlmIChzLT5mcmFtZXNbaV0udGYuZi0+ZGF0YVswXSkKKyAgICAgICAgICAgIHZwOV91bnJlZl9mcmFtZShkc3QsICZzLT5mcmFtZXNbaV0pOworICAgICAgICBpZiAoc3NyYy0+ZnJhbWVzW2ldLnRmLmYtPmRhdGFbMF0pIHsKKyAgICAgICAgICAgIGlmICgocmVzID0gdnA5X3JlZl9mcmFtZShkc3QsICZzLT5mcmFtZXNbaV0sICZzc3JjLT5mcmFtZXNbaV0pKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGlmIChzLT5yZWZzW2ldLmYtPmRhdGFbMF0pCisgICAgICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoZHN0LCAmcy0+cmVmc1tpXSk7CisgICAgICAgIGlmIChzc3JjLT5uZXh0X3JlZnNbaV0uZi0+ZGF0YVswXSkgeworICAgICAgICAgICAgaWYgKChyZXMgPSBmZl90aHJlYWRfcmVmX2ZyYW1lKCZzLT5yZWZzW2ldLCAmc3NyYy0+bmV4dF9yZWZzW2ldKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5pbnZpc2libGUgPSBzc3JjLT5pbnZpc2libGU7CisgICAgcy0+a2V5ZnJhbWUgPSBzc3JjLT5rZXlmcmFtZTsKKyAgICBzLT51c2VzXzJwYXNzID0gc3NyYy0+dXNlc18ycGFzczsKKyAgICBtZW1jcHkoJnMtPnByb2JfY3R4LCAmc3NyYy0+cHJvYl9jdHgsIHNpemVvZihzLT5wcm9iX2N0eCkpOworICAgIG1lbWNweSgmcy0+bGZfZGVsdGEsICZzc3JjLT5sZl9kZWx0YSwgc2l6ZW9mKHMtPmxmX2RlbHRhKSk7CisgICAgaWYgKHNzcmMtPnNlZ21lbnRhdGlvbi5lbmFibGVkKSB7CisgICAgICAgIG1lbWNweSgmcy0+c2VnbWVudGF0aW9uLmZlYXQsICZzc3JjLT5zZWdtZW50YXRpb24uZmVhdCwKKyAgICAgICAgICAgICAgIHNpemVvZihzLT5zZWdtZW50YXRpb24uZmVhdCkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3ZwOV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAidnA5IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdvb2dsZSBWUDkiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDksCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihWUDlDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gdnA5X2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSB2cDlfZGVjb2RlX2ZyZWUsCisgICAgLmRlY29kZSAgICAgICAgICAgICAgICA9IHZwOV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgICAgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKKyAgICAuZmx1c2ggICAgICAgICAgICAgICAgID0gdnA5X2RlY29kZV9mbHVzaCwKKyAgICAuaW5pdF90aHJlYWRfY29weSAgICAgID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQodnA5X2RlY29kZV9pbml0X3RocmVhZF9jb3B5KSwKKyAgICAudXBkYXRlX3RocmVhZF9jb250ZXh0ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQodnA5X2RlY29kZV91cGRhdGVfdGhyZWFkX2NvbnRleHQpLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyOTQxNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBWUDkgY29tcGF0aWJsZSB2aWRlbyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplIGdtYWlsIGNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBDbMOpbWVudCBCxZNzY2ggPHUgcGtoIG1lPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVlA5X0gKKyNkZWZpbmUgQVZDT0RFQ19WUDlfSAorCitlbnVtIFR4Zm1Nb2RlIHsKKyAgICBUWF80WDQsCisgICAgVFhfOFg4LAorICAgIFRYXzE2WDE2LAorICAgIFRYXzMyWDMyLAorICAgIE5fVFhGTV9TSVpFUywKKyAgICBUWF9TV0lUQ0hBQkxFID0gTl9UWEZNX1NJWkVTLAorICAgIE5fVFhGTV9NT0RFUworfTsKKworZW51bSBUeGZtVHlwZSB7CisgICAgRENUX0RDVCwKKyAgICBEQ1RfQURTVCwKKyAgICBBRFNUX0RDVCwKKyAgICBBRFNUX0FEU1QsCisgICAgTl9UWEZNX1RZUEVTCit9OworCitlbnVtIEludHJhUHJlZE1vZGUgeworICAgIFZFUlRfUFJFRCwKKyAgICBIT1JfUFJFRCwKKyAgICBEQ19QUkVELAorICAgIERJQUdfRE9XTl9MRUZUX1BSRUQsCisgICAgRElBR19ET1dOX1JJR0hUX1BSRUQsCisgICAgVkVSVF9SSUdIVF9QUkVELAorICAgIEhPUl9ET1dOX1BSRUQsCisgICAgVkVSVF9MRUZUX1BSRUQsCisgICAgSE9SX1VQX1BSRUQsCisgICAgVE1fVlA4X1BSRUQsCisgICAgTEVGVF9EQ19QUkVELAorICAgIFRPUF9EQ19QUkVELAorICAgIERDXzEyOF9QUkVELAorICAgIERDXzEyN19QUkVELAorICAgIERDXzEyOV9QUkVELAorICAgIE5fSU5UUkFfUFJFRF9NT0RFUworfTsKKworZW51bSBGaWx0ZXJNb2RlIHsKKyAgICBGSUxURVJfOFRBUF9TTU9PVEgsCisgICAgRklMVEVSXzhUQVBfUkVHVUxBUiwKKyAgICBGSUxURVJfOFRBUF9TSEFSUCwKKyAgICBGSUxURVJfQklMSU5FQVIsCisgICAgRklMVEVSX1NXSVRDSEFCTEUsCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19WUDlfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnA5X3BhcnNlci5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA5X3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDMzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDlfcGFyc2VyLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorCit0eXBlZGVmIHN0cnVjdCBWUDlQYXJzZUNvbnRleHQgeworICAgIGludCBuX2ZyYW1lczsgLy8gMS04CisgICAgaW50IHNpemVbOF07Cit9IFZQOVBhcnNlQ29udGV4dDsKKworc3RhdGljIHZvaWQgcGFyc2VfZnJhbWUoQVZDb2RlY1BhcnNlckNvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpZiAoYnVmWzBdICYgMHg0KSB7CisgICAgICAgIGN0eC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgICAgIGN0eC0+a2V5X2ZyYW1lID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBjdHgtPmtleV9mcmFtZSA9IDE7CisgICAgfQorfQorCitzdGF0aWMgaW50IHBhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKm91dF9kYXRhLCBpbnQgKm91dF9zaXplLAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSkKK3sKKyAgICBWUDlQYXJzZUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgbWFya2VyOworCisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICAqb3V0X3NpemUgPSAwOworICAgICAgICAqb3V0X2RhdGEgPSBkYXRhOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChzLT5uX2ZyYW1lcyA+IDApIHsKKyAgICAgICAgKm91dF9kYXRhID0gZGF0YTsKKyAgICAgICAgKm91dF9zaXplID0gcy0+c2l6ZVstLXMtPm5fZnJhbWVzXTsKKyAgICAgICAgcGFyc2VfZnJhbWUoY3R4LCAqb3V0X2RhdGEsICpvdXRfc2l6ZSk7CisKKyAgICAgICAgcmV0dXJuIHMtPm5fZnJhbWVzID4gMCA/ICpvdXRfc2l6ZSA6IHNpemUgLyogaS5lLiBpbmNsdWRlIGlkeCB0YWlsICovOworICAgIH0KKworICAgIG1hcmtlciA9IGRhdGFbc2l6ZSAtIDFdOworICAgIGlmICgobWFya2VyICYgMHhlMCkgPT0gMHhjMCkgeworICAgICAgICBpbnQgbmJ5dGVzID0gMSArICgobWFya2VyID4+IDMpICYgMHgzKTsKKyAgICAgICAgaW50IG5fZnJhbWVzID0gMSArIChtYXJrZXIgJiAweDcpLCBpZHhfc3ogPSAyICsgbl9mcmFtZXMgKiBuYnl0ZXM7CisKKyAgICAgICAgaWYgKHNpemUgPj0gaWR4X3N6ICYmIGRhdGFbc2l6ZSAtIGlkeF9zel0gPT0gbWFya2VyKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICppZHggPSBkYXRhICsgc2l6ZSArIDEgLSBpZHhfc3o7CisgICAgICAgICAgICBpbnQgZmlyc3QgPSAxOworCisgICAgICAgICAgICBzd2l0Y2ggKG5ieXRlcykgeworI2RlZmluZSBjYXNlX24oYSwgcmQpIFwKKyAgICAgICAgICAgIGNhc2UgYTogXAorICAgICAgICAgICAgICAgIHdoaWxlIChuX2ZyYW1lcy0tKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3ogPSByZDsgXAorICAgICAgICAgICAgICAgICAgICBpZHggKz0gYTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAoc3ogPiBzaXplKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5fZnJhbWVzID0gMDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VwZXJmcmFtZSBwYWNrZXQgc2l6ZSB0b28gYmlnOiAldSA+ICVkXG4iLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3osIHNpemUpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgKm91dF9kYXRhID0gZGF0YTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgKm91dF9zaXplID0gc3o7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5fZnJhbWVzID0gbl9mcmFtZXM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2l6ZVtuX2ZyYW1lc10gPSBzejsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSBzejsgXAorICAgICAgICAgICAgICAgICAgICBzaXplIC09IHN6OyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgcGFyc2VfZnJhbWUoY3R4LCAqb3V0X2RhdGEsICpvdXRfc2l6ZSk7IFwKKyAgICAgICAgICAgICAgICByZXR1cm4gKm91dF9zaXplCisKKyAgICAgICAgICAgICAgICBjYXNlX24oMSwgKmlkeCk7CisgICAgICAgICAgICAgICAgY2FzZV9uKDIsIEFWX1JMMTYoaWR4KSk7CisgICAgICAgICAgICAgICAgY2FzZV9uKDMsIEFWX1JMMjQoaWR4KSk7CisgICAgICAgICAgICAgICAgY2FzZV9uKDQsIEFWX1JMMzIoaWR4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqb3V0X2RhdGEgPSBkYXRhOworICAgICpvdXRfc2l6ZSA9IHNpemU7CisgICAgcGFyc2VfZnJhbWUoY3R4LCBkYXRhLCBzaXplKTsKKworICAgIHJldHVybiBzaXplOworfQorCitBVkNvZGVjUGFyc2VyIGZmX3ZwOV9wYXJzZXIgPSB7CisgICAgLmNvZGVjX2lkcyAgICAgID0geyBBVl9DT0RFQ19JRF9WUDkgfSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVlA5UGFyc2VDb250ZXh0KSwKKyAgICAucGFyc2VyX3BhcnNlICAgPSBwYXJzZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92cDlkYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy92cDlkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1YjYwZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOWRhdGEuaApAQCAtMCwwICsxLDIxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amUgZ21haWwgY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIENsw6ltZW50IELFk3NjaCA8dSBwa2ggbWU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WUDlEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19WUDlEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAidnA5LmgiCisKK2VudW0gQmxvY2tQYXJ0aXRpb24geworICAgIFBBUlRJVElPTl9OT05FLCAgICAvLyBbIF0gPC0uCisgICAgUEFSVElUSU9OX0gsICAgICAgIC8vIFstXSAgIHwKKyAgICBQQVJUSVRJT05fViwgICAgICAgLy8gW3xdICAgfAorICAgIFBBUlRJVElPTl9TUExJVCwgICAvLyBbK10gLS0nCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IHZwOV9wYXJ0aXRpb25fdHJlZVszXVsyXSA9IHsKKyAgICB7IC1QQVJUSVRJT05fTk9ORSwgMSB9LCAgICAgICAgICAgICAgIC8vICcwJworICAgICB7IC1QQVJUSVRJT05fSCwgMiB9LCAgICAgICAgICAgICAgICAgLy8gJzEwJworICAgICAgeyAtUEFSVElUSU9OX1YsIC1QQVJUSVRJT05fU1BMSVQgfSwgLy8gJzExMCcsICcxMTEnCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDlfZGVmYXVsdF9rZl9wYXJ0aXRpb25fcHJvYnNbNF1bNF1bM10gPSB7CisgICAgeyAvKiA2NHg2NCAtPiAzMngzMiAqLworICAgICAgICB7IDE3NCwgIDM1LCAgNDkgfSAvKiBhL2wgYm90aCBub3Qgc3BsaXQgKi8sCisgICAgICAgIHsgIDY4LCAgMTEsICAyNyB9IC8qIGEgc3BsaXQsIGwgbm90IHNwbGl0ICovLAorICAgICAgICB7ICA1NywgIDE1LCAgIDkgfSAvKiBsIHNwbGl0LCBhIG5vdCBzcGxpdCAqLywKKyAgICAgICAgeyAgMTIsICAgMywgICAzIH0gLyogYS9sIGJvdGggc3BsaXQgKi8KKyAgICB9LCB7IC8qIDMyeDMyIC0+IDE2eDE2ICovCisgICAgICAgIHsgMTUwLCAgNDAsICAzOSB9IC8qIGEvbCBib3RoIG5vdCBzcGxpdCAqLywKKyAgICAgICAgeyAgNzgsICAxMiwgIDI2IH0gLyogYSBzcGxpdCwgbCBub3Qgc3BsaXQgKi8sCisgICAgICAgIHsgIDY3LCAgMzMsICAxMSB9IC8qIGwgc3BsaXQsIGEgbm90IHNwbGl0ICovLAorICAgICAgICB7ICAyNCwgICA3LCAgIDUgfSAvKiBhL2wgYm90aCBzcGxpdCAqLywKKyAgICB9LCB7IC8qIDE2eDE2IC0+IDh4OCAqLworICAgICAgICB7IDE0OSwgIDUzLCAgNTMgfSAvKiBhL2wgYm90aCBub3Qgc3BsaXQgKi8sCisgICAgICAgIHsgIDk0LCAgMjAsICA0OCB9IC8qIGEgc3BsaXQsIGwgbm90IHNwbGl0ICovLAorICAgICAgICB7ICA4MywgIDUzLCAgMjQgfSAvKiBsIHNwbGl0LCBhIG5vdCBzcGxpdCAqLywKKyAgICAgICAgeyAgNTIsICAxOCwgIDE4IH0gLyogYS9sIGJvdGggc3BsaXQgKi8sCisgICAgfSwgeyAvKiA4eDggLT4gNHg0ICovCisgICAgICAgIHsgMTU4LCAgOTcsICA5NCB9IC8qIGEvbCBib3RoIG5vdCBzcGxpdCAqLywKKyAgICAgICAgeyAgOTMsICAyNCwgIDk5IH0gLyogYSBzcGxpdCwgbCBub3Qgc3BsaXQgKi8sCisgICAgICAgIHsgIDg1LCAxMTksICA0NCB9IC8qIGwgc3BsaXQsIGEgbm90IHNwbGl0ICovLAorICAgICAgICB7ICA2MiwgIDU5LCAgNjcgfSAvKiBhL2wgYm90aCBzcGxpdCAqLywKKyAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB2cDlfc2VnbWVudGF0aW9uX3RyZWVbN11bMl0gPSB7CisgICAgeyAxLCAyIH0sCisgICAgIHsgMywgNCB9LAorICAgICB7IDUsIDYgfSwKKyAgICAgIHsgLTAsIC0xIH0sIC8vICcwMHgnCisgICAgICB7IC0yLCAtMyB9LCAvLyAnMDF4JworICAgICAgeyAtNCwgLTUgfSwgLy8gJzEweCcKKyAgICAgIHsgLTYsIC03IH0sIC8vICcxMXgnCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IHZwOV9pbnRyYW1vZGVfdHJlZVs5XVsyXSA9IHsKKyAgICB7IC1EQ19QUkVELCAxIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICcwJworICAgICB7IC1UTV9WUDhfUFJFRCwgMiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJzEwJworICAgICAgeyAtVkVSVF9QUkVELCAzIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJzExMCcKKyAgICAgICB7IDQsIDYgfSwKKyAgICAgICAgeyAtSE9SX1BSRUQsIDUgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICcxMTEwMCcKKyAgICAgICAgIHsgLURJQUdfRE9XTl9SSUdIVF9QUkVELCAtVkVSVF9SSUdIVF9QUkVEIH0sIC8vICcxMTEwMXgnCisgICAgICAgIHsgLURJQUdfRE9XTl9MRUZUX1BSRUQsIDcgfSwgICAgICAgICAgICAgICAgICAvLyAnMTExMTAnCisgICAgICAgICB7IC1WRVJUX0xFRlRfUFJFRCwgOCB9LCAgICAgICAgICAgICAgICAgICAgICAvLyAnMTExMTEwJworICAgICAgICAgIHsgLUhPUl9ET1dOX1BSRUQsIC1IT1JfVVBfUFJFRCB9LCAgICAgICAgICAgLy8gJzExMTExMXgnCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2cDlfZGVmYXVsdF9rZl95bW9kZV9wcm9ic1sxMF1bMTBdWzldID0geworICAgIHsgLyogYWJvdmUgPSB2ICovCisgICAgICAgIHsgIDQzLCAgNDYsIDE2OCwgMTM0LCAxMDcsIDEyOCwgIDY5LCAxNDIsICA5MiB9IC8qIGxlZnQgPSB2ICovLAorICAgICAgICB7ICA0NCwgIDI5LCAgNjgsIDE1OSwgMjAxLCAxNzcsICA1MCwgIDU3LCAgNzcgfSAvKiBsZWZ0ID0gaCAqLywKKyAgICAgICAgeyAgNjMsICAzNiwgMTI2LCAxNDYsIDEyMywgMTU4LCAgNjAsICA5MCwgIDk2IH0gLyogbGVmdCA9IGRjICovLAorICAgICAgICB7ICA1OCwgIDM4LCAgNzYsIDExNCwgIDk3LCAxNzIsICA3OCwgMTMzLCAgOTIgfSAvKiBsZWZ0ID0gZDQ1ICovLAorICAgICAgICB7ICA0NiwgIDQxLCAgNzYsIDE0MCwgIDYzLCAxODQsICA2OSwgMTEyLCAgNTcgfSAvKiBsZWZ0ID0gZDEzNSAqLywKKyAgICAgICAgeyAgMzgsICAzMiwgIDg1LCAxNDAsICA0NiwgMTEyLCAgNTQsIDE1MSwgMTMzIH0gLyogbGVmdCA9IGQxMTcgKi8sCisgICAgICAgIHsgIDM5LCAgMjcsICA2MSwgMTMxLCAxMTAsIDE3NSwgIDQ0LCAgNzUsIDEzNiB9IC8qIGxlZnQgPSBkMTUzICovLAorICAgICAgICB7ICA0NywgIDM1LCAgODAsIDEwMCwgIDc0LCAxNDMsICA2NCwgMTYzLCAgNzQgfSAvKiBsZWZ0ID0gZDYzICovLAorICAgICAgICB7ICA1MiwgIDMwLCAgNzQsIDExMywgMTMwLCAxNzUsICA1MSwgIDY0LCAgNTggfSAvKiBsZWZ0ID0gZDI3ICovLAorICAgICAgICB7ICAzNiwgIDYxLCAxMTYsIDExNCwgMTI4LCAxNjIsICA4MCwgMTI1LCAgODIgfSAvKiBsZWZ0ID0gdG0gKi8KKyAgICB9LCB7IC8qIGFib3ZlID0gaCAqLworICAgICAgICB7ICA1NSwgIDQ0LCAgNjgsIDE2NiwgMTc5LCAxOTIsICA1NywgIDU3LCAxMDggfSAvKiBsZWZ0ID0gdiAqLywKKyAgICAgICAgeyAgNDIsICAyNiwgIDExLCAxOTksIDI0MSwgMjI4LCAgMjMsICAxNSwgIDg1IH0gLyogbGVmdCA9IGggKi8sCisgICAgICAgIHsgIDgyLCAgMjYsICAyNiwgMTcxLCAyMDgsIDIwNCwgIDQ0LCAgMzIsIDEwNSB9IC8qIGxlZnQgPSBkYyAqLywKKyAgICAgICAgeyAgNjgsICA0MiwgIDE5LCAxMzEsIDE2MCwgMTk5LCAgNTUsICA1MiwgIDgzIH0gLyogbGVmdCA9IGQ0NSAqLywKKyAgICAgICAgeyAgNTgsICA1MCwgIDI1LCAxMzksIDExNSwgMjMyLCAgMzksICA1MiwgMTE4IH0gLyogbGVmdCA9IGQxMzUgKi8sCisgICAgICAgIHsgIDUwLCAgMzUsICAzMywgMTUzLCAxMDQsIDE2MiwgIDY0LCAgNTksIDEzMSB9IC8qIGxlZnQgPSBkMTE3ICovLAorICAgICAgICB7ICA0NCwgIDI0LCAgMTYsIDE1MCwgMTc3LCAyMDIsICAzMywgIDE5LCAxNTYgfSAvKiBsZWZ0ID0gZDE1MyAqLywKKyAgICAgICAgeyAgNTMsICA0OSwgIDIxLCAxMTAsIDExNiwgMTY4LCAgNTksICA4MCwgIDc2IH0gLyogbGVmdCA9IGQ2MyAqLywKKyAgICAgICAgeyAgNTUsICAyNywgIDEyLCAxNTMsIDIwMywgMjE4LCAgMjYsICAyNywgIDQ5IH0gLyogbGVmdCA9IGQyNyAqLywKKyAgICAgICAgeyAgMzgsICA3MiwgIDE5LCAxNjgsIDIwMywgMjEyLCAgNTAsICA1MCwgMTA3IH0gLyogbGVmdCA9IHRtICovCisgICAgfSwgeyAvKiBhYm92ZSA9IGRjICovCisgICAgICAgIHsgIDkyLCAgNDUsIDEwMiwgMTM2LCAxMTYsIDE4MCwgIDc0LCAgOTAsIDEwMCB9IC8qIGxlZnQgPSB2ICovLAorICAgICAgICB7ICA3MywgIDMyLCAgMTksIDE4NywgMjIyLCAyMTUsICA0NiwgIDM0LCAxMDAgfSAvKiBsZWZ0ID0gaCAqLywKKyAgICAgICAgeyAxMzcsICAzMCwgIDQyLCAxNDgsIDE1MSwgMjA3LCAgNzAsICA1MiwgIDkxIH0gLyogbGVmdCA9IGRjICovLAorICAgICAgICB7ICA5MSwgIDMwLCAgMzIsIDExNiwgMTIxLCAxODYsICA5MywgIDg2LCAgOTQgfSAvKiBsZWZ0ID0gZDQ1ICovLAorICAgICAgICB7ICA3MiwgIDM1LCAgMzYsIDE0OSwgIDY4LCAyMDYsICA2OCwgIDYzLCAxMDUgfSAvKiBsZWZ0ID0gZDEzNSAqLywKKyAgICAgICAgeyAgNzMsICAzMSwgIDI4LCAxMzgsICA1NywgMTI0LCAgNTUsIDEyMiwgMTUxIH0gLyogbGVmdCA9IGQxMTcgKi8sCisgICAgICAgIHsgIDY3LCAgMjMsICAyMSwgMTQwLCAxMjYsIDE5NywgIDQwLCAgMzcsIDE3MSB9IC8qIGxlZnQgPSBkMTUzICovLAorICAgICAgICB7ICA3NCwgIDMyLCAgMjcsIDEwNywgIDg2LCAxNjAsICA2MywgMTM0LCAxMDIgfSAvKiBsZWZ0ID0gZDYzICovLAorICAgICAgICB7ICA4NiwgIDI3LCAgMjgsIDEyOCwgMTU0LCAyMTIsICA0NSwgIDQzLCAgNTMgfSAvKiBsZWZ0ID0gZDI3ICovLAorICAgICAgICB7ICA1OSwgIDY3LCAgNDQsIDE0MCwgMTYxLCAyMDIsICA3OCwgIDY3LCAxMTkgfSAvKiBsZWZ0ID0gdG0gKi8KKyAgICB9LCB7IC8qIGFib3ZlID0gZDQ1ICovCisgICAgICAgIHsgIDU5LCAgMzgsICA4MywgMTEyLCAxMDMsIDE2MiwgIDk4LCAxMzYsICA5MCB9IC8qIGxlZnQgPSB2ICovLAorICAgICAgICB7ICA2MiwgIDMwLCAgMjMsIDE1OCwgMjAwLCAyMDcsICA1OSwgIDU3LCAgNTAgfSAvKiBsZWZ0ID0gaCAqLywKKyAgICAgICAgeyAxMDMsICAyNiwgIDM2LCAxMjksIDEzMiwgMjAxLCAgODMsICA4MCwgIDkzIH0gLyogbGVmdCA9IGRjICovLAorICAgICAgICB7ICA2NywgIDMwLCAgMjksICA4NCwgIDg2LCAxOTEsIDEwMiwgIDkxLCAgNTkgfSAvKiBsZWZ0ID0gZDQ1ICovLAorICAgICAgICB7ICA2MCwgIDMyLCAgMzMsIDExMiwgIDcxLCAyMjAsICA2NCwgIDg5LCAxMDQgfSAvKiBsZWZ0ID0gZDEzNSAqLywKKyAgICAgICAgeyAgNTMsICAyNiwgIDM0LCAxMzAsICA1NiwgMTQ5LCAgODQsIDEyMCwgMTAzIH0gLyogbGVmdCA9IGQxMTcgKi8sCisgICAgICAgIHsgIDUzLCAgMjEsICAyMywgMTMzLCAxMDksIDIxMCwgIDU2LCAgNzcsIDE3MiB9IC8qIGxlZnQgPSBkMTUzICovLAorICAgICAgICB7ICA2MSwgIDI5LCAgMjksICA5MywgIDk3LCAxNjUsICA4MywgMTc1LCAxNjIgfSAvKiBsZWZ0ID0gZDYzICovLAorICAgICAgICB7ICA3NywgIDE5LCAgMjksIDExMiwgMTQyLCAyMjgsICA1NSwgIDY2LCAgMzYgfSAvKiBsZWZ0ID0gZDI3ICovLAorICAgICAgICB7ICA0NywgIDQ3LCAgNDMsIDExNCwgMTM3LCAxODEsIDEwMCwgIDk5LCAgOTUgfSAvKiBsZWZ0ID0gdG0gKi8KKyAgICB9LCB7IC8qIGFib3ZlID0gZDEzNSAqLworICAgICAgICB7ICA1MywgIDQwLCAgNTUsIDEzOSwgIDY5LCAxODMsICA2MSwgIDgwLCAxMTAgfSAvKiBsZWZ0ID0gdiAqLywKKyAgICAgICAgeyAgNDAsICAyOSwgIDE5LCAxNjEsIDE4MCwgMjA3LCAgNDMsICAyNCwgIDkxIH0gLyogbGVmdCA9IGggKi8sCisgICAgICAgIHsgIDY5LCAgMjMsICAyOSwgMTI4LCAgODMsIDE5OSwgIDQ2LCAgNDQsIDEwMSB9IC8qIGxlZnQgPSBkYyAqLywKKyAgICAgICAgeyAgNjAsICAzNCwgIDE5LCAxMDUsICA2MSwgMTk4LCAgNTMsICA2NCwgIDg5IH0gLyogbGVmdCA9IGQ0NSAqLywKKyAgICAgICAgeyAgNTIsICAzMSwgIDIyLCAxNTgsICA0MCwgMjA5LCAgNTgsICA2MiwgIDg5IH0gLyogbGVmdCA9IGQxMzUgKi8sCisgICAgICAgIHsgIDQ0LCAgMzEsICAyOSwgMTQ3LCAgNDYsIDE1OCwgIDU2LCAxMDIsIDE5OCB9IC8qIGxlZnQgPSBkMTE3ICovLAorICAgICAgICB7ICAzNSwgIDE5LCAgMTIsIDEzNSwgIDg3LCAyMDksICA0MSwgIDQ1LCAxNjcgfSAvKiBsZWZ0ID0gZDE1MyAqLywKKyAgICAgICAgeyAgNTEsICAzOCwgIDI1LCAxMTMsICA1OCwgMTY0LCAgNzAsICA5MywgIDk3IH0gLyogbGVmdCA9IGQ2MyAqLywKKyAgICAgICAgeyAgNTUsICAyNSwgIDIxLCAxMTgsICA5NSwgMjE1LCAgMzgsICAzOSwgIDY2IH0gLyogbGVmdCA9IGQyNyAqLywKKyAgICAgICAgeyAgNDcsICA1NCwgIDM0LCAxNDYsIDEwOCwgMjAzLCAgNzIsIDEwMywgMTUxIH0gLyogbGVmdCA9IHRtICovCisgICAgfSwgeyAvKiBhYm92ZSA9IGQxMTcgKi8KKyAgICAgICAgeyAgNDYsICAyNywgIDgwLCAxNTAsICA1NSwgMTI0LCAgNTUsIDEyMSwgMTM1IH0gLyogbGVmdCA9IHYgKi8sCisgICAgICAgIHsgIDM2LCAgMjMsICAyNywgMTY1LCAxNDksIDE2NiwgIDU0LCAgNjQsIDExOCB9IC8qIGxlZnQgPSBoICovLAorICAgICAgICB7ICA2NCwgIDE5LCAgMzcsIDE1NiwgIDY2LCAxMzgsICA0OSwgIDk1LCAxMzMgfSAvKiBsZWZ0ID0gZGMgKi8sCisgICAgICAgIHsgIDUzLCAgMjEsICAzNiwgMTMxLCAgNjMsIDE2MywgIDYwLCAxMDksICA4MSB9IC8qIGxlZnQgPSBkNDUgKi8sCisgICAgICAgIHsgIDQwLCAgMjYsICAzNSwgMTU0LCAgNDAsIDE4NSwgIDUxLCAgOTcsIDEyMyB9IC8qIGxlZnQgPSBkMTM1ICovLAorICAgICAgICB7ICAzNSwgIDE5LCAgMzQsIDE3OSwgIDE5LCAgOTcsICA0OCwgMTI5LCAxMjQgfSAvKiBsZWZ0ID0gZDExNyAqLywKKyAgICAgICAgeyAgMzYsICAyMCwgIDI2LCAxMzYsICA2MiwgMTY0LCAgMzMsICA3NywgMTU0IH0gLyogbGVmdCA9IGQxNTMgKi8sCisgICAgICAgIHsgIDQ1LCAgMjYsICAyOCwgMTI5LCAgNDUsIDEyOSwgIDQ5LCAxNDcsIDEyMyB9IC8qIGxlZnQgPSBkNjMgKi8sCisgICAgICAgIHsgIDQ1LCAgMTgsICAzMiwgMTMwLCAgOTAsIDE1NywgIDQwLCAgNzksICA5MSB9IC8qIGxlZnQgPSBkMjcgKi8sCisgICAgICAgIHsgIDM4LCAgNDQsICA1MSwgMTM2LCAgNzQsIDE2MiwgIDU3LCAgOTcsIDEyMSB9IC8qIGxlZnQgPSB0bSAqLworICAgIH0sIHsgLyogYWJvdmUgPSBkMTUzICovCisgICAgICAgIHsgIDU2LCAgMzksICA1OCwgMTMzLCAxMTcsIDE3MywgIDQ4LCAgNTMsIDE4NyB9IC8qIGxlZnQgPSB2ICovLAorICAgICAgICB7ICAzNSwgIDIxLCAgMTIsIDE2MSwgMjEyLCAyMDcsICAyMCwgIDIzLCAxNDUgfSAvKiBsZWZ0ID0gaCAqLywKKyAgICAgICAgeyAgNzUsICAxNywgIDIyLCAxMzYsIDEzOCwgMTg1LCAgMzIsICAzNCwgMTY2IH0gLyogbGVmdCA9IGRjICovLAorICAgICAgICB7ICA1NiwgIDI5LCAgMTksIDExNywgMTA5LCAxODEsICA1NSwgIDY4LCAxMTIgfSAvKiBsZWZ0ID0gZDQ1ICovLAorICAgICAgICB7ICA0NywgIDI5LCAgMTcsIDE1MywgIDY0LCAyMjAsICA1OSwgIDUxLCAxMTQgfSAvKiBsZWZ0ID0gZDEzNSAqLywKKyAgICAgICAgeyAgNDYsICAxNiwgIDI0LCAxMzYsICA3NiwgMTQ3LCAgNDEsICA2NCwgMTcyIH0gLyogbGVmdCA9IGQxMTcgKi8sCisgICAgICAgIHsgIDM0LCAgMTcsICAxMSwgMTA4LCAxNTIsIDE4NywgIDEzLCAgMTUsIDIwOSB9IC8qIGxlZnQgPSBkMTUzICovLAorICAgICAgICB7ICA1NSwgIDMwLCAgMTgsIDEyMiwgIDc5LCAxNzksICA0NCwgIDg4LCAxMTYgfSAvKiBsZWZ0ID0gZDYzICovLAorICAgICAgICB7ICA1MSwgIDI0LCAgMTQsIDExNSwgMTMzLCAyMDksICAzMiwgIDI2LCAxMDQgfSAvKiBsZWZ0ID0gZDI3ICovLAorICAgICAgICB7ICAzNywgIDQ5LCAgMjUsIDEyOSwgMTY4LCAxNjQsICA0MSwgIDU0LCAxNDggfSAvKiBsZWZ0ID0gdG0gKi8KKyAgICB9LCB7IC8qIGFib3ZlID0gZDYzICovCisgICAgICAgIHsgIDQ4LCAgMzQsICA4NiwgMTAxLCAgOTIsIDE0NiwgIDc4LCAxNzksIDEzNCB9IC8qIGxlZnQgPSB2ICovLAorICAgICAgICB7ICA0NywgIDIyLCAgMjQsIDEzOCwgMTg3LCAxNzgsICA2OCwgIDY5LCAgNTkgfSAvKiBsZWZ0ID0gaCAqLywKKyAgICAgICAgeyAgNzgsICAyMywgIDM5LCAxMTEsIDExNywgMTcwLCAgNzQsIDEyNCwgIDk0IH0gLyogbGVmdCA9IGRjICovLAorICAgICAgICB7ICA1NiwgIDI1LCAgMzMsIDEwNSwgMTEyLCAxODcsICA5NSwgMTc3LCAxMjkgfSAvKiBsZWZ0ID0gZDQ1ICovLAorICAgICAgICB7ICA0OCwgIDMxLCAgMjcsIDExNCwgIDYzLCAxODMsICA4MiwgMTE2LCAgNTYgfSAvKiBsZWZ0ID0gZDEzNSAqLywKKyAgICAgICAgeyAgNDMsICAyOCwgIDM3LCAxMjEsICA2MywgMTIzLCAgNjEsIDE5MiwgMTY5IH0gLyogbGVmdCA9IGQxMTcgKi8sCisgICAgICAgIHsgIDQyLCAgMTcsICAyNCwgMTA5LCAgOTcsIDE3NywgIDU2LCAgNzYsIDEyMiB9IC8qIGxlZnQgPSBkMTUzICovLAorICAgICAgICB7ICA0NiwgIDIzLCAgMzIsICA3NCwgIDg2LCAxNTAsICA2NywgMTgzLCAgODggfSAvKiBsZWZ0ID0gZDYzICovLAorICAgICAgICB7ICA1OCwgIDE4LCAgMjgsIDEwNSwgMTM5LCAxODIsICA3MCwgIDkyLCAgNjMgfSAvKiBsZWZ0ID0gZDI3ICovLAorICAgICAgICB7ICAzNiwgIDM4LCAgNDgsICA5MiwgMTIyLCAxNjUsICA4OCwgMTM3LCAgOTEgfSAvKiBsZWZ0ID0gdG0gKi8KKyAgICB9LCB7IC8qIGFib3ZlID0gZDI3ICovCisgICAgICAgIHsgIDYyLCAgNDQsICA2MSwgMTIzLCAxMDUsIDE4OSwgIDQ4LCAgNTcsICA2NCB9IC8qIGxlZnQgPSB2ICovLAorICAgICAgICB7ICA0NywgIDI1LCAgMTcsIDE3NSwgMjIyLCAyMjAsICAyNCwgIDMwLCAgODYgfSAvKiBsZWZ0ID0gaCAqLywKKyAgICAgICAgeyAgODIsICAyMiwgIDMyLCAxMjcsIDE0MywgMjEzLCAgMzksICA0MSwgIDcwIH0gLyogbGVmdCA9IGRjICovLAorICAgICAgICB7ICA2OCwgIDM2LCAgMTcsIDEwNiwgMTAyLCAyMDYsICA1OSwgIDc0LCAgNzQgfSAvKiBsZWZ0ID0gZDQ1ICovLAorICAgICAgICB7ICA1NywgIDM5LCAgMjMsIDE1MSwgIDY4LCAyMTYsICA1NSwgIDYzLCAgNTggfSAvKiBsZWZ0ID0gZDEzNSAqLywKKyAgICAgICAgeyAgNDksICAzMCwgIDM1LCAxNDEsICA3MCwgMTY4LCAgODIsICA0MCwgMTE1IH0gLyogbGVmdCA9IGQxMTcgKi8sCisgICAgICAgIHsgIDUxLCAgMjUsICAxNSwgMTM2LCAxMjksIDIwMiwgIDM4LCAgMzUsIDEzOSB9IC8qIGxlZnQgPSBkMTUzICovLAorICAgICAgICB7ICA1OSwgIDM5LCAgMTksIDExNCwgIDc1LCAxODAsICA3NywgMTA0LCAgNDIgfSAvKiBsZWZ0ID0gZDYzICovLAorICAgICAgICB7ICA2OCwgIDI2LCAgMTYsIDExMSwgMTQxLCAyMTUsICAyOSwgIDI4LCAgMjggfSAvKiBsZWZ0ID0gZDI3ICovLAorICAgICAgICB7ICA0MCwgIDYxLCAgMjYsIDEyNiwgMTUyLCAyMDYsICA2MSwgIDU5LCAgOTMgfSAvKiBsZWZ0ID0gdG0gKi8KKyAgICB9LCB7IC8qIGFib3ZlID0gdG0gKi8KKyAgICAgICAgeyAgNDQsICA3OCwgMTE1LCAxMzIsIDExOSwgMTczLCAgNzEsIDExMiwgIDkzIH0gLyogbGVmdCA9IHYgKi8sCisgICAgICAgIHsgIDM5LCAgMzgsICAyMSwgMTg0LCAyMjcsIDIwNiwgIDQyLCAgMzIsICA2NCB9IC8qIGxlZnQgPSBoICovLAorICAgICAgICB7ICA2NSwgIDcwLCAgNjAsIDE1NSwgMTU5LCAxOTksICA2MSwgIDYwLCAgODEgfSAvKiBsZWZ0ID0gZGMgKi8sCisgICAgICAgIHsgIDU4LCAgNDcsICAzNiwgMTI0LCAxMzcsIDE5MywgIDgwLCAgODIsICA3OCB9IC8qIGxlZnQgPSBkNDUgKi8sCisgICAgICAgIHsgIDQ5LCAgNTAsICAzNSwgMTQ0LCAgOTUsIDIwNSwgIDYzLCAgNzgsICA1OSB9IC8qIGxlZnQgPSBkMTM1ICovLAorICAgICAgICB7ICA0MSwgIDUzLCAgNTIsIDE0OCwgIDcxLCAxNDIsICA2NSwgMTI4LCAgNTEgfSAvKiBsZWZ0ID0gZDExNyAqLywKKyAgICAgICAgeyAgNDAsICAzNiwgIDI4LCAxNDMsIDE0MywgMjAyLCAgNDAsICA1NSwgMTM3IH0gLyogbGVmdCA9IGQxNTMgKi8sCisgICAgICAgIHsgIDQyLCAgNDQsICA0NCwgMTA0LCAxMDUsIDE2NCwgIDY0LCAxMzAsICA4MCB9IC8qIGxlZnQgPSBkNjMgKi8sCisgICAgICAgIHsgIDUyLCAgMzQsICAyOSwgMTI5LCAxODMsIDIyNywgIDQyLCAgMzUsICA0MyB9IC8qIGxlZnQgPSBkMjcgKi8sCisgICAgICAgIHsgIDQzLCAgODEsICA1MywgMTQwLCAxNjksIDIwNCwgIDY4LCAgODQsICA3MiB9IC8qIGxlZnQgPSB0bSAqLworICAgIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZwOV9kZWZhdWx0X2tmX3V2bW9kZV9wcm9ic1sxMF1bOV0gPSB7CisgICAgeyAxMTgsICAxNSwgMTIzLCAxNDgsIDEzMSwgMTAxLCAgNDQsICA5MywgMTMxIH0gLyogeSA9IHYgKi8sCisgICAgeyAxMTMsICAxMiwgIDIzLCAxODgsIDIyNiwgMTQyLCAgMjYsICAzMiwgMTI1IH0gLyogeSA9IGggKi8sCisgICAgeyAxNDQsICAxMSwgIDU0LCAxNTcsIDE5NSwgMTMwLCAgNDYsICA1OCwgMTA4IH0gLyogeSA9IGRjICovLAorICAgIHsgMTIwLCAgMTEsICA1MCwgMTIzLCAxNjMsIDEzNSwgIDY0LCAgNzcsIDEwMyB9IC8qIHkgPSBkNDUgKi8sCisgICAgeyAxMTMsICAgOSwgIDM2LCAxNTUsIDExMSwgMTU3LCAgMzIsICA0NCwgMTYxIH0gLyogeSA9IGQxMzUgKi8sCisgICAgeyAxMTYsICAgOSwgIDU1LCAxNzYsICA3NiwgIDk2LCAgMzcsICA2MSwgMTQ5IH0gLyogeSA9IGQxMTcgKi8sCisgICAgeyAxMTUsICAgOSwgIDI4LCAxNDEsIDE2MSwgMTY3LCAgMjEsICAyNSwgMTkzIH0gLyogeSA9IGQxNTMgKi8sCisgICAgeyAxMTYsICAxMiwgIDY0LCAxMjAsIDE0MCwgMTI1LCAgNDksIDExNSwgMTIxIH0gLyogeSA9IGQ2MyAqLywKKyAgICB7IDEyMCwgIDEyLCAgMzIsIDE0NSwgMTk1LCAxNDIsICAzMiwgIDM4LCAgODYgfSAvKiB5ID0gZDI3ICovLAorICAgIHsgMTAyLCAgMTksICA2NiwgMTYyLCAxODIsIDEyMiwgIDM1LCAgNTksIDEyOCB9IC8qIHkgPSB0bSAqLworfTsKKworZW51bSBJbnRlclByZWRNb2RlIHsKKyAgICBORUFSRVNUTVYgPSAxMCwKKyAgICBORUFSTVYgPSAxMSwKKyAgICBaRVJPTVYgPSAxMiwKKyAgICBORVdNViA9IDEzLAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB2cDlfaW50ZXJfbW9kZV90cmVlWzNdWzJdID0geworICAgIHsgLVpFUk9NViwgMSB9LCAgICAgICAgLy8gJzAnCisgICAgIHsgLU5FQVJFU1RNViwgMiB9LCAgICAvLyAnMTAnCisgICAgICB7IC1ORUFSTVYsIC1ORVdNViB9LCAvLyAnMTF4JworfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB2cDlfZmlsdGVyX3RyZWVbMl1bMl0gPSB7CisgICAgeyAtMCwgMSB9LCAgIC8vICcwJworICAgICB7IC0xLCAtMiB9LCAvLyAnMXgnCit9OworCitzdGF0aWMgY29uc3QgZW51bSBGaWx0ZXJNb2RlIHZwOV9maWx0ZXJfbHV0WzNdID0geworICAgIEZJTFRFUl84VEFQX1JFR1VMQVIsCisgICAgRklMVEVSXzhUQVBfU01PT1RILAorICAgIEZJTFRFUl84VEFQX1NIQVJQLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2RjX3Fsb29rdXBbMjU2XSA9IHsKKyAgICAgICA0LCAgICA4LCAgICA4LCAgICA5LCAgIDEwLCAgIDExLCAgIDEyLCAgIDEyLAorICAgICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgsICAgMTksICAgMTksCisgICAgICAyMCwgICAyMSwgICAyMiwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNiwKKyAgICAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMyLCAgIDMzLAorICAgICAgMzQsICAgMzUsICAgMzYsICAgMzcsICAgMzgsICAgMzgsICAgMzksICAgNDAsCisgICAgICA0MSwgICA0MiwgICA0MywgICA0MywgICA0NCwgICA0NSwgICA0NiwgICA0NywKKyAgICAgIDQ4LCAgIDQ4LCAgIDQ5LCAgIDUwLCAgIDUxLCAgIDUyLCAgIDUzLCAgIDUzLAorICAgICAgNTQsICAgNTUsICAgNTYsICAgNTcsICAgNTcsICAgNTgsICAgNTksICAgNjAsCisgICAgICA2MSwgICA2MiwgICA2MiwgICA2MywgICA2NCwgICA2NSwgICA2NiwgICA2NiwKKyAgICAgIDY3LCAgIDY4LCAgIDY5LCAgIDcwLCAgIDcwLCAgIDcxLCAgIDcyLCAgIDczLAorICAgICAgNzQsICAgNzQsICAgNzUsICAgNzYsICAgNzcsICAgNzgsICAgNzgsICAgNzksCisgICAgICA4MCwgICA4MSwgICA4MSwgICA4MiwgICA4MywgICA4NCwgICA4NSwgICA4NSwKKyAgICAgIDg3LCAgIDg4LCAgIDkwLCAgIDkyLCAgIDkzLCAgIDk1LCAgIDk2LCAgIDk4LAorICAgICAgOTksICAxMDEsICAxMDIsICAxMDQsICAxMDUsICAxMDcsICAxMDgsICAxMTAsCisgICAgIDExMSwgIDExMywgIDExNCwgIDExNiwgIDExNywgIDExOCwgIDEyMCwgIDEyMSwKKyAgICAgMTIzLCAgMTI1LCAgMTI3LCAgMTI5LCAgMTMxLCAgMTM0LCAgMTM2LCAgMTM4LAorICAgICAxNDAsICAxNDIsICAxNDQsICAxNDYsICAxNDgsICAxNTAsICAxNTIsICAxNTQsCisgICAgIDE1NiwgIDE1OCwgIDE2MSwgIDE2NCwgIDE2NiwgIDE2OSwgIDE3MiwgIDE3NCwKKyAgICAgMTc3LCAgMTgwLCAgMTgyLCAgMTg1LCAgMTg3LCAgMTkwLCAgMTkyLCAgMTk1LAorICAgICAxOTksICAyMDIsICAyMDUsICAyMDgsICAyMTEsICAyMTQsICAyMTcsICAyMjAsCisgICAgIDIyMywgIDIyNiwgIDIzMCwgIDIzMywgIDIzNywgIDI0MCwgIDI0MywgIDI0NywKKyAgICAgMjUwLCAgMjUzLCAgMjU3LCAgMjYxLCAgMjY1LCAgMjY5LCAgMjcyLCAgMjc2LAorICAgICAyODAsICAyODQsICAyODgsICAyOTIsICAyOTYsICAzMDAsICAzMDQsICAzMDksCisgICAgIDMxMywgIDMxNywgIDMyMiwgIDMyNiwgIDMzMCwgIDMzNSwgIDM0MCwgIDM0NCwKKyAgICAgMzQ5LCAgMzU0LCAgMzU5LCAgMzY0LCAgMzY5LCAgMzc0LCAgMzc5LCAgMzg0LAorICAgICAzODksICAzOTUsICA0MDAsICA0MDYsICA0MTEsICA0MTcsICA0MjMsICA0MjksCisgICAgIDQzNSwgIDQ0MSwgIDQ0NywgIDQ1NCwgIDQ2MSwgIDQ2NywgIDQ3NSwgIDQ4MiwKKyAgICAgNDg5LCAgNDk3LCAgNTA1LCAgNTEzLCAgNTIyLCAgNTMwLCAgNTM5LCAgNTQ5LAorICAgICA1NTksICA1NjksICA1NzksICA1OTAsICA2MDIsICA2MTQsICA2MjYsICA2NDAsCisgICAgIDY1NCwgIDY2OCwgIDY4NCwgIDcwMCwgIDcxNywgIDczNiwgIDc1NSwgIDc3NSwKKyAgICAgNzk2LCAgODE5LCAgODQzLCAgODY5LCAgODk2LCAgOTI1LCAgOTU1LCAgOTg4LAorICAgIDEwMjIsIDEwNTgsIDEwOTgsIDExMzksIDExODQsIDEyMzIsIDEyODIsIDEzMzYsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfYWNfcWxvb2t1cFsyNTZdID0geworICAgICAgIDQsICAgIDgsICAgIDksICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsCisgICAgICAxNSwgICAxNiwgICAxNywgICAxOCwgICAxOSwgICAyMCwgICAyMSwgICAyMiwKKyAgICAgIDIzLCAgIDI0LCAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLAorICAgICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAgMzYsICAgMzcsICAgMzgsCisgICAgICAzOSwgICA0MCwgICA0MSwgICA0MiwgICA0MywgICA0NCwgICA0NSwgICA0NiwKKyAgICAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDUwLCAgIDUxLCAgIDUyLCAgIDUzLCAgIDU0LAorICAgICAgNTUsICAgNTYsICAgNTcsICAgNTgsICAgNTksICAgNjAsICAgNjEsICAgNjIsCisgICAgICA2MywgICA2NCwgICA2NSwgICA2NiwgICA2NywgICA2OCwgICA2OSwgICA3MCwKKyAgICAgIDcxLCAgIDcyLCAgIDczLCAgIDc0LCAgIDc1LCAgIDc2LCAgIDc3LCAgIDc4LAorICAgICAgNzksICAgODAsICAgODEsICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsCisgICAgICA4NywgICA4OCwgICA4OSwgICA5MCwgICA5MSwgICA5MiwgICA5MywgICA5NCwKKyAgICAgIDk1LCAgIDk2LCAgIDk3LCAgIDk4LCAgIDk5LCAgMTAwLCAgMTAxLCAgMTAyLAorICAgICAxMDQsICAxMDYsICAxMDgsICAxMTAsICAxMTIsICAxMTQsICAxMTYsICAxMTgsCisgICAgIDEyMCwgIDEyMiwgIDEyNCwgIDEyNiwgIDEyOCwgIDEzMCwgIDEzMiwgIDEzNCwKKyAgICAgMTM2LCAgMTM4LCAgMTQwLCAgMTQyLCAgMTQ0LCAgMTQ2LCAgMTQ4LCAgMTUwLAorICAgICAxNTIsICAxNTUsICAxNTgsICAxNjEsICAxNjQsICAxNjcsICAxNzAsICAxNzMsCisgICAgIDE3NiwgIDE3OSwgIDE4MiwgIDE4NSwgIDE4OCwgIDE5MSwgIDE5NCwgIDE5NywKKyAgICAgMjAwLCAgMjAzLCAgMjA3LCAgMjExLCAgMjE1LCAgMjE5LCAgMjIzLCAgMjI3LAorICAgICAyMzEsICAyMzUsICAyMzksICAyNDMsICAyNDcsICAyNTEsICAyNTUsICAyNjAsCisgICAgIDI2NSwgIDI3MCwgIDI3NSwgIDI4MCwgIDI4NSwgIDI5MCwgIDI5NSwgIDMwMCwKKyAgICAgMzA1LCAgMzExLCAgMzE3LCAgMzIzLCAgMzI5LCAgMzM1LCAgMzQxLCAgMzQ3LAorICAgICAzNTMsICAzNTksICAzNjYsICAzNzMsICAzODAsICAzODcsICAzOTQsICA0MDEsCisgICAgIDQwOCwgIDQxNiwgIDQyNCwgIDQzMiwgIDQ0MCwgIDQ0OCwgIDQ1NiwgIDQ2NSwKKyAgICAgNDc0LCAgNDgzLCAgNDkyLCAgNTAxLCAgNTEwLCAgNTIwLCAgNTMwLCAgNTQwLAorICAgICA1NTAsICA1NjAsICA1NzEsICA1ODIsICA1OTMsICA2MDQsICA2MTUsICA2MjcsCisgICAgIDYzOSwgIDY1MSwgIDY2MywgIDY3NiwgIDY4OSwgIDcwMiwgIDcxNSwgIDcyOSwKKyAgICAgNzQzLCAgNzU3LCAgNzcxLCAgNzg2LCAgODAxLCAgODE2LCAgODMyLCAgODQ4LAorICAgICA4NjQsICA4ODEsICA4OTgsICA5MTUsICA5MzMsICA5NTEsICA5NjksICA5ODgsCisgICAgMTAwNywgMTAyNiwgMTA0NiwgMTA2NiwgMTA4NywgMTEwOCwgMTEyOSwgMTE1MSwKKyAgICAxMTczLCAxMTk2LCAxMjE5LCAxMjQzLCAxMjY3LCAxMjkyLCAxMzE3LCAxMzQzLAorICAgIDEzNjksIDEzOTYsIDE0MjMsIDE0NTEsIDE0NzksIDE1MDgsIDE1MzcsIDE1NjcsCisgICAgMTU5NywgMTYyOCwgMTY2MCwgMTY5MiwgMTcyNSwgMTc1OSwgMTc5MywgMTgyOCwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIFR4Zm1UeXBlIHZwOV9pbnRyYV90eGZtX3R5cGVbMTRdID0geworICAgIFtWRVJUX1BSRURdICAgICAgICAgICAgPSBBRFNUX0RDVCwKKyAgICBbSE9SX1BSRURdICAgICAgICAgICAgID0gRENUX0FEU1QsCisgICAgW0RDX1BSRURdICAgICAgICAgICAgICA9IERDVF9EQ1QsCisgICAgW0RJQUdfRE9XTl9MRUZUX1BSRURdICA9IERDVF9EQ1QsCisgICAgW0RJQUdfRE9XTl9SSUdIVF9QUkVEXSA9IEFEU1RfQURTVCwKKyAgICBbVkVSVF9SSUdIVF9QUkVEXSAgICAgID0gQURTVF9EQ1QsCisgICAgW0hPUl9ET1dOX1BSRURdICAgICAgICA9IERDVF9BRFNULAorICAgIFtWRVJUX0xFRlRfUFJFRF0gICAgICAgPSBBRFNUX0RDVCwKKyAgICBbSE9SX1VQX1BSRURdICAgICAgICAgID0gRENUX0FEU1QsCisgICAgW1RNX1ZQOF9QUkVEXSAgICAgICAgICA9IEFEU1RfQURTVCwKKyAgICBbTkVBUkVTVE1WXSAgICAgICAgICAgID0gRENUX0RDVCwKKyAgICBbTkVBUk1WXSAgICAgICAgICAgICAgID0gRENUX0RDVCwKKyAgICBbWkVST01WXSAgICAgICAgICAgICAgID0gRENUX0RDVCwKKyAgICBbTkVXTVZdICAgICAgICAgICAgICAgID0gRENUX0RDVCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9kZWZhdWx0X3NjYW5fNHg0WzE2XSA9IHsKKyAgICAgMCwgIDEsICA0LCAgNSwKKyAgICAgMiwgIDgsICAzLCAgNiwKKyAgICAxMiwgIDksICA3LCAxMCwKKyAgICAxMywgMTEsIDE0LCAxNSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9jb2xfc2Nhbl80eDRbMTZdID0geworICAgICAwLCAgMSwgIDIsICA0LAorICAgICAzLCAgNSwgIDYsICA4LAorICAgICA3LCAgOSwgMTAsIDEyLAorICAgIDEzLCAxMSwgMTQsIDE1LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X3Jvd19zY2FuXzR4NFsxNl0gPSB7CisgICAgIDAsICA0LCAgMSwgIDgsCisgICAgIDUsIDEyLCAgOSwgIDIsCisgICAgIDYsIDEzLCAgMywgMTAsCisgICAgIDcsIDE0LCAxMSwgMTUsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfZGVmYXVsdF9zY2FuXzh4OFs2NF0gPSB7CisgICAgIDAsICAxLCAgOCwgIDIsICA5LCAxNiwgMTAsICAzLAorICAgIDE3LCAyNCwgMTgsIDExLCAgNCwgMjUsIDMyLCAxOSwKKyAgICAxMiwgMjYsICA1LCAzMywgMjAsIDI3LCA0MCwgMTMsCisgICAgMzQsICA2LCA0MSwgMjgsIDIxLCAzNSwgNDIsIDQ4LAorICAgIDE0LCAgNywgMzYsIDI5LCA0MywgNTYsIDQ5LCAyMiwKKyAgICAxNSwgMzcsIDUwLCA0NCwgNTcsIDMwLCAyMywgNTEsCisgICAgNDUsIDU4LCAzOCwgMzEsIDUyLCA1OSwgMzksIDQ2LAorICAgIDUzLCA2MCwgNDcsIDU0LCA2MSwgNTUsIDYyLCA2MywKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9jb2xfc2Nhbl84eDhbNjRdID0geworICAgICAwLCAgMSwgIDIsICA4LCAgMywgIDksICA0LCAxMCwKKyAgICAxNiwgIDUsIDExLCAxNywgMTIsIDE4LCAgNiwgMjQsCisgICAgMTksIDEzLCAyNSwgIDcsIDI2LCAyMCwgMzIsIDE0LAorICAgIDI3LCAyMSwgMzMsIDI4LCAzNCwgMTUsIDIyLCAzNSwKKyAgICA0MCwgMjksIDQxLCAzNiwgMjMsIDMwLCA0MiwgMzcsCisgICAgNDgsIDQzLCAzMSwgNDQsIDQ5LCAzOCwgNTAsIDU2LAorICAgIDQ1LCAzOSwgNTEsIDU3LCA1MiwgNDYsIDU4LCA1MywKKyAgICA1OSwgNDcsIDYwLCA1NCwgNjEsIDU1LCA2MiwgNjMsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfcm93X3NjYW5fOHg4WzY0XSA9IHsKKyAgICAgMCwgIDgsIDE2LCAgMSwgIDksIDI0LCAgMiwgMTcsCisgICAgMzIsIDEwLCAyNSwgIDMsIDQwLCAxOCwgMTEsIDMzLAorICAgIDI2LCAxOSwgIDQsIDQ4LCA0MSwgMzQsIDEyLCAyNywKKyAgICA1NiwgMjAsICA1LCA0MiwgMzUsIDEzLCA0OSwgMjgsCisgICAgIDYsIDIxLCA0MywgMzYsIDE0LCA1MCwgMjksIDU3LAorICAgICA3LCA0NCwgMjIsIDM3LCA1MSwgMTUsIDU4LCAzMCwKKyAgICAyMywgNDUsIDUyLCAzOCwgNTksIDMxLCA0NiwgNTMsCisgICAgMzksIDYwLCA0NywgNjEsIDU0LCA2MiwgNTUsIDYzLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2RlZmF1bHRfc2Nhbl8xNngxNlsyNTZdID0geworICAgICAgMCwgICAxLCAgMTYsICAgMiwgIDE3LCAgMzIsICAgMywgIDE4LCAgMzMsICA0OCwgICA0LCAgMzQsICAxOSwgIDQ5LCAgMjAsICAgNSwKKyAgICAgMzUsICA2NCwgIDUwLCAgMzYsICA2NSwgIDIxLCAgIDYsICA1MSwgIDgwLCAgNjYsICAzNywgIDIyLCAgNTIsICAgNywgIDgxLCAgNjcsCisgICAgIDM4LCAgODIsICA1MywgIDIzLCAgOTYsICA2OCwgICA4LCAgODMsICA5NywgIDU0LCAgMzksICA2OSwgMTEyLCAgMjQsICA5OCwgIDg0LAorICAgICA3MCwgIDU1LCAgIDksICA0MCwgIDg1LCAgOTksIDExMywgMTI4LCAgMjUsIDExNCwgMTAwLCAgNzEsICA4NiwgIDU2LCAgMTAsICA0MSwKKyAgICAxMTUsIDEwMSwgMTI5LCAxMTYsICA3MiwgIDg3LCAgMjYsIDEzMCwgMTQ0LCAxMDIsICA1NywgIDExLCAgNDIsIDExNywgMTMxLCAxNDUsCisgICAgIDg4LCAxMDMsICAyNywgIDczLCAxMzIsIDExOCwgMTQ2LCAgNTgsIDE2MCwgIDEyLCAgNDMsIDEzMywgMTQ3LCAxMDQsICA4OSwgMTE5LAorICAgIDE2MSwgIDc0LCAxNDgsIDEzNCwgIDI4LCAxNjIsICA1OSwgIDEzLCAxNzYsIDEyMCwgMTQ5LCAgOTAsIDEzNSwgMTA1LCAxNjMsICA0NCwKKyAgICAgNzUsIDE3NywgMTY0LCAgMjksIDE1MCwgMTIxLCAxMzYsIDE3OCwgMTY1LCAgMTQsIDEwNiwgIDYwLCAgOTEsIDE1MSwgIDQ1LCAxNzksCisgICAgMTkyLCAxMzcsIDE2NiwgMTIyLCAgNzYsIDE4MCwgMTUyLCAgMzAsICA2MSwgIDE1LCAxMDcsIDE2NywgMTgxLCAxOTMsICA5MiwgMjA4LAorICAgICA0NiwgMTM4LCAxMjMsIDE1MywgMTk0LCAgNzcsIDE2OCwgMTgyLCAgMzEsIDE5NSwgMjA5LCAxODMsIDEwOCwgMTM5LCAgNjIsIDE1NCwKKyAgICAgNDcsIDE5NiwgIDkzLCAxNjksIDIxMCwgMTk3LCAyMjQsIDEyNCwgMTg0LCAyMTEsICA3OCwgMTA5LCAxNzAsIDE1NSwgIDYzLCAxOTgsCisgICAgMjEyLCAxODUsIDIyNSwgMjQwLCAxNDAsICA5NCwgMTk5LCAxMjUsICA3OSwgMjEzLCAyMjYsIDE3MSwgMTg2LCAxNTYsIDIxNCwgMjAwLAorICAgIDExMCwgMjI3LCAxNDEsICA5NSwgMjQxLCAyMTUsIDIyOCwgMjAxLCAxMjYsIDI0MiwgMTg3LCAxNzIsIDE1NywgMjI5LCAxMTEsIDIxNiwKKyAgICAyNDMsIDE0MiwgMjAyLCAyMzAsIDEyNywgMjE3LCAyNDQsIDE3MywgMTg4LCAyMzEsIDE1OCwgMjAzLCAxNDMsIDI0NSwgMjE4LCAyMzIsCisgICAgMTg5LCAyNDYsIDE1OSwgMTc0LCAyMzMsIDI0NywgMjE5LCAyMDQsIDE3NSwgMTkwLCAyNDgsIDIzNCwgMjA1LCAyMjAsIDI0OSwgMTkxLAorICAgIDIzNSwgMjIxLCAyNTAsIDIwNiwgMjIyLCAyNTEsIDIzNiwgMjA3LCAyMzcsIDIyMywgMjUyLCAyMzgsIDI1MywgMjM5LCAyNTQsIDI1NSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9jb2xfc2Nhbl8xNngxNlsyNTZdID0geworICAgICAgMCwgICAxLCAgIDIsICAgMywgIDE2LCAgIDQsICAxNywgICA1LCAgMTgsICAgNiwgIDE5LCAgMzIsICAyMCwgICA3LCAgMzMsICAyMSwKKyAgICAgMzQsICAgOCwgIDM1LCAgMjIsICA0OCwgIDM2LCAgIDksICA0OSwgIDIzLCAgNTAsICAzNywgIDEwLCAgMzgsICA1MSwgIDI0LCAgNjQsCisgICAgIDUyLCAgMTEsICA2NSwgIDM5LCAgMjUsICA1MywgIDY2LCAgNTQsICA0MCwgIDY3LCAgMTIsICA4MCwgIDI2LCAgNjgsICA1NSwgIDgxLAorICAgICA0MSwgIDY5LCAgMTMsICAyNywgIDgyLCAgNTYsICA3MCwgIDgzLCAgNDIsICAxNCwgIDg0LCAgOTYsICA3MSwgIDI4LCAgNTcsICA4NSwKKyAgICAgOTcsICAxNSwgIDcyLCAgOTgsICA0MywgIDg2LCAgNTgsICA5OSwgIDI5LCAgODcsIDEwMCwgMTEyLCAgNzMsICA0NCwgMTAxLCAgNTksCisgICAgIDMwLCAxMTMsICA4OCwgMTE0LCAgNzQsIDEyOCwgMTAyLCAgNDUsICAzMSwgMTE1LCAgNjAsIDEwMywgIDg5LCAxMTYsICA3NSwgMTI5LAorICAgIDExNywgIDQ2LCAxMDQsICA5MCwgIDYxLCAxMzAsIDExOCwgMTMxLCAxMzIsIDEwNSwgIDc2LCAgNDcsIDExOSwgMTQ0LCAgOTEsICA2MiwKKyAgICAxMzMsIDEwNiwgMTQ1LCAxMjAsIDE0NiwgMTM0LCAgNzcsIDE0NywgMTIxLCAgOTIsIDEzNSwgMTQ4LCAgNjMsIDEwNywgMTM2LCAxMjIsCisgICAgIDkzLCAxNDksIDE2MCwgIDc4LCAxNTAsIDEzNywgMTA4LCAxNjEsIDE2MiwgMTUxLCAxMjMsICA3OSwgMTM4LCAxNjMsIDE1MiwgIDk0LAorICAgIDE2NCwgMTA5LCAxNjUsIDE1MywgMTI0LCAxMzksIDE3NiwgMTY2LCAgOTUsIDE3NywgMTY3LCAxMTAsIDE1NCwgMTc4LCAxMjUsIDE3OSwKKyAgICAxNDAsIDE2OCwgMTU1LCAxMTEsIDE4MCwgMTkyLCAxODEsIDE2OSwgMTQxLCAxMjYsIDE4MiwgMTkzLCAxOTQsIDE1NiwgMTgzLCAxNzAsCisgICAgMTk1LCAxMjcsIDE0MiwgMTk2LCAxODQsIDIwOCwgMTk3LCAxNTcsIDE3MSwgMTQzLCAxODUsIDE5OCwgMjA5LCAxOTksIDIxMCwgMTcyLAorICAgIDE1OCwgMTg2LCAyMTEsIDIyNCwgMjEyLCAyMDAsIDI0MCwgMTU5LCAyMTMsIDIyNSwgMTg3LCAyMDEsIDE3MywgMjI2LCAyMTQsIDIxNSwKKyAgICAyMjcsIDIwMiwgMjI4LCAxODgsIDI0MSwgMjE2LCAxNzQsIDIyOSwgMjQyLCAyMDMsIDI0MywgMjE3LCAyMzAsIDE3NSwgMTg5LCAyNDQsCisgICAgMjMxLCAyMDQsIDIxOCwgMjMyLCAyNDUsIDIxOSwgMjQ2LCAxOTAsIDIzMywgMjA1LCAxOTEsIDI0NywgMjM0LCAyNDgsIDIyMCwgMjA2LAorICAgIDI0OSwgMjM1LCAyMjEsIDIwNywgMjUwLCAyMzYsIDIyMiwgMjUxLCAyMjMsIDIzNywgMjM4LCAyNTIsIDIzOSwgMjUzLCAyNTQsIDI1NSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9yb3dfc2Nhbl8xNngxNlsyNTZdID0geworICAgICAgMCwgIDE2LCAgMzIsICAgMSwgIDQ4LCAgMTcsICA2NCwgIDMzLCAgIDIsICA4MCwgIDE4LCAgNDksICA5NiwgIDM0LCAgIDMsICA2NSwKKyAgICAgMTksIDExMiwgIDUwLCAgODEsICAzNSwgICA0LCAxMjgsICA2NiwgIDIwLCAgOTcsICA1MSwgIDgyLCAgIDUsIDE0NCwgIDM2LCAgNjcsCisgICAgMTEzLCAgOTgsICAyMSwgIDUyLCAxNjAsICA4MywgMTI5LCAgMzcsICA2OCwgICA2LCAxMTQsIDE3NiwgIDk5LCAgNTMsICAyMiwgIDg0LAorICAgIDE0NSwgIDM4LCAgNjksIDEzMCwgICA3LCAxMTUsIDE5MiwgMTAwLCAgNTQsICAyMywgIDg1LCAxNjEsIDE0NiwgMTMxLCAgMzksICA3MCwKKyAgICAyMDgsIDExNiwgICA4LCAxMDEsIDE3NywgIDU1LCAgODYsICAyNCwgMTYyLCAxNDcsIDEzMiwgIDcxLCAyMjQsIDExNywgIDQwLCAxMDIsCisgICAgICA5LCAxNDgsICA1NiwgIDg3LCAxOTMsIDE2MywgMjQwLCAxMzMsIDE3OCwgIDI1LCAxMTgsICA3MiwgIDQxLCAxMDMsIDE2NCwgIDEwLAorICAgIDE0OSwgIDg4LCAxMzQsIDIwOSwgMTc5LCAgNTcsIDExOSwgMTk0LCAgMjYsICA3MywgMTY1LCAxNTAsIDEwNCwgIDQyLCAxMzUsICAxMSwKKyAgICAxODAsIDEyMCwgIDg5LCAyMjUsIDE5NSwgIDU4LCAgMjcsIDIxMCwgMTUxLCAxODEsIDE2NiwgIDc0LCAgNDMsIDEwNSwgIDEyLCAxMzYsCisgICAgIDkwLCAgNTksIDI0MSwgMTIxLCAgMjgsIDE5NiwgMTY3LCAyMTEsIDE1MiwgIDQ0LCAxODIsIDEzNywgIDc1LCAgMTMsIDIyNiwgMTA2LAorICAgIDEyMiwgIDYwLCAxOTcsICA5MSwgMTY4LCAgMjksIDE4MywgMTUzLCAgMTQsICA3NiwgMjEyLCAxMzgsICA0NSwgMTA3LCAgMTUsIDE5OCwKKyAgICAgOTIsIDIyNywgMTY5LCAgMzAsIDEyMywgMTU0LCAgNjEsIDI0MiwgMTg0LCAyMTMsIDEzOSwgIDQ2LCAgNzcsICAzMSwgMTA4LCAxNzAsCisgICAgMTk5LCAxODUsIDEyNCwgMjI4LCAgOTMsIDE1NSwgMjE0LCAgNjIsIDE0MCwgMjQzLCAgNzgsICA0NywgMjAwLCAxMDksIDE4NiwgMTcxLAorICAgIDIwMSwgIDk0LCAgNjMsIDIxNSwgMjI5LCAxNTYsICA3OSwgMTI1LCAxNDEsIDExMCwgMjE2LCAxODcsIDE3MiwgMjQ0LCAyMDIsIDIzMCwKKyAgICAyMTcsICA5NSwgMTU3LCAxMjYsIDI0NSwgMTExLCAxNDIsIDIzMSwgMTg4LCAxMjcsIDE1OCwgMjE4LCAxNzMsIDIzMiwgMjQ2LCAyMzMsCisgICAgMjAzLCAxNDMsIDI0NywgMTc0LCAxODksIDE1OSwgMjE5LCAyMDQsIDI0OCwgMjM0LCAyNDksIDE3NSwgMTkwLCAyMjAsIDIwNSwgMjUwLAorICAgIDIzNSwgMTkxLCAyMjEsIDI1MSwgMjM2LCAyMDYsIDI1MiwgMjIyLCAyMDcsIDIzNywgMjIzLCAyNTMsIDIzOCwgMjU0LCAyMzksIDI1NSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJbMTAyNF0gPSB7CisgICAgICAgMCwgICAgMSwgICAzMiwgICAgMiwgICAzMywgICA2NCwgICAgMywgICAzNCwgICA2NSwgICAgNCwgICA5NiwgICAzNSwgICA2NiwgICAgNSwgICAzNiwgICA5NywgICA2NywgIDEyOCwgICA5OCwgICA2OCwgICAzNywgICAgNiwgIDEyOSwgICA5OSwgICAgNywgIDE2MCwgICA2OSwgICAzOCwgIDEzMCwgIDEwMCwgIDE2MSwgIDEzMSwKKyAgICAgIDM5LCAgIDcwLCAgICA4LCAgMTAxLCAgMTYyLCAgMTMyLCAgMTkyLCAgIDcxLCAgIDQwLCAgICA5LCAgMTAyLCAgMTYzLCAgMTMzLCAgMTkzLCAgIDcyLCAgMjI0LCAgMTAzLCAgIDQxLCAgMTY0LCAgIDEwLCAgMTk0LCAgMTM0LCAgMTY1LCAgIDczLCAgMTA0LCAgMTM1LCAgMjI1LCAgIDQyLCAgMTk1LCAgIDExLCAgMjU2LCAgMTY2LAorICAgICAyMjYsICAxOTYsICAgNzQsICAxMDUsICAxMzYsICAgNDMsICAgMTIsICAxNjcsICAxOTcsICAyMjcsICAyNTcsICAgNzUsICAxMDYsICAxMzcsICAyMjgsICAgNDQsICAxOTgsICAxNjgsICAyNTgsICAyODgsICAgMTMsICAyMjksICAgNzYsICAxMDcsICAxOTksICAxMzgsICAyNTksICAxNjksICAyODksICAgNDUsICAyMzAsICAyNjAsCisgICAgIDIwMCwgIDEwOCwgICAxNCwgIDE3MCwgIDEzOSwgIDMyMCwgIDI5MCwgICA3NywgIDIzMSwgIDI2MSwgICA0NiwgIDIwMSwgIDE0MCwgIDI5MSwgIDEwOSwgIDIzMiwgIDMyMSwgIDI2MiwgIDE3MSwgICA3OCwgIDI5MiwgICAxNSwgIDMyMiwgIDIwMiwgIDI2MywgIDM1MiwgIDE3MiwgIDI5MywgIDIzMywgIDE0MSwgIDMyMywgIDExMCwKKyAgICAgIDQ3LCAgMjAzLCAgMjY0LCAgMjM0LCAgMjk0LCAgMzUzLCAgMzI0LCAgIDE2LCAgIDc5LCAgMjA0LCAgMjY1LCAgMjk1LCAgMzI1LCAgMTczLCAgMzU0LCAgMTQyLCAgMjM1LCAgMzg0LCAgIDQ4LCAgMjk2LCAgMTExLCAgMjY2LCAgMzU1LCAgMzI2LCAgIDgwLCAgIDE3LCAgMjA1LCAgMjM2LCAgMTc0LCAgMzU2LCAgMzg1LCAgMzI3LAorICAgICAxNDMsICAyOTcsICAyNjcsICAzNTcsICAzODYsICAxMTIsICAgNDksICAzMjgsICAyOTgsICAyMDYsICA0MTYsICAyMzcsICAzNTgsICAzODcsICAgODEsICAxNzUsICAgMTgsICAzMjksICAzNTksICAzODgsICAyOTksICAzMzAsICAzODksICAxMTMsICA0MTcsICAyMzgsICAzNjAsICAgNTAsICAyMDcsICA0MTgsICAzOTAsICAzMzEsCisgICAgICAxOSwgIDQ0OCwgIDM2MSwgICA4MiwgIDQxOSwgIDM5MSwgIDIzOSwgICA1MSwgIDM2MiwgIDQyMCwgIDExNCwgIDQ0OSwgIDQ4MCwgIDQyMSwgICA4MywgIDM2MywgIDQ1MCwgIDQyMiwgIDUxMiwgIDQ1MSwgIDQyMywgIDExNSwgIDQ1MiwgIDQ4MSwgIDQ1MywgIDQ4MiwgIDQ1NCwgIDU0NCwgIDQ4MywgIDQ1NSwgIDUxMywgIDQ4NCwKKyAgICAgNTE0LCAgNDg1LCAgNTE1LCAgNDg2LCAgNTQ1LCAgNTc2LCAgNDg3LCAgNTQ2LCAgNTQ3LCAgNjA4LCAgNTc3LCAgNTc4LCAgNTc5LCAgNjA5LCAgNjEwLCAgNjExLCAgIDIwLCAgMTQ0LCAgMjY4LCAgMzkyLCAgNTE2LCAgNjQwLCAgIDIxLCAgIDUyLCAgMTQ1LCAgMTc2LCAgMjY5LCAgMzAwLCAgMzkzLCAgNDI0LCAgNTE3LCAgNTQ4LAorICAgICA2NDEsICA2NzIsICAgMjIsICAgNTMsICAgODQsICAxNDYsICAxNzcsICAyMDgsICAyNzAsICAzMDEsICAzMzIsICAzOTQsICA0MjUsICA0NTYsICA1MTgsICA1NDksICA1ODAsICA2NDIsICA2NzMsICA3MDQsICAgMjMsICAgNTQsICAgODUsICAxMTYsICAxNDcsICAxNzgsICAyMDksICAyNDAsICAyNzEsICAzMDIsICAzMzMsICAzNjQsCisgICAgIDM5NSwgIDQyNiwgIDQ1NywgIDQ4OCwgIDUxOSwgIDU1MCwgIDU4MSwgIDYxMiwgIDY0MywgIDY3NCwgIDcwNSwgIDczNiwgICA1NSwgICA4NiwgIDExNywgIDE3OSwgIDIxMCwgIDI0MSwgIDMwMywgIDMzNCwgIDM2NSwgIDQyNywgIDQ1OCwgIDQ4OSwgIDU1MSwgIDU4MiwgIDYxMywgIDY3NSwgIDcwNiwgIDczNywgICA4NywgIDExOCwKKyAgICAgMjExLCAgMjQyLCAgMzM1LCAgMzY2LCAgNDU5LCAgNDkwLCAgNTgzLCAgNjE0LCAgNzA3LCAgNzM4LCAgMTE5LCAgMjQzLCAgMzY3LCAgNDkxLCAgNjE1LCAgNzM5LCAgIDI0LCAgMTQ4LCAgMjcyLCAgMzk2LCAgNTIwLCAgNjQ0LCAgNzY4LCAgIDI1LCAgIDU2LCAgMTQ5LCAgMTgwLCAgMjczLCAgMzA0LCAgMzk3LCAgNDI4LCAgNTIxLAorICAgICA1NTIsICA2NDUsICA2NzYsICA3NjksICA4MDAsICAgMjYsICAgNTcsICAgODgsICAxNTAsICAxODEsICAyMTIsICAyNzQsICAzMDUsICAzMzYsICAzOTgsICA0MjksICA0NjAsICA1MjIsICA1NTMsICA1ODQsICA2NDYsICA2NzcsICA3MDgsICA3NzAsICA4MDEsICA4MzIsICAgMjcsICAgNTgsICAgODksICAxMjAsICAxNTEsICAxODIsCisgICAgIDIxMywgIDI0NCwgIDI3NSwgIDMwNiwgIDMzNywgIDM2OCwgIDM5OSwgIDQzMCwgIDQ2MSwgIDQ5MiwgIDUyMywgIDU1NCwgIDU4NSwgIDYxNiwgIDY0NywgIDY3OCwgIDcwOSwgIDc0MCwgIDc3MSwgIDgwMiwgIDgzMywgIDg2NCwgICA1OSwgICA5MCwgIDEyMSwgIDE4MywgIDIxNCwgIDI0NSwgIDMwNywgIDMzOCwgIDM2OSwgIDQzMSwKKyAgICAgNDYyLCAgNDkzLCAgNTU1LCAgNTg2LCAgNjE3LCAgNjc5LCAgNzEwLCAgNzQxLCAgODAzLCAgODM0LCAgODY1LCAgIDkxLCAgMTIyLCAgMjE1LCAgMjQ2LCAgMzM5LCAgMzcwLCAgNDYzLCAgNDk0LCAgNTg3LCAgNjE4LCAgNzExLCAgNzQyLCAgODM1LCAgODY2LCAgMTIzLCAgMjQ3LCAgMzcxLCAgNDk1LCAgNjE5LCAgNzQzLCAgODY3LAorICAgICAgMjgsICAxNTIsICAyNzYsICA0MDAsICA1MjQsICA2NDgsICA3NzIsICA4OTYsICAgMjksICAgNjAsICAxNTMsICAxODQsICAyNzcsICAzMDgsICA0MDEsICA0MzIsICA1MjUsICA1NTYsICA2NDksICA2ODAsICA3NzMsICA4MDQsICA4OTcsICA5MjgsICAgMzAsICAgNjEsICAgOTIsICAxNTQsICAxODUsICAyMTYsICAyNzgsICAzMDksCisgICAgIDM0MCwgIDQwMiwgIDQzMywgIDQ2NCwgIDUyNiwgIDU1NywgIDU4OCwgIDY1MCwgIDY4MSwgIDcxMiwgIDc3NCwgIDgwNSwgIDgzNiwgIDg5OCwgIDkyOSwgIDk2MCwgICAzMSwgICA2MiwgICA5MywgIDEyNCwgIDE1NSwgIDE4NiwgIDIxNywgIDI0OCwgIDI3OSwgIDMxMCwgIDM0MSwgIDM3MiwgIDQwMywgIDQzNCwgIDQ2NSwgIDQ5NiwKKyAgICAgNTI3LCAgNTU4LCAgNTg5LCAgNjIwLCAgNjUxLCAgNjgyLCAgNzEzLCAgNzQ0LCAgNzc1LCAgODA2LCAgODM3LCAgODY4LCAgODk5LCAgOTMwLCAgOTYxLCAgOTkyLCAgIDYzLCAgIDk0LCAgMTI1LCAgMTg3LCAgMjE4LCAgMjQ5LCAgMzExLCAgMzQyLCAgMzczLCAgNDM1LCAgNDY2LCAgNDk3LCAgNTU5LCAgNTkwLCAgNjIxLCAgNjgzLAorICAgICA3MTQsICA3NDUsICA4MDcsICA4MzgsICA4NjksICA5MzEsICA5NjIsICA5OTMsICAgOTUsICAxMjYsICAyMTksICAyNTAsICAzNDMsICAzNzQsICA0NjcsICA0OTgsICA1OTEsICA2MjIsICA3MTUsICA3NDYsICA4MzksICA4NzAsICA5NjMsICA5OTQsICAxMjcsICAyNTEsICAzNzUsICA0OTksICA2MjMsICA3NDcsICA4NzEsICA5OTUsCisgICAgIDE1NiwgIDI4MCwgIDQwNCwgIDUyOCwgIDY1MiwgIDc3NiwgIDkwMCwgIDE1NywgIDE4OCwgIDI4MSwgIDMxMiwgIDQwNSwgIDQzNiwgIDUyOSwgIDU2MCwgIDY1MywgIDY4NCwgIDc3NywgIDgwOCwgIDkwMSwgIDkzMiwgIDE1OCwgIDE4OSwgIDIyMCwgIDI4MiwgIDMxMywgIDM0NCwgIDQwNiwgIDQzNywgIDQ2OCwgIDUzMCwgIDU2MSwKKyAgICAgNTkyLCAgNjU0LCAgNjg1LCAgNzE2LCAgNzc4LCAgODA5LCAgODQwLCAgOTAyLCAgOTMzLCAgOTY0LCAgMTU5LCAgMTkwLCAgMjIxLCAgMjUyLCAgMjgzLCAgMzE0LCAgMzQ1LCAgMzc2LCAgNDA3LCAgNDM4LCAgNDY5LCAgNTAwLCAgNTMxLCAgNTYyLCAgNTkzLCAgNjI0LCAgNjU1LCAgNjg2LCAgNzE3LCAgNzQ4LCAgNzc5LCAgODEwLAorICAgICA4NDEsICA4NzIsICA5MDMsICA5MzQsICA5NjUsICA5OTYsICAxOTEsICAyMjIsICAyNTMsICAzMTUsICAzNDYsICAzNzcsICA0MzksICA0NzAsICA1MDEsICA1NjMsICA1OTQsICA2MjUsICA2ODcsICA3MTgsICA3NDksICA4MTEsICA4NDIsICA4NzMsICA5MzUsICA5NjYsICA5OTcsICAyMjMsICAyNTQsICAzNDcsICAzNzgsICA0NzEsCisgICAgIDUwMiwgIDU5NSwgIDYyNiwgIDcxOSwgIDc1MCwgIDg0MywgIDg3NCwgIDk2NywgIDk5OCwgIDI1NSwgIDM3OSwgIDUwMywgIDYyNywgIDc1MSwgIDg3NSwgIDk5OSwgIDI4NCwgIDQwOCwgIDUzMiwgIDY1NiwgIDc4MCwgIDkwNCwgIDI4NSwgIDMxNiwgIDQwOSwgIDQ0MCwgIDUzMywgIDU2NCwgIDY1NywgIDY4OCwgIDc4MSwgIDgxMiwKKyAgICAgOTA1LCAgOTM2LCAgMjg2LCAgMzE3LCAgMzQ4LCAgNDEwLCAgNDQxLCAgNDcyLCAgNTM0LCAgNTY1LCAgNTk2LCAgNjU4LCAgNjg5LCAgNzIwLCAgNzgyLCAgODEzLCAgODQ0LCAgOTA2LCAgOTM3LCAgOTY4LCAgMjg3LCAgMzE4LCAgMzQ5LCAgMzgwLCAgNDExLCAgNDQyLCAgNDczLCAgNTA0LCAgNTM1LCAgNTY2LCAgNTk3LCAgNjI4LAorICAgICA2NTksICA2OTAsICA3MjEsICA3NTIsICA3ODMsICA4MTQsICA4NDUsICA4NzYsICA5MDcsICA5MzgsICA5NjksIDEwMDAsICAzMTksICAzNTAsICAzODEsICA0NDMsICA0NzQsICA1MDUsICA1NjcsICA1OTgsICA2MjksICA2OTEsICA3MjIsICA3NTMsICA4MTUsICA4NDYsICA4NzcsICA5MzksICA5NzAsIDEwMDEsICAzNTEsICAzODIsCisgICAgIDQ3NSwgIDUwNiwgIDU5OSwgIDYzMCwgIDcyMywgIDc1NCwgIDg0NywgIDg3OCwgIDk3MSwgMTAwMiwgIDM4MywgIDUwNywgIDYzMSwgIDc1NSwgIDg3OSwgMTAwMywgIDQxMiwgIDUzNiwgIDY2MCwgIDc4NCwgIDkwOCwgIDQxMywgIDQ0NCwgIDUzNywgIDU2OCwgIDY2MSwgIDY5MiwgIDc4NSwgIDgxNiwgIDkwOSwgIDk0MCwgIDQxNCwKKyAgICAgNDQ1LCAgNDc2LCAgNTM4LCAgNTY5LCAgNjAwLCAgNjYyLCAgNjkzLCAgNzI0LCAgNzg2LCAgODE3LCAgODQ4LCAgOTEwLCAgOTQxLCAgOTcyLCAgNDE1LCAgNDQ2LCAgNDc3LCAgNTA4LCAgNTM5LCAgNTcwLCAgNjAxLCAgNjMyLCAgNjYzLCAgNjk0LCAgNzI1LCAgNzU2LCAgNzg3LCAgODE4LCAgODQ5LCAgODgwLCAgOTExLCAgOTQyLAorICAgICA5NzMsIDEwMDQsICA0NDcsICA0NzgsICA1MDksICA1NzEsICA2MDIsICA2MzMsICA2OTUsICA3MjYsICA3NTcsICA4MTksICA4NTAsICA4ODEsICA5NDMsICA5NzQsIDEwMDUsICA0NzksICA1MTAsICA2MDMsICA2MzQsICA3MjcsICA3NTgsICA4NTEsICA4ODIsICA5NzUsIDEwMDYsICA1MTEsICA2MzUsICA3NTksICA4ODMsIDEwMDcsCisgICAgIDU0MCwgIDY2NCwgIDc4OCwgIDkxMiwgIDU0MSwgIDU3MiwgIDY2NSwgIDY5NiwgIDc4OSwgIDgyMCwgIDkxMywgIDk0NCwgIDU0MiwgIDU3MywgIDYwNCwgIDY2NiwgIDY5NywgIDcyOCwgIDc5MCwgIDgyMSwgIDg1MiwgIDkxNCwgIDk0NSwgIDk3NiwgIDU0MywgIDU3NCwgIDYwNSwgIDYzNiwgIDY2NywgIDY5OCwgIDcyOSwgIDc2MCwKKyAgICAgNzkxLCAgODIyLCAgODUzLCAgODg0LCAgOTE1LCAgOTQ2LCAgOTc3LCAxMDA4LCAgNTc1LCAgNjA2LCAgNjM3LCAgNjk5LCAgNzMwLCAgNzYxLCAgODIzLCAgODU0LCAgODg1LCAgOTQ3LCAgOTc4LCAxMDA5LCAgNjA3LCAgNjM4LCAgNzMxLCAgNzYyLCAgODU1LCAgODg2LCAgOTc5LCAxMDEwLCAgNjM5LCAgNzYzLCAgODg3LCAxMDExLAorICAgICA2NjgsICA3OTIsICA5MTYsICA2NjksICA3MDAsICA3OTMsICA4MjQsICA5MTcsICA5NDgsICA2NzAsICA3MDEsICA3MzIsICA3OTQsICA4MjUsICA4NTYsICA5MTgsICA5NDksICA5ODAsICA2NzEsICA3MDIsICA3MzMsICA3NjQsICA3OTUsICA4MjYsICA4NTcsICA4ODgsICA5MTksICA5NTAsICA5ODEsIDEwMTIsICA3MDMsICA3MzQsCisgICAgIDc2NSwgIDgyNywgIDg1OCwgIDg4OSwgIDk1MSwgIDk4MiwgMTAxMywgIDczNSwgIDc2NiwgIDg1OSwgIDg5MCwgIDk4MywgMTAxNCwgIDc2NywgIDg5MSwgMTAxNSwgIDc5NiwgIDkyMCwgIDc5NywgIDgyOCwgIDkyMSwgIDk1MiwgIDc5OCwgIDgyOSwgIDg2MCwgIDkyMiwgIDk1MywgIDk4NCwgIDc5OSwgIDgzMCwgIDg2MSwgIDg5MiwKKyAgICAgOTIzLCAgOTU0LCAgOTg1LCAxMDE2LCAgODMxLCAgODYyLCAgODkzLCAgOTU1LCAgOTg2LCAxMDE3LCAgODYzLCAgODk0LCAgOTg3LCAxMDE4LCAgODk1LCAxMDE5LCAgOTI0LCAgOTI1LCAgOTU2LCAgOTI2LCAgOTU3LCAgOTg4LCAgOTI3LCAgOTU4LCAgOTg5LCAxMDIwLCAgOTU5LCAgOTkwLCAxMDIxLCAgOTkxLCAxMDIyLCAxMDIzLAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgKiBjb25zdCB2cDlfc2NhbnNbNV1bNF0gPSB7CisgICAgeworICAgICAgICB2cDlfZGVmYXVsdF9zY2FuXzR4NCwgdnA5X2NvbF9zY2FuXzR4NCwKKyAgICAgICAgdnA5X3Jvd19zY2FuXzR4NCwgdnA5X2RlZmF1bHRfc2Nhbl80eDQKKyAgICB9LCB7CisgICAgICAgIHZwOV9kZWZhdWx0X3NjYW5fOHg4LCB2cDlfY29sX3NjYW5fOHg4LAorICAgICAgICB2cDlfcm93X3NjYW5fOHg4LCB2cDlfZGVmYXVsdF9zY2FuXzh4OAorICAgIH0sIHsKKyAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl8xNngxNiwgdnA5X2NvbF9zY2FuXzE2eDE2LAorICAgICAgICB2cDlfcm93X3NjYW5fMTZ4MTYsIHZwOV9kZWZhdWx0X3NjYW5fMTZ4MTYKKyAgICB9LCB7CisgICAgICAgIHZwOV9kZWZhdWx0X3NjYW5fMzJ4MzIsIHZwOV9kZWZhdWx0X3NjYW5fMzJ4MzIsCisgICAgICAgIHZwOV9kZWZhdWx0X3NjYW5fMzJ4MzIsIHZwOV9kZWZhdWx0X3NjYW5fMzJ4MzIKKyAgICB9LCB7IC8vIGxvc3NsZXNzCisgICAgICAgIHZwOV9kZWZhdWx0X3NjYW5fNHg0LCB2cDlfZGVmYXVsdF9zY2FuXzR4NCwKKyAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl80eDQsIHZwOV9kZWZhdWx0X3NjYW5fNHg0CisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2RlZmF1bHRfc2Nhbl80eDRfbmJbMTZdWzJdID0geworICAgIHsgIDAsICAwIH0sIHsgIDAsICAwIH0sIHsgIDQsICAxIH0sIHsgIDEsICAxIH0sCisgICAgeyAgNCwgIDQgfSwgeyAgMiwgIDIgfSwgeyAgNSwgIDIgfSwgeyAgOCwgIDggfSwKKyAgICB7ICA4LCAgNSB9LCB7ICA2LCAgMyB9LCB7ICA5LCAgNiB9LCB7IDEyLCAgOSB9LAorICAgIHsgMTAsICA3IH0sIHsgMTMsIDEwIH0sIHsgMTQsIDExIH0sIHsgIDAsICAwIH0sCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfY29sX3NjYW5fNHg0X25iWzE2XVsyXSA9IHsKKyAgICB7ICAwLCAgMCB9LCB7ICAxLCAgMSB9LCB7ICAwLCAgMCB9LCB7ICAyLCAgMiB9LAorICAgIHsgIDQsICA0IH0sIHsgIDUsICA1IH0sIHsgIDQsICA0IH0sIHsgIDYsICA2IH0sCisgICAgeyAgOCwgIDggfSwgeyAgOSwgIDkgfSwgeyAgOCwgIDggfSwgeyAxMiwgMTIgfSwKKyAgICB7IDEwLCAxMCB9LCB7IDEzLCAxMyB9LCB7IDE0LCAxNCB9LCB7ICAwLCAgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X3Jvd19zY2FuXzR4NF9uYlsxNl1bMl0gPSB7CisgICAgeyAgMCwgIDAgfSwgeyAgMCwgIDAgfSwgeyAgNCwgIDQgfSwgeyAgMSwgIDEgfSwKKyAgICB7ICA4LCAgOCB9LCB7ICA1LCAgNSB9LCB7ICAxLCAgMSB9LCB7ICAyLCAgMiB9LAorICAgIHsgIDksICA5IH0sIHsgIDIsICAyIH0sIHsgIDYsICA2IH0sIHsgIDMsICAzIH0sCisgICAgeyAxMCwgMTAgfSwgeyAgNywgIDcgfSwgeyAxMSwgMTEgfSwgeyAgMCwgIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9kZWZhdWx0X3NjYW5fOHg4X25iWzY0XVsyXSA9IHsKKyAgICB7ICAwLCAgMCB9LCB7ICAwLCAgMCB9LCB7ICAxLCAgMSB9LCB7ICA4LCAgMSB9LAorICAgIHsgIDgsICA4IH0sIHsgIDksICAyIH0sIHsgIDIsICAyIH0sIHsgMTYsICA5IH0sCisgICAgeyAxNiwgMTYgfSwgeyAxNywgMTAgfSwgeyAxMCwgIDMgfSwgeyAgMywgIDMgfSwKKyAgICB7IDI0LCAxNyB9LCB7IDI0LCAyNCB9LCB7IDE4LCAxMSB9LCB7IDExLCAgNCB9LAorICAgIHsgMjUsIDE4IH0sIHsgIDQsICA0IH0sIHsgMzIsIDI1IH0sIHsgMTksIDEyIH0sCisgICAgeyAyNiwgMTkgfSwgeyAzMiwgMzIgfSwgeyAxMiwgIDUgfSwgeyAzMywgMjYgfSwKKyAgICB7ICA1LCAgNSB9LCB7IDQwLCAzMyB9LCB7IDI3LCAyMCB9LCB7IDIwLCAxMyB9LAorICAgIHsgMzQsIDI3IH0sIHsgNDEsIDM0IH0sIHsgNDAsIDQwIH0sIHsgMTMsICA2IH0sCisgICAgeyAgNiwgIDYgfSwgeyAzNSwgMjggfSwgeyAyOCwgMjEgfSwgeyA0MiwgMzUgfSwKKyAgICB7IDQ4LCA0OCB9LCB7IDQ4LCA0MSB9LCB7IDIxLCAxNCB9LCB7IDE0LCAgNyB9LAorICAgIHsgMzYsIDI5IH0sIHsgNDksIDQyIH0sIHsgNDMsIDM2IH0sIHsgNTYsIDQ5IH0sCisgICAgeyAyOSwgMjIgfSwgeyAyMiwgMTUgfSwgeyA1MCwgNDMgfSwgeyA0NCwgMzcgfSwKKyAgICB7IDU3LCA1MCB9LCB7IDM3LCAzMCB9LCB7IDMwLCAyMyB9LCB7IDUxLCA0NCB9LAorICAgIHsgNTgsIDUxIH0sIHsgMzgsIDMxIH0sIHsgNDUsIDM4IH0sIHsgNTIsIDQ1IH0sCisgICAgeyA1OSwgNTIgfSwgeyA0NiwgMzkgfSwgeyA1MywgNDYgfSwgeyA2MCwgNTMgfSwKKyAgICB7IDU0LCA0NyB9LCB7IDYxLCA1NCB9LCB7IDYyLCA1NSB9LCB7ICAwLCAgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2NvbF9zY2FuXzh4OF9uYls2NF1bMl0gPSB7CisgICAgeyAgMCwgIDAgfSwgeyAgMSwgIDEgfSwgeyAgMCwgIDAgfSwgeyAgMiwgIDIgfSwKKyAgICB7ICA4LCAgOCB9LCB7ICAzLCAgMyB9LCB7ICA5LCAgOSB9LCB7ICA4LCAgOCB9LAorICAgIHsgIDQsICA0IH0sIHsgMTAsIDEwIH0sIHsgMTYsIDE2IH0sIHsgMTEsIDExIH0sCisgICAgeyAxNywgMTcgfSwgeyAgNSwgIDUgfSwgeyAxNiwgMTYgfSwgeyAxOCwgMTggfSwKKyAgICB7IDEyLCAxMiB9LCB7IDI0LCAyNCB9LCB7ICA2LCAgNiB9LCB7IDI1LCAyNSB9LAorICAgIHsgMTksIDE5IH0sIHsgMjQsIDI0IH0sIHsgMTMsIDEzIH0sIHsgMjYsIDI2IH0sCisgICAgeyAyMCwgMjAgfSwgeyAzMiwgMzIgfSwgeyAyNywgMjcgfSwgeyAzMywgMzMgfSwKKyAgICB7IDE0LCAxNCB9LCB7IDIxLCAyMSB9LCB7IDM0LCAzNCB9LCB7IDMyLCAzMiB9LAorICAgIHsgMjgsIDI4IH0sIHsgNDAsIDQwIH0sIHsgMzUsIDM1IH0sIHsgMjIsIDIyIH0sCisgICAgeyAyOSwgMjkgfSwgeyA0MSwgNDEgfSwgeyAzNiwgMzYgfSwgeyA0MCwgNDAgfSwKKyAgICB7IDQyLCA0MiB9LCB7IDMwLCAzMCB9LCB7IDQzLCA0MyB9LCB7IDQ4LCA0OCB9LAorICAgIHsgMzcsIDM3IH0sIHsgNDksIDQ5IH0sIHsgNDgsIDQ4IH0sIHsgNDQsIDQ0IH0sCisgICAgeyAzOCwgMzggfSwgeyA1MCwgNTAgfSwgeyA1NiwgNTYgfSwgeyA1MSwgNTEgfSwKKyAgICB7IDQ1LCA0NSB9LCB7IDU3LCA1NyB9LCB7IDUyLCA1MiB9LCB7IDU4LCA1OCB9LAorICAgIHsgNDYsIDQ2IH0sIHsgNTksIDU5IH0sIHsgNTMsIDUzIH0sIHsgNjAsIDYwIH0sCisgICAgeyA1NCwgNTQgfSwgeyA2MSwgNjEgfSwgeyA2MiwgNjIgfSwgeyAgMCwgIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9yb3dfc2Nhbl84eDhfbmJbNjRdWzJdID0geworICAgIHsgIDAsICAwIH0sIHsgIDgsICA4IH0sIHsgIDAsICAwIH0sIHsgIDEsICAxIH0sCisgICAgeyAxNiwgMTYgfSwgeyAgMSwgIDEgfSwgeyAgOSwgIDkgfSwgeyAyNCwgMjQgfSwKKyAgICB7ICAyLCAgMiB9LCB7IDE3LCAxNyB9LCB7ICAyLCAgMiB9LCB7IDMyLCAzMiB9LAorICAgIHsgMTAsIDEwIH0sIHsgIDMsICAzIH0sIHsgMjUsIDI1IH0sIHsgMTgsIDE4IH0sCisgICAgeyAxMSwgMTEgfSwgeyAgMywgIDMgfSwgeyA0MCwgNDAgfSwgeyAzMywgMzMgfSwKKyAgICB7IDI2LCAyNiB9LCB7ICA0LCAgNCB9LCB7IDE5LCAxOSB9LCB7IDQ4LCA0OCB9LAorICAgIHsgMTIsIDEyIH0sIHsgIDQsICA0IH0sIHsgMzQsIDM0IH0sIHsgMjcsIDI3IH0sCisgICAgeyAgNSwgIDUgfSwgeyA0MSwgNDEgfSwgeyAyMCwgMjAgfSwgeyAgNSwgIDUgfSwKKyAgICB7IDEzLCAxMyB9LCB7IDM1LCAzNSB9LCB7IDI4LCAyOCB9LCB7ICA2LCAgNiB9LAorICAgIHsgNDIsIDQyIH0sIHsgMjEsIDIxIH0sIHsgNDksIDQ5IH0sIHsgIDYsICA2IH0sCisgICAgeyAzNiwgMzYgfSwgeyAxNCwgMTQgfSwgeyAyOSwgMjkgfSwgeyA0MywgNDMgfSwKKyAgICB7ICA3LCAgNyB9LCB7IDUwLCA1MCB9LCB7IDIyLCAyMiB9LCB7IDE1LCAxNSB9LAorICAgIHsgMzcsIDM3IH0sIHsgNDQsIDQ0IH0sIHsgMzAsIDMwIH0sIHsgNTEsIDUxIH0sCisgICAgeyAyMywgMjMgfSwgeyAzOCwgMzggfSwgeyA0NSwgNDUgfSwgeyAzMSwgMzEgfSwKKyAgICB7IDUyLCA1MiB9LCB7IDM5LCAzOSB9LCB7IDUzLCA1MyB9LCB7IDQ2LCA0NiB9LAorICAgIHsgNTQsIDU0IH0sIHsgNDcsIDQ3IH0sIHsgNTUsIDU1IH0sIHsgIDAsICAwIH0sCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfZGVmYXVsdF9zY2FuXzE2eDE2X25iWzI1Nl1bMl0gPSB7CisgICAgeyAgIDAsICAgMCB9LCB7ICAgMCwgICAwIH0sIHsgICAxLCAgIDEgfSwgeyAgMTYsICAgMSB9LAorICAgIHsgIDE2LCAgMTYgfSwgeyAgIDIsICAgMiB9LCB7ICAxNywgICAyIH0sIHsgIDMyLCAgMTcgfSwKKyAgICB7ICAzMiwgIDMyIH0sIHsgICAzLCAgIDMgfSwgeyAgMzMsICAxOCB9LCB7ICAxOCwgICAzIH0sCisgICAgeyAgNDgsICAzMyB9LCB7ICAxOSwgICA0IH0sIHsgICA0LCAgIDQgfSwgeyAgMzQsICAxOSB9LAorICAgIHsgIDQ4LCAgNDggfSwgeyAgNDksICAzNCB9LCB7ICAzNSwgIDIwIH0sIHsgIDY0LCAgNDkgfSwKKyAgICB7ICAyMCwgICA1IH0sIHsgICA1LCAgIDUgfSwgeyAgNTAsICAzNSB9LCB7ICA2NCwgIDY0IH0sCisgICAgeyAgNjUsICA1MCB9LCB7ICAzNiwgIDIxIH0sIHsgIDIxLCAgIDYgfSwgeyAgNTEsICAzNiB9LAorICAgIHsgICA2LCAgIDYgfSwgeyAgODAsICA2NSB9LCB7ICA2NiwgIDUxIH0sIHsgIDM3LCAgMjIgfSwKKyAgICB7ICA4MSwgIDY2IH0sIHsgIDUyLCAgMzcgfSwgeyAgMjIsICAgNyB9LCB7ICA4MCwgIDgwIH0sCisgICAgeyAgNjcsICA1MiB9LCB7ICAgNywgICA3IH0sIHsgIDgyLCAgNjcgfSwgeyAgOTYsICA4MSB9LAorICAgIHsgIDUzLCAgMzggfSwgeyAgMzgsICAyMyB9LCB7ICA2OCwgIDUzIH0sIHsgIDk2LCAgOTYgfSwKKyAgICB7ICAyMywgICA4IH0sIHsgIDk3LCAgODIgfSwgeyAgODMsICA2OCB9LCB7ICA2OSwgIDU0IH0sCisgICAgeyAgNTQsICAzOSB9LCB7ICAgOCwgICA4IH0sIHsgIDM5LCAgMjQgfSwgeyAgODQsICA2OSB9LAorICAgIHsgIDk4LCAgODMgfSwgeyAxMTIsICA5NyB9LCB7IDExMiwgMTEyIH0sIHsgIDI0LCAgIDkgfSwKKyAgICB7IDExMywgIDk4IH0sIHsgIDk5LCAgODQgfSwgeyAgNzAsICA1NSB9LCB7ICA4NSwgIDcwIH0sCisgICAgeyAgNTUsICA0MCB9LCB7ICAgOSwgICA5IH0sIHsgIDQwLCAgMjUgfSwgeyAxMTQsICA5OSB9LAorICAgIHsgMTAwLCAgODUgfSwgeyAxMjgsIDExMyB9LCB7IDExNSwgMTAwIH0sIHsgIDcxLCAgNTYgfSwKKyAgICB7ICA4NiwgIDcxIH0sIHsgIDI1LCAgMTAgfSwgeyAxMjksIDExNCB9LCB7IDEyOCwgMTI4IH0sCisgICAgeyAxMDEsICA4NiB9LCB7ICA1NiwgIDQxIH0sIHsgIDEwLCAgMTAgfSwgeyAgNDEsICAyNiB9LAorICAgIHsgMTE2LCAxMDEgfSwgeyAxMzAsIDExNSB9LCB7IDE0NCwgMTI5IH0sIHsgIDg3LCAgNzIgfSwKKyAgICB7IDEwMiwgIDg3IH0sIHsgIDI2LCAgMTEgfSwgeyAgNzIsICA1NyB9LCB7IDEzMSwgMTE2IH0sCisgICAgeyAxMTcsIDEwMiB9LCB7IDE0NSwgMTMwIH0sIHsgIDU3LCAgNDIgfSwgeyAxNDQsIDE0NCB9LAorICAgIHsgIDExLCAgMTEgfSwgeyAgNDIsICAyNyB9LCB7IDEzMiwgMTE3IH0sIHsgMTQ2LCAxMzEgfSwKKyAgICB7IDEwMywgIDg4IH0sIHsgIDg4LCAgNzMgfSwgeyAxMTgsIDEwMyB9LCB7IDE2MCwgMTQ1IH0sCisgICAgeyAgNzMsICA1OCB9LCB7IDE0NywgMTMyIH0sIHsgMTMzLCAxMTggfSwgeyAgMjcsICAxMiB9LAorICAgIHsgMTYxLCAxNDYgfSwgeyAgNTgsICA0MyB9LCB7ICAxMiwgIDEyIH0sIHsgMTYwLCAxNjAgfSwKKyAgICB7IDExOSwgMTA0IH0sIHsgMTQ4LCAxMzMgfSwgeyAgODksICA3NCB9LCB7IDEzNCwgMTE5IH0sCisgICAgeyAxMDQsICA4OSB9LCB7IDE2MiwgMTQ3IH0sIHsgIDQzLCAgMjggfSwgeyAgNzQsICA1OSB9LAorICAgIHsgMTc2LCAxNjEgfSwgeyAxNjMsIDE0OCB9LCB7ICAyOCwgIDEzIH0sIHsgMTQ5LCAxMzQgfSwKKyAgICB7IDEyMCwgMTA1IH0sIHsgMTM1LCAxMjAgfSwgeyAxNzcsIDE2MiB9LCB7IDE2NCwgMTQ5IH0sCisgICAgeyAgMTMsICAxMyB9LCB7IDEwNSwgIDkwIH0sIHsgIDU5LCAgNDQgfSwgeyAgOTAsICA3NSB9LAorICAgIHsgMTUwLCAxMzUgfSwgeyAgNDQsICAyOSB9LCB7IDE3OCwgMTYzIH0sIHsgMTc2LCAxNzYgfSwKKyAgICB7IDEzNiwgMTIxIH0sIHsgMTY1LCAxNTAgfSwgeyAxMjEsIDEwNiB9LCB7ICA3NSwgIDYwIH0sCisgICAgeyAxNzksIDE2NCB9LCB7IDE1MSwgMTM2IH0sIHsgIDI5LCAgMTQgfSwgeyAgNjAsICA0NSB9LAorICAgIHsgIDE0LCAgMTQgfSwgeyAxMDYsICA5MSB9LCB7IDE2NiwgMTUxIH0sIHsgMTgwLCAxNjUgfSwKKyAgICB7IDE5MiwgMTc3IH0sIHsgIDkxLCAgNzYgfSwgeyAxOTIsIDE5MiB9LCB7ICA0NSwgIDMwIH0sCisgICAgeyAxMzcsIDEyMiB9LCB7IDEyMiwgMTA3IH0sIHsgMTUyLCAxMzcgfSwgeyAxOTMsIDE3OCB9LAorICAgIHsgIDc2LCAgNjEgfSwgeyAxNjcsIDE1MiB9LCB7IDE4MSwgMTY2IH0sIHsgIDMwLCAgMTUgfSwKKyAgICB7IDE5NCwgMTc5IH0sIHsgMjA4LCAxOTMgfSwgeyAxODIsIDE2NyB9LCB7IDEwNywgIDkyIH0sCisgICAgeyAxMzgsIDEyMyB9LCB7ICA2MSwgIDQ2IH0sIHsgMTUzLCAxMzggfSwgeyAgNDYsICAzMSB9LAorICAgIHsgMTk1LCAxODAgfSwgeyAgOTIsICA3NyB9LCB7IDE2OCwgMTUzIH0sIHsgMjA5LCAxOTQgfSwKKyAgICB7IDE5NiwgMTgxIH0sIHsgMjA4LCAyMDggfSwgeyAxMjMsIDEwOCB9LCB7IDE4MywgMTY4IH0sCisgICAgeyAyMTAsIDE5NSB9LCB7ICA3NywgIDYyIH0sIHsgMTA4LCAgOTMgfSwgeyAxNjksIDE1NCB9LAorICAgIHsgMTU0LCAxMzkgfSwgeyAgNjIsICA0NyB9LCB7IDE5NywgMTgyIH0sIHsgMjExLCAxOTYgfSwKKyAgICB7IDE4NCwgMTY5IH0sIHsgMjI0LCAyMDkgfSwgeyAyMjQsIDIyNCB9LCB7IDEzOSwgMTI0IH0sCisgICAgeyAgOTMsICA3OCB9LCB7IDE5OCwgMTgzIH0sIHsgMTI0LCAxMDkgfSwgeyAgNzgsICA2MyB9LAorICAgIHsgMjEyLCAxOTcgfSwgeyAyMjUsIDIxMCB9LCB7IDE3MCwgMTU1IH0sIHsgMTg1LCAxNzAgfSwKKyAgICB7IDE1NSwgMTQwIH0sIHsgMjEzLCAxOTggfSwgeyAxOTksIDE4NCB9LCB7IDEwOSwgIDk0IH0sCisgICAgeyAyMjYsIDIxMSB9LCB7IDE0MCwgMTI1IH0sIHsgIDk0LCAgNzkgfSwgeyAyNDAsIDIyNSB9LAorICAgIHsgMjE0LCAxOTkgfSwgeyAyMjcsIDIxMiB9LCB7IDIwMCwgMTg1IH0sIHsgMTI1LCAxMTAgfSwKKyAgICB7IDI0MSwgMjI2IH0sIHsgMTg2LCAxNzEgfSwgeyAxNzEsIDE1NiB9LCB7IDE1NiwgMTQxIH0sCisgICAgeyAyMjgsIDIxMyB9LCB7IDExMCwgIDk1IH0sIHsgMjE1LCAyMDAgfSwgeyAyNDIsIDIyNyB9LAorICAgIHsgMTQxLCAxMjYgfSwgeyAyMDEsIDE4NiB9LCB7IDIyOSwgMjE0IH0sIHsgMTI2LCAxMTEgfSwKKyAgICB7IDIxNiwgMjAxIH0sIHsgMjQzLCAyMjggfSwgeyAxNzIsIDE1NyB9LCB7IDE4NywgMTcyIH0sCisgICAgeyAyMzAsIDIxNSB9LCB7IDE1NywgMTQyIH0sIHsgMjAyLCAxODcgfSwgeyAxNDIsIDEyNyB9LAorICAgIHsgMjQ0LCAyMjkgfSwgeyAyMTcsIDIwMiB9LCB7IDIzMSwgMjE2IH0sIHsgMTg4LCAxNzMgfSwKKyAgICB7IDI0NSwgMjMwIH0sIHsgMTU4LCAxNDMgfSwgeyAxNzMsIDE1OCB9LCB7IDIzMiwgMjE3IH0sCisgICAgeyAyNDYsIDIzMSB9LCB7IDIxOCwgMjAzIH0sIHsgMjAzLCAxODggfSwgeyAxNzQsIDE1OSB9LAorICAgIHsgMTg5LCAxNzQgfSwgeyAyNDcsIDIzMiB9LCB7IDIzMywgMjE4IH0sIHsgMjA0LCAxODkgfSwKKyAgICB7IDIxOSwgMjA0IH0sIHsgMjQ4LCAyMzMgfSwgeyAxOTAsIDE3NSB9LCB7IDIzNCwgMjE5IH0sCisgICAgeyAyMjAsIDIwNSB9LCB7IDI0OSwgMjM0IH0sIHsgMjA1LCAxOTAgfSwgeyAyMjEsIDIwNiB9LAorICAgIHsgMjUwLCAyMzUgfSwgeyAyMzUsIDIyMCB9LCB7IDIwNiwgMTkxIH0sIHsgMjM2LCAyMjEgfSwKKyAgICB7IDIyMiwgMjA3IH0sIHsgMjUxLCAyMzYgfSwgeyAyMzcsIDIyMiB9LCB7IDI1MiwgMjM3IH0sCisgICAgeyAyMzgsIDIyMyB9LCB7IDI1MywgMjM4IH0sIHsgMjU0LCAyMzkgfSwgeyAgIDAsICAgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2NvbF9zY2FuXzE2eDE2X25iWzI1Nl1bMl0gPSB7CisgICAgeyAgIDAsICAgMCB9LCB7ICAgMSwgICAxIH0sIHsgICAyLCAgIDIgfSwgeyAgIDAsICAgMCB9LAorICAgIHsgICAzLCAgIDMgfSwgeyAgMTYsICAxNiB9LCB7ICAgNCwgICA0IH0sIHsgIDE3LCAgMTcgfSwKKyAgICB7ICAgNSwgICA1IH0sIHsgIDE4LCAgMTggfSwgeyAgMTYsICAxNiB9LCB7ICAxOSwgIDE5IH0sCisgICAgeyAgIDYsICAgNiB9LCB7ICAzMiwgIDMyIH0sIHsgIDIwLCAgMjAgfSwgeyAgMzMsICAzMyB9LAorICAgIHsgICA3LCAgIDcgfSwgeyAgMzQsICAzNCB9LCB7ICAyMSwgIDIxIH0sIHsgIDMyLCAgMzIgfSwKKyAgICB7ICAzNSwgIDM1IH0sIHsgICA4LCAgIDggfSwgeyAgNDgsICA0OCB9LCB7ICAyMiwgIDIyIH0sCisgICAgeyAgNDksICA0OSB9LCB7ICAzNiwgIDM2IH0sIHsgICA5LCAgIDkgfSwgeyAgMzcsICAzNyB9LAorICAgIHsgIDUwLCAgNTAgfSwgeyAgMjMsICAyMyB9LCB7ICA0OCwgIDQ4IH0sIHsgIDUxLCAgNTEgfSwKKyAgICB7ICAxMCwgIDEwIH0sIHsgIDY0LCAgNjQgfSwgeyAgMzgsICAzOCB9LCB7ICAyNCwgIDI0IH0sCisgICAgeyAgNTIsICA1MiB9LCB7ICA2NSwgIDY1IH0sIHsgIDUzLCAgNTMgfSwgeyAgMzksICAzOSB9LAorICAgIHsgIDY2LCAgNjYgfSwgeyAgMTEsICAxMSB9LCB7ICA2NCwgIDY0IH0sIHsgIDI1LCAgMjUgfSwKKyAgICB7ICA2NywgIDY3IH0sIHsgIDU0LCAgNTQgfSwgeyAgODAsICA4MCB9LCB7ICA0MCwgIDQwIH0sCisgICAgeyAgNjgsICA2OCB9LCB7ICAxMiwgIDEyIH0sIHsgIDI2LCAgMjYgfSwgeyAgODEsICA4MSB9LAorICAgIHsgIDU1LCAgNTUgfSwgeyAgNjksICA2OSB9LCB7ICA4MiwgIDgyIH0sIHsgIDQxLCAgNDEgfSwKKyAgICB7ICAxMywgIDEzIH0sIHsgIDgzLCAgODMgfSwgeyAgODAsICA4MCB9LCB7ICA3MCwgIDcwIH0sCisgICAgeyAgMjcsICAyNyB9LCB7ICA1NiwgIDU2IH0sIHsgIDg0LCAgODQgfSwgeyAgOTYsICA5NiB9LAorICAgIHsgIDE0LCAgMTQgfSwgeyAgNzEsICA3MSB9LCB7ICA5NywgIDk3IH0sIHsgIDQyLCAgNDIgfSwKKyAgICB7ICA4NSwgIDg1IH0sIHsgIDU3LCAgNTcgfSwgeyAgOTgsICA5OCB9LCB7ICAyOCwgIDI4IH0sCisgICAgeyAgODYsICA4NiB9LCB7ICA5OSwgIDk5IH0sIHsgIDk2LCAgOTYgfSwgeyAgNzIsICA3MiB9LAorICAgIHsgIDQzLCAgNDMgfSwgeyAxMDAsIDEwMCB9LCB7ICA1OCwgIDU4IH0sIHsgIDI5LCAgMjkgfSwKKyAgICB7IDExMiwgMTEyIH0sIHsgIDg3LCAgODcgfSwgeyAxMTMsIDExMyB9LCB7ICA3MywgIDczIH0sCisgICAgeyAxMTIsIDExMiB9LCB7IDEwMSwgMTAxIH0sIHsgIDQ0LCAgNDQgfSwgeyAgMzAsICAzMCB9LAorICAgIHsgMTE0LCAxMTQgfSwgeyAgNTksICA1OSB9LCB7IDEwMiwgMTAyIH0sIHsgIDg4LCAgODggfSwKKyAgICB7IDExNSwgMTE1IH0sIHsgIDc0LCAgNzQgfSwgeyAxMjgsIDEyOCB9LCB7IDExNiwgMTE2IH0sCisgICAgeyAgNDUsICA0NSB9LCB7IDEwMywgMTAzIH0sIHsgIDg5LCAgODkgfSwgeyAgNjAsICA2MCB9LAorICAgIHsgMTI5LCAxMjkgfSwgeyAxMTcsIDExNyB9LCB7IDEzMCwgMTMwIH0sIHsgMTMxLCAxMzEgfSwKKyAgICB7IDEwNCwgMTA0IH0sIHsgIDc1LCAgNzUgfSwgeyAgNDYsICA0NiB9LCB7IDExOCwgMTE4IH0sCisgICAgeyAxMjgsIDEyOCB9LCB7ICA5MCwgIDkwIH0sIHsgIDYxLCAgNjEgfSwgeyAxMzIsIDEzMiB9LAorICAgIHsgMTA1LCAxMDUgfSwgeyAxNDQsIDE0NCB9LCB7IDExOSwgMTE5IH0sIHsgMTQ1LCAxNDUgfSwKKyAgICB7IDEzMywgMTMzIH0sIHsgIDc2LCAgNzYgfSwgeyAxNDYsIDE0NiB9LCB7IDEyMCwgMTIwIH0sCisgICAgeyAgOTEsICA5MSB9LCB7IDEzNCwgMTM0IH0sIHsgMTQ3LCAxNDcgfSwgeyAgNjIsICA2MiB9LAorICAgIHsgMTA2LCAxMDYgfSwgeyAxMzUsIDEzNSB9LCB7IDEyMSwgMTIxIH0sIHsgIDkyLCAgOTIgfSwKKyAgICB7IDE0OCwgMTQ4IH0sIHsgMTQ0LCAxNDQgfSwgeyAgNzcsICA3NyB9LCB7IDE0OSwgMTQ5IH0sCisgICAgeyAxMzYsIDEzNiB9LCB7IDEwNywgMTA3IH0sIHsgMTYwLCAxNjAgfSwgeyAxNjEsIDE2MSB9LAorICAgIHsgMTUwLCAxNTAgfSwgeyAxMjIsIDEyMiB9LCB7ICA3OCwgIDc4IH0sIHsgMTM3LCAxMzcgfSwKKyAgICB7IDE2MiwgMTYyIH0sIHsgMTUxLCAxNTEgfSwgeyAgOTMsICA5MyB9LCB7IDE2MywgMTYzIH0sCisgICAgeyAxMDgsIDEwOCB9LCB7IDE2NCwgMTY0IH0sIHsgMTUyLCAxNTIgfSwgeyAxMjMsIDEyMyB9LAorICAgIHsgMTM4LCAxMzggfSwgeyAxNjAsIDE2MCB9LCB7IDE2NSwgMTY1IH0sIHsgIDk0LCAgOTQgfSwKKyAgICB7IDE3NiwgMTc2IH0sIHsgMTY2LCAxNjYgfSwgeyAxMDksIDEwOSB9LCB7IDE1MywgMTUzIH0sCisgICAgeyAxNzcsIDE3NyB9LCB7IDEyNCwgMTI0IH0sIHsgMTc4LCAxNzggfSwgeyAxMzksIDEzOSB9LAorICAgIHsgMTY3LCAxNjcgfSwgeyAxNTQsIDE1NCB9LCB7IDExMCwgMTEwIH0sIHsgMTc5LCAxNzkgfSwKKyAgICB7IDE3NiwgMTc2IH0sIHsgMTgwLCAxODAgfSwgeyAxNjgsIDE2OCB9LCB7IDE0MCwgMTQwIH0sCisgICAgeyAxMjUsIDEyNSB9LCB7IDE4MSwgMTgxIH0sIHsgMTkyLCAxOTIgfSwgeyAxOTMsIDE5MyB9LAorICAgIHsgMTU1LCAxNTUgfSwgeyAxODIsIDE4MiB9LCB7IDE2OSwgMTY5IH0sIHsgMTk0LCAxOTQgfSwKKyAgICB7IDEyNiwgMTI2IH0sIHsgMTQxLCAxNDEgfSwgeyAxOTUsIDE5NSB9LCB7IDE4MywgMTgzIH0sCisgICAgeyAxOTIsIDE5MiB9LCB7IDE5NiwgMTk2IH0sIHsgMTU2LCAxNTYgfSwgeyAxNzAsIDE3MCB9LAorICAgIHsgMTQyLCAxNDIgfSwgeyAxODQsIDE4NCB9LCB7IDE5NywgMTk3IH0sIHsgMjA4LCAyMDggfSwKKyAgICB7IDE5OCwgMTk4IH0sIHsgMjA5LCAyMDkgfSwgeyAxNzEsIDE3MSB9LCB7IDE1NywgMTU3IH0sCisgICAgeyAxODUsIDE4NSB9LCB7IDIxMCwgMjEwIH0sIHsgMjA4LCAyMDggfSwgeyAyMTEsIDIxMSB9LAorICAgIHsgMTk5LCAxOTkgfSwgeyAyMjQsIDIyNCB9LCB7IDE1OCwgMTU4IH0sIHsgMjEyLCAyMTIgfSwKKyAgICB7IDIyNCwgMjI0IH0sIHsgMTg2LCAxODYgfSwgeyAyMDAsIDIwMCB9LCB7IDE3MiwgMTcyIH0sCisgICAgeyAyMjUsIDIyNSB9LCB7IDIxMywgMjEzIH0sIHsgMjE0LCAyMTQgfSwgeyAyMjYsIDIyNiB9LAorICAgIHsgMjAxLCAyMDEgfSwgeyAyMjcsIDIyNyB9LCB7IDE4NywgMTg3IH0sIHsgMjQwLCAyNDAgfSwKKyAgICB7IDIxNSwgMjE1IH0sIHsgMTczLCAxNzMgfSwgeyAyMjgsIDIyOCB9LCB7IDI0MSwgMjQxIH0sCisgICAgeyAyMDIsIDIwMiB9LCB7IDI0MiwgMjQyIH0sIHsgMjE2LCAyMTYgfSwgeyAyMjksIDIyOSB9LAorICAgIHsgMTc0LCAxNzQgfSwgeyAxODgsIDE4OCB9LCB7IDI0MywgMjQzIH0sIHsgMjMwLCAyMzAgfSwKKyAgICB7IDIwMywgMjAzIH0sIHsgMjE3LCAyMTcgfSwgeyAyMzEsIDIzMSB9LCB7IDI0NCwgMjQ0IH0sCisgICAgeyAyMTgsIDIxOCB9LCB7IDI0NSwgMjQ1IH0sIHsgMTg5LCAxODkgfSwgeyAyMzIsIDIzMiB9LAorICAgIHsgMjA0LCAyMDQgfSwgeyAxOTAsIDE5MCB9LCB7IDI0NiwgMjQ2IH0sIHsgMjMzLCAyMzMgfSwKKyAgICB7IDI0NywgMjQ3IH0sIHsgMjE5LCAyMTkgfSwgeyAyMDUsIDIwNSB9LCB7IDI0OCwgMjQ4IH0sCisgICAgeyAyMzQsIDIzNCB9LCB7IDIyMCwgMjIwIH0sIHsgMjA2LCAyMDYgfSwgeyAyNDksIDI0OSB9LAorICAgIHsgMjM1LCAyMzUgfSwgeyAyMjEsIDIyMSB9LCB7IDI1MCwgMjUwIH0sIHsgMjIyLCAyMjIgfSwKKyAgICB7IDIzNiwgMjM2IH0sIHsgMjM3LCAyMzcgfSwgeyAyNTEsIDI1MSB9LCB7IDIzOCwgMjM4IH0sCisgICAgeyAyNTIsIDI1MiB9LCB7IDI1MywgMjUzIH0sIHsgMjU0LCAyNTQgfSwgeyAgIDAsICAgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X3Jvd19zY2FuXzE2eDE2X25iWzI1Nl1bMl0gPSB7CisgICAgeyAgIDAsICAgMCB9LCB7ICAxNiwgIDE2IH0sIHsgICAwLCAgIDAgfSwgeyAgMzIsICAzMiB9LAorICAgIHsgICAxLCAgIDEgfSwgeyAgNDgsICA0OCB9LCB7ICAxNywgIDE3IH0sIHsgICAxLCAgIDEgfSwKKyAgICB7ICA2NCwgIDY0IH0sIHsgICAyLCAgIDIgfSwgeyAgMzMsICAzMyB9LCB7ICA4MCwgIDgwIH0sCisgICAgeyAgMTgsICAxOCB9LCB7ICAgMiwgICAyIH0sIHsgIDQ5LCAgNDkgfSwgeyAgIDMsICAgMyB9LAorICAgIHsgIDk2LCAgOTYgfSwgeyAgMzQsICAzNCB9LCB7ICA2NSwgIDY1IH0sIHsgIDE5LCAgMTkgfSwKKyAgICB7ICAgMywgICAzIH0sIHsgMTEyLCAxMTIgfSwgeyAgNTAsICA1MCB9LCB7ICAgNCwgICA0IH0sCisgICAgeyAgODEsICA4MSB9LCB7ICAzNSwgIDM1IH0sIHsgIDY2LCAgNjYgfSwgeyAgIDQsICAgNCB9LAorICAgIHsgMTI4LCAxMjggfSwgeyAgMjAsICAyMCB9LCB7ICA1MSwgIDUxIH0sIHsgIDk3LCAgOTcgfSwKKyAgICB7ICA4MiwgIDgyIH0sIHsgICA1LCAgIDUgfSwgeyAgMzYsICAzNiB9LCB7IDE0NCwgMTQ0IH0sCisgICAgeyAgNjcsICA2NyB9LCB7IDExMywgMTEzIH0sIHsgIDIxLCAgMjEgfSwgeyAgNTIsICA1MiB9LAorICAgIHsgICA1LCAgIDUgfSwgeyAgOTgsICA5OCB9LCB7IDE2MCwgMTYwIH0sIHsgIDgzLCAgODMgfSwKKyAgICB7ICAzNywgIDM3IH0sIHsgICA2LCAgIDYgfSwgeyAgNjgsICA2OCB9LCB7IDEyOSwgMTI5IH0sCisgICAgeyAgMjIsICAyMiB9LCB7ICA1MywgIDUzIH0sIHsgMTE0LCAxMTQgfSwgeyAgIDYsICAgNiB9LAorICAgIHsgIDk5LCAgOTkgfSwgeyAxNzYsIDE3NiB9LCB7ICA4NCwgIDg0IH0sIHsgIDM4LCAgMzggfSwKKyAgICB7ICAgNywgICA3IH0sIHsgIDY5LCAgNjkgfSwgeyAxNDUsIDE0NSB9LCB7IDEzMCwgMTMwIH0sCisgICAgeyAxMTUsIDExNSB9LCB7ICAyMywgIDIzIH0sIHsgIDU0LCAgNTQgfSwgeyAxOTIsIDE5MiB9LAorICAgIHsgMTAwLCAxMDAgfSwgeyAgIDcsICAgNyB9LCB7ICA4NSwgIDg1IH0sIHsgMTYxLCAxNjEgfSwKKyAgICB7ICAzOSwgIDM5IH0sIHsgIDcwLCAgNzAgfSwgeyAgIDgsICAgOCB9LCB7IDE0NiwgMTQ2IH0sCisgICAgeyAxMzEsIDEzMSB9LCB7IDExNiwgMTE2IH0sIHsgIDU1LCAgNTUgfSwgeyAyMDgsIDIwOCB9LAorICAgIHsgMTAxLCAxMDEgfSwgeyAgMjQsICAyNCB9LCB7ICA4NiwgIDg2IH0sIHsgICA4LCAgIDggfSwKKyAgICB7IDEzMiwgMTMyIH0sIHsgIDQwLCAgNDAgfSwgeyAgNzEsICA3MSB9LCB7IDE3NywgMTc3IH0sCisgICAgeyAxNDcsIDE0NyB9LCB7IDIyNCwgMjI0IH0sIHsgMTE3LCAxMTcgfSwgeyAxNjIsIDE2MiB9LAorICAgIHsgICA5LCAgIDkgfSwgeyAxMDIsIDEwMiB9LCB7ICA1NiwgIDU2IH0sIHsgIDI1LCAgMjUgfSwKKyAgICB7ICA4NywgIDg3IH0sIHsgMTQ4LCAxNDggfSwgeyAgIDksICAgOSB9LCB7IDEzMywgMTMzIH0sCisgICAgeyAgNzIsICA3MiB9LCB7IDExOCwgMTE4IH0sIHsgMTkzLCAxOTMgfSwgeyAxNjMsIDE2MyB9LAorICAgIHsgIDQxLCAgNDEgfSwgeyAxMDMsIDEwMyB9LCB7IDE3OCwgMTc4IH0sIHsgIDEwLCAgMTAgfSwKKyAgICB7ICA1NywgIDU3IH0sIHsgMTQ5LCAxNDkgfSwgeyAxMzQsIDEzNCB9LCB7ICA4OCwgIDg4IH0sCisgICAgeyAgMjYsICAyNiB9LCB7IDExOSwgMTE5IH0sIHsgIDEwLCAgMTAgfSwgeyAxNjQsIDE2NCB9LAorICAgIHsgMTA0LCAxMDQgfSwgeyAgNzMsICA3MyB9LCB7IDIwOSwgMjA5IH0sIHsgMTc5LCAxNzkgfSwKKyAgICB7ICA0MiwgIDQyIH0sIHsgIDExLCAgMTEgfSwgeyAxOTQsIDE5NCB9LCB7IDEzNSwgMTM1IH0sCisgICAgeyAxNjUsIDE2NSB9LCB7IDE1MCwgMTUwIH0sIHsgIDU4LCAgNTggfSwgeyAgMjcsICAyNyB9LAorICAgIHsgIDg5LCAgODkgfSwgeyAgMTEsICAxMSB9LCB7IDEyMCwgMTIwIH0sIHsgIDc0LCAgNzQgfSwKKyAgICB7ICA0MywgIDQzIH0sIHsgMjI1LCAyMjUgfSwgeyAxMDUsIDEwNSB9LCB7ICAxMiwgIDEyIH0sCisgICAgeyAxODAsIDE4MCB9LCB7IDE1MSwgMTUxIH0sIHsgMTk1LCAxOTUgfSwgeyAxMzYsIDEzNiB9LAorICAgIHsgIDI4LCAgMjggfSwgeyAxNjYsIDE2NiB9LCB7IDEyMSwgMTIxIH0sIHsgIDU5LCAgNTkgfSwKKyAgICB7ICAxMiwgIDEyIH0sIHsgMjEwLCAyMTAgfSwgeyAgOTAsICA5MCB9LCB7IDEwNiwgMTA2IH0sCisgICAgeyAgNDQsICA0NCB9LCB7IDE4MSwgMTgxIH0sIHsgIDc1LCAgNzUgfSwgeyAxNTIsIDE1MiB9LAorICAgIHsgIDEzLCAgMTMgfSwgeyAxNjcsIDE2NyB9LCB7IDEzNywgMTM3IH0sIHsgIDEzLCAgMTMgfSwKKyAgICB7ICA2MCwgIDYwIH0sIHsgMTk2LCAxOTYgfSwgeyAxMjIsIDEyMiB9LCB7ICAyOSwgIDI5IH0sCisgICAgeyAgOTEsICA5MSB9LCB7ICAxNCwgIDE0IH0sIHsgMTgyLCAxODIgfSwgeyAgNzYsICA3NiB9LAorICAgIHsgMjExLCAyMTEgfSwgeyAxNTMsIDE1MyB9LCB7ICAxNCwgIDE0IH0sIHsgMTA3LCAxMDcgfSwKKyAgICB7IDEzOCwgMTM4IH0sIHsgIDQ1LCAgNDUgfSwgeyAyMjYsIDIyNiB9LCB7IDE2OCwgMTY4IH0sCisgICAgeyAxOTcsIDE5NyB9LCB7IDEyMywgMTIzIH0sIHsgIDMwLCAgMzAgfSwgeyAgNjEsICA2MSB9LAorICAgIHsgIDE1LCAgMTUgfSwgeyAgOTIsICA5MiB9LCB7IDE1NCwgMTU0IH0sIHsgMTgzLCAxODMgfSwKKyAgICB7IDE2OSwgMTY5IH0sIHsgMTA4LCAxMDggfSwgeyAyMTIsIDIxMiB9LCB7ICA3NywgIDc3IH0sCisgICAgeyAxMzksIDEzOSB9LCB7IDE5OCwgMTk4IH0sIHsgIDQ2LCAgNDYgfSwgeyAxMjQsIDEyNCB9LAorICAgIHsgMjI3LCAyMjcgfSwgeyAgNjIsICA2MiB9LCB7ICAzMSwgIDMxIH0sIHsgMTg0LCAxODQgfSwKKyAgICB7ICA5MywgIDkzIH0sIHsgMTcwLCAxNzAgfSwgeyAxNTUsIDE1NSB9LCB7IDE4NSwgMTg1IH0sCisgICAgeyAgNzgsICA3OCB9LCB7ICA0NywgIDQ3IH0sIHsgMTk5LCAxOTkgfSwgeyAyMTMsIDIxMyB9LAorICAgIHsgMTQwLCAxNDAgfSwgeyAgNjMsICA2MyB9LCB7IDEwOSwgMTA5IH0sIHsgMTI1LCAxMjUgfSwKKyAgICB7ICA5NCwgIDk0IH0sIHsgMjAwLCAyMDAgfSwgeyAxNzEsIDE3MSB9LCB7IDE1NiwgMTU2IH0sCisgICAgeyAyMjgsIDIyOCB9LCB7IDE4NiwgMTg2IH0sIHsgMjE0LCAyMTQgfSwgeyAyMDEsIDIwMSB9LAorICAgIHsgIDc5LCAgNzkgfSwgeyAxNDEsIDE0MSB9LCB7IDExMCwgMTEwIH0sIHsgMjI5LCAyMjkgfSwKKyAgICB7ICA5NSwgIDk1IH0sIHsgMTI2LCAxMjYgfSwgeyAyMTUsIDIxNSB9LCB7IDE3MiwgMTcyIH0sCisgICAgeyAxMTEsIDExMSB9LCB7IDE0MiwgMTQyIH0sIHsgMjAyLCAyMDIgfSwgeyAxNTcsIDE1NyB9LAorICAgIHsgMjE2LCAyMTYgfSwgeyAyMzAsIDIzMCB9LCB7IDIxNywgMjE3IH0sIHsgMTg3LCAxODcgfSwKKyAgICB7IDEyNywgMTI3IH0sIHsgMjMxLCAyMzEgfSwgeyAxNTgsIDE1OCB9LCB7IDE3MywgMTczIH0sCisgICAgeyAxNDMsIDE0MyB9LCB7IDIwMywgMjAzIH0sIHsgMTg4LCAxODggfSwgeyAyMzIsIDIzMiB9LAorICAgIHsgMjE4LCAyMTggfSwgeyAyMzMsIDIzMyB9LCB7IDE1OSwgMTU5IH0sIHsgMTc0LCAxNzQgfSwKKyAgICB7IDIwNCwgMjA0IH0sIHsgMTg5LCAxODkgfSwgeyAyMzQsIDIzNCB9LCB7IDIxOSwgMjE5IH0sCisgICAgeyAxNzUsIDE3NSB9LCB7IDIwNSwgMjA1IH0sIHsgMjM1LCAyMzUgfSwgeyAyMjAsIDIyMCB9LAorICAgIHsgMTkwLCAxOTAgfSwgeyAyMzYsIDIzNiB9LCB7IDIwNiwgMjA2IH0sIHsgMTkxLCAxOTEgfSwKKyAgICB7IDIyMSwgMjIxIH0sIHsgMjA3LCAyMDcgfSwgeyAyMzcsIDIzNyB9LCB7IDIyMiwgMjIyIH0sCisgICAgeyAyMzgsIDIzOCB9LCB7IDIyMywgMjIzIH0sIHsgMjM5LCAyMzkgfSwgeyAgIDAsICAgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2RlZmF1bHRfc2Nhbl8zMngzMl9uYlsxMDI0XVsyXSA9IHsKKyAgICB7ICAgIDAsICAgIDAgfSwgeyAgICAwLCAgICAwIH0sIHsgICAgMSwgICAgMSB9LCB7ICAgMzIsICAgIDEgfSwKKyAgICB7ICAgMzIsICAgMzIgfSwgeyAgICAyLCAgICAyIH0sIHsgICAzMywgICAgMiB9LCB7ICAgNjQsICAgMzMgfSwKKyAgICB7ICAgIDMsICAgIDMgfSwgeyAgIDY0LCAgIDY0IH0sIHsgICAzNCwgICAgMyB9LCB7ICAgNjUsICAgMzQgfSwKKyAgICB7ICAgIDQsICAgIDQgfSwgeyAgIDM1LCAgICA0IH0sIHsgICA5NiwgICA2NSB9LCB7ICAgNjYsICAgMzUgfSwKKyAgICB7ICAgOTYsICAgOTYgfSwgeyAgIDk3LCAgIDY2IH0sIHsgICA2NywgICAzNiB9LCB7ICAgMzYsICAgIDUgfSwKKyAgICB7ICAgIDUsICAgIDUgfSwgeyAgMTI4LCAgIDk3IH0sIHsgICA5OCwgICA2NyB9LCB7ICAgIDYsICAgIDYgfSwKKyAgICB7ICAxMjgsICAxMjggfSwgeyAgIDY4LCAgIDM3IH0sIHsgICAzNywgICAgNiB9LCB7ICAxMjksICAgOTggfSwKKyAgICB7ICAgOTksICAgNjggfSwgeyAgMTYwLCAgMTI5IH0sIHsgIDEzMCwgICA5OSB9LCB7ICAgMzgsICAgIDcgfSwKKyAgICB7ICAgNjksICAgMzggfSwgeyAgICA3LCAgICA3IH0sIHsgIDEwMCwgICA2OSB9LCB7ICAxNjEsICAxMzAgfSwKKyAgICB7ICAxMzEsICAxMDAgfSwgeyAgMTYwLCAgMTYwIH0sIHsgICA3MCwgICAzOSB9LCB7ICAgMzksICAgIDggfSwKKyAgICB7ICAgIDgsICAgIDggfSwgeyAgMTAxLCAgIDcwIH0sIHsgIDE2MiwgIDEzMSB9LCB7ICAxMzIsICAxMDEgfSwKKyAgICB7ICAxOTIsICAxNjEgfSwgeyAgIDcxLCAgIDQwIH0sIHsgIDE5MiwgIDE5MiB9LCB7ICAxMDIsICAgNzEgfSwKKyAgICB7ICAgNDAsICAgIDkgfSwgeyAgMTYzLCAgMTMyIH0sIHsgICAgOSwgICAgOSB9LCB7ICAxOTMsICAxNjIgfSwKKyAgICB7ICAxMzMsICAxMDIgfSwgeyAgMTY0LCAgMTMzIH0sIHsgICA3MiwgICA0MSB9LCB7ICAxMDMsICAgNzIgfSwKKyAgICB7ICAxMzQsICAxMDMgfSwgeyAgMjI0LCAgMTkzIH0sIHsgICA0MSwgICAxMCB9LCB7ICAxOTQsICAxNjMgfSwKKyAgICB7ICAgMTAsICAgMTAgfSwgeyAgMjI0LCAgMjI0IH0sIHsgIDE2NSwgIDEzNCB9LCB7ICAyMjUsICAxOTQgfSwKKyAgICB7ICAxOTUsICAxNjQgfSwgeyAgIDczLCAgIDQyIH0sIHsgIDEwNCwgICA3MyB9LCB7ICAxMzUsICAxMDQgfSwKKyAgICB7ICAgNDIsICAgMTEgfSwgeyAgIDExLCAgIDExIH0sIHsgIDE2NiwgIDEzNSB9LCB7ICAxOTYsICAxNjUgfSwKKyAgICB7ICAyMjYsICAxOTUgfSwgeyAgMjU2LCAgMjI1IH0sIHsgICA3NCwgICA0MyB9LCB7ICAxMDUsICAgNzQgfSwKKyAgICB7ICAxMzYsICAxMDUgfSwgeyAgMjI3LCAgMTk2IH0sIHsgICA0MywgICAxMiB9LCB7ICAxOTcsICAxNjYgfSwKKyAgICB7ICAxNjcsICAxMzYgfSwgeyAgMjU3LCAgMjI2IH0sIHsgIDI1NiwgIDI1NiB9LCB7ICAgMTIsICAgMTIgfSwKKyAgICB7ICAyMjgsICAxOTcgfSwgeyAgIDc1LCAgIDQ0IH0sIHsgIDEwNiwgICA3NSB9LCB7ICAxOTgsICAxNjcgfSwKKyAgICB7ICAxMzcsICAxMDYgfSwgeyAgMjU4LCAgMjI3IH0sIHsgIDE2OCwgIDEzNyB9LCB7ICAyODgsICAyNTcgfSwKKyAgICB7ICAgNDQsICAgMTMgfSwgeyAgMjI5LCAgMTk4IH0sIHsgIDI1OSwgIDIyOCB9LCB7ICAxOTksICAxNjggfSwKKyAgICB7ICAxMDcsICAgNzYgfSwgeyAgIDEzLCAgIDEzIH0sIHsgIDE2OSwgIDEzOCB9LCB7ICAxMzgsICAxMDcgfSwKKyAgICB7ICAyODgsICAyODggfSwgeyAgMjg5LCAgMjU4IH0sIHsgICA3NiwgICA0NSB9LCB7ICAyMzAsICAxOTkgfSwKKyAgICB7ICAyNjAsICAyMjkgfSwgeyAgIDQ1LCAgIDE0IH0sIHsgIDIwMCwgIDE2OSB9LCB7ICAxMzksICAxMDggfSwKKyAgICB7ICAyOTAsICAyNTkgfSwgeyAgMTA4LCAgIDc3IH0sIHsgIDIzMSwgIDIwMCB9LCB7ICAzMjAsICAyODkgfSwKKyAgICB7ICAyNjEsICAyMzAgfSwgeyAgMTcwLCAgMTM5IH0sIHsgICA3NywgICA0NiB9LCB7ICAyOTEsICAyNjAgfSwKKyAgICB7ICAgMTQsICAgMTQgfSwgeyAgMzIxLCAgMjkwIH0sIHsgIDIwMSwgIDE3MCB9LCB7ICAyNjIsICAyMzEgfSwKKyAgICB7ICAzMjAsICAzMjAgfSwgeyAgMTcxLCAgMTQwIH0sIHsgIDI5MiwgIDI2MSB9LCB7ICAyMzIsICAyMDEgfSwKKyAgICB7ICAxNDAsICAxMDkgfSwgeyAgMzIyLCAgMjkxIH0sIHsgIDEwOSwgICA3OCB9LCB7ICAgNDYsICAgMTUgfSwKKyAgICB7ICAyMDIsICAxNzEgfSwgeyAgMjYzLCAgMjMyIH0sIHsgIDIzMywgIDIwMiB9LCB7ICAyOTMsICAyNjIgfSwKKyAgICB7ICAzNTIsICAzMjEgfSwgeyAgMzIzLCAgMjkyIH0sIHsgICAxNSwgICAxNSB9LCB7ICAgNzgsICAgNDcgfSwKKyAgICB7ICAyMDMsICAxNzIgfSwgeyAgMjY0LCAgMjMzIH0sIHsgIDI5NCwgIDI2MyB9LCB7ICAzMjQsICAyOTMgfSwKKyAgICB7ICAxNzIsICAxNDEgfSwgeyAgMzUzLCAgMzIyIH0sIHsgIDE0MSwgIDExMCB9LCB7ICAyMzQsICAyMDMgfSwKKyAgICB7ICAzNTIsICAzNTIgfSwgeyAgIDQ3LCAgIDE2IH0sIHsgIDI5NSwgIDI2NCB9LCB7ICAxMTAsICAgNzkgfSwKKyAgICB7ICAyNjUsICAyMzQgfSwgeyAgMzU0LCAgMzIzIH0sIHsgIDMyNSwgIDI5NCB9LCB7ICAgNzksICAgNDggfSwKKyAgICB7ICAgMTYsICAgMTYgfSwgeyAgMjA0LCAgMTczIH0sIHsgIDIzNSwgIDIwNCB9LCB7ICAxNzMsICAxNDIgfSwKKyAgICB7ICAzNTUsICAzMjQgfSwgeyAgMzg0LCAgMzUzIH0sIHsgIDMyNiwgIDI5NSB9LCB7ICAxNDIsICAxMTEgfSwKKyAgICB7ICAyOTYsICAyNjUgfSwgeyAgMjY2LCAgMjM1IH0sIHsgIDM1NiwgIDMyNSB9LCB7ICAzODUsICAzNTQgfSwKKyAgICB7ICAxMTEsICAgODAgfSwgeyAgIDQ4LCAgIDE3IH0sIHsgIDMyNywgIDI5NiB9LCB7ICAyOTcsICAyNjYgfSwKKyAgICB7ICAyMDUsICAxNzQgfSwgeyAgMzg0LCAgMzg0IH0sIHsgIDIzNiwgIDIwNSB9LCB7ICAzNTcsICAzMjYgfSwKKyAgICB7ICAzODYsICAzNTUgfSwgeyAgIDgwLCAgIDQ5IH0sIHsgIDE3NCwgIDE0MyB9LCB7ICAgMTcsICAgMTcgfSwKKyAgICB7ICAzMjgsICAyOTcgfSwgeyAgMzU4LCAgMzI3IH0sIHsgIDM4NywgIDM1NiB9LCB7ICAyOTgsICAyNjcgfSwKKyAgICB7ICAzMjksICAyOTggfSwgeyAgMzg4LCAgMzU3IH0sIHsgIDExMiwgICA4MSB9LCB7ICA0MTYsICAzODUgfSwKKyAgICB7ICAyMzcsICAyMDYgfSwgeyAgMzU5LCAgMzI4IH0sIHsgICA0OSwgICAxOCB9LCB7ICAyMDYsICAxNzUgfSwKKyAgICB7ICA0MTcsICAzODYgfSwgeyAgMzg5LCAgMzU4IH0sIHsgIDMzMCwgIDI5OSB9LCB7ICAgMTgsICAgMTggfSwKKyAgICB7ICA0MTYsICA0MTYgfSwgeyAgMzYwLCAgMzI5IH0sIHsgICA4MSwgICA1MCB9LCB7ICA0MTgsICAzODcgfSwKKyAgICB7ICAzOTAsICAzNTkgfSwgeyAgMjM4LCAgMjA3IH0sIHsgICA1MCwgICAxOSB9LCB7ICAzNjEsICAzMzAgfSwKKyAgICB7ICA0MTksICAzODggfSwgeyAgMTEzLCAgIDgyIH0sIHsgIDQ0OCwgIDQxNyB9LCB7ICA0NDgsICA0NDggfSwKKyAgICB7ICA0MjAsICAzODkgfSwgeyAgIDgyLCAgIDUxIH0sIHsgIDM2MiwgIDMzMSB9LCB7ICA0NDksICA0MTggfSwKKyAgICB7ICA0MjEsICAzOTAgfSwgeyAgNDgwLCAgNDgwIH0sIHsgIDQ1MCwgIDQxOSB9LCB7ICA0MjIsICAzOTEgfSwKKyAgICB7ICAxMTQsICAgODMgfSwgeyAgNDUxLCAgNDIwIH0sIHsgIDQ4MCwgIDQ0OSB9LCB7ICA0NTIsICA0MjEgfSwKKyAgICB7ICA0ODEsICA0NTAgfSwgeyAgNDUzLCAgNDIyIH0sIHsgIDUxMiwgIDUxMiB9LCB7ICA0ODIsICA0NTEgfSwKKyAgICB7ICA0NTQsICA0MjMgfSwgeyAgNTEyLCAgNDgxIH0sIHsgIDQ4MywgIDQ1MiB9LCB7ICA1MTMsICA0ODIgfSwKKyAgICB7ICA0ODQsICA0NTMgfSwgeyAgNTE0LCAgNDgzIH0sIHsgIDQ4NSwgIDQ1NCB9LCB7ICA1NDQsICA1MTMgfSwKKyAgICB7ICA1NDQsICA1NDQgfSwgeyAgNDg2LCAgNDU1IH0sIHsgIDU0NSwgIDUxNCB9LCB7ICA1NDYsICA1MTUgfSwKKyAgICB7ICA1NzYsICA1NzYgfSwgeyAgNTc2LCAgNTQ1IH0sIHsgIDU3NywgIDU0NiB9LCB7ICA1NzgsICA1NDcgfSwKKyAgICB7ICA2MDgsICA1NzcgfSwgeyAgNjA5LCAgNTc4IH0sIHsgIDYxMCwgIDU3OSB9LCB7ICAgMTksICAgMTkgfSwKKyAgICB7ICAxNDMsICAxMTIgfSwgeyAgMjY3LCAgMjM2IH0sIHsgIDM5MSwgIDM2MCB9LCB7ICA1MTUsICA0ODQgfSwKKyAgICB7ICA2MDgsICA2MDggfSwgeyAgIDIwLCAgIDIwIH0sIHsgICA1MSwgICAyMCB9LCB7ICAxNDQsICAxMTMgfSwKKyAgICB7ICAxNzUsICAxNDQgfSwgeyAgMjY4LCAgMjM3IH0sIHsgIDI5OSwgIDI2OCB9LCB7ICAzOTIsICAzNjEgfSwKKyAgICB7ICA0MjMsICAzOTIgfSwgeyAgNTE2LCAgNDg1IH0sIHsgIDU0NywgIDUxNiB9LCB7ICA2NDAsICA2MDkgfSwKKyAgICB7ICA2NDAsICA2NDAgfSwgeyAgIDIxLCAgIDIxIH0sIHsgICA1MiwgICAyMSB9LCB7ICAgODMsICAgNTIgfSwKKyAgICB7ICAxNDUsICAxMTQgfSwgeyAgMTc2LCAgMTQ1IH0sIHsgIDIwNywgIDE3NiB9LCB7ICAyNjksICAyMzggfSwKKyAgICB7ICAzMDAsICAyNjkgfSwgeyAgMzMxLCAgMzAwIH0sIHsgIDM5MywgIDM2MiB9LCB7ICA0MjQsICAzOTMgfSwKKyAgICB7ICA0NTUsICA0MjQgfSwgeyAgNTE3LCAgNDg2IH0sIHsgIDU0OCwgIDUxNyB9LCB7ICA1NzksICA1NDggfSwKKyAgICB7ICA2NDEsICA2MTAgfSwgeyAgNjcyLCAgNjQxIH0sIHsgIDY3MiwgIDY3MiB9LCB7ICAgMjIsICAgMjIgfSwKKyAgICB7ICAgNTMsICAgMjIgfSwgeyAgIDg0LCAgIDUzIH0sIHsgIDExNSwgICA4NCB9LCB7ICAxNDYsICAxMTUgfSwKKyAgICB7ICAxNzcsICAxNDYgfSwgeyAgMjA4LCAgMTc3IH0sIHsgIDIzOSwgIDIwOCB9LCB7ICAyNzAsICAyMzkgfSwKKyAgICB7ICAzMDEsICAyNzAgfSwgeyAgMzMyLCAgMzAxIH0sIHsgIDM2MywgIDMzMiB9LCB7ICAzOTQsICAzNjMgfSwKKyAgICB7ICA0MjUsICAzOTQgfSwgeyAgNDU2LCAgNDI1IH0sIHsgIDQ4NywgIDQ1NiB9LCB7ICA1MTgsICA0ODcgfSwKKyAgICB7ICA1NDksICA1MTggfSwgeyAgNTgwLCAgNTQ5IH0sIHsgIDYxMSwgIDU4MCB9LCB7ICA2NDIsICA2MTEgfSwKKyAgICB7ICA2NzMsICA2NDIgfSwgeyAgNzA0LCAgNjczIH0sIHsgIDcwNCwgIDcwNCB9LCB7ICAgNTQsICAgMjMgfSwKKyAgICB7ICAgODUsICAgNTQgfSwgeyAgMTE2LCAgIDg1IH0sIHsgIDE3OCwgIDE0NyB9LCB7ICAyMDksICAxNzggfSwKKyAgICB7ICAyNDAsICAyMDkgfSwgeyAgMzAyLCAgMjcxIH0sIHsgIDMzMywgIDMwMiB9LCB7ICAzNjQsICAzMzMgfSwKKyAgICB7ICA0MjYsICAzOTUgfSwgeyAgNDU3LCAgNDI2IH0sIHsgIDQ4OCwgIDQ1NyB9LCB7ICA1NTAsICA1MTkgfSwKKyAgICB7ICA1ODEsICA1NTAgfSwgeyAgNjEyLCAgNTgxIH0sIHsgIDY3NCwgIDY0MyB9LCB7ICA3MDUsICA2NzQgfSwKKyAgICB7ICA3MzYsICA3MDUgfSwgeyAgIDg2LCAgIDU1IH0sIHsgIDExNywgICA4NiB9LCB7ICAyMTAsICAxNzkgfSwKKyAgICB7ICAyNDEsICAyMTAgfSwgeyAgMzM0LCAgMzAzIH0sIHsgIDM2NSwgIDMzNCB9LCB7ICA0NTgsICA0MjcgfSwKKyAgICB7ICA0ODksICA0NTggfSwgeyAgNTgyLCAgNTUxIH0sIHsgIDYxMywgIDU4MiB9LCB7ICA3MDYsICA2NzUgfSwKKyAgICB7ICA3MzcsICA3MDYgfSwgeyAgMTE4LCAgIDg3IH0sIHsgIDI0MiwgIDIxMSB9LCB7ICAzNjYsICAzMzUgfSwKKyAgICB7ICA0OTAsICA0NTkgfSwgeyAgNjE0LCAgNTgzIH0sIHsgIDczOCwgIDcwNyB9LCB7ICAgMjMsICAgMjMgfSwKKyAgICB7ICAxNDcsICAxMTYgfSwgeyAgMjcxLCAgMjQwIH0sIHsgIDM5NSwgIDM2NCB9LCB7ICA1MTksICA0ODggfSwKKyAgICB7ICA2NDMsICA2MTIgfSwgeyAgNzM2LCAgNzM2IH0sIHsgICAyNCwgICAyNCB9LCB7ICAgNTUsICAgMjQgfSwKKyAgICB7ICAxNDgsICAxMTcgfSwgeyAgMTc5LCAgMTQ4IH0sIHsgIDI3MiwgIDI0MSB9LCB7ICAzMDMsICAyNzIgfSwKKyAgICB7ICAzOTYsICAzNjUgfSwgeyAgNDI3LCAgMzk2IH0sIHsgIDUyMCwgIDQ4OSB9LCB7ICA1NTEsICA1MjAgfSwKKyAgICB7ICA2NDQsICA2MTMgfSwgeyAgNjc1LCAgNjQ0IH0sIHsgIDc2OCwgIDczNyB9LCB7ICA3NjgsICA3NjggfSwKKyAgICB7ICAgMjUsICAgMjUgfSwgeyAgIDU2LCAgIDI1IH0sIHsgICA4NywgICA1NiB9LCB7ICAxNDksICAxMTggfSwKKyAgICB7ICAxODAsICAxNDkgfSwgeyAgMjExLCAgMTgwIH0sIHsgIDI3MywgIDI0MiB9LCB7ICAzMDQsICAyNzMgfSwKKyAgICB7ICAzMzUsICAzMDQgfSwgeyAgMzk3LCAgMzY2IH0sIHsgIDQyOCwgIDM5NyB9LCB7ICA0NTksICA0MjggfSwKKyAgICB7ICA1MjEsICA0OTAgfSwgeyAgNTUyLCAgNTIxIH0sIHsgIDU4MywgIDU1MiB9LCB7ICA2NDUsICA2MTQgfSwKKyAgICB7ICA2NzYsICA2NDUgfSwgeyAgNzA3LCAgNjc2IH0sIHsgIDc2OSwgIDczOCB9LCB7ICA4MDAsICA3NjkgfSwKKyAgICB7ICA4MDAsICA4MDAgfSwgeyAgIDI2LCAgIDI2IH0sIHsgICA1NywgICAyNiB9LCB7ICAgODgsICAgNTcgfSwKKyAgICB7ICAxMTksICAgODggfSwgeyAgMTUwLCAgMTE5IH0sIHsgIDE4MSwgIDE1MCB9LCB7ICAyMTIsICAxODEgfSwKKyAgICB7ICAyNDMsICAyMTIgfSwgeyAgMjc0LCAgMjQzIH0sIHsgIDMwNSwgIDI3NCB9LCB7ICAzMzYsICAzMDUgfSwKKyAgICB7ICAzNjcsICAzMzYgfSwgeyAgMzk4LCAgMzY3IH0sIHsgIDQyOSwgIDM5OCB9LCB7ICA0NjAsICA0MjkgfSwKKyAgICB7ICA0OTEsICA0NjAgfSwgeyAgNTIyLCAgNDkxIH0sIHsgIDU1MywgIDUyMiB9LCB7ICA1ODQsICA1NTMgfSwKKyAgICB7ICA2MTUsICA1ODQgfSwgeyAgNjQ2LCAgNjE1IH0sIHsgIDY3NywgIDY0NiB9LCB7ICA3MDgsICA2NzcgfSwKKyAgICB7ICA3MzksICA3MDggfSwgeyAgNzcwLCAgNzM5IH0sIHsgIDgwMSwgIDc3MCB9LCB7ICA4MzIsICA4MDEgfSwKKyAgICB7ICA4MzIsICA4MzIgfSwgeyAgIDU4LCAgIDI3IH0sIHsgICA4OSwgICA1OCB9LCB7ICAxMjAsICAgODkgfSwKKyAgICB7ICAxODIsICAxNTEgfSwgeyAgMjEzLCAgMTgyIH0sIHsgIDI0NCwgIDIxMyB9LCB7ICAzMDYsICAyNzUgfSwKKyAgICB7ICAzMzcsICAzMDYgfSwgeyAgMzY4LCAgMzM3IH0sIHsgIDQzMCwgIDM5OSB9LCB7ICA0NjEsICA0MzAgfSwKKyAgICB7ICA0OTIsICA0NjEgfSwgeyAgNTU0LCAgNTIzIH0sIHsgIDU4NSwgIDU1NCB9LCB7ICA2MTYsICA1ODUgfSwKKyAgICB7ICA2NzgsICA2NDcgfSwgeyAgNzA5LCAgNjc4IH0sIHsgIDc0MCwgIDcwOSB9LCB7ICA4MDIsICA3NzEgfSwKKyAgICB7ICA4MzMsICA4MDIgfSwgeyAgODY0LCAgODMzIH0sIHsgICA5MCwgICA1OSB9LCB7ICAxMjEsICAgOTAgfSwKKyAgICB7ICAyMTQsICAxODMgfSwgeyAgMjQ1LCAgMjE0IH0sIHsgIDMzOCwgIDMwNyB9LCB7ICAzNjksICAzMzggfSwKKyAgICB7ICA0NjIsICA0MzEgfSwgeyAgNDkzLCAgNDYyIH0sIHsgIDU4NiwgIDU1NSB9LCB7ICA2MTcsICA1ODYgfSwKKyAgICB7ICA3MTAsICA2NzkgfSwgeyAgNzQxLCAgNzEwIH0sIHsgIDgzNCwgIDgwMyB9LCB7ICA4NjUsICA4MzQgfSwKKyAgICB7ICAxMjIsICAgOTEgfSwgeyAgMjQ2LCAgMjE1IH0sIHsgIDM3MCwgIDMzOSB9LCB7ICA0OTQsICA0NjMgfSwKKyAgICB7ICA2MTgsICA1ODcgfSwgeyAgNzQyLCAgNzExIH0sIHsgIDg2NiwgIDgzNSB9LCB7ICAgMjcsICAgMjcgfSwKKyAgICB7ICAxNTEsICAxMjAgfSwgeyAgMjc1LCAgMjQ0IH0sIHsgIDM5OSwgIDM2OCB9LCB7ICA1MjMsICA0OTIgfSwKKyAgICB7ICA2NDcsICA2MTYgfSwgeyAgNzcxLCAgNzQwIH0sIHsgIDg2NCwgIDg2NCB9LCB7ICAgMjgsICAgMjggfSwKKyAgICB7ICAgNTksICAgMjggfSwgeyAgMTUyLCAgMTIxIH0sIHsgIDE4MywgIDE1MiB9LCB7ICAyNzYsICAyNDUgfSwKKyAgICB7ICAzMDcsICAyNzYgfSwgeyAgNDAwLCAgMzY5IH0sIHsgIDQzMSwgIDQwMCB9LCB7ICA1MjQsICA0OTMgfSwKKyAgICB7ICA1NTUsICA1MjQgfSwgeyAgNjQ4LCAgNjE3IH0sIHsgIDY3OSwgIDY0OCB9LCB7ICA3NzIsICA3NDEgfSwKKyAgICB7ICA4MDMsICA3NzIgfSwgeyAgODk2LCAgODY1IH0sIHsgIDg5NiwgIDg5NiB9LCB7ICAgMjksICAgMjkgfSwKKyAgICB7ICAgNjAsICAgMjkgfSwgeyAgIDkxLCAgIDYwIH0sIHsgIDE1MywgIDEyMiB9LCB7ICAxODQsICAxNTMgfSwKKyAgICB7ICAyMTUsICAxODQgfSwgeyAgMjc3LCAgMjQ2IH0sIHsgIDMwOCwgIDI3NyB9LCB7ICAzMzksICAzMDggfSwKKyAgICB7ICA0MDEsICAzNzAgfSwgeyAgNDMyLCAgNDAxIH0sIHsgIDQ2MywgIDQzMiB9LCB7ICA1MjUsICA0OTQgfSwKKyAgICB7ICA1NTYsICA1MjUgfSwgeyAgNTg3LCAgNTU2IH0sIHsgIDY0OSwgIDYxOCB9LCB7ICA2ODAsICA2NDkgfSwKKyAgICB7ICA3MTEsICA2ODAgfSwgeyAgNzczLCAgNzQyIH0sIHsgIDgwNCwgIDc3MyB9LCB7ICA4MzUsICA4MDQgfSwKKyAgICB7ICA4OTcsICA4NjYgfSwgeyAgOTI4LCAgODk3IH0sIHsgIDkyOCwgIDkyOCB9LCB7ICAgMzAsICAgMzAgfSwKKyAgICB7ICAgNjEsICAgMzAgfSwgeyAgIDkyLCAgIDYxIH0sIHsgIDEyMywgICA5MiB9LCB7ICAxNTQsICAxMjMgfSwKKyAgICB7ICAxODUsICAxNTQgfSwgeyAgMjE2LCAgMTg1IH0sIHsgIDI0NywgIDIxNiB9LCB7ICAyNzgsICAyNDcgfSwKKyAgICB7ICAzMDksICAyNzggfSwgeyAgMzQwLCAgMzA5IH0sIHsgIDM3MSwgIDM0MCB9LCB7ICA0MDIsICAzNzEgfSwKKyAgICB7ICA0MzMsICA0MDIgfSwgeyAgNDY0LCAgNDMzIH0sIHsgIDQ5NSwgIDQ2NCB9LCB7ICA1MjYsICA0OTUgfSwKKyAgICB7ICA1NTcsICA1MjYgfSwgeyAgNTg4LCAgNTU3IH0sIHsgIDYxOSwgIDU4OCB9LCB7ICA2NTAsICA2MTkgfSwKKyAgICB7ICA2ODEsICA2NTAgfSwgeyAgNzEyLCAgNjgxIH0sIHsgIDc0MywgIDcxMiB9LCB7ICA3NzQsICA3NDMgfSwKKyAgICB7ICA4MDUsICA3NzQgfSwgeyAgODM2LCAgODA1IH0sIHsgIDg2NywgIDgzNiB9LCB7ICA4OTgsICA4NjcgfSwKKyAgICB7ICA5MjksICA4OTggfSwgeyAgOTYwLCAgOTI5IH0sIHsgIDk2MCwgIDk2MCB9LCB7ICAgNjIsICAgMzEgfSwKKyAgICB7ICAgOTMsICAgNjIgfSwgeyAgMTI0LCAgIDkzIH0sIHsgIDE4NiwgIDE1NSB9LCB7ICAyMTcsICAxODYgfSwKKyAgICB7ICAyNDgsICAyMTcgfSwgeyAgMzEwLCAgMjc5IH0sIHsgIDM0MSwgIDMxMCB9LCB7ICAzNzIsICAzNDEgfSwKKyAgICB7ICA0MzQsICA0MDMgfSwgeyAgNDY1LCAgNDM0IH0sIHsgIDQ5NiwgIDQ2NSB9LCB7ICA1NTgsICA1MjcgfSwKKyAgICB7ICA1ODksICA1NTggfSwgeyAgNjIwLCAgNTg5IH0sIHsgIDY4MiwgIDY1MSB9LCB7ICA3MTMsICA2ODIgfSwKKyAgICB7ICA3NDQsICA3MTMgfSwgeyAgODA2LCAgNzc1IH0sIHsgIDgzNywgIDgwNiB9LCB7ICA4NjgsICA4MzcgfSwKKyAgICB7ICA5MzAsICA4OTkgfSwgeyAgOTYxLCAgOTMwIH0sIHsgIDk5MiwgIDk2MSB9LCB7ICAgOTQsICAgNjMgfSwKKyAgICB7ICAxMjUsICAgOTQgfSwgeyAgMjE4LCAgMTg3IH0sIHsgIDI0OSwgIDIxOCB9LCB7ICAzNDIsICAzMTEgfSwKKyAgICB7ICAzNzMsICAzNDIgfSwgeyAgNDY2LCAgNDM1IH0sIHsgIDQ5NywgIDQ2NiB9LCB7ICA1OTAsICA1NTkgfSwKKyAgICB7ICA2MjEsICA1OTAgfSwgeyAgNzE0LCAgNjgzIH0sIHsgIDc0NSwgIDcxNCB9LCB7ICA4MzgsICA4MDcgfSwKKyAgICB7ICA4NjksICA4MzggfSwgeyAgOTYyLCAgOTMxIH0sIHsgIDk5MywgIDk2MiB9LCB7ICAxMjYsICAgOTUgfSwKKyAgICB7ICAyNTAsICAyMTkgfSwgeyAgMzc0LCAgMzQzIH0sIHsgIDQ5OCwgIDQ2NyB9LCB7ICA2MjIsICA1OTEgfSwKKyAgICB7ICA3NDYsICA3MTUgfSwgeyAgODcwLCAgODM5IH0sIHsgIDk5NCwgIDk2MyB9LCB7ICAxNTUsICAxMjQgfSwKKyAgICB7ICAyNzksICAyNDggfSwgeyAgNDAzLCAgMzcyIH0sIHsgIDUyNywgIDQ5NiB9LCB7ICA2NTEsICA2MjAgfSwKKyAgICB7ICA3NzUsICA3NDQgfSwgeyAgODk5LCAgODY4IH0sIHsgIDE1NiwgIDEyNSB9LCB7ICAxODcsICAxNTYgfSwKKyAgICB7ICAyODAsICAyNDkgfSwgeyAgMzExLCAgMjgwIH0sIHsgIDQwNCwgIDM3MyB9LCB7ICA0MzUsICA0MDQgfSwKKyAgICB7ICA1MjgsICA0OTcgfSwgeyAgNTU5LCAgNTI4IH0sIHsgIDY1MiwgIDYyMSB9LCB7ICA2ODMsICA2NTIgfSwKKyAgICB7ICA3NzYsICA3NDUgfSwgeyAgODA3LCAgNzc2IH0sIHsgIDkwMCwgIDg2OSB9LCB7ICA5MzEsICA5MDAgfSwKKyAgICB7ICAxNTcsICAxMjYgfSwgeyAgMTg4LCAgMTU3IH0sIHsgIDIxOSwgIDE4OCB9LCB7ICAyODEsICAyNTAgfSwKKyAgICB7ICAzMTIsICAyODEgfSwgeyAgMzQzLCAgMzEyIH0sIHsgIDQwNSwgIDM3NCB9LCB7ICA0MzYsICA0MDUgfSwKKyAgICB7ICA0NjcsICA0MzYgfSwgeyAgNTI5LCAgNDk4IH0sIHsgIDU2MCwgIDUyOSB9LCB7ICA1OTEsICA1NjAgfSwKKyAgICB7ICA2NTMsICA2MjIgfSwgeyAgNjg0LCAgNjUzIH0sIHsgIDcxNSwgIDY4NCB9LCB7ICA3NzcsICA3NDYgfSwKKyAgICB7ICA4MDgsICA3NzcgfSwgeyAgODM5LCAgODA4IH0sIHsgIDkwMSwgIDg3MCB9LCB7ICA5MzIsICA5MDEgfSwKKyAgICB7ICA5NjMsICA5MzIgfSwgeyAgMTU4LCAgMTI3IH0sIHsgIDE4OSwgIDE1OCB9LCB7ICAyMjAsICAxODkgfSwKKyAgICB7ICAyNTEsICAyMjAgfSwgeyAgMjgyLCAgMjUxIH0sIHsgIDMxMywgIDI4MiB9LCB7ICAzNDQsICAzMTMgfSwKKyAgICB7ICAzNzUsICAzNDQgfSwgeyAgNDA2LCAgMzc1IH0sIHsgIDQzNywgIDQwNiB9LCB7ICA0NjgsICA0MzcgfSwKKyAgICB7ICA0OTksICA0NjggfSwgeyAgNTMwLCAgNDk5IH0sIHsgIDU2MSwgIDUzMCB9LCB7ICA1OTIsICA1NjEgfSwKKyAgICB7ICA2MjMsICA1OTIgfSwgeyAgNjU0LCAgNjIzIH0sIHsgIDY4NSwgIDY1NCB9LCB7ICA3MTYsICA2ODUgfSwKKyAgICB7ICA3NDcsICA3MTYgfSwgeyAgNzc4LCAgNzQ3IH0sIHsgIDgwOSwgIDc3OCB9LCB7ICA4NDAsICA4MDkgfSwKKyAgICB7ICA4NzEsICA4NDAgfSwgeyAgOTAyLCAgODcxIH0sIHsgIDkzMywgIDkwMiB9LCB7ICA5NjQsICA5MzMgfSwKKyAgICB7ICA5OTUsICA5NjQgfSwgeyAgMTkwLCAgMTU5IH0sIHsgIDIyMSwgIDE5MCB9LCB7ICAyNTIsICAyMjEgfSwKKyAgICB7ICAzMTQsICAyODMgfSwgeyAgMzQ1LCAgMzE0IH0sIHsgIDM3NiwgIDM0NSB9LCB7ICA0MzgsICA0MDcgfSwKKyAgICB7ICA0NjksICA0MzggfSwgeyAgNTAwLCAgNDY5IH0sIHsgIDU2MiwgIDUzMSB9LCB7ICA1OTMsICA1NjIgfSwKKyAgICB7ICA2MjQsICA1OTMgfSwgeyAgNjg2LCAgNjU1IH0sIHsgIDcxNywgIDY4NiB9LCB7ICA3NDgsICA3MTcgfSwKKyAgICB7ICA4MTAsICA3NzkgfSwgeyAgODQxLCAgODEwIH0sIHsgIDg3MiwgIDg0MSB9LCB7ICA5MzQsICA5MDMgfSwKKyAgICB7ICA5NjUsICA5MzQgfSwgeyAgOTk2LCAgOTY1IH0sIHsgIDIyMiwgIDE5MSB9LCB7ICAyNTMsICAyMjIgfSwKKyAgICB7ICAzNDYsICAzMTUgfSwgeyAgMzc3LCAgMzQ2IH0sIHsgIDQ3MCwgIDQzOSB9LCB7ICA1MDEsICA0NzAgfSwKKyAgICB7ICA1OTQsICA1NjMgfSwgeyAgNjI1LCAgNTk0IH0sIHsgIDcxOCwgIDY4NyB9LCB7ICA3NDksICA3MTggfSwKKyAgICB7ICA4NDIsICA4MTEgfSwgeyAgODczLCAgODQyIH0sIHsgIDk2NiwgIDkzNSB9LCB7ICA5OTcsICA5NjYgfSwKKyAgICB7ICAyNTQsICAyMjMgfSwgeyAgMzc4LCAgMzQ3IH0sIHsgIDUwMiwgIDQ3MSB9LCB7ICA2MjYsICA1OTUgfSwKKyAgICB7ICA3NTAsICA3MTkgfSwgeyAgODc0LCAgODQzIH0sIHsgIDk5OCwgIDk2NyB9LCB7ICAyODMsICAyNTIgfSwKKyAgICB7ICA0MDcsICAzNzYgfSwgeyAgNTMxLCAgNTAwIH0sIHsgIDY1NSwgIDYyNCB9LCB7ICA3NzksICA3NDggfSwKKyAgICB7ICA5MDMsICA4NzIgfSwgeyAgMjg0LCAgMjUzIH0sIHsgIDMxNSwgIDI4NCB9LCB7ICA0MDgsICAzNzcgfSwKKyAgICB7ICA0MzksICA0MDggfSwgeyAgNTMyLCAgNTAxIH0sIHsgIDU2MywgIDUzMiB9LCB7ICA2NTYsICA2MjUgfSwKKyAgICB7ICA2ODcsICA2NTYgfSwgeyAgNzgwLCAgNzQ5IH0sIHsgIDgxMSwgIDc4MCB9LCB7ICA5MDQsICA4NzMgfSwKKyAgICB7ICA5MzUsICA5MDQgfSwgeyAgMjg1LCAgMjU0IH0sIHsgIDMxNiwgIDI4NSB9LCB7ICAzNDcsICAzMTYgfSwKKyAgICB7ICA0MDksICAzNzggfSwgeyAgNDQwLCAgNDA5IH0sIHsgIDQ3MSwgIDQ0MCB9LCB7ICA1MzMsICA1MDIgfSwKKyAgICB7ICA1NjQsICA1MzMgfSwgeyAgNTk1LCAgNTY0IH0sIHsgIDY1NywgIDYyNiB9LCB7ICA2ODgsICA2NTcgfSwKKyAgICB7ICA3MTksICA2ODggfSwgeyAgNzgxLCAgNzUwIH0sIHsgIDgxMiwgIDc4MSB9LCB7ICA4NDMsICA4MTIgfSwKKyAgICB7ICA5MDUsICA4NzQgfSwgeyAgOTM2LCAgOTA1IH0sIHsgIDk2NywgIDkzNiB9LCB7ICAyODYsICAyNTUgfSwKKyAgICB7ICAzMTcsICAyODYgfSwgeyAgMzQ4LCAgMzE3IH0sIHsgIDM3OSwgIDM0OCB9LCB7ICA0MTAsICAzNzkgfSwKKyAgICB7ICA0NDEsICA0MTAgfSwgeyAgNDcyLCAgNDQxIH0sIHsgIDUwMywgIDQ3MiB9LCB7ICA1MzQsICA1MDMgfSwKKyAgICB7ICA1NjUsICA1MzQgfSwgeyAgNTk2LCAgNTY1IH0sIHsgIDYyNywgIDU5NiB9LCB7ICA2NTgsICA2MjcgfSwKKyAgICB7ICA2ODksICA2NTggfSwgeyAgNzIwLCAgNjg5IH0sIHsgIDc1MSwgIDcyMCB9LCB7ICA3ODIsICA3NTEgfSwKKyAgICB7ICA4MTMsICA3ODIgfSwgeyAgODQ0LCAgODEzIH0sIHsgIDg3NSwgIDg0NCB9LCB7ICA5MDYsICA4NzUgfSwKKyAgICB7ICA5MzcsICA5MDYgfSwgeyAgOTY4LCAgOTM3IH0sIHsgIDk5OSwgIDk2OCB9LCB7ICAzMTgsICAyODcgfSwKKyAgICB7ICAzNDksICAzMTggfSwgeyAgMzgwLCAgMzQ5IH0sIHsgIDQ0MiwgIDQxMSB9LCB7ICA0NzMsICA0NDIgfSwKKyAgICB7ICA1MDQsICA0NzMgfSwgeyAgNTY2LCAgNTM1IH0sIHsgIDU5NywgIDU2NiB9LCB7ICA2MjgsICA1OTcgfSwKKyAgICB7ICA2OTAsICA2NTkgfSwgeyAgNzIxLCAgNjkwIH0sIHsgIDc1MiwgIDcyMSB9LCB7ICA4MTQsICA3ODMgfSwKKyAgICB7ICA4NDUsICA4MTQgfSwgeyAgODc2LCAgODQ1IH0sIHsgIDkzOCwgIDkwNyB9LCB7ICA5NjksICA5MzggfSwKKyAgICB7IDEwMDAsICA5NjkgfSwgeyAgMzUwLCAgMzE5IH0sIHsgIDM4MSwgIDM1MCB9LCB7ICA0NzQsICA0NDMgfSwKKyAgICB7ICA1MDUsICA0NzQgfSwgeyAgNTk4LCAgNTY3IH0sIHsgIDYyOSwgIDU5OCB9LCB7ICA3MjIsICA2OTEgfSwKKyAgICB7ICA3NTMsICA3MjIgfSwgeyAgODQ2LCAgODE1IH0sIHsgIDg3NywgIDg0NiB9LCB7ICA5NzAsICA5MzkgfSwKKyAgICB7IDEwMDEsICA5NzAgfSwgeyAgMzgyLCAgMzUxIH0sIHsgIDUwNiwgIDQ3NSB9LCB7ICA2MzAsICA1OTkgfSwKKyAgICB7ICA3NTQsICA3MjMgfSwgeyAgODc4LCAgODQ3IH0sIHsgMTAwMiwgIDk3MSB9LCB7ICA0MTEsICAzODAgfSwKKyAgICB7ICA1MzUsICA1MDQgfSwgeyAgNjU5LCAgNjI4IH0sIHsgIDc4MywgIDc1MiB9LCB7ICA5MDcsICA4NzYgfSwKKyAgICB7ICA0MTIsICAzODEgfSwgeyAgNDQzLCAgNDEyIH0sIHsgIDUzNiwgIDUwNSB9LCB7ICA1NjcsICA1MzYgfSwKKyAgICB7ICA2NjAsICA2MjkgfSwgeyAgNjkxLCAgNjYwIH0sIHsgIDc4NCwgIDc1MyB9LCB7ICA4MTUsICA3ODQgfSwKKyAgICB7ICA5MDgsICA4NzcgfSwgeyAgOTM5LCAgOTA4IH0sIHsgIDQxMywgIDM4MiB9LCB7ICA0NDQsICA0MTMgfSwKKyAgICB7ICA0NzUsICA0NDQgfSwgeyAgNTM3LCAgNTA2IH0sIHsgIDU2OCwgIDUzNyB9LCB7ICA1OTksICA1NjggfSwKKyAgICB7ICA2NjEsICA2MzAgfSwgeyAgNjkyLCAgNjYxIH0sIHsgIDcyMywgIDY5MiB9LCB7ICA3ODUsICA3NTQgfSwKKyAgICB7ICA4MTYsICA3ODUgfSwgeyAgODQ3LCAgODE2IH0sIHsgIDkwOSwgIDg3OCB9LCB7ICA5NDAsICA5MDkgfSwKKyAgICB7ICA5NzEsICA5NDAgfSwgeyAgNDE0LCAgMzgzIH0sIHsgIDQ0NSwgIDQxNCB9LCB7ICA0NzYsICA0NDUgfSwKKyAgICB7ICA1MDcsICA0NzYgfSwgeyAgNTM4LCAgNTA3IH0sIHsgIDU2OSwgIDUzOCB9LCB7ICA2MDAsICA1NjkgfSwKKyAgICB7ICA2MzEsICA2MDAgfSwgeyAgNjYyLCAgNjMxIH0sIHsgIDY5MywgIDY2MiB9LCB7ICA3MjQsICA2OTMgfSwKKyAgICB7ICA3NTUsICA3MjQgfSwgeyAgNzg2LCAgNzU1IH0sIHsgIDgxNywgIDc4NiB9LCB7ICA4NDgsICA4MTcgfSwKKyAgICB7ICA4NzksICA4NDggfSwgeyAgOTEwLCAgODc5IH0sIHsgIDk0MSwgIDkxMCB9LCB7ICA5NzIsICA5NDEgfSwKKyAgICB7IDEwMDMsICA5NzIgfSwgeyAgNDQ2LCAgNDE1IH0sIHsgIDQ3NywgIDQ0NiB9LCB7ICA1MDgsICA0NzcgfSwKKyAgICB7ICA1NzAsICA1MzkgfSwgeyAgNjAxLCAgNTcwIH0sIHsgIDYzMiwgIDYwMSB9LCB7ICA2OTQsICA2NjMgfSwKKyAgICB7ICA3MjUsICA2OTQgfSwgeyAgNzU2LCAgNzI1IH0sIHsgIDgxOCwgIDc4NyB9LCB7ICA4NDksICA4MTggfSwKKyAgICB7ICA4ODAsICA4NDkgfSwgeyAgOTQyLCAgOTExIH0sIHsgIDk3MywgIDk0MiB9LCB7IDEwMDQsICA5NzMgfSwKKyAgICB7ICA0NzgsICA0NDcgfSwgeyAgNTA5LCAgNDc4IH0sIHsgIDYwMiwgIDU3MSB9LCB7ICA2MzMsICA2MDIgfSwKKyAgICB7ICA3MjYsICA2OTUgfSwgeyAgNzU3LCAgNzI2IH0sIHsgIDg1MCwgIDgxOSB9LCB7ICA4ODEsICA4NTAgfSwKKyAgICB7ICA5NzQsICA5NDMgfSwgeyAxMDA1LCAgOTc0IH0sIHsgIDUxMCwgIDQ3OSB9LCB7ICA2MzQsICA2MDMgfSwKKyAgICB7ICA3NTgsICA3MjcgfSwgeyAgODgyLCAgODUxIH0sIHsgMTAwNiwgIDk3NSB9LCB7ICA1MzksICA1MDggfSwKKyAgICB7ICA2NjMsICA2MzIgfSwgeyAgNzg3LCAgNzU2IH0sIHsgIDkxMSwgIDg4MCB9LCB7ICA1NDAsICA1MDkgfSwKKyAgICB7ICA1NzEsICA1NDAgfSwgeyAgNjY0LCAgNjMzIH0sIHsgIDY5NSwgIDY2NCB9LCB7ICA3ODgsICA3NTcgfSwKKyAgICB7ICA4MTksICA3ODggfSwgeyAgOTEyLCAgODgxIH0sIHsgIDk0MywgIDkxMiB9LCB7ICA1NDEsICA1MTAgfSwKKyAgICB7ICA1NzIsICA1NDEgfSwgeyAgNjAzLCAgNTcyIH0sIHsgIDY2NSwgIDYzNCB9LCB7ICA2OTYsICA2NjUgfSwKKyAgICB7ICA3MjcsICA2OTYgfSwgeyAgNzg5LCAgNzU4IH0sIHsgIDgyMCwgIDc4OSB9LCB7ICA4NTEsICA4MjAgfSwKKyAgICB7ICA5MTMsICA4ODIgfSwgeyAgOTQ0LCAgOTEzIH0sIHsgIDk3NSwgIDk0NCB9LCB7ICA1NDIsICA1MTEgfSwKKyAgICB7ICA1NzMsICA1NDIgfSwgeyAgNjA0LCAgNTczIH0sIHsgIDYzNSwgIDYwNCB9LCB7ICA2NjYsICA2MzUgfSwKKyAgICB7ICA2OTcsICA2NjYgfSwgeyAgNzI4LCAgNjk3IH0sIHsgIDc1OSwgIDcyOCB9LCB7ICA3OTAsICA3NTkgfSwKKyAgICB7ICA4MjEsICA3OTAgfSwgeyAgODUyLCAgODIxIH0sIHsgIDg4MywgIDg1MiB9LCB7ICA5MTQsICA4ODMgfSwKKyAgICB7ICA5NDUsICA5MTQgfSwgeyAgOTc2LCAgOTQ1IH0sIHsgMTAwNywgIDk3NiB9LCB7ICA1NzQsICA1NDMgfSwKKyAgICB7ICA2MDUsICA1NzQgfSwgeyAgNjM2LCAgNjA1IH0sIHsgIDY5OCwgIDY2NyB9LCB7ICA3MjksICA2OTggfSwKKyAgICB7ICA3NjAsICA3MjkgfSwgeyAgODIyLCAgNzkxIH0sIHsgIDg1MywgIDgyMiB9LCB7ICA4ODQsICA4NTMgfSwKKyAgICB7ICA5NDYsICA5MTUgfSwgeyAgOTc3LCAgOTQ2IH0sIHsgMTAwOCwgIDk3NyB9LCB7ICA2MDYsICA1NzUgfSwKKyAgICB7ICA2MzcsICA2MDYgfSwgeyAgNzMwLCAgNjk5IH0sIHsgIDc2MSwgIDczMCB9LCB7ICA4NTQsICA4MjMgfSwKKyAgICB7ICA4ODUsICA4NTQgfSwgeyAgOTc4LCAgOTQ3IH0sIHsgMTAwOSwgIDk3OCB9LCB7ICA2MzgsICA2MDcgfSwKKyAgICB7ICA3NjIsICA3MzEgfSwgeyAgODg2LCAgODU1IH0sIHsgMTAxMCwgIDk3OSB9LCB7ICA2NjcsICA2MzYgfSwKKyAgICB7ICA3OTEsICA3NjAgfSwgeyAgOTE1LCAgODg0IH0sIHsgIDY2OCwgIDYzNyB9LCB7ICA2OTksICA2NjggfSwKKyAgICB7ICA3OTIsICA3NjEgfSwgeyAgODIzLCAgNzkyIH0sIHsgIDkxNiwgIDg4NSB9LCB7ICA5NDcsICA5MTYgfSwKKyAgICB7ICA2NjksICA2MzggfSwgeyAgNzAwLCAgNjY5IH0sIHsgIDczMSwgIDcwMCB9LCB7ICA3OTMsICA3NjIgfSwKKyAgICB7ICA4MjQsICA3OTMgfSwgeyAgODU1LCAgODI0IH0sIHsgIDkxNywgIDg4NiB9LCB7ICA5NDgsICA5MTcgfSwKKyAgICB7ICA5NzksICA5NDggfSwgeyAgNjcwLCAgNjM5IH0sIHsgIDcwMSwgIDY3MCB9LCB7ICA3MzIsICA3MDEgfSwKKyAgICB7ICA3NjMsICA3MzIgfSwgeyAgNzk0LCAgNzYzIH0sIHsgIDgyNSwgIDc5NCB9LCB7ICA4NTYsICA4MjUgfSwKKyAgICB7ICA4ODcsICA4NTYgfSwgeyAgOTE4LCAgODg3IH0sIHsgIDk0OSwgIDkxOCB9LCB7ICA5ODAsICA5NDkgfSwKKyAgICB7IDEwMTEsICA5ODAgfSwgeyAgNzAyLCAgNjcxIH0sIHsgIDczMywgIDcwMiB9LCB7ICA3NjQsICA3MzMgfSwKKyAgICB7ICA4MjYsICA3OTUgfSwgeyAgODU3LCAgODI2IH0sIHsgIDg4OCwgIDg1NyB9LCB7ICA5NTAsICA5MTkgfSwKKyAgICB7ICA5ODEsICA5NTAgfSwgeyAxMDEyLCAgOTgxIH0sIHsgIDczNCwgIDcwMyB9LCB7ICA3NjUsICA3MzQgfSwKKyAgICB7ICA4NTgsICA4MjcgfSwgeyAgODg5LCAgODU4IH0sIHsgIDk4MiwgIDk1MSB9LCB7IDEwMTMsICA5ODIgfSwKKyAgICB7ICA3NjYsICA3MzUgfSwgeyAgODkwLCAgODU5IH0sIHsgMTAxNCwgIDk4MyB9LCB7ICA3OTUsICA3NjQgfSwKKyAgICB7ICA5MTksICA4ODggfSwgeyAgNzk2LCAgNzY1IH0sIHsgIDgyNywgIDc5NiB9LCB7ICA5MjAsICA4ODkgfSwKKyAgICB7ICA5NTEsICA5MjAgfSwgeyAgNzk3LCAgNzY2IH0sIHsgIDgyOCwgIDc5NyB9LCB7ICA4NTksICA4MjggfSwKKyAgICB7ICA5MjEsICA4OTAgfSwgeyAgOTUyLCAgOTIxIH0sIHsgIDk4MywgIDk1MiB9LCB7ICA3OTgsICA3NjcgfSwKKyAgICB7ICA4MjksICA3OTggfSwgeyAgODYwLCAgODI5IH0sIHsgIDg5MSwgIDg2MCB9LCB7ICA5MjIsICA4OTEgfSwKKyAgICB7ICA5NTMsICA5MjIgfSwgeyAgOTg0LCAgOTUzIH0sIHsgMTAxNSwgIDk4NCB9LCB7ICA4MzAsICA3OTkgfSwKKyAgICB7ICA4NjEsICA4MzAgfSwgeyAgODkyLCAgODYxIH0sIHsgIDk1NCwgIDkyMyB9LCB7ICA5ODUsICA5NTQgfSwKKyAgICB7IDEwMTYsICA5ODUgfSwgeyAgODYyLCAgODMxIH0sIHsgIDg5MywgIDg2MiB9LCB7ICA5ODYsICA5NTUgfSwKKyAgICB7IDEwMTcsICA5ODYgfSwgeyAgODk0LCAgODYzIH0sIHsgMTAxOCwgIDk4NyB9LCB7ICA5MjMsICA4OTIgfSwKKyAgICB7ICA5MjQsICA4OTMgfSwgeyAgOTU1LCAgOTI0IH0sIHsgIDkyNSwgIDg5NCB9LCB7ICA5NTYsICA5MjUgfSwKKyAgICB7ICA5ODcsICA5NTYgfSwgeyAgOTI2LCAgODk1IH0sIHsgIDk1NywgIDkyNiB9LCB7ICA5ODgsICA5NTcgfSwKKyAgICB7IDEwMTksICA5ODggfSwgeyAgOTU4LCAgOTI3IH0sIHsgIDk4OSwgIDk1OCB9LCB7IDEwMjAsICA5ODkgfSwKKyAgICB7ICA5OTAsICA5NTkgfSwgeyAxMDIxLCAgOTkwIH0sIHsgMTAyMiwgIDk5MSB9LCB7ICAgIDAsICAgIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90ICgqIGNvbnN0IHZwOV9zY2Fuc19uYls1XVs0XSlbMl0gPSB7CisgICAgeworICAgICAgICB2cDlfZGVmYXVsdF9zY2FuXzR4NF9uYiwgdnA5X2NvbF9zY2FuXzR4NF9uYiwKKyAgICAgICAgdnA5X3Jvd19zY2FuXzR4NF9uYiwgdnA5X2RlZmF1bHRfc2Nhbl80eDRfbmIKKyAgICB9LCB7CisgICAgICAgIHZwOV9kZWZhdWx0X3NjYW5fOHg4X25iLCB2cDlfY29sX3NjYW5fOHg4X25iLAorICAgICAgICB2cDlfcm93X3NjYW5fOHg4X25iLCB2cDlfZGVmYXVsdF9zY2FuXzh4OF9uYgorICAgIH0sIHsKKyAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl8xNngxNl9uYiwgdnA5X2NvbF9zY2FuXzE2eDE2X25iLAorICAgICAgICB2cDlfcm93X3NjYW5fMTZ4MTZfbmIsIHZwOV9kZWZhdWx0X3NjYW5fMTZ4MTZfbmIKKyAgICB9LCB7CisgICAgICAgIHZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJfbmIsIHZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJfbmIsCisgICAgICAgIHZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJfbmIsIHZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJfbmIKKyAgICB9LCB7IC8vIGxvc3NsZXNzCisgICAgICAgIHZwOV9kZWZhdWx0X3NjYW5fNHg0X25iLCB2cDlfZGVmYXVsdF9zY2FuXzR4NF9uYiwKKyAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl80eDRfbmIsIHZwOV9kZWZhdWx0X3NjYW5fNHg0X25iCisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA5X21vZGVsX3BhcmV0bzhbMjU2XVs4XSA9IHsKKyAgICB7ICAgNiwgIDg2LCAxMjgsICAxMSwgIDg3LCAgNDIsICA5MSwgIDUyIH0sCisgICAgeyAgIDMsICA4NiwgMTI4LCAgIDYsICA4NiwgIDIzLCAgODgsICAyOSB9LAorICAgIHsgICA2LCAgODYsIDEyOCwgIDExLCAgODcsICA0MiwgIDkxLCAgNTIgfSwKKyAgICB7ICAgOSwgIDg2LCAxMjksICAxNywgIDg4LCAgNjEsICA5NCwgIDc2IH0sCisgICAgeyAgMTIsICA4NiwgMTI5LCAgMjIsICA4OCwgIDc3LCAgOTcsICA5MyB9LAorICAgIHsgIDE1LCAgODcsIDEyOSwgIDI4LCAgODksICA5MywgMTAwLCAxMTAgfSwKKyAgICB7ICAxNywgIDg3LCAxMjksICAzMywgIDkwLCAxMDUsIDEwMywgMTIzIH0sCisgICAgeyAgMjAsICA4OCwgMTMwLCAgMzgsICA5MSwgMTE4LCAxMDYsIDEzNiB9LAorICAgIHsgIDIzLCAgODgsIDEzMCwgIDQzLCAgOTEsIDEyOCwgMTA4LCAxNDYgfSwKKyAgICB7ICAyNiwgIDg5LCAxMzEsICA0OCwgIDkyLCAxMzksIDExMSwgMTU2IH0sCisgICAgeyAgMjgsICA4OSwgMTMxLCAgNTMsICA5MywgMTQ3LCAxMTQsIDE2MyB9LAorICAgIHsgIDMxLCAgOTAsIDEzMSwgIDU4LCAgOTQsIDE1NiwgMTE3LCAxNzEgfSwKKyAgICB7ICAzNCwgIDkwLCAxMzEsICA2MiwgIDk0LCAxNjMsIDExOSwgMTc3IH0sCisgICAgeyAgMzcsICA5MCwgMTMyLCAgNjYsICA5NSwgMTcxLCAxMjIsIDE4NCB9LAorICAgIHsgIDM5LCAgOTAsIDEzMiwgIDcwLCAgOTYsIDE3NywgMTI0LCAxODkgfSwKKyAgICB7ICA0MiwgIDkxLCAxMzIsICA3NSwgIDk3LCAxODMsIDEyNywgMTk0IH0sCisgICAgeyAgNDQsICA5MSwgMTMyLCAgNzksICA5NywgMTg4LCAxMjksIDE5OCB9LAorICAgIHsgIDQ3LCAgOTIsIDEzMywgIDgzLCAgOTgsIDE5MywgMTMyLCAyMDIgfSwKKyAgICB7ICA0OSwgIDkyLCAxMzMsICA4NiwgIDk5LCAxOTcsIDEzNCwgMjA1IH0sCisgICAgeyAgNTIsICA5MywgMTMzLCAgOTAsIDEwMCwgMjAxLCAxMzcsIDIwOCB9LAorICAgIHsgIDU0LCAgOTMsIDEzMywgIDk0LCAxMDAsIDIwNCwgMTM5LCAyMTEgfSwKKyAgICB7ICA1NywgIDk0LCAxMzQsICA5OCwgMTAxLCAyMDgsIDE0MiwgMjE0IH0sCisgICAgeyAgNTksICA5NCwgMTM0LCAxMDEsIDEwMiwgMjExLCAxNDQsIDIxNiB9LAorICAgIHsgIDYyLCAgOTQsIDEzNSwgMTA1LCAxMDMsIDIxNCwgMTQ2LCAyMTggfSwKKyAgICB7ICA2NCwgIDk0LCAxMzUsIDEwOCwgMTAzLCAyMTYsIDE0OCwgMjIwIH0sCisgICAgeyAgNjYsICA5NSwgMTM1LCAxMTEsIDEwNCwgMjE5LCAxNTEsIDIyMiB9LAorICAgIHsgIDY4LCAgOTUsIDEzNSwgMTE0LCAxMDUsIDIyMSwgMTUzLCAyMjMgfSwKKyAgICB7ICA3MSwgIDk2LCAxMzYsIDExNywgMTA2LCAyMjQsIDE1NSwgMjI1IH0sCisgICAgeyAgNzMsICA5NiwgMTM2LCAxMjAsIDEwNiwgMjI1LCAxNTcsIDIyNiB9LAorICAgIHsgIDc2LCAgOTcsIDEzNiwgMTIzLCAxMDcsIDIyNywgMTU5LCAyMjggfSwKKyAgICB7ICA3OCwgIDk3LCAxMzYsIDEyNiwgMTA4LCAyMjksIDE2MCwgMjI5IH0sCisgICAgeyAgODAsICA5OCwgMTM3LCAxMjksIDEwOSwgMjMxLCAxNjIsIDIzMSB9LAorICAgIHsgIDgyLCAgOTgsIDEzNywgMTMxLCAxMDksIDIzMiwgMTY0LCAyMzIgfSwKKyAgICB7ICA4NCwgIDk4LCAxMzgsIDEzNCwgMTEwLCAyMzQsIDE2NiwgMjMzIH0sCisgICAgeyAgODYsICA5OCwgMTM4LCAxMzcsIDExMSwgMjM1LCAxNjgsIDIzNCB9LAorICAgIHsgIDg5LCAgOTksIDEzOCwgMTQwLCAxMTIsIDIzNiwgMTcwLCAyMzUgfSwKKyAgICB7ICA5MSwgIDk5LCAxMzgsIDE0MiwgMTEyLCAyMzcsIDE3MSwgMjM1IH0sCisgICAgeyAgOTMsIDEwMCwgMTM5LCAxNDUsIDExMywgMjM4LCAxNzMsIDIzNiB9LAorICAgIHsgIDk1LCAxMDAsIDEzOSwgMTQ3LCAxMTQsIDIzOSwgMTc0LCAyMzcgfSwKKyAgICB7ICA5NywgMTAxLCAxNDAsIDE0OSwgMTE1LCAyNDAsIDE3NiwgMjM4IH0sCisgICAgeyAgOTksIDEwMSwgMTQwLCAxNTEsIDExNSwgMjQxLCAxNzcsIDIzOCB9LAorICAgIHsgMTAxLCAxMDIsIDE0MCwgMTU0LCAxMTYsIDI0MiwgMTc5LCAyMzkgfSwKKyAgICB7IDEwMywgMTAyLCAxNDAsIDE1NiwgMTE3LCAyNDIsIDE4MCwgMjM5IH0sCisgICAgeyAxMDUsIDEwMywgMTQxLCAxNTgsIDExOCwgMjQzLCAxODIsIDI0MCB9LAorICAgIHsgMTA3LCAxMDMsIDE0MSwgMTYwLCAxMTgsIDI0MywgMTgzLCAyNDAgfSwKKyAgICB7IDEwOSwgMTA0LCAxNDEsIDE2MiwgMTE5LCAyNDQsIDE4NSwgMjQxIH0sCisgICAgeyAxMTEsIDEwNCwgMTQxLCAxNjQsIDExOSwgMjQ0LCAxODYsIDI0MSB9LAorICAgIHsgMTEzLCAxMDQsIDE0MiwgMTY2LCAxMjAsIDI0NSwgMTg3LCAyNDIgfSwKKyAgICB7IDExNCwgMTA0LCAxNDIsIDE2OCwgMTIxLCAyNDUsIDE4OCwgMjQyIH0sCisgICAgeyAxMTYsIDEwNSwgMTQzLCAxNzAsIDEyMiwgMjQ2LCAxOTAsIDI0MyB9LAorICAgIHsgMTE4LCAxMDUsIDE0MywgMTcxLCAxMjIsIDI0NiwgMTkxLCAyNDMgfSwKKyAgICB7IDEyMCwgMTA2LCAxNDMsIDE3MywgMTIzLCAyNDcsIDE5MiwgMjQ0IH0sCisgICAgeyAxMjEsIDEwNiwgMTQzLCAxNzUsIDEyNCwgMjQ3LCAxOTMsIDI0NCB9LAorICAgIHsgMTIzLCAxMDcsIDE0NCwgMTc3LCAxMjUsIDI0OCwgMTk1LCAyNDQgfSwKKyAgICB7IDEyNSwgMTA3LCAxNDQsIDE3OCwgMTI1LCAyNDgsIDE5NiwgMjQ0IH0sCisgICAgeyAxMjcsIDEwOCwgMTQ1LCAxODAsIDEyNiwgMjQ5LCAxOTcsIDI0NSB9LAorICAgIHsgMTI4LCAxMDgsIDE0NSwgMTgxLCAxMjcsIDI0OSwgMTk4LCAyNDUgfSwKKyAgICB7IDEzMCwgMTA5LCAxNDUsIDE4MywgMTI4LCAyNDksIDE5OSwgMjQ1IH0sCisgICAgeyAxMzIsIDEwOSwgMTQ1LCAxODQsIDEyOCwgMjQ5LCAyMDAsIDI0NSB9LAorICAgIHsgMTM0LCAxMTAsIDE0NiwgMTg2LCAxMjksIDI1MCwgMjAxLCAyNDYgfSwKKyAgICB7IDEzNSwgMTEwLCAxNDYsIDE4NywgMTMwLCAyNTAsIDIwMiwgMjQ2IH0sCisgICAgeyAxMzcsIDExMSwgMTQ3LCAxODksIDEzMSwgMjUxLCAyMDMsIDI0NiB9LAorICAgIHsgMTM4LCAxMTEsIDE0NywgMTkwLCAxMzEsIDI1MSwgMjA0LCAyNDYgfSwKKyAgICB7IDE0MCwgMTEyLCAxNDcsIDE5MiwgMTMyLCAyNTEsIDIwNSwgMjQ3IH0sCisgICAgeyAxNDEsIDExMiwgMTQ3LCAxOTMsIDEzMiwgMjUxLCAyMDYsIDI0NyB9LAorICAgIHsgMTQzLCAxMTMsIDE0OCwgMTk0LCAxMzMsIDI1MSwgMjA3LCAyNDcgfSwKKyAgICB7IDE0NCwgMTEzLCAxNDgsIDE5NSwgMTM0LCAyNTEsIDIwNywgMjQ3IH0sCisgICAgeyAxNDYsIDExNCwgMTQ5LCAxOTcsIDEzNSwgMjUyLCAyMDgsIDI0OCB9LAorICAgIHsgMTQ3LCAxMTQsIDE0OSwgMTk4LCAxMzUsIDI1MiwgMjA5LCAyNDggfSwKKyAgICB7IDE0OSwgMTE1LCAxNDksIDE5OSwgMTM2LCAyNTIsIDIxMCwgMjQ4IH0sCisgICAgeyAxNTAsIDExNSwgMTQ5LCAyMDAsIDEzNywgMjUyLCAyMTAsIDI0OCB9LAorICAgIHsgMTUyLCAxMTUsIDE1MCwgMjAxLCAxMzgsIDI1MiwgMjExLCAyNDggfSwKKyAgICB7IDE1MywgMTE1LCAxNTAsIDIwMiwgMTM4LCAyNTIsIDIxMiwgMjQ4IH0sCisgICAgeyAxNTUsIDExNiwgMTUxLCAyMDQsIDEzOSwgMjUzLCAyMTMsIDI0OSB9LAorICAgIHsgMTU2LCAxMTYsIDE1MSwgMjA1LCAxMzksIDI1MywgMjEzLCAyNDkgfSwKKyAgICB7IDE1OCwgMTE3LCAxNTEsIDIwNiwgMTQwLCAyNTMsIDIxNCwgMjQ5IH0sCisgICAgeyAxNTksIDExNywgMTUxLCAyMDcsIDE0MSwgMjUzLCAyMTUsIDI0OSB9LAorICAgIHsgMTYxLCAxMTgsIDE1MiwgMjA4LCAxNDIsIDI1MywgMjE2LCAyNDkgfSwKKyAgICB7IDE2MiwgMTE4LCAxNTIsIDIwOSwgMTQyLCAyNTMsIDIxNiwgMjQ5IH0sCisgICAgeyAxNjMsIDExOSwgMTUzLCAyMTAsIDE0MywgMjUzLCAyMTcsIDI0OSB9LAorICAgIHsgMTY0LCAxMTksIDE1MywgMjExLCAxNDMsIDI1MywgMjE3LCAyNDkgfSwKKyAgICB7IDE2NiwgMTIwLCAxNTMsIDIxMiwgMTQ0LCAyNTQsIDIxOCwgMjUwIH0sCisgICAgeyAxNjcsIDEyMCwgMTUzLCAyMTIsIDE0NSwgMjU0LCAyMTksIDI1MCB9LAorICAgIHsgMTY4LCAxMjEsIDE1NCwgMjEzLCAxNDYsIDI1NCwgMjIwLCAyNTAgfSwKKyAgICB7IDE2OSwgMTIxLCAxNTQsIDIxNCwgMTQ2LCAyNTQsIDIyMCwgMjUwIH0sCisgICAgeyAxNzEsIDEyMiwgMTU1LCAyMTUsIDE0NywgMjU0LCAyMjEsIDI1MCB9LAorICAgIHsgMTcyLCAxMjIsIDE1NSwgMjE2LCAxNDcsIDI1NCwgMjIxLCAyNTAgfSwKKyAgICB7IDE3MywgMTIzLCAxNTUsIDIxNywgMTQ4LCAyNTQsIDIyMiwgMjUwIH0sCisgICAgeyAxNzQsIDEyMywgMTU1LCAyMTcsIDE0OSwgMjU0LCAyMjIsIDI1MCB9LAorICAgIHsgMTc2LCAxMjQsIDE1NiwgMjE4LCAxNTAsIDI1NCwgMjIzLCAyNTAgfSwKKyAgICB7IDE3NywgMTI0LCAxNTYsIDIxOSwgMTUwLCAyNTQsIDIyMywgMjUwIH0sCisgICAgeyAxNzgsIDEyNSwgMTU3LCAyMjAsIDE1MSwgMjU0LCAyMjQsIDI1MSB9LAorICAgIHsgMTc5LCAxMjUsIDE1NywgMjIwLCAxNTEsIDI1NCwgMjI0LCAyNTEgfSwKKyAgICB7IDE4MCwgMTI2LCAxNTcsIDIyMSwgMTUyLCAyNTQsIDIyNSwgMjUxIH0sCisgICAgeyAxODEsIDEyNiwgMTU3LCAyMjEsIDE1MiwgMjU0LCAyMjUsIDI1MSB9LAorICAgIHsgMTgzLCAxMjcsIDE1OCwgMjIyLCAxNTMsIDI1NCwgMjI2LCAyNTEgfSwKKyAgICB7IDE4NCwgMTI3LCAxNTgsIDIyMywgMTU0LCAyNTQsIDIyNiwgMjUxIH0sCisgICAgeyAxODUsIDEyOCwgMTU5LCAyMjQsIDE1NSwgMjU1LCAyMjcsIDI1MSB9LAorICAgIHsgMTg2LCAxMjgsIDE1OSwgMjI0LCAxNTUsIDI1NSwgMjI3LCAyNTEgfSwKKyAgICB7IDE4NywgMTI5LCAxNjAsIDIyNSwgMTU2LCAyNTUsIDIyOCwgMjUxIH0sCisgICAgeyAxODgsIDEzMCwgMTYwLCAyMjUsIDE1NiwgMjU1LCAyMjgsIDI1MSB9LAorICAgIHsgMTg5LCAxMzEsIDE2MCwgMjI2LCAxNTcsIDI1NSwgMjI4LCAyNTEgfSwKKyAgICB7IDE5MCwgMTMxLCAxNjAsIDIyNiwgMTU4LCAyNTUsIDIyOCwgMjUxIH0sCisgICAgeyAxOTEsIDEzMiwgMTYxLCAyMjcsIDE1OSwgMjU1LCAyMjksIDI1MSB9LAorICAgIHsgMTkyLCAxMzIsIDE2MSwgMjI3LCAxNTksIDI1NSwgMjI5LCAyNTEgfSwKKyAgICB7IDE5MywgMTMzLCAxNjIsIDIyOCwgMTYwLCAyNTUsIDIzMCwgMjUyIH0sCisgICAgeyAxOTQsIDEzMywgMTYyLCAyMjksIDE2MCwgMjU1LCAyMzAsIDI1MiB9LAorICAgIHsgMTk1LCAxMzQsIDE2MywgMjMwLCAxNjEsIDI1NSwgMjMxLCAyNTIgfSwKKyAgICB7IDE5NiwgMTM0LCAxNjMsIDIzMCwgMTYxLCAyNTUsIDIzMSwgMjUyIH0sCisgICAgeyAxOTcsIDEzNSwgMTYzLCAyMzEsIDE2MiwgMjU1LCAyMzEsIDI1MiB9LAorICAgIHsgMTk4LCAxMzUsIDE2MywgMjMxLCAxNjIsIDI1NSwgMjMxLCAyNTIgfSwKKyAgICB7IDE5OSwgMTM2LCAxNjQsIDIzMiwgMTYzLCAyNTUsIDIzMiwgMjUyIH0sCisgICAgeyAyMDAsIDEzNiwgMTY0LCAyMzIsIDE2NCwgMjU1LCAyMzIsIDI1MiB9LAorICAgIHsgMjAxLCAxMzcsIDE2NSwgMjMzLCAxNjUsIDI1NSwgMjMzLCAyNTIgfSwKKyAgICB7IDIwMSwgMTM3LCAxNjUsIDIzMywgMTY1LCAyNTUsIDIzMywgMjUyIH0sCisgICAgeyAyMDIsIDEzOCwgMTY2LCAyMzMsIDE2NiwgMjU1LCAyMzMsIDI1MiB9LAorICAgIHsgMjAzLCAxMzgsIDE2NiwgMjMzLCAxNjYsIDI1NSwgMjMzLCAyNTIgfSwKKyAgICB7IDIwNCwgMTM5LCAxNjYsIDIzNCwgMTY3LCAyNTUsIDIzNCwgMjUyIH0sCisgICAgeyAyMDUsIDEzOSwgMTY2LCAyMzQsIDE2NywgMjU1LCAyMzQsIDI1MiB9LAorICAgIHsgMjA2LCAxNDAsIDE2NywgMjM1LCAxNjgsIDI1NSwgMjM1LCAyNTIgfSwKKyAgICB7IDIwNiwgMTQwLCAxNjcsIDIzNSwgMTY4LCAyNTUsIDIzNSwgMjUyIH0sCisgICAgeyAyMDcsIDE0MSwgMTY4LCAyMzYsIDE2OSwgMjU1LCAyMzUsIDI1MiB9LAorICAgIHsgMjA4LCAxNDEsIDE2OCwgMjM2LCAxNzAsIDI1NSwgMjM1LCAyNTIgfSwKKyAgICB7IDIwOSwgMTQyLCAxNjksIDIzNywgMTcxLCAyNTUsIDIzNiwgMjUyIH0sCisgICAgeyAyMDksIDE0MywgMTY5LCAyMzcsIDE3MSwgMjU1LCAyMzYsIDI1MiB9LAorICAgIHsgMjEwLCAxNDQsIDE2OSwgMjM3LCAxNzIsIDI1NSwgMjM2LCAyNTIgfSwKKyAgICB7IDIxMSwgMTQ0LCAxNjksIDIzNywgMTcyLCAyNTUsIDIzNiwgMjUyIH0sCisgICAgeyAyMTIsIDE0NSwgMTcwLCAyMzgsIDE3MywgMjU1LCAyMzcsIDI1MiB9LAorICAgIHsgMjEzLCAxNDUsIDE3MCwgMjM4LCAxNzMsIDI1NSwgMjM3LCAyNTIgfSwKKyAgICB7IDIxNCwgMTQ2LCAxNzEsIDIzOSwgMTc0LCAyNTUsIDIzNywgMjUzIH0sCisgICAgeyAyMTQsIDE0NiwgMTcxLCAyMzksIDE3NCwgMjU1LCAyMzcsIDI1MyB9LAorICAgIHsgMjE1LCAxNDcsIDE3MiwgMjQwLCAxNzUsIDI1NSwgMjM4LCAyNTMgfSwKKyAgICB7IDIxNSwgMTQ3LCAxNzIsIDI0MCwgMTc1LCAyNTUsIDIzOCwgMjUzIH0sCisgICAgeyAyMTYsIDE0OCwgMTczLCAyNDAsIDE3NiwgMjU1LCAyMzgsIDI1MyB9LAorICAgIHsgMjE3LCAxNDgsIDE3MywgMjQwLCAxNzYsIDI1NSwgMjM4LCAyNTMgfSwKKyAgICB7IDIxOCwgMTQ5LCAxNzMsIDI0MSwgMTc3LCAyNTUsIDIzOSwgMjUzIH0sCisgICAgeyAyMTgsIDE0OSwgMTczLCAyNDEsIDE3OCwgMjU1LCAyMzksIDI1MyB9LAorICAgIHsgMjE5LCAxNTAsIDE3NCwgMjQxLCAxNzksIDI1NSwgMjM5LCAyNTMgfSwKKyAgICB7IDIxOSwgMTUxLCAxNzQsIDI0MSwgMTc5LCAyNTUsIDIzOSwgMjUzIH0sCisgICAgeyAyMjAsIDE1MiwgMTc1LCAyNDIsIDE4MCwgMjU1LCAyNDAsIDI1MyB9LAorICAgIHsgMjIxLCAxNTIsIDE3NSwgMjQyLCAxODAsIDI1NSwgMjQwLCAyNTMgfSwKKyAgICB7IDIyMiwgMTUzLCAxNzYsIDI0MiwgMTgxLCAyNTUsIDI0MCwgMjUzIH0sCisgICAgeyAyMjIsIDE1MywgMTc2LCAyNDIsIDE4MSwgMjU1LCAyNDAsIDI1MyB9LAorICAgIHsgMjIzLCAxNTQsIDE3NywgMjQzLCAxODIsIDI1NSwgMjQwLCAyNTMgfSwKKyAgICB7IDIyMywgMTU0LCAxNzcsIDI0MywgMTgyLCAyNTUsIDI0MCwgMjUzIH0sCisgICAgeyAyMjQsIDE1NSwgMTc4LCAyNDQsIDE4MywgMjU1LCAyNDEsIDI1MyB9LAorICAgIHsgMjI0LCAxNTUsIDE3OCwgMjQ0LCAxODMsIDI1NSwgMjQxLCAyNTMgfSwKKyAgICB7IDIyNSwgMTU2LCAxNzgsIDI0NCwgMTg0LCAyNTUsIDI0MSwgMjUzIH0sCisgICAgeyAyMjUsIDE1NywgMTc4LCAyNDQsIDE4NCwgMjU1LCAyNDEsIDI1MyB9LAorICAgIHsgMjI2LCAxNTgsIDE3OSwgMjQ0LCAxODUsIDI1NSwgMjQyLCAyNTMgfSwKKyAgICB7IDIyNywgMTU4LCAxNzksIDI0NCwgMTg1LCAyNTUsIDI0MiwgMjUzIH0sCisgICAgeyAyMjgsIDE1OSwgMTgwLCAyNDUsIDE4NiwgMjU1LCAyNDIsIDI1MyB9LAorICAgIHsgMjI4LCAxNTksIDE4MCwgMjQ1LCAxODYsIDI1NSwgMjQyLCAyNTMgfSwKKyAgICB7IDIyOSwgMTYwLCAxODEsIDI0NSwgMTg3LCAyNTUsIDI0MiwgMjUzIH0sCisgICAgeyAyMjksIDE2MCwgMTgxLCAyNDUsIDE4NywgMjU1LCAyNDIsIDI1MyB9LAorICAgIHsgMjMwLCAxNjEsIDE4MiwgMjQ2LCAxODgsIDI1NSwgMjQzLCAyNTMgfSwKKyAgICB7IDIzMCwgMTYyLCAxODIsIDI0NiwgMTg4LCAyNTUsIDI0MywgMjUzIH0sCisgICAgeyAyMzEsIDE2MywgMTgzLCAyNDYsIDE4OSwgMjU1LCAyNDMsIDI1MyB9LAorICAgIHsgMjMxLCAxNjMsIDE4MywgMjQ2LCAxODksIDI1NSwgMjQzLCAyNTMgfSwKKyAgICB7IDIzMiwgMTY0LCAxODQsIDI0NywgMTkwLCAyNTUsIDI0MywgMjUzIH0sCisgICAgeyAyMzIsIDE2NCwgMTg0LCAyNDcsIDE5MCwgMjU1LCAyNDMsIDI1MyB9LAorICAgIHsgMjMzLCAxNjUsIDE4NSwgMjQ3LCAxOTEsIDI1NSwgMjQ0LCAyNTMgfSwKKyAgICB7IDIzMywgMTY1LCAxODUsIDI0NywgMTkxLCAyNTUsIDI0NCwgMjUzIH0sCisgICAgeyAyMzQsIDE2NiwgMTg1LCAyNDcsIDE5MiwgMjU1LCAyNDQsIDI1MyB9LAorICAgIHsgMjM0LCAxNjcsIDE4NSwgMjQ3LCAxOTIsIDI1NSwgMjQ0LCAyNTMgfSwKKyAgICB7IDIzNSwgMTY4LCAxODYsIDI0OCwgMTkzLCAyNTUsIDI0NCwgMjUzIH0sCisgICAgeyAyMzUsIDE2OCwgMTg2LCAyNDgsIDE5MywgMjU1LCAyNDQsIDI1MyB9LAorICAgIHsgMjM2LCAxNjksIDE4NywgMjQ4LCAxOTQsIDI1NSwgMjQ0LCAyNTMgfSwKKyAgICB7IDIzNiwgMTY5LCAxODcsIDI0OCwgMTk0LCAyNTUsIDI0NCwgMjUzIH0sCisgICAgeyAyMzYsIDE3MCwgMTg4LCAyNDgsIDE5NSwgMjU1LCAyNDUsIDI1MyB9LAorICAgIHsgMjM2LCAxNzAsIDE4OCwgMjQ4LCAxOTUsIDI1NSwgMjQ1LCAyNTMgfSwKKyAgICB7IDIzNywgMTcxLCAxODksIDI0OSwgMTk2LCAyNTUsIDI0NSwgMjU0IH0sCisgICAgeyAyMzcsIDE3MiwgMTg5LCAyNDksIDE5NiwgMjU1LCAyNDUsIDI1NCB9LAorICAgIHsgMjM4LCAxNzMsIDE5MCwgMjQ5LCAxOTcsIDI1NSwgMjQ1LCAyNTQgfSwKKyAgICB7IDIzOCwgMTczLCAxOTAsIDI0OSwgMTk3LCAyNTUsIDI0NSwgMjU0IH0sCisgICAgeyAyMzksIDE3NCwgMTkxLCAyNDksIDE5OCwgMjU1LCAyNDUsIDI1NCB9LAorICAgIHsgMjM5LCAxNzQsIDE5MSwgMjQ5LCAxOTgsIDI1NSwgMjQ1LCAyNTQgfSwKKyAgICB7IDI0MCwgMTc1LCAxOTIsIDI0OSwgMTk5LCAyNTUsIDI0NiwgMjU0IH0sCisgICAgeyAyNDAsIDE3NiwgMTkyLCAyNDksIDE5OSwgMjU1LCAyNDYsIDI1NCB9LAorICAgIHsgMjQwLCAxNzcsIDE5MywgMjUwLCAyMDAsIDI1NSwgMjQ2LCAyNTQgfSwKKyAgICB7IDI0MCwgMTc3LCAxOTMsIDI1MCwgMjAwLCAyNTUsIDI0NiwgMjU0IH0sCisgICAgeyAyNDEsIDE3OCwgMTk0LCAyNTAsIDIwMSwgMjU1LCAyNDYsIDI1NCB9LAorICAgIHsgMjQxLCAxNzgsIDE5NCwgMjUwLCAyMDEsIDI1NSwgMjQ2LCAyNTQgfSwKKyAgICB7IDI0MiwgMTc5LCAxOTUsIDI1MCwgMjAyLCAyNTUsIDI0NiwgMjU0IH0sCisgICAgeyAyNDIsIDE4MCwgMTk1LCAyNTAsIDIwMiwgMjU1LCAyNDYsIDI1NCB9LAorICAgIHsgMjQyLCAxODEsIDE5NiwgMjUwLCAyMDMsIDI1NSwgMjQ3LCAyNTQgfSwKKyAgICB7IDI0MiwgMTgxLCAxOTYsIDI1MCwgMjAzLCAyNTUsIDI0NywgMjU0IH0sCisgICAgeyAyNDMsIDE4MiwgMTk3LCAyNTEsIDIwNCwgMjU1LCAyNDcsIDI1NCB9LAorICAgIHsgMjQzLCAxODMsIDE5NywgMjUxLCAyMDQsIDI1NSwgMjQ3LCAyNTQgfSwKKyAgICB7IDI0NCwgMTg0LCAxOTgsIDI1MSwgMjA1LCAyNTUsIDI0NywgMjU0IH0sCisgICAgeyAyNDQsIDE4NCwgMTk4LCAyNTEsIDIwNSwgMjU1LCAyNDcsIDI1NCB9LAorICAgIHsgMjQ0LCAxODUsIDE5OSwgMjUxLCAyMDYsIDI1NSwgMjQ3LCAyNTQgfSwKKyAgICB7IDI0NCwgMTg1LCAxOTksIDI1MSwgMjA2LCAyNTUsIDI0NywgMjU0IH0sCisgICAgeyAyNDUsIDE4NiwgMjAwLCAyNTEsIDIwNywgMjU1LCAyNDcsIDI1NCB9LAorICAgIHsgMjQ1LCAxODcsIDIwMCwgMjUxLCAyMDcsIDI1NSwgMjQ3LCAyNTQgfSwKKyAgICB7IDI0NiwgMTg4LCAyMDEsIDI1MiwgMjA3LCAyNTUsIDI0OCwgMjU0IH0sCisgICAgeyAyNDYsIDE4OCwgMjAxLCAyNTIsIDIwNywgMjU1LCAyNDgsIDI1NCB9LAorICAgIHsgMjQ2LCAxODksIDIwMiwgMjUyLCAyMDgsIDI1NSwgMjQ4LCAyNTQgfSwKKyAgICB7IDI0NiwgMTkwLCAyMDIsIDI1MiwgMjA4LCAyNTUsIDI0OCwgMjU0IH0sCisgICAgeyAyNDcsIDE5MSwgMjAzLCAyNTIsIDIwOSwgMjU1LCAyNDgsIDI1NCB9LAorICAgIHsgMjQ3LCAxOTEsIDIwMywgMjUyLCAyMDksIDI1NSwgMjQ4LCAyNTQgfSwKKyAgICB7IDI0NywgMTkyLCAyMDQsIDI1MiwgMjEwLCAyNTUsIDI0OCwgMjU0IH0sCisgICAgeyAyNDcsIDE5MywgMjA0LCAyNTIsIDIxMCwgMjU1LCAyNDgsIDI1NCB9LAorICAgIHsgMjQ4LCAxOTQsIDIwNSwgMjUyLCAyMTEsIDI1NSwgMjQ4LCAyNTQgfSwKKyAgICB7IDI0OCwgMTk0LCAyMDUsIDI1MiwgMjExLCAyNTUsIDI0OCwgMjU0IH0sCisgICAgeyAyNDgsIDE5NSwgMjA2LCAyNTIsIDIxMiwgMjU1LCAyNDksIDI1NCB9LAorICAgIHsgMjQ4LCAxOTYsIDIwNiwgMjUyLCAyMTIsIDI1NSwgMjQ5LCAyNTQgfSwKKyAgICB7IDI0OSwgMTk3LCAyMDcsIDI1MywgMjEzLCAyNTUsIDI0OSwgMjU0IH0sCisgICAgeyAyNDksIDE5NywgMjA3LCAyNTMsIDIxMywgMjU1LCAyNDksIDI1NCB9LAorICAgIHsgMjQ5LCAxOTgsIDIwOCwgMjUzLCAyMTQsIDI1NSwgMjQ5LCAyNTQgfSwKKyAgICB7IDI0OSwgMTk5LCAyMDksIDI1MywgMjE0LCAyNTUsIDI0OSwgMjU0IH0sCisgICAgeyAyNTAsIDIwMCwgMjEwLCAyNTMsIDIxNSwgMjU1LCAyNDksIDI1NCB9LAorICAgIHsgMjUwLCAyMDAsIDIxMCwgMjUzLCAyMTUsIDI1NSwgMjQ5LCAyNTQgfSwKKyAgICB7IDI1MCwgMjAxLCAyMTEsIDI1MywgMjE1LCAyNTUsIDI0OSwgMjU0IH0sCisgICAgeyAyNTAsIDIwMiwgMjExLCAyNTMsIDIxNSwgMjU1LCAyNDksIDI1NCB9LAorICAgIHsgMjUwLCAyMDMsIDIxMiwgMjUzLCAyMTYsIDI1NSwgMjQ5LCAyNTQgfSwKKyAgICB7IDI1MCwgMjAzLCAyMTIsIDI1MywgMjE2LCAyNTUsIDI0OSwgMjU0IH0sCisgICAgeyAyNTEsIDIwNCwgMjEzLCAyNTMsIDIxNywgMjU1LCAyNTAsIDI1NCB9LAorICAgIHsgMjUxLCAyMDUsIDIxMywgMjUzLCAyMTcsIDI1NSwgMjUwLCAyNTQgfSwKKyAgICB7IDI1MSwgMjA2LCAyMTQsIDI1NCwgMjE4LCAyNTUsIDI1MCwgMjU0IH0sCisgICAgeyAyNTEsIDIwNiwgMjE1LCAyNTQsIDIxOCwgMjU1LCAyNTAsIDI1NCB9LAorICAgIHsgMjUyLCAyMDcsIDIxNiwgMjU0LCAyMTksIDI1NSwgMjUwLCAyNTQgfSwKKyAgICB7IDI1MiwgMjA4LCAyMTYsIDI1NCwgMjE5LCAyNTUsIDI1MCwgMjU0IH0sCisgICAgeyAyNTIsIDIwOSwgMjE3LCAyNTQsIDIyMCwgMjU1LCAyNTAsIDI1NCB9LAorICAgIHsgMjUyLCAyMTAsIDIxNywgMjU0LCAyMjAsIDI1NSwgMjUwLCAyNTQgfSwKKyAgICB7IDI1MiwgMjExLCAyMTgsIDI1NCwgMjIxLCAyNTUsIDI1MCwgMjU0IH0sCisgICAgeyAyNTIsIDIxMiwgMjE4LCAyNTQsIDIyMSwgMjU1LCAyNTAsIDI1NCB9LAorICAgIHsgMjUzLCAyMTMsIDIxOSwgMjU0LCAyMjIsIDI1NSwgMjUwLCAyNTQgfSwKKyAgICB7IDI1MywgMjEzLCAyMjAsIDI1NCwgMjIyLCAyNTUsIDI1MCwgMjU0IH0sCisgICAgeyAyNTMsIDIxNCwgMjIxLCAyNTQsIDIyMywgMjU1LCAyNTAsIDI1NCB9LAorICAgIHsgMjUzLCAyMTUsIDIyMSwgMjU0LCAyMjMsIDI1NSwgMjUwLCAyNTQgfSwKKyAgICB7IDI1MywgMjE2LCAyMjIsIDI1NCwgMjI0LCAyNTUsIDI1MSwgMjU0IH0sCisgICAgeyAyNTMsIDIxNywgMjIzLCAyNTQsIDIyNCwgMjU1LCAyNTEsIDI1NCB9LAorICAgIHsgMjUzLCAyMTgsIDIyNCwgMjU0LCAyMjUsIDI1NSwgMjUxLCAyNTQgfSwKKyAgICB7IDI1MywgMjE5LCAyMjQsIDI1NCwgMjI1LCAyNTUsIDI1MSwgMjU0IH0sCisgICAgeyAyNTQsIDIyMCwgMjI1LCAyNTQsIDIyNSwgMjU1LCAyNTEsIDI1NCB9LAorICAgIHsgMjU0LCAyMjEsIDIyNiwgMjU0LCAyMjUsIDI1NSwgMjUxLCAyNTQgfSwKKyAgICB7IDI1NCwgMjIyLCAyMjcsIDI1NSwgMjI2LCAyNTUsIDI1MSwgMjU0IH0sCisgICAgeyAyNTQsIDIyMywgMjI3LCAyNTUsIDIyNiwgMjU1LCAyNTEsIDI1NCB9LAorICAgIHsgMjU0LCAyMjQsIDIyOCwgMjU1LCAyMjcsIDI1NSwgMjUxLCAyNTQgfSwKKyAgICB7IDI1NCwgMjI1LCAyMjksIDI1NSwgMjI3LCAyNTUsIDI1MSwgMjU0IH0sCisgICAgeyAyNTQsIDIyNiwgMjMwLCAyNTUsIDIyOCwgMjU1LCAyNTEsIDI1NCB9LAorICAgIHsgMjU0LCAyMjcsIDIzMCwgMjU1LCAyMjksIDI1NSwgMjUxLCAyNTQgfSwKKyAgICB7IDI1NSwgMjI4LCAyMzEsIDI1NSwgMjMwLCAyNTUsIDI1MSwgMjU0IH0sCisgICAgeyAyNTUsIDIyOSwgMjMyLCAyNTUsIDIzMCwgMjU1LCAyNTEsIDI1NCB9LAorICAgIHsgMjU1LCAyMzAsIDIzMywgMjU1LCAyMzEsIDI1NSwgMjUyLCAyNTQgfSwKKyAgICB7IDI1NSwgMjMxLCAyMzQsIDI1NSwgMjMxLCAyNTUsIDI1MiwgMjU0IH0sCisgICAgeyAyNTUsIDIzMiwgMjM1LCAyNTUsIDIzMiwgMjU1LCAyNTIsIDI1NCB9LAorICAgIHsgMjU1LCAyMzMsIDIzNiwgMjU1LCAyMzIsIDI1NSwgMjUyLCAyNTQgfSwKKyAgICB7IDI1NSwgMjM1LCAyMzcsIDI1NSwgMjMzLCAyNTUsIDI1MiwgMjU0IH0sCisgICAgeyAyNTUsIDIzNiwgMjM4LCAyNTUsIDIzNCwgMjU1LCAyNTIsIDI1NCB9LAorICAgIHsgMjU1LCAyMzgsIDI0MCwgMjU1LCAyMzUsIDI1NSwgMjUyLCAyNTUgfSwKKyAgICB7IDI1NSwgMjM5LCAyNDEsIDI1NSwgMjM1LCAyNTUsIDI1MiwgMjU0IH0sCisgICAgeyAyNTUsIDI0MSwgMjQzLCAyNTUsIDIzNiwgMjU1LCAyNTIsIDI1NCB9LAorICAgIHsgMjU1LCAyNDMsIDI0NSwgMjU1LCAyMzcsIDI1NSwgMjUyLCAyNTQgfSwKKyAgICB7IDI1NSwgMjQ2LCAyNDcsIDI1NSwgMjM5LCAyNTUsIDI1MywgMjU1IH0sCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCB5X21vZGVbNF1bOV07CisgICAgdWludDhfdCB1dl9tb2RlWzEwXVs5XTsKKyAgICB1aW50OF90IGZpbHRlcls0XVsyXTsKKyAgICB1aW50OF90IG12X21vZGVbN11bM107CisgICAgdWludDhfdCBpbnRyYVs0XTsKKyAgICB1aW50OF90IGNvbXBbNV07CisgICAgdWludDhfdCBzaW5nbGVfcmVmWzVdWzJdOworICAgIHVpbnQ4X3QgY29tcF9yZWZbNV07CisgICAgdWludDhfdCB0eDMycFsyXVszXTsKKyAgICB1aW50OF90IHR4MTZwWzJdWzJdOworICAgIHVpbnQ4X3QgdHg4cFsyXTsKKyAgICB1aW50OF90IHNraXBbM107CisgICAgdWludDhfdCBtdl9qb2ludFszXTsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50OF90IHNpZ247CisgICAgICAgIHVpbnQ4X3QgY2xhc3Nlc1sxMF07CisgICAgICAgIHVpbnQ4X3QgY2xhc3MwOworICAgICAgICB1aW50OF90IGJpdHNbMTBdOworICAgICAgICB1aW50OF90IGNsYXNzMF9mcFsyXVszXTsKKyAgICAgICAgdWludDhfdCBmcFszXTsKKyAgICAgICAgdWludDhfdCBjbGFzczBfaHA7CisgICAgICAgIHVpbnQ4X3QgaHA7CisgICAgfSBtdl9jb21wWzJdOworICAgIHVpbnQ4X3QgcGFydGl0aW9uWzRdWzRdWzNdOworfSBwcm9iX2NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBwcm9iX2NvbnRleHQgdnA5X2RlZmF1bHRfcHJvYnMgPSB7CisgICAgeyAvKiB5X21vZGUgKi8KKyAgICAgICAgeyAgNjUsICAzMiwgIDE4LCAxNDQsIDE2MiwgMTk0LCAgNDEsICA1MSwgIDk4IH0gLyogYnNpemUgPCA4eDggKi8sCisgICAgICAgIHsgMTMyLCAgNjgsICAxOCwgMTY1LCAyMTcsIDE5NiwgIDQ1LCAgNDAsICA3OCB9IC8qIGJzaXplIDwgMTZ4MTYgKi8sCisgICAgICAgIHsgMTczLCAgODAsICAxOSwgMTc2LCAyNDAsIDE5MywgIDY0LCAgMzUsICA0NiB9IC8qIGJzaXplIDwgMzJ4MzIgKi8sCisgICAgICAgIHsgMjIxLCAxMzUsICAzOCwgMTk0LCAyNDgsIDEyMSwgIDk2LCAgODUsICAyOSB9IC8qIGJzaXplID49IDMyeDMyICovCisgICAgfSwgeyAvKiB1dl9tb2RlICovCisgICAgICAgIHsgIDQ4LCAgMTIsIDE1NCwgMTU1LCAxMzksICA5MCwgIDM0LCAxMTcsIDExOSB9IC8qIHkgPSB2ICovLAorICAgICAgICB7ICA2NywgICA2LCAgMjUsIDIwNCwgMjQzLCAxNTgsICAxMywgIDIxLCAgOTYgfSAvKiB5ID0gaCAqLywKKyAgICAgICAgeyAxMjAsICAgNywgIDc2LCAxNzYsIDIwOCwgMTI2LCAgMjgsICA1NCwgMTAzIH0gLyogeSA9IGRjICovLAorICAgICAgICB7ICA5NywgICA1LCAgNDQsIDEzMSwgMTc2LCAxMzksICA0OCwgIDY4LCAgOTcgfSAvKiB5ID0gZDQ1ICovLAorICAgICAgICB7ICA4MywgICA1LCAgNDIsIDE1NiwgMTExLCAxNTIsICAyNiwgIDQ5LCAxNTIgfSAvKiB5ID0gZDEzNSAqLywKKyAgICAgICAgeyAgODAsICAgNSwgIDU4LCAxNzgsICA3NCwgIDgzLCAgMzMsICA2MiwgMTQ1IH0gLyogeSA9IGQxMTcgKi8sCisgICAgICAgIHsgIDg2LCAgIDUsICAzMiwgMTU0LCAxOTIsIDE2OCwgIDE0LCAgMjIsIDE2MyB9IC8qIHkgPSBkMTUzICovLAorICAgICAgICB7ICA3NywgICA3LCAgNjQsIDExNiwgMTMyLCAxMjIsICAzNywgMTI2LCAxMjAgfSAvKiB5ID0gZDYzICovLAorICAgICAgICB7ICA4NSwgICA1LCAgMzIsIDE1NiwgMjE2LCAxNDgsICAxOSwgIDI5LCAgNzMgfSAvKiB5ID0gZDI3ICovLAorICAgICAgICB7IDEwMSwgIDIxLCAxMDcsIDE4MSwgMTkyLCAxMDMsICAxOSwgIDY3LCAxMjUgfSAvKiB5ID0gdG0gKi8KKyAgICB9LCB7IC8qIGZpbHRlciAqLworICAgICAgICB7IDIzNSwgMTYyLCB9LAorICAgICAgICB7ICAzNiwgMjU1LCB9LAorICAgICAgICB7ICAzNCwgICAzLCB9LAorICAgICAgICB7IDE0OSwgMTQ0LCB9LAorICAgIH0sIHsgLyogbXZfbW9kZSAqLworICAgICAgICB7ICAyLCAxNzMsICAzNH0sICAvLyAwID0gYm90aCB6ZXJvIG12CisgICAgICAgIHsgIDcsIDE0NSwgIDg1fSwgIC8vIDEgPSBvbmUgemVybyBtdiArIG9uZSBhIHByZWRpY3RlZCBtdgorICAgICAgICB7ICA3LCAxNjYsICA2M30sICAvLyAyID0gdHdvIHByZWRpY3RlZCBtdnMKKyAgICAgICAgeyAgNywgIDk0LCAgNjZ9LCAgLy8gMyA9IG9uZSBwcmVkaWN0ZWQvemVybyBhbmQgb25lIG5ldyBtdgorICAgICAgICB7ICA4LCAgNjQsICA0Nn0sICAvLyA0ID0gdHdvIG5ldyBtdnMKKyAgICAgICAgeyAxNywgIDgxLCAgMzF9LCAgLy8gNSA9IG9uZSBpbnRyYSBuZWlnaGJvdXIgKyB4CisgICAgICAgIHsgMjUsICAyOSwgIDMwfSwgIC8vIDYgPSB0d28gaW50cmEgbmVpZ2hib3VycworICAgIH0sIHsgLyogaW50cmEgKi8KKyAgICAgICAgOSwgMTAyLCAxODcsIDIyNQorICAgIH0sIHsgLyogY29tcCAqLworICAgICAgICAyMzksIDE4MywgMTE5LCAgOTYsICA0MQorICAgIH0sIHsgLyogc2luZ2xlX3JlZiAqLworICAgICAgICB7ICAzMywgIDE2IH0sCisgICAgICAgIHsgIDc3LCAgNzQgfSwKKyAgICAgICAgeyAxNDIsIDE0MiB9LAorICAgICAgICB7IDE3MiwgMTcwIH0sCisgICAgICAgIHsgMjM4LCAyNDcgfQorICAgIH0sIHsgLyogY29tcF9yZWYgKi8KKyAgICAgICAgNTAsIDEyNiwgMTIzLCAyMjEsIDIyNgorICAgIH0sIHsgLyogdHgzMnAgKi8KKyAgICAgICAgeyAzLCAxMzYsIDM3LCB9LAorICAgICAgICB7IDUsICA1MiwgMTMsIH0sCisgICAgfSwgeyAvKiB0eDE2cCAqLworICAgICAgICB7IDIwLCAxNTIsIH0sCisgICAgICAgIHsgMTUsIDEwMSwgfSwKKyAgICB9LCB7IC8qIHR4OHAgKi8KKyAgICAgICAgMTAwLCA2NgorICAgIH0sIHsgLyogc2tpcCAqLworICAgICAgICAxOTIsIDEyOCwgNjQKKyAgICB9LCB7IC8qIG12X2pvaW50ICovCisgICAgICAgIDMyLCA2NCwgOTYKKyAgICB9LCB7CisgICAgICAgIHsgLyogbXYgdmVydGljYWwgY29tcG9uZW50ICovCisgICAgICAgICAgICAxMjgsIC8qIHNpZ24gKi8KKyAgICAgICAgICAgIHsgMjI0LCAxNDQsIDE5MiwgMTY4LCAxOTIsIDE3NiwgMTkyLCAxOTgsIDE5OCwgMjQ1IH0sIC8qIGNsYXNzICovCisgICAgICAgICAgICAyMTYsIC8qIGNsYXNzMCAqLworICAgICAgICAgICAgeyAxMzYsIDE0MCwgMTQ4LCAxNjAsIDE3NiwgMTkyLCAyMjQsIDIzNCwgMjM0LCAyNDB9LCAvKiBiaXRzICovCisgICAgICAgICAgICB7IC8qIGNsYXNzMF9mcCAqLworICAgICAgICAgICAgICAgIHsgMTI4LCAxMjgsIDY0IH0sCisgICAgICAgICAgICAgICAgeyAgOTYsIDExMiwgNjQgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsgNjQsIDk2LCA2NCB9LCAvKiBmcCAqLworICAgICAgICAgICAgMTYwLCAvKiBjbGFzczBfaHAgYml0ICovCisgICAgICAgICAgICAxMjgsIC8qIGhwICovCisgICAgICAgIH0sIHsgLyogbXYgaG9yaXpvbnRhbCBjb21wb25lbnQgKi8KKyAgICAgICAgICAgIDEyOCwgLyogc2lnbiAqLworICAgICAgICAgICAgeyAyMTYsIDEyOCwgMTc2LCAxNjAsIDE3NiwgMTc2LCAxOTIsIDE5OCwgMTk4LCAyMDggfSwgLyogY2xhc3MgKi8KKyAgICAgICAgICAgIDIwOCwgLyogY2xhc3MwICovCisgICAgICAgICAgICB7IDEzNiwgMTQwLCAxNDgsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjM0LCAyMzQsIDI0MCB9LCAvKiBiaXRzICovCisgICAgICAgICAgICB7IC8qIGNsYXNzMF9mcCAqLworICAgICAgICAgICAgICAgIHsgMTI4LCAxMjgsIDY0IH0sCisgICAgICAgICAgICAgICAgeyAgOTYsIDExMiwgNjQgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsgNjQsIDk2LCA2NCB9LCAvKiBmcCAqLworICAgICAgICAgICAgMTYwLCAvKiBjbGFzczBfaHAgYml0ICovCisgICAgICAgICAgICAxMjgsIC8qIGhwICovCisgICAgICAgIH0KKyAgICB9LCB7IC8qIHBhcnRpdGlvbiAqLworICAgICAgICB7IC8qIDY0eDY0IC0+IDMyeDMyICovCisgICAgICAgICAgICB7IDIyMiwgIDM0LCAgMzAgfSAvKiBhL2wgYm90aCBub3Qgc3BsaXQgKi8sCisgICAgICAgICAgICB7ICA3MiwgIDE2LCAgNDQgfSAvKiBhIHNwbGl0LCBsIG5vdCBzcGxpdCAqLywKKyAgICAgICAgICAgIHsgIDU4LCAgMzIsICAxMiB9IC8qIGwgc3BsaXQsIGEgbm90IHNwbGl0ICovLAorICAgICAgICAgICAgeyAgMTAsICAgNywgICA2IH0gLyogYS9sIGJvdGggc3BsaXQgKi8sCisgICAgICAgIH0sIHsgLyogMzJ4MzIgLT4gMTZ4MTYgKi8KKyAgICAgICAgICAgIHsgMTc3LCAgNTgsICA1OSB9IC8qIGEvbCBib3RoIG5vdCBzcGxpdCAqLywKKyAgICAgICAgICAgIHsgIDY4LCAgMjYsICA2MyB9IC8qIGEgc3BsaXQsIGwgbm90IHNwbGl0ICovLAorICAgICAgICAgICAgeyAgNTIsICA3OSwgIDI1IH0gLyogbCBzcGxpdCwgYSBub3Qgc3BsaXQgKi8sCisgICAgICAgICAgICB7ICAxNywgIDE0LCAgMTIgfSAvKiBhL2wgYm90aCBzcGxpdCAqLywKKyAgICAgICAgfSwgeyAvKiAxNngxNiAtPiA4eDggKi8KKyAgICAgICAgICAgIHsgMTc0LCAgNzMsICA4NyB9IC8qIGEvbCBib3RoIG5vdCBzcGxpdCAqLywKKyAgICAgICAgICAgIHsgIDkyLCAgNDEsICA4MyB9IC8qIGEgc3BsaXQsIGwgbm90IHNwbGl0ICovLAorICAgICAgICAgICAgeyAgODIsICA5OSwgIDUwIH0gLyogbCBzcGxpdCwgYSBub3Qgc3BsaXQgKi8sCisgICAgICAgICAgICB7ICA1MywgIDM5LCAgMzkgfSAvKiBhL2wgYm90aCBzcGxpdCAqLywKKyAgICAgICAgfSwgeyAvKiA4eDggLT4gNHg0ICovCisgICAgICAgICAgICB7IDE5OSwgMTIyLCAxNDEgfSAvKiBhL2wgYm90aCBub3Qgc3BsaXQgKi8sCisgICAgICAgICAgICB7IDE0NywgIDYzLCAxNTkgfSAvKiBhIHNwbGl0LCBsIG5vdCBzcGxpdCAqLywKKyAgICAgICAgICAgIHsgMTQ4LCAxMzMsIDExOCB9IC8qIGwgc3BsaXQsIGEgbm90IHNwbGl0ICovLAorICAgICAgICAgICAgeyAxMjEsIDEwNCwgMTE0IH0gLyogYS9sIGJvdGggc3BsaXQgKi8sCisgICAgICAgIH0KKyAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA5X2RlZmF1bHRfY29lZl9wcm9ic1s0XVsyXVsyXVs2XVs2XVszXSA9IHsKKyAgICB7IC8qIHR4ID0gNHg0ICovCisgICAgICAgIHsgLyogYmxvY2sgVHlwZSAwICovCisgICAgICAgICAgICB7IC8qIEludHJhICovCisgICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAxOTUsICAyOSwgMTgzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDg0LCAgNDksIDEzNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgOCwgIDQyLCAgNzEgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCisgICAgICAgICAgICAgICAgICAgIHsgIDMxLCAxMDcsIDE2OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzNSwgIDk5LCAxNTkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTcsICA4MiwgMTQwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA4LCAgNjYsIDExNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDQ0LCAgNzYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOSwgIDMyIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLworICAgICAgICAgICAgICAgICAgICB7ICA0MCwgMTMyLCAyMDEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjksIDExNCwgMTg3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEzLCAgOTEsIDE1NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNywgIDc1LCAxMjcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA1OCwgIDk1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjgsICA0NyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNjksIDE0MiwgMjIxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDQyLCAxMjIsIDIwMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNSwgIDkxLCAxNTkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDYsICA2NywgMTIxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDIsICA3NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMzEgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCisgICAgICAgICAgICAgICAgICAgIHsgMTAyLCAxNDgsIDIyOCB9LAorICAgICAgICAgICAgICAgICAgICB7ICA2NywgMTE3LCAyMDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTcsICA4MiwgMTU0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA2LCAgNTksIDExNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDM5LCAgNzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNSwgIDI5IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLworICAgICAgICAgICAgICAgICAgICB7IDE1NiwgIDU3LCAyMzMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxMTksICA1NywgMjEyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDU4LCAgNDgsIDE2MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyOSwgIDQwLCAxMjQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTIsICAzMCwgIDgxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAgMTIsICAzMSB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgeyAvKiBJbnRlciAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgMTkxLCAxMDcsIDIyNiB9LAorICAgICAgICAgICAgICAgICAgICB7IDEyNCwgMTE3LCAyMDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjUsICA5OSwgMTU1IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7ICAyOSwgMTQ4LCAyMTAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMzcsIDEyNiwgMTk0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA4LCAgOTMsIDE1NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDY4LCAxMTggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzOSwgIDY5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTcsICAzMyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNDEsIDE1MSwgMjEzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI3LCAxMjMsIDE5MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDgyLCAxNDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1OCwgMTA1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzIsICA2MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEzLCAgMjYgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDU5LCAxNTksIDIyMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyMywgMTI2LCAxOTggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDQsICA4OCwgMTUxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjYsIDExNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM4LCAgNzEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOCwgIDM0IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7IDExNCwgMTM2LCAyMzIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNTEsIDExNCwgMjA3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDExLCAgODMsIDE1NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDU2LCAxMDUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMywgIDY1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTcsICAzNCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAxNDksICA2NSwgMjM0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTIxLCAgNTcsIDIxNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICA2MSwgIDQ5LCAxNjYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjgsICAzNiwgMTE0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEyLCAgMjUsICA3NiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDE2LCAgNDIgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgeyAvKiBibG9jayBUeXBlIDEgKi8KKyAgICAgICAgICAgIHsgLyogSW50cmEgKi8KKyAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLworICAgICAgICAgICAgICAgICAgICB7IDIxNCwgIDQ5LCAyMjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxMzIsICA2MywgMTg4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDQyLCAgNjUsIDEzNyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgODUsIDEzNywgMjIxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTA0LCAxMzEsIDIxNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICA0OSwgMTExLCAxOTIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjEsICA4NywgMTU1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNDksICA4NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE2LCAgMjggfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCisgICAgICAgICAgICAgICAgICAgIHsgIDg5LCAxNjMsIDIzMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICA5MCwgMTM3LCAyMjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjksIDEwMCwgMTgzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEwLCAgNzAsIDEzNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDQyLCAgODEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNywgIDMzIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLworICAgICAgICAgICAgICAgICAgICB7IDEwOCwgMTY3LCAyMzcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNTUsIDEzMywgMjIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE1LCAgOTcsIDE3OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDcyLCAxMzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0NSwgIDg1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTksICAzOCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAxMjQsIDE0NiwgMjQwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDY2LCAxMjQsIDIyNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNywgIDg4LCAxNzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDQsICA1OCwgMTIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzYsICA3NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE4LCAgMzcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCisgICAgICAgICAgICAgICAgICAgIHsgMTQxLCAgNzksIDI0MSB9LAorICAgICAgICAgICAgICAgICAgICB7IDEyNiwgIDcwLCAyMjcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNjYsICA1OCwgMTgyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDMwLCAgNDQsIDEzNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMiwgIDM0LCAgOTYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICAyMCwgIDQ3IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCB7IC8qIEludGVyICovCisgICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAyMjksICA5OSwgMjQ5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTQzLCAxMTEsIDIzNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICA0NiwgMTA5LCAxOTIgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCisgICAgICAgICAgICAgICAgICAgIHsgIDgyLCAxNTgsIDIzNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICA5NCwgMTQ2LCAyMjQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjUsIDExNywgMTkxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA5LCAgODcsIDE0OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDU2LCAgOTkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMywgIDU3IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLworICAgICAgICAgICAgICAgICAgICB7ICA4MywgMTY3LCAyMzcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNjgsIDE0NSwgMjIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEwLCAxMDMsIDE3NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDcyLCAxMzEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MSwgIDc5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjAsICAzOSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgOTksIDE2NywgMjM5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDQ3LCAxNDEsIDIyNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMCwgMTA0LCAxNzggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA3MywgMTMzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDQsICA4NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDIyLCAgNDcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCisgICAgICAgICAgICAgICAgICAgIHsgMTI3LCAxNDUsIDI0MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICA3MSwgMTI5LCAyMjggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTcsICA5MywgMTc3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAgNjEsIDEyNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQxLCAgODQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAyMSwgIDUyIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLworICAgICAgICAgICAgICAgICAgICB7IDE1NywgIDc4LCAyNDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxNDAsICA3MiwgMjMxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDY5LCAgNTgsIDE4NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzMSwgIDQ0LCAxMzcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTQsICAzOCwgMTA1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA4LCAgMjMsICA2MSB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwgeyAvKiB0eCA9IDh4OCAqLworICAgICAgICB7IC8qIGJsb2NrIFR5cGUgMCAqLworICAgICAgICAgICAgeyAvKiBJbnRyYSAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgMTI1LCAgMzQsIDE4NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICA1MiwgIDQxLCAxMzMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDYsICAzMSwgIDU2IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7ICAzNywgMTA5LCAxNTMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNTEsIDEwMiwgMTQ3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDIzLCAgODcsIDEyOCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgOCwgIDY3LCAxMDEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MSwgIDYzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTksICAyOSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMzEsIDE1NCwgMTg1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE3LCAxMjcsIDE3NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNiwgIDk2LCAxNDUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA3MywgMTE0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTEsICA4MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDI4LCAgNDUgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDIzLCAxNjMsIDIwMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMCwgMTMxLCAxODUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA5MywgMTQ4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjcsIDExMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQxLCAgNjkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDI0IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICAyOSwgMTc2LCAyMTcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTIsIDE0NSwgMjAxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAxMDEsIDE1NiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDY5LCAxMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzOSwgIDYzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTQsICAyMyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNTcsIDE5MiwgMjMzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI1LCAxNTQsIDIxNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNiwgMTA5LCAxNjcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA3OCwgMTE4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDgsICA2OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDIxLCAgMjkgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIHsgLyogSW50ZXIgKi8KKyAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLworICAgICAgICAgICAgICAgICAgICB7IDIwMiwgMTA1LCAyNDUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxMDgsIDEwNiwgMjE2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE4LCAgOTAsIDE0NCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMzMsIDE3MiwgMjE5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDY0LCAxNDksIDIwNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNCwgMTE3LCAxNzcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDUsICA5MCwgMTQxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNjEsICA5NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM3LCAgNTcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCisgICAgICAgICAgICAgICAgICAgIHsgIDMzLCAxNzksIDIyMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMSwgMTQwLCAxOTggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4OSwgMTQ4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjAsIDEwNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMzLCAgNTcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMiwgIDIxIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLworICAgICAgICAgICAgICAgICAgICB7ICAzMCwgMTgxLCAyMjEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDgsIDE0MSwgMTk4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgODcsIDE0NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDU4LCAxMDAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMSwgIDU1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTIsICAyMCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMzIsIDE4NiwgMjI0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA3LCAxNDIsIDE5OCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDg2LCAxNDMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1OCwgMTAwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzEsICA1NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEyLCAgMjIgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDU3LCAxOTIsIDIyNyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyMCwgMTQzLCAyMDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA5NiwgMTU0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjgsIDExMiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQyLCAgNjkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOSwgIDMyIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sIHsgLyogYmxvY2sgVHlwZSAxICovCisgICAgICAgICAgICB7IC8qIEludHJhICovCisgICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAyMTIsICAzNSwgMjE1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTEzLCAgNDcsIDE2OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyOSwgIDQ4LCAxMDUgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCisgICAgICAgICAgICAgICAgICAgIHsgIDc0LCAxMjksIDIwMyB9LAorICAgICAgICAgICAgICAgICAgICB7IDEwNiwgMTIwLCAyMDMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDksIDEwNywgMTc4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE5LCAgODQsIDE0NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDUwLCAgODQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNSwgIDI1IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLworICAgICAgICAgICAgICAgICAgICB7ICA3MSwgMTcyLCAyMTcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDQsIDE0MSwgMjA5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE1LCAxMDIsIDE3MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNiwgIDc2LCAxMzMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA1MSwgIDg5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjQsICA0MiB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNjQsIDE4NSwgMjMxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDMxLCAxNDgsIDIxNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgOCwgMTAzLCAxNzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA3NCwgMTMxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDYsICA4MSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE4LCAgMzAgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDY1LCAxOTYsIDIzNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyNSwgMTU3LCAyMjEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDUsIDEwNSwgMTc0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjcsIDEyMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM4LCAgNjkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNSwgIDMwIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLworICAgICAgICAgICAgICAgICAgICB7ICA2NSwgMjA0LCAyMzggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMzAsIDE1NiwgMjI0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA3LCAxMDcsIDE3NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDcwLCAxMjQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MiwgIDczIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTgsICAzNCB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgeyAvKiBJbnRlciAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgMjI1LCAgODYsIDI1MSB9LAorICAgICAgICAgICAgICAgICAgICB7IDE0NCwgMTA0LCAyMzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDIsICA5OSwgMTgxIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7ICA4NSwgMTc1LCAyMzkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxMTIsIDE2NSwgMjI5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI5LCAxMzYsIDIwMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMiwgMTAzLCAxNjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDYsICA3NywgMTIzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNTMsICA4NCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNzUsIDE4MywgMjM5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDMwLCAxNTUsIDIyMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgMTA2LCAxNzEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA3NCwgMTI4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDQsICA3NiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMjggfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDczLCAxODUsIDI0MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyNywgMTU5LCAyMjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsIDEwNywgMTcyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzUsIDEyNyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQyLCAgNzMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNywgIDI5IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICA2MiwgMTkwLCAyMzggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjEsIDE1OSwgMjIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAxMDcsIDE3MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDcyLCAxMjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MCwgIDcxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTgsICAzMiB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNjEsIDE5OSwgMjQwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI3LCAxNjEsIDIyNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNCwgMTEzLCAxODAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA3NiwgMTI5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDYsICA4MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDIzLCAgNDEgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sIHsgLyogdHggPSAxNngxNiAqLworICAgICAgICB7IC8qIGJsb2NrIFR5cGUgMCAqLworICAgICAgICAgICAgeyAvKiBJbnRyYSAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgICA3LCAgMjcsIDE1MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNSwgIDMwLCAgOTUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNiwgIDMwIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7ICA1MCwgIDc1LCAxMjcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNTcsICA3NSwgMTI0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI3LCAgNjcsIDEwOCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMCwgIDU0LCAgODYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMywgIDUyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTIsICAxOCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNDMsIDEyNSwgMTUxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI2LCAxMDgsIDE0OCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNywgIDgzLCAxMjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA1OSwgIDg5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzgsICA2MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMjcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDIzLCAxNDQsIDE2MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMywgMTEyLCAxNTQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA3NSwgMTE3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTAsICA4MSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMxLCAgNTEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDIzIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICAxOCwgMTYyLCAxODUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDYsIDEyMywgMTcxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzgsIDEyNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDUxLCAgODYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMSwgIDU0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTQsICAyMyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMTUsIDE5OSwgMjI3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAxNTAsIDIwNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDkxLCAxNDYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1NSwgIDk1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzAsICA1MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDExLCAgMjAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIHsgLyogSW50ZXIgKi8KKyAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLworICAgICAgICAgICAgICAgICAgICB7ICAxOSwgIDU1LCAyNDAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTksICA1OSwgMTk2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAgNTIsIDEwNSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNDEsIDE2NiwgMjA3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTA0LCAxNTMsIDE5OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzMSwgMTIzLCAxODEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTQsIDEwMSwgMTUyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA1LCAgNzIsIDEwNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM2LCAgNTIgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCisgICAgICAgICAgICAgICAgICAgIHsgIDM1LCAxNzYsIDIxMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMiwgMTMxLCAxOTAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA4OCwgMTQ0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjAsIDEwMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM2LCAgNjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNiwgIDI4IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLworICAgICAgICAgICAgICAgICAgICB7ICAyOCwgMTgzLCAyMTMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDgsIDEzNCwgMTkxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgODYsIDE0MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDU2LCAgOTYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMCwgIDUzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTIsICAyMCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMjAsIDE5MCwgMjE1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA0LCAxMzUsIDE5MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDg0LCAxMzkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1MywgIDkxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjgsICA0OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDExLCAgMjAgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDEzLCAxOTYsIDIxNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgMTM3LCAxOTIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4NiwgMTQzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTcsICA5OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMyLCAgNTYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMywgIDI0IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sIHsgLyogYmxvY2sgVHlwZSAxICovCisgICAgICAgICAgICB7IC8qIEludHJhICovCisgICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAyMTEsICAyOSwgMjE3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDk2LCAgNDcsIDE1NiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyMiwgIDQzLCAgODcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCisgICAgICAgICAgICAgICAgICAgIHsgIDc4LCAxMjAsIDE5MyB9LAorICAgICAgICAgICAgICAgICAgICB7IDExMSwgMTE2LCAxODYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDYsIDEwMiwgMTY0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE1LCAgODAsIDEyOCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDQ5LCAgNzYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOCwgIDI4IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLworICAgICAgICAgICAgICAgICAgICB7ICA3MSwgMTYxLCAyMDMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDIsIDEzMiwgMTkyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEwLCAgOTgsIDE1MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDY5LCAxMDkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0NCwgIDcwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTgsICAyOSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNTcsIDE4NiwgMjExIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDMwLCAxNDAsIDE5NiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDkzLCAxNDYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2MiwgMTAyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzgsICA2NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE2LCAgMjcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDQ3LCAxOTksIDIxNyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNCwgMTQ1LCAxOTYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4OCwgMTQyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTcsICA5OCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM2LCAgNjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNSwgIDI2IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLworICAgICAgICAgICAgICAgICAgICB7ICAyNiwgMjE5LCAyMjkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDUsIDE1NSwgMjA3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgOTQsIDE1MSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDYwLCAxMDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzNiwgIDYyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTYsICAyOCB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgeyAvKiBJbnRlciAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgMjMzLCAgMjksIDI0OCB9LAorICAgICAgICAgICAgICAgICAgICB7IDE0NiwgIDQ3LCAyMjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDMsICA1MiwgMTQwIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7IDEwMCwgMTYzLCAyMzIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxNzksIDE2MSwgMjIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDYzLCAxNDIsIDIwNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzNywgMTEzLCAxNzQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjYsICA4OSwgMTM3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE4LCAgNjgsICA5NyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgODUsIDE4MSwgMjMwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDMyLCAxNDYsIDIwOSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNywgMTAwLCAxNjQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA3MSwgMTIxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDUsICA3NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE4LCAgMzAgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDY1LCAxODcsIDIzMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyMCwgMTQ4LCAyMDcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA5NywgMTU5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjgsIDExNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQwLCAgNzAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDI5IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICA0MCwgMTk0LCAyMjcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDgsIDE0NywgMjA0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgOTQsIDE1NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDY1LCAxMTIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzOSwgIDY2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTQsICAyNiB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMTYsIDIwOCwgMjI4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAxNTEsIDIwNyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDk4LCAxNjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2NywgMTE3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDEsICA3NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMzEgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sIHsgLyogdHggPSAzMngzMiAqLworICAgICAgICB7IC8qIGJsb2NrIFR5cGUgMCAqLworICAgICAgICAgICAgeyAvKiBJbnRyYSAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgIDE3LCAgMzgsIDE0MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNywgIDM0LCAgODAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNywgIDI5IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7ICAzNywgIDc1LCAxMjggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDEsICA3NiwgMTI4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI2LCAgNjYsIDExNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMiwgIDUyLCAgOTQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICAzMiwgIDU1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTAsICAxNiB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNTAsIDEyNywgMTU0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDM3LCAxMDksIDE1MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNiwgIDgyLCAxMjEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDUsICA1OSwgIDg1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzUsICA1NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEzLCAgMjAgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDQwLCAxNDIsIDE2NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNywgMTEwLCAxNTcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA3MSwgMTEyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDQsICA3MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDI3LCAgNDUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMSwgIDE3IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICAzMCwgMTc1LCAxODggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDksIDEyNCwgMTY5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzQsIDExNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQ4LCAgNzggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMCwgIDQ5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTEsICAxOCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMTAsIDIyMiwgMjIzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAxNTAsIDE5NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDgzLCAxMjggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0OCwgIDc5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjcsICA0NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDExLCAgMTcgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIHsgLyogSW50ZXIgKi8KKyAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLworICAgICAgICAgICAgICAgICAgICB7ICAzNiwgIDQxLCAyMzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjksICAzNiwgMTkzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEwLCAgMjcsIDExMSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgODUsIDE2NSwgMjIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTc3LCAxNjIsIDIxNSB9LAorICAgICAgICAgICAgICAgICAgICB7IDExMCwgMTM1LCAxOTUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNTcsIDExMywgMTY4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDIzLCAgODMsIDEyMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMCwgIDQ5LCAgNjEgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCisgICAgICAgICAgICAgICAgICAgIHsgIDg1LCAxOTAsIDIyMyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzNiwgMTM5LCAyMDAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDUsICA5MCwgMTQ2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjAsIDEwMyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM4LCAgNjUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOCwgIDMwIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLworICAgICAgICAgICAgICAgICAgICB7ICA3MiwgMjAyLCAyMjMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjMsIDE0MSwgMTk5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAgODYsIDE0MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDU2LCAgOTcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzNiwgIDYxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTYsICAyNyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNTUsIDIxOCwgMjI1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEzLCAxNDUsIDIwMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDg2LCAxNDEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1NywgIDk5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzUsICA2MSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEzLCAgMjIgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDE1LCAyMzUsIDIxMiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgMTMyLCAxODQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4NCwgMTM5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTcsICA5NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM0LCAgNTYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDIzIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sIHsgLyogYmxvY2sgVHlwZSAxICovCisgICAgICAgICAgICB7IC8qIEludHJhICovCisgICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAxODEsICAyMSwgMjAxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDYxLCAgMzcsIDEyMyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMCwgIDM4LCAgNzEgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCisgICAgICAgICAgICAgICAgICAgIHsgIDQ3LCAxMDYsIDE3MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICA5NSwgMTA0LCAxNzMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDIsICA5MywgMTU5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE4LCAgNzcsIDEzMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDUwLCAgODEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNywgIDIzIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLworICAgICAgICAgICAgICAgICAgICB7ICA2MiwgMTQ3LCAxOTkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDQsIDEzMCwgMTg5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI4LCAxMDIsIDE1NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxOCwgIDc1LCAxMTUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA0NCwgIDY1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTIsICAxOSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNTUsIDE1MywgMjEwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI0LCAxMzAsIDE5NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDkzLCAxNDYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2MSwgIDk3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzEsICA1MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEwLCAgMTYgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDQ5LCAxODYsIDIyMyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNywgMTQ4LCAyMDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA5NiwgMTQyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTMsICA4MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDI2LCAgNDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMSwgIDE3IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLworICAgICAgICAgICAgICAgICAgICB7ICAxMywgMjE3LCAyMTIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsIDEzNiwgMTgwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzgsIDEyNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDUwLCAgODMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAyOSwgIDQ5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTQsICAyMyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgeyAvKiBJbnRlciAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgMTk3LCAgMTMsIDI0NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICA4MiwgIDE3LCAyMjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjUsICAxNywgMTYyIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7IDEyNiwgMTg2LCAyNDcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAyMzQsIDE5MSwgMjQzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTc2LCAxNzcsIDIzNCB9LAorICAgICAgICAgICAgICAgICAgICB7IDEwNCwgMTU4LCAyMjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNjYsIDEyOCwgMTg2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDU1LCAgOTAsIDEzNyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAxMTEsIDE5NywgMjQyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDQ2LCAxNTgsIDIxOSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgOSwgMTA0LCAxNzEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA2NSwgMTI1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDQsICA4MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgOTEgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgMTA0LCAyMDgsIDI0NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzOSwgMTY4LCAyMjQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsIDEwOSwgMTYyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzksIDEyNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDUwLCAxMDIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MywgMTAyIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICA4NCwgMjIwLCAyNDYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMzEsIDE3NywgMjMxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAxMTUsIDE4MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDc5LCAxMzQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1NSwgIDc3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjAsICA3OSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNDMsIDI0MywgMjQwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA4LCAxODAsIDIxNyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgMTE1LCAxNjYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4NCwgMTIxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTEsICA2NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE2LCAgIDYgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK307CisKK2VudW0gTVZKb2ludCB7CisgICAgTVZfSk9JTlRfWkVSTywKKyAgICBNVl9KT0lOVF9ILAorICAgIE1WX0pPSU5UX1YsCisgICAgTVZfSk9JTlRfSFYsCit9OworCitzdGF0aWMgY29uc3QgaW50OF90IHZwOV9tdl9qb2ludF90cmVlWzNdWzJdID0geworICAgIHsgLU1WX0pPSU5UX1pFUk8sIDEgfSwgICAgICAgICAgIC8vICcwJworICAgICB7IC1NVl9KT0lOVF9ILCAyIH0sICAgICAgICAgICAgIC8vICcxMCcKKyAgICAgIHsgLU1WX0pPSU5UX1YsIC1NVl9KT0lOVF9IViB9LCAvLyAnMTF4JworfTsKKworc3RhdGljIGNvbnN0IGludDhfdCB2cDlfbXZfY2xhc3NfdHJlZVsxMF1bMl0gPSB7CisgICAgeyAtMCwgMSB9LCAgICAgICAgIC8vICcwJworICAgICB7IC0xLCAyIH0sICAgICAgICAvLyAnMTAnCisgICAgICB7IDMsIDQgfSwKKyAgICAgICB7IC0yLCAtMyB9LCAgICAgLy8gJzExMHgnCisgICAgICAgeyA1LCA2IH0sCisgICAgICAgIHsgLTQsIC01IH0sICAgIC8vICcxMTEweCcKKyAgICAgICAgeyAtNiwgNyB9LCAgICAgLy8gJzExMTEwJworICAgICAgICAgeyA4LCA5IH0sCisgICAgICAgICAgeyAtNywgLTggfSwgIC8vICcxMTExMTB4JworICAgICAgICAgIHsgLTksIC0xMCB9LCAvLyAnMTExMTExeCcKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgdnA5X212X2ZwX3RyZWVbM11bMl0gPSB7CisgICAgeyAtMCwgMSB9LCAgICAvLyAnMCcKKyAgICAgeyAtMSwgMiB9LCAgIC8vICcxMCcKKyAgICAgIHsgLTIsIC0zIH0sIC8vICcxMXgnCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19WUDlEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOWRzcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvdnA5ZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1NmFkZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOWRzcC5jCkBAIC0wLDAgKzEsMjA2NCBAQAorLyoKKyAqIFZQOSBjb21wYXRpYmxlIHZpZGVvIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amUgZ21haWwgY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIENsw6ltZW50IELFk3NjaCA8dSBwa2ggbWU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgInZwOWRzcC5oIgorI2luY2x1ZGUgInJuZF9hdmcuaCIKKworLy8gRklYTUUgc2VlIHdoZXRoZXIgd2UgY2FuIG1lcmdlIHBhcnRzIG9mIHRoaXMgKHBlcmhhcHMgYXQgbGVhc3QgNHg0IGFuZCA4eDgpCisvLyBiYWNrIHdpdGggaDI2NHByZWQuW2NoXQorCitzdGF0aWMgdm9pZCB2ZXJ0XzR4NF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIHVuc2lnbmVkIHA0ID0gQVZfUk4zMkEodG9wKTsKKworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDAsIHA0KTsKKyAgICBBVl9XTjMyQShkc3QgKyBzdHJpZGUgKiAxLCBwNCk7CisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMiwgcDQpOworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDMsIHA0KTsKK30KKworc3RhdGljIHZvaWQgdmVydF84eDhfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICB1aW50NjRfdCBwOCA9IEFWX1JONjRBKHRvcCk7CisgICAgaW50IHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgIEFWX1dONjRBKGRzdCwgcDgpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdmVydF8xNngxNl9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApCit7CisgICAgdWludDY0X3QgcDhhID0gQVZfUk42NEEodG9wICsgMCksIHA4YiA9IEFWX1JONjRBKHRvcCArIDgpOworICAgIGludCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgMCwgcDhhKTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgOCwgcDhiKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZlcnRfMzJ4MzJfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIHVpbnQ2NF90IHA4YSA9IEFWX1JONjRBKHRvcCArIDApLCAgcDhiID0gQVZfUk42NEEodG9wICsgOCksCisgICAgICAgICAgICAgcDhjID0gQVZfUk42NEEodG9wICsgMTYpLCBwOGQgPSBBVl9STjY0QSh0b3AgKyAyNCk7CisgICAgaW50IHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgMzI7IHkrKykgeworICAgICAgICBBVl9XTjY0QShkc3QgKyAgMCwgcDhhKTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgIDgsIHA4Yik7CisgICAgICAgIEFWX1dONjRBKGRzdCArIDE2LCBwOGMpOworICAgICAgICBBVl9XTjY0QShkc3QgKyAyNCwgcDhkKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhvcl80eDRfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDAsIGxlZnRbM10gKiAweDAxMDEwMTAxVSk7CisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMSwgbGVmdFsyXSAqIDB4MDEwMTAxMDFVKTsKKyAgICBBVl9XTjMyQShkc3QgKyBzdHJpZGUgKiAyLCBsZWZ0WzFdICogMHgwMTAxMDEwMVUpOworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDMsIGxlZnRbMF0gKiAweDAxMDEwMTAxVSk7Cit9CisKK3N0YXRpYyB2b2lkIGhvcl84eDhfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIGludCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBBVl9XTjY0QShkc3QsIGxlZnRbNyAtIHldICogMHgwMTAxMDEwMTAxMDEwMTAxVUxMKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhvcl8xNngxNl9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgIHVpbnQ2NF90IHA4ID0gbGVmdFsxNSAtIHldICogMHgwMTAxMDEwMTAxMDEwMTAxVUxMOworCisgICAgICAgIEFWX1dONjRBKGRzdCArIDAsIHA4KTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgOCwgcDgpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaG9yXzMyeDMyX2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIGludCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDMyOyB5KyspIHsKKyAgICAgICAgdWludDY0X3QgcDggPSBsZWZ0WzMxIC0geV0gKiAweDAxMDEwMTAxMDEwMTAxMDFVTEw7CisKKyAgICAgICAgQVZfV042NEEoZHN0ICsgIDAsIHA4KTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgIDgsIHA4KTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgMTYsIHA4KTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgMjQsIHA4KTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRtXzR4NF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICBpbnQgeSwgdGwgPSB0b3BbLTFdOworCisgICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykgeworICAgICAgICBpbnQgbF9tX3RsID0gbGVmdFszIC0geV0gLSB0bDsKKworICAgICAgICBkc3RbMF0gPSBhdl9jbGlwX3VpbnQ4KHRvcFswXSArIGxfbV90bCk7CisgICAgICAgIGRzdFsxXSA9IGF2X2NsaXBfdWludDgodG9wWzFdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzJdID0gYXZfY2xpcF91aW50OCh0b3BbMl0gKyBsX21fdGwpOworICAgICAgICBkc3RbM10gPSBhdl9jbGlwX3VpbnQ4KHRvcFszXSArIGxfbV90bCk7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0bV84eDhfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApCit7CisgICAgaW50IHksIHRsID0gdG9wWy0xXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgaW50IGxfbV90bCA9IGxlZnRbNyAtIHldIC0gdGw7CisKKyAgICAgICAgZHN0WzBdID0gYXZfY2xpcF91aW50OCh0b3BbMF0gKyBsX21fdGwpOworICAgICAgICBkc3RbMV0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsxXSArIGxfbV90bCk7CisgICAgICAgIGRzdFsyXSA9IGF2X2NsaXBfdWludDgodG9wWzJdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzNdID0gYXZfY2xpcF91aW50OCh0b3BbM10gKyBsX21fdGwpOworICAgICAgICBkc3RbNF0gPSBhdl9jbGlwX3VpbnQ4KHRvcFs0XSArIGxfbV90bCk7CisgICAgICAgIGRzdFs1XSA9IGF2X2NsaXBfdWludDgodG9wWzVdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzZdID0gYXZfY2xpcF91aW50OCh0b3BbNl0gKyBsX21fdGwpOworICAgICAgICBkc3RbN10gPSBhdl9jbGlwX3VpbnQ4KHRvcFs3XSArIGxfbV90bCk7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0bV8xNngxNl9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIGludCB5LCB0bCA9IHRvcFstMV07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworICAgICAgICBpbnQgbF9tX3RsID0gbGVmdFsxNSAtIHldIC0gdGw7CisKKyAgICAgICAgZHN0WyAwXSA9IGF2X2NsaXBfdWludDgodG9wWyAwXSArIGxfbV90bCk7CisgICAgICAgIGRzdFsgMV0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsgMV0gKyBsX21fdGwpOworICAgICAgICBkc3RbIDJdID0gYXZfY2xpcF91aW50OCh0b3BbIDJdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WyAzXSA9IGF2X2NsaXBfdWludDgodG9wWyAzXSArIGxfbV90bCk7CisgICAgICAgIGRzdFsgNF0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsgNF0gKyBsX21fdGwpOworICAgICAgICBkc3RbIDVdID0gYXZfY2xpcF91aW50OCh0b3BbIDVdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WyA2XSA9IGF2X2NsaXBfdWludDgodG9wWyA2XSArIGxfbV90bCk7CisgICAgICAgIGRzdFsgN10gPSBhdl9jbGlwX3VpbnQ4KHRvcFsgN10gKyBsX21fdGwpOworICAgICAgICBkc3RbIDhdID0gYXZfY2xpcF91aW50OCh0b3BbIDhdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WyA5XSA9IGF2X2NsaXBfdWludDgodG9wWyA5XSArIGxfbV90bCk7CisgICAgICAgIGRzdFsxMF0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsxMF0gKyBsX21fdGwpOworICAgICAgICBkc3RbMTFdID0gYXZfY2xpcF91aW50OCh0b3BbMTFdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzEyXSA9IGF2X2NsaXBfdWludDgodG9wWzEyXSArIGxfbV90bCk7CisgICAgICAgIGRzdFsxM10gPSBhdl9jbGlwX3VpbnQ4KHRvcFsxM10gKyBsX21fdGwpOworICAgICAgICBkc3RbMTRdID0gYXZfY2xpcF91aW50OCh0b3BbMTRdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzE1XSA9IGF2X2NsaXBfdWludDgodG9wWzE1XSArIGxfbV90bCk7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0bV8zMngzMl9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIGludCB5LCB0bCA9IHRvcFstMV07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgMzI7IHkrKykgeworICAgICAgICBpbnQgbF9tX3RsID0gbGVmdFszMSAtIHldIC0gdGw7CisKKyAgICAgICAgZHN0WyAwXSA9IGF2X2NsaXBfdWludDgodG9wWyAwXSArIGxfbV90bCk7CisgICAgICAgIGRzdFsgMV0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsgMV0gKyBsX21fdGwpOworICAgICAgICBkc3RbIDJdID0gYXZfY2xpcF91aW50OCh0b3BbIDJdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WyAzXSA9IGF2X2NsaXBfdWludDgodG9wWyAzXSArIGxfbV90bCk7CisgICAgICAgIGRzdFsgNF0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsgNF0gKyBsX21fdGwpOworICAgICAgICBkc3RbIDVdID0gYXZfY2xpcF91aW50OCh0b3BbIDVdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WyA2XSA9IGF2X2NsaXBfdWludDgodG9wWyA2XSArIGxfbV90bCk7CisgICAgICAgIGRzdFsgN10gPSBhdl9jbGlwX3VpbnQ4KHRvcFsgN10gKyBsX21fdGwpOworICAgICAgICBkc3RbIDhdID0gYXZfY2xpcF91aW50OCh0b3BbIDhdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WyA5XSA9IGF2X2NsaXBfdWludDgodG9wWyA5XSArIGxfbV90bCk7CisgICAgICAgIGRzdFsxMF0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsxMF0gKyBsX21fdGwpOworICAgICAgICBkc3RbMTFdID0gYXZfY2xpcF91aW50OCh0b3BbMTFdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzEyXSA9IGF2X2NsaXBfdWludDgodG9wWzEyXSArIGxfbV90bCk7CisgICAgICAgIGRzdFsxM10gPSBhdl9jbGlwX3VpbnQ4KHRvcFsxM10gKyBsX21fdGwpOworICAgICAgICBkc3RbMTRdID0gYXZfY2xpcF91aW50OCh0b3BbMTRdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzE1XSA9IGF2X2NsaXBfdWludDgodG9wWzE1XSArIGxfbV90bCk7CisgICAgICAgIGRzdFsxNl0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsxNl0gKyBsX21fdGwpOworICAgICAgICBkc3RbMTddID0gYXZfY2xpcF91aW50OCh0b3BbMTddICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzE4XSA9IGF2X2NsaXBfdWludDgodG9wWzE4XSArIGxfbV90bCk7CisgICAgICAgIGRzdFsxOV0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsxOV0gKyBsX21fdGwpOworICAgICAgICBkc3RbMjBdID0gYXZfY2xpcF91aW50OCh0b3BbMjBdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzIxXSA9IGF2X2NsaXBfdWludDgodG9wWzIxXSArIGxfbV90bCk7CisgICAgICAgIGRzdFsyMl0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsyMl0gKyBsX21fdGwpOworICAgICAgICBkc3RbMjNdID0gYXZfY2xpcF91aW50OCh0b3BbMjNdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzI0XSA9IGF2X2NsaXBfdWludDgodG9wWzI0XSArIGxfbV90bCk7CisgICAgICAgIGRzdFsyNV0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsyNV0gKyBsX21fdGwpOworICAgICAgICBkc3RbMjZdID0gYXZfY2xpcF91aW50OCh0b3BbMjZdICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzI3XSA9IGF2X2NsaXBfdWludDgodG9wWzI3XSArIGxfbV90bCk7CisgICAgICAgIGRzdFsyOF0gPSBhdl9jbGlwX3VpbnQ4KHRvcFsyOF0gKyBsX21fdGwpOworICAgICAgICBkc3RbMjldID0gYXZfY2xpcF91aW50OCh0b3BbMjldICsgbF9tX3RsKTsKKyAgICAgICAgZHN0WzMwXSA9IGF2X2NsaXBfdWludDgodG9wWzMwXSArIGxfbV90bCk7CisgICAgICAgIGRzdFszMV0gPSBhdl9jbGlwX3VpbnQ4KHRvcFszMV0gKyBsX21fdGwpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGNfNHg0X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIHVuc2lnbmVkIGRjID0gMHgwMTAxMDEwMVUgKiAoKGxlZnRbMF0gKyBsZWZ0WzFdICsgbGVmdFsyXSArIGxlZnRbM10gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFswXSArIHRvcFsxXSArIHRvcFsyXSArIHRvcFszXSArIDQpID4+IDMpOworCisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMCwgZGMpOworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDEsIGRjKTsKKyAgICBBVl9XTjMyQShkc3QgKyBzdHJpZGUgKiAyLCBkYyk7CisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMywgZGMpOworfQorCitzdGF0aWMgdm9pZCBkY184eDhfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApCit7CisgICAgdWludDY0X3QgZGMgPSAweDAxMDEwMTAxMDEwMTAxMDFVTEwgKgorICAgICAgICAoKGxlZnRbMF0gKyBsZWZ0WzFdICsgbGVmdFsyXSArIGxlZnRbM10gKyBsZWZ0WzRdICsgbGVmdFs1XSArCisgICAgICAgICAgbGVmdFs2XSArIGxlZnRbN10gKyB0b3BbMF0gKyB0b3BbMV0gKyB0b3BbMl0gKyB0b3BbM10gKworICAgICAgICAgIHRvcFs0XSArIHRvcFs1XSArIHRvcFs2XSArIHRvcFs3XSArIDgpID4+IDQpOworICAgIGludCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBBVl9XTjY0QShkc3QsIGRjKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjXzE2eDE2X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApCit7CisgICAgdWludDY0X3QgZGMgPSAweDAxMDEwMTAxMDEwMTAxMDFVTEwgKgorICAgICAgICAoKGxlZnRbMF0gKyBsZWZ0WzFdICsgbGVmdFsyXSArIGxlZnRbM10gKyBsZWZ0WzRdICsgbGVmdFs1XSArIGxlZnRbNl0gKworICAgICAgICAgIGxlZnRbN10gKyBsZWZ0WzhdICsgbGVmdFs5XSArIGxlZnRbMTBdICsgbGVmdFsxMV0gKyBsZWZ0WzEyXSArCisgICAgICAgICAgbGVmdFsxM10gKyBsZWZ0WzE0XSArIGxlZnRbMTVdICsgdG9wWzBdICsgdG9wWzFdICsgdG9wWzJdICsgdG9wWzNdICsKKyAgICAgICAgICB0b3BbNF0gKyB0b3BbNV0gKyB0b3BbNl0gKyB0b3BbN10gKyB0b3BbOF0gKyB0b3BbOV0gKyB0b3BbMTBdICsKKyAgICAgICAgICB0b3BbMTFdICsgdG9wWzEyXSArIHRvcFsxM10gKyB0b3BbMTRdICsgdG9wWzE1XSArIDE2KSA+PiA1KTsKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgIEFWX1dONjRBKGRzdCArIDAsIGRjKTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgOCwgZGMpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGNfMzJ4MzJfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICB1aW50NjRfdCBkYyA9IDB4MDEwMTAxMDEwMTAxMDEwMVVMTCAqCisgICAgICAgICgobGVmdFswXSArIGxlZnRbMV0gKyBsZWZ0WzJdICsgbGVmdFszXSArIGxlZnRbNF0gKyBsZWZ0WzVdICsgbGVmdFs2XSArCisgICAgICAgICAgbGVmdFs3XSArIGxlZnRbOF0gKyBsZWZ0WzldICsgbGVmdFsxMF0gKyBsZWZ0WzExXSArIGxlZnRbMTJdICsKKyAgICAgICAgICBsZWZ0WzEzXSArIGxlZnRbMTRdICsgbGVmdFsxNV0gKyBsZWZ0WzE2XSArIGxlZnRbMTddICsgbGVmdFsxOF0gKworICAgICAgICAgIGxlZnRbMTldICsgbGVmdFsyMF0gKyBsZWZ0WzIxXSArIGxlZnRbMjJdICsgbGVmdFsyM10gKyBsZWZ0WzI0XSArCisgICAgICAgICAgbGVmdFsyNV0gKyBsZWZ0WzI2XSArIGxlZnRbMjddICsgbGVmdFsyOF0gKyBsZWZ0WzI5XSArIGxlZnRbMzBdICsKKyAgICAgICAgICBsZWZ0WzMxXSArIHRvcFswXSArIHRvcFsxXSArIHRvcFsyXSArIHRvcFszXSArIHRvcFs0XSArIHRvcFs1XSArCisgICAgICAgICAgdG9wWzZdICsgdG9wWzddICsgdG9wWzhdICsgdG9wWzldICsgdG9wWzEwXSArIHRvcFsxMV0gKyB0b3BbMTJdICsKKyAgICAgICAgICB0b3BbMTNdICsgdG9wWzE0XSArIHRvcFsxNV0gKyB0b3BbMTZdICsgdG9wWzE3XSArIHRvcFsxOF0gKyB0b3BbMTldICsKKyAgICAgICAgICB0b3BbMjBdICsgdG9wWzIxXSArIHRvcFsyMl0gKyB0b3BbMjNdICsgdG9wWzI0XSArIHRvcFsyNV0gKyB0b3BbMjZdICsKKyAgICAgICAgICB0b3BbMjddICsgdG9wWzI4XSArIHRvcFsyOV0gKyB0b3BbMzBdICsgdG9wWzMxXSArIDMyKSA+PiA2KTsKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCAzMjsgeSsrKSB7CisgICAgICAgIEFWX1dONjRBKGRzdCArICAwLCBkYyk7CisgICAgICAgIEFWX1dONjRBKGRzdCArICA4LCBkYyk7CisgICAgICAgIEFWX1dONjRBKGRzdCArIDE2LCBkYyk7CisgICAgICAgIEFWX1dONjRBKGRzdCArIDI0LCBkYyk7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkY19sZWZ0XzR4NF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIHVuc2lnbmVkIGRjID0gMHgwMTAxMDEwMVUgKiAoKGxlZnRbMF0gKyBsZWZ0WzFdICsgbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyKTsKKworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDAsIGRjKTsKKyAgICBBVl9XTjMyQShkc3QgKyBzdHJpZGUgKiAxLCBkYyk7CisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMiwgZGMpOworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDMsIGRjKTsKK30KKworc3RhdGljIHZvaWQgZGNfbGVmdF84eDhfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICB1aW50NjRfdCBkYyA9IDB4MDEwMTAxMDEwMTAxMDEwMVVMTCAqCisgICAgICAgICgobGVmdFswXSArIGxlZnRbMV0gKyBsZWZ0WzJdICsgbGVmdFszXSArCisgICAgICAgICAgbGVmdFs0XSArIGxlZnRbNV0gKyBsZWZ0WzZdICsgbGVmdFs3XSArIDQpID4+IDMpOworICAgIGludCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBBVl9XTjY0QShkc3QsIGRjKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjX2xlZnRfMTZ4MTZfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIHVpbnQ2NF90IGRjID0gMHgwMTAxMDEwMTAxMDEwMTAxVUxMICoKKyAgICAgICAgKChsZWZ0WzBdICsgbGVmdFsxXSArIGxlZnRbMl0gKyBsZWZ0WzNdICsgbGVmdFs0XSArIGxlZnRbNV0gKworICAgICAgICAgIGxlZnRbNl0gKyBsZWZ0WzddICsgbGVmdFs4XSArIGxlZnRbOV0gKyBsZWZ0WzEwXSArIGxlZnRbMTFdICsKKyAgICAgICAgICBsZWZ0WzEyXSArIGxlZnRbMTNdICsgbGVmdFsxNF0gKyBsZWZ0WzE1XSArIDgpID4+IDQpOworICAgIGludCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgMCwgZGMpOworICAgICAgICBBVl9XTjY0QShkc3QgKyA4LCBkYyk7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkY19sZWZ0XzMyeDMyX2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICB1aW50NjRfdCBkYyA9IDB4MDEwMTAxMDEwMTAxMDEwMVVMTCAqCisgICAgICAgICgobGVmdFswXSArIGxlZnRbMV0gKyBsZWZ0WzJdICsgbGVmdFszXSArIGxlZnRbNF0gKyBsZWZ0WzVdICsKKyAgICAgICAgICBsZWZ0WzZdICsgbGVmdFs3XSArIGxlZnRbOF0gKyBsZWZ0WzldICsgbGVmdFsxMF0gKyBsZWZ0WzExXSArCisgICAgICAgICAgbGVmdFsxMl0gKyBsZWZ0WzEzXSArIGxlZnRbMTRdICsgbGVmdFsxNV0gKyBsZWZ0WzE2XSArIGxlZnRbMTddICsKKyAgICAgICAgICBsZWZ0WzE4XSArIGxlZnRbMTldICsgbGVmdFsyMF0gKyBsZWZ0WzIxXSArIGxlZnRbMjJdICsgbGVmdFsyM10gKworICAgICAgICAgIGxlZnRbMjRdICsgbGVmdFsyNV0gKyBsZWZ0WzI2XSArIGxlZnRbMjddICsgbGVmdFsyOF0gKyBsZWZ0WzI5XSArCisgICAgICAgICAgbGVmdFszMF0gKyBsZWZ0WzMxXSArIDE2KSA+PiA1KTsKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCAzMjsgeSsrKSB7CisgICAgICAgIEFWX1dONjRBKGRzdCArICAwLCBkYyk7CisgICAgICAgIEFWX1dONjRBKGRzdCArICA4LCBkYyk7CisgICAgICAgIEFWX1dONjRBKGRzdCArIDE2LCBkYyk7CisgICAgICAgIEFWX1dONjRBKGRzdCArIDI0LCBkYyk7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkY190b3BfNHg0X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICB1bnNpZ25lZCBkYyA9IDB4MDEwMTAxMDFVICogKCh0b3BbMF0gKyB0b3BbMV0gKyB0b3BbMl0gKyB0b3BbM10gKyAyKSA+PiAyKTsKKworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDAsIGRjKTsKKyAgICBBVl9XTjMyQShkc3QgKyBzdHJpZGUgKiAxLCBkYyk7CisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMiwgZGMpOworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDMsIGRjKTsKK30KKworc3RhdGljIHZvaWQgZGNfdG9wXzh4OF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApCit7CisgICAgdWludDY0X3QgZGMgPSAweDAxMDEwMTAxMDEwMTAxMDFVTEwgKgorICAgICAgICAoKHRvcFswXSArIHRvcFsxXSArIHRvcFsyXSArIHRvcFszXSArCisgICAgICAgICAgdG9wWzRdICsgdG9wWzVdICsgdG9wWzZdICsgdG9wWzddICsgNCkgPj4gMyk7CisgICAgaW50IHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgIEFWX1dONjRBKGRzdCwgZGMpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGNfdG9wXzE2eDE2X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIHVpbnQ2NF90IGRjID0gMHgwMTAxMDEwMTAxMDEwMTAxVUxMICoKKyAgICAgICAgKCh0b3BbMF0gKyB0b3BbMV0gKyB0b3BbMl0gKyB0b3BbM10gKyB0b3BbNF0gKyB0b3BbNV0gKworICAgICAgICAgIHRvcFs2XSArIHRvcFs3XSArIHRvcFs4XSArIHRvcFs5XSArIHRvcFsxMF0gKyB0b3BbMTFdICsKKyAgICAgICAgICB0b3BbMTJdICsgdG9wWzEzXSArIHRvcFsxNF0gKyB0b3BbMTVdICsgOCkgPj4gNCk7CisgICAgaW50IHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworICAgICAgICBBVl9XTjY0QShkc3QgKyAwLCBkYyk7CisgICAgICAgIEFWX1dONjRBKGRzdCArIDgsIGRjKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjX3RvcF8zMngzMl9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICB1aW50NjRfdCBkYyA9IDB4MDEwMTAxMDEwMTAxMDEwMVVMTCAqCisgICAgICAgICgodG9wWzBdICsgdG9wWzFdICsgdG9wWzJdICsgdG9wWzNdICsgdG9wWzRdICsgdG9wWzVdICsKKyAgICAgICAgICB0b3BbNl0gKyB0b3BbN10gKyB0b3BbOF0gKyB0b3BbOV0gKyB0b3BbMTBdICsgdG9wWzExXSArCisgICAgICAgICAgdG9wWzEyXSArIHRvcFsxM10gKyB0b3BbMTRdICsgdG9wWzE1XSArIHRvcFsxNl0gKyB0b3BbMTddICsKKyAgICAgICAgICB0b3BbMThdICsgdG9wWzE5XSArIHRvcFsyMF0gKyB0b3BbMjFdICsgdG9wWzIyXSArIHRvcFsyM10gKworICAgICAgICAgIHRvcFsyNF0gKyB0b3BbMjVdICsgdG9wWzI2XSArIHRvcFsyN10gKyB0b3BbMjhdICsgdG9wWzI5XSArCisgICAgICAgICAgdG9wWzMwXSArIHRvcFszMV0gKyAxNikgPj4gNSk7CisgICAgaW50IHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgMzI7IHkrKykgeworICAgICAgICBBVl9XTjY0QShkc3QgKyAgMCwgZGMpOworICAgICAgICBBVl9XTjY0QShkc3QgKyAgOCwgZGMpOworICAgICAgICBBVl9XTjY0QShkc3QgKyAxNiwgZGMpOworICAgICAgICBBVl9XTjY0QShkc3QgKyAyNCwgZGMpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGNfMTI4XzR4NF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApCit7CisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMCwgMHg4MDgwODA4MFUpOworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDEsIDB4ODA4MDgwODBVKTsKKyAgICBBVl9XTjMyQShkc3QgKyBzdHJpZGUgKiAyLCAweDgwODA4MDgwVSk7CisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMywgMHg4MDgwODA4MFUpOworfQorCitzdGF0aWMgdm9pZCBkY18xMjhfOHg4X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgQVZfV042NEEoZHN0LCAweDgwODA4MDgwODA4MDgwODBVTEwpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGNfMTI4XzE2eDE2X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIGludCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgMCwgMHg4MDgwODA4MDgwODA4MDgwVUxMKTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgOCwgMHg4MDgwODA4MDgwODA4MDgwVUxMKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjXzEyOF8zMngzMl9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCAzMjsgeSsrKSB7CisgICAgICAgIEFWX1dONjRBKGRzdCArICAwLCAweDgwODA4MDgwODA4MDgwODBVTEwpOworICAgICAgICBBVl9XTjY0QShkc3QgKyAgOCwgMHg4MDgwODA4MDgwODA4MDgwVUxMKTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgMTYsIDB4ODA4MDgwODA4MDgwODA4MFVMTCk7CisgICAgICAgIEFWX1dONjRBKGRzdCArIDI0LCAweDgwODA4MDgwODA4MDgwODBVTEwpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGNfMTI3XzR4NF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApCit7CisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMCwgMHg3RjdGN0Y3RlUpOworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDEsIDB4N0Y3RjdGN0ZVKTsKKyAgICBBVl9XTjMyQShkc3QgKyBzdHJpZGUgKiAyLCAweDdGN0Y3RjdGVSk7CisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMywgMHg3RjdGN0Y3RlUpOworfQorCitzdGF0aWMgdm9pZCBkY18xMjdfOHg4X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgQVZfV042NEEoZHN0LCAweDdGN0Y3RjdGN0Y3RjdGN0ZVTEwpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGNfMTI3XzE2eDE2X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIGludCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgMCwgMHg3RjdGN0Y3RjdGN0Y3RjdGVUxMKTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgOCwgMHg3RjdGN0Y3RjdGN0Y3RjdGVUxMKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjXzEyN18zMngzMl9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCAzMjsgeSsrKSB7CisgICAgICAgIEFWX1dONjRBKGRzdCArICAwLCAweDdGN0Y3RjdGN0Y3RjdGN0ZVTEwpOworICAgICAgICBBVl9XTjY0QShkc3QgKyAgOCwgMHg3RjdGN0Y3RjdGN0Y3RjdGVUxMKTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgMTYsIDB4N0Y3RjdGN0Y3RjdGN0Y3RlVMTCk7CisgICAgICAgIEFWX1dONjRBKGRzdCArIDI0LCAweDdGN0Y3RjdGN0Y3RjdGN0ZVTEwpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGNfMTI5XzR4NF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApCit7CisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMCwgMHg4MTgxODE4MVUpOworICAgIEFWX1dOMzJBKGRzdCArIHN0cmlkZSAqIDEsIDB4ODE4MTgxODFVKTsKKyAgICBBVl9XTjMyQShkc3QgKyBzdHJpZGUgKiAyLCAweDgxODE4MTgxVSk7CisgICAgQVZfV04zMkEoZHN0ICsgc3RyaWRlICogMywgMHg4MTgxODE4MVUpOworfQorCitzdGF0aWMgdm9pZCBkY18xMjlfOHg4X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgQVZfV042NEEoZHN0LCAweDgxODE4MTgxODE4MTgxODFVTEwpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGNfMTI5XzE2eDE2X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIGludCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgMCwgMHg4MTgxODE4MTgxODE4MTgxVUxMKTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgOCwgMHg4MTgxODE4MTgxODE4MTgxVUxMKTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjXzEyOV8zMngzMl9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCAzMjsgeSsrKSB7CisgICAgICAgIEFWX1dONjRBKGRzdCArICAwLCAweDgxODE4MTgxODE4MTgxODFVTEwpOworICAgICAgICBBVl9XTjY0QShkc3QgKyAgOCwgMHg4MTgxODE4MTgxODE4MTgxVUxMKTsKKyAgICAgICAgQVZfV042NEEoZHN0ICsgMTYsIDB4ODE4MTgxODE4MTgxODE4MVVMTCk7CisgICAgICAgIEFWX1dONjRBKGRzdCArIDI0LCAweDgxODE4MTgxODE4MTgxODFVTEwpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworI2RlZmluZSBEU1QoeCwgeSkgZHN0Wyh4KSArICh5KSAqIHN0cmlkZV0KKworc3RhdGljIHZvaWQgZGlhZ19kb3dubGVmdF80eDRfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICBpbnQgYTAgPSB0b3BbMF0sIGExID0gdG9wWzFdLCBhMiA9IHRvcFsyXSwgYTMgPSB0b3BbM10sCisgICAgICAgIGE0ID0gdG9wWzRdLCBhNSA9IHRvcFs1XSwgYTYgPSB0b3BbNl0sIGE3ID0gdG9wWzddOworCisgICAgRFNUKDAsMCkgPSAoYTAgKyBhMSAqIDIgKyBhMiArIDIpID4+IDI7CisgICAgRFNUKDEsMCkgPSBEU1QoMCwxKSA9IChhMSArIGEyICogMiArIGEzICsgMikgPj4gMjsKKyAgICBEU1QoMiwwKSA9IERTVCgxLDEpID0gRFNUKDAsMikgPSAoYTIgKyBhMyAqIDIgKyBhNCArIDIpID4+IDI7CisgICAgRFNUKDMsMCkgPSBEU1QoMiwxKSA9IERTVCgxLDIpID0gRFNUKDAsMykgPSAoYTMgKyBhNCAqIDIgKyBhNSArIDIpID4+IDI7CisgICAgRFNUKDMsMSkgPSBEU1QoMiwyKSA9IERTVCgxLDMpID0gKGE0ICsgYTUgKiAyICsgYTYgKyAyKSA+PiAyOworICAgIERTVCgzLDIpID0gRFNUKDIsMykgPSAoYTUgKyBhNiAqIDIgKyBhNyArIDIpID4+IDI7CisgICAgRFNUKDMsMykgPSBhNzsgIC8vIG5vdGU6IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdnA4IGFuZCBzdWNoCit9CisKKyNkZWZpbmUgZGVmX2RpYWdfZG93bmxlZnQoc2l6ZSkgXAorc3RhdGljIHZvaWQgZGlhZ19kb3dubGVmdF8jI3NpemUjI3gjI3NpemUjI19jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkgXAoreyBcCisgICAgaW50IGksIGo7IFwKKyAgICB1aW50OF90IHZbc2l6ZSAtIDFdOyBcCitcCisgICAgZm9yIChpID0gMDsgaSA8IHNpemUgLSAyOyBpKyspIFwKKyAgICAgICAgdltpXSA9ICh0b3BbaV0gKyB0b3BbaSArIDFdICogMiArIHRvcFtpICsgMl0gKyAyKSA+PiAyOyBcCisgICAgdltzaXplIC0gMl0gPSAodG9wW3NpemUgLSAyXSArIHRvcFtzaXplIC0gMV0gKiAzICsgMikgPj4gMjsgXAorXAorICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsgXAorICAgICAgICBtZW1jcHkoZHN0ICsgaipzdHJpZGUsIHYgKyBqLCBzaXplIC0gMSAtIGopOyBcCisgICAgICAgIG1lbXNldChkc3QgKyBqKnN0cmlkZSArIHNpemUgLSAxIC0gaiwgdG9wW3NpemUgLSAxXSwgaiArIDEpOyBcCisgICAgfSBcCit9CisKK2RlZl9kaWFnX2Rvd25sZWZ0KDgpCitkZWZfZGlhZ19kb3dubGVmdCgxNikKK2RlZl9kaWFnX2Rvd25sZWZ0KDMyKQorCitzdGF0aWMgdm9pZCBkaWFnX2Rvd25yaWdodF80eDRfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApCit7CisgICAgaW50IHRsID0gdG9wWy0xXSwgYTAgPSB0b3BbMF0sIGExID0gdG9wWzFdLCBhMiA9IHRvcFsyXSwgYTMgPSB0b3BbM10sCisgICAgICAgIGwwID0gbGVmdFszXSwgbDEgPSBsZWZ0WzJdLCBsMiA9IGxlZnRbMV0sIGwzID0gbGVmdFswXTsKKworICAgIERTVCgwLDMpID0gKGwxICsgbDIgKiAyICsgbDMgKyAyKSA+PiAyOworICAgIERTVCgwLDIpID0gRFNUKDEsMykgPSAobDAgKyBsMSAqIDIgKyBsMiArIDIpID4+IDI7CisgICAgRFNUKDAsMSkgPSBEU1QoMSwyKSA9IERTVCgyLDMpID0gKHRsICsgbDAgKiAyICsgbDEgKyAyKSA+PiAyOworICAgIERTVCgwLDApID0gRFNUKDEsMSkgPSBEU1QoMiwyKSA9IERTVCgzLDMpID0gKGwwICsgdGwgKiAyICsgYTAgKyAyKSA+PiAyOworICAgIERTVCgxLDApID0gRFNUKDIsMSkgPSBEU1QoMywyKSA9ICh0bCArIGEwICogMiArIGExICsgMikgPj4gMjsKKyAgICBEU1QoMiwwKSA9IERTVCgzLDEpID0gKGEwICsgYTEgKiAyICsgYTIgKyAyKSA+PiAyOworICAgIERTVCgzLDApID0gKGExICsgYTIgKiAyICsgYTMgKyAyKSA+PiAyOworfQorCisjZGVmaW5lIGRlZl9kaWFnX2Rvd25yaWdodChzaXplKSBcCitzdGF0aWMgdm9pZCBkaWFnX2Rvd25yaWdodF8jI3NpemUjI3gjI3NpemUjI19jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApIFwKK3sgXAorICAgIGludCBpLCBqOyBcCisgICAgdWludDhfdCB2W3NpemUgKyBzaXplIC0gMV07IFwKK1wKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDI7IGkrKykgeyBcCisgICAgICAgIHZbaSAgICAgICAgICAgXSA9IChsZWZ0W2ldICsgbGVmdFtpICsgMV0gKiAyICsgbGVmdFtpICsgMl0gKyAyKSA+PiAyOyBcCisgICAgICAgIHZbc2l6ZSArIDEgKyBpXSA9ICh0b3BbaV0gICsgdG9wW2kgKyAxXSAgKiAyICsgdG9wW2kgKyAyXSAgKyAyKSA+PiAyOyBcCisgICAgfSBcCisgICAgdltzaXplIC0gMl0gPSAobGVmdFtzaXplIC0gMl0gKyBsZWZ0W3NpemUgLSAxXSAqIDIgKyB0b3BbLTFdICsgMikgPj4gMjsgXAorICAgIHZbc2l6ZSAtIDFdID0gKGxlZnRbc2l6ZSAtIDFdICsgdG9wWy0xXSAqIDIgKyB0b3BbIDBdICsgMikgPj4gMjsgXAorICAgIHZbc2l6ZSAgICBdID0gKHRvcFstMV0gKyB0b3BbMF0gICogMiArIHRvcFsgMV0gKyAyKSA+PiAyOyBcCitcCisgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgXAorICAgICAgICBtZW1jcHkoZHN0ICsgaipzdHJpZGUsIHYgKyBzaXplIC0gMSAtIGosIHNpemUpOyBcCit9CisKK2RlZl9kaWFnX2Rvd25yaWdodCg4KQorZGVmX2RpYWdfZG93bnJpZ2h0KDE2KQorZGVmX2RpYWdfZG93bnJpZ2h0KDMyKQorCitzdGF0aWMgdm9pZCB2ZXJ0X3JpZ2h0XzR4NF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIGludCB0bCA9IHRvcFstMV0sIGEwID0gdG9wWzBdLCBhMSA9IHRvcFsxXSwgYTIgPSB0b3BbMl0sIGEzID0gdG9wWzNdLAorICAgICAgICBsMCA9IGxlZnRbM10sIGwxID0gbGVmdFsyXSwgbDIgPSBsZWZ0WzFdOworCisgICAgRFNUKDAsMykgPSAobDAgKyBsMSAqIDIgKyBsMiArIDIpID4+IDI7CisgICAgRFNUKDAsMikgPSAodGwgKyBsMCAqIDIgKyBsMSArIDIpID4+IDI7CisgICAgRFNUKDAsMCkgPSBEU1QoMSwyKSA9ICh0bCArIGEwICsgMSkgPj4gMTsKKyAgICBEU1QoMCwxKSA9IERTVCgxLDMpID0gKGwwICsgdGwgKiAyICsgYTAgKyAyKSA+PiAyOworICAgIERTVCgxLDApID0gRFNUKDIsMikgPSAoYTAgKyBhMSArIDEpID4+IDE7CisgICAgRFNUKDEsMSkgPSBEU1QoMiwzKSA9ICh0bCArIGEwICogMiArIGExICsgMikgPj4gMjsKKyAgICBEU1QoMiwwKSA9IERTVCgzLDIpID0gKGExICsgYTIgKyAxKSA+PiAxOworICAgIERTVCgyLDEpID0gRFNUKDMsMykgPSAoYTAgKyBhMSAqIDIgKyBhMiArIDIpID4+IDI7CisgICAgRFNUKDMsMCkgPSAoYTIgKyBhMyArIDEpID4+IDE7CisgICAgRFNUKDMsMSkgPSAoYTEgKyBhMiAqIDIgKyBhMyArIDIpID4+IDI7Cit9CisKKyNkZWZpbmUgZGVmX3ZlcnRfcmlnaHQoc2l6ZSkgXAorc3RhdGljIHZvaWQgdmVydF9yaWdodF8jI3NpemUjI3gjI3NpemUjI19jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkgXAoreyBcCisgICAgaW50IGksIGo7IFwKKyAgICB1aW50OF90IHZlW3NpemUgKyBzaXplLzIgLSAxXSwgdm9bc2l6ZSArIHNpemUvMiAtIDFdOyBcCitcCisgICAgZm9yIChpID0gMDsgaSA8IHNpemUvMiAtIDI7IGkrKykgeyBcCisgICAgICAgIHZvW2ldID0gKGxlZnRbaSoyICsgM10gKyBsZWZ0W2kqMiArIDJdICogMiArIGxlZnRbaSoyICsgMV0gKyAyKSA+PiAyOyBcCisgICAgICAgIHZlW2ldID0gKGxlZnRbaSoyICsgNF0gKyBsZWZ0W2kqMiArIDNdICogMiArIGxlZnRbaSoyICsgMl0gKyAyKSA+PiAyOyBcCisgICAgfSBcCisgICAgdm9bc2l6ZS8yIC0gMl0gPSAobGVmdFtzaXplIC0gMV0gKyBsZWZ0W3NpemUgLSAyXSAqIDIgKyBsZWZ0W3NpemUgLSAzXSArIDIpID4+IDI7IFwKKyAgICB2ZVtzaXplLzIgLSAyXSA9ICh0b3BbLTFdICsgbGVmdFtzaXplIC0gMV0gKiAyICsgbGVmdFtzaXplIC0gMl0gKyAyKSA+PiAyOyBcCitcCisgICAgdmVbc2l6ZS8yIC0gMV0gPSAodG9wWy0xXSArIHRvcFswXSArIDEpID4+IDE7IFwKKyAgICB2b1tzaXplLzIgLSAxXSA9IChsZWZ0W3NpemUgLSAxXSArIHRvcFstMV0gKiAyICsgdG9wWzBdICsgMikgPj4gMjsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7IFwKKyAgICAgICAgdmVbc2l6ZS8yICsgaV0gPSAodG9wW2ldICsgdG9wW2kgKyAxXSArIDEpID4+IDE7IFwKKyAgICAgICAgdm9bc2l6ZS8yICsgaV0gPSAodG9wW2kgLSAxXSArIHRvcFtpXSAqIDIgKyB0b3BbaSArIDFdICsgMikgPj4gMjsgXAorICAgIH0gXAorXAorICAgIGZvciAoaiA9IDA7IGogPCBzaXplIC8gMjsgaisrKSB7IFwKKyAgICAgICAgbWVtY3B5KGRzdCArICBqKjIgICAgICpzdHJpZGUsIHZlICsgc2l6ZS8yIC0gMSAtIGosIHNpemUpOyBcCisgICAgICAgIG1lbWNweShkc3QgKyAoaioyICsgMSkqc3RyaWRlLCB2byArIHNpemUvMiAtIDEgLSBqLCBzaXplKTsgXAorICAgIH0gXAorfQorCitkZWZfdmVydF9yaWdodCg4KQorZGVmX3ZlcnRfcmlnaHQoMTYpCitkZWZfdmVydF9yaWdodCgzMikKKworc3RhdGljIHZvaWQgaG9yX2Rvd25fNHg0X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKQoreworICAgIGludCBsMCA9IGxlZnRbM10sIGwxID0gbGVmdFsyXSwgbDIgPSBsZWZ0WzFdLCBsMyA9IGxlZnRbMF0sCisgICAgICAgIHRsID0gdG9wWy0xXSwgYTAgPSB0b3BbMF0sIGExID0gdG9wWzFdLCBhMiA9IHRvcFsyXTsKKworICAgIERTVCgyLDApID0gKHRsICsgYTAgKiAyICsgYTEgKyAyKSA+PiAyOworICAgIERTVCgzLDApID0gKGEwICsgYTEgKiAyICsgYTIgKyAyKSA+PiAyOworICAgIERTVCgwLDApID0gRFNUKDIsMSkgPSAodGwgKyBsMCArIDEpID4+IDE7CisgICAgRFNUKDEsMCkgPSBEU1QoMywxKSA9IChhMCArIHRsICogMiArIGwwICsgMikgPj4gMjsKKyAgICBEU1QoMCwxKSA9IERTVCgyLDIpID0gKGwwICsgbDEgKyAxKSA+PiAxOworICAgIERTVCgxLDEpID0gRFNUKDMsMikgPSAodGwgKyBsMCAqIDIgKyBsMSArIDIpID4+IDI7CisgICAgRFNUKDAsMikgPSBEU1QoMiwzKSA9IChsMSArIGwyICsgMSkgPj4gMTsKKyAgICBEU1QoMSwyKSA9IERTVCgzLDMpID0gKGwwICsgbDEgKiAyICsgbDIgKyAyKSA+PiAyOworICAgIERTVCgwLDMpID0gKGwyICsgbDMgKyAxKSA+PiAxOworICAgIERTVCgxLDMpID0gKGwxICsgbDIgKiAyICsgbDMgKyAyKSA+PiAyOworfQorCisjZGVmaW5lIGRlZl9ob3JfZG93bihzaXplKSBcCitzdGF0aWMgdm9pZCBob3JfZG93bl8jI3NpemUjI3gjI3NpemUjI19jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApIFwKK3sgXAorICAgIGludCBpLCBqOyBcCisgICAgdWludDhfdCB2W3NpemUgKiAzIC0gMl07IFwKK1wKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDI7IGkrKykgeyBcCisgICAgICAgIHZbaSoyICAgICAgIF0gPSAobGVmdFtpICsgMV0gKyBsZWZ0W2kgKyAwXSArIDEpID4+IDE7IFwKKyAgICAgICAgdltpKjIgICAgKyAxXSA9IChsZWZ0W2kgKyAyXSArIGxlZnRbaSArIDFdICogMiArIGxlZnRbaSArIDBdICsgMikgPj4gMjsgXAorICAgICAgICB2W3NpemUqMiArIGldID0gKHRvcFtpIC0gMV0gKyB0b3BbaV0gKiAyICsgdG9wW2kgKyAxXSArIDIpID4+IDI7IFwKKyAgICB9IFwKKyAgICB2W3NpemUqMiAtIDJdID0gKHRvcFstMV0gKyBsZWZ0W3NpemUgLSAxXSArIDEpID4+IDE7IFwKKyAgICB2W3NpemUqMiAtIDRdID0gKGxlZnRbc2l6ZSAtIDFdICsgbGVmdFtzaXplIC0gMl0gKyAxKSA+PiAxOyBcCisgICAgdltzaXplKjIgLSAxXSA9ICh0b3BbMF0gICsgdG9wWy0xXSAqIDIgKyBsZWZ0W3NpemUgLSAxXSArIDIpID4+IDI7IFwKKyAgICB2W3NpemUqMiAtIDNdID0gKHRvcFstMV0gKyBsZWZ0W3NpemUgLSAxXSAqIDIgKyBsZWZ0W3NpemUgLSAyXSArIDIpID4+IDI7IFwKK1wKKyAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKSBcCisgICAgICAgIG1lbWNweShkc3QgKyBqKnN0cmlkZSwgdiArIHNpemUqMiAtIDIgLSBqKjIsIHNpemUpOyBcCit9CisKK2RlZl9ob3JfZG93big4KQorZGVmX2hvcl9kb3duKDE2KQorZGVmX2hvcl9kb3duKDMyKQorCitzdGF0aWMgdm9pZCB2ZXJ0X2xlZnRfNHg0X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsIGNvbnN0IHVpbnQ4X3QgKnRvcCkKK3sKKyAgICBpbnQgYTAgPSB0b3BbMF0sIGExID0gdG9wWzFdLCBhMiA9IHRvcFsyXSwgYTMgPSB0b3BbM10sCisgICAgICAgIGE0ID0gdG9wWzRdLCBhNSA9IHRvcFs1XSwgYTYgPSB0b3BbNl07CisKKyAgICBEU1QoMCwwKSA9IChhMCArIGExICsgMSkgPj4gMTsKKyAgICBEU1QoMCwxKSA9IChhMCArIGExICogMiArIGEyICsgMikgPj4gMjsKKyAgICBEU1QoMSwwKSA9IERTVCgwLDIpID0gKGExICsgYTIgKyAxKSA+PiAxOworICAgIERTVCgxLDEpID0gRFNUKDAsMykgPSAoYTEgKyBhMiAqIDIgKyBhMyArIDIpID4+IDI7CisgICAgRFNUKDIsMCkgPSBEU1QoMSwyKSA9IChhMiArIGEzICsgMSkgPj4gMTsKKyAgICBEU1QoMiwxKSA9IERTVCgxLDMpID0gKGEyICsgYTMgKiAyICsgYTQgKyAyKSA+PiAyOworICAgIERTVCgzLDApID0gRFNUKDIsMikgPSAoYTMgKyBhNCArIDEpID4+IDE7CisgICAgRFNUKDMsMSkgPSBEU1QoMiwzKSA9IChhMyArIGE0ICogMiArIGE1ICsgMikgPj4gMjsKKyAgICBEU1QoMywyKSA9IChhNCArIGE1ICsgMSkgPj4gMTsKKyAgICBEU1QoMywzKSA9IChhNCArIGE1ICogMiArIGE2ICsgMikgPj4gMjsKK30KKworI2RlZmluZSBkZWZfdmVydF9sZWZ0KHNpemUpIFwKK3N0YXRpYyB2b2lkIHZlcnRfbGVmdF8jI3NpemUjI3gjI3NpemUjI19jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqdG9wKSBcCit7IFwKKyAgICBpbnQgaSwgajsgXAorICAgIHVpbnQ4X3QgdmVbc2l6ZSAtIDFdLCB2b1tzaXplIC0gMV07IFwKK1wKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDI7IGkrKykgeyBcCisgICAgICAgIHZlW2ldID0gKHRvcFtpXSArIHRvcFtpICsgMV0gKyAxKSA+PiAxOyBcCisgICAgICAgIHZvW2ldID0gKHRvcFtpXSArIHRvcFtpICsgMV0gKiAyICsgdG9wW2kgKyAyXSArIDIpID4+IDI7IFwKKyAgICB9IFwKKyAgICB2ZVtzaXplIC0gMl0gPSAodG9wW3NpemUgLSAyXSArIHRvcFtzaXplIC0gMV0gKyAxKSA+PiAxOyBcCisgICAgdm9bc2l6ZSAtIDJdID0gKHRvcFtzaXplIC0gMl0gKyB0b3Bbc2l6ZSAtIDFdICogMyArIDIpID4+IDI7IFwKK1wKKyAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZSAvIDI7IGorKykgeyBcCisgICAgICAgIG1lbWNweShkc3QgKyAgaioyICAgICAgKiBzdHJpZGUsIHZlICsgaiwgc2l6ZSAtIGogLSAxKTsgXAorICAgICAgICBtZW1zZXQoZHN0ICsgIGoqMiAgICAgICogc3RyaWRlICsgc2l6ZSAtIGogLSAxLCB0b3Bbc2l6ZSAtIDFdLCBqICsgMSk7IFwKKyAgICAgICAgbWVtY3B5KGRzdCArIChqKjIgKyAxKSAqIHN0cmlkZSwgdm8gKyBqLCBzaXplIC0gaiAtIDEpOyBcCisgICAgICAgIG1lbXNldChkc3QgKyAoaioyICsgMSkgKiBzdHJpZGUgKyBzaXplIC0gaiAtIDEsIHRvcFtzaXplIC0gMV0sIGogKyAxKTsgXAorICAgIH0gXAorfQorCitkZWZfdmVydF9sZWZ0KDgpCitkZWZfdmVydF9sZWZ0KDE2KQorZGVmX3ZlcnRfbGVmdCgzMikKKworc3RhdGljIHZvaWQgaG9yX3VwXzR4NF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApCit7CisgICAgaW50IGwwID0gbGVmdFszXSwgbDEgPSBsZWZ0WzJdLCBsMiA9IGxlZnRbMV0sIGwzID0gbGVmdFswXTsKKworICAgIERTVCgwLDApID0gKGwwICsgbDEgKyAxKSA+PiAxOworICAgIERTVCgxLDApID0gKGwwICsgbDEgKiAyICsgbDIgKyAyKSA+PiAyOworICAgIERTVCgwLDEpID0gRFNUKDIsMCkgPSAobDEgKyBsMiArIDEpID4+IDE7CisgICAgRFNUKDEsMSkgPSBEU1QoMywwKSA9IChsMSArIGwyICogMiArIGwzICsgMikgPj4gMjsKKyAgICBEU1QoMCwyKSA9IERTVCgyLDEpID0gKGwyICsgbDMgKyAxKSA+PiAxOworICAgIERTVCgxLDIpID0gRFNUKDMsMSkgPSAobDIgKyBsMyAqIDMgKyAyKSA+PiAyOworICAgIERTVCgwLDMpID0gRFNUKDEsMykgPSBEU1QoMiwyKSA9IERTVCgyLDMpID0gRFNUKDMsMikgPSBEU1QoMywzKSA9IGwzOworfQorCisjZGVmaW5lIGRlZl9ob3JfdXAoc2l6ZSkgXAorc3RhdGljIHZvaWQgaG9yX3VwXyMjc2l6ZSMjeCMjc2l6ZSMjX2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LCBjb25zdCB1aW50OF90ICp0b3ApIFwKK3sgXAorICAgIGludCBpLCBqOyBcCisgICAgdWludDhfdCB2W3NpemUqMiAtIDJdOyBcCitcCisgICAgZm9yIChpID0gMDsgaSA8IHNpemUgLSAyOyBpKyspIHsgXAorICAgICAgICB2W2kqMiAgICBdID0gKGxlZnRbc2l6ZSAtIGkgLSAxXSArIGxlZnRbc2l6ZSAtIGkgLSAyXSArIDEpID4+IDE7IFwKKyAgICAgICAgdltpKjIgKyAxXSA9IChsZWZ0W3NpemUgLSBpIC0gMV0gKyBsZWZ0W3NpemUgLSBpIC0gMl0gKiAyICsgbGVmdFtzaXplIC0gaSAtIDNdICsgMikgPj4gMjsgXAorICAgIH0gXAorICAgIHZbc2l6ZSoyIC0gNF0gPSAobGVmdFsxXSArIGxlZnRbMF0gKyAxKSA+PiAxOyBcCisgICAgdltzaXplKjIgLSAzXSA9IChsZWZ0WzFdICsgbGVmdFswXSAqIDMgKyAyKSA+PiAyOyBcCitcCisgICAgZm9yIChqID0gMDsgaiA8IHNpemUgLyAyOyBqKyspIFwKKyAgICAgICAgbWVtY3B5KGRzdCArIGoqc3RyaWRlLCB2ICsgaioyLCBzaXplKTsgXAorICAgIGZvciAoaiA9IHNpemUgLyAyOyBqIDwgc2l6ZTsgaisrKSB7IFwKKyAgICAgICAgbWVtY3B5KGRzdCArIGoqc3RyaWRlLCB2ICsgaioyLCBzaXplKjIgLSAyIC0gaioyKTsgXAorICAgICAgICBtZW1zZXQoZHN0ICsgaipzdHJpZGUgKyBzaXplKjIgLSAyIC0gaioyLCBsZWZ0WzBdLCBcCisgICAgICAgICAgICAgICAyICsgaioyIC0gc2l6ZSk7IFwKKyAgICB9IFwKK30KKworZGVmX2hvcl91cCg4KQorZGVmX2hvcl91cCgxNikKK2RlZl9ob3JfdXAoMzIpCisKKyN1bmRlZiBEU1QKKworc3RhdGljIGF2X2NvbGQgdm9pZCB2cDlkc3BfaW50cmFwcmVkX2luaXQoVlA5RFNQQ29udGV4dCAqZHNwKQoreworI2RlZmluZSBpbml0X2ludHJhX3ByZWQodHgsIHN6KSBcCisgICAgZHNwLT5pbnRyYV9wcmVkW3R4XVtWRVJUX1BSRURdICAgICAgICAgICAgPSB2ZXJ0XyMjc3ojI19jOyBcCisgICAgZHNwLT5pbnRyYV9wcmVkW3R4XVtIT1JfUFJFRF0gICAgICAgICAgICAgPSBob3JfIyNzeiMjX2M7IFwKKyAgICBkc3AtPmludHJhX3ByZWRbdHhdW0RDX1BSRURdICAgICAgICAgICAgICA9IGRjXyMjc3ojI19jOyBcCisgICAgZHNwLT5pbnRyYV9wcmVkW3R4XVtESUFHX0RPV05fTEVGVF9QUkVEXSAgPSBkaWFnX2Rvd25sZWZ0XyMjc3ojI19jOyBcCisgICAgZHNwLT5pbnRyYV9wcmVkW3R4XVtESUFHX0RPV05fUklHSFRfUFJFRF0gPSBkaWFnX2Rvd25yaWdodF8jI3N6IyNfYzsgXAorICAgIGRzcC0+aW50cmFfcHJlZFt0eF1bVkVSVF9SSUdIVF9QUkVEXSAgICAgID0gdmVydF9yaWdodF8jI3N6IyNfYzsgXAorICAgIGRzcC0+aW50cmFfcHJlZFt0eF1bSE9SX0RPV05fUFJFRF0gICAgICAgID0gaG9yX2Rvd25fIyNzeiMjX2M7IFwKKyAgICBkc3AtPmludHJhX3ByZWRbdHhdW1ZFUlRfTEVGVF9QUkVEXSAgICAgICA9IHZlcnRfbGVmdF8jI3N6IyNfYzsgXAorICAgIGRzcC0+aW50cmFfcHJlZFt0eF1bSE9SX1VQX1BSRURdICAgICAgICAgID0gaG9yX3VwXyMjc3ojI19jOyBcCisgICAgZHNwLT5pbnRyYV9wcmVkW3R4XVtUTV9WUDhfUFJFRF0gICAgICAgICAgPSB0bV8jI3N6IyNfYzsgXAorICAgIGRzcC0+aW50cmFfcHJlZFt0eF1bTEVGVF9EQ19QUkVEXSAgICAgICAgID0gZGNfbGVmdF8jI3N6IyNfYzsgXAorICAgIGRzcC0+aW50cmFfcHJlZFt0eF1bVE9QX0RDX1BSRURdICAgICAgICAgID0gZGNfdG9wXyMjc3ojI19jOyBcCisgICAgZHNwLT5pbnRyYV9wcmVkW3R4XVtEQ18xMjhfUFJFRF0gICAgICAgICAgPSBkY18xMjhfIyNzeiMjX2M7IFwKKyAgICBkc3AtPmludHJhX3ByZWRbdHhdW0RDXzEyN19QUkVEXSAgICAgICAgICA9IGRjXzEyN18jI3N6IyNfYzsgXAorICAgIGRzcC0+aW50cmFfcHJlZFt0eF1bRENfMTI5X1BSRURdICAgICAgICAgID0gZGNfMTI5XyMjc3ojI19jCisKKyAgICBpbml0X2ludHJhX3ByZWQoVFhfNFg0LCAgIDR4NCk7CisgICAgaW5pdF9pbnRyYV9wcmVkKFRYXzhYOCwgICA4eDgpOworICAgIGluaXRfaW50cmFfcHJlZChUWF8xNlgxNiwgMTZ4MTYpOworICAgIGluaXRfaW50cmFfcHJlZChUWF8zMlgzMiwgMzJ4MzIpOworCisjdW5kZWYgaW5pdF9pbnRyYV9wcmVkCit9CisKKyNkZWZpbmUgaXR4Zm1fd3JhcHBlcih0eXBlX2EsIHR5cGVfYiwgc3osIGJpdHMsIGhhc19kY29ubHkpIFwKK3N0YXRpYyB2b2lkIHR5cGVfYSMjXyMjdHlwZV9iIyNfIyNzeiMjeCMjc3ojI19hZGRfYyh1aW50OF90ICpkc3QsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBlb2IpIFwKK3sgXAorICAgIGludCBpLCBqOyBcCisgICAgaW50MTZfdCB0bXBbc3ogKiBzel0sIG91dFtzel07IFwKK1wKKyAgICBpZiAoaGFzX2Rjb25seSAmJiBlb2IgPT0gMSkgeyBcCisgICAgICAgIGNvbnN0IGludCB0ICA9ICgoKGJsb2NrWzBdICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OyBcCisgICAgICAgIGJsb2NrWzBdID0gMDsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3o7IGkrKykgeyBcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3o7IGorKykgXAorICAgICAgICAgICAgICAgIGRzdFtqICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZHN0W2ogKiBzdHJpZGVdICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdHMgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQgKyAoMSA8PCAoYml0cyAtIDEpKSkgPj4gYml0cyA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KSk7IFwKKyAgICAgICAgICAgIGRzdCsrOyBcCisgICAgICAgIH0gXAorICAgICAgICByZXR1cm47IFwKKyAgICB9IFwKK1wKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3o7IGkrKykgXAorICAgICAgICB0eXBlX2EjI3N6IyNfMWQoYmxvY2sgKyBpLCBzeiwgdG1wICsgaSAqIHN6LCAwKTsgXAorICAgIG1lbXNldChibG9jaywgMCwgc3ogKiBzeiAqIHNpemVvZigqYmxvY2spKTsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBzejsgaSsrKSB7IFwKKyAgICAgICAgdHlwZV9iIyNzeiMjXzFkKHRtcCArIGksIHN6LCBvdXQsIDEpOyBcCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzejsgaisrKSBcCisgICAgICAgICAgICBkc3RbaiAqIHN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFtqICogc3RyaWRlXSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdHMgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0W2pdICsgKDEgPDwgKGJpdHMgLSAxKSkpID4+IGJpdHMgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbal0pKTsgXAorICAgICAgICBkc3QrKzsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIGl0eGZtX3dyYXAoc3osIGJpdHMpIFwKK2l0eGZtX3dyYXBwZXIoaWRjdCwgIGlkY3QsICBzeiwgYml0cywgMSkgXAoraXR4Zm1fd3JhcHBlcihpYWRzdCwgaWRjdCwgIHN6LCBiaXRzLCAwKSBcCitpdHhmbV93cmFwcGVyKGlkY3QsICBpYWRzdCwgc3osIGJpdHMsIDApIFwKK2l0eGZtX3dyYXBwZXIoaWFkc3QsIGlhZHN0LCBzeiwgYml0cywgMCkKKworI2RlZmluZSBJTih4KSBpblsoeCkgKiBzdHJpZGVdCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgaWRjdDRfMWQoY29uc3QgaW50MTZfdCAqaW4sIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKm91dCwgaW50IHBhc3MpCit7CisgICAgaW50IHQwLCB0MSwgdDIsIHQzOworCisgICAgdDAgPSAoKElOKDApICsgSU4oMikpICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxID0gKChJTigwKSAtIElOKDIpKSAqIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MiA9IChJTigxKSAqICA2MjcwIC0gSU4oMykgKiAxNTEzNyArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDMgPSAoSU4oMSkgKiAxNTEzNyArIElOKDMpICogIDYyNzAgKyAoMSA8PCAxMykpID4+IDE0OworCisgICAgb3V0WzBdID0gdDAgKyB0MzsKKyAgICBvdXRbMV0gPSB0MSArIHQyOworICAgIG91dFsyXSA9IHQxIC0gdDI7CisgICAgb3V0WzNdID0gdDAgLSB0MzsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBpYWRzdDRfMWQoY29uc3QgaW50MTZfdCAqaW4sIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpvdXQsIGludCBwYXNzKQoreworICAgIGludCB0MCwgdDEsIHQyLCB0MzsKKworICAgIHQwID0gIDUyODMgKiBJTigwKSArIDE1MjEyICogSU4oMikgKyAgOTkyOSAqIElOKDMpOworICAgIHQxID0gIDk5MjkgKiBJTigwKSAtICA1MjgzICogSU4oMikgLSAxNTIxMiAqIElOKDMpOworICAgIHQyID0gMTMzNzcgKiAoSU4oMCkgLSBJTigyKSArIElOKDMpKTsKKyAgICB0MyA9IDEzMzc3ICogSU4oMSk7CisKKyAgICBvdXRbMF0gPSAodDAgKyB0MyAgICAgICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICBvdXRbMV0gPSAodDEgKyB0MyAgICAgICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICBvdXRbMl0gPSAodDIgICAgICAgICAgICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICBvdXRbM10gPSAodDAgKyB0MSAtIHQzICsgKDEgPDwgMTMpKSA+PiAxNDsKK30KKworaXR4Zm1fd3JhcCg0LCA0KQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGlkY3Q4XzFkKGNvbnN0IGludDE2X3QgKmluLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpvdXQsIGludCBwYXNzKQoreworICAgIGludCB0MCwgdDBhLCB0MSwgdDFhLCB0MiwgdDJhLCB0MywgdDNhLCB0NCwgdDRhLCB0NSwgdDVhLCB0NiwgdDZhLCB0NywgdDdhOworCisgICAgdDBhID0gKChJTigwKSArIElOKDQpKSAqIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MWEgPSAoKElOKDApIC0gSU4oNCkpICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQyYSA9IChJTigyKSAqICA2MjcwIC0gSU4oNikgKiAxNTEzNyArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDNhID0gKElOKDIpICogMTUxMzcgKyBJTig2KSAqICA2MjcwICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0NGEgPSAoSU4oMSkgKiAgMzE5NiAtIElOKDcpICogMTYwNjkgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQ1YSA9IChJTig1KSAqIDEzNjIzIC0gSU4oMykgKiAgOTEwMiArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDZhID0gKElOKDUpICogIDkxMDIgKyBJTigzKSAqIDEzNjIzICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0N2EgPSAoSU4oMSkgKiAxNjA2OSArIElOKDcpICogIDMxOTYgKyAoMSA8PCAxMykpID4+IDE0OworCisgICAgdDAgID0gdDBhICsgdDNhOworICAgIHQxICA9IHQxYSArIHQyYTsKKyAgICB0MiAgPSB0MWEgLSB0MmE7CisgICAgdDMgID0gdDBhIC0gdDNhOworICAgIHQ0ICA9IHQ0YSArIHQ1YTsKKyAgICB0NWEgPSB0NGEgLSB0NWE7CisgICAgdDcgID0gdDdhICsgdDZhOworICAgIHQ2YSA9IHQ3YSAtIHQ2YTsKKworICAgIHQ1ICA9ICgodDZhIC0gdDVhKSAqIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0NiAgPSAoKHQ2YSArIHQ1YSkgKiAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisKKyAgICBvdXRbMF0gPSB0MCArIHQ3OworICAgIG91dFsxXSA9IHQxICsgdDY7CisgICAgb3V0WzJdID0gdDIgKyB0NTsKKyAgICBvdXRbM10gPSB0MyArIHQ0OworICAgIG91dFs0XSA9IHQzIC0gdDQ7CisgICAgb3V0WzVdID0gdDIgLSB0NTsKKyAgICBvdXRbNl0gPSB0MSAtIHQ2OworICAgIG91dFs3XSA9IHQwIC0gdDc7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgaWFkc3Q4XzFkKGNvbnN0IGludDE2X3QgKmluLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqb3V0LCBpbnQgcGFzcykKK3sKKyAgICBpbnQgdDAsIHQwYSwgdDEsIHQxYSwgdDIsIHQyYSwgdDMsIHQzYSwgdDQsIHQ0YSwgdDUsIHQ1YSwgdDYsIHQ2YSwgdDcsIHQ3YTsKKworICAgIHQwYSA9IDE2MzA1ICogSU4oNykgKyAgMTYwNiAqIElOKDApOworICAgIHQxYSA9ICAxNjA2ICogSU4oNykgLSAxNjMwNSAqIElOKDApOworICAgIHQyYSA9IDE0NDQ5ICogSU4oNSkgKyAgNzcyMyAqIElOKDIpOworICAgIHQzYSA9ICA3NzIzICogSU4oNSkgLSAxNDQ0OSAqIElOKDIpOworICAgIHQ0YSA9IDEwMzk0ICogSU4oMykgKyAxMjY2NSAqIElOKDQpOworICAgIHQ1YSA9IDEyNjY1ICogSU4oMykgLSAxMDM5NCAqIElOKDQpOworICAgIHQ2YSA9ICA0NzU2ICogSU4oMSkgKyAxNTY3OSAqIElOKDYpOworICAgIHQ3YSA9IDE1Njc5ICogSU4oMSkgLSAgNDc1NiAqIElOKDYpOworCisgICAgdDAgPSAodDBhICsgdDRhICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MSA9ICh0MWEgKyB0NWEgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQyID0gKHQyYSArIHQ2YSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDMgPSAodDNhICsgdDdhICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0NCA9ICh0MGEgLSB0NGEgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQ1ID0gKHQxYSAtIHQ1YSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDYgPSAodDJhIC0gdDZhICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0NyA9ICh0M2EgLSB0N2EgKyAoMSA8PCAxMykpID4+IDE0OworCisgICAgdDRhID0gMTUxMzcgKiB0NCArICA2MjcwICogdDU7CisgICAgdDVhID0gIDYyNzAgKiB0NCAtIDE1MTM3ICogdDU7CisgICAgdDZhID0gMTUxMzcgKiB0NyAtICA2MjcwICogdDY7CisgICAgdDdhID0gIDYyNzAgKiB0NyArIDE1MTM3ICogdDY7CisKKyAgICBvdXRbMF0gPSAgIHQwICsgdDI7CisgICAgb3V0WzddID0gLSh0MSArIHQzKTsKKyAgICB0MiAgICAgPSAgIHQwIC0gdDI7CisgICAgdDMgICAgID0gICB0MSAtIHQzOworCisgICAgb3V0WzFdID0gLSgodDRhICsgdDZhICsgKDEgPDwgMTMpKSA+PiAxNCk7CisgICAgb3V0WzZdID0gICAodDVhICsgdDdhICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0NiAgICAgPSAgICh0NGEgLSB0NmEgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQ3ICAgICA9ICAgKHQ1YSAtIHQ3YSArICgxIDw8IDEzKSkgPj4gMTQ7CisKKyAgICBvdXRbM10gPSAtKCgodDIgKyB0MykgKiAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQpOworICAgIG91dFs0XSA9ICAgKCh0MiAtIHQzKSAqIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICBvdXRbMl0gPSAgICgodDYgKyB0NykgKiAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgb3V0WzVdID0gLSgoKHQ2IC0gdDcpICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0KTsKK30KKworaXR4Zm1fd3JhcCg4LCA1KQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGlkY3QxNl8xZChjb25zdCBpbnQxNl90ICppbiwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKm91dCwgaW50IHBhc3MpCit7CisgICAgaW50IHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDgsIHQ5LCB0MTAsIHQxMSwgdDEyLCB0MTMsIHQxNCwgdDE1OworICAgIGludCB0MGEsIHQxYSwgdDJhLCB0M2EsIHQ0YSwgdDVhLCB0NmEsIHQ3YTsKKyAgICBpbnQgdDhhLCB0OWEsIHQxMGEsIHQxMWEsIHQxMmEsIHQxM2EsIHQxNGEsIHQxNWE7CisKKyAgICB0MGEgID0gKChJTigwKSArIElOKDgpKSAqIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MWEgID0gKChJTigwKSAtIElOKDgpKSAqIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MmEgID0gKElOKDQpICAqICA2MjcwIC0gSU4oMTIpICogMTUxMzcgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQzYSAgPSAoSU4oNCkgICogMTUxMzcgKyBJTigxMikgKiAgNjI3MCArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDRhICA9IChJTigyKSAgKiAgMzE5NiAtIElOKDE0KSAqIDE2MDY5ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0N2EgID0gKElOKDIpICAqIDE2MDY5ICsgSU4oMTQpICogIDMxOTYgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQ1YSAgPSAoSU4oMTApICogMTM2MjMgLSBJTig2KSAgKiAgOTEwMiArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDZhICA9IChJTigxMCkgKiAgOTEwMiArIElOKDYpICAqIDEzNjIzICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0OGEgID0gKElOKDEpICAqICAxNjA2IC0gSU4oMTUpICogMTYzMDUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxNWEgPSAoSU4oMSkgICogMTYzMDUgKyBJTigxNSkgKiAgMTYwNiArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDlhICA9IChJTig5KSAgKiAxMjY2NSAtIElOKDcpICAqIDEwMzk0ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MTRhID0gKElOKDkpICAqIDEwMzk0ICsgSU4oNykgICogMTI2NjUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxMGEgPSAoSU4oNSkgICogIDc3MjMgLSBJTigxMSkgKiAxNDQ0OSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDEzYSA9IChJTig1KSAgKiAxNDQ0OSArIElOKDExKSAqICA3NzIzICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MTFhID0gKElOKDEzKSAqIDE1Njc5IC0gSU4oMykgICogIDQ3NTYgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxMmEgPSAoSU4oMTMpICogIDQ3NTYgKyBJTigzKSAgKiAxNTY3OSArICgxIDw8IDEzKSkgPj4gMTQ7CisKKyAgICB0MCAgPSB0MGEgICsgdDNhOworICAgIHQxICA9IHQxYSAgKyB0MmE7CisgICAgdDIgID0gdDFhICAtIHQyYTsKKyAgICB0MyAgPSB0MGEgIC0gdDNhOworICAgIHQ0ICA9IHQ0YSAgKyB0NWE7CisgICAgdDUgID0gdDRhICAtIHQ1YTsKKyAgICB0NiAgPSB0N2EgIC0gdDZhOworICAgIHQ3ICA9IHQ3YSAgKyB0NmE7CisgICAgdDggID0gdDhhICArIHQ5YTsKKyAgICB0OSAgPSB0OGEgIC0gdDlhOworICAgIHQxMCA9IHQxMWEgLSB0MTBhOworICAgIHQxMSA9IHQxMWEgKyB0MTBhOworICAgIHQxMiA9IHQxMmEgKyB0MTNhOworICAgIHQxMyA9IHQxMmEgLSB0MTNhOworICAgIHQxNCA9IHQxNWEgLSB0MTRhOworICAgIHQxNSA9IHQxNWEgKyB0MTRhOworCisgICAgdDVhICA9ICgodDYgLSB0NSkgKiAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDZhICA9ICgodDYgKyB0NSkgKiAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDlhICA9ICggIHQxNCAqICA2MjcwIC0gdDkgICogMTUxMzcgICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MTRhID0gKCAgdDE0ICogMTUxMzcgKyB0OSAgKiAgNjI3MCAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxMGEgPSAoLSh0MTMgKiAxNTEzNyArIHQxMCAqICA2MjcwKSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDEzYSA9ICggIHQxMyAqICA2MjcwIC0gdDEwICogMTUxMzcgICsgKDEgPDwgMTMpKSA+PiAxNDsKKworICAgIHQwYSAgPSB0MCAgICsgdDc7CisgICAgdDFhICA9IHQxICAgKyB0NmE7CisgICAgdDJhICA9IHQyICAgKyB0NWE7CisgICAgdDNhICA9IHQzICAgKyB0NDsKKyAgICB0NCAgID0gdDMgICAtIHQ0OworICAgIHQ1ICAgPSB0MiAgIC0gdDVhOworICAgIHQ2ICAgPSB0MSAgIC0gdDZhOworICAgIHQ3ICAgPSB0MCAgIC0gdDc7CisgICAgdDhhICA9IHQ4ICAgKyB0MTE7CisgICAgdDkgICA9IHQ5YSAgKyB0MTBhOworICAgIHQxMCAgPSB0OWEgIC0gdDEwYTsKKyAgICB0MTFhID0gdDggICAtIHQxMTsKKyAgICB0MTJhID0gdDE1ICAtIHQxMjsKKyAgICB0MTMgID0gdDE0YSAtIHQxM2E7CisgICAgdDE0ICA9IHQxNGEgKyB0MTNhOworICAgIHQxNWEgPSB0MTUgICsgdDEyOworCisgICAgdDEwYSA9ICgodDEzICAtIHQxMCkgICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxM2EgPSAoKHQxMyAgKyB0MTApICAqIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MTEgID0gKCh0MTJhIC0gdDExYSkgKiAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDEyICA9ICgodDEyYSArIHQxMWEpICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworCisgICAgb3V0WyAwXSA9IHQwYSArIHQxNWE7CisgICAgb3V0WyAxXSA9IHQxYSArIHQxNDsKKyAgICBvdXRbIDJdID0gdDJhICsgdDEzYTsKKyAgICBvdXRbIDNdID0gdDNhICsgdDEyOworICAgIG91dFsgNF0gPSB0NCAgKyB0MTE7CisgICAgb3V0WyA1XSA9IHQ1ICArIHQxMGE7CisgICAgb3V0WyA2XSA9IHQ2ICArIHQ5OworICAgIG91dFsgN10gPSB0NyAgKyB0OGE7CisgICAgb3V0WyA4XSA9IHQ3ICAtIHQ4YTsKKyAgICBvdXRbIDldID0gdDYgIC0gdDk7CisgICAgb3V0WzEwXSA9IHQ1ICAtIHQxMGE7CisgICAgb3V0WzExXSA9IHQ0ICAtIHQxMTsKKyAgICBvdXRbMTJdID0gdDNhIC0gdDEyOworICAgIG91dFsxM10gPSB0MmEgLSB0MTNhOworICAgIG91dFsxNF0gPSB0MWEgLSB0MTQ7CisgICAgb3V0WzE1XSA9IHQwYSAtIHQxNWE7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgaWFkc3QxNl8xZChjb25zdCBpbnQxNl90ICppbiwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpvdXQsIGludCBwYXNzKQoreworICAgIGludCB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4LCB0OSwgdDEwLCB0MTEsIHQxMiwgdDEzLCB0MTQsIHQxNTsKKyAgICBpbnQgdDBhLCB0MWEsIHQyYSwgdDNhLCB0NGEsIHQ1YSwgdDZhLCB0N2E7CisgICAgaW50IHQ4YSwgdDlhLCB0MTBhLCB0MTFhLCB0MTJhLCB0MTNhLCB0MTRhLCB0MTVhOworCisgICAgdDAgID0gSU4oMTUpICogMTYzNjQgKyBJTigwKSAgKiAgIDgwNDsKKyAgICB0MSAgPSBJTigxNSkgKiAgIDgwNCAtIElOKDApICAqIDE2MzY0OworICAgIHQyICA9IElOKDEzKSAqIDE1ODkzICsgSU4oMikgICogIDM5ODE7CisgICAgdDMgID0gSU4oMTMpICogIDM5ODEgLSBJTigyKSAgKiAxNTg5MzsKKyAgICB0NCAgPSBJTigxMSkgKiAxNDgxMSArIElOKDQpICAqICA3MDA1OworICAgIHQ1ICA9IElOKDExKSAqICA3MDA1IC0gSU4oNCkgICogMTQ4MTE7CisgICAgdDYgID0gSU4oOSkgICogMTMxNjAgKyBJTig2KSAgKiAgOTc2MDsKKyAgICB0NyAgPSBJTig5KSAgKiAgOTc2MCAtIElOKDYpICAqIDEzMTYwOworICAgIHQ4ICA9IElOKDcpICAqIDExMDAzICsgSU4oOCkgICogMTIxNDA7CisgICAgdDkgID0gSU4oNykgICogMTIxNDAgLSBJTig4KSAgKiAxMTAwMzsKKyAgICB0MTAgPSBJTig1KSAgKiAgODQyMyArIElOKDEwKSAqIDE0MDUzOworICAgIHQxMSA9IElOKDUpICAqIDE0MDUzIC0gSU4oMTApICogIDg0MjM7CisgICAgdDEyID0gSU4oMykgICogIDU1MjAgKyBJTigxMikgKiAxNTQyNjsKKyAgICB0MTMgPSBJTigzKSAgKiAxNTQyNiAtIElOKDEyKSAqICA1NTIwOworICAgIHQxNCA9IElOKDEpICAqICAyNDA0ICsgSU4oMTQpICogMTYyMDc7CisgICAgdDE1ID0gSU4oMSkgICogMTYyMDcgLSBJTigxNCkgKiAgMjQwNDsKKworICAgIHQwYSAgPSAodDAgKyB0OCAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxYSAgPSAodDEgKyB0OSAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQyYSAgPSAodDIgKyB0MTAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQzYSAgPSAodDMgKyB0MTEgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQ0YSAgPSAodDQgKyB0MTIgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQ1YSAgPSAodDUgKyB0MTMgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQ2YSAgPSAodDYgKyB0MTQgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQ3YSAgPSAodDcgKyB0MTUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQ4YSAgPSAodDAgLSB0OCAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQ5YSAgPSAodDEgLSB0OSAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxMGEgPSAodDIgLSB0MTAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxMWEgPSAodDMgLSB0MTEgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxMmEgPSAodDQgLSB0MTIgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxM2EgPSAodDUgLSB0MTMgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxNGEgPSAodDYgLSB0MTQgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxNWEgPSAodDcgLSB0MTUgKyAoMSA8PCAxMykpID4+IDE0OworCisgICAgdDggICA9IHQ4YSAgKiAxNjA2OSArIHQ5YSAgKiAgMzE5NjsKKyAgICB0OSAgID0gdDhhICAqICAzMTk2IC0gdDlhICAqIDE2MDY5OworICAgIHQxMCAgPSB0MTBhICogIDkxMDIgKyB0MTFhICogMTM2MjM7CisgICAgdDExICA9IHQxMGEgKiAxMzYyMyAtIHQxMWEgKiAgOTEwMjsKKyAgICB0MTIgID0gdDEzYSAqIDE2MDY5IC0gdDEyYSAqICAzMTk2OworICAgIHQxMyAgPSB0MTNhICogIDMxOTYgKyB0MTJhICogMTYwNjk7CisgICAgdDE0ICA9IHQxNWEgKiAgOTEwMiAtIHQxNGEgKiAxMzYyMzsKKyAgICB0MTUgID0gdDE1YSAqIDEzNjIzICsgdDE0YSAqICA5MTAyOworCisgICAgdDAgICA9IHQwYSArIHQ0YTsKKyAgICB0MSAgID0gdDFhICsgdDVhOworICAgIHQyICAgPSB0MmEgKyB0NmE7CisgICAgdDMgICA9IHQzYSArIHQ3YTsKKyAgICB0NCAgID0gdDBhIC0gdDRhOworICAgIHQ1ICAgPSB0MWEgLSB0NWE7CisgICAgdDYgICA9IHQyYSAtIHQ2YTsKKyAgICB0NyAgID0gdDNhIC0gdDdhOworICAgIHQ4YSAgPSAodDggICsgdDEyICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0OWEgID0gKHQ5ICArIHQxMyArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDEwYSA9ICh0MTAgKyB0MTQgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxMWEgPSAodDExICsgdDE1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MTJhID0gKHQ4ICAtIHQxMiArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDEzYSA9ICh0OSAgLSB0MTMgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxNGEgPSAodDEwIC0gdDE0ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MTVhID0gKHQxMSAtIHQxNSArICgxIDw8IDEzKSkgPj4gMTQ7CisKKyAgICB0NGEgID0gdDQgKiAxNTEzNyArIHQ1ICogIDYyNzA7CisgICAgdDVhICA9IHQ0ICogIDYyNzAgLSB0NSAqIDE1MTM3OworICAgIHQ2YSAgPSB0NyAqIDE1MTM3IC0gdDYgKiAgNjI3MDsKKyAgICB0N2EgID0gdDcgKiAgNjI3MCArIHQ2ICogMTUxMzc7CisgICAgdDEyICA9IHQxMmEgKiAxNTEzNyArIHQxM2EgKiAgNjI3MDsKKyAgICB0MTMgID0gdDEyYSAqICA2MjcwIC0gdDEzYSAqIDE1MTM3OworICAgIHQxNCAgPSB0MTVhICogMTUxMzcgLSB0MTRhICogIDYyNzA7CisgICAgdDE1ICA9IHQxNWEgKiAgNjI3MCArIHQxNGEgKiAxNTEzNzsKKworICAgIG91dFsgMF0gPSAgIHQwICsgdDI7CisgICAgb3V0WzE1XSA9IC0odDEgKyB0Myk7CisgICAgdDJhICAgICA9ICAgdDAgLSB0MjsKKyAgICB0M2EgICAgID0gICB0MSAtIHQzOworICAgIG91dFsgM10gPSAtKCh0NGEgKyB0NmEgKyAoMSA8PCAxMykpID4+IDE0KTsKKyAgICBvdXRbMTJdID0gICAodDVhICsgdDdhICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0NiAgICAgID0gICAodDRhIC0gdDZhICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0NyAgICAgID0gICAodDVhIC0gdDdhICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICBvdXRbIDFdID0gLSh0OGEgKyB0MTBhKTsKKyAgICBvdXRbMTRdID0gICB0OWEgKyB0MTFhOworICAgIHQxMCAgICAgPSAgIHQ4YSAtIHQxMGE7CisgICAgdDExICAgICA9ICAgdDlhIC0gdDExYTsKKyAgICBvdXRbIDJdID0gICAodDEyICsgdDE0ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICBvdXRbMTNdID0gLSgodDEzICsgdDE1ICsgKDEgPDwgMTMpKSA+PiAxNCk7CisgICAgdDE0YSAgICA9ICAgKHQxMiAtIHQxNCArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDE1YSAgICA9ICAgKHQxMyAtIHQxNSArICgxIDw8IDEzKSkgPj4gMTQ7CisKKyAgICBvdXRbIDddID0gKCh0MmEgICsgdDNhKSAgKiAtMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIG91dFsgOF0gPSAoKHQyYSAgLSB0M2EpICAqICAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgb3V0WyA0XSA9ICgodDcgICArIHQ2KSAgICogIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICBvdXRbMTFdID0gKCh0NyAgIC0gdDYpICAgKiAgMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIG91dFsgNl0gPSAoKHQxMSAgKyB0MTApICAqICAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgb3V0WyA5XSA9ICgodDExICAtIHQxMCkgICogIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICBvdXRbIDVdID0gKCh0MTRhICsgdDE1YSkgKiAtMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIG91dFsxMF0gPSAoKHQxNGEgLSB0MTVhKSAqICAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7Cit9CisKK2l0eGZtX3dyYXAoMTYsIDYpCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgaWRjdDMyXzFkKGNvbnN0IGludDE2X3QgKmluLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqb3V0LCBpbnQgcGFzcykKK3sKKyAgICBpbnQgdDBhICA9ICgoSU4oMCkgKyBJTigxNikpICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIGludCB0MWEgID0gKChJTigwKSAtIElOKDE2KSkgKiAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQyYSAgPSAoSU4oIDgpICogIDYyNzAgLSBJTigyNCkgKiAxNTEzNyArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQzYSAgPSAoSU4oIDgpICogMTUxMzcgKyBJTigyNCkgKiAgNjI3MCArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQ0YSAgPSAoSU4oIDQpICogIDMxOTYgLSBJTigyOCkgKiAxNjA2OSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQ3YSAgPSAoSU4oIDQpICogMTYwNjkgKyBJTigyOCkgKiAgMzE5NiArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQ1YSAgPSAoSU4oMjApICogMTM2MjMgLSBJTigxMikgKiAgOTEwMiArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQ2YSAgPSAoSU4oMjApICogIDkxMDIgKyBJTigxMikgKiAxMzYyMyArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQ4YSAgPSAoSU4oIDIpICogIDE2MDYgLSBJTigzMCkgKiAxNjMwNSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQxNWEgPSAoSU4oIDIpICogMTYzMDUgKyBJTigzMCkgKiAgMTYwNiArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQ5YSAgPSAoSU4oMTgpICogMTI2NjUgLSBJTigxNCkgKiAxMDM5NCArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQxNGEgPSAoSU4oMTgpICogMTAzOTQgKyBJTigxNCkgKiAxMjY2NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQxMGEgPSAoSU4oMTApICogIDc3MjMgLSBJTigyMikgKiAxNDQ0OSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQxM2EgPSAoSU4oMTApICogMTQ0NDkgKyBJTigyMikgKiAgNzcyMyArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQxMWEgPSAoSU4oMjYpICogMTU2NzkgLSBJTiggNikgKiAgNDc1NiArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQxMmEgPSAoSU4oMjYpICogIDQ3NTYgKyBJTiggNikgKiAxNTY3OSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQxNmEgPSAoSU4oIDEpICogICA4MDQgLSBJTigzMSkgKiAxNjM2NCArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQzMWEgPSAoSU4oIDEpICogMTYzNjQgKyBJTigzMSkgKiAgIDgwNCArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQxN2EgPSAoSU4oMTcpICogMTIxNDAgLSBJTigxNSkgKiAxMTAwMyArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQzMGEgPSAoSU4oMTcpICogMTEwMDMgKyBJTigxNSkgKiAxMjE0MCArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQxOGEgPSAoSU4oIDkpICogIDcwMDUgLSBJTigyMykgKiAxNDgxMSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQyOWEgPSAoSU4oIDkpICogMTQ4MTEgKyBJTigyMykgKiAgNzAwNSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQxOWEgPSAoSU4oMjUpICogMTU0MjYgLSBJTiggNykgKiAgNTUyMCArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQyOGEgPSAoSU4oMjUpICogIDU1MjAgKyBJTiggNykgKiAxNTQyNiArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQyMGEgPSAoSU4oIDUpICogIDM5ODEgLSBJTigyNykgKiAxNTg5MyArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQyN2EgPSAoSU4oIDUpICogMTU4OTMgKyBJTigyNykgKiAgMzk4MSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQyMWEgPSAoSU4oMjEpICogMTQwNTMgLSBJTigxMSkgKiAgODQyMyArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQyNmEgPSAoSU4oMjEpICogIDg0MjMgKyBJTigxMSkgKiAxNDA1MyArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQyMmEgPSAoSU4oMTMpICogIDk3NjAgLSBJTigxOSkgKiAxMzE2MCArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQyNWEgPSAoSU4oMTMpICogMTMxNjAgKyBJTigxOSkgKiAgOTc2MCArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQyM2EgPSAoSU4oMjkpICogMTYyMDcgLSBJTiggMykgKiAgMjQwNCArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgaW50IHQyNGEgPSAoSU4oMjkpICogIDI0MDQgKyBJTiggMykgKiAxNjIwNyArICgxIDw8IDEzKSkgPj4gMTQ7CisKKyAgICBpbnQgdDAgID0gdDBhICArIHQzYTsKKyAgICBpbnQgdDEgID0gdDFhICArIHQyYTsKKyAgICBpbnQgdDIgID0gdDFhICAtIHQyYTsKKyAgICBpbnQgdDMgID0gdDBhICAtIHQzYTsKKyAgICBpbnQgdDQgID0gdDRhICArIHQ1YTsKKyAgICBpbnQgdDUgID0gdDRhICAtIHQ1YTsKKyAgICBpbnQgdDYgID0gdDdhICAtIHQ2YTsKKyAgICBpbnQgdDcgID0gdDdhICArIHQ2YTsKKyAgICBpbnQgdDggID0gdDhhICArIHQ5YTsKKyAgICBpbnQgdDkgID0gdDhhICAtIHQ5YTsKKyAgICBpbnQgdDEwID0gdDExYSAtIHQxMGE7CisgICAgaW50IHQxMSA9IHQxMWEgKyB0MTBhOworICAgIGludCB0MTIgPSB0MTJhICsgdDEzYTsKKyAgICBpbnQgdDEzID0gdDEyYSAtIHQxM2E7CisgICAgaW50IHQxNCA9IHQxNWEgLSB0MTRhOworICAgIGludCB0MTUgPSB0MTVhICsgdDE0YTsKKyAgICBpbnQgdDE2ID0gdDE2YSArIHQxN2E7CisgICAgaW50IHQxNyA9IHQxNmEgLSB0MTdhOworICAgIGludCB0MTggPSB0MTlhIC0gdDE4YTsKKyAgICBpbnQgdDE5ID0gdDE5YSArIHQxOGE7CisgICAgaW50IHQyMCA9IHQyMGEgKyB0MjFhOworICAgIGludCB0MjEgPSB0MjBhIC0gdDIxYTsKKyAgICBpbnQgdDIyID0gdDIzYSAtIHQyMmE7CisgICAgaW50IHQyMyA9IHQyM2EgKyB0MjJhOworICAgIGludCB0MjQgPSB0MjRhICsgdDI1YTsKKyAgICBpbnQgdDI1ID0gdDI0YSAtIHQyNWE7CisgICAgaW50IHQyNiA9IHQyN2EgLSB0MjZhOworICAgIGludCB0MjcgPSB0MjdhICsgdDI2YTsKKyAgICBpbnQgdDI4ID0gdDI4YSArIHQyOWE7CisgICAgaW50IHQyOSA9IHQyOGEgLSB0MjlhOworICAgIGludCB0MzAgPSB0MzFhIC0gdDMwYTsKKyAgICBpbnQgdDMxID0gdDMxYSArIHQzMGE7CisKKyAgICB0NWEgPSAoKHQ2IC0gdDUpICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQ2YSA9ICgodDYgKyB0NSkgKiAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDlhICA9ICggIHQxNCAqICA2MjcwIC0gdDkgICogMTUxMzcgICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MTRhID0gKCAgdDE0ICogMTUxMzcgKyB0OSAgKiAgNjI3MCAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxMGEgPSAoLSh0MTMgKiAxNTEzNyArIHQxMCAqICA2MjcwKSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDEzYSA9ICggIHQxMyAqICA2MjcwIC0gdDEwICogMTUxMzcgICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MTdhID0gKCAgdDMwICogIDMxOTYgLSB0MTcgKiAxNjA2OSAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQzMGEgPSAoICB0MzAgKiAxNjA2OSArIHQxNyAqICAzMTk2ICArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDE4YSA9ICgtKHQyOSAqIDE2MDY5ICsgdDE4ICogIDMxOTYpICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MjlhID0gKCAgdDI5ICogIDMxOTYgLSB0MTggKiAxNjA2OSAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQyMWEgPSAoICB0MjYgKiAxMzYyMyAtIHQyMSAqICA5MTAyICArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDI2YSA9ICggIHQyNiAqICA5MTAyICsgdDIxICogMTM2MjMgICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MjJhID0gKC0odDI1ICogIDkxMDIgKyB0MjIgKiAxMzYyMykgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQyNWEgPSAoICB0MjUgKiAxMzYyMyAtIHQyMiAqICA5MTAyICArICgxIDw8IDEzKSkgPj4gMTQ7CisKKyAgICB0MGEgID0gdDAgICArIHQ3OworICAgIHQxYSAgPSB0MSAgICsgdDZhOworICAgIHQyYSAgPSB0MiAgICsgdDVhOworICAgIHQzYSAgPSB0MyAgICsgdDQ7CisgICAgdDRhICA9IHQzICAgLSB0NDsKKyAgICB0NSAgID0gdDIgICAtIHQ1YTsKKyAgICB0NiAgID0gdDEgICAtIHQ2YTsKKyAgICB0N2EgID0gdDAgICAtIHQ3OworICAgIHQ4YSAgPSB0OCAgICsgdDExOworICAgIHQ5ICAgPSB0OWEgICsgdDEwYTsKKyAgICB0MTAgID0gdDlhICAtIHQxMGE7CisgICAgdDExYSA9IHQ4ICAgLSB0MTE7CisgICAgdDEyYSA9IHQxNSAgLSB0MTI7CisgICAgdDEzICA9IHQxNGEgLSB0MTNhOworICAgIHQxNCAgPSB0MTRhICsgdDEzYTsKKyAgICB0MTVhID0gdDE1ICArIHQxMjsKKyAgICB0MTZhID0gdDE2ICArIHQxOTsKKyAgICB0MTcgID0gdDE3YSArIHQxOGE7CisgICAgdDE4ICA9IHQxN2EgLSB0MThhOworICAgIHQxOWEgPSB0MTYgIC0gdDE5OworICAgIHQyMGEgPSB0MjMgIC0gdDIwOworICAgIHQyMSAgPSB0MjJhIC0gdDIxYTsKKyAgICB0MjIgID0gdDIyYSArIHQyMWE7CisgICAgdDIzYSA9IHQyMyAgKyB0MjA7CisgICAgdDI0YSA9IHQyNCAgKyB0Mjc7CisgICAgdDI1ICA9IHQyNWEgKyB0MjZhOworICAgIHQyNiAgPSB0MjVhIC0gdDI2YTsKKyAgICB0MjdhID0gdDI0ICAtIHQyNzsKKyAgICB0MjhhID0gdDMxICAtIHQyODsKKyAgICB0MjkgID0gdDMwYSAtIHQyOWE7CisgICAgdDMwICA9IHQzMGEgKyB0MjlhOworICAgIHQzMWEgPSB0MzEgICsgdDI4OworCisgICAgdDEwYSA9ICgodDEzICAtIHQxMCkgICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxM2EgPSAoKHQxMyAgKyB0MTApICAqIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MTEgID0gKCh0MTJhIC0gdDExYSkgKiAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDEyICA9ICgodDEyYSArIHQxMWEpICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQxOGEgPSAoICB0MjkgICogIDYyNzAgLSB0MTggICogMTUxMzcgICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MjlhID0gKCAgdDI5ICAqIDE1MTM3ICsgdDE4ICAqICA2MjcwICArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDE5ICA9ICggIHQyOGEgKiAgNjI3MCAtIHQxOWEgKiAxNTEzNyAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQyOCAgPSAoICB0MjhhICogMTUxMzcgKyB0MTlhICogIDYyNzAgICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MjAgID0gKC0odDI3YSAqIDE1MTM3ICsgdDIwYSAqICA2MjcwKSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDI3ICA9ICggIHQyN2EgKiAgNjI3MCAtIHQyMGEgKiAxNTEzNyAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQyMWEgPSAoLSh0MjYgICogMTUxMzcgKyB0MjEgICogIDYyNzApICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MjZhID0gKCAgdDI2ICAqICA2MjcwIC0gdDIxICAqIDE1MTM3ICArICgxIDw8IDEzKSkgPj4gMTQ7CisKKyAgICB0MCAgID0gdDBhICsgdDE1YTsKKyAgICB0MSAgID0gdDFhICsgdDE0OworICAgIHQyICAgPSB0MmEgKyB0MTNhOworICAgIHQzICAgPSB0M2EgKyB0MTI7CisgICAgdDQgICA9IHQ0YSArIHQxMTsKKyAgICB0NWEgID0gdDUgICsgdDEwYTsKKyAgICB0NmEgID0gdDYgICsgdDk7CisgICAgdDcgICA9IHQ3YSArIHQ4YTsKKyAgICB0OCAgID0gdDdhIC0gdDhhOworICAgIHQ5YSAgPSB0NiAgLSB0OTsKKyAgICB0MTAgID0gdDUgIC0gdDEwYTsKKyAgICB0MTFhID0gdDRhIC0gdDExOworICAgIHQxMmEgPSB0M2EgLSB0MTI7CisgICAgdDEzICA9IHQyYSAtIHQxM2E7CisgICAgdDE0YSA9IHQxYSAtIHQxNDsKKyAgICB0MTUgID0gdDBhIC0gdDE1YTsKKyAgICB0MTYgID0gdDE2YSArIHQyM2E7CisgICAgdDE3YSA9IHQxNyAgKyB0MjI7CisgICAgdDE4ICA9IHQxOGEgKyB0MjFhOworICAgIHQxOWEgPSB0MTkgICsgdDIwOworICAgIHQyMGEgPSB0MTkgIC0gdDIwOworICAgIHQyMSAgPSB0MThhIC0gdDIxYTsKKyAgICB0MjJhID0gdDE3ICAtIHQyMjsKKyAgICB0MjMgID0gdDE2YSAtIHQyM2E7CisgICAgdDI0ICA9IHQzMWEgLSB0MjRhOworICAgIHQyNWEgPSB0MzAgIC0gdDI1OworICAgIHQyNiAgPSB0MjlhIC0gdDI2YTsKKyAgICB0MjdhID0gdDI4ICAtIHQyNzsKKyAgICB0MjhhID0gdDI4ICArIHQyNzsKKyAgICB0MjkgID0gdDI5YSArIHQyNmE7CisgICAgdDMwYSA9IHQzMCAgKyB0MjU7CisgICAgdDMxICA9IHQzMWEgKyB0MjRhOworCisgICAgdDIwICA9ICgodDI3YSAtIHQyMGEpICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQyNyAgPSAoKHQyN2EgKyB0MjBhKSAqIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MjFhID0gKCh0MjYgIC0gdDIxICkgKiAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDI2YSA9ICgodDI2ICArIHQyMSApICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQyMiAgPSAoKHQyNWEgLSB0MjJhKSAqIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICB0MjUgID0gKCh0MjVhICsgdDIyYSkgKiAxMTU4NSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgdDIzYSA9ICgodDI0ICAtIHQyMyApICogMTE1ODUgKyAoMSA8PCAxMykpID4+IDE0OworICAgIHQyNGEgPSAoKHQyNCAgKyB0MjMgKSAqIDExNTg1ICsgKDEgPDwgMTMpKSA+PiAxNDsKKworICAgIG91dFsgMF0gPSB0MCAgICsgdDMxOworICAgIG91dFsgMV0gPSB0MSAgICsgdDMwYTsKKyAgICBvdXRbIDJdID0gdDIgICArIHQyOTsKKyAgICBvdXRbIDNdID0gdDMgICArIHQyOGE7CisgICAgb3V0WyA0XSA9IHQ0ICAgKyB0Mjc7CisgICAgb3V0WyA1XSA9IHQ1YSAgKyB0MjZhOworICAgIG91dFsgNl0gPSB0NmEgICsgdDI1OworICAgIG91dFsgN10gPSB0NyAgICsgdDI0YTsKKyAgICBvdXRbIDhdID0gdDggICArIHQyM2E7CisgICAgb3V0WyA5XSA9IHQ5YSAgKyB0MjI7CisgICAgb3V0WzEwXSA9IHQxMCAgKyB0MjFhOworICAgIG91dFsxMV0gPSB0MTFhICsgdDIwOworICAgIG91dFsxMl0gPSB0MTJhICsgdDE5YTsKKyAgICBvdXRbMTNdID0gdDEzICArIHQxODsKKyAgICBvdXRbMTRdID0gdDE0YSArIHQxN2E7CisgICAgb3V0WzE1XSA9IHQxNSAgKyB0MTY7CisgICAgb3V0WzE2XSA9IHQxNSAgLSB0MTY7CisgICAgb3V0WzE3XSA9IHQxNGEgLSB0MTdhOworICAgIG91dFsxOF0gPSB0MTMgIC0gdDE4OworICAgIG91dFsxOV0gPSB0MTJhIC0gdDE5YTsKKyAgICBvdXRbMjBdID0gdDExYSAtIHQyMDsKKyAgICBvdXRbMjFdID0gdDEwICAtIHQyMWE7CisgICAgb3V0WzIyXSA9IHQ5YSAgLSB0MjI7CisgICAgb3V0WzIzXSA9IHQ4ICAgLSB0MjNhOworICAgIG91dFsyNF0gPSB0NyAgIC0gdDI0YTsKKyAgICBvdXRbMjVdID0gdDZhICAtIHQyNTsKKyAgICBvdXRbMjZdID0gdDVhICAtIHQyNmE7CisgICAgb3V0WzI3XSA9IHQ0ICAgLSB0Mjc7CisgICAgb3V0WzI4XSA9IHQzICAgLSB0MjhhOworICAgIG91dFsyOV0gPSB0MiAgIC0gdDI5OworICAgIG91dFszMF0gPSB0MSAgIC0gdDMwYTsKKyAgICBvdXRbMzFdID0gdDAgICAtIHQzMTsKK30KKworaXR4Zm1fd3JhcHBlcihpZGN0LCBpZGN0LCAzMiwgNiwgMSkKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBpd2h0NF8xZChjb25zdCBpbnQxNl90ICppbiwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqb3V0LCBpbnQgcGFzcykKK3sKKyAgICBpbnQgdDAsIHQxLCB0MiwgdDMsIHQ0OworCisgICAgaWYgKHBhc3MgPT0gMCkgeworICAgICAgICB0MCA9IElOKDApID4+IDI7CisgICAgICAgIHQxID0gSU4oMykgPj4gMjsKKyAgICAgICAgdDIgPSBJTigxKSA+PiAyOworICAgICAgICB0MyA9IElOKDIpID4+IDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdDAgPSBJTigwKTsKKyAgICAgICAgdDEgPSBJTigzKTsKKyAgICAgICAgdDIgPSBJTigxKTsKKyAgICAgICAgdDMgPSBJTigyKTsKKyAgICB9CisKKyAgICB0MCArPSB0MjsKKyAgICB0MyAtPSB0MTsKKyAgICB0NCA9ICh0MCAtIHQzKSA+PiAxOworICAgIHQxID0gdDQgLSB0MTsKKyAgICB0MiA9IHQ0IC0gdDI7CisgICAgdDAgLT0gdDE7CisgICAgdDMgKz0gdDI7CisKKyAgICBvdXRbMF0gPSB0MDsKKyAgICBvdXRbMV0gPSB0MTsKKyAgICBvdXRbMl0gPSB0MjsKKyAgICBvdXRbM10gPSB0MzsKK30KKworaXR4Zm1fd3JhcHBlcihpd2h0LCBpd2h0LCA0LCAwLCAwKQorCisjdW5kZWYgSU4KKyN1bmRlZiBpdHhmbV93cmFwcGVyCisjdW5kZWYgaXR4Zm1fd3JhcAorCitzdGF0aWMgYXZfY29sZCB2b2lkIHZwOWRzcF9pdHhmbV9pbml0KFZQOURTUENvbnRleHQgKmRzcCkKK3sKKyNkZWZpbmUgaW5pdF9pdHhmbSh0eCwgc3opIFwKKyAgICBkc3AtPml0eGZtX2FkZFt0eF1bRENUX0RDVF0gICA9IGlkY3RfaWRjdF8jI3N6IyNfYWRkX2M7IFwKKyAgICBkc3AtPml0eGZtX2FkZFt0eF1bRENUX0FEU1RdICA9IGlhZHN0X2lkY3RfIyNzeiMjX2FkZF9jOyBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0FEU1RfRENUXSAgPSBpZGN0X2lhZHN0XyMjc3ojI19hZGRfYzsgXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtBRFNUX0FEU1RdID0gaWFkc3RfaWFkc3RfIyNzeiMjX2FkZF9jCisKKyNkZWZpbmUgaW5pdF9pZGN0KHR4LCBubSkgXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtEQ1RfRENUXSAgID0gXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtBRFNUX0RDVF0gID0gXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtEQ1RfQURTVF0gID0gXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtBRFNUX0FEU1RdID0gbm0jI19hZGRfYworCisgICAgaW5pdF9pdHhmbShUWF80WDQsICAgNHg0KTsKKyAgICBpbml0X2l0eGZtKFRYXzhYOCwgICA4eDgpOworICAgIGluaXRfaXR4Zm0oVFhfMTZYMTYsIDE2eDE2KTsKKyAgICBpbml0X2lkY3QoVFhfMzJYMzIsICBpZGN0X2lkY3RfMzJ4MzIpOworICAgIGluaXRfaWRjdCg0IC8qIGxvc3NsZXNzICovLCBpd2h0X2l3aHRfNHg0KTsKKworI3VuZGVmIGluaXRfaXR4Zm0KKyN1bmRlZiBpbml0X2lkY3QKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBsb29wX2ZpbHRlcih1aW50OF90ICpkc3QsIGludCBFLCBpbnQgSSwgaW50IEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGVhLCBwdHJkaWZmX3Qgc3RyaWRlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdkKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKywgZHN0ICs9IHN0cmlkZWEpIHsKKyAgICAgICAgaW50IHA3LCBwNiwgcDUsIHA0OworICAgICAgICBpbnQgcDMgPSBkc3Rbc3RyaWRlYiAqIC00XSwgcDIgPSBkc3Rbc3RyaWRlYiAqIC0zXTsKKyAgICAgICAgaW50IHAxID0gZHN0W3N0cmlkZWIgKiAtMl0sIHAwID0gZHN0W3N0cmlkZWIgKiAtMV07CisgICAgICAgIGludCBxMCA9IGRzdFtzdHJpZGViICogKzBdLCBxMSA9IGRzdFtzdHJpZGViICogKzFdOworICAgICAgICBpbnQgcTIgPSBkc3Rbc3RyaWRlYiAqICsyXSwgcTMgPSBkc3Rbc3RyaWRlYiAqICszXTsKKyAgICAgICAgaW50IHE0LCBxNSwgcTYsIHE3OworICAgICAgICBpbnQgZm0gPSBGRkFCUyhwMyAtIHAyKSA8PSBJICYmIEZGQUJTKHAyIC0gcDEpIDw9IEkgJiYKKyAgICAgICAgICAgICAgICAgRkZBQlMocDEgLSBwMCkgPD0gSSAmJiBGRkFCUyhxMSAtIHEwKSA8PSBJICYmCisgICAgICAgICAgICAgICAgIEZGQUJTKHEyIC0gcTEpIDw9IEkgJiYgRkZBQlMocTMgLSBxMikgPD0gSSAmJgorICAgICAgICAgICAgICAgICBGRkFCUyhwMCAtIHEwKSAqIDIgKyAoRkZBQlMocDEgLSBxMSkgPj4gMSkgPD0gRTsKKyAgICAgICAgaW50IGZsYXQ4b3V0LCBmbGF0OGluOworCisgICAgICAgIGlmICghZm0pCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAod2QgPj0gMTYpIHsKKyAgICAgICAgICAgIHA3ID0gZHN0W3N0cmlkZWIgKiAtOF07CisgICAgICAgICAgICBwNiA9IGRzdFtzdHJpZGViICogLTddOworICAgICAgICAgICAgcDUgPSBkc3Rbc3RyaWRlYiAqIC02XTsKKyAgICAgICAgICAgIHA0ID0gZHN0W3N0cmlkZWIgKiAtNV07CisgICAgICAgICAgICBxNCA9IGRzdFtzdHJpZGViICogKzRdOworICAgICAgICAgICAgcTUgPSBkc3Rbc3RyaWRlYiAqICs1XTsKKyAgICAgICAgICAgIHE2ID0gZHN0W3N0cmlkZWIgKiArNl07CisgICAgICAgICAgICBxNyA9IGRzdFtzdHJpZGViICogKzddOworCisgICAgICAgICAgICBmbGF0OG91dCA9IEZGQUJTKHA3IC0gcDApIDw9IDEgJiYgRkZBQlMocDYgLSBwMCkgPD0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICBGRkFCUyhwNSAtIHAwKSA8PSAxICYmIEZGQUJTKHA0IC0gcDApIDw9IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgRkZBQlMocTQgLSBxMCkgPD0gMSAmJiBGRkFCUyhxNSAtIHEwKSA8PSAxICYmCisgICAgICAgICAgICAgICAgICAgICAgIEZGQUJTKHE2IC0gcTApIDw9IDEgJiYgRkZBQlMocTcgLSBxMCkgPD0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3ZCA+PSA4KQorICAgICAgICAgICAgZmxhdDhpbiA9IEZGQUJTKHAzIC0gcDApIDw9IDEgJiYgRkZBQlMocDIgLSBwMCkgPD0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgIEZGQUJTKHAxIC0gcDApIDw9IDEgJiYgRkZBQlMocTEgLSBxMCkgPD0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgIEZGQUJTKHEyIC0gcTApIDw9IDEgJiYgRkZBQlMocTMgLSBxMCkgPD0gMTsKKworICAgICAgICBpZiAod2QgPj0gMTYgJiYgZmxhdDhvdXQgJiYgZmxhdDhpbikgeworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiAtN10gPSAocDcgKyBwNyArIHA3ICsgcDcgKyBwNyArIHA3ICsgcDcgKyBwNiAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDUgKyBwNCArIHAzICsgcDIgKyBwMSArIHAwICsgcTAgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiAtNl0gPSAocDcgKyBwNyArIHA3ICsgcDcgKyBwNyArIHA3ICsgcDYgKyBwNSAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDQgKyBwMyArIHAyICsgcDEgKyBwMCArIHEwICsgcTEgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiAtNV0gPSAocDcgKyBwNyArIHA3ICsgcDcgKyBwNyArIHA2ICsgcDUgKyBwNCAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDMgKyBwMiArIHAxICsgcDAgKyBxMCArIHExICsgcTIgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiAtNF0gPSAocDcgKyBwNyArIHA3ICsgcDcgKyBwNiArIHA1ICsgcDQgKyBwMyAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDIgKyBwMSArIHAwICsgcTAgKyBxMSArIHEyICsgcTMgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiAtM10gPSAocDcgKyBwNyArIHA3ICsgcDYgKyBwNSArIHA0ICsgcDMgKyBwMiAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDEgKyBwMCArIHEwICsgcTEgKyBxMiArIHEzICsgcTQgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiAtMl0gPSAocDcgKyBwNyArIHA2ICsgcDUgKyBwNCArIHAzICsgcDIgKyBwMSAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDAgKyBxMCArIHExICsgcTIgKyBxMyArIHE0ICsgcTUgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiAtMV0gPSAocDcgKyBwNiArIHA1ICsgcDQgKyBwMyArIHAyICsgcDEgKyBwMCAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTAgKyBxMSArIHEyICsgcTMgKyBxNCArIHE1ICsgcTYgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiArMF0gPSAocDYgKyBwNSArIHA0ICsgcDMgKyBwMiArIHAxICsgcDAgKyBxMCAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTEgKyBxMiArIHEzICsgcTQgKyBxNSArIHE2ICsgcTcgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiArMV0gPSAocDUgKyBwNCArIHAzICsgcDIgKyBwMSArIHAwICsgcTAgKyBxMSAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTIgKyBxMyArIHE0ICsgcTUgKyBxNiArIHE3ICsgcTcgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiArMl0gPSAocDQgKyBwMyArIHAyICsgcDEgKyBwMCArIHEwICsgcTEgKyBxMiAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTMgKyBxNCArIHE1ICsgcTYgKyBxNyArIHE3ICsgcTcgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiArM10gPSAocDMgKyBwMiArIHAxICsgcDAgKyBxMCArIHExICsgcTIgKyBxMyAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTQgKyBxNSArIHE2ICsgcTcgKyBxNyArIHE3ICsgcTcgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiArNF0gPSAocDIgKyBwMSArIHAwICsgcTAgKyBxMSArIHEyICsgcTMgKyBxNCAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTUgKyBxNiArIHE3ICsgcTcgKyBxNyArIHE3ICsgcTcgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiArNV0gPSAocDEgKyBwMCArIHEwICsgcTEgKyBxMiArIHEzICsgcTQgKyBxNSAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTYgKyBxNyArIHE3ICsgcTcgKyBxNyArIHE3ICsgcTcgKyA4KSA+PiA0OworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiArNl0gPSAocDAgKyBxMCArIHExICsgcTIgKyBxMyArIHE0ICsgcTUgKyBxNiAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTcgKyBxNyArIHE3ICsgcTcgKyBxNyArIHE3ICsgcTcgKyA4KSA+PiA0OworICAgICAgICB9IGVsc2UgaWYgKHdkID49IDggJiYgZmxhdDhpbikgeworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiAtM10gPSAocDMgKyBwMyArIHAzICsgMiAqIHAyICsgcDEgKyBwMCArIHEwICsgNCkgPj4gMzsKKyAgICAgICAgICAgIGRzdFtzdHJpZGViICogLTJdID0gKHAzICsgcDMgKyBwMiArIDIgKiBwMSArIHAwICsgcTAgKyBxMSArIDQpID4+IDM7CisgICAgICAgICAgICBkc3Rbc3RyaWRlYiAqIC0xXSA9IChwMyArIHAyICsgcDEgKyAyICogcDAgKyBxMCArIHExICsgcTIgKyA0KSA+PiAzOworICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiArMF0gPSAocDIgKyBwMSArIHAwICsgMiAqIHEwICsgcTEgKyBxMiArIHEzICsgNCkgPj4gMzsKKyAgICAgICAgICAgIGRzdFtzdHJpZGViICogKzFdID0gKHAxICsgcDAgKyBxMCArIDIgKiBxMSArIHEyICsgcTMgKyBxMyArIDQpID4+IDM7CisgICAgICAgICAgICBkc3Rbc3RyaWRlYiAqICsyXSA9IChwMCArIHEwICsgcTEgKyAyICogcTIgKyBxMyArIHEzICsgcTMgKyA0KSA+PiAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGhldiA9IEZGQUJTKHAxIC0gcDApID4gSCB8fCBGRkFCUyhxMSAtIHEwKSA+IEg7CisKKyAgICAgICAgICAgIGlmIChoZXYpIHsKKyAgICAgICAgICAgICAgICBpbnQgZiA9IGF2X2NsaXBfaW50OCgzICogKHEwIC0gcDApICsgYXZfY2xpcF9pbnQ4KHAxIC0gcTEpKSwgZjEsIGYyOworCisgICAgICAgICAgICAgICAgZjEgPSBGRk1JTihmICsgNCwgMTI3KSA+PiAzOworICAgICAgICAgICAgICAgIGYyID0gRkZNSU4oZiArIDMsIDEyNykgPj4gMzsKKworICAgICAgICAgICAgICAgIGRzdFtzdHJpZGViICogLTFdID0gYXZfY2xpcF91aW50OChwMCArIGYyKTsKKyAgICAgICAgICAgICAgICBkc3Rbc3RyaWRlYiAqICswXSA9IGF2X2NsaXBfdWludDgocTAgLSBmMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBmID0gYXZfY2xpcF9pbnQ4KDMgKiAocTAgLSBwMCkpLCBmMSwgZjI7CisKKyAgICAgICAgICAgICAgICBmMSA9IEZGTUlOKGYgKyA0LCAxMjcpID4+IDM7CisgICAgICAgICAgICAgICAgZjIgPSBGRk1JTihmICsgMywgMTI3KSA+PiAzOworCisgICAgICAgICAgICAgICAgZHN0W3N0cmlkZWIgKiAtMV0gPSBhdl9jbGlwX3VpbnQ4KHAwICsgZjIpOworICAgICAgICAgICAgICAgIGRzdFtzdHJpZGViICogKzBdID0gYXZfY2xpcF91aW50OChxMCAtIGYxKTsKKworICAgICAgICAgICAgICAgIGYgPSAoZjEgKyAxKSA+PiAxOworICAgICAgICAgICAgICAgIGRzdFtzdHJpZGViICogLTJdID0gYXZfY2xpcF91aW50OChwMSArIGYpOworICAgICAgICAgICAgICAgIGRzdFtzdHJpZGViICogKzFdID0gYXZfY2xpcF91aW50OChxMSAtIGYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZGVmaW5lIGxmXzhfZm4oZGlyLCB3ZCwgc3RyaWRlYSwgc3RyaWRlYikgXAorc3RhdGljIHZvaWQgbG9vcF9maWx0ZXJfIyNkaXIjI18jI3dkIyNfOF9jKHVpbnQ4X3QgKmRzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRSwgaW50IEksIGludCBIKSBcCit7IFwKKyAgICBsb29wX2ZpbHRlcihkc3QsIEUsIEksIEgsIHN0cmlkZWEsIHN0cmlkZWIsIHdkKTsgXAorfQorCisjZGVmaW5lIGxmXzhfZm5zKHdkKSBcCitsZl84X2ZuKGgsIHdkLCBzdHJpZGUsIDEpIFwKK2xmXzhfZm4odiwgd2QsIDEsIHN0cmlkZSkKKworbGZfOF9mbnMoNCkKK2xmXzhfZm5zKDgpCitsZl84X2ZucygxNikKKworI3VuZGVmIGxmXzhfZm4KKyN1bmRlZiBsZl84X2ZucworCisjZGVmaW5lIGxmXzE2X2ZuKGRpciwgc3RyaWRlYSkgXAorc3RhdGljIHZvaWQgbG9vcF9maWx0ZXJfIyNkaXIjI18xNl8xNl9jKHVpbnQ4X3QgKmRzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRSwgaW50IEksIGludCBIKSBcCit7IFwKKyAgICBsb29wX2ZpbHRlcl8jI2RpciMjXzE2XzhfYyhkc3QsIHN0cmlkZSwgRSwgSSwgSCk7IFwKKyAgICBsb29wX2ZpbHRlcl8jI2RpciMjXzE2XzhfYyhkc3QgKyA4ICogc3RyaWRlYSwgc3RyaWRlLCBFLCBJLCBIKTsgXAorfQorCitsZl8xNl9mbihoLCBzdHJpZGUpCitsZl8xNl9mbih2LCAxKQorCisjdW5kZWYgbGZfMTZfZm4KKworI2RlZmluZSBsZl9taXhfZm4oZGlyLCB3ZDEsIHdkMiwgc3RyaWRlYSkgXAorc3RhdGljIHZvaWQgbG9vcF9maWx0ZXJfIyNkaXIjI18jI3dkMSMjd2QyIyNfMTZfYyh1aW50OF90ICpkc3QsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRSwgaW50IEksIGludCBIKSBcCit7IFwKKyAgICBsb29wX2ZpbHRlcl8jI2RpciMjXyMjd2QxIyNfOF9jKGRzdCwgc3RyaWRlLCBFICYgMHhmZiwgSSAmIDB4ZmYsIEggJiAweGZmKTsgXAorICAgIGxvb3BfZmlsdGVyXyMjZGlyIyNfIyN3ZDIjI184X2MoZHN0ICsgOCAqIHN0cmlkZWEsIHN0cmlkZSwgRSA+PiA4LCBJID4+IDgsIEggPj4gOCk7IFwKK30KKworI2RlZmluZSBsZl9taXhfZm5zKHdkMSwgd2QyKSBcCitsZl9taXhfZm4oaCwgd2QxLCB3ZDIsIHN0cmlkZSkgXAorbGZfbWl4X2ZuKHYsIHdkMSwgd2QyLCAxKQorCitsZl9taXhfZm5zKDQsIDQpCitsZl9taXhfZm5zKDQsIDgpCitsZl9taXhfZm5zKDgsIDQpCitsZl9taXhfZm5zKDgsIDgpCisKKyN1bmRlZiBsZl9taXhfZm4KKyN1bmRlZiBsZl9taXhfZm5zCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdnA5ZHNwX2xvb3BmaWx0ZXJfaW5pdChWUDlEU1BDb250ZXh0ICpkc3ApCit7CisgICAgZHNwLT5sb29wX2ZpbHRlcl84WzBdWzBdID0gbG9vcF9maWx0ZXJfaF80XzhfYzsKKyAgICBkc3AtPmxvb3BfZmlsdGVyXzhbMF1bMV0gPSBsb29wX2ZpbHRlcl92XzRfOF9jOworICAgIGRzcC0+bG9vcF9maWx0ZXJfOFsxXVswXSA9IGxvb3BfZmlsdGVyX2hfOF84X2M7CisgICAgZHNwLT5sb29wX2ZpbHRlcl84WzFdWzFdID0gbG9vcF9maWx0ZXJfdl84XzhfYzsKKyAgICBkc3AtPmxvb3BfZmlsdGVyXzhbMl1bMF0gPSBsb29wX2ZpbHRlcl9oXzE2XzhfYzsKKyAgICBkc3AtPmxvb3BfZmlsdGVyXzhbMl1bMV0gPSBsb29wX2ZpbHRlcl92XzE2XzhfYzsKKworICAgIGRzcC0+bG9vcF9maWx0ZXJfMTZbMF0gPSBsb29wX2ZpbHRlcl9oXzE2XzE2X2M7CisgICAgZHNwLT5sb29wX2ZpbHRlcl8xNlsxXSA9IGxvb3BfZmlsdGVyX3ZfMTZfMTZfYzsKKworICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlswXVswXVswXSA9IGxvb3BfZmlsdGVyX2hfNDRfMTZfYzsKKyAgICBkc3AtPmxvb3BfZmlsdGVyX21peDJbMF1bMF1bMV0gPSBsb29wX2ZpbHRlcl92XzQ0XzE2X2M7CisgICAgZHNwLT5sb29wX2ZpbHRlcl9taXgyWzBdWzFdWzBdID0gbG9vcF9maWx0ZXJfaF80OF8xNl9jOworICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlswXVsxXVsxXSA9IGxvb3BfZmlsdGVyX3ZfNDhfMTZfYzsKKyAgICBkc3AtPmxvb3BfZmlsdGVyX21peDJbMV1bMF1bMF0gPSBsb29wX2ZpbHRlcl9oXzg0XzE2X2M7CisgICAgZHNwLT5sb29wX2ZpbHRlcl9taXgyWzFdWzBdWzFdID0gbG9vcF9maWx0ZXJfdl84NF8xNl9jOworICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlsxXVsxXVswXSA9IGxvb3BfZmlsdGVyX2hfODhfMTZfYzsKKyAgICBkc3AtPmxvb3BfZmlsdGVyX21peDJbMV1bMV1bMV0gPSBsb29wX2ZpbHRlcl92Xzg4XzE2X2M7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgY29weV9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKQoreworICAgIGRvIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3KTsKKworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfSB3aGlsZSAoLS1oKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBhdmdfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpCit7CisgICAgZG8geworICAgICAgICBpbnQgeDsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCArPSA0KQorICAgICAgICAgICAgQVZfV04zMkEoJmRzdFt4XSwgcm5kX2F2ZzMyKEFWX1JOMzJBKCZkc3RbeF0pLCBBVl9STjMyKCZzcmNbeF0pKSk7CisKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0gd2hpbGUgKC0taCk7Cit9CisKKyNkZWZpbmUgZnBlbF9mbih0eXBlLCBzeikgXAorc3RhdGljIHZvaWQgdHlwZSMjc3ojI19jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgaW50IG15KSBcCit7IFwKKyAgICB0eXBlIyNfYyhkc3QsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgc3osIGgpOyBcCit9CisKKyNkZWZpbmUgY29weV9hdmdfZm4oc3opIFwKK2ZwZWxfZm4oY29weSwgc3opIFwKK2ZwZWxfZm4oYXZnLCAgc3opCisKK2NvcHlfYXZnX2ZuKDY0KQorY29weV9hdmdfZm4oMzIpCitjb3B5X2F2Z19mbigxNikKK2NvcHlfYXZnX2ZuKDgpCitjb3B5X2F2Z19mbig0KQorCisjdW5kZWYgZnBlbF9mbgorI3VuZGVmIGNvcHlfYXZnX2ZuCisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgdnA5X3N1YnBlbF9maWx0ZXJzWzNdWzE1XVs4XSA9IHsKKyAgICBbRklMVEVSXzhUQVBfUkVHVUxBUl0gPSB7CisgICAgICAgIHsgIDAsICAxLCAgLTUsIDEyNiwgICA4LCAgLTMsICAxLCAgMCB9LAorICAgICAgICB7IC0xLCAgMywgLTEwLCAxMjIsICAxOCwgIC02LCAgMiwgIDAgfSwKKyAgICAgICAgeyAtMSwgIDQsIC0xMywgMTE4LCAgMjcsICAtOSwgIDMsIC0xIH0sCisgICAgICAgIHsgLTEsICA0LCAtMTYsIDExMiwgIDM3LCAtMTEsICA0LCAtMSB9LAorICAgICAgICB7IC0xLCAgNSwgLTE4LCAxMDUsICA0OCwgLTE0LCAgNCwgLTEgfSwKKyAgICAgICAgeyAtMSwgIDUsIC0xOSwgIDk3LCAgNTgsIC0xNiwgIDUsIC0xIH0sCisgICAgICAgIHsgLTEsICA2LCAtMTksICA4OCwgIDY4LCAtMTgsICA1LCAtMSB9LAorICAgICAgICB7IC0xLCAgNiwgLTE5LCAgNzgsICA3OCwgLTE5LCAgNiwgLTEgfSwKKyAgICAgICAgeyAtMSwgIDUsIC0xOCwgIDY4LCAgODgsIC0xOSwgIDYsIC0xIH0sCisgICAgICAgIHsgLTEsICA1LCAtMTYsICA1OCwgIDk3LCAtMTksICA1LCAtMSB9LAorICAgICAgICB7IC0xLCAgNCwgLTE0LCAgNDgsIDEwNSwgLTE4LCAgNSwgLTEgfSwKKyAgICAgICAgeyAtMSwgIDQsIC0xMSwgIDM3LCAxMTIsIC0xNiwgIDQsIC0xIH0sCisgICAgICAgIHsgLTEsICAzLCAgLTksICAyNywgMTE4LCAtMTMsICA0LCAtMSB9LAorICAgICAgICB7ICAwLCAgMiwgIC02LCAgMTgsIDEyMiwgLTEwLCAgMywgLTEgfSwKKyAgICAgICAgeyAgMCwgIDEsICAtMywgICA4LCAxMjYsICAtNSwgIDEsICAwIH0sCisgICAgfSwgW0ZJTFRFUl84VEFQX1NIQVJQXSA9IHsKKyAgICAgICAgeyAtMSwgIDMsICAtNywgMTI3LCAgIDgsICAtMywgIDEsICAwIH0sCisgICAgICAgIHsgLTIsICA1LCAtMTMsIDEyNSwgIDE3LCAgLTYsICAzLCAtMSB9LAorICAgICAgICB7IC0zLCAgNywgLTE3LCAxMjEsICAyNywgLTEwLCAgNSwgLTIgfSwKKyAgICAgICAgeyAtNCwgIDksIC0yMCwgMTE1LCAgMzcsIC0xMywgIDYsIC0yIH0sCisgICAgICAgIHsgLTQsIDEwLCAtMjMsIDEwOCwgIDQ4LCAtMTYsICA4LCAtMyB9LAorICAgICAgICB7IC00LCAxMCwgLTI0LCAxMDAsICA1OSwgLTE5LCAgOSwgLTMgfSwKKyAgICAgICAgeyAtNCwgMTEsIC0yNCwgIDkwLCAgNzAsIC0yMSwgMTAsIC00IH0sCisgICAgICAgIHsgLTQsIDExLCAtMjMsICA4MCwgIDgwLCAtMjMsIDExLCAtNCB9LAorICAgICAgICB7IC00LCAxMCwgLTIxLCAgNzAsICA5MCwgLTI0LCAxMSwgLTQgfSwKKyAgICAgICAgeyAtMywgIDksIC0xOSwgIDU5LCAxMDAsIC0yNCwgMTAsIC00IH0sCisgICAgICAgIHsgLTMsICA4LCAtMTYsICA0OCwgMTA4LCAtMjMsIDEwLCAtNCB9LAorICAgICAgICB7IC0yLCAgNiwgLTEzLCAgMzcsIDExNSwgLTIwLCAgOSwgLTQgfSwKKyAgICAgICAgeyAtMiwgIDUsIC0xMCwgIDI3LCAxMjEsIC0xNywgIDcsIC0zIH0sCisgICAgICAgIHsgLTEsICAzLCAgLTYsICAxNywgMTI1LCAtMTMsICA1LCAtMiB9LAorICAgICAgICB7ICAwLCAgMSwgIC0zLCAgIDgsIDEyNywgIC03LCAgMywgLTEgfSwKKyAgICB9LCBbRklMVEVSXzhUQVBfU01PT1RIXSA9IHsKKyAgICAgICAgeyAtMywgLTEsICAzMiwgIDY0LCAgMzgsICAgMSwgLTMsICAwIH0sCisgICAgICAgIHsgLTIsIC0yLCAgMjksICA2MywgIDQxLCAgIDIsIC0zLCAgMCB9LAorICAgICAgICB7IC0yLCAtMiwgIDI2LCAgNjMsICA0MywgICA0LCAtNCwgIDAgfSwKKyAgICAgICAgeyAtMiwgLTMsICAyNCwgIDYyLCAgNDYsICAgNSwgLTQsICAwIH0sCisgICAgICAgIHsgLTIsIC0zLCAgMjEsICA2MCwgIDQ5LCAgIDcsIC00LCAgMCB9LAorICAgICAgICB7IC0xLCAtNCwgIDE4LCAgNTksICA1MSwgICA5LCAtNCwgIDAgfSwKKyAgICAgICAgeyAtMSwgLTQsICAxNiwgIDU3LCAgNTMsICAxMiwgLTQsIC0xIH0sCisgICAgICAgIHsgLTEsIC00LCAgMTQsICA1NSwgIDU1LCAgMTQsIC00LCAtMSB9LAorICAgICAgICB7IC0xLCAtNCwgIDEyLCAgNTMsICA1NywgIDE2LCAtNCwgLTEgfSwKKyAgICAgICAgeyAgMCwgLTQsICAgOSwgIDUxLCAgNTksICAxOCwgLTQsIC0xIH0sCisgICAgICAgIHsgIDAsIC00LCAgIDcsICA0OSwgIDYwLCAgMjEsIC0zLCAtMiB9LAorICAgICAgICB7ICAwLCAtNCwgICA1LCAgNDYsICA2MiwgIDI0LCAtMywgLTIgfSwKKyAgICAgICAgeyAgMCwgLTQsICAgNCwgIDQzLCAgNjMsICAyNiwgLTIsIC0yIH0sCisgICAgICAgIHsgIDAsIC0zLCAgIDIsICA0MSwgIDYzLCAgMjksIC0yLCAtMiB9LAorICAgICAgICB7ICAwLCAtMywgICAxLCAgMzgsICA2NCwgIDMyLCAtMSwgLTMgfSwKKyAgICB9Cit9OworCisjZGVmaW5lIEZJTFRFUl84VEFQKHNyYywgeCwgRiwgc3RyaWRlKSBcCisgICAgYXZfY2xpcF91aW50OCgoRlswXSAqIHNyY1t4ICsgLTMgKiBzdHJpZGVdICsgXAorICAgICAgICAgICAgICAgICAgIEZbMV0gKiBzcmNbeCArIC0yICogc3RyaWRlXSArIFwKKyAgICAgICAgICAgICAgICAgICBGWzJdICogc3JjW3ggKyAtMSAqIHN0cmlkZV0gKyBcCisgICAgICAgICAgICAgICAgICAgRlszXSAqIHNyY1t4ICsgKzAgKiBzdHJpZGVdICsgXAorICAgICAgICAgICAgICAgICAgIEZbNF0gKiBzcmNbeCArICsxICogc3RyaWRlXSArIFwKKyAgICAgICAgICAgICAgICAgICBGWzVdICogc3JjW3ggKyArMiAqIHN0cmlkZV0gKyBcCisgICAgICAgICAgICAgICAgICAgRls2XSAqIHNyY1t4ICsgKzMgKiBzdHJpZGVdICsgXAorICAgICAgICAgICAgICAgICAgIEZbN10gKiBzcmNbeCArICs0ICogc3RyaWRlXSArIDY0KSA+PiA3KQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGRvXzh0YXBfMWRfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgcHRyZGlmZl90IGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludCBhdmcpCit7CisgICAgZG8geworICAgICAgICBpbnQgeDsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgaWYgKGF2ZykgeworICAgICAgICAgICAgICAgIGRzdFt4XSA9IChkc3RbeF0gKyBGSUxURVJfOFRBUChzcmMsIHgsIGZpbHRlciwgZHMpICsgMSkgPj4gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gRklMVEVSXzhUQVAoc3JjLCB4LCBmaWx0ZXIsIGRzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfSB3aGlsZSAoLS1oKTsKK30KKworI2RlZmluZSBmaWx0ZXJfOHRhcF8xZF9mbihvcG4sIG9wYSwgZGlyLCBkcykgXAorc3RhdGljIGF2X25vaW5saW5lIHZvaWQgb3BuIyNfOHRhcF8xZF8jI2RpciMjX2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBjb25zdCBpbnQ4X3QgKmZpbHRlcikgXAoreyBcCisgICAgZG9fOHRhcF8xZF9jKGRzdCwgZHN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCB3LCBoLCBkcywgZmlsdGVyLCBvcGEpOyBcCit9CisKK2ZpbHRlcl84dGFwXzFkX2ZuKHB1dCwgMCwgdiwgc3JjX3N0cmlkZSkKK2ZpbHRlcl84dGFwXzFkX2ZuKHB1dCwgMCwgaCwgMSkKK2ZpbHRlcl84dGFwXzFkX2ZuKGF2ZywgMSwgdiwgc3JjX3N0cmlkZSkKK2ZpbHRlcl84dGFwXzFkX2ZuKGF2ZywgMSwgaCwgMSkKKworI3VuZGVmIGZpbHRlcl84dGFwXzFkX2ZuCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZG9fOHRhcF8yZF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBjb25zdCBpbnQ4X3QgKmZpbHRlcngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcnksIGludCBhdmcpCit7CisgICAgaW50IHRtcF9oID0gaCArIDc7CisgICAgdWludDhfdCB0bXBbNjQgKiA3MV0sICp0bXBfcHRyID0gdG1wOworCisgICAgc3JjIC09IHNyY19zdHJpZGUgKiAzOworICAgIGRvIHsKKyAgICAgICAgaW50IHg7CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKyAgICAgICAgICAgIHRtcF9wdHJbeF0gPSBGSUxURVJfOFRBUChzcmMsIHgsIGZpbHRlcngsIDEpOworCisgICAgICAgIHRtcF9wdHIgKz0gNjQ7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0gd2hpbGUgKC0tdG1wX2gpOworCisgICAgdG1wX3B0ciA9IHRtcCArIDY0ICogMzsKKyAgICBkbyB7CisgICAgICAgIGludCB4OworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICBpZiAoYXZnKSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gKGRzdFt4XSArIEZJTFRFUl84VEFQKHRtcF9wdHIsIHgsIGZpbHRlcnksIDY0KSArIDEpID4+IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl84VEFQKHRtcF9wdHIsIHgsIGZpbHRlcnksIDY0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB0bXBfcHRyICs9IDY0OworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICB9IHdoaWxlICgtLWgpOworfQorCisjZGVmaW5lIGZpbHRlcl84dGFwXzJkX2ZuKG9wbiwgb3BhKSBcCitzdGF0aWMgYXZfbm9pbmxpbmUgdm9pZCBvcG4jI184dGFwXzJkX2h2X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGNvbnN0IGludDhfdCAqZmlsdGVyeCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyeSkgXAoreyBcCisgICAgZG9fOHRhcF8yZF9jKGRzdCwgZHN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCB3LCBoLCBmaWx0ZXJ4LCBmaWx0ZXJ5LCBvcGEpOyBcCit9CisKK2ZpbHRlcl84dGFwXzJkX2ZuKHB1dCwgMCkKK2ZpbHRlcl84dGFwXzJkX2ZuKGF2ZywgMSkKKworI3VuZGVmIGZpbHRlcl84dGFwXzJkX2ZuCisKKyN1bmRlZiBGSUxURVJfOFRBUAorCisjZGVmaW5lIGZpbHRlcl9mbl8xZChzeiwgZGlyLCBkaXJfbSwgdHlwZSwgdHlwZV9pZHgsIGF2ZykgXAorc3RhdGljIHZvaWQgYXZnIyNfOHRhcF8jI3R5cGUjI18jI3N6IyNkaXIjI19jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgaW50IG15KSBcCit7IFwKKyAgICBhdmcjI184dGFwXzFkXyMjZGlyIyNfYyhkc3QsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgc3osIGgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDlfc3VicGVsX2ZpbHRlcnNbdHlwZV9pZHhdW2Rpcl9tIC0gMV0pOyBcCit9CisKKyNkZWZpbmUgZmlsdGVyX2ZuXzJkKHN6LCB0eXBlLCB0eXBlX2lkeCwgYXZnKSBcCitzdGF0aWMgdm9pZCBhdmcjI184dGFwXyMjdHlwZSMjXyMjc3ojI2h2X2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpIFwKK3sgXAorICAgIGF2ZyMjXzh0YXBfMmRfaHZfYyhkc3QsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgc3osIGgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgdnA5X3N1YnBlbF9maWx0ZXJzW3R5cGVfaWR4XVtteCAtIDFdLCBcCisgICAgICAgICAgICAgICAgICAgICAgIHZwOV9zdWJwZWxfZmlsdGVyc1t0eXBlX2lkeF1bbXkgLSAxXSk7IFwKK30KKworI2RlZmluZSBGSUxURVJfQklMSU4oc3JjLCB4LCBteHksIHN0cmlkZSkgXAorICAgIChzcmNbeF0gKyAoKG14eSAqIChzcmNbeCArIHN0cmlkZV0gLSBzcmNbeF0pICsgOCkgPj4gNCkpCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZG9fYmlsaW5fMWRfYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBwdHJkaWZmX3QgZHMsIGludCBteHksIGludCBhdmcpCit7CisgICAgZG8geworICAgICAgICBpbnQgeDsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgaWYgKGF2ZykgeworICAgICAgICAgICAgICAgIGRzdFt4XSA9IChkc3RbeF0gKyBGSUxURVJfQklMSU4oc3JjLCB4LCBteHksIGRzKSArIDEpID4+IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl9CSUxJTihzcmMsIHgsIG14eSwgZHMpOworICAgICAgICAgICAgfQorCisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICB9IHdoaWxlICgtLWgpOworfQorCisjZGVmaW5lIGJpbGluXzFkX2ZuKG9wbiwgb3BhLCBkaXIsIGRzKSBcCitzdGF0aWMgYXZfbm9pbmxpbmUgdm9pZCBvcG4jI19iaWxpbl8xZF8jI2RpciMjX2ModWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBteHkpIFwKK3sgXAorICAgIGRvX2JpbGluXzFkX2MoZHN0LCBkc3Rfc3RyaWRlLCBzcmMsIHNyY19zdHJpZGUsIHcsIGgsIGRzLCBteHksIG9wYSk7IFwKK30KKworYmlsaW5fMWRfZm4ocHV0LCAwLCB2LCBzcmNfc3RyaWRlKQorYmlsaW5fMWRfZm4ocHV0LCAwLCBoLCAxKQorYmlsaW5fMWRfZm4oYXZnLCAxLCB2LCBzcmNfc3RyaWRlKQorYmlsaW5fMWRfZm4oYXZnLCAxLCBoLCAxKQorCisjdW5kZWYgYmlsaW5fMWRfZm4KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBkb19iaWxpbl8yZF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBteCwgaW50IG15LCBpbnQgYXZnKQoreworICAgIHVpbnQ4X3QgdG1wWzY0ICogNjVdLCAqdG1wX3B0ciA9IHRtcDsKKyAgICBpbnQgdG1wX2ggPSBoICsgMTsKKworICAgIGRvIHsKKyAgICAgICAgaW50IHg7CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKyAgICAgICAgICAgIHRtcF9wdHJbeF0gPSBGSUxURVJfQklMSU4oc3JjLCB4LCBteCwgMSk7CisKKyAgICAgICAgdG1wX3B0ciArPSA2NDsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfSB3aGlsZSAoLS10bXBfaCk7CisKKyAgICB0bXBfcHRyID0gdG1wOworICAgIGRvIHsKKyAgICAgICAgaW50IHg7CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKyAgICAgICAgICAgIGlmIChhdmcpIHsKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSAoZHN0W3hdICsgRklMVEVSX0JJTElOKHRtcF9wdHIsIHgsIG15LCA2NCkgKyAxKSA+PiAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBGSUxURVJfQklMSU4odG1wX3B0ciwgeCwgbXksIDY0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB0bXBfcHRyICs9IDY0OworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICB9IHdoaWxlICgtLWgpOworfQorCisjZGVmaW5lIGJpbGluXzJkX2ZuKG9wbiwgb3BhKSBcCitzdGF0aWMgYXZfbm9pbmxpbmUgdm9pZCBvcG4jI19iaWxpbl8yZF9odl9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBteCwgaW50IG15KSBcCit7IFwKKyAgICBkb19iaWxpbl8yZF9jKGRzdCwgZHN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCB3LCBoLCBteCwgbXksIG9wYSk7IFwKK30KKworYmlsaW5fMmRfZm4ocHV0LCAwKQorYmlsaW5fMmRfZm4oYXZnLCAxKQorCisjdW5kZWYgYmlsaW5fMmRfZm4KKworI3VuZGVmIEZJTFRFUl9CSUxJTgorCisjZGVmaW5lIGJpbGluZl9mbl8xZChzeiwgZGlyLCBkaXJfbSwgYXZnKSBcCitzdGF0aWMgdm9pZCBhdmcjI19iaWxpbl8jI3N6IyNkaXIjI19jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpIFwKK3sgXAorICAgIGF2ZyMjX2JpbGluXzFkXyMjZGlyIyNfYyhkc3QsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgc3osIGgsIGRpcl9tKTsgXAorfQorCisjZGVmaW5lIGJpbGluZl9mbl8yZChzeiwgYXZnKSBcCitzdGF0aWMgdm9pZCBhdmcjI19iaWxpbl8jI3N6IyNodl9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpIFwKK3sgXAorICAgIGF2ZyMjX2JpbGluXzJkX2h2X2MoZHN0LCBkc3Rfc3RyaWRlLCBzcmMsIHNyY19zdHJpZGUsIHN6LCBoLCBteCwgbXkpOyBcCit9CisKKyNkZWZpbmUgZmlsdGVyX2ZuKHN6LCBhdmcpIFwKK2ZpbHRlcl9mbl8xZChzeiwgaCwgbXgsIHJlZ3VsYXIsIEZJTFRFUl84VEFQX1JFR1VMQVIsIGF2ZykgXAorZmlsdGVyX2ZuXzFkKHN6LCB2LCBteSwgcmVndWxhciwgRklMVEVSXzhUQVBfUkVHVUxBUiwgYXZnKSBcCitmaWx0ZXJfZm5fMmQoc3osICAgICAgICByZWd1bGFyLCBGSUxURVJfOFRBUF9SRUdVTEFSLCBhdmcpIFwKK2ZpbHRlcl9mbl8xZChzeiwgaCwgbXgsIHNtb290aCwgIEZJTFRFUl84VEFQX1NNT09USCwgIGF2ZykgXAorZmlsdGVyX2ZuXzFkKHN6LCB2LCBteSwgc21vb3RoLCAgRklMVEVSXzhUQVBfU01PT1RILCAgYXZnKSBcCitmaWx0ZXJfZm5fMmQoc3osICAgICAgICBzbW9vdGgsICBGSUxURVJfOFRBUF9TTU9PVEgsICBhdmcpIFwKK2ZpbHRlcl9mbl8xZChzeiwgaCwgbXgsIHNoYXJwLCAgIEZJTFRFUl84VEFQX1NIQVJQLCAgIGF2ZykgXAorZmlsdGVyX2ZuXzFkKHN6LCB2LCBteSwgc2hhcnAsICAgRklMVEVSXzhUQVBfU0hBUlAsICAgYXZnKSBcCitmaWx0ZXJfZm5fMmQoc3osICAgICAgICBzaGFycCwgICBGSUxURVJfOFRBUF9TSEFSUCwgICBhdmcpIFwKK2JpbGluZl9mbl8xZChzeiwgaCwgbXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZykgXAorYmlsaW5mX2ZuXzFkKHN6LCB2LCBteSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnKSBcCitiaWxpbmZfZm5fMmQoc3osICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmcpCisKKyNkZWZpbmUgZmlsdGVyX2ZuX3NldChhdmcpIFwKK2ZpbHRlcl9mbig2NCwgYXZnKSBcCitmaWx0ZXJfZm4oMzIsIGF2ZykgXAorZmlsdGVyX2ZuKDE2LCBhdmcpIFwKK2ZpbHRlcl9mbig4LCAgYXZnKSBcCitmaWx0ZXJfZm4oNCwgIGF2ZykKKworZmlsdGVyX2ZuX3NldChwdXQpCitmaWx0ZXJfZm5fc2V0KGF2ZykKKworI3VuZGVmIGZpbHRlcl9mbgorI3VuZGVmIGZpbHRlcl9mbl9zZXQKKyN1bmRlZiBmaWx0ZXJfZm5fMWQKKyN1bmRlZiBmaWx0ZXJfZm5fMmQKKyN1bmRlZiBiaWxpbmZfZm5fMWQKKyN1bmRlZiBiaWxpbmZfZm5fMmQKKworc3RhdGljIGF2X2NvbGQgdm9pZCB2cDlkc3BfbWNfaW5pdChWUDlEU1BDb250ZXh0ICpkc3ApCit7CisjZGVmaW5lIGluaXRfZnBlbChpZHgxLCBpZHgyLCBzeiwgdHlwZSkgXAorICAgIGRzcC0+bWNbaWR4MV1bRklMVEVSXzhUQVBfU01PT1RIIF1baWR4Ml1bMF1bMF0gPSB0eXBlIyNzeiMjX2M7IFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl84VEFQX1JFR1VMQVJdW2lkeDJdWzBdWzBdID0gdHlwZSMjc3ojI19jOyBcCisgICAgZHNwLT5tY1tpZHgxXVtGSUxURVJfOFRBUF9TSEFSUCAgXVtpZHgyXVswXVswXSA9IHR5cGUjI3N6IyNfYzsgXAorICAgIGRzcC0+bWNbaWR4MV1bRklMVEVSX0JJTElORUFSICAgIF1baWR4Ml1bMF1bMF0gPSB0eXBlIyNzeiMjX2MKKworI2RlZmluZSBpbml0X2NvcHlfYXZnKGlkeCwgc3opIFwKKyAgICBpbml0X2ZwZWwoaWR4LCAwLCBzeiwgY29weSk7IFwKKyAgICBpbml0X2ZwZWwoaWR4LCAxLCBzeiwgYXZnKQorCisgICAgaW5pdF9jb3B5X2F2ZygwLCA2NCk7CisgICAgaW5pdF9jb3B5X2F2ZygxLCAzMik7CisgICAgaW5pdF9jb3B5X2F2ZygyLCAxNik7CisgICAgaW5pdF9jb3B5X2F2ZygzLCAgOCk7CisgICAgaW5pdF9jb3B5X2F2Zyg0LCAgNCk7CisKKyN1bmRlZiBpbml0X2NvcHlfYXZnCisjdW5kZWYgaW5pdF9mcGVsCisKKyNkZWZpbmUgaW5pdF9zdWJwZWwxKGlkeDEsIGlkeDIsIGlkeGgsIGlkeHYsIHN6LCBkaXIsIHR5cGUpIFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl84VEFQX1NNT09USCBdW2lkeDJdW2lkeGhdW2lkeHZdID0gdHlwZSMjXzh0YXBfc21vb3RoXyMjc3ojI2RpciMjX2M7IFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl84VEFQX1JFR1VMQVJdW2lkeDJdW2lkeGhdW2lkeHZdID0gdHlwZSMjXzh0YXBfcmVndWxhcl8jI3N6IyNkaXIjI19jOyBcCisgICAgZHNwLT5tY1tpZHgxXVtGSUxURVJfOFRBUF9TSEFSUCAgXVtpZHgyXVtpZHhoXVtpZHh2XSA9IHR5cGUjI184dGFwX3NoYXJwXyMjc3ojI2RpciMjX2M7IFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl9CSUxJTkVBUiAgICBdW2lkeDJdW2lkeGhdW2lkeHZdID0gdHlwZSMjX2JpbGluXyMjc3ojI2RpciMjX2MKKworI2RlZmluZSBpbml0X3N1YnBlbDIoaWR4LCBpZHhoLCBpZHh2LCBkaXIsIHR5cGUpIFwKKyAgICBpbml0X3N1YnBlbDEoMCwgaWR4LCBpZHhoLCBpZHh2LCA2NCwgZGlyLCB0eXBlKTsgXAorICAgIGluaXRfc3VicGVsMSgxLCBpZHgsIGlkeGgsIGlkeHYsIDMyLCBkaXIsIHR5cGUpOyBcCisgICAgaW5pdF9zdWJwZWwxKDIsIGlkeCwgaWR4aCwgaWR4diwgMTYsIGRpciwgdHlwZSk7IFwKKyAgICBpbml0X3N1YnBlbDEoMywgaWR4LCBpZHhoLCBpZHh2LCAgOCwgZGlyLCB0eXBlKTsgXAorICAgIGluaXRfc3VicGVsMSg0LCBpZHgsIGlkeGgsIGlkeHYsICA0LCBkaXIsIHR5cGUpCisKKyNkZWZpbmUgaW5pdF9zdWJwZWwzKGlkeCwgdHlwZSkgXAorICAgIGluaXRfc3VicGVsMihpZHgsIDEsIDEsIGh2LCB0eXBlKTsgXAorICAgIGluaXRfc3VicGVsMihpZHgsIDAsIDEsIHYsIHR5cGUpOyBcCisgICAgaW5pdF9zdWJwZWwyKGlkeCwgMSwgMCwgaCwgdHlwZSkKKworICAgIGluaXRfc3VicGVsMygwLCBwdXQpOworICAgIGluaXRfc3VicGVsMygxLCBhdmcpOworCisjdW5kZWYgaW5pdF9zdWJwZWwxCisjdW5kZWYgaW5pdF9zdWJwZWwyCisjdW5kZWYgaW5pdF9zdWJwZWwzCit9CisKK2F2X2NvbGQgdm9pZCBmZl92cDlkc3BfaW5pdChWUDlEU1BDb250ZXh0ICpkc3ApCit7CisgICAgdnA5ZHNwX2ludHJhcHJlZF9pbml0KGRzcCk7CisgICAgdnA5ZHNwX2l0eGZtX2luaXQoZHNwKTsKKyAgICB2cDlkc3BfbG9vcGZpbHRlcl9pbml0KGRzcCk7CisgICAgdnA5ZHNwX21jX2luaXQoZHNwKTsKKworICAgIGlmIChBUkNIX1g4NikgZmZfdnA5ZHNwX2luaXRfeDg2KGRzcCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy92cDlkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZwOWRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMGE5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy92cDlkc3AuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIFZQOSBjb21wYXRpYmxlIHZpZGVvIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amUgZ21haWwgY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIENsw6ltZW50IELFk3NjaCA8dSBwa2ggbWU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WUDlEU1BfSAorI2RlZmluZSBBVkNPREVDX1ZQOURTUF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInZwOS5oIgorCit0eXBlZGVmIHZvaWQgKCp2cDlfbWNfZnVuYykodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWYsIHB0cmRpZmZfdCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSk7CisKK3R5cGVkZWYgc3RydWN0IFZQOURTUENvbnRleHQgeworICAgIC8qCisgICAgICogZGltZW5zaW9uIDE6IDA9NHg0LCAxPTh4OCwgMj0xNngxNiwgMz0zMngzMgorICAgICAqIGRpbWVuc2lvbiAyOiBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzCisgICAgICoKKyAgICAgKiBkc3QvbGVmdC90b3AgaXMgYWxpZ25lZCBieSB0cmFuc2Zvcm0tc2l6ZSAoaS5lLiA0LCA4LCAxNiBvciAzMiBwaXhlbHMpCisgICAgICogc3RyaWRlIGlzIGFsaWduZWQgYnkgMTYgcGl4ZWxzCisgICAgICogdG9wWy0xXSBpcyB0b3AvbGVmdDsgdG9wWzQsN10gaXMgdG9wLXJpZ2h0IGZvciA0eDQKKyAgICAgKi8KKyAgICAvLyBGSVhNRShyYnVsdGplKSBtYXliZSByZXBsYWNlIGxlZnQvdG9wIHBvaW50ZXJzIHdpdGggSEFWRV9UT1AvCisgICAgLy8gSEFWRV9MRUZUL0hBVkVfVE9QUklHSFQgZmxhZ3MgaW5zdGVhZCwgYW5kIHRoZW4gaGFuZGxlIGl0IGluLXBsYWNlPworICAgIC8vIGFsc28gbmVlZHMgdG8gZml0IGluIHdpdGggd2hhdCBoMjY0L3ZwOC9ldGMgZG8KKyAgICB2b2lkICgqaW50cmFfcHJlZFtOX1RYRk1fU0laRVNdW05fSU5UUkFfUFJFRF9NT0RFU10pKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdG9wKTsKKworICAgIC8qCisgICAgICogZGltZW5zaW9uIDE6IDA9NHg0LCAxPTh4OCwgMj0xNngxNiwgMz0zMngzMiwgND1sb3NzbGVzcyAoMy00PWRjdCBvbmx5KQorICAgICAqIGRpbWVuc2lvbiAyOiAwPWRjdC9kY3QsIDE9ZGN0L2Fkc3QsIDI9YWRzdC9kY3QsIDM9YWRzdC9hZHN0CisgICAgICoKKyAgICAgKiBkc3QgaXMgYWxpZ25lZCBieSB0cmFuc2Zvcm0tc2l6ZSAoaS5lLiA0LCA4LCAxNiBvciAzMiBwaXhlbHMpCisgICAgICogc3RyaWRlIGlzIGFsaWduZWQgYnkgMTYgcGl4ZWxzCisgICAgICogYmxvY2sgaXMgMTYtYnl0ZSBhbGlnbmVkCisgICAgICogZW9iIGluZGljYXRlcyB0aGUgcG9zaXRpb24gKCsxKSBvZiB0aGUgbGFzdCBub24temVybyBjb2VmZmljaWVudCwKKyAgICAgKiBpbiBzY2FuLW9yZGVyLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGZhc3RlciB2ZXJzaW9ucywgZS5nLiBhCisgICAgICogZGMtb25seSA0eDQvOHg4LzE2eDE2LzMyeDMyLCBvciBhIDR4NC1vbmx5IChlb2I8MTApIDh4OC8xNngxNi8zMngzMiwKKyAgICAgKiBldGMuCisgICAgICovCisgICAgLy8gRklYTUUgYWxzbyB3cml0ZSBpZGN0X2FkZF9ibG9jaygpIHZlcnNpb25zIGZvciB3aG9sZSAoaW50ZXIpIHByZWQKKyAgICAvLyBibG9ja3MsIHNvIHdlIGNhbiBkbyAyIDR4NHMgYXQgb25jZQorICAgIHZvaWQgKCppdHhmbV9hZGRbTl9UWEZNX1NJWkVTICsgMV1bTl9UWEZNX1RZUEVTXSkodWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgZW9iKTsKKworICAgIC8qCisgICAgICogZGltZW5zaW9uIDE6IHdpZHRoIG9mIGZpbHRlciAoMD00LCAxPTgsIDI9MTYpCisgICAgICogZGltZW5zaW9uIDI6IDA9Y29sLWVkZ2UgZmlsdGVyIChoKSwgMT1yb3ctZWRnZSBmaWx0ZXIgKHYpCisgICAgICoKKyAgICAgKiBkc3Qvc3RyaWRlIGFyZSBhbGlnbmVkIGJ5IDgKKyAgICAgKi8KKyAgICB2b2lkICgqbG9vcF9maWx0ZXJfOFszXVsyXSkodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfbGltLCBpbnQgbGltLCBpbnQgaGV2X3Rocik7CisKKyAgICAvKgorICAgICAqIGRpbWVuc2lvbiAxOiAwPWNvbC1lZGdlIGZpbHRlciAoaCksIDE9cm93LWVkZ2UgZmlsdGVyICh2KQorICAgICAqCisgICAgICogVGhlIHdpZHRoIG9mIGZpbHRlciBpcyBhc3N1bWVkIHRvIGJlIDE2OyBkc3Qvc3RyaWRlIGFyZSBhbGlnbmVkIGJ5IDE2CisgICAgICovCisgICAgdm9pZCAoKmxvb3BfZmlsdGVyXzE2WzJdKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfbGltLCBpbnQgbGltLCBpbnQgaGV2X3Rocik7CisKKyAgICAvKgorICAgICAqIGRpbWVuc2lvbiAxLzI6IHdpZHRoIG9mIGZpbHRlciAoMD00LCAxPTgpIGZvciBlYWNoIGZpbHRlciBoYWxmCisgICAgICogZGltZW5zaW9uIDM6IDA9Y29sLWVkZ2UgZmlsdGVyIChoKSwgMT1yb3ctZWRnZSBmaWx0ZXIgKHYpCisgICAgICoKKyAgICAgKiBkc3Qvc3RyaWRlIGFyZSBhbGlnbmVkIGJ5IG9wZXJhdGlvbiBzaXplCisgICAgICogdGhpcyBiYXNpY2FsbHkgY2FsbHMgbG9vcF9maWx0ZXJbZDFdW2QzXVswXSgpLCBmb2xsb3dlZCBieQorICAgICAqIGxvb3BfZmlsdGVyW2QyXVtkM11bMF0oKSBvbiB0aGUgbmV4dCA4IHBpeGVscworICAgICAqIG1iX2xpbS9saW0vaGV2X3RociBjb250YWluIHR3byB2YWx1ZXMgaW4gdGhlIGxvd2VzdCB0d28gYnl0ZXMgb2YgdGhlCisgICAgICogaW50ZWdlci4KKyAgICAgKi8KKyAgICAvLyBGSVhNRSBwZXJoYXBzIGEgbWl4NCB0aGF0IG9wZXJhdGVzIG9uIDMycHggKGZvciBBVlgyKQorICAgIHZvaWQgKCpsb29wX2ZpbHRlcl9taXgyWzJdWzJdWzJdKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9saW0sIGludCBsaW0sIGludCBoZXZfdGhyKTsKKworICAgIC8qCisgICAgICogZGltZW5zaW9uIDE6IGhzaXplICgwOiA2NCwgMTogMzIsIDI6IDE2LCAzOiA4LCA0OiA0KQorICAgICAqIGRpbWVuc2lvbiAyOiBmaWx0ZXIgdHlwZSAoMDogc21vb3RoLCAxOiByZWd1bGFyLCAyOiBzaGFycCwgMzogYmlsaW4pCisgICAgICogZGltZW5zaW9uIDM6IGF2ZXJhZ2luZyB0eXBlICgwOiBwdXQsIDE6IGF2ZykKKyAgICAgKiBkaW1lbnNpb24gNDogeCBzdWJwZWwgaW50ZXJwb2xhdGlvbiAoMDogbm9uZSwgMTogOHRhcC9iaWxpbikKKyAgICAgKiBkaW1lbnNpb24gNTogeSBzdWJwZWwgaW50ZXJwb2xhdGlvbiAoMDogbm9uZSwgMTogOHRhcC9iaWxpbikKKyAgICAgKgorICAgICAqIGRzdC9zdHJpZGUgYXJlIGFsaWduZWQgYnkgaHNpemUKKyAgICAgKi8KKyAgICB2cDlfbWNfZnVuYyBtY1s1XVs0XVsyXVsyXVsyXTsKK30gVlA5RFNQQ29udGV4dDsKKwordm9pZCBmZl92cDlkc3BfaW5pdChWUDlEU1BDb250ZXh0ICpkc3ApOworCit2b2lkIGZmX3ZwOWRzcF9pbml0X3g4NihWUDlEU1BDb250ZXh0ICpkc3ApOworCisjZW5kaWYgLyogQVZDT0RFQ19WUDlEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvdnFhdmlkZW8uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZxYXZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjZWJkNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ZxYXZpZGVvLmMKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgKiBXZXN0d29vZCBTdHVkaW9zIFZRQSBWaWRlbyBEZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZRQSBWaWRlbyBEZWNvZGVyCisgKiBAYXV0aG9yIE1pa2UgTWVsYW5zb24gKG1lbGFuc29uQHBjaXN5cy5uZXQpCisgKiBAc2VlIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPVZRQQorICoKKyAqIFRoZSBWUUEgdmlkZW8gZGVjb2RlciBvdXRwdXRzIFBBTDggb3IgUkdCNTU1IGNvbG9yc3BhY2UgZGF0YSwgZGVwZW5kaW5nCisgKiBvbiB0aGUgdHlwZSBvZiBkYXRhIGluIHRoZSBmaWxlLgorICoKKyAqIFRoaXMgZGVjb2RlciBuZWVkcyB0aGUgNDItYnl0ZSBWUUhEIGhlYWRlciBmcm9tIHRoZSBiZWdpbm5pbmcKKyAqIG9mIHRoZSBWUUEgZmlsZSBwYXNzZWQgdGhyb3VnaCB0aGUgZXh0cmFkYXRhIGZpZWxkLiBUaGUgVlFIRCBoZWFkZXIKKyAqIGlzIGxhaWQgb3V0IGFzOgorICoKKyAqICAgYnl0ZXMgMC0zICAgY2h1bmsgZm91cmNjOiAnVlFIRCcKKyAqICAgYnl0ZXMgNC03ICAgY2h1bmsgc2l6ZSBpbiBiaWctZW5kaWFuIGZvcm1hdCwgc2hvdWxkIGJlIDB4MDAwMDAwMkEKKyAqICAgYnl0ZXMgOC00OSAgVlFIRCBjaHVuayBkYXRhCisgKgorICogQnl0ZXMgOC00OSBhcmUgd2hhdCB0aGlzIGRlY29kZXIgZXhwZWN0cyB0byBzZWUuCisgKgorICogQnJpZWZseSwgVlFBIGlzIGEgdmVjdG9yIHF1YW50aXplZCBhbmltYXRpb24gZm9ybWF0IHRoYXQgb3BlcmF0ZXMgaW4gYQorICogVkdBIHBhbGV0dGl6ZWQgY29sb3JzcGFjZS4gSXQgb3BlcmF0ZXMgb24gcGl4ZWwgdmVjdG9ycyAoYmxvY2tzKQorICogb2YgZWl0aGVyIDR4MiBvciA0eDQgaW4gc2l6ZS4gQ29tcHJlc3NlZCBWUUEgY2h1bmtzIGNhbiBjb250YWluIHZlY3RvcgorICogY29kZWJvb2tzLCBwYWxldHRlIGluZm9ybWF0aW9uLCBhbmQgY29kZSBtYXBzIGZvciByZW5kZXJpbmcgdmVjdG9ycyBvbnRvCisgKiBmcmFtZXMuIEFueSBvZiB0aGVzZSBjb21wb25lbnRzIGNhbiBhbHNvIGJlIGNvbXByZXNzZWQgd2l0aCBhIHJ1bi1sZW5ndGgKKyAqIGVuY29kaW5nIChSTEUpIGFsZ29yaXRobSBjb21tb25seSByZWZlcnJlZCB0byBhcyAiZm9ybWF0ODAiLgorICoKKyAqIFZRQSB0YWtlcyBhIG5vdmVsIGFwcHJvYWNoIHRvIHJhdGUgY29udHJvbC4gRWFjaCBncm91cCBvZiBuIGZyYW1lcworICogKHVzdWFsbHksIG4gPSA4KSByZWxpZXMgb24gYSBkaWZmZXJlbnQgdmVjdG9yIGNvZGVib29rLiBSYXRoZXIgdGhhbgorICogdHJhbnNwb3J0aW5nIGFuIGVudGlyZSBjb2RlYm9vayBldmVyeSA4dGggZnJhbWUsIHRoZSBuZXcgY29kZWJvb2sgaXMKKyAqIGJyb2tlbiB1cCBpbnRvIDggcGllY2VzIGFuZCBzZW50IGFsb25nIHdpdGggdGhlIGNvbXByZXNzZWQgdmlkZW8gY2h1bmtzCisgKiBmb3IgZWFjaCBvZiB0aGUgOCBmcmFtZXMgcHJlY2VkaW5nIHRoZSA4IGZyYW1lcyB3aGljaCByZXF1aXJlIHRoZQorICogY29kZWJvb2suIEEgZnVsbCBjb2RlYm9vayBpcyBhbHNvIHNlbnQgb24gdGhlIHZlcnkgZmlyc3QgZnJhbWUgb2YgYQorICogZmlsZS4gVGhpcyBpcyBhbiBpbnRlcmVzdGluZyB0ZWNobmlxdWUsIGFsdGhvdWdoIGl0IG1ha2VzIHJhbmRvbSBmaWxlCisgKiBzZWVraW5nIGRpZmZpY3VsdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlIGZyYW1lcyBhcmUgYWxsIGludHJhY29kZWQuCisgKgorICogVjEsMiBWUUEgdXNlcyAxMi1iaXQgY29kZWJvb2sgaW5kZXhlcy4gSWYgdGhlIDEyLWJpdCBpbmRleGVzIHdlcmUKKyAqIHBhY2tlZCBpbnRvIGJ5dGVzIGFuZCB0aGVuIFJMRSBjb21wcmVzc2VkLCBieXRld2lzZSwgdGhlIHJlc3VsdHMgd291bGQKKyAqIGJlIHBvb3IuIFRoYXQgaXMgd2h5IHRoZSBjb2RpbmcgbWV0aG9kIGRpdmlkZXMgZWFjaCBpbmRleCBpbnRvIDIgcGFydHMsCisgKiB0aGUgdG9wIDQgYml0cyBhbmQgdGhlIGJvdHRvbSA4IGJpdHMsIHRoZW4gUkwgZW5jb2RlcyB0aGUgNC1iaXQgcGllY2VzCisgKiB0b2dldGhlciBhbmQgdGhlIDgtYml0IHBpZWNlcyB0b2dldGhlci4gSWYgbW9zdCBvZiB0aGUgdmVjdG9ycyBhcmUKKyAqIGNsdXN0ZXJlZCBpbnRvIG9uZSBncm91cCBvZiAyNTYgdmVjdG9ycywgbW9zdCBvZiB0aGUgNC1iaXQgaW5kZXggcGllY2VzCisgKiBzaG91bGQgYmUgdGhlIHNhbWUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFBBTEVUVEVfQ09VTlQgMjU2CisjZGVmaW5lIFZRQV9IRUFERVJfU0laRSAweDJBCisKKy8qIGFsbG9jYXRlIHRoZSBtYXhpbXVtIHZlY3RvciBzcGFjZSwgcmVnYXJkbGVzcyBvZiB0aGUgZmlsZSB2ZXJzaW9uOgorICogKDB4RkYwMCBjb2RlYm9vayB2ZWN0b3JzICsgMHgxMDAgc29saWQgcGl4ZWwgdmVjdG9ycykgKiAoNHg0IHBpeGVscy9ibG9jaykgKi8KKyNkZWZpbmUgTUFYX0NPREVCT09LX1ZFQ1RPUlMgMHhGRjAwCisjZGVmaW5lIFNPTElEX1BJWEVMX1ZFQ1RPUlMgMHgxMDAKKyNkZWZpbmUgTUFYX1ZFQ1RPUlMgKE1BWF9DT0RFQk9PS19WRUNUT1JTICsgU09MSURfUElYRUxfVkVDVE9SUykKKyNkZWZpbmUgTUFYX0NPREVCT09LX1NJWkUgKE1BWF9WRUNUT1JTICogNCAqIDQpCisKKyNkZWZpbmUgQ0JGMF9UQUcgTUtCRVRBRygnQycsICdCJywgJ0YnLCAnMCcpCisjZGVmaW5lIENCRlpfVEFHIE1LQkVUQUcoJ0MnLCAnQicsICdGJywgJ1onKQorI2RlZmluZSBDQlAwX1RBRyBNS0JFVEFHKCdDJywgJ0InLCAnUCcsICcwJykKKyNkZWZpbmUgQ0JQWl9UQUcgTUtCRVRBRygnQycsICdCJywgJ1AnLCAnWicpCisjZGVmaW5lIENQTDBfVEFHIE1LQkVUQUcoJ0MnLCAnUCcsICdMJywgJzAnKQorI2RlZmluZSBDUExaX1RBRyBNS0JFVEFHKCdDJywgJ1AnLCAnTCcsICdaJykKKyNkZWZpbmUgVlBUWl9UQUcgTUtCRVRBRygnVicsICdQJywgJ1QnLCAnWicpCisKK3R5cGVkZWYgc3RydWN0IFZxYUNvbnRleHQgeworCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgdWludDMyX3QgcGFsZXR0ZVtQQUxFVFRFX0NPVU5UXTsKKworICAgIGludCB3aWR0aDsgICAvKiB3aWR0aCBvZiBhIGZyYW1lICovCisgICAgaW50IGhlaWdodDsgICAvKiBoZWlnaHQgb2YgYSBmcmFtZSAqLworICAgIGludCB2ZWN0b3Jfd2lkdGg7ICAvKiB3aWR0aCBvZiBpbmRpdmlkdWFsIHZlY3RvciAqLworICAgIGludCB2ZWN0b3JfaGVpZ2h0OyAgLyogaGVpZ2h0IG9mIGluZGl2aWR1YWwgdmVjdG9yICovCisgICAgaW50IHZxYV92ZXJzaW9uOyAgLyogdGhpcyBzaG91bGQgYmUgZWl0aGVyIDEsIDIgb3IgMyAqLworCisgICAgdW5zaWduZWQgY2hhciAqY29kZWJvb2s7ICAgICAgICAgLyogdGhlIGN1cnJlbnQgY29kZWJvb2sgKi8KKyAgICBpbnQgY29kZWJvb2tfc2l6ZTsKKyAgICB1bnNpZ25lZCBjaGFyICpuZXh0X2NvZGVib29rX2J1ZmZlcjsgIC8qIGFjY3VtdWxhdG9yIGZvciBuZXh0IGNvZGVib29rICovCisgICAgaW50IG5leHRfY29kZWJvb2tfYnVmZmVyX2luZGV4OworCisgICAgdW5zaWduZWQgY2hhciAqZGVjb2RlX2J1ZmZlcjsKKyAgICBpbnQgZGVjb2RlX2J1ZmZlcl9zaXplOworCisgICAgLyogbnVtYmVyIG9mIGZyYW1lcyB0byBnbyBiZWZvcmUgcmVwbGFjaW5nIGNvZGVib29rICovCisgICAgaW50IHBhcnRpYWxfY291bnRkb3duOworICAgIGludCBwYXJ0aWFsX2NvdW50OworCit9IFZxYUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCB2cWFfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZxYUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCBqLCBjb2RlYm9va19pbmRleCwgcmV0OworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKworICAgIC8qIG1ha2Ugc3VyZSB0aGUgZXh0cmFkYXRhIG1hZGUgaXQgKi8KKyAgICBpZiAocy0+YXZjdHgtPmV4dHJhZGF0YV9zaXplICE9IFZRQV9IRUFERVJfU0laRSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImV4cGVjdGVkIGV4dHJhZGF0YSBzaXplIG9mICVkXG4iLCBWUUFfSEVBREVSX1NJWkUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8qIGxvYWQgdXAgdGhlIFZRQSBwYXJhbWV0ZXJzIGZyb20gdGhlIGhlYWRlciAqLworICAgIHMtPnZxYV92ZXJzaW9uID0gcy0+YXZjdHgtPmV4dHJhZGF0YVswXTsKKyAgICBzd2l0Y2ggKHMtPnZxYV92ZXJzaW9uKSB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIlZRQSBWZXJzaW9uICVkIiwgcy0+dnFhX3ZlcnNpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiVlFBIFZlcnNpb24gJWkiLCBzLT52cWFfdmVyc2lvbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgcy0+d2lkdGggPSBBVl9STDE2KCZzLT5hdmN0eC0+ZXh0cmFkYXRhWzZdKTsKKyAgICBzLT5oZWlnaHQgPSBBVl9STDE2KCZzLT5hdmN0eC0+ZXh0cmFkYXRhWzhdKTsKKyAgICBpZiAoKHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUocy0+d2lkdGgsIHMtPmhlaWdodCwgMCwgYXZjdHgpKSA8IDApIHsKKyAgICAgICAgcy0+d2lkdGg9IHMtPmhlaWdodD0gMDsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcy0+dmVjdG9yX3dpZHRoID0gcy0+YXZjdHgtPmV4dHJhZGF0YVsxMF07CisgICAgcy0+dmVjdG9yX2hlaWdodCA9IHMtPmF2Y3R4LT5leHRyYWRhdGFbMTFdOworICAgIHMtPnBhcnRpYWxfY291bnQgPSBzLT5wYXJ0aWFsX2NvdW50ZG93biA9IHMtPmF2Y3R4LT5leHRyYWRhdGFbMTNdOworCisgICAgLyogdGhlIHZlY3RvciBkaW1lbnNpb25zIGhhdmUgdG8gbWVldCB2ZXJ5IHN0cmluZ2VudCByZXF1aXJlbWVudHMgKi8KKyAgICBpZiAoKHMtPnZlY3Rvcl93aWR0aCAhPSA0KSB8fAorICAgICAgICAoKHMtPnZlY3Rvcl9oZWlnaHQgIT0gMikgJiYgKHMtPnZlY3Rvcl9oZWlnaHQgIT0gNCkpKSB7CisgICAgICAgIC8qIHJldHVybiB3aXRob3V0IGZ1cnRoZXIgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHMtPndpZHRoICUgcy0+dmVjdG9yX3dpZHRoIHx8IHMtPmhlaWdodCAlIHMtPnZlY3Rvcl9oZWlnaHQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbWFnZSBzaXplIG5vdCBtdWx0aXBsZSBvZiBibG9jayBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgY29kZWJvb2tzICovCisgICAgcy0+Y29kZWJvb2tfc2l6ZSA9IE1BWF9DT0RFQk9PS19TSVpFOworICAgIHMtPmNvZGVib29rID0gYXZfbWFsbG9jKHMtPmNvZGVib29rX3NpemUpOworICAgIGlmICghcy0+Y29kZWJvb2spCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBzLT5uZXh0X2NvZGVib29rX2J1ZmZlciA9IGF2X21hbGxvYyhzLT5jb2RlYm9va19zaXplKTsKKyAgICBpZiAoIXMtPm5leHRfY29kZWJvb2tfYnVmZmVyKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiBhbGxvY2F0ZSBkZWNvZGUgYnVmZmVyICovCisgICAgcy0+ZGVjb2RlX2J1ZmZlcl9zaXplID0gKHMtPndpZHRoIC8gcy0+dmVjdG9yX3dpZHRoKSAqCisgICAgICAgIChzLT5oZWlnaHQgLyBzLT52ZWN0b3JfaGVpZ2h0KSAqIDI7CisgICAgcy0+ZGVjb2RlX2J1ZmZlciA9IGF2X21hbGxvY3oocy0+ZGVjb2RlX2J1ZmZlcl9zaXplKTsKKyAgICBpZiAoIXMtPmRlY29kZV9idWZmZXIpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIHNvbGlkLWNvbG9yIHZlY3RvcnMgKi8KKyAgICBpZiAocy0+dmVjdG9yX2hlaWdodCA9PSA0KSB7CisgICAgICAgIGNvZGVib29rX2luZGV4ID0gMHhGRjAwICogMTY7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgICAgIHMtPmNvZGVib29rW2NvZGVib29rX2luZGV4KytdID0gaTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb2RlYm9va19pbmRleCA9IDB4RjAwICogODsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgICAgICBzLT5jb2RlYm9va1tjb2RlYm9va19pbmRleCsrXSA9IGk7CisgICAgfQorICAgIHMtPm5leHRfY29kZWJvb2tfYnVmZmVyX2luZGV4ID0gMDsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBhdl9mcmVlcCgmcy0+Y29kZWJvb2spOworICAgIGF2X2ZyZWVwKCZzLT5uZXh0X2NvZGVib29rX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPmRlY29kZV9idWZmZXIpOworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfQ09VTlQoKSBcCisgICAgaWYgKGRlc3RfaW5kZXggKyBjb3VudCA+IGRlc3Rfc2l6ZSkgeyBcCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlX2Zvcm1hdDgwIHByb2JsZW06IG5leHQgb3Agd291bGQgb3ZlcmZsb3cgZGVzdF9pbmRleFxuIik7IFwKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjdXJyZW50IGRlc3RfaW5kZXggPSAlZCwgY291bnQgPSAlZCwgZGVzdF9zaXplID0gJWRcbiIsIFwKKyAgICAgICAgICAgIGRlc3RfaW5kZXgsIGNvdW50LCBkZXN0X3NpemUpOyBcCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyBcCisgICAgfQorCisjZGVmaW5lIENIRUNLX0NPUFkoaWR4KSBcCisgICAgaWYgKGlkeCA8IDAgfHwgaWR4ICsgY291bnQgPiBkZXN0X3NpemUpIHsgXAorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRlY29kZV9mb3JtYXQ4MCBwcm9ibGVtOiBuZXh0IG9wIHdvdWxkIG92ZXJmbG93IGRlc3RfaW5kZXhcbiIpOyBcCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY3VycmVudCBzcmNfcG9zID0gJWQsIGNvdW50ID0gJWQsIGRlc3Rfc2l6ZSA9ICVkXG4iLCBcCisgICAgICAgICAgICBzcmNfcG9zLCBjb3VudCwgZGVzdF9zaXplKTsgXAorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgXAorICAgIH0KKworCitzdGF0aWMgaW50IGRlY29kZV9mb3JtYXQ4MChWcWFDb250ZXh0ICpzLCBpbnQgc3JjX3NpemUsCisgICAgdW5zaWduZWQgY2hhciAqZGVzdCwgaW50IGRlc3Rfc2l6ZSwgaW50IGNoZWNrX3NpemUpIHsKKworICAgIGludCBkZXN0X2luZGV4ID0gMDsKKyAgICBpbnQgY291bnQsIG9wY29kZSwgc3RhcnQ7CisgICAgaW50IHNyY19wb3M7CisgICAgdW5zaWduZWQgY2hhciBjb2xvcjsKKyAgICBpbnQgaTsKKworICAgIHN0YXJ0ID0gYnl0ZXN0cmVhbTJfdGVsbCgmcy0+Z2IpOworICAgIHdoaWxlIChieXRlc3RyZWFtMl90ZWxsKCZzLT5nYikgLSBzdGFydCA8IHNyY19zaXplKSB7CisgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICJvcGNvZGUgJTAyWDogIiwgb3Bjb2RlKTsKKworICAgICAgICAvKiAweDgwIG1lYW5zIHRoYXQgZnJhbWUgaXMgZmluaXNoZWQgKi8KKyAgICAgICAgaWYgKG9wY29kZSA9PSAweDgwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGRlc3RfaW5kZXggPj0gZGVzdF9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRlY29kZV9mb3JtYXQ4MCBwcm9ibGVtOiBkZXN0X2luZGV4ICglZCkgZXhjZWVkZWQgZGVzdF9zaXplICglZClcbiIsCisgICAgICAgICAgICAgICAgZGVzdF9pbmRleCwgZGVzdF9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wY29kZSA9PSAweEZGKSB7CisKKyAgICAgICAgICAgIGNvdW50ICAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcy0+Z2IpOworICAgICAgICAgICAgc3JjX3BvcyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5nYik7CisgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiKDEpIGNvcHkgJVggYnl0ZXMgZnJvbSBhYnNvbHV0ZSBwb3MgJVhcbiIsIGNvdW50LCBzcmNfcG9zKTsKKyAgICAgICAgICAgIENIRUNLX0NPVU5UKCk7CisgICAgICAgICAgICBDSEVDS19DT1BZKHNyY19wb3MpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgZGVzdFtkZXN0X2luZGV4ICsgaV0gPSBkZXN0W3NyY19wb3MgKyBpXTsKKyAgICAgICAgICAgIGRlc3RfaW5kZXggKz0gY291bnQ7CisKKyAgICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPT0gMHhGRSkgeworCisgICAgICAgICAgICBjb3VudCA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5nYik7CisgICAgICAgICAgICBjb2xvciA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiKDIpIHNldCAlWCBieXRlcyB0byAlMDJYXG4iLCBjb3VudCwgY29sb3IpOworICAgICAgICAgICAgQ0hFQ0tfQ09VTlQoKTsKKyAgICAgICAgICAgIG1lbXNldCgmZGVzdFtkZXN0X2luZGV4XSwgY29sb3IsIGNvdW50KTsKKyAgICAgICAgICAgIGRlc3RfaW5kZXggKz0gY291bnQ7CisKKyAgICAgICAgfSBlbHNlIGlmICgob3Bjb2RlICYgMHhDMCkgPT0gMHhDMCkgeworCisgICAgICAgICAgICBjb3VudCA9IChvcGNvZGUgJiAweDNGKSArIDM7CisgICAgICAgICAgICBzcmNfcG9zID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnMtPmdiKTsKKyAgICAgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICIoMykgY29weSAlWCBieXRlcyBmcm9tIGFic29sdXRlIHBvcyAlWFxuIiwgY291bnQsIHNyY19wb3MpOworICAgICAgICAgICAgQ0hFQ0tfQ09VTlQoKTsKKyAgICAgICAgICAgIENIRUNLX0NPUFkoc3JjX3Bvcyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICBkZXN0W2Rlc3RfaW5kZXggKyBpXSA9IGRlc3Rbc3JjX3BvcyArIGldOworICAgICAgICAgICAgZGVzdF9pbmRleCArPSBjb3VudDsKKworICAgICAgICB9IGVsc2UgaWYgKG9wY29kZSA+IDB4ODApIHsKKworICAgICAgICAgICAgY291bnQgPSBvcGNvZGUgJiAweDNGOworICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgIig0KSBjb3B5ICVYIGJ5dGVzIGZyb20gc291cmNlIHRvIGRlc3RcbiIsIGNvdW50KTsKKyAgICAgICAgICAgIENIRUNLX0NPVU5UKCk7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZzLT5nYiwgJmRlc3RbZGVzdF9pbmRleF0sIGNvdW50KTsKKyAgICAgICAgICAgIGRlc3RfaW5kZXggKz0gY291bnQ7CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgY291bnQgPSAoKG9wY29kZSAmIDB4NzApID4+IDQpICsgMzsKKyAgICAgICAgICAgIHNyY19wb3MgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpIHwgKChvcGNvZGUgJiAweDBGKSA8PCA4KTsKKyAgICAgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICIoNSkgY29weSAlWCBieXRlcyBmcm9tIHJlbHBvcyAlWFxuIiwgY291bnQsIHNyY19wb3MpOworICAgICAgICAgICAgQ0hFQ0tfQ09VTlQoKTsKKyAgICAgICAgICAgIENIRUNLX0NPUFkoZGVzdF9pbmRleCAtIHNyY19wb3MpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgZGVzdFtkZXN0X2luZGV4ICsgaV0gPSBkZXN0W2Rlc3RfaW5kZXggLSBzcmNfcG9zICsgaV07CisgICAgICAgICAgICBkZXN0X2luZGV4ICs9IGNvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgLyogdmFsaWRhdGUgdGhhdCB0aGUgZW50aXJlIGRlc3RpbmF0aW9uIGJ1ZmZlciB3YXMgZmlsbGVkOyB0aGlzIGlzCisgICAgICogaW1wb3J0YW50IGZvciBkZWNvZGluZyBmcmFtZSBtYXBzIHNpbmNlIGVhY2ggdmVjdG9yIG5lZWRzIHRvIGhhdmUgYQorICAgICAqIGNvZGVib29rIGVudHJ5OyBpdCBpcyBub3QgaW1wb3J0YW50IGZvciBjb21wcmVzc2VkIGNvZGVib29rcyBiZWNhdXNlCisgICAgICogbm90IGV2ZXJ5IGVudHJ5IG5lZWRzIHRvIGJlIGZpbGxlZCAqLworICAgIGlmIChjaGVja19zaXplKQorICAgICAgICBpZiAoZGVzdF9pbmRleCA8IGRlc3Rfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJkZWNvZGVfZm9ybWF0ODAgcHJvYmxlbTogZGVjb2RlIGZpbmlzaGVkIHdpdGggZGVzdF9pbmRleCAoJWQpIDwgZGVzdF9zaXplICglZClcbiIsCisgICAgICAgICAgICAgICAgZGVzdF9pbmRleCwgZGVzdF9zaXplKTsKKyAgICAgICAgICAgIG1lbXNldChkZXN0ICsgZGVzdF9pbmRleCwgMCwgZGVzdF9zaXplIC0gZGVzdF9pbmRleCk7CisgICAgICAgIH0KKworICAgIHJldHVybiAwOyAvLyBsZXQncyBkaXNwbGF5IHdoYXQgd2UgZGVjb2RlZCBhbnl3YXkKK30KKworc3RhdGljIGludCB2cWFfZGVjb2RlX2NodW5rKFZxYUNvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIHVuc2lnbmVkIGludCBjaHVua190eXBlOworICAgIHVuc2lnbmVkIGludCBjaHVua19zaXplOworICAgIGludCBieXRlX3NraXA7CisgICAgdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyIHIsIGcsIGI7CisgICAgaW50IGluZGV4X3NoaWZ0OworICAgIGludCByZXM7CisKKyAgICBpbnQgY2JmMF9jaHVuayA9IC0xOworICAgIGludCBjYmZ6X2NodW5rID0gLTE7CisgICAgaW50IGNicDBfY2h1bmsgPSAtMTsKKyAgICBpbnQgY2Jwel9jaHVuayA9IC0xOworICAgIGludCBjcGwwX2NodW5rID0gLTE7CisgICAgaW50IGNwbHpfY2h1bmsgPSAtMTsKKyAgICBpbnQgdnB0el9jaHVuayA9IC0xOworCisgICAgaW50IHgsIHk7CisgICAgaW50IGxpbmVzID0gMDsKKyAgICBpbnQgcGl4ZWxfcHRyOworICAgIGludCB2ZWN0b3JfaW5kZXggPSAwOworICAgIGludCBsb2J5dGUgPSAwOworICAgIGludCBoaWJ5dGUgPSAwOworICAgIGludCBsb2J5dGVzID0gMDsKKyAgICBpbnQgaGlieXRlcyA9IHMtPmRlY29kZV9idWZmZXJfc2l6ZSAvIDI7CisKKyAgICAvKiBmaXJzdCwgdHJhdmVyc2UgdGhyb3VnaCB0aGUgZnJhbWUgYW5kIGZpbmQgdGhlIHN1YmNodW5rcyAqLworICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpID49IDgpIHsKKworICAgICAgICBjaHVua190eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZzLT5nYik7CisgICAgICAgIGluZGV4ICAgICAgPSBieXRlc3RyZWFtMl90ZWxsKCZzLT5nYik7CisgICAgICAgIGNodW5rX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJnMtPmdiKTsKKworICAgICAgICBzd2l0Y2ggKGNodW5rX3R5cGUpIHsKKworICAgICAgICBjYXNlIENCRjBfVEFHOgorICAgICAgICAgICAgY2JmMF9jaHVuayA9IGluZGV4OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDQkZaX1RBRzoKKyAgICAgICAgICAgIGNiZnpfY2h1bmsgPSBpbmRleDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ0JQMF9UQUc6CisgICAgICAgICAgICBjYnAwX2NodW5rID0gaW5kZXg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENCUFpfVEFHOgorICAgICAgICAgICAgY2Jwel9jaHVuayA9IGluZGV4OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDUEwwX1RBRzoKKyAgICAgICAgICAgIGNwbDBfY2h1bmsgPSBpbmRleDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ1BMWl9UQUc6CisgICAgICAgICAgICBjcGx6X2NodW5rID0gaW5kZXg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZQVFpfVEFHOgorICAgICAgICAgICAgdnB0el9jaHVuayA9IGluZGV4OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRm91bmQgdW5rbm93biBjaHVuayB0eXBlOiAlYyVjJWMlYyAoJTA4WClcbiIsCisgICAgICAgICAgICAoY2h1bmtfdHlwZSA+PiAyNCkgJiAweEZGLAorICAgICAgICAgICAgKGNodW5rX3R5cGUgPj4gMTYpICYgMHhGRiwKKyAgICAgICAgICAgIChjaHVua190eXBlID4+ICA4KSAmIDB4RkYsCisgICAgICAgICAgICAoY2h1bmtfdHlwZSA+PiAgMCkgJiAweEZGLAorICAgICAgICAgICAgY2h1bmtfdHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVfc2tpcCA9IGNodW5rX3NpemUgJiAweDAxOworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgY2h1bmtfc2l6ZSArIGJ5dGVfc2tpcCk7CisgICAgfQorCisgICAgLyogbmV4dCwgZGVhbCB3aXRoIHRoZSBwYWxldHRlICovCisgICAgaWYgKChjcGwwX2NodW5rICE9IC0xKSAmJiAoY3Bsel9jaHVuayAhPSAtMSkpIHsKKworICAgICAgICAvKiBhIGNodW5rIHNob3VsZCBub3QgaGF2ZSBib3RoIGNodW5rIHR5cGVzICovCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicHJvYmxlbTogZm91bmQgYm90aCBDUEwwIGFuZCBDUExaIGNodW5rc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIGRlY29tcHJlc3MgdGhlIHBhbGV0dGUgY2h1bmsgKi8KKyAgICBpZiAoY3Bsel9jaHVuayAhPSAtMSkgeworCisvKiB5ZXQgdG8gYmUgaGFuZGxlZCAqLworCisgICAgfQorCisgICAgLyogY29udmVydCB0aGUgUkdCIHBhbGV0dGUgaW50byB0aGUgbWFjaGluZSdzIGVuZGlhbiBmb3JtYXQgKi8KKyAgICBpZiAoY3BsMF9jaHVuayAhPSAtMSkgeworCisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJnMtPmdiLCBjcGwwX2NodW5rLCBTRUVLX1NFVCk7CisgICAgICAgIGNodW5rX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Z2IpOworICAgICAgICAvKiBzYW5pdHkgY2hlY2sgdGhlIHBhbGV0dGUgc2l6ZSAqLworICAgICAgICBpZiAoY2h1bmtfc2l6ZSAvIDMgPiAyNTYgfHwgY2h1bmtfc2l6ZSA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicHJvYmxlbTogZm91bmQgYSBwYWxldHRlIGNodW5rIHdpdGggJWQgY29sb3JzXG4iLAorICAgICAgICAgICAgICAgIGNodW5rX3NpemUgLyAzKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaHVua19zaXplIC8gMzsgaSsrKSB7CisgICAgICAgICAgICAvKiBzY2FsZSBieSA0IHRvIHRyYW5zZm9ybSA2LWJpdCBwYWxldHRlIC0+IDgtYml0ICovCisgICAgICAgICAgICByID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nYikgKiA0OworICAgICAgICAgICAgZyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Z2IpICogNDsKKyAgICAgICAgICAgIGIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKSAqIDQ7CisgICAgICAgICAgICBzLT5wYWxldHRlW2ldID0gMHhGRlUgPDwgMjQgfCByIDw8IDE2IHwgZyA8PCA4IHwgYjsKKyAgICAgICAgICAgIHMtPnBhbGV0dGVbaV0gfD0gcy0+cGFsZXR0ZVtpXSA+PiA2ICYgMHgzMDMwMzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG5leHQsIGxvb2sgZm9yIGEgZnVsbCBjb2RlYm9vayAqLworICAgIGlmICgoY2JmMF9jaHVuayAhPSAtMSkgJiYgKGNiZnpfY2h1bmsgIT0gLTEpKSB7CisKKyAgICAgICAgLyogYSBjaHVuayBzaG91bGQgbm90IGhhdmUgYm90aCBjaHVuayB0eXBlcyAqLworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInByb2JsZW06IGZvdW5kIGJvdGggQ0JGMCBhbmQgQ0JGWiBjaHVua3NcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBkZWNvbXByZXNzIHRoZSBmdWxsIGNvZGVib29rIGNodW5rICovCisgICAgaWYgKGNiZnpfY2h1bmsgIT0gLTEpIHsKKworICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nYiwgY2Jmel9jaHVuaywgU0VFS19TRVQpOworICAgICAgICBjaHVua19zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnMtPmdiKTsKKyAgICAgICAgaWYgKChyZXMgPSBkZWNvZGVfZm9ybWF0ODAocywgY2h1bmtfc2l6ZSwgcy0+Y29kZWJvb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvZGVib29rX3NpemUsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qIGNvcHkgYSBmdWxsIGNvZGVib29rICovCisgICAgaWYgKGNiZjBfY2h1bmsgIT0gLTEpIHsKKworICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nYiwgY2JmMF9jaHVuaywgU0VFS19TRVQpOworICAgICAgICBjaHVua19zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnMtPmdiKTsKKyAgICAgICAgLyogc2FuaXR5IGNoZWNrIHRoZSBmdWxsIGNvZGVib29rIHNpemUgKi8KKyAgICAgICAgaWYgKGNodW5rX3NpemUgPiBNQVhfQ09ERUJPT0tfU0laRSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJwcm9ibGVtOiBDQkYwIGNodW5rIHRvbyBsYXJnZSAoMHglWCBieXRlcylcbiIsCisgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJnMtPmdiLCBzLT5jb2RlYm9vaywgY2h1bmtfc2l6ZSk7CisgICAgfQorCisgICAgLyogZGVjb2RlIHRoZSBmcmFtZSAqLworICAgIGlmICh2cHR6X2NodW5rID09IC0xKSB7CisKKyAgICAgICAgLyogc29tZXRoaW5nIGlzIHdyb25nIGlmIHRoZXJlIGlzIG5vIFZQVFogY2h1bmsgKi8KKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJwcm9ibGVtOiBubyBWUFRaIGNodW5rIGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfc2Vlaygmcy0+Z2IsIHZwdHpfY2h1bmssIFNFRUtfU0VUKTsKKyAgICBjaHVua19zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnMtPmdiKTsKKyAgICBpZiAoKHJlcyA9IGRlY29kZV9mb3JtYXQ4MChzLCBjaHVua19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlY29kZV9idWZmZXIsIHMtPmRlY29kZV9idWZmZXJfc2l6ZSwgMSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIC8qIHJlbmRlciB0aGUgZmluYWwgUEFMOCBmcmFtZSAqLworICAgIGlmIChzLT52ZWN0b3JfaGVpZ2h0ID09IDQpCisgICAgICAgIGluZGV4X3NoaWZ0ID0gNDsKKyAgICBlbHNlCisgICAgICAgIGluZGV4X3NoaWZ0ID0gMzsKKyAgICBmb3IgKHkgPSAwOyB5IDwgcy0+aGVpZ2h0OyB5ICs9IHMtPnZlY3Rvcl9oZWlnaHQpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPndpZHRoOyB4ICs9IDQsIGxvYnl0ZXMrKywgaGlieXRlcysrKSB7CisgICAgICAgICAgICBwaXhlbF9wdHIgPSB5ICogZnJhbWUtPmxpbmVzaXplWzBdICsgeDsKKworICAgICAgICAgICAgLyogZ2V0IHRoZSB2ZWN0b3IgaW5kZXgsIHRoZSBtZXRob2QgZm9yIHdoaWNoIHZhcmllcyBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICAqIFZRQSBmaWxlIHZlcnNpb24gKi8KKyAgICAgICAgICAgIHN3aXRjaCAocy0+dnFhX3ZlcnNpb24pIHsKKworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGxvYnl0ZSA9IHMtPmRlY29kZV9idWZmZXJbbG9ieXRlcyAqIDJdOworICAgICAgICAgICAgICAgIGhpYnl0ZSA9IHMtPmRlY29kZV9idWZmZXJbKGxvYnl0ZXMgKiAyKSArIDFdOworICAgICAgICAgICAgICAgIHZlY3Rvcl9pbmRleCA9ICgoaGlieXRlIDw8IDgpIHwgbG9ieXRlKSA+PiAzOworICAgICAgICAgICAgICAgIHZlY3Rvcl9pbmRleCA8PD0gaW5kZXhfc2hpZnQ7CisgICAgICAgICAgICAgICAgbGluZXMgPSBzLT52ZWN0b3JfaGVpZ2h0OworICAgICAgICAgICAgICAgIC8qIHVuaWZvcm0gY29sb3IgZmlsbCAtIGEgcXVpY2sgaGFjayAqLworICAgICAgICAgICAgICAgIGlmIChoaWJ5dGUgPT0gMHhGRikgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGluZXMtLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF1bcGl4ZWxfcHRyICsgMF0gPSAyNTUgLSBsb2J5dGU7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YVswXVtwaXhlbF9wdHIgKyAxXSA9IDI1NSAtIGxvYnl0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5kYXRhWzBdW3BpeGVsX3B0ciArIDJdID0gMjU1IC0gbG9ieXRlOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF1bcGl4ZWxfcHRyICsgM10gPSAyNTUgLSBsb2J5dGU7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxpbmVzPTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgbG9ieXRlID0gcy0+ZGVjb2RlX2J1ZmZlcltsb2J5dGVzXTsKKyAgICAgICAgICAgICAgICBoaWJ5dGUgPSBzLT5kZWNvZGVfYnVmZmVyW2hpYnl0ZXNdOworICAgICAgICAgICAgICAgIHZlY3Rvcl9pbmRleCA9IChoaWJ5dGUgPDwgOCkgfCBsb2J5dGU7CisgICAgICAgICAgICAgICAgdmVjdG9yX2luZGV4IDw8PSBpbmRleF9zaGlmdDsKKyAgICAgICAgICAgICAgICBsaW5lcyA9IHMtPnZlY3Rvcl9oZWlnaHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzoKKy8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKyAgICAgICAgICAgICAgICBsaW5lcyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChsaW5lcy0tKSB7CisgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF1bcGl4ZWxfcHRyICsgMF0gPSBzLT5jb2RlYm9va1t2ZWN0b3JfaW5kZXgrK107CisgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF1bcGl4ZWxfcHRyICsgMV0gPSBzLT5jb2RlYm9va1t2ZWN0b3JfaW5kZXgrK107CisgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF1bcGl4ZWxfcHRyICsgMl0gPSBzLT5jb2RlYm9va1t2ZWN0b3JfaW5kZXgrK107CisgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF1bcGl4ZWxfcHRyICsgM10gPSBzLT5jb2RlYm9va1t2ZWN0b3JfaW5kZXgrK107CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGhhbmRsZSBwYXJ0aWFsIGNvZGVib29rICovCisgICAgaWYgKChjYnAwX2NodW5rICE9IC0xKSAmJiAoY2Jwel9jaHVuayAhPSAtMSkpIHsKKyAgICAgICAgLyogYSBjaHVuayBzaG91bGQgbm90IGhhdmUgYm90aCBjaHVuayB0eXBlcyAqLworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInByb2JsZW06IGZvdW5kIGJvdGggQ0JQMCBhbmQgQ0JQWiBjaHVua3NcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoY2JwMF9jaHVuayAhPSAtMSkgeworCisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJnMtPmdiLCBjYnAwX2NodW5rLCBTRUVLX1NFVCk7CisgICAgICAgIGNodW5rX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Z2IpOworCisgICAgICAgIGlmIChjaHVua19zaXplID4gTUFYX0NPREVCT09LX1NJWkUgLSBzLT5uZXh0X2NvZGVib29rX2J1ZmZlcl9pbmRleCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjYnAwIGNodW5rIHRvbyBsYXJnZSAoJXUgYnl0ZXMpXG4iLAorICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICAvKiBhY2N1bXVsYXRlIHBhcnRpYWwgY29kZWJvb2sgKi8KKyAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcy0+Z2IsICZzLT5uZXh0X2NvZGVib29rX2J1ZmZlcltzLT5uZXh0X2NvZGVib29rX2J1ZmZlcl9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSk7CisgICAgICAgIHMtPm5leHRfY29kZWJvb2tfYnVmZmVyX2luZGV4ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgcy0+cGFydGlhbF9jb3VudGRvd24tLTsKKyAgICAgICAgaWYgKHMtPnBhcnRpYWxfY291bnRkb3duIDw9IDApIHsKKworICAgICAgICAgICAgLyogdGltZSB0byByZXBsYWNlIGNvZGVib29rICovCisgICAgICAgICAgICBtZW1jcHkocy0+Y29kZWJvb2ssIHMtPm5leHRfY29kZWJvb2tfYnVmZmVyLAorICAgICAgICAgICAgICAgIHMtPm5leHRfY29kZWJvb2tfYnVmZmVyX2luZGV4KTsKKworICAgICAgICAgICAgLyogcmVzZXQgYWNjb3VudGluZyAqLworICAgICAgICAgICAgcy0+bmV4dF9jb2RlYm9va19idWZmZXJfaW5kZXggPSAwOworICAgICAgICAgICAgcy0+cGFydGlhbF9jb3VudGRvd24gPSBzLT5wYXJ0aWFsX2NvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNicHpfY2h1bmsgIT0gLTEpIHsKKworICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nYiwgY2Jwel9jaHVuaywgU0VFS19TRVQpOworICAgICAgICBjaHVua19zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnMtPmdiKTsKKworICAgICAgICBpZiAoY2h1bmtfc2l6ZSA+IE1BWF9DT0RFQk9PS19TSVpFIC0gcy0+bmV4dF9jb2RlYm9va19idWZmZXJfaW5kZXgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2JweiBjaHVuayB0b28gbGFyZ2UgKCV1IGJ5dGVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICBjaHVua19zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgLyogYWNjdW11bGF0ZSBwYXJ0aWFsIGNvZGVib29rICovCisgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJnMtPmdiLCAmcy0+bmV4dF9jb2RlYm9va19idWZmZXJbcy0+bmV4dF9jb2RlYm9va19idWZmZXJfaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUpOworICAgICAgICBzLT5uZXh0X2NvZGVib29rX2J1ZmZlcl9pbmRleCArPSBjaHVua19zaXplOworCisgICAgICAgIHMtPnBhcnRpYWxfY291bnRkb3duLS07CisgICAgICAgIGlmIChzLT5wYXJ0aWFsX2NvdW50ZG93biA8PSAwKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZzLT5nYiwgcy0+bmV4dF9jb2RlYm9va19idWZmZXIsIHMtPm5leHRfY29kZWJvb2tfYnVmZmVyX2luZGV4KTsKKyAgICAgICAgICAgIC8qIGRlY29tcHJlc3MgY29kZWJvb2sgKi8KKyAgICAgICAgICAgIGlmICgocmVzID0gZGVjb2RlX2Zvcm1hdDgwKHMsIHMtPm5leHRfY29kZWJvb2tfYnVmZmVyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29kZWJvb2ssIHMtPmNvZGVib29rX3NpemUsIDApKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKworICAgICAgICAgICAgLyogcmVzZXQgYWNjb3VudGluZyAqLworICAgICAgICAgICAgcy0+bmV4dF9jb2RlYm9va19idWZmZXJfaW5kZXggPSAwOworICAgICAgICAgICAgcy0+cGFydGlhbF9jb3VudGRvd24gPSBzLT5wYXJ0aWFsX2NvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnFhX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFZxYUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcmVzOworCisgICAgaWYgKChyZXMgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIGlmICgocmVzID0gdnFhX2RlY29kZV9jaHVuayhzLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIC8qIG1ha2UgdGhlIHBhbGV0dGUgYXZhaWxhYmxlIG9uIHRoZSB3YXkgb3V0ICovCisgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzFdLCBzLT5wYWxldHRlLCBQQUxFVFRFX0NPVU5UICogNCk7CisgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworCisgICAgKmdvdF9mcmFtZSAgICAgID0gMTsKKworICAgIC8qIHJlcG9ydCB0aGF0IHRoZSBidWZmZXIgd2FzIGNvbXBsZXRlbHkgY29uc3VtZWQgKi8KKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2cWFfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVnFhQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmcy0+Y29kZWJvb2spOworICAgIGF2X2ZyZWVwKCZzLT5uZXh0X2NvZGVib29rX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPmRlY29kZV9idWZmZXIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfdnFhX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZxYXZpZGVvIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2VzdHdvb2QgU3R1ZGlvcyBWUUEgKFZlY3RvciBRdWFudGl6ZWQgQW5pbWF0aW9uKSB2aWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XU19WUUEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZxYUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHZxYV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB2cWFfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSB2cWFfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvd2F2cGFjay5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvd2F2cGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZDM5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy93YXZwYWNrLmMKQEAgLTAsMCArMSwxMTE3IEBACisvKgorICogV2F2UGFjayBsb3NzbGVzcyBhdWRpbyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsMjAxMSBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJ3YXZwYWNrLmgiCisKKy8qKgorICogQGZpbGUKKyAqIFdhdlBhY2sgbG9zc2xlc3MgYXVkaW8gZGVjb2RlcgorICovCisKK3R5cGVkZWYgc3RydWN0IFNhdmVkQ29udGV4dCB7CisgICAgaW50IG9mZnNldDsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgYml0c191c2VkOworICAgIHVpbnQzMl90IGNyYzsKK30gU2F2ZWRDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBXYXZwYWNrRnJhbWVDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgaW50IGZyYW1lX2ZsYWdzOworICAgIGludCBzdGVyZW8sIHN0ZXJlb19pbjsKKyAgICBpbnQgam9pbnQ7CisgICAgdWludDMyX3QgQ1JDOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGdvdF9leHRyYV9iaXRzOworICAgIHVpbnQzMl90IGNyY19leHRyYV9iaXRzOworICAgIEdldEJpdENvbnRleHQgZ2JfZXh0cmFfYml0czsKKyAgICBpbnQgZGF0YV9zaXplOyAvLyBpbiBiaXRzCisgICAgaW50IHNhbXBsZXM7CisgICAgaW50IHRlcm1zOworICAgIERlY29yciBkZWNvcnJbTUFYX1RFUk1TXTsKKyAgICBpbnQgemVybywgb25lLCB6ZXJvZXM7CisgICAgaW50IGV4dHJhX2JpdHM7CisgICAgaW50IGFuZCwgb3IsIHNoaWZ0OworICAgIGludCBwb3N0X3NoaWZ0OworICAgIGludCBoeWJyaWQsIGh5YnJpZF9iaXRyYXRlOworICAgIGludCBoeWJyaWRfbWF4Y2xpcCwgaHlicmlkX21pbmNsaXA7CisgICAgaW50IGZsb2F0X2ZsYWc7CisgICAgaW50IGZsb2F0X3NoaWZ0OworICAgIGludCBmbG9hdF9tYXhfZXhwOworICAgIFd2Q2hhbm5lbCBjaFsyXTsKKyAgICBpbnQgcG9zOworICAgIFNhdmVkQ29udGV4dCBzYywgZXh0cmFfc2M7Cit9IFdhdnBhY2tGcmFtZUNvbnRleHQ7CisKKyNkZWZpbmUgV1ZfTUFYX0ZSQU1FX0RFQ09ERVJTIDE0CisKK3R5cGVkZWYgc3RydWN0IFdhdnBhY2tDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisKKyAgICBXYXZwYWNrRnJhbWVDb250ZXh0ICpmZGVjW1dWX01BWF9GUkFNRV9ERUNPREVSU107CisgICAgaW50IGZkZWNfbnVtOworCisgICAgaW50IGJsb2NrOworICAgIGludCBzYW1wbGVzOworICAgIGludCBjaF9vZmZzZXQ7Cit9IFdhdnBhY2tDb250ZXh0OworCisjZGVmaW5lIExFVkVMX0RFQ0FZKGEpICAoKChhKSArIDB4ODApID4+IDgpCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBnZXRfdGFpbChHZXRCaXRDb250ZXh0ICpnYiwgaW50IGspCit7CisgICAgaW50IHAsIGUsIHJlczsKKworICAgIGlmIChrIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcCAgID0gYXZfbG9nMihrKTsKKyAgICBlICAgPSAoMSA8PCAocCArIDEpKSAtIGsgLSAxOworICAgIHJlcyA9IHAgPyBnZXRfYml0cyhnYiwgcCkgOiAwOworICAgIGlmIChyZXMgPj0gZSkKKyAgICAgICAgcmVzID0gKHJlcyA8PCAxKSAtIGUgKyBnZXRfYml0czEoZ2IpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9lcnJvcl9saW1pdChXYXZwYWNrRnJhbWVDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGksIGJyWzJdLCBzbFsyXTsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gY3R4LT5zdGVyZW9faW47IGkrKykgeworICAgICAgICBjdHgtPmNoW2ldLmJpdHJhdGVfYWNjICs9IGN0eC0+Y2hbaV0uYml0cmF0ZV9kZWx0YTsKKyAgICAgICAgYnJbaV0gICAgICAgICAgICAgICAgICAgPSBjdHgtPmNoW2ldLmJpdHJhdGVfYWNjID4+IDE2OworICAgICAgICBzbFtpXSAgICAgICAgICAgICAgICAgICA9IExFVkVMX0RFQ0FZKGN0eC0+Y2hbaV0uc2xvd19sZXZlbCk7CisgICAgfQorICAgIGlmIChjdHgtPnN0ZXJlb19pbiAmJiBjdHgtPmh5YnJpZF9iaXRyYXRlKSB7CisgICAgICAgIGludCBiYWxhbmNlID0gKHNsWzFdIC0gc2xbMF0gKyBiclsxXSArIDEpID4+IDE7CisgICAgICAgIGlmIChiYWxhbmNlID4gYnJbMF0pIHsKKyAgICAgICAgICAgIGJyWzFdID0gYnJbMF0gPDwgMTsKKyAgICAgICAgICAgIGJyWzBdID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICgtYmFsYW5jZSA+IGJyWzBdKSB7CisgICAgICAgICAgICBiclswXSA8PD0gMTsKKyAgICAgICAgICAgIGJyWzFdICAgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJbMV0gPSBiclswXSArIGJhbGFuY2U7CisgICAgICAgICAgICBiclswXSA9IGJyWzBdIC0gYmFsYW5jZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDw9IGN0eC0+c3RlcmVvX2luOyBpKyspIHsKKyAgICAgICAgaWYgKGN0eC0+aHlicmlkX2JpdHJhdGUpIHsKKyAgICAgICAgICAgIGlmIChzbFtpXSAtIGJyW2ldID4gLTB4MTAwKQorICAgICAgICAgICAgICAgIGN0eC0+Y2hbaV0uZXJyb3JfbGltaXQgPSB3cF9leHAyKHNsW2ldIC0gYnJbaV0gKyAweDEwMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3R4LT5jaFtpXS5lcnJvcl9saW1pdCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdHgtPmNoW2ldLmVycm9yX2xpbWl0ID0gd3BfZXhwMihicltpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgd3ZfZ2V0X3ZhbHVlKFdhdnBhY2tGcmFtZUNvbnRleHQgKmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbCwgaW50ICpsYXN0KQoreworICAgIGludCB0LCB0MjsKKyAgICBpbnQgc2lnbiwgYmFzZSwgYWRkLCByZXQ7CisgICAgV3ZDaGFubmVsICpjID0gJmN0eC0+Y2hbY2hhbm5lbF07CisKKyAgICAqbGFzdCA9IDA7CisKKyAgICBpZiAoKGN0eC0+Y2hbMF0ubWVkaWFuWzBdIDwgMlUpICYmIChjdHgtPmNoWzFdLm1lZGlhblswXSA8IDJVKSAmJgorICAgICAgICAhY3R4LT56ZXJvICYmICFjdHgtPm9uZSkgeworICAgICAgICBpZiAoY3R4LT56ZXJvZXMpIHsKKyAgICAgICAgICAgIGN0eC0+emVyb2VzLS07CisgICAgICAgICAgICBpZiAoY3R4LT56ZXJvZXMpIHsKKyAgICAgICAgICAgICAgICBjLT5zbG93X2xldmVsIC09IExFVkVMX0RFQ0FZKGMtPnNsb3dfbGV2ZWwpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdCA9IGdldF91bmFyeV8wXzMzKGdiKTsKKyAgICAgICAgICAgIGlmICh0ID49IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCB0IC0gMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB0ID0gZ2V0X2JpdHMoZ2IsIHQgLSAxKSB8ICgxIDw8ICh0IC0gMSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3R4LT56ZXJvZXMgPSB0OworICAgICAgICAgICAgaWYgKGN0eC0+emVyb2VzKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KGN0eC0+Y2hbMF0ubWVkaWFuLCAwLCBzaXplb2YoY3R4LT5jaFswXS5tZWRpYW4pKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoY3R4LT5jaFsxXS5tZWRpYW4sIDAsIHNpemVvZihjdHgtPmNoWzFdLm1lZGlhbikpOworICAgICAgICAgICAgICAgIGMtPnNsb3dfbGV2ZWwgLT0gTEVWRUxfREVDQVkoYy0+c2xvd19sZXZlbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3R4LT56ZXJvKSB7CisgICAgICAgIHQgICAgICAgICA9IDA7CisgICAgICAgIGN0eC0+emVybyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdCA9IGdldF91bmFyeV8wXzMzKGdiKTsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmICh0ID09IDE2KSB7CisgICAgICAgICAgICB0MiA9IGdldF91bmFyeV8wXzMzKGdiKTsKKyAgICAgICAgICAgIGlmICh0MiA8IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIHQgKz0gdDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IHQyIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB0ICs9IGdldF9iaXRzKGdiLCB0MiAtIDEpIHwgKDEgPDwgKHQyIC0gMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGN0eC0+b25lKSB7CisgICAgICAgICAgICBjdHgtPm9uZSA9IHQgJiAxOworICAgICAgICAgICAgdCAgICAgICAgPSAodCA+PiAxKSArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdHgtPm9uZSA9IHQgJiAxOworICAgICAgICAgICAgdCAgICAgID4+PSAxOworICAgICAgICB9CisgICAgICAgIGN0eC0+emVybyA9ICFjdHgtPm9uZTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5oeWJyaWQgJiYgIWNoYW5uZWwpCisgICAgICAgIHVwZGF0ZV9lcnJvcl9saW1pdChjdHgpOworCisgICAgaWYgKCF0KSB7CisgICAgICAgIGJhc2UgPSAwOworICAgICAgICBhZGQgID0gR0VUX01FRCgwKSAtIDE7CisgICAgICAgIERFQ19NRUQoMCk7CisgICAgfSBlbHNlIGlmICh0ID09IDEpIHsKKyAgICAgICAgYmFzZSA9IEdFVF9NRUQoMCk7CisgICAgICAgIGFkZCAgPSBHRVRfTUVEKDEpIC0gMTsKKyAgICAgICAgSU5DX01FRCgwKTsKKyAgICAgICAgREVDX01FRCgxKTsKKyAgICB9IGVsc2UgaWYgKHQgPT0gMikgeworICAgICAgICBiYXNlID0gR0VUX01FRCgwKSArIEdFVF9NRUQoMSk7CisgICAgICAgIGFkZCAgPSBHRVRfTUVEKDIpIC0gMTsKKyAgICAgICAgSU5DX01FRCgwKTsKKyAgICAgICAgSU5DX01FRCgxKTsKKyAgICAgICAgREVDX01FRCgyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBiYXNlID0gR0VUX01FRCgwKSArIEdFVF9NRUQoMSkgKyBHRVRfTUVEKDIpICogKHQgLSAyKTsKKyAgICAgICAgYWRkICA9IEdFVF9NRUQoMikgLSAxOworICAgICAgICBJTkNfTUVEKDApOworICAgICAgICBJTkNfTUVEKDEpOworICAgICAgICBJTkNfTUVEKDIpOworICAgIH0KKyAgICBpZiAoIWMtPmVycm9yX2xpbWl0KSB7CisgICAgICAgIGlmIChhZGQgPj0gMHgyMDAwMDAwVSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImsgJWQgaXMgdG9vIGxhcmdlXG4iLCBhZGQpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBiYXNlICsgZ2V0X3RhaWwoZ2IsIGFkZCk7CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8PSAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgbWlkID0gKGJhc2UgKiAyICsgYWRkICsgMSkgPj4gMTsKKyAgICAgICAgd2hpbGUgKGFkZCA+IGMtPmVycm9yX2xpbWl0KSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPD0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgICAgICBhZGQgLT0gKG1pZCAtIGJhc2UpOworICAgICAgICAgICAgICAgIGJhc2UgPSBtaWQ7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBhZGQgPSBtaWQgLSBiYXNlIC0gMTsKKyAgICAgICAgICAgIG1pZCA9IChiYXNlICogMiArIGFkZCArIDEpID4+IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gbWlkOworICAgIH0KKyAgICBzaWduID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBpZiAoY3R4LT5oeWJyaWRfYml0cmF0ZSkKKyAgICAgICAgYy0+c2xvd19sZXZlbCArPSB3cF9sb2cyKHJldCkgLSBMRVZFTF9ERUNBWShjLT5zbG93X2xldmVsKTsKKyAgICByZXR1cm4gc2lnbiA/IH5yZXQgOiByZXQ7CisKK2Vycm9yOgorICAgIHJldCA9IGdldF9iaXRzX2xlZnQoZ2IpOworICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIGZldyBiaXRzICglZCkgbGVmdFxuIiwgcmV0KTsKKyAgICB9CisgICAgKmxhc3QgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB3dl9nZXRfdmFsdWVfaW50ZWdlcihXYXZwYWNrRnJhbWVDb250ZXh0ICpzLCB1aW50MzJfdCAqY3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFMpCit7CisgICAgaW50IGJpdDsKKworICAgIGlmIChzLT5leHRyYV9iaXRzKSB7CisgICAgICAgIFMgPDw9IHMtPmV4dHJhX2JpdHM7CisKKyAgICAgICAgaWYgKHMtPmdvdF9leHRyYV9iaXRzICYmCisgICAgICAgICAgICBnZXRfYml0c19sZWZ0KCZzLT5nYl9leHRyYV9iaXRzKSA+PSBzLT5leHRyYV9iaXRzKSB7CisgICAgICAgICAgICBTICAgfD0gZ2V0X2JpdHMoJnMtPmdiX2V4dHJhX2JpdHMsIHMtPmV4dHJhX2JpdHMpOworICAgICAgICAgICAgKmNyYyA9ICpjcmMgKiA5ICsgKFMgJiAweGZmZmYpICogMyArICgodW5zaWduZWQpUyA+PiAxNik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiaXQgPSAoUyAmIHMtPmFuZCkgfCBzLT5vcjsKKyAgICBiaXQgPSAoKFMgKyBiaXQpIDw8IHMtPnNoaWZ0KSAtIGJpdDsKKworICAgIGlmIChzLT5oeWJyaWQpCisgICAgICAgIGJpdCA9IGF2X2NsaXAoYml0LCBzLT5oeWJyaWRfbWluY2xpcCwgcy0+aHlicmlkX21heGNsaXApOworCisgICAgcmV0dXJuIGJpdCA8PCBzLT5wb3N0X3NoaWZ0OworfQorCitzdGF0aWMgZmxvYXQgd3ZfZ2V0X3ZhbHVlX2Zsb2F0KFdhdnBhY2tGcmFtZUNvbnRleHQgKnMsIHVpbnQzMl90ICpjcmMsIGludCBTKQoreworICAgIHVuaW9uIHsKKyAgICAgICAgZmxvYXQgICAgZjsKKyAgICAgICAgdWludDMyX3QgdTsKKyAgICB9IHZhbHVlOworCisgICAgdW5zaWduZWQgaW50IHNpZ247CisgICAgaW50IGV4cCA9IHMtPmZsb2F0X21heF9leHA7CisKKyAgICBpZiAocy0+Z290X2V4dHJhX2JpdHMpIHsKKyAgICAgICAgY29uc3QgaW50IG1heF9iaXRzICA9IDEgKyAyMyArIDggKyAxOworICAgICAgICBjb25zdCBpbnQgbGVmdF9iaXRzID0gZ2V0X2JpdHNfbGVmdCgmcy0+Z2JfZXh0cmFfYml0cyk7CisKKyAgICAgICAgaWYgKGxlZnRfYml0cyArIDggKiBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFIDwgbWF4X2JpdHMpCisgICAgICAgICAgICByZXR1cm4gMC4wOworICAgIH0KKworICAgIGlmIChTKSB7CisgICAgICAgIFMgIDw8PSBzLT5mbG9hdF9zaGlmdDsKKyAgICAgICAgc2lnbiA9IFMgPCAwOworICAgICAgICBpZiAoc2lnbikKKyAgICAgICAgICAgIFMgPSAtUzsKKyAgICAgICAgaWYgKFMgPj0gMHgxMDAwMDAwKSB7CisgICAgICAgICAgICBpZiAocy0+Z290X2V4dHJhX2JpdHMgJiYgZ2V0X2JpdHMxKCZzLT5nYl9leHRyYV9iaXRzKSkKKyAgICAgICAgICAgICAgICBTID0gZ2V0X2JpdHMoJnMtPmdiX2V4dHJhX2JpdHMsIDIzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTID0gMDsKKyAgICAgICAgICAgIGV4cCA9IDI1NTsKKyAgICAgICAgfSBlbHNlIGlmIChleHApIHsKKyAgICAgICAgICAgIGludCBzaGlmdCA9IDIzIC0gYXZfbG9nMihTKTsKKyAgICAgICAgICAgIGV4cCA9IHMtPmZsb2F0X21heF9leHA7CisgICAgICAgICAgICBpZiAoZXhwIDw9IHNoaWZ0KQorICAgICAgICAgICAgICAgIHNoaWZ0ID0gLS1leHA7CisgICAgICAgICAgICBleHAgLT0gc2hpZnQ7CisKKyAgICAgICAgICAgIGlmIChzaGlmdCkgeworICAgICAgICAgICAgICAgIFMgPDw9IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgocy0+ZmxvYXRfZmxhZyAmIFdWX0ZMVF9TSElGVF9PTkVTKSB8fAorICAgICAgICAgICAgICAgICAgICAocy0+Z290X2V4dHJhX2JpdHMgJiYKKyAgICAgICAgICAgICAgICAgICAgIChzLT5mbG9hdF9mbGFnICYgV1ZfRkxUX1NISUZUX1NBTUUpICYmCisgICAgICAgICAgICAgICAgICAgICBnZXRfYml0czEoJnMtPmdiX2V4dHJhX2JpdHMpKSkgeworICAgICAgICAgICAgICAgICAgICBTIHw9ICgxIDw8IHNoaWZ0KSAtIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5nb3RfZXh0cmFfYml0cyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmZsb2F0X2ZsYWcgJiBXVl9GTFRfU0hJRlRfU0VOVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUyB8PSBnZXRfYml0cygmcy0+Z2JfZXh0cmFfYml0cywgc2hpZnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4cCA9IHMtPmZsb2F0X21heF9leHA7CisgICAgICAgIH0KKyAgICAgICAgUyAmPSAweDdmZmZmZjsKKyAgICB9IGVsc2UgeworICAgICAgICBzaWduID0gMDsKKyAgICAgICAgZXhwICA9IDA7CisgICAgICAgIGlmIChzLT5nb3RfZXh0cmFfYml0cyAmJiAocy0+ZmxvYXRfZmxhZyAmIFdWX0ZMVF9aRVJPX1NFTlQpKSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYl9leHRyYV9iaXRzKSkgeworICAgICAgICAgICAgICAgIFMgPSBnZXRfYml0cygmcy0+Z2JfZXh0cmFfYml0cywgMjMpOworICAgICAgICAgICAgICAgIGlmIChzLT5mbG9hdF9tYXhfZXhwID49IDI1KQorICAgICAgICAgICAgICAgICAgICBleHAgPSBnZXRfYml0cygmcy0+Z2JfZXh0cmFfYml0cywgOCk7CisgICAgICAgICAgICAgICAgc2lnbiA9IGdldF9iaXRzMSgmcy0+Z2JfZXh0cmFfYml0cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzLT5mbG9hdF9mbGFnICYgV1ZfRkxUX1pFUk9fU0lHTikKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9IGdldF9iaXRzMSgmcy0+Z2JfZXh0cmFfYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqY3JjID0gKmNyYyAqIDI3ICsgUyAqIDkgKyBleHAgKiAzICsgc2lnbjsKKworICAgIHZhbHVlLnUgPSAoc2lnbiA8PCAzMSkgfCAoZXhwIDw8IDIzKSB8IFM7CisgICAgcmV0dXJuIHZhbHVlLmY7Cit9CisKK3N0YXRpYyB2b2lkIHd2X3Jlc2V0X3NhdmVkX2NvbnRleHQoV2F2cGFja0ZyYW1lQ29udGV4dCAqcykKK3sKKyAgICBzLT5wb3MgICAgPSAwOworICAgIHMtPnNjLmNyYyA9IHMtPmV4dHJhX3NjLmNyYyA9IDB4RkZGRkZGRkY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHd2X2NoZWNrX2NyYyhXYXZwYWNrRnJhbWVDb250ZXh0ICpzLCB1aW50MzJfdCBjcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY3JjX2V4dHJhX2JpdHMpCit7CisgICAgaWYgKGNyYyAhPSBzLT5DUkMpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJDUkMgZXJyb3JcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKHMtPmdvdF9leHRyYV9iaXRzICYmIGNyY19leHRyYV9iaXRzICE9IHMtPmNyY19leHRyYV9iaXRzKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXh0cmEgYml0cyBDUkMgZXJyb3JcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgd3ZfdW5wYWNrX3N0ZXJlbyhXYXZwYWNrRnJhbWVDb250ZXh0ICpzLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZHN0X2wsIHZvaWQgKmRzdF9yLCBjb25zdCBpbnQgdHlwZSkKK3sKKyAgICBpbnQgaSwgaiwgY291bnQgPSAwOworICAgIGludCBsYXN0LCB0OworICAgIGludCBBLCBCLCBMLCBMMiwgUiwgUjI7CisgICAgaW50IHBvcyAgICAgICAgICAgICAgICAgPSBzLT5wb3M7CisgICAgdWludDMyX3QgY3JjICAgICAgICAgICAgPSBzLT5zYy5jcmM7CisgICAgdWludDMyX3QgY3JjX2V4dHJhX2JpdHMgPSBzLT5leHRyYV9zYy5jcmM7CisgICAgaW50MTZfdCAqZHN0MTZfbCAgICAgICAgPSBkc3RfbDsKKyAgICBpbnQxNl90ICpkc3QxNl9yICAgICAgICA9IGRzdF9yOworICAgIGludDMyX3QgKmRzdDMyX2wgICAgICAgID0gZHN0X2w7CisgICAgaW50MzJfdCAqZHN0MzJfciAgICAgICAgPSBkc3RfcjsKKyAgICBmbG9hdCAqZHN0ZmxfbCAgICAgICAgICA9IGRzdF9sOworICAgIGZsb2F0ICpkc3RmbF9yICAgICAgICAgID0gZHN0X3I7CisKKyAgICBzLT5vbmUgPSBzLT56ZXJvID0gcy0+emVyb2VzID0gMDsKKyAgICBkbyB7CisgICAgICAgIEwgPSB3dl9nZXRfdmFsdWUocywgZ2IsIDAsICZsYXN0KTsKKyAgICAgICAgaWYgKGxhc3QpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgUiA9IHd2X2dldF92YWx1ZShzLCBnYiwgMSwgJmxhc3QpOworICAgICAgICBpZiAobGFzdCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+dGVybXM7IGkrKykgeworICAgICAgICAgICAgdCA9IHMtPmRlY29ycltpXS52YWx1ZTsKKyAgICAgICAgICAgIGlmICh0ID4gMCkgeworICAgICAgICAgICAgICAgIGlmICh0ID4gOCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodCAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEEgPSAyICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgQiA9IDIgKiBzLT5kZWNvcnJbaV0uc2FtcGxlc0JbMF0gLSBzLT5kZWNvcnJbaV0uc2FtcGxlc0JbMV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBID0gKDMgKiBzLT5kZWNvcnJbaV0uc2FtcGxlc0FbMF0gLSBzLT5kZWNvcnJbaV0uc2FtcGxlc0FbMV0pID4+IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBCID0gKDMgKiBzLT5kZWNvcnJbaV0uc2FtcGxlc0JbMF0gLSBzLT5kZWNvcnJbaV0uc2FtcGxlc0JbMV0pID4+IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzFdID0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdOworICAgICAgICAgICAgICAgICAgICBzLT5kZWNvcnJbaV0uc2FtcGxlc0JbMV0gPSBzLT5kZWNvcnJbaV0uc2FtcGxlc0JbMF07CisgICAgICAgICAgICAgICAgICAgIGogICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQSA9IHMtPmRlY29ycltpXS5zYW1wbGVzQVtwb3NdOworICAgICAgICAgICAgICAgICAgICBCID0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNCW3Bvc107CisgICAgICAgICAgICAgICAgICAgIGogPSAocG9zICsgdCkgJiA3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBBVl9TQU1QTEVfRk1UX1MxNlApIHsKKyAgICAgICAgICAgICAgICAgICAgTDIgPSBMICsgKChzLT5kZWNvcnJbaV0ud2VpZ2h0QSAqIChpbnQ2NF90KUEgKyA1MTIpID4+IDEwKTsKKyAgICAgICAgICAgICAgICAgICAgUjIgPSBSICsgKChzLT5kZWNvcnJbaV0ud2VpZ2h0QiAqIChpbnQ2NF90KUIgKyA1MTIpID4+IDEwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMMiA9IEwgKyAoKHMtPmRlY29ycltpXS53ZWlnaHRBICogQSArIDUxMikgPj4gMTApOworICAgICAgICAgICAgICAgICAgICBSMiA9IFIgKyAoKHMtPmRlY29ycltpXS53ZWlnaHRCICogQiArIDUxMikgPj4gMTApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoQSAmJiBMKQorICAgICAgICAgICAgICAgICAgICBzLT5kZWNvcnJbaV0ud2VpZ2h0QSAtPSAoKCgoTCBeIEEpID4+IDMwKSAmIDIpIC0gMSkgKiBzLT5kZWNvcnJbaV0uZGVsdGE7CisgICAgICAgICAgICAgICAgaWYgKEIgJiYgUikKKyAgICAgICAgICAgICAgICAgICAgcy0+ZGVjb3JyW2ldLndlaWdodEIgLT0gKCgoKFIgXiBCKSA+PiAzMCkgJiAyKSAtIDEpICogcy0+ZGVjb3JyW2ldLmRlbHRhOworICAgICAgICAgICAgICAgIHMtPmRlY29ycltpXS5zYW1wbGVzQVtqXSA9IEwgPSBMMjsKKyAgICAgICAgICAgICAgICBzLT5kZWNvcnJbaV0uc2FtcGxlc0Jbal0gPSBSID0gUjI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBBVl9TQU1QTEVfRk1UX1MxNlApCisgICAgICAgICAgICAgICAgICAgIEwyID0gTCArICgocy0+ZGVjb3JyW2ldLndlaWdodEEgKiAoaW50NjRfdClzLT5kZWNvcnJbaV0uc2FtcGxlc0FbMF0gKyA1MTIpID4+IDEwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIEwyID0gTCArICgocy0+ZGVjb3JyW2ldLndlaWdodEEgKiBzLT5kZWNvcnJbaV0uc2FtcGxlc0FbMF0gKyA1MTIpID4+IDEwKTsKKyAgICAgICAgICAgICAgICBVUERBVEVfV0VJR0hUX0NMSVAocy0+ZGVjb3JyW2ldLndlaWdodEEsIHMtPmRlY29ycltpXS5kZWx0YSwgcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdLCBMKTsKKyAgICAgICAgICAgICAgICBMID0gTDI7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gQVZfU0FNUExFX0ZNVF9TMTZQKQorICAgICAgICAgICAgICAgICAgICBSMiA9IFIgKyAoKHMtPmRlY29ycltpXS53ZWlnaHRCICogKGludDY0X3QpTDIgKyA1MTIpID4+IDEwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFIyID0gUiArICgocy0+ZGVjb3JyW2ldLndlaWdodEIgKiBMMiArIDUxMikgPj4gMTApOworICAgICAgICAgICAgICAgIFVQREFURV9XRUlHSFRfQ0xJUChzLT5kZWNvcnJbaV0ud2VpZ2h0Qiwgcy0+ZGVjb3JyW2ldLmRlbHRhLCBMMiwgUik7CisgICAgICAgICAgICAgICAgUiAgICAgICAgICAgICAgICAgICAgICAgID0gUjI7CisgICAgICAgICAgICAgICAgcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdID0gUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gQVZfU0FNUExFX0ZNVF9TMTZQKQorICAgICAgICAgICAgICAgICAgICBSMiA9IFIgKyAoKHMtPmRlY29ycltpXS53ZWlnaHRCICogKGludDY0X3Qpcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzBdICsgNTEyKSA+PiAxMCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBSMiA9IFIgKyAoKHMtPmRlY29ycltpXS53ZWlnaHRCICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzBdICsgNTEyKSA+PiAxMCk7CisgICAgICAgICAgICAgICAgVVBEQVRFX1dFSUdIVF9DTElQKHMtPmRlY29ycltpXS53ZWlnaHRCLCBzLT5kZWNvcnJbaV0uZGVsdGEsIHMtPmRlY29ycltpXS5zYW1wbGVzQlswXSwgUik7CisgICAgICAgICAgICAgICAgUiA9IFIyOworCisgICAgICAgICAgICAgICAgaWYgKHQgPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgUjIgICAgICAgICAgICAgICAgICAgICAgID0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdOworICAgICAgICAgICAgICAgICAgICBzLT5kZWNvcnJbaV0uc2FtcGxlc0FbMF0gPSBSOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IEFWX1NBTVBMRV9GTVRfUzE2UCkKKyAgICAgICAgICAgICAgICAgICAgTDIgPSBMICsgKChzLT5kZWNvcnJbaV0ud2VpZ2h0QSAqIChpbnQ2NF90KVIyICsgNTEyKSA+PiAxMCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBMMiA9IEwgKyAoKHMtPmRlY29ycltpXS53ZWlnaHRBICogUjIgKyA1MTIpID4+IDEwKTsKKyAgICAgICAgICAgICAgICBVUERBVEVfV0VJR0hUX0NMSVAocy0+ZGVjb3JyW2ldLndlaWdodEEsIHMtPmRlY29ycltpXS5kZWx0YSwgUjIsIEwpOworICAgICAgICAgICAgICAgIEwgICAgICAgICAgICAgICAgICAgICAgICA9IEwyOworICAgICAgICAgICAgICAgIHMtPmRlY29ycltpXS5zYW1wbGVzQlswXSA9IEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gKHBvcyArIDEpICYgNzsKKyAgICAgICAgaWYgKHMtPmpvaW50KQorICAgICAgICAgICAgTCArPSAoUiAtPSAoTCA+PiAxKSk7CisgICAgICAgIGNyYyA9IChjcmMgKiAzICsgTCkgKiAzICsgUjsKKworICAgICAgICBpZiAodHlwZSA9PSBBVl9TQU1QTEVfRk1UX0ZMVFApIHsKKyAgICAgICAgICAgICpkc3RmbF9sKysgPSB3dl9nZXRfdmFsdWVfZmxvYXQocywgJmNyY19leHRyYV9iaXRzLCBMKTsKKyAgICAgICAgICAgICpkc3RmbF9yKysgPSB3dl9nZXRfdmFsdWVfZmxvYXQocywgJmNyY19leHRyYV9iaXRzLCBSKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEFWX1NBTVBMRV9GTVRfUzMyUCkgeworICAgICAgICAgICAgKmRzdDMyX2wrKyA9IHd2X2dldF92YWx1ZV9pbnRlZ2VyKHMsICZjcmNfZXh0cmFfYml0cywgTCk7CisgICAgICAgICAgICAqZHN0MzJfcisrID0gd3ZfZ2V0X3ZhbHVlX2ludGVnZXIocywgJmNyY19leHRyYV9iaXRzLCBSKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkc3QxNl9sKysgPSB3dl9nZXRfdmFsdWVfaW50ZWdlcihzLCAmY3JjX2V4dHJhX2JpdHMsIEwpOworICAgICAgICAgICAgKmRzdDE2X3IrKyA9IHd2X2dldF92YWx1ZV9pbnRlZ2VyKHMsICZjcmNfZXh0cmFfYml0cywgUik7CisgICAgICAgIH0KKyAgICAgICAgY291bnQrKzsKKyAgICB9IHdoaWxlICghbGFzdCAmJiBjb3VudCA8IHMtPnNhbXBsZXMpOworCisgICAgd3ZfcmVzZXRfc2F2ZWRfY29udGV4dChzKTsKKworICAgIGlmIChsYXN0ICYmIGNvdW50IDwgcy0+c2FtcGxlcykgeworICAgICAgICBpbnQgc2l6ZSA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKHR5cGUpOworICAgICAgICBtZW1zZXQoKHVpbnQ4X3QqKWRzdF9sICsgY291bnQqc2l6ZSwgMCwgKHMtPnNhbXBsZXMtY291bnQpKnNpemUpOworICAgICAgICBtZW1zZXQoKHVpbnQ4X3QqKWRzdF9yICsgY291bnQqc2l6ZSwgMCwgKHMtPnNhbXBsZXMtY291bnQpKnNpemUpOworICAgIH0KKworICAgIGlmICgocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0NSQ0NIRUNLKSAmJgorICAgICAgICB3dl9jaGVja19jcmMocywgY3JjLCBjcmNfZXh0cmFfYml0cykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHd2X3VucGFja19tb25vKFdhdnBhY2tGcmFtZUNvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZHN0LCBjb25zdCBpbnQgdHlwZSkKK3sKKyAgICBpbnQgaSwgaiwgY291bnQgPSAwOworICAgIGludCBsYXN0LCB0OworICAgIGludCBBLCBTLCBUOworICAgIGludCBwb3MgICAgICAgICAgICAgICAgICA9IHMtPnBvczsKKyAgICB1aW50MzJfdCBjcmMgICAgICAgICAgICAgPSBzLT5zYy5jcmM7CisgICAgdWludDMyX3QgY3JjX2V4dHJhX2JpdHMgID0gcy0+ZXh0cmFfc2MuY3JjOworICAgIGludDE2X3QgKmRzdDE2ICAgICAgICAgICA9IGRzdDsKKyAgICBpbnQzMl90ICpkc3QzMiAgICAgICAgICAgPSBkc3Q7CisgICAgZmxvYXQgKmRzdGZsICAgICAgICAgICAgID0gZHN0OworCisgICAgcy0+b25lID0gcy0+emVybyA9IHMtPnplcm9lcyA9IDA7CisgICAgZG8geworICAgICAgICBUID0gd3ZfZ2V0X3ZhbHVlKHMsIGdiLCAwLCAmbGFzdCk7CisgICAgICAgIFMgPSAwOworICAgICAgICBpZiAobGFzdCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+dGVybXM7IGkrKykgeworICAgICAgICAgICAgdCA9IHMtPmRlY29ycltpXS52YWx1ZTsKKyAgICAgICAgICAgIGlmICh0ID4gOCkgeworICAgICAgICAgICAgICAgIGlmICh0ICYgMSkKKyAgICAgICAgICAgICAgICAgICAgQSA9ICAyICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzFdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQSA9ICgzICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzFdKSA+PiAxOworICAgICAgICAgICAgICAgIHMtPmRlY29ycltpXS5zYW1wbGVzQVsxXSA9IHMtPmRlY29ycltpXS5zYW1wbGVzQVswXTsKKyAgICAgICAgICAgICAgICBqICAgICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBID0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBW3Bvc107CisgICAgICAgICAgICAgICAgaiA9IChwb3MgKyB0KSAmIDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZSAhPSBBVl9TQU1QTEVfRk1UX1MxNlApCisgICAgICAgICAgICAgICAgUyA9IFQgKyAoKHMtPmRlY29ycltpXS53ZWlnaHRBICogKGludDY0X3QpQSArIDUxMikgPj4gMTApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFMgPSBUICsgKChzLT5kZWNvcnJbaV0ud2VpZ2h0QSAqIEEgKyA1MTIpID4+IDEwKTsKKyAgICAgICAgICAgIGlmIChBICYmIFQpCisgICAgICAgICAgICAgICAgcy0+ZGVjb3JyW2ldLndlaWdodEEgLT0gKCgoKFQgXiBBKSA+PiAzMCkgJiAyKSAtIDEpICogcy0+ZGVjb3JyW2ldLmRlbHRhOworICAgICAgICAgICAgcy0+ZGVjb3JyW2ldLnNhbXBsZXNBW2pdID0gVCA9IFM7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gKHBvcyArIDEpICYgNzsKKyAgICAgICAgY3JjID0gY3JjICogMyArIFM7CisKKyAgICAgICAgaWYgKHR5cGUgPT0gQVZfU0FNUExFX0ZNVF9GTFRQKSB7CisgICAgICAgICAgICAqZHN0ZmwrKyA9IHd2X2dldF92YWx1ZV9mbG9hdChzLCAmY3JjX2V4dHJhX2JpdHMsIFMpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQVZfU0FNUExFX0ZNVF9TMzJQKSB7CisgICAgICAgICAgICAqZHN0MzIrKyA9IHd2X2dldF92YWx1ZV9pbnRlZ2VyKHMsICZjcmNfZXh0cmFfYml0cywgUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZHN0MTYrKyA9IHd2X2dldF92YWx1ZV9pbnRlZ2VyKHMsICZjcmNfZXh0cmFfYml0cywgUyk7CisgICAgICAgIH0KKyAgICAgICAgY291bnQrKzsKKyAgICB9IHdoaWxlICghbGFzdCAmJiBjb3VudCA8IHMtPnNhbXBsZXMpOworCisgICAgd3ZfcmVzZXRfc2F2ZWRfY29udGV4dChzKTsKKworICAgIGlmIChsYXN0ICYmIGNvdW50IDwgcy0+c2FtcGxlcykgeworICAgICAgICBpbnQgc2l6ZSA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKHR5cGUpOworICAgICAgICBtZW1zZXQoKHVpbnQ4X3QqKWRzdCArIGNvdW50KnNpemUsIDAsIChzLT5zYW1wbGVzLWNvdW50KSpzaXplKTsKKyAgICB9CisKKyAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0NSQ0NIRUNLKSB7CisgICAgICAgIGludCByZXQgPSB3dl9jaGVja19jcmMocywgY3JjLCBjcmNfZXh0cmFfYml0cyk7CisgICAgICAgIGlmIChyZXQgPCAwICYmIHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHd2X2FsbG9jX2ZyYW1lX2NvbnRleHQoV2F2cGFja0NvbnRleHQgKmMpCit7CisgICAgaWYgKGMtPmZkZWNfbnVtID09IFdWX01BWF9GUkFNRV9ERUNPREVSUykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYy0+ZmRlY1tjLT5mZGVjX251bV0gPSBhdl9tYWxsb2N6KHNpemVvZigqKmMtPmZkZWMpKTsKKyAgICBpZiAoIWMtPmZkZWNbYy0+ZmRlY19udW1dKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYy0+ZmRlY19udW0rKzsKKyAgICBjLT5mZGVjW2MtPmZkZWNfbnVtIC0gMV0tPmF2Y3R4ID0gYy0+YXZjdHg7CisgICAgd3ZfcmVzZXRfc2F2ZWRfY29udGV4dChjLT5mZGVjW2MtPmZkZWNfbnVtIC0gMV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgV2F2cGFja0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB3YXZwYWNrX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBXYXZwYWNrQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworCisgICAgcy0+ZmRlY19udW0gPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB3YXZwYWNrX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFdhdnBhY2tDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mZGVjX251bTsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmcy0+ZmRlY1tpXSk7CisgICAgcy0+ZmRlY19udW0gPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2F2cGFja19kZWNvZGVfYmxvY2soQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgYmxvY2tfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBXYXZwYWNrQ29udGV4dCAqd2MgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFRocmVhZEZyYW1lIHRmcmFtZSA9IHsgLmYgPSBmcmFtZSB9OworICAgIFdhdnBhY2tGcmFtZUNvbnRleHQgKnM7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgdm9pZCAqc2FtcGxlc19sID0gTlVMTCwgKnNhbXBsZXNfciA9IE5VTEw7CisgICAgaW50IHJldDsKKyAgICBpbnQgZ290X3Rlcm1zICAgPSAwLCBnb3Rfd2VpZ2h0cyA9IDAsIGdvdF9zYW1wbGVzID0gMCwKKyAgICAgICAgZ290X2VudHJvcHkgPSAwLCBnb3RfYnMgICAgICA9IDAsIGdvdF9mbG9hdCAgID0gMCwgZ290X2h5YnJpZCA9IDA7CisgICAgaW50IGksIGosIGlkLCBzaXplLCBzc2l6ZSwgd2VpZ2h0cywgdDsKKyAgICBpbnQgYnBwLCBjaGFuID0gMCwgY2htYXNrID0gMCwgb3JpZ19icHAsIHNhbXBsZV9yYXRlID0gMDsKKyAgICBpbnQgbXVsdGlibG9jazsKKworICAgIGlmIChibG9ja19ubyA+PSB3Yy0+ZmRlY19udW0gJiYgd3ZfYWxsb2NfZnJhbWVfY29udGV4dCh3YykgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgY3JlYXRpbmcgZnJhbWUgZGVjb2RlIGNvbnRleHRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzID0gd2MtPmZkZWNbYmxvY2tfbm9dOworICAgIGlmICghcykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvbnRleHQgZm9yIGJsb2NrICVkIGlzIG5vdCBwcmVzZW50XG4iLAorICAgICAgICAgICAgICAgYmxvY2tfbm8pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBtZW1zZXQocy0+ZGVjb3JyLCAwLCBNQVhfVEVSTVMgKiBzaXplb2YoRGVjb3JyKSk7CisgICAgbWVtc2V0KHMtPmNoLCAwLCBzaXplb2Yocy0+Y2gpKTsKKyAgICBzLT5leHRyYV9iaXRzICAgICA9IDA7CisgICAgcy0+YW5kICAgICAgICAgICAgPSBzLT5vciA9IHMtPnNoaWZ0ID0gMDsKKyAgICBzLT5nb3RfZXh0cmFfYml0cyA9IDA7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICBzLT5zYW1wbGVzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKKyAgICBpZiAocy0+c2FtcGxlcyAhPSB3Yy0+c2FtcGxlcykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc21hdGNoaW5nIG51bWJlciBvZiBzYW1wbGVzIGluICIKKyAgICAgICAgICAgICAgICJhIHNlcXVlbmNlOiAlZCBhbmQgJWRcbiIsIHdjLT5zYW1wbGVzLCBzLT5zYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHMtPmZyYW1lX2ZsYWdzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKKyAgICBicHAgICAgICAgICAgICA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGF2Y3R4LT5zYW1wbGVfZm10KTsKKyAgICBvcmlnX2JwcCAgICAgICA9ICgocy0+ZnJhbWVfZmxhZ3MgJiAweDAzKSArIDEpIDw8IDM7CisgICAgbXVsdGlibG9jayAgICAgPSAocy0+ZnJhbWVfZmxhZ3MgJiBXVl9TSU5HTEVfQkxPQ0spICE9IFdWX1NJTkdMRV9CTE9DSzsKKworICAgIHMtPnN0ZXJlbyAgICAgICAgID0gIShzLT5mcmFtZV9mbGFncyAmIFdWX01PTk8pOworICAgIHMtPnN0ZXJlb19pbiAgICAgID0gIChzLT5mcmFtZV9mbGFncyAmIFdWX0ZBTFNFX1NURVJFTykgPyAwIDogcy0+c3RlcmVvOworICAgIHMtPmpvaW50ICAgICAgICAgID0gICBzLT5mcmFtZV9mbGFncyAmIFdWX0pPSU5UX1NURVJFTzsKKyAgICBzLT5oeWJyaWQgICAgICAgICA9ICAgcy0+ZnJhbWVfZmxhZ3MgJiBXVl9IWUJSSURfTU9ERTsKKyAgICBzLT5oeWJyaWRfYml0cmF0ZSA9ICAgcy0+ZnJhbWVfZmxhZ3MgJiBXVl9IWUJSSURfQklUUkFURTsKKyAgICBzLT5wb3N0X3NoaWZ0ICAgICA9IGJwcCAqIDggLSBvcmlnX2JwcCArICgocy0+ZnJhbWVfZmxhZ3MgPj4gMTMpICYgMHgxZik7CisgICAgcy0+aHlicmlkX21heGNsaXAgPSAgKCgxTEwgPDwgKG9yaWdfYnBwIC0gMSkpIC0gMSk7CisgICAgcy0+aHlicmlkX21pbmNsaXAgPSAoKC0xTEwgPDwgKG9yaWdfYnBwIC0gMSkpKTsKKyAgICBzLT5DUkMgICAgICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisKKyAgICAvLyBwYXJzZSBtZXRhZGF0YSBibG9ja3MKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSkgeworICAgICAgICBpZCAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgIGlmIChpZCAmIFdQX0lERl9MT05HKSB7CisgICAgICAgICAgICBzaXplIHw9IChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpKSA8PCA4OworICAgICAgICAgICAgc2l6ZSB8PSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSkgPDwgMTY7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSA8PD0gMTsgLy8gc2l6ZSBpcyBzcGVjaWZpZWQgaW4gd29yZHMKKyAgICAgICAgc3NpemUgID0gc2l6ZTsKKyAgICAgICAgaWYgKGlkICYgV1BfSURGX09ERCkKKyAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiR290IGluY29ycmVjdCBibG9jayAlMDJYIHdpdGggc2l6ZSAlaVxuIiwgaWQsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCBzc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkJsb2NrIHNpemUgJWkgaXMgb3V0IG9mIGJvdW5kc1xuIiwgc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGlkICYgV1BfSURGX01BU0spIHsKKyAgICAgICAgY2FzZSBXUF9JRF9ERUNURVJNUzoKKyAgICAgICAgICAgIGlmIChzaXplID4gTUFYX1RFUk1TKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBkZWNvcnJlbGF0aW9uIHRlcm1zXG4iKTsKKyAgICAgICAgICAgICAgICBzLT50ZXJtcyA9IDA7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIHNzaXplKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnRlcm1zID0gc2l6ZTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT50ZXJtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCB2YWwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICAgICAgICAgIHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS52YWx1ZSA9ICh2YWwgJiAweDFGKSAtIDU7CisgICAgICAgICAgICAgICAgcy0+ZGVjb3JyW3MtPnRlcm1zIC0gaSAtIDFdLmRlbHRhID0gIHZhbCA+PiA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290X3Rlcm1zID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdQX0lEX0RFQ1dFSUdIVFM6CisgICAgICAgICAgICBpZiAoIWdvdF90ZXJtcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gZGVjb3JyZWxhdGlvbiB0ZXJtcyBtZXRcbiIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2VpZ2h0cyA9IHNpemUgPj4gcy0+c3RlcmVvX2luOworICAgICAgICAgICAgaWYgKHdlaWdodHMgPiBNQVhfVEVSTVMgfHwgd2VpZ2h0cyA+IHMtPnRlcm1zKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBkZWNvcnJlbGF0aW9uIHdlaWdodHNcbiIpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCBzc2l6ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2VpZ2h0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgdCA9IChpbnQ4X3QpYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgICAgICBzLT5kZWNvcnJbcy0+dGVybXMgLSBpIC0gMV0ud2VpZ2h0QSA9IHQgPDwgMzsKKyAgICAgICAgICAgICAgICBpZiAocy0+ZGVjb3JyW3MtPnRlcm1zIC0gaSAtIDFdLndlaWdodEEgPiAwKQorICAgICAgICAgICAgICAgICAgICBzLT5kZWNvcnJbcy0+dGVybXMgLSBpIC0gMV0ud2VpZ2h0QSArPQorICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS53ZWlnaHRBICsgNjQpID4+IDc7CisgICAgICAgICAgICAgICAgaWYgKHMtPnN0ZXJlb19pbikgeworICAgICAgICAgICAgICAgICAgICB0ID0gKGludDhfdClieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICAgICAgICAgICAgICBzLT5kZWNvcnJbcy0+dGVybXMgLSBpIC0gMV0ud2VpZ2h0QiA9IHQgPDwgMzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS53ZWlnaHRCID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS53ZWlnaHRCICs9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS53ZWlnaHRCICsgNjQpID4+IDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290X3dlaWdodHMgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV1BfSURfREVDU0FNUExFUzoKKyAgICAgICAgICAgIGlmICghZ290X3Rlcm1zKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyBkZWNvcnJlbGF0aW9uIHRlcm1zIG1ldFxuIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IHMtPnRlcm1zIC0gMTsgKGkgPj0gMCkgJiYgKHQgPCBzaXplKTsgaS0tKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmRlY29ycltpXS52YWx1ZSA+IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdwX2V4cDIoYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKSk7CisgICAgICAgICAgICAgICAgICAgIHMtPmRlY29ycltpXS5zYW1wbGVzQVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB3cF9leHAyKGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnYikpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5zdGVyZW9faW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlY29ycltpXS5zYW1wbGVzQlswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BfZXhwMihieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlY29ycltpXS5zYW1wbGVzQlsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BfZXhwMihieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgICAgICAgICAgICAgICAgICAgICAgICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdCArPSA0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+ZGVjb3JyW2ldLnZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBzLT5kZWNvcnJbaV0uc2FtcGxlc0FbMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgd3BfZXhwMihieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdwX2V4cDIoYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKSk7CisgICAgICAgICAgICAgICAgICAgIHQgICAgICAgICAgICAgICAgICAgICAgICs9IDQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPmRlY29ycltpXS52YWx1ZTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kZWNvcnJbaV0uc2FtcGxlc0Fbal0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwX2V4cDIoYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+c3RlcmVvX2luKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVjb3JyW2ldLnNhbXBsZXNCW2pdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BfZXhwMihieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0ICs9IHMtPmRlY29ycltpXS52YWx1ZSAqIDIgKiAocy0+c3RlcmVvX2luICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290X3NhbXBsZXMgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV1BfSURfRU5UUk9QWToKKyAgICAgICAgICAgIGlmIChzaXplICE9IDYgKiAocy0+c3RlcmVvX2luICsgMSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkVudHJvcHkgdmFycyBzaXplIHNob3VsZCBiZSAlaSwgZ290ICVpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgNiAqIChzLT5zdGVyZW9faW4gKyAxKSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIHNzaXplKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gcy0+c3RlcmVvX2luOyBqKyspCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzLT5jaFtqXS5tZWRpYW5baV0gPSB3cF9leHAyKGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnYikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdF9lbnRyb3B5ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdQX0lEX0hZQlJJRDoKKyAgICAgICAgICAgIGlmIChzLT5oeWJyaWRfYml0cmF0ZSkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gcy0+c3RlcmVvX2luOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+Y2hbaV0uc2xvd19sZXZlbCA9IHdwX2V4cDIoYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKSk7CisgICAgICAgICAgICAgICAgICAgIHNpemUgICAgICAgICAgICAgICAtPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocy0+c3RlcmVvX2luICsgMSk7IGkrKykgeworICAgICAgICAgICAgICAgIHMtPmNoW2ldLmJpdHJhdGVfYWNjID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmdiKSA8PCAxNjsKKyAgICAgICAgICAgICAgICBzaXplICAgICAgICAgICAgICAgIC09IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHMtPnN0ZXJlb19pbiArIDEpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+Y2hbaV0uYml0cmF0ZV9kZWx0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICB3cF9leHAyKChpbnQxNl90KWJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnYikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChzLT5zdGVyZW9faW4gKyAxKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzLT5jaFtpXS5iaXRyYXRlX2RlbHRhID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdF9oeWJyaWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV1BfSURfSU5UMzJJTkZPOiB7CisgICAgICAgICAgICB1aW50OF90IHZhbFs0XTsKKyAgICAgICAgICAgIGlmIChzaXplICE9IDQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSU5UMzJJTkZPLCBzaXplID0gJWlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCBzc2l6ZSAtIDQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmZ2IsIHZhbCwgNCk7CisgICAgICAgICAgICBpZiAodmFsWzBdKSB7CisgICAgICAgICAgICAgICAgcy0+ZXh0cmFfYml0cyA9IHZhbFswXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsWzFdKSB7CisgICAgICAgICAgICAgICAgcy0+c2hpZnQgPSB2YWxbMV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbFsyXSkgeworICAgICAgICAgICAgICAgIHMtPmFuZCAgID0gcy0+b3IgPSAxOworICAgICAgICAgICAgICAgIHMtPnNoaWZ0ID0gdmFsWzJdOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWxbM10pIHsKKyAgICAgICAgICAgICAgICBzLT5hbmQgICA9IDE7CisgICAgICAgICAgICAgICAgcy0+c2hpZnQgPSB2YWxbM107CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBvcmlnaW5hbCBXYXZQYWNrIGRlY29kZXIgZm9yY2VzIDMyLWJpdCBsb3NzeSBzb3VuZCB0byBiZSB0cmVhdGVkCisgICAgICAgICAgICAgKiBhcyAyNC1iaXQgb25lIGluIG9yZGVyIHRvIGhhdmUgcHJvcGVyIGNsaXBwaW5nICovCisgICAgICAgICAgICBpZiAocy0+aHlicmlkICYmIGJwcCA9PSA0ICYmIHMtPnBvc3Rfc2hpZnQgPCA4ICYmIHMtPnNoaWZ0ID4gOCkgeworICAgICAgICAgICAgICAgIHMtPnBvc3Rfc2hpZnQgICAgICArPSA4OworICAgICAgICAgICAgICAgIHMtPnNoaWZ0ICAgICAgICAgICAtPSA4OworICAgICAgICAgICAgICAgIHMtPmh5YnJpZF9tYXhjbGlwID4+PSA4OworICAgICAgICAgICAgICAgIHMtPmh5YnJpZF9taW5jbGlwID4+PSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXUF9JRF9GTE9BVElORk86CisgICAgICAgICAgICBpZiAoc2l6ZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEZMT0FUSU5GTywgc2l6ZSA9ICVpXG4iLCBzaXplKTsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgc3NpemUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+ZmxvYXRfZmxhZyAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgICAgICBzLT5mbG9hdF9zaGlmdCAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgIHMtPmZsb2F0X21heF9leHAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICAgICAgZ290X2Zsb2F0ICAgICAgICA9IDE7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXUF9JRF9EQVRBOgorICAgICAgICAgICAgcy0+c2Mub2Zmc2V0ID0gYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpOworICAgICAgICAgICAgcy0+c2Muc2l6ZSAgID0gc2l6ZSAqIDg7CisgICAgICAgICAgICBpZiAoKHJldCA9IGluaXRfZ2V0X2JpdHM4KCZzLT5nYiwgZ2IuYnVmZmVyLCBzaXplKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBzLT5kYXRhX3NpemUgPSBzaXplICogODsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCBzaXplKTsKKyAgICAgICAgICAgIGdvdF9icyAgICAgICA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXUF9JRF9FWFRSQUJJVFM6CisgICAgICAgICAgICBpZiAoc2l6ZSA8PSA0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIEVYVFJBQklUUywgc2l6ZSA9ICVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5leHRyYV9zYy5vZmZzZXQgPSBieXRlc3RyZWFtMl90ZWxsKCZnYik7CisgICAgICAgICAgICBzLT5leHRyYV9zYy5zaXplICAgPSBzaXplICogODsKKyAgICAgICAgICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJnMtPmdiX2V4dHJhX2JpdHMsIGdiLmJ1ZmZlciwgc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcy0+Y3JjX2V4dHJhX2JpdHMgID0gZ2V0X2JpdHNfbG9uZygmcy0+Z2JfZXh0cmFfYml0cywgMzIpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIHNpemUpOworICAgICAgICAgICAgcy0+Z290X2V4dHJhX2JpdHMgID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdQX0lEX0NIQU5JTkZPOgorICAgICAgICAgICAgaWYgKHNpemUgPD0gMSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSW5zdWZmaWNpZW50IGNoYW5uZWwgaW5mb3JtYXRpb25cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhbiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgICAgICBzd2l0Y2ggKHNpemUgLSAyKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgY2htYXNrID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjaG1hc2sgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZ2IpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGNobWFzayA9IGJ5dGVzdHJlYW0yX2dldF9sZTI0KCZnYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgY2htYXNrID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBzaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxzICE9IHNpemUpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICIlaSBjaGFubmVscyBzaWduYWxsZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluc3RlYWQgb2YgJWkuXG4iLCBzaXplLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgIGNoYW4gIHw9IChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpICYgMHhGKSA8PCA4OworICAgICAgICAgICAgICAgIGNobWFzayA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZnYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaGFubmVsIGluZm8gc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgICAgICAgICAgICAgY2hhbiAgID0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICAgICAgICAgIGNobWFzayA9IGF2Y3R4LT5jaGFubmVsX2xheW91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdQX0lEX1NBTVBMRV9SQVRFOgorICAgICAgICAgICAgaWYgKHNpemUgIT0gMykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjdXN0b20gc2FtcGxlIHJhdGUuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNhbXBsZV9yYXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMjQoJmdiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGlmIChpZCAmIFdQX0lERl9PREQpCisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgMSk7CisgICAgfQorCisgICAgaWYgKCFnb3RfdGVybXMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyBibG9jayB3aXRoIGRlY29ycmVsYXRpb24gdGVybXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKCFnb3Rfd2VpZ2h0cykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGJsb2NrIHdpdGggZGVjb3JyZWxhdGlvbiB3ZWlnaHRzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICghZ290X3NhbXBsZXMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyBibG9jayB3aXRoIGRlY29ycmVsYXRpb24gc2FtcGxlc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoIWdvdF9lbnRyb3B5KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gYmxvY2sgd2l0aCBlbnRyb3B5IGluZm9cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKHMtPmh5YnJpZCAmJiAhZ290X2h5YnJpZCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkh5YnJpZCBjb25maWcgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICghZ290X2JzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2VkIHNhbXBsZXMgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICghZ290X2Zsb2F0ICYmIGF2Y3R4LT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUUCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZsb2F0IGluZm9ybWF0aW9uIG5vdCBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAocy0+Z290X2V4dHJhX2JpdHMgJiYgYXZjdHgtPnNhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9GTFRQKSB7CisgICAgICAgIGNvbnN0IGludCBzaXplICAgPSBnZXRfYml0c19sZWZ0KCZzLT5nYl9leHRyYV9iaXRzKTsKKyAgICAgICAgY29uc3QgaW50IHdhbnRlZCA9IHMtPnNhbXBsZXMgKiBzLT5leHRyYV9iaXRzIDw8IHMtPnN0ZXJlb19pbjsKKyAgICAgICAgaWYgKHNpemUgPCB3YW50ZWQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNtYWxsIEVYVFJBQklUU1xuIik7CisgICAgICAgICAgICBzLT5nb3RfZXh0cmFfYml0cyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXdjLT5jaF9vZmZzZXQpIHsKKyAgICAgICAgaW50IHNyID0gKHMtPmZyYW1lX2ZsYWdzID4+IDIzKSAmIDB4ZjsKKyAgICAgICAgaWYgKHNyID09IDB4ZikgeworICAgICAgICAgICAgaWYgKCFzYW1wbGVfcmF0ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ3VzdG9tIHNhbXBsZSByYXRlIG1pc3NpbmcuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IHd2X3JhdGVzW3NyXTsKKworICAgICAgICBpZiAobXVsdGlibG9jaykgeworICAgICAgICAgICAgaWYgKGNoYW4pCisgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzID0gY2hhbjsKKyAgICAgICAgICAgIGlmIChjaG1hc2spCisgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gY2htYXNrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gcy0+c3RlcmVvID8gMiA6IDE7CisgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBzLT5zdGVyZW8gPyBBVl9DSF9MQVlPVVRfU1RFUkVPIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICB9CisKKyAgICAgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBzLT5zYW1wbGVzICsgMTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJnRmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gcy0+c2FtcGxlczsKKyAgICB9CisKKyAgICBpZiAod2MtPmNoX29mZnNldCArIHMtPnN0ZXJlbyA+PSBhdmN0eC0+Y2hhbm5lbHMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlRvbyBtYW55IGNoYW5uZWxzIGNvZGVkIGluIGEgcGFja2V0LlxuIik7CisgICAgICAgIHJldHVybiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpID8gQVZFUlJPUl9JTlZBTElEREFUQSA6IDA7CisgICAgfQorCisgICAgc2FtcGxlc19sID0gZnJhbWUtPmV4dGVuZGVkX2RhdGFbd2MtPmNoX29mZnNldF07CisgICAgaWYgKHMtPnN0ZXJlbykKKyAgICAgICAgc2FtcGxlc19yID0gZnJhbWUtPmV4dGVuZGVkX2RhdGFbd2MtPmNoX29mZnNldCArIDFdOworCisgICAgd2MtPmNoX29mZnNldCArPSAxICsgcy0+c3RlcmVvOworCisgICAgaWYgKHMtPnN0ZXJlb19pbikgeworICAgICAgICByZXQgPSB3dl91bnBhY2tfc3RlcmVvKHMsICZzLT5nYiwgc2FtcGxlc19sLCBzYW1wbGVzX3IsIGF2Y3R4LT5zYW1wbGVfZm10KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IHd2X3VucGFja19tb25vKHMsICZzLT5nYiwgc2FtcGxlc19sLCBhdmN0eC0+c2FtcGxlX2ZtdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAocy0+c3RlcmVvKQorICAgICAgICAgICAgbWVtY3B5KHNhbXBsZXNfciwgc2FtcGxlc19sLCBicHAgKiBzLT5zYW1wbGVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2F2cGFja19kZWNvZGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFdhdnBhY2tDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mZGVjX251bTsgaSsrKQorICAgICAgICB3dl9yZXNldF9zYXZlZF9jb250ZXh0KHMtPmZkZWNbaV0pOworfQorCitzdGF0aWMgaW50IHdhdnBhY2tfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgV2F2cGFja0NvbnRleHQgKnMgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgPSBkYXRhOworICAgIGludCBmcmFtZV9zaXplLCByZXQsIGZyYW1lX2ZsYWdzOworCisgICAgaWYgKGF2cGt0LT5zaXplIDw9IFdWX0hFQURFUl9TSVpFKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHMtPmJsb2NrICAgICA9IDA7CisgICAgcy0+Y2hfb2Zmc2V0ID0gMDsKKworICAgIC8qIGRldGVybWluZSBudW1iZXIgb2Ygc2FtcGxlcyAqLworICAgIHMtPnNhbXBsZXMgID0gQVZfUkwzMihidWYgKyAyMCk7CisgICAgZnJhbWVfZmxhZ3MgPSBBVl9STDMyKGJ1ZiArIDI0KTsKKyAgICBpZiAocy0+c2FtcGxlcyA8PSAwIHx8IHMtPnNhbXBsZXMgPiBXVl9NQVhfU0FNUExFUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbnVtYmVyIG9mIHNhbXBsZXM6ICVkXG4iLAorICAgICAgICAgICAgICAgcy0+c2FtcGxlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChmcmFtZV9mbGFncyAmIDB4ODApIHsKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX0ZMVFA7CisgICAgfSBlbHNlIGlmICgoZnJhbWVfZmxhZ3MgJiAweDAzKSA8PSAxKSB7CisgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTZQOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ICAgICAgICAgID0gQVZfU0FNUExFX0ZNVF9TMzJQOworICAgICAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9ICgoZnJhbWVfZmxhZ3MgJiAweDAzKSArIDEpIDw8IDM7CisgICAgfQorCisgICAgd2hpbGUgKGJ1Zl9zaXplID4gMCkgeworICAgICAgICBpZiAoYnVmX3NpemUgPD0gV1ZfSEVBREVSX1NJWkUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZnJhbWVfc2l6ZSA9IEFWX1JMMzIoYnVmICsgNCkgLSAxMjsKKyAgICAgICAgYnVmICAgICAgICs9IDIwOworICAgICAgICBidWZfc2l6ZSAgLT0gMjA7CisgICAgICAgIGlmIChmcmFtZV9zaXplIDw9IDAgfHwgZnJhbWVfc2l6ZSA+IGJ1Zl9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQmxvY2sgJWQgaGFzIGludmFsaWQgc2l6ZSAoc2l6ZSAlZCB2cy4gJWQgYnl0ZXMgbGVmdClcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+YmxvY2ssIGZyYW1lX3NpemUsIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIHdhdnBhY2tfZGVjb2RlX2ZsdXNoKGF2Y3R4KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmICgocmV0ID0gd2F2cGFja19kZWNvZGVfYmxvY2soYXZjdHgsIHMtPmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLCBidWYsIGZyYW1lX3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgIHdhdnBhY2tfZGVjb2RlX2ZsdXNoKGF2Y3R4KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcy0+YmxvY2srKzsKKyAgICAgICAgYnVmICAgICAgKz0gZnJhbWVfc2l6ZTsKKyAgICAgICAgYnVmX3NpemUgLT0gZnJhbWVfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAocy0+Y2hfb2Zmc2V0ICE9IGF2Y3R4LT5jaGFubmVscykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCBlbm91Z2ggY2hhbm5lbHMgY29kZWQgaW4gYSBwYWNrZXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX3dhdnBhY2tfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid2F2cGFjayIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldhdlBhY2siKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV0FWUEFDSywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoV2F2cGFja0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHdhdnBhY2tfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gd2F2cGFja19kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHdhdnBhY2tfZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IHdhdnBhY2tfZGVjb2RlX2ZsdXNoLAorICAgIC5pbml0X3RocmVhZF9jb3B5ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoaW5pdF90aHJlYWRfY29weSksCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSB8IENPREVDX0NBUF9GUkFNRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dhdnBhY2suaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3dhdnBhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2I0OWExCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvd2F2cGFjay5oCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogV2F2UGFjayBkZWNvZGVyL2VuY29kZXIgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAwNiwyMDExIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1dBVlBBQ0tfSAorI2RlZmluZSBBVkNPREVDX1dBVlBBQ0tfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisjZGVmaW5lIE1BWF9URVJNUyAgICAgIDE2CisjZGVmaW5lIE1BWF9URVJNICAgICAgICA4CisKKyNkZWZpbmUgV1ZfSEVBREVSX1NJWkUgICAgMzIKKworI2RlZmluZSBXVl9NT05PICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFdWX0pPSU5UX1NURVJFTyAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgV1ZfQ1JPU1NfREVDT1JSICAgMHgwMDAwMDAyMAorI2RlZmluZSBXVl9GTE9BVF9EQVRBICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFdWX0lOVDMyX0RBVEEgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgV1ZfRkFMU0VfU1RFUkVPICAgMHg0MDAwMDAwMAorCisjZGVmaW5lIFdWX0hZQlJJRF9NT0RFICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgV1ZfSFlCUklEX1NIQVBFICAgMHgwMDAwMDAwOAorI2RlZmluZSBXVl9IWUJSSURfQklUUkFURSAweDAwMDAwMjAwCisjZGVmaW5lIFdWX0hZQlJJRF9CQUxBTkNFIDB4MDAwMDA0MDAKKyNkZWZpbmUgV1ZfSU5JVElBTF9CTE9DSyAgMHgwMDAwMDgwMAorI2RlZmluZSBXVl9GSU5BTF9CTE9DSyAgICAweDAwMDAxMDAwCisKKyNkZWZpbmUgV1ZfTU9OT19EQVRBICAgIChXVl9NT05PIHwgV1ZfRkFMU0VfU1RFUkVPKQorCisjZGVmaW5lIFdWX1NJTkdMRV9CTE9DSyAoV1ZfSU5JVElBTF9CTE9DSyB8IFdWX0ZJTkFMX0JMT0NLKQorCisjZGVmaW5lIFdWX0ZMVF9TSElGVF9PTkVTIDB4MDEKKyNkZWZpbmUgV1ZfRkxUX1NISUZUX1NBTUUgMHgwMgorI2RlZmluZSBXVl9GTFRfU0hJRlRfU0VOVCAweDA0CisjZGVmaW5lIFdWX0ZMVF9aRVJPX1NFTlQgIDB4MDgKKyNkZWZpbmUgV1ZfRkxUX1pFUk9fU0lHTiAgMHgxMAorCisjZGVmaW5lIFdWX01BWF9TQU1QTEVTICAgIDE1MDAwMAorCitlbnVtIFdQX0lEX0ZsYWdzIHsKKyAgICBXUF9JREZfTUFTSyAgID0gMHgzRiwKKyAgICBXUF9JREZfSUdOT1JFID0gMHgyMCwKKyAgICBXUF9JREZfT0REICAgID0gMHg0MCwKKyAgICBXUF9JREZfTE9ORyAgID0gMHg4MAorfTsKKworZW51bSBXUF9JRCB7CisgICAgV1BfSURfRFVNTVkgPSAwLAorICAgIFdQX0lEX0VOQ0lORk8sCisgICAgV1BfSURfREVDVEVSTVMsCisgICAgV1BfSURfREVDV0VJR0hUUywKKyAgICBXUF9JRF9ERUNTQU1QTEVTLAorICAgIFdQX0lEX0VOVFJPUFksCisgICAgV1BfSURfSFlCUklELAorICAgIFdQX0lEX1NIQVBJTkcsCisgICAgV1BfSURfRkxPQVRJTkZPLAorICAgIFdQX0lEX0lOVDMySU5GTywKKyAgICBXUF9JRF9EQVRBLAorICAgIFdQX0lEX0NPUlIsCisgICAgV1BfSURfRVhUUkFCSVRTLAorICAgIFdQX0lEX0NIQU5JTkZPLAorICAgIFdQX0lEX1NBTVBMRV9SQVRFID0gMHgyNywKK307CisKK3R5cGVkZWYgc3RydWN0IERlY29yciB7CisgICAgaW50IGRlbHRhOworICAgIGludCB2YWx1ZTsKKyAgICBpbnQgd2VpZ2h0QTsKKyAgICBpbnQgd2VpZ2h0QjsKKyAgICBpbnQgc2FtcGxlc0FbTUFYX1RFUk1dOworICAgIGludCBzYW1wbGVzQltNQVhfVEVSTV07CisgICAgaW50IHN1bUE7CisgICAgaW50IHN1bUI7Cit9IERlY29ycjsKKwordHlwZWRlZiBzdHJ1Y3QgV3ZDaGFubmVsIHsKKyAgICBpbnQgbWVkaWFuWzNdOworICAgIGludCBzbG93X2xldmVsLCBlcnJvcl9saW1pdDsKKyAgICBpbnQgYml0cmF0ZV9hY2MsIGJpdHJhdGVfZGVsdGE7Cit9IFd2Q2hhbm5lbDsKKworLy8gbWFjcm9zIGZvciBtYW5pcHVsYXRpbmcgbWVkaWFuIHZhbHVlcworI2RlZmluZSBHRVRfTUVEKG4pICgoYy0+bWVkaWFuW25dID4+IDQpICsgMSkKKyNkZWZpbmUgREVDX01FRChuKSBjLT5tZWRpYW5bbl0gLT0gKChjLT5tZWRpYW5bbl0gKyAoMTI4ID4+IChuKSkgLSAyKSAvICgxMjggPj4gKG4pKSkgKiAyCisjZGVmaW5lIElOQ19NRUQobikgYy0+bWVkaWFuW25dICs9ICgoYy0+bWVkaWFuW25dICsgKDEyOCA+PiAobikpICAgICkgLyAoMTI4ID4+IChuKSkpICogNQorCisvLyBtYWNyb3MgZm9yIGFwcGx5aW5nIHdlaWdodAorI2RlZmluZSBVUERBVEVfV0VJR0hUX0NMSVAod2VpZ2h0LCBkZWx0YSwgc2FtcGxlcywgaW4pIFwKKyAgICBpZiAoc2FtcGxlcyAmJiBpbikgeyBcCisgICAgICAgIGlmICgoc2FtcGxlcyBeIGluKSA8IDApIHsgXAorICAgICAgICAgICAgd2VpZ2h0IC09IGRlbHRhOyBcCisgICAgICAgICAgICBpZiAod2VpZ2h0IDwgLTEwMjQpIFwKKyAgICAgICAgICAgICAgICB3ZWlnaHQgPSAtMTAyNDsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICB3ZWlnaHQgKz0gZGVsdGE7IFwKKyAgICAgICAgICAgIGlmICh3ZWlnaHQgPiAxMDI0KSBcCisgICAgICAgICAgICAgICAgd2VpZ2h0ID0gMTAyNDsgXAorICAgICAgICB9IFwKKyAgICB9CisKK3N0YXRpYyBjb25zdCBpbnQgd3ZfcmF0ZXNbMTZdID0geworICAgICA2MDAwLCAgODAwMCwgIDk2MDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsICAyMjA1MCwgMjQwMDAsCisgICAgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgNjQwMDAsIDg4MjAwLCA5NjAwMCwgMTkyMDAwLCAgICAgMAorfTsKKworLy8gZXhwb25lbnQgdGFibGUgY29waWVkIGZyb20gV2F2UGFjayBzb3VyY2UKK3N0YXRpYyBjb25zdCB1aW50OF90IHdwX2V4cDJfdGFibGVbMjU2XSA9IHsKKyAgICAweDAwLCAweDAxLCAweDAxLCAweDAyLCAweDAzLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA2LCAweDA3LCAweDA4LCAweDA4LCAweDA5LCAweDBhLCAweDBiLAorICAgIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTYsCisgICAgMHgxNywgMHgxOCwgMHgxOSwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywKKyAgICAweDI0LCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAweDMwLAorICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsCisgICAgMHgzZSwgMHgzZiwgMHg0MCwgMHg0MSwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwKKyAgICAweDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLCAweDUxLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLAorICAgIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWUsIDB4NWYsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksCisgICAgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwKKyAgICAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg3LCAweDg4LCAweDg5LCAweDhhLAorICAgIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsCisgICAgMHg5YywgMHg5ZCwgMHg5ZiwgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwKKyAgICAweGFmLCAweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAweGMwLAorICAgIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2QsIDB4Y2UsIDB4Y2YsIDB4ZDAsIDB4ZDIsIDB4ZDMsIDB4ZDQsCisgICAgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhlMCwgMHhlMSwgMHhlMiwgMHhlNCwgMHhlNSwgMHhlNiwgMHhlOCwgMHhlOSwKKyAgICAweGVhLCAweGVjLCAweGVkLCAweGVlLCAweGYwLCAweGYxLCAweGYyLCAweGY0LCAweGY1LCAweGY2LCAweGY4LCAweGY5LCAweGZhLCAweGZjLCAweGZkLCAweGZmCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB3cF9sb2cyX3RhYmxlIFtdID0geworICAgIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDQsIDB4MDYsIDB4MDcsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGQsIDB4MGUsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTQsIDB4MTUsCisgICAgMHgxNiwgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYywgMHgxZCwgMHgxZSwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyNCwgMHgyNSwgMHgyNiwgMHgyOCwgMHgyOSwgMHgyYSwKKyAgICAweDJjLCAweDJkLCAweDJlLCAweDJmLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNiLCAweDNjLCAweDNkLCAweDNlLAorICAgIDB4M2YsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIDB4NTEsCisgICAgMHg1MiwgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywKKyAgICAweDY0LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLCAweDcxLCAweDcyLCAweDc0LCAweDc1LAorICAgIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsCisgICAgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwKKyAgICAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweDliLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LAorICAgIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsIDB4YjEsIDB4YjIsIDB4YjIsCisgICAgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMCwKKyAgICAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNiLCAweGNjLCAweGNkLCAweGNlLAorICAgIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsCisgICAgMHhkYywgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlNywKKyAgICAweGU4LCAweGU5LCAweGVhLCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVlLCAweGVmLCAweGYwLCAweGYxLCAweGYxLCAweGYyLCAweGYzLCAweGY0LAorICAgIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIDB4ZmYKK307CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB3cF9leHAyKGludDE2X3QgdmFsKQoreworICAgIGludCByZXMsIG5lZyA9IDA7CisKKyAgICBpZiAodmFsIDwgMCkgeworICAgICAgICB2YWwgPSAtdmFsOworICAgICAgICBuZWcgPSAxOworICAgIH0KKworICAgIHJlcyAgID0gd3BfZXhwMl90YWJsZVt2YWwgJiAweEZGXSB8IDB4MTAwOworICAgIHZhbCA+Pj0gODsKKyAgICByZXMgICA9ICh2YWwgPiA5KSA/IChyZXMgPDwgKHZhbCAtIDkpKSA6IChyZXMgPj4gKDkgLSB2YWwpKTsKKyAgICByZXR1cm4gbmVnID8gLXJlcyA6IHJlczsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHdwX2xvZzIoaW50MzJfdCB2YWwpCit7CisgICAgaW50IGJpdHM7CisKKyAgICBpZiAoIXZhbCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHZhbCA9PSAxKQorICAgICAgICByZXR1cm4gMjU2OworICAgIHZhbCArPSB2YWwgPj4gOTsKKyAgICBiaXRzID0gYXZfbG9nMih2YWwpICsgMTsKKyAgICBpZiAoYml0cyA8IDkpCisgICAgICAgIHJldHVybiAoYml0cyA8PCA4KSArIHdwX2xvZzJfdGFibGVbKHZhbCA8PCAoOSAtIGJpdHMpKSAmIDB4RkZdOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIChiaXRzIDw8IDgpICsgd3BfbG9nMl90YWJsZVsodmFsID4+IChiaXRzIC0gOSkpICYgMHhGRl07Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX1dBVlBBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvd2F2cGFja2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvd2F2cGFja2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTcxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy93YXZwYWNrZW5jLmMKQEAgLTAsMCArMSwyOTk1IEBACisvKgorICogV2F2UGFjayBsb3NzbGVzcyBhdWRpbyBlbmNvZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgQklUU1RSRUFNX1dSSVRFUl9MRQorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJ3YXZwYWNrZW5jLmgiCisjaW5jbHVkZSAid2F2cGFjay5oIgorCisjZGVmaW5lIFVQREFURV9XRUlHSFQod2VpZ2h0LCBkZWx0YSwgc291cmNlLCByZXN1bHQpIFwKKyAgICBpZiAoKHNvdXJjZSkgJiYgKHJlc3VsdCkpIHsgXAorICAgICAgICBpbnQzMl90IHMgPSAoaW50MzJfdCkgKChzb3VyY2UpIF4gKHJlc3VsdCkpID4+IDMxOyBcCisgICAgICAgIHdlaWdodCA9ICgoZGVsdGEpIF4gcykgKyAoKHdlaWdodCkgLSBzKTsgXAorICAgIH0KKworI2RlZmluZSBBUFBMWV9XRUlHSFRfRih3ZWlnaHQsIHNhbXBsZSkgKCgoKCgoc2FtcGxlKSAmIDB4ZmZmZikgKiAod2VpZ2h0KSkgPj4gOSkgKyBcCisgICAgKCgoKHNhbXBsZSkgJiB+MHhmZmZmKSA+PiA5KSAqICh3ZWlnaHQpKSArIDEpID4+IDEpCisKKyNkZWZpbmUgQVBQTFlfV0VJR0hUX0kod2VpZ2h0LCBzYW1wbGUpICgoKHdlaWdodCkgKiAoc2FtcGxlKSArIDUxMikgPj4gMTApCisKKyNkZWZpbmUgQVBQTFlfV0VJR0hUKHdlaWdodCwgc2FtcGxlKSAoKHNhbXBsZSkgIT0gKHNob3J0KSAoc2FtcGxlKSA/IFwKKyAgICBBUFBMWV9XRUlHSFRfRih3ZWlnaHQsIHNhbXBsZSkgOiBBUFBMWV9XRUlHSFRfSSAod2VpZ2h0LCBzYW1wbGUpKQorCisjZGVmaW5lIENMRUFSKGRlc3RpbikgbWVtc2V0KCZkZXN0aW4sIDAsIHNpemVvZihkZXN0aW4pKTsKKworI2RlZmluZSBTSElGVF9MU0IgICAgICAgMTMKKyNkZWZpbmUgU0hJRlRfTUFTSyAgICAgICgweDFGVSA8PCBTSElGVF9MU0IpCisKKyNkZWZpbmUgTUFHX0xTQiAgICAgICAgIDE4CisjZGVmaW5lIE1BR19NQVNLICAgICAgICAoMHgxRlUgPDwgTUFHX0xTQikKKworI2RlZmluZSBTUkFURV9MU0IgICAgICAgMjMKKyNkZWZpbmUgU1JBVEVfTUFTSyAgICAgICgweEZVIDw8IFNSQVRFX0xTQikKKworI2RlZmluZSBFWFRSQV9UUllfREVMVEFTICAgICAxCisjZGVmaW5lIEVYVFJBX0FESlVTVF9ERUxUQVMgIDIKKyNkZWZpbmUgRVhUUkFfU09SVF9GSVJTVCAgICAgNAorI2RlZmluZSBFWFRSQV9CUkFOQ0hFUyAgICAgICA4CisjZGVmaW5lIEVYVFJBX1NPUlRfTEFTVCAgICAgMTYKKwordHlwZWRlZiBzdHJ1Y3QgV2F2UGFja0V4dHJhSW5mbyB7CisgICAgc3RydWN0IERlY29yciBkcHNbTUFYX1RFUk1TXTsKKyAgICBpbnQgbnRlcm1zLCBsb2dfbGltaXQsIGd0MTZiaXQ7CisgICAgdWludDMyX3QgYmVzdF9iaXRzOworfSBXYXZQYWNrRXh0cmFJbmZvOworCit0eXBlZGVmIHN0cnVjdCBXYXZQYWNrV29yZHMgeworICAgIGludCBwZW5kX2RhdGEsIGhvbGRpbmdfb25lLCB6ZXJvc19hY2M7CisgICAgaW50IGhvbGRpbmdfemVybywgcGVuZF9jb3VudDsKKyAgICBXdkNoYW5uZWwgY1syXTsKK30gV2F2UGFja1dvcmRzOworCit0eXBlZGVmIHN0cnVjdCBXYXZQYWNrRW5jb2RlQ29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIFB1dEJpdENvbnRleHQgcGI7CisgICAgaW50IGJsb2NrX3NhbXBsZXM7CisgICAgaW50IGJ1ZmZlcl9zaXplOworICAgIGludCBzYW1wbGVfaW5kZXg7CisgICAgaW50IHN0ZXJlbywgc3RlcmVvX2luOworICAgIGludCBjaF9vZmZzZXQ7CisKKyAgICBpbnQzMl90ICpzYW1wbGVzWzJdOworICAgIGludCBzYW1wbGVzX3NpemVbMl07CisKKyAgICBpbnQzMl90ICpzYW1wbGVwdHJzW01BWF9URVJNUysyXVsyXTsKKyAgICBpbnQgc2FtcGxlcHRyc19zaXplW01BWF9URVJNUysyXVsyXTsKKworICAgIGludDMyX3QgKnRlbXBfYnVmZmVyWzJdWzJdOworICAgIGludCB0ZW1wX2J1ZmZlcl9zaXplWzJdWzJdOworCisgICAgaW50MzJfdCAqYmVzdF9idWZmZXJbMl07CisgICAgaW50IGJlc3RfYnVmZmVyX3NpemVbMl07CisKKyAgICBpbnQzMl90ICpqc19sZWZ0LCAqanNfcmlnaHQ7CisgICAgaW50IGpzX2xlZnRfc2l6ZSwganNfcmlnaHRfc2l6ZTsKKworICAgIGludDMyX3QgKm9yaWdfbCwgKm9yaWdfcjsKKyAgICBpbnQgb3JpZ19sX3NpemUsIG9yaWdfcl9zaXplOworCisgICAgdW5zaWduZWQgZXh0cmFfZmxhZ3M7CisgICAgaW50IG9wdGltaXplX21vbm87CisgICAgaW50IGRlY29ycl9maWx0ZXI7CisgICAgaW50IGpvaW50OworICAgIGludCBudW1fYnJhbmNoZXM7CisKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICB1aW50MzJfdCBjcmNfeDsKKyAgICBXYXZQYWNrV29yZHMgdzsKKworICAgIHVpbnQ4X3QgaW50MzJfc2VudF9iaXRzLCBpbnQzMl96ZXJvcywgaW50MzJfb25lcywgaW50MzJfZHVwczsKKyAgICB1aW50OF90IGZsb2F0X2ZsYWdzLCBmbG9hdF9zaGlmdCwgZmxvYXRfbWF4X2V4cCwgbWF4X2V4cDsKKyAgICBpbnQzMl90IHNoaWZ0ZWRfb25lcywgc2hpZnRlZF96ZXJvcywgc2hpZnRlZF9ib3RoOworICAgIGludDMyX3QgZmFsc2VfemVyb3MsIG5lZ196ZXJvcywgb3JkYXRhOworCisgICAgaW50IG51bV90ZXJtcywgc2hpZnQsIGpvaW50X3N0ZXJlbywgZmFsc2Vfc3RlcmVvOworICAgIGludCBudW1fZGVjb3JycywgbnVtX3Bhc3NlcywgYmVzdF9kZWNvcnIsIG1hc2tfZGVjb3JyOworICAgIHN0cnVjdCBEZWNvcnIgZGVjb3JyX3Bhc3Nlc1tNQVhfVEVSTVNdOworICAgIGNvbnN0IFdhdlBhY2tEZWNvcnJTcGVjICpkZWNvcnJfc3BlY3M7CisgICAgZmxvYXQgZGVsdGFfZGVjYXk7Cit9IFdhdlBhY2tFbmNvZGVDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgd2F2cGFja19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgV2F2UGFja0VuY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIGlmICghYXZjdHgtPmZyYW1lX3NpemUpIHsKKyAgICAgICAgaW50IGJsb2NrX3NhbXBsZXM7CisgICAgICAgIGlmICghKGF2Y3R4LT5zYW1wbGVfcmF0ZSAmIDEpKQorICAgICAgICAgICAgYmxvY2tfc2FtcGxlcyA9IGF2Y3R4LT5zYW1wbGVfcmF0ZSAvIDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJsb2NrX3NhbXBsZXMgPSBhdmN0eC0+c2FtcGxlX3JhdGU7CisKKyAgICAgICAgd2hpbGUgKGJsb2NrX3NhbXBsZXMgKiBhdmN0eC0+Y2hhbm5lbHMgPiBXVl9NQVhfU0FNUExFUykKKyAgICAgICAgICAgIGJsb2NrX3NhbXBsZXMgLz0gMjsKKworICAgICAgICB3aGlsZSAoYmxvY2tfc2FtcGxlcyAqIGF2Y3R4LT5jaGFubmVscyA8IDQwMDAwKQorICAgICAgICAgICAgYmxvY2tfc2FtcGxlcyAqPSAyOworICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IGJsb2NrX3NhbXBsZXM7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+ZnJhbWVfc2l6ZSAmJiAoYXZjdHgtPmZyYW1lX3NpemUgPCAxMjggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplID4gV1ZfTUFYX1NBTVBMRVMpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBibG9jayBzaXplOiAlZFxuIiwgYXZjdHgtPmZyYW1lX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgIT0gRkZfQ09NUFJFU1NJT05fREVGQVVMVCkgeworICAgICAgICBpZiAoYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsID49IDMpIHsKKyAgICAgICAgICAgIHMtPmRlY29ycl9maWx0ZXIgPSAzOworICAgICAgICAgICAgcy0+bnVtX3Bhc3NlcyA9IDk7CisgICAgICAgICAgICBpZiAgICAgIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPj0gOCkgeworICAgICAgICAgICAgICAgIHMtPm51bV9icmFuY2hlcyA9IDQ7CisgICAgICAgICAgICAgICAgcy0+ZXh0cmFfZmxhZ3MgPSBFWFRSQV9UUllfREVMVEFTfEVYVFJBX0FESlVTVF9ERUxUQVN8RVhUUkFfU09SVF9GSVJTVHxFWFRSQV9TT1JUX0xBU1R8RVhUUkFfQlJBTkNIRVM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbCA+PSA3KSB7CisgICAgICAgICAgICAgICAgcy0+bnVtX2JyYW5jaGVzID0gMzsKKyAgICAgICAgICAgICAgICBzLT5leHRyYV9mbGFncyA9IEVYVFJBX1RSWV9ERUxUQVN8RVhUUkFfQURKVVNUX0RFTFRBU3xFWFRSQV9TT1JUX0ZJUlNUfEVYVFJBX0JSQU5DSEVTOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPj0gNikgeworICAgICAgICAgICAgICAgIHMtPm51bV9icmFuY2hlcyA9IDI7CisgICAgICAgICAgICAgICAgcy0+ZXh0cmFfZmxhZ3MgPSBFWFRSQV9UUllfREVMVEFTfEVYVFJBX0FESlVTVF9ERUxUQVN8RVhUUkFfU09SVF9GSVJTVHxFWFRSQV9CUkFOQ0hFUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsID49IDUpIHsKKyAgICAgICAgICAgICAgICBzLT5udW1fYnJhbmNoZXMgPSAxOworICAgICAgICAgICAgICAgIHMtPmV4dHJhX2ZsYWdzID0gRVhUUkFfVFJZX0RFTFRBU3xFWFRSQV9BREpVU1RfREVMVEFTfEVYVFJBX1NPUlRfRklSU1R8RVhUUkFfQlJBTkNIRVM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbCA+PSA0KSB7CisgICAgICAgICAgICAgICAgcy0+bnVtX2JyYW5jaGVzID0gMTsKKyAgICAgICAgICAgICAgICBzLT5leHRyYV9mbGFncyA9IEVYVFJBX1RSWV9ERUxUQVN8RVhUUkFfQURKVVNUX0RFTFRBU3xFWFRSQV9CUkFOQ0hFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPT0gMikgeworICAgICAgICAgICAgcy0+ZGVjb3JyX2ZpbHRlciA9IDI7CisgICAgICAgICAgICBzLT5udW1fcGFzc2VzID0gNDsKKyAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPT0gMSkgeworICAgICAgICAgICAgcy0+ZGVjb3JyX2ZpbHRlciA9IDE7CisgICAgICAgICAgICBzLT5udW1fcGFzc2VzID0gMjsKKyAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPCAxKSB7CisgICAgICAgICAgICBzLT5kZWNvcnJfZmlsdGVyID0gMDsKKyAgICAgICAgICAgIHMtPm51bV9wYXNzZXMgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+bnVtX2RlY29ycnMgPSBkZWNvcnJfZmlsdGVyX3NpemVzW3MtPmRlY29ycl9maWx0ZXJdOworICAgIHMtPmRlY29ycl9zcGVjcyA9IGRlY29ycl9maWx0ZXJzW3MtPmRlY29ycl9maWx0ZXJdOworCisgICAgcy0+ZGVsdGFfZGVjYXkgPSAyLjA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hpZnRfbW9ubyhpbnQzMl90ICpzYW1wbGVzLCBpbnQgbmJfc2FtcGxlcywgaW50IHNoaWZ0KQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspCisgICAgICAgIHNhbXBsZXNbaV0gPj49IHNoaWZ0OworfQorCitzdGF0aWMgdm9pZCBzaGlmdF9zdGVyZW8oaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCBzaGlmdCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGxlZnQgW2ldID4+PSBzaGlmdDsKKyAgICAgICAgcmlnaHRbaV0gPj49IHNoaWZ0OworICAgIH0KK30KKworI2RlZmluZSBGTE9BVF9TSElGVF9PTkVTIDEKKyNkZWZpbmUgRkxPQVRfU0hJRlRfU0FNRSAyCisjZGVmaW5lIEZMT0FUX1NISUZUX1NFTlQgNAorI2RlZmluZSBGTE9BVF9aRVJPU19TRU5UIDgKKyNkZWZpbmUgRkxPQVRfTkVHX1pFUk9TICAweDEwCisjZGVmaW5lIEZMT0FUX0VYQ0VQVElPTlMgMHgyMAorCisjZGVmaW5lIGdldF9tYW50aXNzYShmKSAgICAgKChmKSAmIDB4N2ZmZmZmKQorI2RlZmluZSBnZXRfZXhwb25lbnQoZikgICAgICgoKGYpID4+IDIzKSAmIDB4ZmYpCisjZGVmaW5lIGdldF9zaWduKGYpICAgICAgICAgKCgoZikgPj4gMzEpICYgMHgxKQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2Zsb2F0KFdhdlBhY2tFbmNvZGVDb250ZXh0ICpzLCBpbnQzMl90ICpzYW1wbGUpCit7CisgICAgaW50MzJfdCBzaGlmdF9jb3VudCwgdmFsdWUsIGYgPSAqc2FtcGxlOworCisgICAgaWYgKGdldF9leHBvbmVudChmKSA9PSAyNTUpIHsKKyAgICAgICAgcy0+ZmxvYXRfZmxhZ3MgfD0gRkxPQVRfRVhDRVBUSU9OUzsKKyAgICAgICAgdmFsdWUgPSAweDEwMDAwMDA7CisgICAgICAgIHNoaWZ0X2NvdW50ID0gMDsKKyAgICB9IGVsc2UgaWYgKGdldF9leHBvbmVudChmKSkgeworICAgICAgICBzaGlmdF9jb3VudCA9IHMtPm1heF9leHAgLSBnZXRfZXhwb25lbnQoZik7CisgICAgICAgIHZhbHVlID0gMHg4MDAwMDAgKyBnZXRfbWFudGlzc2EoZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2hpZnRfY291bnQgPSBzLT5tYXhfZXhwID8gcy0+bWF4X2V4cCAtIDEgOiAwOworICAgICAgICB2YWx1ZSA9IGdldF9tYW50aXNzYShmKTsKKyAgICB9CisKKyAgICBpZiAoc2hpZnRfY291bnQgPCAyNSkKKyAgICAgICAgdmFsdWUgPj49IHNoaWZ0X2NvdW50OworICAgIGVsc2UKKyAgICAgICAgdmFsdWUgPSAwOworCisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICBpZiAoZ2V0X2V4cG9uZW50KGYpIHx8IGdldF9tYW50aXNzYShmKSkKKyAgICAgICAgICAgIHMtPmZhbHNlX3plcm9zKys7CisgICAgICAgIGVsc2UgaWYgKGdldF9zaWduKGYpKQorICAgICAgICAgICAgcy0+bmVnX3plcm9zKys7CisgICAgfSBlbHNlIGlmIChzaGlmdF9jb3VudCkgeworICAgICAgICBpbnQzMl90IG1hc2sgPSAoMSA8PCBzaGlmdF9jb3VudCkgLSAxOworCisgICAgICAgIGlmICghKGdldF9tYW50aXNzYShmKSAmIG1hc2spKQorICAgICAgICAgICAgcy0+c2hpZnRlZF96ZXJvcysrOworICAgICAgICBlbHNlIGlmICgoZ2V0X21hbnRpc3NhKGYpICYgbWFzaykgPT0gbWFzaykKKyAgICAgICAgICAgIHMtPnNoaWZ0ZWRfb25lcysrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5zaGlmdGVkX2JvdGgrKzsKKyAgICB9CisKKyAgICBzLT5vcmRhdGEgfD0gdmFsdWU7CisgICAgKnNhbXBsZSA9IGdldF9zaWduKGYpID8gLXZhbHVlIDogdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgc2Nhbl9mbG9hdChXYXZQYWNrRW5jb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpzYW1wbGVzX2wsIGludDMyX3QgKnNhbXBsZXNfciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICB1aW50MzJfdCBjcmMgPSAweGZmZmZmZmZmdTsKKyAgICBpbnQgaTsKKworICAgIHMtPnNoaWZ0ZWRfb25lcyA9IHMtPnNoaWZ0ZWRfemVyb3MgPSBzLT5zaGlmdGVkX2JvdGggPSBzLT5vcmRhdGEgPSAwOworICAgIHMtPmZsb2F0X3NoaWZ0ID0gcy0+ZmxvYXRfZmxhZ3MgPSAwOworICAgIHMtPmZhbHNlX3plcm9zID0gcy0+bmVnX3plcm9zID0gMDsKKyAgICBzLT5tYXhfZXhwID0gMDsKKworICAgIGlmIChzLT5mbGFncyAmIFdWX01PTk9fREFUQSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IGYgPSBzYW1wbGVzX2xbaV07CisgICAgICAgICAgICBjcmMgPSBjcmMgKiAyNyArIGdldF9tYW50aXNzYShmKSAqIDkgKyBnZXRfZXhwb25lbnQoZikgKiAzICsgZ2V0X3NpZ24oZik7CisKKyAgICAgICAgICAgIGlmIChnZXRfZXhwb25lbnQoZikgPiBzLT5tYXhfZXhwICYmIGdldF9leHBvbmVudChmKSA8IDI1NSkKKyAgICAgICAgICAgICAgICBzLT5tYXhfZXhwID0gZ2V0X2V4cG9uZW50KGYpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBmOworCisgICAgICAgICAgICBmID0gc2FtcGxlc19sW2ldOworICAgICAgICAgICAgY3JjID0gY3JjICogMjcgKyBnZXRfbWFudGlzc2EoZikgKiA5ICsgZ2V0X2V4cG9uZW50KGYpICogMyArIGdldF9zaWduKGYpOworICAgICAgICAgICAgaWYgKGdldF9leHBvbmVudChmKSA+IHMtPm1heF9leHAgJiYgZ2V0X2V4cG9uZW50KGYpIDwgMjU1KQorICAgICAgICAgICAgICAgIHMtPm1heF9leHAgPSBnZXRfZXhwb25lbnQoZik7CisKKyAgICAgICAgICAgIGYgPSBzYW1wbGVzX3JbaV07CisgICAgICAgICAgICBjcmMgPSBjcmMgKiAyNyArIGdldF9tYW50aXNzYShmKSAqIDkgKyBnZXRfZXhwb25lbnQoZikgKiAzICsgZ2V0X3NpZ24oZik7CisKKyAgICAgICAgICAgIGlmIChnZXRfZXhwb25lbnQoZikgPiBzLT5tYXhfZXhwICYmIGdldF9leHBvbmVudChmKSA8IDI1NSkKKyAgICAgICAgICAgICAgICBzLT5tYXhfZXhwID0gZ2V0X2V4cG9uZW50KGYpOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+Y3JjX3ggPSBjcmM7CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBXVl9NT05PX0RBVEEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykKKyAgICAgICAgICAgIHByb2Nlc3NfZmxvYXQocywgJnNhbXBsZXNfbFtpXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgcHJvY2Vzc19mbG9hdChzLCAmc2FtcGxlc19sW2ldKTsKKyAgICAgICAgICAgIHByb2Nlc3NfZmxvYXQocywgJnNhbXBsZXNfcltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5mbG9hdF9tYXhfZXhwID0gcy0+bWF4X2V4cDsKKworICAgIGlmIChzLT5zaGlmdGVkX2JvdGgpCisgICAgICAgIHMtPmZsb2F0X2ZsYWdzIHw9IEZMT0FUX1NISUZUX1NFTlQ7CisgICAgZWxzZSBpZiAocy0+c2hpZnRlZF9vbmVzICYmICFzLT5zaGlmdGVkX3plcm9zKQorICAgICAgICBzLT5mbG9hdF9mbGFncyB8PSBGTE9BVF9TSElGVF9PTkVTOworICAgIGVsc2UgaWYgKHMtPnNoaWZ0ZWRfb25lcyAmJiBzLT5zaGlmdGVkX3plcm9zKQorICAgICAgICBzLT5mbG9hdF9mbGFncyB8PSBGTE9BVF9TSElGVF9TQU1FOworICAgIGVsc2UgaWYgKHMtPm9yZGF0YSAmJiAhKHMtPm9yZGF0YSAmIDEpKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHMtPmZsb2F0X3NoaWZ0Kys7CisgICAgICAgICAgICBzLT5vcmRhdGEgPj49IDE7CisgICAgICAgIH0gd2hpbGUgKCEocy0+b3JkYXRhICYgMSkpOworCisgICAgICAgIGlmIChzLT5mbGFncyAmIFdWX01PTk9fREFUQSkKKyAgICAgICAgICAgIHNoaWZ0X21vbm8oc2FtcGxlc19sLCBuYl9zYW1wbGVzLCBzLT5mbG9hdF9zaGlmdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNoaWZ0X3N0ZXJlbyhzYW1wbGVzX2wsIHNhbXBsZXNfciwgbmJfc2FtcGxlcywgcy0+ZmxvYXRfc2hpZnQpOworICAgIH0KKworICAgIHMtPmZsYWdzICY9IH5NQUdfTUFTSzsKKworICAgIHdoaWxlIChzLT5vcmRhdGEpIHsKKyAgICAgICAgcy0+ZmxhZ3MgKz0gMSA8PCBNQUdfTFNCOworICAgICAgICBzLT5vcmRhdGEgPj49IDE7CisgICAgfQorCisgICAgaWYgKHMtPmZhbHNlX3plcm9zIHx8IHMtPm5lZ196ZXJvcykKKyAgICAgICAgcy0+ZmxvYXRfZmxhZ3MgfD0gRkxPQVRfWkVST1NfU0VOVDsKKworICAgIGlmIChzLT5uZWdfemVyb3MpCisgICAgICAgIHMtPmZsb2F0X2ZsYWdzIHw9IEZMT0FUX05FR19aRVJPUzsKKworICAgIHJldHVybiBzLT5mbG9hdF9mbGFncyAmIChGTE9BVF9FWENFUFRJT05TIHwgRkxPQVRfWkVST1NfU0VOVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUX1NISUZUX1NFTlQgfCBGTE9BVF9TSElGVF9TQU1FKTsKK30KKworc3RhdGljIHZvaWQgc2Nhbl9pbnQyMyhXYXZQYWNrRW5jb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc2FtcGxlc19sLCBpbnQzMl90ICpzYW1wbGVzX3IsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzKQoreworICAgIHVpbnQzMl90IG1hZ2RhdGEgPSAwLCBvcmRhdGEgPSAwLCB4b3JkYXRhID0gMCwgYW5kZGF0YSA9IH4wOworICAgIGludCBpLCB0b3RhbF9zaGlmdCA9IDA7CisKKyAgICBzLT5pbnQzMl9zZW50X2JpdHMgPSBzLT5pbnQzMl96ZXJvcyA9IHMtPmludDMyX29uZXMgPSBzLT5pbnQzMl9kdXBzID0gMDsKKworICAgIGlmIChzLT5mbGFncyAmIFdWX01PTk9fREFUQSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IE0gPSBzYW1wbGVzX2xbaV07CisKKyAgICAgICAgICAgIG1hZ2RhdGEgfD0gKE0gPCAwKSA/IH5NIDogTTsKKyAgICAgICAgICAgIHhvcmRhdGEgfD0gTSBeIC0oTSAmIDEpOworICAgICAgICAgICAgYW5kZGF0YSAmPSBNOworICAgICAgICAgICAgb3JkYXRhICB8PSBNOworCisgICAgICAgICAgICBpZiAoKG9yZGF0YSAmIDEpICYmICEoYW5kZGF0YSAmIDEpICYmICh4b3JkYXRhICYgMikpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBMID0gc2FtcGxlc19sW2ldOworICAgICAgICAgICAgaW50MzJfdCBSID0gc2FtcGxlc19yW2ldOworCisgICAgICAgICAgICBtYWdkYXRhIHw9IChMIDwgMCkgPyB+TCA6IEw7CisgICAgICAgICAgICBtYWdkYXRhIHw9IChSIDwgMCkgPyB+UiA6IFI7CisgICAgICAgICAgICB4b3JkYXRhIHw9IEwgXiAtKEwgJiAxKTsKKyAgICAgICAgICAgIHhvcmRhdGEgfD0gUiBeIC0oUiAmIDEpOworICAgICAgICAgICAgYW5kZGF0YSAmPSBMICYgUjsKKyAgICAgICAgICAgIG9yZGF0YSAgfD0gTCB8IFI7CisKKyAgICAgICAgICAgIGlmICgob3JkYXRhICYgMSkgJiYgIShhbmRkYXRhICYgMSkgJiYgKHhvcmRhdGEgJiAyKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5mbGFncyAmPSB+TUFHX01BU0s7CisKKyAgICB3aGlsZSAobWFnZGF0YSkgeworICAgICAgICBzLT5mbGFncyArPSAxIDw8IE1BR19MU0I7CisgICAgICAgIG1hZ2RhdGEgPj49IDE7CisgICAgfQorCisgICAgaWYgKCEocy0+ZmxhZ3MgJiBNQUdfTUFTSykpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghKG9yZGF0YSAmIDEpKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHMtPmZsYWdzIC09IDEgPDwgTUFHX0xTQjsKKyAgICAgICAgICAgIHMtPmludDMyX3plcm9zKys7CisgICAgICAgICAgICB0b3RhbF9zaGlmdCsrOworICAgICAgICAgICAgb3JkYXRhID4+PSAxOworICAgICAgICB9IHdoaWxlICghKG9yZGF0YSAmIDEpKTsKKyAgICB9IGVsc2UgaWYgKGFuZGRhdGEgJiAxKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHMtPmZsYWdzIC09IDEgPDwgTUFHX0xTQjsKKyAgICAgICAgICAgIHMtPmludDMyX29uZXMrKzsKKyAgICAgICAgICAgIHRvdGFsX3NoaWZ0Kys7CisgICAgICAgICAgICBhbmRkYXRhID4+PSAxOworICAgICAgICB9IHdoaWxlIChhbmRkYXRhICYgMSk7CisgICAgfSBlbHNlIGlmICghKHhvcmRhdGEgJiAyKSkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBzLT5mbGFncyAtPSAxIDw8IE1BR19MU0I7CisgICAgICAgICAgICBzLT5pbnQzMl9kdXBzKys7CisgICAgICAgICAgICB0b3RhbF9zaGlmdCsrOworICAgICAgICAgICAgeG9yZGF0YSA+Pj0gMTsKKyAgICAgICAgfSB3aGlsZSAoISh4b3JkYXRhICYgMikpOworICAgIH0KKworICAgIGlmICh0b3RhbF9zaGlmdCkgeworICAgICAgICBzLT5mbGFncyB8PSBXVl9JTlQzMl9EQVRBOworCisgICAgICAgIGlmIChzLT5mbGFncyAmIFdWX01PTk9fREFUQSkKKyAgICAgICAgICAgIHNoaWZ0X21vbm8oc2FtcGxlc19sLCBuYl9zYW1wbGVzLCB0b3RhbF9zaGlmdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNoaWZ0X3N0ZXJlbyhzYW1wbGVzX2wsIHNhbXBsZXNfciwgbmJfc2FtcGxlcywgdG90YWxfc2hpZnQpOworICAgIH0KK30KKworc3RhdGljIGludCBzY2FuX2ludDMyKFdhdlBhY2tFbmNvZGVDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnNhbXBsZXNfbCwgaW50MzJfdCAqc2FtcGxlc19yLAorICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzKQoreworICAgIHVpbnQzMl90IG1hZ2RhdGEgPSAwLCBvcmRhdGEgPSAwLCB4b3JkYXRhID0gMCwgYW5kZGF0YSA9IH4wOworICAgIHVpbnQzMl90IGNyYyA9IDB4ZmZmZmZmZmZ1OworICAgIGludCBpLCB0b3RhbF9zaGlmdCA9IDA7CisKKyAgICBzLT5pbnQzMl9zZW50X2JpdHMgPSBzLT5pbnQzMl96ZXJvcyA9IHMtPmludDMyX29uZXMgPSBzLT5pbnQzMl9kdXBzID0gMDsKKworICAgIGlmIChzLT5mbGFncyAmIFdWX01PTk9fREFUQSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IE0gPSBzYW1wbGVzX2xbaV07CisKKyAgICAgICAgICAgIGNyYyA9IGNyYyAqIDkgKyAoTSAmIDB4ZmZmZikgKiAzICsgKChNID4+IDE2KSAmIDB4ZmZmZik7CisgICAgICAgICAgICBtYWdkYXRhIHw9IChNIDwgMCkgPyB+TSA6IE07CisgICAgICAgICAgICB4b3JkYXRhIHw9IE0gXiAtKE0gJiAxKTsKKyAgICAgICAgICAgIGFuZGRhdGEgJj0gTTsKKyAgICAgICAgICAgIG9yZGF0YSAgfD0gTTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgTCA9IHNhbXBsZXNfbFtpXTsKKyAgICAgICAgICAgIGludDMyX3QgUiA9IHNhbXBsZXNfcltpXTsKKworICAgICAgICAgICAgY3JjID0gY3JjICogOSArIChMICYgMHhmZmZmKSAqIDMgKyAoKEwgPj4gMTYpICYgMHhmZmZmKTsKKyAgICAgICAgICAgIGNyYyA9IGNyYyAqIDkgKyAoUiAmIDB4ZmZmZikgKiAzICsgKChSID4+IDE2KSAmIDB4ZmZmZik7CisgICAgICAgICAgICBtYWdkYXRhIHw9IChMIDwgMCkgPyB+TCA6IEw7CisgICAgICAgICAgICBtYWdkYXRhIHw9IChSIDwgMCkgPyB+UiA6IFI7CisgICAgICAgICAgICB4b3JkYXRhIHw9IEwgXiAtKEwgJiAxKTsKKyAgICAgICAgICAgIHhvcmRhdGEgfD0gUiBeIC0oUiAmIDEpOworICAgICAgICAgICAgYW5kZGF0YSAmPSBMICYgUjsKKyAgICAgICAgICAgIG9yZGF0YSAgfD0gTCB8IFI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5jcmNfeCA9IGNyYzsKKyAgICBzLT5mbGFncyAmPSB+TUFHX01BU0s7CisKKyAgICB3aGlsZSAobWFnZGF0YSkgeworICAgICAgICBzLT5mbGFncyArPSAxIDw8IE1BR19MU0I7CisgICAgICAgIG1hZ2RhdGEgPj49IDE7CisgICAgfQorCisgICAgaWYgKCEoKHMtPmZsYWdzICYgTUFHX01BU0spID4+IE1BR19MU0IpKSB7CisgICAgICAgIHMtPmZsYWdzICY9IH5XVl9JTlQzMl9EQVRBOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIShvcmRhdGEgJiAxKSkKKyAgICAgICAgZG8geworICAgICAgICAgICAgcy0+ZmxhZ3MgLT0gMSA8PCBNQUdfTFNCOworICAgICAgICAgICAgcy0+aW50MzJfemVyb3MrKzsKKyAgICAgICAgICAgIHRvdGFsX3NoaWZ0Kys7CisgICAgICAgICAgICBvcmRhdGEgPj49IDE7CisgICAgICAgIH0gd2hpbGUgKCEob3JkYXRhICYgMSkpOworICAgIGVsc2UgaWYgKGFuZGRhdGEgJiAxKQorICAgICAgICBkbyB7CisgICAgICAgICAgICBzLT5mbGFncyAtPSAxIDw8IE1BR19MU0I7CisgICAgICAgICAgICBzLT5pbnQzMl9vbmVzKys7CisgICAgICAgICAgICB0b3RhbF9zaGlmdCsrOworICAgICAgICAgICAgYW5kZGF0YSA+Pj0gMTsKKyAgICAgICAgfSB3aGlsZSAoYW5kZGF0YSAmIDEpOworICAgIGVsc2UgaWYgKCEoeG9yZGF0YSAmIDIpKQorICAgICAgICBkbyB7CisgICAgICAgICAgICBzLT5mbGFncyAtPSAxIDw8IE1BR19MU0I7CisgICAgICAgICAgICBzLT5pbnQzMl9kdXBzKys7CisgICAgICAgICAgICB0b3RhbF9zaGlmdCsrOworICAgICAgICAgICAgeG9yZGF0YSA+Pj0gMTsKKyAgICAgICAgfSB3aGlsZSAoISh4b3JkYXRhICYgMikpOworCisgICAgaWYgKCgocy0+ZmxhZ3MgJiBNQUdfTUFTSykgPj4gTUFHX0xTQikgPiAyMykgeworICAgICAgICBzLT5pbnQzMl9zZW50X2JpdHMgPSAodWludDhfdCkoKChzLT5mbGFncyAmIE1BR19NQVNLKSA+PiBNQUdfTFNCKSAtIDIzKTsKKyAgICAgICAgdG90YWxfc2hpZnQgKz0gcy0+aW50MzJfc2VudF9iaXRzOworICAgICAgICBzLT5mbGFncyAmPSB+TUFHX01BU0s7CisgICAgICAgIHMtPmZsYWdzICs9IDIzIDw8IE1BR19MU0I7CisgICAgfQorCisgICAgaWYgKHRvdGFsX3NoaWZ0KSB7CisgICAgICAgIHMtPmZsYWdzIHw9IFdWX0lOVDMyX0RBVEE7CisKKyAgICAgICAgaWYgKHMtPmZsYWdzICYgV1ZfTU9OT19EQVRBKQorICAgICAgICAgICAgc2hpZnRfbW9ubyhzYW1wbGVzX2wsIG5iX3NhbXBsZXMsIHRvdGFsX3NoaWZ0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2hpZnRfc3RlcmVvKHNhbXBsZXNfbCwgc2FtcGxlc19yLCBuYl9zYW1wbGVzLCB0b3RhbF9zaGlmdCk7CisgICAgfQorCisgICAgcmV0dXJuIHMtPmludDMyX3NlbnRfYml0czsKK30KKworc3RhdGljIGludDhfdCBzdG9yZV93ZWlnaHQoaW50IHdlaWdodCkKK3sKKyAgICB3ZWlnaHQgPSBhdl9jbGlwKHdlaWdodCwgLTEwMjQsIDEwMjQpOworICAgIGlmICh3ZWlnaHQgPiAwKQorICAgICAgICB3ZWlnaHQgLT0gKHdlaWdodCArIDY0KSA+PiA3OworCisgICAgcmV0dXJuICh3ZWlnaHQgKyA0KSA+PiAzOworfQorCitzdGF0aWMgaW50IHJlc3RvcmVfd2VpZ2h0KGludDhfdCB3ZWlnaHQpCit7CisgICAgaW50IHJlc3VsdDsKKworICAgIGlmICgocmVzdWx0ID0gKGludCkgd2VpZ2h0IDw8IDMpID4gMCkKKyAgICAgICAgcmVzdWx0ICs9IChyZXN1bHQgKyA2NCkgPj4gNzsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbG9nMnMoaW50MzJfdCB2YWx1ZSkKK3sKKyAgICByZXR1cm4gKHZhbHVlIDwgMCkgPyAtd3BfbG9nMigtdmFsdWUpIDogd3BfbG9nMih2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29ycl9tb25vKGludDMyX3QgKmluX3NhbXBsZXMsIGludDMyX3QgKm91dF9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIHN0cnVjdCBEZWNvcnIgKmRwcCwgaW50IGRpcikKK3sKKyAgICBpbnQgbSA9IDAsIGk7CisKKyAgICBkcHAtPnN1bUEgPSAwOworCisgICAgaWYgKGRpciA8IDApIHsKKyAgICAgICAgb3V0X3NhbXBsZXMgKz0gKG5iX3NhbXBsZXMgLSAxKTsKKyAgICAgICAgaW5fc2FtcGxlcyAgKz0gKG5iX3NhbXBsZXMgLSAxKTsKKyAgICB9CisKKyAgICBkcHAtPndlaWdodEEgPSByZXN0b3JlX3dlaWdodChzdG9yZV93ZWlnaHQoZHBwLT53ZWlnaHRBKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RFUk07IGkrKykKKyAgICAgICAgZHBwLT5zYW1wbGVzQVtpXSA9IHdwX2V4cDIobG9nMnMoZHBwLT5zYW1wbGVzQVtpXSkpOworCisgICAgaWYgKGRwcC0+dmFsdWUgPiBNQVhfVEVSTSkgeworICAgICAgICB3aGlsZSAobmJfc2FtcGxlcy0tKSB7CisgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHNhbV9BOworCisgICAgICAgICAgICBzYW1fQSA9ICgoMyAtIChkcHAtPnZhbHVlICYgMSkpICogZHBwLT5zYW1wbGVzQVswXSAtIGRwcC0+c2FtcGxlc0FbMV0pID4+ICEoZHBwLT52YWx1ZSAmIDEpOworCisgICAgICAgICAgICBkcHAtPnNhbXBsZXNBWzFdID0gZHBwLT5zYW1wbGVzQVswXTsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0FbMF0gPSBsZWZ0ID0gaW5fc2FtcGxlc1swXTsKKworICAgICAgICAgICAgbGVmdCAtPSBBUFBMWV9XRUlHSFQoZHBwLT53ZWlnaHRBLCBzYW1fQSk7CisgICAgICAgICAgICBVUERBVEVfV0VJR0hUKGRwcC0+d2VpZ2h0QSwgZHBwLT5kZWx0YSwgc2FtX0EsIGxlZnQpOworICAgICAgICAgICAgZHBwLT5zdW1BICs9IGRwcC0+d2VpZ2h0QTsKKyAgICAgICAgICAgIG91dF9zYW1wbGVzWzBdID0gbGVmdDsKKyAgICAgICAgICAgIGluX3NhbXBsZXMgKz0gZGlyOworICAgICAgICAgICAgb3V0X3NhbXBsZXMgKz0gZGlyOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChkcHAtPnZhbHVlID4gMCkgeworICAgICAgICB3aGlsZSAobmJfc2FtcGxlcy0tKSB7CisgICAgICAgICAgICBpbnQgayA9IChtICsgZHBwLT52YWx1ZSkgJiAoTUFYX1RFUk0gLSAxKTsKKyAgICAgICAgICAgIGludDMyX3QgbGVmdCwgc2FtX0E7CisKKyAgICAgICAgICAgIHNhbV9BID0gZHBwLT5zYW1wbGVzQVttXTsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0Fba10gPSBsZWZ0ID0gaW5fc2FtcGxlc1swXTsKKyAgICAgICAgICAgIG0gPSAobSArIDEpICYgKE1BWF9URVJNIC0gMSk7CisKKyAgICAgICAgICAgIGxlZnQgLT0gQVBQTFlfV0VJR0hUKGRwcC0+d2VpZ2h0QSwgc2FtX0EpOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbV9BLCBsZWZ0KTsKKyAgICAgICAgICAgIGRwcC0+c3VtQSArPSBkcHAtPndlaWdodEE7CisgICAgICAgICAgICBvdXRfc2FtcGxlc1swXSA9IGxlZnQ7CisgICAgICAgICAgICBpbl9zYW1wbGVzICs9IGRpcjsKKyAgICAgICAgICAgIG91dF9zYW1wbGVzICs9IGRpcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtICYmIGRwcC0+dmFsdWUgPiAwICYmIGRwcC0+dmFsdWUgPD0gTUFYX1RFUk0pIHsKKyAgICAgICAgaW50MzJfdCB0ZW1wX0FbTUFYX1RFUk1dOworCisgICAgICAgIG1lbWNweSh0ZW1wX0EsIGRwcC0+c2FtcGxlc0EsIHNpemVvZihkcHAtPnNhbXBsZXNBKSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9URVJNOyBpKyspIHsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0FbaV0gPSB0ZW1wX0FbbV07CisgICAgICAgICAgICBtID0gKG0gKyAxKSAmIChNQVhfVEVSTSAtIDEpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZXZlcnNlX21vbm9fZGVjb3JyKHN0cnVjdCBEZWNvcnIgKmRwcCkKK3sKKyAgICBpZiAoZHBwLT52YWx1ZSA+IE1BWF9URVJNKSB7CisgICAgICAgIGludDMyX3Qgc2FtX0E7CisKKyAgICAgICAgaWYgKGRwcC0+dmFsdWUgJiAxKQorICAgICAgICAgICAgc2FtX0EgPSAyICogZHBwLT5zYW1wbGVzQVswXSAtIGRwcC0+c2FtcGxlc0FbMV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNhbV9BID0gKDMgKiBkcHAtPnNhbXBsZXNBWzBdIC0gZHBwLT5zYW1wbGVzQVsxXSkgPj4gMTsKKworICAgICAgICBkcHAtPnNhbXBsZXNBWzFdID0gZHBwLT5zYW1wbGVzQVswXTsKKyAgICAgICAgZHBwLT5zYW1wbGVzQVswXSA9IHNhbV9BOworCisgICAgICAgIGlmIChkcHAtPnZhbHVlICYgMSkKKyAgICAgICAgICAgIHNhbV9BID0gMiAqIGRwcC0+c2FtcGxlc0FbMF0gLSBkcHAtPnNhbXBsZXNBWzFdOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzYW1fQSA9ICgzICogZHBwLT5zYW1wbGVzQVswXSAtIGRwcC0+c2FtcGxlc0FbMV0pID4+IDE7CisKKyAgICAgICAgZHBwLT5zYW1wbGVzQVsxXSA9IHNhbV9BOworICAgIH0gZWxzZSBpZiAoZHBwLT52YWx1ZSA+IDEpIHsKKyAgICAgICAgaW50IGksIGosIGs7CisKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IGRwcC0+dmFsdWUgLSAxLCBrID0gMDsgayA8IGRwcC0+dmFsdWUgLyAyOyBpKyssIGotLSwgaysrKSB7CisgICAgICAgICAgICBpICY9IChNQVhfVEVSTSAtIDEpOworICAgICAgICAgICAgaiAmPSAoTUFYX1RFUk0gLSAxKTsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0FbaV0gXj0gZHBwLT5zYW1wbGVzQVtqXTsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0Fbal0gXj0gZHBwLT5zYW1wbGVzQVtpXTsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0FbaV0gXj0gZHBwLT5zYW1wbGVzQVtqXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHVpbnQzMl90IGxvZzJzYW1wbGUodWludDMyX3QgdiwgaW50IGxpbWl0LCB1aW50MzJfdCAqcmVzdWx0KQoreworICAgIHVpbnQzMl90IGRiaXRzOworCisgICAgaWYgKCh2ICs9IHYgPj4gOSkgPCAoMSA8PCA4KSkgeworICAgICAgICBkYml0cyA9IG5iaXRzX3RhYmxlW3ZdOworICAgICAgICAqcmVzdWx0ICs9IChkYml0cyA8PCA4KSArIHdwX2xvZzJfdGFibGVbKHYgPDwgKDkgLSBkYml0cykpICYgMHhmZl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHYgPCAoMUwgPDwgMTYpKQorICAgICAgICAgICAgZGJpdHMgPSBuYml0c190YWJsZVt2ID4+IDhdICsgODsKKyAgICAgICAgZWxzZSBpZiAodiA8ICgxTCA8PCAyNCkpCisgICAgICAgICAgICBkYml0cyA9IG5iaXRzX3RhYmxlW3YgPj4gMTZdICsgMTY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRiaXRzID0gbmJpdHNfdGFibGVbdiA+PiAyNF0gKyAyNDsKKworICAgICAgICAqcmVzdWx0ICs9IGRiaXRzID0gKGRiaXRzIDw8IDgpICsgd3BfbG9nMl90YWJsZVsodiA+PiAoZGJpdHMgLSA5KSkgJiAweGZmXTsKKworICAgICAgICBpZiAobGltaXQgJiYgZGJpdHMgPj0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IGxvZzJtb25vKGludDMyX3QgKnNhbXBsZXMsIGludCBuYl9zYW1wbGVzLCBpbnQgbGltaXQpCit7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICB3aGlsZSAobmJfc2FtcGxlcy0tKSB7CisgICAgICAgIGlmIChsb2cyc2FtcGxlKGFicygqc2FtcGxlcysrKSwgbGltaXQsICZyZXN1bHQpKQorICAgICAgICAgICAgcmV0dXJuIFVJTlQzMl9NQVg7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBsb2cyc3RlcmVvKGludDMyX3QgKnNhbXBsZXNfbCwgaW50MzJfdCAqc2FtcGxlc19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCBsaW1pdCkKK3sKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgIHdoaWxlIChuYl9zYW1wbGVzLS0pIHsKKyAgICAgICAgaWYgKGxvZzJzYW1wbGUoYWJzKCpzYW1wbGVzX2wrKyksIGxpbWl0LCAmcmVzdWx0KSB8fAorICAgICAgICAgICAgbG9nMnNhbXBsZShhYnMoKnNhbXBsZXNfcisrKSwgbGltaXQsICZyZXN1bHQpKQorICAgICAgICAgICAgcmV0dXJuIFVJTlQzMl9NQVg7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29ycl9tb25vX2J1ZmZlcihpbnQzMl90ICpzYW1wbGVzLCBpbnQzMl90ICpvdXRzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLCBzdHJ1Y3QgRGVjb3JyICpkcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbmRleCkKK3sKKyAgICBzdHJ1Y3QgRGVjb3JyIGRwLCAqZHBwaSA9IGRwcCArIHRpbmRleDsKKyAgICBpbnQgZGVsdGEgPSBkcHBpLT5kZWx0YSwgcHJlX2RlbHRhLCB0ZXJtID0gZHBwaS0+dmFsdWU7CisKKyAgICBpZiAoZGVsdGEgPT0gNykKKyAgICAgICAgcHJlX2RlbHRhID0gNzsKKyAgICBlbHNlIGlmIChkZWx0YSA8IDIpCisgICAgICAgIHByZV9kZWx0YSA9IDM7CisgICAgZWxzZQorICAgICAgICBwcmVfZGVsdGEgPSBkZWx0YSArIDE7CisKKyAgICBDTEVBUihkcCk7CisgICAgZHAudmFsdWUgPSB0ZXJtOworICAgIGRwLmRlbHRhID0gcHJlX2RlbHRhOworICAgIGRlY29ycl9tb25vKHNhbXBsZXMsIG91dHNhbXBsZXMsIEZGTUlOKDIwNDgsIG5iX3NhbXBsZXMpLCAmZHAsIC0xKTsKKyAgICBkcC5kZWx0YSA9IGRlbHRhOworCisgICAgaWYgKHRpbmRleCA9PSAwKQorICAgICAgICByZXZlcnNlX21vbm9fZGVjb3JyKCZkcCk7CisgICAgZWxzZQorICAgICAgICBDTEVBUihkcC5zYW1wbGVzQSk7CisKKyAgICBtZW1jcHkoZHBwaS0+c2FtcGxlc0EsIGRwLnNhbXBsZXNBLCBzaXplb2YoZHAuc2FtcGxlc0EpKTsKKyAgICBkcHBpLT53ZWlnaHRBID0gZHAud2VpZ2h0QTsKKworICAgIGlmIChkZWx0YSA9PSAwKSB7CisgICAgICAgIGRwLmRlbHRhID0gMTsKKyAgICAgICAgZGVjb3JyX21vbm8oc2FtcGxlcywgb3V0c2FtcGxlcywgbmJfc2FtcGxlcywgJmRwLCAxKTsKKyAgICAgICAgZHAuZGVsdGEgPSAwOworICAgICAgICBtZW1jcHkoZHAuc2FtcGxlc0EsIGRwcGktPnNhbXBsZXNBLCBzaXplb2YoZHAuc2FtcGxlc0EpKTsKKyAgICAgICAgZHBwaS0+d2VpZ2h0QSA9IGRwLndlaWdodEEgPSBkcC5zdW1BIC8gbmJfc2FtcGxlczsKKyAgICB9CisKKyAgICBkZWNvcnJfbW9ubyhzYW1wbGVzLCBvdXRzYW1wbGVzLCBuYl9zYW1wbGVzLCAmZHAsIDEpOworfQorCitzdGF0aWMgdm9pZCByZWN1cnNlX21vbm8oV2F2UGFja0VuY29kZUNvbnRleHQgKnMsIFdhdlBhY2tFeHRyYUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoLCBpbnQgZGVsdGEsIHVpbnQzMl90IGlucHV0X2JpdHMpCit7CisgICAgaW50IHRlcm0sIGJyYW5jaGVzID0gcy0+bnVtX2JyYW5jaGVzIC0gZGVwdGg7CisgICAgaW50MzJfdCAqc2FtcGxlcywgKm91dHNhbXBsZXM7CisgICAgdWludDMyX3QgdGVybV9iaXRzWzIyXSwgYml0czsKKworICAgIGlmIChicmFuY2hlcyA8IDEgfHwgZGVwdGggKyAxID09IGluZm8tPm50ZXJtcykKKyAgICAgICAgYnJhbmNoZXMgPSAxOworCisgICAgQ0xFQVIodGVybV9iaXRzKTsKKyAgICBzYW1wbGVzID0gcy0+c2FtcGxlcHRyc1tkZXB0aF1bMF07CisgICAgb3V0c2FtcGxlcyA9IHMtPnNhbXBsZXB0cnNbZGVwdGggKyAxXVswXTsKKworICAgIGZvciAodGVybSA9IDE7IHRlcm0gPD0gMTg7IHRlcm0rKykgeworICAgICAgICBpZiAodGVybSA9PSAxNyAmJiBicmFuY2hlcyA9PSAxICYmIGRlcHRoICsgMSA8IGluZm8tPm50ZXJtcykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICh0ZXJtID4gOCAmJiB0ZXJtIDwgMTcpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoIXMtPmV4dHJhX2ZsYWdzICYmICh0ZXJtID4gNCAmJiB0ZXJtIDwgMTcpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaW5mby0+ZHBzW2RlcHRoXS52YWx1ZSA9IHRlcm07CisgICAgICAgIGluZm8tPmRwc1tkZXB0aF0uZGVsdGEgPSBkZWx0YTsKKyAgICAgICAgZGVjb3JyX21vbm9fYnVmZmVyKHNhbXBsZXMsIG91dHNhbXBsZXMsIHMtPmJsb2NrX3NhbXBsZXMsIGluZm8tPmRwcywgZGVwdGgpOworICAgICAgICBiaXRzID0gbG9nMm1vbm8ob3V0c2FtcGxlcywgcy0+YmxvY2tfc2FtcGxlcywgaW5mby0+bG9nX2xpbWl0KTsKKworICAgICAgICBpZiAoYml0cyA8IGluZm8tPmJlc3RfYml0cykgeworICAgICAgICAgICAgaW5mby0+YmVzdF9iaXRzID0gYml0czsKKyAgICAgICAgICAgIENMRUFSKHMtPmRlY29ycl9wYXNzZXMpOworICAgICAgICAgICAgbWVtY3B5KHMtPmRlY29ycl9wYXNzZXMsIGluZm8tPmRwcywgc2l6ZW9mKGluZm8tPmRwc1swXSkgKiAoZGVwdGggKyAxKSk7CisgICAgICAgICAgICBtZW1jcHkocy0+c2FtcGxlcHRyc1tpbmZvLT5udGVybXMgKyAxXVswXSwKKyAgICAgICAgICAgICAgICAgICBzLT5zYW1wbGVwdHJzW2RlcHRoICsgMV1bMF0sIHMtPmJsb2NrX3NhbXBsZXMgKiA0KTsKKyAgICAgICAgfQorCisgICAgICAgIHRlcm1fYml0c1t0ZXJtICsgM10gPSBiaXRzOworICAgIH0KKworICAgIHdoaWxlIChkZXB0aCArIDEgPCBpbmZvLT5udGVybXMgJiYgYnJhbmNoZXMtLSkgeworICAgICAgICB1aW50MzJfdCBsb2NhbF9iZXN0X2JpdHMgPSBpbnB1dF9iaXRzOworICAgICAgICBpbnQgYmVzdF90ZXJtID0gMCwgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjI7IGkrKykKKyAgICAgICAgICAgIGlmICh0ZXJtX2JpdHNbaV0gJiYgdGVybV9iaXRzW2ldIDwgbG9jYWxfYmVzdF9iaXRzKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfYmVzdF9iaXRzID0gdGVybV9iaXRzW2ldOworICAgICAgICAgICAgICAgIGJlc3RfdGVybSA9IGkgLSAzOworICAgICAgICAgICAgfQorCisgICAgICAgIGlmICghYmVzdF90ZXJtKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgdGVybV9iaXRzW2Jlc3RfdGVybSArIDNdID0gMDsKKworICAgICAgICBpbmZvLT5kcHNbZGVwdGhdLnZhbHVlID0gYmVzdF90ZXJtOworICAgICAgICBpbmZvLT5kcHNbZGVwdGhdLmRlbHRhID0gZGVsdGE7CisgICAgICAgIGRlY29ycl9tb25vX2J1ZmZlcihzYW1wbGVzLCBvdXRzYW1wbGVzLCBzLT5ibG9ja19zYW1wbGVzLCBpbmZvLT5kcHMsIGRlcHRoKTsKKworICAgICAgICByZWN1cnNlX21vbm8ocywgaW5mbywgZGVwdGggKyAxLCBkZWx0YSwgbG9jYWxfYmVzdF9iaXRzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNvcnRfbW9ubyhXYXZQYWNrRW5jb2RlQ29udGV4dCAqcywgV2F2UGFja0V4dHJhSW5mbyAqaW5mbykKK3sKKyAgICBpbnQgcmV2ZXJzZWQgPSAxOworICAgIHVpbnQzMl90IGJpdHM7CisKKyAgICB3aGlsZSAocmV2ZXJzZWQpIHsKKyAgICAgICAgaW50IHJpLCBpOworCisgICAgICAgIG1lbWNweShpbmZvLT5kcHMsIHMtPmRlY29ycl9wYXNzZXMsIHNpemVvZihzLT5kZWNvcnJfcGFzc2VzKSk7CisgICAgICAgIHJldmVyc2VkID0gMDsKKworICAgICAgICBmb3IgKHJpID0gMDsgcmkgPCBpbmZvLT5udGVybXMgJiYgcy0+ZGVjb3JyX3Bhc3Nlc1tyaV0udmFsdWU7IHJpKyspIHsKKworICAgICAgICAgICAgaWYgKHJpICsgMSA+PSBpbmZvLT5udGVybXMgfHwgIXMtPmRlY29ycl9wYXNzZXNbcmkrMV0udmFsdWUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmIChzLT5kZWNvcnJfcGFzc2VzW3JpXS52YWx1ZSA9PSBzLT5kZWNvcnJfcGFzc2VzW3JpKzFdLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgZGVjb3JyX21vbm9fYnVmZmVyKHMtPnNhbXBsZXB0cnNbcmldWzBdLCBzLT5zYW1wbGVwdHJzW3JpKzFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zYW1wbGVzLCBpbmZvLT5kcHMsIHJpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5mby0+ZHBzW3JpICBdID0gcy0+ZGVjb3JyX3Bhc3Nlc1tyaSsxXTsKKyAgICAgICAgICAgIGluZm8tPmRwc1tyaSsxXSA9IHMtPmRlY29ycl9wYXNzZXNbcmkgIF07CisKKyAgICAgICAgICAgIGZvciAoaSA9IHJpOyBpIDwgaW5mby0+bnRlcm1zICYmIHMtPmRlY29ycl9wYXNzZXNbaV0udmFsdWU7IGkrKykKKyAgICAgICAgICAgICAgICBkZWNvcnJfbW9ub19idWZmZXIocy0+c2FtcGxlcHRyc1tpXVswXSwgcy0+c2FtcGxlcHRyc1tpKzFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zYW1wbGVzLCBpbmZvLT5kcHMsIGkpOworCisgICAgICAgICAgICBiaXRzID0gbG9nMm1vbm8ocy0+c2FtcGxlcHRyc1tpXVswXSwgcy0+YmxvY2tfc2FtcGxlcywgaW5mby0+bG9nX2xpbWl0KTsKKyAgICAgICAgICAgIGlmIChiaXRzIDwgaW5mby0+YmVzdF9iaXRzKSB7CisgICAgICAgICAgICAgICAgcmV2ZXJzZWQgPSAxOworICAgICAgICAgICAgICAgIGluZm8tPmJlc3RfYml0cyA9IGJpdHM7CisgICAgICAgICAgICAgICAgQ0xFQVIocy0+ZGVjb3JyX3Bhc3Nlcyk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHMtPmRlY29ycl9wYXNzZXMsIGluZm8tPmRwcywgc2l6ZW9mKGluZm8tPmRwc1swXSkgKiBpKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+c2FtcGxlcHRyc1tpbmZvLT5udGVybXMgKyAxXVswXSwgcy0+c2FtcGxlcHRyc1tpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcyAqIDQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmZvLT5kcHNbcmkgIF0gPSBzLT5kZWNvcnJfcGFzc2VzW3JpXTsKKyAgICAgICAgICAgICAgICBpbmZvLT5kcHNbcmkrMV0gPSBzLT5kZWNvcnJfcGFzc2VzW3JpKzFdOworICAgICAgICAgICAgICAgIGRlY29ycl9tb25vX2J1ZmZlcihzLT5zYW1wbGVwdHJzW3JpXVswXSwgcy0+c2FtcGxlcHRyc1tyaSsxXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcywgaW5mby0+ZHBzLCByaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlbHRhX21vbm8oV2F2UGFja0VuY29kZUNvbnRleHQgKnMsIFdhdlBhY2tFeHRyYUluZm8gKmluZm8pCit7CisgICAgaW50IGxvd2VyID0gMCwgZGVsdGEsIGQ7CisgICAgdWludDMyX3QgYml0czsKKworICAgIGlmICghcy0+ZGVjb3JyX3Bhc3Nlc1swXS52YWx1ZSkKKyAgICAgICAgcmV0dXJuOworICAgIGRlbHRhID0gcy0+ZGVjb3JyX3Bhc3Nlc1swXS5kZWx0YTsKKworICAgIGZvciAoZCA9IGRlbHRhIC0gMTsgZCA+PSAwOyBkLS0pIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPm50ZXJtcyAmJiBzLT5kZWNvcnJfcGFzc2VzW2ldLnZhbHVlOyBpKyspIHsKKyAgICAgICAgICAgIGluZm8tPmRwc1tpXS52YWx1ZSA9IHMtPmRlY29ycl9wYXNzZXNbaV0udmFsdWU7CisgICAgICAgICAgICBpbmZvLT5kcHNbaV0uZGVsdGEgPSBkOworICAgICAgICAgICAgZGVjb3JyX21vbm9fYnVmZmVyKHMtPnNhbXBsZXB0cnNbaV1bMF0sIHMtPnNhbXBsZXB0cnNbaSsxXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zYW1wbGVzLCBpbmZvLT5kcHMsIGkpOworICAgICAgICB9CisKKyAgICAgICAgYml0cyA9IGxvZzJtb25vKHMtPnNhbXBsZXB0cnNbaV1bMF0sIHMtPmJsb2NrX3NhbXBsZXMsIGluZm8tPmxvZ19saW1pdCk7CisgICAgICAgIGlmIChiaXRzID49IGluZm8tPmJlc3RfYml0cykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGxvd2VyID0gMTsKKyAgICAgICAgaW5mby0+YmVzdF9iaXRzID0gYml0czsKKyAgICAgICAgQ0xFQVIocy0+ZGVjb3JyX3Bhc3Nlcyk7CisgICAgICAgIG1lbWNweShzLT5kZWNvcnJfcGFzc2VzLCBpbmZvLT5kcHMsIHNpemVvZihpbmZvLT5kcHNbMF0pICogaSk7CisgICAgICAgIG1lbWNweShzLT5zYW1wbGVwdHJzW2luZm8tPm50ZXJtcyArIDFdWzBdLCAgcy0+c2FtcGxlcHRyc1tpXVswXSwKKyAgICAgICAgICAgICAgIHMtPmJsb2NrX3NhbXBsZXMgKiA0KTsKKyAgICB9CisKKyAgICBmb3IgKGQgPSBkZWx0YSArIDE7ICFsb3dlciAmJiBkIDw9IDc7IGQrKykgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnRlcm1zICYmIHMtPmRlY29ycl9wYXNzZXNbaV0udmFsdWU7IGkrKykgeworICAgICAgICAgICAgaW5mby0+ZHBzW2ldLnZhbHVlID0gcy0+ZGVjb3JyX3Bhc3Nlc1tpXS52YWx1ZTsKKyAgICAgICAgICAgIGluZm8tPmRwc1tpXS5kZWx0YSA9IGQ7CisgICAgICAgICAgICBkZWNvcnJfbW9ub19idWZmZXIocy0+c2FtcGxlcHRyc1tpXVswXSwgcy0+c2FtcGxlcHRyc1tpKzFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3NhbXBsZXMsIGluZm8tPmRwcywgaSk7CisgICAgICAgIH0KKworICAgICAgICBiaXRzID0gbG9nMm1vbm8ocy0+c2FtcGxlcHRyc1tpXVswXSwgcy0+YmxvY2tfc2FtcGxlcywgaW5mby0+bG9nX2xpbWl0KTsKKyAgICAgICAgaWYgKGJpdHMgPj0gaW5mby0+YmVzdF9iaXRzKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaW5mby0+YmVzdF9iaXRzID0gYml0czsKKyAgICAgICAgQ0xFQVIocy0+ZGVjb3JyX3Bhc3Nlcyk7CisgICAgICAgIG1lbWNweShzLT5kZWNvcnJfcGFzc2VzLCBpbmZvLT5kcHMsIHNpemVvZihpbmZvLT5kcHNbMF0pICogaSk7CisgICAgICAgIG1lbWNweShzLT5zYW1wbGVwdHJzW2luZm8tPm50ZXJtcyArIDFdWzBdLCBzLT5zYW1wbGVwdHJzW2ldWzBdLAorICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcyAqIDQpOworICAgIH0KK30KKworc3RhdGljIGludCBhbGxvY2F0ZV9idWZmZXJzMihXYXZQYWNrRW5jb2RlQ29udGV4dCAqcywgaW50IG50ZXJtcykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudGVybXMgKyAyOyBpKyspIHsKKyAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZzLT5zYW1wbGVwdHJzW2ldWzBdLCAmcy0+c2FtcGxlcHRyc19zaXplW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcyAqIDQpOworICAgICAgICBpZiAoIXMtPnNhbXBsZXB0cnNbaV1bMF0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBpZiAoIShzLT5mbGFncyAmIFdWX01PTk9fREFUQSkpIHsKKyAgICAgICAgICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcy0+c2FtcGxlcHRyc1tpXVsxXSwgJnMtPnNhbXBsZXB0cnNfc2l6ZVtpXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zYW1wbGVzICogNCk7CisgICAgICAgICAgICBpZiAoIXMtPnNhbXBsZXB0cnNbaV1bMV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsbG9jYXRlX2J1ZmZlcnMoV2F2UGFja0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcy0+YmVzdF9idWZmZXJbMF0sICZzLT5iZXN0X2J1ZmZlcl9zaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcyAqIDQpOworICAgICAgICBpZiAoIXMtPmJlc3RfYnVmZmVyWzBdKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnMtPnRlbXBfYnVmZmVyW2ldWzBdLCAmcy0+dGVtcF9idWZmZXJfc2l6ZVtpXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3NhbXBsZXMgKiA0KTsKKyAgICAgICAgaWYgKCFzLT50ZW1wX2J1ZmZlcltpXVswXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGlmICghKHMtPmZsYWdzICYgV1ZfTU9OT19EQVRBKSkgeworICAgICAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZzLT5iZXN0X2J1ZmZlclsxXSwgJnMtPmJlc3RfYnVmZmVyX3NpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcyAqIDQpOworICAgICAgICAgICAgaWYgKCFzLT5iZXN0X2J1ZmZlclsxXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnMtPnRlbXBfYnVmZmVyW2ldWzFdLCAmcy0+dGVtcF9idWZmZXJfc2l6ZVtpXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zYW1wbGVzICogNCk7CisgICAgICAgICAgICBpZiAoIXMtPnRlbXBfYnVmZmVyW2ldWzFdKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYW5hbHl6ZV9tb25vKFdhdlBhY2tFbmNvZGVDb250ZXh0ICpzLCBpbnQzMl90ICpzYW1wbGVzLCBpbnQgZG9fc2FtcGxlcykKK3sKKyAgICBXYXZQYWNrRXh0cmFJbmZvIGluZm87CisgICAgaW50IGk7CisKKyAgICBpbmZvLmxvZ19saW1pdCA9ICgoKHMtPmZsYWdzICYgTUFHX01BU0spID4+IE1BR19MU0IpICsgNCkgKiAyNTY7CisgICAgaW5mby5sb2dfbGltaXQgPSBGRk1JTig2OTEyLCBpbmZvLmxvZ19saW1pdCk7CisKKyAgICBpbmZvLm50ZXJtcyA9IHMtPm51bV90ZXJtczsKKworICAgIGlmIChhbGxvY2F0ZV9idWZmZXJzMihzLCBzLT5udW1fdGVybXMpKQorICAgICAgICByZXR1cm47CisKKyAgICBtZW1jcHkoaW5mby5kcHMsIHMtPmRlY29ycl9wYXNzZXMsIHNpemVvZihpbmZvLmRwcykpOworICAgIG1lbWNweShzLT5zYW1wbGVwdHJzWzBdWzBdLCBzYW1wbGVzLCBzLT5ibG9ja19zYW1wbGVzICogNCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby5udGVybXMgJiYgaW5mby5kcHNbaV0udmFsdWU7IGkrKykKKyAgICAgICAgZGVjb3JyX21vbm8ocy0+c2FtcGxlcHRyc1tpXVswXSwgcy0+c2FtcGxlcHRyc1tpICsgMV1bMF0sCisgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3NhbXBsZXMsIGluZm8uZHBzICsgaSwgMSk7CisKKyAgICBpbmZvLmJlc3RfYml0cyA9IGxvZzJtb25vKHMtPnNhbXBsZXB0cnNbaW5mby5udGVybXNdWzBdLCBzLT5ibG9ja19zYW1wbGVzLCAwKSAqIDE7CisgICAgbWVtY3B5KHMtPnNhbXBsZXB0cnNbaW5mby5udGVybXMgKyAxXVswXSwgcy0+c2FtcGxlcHRyc1tpXVswXSwgcy0+YmxvY2tfc2FtcGxlcyAqIDQpOworCisgICAgaWYgKHMtPmV4dHJhX2ZsYWdzICYgRVhUUkFfQlJBTkNIRVMpCisgICAgICAgIHJlY3Vyc2VfbW9ubyhzLCAmaW5mbywgMCwgKGludCkgZmxvb3Iocy0+ZGVsdGFfZGVjYXkgKyAwLjUpLAorICAgICAgICAgICAgICAgICAgICAgbG9nMm1vbm8ocy0+c2FtcGxlcHRyc1swXVswXSwgcy0+YmxvY2tfc2FtcGxlcywgMCkpOworCisgICAgaWYgKHMtPmV4dHJhX2ZsYWdzICYgRVhUUkFfU09SVF9GSVJTVCkKKyAgICAgICAgc29ydF9tb25vKHMsICZpbmZvKTsKKworICAgIGlmIChzLT5leHRyYV9mbGFncyAmIEVYVFJBX1RSWV9ERUxUQVMpIHsKKyAgICAgICAgZGVsdGFfbW9ubyhzLCAmaW5mbyk7CisKKyAgICAgICAgaWYgKChzLT5leHRyYV9mbGFncyAmIEVYVFJBX0FESlVTVF9ERUxUQVMpICYmIHMtPmRlY29ycl9wYXNzZXNbMF0udmFsdWUpCisgICAgICAgICAgICBzLT5kZWx0YV9kZWNheSA9IChmbG9hdCkoKHMtPmRlbHRhX2RlY2F5ICogMi4wICsgcy0+ZGVjb3JyX3Bhc3Nlc1swXS5kZWx0YSkgLyAzLjApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5kZWx0YV9kZWNheSA9IDIuMDsKKyAgICB9CisKKyAgICBpZiAocy0+ZXh0cmFfZmxhZ3MgJiBFWFRSQV9TT1JUX0xBU1QpCisgICAgICAgIHNvcnRfbW9ubyhzLCAmaW5mbyk7CisKKyAgICBpZiAoZG9fc2FtcGxlcykKKyAgICAgICAgbWVtY3B5KHNhbXBsZXMsIHMtPnNhbXBsZXB0cnNbaW5mby5udGVybXMgKyAxXVswXSwgcy0+YmxvY2tfc2FtcGxlcyAqIDQpOworCisgICAgZm9yIChpID0gMDsgaSA8IGluZm8ubnRlcm1zOyBpKyspCisgICAgICAgIGlmICghcy0+ZGVjb3JyX3Bhc3Nlc1tpXS52YWx1ZSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgcy0+bnVtX3Rlcm1zID0gaTsKK30KKworc3RhdGljIHZvaWQgc2Nhbl93b3JkKFdhdlBhY2tFbmNvZGVDb250ZXh0ICpzLCBXdkNoYW5uZWwgKmMsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc2FtcGxlcywgaW50IG5iX3NhbXBsZXMsIGludCBkaXIpCit7CisgICAgaWYgKGRpciA8IDApCisgICAgICAgIHNhbXBsZXMgKz0gbmJfc2FtcGxlcyAtIDE7CisKKyAgICB3aGlsZSAobmJfc2FtcGxlcy0tKSB7CisgICAgICAgIHVpbnQzMl90IGxvdywgdmFsdWUgPSBsYWJzKHNhbXBsZXNbMF0pOworCisgICAgICAgIGlmICh2YWx1ZSA8IEdFVF9NRUQoMCkpIHsKKyAgICAgICAgICAgIERFQ19NRUQoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb3cgPSBHRVRfTUVEKDApOworICAgICAgICAgICAgSU5DX01FRCgwKTsKKworICAgICAgICAgICAgaWYgKHZhbHVlIC0gbG93IDwgR0VUX01FRCgxKSkgeworICAgICAgICAgICAgICAgIERFQ19NRUQoMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvdyArPSBHRVRfTUVEKDEpOworICAgICAgICAgICAgICAgIElOQ19NRUQoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgLSBsb3cgPCBHRVRfTUVEKDIpKSB7CisgICAgICAgICAgICAgICAgICAgIERFQ19NRUQoMik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSU5DX01FRCgyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2FtcGxlcyArPSBkaXI7CisgICAgfQorfQorCitzdGF0aWMgaW50IHd2X21vbm8oV2F2UGFja0VuY29kZUNvbnRleHQgKnMsIGludDMyX3QgKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgaW50IG5vX2hpc3RvcnksIGludCBkb19zYW1wbGVzKQoreworICAgIHN0cnVjdCBEZWNvcnIgdGVtcF9kZWNvcnJfcGFzcywgc2F2ZV9kZWNvcnJfcGFzc2VzW01BWF9URVJNU10gPSB7ezB9fTsKKyAgICBpbnQgbmJfc2FtcGxlcyA9IHMtPmJsb2NrX3NhbXBsZXM7CisgICAgaW50IGJ1Zl9zaXplID0gc2l6ZW9mKGludDMyX3QpICogbmJfc2FtcGxlczsKKyAgICB1aW50MzJfdCBiZXN0X3NpemUgPSBVSU5UMzJfTUFYLCBzaXplOworICAgIGludCBsb2dfbGltaXQsIHBpLCBpLCByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKQorICAgICAgICBpZiAoc2FtcGxlc1tpXSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgaWYgKGkgPT0gbmJfc2FtcGxlcykgeworICAgICAgICBDTEVBUihzLT5kZWNvcnJfcGFzc2VzKTsKKyAgICAgICAgQ0xFQVIocy0+dyk7CisgICAgICAgIHMtPm51bV90ZXJtcyA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGxvZ19saW1pdCA9ICgoKHMtPmZsYWdzICYgTUFHX01BU0spID4+IE1BR19MU0IpICsgNCkgKiAyNTY7CisgICAgbG9nX2xpbWl0ID0gRkZNSU4oNjkxMiwgbG9nX2xpbWl0KTsKKworICAgIGlmICgocmV0ID0gYWxsb2NhdGVfYnVmZmVycyhzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKG5vX2hpc3RvcnkgfHwgcy0+bnVtX3Bhc3NlcyA+PSA3KQorICAgICAgICBzLT5iZXN0X2RlY29yciA9IHMtPm1hc2tfZGVjb3JyID0gMDsKKworICAgIGZvciAocGkgPSAwOyBwaSA8IHMtPm51bV9wYXNzZXM7KSB7CisgICAgICAgIGNvbnN0IFdhdlBhY2tEZWNvcnJTcGVjICp3cGRzOworICAgICAgICBpbnQgbnRlcm1zLCBjLCBqOworCisgICAgICAgIGlmICghcGkpIHsKKyAgICAgICAgICAgIGMgPSBzLT5iZXN0X2RlY29ycjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzLT5tYXNrX2RlY29yciA9PSAwKQorICAgICAgICAgICAgICAgIGMgPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGMgPSAocy0+YmVzdF9kZWNvcnIgJiAocy0+bWFza19kZWNvcnIgLSAxKSkgfCBzLT5tYXNrX2RlY29ycjsKKworICAgICAgICAgICAgaWYgKGMgPT0gcy0+YmVzdF9kZWNvcnIpIHsKKyAgICAgICAgICAgICAgICBzLT5tYXNrX2RlY29yciA9IHMtPm1hc2tfZGVjb3JyID8gKChzLT5tYXNrX2RlY29yciA8PCAxKSAmIChzLT5udW1fZGVjb3JycyAtIDEpKSA6IDE7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3cGRzID0gJnMtPmRlY29ycl9zcGVjc1tjXTsKKyAgICAgICAgbnRlcm1zID0gZGVjb3JyX2ZpbHRlcl9udGVybXNbcy0+ZGVjb3JyX2ZpbHRlcl07CisKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgbWVtY3B5KHMtPnRlbXBfYnVmZmVyWzBdWzBdLCBzYW1wbGVzLCBidWZfc2l6ZSk7CisgICAgICAgIENMRUFSKHNhdmVfZGVjb3JyX3Bhc3Nlcyk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG50ZXJtczsgaisrKSB7CisgICAgICAgICAgICBDTEVBUih0ZW1wX2RlY29ycl9wYXNzKTsKKyAgICAgICAgICAgIHRlbXBfZGVjb3JyX3Bhc3MuZGVsdGEgPSB3cGRzLT5kZWx0YTsKKyAgICAgICAgICAgIHRlbXBfZGVjb3JyX3Bhc3MudmFsdWUgPSB3cGRzLT50ZXJtc1tqXTsKKworICAgICAgICAgICAgaWYgKHRlbXBfZGVjb3JyX3Bhc3MudmFsdWUgPCAwKQorICAgICAgICAgICAgICAgIHRlbXBfZGVjb3JyX3Bhc3MudmFsdWUgPSAxOworCisgICAgICAgICAgICBkZWNvcnJfbW9ubyhzLT50ZW1wX2J1ZmZlcltqJjFdWzBdLCBzLT50ZW1wX2J1ZmZlclt+aiYxXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKG5iX3NhbXBsZXMsIDIwNDgpLCAmdGVtcF9kZWNvcnJfcGFzcywgLTEpOworCisgICAgICAgICAgICBpZiAoaikgeworICAgICAgICAgICAgICAgIENMRUFSKHRlbXBfZGVjb3JyX3Bhc3Muc2FtcGxlc0EpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXZlcnNlX21vbm9fZGVjb3JyKCZ0ZW1wX2RlY29ycl9wYXNzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KHNhdmVfZGVjb3JyX3Bhc3NlcyArIGosICZ0ZW1wX2RlY29ycl9wYXNzLCBzaXplb2Yoc3RydWN0IERlY29ycikpOworICAgICAgICAgICAgZGVjb3JyX21vbm8ocy0+dGVtcF9idWZmZXJbaiYxXVswXSwgcy0+dGVtcF9idWZmZXJbfmomMV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzLCAmdGVtcF9kZWNvcnJfcGFzcywgMSk7CisgICAgICAgIH0KKworICAgICAgICBzaXplID0gbG9nMm1vbm8ocy0+dGVtcF9idWZmZXJbaiYxXVswXSwgbmJfc2FtcGxlcywgbG9nX2xpbWl0KTsKKyAgICAgICAgaWYgKHNpemUgIT0gVUlOVDMyX01BWCB8fCAhbnRlcm1zKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG50ZXJtcyA+Pj0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplIDwgYmVzdF9zaXplKSB7CisgICAgICAgICAgICBtZW1jcHkocy0+YmVzdF9idWZmZXJbMF0sIHMtPnRlbXBfYnVmZmVyW2omMV1bMF0sIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIG1lbWNweShzLT5kZWNvcnJfcGFzc2VzLCBzYXZlX2RlY29ycl9wYXNzZXMsIHNpemVvZihzdHJ1Y3QgRGVjb3JyKSAqIE1BWF9URVJNUyk7CisgICAgICAgICAgICBzLT5udW1fdGVybXMgPSBudGVybXM7CisgICAgICAgICAgICBzLT5iZXN0X2RlY29yciA9IGM7CisgICAgICAgICAgICBiZXN0X3NpemUgPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBpKyspCisgICAgICAgICAgICBzLT5tYXNrX2RlY29yciA9IHMtPm1hc2tfZGVjb3JyID8gKChzLT5tYXNrX2RlY29yciA8PCAxKSAmIChzLT5udW1fZGVjb3JycyAtIDEpKSA6IDE7CisgICAgfQorCisgICAgaWYgKHMtPmV4dHJhX2ZsYWdzKQorICAgICAgICBhbmFseXplX21vbm8ocywgc2FtcGxlcywgZG9fc2FtcGxlcyk7CisgICAgZWxzZSBpZiAoZG9fc2FtcGxlcykKKyAgICAgICAgbWVtY3B5KHNhbXBsZXMsIHMtPmJlc3RfYnVmZmVyWzBdLCBidWZfc2l6ZSk7CisKKyAgICBpZiAobm9faGlzdG9yeSB8fCBzLT5leHRyYV9mbGFncykgeworICAgICAgICBDTEVBUihzLT53KTsKKyAgICAgICAgc2Nhbl93b3JkKHMsICZzLT53LmNbMF0sIHMtPmJlc3RfYnVmZmVyWzBdLCBuYl9zYW1wbGVzLCAtMSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZWNvcnJfc3RlcmVvKGludDMyX3QgKmluX2xlZnQsIGludDMyX3QgKmluX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpvdXRfbGVmdCwgaW50MzJfdCAqb3V0X3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgc3RydWN0IERlY29yciAqZHBwLCBpbnQgZGlyKQoreworICAgIGludCBtID0gMCwgaTsKKworICAgIGRwcC0+c3VtQSA9IGRwcC0+c3VtQiA9IDA7CisKKyAgICBpZiAoZGlyIDwgMCkgeworICAgICAgICBvdXRfbGVmdCAgKz0gbmJfc2FtcGxlcyAtIDE7CisgICAgICAgIG91dF9yaWdodCArPSBuYl9zYW1wbGVzIC0gMTsKKyAgICAgICAgaW5fbGVmdCAgICs9IG5iX3NhbXBsZXMgLSAxOworICAgICAgICBpbl9yaWdodCAgKz0gbmJfc2FtcGxlcyAtIDE7CisgICAgfQorCisgICAgZHBwLT53ZWlnaHRBID0gcmVzdG9yZV93ZWlnaHQoc3RvcmVfd2VpZ2h0KGRwcC0+d2VpZ2h0QSkpOworICAgIGRwcC0+d2VpZ2h0QiA9IHJlc3RvcmVfd2VpZ2h0KHN0b3JlX3dlaWdodChkcHAtPndlaWdodEIpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVEVSTTsgaSsrKSB7CisgICAgICAgIGRwcC0+c2FtcGxlc0FbaV0gPSB3cF9leHAyKGxvZzJzKGRwcC0+c2FtcGxlc0FbaV0pKTsKKyAgICAgICAgZHBwLT5zYW1wbGVzQltpXSA9IHdwX2V4cDIobG9nMnMoZHBwLT5zYW1wbGVzQltpXSkpOworICAgIH0KKworICAgIHN3aXRjaCAoZHBwLT52YWx1ZSkgeworICAgIGNhc2UgMjoKKyAgICAgICAgd2hpbGUgKG5iX3NhbXBsZXMtLSkgeworICAgICAgICAgICAgaW50MzJfdCBzYW0sIHRtcDsKKworICAgICAgICAgICAgc2FtID0gZHBwLT5zYW1wbGVzQVswXTsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0FbMF0gPSBkcHAtPnNhbXBsZXNBWzFdOworICAgICAgICAgICAgb3V0X2xlZnRbMF0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQVsxXSA9IGluX2xlZnRbMF0pIC0gQVBQTFlfV0VJR0hUKGRwcC0+d2VpZ2h0QSwgc2FtKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFQoZHBwLT53ZWlnaHRBLCBkcHAtPmRlbHRhLCBzYW0sIHRtcCk7CisgICAgICAgICAgICBkcHAtPnN1bUEgKz0gZHBwLT53ZWlnaHRBOworCisgICAgICAgICAgICBzYW0gPSBkcHAtPnNhbXBsZXNCWzBdOworICAgICAgICAgICAgZHBwLT5zYW1wbGVzQlswXSA9IGRwcC0+c2FtcGxlc0JbMV07CisgICAgICAgICAgICBvdXRfcmlnaHRbMF0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQlsxXSA9IGluX3JpZ2h0WzBdKSAtIEFQUExZX1dFSUdIVChkcHAtPndlaWdodEIsIHNhbSk7CisgICAgICAgICAgICBVUERBVEVfV0VJR0hUKGRwcC0+d2VpZ2h0QiwgZHBwLT5kZWx0YSwgc2FtLCB0bXApOworICAgICAgICAgICAgZHBwLT5zdW1CICs9IGRwcC0+d2VpZ2h0QjsKKworICAgICAgICAgICAgaW5fbGVmdCAgICs9IGRpcjsKKyAgICAgICAgICAgIG91dF9sZWZ0ICArPSBkaXI7CisgICAgICAgICAgICBpbl9yaWdodCAgKz0gZGlyOworICAgICAgICAgICAgb3V0X3JpZ2h0ICs9IGRpcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE3OgorICAgICAgICB3aGlsZSAobmJfc2FtcGxlcy0tKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbSwgdG1wOworCisgICAgICAgICAgICBzYW0gPSAyICogZHBwLT5zYW1wbGVzQVswXSAtIGRwcC0+c2FtcGxlc0FbMV07CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNBWzFdID0gZHBwLT5zYW1wbGVzQVswXTsKKyAgICAgICAgICAgIG91dF9sZWZ0WzBdID0gdG1wID0gKGRwcC0+c2FtcGxlc0FbMF0gPSBpbl9sZWZ0WzBdKSAtIEFQUExZX1dFSUdIVChkcHAtPndlaWdodEEsIHNhbSk7CisgICAgICAgICAgICBVUERBVEVfV0VJR0hUKGRwcC0+d2VpZ2h0QSwgZHBwLT5kZWx0YSwgc2FtLCB0bXApOworICAgICAgICAgICAgZHBwLT5zdW1BICs9IGRwcC0+d2VpZ2h0QTsKKworICAgICAgICAgICAgc2FtID0gMiAqIGRwcC0+c2FtcGxlc0JbMF0gLSBkcHAtPnNhbXBsZXNCWzFdOworICAgICAgICAgICAgZHBwLT5zYW1wbGVzQlsxXSA9IGRwcC0+c2FtcGxlc0JbMF07CisgICAgICAgICAgICBvdXRfcmlnaHRbMF0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQlswXSA9IGluX3JpZ2h0WzBdKSAtIEFQUExZX1dFSUdIVCAoZHBwLT53ZWlnaHRCLCBzYW0pOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEIsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKyAgICAgICAgICAgIGRwcC0+c3VtQiArPSBkcHAtPndlaWdodEI7CisKKyAgICAgICAgICAgIGluX2xlZnQgICArPSBkaXI7CisgICAgICAgICAgICBvdXRfbGVmdCAgKz0gZGlyOworICAgICAgICAgICAgaW5fcmlnaHQgICs9IGRpcjsKKyAgICAgICAgICAgIG91dF9yaWdodCArPSBkaXI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxODoKKyAgICAgICAgd2hpbGUgKG5iX3NhbXBsZXMtLSkgeworICAgICAgICAgICAgaW50MzJfdCBzYW0sIHRtcDsKKworICAgICAgICAgICAgc2FtID0gZHBwLT5zYW1wbGVzQVswXSArICgoZHBwLT5zYW1wbGVzQVswXSAtIGRwcC0+c2FtcGxlc0FbMV0pID4+IDEpOworICAgICAgICAgICAgZHBwLT5zYW1wbGVzQVsxXSA9IGRwcC0+c2FtcGxlc0FbMF07CisgICAgICAgICAgICBvdXRfbGVmdFswXSA9IHRtcCA9IChkcHAtPnNhbXBsZXNBWzBdID0gaW5fbGVmdFswXSkgLSBBUFBMWV9XRUlHSFQoZHBwLT53ZWlnaHRBLCBzYW0pOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKyAgICAgICAgICAgIGRwcC0+c3VtQSArPSBkcHAtPndlaWdodEE7CisKKyAgICAgICAgICAgIHNhbSA9IGRwcC0+c2FtcGxlc0JbMF0gKyAoKGRwcC0+c2FtcGxlc0JbMF0gLSBkcHAtPnNhbXBsZXNCWzFdKSA+PiAxKTsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0JbMV0gPSBkcHAtPnNhbXBsZXNCWzBdOworICAgICAgICAgICAgb3V0X3JpZ2h0WzBdID0gdG1wID0gKGRwcC0+c2FtcGxlc0JbMF0gPSBpbl9yaWdodFswXSkgLSBBUFBMWV9XRUlHSFQoZHBwLT53ZWlnaHRCLCBzYW0pOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEIsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKyAgICAgICAgICAgIGRwcC0+c3VtQiArPSBkcHAtPndlaWdodEI7CisKKyAgICAgICAgICAgIGluX2xlZnQgICArPSBkaXI7CisgICAgICAgICAgICBvdXRfbGVmdCAgKz0gZGlyOworICAgICAgICAgICAgaW5fcmlnaHQgICs9IGRpcjsKKyAgICAgICAgICAgIG91dF9yaWdodCArPSBkaXI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogeworICAgICAgICBpbnQgayA9IGRwcC0+dmFsdWUgJiAoTUFYX1RFUk0gLSAxKTsKKworICAgICAgICB3aGlsZSAobmJfc2FtcGxlcy0tKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbSwgdG1wOworCisgICAgICAgICAgICBzYW0gPSBkcHAtPnNhbXBsZXNBW21dOworICAgICAgICAgICAgb3V0X2xlZnRbMF0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQVtrXSA9IGluX2xlZnRbMF0pIC0gQVBQTFlfV0VJR0hUKGRwcC0+d2VpZ2h0QSwgc2FtKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFQoZHBwLT53ZWlnaHRBLCBkcHAtPmRlbHRhLCBzYW0sIHRtcCk7CisgICAgICAgICAgICBkcHAtPnN1bUEgKz0gZHBwLT53ZWlnaHRBOworCisgICAgICAgICAgICBzYW0gPSBkcHAtPnNhbXBsZXNCW21dOworICAgICAgICAgICAgb3V0X3JpZ2h0WzBdID0gdG1wID0gKGRwcC0+c2FtcGxlc0Jba10gPSBpbl9yaWdodFswXSkgLSBBUFBMWV9XRUlHSFQoZHBwLT53ZWlnaHRCLCBzYW0pOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEIsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKyAgICAgICAgICAgIGRwcC0+c3VtQiArPSBkcHAtPndlaWdodEI7CisKKyAgICAgICAgICAgIGluX2xlZnQgICArPSBkaXI7CisgICAgICAgICAgICBvdXRfbGVmdCAgKz0gZGlyOworICAgICAgICAgICAgaW5fcmlnaHQgICs9IGRpcjsKKyAgICAgICAgICAgIG91dF9yaWdodCArPSBkaXI7CisgICAgICAgICAgICBtID0gKG0gKyAxKSAmIChNQVhfVEVSTSAtIDEpOworICAgICAgICAgICAgayA9IChrICsgMSkgJiAoTUFYX1RFUk0gLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtKSB7CisgICAgICAgICAgICBpbnQzMl90IHRlbXBfQVtNQVhfVEVSTV0sIHRlbXBfQltNQVhfVEVSTV07CisgICAgICAgICAgICBpbnQgazsKKworICAgICAgICAgICAgbWVtY3B5KHRlbXBfQSwgZHBwLT5zYW1wbGVzQSwgc2l6ZW9mKGRwcC0+c2FtcGxlc0EpKTsKKyAgICAgICAgICAgIG1lbWNweSh0ZW1wX0IsIGRwcC0+c2FtcGxlc0IsIHNpemVvZihkcHAtPnNhbXBsZXNCKSk7CisKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBNQVhfVEVSTTsgaysrKSB7CisgICAgICAgICAgICAgICAgZHBwLT5zYW1wbGVzQVtrXSA9IHRlbXBfQVttXTsKKyAgICAgICAgICAgICAgICBkcHAtPnNhbXBsZXNCW2tdID0gdGVtcF9CW21dOworICAgICAgICAgICAgICAgIG0gPSAobSArIDEpICYgKE1BWF9URVJNIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIC0xOgorICAgICAgICB3aGlsZSAobmJfc2FtcGxlcy0tKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbV9BLCBzYW1fQiwgdG1wOworCisgICAgICAgICAgICBzYW1fQSA9IGRwcC0+c2FtcGxlc0FbMF07CisgICAgICAgICAgICBvdXRfbGVmdFswXSA9IHRtcCA9IChzYW1fQiA9IGluX2xlZnRbMF0pIC0gQVBQTFlfV0VJR0hUKGRwcC0+d2VpZ2h0QSwgc2FtX0EpOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVF9DTElQKGRwcC0+d2VpZ2h0QSwgZHBwLT5kZWx0YSwgc2FtX0EsIHRtcCk7CisgICAgICAgICAgICBkcHAtPnN1bUEgKz0gZHBwLT53ZWlnaHRBOworCisgICAgICAgICAgICBvdXRfcmlnaHRbMF0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQVswXSA9IGluX3JpZ2h0WzBdKSAtIEFQUExZX1dFSUdIVChkcHAtPndlaWdodEIsIHNhbV9CKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFRfQ0xJUChkcHAtPndlaWdodEIsIGRwcC0+ZGVsdGEsIHNhbV9CLCB0bXApOworICAgICAgICAgICAgZHBwLT5zdW1CICs9IGRwcC0+d2VpZ2h0QjsKKworICAgICAgICAgICAgaW5fbGVmdCAgICs9IGRpcjsKKyAgICAgICAgICAgIG91dF9sZWZ0ICArPSBkaXI7CisgICAgICAgICAgICBpbl9yaWdodCAgKz0gZGlyOworICAgICAgICAgICAgb3V0X3JpZ2h0ICs9IGRpcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIC0yOgorICAgICAgICB3aGlsZSAobmJfc2FtcGxlcy0tKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbV9BLCBzYW1fQiwgdG1wOworCisgICAgICAgICAgICBzYW1fQiA9IGRwcC0+c2FtcGxlc0JbMF07CisgICAgICAgICAgICBvdXRfcmlnaHRbMF0gPSB0bXAgPSAoc2FtX0EgPSBpbl9yaWdodFswXSkgLSBBUFBMWV9XRUlHSFQoZHBwLT53ZWlnaHRCLCBzYW1fQik7CisgICAgICAgICAgICBVUERBVEVfV0VJR0hUX0NMSVAoZHBwLT53ZWlnaHRCLCBkcHAtPmRlbHRhLCBzYW1fQiwgdG1wKTsKKyAgICAgICAgICAgIGRwcC0+c3VtQiArPSBkcHAtPndlaWdodEI7CisKKyAgICAgICAgICAgIG91dF9sZWZ0WzBdID0gdG1wID0gKGRwcC0+c2FtcGxlc0JbMF0gPSBpbl9sZWZ0WzBdKSAtIEFQUExZX1dFSUdIVChkcHAtPndlaWdodEEsIHNhbV9BKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFRfQ0xJUChkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbV9BLCB0bXApOworICAgICAgICAgICAgZHBwLT5zdW1BICs9IGRwcC0+d2VpZ2h0QTsKKworICAgICAgICAgICAgaW5fbGVmdCAgICs9IGRpcjsKKyAgICAgICAgICAgIG91dF9sZWZ0ICArPSBkaXI7CisgICAgICAgICAgICBpbl9yaWdodCAgKz0gZGlyOworICAgICAgICAgICAgb3V0X3JpZ2h0ICs9IGRpcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIC0zOgorICAgICAgICB3aGlsZSAobmJfc2FtcGxlcy0tKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbV9BLCBzYW1fQiwgdG1wOworCisgICAgICAgICAgICBzYW1fQSA9IGRwcC0+c2FtcGxlc0FbMF07CisgICAgICAgICAgICBzYW1fQiA9IGRwcC0+c2FtcGxlc0JbMF07CisKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0FbMF0gPSB0bXAgPSBpbl9yaWdodFswXTsKKyAgICAgICAgICAgIG91dF9yaWdodFswXSA9IHRtcCAtPSBBUFBMWV9XRUlHSFQoZHBwLT53ZWlnaHRCLCBzYW1fQik7CisgICAgICAgICAgICBVUERBVEVfV0VJR0hUX0NMSVAoZHBwLT53ZWlnaHRCLCBkcHAtPmRlbHRhLCBzYW1fQiwgdG1wKTsKKyAgICAgICAgICAgIGRwcC0+c3VtQiArPSBkcHAtPndlaWdodEI7CisKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0JbMF0gPSB0bXAgPSBpbl9sZWZ0WzBdOworICAgICAgICAgICAgb3V0X2xlZnRbMF0gPSB0bXAgLT0gQVBQTFlfV0VJR0hUKGRwcC0+d2VpZ2h0QSwgc2FtX0EpOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVF9DTElQKGRwcC0+d2VpZ2h0QSwgZHBwLT5kZWx0YSwgc2FtX0EsIHRtcCk7CisgICAgICAgICAgICBkcHAtPnN1bUEgKz0gZHBwLT53ZWlnaHRBOworCisgICAgICAgICAgICBpbl9sZWZ0ICAgKz0gZGlyOworICAgICAgICAgICAgb3V0X2xlZnQgICs9IGRpcjsKKyAgICAgICAgICAgIGluX3JpZ2h0ICArPSBkaXI7CisgICAgICAgICAgICBvdXRfcmlnaHQgKz0gZGlyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmV2ZXJzZV9kZWNvcnIoc3RydWN0IERlY29yciAqZHBwKQoreworICAgIGlmIChkcHAtPnZhbHVlID4gTUFYX1RFUk0pIHsKKyAgICAgICAgaW50MzJfdCBzYW1fQSwgc2FtX0I7CisKKyAgICAgICAgaWYgKGRwcC0+dmFsdWUgJiAxKSB7CisgICAgICAgICAgICBzYW1fQSA9IDIgKiBkcHAtPnNhbXBsZXNBWzBdIC0gZHBwLT5zYW1wbGVzQVsxXTsKKyAgICAgICAgICAgIHNhbV9CID0gMiAqIGRwcC0+c2FtcGxlc0JbMF0gLSBkcHAtPnNhbXBsZXNCWzFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2FtX0EgPSAoMyAqIGRwcC0+c2FtcGxlc0FbMF0gLSBkcHAtPnNhbXBsZXNBWzFdKSA+PiAxOworICAgICAgICAgICAgc2FtX0IgPSAoMyAqIGRwcC0+c2FtcGxlc0JbMF0gLSBkcHAtPnNhbXBsZXNCWzFdKSA+PiAxOworICAgICAgICB9CisKKyAgICAgICAgZHBwLT5zYW1wbGVzQVsxXSA9IGRwcC0+c2FtcGxlc0FbMF07CisgICAgICAgIGRwcC0+c2FtcGxlc0JbMV0gPSBkcHAtPnNhbXBsZXNCWzBdOworICAgICAgICBkcHAtPnNhbXBsZXNBWzBdID0gc2FtX0E7CisgICAgICAgIGRwcC0+c2FtcGxlc0JbMF0gPSBzYW1fQjsKKworICAgICAgICBpZiAoZHBwLT52YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIHNhbV9BID0gMiAqIGRwcC0+c2FtcGxlc0FbMF0gLSBkcHAtPnNhbXBsZXNBWzFdOworICAgICAgICAgICAgc2FtX0IgPSAyICogZHBwLT5zYW1wbGVzQlswXSAtIGRwcC0+c2FtcGxlc0JbMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzYW1fQSA9ICgzICogZHBwLT5zYW1wbGVzQVswXSAtIGRwcC0+c2FtcGxlc0FbMV0pID4+IDE7CisgICAgICAgICAgICBzYW1fQiA9ICgzICogZHBwLT5zYW1wbGVzQlswXSAtIGRwcC0+c2FtcGxlc0JbMV0pID4+IDE7CisgICAgICAgIH0KKworICAgICAgICBkcHAtPnNhbXBsZXNBWzFdID0gc2FtX0E7CisgICAgICAgIGRwcC0+c2FtcGxlc0JbMV0gPSBzYW1fQjsKKyAgICB9IGVsc2UgaWYgKGRwcC0+dmFsdWUgPiAxKSB7CisgICAgICAgIGludCBpLCBqLCBrOworCisgICAgICAgIGZvciAoaSA9IDAsIGogPSBkcHAtPnZhbHVlIC0gMSwgayA9IDA7IGsgPCBkcHAtPnZhbHVlIC8gMjsgaSsrLCBqLS0sIGsrKykgeworICAgICAgICAgICAgaSAmPSAoTUFYX1RFUk0gLSAxKTsKKyAgICAgICAgICAgIGogJj0gKE1BWF9URVJNIC0gMSk7CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNBW2ldIF49IGRwcC0+c2FtcGxlc0Fbal07CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNBW2pdIF49IGRwcC0+c2FtcGxlc0FbaV07CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNBW2ldIF49IGRwcC0+c2FtcGxlc0Fbal07CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNCW2ldIF49IGRwcC0+c2FtcGxlc0Jbal07CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNCW2pdIF49IGRwcC0+c2FtcGxlc0JbaV07CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNCW2ldIF49IGRwcC0+c2FtcGxlc0Jbal07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29ycl9zdGVyZW9fcXVpY2soaW50MzJfdCAqaW5fbGVmdCwgIGludDMyX3QgKmluX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpvdXRfbGVmdCwgaW50MzJfdCAqb3V0X3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgc3RydWN0IERlY29yciAqZHBwKQoreworICAgIGludCBtID0gMCwgaTsKKworICAgIGRwcC0+d2VpZ2h0QSA9IHJlc3RvcmVfd2VpZ2h0KHN0b3JlX3dlaWdodChkcHAtPndlaWdodEEpKTsKKyAgICBkcHAtPndlaWdodEIgPSByZXN0b3JlX3dlaWdodChzdG9yZV93ZWlnaHQoZHBwLT53ZWlnaHRCKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RFUk07IGkrKykgeworICAgICAgICBkcHAtPnNhbXBsZXNBW2ldID0gd3BfZXhwMihsb2cycyhkcHAtPnNhbXBsZXNBW2ldKSk7CisgICAgICAgIGRwcC0+c2FtcGxlc0JbaV0gPSB3cF9leHAyKGxvZzJzKGRwcC0+c2FtcGxlc0JbaV0pKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGRwcC0+dmFsdWUpIHsKKyAgICBjYXNlIDI6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtLCB0bXA7CisKKyAgICAgICAgICAgIHNhbSA9IGRwcC0+c2FtcGxlc0FbMF07CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNBWzBdID0gZHBwLT5zYW1wbGVzQVsxXTsKKyAgICAgICAgICAgIG91dF9sZWZ0W2ldID0gdG1wID0gKGRwcC0+c2FtcGxlc0FbMV0gPSBpbl9sZWZ0W2ldKSAtIEFQUExZX1dFSUdIVF9JKGRwcC0+d2VpZ2h0QSwgc2FtKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFQoZHBwLT53ZWlnaHRBLCBkcHAtPmRlbHRhLCBzYW0sIHRtcCk7CisKKyAgICAgICAgICAgIHNhbSA9IGRwcC0+c2FtcGxlc0JbMF07CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNCWzBdID0gZHBwLT5zYW1wbGVzQlsxXTsKKyAgICAgICAgICAgIG91dF9yaWdodFtpXSA9IHRtcCA9IChkcHAtPnNhbXBsZXNCWzFdID0gaW5fcmlnaHRbaV0pIC0gQVBQTFlfV0VJR0hUX0koZHBwLT53ZWlnaHRCLCBzYW0pOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEIsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE3OgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbSwgdG1wOworCisgICAgICAgICAgICBzYW0gPSAyICogZHBwLT5zYW1wbGVzQVswXSAtIGRwcC0+c2FtcGxlc0FbMV07CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNBWzFdID0gZHBwLT5zYW1wbGVzQVswXTsKKyAgICAgICAgICAgIG91dF9sZWZ0W2ldID0gdG1wID0gKGRwcC0+c2FtcGxlc0FbMF0gPSBpbl9sZWZ0W2ldKSAtIEFQUExZX1dFSUdIVF9JKGRwcC0+d2VpZ2h0QSwgc2FtKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFQoZHBwLT53ZWlnaHRBLCBkcHAtPmRlbHRhLCBzYW0sIHRtcCk7CisKKyAgICAgICAgICAgIHNhbSA9IDIgKiBkcHAtPnNhbXBsZXNCWzBdIC0gZHBwLT5zYW1wbGVzQlsxXTsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0JbMV0gPSBkcHAtPnNhbXBsZXNCWzBdOworICAgICAgICAgICAgb3V0X3JpZ2h0W2ldID0gdG1wID0gKGRwcC0+c2FtcGxlc0JbMF0gPSBpbl9yaWdodFtpXSkgLSBBUFBMWV9XRUlHSFRfSShkcHAtPndlaWdodEIsIHNhbSk7CisgICAgICAgICAgICBVUERBVEVfV0VJR0hUKGRwcC0+d2VpZ2h0QiwgZHBwLT5kZWx0YSwgc2FtLCB0bXApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTg6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtLCB0bXA7CisKKyAgICAgICAgICAgIHNhbSA9IGRwcC0+c2FtcGxlc0FbMF0gKyAoKGRwcC0+c2FtcGxlc0FbMF0gLSBkcHAtPnNhbXBsZXNBWzFdKSA+PiAxKTsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0FbMV0gPSBkcHAtPnNhbXBsZXNBWzBdOworICAgICAgICAgICAgb3V0X2xlZnRbaV0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQVswXSA9IGluX2xlZnRbaV0pIC0gQVBQTFlfV0VJR0hUX0koZHBwLT53ZWlnaHRBLCBzYW0pOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKworICAgICAgICAgICAgc2FtID0gZHBwLT5zYW1wbGVzQlswXSArICgoZHBwLT5zYW1wbGVzQlswXSAtIGRwcC0+c2FtcGxlc0JbMV0pID4+IDEpOworICAgICAgICAgICAgZHBwLT5zYW1wbGVzQlsxXSA9IGRwcC0+c2FtcGxlc0JbMF07CisgICAgICAgICAgICBvdXRfcmlnaHRbaV0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQlswXSA9IGluX3JpZ2h0W2ldKSAtIEFQUExZX1dFSUdIVF9JKGRwcC0+d2VpZ2h0Qiwgc2FtKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFQoZHBwLT53ZWlnaHRCLCBkcHAtPmRlbHRhLCBzYW0sIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogeworICAgICAgICBpbnQgayA9IGRwcC0+dmFsdWUgJiAoTUFYX1RFUk0gLSAxKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbSwgdG1wOworCisgICAgICAgICAgICBzYW0gPSBkcHAtPnNhbXBsZXNBW21dOworICAgICAgICAgICAgb3V0X2xlZnRbaV0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQVtrXSA9IGluX2xlZnRbaV0pIC0gQVBQTFlfV0VJR0hUX0koZHBwLT53ZWlnaHRBLCBzYW0pOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKworICAgICAgICAgICAgc2FtID0gZHBwLT5zYW1wbGVzQlttXTsKKyAgICAgICAgICAgIG91dF9yaWdodFtpXSA9IHRtcCA9IChkcHAtPnNhbXBsZXNCW2tdID0gaW5fcmlnaHRbaV0pIC0gQVBQTFlfV0VJR0hUX0koZHBwLT53ZWlnaHRCLCBzYW0pOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEIsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKworICAgICAgICAgICAgbSA9IChtICsgMSkgJiAoTUFYX1RFUk0gLSAxKTsKKyAgICAgICAgICAgIGsgPSAoayArIDEpICYgKE1BWF9URVJNIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobSkgeworICAgICAgICAgICAgaW50MzJfdCB0ZW1wX0FbTUFYX1RFUk1dLCB0ZW1wX0JbTUFYX1RFUk1dOworICAgICAgICAgICAgaW50IGs7CisKKyAgICAgICAgICAgIG1lbWNweSh0ZW1wX0EsIGRwcC0+c2FtcGxlc0EsIHNpemVvZihkcHAtPnNhbXBsZXNBKSk7CisgICAgICAgICAgICBtZW1jcHkodGVtcF9CLCBkcHAtPnNhbXBsZXNCLCBzaXplb2YoZHBwLT5zYW1wbGVzQikpOworCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTUFYX1RFUk07IGsrKykgeworICAgICAgICAgICAgICAgIGRwcC0+c2FtcGxlc0Fba10gPSB0ZW1wX0FbbV07CisgICAgICAgICAgICAgICAgZHBwLT5zYW1wbGVzQltrXSA9IHRlbXBfQlttXTsKKyAgICAgICAgICAgICAgICBtID0gKG0gKyAxKSAmIChNQVhfVEVSTSAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbV9BLCBzYW1fQiwgdG1wOworCisgICAgICAgICAgICBzYW1fQSA9IGRwcC0+c2FtcGxlc0FbMF07CisgICAgICAgICAgICBvdXRfbGVmdFtpXSA9IHRtcCA9IChzYW1fQiA9IGluX2xlZnRbaV0pIC0gQVBQTFlfV0VJR0hUX0koZHBwLT53ZWlnaHRBLCBzYW1fQSk7CisgICAgICAgICAgICBVUERBVEVfV0VJR0hUX0NMSVAoZHBwLT53ZWlnaHRBLCBkcHAtPmRlbHRhLCBzYW1fQSwgdG1wKTsKKworICAgICAgICAgICAgb3V0X3JpZ2h0W2ldID0gdG1wID0gKGRwcC0+c2FtcGxlc0FbMF0gPSBpbl9yaWdodFtpXSkgLSBBUFBMWV9XRUlHSFRfSShkcHAtPndlaWdodEIsIHNhbV9CKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFRfQ0xJUChkcHAtPndlaWdodEIsIGRwcC0+ZGVsdGEsIHNhbV9CLCB0bXApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgLTI6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtX0EsIHNhbV9CLCB0bXA7CisKKyAgICAgICAgICAgIHNhbV9CID0gZHBwLT5zYW1wbGVzQlswXTsKKyAgICAgICAgICAgIG91dF9yaWdodFtpXSA9IHRtcCA9IChzYW1fQSA9IGluX3JpZ2h0W2ldKSAtIEFQUExZX1dFSUdIVF9JKGRwcC0+d2VpZ2h0Qiwgc2FtX0IpOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVF9DTElQKGRwcC0+d2VpZ2h0QiwgZHBwLT5kZWx0YSwgc2FtX0IsIHRtcCk7CisKKyAgICAgICAgICAgIG91dF9sZWZ0W2ldID0gdG1wID0gKGRwcC0+c2FtcGxlc0JbMF0gPSBpbl9sZWZ0W2ldKSAtIEFQUExZX1dFSUdIVF9JKGRwcC0+d2VpZ2h0QSwgc2FtX0EpOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVF9DTElQKGRwcC0+d2VpZ2h0QSwgZHBwLT5kZWx0YSwgc2FtX0EsIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAtMzoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBzYW1fQSwgc2FtX0IsIHRtcDsKKworICAgICAgICAgICAgc2FtX0EgPSBkcHAtPnNhbXBsZXNBWzBdOworICAgICAgICAgICAgc2FtX0IgPSBkcHAtPnNhbXBsZXNCWzBdOworCisgICAgICAgICAgICBkcHAtPnNhbXBsZXNBWzBdID0gdG1wID0gaW5fcmlnaHRbaV07CisgICAgICAgICAgICBvdXRfcmlnaHRbaV0gPSB0bXAgLT0gQVBQTFlfV0VJR0hUX0koZHBwLT53ZWlnaHRCLCBzYW1fQik7CisgICAgICAgICAgICBVUERBVEVfV0VJR0hUX0NMSVAoZHBwLT53ZWlnaHRCLCBkcHAtPmRlbHRhLCBzYW1fQiwgdG1wKTsKKworICAgICAgICAgICAgZHBwLT5zYW1wbGVzQlswXSA9IHRtcCA9IGluX2xlZnRbaV07CisgICAgICAgICAgICBvdXRfbGVmdFtpXSA9IHRtcCAtPSBBUFBMWV9XRUlHSFRfSShkcHAtPndlaWdodEEsIHNhbV9BKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFRfQ0xJUChkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbV9BLCB0bXApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb3JyX3N0ZXJlb19idWZmZXIoV2F2UGFja0V4dHJhSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmluX2xlZnQsICBpbnQzMl90ICppbl9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKm91dF9sZWZ0LCBpbnQzMl90ICpvdXRfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IHRpbmRleCkKK3sKKyAgICBzdHJ1Y3QgRGVjb3JyIGRwID0gezB9LCAqZHBwaSA9IGluZm8tPmRwcyArIHRpbmRleDsKKyAgICBpbnQgZGVsdGEgPSBkcHBpLT5kZWx0YSwgcHJlX2RlbHRhOworICAgIGludCB0ZXJtID0gZHBwaS0+dmFsdWU7CisKKyAgICBpZiAoZGVsdGEgPT0gNykKKyAgICAgICAgcHJlX2RlbHRhID0gNzsKKyAgICBlbHNlIGlmIChkZWx0YSA8IDIpCisgICAgICAgIHByZV9kZWx0YSA9IDM7CisgICAgZWxzZQorICAgICAgICBwcmVfZGVsdGEgPSBkZWx0YSArIDE7CisKKyAgICBkcC52YWx1ZSA9IHRlcm07CisgICAgZHAuZGVsdGEgPSBwcmVfZGVsdGE7CisgICAgZGVjb3JyX3N0ZXJlbyhpbl9sZWZ0LCBpbl9yaWdodCwgb3V0X2xlZnQsIG91dF9yaWdodCwKKyAgICAgICAgICAgICAgICAgIEZGTUlOKDIwNDgsIG5iX3NhbXBsZXMpLCAmZHAsIC0xKTsKKyAgICBkcC5kZWx0YSA9IGRlbHRhOworCisgICAgaWYgKHRpbmRleCA9PSAwKSB7CisgICAgICAgIHJldmVyc2VfZGVjb3JyKCZkcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0xFQVIoZHAuc2FtcGxlc0EpOworICAgICAgICBDTEVBUihkcC5zYW1wbGVzQik7CisgICAgfQorCisgICAgbWVtY3B5KGRwcGktPnNhbXBsZXNBLCBkcC5zYW1wbGVzQSwgc2l6ZW9mKGRwLnNhbXBsZXNBKSk7CisgICAgbWVtY3B5KGRwcGktPnNhbXBsZXNCLCBkcC5zYW1wbGVzQiwgc2l6ZW9mKGRwLnNhbXBsZXNCKSk7CisgICAgZHBwaS0+d2VpZ2h0QSA9IGRwLndlaWdodEE7CisgICAgZHBwaS0+d2VpZ2h0QiA9IGRwLndlaWdodEI7CisKKyAgICBpZiAoZGVsdGEgPT0gMCkgeworICAgICAgICBkcC5kZWx0YSA9IDE7CisgICAgICAgIGRlY29ycl9zdGVyZW8oaW5fbGVmdCwgaW5fcmlnaHQsIG91dF9sZWZ0LCBvdXRfcmlnaHQsIG5iX3NhbXBsZXMsICZkcCwgMSk7CisgICAgICAgIGRwLmRlbHRhID0gMDsKKyAgICAgICAgbWVtY3B5KGRwLnNhbXBsZXNBLCBkcHBpLT5zYW1wbGVzQSwgc2l6ZW9mKGRwLnNhbXBsZXNBKSk7CisgICAgICAgIG1lbWNweShkcC5zYW1wbGVzQiwgZHBwaS0+c2FtcGxlc0IsIHNpemVvZihkcC5zYW1wbGVzQikpOworICAgICAgICBkcHBpLT53ZWlnaHRBID0gZHAud2VpZ2h0QSA9IGRwLnN1bUEgLyBuYl9zYW1wbGVzOworICAgICAgICBkcHBpLT53ZWlnaHRCID0gZHAud2VpZ2h0QiA9IGRwLnN1bUIgLyBuYl9zYW1wbGVzOworICAgIH0KKworICAgIGlmIChpbmZvLT5ndDE2Yml0KQorICAgICAgICBkZWNvcnJfc3RlcmVvKGluX2xlZnQsIGluX3JpZ2h0LCBvdXRfbGVmdCwgb3V0X3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfc2FtcGxlcywgJmRwLCAxKTsKKyAgICBlbHNlCisgICAgICAgIGRlY29ycl9zdGVyZW9fcXVpY2soaW5fbGVmdCwgaW5fcmlnaHQsIG91dF9sZWZ0LCBvdXRfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfc2FtcGxlcywgJmRwKTsKK30KKworc3RhdGljIHZvaWQgc29ydF9zdGVyZW8oV2F2UGFja0VuY29kZUNvbnRleHQgKnMsIFdhdlBhY2tFeHRyYUluZm8gKmluZm8pCit7CisgICAgaW50IHJldmVyc2VkID0gMTsKKyAgICB1aW50MzJfdCBiaXRzOworCisgICAgd2hpbGUgKHJldmVyc2VkKSB7CisgICAgICAgIGludCByaSwgaTsKKworICAgICAgICBtZW1jcHkoaW5mby0+ZHBzLCBzLT5kZWNvcnJfcGFzc2VzLCBzaXplb2Yocy0+ZGVjb3JyX3Bhc3NlcykpOworICAgICAgICByZXZlcnNlZCA9IDA7CisKKyAgICAgICAgZm9yIChyaSA9IDA7IHJpIDwgaW5mby0+bnRlcm1zICYmIHMtPmRlY29ycl9wYXNzZXNbcmldLnZhbHVlOyByaSsrKSB7CisKKyAgICAgICAgICAgIGlmIChyaSArIDEgPj0gaW5mby0+bnRlcm1zIHx8ICFzLT5kZWNvcnJfcGFzc2VzW3JpKzFdLnZhbHVlKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAocy0+ZGVjb3JyX3Bhc3Nlc1tyaV0udmFsdWUgPT0gcy0+ZGVjb3JyX3Bhc3Nlc1tyaSsxXS52YWx1ZSkgeworICAgICAgICAgICAgICAgIGRlY29ycl9zdGVyZW9fYnVmZmVyKGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2FtcGxlcHRyc1tyaSAgXVswXSwgcy0+c2FtcGxlcHRyc1tyaSAgXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYW1wbGVwdHJzW3JpKzFdWzBdLCBzLT5zYW1wbGVwdHJzW3JpKzFdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3NhbXBsZXMsIHJpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5mby0+ZHBzW3JpICBdID0gcy0+ZGVjb3JyX3Bhc3Nlc1tyaSsxXTsKKyAgICAgICAgICAgIGluZm8tPmRwc1tyaSsxXSA9IHMtPmRlY29ycl9wYXNzZXNbcmkgIF07CisKKyAgICAgICAgICAgIGZvciAoaSA9IHJpOyBpIDwgaW5mby0+bnRlcm1zICYmIHMtPmRlY29ycl9wYXNzZXNbaV0udmFsdWU7IGkrKykKKyAgICAgICAgICAgICAgICBkZWNvcnJfc3RlcmVvX2J1ZmZlcihpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNhbXBsZXB0cnNbaSAgXVswXSwgcy0+c2FtcGxlcHRyc1tpICBdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNhbXBsZXB0cnNbaSsxXVswXSwgcy0+c2FtcGxlcHRyc1tpKzFdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3NhbXBsZXMsIGkpOworCisgICAgICAgICAgICBiaXRzID0gbG9nMnN0ZXJlbyhzLT5zYW1wbGVwdHJzW2ldWzBdLCBzLT5zYW1wbGVwdHJzW2ldWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcywgaW5mby0+bG9nX2xpbWl0KTsKKworICAgICAgICAgICAgaWYgKGJpdHMgPCBpbmZvLT5iZXN0X2JpdHMpIHsKKyAgICAgICAgICAgICAgICByZXZlcnNlZCA9IDE7CisgICAgICAgICAgICAgICAgaW5mby0+YmVzdF9iaXRzID0gYml0czsKKyAgICAgICAgICAgICAgICBDTEVBUihzLT5kZWNvcnJfcGFzc2VzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+ZGVjb3JyX3Bhc3NlcywgaW5mby0+ZHBzLCBzaXplb2YoaW5mby0+ZHBzWzBdKSAqIGkpOworICAgICAgICAgICAgICAgIG1lbWNweShzLT5zYW1wbGVwdHJzW2luZm8tPm50ZXJtcyArIDFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5zYW1wbGVwdHJzW2ldWzBdLCBzLT5ibG9ja19zYW1wbGVzICogNCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHMtPnNhbXBsZXB0cnNbaW5mby0+bnRlcm1zICsgMV1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgIHMtPnNhbXBsZXB0cnNbaV1bMV0sIHMtPmJsb2NrX3NhbXBsZXMgKiA0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5mby0+ZHBzW3JpICBdID0gcy0+ZGVjb3JyX3Bhc3Nlc1tyaSAgXTsKKyAgICAgICAgICAgICAgICBpbmZvLT5kcHNbcmkrMV0gPSBzLT5kZWNvcnJfcGFzc2VzW3JpKzFdOworICAgICAgICAgICAgICAgIGRlY29ycl9zdGVyZW9fYnVmZmVyKGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2FtcGxlcHRyc1tyaSAgXVswXSwgcy0+c2FtcGxlcHRyc1tyaSAgXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYW1wbGVwdHJzW3JpKzFdWzBdLCBzLT5zYW1wbGVwdHJzW3JpKzFdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3NhbXBsZXMsIHJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVsdGFfc3RlcmVvKFdhdlBhY2tFbmNvZGVDb250ZXh0ICpzLCBXYXZQYWNrRXh0cmFJbmZvICppbmZvKQoreworICAgIGludCBsb3dlciA9IDAsIGRlbHRhLCBkLCBpOworICAgIHVpbnQzMl90IGJpdHM7CisKKyAgICBpZiAoIXMtPmRlY29ycl9wYXNzZXNbMF0udmFsdWUpCisgICAgICAgIHJldHVybjsKKyAgICBkZWx0YSA9IHMtPmRlY29ycl9wYXNzZXNbMF0uZGVsdGE7CisKKyAgICBmb3IgKGQgPSBkZWx0YSAtIDE7IGQgPj0gMDsgZC0tKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5udGVybXMgJiYgcy0+ZGVjb3JyX3Bhc3Nlc1tpXS52YWx1ZTsgaSsrKSB7CisgICAgICAgICAgICBpbmZvLT5kcHNbaV0udmFsdWUgPSBzLT5kZWNvcnJfcGFzc2VzW2ldLnZhbHVlOworICAgICAgICAgICAgaW5mby0+ZHBzW2ldLmRlbHRhID0gZDsKKyAgICAgICAgICAgIGRlY29ycl9zdGVyZW9fYnVmZmVyKGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYW1wbGVwdHJzW2kgIF1bMF0sIHMtPnNhbXBsZXB0cnNbaSAgXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNhbXBsZXB0cnNbaSsxXVswXSwgcy0+c2FtcGxlcHRyc1tpKzFdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcywgaSk7CisgICAgICAgIH0KKworICAgICAgICBiaXRzID0gbG9nMnN0ZXJlbyhzLT5zYW1wbGVwdHJzW2ldWzBdLCBzLT5zYW1wbGVwdHJzW2ldWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zYW1wbGVzLCBpbmZvLT5sb2dfbGltaXQpOworICAgICAgICBpZiAoYml0cyA+PSBpbmZvLT5iZXN0X2JpdHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbG93ZXIgPSAxOworICAgICAgICBpbmZvLT5iZXN0X2JpdHMgPSBiaXRzOworICAgICAgICBDTEVBUihzLT5kZWNvcnJfcGFzc2VzKTsKKyAgICAgICAgbWVtY3B5KHMtPmRlY29ycl9wYXNzZXMsIGluZm8tPmRwcywgc2l6ZW9mKGluZm8tPmRwc1swXSkgKiBpKTsKKyAgICAgICAgbWVtY3B5KHMtPnNhbXBsZXB0cnNbaW5mby0+bnRlcm1zICsgMV1bMF0sIHMtPnNhbXBsZXB0cnNbaV1bMF0sCisgICAgICAgICAgICAgICBzLT5ibG9ja19zYW1wbGVzICogNCk7CisgICAgICAgIG1lbWNweShzLT5zYW1wbGVwdHJzW2luZm8tPm50ZXJtcyArIDFdWzFdLCBzLT5zYW1wbGVwdHJzW2ldWzFdLAorICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcyAqIDQpOworICAgIH0KKworICAgIGZvciAoZCA9IGRlbHRhICsgMTsgIWxvd2VyICYmIGQgPD0gNzsgZCsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5udGVybXMgJiYgcy0+ZGVjb3JyX3Bhc3Nlc1tpXS52YWx1ZTsgaSsrKSB7CisgICAgICAgICAgICBpbmZvLT5kcHNbaV0udmFsdWUgPSBzLT5kZWNvcnJfcGFzc2VzW2ldLnZhbHVlOworICAgICAgICAgICAgaW5mby0+ZHBzW2ldLmRlbHRhID0gZDsKKyAgICAgICAgICAgIGRlY29ycl9zdGVyZW9fYnVmZmVyKGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYW1wbGVwdHJzW2kgIF1bMF0sIHMtPnNhbXBsZXB0cnNbaSAgXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNhbXBsZXB0cnNbaSsxXVswXSwgcy0+c2FtcGxlcHRyc1tpKzFdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcywgaSk7CisgICAgICAgIH0KKworICAgICAgICBiaXRzID0gbG9nMnN0ZXJlbyhzLT5zYW1wbGVwdHJzW2ldWzBdLCBzLT5zYW1wbGVwdHJzW2ldWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zYW1wbGVzLCBpbmZvLT5sb2dfbGltaXQpOworCisgICAgICAgIGlmIChiaXRzIDwgaW5mby0+YmVzdF9iaXRzKSB7CisgICAgICAgICAgICBpbmZvLT5iZXN0X2JpdHMgPSBiaXRzOworICAgICAgICAgICAgQ0xFQVIocy0+ZGVjb3JyX3Bhc3Nlcyk7CisgICAgICAgICAgICBtZW1jcHkocy0+ZGVjb3JyX3Bhc3NlcywgaW5mby0+ZHBzLCBzaXplb2YoaW5mby0+ZHBzWzBdKSAqIGkpOworICAgICAgICAgICAgbWVtY3B5KHMtPnNhbXBsZXB0cnNbaW5mby0+bnRlcm1zICsgMV1bMF0sCisgICAgICAgICAgICAgICAgICAgcy0+c2FtcGxlcHRyc1tpXVswXSwgcy0+YmxvY2tfc2FtcGxlcyAqIDQpOworICAgICAgICAgICAgbWVtY3B5KHMtPnNhbXBsZXB0cnNbaW5mby0+bnRlcm1zICsgMV1bMV0sCisgICAgICAgICAgICAgICAgICAgcy0+c2FtcGxlcHRyc1tpXVsxXSwgcy0+YmxvY2tfc2FtcGxlcyAqIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVjdXJzZV9zdGVyZW8oV2F2UGFja0VuY29kZUNvbnRleHQgKnMsIFdhdlBhY2tFeHRyYUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgsIGludCBkZWx0YSwgdWludDMyX3QgaW5wdXRfYml0cykKK3sKKyAgICBpbnQgdGVybSwgYnJhbmNoZXMgPSBzLT5udW1fYnJhbmNoZXMgLSBkZXB0aDsKKyAgICBpbnQzMl90ICppbl9sZWZ0LCAqaW5fcmlnaHQsICpvdXRfbGVmdCwgKm91dF9yaWdodDsKKyAgICB1aW50MzJfdCB0ZXJtX2JpdHNbMjJdLCBiaXRzOworCisgICAgaWYgKGJyYW5jaGVzIDwgMSB8fCBkZXB0aCArIDEgPT0gaW5mby0+bnRlcm1zKQorICAgICAgICBicmFuY2hlcyA9IDE7CisKKyAgICBDTEVBUih0ZXJtX2JpdHMpOworICAgIGluX2xlZnQgICA9IHMtPnNhbXBsZXB0cnNbZGVwdGggICAgXVswXTsKKyAgICBpbl9yaWdodCAgPSBzLT5zYW1wbGVwdHJzW2RlcHRoICAgIF1bMV07CisgICAgb3V0X2xlZnQgID0gcy0+c2FtcGxlcHRyc1tkZXB0aCArIDFdWzBdOworICAgIG91dF9yaWdodCA9IHMtPnNhbXBsZXB0cnNbZGVwdGggKyAxXVsxXTsKKworICAgIGZvciAodGVybSA9IC0zOyB0ZXJtIDw9IDE4OyB0ZXJtKyspIHsKKyAgICAgICAgaWYgKCF0ZXJtIHx8ICh0ZXJtID4gOCAmJiB0ZXJtIDwgMTcpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHRlcm0gPT0gMTcgJiYgYnJhbmNoZXMgPT0gMSAmJiBkZXB0aCArIDEgPCBpbmZvLT5udGVybXMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAodGVybSA9PSAtMSB8fCB0ZXJtID09IC0yKQorICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBXVl9DUk9TU19ERUNPUlIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICghcy0+ZXh0cmFfZmxhZ3MgJiYgKHRlcm0gPiA0ICYmIHRlcm0gPCAxNykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpbmZvLT5kcHNbZGVwdGhdLnZhbHVlID0gdGVybTsKKyAgICAgICAgaW5mby0+ZHBzW2RlcHRoXS5kZWx0YSA9IGRlbHRhOworICAgICAgICBkZWNvcnJfc3RlcmVvX2J1ZmZlcihpbmZvLCBpbl9sZWZ0LCBpbl9yaWdodCwgb3V0X2xlZnQsIG91dF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcywgZGVwdGgpOworICAgICAgICBiaXRzID0gbG9nMnN0ZXJlbyhvdXRfbGVmdCwgb3V0X3JpZ2h0LCBzLT5ibG9ja19zYW1wbGVzLCBpbmZvLT5sb2dfbGltaXQpOworCisgICAgICAgIGlmIChiaXRzIDwgaW5mby0+YmVzdF9iaXRzKSB7CisgICAgICAgICAgICBpbmZvLT5iZXN0X2JpdHMgPSBiaXRzOworICAgICAgICAgICAgQ0xFQVIocy0+ZGVjb3JyX3Bhc3Nlcyk7CisgICAgICAgICAgICBtZW1jcHkocy0+ZGVjb3JyX3Bhc3NlcywgaW5mby0+ZHBzLCBzaXplb2YoaW5mby0+ZHBzWzBdKSAqIChkZXB0aCArIDEpKTsKKyAgICAgICAgICAgIG1lbWNweShzLT5zYW1wbGVwdHJzW2luZm8tPm50ZXJtcyArIDFdWzBdLCBzLT5zYW1wbGVwdHJzW2RlcHRoICsgMV1bMF0sCisgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcyAqIDQpOworICAgICAgICAgICAgbWVtY3B5KHMtPnNhbXBsZXB0cnNbaW5mby0+bnRlcm1zICsgMV1bMV0sIHMtPnNhbXBsZXB0cnNbZGVwdGggKyAxXVsxXSwKKyAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zYW1wbGVzICogNCk7CisgICAgICAgIH0KKworICAgICAgICB0ZXJtX2JpdHNbdGVybSArIDNdID0gYml0czsKKyAgICB9CisKKyAgICB3aGlsZSAoZGVwdGggKyAxIDwgaW5mby0+bnRlcm1zICYmIGJyYW5jaGVzLS0pIHsKKyAgICAgICAgdWludDMyX3QgbG9jYWxfYmVzdF9iaXRzID0gaW5wdXRfYml0czsKKyAgICAgICAgaW50IGJlc3RfdGVybSA9IDAsIGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCisgICAgICAgICAgICBpZiAodGVybV9iaXRzW2ldICYmIHRlcm1fYml0c1tpXSA8IGxvY2FsX2Jlc3RfYml0cykgeworICAgICAgICAgICAgICAgIGxvY2FsX2Jlc3RfYml0cyA9IHRlcm1fYml0c1tpXTsKKyAgICAgICAgICAgICAgICBiZXN0X3Rlcm0gPSBpIC0gMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZiAoIWJlc3RfdGVybSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHRlcm1fYml0c1tiZXN0X3Rlcm0gKyAzXSA9IDA7CisKKyAgICAgICAgaW5mby0+ZHBzW2RlcHRoXS52YWx1ZSA9IGJlc3RfdGVybTsKKyAgICAgICAgaW5mby0+ZHBzW2RlcHRoXS5kZWx0YSA9IGRlbHRhOworICAgICAgICBkZWNvcnJfc3RlcmVvX2J1ZmZlcihpbmZvLCBpbl9sZWZ0LCBpbl9yaWdodCwgb3V0X2xlZnQsIG91dF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc2FtcGxlcywgZGVwdGgpOworCisgICAgICAgIHJlY3Vyc2Vfc3RlcmVvKHMsIGluZm8sIGRlcHRoICsgMSwgZGVsdGEsIGxvY2FsX2Jlc3RfYml0cyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhbmFseXplX3N0ZXJlbyhXYXZQYWNrRW5jb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmluX2xlZnQsIGludDMyX3QgKmluX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3NhbXBsZXMpCit7CisgICAgV2F2UGFja0V4dHJhSW5mbyBpbmZvOworICAgIGludCBpOworCisgICAgaW5mby5ndDE2Yml0ID0gKChzLT5mbGFncyAmIE1BR19NQVNLKSA+PiBNQUdfTFNCKSA+PSAxNjsKKworICAgIGluZm8ubG9nX2xpbWl0ID0gKCgocy0+ZmxhZ3MgJiBNQUdfTUFTSykgPj4gTUFHX0xTQikgKyA0KSAqIDI1NjsKKyAgICBpbmZvLmxvZ19saW1pdCA9IEZGTUlOKDY5MTIsIGluZm8ubG9nX2xpbWl0KTsKKworICAgIGluZm8ubnRlcm1zID0gcy0+bnVtX3Rlcm1zOworCisgICAgaWYgKGFsbG9jYXRlX2J1ZmZlcnMyKHMsIHMtPm51bV90ZXJtcykpCisgICAgICAgIHJldHVybjsKKworICAgIG1lbWNweShpbmZvLmRwcywgcy0+ZGVjb3JyX3Bhc3Nlcywgc2l6ZW9mKGluZm8uZHBzKSk7CisgICAgbWVtY3B5KHMtPnNhbXBsZXB0cnNbMF1bMF0sIGluX2xlZnQsICBzLT5ibG9ja19zYW1wbGVzICogNCk7CisgICAgbWVtY3B5KHMtPnNhbXBsZXB0cnNbMF1bMV0sIGluX3JpZ2h0LCBzLT5ibG9ja19zYW1wbGVzICogNCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby5udGVybXMgJiYgaW5mby5kcHNbaV0udmFsdWU7IGkrKykKKyAgICAgICAgaWYgKGluZm8uZ3QxNmJpdCkKKyAgICAgICAgICAgIGRlY29ycl9zdGVyZW8ocy0+c2FtcGxlcHRyc1tpICAgIF1bMF0sIHMtPnNhbXBsZXB0cnNbaSAgICBdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYW1wbGVwdHJzW2kgKyAxXVswXSwgcy0+c2FtcGxlcHRyc1tpICsgMV1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3NhbXBsZXMsIGluZm8uZHBzICsgaSwgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlY29ycl9zdGVyZW9fcXVpY2socy0+c2FtcGxlcHRyc1tpICAgIF1bMF0sIHMtPnNhbXBsZXB0cnNbaSAgICBdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zYW1wbGVwdHJzW2kgKyAxXVswXSwgcy0+c2FtcGxlcHRyc1tpICsgMV1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3NhbXBsZXMsIGluZm8uZHBzICsgaSk7CisKKyAgICBpbmZvLmJlc3RfYml0cyA9IGxvZzJzdGVyZW8ocy0+c2FtcGxlcHRyc1tpbmZvLm50ZXJtc11bMF0sIHMtPnNhbXBsZXB0cnNbaW5mby5udGVybXNdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zYW1wbGVzLCAwKTsKKworICAgIG1lbWNweShzLT5zYW1wbGVwdHJzW2luZm8ubnRlcm1zICsgMV1bMF0sIHMtPnNhbXBsZXB0cnNbaV1bMF0sIHMtPmJsb2NrX3NhbXBsZXMgKiA0KTsKKyAgICBtZW1jcHkocy0+c2FtcGxlcHRyc1tpbmZvLm50ZXJtcyArIDFdWzFdLCBzLT5zYW1wbGVwdHJzW2ldWzFdLCBzLT5ibG9ja19zYW1wbGVzICogNCk7CisKKyAgICBpZiAocy0+ZXh0cmFfZmxhZ3MgJiBFWFRSQV9CUkFOQ0hFUykKKyAgICAgICAgcmVjdXJzZV9zdGVyZW8ocywgJmluZm8sIDAsIChpbnQpIGZsb29yKHMtPmRlbHRhX2RlY2F5ICsgMC41KSwKKyAgICAgICAgICAgICAgICAgICAgICAgbG9nMnN0ZXJlbyhzLT5zYW1wbGVwdHJzWzBdWzBdLCBzLT5zYW1wbGVwdHJzWzBdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3NhbXBsZXMsIDApKTsKKworICAgIGlmIChzLT5leHRyYV9mbGFncyAmIEVYVFJBX1NPUlRfRklSU1QpCisgICAgICAgIHNvcnRfc3RlcmVvKHMsICZpbmZvKTsKKworICAgIGlmIChzLT5leHRyYV9mbGFncyAmIEVYVFJBX1RSWV9ERUxUQVMpIHsKKyAgICAgICAgZGVsdGFfc3RlcmVvKHMsICZpbmZvKTsKKworICAgICAgICBpZiAoKHMtPmV4dHJhX2ZsYWdzICYgRVhUUkFfQURKVVNUX0RFTFRBUykgJiYgcy0+ZGVjb3JyX3Bhc3Nlc1swXS52YWx1ZSkKKyAgICAgICAgICAgIHMtPmRlbHRhX2RlY2F5ID0gKGZsb2F0KSgocy0+ZGVsdGFfZGVjYXkgKiAyLjAgKyBzLT5kZWNvcnJfcGFzc2VzWzBdLmRlbHRhKSAvIDMuMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmRlbHRhX2RlY2F5ID0gMi4wOworICAgIH0KKworICAgIGlmIChzLT5leHRyYV9mbGFncyAmIEVYVFJBX1NPUlRfTEFTVCkKKyAgICAgICAgc29ydF9zdGVyZW8ocywgJmluZm8pOworCisgICAgaWYgKGRvX3NhbXBsZXMpIHsKKyAgICAgICAgbWVtY3B5KGluX2xlZnQsICBzLT5zYW1wbGVwdHJzW2luZm8ubnRlcm1zICsgMV1bMF0sIHMtPmJsb2NrX3NhbXBsZXMgKiA0KTsKKyAgICAgICAgbWVtY3B5KGluX3JpZ2h0LCBzLT5zYW1wbGVwdHJzW2luZm8ubnRlcm1zICsgMV1bMV0sIHMtPmJsb2NrX3NhbXBsZXMgKiA0KTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby5udGVybXM7IGkrKykKKyAgICAgICAgaWYgKCFzLT5kZWNvcnJfcGFzc2VzW2ldLnZhbHVlKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBzLT5udW1fdGVybXMgPSBpOworfQorCitzdGF0aWMgaW50IHd2X3N0ZXJlbyhXYXZQYWNrRW5jb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnNhbXBsZXNfbCwgaW50MzJfdCAqc2FtcGxlc19yLAorICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2hpc3RvcnksIGludCBkb19zYW1wbGVzKQoreworICAgIHN0cnVjdCBEZWNvcnIgdGVtcF9kZWNvcnJfcGFzcywgc2F2ZV9kZWNvcnJfcGFzc2VzW01BWF9URVJNU10gPSB7ezB9fTsKKyAgICBpbnQgbmJfc2FtcGxlcyA9IHMtPmJsb2NrX3NhbXBsZXMsIHJldDsKKyAgICBpbnQgYnVmX3NpemUgPSBzaXplb2YoaW50MzJfdCkgKiBuYl9zYW1wbGVzOworICAgIGludCBsb2dfbGltaXQsIGZvcmNlX2pzID0gMCwgZm9yY2VfdHMgPSAwLCBnb3RfanMgPSAwLCBwaSwgaTsKKyAgICB1aW50MzJfdCBiZXN0X3NpemUgPSBVSU5UMzJfTUFYLCBzaXplOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykKKyAgICAgICAgaWYgKHNhbXBsZXNfbFtpXSB8fCBzYW1wbGVzX3JbaV0pCisgICAgICAgICAgICBicmVhazsKKworICAgIGlmIChpID09IG5iX3NhbXBsZXMpIHsKKyAgICAgICAgcy0+ZmxhZ3MgJj0gfigodWludDMyX3QpIFdWX0pPSU5UX1NURVJFTyk7CisgICAgICAgIENMRUFSKHMtPmRlY29ycl9wYXNzZXMpOworICAgICAgICBDTEVBUihzLT53KTsKKyAgICAgICAgcy0+bnVtX3Rlcm1zID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbG9nX2xpbWl0ID0gKCgocy0+ZmxhZ3MgJiBNQUdfTUFTSykgPj4gTUFHX0xTQikgKyA0KSAqIDI1NjsKKyAgICBsb2dfbGltaXQgPSBGRk1JTig2OTEyLCBsb2dfbGltaXQpOworCisgICAgaWYgKHMtPmpvaW50KSB7CisgICAgICAgIGZvcmNlX2pzID0gcy0+am9pbnQgPiAwOworICAgICAgICBmb3JjZV90cyA9IHMtPmpvaW50IDwgMDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGFsbG9jYXRlX2J1ZmZlcnMocykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChub19oaXN0b3J5IHx8IHMtPm51bV9wYXNzZXMgPj0gNykKKyAgICAgICAgcy0+YmVzdF9kZWNvcnIgPSBzLT5tYXNrX2RlY29yciA9IDA7CisKKyAgICBmb3IgKHBpID0gMDsgcGkgPCBzLT5udW1fcGFzc2VzOykgeworICAgICAgICBjb25zdCBXYXZQYWNrRGVjb3JyU3BlYyAqd3BkczsKKyAgICAgICAgaW50IG50ZXJtcywgYywgajsKKworICAgICAgICBpZiAoIXBpKQorICAgICAgICAgICAgYyA9IHMtPmJlc3RfZGVjb3JyOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzLT5tYXNrX2RlY29yciA9PSAwKQorICAgICAgICAgICAgICAgIGMgPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGMgPSAocy0+YmVzdF9kZWNvcnIgJiAocy0+bWFza19kZWNvcnIgLSAxKSkgfCBzLT5tYXNrX2RlY29ycjsKKworICAgICAgICAgICAgaWYgKGMgPT0gcy0+YmVzdF9kZWNvcnIpIHsKKyAgICAgICAgICAgICAgICBzLT5tYXNrX2RlY29yciA9IHMtPm1hc2tfZGVjb3JyID8gKChzLT5tYXNrX2RlY29yciA8PCAxKSAmIChzLT5udW1fZGVjb3JycyAtIDEpKSA6IDE7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3cGRzID0gJnMtPmRlY29ycl9zcGVjc1tjXTsKKyAgICAgICAgbnRlcm1zID0gZGVjb3JyX2ZpbHRlcl9udGVybXNbcy0+ZGVjb3JyX2ZpbHRlcl07CisKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGlmIChmb3JjZV9qcyB8fCAod3Bkcy0+am9pbnRfc3RlcmVvICYmICFmb3JjZV90cykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdvdF9qcykgeworICAgICAgICAgICAgICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnMtPmpzX2xlZnQsICAmcy0+anNfbGVmdF9zaXplLCAgYnVmX3NpemUpOworICAgICAgICAgICAgICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnMtPmpzX3JpZ2h0LCAmcy0+anNfcmlnaHRfc2l6ZSwgYnVmX3NpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkocy0+anNfbGVmdCwgIHNhbXBsZXNfbCwgYnVmX3NpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkocy0+anNfcmlnaHQsIHNhbXBsZXNfciwgYnVmX3NpemUpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5qc19yaWdodFtpXSArPSAoKHMtPmpzX2xlZnRbaV0gLT0gcy0+anNfcmlnaHRbaV0pID4+IDEpOworICAgICAgICAgICAgICAgICAgICBnb3RfanMgPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1lbWNweShzLT50ZW1wX2J1ZmZlclswXVswXSwgcy0+anNfbGVmdCwgIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+dGVtcF9idWZmZXJbMF1bMV0sIHMtPmpzX3JpZ2h0LCBidWZfc2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweShzLT50ZW1wX2J1ZmZlclswXVswXSwgc2FtcGxlc19sLCBidWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHMtPnRlbXBfYnVmZmVyWzBdWzFdLCBzYW1wbGVzX3IsIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0xFQVIoc2F2ZV9kZWNvcnJfcGFzc2VzKTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG50ZXJtczsgaisrKSB7CisgICAgICAgICAgICAgICAgQ0xFQVIodGVtcF9kZWNvcnJfcGFzcyk7CisgICAgICAgICAgICAgICAgdGVtcF9kZWNvcnJfcGFzcy5kZWx0YSA9IHdwZHMtPmRlbHRhOworICAgICAgICAgICAgICAgIHRlbXBfZGVjb3JyX3Bhc3MudmFsdWUgPSB3cGRzLT50ZXJtc1tqXTsKKworICAgICAgICAgICAgICAgIGlmICh0ZW1wX2RlY29ycl9wYXNzLnZhbHVlIDwgMCAmJiAhKHMtPmZsYWdzICYgV1ZfQ1JPU1NfREVDT1JSKSkKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9kZWNvcnJfcGFzcy52YWx1ZSA9IC0zOworCisgICAgICAgICAgICAgICAgZGVjb3JyX3N0ZXJlbyhzLT50ZW1wX2J1ZmZlclsgaiYxXVswXSwgcy0+dGVtcF9idWZmZXJbIGomMV1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50ZW1wX2J1ZmZlclt+aiYxXVswXSwgcy0+dGVtcF9idWZmZXJbfmomMV1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTigyMDQ4LCBuYl9zYW1wbGVzKSwgJnRlbXBfZGVjb3JyX3Bhc3MsIC0xKTsKKworICAgICAgICAgICAgICAgIGlmIChqKSB7CisgICAgICAgICAgICAgICAgICAgIENMRUFSKHRlbXBfZGVjb3JyX3Bhc3Muc2FtcGxlc0EpOworICAgICAgICAgICAgICAgICAgICBDTEVBUih0ZW1wX2RlY29ycl9wYXNzLnNhbXBsZXNCKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXZlcnNlX2RlY29ycigmdGVtcF9kZWNvcnJfcGFzcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWVtY3B5KHNhdmVfZGVjb3JyX3Bhc3NlcyArIGosICZ0ZW1wX2RlY29ycl9wYXNzLCBzaXplb2Yoc3RydWN0IERlY29ycikpOworCisgICAgICAgICAgICAgICAgaWYgKCgocy0+ZmxhZ3MgJiBNQUdfTUFTSykgPj4gTUFHX0xTQikgPj0gMTYpCisgICAgICAgICAgICAgICAgICAgIGRlY29ycl9zdGVyZW8ocy0+dGVtcF9idWZmZXJbIGomMV1bMF0sIHMtPnRlbXBfYnVmZmVyWyBqJjFdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRlbXBfYnVmZmVyW35qJjFdWzBdLCBzLT50ZW1wX2J1ZmZlclt+aiYxXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzLCAmdGVtcF9kZWNvcnJfcGFzcywgMSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkZWNvcnJfc3RlcmVvX3F1aWNrKHMtPnRlbXBfYnVmZmVyWyBqJjFdWzBdLCBzLT50ZW1wX2J1ZmZlclsgaiYxXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50ZW1wX2J1ZmZlclt+aiYxXVswXSwgcy0+dGVtcF9idWZmZXJbfmomMV1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfc2FtcGxlcywgJnRlbXBfZGVjb3JyX3Bhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplID0gbG9nMnN0ZXJlbyhzLT50ZW1wX2J1ZmZlcltqJjFdWzBdLCBzLT50ZW1wX2J1ZmZlcltqJjFdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfc2FtcGxlcywgbG9nX2xpbWl0KTsKKyAgICAgICAgICAgIGlmIChzaXplICE9IFVJTlQzMl9NQVggfHwgIW50ZXJtcykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG50ZXJtcyA+Pj0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplIDwgYmVzdF9zaXplKSB7CisgICAgICAgICAgICBtZW1jcHkocy0+YmVzdF9idWZmZXJbMF0sIHMtPnRlbXBfYnVmZmVyW2omMV1bMF0sIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIG1lbWNweShzLT5iZXN0X2J1ZmZlclsxXSwgcy0+dGVtcF9idWZmZXJbaiYxXVsxXSwgYnVmX3NpemUpOworICAgICAgICAgICAgbWVtY3B5KHMtPmRlY29ycl9wYXNzZXMsIHNhdmVfZGVjb3JyX3Bhc3Nlcywgc2l6ZW9mKHN0cnVjdCBEZWNvcnIpICogTUFYX1RFUk1TKTsKKyAgICAgICAgICAgIHMtPm51bV90ZXJtcyA9IG50ZXJtczsKKyAgICAgICAgICAgIHMtPmJlc3RfZGVjb3JyID0gYzsKKyAgICAgICAgICAgIGJlc3Rfc2l6ZSA9IHNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGkrKykKKyAgICAgICAgICAgIHMtPm1hc2tfZGVjb3JyID0gcy0+bWFza19kZWNvcnIgPyAoKHMtPm1hc2tfZGVjb3JyIDw8IDEpICYgKHMtPm51bV9kZWNvcnJzIC0gMSkpIDogMTsKKyAgICB9CisKKyAgICBpZiAoZm9yY2VfanMgfHwgKHMtPmRlY29ycl9zcGVjc1tzLT5iZXN0X2RlY29ycl0uam9pbnRfc3RlcmVvICYmICFmb3JjZV90cykpCisgICAgICAgIHMtPmZsYWdzIHw9IFdWX0pPSU5UX1NURVJFTzsKKyAgICBlbHNlCisgICAgICAgIHMtPmZsYWdzICY9IH4oKHVpbnQzMl90KSBXVl9KT0lOVF9TVEVSRU8pOworCisgICAgaWYgKHMtPmV4dHJhX2ZsYWdzKSB7CisgICAgICAgIGlmIChzLT5mbGFncyAmIFdWX0pPSU5UX1NURVJFTykgeworICAgICAgICAgICAgYW5hbHl6ZV9zdGVyZW8ocywgcy0+anNfbGVmdCwgcy0+anNfcmlnaHQsIGRvX3NhbXBsZXMpOworCisgICAgICAgICAgICBpZiAoZG9fc2FtcGxlcykgeworICAgICAgICAgICAgICAgIG1lbWNweShzYW1wbGVzX2wsIHMtPmpzX2xlZnQsICBidWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHNhbXBsZXNfciwgcy0+anNfcmlnaHQsIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhbmFseXplX3N0ZXJlbyhzLCBzYW1wbGVzX2wsIHNhbXBsZXNfciwgZG9fc2FtcGxlcyk7CisgICAgfSBlbHNlIGlmIChkb19zYW1wbGVzKSB7CisgICAgICAgIG1lbWNweShzYW1wbGVzX2wsIHMtPmJlc3RfYnVmZmVyWzBdLCBidWZfc2l6ZSk7CisgICAgICAgIG1lbWNweShzYW1wbGVzX3IsIHMtPmJlc3RfYnVmZmVyWzFdLCBidWZfc2l6ZSk7CisgICAgfQorCisgICAgaWYgKHMtPmV4dHJhX2ZsYWdzIHx8IG5vX2hpc3RvcnkgfHwKKyAgICAgICAgcy0+am9pbnRfc3RlcmVvICE9IHMtPmRlY29ycl9zcGVjc1tzLT5iZXN0X2RlY29ycl0uam9pbnRfc3RlcmVvKSB7CisgICAgICAgIHMtPmpvaW50X3N0ZXJlbyA9IHMtPmRlY29ycl9zcGVjc1tzLT5iZXN0X2RlY29ycl0uam9pbnRfc3RlcmVvOworICAgICAgICBDTEVBUihzLT53KTsKKyAgICAgICAgc2Nhbl93b3JkKHMsICZzLT53LmNbMF0sIHMtPmJlc3RfYnVmZmVyWzBdLCBuYl9zYW1wbGVzLCAtMSk7CisgICAgICAgIHNjYW5fd29yZChzLCAmcy0+dy5jWzFdLCBzLT5iZXN0X2J1ZmZlclsxXSwgbmJfc2FtcGxlcywgLTEpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBjb3VudF9iaXRzKGF2KSAoIFwKKyAoYXYpIDwgKDEgPDwgOCkgPyBuYml0c190YWJsZVthdl0gOiBcCisgICggXAorICAgKGF2KSA8ICgxTCA8PCAxNikgPyBuYml0c190YWJsZVsoYXYpID4+IDhdICsgOCA6IFwKKyAgICgoYXYpIDwgKDFMIDw8IDI0KSA/IG5iaXRzX3RhYmxlWyhhdikgPj4gMTZdICsgMTYgOiBuYml0c190YWJsZVsoYXYpID4+IDI0XSArIDI0KSBcCisgICkgXAorKQorCitzdGF0aWMgdm9pZCBlbmNvZGVfZmx1c2goV2F2UGFja0VuY29kZUNvbnRleHQgKnMpCit7CisgICAgV2F2UGFja1dvcmRzICp3ID0gJnMtPnc7CisgICAgUHV0Qml0Q29udGV4dCAqcGIgPSAmcy0+cGI7CisKKyAgICBpZiAody0+emVyb3NfYWNjKSB7CisgICAgICAgIGludCBjYml0cyA9IGNvdW50X2JpdHMody0+emVyb3NfYWNjKTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoY2JpdHMgPiAzMSkgeworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAzMSwgMHg3RkZGRkZGRik7CisgICAgICAgICAgICAgICAgY2JpdHMgLT0gMzE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBjYml0cywgKDEgPDwgY2JpdHMpIC0gMSk7CisgICAgICAgICAgICAgICAgY2JpdHMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChjYml0cyk7CisKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIDApOworCisgICAgICAgIHdoaWxlICh3LT56ZXJvc19hY2MgPiAxKSB7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgdy0+emVyb3NfYWNjICYgMSk7CisgICAgICAgICAgICB3LT56ZXJvc19hY2MgPj49IDE7CisgICAgICAgIH0KKworICAgICAgICB3LT56ZXJvc19hY2MgPSAwOworICAgIH0KKworICAgIGlmICh3LT5ob2xkaW5nX29uZSkgeworICAgICAgICBpZiAody0+aG9sZGluZ19vbmUgPj0gMTYpIHsKKyAgICAgICAgICAgIGludCBjYml0czsKKworICAgICAgICAgICAgcHV0X2JpdHMocGIsIDE2LCAoMSA8PCAxNikgLSAxKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKKyAgICAgICAgICAgIHctPmhvbGRpbmdfb25lIC09IDE2OworICAgICAgICAgICAgY2JpdHMgPSBjb3VudF9iaXRzKHctPmhvbGRpbmdfb25lKTsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChjYml0cyA+IDMxKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAzMSwgMHg3RkZGRkZGRik7CisgICAgICAgICAgICAgICAgICAgIGNiaXRzIC09IDMxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBjYml0cywgKDEgPDwgY2JpdHMpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGNiaXRzID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChjYml0cyk7CisKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKKworICAgICAgICAgICAgd2hpbGUgKHctPmhvbGRpbmdfb25lID4gMSkgeworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCB3LT5ob2xkaW5nX29uZSAmIDEpOworICAgICAgICAgICAgICAgIHctPmhvbGRpbmdfb25lID4+PSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3LT5ob2xkaW5nX3plcm8gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHV0X2JpdHMocGIsIHctPmhvbGRpbmdfb25lLCAoMSA8PCB3LT5ob2xkaW5nX29uZSkgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHctPmhvbGRpbmdfb25lID0gMDsKKyAgICB9CisKKyAgICBpZiAody0+aG9sZGluZ196ZXJvKSB7CisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKKyAgICAgICAgdy0+aG9sZGluZ196ZXJvID0gMDsKKyAgICB9CisKKyAgICBpZiAody0+cGVuZF9jb3VudCkgeworICAgICAgICBwdXRfYml0cyhwYiwgdy0+cGVuZF9jb3VudCwgdy0+cGVuZF9kYXRhKTsKKyAgICAgICAgdy0+cGVuZF9kYXRhID0gdy0+cGVuZF9jb3VudCA9IDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB3YXZwYWNrX2VuY29kZV9zYW1wbGUoV2F2UGFja0VuY29kZUNvbnRleHQgKnMsIFd2Q2hhbm5lbCAqYywgaW50MzJfdCBzYW1wbGUpCit7CisgICAgV2F2UGFja1dvcmRzICp3ID0gJnMtPnc7CisgICAgdWludDMyX3Qgb25lc19jb3VudCwgbG93LCBoaWdoOworICAgIGludCBzaWduID0gc2FtcGxlIDwgMDsKKworICAgIGlmIChzLT53LmNbMF0ubWVkaWFuWzBdIDwgMiAmJiAhcy0+dy5ob2xkaW5nX3plcm8gJiYgcy0+dy5jWzFdLm1lZGlhblswXSA8IDIpIHsKKyAgICAgICAgaWYgKHctPnplcm9zX2FjYykgeworICAgICAgICAgICAgaWYgKHNhbXBsZSkKKyAgICAgICAgICAgICAgICBlbmNvZGVfZmx1c2gocyk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB3LT56ZXJvc19hY2MrKzsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlKSB7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0xFQVIocy0+dy5jWzBdLm1lZGlhbik7CisgICAgICAgICAgICBDTEVBUihzLT53LmNbMV0ubWVkaWFuKTsKKyAgICAgICAgICAgIHctPnplcm9zX2FjYyA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2lnbikKKyAgICAgICAgc2FtcGxlID0gfnNhbXBsZTsKKworICAgIGlmIChzYW1wbGUgPCAoaW50MzJfdCkgR0VUX01FRCgwKSkgeworICAgICAgICBvbmVzX2NvdW50ID0gbG93ID0gMDsKKyAgICAgICAgaGlnaCA9IEdFVF9NRUQoMCkgLSAxOworICAgICAgICBERUNfTUVEKDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvdyA9IEdFVF9NRUQoMCk7CisgICAgICAgIElOQ19NRUQoMCk7CisKKyAgICAgICAgaWYgKHNhbXBsZSAtIGxvdyA8IEdFVF9NRUQoMSkpIHsKKyAgICAgICAgICAgIG9uZXNfY291bnQgPSAxOworICAgICAgICAgICAgaGlnaCA9IGxvdyArIEdFVF9NRUQoMSkgLSAxOworICAgICAgICAgICAgREVDX01FRCgxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvdyArPSBHRVRfTUVEKDEpOworICAgICAgICAgICAgSU5DX01FRCgxKTsKKworICAgICAgICAgICAgaWYgKHNhbXBsZSAtIGxvdyA8IEdFVF9NRUQoMikpIHsKKyAgICAgICAgICAgICAgICBvbmVzX2NvdW50ID0gMjsKKyAgICAgICAgICAgICAgICBoaWdoID0gbG93ICsgR0VUX01FRCgyKSAtIDE7CisgICAgICAgICAgICAgICAgREVDX01FRCgyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb25lc19jb3VudCA9IDIgKyAoc2FtcGxlIC0gbG93KSAvIEdFVF9NRUQoMik7CisgICAgICAgICAgICAgICAgbG93ICs9IChvbmVzX2NvdW50IC0gMikgKiBHRVRfTUVEKDIpOworICAgICAgICAgICAgICAgIGhpZ2ggPSBsb3cgKyBHRVRfTUVEKDIpIC0gMTsKKyAgICAgICAgICAgICAgICBJTkNfTUVEKDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHctPmhvbGRpbmdfemVybykgeworICAgICAgICBpZiAob25lc19jb3VudCkKKyAgICAgICAgICAgIHctPmhvbGRpbmdfb25lKys7CisKKyAgICAgICAgZW5jb2RlX2ZsdXNoKHMpOworCisgICAgICAgIGlmIChvbmVzX2NvdW50KSB7CisgICAgICAgICAgICB3LT5ob2xkaW5nX3plcm8gPSAxOworICAgICAgICAgICAgb25lc19jb3VudC0tOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHctPmhvbGRpbmdfemVybyA9IDA7CisgICAgfSBlbHNlCisgICAgICAgIHctPmhvbGRpbmdfemVybyA9IDE7CisKKyAgICB3LT5ob2xkaW5nX29uZSA9IG9uZXNfY291bnQgKiAyOworCisgICAgaWYgKGhpZ2ggIT0gbG93KSB7CisgICAgICAgIHVpbnQzMl90IG1heGNvZGUgPSBoaWdoIC0gbG93LCBjb2RlID0gc2FtcGxlIC0gbG93OworICAgICAgICBpbnQgYml0Y291bnQgPSBjb3VudF9iaXRzKG1heGNvZGUpOworICAgICAgICB1aW50MzJfdCBleHRyYXMgPSAoMSA8PCBiaXRjb3VudCkgLSBtYXhjb2RlIC0gMTsKKworICAgICAgICBpZiAoY29kZSA8IGV4dHJhcykgeworICAgICAgICAgICAgdy0+cGVuZF9kYXRhIHw9IGNvZGUgPDwgdy0+cGVuZF9jb3VudDsKKyAgICAgICAgICAgIHctPnBlbmRfY291bnQgKz0gYml0Y291bnQgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdy0+cGVuZF9kYXRhIHw9ICgoY29kZSArIGV4dHJhcykgPj4gMSkgPDwgdy0+cGVuZF9jb3VudDsKKyAgICAgICAgICAgIHctPnBlbmRfY291bnQgKz0gYml0Y291bnQgLSAxOworICAgICAgICAgICAgdy0+cGVuZF9kYXRhIHw9ICgoY29kZSArIGV4dHJhcykgJiAxKSA8PCB3LT5wZW5kX2NvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3LT5wZW5kX2RhdGEgfD0gKChpbnQzMl90KSBzaWduIDw8IHctPnBlbmRfY291bnQrKyk7CisKKyAgICBpZiAoIXctPmhvbGRpbmdfemVybykKKyAgICAgICAgZW5jb2RlX2ZsdXNoKHMpOworfQorCitzdGF0aWMgdm9pZCBwYWNrX2ludDMyKFdhdlBhY2tFbmNvZGVDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpzYW1wbGVzX2wsIGludDMyX3QgKnNhbXBsZXNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMpCit7CisgICAgY29uc3QgaW50IHNlbnRfYml0cyA9IHMtPmludDMyX3NlbnRfYml0czsKKyAgICBpbnQzMl90IHZhbHVlLCBtYXNrID0gKDEgPDwgc2VudF9iaXRzKSAtIDE7CisgICAgUHV0Qml0Q29udGV4dCAqcGIgPSAmcy0+cGI7CisgICAgaW50IGksIHByZV9zaGlmdDsKKworICAgIHByZV9zaGlmdCA9IHMtPmludDMyX3plcm9zICsgcy0+aW50MzJfb25lcyArIHMtPmludDMyX2R1cHM7CisKKyAgICBpZiAoIXNlbnRfYml0cykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHMtPmZsYWdzICYgV1ZfTU9OT19EQVRBKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlID0gKHNhbXBsZXNfbFtpXSA+PiBwcmVfc2hpZnQpICYgbWFzazsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBzZW50X2JpdHMsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlID0gKHNhbXBsZXNfbFtpXSA+PiBwcmVfc2hpZnQpICYgbWFzazsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBzZW50X2JpdHMsIHZhbHVlKTsKKyAgICAgICAgICAgIHZhbHVlID0gKHNhbXBsZXNfcltpXSA+PiBwcmVfc2hpZnQpICYgbWFzazsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBzZW50X2JpdHMsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcGFja19mbG9hdF9zYW1wbGUoV2F2UGFja0VuY29kZUNvbnRleHQgKnMsIGludDMyX3QgKnNhbXBsZSkKK3sKKyAgICBjb25zdCBpbnQgbWF4X2V4cCA9IHMtPmZsb2F0X21heF9leHA7CisgICAgUHV0Qml0Q29udGV4dCAqcGIgPSAmcy0+cGI7CisgICAgaW50MzJfdCB2YWx1ZSwgc2hpZnRfY291bnQ7CisKKyAgICBpZiAoZ2V0X2V4cG9uZW50KCpzYW1wbGUpID09IDI1NSkgeworICAgICAgICBpZiAoZ2V0X21hbnRpc3NhKCpzYW1wbGUpKSB7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgMSk7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgMjMsIGdldF9tYW50aXNzYSgqc2FtcGxlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgMCk7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IDB4MTAwMDAwMDsKKyAgICAgICAgc2hpZnRfY291bnQgPSAwOworICAgIH0gZWxzZSBpZiAoZ2V0X2V4cG9uZW50KCpzYW1wbGUpKSB7CisgICAgICAgIHNoaWZ0X2NvdW50ID0gbWF4X2V4cCAtIGdldF9leHBvbmVudCgqc2FtcGxlKTsKKyAgICAgICAgdmFsdWUgPSAweDgwMDAwMCArIGdldF9tYW50aXNzYSgqc2FtcGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaGlmdF9jb3VudCA9IG1heF9leHAgPyBtYXhfZXhwIC0gMSA6IDA7CisgICAgICAgIHZhbHVlID0gZ2V0X21hbnRpc3NhKCpzYW1wbGUpOworICAgIH0KKworICAgIGlmIChzaGlmdF9jb3VudCA8IDI1KQorICAgICAgICB2YWx1ZSA+Pj0gc2hpZnRfY291bnQ7CisgICAgZWxzZQorICAgICAgICB2YWx1ZSA9IDA7CisKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIGlmIChzLT5mbG9hdF9mbGFncyAmIEZMT0FUX1pFUk9TX1NFTlQpIHsKKyAgICAgICAgICAgIGlmIChnZXRfZXhwb25lbnQoKnNhbXBsZSkgfHwgZ2V0X21hbnRpc3NhKCpzYW1wbGUpKSB7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIsIDEsIDEpOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAyMywgZ2V0X21hbnRpc3NhKCpzYW1wbGUpKTsKKworICAgICAgICAgICAgICAgIGlmIChtYXhfZXhwID49IDI1KQorICAgICAgICAgICAgICAgICAgICBwdXRfYml0cyhwYiwgOCwgZ2V0X2V4cG9uZW50KCpzYW1wbGUpKTsKKworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCBnZXRfc2lnbigqc2FtcGxlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKKworICAgICAgICAgICAgICAgIGlmIChzLT5mbG9hdF9mbGFncyAmIEZMT0FUX05FR19aRVJPUykKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIsIDEsIGdldF9zaWduKCpzYW1wbGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2hpZnRfY291bnQpIHsKKyAgICAgICAgaWYgKHMtPmZsb2F0X2ZsYWdzICYgRkxPQVRfU0hJRlRfU0VOVCkgeworICAgICAgICAgICAgaW50MzJfdCBkYXRhID0gZ2V0X21hbnRpc3NhKCpzYW1wbGUpICYgKCgxIDw8IHNoaWZ0X2NvdW50KSAtIDEpOworICAgICAgICAgICAgcHV0X2JpdHMocGIsIHNoaWZ0X2NvdW50LCBkYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5mbG9hdF9mbGFncyAmIEZMT0FUX1NISUZUX1NBTUUpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCBnZXRfbWFudGlzc2EoKnNhbXBsZSkgJiAxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcGFja19mbG9hdChXYXZQYWNrRW5jb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc2FtcGxlc19sLCBpbnQzMl90ICpzYW1wbGVzX3IsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzKQoreworICAgIGludCBpOworCisgICAgaWYgKHMtPmZsYWdzICYgV1ZfTU9OT19EQVRBKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspCisgICAgICAgICAgICBwYWNrX2Zsb2F0X3NhbXBsZShzLCAmc2FtcGxlc19sW2ldKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBwYWNrX2Zsb2F0X3NhbXBsZShzLCAmc2FtcGxlc19sW2ldKTsKKyAgICAgICAgICAgIHBhY2tfZmxvYXRfc2FtcGxlKHMsICZzYW1wbGVzX3JbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvcnJfc3RlcmVvX3Bhc3MyKHN0cnVjdCBEZWNvcnIgKmRwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc2FtcGxlc19sLCBpbnQzMl90ICpzYW1wbGVzX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzKQoreworICAgIGludCBpLCBtLCBrOworCisgICAgc3dpdGNoIChkcHAtPnZhbHVlKSB7CisgICAgY2FzZSAxNzoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBzYW0sIHRtcDsKKworICAgICAgICAgICAgc2FtID0gMiAqIGRwcC0+c2FtcGxlc0FbMF0gLSBkcHAtPnNhbXBsZXNBWzFdOworICAgICAgICAgICAgZHBwLT5zYW1wbGVzQVsxXSA9IGRwcC0+c2FtcGxlc0FbMF07CisgICAgICAgICAgICBzYW1wbGVzX2xbaV0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQVswXSA9IHNhbXBsZXNfbFtpXSkgLSBBUFBMWV9XRUlHSFQoZHBwLT53ZWlnaHRBLCBzYW0pOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKworICAgICAgICAgICAgc2FtID0gMiAqIGRwcC0+c2FtcGxlc0JbMF0gLSBkcHAtPnNhbXBsZXNCWzFdOworICAgICAgICAgICAgZHBwLT5zYW1wbGVzQlsxXSA9IGRwcC0+c2FtcGxlc0JbMF07CisgICAgICAgICAgICBzYW1wbGVzX3JbaV0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQlswXSA9IHNhbXBsZXNfcltpXSkgLSBBUFBMWV9XRUlHSFQoZHBwLT53ZWlnaHRCLCBzYW0pOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEIsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE4OgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbSwgdG1wOworCisgICAgICAgICAgICBzYW0gPSBkcHAtPnNhbXBsZXNBWzBdICsgKChkcHAtPnNhbXBsZXNBWzBdIC0gZHBwLT5zYW1wbGVzQVsxXSkgPj4gMSk7CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNBWzFdID0gZHBwLT5zYW1wbGVzQVswXTsKKyAgICAgICAgICAgIHNhbXBsZXNfbFtpXSA9IHRtcCA9IChkcHAtPnNhbXBsZXNBWzBdID0gc2FtcGxlc19sW2ldKSAtIEFQUExZX1dFSUdIVChkcHAtPndlaWdodEEsIHNhbSk7CisgICAgICAgICAgICBVUERBVEVfV0VJR0hUKGRwcC0+d2VpZ2h0QSwgZHBwLT5kZWx0YSwgc2FtLCB0bXApOworCisgICAgICAgICAgICBzYW0gPSBkcHAtPnNhbXBsZXNCWzBdICsgKChkcHAtPnNhbXBsZXNCWzBdIC0gZHBwLT5zYW1wbGVzQlsxXSkgPj4gMSk7CisgICAgICAgICAgICBkcHAtPnNhbXBsZXNCWzFdID0gZHBwLT5zYW1wbGVzQlswXTsKKyAgICAgICAgICAgIHNhbXBsZXNfcltpXSA9IHRtcCA9IChkcHAtPnNhbXBsZXNCWzBdID0gc2FtcGxlc19yW2ldKSAtIEFQUExZX1dFSUdIVChkcHAtPndlaWdodEIsIHNhbSk7CisgICAgICAgICAgICBVUERBVEVfV0VJR0hUKGRwcC0+d2VpZ2h0QiwgZHBwLT5kZWx0YSwgc2FtLCB0bXApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGZvciAobSA9IDAsIGsgPSBkcHAtPnZhbHVlICYgKE1BWF9URVJNIC0gMSksIGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbSwgdG1wOworCisgICAgICAgICAgICBzYW0gPSBkcHAtPnNhbXBsZXNBW21dOworICAgICAgICAgICAgc2FtcGxlc19sW2ldID0gdG1wID0gKGRwcC0+c2FtcGxlc0Fba10gPSBzYW1wbGVzX2xbaV0pIC0gQVBQTFlfV0VJR0hUKGRwcC0+d2VpZ2h0QSwgc2FtKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFQoZHBwLT53ZWlnaHRBLCBkcHAtPmRlbHRhLCBzYW0sIHRtcCk7CisKKyAgICAgICAgICAgIHNhbSA9IGRwcC0+c2FtcGxlc0JbbV07CisgICAgICAgICAgICBzYW1wbGVzX3JbaV0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQltrXSA9IHNhbXBsZXNfcltpXSkgLSBBUFBMWV9XRUlHSFQoZHBwLT53ZWlnaHRCLCBzYW0pOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEIsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKworICAgICAgICAgICAgbSA9IChtICsgMSkgJiAoTUFYX1RFUk0gLSAxKTsKKyAgICAgICAgICAgIGsgPSAoayArIDEpICYgKE1BWF9URVJNIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG0pIHsKKyAgICAgICAgICAgIGludDMyX3QgdGVtcF9BW01BWF9URVJNXSwgdGVtcF9CW01BWF9URVJNXTsKKworICAgICAgICAgICAgbWVtY3B5KHRlbXBfQSwgZHBwLT5zYW1wbGVzQSwgc2l6ZW9mIChkcHAtPnNhbXBsZXNBKSk7CisgICAgICAgICAgICBtZW1jcHkodGVtcF9CLCBkcHAtPnNhbXBsZXNCLCBzaXplb2YgKGRwcC0+c2FtcGxlc0IpKTsKKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IE1BWF9URVJNOyBrKyspIHsKKyAgICAgICAgICAgICAgICBkcHAtPnNhbXBsZXNBW2tdID0gdGVtcF9BW21dOworICAgICAgICAgICAgICAgIGRwcC0+c2FtcGxlc0Jba10gPSB0ZW1wX0JbbV07CisgICAgICAgICAgICAgICAgbSA9IChtICsgMSkgJiAoTUFYX1RFUk0gLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIC0xOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbV9BLCBzYW1fQiwgdG1wOworCisgICAgICAgICAgICBzYW1fQSA9IGRwcC0+c2FtcGxlc0FbMF07CisgICAgICAgICAgICBzYW1wbGVzX2xbaV0gPSB0bXAgPSAoc2FtX0IgPSBzYW1wbGVzX2xbaV0pIC0gQVBQTFlfV0VJR0hUKGRwcC0+d2VpZ2h0QSwgc2FtX0EpOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVF9DTElQKGRwcC0+d2VpZ2h0QSwgZHBwLT5kZWx0YSwgc2FtX0EsIHRtcCk7CisKKyAgICAgICAgICAgIHNhbXBsZXNfcltpXSA9IHRtcCA9IChkcHAtPnNhbXBsZXNBWzBdID0gc2FtcGxlc19yW2ldKSAtIEFQUExZX1dFSUdIVChkcHAtPndlaWdodEIsIHNhbV9CKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFRfQ0xJUChkcHAtPndlaWdodEIsIGRwcC0+ZGVsdGEsIHNhbV9CLCB0bXApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgLTI6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtX0EsIHNhbV9CLCB0bXA7CisKKyAgICAgICAgICAgIHNhbV9CID0gZHBwLT5zYW1wbGVzQlswXTsKKyAgICAgICAgICAgIHNhbXBsZXNfcltpXSA9IHRtcCA9IChzYW1fQSA9IHNhbXBsZXNfcltpXSkgLSBBUFBMWV9XRUlHSFQoZHBwLT53ZWlnaHRCLCBzYW1fQik7CisgICAgICAgICAgICBVUERBVEVfV0VJR0hUX0NMSVAoZHBwLT53ZWlnaHRCLCBkcHAtPmRlbHRhLCBzYW1fQiwgdG1wKTsKKworICAgICAgICAgICAgc2FtcGxlc19sW2ldID0gdG1wID0gKGRwcC0+c2FtcGxlc0JbMF0gPSBzYW1wbGVzX2xbaV0pIC0gQVBQTFlfV0VJR0hUKGRwcC0+d2VpZ2h0QSwgc2FtX0EpOworICAgICAgICAgICAgVVBEQVRFX1dFSUdIVF9DTElQKGRwcC0+d2VpZ2h0QSwgZHBwLT5kZWx0YSwgc2FtX0EsIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAtMzoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBzYW1fQSwgc2FtX0IsIHRtcDsKKworICAgICAgICAgICAgc2FtX0EgPSBkcHAtPnNhbXBsZXNBWzBdOworICAgICAgICAgICAgc2FtX0IgPSBkcHAtPnNhbXBsZXNCWzBdOworCisgICAgICAgICAgICBkcHAtPnNhbXBsZXNBWzBdID0gdG1wID0gc2FtcGxlc19yW2ldOworICAgICAgICAgICAgc2FtcGxlc19yW2ldID0gdG1wIC09IEFQUExZX1dFSUdIVChkcHAtPndlaWdodEIsIHNhbV9CKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFRfQ0xJUChkcHAtPndlaWdodEIsIGRwcC0+ZGVsdGEsIHNhbV9CLCB0bXApOworCisgICAgICAgICAgICBkcHAtPnNhbXBsZXNCWzBdID0gdG1wID0gc2FtcGxlc19sW2ldOworICAgICAgICAgICAgc2FtcGxlc19sW2ldID0gdG1wIC09IEFQUExZX1dFSUdIVChkcHAtPndlaWdodEEsIHNhbV9BKTsKKyAgICAgICAgICAgIFVQREFURV9XRUlHSFRfQ0xJUChkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbV9BLCB0bXApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworI2RlZmluZSB1cGRhdGVfd2VpZ2h0X2QyKHdlaWdodCwgZGVsdGEsIHNvdXJjZSwgcmVzdWx0KSBcCisgICAgaWYgKHNvdXJjZSAmJiByZXN1bHQpIFwKKyAgICAgICAgd2VpZ2h0IC09ICgoKHNvdXJjZSBeIHJlc3VsdCkgPj4gMjkpICYgNCkgLSAyOworCisjZGVmaW5lIHVwZGF0ZV93ZWlnaHRfY2xpcF9kMih3ZWlnaHQsIGRlbHRhLCBzb3VyY2UsIHJlc3VsdCkgXAorICAgIGlmIChzb3VyY2UgJiYgcmVzdWx0KSB7IFwKKyAgICAgICAgY29uc3QgaW50MzJfdCBzID0gKHNvdXJjZSBeIHJlc3VsdCkgPj4gMzE7IFwKKyAgICAgICAgaWYgKCh3ZWlnaHQgPSAod2VpZ2h0IF4gcykgKyAoMiAtIHMpKSA+IDEwMjQpIHdlaWdodCA9IDEwMjQ7IFwKKyAgICAgICAgd2VpZ2h0ID0gKHdlaWdodCBeIHMpIC0gczsgXAorICAgIH0KKworc3RhdGljIHZvaWQgZGVjb3JyX3N0ZXJlb19wYXNzX2lkMihzdHJ1Y3QgRGVjb3JyICpkcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnNhbXBsZXNfbCwgaW50MzJfdCAqc2FtcGxlc19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgbSwgazsKKworICAgIHN3aXRjaCAoZHBwLT52YWx1ZSkgeworICAgIGNhc2UgMTc6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtLCB0bXA7CisKKyAgICAgICAgICAgIHNhbSA9IDIgKiBkcHAtPnNhbXBsZXNBWzBdIC0gZHBwLT5zYW1wbGVzQVsxXTsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0FbMV0gPSBkcHAtPnNhbXBsZXNBWzBdOworICAgICAgICAgICAgc2FtcGxlc19sW2ldID0gdG1wID0gKGRwcC0+c2FtcGxlc0FbMF0gPSBzYW1wbGVzX2xbaV0pIC0gQVBQTFlfV0VJR0hUX0koZHBwLT53ZWlnaHRBLCBzYW0pOworICAgICAgICAgICAgdXBkYXRlX3dlaWdodF9kMihkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKworICAgICAgICAgICAgc2FtID0gMiAqIGRwcC0+c2FtcGxlc0JbMF0gLSBkcHAtPnNhbXBsZXNCWzFdOworICAgICAgICAgICAgZHBwLT5zYW1wbGVzQlsxXSA9IGRwcC0+c2FtcGxlc0JbMF07CisgICAgICAgICAgICBzYW1wbGVzX3JbaV0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQlswXSA9IHNhbXBsZXNfcltpXSkgLSBBUFBMWV9XRUlHSFRfSShkcHAtPndlaWdodEIsIHNhbSk7CisgICAgICAgICAgICB1cGRhdGVfd2VpZ2h0X2QyKGRwcC0+d2VpZ2h0QiwgZHBwLT5kZWx0YSwgc2FtLCB0bXApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTg6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtLCB0bXA7CisKKyAgICAgICAgICAgIHNhbSA9IGRwcC0+c2FtcGxlc0FbMF0gKyAoKGRwcC0+c2FtcGxlc0FbMF0gLSBkcHAtPnNhbXBsZXNBWzFdKSA+PiAxKTsKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0FbMV0gPSBkcHAtPnNhbXBsZXNBWzBdOworICAgICAgICAgICAgc2FtcGxlc19sW2ldID0gdG1wID0gKGRwcC0+c2FtcGxlc0FbMF0gPSBzYW1wbGVzX2xbaV0pIC0gQVBQTFlfV0VJR0hUX0koZHBwLT53ZWlnaHRBLCBzYW0pOworICAgICAgICAgICAgdXBkYXRlX3dlaWdodF9kMihkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKworICAgICAgICAgICAgc2FtID0gZHBwLT5zYW1wbGVzQlswXSArICgoZHBwLT5zYW1wbGVzQlswXSAtIGRwcC0+c2FtcGxlc0JbMV0pID4+IDEpOworICAgICAgICAgICAgZHBwLT5zYW1wbGVzQlsxXSA9IGRwcC0+c2FtcGxlc0JbMF07CisgICAgICAgICAgICBzYW1wbGVzX3JbaV0gPSB0bXAgPSAoZHBwLT5zYW1wbGVzQlswXSA9IHNhbXBsZXNfcltpXSkgLSBBUFBMWV9XRUlHSFRfSShkcHAtPndlaWdodEIsIHNhbSk7CisgICAgICAgICAgICB1cGRhdGVfd2VpZ2h0X2QyKGRwcC0+d2VpZ2h0QiwgZHBwLT5kZWx0YSwgc2FtLCB0bXApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGZvciAobSA9IDAsIGsgPSBkcHAtPnZhbHVlICYgKE1BWF9URVJNIC0gMSksIGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbSwgdG1wOworCisgICAgICAgICAgICBzYW0gPSBkcHAtPnNhbXBsZXNBW21dOworICAgICAgICAgICAgc2FtcGxlc19sW2ldID0gdG1wID0gKGRwcC0+c2FtcGxlc0Fba10gPSBzYW1wbGVzX2xbaV0pIC0gQVBQTFlfV0VJR0hUX0koZHBwLT53ZWlnaHRBLCBzYW0pOworICAgICAgICAgICAgdXBkYXRlX3dlaWdodF9kMihkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbSwgdG1wKTsKKworICAgICAgICAgICAgc2FtID0gZHBwLT5zYW1wbGVzQlttXTsKKyAgICAgICAgICAgIHNhbXBsZXNfcltpXSA9IHRtcCA9IChkcHAtPnNhbXBsZXNCW2tdID0gc2FtcGxlc19yW2ldKSAtIEFQUExZX1dFSUdIVF9JKGRwcC0+d2VpZ2h0Qiwgc2FtKTsKKyAgICAgICAgICAgIHVwZGF0ZV93ZWlnaHRfZDIoZHBwLT53ZWlnaHRCLCBkcHAtPmRlbHRhLCBzYW0sIHRtcCk7CisKKyAgICAgICAgICAgIG0gPSAobSArIDEpICYgKE1BWF9URVJNIC0gMSk7CisgICAgICAgICAgICBrID0gKGsgKyAxKSAmIChNQVhfVEVSTSAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG0pIHsKKyAgICAgICAgICAgIGludDMyX3QgdGVtcF9BW01BWF9URVJNXSwgdGVtcF9CW01BWF9URVJNXTsKKworICAgICAgICAgICAgbWVtY3B5KHRlbXBfQSwgZHBwLT5zYW1wbGVzQSwgc2l6ZW9mKGRwcC0+c2FtcGxlc0EpKTsKKyAgICAgICAgICAgIG1lbWNweSh0ZW1wX0IsIGRwcC0+c2FtcGxlc0IsIHNpemVvZihkcHAtPnNhbXBsZXNCKSk7CisKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBNQVhfVEVSTTsgaysrKSB7CisgICAgICAgICAgICAgICAgZHBwLT5zYW1wbGVzQVtrXSA9IHRlbXBfQVttXTsKKyAgICAgICAgICAgICAgICBkcHAtPnNhbXBsZXNCW2tdID0gdGVtcF9CW21dOworICAgICAgICAgICAgICAgIG0gPSAobSArIDEpICYgKE1BWF9URVJNIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAtMToKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBzYW1fQSwgc2FtX0IsIHRtcDsKKworICAgICAgICAgICAgc2FtX0EgPSBkcHAtPnNhbXBsZXNBWzBdOworICAgICAgICAgICAgc2FtcGxlc19sW2ldID0gdG1wID0gKHNhbV9CID0gc2FtcGxlc19sW2ldKSAtIEFQUExZX1dFSUdIVF9JKGRwcC0+d2VpZ2h0QSwgc2FtX0EpOworICAgICAgICAgICAgdXBkYXRlX3dlaWdodF9jbGlwX2QyKGRwcC0+d2VpZ2h0QSwgZHBwLT5kZWx0YSwgc2FtX0EsIHRtcCk7CisKKyAgICAgICAgICAgIHNhbXBsZXNfcltpXSA9IHRtcCA9IChkcHAtPnNhbXBsZXNBWzBdID0gc2FtcGxlc19yW2ldKSAtIEFQUExZX1dFSUdIVF9JKGRwcC0+d2VpZ2h0Qiwgc2FtX0IpOworICAgICAgICAgICAgdXBkYXRlX3dlaWdodF9jbGlwX2QyKGRwcC0+d2VpZ2h0QiwgZHBwLT5kZWx0YSwgc2FtX0IsIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAtMjoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBzYW1fQSwgc2FtX0IsIHRtcDsKKworICAgICAgICAgICAgc2FtX0IgPSBkcHAtPnNhbXBsZXNCWzBdOworICAgICAgICAgICAgc2FtcGxlc19yW2ldID0gdG1wID0gKHNhbV9BID0gc2FtcGxlc19yW2ldKSAtIEFQUExZX1dFSUdIVF9JKGRwcC0+d2VpZ2h0Qiwgc2FtX0IpOworICAgICAgICAgICAgdXBkYXRlX3dlaWdodF9jbGlwX2QyKGRwcC0+d2VpZ2h0QiwgZHBwLT5kZWx0YSwgc2FtX0IsIHRtcCk7CisKKyAgICAgICAgICAgIHNhbXBsZXNfbFtpXSA9IHRtcCA9IChkcHAtPnNhbXBsZXNCWzBdID0gc2FtcGxlc19sW2ldKSAtIEFQUExZX1dFSUdIVF9JKGRwcC0+d2VpZ2h0QSwgc2FtX0EpOworICAgICAgICAgICAgdXBkYXRlX3dlaWdodF9jbGlwX2QyKGRwcC0+d2VpZ2h0QSwgZHBwLT5kZWx0YSwgc2FtX0EsIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAtMzoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBzYW1fQSwgc2FtX0IsIHRtcDsKKworICAgICAgICAgICAgc2FtX0EgPSBkcHAtPnNhbXBsZXNBWzBdOworICAgICAgICAgICAgc2FtX0IgPSBkcHAtPnNhbXBsZXNCWzBdOworCisgICAgICAgICAgICBkcHAtPnNhbXBsZXNBWzBdID0gdG1wID0gc2FtcGxlc19yW2ldOworICAgICAgICAgICAgc2FtcGxlc19yW2ldID0gdG1wIC09IEFQUExZX1dFSUdIVF9JKGRwcC0+d2VpZ2h0Qiwgc2FtX0IpOworICAgICAgICAgICAgdXBkYXRlX3dlaWdodF9jbGlwX2QyKGRwcC0+d2VpZ2h0QiwgZHBwLT5kZWx0YSwgc2FtX0IsIHRtcCk7CisKKyAgICAgICAgICAgIGRwcC0+c2FtcGxlc0JbMF0gPSB0bXAgPSBzYW1wbGVzX2xbaV07CisgICAgICAgICAgICBzYW1wbGVzX2xbaV0gPSB0bXAgLT0gQVBQTFlfV0VJR0hUX0koZHBwLT53ZWlnaHRBLCBzYW1fQSk7CisgICAgICAgICAgICB1cGRhdGVfd2VpZ2h0X2NsaXBfZDIoZHBwLT53ZWlnaHRBLCBkcHAtPmRlbHRhLCBzYW1fQSwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9tZXRhZGF0YV9ibG9jayhQdXRCeXRlQ29udGV4dCAqcGIsIGludCBmbGFncywgaW50IHNpemUpCit7CisgICAgaWYgKHNpemUgJiAxKQorICAgICAgICBmbGFncyB8PSBXUF9JREZfT0REOworCisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGZsYWdzKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgKHNpemUgKyAxKSA+PiAxKTsKK30KKworc3RhdGljIGludCB3YXZwYWNrX2VuY29kZV9ibG9jayhXYXZQYWNrRW5jb2RlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc2FtcGxlc19sLCBpbnQzMl90ICpzYW1wbGVzX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm91dCwgaW50IG91dF9zaXplKQoreworICAgIGludCBibG9ja19zaXplLCBzdGFydCwgZW5kLCBkYXRhX3NpemUsIHRjb3VudCwgdGVtcCwgbSA9IDA7CisgICAgaW50IGksIGosIHJldCA9IDAsIGdvdF9leHRyYSA9IDAsIG5iX3NhbXBsZXMgPSBzLT5ibG9ja19zYW1wbGVzOworICAgIHVpbnQzMl90IGNyYyA9IDB4ZmZmZmZmZmZ1OworICAgIHN0cnVjdCBEZWNvcnIgKmRwcDsKKyAgICBQdXRCeXRlQ29udGV4dCBwYjsKKworICAgIGlmIChzLT5mbGFncyAmIFdWX01PTk9fREFUQSkgeworICAgICAgICBDTEVBUihzLT53KTsKKyAgICB9CisgICAgaWYgKCEocy0+ZmxhZ3MgJiBXVl9NT05PKSAmJiBzLT5vcHRpbWl6ZV9tb25vKSB7CisgICAgICAgIGludDMyX3QgbG9yID0gMCwgZGlmZiA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgbG9yICB8PSBzYW1wbGVzX2xbaV0gfCBzYW1wbGVzX3JbaV07CisgICAgICAgICAgICBkaWZmIHw9IHNhbXBsZXNfbFtpXSAtIHNhbXBsZXNfcltpXTsKKworICAgICAgICAgICAgaWYgKGxvciAmJiBkaWZmKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPT0gbmJfc2FtcGxlcyAmJiBsb3IgJiYgIWRpZmYpIHsKKyAgICAgICAgICAgIHMtPmZsYWdzICY9IH4oV1ZfSk9JTlRfU1RFUkVPIHwgV1ZfQ1JPU1NfREVDT1JSKTsKKyAgICAgICAgICAgIHMtPmZsYWdzIHw9IFdWX0ZBTFNFX1NURVJFTzsKKworICAgICAgICAgICAgaWYgKCFzLT5mYWxzZV9zdGVyZW8pIHsKKyAgICAgICAgICAgICAgICBzLT5mYWxzZV9zdGVyZW8gPSAxOworICAgICAgICAgICAgICAgIHMtPm51bV90ZXJtcyA9IDA7CisgICAgICAgICAgICAgICAgQ0xFQVIocy0+dyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+ZmFsc2Vfc3RlcmVvKSB7CisgICAgICAgICAgICBzLT5mYWxzZV9zdGVyZW8gPSAwOworICAgICAgICAgICAgcy0+bnVtX3Rlcm1zID0gMDsKKyAgICAgICAgICAgIENMRUFSKHMtPncpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPmZsYWdzICYgU0hJRlRfTUFTSykgeworICAgICAgICBpbnQgc2hpZnQgPSAocy0+ZmxhZ3MgJiBTSElGVF9NQVNLKSA+PiBTSElGVF9MU0I7CisgICAgICAgIGludCBtYWcgPSAocy0+ZmxhZ3MgJiBNQUdfTUFTSykgPj4gTUFHX0xTQjsKKworICAgICAgICBpZiAocy0+ZmxhZ3MgJiBXVl9NT05PX0RBVEEpCisgICAgICAgICAgICBzaGlmdF9tb25vKHNhbXBsZXNfbCwgbmJfc2FtcGxlcywgc2hpZnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzaGlmdF9zdGVyZW8oc2FtcGxlc19sLCBzYW1wbGVzX3IsIG5iX3NhbXBsZXMsIHNoaWZ0KTsKKworICAgICAgICBpZiAoKG1hZyAtPSBzaGlmdCkgPCAwKQorICAgICAgICAgICAgcy0+ZmxhZ3MgJj0gfk1BR19NQVNLOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5mbGFncyAtPSAoMSA8PCBNQUdfTFNCKSAqIHNoaWZ0OworICAgIH0KKworICAgIGlmICgocy0+ZmxhZ3MgJiBXVl9GTE9BVF9EQVRBKSB8fCAocy0+ZmxhZ3MgJiBNQUdfTUFTSykgPj4gTUFHX0xTQiA+PSAyNCkgeworICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnMtPm9yaWdfbCwgJnMtPm9yaWdfbF9zaXplLCBzaXplb2YoaW50MzJfdCkgKiBuYl9zYW1wbGVzKTsKKyAgICAgICAgbWVtY3B5KHMtPm9yaWdfbCwgc2FtcGxlc19sLCBzaXplb2YoaW50MzJfdCkgKiBuYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBXVl9NT05PX0RBVEEpKSB7CisgICAgICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnMtPm9yaWdfciwgJnMtPm9yaWdfcl9zaXplLCBzaXplb2YoaW50MzJfdCkgKiBuYl9zYW1wbGVzKTsKKyAgICAgICAgICAgIG1lbWNweShzLT5vcmlnX3IsIHNhbXBsZXNfciwgc2l6ZW9mKGludDMyX3QpICogbmJfc2FtcGxlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+ZmxhZ3MgJiBXVl9GTE9BVF9EQVRBKQorICAgICAgICAgICAgZ290X2V4dHJhID0gc2Nhbl9mbG9hdChzLCBzYW1wbGVzX2wsIHNhbXBsZXNfciwgbmJfc2FtcGxlcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdF9leHRyYSA9IHNjYW5faW50MzIocywgc2FtcGxlc19sLCBzYW1wbGVzX3IsIG5iX3NhbXBsZXMpOworICAgICAgICBzLT5udW1fdGVybXMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHNjYW5faW50MjMocywgc2FtcGxlc19sLCBzYW1wbGVzX3IsIG5iX3NhbXBsZXMpOworICAgICAgICBpZiAocy0+c2hpZnQgIT0gcy0+aW50MzJfemVyb3MgKyBzLT5pbnQzMl9vbmVzICsgcy0+aW50MzJfZHVwcykgeworICAgICAgICAgICAgcy0+c2hpZnQgPSBzLT5pbnQzMl96ZXJvcyArIHMtPmludDMyX29uZXMgKyBzLT5pbnQzMl9kdXBzOworICAgICAgICAgICAgcy0+bnVtX3Rlcm1zID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcy0+bnVtX3Bhc3NlcyAmJiAhcy0+bnVtX3Rlcm1zKSB7CisgICAgICAgIHMtPm51bV9wYXNzZXMgPSAxOworCisgICAgICAgIGlmIChzLT5mbGFncyAmIFdWX01PTk9fREFUQSkKKyAgICAgICAgICAgIHJldCA9IHd2X21vbm8ocywgc2FtcGxlc19sLCAxLCAwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gd3Zfc3RlcmVvKHMsIHNhbXBsZXNfbCwgc2FtcGxlc19yLCAxLCAwKTsKKworICAgICAgICBzLT5udW1fcGFzc2VzID0gMDsKKyAgICB9CisgICAgaWYgKHMtPmZsYWdzICYgV1ZfTU9OT19EQVRBKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspCisgICAgICAgICAgICBjcmMgKz0gKGNyYyA8PCAxKSArIHNhbXBsZXNfbFtpXTsKKworICAgICAgICBpZiAocy0+bnVtX3Bhc3NlcykKKyAgICAgICAgICAgIHJldCA9IHd2X21vbm8ocywgc2FtcGxlc19sLCAhcy0+bnVtX3Rlcm1zLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKQorICAgICAgICAgICAgY3JjICs9IChjcmMgPDwgMykgKyAoc2FtcGxlc19sW2ldIDw8IDEpICsgc2FtcGxlc19sW2ldICsgc2FtcGxlc19yW2ldOworCisgICAgICAgIGlmIChzLT5udW1fcGFzc2VzKQorICAgICAgICAgICAgcmV0ID0gd3Zfc3RlcmVvKHMsIHNhbXBsZXNfbCwgc2FtcGxlc19yLCAhcy0+bnVtX3Rlcm1zLCAxKTsKKyAgICB9CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIXMtPmNoX29mZnNldCkKKyAgICAgICAgcy0+ZmxhZ3MgfD0gV1ZfSU5JVElBTF9CTE9DSzsKKworICAgIHMtPmNoX29mZnNldCArPSAxICsgIShzLT5mbGFncyAmIFdWX01PTk8pOworCisgICAgaWYgKHMtPmNoX29mZnNldCA9PSBzLT5hdmN0eC0+Y2hhbm5lbHMpCisgICAgICAgIHMtPmZsYWdzIHw9IFdWX0ZJTkFMX0JMT0NLOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIoJnBiLCBvdXQsIG91dF9zaXplKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfbGUzMigmcGIsIE1LVEFHKCd3JywgJ3YnLCAncCcsICdrJykpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyKCZwYiwgMCk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2xlMTYoJnBiLCAweDQxMCk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2xlMTYoJnBiLCAwKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfbGUzMigmcGIsIDApOworICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyKCZwYiwgcy0+c2FtcGxlX2luZGV4KTsKKyAgICBieXRlc3RyZWFtMl9wdXRfbGUzMigmcGIsIG5iX3NhbXBsZXMpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyKCZwYiwgcy0+ZmxhZ3MpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyKCZwYiwgY3JjKTsKKworICAgIGlmIChzLT5mbGFncyAmIFdWX0lOSVRJQUxfQkxPQ0sgJiYKKyAgICAgICAgcy0+YXZjdHgtPmNoYW5uZWxfbGF5b3V0ICE9IEFWX0NIX0xBWU9VVF9NT05PICYmCisgICAgICAgIHMtPmF2Y3R4LT5jaGFubmVsX2xheW91dCAhPSBBVl9DSF9MQVlPVVRfU1RFUkVPKSB7CisgICAgICAgIHB1dF9tZXRhZGF0YV9ibG9jaygmcGIsIFdQX0lEX0NIQU5JTkZPLCA1KTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCBzLT5hdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUzMigmcGIsIHMtPmF2Y3R4LT5jaGFubmVsX2xheW91dCk7CisgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYiwgMCk7CisgICAgfQorCisgICAgaWYgKChzLT5mbGFncyAmIFNSQVRFX01BU0spID09IFNSQVRFX01BU0spIHsKKyAgICAgICAgcHV0X21ldGFkYXRhX2Jsb2NrKCZwYiwgV1BfSURfU0FNUExFX1JBVEUsIDMpOworICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUyNCgmcGIsIHMtPmF2Y3R4LT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYiwgMCk7CisgICAgfQorCisgICAgcHV0X21ldGFkYXRhX2Jsb2NrKCZwYiwgV1BfSURfREVDVEVSTVMsIHMtPm51bV90ZXJtcyk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV90ZXJtczsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBEZWNvcnIgKmRwcCA9ICZzLT5kZWNvcnJfcGFzc2VzW2ldOworICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsICgoZHBwLT52YWx1ZSArIDUpICYgMHgxZikgfCAoKGRwcC0+ZGVsdGEgPDwgNSkgJiAweGUwKSk7CisgICAgfQorICAgIGlmIChzLT5udW1fdGVybXMgJiAxKQorICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsIDApOworCisjZGVmaW5lIFdSSVRFX0RFQ1dFSUdIVCh0eXBlKSBkbyB7ICAgICAgICAgICAgXAorICAgICAgICB0ZW1wID0gc3RvcmVfd2VpZ2h0KHR5cGUpOyAgICBcCisgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYiwgdGVtcCk7ICAgICAgXAorICAgICAgICB0eXBlID0gcmVzdG9yZV93ZWlnaHQodGVtcCk7ICBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYiwgV1BfSURfREVDV0VJR0hUUyk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCAwKTsKKyAgICBzdGFydCA9IGJ5dGVzdHJlYW0yX3RlbGxfcCgmcGIpOworICAgIGZvciAoaSA9IHMtPm51bV90ZXJtcyAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIHN0cnVjdCBEZWNvcnIgKmRwcCA9ICZzLT5kZWNvcnJfcGFzc2VzW2ldOworCisgICAgICAgIGlmIChzdG9yZV93ZWlnaHQoZHBwLT53ZWlnaHRBKSB8fAorICAgICAgICAgICAgKCEocy0+ZmxhZ3MgJiBXVl9NT05PX0RBVEEpICYmIHN0b3JlX3dlaWdodChkcHAtPndlaWdodEIpKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgdGNvdW50ID0gaSArIDE7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV90ZXJtczsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBEZWNvcnIgKmRwcCA9ICZzLT5kZWNvcnJfcGFzc2VzW2ldOworICAgICAgICBpZiAoaSA8IHRjb3VudCkgeworICAgICAgICAgICAgV1JJVEVfREVDV0VJR0hUKGRwcC0+d2VpZ2h0QSk7CisgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIFdWX01PTk9fREFUQSkpCisgICAgICAgICAgICAgICAgV1JJVEVfREVDV0VJR0hUKGRwcC0+d2VpZ2h0Qik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcHAtPndlaWdodEEgPSBkcHAtPndlaWdodEIgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVuZCA9IGJ5dGVzdHJlYW0yX3RlbGxfcCgmcGIpOworICAgIG91dFtzdGFydCAtIDJdID0gV1BfSURfREVDV0VJR0hUUyB8ICgoKGVuZCAtIHN0YXJ0KSAmIDEpID8gV1BfSURGX09ERDogMCk7CisgICAgb3V0W3N0YXJ0IC0gMV0gPSAoZW5kIC0gc3RhcnQgKyAxKSA+PiAxOworICAgIGlmICgoZW5kIC0gc3RhcnQpICYgMSkKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCAwKTsKKworI2RlZmluZSBXUklURV9ERUNTQU1QTEUodHlwZSkgZG8geyAgICAgICAgXAorICAgICAgICB0ZW1wID0gbG9nMnModHlwZSk7ICAgICAgICAgICAgICAgXAorICAgICAgICB0eXBlID0gd3BfZXhwMih0ZW1wKTsgICAgICAgICAgICAgXAorICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUxNigmcGIsIHRlbXApOyAgXAorICAgIH0gd2hpbGUgKDApCisKKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsIFdQX0lEX0RFQ1NBTVBMRVMpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYiwgMCk7CisgICAgc3RhcnQgPSBieXRlc3RyZWFtMl90ZWxsX3AoJnBiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX3Rlcm1zOyBpKyspIHsKKyAgICAgICAgc3RydWN0IERlY29yciAqZHBwID0gJnMtPmRlY29ycl9wYXNzZXNbaV07CisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIGlmIChkcHAtPnZhbHVlID4gTUFYX1RFUk0pIHsKKyAgICAgICAgICAgICAgICBXUklURV9ERUNTQU1QTEUoZHBwLT5zYW1wbGVzQVswXSk7CisgICAgICAgICAgICAgICAgV1JJVEVfREVDU0FNUExFKGRwcC0+c2FtcGxlc0FbMV0pOworICAgICAgICAgICAgICAgIGlmICghKHMtPmZsYWdzICYgV1ZfTU9OT19EQVRBKSkgeworICAgICAgICAgICAgICAgICAgICBXUklURV9ERUNTQU1QTEUoZHBwLT5zYW1wbGVzQlswXSk7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFX0RFQ1NBTVBMRShkcHAtPnNhbXBsZXNCWzFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRwcC0+dmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgV1JJVEVfREVDU0FNUExFKGRwcC0+c2FtcGxlc0FbMF0pOworICAgICAgICAgICAgICAgIFdSSVRFX0RFQ1NBTVBMRShkcHAtPnNhbXBsZXNCWzBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRwcC0+dmFsdWU7IGorKykgeworICAgICAgICAgICAgICAgICAgICBXUklURV9ERUNTQU1QTEUoZHBwLT5zYW1wbGVzQVtqXSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHMtPmZsYWdzICYgV1ZfTU9OT19EQVRBKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFX0RFQ1NBTVBMRShkcHAtPnNhbXBsZXNCW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDTEVBUihkcHAtPnNhbXBsZXNBKTsKKyAgICAgICAgICAgIENMRUFSKGRwcC0+c2FtcGxlc0IpOworICAgICAgICB9CisgICAgfQorICAgIGVuZCA9IGJ5dGVzdHJlYW0yX3RlbGxfcCgmcGIpOworICAgIG91dFtzdGFydCAtIDFdID0gKGVuZCAtIHN0YXJ0KSA+PiAxOworCisjZGVmaW5lIFdSSVRFX0NIQU5fRU5UUk9QWShjaGFuKSBkbyB7ICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXAgPSB3cF9sb2cyKHMtPncuY1tjaGFuXS5tZWRpYW5baV0pOyBcCisgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUxNigmcGIsIHRlbXApOyAgICAgICAgXAorICAgICAgICAgICAgcy0+dy5jW2NoYW5dLm1lZGlhbltpXSA9IHdwX2V4cDIodGVtcCk7IFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIHB1dF9tZXRhZGF0YV9ibG9jaygmcGIsIFdQX0lEX0VOVFJPUFksIDYgKiAoMSArICghKHMtPmZsYWdzICYgV1ZfTU9OT19EQVRBKSkpKTsKKyAgICBXUklURV9DSEFOX0VOVFJPUFkoMCk7CisgICAgaWYgKCEocy0+ZmxhZ3MgJiBXVl9NT05PX0RBVEEpKQorICAgICAgICBXUklURV9DSEFOX0VOVFJPUFkoMSk7CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBXVl9GTE9BVF9EQVRBKSB7CisgICAgICAgIHB1dF9tZXRhZGF0YV9ibG9jaygmcGIsIFdQX0lEX0ZMT0FUSU5GTywgNCk7CisgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYiwgcy0+ZmxvYXRfZmxhZ3MpOworICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsIHMtPmZsb2F0X3NoaWZ0KTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCBzLT5mbG9hdF9tYXhfZXhwKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCAxMjcpOworICAgIH0KKworICAgIGlmIChzLT5mbGFncyAmIFdWX0lOVDMyX0RBVEEpIHsKKyAgICAgICAgcHV0X21ldGFkYXRhX2Jsb2NrKCZwYiwgV1BfSURfSU5UMzJJTkZPLCA0KTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCBzLT5pbnQzMl9zZW50X2JpdHMpOworICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsIHMtPmludDMyX3plcm9zKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCBzLT5pbnQzMl9vbmVzKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCBzLT5pbnQzMl9kdXBzKTsKKyAgICB9CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBXVl9NT05PX0RBVEEgJiYgIXMtPm51bV9wYXNzZXMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBjb2RlID0gc2FtcGxlc19sW2ldOworCisgICAgICAgICAgICBmb3IgKHRjb3VudCA9IHMtPm51bV90ZXJtcywgZHBwID0gcy0+ZGVjb3JyX3Bhc3NlczsgdGNvdW50LS07IGRwcCsrKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBzYW07CisKKyAgICAgICAgICAgICAgICBpZiAoZHBwLT52YWx1ZSA+IE1BWF9URVJNKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkcHAtPnZhbHVlICYgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbSA9IDIgKiBkcHAtPnNhbXBsZXNBWzBdIC0gZHBwLT5zYW1wbGVzQVsxXTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2FtID0gKDMgKiBkcHAtPnNhbXBsZXNBWzBdIC0gZHBwLT5zYW1wbGVzQVsxXSkgPj4gMTsKKworICAgICAgICAgICAgICAgICAgICBkcHAtPnNhbXBsZXNBWzFdID0gZHBwLT5zYW1wbGVzQVswXTsKKyAgICAgICAgICAgICAgICAgICAgZHBwLT5zYW1wbGVzQVswXSA9IGNvZGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2FtID0gZHBwLT5zYW1wbGVzQVttXTsKKyAgICAgICAgICAgICAgICAgICAgZHBwLT5zYW1wbGVzQVsobSArIGRwcC0+dmFsdWUpICYgKE1BWF9URVJNIC0gMSldID0gY29kZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb2RlIC09IEFQUExZX1dFSUdIVChkcHAtPndlaWdodEEsIHNhbSk7CisgICAgICAgICAgICAgICAgVVBEQVRFX1dFSUdIVChkcHAtPndlaWdodEEsIGRwcC0+ZGVsdGEsIHNhbSwgY29kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG0gPSAobSArIDEpICYgKE1BWF9URVJNIC0gMSk7CisgICAgICAgICAgICBzYW1wbGVzX2xbaV0gPSBjb2RlOworICAgICAgICB9CisgICAgICAgIGlmIChtKSB7CisgICAgICAgICAgICBmb3IgKHRjb3VudCA9IHMtPm51bV90ZXJtcywgZHBwID0gcy0+ZGVjb3JyX3Bhc3NlczsgdGNvdW50LS07IGRwcCsrKQorICAgICAgICAgICAgICAgIGlmIChkcHAtPnZhbHVlID4gMCAmJiBkcHAtPnZhbHVlIDw9IE1BWF9URVJNKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wX0FbTUFYX1RFUk1dLCB0ZW1wX0JbTUFYX1RFUk1dOworICAgICAgICAgICAgICAgIGludCBrOworCisgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfQSwgZHBwLT5zYW1wbGVzQSwgc2l6ZW9mKGRwcC0+c2FtcGxlc0EpKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9CLCBkcHAtPnNhbXBsZXNCLCBzaXplb2YoZHBwLT5zYW1wbGVzQikpOworCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IE1BWF9URVJNOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHBwLT5zYW1wbGVzQVtrXSA9IHRlbXBfQVttXTsKKyAgICAgICAgICAgICAgICAgICAgZHBwLT5zYW1wbGVzQltrXSA9IHRlbXBfQlttXTsKKyAgICAgICAgICAgICAgICAgICAgbSA9IChtICsgMSkgJiAoTUFYX1RFUk0gLSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzLT5udW1fcGFzc2VzKSB7CisgICAgICAgIGlmIChzLT5mbGFncyAmIFdWX0pPSU5UX1NURVJFTykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykKKyAgICAgICAgICAgICAgICBzYW1wbGVzX3JbaV0gKz0gKChzYW1wbGVzX2xbaV0gLT0gc2FtcGxlc19yW2ldKSA+PiAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fdGVybXM7IGkrKykgeworICAgICAgICAgICAgc3RydWN0IERlY29yciAqZHBwID0gJnMtPmRlY29ycl9wYXNzZXNbaV07CisgICAgICAgICAgICBpZiAoKChzLT5mbGFncyAmIE1BR19NQVNLKSA+PiBNQUdfTFNCKSA+PSAxNiB8fCBkcHAtPmRlbHRhICE9IDIpCisgICAgICAgICAgICAgICAgZGVjb3JyX3N0ZXJlb19wYXNzMihkcHAsIHNhbXBsZXNfbCwgc2FtcGxlc19yLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkZWNvcnJfc3RlcmVvX3Bhc3NfaWQyKGRwcCwgc2FtcGxlc19sLCBzYW1wbGVzX3IsIG5iX3NhbXBsZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCBXUF9JRF9EQVRBIHwgV1BfSURGX0xPTkcpOworICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBwYi5idWZmZXIgKyAzLCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdF9wKCZwYikpOworICAgIGlmIChzLT5mbGFncyAmIFdWX01PTk9fREFUQSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKQorICAgICAgICAgICAgd2F2cGFja19lbmNvZGVfc2FtcGxlKHMsICZzLT53LmNbMF0sIHMtPnNhbXBsZXNbMF1baV0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIHdhdnBhY2tfZW5jb2RlX3NhbXBsZShzLCAmcy0+dy5jWzBdLCBzLT5zYW1wbGVzWzBdW2ldKTsKKyAgICAgICAgICAgIHdhdnBhY2tfZW5jb2RlX3NhbXBsZShzLCAmcy0+dy5jWzFdLCBzLT5zYW1wbGVzWzFdW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbmNvZGVfZmx1c2gocyk7CisgICAgZmx1c2hfcHV0X2JpdHMoJnMtPnBiKTsKKyAgICBkYXRhX3NpemUgPSBwdXRfYml0c19jb3VudCgmcy0+cGIpID4+IDM7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2xlMjQoJnBiLCAoZGF0YV9zaXplICsgMSkgPj4gMSk7CisgICAgYnl0ZXN0cmVhbTJfc2tpcF9wKCZwYiwgZGF0YV9zaXplKTsKKyAgICBpZiAoZGF0YV9zaXplICYgMSkKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCAwKTsKKworICAgIGlmIChnb3RfZXh0cmEpIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCBXUF9JRF9FWFRSQUJJVFMgfCBXUF9JREZfTE9ORyk7CisgICAgICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBwYi5idWZmZXIgKyA3LCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdF9wKCZwYikpOworICAgICAgICBpZiAocy0+ZmxhZ3MgJiBXVl9GTE9BVF9EQVRBKQorICAgICAgICAgICAgcGFja19mbG9hdChzLCBzLT5vcmlnX2wsIHMtPm9yaWdfciwgbmJfc2FtcGxlcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhY2tfaW50MzIocywgcy0+b3JpZ19sLCBzLT5vcmlnX3IsIG5iX3NhbXBsZXMpOworICAgICAgICBmbHVzaF9wdXRfYml0cygmcy0+cGIpOworICAgICAgICBkYXRhX3NpemUgPSBwdXRfYml0c19jb3VudCgmcy0+cGIpID4+IDM7CisgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTI0KCZwYiwgKGRhdGFfc2l6ZSArIDUpID4+IDEpOworICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUzMigmcGIsIHMtPmNyY194KTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcF9wKCZwYiwgZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKGRhdGFfc2l6ZSAmIDEpCisgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsIDApOworICAgIH0KKworICAgIGJsb2NrX3NpemUgPSBieXRlc3RyZWFtMl90ZWxsX3AoJnBiKTsKKyAgICBBVl9XTDMyKG91dCArIDQsIGJsb2NrX3NpemUgLSA4KTsKKworICAgIGF2X2Fzc2VydDAoIWJ5dGVzdHJlYW0yX2dldF9lb2YoJnBiKSk7CisKKyAgICByZXR1cm4gYmxvY2tfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgZmlsbF9idWZmZXIoV2F2UGFja0VuY29kZUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKnNyYywgaW50MzJfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMpCit7CisgICAgaW50IGk7CisKKyNkZWZpbmUgQ09QWV9TQU1QTEVTKHR5cGUsIG9mZnNldCwgc2hpZnQpIGRvIHsgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHR5cGUgKnNwdHIgPSAoY29uc3QgdHlwZSAqKXNyYzsgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IChzcHRyW2ldIC0gb2Zmc2V0KSA+PiBzaGlmdDsgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIHN3aXRjaCAocy0+YXZjdHgtPnNhbXBsZV9mbXQpIHsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfVThQOgorICAgICAgICBDT1BZX1NBTVBMRVMoaW50OF90LCAweDgwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNlA6CisgICAgICAgIENPUFlfU0FNUExFUyhpbnQxNl90LCAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMlA6CisgICAgICAgIGlmIChzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA8PSAyNCkgeworICAgICAgICAgICAgQ09QWV9TQU1QTEVTKGludDMyX3QsIDAsIDgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUUDoKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBuYl9zYW1wbGVzICogNCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfc2FtcGxlcmF0ZShXYXZQYWNrRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisgICAgICAgIGlmICh3dl9yYXRlc1tpXSA9PSBzLT5hdmN0eC0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzLT5mbGFncyA9IGkgPDwgU1JBVEVfTFNCOworfQorCitzdGF0aWMgaW50IHdhdnBhY2tfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBXYXZQYWNrRW5jb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGJ1Zl9zaXplLCByZXQ7CisgICAgdWludDhfdCAqYnVmOworCisgICAgcy0+YmxvY2tfc2FtcGxlcyA9IGZyYW1lLT5uYl9zYW1wbGVzOworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcy0+c2FtcGxlc1swXSwgJnMtPnNhbXBsZXNfc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDMyX3QpICogcy0+YmxvY2tfc2FtcGxlcyk7CisgICAgaWYgKCFzLT5zYW1wbGVzWzBdKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiAxKSB7CisgICAgICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcy0+c2FtcGxlc1sxXSwgJnMtPnNhbXBsZXNfc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQzMl90KSAqIHMtPmJsb2NrX3NhbXBsZXMpOworICAgICAgICBpZiAoIXMtPnNhbXBsZXNbMV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGJ1Zl9zaXplID0gcy0+YmxvY2tfc2FtcGxlcyAqIGF2Y3R4LT5jaGFubmVscyAqIDgKKyAgICAgICAgICAgICArIDIwMCAvKiBmb3IgaGVhZGVycyAqLzsKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBidWZfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBidWYgPSBhdnBrdC0+ZGF0YTsKKworICAgIGZvciAocy0+Y2hfb2Zmc2V0ID0gMDsgcy0+Y2hfb2Zmc2V0IDwgYXZjdHgtPmNoYW5uZWxzOykgeworICAgICAgICBzZXRfc2FtcGxlcmF0ZShzKTsKKworICAgICAgICBzd2l0Y2ggKHMtPmF2Y3R4LT5zYW1wbGVfZm10KSB7CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOiBzLT5mbGFncyB8PSAxOyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMlA6IHMtPmZsYWdzIHw9IDMgLSAocy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPD0gMjQpOyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVFA6IHMtPmZsYWdzIHw9IDMgfCBXVl9GTE9BVF9EQVRBOworICAgICAgICB9CisKKyAgICAgICAgZmlsbF9idWZmZXIocywgZnJhbWUtPmV4dGVuZGVkX2RhdGFbcy0+Y2hfb2Zmc2V0XSwgcy0+c2FtcGxlc1swXSwgcy0+YmxvY2tfc2FtcGxlcyk7CisgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgLSBzLT5jaF9vZmZzZXQgPT0gMSkgeworICAgICAgICAgICAgcy0+ZmxhZ3MgfD0gV1ZfTU9OTzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPmZsYWdzIHw9IFdWX0NST1NTX0RFQ09SUjsKKyAgICAgICAgICAgIGZpbGxfYnVmZmVyKHMsIGZyYW1lLT5leHRlbmRlZF9kYXRhW3MtPmNoX29mZnNldCArIDFdLCBzLT5zYW1wbGVzWzFdLCBzLT5ibG9ja19zYW1wbGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmZsYWdzICs9ICgxIDw8IE1BR19MU0IpICogKChzLT5mbGFncyAmIDMpICogOCArIDcpOworCisgICAgICAgIGlmICgocmV0ID0gd2F2cGFja19lbmNvZGVfYmxvY2socywgcy0+c2FtcGxlc1swXSwgcy0+c2FtcGxlc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1Zl9zaXplKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBidWYgICAgICArPSByZXQ7CisgICAgICAgIGJ1Zl9zaXplIC09IHJldDsKKyAgICB9CisgICAgcy0+c2FtcGxlX2luZGV4ICs9IGZyYW1lLT5uYl9zYW1wbGVzOworCisgICAgYXZwa3QtPnB0cyAgICAgID0gZnJhbWUtPnB0czsKKyAgICBhdnBrdC0+c2l6ZSAgICAgPSBidWYgLSBhdnBrdC0+ZGF0YTsKKyAgICBhdnBrdC0+ZHVyYXRpb24gPSBmZl9zYW1wbGVzX3RvX3RpbWVfYmFzZShhdmN0eCwgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB3YXZwYWNrX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgV2F2UGFja0VuY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9URVJNUyArIDI7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmcy0+c2FtcGxlcHRyc1tpXVswXSk7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5zYW1wbGVwdHJzW2ldWzFdKTsKKyAgICAgICAgcy0+c2FtcGxlcHRyc19zaXplW2ldWzBdID0gcy0+c2FtcGxlcHRyc19zaXplW2ldWzFdID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5zYW1wbGVzW2ldKTsKKyAgICAgICAgcy0+c2FtcGxlc19zaXplW2ldID0gMDsKKworICAgICAgICBhdl9mcmVlcCgmcy0+YmVzdF9idWZmZXJbaV0pOworICAgICAgICBzLT5iZXN0X2J1ZmZlcl9zaXplW2ldID0gMDsKKworICAgICAgICBhdl9mcmVlcCgmcy0+dGVtcF9idWZmZXJbaV1bMF0pOworICAgICAgICBhdl9mcmVlcCgmcy0+dGVtcF9idWZmZXJbaV1bMV0pOworICAgICAgICBzLT50ZW1wX2J1ZmZlcl9zaXplW2ldWzBdID0gcy0+dGVtcF9idWZmZXJfc2l6ZVtpXVsxXSA9IDA7CisgICAgfQorCisgICAgYXZfZnJlZXAoJnMtPmpzX2xlZnQpOworICAgIGF2X2ZyZWVwKCZzLT5qc19yaWdodCk7CisgICAgcy0+anNfbGVmdF9zaXplID0gcy0+anNfcmlnaHRfc2l6ZSA9IDA7CisKKyAgICBhdl9mcmVlcCgmcy0+b3JpZ19sKTsKKyAgICBhdl9mcmVlcCgmcy0+b3JpZ19yKTsKKyAgICBzLT5vcmlnX2xfc2l6ZSA9IHMtPm9yaWdfcl9zaXplID0gMDsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihXYXZQYWNrRW5jb2RlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19BVURJT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJqb2ludF9zdGVyZW8iLCAgIiIsIE9GRlNFVChqb2ludCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sLTEsIDEsIEZMQUdTLCAiam9pbnQiIH0sCisgICAgeyAib24iLCAgICJtaWQvc2lkZSIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PSAxfSwgMCwgMCwgRkxBR1MsICJqb2ludCJ9LAorICAgIHsgIm9mZiIsICAibGVmdC9yaWdodCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0tMX0sIDAsIDAsIEZMQUdTLCAiam9pbnQifSwKKyAgICB7ICJhdXRvIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PSAwfSwgMCwgMCwgRkxBR1MsICJqb2ludCJ9LAorICAgIHsgIm9wdGltaXplX21vbm8iLCAgICAgICAgIiIsIE9GRlNFVChvcHRpbWl6ZV9tb25vKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMSwgRkxBR1MsICJvcHRfbW9ubyIgfSwKKyAgICB7ICJvbiIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgIm9wdF9tb25vIn0sCisgICAgeyAib2ZmIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgRkxBR1MsICJvcHRfbW9ubyJ9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgd2F2cGFja19lbmNvZGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIldhdlBhY2sgZW5jb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX3dhdnBhY2tfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid2F2cGFjayIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldhdlBhY2siKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV0FWUEFDSywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoV2F2UGFja0VuY29kZUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ3YXZwYWNrX2VuY29kZXJfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgID0gd2F2cGFja19lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSB3YXZwYWNrX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSB3YXZwYWNrX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9VOFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzE2UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzJQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dhdnBhY2tlbmMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3dhdnBhY2tlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQyYTAxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvd2F2cGFja2VuYy5oCkBAIC0wLDAgKzEsNjY0IEBACisvKgorICogV2F2UGFjayBsb3NzbGVzcyBhdWRpbyBlbmNvZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19XQVZQQUNLRU5DX0gKKyNkZWZpbmUgQVZDT0RFQ19XQVZQQUNLRU5DX0gKKworI2luY2x1ZGUgIndhdnBhY2suaCIKKwordHlwZWRlZiBzdHJ1Y3QgV2F2UGFja0RlY29yclNwZWMgeworICAgIGludDhfdCBqb2ludF9zdGVyZW8sIGRlbHRhLCB0ZXJtc1tNQVhfVEVSTVMrMV07Cit9IFdhdlBhY2tEZWNvcnJTcGVjOworCitzdGF0aWMgY29uc3QgV2F2UGFja0RlY29yclNwZWMgZmFzdF9zcGVjc1tdID0geworIHsgMSwgMiwgeyAxOCwxNyB9IH0sIHsgMSwgMSwgeyAxNywxNyB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sCisgeyAwLCAxLCB7IDE3LDE3IH0gfSwgeyAxLCAzLCB7ICAxLDE4IH0gfSwgeyAxLCAxLCB7IDE3LCAxIH0gfSwKKyB7IDAsIDEsIHsgIDEsMTcgfSB9LCB7IDAsIDEsIHsgLTIsMTcgfSB9LCB7IDAsIDIsIHsgLTEsMTcgfSB9LAorIHsgMSwgMSwgeyAxNywgMiB9IH0sIHsgMCwgMywgeyAxOCwxOCB9IH0sIHsgMCwgMSwgeyAxNywgMSB9IH0sCisgeyAxLCA2LCB7ICAxLCAyIH0gfSwgeyAxLCAxLCB7IDE3LCAzIH0gfSwgeyAwLCAxLCB7IC0yLCAzIH0gfSwKKyB7IDAsIDEsIHsgIDIsMTcgfSB9LCB7IDAsIDEsIHsgMTgsLTIgfSB9LCB7IDAsIDEsIHsgLTEsMTcgfSB9LAorIHsgMCwgMSwgeyAxOCwxNyB9IH0sIHsgMCwgMSwgeyAxNywgMiB9IH0sIHsgMSwgMiwgeyAxOCwtMiB9IH0sCisgeyAxLCAxLCB7ICAxLDE3IH0gfSwgeyAwLCAzLCB7IDE4LCAyIH0gfSwgeyAwLCAxLCB7IDE3LC0yIH0gfSwKKyB7IDAsIDEsIHsgMTgsLTIgfSB9LCB7IDEsIDIsIHsgMTcsLTMgfSB9LCB7IDAsIDEsIHsgMTgsIDMgfSB9LAorIHsgMCwgMSwgeyAxOCwxOCB9IH0sIHsgMSwgMSwgeyAgMSwgMyB9IH0sIHsgMSwgMSwgeyAxOCwgMyB9IH0sCisgeyAxLCAxLCB7ICAxLCAzIH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAxLCAxLCB7ICAxLDE3IH0gfSwKKyB7IDEsIDEsIHsgMTcsIDMgfSB9LCB7IDAsIDMsIHsgMTgsMTcgfSB9LCB7IDAsIDEsIHsgMTgsMTggfSB9LAorIHsgMSwgMSwgeyAgMSwgMyB9IH0sIHsgMSwgMSwgeyAgMSwxOCB9IH0sIHsgMCwgMSwgeyAxOCwtMiB9IH0sCisgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAxLCB7IC0xLDE4IH0gfSwgeyAxLCAxLCB7IDE3LCAzIH0gfSwKKyB7IDAsIDEsIHsgMTcsIDIgfSB9LCB7IDAsIDEsIHsgMTcsIDMgfSB9LCB7IDEsIDEsIHsgMTgsIDIgfSB9LAorIHsgMSwgMSwgeyAxNywtMiB9IH0sIHsgMCwgMSwgeyAgMSwtMiB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sCisgeyAwLCAxLCB7IDE3LC0yIH0gfSwgeyAxLCAxLCB7IDE3LC0yIH0gfSwgeyAwLCAxLCB7IDE4LCAzIH0gfSwKKyB7IDAsIDEsIHsgIDIsMTcgfSB9LCB7IDEsIDIsIHsgMTgsLTMgfSB9LCB7IDEsIDIsIHsgIDEsMTggfSB9LAorIHsgMSwgMiwgeyAxOCwgMiB9IH0sIHsgMCwgMSwgeyAxNywtMSB9IH0sIHsgMCwgMSwgeyAxNywtMiB9IH0sCisgeyAxLCAxLCB7IDE3LC0yIH0gfSwgeyAxLCAxLCB7ICAxLCAzIH0gfSwgeyAwLCAxLCB7ICAxLDE3IH0gfSwKKyB7IDEsIDIsIHsgMTgsLTIgfSB9LCB7IDEsIDIsIHsgMTcsLTMgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LAorIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMSwgMSwgeyAxNywgMiB9IH0sIHsgMSwgMiwgeyAxOCwxOCB9IH0sCisgeyAwLCAxLCB7IDE3LCAyIH0gfSwgeyAwLCAxLCB7IDE4LDE3IH0gfSwgeyAxLCAxLCB7ICAxLDE3IH0gfSwKKyB7IDEsIDEsIHsgMTcsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTggfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LAorIHsgMSwgMiwgeyAxNywtMyB9IH0sIHsgMSwgNiwgeyAgMSwgMiB9IH0sIHsgMCwgMywgeyAxNywxNyB9IH0sCisgeyAwLCAxLCB7ICAxLDE4IH0gfSwgeyAwLCAxLCB7ICAxLC0yIH0gfSwgeyAxLCAxLCB7IDE3LCAyIH0gfSwKKyB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDEsIDEsIHsgMTgsIDMgfSB9LAorIHsgMSwgMiwgeyAxNywtMyB9IH0sIHsgMCwgMSwgeyAxNywgMiB9IH0sIHsgMCwgMSwgeyAxNywgMyB9IH0sCisgeyAwLCAxLCB7IDE4LC0yIH0gfSwgeyAxLCAxLCB7IDE4LDE4IH0gfSwgeyAxLCA2LCB7ICAxLCAyIH0gfSwKKyB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDEsIHsgLTEsMTcgfSB9LAorIHsgMSwgMSwgeyAxOCwgMyB9IH0sIHsgMCwgMSwgeyAxNywxOCB9IH0sIHsgMSwgMSwgeyAxNywgMyB9IH0sCisgeyAwLCAxLCB7IDE4LCAzIH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwKKyB7IDEsIDIsIHsgMTgsIDIgfSB9LCB7IDAsIDEsIHsgLTIsIDMgfSB9LCB7IDAsIDQsIHsgMTgsLTEgfSB9LAorIHsgMCwgMiwgeyAxOCwxOCB9IH0sIHsgMCwgMSwgeyAtMiwgMyB9IH0sIHsgMSwgMSwgeyAxNywtMiB9IH0sCisgeyAwLCAxLCB7IDE3LCAzIH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAyLCB7IC0xLDE4IH0gfSwKKyB7IDEsIDEsIHsgIDIsMTcgfSB9LCB7IDAsIDIsIHsgMTcsLTIgfSB9LCB7IDAsIDEsIHsgMTcsIDIgfSB9LAorIHsgMSwgMiwgeyAxOCwtMyB9IH0sIHsgMCwgMSwgeyAxNywtMiB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sCisgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAxLCAxLCB7IDE3LC0yIH0gfSwgeyAxLCAyLCB7IDE3LC0zIH0gfSwKKyB7IDEsIDEsIHsgIDEsIDMgfSB9LCB7IDEsIDEsIHsgIDIsMTcgfSB9LCB7IDEsIDIsIHsgMTgsIDIgfSB9LAorIHsgMSwgMSwgeyAgMiwxNyB9IH0sIHsgMSwgMSwgeyAxOCwgMiB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sCisgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAxLCB7IDE3LC0yIH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwKKyB7IDAsIDIsIHsgMTcsLTEgfSB9LCB7IDAsIDIsIHsgMTgsLTIgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LAorIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMSwgMSwgeyAgMSwgMyB9IH0sCisgeyAwLCAyLCB7IC0yLDE3IH0gfSwgeyAwLCAyLCB7IDE4LC0yIH0gfSwgeyAwLCAyLCB7IDE3LC0yIH0gfSwKKyB7IDEsIDEsIHsgIDIsMTcgfSB9LCB7IDEsIDEsIHsgIDEsIDMgfSB9LCB7IDAsIDEsIHsgIDIsMTcgfSB9LAorIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMywgeyAtMSwxNyB9IH0sIHsgMSwgMSwgeyAgMiwxNyB9IH0sCisgeyAwLCAyLCB7IDE4LDE4IH0gfSwgeyAwLCAxLCB7IDE3LCAyIH0gfSwgeyAxLCA0LCB7IDE4LC0zIH0gfSwKKyB7IDEsIDEsIHsgMTgsIDEgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LAorIHsgMSwgMiwgeyAxOCwtMSB9IH0sIHsgMCwgMSwgeyAtMSwxOCB9IH0sIHsgMSwgNiwgeyAgMSwgMiB9IH0sCisgeyAxLCAxLCB7IDE3LCAyIH0gfSwgeyAxLCA0LCB7IDE4LCAzIH0gfSwgeyAwLCAxLCB7ICAxLDE3IH0gfSwKKyB7IDAsIDEsIHsgMTgsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LAorIHsgMSwgMiwgeyAxNywgMiB9IH0sIHsgMCwgMiwgeyAxOCwtMiB9IH0sIHsgMCwgMSwgeyAgMSwxOCB9IH0sCisgeyAxLCAyLCB7IDE4LC0zIH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDEsIDIsIHsgMTgsMTggfSB9LCB7IDEsIDMsIHsgMTcsMTcgfSB9LAorIHsgMCwgMSwgeyAtMiwxNyB9IH0sIHsgMCwgMSwgeyAxNywxOCB9IH0sIHsgMCwgMSwgeyAtMSwgMyB9IH0sCisgeyAxLCAxLCB7ICAyLDE3IH0gfSwgeyAwLCAyLCB7IDE4LC0xIH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDEsIDEsIHsgMTcsLTIgfSB9LCB7IDEsIDIsIHsgMTcsIDIgfSB9LAorIHsgMSwgMSwgeyAxOCwgMyB9IH0sIHsgMCwgMSwgeyAxOCwgMiB9IH0sIHsgMSwgMiwgeyAxNywtMyB9IH0sCisgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAxLCB7IC0yLDE3IH0gfSwKKyB7IDAsIDEsIHsgMTcsLTEgfSB9LCB7IDAsIDEsIHsgMTgsLTEgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LAorIHsgMSwgMiwgeyAxNywtMyB9IH0sIHsgMSwgMSwgeyAgMSwxOCB9IH0sIHsgMSwgMywgeyAxOCwgMiB9IH0sCisgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDMsIHsgMTgsMTggfSB9LCB7IDAsIDEsIHsgIDEsLTIgfSB9LAorIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sCisgeyAxLCAyLCB7IDE3LC0zIH0gfSwgeyAxLCAxLCB7IDE4LDE4IH0gfSwgeyAwLCAyLCB7IDE4LCAyIH0gfSwKKyB7IDAsIDEsIHsgMTcsMTggfSB9LCB7IDEsIDIsIHsgMTgsIDIgfSB9LCB7IDEsIDEsIHsgMTcsLTIgfSB9LAorIHsgMCwgMiwgeyAxNywtMSB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sCisgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAxLCB7ICAxLC0yIH0gfSwgeyAwLCAxLCB7IDE4LCAxIH0gfSwKKyB7IDEsIDIsIHsgMTgsLTIgfSB9LCB7IDAsIDEsIHsgMTcsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LAorIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMSwgMSwgeyAxNywgMyB9IH0sIHsgMCwgMSwgeyAxNywtMSB9IH0sCisgeyAwLCAxLCB7IDE4LCAyIH0gfSwgeyAxLCAxLCB7IDE3LCAzIH0gfSwgeyAxLCAxLCB7IDE3LC0yIH0gfSwKKyB7IDAsIDEsIHsgMTgsMTggfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LAorIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sCisgeyAxLCAxLCB7IDE3LDE4IH0gfSwgeyAwLCAxLCB7IC0yLCAzIH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDEsIDIsIHsgMTgsLTMgfSB9LAorIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMywgeyAxOCwgMiB9IH0sIHsgMCwgMSwgeyAgMSwxOCB9IH0sCisgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAxLCB7IDE3LC0xIH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDEsIHsgLTIsIDMgfSB9LAorIHsgMCwgMywgeyAxNywxNyB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sCisgeyAxLCAxLCB7IDE3LCAyIH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwKKyB7IDEsIDEsIHsgMTcsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LAorIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMiwgeyAxOCwgMiB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sCisgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE3IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LCB7IDAsIDIsIHsgMTgsMTcgfSB9LAorIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sIHsgMCwgMiwgeyAxOCwxNyB9IH0sCisgeyAwLCAyLCB7IDE4LDE3IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBXYXZQYWNrRGVjb3JyU3BlYyBkZWZhdWx0X3NwZWNzW10gPSB7CisgeyAxLCAyLCB7IDE4LDE4LCAyLDE3LCAzIH0gfSwgeyAwLCAyLCB7IDE4LDE3LC0xLCAzLCAyIH0gfSwKKyB7IDEsIDEsIHsgMTcsMTgsMTgsLTIsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTcsIDMsLTIsMTcgfSB9LAorIHsgMSwgMiwgeyAxOCwxNywgMiwxNywgMyB9IH0sIHsgMCwgMSwgeyAxOCwxOCwtMSwgMiwxNyB9IH0sCisgeyAwLCAxLCB7IDE3LDE3LC0yLCAyLCAzIH0gfSwgeyAwLCAxLCB7IDE4LC0yLDE4LCAyLDE3IH0gfSwKKyB7IDEsIDIsIHsgMTgsMTgsLTEsIDIsIDMgfSB9LCB7IDAsIDIsIHsgMTgsMTcsIDMsIDIsIDUgfSB9LAorIHsgMSwgMSwgeyAxOCwxNywxOCwgMiwgNSB9IH0sIHsgMCwgMSwgeyAxNywxNywtMiwgMiwgMyB9IH0sCisgeyAwLCAxLCB7IDE4LC0yLDE4LCAyLCA1IH0gfSwgeyAwLCAxLCB7IDE3LC0yLDE3LCAyLC0zIH0gfSwKKyB7IDEsIDEsIHsgMTcsLTIsMTcsIDEsIDIgfSB9LCB7IDAsIDEsIHsgMTcsMTcsLTIsIDIsIDMgfSB9LAorIHsgMSwgMSwgeyAxOCwgMywgMSwgNSwgNCB9IH0sIHsgMSwgNCwgeyAxOCwxOCwgMiwgMywtMiB9IH0sCisgeyAwLCAxLCB7ICAxLC0xLC0xLCAyLDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE3LCAzLCAyLCA1IH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsMTgsIDIsMTcgfSB9LCB7IDAsIDEsIHsgMTgsMTcsLTEsIDIsMTggfSB9LAorIHsgMSwgMSwgeyAxNywgMywgMiwgMSwgNyB9IH0sIHsgMCwgMiwgeyAxOCwtMiwxOCwgMiwgMyB9IH0sCisgeyAxLCAzLCB7IDE4LC0zLDE4LCAyLCAzIH0gfSwgeyAwLCAzLCB7IDE4LDE3LCAyLCAzLDE3IH0gfSwKKyB7IDEsIDEsIHsgMTcsMTcsIDIsIDEsIDQgfSB9LCB7IDAsIDEsIHsgMTcsMTgsLTIsIDIsMTcgfSB9LAorIHsgMSwgMSwgeyAxOCwxOCwgMywgNSwgMiB9IH0sIHsgMCwgMSwgeyAxNywxNywgMiwxOCwgNCB9IH0sCisgeyAwLCAxLCB7IDE4LDE3LCAxLCA0LCA2IH0gfSwgeyAxLCAxLCB7ICAzLDE3LDE4LCAyLDE3IH0gfSwKKyB7IDEsIDEsIHsgMTcsIDMsIDIsIDEsIDcgfSB9LCB7IDAsIDEsIHsgMTgsMTcsLTEsIDIsIDMgfSB9LAorIHsgMSwgMSwgeyAxNywxNywgMiwgMSwgNCB9IH0sIHsgMSwgMiwgeyAxOCwxNywtMSwxNywgMyB9IH0sCisgeyAxLCAyLCB7IDE4LDE3LCAyLCAzLC0xIH0gfSwgeyAwLCAyLCB7IDE4LDE4LC0yLCAyLDE3IH0gfSwKKyB7IDAsIDEsIHsgMTcsMTcsIDIsMTgsIDQgfSB9LCB7IDAsIDUsIHsgLTIsMTgsMTgsMTgsIDIgfSB9LAorIHsgMSwgMSwgeyAxOCwxOCwtMSwgNiwgMyB9IH0sIHsgMCwgMSwgeyAxNywxNywtMiwgMiwgMyB9IH0sCisgeyAxLCAxLCB7IDE4LDE3LDE4LCAyLDE3IH0gfSwgeyAwLCAxLCB7IDE4LDE3LCA0LCAzLCAxIH0gfSwKKyB7IDAsIDEsIHsgLTIsMTgsIDIsIDIsMTggfSB9LCB7IDEsIDIsIHsgMTgsMTgsLTIsIDIsLTEgfSB9LAorIHsgMSwgMSwgeyAxNywxNywgMiwgMSwgNCB9IH0sIHsgMCwgMSwgeyAxNywxOCwtMiwgMiwxNyB9IH0sCisgeyAxLCAxLCB7IDE3LCAzLCAyLCAxLCA3IH0gfSwgeyAxLCAzLCB7IDE4LC0zLDE4LCAyLCAzIH0gfSwKKyB7IDEsIDIsIHsgMTgsMTgsLTIsIDIsLTEgfSB9LCB7IDEsIDEsIHsgMTgsMTgsIDMsIDUsIDIgfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwtMSwgMiwxNyB9IH0sIHsgMCwgMSwgeyAxOCwtMSwxNywxOCwgMiB9IH0sCisgeyAwLCAxLCB7IDE3LC0xLCAyLCAzLCA2IH0gfSwgeyAwLCAxLCB7IDE4LC0yLDE4LCAyLCA1IH0gfSwKKyB7IDEsIDIsIHsgMTgsMTgsLTIsIDIsLTEgfSB9LCB7IDAsIDMsIHsgMTgsMTgsIDIsIDMsMTcgfSB9LAorIHsgMCwgMSwgeyAxNywxNywgMiwxOCwgNCB9IH0sIHsgMSwgMSwgeyAxNywtMiwxNywgMSwgMiB9IH0sCisgeyAwLCAxLCB7IC0xLCAzLCA1LCA0LCA3IH0gfSwgeyAwLCAzLCB7IDE4LDE4LCAzLCAyLCA1IH0gfSwKKyB7IDAsIDEsIHsgMTcsMTcsIDIsMTgsIDQgfSB9LCB7IDAsIDEsIHsgMTgsMTcsLTIsMTgsIDMgfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwtMiwgMiwxNyB9IH0sIHsgMCwgMywgeyAxOCwxNywtMiwgMiwgMyB9IH0sCisgeyAxLCAxLCB7IDE4LDE4LC0yLCAyLDE3IH0gfSwgeyAwLCAxLCB7IDE4LDE3LCA0LCAzLCAxIH0gfSwKKyB7IDEsIDIsIHsgIDMsMTgsMTcsIDIsMTcgfSB9LCB7IDEsIDIsIHsgMTgsMTgsIDIsLTIsMTggfSB9LAorIHsgMSwgMiwgeyAxOCwxOCwtMSwxOCwgMiB9IH0sIHsgMCwgMiwgeyAxOCwxOCwtMiwgMiwxNyB9IH0sCisgeyAxLCAzLCB7IDE4LDE4LCAyLCAzLC0yIH0gfSwgeyAwLCAzLCB7IDE4LDE4LCAzLCAyLCA1IH0gfSwKKyB7IDAsIDEsIHsgMTgsLTIsMTgsIDIsIDUgfSB9LCB7IDEsIDEsIHsgMTcsIDMsIDIsIDEsIDcgfSB9LAorIHsgMSwgMywgeyAxOCwxOCwtMiwgMiwxOCB9IH0sIHsgMSwgMSwgeyAxNywxOCwxOCwtMiwgMiB9IH0sCisgeyAwLCAxLCB7IDE4LC0yLDE4LCAyLCA1IH0gfSwgeyAwLCAyLCB7IDE4LC0yLDE4LCAyLCAzIH0gfSwKKyB7IDAsIDEsIHsgLTEsIDMsIDQsIDUsIDcgfSB9LCB7IDEsIDEsIHsgMTcsMTcsIDIsLTEsIDcgfSB9LAorIHsgMCwgMSwgeyAxOCwtMSwtMSwgMiwtMiB9IH0sIHsgMCwgMiwgeyAxOCwxNywgMiwgMywxNyB9IH0sCisgeyAwLCAxLCB7IDE4LDE3LCAyLDE4LCAyIH0gfSwgeyAwLCAyLCB7IDE4LDE3LC0xLCAyLDE3IH0gfSwKKyB7IDAsIDEsIHsgIDEsMTgsIDMsIDIsIDUgfSB9LCB7IDAsIDIsIHsgMTgsLTIsIDQsMTgsIDIgfSB9LAorIHsgMSwgMSwgeyAxOCwgMywgMSwgNSwgNCB9IH0sIHsgMCwgMSwgeyAxOCwxNywxOCwgMiwgNSB9IH0sCisgeyAxLCAxLCB7IDE4LCAzLCAxLCA1LCA0IH0gfSwgeyAwLCA0LCB7IDE4LDE4LC0yLCAyLDE4IH0gfSwKKyB7IDEsIDEsIHsgMTgsMTgsIDMsIDIsIDUgfSB9LCB7IDEsIDEsIHsgMTcsMTcsIDIsIDEsIDQgfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sCisgeyAxLCAxLCB7IDE4LDE4LCAyLCAxLCAzIH0gfSwgeyAxLCAxLCB7IDE3LDE3LCAyLCAxLCA0IH0gfSwKKyB7IDEsIDIsIHsgMTcsMTcsIDIsMTgsIDMgfSB9LCB7IDAsIDEsIHsgMTgsMTcsIDEsIDQsIDYgfSB9LAorIHsgMSwgMiwgeyAxOCwxOCwtMiwgMiwtMSB9IH0sIHsgMCwgMSwgeyAxOCwtMiwxOCwgMiwgNSB9IH0sCisgeyAxLCAxLCB7IDE3LCAyLDE4LCAyLDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsIDMsIDYsLTEgfSB9LCB7IDAsIDEsIHsgMTgsMTcsIDIsMTgsIDMgfSB9LAorIHsgMCwgMSwgeyAxOCwxNywtMiwgMiwxNyB9IH0sIHsgMSwgMSwgeyAgMywxNywxOCwgMiwxNyB9IH0sCisgeyAxLCAzLCB7IDE4LC0zLDE4LCAyLCAzIH0gfSwgeyAxLCAzLCB7IDE4LDE4LC0zLDE4LCAyIH0gfSwKKyB7IDEsIDEsIHsgMTgsIDMsIDEsIDUsIDQgfSB9LCB7IDAsIDEsIHsgMTcsLTIsMTcsIDIsLTMgfSB9LAorIHsgMSwgMSwgeyAxOCwxOCwgMywgNSwgMiB9IH0sIHsgMSwgMiwgeyAxOCwxOCwtMiwgMiwtMSB9IH0sCisgeyAwLCAxLCB7IDE4LC0xLC0xLCAyLC0yIH0gfSwgeyAxLCAxLCB7IDE4LCAzLCAxLCA1LCA0IH0gfSwKKyB7IDAsIDMsIHsgMTgsMTcsLTEsIDIsMTcgfSB9LCB7IDEsIDMsIHsgMTgsMTcsIDIsMTgsLTIgfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sIHsgMSwgMiwgeyAxOCwxOCwtMiwgMiwtMSB9IH0sCisgeyAxLCAxLCB7IDE4LCAzLCAxLCA1LCA0IH0gfSwgeyAwLCA0LCB7ICAzLDE4LDE4LCAyLDE3IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LCB7IDEsIDEsIHsgMTgsMTcsLTEsMTgsIDIgfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwKKyB7IDEsIDEsIHsgMTgsMTgsMTgsIDMsIDIgfSB9LCB7IDAsIDEsIHsgMTcsLTEsIDIsIDMsIDYgfSB9LAorIHsgMCwgMSwgeyAxNywtMSwgMiwgMywgNiB9IH0sIHsgMCwgMiwgeyAxOCwxNywtMiwgMywgMiB9IH0sCisgeyAxLCAzLCB7IDE4LDE3LCAyLC0yLDE4IH0gfSwgeyAwLCAyLCB7IDE4LDE4LCAyLDE3LCAzIH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsIDIsMTgsLTIgfSB9LCB7IDAsIDIsIHsgMTgsLTIsIDQsMTgsIDIgfSB9LAorIHsgMCwgMSwgeyAtMiwxOCwgMiwgMiwxOCB9IH0sIHsgMCwgMiwgeyAxOCwxNywgMywgNiwgMiB9IH0sCisgeyAwLCAxLCB7IDE4LDE3LDE4LCAyLCA1IH0gfSwgeyAwLCAzLCB7IDE4LDE4LC0yLCAzLCAyIH0gfSwKKyB7IDEsIDEsIHsgMTgsMTgsIDIsMTgsIDUgfSB9LCB7IDAsIDEsIHsgMTcsLTEsIDIsIDMsIDYgfSB9LAorIHsgMSwgNCwgeyAxOCwxOCwgMiwgMywtMiB9IH0sIHsgMCwgMiwgeyAxOCwxNywxOCwgMiwtMiB9IH0sCisgeyAwLCAxLCB7ICAxLDE4LCAzLCAyLCA1IH0gfSwgeyAxLCA0LCB7IDE4LC0yLDE4LCAyLCAzIH0gfSwKKyB7IDEsIDIsIHsgMTgsIDIsMTgsIDMsLTIgfSB9LCB7IDAsIDIsIHsgMTgsMTgsMTgsIDIsIDQgfSB9LAorIHsgMCwgMiwgeyAgMywxNywxOCwgMiwxNyB9IH0sIHsgMSwgMSwgeyAxOCwtMSwxOCwgMiwxNyB9IH0sCisgeyAxLCAyLCB7IDE3LDE3LCAyLDE4LCAzIH0gfSwgeyAwLCAyLCB7IDE4LDE3LC0yLCAzLCAyIH0gfSwKKyB7IDAsIDEsIHsgIDEsLTEsLTEsIDIsMTcgfSB9LCB7IDAsIDMsIHsgIDMsMTgsMTgsIDIsMTcgfSB9LAorIHsgMCwgMSwgeyAxOCwtMSwxNywxOCwgMiB9IH0sIHsgMCwgMSwgeyAxOCwxNywgMiwxOCwgMyB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwgeyAwLCAxLCB7IDE4LDE3LCAyLDE4LCAyIH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LAorIHsgMSwgMiwgeyAxNywxNywgMiwxOCwgMyB9IH0sIHsgMCwgMSwgeyAxOCwxNywtMiwgMiwgMyB9IH0sCisgeyAwLCAxLCB7IDE4LC0yLDE4LCAyLCA1IH0gfSwgeyAxLCA0LCB7IDE4LC0yLDE4LCAyLCAzIH0gfSwKKyB7IDEsIDMsIHsgMTgsMTcsIDIsIDMsIDYgfSB9LCB7IDAsIDIsIHsgMTgsMTgsIDIsMTcsIDMgfSB9LAorIHsgMCwgMiwgeyAxOCwxNywgMiwxOCwgMiB9IH0sIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sCisgeyAxLCAxLCB7IDE4LDE4LCAzLCA1LCAyIH0gfSwgeyAwLCAyLCB7IDE4LDE4LC0yLCAyLCAzIH0gfSwKKyB7IDEsIDIsIHsgMTgsMTcsIDIsMTcsIDMgfSB9LCB7IDAsIDEsIHsgMTgsMTcsIDIsIDMsMTggfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sIHsgMSwgNCwgeyAxOCwxOCwgMiwgMywtMiB9IH0sCisgeyAwLCAxLCB7IDE3LC0yLDE3LCAyLC0zIH0gfSwgeyAwLCAxLCB7IDE3LDE3LCAyLDE4LCA0IH0gfSwKKyB7IDEsIDEsIHsgMTgsMTgsMTgsIDIsIDQgfSB9LCB7IDEsIDIsIHsgMTgsIDIsMTgsIDMsLTIgfSB9LAorIHsgMSwgMSwgeyAxOCwxOCwtMiwgMiwxNyB9IH0sIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LCAyLDE3LCAzIH0gfSwgeyAwLCAyLCB7IDE4LDE4LDE4LCAyLCA0IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTcsLTIsIDMsIDIgfSB9LAorIHsgMCwgMSwgeyAgMSwtMSwtMSwgMiwxNyB9IH0sIHsgMSwgNCwgeyAxOCwxOCwgMiwgMywtMiB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwgeyAwLCAxLCB7IDE4LC0yLDE4LCAzLCAyIH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sCisgeyAwLCAxLCB7IDE4LDE4LC0yLCAyLDE3IH0gfSwgeyAwLCAzLCB7IDE4LDE3LCAyLCAzLDE3IH0gfSwKKyB7IDEsIDIsIHsgMTgsMTgsIDIsLTIsMTggfSB9LCB7IDAsIDEsIHsgLTEsIDMsIDUsIDQsIDcgfSB9LAorIHsgMSwgMSwgeyAxOCwgMywgMSwgNSwgNCB9IH0sIHsgMSwgMSwgeyAxOCwxOCwtMiwxOCwgMyB9IH0sCisgeyAwLCAyLCB7IDE4LDE3LDE4LCAyLC0yIH0gfSwgeyAwLCAyLCB7IDE4LDE4LCAyLDE3LCAzIH0gfSwKKyB7IDEsIDIsIHsgMTgsIDIsMTgsIDMsLTIgfSB9LCB7IDEsIDQsIHsgMTgsMTgsIDIsIDMsLTIgfSB9LAorIHsgMSwgMywgeyAxOCwxNywgMiwgMywgNiB9IH0sIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sCisgeyAxLCAyLCB7IDE4LDE3LC0yLC0xLDE3IH0gfSwgeyAwLCAxLCB7IDE3LC0xLCAyLCAzLCA2IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTgsLTIsIDIsIDMgfSB9LAorIHsgMSwgMSwgeyAxOCwxOCwxOCwgMiwgNSB9IH0sIHsgMCwgMSwgeyAxNywxNywtMiwgMiwgMyB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwgeyAwLCAyLCB7IDE4LDE3LCAzLCA2LCAyIH0gfSwKKyB7IDAsIDIsIHsgMTgsMTcsMTgsIDIsIDMgfSB9LCB7IDAsIDMsIHsgMTgsMTcsLTMsMTgsIDIgfSB9LAorIHsgMCwgMSwgeyAxOCwxOCwxOCwgMiwgMyB9IH0sIHsgMCwgMSwgeyAxOCwtMiwtMywgMiwgNiB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwgeyAxLCAxLCB7IDE4LDE3LDE4LCAyLCA1IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LAorIHsgMSwgMSwgeyAxOCwxNywxOCwgMiwgNSB9IH0sIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsMTgsIDIsIDMgfSB9LCB7IDEsIDEsIHsgMTcsLTIsMTcsIDEsIDIgfSB9LAorIHsgMSwgMSwgeyAxNywxNywgMiwtMSwgNyB9IH0sIHsgMCwgMSwgeyAxOCwxNywgNCwgMywgMSB9IH0sCisgeyAxLCAzLCB7IDE4LC0zLDE4LCAyLCAzIH0gfSwgeyAwLCAxLCB7ICAxLDE4LCAzLCAyLCA1IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LAorIHsgMCwgMSwgeyAxOCwxOCwgMywgNiwgMiB9IH0sIHsgMCwgMSwgeyAxNywxNywgMiwxOCwgNCB9IH0sCisgeyAwLCAxLCB7IDE3LDE3LCAyLDE4LCA0IH0gfSwgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LAorIHsgMSwgMiwgeyAxOCwtMiwxOCwgMywgMiB9IH0sIHsgMSwgMSwgeyAxNywtMiwxNywgMSwgMiB9IH0sCisgeyAxLCAxLCB7IDE4LDE4LCAzLCAyLCA1IH0gfSwgeyAwLCAxLCB7IDE4LDE4LC0xLCAyLCAzIH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LAorIHsgMCwgMSwgeyAxOCwxNywxOCwgMiwgNSB9IH0sIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LCB7IDAsIDEsIHsgIDMsMTgsMTgsIDIsMTcgfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sIHsgMCwgMiwgeyAxOCwxOCwtMiwxOCwgMiB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyIH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LCB7IDAsIDIsIHsgMTgsMTgsLTIsMTgsIDIgfSB9LAorfTsKKworc3RhdGljIGNvbnN0IFdhdlBhY2tEZWNvcnJTcGVjIGhpZ2hfc3BlY3NbXSA9IHsKKyB7IDEsIDIsIHsgMTgsMTgsMTgsLTIsIDIsIDMsIDUsLTEsMTcsIDQgfSB9LCB7IDAsIDEsIHsgMTgsMTcsLTIsIDIsMTgsIDMsIDcsIDIsIDUsIDQgfSB9LAorIHsgMSwgMiwgeyAgMSwxOCwgMywgNiwtMiwxOCwgMiwgMywgNCwgNSB9IH0sIHsgMCwgMiwgeyAxOCwxOCwtMiwgMiwxOCwgMywgNiwgMiwxNywgNCB9IH0sCisgeyAxLCAyLCB7IDE4LDE4LCAyLDE4LCAzLCAyLC0xLCA0LDE4LCA1IH0gfSwgeyAxLCAxLCB7ICA3LCA2LCA1LCAzLCA0LCAyLCA1LCA0LCAzLCA3IH0gfSwKKyB7IDEsIDEsIHsgMTcsIDMsMTgsIDcsIDIsIDYsIDEsIDQsIDMsIDUgfSB9LCB7IDEsIDEsIHsgLTIsMTgsMTgsMTgsIDMsLTIsIDYsIDUsIDIsIDEgfSB9LAorIHsgMSwgMiwgeyAxOCwxOCwtMSwxOCwgMiwgMywgNiwtMiwxNywgNSB9IH0sIHsgMCwgMSwgeyAxNywxNywxOCwgMywgNiwgNCwgNSwgMiwxOCwtMiB9IH0sCisgeyAxLCAyLCB7ICAxLDE4LC0yLCAzLCA1LCAyLCA0LC0xLCA2LCAxIH0gfSwgeyAwLCAyLCB7IDE4LDE4LCAzLCA2LDE4LCAyLCA0LCA4LCA1LCAzIH0gfSwKKyB7IDAsIDEsIHsgLTIsIDEsMTgsIDIsLTIsIDcsMTgsIDIsLTEsIDUgfSB9LCB7IDEsIDEsIHsgIDQsIDMsIDgsIDEsIDUsIDIsIDUsIDYsIDIsIDggfSB9LAorIHsgMSwgMSwgeyAxNywxOCwgMiwgNiwgMywgNCwtMSwgMSwgOCwgNiB9IH0sIHsgMCwgMSwgeyAxOCwxOCwgMywgNiwgMywtMiwgMiwgNSwtMSwgMSB9IH0sCisgeyAwLCAxLCB7IDE4LDE4LDE3LC0xLCAyLC0yLDE4LCAzLCA0LCA1IH0gfSwgeyAxLCAyLCB7IDE4LDE3LCAyLC0yLDE4LCAzLCA1LCA3LCAyLCA0IH0gfSwKKyB7IDEsIDIsIHsgMTgsMTgsIDMsIDYsLTIsMTgsIDIsIDUsIDgsIDMgfSB9LCB7IDAsIDEsIHsgMTgsMTcsIDIsMTgsMTgsIDIsIDYsIDUsMTcsIDcgfSB9LAorIHsgMSwgMiwgeyAxOCwxNywgMiwxOCwgMywgMiwgNiwxOCwtMSwgNCB9IH0sIHsgMSwgMSwgeyAgNSwgMywgNiwgNSwgMywgNCwgMSwgMiwgNCwgNyB9IH0sCisgeyAxLCAxLCB7ICA1LCAzLCA2LCA1LCAzLCA0LCAxLCAyLCA0LCA3IH0gfSwgeyAwLCAxLCB7IC0yLDE4LDE4LDE4LC0yLCAzLCAyLCA0LCA2LCA1IH0gfSwKKyB7IDEsIDIsIHsgMTgsMTcsLTMsIDMsLTEsMTgsIDIsIDMsIDYsIDUgfSB9LCB7IDAsIDEsIHsgMTcsMTgsIDcsIDMsLTIsIDcsIDEsIDIsIDQsIDUgfSB9LAorIHsgMSwgMSwgeyAgMiwxOCwxOCwtMiwgMiwgNCwtMSwxOCwgMywgNiB9IH0sIHsgMCwgMywgeyAgMSwxOCwgNCwgMywgNSwgMiwgNCwxOCwgMiwgMyB9IH0sCisgeyAwLCAxLCB7IC0yLDE4LCAyLDE4LCAzLCA3LDE4LCAyLCA2LC0yIH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDEsIDEsIHsgMTgsMTgsIDUsIDQsIDYsIDQsIDUsIDEsIDQsIDMgfSB9LCB7IDEsIDEsIHsgMTgsIDMsIDYsIDUsIDcsIDgsIDIsIDMsIDEsLTEgfSB9LAorIHsgMSwgMSwgeyAxOCwxOCwxOCwgMiwtMiwgMywgNSwxOCwgMiwgOCB9IH0sIHsgMCwgMiwgeyAxOCwxNywtMiwgMiwgMywxOCwtMywgNSwgMiwgNyB9IH0sCisgeyAxLCAxLCB7ICAxLCAxLC0xLCA4LDE3LCAzLC0yLCAyLCA2LDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE4LDE3LCAyLC0yLCAzLCAyLCA0LDE4LCA1IH0gfSwKKyB7IDEsIDEsIHsgMTcsMTgsIDIsLTEsIDUsIDcsMTgsIDMsIDQsIDYgfSB9LCB7IDEsIDEsIHsgIDUsIDQsIDUsMTcsIDMsIDYsIDMsIDQsIDcsIDIgfSB9LAorIHsgMCwgMSwgeyAxNywgMywgMSwgNywgNCwgMiwgNSwtMiwxOCwgNiB9IH0sIHsgMCwgMSwgeyAxNywxOCwgMiwxOCwgNCwgMywgNSwgNywtMywgNiB9IH0sCisgeyAxLCAyLCB7IDE3LDE3LC0zLC0yLCAyLCA4LDE4LC0xLCAzLCA1IH0gfSwgeyAwLCAxLCB7IDE3LDE3LDE4LCAyLCAzLCA2LC0yLCA4LCAxLCA3IH0gfSwKKyB7IDEsIDEsIHsgIDEsIDIsIDYsLTIsMTgsIDIsIDUsLTMsIDcsLTIgfSB9LCB7IDAsIDEsIHsgMTgsMTgsIDMsMTgsIDYsIDgsLTIsIDIsIDMsIDUgfSB9LAorIHsgMCwgMSwgeyAxOCwxNywgMiwxOCwtMiwgMywgNywgNiwgMiwgNCB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAxLCAxLCB7IDE4LDE4LCAyLC0xLCAzLCA2LCAxLCAzLCA0LCA4IH0gfSwgeyAwLCAxLCB7IDE4LDE4LCAzLCA2LCA1LCAzLC0yLCAyLDE4LC0xIH0gfSwKKyB7IDAsIDEsIHsgMTgsMTcsLTMsMTgsIDIsIDQsLTIsIDMsIDYsMTcgfSB9LCB7IDEsIDMsIHsgIDEsIDIsMTcsIDMsMTgsIDcsLTEsIDUsIDIsIDQgfSB9LAorIHsgMSwgMSwgeyAxOCwgMywxOCwgNiwgOCwxOCwtMiwgNSwgNywgMiB9IH0sIHsgMCwgMSwgeyAxNywgMiwxOCwgNiwgMywgMiwgNSwgNCwgOCwgMSB9IH0sCisgeyAwLCAxLCB7IDE4LDE3LC0xLCAyLCAzLDE4LDE4LCAyLCAzLDE3IH0gfSwgeyAxLCAxLCB7IDE4LCA3LCA2LCA1LCA1LCAzLCAxLCA0LCAyLCA0IH0gfSwKKyB7IDEsIDEsIHsgIDYsMTcsIDMsIDgsIDEsIDUsIDcsLTEsIDIsIDEgfSB9LCB7IDEsIDEsIHsgMTgsLTIsMTgsIDMsLTIsIDIsIDcsIDQsIDYsMTggfSB9LAorIHsgMSwgMywgeyAxOCwtMywxOCwgMiwgMywxOCwtMSwgNywgMiwgNSB9IH0sIHsgMCwgMiwgeyAxOCwtMiwgNywgMSwgMywgMiwgNCwgNiwtMywgNyB9IH0sCisgeyAxLCAxLCB7IDE4LC0yLCAyLC0zLDE4LC0yLDE3LC0xLCA0LCAyIH0gfSwgeyAwLCAzLCB7IDE3LDE3LCAyLCA1LCAzLCA3LDE4LCA2LCA0LCAyIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMSwgMSwgeyAxOCwxNywgNCwgNiwgNiwgNCwgNSwgMywgNCwgMSB9IH0sIHsgMCwgMSwgeyAxOCwgNSwgMywgNiwgMiwgMywgOCwgMSwgMywgNyB9IH0sCisgeyAxLCAyLCB7IDE4LDE3LC0yLCAyLDE4LCAzLCA1LCA3LC0xLCAyIH0gfSwgeyAwLCAxLCB7ICAxLDE4LDE4LCAzLCA2LC0xLCA0LCA4LCA1LCAyIH0gfSwKKyB7IDEsIDEsIHsgIDEsIDUsIDMsIDQsIDEsIDEsIDMsIDUsIDcsIDMgfSB9LCB7IDAsIDEsIHsgIDMsMTgsMTgsIDIsMTgsMTgsLTEsIDIsIDMsMTggfSB9LAorIHsgMSwgMiwgeyAxOCwxOCwtMSwxOCwgMiwgMywgNCwgNiwxOCwgNSB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAxLCAxLCB7IDE4LCAzLCAxLCA0LCA1LCAyLCA3LCAxLCAzLCA2IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDEsIDIsIHsgMTgsMTgsLTEsMTgsIDIsIDMsIDUsLTIsIDYsIDggfSB9LCB7IDEsIDEsIHsgMTcsMTgsIDQsIDgsIDMsIDIsIDUsIDIsIDcsIDYgfSB9LAorIHsgMSwgNCwgeyAgMSwgMiwgNSwxOCwtMiwgMiwgMywgNywtMSwgNCB9IH0sIHsgMCwgMiwgeyAxOCwxNywtMSwgMywgNiwxOCwgMiwgMywgNywgNSB9IH0sCisgeyAwLCAxLCB7IC0yLDE4LCAyLC0zLCA2LDE4LCA0LCAzLC0yLCA1IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDEsIHsgMTcsMTcsIDYsIDIsIDQsIDgsIDMsIDUsLTEsMTcgfSB9LCB7IDEsIDEsIHsgMTgsIDMsMTgsIDYsIDgsMTgsLTIsIDUsIDcsIDIgfSB9LAorIHsgMSwgMiwgeyAxNywxNywtMywgMiwxOCwtMiwgOCwgMywgNiwtMSB9IH0sIHsgMSwgMSwgeyAxOCwtMiwxNywxOCwgMiwgMywtMiwgNiwgNSwgNCB9IH0sCisgeyAxLCAyLCB7IDE4LDE3LC0xLCAzLDE4LCAyLCA1LCAzLCA2LC0zIH0gfSwgeyAwLCAxLCB7IDE4LDE3LCAyLDE4LCA3LDE4LCAyLCA0LCAzLDE3IH0gfSwKKyB7IDEsIDMsIHsgMTgsMTgsIDUsIDYsIDQsIDMsIDQsMTgsIDYsIDUgfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMSwgMSwgeyAgNywgNiwgNSwgMywgNCwgMiwgNSwgNCwgMywgNyB9IH0sIHsgMCwgMSwgeyAtMiwxOCwxOCwxOCwgMywgNiwgNCwgMiwgNSwgMiB9IH0sCisgeyAwLCAzLCB7IDE4LDE3LC0zLDE4LCAzLCAyLCA1LC0xLDE3LCAzIH0gfSwgeyAxLCAxLCB7IDE3LDE4LCA3LCAzLCAxLCA3LCA0LCAyLCA2LCA1IH0gfSwKKyB7IDEsIDEsIHsgMTgsIDIsLTIsLTEsMTgsIDUsIDMsLTIsIDEsIDIgfSB9LCB7IDAsIDMsIHsgMTgsMTgsLTEsIDMsIDIsIDcsIDUsMTgsIDQsIDMgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDEsIDEsIHsgMTcsMTgsIDIsLTIsIDQsIDgsMTgsIDMsIDYsIDUgfSB9LCB7IDAsIDIsIHsgMTgsMTcsIDMsIDUsLTIsIDcsIDIsMTgsIDMsLTEgfSB9LAorIHsgMSwgMSwgeyAxOCwgMiwtMiwtMSwxOCwgNSwgMywtMiwgMSwgMiB9IH0sIHsgMCwgMiwgeyAgMywxNywxOCwxOCwgMiwgNSwgNywgNiwxOCwgMyB9IH0sCisgeyAxLCAxLCB7IDE3LDE4LDE4LCA0LCAzLCAyLDE4LCA3LCA4LC0xIH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDEsIHsgMTcsIDEsIDIsIDMsIDUsIDYsIDEsIDQsIDgsMTcgfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMCwgMiwgeyAxOCwxNywtMSwxOCwtMywgMiwgOCwgMywgNiwxNyB9IH0sIHsgMSwgMSwgeyAxNywxNywgMSwgMiwgNCwgNSwtMSwgMiwgMSwgNiB9IH0sCisgeyAxLCAxLCB7ICAxLCAyLCA2LC0yLDE4LCAyLC0zLCAzLC0yLCA1IH0gfSwgeyAwLCAxLCB7IDE4LCAzLDE4LCA2LDE4LCA1LCAyLCA0LC0xLCA4IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMSwgMSwgeyAxOCwxOCwtMSwgMiwxOCwgMywgNiwgNCwtMiwgNyB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAwLCAyLCB7IC0xLDE4LDE4LDE4LCAyLC0yLCA0LCA3LCAyLCAzIH0gfSwgeyAwLCAzLCB7ICAzLDE3LC0yLCA1LCAyLCA3LDE4LCA2LCA0LCA1IH0gfSwKKyB7IDAsIDEsIHsgMTcsIDYsMTgsIDMsIDgsIDQsIDUsIDMsIDgsMTggfSB9LCB7IDAsIDIsIHsgMTgsIDIsIDYsIDIsMTgsIDMsIDIsIDQsIDUsIDggfSB9LAorIHsgMCwgMSwgeyAgMywxOCwxOCwgMiwxOCwtMSwgMiwxOCwgMiwxNyB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAwLCAxLCB7ICAzLCA2LDE3LC0yLCA1LCAxLCAyLCA3LCA0LCA4IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDEsIDMsIHsgIDMsMTgsMTcsIDUsIDYsIDIsIDcsLTIsIDgsMTggfSB9LCB7IDEsIDEsIHsgMTgsLTEsIDMsIDEsIDcsIDIsLTEsIDQsIDYsMTcgfSB9LAorIHsgMSwgMSwgeyAxOCwgMiwtMiwtMSwxOCwgNSwgMywtMiwgMSwgMiB9IH0sIHsgMCwgMiwgeyAxOCwgMSwgMiwxOCwgMywgNiwgNSwgMiwgNCwgOCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMSwgMSwgeyAxNywtMiwgMiwxOCwxOCwgOCwgNSwgMywgMiwgNiB9IH0sIHsgMCwgMSwgeyAxOCwxNywgMiwxOCwgMywgMiwgNywtMiwxOCwgNCB9IH0sCisgeyAxLCAyLCB7ICAxLDE4LCAyLCAzLC0xLCA1LCA2LCA0LCA3LDE3IH0gfSwgeyAwLCAyLCB7IDE4LDE3LCAzLCA2LC0yLCAyLCAzLCA4LCA1LDE3IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsIDMsIDIsMTgsLTEsIDIsIDQsIDMsMTcgfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMSwgMiwgeyAxNywtMSwxOCwgMiwgMywtMiwgNSwxOCwgMiwgNyB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAxLCAyLCB7IDE4LC0zLDE4LCAyLCAzLC0yLDE4LCA1LCA2LC0zIH0gfSwgeyAwLCAyLCB7IDE4LDE3LCAzLCA1LC0yLCA3LCAyLDE4LCAzLC0xIH0gfSwKKyB7IDEsIDEsIHsgIDEsMTgsLTEsIDIsIDMsIDEsLTIsIDgsIDIsIDUgfSB9LCB7IDAsIDEsIHsgMTgsMTgsIDMsIDYsMTgsIDIsIDMsIDQsIDgsIDUgfSB9LAorIHsgMCwgMSwgeyAtMiwgMSwxOCwgMiwtMiwgNSwgNywxOCwgMiwtMSB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAxLCAxLCB7IDE3LDE4LC0xLCAyLCA4LCAzLCA0LCA1LCAxLCA3IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsLTEsIDIsMTgsIDMsLTIsIDUsIDQsIDIgfSB9LCB7IDEsIDEsIHsgMTgsMTcsIDIsMTgsIDMsIDgsIDUsIDIsIDcsMTcgfSB9LAorIHsgMCwgMSwgeyAxOCwxOCwgMywxOCwgNiwgOCwtMiwgMiwgMywgNSB9IH0sIHsgMCwgMSwgeyAxOCwxOCwgMiwxOCwgMiwgNiwxOCwgMiwxNywgNyB9IH0sCisgeyAxLCAzLCB7IDE4LDE3LDE4LCAyLCA4LDE4LCA1LC0xLCAzLCA2IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDEsIDEsIHsgMTgsIDcsIDYsIDUsIDUsIDMsIDEsIDQsIDIsIDQgfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMSwgMiwgeyAxOCwxNywtMSwgMywgNiwxOCwgMiwgNSwgOCwgMyB9IH0sIHsgMCwgMSwgeyAxNywxOCwxOCwgNCwgNywgMiwgMywtMiwxOCwgNSB9IH0sCisgeyAxLCAyLCB7IDE4LCAxLCAyLCA2LCAyLCA1LDE4LCAyLCA0LCA4IH0gfSwgeyAwLCA0LCB7IDE4LCA0LCAxLCAyLCAzLCA1LCA0LCAxLCAyLCA2IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwgeyAwLCAyLCB7IDE4LDE3LCAyLC0xLDE4LCAzLC0zLCA1LCAyLCA0IH0gfSwKKyB7IDAsIDEsIHsgMTcsMTcsIDMsIDYsIDMsIDUsLTIsIDIsMTgsLTEgfSB9LCB7IDAsIDIsIHsgMTgsMTgsIDMsLTIsMTgsIDIsLTMsIDUsIDMsIDYgfSB9LAorIHsgMSwgMSwgeyAxNywxNywgMiwgNCwgMSwgMywgNSwgMiwgNiwtMyB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAwLCAxLCB7IDE3LCAxLCAzLCAyLCA3LCAxLCA2LCAzLCA0LCA4IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDEsIHsgMTcsLTEsMTgsIDIsIDEsIDUsIDMsIDgsLTEsLTIgfSB9LCB7IDEsIDEsIHsgMTcsMTgsLTEsIDgsIDIsIDUsIDMsIDQsIDEsIDYgfSB9LAorIHsgMSwgMiwgeyAgMSwxOCwgMywtMSwgNSwgMSwgMiwgNCwgNywgNiB9IH0sIHsgMCwgMSwgeyAxOCwxOCwgMywgNiwgNSwgMywtMiwgMiwxOCwtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDEsIHsgIDEsMTgsLTEsIDMsIDgsIDUsIDYsIDEsIDIsIDMgfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwgMiwgMywgNiwxOCwtMSwgNCwgMiwgMyB9IH0sIHsgMSwgMSwgeyAgMSwgMywgNSwxOCwgMiwgNiwgNywgMiwgMywgMSB9IH0sCisgeyAxLCAxLCB7ICAxLCAzLCA4LDE4LCA1LCAyLCA3LCAxLCAzLC0yIH0gfSwgeyAwLCAyLCB7IDE3LCAyLDE4LCAzLCA2LCAyLCA0LCA1LCA4LCAzIH0gfSwKKyB7IDAsIDEsIHsgMTgsMTcsIDIsMTgsIDMsIDIsIDcsLTIsMTgsIDQgfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAxLCAyLCB7IDE4LC0zLDE4LC0xLCAzLC0yLCA1LCA3LCAxLCAyIH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LCB7IDAsIDMsIHsgMTgsMTgsIDIsIDYsMTgsIDUsMTgsIDIsIDMsMTcgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDEsIDMsIHsgIDEsLTEsIDEsIDMsLTIsIDIsIDUsIDcsLTMsMTggfSB9LCB7IDEsIDIsIHsgMTgsIDcsIDMsLTMsIDIsIDgsIDIsIDUsIDQsMTcgfSB9LAorIHsgMSwgMSwgeyAgMSwgNCwgNSwgMSwgMywgNCwgNiwgNywgOCwgMyB9IH0sIHsgMCwgMSwgeyAxOCwxNywgMiwxOCwtMSwgMiwgMywxOCwgMiwgNCB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LC0yLDE4LCAyLCAzLCA0LCA3LCA1LDE3IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDEsIDEsIHsgMTcsMTgsIDIsIDEsIDMsIDIsIDUsIDEsIDIsIDMgfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwtMSwgMiwgMywgNSwgOCwgNiwgMSwtMiB9IH0sIHsgMCwgMSwgeyAxNywxOCwgOCwgMywgNCwgNiwgNSwgMiwgOCwgNyB9IH0sCisgeyAxLCAyLCB7ICAxLCAzLC0yLDE4LCAyLCA1LCAxLCA3LC0xLC0yIH0gfSwgeyAwLCAzLCB7IDE4LDE3LC0xLCAzLDE4LCAyLCAzLCA2LCA0LDE3IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMSwgMiwgeyAxOCwxOCwgNCwxOCwgNiwgNywgOCwgMywxOCwgMiB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAwLCAyLCB7IDE3LC0zLDE3LCAyLC0yLCA4LCAzLDE4LCA0LC0zIH0gfSwgeyAxLCAxLCB7IDE4LDE3LCAzLCA1LCA2LCAyLCA4LCAxLCAzLCA3IH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsIDMsIDYsIDUsIDMsLTIsIDIsMTgsLTEgfSB9LCB7IDAsIDMsIHsgMTgsMTgsIDIsIDYsMTgsIDUsMTgsIDIsIDMsMTcgfSB9LAorIHsgMSwgMSwgeyAxOCwxOCwgNSwgNCwgNiwgNCwgNSwgMSwgNCwgMyB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDIsIHsgIDMsMTcsMTgsLTMsIDIsIDUsMTgsIDYsLTEsIDcgfSB9LCB7IDEsIDEsIHsgMTcsMTgsIDMsIDIsIDUsLTEsIDYsIDgsIDQsIDcgfSB9LAorIHsgMSwgMSwgeyAxOCwgMSwtMiwgMywgMiwgMSwgNywgNiwgMywgNCB9IH0sIHsgMCwgMywgeyAgMSwgMiwxNywgMywxOCwgMiwgNywgNSwgNCwtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMSwgMSwgeyAxNywtMiwgMiwxOCwxOCwgOCwgNSwgMywgMiwgNiB9IH0sIHsgMCwgMiwgeyAxOCwgNSwxOCwgMiwgMywgNywtMiwgMSwgNiwgOCB9IH0sCisgeyAwLCAxLCB7ICAyLC0xLDE4LC0xLCAyLCA0LC0zLCA1LDE4LCAzIH0gfSwgeyAwLCAxLCB7ICAzLDE3LDE4LCA1LCAyLDE4LCA3LCAzLCA2LCA1IH0gfSwKKyB7IDEsIDQsIHsgIDEsIDIsIDUsMTgsLTIsIDIsIDMsIDcsLTEsIDQgfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMCwgMSwgeyAgMSwxOCwgMiwgMSwgMywgNCwgMSwgNSwgMiwgNyB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwgeyAwLCAxLCB7IDE3LDE3LDE4LCAyLCA0LCA1LDE4LC0yLCA2LCAzIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LCB7IDAsIDIsIHsgMTgsMTgsLTEsIDMsIDUsIDYsIDgsMTgsIDIsIDMgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAwLCAxLCB7IDE4LDE4LCA0LCA2LCA4LDE4LCA3LCAzLCAyLCA1IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDIsIHsgLTEsMTgsMTgsMTgsIDIsIDQsLTIsIDIsIDMsIDYgfSB9LCB7IDAsIDIsIHsgMTgsLTIsIDcsIDEsIDMsIDIsIDQsIDYsLTMsIDcgfSB9LAorIHsgMSwgMSwgeyAxNywxOCwgOCwgMywgNCwgNiwtMiwgNSwgMywgOCB9IH0sIHsgMCwgMiwgeyAxOCwgMSwgMiwgNiwgMiwgOCwgMywxOCwgNSwgNCB9IH0sCisgeyAxLCAxLCB7ICAzLDE4LDE4LCAyLDE4LCAyLDE4LCAzLCAyLDE4IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMSwgMSwgeyAgMywxNywxOCwgNSwgMiwgNiwgNywgMSwgNCwgOCB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LCB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsIDggfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwgOCB9IH0sCit9OworCitzdGF0aWMgY29uc3QgV2F2UGFja0RlY29yclNwZWMgdmVyeV9oaWdoX3NwZWNzW10gPSB7CisgeyAxLCAyLCB7IDE4LDE4LCAyLCAzLC0yLDE4LCAyLCA0LCA3LCA1LCAzLCA2LCA4LC0xLDE4LCAyIH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsLTEsMTgsIDIsIDMsIDQsIDYsIDUsIDcsMTgsLTMsIDgsIDIsLTEsIDMgfSB9LAorIHsgMSwgMiwgeyAgMSwxOCwtMiwgNCwxOCwgMiwgMywgNiwtMSwgNywgNSwtMiwxOCwgOCwgMiwgNCB9IH0sCisgeyAwLCAxLCB7IDE3LDE3LCAyLCAzLCA0LDE4LC0xLCA1LCA2LCA3LDE4LCAyLCA4LDE3LCAzLC0yIH0gfSwKKyB7IDEsIDEsIHsgMTgsMTgsIDIsMTgsIDMsIDIsMTgsIDQsLTEsIDMsMTgsIDIsIDYsIDgsMTcsIDUgfSB9LAorIHsgMCwgMiwgeyAxOCwxNywgMiwgMywtMiwgNSwxOCwtMywgMiwgNCwgNywgMywgNiwgOCwgNSwxNyB9IH0sCisgeyAxLCAxLCB7IDE4LC0yLCAyLC0zLDE4LCA1LC0yLDE4LCAyLCAzLCA2LCAyLDE3LCA0LCA3LC0xIH0gfSwKKyB7IDEsIDEsIHsgMTcsIDgsMTgsIDMsLTIsIDIsIDUsIDQsMTgsIDYsIDMsIDgsIDcsIDIsIDUsIDQgfSB9LAorIHsgMCwgMiwgeyAxOCwxNywtMiwgMiwxOCwgMywgMiwgNSwtMywgNCwgNywxOCwgMywgOCwgNiwgMiB9IH0sCisgeyAxLCAxLCB7ICAzLCA2LCA1LCA1LCAxLCAzLCA3LCA0LCAyLCA2LCA0LDE4LCAzLCA3LCA1LCA2IH0gfSwKKyB7IDEsIDIsIHsgIDEsMTgsIDMsIDIsLTIsIDEsIDUsIDQsIDYsIDIsIDcsIDEsIDgsIDMsLTEsIDEgfSB9LAorIHsgMCwgMSwgeyAxOCwxOCwgMiwgMywgNiwgMywgNSwtMiwgMiwgNCwxOCwgMywtMiwtMSwgNiwgNyB9IH0sCisgeyAwLCAxLCB7IC0yLDE4LCAyLDE4LCA3LCAyLCA2LC0yLCAzLCA0LDE4LDE4LCAyLC0zLCA4LCA1IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsMTgsIDIsIDQsIDMsMTgsIDUsIDMsIDYsLTIsIDIsIDQsMTgsIDgsIDcgfSB9LAorIHsgMCwgMSwgeyAtMiwgMSwxOCwgMiwtMiwxOCwtMSwgNSwgNywgMiwgMywgNCwxOCwgMiwgNiwgMiB9IH0sCisgeyAxLCAxLCB7IDE3LDE4LCAzLCAyLCAxLCA3LC0xLCAyLCA0LCAzLCA1LCA2LC0yLDE4LCA3LCA4IH0gfSwKKyB7IDEsIDEsIHsgMTgsMTgsIDIsMTgsIDMsIDQsIDYsLTIsMTgsIDUsIDgsIDIsIDMsIDcsIDQsLTEgfSB9LAorIHsgMCwgMSwgeyAxOCwxOCwxOCwtMSwgMiwgMywgNCwgNiwgOCwxOCwgMywgNSwgMiwgNiwgNywgNCB9IH0sCisgeyAxLCAxLCB7IDE3LC0yLDE4LDE4LCAyLCA1LCAzLCA4LCAyLC0xLCA2LCAxLCAzLCA0LCA3LCA1IH0gfSwKKyB7IDAsIDEsIHsgMTcsMTcsMTgsIDIsIDMsIDYsLTIsIDgsIDEsIDcsIDUsIDIsIDMsIDEsIDQsIDggfSB9LAorIHsgMSwgMSwgeyAxNywxNywgMywgMiwgNywgMSwgNCwgMywgNiwgMiwgNSwtMiwgOCwgNywxOCwgNiB9IH0sCisgeyAwLCAxLCB7IDE4LDE3LC0yLCAyLDE4LCAzLC0zLCA3LCA2LCA1LCAyLCA0LC0xLCA4LCAzLDE3IH0gfSwKKyB7IDEsIDEsIHsgIDIsMTgsMTgsLTIsIDIsIDQsLTEsIDUsMTgsIDMsIDgsIDYsIDIsIDcsMTcsIDQgfSB9LAorIHsgMCwgMSwgeyAxNywgMywgNiwgOCwgNSwgNCwgMywgOCwgMSwxOCwgNywgMiwgNCwgNSwgNiwgMyB9IH0sCisgeyAxLCAyLCB7IDE3LDE4LCA0LCA4LCAzLCAyLCA1LCA3LCA2LCA4LCAyLCA3LC0yLDE4LCAzLCA0IH0gfSwKKyB7IDEsIDEsIHsgIDYsIDUsIDUsIDMsIDQsIDcsIDMsIDIsIDQsIDYsIDMsIDcsIDEsIDUsIDIsIDQgfSB9LAorIHsgMSwgMSwgeyAgMSwxOCwtMSwgMiwgMSwgMywgOCwtMiwgMiwgNSwgNiwgMywgOCwgNywxOCwgNCB9IH0sCisgeyAwLCAxLCB7ICAxLDE3LC0xLDE4LCAzLCAyLCA1LCA0LCA2LCA3LCA4LCAzLCA0LCAyLCAxLC0yIH0gfSwKKyB7IDAsIDEsIHsgMTgsIDIsMTgsMTgsIDIsMTgsIDYsLTIsMTgsIDcsIDUsIDQsIDMsIDIsMTgsLTIgfSB9LAorIHsgMCwgMywgeyAgMSwgNCwxOCwgMywgMiwgNCwgMSwgNSwgMiwgMywgNiwxOCwgOCwgNywgMiwgNCB9IH0sCisgeyAwLCAxLCB7IDE3LC0yLCAxLC0zLCAyLDE4LCAzLC0yLCA0LDE4LCAzLCA2LCA3LC0zLCAyLCA4IH0gfSwKKyB7IDEsIDEsIHsgMTcsMTgsMTgsIDQsIDIsIDMsIDcsIDYsMTgsIDgsIDUsLTEsIDQsIDIsIDMsMTcgfSB9LAorIHsgMSwgMiwgeyAxOCwtMSwxNywxOCwgMiwgMywtMiwxOCwgNSwgOCwgMiwgNCwgMywgNywgNiwtMSB9IH0sCisgeyAxLCAxLCB7IDE4LDE4LDE4LC0yLCA0LCAyLCAzLDE4LCA1LCA4LCAyLCA0LCA2LCA3LC0yLCAzIH0gfSwKKyB7IDEsIDIsIHsgMTgsMTgsLTIsMTgsLTEsIDMsIDIsIDUsMTgsLTIsIDcsIDIsIDMsIDQsIDYsIDggfSB9LAorIHsgMCwgMSwgeyAxNywxOCwtMSwgMiwgNCwxOCwgOCwgMywgNiwgNSwgNywtMywgMiwgNCwgMywxNyB9IH0sCisgeyAxLCAxLCB7IDE4LDE4LDE3LCAyLC0xLDE4LCAzLCAyLDE4LCA2LCA1LCA0LDE4LCA3LCAyLC0xIH0gfSwKKyB7IDAsIDIsIHsgIDEsMTgsLTEsMTgsIDMsIDIsIDQsIDYsLTMsIDcsLTEsIDUsIDEsIDIsIDMsIDggfSB9LAorIHsgMSwgMSwgeyAgMSwxNywtMiwgMiwtMywgNiwgMywgNSwgMSwgMiwgNywgNiwgOCwtMiwgNCwgMSB9IH0sCisgeyAwLCAxLCB7IDE3LC0xLCA1LCAxLCA0LCAzLCA2LCAyLC0yLDE4LCAzLCAyLCA0LCA1LCA4LC0xIH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsMTcsIDIsIDMsLTIsIDUsMTgsIDIsIDQsIDcsIDgsIDYsMTcsIDMsIDUgfSB9LAorIHsgMSwgMSwgeyAgMSwgNSwgMSwgMywgNCwgMywgNywgNSwgMSwgMywgNiwgMSwgMiwgNCwgMywgOCB9IH0sCisgeyAxLCAyLCB7ICAxLC0xLCAzLCAyLDE4LCA3LC0yLCA1LCAyLCA2LCA0LCAzLC0xLDE4LCA4LCA3IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTcsIDMsMTgsIDIsIDUsIDQsIDMsIDYsIDIsIDcsIDgsMTgsIDMsIDQsIDUgfSB9LAorIHsgMSwgMSwgeyAgMywgNiwxNywgOCwgNywgNSwxOCwtMSwgMSwgMiwgMywgNCwgMiwgNiwgOCwgMSB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LCAzLC0zLDE4LCAyLCA2LCA1LCAzLCA3LDE4LCA0LC0yLCA4LCAyLCAzIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMSwgMSwgeyAxNywgMSwgNywgMiwgMywxOCwtMiwgMywgNiwgNCwgMiwgNywgOCwgNSwgMywxNyB9IH0sCisgeyAxLCAxLCB7ICAzLCA2LCA1LCA1LCAxLCAzLCA3LCA0LCAyLCA2LCA0LDE4LCAzLCA3LCA1LCA2IH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsMTgsIDIsIDQsLTEsMTgsIDgsLTEsIDIsIDMsIDQsIDYsLTIsIDEsIDcgfSB9LAorIHsgMSwgMSwgeyAxOCwtMiwxNywxOCwgMiwgNiwgMywtMiwgNSwgNCwgNywgMSwtMywgOCwgMiwgNiB9IH0sCisgeyAwLCAxLCB7IDE3LDE4LDE4LCA0LCAyLCA3LCAzLCA2LC0yLDE4LCA4LCA0LCA1LCAyLCA3LDE3IH0gfSwKKyB7IDEsIDEsIHsgMTgsMTgsIDUsIDQsIDYsIDQsIDEsIDUsIDQsIDMsIDIsIDUsIDYsIDEsIDQsIDUgfSB9LAorIHsgMCwgMSwgeyAxOCwxOCwtMiwxOCwgMiwtMywgMywgOCwgNSwxOCwgNiwgNCwgMywtMSwgNywgMiB9IH0sCisgeyAxLCAxLCB7IDE4LCAyLC0yLC0zLDE4LCA1LCAyLCAzLC0yLCA0LCA2LCAxLC0zLCAyLCA3LCA4IH0gfSwKKyB7IDAsIDEsIHsgMTgsIDMsIDUsIDgsIDIsIDYsIDcsIDMsIDEsIDUsIDIsLTEsIDgsIDYsIDcsIDQgfSB9LAorIHsgMSwgMSwgeyAgNCwgMywgOCwgMSwgNSwgNiwgMiwgNSwgOCwtMiwgMiwgNywgMywxOCwgNSwgNCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDEsIDEsIHsgMTcsIDMsMTgsMTgsIDcsIDIsIDQsMTgsIDYsIDIsIDMsLTEsIDgsIDUsMTgsLTMgfSB9LAorIHsgMCwgMSwgeyAgMywxNywxOCwgMiwxOCwgNiwgNywtMywxOCwgMiwgNSwgNiwgMywgOCwgNywtMSB9IH0sCisgeyAxLCAxLCB7IDE4LDE4LCAyLDE4LDE4LCAyLC0xLCA3LCAzLDE4LCA1LCAyLCA2LCA0LC0xLDE4IH0gfSwKKyB7IDAsIDMsIHsgMTgsIDMsIDQsIDEsIDUsIDIsMTgsIDQsIDIsIDMsMTgsIDcsIDYsIDEsIDIsIDQgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAxLCAxLCB7IDE3LCAxLDE4LCAyLCAzLCA2LCA0LCA1LCA3LDE4LCAzLCA4LCAyLCA0LC0yLDE3IH0gfSwKKyB7IDEsIDIsIHsgMTgsMTcsIDIsIDMsIDUsMTgsIDYsLTIsIDcsIDMsIDIsIDQsMTgsIDgsLTEsIDUgfSB9LAorIHsgMCwgMiwgeyAgMSwxOCwtMSwxOCwgMywgMiwgNCwgNiwtMywgNywtMSwgNSwgMSwgMiwgMywgOCB9IH0sCisgeyAxLCAxLCB7ICAxLDE4LC0xLCA4LCAyLCA2LCAzLC0yLCAxLCAyLCA1LCA0LC0zLCA4LCA2LCAzIH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsIDIsMTgsIDIsMTgsIDcsIDYsMTgsIDIsLTIsIDMsIDUsIDQsMTgsIDggfSB9LAorIHsgMSwgMiwgeyAxOCwxNywgMiwgMywxOCwtMSwgMiwgMywgNiwxOCwgNSwgNCwgMywgNywgMiwgOCB9IH0sCisgeyAxLCAyLCB7IDE4LDE4LCAzLC0yLCA0LDE4LCA1LCA3LCA2LCAyLCA0LC0zLCA4LCA1LDE4LCAzIH0gfSwKKyB7IDEsIDEsIHsgMTcsLTIsMTgsMTgsIDIsIDUsIDMsIDgsIDIsLTEsIDYsIDEsIDMsIDQsIDcsIDUgfSB9LAorIHsgMSwgMSwgeyAgMywxNywxOCwgNSwgNywgMiwgNCwgNiwgMSwgOCwtMSwgMywgNywgNCwgMSwgMiB9IH0sCisgeyAwLCAyLCB7ICAxLC0yLCAyLDE4LCAzLCA1LCAyLCA0LCA3LC0xLCAyLCAzLCA1LDE4LC0yLCA0IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMSwgMSwgeyAgMSwgMiwtMiwgNiwxOCwtMywgMiwgNywgMywtMiwgNSwgNiwgMSwgOCwgMiwgNCB9IH0sCisgeyAwLCAxLCB7IDE4LDE4LDE4LCAzLC0yLCA2LDE4LCAyLCA0LCAzLCA1LCA4LCA3LCA2LCAyLC0yIH0gfSwKKyB7IDEsIDEsIHsgIDEsIDUsIDEsIDMsIDQsIDMsIDcsIDUsIDEsIDMsIDYsIDEsIDIsIDQsIDMsIDggfSB9LAorIHsgMCwgMSwgeyAgMywxNywxOCwgMiwgNSwxOCwgNiwgNywgNSwtMiwgMiwgNCwxOCwgMywgNiwgOCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDIsIHsgMTcsLTEsMTgsIDIsIDQsLTEsIDgsIDMsMTgsIDcsLTMsIDQsIDUsIDEsIDIsLTIgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgOCwgNiwgNCwgNSwgNywtMSB9IH0sCisgeyAxLCAxLCB7IDE4LDE4LCAzLCA2LCA0LCA4LC0yLCAyLCA1LCAzLCA3LDE4LCA2LCA4LCA0LCAyIH0gfSwKKyB7IDEsIDEsIHsgMTcsMTgsMTgsLTIsIDUsIDIsIDMsIDEsIDQsLTEsIDgsIDYsIDUsIDMsIDIsMTggfSB9LAorIHsgMSwgMSwgeyAxNywxNywgMSwgMiwgNCwgNSwgMiwgNiwtMSwgMywgMSwgMSwtMiwgNCwgMiwgNyB9IH0sCisgeyAxLCAxLCB7IDE3LCAxLCA3LCAyLCAzLDE4LC0yLCAzLCA2LCA0LCAyLCA3LCA4LCA1LCAzLDE3IH0gfSwKKyB7IDAsIDEsIHsgMTgsMTcsLTIsLTMsIDEsIDIsIDMsIDIsIDUsIDQsIDcsLTMsIDYsLTIsIDIsIDEgfSB9LAorIHsgMSwgMSwgeyAgMSwgMywgNSwxOCwgMSwgMiwgNywgMywgNiwgMiwgNSwgOCwtMSwgMSwgNCwgNyB9IH0sCisgeyAxLCAxLCB7IDE3LCAzLCA2LCA4LCAxLCA0LCA1LCAzLC0yLCA3LCAyLCA4LCA1LCA2LDE4LCAzIH0gfSwKKyB7IDEsIDEsIHsgMTcsMTgsIDIsIDQsIDgsLTIsIDMsIDEsIDUsIDYsIDcsIDEsIDIsIDMsIDQsIDcgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAxLCAxLCB7ICAzLCAxLCA4LDE4LCA1LCAyLCAzLDE4LCA2LCA3LC0yLCA0LCAzLCAyLCA4LDE4IH0gfSwKKyB7IDAsIDEsIHsgMTgsMTcsIDIsMTgsIDMsIDQsLTEsMTgsIDcsIDYsIDIsIDgsIDQsMTgsMTgsIDUgfSB9LAorIHsgMCwgMSwgeyAxOCwxOCwgMiwxOCwxOCwgMiwgNywtMiwgNiwgNSwgNCwgMywxOCwgMywgMiwxNyB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMSwgMSwgeyAxNywgOCwxOCwgMywgMiwgMSwgNSwgNCwgNiwtMSwgMywtMywgOCwxOCwgNywgMiB9IH0sCisgeyAxLCAyLCB7IDE4LDE3LDE4LCAyLCAzLCA1LC0yLDE4LCA2LC0xLCAyLCAzLCA3LCA0LCA4LDE3IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDgsIDYsIDQsIDUsIDcsLTEgfSB9LAorIHsgMSwgMiwgeyAxOCwxOCwtMiwxNywgMiwxOCwgMywgNCwxOCwgOCwgNywtMSwgMiwgNCwgNSwxNyB9IH0sCisgeyAwLCAyLCB7IDE3LC0zLDE3LCAzLCAyLC0yLDE4LCA4LCA0LC0zLCAyLDE4LCA1LCAzLC0yLCA2IH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsIDIsMTgsMTgsIDIsIDcsLTIsIDYsIDUsIDQsIDMsMTgsIDMsIDIsMTcgfSB9LAorIHsgMCwgMiwgeyAgMSwxOCwtMSwgMywgNSwgMiwtMywxOCwgNywgMywtMSwgNiwgNCwgMiwxNywgNSB9IH0sCisgeyAxLCAxLCB7IDE3LC0yLDE3LCAyLC0zLCAxLCA1LC0xLCA0LCA2LCAzLCAyLCA4LCA3LC0yLCA1IH0gfSwKKyB7IDEsIDEsIHsgIDEsMTgsIDEsIDMsIDUsIDgsIDYsIDIsIDMsLTEsIDcsIDEsIDQsIDgsIDUsLTMgfSB9LAorIHsgMCwgMiwgeyAgMywxOCwxOCwgMiwxOCwtMiwgNiwgNSwgNywgMiwgNCwxOCwgMywgNiwtMywgNSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDEsIDEsIHsgIDMsIDYsMTcsIDgsIDcsIDUsMTgsLTEsIDEsIDIsIDMsIDQsIDIsIDYsIDgsIDEgfSB9LAorIHsgMCwgNCwgeyAxOCwgMiwxNywgMywxOCwtMiwgMiwgNiwxOCwgMiwgNywgMywgNSwgNCwgOCwxOCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsIDIsIDMsIDYsIDMsIDUsLTIsIDIsIDQsMTgsIDMsLTIsLTEsIDYsIDcgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAxLCAxLCB7IDE3LCAxLCAyLCA1LCAzLC0yLCAxLCA0LCAzLCA3LCA2LC0zLCAyLCAxLCAxLCAyIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMSwgMSwgeyAxOCwxOCwtMiwxOCwtMiwgMiwgMywgNiwxOCwgNCwtMSwgMiwgMywgOCwgMSwgNCB9IH0sCisgeyAxLCAxLCB7IDE3LC0yLDE3LCAyLC0zLCAxLCA1LC0xLCA0LCA2LCAzLCAyLCA4LCA3LC0yLCA1IH0gfSwKKyB7IDAsIDEsIHsgMTcsMTcsMTgsIDMsIDIsMTgsMTgsIDYsIDgsIDIsLTIsIDMsIDUsIDQsMTcsMTggfSB9LAorIHsgMSwgMSwgeyAgMSwgNSwgMSwgMywgNCwgMywgNywgNSwgMSwgMywgNiwgMSwgMiwgNCwgMywgOCB9IH0sCisgeyAxLCAxLCB7ICAxLCAzLC0zLDE4LDE4LCA2LCA1LDE4LCAyLC0xLCAzLCA4LCA3LC0zLCA0LDE3IH0gfSwKKyB7IDEsIDEsIHsgMTgsIDEsIDIsIDEsIDMsIDgsIDcsIDQsIDEsIDUsIDIsLTEsLTMsMTgsIDYsIDIgfSB9LAorIHsgMCwgMSwgeyAxOCwgMywgNSwgMiwgNiwgOCwxOCwgNSwgNywgMiwgMywtMSwgNiwgNywgOCwgNSB9IH0sCisgeyAwLCAyLCB7IDE4LCAzLC0yLCA3LCA4LCAyLCA1LCA0LC0zLCA4LCAzLCAyLDE4LCA1LCA0LCA2IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMSwgMywgeyAgMSwgMSwgMiwgNSwgMiwgNywgNCwgMywtMSwxOCwtMiwgOCwgMiwgMSwgNiwgNyB9IH0sCisgeyAwLCAxLCB7ICAzLDE3LDE4LCA1LCAyLCA2LCA3LDE4LCA0LCA1LCAzLCA2LDE4LCAyLCA3LCA4IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgIDEsMTgsIDEsIDIsIDMsIDUsIDEsIDIsIDYsIDcsIDQsIDMsIDgsIDEsMTcsIDUgfSB9LAorIHsgMSwgMiwgeyAxNywtMSwxOCwtMiwgMiwgMywgNSwxOCwgMiwgNCwgNiwgNywgMywtMSwgNSwgOCB9IH0sCisgeyAxLCAxLCB7IDE4LDE4LC0zLDE4LC0yLCAyLCAzLC0yLDE4LCA2LCA0LCA1LCA4LCAzLDE3LC0zIH0gfSwKKyB7IDEsIDEsIHsgMTgsIDcsIDYsIDUsIDUsIDMsIDEsIDQsIDIsIDcsIDMsIDQsLTMsIDYsMTgsIDggfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwgMiwgMywgNSwxOCwgMiwgNCwgMywgNiwxOCwgNywgOCwtMSwgNSwgMiB9IH0sCisgeyAwLCAxLCB7IDE4LDE3LC0xLCAyLDE4LCAzLCAyLDE4LCA0LCAzLDE4LCAyLCA2LCA1LCA4LDE3IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTcsIDIsIDMsMTgsIDUsLTEsIDYsIDcsIDgsIDIsIDMsIDQsIDUsMTgsIDYgfSB9LAorIHsgMSwgMiwgeyAxOCwtMywxOCwgMiwgMywtMiwtMywgNSwxOCwgNywgNiwgMiwgNCwgMywgOCwtMiB9IH0sCisgeyAxLCAxLCB7IDE3LDE4LDE4LC0yLCAyLCAzLCA1LCA0LCA4LDE4LC0xLCA1LCAzLCA2LC0yLCA3IH0gfSwKKyB7IDEsIDIsIHsgMTgsMTcsIDIsLTIsMTgsIDMsLTEsIDQsMTgsIDIsIDcsIDUsIDMsIDgsIDYsIDQgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAxLCAxLCB7ICAxLCA1LCAxLCAzLCA0LCAzLCA3LCA1LCAxLCAzLCA2LCAxLCAyLCA0LCAzLCA4IH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsIDMsIDMsLTIsIDIsIDUsMTgsIDYsIDMsLTEsIDQsIDcsLTEsIDEsIDIgfSB9LAorIHsgMCwgMSwgeyAtMiwgMSwxOCwgMiwtMiwgNSwgNywxOCwgMywgMiwgNiwgMiwtMSwgNCwtMiwxNyB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LDE4LCAyLCAzLC0yLDE4LCA1LCA0LCAyLCA2LCA4LCAzLC0yLCA0LDE4IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMSwgMSwgeyAxNywxOCwtMSwgMywgMiwgNSwgMSwgMywgMiwgOCwgNCwgNywgNiwgMiwtMSwgNSB9IH0sCisgeyAxLCAxLCB7IDE3LDE4LDE4LCA0LCAyLCAzLCA3LCA2LDE4LCA4LCA1LC0xLCA0LCAyLCAzLDE3IH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsLTIsMTgsIDIsIDMsIDQsIDUsIDYsMTgsIDgsIDIsIDMsIDcsLTIsIDQgfSB9LAorIHsgMCwgMSwgeyAxOCwtMiwxOCwxOCwtMywtMiwgMiwgMywgNSwgOCwgMSwgMiwgNiwgNCwgNywtMSB9IH0sCisgeyAwLCAxLCB7IDE4LDE3LCAyLDE4LCAzLC0yLCAyLCA3LCA2LCA0LDE4LCAzLCA4LCA3LCA0LCAyIH0gfSwKKyB7IDEsIDEsIHsgMTcsMTgsMTgsIDQsIDIsIDMsIDcsIDYsMTgsIDgsIDUsLTEsIDQsIDIsIDMsMTcgfSB9LAorIHsgMSwgMSwgeyAxOCwxNywxOCwgMiwgNSwgMywtMiwxOCwgNiwgMiwgMywgNCwgOCwgNywgNSwtMSB9IH0sCisgeyAwLCAxLCB7ICAyLC0xLDE4LC0xLCAyLCA0LC0zLDE4LCA1LCAzLCA2LDE4LCAyLCA0LCA3LCA4IH0gfSwKKyB7IDEsIDEsIHsgMTcsMTgsIDgsIDMsIDYsIDQsLTEsIDUsIDIsIDcsIDMsIDgsIDYsIDUsMTgsIDQgfSB9LAorIHsgMCwgMiwgeyAxOCwgMywtMiwgNywgOCwgMiwgNSwgNCwtMywgOCwgMywgMiwxOCwgNSwgNCwgNiB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDEsIDEsIHsgIDEsMTgsLTEsIDgsIDIsIDYsIDMsLTIsIDEsIDIsIDUsIDQsLTMsIDgsIDYsIDMgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IDE3LDE4LDE4LCA0LCAyLCA3LCAzLCA2LC0yLDE4LCA4LCA0LCA1LCAyLCA3LDE3IH0gfSwKKyB7IDEsIDIsIHsgMTgsLTEsMTgsIDMsLTIsMTgsIDIsIDUsIDMsIDYsIDcsIDIsLTEsMTgsIDgsIDQgfSB9LAorIHsgMSwgMiwgeyAgMSwxOCwtMiwgNCwxOCwgMiwgMywgNiwtMSwgNywgNSwtMiwxOCwgOCwgMiwgNCB9IH0sCisgeyAxLCAyLCB7ICAxLDE4LC0zLCAyLCAzLDE4LC0xLCA1LCA2LCAyLCA4LCAzLCA0LCAxLC0yLCA3IH0gfSwKKyB7IDAsIDEsIHsgIDEsMTcsLTEsMTgsIDMsIDIsIDUsIDQsIDYsIDcsIDgsIDMsIDQsIDIsIDEsLTIgfSB9LAorIHsgMSwgMSwgeyAxOCwxNywxOCwgNCwgMywgNSwgMSwgMiwgNiwgMywgNCwgNywgMSwgOCwgNSwgMiB9IH0sCisgeyAwLCAxLCB7IDE4LC0yLCA3LCAxLCAzLCAyLC0zLCA0LCA2LC0yLCA3LCA4LCAxLCA1LCA0LCAzIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LDE4LC0yLCAyLCA1LCAzLCA3LDE4LCAyLCA0LC0zLCA1LCA2LCAzLCA4IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMywgeyAgMywxOCwtMSwgNSwgMiwgNywxOCwgNiwgNSwgMiwgNCwgMywtMSwgNywxOCwgNiB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LDE4LCA0LCAzLCAyLCA2LCA0LCA4LDE4LCA1LCAzLCAyLCA3LC0yLCA2IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMiwgeyAxOCwxOCwxOCwgMiwgMywtMiwxOCwgNSwgNCwgMiwgNiwgOCwgMywtMiwgNCwxOCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDEsIDEsIHsgMTcsIDgsMTgsIDMsIDIsIDEsIDUsIDQsIDYsLTEsIDMsLTMsIDgsMTgsIDcsIDIgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LDE4LCAyLCA0LCA2LC0yLCAyLCA4LCAzLCA0LDE4LCA3LC0xLCA2IH0gfSwKKyB7IDAsIDEsIHsgMTgsIDEsLTIsIDIsIDQsIDEsIDMsLTEsIDIsIDUsIDcsIDEsIDYsIDgsLTIsMTcgfSB9LAorIHsgMCwgMSwgeyAxNywxNywxOCwgMiwgNSwgNCwxOCwgMywgOCwgNywgNCwgNiwgOCwgMSwgNSwgMiB9IH0sCisgeyAxLCAyLCB7IDE4LDE4LCA1LCA0LCA2LCAzLCA0LDE4LCA4LCA0LC0xLCA3LCA1LCAzLCA2LCAyIH0gfSwKKyB7IDAsIDEsIHsgMTgsMTgsLTMsMTgsIDMsIDYsIDIsIDUsIDcsMTgsIDMsIDgsLTEsIDQsIDUsIDIgfSB9LAorIHsgMSwgMSwgeyAxOCwgMiwtMiwtMywxOCwgNSwgMiwtMiwgNCwgMywgNiwxOCwgOCwtMSwgMiwgNyB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAxLCAxLCB7IDE3LCAxLCA3LCAyLCAzLDE4LC0yLCAzLCA2LCA0LCAyLCA3LCA4LCA1LCAzLDE3IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAxNywxOCwgMywxOCwgMiwgNSwgNCwgNywtMywgNiwgMywgMiwxOCwgNCwgNywgMyB9IH0sCisgeyAxLCAxLCB7ICAxLCA3LCA0LCA1LCAzLCA0LCA1LCAxLCAzLCA2LCAzLCAyLCA0LCA4LC0yLCA3IH0gfSwKKyB7IDAsIDEsIHsgIDEsMTgsLTEsLTIsMTgsIDMsIDIsLTEsIDYsIDcsIDQsIDUsIDMsMTgsIDIsLTMgfSB9LAorIHsgMSwgMSwgeyAxOCwxOCwtMSwgMywgNiwxOCwgNSwgNCwgOCwgMiwgMywgNiwxOCwgNywgNCwtMiB9IH0sCisgeyAwLCAyLCB7IDE4LDE4LCAyLCA2LDE4LCAyLDE4LCA1LCAzLDE4LCAyLCA0LCA3LCA4LCAzLDE4IH0gfSwKKyB7IDEsIDEsIHsgIDMsMTgsMTgsIDUsMTgsIDYsIDIsIDQsIDcsLTIsMTgsIDUsIDgsIDYsIDMsIDIgfSB9LAorIHsgMCwgMSwgeyAxOCwtMiwgNywgMSwgMywgMiwtMywgNCwgNiwtMiwgNywgOCwgMSwgNSwgNCwgMyB9IH0sCisgeyAxLCAxLCB7IDE4LC0yLDE4LCAyLCA1LDE4LCAzLC0yLCA0LCA3LCAyLC0xLCA4LCA2LCA1LCAxIH0gfSwKKyB7IDEsIDEsIHsgMTcsMTcsIDUsMTgsIDQsIDEsIDIsIDgsIDYsIDQsLTIsIDMsIDUsLTEsIDEsIDggfSB9LAorIHsgMCwgMiwgeyAgMSwgMiwxNywgMywgNywxOCwgMiwtMSwgNCwgNSwxOCwgMiwgNywgMywgNiwgOCB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDEsIDEsIHsgIDMsIDYsMTcsIDgsIDcsIDUsMTgsLTEsIDEsIDIsIDMsIDQsIDIsIDYsIDgsIDEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDIsIHsgMTgsMTgsMTgsIDIsLTIsIDMsIDYsIDQsIDgsMTgsIDIsIDUsIDcsIDQsIDMsIDYgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMSwgMSwgeyAxOCwgMSwgOCwgMywgNSwgNiwgNCwtMSwgOCwgMywgNywxOCwgMiwgNSwgOCwgNCB9IH0sCisgeyAxLCAxLCB7IDE3LDE4LCA1LCAyLCA0LCAzLCAxLCA2LC0yLCAxLCAzLCAyLCA0LCA1LC0xLDE3IH0gfSwKKyB7IDEsIDEsIHsgMTgsMTcsIDIsMTgsIDMsLTMsIDcsIDIsIDYsIDQsIDMsIDUsMTgsIDgsIDIsLTIgfSB9LAorIHsgMSwgMSwgeyAxOCwxNywxOCwgNCwgMywgNSwtMSwxOCwgMiwgNywgOCwgNCwgNiwgMywxOCwgNSB9IH0sCisgeyAwLCAxLCB7IDE4LDE3LDE4LC0yLCAyLC0zLCAzLCA0LCA4LCA1LCAyLDE4LCA2LCAzLCA3LC0yIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMSwgMSwgeyAxNywxOCwgOCwgMywgNCwgNiwxOCwgNSwtMiwgMywgOCwgNSwgMiwgNCwgNywgNiB9IH0sCisgeyAwLCAxLCB7IDE4LC0yLCAzLCA1LCAxLCA3LCAzLCAyLCA2LC0zLCA0LCAxLCA1LCA4LCAzLC0yIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMSwgMSwgeyAgMywxNywxOCwgNSwtMSwxOCwgMiwgNiwgNywxOCwgNSwgMywtMywtMSwgNiwgMiB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMSwgMywgeyAxOCwxNywtMiwgMywtMSwxOCwgMiwgNSwgMywgNywgNiwgMiwgNCwgOCwxOCwgNSB9IH0sCisgeyAwLCAxLCB7IDE4LC0xLDE4LCAyLDE4LCAzLCA1LDE4LCAyLCA4LDE4LCA1LCA0LC0xLCA2LCAyIH0gfSwKKyB7IDEsIDIsIHsgMTgsLTIsMTgsMTgsIDIsIDMsIDQsLTMsIDIsIDUsMTgsIDcsIDQsIDMsIDgsIDYgfSB9LAorIHsgMCwgMiwgeyAxNywtMSwxOCwgMiwtMSwgMSwgNywgMywgOCwgNSwtMiwgNCwgMSwgMiwtMywgNiB9IH0sCisgeyAwLCAxLCB7IDE4LDE3LCAyLDE4LCAyLDE4LCA2LCA3LCA0LCAzLDE4LCA1LCAyLC0yLDE3LCA4IH0gfSwKKyB7IDAsIDMsIHsgMTgsMTcsIDIsIDMsLTMsLTEsMTgsIDIsIDQsIDUsMTgsIDcsIDMsIDIsLTMsIDYgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDIsIHsgIDMsMTgsMTgsMTgsIDIsIDYsIDUsMTgsIDcsIDIsIDQsIDYsMTgsIDUsIDMsIDggfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IDE4LDE4LCAzLCA2LCAzLC0yLCAyLDE4LCA1LC0xLCA3LCAzLCA0LC0yLCAyLCA2IH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDEsIDEsIHsgMTgsMTcsMTgsMTgsLTIsIDIsIDMsLTMsMTgsIDYsIDQsIDIsLTIsIDgsIDMsIDcgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IDE4LDE4LDE4LCA0LCAyLCA3LCA4LDE4LCAzLCAyLC0yLCA0LCA3LCA2LDE3LCA1IH0gfSwKKyB7IDEsIDEsIHsgMTgsMTgsLTEsLTIsIDgsIDMsMTgsIDYsIDMsIDUsIDgsIDIsIDQsIDcsIDEsIDYgfSB9LAorIHsgMSwgMSwgeyAgMSwtMywgMywxOCwxOCwgMiwtMSwgMywgNiwgNSwxOCwgNCwgNywtMiwgOCwgMyB9IH0sCisgeyAxLCAxLCB7ICAxLDE4LCA0LCAyLCA1LDE4LCAxLCAzLC0xLCA2LCAxLCA0LCA4LCAyLCA1LCAxIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKKyB7IDAsIDEsIHsgLTEsMTgsMTgsIDIsMTgsIDMsIDUsMTgsIDIsMTgsIDYsIDgsIDQsIDUsIDcsLTEgfSB9LAorIHsgMCwgMSwgeyAtMSwxOCwxOCwgMiwxOCwgMywgNSwxOCwgMiwxOCwgNiwgOCwgNCwgNSwgNywtMSB9IH0sCisgeyAwLCAxLCB7IC0xLDE4LDE4LCAyLDE4LCAzLCA1LDE4LCAyLDE4LCA2LCA4LCA0LCA1LCA3LC0xIH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBXYXZQYWNrRGVjb3JyU3BlYyAqIGNvbnN0IGRlY29ycl9maWx0ZXJzW10gPSB7CisgICAgJmZhc3Rfc3BlY3NbMF0sICZkZWZhdWx0X3NwZWNzWzBdLCAmaGlnaF9zcGVjc1swXSwgJnZlcnlfaGlnaF9zcGVjc1swXSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBkZWNvcnJfZmlsdGVyX3NpemVzW10gPSB7CisgICAgRkZfQVJSQVlfRUxFTVMoZmFzdF9zcGVjcyksCisgICAgRkZfQVJSQVlfRUxFTVMoZGVmYXVsdF9zcGVjcyksCisgICAgRkZfQVJSQVlfRUxFTVMoaGlnaF9zcGVjcyksCisgICAgRkZfQVJSQVlfRUxFTVModmVyeV9oaWdoX3NwZWNzKSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRlY29ycl9maWx0ZXJfbnRlcm1zW10gPSB7IDIsIDUsIDEwLCAxNiB9OworCitzdGF0aWMgY29uc3QgaW50OF90IG5iaXRzX3RhYmxlW10gPSB7CisgMCwgMSwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKyA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKKyA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4Cit9OworCisjZW5kaWYgLyogQVZDT0RFQ19XQVZQQUNLRU5DX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dlYnAuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dlYnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjFjOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvd2VicC5jCkBAIC0wLDAgKzEsMTUzMCBAQAorLyoKKyAqIFdlYlAgKC53ZWJwKSBpbWFnZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQW5lZXNoIERvZ3JhIDxhbmVlc2hAc3VnYXJsYWJzLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBKdXN0aW4gUnVnZ2xlcyA8anVzdGluLnJ1Z2dsZXNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBXZWJQIGltYWdlIGRlY29kZXIKKyAqCisgKiBAYXV0aG9yIEFuZWVzaCBEb2dyYSA8YW5lZXNoQHN1Z2FybGFicy5vcmc+CisgKiBDb250YWluZXIgYW5kIExvc3N5IGRlY29kaW5nCisgKgorICogQGF1dGhvciBKdXN0aW4gUnVnZ2xlcyA8anVzdGluLnJ1Z2dsZXNAZ21haWwuY29tPgorICogTG9zc2xlc3MgZGVjb2RlcgorICogQ29tcHJlc3NlZCBhbHBoYSBmb3IgbG9zc3kKKyAqCisgKiBAYXV0aG9yIEphbWVzIEFsbWVyIDxqYW1yaWFsQGdtYWlsLmNvbT4KKyAqIEV4aWYgbWV0YWRhdGEKKyAqCisgKiBVbmltcGxlbWVudGVkOgorICogICAtIEFuaW1hdGlvbgorICogICAtIElDQyBwcm9maWxlCisgKiAgIC0gWE1QIG1ldGFkYXRhCisgKi8KKworI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJleGlmLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgInZwOC5oIgorCisjZGVmaW5lIFZQOFhfRkxBR19BTklNQVRJT04gICAgICAgICAgICAgMHgwMgorI2RlZmluZSBWUDhYX0ZMQUdfWE1QX01FVEFEQVRBICAgICAgICAgIDB4MDQKKyNkZWZpbmUgVlA4WF9GTEFHX0VYSUZfTUVUQURBVEEgICAgICAgICAweDA4CisjZGVmaW5lIFZQOFhfRkxBR19BTFBIQSAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBWUDhYX0ZMQUdfSUNDICAgICAgICAgICAgICAgICAgIDB4MjAKKworI2RlZmluZSBNQVhfUEFMRVRURV9TSVpFICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBNQVhfQ0FDSEVfQklUUyAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIE5VTV9DT0RFX0xFTkdUSF9DT0RFUyAgICAgICAgICAgMTkKKyNkZWZpbmUgSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFICAgICA1CisjZGVmaW5lIE5VTV9MSVRFUkFMX0NPREVTICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIE5VTV9MRU5HVEhfQ09ERVMgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgTlVNX0RJU1RBTkNFX0NPREVTICAgICAgICAgICAgICA0MAorI2RlZmluZSBOVU1fU0hPUlRfRElTVEFOQ0VTICAgICAgICAgICAgIDEyMAorI2RlZmluZSBNQVhfSFVGRk1BTl9DT0RFX0xFTkdUSCAgICAgICAgIDE1CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhbHBoYWJldF9zaXplc1tIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREVdID0geworICAgIE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUywKKyAgICBOVU1fTElURVJBTF9DT0RFUywgTlVNX0xJVEVSQUxfQ09ERVMsIE5VTV9MSVRFUkFMX0NPREVTLAorICAgIE5VTV9ESVNUQU5DRV9DT0RFUworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZV9sZW5ndGhfY29kZV9vcmRlcltOVU1fQ09ERV9MRU5HVEhfQ09ERVNdID0geworICAgIDE3LCAxOCwgMCwgMSwgMiwgMywgNCwgNSwgMTYsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbHo3N19kaXN0YW5jZV9vZmZzZXRzW05VTV9TSE9SVF9ESVNUQU5DRVNdWzJdID0geworICAgIHsgIDAsIDEgfSwgeyAgMSwgMCB9LCB7ICAxLCAxIH0sIHsgLTEsIDEgfSwgeyAgMCwgMiB9LCB7ICAyLCAwIH0sIHsgIDEsIDIgfSwgeyAtMSwgMiB9LAorICAgIHsgIDIsIDEgfSwgeyAtMiwgMSB9LCB7ICAyLCAyIH0sIHsgLTIsIDIgfSwgeyAgMCwgMyB9LCB7ICAzLCAwIH0sIHsgIDEsIDMgfSwgeyAtMSwgMyB9LAorICAgIHsgIDMsIDEgfSwgeyAtMywgMSB9LCB7ICAyLCAzIH0sIHsgLTIsIDMgfSwgeyAgMywgMiB9LCB7IC0zLCAyIH0sIHsgIDAsIDQgfSwgeyAgNCwgMCB9LAorICAgIHsgIDEsIDQgfSwgeyAtMSwgNCB9LCB7ICA0LCAxIH0sIHsgLTQsIDEgfSwgeyAgMywgMyB9LCB7IC0zLCAzIH0sIHsgIDIsIDQgfSwgeyAtMiwgNCB9LAorICAgIHsgIDQsIDIgfSwgeyAtNCwgMiB9LCB7ICAwLCA1IH0sIHsgIDMsIDQgfSwgeyAtMywgNCB9LCB7ICA0LCAzIH0sIHsgLTQsIDMgfSwgeyAgNSwgMCB9LAorICAgIHsgIDEsIDUgfSwgeyAtMSwgNSB9LCB7ICA1LCAxIH0sIHsgLTUsIDEgfSwgeyAgMiwgNSB9LCB7IC0yLCA1IH0sIHsgIDUsIDIgfSwgeyAtNSwgMiB9LAorICAgIHsgIDQsIDQgfSwgeyAtNCwgNCB9LCB7ICAzLCA1IH0sIHsgLTMsIDUgfSwgeyAgNSwgMyB9LCB7IC01LCAzIH0sIHsgIDAsIDYgfSwgeyAgNiwgMCB9LAorICAgIHsgIDEsIDYgfSwgeyAtMSwgNiB9LCB7ICA2LCAxIH0sIHsgLTYsIDEgfSwgeyAgMiwgNiB9LCB7IC0yLCA2IH0sIHsgIDYsIDIgfSwgeyAtNiwgMiB9LAorICAgIHsgIDQsIDUgfSwgeyAtNCwgNSB9LCB7ICA1LCA0IH0sIHsgLTUsIDQgfSwgeyAgMywgNiB9LCB7IC0zLCA2IH0sIHsgIDYsIDMgfSwgeyAtNiwgMyB9LAorICAgIHsgIDAsIDcgfSwgeyAgNywgMCB9LCB7ICAxLCA3IH0sIHsgLTEsIDcgfSwgeyAgNSwgNSB9LCB7IC01LCA1IH0sIHsgIDcsIDEgfSwgeyAtNywgMSB9LAorICAgIHsgIDQsIDYgfSwgeyAtNCwgNiB9LCB7ICA2LCA0IH0sIHsgLTYsIDQgfSwgeyAgMiwgNyB9LCB7IC0yLCA3IH0sIHsgIDcsIDIgfSwgeyAtNywgMiB9LAorICAgIHsgIDMsIDcgfSwgeyAtMywgNyB9LCB7ICA3LCAzIH0sIHsgLTcsIDMgfSwgeyAgNSwgNiB9LCB7IC01LCA2IH0sIHsgIDYsIDUgfSwgeyAtNiwgNSB9LAorICAgIHsgIDgsIDAgfSwgeyAgNCwgNyB9LCB7IC00LCA3IH0sIHsgIDcsIDQgfSwgeyAtNywgNCB9LCB7ICA4LCAxIH0sIHsgIDgsIDIgfSwgeyAgNiwgNiB9LAorICAgIHsgLTYsIDYgfSwgeyAgOCwgMyB9LCB7ICA1LCA3IH0sIHsgLTUsIDcgfSwgeyAgNywgNSB9LCB7IC03LCA1IH0sIHsgIDgsIDQgfSwgeyAgNiwgNyB9LAorICAgIHsgLTYsIDcgfSwgeyAgNywgNiB9LCB7IC03LCA2IH0sIHsgIDgsIDUgfSwgeyAgNywgNyB9LCB7IC03LCA3IH0sIHsgIDgsIDYgfSwgeyAgOCwgNyB9Cit9OworCitlbnVtIEFscGhhQ29tcHJlc3Npb24geworICAgIEFMUEhBX0NPTVBSRVNTSU9OX05PTkUsCisgICAgQUxQSEFfQ09NUFJFU1NJT05fVlA4TCwKK307CisKK2VudW0gQWxwaGFGaWx0ZXIgeworICAgIEFMUEhBX0ZJTFRFUl9OT05FLAorICAgIEFMUEhBX0ZJTFRFUl9IT1JJWk9OVEFMLAorICAgIEFMUEhBX0ZJTFRFUl9WRVJUSUNBTCwKKyAgICBBTFBIQV9GSUxURVJfR1JBRElFTlQsCit9OworCitlbnVtIFRyYW5zZm9ybVR5cGUgeworICAgIFBSRURJQ1RPUl9UUkFOU0ZPUk0gICAgICA9IDAsCisgICAgQ09MT1JfVFJBTlNGT1JNICAgICAgICAgID0gMSwKKyAgICBTVUJUUkFDVF9HUkVFTiAgICAgICAgICAgPSAyLAorICAgIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STSA9IDMsCit9OworCitlbnVtIFByZWRpY3Rpb25Nb2RlIHsKKyAgICBQUkVEX01PREVfQkxBQ0ssCisgICAgUFJFRF9NT0RFX0wsCisgICAgUFJFRF9NT0RFX1QsCisgICAgUFJFRF9NT0RFX1RSLAorICAgIFBSRURfTU9ERV9UTCwKKyAgICBQUkVEX01PREVfQVZHX1RfQVZHX0xfVFIsCisgICAgUFJFRF9NT0RFX0FWR19MX1RMLAorICAgIFBSRURfTU9ERV9BVkdfTF9ULAorICAgIFBSRURfTU9ERV9BVkdfVExfVCwKKyAgICBQUkVEX01PREVfQVZHX1RfVFIsCisgICAgUFJFRF9NT0RFX0FWR19BVkdfTF9UTF9BVkdfVF9UUiwKKyAgICBQUkVEX01PREVfU0VMRUNULAorICAgIFBSRURfTU9ERV9BRERfU1VCVFJBQ1RfRlVMTCwKKyAgICBQUkVEX01PREVfQUREX1NVQlRSQUNUX0hBTEYsCit9OworCitlbnVtIEh1ZmZtYW5JbmRleCB7CisgICAgSFVGRl9JRFhfR1JFRU4gPSAwLAorICAgIEhVRkZfSURYX1JFRCAgID0gMSwKKyAgICBIVUZGX0lEWF9CTFVFICA9IDIsCisgICAgSFVGRl9JRFhfQUxQSEEgPSAzLAorICAgIEhVRkZfSURYX0RJU1QgID0gNAorfTsKKworLyogVGhlIHN0cnVjdHVyZSBvZiBXZWJQIGxvc3NsZXNzIGlzIGFuIG9wdGlvbmFsIHNlcmllcyBvZiB0cmFuc2Zvcm1hdGlvbiBkYXRhLAorICogZm9sbG93ZWQgYnkgdGhlIHByaW1hcnkgaW1hZ2UuIFRoZSBwcmltYXJ5IGltYWdlIGFsc28gb3B0aW9uYWxseSBjb250YWlucworICogYW4gZW50cm9weSBncm91cCBtYXBwaW5nIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyb3B5IGdyb3Vwcy4gVGhlcmUgaXMgYQorICogYmFzaWMgaW1hZ2UgdHlwZSBjYWxsZWQgYW4gImVudHJvcHkgY29kZWQgaW1hZ2UiIHRoYXQgaXMgdXNlZCBmb3IgYWxsIG9mCisgKiB0aGVzZS4gVGhlIHR5cGUgb2YgZWFjaCBlbnRyb3B5IGNvZGVkIGltYWdlIGlzIHJlZmVycmVkIHRvIGJ5IHRoZQorICogc3BlY2lmaWNhdGlvbiBhcyBpdHMgcm9sZS4gKi8KK2VudW0gSW1hZ2VSb2xlIHsKKyAgICAvKiBQcmltYXJ5IEltYWdlOiBTdG9yZXMgdGhlIGFjdHVhbCBwaXhlbHMgb2YgdGhlIGltYWdlLiAqLworICAgIElNQUdFX1JPTEVfQVJHQiwKKworICAgIC8qIEVudHJvcHkgSW1hZ2U6IERlZmluZXMgd2hpY2ggSHVmZm1hbiBncm91cCB0byB1c2UgZm9yIGRpZmZlcmVudCBhcmVhcyBvZgorICAgICAqICAgICAgICAgICAgICAgIHRoZSBwcmltYXJ5IGltYWdlLiAqLworICAgIElNQUdFX1JPTEVfRU5UUk9QWSwKKworICAgIC8qIFByZWRpY3RvcnM6IERlZmluZXMgd2hpY2ggcHJlZGljdG9yIHR5cGUgdG8gdXNlIGZvciBkaWZmZXJlbnQgYXJlYXMgb2YKKyAgICAgKiAgICAgICAgICAgICB0aGUgcHJpbWFyeSBpbWFnZS4gKi8KKyAgICBJTUFHRV9ST0xFX1BSRURJQ1RPUiwKKworICAgIC8qIENvbG9yIFRyYW5zZm9ybSBEYXRhOiBEZWZpbmVzIHRoZSBjb2xvciB0cmFuc2Zvcm1hdGlvbiBmb3IgZGlmZmVyZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGFyZWFzIG9mIHRoZSBwcmltYXJ5IGltYWdlLiAqLworICAgIElNQUdFX1JPTEVfQ09MT1JfVFJBTlNGT1JNLAorCisgICAgLyogQ29sb3IgSW5kZXg6IFN0b3JlZCBhcyBhbiBpbWFnZSBvZiBoZWlnaHQgPT0gMS4gKi8KKyAgICBJTUFHRV9ST0xFX0NPTE9SX0lOREVYSU5HLAorCisgICAgSU1BR0VfUk9MRV9OQiwKK307CisKK3R5cGVkZWYgc3RydWN0IEh1ZmZSZWFkZXIgeworICAgIFZMQyB2bGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gZGVjb2RlciBjb250ZXh0ICovCisgICAgaW50IHNpbXBsZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hldGhlciB0byB1c2Ugc2ltcGxlIG1vZGUgKi8KKyAgICBpbnQgbmJfc3ltYm9sczsgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZWQgc3ltYm9scyAqLworICAgIHVpbnQxNl90IHNpbXBsZV9zeW1ib2xzWzJdOyAgICAgICAgIC8qIHN5bWJvbHMgZm9yIHNpbXBsZSBtb2RlICovCit9IEh1ZmZSZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IEltYWdlQ29udGV4dCB7CisgICAgZW51bSBJbWFnZVJvbGUgcm9sZTsgICAgICAgICAgICAgICAgLyogcm9sZSBvZiB0aGlzIGltYWdlICovCisgICAgQVZGcmFtZSAqZnJhbWU7ICAgICAgICAgICAgICAgICAgICAgLyogQVZGcmFtZSBmb3IgZGF0YSAqLworICAgIGludCBjb2xvcl9jYWNoZV9iaXRzOyAgICAgICAgICAgICAgIC8qIGNvbG9yIGNhY2hlIHNpemUsIGxvZzIgKi8KKyAgICB1aW50MzJfdCAqY29sb3JfY2FjaGU7ICAgICAgICAgICAgICAvKiBjb2xvciBjYWNoZSBkYXRhICovCisgICAgaW50IG5iX2h1ZmZtYW5fZ3JvdXBzOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGh1ZmZtYW4gZ3JvdXBzICovCisgICAgSHVmZlJlYWRlciAqaHVmZm1hbl9ncm91cHM7ICAgICAgICAgLyogcmVhZGVyIGZvciBlYWNoIGh1ZmZtYW4gZ3JvdXAgKi8KKyAgICBpbnQgc2l6ZV9yZWR1Y3Rpb247ICAgICAgICAgICAgICAgICAvKiByZWxhdGl2ZSBzaXplIGNvbXBhcmVkIHRvIHByaW1hcnkgaW1hZ2UsIGxvZzIgKi8KKyAgICBpbnQgaXNfYWxwaGFfcHJpbWFyeTsKK30gSW1hZ2VDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBXZWJQQ29udGV4dCB7CisgICAgVlA4Q29udGV4dCB2OyAgICAgICAgICAgICAgICAgICAgICAgLyogVlA4IENvbnRleHQgdXNlZCBmb3IgbG9zc3kgZGVjb2RpbmcgKi8KKyAgICBHZXRCaXRDb250ZXh0IGdiOyAgICAgICAgICAgICAgICAgICAvKiBiaXRzdHJlYW0gcmVhZGVyIGZvciBtYWluIGltYWdlIGNodW5rICovCisgICAgQVZGcmFtZSAqYWxwaGFfZnJhbWU7ICAgICAgICAgICAgICAgLyogQVZGcmFtZSBmb3IgYWxwaGEgZGF0YSBkZWNvbXByZXNzZWQgZnJvbSBWUDhMICovCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OyAgICAgICAgICAgICAgLyogcGFyZW50IEFWQ29kZWNDb250ZXh0ICovCisgICAgaW50IGluaXRpYWxpemVkOyAgICAgICAgICAgICAgICAgICAgLyogc2V0IG9uY2UgdGhlIFZQOCBjb250ZXh0IGlzIGluaXRpYWxpemVkICovCisgICAgaW50IGhhc19hbHBoYTsgICAgICAgICAgICAgICAgICAgICAgLyogaGFzIGEgc2VwYXJhdGUgYWxwaGEgY2h1bmsgKi8KKyAgICBlbnVtIEFscGhhQ29tcHJlc3Npb24gYWxwaGFfY29tcHJlc3Npb247IC8qIGNvbXByZXNzaW9uIHR5cGUgZm9yIGFscGhhIGNodW5rICovCisgICAgZW51bSBBbHBoYUZpbHRlciBhbHBoYV9maWx0ZXI7ICAgICAgLyogZmlsdGVyaW5nIG1ldGhvZCBmb3IgYWxwaGEgY2h1bmsgKi8KKyAgICB1aW50OF90ICphbHBoYV9kYXRhOyAgICAgICAgICAgICAgICAvKiBhbHBoYSBjaHVuayBkYXRhICovCisgICAgaW50IGFscGhhX2RhdGFfc2l6ZTsgICAgICAgICAgICAgICAgLyogYWxwaGEgY2h1bmsgZGF0YSBzaXplICovCisgICAgaW50IGhhc19leGlmOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGFmdGVyIGFuIEVYSUYgY2h1bmsgaGFzIGJlZW4gcHJvY2Vzc2VkICovCisgICAgQVZEaWN0aW9uYXJ5ICpleGlmX21ldGFkYXRhOyAgICAgICAgLyogRVhJRiBjaHVuayBkYXRhICovCisgICAgaW50IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1hZ2Ugd2lkdGggKi8KKyAgICBpbnQgaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbWFnZSBoZWlnaHQgKi8KKyAgICBpbnQgbG9zc2xlc3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2F0ZXMgbG9zc2xlc3Mgb3IgbG9zc3kgKi8KKworICAgIGludCBuYl90cmFuc2Zvcm1zOyAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB0cmFuc2Zvcm1zICovCisgICAgZW51bSBUcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybXNbNF07ICAgLyogdHJhbnNmb3JtYXRpb25zIHVzZWQgaW4gdGhlIGltYWdlLCBpbiBvcmRlciAqLworICAgIGludCByZWR1Y2VkX3dpZHRoOyAgICAgICAgICAgICAgICAgIC8qIHJlZHVjZWQgd2lkdGggZm9yIGluZGV4IGltYWdlLCBpZiBhcHBsaWNhYmxlICovCisgICAgaW50IG5iX2h1ZmZtYW5fZ3JvdXBzOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGh1ZmZtYW4gZ3JvdXBzIGluIHRoZSBwcmltYXJ5IGltYWdlICovCisgICAgSW1hZ2VDb250ZXh0IGltYWdlW0lNQUdFX1JPTEVfTkJdOyAgLyogaW1hZ2UgY29udGV4dCBmb3IgZWFjaCByb2xlICovCit9IFdlYlBDb250ZXh0OworCisjZGVmaW5lIEdFVF9QSVhFTChmcmFtZSwgeCwgeSkgXAorICAgICgoZnJhbWUpLT5kYXRhWzBdICsgKHkpICogZnJhbWUtPmxpbmVzaXplWzBdICsgNCAqICh4KSkKKworI2RlZmluZSBHRVRfUElYRUxfQ09NUChmcmFtZSwgeCwgeSwgYykgXAorICAgICgqKChmcmFtZSktPmRhdGFbMF0gKyAoeSkgKiBmcmFtZS0+bGluZXNpemVbMF0gKyA0ICogKHgpICsgYykpCisKK3N0YXRpYyB2b2lkIGltYWdlX2N0eF9mcmVlKEltYWdlQ29udGV4dCAqaW1nKQoreworICAgIGludCBpLCBqOworCisgICAgYXZfZnJlZShpbWctPmNvbG9yX2NhY2hlKTsKKyAgICBpZiAoaW1nLT5yb2xlICE9IElNQUdFX1JPTEVfQVJHQiAmJiAhaW1nLT5pc19hbHBoYV9wcmltYXJ5KQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbWctPmZyYW1lKTsKKyAgICBpZiAoaW1nLT5odWZmbWFuX2dyb3VwcykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW1nLT5uYl9odWZmbWFuX2dyb3VwczsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFOyBqKyspCisgICAgICAgICAgICAgICAgZmZfZnJlZV92bGMoJmltZy0+aHVmZm1hbl9ncm91cHNbaSAqIEhVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERSArIGpdLnZsYyk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZShpbWctPmh1ZmZtYW5fZ3JvdXBzKTsKKyAgICB9CisgICAgbWVtc2V0KGltZywgMCwgc2l6ZW9mKCppbWcpKTsKK30KKworCisvKiBEaWZmZXJzIGZyb20gZ2V0X3ZsYzIoKSBpbiB0aGUgZm9sbG93aW5nIHdheXM6CisgKiAgIC0gY29kZXMgYXJlIGJpdC1yZXZlcnNlZAorICogICAtIGFzc3VtZXMgOC1iaXQgdGFibGUgdG8gbWFrZSByZXZlcnNhbCBzaW1wbGVyCisgKiAgIC0gYXNzdW1lcyBtYXggZGVwdGggb2YgMiBzaW5jZSB0aGUgbWF4IGNvZGUgbGVuZ3RoIGZvciBXZWJQIGlzIDE1CisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB3ZWJwX2dldF92bGMoR2V0Qml0Q29udGV4dCAqZ2IsIFZMQ19UWVBFICgqdGFibGUpWzJdKQoreworICAgIGludCBuLCBuYl9iaXRzOworICAgIHVuc2lnbmVkIGludCBpbmRleDsKKyAgICBpbnQgY29kZTsKKworICAgIE9QRU5fUkVBREVSKHJlLCBnYik7CisgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisKKyAgICBpbmRleCA9IFNIT1dfVUJJVFMocmUsIGdiLCA4KTsKKyAgICBpbmRleCA9IGZmX3JldmVyc2VbaW5kZXhdOworICAgIGNvZGUgID0gdGFibGVbaW5kZXhdWzBdOworICAgIG4gICAgID0gdGFibGVbaW5kZXhdWzFdOworCisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgOCk7CisgICAgICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOworCisgICAgICAgIG5iX2JpdHMgPSAtbjsKKworICAgICAgICBpbmRleCA9IFNIT1dfVUJJVFMocmUsIGdiLCBuYl9iaXRzKTsKKyAgICAgICAgaW5kZXggPSAoZmZfcmV2ZXJzZVtpbmRleF0gPj4gKDggLSBuYl9iaXRzKSkgKyBjb2RlOworICAgICAgICBjb2RlICA9IHRhYmxlW2luZGV4XVswXTsKKyAgICAgICAgbiAgICAgPSB0YWJsZVtpbmRleF1bMV07CisgICAgfQorICAgIFNLSVBfQklUUyhyZSwgZ2IsIG4pOworCisgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CisKKyAgICByZXR1cm4gY29kZTsKK30KKworc3RhdGljIGludCBodWZmX3JlYWRlcl9nZXRfc3ltYm9sKEh1ZmZSZWFkZXIgKnIsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGlmIChyLT5zaW1wbGUpIHsKKyAgICAgICAgaWYgKHItPm5iX3N5bWJvbHMgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiByLT5zaW1wbGVfc3ltYm9sc1swXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHItPnNpbXBsZV9zeW1ib2xzW2dldF9iaXRzMShnYildOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gd2VicF9nZXRfdmxjKGdiLCByLT52bGMudGFibGUpOworfQorCitzdGF0aWMgaW50IGh1ZmZfcmVhZGVyX2J1aWxkX2Nhbm9uaWNhbChIdWZmUmVhZGVyICpyLCBpbnQgKmNvZGVfbGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYWJldF9zaXplKQoreworICAgIGludCBsZW4gPSAwLCBzeW0sIGNvZGUgPSAwLCByZXQ7CisgICAgaW50IG1heF9jb2RlX2xlbmd0aCA9IDA7CisgICAgdWludDE2X3QgKmNvZGVzOworCisgICAgLyogc3BlY2lhbC1jYXNlIDEgc3ltYm9sIHNpbmNlIHRoZSB2bGMgcmVhZGVyIGNhbm5vdCBoYW5kbGUgaXQgKi8KKyAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGFscGhhYmV0X3NpemU7IHN5bSsrKSB7CisgICAgICAgIGlmIChjb2RlX2xlbmd0aHNbc3ltXSA+IDApIHsKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgY29kZSA9IHN5bTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgICByLT5uYl9zeW1ib2xzID0gMTsKKyAgICAgICAgci0+c2ltcGxlX3N5bWJvbHNbMF0gPSBjb2RlOworICAgICAgICByLT5zaW1wbGUgPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGFscGhhYmV0X3NpemU7IHN5bSsrKQorICAgICAgICBtYXhfY29kZV9sZW5ndGggPSBGRk1BWChtYXhfY29kZV9sZW5ndGgsIGNvZGVfbGVuZ3Roc1tzeW1dKTsKKworICAgIGlmIChtYXhfY29kZV9sZW5ndGggPT0gMCB8fCBtYXhfY29kZV9sZW5ndGggPiBNQVhfSFVGRk1BTl9DT0RFX0xFTkdUSCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGNvZGVzID0gYXZfbWFsbG9jX2FycmF5KGFscGhhYmV0X3NpemUsIHNpemVvZigqY29kZXMpKTsKKyAgICBpZiAoIWNvZGVzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY29kZSA9IDA7CisgICAgci0+bmJfc3ltYm9scyA9IDA7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gbWF4X2NvZGVfbGVuZ3RoOyBsZW4rKykgeworICAgICAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGFscGhhYmV0X3NpemU7IHN5bSsrKSB7CisgICAgICAgICAgICBpZiAoY29kZV9sZW5ndGhzW3N5bV0gIT0gbGVuKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY29kZXNbc3ltXSA9IGNvZGUrKzsKKyAgICAgICAgICAgIHItPm5iX3N5bWJvbHMrKzsKKyAgICAgICAgfQorICAgICAgICBjb2RlIDw8PSAxOworICAgIH0KKyAgICBpZiAoIXItPm5iX3N5bWJvbHMpIHsKKyAgICAgICAgYXZfZnJlZShjb2Rlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldCA9IGluaXRfdmxjKCZyLT52bGMsIDgsIGFscGhhYmV0X3NpemUsCisgICAgICAgICAgICAgICAgICAgY29kZV9sZW5ndGhzLCBzaXplb2YoKmNvZGVfbGVuZ3RocyksIHNpemVvZigqY29kZV9sZW5ndGhzKSwKKyAgICAgICAgICAgICAgICAgICBjb2Rlcywgc2l6ZW9mKCpjb2RlcyksIHNpemVvZigqY29kZXMpLCAwKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9mcmVlKGNvZGVzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgci0+c2ltcGxlID0gMDsKKworICAgIGF2X2ZyZWUoY29kZXMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZWFkX2h1ZmZtYW5fY29kZV9zaW1wbGUoV2ViUENvbnRleHQgKnMsIEh1ZmZSZWFkZXIgKmhjKQoreworICAgIGhjLT5uYl9zeW1ib2xzID0gZ2V0X2JpdHMxKCZzLT5nYikgKyAxOworCisgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKQorICAgICAgICBoYy0+c2ltcGxlX3N5bWJvbHNbMF0gPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgIGVsc2UKKyAgICAgICAgaGMtPnNpbXBsZV9zeW1ib2xzWzBdID0gZ2V0X2JpdHMxKCZzLT5nYik7CisKKyAgICBpZiAoaGMtPm5iX3N5bWJvbHMgPT0gMikKKyAgICAgICAgaGMtPnNpbXBsZV9zeW1ib2xzWzFdID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKworICAgIGhjLT5zaW1wbGUgPSAxOworfQorCitzdGF0aWMgaW50IHJlYWRfaHVmZm1hbl9jb2RlX25vcm1hbChXZWJQQ29udGV4dCAqcywgSHVmZlJlYWRlciAqaGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFiZXRfc2l6ZSkKK3sKKyAgICBIdWZmUmVhZGVyIGNvZGVfbGVuX2hjID0geyB7IDAgfSwgMCwgMCwgeyAwIH0gfTsKKyAgICBpbnQgKmNvZGVfbGVuZ3RocyA9IE5VTEw7CisgICAgaW50IGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3Roc1tOVU1fQ09ERV9MRU5HVEhfQ09ERVNdID0geyAwIH07CisgICAgaW50IGksIHN5bWJvbCwgbWF4X3N5bWJvbCwgcHJldl9jb2RlX2xlbiwgcmV0OworICAgIGludCBudW1fY29kZXMgPSA0ICsgZ2V0X2JpdHMoJnMtPmdiLCA0KTsKKworICAgIGlmIChudW1fY29kZXMgPiBOVU1fQ09ERV9MRU5HVEhfQ09ERVMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb2RlczsgaSsrKQorICAgICAgICBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHNbY29kZV9sZW5ndGhfY29kZV9vcmRlcltpXV0gPSBnZXRfYml0cygmcy0+Z2IsIDMpOworCisgICAgcmV0ID0gaHVmZl9yZWFkZXJfYnVpbGRfY2Fub25pY2FsKCZjb2RlX2xlbl9oYywgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fQ09ERV9MRU5HVEhfQ09ERVMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZpbmlzaDsKKworICAgIGNvZGVfbGVuZ3RocyA9IGF2X21hbGxvY3pfYXJyYXkoYWxwaGFiZXRfc2l6ZSwgc2l6ZW9mKCpjb2RlX2xlbmd0aHMpKTsKKyAgICBpZiAoIWNvZGVfbGVuZ3RocykgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICBpbnQgYml0cyAgID0gMiArIDIgKiBnZXRfYml0cygmcy0+Z2IsIDMpOworICAgICAgICBtYXhfc3ltYm9sID0gMiArIGdldF9iaXRzKCZzLT5nYiwgYml0cyk7CisgICAgICAgIGlmIChtYXhfc3ltYm9sID4gYWxwaGFiZXRfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJtYXggc3ltYm9sICVkID4gYWxwaGFiZXQgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBtYXhfc3ltYm9sLCBhbHBoYWJldF9zaXplKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1heF9zeW1ib2wgPSBhbHBoYWJldF9zaXplOworICAgIH0KKworICAgIHByZXZfY29kZV9sZW4gPSA4OworICAgIHN5bWJvbCAgICAgICAgPSAwOworICAgIHdoaWxlIChzeW1ib2wgPCBhbHBoYWJldF9zaXplKSB7CisgICAgICAgIGludCBjb2RlX2xlbjsKKworICAgICAgICBpZiAoIW1heF9zeW1ib2wtLSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjb2RlX2xlbiA9IGh1ZmZfcmVhZGVyX2dldF9zeW1ib2woJmNvZGVfbGVuX2hjLCAmcy0+Z2IpOworICAgICAgICBpZiAoY29kZV9sZW4gPCAxNikgeworICAgICAgICAgICAgLyogQ29kZSBsZW5ndGggY29kZSBbMC4uMTVdIGluZGljYXRlcyBsaXRlcmFsIGNvZGUgbGVuZ3Rocy4gKi8KKyAgICAgICAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2wrK10gPSBjb2RlX2xlbjsKKyAgICAgICAgICAgIGlmIChjb2RlX2xlbikKKyAgICAgICAgICAgICAgICBwcmV2X2NvZGVfbGVuID0gY29kZV9sZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcmVwZWF0ID0gMCwgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAoY29kZV9sZW4pIHsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgLyogQ29kZSAxNiByZXBlYXRzIHRoZSBwcmV2aW91cyBub24temVybyB2YWx1ZSBbMy4uNl0gdGltZXMsCisgICAgICAgICAgICAgICAgICogaS5lLiwgMyArIFJlYWRCaXRzKDIpIHRpbWVzLiBJZiBjb2RlIDE2IGlzIHVzZWQgYmVmb3JlIGEKKyAgICAgICAgICAgICAgICAgKiBub24temVybyB2YWx1ZSBoYXMgYmVlbiBlbWl0dGVkLCBhIHZhbHVlIG9mIDggaXMgcmVwZWF0ZWQuICovCisgICAgICAgICAgICAgICAgcmVwZWF0ID0gMyArIGdldF9iaXRzKCZzLT5nYiwgMik7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gcHJldl9jb2RlX2xlbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgLyogQ29kZSAxNyBlbWl0cyBhIHN0cmVhayBvZiB6ZXJvcyBbMy4uMTBdLCBpLmUuLAorICAgICAgICAgICAgICAgICAqIDMgKyBSZWFkQml0cygzKSB0aW1lcy4gKi8KKyAgICAgICAgICAgICAgICByZXBlYXQgPSAzICsgZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgLyogQ29kZSAxOCBlbWl0cyBhIHN0cmVhayBvZiB6ZXJvcyBvZiBsZW5ndGggWzExLi4xMzhdLCBpLmUuLAorICAgICAgICAgICAgICAgICAqIDExICsgUmVhZEJpdHMoNykgdGltZXMuICovCisgICAgICAgICAgICAgICAgcmVwZWF0ID0gMTEgKyBnZXRfYml0cygmcy0+Z2IsIDcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN5bWJvbCArIHJlcGVhdCA+IGFscGhhYmV0X3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgc3ltYm9sICVkICsgcmVwZWF0ICVkID4gYWxwaGFiZXQgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sLCByZXBlYXQsIGFscGhhYmV0X3NpemUpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocmVwZWF0LS0gPiAwKQorICAgICAgICAgICAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2wrK10gPSBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBodWZmX3JlYWRlcl9idWlsZF9jYW5vbmljYWwoaGMsIGNvZGVfbGVuZ3RocywgYWxwaGFiZXRfc2l6ZSk7CisKK2ZpbmlzaDoKKyAgICBmZl9mcmVlX3ZsYygmY29kZV9sZW5faGMudmxjKTsKKyAgICBhdl9mcmVlKGNvZGVfbGVuZ3Rocyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZW50cm9weV9jb2RlZF9pbWFnZShXZWJQQ29udGV4dCAqcywgZW51bSBJbWFnZVJvbGUgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKTsKKworI2RlZmluZSBQQVJTRV9CTE9DS19TSVpFKHcsIGgpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBibG9ja19iaXRzID0gZ2V0X2JpdHMoJnMtPmdiLCAzKSArIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmxvY2tzX3cgICA9IEZGQUxJR04oKHcpLCAxIDw8IGJsb2NrX2JpdHMpID4+IGJsb2NrX2JpdHM7ICAgICAgICAgICAgICAgXAorICAgIGJsb2Nrc19oICAgPSBGRkFMSUdOKChoKSwgMSA8PCBibG9ja19iaXRzKSA+PiBibG9ja19iaXRzOyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgZGVjb2RlX2VudHJvcHlfaW1hZ2UoV2ViUENvbnRleHQgKnMpCit7CisgICAgSW1hZ2VDb250ZXh0ICppbWc7CisgICAgaW50IHJldCwgYmxvY2tfYml0cywgd2lkdGgsIGJsb2Nrc193LCBibG9ja3NfaCwgeCwgeSwgbWF4OworCisgICAgd2lkdGggPSBzLT53aWR0aDsKKyAgICBpZiAocy0+cmVkdWNlZF93aWR0aCA+IDApCisgICAgICAgIHdpZHRoID0gcy0+cmVkdWNlZF93aWR0aDsKKworICAgIFBBUlNFX0JMT0NLX1NJWkUod2lkdGgsIHMtPmhlaWdodCk7CisKKyAgICByZXQgPSBkZWNvZGVfZW50cm9weV9jb2RlZF9pbWFnZShzLCBJTUFHRV9ST0xFX0VOVFJPUFksIGJsb2Nrc193LCBibG9ja3NfaCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpbWcgPSAmcy0+aW1hZ2VbSU1BR0VfUk9MRV9FTlRST1BZXTsKKyAgICBpbWctPnNpemVfcmVkdWN0aW9uID0gYmxvY2tfYml0czsKKworICAgIC8qIHRoZSBudW1iZXIgb2YgaHVmZm1hbiBncm91cHMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbWF4aW11bSBncm91cCBudW1iZXIKKyAgICAgKiBjb2RlZCBpbiB0aGUgZW50cm9weSBpbWFnZSAqLworICAgIG1heCA9IDA7CisgICAgZm9yICh5ID0gMDsgeSA8IGltZy0+ZnJhbWUtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpbWctPmZyYW1lLT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgcDAgPSBHRVRfUElYRUxfQ09NUChpbWctPmZyYW1lLCB4LCB5LCAxKTsKKyAgICAgICAgICAgIGludCBwMSA9IEdFVF9QSVhFTF9DT01QKGltZy0+ZnJhbWUsIHgsIHksIDIpOworICAgICAgICAgICAgaW50IHAgID0gcDAgPDwgOCB8IHAxOworICAgICAgICAgICAgbWF4ID0gRkZNQVgobWF4LCBwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5uYl9odWZmbWFuX2dyb3VwcyA9IG1heCArIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV90cmFuc2Zvcm1fcHJlZGljdG9yKFdlYlBDb250ZXh0ICpzKQoreworICAgIGludCBibG9ja19iaXRzLCBibG9ja3NfdywgYmxvY2tzX2gsIHJldDsKKworICAgIFBBUlNFX0JMT0NLX1NJWkUocy0+d2lkdGgsIHMtPmhlaWdodCk7CisKKyAgICByZXQgPSBkZWNvZGVfZW50cm9weV9jb2RlZF9pbWFnZShzLCBJTUFHRV9ST0xFX1BSRURJQ1RPUiwgYmxvY2tzX3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzX2gpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcy0+aW1hZ2VbSU1BR0VfUk9MRV9QUkVESUNUT1JdLnNpemVfcmVkdWN0aW9uID0gYmxvY2tfYml0czsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3RyYW5zZm9ybV9jb2xvcihXZWJQQ29udGV4dCAqcykKK3sKKyAgICBpbnQgYmxvY2tfYml0cywgYmxvY2tzX3csIGJsb2Nrc19oLCByZXQ7CisKKyAgICBQQVJTRV9CTE9DS19TSVpFKHMtPndpZHRoLCBzLT5oZWlnaHQpOworCisgICAgcmV0ID0gZGVjb2RlX2VudHJvcHlfY29kZWRfaW1hZ2UocywgSU1BR0VfUk9MRV9DT0xPUl9UUkFOU0ZPUk0sIGJsb2Nrc193LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc19oKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHMtPmltYWdlW0lNQUdFX1JPTEVfQ09MT1JfVFJBTlNGT1JNXS5zaXplX3JlZHVjdGlvbiA9IGJsb2NrX2JpdHM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV90cmFuc2Zvcm1fY29sb3JfaW5kZXhpbmcoV2ViUENvbnRleHQgKnMpCit7CisgICAgSW1hZ2VDb250ZXh0ICppbWc7CisgICAgaW50IHdpZHRoX2JpdHMsIGluZGV4X3NpemUsIHJldCwgeDsKKyAgICB1aW50OF90ICpjdDsKKworICAgIGluZGV4X3NpemUgPSBnZXRfYml0cygmcy0+Z2IsIDgpICsgMTsKKworICAgIGlmIChpbmRleF9zaXplIDw9IDIpCisgICAgICAgIHdpZHRoX2JpdHMgPSAzOworICAgIGVsc2UgaWYgKGluZGV4X3NpemUgPD0gNCkKKyAgICAgICAgd2lkdGhfYml0cyA9IDI7CisgICAgZWxzZSBpZiAoaW5kZXhfc2l6ZSA8PSAxNikKKyAgICAgICAgd2lkdGhfYml0cyA9IDE7CisgICAgZWxzZQorICAgICAgICB3aWR0aF9iaXRzID0gMDsKKworICAgIHJldCA9IGRlY29kZV9lbnRyb3B5X2NvZGVkX2ltYWdlKHMsIElNQUdFX1JPTEVfQ09MT1JfSU5ERVhJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhfc2l6ZSwgMSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpbWcgPSAmcy0+aW1hZ2VbSU1BR0VfUk9MRV9DT0xPUl9JTkRFWElOR107CisgICAgaW1nLT5zaXplX3JlZHVjdGlvbiA9IHdpZHRoX2JpdHM7CisgICAgaWYgKHdpZHRoX2JpdHMgPiAwKQorICAgICAgICBzLT5yZWR1Y2VkX3dpZHRoID0gKHMtPndpZHRoICsgKCgxIDw8IHdpZHRoX2JpdHMpIC0gMSkpID4+IHdpZHRoX2JpdHM7CisKKyAgICAvKiBjb2xvciBpbmRleCB2YWx1ZXMgYXJlIGRlbHRhLWNvZGVkICovCisgICAgY3QgID0gaW1nLT5mcmFtZS0+ZGF0YVswXSArIDQ7CisgICAgZm9yICh4ID0gNDsgeCA8IGltZy0+ZnJhbWUtPndpZHRoICogNDsgeCsrLCBjdCsrKQorICAgICAgICBjdFswXSArPSBjdFstNF07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEh1ZmZSZWFkZXIgKmdldF9odWZmbWFuX2dyb3VwKFdlYlBDb250ZXh0ICpzLCBJbWFnZUNvbnRleHQgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpCit7CisgICAgSW1hZ2VDb250ZXh0ICpnaW1nID0gJnMtPmltYWdlW0lNQUdFX1JPTEVfRU5UUk9QWV07CisgICAgaW50IGdyb3VwID0gMDsKKworICAgIGlmIChnaW1nLT5zaXplX3JlZHVjdGlvbiA+IDApIHsKKyAgICAgICAgaW50IGdyb3VwX3ggPSB4ID4+IGdpbWctPnNpemVfcmVkdWN0aW9uOworICAgICAgICBpbnQgZ3JvdXBfeSA9IHkgPj4gZ2ltZy0+c2l6ZV9yZWR1Y3Rpb247CisgICAgICAgIGludCBnMCAgICAgID0gR0VUX1BJWEVMX0NPTVAoZ2ltZy0+ZnJhbWUsIGdyb3VwX3gsIGdyb3VwX3ksIDEpOworICAgICAgICBpbnQgZzEgICAgICA9IEdFVF9QSVhFTF9DT01QKGdpbWctPmZyYW1lLCBncm91cF94LCBncm91cF95LCAyKTsKKyAgICAgICAgZ3JvdXAgICAgICAgPSBnMCA8PCA4IHwgZzE7CisgICAgfQorCisgICAgcmV0dXJuICZpbWctPmh1ZmZtYW5fZ3JvdXBzW2dyb3VwICogSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFXTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBjb2xvcl9jYWNoZV9wdXQoSW1hZ2VDb250ZXh0ICppbWcsIHVpbnQzMl90IGMpCit7CisgICAgdWludDMyX3QgY2FjaGVfaWR4ID0gKDB4MUUzNUE3QkQgKiBjKSA+PiAoMzIgLSBpbWctPmNvbG9yX2NhY2hlX2JpdHMpOworICAgIGltZy0+Y29sb3JfY2FjaGVbY2FjaGVfaWR4XSA9IGM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2VudHJvcHlfY29kZWRfaW1hZ2UoV2ViUENvbnRleHQgKnMsIGVudW0gSW1hZ2VSb2xlIHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICBJbWFnZUNvbnRleHQgKmltZzsKKyAgICBIdWZmUmVhZGVyICpoZzsKKyAgICBpbnQgaSwgaiwgcmV0LCB4LCB5LCB3aWR0aDsKKworICAgIGltZyAgICAgICA9ICZzLT5pbWFnZVtyb2xlXTsKKyAgICBpbWctPnJvbGUgPSByb2xlOworCisgICAgaWYgKCFpbWctPmZyYW1lKSB7CisgICAgICAgIGltZy0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICBpZiAoIWltZy0+ZnJhbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGltZy0+ZnJhbWUtPmZvcm1hdCA9IEFWX1BJWF9GTVRfQVJHQjsKKyAgICBpbWctPmZyYW1lLT53aWR0aCAgPSB3OworICAgIGltZy0+ZnJhbWUtPmhlaWdodCA9IGg7CisKKyAgICBpZiAocm9sZSA9PSBJTUFHRV9ST0xFX0FSR0IgJiYgIWltZy0+aXNfYWxwaGFfcHJpbWFyeSkgeworICAgICAgICBUaHJlYWRGcmFtZSBwdCA9IHsgLmYgPSBpbWctPmZyYW1lIH07CisgICAgICAgIHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKHMtPmF2Y3R4LCAmcHQsIDApOworICAgIH0gZWxzZQorICAgICAgICByZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKGltZy0+ZnJhbWUsIDEpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgIGltZy0+Y29sb3JfY2FjaGVfYml0cyA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisgICAgICAgIGlmIChpbWctPmNvbG9yX2NhY2hlX2JpdHMgPCAxIHx8IGltZy0+Y29sb3JfY2FjaGVfYml0cyA+IDExKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgY29sb3IgY2FjaGUgYml0czogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgaW1nLT5jb2xvcl9jYWNoZV9iaXRzKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGltZy0+Y29sb3JfY2FjaGUgPSBhdl9tYWxsb2N6X2FycmF5KDEgPDwgaW1nLT5jb2xvcl9jYWNoZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmltZy0+Y29sb3JfY2FjaGUpKTsKKyAgICAgICAgaWYgKCFpbWctPmNvbG9yX2NhY2hlKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbWctPmNvbG9yX2NhY2hlX2JpdHMgPSAwOworICAgIH0KKworICAgIGltZy0+bmJfaHVmZm1hbl9ncm91cHMgPSAxOworICAgIGlmIChyb2xlID09IElNQUdFX1JPTEVfQVJHQiAmJiBnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICByZXQgPSBkZWNvZGVfZW50cm9weV9pbWFnZShzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpbWctPm5iX2h1ZmZtYW5fZ3JvdXBzID0gcy0+bmJfaHVmZm1hbl9ncm91cHM7CisgICAgfQorICAgIGltZy0+aHVmZm1hbl9ncm91cHMgPSBhdl9tYWxsb2N6X2FycmF5KGltZy0+bmJfaHVmZm1hbl9ncm91cHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmltZy0+aHVmZm1hbl9ncm91cHMpKTsKKyAgICBpZiAoIWltZy0+aHVmZm1hbl9ncm91cHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW1nLT5uYl9odWZmbWFuX2dyb3VwczsgaSsrKSB7CisgICAgICAgIGhnID0gJmltZy0+aHVmZm1hbl9ncm91cHNbaSAqIEhVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREU7IGorKykgeworICAgICAgICAgICAgaW50IGFscGhhYmV0X3NpemUgPSBhbHBoYWJldF9zaXplc1tqXTsKKyAgICAgICAgICAgIGlmICghaiAmJiBpbWctPmNvbG9yX2NhY2hlX2JpdHMgPiAwKQorICAgICAgICAgICAgICAgIGFscGhhYmV0X3NpemUgKz0gMSA8PCBpbWctPmNvbG9yX2NhY2hlX2JpdHM7CisKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgIHJlYWRfaHVmZm1hbl9jb2RlX3NpbXBsZShzLCAmaGdbal0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSByZWFkX2h1ZmZtYW5fY29kZV9ub3JtYWwocywgJmhnW2pdLCBhbHBoYWJldF9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdpZHRoID0gaW1nLT5mcmFtZS0+d2lkdGg7CisgICAgaWYgKHJvbGUgPT0gSU1BR0VfUk9MRV9BUkdCICYmIHMtPnJlZHVjZWRfd2lkdGggPiAwKQorICAgICAgICB3aWR0aCA9IHMtPnJlZHVjZWRfd2lkdGg7CisKKyAgICB4ID0gMDsgeSA9IDA7CisgICAgd2hpbGUgKHkgPCBpbWctPmZyYW1lLT5oZWlnaHQpIHsKKyAgICAgICAgaW50IHY7CisKKyAgICAgICAgaGcgPSBnZXRfaHVmZm1hbl9ncm91cChzLCBpbWcsIHgsIHkpOworICAgICAgICB2ID0gaHVmZl9yZWFkZXJfZ2V0X3N5bWJvbCgmaGdbSFVGRl9JRFhfR1JFRU5dLCAmcy0+Z2IpOworICAgICAgICBpZiAodiA8IE5VTV9MSVRFUkFMX0NPREVTKSB7CisgICAgICAgICAgICAvKiBsaXRlcmFsIHBpeGVsIHZhbHVlcyAqLworICAgICAgICAgICAgdWludDhfdCAqcCA9IEdFVF9QSVhFTChpbWctPmZyYW1lLCB4LCB5KTsKKyAgICAgICAgICAgIHBbMl0gPSB2OworICAgICAgICAgICAgcFsxXSA9IGh1ZmZfcmVhZGVyX2dldF9zeW1ib2woJmhnW0hVRkZfSURYX1JFRF0sICAgJnMtPmdiKTsKKyAgICAgICAgICAgIHBbM10gPSBodWZmX3JlYWRlcl9nZXRfc3ltYm9sKCZoZ1tIVUZGX0lEWF9CTFVFXSwgICZzLT5nYik7CisgICAgICAgICAgICBwWzBdID0gaHVmZl9yZWFkZXJfZ2V0X3N5bWJvbCgmaGdbSFVGRl9JRFhfQUxQSEFdLCAmcy0+Z2IpOworICAgICAgICAgICAgaWYgKGltZy0+Y29sb3JfY2FjaGVfYml0cykKKyAgICAgICAgICAgICAgICBjb2xvcl9jYWNoZV9wdXQoaW1nLCBBVl9SQjMyKHApKTsKKyAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgIGlmICh4ID09IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHYgPCBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMpIHsKKyAgICAgICAgICAgIC8qIExaNzcgYmFja3dhcmRzIG1hcHBpbmcgKi8KKyAgICAgICAgICAgIGludCBwcmVmaXhfY29kZSwgbGVuZ3RoLCBkaXN0YW5jZSwgcmVmX3gsIHJlZl95OworCisgICAgICAgICAgICAvKiBwYXJzZSBsZW5ndGggYW5kIGRpc3RhbmNlICovCisgICAgICAgICAgICBwcmVmaXhfY29kZSA9IHYgLSBOVU1fTElURVJBTF9DT0RFUzsKKyAgICAgICAgICAgIGlmIChwcmVmaXhfY29kZSA8IDQpIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBwcmVmaXhfY29kZSArIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBleHRyYV9iaXRzID0gKHByZWZpeF9jb2RlIC0gMikgPj4gMTsKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ICAgICA9IDIgKyAocHJlZml4X2NvZGUgJiAxKSA8PCBleHRyYV9iaXRzOworICAgICAgICAgICAgICAgIGxlbmd0aCA9IG9mZnNldCArIGdldF9iaXRzKCZzLT5nYiwgZXh0cmFfYml0cykgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJlZml4X2NvZGUgPSBodWZmX3JlYWRlcl9nZXRfc3ltYm9sKCZoZ1tIVUZGX0lEWF9ESVNUXSwgJnMtPmdiKTsKKyAgICAgICAgICAgIGlmIChwcmVmaXhfY29kZSA8IDQpIHsKKyAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IHByZWZpeF9jb2RlICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGV4dHJhX2JpdHMgPSBwcmVmaXhfY29kZSAtIDIgPj4gMTsKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ICAgICA9IDIgKyAocHJlZml4X2NvZGUgJiAxKSA8PCBleHRyYV9iaXRzOworICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gb2Zmc2V0ICsgZ2V0X2JpdHMoJnMtPmdiLCBleHRyYV9iaXRzKSArIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGZpbmQgcmVmZXJlbmNlIGxvY2F0aW9uICovCisgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gTlVNX1NIT1JUX0RJU1RBTkNFUykgeworICAgICAgICAgICAgICAgIGludCB4aSA9IGx6NzdfZGlzdGFuY2Vfb2Zmc2V0c1tkaXN0YW5jZSAtIDFdWzBdOworICAgICAgICAgICAgICAgIGludCB5aSA9IGx6NzdfZGlzdGFuY2Vfb2Zmc2V0c1tkaXN0YW5jZSAtIDFdWzFdOworICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gRkZNQVgoMSwgeGkgKyB5aSAqIHdpZHRoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGlzdGFuY2UgLT0gTlVNX1NIT1JUX0RJU1RBTkNFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZl94ID0geDsKKyAgICAgICAgICAgIHJlZl95ID0geTsKKyAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8PSB4KSB7CisgICAgICAgICAgICAgICAgcmVmX3ggLT0gZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWZfeCA9IDA7CisgICAgICAgICAgICAgICAgZGlzdGFuY2UgLT0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChkaXN0YW5jZSA+PSB3aWR0aCkgeworICAgICAgICAgICAgICAgIHJlZl95LS07CisgICAgICAgICAgICAgICAgZGlzdGFuY2UgLT0gd2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVmX3ggPSB3aWR0aCAtIGRpc3RhbmNlOworICAgICAgICAgICAgICAgIHJlZl95LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWZfeCA9IEZGTUFYKDAsIHJlZl94KTsKKyAgICAgICAgICAgIHJlZl95ID0gRkZNQVgoMCwgcmVmX3kpOworCisgICAgICAgICAgICAvKiBjb3B5IHBpeGVscworICAgICAgICAgICAgICogc291cmNlIGFuZCBkZXN0IHJlZ2lvbnMgY2FuIG92ZXJsYXAgYW5kIHdyYXAgbGluZXMsIHNvIGp1c3QKKyAgICAgICAgICAgICAqIGNvcHkgcGVyLXBpeGVsICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpwX3JlZiA9IEdFVF9QSVhFTChpbWctPmZyYW1lLCByZWZfeCwgcmVmX3kpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnAgICAgID0gR0VUX1BJWEVMKGltZy0+ZnJhbWUsICAgICB4LCAgICAgeSk7CisKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIocCwgcF9yZWYpOworICAgICAgICAgICAgICAgIGlmIChpbWctPmNvbG9yX2NhY2hlX2JpdHMpCisgICAgICAgICAgICAgICAgICAgIGNvbG9yX2NhY2hlX3B1dChpbWcsIEFWX1JCMzIocCkpOworICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgICAgICByZWZfeCsrOworICAgICAgICAgICAgICAgIGlmICh4ID09IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgICAgICB5Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZWZfeCA9PSB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICByZWZfeCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJlZl95Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh5ID09IGltZy0+ZnJhbWUtPmhlaWdodCB8fCByZWZfeSA9PSBpbWctPmZyYW1lLT5oZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogcmVhZCBmcm9tIGNvbG9yIGNhY2hlICovCisgICAgICAgICAgICB1aW50OF90ICpwID0gR0VUX1BJWEVMKGltZy0+ZnJhbWUsIHgsIHkpOworICAgICAgICAgICAgaW50IGNhY2hlX2lkeCA9IHYgLSAoTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTKTsKKworICAgICAgICAgICAgaWYgKCFpbWctPmNvbG9yX2NhY2hlX2JpdHMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNvbG9yIGNhY2hlIG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FjaGVfaWR4ID49IDEgPDwgaW1nLT5jb2xvcl9jYWNoZV9iaXRzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciBjYWNoZSBpbmRleCBvdXQtb2YtYm91bmRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFWX1dCMzIocCwgaW1nLT5jb2xvcl9jYWNoZVtjYWNoZV9pZHhdKTsKKyAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgIGlmICh4ID09IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFBSRURfTU9ERV9CTEFDSyAqLworc3RhdGljIHZvaWQgaW52X3ByZWRpY3RfMCh1aW50OF90ICpwLCBjb25zdCB1aW50OF90ICpwX2wsIGNvbnN0IHVpbnQ4X3QgKnBfdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBfdCwgY29uc3QgdWludDhfdCAqcF90cikKK3sKKyAgICBBVl9XQjMyKHAsIDB4RkYwMDAwMDApOworfQorCisvKiBQUkVEX01PREVfTCAqLworc3RhdGljIHZvaWQgaW52X3ByZWRpY3RfMSh1aW50OF90ICpwLCBjb25zdCB1aW50OF90ICpwX2wsIGNvbnN0IHVpbnQ4X3QgKnBfdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBfdCwgY29uc3QgdWludDhfdCAqcF90cikKK3sKKyAgICBBVl9DT1BZMzIocCwgcF9sKTsKK30KKworLyogUFJFRF9NT0RFX1QgKi8KK3N0YXRpYyB2b2lkIGludl9wcmVkaWN0XzIodWludDhfdCAqcCwgY29uc3QgdWludDhfdCAqcF9sLCBjb25zdCB1aW50OF90ICpwX3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwX3QsIGNvbnN0IHVpbnQ4X3QgKnBfdHIpCit7CisgICAgQVZfQ09QWTMyKHAsIHBfdCk7Cit9CisKKy8qIFBSRURfTU9ERV9UUiAqLworc3RhdGljIHZvaWQgaW52X3ByZWRpY3RfMyh1aW50OF90ICpwLCBjb25zdCB1aW50OF90ICpwX2wsIGNvbnN0IHVpbnQ4X3QgKnBfdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBfdCwgY29uc3QgdWludDhfdCAqcF90cikKK3sKKyAgICBBVl9DT1BZMzIocCwgcF90cik7Cit9CisKKy8qIFBSRURfTU9ERV9UTCAqLworc3RhdGljIHZvaWQgaW52X3ByZWRpY3RfNCh1aW50OF90ICpwLCBjb25zdCB1aW50OF90ICpwX2wsIGNvbnN0IHVpbnQ4X3QgKnBfdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBfdCwgY29uc3QgdWludDhfdCAqcF90cikKK3sKKyAgICBBVl9DT1BZMzIocCwgcF90bCk7Cit9CisKKy8qIFBSRURfTU9ERV9BVkdfVF9BVkdfTF9UUiAqLworc3RhdGljIHZvaWQgaW52X3ByZWRpY3RfNSh1aW50OF90ICpwLCBjb25zdCB1aW50OF90ICpwX2wsIGNvbnN0IHVpbnQ4X3QgKnBfdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBfdCwgY29uc3QgdWludDhfdCAqcF90cikKK3sKKyAgICBwWzBdID0gcF90WzBdICsgKHBfbFswXSArIHBfdHJbMF0gPj4gMSkgPj4gMTsKKyAgICBwWzFdID0gcF90WzFdICsgKHBfbFsxXSArIHBfdHJbMV0gPj4gMSkgPj4gMTsKKyAgICBwWzJdID0gcF90WzJdICsgKHBfbFsyXSArIHBfdHJbMl0gPj4gMSkgPj4gMTsKKyAgICBwWzNdID0gcF90WzNdICsgKHBfbFszXSArIHBfdHJbM10gPj4gMSkgPj4gMTsKK30KKworLyogUFJFRF9NT0RFX0FWR19MX1RMICovCitzdGF0aWMgdm9pZCBpbnZfcHJlZGljdF82KHVpbnQ4X3QgKnAsIGNvbnN0IHVpbnQ4X3QgKnBfbCwgY29uc3QgdWludDhfdCAqcF90bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcF90LCBjb25zdCB1aW50OF90ICpwX3RyKQoreworICAgIHBbMF0gPSBwX2xbMF0gKyBwX3RsWzBdID4+IDE7CisgICAgcFsxXSA9IHBfbFsxXSArIHBfdGxbMV0gPj4gMTsKKyAgICBwWzJdID0gcF9sWzJdICsgcF90bFsyXSA+PiAxOworICAgIHBbM10gPSBwX2xbM10gKyBwX3RsWzNdID4+IDE7Cit9CisKKy8qIFBSRURfTU9ERV9BVkdfTF9UICovCitzdGF0aWMgdm9pZCBpbnZfcHJlZGljdF83KHVpbnQ4X3QgKnAsIGNvbnN0IHVpbnQ4X3QgKnBfbCwgY29uc3QgdWludDhfdCAqcF90bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcF90LCBjb25zdCB1aW50OF90ICpwX3RyKQoreworICAgIHBbMF0gPSBwX2xbMF0gKyBwX3RbMF0gPj4gMTsKKyAgICBwWzFdID0gcF9sWzFdICsgcF90WzFdID4+IDE7CisgICAgcFsyXSA9IHBfbFsyXSArIHBfdFsyXSA+PiAxOworICAgIHBbM10gPSBwX2xbM10gKyBwX3RbM10gPj4gMTsKK30KKworLyogUFJFRF9NT0RFX0FWR19UTF9UICovCitzdGF0aWMgdm9pZCBpbnZfcHJlZGljdF84KHVpbnQ4X3QgKnAsIGNvbnN0IHVpbnQ4X3QgKnBfbCwgY29uc3QgdWludDhfdCAqcF90bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcF90LCBjb25zdCB1aW50OF90ICpwX3RyKQoreworICAgIHBbMF0gPSBwX3RsWzBdICsgcF90WzBdID4+IDE7CisgICAgcFsxXSA9IHBfdGxbMV0gKyBwX3RbMV0gPj4gMTsKKyAgICBwWzJdID0gcF90bFsyXSArIHBfdFsyXSA+PiAxOworICAgIHBbM10gPSBwX3RsWzNdICsgcF90WzNdID4+IDE7Cit9CisKKy8qIFBSRURfTU9ERV9BVkdfVF9UUiAqLworc3RhdGljIHZvaWQgaW52X3ByZWRpY3RfOSh1aW50OF90ICpwLCBjb25zdCB1aW50OF90ICpwX2wsIGNvbnN0IHVpbnQ4X3QgKnBfdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBfdCwgY29uc3QgdWludDhfdCAqcF90cikKK3sKKyAgICBwWzBdID0gcF90WzBdICsgcF90clswXSA+PiAxOworICAgIHBbMV0gPSBwX3RbMV0gKyBwX3RyWzFdID4+IDE7CisgICAgcFsyXSA9IHBfdFsyXSArIHBfdHJbMl0gPj4gMTsKKyAgICBwWzNdID0gcF90WzNdICsgcF90clszXSA+PiAxOworfQorCisvKiBQUkVEX01PREVfQVZHX0FWR19MX1RMX0FWR19UX1RSICovCitzdGF0aWMgdm9pZCBpbnZfcHJlZGljdF8xMCh1aW50OF90ICpwLCBjb25zdCB1aW50OF90ICpwX2wsIGNvbnN0IHVpbnQ4X3QgKnBfdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwX3QsIGNvbnN0IHVpbnQ4X3QgKnBfdHIpCit7CisgICAgcFswXSA9IChwX2xbMF0gKyBwX3RsWzBdID4+IDEpICsgKHBfdFswXSArIHBfdHJbMF0gPj4gMSkgPj4gMTsKKyAgICBwWzFdID0gKHBfbFsxXSArIHBfdGxbMV0gPj4gMSkgKyAocF90WzFdICsgcF90clsxXSA+PiAxKSA+PiAxOworICAgIHBbMl0gPSAocF9sWzJdICsgcF90bFsyXSA+PiAxKSArIChwX3RbMl0gKyBwX3RyWzJdID4+IDEpID4+IDE7CisgICAgcFszXSA9IChwX2xbM10gKyBwX3RsWzNdID4+IDEpICsgKHBfdFszXSArIHBfdHJbM10gPj4gMSkgPj4gMTsKK30KKworLyogUFJFRF9NT0RFX1NFTEVDVCAqLworc3RhdGljIHZvaWQgaW52X3ByZWRpY3RfMTEodWludDhfdCAqcCwgY29uc3QgdWludDhfdCAqcF9sLCBjb25zdCB1aW50OF90ICpwX3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcF90LCBjb25zdCB1aW50OF90ICpwX3RyKQoreworICAgIGludCBkaWZmID0gKEZGQUJTKHBfbFswXSAtIHBfdGxbMF0pIC0gRkZBQlMocF90WzBdIC0gcF90bFswXSkpICsKKyAgICAgICAgICAgICAgIChGRkFCUyhwX2xbMV0gLSBwX3RsWzFdKSAtIEZGQUJTKHBfdFsxXSAtIHBfdGxbMV0pKSArCisgICAgICAgICAgICAgICAoRkZBQlMocF9sWzJdIC0gcF90bFsyXSkgLSBGRkFCUyhwX3RbMl0gLSBwX3RsWzJdKSkgKworICAgICAgICAgICAgICAgKEZGQUJTKHBfbFszXSAtIHBfdGxbM10pIC0gRkZBQlMocF90WzNdIC0gcF90bFszXSkpOworICAgIGlmIChkaWZmIDw9IDApCisgICAgICAgIEFWX0NPUFkzMihwLCBwX3QpOworICAgIGVsc2UKKyAgICAgICAgQVZfQ09QWTMyKHAsIHBfbCk7Cit9CisKKy8qIFBSRURfTU9ERV9BRERfU1VCVFJBQ1RfRlVMTCAqLworc3RhdGljIHZvaWQgaW52X3ByZWRpY3RfMTIodWludDhfdCAqcCwgY29uc3QgdWludDhfdCAqcF9sLCBjb25zdCB1aW50OF90ICpwX3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcF90LCBjb25zdCB1aW50OF90ICpwX3RyKQoreworICAgIHBbMF0gPSBhdl9jbGlwX3VpbnQ4KHBfbFswXSArIHBfdFswXSAtIHBfdGxbMF0pOworICAgIHBbMV0gPSBhdl9jbGlwX3VpbnQ4KHBfbFsxXSArIHBfdFsxXSAtIHBfdGxbMV0pOworICAgIHBbMl0gPSBhdl9jbGlwX3VpbnQ4KHBfbFsyXSArIHBfdFsyXSAtIHBfdGxbMl0pOworICAgIHBbM10gPSBhdl9jbGlwX3VpbnQ4KHBfbFszXSArIHBfdFszXSAtIHBfdGxbM10pOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50OF90IGNsYW1wX2FkZF9zdWJ0cmFjdF9oYWxmKGludCBhLCBpbnQgYiwgaW50IGMpCit7CisgICAgaW50IGQgPSBhICsgYiA+PiAxOworICAgIHJldHVybiBhdl9jbGlwX3VpbnQ4KGQgKyAoZCAtIGMpIC8gMik7Cit9CisKKy8qIFBSRURfTU9ERV9BRERfU1VCVFJBQ1RfSEFMRiAqLworc3RhdGljIHZvaWQgaW52X3ByZWRpY3RfMTModWludDhfdCAqcCwgY29uc3QgdWludDhfdCAqcF9sLCBjb25zdCB1aW50OF90ICpwX3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcF90LCBjb25zdCB1aW50OF90ICpwX3RyKQoreworICAgIHBbMF0gPSBjbGFtcF9hZGRfc3VidHJhY3RfaGFsZihwX2xbMF0sIHBfdFswXSwgcF90bFswXSk7CisgICAgcFsxXSA9IGNsYW1wX2FkZF9zdWJ0cmFjdF9oYWxmKHBfbFsxXSwgcF90WzFdLCBwX3RsWzFdKTsKKyAgICBwWzJdID0gY2xhbXBfYWRkX3N1YnRyYWN0X2hhbGYocF9sWzJdLCBwX3RbMl0sIHBfdGxbMl0pOworICAgIHBbM10gPSBjbGFtcF9hZGRfc3VidHJhY3RfaGFsZihwX2xbM10sIHBfdFszXSwgcF90bFszXSk7Cit9CisKK3R5cGVkZWYgdm9pZCAoKmludl9wcmVkaWN0X2Z1bmMpKHVpbnQ4X3QgKnAsIGNvbnN0IHVpbnQ4X3QgKnBfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBfdGwsIGNvbnN0IHVpbnQ4X3QgKnBfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBfdHIpOworCitzdGF0aWMgY29uc3QgaW52X3ByZWRpY3RfZnVuYyBpbnZlcnNlX3ByZWRpY3RbMTRdID0geworICAgIGludl9wcmVkaWN0XzAsICBpbnZfcHJlZGljdF8xLCAgaW52X3ByZWRpY3RfMiwgIGludl9wcmVkaWN0XzMsCisgICAgaW52X3ByZWRpY3RfNCwgIGludl9wcmVkaWN0XzUsICBpbnZfcHJlZGljdF82LCAgaW52X3ByZWRpY3RfNywKKyAgICBpbnZfcHJlZGljdF84LCAgaW52X3ByZWRpY3RfOSwgIGludl9wcmVkaWN0XzEwLCBpbnZfcHJlZGljdF8xMSwKKyAgICBpbnZfcHJlZGljdF8xMiwgaW52X3ByZWRpY3RfMTMsCit9OworCitzdGF0aWMgdm9pZCBpbnZlcnNlX3ByZWRpY3Rpb24oQVZGcmFtZSAqZnJhbWUsIGVudW0gUHJlZGljdGlvbk1vZGUgbSwgaW50IHgsIGludCB5KQoreworICAgIHVpbnQ4X3QgKmRlYywgKnBfbCwgKnBfdGwsICpwX3QsICpwX3RyOworICAgIHVpbnQ4X3QgcFs0XTsKKworICAgIGRlYyAgPSBHRVRfUElYRUwoZnJhbWUsIHgsICAgICB5KTsKKyAgICBwX2wgID0gR0VUX1BJWEVMKGZyYW1lLCB4IC0gMSwgeSk7CisgICAgcF90bCA9IEdFVF9QSVhFTChmcmFtZSwgeCAtIDEsIHkgLSAxKTsKKyAgICBwX3QgID0gR0VUX1BJWEVMKGZyYW1lLCB4LCAgICAgeSAtIDEpOworICAgIGlmICh4ID09IGZyYW1lLT53aWR0aCAtIDEpCisgICAgICAgIHBfdHIgPSBHRVRfUElYRUwoZnJhbWUsIDAsIHkpOworICAgIGVsc2UKKyAgICAgICAgcF90ciA9IEdFVF9QSVhFTChmcmFtZSwgeCArIDEsIHkgLSAxKTsKKworICAgIGludmVyc2VfcHJlZGljdFttXShwLCBwX2wsIHBfdGwsIHBfdCwgcF90cik7CisKKyAgICBkZWNbMF0gKz0gcFswXTsKKyAgICBkZWNbMV0gKz0gcFsxXTsKKyAgICBkZWNbMl0gKz0gcFsyXTsKKyAgICBkZWNbM10gKz0gcFszXTsKK30KKworc3RhdGljIGludCBhcHBseV9wcmVkaWN0b3JfdHJhbnNmb3JtKFdlYlBDb250ZXh0ICpzKQoreworICAgIEltYWdlQ29udGV4dCAqaW1nICA9ICZzLT5pbWFnZVtJTUFHRV9ST0xFX0FSR0JdOworICAgIEltYWdlQ29udGV4dCAqcGltZyA9ICZzLT5pbWFnZVtJTUFHRV9ST0xFX1BSRURJQ1RPUl07CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaW1nLT5mcmFtZS0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGltZy0+ZnJhbWUtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCB0eCA9IHggPj4gcGltZy0+c2l6ZV9yZWR1Y3Rpb247CisgICAgICAgICAgICBpbnQgdHkgPSB5ID4+IHBpbWctPnNpemVfcmVkdWN0aW9uOworICAgICAgICAgICAgZW51bSBQcmVkaWN0aW9uTW9kZSBtID0gR0VUX1BJWEVMX0NPTVAocGltZy0+ZnJhbWUsIHR4LCB0eSwgMik7CisKKyAgICAgICAgICAgIGlmICh4ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBtID0gUFJFRF9NT0RFX0JMQUNLOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbSA9IFBSRURfTU9ERV9UOworICAgICAgICAgICAgfSBlbHNlIGlmICh5ID09IDApCisgICAgICAgICAgICAgICAgbSA9IFBSRURfTU9ERV9MOworCisgICAgICAgICAgICBpZiAobSA+IDEzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHByZWRpY3RvciBtb2RlOiAlZFxuIiwgbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnZlcnNlX3ByZWRpY3Rpb24oaW1nLT5mcmFtZSwgbSwgeCwgeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQ4X3QgY29sb3JfdHJhbnNmb3JtX2RlbHRhKHVpbnQ4X3QgY29sb3JfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY29sb3IpCit7CisgICAgcmV0dXJuIChpbnQpZmZfdThfdG9fczgoY29sb3JfcHJlZCkgKiBmZl91OF90b19zOChjb2xvcikgPj4gNTsKK30KKworc3RhdGljIGludCBhcHBseV9jb2xvcl90cmFuc2Zvcm0oV2ViUENvbnRleHQgKnMpCit7CisgICAgSW1hZ2VDb250ZXh0ICppbWcsICpjaW1nOworICAgIGludCB4LCB5LCBjeCwgY3k7CisgICAgdWludDhfdCAqcCwgKmNwOworCisgICAgaW1nICA9ICZzLT5pbWFnZVtJTUFHRV9ST0xFX0FSR0JdOworICAgIGNpbWcgPSAmcy0+aW1hZ2VbSU1BR0VfUk9MRV9DT0xPUl9UUkFOU0ZPUk1dOworCisgICAgZm9yICh5ID0gMDsgeSA8IGltZy0+ZnJhbWUtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpbWctPmZyYW1lLT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBjeCA9IHggPj4gY2ltZy0+c2l6ZV9yZWR1Y3Rpb247CisgICAgICAgICAgICBjeSA9IHkgPj4gY2ltZy0+c2l6ZV9yZWR1Y3Rpb247CisgICAgICAgICAgICBjcCA9IEdFVF9QSVhFTChjaW1nLT5mcmFtZSwgY3gsIGN5KTsKKyAgICAgICAgICAgIHAgID0gR0VUX1BJWEVMKGltZy0+ZnJhbWUsICAgeCwgIHkpOworCisgICAgICAgICAgICBwWzFdICs9IGNvbG9yX3RyYW5zZm9ybV9kZWx0YShjcFszXSwgcFsyXSk7CisgICAgICAgICAgICBwWzNdICs9IGNvbG9yX3RyYW5zZm9ybV9kZWx0YShjcFsyXSwgcFsyXSkgKworICAgICAgICAgICAgICAgICAgICBjb2xvcl90cmFuc2Zvcm1fZGVsdGEoY3BbMV0sIHBbMV0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwcGx5X3N1YnRyYWN0X2dyZWVuX3RyYW5zZm9ybShXZWJQQ29udGV4dCAqcykKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBJbWFnZUNvbnRleHQgKmltZyA9ICZzLT5pbWFnZVtJTUFHRV9ST0xFX0FSR0JdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGltZy0+ZnJhbWUtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpbWctPmZyYW1lLT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICB1aW50OF90ICpwID0gR0VUX1BJWEVMKGltZy0+ZnJhbWUsIHgsIHkpOworICAgICAgICAgICAgcFsxXSArPSBwWzJdOworICAgICAgICAgICAgcFszXSArPSBwWzJdOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwcGx5X2NvbG9yX2luZGV4aW5nX3RyYW5zZm9ybShXZWJQQ29udGV4dCAqcykKK3sKKyAgICBJbWFnZUNvbnRleHQgKmltZzsKKyAgICBJbWFnZUNvbnRleHQgKnBhbDsKKyAgICBpbnQgaSwgeCwgeTsKKyAgICB1aW50OF90ICpwOworCisgICAgaW1nID0gJnMtPmltYWdlW0lNQUdFX1JPTEVfQVJHQl07CisgICAgcGFsID0gJnMtPmltYWdlW0lNQUdFX1JPTEVfQ09MT1JfSU5ERVhJTkddOworCisgICAgaWYgKHBhbC0+c2l6ZV9yZWR1Y3Rpb24gPiAwKSB7CisgICAgICAgIEdldEJpdENvbnRleHQgZ2JfZzsKKyAgICAgICAgdWludDhfdCAqbGluZTsKKyAgICAgICAgaW50IHBpeGVsX2JpdHMgPSA4ID4+IHBhbC0+c2l6ZV9yZWR1Y3Rpb247CisKKyAgICAgICAgbGluZSA9IGF2X21hbGxvYyhpbWctPmZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgICAgIGlmICghbGluZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGltZy0+ZnJhbWUtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBwID0gR0VUX1BJWEVMKGltZy0+ZnJhbWUsIDAsIHkpOworICAgICAgICAgICAgbWVtY3B5KGxpbmUsIHAsIGltZy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiX2csIGxpbmUsIGltZy0+ZnJhbWUtPmxpbmVzaXplWzBdICogOCk7CisgICAgICAgICAgICBza2lwX2JpdHMoJmdiX2csIDE2KTsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGltZy0+ZnJhbWUtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBwICAgID0gR0VUX1BJWEVMKGltZy0+ZnJhbWUsIHgsIHkpOworICAgICAgICAgICAgICAgIHBbMl0gPSBnZXRfYml0cygmZ2JfZywgcGl4ZWxfYml0cyk7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGlmIChpID09IDEgPDwgcGFsLT5zaXplX3JlZHVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmdiX2csIDI0KTsKKyAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2X2ZyZWUobGluZSk7CisgICAgfQorCisgICAgLy8gc3dpdGNoIHRvIGxvY2FsIHBhbGV0dGUgaWYgaXQncyB3b3J0aCBpbml0aWFsaXppbmcgaXQKKyAgICBpZiAoaW1nLT5mcmFtZS0+aGVpZ2h0ICogaW1nLT5mcmFtZS0+d2lkdGggPiAzMDApIHsKKyAgICAgICAgdWludDhfdCBwYWxldHRlWzI1NiAqIDRdOworICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IHBhbC0+ZnJhbWUtPndpZHRoICogNDsKKyAgICAgICAgYXZfYXNzZXJ0MChzaXplIDw9IDEwMjRVKTsKKyAgICAgICAgbWVtY3B5KHBhbGV0dGUsIEdFVF9QSVhFTChwYWwtPmZyYW1lLCAwLCAwKSwgc2l6ZSk7ICAgLy8gY29weSBwYWxldHRlCisgICAgICAgIC8vIHNldCBleHRyYSBlbnRyaWVzIHRvIHRyYW5zcGFyZW50IGJsYWNrCisgICAgICAgIG1lbXNldChwYWxldHRlICsgc2l6ZSwgMCwgMjU2ICogNCAtIHNpemUpOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaW1nLT5mcmFtZS0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpbWctPmZyYW1lLT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgcCA9IEdFVF9QSVhFTChpbWctPmZyYW1lLCB4LCB5KTsKKyAgICAgICAgICAgICAgICBpID0gcFsyXTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIocCwgJnBhbGV0dGVbaSAqIDRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBpbWctPmZyYW1lLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGltZy0+ZnJhbWUtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBwID0gR0VUX1BJWEVMKGltZy0+ZnJhbWUsIHgsIHkpOworICAgICAgICAgICAgICAgIGkgPSBwWzJdOworICAgICAgICAgICAgICAgIGlmIChpID49IHBhbC0+ZnJhbWUtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIEFWX1dCMzIocCwgMHgwMDAwMDAwMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGkgPSBHRVRfUElYRUwocGFsLT5mcmFtZSwgaSwgMCk7CisgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkzMihwLCBwaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA4X2xvc3NsZXNzX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIHVpbnQ4X3QgKmRhdGFfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSwgaW50IGlzX2FscGhhX2NodW5rKQoreworICAgIFdlYlBDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgdywgaCwgcmV0LCBpOworCisgICAgaWYgKCFpc19hbHBoYV9jaHVuaykgeworICAgICAgICBzLT5sb3NzbGVzcyA9IDE7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9BUkdCOworICAgIH0KKworICAgIHJldCA9IGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBkYXRhX3N0YXJ0LCBkYXRhX3NpemUgKiA4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICghaXNfYWxwaGFfY2h1bmspIHsKKyAgICAgICAgaWYgKGdldF9iaXRzKCZzLT5nYiwgOCkgIT0gMHgyRikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIFdlYlAgTG9zc2xlc3Mgc2lnbmF0dXJlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgdyA9IGdldF9iaXRzKCZzLT5nYiwgMTQpICsgMTsKKyAgICAgICAgaCA9IGdldF9iaXRzKCZzLT5nYiwgMTQpICsgMTsKKyAgICAgICAgaWYgKHMtPndpZHRoICYmIHMtPndpZHRoICE9IHcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJXaWR0aCBtaXNtYXRjaC4gJWQgIT0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+d2lkdGgsIHcpOworICAgICAgICB9CisgICAgICAgIHMtPndpZHRoID0gdzsKKyAgICAgICAgaWYgKHMtPmhlaWdodCAmJiBzLT5oZWlnaHQgIT0gaCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkhlaWdodCBtaXNtYXRjaC4gJWQgIT0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+d2lkdGgsIHcpOworICAgICAgICB9CisgICAgICAgIHMtPmhlaWdodCA9IGg7CisKKyAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHMtPndpZHRoLCBzLT5oZWlnaHQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcy0+aGFzX2FscGhhID0gZ2V0X2JpdHMxKCZzLT5nYik7CisKKyAgICAgICAgaWYgKGdldF9iaXRzKCZzLT5nYiwgMykgIT0gMHgwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgV2ViUCBMb3NzbGVzcyB2ZXJzaW9uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFzLT53aWR0aCB8fCAhcy0+aGVpZ2h0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgICAgICB3ID0gcy0+d2lkdGg7CisgICAgICAgIGggPSBzLT5oZWlnaHQ7CisgICAgfQorCisgICAgLyogcGFyc2UgdHJhbnNmb3JtYXRpb25zICovCisgICAgcy0+bmJfdHJhbnNmb3JtcyA9IDA7CisgICAgcy0+cmVkdWNlZF93aWR0aCA9IDA7CisgICAgd2hpbGUgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgIGVudW0gVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0gPSBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgICAgICBzLT50cmFuc2Zvcm1zW3MtPm5iX3RyYW5zZm9ybXMrK10gPSB0cmFuc2Zvcm07CisgICAgICAgIHN3aXRjaCAodHJhbnNmb3JtKSB7CisgICAgICAgIGNhc2UgUFJFRElDVE9SX1RSQU5TRk9STToKKyAgICAgICAgICAgIHJldCA9IHBhcnNlX3RyYW5zZm9ybV9wcmVkaWN0b3Iocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT0xPUl9UUkFOU0ZPUk06CisgICAgICAgICAgICByZXQgPSBwYXJzZV90cmFuc2Zvcm1fY29sb3Iocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk06CisgICAgICAgICAgICByZXQgPSBwYXJzZV90cmFuc2Zvcm1fY29sb3JfaW5kZXhpbmcocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICAgIH0KKworICAgIC8qIGRlY29kZSBwcmltYXJ5IGltYWdlICovCisgICAgcy0+aW1hZ2VbSU1BR0VfUk9MRV9BUkdCXS5mcmFtZSA9IHA7CisgICAgaWYgKGlzX2FscGhhX2NodW5rKQorICAgICAgICBzLT5pbWFnZVtJTUFHRV9ST0xFX0FSR0JdLmlzX2FscGhhX3ByaW1hcnkgPSAxOworICAgIHJldCA9IGRlY29kZV9lbnRyb3B5X2NvZGVkX2ltYWdlKHMsIElNQUdFX1JPTEVfQVJHQiwgdywgaCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworCisgICAgLyogYXBwbHkgdHJhbnNmb3JtYXRpb25zICovCisgICAgZm9yIChpID0gcy0+bmJfdHJhbnNmb3JtcyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHN3aXRjaCAocy0+dHJhbnNmb3Jtc1tpXSkgeworICAgICAgICBjYXNlIFBSRURJQ1RPUl9UUkFOU0ZPUk06CisgICAgICAgICAgICByZXQgPSBhcHBseV9wcmVkaWN0b3JfdHJhbnNmb3JtKHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ09MT1JfVFJBTlNGT1JNOgorICAgICAgICAgICAgcmV0ID0gYXBwbHlfY29sb3JfdHJhbnNmb3JtKHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1VCVFJBQ1RfR1JFRU46CisgICAgICAgICAgICByZXQgPSBhcHBseV9zdWJ0cmFjdF9ncmVlbl90cmFuc2Zvcm0ocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk06CisgICAgICAgICAgICByZXQgPSBhcHBseV9jb2xvcl9pbmRleGluZ190cmFuc2Zvcm0ocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICAgIH0KKworICAgICpnb3RfZnJhbWUgICA9IDE7CisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcC0+a2V5X2ZyYW1lID0gMTsKKyAgICByZXQgICAgICAgICAgPSBkYXRhX3NpemU7CisKK2ZyZWVfYW5kX3JldHVybjoKKyAgICBmb3IgKGkgPSAwOyBpIDwgSU1BR0VfUk9MRV9OQjsgaSsrKQorICAgICAgICBpbWFnZV9jdHhfZnJlZSgmcy0+aW1hZ2VbaV0pOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYWxwaGFfaW52ZXJzZV9wcmVkaWN0aW9uKEFWRnJhbWUgKmZyYW1lLCBlbnVtIEFscGhhRmlsdGVyIG0pCit7CisgICAgaW50IHgsIHksIGxzOworICAgIHVpbnQ4X3QgKmRlYzsKKworICAgIGxzID0gZnJhbWUtPmxpbmVzaXplWzNdOworCisgICAgLyogZmlsdGVyIGZpcnN0IHJvdyB1c2luZyBob3Jpem9udGFsIGZpbHRlciAqLworICAgIGRlYyA9IGZyYW1lLT5kYXRhWzNdICsgMTsKKyAgICBmb3IgKHggPSAxOyB4IDwgZnJhbWUtPndpZHRoOyB4KyssIGRlYysrKQorICAgICAgICAqZGVjICs9ICooZGVjIC0gMSk7CisKKyAgICAvKiBmaWx0ZXIgZmlyc3QgY29sdW1uIHVzaW5nIHZlcnRpY2FsIGZpbHRlciAqLworICAgIGRlYyA9IGZyYW1lLT5kYXRhWzNdICsgbHM7CisgICAgZm9yICh5ID0gMTsgeSA8IGZyYW1lLT5oZWlnaHQ7IHkrKywgZGVjICs9IGxzKQorICAgICAgICAqZGVjICs9ICooZGVjIC0gbHMpOworCisgICAgLyogZmlsdGVyIHRoZSByZXN0IHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsdGVyICovCisgICAgc3dpdGNoIChtKSB7CisgICAgY2FzZSBBTFBIQV9GSUxURVJfSE9SSVpPTlRBTDoKKyAgICAgICAgZm9yICh5ID0gMTsgeSA8IGZyYW1lLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZGVjID0gZnJhbWUtPmRhdGFbM10gKyB5ICogbHMgKyAxOworICAgICAgICAgICAgZm9yICh4ID0gMTsgeCA8IGZyYW1lLT53aWR0aDsgeCsrLCBkZWMrKykKKyAgICAgICAgICAgICAgICAqZGVjICs9ICooZGVjIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTFBIQV9GSUxURVJfVkVSVElDQUw6CisgICAgICAgIGZvciAoeSA9IDE7IHkgPCBmcmFtZS0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGRlYyA9IGZyYW1lLT5kYXRhWzNdICsgeSAqIGxzICsgMTsKKyAgICAgICAgICAgIGZvciAoeCA9IDE7IHggPCBmcmFtZS0+d2lkdGg7IHgrKywgZGVjKyspCisgICAgICAgICAgICAgICAgKmRlYyArPSAqKGRlYyAtIGxzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFMUEhBX0ZJTFRFUl9HUkFESUVOVDoKKyAgICAgICAgZm9yICh5ID0gMTsgeSA8IGZyYW1lLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZGVjID0gZnJhbWUtPmRhdGFbM10gKyB5ICogbHMgKyAxOworICAgICAgICAgICAgZm9yICh4ID0gMTsgeCA8IGZyYW1lLT53aWR0aDsgeCsrLCBkZWMrKykKKyAgICAgICAgICAgICAgICBkZWNbMF0gKz0gYXZfY2xpcF91aW50OCgqKGRlYyAtIDEpICsgKihkZWMgLSBscykgLSAqKGRlYyAtIGxzIC0gMSkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGludCB2cDhfbG9zc3lfZGVjb2RlX2FscGhhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhX3NpemUpCit7CisgICAgV2ViUENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCB4LCB5LCByZXQ7CisKKyAgICBpZiAocy0+YWxwaGFfY29tcHJlc3Npb24gPT0gQUxQSEFfQ09NUFJFU1NJT05fTk9ORSkgeworICAgICAgICBHZXRCeXRlQ29udGV4dCBnYjsKKworICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgZGF0YV9zdGFydCwgZGF0YV9zaXplKTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmhlaWdodDsgeSsrKQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmZ2IsIHAtPmRhdGFbM10gKyBwLT5saW5lc2l6ZVszXSAqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPndpZHRoKTsKKyAgICB9IGVsc2UgaWYgKHMtPmFscGhhX2NvbXByZXNzaW9uID09IEFMUEhBX0NPTVBSRVNTSU9OX1ZQOEwpIHsKKyAgICAgICAgdWludDhfdCAqYXAsICpwcDsKKyAgICAgICAgaW50IGFscGhhX2dvdF9mcmFtZSA9IDA7CisKKyAgICAgICAgcy0+YWxwaGFfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICBpZiAoIXMtPmFscGhhX2ZyYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICByZXQgPSB2cDhfbG9zc2xlc3NfZGVjb2RlX2ZyYW1lKGF2Y3R4LCBzLT5hbHBoYV9mcmFtZSwgJmFscGhhX2dvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3N0YXJ0LCBkYXRhX3NpemUsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+YWxwaGFfZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFscGhhX2dvdF9mcmFtZSkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+YWxwaGFfZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICAvKiBjb3B5IGdyZWVuIGNvbXBvbmVudCBvZiBhbHBoYSBpbWFnZSB0byBhbHBoYSBwbGFuZSBvZiBwcmltYXJ5IGltYWdlICovCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgYXAgPSBHRVRfUElYRUwocy0+YWxwaGFfZnJhbWUsIDAsIHkpICsgMjsKKyAgICAgICAgICAgIHBwID0gcC0+ZGF0YVszXSArIHAtPmxpbmVzaXplWzNdICogeTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgKnBwID0gKmFwOworICAgICAgICAgICAgICAgIHBwKys7CisgICAgICAgICAgICAgICAgYXAgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5hbHBoYV9mcmFtZSk7CisgICAgfQorCisgICAgLyogYXBwbHkgYWxwaGEgZmlsdGVyaW5nICovCisgICAgaWYgKHMtPmFscGhhX2ZpbHRlcikKKyAgICAgICAgYWxwaGFfaW52ZXJzZV9wcmVkaWN0aW9uKHAsIHMtPmFscGhhX2ZpbHRlcik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDhfbG9zc3lfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgdWludDhfdCAqZGF0YV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKQoreworICAgIFdlYlBDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVlBhY2tldCBwa3Q7CisgICAgaW50IHJldDsKKworICAgIGlmICghcy0+aW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgZmZfdnA4X2RlY29kZV9pbml0KGF2Y3R4KTsKKyAgICAgICAgcy0+aW5pdGlhbGl6ZWQgPSAxOworICAgICAgICBpZiAocy0+aGFzX2FscGhhKQorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0MjBQOworICAgIH0KKyAgICBzLT5sb3NzbGVzcyA9IDA7CisKKyAgICBpZiAoZGF0YV9zaXplID4gSU5UX01BWCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGNodW5rIHNpemVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7CisgICAgcGt0LmRhdGEgPSBkYXRhX3N0YXJ0OworICAgIHBrdC5zaXplID0gZGF0YV9zaXplOworCisgICAgcmV0ID0gZmZfdnA4X2RlY29kZV9mcmFtZShhdmN0eCwgcCwgZ290X2ZyYW1lLCAmcGt0KTsKKyAgICBpZiAocy0+aGFzX2FscGhhKSB7CisgICAgICAgIHJldCA9IHZwOF9sb3NzeV9kZWNvZGVfYWxwaGEoYXZjdHgsIHAsIHMtPmFscGhhX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWxwaGFfZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdlYnBfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICogY29uc3QgcCA9IGRhdGE7CisgICAgV2ViUENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIGludCByZXQ7CisgICAgdWludDMyX3QgY2h1bmtfdHlwZSwgY2h1bmtfc2l6ZTsKKyAgICBpbnQgdnA4eF9mbGFncyA9IDA7CisKKyAgICBzLT5hdmN0eCAgICAgPSBhdmN0eDsKKyAgICBzLT53aWR0aCAgICAgPSAwOworICAgIHMtPmhlaWdodCAgICA9IDA7CisgICAgKmdvdF9mcmFtZSAgID0gMDsKKyAgICBzLT5oYXNfYWxwaGEgPSAwOworICAgIHMtPmhhc19leGlmICA9IDA7CisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IDEyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2IpICE9IE1LVEFHKCdSJywgJ0knLCAnRicsICdGJykpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaXNzaW5nIFJJRkYgdGFnXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY2h1bmtfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCBjaHVua19zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2IpICE9IE1LVEFHKCdXJywgJ0UnLCAnQicsICdQJykpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaXNzaW5nIFdFQlAgdGFnXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZfZGljdF9mcmVlKCZzLT5leGlmX21ldGFkYXRhKTsKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA+IDApIHsKKyAgICAgICAgY2hhciBjaHVua19zdHJbNV0gPSB7IDAgfTsKKworICAgICAgICBjaHVua190eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKKyAgICAgICAgY2h1bmtfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisgICAgICAgIGlmIChjaHVua19zaXplID09IFVJTlQzMl9NQVgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgY2h1bmtfc2l6ZSArPSBjaHVua19zaXplICYgMTsKKworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IGNodW5rX3NpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBzd2l0Y2ggKGNodW5rX3R5cGUpIHsKKyAgICAgICAgY2FzZSBNS1RBRygnVicsICdQJywgJzgnLCAnICcpOgorICAgICAgICAgICAgaWYgKCEqZ290X2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gdnA4X2xvc3N5X2RlY29kZV9mcmFtZShhdmN0eCwgcCwgZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwa3QtPmRhdGEgKyBieXRlc3RyZWFtMl90ZWxsKCZnYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua19zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCBjaHVua19zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdWJywgJ1AnLCAnOCcsICdMJyk6CisgICAgICAgICAgICBpZiAoISpnb3RfZnJhbWUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSB2cDhfbG9zc2xlc3NfZGVjb2RlX2ZyYW1lKGF2Y3R4LCBwLCBnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnBrdC0+ZGF0YSArIGJ5dGVzdHJlYW0yX3RlbGwoJmdiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUsIDApOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIGNodW5rX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ1YnLCAnUCcsICc4JywgJ1gnKToKKyAgICAgICAgICAgIHZwOHhfZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDMpOworICAgICAgICAgICAgcy0+d2lkdGggID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMjQoJmdiKSArIDE7CisgICAgICAgICAgICBzLT5oZWlnaHQgPSBieXRlc3RyZWFtMl9nZXRfbGUyNCgmZ2IpICsgMTsKKyAgICAgICAgICAgIHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUocy0+d2lkdGgsIHMtPmhlaWdodCwgMCwgYXZjdHgpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdBJywgJ0wnLCAnUCcsICdIJyk6IHsKKyAgICAgICAgICAgIGludCBhbHBoYV9oZWFkZXIsIGZpbHRlcl9tLCBjb21wcmVzc2lvbjsKKworICAgICAgICAgICAgaWYgKCEodnA4eF9mbGFncyAmIFZQOFhfRkxBR19BTFBIQSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiQUxQSEEgY2h1bmsgcHJlc2VudCwgYnV0IGFscGhhIGJpdCBub3Qgc2V0IGluIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJWUDhYIGhlYWRlclxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIEFMUEhBIGNodW5rIHNpemVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWxwaGFfaGVhZGVyICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgIHMtPmFscGhhX2RhdGEgICAgICA9IGF2cGt0LT5kYXRhICsgYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpOworICAgICAgICAgICAgcy0+YWxwaGFfZGF0YV9zaXplID0gY2h1bmtfc2l6ZSAtIDE7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgcy0+YWxwaGFfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgZmlsdGVyX20gICAgPSAoYWxwaGFfaGVhZGVyID4+IDIpICYgMHgwMzsKKyAgICAgICAgICAgIGNvbXByZXNzaW9uID0gIGFscGhhX2hlYWRlciAgICAgICAmIDB4MDM7CisKKyAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbiA+IEFMUEhBX0NPTVBSRVNTSU9OX1ZQOEwpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgICAgICAgICAic2tpcHBpbmcgdW5zdXBwb3J0ZWQgQUxQSEEgY2h1bmtcbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5oYXNfYWxwaGEgICAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgcy0+YWxwaGFfY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbjsKKyAgICAgICAgICAgICAgICBzLT5hbHBoYV9maWx0ZXIgICAgICA9IGZpbHRlcl9tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE1LVEFHKCdFJywgJ1gnLCAnSScsICdGJyk6IHsKKyAgICAgICAgICAgIGludCBsZSwgaWZkX29mZnNldCwgZXhpZl9vZmZzZXQgPSBieXRlc3RyZWFtMl90ZWxsKCZnYik7CisgICAgICAgICAgICBHZXRCeXRlQ29udGV4dCBleGlmX2diOworCisgICAgICAgICAgICBpZiAocy0+aGFzX2V4aWYpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiSWdub3JpbmcgZXh0cmEgRVhJRiBjaHVua1xuIik7CisgICAgICAgICAgICAgICAgZ290byBleGlmX2VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKHZwOHhfZmxhZ3MgJiBWUDhYX0ZMQUdfRVhJRl9NRVRBREFUQSkpCisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIkVYSUYgY2h1bmsgcHJlc2VudCwgYnV0IEV4aWYgYml0IG5vdCBzZXQgaW4gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlZQOFggaGVhZGVyXG4iKTsKKworICAgICAgICAgICAgcy0+aGFzX2V4aWYgPSAxOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZXhpZl9nYiwgYXZwa3QtPmRhdGEgKyBleGlmX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwa3QtPnNpemUgLSBleGlmX29mZnNldCk7CisgICAgICAgICAgICBpZiAoZmZfdGRlY29kZV9oZWFkZXIoJmV4aWZfZ2IsICZsZSwgJmlmZF9vZmZzZXQpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBUSUZGIGhlYWRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICJpbiBFeGlmIGRhdGFcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gZXhpZl9lbmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmV4aWZfZ2IsIGlmZF9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGlmIChhdnByaXZfZXhpZl9kZWNvZGVfaWZkKGF2Y3R4LCAmZXhpZl9nYiwgbGUsIDAsICZzLT5leGlmX21ldGFkYXRhKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGRlY29kaW5nIEV4aWYgZGF0YVxuIik7CisgICAgICAgICAgICAgICAgZ290byBleGlmX2VuZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfZGljdF9jb3B5KGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKGRhdGEpLCBzLT5leGlmX21ldGFkYXRhLCAwKTsKKworZXhpZl9lbmQ6CisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJnMtPmV4aWZfbWV0YWRhdGEpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIGNodW5rX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBNS1RBRygnSScsICdDJywgJ0MnLCAnUCcpOgorICAgICAgICBjYXNlIE1LVEFHKCdBJywgJ04nLCAnSScsICdNJyk6CisgICAgICAgIGNhc2UgTUtUQUcoJ0EnLCAnTicsICdNJywgJ0YnKToKKyAgICAgICAgY2FzZSBNS1RBRygnWCcsICdNJywgJ1AnLCAnICcpOgorICAgICAgICAgICAgQVZfV0wzMihjaHVua19zdHIsIGNodW5rX3R5cGUpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgInNraXBwaW5nIHVuc3VwcG9ydGVkIGNodW5rOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBjaHVua19zdHIpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIGNodW5rX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBVl9XTDMyKGNodW5rX3N0ciwgY2h1bmtfdHlwZSk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAic2tpcHBpbmcgdW5rbm93biBjaHVuazogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgY2h1bmtfc3RyKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCBjaHVua19zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCEqZ290X2ZyYW1lKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW1hZ2UgZGF0YSBub3QgZm91bmRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB3ZWJwX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgV2ViUENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKHMtPmluaXRpYWxpemVkKQorICAgICAgICByZXR1cm4gZmZfdnA4X2RlY29kZV9mcmVlKGF2Y3R4KTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3dlYnBfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid2VicCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldlYlAgaW1hZ2UiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV0VCUCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoV2ViUENvbnRleHQpLAorICAgIC5kZWNvZGUgICAgICAgICA9IHdlYnBfZGVjb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IHdlYnBfZGVjb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy93ZWJ2dHRkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dlYnZ0dGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODRhMTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy93ZWJ2dHRkZWMuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogV2ViVlRUIHN1YnRpdGxlIGRlY29kZXIKKyAqIEBzZWUgaHR0cDovL2Rldi53My5vcmcvaHRtbDUvd2VidnR0LworICogQHRvZG8gbmVlZCB0byBzdXBwb3J0IGV4dGVuZGVkIG1hcmt1cHMgYW5kIGN1ZSBzZXR0aW5ncworICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYXNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpmcm9tOworICAgIGNvbnN0IGNoYXIgKnRvOworfSB3ZWJ2dHRfdGFnX3JlcGxhY2VbXSA9IHsKKyAgICB7IjxpPiIsICJ7XFxpMX0ifSwgeyI8L2k+IiwgIntcXGkwfSJ9LAorICAgIHsiPGI+IiwgIntcXGIxfSJ9LCB7IjwvYj4iLCAie1xcYjB9In0sCisgICAgeyI8dT4iLCAie1xcdTF9In0sIHsiPC91PiIsICJ7XFx1MH0ifSwKKyAgICB7InsiLCAiXFx7In0sIHsifSIsICJcXH0ifSwgLy8gZXNjYXBlIHRvIGF2b2lkIEFTUyBtYXJrdXAgY29uZmxpY3RzCit9OworCitzdGF0aWMgaW50IHdlYnZ0dF9ldmVudF90b19hc3MoQVZCUHJpbnQgKmJ1ZiwgY29uc3QgY2hhciAqcCkKK3sKKyAgICBpbnQgaSwgc2tpcCA9IDA7CisKKyAgICB3aGlsZSAoKnApIHsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMod2VidnR0X3RhZ19yZXBsYWNlKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tID0gd2VidnR0X3RhZ19yZXBsYWNlW2ldLmZyb207CisgICAgICAgICAgICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuKGZyb20pOworICAgICAgICAgICAgaWYgKCFzdHJuY21wKHAsIGZyb20sIGxlbikpIHsKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIiVzIiwgd2VidnR0X3RhZ19yZXBsYWNlW2ldLnRvKTsKKyAgICAgICAgICAgICAgICBwICs9IGxlbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoISpwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKCpwID09ICc8JykKKyAgICAgICAgICAgIHNraXAgPSAxOworICAgICAgICBlbHNlIGlmICgqcCA9PSAnPicpCisgICAgICAgICAgICBza2lwID0gMDsKKyAgICAgICAgZWxzZSBpZiAocFswXSA9PSAnXG4nICYmIHBbMV0pCisgICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIlxcTiIpOworICAgICAgICBlbHNlIGlmICghc2tpcCAmJiAqcCAhPSAnXHInKQorICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGJ1ZiwgKnAsIDEpOworICAgICAgICBwKys7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdlYnZ0dF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X3N1Yl9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBBVlN1YnRpdGxlICpzdWIgPSBkYXRhOworICAgIGNvbnN0IGNoYXIgKnB0ciA9IGF2cGt0LT5kYXRhOworICAgIEFWQlByaW50IGJ1ZjsKKworICAgIGF2X2JwcmludF9pbml0KCZidWYsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgaWYgKHB0ciAmJiBhdnBrdC0+c2l6ZSA+IDAgJiYgIXdlYnZ0dF9ldmVudF90b19hc3MoJmJ1ZiwgcHRyKSkgeworICAgICAgICBpbnQgdHNfc3RhcnQgICAgID0gYXZfcmVzY2FsZV9xKGF2cGt0LT5wdHMsIGF2Y3R4LT50aW1lX2Jhc2UsIChBVlJhdGlvbmFsKXsxLDEwMH0pOworICAgICAgICBpbnQgdHNfZHVyYXRpb24gID0gYXZwa3QtPmR1cmF0aW9uICE9IC0xID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShhdnBrdC0+ZHVyYXRpb24sIGF2Y3R4LT50aW1lX2Jhc2UsIChBVlJhdGlvbmFsKXsxLDEwMH0pIDogLTE7CisgICAgICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdF9icHJpbnQoc3ViLCAmYnVmLCB0c19zdGFydCwgdHNfZHVyYXRpb24pOworICAgIH0KKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZiwgTlVMTCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgKmdvdF9zdWJfcHRyID0gc3ViLT5udW1fcmVjdHMgPiAwOworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl93ZWJ2dHRfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid2VidnR0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2ViVlRUIHN1YnRpdGxlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dFQlZUVCwKKyAgICAuZGVjb2RlICAgICAgICAgPSB3ZWJ2dHRfZGVjb2RlX2ZyYW1lLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXJfZGVmYXVsdCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy93ZWJ2dHRlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dlYnZ0dGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjdhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy93ZWJ2dHRlbmMuYwpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIFdlYlZUVCBzdWJ0aXRsZSBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxNCAgQW1hbiBHdXB0YSA8ZmZtcGVnQHRtbTEubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJhc3Nfc3BsaXQuaCIKKyNpbmNsdWRlICJhc3MuaCIKKworI2RlZmluZSBXRUJWVFRfU1RBQ0tfU0laRSA2NAordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBU1NTcGxpdENvbnRleHQgKmFzc19jdHg7CisgICAgQVZCUHJpbnQgYnVmZmVyOworICAgIHVuc2lnbmVkIHRpbWVzdGFtcF9lbmQ7CisgICAgaW50IGNvdW50OworICAgIGNoYXIgc3RhY2tbV0VCVlRUX1NUQUNLX1NJWkVdOworICAgIGludCBzdGFja19wdHI7Cit9IFdlYlZUVENvbnRleHQ7CisKKyNpZmRlZiBfX0dOVUNfXworX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDMpKSkKKyNlbmRpZgorc3RhdGljIHZvaWQgd2VidnR0X3ByaW50KFdlYlZUVENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnN0ciwgLi4uKQoreworICAgIHZhX2xpc3QgdmFyZ3M7CisgICAgdmFfc3RhcnQodmFyZ3MsIHN0cik7CisgICAgYXZfdmJwcmludGYoJnMtPmJ1ZmZlciwgc3RyLCB2YXJncyk7CisgICAgdmFfZW5kKHZhcmdzKTsKK30KKworc3RhdGljIGludCB3ZWJ2dHRfc3RhY2tfcHVzaChXZWJWVFRDb250ZXh0ICpzLCBjb25zdCBjaGFyIGMpCit7CisgICAgaWYgKHMtPnN0YWNrX3B0ciA+PSBXRUJWVFRfU1RBQ0tfU0laRSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHMtPnN0YWNrW3MtPnN0YWNrX3B0cisrXSA9IGM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyIHdlYnZ0dF9zdGFja19wb3AoV2ViVlRUQ29udGV4dCAqcykKK3sKKyAgICBpZiAocy0+c3RhY2tfcHRyIDw9IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzLT5zdGFja1stLXMtPnN0YWNrX3B0cl07Cit9CisKK3N0YXRpYyBpbnQgd2VidnR0X3N0YWNrX2ZpbmQoV2ViVlRUQ29udGV4dCAqcywgY29uc3QgY2hhciBjKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IHMtPnN0YWNrX3B0ci0xOyBpID49IDA7IGktLSkKKyAgICAgICAgaWYgKHMtPnN0YWNrW2ldID09IGMpCisgICAgICAgICAgICBicmVhazsKKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgd2VidnR0X2Nsb3NlX3RhZyhXZWJWVFRDb250ZXh0ICpzLCBjaGFyIHRhZykKK3sKKyAgICB3ZWJ2dHRfcHJpbnQocywgIjwvJWM+IiwgdGFnKTsKK30KKworc3RhdGljIHZvaWQgd2VidnR0X3N0YWNrX3B1c2hfcG9wKFdlYlZUVENvbnRleHQgKnMsIGNvbnN0IGNoYXIgYywgaW50IGNsb3NlKQoreworICAgIGlmIChjbG9zZSkgeworICAgICAgICBpbnQgaSA9IGMgPyB3ZWJ2dHRfc3RhY2tfZmluZChzLCBjKSA6IDA7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgd2hpbGUgKHMtPnN0YWNrX3B0ciAhPSBpKQorICAgICAgICAgICAgd2VidnR0X2Nsb3NlX3RhZyhzLCB3ZWJ2dHRfc3RhY2tfcG9wKHMpKTsKKyAgICB9IGVsc2UgaWYgKHdlYnZ0dF9zdGFja19wdXNoKHMsIGMpIDwgMCkKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ0YWcgc3RhY2sgb3ZlcmZsb3dcbiIpOworfQorCitzdGF0aWMgdm9pZCB3ZWJ2dHRfc3R5bGVfYXBwbHkoV2ViVlRUQ29udGV4dCAqcywgY29uc3QgY2hhciAqc3R5bGUpCit7CisgICAgQVNTU3R5bGUgKnN0ID0gZmZfYXNzX3N0eWxlX2dldChzLT5hc3NfY3R4LCBzdHlsZSk7CisgICAgaWYgKHN0KSB7CisgICAgICAgIGlmIChzdC0+Ym9sZCAhPSBBU1NfREVGQVVMVF9CT0xEKSB7CisgICAgICAgICAgICB3ZWJ2dHRfcHJpbnQocywgIjxiPiIpOworICAgICAgICAgICAgd2VidnR0X3N0YWNrX3B1c2gocywgJ2InKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3QtPml0YWxpYyAhPSBBU1NfREVGQVVMVF9JVEFMSUMpIHsKKyAgICAgICAgICAgIHdlYnZ0dF9wcmludChzLCAiPGk+Iik7CisgICAgICAgICAgICB3ZWJ2dHRfc3RhY2tfcHVzaChzLCAnaScpOworICAgICAgICB9CisgICAgICAgIGlmIChzdC0+dW5kZXJsaW5lICE9IEFTU19ERUZBVUxUX1VOREVSTElORSkgeworICAgICAgICAgICAgd2VidnR0X3ByaW50KHMsICI8dT4iKTsKKyAgICAgICAgICAgIHdlYnZ0dF9zdGFja19wdXNoKHMsICd1Jyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHdlYnZ0dF90ZXh0X2NiKHZvaWQgKnByaXYsIGNvbnN0IGNoYXIgKnRleHQsIGludCBsZW4pCit7CisgICAgV2ViVlRUQ29udGV4dCAqcyA9IHByaXY7CisgICAgYXZfYnByaW50X2FwcGVuZF9kYXRhKCZzLT5idWZmZXIsIHRleHQsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHdlYnZ0dF9uZXdfbGluZV9jYih2b2lkICpwcml2LCBpbnQgZm9yY2VkKQoreworICAgIHdlYnZ0dF9wcmludChwcml2LCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgd2VidnR0X3N0eWxlX2NiKHZvaWQgKnByaXYsIGNoYXIgc3R5bGUsIGludCBjbG9zZSkKK3sKKyAgICBpZiAoc3R5bGUgPT0gJ3MnKSAvLyBzdHJpa2V0aHJvdWdoIHVuc3VwcG9ydGVkCisgICAgICAgIHJldHVybjsKKworICAgIHdlYnZ0dF9zdGFja19wdXNoX3BvcChwcml2LCBzdHlsZSwgY2xvc2UpOworICAgIGlmICghY2xvc2UpCisgICAgICAgIHdlYnZ0dF9wcmludChwcml2LCAiPCVjPiIsIHN0eWxlKTsKK30KKworc3RhdGljIHZvaWQgd2VidnR0X2NhbmNlbF9vdmVycmlkZXNfY2Iodm9pZCAqcHJpdiwgY29uc3QgY2hhciAqc3R5bGUpCit7CisgICAgd2VidnR0X3N0YWNrX3B1c2hfcG9wKHByaXYsIDAsIDEpOworICAgIHdlYnZ0dF9zdHlsZV9hcHBseShwcml2LCBzdHlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdlYnZ0dF9lbmRfY2Iodm9pZCAqcHJpdikKK3sKKyAgICB3ZWJ2dHRfc3RhY2tfcHVzaF9wb3AocHJpdiwgMCwgMSk7Cit9CisKK3N0YXRpYyBjb25zdCBBU1NDb2Rlc0NhbGxiYWNrcyB3ZWJ2dHRfY2FsbGJhY2tzID0geworICAgIC50ZXh0ICAgICAgICAgICAgID0gd2VidnR0X3RleHRfY2IsCisgICAgLm5ld19saW5lICAgICAgICAgPSB3ZWJ2dHRfbmV3X2xpbmVfY2IsCisgICAgLnN0eWxlICAgICAgICAgICAgPSB3ZWJ2dHRfc3R5bGVfY2IsCisgICAgLmNvbG9yICAgICAgICAgICAgPSBOVUxMLAorICAgIC5mb250X25hbWUgICAgICAgID0gTlVMTCwKKyAgICAuZm9udF9zaXplICAgICAgICA9IE5VTEwsCisgICAgLmFsaWdubWVudCAgICAgICAgPSBOVUxMLAorICAgIC5jYW5jZWxfb3ZlcnJpZGVzID0gd2VidnR0X2NhbmNlbF9vdmVycmlkZXNfY2IsCisgICAgLm1vdmUgICAgICAgICAgICAgPSBOVUxMLAorICAgIC5lbmQgICAgICAgICAgICAgID0gd2VidnR0X2VuZF9jYiwKK307CisKK3N0YXRpYyBpbnQgd2VidnR0X2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSwgY29uc3QgQVZTdWJ0aXRsZSAqc3ViKQoreworICAgIFdlYlZUVENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFTU0RpYWxvZyAqZGlhbG9nOworICAgIGludCBpLCBudW07CisKKyAgICBhdl9icHJpbnRfY2xlYXIoJnMtPmJ1ZmZlcik7CisKKyAgICBmb3IgKGk9MDsgaTxzdWItPm51bV9yZWN0czsgaSsrKSB7CisgICAgICAgIGlmIChzdWItPnJlY3RzW2ldLT50eXBlICE9IFNVQlRJVExFX0FTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IFNVQlRJVExFX0FTUyB0eXBlIHN1cHBvcnRlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgfQorCisgICAgICAgIGRpYWxvZyA9IGZmX2Fzc19zcGxpdF9kaWFsb2cocy0+YXNzX2N0eCwgc3ViLT5yZWN0c1tpXS0+YXNzLCAwLCAmbnVtKTsKKyAgICAgICAgZm9yICg7IGRpYWxvZyAmJiBudW0tLTsgZGlhbG9nKyspIHsKKyAgICAgICAgICAgIHdlYnZ0dF9zdHlsZV9hcHBseShzLCBkaWFsb2ctPnN0eWxlKTsKKyAgICAgICAgICAgIGZmX2Fzc19zcGxpdF9vdmVycmlkZV9jb2Rlcygmd2VidnR0X2NhbGxiYWNrcywgcywgZGlhbG9nLT50ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKCZzLT5idWZmZXIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmICghcy0+YnVmZmVyLmxlbikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocy0+YnVmZmVyLmxlbiA+IGJ1ZnNpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCdWZmZXIgdG9vIHNtYWxsIGZvciBBU1MgZXZlbnQuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZW1jcHkoYnVmLCBzLT5idWZmZXIuc3RyLCBzLT5idWZmZXIubGVuKTsKKworICAgIHJldHVybiBzLT5idWZmZXIubGVuOworfQorCitzdGF0aWMgaW50IHdlYnZ0dF9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFdlYlZUVENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGZmX2Fzc19zcGxpdF9mcmVlKHMtPmFzc19jdHgpOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmcy0+YnVmZmVyLCBOVUxMKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHdlYnZ0dF9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgV2ViVlRUQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBzLT5hc3NfY3R4ID0gZmZfYXNzX3NwbGl0KGF2Y3R4LT5zdWJ0aXRsZV9oZWFkZXIpOworICAgIGF2X2JwcmludF9pbml0KCZzLT5idWZmZXIsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgcmV0dXJuIHMtPmFzc19jdHggPyAwIDogQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworQVZDb2RlYyBmZl93ZWJ2dHRfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid2VidnR0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2ViVlRUIHN1YnRpdGxlIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dFQlZUVCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoV2ViVlRUQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gd2VidnR0X2VuY29kZV9pbml0LAorICAgIC5lbmNvZGVfc3ViICAgICA9IHdlYnZ0dF9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gd2VidnR0X2VuY29kZV9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy93bWEuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZmRhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy93bWEuYwpAQCAtMCwwICsxLDQ4NSBAQAorLyoKKyAqIFdNQSBjb21wYXRpYmxlIGNvZGVjCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAic2luZXdpbi5oIgorI2luY2x1ZGUgIndtYS5oIgorI2luY2x1ZGUgIndtYV9jb21tb24uaCIKKyNpbmNsdWRlICJ3bWFfZnJlcXMuaCIKKyNpbmNsdWRlICJ3bWFkYXRhLmgiCisKKyN1bmRlZiBOREVCVUcKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyogWFhYOiB1c2Ugc2FtZSBydW4vbGVuZ3RoIG9wdGltaXphdGlvbiBhcyBtcGVnIGRlY29kZXJzICovCisvLyBGSVhNRSBtYXliZSBzcGxpdCBkZWNvZGUgLyBlbmNvZGUgb3IgcGFzcyBmbGFnCitzdGF0aWMgYXZfY29sZCB2b2lkIGluaXRfY29lZl92bGMoVkxDICp2bGMsIHVpbnQxNl90ICoqcHJ1bl90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKnBsZXZlbF90YWJsZSwgdWludDE2X3QgKipwaW50X3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZWZWTENUYWJsZSAqdmxjX3RhYmxlKQoreworICAgIGludCBuICAgICAgICAgICAgICAgICAgICAgICAgPSB2bGNfdGFibGUtPm47CisgICAgY29uc3QgdWludDhfdCAgKnRhYmxlX2JpdHMgICA9IHZsY190YWJsZS0+aHVmZmJpdHM7CisgICAgY29uc3QgdWludDMyX3QgKnRhYmxlX2NvZGVzICA9IHZsY190YWJsZS0+aHVmZmNvZGVzOworICAgIGNvbnN0IHVpbnQxNl90ICpsZXZlbHNfdGFibGUgPSB2bGNfdGFibGUtPmxldmVsczsKKyAgICB1aW50MTZfdCAqcnVuX3RhYmxlLCAqbGV2ZWxfdGFibGUsICppbnRfdGFibGU7CisgICAgZmxvYXQgKmZsZXZlbF90YWJsZTsKKyAgICBpbnQgaSwgbCwgaiwgaywgbGV2ZWw7CisKKyAgICBpbml0X3ZsYyh2bGMsIFZMQ0JJVFMsIG4sIHRhYmxlX2JpdHMsIDEsIDEsIHRhYmxlX2NvZGVzLCA0LCA0LCAwKTsKKworICAgIHJ1bl90YWJsZSAgICA9IGF2X21hbGxvY19hcnJheShuLCBzaXplb2YodWludDE2X3QpKTsKKyAgICBsZXZlbF90YWJsZSAgPSBhdl9tYWxsb2NfYXJyYXkobiwgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgZmxldmVsX3RhYmxlID0gYXZfbWFsbG9jX2FycmF5KG4sIHNpemVvZigqZmxldmVsX3RhYmxlKSk7CisgICAgaW50X3RhYmxlICAgID0gYXZfbWFsbG9jX2FycmF5KG4sIHNpemVvZih1aW50MTZfdCkpOworICAgIGkgICAgICAgICAgICA9IDI7CisgICAgbGV2ZWwgICAgICAgID0gMTsKKyAgICBrICAgICAgICAgICAgPSAwOworICAgIHdoaWxlIChpIDwgbikgeworICAgICAgICBpbnRfdGFibGVba10gPSBpOworICAgICAgICBsICAgICAgICAgICAgPSBsZXZlbHNfdGFibGVbaysrXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGw7IGorKykgeworICAgICAgICAgICAgcnVuX3RhYmxlW2ldICAgID0gajsKKyAgICAgICAgICAgIGxldmVsX3RhYmxlW2ldICA9IGxldmVsOworICAgICAgICAgICAgZmxldmVsX3RhYmxlW2ldID0gbGV2ZWw7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgbGV2ZWwrKzsKKyAgICB9CisgICAgKnBydW5fdGFibGUgICA9IHJ1bl90YWJsZTsKKyAgICAqcGxldmVsX3RhYmxlID0gZmxldmVsX3RhYmxlOworICAgICpwaW50X3RhYmxlICAgPSBpbnRfdGFibGU7CisgICAgYXZfZnJlZShsZXZlbF90YWJsZSk7Cit9CisKK2F2X2NvbGQgaW50IGZmX3dtYV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGZsYWdzMikKK3sKKyAgICBXTUFDb2RlY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworICAgIGZsb2F0IGJwczEsIGhpZ2hfZnJlcTsKKyAgICB2b2xhdGlsZSBmbG9hdCBicHM7CisgICAgaW50IHNhbXBsZV9yYXRlMTsKKyAgICBpbnQgY29lZl92bGNfdGFibGU7CisKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlIDw9IDAgfHwgYXZjdHgtPnNhbXBsZV9yYXRlID4gNTAwMDAgfHwKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxzICAgIDw9IDAgfHwgYXZjdHgtPmNoYW5uZWxzICAgID4gMiAgICAgfHwKKyAgICAgICAgYXZjdHgtPmJpdF9yYXRlICAgIDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZmX2ZtdF9jb252ZXJ0X2luaXQoJnMtPmZtdF9jb252LCBhdmN0eCk7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9XTUFWMSkKKyAgICAgICAgcy0+dmVyc2lvbiA9IDE7CisgICAgZWxzZQorICAgICAgICBzLT52ZXJzaW9uID0gMjsKKworICAgIC8qIGNvbXB1dGUgTURDVCBibG9jayBzaXplICovCisgICAgcy0+ZnJhbWVfbGVuX2JpdHMgPSBmZl93bWFfZ2V0X2ZyYW1lX2xlbl9iaXRzKGF2Y3R4LT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dmVyc2lvbiwgMCk7CisgICAgcy0+bmV4dF9ibG9ja19sZW5fYml0cyA9IHMtPmZyYW1lX2xlbl9iaXRzOworICAgIHMtPnByZXZfYmxvY2tfbGVuX2JpdHMgPSBzLT5mcmFtZV9sZW5fYml0czsKKyAgICBzLT5ibG9ja19sZW5fYml0cyAgICAgID0gcy0+ZnJhbWVfbGVuX2JpdHM7CisKKyAgICBzLT5mcmFtZV9sZW4gPSAxIDw8IHMtPmZyYW1lX2xlbl9iaXRzOworICAgIGlmIChzLT51c2VfdmFyaWFibGVfYmxvY2tfbGVuKSB7CisgICAgICAgIGludCBuYl9tYXgsIG5iOworICAgICAgICBuYiA9ICgoZmxhZ3MyID4+IDMpICYgMykgKyAxOworICAgICAgICBpZiAoKGF2Y3R4LT5iaXRfcmF0ZSAvIGF2Y3R4LT5jaGFubmVscykgPj0gMzIwMDApCisgICAgICAgICAgICBuYiArPSAyOworICAgICAgICBuYl9tYXggPSBzLT5mcmFtZV9sZW5fYml0cyAtIEJMT0NLX01JTl9CSVRTOworICAgICAgICBpZiAobmIgPiBuYl9tYXgpCisgICAgICAgICAgICBuYiA9IG5iX21heDsKKyAgICAgICAgcy0+bmJfYmxvY2tfc2l6ZXMgPSBuYiArIDE7CisgICAgfSBlbHNlCisgICAgICAgIHMtPm5iX2Jsb2NrX3NpemVzID0gMTsKKworICAgIC8qIGluaXQgcmF0ZSBkZXBlbmRlbnQgcGFyYW1ldGVycyAqLworICAgIHMtPnVzZV9ub2lzZV9jb2RpbmcgPSAxOworICAgIGhpZ2hfZnJlcSAgICAgICAgICAgPSBhdmN0eC0+c2FtcGxlX3JhdGUgKiAwLjU7CisKKyAgICAvKiBpZiB2ZXJzaW9uIDIsIHRoZW4gdGhlIHJhdGVzIGFyZSBub3JtYWxpemVkICovCisgICAgc2FtcGxlX3JhdGUxID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIGlmIChzLT52ZXJzaW9uID09IDIpIHsKKyAgICAgICAgaWYgKHNhbXBsZV9yYXRlMSA+PSA0NDEwMCkKKyAgICAgICAgICAgIHNhbXBsZV9yYXRlMSA9IDQ0MTAwOworICAgICAgICBlbHNlIGlmIChzYW1wbGVfcmF0ZTEgPj0gMjIwNTApCisgICAgICAgICAgICBzYW1wbGVfcmF0ZTEgPSAyMjA1MDsKKyAgICAgICAgZWxzZSBpZiAoc2FtcGxlX3JhdGUxID49IDE2MDAwKQorICAgICAgICAgICAgc2FtcGxlX3JhdGUxID0gMTYwMDA7CisgICAgICAgIGVsc2UgaWYgKHNhbXBsZV9yYXRlMSA+PSAxMTAyNSkKKyAgICAgICAgICAgIHNhbXBsZV9yYXRlMSA9IDExMDI1OworICAgICAgICBlbHNlIGlmIChzYW1wbGVfcmF0ZTEgPj0gODAwMCkKKyAgICAgICAgICAgIHNhbXBsZV9yYXRlMSA9IDgwMDA7CisgICAgfQorCisgICAgYnBzICAgICAgICAgICAgICAgICA9IChmbG9hdCkgYXZjdHgtPmJpdF9yYXRlIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSAoYXZjdHgtPmNoYW5uZWxzICogYXZjdHgtPnNhbXBsZV9yYXRlKTsKKyAgICBzLT5ieXRlX29mZnNldF9iaXRzID0gYXZfbG9nMigoaW50KSAoYnBzICogcy0+ZnJhbWVfbGVuIC8gOC4wICsgMC41KSkgKyAyOworICAgIGlmIChzLT5ieXRlX29mZnNldF9iaXRzICsgMyA+IE1JTl9DQUNIRV9CSVRTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYnl0ZV9vZmZzZXRfYml0cyAlZCBpcyB0b28gbGFyZ2VcbiIsIHMtPmJ5dGVfb2Zmc2V0X2JpdHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgLyogY29tcHV0ZSBoaWdoIGZyZXF1ZW5jeSB2YWx1ZSBhbmQgY2hvb3NlIGlmIG5vaXNlIGNvZGluZyBzaG91bGQKKyAgICAgKiBiZSBhY3RpdmF0ZWQgKi8KKyAgICBicHMxID0gYnBzOworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPT0gMikKKyAgICAgICAgYnBzMSA9IGJwcyAqIDEuNjsKKyAgICBpZiAoc2FtcGxlX3JhdGUxID09IDQ0MTAwKSB7CisgICAgICAgIGlmIChicHMxID49IDAuNjEpCisgICAgICAgICAgICBzLT51c2Vfbm9pc2VfY29kaW5nID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGlnaF9mcmVxID0gaGlnaF9mcmVxICogMC40OworICAgIH0gZWxzZSBpZiAoc2FtcGxlX3JhdGUxID09IDIyMDUwKSB7CisgICAgICAgIGlmIChicHMxID49IDEuMTYpCisgICAgICAgICAgICBzLT51c2Vfbm9pc2VfY29kaW5nID0gMDsKKyAgICAgICAgZWxzZSBpZiAoYnBzMSA+PSAwLjcyKQorICAgICAgICAgICAgaGlnaF9mcmVxID0gaGlnaF9mcmVxICogMC43OworICAgICAgICBlbHNlCisgICAgICAgICAgICBoaWdoX2ZyZXEgPSBoaWdoX2ZyZXEgKiAwLjY7CisgICAgfSBlbHNlIGlmIChzYW1wbGVfcmF0ZTEgPT0gMTYwMDApIHsKKyAgICAgICAgaWYgKGJwcyA+IDAuNSkKKyAgICAgICAgICAgIGhpZ2hfZnJlcSA9IGhpZ2hfZnJlcSAqIDAuNTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGlnaF9mcmVxID0gaGlnaF9mcmVxICogMC4zOworICAgIH0gZWxzZSBpZiAoc2FtcGxlX3JhdGUxID09IDExMDI1KQorICAgICAgICBoaWdoX2ZyZXEgPSBoaWdoX2ZyZXEgKiAwLjc7CisgICAgZWxzZSBpZiAoc2FtcGxlX3JhdGUxID09IDgwMDApIHsKKyAgICAgICAgaWYgKGJwcyA8PSAwLjYyNSkKKyAgICAgICAgICAgIGhpZ2hfZnJlcSA9IGhpZ2hfZnJlcSAqIDAuNTsKKyAgICAgICAgZWxzZSBpZiAoYnBzID4gMC43NSkKKyAgICAgICAgICAgIHMtPnVzZV9ub2lzZV9jb2RpbmcgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoaWdoX2ZyZXEgPSBoaWdoX2ZyZXEgKiAwLjY1OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChicHMgPj0gMC44KQorICAgICAgICAgICAgaGlnaF9mcmVxID0gaGlnaF9mcmVxICogMC43NTsKKyAgICAgICAgZWxzZSBpZiAoYnBzID49IDAuNikKKyAgICAgICAgICAgIGhpZ2hfZnJlcSA9IGhpZ2hfZnJlcSAqIDAuNjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGlnaF9mcmVxID0gaGlnaF9mcmVxICogMC41OworICAgIH0KKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiZmxhZ3MyPTB4JXhcbiIsIGZsYWdzMik7CisgICAgYXZfZGxvZyhzLT5hdmN0eCwgInZlcnNpb249JWQgY2hhbm5lbHM9JWQgc2FtcGxlX3JhdGU9JWQgYml0cmF0ZT0lZCBibG9ja19hbGlnbj0lZFxuIiwKKyAgICAgICAgICAgIHMtPnZlcnNpb24sIGF2Y3R4LT5jaGFubmVscywgYXZjdHgtPnNhbXBsZV9yYXRlLCBhdmN0eC0+Yml0X3JhdGUsCisgICAgICAgICAgICBhdmN0eC0+YmxvY2tfYWxpZ24pOworICAgIGF2X2Rsb2cocy0+YXZjdHgsICJicHM9JWYgYnBzMT0lZiBoaWdoX2ZyZXE9JWYgYml0b2Zmc2V0PSVkXG4iLAorICAgICAgICAgICAgYnBzLCBicHMxLCBoaWdoX2ZyZXEsIHMtPmJ5dGVfb2Zmc2V0X2JpdHMpOworICAgIGF2X2Rsb2cocy0+YXZjdHgsICJ1c2Vfbm9pc2VfY29kaW5nPSVkIHVzZV9leHBfdmxjPSVkIG5iX2Jsb2NrX3NpemVzPSVkXG4iLAorICAgICAgICAgICAgcy0+dXNlX25vaXNlX2NvZGluZywgcy0+dXNlX2V4cF92bGMsIHMtPm5iX2Jsb2NrX3NpemVzKTsKKworICAgIC8qIGNvbXB1dGUgdGhlIHNjYWxlIGZhY3RvciBiYW5kIHNpemVzIGZvciBlYWNoIE1EQ1QgYmxvY2sgc2l6ZSAqLworICAgIHsKKyAgICAgICAgaW50IGEsIGIsIHBvcywgbHBvcywgaywgYmxvY2tfbGVuLCBpLCBqLCBuOworICAgICAgICBjb25zdCB1aW50OF90ICp0YWJsZTsKKworICAgICAgICBpZiAocy0+dmVyc2lvbiA9PSAxKQorICAgICAgICAgICAgcy0+Y29lZnNfc3RhcnQgPSAzOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5jb2Vmc19zdGFydCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5uYl9ibG9ja19zaXplczsgaysrKSB7CisgICAgICAgICAgICBibG9ja19sZW4gPSBzLT5mcmFtZV9sZW4gPj4gazsKKworICAgICAgICAgICAgaWYgKHMtPnZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgIGxwb3MgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGEgICA9IGZmX3dtYV9jcml0aWNhbF9mcmVxc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYiAgID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBwb3MgPSAoKGJsb2NrX2xlbiAqIDIgKiBhKSArIChiID4+IDEpKSAvIGI7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPiBibG9ja19sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBibG9ja19sZW47CisgICAgICAgICAgICAgICAgICAgIHMtPmV4cG9uZW50X2JhbmRzWzBdW2ldID0gcG9zIC0gbHBvczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBibG9ja19sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxwb3MgPSBwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPmV4cG9uZW50X3NpemVzWzBdID0gaTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogaGFyZGNvZGVkIHRhYmxlcyAqLworICAgICAgICAgICAgICAgIHRhYmxlID0gTlVMTDsKKyAgICAgICAgICAgICAgICBhICAgICA9IHMtPmZyYW1lX2xlbl9iaXRzIC0gQkxPQ0tfTUlOX0JJVFMgLSBrOworICAgICAgICAgICAgICAgIGlmIChhIDwgMykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlID49IDQ0MTAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBleHBvbmVudF9iYW5kXzQ0MTAwW2FdOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhdmN0eC0+c2FtcGxlX3JhdGUgPj0gMzIwMDApCisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IGV4cG9uZW50X2JhbmRfMzIwMDBbYV07CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5zYW1wbGVfcmF0ZSA+PSAyMjA1MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gZXhwb25lbnRfYmFuZF8yMjA1MFthXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIG4gPSAqdGFibGUrKzsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmV4cG9uZW50X2JhbmRzW2tdW2ldID0gdGFibGVbaV07CisgICAgICAgICAgICAgICAgICAgIHMtPmV4cG9uZW50X3NpemVzW2tdID0gbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBqICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbHBvcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhICAgICA9IGZmX3dtYV9jcml0aWNhbF9mcmVxc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgICAgID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgcG9zICAgPSAoKGJsb2NrX2xlbiAqIDIgKiBhKSArIChiIDw8IDEpKSAvICg0ICogYik7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPDw9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zID4gYmxvY2tfbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGJsb2NrX2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPiBscG9zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmV4cG9uZW50X2JhbmRzW2tdW2orK10gPSBwb3MgLSBscG9zOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBibG9ja19sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBscG9zID0gcG9zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMtPmV4cG9uZW50X3NpemVzW2tdID0gajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIG1heCBudW1iZXIgb2YgY29lZnMgKi8KKyAgICAgICAgICAgIHMtPmNvZWZzX2VuZFtrXSA9IChzLT5mcmFtZV9sZW4gLSAoKHMtPmZyYW1lX2xlbiAqIDkpIC8gMTAwKSkgPj4gazsKKyAgICAgICAgICAgIC8qIGhpZ2ggZnJlcSBjb21wdXRhdGlvbiAqLworICAgICAgICAgICAgcy0+aGlnaF9iYW5kX3N0YXJ0W2tdID0gKGludCkgKChibG9ja19sZW4gKiAyICogaGlnaF9mcmVxKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlICsgMC41KTsKKyAgICAgICAgICAgIG4gICA9IHMtPmV4cG9uZW50X3NpemVzW2tdOworICAgICAgICAgICAgaiAgID0gMDsKKyAgICAgICAgICAgIHBvcyA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBlbmQ7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBwb3M7CisgICAgICAgICAgICAgICAgcG9zICArPSBzLT5leHBvbmVudF9iYW5kc1trXVtpXTsKKyAgICAgICAgICAgICAgICBlbmQgICA9IHBvczsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCBzLT5oaWdoX2JhbmRfc3RhcnRba10pCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcy0+aGlnaF9iYW5kX3N0YXJ0W2tdOworICAgICAgICAgICAgICAgIGlmIChlbmQgPiBzLT5jb2Vmc19lbmRba10pCisgICAgICAgICAgICAgICAgICAgIGVuZCA9IHMtPmNvZWZzX2VuZFtrXTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kID4gc3RhcnQpCisgICAgICAgICAgICAgICAgICAgIHMtPmV4cG9uZW50X2hpZ2hfYmFuZHNba11baisrXSA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+ZXhwb25lbnRfaGlnaF9zaXplc1trXSA9IGo7CisjaWYgMAorICAgICAgICAgICAgdHByaW50ZihzLT5hdmN0eCwgIiU1ZDogY29lZnNfZW5kPSVkIGhpZ2hfYmFuZF9zdGFydD0lZCBuYl9oaWdoX2JhbmRzPSVkOiAiLAorICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZV9sZW4gPj4gaywKKyAgICAgICAgICAgICAgICAgICAgcy0+Y29lZnNfZW5kW2tdLAorICAgICAgICAgICAgICAgICAgICBzLT5oaWdoX2JhbmRfc3RhcnRba10sCisgICAgICAgICAgICAgICAgICAgIHMtPmV4cG9uZW50X2hpZ2hfc2l6ZXNba10pOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPmV4cG9uZW50X2hpZ2hfc2l6ZXNba107IGorKykKKyAgICAgICAgICAgICAgICB0cHJpbnRmKHMtPmF2Y3R4LCAiICVkIiwgcy0+ZXhwb25lbnRfaGlnaF9iYW5kc1trXVtqXSk7CisgICAgICAgICAgICB0cHJpbnRmKHMtPmF2Y3R4LCAiXG4iKTsKKyNlbmRpZiAvKiAwICovCisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBUUkFDRQorICAgIHsKKyAgICAgICAgaW50IGksIGo7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9ibG9ja19zaXplczsgaSsrKSB7CisgICAgICAgICAgICB0cHJpbnRmKHMtPmF2Y3R4LCAiJTVkOiBuPSUyZDoiLAorICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZV9sZW4gPj4gaSwKKyAgICAgICAgICAgICAgICAgICAgcy0+ZXhwb25lbnRfc2l6ZXNbaV0pOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPmV4cG9uZW50X3NpemVzW2ldOyBqKyspCisgICAgICAgICAgICAgICAgdHByaW50ZihzLT5hdmN0eCwgIiAlZCIsIHMtPmV4cG9uZW50X2JhbmRzW2ldW2pdKTsKKyAgICAgICAgICAgIHRwcmludGYocy0+YXZjdHgsICJcbiIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFRSQUNFICovCisKKyAgICAvKiBpbml0IE1EQ1Qgd2luZG93cyA6IHNpbXBsZSBzaW5lIHdpbmRvdyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9ibG9ja19zaXplczsgaSsrKSB7CisgICAgICAgIGZmX2luaXRfZmZfc2luZV93aW5kb3dzKHMtPmZyYW1lX2xlbl9iaXRzIC0gaSk7CisgICAgICAgIHMtPndpbmRvd3NbaV0gPSBmZl9zaW5lX3dpbmRvd3Nbcy0+ZnJhbWVfbGVuX2JpdHMgLSBpXTsKKyAgICB9CisKKyAgICBzLT5yZXNldF9ibG9ja19sZW5ndGhzID0gMTsKKworICAgIGlmIChzLT51c2Vfbm9pc2VfY29kaW5nKSB7CisgICAgICAgIC8qIGluaXQgdGhlIG5vaXNlIGdlbmVyYXRvciAqLworICAgICAgICBpZiAocy0+dXNlX2V4cF92bGMpCisgICAgICAgICAgICBzLT5ub2lzZV9tdWx0ID0gMC4wMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+bm9pc2VfbXVsdCA9IDAuMDQ7CisKKyNpZmRlZiBUUkFDRQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTk9JU0VfVEFCX1NJWkU7IGkrKykKKyAgICAgICAgICAgIHMtPm5vaXNlX3RhYmxlW2ldID0gMS4wICogcy0+bm9pc2VfbXVsdDsKKyNlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZWVkOworICAgICAgICAgICAgZmxvYXQgbm9ybTsKKyAgICAgICAgICAgIHNlZWQgPSAxOworICAgICAgICAgICAgbm9ybSA9ICgxLjAgLyAoZmxvYXQpICgxTEwgPDwgMzEpKSAqIHNxcnQoMykgKiBzLT5ub2lzZV9tdWx0OworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5PSVNFX1RBQl9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzZWVkICAgICAgICAgICAgICA9IHNlZWQgKiAzMTQxNTkgKyAxOworICAgICAgICAgICAgICAgIHMtPm5vaXNlX3RhYmxlW2ldID0gKGZsb2F0KSAoKGludCkgc2VlZCkgKiBub3JtOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogVFJBQ0UgKi8KKyAgICB9CisKKyAgICBzLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBpZiAoIXMtPmZkc3ApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBjaG9vc2UgdGhlIFZMQyB0YWJsZXMgZm9yIHRoZSBjb2VmZmljaWVudHMgKi8KKyAgICBjb2VmX3ZsY190YWJsZSA9IDI7CisgICAgaWYgKGF2Y3R4LT5zYW1wbGVfcmF0ZSA+PSAzMjAwMCkgeworICAgICAgICBpZiAoYnBzMSA8IDAuNzIpCisgICAgICAgICAgICBjb2VmX3ZsY190YWJsZSA9IDA7CisgICAgICAgIGVsc2UgaWYgKGJwczEgPCAxLjE2KQorICAgICAgICAgICAgY29lZl92bGNfdGFibGUgPSAxOworICAgIH0KKyAgICBzLT5jb2VmX3ZsY3NbMF0gPSAmY29lZl92bGNzW2NvZWZfdmxjX3RhYmxlICogMl07CisgICAgcy0+Y29lZl92bGNzWzFdID0gJmNvZWZfdmxjc1tjb2VmX3ZsY190YWJsZSAqIDIgKyAxXTsKKyAgICBpbml0X2NvZWZfdmxjKCZzLT5jb2VmX3ZsY1swXSwgJnMtPnJ1bl90YWJsZVswXSwgJnMtPmxldmVsX3RhYmxlWzBdLAorICAgICAgICAgICAgICAgICAgJnMtPmludF90YWJsZVswXSwgcy0+Y29lZl92bGNzWzBdKTsKKyAgICBpbml0X2NvZWZfdmxjKCZzLT5jb2VmX3ZsY1sxXSwgJnMtPnJ1bl90YWJsZVsxXSwgJnMtPmxldmVsX3RhYmxlWzFdLAorICAgICAgICAgICAgICAgICAgJnMtPmludF90YWJsZVsxXSwgcy0+Y29lZl92bGNzWzFdKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfd21hX3RvdGFsX2dhaW5fdG9fYml0cyhpbnQgdG90YWxfZ2FpbikKK3sKKyAgICBpZiAodG90YWxfZ2FpbiA8IDE1KQorICAgICAgICByZXR1cm4gMTM7CisgICAgZWxzZSBpZiAodG90YWxfZ2FpbiA8IDMyKQorICAgICAgICByZXR1cm4gMTI7CisgICAgZWxzZSBpZiAodG90YWxfZ2FpbiA8IDQwKQorICAgICAgICByZXR1cm4gMTE7CisgICAgZWxzZSBpZiAodG90YWxfZ2FpbiA8IDQ1KQorICAgICAgICByZXR1cm4gMTA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gIDk7Cit9CisKK2ludCBmZl93bWFfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBXTUFDb2RlY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2Jsb2NrX3NpemVzOyBpKyspCisgICAgICAgIGZmX21kY3RfZW5kKCZzLT5tZGN0X2N0eFtpXSk7CisKKyAgICBpZiAocy0+dXNlX2V4cF92bGMpCisgICAgICAgIGZmX2ZyZWVfdmxjKCZzLT5leHBfdmxjKTsKKyAgICBpZiAocy0+dXNlX25vaXNlX2NvZGluZykKKyAgICAgICAgZmZfZnJlZV92bGMoJnMtPmhnYWluX3ZsYyk7CisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBmZl9mcmVlX3ZsYygmcy0+Y29lZl92bGNbaV0pOworICAgICAgICBhdl9mcmVlcCgmcy0+cnVuX3RhYmxlW2ldKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmxldmVsX3RhYmxlW2ldKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmludF90YWJsZVtpXSk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZzLT5mZHNwKTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSBhbiB1bmNvbXByZXNzZWQgY29lZmZpY2llbnQuCisgKiBAcGFyYW0gZ2IgR2V0Qml0Q29udGV4dAorICogQHJldHVybiB0aGUgZGVjb2RlZCBjb2VmZmljaWVudAorICovCit1bnNpZ25lZCBpbnQgZmZfd21hX2dldF9sYXJnZV92YWwoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgLyoqIGNvbnN1bWVzIHVwIHRvIDM0IGJpdHMgKi8KKyAgICBpbnQgbl9iaXRzID0gODsKKyAgICAvKiogZGVjb2RlIGxlbmd0aCAqLworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIG5fYml0cyArPSA4OworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgbl9iaXRzICs9IDg7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgICAgICAgICBuX2JpdHMgKz0gNzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZ2V0X2JpdHNfbG9uZyhnYiwgbl9iaXRzKTsKK30KKworLyoqCisgKiBEZWNvZGUgcnVuIGxldmVsIGNvbXByZXNzZWQgY29lZmZpY2llbnRzLgorICogQHBhcmFtIGF2Y3R4IGNvZGVjIGNvbnRleHQKKyAqIEBwYXJhbSBnYiBiaXRzdHJlYW0gcmVhZGVyIGNvbnRleHQKKyAqIEBwYXJhbSB2bGMgdmxjIHRhYmxlIGZvciBnZXRfdmxjMgorICogQHBhcmFtIGxldmVsX3RhYmxlIGxldmVsIGNvZGVzCisgKiBAcGFyYW0gcnVuX3RhYmxlIHJ1biBjb2RlcworICogQHBhcmFtIHZlcnNpb24gMCBmb3Igd21hMSwyIDEgZm9yIHdtYXBybworICogQHBhcmFtIHB0ciBvdXRwdXQgYnVmZmVyCisgKiBAcGFyYW0gb2Zmc2V0IG9mZnNldCBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtIG51bV9jb2VmcyBudW1iZXIgb2YgaW5wdXQgY29lZmZpY2VudHMKKyAqIEBwYXJhbSBibG9ja19sZW4gaW5wdXQgYnVmZmVyIGxlbmd0aCAoMl5uKQorICogQHBhcmFtIGZyYW1lX2xlbl9iaXRzIG51bWJlciBvZiBiaXRzIGZvciBlc2NhcGVkIHJ1biBjb2RlcworICogQHBhcmFtIGNvZWZfbmJfYml0cyBudW1iZXIgb2YgYml0cyBmb3IgZXNjYXBlZCBsZXZlbCBjb2RlcworICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZQorICovCitpbnQgZmZfd21hX3J1bl9sZXZlbF9kZWNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEMgKnZsYywgY29uc3QgZmxvYXQgKmxldmVsX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpydW5fdGFibGUsIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNQUNvZWYgKnB0ciwgaW50IG9mZnNldCwgaW50IG51bV9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfbGVuLCBpbnQgZnJhbWVfbGVuX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZWZfbmJfYml0cykKK3sKKyAgICBpbnQgY29kZSwgbGV2ZWwsIHNpZ247CisgICAgY29uc3QgdWludDMyX3QgKmlsdmwgPSAoY29uc3QgdWludDMyX3QgKikgbGV2ZWxfdGFibGU7CisgICAgdWludDMyX3QgKmlwdHIgPSAodWludDMyX3QgKikgcHRyOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb2VmX21hc2sgPSBibG9ja19sZW4gLSAxOworICAgIGZvciAoOyBvZmZzZXQgPCBudW1fY29lZnM7IG9mZnNldCsrKSB7CisgICAgICAgIGNvZGUgPSBnZXRfdmxjMihnYiwgdmxjLT50YWJsZSwgVkxDQklUUywgVkxDTUFYKTsKKyAgICAgICAgaWYgKGNvZGUgPiAxKSB7CisgICAgICAgICAgICAvKiogbm9ybWFsIGNvZGUgKi8KKyAgICAgICAgICAgIG9mZnNldCAgICAgICAgICAgICAgICAgICs9IHJ1bl90YWJsZVtjb2RlXTsKKyAgICAgICAgICAgIHNpZ24gICAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzMShnYikgLSAxOworICAgICAgICAgICAgaXB0cltvZmZzZXQgJiBjb2VmX21hc2tdID0gaWx2bFtjb2RlXSBeIHNpZ24gPDwgMzE7CisgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAxKSB7CisgICAgICAgICAgICAvKiogRU9CICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qKiBlc2NhcGUgKi8KKyAgICAgICAgICAgIGlmICghdmVyc2lvbikgeworICAgICAgICAgICAgICAgIGxldmVsID0gZ2V0X2JpdHMoZ2IsIGNvZWZfbmJfYml0cyk7CisgICAgICAgICAgICAgICAgLyoqIE5PVEU6IHRoaXMgaXMgcmF0aGVyIHN1Ym9wdGltYWwuIHJlYWRpbmcKKyAgICAgICAgICAgICAgICAgKiAgYmxvY2tfbGVuX2JpdHMgd291bGQgYmUgYmV0dGVyICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGdldF9iaXRzKGdiLCBmcmFtZV9sZW5fYml0cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxldmVsID0gZmZfd21hX2dldF9sYXJnZV92YWwoZ2IpOworICAgICAgICAgICAgICAgIC8qKiBlc2NhcGUgZGVjb2RlICovCisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJicm9rZW4gZXNjYXBlIHNlcXVlbmNlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gZ2V0X2JpdHMoZ2IsIGZyYW1lX2xlbl9iaXRzKSArIDQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGdldF9iaXRzKGdiLCAyKSArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2lnbiAgICAgICAgICAgICAgICAgICAgPSBnZXRfYml0czEoZ2IpIC0gMTsKKyAgICAgICAgICAgIHB0cltvZmZzZXQgJiBjb2VmX21hc2tdID0gKGxldmVsIF4gc2lnbikgLSBzaWduOworICAgICAgICB9CisgICAgfQorICAgIC8qKiBOT1RFOiBFT0IgY2FuIGJlIG9taXR0ZWQgKi8KKyAgICBpZiAob2Zmc2V0ID4gbnVtX2NvZWZzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAib3ZlcmZsb3cgaW4gc3BlY3RyYWwgUkxFLCBpZ25vcmluZ1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dtYS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvd21hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzMmI4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtYS5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogV01BIGNvbXBhdGlibGUgY29kZWMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA3IFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfV01BX0gKKyNkZWZpbmUgQVZDT0RFQ19XTUFfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorCisjaW5jbHVkZSAiZmZ0LmgiCisjaW5jbHVkZSAiZm10Y29udmVydC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKworLyogc2l6ZSBvZiBibG9ja3MgKi8KKyNkZWZpbmUgQkxPQ0tfTUlOX0JJVFMgNworI2RlZmluZSBCTE9DS19NQVhfQklUUyAxMQorI2RlZmluZSBCTE9DS19NQVhfU0laRSAoMSA8PCBCTE9DS19NQVhfQklUUykKKworI2RlZmluZSBCTE9DS19OQl9TSVpFUyAoQkxPQ0tfTUFYX0JJVFMgLSBCTE9DS19NSU5fQklUUyArIDEpCisKKy8qIFhYWDogZmluZCBleGFjdCBtYXggc2l6ZSAqLworI2RlZmluZSBISUdIX0JBTkRfTUFYX1NJWkUgMTYKKworI2RlZmluZSBOQl9MU1BfQ09FRlMgMTAKKworLyogWFhYOiBpcyBpdCBhIHN1aXRhYmxlIHZhbHVlID8gKi8KKyNkZWZpbmUgTUFYX0NPREVEX1NVUEVSRlJBTUVfU0laRSAxNjM4NAorCisjZGVmaW5lIE1BWF9DSEFOTkVMUyAyCisKKyNkZWZpbmUgTk9JU0VfVEFCX1NJWkUgODE5MgorCisjZGVmaW5lIExTUF9QT1dfQklUUyA3CisKKy8vIEZJWE1FIHNob3VsZCBiZSBpbiB3bWFkZWMKKyNkZWZpbmUgVkxDQklUUyA5CisjZGVmaW5lIFZMQ01BWCAoKDIyICsgVkxDQklUUyAtIDEpIC8gVkxDQklUUykKKwordHlwZWRlZiBmbG9hdCBXTUFDb2VmOyAgICAgICAgICAvLy88IHR5cGUgZm9yIGRlY29kZWQgY29lZmZpY2llbnRzLCBpbnQxNl90IHdvdWxkIGJlIGVub3VnaCBmb3Igd21hIDEvMgorCit0eXBlZGVmIHN0cnVjdCBDb2VmVkxDVGFibGUgeworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgICAvLy88IHRvdGFsIG51bWJlciBvZiBjb2RlcworICAgIGludCBtYXhfbGV2ZWw7CisgICAgY29uc3QgdWludDMyX3QgKmh1ZmZjb2RlczsgIC8vLzwgVkxDIGJpdCB2YWx1ZXMKKyAgICBjb25zdCB1aW50OF90ICpodWZmYml0czsgICAgLy8vPCBWTEMgYml0IHNpemUKKyAgICBjb25zdCB1aW50MTZfdCAqbGV2ZWxzOyAgICAgLy8vPCB0YWJsZSB0byBidWlsZCBydW4vbGV2ZWwgdGFibGVzCit9IENvZWZWTENUYWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgV01BQ29kZWNDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIGludCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IDEgPSAweDE2MCAoV01BVjEpLCAyID0gMHgxNjEgKFdNQVYyKQorICAgIGludCB1c2VfYml0X3Jlc2Vydm9pcjsKKyAgICBpbnQgdXNlX3ZhcmlhYmxlX2Jsb2NrX2xlbjsKKyAgICBpbnQgdXNlX2V4cF92bGM7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBleHBvbmVudCBjb2Rpbmc6IDAgPSBsc3AsIDEgPSB2bGMgKyBkZWx0YQorICAgIGludCB1c2Vfbm9pc2VfY29kaW5nOyAgICAgICAgICAgICAgICAgICAvLy88IHRydWUgaWYgcGVyY2VwdHVhbCBub2lzZSBpcyBhZGRlZAorICAgIGludCBieXRlX29mZnNldF9iaXRzOworICAgIFZMQyBleHBfdmxjOworICAgIGludCBleHBvbmVudF9zaXplc1tCTE9DS19OQl9TSVpFU107CisgICAgdWludDE2X3QgZXhwb25lbnRfYmFuZHNbQkxPQ0tfTkJfU0laRVNdWzI1XTsKKyAgICBpbnQgaGlnaF9iYW5kX3N0YXJ0W0JMT0NLX05CX1NJWkVTXTsgICAgLy8vPCBpbmRleCBvZiBmaXJzdCBjb2VmIGluIGhpZ2ggYmFuZAorICAgIGludCBjb2Vmc19zdGFydDsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZpcnN0IGNvZGVkIGNvZWYKKyAgICBpbnQgY29lZnNfZW5kW0JMT0NLX05CX1NJWkVTXTsgICAgICAgICAgLy8vPCBtYXggbnVtYmVyIG9mIGNvZGVkIGNvZWZmaWNpZW50cworICAgIGludCBleHBvbmVudF9oaWdoX3NpemVzW0JMT0NLX05CX1NJWkVTXTsKKyAgICBpbnQgZXhwb25lbnRfaGlnaF9iYW5kc1tCTE9DS19OQl9TSVpFU11bSElHSF9CQU5EX01BWF9TSVpFXTsKKyAgICBWTEMgaGdhaW5fdmxjOworCisgICAgLyogY29kZWQgdmFsdWVzIGluIGhpZ2ggYmFuZHMgKi8KKyAgICBpbnQgaGlnaF9iYW5kX2NvZGVkW01BWF9DSEFOTkVMU11bSElHSF9CQU5EX01BWF9TSVpFXTsKKyAgICBpbnQgaGlnaF9iYW5kX3ZhbHVlc1tNQVhfQ0hBTk5FTFNdW0hJR0hfQkFORF9NQVhfU0laRV07CisKKyAgICAvKiB0aGVyZSBhcmUgdHdvIHBvc3NpYmxlIHRhYmxlcyBmb3Igc3BlY3RyYWwgY29lZmZpY2llbnRzICovCisvLyBGSVhNRSB0aGUgZm9sbG93aW5nIDMgdGFibGVzIHNob3VsZCBiZSBzaGFyZWQgYmV0d2VlbiBkZWNvZGVycworICAgIFZMQyBjb2VmX3ZsY1syXTsKKyAgICB1aW50MTZfdCAqcnVuX3RhYmxlWzJdOworICAgIGZsb2F0ICpsZXZlbF90YWJsZVsyXTsKKyAgICB1aW50MTZfdCAqaW50X3RhYmxlWzJdOworICAgIGNvbnN0IENvZWZWTENUYWJsZSAqY29lZl92bGNzWzJdOworICAgIC8qIGZyYW1lIGluZm8gKi8KKyAgICBpbnQgZnJhbWVfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmcmFtZSBsZW5ndGggaW4gc2FtcGxlcworICAgIGludCBmcmFtZV9sZW5fYml0czsgICAgICAgICAgICAgICAgICAgICAvLy88IGZyYW1lX2xlbiA9IDEgPDwgZnJhbWVfbGVuX2JpdHMKKyAgICBpbnQgbmJfYmxvY2tfc2l6ZXM7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgYmxvY2sgc2l6ZXMKKyAgICAvKiBibG9jayBpbmZvICovCisgICAgaW50IHJlc2V0X2Jsb2NrX2xlbmd0aHM7CisgICAgaW50IGJsb2NrX2xlbl9iaXRzOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgbG9nMiBvZiBjdXJyZW50IGJsb2NrIGxlbmd0aAorICAgIGludCBuZXh0X2Jsb2NrX2xlbl9iaXRzOyAgICAgICAgICAgICAgICAvLy88IGxvZzIgb2YgbmV4dCBibG9jayBsZW5ndGgKKyAgICBpbnQgcHJldl9ibG9ja19sZW5fYml0czsgICAgICAgICAgICAgICAgLy8vPCBsb2cyIG9mIHByZXYgYmxvY2sgbGVuZ3RoCisgICAgaW50IGJsb2NrX2xlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYmxvY2sgbGVuZ3RoIGluIHNhbXBsZXMKKyAgICBpbnQgYmxvY2tfbnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBibG9jayBudW1iZXIgaW4gY3VycmVudCBmcmFtZQorICAgIGludCBibG9ja19wb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGN1cnJlbnQgcG9zaXRpb24gaW4gZnJhbWUKKyAgICB1aW50OF90IG1zX3N0ZXJlbzsgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0cnVlIGlmIG1pZC9zaWRlIHN0ZXJlbyBtb2RlCisgICAgdWludDhfdCBjaGFubmVsX2NvZGVkW01BWF9DSEFOTkVMU107ICAgIC8vLzwgdHJ1ZSBpZiBjaGFubmVsIGlzIGNvZGVkCisgICAgaW50IGV4cG9uZW50c19ic2l6ZVtNQVhfQ0hBTk5FTFNdOyAgICAgIC8vLzwgbG9nMiByYXRpbyBmcmFtZS9leHAuIGxlbmd0aAorICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGV4cG9uZW50cylbTUFYX0NIQU5ORUxTXVtCTE9DS19NQVhfU0laRV07CisgICAgZmxvYXQgbWF4X2V4cG9uZW50W01BWF9DSEFOTkVMU107CisgICAgV01BQ29lZiBjb2VmczFbTUFYX0NIQU5ORUxTXVtCTE9DS19NQVhfU0laRV07CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgY29lZnMpW01BWF9DSEFOTkVMU11bQkxPQ0tfTUFYX1NJWkVdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgRkZUU2FtcGxlLCBvdXRwdXQpW0JMT0NLX01BWF9TSVpFICogMl07CisgICAgRkZUQ29udGV4dCBtZGN0X2N0eFtCTE9DS19OQl9TSVpFU107CisgICAgY29uc3QgZmxvYXQgKndpbmRvd3NbQkxPQ0tfTkJfU0laRVNdOworICAgIC8qIG91dHB1dCBidWZmZXIgZm9yIG9uZSBmcmFtZSBhbmQgdGhlIGxhc3QgZm9yIElNRENUIHdpbmRvd2luZyAqLworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGZyYW1lX291dClbTUFYX0NIQU5ORUxTXVtCTE9DS19NQVhfU0laRSAqIDJdOworICAgIC8qIGxhc3QgZnJhbWUgaW5mbyAqLworICAgIHVpbnQ4X3QgbGFzdF9zdXBlcmZyYW1lW01BWF9DT0RFRF9TVVBFUkZSQU1FX1NJWkUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFXTsgLyogcGFkZGluZyBhZGRlZCAqLworICAgIGludCBsYXN0X2JpdG9mZnNldDsKKyAgICBpbnQgbGFzdF9zdXBlcmZyYW1lX2xlbjsKKyAgICBmbG9hdCBub2lzZV90YWJsZVtOT0lTRV9UQUJfU0laRV07CisgICAgaW50IG5vaXNlX2luZGV4OworICAgIGZsb2F0IG5vaXNlX211bHQ7IC8qIFhYWDogc3VwcHJlc3MgdGhhdCBhbmQgaW50ZWdyYXRlIGl0IGluIHRoZSBub2lzZSBhcnJheSAqLworICAgIC8qIGxzcF90b19jdXJ2ZSB0YWJsZXMgKi8KKyAgICBmbG9hdCBsc3BfY29zX3RhYmxlW0JMT0NLX01BWF9TSVpFXTsKKyAgICBmbG9hdCBsc3BfcG93X2VfdGFibGVbMjU2XTsKKyAgICBmbG9hdCBsc3BfcG93X21fdGFibGUxWygxIDw8IExTUF9QT1dfQklUUyldOworICAgIGZsb2F0IGxzcF9wb3dfbV90YWJsZTJbKDEgPDwgTFNQX1BPV19CSVRTKV07CisgICAgRm10Q29udmVydENvbnRleHQgZm10X2NvbnY7CisgICAgQVZGbG9hdERTUENvbnRleHQgKmZkc3A7CisKKyNpZmRlZiBUUkFDRQorICAgIGludCBmcmFtZV9jb3VudDsKKyNlbmRpZiAvKiBUUkFDRSAqLworfSBXTUFDb2RlY0NvbnRleHQ7CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl93bWFfaGdhaW5faHVmZmNvZGVzWzM3XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3dtYV9oZ2Fpbl9odWZmYml0c1szN107CitleHRlcm4gY29uc3QgZmxvYXQgZmZfd21hX2xzcF9jb2RlYm9va1tOQl9MU1BfQ09FRlNdWzE2XTsKK2V4dGVybiBjb25zdCB1aW50MzJfdCBmZl9hYWNfc2NhbGVmYWN0b3JfY29kZVsxMjFdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX2FhY19zY2FsZWZhY3Rvcl9iaXRzWzEyMV07CisKK2ludCBmZl93bWFfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBmbGFnczIpOworaW50IGZmX3dtYV90b3RhbF9nYWluX3RvX2JpdHMoaW50IHRvdGFsX2dhaW4pOworaW50IGZmX3dtYV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK3Vuc2lnbmVkIGludCBmZl93bWFfZ2V0X2xhcmdlX3ZhbChHZXRCaXRDb250ZXh0ICpnYik7CitpbnQgZmZfd21hX3J1bl9sZXZlbF9kZWNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEMgKnZsYywgY29uc3QgZmxvYXQgKmxldmVsX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpydW5fdGFibGUsIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNQUNvZWYgKnB0ciwgaW50IG9mZnNldCwgaW50IG51bV9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfbGVuLCBpbnQgZnJhbWVfbGVuX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZWZfbmJfYml0cyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1dNQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy93bWFfY29tbW9uLmMgYi9mZm1wZWcvbGliYXZjb2RlYy93bWFfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxZTBmNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtYV9jb21tb24uYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogY29tbW9uIGNvZGUgc2hhcmVkIGJ5IGFsbCBXTUEgdmFyaWFudHMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisKKyNpbmNsdWRlICJ3bWFfY29tbW9uLmgiCisKKy8qKgorICpAYnJpZWYgR2V0IHRoZSBzYW1wbGVzIHBlciBmcmFtZSBmb3IgdGhpcyBzdHJlYW0uCisgKkBwYXJhbSBzYW1wbGVfcmF0ZSBvdXRwdXQgc2FtcGxlX3JhdGUKKyAqQHBhcmFtIHZlcnNpb24gd21hIHZlcnNpb24KKyAqQHBhcmFtIGRlY29kZV9mbGFncyBjb2RlYyBjb21wcmVzc2lvbiBmZWF0dXJlcworICpAcmV0dXJuIGxvZzIgb2YgdGhlIG51bWJlciBvZiBvdXRwdXQgc2FtcGxlcyBwZXIgZnJhbWUKKyAqLworYXZfY29sZCBpbnQgZmZfd21hX2dldF9mcmFtZV9sZW5fYml0cyhpbnQgc2FtcGxlX3JhdGUsIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVjb2RlX2ZsYWdzKQoreworICAgIGludCBmcmFtZV9sZW5fYml0czsKKworICAgIGlmIChzYW1wbGVfcmF0ZSA8PSAxNjAwMCkKKyAgICAgICAgZnJhbWVfbGVuX2JpdHMgPSA5OworICAgIGVsc2UgaWYgKHNhbXBsZV9yYXRlIDw9IDIyMDUwIHx8IChzYW1wbGVfcmF0ZSA8PSAzMjAwMCAmJiB2ZXJzaW9uID09IDEpKQorICAgICAgICBmcmFtZV9sZW5fYml0cyA9IDEwOworICAgIGVsc2UgaWYgKHNhbXBsZV9yYXRlIDw9IDQ4MDAwIHx8IHZlcnNpb24gPCAzKQorICAgICAgICBmcmFtZV9sZW5fYml0cyA9IDExOworICAgIGVsc2UgaWYgKHNhbXBsZV9yYXRlIDw9IDk2MDAwKQorICAgICAgICBmcmFtZV9sZW5fYml0cyA9IDEyOworICAgIGVsc2UKKyAgICAgICAgZnJhbWVfbGVuX2JpdHMgPSAxMzsKKworICAgIGlmICh2ZXJzaW9uID09IDMpIHsKKyAgICAgICAgaW50IHRtcCA9IGRlY29kZV9mbGFncyAmIDB4NjsKKyAgICAgICAgaWYgKHRtcCA9PSAweDIpCisgICAgICAgICAgICArK2ZyYW1lX2xlbl9iaXRzOworICAgICAgICBlbHNlIGlmICh0bXAgPT0gMHg0KQorICAgICAgICAgICAgLS1mcmFtZV9sZW5fYml0czsKKyAgICAgICAgZWxzZSBpZiAodG1wID09IDB4NikKKyAgICAgICAgICAgIGZyYW1lX2xlbl9iaXRzIC09IDI7CisgICAgfQorCisgICAgcmV0dXJuIGZyYW1lX2xlbl9iaXRzOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvd21hX2NvbW1vbi5oIGIvZmZtcGVnL2xpYmF2Y29kZWMvd21hX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDA0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy93bWFfY29tbW9uLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIGNvbW1vbiBjb2RlIHNoYXJlZCBieSBhbGwgV01BIHZhcmlhbnRzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19XTUFfQ09NTU9OX0gKKyNkZWZpbmUgQVZDT0RFQ19XTUFfQ09NTU9OX0gKKworaW50IGZmX3dtYV9nZXRfZnJhbWVfbGVuX2JpdHMoaW50IHNhbXBsZV9yYXRlLCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZWNvZGVfZmxhZ3MpOworCisjZW5kaWYgLyogQVZDT0RFQ19XTUFfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dtYV9mcmVxcy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvd21hX2ZyZXFzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhMjgzZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtYV9mcmVxcy5jCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAid21hX2ZyZXFzLmgiCisKK2NvbnN0IHVpbnQxNl90IGZmX3dtYV9jcml0aWNhbF9mcmVxc1syNV0gPSB7CisgICAgICAxMDAsICAgMjAwLCAgMzAwLCAgNDAwLCAgNTEwLCAgNjMwLCAgIDc3MCwgICA5MjAsCisgICAgIDEwODAsICAxMjcwLCAxNDgwLCAxNzIwLCAyMDAwLCAyMzIwLCAgMjcwMCwgIDMxNTAsCisgICAgIDM3MDAsICA0NDAwLCA1MzAwLCA2NDAwLCA3NzAwLCA5NTAwLCAxMjAwMCwgMTU1MDAsCisgICAgMjQ1MDAsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvd21hX2ZyZXFzLmggYi9mZm1wZWcvbGliYXZjb2RlYy93bWFfZnJlcXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWM1ZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvd21hX2ZyZXFzLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfV01BX0ZSRVFTX0gKKyNkZWZpbmUgQVZDT0RFQ19XTUFfRlJFUVNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl93bWFfY3JpdGljYWxfZnJlcXNbMjVdOworCisjZW5kaWYgLyogQVZDT0RFQ19XTUFfRlJFUVMgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dtYWRhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtYWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDFjYjE4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvd21hZGF0YS5oCkBAIC0wLDAgKzEsMTM4NCBAQAorLyoKKyAqIFdNQSBjb21wYXRpYmxlIGRlY29kZXIKKyAqIGNvcHlyaWdodCAoYykgMjAwMiBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVmFyaW91cyBXTUEgdGFibGVzLgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19XTUFEQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19XTUFEQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAid21hLmgiCisKKy8qIGZpcnN0IHZhbHVlIGlzIG51bWJlciBvZiBiYW5kcyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXhwb25lbnRfYmFuZF8yMjA1MFszXVsyNV0gPSB7CisgICAgeyAxMCwgIDQsICA4LCAgNCwgIDgsICA4LCAxMiwgMjAsIDI0LCAyNCwgMTYsIH0sCisgICAgeyAxNCwgIDQsICA4LCAgOCwgIDQsIDEyLCAxMiwgMTYsIDI0LCAxNiwgMjAsIDI0LCAzMiwgNDAsIDM2LCB9LAorICAgIHsgMjMsICA0LCAgNCwgIDQsICA4LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxNiwgMTYsCisgICAgICAyNCwgMjQsIDMyLCA0NCwgNDgsIDYwLCA4NCwgNzIsIH0sCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBleHBvbmVudF9iYW5kXzMyMDAwWzNdWzI1XSA9IHsKKyAgICB7IDExLCA0LCA0LCA4LCA0LCAgNCwgMTIsIDE2LCAyNCwgMjAsIDI4LCAgNCwgfSwKKyAgICB7IDE1LCA0LCA4LCA0LCA0LCAgOCwgIDgsIDE2LCAyMCwgMTIsIDIwLCAyMCwgMjgsIDQwLCA1NiwgOCwgfSwKKyAgICB7IDE2LCA4LCA0LCA4LCA4LCAxMiwgMTYsIDIwLCAyNCwgNDAsIDMyLCAzMiwgNDQsIDU2LCA4MCwgMTEyLCAxNiwgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGV4cG9uZW50X2JhbmRfNDQxMDBbM11bMjVdID0geworICAgIHsgMTIsIDQsIDQsIDQsIDQsICA0LCAgOCwgOCwgOCwgMTIsIDE2LCAyMCwgMzYsIH0sCisgICAgeyAxNSwgNCwgOCwgNCwgOCwgIDgsICA0LCA4LCA4LCAxMiwgMTIsIDEyLCAyNCwgMjgsIDQwLCA3NiwgfSwKKyAgICB7IDE3LCA0LCA4LCA4LCA0LCAxMiwgMTIsIDgsIDgsIDI0LCAxNiwgMjAsIDI0LCAzMiwgNDAsIDYwLCA4MCwgMTUyLCB9LAorfTsKKworY29uc3QgdWludDE2X3QgZmZfd21hX2hnYWluX2h1ZmZjb2Rlc1szN10gPSB7CisgICAgMHgwMDAwMywgMHgwMDJlNywgMHgwMDAwMSwgMHgwMDVjZCwgMHgwMDA1ZCwgMHgwMDVjOSwgMHgwMDA1ZSwgMHgwMDAwMywKKyAgICAweDAwMDE2LCAweDAwMDBiLCAweDAwMDAxLCAweDAwMDA2LCAweDAwMDAxLCAweDAwMDA2LCAweDAwMDA0LCAweDAwMDA1LAorICAgIDB4MDAwMDQsIDB4MDAwMDcsIDB4MDAwMDMsIDB4MDAwMDcsIDB4MDAwMDQsIDB4MDAwMGEsIDB4MDAwMGEsIDB4MDAwMDIsCisgICAgMHgwMDAwMywgMHgwMDAwMCwgMHgwMDAwNSwgMHgwMDAwMiwgMHgwMDA1ZiwgMHgwMDAwNCwgMHgwMDAwMywgMHgwMDAwMiwKKyAgICAweDAwNWM4LCAweDAwMGI4LCAweDAwNWNhLCAweDAwNWNiLCAweDAwNWNjLAorfTsKKworY29uc3QgdWludDhfdCBmZl93bWFfaGdhaW5faHVmZmJpdHNbMzddID0geworICAgIDEwLCAxMiwgMTAsIDEzLCAgOSwgMTMsIDksIDgsIDcsICA1LCA1LCAgNCwgNCwgMywgMywgMywKKyAgICAgNCwgIDMsICA0LCAgNCwgIDUsICA1LCA2LCA4LCA3LCAxMCwgOCwgMTAsIDksIDgsIDksIDksCisgICAgMTMsIDEwLCAxMywgMTMsIDEzLAorfTsKKworY29uc3QgZmxvYXQgZmZfd21hX2xzcF9jb2RlYm9va1tOQl9MU1BfQ09FRlNdWzE2XSA9IHsKKyAgICB7ICAxLjk4NzMyODc3LCAgMS45Nzk0NDUyOCwgIDEuOTcxNzkwODgsICAxLjk2MjYwNTQ5LCAgMS45NTAzODM3NCwgIDEuOTMzMzYxMTQsICAxLjkwNzE5MjMyLCAgMS44NjE5MTQxNSwgfSwKKyAgICB7ICAxLjk3MjYwMDAwLCAgMS45NjA4MzE2MCwgIDEuOTQ5ODI1ODYsICAxLjkzODA2MTY0LCAgMS45MjUxNjYwOCwgIDEuOTEwMTAxOTksICAxLjg5MjMyMzMxLCAgMS44NzE0OTgxMiwKKyAgICAgICAxLjg0NTY0ODE4LCAgMS44MTM1ODA2NywgIDEuNzc2MjAwNzAsICAxLjczMjY1MjY0LCAgMS42NzkwNzg1NSwgIDEuNjA5NTkwODEsICAxLjUwODI5NjUwLCAgMS4zMzEyMDMzMCwgfSwKKyAgICB7ICAxLjkwMTA5MTEwLCAgMS44NjQ4MjQyNiwgIDEuODM0MTk2NzEsICAxLjgwMTY4NDUyLCAgMS43NjY1MDExNiwgIDEuNzI4MTYzMjAsICAxLjY4NTAyNzAwLCAgMS42MzczODI1NiwKKyAgICAgICAxLjU4NTAxNTgwLCAgMS41MTc5NTE4MSwgIDEuNDM2Nzk5MDYsICAxLjMzOTUwNTg1LCAgMS4yNDE3NjIwOCwgIDEuMTIyNjA3MjksICAwLjk2NzQ5NjY4LCAgMC43NDA0ODI2NSwgfSwKKyAgICB7ICAxLjc2OTQzODY0LCAgMS42NzgyMjQ2MywgIDEuNTk5NDYzNjUsICAxLjUzNTYwNTgyLCAgMS40NzQ3MDc5NiwgIDEuNDEyMTAxNjcsICAxLjM0NTA5NTM2LCAgMS4yNzMzOTUwNywKKyAgICAgICAxLjE5MzAzODE0LCAgMS4wOTc2NTE2OSwgIDAuOTg4MTg3MjIsICAwLjg3MjM5NDQ2LCAgMC43NDM2OTE3MiwgIDAuNTk3NjgxODQsICAwLjQzMTY4NjMwLCAgMC4xNzk3NzAyMSwgfSwKKyAgICB7ICAxLjQzNDI4MzQ5LCAgMS4zMjAzODM1NCwgIDEuMjEwNzQwODYsICAxLjEwNTc3OTg4LCAgMS4wMDU2MTc0NiwgIDAuOTAzMzU5MjQsICAwLjgwNDM3NDg5LCAgMC43MDcwOTY3MSwKKyAgICAgICAwLjYwNDI3Mzk1LCAgMC40OTgxNDA0OCwgIDAuMzg1MDk1MzksICAwLjI3MTA2ODAwLCAgMC4xNDQwNzQxNiwgIDAuMDAyMTk5MTAsIC0wLjE2NzI1MTQxLCAtMC4zNjkzNjA4NSwgfSwKKyAgICB7ICAwLjk5ODk1Njg3LCAgMC44NDE4ODE2NiwgIDAuNzA3NTM3MzksICAwLjU3OTA2NTk1LCAgMC40NzA1NTU2MywgIDAuMzY5NjY5NjUsICAwLjI2ODI2NjQ4LCAgMC4xNzE2MzM4MCwKKyAgICAgICAwLjA3MjA4MzkyLCAtMC4wMzA2MjkzNiwgLTEuNDAwMzczODgsIC0wLjI1MTI4OTY4LCAtMC4zNzIxMzkzNywgLTAuNTEwNzU2NDYsIC0wLjY0ODg3NTEyLCAtMC44MDMwODAzMSwgfSwKKyAgICB7ICAwLjI2NTE1MjgwLCAgMC4wNjMxMzU1MSwgLTAuMDg4NzIwODAsIC0wLjIxMTAzNTQ4LCAtMC4zMTA2OTY3OCwgLTAuMzk2ODAzMjMsIC0wLjQ3MjIzNDc0LCAtMC41NDE2NzEzNSwKKyAgICAgIC0wLjYxNDQ0NzQwLCAtMC42ODk0MzM0MywgLTAuNzY1ODAyMTEsIC0wLjg1MTcwMDgyLCAtMC45NTI4OTA2MSwgLTEuMDY1MTQ3MDMsIC0xLjIwNTEwNzA3LCAtMS4zNzYxNzc0NiwgfSwKKyAgICB7IC0wLjUzOTQwMzAxLCAtMC43Mzc3MDkyOSwgLTAuODg0MjQ4NzYsIC0xLjAxMTE3OTMwLCAtMS4xMzM4OTA5MSwgLTEuMjY4MzAwNzMsIC0xLjQyMDQxOTg3LCAtMS42MjAzMzkxOSwKKyAgICAgIC0xLjEwMTU4ODA4LCAtMS4xNjUxMjU2NiwgLTEuMjMzMzcxMjgsIC0xLjMwNDE0NDAxLCAtMS4zNzY2MzMxMiwgLTEuNDY4NTM4NDUsIC0xLjU3NjI1Nzk4LCAtMS42Njg5MzYzOCwgfSwKKyAgICB7IC0wLjM4NjAxOTk3LCAtMC41NjAwOTM1MCwgLTAuNjY5Nzg0ODMsIC0wLjc2MDI4NDcxLCAtMC44Mzg0NjA2NCwgLTAuOTA4NjgwODcsIC0wLjk3NDA4ODgxLCAtMS4wMzY5NDk2MiwgfSwKKyAgICB7IC0xLjU2MTQ0OTg5LCAtMS42NTk0NDAzMiwgLTEuNzI2ODk2ODUsIC0xLjc3ODU3NzQwLCAtMS44MjIwMzAxMSwgLTEuODYyMjAwNzksIC0xLjkwMjgzOTgzLCAtMS45NDgyMDQ3OSwgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBjb2VmMF9odWZmY29kZXNbNjY2XSA9IHsKKyAgICAweDAwMjU4LCAweDAwMDNkLCAweDAwMDAwLCAweDAwMDA1LCAweDAwMDA4LCAweDAwMDA4LCAweDAwMDBjLCAweDAwMDFiLAorICAgIDB4MDAwMWYsIDB4MDAwMTUsIDB4MDAwMjQsIDB4MDAwMzIsIDB4MDAwM2EsIDB4MDAwMjYsIDB4MDAwMmMsIDB4MDAwMmYsCisgICAgMHgwMDA0YSwgMHgwMDA0ZCwgMHgwMDA2MSwgMHgwMDA3MCwgMHgwMDA3MywgMHgwMDA0OCwgMHgwMDA1MiwgMHgwMDA1YSwKKyAgICAweDAwMDVkLCAweDAwMDZlLCAweDAwMDk5LCAweDAwMDllLCAweDAwMGMxLCAweDAwMGNlLCAweDAwMGU0LCAweDAwMGYwLAorICAgIDB4MDAwOTMsIDB4MDAwOWUsIDB4MDAwYTIsIDB4MDAwYTEsIDB4MDAwYjgsIDB4MDAwZDIsIDB4MDAwZDMsIDB4MDAxMmUsCisgICAgMHgwMDEzMCwgMHgwMDBkZSwgMHgwMDEyZCwgMHgwMDE5YiwgMHgwMDFlNCwgMHgwMDEzOSwgMHgwMDEzYSwgMHgwMDEzZiwKKyAgICAweDAwMTRmLCAweDAwMTZkLCAweDAwMWEyLCAweDAwMjdjLCAweDAwMjdlLCAweDAwMzMyLCAweDAwMzNjLCAweDAwMzNmLAorICAgIDB4MDAzOGIsIDB4MDAzOTYsIDB4MDAzYzUsIDB4MDAyNzAsIDB4MDAyN2MsIDB4MDAyNWEsIDB4MDAzOTUsIDB4MDAyNDgsCisgICAgMHgwMDRiZCwgMHgwMDRmYiwgMHgwMDY2MiwgMHgwMDY2MSwgMHgwMDcxYiwgMHgwMDRlNiwgMHgwMDRmZiwgMHgwMDY2NiwKKyAgICAweDAwNzFjLCAweDAwNzFhLCAweDAwNzFmLCAweDAwNzk0LCAweDAwNTM2LCAweDAwNGUyLCAweDAwNzhlLCAweDAwNGVlLAorICAgIDB4MDA1MTgsIDB4MDA1MzUsIDB4MDA0ZmIsIDB4MDA3OGQsIDB4MDA1MzAsIDB4MDA2ODAsIDB4MDA2OGYsIDB4MDA1Y2IsCisgICAgMHgwMDk2NSwgMHgwMDZhNiwgMHgwMDk2NywgMHgwMDk3ZiwgMHgwMDY4MiwgMHgwMDZhZSwgMHgwMGNkMCwgMHgwMGUyOCwKKyAgICAweDAwZjEzLCAweDAwZjFmLCAweDAwOWY1LCAweDAwY2QzLCAweDAwZjExLCAweDAwOTI2LCAweDAwOTY0LCAweDAwZjMyLAorICAgIDB4MDBmMTIsIDB4MDBmMzAsIDB4MDA5NjYsIDB4MDBkMGIsIDB4MDBhNjgsIDB4MDBiOTEsIDB4MDA5YzcsIDB4MDBiNzMsCisgICAgMHgwMTJmYSwgMHgwMTMxZCwgMHgwMTNmOSwgMHgwMWNhMCwgMHgwMTk5YywgMHgwMWM3YSwgMHgwMTk4YywgMHgwMTI0OCwKKyAgICAweDAxYzc0LCAweDAxYzY0LCAweDAxMzllLCAweDAxMmZkLCAweDAwYTc3LCAweDAxMmZjLCAweDAxYzdiLCAweDAxMmNhLAorICAgIDB4MDE0Y2MsIDB4MDE0ZDIsIDB4MDE0ZTMsIDB4MDE0ZGMsIDB4MDEyZGMsIDB4MDMzNDQsIDB4MDI1OTgsIDB4MDI2M2MsCisgICAgMHgwMzMzYiwgMHgwMjVlNiwgMHgwMWExYywgMHgwMWUzYywgMHgwMTRlMiwgMHgwMzNkNCwgMHgwMWExMSwgMHgwMzM0OSwKKyAgICAweDAzY2NlLCAweDAxNGUxLCAweDAxYTM0LCAweDAyNzNlLCAweDAyNjI3LCAweDAyNzNmLCAweDAzOGVlLCAweDAzOTcxLAorICAgIDB4MDNjNjcsIDB4MDNjNjEsIDB4MDMzM2QsIDB4MDM4YzIsIDB4MDI2M2YsIDB4MDM4Y2QsIDB4MDI2MzgsIDB4MDJlNDEsCisgICAgMHgwMzUxZiwgMHgwMzM0OCwgMHgwM2M2NiwgMHgwMzU2MiwgMHgwMjk4OSwgMHgwMjdkNSwgMHgwMzMzYywgMHgwMmU0ZiwKKyAgICAweDAzNDNiLCAweDAyZGRmLCAweDA0YmM4LCAweDAyOWMwLCAweDAyZTU3LCAweDA0YzcyLCAweDAyNWI3LCAweDAzNTQ3LAorICAgIDB4MDM1NDAsIDB4MDI5ZDMsIDB4MDRjNDUsIDB4MDI1YmIsIDB4MDY2MDAsIDB4MDRjNzMsIDB4MDRiY2UsIDB4MDM1N2IsCisgICAgMHgwMjlhNiwgMHgwMjlkMiwgMHgwMjYzZSwgMHgwMjk4YSwgMHgwNzE4MywgMHgwNjYwMiwgMHgwNzk1OCwgMHgwNGI2NiwKKyAgICAweDA1MzdkLCAweDA1Mzc1LCAweDA0ZmU5LCAweDA0YjY3LCAweDA3OTlmLCAweDA0YmM5LCAweDA1MWZlLCAweDA2YTNiLAorICAgIDB4MDViYjYsIDB4MDRmYTgsIDB4MDcyOGYsIDB4MDUzNzYsIDB4MDQ5MmMsIDB4MDUzN2UsIDB4MDc5NWEsIDB4MDZhM2MsCisgICAgMHgwZTUxNSwgMHgwNzg4NywgMHgwNjgzYSwgMHgwNTFmOSwgMHgwNTFmZCwgMHgwY2M2YSwgMHgwNmE4YSwgMHgwY2M2ZCwKKyAgICAweDA1YmIzLCAweDA2ODNiLCAweDA1MWZjLCAweDA1Mzc4LCAweDA3MjhlLCAweDA3ODg2LCAweDA1YmI3LCAweDBmMmE0LAorICAgIDB4MDc5NWIsIDB4MDY4M2MsIDB4MDlmYzEsIDB4MDY4M2QsIDB4MGI3NTIsIDB4MDk2NzgsIDB4MGEzZTgsIDB4MDZhYzcsCisgICAgMHgwNTFmMCwgMHgwYjc1OSwgMHgwNmFmMywgMHgwNGI2YiwgMHgwZjJhMCwgMHgwZjJhZCwgMHgwOTZjMywgMHgwZTUxOCwKKyAgICAweDBiNzVjLCAweDBkNDU4LCAweDBjYzZiLCAweDA1MzdjLCAweDA2N2FhLCAweDA0ZmVhLCAweDAzNDNhLCAweDBjYzcxLAorICAgIDB4MDk2N2YsIDB4MDlmYzQsIDB4MDk2YzIsIDB4MGU1MTYsIDB4MGYyYTEsIDB4MGQ0NWMsIDB4MGQ0NWQsIDB4MGQ0NWUsCisgICAgMHgxMmZiOSwgMHgwOTY3ZSwgMHgxOTgyZiwgMHgwOTg4MywgMHgwOTZjNCwgMHgwYjc1MywgMHgxMmZiOCwgMHgwZjJhOCwKKyAgICAweDFjYTIxLCAweDA5NmM1LCAweDBlNTFhLCAweDFjYTI3LCAweDEyZjNjLCAweDBkNDcxLCAweDBmMmFhLCAweDBiNzViLAorICAgIDB4MTJmYmIsIDB4MGYyYTksIDB4MGYyYWMsIDB4MGQ0NWEsIDB4MGI3NGYsIDB4MDk2YzgsIDB4MTZlOTEsIDB4MDk2Y2EsCisgICAgMHgxMmZiZiwgMHgwZDBhNywgMHgxMzEwMywgMHgwZDUxNiwgMHgxNmU5OSwgMHgxMmNiZCwgMHgwYTNlYSwgMHgxOTgyOSwKKyAgICAweDBiNzU1LCAweDI5YmE3LCAweDFjYTI4LCAweDI5YmE1LCAweDE2ZTkzLCAweDE5ODJjLCAweDE5ODI4LCAweDI1OTk0LAorICAgIDB4MGEzZWIsIDB4MWNhMjksIDB4MTZlOTAsIDB4MWNhMjUsIDB4MTk4MmQsIDB4MWNhMjYsIDB4MTZlOWIsIDB4MGI3NTYsCisgICAgMHgwOTY3YywgMHgyNTk5NywgMHgwYjc1ZiwgMHgxOThkMywgMHgwYjc1NywgMHgxOWEyYSwgMHgwZDQ1YiwgMHgwZTUxNywKKyAgICAweDFjYTI0LCAweDFjYTIzLCAweDFjYTIyLCAweDBiNzU4LCAweDE2ZTk3LCAweDBjZDE0LCAweDEzMTAwLCAweDAwMDA3LAorICAgIDB4MDAwM2IsIDB4MDAwNmIsIDB4MDAwOTcsIDB4MDAxMzgsIDB4MDAxMjUsIDB4MDAxNzMsIDB4MDAyNTgsIDB4MDAzMzUsCisgICAgMHgwMDI4ZSwgMHgwMDRjNiwgMHgwMDcxNSwgMHgwMDcyOSwgMHgwMDRlZiwgMHgwMDUxOSwgMHgwMDRlZCwgMHgwMDUzMiwKKyAgICAweDAwNjhjLCAweDAwNjg2LCAweDAwOTc4LCAweDAwZTVkLCAweDAwZTMxLCAweDAwOWY0LCAweDAwYjkyLCAweDAxMmY4LAorICAgIDB4MDBkMDYsIDB4MDBhNjcsIDB4MDBkNDQsIDB4MDBhNzYsIDB4MDBkNTksIDB4MDEyY2QsIDB4MDFjNzgsIDB4MDFjNzUsCisgICAgMHgwMTk5ZiwgMHgwMTk4ZiwgMHgwMWM2NywgMHgwMTRjNiwgMHgwMWM3OSwgMHgwMWM3NiwgMHgwMGI5NCwgMHgwMGQxYiwKKyAgICAweDAxZTMyLCAweDAxZTMxLCAweDAxYWIwLCAweDAxYTA1LCAweDAxYWExLCAweDAzMzNhLCAweDAyNWU1LCAweDAyNjI2LAorICAgIDB4MDM1NDEsIDB4MDM1NDQsIDB4MDM0MjEsIDB4MDM1NDYsIDB4MDJlNTUsIDB4MDJlNTYsIDB4MDQ5MmQsIDB4MDJkZGUsCisgICAgMHgwMjk5YiwgMHgwMmRkYywgMHgwMzU3YSwgMHgwMjQ5YywgMHgwNjY4YiwgMHgxYzc3ZiwgMHgxY2EyMCwgMHgwZDQ1ZiwKKyAgICAweDA5ODg2LCAweDE2ZTlhLCAweDBmMmE3LCAweDBiNzUxLCAweDBhM2VlLCAweDBjZjU5LCAweDBjZjU3LCAweDBiNzU0LAorICAgIDB4MGQwYTYsIDB4MTZlOTgsIDB4MGI3NjAsIDB4MDZhYzYsIDB4MGEzZjAsIDB4MTJmYmUsIDB4MTMxMDQsIDB4MGYyYTUsCisgICAgMHgwYTNlZiwgMHgwZDQ3MiwgMHgxMmNiYSwgMHgxOTgyZSwgMHgxNmU5YywgMHgxYzc3ZSwgMHgxOThkMCwgMHgxMzEwNSwKKyAgICAweDE2ZTkyLCAweDBiNzVkLCAweDBkNDU5LCAweDAwMDFhLCAweDAwMGMwLCAweDAwMTZjLCAweDAwM2NkLCAweDAwMzUwLAorICAgIDB4MDA2N2IsIDB4MDA1MWUsIDB4MDA2YTksIDB4MDA5ZjQsIDB4MDBiNzIsIDB4MDBkMDksIDB4MDEyNDksIDB4MDFlM2QsCisgICAgMHgwMWNhMSwgMHgwMWExZiwgMHgwMTcyMSwgMHgwMWE4YSwgMHgwMTZlOCwgMHgwMzM0NywgMHgwMWEzNSwgMHgwMjQ5ZCwKKyAgICAweDAyOTlhLCAweDAyNTk2LCAweDAyZTRlLCAweDAyOThiLCAweDA3MTgyLCAweDA0YzQ2LCAweDAyNWJhLCAweDAyZTQwLAorICAgIDB4MDI3ZDYsIDB4MDRmZTgsIDB4MDY2MDcsIDB4MDUzMTAsIDB4MDk4ODQsIDB4MDcyZTEsIDB4MDZhM2QsIDB4MDRiNmEsCisgICAgMHgwNGM3YSwgMHgwNjYwMywgMHgwNGM3YiwgMHgwMzQyOCwgMHgwNjYwNSwgMHgwOTY2NCwgMHgwOWZjMCwgMHgwNzFkZSwKKyAgICAweDA2NjAxLCAweDA1YmIyLCAweDA5ODg1LCAweDBhM2UyLCAweDFjNjFmLCAweDEyY2JiLCAweDBiNzUwLCAweDBjZjU4LAorICAgIDB4MDk2N2QsIDB4MjU5OTUsIDB4NjY4YWQsIDB4MGI3NWEsIDB4MDlmYzIsIDB4MDUzN2YsIDB4MGI3NWUsIDB4MTNmYWUsCisgICAgMHgxMmZiYywgMHgwMDAzMSwgMHgwMDFjNCwgMHgwMDRjNSwgMHgwMDViOCwgMHgwMGNmNCwgMHgwMDk2ZiwgMHgwMGQ0NiwKKyAgICAweDAxZTU3LCAweDAxYTA0LCAweDAyNjI1LCAweDAzMzQ2LCAweDAyOGY5LCAweDA0YzQ3LCAweDA3MmUwLCAweDA0YjY5LAorICAgIDB4MDM0MjAsIDB4MDc5NTcsIDB4MDY2MzksIDB4MDc5OWUsIDB4MDc5NTksIDB4MDc4ODEsIDB4MDRiNjgsIDB4MDlmYzMsCisgICAgMHgwOWZkNiwgMHgwY2M3MCwgMHgwYTNmMSwgMHgxMmNiZSwgMHgwZTMwZSwgMHgwZTUxYiwgMHgwNmFmMiwgMHgxMmNiYywKKyAgICAweDFjNzdkLCAweDBmMmFiLCAweDEyZmJkLCAweDFhYTJmLCAweDBhM2VjLCAweDBkNDczLCAweDA1Mzc3LCAweDBhM2U5LAorICAgIDB4MTk4MmIsIDB4MGUzMDAsIDB4MTJmM2YsIDB4MGNmNWYsIDB4MDk2YzAsIDB4MzhjM2MsIDB4MTZlOTQsIDB4MTZlOTUsCisgICAgMHgxMmYzZCwgMHgyOWJhNCwgMHgyOWJhNiwgMHgxYzc3YywgMHg2YThiYSwgMHgzNTQ1YywgMHgzMzQ1NywgMHg2NjhhYywKKyAgICAweDZhOGJiLCAweDE2ZTlkLCAweDBlNTE5LCAweDI1OTk2LCAweDEyZjNlLCAweDAwMDM2LCAweDAwMzNlLCAweDAwNmFkLAorICAgIDB4MDBkMDMsIDB4MDEyYzgsIDB4MDEyNGEsIDB4MDNjNDIsIDB4MDNjY2QsIDB4MDY2MDYsIDB4MDc4ODAsIDB4MDY4NTIsCisgICAgMHgwNmEzYSwgMHgwNWJiNCwgMHgwZjJhMiwgMHgwOWZjNywgMHgxMmNiOSwgMHgwY2M2YywgMHgwYTZlOCwgMHgwOTZjMSwKKyAgICAweDAwMDRhLCAweDAwMzU1LCAweDAxMmY5LCAweDAxNGU4LCAweDAxYWJlLCAweDAyNWI2LCAweDA0OTJlLCAweDA5ZmM2LAorICAgIDB4MDUxZmYsIDB4MGNjNmYsIDB4MDk2Y2IsIDB4MGQwNzEsIDB4MTk4ZDEsIDB4MTJjYjgsIDB4MzhjM2QsIDB4MTNmYWYsCisgICAgMHgwOTZjOSwgMHgwMDA5ZCwgMHgwMDUzOSwgMHgwMTJjZSwgMHgwMzQxZiwgMHgwMjljMSwgMHgwNGIzMywgMHgwYTNlMywKKyAgICAweDBkMDcwLCAweDE2ZTk2LCAweDBiNzYzLCAweDAwMGEwLCAweDAwOWNlLCAweDAzOGNjLCAweDAzNDNkLCAweDA1MWZhLAorICAgIDB4MDk4ODgsIDB4MTJmYmEsIDB4MDAwZGYsIDB4MDBhNzUsIDB4MDI5YTcsIDB4MDlmYzUsIDB4MGUzMDEsIDB4MDk2N2IsCisgICAgMHgwMDFlNywgMHgwMTJjOSwgMHgwNTFmYiwgMHgwOTg4OSwgMHgwZjJhNiwgMHgwMDE2ZiwgMHgwMWNiOSwgMHgwY2Y1YSwKKyAgICAweDEyY2JmLCAweDA5Njc5LCAweDAwMjcyLCAweDAxYTE1LCAweDA5NjdhLCAweDAwM2NiLCAweDAyNWY2LCAweDBiNzYyLAorICAgIDB4MDAyOGQsIDB4MDNjNjAsIDB4MGNmNWUsIDB4MDAzNTIsIDB4MDNjY2MsIDB4MDA3MmYsIDB4MDcxODYsIDB4MDA0ZWMsCisgICAgMHgwNTM3OSwgMHgwMDY4ZSwgMHgwOTg4NywgMHgwMDZhNywgMHgwNmFmMSwgMHgwMGUyOSwgMHgwY2Y1YiwgMHgwMGYzMSwKKyAgICAweDBkNDcwLCAweDAwOWM2LCAweDAxM2ZiLCAweDEzMTAyLCAweDAxOWE1LCAweDEzMTAxLCAweDAxOTgzLCAweDAxYzY1LAorICAgIDB4MDEyNGYsIDB4MDE0YzcsIDB4MDE3MjYsIDB4MDFhYmYsIDB4MDMzMDQsIDB4MDI2MjQsIDB4MDNjNDEsIDB4MDI3ZDcsCisgICAgMHgwMmRkZCwgMHgwMmU1NCwgMHgwMzQzYywgMHgwNjYwNCwgMHgwNzE4MSwgMHgwNjYzYSwgMHgwNGZhOSwgMHgwNjYzYiwKKyAgICAweDA1MzExLCAweDA1MzdhLCAweDA2ODM5LCAweDA1YmI1LCAweDA0OTJmLCAweDA2YWYwLCAweDA5NmM3LCAweDBjYzZlLAorICAgIDB4MDUzN2IsIDB4MGNmNWMsIDB4MGNmNTYsIDB4MTk4ZDIsIDB4MGNmNWQsIDB4MGEzZWQsIDB4MGYyYTMsIDB4MTk4MmEsCisgICAgMHgwYjc2MSwgMHgwOTZjNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZWYwX2h1ZmZiaXRzWzY2Nl0gPSB7CisgICAgMTEsICA2LCAgMiwgIDMsICA0LCAgNSwgIDUsICA1LAorICAgICA1LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDEwLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTEsIDEyLAorICAgIDEyLCAxMiwgMTIsIDExLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxMywgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwKKyAgICAxNSwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTYsCisgICAgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNSwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTYsIDE1LCAxNiwKKyAgICAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTYsIDE2LAorICAgIDE1LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNiwKKyAgICAxNiwgMTcsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTYsCisgICAgMTcsIDE3LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE2LAorICAgIDE3LCAxNiwgMTcsIDE2LCAxNiwgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNiwgMTcsIDE3LCAxNywgMTYsCisgICAgMTcsIDE3LCAxNiwgMTcsIDE3LCAxNywgMTYsIDE3LAorICAgIDE3LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE4LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxNywgMTcsCisgICAgMTcsIDE5LCAxNywgMTksIDE4LCAxNywgMTcsIDE4LAorICAgIDE3LCAxNywgMTgsIDE3LCAxNywgMTcsIDE4LCAxNywKKyAgICAxNywgMTgsIDE3LCAxNywgMTcsIDE3LCAxNywgMTYsCisgICAgMTcsIDE3LCAxNywgMTcsIDE4LCAxNiwgMTcsICA0LAorICAgICA2LCAgOCwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxNCwgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE3LCAxNywgMTcsCisgICAgMTYsIDE4LCAxNiwgMTcsIDE3LCAxNiwgMTYsIDE3LAorICAgIDE3LCAxOCwgMTcsIDE2LCAxNywgMTcsIDE3LCAxNiwKKyAgICAxNywgMTcsIDE4LCAxNywgMTgsIDE3LCAxNywgMTcsCisgICAgMTgsIDE3LCAxNywgIDUsICA4LCAxMCwgMTAsIDExLAorICAgIDExLCAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxMywKKyAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTUsIDE2LCAxNiwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTUsCisgICAgMTUsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTcsIDE2LAorICAgIDE3LCAxOCwgMTksIDE3LCAxNiwgMTYsIDE3LCAxNywKKyAgICAxNywgIDYsICA5LCAxMSwgMTIsIDEyLCAxMywgMTMsCisgICAgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE2LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE3LCAxOCwgMTYsIDE2LCAxNiwgMTgsCisgICAgMTcsIDE2LCAxNywgMTgsIDE3LCAxNywgMTYsIDE3LAorICAgIDE3LCAxNiwgMTcsIDE2LCAxNywgMTgsIDE4LCAxOCwKKyAgICAxNywgMTksIDE5LCAxNywgMjAsIDE5LCAxOCwgMTksCisgICAgMjAsIDE4LCAxNiwgMTgsIDE3LCAgNywgMTAsIDEyLAorICAgIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTgsIDE2LCAxNywgMTcsCisgICAgIDgsIDExLCAxMywgMTQsIDE0LCAxNSwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTcsIDE3LCAxNywgMTgsIDE4LCAxNywKKyAgICAxNywgIDgsIDEyLCAxNCwgMTUsIDE1LCAxNSwgMTcsCisgICAgMTcsIDE4LCAxNywgIDksIDEyLCAxNCwgMTUsIDE2LAorICAgIDE2LCAxNywgIDksIDEzLCAxNSwgMTYsIDE2LCAxNywKKyAgICAgOSwgMTMsIDE2LCAxNiwgMTYsIDEwLCAxMywgMTYsCisgICAgMTgsIDE3LCAxMCwgMTQsIDE3LCAxMCwgMTQsIDE3LAorICAgIDExLCAxNCwgMTYsIDExLCAxNCwgMTEsIDE1LCAxMiwKKyAgICAxNiwgMTIsIDE2LCAxMiwgMTYsIDEyLCAxNiwgMTIsCisgICAgMTcsIDEzLCAxMywgMTcsIDEzLCAxNywgMTMsIDEzLAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTUsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE3LCAxNiwgMTcsIDE2LCAxNywKKyAgICAxNywgMTcsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgY29lZjFfaHVmZmNvZGVzWzU1NV0gPSB7CisgICAgMHgwMDExNSwgMHgwMDAwMiwgMHgwMDAwMSwgMHgwMDAwMCwgMHgwMDAwZCwgMHgwMDAwNywgMHgwMDAxMywgMHgwMDAxZCwKKyAgICAweDAwMDA4LCAweDAwMDBjLCAweDAwMDIzLCAweDAwMDJiLCAweDAwMDNmLCAweDAwMDE3LCAweDAwMDFiLCAweDAwMDQzLAorICAgIDB4MDAwNDksIDB4MDAwNTAsIDB4MDAwNTUsIDB4MDAwNTQsIDB4MDAwNjcsIDB4MDAwNjQsIDB4MDAwN2IsIDB4MDAwMmQsCisgICAgMHgwMDAyOCwgMHgwMDAyYSwgMHgwMDA4NSwgMHgwMDA4OSwgMHgwMDAyYiwgMHgwMDAzNSwgMHgwMDA5MCwgMHgwMDA5MSwKKyAgICAweDAwMDk0LCAweDAwMDg4LCAweDAwMGMxLCAweDAwMGM2LCAweDAwMGYyLCAweDAwMGUzLCAweDAwMGM1LCAweDAwMGUyLAorICAgIDB4MDAwMzYsIDB4MDAwZjAsIDB4MDAwYTcsIDB4MDAwY2QsIDB4MDAwZmIsIDB4MDAwNTksIDB4MDAxMTYsIDB4MDAxMDMsCisgICAgMHgwMDEwOCwgMHgwMDEyYiwgMHgwMDEyZCwgMHgwMDE4OCwgMHgwMDEyZSwgMHgwMDE0YywgMHgwMDFjMywgMHgwMDE4NywKKyAgICAweDAwMWU3LCAweDAwMDZmLCAweDAwMDk0LCAweDAwMDY5LCAweDAwMWU2LCAweDAwMWNhLCAweDAwMTQ3LCAweDAwMTk1LAorICAgIDB4MDAwYTcsIDB4MDAyMTMsIDB4MDAyMDksIDB4MDAzMDMsIDB4MDAyOTUsIDB4MDAyODksIDB4MDAyOGMsIDB4MDAyOGQsCisgICAgMHgwMDMxMiwgMHgwMDMzMCwgMHgwMDI5YiwgMHgwMDMwOCwgMHgwMDMyOCwgMHgwMDI5YSwgMHgwMDI1ZSwgMHgwMDNjNSwKKyAgICAweDAwMzg0LCAweDAwMzlmLCAweDAwMzk3LCAweDAwMjk2LCAweDAwMzJlLCAweDAwMzMyLCAweDAwM2M2LCAweDAwM2U2LAorICAgIDB4MDAxMmQsIDB4MDAwZDEsIDB4MDA0MDIsIDB4MDAwZGQsIDB4MDAxNjEsIDB4MDAxMmIsIDB4MDAxMjcsIDB4MDA0NWQsCisgICAgMHgwMDYwMSwgMHgwMDRhYiwgMHgwMDQ1ZiwgMHgwMDQxMCwgMHgwMDRiZiwgMHgwMDUyOCwgMHgwMDQ1YywgMHgwMDQyNCwKKyAgICAweDAwNDAwLCAweDAwNTExLCAweDAwNjE4LCAweDAwNzNkLCAweDAwNjNhLCAweDAwNjE0LCAweDAwNzNjLCAweDAwN2MwLAorICAgIDB4MDA3Y2YsIDB4MDA4MDIsIDB4MDA5NjYsIDB4MDA5NjQsIDB4MDA5NTEsIDB4MDA4YTAsIDB4MDAzNDYsIDB4MDA4MDMsCisgICAgMHgwMGE1MiwgMHgwMDI0YSwgMHgwMDdjMSwgMHgwMDYzZiwgMHgwMDEyNiwgMHgwMDQwNiwgMHgwMDc4OSwgMHgwMDhhMiwKKyAgICAweDAwOTYwLCAweDAwOTY3LCAweDAwYzA1LCAweDAwYzcwLCAweDAwYzc5LCAweDAwYTVkLCAweDAwYzI2LCAweDAwYzRkLAorICAgIDB4MDAzNzIsIDB4MDA4YTUsIDB4MDBjMDgsIDB4MDAyYzUsIDB4MDBmMTEsIDB4MDBjYzQsIDB4MDBmOGUsIDB4MDBlMTYsCisgICAgMHgwMDQ5NiwgMHgwMGU3NywgMHgwMGY5YywgMHgwMGMyNSwgMHgwMGYxZSwgMHgwMGMyNywgMHgwMGYxZiwgMHgwMGUxNywKKyAgICAweDAwY2NkLCAweDAwMzU1LCAweDAwYzA5LCAweDAwYzc4LCAweDAwZjkwLCAweDAwNTIxLCAweDAwMzU3LCAweDAwMzU2LAorICAgIDB4MDA2OGUsIDB4MDBmOWQsIDB4MDBjMDQsIDB4MDBlNTgsIDB4MDBhMjAsIDB4MDBhMmMsIDB4MDBjNGMsIDB4MDA1MmYsCisgICAgMHgwMGY4ZCwgMHgwMTE3OCwgMHgwMTA1MywgMHgwMTA5NywgMHgwMTgwZiwgMHgwMTgwZCwgMHgwMTJmYiwgMHgwMTJhYSwKKyAgICAweDAyMDJhLCAweDAwYTQwLCAweDAxOGVkLCAweDAxY2ViLCAweDAxNDU1LCAweDAxOGUzLCAweDAxMmExLCAweDAwMzU0LAorICAgIDB4MDAzNTMsIDB4MDBmMWMsIDB4MDBjN2IsIDB4MDBjMzcsIDB4MDEwMWQsIDB4MDEyY2IsIDB4MDExNDIsIDB4MDE5N2QsCisgICAgMHgwMTA5NSwgMHgwMWUzYiwgMHgwMTg2YiwgMHgwMDU4OCwgMHgwMWMyYSwgMHgwMTRiOCwgMHgwMWUzYSwgMHgwMThlYywKKyAgICAweDAxZjQ2LCAweDAxMmZhLCAweDAwYTUzLCAweDAxY2U4LCAweDAwYTU1LCAweDAxYzI5LCAweDAxMTdiLCAweDAxMDUyLAorICAgIDB4MDEyYTAsIDB4MDA1ODksIDB4MDA5NTAsIDB4MDFjMmIsIDB4MDBhNTAsIDB4MDIwOGIsIDB4MDE4MGUsIDB4MDIwMjcsCisgICAgMHgwMjU1NiwgMHgwMWUyMCwgMHgwMDZlNywgMHgwMWMyOCwgMHgwMTk3YSwgMHgwMDY4NCwgMHgwMjBhMiwgMHgwMWYyMiwKKyAgICAweDAzMDE4LCAweDAzOWNmLCAweDAzZTI1LCAweDAyNTU3LCAweDAyOTRjLCAweDAyOGE2LCAweDAwZDExLCAweDAyOGE5LAorICAgIDB4MDI5NzksIDB4MDBkNDYsIDB4MDBhNTYsIDB4MDM5Y2UsIDB4MDMwY2MsIDB4MDMyOWEsIDB4MDE0OWQsIDB4MDUxMGYsCisgICAgMHgwNDUxYywgMHgwMjAyOCwgMHgwMzI5OSwgMHgwMWNlZCwgMHgwMTRiOSwgMHgwMGY4NSwgMHgwMGM3YSwgMHgwMTgwMCwKKyAgICAweDAwMzQxLCAweDAxMmNhLCAweDAzOWM4LCAweDAzMjlkLCAweDAwZDBkLCAweDAzZTIwLCAweDA1MTQ0LCAweDAwZDQ1LAorICAgIDB4MDMwZDAsIDB4MDE4NmQsIDB4MDMwZDUsIDB4MDBkMGYsIDB4MDBkNDAsIDB4MDQxMTQsIDB4MDIwYTEsIDB4MDI5N2YsCisgICAgMHgwM2UyNCwgMHgwMzJmMSwgMHgwNDA0NywgMHgwMzBkNCwgMHgwMjhhOCwgMHgwMGQwZSwgMHgwNDUxZCwgMHgwNDA0NCwKKyAgICAweDAyOTdlLCAweDA0MDQyLCAweDAzMGQyLCAweDAzMGNmLCAweDAzZTIxLCAweDAzZTI2LCAweDAyOGE1LCAweDA0NTFhLAorICAgIDB4MDBkNDgsIDB4MDFhMTYsIDB4MDBkNDQsIDB4MDQ1MTgsIDB4MDE0OWIsIDB4MDM5Y2EsIDB4MDE0OTgsIDB4MDQwM2QsCisgICAgMHgwNDUxYiwgMHgwMTQ5YywgMHgwMzJmMywgMHgwMzBjYiwgMHgwODA3MywgMHgwM2UyMiwgMHgwNTI5YSwgMHgwMjBhYSwKKyAgICAweDAzOWNjLCAweDA3MzhhLCAweDA2NTMwLCAweDA3Mzg5LCAweDA2MTkzLCAweDA4MDcxLCAweDA0MDQzLCAweDAzMGNlLAorICAgIDB4MDUxNDcsIDB4MDczODgsIDB4MDUxNDUsIDB4MDgwNzIsIDB4MDQ1MjEsIDB4MDBkNDcsIDB4MDI5N2MsIDB4MDMwY2QsCisgICAgMHgwMzBjYSwgMHgwMDAwYiwgMHgwMDAwYywgMHgwMDA4MywgMHgwMDBlNCwgMHgwMDA0OCwgMHgwMDEwMiwgMHgwMDFjYywKKyAgICAweDAwMWY1LCAweDAwMDk3LCAweDAwMjBiLCAweDAwMTI0LCAweDAwNDUzLCAweDAwNjI3LCAweDAwNjM5LCAweDAwNjA1LAorICAgIDB4MDA1MTcsIDB4MDAxYjgsIDB4MDA2NjMsIDB4MDA2NjcsIDB4MDA3YzMsIDB4MDA4MjMsIDB4MDA5NjEsIDB4MDA5NjMsCisgICAgMHgwMGU1YSwgMHgwMGU1OSwgMHgwMGEyYiwgMHgwMGNiZiwgMHgwMDI5MiwgMHgwMGEyZCwgMHgwMDdkMCwgMHgwMDk1MywKKyAgICAweDAwY2M1LCAweDAwZjg0LCAweDAwNGFiLCAweDAxNGE3LCAweDAwNjhhLCAweDAxMTdhLCAweDAwNTJlLCAweDAxNDQyLAorICAgIDB4MDA1MmMsIDB4MDBjNzcsIDB4MDBmOGYsIDB4MDA0YWEsIDB4MDEwOTQsIDB4MDE4MDEsIDB4MDEyYzQsIDB4MDI5N2IsCisgICAgMHgwMDk1MiwgMHgwMWYxOSwgMHgwMDZhNSwgMHgwMTE0OSwgMHgwMTJjNSwgMHgwMTgwMywgMHgwMjJmMiwgMHgwMzI5YiwKKyAgICAweDA0NTIwLCAweDAxNDllLCAweDAwZDEzLCAweDAxZjE2LCAweDAxY2U5LCAweDAxMDFjLCAweDAwNmU2LCAweDAzOWM5LAorICAgIDB4MDYxOTEsIDB4MDdjOGUsIDB4MDYxOTIsIDB4MGNhNjMsIDB4MDM5Y2QsIDB4MDYxOTAsIDB4MDY4ODQsIDB4MDY4ODUsCisgICAgMHgwNzM4MiwgMHgwMGQ0OSwgMHgwMGQ0MSwgMHgwNDUwYywgMHgwMTQ5YSwgMHgwMzBkMSwgMHgwODA3NywgMHgwM2UyMywKKyAgICAweDAxYTE1LCAweDBlNzAxLCAweDBlNzAyLCAweDA4MDc5LCAweDA4MjJhLCAweDBhMjE4LCAweDA3ODg3LCAweDA0MDNmLAorICAgIDB4MDUyMGIsIDB4MDUyOWIsIDB4MGU3MDAsIDB4MDQ1MTksIDB4MDAwMDcsIDB4MDAwZTAsIDB4MDAwZDAsIDB4MDAzOWIsCisgICAgMHgwMDNlNSwgMHgwMDE2MywgMHgwMDYzZSwgMHgwMDdjOSwgMHgwMDgwNiwgMHgwMDk1NCwgMHgwMTA0NCwgMHgwMWY0NCwKKyAgICAweDAxOTdjLCAweDAxZjQ1LCAweDAwYTUxLCAweDAxZjQ3LCAweDAwOTUxLCAweDAwNTJkLCAweDAyMjkxLCAweDAwOTJmLAorICAgIDB4MDBhNTQsIDB4MDBkMTIsIDB4MDI5N2QsIDB4MDBkMGMsIDB4MDE0OTksIDB4MDMyOWUsIDB4MDMyZjAsIDB4MDIwMjUsCisgICAgMHgwMzljNiwgMHgwMGE1NywgMHgwM2U0NiwgMHgwMGQ0MiwgMHgwNzM4YiwgMHgwNTE0NiwgMHgwNDA0NiwgMHgwODA3OCwKKyAgICAweDA1MTBlLCAweDA3ODg2LCAweDAyOTA0LCAweDA0MTU2LCAweDA0MTU3LCAweDA2MDMyLCAweDAzMGQzLCAweDA4YmNlLAorICAgIDB4MDQwNDAsIDB4MDQwM2UsIDB4MGE0MTQsIDB4MTA0NTcsIDB4MDgwNzUsIDB4MDY4ODcsIDB4MDdjOGYsIDB4MDM5YzcsCisgICAgMHgwNzM4NywgMHgwODA3MCwgMHgwOGJjZiwgMHgxNDgyYSwgMHgxMDQ1NiwgMHgxNDgyYiwgMHgwMWExNywgMHgwNjg4NiwKKyAgICAweDA0NTBkLCAweDAwMDEzLCAweDAwMDZiLCAweDAwNjE1LCAweDAwODBiLCAweDAwODJiLCAweDAwOTUyLCAweDAwZTViLAorICAgIDB4MDE4ZTIsIDB4MDE4NmMsIDB4MDFmMTgsIDB4MDMyOWYsIDB4MDBkNDMsIDB4MDNlMjksIDB4MDUxNDAsIDB4MDUxNDEsCisgICAgMHgwY2E2MiwgMHgwNjAzMywgMHgwM2M0MiwgMHgwM2UyOCwgMHgwNDUwZiwgMHgwYTIxYSwgMHgwNzM4NCwgMHgwYTIxOSwKKyAgICAweDBlNzAzLCAweDBhMjFiLCAweDAxYTE0LCAweDA3MzgzLCAweDA0NWU2LCAweDAwMDdhLCAweDAwMTJjLCAweDAwY2NjLAorICAgIDB4MDA2OGYsIDB4MDE4MDIsIDB4MDBhNTIsIDB4MDA5NTMsIDB4MDQwNDUsIDB4MDFhMjAsIDB4MDQ1MWYsIDB4MDAwYTQsCisgICAgMHgwMDczNSwgMHgwMWNlYywgMHgwMjAyOSwgMHgwMjBhMywgMHgwNDUxZSwgMHgwMDA2OSwgMHgwMGMyNCwgMHgwMjAyNCwKKyAgICAweDAzMmYyLCAweDA1MTQyLCAweDAwMTk2LCAweDAwNTIzLCAweDAwMGE2LCAweDAxOTdiLCAweDAwMzBiLCAweDAwOTJlLAorICAgIDB4MDAzZTksIDB4MDNlMjcsIDB4MDAxNjAsIDB4MDUxNDMsIDB4MDA2NTIsIDB4MDQwNDEsIDB4MDA3MzQsIDB4MDI4YTcsCisgICAgMHgwMDgwZiwgMHgwMTQ4MywgMHgwMDk3YywgMHgwMDM0MCwgMHgwMDY4YiwgMHgwMDUyMiwgMHgwMTA1NCwgMHgwMTA5NiwKKyAgICAweDAxZjE3LCAweDAyMDJiLCAweDAxY2VhLCAweDAyMGEwLCAweDAyOTc4LCAweDAyMDI2LCAweDAyOTdhLCAweDAzOWNiLAorICAgIDB4MDNlMmIsIDB4MDE0OWYsIDB4MDMyOWMsIDB4MDczODUsIDB4MDgwNzQsIDB4MDQ1MGUsIDB4MDNlMmEsIDB4MDUxNDksCisgICAgMHgwODA3NiwgMHgwNzM4NiwgMHgwNTE0OCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZWYxX2h1ZmZiaXRzWzU1NV0gPSB7CisgICAgIDksICA1LCAgMiwgIDQsICA0LCAgNSwgIDUsICA1LAorICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDgsCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOSwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAorICAgICA5LCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMywgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsCisgICAgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTQsIDEzLCAxNCwgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDE0LCAxMywgMTQsIDE0LCAxMywgMTQsCisgICAgMTQsIDEzLCAxNCwgMTMsIDEzLCAxNCwgMTQsIDEzLAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsCisgICAgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsIDEzLAorICAgIDEzLCAxMywgMTQsIDE0LCAxNSwgMTQsIDE1LCAxNSwKKyAgICAxNCwgMTMsIDE0LCAxNSwgMTUsIDE1LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNSwgMTQsIDE0LCAxNSwgMTUsIDE1LAorICAgIDE0LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwKKyAgICAxNSwgMTYsIDE1LCAxNSwgMTUsIDE0LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNCwgMTQsIDE2LCAxNCwgMTUsIDE0LAorICAgIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE1LCAxNCwKKyAgICAxNSwgMTUsIDE1LCAxNiwgMTUsIDE1LCAxNCwgMTQsCisgICAgMTQsICA0LCAgNywgIDgsICA4LCAgOSwgIDksICA5LAorICAgICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTIsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTQsCisgICAgMTQsIDEzLCAxNCwgMTMsIDEzLCAxMywgMTQsIDE0LAorICAgIDE1LCAxNSwgMTQsIDEzLCAxMywgMTMsIDE0LCAxNCwKKyAgICAxNSwgMTUsIDE1LCAxNiwgMTQsIDE1LCAxNywgMTcsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTYsIDE0LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwKKyAgICAxNywgMTUsIDE2LCAxNSwgIDYsICA4LCAxMCwgMTAsCisgICAgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLAorICAgIDEzLCAxMywgMTQsIDEzLCAxNCwgMTMsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNSwgMTUsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LAorICAgIDE1LCAxNSwgMTYsIDE1LCAxNSwgMTUsIDE0LCAxNiwKKyAgICAxNSwgMTUsIDE4LCAxNywgMTYsIDE3LCAxNSwgMTQsCisgICAgMTUsIDE2LCAxNiwgMTksIDE3LCAxOSwgMTYsIDE3LAorICAgIDE1LCAgNywgMTAsIDExLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMywgMTMsIDEzLCAxNCwgMTUsIDE0LCAxNSwgMTUsCisgICAgMTYsIDE1LCAxNCwgMTQsIDE1LCAxNiwgMTUsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE1LCAxNSwgIDcsIDExLCAxMiwKKyAgICAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgIDgsCisgICAgMTEsIDEzLCAxNCwgMTQsIDE1LCAgOSwgMTIsIDE0LAorICAgIDE0LCAxNSwgIDksIDEzLCAxMCwgMTMsIDEwLCAxNCwKKyAgICAxMCwgMTQsIDExLCAxNSwgMTEsIDE1LCAxMSwgMTQsCisgICAgMTIsIDE1LCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxNCwgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTUsIDE0LCAxNSwgMTYsIDE1LCAxNCwgMTUsCisgICAgMTYsIDE1LCAxNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBjb2VmMl9odWZmY29kZXNbMTMzNl0gPSB7CisgICAgMHgwMDNlNiwgIDB4MDAwZjYsIDB4MDAwMDAsICAweDAwMDAyLCAgMHgwMDAwNiwgIDB4MDAwMGYsICAweDAwMDFiLCAgMHgwMDAyOCwKKyAgICAweDAwMDM5LCAgMHgwMDAzZiwgMHgwMDA2YiwgIDB4MDAwNzYsICAweDAwMGI3LCAgMHgwMDBlOCwgIDB4MDAwZWYsICAweDAwMTY5LAorICAgIDB4MDAxYTcsICAweDAwMWQ0LCAweDAwMWRjLCAgMHgwMDJjNCwgIDB4MDAzNDksICAweDAwMzU1LCAgMHgwMDM5MSwgIDB4MDAzZGMsCisgICAgMHgwMDU4MSwgIDB4MDA1YjIsIDB4MDA2OTgsICAweDAwNzBjLCAgMHgwMDc1NSwgIDB4MDA3M2EsICAweDAwNzc0LCAgMHgwMDdjZiwKKyAgICAweDAwYjBhLCAgMHgwMGI2NiwgMHgwMGQyZSwgIDB4MDBkNWUsICAweDAwZTFiLCAgMHgwMGVhYywgIDB4MDBlNWEsICAweDAwZjdlLAorICAgIDB4MDBmYTEsICAweDAxNjNlLCAweDAxYTM3LCAgMHgwMWE1MiwgIDB4MDFjMzksICAweDAxYWIzLCAgMHgwMWQ1ZiwgIDB4MDFjYjYsCisgICAgMHgwMWY1MiwgIDB4MDFkZDksIDB4MDJjMDQsICAweDAyYzJlLCAgMHgwMmMyZCwgIDB4MDJjMjMsICAweDAzNDY3LCAgMHgwMzRhMywKKyAgICAweDAzNTFiLCAgMHgwMzUwMSwgMHgwM2E1ZCwgIDB4MDM1MWMsICAweDAzODc1LCAgMHgwM2RlYSwgIDB4MDM5N2IsICAweDAzOWRiLAorICAgIDB4MDNkZjEsICAweDAzOWQ4LCAweDAzYmI0LCAgMHgwNTgwYSwgIDB4MDU4NGQsICAweDA1ODQyLCAgMHgwNWIxMywgIDB4MDU4ZWEsCisgICAgMHgwNjk3ZCwgIDB4MDZhMDYsIDB4MDY4Y2MsICAweDA2YWM3LCAgMHgwNmE5NiwgIDB4MDcyZjQsICAweDA3NTQzLCAgMHgwNzJiNCwKKyAgICAweDA3ZDIwLCAgMHgwYjAwMywgMHgwNzNiNSwgIDB4MDdiZTYsICAweDBkMTgwLCAgMHgwN2JkMSwgIDB4MDdjYjgsICAweDA3ZDA2LAorICAgIDB4MDdkMjUsICAweDBkMmYyLCAweDBkMTlhLCAgMHgwZDMzNCwgIDB4MGUxZGMsICAweDBkNTI5LCAgMHgwZDU4NCwgIDB4MGUxZDIsCisgICAgMHgwZTVlMywgIDB4MGVlYzQsIDB4MGU1NjQsICAweDBmYTQ5LCAgMHgxNjAwMSwgIDB4MGVlZGMsICAweDBmN2ZhLCAgMHgxYTMyYywKKyAgICAweDE2MTMxLCAgMHgxNjAwMywgMHgwZjljOCwgIDB4MWVmODAsICAweDFkMmEwLCAgMHgxYWE0YiwgIDB4MGY3Y2UsICAweDFhYmZlLAorICAgIDB4MWFhNTAsICAweDFhNDU4LCAweDFhODE2LCAgMHgxY2FlNCwgIDB4MWQyZmUsICAweDFkNTJlLCAgMHgxYWE0YywgIDB4MmMyNDUsCisgICAgMHgxZDJhMSwgIDB4MWEzNWQsIDB4MWNhMWIsICAweDFkNWQ4LCAgMHgxZjUzMSwgIDB4MWNhMWMsICAweDFmMzg5LCAgMHgxZjRhZiwKKyAgICAweDNhNWU3LCAgMHgzNTFmYiwgMHgyYzI0YiwgIDB4MzRiY2UsICAweDJjMjRkLCAgMHgyYzI0OSwgIDB4MmMyNGEsICAweDcyZGZjLAorICAgIDB4MzU3ZWYsICAweDM1MDAyLCAweDNhNWU2LCAgMHgzOTQzMSwgIDB4NTg0M2IsICAweDM0YTc3LCAgMHg1ODQzMSwgIDB4M2E1ZjMsCisgICAgMHgzYTVkZCwgIDB4M2U1ZTUsIDB4MzU2YmQsICAweDM5NzZlLCAgMHg2YTNkMiwgIDB4MzUwMGQsICAweDY5NGM0LCAgMHg1ODBiZCwKKyAgICAweDNlNWU4LCAgMHg3NGI5NSwgMHgzNGE2ZSwgIDB4Mzk3N2MsICAweDM5NDMyLCAgMHg1YjBkMiwgIDB4NmEzZDgsICAweDU4MGI4LAorICAgIDB4NWIwY2IsICAweDViMGQ3LCAweDcyZGVlLCAgMHg3MmRlZCwgIDB4NzJkZWMsICAweDc0YjljLCAgMHgzOTc3ZiwgIDB4NzJkZWEsCisgICAgMHg3NGI5ZSwgIDB4N2JlN2QsIDB4NTgwYmYsICAweDViMGQ1LCAgMHg3Y2JhOCwgIDB4NzRiOTEsICAweDNlNWRkLCAgMHhiNjE3MSwKKyAgICAweGQ0NmIzLCAgMHhkNDZiOSwgMHg3Y2JhMSwgIDB4NzRiOWYsICAweDcyZGUxLCAgMHhlNTlmNSwgIDB4M2U1ZWIsICAweDAwMDA0LAorICAgIDB4MDAwMTUsICAweDAwMDM4LCAweDAwMDc1LCAgMHgwMDBlOCwgIDB4MDAxZDMsICAweDAwMzQ3LCAgMHgwMDM5YywgIDB4MDA2OTAsCisgICAgMHgwMDc0YSwgIDB4MDBiNjAsIDB4MDBlOTMsICAweDAwZjc0LCAgMHgwMTYzZCwgIDB4MDFhNWEsICAweDAxZDI0LCAgMHgwMWNiZSwKKyAgICAweDAxZjRiLCAgMHgwMzQ2OCwgMHgwMzU2MiwgIDB4MDM5NDcsICAweDAzZTgyLCAgMHgwNTgwNCwgIDB4MDViMTIsICAweDA1ODAzLAorICAgIDB4MDY5NmQsICAweDA2YTllLCAweDA2OTdjLCAgMHgwNjk3OCwgIDB4MDZhZmIsICAweDA3NGIyLCAgMHgwNzJmNSwgIDB4MDczYzAsCisgICAgMHgwNzU0MSwgIDB4MDY5NDQsIDB4MDc0YjcsICAweDA3MGQzLCAgMHgwN2JhOSwgIDB4MGIwYjEsICAweDBkMWFmLCAgMHgwZTFkZCwKKyAgICAweDBlNWUyLCAgMHgwZTFhMywgMHgwZWVjMywgIDB4MTYxMmYsICAweDBlOTYxLCAgMHgwZWVkYSwgIDB4MGU3OGUsICAweDBmYTQ4LAorICAgIDB4MTYxMmMsICAweDBlNTExLCAweDBlNTY1LCAgMHgwZTk1MywgIDB4MWFhNGEsICAweDBlNTlkLCAgMHgxZDUyYywgIDB4MWE4MTEsCisgICAgMHgxY2FlNywgIDB4MWFiZmMsIDB4MWQ1MmQsICAweDFjYWNmLCAgMHgxY2YwNSwgIDB4MmMyNTQsICAweDM0YTcyLCAgMHgxZjRhYywKKyAgICAweDM5NzZiLCAgMHgzNGE3MSwgMHgyYzZkOSwgIDB4MmQ4NzMsICAweDM0YTZhLCAgMHgzNTdlNywgIDB4MzQ2NGMsICAweDNlNWY1LAorICAgIDB4NTg0MzMsICAweDFmNTNhLCAweDM1MDBhLCAgMHgzNTdlYSwgIDB4MzRhNzMsICAweDM5NDJmLCAgMHgzNTdlNSwgIDB4Mzk3NzUsCisgICAgMHg2OTRjZCwgIDB4Mzk3NzIsIDB4N2NiYTUsICAweDZhM2VmLCAgMHgzNTQ4MywgIDB4NzRiOTgsICAweDViMGMxLCAgMHgzOTc3MCwKKyAgICAweDNhNWQ3LCAgMHgzOTQzMywgMHgzOTQzNCwgIDB4Njk0Y2UsICAweDU4MGJlLCAgMHgzZTVmZiwgIDB4NmEzZWMsICAweGI2MTZmLAorICAgIDB4ZDQ2YjEsICAweDZhM2QxLCAweDcyZGU1LCAgMHg3NGI2ZSwgIDB4NzJkZTksICAweDNlNzAwLCAgMHhkNDZiNiwgIDB4NmEzZTksCisgICAgMHg3NGI2OSwgIDB4ZTU2NzUsIDB4ZDQ2YjgsICAweDdjYmFhLCAgMHgzYTVkMSwgIDB4MDAwMGMsICAweDAwMDNjLCAgMHgwMDBlYiwKKyAgICAweDAwMWYxLCAgMHgwMDNhNCwgMHgwMDZhOCwgIDB4MDA3ZDUsICAweDAwZDQzLCAgMHgwMGU3NywgIDB4MDE2YzUsICAweDAxY2IxLAorICAgIDB4MDJjNWQsICAweDAzYTU1LCAweDAzYTU2LCAgMHgwM2U1MSwgIDB4MDNiYjUsICAweDA1YjBhLCAgMHgwNmE5ZiwgIDB4MDc0YjgsCisgICAgMHgwN2QyOCwgIDB4MGQxODcsIDB4MGQ0MGUsICAweDBkNTJlLCAgMHgwZDQyNSwgIDB4MGVhZTMsICAweDBlMWQzLCAgMHgxNjEyZSwKKyAgICAweDBlNTllLCAgMHgwZWVjMiwgMHgwZTU3OCwgIDB4MGU1MWEsICAweDBlNTc5LCAgMHgwZTUxNSwgIDB4MGU5NjAsICAweDBkMTgzLAorICAgIDB4MGQyMjAsICAweDBkMmNiLCAweDBlNTEyLCAgMHgxNmMzZSwgIDB4MTYwMDIsICAweDE2YzQyLCAgMHgxY2FlOSwgIDB4MzQ2MWEsCisgICAgMHgxZDJmYSwgIDB4MWEzMDgsIDB4MWE4NDksICAweDFjZjA3LCAgMHgxZjM4ZiwgIDB4MzRiNjUsICAweDJjMjUzLCAgMHgxZWY5ZSwKKyAgICAweDFjYmMzLCAgMHgxY2JjMSwgMHgyYzI1NSwgIDB4MWYzODQsICAweDU4NDM1LCAgMHgyYzVjZCwgIDB4M2E1ZjcsICAweDJjMjUyLAorICAgIDB4Mzk1OWMsICAweDJjNmQ4LCAweDNhNWQzLCAgMHg2YWQ3OCwgIDB4NmEzZjIsICAweDdjYmE5LCAgMHhiNjE3NiwgIDB4NzJkZWIsCisgICAgMHgzOTc2NCwgIDB4M2U1ZjYsIDB4M2E1ZDgsICAweDc0YThjLCAgMHg2YTNlNiwgIDB4Njk0ZDEsICAweDZhZDc5LCAweDFhNDU5MiwKKyAgICAweGU1OWZiLCAgMHg3Y2JiMywgMHg1YjBjZCwgIDB4MDAwMTcsICAweDAwMGI1LCAgMHgwMDJjMywgIDB4MDA1YjcsICAweDAwYjFjLAorICAgIDB4MDBlNWMsICAweDAxNjNmLCAweDAxYWIyLCAgMHgwMWVmYSwgIDB4MDM0OGEsICAweDAzOTZlLCAgMHgwNThkYSwgIDB4MDY5NjMsCisgICAgMHgwNmEzMCwgIDB4MDcyY2QsIDB4MDczY2YsICAweDA3Y2U3LCAgMHgwZDJjYSwgIDB4MGQyZDgsICAweDBlNzY0LCAgMHgwZTc5NCwKKyAgICAweDE2MDA4LCAgMHgxNjE2NywgMHgxNjE3ZSwgIDB4MWFhNDksICAweDFhMzBiLCAgMHgxYTgxMywgIDB4MmM2ZGEsICAweDFhNTgwLAorICAgIDB4MWNiYzIsICAweDBmOWNhLCAweDE2MTdmLCAgMHgxZDJmZSwgIDB4MGY3ZmMsICAweDE2YzQwLCAgMHgwZTUxMywgIDB4MGVlYzUsCisgICAgMHgwZjdjMywgIDB4MWQ1MDgsIDB4MWE4MWUsICAweDFkMmZkLCAgMHgzOTQzMCwgIDB4MzU0ODYsICAweDNlNWZkLCAgMHgyYzI0YywKKyAgICAweDJjNzVhLCAgMHgzNGE3NCwgMHgzYTVmNCwgIDB4MzQ2NGQsICAweDY5NGNhLCAgMHgzYTVmMSwgIDB4MWQ1MDksICAweDFkNWMwLAorICAgIDB4MzQ2NDgsICAweDM0NjRlLCAweDZhM2Q1LCAgMHg2YTNlOCwgIDB4NmEzZTcsICAweDViMGMzLCAgMHgyYzI0OCwgIDB4MWYzOGEsCisgICAgMHgzYTVmMiwgIDB4NmEzZTUsIDB4MDAwMjksICAweDAwMTY4LCAgMHgwMDU4YywgIDB4MDBiNjcsICAweDAwZjlkLCAgMHgwMWMzZCwKKyAgICAweDAxY2JmLCAgMHgwMmMyMCwgMHgwMzUxZCwgIDB4MDNkZjYsICAweDA2YWY5LCAgMHgwNzJiNSwgIDB4MGIxZDcsICAweDBiMGIyLAorICAgIDB4MGQ0MGEsICAweDBkNTJiLCAweDBlOTUyLCAgMHgwZTc5NywgIDB4MTYzYzMsICAweDFjM2EwLCAgMHgxZjM4NiwgIDB4MWNhMjEsCisgICAgMHgzNDY1NSwgIDB4MmMyNDcsIDB4MWY1M2IsICAweDJjMjUwLCAgMHgyYzI0ZiwgIDB4MWYzODUsICAweDFlZjVkLCAgMHgxY2YxNSwKKyAgICAweDFjYWVhLCAgMHgxYWIwYSwgMHgxY2YxOSwgIDB4MWY1M2QsICAweDFkNWMyLCAgMHgxZDJmYiwgIDB4MWVmNTgsICAweDM0YTc4LAorICAgIDB4MzU3ZWMsICAweDFmNTMzLCAweDNhNWUxLCAgMHg2OTRkMiwgIDB4NTg0ODIsICAweDNhNWVlLCAgMHgyYzZkYywgIDB4MzU3ZWIsCisgICAgMHg1YjBjNCwgIDB4Mzk3NzgsIDB4NmEzZTEsICAweDdjYmI0LCAgMHgzYTVlMSwgIDB4NzRiNjgsICAweDNhNWVmLCAgMHgzYTVkMiwKKyAgICAweDM5NDI0LCAgMHg3MmRlMiwgMHhlNTlmNiwgIDB4ZTU5ZjcsICAweDNlNzAyLCAgMHgzZTVlYywgIDB4MWYzOGIsICAweDAwMDNiLAorICAgIDB4MDAxZjAsICAweDAwNzc3LCAweDAwZmE4LCAgMHgwMWNiMiwgIDB4MDJkODQsICAweDAzYTU3LCAgMHgwM2RkNiwgIDB4MDY5MTcsCisgICAgMHgwNmExMSwgIDB4MDdkMDcsIDB4MGVhZTIsICAweDBlNzk2LCAgMHgwZjljOSwgIDB4MGY3ZmIsICAweDE2MTY2LCAgMHgxNjE2MCwKKyAgICAweDFhYjFiLCAgMHgxYWJmYSwgMHgyZDg3YiwgIDB4MWQyZjcsICAweDM5NzY4LCAgMHgxZjM4YywgIDB4MzQ2NTMsICAweDM0NjUxLAorICAgIDB4NmEzZDksICAweDM1MDAxLCAweDNhYmJkLCAgMHgzODc0MiwgIDB4Mzk0MjYsICAweDM0YTc2LCAgMHgzYTVlYywgIDB4MzRhNzUsCisgICAgMHgzNTAwMCwgIDB4MzU0ODgsIDB4MWNmMTAsICAweDJjNmRiLCAgMHgzNTdlZCwgIDB4MzU3ZTgsICAweDM1N2U5LCAgMHgzYTVmMCwKKyAgICAweDY5NGMyLCAgMHhiNjE3OCwgMHg3MmRmNSwgIDB4Mzk0MjUsICAweDM5NDJiLCAgMHg3NGI2ZCwgIDB4NzRiNmYsICAweGI2MTc3LAorICAgIDB4YjYxNzksICAweDc0YjZhLCAweGI2MTcyLCAgMHg1ODQ4NywgIDB4M2U1ZWUsICAweDNlNWVkLCAgMHg3MmRmMiwgIDB4NzJkZjQsCisgICAgMHg3Y2JhZSwgIDB4NmEzY2EsIDB4NzBlODYsICAweDM0YmNmLCAgMHg2YTNjOCwgIDB4MDAwNTksICAweDAwMzg0LCAgMHgwMGQ1YiwKKyAgICAweDAxYzM4LCAgMHgwMzU2MCwgMHgwMzk1YiwgIDB4MDU4NGUsICAweDA2OTY0LCAgMHgwNzNjZCwgIDB4MGIxZTcsICAweDBlNzk4LAorICAgIDB4MGU3OGQsICAweDBmYTQzLCAweDFhODQ4LCAgMHgxYTMyZiwgIDB4MWFhNGUsICAweDM0NjRhLCAgMHgxZjRhYiwgIDB4MWYzOGQsCisgICAgMHgzYTVlYiwgIDB4M2E1ZDQsIDB4MzU0OGEsICAweDZhM2M3LCAgMHg1YjBkMCwgIDB4NmEzYzUsICAweDdjYmIwLCAgMHg2OTRjYiwKKyAgICAweDNhNWU1LCAgMHgzZTVlMiwgMHgzOTQyYywgIDB4MmQ4NzIsICAweDFmNGFlLCAgMHgzYTVkNSwgIDB4Njk0ZDMsICAweDU4NDgxLAorICAgIDB4MzUwMDksICAweDM5Nzc0LCAweDU4NDMyLCAgMHhiNjE2YywgIDB4NWIwZGIsICAweDM1NDhiLCAgMHhiNjE3NCwgMHgxZDVkOTUsCisgICAgMHhiMDA0YywgIDB4N2NiYjIsIDB4M2E1ZTUsICAweDc0YThmLCAgMHhlNTlmOSwgIDB4NzJkZjYsICAweGU1OWZkLCAgMHg3Y2JhZCwKKyAgICAweGQ0MjdkLCAgMHg3MmNmZiwgMHgzOTc3YSwgIDB4NWIwZDksICAweGI2MTZkLCAgMHhiNjE2YiwgMHgxYTQ1OTMsICAweDdjYmFmLAorICAgIDB4NWIwZGEsICAweDAwMDcxLCAweDAwM2ViLCAgMHgwMTYwMywgIDB4MDJjNmMsICAweDAzOTYxLCAgMHgwNjhjOCwgIDB4MDZhMzEsCisgICAgMHgwNzJiZCwgIDB4MGQyYzIsIDB4MGU1MWIsICAweDBlNWU2LCAgMHgxYWJmYiwgIDB4MWQyZmYsICAweDFjYWU1LCAgMHgxZWY1YywKKyAgICAweDFlZjVlLCAgMHgxY2YxMywgMHgzNGE2ZCwgIDB4Mzk3NmQsICAweGI2MTZhLCAgMHgzZTVmMiwgIDB4NmEzYzQsICAweGI2MTY5LAorICAgIDB4M2U1ZGMsICAweDU4MGI5LCAweDc0Yjk5LCAgMHg3NTc2NCwgIDB4NTg0MzQsICAweDNhNWQ5LCAgMHg2OTQ1YSwgIDB4Njk0NTksCisgICAgMHgzNTQ4YywgIDB4M2E1ZTksIDB4Njk0NTcsICAweDcyZGYxLCAgMHg2OTQ1ZSwgIDB4NmEzNWUsICAweDNlNzAxLCAgMHhiNjE2OCwKKyAgICAweDViMGRkLCAgMHgzYTVkZSwgMHg2YTNjMiwgIDB4ZDQyNzgsICAweDZhM2NjLCAgMHg3MmRmZCwgIDB4YjYxNjUsIDB4MTYwMDlhLAorICAgIDB4N2NiYjEsICAweGQ0MjdjLCAweGI2MTYyLCAgMHhlNzY1ZSwgMHgxY2VjYmUsICAweDdjYmI2LCAgMHg2OTQ1NCwgIDB4YjYxNjAsCisgICAgMHhkNDI3YSwgMHgxZDVkOTYsIDB4YjFkNmQsICAweGU1OWY0LCAgMHg3MmRlOCwgIDB4M2E1ZGIsICAweDAwMDdhLCAgMHgwMDZhZSwKKyAgICAweDAxYzNjLCAgMHgwM2FiYSwgMHgwNThlOSwgIDB4MDcyY2MsICAweDBkMmRkLCAgMHgwZDIyZCwgIDB4MGVlYzEsICAweDBlZWRiLAorICAgIDB4MWQyYTIsICAweDFlZjViLCAweDM1N2UyLCAgMHgzYWJiZiwgIDB4MWQyZjksICAweDM1MDA0LCAgMHgzYTVkYywgIDB4MzUxZmMsCisgICAgMHgzOTc2YywgIDB4NmEzYzYsIDB4NmEzY2IsICAweDNlNWVhLCAgMHhlNTlmMywgIDB4NmEzY2UsICAweDY5NDUyLCAgMHhlNTlmMCwKKyAgICAweDc0YjkwLCAgMHhkNDI3OSwgMHhkNDI3YiwgIDB4N2NiYjUsICAweDViMGM1LCAgMHgzYTVlMywgIDB4M2E1ZTIsICAweDAwMGQwLAorICAgIDB4MDA3NzUsICAweDAxZWZlLCAweDAzZGQ1LCAgMHgwNzI4YywgIDB4MDdjYjksICAweDBlMWEyLCAgMHgwZWE4NSwgIDB4MGVlZDgsCisgICAgMHgxYTMwYSwgIDB4MWFhNGYsIDB4M2E1ZGYsICAweDM1MDA4LCAgMHgzYTVlMCwgIDB4M2U1ZjQsICAweDNlNWY3LCAgMHhiMWQ2YywKKyAgICAweDU4NDNlLCAgMHgzNGE3MCwgMHg3MmRmOCwgIDB4NzRiNmIsICAweGQ0MjdmLCAgMHg3MmRmMCwgIDB4NWIwYmYsICAweDViMGMwLAorICAgIDB4ZDQ2YjAsICAweDcyZGVmLCAweGU1OWY4LCAweDE2MmU2NCwgIDB4YjFkNmYsICAweDNhNWUwLCAgMHgzOTQyNywgIDB4NjkxNjYsCisgICAgMHg2YTNlMiwgIDB4NmEzZTMsIDB4NzRhOGQsICAweGQ0MjdlLCAweDFkNWQ5NywgIDB4ZDQ2YjQsICAweDViMGQ4LCAgMHg2YTNkMywKKyAgICAweDAwMGUwLCAgMHgwMGI2MywgMHgwMzRjYywgIDB4MDZhMzMsICAweDA3M2M5LCAgMHgwZTFhMCwgIDB4MGY3ZmQsICAweDBmOWNjLAorICAgIDB4MTYxN2QsICAweDFjYWViLCAweDFmNGE5LCAgMHgzYWJiMywgIDB4Njk0NTAsICAweDM5NDIwLCAgMHgzOTc3NywgIDB4M2U1ZTAsCisgICAgMHg2YTNkNCwgIDB4NmEzZWQsIDB4YjYxNjYsICAweGU1OWYxLCAgMHhiMWQ2ZSwgIDB4ZTU2NzYsICAweDZhM2VhLCAgMHhlNTY3NCwKKyAgICAweGI2MTYzLCAgMHhkNDZiNywgMHg3Y2JhNiwgIDB4ZDQ2YmEsIDB4MWQ1ZDk0LCAgMHhiNjE2NCwgIDB4NmEzZjEsICAweDdjYmEyLAorICAgIDB4Njk0NTEsICAweDcyZGZhLCAweGQ0NmJiLCAgMHg3MmRmNywgIDB4NzRiOTQsIDB4MWNlY2JmLCAgMHhlNTlmYSwgMHgxNjAwOWIsCisgICAgMHg2YTNlNCwgIDB4MDAwZTYsIDB4MDBlOTQsICAweDAzODc2LCAgMHgwNzBlZiwgIDB4MGQ1MmEsICAweDE2MDE1LCAgMHgxNjAxNCwKKyAgICAweDFhYmY5LCAgMHgxY2YxNywgMHgzNGE3OSwgIDB4MzQ2NTAsICAweDNlNzA1LCAgMHg2YTNkMCwgIDB4NTg0MzAsICAweDc0YjlkLAorICAgIDB4N2JlN2UsICAweDViMGJlLCAweDM5NzczLCAgMHg2YTNkZSwgIDB4MDAwZmIsICAweDAwZjdiLCAgMHgwM2RkNywgIDB4MDdiZDAsCisgICAgMHgwZTU5YywgIDB4MGY5Y2QsIDB4MWNmMTgsICAweDFkMmZmLCAgMHgzNGE3YSwgIDB4Mzk0MjksICAweDM1MDBjLCAgMHg3MmRlMCwKKyAgICAweDY5NDU2LCAgMHg3YmU3YywgMHhkNDZiNSwgIDB4ZDQ2YjIsICAweDZhM2RkLCAgMHgwMDFhMiwgIDB4MDE2M2IsICAweDA2OTEzLAorICAgIDB4MGIwMTYsICAweDBmYTQyLCAweDFhMzJkLCAgMHgxY2YwNiwgIDB4MzRhN2MsICAweDM0YTdkLCAgMHhiNjE2MSwgIDB4MzU0ODEsCisgICAgMHgzZTVmYSwgIDB4N2NiYTAsIDB4N2JlN2YsICAweDdjYmEzLCAgMHg3Y2JhNywgIDB4NWIwZDMsICAweDcyZGU2LCAgMHg2YTNkYywKKyAgICAweDAwMWE5LCAgMHgwMWFiNCwgMHgwNmEzNCwgIDB4MGQ0NmEsICAweDE2MTMwLCAgMHgxZWY1ZiwgIDB4MWY1MzIsICAweDFmNTM2LAorICAgIDB4Mzk0MmUsICAweDU4NDM2LCAweDZhM2RiLCAgMHg2OTQ1YiwgIDB4MDAxYzksICAweDAxY2EwLCAgMHgwNzI4YiwgIDB4MGVlZDksCisgICAgMHgxZjUzOSwgIDB4MWNhMWQsIDB4Mzk3NjUsICAweDM5NzY2LCAgMHg1ODQzOSwgIDB4Njk0NWQsICAweDM5NzY3LCAgMHgwMDFkMywKKyAgICAweDAxZjJjLCAgMHgwN2JmYywgMHgxNjE2MSwgIDB4MzQ2NTIsICAweDNhNWVkLCAgMHgzNTQ4ZCwgIDB4NTg0MzgsICAweDZhM2RhLAorICAgIDB4MDAyYzEsICAweDAyYzVlLCAweDBkMzM1LCAgMHgxYWIxYSwgIDB4MmQ4NzQsICAweDM1MDA2LCAgMHgzNTQ4NCwgIDB4NWIwY2MsCisgICAgMHg3NGI5YSwgIDB4NzJkZjMsIDB4NmEzZDYsICAweDAwMmRhLCAgMHgwMzRiMywgIDB4MGQ1YWUsICAweDFjYWVlLCAgMHgyZDg3MSwKKyAgICAweDM1N2UzLCAgMHg3NGI5NywgMHg3MmRmOSwgIDB4NTgwYmEsICAweDViMGQ0LCAgMHgwMDM0ZCwgIDB4MDM1NGUsICAweDBmNzUwLAorICAgIDB4MWNiYzAsICAweDNhNWU3LCAweDNhNWU0LCAgMHgwMDM4NSwgIDB4MDNhNTgsICAweDE2YzQxLCAgMHgyYzVjZiwgIDB4M2U1ZTEsCisgICAgMHg3NGI2YywgIDB4ZTU2NzcsIDB4NmEzZGYsICAweDAwMzkwLCAgMHgwM2U1MCwgIDB4MTYzYzIsICAweDJkODc2LCAgMHgzNTQ4MiwKKyAgICAweDViMGQ2LCAgMHg1ODQzYSwgMHgwMDM5ZiwgIDB4MDU4NWUsICAweDFhNTgzLCAgMHgzNTAwZiwgIDB4NzRiOTMsICAweDM5NzcxLAorICAgIDB4MDAzZTQsICAweDA2OTEyLCAweDE2YzQzLCAgMHgzNTdlMSwgIDB4MDA1OGEsICAweDA2OTZmLCAgMHgxZjUzOCwgIDB4NWIwYzksCisgICAgMHg2YTNjZiwgIDB4MDA1YjYsIDB4MDZhZjgsICAweDFmNTM0LCAgMHg1ODQ4MywgIDB4NmEzZTAsICAweDAwNjk1LCAgMHgwN2QwMiwKKyAgICAweDFjYWU4LCAgMHg1ODQ4NSwgMHgwMDZhMiwgIDB4MDc1NGEsICAweDM1N2VlLCAgMHgzOTc3YiwgIDB4MDA3NDgsICAweDA3NGIyLAorICAgIDB4MzRhN2IsICAweDAwNzI5LCAweDBiMWUwLCAgMHgzNDY0OSwgIDB4M2U1ZTMsICAweDAwNzNkLCAgMHgwZDJjNCwgIDB4M2U1ZTYsCisgICAgMHgwMDdiYiwgIDB4MGIwOTksIDB4Mzk3NjIsICAweDViMGNlLCAgMHg2OTQ1ZiwgIDB4MDA3ZDEsICAweDBkNWFiLCAgMHgzOTc3OSwKKyAgICAweDAwN2QzLCAgMHgwZDUyZiwgMHgzOTc2MywgIDB4Njk0NWMsICAweDAwYjFhLCAgMHgwZDJjNSwgIDB4MzU0ODksICAweDAwZDIzLAorICAgIDB4MGVhZWQsICAweDNlNWY4LCAweDAwZDMyLCAgMHgxNjAxNiwgIDB4M2U1ZmIsICAweDAwZDQxLCAgMHgwZTc2OCwgIDB4M2E1ZWQsCisgICAgMHgwMGUxZiwgIDB4MTYwMTcsIDB4NTgwMjcsICAweDAwZWFkLCAgMHgwZmEwNywgIDB4Njk0NTUsICAweDAwZTU0LCAgMHgxNjEyYiwKKyAgICAweDAwZTU1LCAgMHgxYTU4MSwgMHgwMGY3OCwgIDB4MWEzMmIsICAweDU4MGJjLCAgMHg2YTNlZSwgIDB4MDBmNzksICAweDFhYmZkLAorICAgIDB4MDBmOTUsICAweDFhYjE4LCAweDZhM2YwLCAgMHgwMTYzNywgIDB4MWFhNGQsICAweDAxNjJkLCAgMHgxZjUzYywgIDB4NmEzZjMsCisgICAgMHgwMWEzMSwgIDB4MWE4MTAsIDB4Mzk3NjksICAweDAxYTUwLCAgMHgxY2FlZiwgIDB4MDFhMzYsICAweDFhMzJlLCAgMHgwMWE2NywKKyAgICAweDFmMzhlLCAgMHgwMWE4NSwgMHgxZWY1OSwgIDB4MDFhYTYsICAweDFlZjgzLCAgMHgwMWQ1MSwgIDB4MmMwMTIsICAweDAxZDUzLAorICAgIDB4MmQ4NzksICAweDAxZDVlLCAweDM1MDA1LCAgMHgwMWNiYSwgIDB4MWNmMDQsICAweDY5NDUzLCAgMHgwMWQyZCwgIDB4MzUxZmYsCisgICAgMHgwMWYyZCwgIDB4MmQ4NmYsIDB4MDFmMjksICAweDM1MDA3LCAgMHgwMmMyMiwgIDB4MzUxZmEsICAweDAyYzAzLCAgMHgzYTVlYywKKyAgICAweDAyYzVmLCAgMHgzYTVlYiwgMHgwMmM1OCwgIDB4MzRhNmIsICAweDAzNDY5LCAgMHgzNTZiZSwgIDB4MDJjNTksICAweDM0YTZjLAorICAgIDB4MDM0NmEsICAweDNhNWVhLCAweDAzNGJkLCAgMHgwMzRiZiwgIDB4MzU2YmYsICAweDAzODZhLCAgMHgwM2FiOSwgIDB4NTg0M2YsCisgICAgMHgwMzg2YiwgIDB4M2E1ZjUsIDB4MDNhNGIsICAweDM5NDIxLCAgMHgwM2FhNCwgIDB4M2E1ZTksICAweDAzYTVhLCAgMHgwMzk2MCwKKyAgICAweDM5NzdlLCAgMHgwM2RlOSwgMHgwMzk1OCwgIDB4MDNkZjcsICAweDAzOWUxLCAgMHgzZTVlNCwgIDB4MDM5NWYsICAweDY5NDU4LAorICAgIDB4MDNlOTEsICAweDAzZGYyLCAweDM5NDI4LCAgMHgwNThmMiwgIDB4MDNlODAsICAweDZhM2MzLCAgMHgwM2U5MywgIDB4Njk0YzAsCisgICAgMHgwNThiOCwgIDB4NWIwY2EsIDB4MDU4NGYsICAweDY5NGMxLCAgMHgwNThmMSwgIDB4MDY4ZDYsICAweDA2YTEwLCAgMHgwNmFjMywKKyAgICAweDA2YTMyLCAgMHgwNzBkMiwgMHgwNjkxMSwgIDB4MDc0YjEsICAweDA3NDk0LCAgMHgwNmFkNCwgIDB4MDZhZDYsICAweDA3MmI4LAorICAgIDB4MDZhZmEsICAweDA3NGIzLCAweDA3NTQwLCAgMHgwNzNjZSwgIDB4MGIwMDUsICAweDA3NGIzLCAgMHgwNzQ5NSwgIDB4MDc0YjksCisgICAgMHgwZDMzNiwgIDB4MDdiZmYsIDB4MDc3NjMsICAweDA3M2M4LCAgMHgwN2QyOSwgIDB4MGI2MjIsICAweDBkMjIxLCAgMHgwZDE4MSwKKyAgICAweDBiMWQxLCAgMHgwNzRiOCwgMHgwYjFkMCwgIDB4MGQxOWIsICAweDBkMmMzLCAgMHgwYjE3MiwgIDB4MGQyZGMsICAweDBiNjIzLAorICAgIDB4MGQ1YWEsICAweDBkNDI2LCAweDBkMTgyLCAgMHgwZTc5NSwgIDB4MGUxZDEsICAweDBkMzM3LCAgMHgwZTk2YywgIDB4MGU1ZTQsCisgICAgMHgwZTUxNCwgIDB4MGVhZWUsIDB4MTYwMDAsICAweDBlNzY3LCAgMHgwZTFhMSwgIDB4MGU3OGYsICAweDE2MDA0LCAgMHgwZjdjMiwKKyAgICAweDBlNzk5LCAgMHgwZTVlNywgMHgwZTU2NiwgIDB4MGU3NjksICAweDBmNzUxLCAgMHgwZWVkZSwgIDB4MGZhMDYsICAweDE2MDA1LAorICAgIDB4MGZhOWYsICAweDFhNWU2LCAweDBlNzY2LCAgMHgxNjM2ZiwgIDB4MGVlZGQsICAweDBlZWMwLCAgMHgxYTMwOSwgIDB4MWNlY2EsCisgICAgMHgxNjNjZCwgIDB4MGY5Y2IsIDB4MGVlZGYsICAweDFhNTgyLCAgMHgxNjEyZCwgIDB4MGU1ZTUsICAweDFhYmY4LCAgMHgxYTMwYywKKyAgICAweDFjYTFmLCAgMHgxNjNjYywgMHgxYTM1YywgIDB4MWNhMWUsICAweDFhYTUxLCAgMHgxNjNhYywgIDB4MWE4NGUsICAweDFhNTNmLAorICAgIDB4MWNmMTYsICAweDFkMmZjLCAweDFhNWIzLCAgMHgxYWIxOSwgIDB4MWE4MWYsICAweDFkNWMzLCAgMHgxNmMzZiwgIDB4MWQ1YzEsCisgICAgMHgxZDJmYywgIDB4MWY0YWEsIDB4MWE4MTIsICAweDFmNTM1LCAgMHgxY2YxMiwgIDB4MWE4MTcsICAweDE2MTdjLCAgMHgxYWIwYiwKKyAgICAweDFkMmY4LCAgMHgxZWY4MiwgMHgyZDg3YSwgIDB4MWQ1MmYsICAweDFmNTMwLCAgMHgxYWE0OCwgIDB4MzU0ODcsICAweDFkMmZkLAorICAgIDB4MWY0YWQsICAweDFjZjExLCAweDM0NjFiLCAgMHgzNTQ4NSwgIDB4MWNhMjAsICAweDFjYWVkLCAgMHgxY2FlNiwgIDB4MWFiZmYsCisgICAgMHgzNDY0ZiwgIDB4MzRhNmYsIDB4MWVmODEsICAweDM0NjRiLCAgMHgzOWQ5NiwgIDB4MWYzODMsICAweDFmNTM3LCAgMHgxY2YxNCwKKyAgICAweDJjNWNlLCAgMHgzNTAwZSwgMHgyYzI1MSwgIDB4MWNhZWMsICAweDFmMzg3LCAgMHgzNDY1NCwgIDB4MzU3ZTQsICAweDJkODc4LAorICAgIDB4MzUwMGIsICAweDM1NDgwLCAweDNhNWU4LCAgMHgzNTQ4ZSwgIDB4MzRiNjQsICAweDFmNGE4LCAgMHgzNTAwMywgIDB4M2U1ZGYsCisgICAgMHgyZDg3MCwgIDB4MzU3ZTYsIDB4M2U1ZjAsICAweDFlZjVhLCAgMHgzYTVlYSwgIDB4MWYzODgsICAweDNlNzAzLCAgMHgyYzI0ZSwKKyAgICAweDNhNWUyLCAgMHgzNTFmZCwgMHgyYzZkZCwgIDB4M2U3MDQsICAweDM1MWZlLCAgMHgyZDg3NSwgIDB4NWIwYzcsICAweDM5NzZhLAorICAgIDB4M2E1ZTYsICAweDM5NDIzLCAweDU4NDgwLCAgMHgyYzI0NiwgIDB4M2E1ZTMsICAweDJkODc3LCAgMHgzZTVmMSwgIDB4M2FiYmUsCisgICAgMHg1ODQ4OSwgIDB4M2U1ZjksIDB4MzU3ZTAsICAweDNhYmJjLCAgMHg1YjBjNiwgIDB4NjkxNjcsICAweDY5MTY1LCAgMHgzZTVlOSwKKyAgICAweDM5NDIyLCAgMHgzOTc2ZiwgMHgzOTc3ZCwgIDB4M2U1ZGUsICAweDZhM2M5LCAgMHg1OGI5OCwgIDB4M2E1ZjYsICAweDNhNWQwLAorICAgIDB4NTg0ODYsICAweDZhM2MxLCAweDNlNWZjLCAgMHg1YjBkYywgIDB4MzU0OGYsICAweDM5NDJkLCAgMHg2OTRjOSwgIDB4NTg0ODQsCisgICAgMHgzYTVlOCwgIDB4NzRiOWIsIDB4NzRiOTYsICAweDY5NGQwLCAgMHg1ODQ4OCwgIDB4M2E1ZTQsICAweDM5NDJhLCAgMHg3MmVjMiwKKyAgICAweDM5Nzc2LCAgMHg1YjBkMSwgMHg1YjBjZiwgIDB4M2E1ZDYsICAweGU1OWZjLCAgMHg1YjBjOCwgIDB4M2U1ZTcsICAweDdjYmI3LAorICAgIDB4NzBlODcsICAweDdjYmFiLCAweDViMGMyLCAgMHg2OTRjMywgIDB4NzRhOGUsICAweDNlNWYzLCAgMHg2YTNjZCwgIDB4NzJkZmUsCisgICAgMHg3M2IyZSwgIDB4NzJlYzAsIDB4Njk0YzUsICAweDU4NDM3LCAgMHg2OTRjOCwgIDB4NzJkZmYsICAweDM5NDM1LCAgMHg1ODQzZCwKKyAgICAweDZhM2Q3LCAgMHg3MmVjMSwgMHhkMjJjOCwgIDB4Njk0Y2YsICAweGI2MTczLCAgMHgzZTVmZSwgIDB4NTgwYmIsICAweGU1OWYyLAorICAgIDB4YjYxNmUsICAweGI2MTc1LCAweDNhNWRhLCAgMHg1YjBiZCwgIDB4Njk0Y2MsICAweDU4NDNjLCAgMHg2OTRjNywgIDB4NzRiOTIsCisgICAgMHg3MmVjMywgIDB4Njk0YzYsIDB4YjYxNzAsICAweDdjYmFjLCAgMHhiMTczMywgIDB4N2NiYTQsICAweGI2MTY3LCAgMHg3MmRlNywKKyAgICAweDcyZGU0LCAgMHg2YTNjMCwgMHgzZTVlZiwgMHgxNjJlNjUsICAweDcyZGUzLCAgMHg3MmRmYiwgIDB4NmEzNWYsICAweDZhM2ViLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29lZjJfaHVmZmJpdHNbMTMzNl0gPSB7CisgICAgMTEsICA5LCAgMiwgIDMsICA0LCAgNCwgIDUsICA2LAorICAgICA2LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwKKyAgICAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTUsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE4LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxOCwgMTgsIDE3LCAxNywgMTgsCisgICAgMTcsIDE3LCAxOCwgMTcsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE5LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAyMCwKKyAgICAxOCwgMTgsIDE4LCAxOSwgMTksIDE4LCAxOSwgMTgsCisgICAgMTksIDE5LCAxOCwgMTksIDE5LCAxOCwgMTksIDE5LAorICAgIDE5LCAxOSwgMTgsIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDIwLCAyMCwgMjAsIDE5LCAxOSwgMjAsCisgICAgMTksIDIwLCAxOSwgMTksIDIwLCAxOSwgMTksIDIwLAorICAgIDIwLCAyMCwgMjAsIDE5LCAyMCwgMjEsIDE5LCAgMywKKyAgICAgNSwgIDcsICA4LCAgOSwgIDksIDEwLCAxMSwgMTEsCisgICAgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE3LCAxNiwgMTcsIDE3LCAxNiwgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNiwgMTcsIDE3LCAxNywgMTcsCisgICAgMTgsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE5LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOSwKKyAgICAxOSwgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOCwgMTksCisgICAgMTksIDE5LCAyMCwgMTksIDE4LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAyMCwKKyAgICAyMCwgMTksIDIwLCAxOSwgMjAsIDE5LCAyMCwgMTksCisgICAgMTksIDIxLCAyMCwgMjAsIDE5LCAgNCwgIDcsICA4LAorICAgIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsCisgICAgMTgsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTgsIDE4LCAxOCwKKyAgICAxOSwgMTgsIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsCisgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDIxLAorICAgIDIxLCAyMCwgMTksICA1LCAgOCwgMTAsIDExLCAxMiwKKyAgICAxMywgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxNywKKyAgICAxOCwgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE5LCAxOCwgMTksIDE4LAorICAgIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTgsIDE3LCAxNywKKyAgICAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LCAxOCwgMTgsCisgICAgMTgsIDE5LCAgNiwgIDksIDExLCAxMiwgMTMsIDEzLAorICAgIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxOCwgMTgsCisgICAgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE4LCAxNywgMTgsIDE4LCAxNywgMTgsIDE4LCAxOCwKKyAgICAxOCwgMTgsIDE4LCAxOSwgMTksIDE4LCAxOCwgMTgsCisgICAgMTksIDE5LCAxOSwgMjAsIDE5LCAxOSwgMTgsIDE5LAorICAgIDE5LCAyMCwgMjEsIDIxLCAxOSwgMTksIDE4LCAgNiwKKyAgICAxMCwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTUsCisgICAgMTUsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTgsIDE4LCAxOSwgMTgsIDE4LCAxOCwKKyAgICAxOSwgMTgsIDE4LCAxOCwgMTksIDE4LCAxOCwgMTgsCisgICAgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE5LCAyMCwgMjAsIDE5LCAxOSwgMTksIDE5LCAyMCwKKyAgICAyMCwgMTksIDIwLCAxOSwgMTksIDE5LCAyMCwgMjAsCisgICAgMjAsIDE5LCAxOSwgMTgsIDE5LCAgNywgMTAsIDEyLAorICAgIDEzLCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsCisgICAgMTgsIDE5LCAxOCwgMTksIDE5LCAxOSwgMjAsIDE5LAorICAgIDE4LCAxOSwgMTksIDE4LCAxOCwgMTksIDE5LCAxOSwKKyAgICAxOCwgMTksIDE5LCAyMCwgMTksIDE4LCAyMCwgMjEsCisgICAgMjAsIDIwLCAxOSwgMTksIDIxLCAyMCwgMjEsIDIwLAorICAgIDIwLCAyMCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMCwKKyAgICAxOSwgIDcsIDExLCAxMywgMTQsIDE1LCAxNSwgMTUsCisgICAgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LAorICAgIDE4LCAxOCwgMTgsIDE5LCAyMCwgMTksIDE5LCAyMCwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTgsIDE4LCAxOSwgMjAsIDE5LCAxOSwgMTksIDIwLAorICAgIDE5LCAxOSwgMTksIDIwLCAxOSwgMjAsIDIwLCAyMSwKKyAgICAyMCwgMjAsIDIwLCAyMSwgMjIsIDIwLCAxOSwgMjAsCisgICAgMjAsIDIxLCAyMCwgMjEsIDIwLCAxOSwgIDgsIDExLAorICAgIDEzLCAxNCwgMTUsIDE2LCAxNiwgMTYsIDE3LCAxNywKKyAgICAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTgsCisgICAgMTksIDE5LCAxOSwgMTksIDIxLCAxOSwgMTksIDIxLAorICAgIDE5LCAyMCwgMjAsIDIwLCAxOSwgMTgsIDE4LCAgOCwKKyAgICAxMiwgMTQsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTcsCisgICAgMTcsIDE3LCAxOSwgMTgsIDE4LCAxOSwgMTksIDIwLAorICAgIDE5LCAxOCwgMjAsIDE5LCAyMCwgMjAsIDE5LCAxOSwKKyAgICAyMCwgMjAsIDIxLCAyMSwgMjAsIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOSwgMjAsIDIxLCAyMCwgMTksIDE5LAorICAgICA4LCAxMiwgMTQsIDE1LCAxNiwgMTYsIDE3LCAxNywKKyAgICAxNywgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAyMCwgMjEsIDIwLCAyMSwgMTksIDIxLAorICAgIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjAsIDE5LCAyMCwKKyAgICAxOSwgMjAsIDIwLCAyMCwgMTksIDIyLCAyMSwgMjEsCisgICAgMTksICA5LCAxMiwgMTQsIDE1LCAxNiwgMTcsIDE3LAorICAgIDE3LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwKKyAgICAyMCwgMTksIDE5LCAxOSwgIDksIDEzLCAxNSwgMTYsCisgICAgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOSwgMTgsIDIwLAorICAgIDE5LCAyMCwgMjAsIDIwLCAxOSwgIDksIDEzLCAxNSwKKyAgICAxNiwgMTcsIDE3LCAxOCwgMTgsIDE4LCAyMCwgMTgsCisgICAgMTksIDIwLCAyMCwgMjAsIDIwLCAxOSwgMjAsIDE5LAorICAgICA5LCAxMywgMTUsIDE2LCAxNywgMTgsIDE4LCAxOCwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTAsIDE0LCAxNiwgMTcsCisgICAgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwgMTksIDEwLAorICAgIDE0LCAxNiwgMTcsIDE4LCAxOCwgMTgsIDE5LCAxOSwKKyAgICAxMCwgMTQsIDE2LCAxNywgMTgsIDE4LCAxOCwgMTksCisgICAgMTksIDIwLCAxOSwgMTAsIDE0LCAxNiwgMTgsIDE4LAorICAgIDE4LCAxOSwgMjAsIDE5LCAxOSwgMTAsIDE0LCAxNywKKyAgICAxOCwgMTgsIDE4LCAxMCwgMTUsIDE3LCAxOCwgMTksCisgICAgMTksIDIxLCAxOSwgMTEsIDE1LCAxNywgMTgsIDE4LAorICAgIDE5LCAxOSwgMTEsIDE1LCAxNywgMTgsIDE5LCAxOSwKKyAgICAxMSwgMTUsIDE3LCAxOCwgMTEsIDE1LCAxOCwgMTksCisgICAgMTksIDExLCAxNSwgMTgsIDE5LCAxOSwgMTEsIDE2LAorICAgIDE4LCAxOSwgMTEsIDE1LCAxOCwgMTksIDExLCAxNiwKKyAgICAxOCwgMTIsIDE2LCAxOCwgMTksIDEyLCAxNiwgMTksCisgICAgMTIsIDE2LCAxOSwgMTksIDE5LCAxMiwgMTYsIDE5LAorICAgIDEyLCAxNiwgMTksIDE5LCAxMiwgMTYsIDE4LCAxMiwKKyAgICAxNiwgMTksIDEyLCAxNywgMTksIDEyLCAxNywgMTksCisgICAgMTIsIDE3LCAxOSwgMTIsIDE3LCAxOSwgMTMsIDE3LAorICAgIDEzLCAxNywgMTMsIDE3LCAxOSwgMTksIDEzLCAxNywKKyAgICAxMywgMTcsIDE5LCAxMywgMTcsIDEzLCAxOCwgMTksCisgICAgMTMsIDE3LCAxOSwgMTMsIDE4LCAxMywgMTcsIDEzLAorICAgIDE4LCAxMywgMTgsIDEzLCAxOCwgMTMsIDE4LCAxMywKKyAgICAxOCwgMTMsIDE4LCAxNCwgMTgsIDE5LCAxNCwgMTgsCisgICAgMTQsIDE4LCAxNCwgMTgsIDE0LCAxOCwgMTQsIDE5LAorICAgIDE0LCAxOSwgMTQsIDE4LCAxNCwgMTgsIDE0LCAxOCwKKyAgICAxNCwgMTksIDE0LCAxNCwgMTgsIDE0LCAxNCwgMTksCisgICAgMTQsIDE4LCAxNCwgMTksIDE0LCAxOSwgMTQsIDE1LAorICAgIDE5LCAxNSwgMTUsIDE1LCAxNSwgMTksIDE1LCAxOSwKKyAgICAxNSwgMTUsIDE5LCAxNSwgMTUsIDE5LCAxNSwgMTksCisgICAgMTUsIDE5LCAxNSwgMTksIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwKKyAgICAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNywgMTYsIDE2LCAxNiwgMTcsCisgICAgMTcsIDE2LCAxNywgMTcsIDE2LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE4LCAxNywgMTcsIDE4LCAxNywgMTcsIDE3LCAxNywKKyAgICAxOCwgMTgsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE4LCAxNywgMTgsIDE4LCAxNywgMTcsIDE3LAorICAgIDE4LCAxOCwgMTgsIDE3LCAxOCwgMTcsIDE4LCAxOCwKKyAgICAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTcsCisgICAgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOCwgMTgsIDE4LAorICAgIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwKKyAgICAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksCisgICAgMTgsIDE4LCAxOSwgMTgsIDE4LCAxOCwgMTksIDE4LAorICAgIDE5LCAxOCwgMTgsIDE5LCAxOCwgMTgsIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOCwgMTksIDE4LCAxOSwgMTgsCisgICAgMTksIDE5LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE4LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTgsIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDIwLAorICAgIDE5LCAxOSwgMTksIDE5LCAyMSwgMTksIDE5LCAyMCwKKyAgICAxOSwgMjAsIDE5LCAxOSwgMTksIDE5LCAxOSwgMjAsCisgICAgMjAsIDIwLCAxOSwgMTksIDE5LCAyMCwgMTksIDE5LAorICAgIDE5LCAyMCwgMjAsIDE5LCAyMCwgMTksIDE5LCAyMSwKKyAgICAyMCwgMjAsIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMjAsIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLAorICAgIDIwLCAxOSwgMTksIDIxLCAyMCwgMjAsIDE5LCAxOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBjb2VmM19odWZmY29kZXNbMTA3Ml0gPSB7CisgICAgMHgwMDFiMiwgMHgwMDA2OSwgMHgwMDAwMCwgMHgwMDAwNCwgMHgwMDAwNiwgMHgwMDAwZSwgMHgwMDAxNCwgMHgwMDAxOSwKKyAgICAweDAwMDE2LCAweDAwMDJiLCAweDAwMDMwLCAweDAwMDNkLCAweDAwMDNjLCAweDAwMDVhLCAweDAwMDVmLCAweDAwMDZkLAorICAgIDB4MDAwN2UsIDB4MDAwNWYsIDB4MDAwN2YsIDB4MDAwYjYsIDB4MDAwYmMsIDB4MDAwZDgsIDB4MDAwZjIsIDB4MDAwZmUsCisgICAgMHgwMDBiYywgMHgwMDBmYywgMHgwMDE2MSwgMHgwMDE2ZSwgMHgwMDE3NCwgMHgwMDE3NiwgMHgwMDFhMiwgMHgwMDFlMywKKyAgICAweDAwMWYzLCAweDAwMTc0LCAweDAwMTdhLCAweDAwMWVhLCAweDAwMmE4LCAweDAwMmM0LCAweDAwMmU2LCAweDAwMzE0LAorICAgIDB4MDAzNDYsIDB4MDAzNjcsIDB4MDAzZTksIDB4MDAyZTUsIDB4MDAyZWUsIDB4MDAzZDYsIDB4MDA1NTUsIDB4MDA1NTQsCisgICAgMHgwMDU1NywgMHgwMDVjMywgMHgwMDVkNiwgMHgwMDZlMCwgMHgwMDYyZiwgMHgwMDZlMiwgMHgwMDc5OSwgMHgwMDc4OSwKKyAgICAweDAwN2ZhLCAweDAwNWNlLCAweDAwN2ZlLCAweDAwNWVjLCAweDAwN2NjLCAweDAwN2FmLCAweDAwYWE3LCAweDAwYjE5LAorICAgIDB4MDBiOTQsIDB4MDBiODUsIDB4MDBiOWYsIDB4MDBjNDgsIDB4MDBjNDUsIDB4MDBkZDgsIDB4MDBjNGMsIDB4MDBjNGIsCisgICAgMHgwMGQ5OSwgMHgwMGQxZiwgMHgwMGRjMiwgMHgwMGY5NSwgMHgwMGZhMiwgMHgwMGJiNSwgMHgwMGI5ZiwgMHgwMGY1ZCwKKyAgICAweDAwYmJmLCAweDAwZjQ3LCAweDAxNTRhLCAweDAwZmQ1LCAweDAwZjQ1LCAweDAwZjdmLCAweDAxNjBkLCAweDAxODg5LAorICAgIDB4MDE3NTcsIDB4MDE3MjIsIDB4MDE4YjMsIDB4MDE3MmQsIDB4MDFhMzksIDB4MDFhMTgsIDB4MDFiYjMsIDB4MDFiMzAsCisgICAgMHgwMWU2MywgMHgwMTczYywgMHgwMWIzNSwgMHgwMTcyMywgMHgwMWU4MCwgMHgwMWZlZSwgMHgwMTc2MSwgMHgwMWZmYywKKyAgICAweDAxZjdmLCAweDAyYzdjLCAweDAxZmExLCAweDAxNzdiLCAweDAxNzU1LCAweDAxNzVhLCAweDAxZmE2LCAweDAyZWFiLAorICAgIDB4MDMxMGEsIDB4MDJjNjksIDB4MDM2NjksIDB4MDMxMjcsIDB4MDMxMDMsIDB4MDJlNDMsIDB4MDM2NjIsIDB4MDMxNjUsCisgICAgMHgwMzEyNCwgMHgwMzEzYiwgMHgwMzExMSwgMHgwMzY2OCwgMHgwMzQzYiwgMHgwM2M1MiwgMHgwM2VmYywgMHgwMmU2YywKKyAgICAweDAzZmRhLCAweDAzZWY4LCAweDAyZTdiLCAweDAzZWUyLCAweDAzY2M1LCAweDAzZDcyLCAweDA1OGMwLCAweDAzZGY4LAorICAgIDB4MDJlYTksIDB4MDNlN2UsIDB4MDU1NmQsIDB4MDVjODIsIDB4MDNkNzEsIDB4MDNlN2IsIDB4MDNjNDIsIDB4MDU4ZDcsCisgICAgMHgwM2Y0ZSwgMHgwNjIwMCwgMHgwM2Q3MCwgMHgwNWNiMiwgMHgwNWM5NiwgMHgwNWNiMCwgMHgwM2Y0NSwgMHgwNWNiMSwKKyAgICAweDAyZTZkLCAweDAzMTEwLCAweDAyZjY4LCAweDA1YzkwLCAweDA3Y2E2LCAweDA3Yzg4LCAweDA2MjA0LCAweDA2MmM4LAorICAgIDB4MDc4YTYsIDB4MDc5ODYsIDB4MDc5ZDUsIDB4MGIxYWQsIDB4MDc5ODksIDB4MGIwNzksIDB4MDVjZGQsIDB4MGFhZDQsCisgICAgMHgwNWRlOCwgMHgwN2RjZCwgMHgwNzk4NywgMHgwNWQ2NywgMHgwNWQ5OSwgMHgwYjkxZCwgMHgwN2NmMSwgMHgwNWQ5YiwKKyAgICAweDA3OWQ3LCAweDBiMDdiLCAweDA1Yzg1LCAweDA1ZDlhLCAweDA3ZGNjLCAweDA3ZWJmLCAweDA3ZGNlLCAweDA3ZGZiLAorICAgIDB4MDdlYzAsIDB4MDdkMWEsIDB4MDdhMDcsIDB4MDVjODQsIDB4MGM0NzEsIDB4MDdjZjIsIDB4MGJhZWYsIDB4MGI5ZDIsCisgICAgMHgwNWRlYiwgMHgwN2JkNiwgMHgwYjg0NSwgMHgwNWQ5OCwgMHgwYjkxYSwgMHgwYmFlOCwgMHgwYzRlMCwgMHgwZGMzMSwKKyAgICAweDBmOTNkLCAweDBiYmNlLCAweDBkMWQyLCAweDBmN2E5LCAweDBkOWI5LCAweDBiYmNiLCAweDBiOTAwLCAweDBhYWQ3LAorICAgIDB4MGJhYmQsIDB4MGM0ZTEsIDB4MGY0NmYsIDB4MGM1ODgsIDB4MGM1OGIsIDB4MTYwZTYsIDB4MGJiY2YsIDB4MGJhYzMsCisgICAgMHgwZjk0NSwgMHgwZjdhMywgMHgwZDFjMSwgMHgwZmI4ZSwgMHgwZjdhNCwgMHgwZmI4YywgMHgwZjQwYywgMHgwYzQ3MywKKyAgICAweDBmZDcyLCAweDBiYmNkLCAweDBmZmZhLCAweDBmOTQwLCAweDBiYmM5LCAweDBmN2E4LCAweDFhMWVkLCAweDBiYmM1LAorICAgIDB4MWYyNmYsIDB4MTYzZmQsIDB4MTYwYzcsIDB4MWExZjUsIDB4MGY5NDcsIDB4MTYzZmMsIDB4MTU0YjMsIDB4MGZmZjYsCisgICAgMHgxNjNmNiwgMHgxNjBlOSwgMHgxYTFmMCwgMHgwYmFiOSwgMHgwYmFiYSwgMHgxNzA4NiwgMHgwYjkwMywgMHgwZmQ3NSwKKyAgICAweDBmMzA4LCAweDE3NmYzLCAweDE2M2ZmLCAweDBmZDdkLCAweDFiYjc4LCAweDE2M2ZiLCAweDE4OGRiLCAweDFhMWY3LAorICAgIDB4MTU0YjIsIDB4MTcyZmQsIDB4MTYzZjQsIDB4MWJiNzMsIDB4MTcyZmYsIDB4MGJhYmMsIDB4MGY5N2QsIDB4MWExZjMsCisgICAgMHgxYmI2ZCwgMHgxZmZkNSwgMHgxYTFmNCwgMHgxZjI3MiwgMHgxNzM4MCwgMHgxNzM4MiwgMHgxZmZlNywgMHgwYmFjOCwKKyAgICAweDBiYmM0LCAweDE4OGQzLCAweDE2MGUwLCAweDBmZDdiLCAweDE3MjVmLCAweDE3MmY1LCAweDFiYjc5LCAweDFmYWQ5LAorICAgIDB4MWYyNjksIDB4MTg4ZDAsIDB4MGJhYzQsIDB4MGJhYzUsIDB4MzExODUsIDB4MTg4ZDIsIDB4MTg4Y2MsIDB4MzExODcsCisgICAgMHgzZTdmZSwgMHgxODhkMSwgMHgxYmI2YywgMHgxZjI2OCwgMHgxZmFkMiwgMHgxZmZkOSwgMHgxYTFlYSwgMHgxYmI2OCwKKyAgICAweDFmYWNiLCAweDNmZGIyLCAweDFlODFhLCAweDE4OGNlLCAweDE3MmZiLCAweDFhMWVmLCAweDFmYWNlLCAweDFiYjcwLAorICAgIDB4MGJhYzEsIDB4MWJiNmIsIDB4MTcyZjgsIDB4MWJiNjYsIDB4MWZmZGYsIDB4MWJiNmEsIDB4MWZmZDcsIDB4MWYyNjYsCisgICAgMHgxNzZmOCwgMHgzNzY1MywgMHgxZmE3ZSwgMHgzMTE4MiwgMHgxZmFjOCwgMHgyYzdlMywgMHgzNzBlZSwgMHgxNzZlYywKKyAgICAweDE3NmU5LCAweDJlNGJjLCAweDE2MGM1LCAweDM3NjVhLCAweDNjZTljLCAweDE3MzczLCAweDE3NmU4LCAweDE4OGQ0LAorICAgIDB4MTc2ZjEsIDB4MTc2ZWYsIDB4Mzc2NTksIDB4MWJiN2MsIDB4MWZmZGUsIDB4MTc2ZjIsIDB4MzExOGIsIDB4MmM3ZDQsCisgICAgMHgzNzY1MSwgMHg1Y2U5ZiwgMHgzNzY1MCwgMHgzMTE5MSwgMHgzZjRmNiwgMHgzZjRmNSwgMHg3YTA2YywgMHgxZmFjMSwKKyAgICAweDVjOTdiLCAweDJjN2UwLCAweDc5ZDNhLCAweDNlN2ZkLCAweDJjN2RmLCAweDNmNGYwLCAweDdhMDZkLCAweDM3NmMxLAorICAgIDB4NzlkM2IsIDB4MDAwMDQsIDB4MDAwMTQsIDB4MDAwNTksIDB4MDAwYWIsIDB4MDAwYjgsIDB4MDAxNzcsIDB4MDAxZjUsCisgICAgMHgwMDFmMiwgMHgwMDMxNSwgMHgwMDNmYywgMHgwMDViZCwgMHgwMDYyZCwgMHgwMDZlOCwgMHgwMDdkZCwgMHgwMGIwNCwKKyAgICAweDAwN2NkLCAweDAwYjFlLCAweDAwZDFlLCAweDAwZjE1LCAweDAwZjNiLCAweDAwZjQxLCAweDAxNTQ4LCAweDAxOGIwLAorICAgIDB4MDE3M2IsIDB4MDE4ODQsIDB4MDFhMWMsIDB4MDFiYjQsIDB4MDFmMjUsIDB4MDE3YjUsIDB4MDE3NmQsIDB4MDFlZjgsCisgICAgMHgwMmU3MywgMHgwMzEwNywgMHgwMzEyNSwgMHgwMzEwNSwgMHgwMmU0OSwgMHgwM2NlOCwgMHgwM2VmOSwgMHgwM2U1ZSwKKyAgICAweDAyZTcyLCAweDAzNDcxLCAweDAzZmQ5LCAweDA2MjNmLCAweDA3OGEwLCAweDA2ODY3LCAweDA1Y2IzLCAweDA2MjcyLAorICAgIDB4MDY4ZWMsIDB4MDZlOWEsIDB4MDc5ZDQsIDB4MDZlOTgsIDB4MGIxYWEsIDB4MDZlMWEsIDB4MDc5ODUsIDB4MDY4ZWUsCisgICAgMHgwNmU5YiwgMHgwNWM4OCwgMHgwYjFhYywgMHgwN2RmYSwgMHgwNWQ2NSwgMHgwN2NmMCwgMHgwN2NiZiwgMHgwYzQ3NSwKKyAgICAweDE2MGViLCAweDFiYjdlLCAweDBmN2E2LCAweDFmZWRkLCAweDE2MGUzLCAweDBmZmZiLCAweDBmYjhkLCAweDBmZmY5LAorICAgIDB4MGQxYzAsIDB4MGM1OGMsIDB4MWExZTksIDB4MGJhYjgsIDB4MGY1Y2YsIDB4MGZmZjUsIDB4Mzc2YzUsIDB4MWExZWMsCisgICAgMHgxNjBlZCwgMHgxZmVkZSwgMHgxZmFjOSwgMHgxYTFlYiwgMHgxZjIyNCwgMHgxNzZlZSwgMHgwZmQ3OSwgMHgxNzA4MCwKKyAgICAweDE3Mzg3LCAweDFiYjdhLCAweDFmZmU5LCAweDE3NmY3LCAweDE3Mzg1LCAweDE3NzgxLCAweDJjN2Q1LCAweDE3Nzg1LAorICAgIDB4MWZmZTMsIDB4MTYzZjUsIDB4MWZhYzIsIDB4M2U3ZjksIDB4MzExOGQsIDB4M2ZkYjEsIDB4MWZmZTIsIDB4MWYyMjYsCisgICAgMHgzMTE4YSwgMHgyYzdkOSwgMHgzMTE5MCwgMHgzMTE4YywgMHgzZjRmMywgMHgxYmI3ZiwgMHgxYmI3MiwgMHgzMTE4NCwKKyAgICAweGI5MmY0LCAweDNlN2ZiLCAweDZlMWQ5LCAweDFmYWNhLCAweDYyMzAwLCAweDNmZGI4LCAweDNkMDM3LCAweDNlN2ZjLAorICAgIDB4NjIzMDEsIDB4M2Y0ZjIsIDB4MWYyNmEsIDB4MDAwMGUsIDB4MDAwNjMsIDB4MDAwZjgsIDB4MDAxZWUsIDB4MDAzNzcsCisgICAgMHgwMDNmNywgMHgwMDZlMywgMHgwMDVjYywgMHgwMGIwNSwgMHgwMGRkMiwgMHgwMGZkNCwgMHgwMTcyZSwgMHgwMTcyYSwKKyAgICAweDAxZTIzLCAweDAxZjJkLCAweDAxNzYzLCAweDAxNzY5LCAweDAxNzZjLCAweDAyZTc1LCAweDAzMTA0LCAweDAyZWMxLAorICAgIDB4MDNlNTgsIDB4MDU4M2YsIDB4MDNmNjIsIDB4MDNmNDQsIDB4MDU4YzUsIDB4MDYyM2MsIDB4MDVjZjQsIDB4MDdiZDcsCisgICAgMHgwNWQ5ZCwgMHgwYWFkMiwgMHgwNWQ2NiwgMHgwYjFhOSwgMHgwYjA3OCwgMHgwN2NmZSwgMHgwYjkxOCwgMHgwYzQ2ZiwKKyAgICAweDBiOTE5LCAweDBiODQ3LCAweDA2ZTFiLCAweDBiODRiLCAweDBhYWQ4LCAweDBmZDc0LCAweDE3MmY0LCAweDE3MDgxLAorICAgIDB4MGY5N2MsIDB4MWYyNzMsIDB4MGY3YTAsIDB4MGZkN2MsIDB4MTcyZjcsIDB4MGZkN2EsIDB4MWJiNzcsIDB4MTcyZmUsCisgICAgMHgxZjI3MCwgMHgwZmQ3MywgMHgxYmI3YiwgMHgxYTFiYywgMHgxYmI3ZCwgMHgwYmJjMywgMHgxNzJmNiwgMHgwYmFlYiwKKyAgICAweDBmYjhmLCAweDNmNGY0LCAweDNmZGI0LCAweDM3NmM4LCAweDNlN2ZhLCAweDFmZmQwLCAweDYyMzAzLCAweGI5MmY1LAorICAgIDB4MWYyNjEsIDB4MzExODksIDB4M2ZkYjUsIDB4MmM3ZGIsIDB4Mzc2YzksIDB4MWZhZDYsIDB4MWZhZDEsIDB4MDAwMTUsCisgICAgMHgwMDBmMCwgMHgwMDJlMCwgMHgwMDU4ZSwgMHgwMDVkNywgMHgwMGM0ZCwgMHgwMGZhMSwgMHgwMGJkYiwgMHgwMTc1NiwKKyAgICAweDAxZjcwLCAweDAyYzE5LCAweDAzMTNjLCAweDAzNzBmLCAweDAzY2MwLCAweDAyZWE4LCAweDA1OGM2LCAweDA1OGM3LAorICAgIDB4MDJlYjcsIDB4MDU4ZDAsIDB4MDdkMTgsIDB4MGFhNTgsIDB4MGI4NDgsIDB4MDVkOWUsIDB4MDVkNmMsIDB4MGI4NGMsCisgICAgMHgwYzU4OSwgMHgwYjkwMSwgMHgxNjNmOCwgMHgwYmFjOSwgMHgwYjljNSwgMHgwZjkzYywgMHgxODhkOCwgMHgwYmJjNywKKyAgICAweDE2MGVjLCAweDBmZDZmLCAweDE4OGQ5LCAweDE2MGVhLCAweDBmN2E3LCAweDBmOTQ0LCAweDBiYWFiLCAweDBkYzNhLAorICAgIDB4MTg4Y2YsIDB4MTc2ZmIsIDB4MmM3ZDgsIDB4MmM3ZDcsIDB4MWJiNzUsIDB4NWNlOWUsIDB4NjIzMDIsIDB4MzcwZWQsCisgICAgMHgxNzZmNCwgMHgxZmZkMSwgMHgzNzBlZiwgMHgzZjRmOCwgMHgzNzZjNywgMHgxZmZlMSwgMHgzNzZjNiwgMHgxNzZmZiwKKyAgICAweDZlMWQ4LCAweDE3NmY2LCAweDE3MDg3LCAweDBmNWNkLCAweDAwMDM1LCAweDAwMWEwLCAweDAwNThiLCAweDAwYWFjLAorICAgIDB4MDBiOWEsIDB4MDE3NWYsIDB4MDFlMjIsIDB4MDFlOGMsIDB4MDFmYjIsIDB4MDMxMGIsIDB4MDU4ZDEsIDB4MDU1MmUsCisgICAgMHgwNWMyNywgMHgwNjg2ZSwgMHgwN2NhNywgMHgwYzQ3NCwgMHgwZGMzMywgMHgwN2JmMiwgMHgwNWRlOSwgMHgwN2EzNSwKKyAgICAweDBiYWFhLCAweDBiOWViLCAweDBmYjk1LCAweDBiOWI4LCAweDE3MzgxLCAweDFmMjYyLCAweDE4OGNkLCAweDE3MDg4LAorICAgIDB4MTcyZmEsIDB4MGY3YTIsIDB4MWZhZDMsIDB4MGJhYzAsIDB4Mzc2NWMsIDB4MWZlZGYsIDB4MWYyMjUsIDB4MWZhZDQsCisgICAgMHgyYzdkYSwgMHg1Y2U5ZCwgMHgzZTdmOCwgMHgxZTIwMywgMHgxODhkNywgMHgwMDA1NCwgMHgwMDJjMCwgMHgwMDdhMSwKKyAgICAweDAwZjc4LCAweDAxYjM2LCAweDAxZmEzLCAweDAzMTNhLCAweDAzNDM2LCAweDAzNDNhLCAweDA3ZDFkLCAweDA3YmQ4LAorICAgIDB4MDVjZGYsIDB4MGI4NDYsIDB4MGIxODksIDB4MGQ5YjgsIDB4MGZmZjgsIDB4MGQ5YmUsIDB4MGM1OGEsIDB4MDVkZWEsCisgICAgMHgwZDFkMywgMHgxNjBlNCwgMHgxZjI2YiwgMHgxODhkYSwgMHgxZTIwMiwgMHgyYzdkMiwgMHgxNjNmZSwgMHgzMTE5MywKKyAgICAweDE3NzgyLCAweDM3NmMyLCAweDJjN2QxLCAweDNmZGIwLCAweDM3NjVkLCAweDJjN2QwLCAweDFmYWQwLCAweDFlMjAxLAorICAgIDB4MTg4ZGQsIDB4MmM3ZTIsIDB4Mzc2NTcsIDB4Mzc2NTUsIDB4Mzc2YzQsIDB4Mzc2YzAsIDB4MTc2ZWEsIDB4MDAwNmYsCisgICAgMHgwMDNjZiwgMHgwMGRkNSwgMHgwMWYyMywgMHgwMmM2MSwgMHgwMmVkMCwgMHgwNWQ1NCwgMHgwNTUyZCwgMHgwNzg4MywKKyAgICAweDBiMWE4LCAweDBiOTFjLCAweDBiYWJmLCAweDBiOTAyLCAweDBmN2FhLCAweDBmN2E1LCAweDFhMWU4LCAweDFmZmQ2LAorICAgIDB4MGJhYmUsIDB4MWExYmYsIDB4MTYzZjMsIDB4MWZmZDgsIDB4MWZhZDcsIDB4MWYyNzUsIDB4MWZmZGMsIDB4MDAwN2QsCisgICAgMHgwMDViYywgMHgwMTU0OSwgMHgwMmE5OSwgMHgwM2RlZiwgMHgwNjI3MywgMHgwNzlkNiwgMHgwN2QxYiwgMHgwYWFkMywKKyAgICAweDBkMGZjLCAweDJjN2RkLCAweDE4OGQ2LCAweDBiYWMyLCAweDJjN2UxLCAweDFiYjc2LCAweDFhMWJkLCAweDMxMTg2LAorICAgIDB4MGZkNzgsIDB4MWExYmUsIDB4MzExODMsIDB4M2ZkYjYsIDB4M2Y0ZjEsIDB4Mzc2NTIsIDB4MWZhZDUsIDB4M2Y0ZjksCisgICAgMHgzZTdmZiwgMHg1Y2U5YywgMHgzNzY1YiwgMHgzMTE4OCwgMHgxNzM3MiwgMHgwMDBiZCwgMHgwMDc4YiwgMHgwMWYyMSwKKyAgICAweDAzYzQzLCAweDAzZGVkLCAweDBhYWQ2LCAweDA3ZWMxLCAweDBmOTQyLCAweDA1Yzg2LCAweDE3MDg5LCAweDBiYWJiLAorICAgIDB4MWZmZTgsIDB4MmM3ZGUsIDB4MWYyNmUsIDB4MWZhYzQsIDB4M2Y0ZjcsIDB4Mzc2NTYsIDB4MWZhN2QsIDB4Mzc2YzMsCisgICAgMHgzZmRiMywgMHgzMTE4ZiwgMHgxZmFjNiwgMHgwMDBmOCwgMHgwMDdlZCwgMHgwMWVmZCwgMHgwM2U3YSwgMHgwNWM5MSwKKyAgICAweDBhYWQ5LCAweDBiYWVjLCAweDBkYzMyLCAweDBmNDZlLCAweDFlMjAwLCAweDE3NmZhLCAweDM3NjVlLCAweDNmZGI3LAorICAgIDB4MmM3ZDYsIDB4M2ZkYjksIDB4Mzc2NTQsIDB4Mzc2NTgsIDB4MzExOGUsIDB4MWZmZGIsIDB4MDAwZjYsIDB4MDBjNDMsCisgICAgMHgwMzEwNiwgMHgwNjhlZiwgMHgwYjg0ZCwgMHgwYjE4OCwgMHgwYmJjYywgMHgxZjI2NCwgMHgxYmI2OSwgMHgxNzM4NiwKKyAgICAweDFmYWMwLCAweDAwMTcxLCAweDAwZjM5LCAweDAzZTQxLCAweDA2OGVkLCAweDBkOWJjLCAweDBmN2ExLCAweDFiYjY3LAorICAgIDB4MWZmZGQsIDB4MTc2ZjksIDB4MDAxYjksIDB4MDBmN2QsIDB4MDNmNjMsIDB4MGQwZmQsIDB4MGI5ZWEsIDB4MTg4ZGMsCisgICAgMHgxZmFjMywgMHgxYTFmMiwgMHgzMTE5MiwgMHgxZmZlNCwgMHgwMDFmNiwgMHgwMTc1NCwgMHgwNjg2NSwgMHgwZjMwOSwKKyAgICAweDE2MGU1LCAweDE3NmY1LCAweDM3NjVmLCAweDFmYWNjLCAweDAwMWU5LCAweDAxYTFhLCAweDA2MjAxLCAweDBmMTA1LAorICAgIDB4MTc2ZjAsIDB4MDAyZGYsIDB4MDE3NTYsIDB4MDVkNmQsIDB4MTYzZmEsIDB4MTc2ZWQsIDB4MDAzNDIsIDB4MDJlNDAsCisgICAgMHgwZDBmZiwgMHgxNzA4MiwgMHgwMDNjZCwgMHgwMmE5OCwgMHgwZmZmYywgMHgyYzdkYywgMHgxZmE3ZiwgMHgwMDNmZSwKKyAgICAweDAzNzY0LCAweDBmZmZkLCAweDE3NmZjLCAweDFmYWM1LCAweDAwMmY3LCAweDAyZWQxLCAweDBmYjk3LCAweDAwNThhLAorICAgIDB4MDJlZGMsIDB4MGJiYzgsIDB4MDA1ZDQsIDB4MDYyM2QsIDB4MTYwZTgsIDB4MDA2MmUsIDB4MDU4MzAsIDB4MTYzZjksCisgICAgMHgwMDZlYiwgMHgwNjIwNSwgMHgxZjI3NCwgMHgwMDdkZSwgMHgwNjJjOSwgMHgxZjI2NSwgMHgwMDVjOSwgMHgwNWNkZSwKKyAgICAweDFmZmQzLCAweDAwNWQ0LCAweDA3OTg4LCAweDAwN2NlLCAweDBiODQ5LCAweDAwYjFiLCAweDA1Yzg5LCAweDFmYWM3LAorICAgIDB4MDBiOTMsIDB4MDVjODMsIDB4MDBiOWUsIDB4MGYxNGYsIDB4MDBjNGEsIDB4MGI5YzcsIDB4MDBkZDQsIDB4MGM0NzAsCisgICAgMHgxZjI3MSwgMHgwMGYzOCwgMHgwZmI5NiwgMHgxNzZlYiwgMHgwMGZhMCwgMHgxNjNmNywgMHgwMGJiMiwgMHgwYjkxYiwKKyAgICAweDAwYmJlLCAweDBmMTAyLCAweDAwZjQ0LCAweDBmOTQ2LCAweDFmYWNkLCAweDAwZjc5LCAweDBkOWJkLCAweDAxNTRkLAorICAgIDB4MGJiYzYsIDB4MDBmZDIsIDB4MTYwZTcsIDB4MDE3MmIsIDB4MTg4Y2IsIDB4MDE3NWUsIDB4MGZkNzYsIDB4MDE3NWMsCisgICAgMHgxYmI3MSwgMHgwMTg5ZiwgMHgxYTFlZSwgMHgwMWYyNCwgMHgxYTFmNiwgMHgwMWJhNywgMHgwYmJjYSwgMHgwMWY3ZCwKKyAgICAweDBmZmZmLCAweDAxZjJlLCAweDFiYjY1LCAweDAxYmI1LCAweDE3MmY5LCAweDAxZmVmLCAweDFmMjZjLCAweDAxZjNlLAorICAgIDB4MGZkNzcsIDB4MDE3NjIsIDB4MWJiNmUsIDB4MDFlZjksIDB4MTcyZmMsIDB4MDFmYTAsIDB4MDJhYjcsIDB4MDJlNGEsCisgICAgMHgxZjI2NywgMHgwMWZiMywgMHgxZmZkYSwgMHgwMmU0MiwgMHgwMzEwMSwgMHgxNzc4MCwgMHgwMzEzZCwgMHgwMzQ3NSwKKyAgICAweDE3Nzg0LCAweDAzMTI2LCAweDFmYWNmLCAweDAzYzUxLCAweDE3NzgzLCAweDAzZTQwLCAweDFmZmU1LCAweDAzNjYzLAorICAgIDB4MWZmZTAsIDB4MDNlOGYsIDB4MWYyNmQsIDB4MDM0M2MsIDB4MDNjYzEsIDB4MTc2ZmQsIDB4MDNlNDUsIDB4MDJlYzAsCisgICAgMHgwM2Y2MSwgMHgwM2RlZSwgMHgwM2ZkOCwgMHgwNTgzZSwgMHgwMmU0NSwgMHgwM2U1OSwgMHgwM2QwMiwgMHgwNWNlOCwKKyAgICAweDA1NTY4LCAweDE3NmZlLCAweDAyZjY5LCAweDFmYWQ4LCAweDA1OGMxLCAweDA1YzgzLCAweDFmZmU2LCAweDA2MjcxLAorICAgIDB4MDZlMWMsIDB4MDYyYzcsIDB4MDY4ZTEsIDB4MDU1MmYsIDB4MDY4NjQsIDB4MDY4NjYsIDB4MDZlOTksIDB4MDVjYmMsCisgICAgMHgwN2NhNSwgMHgwNzhhMSwgMHgwNWM4MiwgMHgwN2RjZiwgMHgwNjIzYiwgMHgwNjIzZSwgMHgwNjhlOCwgMHgwN2EzNiwKKyAgICAweDA1ZDljLCAweDBiMDc3LCAweDA3Y2YzLCAweDA3YTM0LCAweDA3Y2E0LCAweDA3ZDE5LCAweDA3OWQyLCAweDA3ZDFjLAorICAgIDB4MDdiZDksIDB4MGI4NGEsIDB4MGZiOTQsIDB4MGFhZDUsIDB4MGRjMzAsIDB4MDdiZjMsIDB4MGJhZWUsIDB4MGIwN2EsCisgICAgMHgwYzQ3MiwgMHgwYjkxZSwgMHgwZDliYSwgMHgwNWQ5ZiwgMHgwZDBmZSwgMHgwYjljNiwgMHgwNWM4NywgMHgwZjE0ZSwKKyAgICAweDBiYWVkLCAweDBiOTJlLCAweDBmMTAzLCAweDBiOWM0LCAweDBmYjkxLCAweDBkOWJiLCAweDBiMWFiLCAweDBjNThkLAorICAgIDB4MGZmZmUsIDB4MGY5M2IsIDB4MGY5NDEsIDB4MGJhZWEsIDB4MGI5MWYsIDB4MGY1Y2MsIDB4MGQ5YmYsIDB4MGY5NDMsCisgICAgMHgwZjEwNCwgMHgxZjI2MCwgMHgwZmI5MiwgMHgwZjkzZiwgMHgwZjNhNiwgMHgwYmFjNywgMHgwZjdhYiwgMHgwYmFjNiwKKyAgICAweDE3MzgzLCAweDBmZDZkLCAweDBiYWU5LCAweDBmZDZlLCAweDFlNzRmLCAweDE4OGNhLCAweDFmMjI3LCAweDBmYjkzLAorICAgIDB4MGZiOTAsIDB4MGZmZjcsIDB4MTcwODUsIDB4MTcwODMsIDB4MTYwZTEsIDB4MTcwODQsIDB4MGY5M2UsIDB4MTYwZTIsCisgICAgMHgxNjBjNiwgMHgxYTFmMSwgMHgxYmI2ZiwgMHgxNzM4NCwgMHgwZmQ3MCwgMHgxZjI2MywgMHgxODhkNSwgMHgxNzNhNiwKKyAgICAweDBmNWNlLCAweDE2M2YyLCAweDBmZDcxLCAweDFmZmQyLCAweDE2MGM0LCAweDFmZmQ0LCAweDJjN2QzLCAweDFiYjc0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29lZjNfaHVmZmJpdHNbMTA3Ml0gPSB7CisgICAgIDksICA3LCAgMiwgIDMsICA0LCAgNCwgIDUsICA1LAorICAgICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAorICAgICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMiwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDE0LCAxMywgMTQsIDE0LCAxMywgMTQsIDEzLAorICAgIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LAorICAgIDE0LCAxNCwgMTUsIDE0LCAxNCwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNiwgMTUsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE1LCAxNSwKKyAgICAxNiwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNywgMTYsIDE3LCAxNiwgMTcsIDE3LCAxNiwKKyAgICAxNywgMTYsIDE3LCAxNiwgMTYsIDE3LCAxNywgMTcsCisgICAgMTYsIDE3LCAxNiwgMTYsIDE3LCAxNiwgMTcsIDE2LAorICAgIDE3LCAxNywgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTYsIDE3LCAxNywgMTYsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE2LCAxOCwgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNiwgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxOCwKKyAgICAxNywgMTcsIDE3LCAxNywgMTgsIDE3LCAxNywgMTgsCisgICAgMTksIDE3LCAxNywgMTcsIDE4LCAxNywgMTcsIDE3LAorICAgIDE4LCAxOCwgMTgsIDE3LCAxNywgMTcsIDE4LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LAorICAgIDE4LCAxOCwgMTcsIDE4LCAxOCwgMTgsIDE4LCAxNywKKyAgICAxOCwgMTgsIDE4LCAxNywgMTcsIDE4LCAxOCwgMTgsCisgICAgMTgsIDE5LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDE4LAorICAgIDE5LCAxOCwgMTksIDE5LCAxOCwgMTksIDIwLCAxOCwKKyAgICAxOSwgIDQsICA2LCAgNywgIDgsICA5LCAgOSwgIDksCisgICAgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTYsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTUsIDE2LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE3LCAxNywgMTcsIDE2LCAxOCwgMTcsCisgICAgMTcsIDE3LCAxOCwgMTcsIDE3LCAxOCwgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE4LCAxNywgMTgsIDE4LCAxOCwKKyAgICAxNywgMTcsIDE4LCAxOSwgMTgsIDE4LCAxNywgMTcsCisgICAgMTgsIDE4LCAxOCwgMTgsIDE5LCAxNywgMTcsIDE4LAorICAgIDIwLCAxOSwgMTksIDE4LCAxOSwgMTgsIDE5LCAxOSwKKyAgICAxOSwgMTksIDE3LCAgNSwgIDcsICA5LCAxMCwgMTAsCisgICAgMTEsIDExLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwKKyAgICAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTcsIDE3LCAxNywKKyAgICAxNiwgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE2LAorICAgIDE2LCAxOSwgMTgsIDE4LCAxOSwgMTcsIDE5LCAyMCwKKyAgICAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgIDYsCisgICAgIDgsIDEwLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLAorICAgIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE3LCAxNywgMTcsIDE2LCAxNiwgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTYsIDE2LCAxNiwKKyAgICAxNywgMTgsIDE4LCAxOCwgMTcsIDE5LCAxOSwgMTgsCisgICAgMTgsIDE3LCAxOCwgMTksIDE4LCAxNywgMTgsIDE4LAorICAgIDE5LCAxOCwgMTcsIDE3LCAgNiwgIDksIDExLCAxMiwKKyAgICAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNywgMTYsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE4LCAxNywgMTgsIDE3LCAxNywgMTgsCisgICAgMTgsIDE5LCAxOSwgMTcsIDE3LCAgNywgMTAsIDEyLAorICAgIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTcsIDE4LAorICAgIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxNywKKyAgICAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgIDcsCisgICAgMTAsIDEyLCAxMywgMTQsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTgsIDE3LCAxNywgIDgsCisgICAgMTEsIDEzLCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LAorICAgIDE2LCAxOCwgMTcsIDE3LCAxOCwgMTcsIDE3LCAxOCwKKyAgICAxNywgMTcsIDE4LCAxOCwgMTksIDE4LCAxOCwgMTksCisgICAgMTksIDE5LCAxOCwgMTgsIDE4LCAgOCwgMTEsIDEzLAorICAgIDE0LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywKKyAgICAxNywgMTgsIDE3LCAxOCwgMTksIDE4LCAxOCwgMTgsCisgICAgMTgsIDE4LCAxOCwgIDgsIDEyLCAxNCwgMTUsIDE1LAorICAgIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOCwKKyAgICAxOCwgMTgsIDE4LCAxOCwgMTgsIDE3LCAgOSwgMTIsCisgICAgMTQsIDE1LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LAorICAgIDE4LCAgOSwgMTIsIDE0LCAxNSwgMTYsIDE3LCAxNywKKyAgICAxNywgMTgsICA5LCAxMywgMTUsIDE2LCAxNywgMTcsCisgICAgMTgsIDE3LCAxOCwgMTcsICA5LCAxMywgMTUsIDE2LAorICAgIDE3LCAxOCwgMTgsIDE4LCAxMCwgMTMsIDE1LCAxNiwKKyAgICAxOCwgMTAsIDE0LCAxNiwgMTcsIDE4LCAxMCwgMTQsCisgICAgMTYsIDE3LCAxMCwgMTQsIDE2LCAxOCwgMTgsIDEwLAorICAgIDE0LCAxNiwgMTgsIDE4LCAxMSwgMTUsIDE2LCAxMSwKKyAgICAxNSwgMTcsIDExLCAxNSwgMTcsIDExLCAxNSwgMTcsCisgICAgMTEsIDE1LCAxNywgMTEsIDE1LCAxNywgMTIsIDE2LAorICAgIDE3LCAxMiwgMTUsIDEyLCAxNiwgMTIsIDE2LCAxOCwKKyAgICAxMiwgMTYsIDEyLCAxNiwgMTIsIDE2LCAxMiwgMTYsCisgICAgMTcsIDEyLCAxNiwgMTgsIDEyLCAxNywgMTMsIDE2LAorICAgIDEzLCAxNiwgMTMsIDE2LCAxOCwgMTMsIDE2LCAxMywKKyAgICAxNywgMTMsIDE3LCAxMywgMTcsIDEzLCAxNywgMTMsCisgICAgMTcsIDEzLCAxNywgMTMsIDE3LCAxMywgMTcsIDEzLAorICAgIDE2LCAxMywgMTcsIDEzLCAxNywgMTMsIDE3LCAxNCwKKyAgICAxNywgMTQsIDE3LCAxNCwgMTcsIDE0LCAxNCwgMTQsCisgICAgMTcsIDE0LCAxNywgMTQsIDE0LCAxOCwgMTQsIDE0LAorICAgIDE4LCAxNCwgMTgsIDE0LCAxOCwgMTQsIDE3LCAxNCwKKyAgICAxNywgMTQsIDE3LCAxNCwgMTQsIDE4LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNCwgMTUsIDE1LCAxNCwgMTUsIDE1LAorICAgIDE1LCAxOCwgMTUsIDE4LCAxNSwgMTUsIDE3LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNiwgMTYsCisgICAgMTYsIDE3LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTYsIDE3LCAxNywgMTcsIDE3LCAxNiwKKyAgICAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxNiwgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBjb2VmNF9odWZmY29kZXNbNDc2XSA9IHsKKyAgICAweDAwZjAxLCAweDAwMDFlLCAweDAwMDAwLCAweDAwMDA0LCAweDAwMDA2LCAweDAwMDBkLCAweDAwMDBhLCAweDAwMDE3LAorICAgIDB4MDAwMWQsIDB4MDAwMTcsIDB4MDAwMmMsIDB4MDAwMzEsIDB4MDAwMzksIDB4MDAwM2UsIDB4MDAwMzksIDB4MDAwNWEsCisgICAgMHgwMDA2NiwgMHgwMDA3MCwgMHgwMDA3YiwgMHgwMDA3MCwgMHgwMDA3NywgMHgwMDBhZiwgMHgwMDBjOSwgMHgwMDBmMiwKKyAgICAweDAwMGY0LCAweDAwMGIyLCAweDAwMGUzLCAweDAwMTViLCAweDAwMTVkLCAweDAwMTgxLCAweDAwMTlkLCAweDAwMWUzLAorICAgIDB4MDAxYzUsIDB4MDAyYjUsIDB4MDAyZGIsIDB4MDAzMzgsIDB4MDAzYzMsIDB4MDAzY2MsIDB4MDAzZjAsIDB4MDAyY2QsCisgICAgMHgwMDNmYSwgMHgwMDNhMSwgMHgwMDViNCwgMHgwMDY1NywgMHgwMDdhYiwgMHgwMDc0ZCwgMHgwMDc0YywgMHgwMGFjMSwKKyAgICAweDAwYWM1LCAweDAwNzZiLCAweDAwY2E4LCAweDAwZjA0LCAweDAwZjAwLCAweDAwZmUzLCAweDAwZjNjLCAweDAwZjEwLAorICAgIDB4MDBmMzksIDB4MDBmZTYsIDB4MDBlMjYsIDB4MDBlOTAsIDB4MDE2YzUsIDB4MDE4MjcsIDB4MDE5NTQsIDB4MDE1YzUsCisgICAgMHgwMTk1OCwgMHgwMWY4YSwgMHgwMWM0YSwgMHgwMmIwZiwgMHgwMmI0MSwgMHgwMmIwZSwgMHgwMzNjNiwgMHgwMzA1MCwKKyAgICAweDAxYzRmLCAweDAyZDg4LCAweDAzMDVjLCAweDAzYzE4LCAweDAyYjRmLCAweDAyY2MyLCAweDAzYTQ3LCAweDA1NjgwLAorICAgIDB4MDU2OWQsIDB4MDY0NDIsIDB4MDY0NDMsIDB4MDY0NDYsIDB4MDY1NmUsIDB4MDY0NDQsIDB4MDcxMjAsIDB4MDc0OGEsCisgICAgMHgwYzFiYSwgMHgwN2UyMiwgMHgwN2FhNiwgMHgwN2YyNSwgMHgwN2FhNywgMHgwN2UyMCwgMHgwYzExYiwgMHgwYzExOCwKKyAgICAweDA3YWE1LCAweDBhZDBhLCAweDBmMzg5LCAweDE5ZWJiLCAweDBjYWFkLCAweDBmZTQyLCAweDBmZTQwLCAweDE2YzM0LAorICAgIDB4MmI0ZTUsIDB4MzNkNjUsIDB4MTZjMzAsIDB4MWU3YWUsIDB4MWUyNWMsIDB4MTgzNzAsIDB4MWU3MDMsIDB4MTllYmEsCisgICAgMHgxNmMzNywgMHgwZTIzNCwgMHgxNmM2ZSwgMHgwMDAwNCwgMHgwMDAyYSwgMHgwMDA2MSwgMHgwMDA3NSwgMHgwMDBjYiwKKyAgICAweDAwMGZmLCAweDAwMTkwLCAweDAwMWViLCAweDAwMWQxLCAweDAwMmI5LCAweDAwMzA3LCAweDAwMzM5LCAweDAwMzNmLAorICAgIDB4MDAzZmIsIDB4MDAzYjQsIDB4MDA2MGMsIDB4MDA2NzksIDB4MDA2NDUsIDB4MDA2N2QsIDB4MDA3OGEsIDB4MDA3ZTMsCisgICAgMHgwMDc0OSwgMHgwMGFjNCwgMHgwMGFkMiwgMHgwMGFlMywgMHgwMGMxMCwgMHgwMGMxNiwgMHgwMGFkMSwgMHgwMGNmNCwKKyAgICAweDAwZmUyLCAweDAxNTg2LCAweDAwZTlkLCAweDAxOWYxLCAweDAxNjY0LCAweDAxZTI2LCAweDAxZDM4LCAweDAyYjRkLAorICAgIDB4MDMzYzUsIDB4MDFmYzIsIDB4MDFmYzMsIDB4MDFkMjgsIDB4MDNjMWQsIDB4MDU5OGUsIDB4MGYwOTQsIDB4MDdhYTQsCisgICAgMHgwYWQzOCwgMHgwYWMwYywgMHgwYzExYSwgMHgwNzllYSwgMHgwYzg4MSwgMHgwZmU0NCwgMHgwYjYzNSwgMHgwYWMwZCwKKyAgICAweDBiNjFlLCAweDA1OTg3LCAweDA3MTIxLCAweDBmMzgyLCAweDBmMzg3LCAweDBlMjM3LCAweDBmZTQ3LCAweDBmMzgzLAorICAgIDB4MGYwOTEsIDB4MGYzODUsIDB4MGUyMzMsIDB4MTgyZWUsIDB4MTllYjgsIDB4MTY2M2UsIDB4MGYwOTMsIDB4MDAwMTQsCisgICAgMHgwMDA1OCwgMHgwMDE1OSwgMHgwMDE2NywgMHgwMDMwMCwgMHgwMDNkNCwgMHgwMDViNSwgMHgwMDc5ZCwgMHgwMDc2YSwKKyAgICAweDAwYjY3LCAweDAwYjYwLCAweDAwZjA1LCAweDAwY2YwLCAweDAwZjE3LCAweDAwZTk1LCAweDAxODIyLCAweDAxOTEzLAorICAgIDB4MDE2YzIsIDB4MDE4MmYsIDB4MDE5NTksIDB4MDFmY2IsIDB4MDFlMjcsIDB4MDFjNDAsIDB4MDMzYzcsIDB4MDFlN2IsCisgICAgMHgwMWM0OSwgMHgwMmQ4OSwgMHgwMWUyMywgMHgwMTY2MCwgMHgwM2YxMiwgMHgwMmNjNiwgMHgwMzNlMSwgMHgwNWIzNCwKKyAgICAweDA2MDlhLCAweDA2NTY5LCAweDA3NDg4LCAweDA3ZTIxLCAweDBjZjVmLCAweDA3MTJjLCAweDAzODlkLCAweDA2N2NmLAorICAgIDB4MDdmMjgsIDB4MTY2M2YsIDB4MzNkNjcsIDB4MTY2M2QsIDB4MWUyNWQsIDB4M2MxYWIsIDB4MTVjNDQsIDB4MTZjMzYsCisgICAgMHgwMDAxZiwgMHgwMDBlYywgMHgwMDMyMywgMHgwMDViMiwgMHgwMDc5ZiwgMHgwMGFjMiwgMHgwMGYxNiwgMHgwMGU5ZSwKKyAgICAweDAxOTU2LCAweDAxZTBmLCAweDAxOWVhLCAweDAxNjY2LCAweDAyYjg5LCAweDAyYjAyLCAweDAyZDhjLCAweDAzYzFiLAorICAgIDB4MDNjMTksIDB4MDMyYjUsIDB4MDNmOWMsIDB4MDJjY2YsIDB4MDM4OTcsIDB4MDViMzUsIDB4MGFkMDIsIDB4MDdmMjksCisgICAgMHgwNjQ0MSwgMHgwMzg4NCwgMHgwNzg4OCwgMHgwNzg0ZSwgMHgwNjU2OCwgMHgwYzFiYiwgMHgwNTk4NiwgMHgwNjdjYywKKyAgICAweDBmZTQ5LCAweDBmZTQ4LCAweDBjMWJjLCAweDBmZTQxLCAweDE4MzcxLCAweDE2NjNjLCAweDBlMjMxLCAweDA3MTFlLAorICAgIDB4MGFkMDksIDB4MGYwOTIsIDB4MDAwMmQsIDB4MDAxZGIsIDB4MDA3ODEsIDB4MDBjMWEsIDB4MDBmNTUsIDB4MDE1ODAsCisgICAgMHgwMWVhOCwgMHgwMmQ5YiwgMHgwMzJhZiwgMHgwM2YxNiwgMHgwM2MxYywgMHgwNzgzNCwgMHgwM2M0NSwgMHgwMzg5YywKKyAgICAweDA2N2NlLCAweDA2NDQ1LCAweDBjMWI5LCAweDA3ODg5LCAweDA3ZjNhLCAweDA3ODRmLCAweDA3ZjJiLCAweDBhZDBiLAorICAgIDB4MGYwOTAsIDB4MGMxMWQsIDB4MGU5NGUsIDB4MDcxMWYsIDB4MGU5ZjEsIDB4MGYzOGUsIDB4MDc5ZTksIDB4MGFkMDMsCisgICAgMHgwZjA5YiwgMHgwY2FhZSwgMHgwZmU0NiwgMHgyYjRlNiwgMHgwZTlmMCwgMHgxOWViNiwgMHg2N2FjMSwgMHg2N2FjMCwKKyAgICAweDMzZDY2LCAweDBmMzg4LCAweDAwMDcxLCAweDAwM2EwLCAweDAwY2E5LCAweDAxODI5LCAweDAxZDM5LCAweDAyYjQzLAorICAgIDB4MDJjYzQsIDB4MDY1NTQsIDB4MGYwOWEsIDB4MGI2MWYsIDB4MDY3Y2QsIDB4MDcxMWMsIDB4MGI2MzYsIDB4MDdmMmEsCisgICAgMHgwYjYzNCwgMHgwYzExZiwgMHgwY2Y1ZSwgMHgwYjYxZCwgMHgwZjA2YiwgMHgwY2FhYiwgMHgwYzFiZSwgMHgwZTk0YywKKyAgICAweDBmMDk5LCAweDE4MmVkLCAweDBlOTRmLCAweDBjMTE5LCAweDBlMjMyLCAweDJiNGU0LCAweDBmMzhhLCAweDE5ZWI0LAorICAgIDB4MWUyNWYsIDB4MGU5NGQsIDB4MDAwYjcsIDB4MDA3ODUsIDB4MDE2Y2MsIDB4MDMwNTEsIDB4MDMzYzQsIDB4MDY1NmYsCisgICAgMHgwMzg5MSwgMHgwNzExZCwgMHgwY2FhZiwgMHgwZjA5NywgMHgwNzQ4OSwgMHgwZjA5OCwgMHgwYzg4MCwgMHgwY2FhYSwKKyAgICAweDBmMzg2LCAweDE5ZWI3LCAweDE2YzZmLCAweDBmMzg0LCAweDE4MmU4LCAweDE4MmU5LCAweDBlMjMwLCAweDFlNzAwLAorICAgIDB4MzNkNjIsIDB4MzNkNjMsIDB4MzNkNjQsIDB4MTZjMzMsIDB4MGUyMTYsIDB4MDAwZmQsIDB4MDBjMTUsIDB4MDE2NjUsCisgICAgMHgwM2M0YSwgMHgwN2YzYiwgMHgwNzg5NiwgMHgwYzExYywgMHgwZTIxNSwgMHgxNmMzMiwgMHgwZjM4YiwgMHgwZjM4ZCwKKyAgICAweDE4MmVhLCAweDFlNzAxLCAweDcxMmRmLCAweDE1YzQ2LCAweDAwMTk0LCAweDAwZmUwLCAweDAzZjEzLCAweDA3NDhiLAorICAgIDB4MGYwOTYsIDB4MGNmODAsIDB4MWUyNWUsIDB4ZTI1YmQsIDB4MzNkNjEsIDB4MTZjMzEsIDB4MDAxZjksIDB4MDE5MTIsCisgICAgMHgwNTcxMCwgMHgwZjNkMCwgMHgwYzFiZiwgMHgwMDMwMSwgMHgwMWUyNCwgMHgwYWQwOCwgMHgwMDNjZCwgMHgwMWM0MSwKKyAgICAweDBjMWJkLCAweDAwNTYzLCAweDAzYTUyLCAweDBmM2QxLCAweDAwNTcwLCAweDAyY2NlLCAweDBlMjE3LCAweDAwNjdiLAorICAgIDB4MDY1NWQsIDB4MDA3NGIsIDB4MDY0NDcsIDB4MDBjMTIsIDB4MDc0ZmIsIDB4MDBmMDgsIDB4MGI2MWMsIDB4MDBlMjIsCisgICAgMHgwZmU0MywgMHgwMTZjNywgMHgwMTgzNiwgMHgwMTlmMiwgMHgwMWM0MywgMHgwMWQzZiwgMHgwMWZjZiwgMHgwMmI0YywKKyAgICAweDAzMDRjLCAweDAzMmI2LCAweDAzYTQ2LCAweDA1NjA3LCAweDAzZjE3LCAweDAyY2M1LCAweDA2MDliLCAweDA2NTVjLAorICAgIDB4MDdlMjMsIDB4MDY3YzEsIDB4MDdmMjYsIDB4MDdmMjcsIDB4MGYwOTUsIDB4MGU5ZjMsIDB4MGNmODEsIDB4MGMxMWUsCisgICAgMHgwY2FhYywgMHgwZjM4ZiwgMHgwZTlmMiwgMHgwNzRmYSwgMHgwZTIzNiwgMHgwZmU0NSwgMHgxYzQyOCwgMHgwZTIzNSwKKyAgICAweDE4MmVmLCAweDE5ZWI1LCAweDBmM2Q2LCAweDE4MmVjLCAweDE2YzM1LCAweDBmMzhjLCAweDJiNGU3LCAweDE1YzQ3LAorICAgIDB4ZTI1YmMsIDB4MWU3MDIsIDB4MWM0YjYsIDB4MGUyNWEsIDB4M2MxYWEsIDB4MTVjNDUsIDB4MWM0MjksIDB4MTllYjksCisgICAgMHgxZTdhZiwgMHgxODJlYiwgMHgxZTBkNCwgMHgzODk2ZSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZWY0X2h1ZmZiaXRzWzQ3Nl0gPSB7CisgICAgMTIsICA2LCAgMiwgIDMsICA0LCAgNCwgIDUsICA1LAorICAgICA1LCAgNiwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwKKyAgICAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwKKyAgICAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsCisgICAgMTUsIDE2LCAxNiwgMTcsIDE2LCAxNiwgMTYsIDE3LAorICAgIDE4LCAxOCwgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAgNCwgIDYsICA3LCAgOCwgIDgsCisgICAgIDgsICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEzLCAxMywgMTMsIDE0LCAxMywgMTQsIDE0LAorICAgIDE0LCAxMywgMTMsIDE0LCAxNCwgMTYsIDE2LCAxNSwKKyAgICAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTYsIDE2LAorICAgIDE2LCAxNiwgMTcsIDE3LCAxNywgMTgsIDE2LCAgNSwKKyAgICAgOCwgIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxMywKKyAgICAxNCwgMTQsIDEzLCAxNCwgMTQsIDE1LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNiwgMTUsIDE2LCAxNiwgMTUsIDE1LAorICAgIDE1LCAxOCwgMTgsIDE4LCAxNywgMTgsIDE3LCAxNywKKyAgICAgNiwgIDksIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsCisgICAgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE2LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTUsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxOCwgMTcsIDE2LAorICAgIDE2LCAxNiwgIDcsIDEwLCAxMSwgMTIsIDEyLCAxMywKKyAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE2LAorICAgIDE2LCAxNiwgMTcsIDE2LCAxNywgMTYsIDE1LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxOCwgMTcsIDE3LCAxOSwgMTksCisgICAgMTgsIDE2LCAgNywgMTEsIDEyLCAxMywgMTQsIDE0LAorICAgIDE1LCAxNSwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNSwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsCisgICAgMTYsIDE3LCAxNywgMTYsIDE3LCAxOCwgMTYsIDE3LAorICAgIDE3LCAxNywgIDgsIDExLCAxMywgMTQsIDE0LCAxNSwKKyAgICAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE3LCAxNywgMTYsIDE3LCAxNywgMTcsIDE3LAorICAgIDE4LCAxOCwgMTgsIDE3LCAxNywgIDgsIDEyLCAxNCwKKyAgICAxNCwgMTUsIDE1LCAxNiwgMTcsIDE3LCAxNiwgMTYsCisgICAgMTcsIDE3LCAyMCwgMTcsICA5LCAxMiwgMTQsIDE2LAorICAgIDE2LCAxNiwgMTcsIDIxLCAxOCwgMTcsICA5LCAxMywKKyAgICAxNSwgMTYsIDE2LCAxMCwgMTMsIDE2LCAxMCwgMTQsCisgICAgMTYsIDExLCAxNSwgMTYsIDExLCAxNSwgMTcsIDExLAorICAgIDE1LCAxMiwgMTUsIDEyLCAxNiwgMTIsIDE2LCAxMywKKyAgICAxNiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxMywgMTQsCisgICAgMTQsIDE0LCAxNSwgMTUsIDE0LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTcsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE3LCAxNiwgMTcsIDE2LCAxOCwgMTcsCisgICAgMTcsIDE3LCAxNiwgMTcsIDE3LCAxNiwgMTgsIDE3LAorICAgIDIxLCAxNywgMTgsIDE3LCAxOCwgMTcsIDE4LCAxNywKKyAgICAxNywgMTcsIDE3LCAxOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBjb2VmNV9odWZmY29kZXNbNDM1XSA9IHsKKyAgICAweDAwMzQ3LCAweDAwMDBiLCAweDAwMDAxLCAweDAwMDAxLCAweDAwMDBjLCAweDAwMDA0LCAweDAwMDEwLCAweDAwMDE1LAorICAgIDB4MDAwMWYsIDB4MDAwMGIsIDB4MDAwMjMsIDB4MDAwMjYsIDB4MDAwMjksIDB4MDAwMzUsIDB4MDAwMzcsIDB4MDAwMDEsCisgICAgMHgwMDAxNSwgMHgwMDAxYSwgMHgwMDAxZCwgMHgwMDAxYywgMHgwMDAxZSwgMHgwMDA0ZSwgMHgwMDA0OSwgMHgwMDA1MSwKKyAgICAweDAwMDc4LCAweDAwMDA0LCAweDAwMDAwLCAweDAwMDA4LCAweDAwMDBkLCAweDAwMDdiLCAweDAwMDA1LCAweDAwMDMyLAorICAgIDB4MDAwOTUsIDB4MDAwOTEsIDB4MDAwOTYsIDB4MDAwYTEsIDB4MDAwZDksIDB4MDAwMDMsIDB4MDAwMTksIDB4MDAwNjEsCisgICAgMHgwMDA2NiwgMHgwMDA2MCwgMHgwMDAxNywgMHgwMDAwZSwgMHgwMDA2MywgMHgwMDFhMCwgMHgwMDFiNywgMHgwMDFlNiwKKyAgICAweDAwMWU3LCAweDAwMWI2LCAweDAwMDE4LCAweDAwMWU4LCAweDAwMDM4LCAweDAwMDMxLCAweDAwMDA1LCAweDAwMDNkLAorICAgIDB4MDAwMjcsIDB4MDAxZWEsIDB4MDAwMWEsIDB4MDAwYzUsIDB4MDAwZjksIDB4MDAwZmYsIDB4MDAwZGIsIDB4MDAyNTAsCisgICAgMHgwMDBmYywgMHgwMDI1YywgMHgwMDAwOCwgMHgwMDA3NSwgMHgwMDNkNywgMHgwMDNkMywgMHgwMDFiMCwgMHgwMDA3YywKKyAgICAweDAwM2NhLCAweDAwMDM2LCAweDAwMTg5LCAweDAwNGE2LCAweDAwNGEyLCAweDAwNGZiLCAweDAwMGMwLCAweDAwMDdmLAorICAgIDB4MDAwOWEsIDB4MDAzMTEsIDB4MDAwNmUsIDB4MDAwOWIsIDB4MDA2OGMsIDB4MDA2YzAsIDB4MDA0ODQsIDB4MDAwMTIsCisgICAgMHgwMDBjMywgMHgwMDk0ZiwgMHgwMDk3OSwgMHgwMDlmOSwgMHgwMGQwOSwgMHgwMGRhNiwgMHgwMGRhOCwgMHgwMDkwMSwKKyAgICAweDAwMGMxLCAweDAwMzczLCAweDAwZDA4LCAweDAwOWZhLCAweDAwZDhiLCAweDAwZDg1LCAweDAwZDg2LCAweDAwMGRmLAorICAgIDB4MDA2ZTIsIDB4MDAwY2UsIDB4MDBmMjQsIDB4MDA5ZmUsIDB4MDAxZjcsIDB4MDA3YzEsIDB4MDAwY2YsIDB4MDA5ZmMsCisgICAgMHgwMDlmZiwgMHgwMGQ4OSwgMHgwMGRhOSwgMHgwMDlmZCwgMHgwMDFmOCwgMHgwMWEzNiwgMHgwMTI4YywgMHgwMTI5ZCwKKyAgICAweDAxYTM3LCAweDAwMTk2LCAweDAwM2VhLCAweDAwZjhiLCAweDAwZDkzLCAweDAxZTQ1LCAweDAxZTU4LCAweDAxZTRiLAorICAgIDB4MDFlNTksIDB4MDEzZjEsIDB4MDAzMDksIDB4MDAyNjUsIDB4MDAzMDgsIDB4MDI0M2EsIDB4MDI3ZTEsIDB4MDBmODksCisgICAgMHgwMDMyNCwgMHgwM2NiYywgMHgwM2M4NiwgMHgwMzY5NSwgMHgwMjQzYywgMHgwMjQzYiwgMHgwMjQzZSwgMHgwMWU0YSwKKyAgICAweDAwM2E1LCAweDAzNDY4LCAweDAzNDI4LCAweDAzYzg0LCAweDAyN2UwLCAweDAyNWUyLCAweDAxODgwLCAweDAwMTk3LAorICAgIDB4MDAzMjUsIDB4MDNjYjcsIDB4MDc5MWUsIDB4MDA3ZWMsIDB4MDZjNzUsIDB4MDA0YzgsIDB4MDRiYzcsIDB4MDA0YzYsCisgICAgMHgwMDk4MywgMHgwNDgxZSwgMHgwMWI1MywgMHgwMjUxYiwgMHgwMWI1OCwgMHgwMDk4NCwgMHgwNGZhOCwgMHgwM2NiYiwKKyAgICAweDAwZjhhLCAweDAwMzIyLCAweDAzNDZhLCAweDAyNDNkLCAweDAwMzI2LCAweDAzNDY5LCAweDA0ODFmLCAweDA0ODFkLAorICAgIDB4MDA3NDYsIDB4MDkwMzIsIDB4MDFiNTAsIDB4MDFkMTMsIDB4MGQ4ZTQsIDB4MDQ4MWIsIDB4MDZjNzQsIDB4MDc5NmIsCisgICAgMHgwNzk2OSwgMHgwMDk4NSwgMHgwZDhlMywgMHgwMDk4NiwgMHgwMGZhMiwgMHgwMTMwMSwgMHgwNmM3YywgMHgwMDk4NywKKyAgICAweDAzY2I4LCAweDBmNGFmLCAweDAwZTg4LCAweDFiMWMwLCAweDAwZmNlLCAweDAzM2ViLCAweDAzZjZhLCAweDAzZjY5LAorICAgIDB4MDBmY2YsIDB4MDc5MWYsIDB4MDA0YzksIDB4MDQ4NzEsIDB4MDBmY2QsIDB4MDA5ODIsIDB4MDBmY2MsIDB4MDBmYTMsCisgICAgMHgwMWQxMiwgMHgwNzk2YywgMHgwMWI0NywgMHgwMDMyMSwgMHgwNzk2YSwgMHgwZDhlMiwgMHgwNDg3MiwgMHgwNDg3MywKKyAgICAweDAwMDBlLCAweDAwMDE0LCAweDAwMDBhLCAweDAwMGEwLCAweDAwMDEyLCAweDAwMDdkLCAweDAwMWEyLCAweDAwMDNiLAorICAgIDB4MDAyNWYsIDB4MDAwZGQsIDB4MDAyN2MsIDB4MDAzNDMsIDB4MDAzNjgsIDB4MDAzNmIsIDB4MDAwM2UsIDB4MDAxZmEsCisgICAgMHgwMDQ4NSwgMHgwMDFiMywgMHgwMDA3ZiwgMHgwMDFiMSwgMHgwMDE5ZSwgMHgwMDRiYSwgMHgwMDdhZCwgMHgwMDMzOSwKKyAgICAweDAwMDY2LCAweDAwN2E0LCAweDAwNzkzLCAweDAwNmM2LCAweDAwMDdlLCAweDAwMGYxLCAweDAwMzcyLCAweDAwOWZiLAorICAgIDB4MDBkODMsIDB4MDBkOGEsIDB4MDA5NDcsIDB4MDA5ZjQsIDB4MDAxZDAsIDB4MDFiMDksIDB4MDFiNGIsIDB4MDA3ZWMsCisgICAgMHgwMDNlMSwgMHgwMDBjYSwgMHgwMDNlYywgMHgwMjUzOSwgMHgwNGZhOSwgMHgwMWI1NywgMHgwMzQyOSwgMHgwM2QyYSwKKyAgICAweDAwZDk3LCAweDAwM2E3LCAweDAwZGMwLCAweDAwZDk2LCAweDAwZGMxLCAweDAwN2ViLCAweDAzY2JhLCAweDAwYzQzLAorICAgIDB4MDBjNDEsIDB4MDFiNTIsIDB4MDA3ZWYsIDB4MDAzMjMsIDB4MDNjYjksIDB4MDNjODMsIDB4MDA3ZDAsIDB4MDA3ZWQsCisgICAgMHgwNmM3ZiwgMHgwOTAzMywgMHgwM2Y2YywgMHgzNjM4MywgMHgxZTk1ZCwgMHgwNmM3OCwgMHgwMDc0NywgMHgwMWI1MSwKKyAgICAweDAwMDIyLCAweDAwMDE2LCAweDAwMDM5LCAweDAwMjUyLCAweDAwMDc5LCAweDAwNDg2LCAweDAwMzM4LCAweDAwMzY5LAorICAgIDB4MDBkODgsIDB4MDAwMjYsIDB4MDBkODcsIDB4MDBmNGIsIDB4MDBkODIsIDB4MDAwMjcsIDB4MDAxZTEsIDB4MDFhMTUsCisgICAgMHgwMDdjNywgMHgwMTJmMCwgMHgwMDFlMCwgMHgwMDZkMCwgMHgwMWExNiwgMHgwMWU0NCwgMHgwMWU1ZiwgMHgwMzY5MCwKKyAgICAweDAwZDkwLCAweDAwYzQyLCAweDAwZGFmLCAweDAwZDkyLCAweDAwZjgwLCAweDAwY2ZiLCAweDAzNDJmLCAweDA0ODdmLAorICAgIDB4MDFiNDYsIDB4MDc5NjgsIDB4MDBkOTUsIDB4MDBkOTEsIDB4MDFiNTUsIDB4MDNmNjgsIDB4MDRiYzYsIDB4MDNjYmQsCisgICAgMHgwMGY4MSwgMHgwMDMyMCwgMHgwMDA2OSwgMHgwMDBmZSwgMHgwMDZkNSwgMHgwMDMzZiwgMHgwMDBkZSwgMHgwMDdjNiwKKyAgICAweDAxZTQwLCAweDAwZDk0LCAweDAwZjg4LCAweDAzYzhlLCAweDAzNjk0LCAweDAwZGFlLCAweDAwZGFkLCAweDAwMjY3LAorICAgIDB4MDAzYTYsIDB4MDAzMjcsIDB4MDQ4N2UsIDB4MDA3ZWUsIDB4MDA3NDksIDB4MDA0YzcsIDB4MDM2OTIsIDB4MDFiNTYsCisgICAgMHgwMGZkMSwgMHgwN2E1NiwgMHgwNmM3NywgMHgwOTAzMSwgMHgwMDc0OCwgMHgwNmM3YSwgMHgwNzk2ZCwgMHgwMzNlYSwKKyAgICAweDA2Yzc2LCAweDAwZmQwLCAweDM2MzgyLCAweDFlNDE3LCAweDAwNzQ1LCAweDA0ZmFmLCAweDBkOGUxLCAweDAzZjZiLAorICAgIDB4MWU5NWMsIDB4MDRmYWQsIDB4MDAwOWUsIDB4MDA0YmQsIDB4MDA2N2MsIDB4MDFiMDgsIDB4MDAzZWIsIDB4MDFiNDUsCisgICAgMHgwMzY5MSwgMHgwZDhlNSwgMHgwNzkwNCwgMHgwMDk4MSwgMHgwMDdlYSwgMHgwMTlmNCwgMHgwNmM3ZCwgMHgwNGZhYiwKKyAgICAweDA0ZmFjLCAweDA2YzdlLCAweDAxMzAwLCAweDA2YzdiLCAweDAwMDZmLCAweDAwM2Y3LCAweDAzYzg1LCAweDAwNGM0LAorICAgIDB4MDAwMWUsIDB4MDA2ZTEsIDB4MDM2OTMsIDB4MDFiNDQsIDB4MDAyNDEsIDB4MDFlNDYsIDB4MDAxOWQsIDB4MDAyNjYsCisgICAgMHgwMDRiYiwgMHgwMjUzOCwgMHgwMDdhYywgMHgwMWI1NCwgMHgwMDkwMiwgMHgwNDg3MCwgMHgwMGRhNywgMHgwMDkwMCwKKyAgICAweDAwMTg1LCAweDA2Yzc5LCAweDAwNmUzLCAweDAwM2U5LCAweDAxZTk0LCAweDAwM2VkLCAweDAwM2YyLCAweDAzNDJlLAorICAgIDB4MDM0NmIsIDB4MDI1MWEsIDB4MDA0YzUsIDB4MDE4ODEsIDB4MDQ4MWMsIDB4MDFiNTksIDB4MDNjODcsIDB4MDRmYWUsCisgICAgMHgwMDdlOSwgMHgwM2Y2ZCwgMHgwZjIwYSwgMHgwOTAzMCwgMHgwNGZhYSwgMHgwZDhlNiwgMHgwM2Y2ZiwgMHgwNDgxYSwKKyAgICAweDAzZjZlLCAweDFlNDE2LCAweDBkOGU3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29lZjVfaHVmZmJpdHNbNDM1XSA9IHsKKyAgICAxMCwgIDQsICAyLCAgNCwgIDQsICA1LCAgNSwgIDUsCisgICAgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA3LAorICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDgsICA4LCAgOCwgIDgsICA3LCAgOCwgIDgsCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LAorICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOSwgIDksIDEwLCAgOSwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTEsIDExLCAxMCwgMTAsIDExLCAxMSwKKyAgICAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsCisgICAgMTMsIDEzLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTQsCisgICAgMTUsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE2LCAxNSwgMTUsIDE0LCAxNSwgMTYsIDE1LCAxNCwKKyAgICAxNCwgMTUsIDE0LCAxNCwgMTUsIDE0LCAxNSwgMTUsCisgICAgMTUsIDE2LCAxNSwgMTcsIDE2LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE1LCAxNiwKKyAgICAxNCwgMTYsIDE2LCAxNywgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE3LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE1LCAxNSwKKyAgICAgNCwgIDcsICA4LCAgOCwgIDksICA5LCAgOSwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLAorICAgIDEyLCAxMywgMTQsIDE0LCAxNSwgMTUsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNCwgMTQsCisgICAgMTQsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTUsIDE1LAorICAgIDE1LCAxNiwgMTYsIDE4LCAxNywgMTUsIDE1LCAxNSwKKyAgICAgNiwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsCisgICAgMTIsIDEzLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNCwgMTQsIDE1LCAxNiwgMTUsIDE0LAorICAgIDE0LCAxNSwgIDcsIDEwLCAxMSwgMTIsIDEzLCAxMywKKyAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE1LAorICAgIDE2LCAxNSwgMTUsIDE2LCAxNSwgMTUsIDE1LCAxNiwKKyAgICAxNSwgMTYsIDE4LCAxNywgMTUsIDE1LCAxNiwgMTYsCisgICAgMTcsIDE1LCAgOCwgMTEsIDEzLCAxMywgMTQsIDE1LAorICAgIDE0LCAxNiwgMTUsIDE2LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE3LCAxNSwgIDksIDEyLCAxNCwgMTUsCisgICAgMTAsIDEzLCAxNCwgMTUsIDEwLCAxMywgMTEsIDE0LAorICAgIDExLCAxNCwgMTEsIDE1LCAxMiwgMTUsIDEyLCAxMiwKKyAgICAxMywgMTUsIDEzLCAxNCwgMTMsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE1LAorICAgIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNSwKKyAgICAxNiwgMTcsIDE2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGxldmVsczBbNjBdID0geworICAgIDMxNywgOTIsIDYyLCA2MCwgMTksIDE3LCAxMCwgNywKKyAgICAgIDYsICA1LCAgNSwgIDMsICAzLCAgMywgIDIsIDIsCisgICAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDEsICAyLCAyLAorICAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgMSwKKyAgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIDEsCisgICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAxLAorICAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgMSwKKyAgICAgIDEsICAxLCAgMSwgIDEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgbGV2ZWxzMVs0MF0gPSB7CisgICAgMzExLCA5MSwgNjEsIDI4LCAxMCwgNiwgNSwgMiwKKyAgICAgIDIsICAyLCAgMiwgIDIsICAyLCAyLCAyLCAxLAorICAgICAgMSwgIDEsICAxLCAgMSwgIDEsIDEsIDEsIDEsCisgICAgICAxLCAgMSwgIDEsICAxLCAgMSwgMSwgMSwgMSwKKyAgICAgIDEsICAxLCAgMSwgIDEsICAxLCAxLCAxLCAxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGxldmVsczJbMzQwXSA9IHsKKyAgICAxODEsIDExMCwgNzgsIDYzLCA2MSwgNjIsIDYwLCA2MSwKKyAgICAgMzMsICA0MSwgNDEsIDE5LCAxNywgMTksIDEyLCAxMSwKKyAgICAgIDksICAxMSwgMTAsICA2LCAgOCwgIDcsICA2LCAgNCwKKyAgICAgIDUsICAgNSwgIDQsICA0LCAgMywgIDQsICAzLCAgNSwKKyAgICAgIDMsICAgNCwgIDMsICAzLCAgMywgIDMsICAzLCAgMywKKyAgICAgIDIsICAgMiwgIDQsICAyLCAgMywgIDIsICAzLCAgMywKKyAgICAgIDIsICAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwKKyAgICAgIDMsICAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwKKyAgICAgIDIsICAgMiwgIDIsICAxLCAgMiwgIDEsICAyLCAgMiwKKyAgICAgIDIsICAgMiwgIDEsICAyLCAgMSwgIDEsICAxLCAgMiwKKyAgICAgIDIsICAgMSwgIDIsICAxLCAgMiwgIDIsICAyLCAgMiwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGxldmVsczNbMTgwXSA9IHsKKyAgICAzNTEsIDEyMiwgNzYsIDYxLCA0MSwgNDIsIDI0LCAzMCwKKyAgICAgMjIsICAxOSwgMTEsICA5LCAxMCwgIDgsICA1LCAgNSwKKyAgICAgIDQsICAgNSwgIDUsICAzLCAgMywgIDMsICAzLCAgMywKKyAgICAgIDMsICAgMywgIDIsICAyLCAgMywgIDIsICAyLCAgMiwKKyAgICAgIDMsICAgMywgIDIsICAyLCAgMiwgIDMsICAyLCAgMiwKKyAgICAgIDIsICAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwKKyAgICAgIDIsICAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAgMSwKKyAgICAgIDIsICAgMiwgIDEsICAyLCAgMSwgIDIsICAyLCAgMiwKKyAgICAgIDIsICAgMiwgIDIsICAxLCAgMiwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwKKyAgICAgIDIsICAgMSwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAgMSwgIDEsICAxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGxldmVsczRbNzBdID0geworICAgIDExMywgNjgsIDQ5LCA0MiwgNDAsIDMyLCAyNywgMTUsCisgICAgIDEwLCAgNSwgIDMsICAzLCAgMywgIDMsICAyLCAgMiwKKyAgICAgIDIsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBsZXZlbHM1WzQwXSA9IHsKKyAgICAyMTQsIDcyLCA0MiwgNDAsIDE4LCA0LCA0LCAyLAorICAgICAgMiwgIDIsICAyLCAgMiwgIDEsIDEsIDIsIDEsCisgICAgICAxLCAgMSwgIDEsICAxLCAgMSwgMSwgMSwgMSwKKyAgICAgIDEsICAxLCAgMSwgIDEsICAxLCAxLCAxLCAxLAorICAgICAgMSwgIDEsICAxLCAgMSwgIDEsIDEsIDEsIDEsCit9OworCitzdGF0aWMgY29uc3QgQ29lZlZMQ1RhYmxlIGNvZWZfdmxjc1s2XSA9IHsKKyAgICB7IHNpemVvZihjb2VmMF9odWZmYml0cyksIHNpemVvZihsZXZlbHMwKSAvIDIsIGNvZWYwX2h1ZmZjb2RlcywgY29lZjBfaHVmZmJpdHMsIGxldmVsczAsIH0sCisgICAgeyBzaXplb2YoY29lZjFfaHVmZmJpdHMpLCBzaXplb2YobGV2ZWxzMSkgLyAyLCBjb2VmMV9odWZmY29kZXMsIGNvZWYxX2h1ZmZiaXRzLCBsZXZlbHMxLCB9LAorICAgIHsgc2l6ZW9mKGNvZWYyX2h1ZmZiaXRzKSwgc2l6ZW9mKGxldmVsczIpIC8gMiwgY29lZjJfaHVmZmNvZGVzLCBjb2VmMl9odWZmYml0cywgbGV2ZWxzMiwgfSwKKyAgICB7IHNpemVvZihjb2VmM19odWZmYml0cyksIHNpemVvZihsZXZlbHMzKSAvIDIsIGNvZWYzX2h1ZmZjb2RlcywgY29lZjNfaHVmZmJpdHMsIGxldmVsczMsIH0sCisgICAgeyBzaXplb2YoY29lZjRfaHVmZmJpdHMpLCBzaXplb2YobGV2ZWxzNCkgLyAyLCBjb2VmNF9odWZmY29kZXMsIGNvZWY0X2h1ZmZiaXRzLCBsZXZlbHM0LCB9LAorICAgIHsgc2l6ZW9mKGNvZWY1X2h1ZmZiaXRzKSwgc2l6ZW9mKGxldmVsczUpIC8gMiwgY29lZjVfaHVmZmNvZGVzLCBjb2VmNV9odWZmYml0cywgbGV2ZWxzNSwgfSwKK307CisKKyNlbmRpZiAvKiBBVkNPREVDX1dNQURBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvd21hZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy93bWFkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzJjYTZmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvd21hZGVjLmMKQEAgLTAsMCArMSw5ODIgQEAKKy8qCisgKiBXTUEgY29tcGF0aWJsZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFdNQSBjb21wYXRpYmxlIGRlY29kZXIuCisgKiBUaGlzIGRlY29kZXIgaGFuZGxlcyBNaWNyb3NvZnQgV2luZG93cyBNZWRpYSBBdWRpbyBkYXRhLCB2ZXJzaW9ucyAxICYgMi4KKyAqIFdNQSB2MSBpcyBpZGVudGlmaWVkIGJ5IGF1ZGlvIGZvcm1hdCAweDE2MCBpbiBNaWNyb3NvZnQgbWVkaWEgZmlsZXMKKyAqIChBU0YvQVZJL1dBVikuIFdNQSB2MiBpcyBpZGVudGlmaWVkIGJ5IGF1ZGlvIGZvcm1hdCAweDE2MS4KKyAqCisgKiBUbyB1c2UgdGhpcyBkZWNvZGVyLCBhIGNhbGxpbmcgYXBwbGljYXRpb24gbXVzdCBzdXBwbHkgdGhlIGV4dHJhIGRhdGEKKyAqIGJ5dGVzIHByb3ZpZGVkIHdpdGggdGhlIFdNQSBkYXRhLiBUaGVzZSBhcmUgdGhlIGV4dHJhLCBjb2RlYy1zcGVjaWZpYworICogYnl0ZXMgYXQgdGhlIGVuZCBvZiBhIFdBVkVGT1JNQVRFWCBkYXRhIHN0cnVjdHVyZS4gVHJhbnNtaXQgdGhlc2UgYnl0ZXMKKyAqIHRvIHRoZSBkZWNvZGVyIHVzaW5nIHRoZSBleHRyYWRhdGFbX3NpemVdIGZpZWxkcyBpbiBBVkNvZGVjQ29udGV4dC4gVGhlcmUKKyAqIHNob3VsZCBiZSA0IGV4dHJhIGJ5dGVzIGZvciB2MSBkYXRhIGFuZCA2IGV4dHJhIGJ5dGVzIGZvciB2MiBkYXRhLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAid21hLmgiCisKKyN1bmRlZiBOREVCVUcKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBFWFBWTENCSVRTIDgKKyNkZWZpbmUgRVhQTUFYICAgICAoKDE5ICsgRVhQVkxDQklUUyAtIDEpIC8gRVhQVkxDQklUUykKKworI2RlZmluZSBIR0FJTlZMQ0JJVFMgOQorI2RlZmluZSBIR0FJTk1BWCAgICAgKCgxMyArIEhHQUlOVkxDQklUUyAtIDEpIC8gSEdBSU5WTENCSVRTKQorCitzdGF0aWMgdm9pZCB3bWFfbHNwX3RvX2N1cnZlX2luaXQoV01BQ29kZWNDb250ZXh0ICpzLCBpbnQgZnJhbWVfbGVuKTsKKworI2lmZGVmIFRSQUNFCitzdGF0aWMgdm9pZCBkdW1wX2Zsb2F0cyhXTUFDb2RlY0NvbnRleHQgKnMsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlYywgY29uc3QgZmxvYXQgKnRhYiwgaW50IG4pCit7CisgICAgaW50IGk7CisKKyAgICB0cHJpbnRmKHMtPmF2Y3R4LCAiJXNbJWRdOlxuIiwgbmFtZSwgbik7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpZiAoKGkgJiA3KSA9PSAwKQorICAgICAgICAgICAgdHByaW50ZihzLT5hdmN0eCwgIiU0ZDogIiwgaSk7CisgICAgICAgIHRwcmludGYocy0+YXZjdHgsICIgJTguKmYiLCBwcmVjLCB0YWJbaV0pOworICAgICAgICBpZiAoKGkgJiA3KSA9PSA3KQorICAgICAgICAgICAgdHByaW50ZihzLT5hdmN0eCwgIlxuIik7CisgICAgfQorICAgIGlmICgoaSAmIDcpICE9IDApCisgICAgICAgIHRwcmludGYocy0+YXZjdHgsICJcbiIpOworfQorI2VuZGlmIC8qIFRSQUNFICovCisKK3N0YXRpYyBhdl9jb2xkIGludCB3bWFfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFdNQUNvZGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIGZsYWdzMjsKKyAgICB1aW50OF90ICpleHRyYWRhdGE7CisKKyAgICBpZiAoIWF2Y3R4LT5ibG9ja19hbGlnbikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJsb2NrX2FsaWduIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICAvKiBleHRyYWN0IGZsYWcgaW5mb3MgKi8KKyAgICBmbGFnczIgICAgPSAwOworICAgIGV4dHJhZGF0YSA9IGF2Y3R4LT5leHRyYWRhdGE7CisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfV01BVjEgJiYgYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDQpCisgICAgICAgIGZsYWdzMiA9IEFWX1JMMTYoZXh0cmFkYXRhICsgMik7CisgICAgZWxzZSBpZiAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9XTUFWMiAmJiBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPj0gNikKKyAgICAgICAgZmxhZ3MyID0gQVZfUkwxNihleHRyYWRhdGEgKyA0KTsKKworICAgIHMtPnVzZV9leHBfdmxjICAgICAgICAgICAgPSBmbGFnczIgJiAweDAwMDE7CisgICAgcy0+dXNlX2JpdF9yZXNlcnZvaXIgICAgICA9IGZsYWdzMiAmIDB4MDAwMjsKKyAgICBzLT51c2VfdmFyaWFibGVfYmxvY2tfbGVuID0gZmxhZ3MyICYgMHgwMDA0OworCisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfV01BVjIgJiYgYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDgpeworICAgICAgICBpZiAoQVZfUkwxNihleHRyYWRhdGErNCk9PTB4ZCAmJiBzLT51c2VfdmFyaWFibGVfYmxvY2tfbGVuKXsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJEaXNhYmxpbmcgdXNlX3ZhcmlhYmxlX2Jsb2NrX2xlbiwgaWYgdGhpcyBmYWlscyBjb250YWN0IHRoZSBmZm1wZWcgZGV2ZWxvcGVycyBhbmQgc2VuZCB1cyB0aGUgZmlsZVxuIik7CisgICAgICAgICAgICBzLT51c2VfdmFyaWFibGVfYmxvY2tfbGVuPSAwOyAvLyB0aGlzIGZpeGVzIGlzc3VlMTUwMworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpPTA7IGk8TUFYX0NIQU5ORUxTOyBpKyspCisgICAgICAgIHMtPm1heF9leHBvbmVudFtpXSA9IDEuMDsKKworICAgIGlmIChmZl93bWFfaW5pdChhdmN0eCwgZmxhZ3MyKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGluaXQgTURDVCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9ibG9ja19zaXplczsgaSsrKQorICAgICAgICBmZl9tZGN0X2luaXQoJnMtPm1kY3RfY3R4W2ldLCBzLT5mcmFtZV9sZW5fYml0cyAtIGkgKyAxLCAxLCAxLjAgLyAzMjc2OC4wKTsKKworICAgIGlmIChzLT51c2Vfbm9pc2VfY29kaW5nKSB7CisgICAgICAgIGluaXRfdmxjKCZzLT5oZ2Fpbl92bGMsIEhHQUlOVkxDQklUUywgc2l6ZW9mKGZmX3dtYV9oZ2Fpbl9odWZmYml0cyksCisgICAgICAgICAgICAgICAgIGZmX3dtYV9oZ2Fpbl9odWZmYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgZmZfd21hX2hnYWluX2h1ZmZjb2RlcywgMiwgMiwgMCk7CisgICAgfQorCisgICAgaWYgKHMtPnVzZV9leHBfdmxjKQorICAgICAgICBpbml0X3ZsYygmcy0+ZXhwX3ZsYywgRVhQVkxDQklUUywgc2l6ZW9mKGZmX2FhY19zY2FsZWZhY3Rvcl9iaXRzKSwgLy8gRklYTUUgbW92ZSBvdXQgb2YgY29udGV4dAorICAgICAgICAgICAgICAgICBmZl9hYWNfc2NhbGVmYWN0b3JfYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgZmZfYWFjX3NjYWxlZmFjdG9yX2NvZGUsIDQsIDQsIDApOworICAgIGVsc2UKKyAgICAgICAgd21hX2xzcF90b19jdXJ2ZV9pbml0KHMsIHMtPmZyYW1lX2xlbik7CisKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfRkxUUDsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIGNvbXB1dGUgeF4tMC4yNSB3aXRoIGFuIGV4cG9uZW50IGFuZCBtYW50aXNzYSB0YWJsZS4gV2UgdXNlIGxpbmVhcgorICogaW50ZXJwb2xhdGlvbiB0byByZWR1Y2UgdGhlIG1hbnRpc3NhIHRhYmxlIHNpemUgYXQgYSBzbWFsbCBzcGVlZAorICogZXhwZW5zZSAobGluZWFyIGludGVycG9sYXRpb24gYXBwcm94aW1hdGVseSBkb3VibGVzIHRoZSBudW1iZXIgb2YKKyAqIGJpdHMgb2YgcHJlY2lzaW9uKS4KKyAqLworc3RhdGljIGlubGluZSBmbG9hdCBwb3dfbTFfNChXTUFDb2RlY0NvbnRleHQgKnMsIGZsb2F0IHgpCit7CisgICAgdW5pb24geworICAgICAgICBmbG9hdCBmOworICAgICAgICB1bnNpZ25lZCBpbnQgdjsKKyAgICB9IHUsIHQ7CisgICAgdW5zaWduZWQgaW50IGUsIG07CisgICAgZmxvYXQgYSwgYjsKKworICAgIHUuZiA9IHg7CisgICAgZSAgID0gIHUudiA+PiAgMjM7CisgICAgbSAgID0gKHUudiA+PiAoMjMgLSBMU1BfUE9XX0JJVFMpKSAmICgoMSA8PCBMU1BfUE9XX0JJVFMpIC0gMSk7CisgICAgLyogYnVpbGQgaW50ZXJwb2xhdGlvbiBzY2FsZTogMSA8PSB0IDwgMi4gKi8KKyAgICB0LnYgPSAoKHUudiA8PCBMU1BfUE9XX0JJVFMpICYgKCgxIDw8IDIzKSAtIDEpKSB8ICgxMjcgPDwgMjMpOworICAgIGEgICA9IHMtPmxzcF9wb3dfbV90YWJsZTFbbV07CisgICAgYiAgID0gcy0+bHNwX3Bvd19tX3RhYmxlMlttXTsKKyAgICByZXR1cm4gcy0+bHNwX3Bvd19lX3RhYmxlW2VdICogKGEgKyBiICogdC5mKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB3bWFfbHNwX3RvX2N1cnZlX2luaXQoV01BQ29kZWNDb250ZXh0ICpzLCBpbnQgZnJhbWVfbGVuKQoreworICAgIGZsb2F0IHdkZWwsIGEsIGI7CisgICAgaW50IGksIGUsIG07CisKKyAgICB3ZGVsID0gTV9QSSAvIGZyYW1lX2xlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVfbGVuOyBpKyspCisgICAgICAgIHMtPmxzcF9jb3NfdGFibGVbaV0gPSAyLjBmICogY29zKHdkZWwgKiBpKTsKKworICAgIC8qIHRhYmxlcyBmb3IgeF4tMC4yNSBjb21wdXRhdGlvbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBlICAgICAgICAgICAgICAgICAgICAgPSBpIC0gMTI2OworICAgICAgICBzLT5sc3BfcG93X2VfdGFibGVbaV0gPSBwb3coMi4wLCBlICogLTAuMjUpOworICAgIH0KKworICAgIC8qIE5PVEU6IHRoZXNlIHR3byB0YWJsZXMgYXJlIG5lZWRlZCB0byBhdm9pZCB0d28gb3BlcmF0aW9ucyBpbgorICAgICAqIHBvd19tMV80ICovCisgICAgYiA9IDEuMDsKKyAgICBmb3IgKGkgPSAoMSA8PCBMU1BfUE9XX0JJVFMpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgbSAgICAgICAgICAgICAgICAgICAgICA9ICgxIDw8IExTUF9QT1dfQklUUykgKyBpOworICAgICAgICBhICAgICAgICAgICAgICAgICAgICAgID0gKGZsb2F0KSBtICogKDAuNSAvICgxIDw8IExTUF9QT1dfQklUUykpOworICAgICAgICBhICAgICAgICAgICAgICAgICAgICAgID0gcG93KGEsIC0wLjI1KTsKKyAgICAgICAgcy0+bHNwX3Bvd19tX3RhYmxlMVtpXSA9IDIgKiBhIC0gYjsKKyAgICAgICAgcy0+bHNwX3Bvd19tX3RhYmxlMltpXSA9IGIgLSBhOworICAgICAgICBiICAgICAgICAgICAgICAgICAgICAgID0gYTsKKyAgICB9Cit9CisKKy8qKgorICogTk9URTogV2UgdXNlIHRoZSBzYW1lIGNvZGUgYXMgVm9yYmlzIGhlcmUKKyAqIEB0b2RvIG9wdGltaXplIGl0IGZ1cnRoZXIgd2l0aCBTU0UvM0Rub3cKKyAqLworc3RhdGljIHZvaWQgd21hX2xzcF90b19jdXJ2ZShXTUFDb2RlY0NvbnRleHQgKnMsIGZsb2F0ICpvdXQsIGZsb2F0ICp2YWxfbWF4X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGZsb2F0ICpsc3ApCit7CisgICAgaW50IGksIGo7CisgICAgZmxvYXQgcCwgcSwgdywgdiwgdmFsX21heDsKKworICAgIHZhbF9tYXggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgcCA9IDAuNWY7CisgICAgICAgIHEgPSAwLjVmOworICAgICAgICB3ID0gcy0+bHNwX2Nvc190YWJsZVtpXTsKKyAgICAgICAgZm9yIChqID0gMTsgaiA8IE5CX0xTUF9DT0VGUzsgaiArPSAyKSB7CisgICAgICAgICAgICBxICo9IHcgLSBsc3BbaiAtIDFdOworICAgICAgICAgICAgcCAqPSB3IC0gbHNwW2pdOworICAgICAgICB9CisgICAgICAgIHAgKj0gcCAqICgyLjBmIC0gdyk7CisgICAgICAgIHEgKj0gcSAqICgyLjBmICsgdyk7CisgICAgICAgIHYgID0gcCArIHE7CisgICAgICAgIHYgID0gcG93X20xXzQocywgdik7CisgICAgICAgIGlmICh2ID4gdmFsX21heCkKKyAgICAgICAgICAgIHZhbF9tYXggPSB2OworICAgICAgICBvdXRbaV0gPSB2OworICAgIH0KKyAgICAqdmFsX21heF9wdHIgPSB2YWxfbWF4OworfQorCisvKioKKyAqIGRlY29kZSBleHBvbmVudHMgY29kZWQgd2l0aCBMU1AgY29lZmZpY2llbnRzIChzYW1lIGlkZWEgYXMgVm9yYmlzKQorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfZXhwX2xzcChXTUFDb2RlY0NvbnRleHQgKnMsIGludCBjaCkKK3sKKyAgICBmbG9hdCBsc3BfY29lZnNbTkJfTFNQX0NPRUZTXTsKKyAgICBpbnQgdmFsLCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5CX0xTUF9DT0VGUzsgaSsrKSB7CisgICAgICAgIGlmIChpID09IDAgfHwgaSA+PSA4KQorICAgICAgICAgICAgdmFsID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsKKyAgICAgICAgbHNwX2NvZWZzW2ldID0gZmZfd21hX2xzcF9jb2RlYm9va1tpXVt2YWxdOworICAgIH0KKworICAgIHdtYV9sc3BfdG9fY3VydmUocywgcy0+ZXhwb25lbnRzW2NoXSwgJnMtPm1heF9leHBvbmVudFtjaF0sCisgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19sZW4sIGxzcF9jb2Vmcyk7Cit9CisKKy8qKiBwb3coMTAsIGkgLyAxNi4wKSBmb3IgaSBpbiAtNjAuLjk1ICovCitzdGF0aWMgY29uc3QgZmxvYXQgcG93X3RhYltdID0geworICAgIDEuNzc4Mjc5NDEwMDM4OWUtMDQsIDIuMDUzNTI1MDI2NDU3MWUtMDQsCisgICAgMi4zNzEzNzM3MDU2NjE3ZS0wNCwgMi43Mzg0MTk2MzQyNjQ0ZS0wNCwKKyAgICAzLjE2MjI3NzY2MDE2ODRlLTA0LCAzLjY1MTc0MTI3MjU0ODRlLTA0LAorICAgIDQuMjE2OTY1MDM0Mjg1OGUtMDQsIDQuODY5Njc1MjUxNjU4NmUtMDQsCisgICAgNS42MjM0MTMyNTE5MDM1ZS0wNCwgNi40OTM4MTYzMTU3NjIxZS0wNCwKKyAgICA3LjQ5ODk0MjA5MzMyNDZlLTA0LCA4LjY1OTY0MzIzMzYwMDZlLTA0LAorICAgIDEuMDAwMDAwMDAwMDAwMGUtMDMsIDEuMTU0NzgxOTg0Njg5NWUtMDMsCisgICAgMS4zMzM1MjE0MzIxNjMzZS0wMywgMS41Mzk5MjY1MjYwNTk1ZS0wMywKKyAgICAxLjc3ODI3OTQxMDAzODllLTAzLCAyLjA1MzUyNTAyNjQ1NzFlLTAzLAorICAgIDIuMzcxMzczNzA1NjYxN2UtMDMsIDIuNzM4NDE5NjM0MjY0NGUtMDMsCisgICAgMy4xNjIyNzc2NjAxNjg0ZS0wMywgMy42NTE3NDEyNzI1NDg0ZS0wMywKKyAgICA0LjIxNjk2NTAzNDI4NThlLTAzLCA0Ljg2OTY3NTI1MTY1ODZlLTAzLAorICAgIDUuNjIzNDEzMjUxOTAzNWUtMDMsIDYuNDkzODE2MzE1NzYyMWUtMDMsCisgICAgNy40OTg5NDIwOTMzMjQ2ZS0wMywgOC42NTk2NDMyMzM2MDA2ZS0wMywKKyAgICAxLjAwMDAwMDAwMDAwMDBlLTAyLCAxLjE1NDc4MTk4NDY4OTVlLTAyLAorICAgIDEuMzMzNTIxNDMyMTYzM2UtMDIsIDEuNTM5OTI2NTI2MDU5NWUtMDIsCisgICAgMS43NzgyNzk0MTAwMzg5ZS0wMiwgMi4wNTM1MjUwMjY0NTcxZS0wMiwKKyAgICAyLjM3MTM3MzcwNTY2MTdlLTAyLCAyLjczODQxOTYzNDI2NDRlLTAyLAorICAgIDMuMTYyMjc3NjYwMTY4NGUtMDIsIDMuNjUxNzQxMjcyNTQ4NGUtMDIsCisgICAgNC4yMTY5NjUwMzQyODU4ZS0wMiwgNC44Njk2NzUyNTE2NTg2ZS0wMiwKKyAgICA1LjYyMzQxMzI1MTkwMzVlLTAyLCA2LjQ5MzgxNjMxNTc2MjFlLTAyLAorICAgIDcuNDk4OTQyMDkzMzI0NmUtMDIsIDguNjU5NjQzMjMzNjAwN2UtMDIsCisgICAgMS4wMDAwMDAwMDAwMDAwZS0wMSwgMS4xNTQ3ODE5ODQ2ODk1ZS0wMSwKKyAgICAxLjMzMzUyMTQzMjE2MzNlLTAxLCAxLjUzOTkyNjUyNjA1OTVlLTAxLAorICAgIDEuNzc4Mjc5NDEwMDM4OWUtMDEsIDIuMDUzNTI1MDI2NDU3MWUtMDEsCisgICAgMi4zNzEzNzM3MDU2NjE3ZS0wMSwgMi43Mzg0MTk2MzQyNjQ0ZS0wMSwKKyAgICAzLjE2MjI3NzY2MDE2ODRlLTAxLCAzLjY1MTc0MTI3MjU0ODRlLTAxLAorICAgIDQuMjE2OTY1MDM0Mjg1OGUtMDEsIDQuODY5Njc1MjUxNjU4NmUtMDEsCisgICAgNS42MjM0MTMyNTE5MDM1ZS0wMSwgNi40OTM4MTYzMTU3NjIxZS0wMSwKKyAgICA3LjQ5ODk0MjA5MzMyNDZlLTAxLCA4LjY1OTY0MzIzMzYwMDdlLTAxLAorICAgIDEuMDAwMDAwMDAwMDAwMGUrMDAsIDEuMTU0NzgxOTg0Njg5NWUrMDAsCisgICAgMS4zMzM1MjE0MzIxNjMzZSswMCwgMS41Mzk5MjY1MjYwNTk1ZSswMCwKKyAgICAxLjc3ODI3OTQxMDAzODllKzAwLCAyLjA1MzUyNTAyNjQ1NzFlKzAwLAorICAgIDIuMzcxMzczNzA1NjYxN2UrMDAsIDIuNzM4NDE5NjM0MjY0NGUrMDAsCisgICAgMy4xNjIyNzc2NjAxNjg0ZSswMCwgMy42NTE3NDEyNzI1NDg0ZSswMCwKKyAgICA0LjIxNjk2NTAzNDI4NThlKzAwLCA0Ljg2OTY3NTI1MTY1ODZlKzAwLAorICAgIDUuNjIzNDEzMjUxOTAzNWUrMDAsIDYuNDkzODE2MzE1NzYyMWUrMDAsCisgICAgNy40OTg5NDIwOTMzMjQ2ZSswMCwgOC42NTk2NDMyMzM2MDA3ZSswMCwKKyAgICAxLjAwMDAwMDAwMDAwMDBlKzAxLCAxLjE1NDc4MTk4NDY4OTVlKzAxLAorICAgIDEuMzMzNTIxNDMyMTYzM2UrMDEsIDEuNTM5OTI2NTI2MDU5NWUrMDEsCisgICAgMS43NzgyNzk0MTAwMzg5ZSswMSwgMi4wNTM1MjUwMjY0NTcxZSswMSwKKyAgICAyLjM3MTM3MzcwNTY2MTdlKzAxLCAyLjczODQxOTYzNDI2NDRlKzAxLAorICAgIDMuMTYyMjc3NjYwMTY4NGUrMDEsIDMuNjUxNzQxMjcyNTQ4NGUrMDEsCisgICAgNC4yMTY5NjUwMzQyODU4ZSswMSwgNC44Njk2NzUyNTE2NTg2ZSswMSwKKyAgICA1LjYyMzQxMzI1MTkwMzVlKzAxLCA2LjQ5MzgxNjMxNTc2MjFlKzAxLAorICAgIDcuNDk4OTQyMDkzMzI0NmUrMDEsIDguNjU5NjQzMjMzNjAwN2UrMDEsCisgICAgMS4wMDAwMDAwMDAwMDAwZSswMiwgMS4xNTQ3ODE5ODQ2ODk1ZSswMiwKKyAgICAxLjMzMzUyMTQzMjE2MzNlKzAyLCAxLjUzOTkyNjUyNjA1OTVlKzAyLAorICAgIDEuNzc4Mjc5NDEwMDM4OWUrMDIsIDIuMDUzNTI1MDI2NDU3MWUrMDIsCisgICAgMi4zNzEzNzM3MDU2NjE3ZSswMiwgMi43Mzg0MTk2MzQyNjQ0ZSswMiwKKyAgICAzLjE2MjI3NzY2MDE2ODRlKzAyLCAzLjY1MTc0MTI3MjU0ODRlKzAyLAorICAgIDQuMjE2OTY1MDM0Mjg1OGUrMDIsIDQuODY5Njc1MjUxNjU4NmUrMDIsCisgICAgNS42MjM0MTMyNTE5MDM1ZSswMiwgNi40OTM4MTYzMTU3NjIxZSswMiwKKyAgICA3LjQ5ODk0MjA5MzMyNDZlKzAyLCA4LjY1OTY0MzIzMzYwMDdlKzAyLAorICAgIDEuMDAwMDAwMDAwMDAwMGUrMDMsIDEuMTU0NzgxOTg0Njg5NWUrMDMsCisgICAgMS4zMzM1MjE0MzIxNjMzZSswMywgMS41Mzk5MjY1MjYwNTk1ZSswMywKKyAgICAxLjc3ODI3OTQxMDAzODllKzAzLCAyLjA1MzUyNTAyNjQ1NzFlKzAzLAorICAgIDIuMzcxMzczNzA1NjYxN2UrMDMsIDIuNzM4NDE5NjM0MjY0NGUrMDMsCisgICAgMy4xNjIyNzc2NjAxNjg0ZSswMywgMy42NTE3NDEyNzI1NDg0ZSswMywKKyAgICA0LjIxNjk2NTAzNDI4NThlKzAzLCA0Ljg2OTY3NTI1MTY1ODZlKzAzLAorICAgIDUuNjIzNDEzMjUxOTAzNWUrMDMsIDYuNDkzODE2MzE1NzYyMWUrMDMsCisgICAgNy40OTg5NDIwOTMzMjQ2ZSswMywgOC42NTk2NDMyMzM2MDA3ZSswMywKKyAgICAxLjAwMDAwMDAwMDAwMDBlKzA0LCAxLjE1NDc4MTk4NDY4OTVlKzA0LAorICAgIDEuMzMzNTIxNDMyMTYzM2UrMDQsIDEuNTM5OTI2NTI2MDU5NWUrMDQsCisgICAgMS43NzgyNzk0MTAwMzg5ZSswNCwgMi4wNTM1MjUwMjY0NTcxZSswNCwKKyAgICAyLjM3MTM3MzcwNTY2MTdlKzA0LCAyLjczODQxOTYzNDI2NDRlKzA0LAorICAgIDMuMTYyMjc3NjYwMTY4NGUrMDQsIDMuNjUxNzQxMjcyNTQ4NGUrMDQsCisgICAgNC4yMTY5NjUwMzQyODU4ZSswNCwgNC44Njk2NzUyNTE2NTg2ZSswNCwKKyAgICA1LjYyMzQxMzI1MTkwMzVlKzA0LCA2LjQ5MzgxNjMxNTc2MjFlKzA0LAorICAgIDcuNDk4OTQyMDkzMzI0NmUrMDQsIDguNjU5NjQzMjMzNjAwN2UrMDQsCisgICAgMS4wMDAwMDAwMDAwMDAwZSswNSwgMS4xNTQ3ODE5ODQ2ODk1ZSswNSwKKyAgICAxLjMzMzUyMTQzMjE2MzNlKzA1LCAxLjUzOTkyNjUyNjA1OTVlKzA1LAorICAgIDEuNzc4Mjc5NDEwMDM4OWUrMDUsIDIuMDUzNTI1MDI2NDU3MWUrMDUsCisgICAgMi4zNzEzNzM3MDU2NjE3ZSswNSwgMi43Mzg0MTk2MzQyNjQ0ZSswNSwKKyAgICAzLjE2MjI3NzY2MDE2ODRlKzA1LCAzLjY1MTc0MTI3MjU0ODRlKzA1LAorICAgIDQuMjE2OTY1MDM0Mjg1OGUrMDUsIDQuODY5Njc1MjUxNjU4NmUrMDUsCisgICAgNS42MjM0MTMyNTE5MDM1ZSswNSwgNi40OTM4MTYzMTU3NjIxZSswNSwKKyAgICA3LjQ5ODk0MjA5MzMyNDZlKzA1LCA4LjY1OTY0MzIzMzYwMDdlKzA1LAorfTsKKworLyoqCisgKiBkZWNvZGUgZXhwb25lbnRzIGNvZGVkIHdpdGggVkxDIGNvZGVzCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2V4cF92bGMoV01BQ29kZWNDb250ZXh0ICpzLCBpbnQgY2gpCit7CisgICAgaW50IGxhc3RfZXhwLCBuLCBjb2RlOworICAgIGNvbnN0IHVpbnQxNl90ICpwdHI7CisgICAgZmxvYXQgdiwgbWF4X3NjYWxlOworICAgIHVpbnQzMl90ICpxLCAqcV9lbmQsIGl2OworICAgIGNvbnN0IGZsb2F0ICpwdGFiID0gcG93X3RhYiArIDYwOworICAgIGNvbnN0IHVpbnQzMl90ICppcHRhYiA9IChjb25zdCB1aW50MzJfdCAqKSBwdGFiOworCisgICAgcHRyICAgICAgID0gcy0+ZXhwb25lbnRfYmFuZHNbcy0+ZnJhbWVfbGVuX2JpdHMgLSBzLT5ibG9ja19sZW5fYml0c107CisgICAgcSAgICAgICAgID0gKHVpbnQzMl90ICopIHMtPmV4cG9uZW50c1tjaF07CisgICAgcV9lbmQgICAgID0gcSArIHMtPmJsb2NrX2xlbjsKKyAgICBtYXhfc2NhbGUgPSAwOworICAgIGlmIChzLT52ZXJzaW9uID09IDEpIHsKKyAgICAgICAgbGFzdF9leHAgID0gZ2V0X2JpdHMoJnMtPmdiLCA1KSArIDEwOworICAgICAgICB2ICAgICAgICAgPSBwdGFiW2xhc3RfZXhwXTsKKyAgICAgICAgaXYgICAgICAgID0gaXB0YWJbbGFzdF9leHBdOworICAgICAgICBtYXhfc2NhbGUgPSB2OworICAgICAgICBuICAgICAgICAgPSAqcHRyKys7CisgICAgICAgIHN3aXRjaCAobiAmIDMpIGRvIHsKKyAgICAgICAgY2FzZSAwOiAqcSsrID0gaXY7CisgICAgICAgIGNhc2UgMzogKnErKyA9IGl2OworICAgICAgICBjYXNlIDI6ICpxKysgPSBpdjsKKyAgICAgICAgY2FzZSAxOiAqcSsrID0gaXY7CisgICAgICAgIH0gd2hpbGUgKChuIC09IDQpID4gMCk7CisgICAgfSBlbHNlCisgICAgICAgIGxhc3RfZXhwID0gMzY7CisKKyAgICB3aGlsZSAocSA8IHFfZW5kKSB7CisgICAgICAgIGNvZGUgPSBnZXRfdmxjMigmcy0+Z2IsIHMtPmV4cF92bGMudGFibGUsIEVYUFZMQ0JJVFMsIEVYUE1BWCk7CisgICAgICAgIGlmIChjb2RlIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFeHBvbmVudCB2bGMgaW52YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgLyogTk9URTogdGhpcyBvZmZzZXQgaXMgdGhlIHNhbWUgYXMgTVBFRzQgQUFDICEgKi8KKyAgICAgICAgbGFzdF9leHAgKz0gY29kZSAtIDYwOworICAgICAgICBpZiAoKHVuc2lnbmVkKSBsYXN0X2V4cCArIDYwID49IEZGX0FSUkFZX0VMRU1TKHBvd190YWIpKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkV4cG9uZW50IG91dCBvZiByYW5nZTogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgbGFzdF9leHApOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHYgID0gcHRhYltsYXN0X2V4cF07CisgICAgICAgIGl2ID0gaXB0YWJbbGFzdF9leHBdOworICAgICAgICBpZiAodiA+IG1heF9zY2FsZSkKKyAgICAgICAgICAgIG1heF9zY2FsZSA9IHY7CisgICAgICAgIG4gPSAqcHRyKys7CisgICAgICAgIHN3aXRjaCAobiAmIDMpIGRvIHsKKyAgICAgICAgY2FzZSAwOiAqcSsrID0gaXY7CisgICAgICAgIGNhc2UgMzogKnErKyA9IGl2OworICAgICAgICBjYXNlIDI6ICpxKysgPSBpdjsKKyAgICAgICAgY2FzZSAxOiAqcSsrID0gaXY7CisgICAgICAgIH0gd2hpbGUgKChuIC09IDQpID4gMCk7CisgICAgfQorICAgIHMtPm1heF9leHBvbmVudFtjaF0gPSBtYXhfc2NhbGU7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQXBwbHkgTURDVCB3aW5kb3cgYW5kIGFkZCBpbnRvIG91dHB1dC4KKyAqCisgKiBXZSBlbnN1cmUgdGhhdCB3aGVuIHRoZSB3aW5kb3dzIG92ZXJsYXAgdGhlaXIgc3F1YXJlZCBzdW0KKyAqIGlzIGFsd2F5cyAxIChNRENUIHJlY29uc3RydWN0aW9uIHJ1bGUpLgorICovCitzdGF0aWMgdm9pZCB3bWFfd2luZG93KFdNQUNvZGVjQ29udGV4dCAqcywgZmxvYXQgKm91dCkKK3sKKyAgICBmbG9hdCAqaW4gPSBzLT5vdXRwdXQ7CisgICAgaW50IGJsb2NrX2xlbiwgYnNpemUsIG47CisKKyAgICAvKiBsZWZ0IHBhcnQgKi8KKyAgICBpZiAocy0+YmxvY2tfbGVuX2JpdHMgPD0gcy0+cHJldl9ibG9ja19sZW5fYml0cykgeworICAgICAgICBibG9ja19sZW4gPSBzLT5ibG9ja19sZW47CisgICAgICAgIGJzaXplICAgICA9IHMtPmZyYW1lX2xlbl9iaXRzIC0gcy0+YmxvY2tfbGVuX2JpdHM7CisKKyAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfYWRkKG91dCwgaW4sIHMtPndpbmRvd3NbYnNpemVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQsIGJsb2NrX2xlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmxvY2tfbGVuID0gMSA8PCBzLT5wcmV2X2Jsb2NrX2xlbl9iaXRzOworICAgICAgICBuICAgICAgICAgPSAocy0+YmxvY2tfbGVuIC0gYmxvY2tfbGVuKSAvIDI7CisgICAgICAgIGJzaXplICAgICA9IHMtPmZyYW1lX2xlbl9iaXRzIC0gcy0+cHJldl9ibG9ja19sZW5fYml0czsKKworICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF9hZGQob3V0ICsgbiwgaW4gKyBuLCBzLT53aW5kb3dzW2JzaXplXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICsgbiwgYmxvY2tfbGVuKTsKKworICAgICAgICBtZW1jcHkob3V0ICsgbiArIGJsb2NrX2xlbiwgaW4gKyBuICsgYmxvY2tfbGVuLCBuICogc2l6ZW9mKGZsb2F0KSk7CisgICAgfQorCisgICAgb3V0ICs9IHMtPmJsb2NrX2xlbjsKKyAgICBpbiAgKz0gcy0+YmxvY2tfbGVuOworCisgICAgLyogcmlnaHQgcGFydCAqLworICAgIGlmIChzLT5ibG9ja19sZW5fYml0cyA8PSBzLT5uZXh0X2Jsb2NrX2xlbl9iaXRzKSB7CisgICAgICAgIGJsb2NrX2xlbiA9IHMtPmJsb2NrX2xlbjsKKyAgICAgICAgYnNpemUgICAgID0gcy0+ZnJhbWVfbGVuX2JpdHMgLSBzLT5ibG9ja19sZW5fYml0czsKKworICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKG91dCwgaW4sIHMtPndpbmRvd3NbYnNpemVdLCBibG9ja19sZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGJsb2NrX2xlbiA9IDEgPDwgcy0+bmV4dF9ibG9ja19sZW5fYml0czsKKyAgICAgICAgbiAgICAgICAgID0gKHMtPmJsb2NrX2xlbiAtIGJsb2NrX2xlbikgLyAyOworICAgICAgICBic2l6ZSAgICAgPSBzLT5mcmFtZV9sZW5fYml0cyAtIHMtPm5leHRfYmxvY2tfbGVuX2JpdHM7CisKKyAgICAgICAgbWVtY3B5KG91dCwgaW4sIG4gKiBzaXplb2YoZmxvYXQpKTsKKworICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKG91dCArIG4sIGluICsgbiwgcy0+d2luZG93c1tic2l6ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19sZW4pOworCisgICAgICAgIG1lbXNldChvdXQgKyBuICsgYmxvY2tfbGVuLCAwLCBuICogc2l6ZW9mKGZsb2F0KSk7CisgICAgfQorfQorCisvKioKKyAqIEByZXR1cm4gMCBpZiBPSy4gMSBpZiBsYXN0IGJsb2NrIG9mIGZyYW1lLiByZXR1cm4gLTEgaWYKKyAqIHVucmVjb3JyYWJsZSBlcnJvci4KKyAqLworc3RhdGljIGludCB3bWFfZGVjb2RlX2Jsb2NrKFdNQUNvZGVjQ29udGV4dCAqcykKK3sKKyAgICBpbnQgbiwgdiwgYSwgY2gsIGJzaXplOworICAgIGludCBjb2VmX25iX2JpdHMsIHRvdGFsX2dhaW47CisgICAgaW50IG5iX2NvZWZzW01BWF9DSEFOTkVMU107CisgICAgZmxvYXQgbWRjdF9ub3JtOworICAgIEZGVENvbnRleHQgKm1kY3Q7CisKKyNpZmRlZiBUUkFDRQorICAgIHRwcmludGYocy0+YXZjdHgsICIqKipkZWNvZGVfYmxvY2s6ICVkOiVkXG4iLAorICAgICAgICAgICAgcy0+ZnJhbWVfY291bnQgLSAxLCBzLT5ibG9ja19udW0pOworI2VuZGlmIC8qIFRSQUNFICovCisKKyAgICAvKiBjb21wdXRlIGN1cnJlbnQgYmxvY2sgbGVuZ3RoICovCisgICAgaWYgKHMtPnVzZV92YXJpYWJsZV9ibG9ja19sZW4pIHsKKyAgICAgICAgbiA9IGF2X2xvZzIocy0+bmJfYmxvY2tfc2l6ZXMgLSAxKSArIDE7CisKKyAgICAgICAgaWYgKHMtPnJlc2V0X2Jsb2NrX2xlbmd0aHMpIHsKKyAgICAgICAgICAgIHMtPnJlc2V0X2Jsb2NrX2xlbmd0aHMgPSAwOworICAgICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzKCZzLT5nYiwgbik7CisgICAgICAgICAgICBpZiAodiA+PSBzLT5uYl9ibG9ja19zaXplcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAicHJldl9ibG9ja19sZW5fYml0cyAlZCBvdXQgb2YgcmFuZ2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lX2xlbl9iaXRzIC0gdik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+cHJldl9ibG9ja19sZW5fYml0cyA9IHMtPmZyYW1lX2xlbl9iaXRzIC0gdjsKKyAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIG4pOworICAgICAgICAgICAgaWYgKHYgPj0gcy0+bmJfYmxvY2tfc2l6ZXMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImJsb2NrX2xlbl9iaXRzICVkIG91dCBvZiByYW5nZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWVfbGVuX2JpdHMgLSB2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5ibG9ja19sZW5fYml0cyA9IHMtPmZyYW1lX2xlbl9iaXRzIC0gdjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHVwZGF0ZSBibG9jayBsZW5ndGhzICovCisgICAgICAgICAgICBzLT5wcmV2X2Jsb2NrX2xlbl9iaXRzID0gcy0+YmxvY2tfbGVuX2JpdHM7CisgICAgICAgICAgICBzLT5ibG9ja19sZW5fYml0cyAgICAgID0gcy0+bmV4dF9ibG9ja19sZW5fYml0czsKKyAgICAgICAgfQorICAgICAgICB2ID0gZ2V0X2JpdHMoJnMtPmdiLCBuKTsKKyAgICAgICAgaWYgKHYgPj0gcy0+bmJfYmxvY2tfc2l6ZXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJuZXh0X2Jsb2NrX2xlbl9iaXRzICVkIG91dCBvZiByYW5nZVxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5mcmFtZV9sZW5fYml0cyAtIHYpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHMtPm5leHRfYmxvY2tfbGVuX2JpdHMgPSBzLT5mcmFtZV9sZW5fYml0cyAtIHY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZml4ZWQgYmxvY2sgbGVuICovCisgICAgICAgIHMtPm5leHRfYmxvY2tfbGVuX2JpdHMgPSBzLT5mcmFtZV9sZW5fYml0czsKKyAgICAgICAgcy0+cHJldl9ibG9ja19sZW5fYml0cyA9IHMtPmZyYW1lX2xlbl9iaXRzOworICAgICAgICBzLT5ibG9ja19sZW5fYml0cyAgICAgID0gcy0+ZnJhbWVfbGVuX2JpdHM7CisgICAgfQorCisgICAgaWYgKHMtPmZyYW1lX2xlbl9iaXRzIC0gcy0+YmxvY2tfbGVuX2JpdHMgPj0gcy0+bmJfYmxvY2tfc2l6ZXMpeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImJsb2NrX2xlbl9iaXRzIG5vdCBpbml0aWFsaXplZCB0byBhIHZhbGlkIHZhbHVlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIG5vdyBjaGVjayBpZiB0aGUgYmxvY2sgbGVuZ3RoIGlzIGNvaGVyZW50IHdpdGggdGhlIGZyYW1lIGxlbmd0aCAqLworICAgIHMtPmJsb2NrX2xlbiA9IDEgPDwgcy0+YmxvY2tfbGVuX2JpdHM7CisgICAgaWYgKChzLT5ibG9ja19wb3MgKyBzLT5ibG9ja19sZW4pID4gcy0+ZnJhbWVfbGVuKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZnJhbWVfbGVuIG92ZXJmbG93XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzLT5hdmN0eC0+Y2hhbm5lbHMgPT0gMikKKyAgICAgICAgcy0+bXNfc3RlcmVvID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgdiA9IDA7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+YXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGEgICAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgIHMtPmNoYW5uZWxfY29kZWRbY2hdID0gYTsKKyAgICAgICAgdiAgICAgICAgICAgICAgICAgICB8PSBhOworICAgIH0KKworICAgIGJzaXplID0gcy0+ZnJhbWVfbGVuX2JpdHMgLSBzLT5ibG9ja19sZW5fYml0czsKKworICAgIC8qIGlmIG5vIGNoYW5uZWwgY29kZWQsIG5vIG5lZWQgdG8gZ28gZnVydGhlciAqLworICAgIC8qIFhYWDogZml4IHBvdGVudGlhbCBmcmFtaW5nIHByb2JsZW1zICovCisgICAgaWYgKCF2KQorICAgICAgICBnb3RvIG5leHQ7CisKKyAgICAvKiByZWFkIHRvdGFsIGdhaW4gYW5kIGV4dHJhY3QgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgYml0cyBmb3IKKyAgICAgKiBjb2VmIGVzY2FwZSBjb2RpbmcgKi8KKyAgICB0b3RhbF9nYWluID0gMTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCA3KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInRvdGFsX2dhaW4gb3ZlcnJlYWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYSAgICAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDcpOworICAgICAgICB0b3RhbF9nYWluICs9IGE7CisgICAgICAgIGlmIChhICE9IDEyNykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNvZWZfbmJfYml0cyA9IGZmX3dtYV90b3RhbF9nYWluX3RvX2JpdHModG90YWxfZ2Fpbik7CisKKyAgICAvKiBjb21wdXRlIG51bWJlciBvZiBjb2VmZmljaWVudHMgKi8KKyAgICBuID0gcy0+Y29lZnNfZW5kW2JzaXplXSAtIHMtPmNvZWZzX3N0YXJ0OworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmF2Y3R4LT5jaGFubmVsczsgY2grKykKKyAgICAgICAgbmJfY29lZnNbY2hdID0gbjsKKworICAgIC8qIGNvbXBsZXggY29kaW5nICovCisgICAgaWYgKHMtPnVzZV9ub2lzZV9jb2RpbmcpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+YXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9jb2RlZFtjaF0pIHsKKyAgICAgICAgICAgICAgICBpbnQgaSwgbiwgYTsKKyAgICAgICAgICAgICAgICBuID0gcy0+ZXhwb25lbnRfaGlnaF9zaXplc1tic2l6ZV07CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhICAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgIHMtPmhpZ2hfYmFuZF9jb2RlZFtjaF1baV0gPSBhOworICAgICAgICAgICAgICAgICAgICAvKiBpZiBub2lzZSBjb2RpbmcsIHRoZSBjb2VmZmljaWVudHMgYXJlIG5vdCB0cmFuc21pdHRlZCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoYSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5iX2NvZWZzW2NoXSAtPSBzLT5leHBvbmVudF9oaWdoX2JhbmRzW2JzaXplXVtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+YXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9jb2RlZFtjaF0pIHsKKyAgICAgICAgICAgICAgICBpbnQgaSwgbiwgdmFsLCBjb2RlOworCisgICAgICAgICAgICAgICAgbiAgID0gcy0+ZXhwb25lbnRfaGlnaF9zaXplc1tic2l6ZV07CisgICAgICAgICAgICAgICAgdmFsID0gKGludCkgMHg4MDAwMDAwMDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5oaWdoX2JhbmRfY29kZWRbY2hdW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IChpbnQpIDB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBnZXRfYml0cygmcy0+Z2IsIDcpIC0gMTk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBnZXRfdmxjMigmcy0+Z2IsIHMtPmhnYWluX3ZsYy50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEdBSU5WTENCSVRTLCBIR0FJTk1BWCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhnYWluIHZsYyBpbnZhbGlkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgKz0gY29kZSAtIDE4OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGlnaF9iYW5kX3ZhbHVlc1tjaF1baV0gPSB2YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBleHBvbmVudHMgY2FuIGJlIHJldXNlZCBpbiBzaG9ydCBibG9ja3MuICovCisgICAgaWYgKChzLT5ibG9ja19sZW5fYml0cyA9PSBzLT5mcmFtZV9sZW5fYml0cykgfHwgZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+YXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9jb2RlZFtjaF0pIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+dXNlX2V4cF92bGMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZV9leHBfdmxjKHMsIGNoKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2V4cF9sc3AocywgY2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT5leHBvbmVudHNfYnNpemVbY2hdID0gYnNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYXJzZSBzcGVjdHJhbCBjb2VmZmljaWVudHMgOiBqdXN0IFJMRSBlbmNvZGluZyAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAocy0+Y2hhbm5lbF9jb2RlZFtjaF0pIHsKKyAgICAgICAgICAgIGludCB0aW5kZXg7CisgICAgICAgICAgICBXTUFDb2VmICpwdHIgPSAmcy0+Y29lZnMxW2NoXVswXTsKKworICAgICAgICAgICAgLyogc3BlY2lhbCBWTEMgdGFibGVzIGFyZSB1c2VkIGZvciBtcyBzdGVyZW8gYmVjYXVzZQorICAgICAgICAgICAgICogdGhlcmUgaXMgcG90ZW50aWFsbHkgbGVzcyBlbmVyZ3kgdGhlcmUgKi8KKyAgICAgICAgICAgIHRpbmRleCA9IChjaCA9PSAxICYmIHMtPm1zX3N0ZXJlbyk7CisgICAgICAgICAgICBtZW1zZXQocHRyLCAwLCBzLT5ibG9ja19sZW4gKiBzaXplb2YoV01BQ29lZikpOworICAgICAgICAgICAgZmZfd21hX3J1bl9sZXZlbF9kZWNvZGUocy0+YXZjdHgsICZzLT5nYiwgJnMtPmNvZWZfdmxjW3RpbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sZXZlbF90YWJsZVt0aW5kZXhdLCBzLT5ydW5fdGFibGVbdGluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHB0ciwgMCwgbmJfY29lZnNbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfbGVuLCBzLT5mcmFtZV9sZW5fYml0cywgY29lZl9uYl9iaXRzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+dmVyc2lvbiA9PSAxICYmIHMtPmF2Y3R4LT5jaGFubmVscyA+PSAyKQorICAgICAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJnMtPmdiKTsKKyAgICB9CisKKyAgICAvKiBub3JtYWxpemUgKi8KKyAgICB7CisgICAgICAgIGludCBuNCA9IHMtPmJsb2NrX2xlbiAvIDI7CisgICAgICAgIG1kY3Rfbm9ybSA9IDEuMCAvIChmbG9hdCkgbjQ7CisgICAgICAgIGlmIChzLT52ZXJzaW9uID09IDEpCisgICAgICAgICAgICBtZGN0X25vcm0gKj0gc3FydChuNCk7CisgICAgfQorCisgICAgLyogZmluYWxseSBjb21wdXRlIHRoZSBNRENUIGNvZWZmaWNpZW50cyAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAocy0+Y2hhbm5lbF9jb2RlZFtjaF0pIHsKKyAgICAgICAgICAgIFdNQUNvZWYgKmNvZWZzMTsKKyAgICAgICAgICAgIGZsb2F0ICpjb2VmcywgKmV4cG9uZW50cywgbXVsdCwgbXVsdDEsIG5vaXNlOworICAgICAgICAgICAgaW50IGksIGosIG4sIG4xLCBsYXN0X2hpZ2hfYmFuZCwgZXNpemU7CisgICAgICAgICAgICBmbG9hdCBleHBfcG93ZXJbSElHSF9CQU5EX01BWF9TSVpFXTsKKworICAgICAgICAgICAgY29lZnMxICAgID0gcy0+Y29lZnMxW2NoXTsKKyAgICAgICAgICAgIGV4cG9uZW50cyA9IHMtPmV4cG9uZW50c1tjaF07CisgICAgICAgICAgICBlc2l6ZSAgICAgPSBzLT5leHBvbmVudHNfYnNpemVbY2hdOworICAgICAgICAgICAgbXVsdCAgICAgID0gcG93KDEwLCB0b3RhbF9nYWluICogMC4wNSkgLyBzLT5tYXhfZXhwb25lbnRbY2hdOworICAgICAgICAgICAgbXVsdCAgICAgKj0gbWRjdF9ub3JtOworICAgICAgICAgICAgY29lZnMgICAgID0gcy0+Y29lZnNbY2hdOworICAgICAgICAgICAgaWYgKHMtPnVzZV9ub2lzZV9jb2RpbmcpIHsKKyAgICAgICAgICAgICAgICBtdWx0MSA9IG11bHQ7CisgICAgICAgICAgICAgICAgLyogdmVyeSBsb3cgZnJlcXMgOiBub2lzZSAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jb2Vmc19zdGFydDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICpjb2VmcysrID0gcy0+bm9pc2VfdGFibGVbcy0+bm9pc2VfaW5kZXhdICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvbmVudHNbaSA8PCBic2l6ZSA+PiBlc2l6ZV0gKiBtdWx0MTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bm9pc2VfaW5kZXggPSAocy0+bm9pc2VfaW5kZXggKyAxKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5PSVNFX1RBQl9TSVpFIC0gMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbjEgPSBzLT5leHBvbmVudF9oaWdoX3NpemVzW2JzaXplXTsKKworICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgcG93ZXIgb2YgaGlnaCBiYW5kcyAqLworICAgICAgICAgICAgICAgIGV4cG9uZW50cyA9IHMtPmV4cG9uZW50c1tjaF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5oaWdoX2JhbmRfc3RhcnRbYnNpemVdIDw8IGJzaXplID4+IGVzaXplKTsKKyAgICAgICAgICAgICAgICBsYXN0X2hpZ2hfYmFuZCA9IDA7IC8qIGF2b2lkIHdhcm5pbmcgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjE7IGorKykgeworICAgICAgICAgICAgICAgICAgICBuID0gcy0+ZXhwb25lbnRfaGlnaF9iYW5kc1tzLT5mcmFtZV9sZW5fYml0cyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX2xlbl9iaXRzXVtqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmhpZ2hfYmFuZF9jb2RlZFtjaF1bal0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGUyLCB2OworICAgICAgICAgICAgICAgICAgICAgICAgZTIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgICA9IGV4cG9uZW50c1tpIDw8IGJzaXplID4+IGVzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMiArPSB2ICogdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cF9wb3dlcltqXSAgID0gZTIgLyBuOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9oaWdoX2JhbmQgPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgdHByaW50ZihzLT5hdmN0eCwgIiVkOiBwb3dlcj0lZiAoJWQpXG4iLCBqLCBleHBfcG93ZXJbal0sIG4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50cyArPSBuIDw8IGJzaXplID4+IGVzaXplOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIG1haW4gZnJlcXMgYW5kIGhpZ2ggZnJlcXMgKi8KKyAgICAgICAgICAgICAgICBleHBvbmVudHMgPSBzLT5leHBvbmVudHNbY2hdICsgKHMtPmNvZWZzX3N0YXJ0IDw8IGJzaXplID4+IGVzaXplKTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAtMTsgaiA8IG4xOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHMtPmhpZ2hfYmFuZF9zdGFydFtic2l6ZV0gLSBzLT5jb2Vmc19zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHMtPmV4cG9uZW50X2hpZ2hfYmFuZHNbcy0+ZnJhbWVfbGVuX2JpdHMgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfbGVuX2JpdHNdW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoaiA+PSAwICYmIHMtPmhpZ2hfYmFuZF9jb2RlZFtjaF1bal0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBub2lzZSB3aXRoIHNwZWNpZmllZCBwb3dlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgbXVsdDEgPSBzcXJ0KGV4cF9wb3dlcltqXSAvIGV4cF9wb3dlcltsYXN0X2hpZ2hfYmFuZF0pOworICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYOiB1c2UgYSB0YWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgbXVsdDEgID0gbXVsdDEgKiBwb3coMTAsIHMtPmhpZ2hfYmFuZF92YWx1ZXNbY2hdW2pdICogMC4wNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtdWx0MSAgPSBtdWx0MSAvIChzLT5tYXhfZXhwb25lbnRbY2hdICogcy0+bm9pc2VfbXVsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtdWx0MSAqPSBtZGN0X25vcm07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9pc2UgICAgICAgICAgPSBzLT5ub2lzZV90YWJsZVtzLT5ub2lzZV9pbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bm9pc2VfaW5kZXggPSAocy0+bm9pc2VfaW5kZXggKyAxKSAmIChOT0lTRV9UQUJfU0laRSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb2VmcysrICAgICAgID0gbm9pc2UgKiBleHBvbmVudHNbaSA8PCBic2l6ZSA+PiBlc2l6ZV0gKiBtdWx0MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50cyArPSBuIDw8IGJzaXplID4+IGVzaXplOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogY29kZWQgdmFsdWVzICsgc21hbGwgbm9pc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZSAgICAgICAgICA9IHMtPm5vaXNlX3RhYmxlW3MtPm5vaXNlX2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ub2lzZV9pbmRleCA9IChzLT5ub2lzZV9pbmRleCArIDEpICYgKE5PSVNFX1RBQl9TSVpFIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvZWZzKysgICAgICAgPSAoKCpjb2VmczErKykgKyBub2lzZSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb25lbnRzW2kgPDwgYnNpemUgPj4gZXNpemVdICogbXVsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50cyArPSBuIDw8IGJzaXplID4+IGVzaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogdmVyeSBoaWdoIGZyZXFzIDogbm9pc2UgKi8KKyAgICAgICAgICAgICAgICBuICAgICA9IHMtPmJsb2NrX2xlbiAtIHMtPmNvZWZzX2VuZFtic2l6ZV07CisgICAgICAgICAgICAgICAgbXVsdDEgPSBtdWx0ICogZXhwb25lbnRzWygoLTEgPDwgYnNpemUpKSA+PiBlc2l6ZV07CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAqY29lZnMrKyAgICAgICA9IHMtPm5vaXNlX3RhYmxlW3MtPm5vaXNlX2luZGV4XSAqIG11bHQxOworICAgICAgICAgICAgICAgICAgICBzLT5ub2lzZV9pbmRleCA9IChzLT5ub2lzZV9pbmRleCArIDEpICYgKE5PSVNFX1RBQl9TSVpFIC0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBYWFg6IG9wdGltaXplIG1vcmUgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y29lZnNfc3RhcnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgKmNvZWZzKysgPSAwLjA7CisgICAgICAgICAgICAgICAgbiA9IG5iX2NvZWZzW2NoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAqY29lZnMrKyA9IGNvZWZzMVtpXSAqIGV4cG9uZW50c1tpIDw8IGJzaXplID4+IGVzaXplXSAqIG11bHQ7CisgICAgICAgICAgICAgICAgbiA9IHMtPmJsb2NrX2xlbiAtIHMtPmNvZWZzX2VuZFtic2l6ZV07CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgKmNvZWZzKysgPSAwLjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBUUkFDRQorICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAocy0+Y2hhbm5lbF9jb2RlZFtjaF0pIHsKKyAgICAgICAgICAgIGR1bXBfZmxvYXRzKHMsICJleHBvbmVudHMiLCAzLCBzLT5leHBvbmVudHNbY2hdLCBzLT5ibG9ja19sZW4pOworICAgICAgICAgICAgZHVtcF9mbG9hdHMocywgImNvZWZzIiwgMSwgcy0+Y29lZnNbY2hdLCBzLT5ibG9ja19sZW4pOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFRSQUNFICovCisKKyAgICBpZiAocy0+bXNfc3RlcmVvICYmIHMtPmNoYW5uZWxfY29kZWRbMV0pIHsKKyAgICAgICAgLyogbm9taW5hbCBjYXNlIGZvciBtcyBzdGVyZW86IHdlIGRvIGl0IGJlZm9yZSBtZGN0ICovCisgICAgICAgIC8qIG5vIG5lZWQgdG8gb3B0aW1pemUgdGhpcyBjYXNlIGJlY2F1c2UgaXQgc2hvdWxkIGFsbW9zdAorICAgICAgICAgKiBuZXZlciBoYXBwZW4gKi8KKyAgICAgICAgaWYgKCFzLT5jaGFubmVsX2NvZGVkWzBdKSB7CisgICAgICAgICAgICB0cHJpbnRmKHMtPmF2Y3R4LCAicmFyZSBtcy1zdGVyZW8gY2FzZSBoYXBwZW5lZFxuIik7CisgICAgICAgICAgICBtZW1zZXQocy0+Y29lZnNbMF0sIDAsIHNpemVvZihmbG9hdCkgKiBzLT5ibG9ja19sZW4pOworICAgICAgICAgICAgcy0+Y2hhbm5lbF9jb2RlZFswXSA9IDE7CisgICAgICAgIH0KKworICAgICAgICBzLT5mZHNwLT5idXR0ZXJmbGllc19mbG9hdChzLT5jb2Vmc1swXSwgcy0+Y29lZnNbMV0sIHMtPmJsb2NrX2xlbik7CisgICAgfQorCituZXh0OgorICAgIG1kY3QgPSAmcy0+bWRjdF9jdHhbYnNpemVdOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+YXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGludCBuNCwgaW5kZXg7CisKKyAgICAgICAgbjQgPSBzLT5ibG9ja19sZW4gLyAyOworICAgICAgICBpZiAocy0+Y2hhbm5lbF9jb2RlZFtjaF0pCisgICAgICAgICAgICBtZGN0LT5pbWRjdF9jYWxjKG1kY3QsIHMtPm91dHB1dCwgcy0+Y29lZnNbY2hdKTsKKyAgICAgICAgZWxzZSBpZiAoIShzLT5tc19zdGVyZW8gJiYgY2ggPT0gMSkpCisgICAgICAgICAgICBtZW1zZXQocy0+b3V0cHV0LCAwLCBzaXplb2Yocy0+b3V0cHV0KSk7CisKKyAgICAgICAgLyogbXVsdGlwbHkgYnkgdGhlIHdpbmRvdyBhbmQgYWRkIGluIHRoZSBmcmFtZSAqLworICAgICAgICBpbmRleCA9IChzLT5mcmFtZV9sZW4gLyAyKSArIHMtPmJsb2NrX3BvcyAtIG40OworICAgICAgICB3bWFfd2luZG93KHMsICZzLT5mcmFtZV9vdXRbY2hdW2luZGV4XSk7CisgICAgfQorCisgICAgLyogdXBkYXRlIGJsb2NrIG51bWJlciAqLworICAgIHMtPmJsb2NrX251bSsrOworICAgIHMtPmJsb2NrX3BvcyArPSBzLT5ibG9ja19sZW47CisgICAgaWYgKHMtPmJsb2NrX3BvcyA+PSBzLT5mcmFtZV9sZW4pCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSBhIGZyYW1lIG9mIGZyYW1lX2xlbiBzYW1wbGVzICovCitzdGF0aWMgaW50IHdtYV9kZWNvZGVfZnJhbWUoV01BQ29kZWNDb250ZXh0ICpzLCBmbG9hdCAqKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNfb2Zmc2V0KQoreworICAgIGludCByZXQsIGNoOworCisjaWZkZWYgVFJBQ0UKKyAgICB0cHJpbnRmKHMtPmF2Y3R4LCAiKioqZGVjb2RlX2ZyYW1lOiAlZCBzaXplPSVkXG4iLAorICAgICAgICAgICAgcy0+ZnJhbWVfY291bnQrKywgcy0+ZnJhbWVfbGVuKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisgICAgLyogcmVhZCBlYWNoIGJsb2NrICovCisgICAgcy0+YmxvY2tfbnVtID0gMDsKKyAgICBzLT5ibG9ja19wb3MgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgcmV0ID0gd21hX2RlY29kZV9ibG9jayhzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgLyogY29weSBjdXJyZW50IGJsb2NrIHRvIG91dHB1dCAqLworICAgICAgICBtZW1jcHkoc2FtcGxlc1tjaF0gKyBzYW1wbGVzX29mZnNldCwgcy0+ZnJhbWVfb3V0W2NoXSwKKyAgICAgICAgICAgICAgIHMtPmZyYW1lX2xlbiAqIHNpemVvZigqcy0+ZnJhbWVfb3V0W2NoXSkpOworICAgICAgICAvKiBwcmVwYXJlIGZvciBuZXh0IGJsb2NrICovCisgICAgICAgIG1lbW1vdmUoJnMtPmZyYW1lX291dFtjaF1bMF0sICZzLT5mcmFtZV9vdXRbY2hdW3MtPmZyYW1lX2xlbl0sCisgICAgICAgICAgICAgICAgcy0+ZnJhbWVfbGVuICogc2l6ZW9mKCpzLT5mcmFtZV9vdXRbY2hdKSk7CisKKyNpZmRlZiBUUkFDRQorICAgICAgICBkdW1wX2Zsb2F0cyhzLCAic2FtcGxlcyIsIDYsIHNhbXBsZXNbY2hdICsgc2FtcGxlc19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lX2xlbik7CisjZW5kaWYgLyogVFJBQ0UgKi8KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bWFfZGVjb2RlX3N1cGVyZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIFdNQUNvZGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IG5iX2ZyYW1lcywgYml0X29mZnNldCwgaSwgcG9zLCBsZW4sIHJldDsKKyAgICB1aW50OF90ICpxOworICAgIGZsb2F0ICoqc2FtcGxlczsKKyAgICBpbnQgc2FtcGxlc19vZmZzZXQ7CisKKyAgICB0cHJpbnRmKGF2Y3R4LCAiKioqZGVjb2RlX3N1cGVyZnJhbWU6XG4iKTsKKworICAgIGlmIChidWZfc2l6ZSA9PSAwKSB7CisgICAgICAgIHMtPmxhc3Rfc3VwZXJmcmFtZV9sZW4gPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGJ1Zl9zaXplIDwgYXZjdHgtPmJsb2NrX2FsaWduKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIklucHV0IHBhY2tldCBzaXplIHRvbyBzbWFsbCAoJWQgPCAlZClcbiIsCisgICAgICAgICAgICAgICBidWZfc2l6ZSwgYXZjdHgtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChhdmN0eC0+YmxvY2tfYWxpZ24pCisgICAgICAgIGJ1Zl9zaXplID0gYXZjdHgtPmJsb2NrX2FsaWduOworCisgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1ZiwgYnVmX3NpemUgKiA4KTsKKworICAgIGlmIChzLT51c2VfYml0X3Jlc2Vydm9pcikgeworICAgICAgICAvKiByZWFkIHN1cGVyIGZyYW1lIGhlYWRlciAqLworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA0KTsgLyogc3VwZXIgZnJhbWUgaW5kZXggKi8KKyAgICAgICAgbmJfZnJhbWVzID0gZ2V0X2JpdHMoJnMtPmdiLCA0KSAtIChzLT5sYXN0X3N1cGVyZnJhbWVfbGVuIDw9IDApOworICAgICAgICBpZiAobmJfZnJhbWVzIDw9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibmJfZnJhbWVzIGlzICVkXG4iLCBuYl9mcmFtZXMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgbmJfZnJhbWVzID0gMTsKKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBuYl9mcmFtZXMgKiBzLT5mcmFtZV9sZW47CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzYW1wbGVzICAgICAgICA9IChmbG9hdCAqKikgZnJhbWUtPmV4dGVuZGVkX2RhdGE7CisgICAgc2FtcGxlc19vZmZzZXQgPSAwOworCisgICAgaWYgKHMtPnVzZV9iaXRfcmVzZXJ2b2lyKSB7CisgICAgICAgIGJpdF9vZmZzZXQgPSBnZXRfYml0cygmcy0+Z2IsIHMtPmJ5dGVfb2Zmc2V0X2JpdHMgKyAzKTsKKyAgICAgICAgaWYgKGJpdF9vZmZzZXQgPiBnZXRfYml0c19sZWZ0KCZzLT5nYikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGxhc3QgZnJhbWUgYml0IG9mZnNldCAlZCA+IGJ1ZiBzaXplICVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgYml0X29mZnNldCwgZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpLCBidWZfc2l6ZSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+bGFzdF9zdXBlcmZyYW1lX2xlbiA+IDApIHsKKyAgICAgICAgICAgIC8qIGFkZCBiaXRfb2Zmc2V0IGJpdHMgdG8gbGFzdCBmcmFtZSAqLworICAgICAgICAgICAgaWYgKChzLT5sYXN0X3N1cGVyZnJhbWVfbGVuICsgKChiaXRfb2Zmc2V0ICsgNykgPj4gMykpID4KKyAgICAgICAgICAgICAgICBNQVhfQ09ERURfU1VQRVJGUkFNRV9TSVpFKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIHEgICA9IHMtPmxhc3Rfc3VwZXJmcmFtZSArIHMtPmxhc3Rfc3VwZXJmcmFtZV9sZW47CisgICAgICAgICAgICBsZW4gPSBiaXRfb2Zmc2V0OworICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDcpIHsKKyAgICAgICAgICAgICAgICAqcSsrID0gKGdldF9iaXRzKSAoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICBsZW4gLT0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW4gPiAwKQorICAgICAgICAgICAgICAgICpxKysgPSAoZ2V0X2JpdHMpICgmcy0+Z2IsIGxlbikgPDwgKDggLSBsZW4pOworICAgICAgICAgICAgbWVtc2V0KHEsIDAsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCisgICAgICAgICAgICAvKiBYWFg6IGJpdF9vZmZzZXQgYml0cyBpbnRvIGxhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBzLT5sYXN0X3N1cGVyZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3Rfc3VwZXJmcmFtZV9sZW4gKiA4ICsgYml0X29mZnNldCk7CisgICAgICAgICAgICAvKiBza2lwIHVudXNlZCBiaXRzICovCisgICAgICAgICAgICBpZiAocy0+bGFzdF9iaXRvZmZzZXQgPiAwKQorICAgICAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIHMtPmxhc3RfYml0b2Zmc2V0KTsKKyAgICAgICAgICAgIC8qIHRoaXMgZnJhbWUgaXMgc3RvcmVkIGluIHRoZSBsYXN0IHN1cGVyZnJhbWUgYW5kIGluIHRoZQorICAgICAgICAgICAgICogY3VycmVudCBvbmUgKi8KKyAgICAgICAgICAgIGlmICh3bWFfZGVjb2RlX2ZyYW1lKHMsIHNhbXBsZXMsIHNhbXBsZXNfb2Zmc2V0KSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgc2FtcGxlc19vZmZzZXQgKz0gcy0+ZnJhbWVfbGVuOworICAgICAgICAgICAgbmJfZnJhbWVzLS07CisgICAgICAgIH0KKworICAgICAgICAvKiByZWFkIGVhY2ggZnJhbWUgc3RhcnRpbmcgZnJvbSBiaXRfb2Zmc2V0ICovCisgICAgICAgIHBvcyA9IGJpdF9vZmZzZXQgKyA0ICsgNCArIHMtPmJ5dGVfb2Zmc2V0X2JpdHMgKyAzOworICAgICAgICBpZiAocG9zID49IE1BWF9DT0RFRF9TVVBFUkZSQU1FX1NJWkUgKiA4IHx8IHBvcyA+IGJ1Zl9zaXplICogOCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgYnVmICsgKHBvcyA+PiAzKSwgKGJ1Zl9zaXplIC0gKHBvcyA+PiAzKSkgKiA4KTsKKyAgICAgICAgbGVuID0gcG9zICYgNzsKKyAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCBsZW4pOworCisgICAgICAgIHMtPnJlc2V0X2Jsb2NrX2xlbmd0aHMgPSAxOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh3bWFfZGVjb2RlX2ZyYW1lKHMsIHNhbXBsZXMsIHNhbXBsZXNfb2Zmc2V0KSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgc2FtcGxlc19vZmZzZXQgKz0gcy0+ZnJhbWVfbGVuOworICAgICAgICB9CisKKyAgICAgICAgLyogd2UgY29weSB0aGUgZW5kIG9mIHRoZSBmcmFtZSBpbiB0aGUgbGFzdCBmcmFtZSBidWZmZXIgKi8KKyAgICAgICAgcG9zICAgICAgICAgICAgICAgPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJpdF9vZmZzZXQgKyA0ICsgNCArIHMtPmJ5dGVfb2Zmc2V0X2JpdHMgKyAzKSAmIH43KTsKKyAgICAgICAgcy0+bGFzdF9iaXRvZmZzZXQgPSBwb3MgJiA3OworICAgICAgICBwb3MgICAgICAgICAgICAgPj49IDM7CisgICAgICAgIGxlbiAgICAgICAgICAgICAgID0gYnVmX3NpemUgLSBwb3M7CisgICAgICAgIGlmIChsZW4gPiBNQVhfQ09ERURfU1VQRVJGUkFNRV9TSVpFIHx8IGxlbiA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibGVuICVkIGludmFsaWRcbiIsIGxlbik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgcy0+bGFzdF9zdXBlcmZyYW1lX2xlbiA9IGxlbjsKKyAgICAgICAgbWVtY3B5KHMtPmxhc3Rfc3VwZXJmcmFtZSwgYnVmICsgcG9zLCBsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHNpbmdsZSBmcmFtZSBkZWNvZGUgKi8KKyAgICAgICAgaWYgKHdtYV9kZWNvZGVfZnJhbWUocywgc2FtcGxlcywgc2FtcGxlc19vZmZzZXQpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgc2FtcGxlc19vZmZzZXQgKz0gcy0+ZnJhbWVfbGVuOworICAgIH0KKworICAgIGF2X2Rsb2cocy0+YXZjdHgsICIlZCAlZCAlZCAlZCBvdXRieXRlczolIlBUUkRJRkZfU1BFQ0lGSUVSIiBlYXRlbjolZFxuIiwKKyAgICAgICAgICAgIHMtPmZyYW1lX2xlbl9iaXRzLCBzLT5ibG9ja19sZW5fYml0cywgcy0+ZnJhbWVfbGVuLCBzLT5ibG9ja19sZW4sCisgICAgICAgICAgICAoaW50OF90ICopIHNhbXBsZXMgLSAoaW50OF90ICopIGRhdGEsIGF2Y3R4LT5ibG9ja19hbGlnbik7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7CisKK2ZhaWw6CisgICAgLyogd2hlbiBlcnJvciwgd2UgcmVzZXQgdGhlIGJpdCByZXNlcnZvaXIgKi8KKyAgICBzLT5sYXN0X3N1cGVyZnJhbWVfbGVuID0gMDsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFdNQUNvZGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5sYXN0X2JpdG9mZnNldCAgICAgID0KKyAgICBzLT5sYXN0X3N1cGVyZnJhbWVfbGVuID0gMDsKK30KKworI2lmIENPTkZJR19XTUFWMV9ERUNPREVSCitBVkNvZGVjIGZmX3dtYXYxX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIndtYXYxIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2luZG93cyBNZWRpYSBBdWRpbyAxIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dNQVYxLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihXTUFDb2RlY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHdtYV9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl93bWFfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHdtYV9kZWNvZGVfc3VwZXJmcmFtZSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCisjaWYgQ09ORklHX1dNQVYyX0RFQ09ERVIKK0FWQ29kZWMgZmZfd21hdjJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid21hdjIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIEF1ZGlvIDIiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV01BVjIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFdNQUNvZGVjQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gd21hX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX3dtYV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gd21hX2RlY29kZV9zdXBlcmZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dtYWVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvd21hZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkNDVlOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtYWVuYy5jCkBAIC0wLDAgKzEsNDM4IEBACisvKgorICogV01BIGNvbXBhdGlibGUgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ3bWEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworCitzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFdNQUNvZGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIGZsYWdzMSwgZmxhZ3MyLCBibG9ja19hbGlnbjsKKyAgICB1aW50OF90ICpleHRyYWRhdGE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IE1BWF9DSEFOTkVMUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJ0b28gbWFueSBjaGFubmVsczogZ290ICVpLCBuZWVkICVpIG9yIGZld2VyXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzLCBNQVhfQ0hBTk5FTFMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+c2FtcGxlX3JhdGUgPiA0ODAwMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInNhbXBsZSByYXRlIGlzIHRvbyBoaWdoOiAlZCA+IDQ4a0h6XG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmJpdF9yYXRlIDwgMjQgKiAxMDAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImJpdHJhdGUgdG9vIGxvdzogZ290ICVpLCBuZWVkIDI0MDAwIG9yIGhpZ2hlclxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogZXh0cmFjdCBmbGFnIGluZm9zICovCisgICAgZmxhZ3MxID0gMDsKKyAgICBmbGFnczIgPSAxOworICAgIGlmIChhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX1dNQVYxKSB7CisgICAgICAgIGV4dHJhZGF0YSAgICAgICAgICAgICA9IGF2X21hbGxvYyg0KTsKKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gNDsKKyAgICAgICAgQVZfV0wxNihleHRyYWRhdGEsIGZsYWdzMSk7CisgICAgICAgIEFWX1dMMTYoZXh0cmFkYXRhICsgMiwgZmxhZ3MyKTsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfV01BVjIpIHsKKyAgICAgICAgZXh0cmFkYXRhICAgICAgICAgICAgID0gYXZfbWFsbG9jeigxMCk7CisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IDEwOworICAgICAgICBBVl9XTDMyKGV4dHJhZGF0YSwgZmxhZ3MxKTsKKyAgICAgICAgQVZfV0wxNihleHRyYWRhdGEgKyA0LCBmbGFnczIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorICAgIGF2Y3R4LT5leHRyYWRhdGEgICAgICAgICAgPSBleHRyYWRhdGE7CisgICAgcy0+dXNlX2V4cF92bGMgICAgICAgICAgICA9IGZsYWdzMiAmIDB4MDAwMTsKKyAgICBzLT51c2VfYml0X3Jlc2Vydm9pciAgICAgID0gZmxhZ3MyICYgMHgwMDAyOworICAgIHMtPnVzZV92YXJpYWJsZV9ibG9ja19sZW4gPSBmbGFnczIgJiAweDAwMDQ7CisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA9PSAyKQorICAgICAgICBzLT5tc19zdGVyZW8gPSAxOworCisgICAgZmZfd21hX2luaXQoYXZjdHgsIGZsYWdzMik7CisKKyAgICAvKiBpbml0IE1EQ1QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfYmxvY2tfc2l6ZXM7IGkrKykKKyAgICAgICAgZmZfbWRjdF9pbml0KCZzLT5tZGN0X2N0eFtpXSwgcy0+ZnJhbWVfbGVuX2JpdHMgLSBpICsgMSwgMCwgMS4wKTsKKworICAgIGJsb2NrX2FsaWduICAgICAgICA9IGF2Y3R4LT5iaXRfcmF0ZSAqIChpbnQ2NF90KSBzLT5mcmFtZV9sZW4gLworICAgICAgICAgICAgICAgICAgICAgICAgIChhdmN0eC0+c2FtcGxlX3JhdGUgKiA4KTsKKyAgICBibG9ja19hbGlnbiAgICAgICAgPSBGRk1JTihibG9ja19hbGlnbiwgTUFYX0NPREVEX1NVUEVSRlJBTUVfU0laRSk7CisgICAgYXZjdHgtPmJsb2NrX2FsaWduID0gYmxvY2tfYWxpZ247CisgICAgYXZjdHgtPmZyYW1lX3NpemUgPSBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nID0gcy0+ZnJhbWVfbGVuOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X3dpbmRvd19hbmRfbWRjdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQoreworICAgIFdNQUNvZGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZmxvYXQgKiphdWRpbyAgICAgID0gKGZsb2F0ICoqKSBmcmFtZS0+ZXh0ZW5kZWRfZGF0YTsKKyAgICBpbnQgbGVuICAgICAgICAgICAgPSBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICBpbnQgd2luZG93X2luZGV4ICAgPSBzLT5mcmFtZV9sZW5fYml0cyAtIHMtPmJsb2NrX2xlbl9iaXRzOworICAgIEZGVENvbnRleHQgKm1kY3QgICA9ICZzLT5tZGN0X2N0eFt3aW5kb3dfaW5kZXhdOworICAgIGludCBjaDsKKyAgICBjb25zdCBmbG9hdCAqd2luICAgPSBzLT53aW5kb3dzW3dpbmRvd19pbmRleF07CisgICAgaW50IHdpbmRvd19sZW4gICAgID0gMSA8PCBzLT5ibG9ja19sZW5fYml0czsKKyAgICBmbG9hdCBuICAgICAgICAgICAgPSAyLjAgKiAzMjc2OC4wIC8gd2luZG93X2xlbjsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICBtZW1jcHkocy0+b3V0cHV0LCBzLT5mcmFtZV9vdXRbY2hdLCB3aW5kb3dfbGVuICogc2l6ZW9mKCpzLT5vdXRwdXQpKTsKKyAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyKHMtPmZyYW1lX291dFtjaF0sIGF1ZGlvW2NoXSwgbiwgbGVuKTsKKyAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZSgmcy0+b3V0cHV0W3dpbmRvd19sZW5dLCBzLT5mcmFtZV9vdXRbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luLCBsZW4pOworICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bChzLT5mcmFtZV9vdXRbY2hdLCBzLT5mcmFtZV9vdXRbY2hdLCB3aW4sIGxlbik7CisgICAgICAgIG1kY3QtPm1kY3RfY2FsYyhtZGN0LCBzLT5jb2Vmc1tjaF0sIHMtPm91dHB1dCk7CisgICAgfQorfQorCisvLyBGSVhNRSB1c2UgZm9yIGRlY29kaW5nIHRvbworc3RhdGljIHZvaWQgaW5pdF9leHAoV01BQ29kZWNDb250ZXh0ICpzLCBpbnQgY2gsIGNvbnN0IGludCAqZXhwX3BhcmFtKQoreworICAgIGludCBuOworICAgIGNvbnN0IHVpbnQxNl90ICpwdHI7CisgICAgZmxvYXQgdiwgKnEsIG1heF9zY2FsZSwgKnFfZW5kOworCisgICAgcHRyICAgICAgID0gcy0+ZXhwb25lbnRfYmFuZHNbcy0+ZnJhbWVfbGVuX2JpdHMgLSBzLT5ibG9ja19sZW5fYml0c107CisgICAgcSAgICAgICAgID0gcy0+ZXhwb25lbnRzW2NoXTsKKyAgICBxX2VuZCAgICAgPSBxICsgcy0+YmxvY2tfbGVuOworICAgIG1heF9zY2FsZSA9IDA7CisgICAgd2hpbGUgKHEgPCBxX2VuZCkgeworICAgICAgICAvKiBYWFg6IHVzZSBhIHRhYmxlICovCisgICAgICAgIHYgICAgICAgICA9IHBvdygxMCwgKmV4cF9wYXJhbSsrICooMS4wIC8gMTYuMCkpOworICAgICAgICBtYXhfc2NhbGUgPSBGRk1BWChtYXhfc2NhbGUsIHYpOworICAgICAgICBuICAgICAgICAgPSAqcHRyKys7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICpxKysgPSB2OworICAgICAgICB9IHdoaWxlICgtLW4pOworICAgIH0KKyAgICBzLT5tYXhfZXhwb25lbnRbY2hdID0gbWF4X3NjYWxlOworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfZXhwX3ZsYyhXTUFDb2RlY0NvbnRleHQgKnMsIGludCBjaCwgY29uc3QgaW50ICpleHBfcGFyYW0pCit7CisgICAgaW50IGxhc3RfZXhwOworICAgIGNvbnN0IHVpbnQxNl90ICpwdHI7CisgICAgZmxvYXQgKnEsICpxX2VuZDsKKworICAgIHB0ciAgID0gcy0+ZXhwb25lbnRfYmFuZHNbcy0+ZnJhbWVfbGVuX2JpdHMgLSBzLT5ibG9ja19sZW5fYml0c107CisgICAgcSAgICAgPSBzLT5leHBvbmVudHNbY2hdOworICAgIHFfZW5kID0gcSArIHMtPmJsb2NrX2xlbjsKKyAgICBpZiAocy0+dmVyc2lvbiA9PSAxKSB7CisgICAgICAgIGxhc3RfZXhwID0gKmV4cF9wYXJhbSsrOworICAgICAgICBhdl9hc3NlcnQwKGxhc3RfZXhwIC0gMTAgPj0gMCAmJiBsYXN0X2V4cCAtIDEwIDwgMzIpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIGxhc3RfZXhwIC0gMTApOworICAgICAgICBxICs9ICpwdHIrKzsKKyAgICB9IGVsc2UKKyAgICAgICAgbGFzdF9leHAgPSAzNjsKKyAgICB3aGlsZSAocSA8IHFfZW5kKSB7CisgICAgICAgIGludCBleHAgID0gKmV4cF9wYXJhbSsrOworICAgICAgICBpbnQgY29kZSA9IGV4cCAtIGxhc3RfZXhwICsgNjA7CisgICAgICAgIGF2X2Fzc2VydDEoY29kZSA+PSAwICYmIGNvZGUgPCAxMjApOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIGZmX2FhY19zY2FsZWZhY3Rvcl9iaXRzW2NvZGVdLAorICAgICAgICAgICAgICAgICBmZl9hYWNfc2NhbGVmYWN0b3JfY29kZVtjb2RlXSk7CisgICAgICAgIC8qIFhYWDogdXNlIGEgdGFibGUgKi8KKyAgICAgICAgcSAgICAgICArPSAqcHRyKys7CisgICAgICAgIGxhc3RfZXhwID0gZXhwOworICAgIH0KK30KKworc3RhdGljIGludCBlbmNvZGVfYmxvY2soV01BQ29kZWNDb250ZXh0ICpzLCBmbG9hdCAoKnNyY19jb2VmcylbQkxPQ0tfTUFYX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvdGFsX2dhaW4pCit7CisgICAgaW50IHYsIGJzaXplLCBjaCwgY29lZl9uYl9iaXRzLCBwYXJzZV9leHBvbmVudHM7CisgICAgZmxvYXQgbWRjdF9ub3JtOworICAgIGludCBuYl9jb2Vmc1tNQVhfQ0hBTk5FTFNdOworICAgIHN0YXRpYyBjb25zdCBpbnQgZml4ZWRfZXhwWzI1XSA9IHsKKyAgICAgICAgMjAsIDIwLCAyMCwgMjAsIDIwLAorICAgICAgICAyMCwgMjAsIDIwLCAyMCwgMjAsCisgICAgICAgIDIwLCAyMCwgMjAsIDIwLCAyMCwKKyAgICAgICAgMjAsIDIwLCAyMCwgMjAsIDIwLAorICAgICAgICAyMCwgMjAsIDIwLCAyMCwgMjAKKyAgICB9OworCisgICAgLy8gRklYTUUgcmVtb3ZlIGR1cGxpY2F0aW9uIHJlbGF0aXZlIHRvIGRlY29kZXIKKyAgICBpZiAocy0+dXNlX3ZhcmlhYmxlX2Jsb2NrX2xlbikgeworICAgICAgICBhdl9hc3NlcnQwKDApOyAvLyBGSVhNRSBub3QgaW1wbGVtZW50ZWQKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBmaXhlZCBibG9jayBsZW4gKi8KKyAgICAgICAgcy0+bmV4dF9ibG9ja19sZW5fYml0cyA9IHMtPmZyYW1lX2xlbl9iaXRzOworICAgICAgICBzLT5wcmV2X2Jsb2NrX2xlbl9iaXRzID0gcy0+ZnJhbWVfbGVuX2JpdHM7CisgICAgICAgIHMtPmJsb2NrX2xlbl9iaXRzICAgICAgPSBzLT5mcmFtZV9sZW5fYml0czsKKyAgICB9CisKKyAgICBzLT5ibG9ja19sZW4gPSAxIDw8IHMtPmJsb2NrX2xlbl9iaXRzOworLy8gICAgIGF2X2Fzc2VydDAoKHMtPmJsb2NrX3BvcyArIHMtPmJsb2NrX2xlbikgPD0gcy0+ZnJhbWVfbGVuKTsKKyAgICBic2l6ZSA9IHMtPmZyYW1lX2xlbl9iaXRzIC0gcy0+YmxvY2tfbGVuX2JpdHM7CisKKyAgICAvLyBGSVhNRSBmYWN0b3IKKyAgICB2ID0gcy0+Y29lZnNfZW5kW2JzaXplXSAtIHMtPmNvZWZzX3N0YXJ0OworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmF2Y3R4LT5jaGFubmVsczsgY2grKykKKyAgICAgICAgbmJfY29lZnNbY2hdID0gdjsKKyAgICB7CisgICAgICAgIGludCBuNCA9IHMtPmJsb2NrX2xlbiAvIDI7CisgICAgICAgIG1kY3Rfbm9ybSA9IDEuMCAvIChmbG9hdCkgbjQ7CisgICAgICAgIGlmIChzLT52ZXJzaW9uID09IDEpCisgICAgICAgICAgICBtZGN0X25vcm0gKj0gc3FydChuNCk7CisgICAgfQorCisgICAgaWYgKHMtPmF2Y3R4LT5jaGFubmVscyA9PSAyKQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsICEhcy0+bXNfc3RlcmVvKTsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICAvLyBGSVhNRSBvbmx5IHNldCBjaGFubmVsX2NvZGVkIHdoZW4gbmVlZGVkLCBpbnN0ZWFkIG9mIGFsd2F5cworICAgICAgICBzLT5jaGFubmVsX2NvZGVkW2NoXSA9IDE7CisgICAgICAgIGlmIChzLT5jaGFubmVsX2NvZGVkW2NoXSkKKyAgICAgICAgICAgIGluaXRfZXhwKHMsIGNoLCBmaXhlZF9leHApOworICAgIH0KKworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAocy0+Y2hhbm5lbF9jb2RlZFtjaF0pIHsKKyAgICAgICAgICAgIFdNQUNvZWYgKmNvZWZzMTsKKyAgICAgICAgICAgIGZsb2F0ICpjb2VmcywgKmV4cG9uZW50cywgbXVsdDsKKyAgICAgICAgICAgIGludCBpLCBuOworCisgICAgICAgICAgICBjb2VmczEgICAgPSBzLT5jb2VmczFbY2hdOworICAgICAgICAgICAgZXhwb25lbnRzID0gcy0+ZXhwb25lbnRzW2NoXTsKKyAgICAgICAgICAgIG11bHQgICAgICA9IHBvdygxMCwgdG90YWxfZ2FpbiAqIDAuMDUpIC8gcy0+bWF4X2V4cG9uZW50W2NoXTsKKyAgICAgICAgICAgIG11bHQgICAgICo9IG1kY3Rfbm9ybTsKKyAgICAgICAgICAgIGNvZWZzICAgICA9IHNyY19jb2Vmc1tjaF07CisgICAgICAgICAgICBpZiAocy0+dXNlX25vaXNlX2NvZGluZyAmJiAwKSB7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsgLy8gRklYTUUgbm90IGltcGxlbWVudGVkCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvZWZzICs9IHMtPmNvZWZzX3N0YXJ0OworICAgICAgICAgICAgICAgIG4gICAgICA9IG5iX2NvZWZzW2NoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0ID0gKmNvZWZzKysgLyAoZXhwb25lbnRzW2ldICogbXVsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0IDwgLTMyNzY4IHx8IHQgPiAzMjc2NykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgICAgICBjb2VmczFbaV0gPSBscmludCh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2ID0gMDsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaW50IGEgPSBzLT5jaGFubmVsX2NvZGVkW2NoXTsKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBhKTsKKyAgICAgICAgdiB8PSBhOworICAgIH0KKworICAgIGlmICghdikKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBmb3IgKHYgPSB0b3RhbF9nYWluIC0gMTsgdiA+PSAxMjc7IHYgLT0gMTI3KQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDcsIDEyNyk7CisgICAgcHV0X2JpdHMoJnMtPnBiLCA3LCB2KTsKKworICAgIGNvZWZfbmJfYml0cyA9IGZmX3dtYV90b3RhbF9nYWluX3RvX2JpdHModG90YWxfZ2Fpbik7CisKKyAgICBpZiAocy0+dXNlX25vaXNlX2NvZGluZykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX2NvZGVkW2NoXSkgeworICAgICAgICAgICAgICAgIGludCBpLCBuOworICAgICAgICAgICAgICAgIG4gPSBzLT5leHBvbmVudF9oaWdoX3NpemVzW2JzaXplXTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+aGlnaF9iYW5kX2NvZGVkW2NoXVtpXSA9IDApOworICAgICAgICAgICAgICAgICAgICBpZiAoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5iX2NvZWZzW2NoXSAtPSBzLT5leHBvbmVudF9oaWdoX2JhbmRzW2JzaXplXVtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYXJzZV9leHBvbmVudHMgPSAxOworICAgIGlmIChzLT5ibG9ja19sZW5fYml0cyAhPSBzLT5mcmFtZV9sZW5fYml0cykKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBwYXJzZV9leHBvbmVudHMpOworCisgICAgaWYgKHBhcnNlX2V4cG9uZW50cykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX2NvZGVkW2NoXSkgeworICAgICAgICAgICAgICAgIGlmIChzLT51c2VfZXhwX3ZsYykgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGVfZXhwX3ZsYyhzLCBjaCwgZml4ZWRfZXhwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKDApOyAvLyBGSVhNRSBub3QgaW1wbGVtZW50ZWQKKy8vICAgICAgICAgICAgICAgICAgICBlbmNvZGVfZXhwX2xzcChzLCBjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGF2X2Fzc2VydDAoMCk7IC8vIEZJWE1FIG5vdCBpbXBsZW1lbnRlZAorCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+YXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGlmIChzLT5jaGFubmVsX2NvZGVkW2NoXSkgeworICAgICAgICAgICAgaW50IHJ1biwgdGluZGV4OworICAgICAgICAgICAgV01BQ29lZiAqcHRyLCAqZXB0cjsKKyAgICAgICAgICAgIHRpbmRleCA9IChjaCA9PSAxICYmIHMtPm1zX3N0ZXJlbyk7CisgICAgICAgICAgICBwdHIgICAgPSAmcy0+Y29lZnMxW2NoXVswXTsKKyAgICAgICAgICAgIGVwdHIgICA9IHB0ciArIG5iX2NvZWZzW2NoXTsKKworICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgIGZvciAoOyBwdHIgPCBlcHRyOyBwdHIrKykgeworICAgICAgICAgICAgICAgIGlmICgqcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCAgICAgPSAqcHRyOworICAgICAgICAgICAgICAgICAgICBpbnQgYWJzX2xldmVsID0gRkZBQlMobGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSAgICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFic19sZXZlbCA8PSBzLT5jb2VmX3ZsY3NbdGluZGV4XS0+bWF4X2xldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1biA8IHMtPmNvZWZfdmxjc1t0aW5kZXhdLT5sZXZlbHNbYWJzX2xldmVsIC0gMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IHJ1biArIHMtPmludF90YWJsZVt0aW5kZXhdW2Fic19sZXZlbCAtIDFdOworCisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIoY29kZSA8IHMtPmNvZWZfdmxjc1t0aW5kZXhdLT5uKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5jb2VmX3ZsY3NbdGluZGV4XS0+aHVmZmJpdHNbY29kZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvZWZfdmxjc1t0aW5kZXhdLT5odWZmY29kZXNbY29kZV0pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxIDw8IGNvZWZfbmJfYml0cyA8PSBhYnNfbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIGNvZWZfbmJfYml0cywgYWJzX2xldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgcy0+ZnJhbWVfbGVuX2JpdHMsIHJ1bik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgdGhlIHNpZ24gaXMgZmxpcHBlZCBzb21ld2hlcmUKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBsZXZlbCA8IDApOworICAgICAgICAgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBydW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChydW4pCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCBzLT5jb2VmX3ZsY3NbdGluZGV4XS0+aHVmZmJpdHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29lZl92bGNzW3RpbmRleF0tPmh1ZmZjb2Rlc1sxXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnZlcnNpb24gPT0gMSAmJiBzLT5hdmN0eC0+Y2hhbm5lbHMgPj0gMikKKyAgICAgICAgICAgIGF2cHJpdl9hbGlnbl9wdXRfYml0cygmcy0+cGIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfZnJhbWUoV01BQ29kZWNDb250ZXh0ICpzLCBmbG9hdCAoKnNyY19jb2VmcylbQkxPQ0tfTUFYX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCB0b3RhbF9nYWluKQoreworICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBidWYsIGJ1Zl9zaXplKTsKKworICAgIGlmIChzLT51c2VfYml0X3Jlc2Vydm9pcikKKyAgICAgICAgYXZfYXNzZXJ0MCgwKTsgLy8gRklYTUUgbm90IGltcGxlbWVudGVkCisgICAgZWxzZSBpZiAoZW5jb2RlX2Jsb2NrKHMsIHNyY19jb2VmcywgdG90YWxfZ2FpbikgPCAwKQorICAgICAgICByZXR1cm4gSU5UX01BWDsKKworICAgIGF2cHJpdl9hbGlnbl9wdXRfYml0cygmcy0+cGIpOworCisgICAgcmV0dXJuIHB1dF9iaXRzX2NvdW50KCZzLT5wYikgLyA4IC0gcy0+YXZjdHgtPmJsb2NrX2FsaWduOworfQorCitzdGF0aWMgaW50IGVuY29kZV9zdXBlcmZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBXTUFDb2RlY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCB0b3RhbF9nYWluLCByZXQsIGVycm9yOworCisgICAgcy0+YmxvY2tfbGVuX2JpdHMgPSBzLT5mcmFtZV9sZW5fYml0czsgLy8gcmVxdWlyZWQgYnkgbm9uIHZhcmlhYmxlIGJsb2NrIGxlbgorICAgIHMtPmJsb2NrX2xlbiAgICAgID0gMSA8PCBzLT5ibG9ja19sZW5fYml0czsKKworICAgIGFwcGx5X3dpbmRvd19hbmRfbWRjdChhdmN0eCwgZnJhbWUpOworCisgICAgaWYgKHMtPm1zX3N0ZXJlbykgeworICAgICAgICBmbG9hdCBhLCBiOworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YmxvY2tfbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGEgICAgICAgICAgICAgID0gcy0+Y29lZnNbMF1baV0gKiAwLjU7CisgICAgICAgICAgICBiICAgICAgICAgICAgICA9IHMtPmNvZWZzWzFdW2ldICogMC41OworICAgICAgICAgICAgcy0+Y29lZnNbMF1baV0gPSBhICsgYjsKKyAgICAgICAgICAgIHMtPmNvZWZzWzFdW2ldID0gYSAtIGI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCAyICogTUFYX0NPREVEX1NVUEVSRlJBTUVfU0laRSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHRvdGFsX2dhaW4gPSAxMjg7CisgICAgZm9yIChpID0gNjQ7IGk7IGkgPj49IDEpIHsKKyAgICAgICAgZXJyb3IgPSBlbmNvZGVfZnJhbWUocywgcy0+Y29lZnMsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2dhaW4gLSBpKTsKKyAgICAgICAgaWYgKGVycm9yIDw9IDApCisgICAgICAgICAgICB0b3RhbF9nYWluIC09IGk7CisgICAgfQorCisgICAgd2hpbGUodG90YWxfZ2FpbiA8PSAxMjggJiYgZXJyb3IgPiAwKQorICAgICAgICBlcnJvciA9IGVuY29kZV9mcmFtZShzLCBzLT5jb2VmcywgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplLCB0b3RhbF9nYWluKyspOworICAgIGlmIChlcnJvciA+IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGlucHV0IGRhdGEgb3IgcmVxdWVzdGVkIGJpdHJhdGUgdG9vIGxvdywgY2Fubm90IGVuY29kZVxuIik7CisgICAgICAgIGF2cGt0LT5zaXplID0gMDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXZfYXNzZXJ0MCgocHV0X2JpdHNfY291bnQoJnMtPnBiKSAmIDcpID09IDApOworICAgIGk9IGF2Y3R4LT5ibG9ja19hbGlnbiAtIChwdXRfYml0c19jb3VudCgmcy0+cGIpKzcpLzg7CisgICAgYXZfYXNzZXJ0MChpPj0wKTsKKyAgICB3aGlsZShpLS0pCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgJ04nKTsKKworICAgIGZsdXNoX3B1dF9iaXRzKCZzLT5wYik7CisgICAgYXZfYXNzZXJ0MChwdXRfYml0c19wdHIoJnMtPnBiKSAtIHMtPnBiLmJ1ZiA9PSBhdmN0eC0+YmxvY2tfYWxpZ24pOworCisgICAgaWYgKGZyYW1lLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGF2cGt0LT5wdHMgPSBmcmFtZS0+cHRzIC0gZmZfc2FtcGxlc190b190aW1lX2Jhc2UoYXZjdHgsIGF2Y3R4LT5pbml0aWFsX3BhZGRpbmcpOworCisgICAgYXZwa3QtPnNpemUgICAgID0gYXZjdHgtPmJsb2NrX2FsaWduOworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfV01BVjFfRU5DT0RFUgorQVZDb2RlYyBmZl93bWF2MV9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ3bWF2MSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldpbmRvd3MgTWVkaWEgQXVkaW8gMSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XTUFWMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoV01BQ29kZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBlbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBlbmNvZGVfc3VwZXJmcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl93bWFfZW5kLAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCisjaWYgQ09ORklHX1dNQVYyX0VOQ09ERVIKK0FWQ29kZWMgZmZfd21hdjJfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid21hdjIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIEF1ZGlvIDIiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV01BVjIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFdNQUNvZGVjQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX3N1cGVyZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfd21hX2VuZCwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvd21hbG9zc2xlc3NkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtYWxvc3NsZXNzZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlMzQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtYWxvc3NsZXNzZGVjLmMKQEAgLTAsMCArMSwxMzI5IEBACisvKgorICogV2luZG93cyBNZWRpYSBBdWRpbyBMb3NzbGVzcyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQmFwdGlzdGUgQ291ZHVyaWVyLCBCZW5qYW1pbiBMYXJzc29uLCBVbGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMSBTYXNjaGEgU29tbWVyLCBCZW5qYW1pbiBMYXJzc29uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQW5kcmVhcyDDlm1hbgorICogQ29weXJpZ2h0IChjKSAyMDExIC0gMjAxMiBNYXNoaWF0IFNhcmtlciBTaGFra2hhcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAibG9zc2xlc3NfYXVkaW9kc3AuaCIKKyNpbmNsdWRlICJ3bWEuaCIKKyNpbmNsdWRlICJ3bWFfY29tbW9uLmgiCisKKy8qKiBjdXJyZW50IGRlY29kZXIgbGltaXRhdGlvbnMgKi8KKyNkZWZpbmUgV01BTExfTUFYX0NIQU5ORUxTICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXggbnVtYmVyIG9mIGhhbmRsZWQgY2hhbm5lbHMKKyNkZWZpbmUgTUFYX1NVQkZSQU1FUyAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXggbnVtYmVyIG9mIHN1YmZyYW1lcyBwZXIgY2hhbm5lbAorI2RlZmluZSBNQVhfQkFORFMgICAgICAgICAgICAgIDI5ICAgICAgICAgICAgICAgICAgICAgICAvLy88IG1heCBudW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzCisjZGVmaW5lIE1BWF9GUkFNRVNJWkUgICAgICAgMzI3NjggICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbWF4aW11bSBjb21wcmVzc2VkIGZyYW1lIHNpemUKKyNkZWZpbmUgTUFYX09SREVSICAgICAgICAgICAgIDI1NgorCisjZGVmaW5lIFdNQUxMX0JMT0NLX01JTl9CSVRTICAgIDYgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbG9nMiBvZiBtaW4gYmxvY2sgc2l6ZQorI2RlZmluZSBXTUFMTF9CTE9DS19NQVhfQklUUyAgIDE0ICAgICAgICAgICAgICAgICAgICAgICAvLy88IGxvZzIgb2YgbWF4IGJsb2NrIHNpemUKKyNkZWZpbmUgV01BTExfQkxPQ0tfTUFYX1NJWkUgKDEgPDwgV01BTExfQkxPQ0tfTUFYX0JJVFMpICAgIC8vLzwgbWF4aW11bSBibG9jayBzaXplCisjZGVmaW5lIFdNQUxMX0JMT0NLX1NJWkVTICAgIChXTUFMTF9CTE9DS19NQVhfQklUUyAtIFdNQUxMX0JMT0NLX01JTl9CSVRTICsgMSkgLy8vPCBwb3NzaWJsZSBibG9jayBzaXplcworCisjZGVmaW5lIFdNQUxMX0NPRUZGX1BBRF9TSVpFICAgMTYgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcGFkIGNvZWYgYnVmZmVycyB3aXRoIDAgZm9yIHVzZSB3aXRoIFNJTUQKKworLyoqCisgKiBAYnJpZWYgZnJhbWUtc3BlY2lmaWMgZGVjb2RlciBjb250ZXh0IGZvciBhIHNpbmdsZSBjaGFubmVsCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQxNl90ICAgICBwcmV2X2Jsb2NrX2xlbjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsZW5ndGggb2YgdGhlIHByZXZpb3VzIGJsb2NrCisgICAgdWludDhfdCAgICAgdHJhbnNtaXRfY29lZnM7CisgICAgdWludDhfdCAgICAgbnVtX3N1YmZyYW1lczsKKyAgICB1aW50MTZfdCAgICBzdWJmcmFtZV9sZW5bTUFYX1NVQkZSQU1FU107ICAgICAgICAgICAgLy8vPCBzdWJmcmFtZSBsZW5ndGggaW4gc2FtcGxlcworICAgIHVpbnQxNl90ICAgIHN1YmZyYW1lX29mZnNldHNbTUFYX1NVQkZSQU1FU107ICAgICAgICAvLy88IHN1YmZyYW1lIHBvc2l0aW9ucyBpbiB0aGUgY3VycmVudCBmcmFtZQorICAgIHVpbnQ4X3QgICAgIGN1cl9zdWJmcmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGN1cnJlbnQgc3ViZnJhbWUgbnVtYmVyCisgICAgdWludDE2X3QgICAgZGVjb2RlZF9zYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGFscmVhZHkgcHJvY2Vzc2VkIHNhbXBsZXMKKyAgICBpbnQgICAgICAgICBxdWFudF9zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBxdWFudGl6YXRpb24gc3RlcCBmb3IgdGhlIGN1cnJlbnQgc3ViZnJhbWUKKyAgICBpbnQgICAgICAgICB0cmFuc2llbnRfY291bnRlcjsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgdHJhbnNpZW50IHNhbXBsZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmFuc2llbnQgem9uZQorfSBXbWFsbENoYW5uZWxDdHg7CisKKy8qKgorICogQGJyaWVmIG1haW4gZGVjb2RlciBjb250ZXh0CisgKi8KK3R5cGVkZWYgc3RydWN0IFdtYWxsRGVjb2RlQ3R4IHsKKyAgICAvKiBnZW5lcmljIGRlY29kZXIgdmFyaWFibGVzICovCisgICAgQVZDb2RlY0NvbnRleHQgICphdmN0eDsKKyAgICBBVkZyYW1lICAgICAgICAgKmZyYW1lOworICAgIExMQXVkRFNQQ29udGV4dCBkc3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBhY2NlbGVyYXRlZCBEU1AgZnVuY3Rpb25zCisgICAgdWludDhfdCAgICAgICAgIGZyYW1lX2RhdGFbTUFYX0ZSQU1FU0laRSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkVdOyAgLy8vPCBjb21wcmVzc2VkIGZyYW1lIGRhdGEKKyAgICBQdXRCaXRDb250ZXh0ICAgcGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNvbnRleHQgZm9yIGZpbGxpbmcgdGhlIGZyYW1lX2RhdGEgYnVmZmVyCisKKyAgICAvKiBmcmFtZSBzaXplIGRlcGVuZGVudCBmcmFtZSBpbmZvcm1hdGlvbiAoc2V0IGR1cmluZyBpbml0aWFsaXphdGlvbikgKi8KKyAgICB1aW50MzJfdCAgICAgICAgZGVjb2RlX2ZsYWdzOyAgICAgICAgICAgICAgICAgICAvLy88IHVzZWQgY29tcHJlc3Npb24gZmVhdHVyZXMKKyAgICBpbnQgICAgICAgICAgICAgbGVuX3ByZWZpeDsgICAgICAgICAgICAgICAgICAgICAvLy88IGZyYW1lIGlzIHByZWZpeGVkIHdpdGggaXRzIGxlbmd0aAorICAgIGludCAgICAgICAgICAgICBkeW5hbWljX3JhbmdlX2NvbXByZXNzaW9uOyAgICAgIC8vLzwgZnJhbWUgY29udGFpbnMgRFJDIGRhdGEKKyAgICB1aW50OF90ICAgICAgICAgYml0c19wZXJfc2FtcGxlOyAgICAgICAgICAgICAgICAvLy88IGludGVnZXIgYXVkaW8gc2FtcGxlIHNpemUgZm9yIHRoZSB1bnNjYWxlZCBJTURDVCBvdXRwdXQgKHVzZWQgdG8gc2NhbGUgdG8gWy0xLjAsIDEuMF0pCisgICAgdWludDE2X3QgICAgICAgIHNhbXBsZXNfcGVyX2ZyYW1lOyAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2Ygc2FtcGxlcyB0byBvdXRwdXQKKyAgICB1aW50MTZfdCAgICAgICAgbG9nMl9mcmFtZV9zaXplOworICAgIGludDhfdCAgICAgICAgICBudW1fY2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBzdHJlYW0gKHNhbWUgYXMgQVZDb2RlY0NvbnRleHQubnVtX2NoYW5uZWxzKQorICAgIGludDhfdCAgICAgICAgICBsZmVfY2hhbm5lbDsgICAgICAgICAgICAgICAgICAgIC8vLzwgbGZlIGNoYW5uZWwgaW5kZXgKKyAgICB1aW50OF90ICAgICAgICAgbWF4X251bV9zdWJmcmFtZXM7CisgICAgdWludDhfdCAgICAgICAgIHN1YmZyYW1lX2xlbl9iaXRzOyAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgYml0cyB1c2VkIGZvciB0aGUgc3ViZnJhbWUgbGVuZ3RoCisgICAgdWludDhfdCAgICAgICAgIG1heF9zdWJmcmFtZV9sZW5fYml0OyAgICAgICAgICAgLy8vPCBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgc3ViZnJhbWUgaXMgb2YgbWF4aW11bSBzaXplIHdoZW4gdGhlIGZpcnN0IHN1YmZyYW1lIGxlbmd0aCBiaXQgaXMgMQorICAgIHVpbnQxNl90ICAgICAgICBtaW5fc2FtcGxlc19wZXJfc3ViZnJhbWU7CisKKyAgICAvKiBwYWNrZXQgZGVjb2RlIHN0YXRlICovCisgICAgR2V0Qml0Q29udGV4dCAgIHBnYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBiaXRzdHJlYW0gcmVhZGVyIGNvbnRleHQgZm9yIHRoZSBwYWNrZXQKKyAgICBpbnQgICAgICAgICAgICAgbmV4dF9wYWNrZXRfc3RhcnQ7ICAgICAgICAgICAgICAvLy88IHN0YXJ0IG9mZnNldCBvZiB0aGUgbmV4dCBXTUEgcGFja2V0IGluIHRoZSBkZW11eGVyIHBhY2tldAorICAgIHVpbnQ4X3QgICAgICAgICBwYWNrZXRfb2Zmc2V0OyAgICAgICAgICAgICAgICAgIC8vLzwgb2Zmc2V0IHRvIHRoZSBmcmFtZSBpbiB0aGUgcGFja2V0CisgICAgdWludDhfdCAgICAgICAgIHBhY2tldF9zZXF1ZW5jZV9udW1iZXI7ICAgICAgICAgLy8vPCBjdXJyZW50IHBhY2tldCBudW1iZXIKKyAgICBpbnQgICAgICAgICAgICAgbnVtX3NhdmVkX2JpdHM7ICAgICAgICAgICAgICAgICAvLy88IHNhdmVkIG51bWJlciBvZiBiaXRzCisgICAgaW50ICAgICAgICAgICAgIGZyYW1lX29mZnNldDsgICAgICAgICAgICAgICAgICAgLy8vPCBmcmFtZSBvZmZzZXQgaW4gdGhlIGJpdCByZXNlcnZvaXIKKyAgICBpbnQgICAgICAgICAgICAgc3ViZnJhbWVfb2Zmc2V0OyAgICAgICAgICAgICAgICAvLy88IHN1YmZyYW1lIG9mZnNldCBpbiB0aGUgYml0IHJlc2Vydm9pcgorICAgIHVpbnQ4X3QgICAgICAgICBwYWNrZXRfbG9zczsgICAgICAgICAgICAgICAgICAgIC8vLzwgc2V0IGluIGNhc2Ugb2YgYml0c3RyZWFtIGVycm9yCisgICAgdWludDhfdCAgICAgICAgIHBhY2tldF9kb25lOyAgICAgICAgICAgICAgICAgICAgLy8vPCBzZXQgd2hlbiBhIHBhY2tldCBpcyBmdWxseSBkZWNvZGVkCisKKyAgICAvKiBmcmFtZSBkZWNvZGUgc3RhdGUgKi8KKyAgICB1aW50MzJfdCAgICAgICAgZnJhbWVfbnVtOyAgICAgICAgICAgICAgICAgICAgICAvLy88IGN1cnJlbnQgZnJhbWUgbnVtYmVyIChub3QgdXNlZCBmb3IgZGVjb2RpbmcpCisgICAgR2V0Qml0Q29udGV4dCAgIGdiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBiaXRzdHJlYW0gcmVhZGVyIGNvbnRleHQKKyAgICBpbnQgICAgICAgICAgICAgYnVmX2JpdF9zaXplOyAgICAgICAgICAgICAgICAgICAvLy88IGJ1ZmZlciBzaXplIGluIGJpdHMKKyAgICBpbnQxNl90ICAgICAgICAgKnNhbXBsZXNfMTZbV01BTExfTUFYX0NIQU5ORUxTXTsgLy8vPCBjdXJyZW50IHNhbXBsZWJ1ZmZlciBwb2ludGVyICgxNi1iaXQpCisgICAgaW50MzJfdCAgICAgICAgICpzYW1wbGVzXzMyW1dNQUxMX01BWF9DSEFOTkVMU107IC8vLzwgY3VycmVudCBzYW1wbGVidWZmZXIgcG9pbnRlciAoMjQtYml0KQorICAgIHVpbnQ4X3QgICAgICAgICBkcmNfZ2FpbjsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZ2FpbiBmb3IgdGhlIERSQyB0b29sCisgICAgaW50OF90ICAgICAgICAgIHNraXBfZnJhbWU7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBza2lwIG91dHB1dCBzdGVwCisgICAgaW50OF90ICAgICAgICAgIHBhcnNlZF9hbGxfc3ViZnJhbWVzOyAgICAgICAgICAgLy8vPCBhbGwgc3ViZnJhbWVzIGRlY29kZWQ/CisKKyAgICAvKiBzdWJmcmFtZS9ibG9jayBkZWNvZGUgc3RhdGUgKi8KKyAgICBpbnQxNl90ICAgICAgICAgc3ViZnJhbWVfbGVuOyAgICAgICAgICAgICAgICAgICAvLy88IGN1cnJlbnQgc3ViZnJhbWUgbGVuZ3RoCisgICAgaW50OF90ICAgICAgICAgIGNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWU7ICAgICAgLy8vPCBudW1iZXIgb2YgY2hhbm5lbHMgdGhhdCBjb250YWluIHRoZSBzdWJmcmFtZQorICAgIGludDhfdCAgICAgICAgICBjaGFubmVsX2luZGV4ZXNfZm9yX2N1cl9zdWJmcmFtZVtXTUFMTF9NQVhfQ0hBTk5FTFNdOworCisgICAgV21hbGxDaGFubmVsQ3R4IGNoYW5uZWxbV01BTExfTUFYX0NIQU5ORUxTXTsgICAgLy8vPCBwZXIgY2hhbm5lbCBkYXRhCisKKyAgICAvLyBXTUEgTG9zc2xlc3Mtc3BlY2lmaWMKKworICAgIHVpbnQ4X3QgZG9fYXJpdGhfY29kaW5nOworICAgIHVpbnQ4X3QgZG9fYWNfZmlsdGVyOworICAgIHVpbnQ4X3QgZG9faW50ZXJfY2hfZGVjb3JyOworICAgIHVpbnQ4X3QgZG9fbWNsbXM7CisgICAgdWludDhfdCBkb19scGM7CisKKyAgICBpbnQ4X3QgIGFjZmlsdGVyX29yZGVyOworICAgIGludDhfdCAgYWNmaWx0ZXJfc2NhbGluZzsKKyAgICBpbnQ2NF90IGFjZmlsdGVyX2NvZWZmc1sxNl07CisgICAgaW50ICAgICBhY2ZpbHRlcl9wcmV2dmFsdWVzW1dNQUxMX01BWF9DSEFOTkVMU11bMTZdOworCisgICAgaW50OF90ICBtY2xtc19vcmRlcjsKKyAgICBpbnQ4X3QgIG1jbG1zX3NjYWxpbmc7CisgICAgaW50MTZfdCBtY2xtc19jb2VmZnNbV01BTExfTUFYX0NIQU5ORUxTICogV01BTExfTUFYX0NIQU5ORUxTICogMzJdOworICAgIGludDE2X3QgbWNsbXNfY29lZmZzX2N1cltXTUFMTF9NQVhfQ0hBTk5FTFMgKiBXTUFMTF9NQVhfQ0hBTk5FTFNdOworICAgIGludDE2X3QgbWNsbXNfcHJldnZhbHVlc1tXTUFMTF9NQVhfQ0hBTk5FTFMgKiAyICogMzJdOworICAgIGludDE2X3QgbWNsbXNfdXBkYXRlc1tXTUFMTF9NQVhfQ0hBTk5FTFMgKiAyICogMzJdOworICAgIGludCAgICAgbWNsbXNfcmVjZW50OworCisgICAgaW50ICAgICBtb3ZhdmVfc2NhbGluZzsKKyAgICBpbnQgICAgIHF1YW50X3N0ZXBzaXplOworCisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IG9yZGVyOworICAgICAgICBpbnQgc2NhbGluZzsKKyAgICAgICAgaW50IGNvZWZzZW5kOworICAgICAgICBpbnQgYml0c2VuZDsKKyAgICAgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBjb2VmcylbTUFYX09SREVSICsgV01BTExfQ09FRkZfUEFEX1NJWkUvc2l6ZW9mKGludDE2X3QpXTsKKyAgICAgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBsbXNfcHJldnZhbHVlcylbTUFYX09SREVSICogMl07CisgICAgICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgbG1zX3VwZGF0ZXMpW01BWF9PUkRFUiAqIDJdOworICAgICAgICBpbnQgcmVjZW50OworICAgIH0gY2RsbXNbV01BTExfTUFYX0NIQU5ORUxTXVs5XTsKKworICAgIGludCBjZGxtc190dGxbV01BTExfTUFYX0NIQU5ORUxTXTsKKworICAgIGludCBiVjNSVE07CisKKyAgICBpbnQgaXNfY2hhbm5lbF9jb2RlZFtXTUFMTF9NQVhfQ0hBTk5FTFNdOworICAgIGludCB1cGRhdGVfc3BlZWRbV01BTExfTUFYX0NIQU5ORUxTXTsKKworICAgIGludCB0cmFuc2llbnRbV01BTExfTUFYX0NIQU5ORUxTXTsKKyAgICBpbnQgdHJhbnNpZW50X3Bvc1tXTUFMTF9NQVhfQ0hBTk5FTFNdOworICAgIGludCBzZWVrYWJsZV90aWxlOworCisgICAgaW50IGF2ZV9zdW1bV01BTExfTUFYX0NIQU5ORUxTXTsKKworICAgIGludCBjaGFubmVsX3Jlc2lkdWVzW1dNQUxMX01BWF9DSEFOTkVMU11bV01BTExfQkxPQ0tfTUFYX1NJWkVdOworCisgICAgaW50IGxwY19jb2Vmc1tXTUFMTF9NQVhfQ0hBTk5FTFNdWzQwXTsKKyAgICBpbnQgbHBjX29yZGVyOworICAgIGludCBscGNfc2NhbGluZzsKKyAgICBpbnQgbHBjX2ludGJpdHM7CisKKyAgICBpbnQgY2hhbm5lbF9jb2VmZnNbV01BTExfTUFYX0NIQU5ORUxTXVtXTUFMTF9CTE9DS19NQVhfU0laRV07Cit9IFdtYWxsRGVjb2RlQ3R4OworCisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgV21hbGxEZWNvZGVDdHggKnMgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICplZGF0YV9wdHIgPSBhdmN0eC0+ZXh0cmFkYXRhOworICAgIHVuc2lnbmVkIGludCBjaGFubmVsX21hc2s7CisgICAgaW50IGksIGxvZzJfbWF4X251bV9zdWJmcmFtZXM7CisKKyAgICBpZiAoIWF2Y3R4LT5ibG9ja19hbGlnbikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJsb2NrX2FsaWduIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgZmZfbGxhdWRkc3BfaW5pdCgmcy0+ZHNwKTsKKyAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgcy0+ZnJhbWVfZGF0YSwgTUFYX0ZSQU1FU0laRSk7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDE4KSB7CisgICAgICAgIHMtPmRlY29kZV9mbGFncyAgICA9IEFWX1JMMTYoZWRhdGFfcHRyICsgMTQpOworICAgICAgICBjaGFubmVsX21hc2sgICAgICAgPSBBVl9STDMyKGVkYXRhX3B0ciArICAyKTsKKyAgICAgICAgcy0+Yml0c19wZXJfc2FtcGxlID0gQVZfUkwxNihlZGF0YV9wdHIpOworICAgICAgICBpZiAocy0+Yml0c19wZXJfc2FtcGxlID09IDE2KQorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNlA7CisgICAgICAgIGVsc2UgaWYgKHMtPmJpdHNfcGVyX3NhbXBsZSA9PSAyNCkgeworICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MzMlA7CisgICAgICAgICAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDI0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGJpdC1kZXB0aDogJSJQUkl1OCJcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+Yml0c19wZXJfc2FtcGxlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIC8qIGR1bXAgdGhlIGV4dHJhZGF0YSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmV4dHJhZGF0YV9zaXplOyBpKyspCisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiWyV4XSAiLCBhdmN0eC0+ZXh0cmFkYXRhW2ldKTsKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgIlxuIik7CisKKyAgICB9IGVsc2UgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJVbnN1cHBvcnRlZCBleHRyYWRhdGEgc2l6ZSIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgLyogZ2VuZXJpYyBpbml0ICovCisgICAgcy0+bG9nMl9mcmFtZV9zaXplID0gYXZfbG9nMihhdmN0eC0+YmxvY2tfYWxpZ24pICsgNDsKKworICAgIC8qIGZyYW1lIGluZm8gKi8KKyAgICBzLT5za2lwX2ZyYW1lICA9IDE7IC8qIHNraXAgZmlyc3QgZnJhbWUgKi8KKyAgICBzLT5wYWNrZXRfbG9zcyA9IDE7CisgICAgcy0+bGVuX3ByZWZpeCAgPSBzLT5kZWNvZGVfZmxhZ3MgJiAweDQwOworCisgICAgLyogZ2V0IGZyYW1lIGxlbiAqLworICAgIHMtPnNhbXBsZXNfcGVyX2ZyYW1lID0gMSA8PCBmZl93bWFfZ2V0X2ZyYW1lX2xlbl9iaXRzKGF2Y3R4LT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCBzLT5kZWNvZGVfZmxhZ3MpOworICAgIGF2X2Fzc2VydDAocy0+c2FtcGxlc19wZXJfZnJhbWUgPD0gV01BTExfQkxPQ0tfTUFYX1NJWkUpOworCisgICAgLyogaW5pdCBwcmV2aW91cyBibG9jayBsZW4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspCisgICAgICAgIHMtPmNoYW5uZWxbaV0ucHJldl9ibG9ja19sZW4gPSBzLT5zYW1wbGVzX3Blcl9mcmFtZTsKKworICAgIC8qIHN1YmZyYW1lIGluZm8gKi8KKyAgICBsb2cyX21heF9udW1fc3ViZnJhbWVzICA9IChzLT5kZWNvZGVfZmxhZ3MgJiAweDM4KSA+PiAzOworICAgIHMtPm1heF9udW1fc3ViZnJhbWVzICAgID0gMSA8PCBsb2cyX21heF9udW1fc3ViZnJhbWVzOworICAgIHMtPm1heF9zdWJmcmFtZV9sZW5fYml0ID0gMDsKKyAgICBzLT5zdWJmcmFtZV9sZW5fYml0cyAgICA9IGF2X2xvZzIobG9nMl9tYXhfbnVtX3N1YmZyYW1lcykgKyAxOworCisgICAgcy0+bWluX3NhbXBsZXNfcGVyX3N1YmZyYW1lICA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lIC8gcy0+bWF4X251bV9zdWJmcmFtZXM7CisgICAgcy0+ZHluYW1pY19yYW5nZV9jb21wcmVzc2lvbiA9IHMtPmRlY29kZV9mbGFncyAmIDB4ODA7CisgICAgcy0+YlYzUlRNICAgICAgICAgICAgICAgICAgICA9IHMtPmRlY29kZV9mbGFncyAmIDB4MTAwOworCisgICAgaWYgKHMtPm1heF9udW1fc3ViZnJhbWVzID4gTUFYX1NVQkZSQU1FUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbnVtYmVyIG9mIHN1YmZyYW1lcyAlIlBSSXU4IlxuIiwKKyAgICAgICAgICAgICAgIHMtPm1heF9udW1fc3ViZnJhbWVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+bnVtX2NoYW5uZWxzID0gYXZjdHgtPmNoYW5uZWxzOworCisgICAgLyogZXh0cmFjdCBsZmUgY2hhbm5lbCBwb3NpdGlvbiAqLworICAgIHMtPmxmZV9jaGFubmVsID0gLTE7CisKKyAgICBpZiAoY2hhbm5lbF9tYXNrICYgOCkgeworICAgICAgICB1bnNpZ25lZCBpbnQgbWFzazsKKyAgICAgICAgZm9yIChtYXNrID0gMTsgbWFzayA8IDE2OyBtYXNrIDw8PSAxKQorICAgICAgICAgICAgaWYgKGNoYW5uZWxfbWFzayAmIG1hc2spCisgICAgICAgICAgICAgICAgKytzLT5sZmVfY2hhbm5lbDsKKyAgICB9CisKKyAgICBpZiAocy0+bnVtX2NoYW5uZWxzIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzICUiUFJJZDgiXG4iLAorICAgICAgICAgICAgICAgcy0+bnVtX2NoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfSBlbHNlIGlmIChzLT5udW1fY2hhbm5lbHMgPiBXTUFMTF9NQVhfQ0hBTk5FTFMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vcmUgdGhhbiAlZCBjaGFubmVscyIsIFdNQUxMX01BWF9DSEFOTkVMUyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBzLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGNoYW5uZWxfbWFzazsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBAYnJpZWYgRGVjb2RlIHRoZSBzdWJmcmFtZSBsZW5ndGguCisgKiBAcGFyYW0gcyAgICAgIGNvbnRleHQKKyAqIEBwYXJhbSBvZmZzZXQgc2FtcGxlIG9mZnNldCBpbiB0aGUgZnJhbWUKKyAqIEByZXR1cm4gZGVjb2RlZCBzdWJmcmFtZSBsZW5ndGggb24gc3VjY2VzcywgPCAwIGluIGNhc2Ugb2YgYW4gZXJyb3IKKyAqLworc3RhdGljIGludCBkZWNvZGVfc3ViZnJhbWVfbGVuZ3RoKFdtYWxsRGVjb2RlQ3R4ICpzLCBpbnQgb2Zmc2V0KQoreworICAgIGludCBmcmFtZV9sZW5fcmF0aW8sIHN1YmZyYW1lX2xlbiwgbGVuOworCisgICAgLyogbm8gbmVlZCB0byByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSB3aGVuIG9ubHkgb25lIGxlbmd0aCBpcyBwb3NzaWJsZSAqLworICAgIGlmIChvZmZzZXQgPT0gcy0+c2FtcGxlc19wZXJfZnJhbWUgLSBzLT5taW5fc2FtcGxlc19wZXJfc3ViZnJhbWUpCisgICAgICAgIHJldHVybiBzLT5taW5fc2FtcGxlc19wZXJfc3ViZnJhbWU7CisKKyAgICBsZW4gICAgICAgICAgICAgPSBhdl9sb2cyKHMtPm1heF9udW1fc3ViZnJhbWVzIC0gMSkgKyAxOworICAgIGZyYW1lX2xlbl9yYXRpbyA9IGdldF9iaXRzKCZzLT5nYiwgbGVuKTsKKyAgICBzdWJmcmFtZV9sZW4gICAgPSBzLT5taW5fc2FtcGxlc19wZXJfc3ViZnJhbWUgKiAoZnJhbWVfbGVuX3JhdGlvICsgMSk7CisKKyAgICAvKiBzYW5pdHkgY2hlY2sgdGhlIGxlbmd0aCAqLworICAgIGlmIChzdWJmcmFtZV9sZW4gPCBzLT5taW5fc2FtcGxlc19wZXJfc3ViZnJhbWUgfHwKKyAgICAgICAgc3ViZnJhbWVfbGVuID4gcy0+c2FtcGxlc19wZXJfZnJhbWUpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJicm9rZW4gZnJhbWU6IHN1YmZyYW1lX2xlbiAlaVxuIiwKKyAgICAgICAgICAgICAgIHN1YmZyYW1lX2xlbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICByZXR1cm4gc3ViZnJhbWVfbGVuOworfQorCisvKioKKyAqIEBicmllZiBEZWNvZGUgaG93IHRoZSBkYXRhIGluIHRoZSBmcmFtZSBpcyBzcGxpdCBpbnRvIHN1YmZyYW1lcy4KKyAqICAgICAgIEV2ZXJ5IFdNQSBmcmFtZSBjb250YWlucyB0aGUgZW5jb2RlZCBkYXRhIGZvciBhIGZpeGVkIG51bWJlciBvZgorICogICAgICAgc2FtcGxlcyBwZXIgY2hhbm5lbC4gVGhlIGRhdGEgZm9yIGV2ZXJ5IGNoYW5uZWwgbWlnaHQgYmUgc3BsaXQKKyAqICAgICAgIGludG8gc2V2ZXJhbCBzdWJmcmFtZXMuIFRoaXMgZnVuY3Rpb24gd2lsbCByZWNvbnN0cnVjdCB0aGUgbGlzdCBvZgorICogICAgICAgc3ViZnJhbWVzIGZvciBldmVyeSBjaGFubmVsLgorICoKKyAqICAgICAgIElmIHRoZSBzdWJmcmFtZXMgYXJlIG5vdCBldmVubHkgc3BsaXQsIHRoZSBhbGdvcml0aG0gZXN0aW1hdGVzIHRoZQorICogICAgICAgY2hhbm5lbHMgd2l0aCB0aGUgbG93ZXN0IG51bWJlciBvZiB0b3RhbCBzYW1wbGVzLgorICogICAgICAgQWZ0ZXJ3YXJkcywgZm9yIGVhY2ggb2YgdGhlc2UgY2hhbm5lbHMgYSBiaXQgaXMgcmVhZCBmcm9tIHRoZQorICogICAgICAgYml0c3RyZWFtIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBjaGFubmVsIGNvbnRhaW5zIGEgc3ViZnJhbWUgd2l0aCB0aGUKKyAqICAgICAgIG5leHQgc3ViZnJhbWUgc2l6ZSB0aGF0IGlzIGdvaW5nIHRvIGJlIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtIG9yIG5vdC4KKyAqICAgICAgIElmIGEgY2hhbm5lbCBjb250YWlucyBzdWNoIGEgc3ViZnJhbWUsIHRoZSBzdWJmcmFtZSBzaXplIGdldHMgYWRkZWQgdG8KKyAqICAgICAgIHRoZSBjaGFubmVsJ3Mgc3ViZnJhbWUgbGlzdC4KKyAqICAgICAgIFRoZSBhbGdvcml0aG0gcmVwZWF0cyB0aGVzZSBzdGVwcyB1bnRpbCB0aGUgZnJhbWUgaXMgcHJvcGVybHkgZGl2aWRlZAorICogICAgICAgYmV0d2VlbiB0aGUgaW5kaXZpZHVhbCBjaGFubmVscy4KKyAqCisgKiBAcGFyYW0gcyBjb250ZXh0CisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPCAwIGluIGNhc2Ugb2YgYW4gZXJyb3IKKyAqLworc3RhdGljIGludCBkZWNvZGVfdGlsZWhkcihXbWFsbERlY29kZUN0eCAqcykKK3sKKyAgICB1aW50MTZfdCBudW1fc2FtcGxlc1tXTUFMTF9NQVhfQ0hBTk5FTFNdID0geyAwIH07IC8qIHN1bSBvZiBzYW1wbGVzIGZvciBhbGwgY3VycmVudGx5IGtub3duIHN1YmZyYW1lcyBvZiBhIGNoYW5uZWwgKi8KKyAgICB1aW50OF90ICBjb250YWluc19zdWJmcmFtZVtXTUFMTF9NQVhfQ0hBTk5FTFNdOyAgIC8qIGZsYWcgaW5kaWNhdGluZyBpZiBhIGNoYW5uZWwgY29udGFpbnMgdGhlIGN1cnJlbnQgc3ViZnJhbWUgKi8KKyAgICBpbnQgY2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZSA9IHMtPm51bV9jaGFubmVsczsgIC8qIG51bWJlciBvZiBjaGFubmVscyB0aGF0IGNvbnRhaW4gdGhlIGN1cnJlbnQgc3ViZnJhbWUgKi8KKyAgICBpbnQgZml4ZWRfY2hhbm5lbF9sYXlvdXQgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWcgaW5kaWNhdGluZyB0aGF0IGFsbCBjaGFubmVscyB1c2UgdGhlIHNhbWUgc3ViZnJhMm1lIG9mZnNldHMgYW5kIHNpemVzICovCisgICAgaW50IG1pbl9jaGFubmVsX2xlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbWFsbGVzdCBzdW0gb2Ygc2FtcGxlcyAoY2hhbm5lbHMgd2l0aCB0aGlzIGxlbmd0aCB3aWxsIGJlIHByb2Nlc3NlZCBmaXJzdCkgKi8KKyAgICBpbnQgYywgdGlsZV9hbGlnbmVkOworCisgICAgLyogcmVzZXQgdGlsaW5nIGluZm9ybWF0aW9uICovCisgICAgZm9yIChjID0gMDsgYyA8IHMtPm51bV9jaGFubmVsczsgYysrKQorICAgICAgICBzLT5jaGFubmVsW2NdLm51bV9zdWJmcmFtZXMgPSAwOworCisgICAgdGlsZV9hbGlnbmVkID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgaWYgKHMtPm1heF9udW1fc3ViZnJhbWVzID09IDEgfHwgdGlsZV9hbGlnbmVkKQorICAgICAgICBmaXhlZF9jaGFubmVsX2xheW91dCA9IDE7CisKKyAgICAvKiBsb29wIHVudGlsIHRoZSBmcmFtZSBkYXRhIGlzIHNwbGl0IGJldHdlZW4gdGhlIHN1YmZyYW1lcyAqLworICAgIGRvIHsKKyAgICAgICAgaW50IHN1YmZyYW1lX2xlbiwgaW5fdXNlID0gMDsKKworICAgICAgICAvKiBjaGVjayB3aGljaCBjaGFubmVscyBjb250YWluIHRoZSBzdWJmcmFtZSAqLworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bnVtX2NoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgIGlmIChudW1fc2FtcGxlc1tjXSA9PSBtaW5fY2hhbm5lbF9sZW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoZml4ZWRfY2hhbm5lbF9sYXlvdXQgfHwgY2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZSA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgKG1pbl9jaGFubmVsX2xlbiA9PSBzLT5zYW1wbGVzX3Blcl9mcmFtZSAtIHMtPm1pbl9zYW1wbGVzX3Blcl9zdWJmcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbnNfc3ViZnJhbWVbY10gPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zX3N1YmZyYW1lW2NdID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluX3VzZSB8PSBjb250YWluc19zdWJmcmFtZVtjXTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGNvbnRhaW5zX3N1YmZyYW1lW2NdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaW5fdXNlKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRm91bmQgZW1wdHkgc3ViZnJhbWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgc3ViZnJhbWUgbGVuZ3RoLCBzdWJmcmFtZV9sZW4gPT0gMCBpcyBub3QgYWxsb3dlZCAqLworICAgICAgICBpZiAoKHN1YmZyYW1lX2xlbiA9IGRlY29kZV9zdWJmcmFtZV9sZW5ndGgocywgbWluX2NoYW5uZWxfbGVuKSkgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAvKiBhZGQgc3ViZnJhbWVzIHRvIHRoZSBpbmRpdmlkdWFsIGNoYW5uZWxzIGFuZCBmaW5kIG5ldyBtaW5fY2hhbm5lbF9sZW4gKi8KKyAgICAgICAgbWluX2NoYW5uZWxfbGVuICs9IHN1YmZyYW1lX2xlbjsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IHMtPm51bV9jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICBXbWFsbENoYW5uZWxDdHggKmNoYW4gPSAmcy0+Y2hhbm5lbFtjXTsKKworICAgICAgICAgICAgaWYgKGNvbnRhaW5zX3N1YmZyYW1lW2NdKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYW4tPm51bV9zdWJmcmFtZXMgPj0gTUFYX1NVQkZSQU1FUykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJicm9rZW4gZnJhbWU6IG51bSBzdWJmcmFtZXMgPiAzMVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFuLT5zdWJmcmFtZV9sZW5bY2hhbi0+bnVtX3N1YmZyYW1lc10gPSBzdWJmcmFtZV9sZW47CisgICAgICAgICAgICAgICAgbnVtX3NhbXBsZXNbY10gKz0gc3ViZnJhbWVfbGVuOworICAgICAgICAgICAgICAgICsrY2hhbi0+bnVtX3N1YmZyYW1lczsKKyAgICAgICAgICAgICAgICBpZiAobnVtX3NhbXBsZXNbY10gPiBzLT5zYW1wbGVzX3Blcl9mcmFtZSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImJyb2tlbiBmcmFtZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbGVuKCUiUFJJdTE2IikgPiBzYW1wbGVzX3Blcl9mcmFtZSglIlBSSXUxNiIpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3NhbXBsZXNbY10sIHMtPnNhbXBsZXNfcGVyX2ZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChudW1fc2FtcGxlc1tjXSA8PSBtaW5fY2hhbm5lbF9sZW4pIHsKKyAgICAgICAgICAgICAgICBpZiAobnVtX3NhbXBsZXNbY10gPCBtaW5fY2hhbm5lbF9sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1pbl9jaGFubmVsX2xlbiA9IG51bV9zYW1wbGVzW2NdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2NoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChtaW5fY2hhbm5lbF9sZW4gPCBzLT5zYW1wbGVzX3Blcl9mcmFtZSk7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bnVtX2NoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgaW50IGksIG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsW2NdLm51bV9zdWJmcmFtZXM7IGkrKykgeworICAgICAgICAgICAgcy0+Y2hhbm5lbFtjXS5zdWJmcmFtZV9vZmZzZXRzW2ldID0gb2Zmc2V0OworICAgICAgICAgICAgb2Zmc2V0ICs9IHMtPmNoYW5uZWxbY10uc3ViZnJhbWVfbGVuW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9hY19maWx0ZXIoV21hbGxEZWNvZGVDdHggKnMpCit7CisgICAgaW50IGk7CisgICAgcy0+YWNmaWx0ZXJfb3JkZXIgICA9IGdldF9iaXRzKCZzLT5nYiwgNCkgKyAxOworICAgIHMtPmFjZmlsdGVyX3NjYWxpbmcgPSBnZXRfYml0cygmcy0+Z2IsIDQpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmFjZmlsdGVyX29yZGVyOyBpKyspCisgICAgICAgIHMtPmFjZmlsdGVyX2NvZWZmc1tpXSA9IChzLT5hY2ZpbHRlcl9zY2FsaW5nID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzKCZzLT5nYiwgcy0+YWNmaWx0ZXJfc2NhbGluZykgOiAwKSArIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9tY2xtcyhXbWFsbERlY29kZUN0eCAqcykKK3sKKyAgICBzLT5tY2xtc19vcmRlciAgID0gKGdldF9iaXRzKCZzLT5nYiwgNCkgKyAxKSAqIDI7CisgICAgcy0+bWNsbXNfc2NhbGluZyA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgIGludCBpLCBzZW5kX2NvZWZfYml0czsKKyAgICAgICAgaW50IGNiaXRzID0gYXZfbG9nMihzLT5tY2xtc19zY2FsaW5nICsgMSk7CisgICAgICAgIGlmICgxIDw8IGNiaXRzIDwgcy0+bWNsbXNfc2NhbGluZyArIDEpCisgICAgICAgICAgICBjYml0cysrOworCisgICAgICAgIHNlbmRfY29lZl9iaXRzID0gKGNiaXRzID8gZ2V0X2JpdHMoJnMtPmdiLCBjYml0cykgOiAwKSArIDI7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm1jbG1zX29yZGVyICogcy0+bnVtX2NoYW5uZWxzICogcy0+bnVtX2NoYW5uZWxzOyBpKyspCisgICAgICAgICAgICBzLT5tY2xtc19jb2VmZnNbaV0gPSBnZXRfYml0cygmcy0+Z2IsIHNlbmRfY29lZl9iaXRzKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjOworICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGk7IGMrKykKKyAgICAgICAgICAgICAgICBzLT5tY2xtc19jb2VmZnNfY3VyW2kgKiBzLT5udW1fY2hhbm5lbHMgKyBjXSA9IGdldF9iaXRzKCZzLT5nYiwgc2VuZF9jb2VmX2JpdHMpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9jZGxtcyhXbWFsbERlY29kZUN0eCAqcykKK3sKKyAgICBpbnQgYywgaTsKKyAgICBpbnQgY2RsbXNfc2VuZF9jb2VmID0gZ2V0X2JpdHMxKCZzLT5nYik7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bnVtX2NoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgcy0+Y2RsbXNfdHRsW2NdID0gZ2V0X2JpdHMoJnMtPmdiLCAzKSArIDE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jZGxtc190dGxbY107IGkrKykgeworICAgICAgICAgICAgcy0+Y2RsbXNbY11baV0ub3JkZXIgPSAoZ2V0X2JpdHMoJnMtPmdiLCA3KSArIDEpICogODsKKyAgICAgICAgICAgIGlmIChzLT5jZGxtc1tjXVtpXS5vcmRlciA+IE1BWF9PUkRFUikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiT3JkZXJbJWRdWyVkXSAlZCA+IG1heCAoJWQpLCBub3Qgc3VwcG9ydGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjLCBpLCBzLT5jZGxtc1tjXVtpXS5vcmRlciwgTUFYX09SREVSKTsKKyAgICAgICAgICAgICAgICBzLT5jZGxtc1swXVswXS5vcmRlciA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihzLT5jZGxtc1tjXVtpXS5vcmRlciAmIDgpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgaW50IHdhcm5lZDsKKyAgICAgICAgICAgICAgICBpZighd2FybmVkKQorICAgICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJDRExNUyBvZiBvcmRlciAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jZGxtc1tjXVtpXS5vcmRlcik7CisgICAgICAgICAgICAgICAgd2FybmVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jZGxtc190dGxbY107IGkrKykKKyAgICAgICAgICAgIHMtPmNkbG1zW2NdW2ldLnNjYWxpbmcgPSBnZXRfYml0cygmcy0+Z2IsIDQpOworCisgICAgICAgIGlmIChjZGxtc19zZW5kX2NvZWYpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jZGxtc190dGxbY107IGkrKykgeworICAgICAgICAgICAgICAgIGludCBjYml0cywgc2hpZnRfbCwgc2hpZnRfciwgajsKKyAgICAgICAgICAgICAgICBjYml0cyA9IGF2X2xvZzIocy0+Y2RsbXNbY11baV0ub3JkZXIpOworICAgICAgICAgICAgICAgIGlmICgoMSA8PCBjYml0cykgPCBzLT5jZGxtc1tjXVtpXS5vcmRlcikKKyAgICAgICAgICAgICAgICAgICAgY2JpdHMrKzsKKyAgICAgICAgICAgICAgICBzLT5jZGxtc1tjXVtpXS5jb2Vmc2VuZCA9IGdldF9iaXRzKCZzLT5nYiwgY2JpdHMpICsgMTsKKworICAgICAgICAgICAgICAgIGNiaXRzID0gYXZfbG9nMihzLT5jZGxtc1tjXVtpXS5zY2FsaW5nICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKCgxIDw8IGNiaXRzKSA8IHMtPmNkbG1zW2NdW2ldLnNjYWxpbmcgKyAxKQorICAgICAgICAgICAgICAgICAgICBjYml0cysrOworCisgICAgICAgICAgICAgICAgcy0+Y2RsbXNbY11baV0uYml0c2VuZCA9IGdldF9iaXRzKCZzLT5nYiwgY2JpdHMpICsgMjsKKyAgICAgICAgICAgICAgICBzaGlmdF9sID0gMzIgLSBzLT5jZGxtc1tjXVtpXS5iaXRzZW5kOworICAgICAgICAgICAgICAgIHNoaWZ0X3IgPSAzMiAtIHMtPmNkbG1zW2NdW2ldLnNjYWxpbmcgLSAyOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5jZGxtc1tjXVtpXS5jb2Vmc2VuZDsgaisrKQorICAgICAgICAgICAgICAgICAgICBzLT5jZGxtc1tjXVtpXS5jb2Vmc1tqXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X2JpdHMoJnMtPmdiLCBzLT5jZGxtc1tjXVtpXS5iaXRzZW5kKSA8PCBzaGlmdF9sKSA+PiBzaGlmdF9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmNkbG1zX3R0bFtjXTsgaSsrKQorICAgICAgICAgICAgbWVtc2V0KHMtPmNkbG1zW2NdW2ldLmNvZWZzICsgcy0+Y2RsbXNbY11baV0ub3JkZXIsCisgICAgICAgICAgICAgICAgICAgMCwgV01BTExfQ09FRkZfUEFEX1NJWkUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jaGFubmVsX3Jlc2lkdWVzKFdtYWxsRGVjb2RlQ3R4ICpzLCBpbnQgY2gsIGludCB0aWxlX3NpemUpCit7CisgICAgaW50IGkgPSAwOworICAgIHVuc2lnbmVkIGludCBhdmVfbWVhbjsKKyAgICBzLT50cmFuc2llbnRbY2hdID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgaWYgKHMtPnRyYW5zaWVudFtjaF0pIHsKKyAgICAgICAgcy0+dHJhbnNpZW50X3Bvc1tjaF0gPSBnZXRfYml0cygmcy0+Z2IsIGF2X2xvZzIodGlsZV9zaXplKSk7CisgICAgICAgIGlmIChzLT50cmFuc2llbnRfcG9zW2NoXSkKKyAgICAgICAgICAgIHMtPnRyYW5zaWVudFtjaF0gPSAwOworICAgICAgICBzLT5jaGFubmVsW2NoXS50cmFuc2llbnRfY291bnRlciA9CisgICAgICAgICAgICBGRk1BWChzLT5jaGFubmVsW2NoXS50cmFuc2llbnRfY291bnRlciwgcy0+c2FtcGxlc19wZXJfZnJhbWUgLyAyKTsKKyAgICB9IGVsc2UgaWYgKHMtPmNoYW5uZWxbY2hdLnRyYW5zaWVudF9jb3VudGVyKQorICAgICAgICBzLT50cmFuc2llbnRbY2hdID0gMTsKKworICAgIGlmIChzLT5zZWVrYWJsZV90aWxlKSB7CisgICAgICAgIGF2ZV9tZWFuID0gZ2V0X2JpdHMoJnMtPmdiLCBzLT5iaXRzX3Blcl9zYW1wbGUpOworICAgICAgICBzLT5hdmVfc3VtW2NoXSA9IGF2ZV9tZWFuIDw8IChzLT5tb3ZhdmVfc2NhbGluZyArIDEpOworICAgIH0KKworICAgIGlmIChzLT5zZWVrYWJsZV90aWxlKSB7CisgICAgICAgIGlmIChzLT5kb19pbnRlcl9jaF9kZWNvcnIpCisgICAgICAgICAgICBzLT5jaGFubmVsX3Jlc2lkdWVzW2NoXVswXSA9IGdldF9zYml0c19sb25nKCZzLT5nYiwgcy0+Yml0c19wZXJfc2FtcGxlICsgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmNoYW5uZWxfcmVzaWR1ZXNbY2hdWzBdID0gZ2V0X3NiaXRzX2xvbmcoJnMtPmdiLCBzLT5iaXRzX3Blcl9zYW1wbGUpOworICAgICAgICBpKys7CisgICAgfQorICAgIGZvciAoOyBpIDwgdGlsZV9zaXplOyBpKyspIHsKKyAgICAgICAgaW50IHF1byA9IDAsIHJlbSwgcmVtX2JpdHMsIHJlc2lkdWU7CisgICAgICAgIHdoaWxlKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICBxdW8rKzsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1byA+PSAzMikKKyAgICAgICAgICAgIHF1byArPSBnZXRfYml0c19sb25nKCZzLT5nYiwgZ2V0X2JpdHMoJnMtPmdiLCA1KSArIDEpOworCisgICAgICAgIGF2ZV9tZWFuID0gKHMtPmF2ZV9zdW1bY2hdICsgKDEgPDwgcy0+bW92YXZlX3NjYWxpbmcpKSA+PiAocy0+bW92YXZlX3NjYWxpbmcgKyAxKTsKKyAgICAgICAgaWYgKGF2ZV9tZWFuIDw9IDEpCisgICAgICAgICAgICByZXNpZHVlID0gcXVvOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlbV9iaXRzID0gYXZfY2VpbF9sb2cyKGF2ZV9tZWFuKTsKKyAgICAgICAgICAgIHJlbSAgICAgID0gZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIHJlbV9iaXRzKTsKKyAgICAgICAgICAgIHJlc2lkdWUgID0gKHF1byA8PCByZW1fYml0cykgKyByZW07CisgICAgICAgIH0KKworICAgICAgICBzLT5hdmVfc3VtW2NoXSA9IHJlc2lkdWUgKyBzLT5hdmVfc3VtW2NoXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmF2ZV9zdW1bY2hdID4+IHMtPm1vdmF2ZV9zY2FsaW5nKTsKKworICAgICAgICBpZiAocmVzaWR1ZSAmIDEpCisgICAgICAgICAgICByZXNpZHVlID0gLShyZXNpZHVlID4+IDEpIC0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzaWR1ZSA9IHJlc2lkdWUgPj4gMTsKKyAgICAgICAgcy0+Y2hhbm5lbF9yZXNpZHVlc1tjaF1baV0gPSByZXNpZHVlOworICAgIH0KKworICAgIHJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9scGMoV21hbGxEZWNvZGVDdHggKnMpCit7CisgICAgaW50IGNoLCBpLCBjYml0czsKKyAgICBzLT5scGNfb3JkZXIgICA9IGdldF9iaXRzKCZzLT5nYiwgNSkgKyAxOworICAgIHMtPmxwY19zY2FsaW5nID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsKKyAgICBzLT5scGNfaW50Yml0cyA9IGdldF9iaXRzKCZzLT5nYiwgMykgKyAxOworICAgIGNiaXRzID0gcy0+bHBjX3NjYWxpbmcgKyBzLT5scGNfaW50Yml0czsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5udW1fY2hhbm5lbHM7IGNoKyspCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5scGNfb3JkZXI7IGkrKykKKyAgICAgICAgICAgIHMtPmxwY19jb2Vmc1tjaF1baV0gPSBnZXRfc2JpdHMoJnMtPmdiLCBjYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2NvZGVjX2J1ZmZlcnMoV21hbGxEZWNvZGVDdHggKnMpCit7CisgICAgaW50IGljaCwgaWxtczsKKworICAgIG1lbXNldChzLT5hY2ZpbHRlcl9jb2VmZnMsICAgICAwLCBzaXplb2Yocy0+YWNmaWx0ZXJfY29lZmZzKSk7CisgICAgbWVtc2V0KHMtPmFjZmlsdGVyX3ByZXZ2YWx1ZXMsIDAsIHNpemVvZihzLT5hY2ZpbHRlcl9wcmV2dmFsdWVzKSk7CisgICAgbWVtc2V0KHMtPmxwY19jb2VmcywgICAgICAgICAgIDAsIHNpemVvZihzLT5scGNfY29lZnMpKTsKKworICAgIG1lbXNldChzLT5tY2xtc19jb2VmZnMsICAgICAwLCBzaXplb2Yocy0+bWNsbXNfY29lZmZzKSk7CisgICAgbWVtc2V0KHMtPm1jbG1zX2NvZWZmc19jdXIsIDAsIHNpemVvZihzLT5tY2xtc19jb2VmZnNfY3VyKSk7CisgICAgbWVtc2V0KHMtPm1jbG1zX3ByZXZ2YWx1ZXMsIDAsIHNpemVvZihzLT5tY2xtc19wcmV2dmFsdWVzKSk7CisgICAgbWVtc2V0KHMtPm1jbG1zX3VwZGF0ZXMsICAgIDAsIHNpemVvZihzLT5tY2xtc191cGRhdGVzKSk7CisKKyAgICBmb3IgKGljaCA9IDA7IGljaCA8IHMtPm51bV9jaGFubmVsczsgaWNoKyspIHsKKyAgICAgICAgZm9yIChpbG1zID0gMDsgaWxtcyA8IHMtPmNkbG1zX3R0bFtpY2hdOyBpbG1zKyspIHsKKyAgICAgICAgICAgIG1lbXNldChzLT5jZGxtc1tpY2hdW2lsbXNdLmNvZWZzLCAwLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihzLT5jZGxtc1tpY2hdW2lsbXNdLmNvZWZzKSk7CisgICAgICAgICAgICBtZW1zZXQocy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfcHJldnZhbHVlcywgMCwKKyAgICAgICAgICAgICAgICAgICBzaXplb2Yocy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfcHJldnZhbHVlcykpOworICAgICAgICAgICAgbWVtc2V0KHMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3VwZGF0ZXMsIDAsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3VwZGF0ZXMpKTsKKyAgICAgICAgfQorICAgICAgICBzLT5hdmVfc3VtW2ljaF0gPSAwOworICAgIH0KK30KKworLyoqCisgKiBAYnJpZWYgUmVzZXQgZmlsdGVyIHBhcmFtZXRlcnMgYW5kIHRyYW5zaWVudCBhcmVhIGF0IG5ldyBzZWVrYWJsZSB0aWxlLgorICovCitzdGF0aWMgdm9pZCByZXNldF9jb2RlYyhXbWFsbERlY29kZUN0eCAqcykKK3sKKyAgICBpbnQgaWNoLCBpbG1zOworICAgIHMtPm1jbG1zX3JlY2VudCA9IHMtPm1jbG1zX29yZGVyICogcy0+bnVtX2NoYW5uZWxzOworICAgIGZvciAoaWNoID0gMDsgaWNoIDwgcy0+bnVtX2NoYW5uZWxzOyBpY2grKykgeworICAgICAgICBmb3IgKGlsbXMgPSAwOyBpbG1zIDwgcy0+Y2RsbXNfdHRsW2ljaF07IGlsbXMrKykKKyAgICAgICAgICAgIHMtPmNkbG1zW2ljaF1baWxtc10ucmVjZW50ID0gcy0+Y2RsbXNbaWNoXVtpbG1zXS5vcmRlcjsKKyAgICAgICAgLyogZmlyc3Qgc2FtcGxlIG9mIGEgc2Vla2FibGUgc3ViZnJhbWUgaXMgY29uc2lkZXJlZCBhcyB0aGUgc3RhcnRpbmcgb2YKKyAgICAgICAgICAgIGEgdHJhbnNpZW50IGFyZWEgd2hpY2ggaXMgc2FtcGxlc19wZXJfZnJhbWUgc2FtcGxlcyBsb25nICovCisgICAgICAgIHMtPmNoYW5uZWxbaWNoXS50cmFuc2llbnRfY291bnRlciA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lOworICAgICAgICBzLT50cmFuc2llbnRbaWNoXSAgICAgPSAxOworICAgICAgICBzLT50cmFuc2llbnRfcG9zW2ljaF0gPSAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbWNsbXNfdXBkYXRlKFdtYWxsRGVjb2RlQ3R4ICpzLCBpbnQgaWNvZWYsIGludCAqcHJlZCkKK3sKKyAgICBpbnQgaSwgaiwgaWNoLCBwcmVkX2Vycm9yOworICAgIGludCBvcmRlciAgICAgICAgPSBzLT5tY2xtc19vcmRlcjsKKyAgICBpbnQgbnVtX2NoYW5uZWxzID0gcy0+bnVtX2NoYW5uZWxzOworICAgIGludCByYW5nZSAgICAgICAgPSAxIDw8IChzLT5iaXRzX3Blcl9zYW1wbGUgLSAxKTsKKworICAgIGZvciAoaWNoID0gMDsgaWNoIDwgbnVtX2NoYW5uZWxzOyBpY2grKykgeworICAgICAgICBwcmVkX2Vycm9yID0gcy0+Y2hhbm5lbF9yZXNpZHVlc1tpY2hdW2ljb2VmXSAtIHByZWRbaWNoXTsKKyAgICAgICAgaWYgKHByZWRfZXJyb3IgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXIgKiBudW1fY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgICAgICBzLT5tY2xtc19jb2VmZnNbaSArIGljaCAqIG9yZGVyICogbnVtX2NoYW5uZWxzXSArPQorICAgICAgICAgICAgICAgICAgICBzLT5tY2xtc191cGRhdGVzW3MtPm1jbG1zX3JlY2VudCArIGldOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGljaDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfcmVzaWR1ZXNbal1baWNvZWZdID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcy0+bWNsbXNfY29lZmZzX2N1cltpY2ggKiBudW1fY2hhbm5lbHMgKyBqXSArPSAxOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMtPmNoYW5uZWxfcmVzaWR1ZXNbal1baWNvZWZdIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcy0+bWNsbXNfY29lZmZzX2N1cltpY2ggKiBudW1fY2hhbm5lbHMgKyBqXSAtPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHByZWRfZXJyb3IgPCAwKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXIgKiBudW1fY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgICAgICBzLT5tY2xtc19jb2VmZnNbaSArIGljaCAqIG9yZGVyICogbnVtX2NoYW5uZWxzXSAtPQorICAgICAgICAgICAgICAgICAgICBzLT5tY2xtc191cGRhdGVzW3MtPm1jbG1zX3JlY2VudCArIGldOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGljaDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfcmVzaWR1ZXNbal1baWNvZWZdID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcy0+bWNsbXNfY29lZmZzX2N1cltpY2ggKiBudW1fY2hhbm5lbHMgKyBqXSAtPSAxOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMtPmNoYW5uZWxfcmVzaWR1ZXNbal1baWNvZWZdIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcy0+bWNsbXNfY29lZmZzX2N1cltpY2ggKiBudW1fY2hhbm5lbHMgKyBqXSArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpY2ggPSBudW1fY2hhbm5lbHMgLSAxOyBpY2ggPj0gMDsgaWNoLS0pIHsKKyAgICAgICAgcy0+bWNsbXNfcmVjZW50LS07CisgICAgICAgIHMtPm1jbG1zX3ByZXZ2YWx1ZXNbcy0+bWNsbXNfcmVjZW50XSA9IHMtPmNoYW5uZWxfcmVzaWR1ZXNbaWNoXVtpY29lZl07CisgICAgICAgIGlmIChzLT5jaGFubmVsX3Jlc2lkdWVzW2ljaF1baWNvZWZdID4gcmFuZ2UgLSAxKQorICAgICAgICAgICAgcy0+bWNsbXNfcHJldnZhbHVlc1tzLT5tY2xtc19yZWNlbnRdID0gcmFuZ2UgLSAxOworICAgICAgICBlbHNlIGlmIChzLT5jaGFubmVsX3Jlc2lkdWVzW2ljaF1baWNvZWZdIDwgLXJhbmdlKQorICAgICAgICAgICAgcy0+bWNsbXNfcHJldnZhbHVlc1tzLT5tY2xtc19yZWNlbnRdID0gLXJhbmdlOworCisgICAgICAgIHMtPm1jbG1zX3VwZGF0ZXNbcy0+bWNsbXNfcmVjZW50XSA9IDA7CisgICAgICAgIGlmIChzLT5jaGFubmVsX3Jlc2lkdWVzW2ljaF1baWNvZWZdID4gMCkKKyAgICAgICAgICAgIHMtPm1jbG1zX3VwZGF0ZXNbcy0+bWNsbXNfcmVjZW50XSA9IDE7CisgICAgICAgIGVsc2UgaWYgKHMtPmNoYW5uZWxfcmVzaWR1ZXNbaWNoXVtpY29lZl0gPCAwKQorICAgICAgICAgICAgcy0+bWNsbXNfdXBkYXRlc1tzLT5tY2xtc19yZWNlbnRdID0gLTE7CisgICAgfQorCisgICAgaWYgKHMtPm1jbG1zX3JlY2VudCA9PSAwKSB7CisgICAgICAgIG1lbWNweSgmcy0+bWNsbXNfcHJldnZhbHVlc1tvcmRlciAqIG51bV9jaGFubmVsc10sCisgICAgICAgICAgICAgICBzLT5tY2xtc19wcmV2dmFsdWVzLAorICAgICAgICAgICAgICAgc2l6ZW9mKGludDE2X3QpICogb3JkZXIgKiBudW1fY2hhbm5lbHMpOworICAgICAgICBtZW1jcHkoJnMtPm1jbG1zX3VwZGF0ZXNbb3JkZXIgKiBudW1fY2hhbm5lbHNdLAorICAgICAgICAgICAgICAgcy0+bWNsbXNfdXBkYXRlcywKKyAgICAgICAgICAgICAgIHNpemVvZihpbnQxNl90KSAqIG9yZGVyICogbnVtX2NoYW5uZWxzKTsKKyAgICAgICAgcy0+bWNsbXNfcmVjZW50ID0gbnVtX2NoYW5uZWxzICogb3JkZXI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtY2xtc19wcmVkaWN0KFdtYWxsRGVjb2RlQ3R4ICpzLCBpbnQgaWNvZWYsIGludCAqcHJlZCkKK3sKKyAgICBpbnQgaWNoLCBpOworICAgIGludCBvcmRlciAgICAgICAgPSBzLT5tY2xtc19vcmRlcjsKKyAgICBpbnQgbnVtX2NoYW5uZWxzID0gcy0+bnVtX2NoYW5uZWxzOworCisgICAgZm9yIChpY2ggPSAwOyBpY2ggPCBudW1fY2hhbm5lbHM7IGljaCsrKSB7CisgICAgICAgIHByZWRbaWNoXSA9IDA7CisgICAgICAgIGlmICghcy0+aXNfY2hhbm5lbF9jb2RlZFtpY2hdKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlciAqIG51bV9jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgcHJlZFtpY2hdICs9IHMtPm1jbG1zX3ByZXZ2YWx1ZXNbaSArIHMtPm1jbG1zX3JlY2VudF0gKgorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1jbG1zX2NvZWZmc1tpICsgb3JkZXIgKiBudW1fY2hhbm5lbHMgKiBpY2hdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWNoOyBpKyspCisgICAgICAgICAgICBwcmVkW2ljaF0gKz0gcy0+Y2hhbm5lbF9yZXNpZHVlc1tpXVtpY29lZl0gKgorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1jbG1zX2NvZWZmc19jdXJbaSArIG51bV9jaGFubmVscyAqIGljaF07CisgICAgICAgIHByZWRbaWNoXSArPSAxIDw8IHMtPm1jbG1zX3NjYWxpbmcgLSAxOworICAgICAgICBwcmVkW2ljaF0gPj49IHMtPm1jbG1zX3NjYWxpbmc7CisgICAgICAgIHMtPmNoYW5uZWxfcmVzaWR1ZXNbaWNoXVtpY29lZl0gKz0gcHJlZFtpY2hdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmV2ZXJ0X21jbG1zKFdtYWxsRGVjb2RlQ3R4ICpzLCBpbnQgdGlsZV9zaXplKQoreworICAgIGludCBpY29lZiwgcHJlZFtXTUFMTF9NQVhfQ0hBTk5FTFNdID0geyAwIH07CisgICAgZm9yIChpY29lZiA9IDA7IGljb2VmIDwgdGlsZV9zaXplOyBpY29lZisrKSB7CisgICAgICAgIG1jbG1zX3ByZWRpY3QocywgaWNvZWYsIHByZWQpOworICAgICAgICBtY2xtc191cGRhdGUocywgaWNvZWYsIHByZWQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbG1zX3VwZGF0ZShXbWFsbERlY29kZUN0eCAqcywgaW50IGljaCwgaW50IGlsbXMsIGludCBpbnB1dCkKK3sKKyAgICBpbnQgcmVjZW50ID0gcy0+Y2RsbXNbaWNoXVtpbG1zXS5yZWNlbnQ7CisgICAgaW50IHJhbmdlICA9IDEgPDwgcy0+Yml0c19wZXJfc2FtcGxlIC0gMTsKKworICAgIGlmIChyZWNlbnQpCisgICAgICAgIHJlY2VudC0tOworICAgIGVsc2UgeworICAgICAgICBtZW1jcHkoJnMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3ByZXZ2YWx1ZXNbcy0+Y2RsbXNbaWNoXVtpbG1zXS5vcmRlcl0sCisgICAgICAgICAgICAgICBzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc19wcmV2dmFsdWVzLAorICAgICAgICAgICAgICAgMiAqIHMtPmNkbG1zW2ljaF1baWxtc10ub3JkZXIpOworICAgICAgICBtZW1jcHkoJnMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3VwZGF0ZXNbcy0+Y2RsbXNbaWNoXVtpbG1zXS5vcmRlcl0sCisgICAgICAgICAgICAgICBzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc191cGRhdGVzLAorICAgICAgICAgICAgICAgMiAqIHMtPmNkbG1zW2ljaF1baWxtc10ub3JkZXIpOworICAgICAgICByZWNlbnQgPSBzLT5jZGxtc1tpY2hdW2lsbXNdLm9yZGVyIC0gMTsKKyAgICB9CisKKyAgICBzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc19wcmV2dmFsdWVzW3JlY2VudF0gPSBhdl9jbGlwKGlucHV0LCAtcmFuZ2UsIHJhbmdlIC0gMSk7CisgICAgaWYgKCFpbnB1dCkKKyAgICAgICAgcy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlc1tyZWNlbnRdID0gMDsKKyAgICBlbHNlIGlmIChpbnB1dCA8IDApCisgICAgICAgIHMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3VwZGF0ZXNbcmVjZW50XSA9IC1zLT51cGRhdGVfc3BlZWRbaWNoXTsKKyAgICBlbHNlCisgICAgICAgIHMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3VwZGF0ZXNbcmVjZW50XSA9IHMtPnVwZGF0ZV9zcGVlZFtpY2hdOworCisgICAgcy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlc1tyZWNlbnQgKyAocy0+Y2RsbXNbaWNoXVtpbG1zXS5vcmRlciA+PiA0KV0gPj49IDI7CisgICAgcy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlc1tyZWNlbnQgKyAocy0+Y2RsbXNbaWNoXVtpbG1zXS5vcmRlciA+PiAzKV0gPj49IDE7CisgICAgcy0+Y2RsbXNbaWNoXVtpbG1zXS5yZWNlbnQgPSByZWNlbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHVzZV9oaWdoX3VwZGF0ZV9zcGVlZChXbWFsbERlY29kZUN0eCAqcywgaW50IGljaCkKK3sKKyAgICBpbnQgaWxtcywgcmVjZW50LCBpY29lZjsKKyAgICBmb3IgKGlsbXMgPSBzLT5jZGxtc190dGxbaWNoXSAtIDE7IGlsbXMgPj0gMDsgaWxtcy0tKSB7CisgICAgICAgIHJlY2VudCA9IHMtPmNkbG1zW2ljaF1baWxtc10ucmVjZW50OworICAgICAgICBpZiAocy0+dXBkYXRlX3NwZWVkW2ljaF0gPT0gMTYpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHMtPmJWM1JUTSkgeworICAgICAgICAgICAgZm9yIChpY29lZiA9IDA7IGljb2VmIDwgcy0+Y2RsbXNbaWNoXVtpbG1zXS5vcmRlcjsgaWNvZWYrKykKKyAgICAgICAgICAgICAgICBzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc191cGRhdGVzW2ljb2VmICsgcmVjZW50XSAqPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpY29lZiA9IDA7IGljb2VmIDwgcy0+Y2RsbXNbaWNoXVtpbG1zXS5vcmRlcjsgaWNvZWYrKykKKyAgICAgICAgICAgICAgICBzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc191cGRhdGVzW2ljb2VmXSAqPSAyOworICAgICAgICB9CisgICAgfQorICAgIHMtPnVwZGF0ZV9zcGVlZFtpY2hdID0gMTY7Cit9CisKK3N0YXRpYyB2b2lkIHVzZV9ub3JtYWxfdXBkYXRlX3NwZWVkKFdtYWxsRGVjb2RlQ3R4ICpzLCBpbnQgaWNoKQoreworICAgIGludCBpbG1zLCByZWNlbnQsIGljb2VmOworICAgIGZvciAoaWxtcyA9IHMtPmNkbG1zX3R0bFtpY2hdIC0gMTsgaWxtcyA+PSAwOyBpbG1zLS0pIHsKKyAgICAgICAgcmVjZW50ID0gcy0+Y2RsbXNbaWNoXVtpbG1zXS5yZWNlbnQ7CisgICAgICAgIGlmIChzLT51cGRhdGVfc3BlZWRbaWNoXSA9PSA4KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChzLT5iVjNSVE0pCisgICAgICAgICAgICBmb3IgKGljb2VmID0gMDsgaWNvZWYgPCBzLT5jZGxtc1tpY2hdW2lsbXNdLm9yZGVyOyBpY29lZisrKQorICAgICAgICAgICAgICAgIHMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3VwZGF0ZXNbaWNvZWYgKyByZWNlbnRdIC89IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciAoaWNvZWYgPSAwOyBpY29lZiA8IHMtPmNkbG1zW2ljaF1baWxtc10ub3JkZXI7IGljb2VmKyspCisgICAgICAgICAgICAgICAgcy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlc1tpY29lZl0gLz0gMjsKKyAgICB9CisgICAgcy0+dXBkYXRlX3NwZWVkW2ljaF0gPSA4OworfQorCisvKiogR2V0IHNpZ24gb2YgaW50ZWdlciAoMSBmb3IgcG9zaXRpdmUsIC0xIGZvciBuZWdhdGl2ZSBhbmQgMCBmb3IgemVybykgKi8KKyNkZWZpbmUgV01BU0lHTih4KSAoKHggPiAwKSAtICh4IDwgMCkpCisKK3N0YXRpYyB2b2lkIHJldmVydF9jZGxtcyhXbWFsbERlY29kZUN0eCAqcywgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2VmX2JlZ2luLCBpbnQgY29lZl9lbmQpCit7CisgICAgaW50IGljb2VmLCBwcmVkLCBpbG1zLCBudW1fbG1zLCByZXNpZHVlLCBpbnB1dDsKKworICAgIG51bV9sbXMgPSBzLT5jZGxtc190dGxbY2hdOworICAgIGZvciAoaWxtcyA9IG51bV9sbXMgLSAxOyBpbG1zID49IDA7IGlsbXMtLSkgeworICAgICAgICBmb3IgKGljb2VmID0gY29lZl9iZWdpbjsgaWNvZWYgPCBjb2VmX2VuZDsgaWNvZWYrKykgeworICAgICAgICAgICAgcHJlZCA9IDEgPDwgKHMtPmNkbG1zW2NoXVtpbG1zXS5zY2FsaW5nIC0gMSk7CisgICAgICAgICAgICByZXNpZHVlID0gcy0+Y2hhbm5lbF9yZXNpZHVlc1tjaF1baWNvZWZdOworICAgICAgICAgICAgcHJlZCArPSBzLT5kc3Auc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNihzLT5jZGxtc1tjaF1baWxtc10uY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNkbG1zW2NoXVtpbG1zXS5sbXNfcHJldnZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzLT5jZGxtc1tjaF1baWxtc10ucmVjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jZGxtc1tjaF1baWxtc10ubG1zX3VwZGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcy0+Y2RsbXNbY2hdW2lsbXNdLnJlY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2RsbXNbY2hdW2lsbXNdLm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTUFTSUdOKHJlc2lkdWUpKTsKKyAgICAgICAgICAgIGlucHV0ID0gcmVzaWR1ZSArIChwcmVkID4+IHMtPmNkbG1zW2NoXVtpbG1zXS5zY2FsaW5nKTsKKyAgICAgICAgICAgIGxtc191cGRhdGUocywgY2gsIGlsbXMsIGlucHV0KTsKKyAgICAgICAgICAgIHMtPmNoYW5uZWxfcmVzaWR1ZXNbY2hdW2ljb2VmXSA9IGlucHV0OworICAgICAgICB9CisgICAgfQorICAgIGVtbXNfYygpOworfQorCitzdGF0aWMgdm9pZCByZXZlcnRfaW50ZXJfY2hfZGVjb3JyKFdtYWxsRGVjb2RlQ3R4ICpzLCBpbnQgdGlsZV9zaXplKQoreworICAgIGlmIChzLT5udW1fY2hhbm5lbHMgIT0gMikKKyAgICAgICAgcmV0dXJuOworICAgIGVsc2UgaWYgKHMtPmlzX2NoYW5uZWxfY29kZWRbMF0gfHwgcy0+aXNfY2hhbm5lbF9jb2RlZFsxXSkgeworICAgICAgICBpbnQgaWNvZWY7CisgICAgICAgIGZvciAoaWNvZWYgPSAwOyBpY29lZiA8IHRpbGVfc2l6ZTsgaWNvZWYrKykgeworICAgICAgICAgICAgcy0+Y2hhbm5lbF9yZXNpZHVlc1swXVtpY29lZl0gLT0gcy0+Y2hhbm5lbF9yZXNpZHVlc1sxXVtpY29lZl0gPj4gMTsKKyAgICAgICAgICAgIHMtPmNoYW5uZWxfcmVzaWR1ZXNbMV1baWNvZWZdICs9IHMtPmNoYW5uZWxfcmVzaWR1ZXNbMF1baWNvZWZdOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZXZlcnRfYWNmaWx0ZXIoV21hbGxEZWNvZGVDdHggKnMsIGludCB0aWxlX3NpemUpCit7CisgICAgaW50IGljaCwgcHJlZCwgaSwgajsKKyAgICBpbnQ2NF90ICpmaWx0ZXJfY29lZmZzID0gcy0+YWNmaWx0ZXJfY29lZmZzOworICAgIGludCBzY2FsaW5nICAgICAgICAgICAgPSBzLT5hY2ZpbHRlcl9zY2FsaW5nOworICAgIGludCBvcmRlciAgICAgICAgICAgICAgPSBzLT5hY2ZpbHRlcl9vcmRlcjsKKworICAgIGZvciAoaWNoID0gMDsgaWNoIDwgcy0+bnVtX2NoYW5uZWxzOyBpY2grKykgeworICAgICAgICBpbnQgKnByZXZ2YWx1ZXMgPSBzLT5hY2ZpbHRlcl9wcmV2dmFsdWVzW2ljaF07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlcjsgaSsrKSB7CisgICAgICAgICAgICBwcmVkID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvcmRlcjsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPD0gaikKKyAgICAgICAgICAgICAgICAgICAgcHJlZCArPSBmaWx0ZXJfY29lZmZzW2pdICogcHJldnZhbHVlc1tqIC0gaV07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwcmVkICs9IHMtPmNoYW5uZWxfcmVzaWR1ZXNbaWNoXVtpIC0gaiAtIDFdICogZmlsdGVyX2NvZWZmc1tqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZWQgPj49IHNjYWxpbmc7CisgICAgICAgICAgICBzLT5jaGFubmVsX3Jlc2lkdWVzW2ljaF1baV0gKz0gcHJlZDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSBvcmRlcjsgaSA8IHRpbGVfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBwcmVkID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvcmRlcjsgaisrKQorICAgICAgICAgICAgICAgIHByZWQgKz0gcy0+Y2hhbm5lbF9yZXNpZHVlc1tpY2hdW2kgLSBqIC0gMV0gKiBmaWx0ZXJfY29lZmZzW2pdOworICAgICAgICAgICAgcHJlZCA+Pj0gc2NhbGluZzsKKyAgICAgICAgICAgIHMtPmNoYW5uZWxfcmVzaWR1ZXNbaWNoXVtpXSArPSBwcmVkOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBvcmRlcjsgaisrKQorICAgICAgICAgICAgcHJldnZhbHVlc1tqXSA9IHMtPmNoYW5uZWxfcmVzaWR1ZXNbaWNoXVt0aWxlX3NpemUgLSBqIC0gMV07CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9zdWJmcmFtZShXbWFsbERlY29kZUN0eCAqcykKK3sKKyAgICBpbnQgb2Zmc2V0ICAgICAgICA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lOworICAgIGludCBzdWJmcmFtZV9sZW4gID0gcy0+c2FtcGxlc19wZXJfZnJhbWU7CisgICAgaW50IHRvdGFsX3NhbXBsZXMgPSBzLT5zYW1wbGVzX3Blcl9mcmFtZSAqIHMtPm51bV9jaGFubmVsczsKKyAgICBpbnQgaSwgaiwgcmF3cGNtX3RpbGUsIHBhZGRpbmdfemVyb2VzLCByZXM7CisKKyAgICBzLT5zdWJmcmFtZV9vZmZzZXQgPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpOworCisgICAgLyogcmVzZXQgY2hhbm5lbCBjb250ZXh0IGFuZCBmaW5kIHRoZSBuZXh0IGJsb2NrIG9mZnNldCBhbmQgc2l6ZQorICAgICAgICA9PSB0aGUgbmV4dCBibG9jayBvZiB0aGUgY2hhbm5lbCB3aXRoIHRoZSBzbWFsbGVzdCBudW1iZXIgb2YKKyAgICAgICAgZGVjb2RlZCBzYW1wbGVzICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGlmIChvZmZzZXQgPiBzLT5jaGFubmVsW2ldLmRlY29kZWRfc2FtcGxlcykgeworICAgICAgICAgICAgb2Zmc2V0ID0gcy0+Y2hhbm5lbFtpXS5kZWNvZGVkX3NhbXBsZXM7CisgICAgICAgICAgICBzdWJmcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxbaV0uc3ViZnJhbWVfbGVuW3MtPmNoYW5uZWxbaV0uY3VyX3N1YmZyYW1lXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCBhIGxpc3Qgb2YgYWxsIGNoYW5uZWxzIHRoYXQgY29udGFpbiB0aGUgZXN0aW1hdGVkIGJsb2NrICovCisgICAgcy0+Y2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBjdXJfc3ViZnJhbWUgPSBzLT5jaGFubmVsW2ldLmN1cl9zdWJmcmFtZTsKKyAgICAgICAgLyogc3VidHJhY3QgYWxyZWFkeSBwcm9jZXNzZWQgc2FtcGxlcyAqLworICAgICAgICB0b3RhbF9zYW1wbGVzIC09IHMtPmNoYW5uZWxbaV0uZGVjb2RlZF9zYW1wbGVzOworCisgICAgICAgIC8qIGFuZCBjb3VudCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3ViZnJhbWVzIHRoYXQgbWF0Y2ggb3VyIHByb2ZpbGUgKi8KKyAgICAgICAgaWYgKG9mZnNldCA9PSBzLT5jaGFubmVsW2ldLmRlY29kZWRfc2FtcGxlcyAmJgorICAgICAgICAgICAgc3ViZnJhbWVfbGVuID09IHMtPmNoYW5uZWxbaV0uc3ViZnJhbWVfbGVuW2N1cl9zdWJmcmFtZV0pIHsKKyAgICAgICAgICAgIHRvdGFsX3NhbXBsZXMgLT0gcy0+Y2hhbm5lbFtpXS5zdWJmcmFtZV9sZW5bY3VyX3N1YmZyYW1lXTsKKyAgICAgICAgICAgIHMtPmNoYW5uZWxbaV0uZGVjb2RlZF9zYW1wbGVzICs9CisgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbFtpXS5zdWJmcmFtZV9sZW5bY3VyX3N1YmZyYW1lXTsKKyAgICAgICAgICAgIHMtPmNoYW5uZWxfaW5kZXhlc19mb3JfY3VyX3N1YmZyYW1lW3MtPmNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWVdID0gaTsKKyAgICAgICAgICAgICsrcy0+Y2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNoZWNrIGlmIHRoZSBmcmFtZSB3aWxsIGJlIGNvbXBsZXRlIGFmdGVyIHByb2Nlc3NpbmcgdGhlCisgICAgICAgIGVzdGltYXRlZCBibG9jayAqLworICAgIGlmICghdG90YWxfc2FtcGxlcykKKyAgICAgICAgcy0+cGFyc2VkX2FsbF9zdWJmcmFtZXMgPSAxOworCisKKyAgICBzLT5zZWVrYWJsZV90aWxlID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgaWYgKHMtPnNlZWthYmxlX3RpbGUpIHsKKyAgICAgICAgY2xlYXJfY29kZWNfYnVmZmVycyhzKTsKKworICAgICAgICBzLT5kb19hcml0aF9jb2RpbmcgICAgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgaWYgKHMtPmRvX2FyaXRoX2NvZGluZykgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiQXJpdGhtZXRpYyBjb2RpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBzLT5kb19hY19maWx0ZXIgICAgICAgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgcy0+ZG9faW50ZXJfY2hfZGVjb3JyID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgIHMtPmRvX21jbG1zICAgICAgICAgICA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgICAgIGlmIChzLT5kb19hY19maWx0ZXIpCisgICAgICAgICAgICBkZWNvZGVfYWNfZmlsdGVyKHMpOworCisgICAgICAgIGlmIChzLT5kb19tY2xtcykKKyAgICAgICAgICAgIGRlY29kZV9tY2xtcyhzKTsKKworICAgICAgICBpZiAoKHJlcyA9IGRlY29kZV9jZGxtcyhzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgcy0+bW92YXZlX3NjYWxpbmcgPSBnZXRfYml0cygmcy0+Z2IsIDMpOworICAgICAgICBzLT5xdWFudF9zdGVwc2l6ZSA9IGdldF9iaXRzKCZzLT5nYiwgOCkgKyAxOworCisgICAgICAgIHJlc2V0X2NvZGVjKHMpOworICAgIH0gZWxzZSBpZiAoIXMtPmNkbG1zWzBdWzBdLm9yZGVyKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgIldhaXRpbmcgZm9yIHNlZWthYmxlIHRpbGVcbiIpOworICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5mcmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByYXdwY21fdGlsZSA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9jaGFubmVsczsgaSsrKQorICAgICAgICBzLT5pc19jaGFubmVsX2NvZGVkW2ldID0gMTsKKworICAgIGlmICghcmF3cGNtX3RpbGUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgcy0+aXNfY2hhbm5lbF9jb2RlZFtpXSA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgICAgIGlmIChzLT5iVjNSVE0pIHsKKyAgICAgICAgICAgIC8vIExQQworICAgICAgICAgICAgcy0+ZG9fbHBjID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBpZiAocy0+ZG9fbHBjKSB7CisgICAgICAgICAgICAgICAgZGVjb2RlX2xwYyhzKTsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJFeHBlY3Qgd3Jvbmcgb3V0cHV0IHNpbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmVyc2UgTFBDIGZpbHRlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHMtPmRvX2xwYyA9IDA7CisgICAgfQorCisKKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgIHBhZGRpbmdfemVyb2VzID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKKyAgICBlbHNlCisgICAgICAgIHBhZGRpbmdfemVyb2VzID0gMDsKKworICAgIGlmIChyYXdwY21fdGlsZSkgeworICAgICAgICBpbnQgYml0cyA9IHMtPmJpdHNfcGVyX3NhbXBsZSAtIHBhZGRpbmdfemVyb2VzOworICAgICAgICBpZiAoYml0cyA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGluIHJhdyBQQ00gdGlsZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiUkFXUENNICVkIGJpdHMgcGVyIHNhbXBsZS4gIgorICAgICAgICAgICAgICAgICJ0b3RhbCAlZCBiaXRzLCByZW1haW49JWRcbiIsIGJpdHMsCisgICAgICAgICAgICAgICAgYml0cyAqIHMtPm51bV9jaGFubmVscyAqIHN1YmZyYW1lX2xlbiwgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWJmcmFtZV9sZW47IGorKykKKyAgICAgICAgICAgICAgICBzLT5jaGFubmVsX2NvZWZmc1tpXVtqXSA9IGdldF9zYml0c19sb25nKCZzLT5nYiwgYml0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgaWYgKHMtPmlzX2NoYW5uZWxfY29kZWRbaV0pIHsKKyAgICAgICAgICAgICAgICBkZWNvZGVfY2hhbm5lbF9yZXNpZHVlcyhzLCBpLCBzdWJmcmFtZV9sZW4pOworICAgICAgICAgICAgICAgIGlmIChzLT5zZWVrYWJsZV90aWxlKQorICAgICAgICAgICAgICAgICAgICB1c2VfaGlnaF91cGRhdGVfc3BlZWQocywgaSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB1c2Vfbm9ybWFsX3VwZGF0ZV9zcGVlZChzLCBpKTsKKyAgICAgICAgICAgICAgICByZXZlcnRfY2RsbXMocywgaSwgMCwgc3ViZnJhbWVfbGVuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmNoYW5uZWxfcmVzaWR1ZXNbaV0sIDAsIHNpemVvZigqKnMtPmNoYW5uZWxfcmVzaWR1ZXMpICogc3ViZnJhbWVfbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPmRvX21jbG1zKQorICAgICAgICByZXZlcnRfbWNsbXMocywgc3ViZnJhbWVfbGVuKTsKKyAgICBpZiAocy0+ZG9faW50ZXJfY2hfZGVjb3JyKQorICAgICAgICByZXZlcnRfaW50ZXJfY2hfZGVjb3JyKHMsIHN1YmZyYW1lX2xlbik7CisgICAgaWYgKHMtPmRvX2FjX2ZpbHRlcikKKyAgICAgICAgcmV2ZXJ0X2FjZmlsdGVyKHMsIHN1YmZyYW1lX2xlbik7CisKKyAgICAvKiBEZXF1YW50aXplICovCisgICAgaWYgKHMtPnF1YW50X3N0ZXBzaXplICE9IDEpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWJmcmFtZV9sZW47IGorKykKKyAgICAgICAgICAgICAgICBzLT5jaGFubmVsX3Jlc2lkdWVzW2ldW2pdICo9IHMtPnF1YW50X3N0ZXBzaXplOworCisgICAgLyogV3JpdGUgdG8gcHJvcGVyIG91dHB1dCBidWZmZXIgZGVwZW5kaW5nIG9uIGJpdC1kZXB0aCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsc19mb3JfY3VyX3N1YmZyYW1lOyBpKyspIHsKKyAgICAgICAgaW50IGMgPSBzLT5jaGFubmVsX2luZGV4ZXNfZm9yX2N1cl9zdWJmcmFtZVtpXTsKKyAgICAgICAgaW50IHN1YmZyYW1lX2xlbiA9IHMtPmNoYW5uZWxbY10uc3ViZnJhbWVfbGVuW3MtPmNoYW5uZWxbY10uY3VyX3N1YmZyYW1lXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3ViZnJhbWVfbGVuOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5iaXRzX3Blcl9zYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAqcy0+c2FtcGxlc18xNltjXSsrID0gKGludDE2X3QpIHMtPmNoYW5uZWxfcmVzaWR1ZXNbY11bal0gPDwgcGFkZGluZ196ZXJvZXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpzLT5zYW1wbGVzXzMyW2NdKysgPSBzLT5jaGFubmVsX3Jlc2lkdWVzW2NdW2pdIDw8IChwYWRkaW5nX3plcm9lcyArIDgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogaGFuZGxlZCBvbmUgc3ViZnJhbWUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZTsgaSsrKSB7CisgICAgICAgIGludCBjID0gcy0+Y2hhbm5lbF9pbmRleGVzX2Zvcl9jdXJfc3ViZnJhbWVbaV07CisgICAgICAgIGlmIChzLT5jaGFubmVsW2NdLmN1cl9zdWJmcmFtZSA+PSBzLT5jaGFubmVsW2NdLm51bV9zdWJmcmFtZXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYnJva2VuIHN1YmZyYW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgICsrcy0+Y2hhbm5lbFtjXS5jdXJfc3ViZnJhbWU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEBicmllZiBEZWNvZGUgb25lIFdNQSBmcmFtZS4KKyAqIEBwYXJhbSBzIGNvZGVjIGNvbnRleHQKKyAqIEByZXR1cm4gMCBpZiB0aGUgdHJhaWxlciBiaXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyB0aGUgbGFzdCBmcmFtZSwKKyAqICAgICAgICAgMSBpZiB0aGVyZSBhcmUgYWRkaXRpb25hbCBmcmFtZXMKKyAqLworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoV21hbGxEZWNvZGVDdHggKnMpCit7CisgICAgR2V0Qml0Q29udGV4dCogZ2IgPSAmcy0+Z2I7CisgICAgaW50IG1vcmVfZnJhbWVzID0gMCwgbGVuID0gMCwgaSwgcmV0OworCisgICAgcy0+ZnJhbWUtPm5iX3NhbXBsZXMgPSBzLT5zYW1wbGVzX3Blcl9mcmFtZTsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIocy0+YXZjdHgsIHMtPmZyYW1lLCAwKSkgPCAwKSB7CisgICAgICAgIC8qIHJldHVybiBhbiBlcnJvciBpZiBubyBmcmFtZSBjb3VsZCBiZSBkZWNvZGVkIGF0IGFsbCAqLworICAgICAgICBzLT5wYWNrZXRfbG9zcyA9IDE7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fY2hhbm5lbHM7IGkrKykgeworICAgICAgICBzLT5zYW1wbGVzXzE2W2ldID0gKGludDE2X3QgKilzLT5mcmFtZS0+ZXh0ZW5kZWRfZGF0YVtpXTsKKyAgICAgICAgcy0+c2FtcGxlc18zMltpXSA9IChpbnQzMl90ICopcy0+ZnJhbWUtPmV4dGVuZGVkX2RhdGFbaV07CisgICAgfQorCisgICAgLyogZ2V0IGZyYW1lIGxlbmd0aCAqLworICAgIGlmIChzLT5sZW5fcHJlZml4KQorICAgICAgICBsZW4gPSBnZXRfYml0cyhnYiwgcy0+bG9nMl9mcmFtZV9zaXplKTsKKworICAgIC8qIGRlY29kZSB0aWxlIGluZm9ybWF0aW9uICovCisgICAgaWYgKChyZXQgPSBkZWNvZGVfdGlsZWhkcihzKSkpIHsKKyAgICAgICAgcy0+cGFja2V0X2xvc3MgPSAxOworICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5mcmFtZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogcmVhZCBkcmMgaW5mbyAqLworICAgIGlmIChzLT5keW5hbWljX3JhbmdlX2NvbXByZXNzaW9uKQorICAgICAgICBzLT5kcmNfZ2FpbiA9IGdldF9iaXRzKGdiLCA4KTsKKworICAgIC8qIG5vIGlkZWEgd2hhdCB0aGVzZSBhcmUgZm9yLCBtaWdodCBiZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKKyAgICAgICB0aGF0IG5lZWQgdG8gYmUgc2tpcHBlZCBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBhIHN0cmVhbSAqLworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGludCBhdl91bnVzZWQgc2tpcDsKKworICAgICAgICAvKiB1c3VhbGx5IHRydWUgZm9yIHRoZSBmaXJzdCBmcmFtZSAqLworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgc2tpcCA9IGdldF9iaXRzKGdiLCBhdl9sb2cyKHMtPnNhbXBsZXNfcGVyX2ZyYW1lICogMikpOworICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgInN0YXJ0IHNraXA6ICVpXG4iLCBza2lwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNvbWV0aW1lcyB0cnVlIGZvciB0aGUgbGFzdCBmcmFtZSAqLworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgc2tpcCA9IGdldF9iaXRzKGdiLCBhdl9sb2cyKHMtPnNhbXBsZXNfcGVyX2ZyYW1lICogMikpOworICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgImVuZCBza2lwOiAlaVxuIiwgc2tpcCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qIHJlc2V0IHN1YmZyYW1lIHN0YXRlcyAqLworICAgIHMtPnBhcnNlZF9hbGxfc3ViZnJhbWVzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgcy0+Y2hhbm5lbFtpXS5kZWNvZGVkX3NhbXBsZXMgPSAwOworICAgICAgICBzLT5jaGFubmVsW2ldLmN1cl9zdWJmcmFtZSAgICA9IDA7CisgICAgfQorCisgICAgLyogZGVjb2RlIGFsbCBzdWJmcmFtZXMgKi8KKyAgICB3aGlsZSAoIXMtPnBhcnNlZF9hbGxfc3ViZnJhbWVzKSB7CisgICAgICAgIGludCBkZWNvZGVkX3NhbXBsZXMgPSBzLT5jaGFubmVsWzBdLmRlY29kZWRfc2FtcGxlczsKKyAgICAgICAgaWYgKGRlY29kZV9zdWJmcmFtZShzKSA8IDApIHsKKyAgICAgICAgICAgIHMtPnBhY2tldF9sb3NzID0gMTsKKyAgICAgICAgICAgIGlmIChzLT5mcmFtZS0+bmJfc2FtcGxlcykKKyAgICAgICAgICAgICAgICBzLT5mcmFtZS0+bmJfc2FtcGxlcyA9IGRlY29kZWRfc2FtcGxlczsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZGxvZyhzLT5hdmN0eCwgIkZyYW1lIGRvbmVcbiIpOworCisgICAgaWYgKHMtPnNraXBfZnJhbWUpCisgICAgICAgIHMtPnNraXBfZnJhbWUgPSAwOworCisgICAgaWYgKHMtPmxlbl9wcmVmaXgpIHsKKyAgICAgICAgaWYgKGxlbiAhPSAoZ2V0X2JpdHNfY291bnQoZ2IpIC0gcy0+ZnJhbWVfb2Zmc2V0KSArIDIpIHsKKyAgICAgICAgICAgIC8qIEZJWE1FOiBub3Qgc3VyZSBpZiB0aGlzIGlzIGFsd2F5cyBhbiBlcnJvciAqLworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImZyYW1lWyUiUFJJdTMyIl0gd291bGQgaGF2ZSB0byBza2lwICVpIGJpdHNcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWVfbnVtLAorICAgICAgICAgICAgICAgICAgIGxlbiAtIChnZXRfYml0c19jb3VudChnYikgLSBzLT5mcmFtZV9vZmZzZXQpIC0gMSk7CisgICAgICAgICAgICBzLT5wYWNrZXRfbG9zcyA9IDE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNraXAgdGhlIHJlc3Qgb2YgdGhlIGZyYW1lIGRhdGEgKi8KKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGxlbiAtIChnZXRfYml0c19jb3VudChnYikgLSBzLT5mcmFtZV9vZmZzZXQpIC0gMSk7CisgICAgfQorCisgICAgLyogZGVjb2RlIHRyYWlsZXIgYml0ICovCisgICAgbW9yZV9mcmFtZXMgPSBnZXRfYml0czEoZ2IpOworICAgICsrcy0+ZnJhbWVfbnVtOworICAgIHJldHVybiBtb3JlX2ZyYW1lczsKK30KKworLyoqCisgKiBAYnJpZWYgQ2FsY3VsYXRlIHJlbWFpbmluZyBpbnB1dCBidWZmZXIgbGVuZ3RoLgorICogQHBhcmFtIHMgIGNvZGVjIGNvbnRleHQKKyAqIEBwYXJhbSBnYiBiaXRzdHJlYW0gcmVhZGVyIGNvbnRleHQKKyAqIEByZXR1cm4gcmVtYWluaW5nIHNpemUgaW4gYml0cworICovCitzdGF0aWMgaW50IHJlbWFpbmluZ19iaXRzKFdtYWxsRGVjb2RlQ3R4ICpzLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICByZXR1cm4gcy0+YnVmX2JpdF9zaXplIC0gZ2V0X2JpdHNfY291bnQoZ2IpOworfQorCisvKioKKyAqIEBicmllZiBGaWxsIHRoZSBiaXQgcmVzZXJ2b2lyIHdpdGggYSAocGFydGlhbCkgZnJhbWUuCisgKiBAcGFyYW0gcyAgICAgIGNvZGVjIGNvbnRleHQKKyAqIEBwYXJhbSBnYiAgICAgYml0c3RyZWFtIHJlYWRlciBjb250ZXh0CisgKiBAcGFyYW0gbGVuICAgIGxlbmd0aCBvZiB0aGUgcGFydGlhbCBmcmFtZQorICogQHBhcmFtIGFwcGVuZCBkZWNpZGVzIHdoZXRoZXIgdG8gcmVzZXQgdGhlIGJ1ZmZlciBvciBub3QKKyAqLworc3RhdGljIHZvaWQgc2F2ZV9iaXRzKFdtYWxsRGVjb2RlQ3R4ICpzLCBHZXRCaXRDb250ZXh0KiBnYiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBwZW5kKQoreworICAgIGludCBidWZsZW47CisgICAgUHV0Qml0Q29udGV4dCB0bXA7CisKKyAgICAvKiB3aGVuIHRoZSBmcmFtZSBkYXRhIGRvZXMgbm90IG5lZWQgdG8gYmUgY29uY2F0ZW5hdGVkLCB0aGUgaW5wdXQgYnVmZmVyCisgICAgICAgIGlzIHJlc2V0IGFuZCBhZGRpdGlvbmFsIGJpdHMgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUgYXJlIGNvcGllZAorICAgICAgICBhbmQgc2tpcHBlZCBsYXRlciBzbyB0aGF0IGEgZmFzdCBieXRlIGNvcHkgaXMgcG9zc2libGUgKi8KKworICAgIGlmICghYXBwZW5kKSB7CisgICAgICAgIHMtPmZyYW1lX29mZnNldCAgID0gZ2V0X2JpdHNfY291bnQoZ2IpICYgNzsKKyAgICAgICAgcy0+bnVtX3NhdmVkX2JpdHMgPSBzLT5mcmFtZV9vZmZzZXQ7CisgICAgICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBzLT5mcmFtZV9kYXRhLCBNQVhfRlJBTUVTSVpFKTsKKyAgICB9CisKKyAgICBidWZsZW4gPSAocy0+bnVtX3NhdmVkX2JpdHMgKyBsZW4gKyA4KSA+PiAzOworCisgICAgaWYgKGxlbiA8PSAwIHx8IGJ1ZmxlbiA+IE1BWF9GUkFNRVNJWkUpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiVG9vIHNtYWxsIGlucHV0IGJ1ZmZlciIpOworICAgICAgICBzLT5wYWNrZXRfbG9zcyA9IDE7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzLT5udW1fc2F2ZWRfYml0cyArPSBsZW47CisgICAgaWYgKCFhcHBlbmQpIHsKKyAgICAgICAgYXZwcml2X2NvcHlfYml0cygmcy0+cGIsIGdiLT5idWZmZXIgKyAoZ2V0X2JpdHNfY291bnQoZ2IpID4+IDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm51bV9zYXZlZF9iaXRzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgYWxpZ24gPSA4IC0gKGdldF9iaXRzX2NvdW50KGdiKSAmIDcpOworICAgICAgICBhbGlnbiA9IEZGTUlOKGFsaWduLCBsZW4pOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIGFsaWduLCBnZXRfYml0cyhnYiwgYWxpZ24pKTsKKyAgICAgICAgbGVuIC09IGFsaWduOworICAgICAgICBhdnByaXZfY29weV9iaXRzKCZzLT5wYiwgZ2ItPmJ1ZmZlciArIChnZXRfYml0c19jb3VudChnYikgPj4gMyksIGxlbik7CisgICAgfQorICAgIHNraXBfYml0c19sb25nKGdiLCBsZW4pOworCisgICAgdG1wID0gcy0+cGI7CisgICAgZmx1c2hfcHV0X2JpdHMoJnRtcCk7CisKKyAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgcy0+ZnJhbWVfZGF0YSwgcy0+bnVtX3NhdmVkX2JpdHMpOworICAgIHNraXBfYml0cygmcy0+Z2IsIHMtPmZyYW1lX29mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3BhY2tldChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCogYXZwa3QpCit7CisgICAgV21hbGxEZWNvZGVDdHggKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJpdENvbnRleHQqIGdiICA9ICZzLT5wZ2I7CisgICAgY29uc3QgdWludDhfdCogYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgaW50IG51bV9iaXRzX3ByZXZfZnJhbWUsIHBhY2tldF9zZXF1ZW5jZV9udW1iZXIsIHNwbGljZWRfcGFja2V0OworCisgICAgcy0+ZnJhbWUtPm5iX3NhbXBsZXMgPSAwOworCisgICAgaWYgKHMtPnBhY2tldF9kb25lIHx8IHMtPnBhY2tldF9sb3NzKSB7CisgICAgICAgIHMtPnBhY2tldF9kb25lID0gMDsKKworICAgICAgICBpZiAoIWJ1Zl9zaXplKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIC8qIHNhbml0eSBjaGVjayBmb3IgdGhlIGJ1ZmZlciBsZW5ndGggKi8KKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgYXZjdHgtPmJsb2NrX2FsaWduKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJ1ZiBzaXplICVkIGludmFsaWRcbiIsIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgcy0+bmV4dF9wYWNrZXRfc3RhcnQgPSBidWZfc2l6ZSAtIGF2Y3R4LT5ibG9ja19hbGlnbjsKKyAgICAgICAgYnVmX3NpemUgICAgICAgICAgICAgPSBhdmN0eC0+YmxvY2tfYWxpZ247CisgICAgICAgIHMtPmJ1Zl9iaXRfc2l6ZSAgICAgID0gYnVmX3NpemUgPDwgMzsKKworICAgICAgICAvKiBwYXJzZSBwYWNrZXQgaGVhZGVyICovCisgICAgICAgIGluaXRfZ2V0X2JpdHMoZ2IsIGJ1Ziwgcy0+YnVmX2JpdF9zaXplKTsKKyAgICAgICAgcGFja2V0X3NlcXVlbmNlX251bWJlciA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgc2tpcF9iaXRzKGdiLCAxKTsgICAvLyBTa2lwIHNlZWthYmxlX2ZyYW1lX2luX3BhY2tldCwgY3VycmVudGx5IHVudW51c2VkCisgICAgICAgIHNwbGljZWRfcGFja2V0ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKHNwbGljZWRfcGFja2V0KQorICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiQml0c3RyZWFtIHNwbGljaW5nIik7CisKKyAgICAgICAgLyogZ2V0IG51bWJlciBvZiBiaXRzIHRoYXQgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgbnVtX2JpdHNfcHJldl9mcmFtZSA9IGdldF9iaXRzKGdiLCBzLT5sb2cyX2ZyYW1lX3NpemUpOworCisgICAgICAgIC8qIGNoZWNrIGZvciBwYWNrZXQgbG9zcyAqLworICAgICAgICBpZiAoIXMtPnBhY2tldF9sb3NzICYmCisgICAgICAgICAgICAoKHMtPnBhY2tldF9zZXF1ZW5jZV9udW1iZXIgKyAxKSAmIDB4RikgIT0gcGFja2V0X3NlcXVlbmNlX251bWJlcikgeworICAgICAgICAgICAgcy0+cGFja2V0X2xvc3MgPSAxOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlBhY2tldCBsb3NzIGRldGVjdGVkISBzZXEgJSJQUkl4OCIgdnMgJXhcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+cGFja2V0X3NlcXVlbmNlX251bWJlciwgcGFja2V0X3NlcXVlbmNlX251bWJlcik7CisgICAgICAgIH0KKyAgICAgICAgcy0+cGFja2V0X3NlcXVlbmNlX251bWJlciA9IHBhY2tldF9zZXF1ZW5jZV9udW1iZXI7CisKKyAgICAgICAgaWYgKG51bV9iaXRzX3ByZXZfZnJhbWUgPiAwKSB7CisgICAgICAgICAgICBpbnQgcmVtYWluaW5nX3BhY2tldF9iaXRzID0gcy0+YnVmX2JpdF9zaXplIC0gZ2V0X2JpdHNfY291bnQoZ2IpOworICAgICAgICAgICAgaWYgKG51bV9iaXRzX3ByZXZfZnJhbWUgPj0gcmVtYWluaW5nX3BhY2tldF9iaXRzKSB7CisgICAgICAgICAgICAgICAgbnVtX2JpdHNfcHJldl9mcmFtZSA9IHJlbWFpbmluZ19wYWNrZXRfYml0czsKKyAgICAgICAgICAgICAgICBzLT5wYWNrZXRfZG9uZSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEFwcGVuZCB0aGUgcHJldmlvdXMgZnJhbWUgZGF0YSB0byB0aGUgcmVtYWluaW5nIGRhdGEgZnJvbSB0aGUKKyAgICAgICAgICAgICAqIHByZXZpb3VzIHBhY2tldCB0byBjcmVhdGUgYSBmdWxsIGZyYW1lLiAqLworICAgICAgICAgICAgc2F2ZV9iaXRzKHMsIGdiLCBudW1fYml0c19wcmV2X2ZyYW1lLCAxKTsKKworICAgICAgICAgICAgLyogZGVjb2RlIHRoZSBjcm9zcyBwYWNrZXQgZnJhbWUgaWYgaXQgaXMgdmFsaWQgKi8KKyAgICAgICAgICAgIGlmIChudW1fYml0c19wcmV2X2ZyYW1lIDwgcmVtYWluaW5nX3BhY2tldF9iaXRzICYmICFzLT5wYWNrZXRfbG9zcykKKyAgICAgICAgICAgICAgICBkZWNvZGVfZnJhbWUocyk7CisgICAgICAgIH0gZWxzZSBpZiAocy0+bnVtX3NhdmVkX2JpdHMgLSBzLT5mcmFtZV9vZmZzZXQpIHsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZjdHgsICJpZ25vcmluZyAleCBwcmV2aW91c2x5IHNhdmVkIGJpdHNcbiIsCisgICAgICAgICAgICAgICAgICAgIHMtPm51bV9zYXZlZF9iaXRzIC0gcy0+ZnJhbWVfb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5wYWNrZXRfbG9zcykgeworICAgICAgICAgICAgLyogUmVzZXQgbnVtYmVyIG9mIHNhdmVkIGJpdHMgc28gdGhhdCB0aGUgZGVjb2RlciBkb2VzIG5vdCBzdGFydAorICAgICAgICAgICAgICogdG8gZGVjb2RlIGluY29tcGxldGUgZnJhbWVzIGluIHRoZSBzLT5sZW5fcHJlZml4ID09IDAgY2FzZS4gKi8KKyAgICAgICAgICAgIHMtPm51bV9zYXZlZF9iaXRzID0gMDsKKyAgICAgICAgICAgIHMtPnBhY2tldF9sb3NzICAgID0gMDsKKyAgICAgICAgICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBzLT5mcmFtZV9kYXRhLCBNQVhfRlJBTUVTSVpFKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGZyYW1lX3NpemU7CisKKyAgICAgICAgcy0+YnVmX2JpdF9zaXplID0gKGF2cGt0LT5zaXplIC0gcy0+bmV4dF9wYWNrZXRfc3RhcnQpIDw8IDM7CisgICAgICAgIGluaXRfZ2V0X2JpdHMoZ2IsIGF2cGt0LT5kYXRhLCBzLT5idWZfYml0X3NpemUpOworICAgICAgICBza2lwX2JpdHMoZ2IsIHMtPnBhY2tldF9vZmZzZXQpOworCisgICAgICAgIGlmIChzLT5sZW5fcHJlZml4ICYmIHJlbWFpbmluZ19iaXRzKHMsIGdiKSA+IHMtPmxvZzJfZnJhbWVfc2l6ZSAmJgorICAgICAgICAgICAgKGZyYW1lX3NpemUgPSBzaG93X2JpdHMoZ2IsIHMtPmxvZzJfZnJhbWVfc2l6ZSkpICYmCisgICAgICAgICAgICBmcmFtZV9zaXplIDw9IHJlbWFpbmluZ19iaXRzKHMsIGdiKSkgeworICAgICAgICAgICAgc2F2ZV9iaXRzKHMsIGdiLCBmcmFtZV9zaXplLCAwKTsKKyAgICAgICAgICAgIHMtPnBhY2tldF9kb25lID0gIWRlY29kZV9mcmFtZShzKTsKKyAgICAgICAgfSBlbHNlIGlmICghcy0+bGVuX3ByZWZpeAorICAgICAgICAgICAgICAgICAgICYmIHMtPm51bV9zYXZlZF9iaXRzID4gZ2V0X2JpdHNfY291bnQoJnMtPmdiKSkgeworICAgICAgICAgICAgLyogd2hlbiB0aGUgZnJhbWVzIGRvIG5vdCBoYXZlIGEgbGVuZ3RoIHByZWZpeCwgd2UgZG9uJ3Qga25vdyB0aGUKKyAgICAgICAgICAgICAqIGNvbXByZXNzZWQgbGVuZ3RoIG9mIHRoZSBpbmRpdmlkdWFsIGZyYW1lcyBob3dldmVyLCB3ZSBrbm93IHdoYXQKKyAgICAgICAgICAgICAqIHBhcnQgb2YgYSBuZXcgcGFja2V0IGJlbG9uZ3MgdG8gdGhlIHByZXZpb3VzIGZyYW1lIHRoZXJlZm9yZSB3ZQorICAgICAgICAgICAgICogc2F2ZSB0aGUgaW5jb21pbmcgcGFja2V0IGZpcnN0LCB0aGVuIHdlIGFwcGVuZCB0aGUgInByZXZpb3VzCisgICAgICAgICAgICAgKiBmcmFtZSIgZGF0YSBmcm9tIHRoZSBuZXh0IHBhY2tldCBzbyB0aGF0IHdlIGdldCBhIGJ1ZmZlciB0aGF0CisgICAgICAgICAgICAgKiBvbmx5IGNvbnRhaW5zIGZ1bGwgZnJhbWVzICovCisgICAgICAgICAgICBzLT5wYWNrZXRfZG9uZSA9ICFkZWNvZGVfZnJhbWUocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5wYWNrZXRfZG9uZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+cGFja2V0X2RvbmUgJiYgIXMtPnBhY2tldF9sb3NzICYmCisgICAgICAgIHJlbWFpbmluZ19iaXRzKHMsIGdiKSA+IDApIHsKKyAgICAgICAgLyogc2F2ZSB0aGUgcmVzdCBvZiB0aGUgZGF0YSBzbyB0aGF0IGl0IGNhbiBiZSBkZWNvZGVkCisgICAgICAgICAqIHdpdGggdGhlIG5leHQgcGFja2V0ICovCisgICAgICAgIHNhdmVfYml0cyhzLCBnYiwgcmVtYWluaW5nX2JpdHMocywgZ2IpLCAwKTsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciAgID0gcy0+ZnJhbWUtPm5iX3NhbXBsZXMgPiAwOworICAgIGF2X2ZyYW1lX21vdmVfcmVmKGRhdGEsIHMtPmZyYW1lKTsKKworICAgIHMtPnBhY2tldF9vZmZzZXQgPSBnZXRfYml0c19jb3VudChnYikgJiA3OworCisgICAgcmV0dXJuIChzLT5wYWNrZXRfbG9zcykgPyBBVkVSUk9SX0lOVkFMSUREQVRBIDogZ2V0X2JpdHNfY291bnQoZ2IpID4+IDM7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBXbWFsbERlY29kZUN0eCAqcyAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcy0+cGFja2V0X2xvc3MgICAgICAgPSAxOworICAgIHMtPnBhY2tldF9kb25lICAgICAgID0gMDsKKyAgICBzLT5udW1fc2F2ZWRfYml0cyAgICA9IDA7CisgICAgcy0+ZnJhbWVfb2Zmc2V0ICAgICAgPSAwOworICAgIHMtPm5leHRfcGFja2V0X3N0YXJ0ID0gMDsKKyAgICBzLT5jZGxtc1swXVswXS5vcmRlciA9IDA7CisgICAgcy0+ZnJhbWUtPm5iX3NhbXBsZXMgPSAwOworICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBzLT5mcmFtZV9kYXRhLCBNQVhfRlJBTUVTSVpFKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgV21hbGxEZWNvZGVDdHggKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfd21hbG9zc2xlc3NfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid21hbG9zc2xlc3MiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIEF1ZGlvIExvc3NsZXNzIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dNQUxPU1NMRVNTLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihXbWFsbERlY29kZUN0eCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9wYWNrZXQsCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX1NVQkZSQU1FUyB8IENPREVDX0NBUF9EUjEgfCBDT0RFQ19DQVBfREVMQVksCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy93bWFwcm9kYXRhLmggYi9mZm1wZWcvbGliYXZjb2RlYy93bWFwcm9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4MjQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtYXByb2RhdGEuaApAQCAtMCwwICsxLDYwNCBAQAorLyoKKyAqIFdNQSA5LzMvUFJPIGNvbXBhdGlibGUgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IEJhcHRpc3RlIENvdWR1cmllciwgQmVuamFtaW4gTGFyc3NvbiwgVWxpb24KKyAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMDkgU2FzY2hhIFNvbW1lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgdGFibGVzIGZvciB3bWFwcm8gZGVjb2RpbmcKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfV01BUFJPREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfV01BUFJPREFUQV9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBAYnJpZWYgZnJlcXVlbmNpZXMgdG8gZGl2aWRlIHRoZSBmcmVxdWVuY3kgc3BlY3RydW0gaW50byBzY2FsZSBmYWN0b3IgYmFuZHMKKyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNyaXRpY2FsX2ZyZXFbXSA9IHsKKyAgICAgMTAwLCAgIDIwMCwgICAgMzAwLCAgICA0MDAsICAgIDUxMCwgICAgNjMwLCAgICA3NzAsCisgICAgIDkyMCwgIDEwODAsICAgMTI3MCwgICAxNDgwLCAgIDE3MjAsICAgMjAwMCwgICAyMzIwLAorICAgIDI3MDAsICAzMTUwLCAgIDM3MDAsICAgNDQwMCwgICA1MzAwLCAgIDY0MDAsICAgNzcwMCwKKyAgICA5NTAwLCAxMjAwMCwgIDE1NTAwLCAgMjA2NzUsICAyODU3NSwgIDQxMzc1LCAgNjM4NzUsCit9OworCisKKy8qKgorICogQG5hbWUgSHVmZm1hbiB0YWJsZXMgZm9yIERQQ00tY29kZWQgc2NhbGUgZmFjdG9ycworICogQHsKKyAqLworI2RlZmluZSBIVUZGX1NDQUxFX1NJWkUgICAgMTIxCisjZGVmaW5lIEhVRkZfU0NBTEVfTUFYQklUUyAgMTkKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzY2FsZV9odWZmY29kZXNbSFVGRl9TQ0FMRV9TSVpFXSA9IHsKKyAgICAweEU2MzksIDB4RTZDMiwgMHhFNkMxLCAweEU2QzAsIDB4RTYzRiwgMHhFNjNFLCAweEU2M0QsIDB4RTYzQywKKyAgICAweEU2M0IsIDB4RTYzQSwgMHhFNjM4LCAweEU2MzcsIDB4RTYzNiwgMHhFNjM1LCAweEU2MzQsIDB4RTYzMiwKKyAgICAweEU2MzMsIDB4RTYyMCwgMHg3MzdCLCAweEU2MTAsIDB4RTYxMSwgMHhFNjEyLCAweEU2MTMsIDB4RTYxNCwKKyAgICAweEU2MTUsIDB4RTYxNiwgMHhFNjE3LCAweEU2MTgsIDB4RTYxOSwgMHhFNjFBLCAweEU2MUIsIDB4RTYxQywKKyAgICAweEU2MUQsIDB4RTYxRSwgMHhFNjFGLCAweEU2QzMsIDB4RTYyMSwgMHhFNjIyLCAweEU2MjMsIDB4RTYyNCwKKyAgICAweEU2MjUsIDB4RTYyNiwgMHhFNjI3LCAweEU2MjgsIDB4RTYyOSwgMHhFNjJBLCAweEU2MkIsIDB4RTYyQywKKyAgICAweEU2MkQsIDB4RTYyRSwgMHhFNjJGLCAweEU2MzAsIDB4RTYzMSwgMHgxQ0RGLCAweDBFNjAsIDB4MDM5OSwKKyAgICAweDAwRTcsIDB4MDAxRCwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNiwKKyAgICAweDAwMDIsIDB4MDAwNywgMHgwMDA2LCAweDAwMEYsIDB4MDAzOCwgMHgwMDcyLCAweDAzOUEsIDB4RTZDNCwKKyAgICAweEU2QzUsIDB4RTZDNiwgMHhFNkM3LCAweEU2QzgsIDB4RTZDOSwgMHhFNkNBLCAweEU2Q0IsIDB4RTZDQywKKyAgICAweEU2Q0QsIDB4RTZDRSwgMHhFNkNGLCAweEU2RDAsIDB4RTZEMSwgMHhFNkQyLCAweEU2RDMsIDB4RTZENCwKKyAgICAweEU2RDUsIDB4RTZENiwgMHhFNkQ3LCAweEU2RDgsIDB4RTZEOSwgMHhFNkRBLCAweEU2REIsIDB4RTZEQywKKyAgICAweEU2REQsIDB4RTZERSwgMHhFNkRGLCAweEU2RTAsIDB4RTZFMSwgMHhFNkUyLCAweEU2RTMsIDB4RTZFNCwKKyAgICAweEU2RTUsIDB4RTZFNiwgMHhFNkU3LCAweEU2RTgsIDB4RTZFOSwgMHhFNkVBLCAweEU2RUIsIDB4RTZFQywKKyAgICAweEU2RUQsIDB4RTZFRSwgMHhFNkVGLCAweEU2RjAsIDB4RTZGMSwgMHhFNkYyLCAweEU2RjMsIDB4RTZGNCwKKyAgICAweEU2RjUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzY2FsZV9odWZmYml0c1tIVUZGX1NDQUxFX1NJWkVdID0geworICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOCwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTYsIDE1LCAxMywKKyAgICAxMSwgIDgsICA1LCAgMiwgIDEsICAzLCAgNSwgIDYsCisgICAgIDYsICA3LCAgNywgIDcsICA5LCAxMCwgMTMsIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LAorfTsKKy8qKiBAfSAqLworCisKKy8qKgorICogQG5hbWUgSHVmZm1hbiwgcnVuIGFuZCBsZXZlbCB0YWJsZXMgZm9yIHJ1bmxldmVsLWNvZGVkIHNjYWxlIGZhY3RvcnMKKyAqIEB7CisgKi8KKyNkZWZpbmUgSFVGRl9TQ0FMRV9STF9TSVpFICAgIDEyMAorI2RlZmluZSBIVUZGX1NDQUxFX1JMX01BWEJJVFMgIDIxCitzdGF0aWMgY29uc3QgdWludDMyX3Qgc2NhbGVfcmxfaHVmZmNvZGVzW0hVRkZfU0NBTEVfUkxfU0laRV0gPSB7CisgICAgMHgwMDAxMEMsIDB4MDAwMDAxLCAweDEwRkUyQSwgMHgwMDAwMDMsIDB4MDAwMDAzLCAweDAwMDAwMSwgMHgwMDAwMTMsCisgICAgMHgwMDAwMjAsIDB4MDAwMDI5LCAweDAwMDAxNCwgMHgwMDAwMTYsIDB4MDAwMDQ1LCAweDAwMDA0OSwgMHgwMDAwMkYsCisgICAgMHgwMDAwNDIsIDB4MDAwMDhFLCAweDAwMDA4RiwgMHgwMDAxMjksIDB4MDAwMDA5LCAweDAwMDAwRCwgMHgwMDA0QUMsCisgICAgMHgwMDAwMkMsIDB4MDAwNTYxLCAweDAwMDJFNiwgMHgwMDA4N0MsIDB4MDAwMkUyLCAweDAwMDk1QywgMHgwMDAwMTgsCisgICAgMHgwMDAwMDEsIDB4MDAwMDE2LCAweDAwMDA0NCwgMHgwMDAwMkEsIDB4MDAwMDA3LCAweDAwMDE1OSwgMHgwMDAxNDMsCisgICAgMHgwMDAxMjgsIDB4MDAwMTVBLCAweDAwMDEyRCwgMHgwMDAwMkIsIDB4MDAwMEEwLCAweDAwMDE0MiwgMHgwMDAxMkEsCisgICAgMHgwMDAyRUYsIDB4MDAwNEFGLCAweDAwMDg3RCwgMHgwMDRBRTksIDB4MDA0M0Y5LCAweDAwMDA2NywgMHgwMDAxOTksCisgICAgMHgwMDJCMDUsIDB4MDAxNTgzLCAweDAwMjFGRSwgMHgxMEZFMkMsIDB4MDAwMDA0LCAweDAwMDAyRSwgMHgwMDAxMEQsCisgICAgMHgwMDAwMEEsIDB4MDAwMjQ0LCAweDAwMDAxNywgMHgwMDAyNDUsIDB4MDAwMDExLCAweDAwMDEwRSwgMHgwMDAxMkMsCisgICAgMHgwMDAwMkEsIDB4MDAwMDJGLCAweDAwMDEyMSwgMHgwMDAwNDYsIDB4MDAwODdFLCAweDAwMDBCQSwgMHgwMDAwMzIsCisgICAgMHgwMDg3RjAsIDB4MDA1NkRDLCAweDAwMDJFQywgMHgwMDQzRkEsIDB4MDAyQjZGLCAweDAwNEFFOCwgMHgwMDAyQjcsCisgICAgMHgxMEZFMkIsIDB4MDAwMDAxLCAweDAwMDA1MSwgMHgwMDAwMTAsIDB4MDAwMkVFLCAweDAwMEI5QywgMHgwMDI1NzYsCisgICAgMHgwMDAxOTgsIDB4MDA1NkRELCAweDAwMDBDRCwgMHgwMDBBQzAsIDB4MDAwMTcwLCAweDAwNEFFRiwgMHgwMDAwMkQsCisgICAgMHgwMDA0QUQsIDB4MDAyMUZGLCAweDAwMDVDRiwgMHgwMDJCMDQsIDB4MTBGRTI5LCAweDEwRkUyOCwgMHgwMDAyRUQsCisgICAgMHgwMDJFNzQsIDB4MDIxRkM0LCAweDAwNEFFRSwgMHgwMTBGRTMsIDB4MDg3RjE3LCAweDAwMDAwMCwgMHgwMDAwOTcsCisgICAgMHgwMDAyRTMsIDB4MDAwQURBLCAweDAwMjU3NSwgMHgwMDE3M0IsIDB4MDA0M0ZCLCAweDAwMkU3NSwgMHgxMEZFMkQsCisgICAgMHgwMDE1QjYsIDB4MDAwNTZDLCAweDAwMDA1NywgMHgwMDAxMjMsIDB4MDAwMTIwLCAweDAwMDIxRSwgMHgwMDAxNzIsCisgICAgMHgwMDAyQjEsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzY2FsZV9ybF9odWZmYml0c1tIVUZGX1NDQUxFX1JMX1NJWkVdID0geworICAgICA5LCAgMiwgMjEsICAyLCAgNCwgIDUsICA1LAorICAgICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA2LAorICAgICA3LCAgOCwgIDgsICA5LCAxMCwgMTAsIDExLAorICAgIDEyLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDExLAorICAgICA0LCAgNSwgIDcsICA4LCAgOSwgIDksICA5LAorICAgICA5LCAgOSwgIDksICA4LCAgOCwgIDksICA5LAorICAgIDEyLCAxMSwgMTIsIDE1LCAxNSwgMTMsIDE1LAorICAgIDE0LCAxMywgMTQsIDIxLCAgNSwgIDYsICA5LAorICAgIDEwLCAxMCwgMTEsIDEwLCAxMSwgIDksICA5LAorICAgICA2LCAgOCwgIDksICA3LCAxMiwgMTAsIDEyLAorICAgIDE2LCAxNSwgMTIsIDE1LCAxNCwgMTUsIDEwLAorICAgIDIxLCAgNiwgIDcsIDExLCAxMiwgMTQsIDE0LAorICAgIDE1LCAxNSwgMTQsIDEyLCAxMSwgMTUsIDEyLAorICAgIDExLCAxNCwgMTMsIDE0LCAyMSwgMjEsIDEyLAorICAgIDE2LCAxOCwgMTUsIDE3LCAyMCwgIDcsICA4LAorICAgIDEyLCAxMiwgMTQsIDE1LCAxNSwgMTYsIDIxLAorICAgIDEzLCAxMSwgIDcsICA5LCAgOSwgMTAsIDExLAorICAgIDEwLAorfTsKKworCitzdGF0aWMgY29uc3QgdWludDhfdCBzY2FsZV9ybF9ydW5bSFVGRl9TQ0FMRV9STF9TSVpFXSA9IHsKKyAgICAgMCwgIDAsICAwLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwKKyAgICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAgMCwgIDEsICAyLCAgMywKKyAgICAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwKKyAgICAyMywgMjQsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKyAgICAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwKKyAgICAgMCwgIDEsICAwLCAgMSwgIDAsICAxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2NhbGVfcmxfbGV2ZWxbSFVGRl9TQ0FMRV9STF9TSVpFXSA9IHsKKyAgICAgMCwgIDAsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwKKyAgICAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywKKyAgICAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgNCwgIDQsICA0LCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgNCwgIDQsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwKKyAgICAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNywgIDcsICA4LCAgOCwgIDksICA5LAorfTsKKy8qKiBAfSAqLworCisKKy8qKgorICogQG5hbWUgSHVmZm1hbiwgcnVuIGFuZCBsZXZlbCBjb2RlcyBmb3IgcnVubGV2ZWwtY29kZWQgY29lZmZpY2llbnRzCisgKiBAeworICovCisjZGVmaW5lIEhVRkZfQ09FRjBfU0laRSAgICAyNzIKKyNkZWZpbmUgSFVGRl9DT0VGMF9NQVhCSVRTICAyMQorc3RhdGljIGNvbnN0IHVpbnQzMl90IGNvZWYwX2h1ZmZjb2Rlc1tIVUZGX0NPRUYwX1NJWkVdID0geworICAgIDB4MDAwMDRBLCAweDAwMDAyQiwgMHgwMDAwMDAsIDB4MDAwMDAzLCAweDAwMDAwNiwgMHgwMDAwMDksIDB4MDAwMDBGLAorICAgIDB4MDAwMDEwLCAweDAwMDAxNiwgMHgwMDAwMTEsIDB4MDAwMDE2LCAweDAwMDAyOCwgMHgwMDAwMkYsIDB4MDAwMDI2LAorICAgIDB4MDAwMDI5LCAweDAwMDA0NSwgMHgwMDAwNTUsIDB4MDAwMDVELCAweDAwMDA0MiwgMHgwMDAwNEUsIDB4MDAwMDUxLAorICAgIDB4MDAwMDVFLCAweDAwMDA4RCwgMHgwMDAwQTgsIDB4MDAwMEFELCAweDAwMDA4MCwgMHgwMDAwOTYsIDB4MDAwMDlGLAorICAgIDB4MDAwMEFBLCAweDAwMDBCRSwgMHgwMDAxMUMsIDB4MDAwMTUzLCAweDAwMDE1OCwgMHgwMDAxNzAsIDB4MDAwMTA0LAorICAgIDB4MDAwMTBELCAweDAwMDEwNSwgMHgwMDAxMDMsIDB4MDAwMTJGLCAweDAwMDE3NywgMHgwMDAxNzUsIDB4MDAwMTU3LAorICAgIDB4MDAwMTc0LCAweDAwMDIyNSwgMHgwMDAyM0IsIDB4MDAwMjBELCAweDAwMDIxRiwgMHgwMDAyODEsIDB4MDAwMjdCLAorICAgIDB4MDAwMjgyLCAweDAwMDJBQywgMHgwMDAyRkQsIDB4MDAwNDRGLCAweDAwMDQ3OCwgMHgwMDA0NEQsIDB4MDAwMkVDLAorICAgIDB4MDAwNDRFLCAweDAwMDU2NCwgMHgwMDA0MDksIDB4MDAwNDBCLCAweDAwMDUwMSwgMHgwMDA1NDUsIDB4MDAwNEYzLAorICAgIDB4MDAwNTQxLCAweDAwMDQzQiwgMHgwMDA0RjEsIDB4MDAwNEY0LCAweDAwMDhGRCwgMHgwMDBBOTQsIDB4MDAwODExLAorICAgIDB4MDAwQjg4LCAweDAwMEI5MSwgMHgwMDBCOTMsIDB4MDAwOEVBLCAweDAwMDg5OSwgMHgwMDBCOEEsIDB4MDAwOTcyLAorICAgIDB4MDAwOUU1LCAweDAwMEE4RiwgMHgwMDBBODQsIDB4MDAwQThFLCAweDAwMEEwMCwgMHgwMDA4MzAsIDB4MDAwOEU4LAorICAgIDB4MDAwQjk1LCAweDAwMDg3MSwgMHgwMDA4M0EsIDB4MDAwODE0LCAweDAwMDg3MywgMHgwMDBCRkUsIDB4MDAxNzI4LAorICAgIDB4MDAxNTk1LCAweDAwMTcxMiwgMHgwMDEwMkEsIDB4MDAxMDIxLCAweDAwMTcyOSwgMHgwMDE1MkUsIDB4MDAxM0MzLAorICAgIDB4MDAxNzIxLCAweDAwMTU5NywgMHgwMDE1MUIsIDB4MDAxMEYyLCAweDAwMTQwMywgMHgwMDE3MDMsIDB4MDAxNTAzLAorICAgIDB4MDAxNzA4LCAweDAwMTNDMSwgMHgwMDE3MEUsIDB4MDAxNzBDLCAweDAwMTBFMSwgMHgwMDExRUEsIDB4MDAxMDIwLAorICAgIDB4MDAxNTAwLCAweDAwMTdGQSwgMHgwMDE3MDQsIDB4MDAxNzA1LCAweDAwMTdGMCwgMHgwMDE3RkIsIDB4MDAyMUU2LAorICAgIDB4MDAyQjJELCAweDAwMjBDNiwgMHgwMDJCMjksIDB4MDAyRTRBLCAweDAwMjNBQywgMHgwMDE1MTksIDB4MDAyM0YzLAorICAgIDB4MDAyQjJDLCAweDAwMjFDMCwgMHgwMDE3RkUsIDB4MDAyM0Q3LCAweDAwMTdGOSwgMHgwMDEyRTcsIDB4MDAxM0MwLAorICAgIDB4MDAyMjYxLCAweDAwMjNEMywgMHgwMDIwNTcsIDB4MDAyMDU2LCAweDAwMjFEMiwgMHgwMDIwQzcsIDB4MDAyM0QyLAorICAgIDB4MDAyMEVDLCAweDAwNDRDMCwgMHgwMDJGRTIsIDB4MDA0NzVCLCAweDAwMkEwMywgMHgwMDJGRTMsIDB4MDAyMUUyLAorICAgIDB4MDAyMUQwLCAweDAwMkEzMSwgMHgwMDJFMTMsIDB4MDAyRTA1LCAweDAwNDdFNSwgMHgwMDAwMEUsIDB4MDAwMDI0LAorICAgIDB4MDAwMDg4LCAweDAwMDBCOSwgMHgwMDAxMEMsIDB4MDAwMjI0LCAweDAwMDJCMywgMHgwMDAyODMsIDB4MDAwMkVELAorICAgIDB4MDAwNDdCLCAweDAwMDQxRSwgMHgwMDA0M0QsIDB4MDAwNEY1LCAweDAwMDVGRCwgMHgwMDBBOTIsIDB4MDAwQjk2LAorICAgIDB4MDAwODM4LCAweDAwMDk3MSwgMHgwMDBCODMsIDB4MDAwQjgwLCAweDAwMEJGOSwgMHgwMDExRDMsIDB4MDAxMUU4LAorICAgIDB4MDAxMUQ3LCAweDAwMTUyNywgMHgwMDExRjgsIDB4MDAxMDczLCAweDAwMTBGMCwgMHgwMDEwRTQsIDB4MDAxN0Y4LAorICAgIDB4MDAxMDYyLCAweDAwMTQwMiwgMHgwMDE3RTMsIDB4MDAxNTFBLCAweDAwMTA3NywgMHgwMDE1MkIsIDB4MDAxNzBELAorICAgIDB4MDAyMUQzLCAweDAwMkU0MSwgMHgwMDEzQzIsIDB4MDAwMDI5LCAweDAwMDBBOSwgMHgwMDAyNUQsIDB4MDAwNDE5LAorICAgIDB4MDAwNTQ0LCAweDAwMEI4QiwgMHgwMDA5RTQsIDB4MDAxMUQyLCAweDAwMTUyNiwgMHgwMDE3MjQsIDB4MDAxMkU2LAorICAgIDB4MDAxNTBCLCAweDAwMTdGRiwgMHgwMDJFMjYsIDB4MDAyRTRCLCAweDAwMkIyOCwgMHgwMDIxRTMsIDB4MDAyQTE0LAorICAgIDB4MDA0NzVBLCAweDAwMkUxMiwgMHgwMDAwNTcsIDB4MDAwMjNFLCAweDAwMEE5MCwgMHgwMDBCRjAsIDB4MDAxMDcyLAorICAgIDB4MDAxNTAyLCAweDAwMjNENiwgMHgwMDIwRUQsIDB4MDAyQTMwLCAweDAwNDRDNywgMHgwMDAwOEMsIDB4MDAwNDdGLAorICAgIDB4MDAxNTJBLCAweDAwMjI2MiwgMHgwMDJFMDQsIDB4MDAwMEExLCAweDAwMDVGOSwgMHgwMDAxNzMsIDB4MDAwODc1LAorICAgIDB4MDAwMTcxLCAweDAwMTUyRCwgMHgwMDAyRTMsIDB4MDAxN0UyLCAweDAwMDJBRCwgMHgwMDIxQzEsIDB4MDAwNDc5LAorICAgIDB4MDAyMUU3LCAweDAwMDQxRiwgMHgwMDVDNEUsIDB4MDAwNTQzLCAweDAwNUM0RiwgMHgwMDBBOTEsIDB4MDA4OThELAorICAgIDB4MDAwQjk3LCAweDAwODc0NiwgMHgwMDA5NzAsIDB4MDA4NzQ1LCAweDAwMEI4NSwgMHgwMEE4NTYsIDB4MDAxNTJGLAorICAgIDB4MDEwRThFLCAweDAwMTBFNSwgMHgwMEE4NTcsIDB4MDAxNzBGLCAweDAyMUQxMSwgMHgwMDJBNTgsIDB4MDEwRThGLAorICAgIDB4MDAyRTQwLCAweDAyMUQxMywgMHgwMDJBNTksIDB4MDQzQTI1LCAweDAwMkEwMiwgMHgwNDNBMjEsIDB4MDA0NEMxLAorICAgIDB4MDg3NDQ4LCAweDAwNDdFNCwgMHgwNDNBMjAsIDB4MDA1NDJBLCAweDA4NzQ0OSwgMHgwMDg5OEMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb2VmMF9odWZmYml0c1tIVUZGX0NPRUYwX1NJWkVdID0geworICAgICA4LCAgNywgIDIsICAzLCAgMywgIDQsICA0LAorICAgICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LAorICAgICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LAorICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEyLAorICAgIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTQsIDE0LCAxMywgMTMsIDE0LAorICAgIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LAorICAgIDE0LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE0LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgIDQsICA3LAorICAgICA4LCAgOSwgMTAsIDEwLCAxMCwgMTEsIDExLAorICAgIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDE0LAorICAgIDE1LCAxNCwgMTQsICA2LCAgOSwgMTEsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LAorICAgIDE1LCAxNSwgIDcsIDEwLCAxMiwgMTMsIDE0LAorICAgIDE0LCAxNCwgMTUsIDE1LCAxNSwgIDgsIDExLAorICAgIDEzLCAxNCwgMTUsICA5LCAxMiwgIDksIDEzLAorICAgIDEwLCAxMywgMTAsIDE0LCAxMSwgMTUsIDExLAorICAgIDE1LCAxMiwgMTUsIDEyLCAxNSwgMTIsIDE2LAorICAgIDEyLCAxNywgMTMsIDE3LCAxMywgMTcsIDEzLAorICAgIDE4LCAxNCwgMTcsIDE0LCAxOSwgMTQsIDE4LAorICAgIDE0LCAxOSwgMTQsIDIwLCAxNSwgMjAsIDE1LAorICAgIDIxLCAxNSwgMjAsIDE2LCAyMSwgMTYsCit9OworCisKKyNkZWZpbmUgSFVGRl9DT0VGMV9TSVpFICAgIDI0NAorI2RlZmluZSBIVUZGX0NPRUYxX01BWEJJVFMgIDIyCitzdGF0aWMgY29uc3QgdWludDMyX3QgY29lZjFfaHVmZmNvZGVzW0hVRkZfQ09FRjFfU0laRV0gPSB7CisgICAgMHgwMDAxRTIsIDB4MDAwMDdGLCAweDAwMDAwMCwgMHgwMDAwMDIsIDB4MDAwMDA4LCAweDAwMDAwRSwgMHgwMDAwMTksCisgICAgMHgwMDAwMkYsIDB4MDAwMDM3LCAweDAwMDA2MCwgMHgwMDAwNkMsIDB4MDAwMDk1LCAweDAwMDBDNiwgMHgwMDAwRjAsCisgICAgMHgwMDAxMkUsIDB4MDAwMTg5LCAweDAwMDFBNSwgMHgwMDAxRjgsIDB4MDAwMjUzLCAweDAwMDMwQSwgMHgwMDAzNDQsCisgICAgMHgwMDAzNEQsIDB4MDAwM0YyLCAweDAwMDRCRCwgMHgwMDA1RDcsIDB4MDAwNjJBLCAweDAwMDY4QiwgMHgwMDA2OTMsCisgICAgMHgwMDA3OTcsIDB4MDAwOTdELCAweDAwMEJBQiwgMHgwMDBDNTIsIDB4MDAwQzVFLCAweDAwMEQyMSwgMHgwMDBEMjAsCisgICAgMHgwMDBGMUEsIDB4MDAwRkNFLCAweDAwMEZEMSwgMHgwMDEyRjEsIDB4MDAxNzU5LCAweDAwMThBQywgMHgwMDE4QTcsCisgICAgMHgwMDE4QkYsIDB4MDAxQTJCLCAweDAwMUU1MiwgMHgwMDFFNTAsIDB4MDAxRTMxLCAweDAwMUZCOCwgMHgwMDI1RTYsCisgICAgMHgwMDI1RTcsIDB4MDAyRUI0LCAweDAwMkVCNywgMHgwMDMxNjksIDB4MDAzMTVCLCAweDAwMzE3QywgMHgwMDMxNkMsCisgICAgMHgwMDM0Q0EsIDB4MDAzNDhELCAweDAwM0Y0MCwgMHgwMDNDQTIsIDB4MDAzRjc2LCAweDAwNEJDMywgMHgwMDRCRTUsCisgICAgMHgwMDNGNzMsIDB4MDA0QkY4LCAweDAwNEJGOSwgMHgwMDYxMzEsIDB4MDA2MjhCLCAweDAwNjI4OSwgMHgwMDYyREEsCisgICAgMHgwMDYyOEEsIDB4MDA2MkQ0LCAweDAwNjk5NywgMHgwMDYyQjQsIDB4MDA2OTE4LCAweDAwNzk0RCwgMHgwMDdFN0IsCisgICAgMHgwMDdFODcsIDB4MDA3RUVBLCAweDAwNzk0RSwgMHgwMDY5OUQsIDB4MDA3OTY3LCAweDAwNjk5RiwgMHgwMDYyREIsCisgICAgMHgwMDdFN0EsIDB4MDA3RUVCLCAweDAwQkFDMCwgMHgwMDk3QzksIDB4MDBDNTM3LCAweDAwQzVBQiwgMHgwMEQyMzMsCisgICAgMHgwMEQzMzgsIDB4MDBCQUMxLCAweDAwRDIzRCwgMHgwMTJGOTEsIDB4MDBEMzM5LCAweDAwRkRDOCwgMHgwMEQyM0MsCisgICAgMHgwMEZEREMsIDB4MDBGREM5LCAweDAwRkRERCwgMHgwMEQzM0MsIDB4MDAwMDAzLCAweDAwMDAxNiwgMHgwMDAwM0UsCisgICAgMHgwMDAwQzMsIDB4MDAwMUExLCAweDAwMDM0NywgMHgwMDA2MkUsIDB4MDAwQkFBLCAweDAwMEYyRCwgMHgwMDFBMkEsCisgICAgMHgwMDFFNTgsIDB4MDAzMDlCLCAweDAwM0NBMywgMHgwMDVENkEsIDB4MDA2MjlBLCAweDAwNjk5NiwgMHgwMDc5NEYsCisgICAgMHgwMDdFRTUsIDB4MDBCQUQ3LCAweDAwQzVBQSwgMHgwMEM1RjQsIDB4MDBGRERGLCAweDAwRkRERSwgMHgwMThBMjAsCisgICAgMHgwMThBNkQsIDB4MDFBNjdCLCAweDAxQTQ2NCwgMHgwMjVGMjEsIDB4MDFGOUUyLCAweDAxRjlFMywgMHgwMDAwMEEsCisgICAgMHgwMDAwM0QsIDB4MDAwMTI4LCAweDAwMDNDNywgMHgwMDBDMjQsIDB4MDAxOEEzLCAweDAwMkVCMSwgMHgwMDNDQjIsCisgICAgMHgwMDY5MUYsIDB4MDA3RTc5LCAweDAwMDAxMywgMHgwMDAwQkIsIDB4MDAwMzRFLCAweDAwMEQxNCwgMHgwMDI1RkQsCisgICAgMHgwMDRCRTcsIDB4MDAwMDI0LCAweDAwMDE4OCwgMHgwMDA3RUYsIDB4MDAwMDM1LCAweDAwMDMwOCwgMHgwMDEyRjIsCisgICAgMHgwMDAwNUMsIDB4MDAwM0Y2LCAweDAwMjVFMCwgMHgwMDAwNkQsIDB4MDAwNjk4LCAweDAwMDA5NiwgMHgwMDBDMjUsCisgICAgMHgwMDAwQzcsIDB4MDAwRjFCLCAweDAwMDBGMywgMHgwMDEyRkYsIDB4MDAwMTc0LCAweDAwMUE2NiwgMHgwMDAxQTAsCisgICAgMHgwMDMwOTksIDB4MDAwMUU0LCAweDAwMzE2QiwgMHgwMDAyNTIsIDB4MDAzRjMxLCAweDAwMDMwQiwgMHgwMDRCRTYsCisgICAgMHgwMDAzNDYsIDB4MDA2MkZCLCAweDAwMDM0RiwgMHgwMDc5NjYsIDB4MDAwM0Y1LCAweDAwN0U4NiwgMHgwMDA1RDQsCisgICAgMHgwMEM1MTEsIDB4MDAwNjJDLCAweDAwQzVGNSwgMHgwMDA2OTIsIDB4MDBGMjk5LCAweDAwMDc5NSwgMHgwMEYyOTgsCisgICAgMHgwMDA3RTksIDB4MDE4QTIxLCAweDAwMDk3RSwgMHgwMTc1QUQsIDB4MDAwQzI3LCAweDAxQTY3QSwgMHgwMDBDNTcsCisgICAgMHgwMkVCNTksIDB4MDAwRDIyLCAweDAzMTREOSwgMHgwMDBGMTksIDB4MDNGM0MyLCAweDAwMEZDRCwgMHgwMzQ4Q0IsCisgICAgMHgwMDEyRjgsIDB4MDRCRTQxLCAweDAwMThBMCwgMHgwM0YzQzEsIDB4MDAxOEExLCAweDA0QkU0MCwgMHgwMDE4QjcsCisgICAgMHgwNjI5QjAsIDB4MDAxQTY0LCAweDBEMjMyOSwgMHgwMDFFMzAsIDB4MDNGM0MzLCAweDAwMUY5RiwgMHgwQkFENjIsCisgICAgMHgwMDFGOTksIDB4MEZDRjAwLCAweDAwMzA5QSwgMHgwNjI5QjEsIDB4MDAyRUI2LCAweDE3NUFDMywgMHgwMDMxNEMsCisgICAgMHgwNjkxOTUsIDB4MDAzMTY4LCAweDBCQUQ2MywgMHgwMDM0OEUsIDB4MTc1QUMxLCAweDAwM0YzMCwgMHgwN0U3ODEsCisgICAgMHgwMDNGNDEsIDB4MEQyMzI4LCAweDAwM0Y0MiwgMHgxRjlFMDMsIDB4MDA0QkMyLCAweDE3NUFDMiwgMHgwMDNGNzQsCisgICAgMHgxNzVBQzAsIDB4MDA1RDYxLCAweDNGM0MwNSwgMHgwMDYxMzAsIDB4M0YzQzA0LCAweDAwNjJCNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNvZWYxX2h1ZmZiaXRzW0hVRkZfQ09FRjFfU0laRV0gPSB7CisgICAgIDksICA3LCAgMiwgIDMsICA0LCAgNCwgIDUsCisgICAgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDgsCisgICAgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsCisgICAgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTcsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsICAzLCAgNSwgIDYsCisgICAgIDgsICA5LCAxMCwgMTEsIDEyLCAxMiwgMTMsCisgICAgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsCisgICAgMTcsIDE3LCAxNywgMTgsIDE3LCAxNywgIDQsCisgICAgIDYsICA5LCAxMCwgMTIsIDEzLCAxNCwgMTQsCisgICAgMTUsIDE1LCAgNSwgIDgsIDEwLCAxMiwgMTQsCisgICAgMTUsICA2LCAgOSwgMTEsICA2LCAxMCwgMTMsCisgICAgIDcsIDEwLCAxNCwgIDcsIDExLCAgOCwgMTIsCisgICAgIDgsIDEyLCAgOCwgMTMsICA5LCAxMywgIDksCisgICAgMTQsICA5LCAxNCwgMTAsIDE0LCAxMCwgMTUsCisgICAgMTAsIDE1LCAxMCwgMTUsIDEwLCAxNSwgMTEsCisgICAgMTYsIDExLCAxNiwgMTEsIDE2LCAxMSwgMTYsCisgICAgMTEsIDE3LCAxMiwgMTcsIDEyLCAxNywgMTIsCisgICAgMTgsIDEyLCAxOCwgMTIsIDE4LCAxMiwgMTgsCisgICAgMTMsIDE5LCAxMywgMTgsIDEzLCAxOSwgMTMsCisgICAgMTksIDEzLCAyMCwgMTMsIDE4LCAxMywgMjAsCisgICAgMTMsIDIwLCAxNCwgMTksIDE0LCAyMSwgMTQsCisgICAgMTksIDE0LCAyMCwgMTQsIDIxLCAxNCwgMTksCisgICAgMTQsIDIwLCAxNCwgMjEsIDE1LCAyMSwgMTQsCisgICAgMjEsIDE1LCAyMiwgMTUsIDIyLCAxNSwKK307CisKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNvZWYwX3J1bltIVUZGX0NPRUYwX1NJWkVdID0geworICAgICAgMCwgICAwLCAgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLAorICAgICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LAorICAgICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LAorICAgICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLAorICAgICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywgIDY0LCAgNjUsICA2NiwgIDY3LAorICAgICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksICA4MCwgIDgxLAorICAgICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorICAgICA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LAorICAgIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLAorICAgIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LAorICAgIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksICAgMCwgICAxLAorICAgICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorICAgICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LAorICAgICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgICAwLCAgIDEsICAgMiwgICAzLAorICAgICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LAorICAgICAxOCwgIDE5LCAgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAgMCwgICAxLAorICAgICAgMiwgICAzLCAgIDQsICAgMCwgICAxLCAgIDAsICAgMSwgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMSwgICAwLAorICAgICAgMSwgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMSwgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMSwgICAwLAorICAgICAgMSwgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMSwgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMSwgICAwLAorICAgICAgMSwgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgY29lZjBfbGV2ZWxbSFVGRl9DT0VGMF9TSVpFXSA9IHsKKyAgICAgIDAsICAgMCwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDIsICAgMiwKKyAgICAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwKKyAgICAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwKKyAgICAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMywgICAzLCAgIDMsICAgMywKKyAgICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKKyAgICAgIDMsICAgMywgICA0LCAgIDQsICAgNCwgICA0LCAgIDQsICAgNCwgICA0LCAgIDQsICAgNCwgICA0LCAgIDUsICAgNSwKKyAgICAgIDUsICAgNSwgICA1LCAgIDYsICAgNiwgICA3LCAgIDcsICAgOCwgICA4LCAgIDksICAgOSwgIDEwLCAgMTAsICAxMSwKKyAgICAgMTEsICAxMiwgIDEyLCAgMTMsICAxMywgIDE0LCAgMTQsICAxNSwgIDE1LCAgMTYsICAxNiwgIDE3LCAgMTcsICAxOCwKKyAgICAgMTgsICAxOSwgIDE5LCAgMjAsICAyMCwgIDIxLCAgMjEsICAyMiwgIDIyLCAgMjMsICAyMywgIDI0LCAgMjQsICAyNSwKKyAgICAgMjUsICAyNiwgIDI2LCAgMjcsICAyNywgIDI4LAorfTsKKworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY29lZjFfcnVuW0hVRkZfQ09FRjFfU0laRV0gPSB7CisgICAgIDAsICAwLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLAorICAgIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsCisgICAgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwKKyAgICA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LAorICAgIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsCisgICAgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKKyAgICAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDAsICAxLAorICAgICAyLCAgMywgIDQsICA1LCAgMCwgIDEsICAyLCAgMCwgIDEsICAyLCAgMCwgIDEsICAyLCAgMCwgIDEsICAwLCAgMSwgIDAsCisgICAgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwKKyAgICAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLAorICAgICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsCisgICAgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwKKyAgICAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBjb2VmMV9sZXZlbFtIVUZGX0NPRUYxX1NJWkVdID0geworICAgICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsCisgICAgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICA0LCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLAorICAgIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksCisgICAgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LCAyOCwKKyAgICAyOCwgMjksIDI5LCAzMCwgMzAsIDMxLCAzMSwgMzIsIDMyLCAzMywgMzMsIDM0LCAzNCwgMzUsIDM1LCAzNiwgMzYsIDM3LAorICAgIDM3LCAzOCwgMzgsIDM5LCAzOSwgNDAsIDQwLCA0MSwgNDEsIDQyLCA0MiwgNDMsIDQzLCA0NCwgNDQsIDQ1LCA0NSwgNDYsCisgICAgNDYsIDQ3LCA0NywgNDgsIDQ4LCA0OSwgNDksIDUwLCA1MSwgNTIsCit9OworLyoqIEB9ICovCisKKworLyoqCisgKiBAbmFtZSBIdWZmbWFuIGFuZCB2ZWN0b3IgbG9va3VwIHRhYmxlcyBmb3IgdmVjdG9yLWNvZGVkIGNvZWZmaWNpZW50cworICogQHsKKyAqLworI2RlZmluZSBIVUZGX1ZFQzRfU0laRSAgICAxMjcKKyNkZWZpbmUgSFVGRl9WRUM0X01BWEJJVFMgIDE0CitzdGF0aWMgY29uc3QgdWludDE2X3QgdmVjNF9odWZmY29kZXNbSFVGRl9WRUM0X1NJWkVdID0geworICAgIDB4MDAxOSwgMHgwMDI3LCAweDAwRjIsIDB4MDNCQSwgMHgwOTMwLCAweDEyNjcsIDB4MDAzMSwgMHgwMDMwLAorICAgIDB4MDA5NywgMHgwMjIxLCAweDA1OEIsIDB4MDEyNCwgMHgwMEVCLCAweDAxRDQsIDB4MDNEOCwgMHgwNTg0LAorICAgIDB4MDM2NCwgMHgwNDVGLCAweDBGNjYsIDB4MDkzMSwgMHgyNENELCAweDAwMkYsIDB4MDAzOSwgMHgwMEU4LAorICAgIDB4MDJDMywgMHgwNzhBLCAweDAwMzcsIDB4MDAyOSwgMHgwMDg0LCAweDAxQjEsIDB4MDBFRCwgMHgwMDg2LAorICAgIDB4MDBGOSwgMHgwM0FCLCAweDAxRUIsIDB4MDhCQywgMHgwMTFFLCAweDAwRjMsIDB4MDIyMCwgMHgwNThBLAorICAgIDB4MDBFQywgMHgwMDhFLCAweDAxMkIsIDB4MDFFQSwgMHgwMTE5LCAweDA0QjAsIDB4MDRCMSwgMHgwM0I4LAorICAgIDB4MDY5MSwgMHgwMzY1LCAweDAxRUQsIDB4MDQ5QSwgMHgwRUE5LCAweDBFQTgsIDB4MDhCRCwgMHgyNENDLAorICAgIDB4MDAyNiwgMHgwMDM1LCAweDAwREIsIDB4MDJDNCwgMHgwN0IyLCAweDAwMzgsIDB4MDAyQiwgMHgwMDdGLAorICAgIDB4MDFCMywgMHgwMEY0LCAweDAwOTEsIDB4MDExNiwgMHgwM0JCLCAweDAyMTUsIDB4MDkzMiwgMHgwMDJELAorICAgIDB4MDAyQSwgMHgwMDhBLCAweDAxREUsIDB4MDAyOCwgMHgwMDIwLCAweDAwNUMsIDB4MDA5MCwgMHgwMDY4LAorICAgIDB4MDFFRSwgMHgwMEU5LCAweDAwOEQsIDB4MDEyQSwgMHgwMDg3LCAweDAwNUQsIDB4MDExOCwgMHgwMzQ5LAorICAgIDB4MDFFRiwgMHgwMUUzLCAweDA4QjksIDB4MDBGMCwgMHgwMEQzLCAweDAyMTQsIDB4MDQ5QiwgMHgwMERBLAorICAgIDB4MDA4OSwgMHgwMTI1LCAweDAyMTcsIDB4MDEyRCwgMHgwNjkwLCAweDAwOTQsIDB4MDA3RCwgMHgwMTFGLAorICAgIDB4MDA3RSwgMHgwMDU5LCAweDAxMjcsIDB4MDFBNSwgMHgwMTExLCAweDAwRjgsIDB4MDQ1RCwgMHgwM0I5LAorICAgIDB4MDI1OSwgMHgwNTgwLCAweDAyQzEsIDB4MDFERiwgMHgwNTg1LCAweDAyMTYsIDB4MDE2MywgMHgwMUIwLAorICAgIDB4MDNDNCwgMHgwOEI4LCAweDA3OEIsIDB4MDc1NSwgMHgwNTgxLCAweDBGNjcsIDB4MDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZlYzRfaHVmZmJpdHNbSFVGRl9WRUM0X1NJWkVdID0geworICAgICA1LCAgNiwgIDgsIDEwLCAxMiwgMTMsICA2LCAgNiwKKyAgICAgOCwgMTAsIDExLCAgOSwgIDgsICA5LCAxMCwgMTEsCisgICAgMTAsIDExLCAxMiwgMTIsIDE0LCAgNiwgIDYsICA4LAorICAgIDEwLCAxMSwgIDYsICA2LCAgOCwgIDksICA4LCAgOCwKKyAgICAgOCwgMTAsICA5LCAxMiwgIDksICA4LCAxMCwgMTEsCisgICAgIDgsICA4LCAgOSwgIDksICA5LCAxMSwgMTEsIDEwLAorICAgIDExLCAxMCwgIDksIDExLCAxMiwgMTIsIDEyLCAxNCwKKyAgICAgNiwgIDYsICA4LCAxMCwgMTEsICA2LCAgNiwgIDcsCisgICAgIDksICA4LCAgOCwgIDksIDEwLCAxMCwgMTIsICA2LAorICAgICA2LCAgOCwgIDksICA2LCAgNiwgIDcsICA4LCAgNywKKyAgICAgOSwgIDgsICA4LCAgOSwgIDgsICA3LCAgOSwgMTAsCisgICAgIDksICA5LCAxMiwgIDgsICA4LCAxMCwgMTEsICA4LAorICAgICA4LCAgOSwgMTAsICA5LCAxMSwgIDgsICA3LCAgOSwKKyAgICAgNywgIDcsICA5LCAgOSwgIDksICA4LCAxMSwgMTAsCisgICAgMTAsIDExLCAxMCwgIDksIDExLCAxMCwgIDksICA5LAorICAgIDEwLCAxMiwgMTEsIDExLCAxMSwgMTIsICAxLAorfTsKKworCisjZGVmaW5lIEhVRkZfVkVDMl9TSVpFICAgIDEzNworI2RlZmluZSBIVUZGX1ZFQzJfTUFYQklUUyAgMTIKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB2ZWMyX2h1ZmZjb2Rlc1tIVUZGX1ZFQzJfU0laRV0gPSB7CisgICAgMHgwNTUsIDB4MDFDLCAweDAxQSwgMHgwMkIsIDB4MDI4LCAweDA2NywgMHgwOEIsIDB4MDM5LAorICAgIDB4MTcwLCAweDEwRCwgMHgyQTUsIDB4MDQ3LCAweDQ2NCwgMHg2OTcsIDB4NTIzLCAweDhDQiwKKyAgICAweDAxQiwgMHgwMEUsIDB4MDAwLCAweDAxMCwgMHgwMTIsIDB4MDM2LCAweDA0OCwgMHgwNEMsCisgICAgMHgwQzIsIDB4MDlCLCAweDE3MSwgMHgwM0IsIDB4MjI0LCAweDM0QSwgMHgyRDYsIDB4MDE5LAorICAgIDB4MDBGLCAweDAwMiwgMHgwMTQsIDB4MDE3LCAweDAwNiwgMHgwNUQsIDB4MDU0LCAweDBDNywKKyAgICAweDBCNCwgMHgxOTIsIDB4MTBFLCAweDIzMywgMHgwNDMsIDB4MDJDLCAweDAwRiwgMHgwMTMsCisgICAgMHgwMDYsIDB4MDJGLCAweDAyQywgMHgwNjgsIDB4MDc3LCAweDBERiwgMHgxMTEsIDB4MUE0LAorICAgIDB4MTZBLCAweDJBNCwgMHgwMjcsIDB4MDExLCAweDAxOCwgMHgwMkQsIDB4MDBGLCAweDA0QSwKKyAgICAweDA0MCwgMHgwOTcsIDB4MDFGLCAweDExQiwgMHgwMjIsIDB4MTZELCAweDA2NiwgMHgwMzUsCisgICAgMHgwMDUsIDB4MDJCLCAweDA0OSwgMHgwMDksIDB4MDc1LCAweDBDQiwgMHgwQUEsIDB4MTg3LAorICAgIDB4MTA2LCAweDA4QSwgMHgwNDcsIDB4MDYwLCAweDA2RSwgMHgwMUQsIDB4MDc0LCAweDBDNCwKKyAgICAweDAxRSwgMHgxMTgsIDB4MUE3LCAweDAzOCwgMHgwNDIsIDB4MDUzLCAweDA3NiwgMHgwQTgsCisgICAgMHgwQ0EsIDB4MDgyLCAweDExMCwgMHgxOEQsIDB4MTJELCAweDBCOSwgMHgwQzgsIDB4MERFLAorICAgIDB4MDFDLCAweDBBQiwgMHgxMTMsIDB4MThDLCAweDEwRiwgMHgwOUEsIDB4MEE1LCAweDBCNywKKyAgICAweDExQSwgMHgxODYsIDB4MUE2LCAweDI1OSwgMHgxNTMsIDB4MThBLCAweDE5MywgMHgwMjAsCisgICAgMHgxMEMsIDB4MDQ2LCAweDAzQSwgMHgxMDcsIDB4MTQ5LCAweDE2QywgMHgyRDcsIDB4MjI1LAorICAgIDB4MjU4LCAweDMxNiwgMHg2OTYsIDB4MzE3LCAweDA0MiwgMHg1MjIsIDB4MjkwLCAweDhDQSwKKyAgICAweDAwMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHZlYzJfaHVmZmJpdHNbSFVGRl9WRUMyX1NJWkVdID0geworICAgICA3LCAgNiwgIDYsICA2LCAgNywgIDcsICA4LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsCisgICAgIDYsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA4LAorICAgICA4LCAgOSwgIDksIDEwLCAxMCwgMTAsIDExLCAgNiwKKyAgICAgNCwgIDUsICA1LCAgNiwgIDcsICA3LCAgOCwgIDgsCisgICAgIDksICA5LCAxMCwgMTAsIDExLCAgNiwgIDUsICA1LAorICAgICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwKKyAgICAxMCwgMTAsICA3LCAgNiwgIDYsICA2LCAgNywgIDcsCisgICAgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgIDcsICA2LAorICAgICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwKKyAgICAxMCwgIDgsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsCisgICAgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwKKyAgICAgOSwgIDksICA5LCAgOSwgMTAsICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgMTAsICA5LCAgOSwgIDksIDEwLAorICAgIDEwLCAxMSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMCwKKyAgICAxMCwgMTAsIDExLCAxMCwgMTEsIDEyLCAxMSwgMTIsCisgICAgIDMsCit9OworCisKKyNkZWZpbmUgSFVGRl9WRUMxX1NJWkUgICAgMTAxCisjZGVmaW5lIEhVRkZfVkVDMV9NQVhCSVRTICAxMQorc3RhdGljIGNvbnN0IHVpbnQxNl90IHZlYzFfaHVmZmNvZGVzW0hVRkZfVkVDMV9TSVpFXSA9IHsKKyAgICAweDAxQSwgMHgwMDMsIDB4MDE3LCAweDAxMCwgMHgwMEMsIDB4MDA5LCAweDAwNSwgMHgwMDAsCisgICAgMHgwMEQsIDB4MDBBLCAweDAwOSwgMHgwMEMsIDB4MDBGLCAweDAwMiwgMHgwMDQsIDB4MDA3LAorICAgIDB4MDBCLCAweDAwRiwgMHgwMUMsIDB4MDA2LCAweDAxMCwgMHgwMTUsIDB4MDFDLCAweDAyMiwKKyAgICAweDAzQiwgMHgwMEUsIDB4MDE5LCAweDAyMywgMHgwMzQsIDB4MDM2LCAweDAzQSwgMHgwNDcsCisgICAgMHgwMDgsIDB4MDBBLCAweDAxRSwgMHgwMzEsIDB4MDM3LCAweDA1MCwgMHgwNTMsIDB4MDZCLAorICAgIDB4MDZGLCAweDA4QywgMHgwRTgsIDB4MEVBLCAweDBFQiwgMHgwMTYsIDB4MDNFLCAweDAzRiwKKyAgICAweDA2QywgMHgwODksIDB4MDhBLCAweDBBMywgMHgwQTQsIDB4MEQ0LCAweDBERCwgMHgwRUMsCisgICAgMHgwRUUsIDB4MTFBLCAweDFEMiwgMHgwMjQsIDB4MDI1LCAweDAyRSwgMHgwMjcsIDB4MEMyLAorICAgIDB4MEMwLCAweDBEQSwgMHgwREIsIDB4MTExLCAweDE0NCwgMHgxMTYsIDB4MTRBLCAweDE0NSwKKyAgICAweDFCOCwgMHgxQUIsIDB4MURBLCAweDFERSwgMHgxREIsIDB4MURGLCAweDIzNiwgMHgyMzcsCisgICAgMHgzQTYsIDB4M0E3LCAweDA0RCwgMHgwNEMsIDB4MDVFLCAweDA1RiwgMHgxODMsIDB4MTgyLAorICAgIDB4MTg2LCAweDIyMSwgMHgxODcsIDB4MjIwLCAweDIyRSwgMHgyMkYsIDB4Mjk2LCAweDM1NCwKKyAgICAweDI5NywgMHgzNTUsIDB4MzcyLCAweDM3MywgMHgwMTYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB2ZWMxX2h1ZmZiaXRzW0hVRkZfVkVDMV9TSVpFXSA9IHsKKyAgICAgNywgIDYsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsCisgICAgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LAorICAgICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgIDUsCit9OworCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzeW1ib2xfdG9fdmVjNFtIVUZGX1ZFQzRfU0laRV0gPSB7CisgICAgICAgIDAsICAgIDEsICAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksCisgICAgICAgMjAsICAgMzIsICAgICAzMywgICAgMzQsICAgIDM1LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA2NCwgICAgNjUsCisgICAgICAgODAsICAgMjU2LCAgIDI1NywgICAyNTgsICAgMjU5LCAgIDI2MCwgICAyNzIsICAgMjczLCAgIDI3NCwgICAyNzUsCisgICAgICAyODgsICAgMjg5LCAgIDI5MCwgICAzMDQsICAgMzA1LCAgIDMyMCwgICA1MTIsICAgNTEzLCAgIDUxNCwgICA1MTUsCisgICAgICA1MjgsICAgNTI5LCAgIDUzMCwgICA1NDQsICAgNTQ1LCAgIDU2MCwgICA3NjgsICAgNzY5LCAgIDc3MCwgICA3ODQsCisgICAgICA3ODUsICAgODAwLCAgMTAyNCwgIDEwMjUsICAxMDQwLCAgMTI4MCwgIDQwOTYsICA0MDk3LCAgNDA5OCwgIDQwOTksCisgICAgIDQxMDAsICA0MTEyLCAgNDExMywgIDQxMTQsICA0MTE1LCAgNDEyOCwgIDQxMjksICA0MTMwLCAgNDE0NCwgIDQxNDUsCisgICAgIDQxNjAsICA0MzUyLCAgNDM1MywgIDQzNTQsICA0MzU1LCAgNDM2OCwgIDQzNjksICA0MzcwLCAgNDM4NCwgIDQzODUsCisgICAgIDQ0MDAsICA0NjA4LCAgNDYwOSwgIDQ2MTAsICA0NjI0LCAgNDYyNSwgIDQ2NDAsICA0ODY0LCAgNDg2NSwgIDQ4ODAsCisgICAgIDUxMjAsICA4MTkyLCAgODE5MywgIDgxOTQsICA4MTk1LCAgODIwOCwgIDgyMDksICA4MjEwLCAgODIyNCwgIDgyMjUsCisgICAgIDgyNDAsICA4NDQ4LCAgODQ0OSwgIDg0NTAsICA4NDY0LCAgODQ2NSwgIDg0ODAsICA4NzA0LCAgODcwNSwgIDg3MjAsCisgICAgIDg5NjAsIDEyMjg4LCAxMjI4OSwgMTIyOTAsIDEyMzA0LCAxMjMwNSwgMTIzMjAsIDEyNTQ0LCAxMjU0NSwgMTI1NjAsCisgICAgMTI4MDAsIDE2Mzg0LCAxNjM4NSwgMTY0MDAsIDE2NjQwLCAyMDQ4MCwgICAgIDAsCit9OworCisKK3N0YXRpYyBjb25zdCB1aW50OF90IHN5bWJvbF90b192ZWMyW0hVRkZfVkVDMl9TSVpFXSA9IHsKKyAgICAgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LAorICAgICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksCisgICAgIDMwLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwKKyAgICAgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2NCwgIDY1LAorICAgICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDgwLCAgODEsICA4MiwgIDgzLCAgODQsCisgICAgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwKKyAgICAxMDUsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLAorICAgIDEzMywgMTM0LCAxMzUsIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsCisgICAgMTY1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTkyLCAxOTMsIDE5NCwgMTk1LCAyMDgsIDIwOSwgMjEwLCAyMjQsIDIyNSwKKyAgICAyNDAsICAgMCwKK307CisvKiogQH0gKi8KKworCisvKioKKyAqIEBicmllZiBkZWNvcnJlbGF0aW9uIG1hdHJpeCBmb3IgbXVsdGljaGFubmVsIHN0cmVhbXMKKyAqKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBkZWZhdWx0X2RlY29ycmVsYXRpb25fbWF0cmljZXNbXSA9IHsKKyAgICAxLjAwMDAwMCwgIDAuNzA3MDMxLCAtMC43MDcwMzEsICAwLjcwNzAzMSwgIDAuNzA3MDMxLCAgMC41NzgxMjUsICAwLjcwNzAzMSwKKyAgICAwLjQxMDE1NiwgIDAuNTc4MTI1LCAtMC43MDcwMzEsICAwLjQxMDE1NiwgIDAuNTc4MTI1LCAgMC4wMDAwMDAsIC0wLjgxNjQwNiwKKyAgICAwLjUwMDAwMCwgIDAuNjUyMzQ0LCAgMC41MDAwMDAsICAwLjI2OTUzMSwgIDAuNTAwMDAwLCAgMC4yNjk1MzEsIC0wLjUwMDAwMCwKKyAgIC0wLjY1MjM0NCwgIDAuNTAwMDAwLCAtMC4yNjk1MzEsIC0wLjUwMDAwMCwgIDAuNjUyMzQ0LCAgMC41MDAwMDAsIC0wLjY1MjM0NCwKKyAgICAwLjUwMDAwMCwgLTAuMjY5NTMxLCAgMC40NDUzMTIsICAwLjYwMTU2MiwgIDAuNTExNzE5LCAgMC4zNzEwOTQsICAwLjE5NTMxMiwKKyAgICAwLjQ0NTMxMiwgIDAuMzcxMDk0LCAtMC4xOTUzMTIsIC0wLjYwMTU2MiwgLTAuNTExNzE5LCAgMC40NDUzMTIsICAwLjAwMDAwMCwKKyAgIC0wLjYzMjgxMiwgIDAuMDAwMDAwLCAgMC42MzI4MTIsICAwLjQ0NTMxMiwgLTAuMzcxMDk0LCAtMC4xOTUzMTIsICAwLjYwMTU2MiwKKyAgIC0wLjUxMTcxOSwgIDAuNDQ1MzEyLCAtMC42MDE1NjIsICAwLjUxMTcxOSwgLTAuMzcxMDk0LCAgMC4xOTUzMTIsICAwLjQxMDE1NiwKKyAgICAwLjU1ODU5NCwgIDAuNTAwMDAwLCAgMC40MTAxNTYsICAwLjI4OTA2MiwgIDAuMTQ4NDM4LCAgMC40MTAxNTYsICAwLjQxMDE1NiwKKyAgICAwLjAwMDAwMCwgLTAuNDEwMTU2LCAtMC41NzgxMjUsIC0wLjQxMDE1NiwgIDAuNDEwMTU2LCAgMC4xNDg0MzgsIC0wLjUwMDAwMCwKKyAgIC0wLjQxMDE1NiwgIDAuMjg5MDYyLCAgMC41NTg1OTQsICAwLjQxMDE1NiwgLTAuMTQ4NDM4LCAtMC41MDAwMDAsICAwLjQxMDE1NiwKKyAgICAwLjI4OTA2MiwgLTAuNTU4NTk0LCAgMC40MTAxNTYsIC0wLjQxMDE1NiwgIDAuMDAwMDAwLCAgMC40MTAxNTYsIC0wLjU3ODEyNSwKKyAgICAwLjQxMDE1NiwgIDAuNDEwMTU2LCAtMC41NTg1OTQsICAwLjUwMDAwMCwgLTAuNDEwMTU2LCAgMC4yODkwNjIsIC0wLjE0ODQzOCwKK307CisKKy8qKgorICogQGJyaWVmIGRlZmF1bHQgZGVjb3JyZWxhdGlvbiBtYXRyaXggb2Zmc2V0cworICovCitzdGF0aWMgY29uc3QgZmxvYXQgKiBjb25zdCBkZWZhdWx0X2RlY29ycmVsYXRpb25bXSA9IHsKKyAgICBOVUxMLAorICAgICZkZWZhdWx0X2RlY29ycmVsYXRpb25fbWF0cmljZXNbMF0sCisgICAgJmRlZmF1bHRfZGVjb3JyZWxhdGlvbl9tYXRyaWNlc1sxXSwKKyAgICAmZGVmYXVsdF9kZWNvcnJlbGF0aW9uX21hdHJpY2VzWzVdLAorICAgICZkZWZhdWx0X2RlY29ycmVsYXRpb25fbWF0cmljZXNbMTRdLAorICAgICZkZWZhdWx0X2RlY29ycmVsYXRpb25fbWF0cmljZXNbMzBdLAorICAgICZkZWZhdWx0X2RlY29ycmVsYXRpb25fbWF0cmljZXNbNTVdCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19XTUFQUk9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dtYXByb2RlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvd21hcHJvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3YWQwZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtYXByb2RlYy5jCkBAIC0wLDAgKzEsMTY3MyBAQAorLyoKKyAqIFdtYXBybyBjb21wYXRpYmxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCYXB0aXN0ZSBDb3VkdXJpZXIsIEJlbmphbWluIExhcnNzb24sIFVsaW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDExIFNhc2NoYSBTb21tZXIsIEJlbmphbWluIExhcnNzb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIHdtYXBybyBkZWNvZGVyIGltcGxlbWVudGF0aW9uCisgKiBXbWFwcm8gaXMgYW4gTURDVCBiYXNlZCBjb2RlYyBjb21wYXJhYmxlIHRvIHdtYSBzdGFuZGFyZCBvciBBQUMuCisgKiBUaGUgZGVjb2RpbmcgdGhlcmVmb3JlIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgKiAtIGJpdHN0cmVhbSBkZWNvZGluZworICogLSByZWNvbnN0cnVjdGlvbiBvZiBwZXItY2hhbm5lbCBkYXRhCisgKiAtIHJlc2NhbGluZyBhbmQgaW52ZXJzZSBxdWFudGl6YXRpb24KKyAqIC0gSU1EQ1QKKyAqIC0gd2luZG93aW5nIGFuZCBvdmVybGFwcC1hZGQKKyAqCisgKiBUaGUgY29tcHJlc3NlZCB3bWFwcm8gYml0c3RyZWFtIGlzIHNwbGl0IGludG8gaW5kaXZpZHVhbCBwYWNrZXRzLgorICogRXZlcnkgc3VjaCBwYWNrZXQgY29udGFpbnMgb25lIG9yIG1vcmUgd21hIGZyYW1lcy4KKyAqIFRoZSBjb21wcmVzc2VkIGZyYW1lcyBtYXkgaGF2ZSBhIHZhcmlhYmxlIGxlbmd0aCBhbmQgZnJhbWVzIG1heQorICogY3Jvc3MgcGFja2V0IGJvdW5kYXJpZXMuCisgKiBDb21tb24gdG8gYWxsIHdtYXBybyBmcmFtZXMgaXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgYXJlIHN0b3JlZCBpbgorICogYSBmcmFtZS4KKyAqIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgYSBmZXcgb3RoZXIgZGVjb2RlIGZsYWdzIGFyZSBzdG9yZWQKKyAqIGFzIGV4dHJhZGF0YSB0aGF0IGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIGRlY29kZXIuCisgKgorICogVGhlIHdtYXBybyBmcmFtZXMgdGhlbXNlbHZlcyBhcmUgYWdhaW4gc3BsaXQgaW50byBhIHZhcmlhYmxlIG51bWJlciBvZgorICogc3ViZnJhbWVzLiBFdmVyeSBzdWJmcmFtZSBjb250YWlucyB0aGUgZGF0YSBmb3IgMl5OIHRpbWUgZG9tYWluIHNhbXBsZXMKKyAqIHdoZXJlIE4gdmFyaWVzIGJldHdlZW4gNyBhbmQgMTIuCisgKgorICogRXhhbXBsZSB3bWFwcm8gYml0c3RyZWFtIChpbiBzYW1wbGVzKToKKyAqCisgKiB8fCAgIHBhY2tldCAwICAgICAgICAgICB8fCBwYWNrZXQgMSB8fCBwYWNrZXQgMiAgICAgIHBhY2tldHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfHwgZnJhbWUgMCAgICAgIHx8IGZyYW1lIDEgICAgICAgfHwgZnJhbWUgMiAgICB8fCAgICBmcmFtZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfHwgICB8ICAgICAgfCAgIHx8ICAgfCAgIHwgICB8ICAgfHwgICAgICAgICAgICB8fCAgICBzdWJmcmFtZXMgb2YgY2hhbm5lbCAwCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHx8ICAgICAgfCAgIHwgICB8fCAgIHwgICB8ICAgfCAgIHx8ICAgICAgICAgICAgfHwgICAgc3ViZnJhbWVzIG9mIGNoYW5uZWwgMQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhlIGZyYW1lIGxheW91dHMgZm9yIHRoZSBpbmRpdmlkdWFsIGNoYW5uZWxzIG9mIGEgd21hIGZyYW1lIGRvZXMgbm90IG5lZWQKKyAqIHRvIGJlIHRoZSBzYW1lLgorICoKKyAqIEhvd2V2ZXIsIGlmIHRoZSBvZmZzZXRzIGFuZCBsZW5ndGhzIG9mIHNldmVyYWwgc3ViZnJhbWVzIG9mIGEgZnJhbWUgYXJlIHRoZQorICogc2FtZSwgdGhlIHN1YmZyYW1lcyBvZiB0aGUgY2hhbm5lbHMgY2FuIGJlIGdyb3VwZWQuCisgKiBFdmVyeSBncm91cCBtYXkgdGhlbiB1c2Ugc3BlY2lhbCBjb2RpbmcgdGVjaG5pcXVlcyBsaWtlIE0vUyBzdGVyZW8gY29kaW5nCisgKiB0byBpbXByb3ZlIHRoZSBjb21wcmVzc2lvbiByYXRpby4gVGhlc2UgY2hhbm5lbCB0cmFuc2Zvcm1hdGlvbnMgZG8gbm90CisgKiBuZWVkIHRvIGJlIGFwcGxpZWQgdG8gYSB3aG9sZSBzdWJmcmFtZS4gSW5zdGVhZCwgdGhleSBjYW4gYWxzbyB3b3JrIG9uCisgKiBpbmRpdmlkdWFsIHNjYWxlIGZhY3RvciBiYW5kcyAoc2VlIGJlbG93KS4KKyAqIFRoZSBjb2VmZmljaWVudHMgdGhhdCBjYXJyeSB0aGUgYXVkaW8gc2lnbmFsIGluIHRoZSBmcmVxdWVuY3kgZG9tYWluCisgKiBhcmUgdHJhbnNtaXR0ZWQgYXMgaHVmZm1hbi1jb2RlZCB2ZWN0b3JzIHdpdGggNCwgMiBhbmQgMSBlbGVtZW50cy4KKyAqIEluIGFkZGl0aW9uIHRvIHRoYXQsIHRoZSBlbmNvZGVyIGNhbiBzd2l0Y2ggdG8gYSBydW5sZXZlbCBjb2Rpbmcgc2NoZW1lCisgKiBieSB0cmFuc21pdHRpbmcgc3ViZnJhbWVfbGVuZ3RoIC8gMTI4IHplcm8gY29lZmZpY2llbnRzLgorICoKKyAqIEJlZm9yZSB0aGUgYXVkaW8gc2lnbmFsIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIHRpbWUgZG9tYWluLCB0aGUKKyAqIGNvZWZmaWNpZW50cyBoYXZlIHRvIGJlIHJlc2NhbGVkIGFuZCBpbnZlcnNlIHF1YW50aXplZC4KKyAqIEEgc3ViZnJhbWUgaXMgdGhlcmVmb3JlIHNwbGl0IGludG8gc2V2ZXJhbCBzY2FsZSBmYWN0b3IgYmFuZHMgdGhhdCBnZXQKKyAqIHNjYWxlZCBpbmRpdmlkdWFsbHkuCisgKiBTY2FsZSBmYWN0b3JzIGFyZSBzdWJtaXR0ZWQgZm9yIGV2ZXJ5IGZyYW1lIGJ1dCB0aGV5IG1pZ2h0IGJlIHNoYXJlZAorICogYmV0d2VlbiB0aGUgc3ViZnJhbWVzIG9mIGEgY2hhbm5lbC4gU2NhbGUgZmFjdG9ycyBhcmUgaW5pdGlhbGx5IERQQ00tY29kZWQuCisgKiBPbmNlIHNjYWxlIGZhY3RvcnMgYXJlIHNoYXJlZCwgdGhlIGRpZmZlcmVuY2VzIGFyZSB0cmFuc21pdHRlZCBhcyBydW5sZXZlbAorICogY29kZXMuCisgKiBFdmVyeSBzdWJmcmFtZSBsZW5ndGggYW5kIG9mZnNldCBjb21iaW5hdGlvbiBpbiB0aGUgZnJhbWUgbGF5b3V0IHNoYXJlcyBhCisgKiBjb21tb24gcXVhbnRpemF0aW9uIGZhY3RvciB0aGF0IGNhbiBiZSBhZGp1c3RlZCBmb3IgZXZlcnkgY2hhbm5lbCBieSBhCisgKiBtb2RpZmllci4KKyAqIEFmdGVyIHRoZSBpbnZlcnNlIHF1YW50aXphdGlvbiwgdGhlIGNvZWZmaWNpZW50cyBnZXQgcHJvY2Vzc2VkIGJ5IGFuIElNRENULgorICogVGhlIHJlc3VsdGluZyB2YWx1ZXMgYXJlIHRoZW4gd2luZG93ZWQgd2l0aCBhIHNpbmUgd2luZG93IGFuZCB0aGUgZmlyc3QgaGFsZgorICogb2YgdGhlIHZhbHVlcyBhcmUgYWRkZWQgdG8gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBvdXRwdXQgZnJvbSB0aGUgcHJldmlvdXMKKyAqIHN1YmZyYW1lIGluIG9yZGVyIHRvIHJlY29uc3RydWN0IHRoZSBvdXRwdXQgc2FtcGxlcy4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgIndtYXByb2RhdGEuaCIKKyNpbmNsdWRlICJzaW5ld2luLmgiCisjaW5jbHVkZSAid21hLmgiCisjaW5jbHVkZSAid21hX2NvbW1vbi5oIgorCisvKiogY3VycmVudCBkZWNvZGVyIGxpbWl0YXRpb25zICovCisjZGVmaW5lIFdNQVBST19NQVhfQ0hBTk5FTFMgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXggbnVtYmVyIG9mIGhhbmRsZWQgY2hhbm5lbHMKKyNkZWZpbmUgTUFYX1NVQkZSQU1FUyAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG1heCBudW1iZXIgb2Ygc3ViZnJhbWVzIHBlciBjaGFubmVsCisjZGVmaW5lIE1BWF9CQU5EUyAgICAgIDI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXggbnVtYmVyIG9mIHNjYWxlIGZhY3RvciBiYW5kcworI2RlZmluZSBNQVhfRlJBTUVTSVpFICAzMjc2OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbWF4aW11bSBjb21wcmVzc2VkIGZyYW1lIHNpemUKKworI2RlZmluZSBXTUFQUk9fQkxPQ0tfTUlOX0JJVFMgIDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsb2cyIG9mIG1pbiBibG9jayBzaXplCisjZGVmaW5lIFdNQVBST19CTE9DS19NQVhfQklUUyAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGxvZzIgb2YgbWF4IGJsb2NrIHNpemUKKyNkZWZpbmUgV01BUFJPX0JMT0NLX01JTl9TSVpFICgxIDw8IFdNQVBST19CTE9DS19NSU5fQklUUykgICAgICAgICAgICAgICAgIC8vLzwgbWluaW11bSBibG9jayBzaXplCisjZGVmaW5lIFdNQVBST19CTE9DS19NQVhfU0laRSAoMSA8PCBXTUFQUk9fQkxPQ0tfTUFYX0JJVFMpICAgICAgICAgICAgICAgICAvLy88IG1heGltdW0gYmxvY2sgc2l6ZQorI2RlZmluZSBXTUFQUk9fQkxPQ0tfU0laRVMgICAgKFdNQVBST19CTE9DS19NQVhfQklUUyAtIFdNQVBST19CTE9DS19NSU5fQklUUyArIDEpIC8vLzwgcG9zc2libGUgYmxvY2sgc2l6ZXMKKworCisjZGVmaW5lIFZMQ0JJVFMgICAgICAgICAgICA5CisjZGVmaW5lIFNDQUxFVkxDQklUUyAgICAgICA4CisjZGVmaW5lIFZFQzRNQVhERVBUSCAgICAoKEhVRkZfVkVDNF9NQVhCSVRTK1ZMQ0JJVFMtMSkvVkxDQklUUykKKyNkZWZpbmUgVkVDMk1BWERFUFRIICAgICgoSFVGRl9WRUMyX01BWEJJVFMrVkxDQklUUy0xKS9WTENCSVRTKQorI2RlZmluZSBWRUMxTUFYREVQVEggICAgKChIVUZGX1ZFQzFfTUFYQklUUytWTENCSVRTLTEpL1ZMQ0JJVFMpCisjZGVmaW5lIFNDQUxFTUFYREVQVEggICAoKEhVRkZfU0NBTEVfTUFYQklUUytTQ0FMRVZMQ0JJVFMtMSkvU0NBTEVWTENCSVRTKQorI2RlZmluZSBTQ0FMRVJMTUFYREVQVEggKChIVUZGX1NDQUxFX1JMX01BWEJJVFMrVkxDQklUUy0xKS9WTENCSVRTKQorCitzdGF0aWMgVkxDICAgICAgICAgICAgICBzZl92bGM7ICAgICAgICAgICAvLy88IHNjYWxlIGZhY3RvciBEUENNIHZsYworc3RhdGljIFZMQyAgICAgICAgICAgICAgc2ZfcmxfdmxjOyAgICAgICAgLy8vPCBzY2FsZSBmYWN0b3IgcnVuIGxlbmd0aCB2bGMKK3N0YXRpYyBWTEMgICAgICAgICAgICAgIHZlYzRfdmxjOyAgICAgICAgIC8vLzwgNCBjb2VmZmljaWVudHMgcGVyIHN5bWJvbAorc3RhdGljIFZMQyAgICAgICAgICAgICAgdmVjMl92bGM7ICAgICAgICAgLy8vPCAyIGNvZWZmaWNpZW50cyBwZXIgc3ltYm9sCitzdGF0aWMgVkxDICAgICAgICAgICAgICB2ZWMxX3ZsYzsgICAgICAgICAvLy88IDEgY29lZmZpY2llbnQgcGVyIHN5bWJvbAorc3RhdGljIFZMQyAgICAgICAgICAgICAgY29lZl92bGNbMl07ICAgICAgLy8vPCBjb2VmZmljaWVudCBydW4gbGVuZ3RoIHZsYyBjb2Rlcworc3RhdGljIGZsb2F0ICAgICAgICAgICAgc2luNjRbMzNdOyAgICAgICAgLy8vPCBzaW5lIHRhYmxlIGZvciBkZWNvcnJlbGF0aW9uCisKKy8qKgorICogQGJyaWVmIGZyYW1lIHNwZWNpZmljIGRlY29kZXIgY29udGV4dCBmb3IgYSBzaW5nbGUgY2hhbm5lbAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MTZfdCAgcHJldl9ibG9ja19sZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGxlbmd0aCBvZiB0aGUgcHJldmlvdXMgYmxvY2sKKyAgICB1aW50OF90ICB0cmFuc21pdF9jb2VmczsKKyAgICB1aW50OF90ICBudW1fc3ViZnJhbWVzOworICAgIHVpbnQxNl90IHN1YmZyYW1lX2xlbltNQVhfU1VCRlJBTUVTXTsgICAgICAgICAgICAgLy8vPCBzdWJmcmFtZSBsZW5ndGggaW4gc2FtcGxlcworICAgIHVpbnQxNl90IHN1YmZyYW1lX29mZnNldFtNQVhfU1VCRlJBTUVTXTsgICAgICAgICAgLy8vPCBzdWJmcmFtZSBwb3NpdGlvbnMgaW4gdGhlIGN1cnJlbnQgZnJhbWUKKyAgICB1aW50OF90ICBjdXJfc3ViZnJhbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY3VycmVudCBzdWJmcmFtZSBudW1iZXIKKyAgICB1aW50MTZfdCBkZWNvZGVkX3NhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGFscmVhZHkgcHJvY2Vzc2VkIHNhbXBsZXMKKyAgICB1aW50OF90ICBncm91cGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2hhbm5lbCBpcyBwYXJ0IG9mIGEgZ3JvdXAKKyAgICBpbnQgICAgICBxdWFudF9zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcXVhbnRpemF0aW9uIHN0ZXAgZm9yIHRoZSBjdXJyZW50IHN1YmZyYW1lCisgICAgaW50OF90ICAgcmV1c2Vfc2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHNoYXJlIHNjYWxlIGZhY3RvcnMgYmV0d2VlbiBzdWJmcmFtZXMKKyAgICBpbnQ4X3QgICBzY2FsZV9mYWN0b3Jfc3RlcDsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc2NhbGluZyBzdGVwIGZvciB0aGUgY3VycmVudCBzdWJmcmFtZQorICAgIGludCAgICAgIG1heF9zY2FsZV9mYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXhpbXVtIHNjYWxlIGZhY3RvciBmb3IgdGhlIGN1cnJlbnQgc3ViZnJhbWUKKyAgICBpbnQgICAgICBzYXZlZF9zY2FsZV9mYWN0b3JzWzJdW01BWF9CQU5EU107ICAgICAgIC8vLzwgcmVzYW1wbGVkIGFuZCAocHJldmlvdXNseSkgdHJhbnNtaXR0ZWQgc2NhbGUgZmFjdG9yIHZhbHVlcworICAgIGludDhfdCAgIHNjYWxlX2ZhY3Rvcl9pZHg7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbmRleCBmb3IgdGhlIHRyYW5zbWl0dGVkIHNjYWxlIGZhY3RvciB2YWx1ZXMgKHVzZWQgZm9yIHJlc2FtcGxpbmcpCisgICAgaW50KiAgICAgc2NhbGVfZmFjdG9yczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHBvaW50ZXIgdG8gdGhlIHNjYWxlIGZhY3RvciB2YWx1ZXMgdXNlZCBmb3IgZGVjb2RpbmcKKyAgICB1aW50OF90ICB0YWJsZV9pZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5kZXggaW4gc2Zfb2Zmc2V0cyBmb3IgdGhlIHNjYWxlIGZhY3RvciByZWZlcmVuY2UgYmxvY2sKKyAgICBmbG9hdCogICBjb2VmZnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcG9pbnRlciB0byB0aGUgc3ViZnJhbWUgZGVjb2RlIGJ1ZmZlcgorICAgIHVpbnQxNl90IG51bV92ZWNfY29lZmZzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgdmVjdG9yIGNvZGVkIGNvZWZmaWNpZW50cworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIG91dClbV01BUFJPX0JMT0NLX01BWF9TSVpFICsgV01BUFJPX0JMT0NLX01BWF9TSVpFIC8gMl07IC8vLzwgb3V0cHV0IGJ1ZmZlcgorfSBXTUFQcm9DaGFubmVsQ3R4OworCisvKioKKyAqIEBicmllZiBjaGFubmVsIGdyb3VwIGZvciBjaGFubmVsIHRyYW5zZm9ybWF0aW9ucworICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBudW1fY2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBncm91cAorICAgIGludDhfdCAgdHJhbnNmb3JtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHRyYW5zZm9ybSBvbiAvIG9mZgorICAgIGludDhfdCAgdHJhbnNmb3JtX2JhbmRbTUFYX0JBTkRTXTsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNvbnRyb2xzIGlmIHRoZSB0cmFuc2Zvcm0gaXMgZW5hYmxlZCBmb3IgYSBjZXJ0YWluIGJhbmQKKyAgICBmbG9hdCAgIGRlY29ycmVsYXRpb25fbWF0cml4W1dNQVBST19NQVhfQ0hBTk5FTFMqV01BUFJPX01BWF9DSEFOTkVMU107CisgICAgZmxvYXQqICBjaGFubmVsX2RhdGFbV01BUFJPX01BWF9DSEFOTkVMU107ICAgICAgICAgICAgICAgIC8vLzwgdHJhbnNmb3JtYXRpb24gY29lZmZpY2llbnRzCit9IFdNQVByb0NoYW5uZWxHcnA7CisKKy8qKgorICogQGJyaWVmIG1haW4gZGVjb2RlciBjb250ZXh0CisgKi8KK3R5cGVkZWYgc3RydWN0IFdNQVByb0RlY29kZUN0eCB7CisgICAgLyogZ2VuZXJpYyBkZWNvZGVyIHZhcmlhYmxlcyAqLworICAgIEFWQ29kZWNDb250ZXh0KiAgYXZjdHg7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY29kZWMgY29udGV4dCBmb3IgYXZfbG9nCisgICAgQVZGbG9hdERTUENvbnRleHQgKmZkc3A7CisgICAgdWludDhfdCAgICAgICAgICBmcmFtZV9kYXRhW01BWF9GUkFNRVNJWkUgKworICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkVdOy8vLzwgY29tcHJlc3NlZCBmcmFtZSBkYXRhCisgICAgUHV0Qml0Q29udGV4dCAgICBwYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjb250ZXh0IGZvciBmaWxsaW5nIHRoZSBmcmFtZV9kYXRhIGJ1ZmZlcgorICAgIEZGVENvbnRleHQgICAgICAgbWRjdF9jdHhbV01BUFJPX0JMT0NLX1NJWkVTXTsgIC8vLzwgTURDVCBjb250ZXh0IHBlciBibG9jayBzaXplCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgdG1wKVtXTUFQUk9fQkxPQ0tfTUFYX1NJWkVdOyAvLy88IElNRENUIG91dHB1dCBidWZmZXIKKyAgICBjb25zdCBmbG9hdCogICAgIHdpbmRvd3NbV01BUFJPX0JMT0NLX1NJWkVTXTsgICAvLy88IHdpbmRvd3MgZm9yIHRoZSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMKKworICAgIC8qIGZyYW1lIHNpemUgZGVwZW5kZW50IGZyYW1lIGluZm9ybWF0aW9uIChzZXQgZHVyaW5nIGluaXRpYWxpemF0aW9uKSAqLworICAgIHVpbnQzMl90ICAgICAgICAgZGVjb2RlX2ZsYWdzOyAgICAgICAgICAgICAgICAgIC8vLzwgdXNlZCBjb21wcmVzc2lvbiBmZWF0dXJlcworICAgIHVpbnQ4X3QgICAgICAgICAgbGVuX3ByZWZpeDsgICAgICAgICAgICAgICAgICAgIC8vLzwgZnJhbWUgaXMgcHJlZml4ZWQgd2l0aCBpdHMgbGVuZ3RoCisgICAgdWludDhfdCAgICAgICAgICBkeW5hbWljX3JhbmdlX2NvbXByZXNzaW9uOyAgICAgLy8vPCBmcmFtZSBjb250YWlucyBEUkMgZGF0YQorICAgIHVpbnQ4X3QgICAgICAgICAgYml0c19wZXJfc2FtcGxlOyAgICAgICAgICAgICAgIC8vLzwgaW50ZWdlciBhdWRpbyBzYW1wbGUgc2l6ZSBmb3IgdGhlIHVuc2NhbGVkIElNRENUIG91dHB1dCAodXNlZCB0byBzY2FsZSB0byBbLTEuMCwgMS4wXSkKKyAgICB1aW50MTZfdCAgICAgICAgIHNhbXBsZXNfcGVyX2ZyYW1lOyAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBzYW1wbGVzIHRvIG91dHB1dAorICAgIHVpbnQxNl90ICAgICAgICAgbG9nMl9mcmFtZV9zaXplOworICAgIGludDhfdCAgICAgICAgICAgbGZlX2NoYW5uZWw7ICAgICAgICAgICAgICAgICAgIC8vLzwgbGZlIGNoYW5uZWwgaW5kZXgKKyAgICB1aW50OF90ICAgICAgICAgIG1heF9udW1fc3ViZnJhbWVzOworICAgIHVpbnQ4X3QgICAgICAgICAgc3ViZnJhbWVfbGVuX2JpdHM7ICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgdGhlIHN1YmZyYW1lIGxlbmd0aAorICAgIHVpbnQ4X3QgICAgICAgICAgbWF4X3N1YmZyYW1lX2xlbl9iaXQ7ICAgICAgICAgIC8vLzwgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHN1YmZyYW1lIGlzIG9mIG1heGltdW0gc2l6ZSB3aGVuIHRoZSBmaXJzdCBzdWJmcmFtZSBsZW5ndGggYml0IGlzIDEKKyAgICB1aW50MTZfdCAgICAgICAgIG1pbl9zYW1wbGVzX3Blcl9zdWJmcmFtZTsKKyAgICBpbnQ4X3QgICAgICAgICAgIG51bV9zZmJbV01BUFJPX0JMT0NLX1NJWkVTXTsgICAvLy88IHNjYWxlIGZhY3RvciBiYW5kcyBwZXIgYmxvY2sgc2l6ZQorICAgIGludDE2X3QgICAgICAgICAgc2ZiX29mZnNldHNbV01BUFJPX0JMT0NLX1NJWkVTXVtNQVhfQkFORFNdOyAgICAgICAgICAgICAgICAgICAgLy8vPCBzY2FsZSBmYWN0b3IgYmFuZCBvZmZzZXRzIChtdWx0aXBsZXMgb2YgNCkKKyAgICBpbnQ4X3QgICAgICAgICAgIHNmX29mZnNldHNbV01BUFJPX0JMT0NLX1NJWkVTXVtXTUFQUk9fQkxPQ0tfU0laRVNdW01BWF9CQU5EU107IC8vLzwgc2NhbGUgZmFjdG9yIHJlc2FtcGxlIG1hdHJpeAorICAgIGludDE2X3QgICAgICAgICAgc3Vid29vZmVyX2N1dG9mZnNbV01BUFJPX0JMT0NLX1NJWkVTXTsgLy8vPCBzdWJ3b29mZXIgY3V0b2ZmIHZhbHVlcworCisgICAgLyogcGFja2V0IGRlY29kZSBzdGF0ZSAqLworICAgIEdldEJpdENvbnRleHQgICAgcGdiOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYml0c3RyZWFtIHJlYWRlciBjb250ZXh0IGZvciB0aGUgcGFja2V0CisgICAgaW50ICAgICAgICAgICAgICBuZXh0X3BhY2tldF9zdGFydDsgICAgICAgICAgICAgLy8vPCBzdGFydCBvZmZzZXQgb2YgdGhlIG5leHQgd21hIHBhY2tldCBpbiB0aGUgZGVtdXhlciBwYWNrZXQKKyAgICB1aW50OF90ICAgICAgICAgIHBhY2tldF9vZmZzZXQ7ICAgICAgICAgICAgICAgICAvLy88IGZyYW1lIG9mZnNldCBpbiB0aGUgcGFja2V0CisgICAgdWludDhfdCAgICAgICAgICBwYWNrZXRfc2VxdWVuY2VfbnVtYmVyOyAgICAgICAgLy8vPCBjdXJyZW50IHBhY2tldCBudW1iZXIKKyAgICBpbnQgICAgICAgICAgICAgIG51bV9zYXZlZF9iaXRzOyAgICAgICAgICAgICAgICAvLy88IHNhdmVkIG51bWJlciBvZiBiaXRzCisgICAgaW50ICAgICAgICAgICAgICBmcmFtZV9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgLy8vPCBmcmFtZSBvZmZzZXQgaW4gdGhlIGJpdCByZXNlcnZvaXIKKyAgICBpbnQgICAgICAgICAgICAgIHN1YmZyYW1lX29mZnNldDsgICAgICAgICAgICAgICAvLy88IHN1YmZyYW1lIG9mZnNldCBpbiB0aGUgYml0IHJlc2Vydm9pcgorICAgIHVpbnQ4X3QgICAgICAgICAgcGFja2V0X2xvc3M7ICAgICAgICAgICAgICAgICAgIC8vLzwgc2V0IGluIGNhc2Ugb2YgYml0c3RyZWFtIGVycm9yCisgICAgdWludDhfdCAgICAgICAgICBwYWNrZXRfZG9uZTsgICAgICAgICAgICAgICAgICAgLy8vPCBzZXQgd2hlbiBhIHBhY2tldCBpcyBmdWxseSBkZWNvZGVkCisKKyAgICAvKiBmcmFtZSBkZWNvZGUgc3RhdGUgKi8KKyAgICB1aW50MzJfdCAgICAgICAgIGZyYW1lX251bTsgICAgICAgICAgICAgICAgICAgICAvLy88IGN1cnJlbnQgZnJhbWUgbnVtYmVyIChub3QgdXNlZCBmb3IgZGVjb2RpbmcpCisgICAgR2V0Qml0Q29udGV4dCAgICBnYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBiaXRzdHJlYW0gcmVhZGVyIGNvbnRleHQKKyAgICBpbnQgICAgICAgICAgICAgIGJ1Zl9iaXRfc2l6ZTsgICAgICAgICAgICAgICAgICAvLy88IGJ1ZmZlciBzaXplIGluIGJpdHMKKyAgICB1aW50OF90ICAgICAgICAgIGRyY19nYWluOyAgICAgICAgICAgICAgICAgICAgICAvLy88IGdhaW4gZm9yIHRoZSBEUkMgdG9vbAorICAgIGludDhfdCAgICAgICAgICAgc2tpcF9mcmFtZTsgICAgICAgICAgICAgICAgICAgIC8vLzwgc2tpcCBvdXRwdXQgc3RlcAorICAgIGludDhfdCAgICAgICAgICAgcGFyc2VkX2FsbF9zdWJmcmFtZXM7ICAgICAgICAgIC8vLzwgYWxsIHN1YmZyYW1lcyBkZWNvZGVkPworCisgICAgLyogc3ViZnJhbWUvYmxvY2sgZGVjb2RlIHN0YXRlICovCisgICAgaW50MTZfdCAgICAgICAgICBzdWJmcmFtZV9sZW47ICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IHN1YmZyYW1lIGxlbmd0aAorICAgIGludDhfdCAgICAgICAgICAgY2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZTsgICAgIC8vLzwgbnVtYmVyIG9mIGNoYW5uZWxzIHRoYXQgY29udGFpbiB0aGUgc3ViZnJhbWUKKyAgICBpbnQ4X3QgICAgICAgICAgIGNoYW5uZWxfaW5kZXhlc19mb3JfY3VyX3N1YmZyYW1lW1dNQVBST19NQVhfQ0hBTk5FTFNdOworICAgIGludDhfdCAgICAgICAgICAgbnVtX2JhbmRzOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHNjYWxlIGZhY3RvciBiYW5kcworICAgIGludDhfdCAgICAgICAgICAgdHJhbnNtaXRfbnVtX3ZlY19jb2VmZnM7ICAgICAgIC8vLzwgbnVtYmVyIG9mIHZlY3RvciBjb2RlZCBjb2VmZmljaWVudHMgaXMgcGFydCBvZiB0aGUgYml0c3RyZWFtCisgICAgaW50MTZfdCogICAgICAgICBjdXJfc2ZiX29mZnNldHM7ICAgICAgICAgICAgICAgLy8vPCBzZmIgb2Zmc2V0cyBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKyAgICB1aW50OF90ICAgICAgICAgIHRhYmxlX2lkeDsgICAgICAgICAgICAgICAgICAgICAvLy88IGluZGV4IGZvciB0aGUgbnVtX3NmYiwgc2ZiX29mZnNldHMsIHNmX29mZnNldHMgYW5kIHN1Yndvb2Zlcl9jdXRvZmZzIHRhYmxlcworICAgIGludDhfdCAgICAgICAgICAgZXNjX2xlbjsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbGVuZ3RoIG9mIGVzY2FwZWQgY29lZmZpY2llbnRzCisKKyAgICB1aW50OF90ICAgICAgICAgIG51bV9jaGdyb3VwczsgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBjaGFubmVsIGdyb3VwcworICAgIFdNQVByb0NoYW5uZWxHcnAgY2hncm91cFtXTUFQUk9fTUFYX0NIQU5ORUxTXTsgIC8vLzwgY2hhbm5lbCBncm91cCBpbmZvcm1hdGlvbgorCisgICAgV01BUHJvQ2hhbm5lbEN0eCBjaGFubmVsW1dNQVBST19NQVhfQ0hBTk5FTFNdOyAgLy8vPCBwZXIgY2hhbm5lbCBkYXRhCit9IFdNQVByb0RlY29kZUN0eDsKKworCisvKioKKyAqQGJyaWVmIGhlbHBlciBmdW5jdGlvbiB0byBwcmludCB0aGUgbW9zdCBpbXBvcnRhbnQgbWVtYmVycyBvZiB0aGUgY29udGV4dAorICpAcGFyYW0gcyBjb250ZXh0CisgKi8KK3N0YXRpYyBhdl9jb2xkIHZvaWQgZHVtcF9jb250ZXh0KFdNQVByb0RlY29kZUN0eCAqcykKK3sKKyNkZWZpbmUgUFJJTlQoYSwgYikgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiICVzID0gJWRcbiIsIGEsIGIpOworI2RlZmluZSBQUklOVF9IRVgoYSwgYikgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICIgJXMgPSAlIlBSSXgzMiJcbiIsIGEsIGIpOworCisgICAgUFJJTlQoImVkIHNhbXBsZSBiaXQgZGVwdGgiLCBzLT5iaXRzX3Blcl9zYW1wbGUpOworICAgIFBSSU5UX0hFWCgiZWQgZGVjb2RlIGZsYWdzIiwgcy0+ZGVjb2RlX2ZsYWdzKTsKKyAgICBQUklOVCgic2FtcGxlcyBwZXIgZnJhbWUiLCAgIHMtPnNhbXBsZXNfcGVyX2ZyYW1lKTsKKyAgICBQUklOVCgibG9nMiBmcmFtZSBzaXplIiwgICAgIHMtPmxvZzJfZnJhbWVfc2l6ZSk7CisgICAgUFJJTlQoIm1heCBudW0gc3ViZnJhbWVzIiwgICBzLT5tYXhfbnVtX3N1YmZyYW1lcyk7CisgICAgUFJJTlQoImxlbiBwcmVmaXgiLCAgICAgICAgICBzLT5sZW5fcHJlZml4KTsKKyAgICBQUklOVCgibnVtIGNoYW5uZWxzIiwgICAgICAgIHMtPmF2Y3R4LT5jaGFubmVscyk7Cit9CisKKy8qKgorICpAYnJpZWYgVW5pbml0aWFsaXplIHRoZSBkZWNvZGVyIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMuCisgKkBwYXJhbSBhdmN0eCBjb2RlYyBjb250ZXh0CisgKkByZXR1cm4gMCBvbiBzdWNjZXNzLCA8IDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBXTUFQcm9EZWNvZGVDdHggKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgYXZfZnJlZXAoJnMtPmZkc3ApOworCisgICAgZm9yIChpID0gMDsgaSA8IFdNQVBST19CTE9DS19TSVpFUzsgaSsrKQorICAgICAgICBmZl9tZGN0X2VuZCgmcy0+bWRjdF9jdHhbaV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICpAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgZGVjb2Rlci4KKyAqQHBhcmFtIGF2Y3R4IGNvZGVjIGNvbnRleHQKKyAqQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZQorICovCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFdNQVByb0RlY29kZUN0eCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqZWRhdGFfcHRyID0gYXZjdHgtPmV4dHJhZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbF9tYXNrOworICAgIGludCBpLCBiaXRzOworICAgIGludCBsb2cyX21heF9udW1fc3ViZnJhbWVzOworICAgIGludCBudW1fcG9zc2libGVfYmxvY2tfc2l6ZXM7CisKKyAgICBpZiAoIWF2Y3R4LT5ibG9ja19hbGlnbikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJsb2NrX2FsaWduIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisgICAgcy0+ZmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCk7CisgICAgaWYgKCFzLT5mZHNwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaW5pdF9wdXRfYml0cygmcy0+cGIsIHMtPmZyYW1lX2RhdGEsIE1BWF9GUkFNRVNJWkUpOworCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX0ZMVFA7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDE4KSB7CisgICAgICAgIHMtPmRlY29kZV9mbGFncyAgICA9IEFWX1JMMTYoZWRhdGFfcHRyKzE0KTsKKyAgICAgICAgY2hhbm5lbF9tYXNrICAgICAgID0gQVZfUkwzMihlZGF0YV9wdHIrMik7CisgICAgICAgIHMtPmJpdHNfcGVyX3NhbXBsZSA9IEFWX1JMMTYoZWRhdGFfcHRyKTsKKyAgICAgICAgLyoqIGR1bXAgdGhlIGV4dHJhZGF0YSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmV4dHJhZGF0YV9zaXplOyBpKyspCisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiWyV4XSAiLCBhdmN0eC0+ZXh0cmFkYXRhW2ldKTsKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgIlxuIik7CisKKyAgICB9IGVsc2UgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJVbmtub3duIGV4dHJhZGF0YSBzaXplIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvKiogZ2VuZXJpYyBpbml0ICovCisgICAgcy0+bG9nMl9mcmFtZV9zaXplID0gYXZfbG9nMihhdmN0eC0+YmxvY2tfYWxpZ24pICsgNDsKKyAgICBpZiAocy0+bG9nMl9mcmFtZV9zaXplID4gMjUpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiTGFyZ2UgYmxvY2sgYWxpZ24iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIC8qKiBmcmFtZSBpbmZvICovCisgICAgcy0+c2tpcF9mcmFtZSAgPSAxOyAvKiBza2lwIGZpcnN0IGZyYW1lICovCisgICAgcy0+cGFja2V0X2xvc3MgPSAxOworICAgIHMtPmxlbl9wcmVmaXggID0gKHMtPmRlY29kZV9mbGFncyAmIDB4NDApOworCisgICAgLyoqIGdldCBmcmFtZSBsZW4gKi8KKyAgICBiaXRzID0gZmZfd21hX2dldF9mcmFtZV9sZW5fYml0cyhhdmN0eC0+c2FtcGxlX3JhdGUsIDMsIHMtPmRlY29kZV9mbGFncyk7CisgICAgaWYgKGJpdHMgPiBXTUFQUk9fQkxPQ0tfTUFYX0JJVFMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiMTQtYml0IGJsb2NrIHNpemVzIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgcy0+c2FtcGxlc19wZXJfZnJhbWUgPSAxIDw8IGJpdHM7CisKKyAgICAvKiogc3ViZnJhbWUgaW5mbyAqLworICAgIGxvZzJfbWF4X251bV9zdWJmcmFtZXMgICAgICAgPSAoKHMtPmRlY29kZV9mbGFncyAmIDB4MzgpID4+IDMpOworICAgIHMtPm1heF9udW1fc3ViZnJhbWVzICAgICAgICAgPSAxIDw8IGxvZzJfbWF4X251bV9zdWJmcmFtZXM7CisgICAgaWYgKHMtPm1heF9udW1fc3ViZnJhbWVzID09IDE2IHx8IHMtPm1heF9udW1fc3ViZnJhbWVzID09IDQpCisgICAgICAgIHMtPm1heF9zdWJmcmFtZV9sZW5fYml0ID0gMTsKKyAgICBzLT5zdWJmcmFtZV9sZW5fYml0cyA9IGF2X2xvZzIobG9nMl9tYXhfbnVtX3N1YmZyYW1lcykgKyAxOworCisgICAgbnVtX3Bvc3NpYmxlX2Jsb2NrX3NpemVzICAgICA9IGxvZzJfbWF4X251bV9zdWJmcmFtZXMgKyAxOworICAgIHMtPm1pbl9zYW1wbGVzX3Blcl9zdWJmcmFtZSAgPSBzLT5zYW1wbGVzX3Blcl9mcmFtZSAvIHMtPm1heF9udW1fc3ViZnJhbWVzOworICAgIHMtPmR5bmFtaWNfcmFuZ2VfY29tcHJlc3Npb24gPSAocy0+ZGVjb2RlX2ZsYWdzICYgMHg4MCk7CisKKyAgICBpZiAocy0+bWF4X251bV9zdWJmcmFtZXMgPiBNQVhfU1VCRlJBTUVTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBudW1iZXIgb2Ygc3ViZnJhbWVzICUiUFJJZDgiXG4iLAorICAgICAgICAgICAgICAgcy0+bWF4X251bV9zdWJmcmFtZXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAocy0+bWluX3NhbXBsZXNfcGVyX3N1YmZyYW1lIDwgV01BUFJPX0JMT0NLX01JTl9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibWluX3NhbXBsZXNfcGVyX3N1YmZyYW1lIG9mICVkIHRvbyBzbWFsbFxuIiwKKyAgICAgICAgICAgICAgIHMtPm1pbl9zYW1wbGVzX3Blcl9zdWJmcmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzLT5hdmN0eC0+c2FtcGxlX3JhdGUgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc2FtcGxlIHJhdGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzICVkXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiBXTUFQUk9fTUFYX0NIQU5ORUxTKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb3JlIHRoYW4gJWQgY2hhbm5lbHMiLCBXTUFQUk9fTUFYX0NIQU5ORUxTKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIC8qKiBpbml0IHByZXZpb3VzIGJsb2NrIGxlbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykKKyAgICAgICAgcy0+Y2hhbm5lbFtpXS5wcmV2X2Jsb2NrX2xlbiA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lOworCisgICAgLyoqIGV4dHJhY3QgbGZlIGNoYW5uZWwgcG9zaXRpb24gKi8KKyAgICBzLT5sZmVfY2hhbm5lbCA9IC0xOworCisgICAgaWYgKGNoYW5uZWxfbWFzayAmIDgpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IG1hc2s7CisgICAgICAgIGZvciAobWFzayA9IDE7IG1hc2sgPCAxNjsgbWFzayA8PD0gMSkgeworICAgICAgICAgICAgaWYgKGNoYW5uZWxfbWFzayAmIG1hc2spCisgICAgICAgICAgICAgICAgKytzLT5sZmVfY2hhbm5lbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIElOSVRfVkxDX1NUQVRJQygmc2ZfdmxjLCBTQ0FMRVZMQ0JJVFMsIEhVRkZfU0NBTEVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgc2NhbGVfaHVmZmJpdHMsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgIHNjYWxlX2h1ZmZjb2RlcywgMiwgMiwgNjE2KTsKKworICAgIElOSVRfVkxDX1NUQVRJQygmc2ZfcmxfdmxjLCBWTENCSVRTLCBIVUZGX1NDQUxFX1JMX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIHNjYWxlX3JsX2h1ZmZiaXRzLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICBzY2FsZV9ybF9odWZmY29kZXMsIDQsIDQsIDE0MDYpOworCisgICAgSU5JVF9WTENfU1RBVElDKCZjb2VmX3ZsY1swXSwgVkxDQklUUywgSFVGRl9DT0VGMF9TSVpFLAorICAgICAgICAgICAgICAgICAgICBjb2VmMF9odWZmYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgY29lZjBfaHVmZmNvZGVzLCA0LCA0LCAyMTA4KTsKKworICAgIElOSVRfVkxDX1NUQVRJQygmY29lZl92bGNbMV0sIFZMQ0JJVFMsIEhVRkZfQ09FRjFfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgY29lZjFfaHVmZmJpdHMsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgIGNvZWYxX2h1ZmZjb2RlcywgNCwgNCwgMzkxMik7CisKKyAgICBJTklUX1ZMQ19TVEFUSUMoJnZlYzRfdmxjLCBWTENCSVRTLCBIVUZGX1ZFQzRfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgdmVjNF9odWZmYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgdmVjNF9odWZmY29kZXMsIDIsIDIsIDYwNCk7CisKKyAgICBJTklUX1ZMQ19TVEFUSUMoJnZlYzJfdmxjLCBWTENCSVRTLCBIVUZGX1ZFQzJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgdmVjMl9odWZmYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgdmVjMl9odWZmY29kZXMsIDIsIDIsIDU2Mik7CisKKyAgICBJTklUX1ZMQ19TVEFUSUMoJnZlYzFfdmxjLCBWTENCSVRTLCBIVUZGX1ZFQzFfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgdmVjMV9odWZmYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgdmVjMV9odWZmY29kZXMsIDIsIDIsIDU2Mik7CisKKyAgICAvKiogY2FsY3VsYXRlIG51bWJlciBvZiBzY2FsZSBmYWN0b3IgYmFuZHMgYW5kIHRoZWlyIG9mZnNldHMKKyAgICAgICAgZm9yIGV2ZXJ5IHBvc3NpYmxlIGJsb2NrIHNpemUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Bvc3NpYmxlX2Jsb2NrX3NpemVzOyBpKyspIHsKKyAgICAgICAgaW50IHN1YmZyYW1lX2xlbiA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lID4+IGk7CisgICAgICAgIGludCB4OworICAgICAgICBpbnQgYmFuZCA9IDE7CisKKyAgICAgICAgcy0+c2ZiX29mZnNldHNbaV1bMF0gPSAwOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBNQVhfQkFORFMtMSAmJiBzLT5zZmJfb2Zmc2V0c1tpXVtiYW5kIC0gMV0gPCBzdWJmcmFtZV9sZW47IHgrKykgeworICAgICAgICAgICAgaW50IG9mZnNldCA9IChzdWJmcmFtZV9sZW4gKiAyICogY3JpdGljYWxfZnJlcVt4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyBzLT5hdmN0eC0+c2FtcGxlX3JhdGUgKyAyOworICAgICAgICAgICAgb2Zmc2V0ICY9IH4zOworICAgICAgICAgICAgaWYgKG9mZnNldCA+IHMtPnNmYl9vZmZzZXRzW2ldW2JhbmQgLSAxXSkKKyAgICAgICAgICAgICAgICBzLT5zZmJfb2Zmc2V0c1tpXVtiYW5kKytdID0gb2Zmc2V0OworCisgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHN1YmZyYW1lX2xlbikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLT5zZmJfb2Zmc2V0c1tpXVtiYW5kIC0gMV0gPSBzdWJmcmFtZV9sZW47CisgICAgICAgIHMtPm51bV9zZmJbaV0gICAgICAgICAgICAgICA9IGJhbmQgLSAxOworICAgICAgICBpZiAocy0+bnVtX3NmYltpXSA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm51bV9zZmIgaW52YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqIFNjYWxlIGZhY3RvcnMgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGJsb2NrcyBvZiBkaWZmZXJlbnQgc2l6ZQorICAgICAgICBhcyBldmVyeSBibG9jayBoYXMgYSBkaWZmZXJlbnQgc2NhbGUgZmFjdG9yIGJhbmQgbGF5b3V0LgorICAgICAgICBUaGUgbWF0cml4IHNmX29mZnNldHMgaXMgbmVlZGVkIHRvIGZpbmQgdGhlIGNvcnJlY3Qgc2NhbGUgZmFjdG9yLgorICAgICAqLworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9wb3NzaWJsZV9ibG9ja19zaXplczsgaSsrKSB7CisgICAgICAgIGludCBiOworICAgICAgICBmb3IgKGIgPSAwOyBiIDwgcy0+bnVtX3NmYltpXTsgYisrKSB7CisgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAoKHMtPnNmYl9vZmZzZXRzW2ldW2JdCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHMtPnNmYl9vZmZzZXRzW2ldW2IgKyAxXSAtIDEpIDw8IGkpID4+IDE7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbnVtX3Bvc3NpYmxlX2Jsb2NrX3NpemVzOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHMtPnNmYl9vZmZzZXRzW3hdW3YgKyAxXSA8PCB4IDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIHYrKzsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCh2IDwgTUFYX0JBTkRTKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+c2Zfb2Zmc2V0c1tpXVt4XVtiXSA9IHY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogaW5pdCBNRENULCBGSVhNRTogb25seSBpbml0IG5lZWRlZCBzaXplcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBXTUFQUk9fQkxPQ0tfU0laRVM7IGkrKykKKyAgICAgICAgZmZfbWRjdF9pbml0KCZzLT5tZGN0X2N0eFtpXSwgV01BUFJPX0JMT0NLX01JTl9CSVRTKzEraSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIDEuMCAvICgxIDw8IChXTUFQUk9fQkxPQ0tfTUlOX0JJVFMgKyBpIC0gMSkpCisgICAgICAgICAgICAgICAgICAgICAvICgxIDw8IChzLT5iaXRzX3Blcl9zYW1wbGUgLSAxKSkpOworCisgICAgLyoqIGluaXQgTURDVCB3aW5kb3dzOiBzaW1wbGUgc2luZSB3aW5kb3cgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgV01BUFJPX0JMT0NLX1NJWkVTOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IHdpbl9pZHggPSBXTUFQUk9fQkxPQ0tfTUFYX0JJVFMgLSBpOworICAgICAgICBmZl9pbml0X2ZmX3NpbmVfd2luZG93cyh3aW5faWR4KTsKKyAgICAgICAgcy0+d2luZG93c1tXTUFQUk9fQkxPQ0tfU0laRVMgLSBpIC0gMV0gPSBmZl9zaW5lX3dpbmRvd3Nbd2luX2lkeF07CisgICAgfQorCisgICAgLyoqIGNhbGN1bGF0ZSBzdWJ3b29mZXIgY3V0b2ZmIHZhbHVlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcG9zc2libGVfYmxvY2tfc2l6ZXM7IGkrKykgeworICAgICAgICBpbnQgYmxvY2tfc2l6ZSA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lID4+IGk7CisgICAgICAgIGludCBjdXRvZmYgPSAoNDQwKmJsb2NrX3NpemUgKyAzICogKHMtPmF2Y3R4LT5zYW1wbGVfcmF0ZSA+PiAxKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAvIHMtPmF2Y3R4LT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgcy0+c3Vid29vZmVyX2N1dG9mZnNbaV0gPSBhdl9jbGlwKGN1dG9mZiwgNCwgYmxvY2tfc2l6ZSk7CisgICAgfQorCisgICAgLyoqIGNhbGN1bGF0ZSBzaW5lIHZhbHVlcyBmb3IgdGhlIGRlY29ycmVsYXRpb24gbWF0cml4ICovCisgICAgZm9yIChpID0gMDsgaSA8IDMzOyBpKyspCisgICAgICAgIHNpbjY0W2ldID0gc2luKGkqTV9QSSAvIDY0LjApOworCisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX0JJVFNUUkVBTSkKKyAgICAgICAgZHVtcF9jb250ZXh0KHMpOworCisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gY2hhbm5lbF9tYXNrOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICpAYnJpZWYgRGVjb2RlIHRoZSBzdWJmcmFtZSBsZW5ndGguCisgKkBwYXJhbSBzIGNvbnRleHQKKyAqQHBhcmFtIG9mZnNldCBzYW1wbGUgb2Zmc2V0IGluIHRoZSBmcmFtZQorICpAcmV0dXJuIGRlY29kZWQgc3ViZnJhbWUgbGVuZ3RoIG9uIHN1Y2Nlc3MsIDwgMCBpbiBjYXNlIG9mIGFuIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3N1YmZyYW1lX2xlbmd0aChXTUFQcm9EZWNvZGVDdHggKnMsIGludCBvZmZzZXQpCit7CisgICAgaW50IGZyYW1lX2xlbl9zaGlmdCA9IDA7CisgICAgaW50IHN1YmZyYW1lX2xlbjsKKworICAgIC8qKiBubyBuZWVkIHRvIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtIHdoZW4gb25seSBvbmUgbGVuZ3RoIGlzIHBvc3NpYmxlICovCisgICAgaWYgKG9mZnNldCA9PSBzLT5zYW1wbGVzX3Blcl9mcmFtZSAtIHMtPm1pbl9zYW1wbGVzX3Blcl9zdWJmcmFtZSkKKyAgICAgICAgcmV0dXJuIHMtPm1pbl9zYW1wbGVzX3Blcl9zdWJmcmFtZTsKKworICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qKiAxIGJpdCBpbmRpY2F0ZXMgaWYgdGhlIHN1YmZyYW1lIGlzIG9mIG1heGltdW0gbGVuZ3RoICovCisgICAgaWYgKHMtPm1heF9zdWJmcmFtZV9sZW5fYml0KSB7CisgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkKKyAgICAgICAgICAgIGZyYW1lX2xlbl9zaGlmdCA9IDEgKyBnZXRfYml0cygmcy0+Z2IsIHMtPnN1YmZyYW1lX2xlbl9iaXRzLTEpOworICAgIH0gZWxzZQorICAgICAgICBmcmFtZV9sZW5fc2hpZnQgPSBnZXRfYml0cygmcy0+Z2IsIHMtPnN1YmZyYW1lX2xlbl9iaXRzKTsKKworICAgIHN1YmZyYW1lX2xlbiA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lID4+IGZyYW1lX2xlbl9zaGlmdDsKKworICAgIC8qKiBzYW5pdHkgY2hlY2sgdGhlIGxlbmd0aCAqLworICAgIGlmIChzdWJmcmFtZV9sZW4gPCBzLT5taW5fc2FtcGxlc19wZXJfc3ViZnJhbWUgfHwKKyAgICAgICAgc3ViZnJhbWVfbGVuID4gcy0+c2FtcGxlc19wZXJfZnJhbWUpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJicm9rZW4gZnJhbWU6IHN1YmZyYW1lX2xlbiAlaVxuIiwKKyAgICAgICAgICAgICAgIHN1YmZyYW1lX2xlbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICByZXR1cm4gc3ViZnJhbWVfbGVuOworfQorCisvKioKKyAqQGJyaWVmIERlY29kZSBob3cgdGhlIGRhdGEgaW4gdGhlIGZyYW1lIGlzIHNwbGl0IGludG8gc3ViZnJhbWVzLgorICogICAgICAgRXZlcnkgV01BIGZyYW1lIGNvbnRhaW5zIHRoZSBlbmNvZGVkIGRhdGEgZm9yIGEgZml4ZWQgbnVtYmVyIG9mCisgKiAgICAgICBzYW1wbGVzIHBlciBjaGFubmVsLiBUaGUgZGF0YSBmb3IgZXZlcnkgY2hhbm5lbCBtaWdodCBiZSBzcGxpdAorICogICAgICAgaW50byBzZXZlcmFsIHN1YmZyYW1lcy4gVGhpcyBmdW5jdGlvbiB3aWxsIHJlY29uc3RydWN0IHRoZSBsaXN0IG9mCisgKiAgICAgICBzdWJmcmFtZXMgZm9yIGV2ZXJ5IGNoYW5uZWwuCisgKgorICogICAgICAgSWYgdGhlIHN1YmZyYW1lcyBhcmUgbm90IGV2ZW5seSBzcGxpdCwgdGhlIGFsZ29yaXRobSBlc3RpbWF0ZXMgdGhlCisgKiAgICAgICBjaGFubmVscyB3aXRoIHRoZSBsb3dlc3QgbnVtYmVyIG9mIHRvdGFsIHNhbXBsZXMuCisgKiAgICAgICBBZnRlcndhcmRzLCBmb3IgZWFjaCBvZiB0aGVzZSBjaGFubmVscyBhIGJpdCBpcyByZWFkIGZyb20gdGhlCisgKiAgICAgICBiaXRzdHJlYW0gdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIGNoYW5uZWwgY29udGFpbnMgYSBzdWJmcmFtZSB3aXRoIHRoZQorICogICAgICAgbmV4dCBzdWJmcmFtZSBzaXplIHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0gb3Igbm90LgorICogICAgICAgSWYgYSBjaGFubmVsIGNvbnRhaW5zIHN1Y2ggYSBzdWJmcmFtZSwgdGhlIHN1YmZyYW1lIHNpemUgZ2V0cyBhZGRlZCB0bworICogICAgICAgdGhlIGNoYW5uZWwncyBzdWJmcmFtZSBsaXN0LgorICogICAgICAgVGhlIGFsZ29yaXRobSByZXBlYXRzIHRoZXNlIHN0ZXBzIHVudGlsIHRoZSBmcmFtZSBpcyBwcm9wZXJseSBkaXZpZGVkCisgKiAgICAgICBiZXR3ZWVuIHRoZSBpbmRpdmlkdWFsIGNoYW5uZWxzLgorICoKKyAqQHBhcmFtIHMgY29udGV4dAorICpAcmV0dXJuIDAgb24gc3VjY2VzcywgPCAwIGluIGNhc2Ugb2YgYW4gZXJyb3IKKyAqLworc3RhdGljIGludCBkZWNvZGVfdGlsZWhkcihXTUFQcm9EZWNvZGVDdHggKnMpCit7CisgICAgdWludDE2X3QgbnVtX3NhbXBsZXNbV01BUFJPX01BWF9DSEFOTkVMU10gPSB7IDAgfTsvKio8IHN1bSBvZiBzYW1wbGVzIGZvciBhbGwgY3VycmVudGx5IGtub3duIHN1YmZyYW1lcyBvZiBhIGNoYW5uZWwgKi8KKyAgICB1aW50OF90ICBjb250YWluc19zdWJmcmFtZVtXTUFQUk9fTUFYX0NIQU5ORUxTXTsgIC8qKjwgZmxhZyBpbmRpY2F0aW5nIGlmIGEgY2hhbm5lbCBjb250YWlucyB0aGUgY3VycmVudCBzdWJmcmFtZSAqLworICAgIGludCBjaGFubmVsc19mb3JfY3VyX3N1YmZyYW1lID0gcy0+YXZjdHgtPmNoYW5uZWxzOyAvKio8IG51bWJlciBvZiBjaGFubmVscyB0aGF0IGNvbnRhaW4gdGhlIGN1cnJlbnQgc3ViZnJhbWUgKi8KKyAgICBpbnQgZml4ZWRfY2hhbm5lbF9sYXlvdXQgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYWxsIGNoYW5uZWxzIHVzZSB0aGUgc2FtZSBzdWJmcmFtZSBvZmZzZXRzIGFuZCBzaXplcyAqLworICAgIGludCBtaW5fY2hhbm5lbF9sZW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBzbWFsbGVzdCBzdW0gb2Ygc2FtcGxlcyAoY2hhbm5lbHMgd2l0aCB0aGlzIGxlbmd0aCB3aWxsIGJlIHByb2Nlc3NlZCBmaXJzdCkgKi8KKyAgICBpbnQgYzsKKworICAgIC8qIFNob3VsZCBuZXZlciBjb25zdW1lIG1vcmUgdGhhbiAzMDczIGJpdHMgKDI1NiBpdGVyYXRpb25zIGZvciB0aGUKKyAgICAgKiB3aGlsZSBsb29wIHdoZW4gYWx3YXlzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiAxMjggc2FtcGxlcyBpcyBzdWJ0cmFjdGVkCisgICAgICogZnJvbSBtaXNzaW5nIHNhbXBsZXMgaW4gdGhlIDggY2hhbm5lbCBjYXNlKS4KKyAgICAgKiAxICsgQkxPQ0tfTUFYX1NJWkUgKiBNQVhfQ0hBTk5FTFMgLyBCTE9DS19NSU5fU0laRSAqIChNQVhfQ0hBTk5FTFMgICsgNCkKKyAgICAgKi8KKworICAgIC8qKiByZXNldCB0aWxpbmcgaW5mb3JtYXRpb24gKi8KKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+YXZjdHgtPmNoYW5uZWxzOyBjKyspCisgICAgICAgIHMtPmNoYW5uZWxbY10ubnVtX3N1YmZyYW1lcyA9IDA7CisKKyAgICBpZiAocy0+bWF4X251bV9zdWJmcmFtZXMgPT0gMSB8fCBnZXRfYml0czEoJnMtPmdiKSkKKyAgICAgICAgZml4ZWRfY2hhbm5lbF9sYXlvdXQgPSAxOworCisgICAgLyoqIGxvb3AgdW50aWwgdGhlIGZyYW1lIGRhdGEgaXMgc3BsaXQgYmV0d2VlbiB0aGUgc3ViZnJhbWVzICovCisgICAgZG8geworICAgICAgICBpbnQgc3ViZnJhbWVfbGVuOworCisgICAgICAgIC8qKiBjaGVjayB3aGljaCBjaGFubmVscyBjb250YWluIHRoZSBzdWJmcmFtZSAqLworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgcy0+YXZjdHgtPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgIGlmIChudW1fc2FtcGxlc1tjXSA9PSBtaW5fY2hhbm5lbF9sZW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoZml4ZWRfY2hhbm5lbF9sYXlvdXQgfHwgY2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZSA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgKG1pbl9jaGFubmVsX2xlbiA9PSBzLT5zYW1wbGVzX3Blcl9mcmFtZSAtIHMtPm1pbl9zYW1wbGVzX3Blcl9zdWJmcmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zX3N1YmZyYW1lW2NdID0gMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zX3N1YmZyYW1lW2NdID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBjb250YWluc19zdWJmcmFtZVtjXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiogZ2V0IHN1YmZyYW1lIGxlbmd0aCwgc3ViZnJhbWVfbGVuID09IDAgaXMgbm90IGFsbG93ZWQgKi8KKyAgICAgICAgaWYgKChzdWJmcmFtZV9sZW4gPSBkZWNvZGVfc3ViZnJhbWVfbGVuZ3RoKHMsIG1pbl9jaGFubmVsX2xlbikpIDw9IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAvKiogYWRkIHN1YmZyYW1lcyB0byB0aGUgaW5kaXZpZHVhbCBjaGFubmVscyBhbmQgZmluZCBuZXcgbWluX2NoYW5uZWxfbGVuICovCisgICAgICAgIG1pbl9jaGFubmVsX2xlbiArPSBzdWJmcmFtZV9sZW47CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgV01BUHJvQ2hhbm5lbEN0eCogY2hhbiA9ICZzLT5jaGFubmVsW2NdOworCisgICAgICAgICAgICBpZiAoY29udGFpbnNfc3ViZnJhbWVbY10pIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbi0+bnVtX3N1YmZyYW1lcyA+PSBNQVhfU1VCRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJyb2tlbiBmcmFtZTogbnVtIHN1YmZyYW1lcyA+IDMxXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoYW4tPnN1YmZyYW1lX2xlbltjaGFuLT5udW1fc3ViZnJhbWVzXSA9IHN1YmZyYW1lX2xlbjsKKyAgICAgICAgICAgICAgICBudW1fc2FtcGxlc1tjXSArPSBzdWJmcmFtZV9sZW47CisgICAgICAgICAgICAgICAgKytjaGFuLT5udW1fc3ViZnJhbWVzOworICAgICAgICAgICAgICAgIGlmIChudW1fc2FtcGxlc1tjXSA+IHMtPnNhbXBsZXNfcGVyX2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYnJva2VuIGZyYW1lOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbCBsZW4gPiBzYW1wbGVzX3Blcl9mcmFtZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtX3NhbXBsZXNbY10gPD0gbWluX2NoYW5uZWxfbGVuKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bV9zYW1wbGVzW2NdIDwgbWluX2NoYW5uZWxfbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWUgPSAwOworICAgICAgICAgICAgICAgICAgICBtaW5fY2hhbm5lbF9sZW4gPSBudW1fc2FtcGxlc1tjXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytjaGFubmVsc19mb3JfY3VyX3N1YmZyYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAobWluX2NoYW5uZWxfbGVuIDwgcy0+c2FtcGxlc19wZXJfZnJhbWUpOworCisgICAgZm9yIChjID0gMDsgYyA8IHMtPmF2Y3R4LT5jaGFubmVsczsgYysrKSB7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmNoYW5uZWxbY10ubnVtX3N1YmZyYW1lczsgaSsrKSB7CisgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiZnJhbWVbJWldIGNoYW5uZWxbJWldIHN1YmZyYW1lWyVpXSIKKyAgICAgICAgICAgICAgICAgICAgIiBsZW4gJWlcbiIsIHMtPmZyYW1lX251bSwgYywgaSwKKyAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbFtjXS5zdWJmcmFtZV9sZW5baV0pOworICAgICAgICAgICAgcy0+Y2hhbm5lbFtjXS5zdWJmcmFtZV9vZmZzZXRbaV0gPSBvZmZzZXQ7CisgICAgICAgICAgICBvZmZzZXQgKz0gcy0+Y2hhbm5lbFtjXS5zdWJmcmFtZV9sZW5baV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKkBicmllZiBDYWxjdWxhdGUgYSBkZWNvcnJlbGF0aW9uIG1hdHJpeCBmcm9tIHRoZSBiaXRzdHJlYW0gcGFyYW1ldGVycy4KKyAqQHBhcmFtIHMgY29kZWMgY29udGV4dAorICpAcGFyYW0gY2hncm91cCBjaGFubmVsIGdyb3VwIGZvciB3aGljaCB0aGUgbWF0cml4IG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX2RlY29ycmVsYXRpb25fbWF0cml4KFdNQVByb0RlY29kZUN0eCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTUFQcm9DaGFubmVsR3JwICpjaGdyb3VwKQoreworICAgIGludCBpOworICAgIGludCBvZmZzZXQgPSAwOworICAgIGludDhfdCByb3RhdGlvbl9vZmZzZXRbV01BUFJPX01BWF9DSEFOTkVMUyAqIFdNQVBST19NQVhfQ0hBTk5FTFNdOworICAgIG1lbXNldChjaGdyb3VwLT5kZWNvcnJlbGF0aW9uX21hdHJpeCwgMCwgcy0+YXZjdHgtPmNoYW5uZWxzICoKKyAgICAgICAgICAgcy0+YXZjdHgtPmNoYW5uZWxzICogc2l6ZW9mKCpjaGdyb3VwLT5kZWNvcnJlbGF0aW9uX21hdHJpeCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNoZ3JvdXAtPm51bV9jaGFubmVscyAqIChjaGdyb3VwLT5udW1fY2hhbm5lbHMgLSAxKSA+PiAxOyBpKyspCisgICAgICAgIHJvdGF0aW9uX29mZnNldFtpXSA9IGdldF9iaXRzKCZzLT5nYiwgNik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hncm91cC0+bnVtX2NoYW5uZWxzOyBpKyspCisgICAgICAgIGNoZ3JvdXAtPmRlY29ycmVsYXRpb25fbWF0cml4W2NoZ3JvdXAtPm51bV9jaGFubmVscyAqIGkgKyBpXSA9CisgICAgICAgICAgICBnZXRfYml0czEoJnMtPmdiKSA/IDEuMCA6IC0xLjA7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgY2hncm91cC0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgaW50IHg7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpOyB4KyspIHsKKyAgICAgICAgICAgIGludCB5OworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGkgKyAxOyB5KyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB2MSA9IGNoZ3JvdXAtPmRlY29ycmVsYXRpb25fbWF0cml4W3ggKiBjaGdyb3VwLT5udW1fY2hhbm5lbHMgKyB5XTsKKyAgICAgICAgICAgICAgICBmbG9hdCB2MiA9IGNoZ3JvdXAtPmRlY29ycmVsYXRpb25fbWF0cml4W2kgKiBjaGdyb3VwLT5udW1fY2hhbm5lbHMgKyB5XTsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IHJvdGF0aW9uX29mZnNldFtvZmZzZXQgKyB4XTsKKyAgICAgICAgICAgICAgICBmbG9hdCBzaW52OworICAgICAgICAgICAgICAgIGZsb2F0IGNvc3Y7CisKKyAgICAgICAgICAgICAgICBpZiAobiA8IDMyKSB7CisgICAgICAgICAgICAgICAgICAgIHNpbnYgPSBzaW42NFtuXTsKKyAgICAgICAgICAgICAgICAgICAgY29zdiA9IHNpbjY0WzMyIC0gbl07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2ludiA9ICBzaW42NFs2NCAtICBuXTsKKyAgICAgICAgICAgICAgICAgICAgY29zdiA9IC1zaW42NFtuICAtIDMyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjaGdyb3VwLT5kZWNvcnJlbGF0aW9uX21hdHJpeFt5ICsgeCAqIGNoZ3JvdXAtPm51bV9jaGFubmVsc10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjEgKiBzaW52KSAtICh2MiAqIGNvc3YpOworICAgICAgICAgICAgICAgIGNoZ3JvdXAtPmRlY29ycmVsYXRpb25fbWF0cml4W3kgKyBpICogY2hncm91cC0+bnVtX2NoYW5uZWxzXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MSAqIGNvc3YpICsgKHYyICogc2ludik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IGk7CisgICAgfQorfQorCisvKioKKyAqQGJyaWVmIERlY29kZSBjaGFubmVsIHRyYW5zZm9ybWF0aW9uIHBhcmFtZXRlcnMKKyAqQHBhcmFtIHMgY29kZWMgY29udGV4dAorICpAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCA8IDAgaW4gY2FzZSBvZiBiaXRzdHJlYW0gZXJyb3JzCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2NoYW5uZWxfdHJhbnNmb3JtKFdNQVByb0RlY29kZUN0eCogcykKK3sKKyAgICBpbnQgaTsKKyAgICAvKiBzaG91bGQgbmV2ZXIgY29uc3VtZSBtb3JlIHRoYW4gMTkyMSBiaXRzIGZvciB0aGUgOCBjaGFubmVsIGNhc2UKKyAgICAgKiAxICsgTUFYX0NIQU5ORUxTICogKE1BWF9DSEFOTkVMUyArIDIgKyAzICogTUFYX0NIQU5ORUxTICogTUFYX0NIQU5ORUxTCisgICAgICogKyBNQVhfQ0hBTk5FTFMgKyBNQVhfQkFORFMgKyAxKQorICAgICAqLworCisgICAgLyoqIGluIHRoZSBvbmUgY2hhbm5lbCBjYXNlIGNoYW5uZWwgdHJhbnNmb3JtcyBhcmUgcG9pbnRsZXNzICovCisgICAgcy0+bnVtX2NoZ3JvdXBzID0gMDsKKyAgICBpZiAocy0+YXZjdHgtPmNoYW5uZWxzID4gMSkgeworICAgICAgICBpbnQgcmVtYWluaW5nX2NoYW5uZWxzID0gcy0+Y2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZTsKKworICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hhbm5lbCB0cmFuc2Zvcm0gYml0Iik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHMtPm51bV9jaGdyb3VwcyA9IDA7IHJlbWFpbmluZ19jaGFubmVscyAmJgorICAgICAgICAgICAgIHMtPm51bV9jaGdyb3VwcyA8IHMtPmNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWU7IHMtPm51bV9jaGdyb3VwcysrKSB7CisgICAgICAgICAgICBXTUFQcm9DaGFubmVsR3JwKiBjaGdyb3VwID0gJnMtPmNoZ3JvdXBbcy0+bnVtX2NoZ3JvdXBzXTsKKyAgICAgICAgICAgIGZsb2F0KiogY2hhbm5lbF9kYXRhID0gY2hncm91cC0+Y2hhbm5lbF9kYXRhOworICAgICAgICAgICAgY2hncm91cC0+bnVtX2NoYW5uZWxzID0gMDsKKyAgICAgICAgICAgIGNoZ3JvdXAtPnRyYW5zZm9ybSA9IDA7CisKKyAgICAgICAgICAgIC8qKiBkZWNvZGUgY2hhbm5lbCBtYXNrICovCisgICAgICAgICAgICBpZiAocmVtYWluaW5nX2NoYW5uZWxzID4gMikgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsc19mb3JfY3VyX3N1YmZyYW1lOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxfaWR4ID0gcy0+Y2hhbm5lbF9pbmRleGVzX2Zvcl9jdXJfc3ViZnJhbWVbaV07CisgICAgICAgICAgICAgICAgICAgIGlmICghcy0+Y2hhbm5lbFtjaGFubmVsX2lkeF0uZ3JvdXBlZAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrY2hncm91cC0+bnVtX2NoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbFtjaGFubmVsX2lkeF0uZ3JvdXBlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAqY2hhbm5lbF9kYXRhKysgPSBzLT5jaGFubmVsW2NoYW5uZWxfaWR4XS5jb2VmZnM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoZ3JvdXAtPm51bV9jaGFubmVscyA9IHJlbWFpbmluZ19jaGFubmVsczsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsX2lkeCA9IHMtPmNoYW5uZWxfaW5kZXhlc19mb3JfY3VyX3N1YmZyYW1lW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPmNoYW5uZWxbY2hhbm5lbF9pZHhdLmdyb3VwZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAqY2hhbm5lbF9kYXRhKysgPSBzLT5jaGFubmVsW2NoYW5uZWxfaWR4XS5jb2VmZnM7CisgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxbY2hhbm5lbF9pZHhdLmdyb3VwZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIGRlY29kZSB0cmFuc2Zvcm0gdHlwZSAqLworICAgICAgICAgICAgaWYgKGNoZ3JvdXAtPm51bV9jaGFubmVscyA9PSAyKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGNoYW5uZWwgdHJhbnNmb3JtIHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoZ3JvdXAtPnRyYW5zZm9ybSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+Y2hhbm5lbHMgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXhbMF0gPSAgMS4wOworICAgICAgICAgICAgICAgICAgICAgICAgY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXhbMV0gPSAtMS4wOworICAgICAgICAgICAgICAgICAgICAgICAgY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXhbMl0gPSAgMS4wOworICAgICAgICAgICAgICAgICAgICAgICAgY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXhbM10gPSAgMS4wOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoqIGNvcyhwaS80KSAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXhbMF0gPSAgMC43MDcwMzEyNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZ3JvdXAtPmRlY29ycmVsYXRpb25fbWF0cml4WzFdID0gLTAuNzA3MDMxMjU7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGdyb3VwLT5kZWNvcnJlbGF0aW9uX21hdHJpeFsyXSA9ICAwLjcwNzAzMTI1OworICAgICAgICAgICAgICAgICAgICAgICAgY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXhbM10gPSAgMC43MDcwMzEyNTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hncm91cC0+bnVtX2NoYW5uZWxzID4gMikgeworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgICAgICBjaGdyb3VwLT50cmFuc2Zvcm0gPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9kZWNvcnJlbGF0aW9uX21hdHJpeChzLCBjaGdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBGSVhNRTogbW9yZSB0aGFuIDYgY291cGxlZCBjaGFubmVscyBub3Qgc3VwcG9ydGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hncm91cC0+bnVtX2NoYW5uZWxzID4gNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdXBsZWQgY2hhbm5lbHMgPiA2Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjaGdyb3VwLT5kZWNvcnJlbGF0aW9uX21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9kZWNvcnJlbGF0aW9uW2NoZ3JvdXAtPm51bV9jaGFubmVsc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZ3JvdXAtPm51bV9jaGFubmVscyAqIGNoZ3JvdXAtPm51bV9jaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIGRlY29kZSB0cmFuc2Zvcm0gb24gLyBvZmYgKi8KKyAgICAgICAgICAgIGlmIChjaGdyb3VwLT50cmFuc2Zvcm0pIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICAvKiogdHJhbnNmb3JtIGNhbiBiZSBlbmFibGVkIGZvciBpbmRpdmlkdWFsIGJhbmRzICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fYmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hncm91cC0+dHJhbnNmb3JtX2JhbmRbaV0gPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjaGdyb3VwLT50cmFuc2Zvcm1fYmFuZCwgMSwgcy0+bnVtX2JhbmRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZW1haW5pbmdfY2hhbm5lbHMgLT0gY2hncm91cC0+bnVtX2NoYW5uZWxzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqQGJyaWVmIEV4dHJhY3QgdGhlIGNvZWZmaWNpZW50cyBmcm9tIHRoZSBiaXRzdHJlYW0uCisgKkBwYXJhbSBzIGNvZGVjIGNvbnRleHQKKyAqQHBhcmFtIGMgY3VycmVudCBjaGFubmVsIG51bWJlcgorICpAcmV0dXJuIDAgb24gc3VjY2VzcywgPCAwIGluIGNhc2Ugb2YgYml0c3RyZWFtIGVycm9ycworICovCitzdGF0aWMgaW50IGRlY29kZV9jb2VmZnMoV01BUHJvRGVjb2RlQ3R4ICpzLCBpbnQgYykKK3sKKyAgICAvKiBJbnRlZ2VycyAwLi4xNSBhcyBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0cy4gIFRoZSB0YWJsZSBzYXZlcyBhCisgICAgICAgY29zdGx5IGludCB0byBmbG9hdCBjb252ZXJzaW9uLCBhbmQgc3RvcmluZyB0aGUgdmFsdWVzIGFzCisgICAgICAgaW50ZWdlcnMgYWxsb3dzIGZhc3Qgc2lnbi1mbGlwcGluZy4gKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgZnZhbF90YWJbMTZdID0geworICAgICAgICAweDAwMDAwMDAwLCAweDNmODAwMDAwLCAweDQwMDAwMDAwLCAweDQwNDAwMDAwLAorICAgICAgICAweDQwODAwMDAwLCAweDQwYTAwMDAwLCAweDQwYzAwMDAwLCAweDQwZTAwMDAwLAorICAgICAgICAweDQxMDAwMDAwLCAweDQxMTAwMDAwLCAweDQxMjAwMDAwLCAweDQxMzAwMDAwLAorICAgICAgICAweDQxNDAwMDAwLCAweDQxNTAwMDAwLCAweDQxNjAwMDAwLCAweDQxNzAwMDAwLAorICAgIH07CisgICAgaW50IHZsY3RhYmxlOworICAgIFZMQyogdmxjOworICAgIFdNQVByb0NoYW5uZWxDdHgqIGNpID0gJnMtPmNoYW5uZWxbY107CisgICAgaW50IHJsX21vZGUgPSAwOworICAgIGludCBjdXJfY29lZmYgPSAwOworICAgIGludCBudW1femVyb3MgPSAwOworICAgIGNvbnN0IHVpbnQxNl90KiBydW47CisgICAgY29uc3QgZmxvYXQqIGxldmVsOworCisgICAgYXZfZGxvZyhzLT5hdmN0eCwgImRlY29kZSBjb2VmZmljaWVudHMgZm9yIGNoYW5uZWwgJWlcbiIsIGMpOworCisgICAgdmxjdGFibGUgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICB2bGMgPSAmY29lZl92bGNbdmxjdGFibGVdOworCisgICAgaWYgKHZsY3RhYmxlKSB7CisgICAgICAgIHJ1biA9IGNvZWYxX3J1bjsKKyAgICAgICAgbGV2ZWwgPSBjb2VmMV9sZXZlbDsKKyAgICB9IGVsc2UgeworICAgICAgICBydW4gPSBjb2VmMF9ydW47CisgICAgICAgIGxldmVsID0gY29lZjBfbGV2ZWw7CisgICAgfQorCisgICAgLyoqIGRlY29kZSB2ZWN0b3IgY29lZmZpY2llbnRzIChjb25zdW1lcyB1cCB0byAxNjcgYml0cyBwZXIgaXRlcmF0aW9uIGZvcgorICAgICAgNCB2ZWN0b3IgY29kZWQgbGFyZ2UgdmFsdWVzKSAqLworICAgIHdoaWxlICgocy0+dHJhbnNtaXRfbnVtX3ZlY19jb2VmZnMgfHwgIXJsX21vZGUpICYmCisgICAgICAgICAgIChjdXJfY29lZmYgKyAzIDwgY2ktPm51bV92ZWNfY29lZmZzKSkgeworICAgICAgICB1aW50MzJfdCB2YWxzWzRdOworICAgICAgICBpbnQgaTsKKyAgICAgICAgdW5zaWduZWQgaW50IGlkeDsKKworICAgICAgICBpZHggPSBnZXRfdmxjMigmcy0+Z2IsIHZlYzRfdmxjLnRhYmxlLCBWTENCSVRTLCBWRUM0TUFYREVQVEgpOworCisgICAgICAgIGlmIChpZHggPT0gSFVGRl9WRUM0X1NJWkUgLSAxKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgaWR4ID0gZ2V0X3ZsYzIoJnMtPmdiLCB2ZWMyX3ZsYy50YWJsZSwgVkxDQklUUywgVkVDMk1BWERFUFRIKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ID09IEhVRkZfVkVDMl9TSVpFIC0gMSkgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2MCwgdjE7CisgICAgICAgICAgICAgICAgICAgIHYwID0gZ2V0X3ZsYzIoJnMtPmdiLCB2ZWMxX3ZsYy50YWJsZSwgVkxDQklUUywgVkVDMU1BWERFUFRIKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYwID09IEhVRkZfVkVDMV9TSVpFIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHYwICs9IGZmX3dtYV9nZXRfbGFyZ2VfdmFsKCZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgIHYxID0gZ2V0X3ZsYzIoJnMtPmdiLCB2ZWMxX3ZsYy50YWJsZSwgVkxDQklUUywgVkVDMU1BWERFUFRIKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYxID09IEhVRkZfVkVDMV9TSVpFIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHYxICs9IGZmX3dtYV9nZXRfbGFyZ2VfdmFsKCZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgIHZhbHNbaSAgXSA9IGF2X2Zsb2F0MmludCh2MCk7CisgICAgICAgICAgICAgICAgICAgIHZhbHNbaSsxXSA9IGF2X2Zsb2F0MmludCh2MSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsc1tpXSAgID0gZnZhbF90YWJbc3ltYm9sX3RvX3ZlYzJbaWR4XSA+PiA0IF07CisgICAgICAgICAgICAgICAgICAgIHZhbHNbaSsxXSA9IGZ2YWxfdGFiW3N5bWJvbF90b192ZWMyW2lkeF0gJiAweEZdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbHNbMF0gPSBmdmFsX3RhYlsgc3ltYm9sX3RvX3ZlYzRbaWR4XSA+PiAxMiAgICAgIF07CisgICAgICAgICAgICB2YWxzWzFdID0gZnZhbF90YWJbKHN5bWJvbF90b192ZWM0W2lkeF0gPj4gOCkgJiAweEZdOworICAgICAgICAgICAgdmFsc1syXSA9IGZ2YWxfdGFiWyhzeW1ib2xfdG9fdmVjNFtpZHhdID4+IDQpICYgMHhGXTsKKyAgICAgICAgICAgIHZhbHNbM10gPSBmdmFsX3RhYlsgc3ltYm9sX3RvX3ZlYzRbaWR4XSAgICAgICAmIDB4Rl07CisgICAgICAgIH0KKworICAgICAgICAvKiogZGVjb2RlIHNpZ24gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgaWYgKHZhbHNbaV0pIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzaWduID0gZ2V0X2JpdHMxKCZzLT5nYikgLSAxOworICAgICAgICAgICAgICAgIEFWX1dOMzJBKCZjaS0+Y29lZmZzW2N1cl9jb2VmZl0sIHZhbHNbaV0gXiBzaWduIDw8IDMxKTsKKyAgICAgICAgICAgICAgICBudW1femVyb3MgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaS0+Y29lZmZzW2N1cl9jb2VmZl0gPSAwOworICAgICAgICAgICAgICAgIC8qKiBzd2l0Y2ggdG8gcnVuIGxldmVsIG1vZGUgd2hlbiBzdWJmcmFtZV9sZW4gLyAxMjggemVyb3MKKyAgICAgICAgICAgICAgICAgICAgd2VyZSBmb3VuZCBpbiBhIHJvdyAqLworICAgICAgICAgICAgICAgIHJsX21vZGUgfD0gKCsrbnVtX3plcm9zID4gcy0+c3ViZnJhbWVfbGVuID4+IDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytjdXJfY29lZmY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogZGVjb2RlIHJ1biBsZXZlbCBjb2RlZCBjb2VmZmljaWVudHMgKi8KKyAgICBpZiAoY3VyX2NvZWZmIDwgcy0+c3ViZnJhbWVfbGVuKSB7CisgICAgICAgIG1lbXNldCgmY2ktPmNvZWZmc1tjdXJfY29lZmZdLCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKCpjaS0+Y29lZmZzKSAqIChzLT5zdWJmcmFtZV9sZW4gLSBjdXJfY29lZmYpKTsKKyAgICAgICAgaWYgKGZmX3dtYV9ydW5fbGV2ZWxfZGVjb2RlKHMtPmF2Y3R4LCAmcy0+Z2IsIHZsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLCBydW4sIDEsIGNpLT5jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfY29lZmYsIHMtPnN1YmZyYW1lX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN1YmZyYW1lX2xlbiwgcy0+ZXNjX2xlbiwgMCkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKkBicmllZiBFeHRyYWN0IHNjYWxlIGZhY3RvcnMgZnJvbSB0aGUgYml0c3RyZWFtLgorICpAcGFyYW0gcyBjb2RlYyBjb250ZXh0CisgKkByZXR1cm4gMCBvbiBzdWNjZXNzLCA8IDAgaW4gY2FzZSBvZiBiaXRzdHJlYW0gZXJyb3JzCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3NjYWxlX2ZhY3RvcnMoV01BUHJvRGVjb2RlQ3R4KiBzKQoreworICAgIGludCBpOworCisgICAgLyoqIHNob3VsZCBuZXZlciBjb25zdW1lIG1vcmUgdGhhbiA1MzQ0IGJpdHMKKyAgICAgKiAgTUFYX0NIQU5ORUxTICogKDEgKyAgTUFYX0JBTkRTICogMjMpCisgICAgICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZTsgaSsrKSB7CisgICAgICAgIGludCBjID0gcy0+Y2hhbm5lbF9pbmRleGVzX2Zvcl9jdXJfc3ViZnJhbWVbaV07CisgICAgICAgIGludCogc2Y7CisgICAgICAgIGludCogc2ZfZW5kOworICAgICAgICBzLT5jaGFubmVsW2NdLnNjYWxlX2ZhY3RvcnMgPSBzLT5jaGFubmVsW2NdLnNhdmVkX3NjYWxlX2ZhY3RvcnNbIXMtPmNoYW5uZWxbY10uc2NhbGVfZmFjdG9yX2lkeF07CisgICAgICAgIHNmX2VuZCA9IHMtPmNoYW5uZWxbY10uc2NhbGVfZmFjdG9ycyArIHMtPm51bV9iYW5kczsKKworICAgICAgICAvKiogcmVzYW1wbGUgc2NhbGUgZmFjdG9ycyBmb3IgdGhlIG5ldyBibG9jayBzaXplCisgICAgICAgICAqICBhcyB0aGUgc2NhbGUgZmFjdG9ycyBtaWdodCBuZWVkIHRvIGJlIHJlc2FtcGxlZCBzZXZlcmFsIHRpbWVzCisgICAgICAgICAqICBiZWZvcmUgc29tZSAgbmV3IHZhbHVlcyBhcmUgdHJhbnNtaXR0ZWQsIGEgYmFja3VwIG9mIHRoZSBsYXN0CisgICAgICAgICAqICB0cmFuc21pdHRlZCBzY2FsZSBmYWN0b3JzIGlzIGtlcHQgaW4gc2F2ZWRfc2NhbGVfZmFjdG9ycworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmNoYW5uZWxbY10ucmV1c2Vfc2YpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDhfdCogc2Zfb2Zmc2V0cyA9IHMtPnNmX29mZnNldHNbcy0+dGFibGVfaWR4XVtzLT5jaGFubmVsW2NdLnRhYmxlX2lkeF07CisgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBzLT5udW1fYmFuZHM7IGIrKykKKyAgICAgICAgICAgICAgICBzLT5jaGFubmVsW2NdLnNjYWxlX2ZhY3RvcnNbYl0gPQorICAgICAgICAgICAgICAgICAgICBzLT5jaGFubmVsW2NdLnNhdmVkX3NjYWxlX2ZhY3RvcnNbcy0+Y2hhbm5lbFtjXS5zY2FsZV9mYWN0b3JfaWR4XVsqc2Zfb2Zmc2V0cysrXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcy0+Y2hhbm5lbFtjXS5jdXJfc3ViZnJhbWUgfHwgZ2V0X2JpdHMxKCZzLT5nYikpIHsKKworICAgICAgICAgICAgaWYgKCFzLT5jaGFubmVsW2NdLnJldXNlX3NmKSB7CisgICAgICAgICAgICAgICAgaW50IHZhbDsKKyAgICAgICAgICAgICAgICAvKiogZGVjb2RlIERQQ00gY29kZWQgc2NhbGUgZmFjdG9ycyAqLworICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxbY10uc2NhbGVfZmFjdG9yX3N0ZXAgPSBnZXRfYml0cygmcy0+Z2IsIDIpICsgMTsKKyAgICAgICAgICAgICAgICB2YWwgPSA0NSAvIHMtPmNoYW5uZWxbY10uc2NhbGVfZmFjdG9yX3N0ZXA7CisgICAgICAgICAgICAgICAgZm9yIChzZiA9IHMtPmNoYW5uZWxbY10uc2NhbGVfZmFjdG9yczsgc2YgPCBzZl9lbmQ7IHNmKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9IGdldF92bGMyKCZzLT5nYiwgc2ZfdmxjLnRhYmxlLCBTQ0FMRVZMQ0JJVFMsIFNDQUxFTUFYREVQVEgpIC0gNjA7CisgICAgICAgICAgICAgICAgICAgICpzZiA9IHZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIC8qKiBydW4gbGV2ZWwgZGVjb2RlIGRpZmZlcmVuY2VzIHRvIHRoZSByZXNhbXBsZWQgZmFjdG9ycyAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fYmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgaWR4OworICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNpZ247CisKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gZ2V0X3ZsYzIoJnMtPmdiLCBzZl9ybF92bGMudGFibGUsIFZMQ0JJVFMsIFNDQUxFUkxNQVhERVBUSCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpZHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUgPSBnZXRfYml0cygmcy0+Z2IsIDE0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCAgPSAgY29kZSA+PiA2OworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IChjb2RlICYgMSkgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IChjb2RlICYgMHgzZikgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gc2NhbGVfcmxfcnVuW2lkeF07CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgID0gc2NhbGVfcmxfbGV2ZWxbaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSBnZXRfYml0czEoJnMtPmdiKS0xOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaSArPSBza2lwOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBzLT5udW1fYmFuZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHNjYWxlIGZhY3RvciBjb2RpbmdcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbFtjXS5zY2FsZV9mYWN0b3JzW2ldICs9ICh2YWwgXiBzaWduKSAtIHNpZ247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqIHN3YXAgYnVmZmVycyAqLworICAgICAgICAgICAgcy0+Y2hhbm5lbFtjXS5zY2FsZV9mYWN0b3JfaWR4ID0gIXMtPmNoYW5uZWxbY10uc2NhbGVfZmFjdG9yX2lkeDsKKyAgICAgICAgICAgIHMtPmNoYW5uZWxbY10udGFibGVfaWR4ID0gcy0+dGFibGVfaWR4OworICAgICAgICAgICAgcy0+Y2hhbm5lbFtjXS5yZXVzZV9zZiAgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLyoqIGNhbGN1bGF0ZSBuZXcgc2NhbGUgZmFjdG9yIG1heGltdW0gKi8KKyAgICAgICAgcy0+Y2hhbm5lbFtjXS5tYXhfc2NhbGVfZmFjdG9yID0gcy0+Y2hhbm5lbFtjXS5zY2FsZV9mYWN0b3JzWzBdOworICAgICAgICBmb3IgKHNmID0gcy0+Y2hhbm5lbFtjXS5zY2FsZV9mYWN0b3JzICsgMTsgc2YgPCBzZl9lbmQ7IHNmKyspIHsKKyAgICAgICAgICAgIHMtPmNoYW5uZWxbY10ubWF4X3NjYWxlX2ZhY3RvciA9CisgICAgICAgICAgICAgICAgRkZNQVgocy0+Y2hhbm5lbFtjXS5tYXhfc2NhbGVfZmFjdG9yLCAqc2YpOworICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICpAYnJpZWYgUmVjb25zdHJ1Y3QgdGhlIGluZGl2aWR1YWwgY2hhbm5lbCBkYXRhLgorICpAcGFyYW0gcyBjb2RlYyBjb250ZXh0CisgKi8KK3N0YXRpYyB2b2lkIGludmVyc2VfY2hhbm5lbF90cmFuc2Zvcm0oV01BUHJvRGVjb2RlQ3R4ICpzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9jaGdyb3VwczsgaSsrKSB7CisgICAgICAgIGlmIChzLT5jaGdyb3VwW2ldLnRyYW5zZm9ybSkgeworICAgICAgICAgICAgZmxvYXQgZGF0YVtXTUFQUk9fTUFYX0NIQU5ORUxTXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBudW1fY2hhbm5lbHMgPSBzLT5jaGdyb3VwW2ldLm51bV9jaGFubmVsczsKKyAgICAgICAgICAgIGZsb2F0KiogY2hfZGF0YSA9IHMtPmNoZ3JvdXBbaV0uY2hhbm5lbF9kYXRhOworICAgICAgICAgICAgZmxvYXQqKiBjaF9lbmQgPSBjaF9kYXRhICsgbnVtX2NoYW5uZWxzOworICAgICAgICAgICAgY29uc3QgaW50OF90KiB0YiA9IHMtPmNoZ3JvdXBbaV0udHJhbnNmb3JtX2JhbmQ7CisgICAgICAgICAgICBpbnQxNl90KiBzZmI7CisKKyAgICAgICAgICAgIC8qKiBtdWx0aWNoYW5uZWwgZGVjb3JyZWxhdGlvbiAqLworICAgICAgICAgICAgZm9yIChzZmIgPSBzLT5jdXJfc2ZiX29mZnNldHM7CisgICAgICAgICAgICAgICAgIHNmYiA8IHMtPmN1cl9zZmJfb2Zmc2V0cyArIHMtPm51bV9iYW5kczsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgeTsKKyAgICAgICAgICAgICAgICBpZiAoKnRiKysgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAvKiogbXVsdGlwbHkgdmFsdWVzIHdpdGggdGhlIGRlY29ycmVsYXRpb25fbWF0cml4ICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IHNmYlswXTsgeSA8IEZGTUlOKHNmYlsxXSwgcy0+c3ViZnJhbWVfbGVuKTsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbWF0ID0gcy0+Y2hncm91cFtpXS5kZWNvcnJlbGF0aW9uX21hdHJpeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkYXRhX2VuZCA9IGRhdGEgKyBudW1fY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZGF0YV9wdHIgPSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqKiBjaDsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaCA9IGNoX2RhdGE7IGNoIDwgY2hfZW5kOyBjaCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3B0cisrID0gKCpjaClbeV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSBjaF9kYXRhOyBjaCA8IGNoX2VuZDsgY2grKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHN1bSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wdHIgPSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkYXRhX3B0ciA8IGRhdGFfZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gKmRhdGFfcHRyKysgKiAqbWF0Kys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNoKVt5XSA9IHN1bTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+YXZjdHgtPmNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IEZGTUlOKHNmYlsxXSwgcy0+c3ViZnJhbWVfbGVuKSAtIHNmYlswXTsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyKGNoX2RhdGFbMF0gKyBzZmJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoX2RhdGFbMF0gKyBzZmJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MS4wIC8gMTI4LCBsZW4pOworICAgICAgICAgICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF9zY2FsYXIoY2hfZGF0YVsxXSArIHNmYlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hfZGF0YVsxXSArIHNmYlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgxLjAgLyAxMjgsIGxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqQGJyaWVmIEFwcGx5IHNpbmUgd2luZG93IGFuZCByZWNvbnN0cnVjdCB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqQHBhcmFtIHMgY29kZWMgY29udGV4dAorICovCitzdGF0aWMgdm9pZCB3bWFwcm9fd2luZG93KFdNQVByb0RlY29kZUN0eCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZTsgaSsrKSB7CisgICAgICAgIGludCBjID0gcy0+Y2hhbm5lbF9pbmRleGVzX2Zvcl9jdXJfc3ViZnJhbWVbaV07CisgICAgICAgIGNvbnN0IGZsb2F0KiB3aW5kb3c7CisgICAgICAgIGludCB3aW5sZW4gPSBzLT5jaGFubmVsW2NdLnByZXZfYmxvY2tfbGVuOworICAgICAgICBmbG9hdCogc3RhcnQgPSBzLT5jaGFubmVsW2NdLmNvZWZmcyAtICh3aW5sZW4gPj4gMSk7CisKKyAgICAgICAgaWYgKHMtPnN1YmZyYW1lX2xlbiA8IHdpbmxlbikgeworICAgICAgICAgICAgc3RhcnQgKz0gKHdpbmxlbiAtIHMtPnN1YmZyYW1lX2xlbikgPj4gMTsKKyAgICAgICAgICAgIHdpbmxlbiA9IHMtPnN1YmZyYW1lX2xlbjsKKyAgICAgICAgfQorCisgICAgICAgIHdpbmRvdyA9IHMtPndpbmRvd3NbYXZfbG9nMih3aW5sZW4pIC0gV01BUFJPX0JMT0NLX01JTl9CSVRTXTsKKworICAgICAgICB3aW5sZW4gPj49IDE7CisKKyAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KHN0YXJ0LCBzdGFydCwgc3RhcnQgKyB3aW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdywgd2lubGVuKTsKKworICAgICAgICBzLT5jaGFubmVsW2NdLnByZXZfYmxvY2tfbGVuID0gcy0+c3ViZnJhbWVfbGVuOworICAgIH0KK30KKworLyoqCisgKkBicmllZiBEZWNvZGUgYSBzaW5nbGUgc3ViZnJhbWUgKGJsb2NrKS4KKyAqQHBhcmFtIHMgY29kZWMgY29udGV4dAorICpAcmV0dXJuIDAgb24gc3VjY2VzcywgPCAwIHdoZW4gZGVjb2RpbmcgZmFpbGVkCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3N1YmZyYW1lKFdNQVByb0RlY29kZUN0eCAqcykKK3sKKyAgICBpbnQgb2Zmc2V0ID0gcy0+c2FtcGxlc19wZXJfZnJhbWU7CisgICAgaW50IHN1YmZyYW1lX2xlbiA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lOworICAgIGludCBpOworICAgIGludCB0b3RhbF9zYW1wbGVzICAgPSBzLT5zYW1wbGVzX3Blcl9mcmFtZSAqIHMtPmF2Y3R4LT5jaGFubmVsczsKKyAgICBpbnQgdHJhbnNtaXRfY29lZmZzID0gMDsKKyAgICBpbnQgY3VyX3N1Yndvb2Zlcl9jdXRvZmY7CisKKyAgICBzLT5zdWJmcmFtZV9vZmZzZXQgPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpOworCisgICAgLyoqIHJlc2V0IGNoYW5uZWwgY29udGV4dCBhbmQgZmluZCB0aGUgbmV4dCBibG9jayBvZmZzZXQgYW5kIHNpemUKKyAgICAgICAgPT0gdGhlIG5leHQgYmxvY2sgb2YgdGhlIGNoYW5uZWwgd2l0aCB0aGUgc21hbGxlc3QgbnVtYmVyIG9mCisgICAgICAgIGRlY29kZWQgc2FtcGxlcworICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmF2Y3R4LT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgIHMtPmNoYW5uZWxbaV0uZ3JvdXBlZCA9IDA7CisgICAgICAgIGlmIChvZmZzZXQgPiBzLT5jaGFubmVsW2ldLmRlY29kZWRfc2FtcGxlcykgeworICAgICAgICAgICAgb2Zmc2V0ID0gcy0+Y2hhbm5lbFtpXS5kZWNvZGVkX3NhbXBsZXM7CisgICAgICAgICAgICBzdWJmcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxbaV0uc3ViZnJhbWVfbGVuW3MtPmNoYW5uZWxbaV0uY3VyX3N1YmZyYW1lXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2Rsb2cocy0+YXZjdHgsCisgICAgICAgICAgICAicHJvY2Vzc2luZyBzdWJmcmFtZSB3aXRoIG9mZnNldCAlaSBsZW4gJWlcbiIsIG9mZnNldCwgc3ViZnJhbWVfbGVuKTsKKworICAgIC8qKiBnZXQgYSBsaXN0IG9mIGFsbCBjaGFubmVscyB0aGF0IGNvbnRhaW4gdGhlIGVzdGltYXRlZCBibG9jayAqLworICAgIHMtPmNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWUgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICBjb25zdCBpbnQgY3VyX3N1YmZyYW1lID0gcy0+Y2hhbm5lbFtpXS5jdXJfc3ViZnJhbWU7CisgICAgICAgIC8qKiBzdWJ0cmFjdCBhbHJlYWR5IHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIHRvdGFsX3NhbXBsZXMgLT0gcy0+Y2hhbm5lbFtpXS5kZWNvZGVkX3NhbXBsZXM7CisKKyAgICAgICAgLyoqIGFuZCBjb3VudCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3ViZnJhbWVzIHRoYXQgbWF0Y2ggb3VyIHByb2ZpbGUgKi8KKyAgICAgICAgaWYgKG9mZnNldCA9PSBzLT5jaGFubmVsW2ldLmRlY29kZWRfc2FtcGxlcyAmJgorICAgICAgICAgICAgc3ViZnJhbWVfbGVuID09IHMtPmNoYW5uZWxbaV0uc3ViZnJhbWVfbGVuW2N1cl9zdWJmcmFtZV0pIHsKKyAgICAgICAgICAgIHRvdGFsX3NhbXBsZXMgLT0gcy0+Y2hhbm5lbFtpXS5zdWJmcmFtZV9sZW5bY3VyX3N1YmZyYW1lXTsKKyAgICAgICAgICAgIHMtPmNoYW5uZWxbaV0uZGVjb2RlZF9zYW1wbGVzICs9CisgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbFtpXS5zdWJmcmFtZV9sZW5bY3VyX3N1YmZyYW1lXTsKKyAgICAgICAgICAgIHMtPmNoYW5uZWxfaW5kZXhlc19mb3JfY3VyX3N1YmZyYW1lW3MtPmNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWVdID0gaTsKKyAgICAgICAgICAgICsrcy0+Y2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBjaGVjayBpZiB0aGUgZnJhbWUgd2lsbCBiZSBjb21wbGV0ZSBhZnRlciBwcm9jZXNzaW5nIHRoZQorICAgICAgICBlc3RpbWF0ZWQgYmxvY2sgKi8KKyAgICBpZiAoIXRvdGFsX3NhbXBsZXMpCisgICAgICAgIHMtPnBhcnNlZF9hbGxfc3ViZnJhbWVzID0gMTsKKworCisgICAgYXZfZGxvZyhzLT5hdmN0eCwgInN1YmZyYW1lIGlzIHBhcnQgb2YgJWkgY2hhbm5lbHNcbiIsCisgICAgICAgICAgICBzLT5jaGFubmVsc19mb3JfY3VyX3N1YmZyYW1lKTsKKworICAgIC8qKiBjYWxjdWxhdGUgbnVtYmVyIG9mIHNjYWxlIGZhY3RvciBiYW5kcyBhbmQgdGhlaXIgb2Zmc2V0cyAqLworICAgIHMtPnRhYmxlX2lkeCAgICAgICAgID0gYXZfbG9nMihzLT5zYW1wbGVzX3Blcl9mcmFtZS9zdWJmcmFtZV9sZW4pOworICAgIHMtPm51bV9iYW5kcyAgICAgICAgID0gcy0+bnVtX3NmYltzLT50YWJsZV9pZHhdOworICAgIHMtPmN1cl9zZmJfb2Zmc2V0cyAgID0gcy0+c2ZiX29mZnNldHNbcy0+dGFibGVfaWR4XTsKKyAgICBjdXJfc3Vid29vZmVyX2N1dG9mZiA9IHMtPnN1Yndvb2Zlcl9jdXRvZmZzW3MtPnRhYmxlX2lkeF07CisKKyAgICAvKiogY29uZmlndXJlIHRoZSBkZWNvZGVyIGZvciB0aGUgY3VycmVudCBzdWJmcmFtZSAqLworICAgIG9mZnNldCArPSBzLT5zYW1wbGVzX3Blcl9mcmFtZSA+PiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWU7IGkrKykgeworICAgICAgICBpbnQgYyA9IHMtPmNoYW5uZWxfaW5kZXhlc19mb3JfY3VyX3N1YmZyYW1lW2ldOworCisgICAgICAgIHMtPmNoYW5uZWxbY10uY29lZmZzID0gJnMtPmNoYW5uZWxbY10ub3V0W29mZnNldF07CisgICAgfQorCisgICAgcy0+c3ViZnJhbWVfbGVuID0gc3ViZnJhbWVfbGVuOworICAgIHMtPmVzY19sZW4gPSBhdl9sb2cyKHMtPnN1YmZyYW1lX2xlbiAtIDEpICsgMTsKKworICAgIC8qKiBza2lwIGV4dGVuZGVkIGhlYWRlciBpZiBhbnkgKi8KKyAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgaW50IG51bV9maWxsX2JpdHM7CisgICAgICAgIGlmICghKG51bV9maWxsX2JpdHMgPSBnZXRfYml0cygmcy0+Z2IsIDIpKSkgeworICAgICAgICAgICAgaW50IGxlbiA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisgICAgICAgICAgICBudW1fZmlsbF9iaXRzID0gKGxlbiA/IGdldF9iaXRzKCZzLT5nYiwgbGVuKSA6IDApICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1fZmlsbF9iaXRzID49IDApIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19jb3VudCgmcy0+Z2IpICsgbnVtX2ZpbGxfYml0cyA+IHMtPm51bV9zYXZlZF9iaXRzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG51bWJlciBvZiBmaWxsIGJpdHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIG51bV9maWxsX2JpdHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIG5vIGlkZWEgZm9yIHdoYXQgdGhlIGZvbGxvd2luZyBiaXQgaXMgdXNlZCAqLworICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJSZXNlcnZlZCBiaXQiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworCisgICAgaWYgKGRlY29kZV9jaGFubmVsX3RyYW5zZm9ybShzKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZTsgaSsrKSB7CisgICAgICAgIGludCBjID0gcy0+Y2hhbm5lbF9pbmRleGVzX2Zvcl9jdXJfc3ViZnJhbWVbaV07CisgICAgICAgIGlmICgocy0+Y2hhbm5lbFtjXS50cmFuc21pdF9jb2VmcyA9IGdldF9iaXRzMSgmcy0+Z2IpKSkKKyAgICAgICAgICAgIHRyYW5zbWl0X2NvZWZmcyA9IDE7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MChzLT5zdWJmcmFtZV9sZW4gPD0gV01BUFJPX0JMT0NLX01BWF9TSVpFKTsKKyAgICBpZiAodHJhbnNtaXRfY29lZmZzKSB7CisgICAgICAgIGludCBzdGVwOworICAgICAgICBpbnQgcXVhbnRfc3RlcCA9IDkwICogcy0+Yml0c19wZXJfc2FtcGxlID4+IDQ7CisKKyAgICAgICAgLyoqIGRlY29kZSBudW1iZXIgb2YgdmVjdG9yIGNvZGVkIGNvZWZmaWNpZW50cyAqLworICAgICAgICBpZiAoKHMtPnRyYW5zbWl0X251bV92ZWNfY29lZmZzID0gZ2V0X2JpdHMxKCZzLT5nYikpKSB7CisgICAgICAgICAgICBpbnQgbnVtX2JpdHMgPSBhdl9sb2cyKChzLT5zdWJmcmFtZV9sZW4gKyAzKS80KSArIDE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGMgPSBzLT5jaGFubmVsX2luZGV4ZXNfZm9yX2N1cl9zdWJmcmFtZVtpXTsKKyAgICAgICAgICAgICAgICBpbnQgbnVtX3ZlY19jb2VmZnMgPSBnZXRfYml0cygmcy0+Z2IsIG51bV9iaXRzKSA8PCAyOworICAgICAgICAgICAgICAgIGlmIChudW1fdmVjX2NvZWZmcyA+IHMtPnN1YmZyYW1lX2xlbikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm51bV92ZWNfY29lZmZzICVkIGlzIHRvbyBsYXJnZVxuIiwgbnVtX3ZlY19jb2VmZnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChudW1fdmVjX2NvZWZmcyArIG9mZnNldCA8PSBGRl9BUlJBWV9FTEVNUyhzLT5jaGFubmVsW2NdLm91dCkpOworICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxbY10ubnVtX3ZlY19jb2VmZnMgPSBudW1fdmVjX2NvZWZmczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsc19mb3JfY3VyX3N1YmZyYW1lOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IHMtPmNoYW5uZWxfaW5kZXhlc19mb3JfY3VyX3N1YmZyYW1lW2ldOworICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxbY10ubnVtX3ZlY19jb2VmZnMgPSBzLT5zdWJmcmFtZV9sZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoqIGRlY29kZSBxdWFudGl6YXRpb24gc3RlcCAqLworICAgICAgICBzdGVwID0gZ2V0X3NiaXRzKCZzLT5nYiwgNik7CisgICAgICAgIHF1YW50X3N0ZXAgKz0gc3RlcDsKKyAgICAgICAgaWYgKHN0ZXAgPT0gLTMyIHx8IHN0ZXAgPT0gMzEpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBzaWduID0gKHN0ZXAgPT0gMzEpIC0gMTsKKyAgICAgICAgICAgIGludCBxdWFudCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoZ2V0X2JpdHNfY291bnQoJnMtPmdiKSArIDUgPCBzLT5udW1fc2F2ZWRfYml0cyAmJgorICAgICAgICAgICAgICAgICAgIChzdGVwID0gZ2V0X2JpdHMoJnMtPmdiLCA1KSkgPT0gMzEpIHsKKyAgICAgICAgICAgICAgICBxdWFudCArPSAzMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1YW50X3N0ZXAgKz0gKChxdWFudCArIHN0ZXApIF4gc2lnbikgLSBzaWduOworICAgICAgICB9CisgICAgICAgIGlmIChxdWFudF9zdGVwIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJuZWdhdGl2ZSBxdWFudCBzdGVwXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBkZWNvZGUgcXVhbnRpemF0aW9uIHN0ZXAgbW9kaWZpZXJzIGZvciBldmVyeSBjaGFubmVsICovCisKKyAgICAgICAgaWYgKHMtPmNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWUgPT0gMSkgeworICAgICAgICAgICAgcy0+Y2hhbm5lbFtzLT5jaGFubmVsX2luZGV4ZXNfZm9yX2N1cl9zdWJmcmFtZVswXV0ucXVhbnRfc3RlcCA9IHF1YW50X3N0ZXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgbW9kaWZpZXJfbGVuID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsc19mb3JfY3VyX3N1YmZyYW1lOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IHMtPmNoYW5uZWxfaW5kZXhlc19mb3JfY3VyX3N1YmZyYW1lW2ldOworICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxbY10ucXVhbnRfc3RlcCA9IHF1YW50X3N0ZXA7CisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcl9sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxbY10ucXVhbnRfc3RlcCArPSBnZXRfYml0cygmcy0+Z2IsIG1vZGlmaWVyX2xlbikgKyAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICsrcy0+Y2hhbm5lbFtjXS5xdWFudF9zdGVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiBkZWNvZGUgc2NhbGUgZmFjdG9ycyAqLworICAgICAgICBpZiAoZGVjb2RlX3NjYWxlX2ZhY3RvcnMocykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZfZGxvZyhzLT5hdmN0eCwgIkJJVFNUUkVBTTogc3ViZnJhbWUgaGVhZGVyIGxlbmd0aCB3YXMgJWlcbiIsCisgICAgICAgICAgICBnZXRfYml0c19jb3VudCgmcy0+Z2IpIC0gcy0+c3ViZnJhbWVfb2Zmc2V0KTsKKworICAgIC8qKiBwYXJzZSBjb2VmZmljaWVudHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZTsgaSsrKSB7CisgICAgICAgIGludCBjID0gcy0+Y2hhbm5lbF9pbmRleGVzX2Zvcl9jdXJfc3ViZnJhbWVbaV07CisgICAgICAgIGlmIChzLT5jaGFubmVsW2NdLnRyYW5zbWl0X2NvZWZzICYmCisgICAgICAgICAgICBnZXRfYml0c19jb3VudCgmcy0+Z2IpIDwgcy0+bnVtX3NhdmVkX2JpdHMpIHsKKyAgICAgICAgICAgIGRlY29kZV9jb2VmZnMocywgYyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbWVtc2V0KHMtPmNoYW5uZWxbY10uY29lZmZzLCAwLAorICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+Y2hhbm5lbFtjXS5jb2VmZnMpICogc3ViZnJhbWVfbGVuKTsKKyAgICB9CisKKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiQklUU1RSRUFNOiBzdWJmcmFtZSBsZW5ndGggd2FzICVpXG4iLAorICAgICAgICAgICAgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSAtIHMtPnN1YmZyYW1lX29mZnNldCk7CisKKyAgICBpZiAodHJhbnNtaXRfY29lZmZzKSB7CisgICAgICAgIEZGVENvbnRleHQgKm1kY3QgPSAmcy0+bWRjdF9jdHhbYXZfbG9nMihzdWJmcmFtZV9sZW4pIC0gV01BUFJPX0JMT0NLX01JTl9CSVRTXTsKKyAgICAgICAgLyoqIHJlY29uc3RydWN0IHRoZSBwZXIgY2hhbm5lbCBkYXRhICovCisgICAgICAgIGludmVyc2VfY2hhbm5lbF90cmFuc2Zvcm0ocyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsc19mb3JfY3VyX3N1YmZyYW1lOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjID0gcy0+Y2hhbm5lbF9pbmRleGVzX2Zvcl9jdXJfc3ViZnJhbWVbaV07CisgICAgICAgICAgICBjb25zdCBpbnQqIHNmID0gcy0+Y2hhbm5lbFtjXS5zY2FsZV9mYWN0b3JzOworICAgICAgICAgICAgaW50IGI7CisKKyAgICAgICAgICAgIGlmIChjID09IHMtPmxmZV9jaGFubmVsKQorICAgICAgICAgICAgICAgIG1lbXNldCgmcy0+dG1wW2N1cl9zdWJ3b29mZXJfY3V0b2ZmXSwgMCwgc2l6ZW9mKCpzLT50bXApICoKKyAgICAgICAgICAgICAgICAgICAgICAgKHN1YmZyYW1lX2xlbiAtIGN1cl9zdWJ3b29mZXJfY3V0b2ZmKSk7CisKKyAgICAgICAgICAgIC8qKiBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgcmVzY2FsaW5nICovCisgICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgcy0+bnVtX2JhbmRzOyBiKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZW5kID0gRkZNSU4ocy0+Y3VyX3NmYl9vZmZzZXRzW2IrMV0sIHMtPnN1YmZyYW1lX2xlbik7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGV4cCA9IHMtPmNoYW5uZWxbY10ucXVhbnRfc3RlcCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmNoYW5uZWxbY10ubWF4X3NjYWxlX2ZhY3RvciAtICpzZisrKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbFtjXS5zY2FsZV9mYWN0b3Jfc3RlcDsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBxdWFudCA9IHBvdygxMC4wLCBleHAgLyAyMC4wKTsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBzLT5jdXJfc2ZiX29mZnNldHNbYl07CisgICAgICAgICAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyKHMtPnRtcCArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxbY10uY29lZmZzICsgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnQsIGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIGFwcGx5IGltZGN0IChpbWRjdF9oYWxmID09IERDVElWIHdpdGggcmV2ZXJzZSkgKi8KKyAgICAgICAgICAgIG1kY3QtPmltZGN0X2hhbGYobWRjdCwgcy0+Y2hhbm5lbFtjXS5jb2VmZnMsIHMtPnRtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogd2luZG93IGFuZCBvdmVybGFwcC1hZGQgKi8KKyAgICB3bWFwcm9fd2luZG93KHMpOworCisgICAgLyoqIGhhbmRsZWQgb25lIHN1YmZyYW1lICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWU7IGkrKykgeworICAgICAgICBpbnQgYyA9IHMtPmNoYW5uZWxfaW5kZXhlc19mb3JfY3VyX3N1YmZyYW1lW2ldOworICAgICAgICBpZiAocy0+Y2hhbm5lbFtjXS5jdXJfc3ViZnJhbWUgPj0gcy0+Y2hhbm5lbFtjXS5udW1fc3ViZnJhbWVzKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImJyb2tlbiBzdWJmcmFtZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICArK3MtPmNoYW5uZWxbY10uY3VyX3N1YmZyYW1lOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqQGJyaWVmIERlY29kZSBvbmUgV01BIGZyYW1lLgorICpAcGFyYW0gcyBjb2RlYyBjb250ZXh0CisgKkByZXR1cm4gMCBpZiB0aGUgdHJhaWxlciBiaXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyB0aGUgbGFzdCBmcmFtZSwKKyAqICAgICAgICAxIGlmIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGZyYW1lcworICovCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShXTUFQcm9EZWNvZGVDdHggKnMsIEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9mcmFtZV9wdHIpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gcy0+YXZjdHg7CisgICAgR2V0Qml0Q29udGV4dCogZ2IgPSAmcy0+Z2I7CisgICAgaW50IG1vcmVfZnJhbWVzID0gMDsKKyAgICBpbnQgbGVuID0gMDsKKyAgICBpbnQgaSwgcmV0OworCisgICAgLyoqIGdldCBmcmFtZSBsZW5ndGggKi8KKyAgICBpZiAocy0+bGVuX3ByZWZpeCkKKyAgICAgICAgbGVuID0gZ2V0X2JpdHMoZ2IsIHMtPmxvZzJfZnJhbWVfc2l6ZSk7CisKKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiZGVjb2RpbmcgZnJhbWUgd2l0aCBsZW5ndGggJXhcbiIsIGxlbik7CisKKyAgICAvKiogZGVjb2RlIHRpbGUgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoZGVjb2RlX3RpbGVoZHIocykpIHsKKyAgICAgICAgcy0+cGFja2V0X2xvc3MgPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiogcmVhZCBwb3N0cHJvYyB0cmFuc2Zvcm0gKi8KKyAgICBpZiAocy0+YXZjdHgtPmNoYW5uZWxzID4gMSAmJiBnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzICogYXZjdHgtPmNoYW5uZWxzOyBpKyspCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiByZWFkIGRyYyBpbmZvICovCisgICAgaWYgKHMtPmR5bmFtaWNfcmFuZ2VfY29tcHJlc3Npb24pIHsKKyAgICAgICAgcy0+ZHJjX2dhaW4gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICJkcmNfZ2FpbiAlaVxuIiwgcy0+ZHJjX2dhaW4pOworICAgIH0KKworICAgIC8qKiBubyBpZGVhIHdoYXQgdGhlc2UgYXJlIGZvciwgbWlnaHQgYmUgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgICAgICAgIHRoYXQgbmVlZCB0byBiZSBza2lwcGVkIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIGEgc3RyZWFtICovCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgaW50IGF2X3VudXNlZCBza2lwOworCisgICAgICAgIC8qKiB1c3VhbGx5IHRydWUgZm9yIHRoZSBmaXJzdCBmcmFtZSAqLworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgc2tpcCA9IGdldF9iaXRzKGdiLCBhdl9sb2cyKHMtPnNhbXBsZXNfcGVyX2ZyYW1lICogMikpOworICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgInN0YXJ0IHNraXA6ICVpXG4iLCBza2lwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBzb21ldGltZXMgdHJ1ZSBmb3IgdGhlIGxhc3QgZnJhbWUgKi8KKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIHNraXAgPSBnZXRfYml0cyhnYiwgYXZfbG9nMihzLT5zYW1wbGVzX3Blcl9mcmFtZSAqIDIpKTsKKyAgICAgICAgICAgIGF2X2Rsb2cocy0+YXZjdHgsICJlbmQgc2tpcDogJWlcbiIsIHNraXApOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiQklUU1RSRUFNOiBmcmFtZSBoZWFkZXIgbGVuZ3RoIHdhcyAlaVxuIiwKKyAgICAgICAgICAgIGdldF9iaXRzX2NvdW50KGdiKSAtIHMtPmZyYW1lX29mZnNldCk7CisKKyAgICAvKiogcmVzZXQgc3ViZnJhbWUgc3RhdGVzICovCisgICAgcy0+cGFyc2VkX2FsbF9zdWJmcmFtZXMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICBzLT5jaGFubmVsW2ldLmRlY29kZWRfc2FtcGxlcyA9IDA7CisgICAgICAgIHMtPmNoYW5uZWxbaV0uY3VyX3N1YmZyYW1lICAgID0gMDsKKyAgICAgICAgcy0+Y2hhbm5lbFtpXS5yZXVzZV9zZiAgICAgICAgPSAwOworICAgIH0KKworICAgIC8qKiBkZWNvZGUgYWxsIHN1YmZyYW1lcyAqLworICAgIHdoaWxlICghcy0+cGFyc2VkX2FsbF9zdWJmcmFtZXMpIHsKKyAgICAgICAgaWYgKGRlY29kZV9zdWJmcmFtZShzKSA8IDApIHsKKyAgICAgICAgICAgIHMtPnBhY2tldF9sb3NzID0gMTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApIHsKKyAgICAgICAgcy0+cGFja2V0X2xvc3MgPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiogY29weSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKQorICAgICAgICBtZW1jcHkoZnJhbWUtPmV4dGVuZGVkX2RhdGFbaV0sIHMtPmNoYW5uZWxbaV0ub3V0LAorICAgICAgICAgICAgICAgcy0+c2FtcGxlc19wZXJfZnJhbWUgKiBzaXplb2YoKnMtPmNoYW5uZWxbaV0ub3V0KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgLyoqIHJldXNlIHNlY29uZCBoYWxmIG9mIHRoZSBJTURDVCBvdXRwdXQgZm9yIHRoZSBuZXh0IGZyYW1lICovCisgICAgICAgIG1lbWNweSgmcy0+Y2hhbm5lbFtpXS5vdXRbMF0sCisgICAgICAgICAgICAgICAmcy0+Y2hhbm5lbFtpXS5vdXRbcy0+c2FtcGxlc19wZXJfZnJhbWVdLAorICAgICAgICAgICAgICAgcy0+c2FtcGxlc19wZXJfZnJhbWUgKiBzaXplb2YoKnMtPmNoYW5uZWxbaV0ub3V0KSA+PiAxKTsKKyAgICB9CisKKyAgICBpZiAocy0+c2tpcF9mcmFtZSkgeworICAgICAgICBzLT5za2lwX2ZyYW1lID0gMDsKKyAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworICAgIH0KKworICAgIGlmIChzLT5sZW5fcHJlZml4KSB7CisgICAgICAgIGlmIChsZW4gIT0gKGdldF9iaXRzX2NvdW50KGdiKSAtIHMtPmZyYW1lX29mZnNldCkgKyAyKSB7CisgICAgICAgICAgICAvKiogRklYTUU6IG5vdCBzdXJlIGlmIHRoaXMgaXMgYWx3YXlzIGFuIGVycm9yICovCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiZnJhbWVbJSJQUkl1MzIiXSB3b3VsZCBoYXZlIHRvIHNraXAgJWkgYml0c1xuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5mcmFtZV9udW0sCisgICAgICAgICAgICAgICAgICAgbGVuIC0gKGdldF9iaXRzX2NvdW50KGdiKSAtIHMtPmZyYW1lX29mZnNldCkgLSAxKTsKKyAgICAgICAgICAgIHMtPnBhY2tldF9sb3NzID0gMTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyoqIHNraXAgdGhlIHJlc3Qgb2YgdGhlIGZyYW1lIGRhdGEgKi8KKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGxlbiAtIChnZXRfYml0c19jb3VudChnYikgLSBzLT5mcmFtZV9vZmZzZXQpIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKGdldF9iaXRzX2NvdW50KGdiKSA8IHMtPm51bV9zYXZlZF9iaXRzICYmIGdldF9iaXRzMShnYikgPT0gMCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIGRlY29kZSB0cmFpbGVyIGJpdCAqLworICAgIG1vcmVfZnJhbWVzID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICsrcy0+ZnJhbWVfbnVtOworICAgIHJldHVybiBtb3JlX2ZyYW1lczsKK30KKworLyoqCisgKkBicmllZiBDYWxjdWxhdGUgcmVtYWluaW5nIGlucHV0IGJ1ZmZlciBsZW5ndGguCisgKkBwYXJhbSBzIGNvZGVjIGNvbnRleHQKKyAqQHBhcmFtIGdiIGJpdHN0cmVhbSByZWFkZXIgY29udGV4dAorICpAcmV0dXJuIHJlbWFpbmluZyBzaXplIGluIGJpdHMKKyAqLworc3RhdGljIGludCByZW1haW5pbmdfYml0cyhXTUFQcm9EZWNvZGVDdHggKnMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIHJldHVybiBzLT5idWZfYml0X3NpemUgLSBnZXRfYml0c19jb3VudChnYik7Cit9CisKKy8qKgorICpAYnJpZWYgRmlsbCB0aGUgYml0IHJlc2Vydm9pciB3aXRoIGEgKHBhcnRpYWwpIGZyYW1lLgorICpAcGFyYW0gcyBjb2RlYyBjb250ZXh0CisgKkBwYXJhbSBnYiBiaXRzdHJlYW0gcmVhZGVyIGNvbnRleHQKKyAqQHBhcmFtIGxlbiBsZW5ndGggb2YgdGhlIHBhcnRpYWwgZnJhbWUKKyAqQHBhcmFtIGFwcGVuZCBkZWNpZGVzIHdoZXRoZXIgdG8gcmVzZXQgdGhlIGJ1ZmZlciBvciBub3QKKyAqLworc3RhdGljIHZvaWQgc2F2ZV9iaXRzKFdNQVByb0RlY29kZUN0eCAqcywgR2V0Qml0Q29udGV4dCogZ2IsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgaW50IGFwcGVuZCkKK3sKKyAgICBpbnQgYnVmbGVuOworCisgICAgLyoqIHdoZW4gdGhlIGZyYW1lIGRhdGEgZG9lcyBub3QgbmVlZCB0byBiZSBjb25jYXRlbmF0ZWQsIHRoZSBpbnB1dCBidWZmZXIKKyAgICAgICAgaXMgcmVzZXQgYW5kIGFkZGl0aW9uYWwgYml0cyBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZSBhcmUgY29waWVkCisgICAgICAgIGFuZCBza2lwcGVkIGxhdGVyIHNvIHRoYXQgYSBmYXN0IGJ5dGUgY29weSBpcyBwb3NzaWJsZSAqLworCisgICAgaWYgKCFhcHBlbmQpIHsKKyAgICAgICAgcy0+ZnJhbWVfb2Zmc2V0ID0gZ2V0X2JpdHNfY291bnQoZ2IpICYgNzsKKyAgICAgICAgcy0+bnVtX3NhdmVkX2JpdHMgPSBzLT5mcmFtZV9vZmZzZXQ7CisgICAgICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBzLT5mcmFtZV9kYXRhLCBNQVhfRlJBTUVTSVpFKTsKKyAgICB9CisKKyAgICBidWZsZW4gPSAocHV0X2JpdHNfY291bnQoJnMtPnBiKSArIGxlbiArIDgpID4+IDM7CisKKyAgICBpZiAobGVuIDw9IDAgfHwgYnVmbGVuID4gTUFYX0ZSQU1FU0laRSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJUb28gc21hbGwgaW5wdXQgYnVmZmVyIik7CisgICAgICAgIHMtPnBhY2tldF9sb3NzID0gMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF2X2Fzc2VydDAobGVuIDw9IHB1dF9iaXRzX2xlZnQoJnMtPnBiKSk7CisKKyAgICBzLT5udW1fc2F2ZWRfYml0cyArPSBsZW47CisgICAgaWYgKCFhcHBlbmQpIHsKKyAgICAgICAgYXZwcml2X2NvcHlfYml0cygmcy0+cGIsIGdiLT5idWZmZXIgKyAoZ2V0X2JpdHNfY291bnQoZ2IpID4+IDMpLAorICAgICAgICAgICAgICAgICAgICAgcy0+bnVtX3NhdmVkX2JpdHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBhbGlnbiA9IDggLSAoZ2V0X2JpdHNfY291bnQoZ2IpICYgNyk7CisgICAgICAgIGFsaWduID0gRkZNSU4oYWxpZ24sIGxlbik7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgYWxpZ24sIGdldF9iaXRzKGdiLCBhbGlnbikpOworICAgICAgICBsZW4gLT0gYWxpZ247CisgICAgICAgIGF2cHJpdl9jb3B5X2JpdHMoJnMtPnBiLCBnYi0+YnVmZmVyICsgKGdldF9iaXRzX2NvdW50KGdiKSA+PiAzKSwgbGVuKTsKKyAgICB9CisgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGxlbik7CisKKyAgICB7CisgICAgICAgIFB1dEJpdENvbnRleHQgdG1wID0gcy0+cGI7CisgICAgICAgIGZsdXNoX3B1dF9iaXRzKCZ0bXApOworICAgIH0KKworICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBzLT5mcmFtZV9kYXRhLCBzLT5udW1fc2F2ZWRfYml0cyk7CisgICAgc2tpcF9iaXRzKCZzLT5nYiwgcy0+ZnJhbWVfb2Zmc2V0KTsKK30KKworLyoqCisgKkBicmllZiBEZWNvZGUgYSBzaW5nbGUgV01BIHBhY2tldC4KKyAqQHBhcmFtIGF2Y3R4IGNvZGVjIGNvbnRleHQKKyAqQHBhcmFtIGRhdGEgdGhlIG91dHB1dCBidWZmZXIKKyAqQHBhcmFtIGF2cGt0IGlucHV0IHBhY2tldAorICpAcmV0dXJuIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgcmVhZCBmcm9tIHRoZSBpbnB1dCBidWZmZXIKKyAqLworc3RhdGljIGludCBkZWNvZGVfcGFja2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0KiBhdnBrdCkKK3sKKyAgICBXTUFQcm9EZWNvZGVDdHggKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJpdENvbnRleHQqIGdiICA9ICZzLT5wZ2I7CisgICAgY29uc3QgdWludDhfdCogYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgaW50IG51bV9iaXRzX3ByZXZfZnJhbWU7CisgICAgaW50IHBhY2tldF9zZXF1ZW5jZV9udW1iZXI7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisKKyAgICBpZiAocy0+cGFja2V0X2RvbmUgfHwgcy0+cGFja2V0X2xvc3MpIHsKKyAgICAgICAgcy0+cGFja2V0X2RvbmUgPSAwOworCisgICAgICAgIC8qKiBzYW5pdHkgY2hlY2sgZm9yIHRoZSBidWZmZXIgbGVuZ3RoICovCisgICAgICAgIGlmIChidWZfc2l6ZSA8IGF2Y3R4LT5ibG9ja19hbGlnbikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnB1dCBwYWNrZXQgdG9vIHNtYWxsICglZCA8ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSwgYXZjdHgtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgcy0+bmV4dF9wYWNrZXRfc3RhcnQgPSBidWZfc2l6ZSAtIGF2Y3R4LT5ibG9ja19hbGlnbjsKKyAgICAgICAgYnVmX3NpemUgPSBhdmN0eC0+YmxvY2tfYWxpZ247CisgICAgICAgIHMtPmJ1Zl9iaXRfc2l6ZSA9IGJ1Zl9zaXplIDw8IDM7CisKKyAgICAgICAgLyoqIHBhcnNlIHBhY2tldCBoZWFkZXIgKi8KKyAgICAgICAgaW5pdF9nZXRfYml0cyhnYiwgYnVmLCBzLT5idWZfYml0X3NpemUpOworICAgICAgICBwYWNrZXRfc2VxdWVuY2VfbnVtYmVyID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBza2lwX2JpdHMoZ2IsIDIpOworCisgICAgICAgIC8qKiBnZXQgbnVtYmVyIG9mIGJpdHMgdGhhdCBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICBudW1fYml0c19wcmV2X2ZyYW1lID0gZ2V0X2JpdHMoZ2IsIHMtPmxvZzJfZnJhbWVfc2l6ZSk7CisgICAgICAgIGF2X2Rsb2coYXZjdHgsICJwYWNrZXRbJWRdOiBuYnBmICV4XG4iLCBhdmN0eC0+ZnJhbWVfbnVtYmVyLAorICAgICAgICAgICAgICAgIG51bV9iaXRzX3ByZXZfZnJhbWUpOworCisgICAgICAgIC8qKiBjaGVjayBmb3IgcGFja2V0IGxvc3MgKi8KKyAgICAgICAgaWYgKCFzLT5wYWNrZXRfbG9zcyAmJgorICAgICAgICAgICAgKChzLT5wYWNrZXRfc2VxdWVuY2VfbnVtYmVyICsgMSkgJiAweEYpICE9IHBhY2tldF9zZXF1ZW5jZV9udW1iZXIpIHsKKyAgICAgICAgICAgIHMtPnBhY2tldF9sb3NzID0gMTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJQYWNrZXQgbG9zcyBkZXRlY3RlZCEgc2VxICUiUFJJeDgiIHZzICV4XG4iLAorICAgICAgICAgICAgICAgICAgIHMtPnBhY2tldF9zZXF1ZW5jZV9udW1iZXIsIHBhY2tldF9zZXF1ZW5jZV9udW1iZXIpOworICAgICAgICB9CisgICAgICAgIHMtPnBhY2tldF9zZXF1ZW5jZV9udW1iZXIgPSBwYWNrZXRfc2VxdWVuY2VfbnVtYmVyOworCisgICAgICAgIGlmIChudW1fYml0c19wcmV2X2ZyYW1lID4gMCkgeworICAgICAgICAgICAgaW50IHJlbWFpbmluZ19wYWNrZXRfYml0cyA9IHMtPmJ1Zl9iaXRfc2l6ZSAtIGdldF9iaXRzX2NvdW50KGdiKTsKKyAgICAgICAgICAgIGlmIChudW1fYml0c19wcmV2X2ZyYW1lID49IHJlbWFpbmluZ19wYWNrZXRfYml0cykgeworICAgICAgICAgICAgICAgIG51bV9iaXRzX3ByZXZfZnJhbWUgPSByZW1haW5pbmdfcGFja2V0X2JpdHM7CisgICAgICAgICAgICAgICAgcy0+cGFja2V0X2RvbmUgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiogYXBwZW5kIHRoZSBwcmV2aW91cyBmcmFtZSBkYXRhIHRvIHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIHRoZQorICAgICAgICAgICAgICAgIHByZXZpb3VzIHBhY2tldCB0byBjcmVhdGUgYSBmdWxsIGZyYW1lICovCisgICAgICAgICAgICBzYXZlX2JpdHMocywgZ2IsIG51bV9iaXRzX3ByZXZfZnJhbWUsIDEpOworICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgImFjY3VtdWxhdGVkICV4IGJpdHMgb2YgZnJhbWUgZGF0YVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcy0+bnVtX3NhdmVkX2JpdHMgLSBzLT5mcmFtZV9vZmZzZXQpOworCisgICAgICAgICAgICAvKiogZGVjb2RlIHRoZSBjcm9zcyBwYWNrZXQgZnJhbWUgaWYgaXQgaXMgdmFsaWQgKi8KKyAgICAgICAgICAgIGlmICghcy0+cGFja2V0X2xvc3MpCisgICAgICAgICAgICAgICAgZGVjb2RlX2ZyYW1lKHMsIGRhdGEsIGdvdF9mcmFtZV9wdHIpOworICAgICAgICB9IGVsc2UgaWYgKHMtPm51bV9zYXZlZF9iaXRzIC0gcy0+ZnJhbWVfb2Zmc2V0KSB7CisgICAgICAgICAgICBhdl9kbG9nKGF2Y3R4LCAiaWdub3JpbmcgJXggcHJldmlvdXNseSBzYXZlZCBiaXRzXG4iLAorICAgICAgICAgICAgICAgICAgICBzLT5udW1fc2F2ZWRfYml0cyAtIHMtPmZyYW1lX29mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+cGFja2V0X2xvc3MpIHsKKyAgICAgICAgICAgIC8qKiByZXNldCBudW1iZXIgb2Ygc2F2ZWQgYml0cyBzbyB0aGF0IHRoZSBkZWNvZGVyCisgICAgICAgICAgICAgICAgZG9lcyBub3Qgc3RhcnQgdG8gZGVjb2RlIGluY29tcGxldGUgZnJhbWVzIGluIHRoZQorICAgICAgICAgICAgICAgIHMtPmxlbl9wcmVmaXggPT0gMCBjYXNlICovCisgICAgICAgICAgICBzLT5udW1fc2F2ZWRfYml0cyA9IDA7CisgICAgICAgICAgICBzLT5wYWNrZXRfbG9zcyA9IDA7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBmcmFtZV9zaXplOworICAgICAgICBzLT5idWZfYml0X3NpemUgPSAoYXZwa3QtPnNpemUgLSBzLT5uZXh0X3BhY2tldF9zdGFydCkgPDwgMzsKKyAgICAgICAgaW5pdF9nZXRfYml0cyhnYiwgYXZwa3QtPmRhdGEsIHMtPmJ1Zl9iaXRfc2l6ZSk7CisgICAgICAgIHNraXBfYml0cyhnYiwgcy0+cGFja2V0X29mZnNldCk7CisgICAgICAgIGlmIChzLT5sZW5fcHJlZml4ICYmIHJlbWFpbmluZ19iaXRzKHMsIGdiKSA+IHMtPmxvZzJfZnJhbWVfc2l6ZSAmJgorICAgICAgICAgICAgKGZyYW1lX3NpemUgPSBzaG93X2JpdHMoZ2IsIHMtPmxvZzJfZnJhbWVfc2l6ZSkpICYmCisgICAgICAgICAgICBmcmFtZV9zaXplIDw9IHJlbWFpbmluZ19iaXRzKHMsIGdiKSkgeworICAgICAgICAgICAgc2F2ZV9iaXRzKHMsIGdiLCBmcmFtZV9zaXplLCAwKTsKKyAgICAgICAgICAgIGlmICghcy0+cGFja2V0X2xvc3MpCisgICAgICAgICAgICAgICAgcy0+cGFja2V0X2RvbmUgPSAhZGVjb2RlX2ZyYW1lKHMsIGRhdGEsIGdvdF9mcmFtZV9wdHIpOworICAgICAgICB9IGVsc2UgaWYgKCFzLT5sZW5fcHJlZml4CisgICAgICAgICAgICAgICAgICAgJiYgcy0+bnVtX3NhdmVkX2JpdHMgPiBnZXRfYml0c19jb3VudCgmcy0+Z2IpKSB7CisgICAgICAgICAgICAvKiogd2hlbiB0aGUgZnJhbWVzIGRvIG5vdCBoYXZlIGEgbGVuZ3RoIHByZWZpeCwgd2UgZG9uJ3Qga25vdworICAgICAgICAgICAgICAgIHRoZSBjb21wcmVzc2VkIGxlbmd0aCBvZiB0aGUgaW5kaXZpZHVhbCBmcmFtZXMKKyAgICAgICAgICAgICAgICBob3dldmVyLCB3ZSBrbm93IHdoYXQgcGFydCBvZiBhIG5ldyBwYWNrZXQgYmVsb25ncyB0byB0aGUKKyAgICAgICAgICAgICAgICBwcmV2aW91cyBmcmFtZQorICAgICAgICAgICAgICAgIHRoZXJlZm9yZSB3ZSBzYXZlIHRoZSBpbmNvbWluZyBwYWNrZXQgZmlyc3QsIHRoZW4gd2UgYXBwZW5kCisgICAgICAgICAgICAgICAgdGhlICJwcmV2aW91cyBmcmFtZSIgZGF0YSBmcm9tIHRoZSBuZXh0IHBhY2tldCBzbyB0aGF0CisgICAgICAgICAgICAgICAgd2UgZ2V0IGEgYnVmZmVyIHRoYXQgb25seSBjb250YWlucyBmdWxsIGZyYW1lcyAqLworICAgICAgICAgICAgcy0+cGFja2V0X2RvbmUgPSAhZGVjb2RlX2ZyYW1lKHMsIGRhdGEsIGdvdF9mcmFtZV9wdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHMtPnBhY2tldF9kb25lID0gMTsKKyAgICB9CisKKyAgICBpZiAocy0+cGFja2V0X2RvbmUgJiYgIXMtPnBhY2tldF9sb3NzICYmCisgICAgICAgIHJlbWFpbmluZ19iaXRzKHMsIGdiKSA+IDApIHsKKyAgICAgICAgLyoqIHNhdmUgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgc28gdGhhdCBpdCBjYW4gYmUgZGVjb2RlZAorICAgICAgICAgICAgd2l0aCB0aGUgbmV4dCBwYWNrZXQgKi8KKyAgICAgICAgc2F2ZV9iaXRzKHMsIGdiLCByZW1haW5pbmdfYml0cyhzLCBnYiksIDApOworICAgIH0KKworICAgIHMtPnBhY2tldF9vZmZzZXQgPSBnZXRfYml0c19jb3VudChnYikgJiA3OworICAgIGlmIChzLT5wYWNrZXRfbG9zcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICByZXR1cm4gZ2V0X2JpdHNfY291bnQoZ2IpID4+IDM7Cit9CisKKy8qKgorICpAYnJpZWYgQ2xlYXIgZGVjb2RlciBidWZmZXJzIChmb3Igc2Vla2luZykuCisgKkBwYXJhbSBhdmN0eCBjb2RlYyBjb250ZXh0CisgKi8KK3N0YXRpYyB2b2lkIGZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBXTUFQcm9EZWNvZGVDdHggKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworICAgIC8qKiByZXNldCBvdXRwdXQgYnVmZmVyIGFzIGEgcGFydCBvZiBpdCBpcyB1c2VkIGR1cmluZyB0aGUgd2luZG93aW5nIG9mIGEKKyAgICAgICAgbmV3IGZyYW1lICovCisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKQorICAgICAgICBtZW1zZXQocy0+Y2hhbm5lbFtpXS5vdXQsIDAsIHMtPnNhbXBsZXNfcGVyX2ZyYW1lICoKKyAgICAgICAgICAgICAgIHNpemVvZigqcy0+Y2hhbm5lbFtpXS5vdXQpKTsKKyAgICBzLT5wYWNrZXRfbG9zcyA9IDE7Cit9CisKKworLyoqCisgKkBicmllZiB3bWFwcm8gZGVjb2RlcgorICovCitBVkNvZGVjIGZmX3dtYXByb19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ3bWFwcm8iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIEF1ZGlvIDkgUHJvZmVzc2lvbmFsIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dNQVBSTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoV01BUHJvRGVjb2RlQ3R4KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9wYWNrZXQsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX1NVQkZSQU1FUyB8IENPREVDX0NBUF9EUjEsCisgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy93bWF2b2ljZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvd21hdm9pY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjczN2FiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvd21hdm9pY2UuYwpAQCAtMCwwICsxLDIwNzUgQEAKKy8qCisgKiBXaW5kb3dzIE1lZGlhIEF1ZGlvIFZvaWNlIGRlY29kZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUm9uYWxkIFMuIEJ1bHRqZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgV2luZG93cyBNZWRpYSBBdWRpbyBWb2ljZSBjb21wYXRpYmxlIGRlY29kZXIKKyAqIEBhdXRob3IgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amVAZ21haWwuY29tPgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJ3bWF2b2ljZV9kYXRhLmgiCisjaW5jbHVkZSAiY2VscF9maWx0ZXJzLmgiCisjaW5jbHVkZSAiYWNlbHBfdmVjdG9ycy5oIgorI2luY2x1ZGUgImFjZWxwX2ZpbHRlcnMuaCIKKyNpbmNsdWRlICJsc3AuaCIKKyNpbmNsdWRlICJkY3QuaCIKKyNpbmNsdWRlICJyZGZ0LmgiCisjaW5jbHVkZSAic2luZXdpbi5oIgorCisjZGVmaW5lIE1BWF9CTE9DS1MgICAgICAgICAgIDggICAvLy88IG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyBwZXIgZnJhbWUKKyNkZWZpbmUgTUFYX0xTUFMgICAgICAgICAgICAgMTYgIC8vLzwgbWF4aW11bSBmaWx0ZXIgb3JkZXIKKyNkZWZpbmUgTUFYX0xTUFNfQUxJR04xNiAgICAgMTYgIC8vLzwgc2FtZSBhcyAjTUFYX0xTUFM7IG5lZWRzIHRvIGJlIG11bHRpcGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG9mIDE2IGZvciBBU00gaW5wdXQgYnVmZmVyIGFsaWdubWVudAorI2RlZmluZSBNQVhfRlJBTUVTICAgICAgICAgICAzICAgLy8vPCBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgcGVyIHN1cGVyZnJhbWUKKyNkZWZpbmUgTUFYX0ZSQU1FU0laRSAgICAgICAgMTYwIC8vLzwgbWF4aW11bSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUKKyNkZWZpbmUgTUFYX1NJR05BTF9ISVNUT1JZICAgNDE2IC8vLzwgbWF4aW11bSBleGNpdGF0aW9uIHNpZ25hbCBoaXN0b3J5CisjZGVmaW5lIE1BWF9TRlJBTUVTSVpFICAgICAgIChNQVhfRlJBTUVTSVpFICogTUFYX0ZSQU1FUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbWF4aW11bSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgc3VwZXJmcmFtZQorI2RlZmluZSBTRlJBTUVfQ0FDSEVfTUFYU0laRSAyNTYgLy8vPCBtYXhpbXVtIGNhY2hlIHNpemUgZm9yIGZyYW1lIGRhdGEgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB3YXMgc3BsaXQgb3ZlciB0d28gcGFja2V0cworI2RlZmluZSBWTENfTkJJVFMgICAgICAgICAgICA2ICAgLy8vPCBudW1iZXIgb2YgYml0cyB0byByZWFkIHBlciBWTEMgaXRlcmF0aW9uCisKKy8qKgorICogRnJhbWUgdHlwZSBWTEMgY29kaW5nLgorICovCitzdGF0aWMgVkxDIGZyYW1lX3R5cGVfdmxjOworCisvKioKKyAqIEFkYXB0aXZlIGNvZGVib29rIHR5cGVzLgorICovCitlbnVtIHsKKyAgICBBQ0JfVFlQRV9OT05FICAgICAgID0gMCwgLy8vPCBubyBhZGFwdGl2ZSBjb2RlYm9vayAob25seSBoYXJkY29kZWQgZml4ZWQpCisgICAgQUNCX1RZUEVfQVNZTU1FVFJJQyA9IDEsIC8vLzwgYWRhcHRpdmUgY29kZWJvb2sgd2l0aCBwZXItZnJhbWUgcGl0Y2gsIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgd2UgaW50ZXJwb2xhdGUgdG8gZ2V0IGEgcGVyLXNhbXBsZSBwaXRjaC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBTaWduYWwgaXMgZ2VuZXJhdGVkIHVzaW5nIGFuIGFzeW1tZXRyaWMgc2luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHdpbmRvdyBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEBub3RlIHNlZSAjd21hdm9pY2VfaXBvbDFfY29lZmZzCisgICAgQUNCX1RZUEVfSEFNTUlORyAgICA9IDIgIC8vLzwgUGVyLWJsb2NrIHBpdGNoIHdpdGggc2lnbmFsIGdlbmVyYXRpb24gdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBhIEhhbW1pbmcgc2luYyB3aW5kb3cgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBAbm90ZSBzZWUgI3dtYXZvaWNlX2lwb2wyX2NvZWZmcworfTsKKworLyoqCisgKiBGaXhlZCBjb2RlYm9vayB0eXBlcy4KKyAqLworZW51bSB7CisgICAgRkNCX1RZUEVfU0lMRU5DRSAgICA9IDAsIC8vLzwgY29tZm9ydCBub2lzZSBkdXJpbmcgc2lsZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGdlbmVyYXRlZCBmcm9tIGEgaGFyZGNvZGVkIChmaXhlZCkgY29kZWJvb2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB3aXRoIHBlci1mcmFtZSAobG93KSBnYWluIHZhbHVlcworICAgIEZDQl9UWVBFX0hBUkRDT0RFRCAgPSAxLCAvLy88IGhhcmRjb2RlZCAoZml4ZWQpIGNvZGVib29rIHdpdGggcGVyLWJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZ2FpbiB2YWx1ZXMKKyAgICBGQ0JfVFlQRV9BV19QVUxTRVMgID0gMiwgLy8vPCBQaXRjaC1hZGFwdGl2ZSB3aW5kb3cgKEFXKSBwdWxzZSBzaWduYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHVzZWQgaW4gcGFydGljdWxhciBmb3IgbG93LWJpdHJhdGUgc3RyZWFtcworICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMgPSAzLCAvLy88IElubm92YXRpb24gKGZpeGVkKSBjb2RlYm9vayBwdWxzZSBzZXRzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY29tYmluYXRpb25zIG9mIGVpdGhlciBzaW5nbGUgcHVsc2VzIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcHVsc2UgcGFpcnMKK307CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgZnJhbWUgdHlwZXMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnJhbWVfdHlwZV9kZXNjIHsKKyAgICB1aW50OF90IG5fYmxvY2tzOyAgICAgLy8vPCBhbW91bnQgb2YgYmxvY2tzIHBlciBmcmFtZSAoZWFjaCBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IChjb250YWlucyAxNjAvI25fYmxvY2tzIHNhbXBsZXMpCisgICAgdWludDhfdCBsb2dfbl9ibG9ja3M7IC8vLzwgbG9nMigjbl9ibG9ja3MpCisgICAgdWludDhfdCBhY2JfdHlwZTsgICAgIC8vLzwgQWRhcHRpdmUgY29kZWJvb2sgdHlwZSAoQUNCX1RZUEVfKikKKyAgICB1aW50OF90IGZjYl90eXBlOyAgICAgLy8vPCBGaXhlZCBjb2RlYm9vayB0eXBlIChGQ0JfVFlQRV8qKQorICAgIHVpbnQ4X3QgZGJsX3B1bHNlczsgICAvLy88IGhvdyBtYW55IHB1bHNlIHZlY3RvcnMgaGF2ZSBwdWxzZSBwYWlycworICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IChyYXRoZXIgdGhhbiBqdXN0IG9uZSBzaW5nbGUgcHVsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgb25seSBpZiAjZmNiX3R5cGUgPT0gI0ZDQl9UWVBFX0VYQ19QVUxTRVMKKyAgICB1aW50MTZfdCBmcmFtZV9zaXplOyAgLy8vPCB0aGUgYW1vdW50IG9mIGJpdHMgdGhhdCBtYWtlIHVwIHRoZSBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGRhdGEgKHBlciBmcmFtZSkKK30gZnJhbWVfZGVzY3NbMTddID0geworICAgIHsgMSwgMCwgQUNCX1RZUEVfTk9ORSwgICAgICAgRkNCX1RZUEVfU0lMRU5DRSwgICAgMCwgICAwIH0sCisgICAgeyAyLCAxLCBBQ0JfVFlQRV9OT05FLCAgICAgICBGQ0JfVFlQRV9IQVJEQ09ERUQsICAwLCAgMjggfSwKKyAgICB7IDIsIDEsIEFDQl9UWVBFX0FTWU1NRVRSSUMsIEZDQl9UWVBFX0FXX1BVTFNFUywgIDAsICA0NiB9LAorICAgIHsgMiwgMSwgQUNCX1RZUEVfQVNZTU1FVFJJQywgRkNCX1RZUEVfRVhDX1BVTFNFUywgMiwgIDgwIH0sCisgICAgeyAyLCAxLCBBQ0JfVFlQRV9BU1lNTUVUUklDLCBGQ0JfVFlQRV9FWENfUFVMU0VTLCA1LCAxMDQgfSwKKyAgICB7IDQsIDIsIEFDQl9UWVBFX0FTWU1NRVRSSUMsIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDAsIDEwOCB9LAorICAgIHsgNCwgMiwgQUNCX1RZUEVfQVNZTU1FVFJJQywgRkNCX1RZUEVfRVhDX1BVTFNFUywgMiwgMTMyIH0sCisgICAgeyA0LCAyLCBBQ0JfVFlQRV9BU1lNTUVUUklDLCBGQ0JfVFlQRV9FWENfUFVMU0VTLCA1LCAxNjggfSwKKyAgICB7IDIsIDEsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDAsICA2NCB9LAorICAgIHsgMiwgMSwgQUNCX1RZUEVfSEFNTUlORywgICAgRkNCX1RZUEVfRVhDX1BVTFNFUywgMiwgIDgwIH0sCisgICAgeyAyLCAxLCBBQ0JfVFlQRV9IQU1NSU5HLCAgICBGQ0JfVFlQRV9FWENfUFVMU0VTLCA1LCAxMDQgfSwKKyAgICB7IDQsIDIsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDAsIDEwOCB9LAorICAgIHsgNCwgMiwgQUNCX1RZUEVfSEFNTUlORywgICAgRkNCX1RZUEVfRVhDX1BVTFNFUywgMiwgMTMyIH0sCisgICAgeyA0LCAyLCBBQ0JfVFlQRV9IQU1NSU5HLCAgICBGQ0JfVFlQRV9FWENfUFVMU0VTLCA1LCAxNjggfSwKKyAgICB7IDgsIDMsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDAsIDE3NiB9LAorICAgIHsgOCwgMywgQUNCX1RZUEVfSEFNTUlORywgICAgRkNCX1RZUEVfRVhDX1BVTFNFUywgMiwgMjA4IH0sCisgICAgeyA4LCAzLCBBQ0JfVFlQRV9IQU1NSU5HLCAgICBGQ0JfVFlQRV9FWENfUFVMU0VTLCA1LCAyNTYgfQorfTsKKworLyoqCisgKiBXTUEgVm9pY2UgZGVjb2RpbmcgY29udGV4dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qKgorICAgICAqIEBuYW1lIEdsb2JhbCB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSBzdHJlYW0gaGVhZGVyIC8gZXh0cmFkYXRhIG9yIHVzZWQgYWxsIG92ZXIuCisgICAgICogQHsKKyAgICAgKi8KKyAgICBHZXRCaXRDb250ZXh0IGdiOyAgICAgICAgICAgICAvLy88IHBhY2tldCBiaXRyZWFkZXIuIER1cmluZyBkZWNvZGVyIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpdCBjb250YWlucyB0aGUgZXh0cmFkYXRhIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBkZW11eGVyLiBEdXJpbmcgZGVjb2RpbmcsIGl0IGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwYWNrZXQgZGF0YS4KKyAgICBpbnQ4X3QgdmJtX3RyZWVbMjVdOyAgICAgICAgICAvLy88IGNvbnZlcnRzIFZMQyBjb2RlcyB0byBmcmFtZSB0eXBlCisKKyAgICBpbnQgc3BpbGxvdmVyX2JpdHNpemU7ICAgICAgICAvLy88IG51bWJlciBvZiBiaXRzIHVzZWQgdG8gc3BlY2lmeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgI3NwaWxsb3Zlcl9uYml0cyBpbiB0aGUgcGFja2V0IGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgPSBjZWlsKGxvZzIoY3R4LT5ibG9ja19hbGlnbiA8PCAzKSkKKyAgICBpbnQgaGlzdG9yeV9uc2FtcGxlczsgICAgICAgICAvLy88IG51bWJlciBvZiBzYW1wbGVzIGluIGhpc3RvcnkgZm9yIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcHJlZGljdGlvbiAodGhyb3VnaCBBQ0IpCisKKyAgICAvKiBwb3N0ZmlsdGVyIHNwZWNpZmljIHZhbHVlcyAqLworICAgIGludCBkb19hcGY7ICAgICAgICAgICAgICAgICAgIC8vLzwgd2hldGhlciB0byBhcHBseSB0aGUgYXZlcmFnZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHByb2plY3Rpb24gZmlsdGVyIChBUEYpCisgICAgaW50IGRlbm9pc2Vfc3RyZW5ndGg7ICAgICAgICAgLy8vPCBzdHJlbmd0aCBvZiBkZW5vaXNpbmcgaW4gV2llbmVyIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgWzAtMTFdCisgICAgaW50IGRlbm9pc2VfdGlsdF9jb3JyOyAgICAgICAgLy8vPCBXaGV0aGVyIHRvIGFwcGx5IHRpbHQgY29ycmVjdGlvbiB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFdpZW5lciBmaWx0ZXIgY29lZmZpY2llbnRzIChwb3N0ZmlsdGVyKQorICAgIGludCBkY19sZXZlbDsgICAgICAgICAgICAgICAgIC8vLzwgUHJlZGljdGVkIGFtb3VudCBvZiBEQyBub2lzZSwgYmFzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG9uIHdoaWNoIGEgREMgcmVtb3ZhbCBmaWx0ZXIgaXMgdXNlZAorCisgICAgaW50IGxzcHM7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgTFNQcyBwZXIgZnJhbWUgWzEwIG9yIDE2XQorICAgIGludCBsc3BfcV9tb2RlOyAgICAgICAgICAgICAgIC8vLzwgZGVmaW5lcyBxdWFudGl6ZXIgZGVmYXVsdHMgWzAsIDFdCisgICAgaW50IGxzcF9kZWZfbW9kZTsgICAgICAgICAgICAgLy8vPCBkZWZpbmVzIGRpZmZlcmVudCBzZXRzIG9mIExTUCBkZWZhdWx0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgWzAsIDFdCisgICAgaW50IGZyYW1lX2xzcF9iaXRzaXplOyAgICAgICAgLy8vPCBzaXplIChpbiBiaXRzKSBvZiBMU1BzLCB3aGVuIGVuY29kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHBlci1mcmFtZSAoaW5kZXBlbmRlbnQgY29kaW5nKQorICAgIGludCBzZnJhbWVfbHNwX2JpdHNpemU7ICAgICAgIC8vLzwgc2l6ZSAoaW4gYml0cykgb2YgTFNQcywgd2hlbiBlbmNvZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwZXIgc3VwZXJmcmFtZSAocmVzaWR1YWwgY29kaW5nKQorCisgICAgaW50IG1pbl9waXRjaF92YWw7ICAgICAgICAgICAgLy8vPCBiYXNlIHZhbHVlIGZvciBwaXRjaCBwYXJzaW5nIGNvZGUKKyAgICBpbnQgbWF4X3BpdGNoX3ZhbDsgICAgICAgICAgICAvLy88IG1heCB2YWx1ZSArIDEgZm9yIHBpdGNoIHBhcnNpbmcKKyAgICBpbnQgcGl0Y2hfbmJpdHM7ICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBiaXRzIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHBpdGNoIHZhbHVlIGluIHRoZSBmcmFtZSBoZWFkZXIKKyAgICBpbnQgYmxvY2tfcGl0Y2hfbmJpdHM7ICAgICAgICAvLy88IG51bWJlciBvZiBiaXRzIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZpcnN0IGJsb2NrJ3MgcGl0Y2ggdmFsdWUKKyAgICBpbnQgYmxvY2tfcGl0Y2hfcmFuZ2U7ICAgICAgICAvLy88IHJhbmdlIG9mIHRoZSBibG9jayBwaXRjaAorICAgIGludCBibG9ja19kZWx0YV9waXRjaF9uYml0czsgIC8vLzwgbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBzcGVjaWZ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZGVsdGEgcGl0Y2ggYmV0d2VlbiB0aGlzIGFuZCB0aGUgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYmxvY2sncyBwaXRjaCB2YWx1ZSwgdXNlZCBpbiBhbGwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmaXJzdCBibG9jaworICAgIGludCBibG9ja19kZWx0YV9waXRjaF9ocmFuZ2U7IC8vLzwgMS8yIHJhbmdlIG9mIHRoZSBkZWx0YSAoZnVsbCByYW5nZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZnJvbSAtdGhpcyB0byArdGhpcy0xKQorICAgIHVpbnQxNl90IGJsb2NrX2NvbnZfdGFibGVbNF07IC8vLzwgYm91bmRhcmllcyBmb3IgYmxvY2sgcGl0Y2ggdW5pdC9zY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY29udmVyc2lvbgorCisgICAgLyoqCisgICAgICogQH0KKyAgICAgKgorICAgICAqIEBuYW1lIFBhY2tldCB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSBwYWNrZXQgaGVhZGVyIG9yIHJlbGF0ZWQgdG8gYSBwYWNrZXQuCisgICAgICoKKyAgICAgKiBBIHBhY2tldCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgc2luZ2xlIHVuaXQgb2YgZGF0YSBwcm92aWRlZCB0byB0aGlzCisgICAgICogZGVjb2RlciBieSB0aGUgZGVtdXhlci4KKyAgICAgKiBAeworICAgICAqLworICAgIGludCBzcGlsbG92ZXJfbmJpdHM7ICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHByZXZpb3VzIHBhY2tldCdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsYXN0IHN1cGVyZnJhbWUgcHJlY2VkaW5nIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHBhY2tldCdzIGZpcnN0IGZ1bGwgc3VwZXJmcmFtZSAodXNlZnVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmb3IgcmUtc3luY2hyb25pemF0aW9uIGFsc28pCisgICAgaW50IGhhc19yZXNpZHVhbF9sc3BzOyAgICAgICAgLy8vPCBpZiBzZXQsIHN1cGVyZnJhbWVzIGNvbnRhaW4gb25lIHNldCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTFNQcyB0aGF0IGNvdmVyIGFsbCBmcmFtZXMsIGVuY29kZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGluZGVwZW5kZW50IGFuZCByZXNpZHVhbCBMU1BzOyBpZiBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHNldCwgZWFjaCBmcmFtZSBjb250YWlucyBpdHMgb3duLCBmdWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5kZXBlbmRlbnQsIExTUHMKKyAgICBpbnQgc2tpcF9iaXRzX25leHQ7ICAgICAgICAgICAvLy88IG51bWJlciBvZiBiaXRzIHRvIHNraXAgYXQgdGhlIG5leHQgY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdG8gI3dtYXZvaWNlX2RlY29kZV9wYWNrZXQoKSAoc2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHRoZXkncmUgcGFydCBvZiB0aGUgcHJldmlvdXMgc3VwZXJmcmFtZSkKKworICAgIHVpbnQ4X3Qgc2ZyYW1lX2NhY2hlW1NGUkFNRV9DQUNIRV9NQVhTSVpFICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjYWNoZSBmb3Igc3VwZXJmcmFtZSBkYXRhIHNwbGl0IG92ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG11bHRpcGxlIHBhY2tldHMKKyAgICBpbnQgc2ZyYW1lX2NhY2hlX3NpemU7ICAgICAgICAvLy88IHNldCB0byA+MCBpZiB3ZSBoYXZlIGRhdGEgZnJvbSBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgKGluY29tcGxldGUpIHN1cGVyZnJhbWUgZnJvbSBhIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwYWNrZXQgdGhhdCBzcGlsbGVkIG92ZXIgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHBhY2tldDsgc3BlY2lmaWVzIHRoZSBhbW91bnQgb2YgYml0cyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgI3NmcmFtZV9jYWNoZQorICAgIFB1dEJpdENvbnRleHQgcGI7ICAgICAgICAgICAgIC8vLzwgYml0c3RyZWFtIHdyaXRlciBmb3IgI3NmcmFtZV9jYWNoZQorCisgICAgLyoqCisgICAgICogQH0KKyAgICAgKgorICAgICAqIEBuYW1lIEZyYW1lIGFuZCBzdXBlcmZyYW1lIHZhbHVlcworICAgICAqIFN1cGVyZnJhbWUgYW5kIGZyYW1lIGRhdGEgLSB0aGVzZSBjYW4gY2hhbmdlIGZyb20gZnJhbWUgdG8gZnJhbWUsCisgICAgICogYWx0aG91Z2ggc29tZSBvZiB0aGVtIGRvIGluIHRoYXQgY2FzZSBzZXJ2ZSBhcyBhIGNhY2hlIC8gaGlzdG9yeSBmb3IKKyAgICAgKiB0aGUgbmV4dCBmcmFtZSBvciBzdXBlcmZyYW1lLgorICAgICAqIEB7CisgICAgICovCisgICAgZG91YmxlIHByZXZfbHNwc1tNQVhfTFNQU107ICAgLy8vPCBMU1BzIG9mIHRoZSBsYXN0IGZyYW1lIG9mIHRoZSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc3VwZXJmcmFtZQorICAgIGludCBsYXN0X3BpdGNoX3ZhbDsgICAgICAgICAgIC8vLzwgcGl0Y2ggdmFsdWUgb2YgdGhlIHByZXZpb3VzIGZyYW1lCisgICAgaW50IGxhc3RfYWNiX3R5cGU7ICAgICAgICAgICAgLy8vPCBmcmFtZSB0eXBlIFswLTJdIG9mIHRoZSBwcmV2aW91cyBmcmFtZQorICAgIGludCBwaXRjaF9kaWZmX3NoMTY7ICAgICAgICAgIC8vLzwgKChjdXJfcGl0Y2hfdmFsIC0gI2xhc3RfcGl0Y2hfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgPDwgMTYpIC8gI01BWF9GUkFNRVNJWkUKKyAgICBmbG9hdCBzaWxlbmNlX2dhaW47ICAgICAgICAgICAvLy88IHNldCBmb3IgdXNlIGluIGJsb2NrcyBpZiAjQUNCX1RZUEVfTk9ORQorCisgICAgaW50IGF3X2lkeF9pc19leHQ7ICAgICAgICAgICAgLy8vPCB3aGV0aGVyIHRoZSBBVyBpbmRleCB3YXMgZW5jb2RlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgOCBiaXRzIChpbnN0ZWFkIG9mIDYpCisgICAgaW50IGF3X3B1bHNlX3JhbmdlOyAgICAgICAgICAgLy8vPCB0aGUgcmFuZ2Ugb3ZlciB3aGljaCAjYXdfcHVsc2Vfc2V0MSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjYW4gYXBwbHkgdGhlIHB1bHNlLCByZWxhdGl2ZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHZhbHVlIGluIGF3X2ZpcnN0X3B1bHNlX29mZi4gVGhlIGV4YWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgQVctcHVsc2UgaXMgd2l0aGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBbcHVsc2Vfb2ZmLCBwdWxzZV9vZmYgKyB0aGlzXSwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBkZXBlbmRzIG9uIGJpdHN0cmVhbSB2YWx1ZXM7IFsxNiBvciAyNF0KKyAgICBpbnQgYXdfbl9wdWxzZXNbMl07ICAgICAgICAgICAvLy88IG51bWJlciBvZiBBVy1wdWxzZXMgaW4gZWFjaCBibG9jazsgbm90ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdGhhdCB0aGlzIG51bWJlciBjYW4gYmUgbmVnYXRpdmUgKGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB3aGljaCBjYXNlIGl0IGJhc2ljYWxseSBtZWFucyAiemVybyIpCisgICAgaW50IGF3X2ZpcnN0X3B1bHNlX29mZlsyXTsgICAgLy8vPCBpbmRleCBvZiBmaXJzdCBzYW1wbGUgdG8gd2hpY2ggdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGFwcGx5IEFXLXB1bHNlcywgb3IgLTB4ZmYgaWYgdW5zZXQKKyAgICBpbnQgYXdfbmV4dF9wdWxzZV9vZmZfY2FjaGU7ICAvLy88IHRoZSBwb3NpdGlvbiAocmVsYXRpdmUgdG8gc3RhcnQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzZWNvbmQgYmxvY2spIGF0IHdoaWNoIHB1bHNlcyBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHN0YXJ0IHRvIGJlIHBvc2l0aW9uZWQsIHNlcnZlcyBhcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjYWNoZSBmb3IgcGl0Y2gtYWRhcHRpdmUgd2luZG93IHB1bHNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYmV0d2VlbiBibG9ja3MKKworICAgIGludCBmcmFtZV9jbnRyOyAgICAgICAgICAgICAgIC8vLzwgY3VycmVudCBmcmFtZSBpbmRleCBbMCAtIDB4RkZGRV07IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBvbmx5IHVzZWQgZm9yIGNvbWZvcnQgbm9pc2UgaW4gI3BSTkcoKQorICAgIGZsb2F0IGdhaW5fcHJlZF9lcnJbNl07ICAgICAgIC8vLzwgY2FjaGUgZm9yIGdhaW4gcHJlZGljdGlvbgorICAgIGZsb2F0IGV4Y2l0YXRpb25faGlzdG9yeVtNQVhfU0lHTkFMX0hJU1RPUlldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2FjaGUgb2YgdGhlIHNpZ25hbCBvZiBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc3VwZXJmcmFtZXMsIHVzZWQgYXMgYSBoaXN0b3J5IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc2lnbmFsIGdlbmVyYXRpb24KKyAgICBmbG9hdCBzeW50aF9oaXN0b3J5W01BWF9MU1BTXTsgLy8vPCBzZWUgI2V4Y2l0YXRpb25faGlzdG9yeQorICAgIC8qKgorICAgICAqIEB9CisgICAgICoKKyAgICAgKiBAbmFtZSBQb3N0ZmlsdGVyIHZhbHVlcworICAgICAqCisgICAgICogVmFyaWFibGVzIHVzZWQgZm9yIHBvc3RmaWx0ZXIgaW1wbGVtZW50YXRpb24sIG1vc3RseSBoaXN0b3J5IGZvcgorICAgICAqIHNtb290aGluZyBhbmQgc28gb24sIGFuZCBjb250ZXh0IHZhcmlhYmxlcyBmb3IgRkZUL2lGRlQuCisgICAgICogQHsKKyAgICAgKi8KKyAgICBSREZUQ29udGV4dCByZGZ0LCBpcmRmdDsgICAgICAvLy88IGNvbnRleHRzIGZvciBGRlQtY2FsY3VsYXRpb24gaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwb3N0ZmlsdGVyIChmb3IgZGVub2lzZSBmaWx0ZXIpCisgICAgRENUQ29udGV4dCBkY3QsIGRzdDsgICAgICAgICAgLy8vPCBjb250ZXh0cyBmb3IgcGhhc2Ugc2hpZnQgKGluIEhpbGJlcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHRyYW5zZm9ybSwgcGFydCBvZiBwb3N0ZmlsdGVyKQorICAgIGZsb2F0IHNpbls1MTFdLCBjb3NbNTExXTsgICAgIC8vLzwgOC1iaXQgY29zaW5lL3NpbmUgd2luZG93cyBvdmVyIFstcGkscGldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCByYW5nZQorICAgIGZsb2F0IHBvc3RmaWx0ZXJfYWdjOyAgICAgICAgIC8vLzwgZ2FpbiBjb250cm9sIG1lbW9yeSwgdXNlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgI2FkYXB0aXZlX2dhaW5fY29udHJvbCgpCisgICAgZmxvYXQgZGNmX21lbVsyXTsgICAgICAgICAgICAgLy8vPCBEQyBmaWx0ZXIgaGlzdG9yeQorICAgIGZsb2F0IHplcm9fZXhjX3BmW01BWF9TSUdOQUxfSElTVE9SWSArIE1BWF9TRlJBTUVTSVpFXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHplcm8gZmlsdGVyIG91dHB1dCAoaS5lLiBleGNpdGF0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYnkgcG9zdGZpbHRlcgorICAgIGZsb2F0IGRlbm9pc2VfZmlsdGVyX2NhY2hlW01BWF9GUkFNRVNJWkVdOworICAgIGludCAgIGRlbm9pc2VfZmlsdGVyX2NhY2hlX3NpemU7IC8vLzwgc2FtcGxlcyBpbiAjZGVub2lzZV9maWx0ZXJfY2FjaGUKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCB0aWx0ZWRfbHBjc19wZilbMHg4MF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBhbGlnbmVkIGJ1ZmZlciBmb3IgTFBDIHRpbHRpbmcKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBkZW5vaXNlX2NvZWZmc19wZilbMHg4MF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBhbGlnbmVkIGJ1ZmZlciBmb3IgZGVub2lzZSBjb2VmZmljaWVudHMKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBzeW50aF9maWx0ZXJfb3V0X2J1ZilbMHg4MCArIE1BWF9MU1BTX0FMSUdOMTZdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYWxpZ25lZCBidWZmZXIgZm9yIHBvc3RmaWx0ZXIgc3BlZWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzeW50aGVzaXMKKyAgICAvKioKKyAgICAgKiBAfQorICAgICAqLworfSBXTUFWb2ljZUNvbnRleHQ7CisKKy8qKgorICogU2V0IHVwIHRoZSB2YXJpYWJsZSBiaXQgbW9kZSAoVkJNKSB0cmVlIGZyb20gY29udGFpbmVyIGV4dHJhZGF0YS4KKyAqIEBwYXJhbSBnYiBiaXQgSS9PIGNvbnRleHQuCisgKiAgICAgICAgICAgVGhlIGJpdCBjb250ZXh0IChzLT5nYikgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIGJ5dGUgMjMtNDYgb2YgdGhlCisgKiAgICAgICAgICAgY29udGFpbmVyIGV4dHJhZGF0YSAoaS5lLiB0aGUgb25lcyBjb250YWluaW5nIHRoZSBWQk0gdHJlZSkuCisgKiBAcGFyYW0gdmJtX3RyZWUgcG9pbnRlciB0byBhcnJheSB0byB3aGljaCB0aGUgZGVjb2RlZCBWQk0gdHJlZSB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgd3JpdHRlbi4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvci4KKyAqLworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV92Ym10cmVlKEdldEJpdENvbnRleHQgKmdiLCBpbnQ4X3QgdmJtX3RyZWVbMjVdKQoreworICAgIGludCBjbnRyWzhdID0geyAwIH0sIG4sIHJlczsKKworICAgIG1lbXNldCh2Ym1fdHJlZSwgMHhmZiwgc2l6ZW9mKHZibV90cmVlWzBdKSAqIDI1KTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgMTc7IG4rKykgeworICAgICAgICByZXMgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgICAgIGlmIChjbnRyW3Jlc10gPiAzKSAvLyBzaG91bGQgYmUgPj0gMyArIChyZXMgPT0gNykpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHZibV90cmVlW3JlcyAqIDMgKyBjbnRyW3Jlc10rK10gPSBuOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB3bWF2b2ljZV9pbml0X3N0YXRpY19kYXRhKEFWQ29kZWMgKmNvZGVjKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJpdHNbXSA9IHsKKyAgICAgICAgIDIsICAyLCAgMiwgIDQsICA0LCAgNCwKKyAgICAgICAgIDYsICA2LCAgNiwgIDgsICA4LCAgOCwKKyAgICAgICAgMTAsIDEwLCAxMCwgMTIsIDEyLCAxMiwKKyAgICAgICAgMTQsIDE0LCAxNCwgMTQKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBjb2Rlc1tdID0geworICAgICAgICAgIDB4MDAwMCwgMHgwMDAxLCAweDAwMDIsICAgICAgICAvLyAgICAgICAgICAgICAgMDAvMDEvMTAKKyAgICAgICAgICAweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAgICAgICAgLy8gICAgICAgICAgIDExKzAwLzAxLzEwCisgICAgICAgICAgMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgICAgICAgIC8vICAgICAgICAgMTExMSswMC8wMS8xMAorICAgICAgICAgIDB4MDBmYywgMHgwMGZkLCAweDAwZmUsICAgICAgICAvLyAgICAgICAxMTExMTErMDAvMDEvMTAKKyAgICAgICAgICAweDAzZmMsIDB4MDNmZCwgMHgwM2ZlLCAgICAgICAgLy8gICAgIDExMTExMTExKzAwLzAxLzEwCisgICAgICAgICAgMHgwZmZjLCAweDBmZmQsIDB4MGZmZSwgICAgICAgIC8vICAgMTExMTExMTExMSswMC8wMS8xMAorICAgICAgICAgIDB4M2ZmYywgMHgzZmZkLCAweDNmZmUsIDB4M2ZmZiAvLyAxMTExMTExMTExMTEreHgKKyAgICB9OworCisgICAgSU5JVF9WTENfU1RBVElDKCZmcmFtZV90eXBlX3ZsYywgVkxDX05CSVRTLCBzaXplb2YoYml0cyksCisgICAgICAgICAgICAgICAgICAgIGJpdHMsIDEsIDEsIGNvZGVzLCAyLCAyLCAxMzIpOworfQorCisvKioKKyAqIFNldCB1cCBkZWNvZGVyIHdpdGggcGFyYW1ldGVycyBmcm9tIGRlbXV4ZXIgKGV4dHJhZGF0YSBldGMuKS4KKyAqLworc3RhdGljIGF2X2NvbGQgaW50IHdtYXZvaWNlX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICpjdHgpCit7CisgICAgaW50IG4sIGZsYWdzLCBwaXRjaF9yYW5nZSwgbHNwMTZfZmxhZzsKKyAgICBXTUFWb2ljZUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKworICAgIC8qKgorICAgICAqIEV4dHJhZGF0YSBsYXlvdXQ6CisgICAgICogLSBieXRlICAwLTE4OiBXTUFQcm8taW4tV01BVm9pY2UgZXh0cmFkYXRhIChzZWUgd21hcHJvZGVjLmMpLAorICAgICAqIC0gYnl0ZSAxOS0yMjogZmxhZ3MgZmllbGQgKGFubm95aW5nbHkgaW4gTEU7IHNlZSBiZWxvdyBmb3Iga25vd24KKyAgICAgKiAgICAgICAgICAgICAgIHZhbHVlcyksCisgICAgICogLSBieXRlIDIzLTQ2OiB2YXJpYWJsZSBiaXRtb2RlIHRyZWUgKHJlYWxseSBqdXN0IDE3ICogMyBiaXRzLAorICAgICAqICAgICAgICAgICAgICAgcmVzdCBpcyAwKS4KKyAgICAgKi8KKyAgICBpZiAoY3R4LT5leHRyYWRhdGFfc2l6ZSAhPSA0NikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBleHRyYWRhdGEgc2l6ZSAlZCAoc2hvdWxkIGJlIDQ2KVxuIiwKKyAgICAgICAgICAgICAgIGN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZmxhZ3MgICAgICAgICAgICAgICAgPSBBVl9STDMyKGN0eC0+ZXh0cmFkYXRhICsgMTgpOworICAgIHMtPnNwaWxsb3Zlcl9iaXRzaXplID0gMyArIGF2X2NlaWxfbG9nMihjdHgtPmJsb2NrX2FsaWduKTsKKyAgICBzLT5kb19hcGYgICAgICAgICAgICA9ICAgIGZsYWdzICYgMHgxOworICAgIGlmIChzLT5kb19hcGYpIHsKKyAgICAgICAgZmZfcmRmdF9pbml0KCZzLT5yZGZ0LCAgNywgREZUX1IyQyk7CisgICAgICAgIGZmX3JkZnRfaW5pdCgmcy0+aXJkZnQsIDcsIElERlRfQzJSKTsKKyAgICAgICAgZmZfZGN0X2luaXQoJnMtPmRjdCwgIDYsIERDVF9JKTsKKyAgICAgICAgZmZfZGN0X2luaXQoJnMtPmRzdCwgIDYsIERTVF9JKTsKKworICAgICAgICBmZl9zaW5lX3dpbmRvd19pbml0KHMtPmNvcywgMjU2KTsKKyAgICAgICAgbWVtY3B5KCZzLT5zaW5bMjU1XSwgcy0+Y29zLCAyNTYgKiBzaXplb2Yocy0+Y29zWzBdKSk7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAyNTU7IG4rKykgeworICAgICAgICAgICAgcy0+c2luW25dICAgICAgID0gLXMtPnNpbls1MTAgLSBuXTsKKyAgICAgICAgICAgIHMtPmNvc1s1MTAgLSBuXSA9ICBzLT5jb3Nbbl07CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+ZGVub2lzZV9zdHJlbmd0aCAgPSAgIChmbGFncyA+PiAyKSAmIDB4RjsKKyAgICBpZiAocy0+ZGVub2lzZV9zdHJlbmd0aCA+PSAxMikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBkZW5vaXNlIGZpbHRlciBzdHJlbmd0aCAlZCAobWF4PTExKVxuIiwKKyAgICAgICAgICAgICAgIHMtPmRlbm9pc2Vfc3RyZW5ndGgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcy0+ZGVub2lzZV90aWx0X2NvcnIgPSAhIShmbGFncyAmIDB4NDApOworICAgIHMtPmRjX2xldmVsICAgICAgICAgID0gICAoZmxhZ3MgPj4gNykgJiAweEY7CisgICAgcy0+bHNwX3FfbW9kZSAgICAgICAgPSAhIShmbGFncyAmIDB4MjAwMCk7CisgICAgcy0+bHNwX2RlZl9tb2RlICAgICAgPSAhIShmbGFncyAmIDB4NDAwMCk7CisgICAgbHNwMTZfZmxhZyAgICAgICAgICAgPSAgICBmbGFncyAmIDB4MTAwMDsKKyAgICBpZiAobHNwMTZfZmxhZykgeworICAgICAgICBzLT5sc3BzICAgICAgICAgICAgICAgPSAxNjsKKyAgICAgICAgcy0+ZnJhbWVfbHNwX2JpdHNpemUgID0gMzQ7CisgICAgICAgIHMtPnNmcmFtZV9sc3BfYml0c2l6ZSA9IDYwOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmxzcHMgICAgICAgICAgICAgICA9IDEwOworICAgICAgICBzLT5mcmFtZV9sc3BfYml0c2l6ZSAgPSAyNDsKKyAgICAgICAgcy0+c2ZyYW1lX2xzcF9iaXRzaXplID0gNDg7CisgICAgfQorICAgIGZvciAobiA9IDA7IG4gPCBzLT5sc3BzOyBuKyspCisgICAgICAgIHMtPnByZXZfbHNwc1tuXSA9IE1fUEkgKiAobiArIDEuMCkgLyAocy0+bHNwcyArIDEuMCk7CisKKyAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgY3R4LT5leHRyYWRhdGEgKyAyMiwgKGN0eC0+ZXh0cmFkYXRhX3NpemUgLSAyMikgPDwgMyk7CisgICAgaWYgKGRlY29kZV92Ym10cmVlKCZzLT5nYiwgcy0+dmJtX3RyZWUpIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIFZCTSB0cmVlOyBicm9rZW4gZXh0cmFkYXRhP1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPm1pbl9waXRjaF92YWwgICAgPSAoKGN0eC0+c2FtcGxlX3JhdGUgPDwgOCkgICAgICAvICA0MDAgKyA1MCkgPj4gODsKKyAgICBzLT5tYXhfcGl0Y2hfdmFsICAgID0gKChjdHgtPnNhbXBsZV9yYXRlIDw8IDgpICogMzcgLyAyMDAwICsgNTApID4+IDg7CisgICAgcGl0Y2hfcmFuZ2UgICAgICAgICA9IHMtPm1heF9waXRjaF92YWwgLSBzLT5taW5fcGl0Y2hfdmFsOworICAgIGlmIChwaXRjaF9yYW5nZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGl0Y2ggcmFuZ2U7IGJyb2tlbiBleHRyYWRhdGE/XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHMtPnBpdGNoX25iaXRzICAgICAgPSBhdl9jZWlsX2xvZzIocGl0Y2hfcmFuZ2UpOworICAgIHMtPmxhc3RfcGl0Y2hfdmFsICAgPSA0MDsKKyAgICBzLT5sYXN0X2FjYl90eXBlICAgID0gQUNCX1RZUEVfTk9ORTsKKyAgICBzLT5oaXN0b3J5X25zYW1wbGVzID0gcy0+bWF4X3BpdGNoX3ZhbCArIDg7CisKKyAgICBpZiAocy0+bWluX3BpdGNoX3ZhbCA8IDEgfHwgcy0+aGlzdG9yeV9uc2FtcGxlcyA+IE1BWF9TSUdOQUxfSElTVE9SWSkgeworICAgICAgICBpbnQgbWluX3NyID0gKCgoKDEgPDwgOCkgLSA1MCkgKiA0MDApICsgMHhGRikgPj4gOCwKKyAgICAgICAgICAgIG1heF9zciA9ICgoKChNQVhfU0lHTkFMX0hJU1RPUlkgLSA4KSA8PCA4KSArIDIwNSkgKiAyMDAwIC8gMzcpID4+IDg7CisKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHNhbXBsZXJhdGUgJWQgKG1pbj0lZCwgbWF4PSVkKVxuIiwKKyAgICAgICAgICAgICAgIGN0eC0+c2FtcGxlX3JhdGUsIG1pbl9zciwgbWF4X3NyKTsgLy8gMzIyLTIyMDk3IEh6CisKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICBzLT5ibG9ja19jb252X3RhYmxlWzBdICAgICAgPSBzLT5taW5fcGl0Y2hfdmFsOworICAgIHMtPmJsb2NrX2NvbnZfdGFibGVbMV0gICAgICA9IChwaXRjaF9yYW5nZSAqIDI1KSA+PiA2OworICAgIHMtPmJsb2NrX2NvbnZfdGFibGVbMl0gICAgICA9IChwaXRjaF9yYW5nZSAqIDQ0KSA+PiA2OworICAgIHMtPmJsb2NrX2NvbnZfdGFibGVbM10gICAgICA9IHMtPm1heF9waXRjaF92YWwgLSAxOworICAgIHMtPmJsb2NrX2RlbHRhX3BpdGNoX2hyYW5nZSA9IChwaXRjaF9yYW5nZSA+PiAzKSAmIH4weEY7CisgICAgaWYgKHMtPmJsb2NrX2RlbHRhX3BpdGNoX2hyYW5nZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZGVsdGEgcGl0Y2ggaHJhbmdlOyBicm9rZW4gZXh0cmFkYXRhP1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzLT5ibG9ja19kZWx0YV9waXRjaF9uYml0cyAgPSAxICsgYXZfY2VpbF9sb2cyKHMtPmJsb2NrX2RlbHRhX3BpdGNoX2hyYW5nZSk7CisgICAgcy0+YmxvY2tfcGl0Y2hfcmFuZ2UgICAgICAgID0gcy0+YmxvY2tfY29udl90YWJsZVsyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfY29udl90YWJsZVszXSArIDEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiAocy0+YmxvY2tfY29udl90YWJsZVsxXSAtIDIgKiBzLT5taW5fcGl0Y2hfdmFsKTsKKyAgICBzLT5ibG9ja19waXRjaF9uYml0cyAgICAgICAgPSBhdl9jZWlsX2xvZzIocy0+YmxvY2tfcGl0Y2hfcmFuZ2UpOworCisgICAgY3R4LT5jaGFubmVscyAgICAgICAgICAgICAgID0gMTsKKyAgICBjdHgtPmNoYW5uZWxfbGF5b3V0ICAgICAgICAgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBjdHgtPnNhbXBsZV9mbXQgICAgICAgICAgICAgPSBBVl9TQU1QTEVfRk1UX0ZMVDsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEBuYW1lIFBvc3RmaWx0ZXIgZnVuY3Rpb25zCisgKiBQb3N0ZmlsdGVyIGZ1bmN0aW9ucyAoZ2FpbiBjb250cm9sLCB3aWVuZXIgZGVub2lzZSBmaWx0ZXIsIERDIGZpbHRlciwKKyAqIGthbG1hbiBzbW9vdGhlbmluZywgcGx1cyBzdXJyb3VuZGluZyBjb2RlIHRvIHdyYXAgaXQpCisgKiBAeworICovCisvKioKKyAqIEFkYXB0aXZlIGdhaW4gY29udHJvbCAoYXMgdXNlZCBpbiBwb3N0ZmlsdGVyKS4KKyAqCisgKiBJZGVudGljYWwgdG8gI2ZmX2FkYXB0aXZlX2dhaW5fY29udHJvbCgpIGluIGFjZWxwX3ZlY3RvcnMuYywgZXhjZXB0CisgKiB0aGF0IHRoZSBlbmVyZ3kgaGVyZSBpcyBjYWxjdWxhdGVkIHVzaW5nIHN1bShhYnMoLi4uKSksIHdoZXJlYXMgdGhlCisgKiBvdGhlciBjb2RlY3MgKGUuZy4gQU1SLU5CLCBTSVBSTykgdXNlIHNxcnQoZG90cHJvZHVjdCguLi4pKS4KKyAqCisgKiBAcGFyYW0gb3V0IG91dHB1dCBidWZmZXIgZm9yIGZpbHRlcmVkIHNhbXBsZXMKKyAqIEBwYXJhbSBpbiBpbnB1dCBidWZmZXIgY29udGFpbmluZyB0aGUgc2FtcGxlcyBhcyB0aGV5IGFyZSBhZnRlciB0aGUKKyAqICAgICAgICAgICBwb3N0ZmlsdGVyIHN0ZXBzIHNvIGZhcgorICogQHBhcmFtIHNwZWVjaF9zeW50aCBpbnB1dCBidWZmZXIgY29udGFpbmluZyBzcGVlY2ggc3ludGggYmVmb3JlIHBvc3RmaWx0ZXIKKyAqIEBwYXJhbSBzaXplIGlucHV0IGJ1ZmZlciBzaXplCisgKiBAcGFyYW0gYWxwaGEgZXhwb25lbnRpYWwgZmlsdGVyIGZhY3RvcgorICogQHBhcmFtIGdhaW5fbWVtIHBvaW50ZXIgdG8gZmlsdGVyIG1lbW9yeSAoc2luZ2xlIGZsb2F0KQorICovCitzdGF0aWMgdm9pZCBhZGFwdGl2ZV9nYWluX2NvbnRyb2woZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcGVlY2hfc3ludGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGZsb2F0IGFscGhhLCBmbG9hdCAqZ2Fpbl9tZW0pCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgc3BlZWNoX2VuZXJneSA9IDAuMCwgcG9zdGZpbHRlcl9lbmVyZ3kgPSAwLjAsIGdhaW5fc2NhbGVfZmFjdG9yOworICAgIGZsb2F0IG1lbSA9ICpnYWluX21lbTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgc3BlZWNoX2VuZXJneSAgICAgKz0gZmFic2Yoc3BlZWNoX3N5bnRoW2ldKTsKKyAgICAgICAgcG9zdGZpbHRlcl9lbmVyZ3kgKz0gZmFic2YoaW5baV0pOworICAgIH0KKyAgICBnYWluX3NjYWxlX2ZhY3RvciA9ICgxLjAgLSBhbHBoYSkgKiBzcGVlY2hfZW5lcmd5IC8gcG9zdGZpbHRlcl9lbmVyZ3k7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIG1lbSA9IGFscGhhICogbWVtICsgZ2Fpbl9zY2FsZV9mYWN0b3I7CisgICAgICAgIG91dFtpXSA9IGluW2ldICogbWVtOworICAgIH0KKworICAgICpnYWluX21lbSA9IG1lbTsKK30KKworLyoqCisgKiBLYWxtYW4gc21vb3RoaW5nIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbG9va3MgYmFjayBwaXRjaCArLy0gMyBzYW1wbGVzIGJhY2sgaW50byBoaXN0b3J5IHRvIGZpbmQKKyAqIHRoZSBiZXN0IGZpdHRpbmcgY3VydmUgKHRoYXQgb25lIGdpdmluZyB0aGUgb3B0aW1hbCBnYWluIG9mIHRoZSB0d28KKyAqIHNpZ25hbHMsIGkuZS4gdGhlIGhpZ2hlc3QgZG90IHByb2R1Y3QgYmV0d2VlbiB0aGUgdHdvKSwgYW5kIHRoZW4KKyAqIHVzZXMgdGhhdCBzaWduYWwgaGlzdG9yeSB0byBzbW9vdGhlbiB0aGUgb3V0cHV0IG9mIHRoZSBzcGVlY2ggc3ludGhlc2lzCisgKiBmaWx0ZXIuCisgKgorICogQHBhcmFtIHMgV01BIFZvaWNlIGRlY29kaW5nIGNvbnRleHQKKyAqIEBwYXJhbSBwaXRjaCBwaXRjaCBvZiB0aGUgc3BlZWNoIHNpZ25hbAorICogQHBhcmFtIGluIGlucHV0IHNwZWVjaCBzaWduYWwKKyAqIEBwYXJhbSBvdXQgb3V0cHV0IHBvaW50ZXIgZm9yIHNtb290aGVuZWQgc2lnbmFsCisgKiBAcGFyYW0gc2l6ZSBpbnB1dC9vdXRwdXQgYnVmZmVyIHNpemUKKyAqCisgKiBAcmV0dXJucyAtMSBpZiBubyBzbW9vdGhlbmluZyB0b29rIHBsYWNlLCBlLmcuIGJlY2F1c2Ugbm8gb3B0aW1hbAorICogICAgICAgICAgZml0IGNvdWxkIGJlIGZvdW5kLCBvciAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQga2FsbWFuX3Ntb290aGVuKFdNQVZvaWNlQ29udGV4dCAqcywgaW50IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluLCBmbG9hdCAqb3V0LCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgbjsKKyAgICBmbG9hdCBvcHRpbWFsX2dhaW4gPSAwLCBkb3Q7CisgICAgY29uc3QgZmxvYXQgKnB0ciA9ICZpblstRkZNQVgocy0+bWluX3BpdGNoX3ZhbCwgcGl0Y2ggLSAzKV0sCisgICAgICAgICAgICAgICAgKmVuZCA9ICZpblstRkZNSU4ocy0+bWF4X3BpdGNoX3ZhbCwgcGl0Y2ggKyAzKV0sCisgICAgICAgICAgICAgICAgKmJlc3RfaGlzdF9wdHIgPSBOVUxMOworCisgICAgLyogZmluZCBiZXN0IGZpdHRpbmcgcG9pbnQgaW4gaGlzdG9yeSAqLworICAgIGRvIHsKKyAgICAgICAgZG90ID0gYXZwcml2X3NjYWxhcnByb2R1Y3RfZmxvYXRfYyhpbiwgcHRyLCBzaXplKTsKKyAgICAgICAgaWYgKGRvdCA+IG9wdGltYWxfZ2FpbikgeworICAgICAgICAgICAgb3B0aW1hbF9nYWluICA9IGRvdDsKKyAgICAgICAgICAgIGJlc3RfaGlzdF9wdHIgPSBwdHI7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICgtLXB0ciA+PSBlbmQpOworCisgICAgaWYgKG9wdGltYWxfZ2FpbiA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZG90ID0gYXZwcml2X3NjYWxhcnByb2R1Y3RfZmxvYXRfYyhiZXN0X2hpc3RfcHRyLCBiZXN0X2hpc3RfcHRyLCBzaXplKTsKKyAgICBpZiAoZG90IDw9IDApIC8vIHdvdWxkIGJlIDEuMAorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAob3B0aW1hbF9nYWluIDw9IGRvdCkgeworICAgICAgICBkb3QgPSBkb3QgLyAoZG90ICsgMC42ICogb3B0aW1hbF9nYWluKTsgLy8gMC42MjUtMS4wMDAKKyAgICB9IGVsc2UKKyAgICAgICAgZG90ID0gMC42MjU7CisKKyAgICAvKiBhY3R1YWwgc21vb3RoaW5nICovCisgICAgZm9yIChuID0gMDsgbiA8IHNpemU7IG4rKykKKyAgICAgICAgb3V0W25dID0gYmVzdF9oaXN0X3B0cltuXSArIGRvdCAqIChpbltuXSAtIGJlc3RfaGlzdF9wdHJbbl0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogR2V0IHRoZSB0aWx0IGZhY3RvciBvZiBhIGZvcm1hbnQgZmlsdGVyIGZyb20gaXRzIHRyYW5zZmVyIGZ1bmN0aW9uCisgKiBAc2VlICN0aWx0X2ZhY3RvcigpIGluIGFtcm5iZGVjLmMsIHdoaWNoIGRvZXMgZXNzZW50aWFsbHkgdGhlIHNhbWUsCisgKiAgICAgIGJ1dCBzb21laG93ICg/PykgaXQgZG9lcyBhIHNwZWVjaCBzeW50aGVzaXMgZmlsdGVyIGluIHRoZQorICogICAgICBtaWRkbGUsIHdoaWNoIGlzIG1pc3NpbmcgaGVyZQorICoKKyAqIEBwYXJhbSBscGNzIExQQyBjb2VmZmljaWVudHMKKyAqIEBwYXJhbSBuX2xwY3MgU2l6ZSBvZiBMUEMgYnVmZmVyCisgKiBAcmV0dXJucyB0aGUgdGlsdCBmYWN0b3IKKyAqLworc3RhdGljIGZsb2F0IHRpbHRfZmFjdG9yKGNvbnN0IGZsb2F0ICpscGNzLCBpbnQgbl9scGNzKQoreworICAgIGZsb2F0IHJoMCwgcmgxOworCisgICAgcmgwID0gMS4wICAgICArIGF2cHJpdl9zY2FsYXJwcm9kdWN0X2Zsb2F0X2MobHBjcywgIGxwY3MsICAgIG5fbHBjcyk7CisgICAgcmgxID0gbHBjc1swXSArIGF2cHJpdl9zY2FsYXJwcm9kdWN0X2Zsb2F0X2MobHBjcywgJmxwY3NbMV0sIG5fbHBjcyAtIDEpOworCisgICAgcmV0dXJuIHJoMSAvIHJoMDsKK30KKworLyoqCisgKiBEZXJpdmUgZGVub2lzZSBmaWx0ZXIgY29lZmZpY2llbnRzIChpbiByZWFsIGRvbWFpbikgZnJvbSB0aGUgTFBDcy4KKyAqLworc3RhdGljIHZvaWQgY2FsY19pbnB1dF9yZXNwb25zZShXTUFWb2ljZUNvbnRleHQgKnMsIGZsb2F0ICpscGNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmNiX3R5cGUsIGZsb2F0ICpjb2VmZnMsIGludCByZW1haW5kZXIpCit7CisgICAgZmxvYXQgbGFzdF9jb2VmZiwgbWluID0gMTUuMCwgbWF4ID0gLTE1LjA7CisgICAgZmxvYXQgaXJhbmdlLCBhbmdsZV9tdWwsIGdhaW5fbXVsLCByYW5nZSwgc3E7CisgICAgaW50IG4sIGlkeDsKKworICAgIC8qIENyZWF0ZSBmcmVxdWVuY3kgcG93ZXIgc3BlY3RydW0gb2Ygc3BlZWNoIGlucHV0IChpLmUuIFJERlQgb2YgTFBDcykgKi8KKyAgICBzLT5yZGZ0LnJkZnRfY2FsYygmcy0+cmRmdCwgbHBjcyk7CisjZGVmaW5lIGxvZ19yYW5nZSh2YXIsIGFzc2lnbikgZG8geyBcCisgICAgICAgIGZsb2F0IHRtcCA9IGxvZzEwZihhc3NpZ24pOyAgdmFyID0gdG1wOyBcCisgICAgICAgIG1heCAgICAgICA9IEZGTUFYKG1heCwgdG1wKTsgbWluID0gRkZNSU4obWluLCB0bXApOyBcCisgICAgfSB3aGlsZSAoMCkKKyAgICBsb2dfcmFuZ2UobGFzdF9jb2VmZiwgIGxwY3NbMV0gICAgICAgICAqIGxwY3NbMV0pOworICAgIGZvciAobiA9IDE7IG4gPCA2NDsgbisrKQorICAgICAgICBsb2dfcmFuZ2UobHBjc1tuXSwgbHBjc1tuICogMl0gICAgICogbHBjc1tuICogMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBjc1tuICogMiArIDFdICogbHBjc1tuICogMiArIDFdKTsKKyAgICBsb2dfcmFuZ2UobHBjc1swXSwgICAgIGxwY3NbMF0gICAgICAgICAqIGxwY3NbMF0pOworI3VuZGVmIGxvZ19yYW5nZQorICAgIHJhbmdlICAgID0gbWF4IC0gbWluOworICAgIGxwY3NbNjRdID0gbGFzdF9jb2VmZjsKKworICAgIC8qIE5vdywgdXNlIHRoaXMgc3BlY3RydW0gdG8gcGljayBvdXQgdGhlc2UgZnJlcXVlbmNpZXMgd2l0aCBoaWdoZXIKKyAgICAgKiAocmVsYXRpdmUpIHBvd2VyL2VuZXJneSAod2hpY2ggd2UgdGhlbiB0YWtlIHRvIGJlICJub3Qgbm9pc2UiKSwKKyAgICAgKiBhbmQgc2V0IHVwIGEgdGFibGUgKHN0aWxsIGluIGxwY1tdKSBvZiAocmVsYXRpdmUpIGdhaW5zIHBlciBmcmVxdWVuY3kuCisgICAgICogVGhlc2UgZnJlcXVlbmNpZXMgd2lsbCBiZSBtYWludGFpbmVkLCB3aGlsZSBvdGhlcnMgKCJub2lzZSIpIHdpbGwgYmUKKyAgICAgKiBkZWNyZWFzZWQgaW4gdGhlIGZpbHRlciBvdXRwdXQuICovCisgICAgaXJhbmdlICAgID0gNjQuMCAvIHJhbmdlOyAvLyBzbyBpcmFuZ2UqKG1heC12YWx1ZSkgaXMgaW4gdGhlIHJhbmdlIFswLCA2M10KKyAgICBnYWluX211bCAgPSByYW5nZSAqIChmY2JfdHlwZSA9PSBGQ0JfVFlQRV9IQVJEQ09ERUQgPyAoNS4wIC8gMTMuMCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1LjAgLyAxNC43KSk7CisgICAgYW5nbGVfbXVsID0gZ2Fpbl9tdWwgKiAoOC4wICogTV9MTjEwIC8gTV9QSSk7CisgICAgZm9yIChuID0gMDsgbiA8PSA2NDsgbisrKSB7CisgICAgICAgIGZsb2F0IHB3cjsKKworICAgICAgICBpZHggPSBGRk1BWCgwLCBscmludCgobWF4IC0gbHBjc1tuXSkgKiBpcmFuZ2UpIC0gMSk7CisgICAgICAgIHB3ciA9IHdtYXZvaWNlX2Rlbm9pc2VfcG93ZXJfdGFibGVbcy0+ZGVub2lzZV9zdHJlbmd0aF1baWR4XTsKKyAgICAgICAgbHBjc1tuXSA9IGFuZ2xlX211bCAqIHB3cjsKKworICAgICAgICAvKiA3MC41NyA9fiAxL2xvZzEwKDEuMDMzMTY2MykgKi8KKyAgICAgICAgaWR4ID0gKHB3ciAqIGdhaW5fbXVsIC0gMC4wMjk1KSAqIDcwLjU3MDUyNjEyMzsKKyAgICAgICAgaWYgKGlkeCA+IDEyNykgeyAvLyBmYWxsIGJhY2sgaWYgaW5kZXggZmFsbHMgb3V0c2lkZSB0YWJsZSByYW5nZQorICAgICAgICAgICAgY29lZmZzW25dID0gd21hdm9pY2VfZW5lcmd5X3RhYmxlWzEyN10gKgorICAgICAgICAgICAgICAgICAgICAgICAgcG93ZigxLjAzMzE2NjMsIGlkeCAtIDEyNyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgY29lZmZzW25dID0gd21hdm9pY2VfZW5lcmd5X3RhYmxlW0ZGTUFYKDAsIGlkeCldOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgSGlsYmVydCB0cmFuc2Zvcm0gb2YgdGhlIGdhaW5zLCB3aGljaCB3ZSBkbyAoc2luY2UgdGhpcworICAgICAqIGlzIGEgc2luZSBpbnB1dCkgYnkgZG9pbmcgYSBwaGFzZSBzaGlmdCAoaW4gdGhlb3J5LCBIKHNpbigpKT1jb3MoKSkuCisgICAgICogSGlsYmVydF9UcmFuc2Zvcm0oUkRGVCh4KSkgPSBMYXBsYWNlX1RyYW5zZm9ybSh4KSwgd2hpY2ggY2FsY3VsYXRlcyB0aGUKKyAgICAgKiAibW9tZW50IiBvZiB0aGUgTFBDcyBpbiB0aGlzIGZpbHRlci4gKi8KKyAgICBzLT5kY3QuZGN0X2NhbGMoJnMtPmRjdCwgbHBjcyk7CisgICAgcy0+ZHN0LmRjdF9jYWxjKCZzLT5kc3QsIGxwY3MpOworCisgICAgLyogU3BsaXQgb3V0IHRoZSBjb2VmZmljaWVudCBpbmRleGVzIGludG8gcGhhc2UvbWFnbml0dWRlIHBhaXJzICovCisgICAgaWR4ID0gMjU1ICsgYXZfY2xpcChscGNzWzY0XSwgICAgICAgICAgICAgICAtMjU1LCAyNTUpOworICAgIGNvZWZmc1swXSAgPSBjb2VmZnNbMF0gICogcy0+Y29zW2lkeF07CisgICAgaWR4ID0gMjU1ICsgYXZfY2xpcChscGNzWzY0XSAtIDIgKiBscGNzWzYzXSwgLTI1NSwgMjU1KTsKKyAgICBsYXN0X2NvZWZmID0gY29lZmZzWzY0XSAqIHMtPmNvc1tpZHhdOworICAgIGZvciAobiA9IDYzOzsgbi0tKSB7CisgICAgICAgIGlkeCA9IDI1NSArIGF2X2NsaXAoLWxwY3NbNjRdIC0gMiAqIGxwY3NbbiAtIDFdLCAtMjU1LCAyNTUpOworICAgICAgICBjb2VmZnNbbiAqIDIgKyAxXSA9IGNvZWZmc1tuXSAqIHMtPnNpbltpZHhdOworICAgICAgICBjb2VmZnNbbiAqIDJdICAgICA9IGNvZWZmc1tuXSAqIHMtPmNvc1tpZHhdOworCisgICAgICAgIGlmICghLS1uKSBicmVhazsKKworICAgICAgICBpZHggPSAyNTUgKyBhdl9jbGlwKCBscGNzWzY0XSAtIDIgKiBscGNzW24gLSAxXSwgLTI1NSwgMjU1KTsKKyAgICAgICAgY29lZmZzW24gKiAyICsgMV0gPSBjb2VmZnNbbl0gKiBzLT5zaW5baWR4XTsKKyAgICAgICAgY29lZmZzW24gKiAyXSAgICAgPSBjb2VmZnNbbl0gKiBzLT5jb3NbaWR4XTsKKyAgICB9CisgICAgY29lZmZzWzFdID0gbGFzdF9jb2VmZjsKKworICAgIC8qIG1vdmUgaW50byByZWFsIGRvbWFpbiAqLworICAgIHMtPmlyZGZ0LnJkZnRfY2FsYygmcy0+aXJkZnQsIGNvZWZmcyk7CisKKyAgICAvKiB0aWx0IGNvcnJlY3Rpb24gYW5kIG5vcm1hbGl6ZSBzY2FsZSAqLworICAgIG1lbXNldCgmY29lZmZzW3JlbWFpbmRlcl0sIDAsIHNpemVvZihjb2VmZnNbMF0pICogKDEyOCAtIHJlbWFpbmRlcikpOworICAgIGlmIChzLT5kZW5vaXNlX3RpbHRfY29ycikgeworICAgICAgICBmbG9hdCB0aWx0X21lbSA9IDA7CisKKyAgICAgICAgY29lZmZzW3JlbWFpbmRlciAtIDFdID0gMDsKKyAgICAgICAgZmZfdGlsdF9jb21wZW5zYXRpb24oJnRpbHRfbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS44ICogdGlsdF9mYWN0b3IoY29lZmZzLCByZW1haW5kZXIgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZzLCByZW1haW5kZXIpOworICAgIH0KKyAgICBzcSA9ICgxLjAgLyA2NC4wKSAqIHNxcnRmKDEgLyBhdnByaXZfc2NhbGFycHJvZHVjdF9mbG9hdF9jKGNvZWZmcywgY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyKSk7CisgICAgZm9yIChuID0gMDsgbiA8IHJlbWFpbmRlcjsgbisrKQorICAgICAgICBjb2VmZnNbbl0gKj0gc3E7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBhcHBsaWVzIGEgV2llbmVyIGZpbHRlciBvbiB0aGUgKG5vaXN5KSBzcGVlY2ggc2lnbmFsIGFzCisgKiBhIG1lYW5zIHRvIGRlbm9pc2UgaXQuCisgKgorICogLSB0YWtlIFJERlQgb2YgTFBDcyB0byBnZXQgdGhlIHBvd2VyIHNwZWN0cnVtIG9mIHRoZSBub2lzZSArIHNwZWVjaDsKKyAqIC0gdXNpbmcgdGhpcyBwb3dlciBzcGVjdHJ1bSwgY2FsY3VsYXRlIChmb3IgZWFjaCBmcmVxdWVuY3kpIHRoZSBXaWVuZXIKKyAqICAgIGZpbHRlciBnYWluLCB3aGljaCBkZXBlbmRzIG9uIHRoZSBmcmVxdWVuY3kgcG93ZXIgYW5kIGRlc2lyZWQgbGV2ZWwKKyAqICAgIG9mIG5vaXNlIHN1YnRyYWN0aW9uICh3aGVuIHNldCB0b28gaGlnaCwgdGhpcyBsZWFkcyB0byBhcnRpZmFjdHMpCisgKiAgICBXZSBjYW4gZG8gdGhpcyBzeW1tZXRyaWNhbGx5IG92ZXIgdGhlIFgtYXhpcyAoc28gMC00a0h6IGlzIHRoZSBpbnZlcnNlCisgKiAgICBvZiA0LThrSHopOworICogLSBieSBkb2luZyBhIHBoYXNlIHNoaWZ0LCBjYWxjdWxhdGUgdGhlIEhpbGJlcnQgdHJhbnNmb3JtIG9mIHRoaXMgYXJyYXkKKyAqICAgIG9mIHBlci1mcmVxdWVuY3kgZmlsdGVyLWdhaW5zIHRvIGdldCB0aGUgZmlsdGVyaW5nIGNvZWZmaWNpZW50czsKKyAqIC0gc21vb3RoZW4vbm9ybWFsaXplL2RlLXRpbHQgdGhlc2UgZmlsdGVyIGNvZWZmaWNpZW50cyBhcyBkZXNpcmVkOworICogLSB0YWtlIFJERlQgb2Ygbm9pc3kgc291bmQsIGFwcGx5IHRoZSBjb2VmZmljaWVudHMgYW5kIHRha2UgaXRzIElSREZUCisgKiAgICB0byBnZXQgdGhlIGRlbm9pc2VkIHNwZWVjaCBzaWduYWw7CisgKiAtIHRoZSBsZWZ0b3ZlciAoaS5lLiBvdXRwdXQgb2YgdGhlIElSREZUIG9uIGRlbm9pc2VkIHNwZWVjaCBkYXRhIGJleW9uZAorICogICAgdGhlIGZyYW1lIGJvdW5kYXJ5KSBhcmUgc2F2ZWQgYW5kIGFwcGxpZWQgdG8gc3Vic2VxdWVudCBmcmFtZXMgYnkgYW4KKyAqICAgIG92ZXJsYXAtYWRkIG1ldGhvZCAob3RoZXJ3aXNlIHlvdSBnZXQgY2xpY2tpbmctYXJ0aWZhY3RzKS4KKyAqCisgKiBAcGFyYW0gcyBXTUEgVm9pY2UgZGVjb2RpbmcgY29udGV4dAorICogQHBhcmFtIGZjYl90eXBlIEZyYW1lIChjb2RlYm9vaykgdHlwZQorICogQHBhcmFtIHN5bnRoX3BmIGlucHV0OiB0aGUgbm9pc3kgc3BlZWNoIHNpZ25hbCwgb3V0cHV0OiBkZW5vaXNlZCBzcGVlY2gKKyAqICAgICAgICAgICAgICAgICBkYXRhOyBzaG91bGQgYmUgMTYtYnl0ZSBhbGlnbmVkIChmb3IgQVNNIHB1cnBvc2VzKQorICogQHBhcmFtIHNpemUgc2l6ZSBvZiB0aGUgc3BlZWNoIGRhdGEKKyAqIEBwYXJhbSBscGNzIExQQ3MgdXNlZCB0byBzeW50aGVzaXplIHRoaXMgZnJhbWUncyBzcGVlY2ggZGF0YQorICovCitzdGF0aWMgdm9pZCB3aWVuZXJfZGVub2lzZShXTUFWb2ljZUNvbnRleHQgKnMsIGludCBmY2JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpzeW50aF9wZiwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbHBjcykKK3sKKyAgICBpbnQgcmVtYWluZGVyLCBsaW0sIG47CisKKyAgICBpZiAoZmNiX3R5cGUgIT0gRkNCX1RZUEVfU0lMRU5DRSkgeworICAgICAgICBmbG9hdCAqdGlsdGVkX2xwY3MgPSBzLT50aWx0ZWRfbHBjc19wZiwKKyAgICAgICAgICAgICAgKmNvZWZmcyA9IHMtPmRlbm9pc2VfY29lZmZzX3BmLCB0aWx0X21lbSA9IDA7CisKKyAgICAgICAgdGlsdGVkX2xwY3NbMF0gICAgICAgICAgID0gMS4wOworICAgICAgICBtZW1jcHkoJnRpbHRlZF9scGNzWzFdLCBscGNzLCBzaXplb2YobHBjc1swXSkgKiBzLT5sc3BzKTsKKyAgICAgICAgbWVtc2V0KCZ0aWx0ZWRfbHBjc1tzLT5sc3BzICsgMV0sIDAsCisgICAgICAgICAgICAgICBzaXplb2YodGlsdGVkX2xwY3NbMF0pICogKDEyOCAtIHMtPmxzcHMgLSAxKSk7CisgICAgICAgIGZmX3RpbHRfY29tcGVuc2F0aW9uKCZ0aWx0X21lbSwgMC43ICogdGlsdF9mYWN0b3IobHBjcywgcy0+bHNwcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbHRlZF9scGNzLCBzLT5sc3BzICsgMik7CisKKyAgICAgICAgLyogVGhlIElSREZUIG91dHB1dCAoMTI3IHNhbXBsZXMgZm9yIDctYml0IGZpbHRlcikgYmV5b25kIHRoZSBmcmFtZQorICAgICAgICAgKiBzaXplIGlzIGFwcGxpZWQgdG8gdGhlIG5leHQgZnJhbWUuIEFsbCBpbnB1dCBiZXlvbmQgdGhpcyBpcyB6ZXJvLAorICAgICAgICAgKiBhbmQgdGh1cyBhbGwgb3V0cHV0IGJleW9uZCB0aGlzIHdpbGwgZ28gdG93YXJkcyB6ZXJvLCBoZW5jZSB3ZSBjYW4KKyAgICAgICAgICogbGltaXQgdG8gbWluKHNpemUtMSwgMTI3LXNpemUpIGFzIGEgcGVyZm9ybWFuY2UgY29uc2lkZXJhdGlvbi4gKi8KKyAgICAgICAgcmVtYWluZGVyID0gRkZNSU4oMTI3IC0gc2l6ZSwgc2l6ZSAtIDEpOworICAgICAgICBjYWxjX2lucHV0X3Jlc3BvbnNlKHMsIHRpbHRlZF9scGNzLCBmY2JfdHlwZSwgY29lZmZzLCByZW1haW5kZXIpOworCisgICAgICAgIC8qIGFwcGx5IGNvZWZmaWNpZW50cyAoaW4gZnJlcXVlbmN5IHNwZWN0cnVtIGRvbWFpbiksIGkuZS4gY29tcGxleAorICAgICAgICAgKiBudW1iZXIgbXVsdGlwbGljYXRpb24gKi8KKyAgICAgICAgbWVtc2V0KCZzeW50aF9wZltzaXplXSwgMCwgc2l6ZW9mKHN5bnRoX3BmWzBdKSAqICgxMjggLSBzaXplKSk7CisgICAgICAgIHMtPnJkZnQucmRmdF9jYWxjKCZzLT5yZGZ0LCBzeW50aF9wZik7CisgICAgICAgIHMtPnJkZnQucmRmdF9jYWxjKCZzLT5yZGZ0LCBjb2VmZnMpOworICAgICAgICBzeW50aF9wZlswXSAqPSBjb2VmZnNbMF07CisgICAgICAgIHN5bnRoX3BmWzFdICo9IGNvZWZmc1sxXTsKKyAgICAgICAgZm9yIChuID0gMTsgbiA8IDY0OyBuKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHYxID0gc3ludGhfcGZbbiAqIDJdLCB2MiA9IHN5bnRoX3BmW24gKiAyICsgMV07CisgICAgICAgICAgICBzeW50aF9wZltuICogMl0gICAgID0gdjEgKiBjb2VmZnNbbiAqIDJdIC0gdjIgKiBjb2VmZnNbbiAqIDIgKyAxXTsKKyAgICAgICAgICAgIHN5bnRoX3BmW24gKiAyICsgMV0gPSB2MiAqIGNvZWZmc1tuICogMl0gKyB2MSAqIGNvZWZmc1tuICogMiArIDFdOworICAgICAgICB9CisgICAgICAgIHMtPmlyZGZ0LnJkZnRfY2FsYygmcy0+aXJkZnQsIHN5bnRoX3BmKTsKKyAgICB9CisKKyAgICAvKiBtZXJnZSBmaWx0ZXIgb3V0cHV0IHdpdGggdGhlIGhpc3Rvcnkgb2YgcHJldmlvdXMgcnVucyAqLworICAgIGlmIChzLT5kZW5vaXNlX2ZpbHRlcl9jYWNoZV9zaXplKSB7CisgICAgICAgIGxpbSA9IEZGTUlOKHMtPmRlbm9pc2VfZmlsdGVyX2NhY2hlX3NpemUsIHNpemUpOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbGltOyBuKyspCisgICAgICAgICAgICBzeW50aF9wZltuXSArPSBzLT5kZW5vaXNlX2ZpbHRlcl9jYWNoZVtuXTsKKyAgICAgICAgcy0+ZGVub2lzZV9maWx0ZXJfY2FjaGVfc2l6ZSAtPSBsaW07CisgICAgICAgIG1lbW1vdmUocy0+ZGVub2lzZV9maWx0ZXJfY2FjaGUsICZzLT5kZW5vaXNlX2ZpbHRlcl9jYWNoZVtzaXplXSwKKyAgICAgICAgICAgICAgICBzaXplb2Yocy0+ZGVub2lzZV9maWx0ZXJfY2FjaGVbMF0pICogcy0+ZGVub2lzZV9maWx0ZXJfY2FjaGVfc2l6ZSk7CisgICAgfQorCisgICAgLyogbW92ZSByZW1haW5kZXIgb2YgZmlsdGVyIG91dHB1dCBpbnRvIGEgY2FjaGUgZm9yIGZ1dHVyZSBydW5zICovCisgICAgaWYgKGZjYl90eXBlICE9IEZDQl9UWVBFX1NJTEVOQ0UpIHsKKyAgICAgICAgbGltID0gRkZNSU4ocmVtYWluZGVyLCBzLT5kZW5vaXNlX2ZpbHRlcl9jYWNoZV9zaXplKTsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGxpbTsgbisrKQorICAgICAgICAgICAgcy0+ZGVub2lzZV9maWx0ZXJfY2FjaGVbbl0gKz0gc3ludGhfcGZbc2l6ZSArIG5dOworICAgICAgICBpZiAobGltIDwgcmVtYWluZGVyKSB7CisgICAgICAgICAgICBtZW1jcHkoJnMtPmRlbm9pc2VfZmlsdGVyX2NhY2hlW2xpbV0sICZzeW50aF9wZltzaXplICsgbGltXSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2Yocy0+ZGVub2lzZV9maWx0ZXJfY2FjaGVbMF0pICogKHJlbWFpbmRlciAtIGxpbSkpOworICAgICAgICAgICAgcy0+ZGVub2lzZV9maWx0ZXJfY2FjaGVfc2l6ZSA9IHJlbWFpbmRlcjsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBBdmVyYWdpbmcgcHJvamVjdGlvbiBmaWx0ZXIsIHRoZSBwb3N0ZmlsdGVyIHVzZWQgaW4gV01BVm9pY2UuCisgKgorICogVGhpcyB1c2VzIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgKiAtIEEgemVyby1zeW50aGVzaXMgZmlsdGVyIChnZW5lcmF0ZSBleGNpdGF0aW9uIGZyb20gc3ludGggc2lnbmFsKQorICogLSBLYWxtYW4gc21vb3RoaW5nIG9uIGV4Y2l0YXRpb24sIGJhc2VkIG9uIHBpdGNoCisgKiAtIFJlLXN5bnRoZXNpemVkIHNtb290aGVuZWQgb3V0cHV0CisgKiAtIEl0ZXJhdGl2ZSBXaWVuZXIgZGVub2lzZSBmaWx0ZXIKKyAqIC0gQWRhcHRpdmUgZ2FpbiBmaWx0ZXIKKyAqIC0gREMgZmlsdGVyCisgKgorICogQHBhcmFtIHMgV01BVm9pY2UgZGVjb2RpbmcgY29udGV4dAorICogQHBhcmFtIHN5bnRoIFNwZWVjaCBzeW50aGVzaXMgb3V0cHV0IChiZWZvcmUgcG9zdGZpbHRlcikKKyAqIEBwYXJhbSBzYW1wbGVzIE91dHB1dCBidWZmZXIgZm9yIGZpbHRlcmVkIHNhbXBsZXMKKyAqIEBwYXJhbSBzaXplIEJ1ZmZlciBzaXplIG9mIHN5bnRoICYgc2FtcGxlcworICogQHBhcmFtIGxwY3MgR2VuZXJhdGVkIExQQ3MgdXNlZCBmb3Igc3BlZWNoIHN5bnRoZXNpcworICogQHBhcmFtIHplcm9fZXhjX3BmIGRlc3RpbmF0aW9uIGZvciB6ZXJvIHN5bnRoZXNpcyBmaWx0ZXIgKDE2LWJ5dGUgYWxpZ25lZCkKKyAqIEBwYXJhbSBmY2JfdHlwZSBGcmFtZSB0eXBlIChzaWxlbmNlLCBoYXJkY29kZWQsIEFXLXB1bHNlcyBvciBGQ0ItcHVsc2VzKQorICogQHBhcmFtIHBpdGNoIFBpdGNoIG9mIHRoZSBpbnB1dCBzaWduYWwKKyAqLworc3RhdGljIHZvaWQgcG9zdGZpbHRlcihXTUFWb2ljZUNvbnRleHQgKnMsIGNvbnN0IGZsb2F0ICpzeW50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnNhbXBsZXMsICAgIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbHBjcywgZmxvYXQgKnplcm9fZXhjX3BmLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmNiX3R5cGUsICAgICAgaW50IHBpdGNoKQoreworICAgIGZsb2F0IHN5bnRoX2ZpbHRlcl9pbl9idWZbTUFYX0ZSQU1FU0laRSAvIDJdLAorICAgICAgICAgICpzeW50aF9wZiA9ICZzLT5zeW50aF9maWx0ZXJfb3V0X2J1ZltNQVhfTFNQU19BTElHTjE2XSwKKyAgICAgICAgICAqc3ludGhfZmlsdGVyX2luID0gemVyb19leGNfcGY7CisKKyAgICBhdl9hc3NlcnQwKHNpemUgPD0gTUFYX0ZSQU1FU0laRSAvIDIpOworCisgICAgLyogZ2VuZXJhdGUgZXhjaXRhdGlvbiBmcm9tIGlucHV0IHNpZ25hbCAqLworICAgIGZmX2NlbHBfbHBfemVyb19zeW50aGVzaXNfZmlsdGVyZih6ZXJvX2V4Y19wZiwgbHBjcywgc3ludGgsIHNpemUsIHMtPmxzcHMpOworCisgICAgaWYgKGZjYl90eXBlID49IEZDQl9UWVBFX0FXX1BVTFNFUyAmJgorICAgICAgICAha2FsbWFuX3Ntb290aGVuKHMsIHBpdGNoLCB6ZXJvX2V4Y19wZiwgc3ludGhfZmlsdGVyX2luX2J1Ziwgc2l6ZSkpCisgICAgICAgIHN5bnRoX2ZpbHRlcl9pbiA9IHN5bnRoX2ZpbHRlcl9pbl9idWY7CisKKyAgICAvKiByZS1zeW50aGVzaXplIHNwZWVjaCBhZnRlciBzbW9vdGhlbmluZywgYW5kIGtlZXAgaGlzdG9yeSAqLworICAgIGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmYoc3ludGhfcGYsIGxwY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aF9maWx0ZXJfaW4sIHNpemUsIHMtPmxzcHMpOworICAgIG1lbWNweSgmc3ludGhfcGZbLXMtPmxzcHNdLCAmc3ludGhfcGZbc2l6ZSAtIHMtPmxzcHNdLAorICAgICAgICAgICBzaXplb2Yoc3ludGhfcGZbMF0pICogcy0+bHNwcyk7CisKKyAgICB3aWVuZXJfZGVub2lzZShzLCBmY2JfdHlwZSwgc3ludGhfcGYsIHNpemUsIGxwY3MpOworCisgICAgYWRhcHRpdmVfZ2Fpbl9jb250cm9sKHNhbXBsZXMsIHN5bnRoX3BmLCBzeW50aCwgc2l6ZSwgMC45OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnBvc3RmaWx0ZXJfYWdjKTsKKworICAgIGlmIChzLT5kY19sZXZlbCA+IDgpIHsKKyAgICAgICAgLyogcmVtb3ZlIHVsdHJhLWxvdyBmcmVxdWVuY3kgREMgbm9pc2UgLyBoaWdocGFzcyBmaWx0ZXI7CisgICAgICAgICAqIGNvZWZmaWNpZW50cyBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIHVzZWQgaW4gU0lQUiBkZWNvZGluZywKKyAgICAgICAgICogYW5kIHZlcnkgY2xvc2VseSByZXNlbWJsZSB0aG9zZSB1c2VkIGluIEFNUi1OQiBkZWNvZGluZy4gKi8KKyAgICAgICAgZmZfYWNlbHBfYXBwbHlfb3JkZXJfMl90cmFuc2Zlcl9mdW5jdGlvbihzYW1wbGVzLCBzYW1wbGVzLAorICAgICAgICAgICAgKGNvbnN0IGZsb2F0WzJdKSB7IC0xLjk5OTk3LCAgICAgIDEuMCB9LAorICAgICAgICAgICAgKGNvbnN0IGZsb2F0WzJdKSB7IC0xLjkzMzA3MzUxODgsIDAuOTM1ODkxOTg0OTYgfSwKKyAgICAgICAgICAgIDAuOTM5ODA1ODA0NzUsIHMtPmRjZl9tZW0sIHNpemUpOworICAgIH0KK30KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIERlcXVhbnRpemUgTFNQcworICogQHBhcmFtIGxzcHMgb3V0cHV0IHBvaW50ZXIgdG8gdGhlIGFycmF5IHRoYXQgd2lsbCBob2xkIHRoZSBMU1BzCisgKiBAcGFyYW0gbnVtIG51bWJlciBvZiBMU1BzIHRvIGJlIGRlcXVhbnRpemVkCisgKiBAcGFyYW0gdmFsdWVzIHF1YW50aXplZCB2YWx1ZXMsIGNvbnRhaW5zIG5fc3RhZ2VzIHZhbHVlcworICogQHBhcmFtIHNpemVzIHJhbmdlIChpLmUuIG1heCB2YWx1ZSkgb2YgZWFjaCBxdWFudGl6ZWQgdmFsdWUKKyAqIEBwYXJhbSBuX3N0YWdlcyBudW1iZXIgb2YgZGVxdWFudGl6YXRpb24gcnVucworICogQHBhcmFtIHRhYmxlIGRlcXVhbnRpemF0aW9uIHRhYmxlIHRvIGJlIHVzZWQKKyAqIEBwYXJhbSBtdWxfcSBMU0YgbXVsdGlwbGllcgorICogQHBhcmFtIGJhc2VfcSBiYXNlIChsb3dlc3QpIExTRiB2YWx1ZXMKKyAqLworc3RhdGljIHZvaWQgZGVxdWFudF9sc3BzKGRvdWJsZSAqbHNwcywgaW50IG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbl9zdGFnZXMsIGNvbnN0IHVpbnQ4X3QgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqbXVsX3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlICpiYXNlX3EpCit7CisgICAgaW50IG4sIG07CisKKyAgICBtZW1zZXQobHNwcywgMCwgbnVtICogc2l6ZW9mKCpsc3BzKSk7CisgICAgZm9yIChuID0gMDsgbiA8IG5fc3RhZ2VzOyBuKyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdF9vZmYgPSAmdGFibGVbdmFsdWVzW25dICogbnVtXTsKKyAgICAgICAgZG91YmxlIGJhc2UgPSBiYXNlX3Fbbl0sIG11bCA9IG11bF9xW25dOworCisgICAgICAgIGZvciAobSA9IDA7IG0gPCBudW07IG0rKykKKyAgICAgICAgICAgIGxzcHNbbV0gKz0gYmFzZSArIG11bCAqIHRfb2ZmW21dOworCisgICAgICAgIHRhYmxlICs9IHNpemVzW25dICogbnVtOworICAgIH0KK30KKworLyoqCisgKiBAbmFtZSBMU1AgZGVxdWFudGl6YXRpb24gcm91dGluZXMKKyAqIExTUCBkZXF1YW50aXphdGlvbiByb3V0aW5lcywgZm9yIDEwLzE2TFNQcyBhbmQgaW5kZXBlbmRlbnQvcmVzaWR1YWwgY29kaW5nLgorICogQG5vdGUgd2UgYXNzdW1lIGVub3VnaCBiaXRzIGFyZSBhdmFpbGFibGUsIGNhbGxlciBzaG91bGQgY2hlY2suCisgKiBsc3AxMGkoKSBjb25zdW1lcyAyNCBiaXRzOyBsc3AxMHIoKSBjb25zdW1lcyBhbiBhZGRpdGlvbmFsIDI0IGJpdHM7CisgKiBsc3AxNmkoKSBjb25zdW1lcyAzNCBiaXRzOyBsc3AxNnIoKSBjb25zdW1lcyBhbiBhZGRpdGlvbmFsIDI2IGJpdHMuCisgKiBAeworICovCisvKioKKyAqIFBhcnNlIDEwIGluZGVwZW5kZW50bHktY29kZWQgTFNQcy4KKyAqLworc3RhdGljIHZvaWQgZGVxdWFudF9sc3AxMGkoR2V0Qml0Q29udGV4dCAqZ2IsIGRvdWJsZSAqbHNwcykKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgdmVjX3NpemVzWzRdID0geyAyNTYsIDY0LCAzMiwgMzIgfTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIG11bF9sc2ZbNF0gPSB7CisgICAgICAgIDUuMjE4NzE0NDgwMGUtMywgICAgMS40NjI2OTg2NDIyZS0zLAorICAgICAgICA5LjYxNzk1NDkxNjZlLTQsICAgIDEuMTMyNTczNjIyNWUtMworICAgIH07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBiYXNlX2xzZls0XSA9IHsKKyAgICAgICAgTV9QSSAqIC0yLjE1NTIyZS0xLCBNX1BJICogLTYuMTY0NmUtMiwKKyAgICAgICAgTV9QSSAqIC0zLjM0ODZlLTIsICBNX1BJICogLTUuNzQwOGUtMgorICAgIH07CisgICAgdWludDE2X3Qgdls0XTsKKworICAgIHZbMF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgdlsxXSA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICB2WzJdID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgIHZbM10gPSBnZXRfYml0cyhnYiwgNSk7CisKKyAgICBkZXF1YW50X2xzcHMobHNwcywgMTAsIHYsIHZlY19zaXplcywgNCwgd21hdm9pY2VfZHFfbHNwMTBpLAorICAgICAgICAgICAgICAgICBtdWxfbHNmLCBiYXNlX2xzZik7Cit9CisKKy8qKgorICogUGFyc2UgMTAgaW5kZXBlbmRlbnRseS1jb2RlZCBMU1BzLCBhbmQgdGhlbiBkZXJpdmUgdGhlIHRhYmxlcyB0bworICogZ2VuZXJhdGUgTFNQcyBmb3IgdGhlIG90aGVyIGZyYW1lcyBmcm9tIHRoZW0gKHJlc2lkdWFsIGNvZGluZykuCisgKi8KK3N0YXRpYyB2b2lkIGRlcXVhbnRfbHNwMTByKEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICppX2xzcHMsIGNvbnN0IGRvdWJsZSAqb2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICphMSwgZG91YmxlICphMiwgaW50IHFfbW9kZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgdmVjX3NpemVzWzNdID0geyAxMjgsIDY0LCA2NCB9OworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbXVsX2xzZlszXSA9IHsKKyAgICAgICAgMi41ODA3NjAxMTc0ZS0zLCAgICAxLjIzNTQ0NjAyMTllLTMsICAgMS4xNzYzODIxNjczZS0zCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIGJhc2VfbHNmWzNdID0geworICAgICAgICBNX1BJICogLTEuMDc0NDhlLTEsIE1fUEkgKiAtNS4yNzA2ZS0yLCBNX1BJICogLTUuMTYzNGUtMgorICAgIH07CisgICAgY29uc3QgZmxvYXQgKCppcG9sX3RhYilbMl1bMTBdID0gcV9tb2RlID8KKyAgICAgICAgd21hdm9pY2VfbHNwMTBfaW50ZXJjb2VmZl9iIDogd21hdm9pY2VfbHNwMTBfaW50ZXJjb2VmZl9hOworICAgIHVpbnQxNl90IGludGVycG9sLCB2WzNdOworICAgIGludCBuOworCisgICAgZGVxdWFudF9sc3AxMGkoZ2IsIGlfbHNwcyk7CisKKyAgICBpbnRlcnBvbCA9IGdldF9iaXRzKGdiLCA1KTsKKyAgICB2WzBdICAgICA9IGdldF9iaXRzKGdiLCA3KTsKKyAgICB2WzFdICAgICA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICB2WzJdICAgICA9IGdldF9iaXRzKGdiLCA2KTsKKworICAgIGZvciAobiA9IDA7IG4gPCAxMDsgbisrKSB7CisgICAgICAgIGRvdWJsZSBkZWx0YSA9IG9sZFtuXSAtIGlfbHNwc1tuXTsKKyAgICAgICAgYTFbbl0gICAgICAgID0gaXBvbF90YWJbaW50ZXJwb2xdWzBdW25dICogZGVsdGEgKyBpX2xzcHNbbl07CisgICAgICAgIGExWzEwICsgbl0gICA9IGlwb2xfdGFiW2ludGVycG9sXVsxXVtuXSAqIGRlbHRhICsgaV9sc3BzW25dOworICAgIH0KKworICAgIGRlcXVhbnRfbHNwcyhhMiwgMjAsIHYsIHZlY19zaXplcywgMywgd21hdm9pY2VfZHFfbHNwMTByLAorICAgICAgICAgICAgICAgICBtdWxfbHNmLCBiYXNlX2xzZik7Cit9CisKKy8qKgorICogUGFyc2UgMTYgaW5kZXBlbmRlbnRseS1jb2RlZCBMU1BzLgorICovCitzdGF0aWMgdm9pZCBkZXF1YW50X2xzcDE2aShHZXRCaXRDb250ZXh0ICpnYiwgZG91YmxlICpsc3BzKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCB2ZWNfc2l6ZXNbNV0gPSB7IDI1NiwgNjQsIDEyOCwgNjQsIDEyOCB9OworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbXVsX2xzZls1XSA9IHsKKyAgICAgICAgMy4zNDM5NTg2MjgwZS0zLCAgICA2Ljk5MDgxNzM3MDNlLTQsCisgICAgICAgIDMuMzIxNjYwODMwNmUtMywgICAgMS4wMzM0OTYwMzI2ZS0zLAorICAgICAgICAzLjE4OTkxMDQyODNlLTMKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgYmFzZV9sc2ZbNV0gPSB7CisgICAgICAgIE1fUEkgKiAtMS4yNzU3NmUtMSwgTV9QSSAqIC0yLjQyOTJlLTIsCisgICAgICAgIE1fUEkgKiAtMS4yODA5NGUtMSwgTV9QSSAqIC0zLjIxMjhlLTIsCisgICAgICAgIE1fUEkgKiAtMS4yOTgxNmUtMQorICAgIH07CisgICAgdWludDE2X3Qgdls1XTsKKworICAgIHZbMF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgdlsxXSA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICB2WzJdID0gZ2V0X2JpdHMoZ2IsIDcpOworICAgIHZbM10gPSBnZXRfYml0cyhnYiwgNik7CisgICAgdls0XSA9IGdldF9iaXRzKGdiLCA3KTsKKworICAgIGRlcXVhbnRfbHNwcyggbHNwcywgICAgIDUsICB2LCAgICAgdmVjX3NpemVzLCAgICAyLAorICAgICAgICAgICAgICAgICB3bWF2b2ljZV9kcV9sc3AxNmkxLCAgbXVsX2xzZiwgICAgIGJhc2VfbHNmKTsKKyAgICBkZXF1YW50X2xzcHMoJmxzcHNbNV0sICA1LCAmdlsyXSwgJnZlY19zaXplc1syXSwgMiwKKyAgICAgICAgICAgICAgICAgd21hdm9pY2VfZHFfbHNwMTZpMiwgJm11bF9sc2ZbMl0sICZiYXNlX2xzZlsyXSk7CisgICAgZGVxdWFudF9sc3BzKCZsc3BzWzEwXSwgNiwgJnZbNF0sICZ2ZWNfc2l6ZXNbNF0sIDEsCisgICAgICAgICAgICAgICAgIHdtYXZvaWNlX2RxX2xzcDE2aTMsICZtdWxfbHNmWzRdLCAmYmFzZV9sc2ZbNF0pOworfQorCisvKioKKyAqIFBhcnNlIDE2IGluZGVwZW5kZW50bHktY29kZWQgTFNQcywgYW5kIHRoZW4gZGVyaXZlIHRoZSB0YWJsZXMgdG8KKyAqIGdlbmVyYXRlIExTUHMgZm9yIHRoZSBvdGhlciBmcmFtZXMgZnJvbSB0aGVtIChyZXNpZHVhbCBjb2RpbmcpLgorICovCitzdGF0aWMgdm9pZCBkZXF1YW50X2xzcDE2cihHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqaV9sc3BzLCBjb25zdCBkb3VibGUgKm9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqYTEsIGRvdWJsZSAqYTIsIGludCBxX21vZGUpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHZlY19zaXplc1szXSA9IHsgMTI4LCAxMjgsIDEyOCB9OworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbXVsX2xzZlszXSA9IHsKKyAgICAgICAgMS4yMjMyOTc5NTAxZS0zLCAgIDEuNDA2MjI0MTUyN2UtMywgICAxLjYxMTQ3NDQ4NTFlLTMKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgYmFzZV9sc2ZbM10gPSB7CisgICAgICAgIE1fUEkgKiAtNS41ODMwZS0yLCBNX1BJICogLTUuMjkwOGUtMiwgTV9QSSAqIC01LjQ3NzZlLTIKKyAgICB9OworICAgIGNvbnN0IGZsb2F0ICgqaXBvbF90YWIpWzJdWzE2XSA9IHFfbW9kZSA/CisgICAgICAgIHdtYXZvaWNlX2xzcDE2X2ludGVyY29lZmZfYiA6IHdtYXZvaWNlX2xzcDE2X2ludGVyY29lZmZfYTsKKyAgICB1aW50MTZfdCBpbnRlcnBvbCwgdlszXTsKKyAgICBpbnQgbjsKKworICAgIGRlcXVhbnRfbHNwMTZpKGdiLCBpX2xzcHMpOworCisgICAgaW50ZXJwb2wgPSBnZXRfYml0cyhnYiwgNSk7CisgICAgdlswXSAgICAgPSBnZXRfYml0cyhnYiwgNyk7CisgICAgdlsxXSAgICAgPSBnZXRfYml0cyhnYiwgNyk7CisgICAgdlsyXSAgICAgPSBnZXRfYml0cyhnYiwgNyk7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgMTY7IG4rKykgeworICAgICAgICBkb3VibGUgZGVsdGEgPSBvbGRbbl0gLSBpX2xzcHNbbl07CisgICAgICAgIGExW25dICAgICAgICA9IGlwb2xfdGFiW2ludGVycG9sXVswXVtuXSAqIGRlbHRhICsgaV9sc3BzW25dOworICAgICAgICBhMVsxNiArIG5dICAgPSBpcG9sX3RhYltpbnRlcnBvbF1bMV1bbl0gKiBkZWx0YSArIGlfbHNwc1tuXTsKKyAgICB9CisKKyAgICBkZXF1YW50X2xzcHMoIGEyLCAgICAgMTAsICB2LCAgICAgdmVjX3NpemVzLCAgICAxLAorICAgICAgICAgICAgICAgICB3bWF2b2ljZV9kcV9sc3AxNnIxLCAgbXVsX2xzZiwgICAgIGJhc2VfbHNmKTsKKyAgICBkZXF1YW50X2xzcHMoJmEyWzEwXSwgMTAsICZ2WzFdLCAmdmVjX3NpemVzWzFdLCAxLAorICAgICAgICAgICAgICAgICB3bWF2b2ljZV9kcV9sc3AxNnIyLCAmbXVsX2xzZlsxXSwgJmJhc2VfbHNmWzFdKTsKKyAgICBkZXF1YW50X2xzcHMoJmEyWzIwXSwgMTIsICZ2WzJdLCAmdmVjX3NpemVzWzJdLCAxLAorICAgICAgICAgICAgICAgICB3bWF2b2ljZV9kcV9sc3AxNnIzLCAmbXVsX2xzZlsyXSwgJmJhc2VfbHNmWzJdKTsKK30KKworLyoqCisgKiBAfQorICogQG5hbWUgUGl0Y2gtYWRhcHRpdmUgd2luZG93IGNvZGluZyBmdW5jdGlvbnMKKyAqIFRoZSBuZXh0IGZldyBmdW5jdGlvbnMgYXJlIGZvciBwaXRjaC1hZGFwdGl2ZSB3aW5kb3cgY29kaW5nLgorICogQHsKKyAqLworLyoqCisgKiBQYXJzZSB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBwaXRjaC1hZGFwdGl2ZSB3aW5kb3cgcHVsc2VzLCBhbmQKKyAqIHRoZSBkaXN0cmlidXRpb24gb2YgcHVsc2VzIGJldHdlZW4gdGhlIHR3byBibG9ja3MgaW4gdGhpcyBmcmFtZS4KKyAqIEBwYXJhbSBzIFdNQSBWb2ljZSBkZWNvZGluZyBjb250ZXh0IHByaXZhdGUgZGF0YQorICogQHBhcmFtIGdiIGJpdCBJL08gY29udGV4dAorICogQHBhcmFtIHBpdGNoIHBpdGNoIGZvciBlYWNoIGJsb2NrIGluIHRoaXMgZnJhbWUKKyAqLworc3RhdGljIHZvaWQgYXdfcGFyc2VfY29vcmRzKFdNQVZvaWNlQ29udGV4dCAqcywgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpwaXRjaCkKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50MTZfdCBzdGFydF9vZmZzZXRbOTRdID0geworICAgICAgICAtMTEsICAtOSwgIC03LCAgLTUsICAtMywgIC0xLCAgIDEsICAgMywgICA1LCAgIDcsICAgOSwgIDExLAorICAgICAgICAgMTMsICAxNSwgIDE4LCAgMTcsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LAorICAgICAgICAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNSwgIDM3LCAgMzksICA0MSwgIDQzLAorICAgICAgICAgNDUsICA0NywgIDQ5LCAgNTEsICA1MywgIDU1LCAgNTcsICA1OSwgIDYxLCAgNjMsICA2NSwgIDY3LAorICAgICAgICAgNjksICA3MSwgIDczLCAgNzUsICA3NywgIDc5LCAgODEsICA4MywgIDg1LCAgODcsICA4OSwgIDkxLAorICAgICAgICAgOTMsICA5NSwgIDk3LCAgOTksIDEwMSwgMTAzLCAxMDUsIDEwNywgMTA5LCAxMTEsIDExMywgMTE1LAorICAgICAgICAxMTcsIDExOSwgMTIxLCAxMjMsIDEyNSwgMTI3LCAxMjksIDEzMSwgMTMzLCAxMzUsIDEzNywgMTM5LAorICAgICAgICAxNDEsIDE0MywgMTQ1LCAxNDcsIDE0OSwgMTUxLCAxNTMsIDE1NSwgMTU3LCAxNTkKKyAgICB9OworICAgIGludCBiaXRzLCBvZmZzZXQ7CisKKyAgICAvKiBwb3NpdGlvbiBvZiBwdWxzZSAqLworICAgIHMtPmF3X2lkeF9pc19leHQgPSAwOworICAgIGlmICgoYml0cyA9IGdldF9iaXRzKGdiLCA2KSkgPj0gNTQpIHsKKyAgICAgICAgcy0+YXdfaWR4X2lzX2V4dCA9IDE7CisgICAgICAgIGJpdHMgKz0gKGJpdHMgLSA1NCkgKiAzICsgZ2V0X2JpdHMoZ2IsIDIpOworICAgIH0KKworICAgIC8qIGZvciBhIHJlcGVhdGVkIHB1bHNlIGF0IHB1bHNlX29mZiB3aXRoIGEgcGl0Y2hfbGFnIG9mIHBpdGNoW10sIGNvdW50CisgICAgICogdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcHVsc2VzIGluIGVhY2ggYmxvY2sgY29udGFpbmVkIGluIHRoaXMgZnJhbWUuICovCisgICAgcy0+YXdfcHVsc2VfcmFuZ2UgICAgICAgID0gRkZNSU4ocGl0Y2hbMF0sIHBpdGNoWzFdKSA+IDMyID8gMjQgOiAxNjsKKyAgICBmb3IgKG9mZnNldCA9IHN0YXJ0X29mZnNldFtiaXRzXTsgb2Zmc2V0IDwgMDsgb2Zmc2V0ICs9IHBpdGNoWzBdKSA7CisgICAgcy0+YXdfbl9wdWxzZXNbMF0gICAgICAgID0gKHBpdGNoWzBdIC0gMSArIE1BWF9GUkFNRVNJWkUgLyAyIC0gb2Zmc2V0KSAvIHBpdGNoWzBdOworICAgIHMtPmF3X2ZpcnN0X3B1bHNlX29mZlswXSA9IG9mZnNldCAtIHMtPmF3X3B1bHNlX3JhbmdlIC8gMjsKKyAgICBvZmZzZXQgICAgICAgICAgICAgICAgICArPSBzLT5hd19uX3B1bHNlc1swXSAqIHBpdGNoWzBdOworICAgIHMtPmF3X25fcHVsc2VzWzFdICAgICAgICA9IChwaXRjaFsxXSAtIDEgKyBNQVhfRlJBTUVTSVpFIC0gb2Zmc2V0KSAvIHBpdGNoWzFdOworICAgIHMtPmF3X2ZpcnN0X3B1bHNlX29mZlsxXSA9IG9mZnNldCAtIChNQVhfRlJBTUVTSVpFICsgcy0+YXdfcHVsc2VfcmFuZ2UpIC8gMjsKKworICAgIC8qIGlmIGNvbnRpbnVpbmcgZnJvbSBhIHBvc2l0aW9uIGJlZm9yZSB0aGUgYmxvY2ssIHJlc2V0IHBvc2l0aW9uIHRvCisgICAgICogc3RhcnQgb2YgYmxvY2sgKHdoZW4gY29ycmVjdGVkIGZvciB0aGUgcmFuZ2Ugb3ZlciB3aGljaCBpdCBjYW4gYmUKKyAgICAgKiBzcHJlYWQgaW4gYXdfcHVsc2Vfc2V0MSgpKS4gKi8KKyAgICBpZiAoc3RhcnRfb2Zmc2V0W2JpdHNdIDwgTUFYX0ZSQU1FU0laRSAvIDIpIHsKKyAgICAgICAgd2hpbGUgKHMtPmF3X2ZpcnN0X3B1bHNlX29mZlsxXSAtIHBpdGNoWzFdICsgcy0+YXdfcHVsc2VfcmFuZ2UgPiAwKQorICAgICAgICAgICAgcy0+YXdfZmlyc3RfcHVsc2Vfb2ZmWzFdIC09IHBpdGNoWzFdOworICAgICAgICBpZiAoc3RhcnRfb2Zmc2V0W2JpdHNdIDwgMCkKKyAgICAgICAgICAgIHdoaWxlIChzLT5hd19maXJzdF9wdWxzZV9vZmZbMF0gLSBwaXRjaFswXSArIHMtPmF3X3B1bHNlX3JhbmdlID4gMCkKKyAgICAgICAgICAgICAgICBzLT5hd19maXJzdF9wdWxzZV9vZmZbMF0gLT0gcGl0Y2hbMF07CisgICAgfQorfQorCisvKioKKyAqIEFwcGx5IHNlY29uZCBzZXQgb2YgcGl0Y2gtYWRhcHRpdmUgd2luZG93IHB1bHNlcy4KKyAqIEBwYXJhbSBzIFdNQSBWb2ljZSBkZWNvZGluZyBjb250ZXh0IHByaXZhdGUgZGF0YQorICogQHBhcmFtIGdiIGJpdCBJL08gY29udGV4dAorICogQHBhcmFtIGJsb2NrX2lkeCBibG9jayBpbmRleCBpbiBmcmFtZSBbMCwgMV0KKyAqIEBwYXJhbSBmY2Igc3RydWN0dXJlIGNvbnRhaW5pbmcgZml4ZWQgY29kZWJvb2sgdmVjdG9yIGluZm8KKyAqIEByZXR1cm4gLTEgb24gZXJyb3IsIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgYXdfcHVsc2Vfc2V0MihXTUFWb2ljZUNvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19pZHgsIEFNUkZpeGVkICpmY2IpCit7CisgICAgdWludDE2X3QgdXNlX21hc2tfbWVtWzldOyAvLyBvbmx5IDUgYXJlIHVzZWQsIHJlc3QgaXMgcGFkZGluZworICAgIHVpbnQxNl90ICp1c2VfbWFzayA9IHVzZV9tYXNrX21lbSArIDI7CisgICAgLyogaW4gdGhpcyBmdW5jdGlvbiwgaWR4IGlzIHRoZSBpbmRleCBpbiB0aGUgODAtYml0ICgrIHBhZGRpbmcpIHVzZV9tYXNrCisgICAgICogYml0LWFycmF5LiBTaW5jZSB1c2VfbWFzayBjb25zaXN0cyBvZiAxNi1iaXQgdmFsdWVzLCB0aGUgbG93ZXIgNCBiaXRzCisgICAgICogb2YgaWR4IGFyZSB0aGUgcG9zaXRpb24gb2YgdGhlIGJpdCB3aXRoaW4gYSBwYXJ0aWN1bGFyIGl0ZW0gaW4gdGhlCisgICAgICogYXJyYXkgKDAgYmVpbmcgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LCBhbmQgMTUgYmVpbmcgdGhlIGxlYXN0CisgICAgICogc2lnbmlmaWNhbnQgYml0KSwgYW5kIHRoZSByZW1haW5kZXIgKD4+IDQpIGlzIHRoZSBpbmRleCBpbiB0aGUKKyAgICAgKiB1c2VfbWFza1tdLWFycmF5LiBUaGlzIGlzIGZhc3RlciBhbmQgdXNlcyBsZXNzIG1lbW9yeSB0aGFuIHVzaW5nIGEKKyAgICAgKiA4MC1ieXRlLzgwLWludCBhcnJheS4gKi8KKyAgICBpbnQgcHVsc2Vfb2ZmID0gcy0+YXdfZmlyc3RfcHVsc2Vfb2ZmW2Jsb2NrX2lkeF0sCisgICAgICAgIHB1bHNlX3N0YXJ0LCBuLCBpZHgsIHJhbmdlLCBhaWR4LCBzdGFydF9vZmYgPSAwOworCisgICAgLyogc2V0IG9mZnNldCBvZiBmaXJzdCBwdWxzZSB0byB3aXRoaW4gdGhpcyBibG9jayAqLworICAgIGlmIChzLT5hd19uX3B1bHNlc1tibG9ja19pZHhdID4gMCkKKyAgICAgICAgd2hpbGUgKHB1bHNlX29mZiArIHMtPmF3X3B1bHNlX3JhbmdlIDwgMSkKKyAgICAgICAgICAgIHB1bHNlX29mZiArPSBmY2ItPnBpdGNoX2xhZzsKKworICAgIC8qIGZpbmQgcmFuZ2UgcGVyIHB1bHNlICovCisgICAgaWYgKHMtPmF3X25fcHVsc2VzWzBdID4gMCkgeworICAgICAgICBpZiAoYmxvY2tfaWR4ID09IDApIHsKKyAgICAgICAgICAgIHJhbmdlID0gMzI7CisgICAgICAgIH0gZWxzZSAvKiBibG9ja19pZHggPSAxICovIHsKKyAgICAgICAgICAgIHJhbmdlID0gODsKKyAgICAgICAgICAgIGlmIChzLT5hd19uX3B1bHNlc1tibG9ja19pZHhdID4gMCkKKyAgICAgICAgICAgICAgICBwdWxzZV9vZmYgPSBzLT5hd19uZXh0X3B1bHNlX29mZl9jYWNoZTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICByYW5nZSA9IDE2OworICAgIHB1bHNlX3N0YXJ0ID0gcy0+YXdfbl9wdWxzZXNbYmxvY2tfaWR4XSA+IDAgPyBwdWxzZV9vZmYgLSByYW5nZSAvIDIgOiAwOworCisgICAgLyogYXdfcHVsc2Vfc2V0MSgpIGFscmVhZHkgYXBwbGllcyBwdWxzZXMgYXJvdW5kIHB1bHNlX29mZiAodG8gYmUgZXhhY3RseSwKKyAgICAgKiBpbiB0aGUgcmFuZ2Ugb2YgW3B1bHNlX29mZiwgcHVsc2Vfb2ZmICsgcy0+YXdfcHVsc2VfcmFuZ2VdLCBhbmQgdGh1cworICAgICAqIHdlIGV4Y2x1ZGUgdGhhdCByYW5nZSBmcm9tIGJlaW5nIHB1bHNlZCBhZ2FpbiBpbiB0aGlzIGZ1bmN0aW9uLiAqLworICAgIG1lbXNldCgmdXNlX21hc2tbLTJdLCAwLCAyICogc2l6ZW9mKHVzZV9tYXNrWzBdKSk7CisgICAgbWVtc2V0KCB1c2VfbWFzaywgICAtMSwgNSAqIHNpemVvZih1c2VfbWFza1swXSkpOworICAgIG1lbXNldCgmdXNlX21hc2tbNV0sIDAsIDIgKiBzaXplb2YodXNlX21hc2tbMF0pKTsKKyAgICBpZiAocy0+YXdfbl9wdWxzZXNbYmxvY2tfaWR4XSA+IDApCisgICAgICAgIGZvciAoaWR4ID0gcHVsc2Vfb2ZmOyBpZHggPCBNQVhfRlJBTUVTSVpFIC8gMjsgaWR4ICs9IGZjYi0+cGl0Y2hfbGFnKSB7CisgICAgICAgICAgICBpbnQgZXhjbF9yYW5nZSAgICAgICAgID0gcy0+YXdfcHVsc2VfcmFuZ2U7IC8vIGFsd2F5cyAxNiBvciAyNAorICAgICAgICAgICAgdWludDE2X3QgKnVzZV9tYXNrX3B0ciA9ICZ1c2VfbWFza1tpZHggPj4gNF07CisgICAgICAgICAgICBpbnQgZmlyc3Rfc2ggICAgICAgICAgID0gMTYgLSAoaWR4ICYgMTUpOworICAgICAgICAgICAgKnVzZV9tYXNrX3B0cisrICAgICAgICY9IDB4RkZGRnUgPDwgZmlyc3Rfc2g7CisgICAgICAgICAgICBleGNsX3JhbmdlICAgICAgICAgICAgLT0gZmlyc3Rfc2g7CisgICAgICAgICAgICBpZiAoZXhjbF9yYW5nZSA+PSAxNikgeworICAgICAgICAgICAgICAgICp1c2VfbWFza19wdHIrKyAgICA9IDA7CisgICAgICAgICAgICAgICAgKnVzZV9tYXNrX3B0ciAgICAgJj0gMHhGRkZGID4+IChleGNsX3JhbmdlIC0gMTYpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgKnVzZV9tYXNrX3B0ciAgICAgJj0gMHhGRkZGID4+IGV4Y2xfcmFuZ2U7CisgICAgICAgIH0KKworICAgIC8qIGZpbmQgdGhlICdhaWR4J3RoIG9mZnNldCB0aGF0IGlzIG5vdCBleGNsdWRlZCAqLworICAgIGFpZHggPSBnZXRfYml0cyhnYiwgcy0+YXdfbl9wdWxzZXNbMF0gPiAwID8gNSAtIDIgKiBibG9ja19pZHggOiA0KTsKKyAgICBmb3IgKG4gPSAwOyBuIDw9IGFpZHg7IHB1bHNlX3N0YXJ0KyspIHsKKyAgICAgICAgZm9yIChpZHggPSBwdWxzZV9zdGFydDsgaWR4IDwgMDsgaWR4ICs9IGZjYi0+cGl0Y2hfbGFnKSA7CisgICAgICAgIGlmIChpZHggPj0gTUFYX0ZSQU1FU0laRSAvIDIpIHsgLy8gZmluZCBmcm9tIHplcm8KKyAgICAgICAgICAgIGlmICh1c2VfbWFza1swXSkgICAgICBpZHggPSAweDBGOworICAgICAgICAgICAgZWxzZSBpZiAodXNlX21hc2tbMV0pIGlkeCA9IDB4MUY7CisgICAgICAgICAgICBlbHNlIGlmICh1c2VfbWFza1syXSkgaWR4ID0gMHgyRjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHVzZV9tYXNrWzNdKSBpZHggPSAweDNGOworICAgICAgICAgICAgZWxzZSBpZiAodXNlX21hc2tbNF0pIGlkeCA9IDB4NEY7CisgICAgICAgICAgICBlbHNlIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlkeCAtPSBhdl9sb2cyXzE2Yml0KHVzZV9tYXNrW2lkeCA+PiA0XSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzZV9tYXNrW2lkeCA+PiA0XSAmICgweDgwMDAgPj4gKGlkeCAmIDE1KSkpIHsKKyAgICAgICAgICAgIHVzZV9tYXNrW2lkeCA+PiA0XSAmPSB+KDB4ODAwMCA+PiAoaWR4ICYgMTUpKTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIHN0YXJ0X29mZiA9IGlkeDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZjYi0+eFtmY2ItPm5dID0gc3RhcnRfb2ZmOworICAgIGZjYi0+eVtmY2ItPm5dID0gZ2V0X2JpdHMxKGdiKSA/IC0xLjAgOiAxLjA7CisgICAgZmNiLT5uKys7CisKKyAgICAvKiBzZXQgb2Zmc2V0IGZvciBuZXh0IGJsb2NrLCByZWxhdGl2ZSB0byBzdGFydCBvZiB0aGF0IGJsb2NrICovCisgICAgbiA9IChNQVhfRlJBTUVTSVpFIC8gMiAtIHN0YXJ0X29mZikgJSBmY2ItPnBpdGNoX2xhZzsKKyAgICBzLT5hd19uZXh0X3B1bHNlX29mZl9jYWNoZSA9IG4gPyBmY2ItPnBpdGNoX2xhZyAtIG4gOiAwOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEFwcGx5IGZpcnN0IHNldCBvZiBwaXRjaC1hZGFwdGl2ZSB3aW5kb3cgcHVsc2VzLgorICogQHBhcmFtIHMgV01BIFZvaWNlIGRlY29kaW5nIGNvbnRleHQgcHJpdmF0ZSBkYXRhCisgKiBAcGFyYW0gZ2IgYml0IEkvTyBjb250ZXh0CisgKiBAcGFyYW0gYmxvY2tfaWR4IGJsb2NrIGluZGV4IGluIGZyYW1lIFswLCAxXQorICogQHBhcmFtIGZjYiBzdG9yYWdlIGxvY2F0aW9uIGZvciBmaXhlZCBjb2RlYm9vayBwdWxzZSBpbmZvCisgKi8KK3N0YXRpYyB2b2lkIGF3X3B1bHNlX3NldDEoV01BVm9pY2VDb250ZXh0ICpzLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX2lkeCwgQU1SRml4ZWQgKmZjYikKK3sKKyAgICBpbnQgdmFsID0gZ2V0X2JpdHMoZ2IsIDEyIC0gMiAqIChzLT5hd19pZHhfaXNfZXh0ICYmICFibG9ja19pZHgpKTsKKyAgICBmbG9hdCB2OworCisgICAgaWYgKHMtPmF3X25fcHVsc2VzW2Jsb2NrX2lkeF0gPiAwKSB7CisgICAgICAgIGludCBuLCB2X21hc2ssIGlfbWFzaywgc2gsIG5fcHVsc2VzOworCisgICAgICAgIGlmIChzLT5hd19wdWxzZV9yYW5nZSA9PSAyNCkgeyAvLyAzIHB1bHNlcywgMTpzaWduICsgMzppbmRleCBlYWNoCisgICAgICAgICAgICBuX3B1bHNlcyA9IDM7CisgICAgICAgICAgICB2X21hc2sgICA9IDg7CisgICAgICAgICAgICBpX21hc2sgICA9IDc7CisgICAgICAgICAgICBzaCAgICAgICA9IDQ7CisgICAgICAgIH0gZWxzZSB7IC8vIDQgcHVsc2VzLCAxOnNpZ24gKyAyOmluZGV4IGVhY2gKKyAgICAgICAgICAgIG5fcHVsc2VzID0gNDsKKyAgICAgICAgICAgIHZfbWFzayAgID0gNDsKKyAgICAgICAgICAgIGlfbWFzayAgID0gMzsKKyAgICAgICAgICAgIHNoICAgICAgID0gMzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAobiA9IG5fcHVsc2VzIC0gMTsgbiA+PSAwOyBuLS0sIHZhbCA+Pj0gc2gpIHsKKyAgICAgICAgICAgIGZjYi0+eVtmY2ItPm5dID0gKHZhbCAmIHZfbWFzaykgPyAtMS4wIDogMS4wOworICAgICAgICAgICAgZmNiLT54W2ZjYi0+bl0gPSAodmFsICYgaV9tYXNrKSAqIG5fcHVsc2VzICsgbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hd19maXJzdF9wdWxzZV9vZmZbYmxvY2tfaWR4XTsKKyAgICAgICAgICAgIHdoaWxlIChmY2ItPnhbZmNiLT5uXSA8IDApCisgICAgICAgICAgICAgICAgZmNiLT54W2ZjYi0+bl0gKz0gZmNiLT5waXRjaF9sYWc7CisgICAgICAgICAgICBpZiAoZmNiLT54W2ZjYi0+bl0gPCBNQVhfRlJBTUVTSVpFIC8gMikKKyAgICAgICAgICAgICAgICBmY2ItPm4rKzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBudW0yID0gKHZhbCAmIDB4MUZGKSA+PiAxLCBkZWx0YSwgaWR4OworCisgICAgICAgIGlmIChudW0yIDwgMSAqIDc5KSAgICAgIHsgZGVsdGEgPSAxOyBpZHggPSBudW0yICsgMTsgfQorICAgICAgICBlbHNlIGlmIChudW0yIDwgMiAqIDc4KSB7IGRlbHRhID0gMzsgaWR4ID0gbnVtMiArIDEgLSAxICogNzc7IH0KKyAgICAgICAgZWxzZSBpZiAobnVtMiA8IDMgKiA3NykgeyBkZWx0YSA9IDU7IGlkeCA9IG51bTIgKyAxIC0gMiAqIDc2OyB9CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIHsgZGVsdGEgPSA3OyBpZHggPSBudW0yICsgMSAtIDMgKiA3NTsgfQorICAgICAgICB2ID0gKHZhbCAmIDB4MjAwKSA/IC0xLjAgOiAxLjA7CisKKyAgICAgICAgZmNiLT5ub19yZXBlYXRfbWFzayB8PSAzIDw8IGZjYi0+bjsKKyAgICAgICAgZmNiLT54W2ZjYi0+bl0gICAgICAgPSBpZHggLSBkZWx0YTsKKyAgICAgICAgZmNiLT55W2ZjYi0+bl0gICAgICAgPSB2OworICAgICAgICBmY2ItPnhbZmNiLT5uICsgMV0gICA9IGlkeDsKKyAgICAgICAgZmNiLT55W2ZjYi0+biArIDFdICAgPSAodmFsICYgMSkgPyAtdiA6IHY7CisgICAgICAgIGZjYi0+biAgICAgICAgICAgICAgKz0gMjsKKyAgICB9Cit9CisKKy8qKgorICogQH0KKyAqCisgKiBHZW5lcmF0ZSBhIHJhbmRvbSBudW1iZXIgZnJvbSBmcmFtZV9jbnRyIGFuZCBibG9ja19pZHgsIHdoaWNoIHdpbGwgbGllZgorICogaW4gdGhlIHJhbmdlIFswLCAxMDAwIC0gYmxvY2tfc2l6ZV0gKHNvIGl0IGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4IGluIGEKKyAqIHRhYmxlIG9mIHNpemUgMTAwMCBvZiB3aGljaCB5b3Ugd2FudCB0byByZWFkIGJsb2NrX3NpemUgZW50cmllcykuCisgKgorICogQHBhcmFtIGZyYW1lX2NudHIgY3VycmVudCBmcmFtZSBudW1iZXIKKyAqIEBwYXJhbSBibG9ja19udW0gY3VycmVudCBibG9jayBpbmRleAorICogQHBhcmFtIGJsb2NrX3NpemUgYW1vdW50IG9mIGVudHJpZXMgd2Ugd2FudCB0byByZWFkIGZyb20gYSB0YWJsZQorICogICAgICAgICAgICAgICAgICAgdGhhdCBoYXMgMTAwMCBlbnRyaWVzCisgKiBAcmV0dXJuIGEgKG5vbi0pcmFuZG9tIG51bWJlciBpbiB0aGUgWzAsIDEwMDAgLSBibG9ja19zaXplXSByYW5nZS4KKyAqLworc3RhdGljIGludCBwUk5HKGludCBmcmFtZV9jbnRyLCBpbnQgYmxvY2tfbnVtLCBpbnQgYmxvY2tfc2l6ZSkKK3sKKyAgICAvKiBhcnJheSB0byBzaW1wbGlmeSB0aGUgY2FsY3VsYXRpb24gb2YgejoKKyAgICAgKiB5ID0gKHggJSA5KSAqIDUgKyA2OworICAgICAqIHogPSAoNDk5OTUgKiB4KSAvIHk7CisgICAgICogU2luY2UgeSBvbmx5IGhhcyA5IHZhbHVlcywgd2UgY2FuIHJlbW92ZSB0aGUgZGl2aXNpb24gYnkgdXNpbmcgYQorICAgICAqIExVVCBhbmQgdXNpbmcgRkFTVERJVi1zdHlsZSBkaXZpc2lvbnMuIEZvciBlYWNoIG9mIHRoZSA5IHZhbHVlcworICAgICAqIG9mIHksIHdlIGNhbiByZXdyaXRlIHogYXM6CisgICAgICogeiA9IHggKiAoNDk5OTUgLyB5KSArIHggKiAoKDQ5OTk1ICUgeSkgLyB5KQorICAgICAqIEluIHRoaXMgdGFibGUsIGVhY2ggY29sIHJlcHJlc2VudHMgb25lIHBvc3NpYmxlIHZhbHVlIG9mIHksIHRoZQorICAgICAqIGZpcnN0IG51bWJlciBpcyA0OTk5NSAvIHksIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBGQVNURElWIHZhcmlhbnQKKyAgICAgKiBvZiA0OTk5NSAlIHkgLyB5LiAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZGl2X3RibFs5XVsyXSA9IHsKKyAgICAgICAgeyA4MzMyLCAgMyAqIDcxNTgyNzg4M1UgfSwgLy8geSA9ICA2CisgICAgICAgIHsgNDU0NSwgIDAgKiAzOTA0NTE1NzNVIH0sIC8vIHkgPSAxMQorICAgICAgICB7IDMxMjQsIDExICogMjY4NDM1NDU2VSB9LCAvLyB5ID0gMTYKKyAgICAgICAgeyAyMzgwLCAxNSAqIDIwNDUyMjI1M1UgfSwgLy8geSA9IDIxCisgICAgICAgIHsgMTkyMiwgMjMgKiAxNjUxOTEwNTBVIH0sIC8vIHkgPSAyNgorICAgICAgICB7IDE2MTIsIDIzICogMTM4NTQ3MzMzVSB9LCAvLyB5ID0gMzEKKyAgICAgICAgeyAxMzg4LCAyNyAqIDExOTMwNDY0OFUgfSwgLy8geSA9IDM2CisgICAgICAgIHsgMTIxOSwgMTYgKiAxMDQ3NTUzMDBVIH0sIC8vIHkgPSA0MQorICAgICAgICB7IDEwODYsIDM5ICogIDkzMzY4ODU1VSB9ICAvLyB5ID0gNDYKKyAgICB9OworICAgIHVuc2lnbmVkIGludCB6LCB5LCB4ID0gTVVMMTYoYmxvY2tfbnVtLCAxODc3KSArIGZyYW1lX2NudHI7CisgICAgaWYgKHggPj0gMHhGRkZGKSB4IC09IDB4RkZGRjsgICAvLyBtYXggdmFsdWUgb2YgeCBpcyA4KjE4NzcrMHhGRkZFPTB4MTNBQTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGlzIGlzIGVmZmVjdGl2ZWx5IGEgbW9kdWxvICglKQorICAgIHkgPSB4IC0gOSAqIE1VTEgoNDc3MjE4NTg5LCB4KTsgLy8geCAlIDkKKyAgICB6ID0gKHVpbnQxNl90KSAoeCAqIGRpdl90YmxbeV1bMF0gKyBVTVVMSCh4LCBkaXZfdGJsW3ldWzFdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB6ID0geCAqIDQ5OTk1IC8gKHkgKiA1ICsgNikKKyAgICByZXR1cm4geiAlICgxMDAwIC0gYmxvY2tfc2l6ZSk7Cit9CisKKy8qKgorICogUGFyc2UgaGFyZGNvZGVkIHNpZ25hbCBmb3IgYSBzaW5nbGUgYmxvY2suCisgKiBAbm90ZSBzZWUgI3N5bnRoX2Jsb2NrKCkuCisgKi8KK3N0YXRpYyB2b2lkIHN5bnRoX2Jsb2NrX2hhcmRjb2RlZChXTUFWb2ljZUNvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX2lkeCwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZnJhbWVfdHlwZV9kZXNjICpmcmFtZV9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmV4Y2l0YXRpb24pCit7CisgICAgZmxvYXQgZ2FpbjsKKyAgICBpbnQgbiwgcl9pZHg7CisKKyAgICBhdl9hc3NlcnQwKHNpemUgPD0gTUFYX0ZSQU1FU0laRSk7CisKKyAgICAvKiBTZXQgdGhlIG9mZnNldCBmcm9tIHdoaWNoIHdlIHN0YXJ0IHJlYWRpbmcgd21hdm9pY2Vfc3RkX2NvZGVib29rICovCisgICAgaWYgKGZyYW1lX2Rlc2MtPmZjYl90eXBlID09IEZDQl9UWVBFX1NJTEVOQ0UpIHsKKyAgICAgICAgcl9pZHggPSBwUk5HKHMtPmZyYW1lX2NudHIsIGJsb2NrX2lkeCwgc2l6ZSk7CisgICAgICAgIGdhaW4gID0gcy0+c2lsZW5jZV9nYWluOworICAgIH0gZWxzZSAvKiBGQ0JfVFlQRV9IQVJEQ09ERUQgKi8geworICAgICAgICByX2lkeCA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgZ2FpbiAgPSB3bWF2b2ljZV9nYWluX3VuaXZlcnNhbFtnZXRfYml0cyhnYiwgNildOworICAgIH0KKworICAgIC8qIENsZWFyIGdhaW4gcHJlZGljdGlvbiBwYXJhbWV0ZXJzICovCisgICAgbWVtc2V0KHMtPmdhaW5fcHJlZF9lcnIsIDAsIHNpemVvZihzLT5nYWluX3ByZWRfZXJyKSk7CisKKyAgICAvKiBBcHBseSBnYWluIHRvIGhhcmRjb2RlZCBjb2RlYm9vayBhbmQgdXNlIHRoYXQgYXMgZXhjaXRhdGlvbiBzaWduYWwgKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgc2l6ZTsgbisrKQorICAgICAgICBleGNpdGF0aW9uW25dID0gd21hdm9pY2Vfc3RkX2NvZGVib29rW3JfaWR4ICsgbl0gKiBnYWluOworfQorCisvKioKKyAqIFBhcnNlIEZDQi9BQ0Igc2lnbmFsIGZvciBhIHNpbmdsZSBibG9jay4KKyAqIEBub3RlIHNlZSAjc3ludGhfYmxvY2soKS4KKyAqLworc3RhdGljIHZvaWQgc3ludGhfYmxvY2tfZmNiX2FjYihXTUFWb2ljZUNvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfaWR4LCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3BpdGNoX3NoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZyYW1lX3R5cGVfZGVzYyAqZnJhbWVfZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmV4Y2l0YXRpb24pCit7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGdhaW5fY29lZmZbNl0gPSB7CisgICAgICAgIDAuODE2OSwgLTAuMDY1NDUsIDAuMTcyNiwgMC4wMTg1LCAtMC4wMzU5LCAwLjA0NTgKKyAgICB9OworICAgIGZsb2F0IHB1bHNlc1tNQVhfRlJBTUVTSVpFIC8gMl0sIHByZWRfZXJyLCBhY2JfZ2FpbiwgZmNiX2dhaW47CisgICAgaW50IG4sIGlkeCwgZ2Fpbl93ZWlnaHQ7CisgICAgQU1SRml4ZWQgZmNiOworCisgICAgYXZfYXNzZXJ0MChzaXplIDw9IE1BWF9GUkFNRVNJWkUgLyAyKTsKKyAgICBtZW1zZXQocHVsc2VzLCAwLCBzaXplb2YoKnB1bHNlcykgKiBzaXplKTsKKworICAgIGZjYi5waXRjaF9sYWcgICAgICA9IGJsb2NrX3BpdGNoX3NoMiA+PiAyOworICAgIGZjYi5waXRjaF9mYWMgICAgICA9IDEuMDsKKyAgICBmY2Iubm9fcmVwZWF0X21hc2sgPSAwOworICAgIGZjYi5uICAgICAgICAgICAgICA9IDA7CisKKyAgICAvKiBGb3IgdGhlIG90aGVyIGZyYW1lIHR5cGVzLCB0aGlzIGlzIHdoZXJlIHdlIGFwcGx5IHRoZSBpbm5vdmF0aW9uCisgICAgICogKGZpeGVkKSBjb2RlYm9vayBwdWxzZXMgb2YgdGhlIHNwZWVjaCBzaWduYWwuICovCisgICAgaWYgKGZyYW1lX2Rlc2MtPmZjYl90eXBlID09IEZDQl9UWVBFX0FXX1BVTFNFUykgeworICAgICAgICBhd19wdWxzZV9zZXQxKHMsIGdiLCBibG9ja19pZHgsICZmY2IpOworICAgICAgICBpZiAoYXdfcHVsc2Vfc2V0MihzLCBnYiwgYmxvY2tfaWR4LCAmZmNiKSkgeworICAgICAgICAgICAgLyogQ29uY2VhbCB0aGUgYmxvY2sgd2l0aCBzaWxlbmNlIGFuZCByZXR1cm4uCisgICAgICAgICAgICAgKiBTa2lwIHRoZSBjb3JyZWN0IGFtb3VudCBvZiBiaXRzIHRvIHJlYWQgdGhlIG5leHQKKyAgICAgICAgICAgICAqIGJsb2NrIGZyb20gdGhlIGNvcnJlY3Qgb2Zmc2V0LiAqLworICAgICAgICAgICAgaW50IHJfaWR4ID0gcFJORyhzLT5mcmFtZV9jbnRyLCBibG9ja19pZHgsIHNpemUpOworCisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgc2l6ZTsgbisrKQorICAgICAgICAgICAgICAgIGV4Y2l0YXRpb25bbl0gPQorICAgICAgICAgICAgICAgICAgICB3bWF2b2ljZV9zdGRfY29kZWJvb2tbcl9pZHggKyBuXSAqIHMtPnNpbGVuY2VfZ2FpbjsKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNyArIDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIC8qIEZDQl9UWVBFX0VYQ19QVUxTRVMgKi8geworICAgICAgICBpbnQgb2Zmc2V0X25iaXRzID0gNSAtIGZyYW1lX2Rlc2MtPmxvZ19uX2Jsb2NrczsKKworICAgICAgICBmY2Iubm9fcmVwZWF0X21hc2sgPSAtMTsKKyAgICAgICAgLyogc2ltaWxhciB0byBmZl9kZWNvZGVfMTBfcHVsc2VzXzM1Yml0cygpLCBidXQgd2l0aCBzaW5nbGUgcHVsc2VzCisgICAgICAgICAqIChpbnN0ZWFkIG9mIGRvdWJsZSkgZm9yIGEgc3Vic2V0IG9mIHB1bHNlcyAqLworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgNTsgbisrKSB7CisgICAgICAgICAgICBmbG9hdCBzaWduOworICAgICAgICAgICAgaW50IHBvczEsIHBvczI7CisKKyAgICAgICAgICAgIHNpZ24gICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKSA/IDEuMCA6IC0xLjA7CisgICAgICAgICAgICBwb3MxICAgICAgICAgICA9IGdldF9iaXRzKGdiLCBvZmZzZXRfbmJpdHMpOworICAgICAgICAgICAgZmNiLnhbZmNiLm5dICAgPSBuICsgNSAqIHBvczE7CisgICAgICAgICAgICBmY2IueVtmY2IubisrXSA9IHNpZ247CisgICAgICAgICAgICBpZiAobiA8IGZyYW1lX2Rlc2MtPmRibF9wdWxzZXMpIHsKKyAgICAgICAgICAgICAgICBwb3MyICAgICAgICAgICA9IGdldF9iaXRzKGdiLCBvZmZzZXRfbmJpdHMpOworICAgICAgICAgICAgICAgIGZjYi54W2ZjYi5uXSAgID0gbiArIDUgKiBwb3MyOworICAgICAgICAgICAgICAgIGZjYi55W2ZjYi5uKytdID0gKHBvczEgPCBwb3MyKSA/IC1zaWduIDogc2lnbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmZl9zZXRfZml4ZWRfdmVjdG9yKHB1bHNlcywgJmZjYiwgMS4wLCBzaXplKTsKKworICAgIC8qIENhbGN1bGF0ZSBnYWluIGZvciBhZGFwdGl2ZSAmIGZpeGVkIGNvZGVib29rIHNpZ25hbC4KKyAgICAgKiBzZWUgZmZfYW1yX3NldF9maXhlZF9nYWluKCkuICovCisgICAgaWR4ID0gZ2V0X2JpdHMoZ2IsIDcpOworICAgIGZjYl9nYWluID0gZXhwZihhdnByaXZfc2NhbGFycHJvZHVjdF9mbG9hdF9jKHMtPmdhaW5fcHJlZF9lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl9jb2VmZiwgNikgLQorICAgICAgICAgICAgICAgICAgICA1LjI0MDkxNjE2NDAgKyB3bWF2b2ljZV9nYWluX2NvZGVib29rX2ZjYltpZHhdKTsKKyAgICBhY2JfZ2FpbiA9IHdtYXZvaWNlX2dhaW5fY29kZWJvb2tfYWNiW2lkeF07CisgICAgcHJlZF9lcnIgPSBhdl9jbGlwZih3bWF2b2ljZV9nYWluX2NvZGVib29rX2ZjYltpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgLTIuOTk1NzMyMjczNiAvKiBsb2coMC4wNSkgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgMS42MDk0Mzc5MTI0IC8qIGxvZyg1LjApICAqLyk7CisKKyAgICBnYWluX3dlaWdodCA9IDggPj4gZnJhbWVfZGVzYy0+bG9nX25fYmxvY2tzOworICAgIG1lbW1vdmUoJnMtPmdhaW5fcHJlZF9lcnJbZ2Fpbl93ZWlnaHRdLCBzLT5nYWluX3ByZWRfZXJyLAorICAgICAgICAgICAgc2l6ZW9mKCpzLT5nYWluX3ByZWRfZXJyKSAqICg2IC0gZ2Fpbl93ZWlnaHQpKTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgZ2Fpbl93ZWlnaHQ7IG4rKykKKyAgICAgICAgcy0+Z2Fpbl9wcmVkX2VycltuXSA9IHByZWRfZXJyOworCisgICAgLyogQ2FsY3VsYXRpb24gb2YgYWRhcHRpdmUgY29kZWJvb2sgKi8KKyAgICBpZiAoZnJhbWVfZGVzYy0+YWNiX3R5cGUgPT0gQUNCX1RZUEVfQVNZTU1FVFJJQykgeworICAgICAgICBpbnQgbGVuOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgc2l6ZTsgbiArPSBsZW4pIHsKKyAgICAgICAgICAgIGludCBuZXh0X2lkeF9zaDE2OworICAgICAgICAgICAgaW50IGFic19pZHggICAgPSBibG9ja19pZHggKiBzaXplICsgbjsKKyAgICAgICAgICAgIGludCBwaXRjaF9zaDE2ID0gKHMtPmxhc3RfcGl0Y2hfdmFsIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBpdGNoX2RpZmZfc2gxNiAqIGFic19pZHg7CisgICAgICAgICAgICBpbnQgcGl0Y2ggICAgICA9IChwaXRjaF9zaDE2ICsgMHg2RkZGKSA+PiAxNjsKKyAgICAgICAgICAgIGludCBpZHhfc2gxNiAgID0gKChwaXRjaCA8PCAxNikgLSBwaXRjaF9zaDE2KSAqIDggKyAweDU4MDAwOworICAgICAgICAgICAgaWR4ICAgICAgICAgICAgPSBpZHhfc2gxNiA+PiAxNjsKKyAgICAgICAgICAgIGlmIChzLT5waXRjaF9kaWZmX3NoMTYpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+cGl0Y2hfZGlmZl9zaDE2ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBuZXh0X2lkeF9zaDE2ID0gKGlkeF9zaDE2KSAmfiAweEZGRkY7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5leHRfaWR4X3NoMTYgPSAoaWR4X3NoMTYgKyAweDEwMDAwKSAmfiAweEZGRkY7CisgICAgICAgICAgICAgICAgbGVuID0gYXZfY2xpcCgoaWR4X3NoMTYgLSBuZXh0X2lkeF9zaDE2KSAvIHMtPnBpdGNoX2RpZmZfc2gxNiAvIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBzaXplIC0gbik7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBsZW4gPSBzaXplOworCisgICAgICAgICAgICBmZl9hY2VscF9pbnRlcnBvbGF0ZWYoJmV4Y2l0YXRpb25bbl0sICZleGNpdGF0aW9uW24gLSBwaXRjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd21hdm9pY2VfaXBvbDFfY29lZmZzLCAxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgsIDksIGxlbik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgLyogQUNCX1RZUEVfSEFNTUlORyAqLyB7CisgICAgICAgIGludCBibG9ja19waXRjaCA9IGJsb2NrX3BpdGNoX3NoMiA+PiAyOworICAgICAgICBpZHggICAgICAgICAgICAgPSBibG9ja19waXRjaF9zaDIgJiAzOworICAgICAgICBpZiAoaWR4KSB7CisgICAgICAgICAgICBmZl9hY2VscF9pbnRlcnBvbGF0ZWYoZXhjaXRhdGlvbiwgJmV4Y2l0YXRpb25bLWJsb2NrX3BpdGNoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bWF2b2ljZV9pcG9sMl9jb2VmZnMsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4LCA4LCBzaXplKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhdl9tZW1jcHlfYmFja3B0cigodWludDhfdCAqKSBleGNpdGF0aW9uLCBzaXplb2YoZmxvYXQpICogYmxvY2tfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpICogc2l6ZSk7CisgICAgfQorCisgICAgLyogSW50ZXJwb2xhdGUgQUNCL0ZDQiBhbmQgdXNlIGFzIGV4Y2l0YXRpb24gc2lnbmFsICovCisgICAgZmZfd2VpZ2h0ZWRfdmVjdG9yX3N1bWYoZXhjaXRhdGlvbiwgZXhjaXRhdGlvbiwgcHVsc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjYl9nYWluLCBmY2JfZ2Fpbiwgc2l6ZSk7Cit9CisKKy8qKgorICogUGFyc2UgZGF0YSBpbiBhIHNpbmdsZSBibG9jay4KKyAqIEBub3RlIHdlIGFzc3VtZSBlbm91Z2ggYml0cyBhcmUgYXZhaWxhYmxlLCBjYWxsZXIgc2hvdWxkIGNoZWNrLgorICoKKyAqIEBwYXJhbSBzIFdNQSBWb2ljZSBkZWNvZGluZyBjb250ZXh0IHByaXZhdGUgZGF0YQorICogQHBhcmFtIGdiIGJpdCBJL08gY29udGV4dAorICogQHBhcmFtIGJsb2NrX2lkeCBpbmRleCBvZiB0aGUgdG8tYmUtcmVhZCBibG9jaworICogQHBhcmFtIHNpemUgYW1vdW50IG9mIHNhbXBsZXMgdG8gYmUgcmVhZCBpbiB0aGlzIGJsb2NrCisgKiBAcGFyYW0gYmxvY2tfcGl0Y2hfc2gyIHBpdGNoIGZvciB0aGlzIGJsb2NrIDw8IDIKKyAqIEBwYXJhbSBsc3BzIExTUHMgZm9yICh0aGUgZW5kIG9mKSB0aGlzIGZyYW1lCisgKiBAcGFyYW0gcHJldl9sc3BzIExTUHMgZm9yIHRoZSBsYXN0IGZyYW1lCisgKiBAcGFyYW0gZnJhbWVfZGVzYyBmcmFtZSB0eXBlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBleGNpdGF0aW9uIHRhcmdldCBtZW1vcnkgZm9yIHRoZSBBQ0IrRkNCIGludGVycG9sYXRlZCBzaWduYWwKKyAqIEBwYXJhbSBzeW50aCB0YXJnZXQgbWVtb3J5IGZvciB0aGUgc3BlZWNoIHN5bnRoZXNpcyBmaWx0ZXIgb3V0cHV0CisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IuCisgKi8KK3N0YXRpYyB2b2lkIHN5bnRoX2Jsb2NrKFdNQVZvaWNlQ29udGV4dCAqcywgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfaWR4LCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19waXRjaF9zaDIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKmxzcHMsIGNvbnN0IGRvdWJsZSAqcHJldl9sc3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZyYW1lX3R5cGVfZGVzYyAqZnJhbWVfZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpleGNpdGF0aW9uLCBmbG9hdCAqc3ludGgpCit7CisgICAgZG91YmxlIGlfbHNwc1tNQVhfTFNQU107CisgICAgZmxvYXQgbHBjc1tNQVhfTFNQU107CisgICAgZmxvYXQgZmFjOworICAgIGludCBuOworCisgICAgaWYgKGZyYW1lX2Rlc2MtPmFjYl90eXBlID09IEFDQl9UWVBFX05PTkUpCisgICAgICAgIHN5bnRoX2Jsb2NrX2hhcmRjb2RlZChzLCBnYiwgYmxvY2tfaWR4LCBzaXplLCBmcmFtZV9kZXNjLCBleGNpdGF0aW9uKTsKKyAgICBlbHNlCisgICAgICAgIHN5bnRoX2Jsb2NrX2ZjYl9hY2IocywgZ2IsIGJsb2NrX2lkeCwgc2l6ZSwgYmxvY2tfcGl0Y2hfc2gyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2Rlc2MsIGV4Y2l0YXRpb24pOworCisgICAgLyogY29udmVydCBpbnRlcnBvbGF0ZWQgTFNQcyB0byBMUENzICovCisgICAgZmFjID0gKGJsb2NrX2lkeCArIDAuNSkgLyBmcmFtZV9kZXNjLT5uX2Jsb2NrczsKKyAgICBmb3IgKG4gPSAwOyBuIDwgcy0+bHNwczsgbisrKSAvLyBMU0YgLT4gTFNQCisgICAgICAgIGlfbHNwc1tuXSA9IGNvcyhwcmV2X2xzcHNbbl0gKyBmYWMgKiAobHNwc1tuXSAtIHByZXZfbHNwc1tuXSkpOworICAgIGZmX2FjZWxwX2xzcGQybHBjKGlfbHNwcywgbHBjcywgcy0+bHNwcyA+PiAxKTsKKworICAgIC8qIFNwZWVjaCBzeW50aGVzaXMgKi8KKyAgICBmZl9jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXJmKHN5bnRoLCBscGNzLCBleGNpdGF0aW9uLCBzaXplLCBzLT5sc3BzKTsKK30KKworLyoqCisgKiBTeW50aGVzaXplIG91dHB1dCBzYW1wbGVzIGZvciBhIHNpbmdsZSBmcmFtZS4KKyAqIEBub3RlIHdlIGFzc3VtZSBlbm91Z2ggYml0cyBhcmUgYXZhaWxhYmxlLCBjYWxsZXIgc2hvdWxkIGNoZWNrLgorICoKKyAqIEBwYXJhbSBjdHggV01BIFZvaWNlIGRlY29kZXIgY29udGV4dAorICogQHBhcmFtIGdiIGJpdCBJL08gY29udGV4dCAocy0+Z2Igb3Igb25lIGZvciBjcm9zcy1wYWNrZXQgc3VwZXJmcmFtZXMpCisgKiBAcGFyYW0gZnJhbWVfaWR4IEZyYW1lIG51bWJlciB3aXRoaW4gc3VwZXJmcmFtZSBbMC0yXQorICogQHBhcmFtIHNhbXBsZXMgcG9pbnRlciB0byBvdXRwdXQgc2FtcGxlIGJ1ZmZlciwgaGFzIHNwYWNlIGZvciBhdCBsZWFzdCAxNjAKKyAqICAgICAgICAgICAgICAgIHNhbXBsZXMKKyAqIEBwYXJhbSBsc3BzIExTUCBhcnJheQorICogQHBhcmFtIHByZXZfbHNwcyBhcnJheSBvZiBwcmV2aW91cyBmcmFtZSdzIExTUHMKKyAqIEBwYXJhbSBleGNpdGF0aW9uIHRhcmdldCBidWZmZXIgZm9yIGV4Y2l0YXRpb24gc2lnbmFsCisgKiBAcGFyYW0gc3ludGggdGFyZ2V0IGJ1ZmZlciBmb3Igc3ludGhlc2l6ZWQgc3BlZWNoIGRhdGEKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBzeW50aF9mcmFtZShBVkNvZGVjQ29udGV4dCAqY3R4LCBHZXRCaXRDb250ZXh0ICpnYiwgaW50IGZyYW1lX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqbHNwcywgY29uc3QgZG91YmxlICpwcmV2X2xzcHMsCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpleGNpdGF0aW9uLCBmbG9hdCAqc3ludGgpCit7CisgICAgV01BVm9pY2VDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IG4sIG5fYmxvY2tzX3gyLCBsb2dfbl9ibG9ja3NfeDIsIGF2X3VuaW5pdChjdXJfcGl0Y2hfdmFsKTsKKyAgICBpbnQgcGl0Y2hbTUFYX0JMT0NLU10sIGF2X3VuaW5pdChsYXN0X2Jsb2NrX3BpdGNoKTsKKworICAgIC8qIFBhcnNlIGZyYW1lIHR5cGUgKCJmcmFtZSBoZWFkZXIiKSwgc2VlIGZyYW1lX2Rlc2NzICovCisgICAgaW50IGJkX2lkeCA9IHMtPnZibV90cmVlW2dldF92bGMyKGdiLCBmcmFtZV90eXBlX3ZsYy50YWJsZSwgNiwgMyldLCBibG9ja19uc2FtcGxlczsKKworICAgIGlmIChiZF9pZHggPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIGZyYW1lIHR5cGUgVkxDIGNvZGUsIHNraXBwaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYmxvY2tfbnNhbXBsZXMgPSBNQVhfRlJBTUVTSVpFIC8gZnJhbWVfZGVzY3NbYmRfaWR4XS5uX2Jsb2NrczsKKworICAgIC8qIFBpdGNoIGNhbGN1bGF0aW9uIGZvciBBQ0JfVFlQRV9BU1lNTUVUUklDICgicGl0Y2gtcGVyLWZyYW1lIikgKi8KKyAgICBpZiAoZnJhbWVfZGVzY3NbYmRfaWR4XS5hY2JfdHlwZSA9PSBBQ0JfVFlQRV9BU1lNTUVUUklDKSB7CisgICAgICAgIC8qIFBpdGNoIGlzIHByb3ZpZGVkIHBlciBmcmFtZSwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIHBpdGNoIG9mCisgICAgICAgICAqIHRoZSBsYXN0IHNhbXBsZSBvZiB0aGUgbGFzdCBibG9jayBvZiB0aGlzIGZyYW1lLiBXZSBjYW4gaW50ZXJwb2xhdGUKKyAgICAgICAgICogdGhlIHBpdGNoIG9mIG90aGVyIGJsb2NrcyAoYW5kIGV2ZW4gcGl0Y2gtcGVyLXNhbXBsZSkgYnkgZ3JhZHVhbGx5CisgICAgICAgICAqIGluY3JlbWVudGluZy9kZWNyZW1lbnRpbmcgcHJldl9mcmFtZV9waXRjaCB0byBjdXJfcGl0Y2hfdmFsLiAqLworICAgICAgICBuX2Jsb2Nrc194MiAgICAgID0gZnJhbWVfZGVzY3NbYmRfaWR4XS5uX2Jsb2NrcyA8PCAxOworICAgICAgICBsb2dfbl9ibG9ja3NfeDIgID0gZnJhbWVfZGVzY3NbYmRfaWR4XS5sb2dfbl9ibG9ja3MgKyAxOworICAgICAgICBjdXJfcGl0Y2hfdmFsICAgID0gcy0+bWluX3BpdGNoX3ZhbCArIGdldF9iaXRzKGdiLCBzLT5waXRjaF9uYml0cyk7CisgICAgICAgIGN1cl9waXRjaF92YWwgICAgPSBGRk1JTihjdXJfcGl0Y2hfdmFsLCBzLT5tYXhfcGl0Y2hfdmFsIC0gMSk7CisgICAgICAgIGlmIChzLT5sYXN0X2FjYl90eXBlID09IEFDQl9UWVBFX05PTkUgfHwKKyAgICAgICAgICAgIDIwICogYWJzKGN1cl9waXRjaF92YWwgLSBzLT5sYXN0X3BpdGNoX3ZhbCkgPgorICAgICAgICAgICAgICAgIChjdXJfcGl0Y2hfdmFsICsgcy0+bGFzdF9waXRjaF92YWwpKQorICAgICAgICAgICAgcy0+bGFzdF9waXRjaF92YWwgPSBjdXJfcGl0Y2hfdmFsOworCisgICAgICAgIC8qIHBpdGNoIHBlciBibG9jayAqLworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZnJhbWVfZGVzY3NbYmRfaWR4XS5uX2Jsb2NrczsgbisrKSB7CisgICAgICAgICAgICBpbnQgZmFjID0gbiAqIDIgKyAxOworCisgICAgICAgICAgICBwaXRjaFtuXSA9IChNVUwxNihmYWMsICAgICAgICAgICAgICAgICBjdXJfcGl0Y2hfdmFsKSArCisgICAgICAgICAgICAgICAgICAgICAgICBNVUwxNigobl9ibG9ja3NfeDIgLSBmYWMpLCBzLT5sYXN0X3BpdGNoX3ZhbCkgKworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfZGVzY3NbYmRfaWR4XS5uX2Jsb2NrcykgPj4gbG9nX25fYmxvY2tzX3gyOworICAgICAgICB9CisKKyAgICAgICAgLyogInBpdGNoLWRpZmYtcGVyLXNhbXBsZSIgZm9yIGNhbGN1bGF0aW9uIG9mIHBpdGNoIHBlciBzYW1wbGUgKi8KKyAgICAgICAgcy0+cGl0Y2hfZGlmZl9zaDE2ID0KKyAgICAgICAgICAgICgoY3VyX3BpdGNoX3ZhbCAtIHMtPmxhc3RfcGl0Y2hfdmFsKSA8PCAxNikgLyBNQVhfRlJBTUVTSVpFOworICAgIH0KKworICAgIC8qIEdsb2JhbCBnYWluIChpZiBzaWxlbmNlKSBhbmQgcGl0Y2gtYWRhcHRpdmUgd2luZG93IGNvb3JkaW5hdGVzICovCisgICAgc3dpdGNoIChmcmFtZV9kZXNjc1tiZF9pZHhdLmZjYl90eXBlKSB7CisgICAgY2FzZSBGQ0JfVFlQRV9TSUxFTkNFOgorICAgICAgICBzLT5zaWxlbmNlX2dhaW4gPSB3bWF2b2ljZV9nYWluX3NpbGVuY2VbZ2V0X2JpdHMoZ2IsIDgpXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGQ0JfVFlQRV9BV19QVUxTRVM6CisgICAgICAgIGF3X3BhcnNlX2Nvb3JkcyhzLCBnYiwgcGl0Y2gpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgZnJhbWVfZGVzY3NbYmRfaWR4XS5uX2Jsb2NrczsgbisrKSB7CisgICAgICAgIGludCBibF9waXRjaF9zaDI7CisKKyAgICAgICAgLyogUGl0Y2ggY2FsY3VsYXRpb24gZm9yIEFDQl9UWVBFX0hBTU1JTkcgKCJwaXRjaC1wZXItYmxvY2siKSAqLworICAgICAgICBzd2l0Y2ggKGZyYW1lX2Rlc2NzW2JkX2lkeF0uYWNiX3R5cGUpIHsKKyAgICAgICAgY2FzZSBBQ0JfVFlQRV9IQU1NSU5HOiB7CisgICAgICAgICAgICAvKiBQaXRjaCBpcyBnaXZlbiBwZXIgYmxvY2suIFBlci1ibG9jayBwaXRjaGVzIGFyZSBlbmNvZGVkIGFzIGFuCisgICAgICAgICAgICAgKiBhYnNvbHV0ZSB2YWx1ZSBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbmQgdGhlbiBkZWx0YSB2YWx1ZXMKKyAgICAgICAgICAgICAqIHJlbGF0aXZlIHRvIHRoaXMgdmFsdWUpIGZvciBhbGwgc3Vic2VxdWVudCBibG9ja3MuIFRoZSBzY2FsZSBvZgorICAgICAgICAgICAgICogdGhpcyBwaXRjaCB2YWx1ZSBpcyBzZW1pLWxvZ2FyaXRtaWMgY29tcGFyZWQgdG8gaXRzIHVzZSBpbiB0aGUKKyAgICAgICAgICAgICAqIGRlY29kZXIsIHNvIHdlIGNvbnZlcnQgaXQgdG8gbm9ybWFsIHNjYWxlIGFsc28uICovCisgICAgICAgICAgICBpbnQgYmxvY2tfcGl0Y2gsCisgICAgICAgICAgICAgICAgdDEgPSAocy0+YmxvY2tfY29udl90YWJsZVsxXSAtIHMtPmJsb2NrX2NvbnZfdGFibGVbMF0pIDw8IDIsCisgICAgICAgICAgICAgICAgdDIgPSAocy0+YmxvY2tfY29udl90YWJsZVsyXSAtIHMtPmJsb2NrX2NvbnZfdGFibGVbMV0pIDw8IDEsCisgICAgICAgICAgICAgICAgdDMgPSAgcy0+YmxvY2tfY29udl90YWJsZVszXSAtIHMtPmJsb2NrX2NvbnZfdGFibGVbMl0gKyAxOworCisgICAgICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICAgICAgYmxvY2tfcGl0Y2ggPSBnZXRfYml0cyhnYiwgcy0+YmxvY2tfcGl0Y2hfbmJpdHMpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYmxvY2tfcGl0Y2ggPSBsYXN0X2Jsb2NrX3BpdGNoIC0gcy0+YmxvY2tfZGVsdGFfcGl0Y2hfaHJhbmdlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzKGdiLCBzLT5ibG9ja19kZWx0YV9waXRjaF9uYml0cyk7CisgICAgICAgICAgICAvKiBDb252ZXJ0IGxhc3RfIHNvIHRoYXQgYW55IG5leHQgZGVsdGEgaXMgd2l0aGluIF9yYW5nZSAqLworICAgICAgICAgICAgbGFzdF9ibG9ja19waXRjaCA9IGF2X2NsaXAoYmxvY2tfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19kZWx0YV9waXRjaF9ocmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19waXRjaF9yYW5nZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfZGVsdGFfcGl0Y2hfaHJhbmdlKTsKKworICAgICAgICAgICAgLyogQ29udmVydCBzZW1pLWxvZy1zdHlsZSBzY2FsZSBiYWNrIHRvIG5vcm1hbCBzY2FsZSAqLworICAgICAgICAgICAgaWYgKGJsb2NrX3BpdGNoIDwgdDEpIHsKKyAgICAgICAgICAgICAgICBibF9waXRjaF9zaDIgPSAocy0+YmxvY2tfY29udl90YWJsZVswXSA8PCAyKSArIGJsb2NrX3BpdGNoOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBibG9ja19waXRjaCAtPSB0MTsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2tfcGl0Y2ggPCB0MikgeworICAgICAgICAgICAgICAgICAgICBibF9waXRjaF9zaDIgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmJsb2NrX2NvbnZfdGFibGVbMV0gPDwgMikgKyAoYmxvY2tfcGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfcGl0Y2ggLT0gdDI7CisgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja19waXRjaCA8IHQzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBibF9waXRjaF9zaDIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5ibG9ja19jb252X3RhYmxlWzJdICsgYmxvY2tfcGl0Y2gpIDw8IDI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYmxfcGl0Y2hfc2gyID0gcy0+YmxvY2tfY29udl90YWJsZVszXSA8PCAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpdGNoW25dID0gYmxfcGl0Y2hfc2gyID4+IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQUNCX1RZUEVfQVNZTU1FVFJJQzogeworICAgICAgICAgICAgYmxfcGl0Y2hfc2gyID0gcGl0Y2hbbl0gPDwgMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDogLy8gQUNCX1RZUEVfTk9ORSBoYXMgbm8gcGl0Y2gKKyAgICAgICAgICAgIGJsX3BpdGNoX3NoMiA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN5bnRoX2Jsb2NrKHMsIGdiLCBuLCBibG9ja19uc2FtcGxlcywgYmxfcGl0Y2hfc2gyLAorICAgICAgICAgICAgICAgICAgICBsc3BzLCBwcmV2X2xzcHMsICZmcmFtZV9kZXNjc1tiZF9pZHhdLAorICAgICAgICAgICAgICAgICAgICAmZXhjaXRhdGlvbltuICogYmxvY2tfbnNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAmc3ludGhbbiAqIGJsb2NrX25zYW1wbGVzXSk7CisgICAgfQorCisgICAgLyogQXZlcmFnaW5nIHByb2plY3Rpb24gZmlsdGVyLCBpZiBhcHBsaWNhYmxlLiBFbHNlLCBqdXN0IGNvcHkgc2FtcGxlcworICAgICAqIGZyb20gc3ludGhlc2lzIGJ1ZmZlciAqLworICAgIGlmIChzLT5kb19hcGYpIHsKKyAgICAgICAgZG91YmxlIGlfbHNwc1tNQVhfTFNQU107CisgICAgICAgIGZsb2F0IGxwY3NbTUFYX0xTUFNdOworCisgICAgICAgIGZvciAobiA9IDA7IG4gPCBzLT5sc3BzOyBuKyspIC8vIExTRiAtPiBMU1AKKyAgICAgICAgICAgIGlfbHNwc1tuXSA9IGNvcygwLjUgKiAocHJldl9sc3BzW25dICsgbHNwc1tuXSkpOworICAgICAgICBmZl9hY2VscF9sc3BkMmxwYyhpX2xzcHMsIGxwY3MsIHMtPmxzcHMgPj4gMSk7CisgICAgICAgIHBvc3RmaWx0ZXIocywgc3ludGgsIHNhbXBsZXMsIDgwLCBscGNzLAorICAgICAgICAgICAgICAgICAgICZzLT56ZXJvX2V4Y19wZltzLT5oaXN0b3J5X25zYW1wbGVzICsgTUFYX0ZSQU1FU0laRSAqIGZyYW1lX2lkeF0sCisgICAgICAgICAgICAgICAgICAgZnJhbWVfZGVzY3NbYmRfaWR4XS5mY2JfdHlwZSwgcGl0Y2hbMF0pOworCisgICAgICAgIGZvciAobiA9IDA7IG4gPCBzLT5sc3BzOyBuKyspIC8vIExTRiAtPiBMU1AKKyAgICAgICAgICAgIGlfbHNwc1tuXSA9IGNvcyhsc3BzW25dKTsKKyAgICAgICAgZmZfYWNlbHBfbHNwZDJscGMoaV9sc3BzLCBscGNzLCBzLT5sc3BzID4+IDEpOworICAgICAgICBwb3N0ZmlsdGVyKHMsICZzeW50aFs4MF0sICZzYW1wbGVzWzgwXSwgODAsIGxwY3MsCisgICAgICAgICAgICAgICAgICAgJnMtPnplcm9fZXhjX3BmW3MtPmhpc3RvcnlfbnNhbXBsZXMgKyBNQVhfRlJBTUVTSVpFICogZnJhbWVfaWR4ICsgODBdLAorICAgICAgICAgICAgICAgICAgIGZyYW1lX2Rlc2NzW2JkX2lkeF0uZmNiX3R5cGUsIHBpdGNoWzBdKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbWVtY3B5KHNhbXBsZXMsIHN5bnRoLCAxNjAgKiBzaXplb2Yoc3ludGhbMF0pKTsKKworICAgIC8qIENhY2hlIHZhbHVlcyBmb3IgbmV4dCBmcmFtZSAqLworICAgIHMtPmZyYW1lX2NudHIrKzsKKyAgICBpZiAocy0+ZnJhbWVfY250ciA+PSAweEZGRkYpIHMtPmZyYW1lX2NudHIgLT0gMHhGRkZGOyAvLyBpLmUuIG1vZHVsbyAoJSkKKyAgICBzLT5sYXN0X2FjYl90eXBlID0gZnJhbWVfZGVzY3NbYmRfaWR4XS5hY2JfdHlwZTsKKyAgICBzd2l0Y2ggKGZyYW1lX2Rlc2NzW2JkX2lkeF0uYWNiX3R5cGUpIHsKKyAgICBjYXNlIEFDQl9UWVBFX05PTkU6CisgICAgICAgIHMtPmxhc3RfcGl0Y2hfdmFsID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQ0JfVFlQRV9BU1lNTUVUUklDOgorICAgICAgICBzLT5sYXN0X3BpdGNoX3ZhbCA9IGN1cl9waXRjaF92YWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUNCX1RZUEVfSEFNTUlORzoKKyAgICAgICAgcy0+bGFzdF9waXRjaF92YWwgPSBwaXRjaFtmcmFtZV9kZXNjc1tiZF9pZHhdLm5fYmxvY2tzIC0gMV07CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEVuc3VyZSBtaW5pbXVtIHZhbHVlIGZvciBmaXJzdCBpdGVtLCBtYXhpbXVtIHZhbHVlIGZvciBsYXN0IHZhbHVlLAorICogcHJvcGVyIHNwYWNpbmcgYmV0d2VlbiBlYWNoIHZhbHVlIGFuZCBwcm9wZXIgb3JkZXJpbmcuCisgKgorICogQHBhcmFtIGxzcHMgYXJyYXkgb2YgTFNQcworICogQHBhcmFtIG51bSBzaXplIG9mIExTUCBhcnJheQorICoKKyAqIEBub3RlIGJhc2ljYWxseSBhIGRvdWJsZSB2ZXJzaW9uIG9mICNmZl9hY2VscF9yZW9yZGVyX2xzZigpLCBtaWdodCBiZQorICogICAgICAgdXNlZnVsIHRvIHB1dCBpbiBhIGdlbmVyaWMgbG9jYXRpb24gbGF0ZXIgb24uIFBhcnRzIGFyZSBhbHNvCisgKiAgICAgICBwcmVzZW50IGluICNmZl9zZXRfbWluX2Rpc3RfbHNmKCkgKyAjZmZfc29ydF9uZWFybHlfc29ydGVkX2Zsb2F0cygpLAorICogICAgICAgd2hpY2ggaXMgaW4gZmxvYXQuCisgKi8KK3N0YXRpYyB2b2lkIHN0YWJpbGl6ZV9sc3BzKGRvdWJsZSAqbHNwcywgaW50IG51bSkKK3sKKyAgICBpbnQgbiwgbSwgbDsKKworICAgIC8qIHNldCBtaW5pbXVtIHZhbHVlIGZvciBmaXJzdCwgbWF4aW11bSB2YWx1ZSBmb3IgbGFzdCBhbmQgbWluaW11bQorICAgICAqIHNwYWNpbmcgYmV0d2VlbiBMU0YgdmFsdWVzLgorICAgICAqIFZlcnkgc2ltaWxhciB0byBmZl9zZXRfbWluX2Rpc3RfbHNmKCksIGJ1dCBpbiBkb3VibGUuICovCisgICAgbHNwc1swXSAgICAgICA9IEZGTUFYKGxzcHNbMF0sICAgICAgIDAuMDAxNSAqIE1fUEkpOworICAgIGZvciAobiA9IDE7IG4gPCBudW07IG4rKykKKyAgICAgICAgbHNwc1tuXSAgID0gRkZNQVgobHNwc1tuXSwgICAgICAgbHNwc1tuIC0gMV0gKyAwLjAxMjUgKiBNX1BJKTsKKyAgICBsc3BzW251bSAtIDFdID0gRkZNSU4obHNwc1tudW0gLSAxXSwgMC45OTg1ICogTV9QSSk7CisKKyAgICAvKiByZW9yZGVyIChsb29rcyBsaWtlIG9uZS10aW1lIC8gbm9uLXJlY3Vyc2VkIGJ1YmJsZXNvcnQpLgorICAgICAqIFZlcnkgc2ltaWxhciB0byBmZl9zb3J0X25lYXJseV9zb3J0ZWRfZmxvYXRzKCksIGJ1dCBpbiBkb3VibGUuICovCisgICAgZm9yIChuID0gMTsgbiA8IG51bTsgbisrKSB7CisgICAgICAgIGlmIChsc3BzW25dIDwgbHNwc1tuIC0gMV0pIHsKKyAgICAgICAgICAgIGZvciAobSA9IDE7IG0gPCBudW07IG0rKykgeworICAgICAgICAgICAgICAgIGRvdWJsZSB0bXAgPSBsc3BzW21dOworICAgICAgICAgICAgICAgIGZvciAobCA9IG0gLSAxOyBsID49IDA7IGwtLSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobHNwc1tsXSA8PSB0bXApIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBsc3BzW2wgKyAxXSA9IGxzcHNbbF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxzcHNbbCArIDFdID0gdG1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogVGVzdCBpZiB0aGVyZSdzIGVub3VnaCBiaXRzIHRvIHJlYWQgMSBzdXBlcmZyYW1lLgorICoKKyAqIEBwYXJhbSBvcmlnX2diIGJpdCBJL08gY29udGV4dCB1c2VkIGZvciByZWFkaW5nLiBUaGlzIGZ1bmN0aW9uCisgKiAgICAgICAgICAgICAgICBkb2VzIG5vdCBtb2RpZnkgdGhlIHN0YXRlIG9mIHRoZSBiaXRyZWFkZXI7IGl0CisgKiAgICAgICAgICAgICAgICBvbmx5IHVzZXMgaXQgdG8gY29weSB0aGUgY3VycmVudCBzdHJlYW0gcG9zaXRpb24KKyAqIEBwYXJhbSBzIFdNQSBWb2ljZSBkZWNvZGluZyBjb250ZXh0IHByaXZhdGUgZGF0YQorICogQHJldHVybiA8IDAgb24gZXJyb3IsIDEgb24gbm90IGVub3VnaCBiaXRzIG9yIDAgaWYgT0suCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfYml0c19mb3Jfc3VwZXJmcmFtZShHZXRCaXRDb250ZXh0ICpvcmlnX2diLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNQVZvaWNlQ29udGV4dCAqcykKK3sKKyAgICBHZXRCaXRDb250ZXh0IHNfZ2IsICpnYiA9ICZzX2diOworICAgIGludCBuLCBuZWVkX2JpdHMsIGJkX2lkeDsKKyAgICBjb25zdCBzdHJ1Y3QgZnJhbWVfdHlwZV9kZXNjICpmcmFtZV9kZXNjOworCisgICAgLyogaW5pdGlhbGl6ZSBhIGNvcHkgKi8KKyAgICBpbml0X2dldF9iaXRzKGdiLCBvcmlnX2diLT5idWZmZXIsIG9yaWdfZ2ItPnNpemVfaW5fYml0cyk7CisgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGdldF9iaXRzX2NvdW50KG9yaWdfZ2IpKTsKKyAgICBhdl9hc3NlcnQxKGdldF9iaXRzX2xlZnQoZ2IpID09IGdldF9iaXRzX2xlZnQob3JpZ19nYikpOworCisgICAgLyogc3VwZXJmcmFtZSBoZWFkZXIgKi8KKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAxNCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKCFnZXRfYml0czEoZ2IpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOyAgICAgICAgICAgLy8gV01BUHJvLWluLVdNQVZvaWNlIHN1cGVyZnJhbWUKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgc2tpcF9iaXRzKGdiLCAxMik7IC8vIG51bWJlciBvZiAgc2FtcGxlcyBpbiBzdXBlcmZyYW1lCisgICAgaWYgKHMtPmhhc19yZXNpZHVhbF9sc3BzKSB7ICAgICAgICAgICAvLyByZXNpZHVhbCBMU1BzIChmb3IgYWxsIGZyYW1lcykKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgcy0+c2ZyYW1lX2xzcF9iaXRzaXplKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHNraXBfYml0c19sb25nKGdiLCBzLT5zZnJhbWVfbHNwX2JpdHNpemUpOworICAgIH0KKworICAgIC8qIGZyYW1lcyAqLworICAgIGZvciAobiA9IDA7IG4gPCBNQVhfRlJBTUVTOyBuKyspIHsKKyAgICAgICAgaW50IGF3X2lkeF9pc19leHQgPSAwOworCisgICAgICAgIGlmICghcy0+aGFzX3Jlc2lkdWFsX2xzcHMpIHsgICAgIC8vIGluZGVwZW5kZW50IExTUHMgKHBlci1mcmFtZSkKKyAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgcy0+ZnJhbWVfbHNwX2JpdHNpemUpIHJldHVybiAxOworICAgICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgcy0+ZnJhbWVfbHNwX2JpdHNpemUpOworICAgICAgICB9CisgICAgICAgIGJkX2lkeCA9IHMtPnZibV90cmVlW2dldF92bGMyKGdiLCBmcmFtZV90eXBlX3ZsYy50YWJsZSwgNiwgMyldOworICAgICAgICBpZiAoYmRfaWR4IDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAvLyBpbnZhbGlkIGZyYW1lIHR5cGUgVkxDIGNvZGUKKyAgICAgICAgZnJhbWVfZGVzYyA9ICZmcmFtZV9kZXNjc1tiZF9pZHhdOworICAgICAgICBpZiAoZnJhbWVfZGVzYy0+YWNiX3R5cGUgPT0gQUNCX1RZUEVfQVNZTU1FVFJJQykgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgcy0+cGl0Y2hfbmJpdHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgcy0+cGl0Y2hfbmJpdHMpOworICAgICAgICB9CisgICAgICAgIGlmIChmcmFtZV9kZXNjLT5mY2JfdHlwZSA9PSBGQ0JfVFlQRV9TSUxFTkNFKSB7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDgpOworICAgICAgICB9IGVsc2UgaWYgKGZyYW1lX2Rlc2MtPmZjYl90eXBlID09IEZDQl9UWVBFX0FXX1BVTFNFUykgeworICAgICAgICAgICAgaW50IHRtcCA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICAgICAgICAgIGlmICh0bXAgPj0gMHgzNikgeworICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMik7CisgICAgICAgICAgICAgICAgYXdfaWR4X2lzX2V4dCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBibG9ja3MgKi8KKyAgICAgICAgaWYgKGZyYW1lX2Rlc2MtPmFjYl90eXBlID09IEFDQl9UWVBFX0hBTU1JTkcpIHsKKyAgICAgICAgICAgIG5lZWRfYml0cyA9IHMtPmJsb2NrX3BpdGNoX25iaXRzICsKKyAgICAgICAgICAgICAgICAoZnJhbWVfZGVzYy0+bl9ibG9ja3MgLSAxKSAqIHMtPmJsb2NrX2RlbHRhX3BpdGNoX25iaXRzOworICAgICAgICB9IGVsc2UgaWYgKGZyYW1lX2Rlc2MtPmZjYl90eXBlID09IEZDQl9UWVBFX0FXX1BVTFNFUykgeworICAgICAgICAgICAgbmVlZF9iaXRzID0gMiAqICFhd19pZHhfaXNfZXh0OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG5lZWRfYml0cyA9IDA7CisgICAgICAgIG5lZWRfYml0cyArPSBmcmFtZV9kZXNjLT5mcmFtZV9zaXplOworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCBuZWVkX2JpdHMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIG5lZWRfYml0cyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogU3ludGhlc2l6ZSBvdXRwdXQgc2FtcGxlcyBmb3IgYSBzaW5nbGUgc3VwZXJmcmFtZS4gSWYgd2UgaGF2ZSBhbnkgZGF0YQorICogY2FjaGVkIGluIHMtPnNmcmFtZV9jYWNoZSwgdGhhdCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB3aGF0ZXZlciBpcyBsb2FkZWQKKyAqIGluIHMtPmdiLgorICoKKyAqIFdNQSBWb2ljZSBzdXBlcmZyYW1lcyBjb250YWluIDMgZnJhbWVzLCBlYWNoIGNvbnRhaW5pbmcgMTYwIGF1ZGlvIHNhbXBsZXMsCisgKiB0byBnaXZlIGEgdG90YWwgb2YgNDgwIHNhbXBsZXMgcGVyIGZyYW1lLiBTZWUgI3N5bnRoX2ZyYW1lKCkgZm9yIGZyYW1lCisgKiBwYXJzaW5nLiBJbiBhZGRpdGlvbiB0byAzIGZyYW1lcywgc3VwZXJmcmFtZXMgY2FuIGFsc28gY29udGFpbiB0aGUgTFNQcworICogKGlmIHRoZXNlIGFyZSBnbG9iYWxseSBzcGVjaWZpZWQgZm9yIGFsbCBmcmFtZXMgKHJlc2lkdWFsbHkpOyB0aGV5IGNhbgorICogYWxzbyBiZSBzcGVjaWZpZWQgaW5kaXZpZHVhbGx5IHBlci1mcmFtZS4gU2VlIHRoZSBzLT5oYXNfcmVzaWR1YWxfbHNwcworICogb3B0aW9uKSwgYW5kIGNhbiBzcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBlbmNvZGVkIGluIHRoaXMgc3VwZXJmcmFtZQorICogKGlmIGxlc3MgdGhhbiA0ODApLCB1c3VhbGx5IHVzZWQgdG8gcHJldmVudCBibGFua3MgYXQgdHJhY2sgYm91bmRhcmllcy4KKyAqCisgKiBAcGFyYW0gY3R4IFdNQSBWb2ljZSBkZWNvZGVyIGNvbnRleHQKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvciBvciAxIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIGRhdGEgdG8KKyAqICAgICAgICAgZnVsbHkgcGFyc2UgdGhlIHN1cGVyZnJhbWUKKyAqLworc3RhdGljIGludCBzeW50aF9zdXBlcmZyYW1lKEFWQ29kZWNDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0cikKK3sKKyAgICBXTUFWb2ljZUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYiwgc19nYjsKKyAgICBpbnQgbiwgcmVzLCBuX3NhbXBsZXMgPSA0ODA7CisgICAgZG91YmxlIGxzcHNbTUFYX0ZSQU1FU11bTUFYX0xTUFNdOworICAgIGNvbnN0IGRvdWJsZSAqbWVhbl9sc2YgPSBzLT5sc3BzID09IDE2ID8KKyAgICAgICAgd21hdm9pY2VfbWVhbl9sc2YxNltzLT5sc3BfZGVmX21vZGVdIDogd21hdm9pY2VfbWVhbl9sc2YxMFtzLT5sc3BfZGVmX21vZGVdOworICAgIGZsb2F0IGV4Y2l0YXRpb25bTUFYX1NJR05BTF9ISVNUT1JZICsgTUFYX1NGUkFNRVNJWkUgKyAxMl07CisgICAgZmxvYXQgc3ludGhbTUFYX0xTUFMgKyBNQVhfU0ZSQU1FU0laRV07CisgICAgZmxvYXQgKnNhbXBsZXM7CisKKyAgICBtZW1jcHkoc3ludGgsICAgICAgcy0+c3ludGhfaGlzdG9yeSwKKyAgICAgICAgICAgcy0+bHNwcyAgICAgICAgICAgICAqIHNpemVvZigqc3ludGgpKTsKKyAgICBtZW1jcHkoZXhjaXRhdGlvbiwgcy0+ZXhjaXRhdGlvbl9oaXN0b3J5LAorICAgICAgICAgICBzLT5oaXN0b3J5X25zYW1wbGVzICogc2l6ZW9mKCpleGNpdGF0aW9uKSk7CisKKyAgICBpZiAocy0+c2ZyYW1lX2NhY2hlX3NpemUgPiAwKSB7CisgICAgICAgIGdiID0gJnNfZ2I7CisgICAgICAgIGluaXRfZ2V0X2JpdHMoZ2IsIHMtPnNmcmFtZV9jYWNoZSwgcy0+c2ZyYW1lX2NhY2hlX3NpemUpOworICAgICAgICBzLT5zZnJhbWVfY2FjaGVfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKChyZXMgPSBjaGVja19iaXRzX2Zvcl9zdXBlcmZyYW1lKGdiLCBzKSkgPT0gMSkgeworICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIC8qIEZpcnN0IGJpdCBpcyBzcGVlY2gvbXVzaWMgYml0LCBpdCBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIFdNQVZvaWNlCisgICAgICogc3BlZWNoIHNhbXBsZXMgKHRoZSBhY3R1YWwgY29kZWMpIGFuZCBXTUFWb2ljZSBtdXNpYyBzYW1wbGVzLCB3aGljaAorICAgICAqIGFyZSByZWFsbHkgV01BUHJvLWluLVdNQVZvaWNlLXN1cGVyZnJhbWVzLiBJJ3ZlIG5ldmVyIHNlZW4gdGhvc2UgaW4KKyAgICAgKiB0aGUgd2lsZCB5ZXQuICovCisgICAgaWYgKCFnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShjdHgsICJXTUFQcm8taW4tV01BVm9pY2UiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIC8qIChvcHRpb25hbCkgbnIuIG9mIHNhbXBsZXMgaW4gc3VwZXJmcmFtZTsgYWx3YXlzIDw9IDQ4MCBhbmQgPj0gMCAqLworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGlmICgobl9zYW1wbGVzID0gZ2V0X2JpdHMoZ2IsIDEyKSkgPiA0ODApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiU3VwZXJmcmFtZSBlbmNvZGVzID40ODAgc2FtcGxlcyAoJWQpLCBub3QgYWxsb3dlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBuX3NhbXBsZXMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogUGFyc2UgTFNQcywgaWYgZ2xvYmFsIGZvciB0aGUgc3VwZXJmcmFtZSAoY2FuIGFsc28gYmUgcGVyLWZyYW1lKS4gKi8KKyAgICBpZiAocy0+aGFzX3Jlc2lkdWFsX2xzcHMpIHsKKyAgICAgICAgZG91YmxlIHByZXZfbHNwc1tNQVhfTFNQU10sIGExW01BWF9MU1BTICogMl0sIGEyW01BWF9MU1BTICogMl07CisKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IHMtPmxzcHM7IG4rKykKKyAgICAgICAgICAgIHByZXZfbHNwc1tuXSA9IHMtPnByZXZfbHNwc1tuXSAtIG1lYW5fbHNmW25dOworCisgICAgICAgIGlmIChzLT5sc3BzID09IDEwKSB7CisgICAgICAgICAgICBkZXF1YW50X2xzcDEwcihnYiwgbHNwc1syXSwgcHJldl9sc3BzLCBhMSwgYTIsIHMtPmxzcF9xX21vZGUpOworICAgICAgICB9IGVsc2UgLyogcy0+bHNwcyA9PSAxNiAqLworICAgICAgICAgICAgZGVxdWFudF9sc3AxNnIoZ2IsIGxzcHNbMl0sIHByZXZfbHNwcywgYTEsIGEyLCBzLT5sc3BfcV9tb2RlKTsKKworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgcy0+bHNwczsgbisrKSB7CisgICAgICAgICAgICBsc3BzWzBdW25dICA9IG1lYW5fbHNmW25dICsgKGExW25dICAgICAgICAgICAtIGEyW24gKiAyXSk7CisgICAgICAgICAgICBsc3BzWzFdW25dICA9IG1lYW5fbHNmW25dICsgKGExW3MtPmxzcHMgKyBuXSAtIGEyW24gKiAyICsgMV0pOworICAgICAgICAgICAgbHNwc1syXVtuXSArPSBtZWFuX2xzZltuXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMzsgbisrKQorICAgICAgICAgICAgc3RhYmlsaXplX2xzcHMobHNwc1tuXSwgcy0+bHNwcyk7CisgICAgfQorCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IDQ4MDsKKyAgICBpZiAoKHJlcyA9IGZmX2dldF9idWZmZXIoY3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IG5fc2FtcGxlczsKKyAgICBzYW1wbGVzID0gKGZsb2F0ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICAvKiBQYXJzZSBmcmFtZXMsIG9wdGlvbmFsbHkgcHJlY2VkZWQgYnkgcGVyLWZyYW1lIChpbmRlcGVuZGVudCkgTFNQcy4gKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgMzsgbisrKSB7CisgICAgICAgIGlmICghcy0+aGFzX3Jlc2lkdWFsX2xzcHMpIHsKKyAgICAgICAgICAgIGludCBtOworCisgICAgICAgICAgICBpZiAocy0+bHNwcyA9PSAxMCkgeworICAgICAgICAgICAgICAgIGRlcXVhbnRfbHNwMTBpKGdiLCBsc3BzW25dKTsKKyAgICAgICAgICAgIH0gZWxzZSAvKiBzLT5sc3BzID09IDE2ICovCisgICAgICAgICAgICAgICAgZGVxdWFudF9sc3AxNmkoZ2IsIGxzcHNbbl0pOworCisgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgcy0+bHNwczsgbSsrKQorICAgICAgICAgICAgICAgIGxzcHNbbl1bbV0gKz0gbWVhbl9sc2ZbbV07CisgICAgICAgICAgICBzdGFiaWxpemVfbHNwcyhsc3BzW25dLCBzLT5sc3BzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmVzID0gc3ludGhfZnJhbWUoY3R4LCBnYiwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlc1tuICogTUFYX0ZSQU1FU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNwc1tuXSwgbiA9PSAwID8gcy0+cHJldl9sc3BzIDogbHNwc1tuIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4Y2l0YXRpb25bcy0+aGlzdG9yeV9uc2FtcGxlcyArIG4gKiBNQVhfRlJBTUVTSVpFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ludGhbcy0+bHNwcyArIG4gKiBNQVhfRlJBTUVTSVpFXSkpKSB7CisgICAgICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU3RhdGlzdGljcz8gRklYTUUgLSB3ZSBkb24ndCBjaGVjayBmb3IgbGVuZ3RoLCBhIHNsaWdodCBvdmVycnVuCisgICAgICogd2lsbCBiZSBjYXVnaHQgYnkgaW50ZXJuYWwgYnVmZmVyIHBhZGRpbmcsIGFuZCBhbnl0aGluZyBlbHNlCisgICAgICogd2lsbCBiZSBza2lwcGVkLCBub3QgcmVhZC4gKi8KKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICByZXMgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgICAgIHNraXBfYml0cyhnYiwgMTAgKiAocmVzICsgMSkpOworICAgIH0KKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIC8qIFVwZGF0ZSBoaXN0b3J5ICovCisgICAgbWVtY3B5KHMtPnByZXZfbHNwcywgICAgICAgICAgIGxzcHNbMl0sCisgICAgICAgICAgIHMtPmxzcHMgICAgICAgICAgICAgKiBzaXplb2YoKnMtPnByZXZfbHNwcykpOworICAgIG1lbWNweShzLT5zeW50aF9oaXN0b3J5LCAgICAgICZzeW50aFtNQVhfU0ZSQU1FU0laRV0sCisgICAgICAgICAgIHMtPmxzcHMgICAgICAgICAgICAgKiBzaXplb2YoKnN5bnRoKSk7CisgICAgbWVtY3B5KHMtPmV4Y2l0YXRpb25faGlzdG9yeSwgJmV4Y2l0YXRpb25bTUFYX1NGUkFNRVNJWkVdLAorICAgICAgICAgICBzLT5oaXN0b3J5X25zYW1wbGVzICogc2l6ZW9mKCpleGNpdGF0aW9uKSk7CisgICAgaWYgKHMtPmRvX2FwZikKKyAgICAgICAgbWVtbW92ZShzLT56ZXJvX2V4Y19wZiwgICAgICAgJnMtPnplcm9fZXhjX3BmW01BWF9TRlJBTUVTSVpFXSwKKyAgICAgICAgICAgICAgICBzLT5oaXN0b3J5X25zYW1wbGVzICogc2l6ZW9mKCpzLT56ZXJvX2V4Y19wZikpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGFyc2UgdGhlIHBhY2tldCBoZWFkZXIgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggcGFja2V0IChpbnB1dCBkYXRhIHRvIHRoaXMKKyAqIGRlY29kZXIpLgorICoKKyAqIEBwYXJhbSBzIFdNQSBWb2ljZSBkZWNvZGluZyBjb250ZXh0IHByaXZhdGUgZGF0YQorICogQHJldHVybiAxIGlmIG5vdCBlbm91Z2ggYml0cyB3ZXJlIGF2YWlsYWJsZSwgb3IgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IHBhcnNlX3BhY2tldF9oZWFkZXIoV01BVm9pY2VDb250ZXh0ICpzKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOworICAgIHVuc2lnbmVkIGludCByZXM7CisKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAxMSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgc2tpcF9iaXRzKGdiLCA0KTsgICAgICAgICAgLy8gcGFja2V0IHNlcXVlbmNlIG51bWJlcgorICAgIHMtPmhhc19yZXNpZHVhbF9sc3BzID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBkbyB7CisgICAgICAgIHJlcyA9IGdldF9iaXRzKGdiLCA2KTsgLy8gbnVtYmVyIG9mIHN1cGVyZnJhbWVzIHBlciBwYWNrZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAobWludXMgZmlyc3Qgb25lIGlmIHRoZXJlIGlzIHNwaWxsb3ZlcikKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgNiAqIChyZXMgPT0gMHgzRikgKyBzLT5zcGlsbG92ZXJfYml0c2l6ZSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0gd2hpbGUgKHJlcyA9PSAweDNGKTsKKyAgICBzLT5zcGlsbG92ZXJfbmJpdHMgICA9IGdldF9iaXRzKGdiLCBzLT5zcGlsbG92ZXJfYml0c2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDb3B5ICh1bmFsaWduZWQpIGJpdHMgZnJvbSBnYi9kYXRhL3NpemUgdG8gcGIuCisgKgorICogQHBhcmFtIHBiIHRhcmdldCBidWZmZXIgdG8gY29weSBiaXRzIGludG8KKyAqIEBwYXJhbSBkYXRhIHNvdXJjZSBidWZmZXIgdG8gY29weSBiaXRzIGZyb20KKyAqIEBwYXJhbSBzaXplIHNpemUgb2YgdGhlIHNvdXJjZSBkYXRhLCBpbiBieXRlcworICogQHBhcmFtIGdiIGJpdCBJL08gY29udGV4dCBzcGVjaWZ5aW5nIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzb3VyY2UuCisgKiAgICAgICAgICAgZGF0YS4gVGhpcyBmdW5jdGlvbiBtaWdodCB1c2UgdGhpcyB0byBhbGlnbiB0aGUgYml0IHBvc2l0aW9uIHRvCisgKiAgICAgICAgICAgYSB3aG9sZS1ieXRlIGJvdW5kYXJ5IGJlZm9yZSBjYWxsaW5nICNhdnByaXZfY29weV9iaXRzKCkgb24gYWxpZ25lZAorICogICAgICAgICAgIHNvdXJjZSBkYXRhCisgKiBAcGFyYW0gbmJpdHMgdGhlIGFtb3VudCBvZiBiaXRzIHRvIGNvcHkgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0CisgKgorICogQG5vdGUgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgYml0CisgKiAgICAgICBJL08gY29udGV4dCBpcyB1bmRlZmluZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNvcHlfYml0cyhQdXRCaXRDb250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYiwgaW50IG5iaXRzKQoreworICAgIGludCBybW5fYnl0ZXMsIHJtbl9iaXRzOworCisgICAgcm1uX2JpdHMgPSBybW5fYnl0ZXMgPSBnZXRfYml0c19sZWZ0KGdiKTsKKyAgICBpZiAocm1uX2JpdHMgPCBuYml0cykKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChuYml0cyA+IHBiLT5zaXplX2luX2JpdHMgLSBwdXRfYml0c19jb3VudChwYikpCisgICAgICAgIHJldHVybjsKKyAgICBybW5fYml0cyAmPSA3OyBybW5fYnl0ZXMgPj49IDM7CisgICAgaWYgKChybW5fYml0cyA9IEZGTUlOKHJtbl9iaXRzLCBuYml0cykpID4gMCkKKyAgICAgICAgcHV0X2JpdHMocGIsIHJtbl9iaXRzLCBnZXRfYml0cyhnYiwgcm1uX2JpdHMpKTsKKyAgICBhdnByaXZfY29weV9iaXRzKHBiLCBkYXRhICsgc2l6ZSAtIHJtbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgRkZNSU4obmJpdHMgLSBybW5fYml0cywgcm1uX2J5dGVzIDw8IDMpKTsKK30KKworLyoqCisgKiBQYWNrZXQgZGVjb2Rpbmc6IGEgcGFja2V0IGlzIGFueXRoaW5nIHRoYXQgdGhlIChBU0YpIGRlbXV4ZXIgY29udGFpbnMsCisgKiBhbmQgd2UgZXhwZWN0IHRoYXQgdGhlIGRlbXV4ZXIgLyBhcHBsaWNhdGlvbiBwcm92aWRlcyBpdCB0byB1cyBhcyBzdWNoCisgKiAoZWxzZSB5b3UnbGwgcHJvYmFibHkgZ2V0IGdhcmJhZ2UgYXMgb3V0cHV0KS4gRXZlcnkgcGFja2V0IGhhcyBhIHNpemUgb2YKKyAqIGN0eC0+YmxvY2tfYWxpZ24gYnl0ZXMsIHN0YXJ0cyB3aXRoIGEgcGFja2V0IGhlYWRlciAoc2VlCisgKiAjcGFyc2VfcGFja2V0X2hlYWRlcigpKSwgYW5kIHRoZW4gYSBzZXJpZXMgb2Ygc3VwZXJmcmFtZXMuIFN1cGVyZnJhbWUKKyAqIGJvdW5kYXJpZXMgbWF5IGV4Y2VlZCBwYWNrZXRzLCBpLmUuIHN1cGVyZnJhbWVzIGNhbiBzcGxpdCBkYXRhIG92ZXIKKyAqIG11bHRpcGxlICh0d28pIHBhY2tldHMuCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZnJhbWVzLCBzZWUgI3N5bnRoX3N1cGVyZnJhbWUoKS4KKyAqLworc3RhdGljIGludCB3bWF2b2ljZV9kZWNvZGVfcGFja2V0KEFWQ29kZWNDb250ZXh0ICpjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgV01BVm9pY2VDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+Z2I7CisgICAgaW50IHNpemUsIHJlcywgcG9zOworCisgICAgLyogUGFja2V0cyBhcmUgc29tZXRpbWVzIGEgbXVsdGlwbGUgb2YgY3R4LT5ibG9ja19hbGlnbiwgd2l0aCBhIHBhY2tldAorICAgICAqIGhlYWRlciBhdCBlYWNoIGN0eC0+YmxvY2tfYWxpZ24gYnl0ZXMuIEhvd2V2ZXIsIEZGbXBlZydzIEFTRiBkZW11eGVyCisgICAgICogZmVlZHMgdXMgQVNGIHBhY2tldHMsIHdoaWNoIG1heSBjb25jYXRlbmF0ZSBtdWx0aXBsZSAiY29kZWMiIHBhY2tldHMKKyAgICAgKiBpbiBhIHNpbmdsZSAibXV4ZXIiIHBhY2tldCwgc28gd2UgYXJ0aWZpY2lhbGx5IGVtdWxhdGUgdGhhdCBieQorICAgICAqIGNhcHBpbmcgdGhlIHBhY2tldCBzaXplIGF0IGN0eC0+YmxvY2tfYWxpZ24uICovCisgICAgZm9yIChzaXplID0gYXZwa3QtPnNpemU7IHNpemUgPiBjdHgtPmJsb2NrX2FsaWduOyBzaXplIC09IGN0eC0+YmxvY2tfYWxpZ24pOworICAgIGlmICghc2l6ZSkgeworICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgYXZwa3QtPmRhdGEsIHNpemUgPDwgMyk7CisKKyAgICAvKiBzaXplID09IGN0eC0+YmxvY2tfYWxpZ24gaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZSBkZWFsaW5nIHdpdGgKKyAgICAgKiBhIG5ldyBwYWNrZXQgb3IgYSBwYWNrZXQgb2Ygd2hpY2ggd2UgYWxyZWFkeSByZWFkIHRoZSBwYWNrZXQgaGVhZGVyCisgICAgICogcHJldmlvdXNseS4gKi8KKyAgICBpZiAoc2l6ZSA9PSBjdHgtPmJsb2NrX2FsaWduKSB7IC8vIG5ldyBwYWNrZXQgaGVhZGVyCisgICAgICAgIGlmICgocmVzID0gcGFyc2VfcGFja2V0X2hlYWRlcihzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKworICAgICAgICAvKiBJZiB0aGUgcGFja2V0IGhlYWRlciBzcGVjaWZpZXMgYSBzLT5zcGlsbG92ZXJfbmJpdHMsIHRoZW4gd2Ugd2FudAorICAgICAgICAgKiB0byBwdXNoIG91dCBhbGwgZGF0YSBvZiB0aGUgcHJldmlvdXMgcGFja2V0ICgrIHNwaWxsb3ZlcikgYmVmb3JlCisgICAgICAgICAqIGNvbnRpbnVpbmcgdG8gcGFyc2UgbmV3IHN1cGVyZnJhbWVzIGluIHRoZSBjdXJyZW50IHBhY2tldC4gKi8KKyAgICAgICAgaWYgKHMtPnNwaWxsb3Zlcl9uYml0cyA+IDApIHsKKyAgICAgICAgICAgIGlmIChzLT5zZnJhbWVfY2FjaGVfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgY250ID0gZ2V0X2JpdHNfY291bnQoZ2IpOworICAgICAgICAgICAgICAgIGNvcHlfYml0cygmcy0+cGIsIGF2cGt0LT5kYXRhLCBzaXplLCBnYiwgcy0+c3BpbGxvdmVyX25iaXRzKTsKKyAgICAgICAgICAgICAgICBmbHVzaF9wdXRfYml0cygmcy0+cGIpOworICAgICAgICAgICAgICAgIHMtPnNmcmFtZV9jYWNoZV9zaXplICs9IHMtPnNwaWxsb3Zlcl9uYml0czsKKyAgICAgICAgICAgICAgICBpZiAoKHJlcyA9IHN5bnRoX3N1cGVyZnJhbWUoY3R4LCBkYXRhLCBnb3RfZnJhbWVfcHRyKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAqZ290X2ZyYW1lX3B0cikgeworICAgICAgICAgICAgICAgICAgICBjbnQgKz0gcy0+c3BpbGxvdmVyX25iaXRzOworICAgICAgICAgICAgICAgICAgICBzLT5za2lwX2JpdHNfbmV4dCA9IGNudCAmIDc7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbnQgPj4gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcgKGdiLCBzLT5zcGlsbG92ZXJfbmJpdHMgLSBjbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHNfY291bnQoZ2IpKTsgLy8gcmVzeW5jCisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgcy0+c3BpbGxvdmVyX25iaXRzKTsgIC8vIHJlc3luYworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzLT5za2lwX2JpdHNfbmV4dCkKKyAgICAgICAgc2tpcF9iaXRzKGdiLCBzLT5za2lwX2JpdHNfbmV4dCk7CisKKyAgICAvKiBUcnkgcGFyc2luZyBzdXBlcmZyYW1lcyBpbiBjdXJyZW50IHBhY2tldCAqLworICAgIHMtPnNmcmFtZV9jYWNoZV9zaXplID0gMDsKKyAgICBzLT5za2lwX2JpdHNfbmV4dCA9IDA7CisgICAgcG9zID0gZ2V0X2JpdHNfbGVmdChnYik7CisgICAgaWYgKChyZXMgPSBzeW50aF9zdXBlcmZyYW1lKGN0eCwgZGF0YSwgZ290X2ZyYW1lX3B0cikpIDwgMCkgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0gZWxzZSBpZiAoKmdvdF9mcmFtZV9wdHIpIHsKKyAgICAgICAgaW50IGNudCA9IGdldF9iaXRzX2NvdW50KGdiKTsKKyAgICAgICAgcy0+c2tpcF9iaXRzX25leHQgPSBjbnQgJiA3OworICAgICAgICByZXR1cm4gY250ID4+IDM7CisgICAgfSBlbHNlIGlmICgocy0+c2ZyYW1lX2NhY2hlX3NpemUgPSBwb3MpID4gMCkgeworICAgICAgICAvKiByZXdpbmQgYml0IHJlYWRlciB0byBzdGFydCBvZiBsYXN0IChpbmNvbXBsZXRlKSBzdXBlcmZyYW1lLi4uICovCisgICAgICAgIGluaXRfZ2V0X2JpdHMoZ2IsIGF2cGt0LT5kYXRhLCBzaXplIDw8IDMpOworICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgKHNpemUgPDwgMykgLSBwb3MpOworICAgICAgICBhdl9hc3NlcnQxKGdldF9iaXRzX2xlZnQoZ2IpID09IHBvcyk7CisKKyAgICAgICAgLyogLi4uYW5kIGNhY2hlIGl0IGZvciBzcGlsbG92ZXIgaW4gbmV4dCBwYWNrZXQgKi8KKyAgICAgICAgaW5pdF9wdXRfYml0cygmcy0+cGIsIHMtPnNmcmFtZV9jYWNoZSwgU0ZSQU1FX0NBQ0hFX01BWFNJWkUpOworICAgICAgICBjb3B5X2JpdHMoJnMtPnBiLCBhdnBrdC0+ZGF0YSwgc2l6ZSwgZ2IsIHMtPnNmcmFtZV9jYWNoZV9zaXplKTsKKyAgICAgICAgLy8gRklYTUUgYmFkIC0ganVzdCBjb3B5IGJ5dGVzIGFzIHdob2xlIGFuZCBhZGQgdXNlIHRoZQorICAgICAgICAvLyBza2lwX2JpdHNfbmV4dCBmaWVsZAorICAgIH0KKworICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgd21hdm9pY2VfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqY3R4KQoreworICAgIFdNQVZvaWNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKHMtPmRvX2FwZikgeworICAgICAgICBmZl9yZGZ0X2VuZCgmcy0+cmRmdCk7CisgICAgICAgIGZmX3JkZnRfZW5kKCZzLT5pcmRmdCk7CisgICAgICAgIGZmX2RjdF9lbmQoJnMtPmRjdCk7CisgICAgICAgIGZmX2RjdF9lbmQoJnMtPmRzdCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgd21hdm9pY2VfZmx1c2goQVZDb2RlY0NvbnRleHQgKmN0eCkKK3sKKyAgICBXTUFWb2ljZUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgbjsKKworICAgIHMtPnBvc3RmaWx0ZXJfYWdjICAgID0gMDsKKyAgICBzLT5zZnJhbWVfY2FjaGVfc2l6ZSA9IDA7CisgICAgcy0+c2tpcF9iaXRzX25leHQgICAgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBzLT5sc3BzOyBuKyspCisgICAgICAgIHMtPnByZXZfbHNwc1tuXSA9IE1fUEkgKiAobiArIDEuMCkgLyAocy0+bHNwcyArIDEuMCk7CisgICAgbWVtc2V0KHMtPmV4Y2l0YXRpb25faGlzdG9yeSwgMCwKKyAgICAgICAgICAgc2l6ZW9mKCpzLT5leGNpdGF0aW9uX2hpc3RvcnkpICogTUFYX1NJR05BTF9ISVNUT1JZKTsKKyAgICBtZW1zZXQocy0+c3ludGhfaGlzdG9yeSwgICAgICAwLAorICAgICAgICAgICBzaXplb2YoKnMtPnN5bnRoX2hpc3RvcnkpICAgICAgKiBNQVhfTFNQUyk7CisgICAgbWVtc2V0KHMtPmdhaW5fcHJlZF9lcnIsICAgICAgMCwKKyAgICAgICAgICAgc2l6ZW9mKHMtPmdhaW5fcHJlZF9lcnIpKTsKKworICAgIGlmIChzLT5kb19hcGYpIHsKKyAgICAgICAgbWVtc2V0KCZzLT5zeW50aF9maWx0ZXJfb3V0X2J1ZltNQVhfTFNQU19BTElHTjE2IC0gcy0+bHNwc10sIDAsCisgICAgICAgICAgICAgICBzaXplb2YoKnMtPnN5bnRoX2ZpbHRlcl9vdXRfYnVmKSAqIHMtPmxzcHMpOworICAgICAgICBtZW1zZXQocy0+ZGNmX21lbSwgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICBzaXplb2YoKnMtPmRjZl9tZW0pICAgICAgICAgICAgICAqIDIpOworICAgICAgICBtZW1zZXQocy0+emVyb19leGNfcGYsICAgICAgICAgIDAsCisgICAgICAgICAgICAgICBzaXplb2YoKnMtPnplcm9fZXhjX3BmKSAgICAgICAgICAqIHMtPmhpc3RvcnlfbnNhbXBsZXMpOworICAgICAgICBtZW1zZXQocy0+ZGVub2lzZV9maWx0ZXJfY2FjaGUsIDAsIHNpemVvZihzLT5kZW5vaXNlX2ZpbHRlcl9jYWNoZSkpOworICAgIH0KK30KKworQVZDb2RlYyBmZl93bWF2b2ljZV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgID0gIndtYXZvaWNlIiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIEF1ZGlvIFZvaWNlIiksCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XTUFWT0lDRSwKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihXTUFWb2ljZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgID0gd21hdm9pY2VfZGVjb2RlX2luaXQsCisgICAgLmluaXRfc3RhdGljX2RhdGEgPSB3bWF2b2ljZV9pbml0X3N0YXRpY19kYXRhLAorICAgIC5jbG9zZSAgICAgICAgICAgID0gd21hdm9pY2VfZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgICA9IHdtYXZvaWNlX2RlY29kZV9wYWNrZXQsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBDT0RFQ19DQVBfU1VCRlJBTUVTIHwgQ09ERUNfQ0FQX0RSMSwKKyAgICAuZmx1c2ggICAgICAgICAgICA9IHdtYXZvaWNlX2ZsdXNoLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dtYXZvaWNlX2RhdGEuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtYXZvaWNlX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY2NWIwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvd21hdm9pY2VfZGF0YS5oCkBAIC0wLDAgKzEsMzI1OSBAQAorLyoKKyAqIFdpbmRvd3MgTWVkaWEgVm9pY2UgKFdNQVZvaWNlKSB0YWJsZXMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUm9uYWxkIFMuIEJ1bHRqZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgV2luZG93cyBNZWRpYSBWb2ljZSAoV01BVm9pY2UpIHRhYmxlcworICogQGF1dGhvciBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+CisgKi8KKworI2lmbmRlZiBBVkNPREVDX1dNQVZPSUNFX0RBVEFfSAorI2RlZmluZSBBVkNPREVDX1dNQVZPSUNFX0RBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHdtYXZvaWNlX2RxX2xzcDEwaVsweGYwMF0gPSB7CisgICAgMTI1LCAxMDksICA4NCwgIDU1LCAgMzQsICA1MSwgMTA5LCAxMTIsIDExOCwgMTMyLAorICAgIDEyMiwgMTAyLCAgNzgsICA4MCwgMTMyLCAxMTksIDEzMiwgMTMyLCAxMjUsIDEzMSwKKyAgICAxMDksICA5MSwgMTMxLCAxMzEsIDEzNiwgMTM2LCAxMzcsIDEzNywgMTQwLCAxNDUsCisgICAgMTQwLCAxNDMsIDExNywgMTM2LCAxMjIsIDEwNiwgMTA5LCAgOTEsIDExNSwgMTE5LAorICAgIDEzMywgMTE3LCAxMDMsICA4MCwgIDU1LCAxMTcsIDEyMywgMTAyLCAgOTMsICA4MCwKKyAgICAxMzksIDExNiwgIDcwLCAgMzksICA5NSwgIDg5LCAxMDMsIDExMywgMTEyLCAxMjIsCisgICAgMTM1LCAyNDQsIDIyOSwgMjE1LCAxOTksIDE4MSwgMTYzLCAxNTAsIDE0NiwgMTQ0LAorICAgIDE0MywgMTczLCAxNzEsIDE1NCwgMTU1LCAxNTQsIDE1MSwgMTQ4LCAxNDUsIDE0MywKKyAgICAxMzIsIDEzOCwgMTE2LCAgODUsIDExNywgIDk0LCAxMDgsIDExNywgMTA3LCAxMTYsCisgICAgMTMyLCAxMTgsIDEyMywgMTE5LCAgODgsICA2NywgIDQ5LCAgOTUsICA4NCwgIDk1LAorICAgIDEyMSwgMTAzLCAgNzQsICA3MCwgMTc5LCAxNjQsIDE0MSwgMTI2LCAxMDcsIDExMiwKKyAgICAxMTksICA5NSwgMTAzLCAxNDksIDEzOSwgMTQ4LCAxNDQsIDE0NywgMTQ4LCAxNDEsCisgICAgMTUxLCAxMzMsIDE0MiwgMTI5LCAxMTEsIDEzMSwgMTA4LCAxMjgsIDEyMiwgMTA4LAorICAgIDEyMSwgIDk2LCAxMTUsIDEzOCwgMTE2LCAgOTMsIDEwNSwgMTE1LCAxMTUsIDEyMywKKyAgICAxMjksIDEwNiwgMTM2LCAxODAsIDE0NywgMTMwLCAxMDgsIDE0MSwgMTMxLCAxMTgsCisgICAgMTM2LCAxNTUsIDE3NiwgMTU2LCAxMzUsIDEyOSwgMTQwLCAxNDYsIDE0MiwgMTM0LAorICAgIDE0MSwgMTMwLCAxMDksICA4MCwgIDUyLCAgMzgsICAxOCwgIDQ3LCAxMTgsIDEzNCwKKyAgICAxNTUsIDE0MSwgMTAwLCAgNzgsICA3MiwgIDg5LCAgNzksICA5NiwgIDkyLCAgOTgsCisgICAgMTMzLCAxMTEsICA4MywgIDkxLCAgNzIsICA1OCwgMTA1LCAxMTUsIDExMiwgMTIwLAorICAgIDE0NSwgMTI3LCAxMzUsIDExMywgMTEzLCAxMDUsIDEwNSwgIDg1LCAgNjksICA2MSwKKyAgICAxMTUsICA5NiwgMTE2LCAxNDUsIDE1OSwgMTcwLCAxNzUsIDE3NSwgMTY4LCAxNTUsCisgICAgMTQwLCAxMjAsICA4NCwgIDUyLCAgODAsIDE0NSwgMTI1LCAxMjcsIDExNiwgMTI2LAorICAgIDEyOCwgMTA4LCAxMDEsIDE5OCwgMjI3LCAyMDAsIDE3OCwgMTU5LCAxNDcsIDE0OCwKKyAgICAxMjEsICA4OCwgIDQ2LCAxMDksIDEyNCwgMTI2LCAxMjYsIDEzNywgMTQ3LCAxNDcsCisgICAgMTI5LCAxMDcsIDE2NCwgMTQ4LCAxMjcsIDExNywgMTM0LCAxMjAsIDExMSwgMTE2LAorICAgIDEyMCwgMTAzLCAgOTgsICA3MywgIDY2LCAgNjEsICA3MCwgMTE1LCAxMTYsIDEyNSwKKyAgICAxMjYsIDEwMCwgIDc3LCAxODgsIDE2MiwgMTQwLCAxMTQsIDEyOCwgMTM5LCAxMjMsCisgICAgMTQ1LCAxNjUsIDE2NCwgMTM0LCAxMDksIDEwMCwgMTA4LCAxMTgsIDEyNywgMTMwLAorICAgIDE1NiwgMTgyLCAxOTAsIDE3MywgMTY3LCAxNjUsIDE2MiwgMTU3LCAxNTIsIDE0NywKKyAgICAxNTAsIDE2NCwgMTc5LCAxODMsIDE3MywgMTU1LCAxNDAsIDEzNiwgMTM0LCAxMzUsCisgICAgMTIyLCAgOTIsICA2OSwgMTQwLCAxMzIsIDExOCwgMTA4LCAxMjgsIDEzOCwgMTMyLAorICAgIDEyMywgMTI3LCAxNDgsIDEzNywgMTUwLCAxNDksIDEzOSwgMTI3LCAxMjQsIDEzMCwKKyAgICAxMzYsIDEzOCwgMTEyLCAgNzAsICA0MSwgIDM3LCAxMzIsIDE0MCwgMTI5LCAxMjUsCisgICAgMTMwLCAxMTEsICA3OCwgIDMzLCAgNTEsIDE2MSwgMTQxLCAxMzYsIDEyMCwgMTIyLAorICAgIDEyNiwgMTEwLCAgODcsIDEwNiwgIDg1LCAgNjgsICA0OCwgIDgxLCAxMTIsIDExMywKKyAgICAxMzUsIDEyNSwgIDk4LCAgODUsIDEwMiwgIDgwLCAxMDAsICA4NywgIDg2LCAxMTYsCisgICAgMTQyLCAxMzMsIDExMCwgIDY2LCAgNDgsIDE1MiwgMTM5LCAxMzUsIDEzNiwgMTIzLAorICAgIDEyOCwgMTE2LCAgODksIDEwMiwgMTI4LCAgOTksICA4MywgIDYxLCAxMDUsIDEyNCwKKyAgICAxMjAsICA5NCwgIDczLCAgODMsICA3OCwgMTAwLCAxMjIsIDEyNCwgMTI4LCAxMzIsCisgICAgMTQ0LCAxMzcsIDExNiwgMTAyLCAgNzUsIDE0NCwgMTM2LCAxMjcsIDE0MCwgMTI3LAorICAgIDE1NCwgMTQ0LCAxMTgsICA5OSwgIDkwLCAgOTAsICA4OSwgIDc1LCAgNjgsICA4MywKKyAgICAxMjMsIDEwMywgIDg5LCAxOTgsIDE4MCwgMTU0LCAxMzgsIDEyMiwgMTM2LCAxMjAsCisgICAgMTM4LCAxMTgsIDEyMSwgMTM2LCAxMTAsIDEwNSwgIDg1LCAxMTEsIDEwMSwgMTA0LAorICAgIDEyMSwgMTI2LCAxMzksIDExNSwgIDk5LCAxMDEsIDEwNywgMTEwLCAxMjMsIDEyNiwKKyAgICAxMjcsIDExNSwgIDg4LCAxMDksIDE2NCwgMTM0LCAxMzgsIDEzOCwgMTIwLCAxMjEsCisgICAgMTMwLCAyMDIsIDE5NSwgMjAyLCAxOTksIDIwMSwgMTgxLCAxNjQsIDE1OSwgMTQ4LAorICAgIDEyMCwgMTE2LCAxOTQsIDE5OSwgMTg2LCAxNzEsIDE1NCwgMTQyLCAxMzcsIDEzMywKKyAgICAxMzcsIDEyOSwgMTEyLCAxNDksIDEzNCwgMTEyLCAxNDksIDEzOCwgMTIwLCAxMzQsCisgICAgMTE5LCAxMDIsIDEwNywgIDgzLCAgNzksIDExNCwgMTE5LCAxMjcsIDEyOCwgMTI4LAorICAgIDE0NCwgMTQ4LCAxNjUsIDE1NSwgMTYxLCAxNTAsIDEzNSwgMTIyLCAxMTYsIDExNSwKKyAgICAxMjAsICA5OSwgIDgwLCAxMjAsIDEyMywgMTI0LCAxMTEsICA4OSwgIDcwLCAxMDgsCisgICAgMTE4LCAgOTUsICA2NiwgIDUzLCAxMDUsIDEyNiwgMTI1LCAxMDUsICA4MywgMTExLAorICAgIDEyOSwgMTk3LCAxOTEsIDE5NywgMjA2LCAyMTMsIDIxNiwgMjA4LCAxOTYsIDE2OSwKKyAgICAxMzMsIDEwOSwgMTI3LCAxNjQsIDEzNCwgMTIxLCAgOTksICA5MiwgIDgyLCAgNzEsCisgICAgMTMxLCAxMjEsICA5MywgIDkxLCAxMzYsIDEwNSwgMTE1LCAxNDAsIDEyMCwgMTEwLAorICAgIDE1MCwgMTY0LCAxMzksIDEwOCwgIDg3LCAgODEsICA5MywgIDkyLCAxMDQsIDExNiwKKyAgICAxMzMsIDExNCwgMTI1LCAxMjYsIDExMSwgMTM2LCAxMTAsIDE1NiwgMTQ3LCAxMzMsCisgICAgMTEzLCAgOTQsIDExOCwgMTIwLCAxMTUsIDEyNSwgMTI0LCAxMjYsIDEyNywgMTM0LAorICAgIDExNiwgMTMxLCAxNjEsIDE1OCwgMTY2LCAxNTcsIDE1MCwgMTUwLCAxNDQsIDE0MSwKKyAgICAxMjUsIDE4NSwgMTY5LCAxNDIsIDE0MCwgMTQzLCAxMzksIDEzMSwgMTM0LCAxMzgsCisgICAgMTc5LCAxODgsIDE3MCwgMTUwLCAxMzQsIDE0MCwgMTQ0LCAxMzMsIDEyNywgMTI3LAorICAgIDE1MCwgMTc3LCAyMDQsIDE4NCwgMTkyLCAxOTQsIDE5MCwgMTkzLCAxNzcsIDE1OCwKKyAgICAxMTQsIDExMywgMTM4LCAxMTYsIDEzNywgMTM1LCAxMzIsIDEzMSwgMTI3LCAxMzQsCisgICAgMTIwLCAxNDcsIDE2MywgMTM1LCAxMzMsIDEzNywgMTM2LCAxMzYsIDEzMywgMTM1LAorICAgIDEzNywgMTIwLCAgOTUsICA3MywgIDQ2LCAgNDgsIDExMSwgIDk3LCAgOTcsIDEyMywKKyAgICAxMzksIDEzMCwgMTA5LCAgNzYsICA1MiwgIDcyLCAgNjEsICA2MSwgMTI1LCAxMjcsCisgICAgMTMyLCAxMTksIDExOSwgIDkwLCAgNjYsICA0MSwgIDY0LCAxNTYsIDE0MywgMTI5LAorICAgIDEzMSwgMTA2LCAgNTgsICAyNSwgIDk5LCAxMTUsIDEyMiwgMTM2LCAxMjksIDEzMiwKKyAgICAxMzQsIDEyMywgIDk3LCAgNTMsICAyNywgMTE0LCAxMjUsIDExNCwgMTIwLCAxMjMsCisgICAgMTIyLCAxMDcsICA5MywgIDU3LCAgNDcsIDEzMywgMTI4LCAxMzgsIDE0MSwgMTMxLAorICAgIDE0NSwgMTMyLCAxMjIsIDExMCwgIDc5LCAgNTcsICAzMCwgIDczLCAxNTMsIDE0NCwKKyAgICAxNTAsIDEzMiwgIDg1LCAgNTksIDEzMywgMTI1LCAxMzAsIDExNSwgMTAwLCAgOTYsCisgICAgMTQ4LCAxMjcsIDExMSwgIDg2LCAgNjEsICAzOCwgMTEwLCAxMjEsIDEwOCwgIDk5LAorICAgIDE1NywgMTQzLCAxMDUsICA3NywgMTE2LCAxMTgsIDExNSwgMTMxLCAxMjIsIDEyMiwKKyAgICAxMzMsIDExOSwgMTM0LCAxMDgsICA4NiwgIDYxLCAxMjksIDE2NSwgMTQzLCAxMjcsCisgICAgMTI1LCAxMDUsICA4OSwgMTExLCAgOTcsICA4NSwgMTEzLCAgOTksICA5OCwgMTE3LAorICAgIDE0OSwgMTMxLCAxMDEsIDEwNiwgIDg4LCAgOTUsICA3OSwgMTE5LCAxMjMsIDEyMCwKKyAgICAxMjUsIDEwOSwgIDgxLCAxMDAsIDIwMSwgMTgzLCAxNTYsIDEzOCwgMTE1LCAxMTYsCisgICAgMTQxLCAxMTksIDEyOSwgMTA1LCAgNzYsICA2MCwgMTEwLCAgOTksICA5MiwgIDgyLAorICAgIDE1MCwgMTU2LCAxMjksICA5NSwgIDY5LCAxMTUsIDExNSwgMTEzLCAxMzQsIDEyNSwKKyAgICAxMTgsICA5NywgIDY3LCAgOTYsIDIwMywgMTk3LCAxNzEsIDE1MSwgMTMzLCAxMjUsCisgICAgMTQzLCAxMzEsIDEyMCwgMTM0LCAxMDUsICA4MCwgIDUxLCAgNjAsIDEzOSwgMTM0LAorICAgIDEyOSwgMTYwLCAyMjMsIDIxOSwgMjE5LCAyMTIsIDE5NywgMTczLCAxNTcsIDE0NiwKKyAgICAxMzIsIDExMiwgMTY0LCAxNDQsIDExOSwgMTAyLCAgOTIsICA3NiwgIDczLCAgOTQsCisgICAgMTMyLCAxMTIsIDEyNCwgMTE0LCAgOTMsICA5MiwgIDgzLCAgNzMsICA2OSwgIDk5LAorICAgIDEyOSwgMTAzLCAxODgsIDE2MywgMTQyLCAxMzIsIDEyNywgMTAxLCAgODIsICA1OSwKKyAgICAxNDAsIDE0MSwgMTExLCAgNzQsICA0NiwgMTA1LCAxMTMsICA5OSwgMTI3LCAxMjIsCisgICAgMTI1LCAgOTQsICA2MywgMTEyLCAxMTYsIDEwMSwgIDgxLCAxMjAsIDEzNiwgMTM0LAorICAgIDEzMywgMTkwLCAyMjQsIDE5MywgMTc5LCAxNTgsIDE0NiwgMTQzLCAxNDAsIDEzNiwKKyAgICAxNTIsIDE2MSwgMTMyLCAxMjAsIDExMiwgIDk0LCAxMTQsIDEwMiwgIDkyLCAxMTYsCisgICAgMTI5LCAxOTQsIDE5NiwgMjAyLCAyMTEsIDIxMiwgMjEwLCAxOTAsIDE2OSwgMTUyLAorICAgIDE2NiwgMTY2LCAxNDUsIDExMSwgIDkxLCAxMzIsIDEzMywgMTI4LCAxMzYsIDEzMCwKKyAgICAxMTgsICA5NCwgIDcyLCAgNzQsICA5MiwgIDg2LCAgODksICA5MiwgMTA2LCAxMjMsCisgICAgMTI2LCAxMDAsICA4NiwgMTM3LCAxMTcsICA5MiwgIDc2LCAxMDQsIDEwNiwgMTE0LAorICAgIDEzMywgMTA5LCAyMDQsIDE5MiwgMTY2LCAxNDgsIDEzOCwgMTI4LCAxMTEsICA4MSwKKyAgICAxMTgsICA5OSwgIDc5LCAxNDYsIDE2OSwgMTQxLCAxMjMsIDEwMiwgMTMxLCAxMjAsCisgICAgMTI3LCAxMDUsIDEzNiwgMjA0LCAxNzAsIDE1NCwgMTMxLCAxNDUsIDEzNSwgMTE5LAorICAgIDExNywgIDk1LCAgNjQsICA4MywgMTQxLCAxMzYsIDExOCwgIDk2LCAgOTksIDEyNiwKKyAgICAxMTUsICA5MywgIDk4LCAxMDIsICA5NSwgMTA1LCAxMDYsIDExNCwgMTE5LCAxMjgsCisgICAgMTMxLCAxMjEsICA5OCwgMTM5LCAxNDksIDExOSwgMTA5LCAgODYsIDEwNSwgMTI5LAorICAgIDEzNCwgMTE5LCAxMDQsIDE2OSwgMTg1LCAxNTUsIDE0MSwgMTIyLCAxMDcsIDEyNywKKyAgICAxMzYsIDExNSwgIDg1LCAxMDgsICA4NywgMTI2LCAxMDIsIDEyOCwgMTM2LCAxMjksCisgICAgMTI1LCAgOTksIDEyNiwgMTU4LCAxMzMsIDEzOSwgMTMyLCAxMTMsICA5MSwgMTA3LAorICAgIDE0MSwgMTIyLCAxMjgsIDE2MSwgMTMwLCAxMjcsIDEwNSwgMTIwLCAxMTgsIDEwNiwKKyAgICAxMjIsIDE0MCwgMTYxLCAxNjgsIDE4NywgMTg0LCAxNzYsIDE1OCwgMTQ0LCAxNDAsCisgICAgMTI3LCAxMTEsICA4OSwgMTMwLCAxMzIsIDEwNSwgMTM0LCAxMjEsIDEwMCwgMTIyLAorICAgIDEyOSwgMTEwLCAxMjgsIDExNSwgMTI5LCAxMTYsIDEzMiwgMTE4LCAxMTQsIDExOSwKKyAgICAxMzgsIDEzMywgMTMyLCAxODgsIDE4MywgMTU5LCAxNjEsIDE0NywgMTM0LCAxNDAsCisgICAgMTMyLCAxMTMsICA4NCwgMTY3LCAxNDcsIDEzMiwgMTI0LCAxMDksIDEzMywgMTIxLAorICAgIDEzMiwgMTI4LCAxMTYsIDEyMSwgIDk4LCAxMDEsIDE0NSwgMTI5LCAxMjgsIDEyOSwKKyAgICAxMjQsIDExMiwgMTUyLCAxNTgsIDEzNiwgMTYxLCAxMzksIDE2NSwgMTU4LCAxNDIsCisgICAgMTM5LCAxMzgsIDExMCwgMTI3LCAxNDgsIDExNywgMTI2LCAxMTgsIDEwMSwgMTE2LAorICAgIDE1NSwgMTY4LCAxNTQsIDEyOCwgMTIwLCAxNTIsIDE1MCwgMTQxLCAxNDAsIDEzNSwKKyAgICAxMjcsIDExMSwgMTA5LCAxMzQsIDEwNCwgMTMzLCAxMTAsIDExMiwgMTMyLCAxMTQsCisgICAgMTExLCAgODcsICA2OCwgIDg5LCAxMDcsIDEyMSwgMTIxLCAxMjYsIDEyNiwgMTI5LAorICAgIDEyMCwgMTQ4LCAxNjksIDE2MywgMTczLCAxNzgsIDE4NSwgMTg4LCAxNzgsIDE2MywKKyAgICAxMjIsICA5NywgIDg2LCAxMTcsIDEwMSwgMTM4LCAxMTgsIDE0MiwgMTU1LCAxMzksCisgICAgMTI1LCAxMTQsIDEzMSwgMTM4LCAxNTMsIDE0OSwgMTYzLCAxNTAsIDE0MywgMTQxLAorICAgIDE1NywgMTYxLCAxMzgsIDE1MiwgMTM0LCAxMjEsIDEyMiwgMTA5LCAxMTAsIDEyNCwKKyAgICAxNTEsIDE3MSwgMTk2LCAxNjgsIDE0NSwgMTM5LCAxNDcsIDE1MSwgMTQ2LCAxMzksCisgICAgMTM0LCAxNjksIDE3OSwgMTcwLCAxNzUsIDE3OCwgMTc3LCAxNzMsIDE2NSwgMTU0LAorICAgIDEyMCwgMTUxLCAxMTgsIDEwNywgMTI1LCAxMjksIDEzMywgMTMzLCAxMzYsIDEzOSwKKyAgICAxMTksIDE0MSwgMTU5LCAxNTEsIDE2MCwgMTY1LCAxNjgsIDE2OSwgMTYyLCAxNTIsCisgICAgMTE1LCAxMTEsIDExOSwgIDk0LCAxMTcsIDEyMSwgMTI3LCAxMjcsIDEzMiwgMTM2LAorICAgIDEzNCwgMTUzLCAxNDcsIDE0MiwgMTQyLCAxNDcsIDE1OSwgMTU5LCAxNTQsIDE0NywKKyAgICAxMTAsIDEwNiwgMTM5LCAxMzUsIDE0MywgMTQyLCAxNDcsIDE0NiwgMTQ3LCAxNDcsCisgICAgMTE1LCAxMzMsIDE1MSwgMTMzLCAxNDEsIDE0MiwgMTUxLCAxNTIsIDE0NywgMTQ0LAorICAgIDExNSwgMTMyLCAxNDQsIDEzMSwgMTI1LCAxMjYsIDEyOCwgMTMwLCAxMzEsIDEzNiwKKyAgICAxMzgsIDExOCwgIDk2LCAgNzEsICA0OCwgIDI2LCAgNDMsIDEzMCwgMTI1LCAxMjUsCisgICAgMTM0LCAxMjIsICA5OCwgIDU0LCAgMjgsICA4NCwgIDc3LCAgNzMsIDEwOSwgMTI1LAorICAgIDEzMywgMTEyLCAgNjcsICA0OCwgMTQxLCAxMjksIDEyNiwgMTEzLCAxMTIsIDExOCwKKyAgICAxNDMsIDEyMywgIDg5LCAgNTQsICA3MSwgIDczLCAgNzUsIDEzMSwgMTIzLCAxMjMsCisgICAgMTI2LCAxMDksICA4MSwgIDMxLCAgMTUsICA5NCwgMTEwLCAxMDksIDExOSwgMTI4LAorICAgIDEzMiwgMTIyLCAgOTcsICA5MiwgIDczLCAgNTAsICAyNywgIDIyLCAxMDQsIDEzMywKKyAgICAxMzMsIDExOSwgIDk0LCAgNDgsICAzNCwgMTY4LCAxNjAsIDE1NCwgMTUxLCAxMzAsCisgICAgMTQ3LCAxMzMsICA5MCwgIDU0LCAgNzEsIDEyMywgMTA2LCAxMDUsICA5MywgMTE3LAorICAgIDE0MywgMTMyLCAxMDcsICA2OSwgIDQ1LCAgNzgsIDE3OCwgMTY5LCAxNTAsIDEzOSwKKyAgICAxMzgsIDEyMywgMTE2LCAgOTYsICA2OSwgIDQ5LCAgMzIsIDExMywgMTAzLCAxMTIsCisgICAgMTU0LCAxNTEsIDEyNSwgIDc5LCAgNjAsIDE1MiwgMTYwLCAxNTQsIDE1NSwgMTM3LAorICAgIDE0MiwgMTUxLCAxMjQsICA4OCwgIDY2LCAgNTksICA5NCwgIDg3LCAgOTUsIDExOSwKKyAgICAxNjYsIDE1NCwgMTIyLCAgOTIsIDEzOCwgMTMyLCAxMjQsIDExNCwgIDk3LCAgOTcsCisgICAgMTIyLCAgOTksICA5OCwgMjE5LCAxOTEsIDE3NiwgMTY1LCAxNTksIDE1MywgMTMxLAorICAgIDEzMCwgMTE5LCAgOTEsICA1MSwgIDI0LCAgNDEsIDE0NCwgMTU2LCAxNDcsIDEzOSwKKyAgICAxMzksIDEyMiwgIDgxLCAgNjUsIDEyNCwgMTExLCAxMDQsICA5MCwgIDk0LCAgOTgsCisgICAgMTM4LCAxMjAsIDExMiwgIDkxLCAgNjMsICA2NSwgIDg5LCAgNzUsICA3OCwgMTA2LAorICAgIDEyNiwgMTA3LCAgOTEsICA4NSwgIDY5LCAgOTUsICA5MCwgIDg0LCAxMDgsIDEyMCwKKyAgICAxNTUsIDEzOSwgMTAwLCAgNzgsIDEyMCwgMTEwLCAxMDksICA5MSwgIDc3LCAgNzMsCisgICAgMTQ0LCAxMzAsIDEzNSwgMTEyLCAgODgsICA2NSwgIDYyLCAxNDIsIDEyOSwgMTI2LAorICAgIDE3MCwgMTU0LCAxNTAsIDEzMSwgMTIxLCAxMTYsIDEwMCwgIDkyLCAgODMsICA4NiwKKyAgICAxMzEsIDEyMiwgIDk4LCAxMDcsIDEwMiwgIDc1LCAgNTQsICAzOCwgMTE3LCAxMzAsCisgICAgMTQ2LCAxMzksIDExNywgMTA3LCAgODYsICA2NiwgIDQ0LCAgMzAsICA5NywgMTI4LAorICAgIDEyOSwgMTE2LCAxMDAsICA1OSwgMTA4LCAxMjcsIDExOSwgMTM5LCAxMjksIDEyOSwKKyAgICAxMjQsIDEwNiwgIDc5LCAgNDksIDE1NCwgMTkwLCAxNjYsIDE1MiwgMTMzLCAxMjMsCisgICAgMTQxLCAxNDksIDEyMywgIDg5LCAgNjEsICA3MCwgMTQzLCAxMzIsIDEyNSwgMTI2LAorICAgIDEzNiwgMTEzLCAxNzcsIDE2NiwgMTQxLCAxMjMsIDEwOSwgMTA4LCAxMDUsICA5MywKKyAgICAxMzcsIDExNywgMTQ3LCAxMjMsICA5OSwgIDg1LCAxMDksICA5OCwgIDkxLCAgNzUsCisgICAgMTI5LCAxMjEsIDEwMiwgIDc4LCAgNTMsICA5MCwgMTQ5LCAxMzYsIDEzNCwgMTM1LAorICAgIDE0NCwgMTM2LCAxMjYsICA5MCwgMTE0LCAxNTIsIDEzNywgMTUyLCAxMzgsIDEyOCwKKyAgICAxMzMsIDExNSwgMTA3LCAxMjksICA5OSwgIDc4LCAgNjAsIDEyOSwgMTI1LCAxMTgsCisgICAgMTQ3LCAxNDEsIDExOSwgMTI0LCAxMTAsICA5MSwgIDc5LCAgNjQsIDEwNiwgMTE3LAorICAgIDEzNCwgMTExLCAxNjQsIDE0MywgMTIzLCAxMTMsIDExNiwgIDk1LCAgNzYsICA1NiwKKyAgICAxNDcsIDE1OSwgMTQwLCAxMDksICA4MywgIDg0LCAxNDAsIDEzNSwgMTI3LCAxMjksCisgICAgMTIzLCAxMDQsIDExNiwgIDk5LCAgOTEsICA4NywgIDgwLCAxMTAsIDExMywgMTIxLAorICAgIDEyNCwgMTA2LCAxNzQsIDE3NCwgMTUyLCAxNDEsIDEzMiwgMTM0LCAxMjYsIDEyNCwKKyAgICAxNDAsIDE5MCwgMjQwLCAyMTUsIDIxMiwgMTg5LCAxNzMsIDE1OCwgMTQ0LCAxMzcsCisgICAgMTIzLCAgOTcsICA3OSwgMTAyLCAxMTAsIDExMSwgIDkwLCAgNzUsIDEyNiwgMTI0LAorICAgIDEzNCwgMTIxLCAxMDQsIDE0NSwgMTI3LCAxMDAsICA3NywgIDY1LCAxMjAsIDExOCwKKyAgICAxMjMsIDEwNiwgIDg3LCAgNDEsICA2OCwgMTE5LCAxMDYsIDExNSwgMTA5LCAxMTksCisgICAgMTM3LCAyMzIsIDI0MSwgMjI1LCAyMTcsIDIwMiwgMTgzLCAxNjksIDE1NiwgMTQ1LAorICAgIDE2MSwgMTQ2LCAxMjcsIDExMCwgIDk3LCAxMDcsICA4OCwgMTE0LCAxMDgsIDEwNiwKKyAgICAxNDEsIDI0NCwgMjE2LCAxOTIsIDE3MiwgMTYzLCAxNDgsIDE0MywgMTQ0LCAxNDQsCisgICAgMTI4LCAxMjcsIDEwOSwgIDg5LCAgNzcsICA2OCwgMTI0LCAxMjAsIDEyMSwgMTI1LAorICAgIDEyNSwgIDk0LCAgNDgsICA3MSwgMTE2LCAxMTMsIDEwNCwgMTIwLCAxNDIsIDEzNywKKyAgICAxMzMsIDEyOSwgMTE1LCAgODIsICA2OCwgMTIwLCAgOTksIDEzMywgMTM0LCAxMjQsCisgICAgMTMwLCAxMDYsIDEwOCwgMTYwLCAxMzAsIDExMSwgIDg5LCAxMjksIDEyNCwgMTE5LAorICAgIDEzNCwgMTIwLCAxNDksIDE0MywgMTE2LCAgOTUsICA4NywgMTQyLCAxMzIsIDEyMiwKKyAgICAxMjYsIDExNCwgMTA4LCAxMDcsICA4MCwgMTQxLCAxMzMsIDEyMywgMTM3LCAxMjQsCisgICAgMTE3LCAgOTUsICA2OSwgIDQzLCAgNjIsICA5OCwgMTE0LCAxMTYsIDExMiwgMTIwLAorICAgIDEyMiwgIDk5LCAgODcsIDE2NCwgMTQ1LCAxMjMsICA5OSwgIDk1LCAxMTgsIDEwNSwKKyAgICAxMjYsIDEwMSwgMTAyLCAxMjAsIDExMywgMTEwLCAgOTIsIDEzOSwgMTM0LCAxMjYsCisgICAgMTQ4LCAxOTQsIDI0MSwgMjE5LCAyMjEsIDIxNSwgMjAwLCAxOTMsIDE3NCwgMTUxLAorICAgIDEyNywgMTA0LCAxMjIsIDEzNiwgMTEzLCAxMDYsIDExMCwgIDk1LCAgNzgsIDEwNiwKKyAgICAxMzEsIDE2MywgMjE3LCAxOTksIDE5NCwgMTc1LCAxNjQsIDE1NSwgMTQyLCAxMzgsCisgICAgMTM5LCAxMjQsICA4OCwgIDU3LCAxNjEsIDE2MSwgMTQ1LCAxMzksIDEyNCwgMTE2LAorICAgIDEyNywgMTEwLCAgOTEsICA5OCwgMTI2LCAxMDQsIDExMywgIDk4LCAgOTQsICA5NCwKKyAgICAxNDUsIDEzOCwgMTE0LCAgOTAsICA3NSwgMTMwLCAxMTcsIDEwNywgIDk5LCAgOTAsCisgICAgMTE5LCAgOTgsICA4NiwgMTAxLCAxNDgsIDEzMywgMTAzLCAgODMsIDEyNCwgMTMxLAorICAgIDE0MywgMTY4LCAxNjksIDEzMywgMTEwLCAxMTcsIDEzOSwgMTQ5LCAxNDcsIDEzNywKKyAgICAxMjQsIDEwNiwgIDgwLCAxMzgsIDE5NCwgMTYzLCAxNDIsIDExOSwgMTA2LCAxMzAsCisgICAgMTM2LCAxMjUsIDEwNSwgMTE0LCAgODcsIDExMywgMTAxLCAgODksIDEwOCwgMTAyLAorICAgIDExNCwgIDkwLCAgNTMsICA0NiwgMTA1LCAxMTYsIDEyNiwgMTIyLCAxMTgsIDEyMiwKKyAgICAxMjQsIDEwMiwgIDkyLCAxOTUsIDE2NywgMTYwLCAxNDQsIDE1NCwgMTU0LCAxMzIsCisgICAgMTE4LCAgOTcsICA4OCwgIDcyLCAgOTgsIDEyMCwgMTEyLCAgOTgsICA3OSwgMTE3LAorICAgIDExNCwgMTA3LCAxODUsIDE5MSwgMTkxLCAxODgsIDE3NSwgMTY1LCAxNTMsIDE0MywKKyAgICAxMTksICA5NywgIDkwLCAgODksIDEyMCwgMTUxLCAxMzYsIDExMywgIDk5LCAxMTIsCisgICAgMTQxLCAxMjEsIDE0NCwgMTIyLCAxMjUsIDExMywgMTMzLCAxMTEsICA5MiwgIDY5LAorICAgIDEyMCwgIDk4LCAgNzgsIDEwOSwgMTUxLCAxNDUsIDE1NywgMTU3LCAxNTEsIDE0MywKKyAgICAxMzAsIDExMCwgMTIwLCAxODgsIDE1OSwgMTQxLCAxMTksIDExMiwgMTA5LCAgOTgsCisgICAgMTI2LCAxMTIsICA4MywgMTEwLCAxNjksIDEzOSwgMTI3LCAxMDUsICA5MywgMTIzLAorICAgIDE0MSwgMTQ1LCAxMTcsIDEwNiwgIDkxLCAgNzgsIDEyMywgMTA3LCAxMDEsIDEyNSwKKyAgICAxMTcsICA5NSwgIDcxLCAxNDcsIDE3NiwgMTUzLCAxNDgsIDEzMywgMTM1LCAxMjcsCisgICAgMTI0LCAxMDYsICA3OSwgIDY0LCAxMTUsICA5NiwgMTA4LCAxMTUsIDEwNiwgMTA1LAorICAgIDEyNywgMTE1LCAgOTAsICA5OCwgMTA1LCAgODEsIDE0NCwgMTM1LCAxMTcsIDEyNSwKKyAgICAxMjYsIDEwNCwgIDk4LCAxNjUsIDEzOCwgMTM2LCAxMTIsIDE0OSwgMTQ4LCAxMzEsCisgICAgMTE5LCAxNDQsIDE4NiwgMTg1LCAyMDQsIDIwMiwgMjA5LCAyMDAsIDE4MiwgMTYxLAorICAgIDEyMywgMTUzLCAxOTAsIDE4OSwgMTk5LCAxOTQsIDE5MSwgMTc2LCAxNTcsIDE0NywKKyAgICAxMjEsIDEwMywgMTE5LCAgOTgsIDEwMCwgMTIwLCAxMDYsICA5NywgIDk1LCAxMjYsCisgICAgMTM3LCAxMzAsIDEwMiwgMTE3LCAxMTcsICA5MiwgMTI2LCAxMTQsIDEwMSwgMTE4LAorICAgIDEzMSwgMjE5LCAxOTAsIDE2NywgMTUzLCAxNTEsIDE0NCwgMTQwLCAxNDIsIDE0MywKKyAgICAxMTQsIDEwMiwgMTUxLCAxNTIsIDEzMiwgMTIwLCAxMTIsIDEyMCwgMTI3LCAxMzEsCisgICAgMTM4LCAxMjIsICA5MSwgMTQzLCAxMTgsIDEyMCwgMTE0LCAxMDQsIDEyNCwgMTE3LAorICAgIDE0OCwgMTQyLCAxMTcsIDEyNiwgIDk3LCAxMjUsIDEwOCwgMTE2LCAxNDIsIDEyNSwKKyAgICAxMjYsIDEwNiwgIDkxLCAxNjksIDIwOCwgMTc4LCAxNTgsIDEzOCwgMTI3LCAxMzUsCisgICAgMTMzLCAxMjYsIDEwMSwgIDgzLCAxNDcsIDEzMCwgMTI1LCAxMTcsIDExNCwgMTE3LAorICAgIDEyMCwgMTAzLCAgOTQsIDE0OSwgMTM2LCAxMjksIDEzOSwgMTE4LCAxMzMsIDEzMywKKyAgICAxNDcsIDE1MiwgMTI2LCAxMzIsIDExOSwgIDk3LCAxMzIsIDEyOSwgMTE0LCAxMjYsCisgICAgMTEyLCAxMDcsIDE0OCwgMTI1LCAxMTIsIDExNCwgMTI0LCAxMjUsIDEyOSwgMTM1LAorICAgIDEzOSwgMTIxLCAxNTcsIDE1MSwgMTMxLCAxNDAsIDExOCwgMTQ3LCAxMzYsIDEyMSwKKyAgICAxMTUsIDEwNSwgMTU5LCAxNjcsIDE4NSwgMTkxLCAxOTYsIDE5MCwgMTc2LCAxNjAsCisgICAgMTI0LCAxMDYsIDEwNCwgMTIyLCAxMzAsIDExNCwgMTUyLCAxNDQsIDEzNCwgMTM2LAorICAgIDEzNiwgMTUyLCAxNTksIDE1MywgMTMxLCAxMTQsIDExNiwgMTI2LCAxMjksIDEyOSwKKyAgICAxMjQsIDEwOSwgIDg3LCAxMzEsIDEwNywgMTE1LCAxMzAsIDEwNywgMTQ0LCAxMzEsCisgICAgMTI2LCAxNjIsIDE3NiwgMTc1LCAxODAsIDE3NiwgMTYwLCAxNDEsIDEzNCwgMTM0LAorICAgIDEzNiwgMTI3LCAxMDgsIDE2MSwgMTYyLCAxMzMsIDE0MSwgMTI0LCAxMTIsIDEyOCwKKyAgICAxMzAsIDExNSwgMTEwLCAxNDAsIDEwNywgMTU1LCAxMzQsIDEzMSwgMTU2LCAxMzcsCisgICAgMTIyLCAxMDYsIDExNiwgMTI3LCAxMTgsIDE2MSwgMTUwLCAxNzAsIDE2NywgMTUyLAorICAgIDEzOSwgMTc3LCAyMDMsIDE3NiwgMTU1LCAxMzksIDEzMCwgMTI4LCAxMjksIDEzMiwKKyAgICAxMzcsIDExOSwgMTI1LCAxMDMsIDExMCwgMTIzLCAxMDcsIDEyMCwgMTA4LCAxMDEsCisgICAgMTEzLCAxMDcsIDE2MCwgMTU0LCAxNjAsIDE2NiwgMTY5LCAxNzYsIDE2OCwgMTU2LAorICAgIDExNSwgIDkwLCAgNjUsIDExNSwgMTE1LCAxMDQsIDEyMCwgMTEyLCAxMDksIDEyNCwKKyAgICAxMzEsIDEyMywgMTAwLCAxMDksIDE4NSwgMTU4LCAxNDEsIDEzMiwgMTE2LCAxMTksCisgICAgMTM5LCAxMzAsIDExOSwgMTU2LCAxMjQsIDEzOCwgMTI3LCAxMTYsIDE0MSwgMTI4LAorICAgIDEzMywgMTE4LCAxMTUsIDE4MCwgMTQ5LCAxNTEsIDEzNSwgMTMwLCAxNDcsIDEyOSwKKyAgICAxMTcsICA5MCwgIDgwLCAxMTksIDEyNCwgMTI4LCAxMzIsIDEzMCwgMTI4LCAxMzUsCisgICAgMTEyLCAgOTcsIDE0MiwgMTYxLCAxNjcsIDE2NSwgMTU0LCAxNDIsIDEzNiwgMTM1LAorICAgIDExOCwgMTQxLCAxOTMsIDE3MiwgMTU3LCAxNTIsIDE0OCwgMTQ1LCAxNDYsIDE0MSwKKyAgICAxMjUsIDE0NywgMTY1LCAxNjYsIDE0OSwgMTMzLCAxMjMsIDEyMiwgMTI4LCAxMzEsCisgICAgMTI4LCAxOTMsIDE3NywgMTc0LCAxODIsIDE4NiwgMTk3LCAxOTMsIDE5MSwgMTczLAorICAgIDEyNCwgMTQ0LCAxNjIsIDEzMywgMTEzLCAxMTMsIDEyMywgMTI4LCAxMjksIDEzMCwKKyAgICAxMTcsICA5OCwgMTIxLCAxMjIsIDEzNywgMTMyLCAxMTAsICA5NywgMTExLCAxMzAsCisgICAgMTI4LCAxNzYsIDE1MSwgMTI1LCAxMjYsIDEzNCwgMTMwLCAxMjEsIDEyNywgMTMwLAorICAgIDEyMiwgMTUxLCAxNDIsIDExMSwgMTA2LCAxMjEsIDEyNiwgMTI2LCAxMzAsIDEzNCwKKyAgICAxNDgsIDE2NywgMTg2LCAxNTMsIDEyOSwgMTIyLCAxMjQsIDEyOCwgMTMwLCAxMjgsCisgICAgMTQ4LCAxNzIsIDIwNiwgMTc4LCAxNzEsIDE4MiwgMTY5LCAxODAsIDE3MiwgMTU2LAorICAgIDEzMywgMTY0LCAxNzQsIDE2MCwgMTU1LCAxNjMsIDE2MywgMTcyLCAxNjksIDE1OCwKKyAgICAxMzIsIDE1MCwgMTQ3LCAxNDIsIDE1MiwgMTQwLCAxNDAsIDE0MCwgMTM0LCAxMzUsCisgICAgMTM3LCAxNTgsIDE2NywgMTcyLCAxNjMsIDE1MywgMTY5LCAxNTgsIDE0NiwgMTQ3LAorICAgIDE1MCwgMTYxLCAxNjIsIDE3MiwgMTUzLCAxMzMsIDE0MCwgMTQ0LCAxMzYsIDEzNSwKKyAgICAxMDksICA4NCwgMTAxLCAxMjAsIDEyOSwgMTM0LCAxMzMsIDEzNiwgMTM3LCAxNDMsCisgICAgMTEyLCAxMTQsIDE1NywgMTQ3LCAxNDEsIDEzNiwgMTM1LCAxMzMsIDEzNSwgMTM4LAorICAgIDEyMSwgMTU0LCAxNjEsIDE1MCwgMTQ5LCAxNTQsIDE1MSwgMTQ0LCAxNDYsIDE0NCwKKyAgICAxMTEsIDExNywgMTI1LCAxMjUsIDEzMCwgMTMxLCAxMzUsIDEzNywgMTQzLCAxNDgsCisgICAgMTIxLCAxNDEsIDE0NiwgMTMxLCAxMzgsIDEyNiwgMTE4LCAxMTEsIDExOSwgMTMwLAorICAgIDEyMCwgMTM1LCAxNDUsIDEyMSwgMTQwLCAxMzQsIDEzOCwgMTM3LCAxMzEsIDEzNCwKKyAgICAxMTUsIDEzNywgMTMyLCAxMzcsIDEzOSwgMTM4LCAxMzgsIDEzOSwgMTQ1LCAxNDksCisgICAgMTMxLCAxNDksIDE0NywgMTMzLCAxMzIsIDEyNiwgMTMxLCAxMzQsIDEzMCwgMTMzLAorICAgIDExMCwgIDk4LCAgODQsIDE0MSwgMTA3LCAxNjksIDE2OSwgMTIzLCAxMjUsIDEyNiwKKyAgICAxMTgsIDIxMCwgIDk4LCAxMjYsIDEzMiwgMTM4LCAxMjgsIDEzOSwgMTU2LCAxNTcsCisgICAgMTQwLCAxNDIsIDEyOSwgIDk1LCAxOTIsIDE3OCwgMTgyLCAxODYsIDE4MywgMTU5LAorICAgIDEzNSwgMTM0LCAxNDQsIDEyNCwgMTAwLCAyMjgsIDIwMywgMTYxLCAxMjIsIDEwNCwKKyAgICAxMzksIDE1OSwgMTM0LCAxNjEsIDEyMSwgMTI2LCAxOTIsIDE1MiwgMjE4LCAxODAsCisgICAgMTMyLCAxMzIsIDExOSwgIDk5LCAgOTYsICA5NywgIDgwLCAgNTMsIDEzNCwgMTQzLAorICAgIDEwMiwgMTE0LCAxMzMsIDExNCwgMTI3LCAgODMsICA3NywgMTI2LCAgODUsIDEwNywKKyAgICAxMTAsIDExNCwgMTk0LCAxODYsIDEzOSwgMTE2LCAxNDcsIDEwNCwgMTI5LCAxMzgsCisgICAgMTI2LCAxMzMsIDEwOSwgMTQ0LCAxMTUsICA0NSwgMTMwLCAgOTcsIDE1OSwgMTU1LAorICAgIDE1NywgMTYyLCAxODksIDE4NSwgMTY4LCAxNjMsIDE1MSwgMTUxLCAxNDIsIDEzNSwKKyAgICAxNDQsIDE0NywgMTIwLCAgNzQsIDE5MiwgMTg2LCAxNDksIDExOCwgIDcxLCAgODQsCisgICAgMTQzLCAxNTYsIDEzMywgMTc4LCAxNjgsIDEwNywgMTE5LCAxNDksIDEwNSwgMTEyLAorICAgIDE4MiwgMTg0LCAxNTgsIDExOCwgMTE4LCAxNDgsIDEyOCwgMTc3LCAxNzEsIDE1MiwKKyAgICAxMzksIDEzNSwgMTI2LCAyMDksIDE3MSwgMTUwLCAxMjMsIDEwMCwgMTkwLCAxNTgsCisgICAgMTY2LCAgOTcsIDEzNiwgMTIzLCAxMzYsIDEzOSwgMTI4LCAxMzgsIDEyNiwgMTIxLAorICAgIDEzMiwgMTMxLCAxMjgsICA5NSwgIDYwLCAxNjgsIDEyNywgMTQwLCAyMDgsIDE2MSwKKyAgICAxMDksIDEwMiwgMTE5LCAxNjIsIDE1MCwgMTM3LCAxMDcsIDIwMCwgMTU2LCAxMzYsCisgICAgMTM2LCAxMjgsIDEwMywgIDk1LCAgNzQsICA5MSwgMjIwLCAxNzMsIDE1MiwgMTM4LAorICAgIDEzOSwgMTI5LCAxNDAsIDEzNiwgMTIyLCAgODIsIDE4MCwgMTE1LCAgNTMsICA5MCwKKyAgICAxMjEsIDEwNywgIDk5LCAxNDgsIDExNiwgMTM5LCAxMDAsICA2MywgMTkxLCAxNTUsCisgICAgMTMwLCAxMjksIDE2MywgMTU1LCAgOTgsIDE3NSwgIDk1LCAxNTEsIDEyNywgMTA3LAorICAgIDEyNCwgMTI0LCAxMTYsICA4OCwgIDcxLCAxNjQsIDE0OCwgIDk2LCAgNTcsICA4OSwKKyAgICAxMjUsIDExNywgIDc3LCAgNjMsIDE2MiwgMTQ0LCAxMTMsIDEwOSwgMTM3LCAxMzQsCisgICAgMTM0LCAxMzAsIDE0OSwgMTc0LCAxNTgsIDE1OCwgMTMwLCAgODEsICAyOCwgIDY3LAorICAgIDE0MiwgMTM5LCAxMjksIDEwMCwgMTk0LCAxMzQsICA2OCwgMTc1LCAxMzEsIDEwMywKKyAgICAxMzYsIDEzMiwgMTIyLCAgOTYsIDExOSwgIDgyLCAxMTUsIDI0OSwgMjE1LCAxNjgsCisgICAgMTI1LCAxMzksIDE5OSwgIDk2LCAxNDYsIDEyMywgMTM2LCAxNzksIDE0MiwgMTM3LAorICAgIDE4MSwgMTY2LCAxMDYsICA4NiwgMTIyLCAxMDYsIDEyMywgMTMxLCAxMDYsIDExOSwKKyAgICAxMjksIDE4OSwgMTg4LCAxNDcsIDEyNiwgMTEwLCAxMDEsIDExNCwgMTQ3LCAxMzYsCisgICAgMTMyLCAxMDYsICA3MiwgMTc1LCAxNDgsICA5OSwgMTMwLCAxNTMsIDEyNSwgMTM2LAorICAgIDEyMywgMTE5LCAxNDcsIDE3MCwgMTU3LCAxMjYsIDIwOSwgMTg4LCAxNTgsIDE1MiwKKyAgICAxMDEsICA4OSwgMTQyLCAxMzEsIDE2MSwgMTUwLCAxNDgsIDEyNCwgIDg5LCAxMTksCisgICAgMTQxLCAxMzcsIDEzMSwgMTAzLCAgODEsICA4NSwgIDY0LCAxNzUsIDEyOSwgMTIxLAorICAgIDEzNywgMTQ0LCAxNDIsIDE0NSwgMTE5LCAyMDUsIDE0OCwgIDgwLCAxNjUsIDEzOCwKKyAgICAxNDMsIDEzNywgMTY3LCAxNjUsIDE0OCwgMTQ5LCAxMTAsIDIzNCwgMjE3LCAxNzAsCisgICAgMTY3LCAxNTIsICA3NSwgMTQwLCAxNTUsIDE1NSwgMTc1LCAxMjksIDEzNiwgMTM0LAorICAgIDEzNiwgMTUyLCAxNjEsIDEzMSwgMTQwLCAxMjEsICA5MSwgIDc5LCAyNTUsIDIwOSwKKyAgICAxMzIsIDE0NywgMTIwLCAxMTQsIDE3NywgMTI4LCAxMTAsICA2MSwgIDg5LCAxMzEsCisgICAgMTI1LCAxMjcsICA5MywgIDg3LCAxNjcsIDExNSwgMTg2LCAxNjIsIDEwNywgMTA2LAorICAgIDEzNCwgMTYyLCAxNTEsIDEwMCwgIDc5LCAgNjcsIDE1MSwgMTE2LCAxMzAsIDE0MiwKKyAgICAxNjIsIDE1MywgMTU1LCAxNDMsIDEyMiwgIDg1LCAyMDIsIDE4NywgMTM1LCAxMjUsCisgICAgMTU4LCAxNTUsIDEwMywgMTI5LCAgNzQsIDE0OSwgMTMwLCAgOTgsIDEyOSwgMTI2LAorICAgIDE0OCwgMTUyLCAxNTMsIDEzMywgMTE4LCAgOTQsICA4MCwgIDcwLCAgNDcsICA5MCwKKyAgICAxMjQsIDExOCwgMTQzLCAxODQsIDE1OCwgMTI2LCAgNzAsICA4MiwgMTExLCAxMTMsCisgICAgMTI2LCAxMzUsIDE3NSwgMTQxLCAyMDMsIDE2NiwgMTIzLCAxMjMsIDEzNCwgMTMzLAorICAgIDExMywgMTExLCAxMjgsICA3NiwgMTI4LCAxNzcsIDE1MSwgMTc4LCAxMzQsIDEyNSwKKyAgICAxMjAsIDEyMCwgMTkzLCAxMDYsICA5OCwgMTM0LCAxMDEsICA4NiwgMTAxLCAxMTQsCisgICAgMTM2LCAxMjcsIDEzNCwgMTk2LCAgODYsIDEwNSwgMTQ1LCAxMjgsIDExOSwgMTM3LAorICAgIDEzOCwgMTI2LCAyMzAsIDE2MSwgMTQxLCAxMjgsIDEyOSwgMTM2LCAgODgsICA4MywKKyAgICAxMDMsIDExOCwgMTc4LCAxMjMsICA4OSwgMTAxLCAxNjEsIDE3MywgMTY1LCAxNDcsCisgICAgMTMwLCAxMjMsIDE3MSwgMTU4LCAxMzEsICA4MSwgIDUwLCAxNzcsIDE2MiwgMTM2LAorICAgIDEyNSwgMTE1LCAgODIsIDE3MywgMTk1LCAxNjgsIDEzMCwgMTEyLCAxMTIsIDEyMSwKKyAgICAxNTIsIDE0OCwgMTY3LCAgODcsICA4MiwgMTYxLCAxNDIsIDE0NywgIDk4LCAgODksCisgICAgMTY4LCAxMzgsICA5NywgMTU3LCAxMzIsIDExNCwgIDc0LCAxMjYsIDE2MSwgMTQxLAorICAgIDEzNSwgMTIzLCAgNjgsIDEzNywgMTI0LCAxMTgsIDExMiwgIDkyLCAgNjUsICA5NiwKKyAgICAxOTEsIDE4MSwgMTYxLCAxNTEsIDE0MSwgMTQ1LCAxMjksIDEwMiwgIDk3LCAxMTEsCisgICAgMTQ0LCAxMjgsICA1NSwgMTI4LCAxMTUsIDE1NSwgMTI5LCAxODQsIDE2NywgMTQ3LAorICAgIDEzMSwgMTQxLCAxMjUsICAzMywgMTI3LCAxMTEsIDEyNywgMTMxLCAxMjUsIDEzMCwKKyAgICAxMzcsIDEzMCwgMTIxLCAxOTUsIDE3MiwgMTc3LCAxNzYsIDE0OSwgIDk4LCAgOTcsCisgICAgMTI2LCAxMDYsIDE2OCwgMTU5LCAxNDQsIDE4NSwgMTU2LCAxNTEsIDE4MiwgMTU4LAorICAgIDEyMywgIDkzLCAxMTAsIDExNiwgIDk4LCAgOTksIDEyNSwgMTM2LCAxMzksIDE0OCwKKyAgICAgNzksIDExMiwgMTQ5LCAxMjgsIDE0NywgMTM2LCAxMTgsIDEwNSwgMTY2LCAxNTIsCisgICAgMTE3LCAxMTUsICA5MiwgMTI4LCAxNDgsIDEzMiwgMTcwLCAxNDMsIDIyNiwgMTkwLAorICAgIDEyMiwgMTkyLCAxNjUsIDEyMSwgMTQzLCAxNDQsIDE3NCwgMTI0LCAxMTMsIDEyNCwKKyAgICAxMjIsIDEzNSwgIDM0LCAgOTMsIDExOCwgMTExLCAxMTEsIDEzNiwgMTIzLCAxMTYsCisgICAgIDk5LCAxOTUsIDEzOSwgIDk5LCAxMTQsIDEwMiwgIDk2LCAxMDgsIDExMSwgMTEyLAorICAgIDExMywgMTI5LCAxNzIsIDEzNywgMTA1LCAxMzksIDE1NCwgIDg2LCAxMTMsIDEwOCwKKyAgICAxMzIsICA3OSwgIDYzLCAxMjAsICA5MywgMTYyLCAgOTAsIDEwMywgIDk0LCAgOTUsCisgICAgMTE3LCAxMjcsIDEwNCwgMTAwLCAxNDIsIDEyOSwgIDkzLCAgMjcsIDE5NiwgMTUzLAorICAgIDExMywgIDkxLCAxMDEsICA5MCwgIDg0LCAgNjgsIDEzOCwgIDM4LCAxMTgsIDE0OCwKKyAgICAgODcsIDEwMywgMTI1LCAxMDksICA5NiwgMTUyLCAxMDAsICA1NiwgIDMxLCAgNjIsCisgICAgMTc2LCAxMjksIDEyNCwgMTE1LCAxMDMsICA5MiwgMTAwLCAxMjEsIDEzMCwgMTI1LAorICAgIDEyOCwgIDcxLCAgODIsICA3MSwgMTUyLCAgODUsIDEwNywgMTE2LCAxMzgsIDEzMywKKyAgICAxMDMsIDExNiwgMTM5LCAxNDQsICA3MiwgIDM3LCAxMTgsIDE0MSwgMTA5LCAgOTUsCisgICAgIDg2LCAgOTIsIDEyMSwgMTY3LCAxNTYsIDEwNCwgIDkyLCAgOTEsIDEyMiwgMTE0LAorICAgICA4OSwgIDYxLCAxNzIsIDEyOCwgIDk1LCAxMDMsICA4NCwgMTAxLCAgODgsICA4NCwKKyAgICAxMTYsIDEyNSwgMTA4LCAgNjIsICA3NCwgMTA4LCAxNjAsIDE0MywgMTg5LCAxNjQsCisgICAgIDkxLCAxMTUsIDE0NCwgIDQzLCAxMTYsICA3OSwgMTA2LCAxMDgsICA3NCwgIDgzLAorICAgICA4NywgIDkwLCAgNjEsICA3MSwgIDc2LCAgNzYsICA5NSwgMTMwLCAgODksICA5NCwKKyAgICAxMTQsIDEwNywgMTAxLCAxNDUsIDE2MSwgMTQ3LCAxNDMsIDE2MywgMTQ3LCAxMjksCisgICAgMTAxLCAgNzMsIDExMSwgMTA4LCAgOTMsIDEwNCwgMTg2LCAxNDEsICA5OSwgIDg5LAorICAgIDExMiwgMTI2LCAxMTEsIDExMywgMTUyLCAgNDEsIDE1OSwgMTE1LCAxMzEsIDEyNCwKKyAgICAxMTcsIDEwMSwgMTE1LCAxMzAsIDEyNCwgIDg3LCAgNTksIDE3NywgIDYzLCAgODUsCisgICAgMTA5LCAxMTYsIDEwMywgIDY4LCAxNDUsIDEzMiwgIDI5LCAxMTksICA5NiwgIDg5LAorICAgIDExNywgIDkwLCAxODEsIDEwMywgMTAxLCAxMTEsICA5NywgIDk2LCAxOTksIDE3MSwKKyAgICAxMTMsIDEyMCwgIDkzLCAxMTksIDEwMSwgIDY0LCAgNTYsICA1NSwgIDYzLCAgOTAsCisgICAgMTA1LCAxMDEsICA4NiwgIDQ1LCAxMzYsIDE3OSwgMTQyLCAxMDIsIDExNSwgMTE0LAorICAgIDExMywgMTA4LCAxMjEsICA4NCwgIDIzLCAxMjUsICA3NiwgMTAyLCAxMTksIDEwNywKKyAgICAxMjAsIDEwNCwgIDczLCAxNzcsICA4MywgMTE0LCAxMjgsICA4NSwgMTUyLCAxMjYsCisgICAgMTM3LCAxMTUsIDE0OSwgMTA5LCAxNjMsIDEzMywgMTEwLCAgOTgsICA1NCwgIDYxLAorICAgICA5NSwgMTExLCAxMzUsIDEwMywgIDg4LCAxNjQsIDExNSwgMTg3LCAxMjIsICA5OCwKKyAgICAxMjksIDEzMiwgIDk1LCAgODYsICA3MSwgMTE5LCAxNDYsIDExMSwgIDM4LCAgNjcsCisgICAgMTAyLCAxMDAsICA2NiwgMTQ4LCAxMzcsIDEwMywgMTQ1LCAgOTUsICAzNSwgIDg1LAorICAgICA0NCwgMTM2LCAxMDIsIDExMSwgMTA4LCAxMTUsIDEzNiwgMTA1LCAxMjAsIDExMCwKKyAgICAxMDgsIDE0NywgMTEyLCAxNjksIDExNiwgMTQ2LCAgODEsIDEyMCwgIDk0LCAgODQsCisgICAgIDkzLCAgOTcsICA5MCwgMTE5LCAxMDIsICA5MSwgIDQ4LCAxNDcsIDIwNCwgMTUxLAorICAgIDE0OCwgMTYwLCAxNDQsIDEzMSwgMTQ0LCAxNzUsIDE1OCwgMTMzLCAyMTIsIDE2MywKKyAgICAxNzIsIDE1MiwgMTUxLCAxMTIsIDE0OCwgMTUxLCAxNDUsIDE3OSwgMTYwLCAxMjQsCisgICAgMTY0LCAxNjQsIDE2NywgMTYxLCAxNDEsIDEyMCwgMTMxLCAxNDEsIDE5OCwgMTc3LAorICAgIDE2OSwgMTU2LCAxNDYsIDE1NiwgMTI0LCAxODUsIDE2NCwgMTk1LCAxODEsIDE5MywKKyAgICAyMDEsIDE0NywgMTQ4LCAxNjgsIDE2NSwgMTU5LCAxNjIsIDE0OCwgMTUwLCAxNDgsCisgICAgMTQ2LCAxNTcsIDE1OCwgMTQ5LCAxNjQsIDEyOSwgMTYwLCAyMTQsIDE3NCwgMTY2LAorICAgIDE1NCwgMTc2LCAxNDYsIDE0MSwgMTU1LCAxNDAsIDE0MCwgMTY5LCAxMDYsIDE1NSwKKyAgICAxNjYsIDE2MiwgMTM0LCAxOTMsIDE1NywgMTU1LCAxNDYsIDE5NiwgMTcxLCAxMDcsCisgICAgMTc3LCAxNzQsIDE2MywgMTU1LCAxNDcsIDIwMywgMTYyLCAxNDYsIDE1MCwgIDgzLAorICAgIDE1NywgMTcwLCAxODAsIDE3OCwgMTU5LCAxNTcsIDE1MSwgMTE3LCAxMTUsIDE4MywKKyAgICAxNzAsIDE4MCwgMTc0LCAxNTAsIDE3NywgMTczLCAxMzYsIDE4MSwgMTk2LCAxODQsCisgICAgMTY0LCAxNjgsIDE2NSwgMTQ4LCAxNzUsIDE2OCwgMjA5LCAxODksIDE1OSwgMTE0LAorICAgIDE1NywgMTU4LCAxNDEsIDE2OCwgMTcwLCAxMzksIDE3NSwgMTI4LCAxNTEsICAzOSwKKyAgICAxMjgsIDE1NCwgMTU5LCAxNjEsIDE0OCwgMTgwLCAxMzEsIDE2NSwgMTU5LCAxMzEsCisgICAgMTYzLCAxNTAsIDE3NCwgMTc4LCAxNzgsIDE5OCwgMTcyLCAxMzgsIDE4NCwgMTkxLAorICAgIDE0MywgMTY0LCAxNjEsIDE2MywgMjEwLCAxNzEsIDE1NSwgMTY4LCAxNTAsIDExNiwKKyAgICAxODIsIDE3MCwgMTQ1LCAxNTIsIDE0MSwgMTM5LCAxOTEsIDE0OSwgMTYwLCAyMDIsCisgICAgMTQ1LCAxNjksIDE0NSwgMTgxLCAxNDgsIDE4MywgMTk3LCAxNjUsIDE0NiwgMTcxLAorICAgIDE2MSwgMTUzLCAxNTcsIDE3MCwgMTY0LCAxNDksIDE4MywgMTY3LCAyNDYsIDIzNSwKKyAgICAxNjIsIDE0NCwgMTcwLCAxNTIsIDE3MywgMTUwLCAxMTMsIDEzNSwgMTU2LCAxNTQsCisgICAgMTU4LCAxNDgsIDE3OCwgMTU5LCAxNjEsIDExNCwgMTgwLCAxNTYsIDExNiwgMTYzLAorICAgIDE2NCwgMTYxLCAxMjIsIDE2NCwgMTY0LCAxODMsIDEzNSwgMTM1LCAxNDQsIDE4MiwKKyAgICAxNjAsIDE0NywgMTYzLCAxNTIsIDE2OSwgMTg1LCAxNTksIDE3NywgIDk5LCAyMTEsCisgICAgMTY4LCAxNjcsIDIxNSwgMTcwLCAxNTAsIDE1NywgMTU0LCAxNzYsIDE1NCwgMTQzLAorICAgIDE2MywgMTE3LCAxNzgsIDE2MCwgMTYzLCAxNjUsIDE2NCwgMTY2LCAxNzQsIDEzNiwKKyAgICAxNTksIDE2OSwgMTUyLCAxMjMsIDE5OSwgMTQ5LCAxNjksIDE0MCwgMTU5LCAyMDgsCisgICAgMTU1LCAxNjEsIDE4NiwgMTIyLCAxMzQsIDE2NywgMTcxLCAxNDUsIDE0OCwgMTc2LAorICAgIDE0OCwgMTM3LCAxMTQsIDE2MCwgMTY2LCAxNTMsIDE2MiwgMTU2LCAxNjQsIDE3MiwKKyAgICAxNTUsIDE0OCwgMTU1LCAxODIsIDExNCwgMTUwLCAxNTcsIDE1NCwgMTQwLCAxNTksCisgICAgMTY2LCAxNjAsIDE2OSwgMjA2LCAxODIsIDE0NSwgMTU3LCAxNjUsIDE0NywgMjAyLAorICAgIDEzMSwgMTU0LCAxOTMsIDE2MiwgMTYyLCAxNDksIDE2NywgMTU3LCAxOTEsIDE4OCwKKyAgICAxNDksIDIwNSwgMTQ3LCAxNjYsIDE1MCwgMTUwLCAxNTksIDE1MywgMTcxLCAxNjAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHdtYXZvaWNlX2RxX2xzcDE2aTFbMHg2NDBdID0geworICAgIDE0MiwgMTIxLCAxNDEsIDExMiwgIDk5LCAxMTksICA5MiwgMTIyLCAxODMsIDE1NSwKKyAgICAxMjIsICA5OCwgIDc1LCAgNzgsICA4NSwgMTAxLCAxMDgsIDEzNCwgMTI4LCAxMjMsCisgICAgMTE1LCAgOTAsICA3OSwgIDU4LCAgNzMsIDEyNywgMTA2LCAgNjAsICA5NywgMTA3LAorICAgIDE0MSwgMTYzLCAxMzAsIDEyMywgMTM2LCAxNTYsIDIwMSwgMTg5LCAyMDQsIDIwNiwKKyAgICAxNDAsIDExNiwgIDY5LCAgNjAsIDExNywgMTIzLCAxMDYsIDEyNCwgIDkxLCAgNjMsCisgICAgMTUwLCAxNDQsIDExMCwgIDgwLCAgNjMsIDExMiwgIDgwLCAgNzAsICA3NiwgIDYzLAorICAgIDExNCwgIDg2LCAxNDcsIDE2NSwgMTM3LCAxMjUsIDEyMCwgMTQwLCAxMTUsIDEwMSwKKyAgICAxMDEsICA5OSwgMTY2LCAxNTgsIDE1OCwgMTA0LCAxMjYsIDEzMSwgMTM0LCAxNDMsCisgICAgMTIxLCAxMDIsICA3MywgIDM2LCAgODMsIDEzMiwgMTEzLCAgNzYsICAzOCwgIDIwLAorICAgIDEzMiwgMTExLCAgNzgsICA3MywgIDUxLCAxMzEsIDEwOCwgMTMxLCAxMDUsICA4MCwKKyAgICAxNDgsIDEzOCwgMTAxLCAgNjUsICA0NywgMTE1LCAgODYsICA1MCwgMTI0LCAxMjksCisgICAgMTE2LCAgODksICA4NSwgIDg3LCAgNjQsIDExMSwgIDc0LCAgMzksIDExNSwgMTEzLAorICAgIDExMiwgIDgzLCAgNzUsIDEyMiwgMTI3LCAxMTQsICA5MSwgMTA2LCAxMjUsIDEzMCwKKyAgICAxMzEsIDEwOCwgIDc5LCAxMzYsIDExMiwgMTEwLCAxNDcsIDE2NCwgMTQ0LCAxMjQsCisgICAgMTIxLCAyMzYsIDIxOCwgMTkwLCAxNjgsIDEwNiwgMTAxLCAxNjAsIDE3MiwgMTkxLAorICAgIDExMywgMTM4LCAxMDIsICA5MSwgMTA5LCAxMDAsICA3MSwgIDg1LCAxMTIsIDExOSwKKyAgICAxMjEsICA5NiwgIDUxLCAgNjQsIDEyNiwgMTM1LCAxMTQsICA3NiwgIDM0LCAxMDQsCisgICAgMTQ1LCAxMjcsICA5MCwgIDU2LCAxMzEsIDE0MiwgMTMxLCAgOTIsIDEyMywgMTAyLAorICAgIDEyOCwgMTA1LCAgNjMsICAyNCwgIDk1LCAxMTUsICA4NywgIDQ5LCAxNTYsIDE3NCwKKyAgICAxMjMsIDEwNSwgIDg4LCAgNTgsICA1NSwgMTQxLCAxMTksICA5OSwgIDc1LCAgODEsCisgICAgMTM3LCAxMTcsIDExNCwgIDgwLCAgNTYsIDExOSwgIDkxLCAxMDYsIDE2NiwgMTM1LAorICAgIDExNCwgIDg0LCAgMzgsICA5MywgMTE2LCAxMjksIDEwMywgIDk3LCAgODcsICA5NywKKyAgICAxMTUsIDE4NCwgMTkzLCAxNzMsIDE1NywgMTE3LCAgODgsIDExNCwgMTUxLCAxMjEsCisgICAgMTI2LCAxMTEsICA3NSwgMTI5LCAxMzMsIDEzMCwgMTA3LCAgNzEsIDExNSwgIDkyLAorICAgIDEyOCwgMTA4LCAxMjAsIDEwMCwgIDk3LCAxMTEsICA4MCwgMTE5LCAxMjIsICA5MSwKKyAgICAxMTQsICA5NCwgMTQ5LCAxMjksIDEzNiwgMTE0LCAgODgsIDEzMiwgMTEwLCAgODUsCisgICAgMTE2LCAgOTksIDEwMSwgIDcxLCAgNzEsIDExMCwgMTQwLCAxNDIsIDEzMSwgMTEwLAorICAgIDEyMiwgIDk4LCAgODMsIDEyNywgMTAwLCAxMDYsIDEzMCwgMTIzLCAxMTQsIDEwMywKKyAgICAxMTMsICA4NywgMTQwLCAxMTYsIDExMywgMTQwLCAxNjEsIDE3MSwgMTQ1LCAxMjksCisgICAgMTE1LCAxNzgsIDE1OCwgMTYxLCAxNjAsIDExOCwgMTk1LCAyMDksIDIyMSwgMjI4LAorICAgICA5OSwgIDgzLCAxNDAsIDEzNCwgMTQwLCAxMjcsIDE4NiwgMTY4LCAxODcsIDE4NywKKyAgICAxMDcsIDExNCwgMTAwLCAxMTEsIDExMSwgMTA0LCAxMzAsIDEzMSwgMTE2LCAxMjgsCisgICAgMTI4LCAxMDQsICA2NCwgIDE4LCAgNDksIDEyNiwgMTA3LCAgNjksICA1NiwgMTUzLAorICAgIDE1NCwgMTQyLCAxMTAsIDExMywgIDg5LCAxMjAsICA5MywgIDczLCAxOTAsIDE3MiwKKyAgICAxMTksICA5NiwgIDU3LCAgMjEsICA2MCwgMTI2LCAxMjIsICA4MSwgIDk5LCAxMTcsCisgICAgMTU5LCAxNDEsIDEwOCwgIDg4LCAxMjAsIDE0NCwgMTI1LCAgODksICA0NCwgIDk0LAorICAgIDE0NywgMTMxLCAgOTMsICA4MSwgIDYxLCAxMzMsIDExMywgIDg1LCAgNDcsICA2MiwKKyAgICAxMjMsIDEyMSwgIDg3LCAgNTMsICA5MCwgMTIwLCAgOTQsICA3NiwgIDcwLCAgNDgsCisgICAgMTI1LCAxMDMsICA5MywgIDY0LCAgMzUsIDE0MCwgMTI5LCAgODgsICA0NywgIDMwLAorICAgIDEyNywgMTA0LCAgNTgsICA1MSwgMTAzLCAxMjQsIDEwMCwgMTAyLCAgNzYsICA0NywKKyAgICAxMTUsICA4NywgIDU0LCAgNDYsICA3NywgMTgyLCAyMTgsIDE3NCwgMTYzLCAxNDUsCisgICAgMTQwLCAxMjYsICA4OSwgMTA1LCAgODIsIDEyNSwgMTE5LCAxMDEsICA2OSwgIDU4LAorICAgIDEyNSwgMTA3LCAxNzIsIDE0NSwgMTI4LCAxMzgsIDExMywgMTA5LCAgOTIsICA5MCwKKyAgICAxMTcsICA5MywgIDgzLCAgOTMsIDEzMiwgMTI1LCAxMDIsICA2NywgMTQ4LCAxNjEsCisgICAgMTMxLCAxMTAsICA5NiwgIDk5LCAgNzQsIDExOSwgIDkyLCAgNTQsICA4NCwgIDgxLAorICAgIDExMCwgMTUyLCAxMjAsIDEwNiwgMTMxLCAxMDgsICA3NCwgIDY4LCAgOTksIDEwNywKKyAgICAxMjEsICA5NywgMTIwLCAxMDEsICA3OCwgMTMyLCAxMTAsIDEyNywgMTY0LCAxMzQsCisgICAgMTExLCAxNTksIDIwNCwgMTg5LCAxNzgsIDE1OCwgMTgzLCAxNDYsIDE0NCwgMTM3LAorICAgIDEyMywgMTA2LCAxMzYsIDEwOCwgMTM1LCAxMTcsICA5MSwgMTYzLCAxMzUsIDExMywKKyAgICAxMTksIDE3NywgMTM0LCAxMjIsIDEyMSwgMTMyLCAxMDksIDE1NywgMTMxLCAxMTMsCisgICAgMTE1LCAgODcsICA4NywgMTAwLCAgOTIsIDEyMCwgIDk1LCAgNTksIDE0NiwgMTM5LAorICAgIDEyOSwgMTAxLCAxMzUsIDEyMiwgMTAxLCAxMTksIDEwMCwgMTEyLCAgODgsICA5OSwKKyAgICAxMTgsICA5MCwgMTIzLCAxMjUsIDEwNywgMTIxLCAgOTgsICA3MywgMTA0LCAgODAsCisgICAgMTEyLCAgNzksICA4NiwgMTIyLCAgOTYsIDEwNCwgIDgxLCAxMDcsICA5MCwgIDkzLAorICAgIDExMiwgMTUwLCAxNDAsIDEwOSwgMTE1LCAxMTMsICA4NiwgIDczLCAgNzYsIDExMiwKKyAgICAxMzAsIDExMSwgMTAxLCAxMTIsICA4NCwgMTIzLCAgOTcsICA2MywgMTM0LCAxMTUsCisgICAgMTA5LCAgNzcsIDEyOCwgMTQxLCAxMTksIDEyNSwgMTAxLCAxMDgsIDE0NywgMTE5LAorICAgIDEzNCwgMTQ5LCAxNTAsIDEyNywgMTE1LCAxMzYsIDI0NCwgMjIwLCAyMTAsIDE4OSwKKyAgICAxMDUsIDEzOCwgMTcxLCAxNTYsIDE3NCwgMTE3LCAxNjIsIDEzMywgMTQ2LCAxNDEsCisgICAgMTE1LCAgOTMsIDExOSwgIDk4LCAxMjIsIDExNCwgMTA2LCAxNTQsIDE0NSwgMTYyLAorICAgIDEwNywgMTMxLCAxODksIDE2NSwgMTUyLCAxMDEsIDEwNywgMTI5LCAxMTQsIDEzOSwKKyAgICAxMTYsIDE4NiwgMTg2LCAxNjEsIDE4MCwgMTAwLCAgODksIDEzNywgMTE2LCAxMTYsCisgICAgMTA2LCAxMzAsIDE5NCwgMTk2LCAyMDcsIDExMCwgMTU2LCAxNTcsIDEzOCwgMTQ5LAorICAgIDEwMiwgIDkzLCAxNTksIDEzOCwgMTIwLCAxMDksIDEzMiwgMTA1LCAxMjIsIDEzNSwKKyAgICAxNDgsIDEyOCwgIDg1LCAgNzYsIDEwMiwgMTY4LCAxNTQsIDE0MSwgMTE3LCAxMDAsCisgICAgMTI1LCAxMDYsICA2MiwgMTAxLCAxNDYsIDEyNCwgMTAyLCAgNjUsICAyNSwgIDE1LAorICAgIDEyMCwgIDk0LCAgNDYsICAyMSwgIDk0LCAxNDksIDEyOCwgMTE1LCAgODUsICA5MiwKKyAgICAxMTksICA5MywgIDcwLCAgNTIsICAzMCwgMTYyLCAxNTEsIDEyMywgIDkxLCAgODAsCisgICAgMTI2LCAxMTIsICA4NCwgIDQ3LCAgMzMsIDEzOCwgMTE0LCAgNzMsICA2MCwgIDg3LAorICAgIDEyNiwgMjExLCAxNzQsIDE1OCwgMTQzLCAxMjksIDEwNiwgIDY1LCAgMzEsIDEzMywKKyAgICAxMTksICA5NSwgIDUyLCAgOTksIDE3MywgMTIzLCAgOTYsIDExOSwgMjA2LCAxNzgsCisgICAgMTI3LCAxMDQsICA2MCwgIDYxLCAgNjcsIDE1MiwgMTM2LCAxMDQsICA2MywgIDgzLAorICAgIDEzMywgMTMwLCAgOTIsICA2NCwgIDQ1LCAxMjAsICA5NiwgIDUzLCAgMzAsIDEzMCwKKyAgICAxMjgsIDEwMywgIDc0LCAgNTksICAzNSwgMTM1LCAxMTQsICA3NywgIDMwLCAgNTcsCisgICAgMTA4LCAxMzAsIDEyMywgIDkwLCAgODcsIDE0MywgMTI1LCAgOTMsICA1NCwgIDYwLAorICAgIDEzMywgMTE4LCAgNzksICA4NywgIDk1LCAxMTUsICA4OSwgMTExLCAgODgsICA2NSwKKyAgICAxMjQsIDEwMiwgIDcwLCAgNDAsICA0NywgMTQ4LCAxMzEsIDEyMywgMTMwLCAxMDQsCisgICAgMTI3LCAxMDksICA4NywgIDU2LCAxMjEsIDE0NywgMTIzLCAxMjEsIDEwNywgIDg1LAorICAgIDE3OCwgMjM3LCAyMDAsIDE5MywgMTcwLCAxMzksIDExOCwgMTAwLCAgNzUsIDExMCwKKyAgICAxMzMsIDEyMSwgIDgxLCAgNzMsICA2OCwgMTIwLCAxOTUsIDE1NywgMTQxLCAxMzEsCisgICAgMTI3LCAxMDIsIDEwNywgIDg4LCAgNjAsIDEzNiwgMTEzLCAxMDAsICA2OSwgIDQ1LAorICAgIDEyOCwgMTA1LCAgOTMsICA3NywgIDY3LCAxMzEsIDExNiwgMTQ5LCAxODQsIDE1NiwKKyAgICAxMTUsICA4NSwgIDM1LCAgNDUsIDExMiwgMTI4LCAxMDgsICA2OCwgIDczLCAxMTEsCisgICAgMTE4LCAgOTMsIDE4NywgMTYyLCAxMzksIDEzNiwgMTE1LCAgODQsICA1NywgIDM3LAorICAgIDEzMSwgMTMzLCAxMjUsICA5OCwgIDg1LCAxMzgsIDExNSwgIDkyLCAgODYsICA2MSwKKyAgICAxMTYsICA5NiwgIDcwLCAgNTIsIDExMCwgMTE1LCAxMDksIDEzNSwgMTA0LCAgODgsCisgICAgMTM2LCAxNTksIDEyMiwgMTA5LCAxMTUsIDEyMiwgMTEwLCAgOTgsICA3MCwgIDk1LAorICAgIDExMiwgIDgxLCAgNjgsICA4NSwgIDkwLCAxMjQsIDEwMSwgIDg3LCAgNTYsICA4OSwKKyAgICAxMDksICA4MiwgIDk4LCAxMDAsIDExNSwgMTI0LCAxMDIsICA3NiwgIDg4LCAgNjMsCisgICAgMTExLCAgNzgsICA0MiwgIDc4LCAxMDIsIDExMCwgIDcxLCAgNjQsIDEzMSwgMTExLAorICAgIDEyNSwgMTA0LCAxMDcsICA4NywgMTIzLCAxMjksIDEzMSwgIDk5LCAgODUsICA2OCwKKyAgICAxNDcsIDEzNywgMTAyLCAgOTksICA3NSwgMTIwLCAxNTUsIDE0MiwgMTA5LCAgOTEsCisgICAgMTMyLCAxMDksIDEzMSwgMTQxLCAxMTMsIDEzNiwgMTE5LCAgOTQsIDE1MiwgMTI4LAorICAgIDEyNywgMTAyLCAgNzksIDE1OSwgMTM0LCAxMTEsICA3OCwgIDk4LCAxMDksICA4MCwKKyAgICAxMTUsICA4NiwgIDUxLCAgNjMsIDEwMywgMTE2LCAgODYsIDE3MCwgMTQ5LCAxMjMsCisgICAgMTM1LCAxNzgsIDE1OSwgMTI1LCAxMTQsIDExMywgMTg5LCAyMjYsIDIwMywgMjAyLAorICAgIDE0MCwgMTE3LCAxMTYsICA5NCwgIDcwLCAxMjgsIDEwMywgIDk0LCAxNzQsIDE0OSwKKyAgICAxMTgsICA5OCwgIDgzLCAgODQsIDEwNiwgMTE1LCAxNTcsIDEyMCwgIDk0LCAgOTUsCisgICAgMTMxLCAxMTIsICA3NSwgIDk2LCAgNzQsIDEyMSwgIDk3LCAxNDQsIDExNywgIDk1LAorICAgIDEyMCwgIDkwLCAxNDAsIDEzOCwgMTEwLCAxMTksICA5MywgIDU1LCAgOTIsIDExNCwKKyAgICAxMTQsICA4NywgMTUxLCAxMjUsIDEwMCwgMTExLCAgODIsICA4MywgMTYwLCAxMzksCisgICAgMTE0LCAgODYsICA1NiwgIDkwLCAxMzgsIDEwNCwgMTA5LCAxMDEsICA3NywgMTE4LAorICAgIDE0MCwgMTQyLCAxNDMsIDE0OCwgMTI2LCAxMjEsIDEwMiwgMTI5LCAxMDcsIDExMSwKKyAgICAxMTMsICA3OSwgIDU4LCAxMTEsICA5MSwgMTIwLCAgOTQsICA2MywgMTE1LCAgOTgsCisgICAgMTIxLCAgOTQsICA5OSwgIDk3LCAgNzgsIDEyMCwgIDkyLCAgNjgsIDE3MywgMTQ4LAorICAgIDEyMiwgMTE0LCAxMDksICA4NywgIDgyLCAxMzIsIDIyOSwgMTkyLCAxNzYsIDE1NSwKKyAgICAxMzcsIDExNiwgMTIzLCAgOTcsIDExNSwgMTMyLCAxMTUsICA4NiwgMTIwLCAgOTUsCisgICAgMTM1LCAxMTYsIDEwMSwgMTM2LCAxMDgsIDEwOSwgIDc0LCAxMDAsIDEyNSwgMTE1LAorICAgIDExMiwgMTU4LCAxNDQsIDEyNCwgMTM0LCAxMTQsICA4MywgIDczLCAxNDcsIDEyMCwKKyAgICAxMjAsIDEwNCwgMTUwLCAxMjIsIDExNiwgMTEwLCAxMDQsIDE5MiwgMTgzLCAxNzQsCisgICAgMTM0LCAxMTIsIDExNiwgMTIwLCAgOTMsIDEyMSwgMTAxLCAgOTMsIDExMCwgIDkwLAorICAgIDEyMSwgIDkzLCAxNDcsIDE1MiwgMTIyLCAxMTUsIDE1MywgMTcxLCAxNjEsIDE0MiwKKyAgICAxMjMsICA5NSwgMTE2LCAxMTQsICA5MywgMTEzLCAgODksICA5NiwgIDc3LCAgOTMsCisgICAgMTEzLCAxNzQsIDE4MCwgMTQzLCAxMzgsIDExNiwgIDg2LCAxMDAsIDEzNSwgMTA2LAorICAgIDEwMywgMTIxLCAxNDksIDExNSwgMTAzLCAxMjEsICA5NSwgIDgyLCAxNDksIDEyMSwKKyAgICAxMTcsICA5MiwgIDkzLCAxMTEsIDExNCwgMTIzLCAyMDksIDE5NiwgMTkzLCAxODMsCisgICAgMTI1LCAxMDIsIDEwNywgMTMwLCAxMDQsIDExNSwgIDkxLCAxMTMsIDEwMywgIDk5LAorICAgIDExNCwgIDg2LCAgNjgsIDEwOCwgMTEwLCAxMTEsIDE1OSwgMTYyLCAxMjUsIDExMywKKyAgICAxMjUsIDIzNSwgMjM0LCAyMjUsIDIxNCwgIDk5LCAgNzQsIDExOCwgMTIxLCAxMjcsCisgICAgMTA0LCAxMjMsIDE1OCwgMTI4LCAxMjcsIDExMywgIDk2LCAxMTYsIDEzNiwgMTU4LAorICAgIDEwMCwgIDgwLCAxMzgsIDE1NSwgMTY2LCAxMTgsIDE0MywgMTE1LCAxMjUsIDExNCwKKyAgICAxMTksIDEzNywgMTMzLCAxMzYsIDEzOSwgMTUxLCAxODgsIDE3MiwgMTc0LCAxNzMsCisgICAgMTM4LCAxNjEsIDE1OCwgMTU4LCAxNTUsIDEyMSwgMTk4LCAxOTQsIDIxMSwgMjAyLAorICAgIDEwMCwgIDkwLCAxMTIsIDExMCwgMTIyLCAxMDAsICA5MSwgMTIyLCAxMjgsIDEzNSwKKyAgICAxMDEsIDEwOSwgMTI3LCAxMDEsIDExNCwgMTA1LCAxMjYsIDE2MCwgMTQ3LCAxNDMsCisgICAgMTA5LCAxMzgsIDE0MiwgMTU4LCAxNjMsIDExMywgMTc0LCAxODUsIDE4OCwgMjA2LAorICAgIDExMiwgMTU0LCAxNjYsIDE3NiwgMTgzLCAxMDEsIDEwOCwgMTQwLCAxNDAsIDE0MywKKyAgICAxMDYsIDEzNSwgMTMwLCAxMzcsIDEyNiwgMTAzLCAxMTQsIDExNSwgMTI4LCAxMjYsCisgICAgMTA3LCAgODYsICAyMSwgMTE1LCAgNzUsIDExNywgMTM5LCAgOTcsICA2NSwgMTA1LAorICAgICA2NCwgMTkxLCAxMDEsIDEwNiwgMTM5LCAxMDcsICA5OCwgMjE4LCAxMzIsIDEwNCwKKyAgICAgNzMsIDEzNiwgMTY1LCAgODQsIDExOCwgMTUwLCAxMTEsICA1OCwgMTMwLCAxMDcsCisgICAgIDk5LCAxMzYsIDEzMiwgIDU2LCAgNTIsIDEwMiwgMTM2LCAgNjksICA3OCwgMTYzLAorICAgICA4NSwgMTczLCAxNDgsIDEzOCwgIDg1LCAgNjksIDEwNiwgMTI4LCAxMzMsIDE1NSwKKyAgICAxMDQsICA5MSwgMTQ5LCAgNTYsIDEwNCwgMTAzLCAxMDEsIDE3MiwgIDk2LCAgNTcsCisgICAgMTA0LCAgOTcsIDEyNSwgMTk3LCAxNjYsIDEwNywgMTY5LCAgNDcsIDEyMCwgMTAzLAorICAgIDE1MCwgIDg5LCAgOTksIDEzOSwgMTYyLCAxMDEsICA2OSwgMTM3LCAxNTgsIDEyNiwKKyAgICAxOTEsIDE3MywgMTI3LCAgNzksIDE1NSwgIDUxLCAxMzEsIDExMiwgIDg2LCAgNzQsCisgICAgMTM1LCAgNjEsIDExNCwgIDgxLCAxMjUsIDExNywgMTEyLCAgNzIsIDE3NSwgIDcyLAorICAgIDEyNywgMTIzLCAxNDIsIDEzMiwgIDc4LCAxMTYsIDE1OCwgMTExLCAxMjEsIDE0MywKKyAgICAxMDgsIDEwMiwgIDg5LCAgMjAsIDE5NCwgIDgxLCAgOTksIDEwNywgIDY1LCAxNTAsCisgICAgMTAzLCAgNzgsICA5MSwgIDY5LCAgOTYsIDEwNCwgMTE2LCAxMTYsIDEwMywgMTA1LAorICAgIDEwNywgMTE3LCAxMTAsIDEzMCwgIDI4LCAgODgsIDEwMywgIDYyLCAgNzIsICA4NSwKKyAgICAxMjUsIDEyNiwgMTQxLCAxMjYsIDE3OCwgMTIxLCAxMDIsICA1NywgIDQ2LCAxMjQsCisgICAgIDk3LCAgOTEsICA4OSwgMTM4LCAgOTUsICA5OCwgMTQzLCAgOTksIDE2OSwgMTIzLAorICAgIDE0MCwgMTE5LCAxMTMsICA4MiwgMTQwLCAxMTgsIDExMiwgIDkxLCAgOTIsIDI0MSwKKyAgICAxMzQsICA4OSwgIDk1LCAxMTIsICA3OCwgMTY3LCAxNDAsIDE0NSwgMTIxLCAxMDAsCisgICAgMTA5LCAyMDUsIDE0NCwgIDkxLCAxMDAsIDExMywgMTAzLCAxNDIsIDE3NSwgIDk1LAorICAgIDExNywgMTIxLCAgMzUsIDEyMSwgMTI3LCAxNTksIDEyOSwgIDg1LCAgNjQsICA3NSwKKyAgICAxMTYsICA5OCwgMTAzLCAxMjcsIDEyOSwgIDY2LCAgNjgsIDExMCwgIDk2LCAgODYsCisgICAgIDc5LCAxMDAsIDE1NiwgMTMzLCAgOTIsIDEzNSwgIDk2LCAxNjQsIDEzMiwgMTIxLAorICAgICA5MywgMTYzLCAxMzQsICA5MSwgMjA4LCAxMDQsICA3NywgMTI2LCAxMTYsICA1OCwKKyAgICAxMzYsIDExOCwgMTMyLCAgODEsICA2MSwgIDczLCAxMTUsICA2NiwgMTI5LCAxMjMsCisgICAgMTExLCAgODUsICA0MiwgMTc4LCAxMzQsIDEwOCwgMTMyLCAxNTksICA0NSwgMTU3LAorICAgIDEwNSwgMTY0LCAxMDAsICA5NCwgIDYwLCAgOTYsICA1NywgMTU0LCAxMDUsIDEwMiwKKyAgICAxMDMsIDExNCwgIDk2LCAgMTIsICA5MSwgMTE5LCAxMTUsICA2NywgIDkyLCAgNjQsCisgICAgIDk0LCAgNjEsIDEwNiwgMTA2LCAxNjUsIDEwNSwgIDk0LCAgOTgsICA2OCwgIDMwLAorICAgIDE0NiwgMTMwLCAxMDcsIDE3MywgMTQwLCAxMDIsICA5MCwgMTYzLCAxMDYsIDE4NCwKKyAgICAxMDAsICA1MywgIDY4LCAxMzEsICA5MiwgMTA1LCAxMTEsICA2OCwgMTUzLCAxODYsCisgICAgMTAxLCAgODIsICA0OCwgIDk5LCAxNDcsIDEyMiwgMTM2LCAxNzYsICA5NiwgIDk2LAorICAgIDEwNCwgMTMyLCAxNjcsIDE0OSwgMTM2LCAxMzgsIDE0NCwgIDk3LCAxMjAsICA5MgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgd21hdm9pY2VfZHFfbHNwMTZpMlsweDNjMF0gPSB7CisgICAgIDIzLCAgMTIsIDEwNywgMTE5LCAxMTAsIDIwNSwgMjE0LCAyMTIsIDIwOCwgMjAxLAorICAgIDEwMiwgIDk1LCAgNjksIDExNywgMTA3LCAxMTgsIDEyMywgMTE4LCAxMjMsIDEyMSwKKyAgICAgODIsICA1OCwgIDgzLCAgOTUsICA4NCwgMTM5LCAxNDUsIDE1MywgMTYxLCAxNjksCisgICAgMTAyLCAxMDAsIDEzOCwgMTIxLCAxMDEsIDEyOSwgMTMwLCAxMzgsIDE1MCwgMTM5LAorICAgICA3NiwgMTA0LCAgODYsIDExMiwgMTMzLCAxMTMsICA5MSwgIDYzLCAgNzMsIDEyOSwKKyAgICAxOTksIDE5MywgMTgyLCAxODEsIDE3MiwgMTE5LCAxMDEsICA4MywgIDk0LCAgNzYsCisgICAgMTYxLCAxNTcsIDE1MiwgMTU3LCAxNTgsIDExMCwgIDkwLCAxMjEsICA5NiwgIDc5LAorICAgIDEyNCwgMTA3LCAxMTQsICA4OCwgIDczLCAxNTIsIDEzNywgMTIxLCAxMDcsICA5OSwKKyAgICAgNTcsICA1MCwgMTAwLCAgODEsICA3NCwgMTE1LCAgOTYsICA3MiwgIDQ5LCAgNjksCisgICAgIDgzLCAgNjgsICA0MCwgIDUzLCAxMDMsICAzNiwgMTMxLCAxMDcsICA4NCwgIDY0LAorICAgIDIzNiwgMjQ1LCAyNDIsIDIzMSwgMjEzLCAgOTUsIDEwOSwgIDg4LCAgNjksIDExMCwKKyAgICAyMjgsIDIyMSwgMjA0LCAxODIsIDE3MCwgMTI5LCAxMTAsICA5NywgMTE4LCAxMDQsCisgICAgIDk4LCAgNzYsICA5OCwgIDc1LCAgNjEsICA5MywgIDc3LCAxMTMsICA5MSwgIDcyLAorICAgIDExNiwgIDk0LCAxMDYsIDEzNCwgMTE4LCAxNzcsIDE4OCwgMTY5LCAxNjIsIDE1MywKKyAgICAxNjMsIDE0OSwgMTMxLCAxMzEsIDEzMiwgMTc3LCAxNjMsIDE3MywgMTY4LCAxNTgsCisgICAgMTEzLCAxMzEsIDEwNywgMTEzLCAxMDAsIDEzMiwgMTQzLCAxMzEsIDEzNCwgMTQyLAorICAgICA0NSwgIDM2LCAxMjEsIDExMywgMTAyLCAgNDMsICA5NSwgIDg0LCAgNjcsICA1NiwKKyAgICAgNzYsICA4MiwgIDY4LCAgNDgsICAzMywgIDU1LCAgNTgsICA1OSwgIDQzLCAgNjUsCisgICAgIDY2LCAgODUsICA2NiwgIDgxLCAgOTQsIDEwMiwgIDgyLCAgNTQsICAzMywgIDk0LAorICAgIDExMywgMTExLCAgODksICA2MCwgIDM0LCAxMzgsIDEyMCwgMTAxLCAxMDEsICA4NiwKKyAgICAgODgsICA3MywgIDU1LCAxMTQsIDExNSwgIDkyLCAgNzQsICA5MywgIDc3LCAxMjMsCisgICAgIDkwLCAxMTcsICA5OSwgIDc5LCAgNTksICA5NywgIDc1LCAgOTcsIDEyMiwgMTA0LAorICAgIDIzMywgMjM3LCAyMjcsIDIwOCwgMTkwLCAyMDksIDIzMCwgMjMzLCAyNDAsIDI0MSwKKyAgICAxOTUsIDE5NywgMTg4LCAxNjcsIDE0NywgMjA0LCAxODUsIDE2OCwgMTYyLCAxNTcsCisgICAgMTQyLCAxMjQsIDExOSwgMTIzLCAxMDYsIDExNywgMTEwLCAgODEsIDEyMSwgMTIzLAorICAgICA3NCwgMTE2LCAxMjQsIDExOSwgMTIwLCAxNzgsIDE2OCwgMTQ2LCAxMzIsIDEyNSwKKyAgICAxMDIsIDEwNCwgMTA1LCAxMTAsIDExNCwgMTA0LCAgODIsICA3OCwgMTAwLCAgODYsCisgICAgMTIwLCAxMDIsIDEwNSwgIDkzLCAxNDMsIDEyNywgMTA4LCAxMjgsIDEwNiwgIDg4LAorICAgIDE3NywgMTg5LCAyMDMsIDIwNywgMjE1LCAxMDEsIDEzMSwgMTE5LCAgOTUsICA3MywKKyAgICAxNDksIDEzOSwgMTM1LCAxNDcsIDE1MywgMTYwLCAxNjcsIDE2NSwgMTc0LCAxNzcsCisgICAgMTIwLCAxMDksIDEzNCwgMTQwLCAxNDUsIDEzMSwgMTMwLCAxNDIsIDEzOSwgMTYxLAorICAgIDE0MywgMTU4LCAxNDgsIDE0NSwgMTQ1LCAxMjMsIDE0MiwgMTMyLCAxMTYsIDEwMiwKKyAgICAgNDAsICAyMywgIDc5LCAgODIsICA4NCwgIDI2LCAgODMsIDE0MSwgMTMwLCAxMjIsCisgICAgIDY1LCAgNDYsICA0MywgIDg5LCAgODYsICAyOCwgIDc1LCAgODAsICA3OSwgIDk4LAorICAgICA4NCwgIDY1LCAgNDcsICAyNiwgIDQ0LCAgNDksIDExMiwgMTAxLCAxMDAsICA5NCwKKyAgICAgODgsICA3NiwgIDc1LCAgNDgsICA4MiwgMTA0LCAxMDAsICA3NSwgIDQ1LCAgMTUsCisgICAgIDk5LCAgODMsICA2MywgIDM0LCAgMzAsICA2NiwgIDU1LCAgOTQsIDExOCwgMTEzLAorICAgIDEyMiwgMTA2LCAgOTEsICA2OCwgIDYwLCAxMzUsIDEyMiwgMTA0LCAgNzcsICA1OSwKKyAgICAgODIsIDEwMiwgIDg0LCAgNjIsICA0NiwgIDkyLCAgNzQsICA1NSwgIDgyLCAgNzEsCisgICAgMTQ1LCAxMzQsIDExOCwgIDkzLCAgNzUsICA3OSwgIDYyLCAgODMsICA2NSwgIDU1LAorICAgICA5MSwgIDk0LCAgNjQsICA3MCwgIDk4LCAgODksIDExNywgMTEwLCAgODcsICA5NywKKyAgICAyMTAsIDIyMywgMjI1LCAyMjMsIDIxMywgIDgzLCAxMDMsICA4NiwgMTAxLCAgODUsCisgICAgMTI2LCAxMDYsICA4MSwgIDc5LCAxMDUsIDIxNiwgMjE5LCAyMTcsIDE5OSwgMTc5LAorICAgICA4NiwgIDc4LCAxMTUsIDEzOCwgMTM1LCAxMDIsICA4NCwgIDg3LCAgNTksICA0NiwKKyAgICAyMTksIDIwNiwgMTg0LCAxNjcsIDE1OCwgMjAxLCAxODgsIDE2NSwgMTQ1LCAxMzUsCisgICAgIDg3LCAxMTMsIDE0MiwgMTUyLCAxNTUsIDE5MCwgMTcwLCAxNTMsIDE0OSwgMTQ2LAorICAgIDIwNSwgMjA4LCAyMDEsIDE4NSwgMTY3LCAgODQsICA3MywgMTI0LCAxMDQsICA5NiwKKyAgICAgNzYsICA4OCwgIDk5LCAgNzQsICA4MCwgMTEwLCAxMjUsIDEyMiwgIDk5LCAxMTIsCisgICAgMTA4LCAgODQsICA3MCwgMTMwLCAxMzcsIDE2MSwgMTUyLCAxMzYsIDExOSwgMTA1LAorICAgIDExMCwgIDkxLCAxMDEsICA3NCwgIDk2LCAxMTEsIDEwMSwgIDkzLCAxNTMsIDE0OSwKKyAgICAxMzMsIDEyNCwgMTAyLCAgOTcsIDEyMCwgMTAxLCAgOTMsICA3NSwgIDgxLCAgNjQsCisgICAgMTExLCAgOTQsIDEwNywgIDc5LCAgNTgsIDE4OCwgMjA2LCAyMTUsIDIyMSwgMjMyLAorICAgIDE2MywgMTc1LCAxNjUsIDE1MCwgMTM2LCAxMDMsIDEwNiwgMTIzLCAxMzMsIDEzMiwKKyAgICAxNjgsIDE4NCwgMTkxLCAxODMsIDE3MCwgMTEwLCAxMTcsICA5MCwgIDk4LCAgOTMsCisgICAgMTA0LCAgODcsIDEyMiwgIDk4LCAxMjcsIDEyOSwgMTEwLCAxMjcsIDExMywgMTI1LAorICAgIDEzNCwgMTE4LCAxMDIsIDE0MCwgMTMyLCAxODYsIDE5OSwgMjAyLCAxOTgsIDE4OCwKKyAgICAxNDksIDE0NywgMTc1LCAxODUsIDE4NiwgMTE3LCAgOTMsICA5OSwgMTEyLCAgOTMsCisgICAgMTA3LCAxMzgsIDEzOCwgMTI5LCAxMjgsICA5NiwgMTI5LCAxMDQsIDExOCwgMTM0LAorICAgIDE0NSwgMTM2LCAxMTUsIDEyMSwgMTI5LCAxMzgsIDE1NSwgMTQ4LCAxMzQsIDEyMCwKKyAgICAxNzAsIDE1MSwgMTUwLCAxNDUsIDEzOCwgMTY4LCAxNzMsIDE4NSwgMTk0LCAyMDAsCisgICAgMTQ0LCAxNTksIDE3MiwgMTY4LCAxNTYsIDEyMSwgMTIxLCAxMzgsIDE3MywgMTY4LAorICAgIDEyNiwgMTExLCAxNDAsIDEzOSwgMTE3LCAxNDksIDEzMywgMTQyLCAxMzcsIDEzMCwKKyAgICAxNDMsIDEzOSwgMTU4LCAxNTgsIDE0NiwgMTE5LCAxMjgsIDEyMSwgMTMyLCAxNDUsCisgICAgMTIyLCAxMzYsIDE1OSwgMTUzLCAxNDEsIDEzMywgMTMzLCAxMzAsIDEyOSwgMTI2LAorICAgIDEyMCwgIDc2LCAgNTAsIDE0OSwgMTA5LCAgOTIsIDE1NSwgMTE4LCAgOTAsICA2NiwKKyAgICAxMzIsIDExNywgIDg3LCAxNTYsIDExNywgMTE5LCAxMDIsICA0NCwgIDgzLCAgOTEsCisgICAgMTA5LCAgNzMsIDEwNiwgIDg0LCAgMjksICA1NSwgMTMwLCAxMTIsICA4MSwgMjQxLAorICAgICA3NSwgIDQwLCAgOTEsICA4OSwgIDY3LCAxMTIsICA5MCwgMTQ5LCAgODEsICA3MiwKKyAgICAxMjgsICA5MCwgIDcxLCAgMjgsIDE2MCwgIDczLCAxNTcsIDEyMywgMTQzLCAxMDgsCisgICAgIDYzLCAgODgsICA3MCwgIDgxLCAgOTcsICA3NSwgMTExLCAxNDksIDExMywgIDk2LAorICAgICA3OCwgMTA0LCAgODMsIDE3OSwgIDk1LCAxMDUsIDEwNiwgIDY1LCAxMzAsICA2NiwKKyAgICAgNTEsIDExOCwgIDkyLCAgNTMsICA2OCwgMTA1LCAgNzUsIDE3NiwgMTUxLCAxMTUsCisgICAgIDk0LCAgNzUsICA2OCwgIDk1LCAyMjAsIDEwMywgMTI1LCAxMDUsICA0MywgIDk1LAorICAgICAzOSwgMTE0LCAgNjUsIDE0NSwgMTM1LCAgMzMsIDE0MiwgMTM4LCAxMDMsICA1MiwKKyAgICAgODIsICA4NSwgMTE3LCAxMTAsICA2NywgMTAyLCAgNzQsICA0MiwgIDYyLCAxMTgsCisgICAgMTQ0LCAxMjEsICA4MiwgIDU3LCAxMDIsICA2NywgIDc1LCAgNDQsIDEyOSwgIDk2LAorICAgICA3NSwgIDYzLCAgODgsICA0OCwgMTE2LCAxMzUsICA5NCwgIDg1LCAxMDIsICA2NiwKKyAgICAxMjIsICA3NywgMTA1LCAxMjIsIDE1MiwgMTIwLCAgNTYsICA5MCwgIDgzLCAxMDAsCisgICAgIDkwLCAxMjgsICA2MywgIDgwLCAxMDMsIDEyNiwgMTE3LCAxMDMsICA4MCwgMTkzLAorICAgICA0MiwgIDczLCAxMTcsICA5MywgIDkxLCAgOTUsIDEyOCwgMTAwLCAxMjgsIDE2MiwKKyAgICAgNzAsIDEyMCwgMTI2LCAgNzMsIDEyMywgIDk5LCAgOTksICA5MSwgIDc1LCAxMzUsCisgICAgIDgxLCAxMjUsIDExMSwgIDc3LCAgMTMsICA5NCwgIDc4LCAgODUsIDE4NywgMTU3LAorICAgICAxMSwgMTQzLCAxMDksICA5OSwgMTE5LCAgNTMsIDE0MSwgIDgyLCAxMjIsICA2OCwKKyAgICAxMzIsICA4OSwgMTM2LCAxMTksICA4OCwgIDc1LCAgNDksIDE3NCwgMTE5LCAgNzAsCisgICAgMTM4LCAxMjEsIDEwOCwgIDc4LCAgNTIsIDEwNCwgIDkwLCAgOTYsICA5MywgIDkzLAorICAgIDExNCwgIDkwLCAgNzgsICA0NiwgIDU4LCAgNjIsIDExNCwgIDY5LCAgNDQsIDE2MiwKKyAgICAxMDMsICA1OCwgIDk4LCAxNDEsICA4MywgMTM3LCAgOTUsIDExOSwgIDczLCAxMTEsCisgICAgIDgxLCAgNDYsIDEyNiwgMTExLCAxMjMsIDEwNywgMTE3LCAxMjIsIDEyMSwgIDU0LAorICAgIDEwNiwgMTA0LCAgNTksIDExMCwgMTQ4LCAgOTcsIDE1NSwgIDk3LCAgODMsIDEzMywKKyAgICAgOTcsICA3MSwgIDU3LCAgOTEsICA1OCwgIDUyLCAgNzksIDEyNywgMTUyLCAxMDksCisgICAgIDk2LCAgOTIsIDE0NSwgMTA3LCAxNDksIDEwMiwgIDYxLCAxMjUsICA2MSwgMTcwLAorICAgICA1NiwgIDg5LCAgNzcsIDEwNiwgIDM4LCAxNDcsICA5NiwgIDc3LCAxMDUsIDEyMywKKyAgICAgODUsICA4MywgMTE3LCAgNjMsICA2OSwgMTI2LCAxMzMsICA5MywgMTA3LCAgOTIsCisgICAgIDc3LCAxMTUsICA5NSwgMTExLCAxMDMsICA2MSwgIDg3LCAxMDMsICA5OCwgMTU1LAorICAgICA5NCwgMTExLCAgODAsICA3OCwgIDU0LCAxMTcsIDEyOCwgMTMwLCAgOTksIDEwOSwKKyAgICAxMDYsICA5OSwgMTEzLCAxMzMsIDExNSwgIDg5LCAgNjUsICA3NCwgMTEyLCAxMjcKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHdtYXZvaWNlX2RxX2xzcDE2aTNbMHgzMDBdID0geworICAgICA3MCwgMTAwLCAxMjEsIDEyOSwgMTMyLCAxMzIsIDIwMSwgMTg4LCAxNjUsIDE0NSwgMTQ0LCAxMzYsCisgICAgMTEyLCAxMjcsIDExNiwgMTI1LCAxMzAsIDEyOSwgMTI0LCAxMzUsIDEzNSwgMTQ2LCAxMjksIDEyOCwKKyAgICAxNjIsIDE1OCwgMTQ0LCAxNTEsIDEzNSwgMTI5LCAxMDMsICA4NiwgMTExLCAxMTMsIDExMiwgMTIyLAorICAgICA5MCwgMTM5LCAxMjksIDExNywgMTI2LCAxMjksIDE0MiwgMTQ1LCAxNjcsIDE0NywgMTI0LCAxMjQsCisgICAgMjMwLCAyMDksIDE4OSwgMTc1LCAxNTYsIDE0MSwgIDY0LCAgODAsICA4NiwgMTA4LCAxMjEsIDEyOSwKKyAgICAgNDQsICA3OSwgMTE1LCAxMTMsIDExNSwgMTI4LCAxMzMsIDEwNiwgIDc5LCAxMDksIDEyNSwgMTI3LAorICAgIDE3MSwgMTU2LCAxMzIsIDEwOSwgMTAzLCAxMTUsIDEwNiwgIDcwLCAgOTMsIDE0NSwgMTQxLCAxMjgsCisgICAgMTQ4LCAxMjUsIDEyMiwgMTA3LCAxMTAsIDExNywgMTQ2LCAxNDUsIDEyOCwgMTEwLCAgOTgsIDExMSwKKyAgICAyMzcsIDIxMiwgMTg1LCAxNTYsIDEzOSwgMTMzLCAgODQsICA1NSwgIDI2LCAgNzcsIDExNCwgMTI3LAorICAgIDE3MiwgMTcwLCAxNzEsIDE2OCwgMTYyLCAxNDMsICA4MiwgIDgyLCAgNzYsICA3MCwgMTA0LCAxMjYsCisgICAgIDE3LCAgOTUsIDEwOSwgMTExLCAxMjAsIDEzMiwgIDgxLCAgNzQsICA1NywgMTI2LCAxNDEsIDEzMSwKKyAgICAxMTAsIDEyNywgMTYyLCAxNDgsIDEyOSwgMTIzLCAxNzcsIDE3MiwgMTU1LCAxNTEsIDE0NSwgMTM0LAorICAgIDE0NCwgMTIzLCAgOTAsICA2NiwgMTA5LCAxMzAsICA4MiwgMTI3LCAxMDMsIDEyMywgMTMyLCAxMzEsCisgICAgMTI3LCAgOTcsICA5NywgMTQyLCAxNDAsIDEyOCwgMTU5LCAxMzQsIDEzNiwgMTIzLCAxMTMsIDExNywKKyAgICAxMzEsIDE0MCwgMTU0LCAxNjksIDE1OCwgMTM0LCAgOTYsIDEwOSwgMTUwLCAxMjIsIDEwNSwgMTIwLAorICAgIDEyMCwgMTUwLCAxNTIsIDEyMiwgMTE5LCAxMjUsIDEyMywgMTI2LCAxMjQsIDEwNywgMTAwLCAxMTMsCisgICAgMjQ4LCAyMzMsIDIxNiwgMTg5LCAxNjAsIDE0MiwgIDU4LCAgMjQsICAxMywgIDc3LCAxMTEsIDEyNywKKyAgICAxODMsIDE4OSwgMTgyLCAxNTcsIDE0MCwgMTMxLCAgOTYsICA4MywgIDU5LCAgNDMsICA3MywgMTE5LAorICAgIDIyMiwgMTk2LCAxNzEsIDE0NiwgMTI5LCAxMjgsICAzMiwgIDEzLCAgNTMsIDEwMSwgMTE0LCAxMjcsCisgICAgMTE5LCAxMDEsICA3MCwgIDcwLCAxMTAsIDEyNywgIDc3LCAgODYsIDE2MSwgMTQ4LCAxMzAsIDExOCwKKyAgICAxOTksIDE4MywgMTcwLCAxNjcsIDE1NiwgMTQxLCAgMzAsIDExNSwgMTQyLCAxMzMsIDEzMSwgMTMwLAorICAgIDEwMSwgMTAzLCAxODEsIDE3NiwgMTUyLCAxMjYsICA2NiwgIDQ0LCAgNzMsICA5NCwgMTExLCAxMjgsCisgICAgMTUwLCAxMjIsIDEwMCwgMTAxLCAxMDQsIDExOCwgIDYxLCAxMTAsICA4NywgIDc2LCAgOTMsIDEyNSwKKyAgICAxOTAsIDE3MCwgMTUwLCAxMzQsIDEzNSwgMTI5LCAxMTIsICA4OSwgIDYzLCAxMjMsIDE0MSwgMTMyLAorICAgIDE3NSwgMTU0LCAxMzYsIDE0MiwgMTQwLCAxMzIsIDExNywgMTQzLCAxMjksIDEyOCwgMTM2LCAxMzIsCisgICAgMTY4LCAxNDIsIDExMiwgMTEzLCAxMjgsIDEyOCwgMTU1LCAxNjksIDE1OSwgMTQ0LCAxMzksIDEzMSwKKyAgICAgNjEsIDEzNiwgMTQ0LCAxMjQsIDExMiwgMTIzLCAgODYsICA4MSwgMTA0LCAxMjEsIDEyOSwgMTMwLAorICAgIDE2MCwgMTI3LCAxMTgsIDE1MCwgMTUxLCAxMzQsIDEyNiwgMTE1LCAxMjEsIDEzMiwgMTM0LCAxMzEsCisgICAgMTM3LCAxNDgsIDE0NCwgMTM5LCAxNDAsIDEzNCwgMTA2LCAxMDIsIDEwNSwgIDkwLCAgODcsIDExMywKKyAgICAxMzQsIDEyOSwgMTI4LCAxMjEsIDEyMSwgMTIzLCAxNTMsIDE1MSwgMTI5LCAxMzksIDE0MiwgMTM0LAorICAgIDE1MCwgMTQyLCAxNDEsIDE0OCwgMTQ5LCAxNDEsIDEwMCwgMTIxLCAxMzMsIDE0NywgMTUwLCAxMzQsCisgICAgMTYzLCAxNTgsIDE0NywgMTMyLCAxNDEsIDEzMiwgMTQyLCAxMjcsIDE0MSwgMTM2LCAxMzYsIDEzMiwKKyAgICAyMzIsIDIxOCwgMjA1LCAxODksIDE2OSwgMTQ2LCAyNDMsIDIyNCwgMjAxLCAxNzEsIDE0NywgMTM4LAorICAgIDIyNCwgMTk2LCAxNjksIDE2MiwgMTU0LCAxNDAsICA1MSwgIDIwLCAgNTksIDExMSwgMTIxLCAxMjgsCisgICAgMjAzLCAxOTcsIDE5MywgMTc3LCAxNjIsIDE0NSwgIDc1LCAgNDAsICA0NywgMTIyLCAxMzAsIDEyOSwKKyAgICAxMDIsICA3NywgIDQ3LCAgODMsIDEyMSwgMTI5LCAxMTEsIDEwOCwgIDg0LCAgNTYsICA2MywgMTE0LAorICAgIDIxMSwgMTgxLCAxNTQsIDEzNywgMTI2LCAxMjUsIDIxMywgMTk4LCAxODYsIDE2MiwgMTQ0LCAxMzgsCisgICAgIDQxLCAgNDUsICA5MCwgMTEwLCAxMTgsIDEzMCwgIDgzLCAgNjMsIDEzMCwgMTY0LCAxNTMsIDEyOCwKKyAgICAxOTUsIDE2NywgMTQyLCAxMjMsIDExMywgMTE5LCAgMTksICA0MiwgMTA1LCAxMTMsIDEyMCwgMTMyLAorICAgICA1MCwgIDYzLCAgNDksICA2NCwgMTEyLCAxMjgsIDExNCwgIDkwLCAxMzIsIDE3MSwgMTYyLCAxMzQsCisgICAgMTI5LCAxMjgsIDEwNywgIDgzLCAgNzQsIDExMCwgIDUwLCAxMTYsIDEwOSwgMTIwLCAxMjgsIDEzMiwKKyAgICAgOTQsICA1OSwgIDczLCAxMTEsIDExNywgMTI2LCAxOTcsIDE3MCwgMTY2LCAxNTMsIDEzOCwgMTMyLAorICAgICA2NSwgIDQ4LCAxMDksIDEzMywgMTMxLCAxMjgsIDE3MCwgMTYzLCAxNzIsIDE1OCwgMTM4LCAxMzAsCisgICAgIDY2LCAxMjYsIDE0NywgMTYwLCAxNTEsIDEzMiwgIDQyLCAxMjksIDExNywgIDk1LCAgOTEsIDEyMCwKKyAgICAgOTcsIDE2NSwgMTY0LCAxNDIsIDEzMywgMTI1LCAxNjMsIDE0MiwgMTE0LCAgODgsICA5NywgMTIyLAorICAgIDEwNCwgIDc3LCAxNDIsIDE0MywgMTI4LCAxMjAsIDEzNiwgMTYwLCAxODgsIDE2OSwgMTQ5LCAxMzAsCisgICAgMTEzLCAgODMsICA4NSwgMTAyLCAxMTQsIDEyNSwgMTY0LCAxNjksIDE0MiwgMTIwLCAxMjIsIDEyNCwKKyAgICAgOTgsIDE1MiwgMTMyLCAxMDUsICA5MiwgMTE3LCAgNDIsICA3MSwgMTI1LCAxNTUsIDE1MSwgMTM3LAorICAgICA5NCwgMTA1LCAgODEsIDEwNywgMTE4LCAxMjYsICA4NCwgIDU2LCAxMjMsIDExNywgMTA4LCAxMjIsCisgICAgMTc0LCAxNzksIDE2NiwgMTM3LCAxMTgsIDEyMSwgMTMwLCAxMDMsIDE0NywgMTUyLCAxMzQsIDEyNCwKKyAgICAxNDgsIDEyNywgIDk0LCAxMTcsIDE0NCwgMTM0LCAxMjksIDEwNiwgMTAyLCAgOTUsIDEwNiwgMTE4LAorICAgIDE0NywgMTU3LCAxNTMsIDEyNSwgMTAzLCAxMTcsIDE1NSwgMTI4LCAxMTMsIDEzMiwgMTIwLCAxMjIsCisgICAgMTgxLCAxNTEsIDEzNiwgMTI2LCAxMjIsIDEyMiwgMTEwLCAxMTEsIDEwOSwgMTA4LCAxMjAsIDEyNCwKKyAgICAgOTcsIDEzMCwgMTAzLCAgODksIDEwNywgMTI0LCAxNzksIDE1OCwgMTU4LCAxNDIsIDEzMSwgMTI4LAorICAgIDE0MiwgMTExLCAxMTUsIDEyMiwgMTI2LCAxMjUsIDE0NSwgMTQ1LCAxMzQsIDExNSwgMTI5LCAxMjgsCisgICAgMTMwLCAxMzksIDExMiwgIDk5LCAxMjEsIDEyNSwgIDc5LCAxMDQsIDExOSwgMTAyLCAxMDUsIDEyMywKKyAgICAxMTYsIDEyMSwgMTM2LCAxMjUsIDEyNiwgMTI3LCAxMjQsIDEwMCwgMTIyLCAxMTksIDExMSwgMTE5LAorICAgIDE1OSwgMTQwLCAxMzksIDEyOCwgMTM4LCAxMzEsIDEwNSwgMTAwLCAxMTYsIDEyOCwgMTM1LCAxMzIsCisgICAgMTU5LCAxNDIsIDE1NiwgMTQ3LCAxNDAsIDEzNCwgMTMwLCAxNTAsIDEyOSwgMTI2LCAxMTQsIDEyMCwKKyAgICAxMzgsIDEyNCwgMTQ2LCAxMzEsIDEwOSwgMTE5LCAgOTMsIDExNSwgMTI1LCAxMzEsIDEyNSwgMTI5LAorICAgIDEyNSwgMTIxLCAxMDEsIDExOSwgMTE0LCAxMjAsIDE2MywgMTU0LCAxNTEsIDE1MywgMTUzLCAxMzksCisgICAgMTY2LCAxNTMsIDE1MCwgMTMzLCAxMTksIDEyMSwgMTU5LCAxNTEsIDEyOCwgMTMwLCAxMjIsIDEyMywKKyAgICAxNDcsIDE1NCwgMTQ0LCAxMzMsIDEyOCwgMTI3LCAxMjksIDEzMSwgMTM0LCAxNDAsIDE0OCwgMTM4LAorICAgIDEzOCwgMTM2LCAxMjAsIDEzMSwgMTM1LCAxMzEsIDE1MCwgMTQwLCAxMzcsIDE0NCwgMTI5LCAxMjkKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHdtYXZvaWNlX2RxX2xzcDEwclsweDE0MDBdID0geworICAgIDEyOCwgMTI4LCAxMjksIDEyOSwgMTMwLCAxMzAsIDEzMSwgMTMwLCAxMjksIDEyOSwKKyAgICAxMzQsIDEzMywgMTI3LCAxMjUsIDEzNiwgMTM1LCAxMzUsIDEzNCwgMTczLCAxNzIsCisgICAgMTMzLCAxMzksIDEzNiwgMTY1LCAxMzMsIDE3NiwgMTM3LCAxNTksIDEzNSwgMTUyLAorICAgIDE0NywgMTYxLCAxNDcsIDE1MiwgMTQ5LCAxNTYsIDE0NiwgMTQ2LCAxNDAsIDEzNiwKKyAgICAxMzQsIDEzNSwgMTM2LCAxNDAsIDEzOSwgMTU1LCAxMjMsIDEzMywgMTMyLCAxNDIsCisgICAgMTMyLCAxNDgsIDE0MywgMTc3LCAxMjQsIDE0MywgMTIzLCAxMzYsIDEyNiwgMTM0LAorICAgIDEyNiwgMTI1LCAxMjUsIDEyNCwgMTI5LCAxMjgsIDEyMywgMTIzLCAxMzMsIDEzMywKKyAgICAxMTYsIDExNiwgMTIxLCAxMjEsIDEyMSwgMTIwLCAxMjksIDEyOCwgMTMxLCAxMzEsCisgICAgMTMyLCAxMzMsIDEzMiwgMTI5LCAxMzgsIDEyNCwgMTM4LCAxMjQsIDEzMiwgMTAwLAorICAgIDEzNSwgIDk0LCAxNDksIDExMSwgMTUyLCAxMTUsIDE1MCwgMTI4LCAxNDEsIDEzMywKKyAgICAxMjksIDEyOSwgMTMwLCAxMjksIDE0NywgMTQ1LCAxMzYsIDEzNywgMTIwLCAxMjIsCisgICAgMTIwLCAxMjIsIDEyNywgMTI5LCAxMDQsIDEwOCwgMTEzLCAxMTUsIDEyNCwgMTI0LAorICAgIDE0MCwgMTM5LCAxNDcsIDE0NSwgMTMyLCAxMzAsIDE4NCwgMTc3LCAyMDEsIDE5NiwKKyAgICAxNzAsIDE3MSwgMTYwLCAxNjEsIDE0NSwgMTQ3LCAxMzcsIDE0NSwgMTMxLCAxMzEsCisgICAgMTMwLCAxMzAsIDEzMCwgMTMwLCAxMzAsIDEzMCwgMTMyLCAxMzQsIDEzMSwgMTMyLAorICAgIDEzMSwgMTMzLCAxNDEsIDE0NCwgMTQyLCAxNDksICA4NCwgIDkzLCAxMDMsIDEwNCwKKyAgICAxMzksIDEzOSwgMTQyLCAxNDAsIDE0NywgMTQ3LCAxNzIsIDE2NSwgMTIyLCAxMjEsCisgICAgIDk4LCAxMDAsIDEwMSwgMTA2LCAxMTIsIDExNywgMTIyLCAxMjQsIDEyNCwgMTI0LAorICAgIDEzNCwgMTMzLCAxMzMsIDEzMywgMTQ2LCAxNDIsIDE0NywgMTQ1LCAxNTYsIDE1NiwKKyAgICAxNDMsIDE0NiwgMTE5LCAxMjQsIDEyOSwgMTMyLCAxNTEsIDE0OSwgMTM2LCAxMzUsCisgICAgMTQ3LCAxNDgsIDE4MSwgMTgwLCAxOTksIDE4OCwgMTkwLCAxNzMsIDE2NiwgMTYxLAorICAgIDE0NywgMTQyLCAxNTMsIDE0OSwgMTU0LCAxNDYsIDE1MCwgMTQ2LCAxMzgsIDEzNCwKKyAgICAxMzEsIDEzNSwgIDk2LCAxMzYsICA0OCwgMTM4LCAgNTYsIDEzMSwgIDYzLCAxMjQsCisgICAgIDg1LCAxMjgsIDEwMywgMTMyLCAxMTcsIDEzNCwgMTIwLCAxMzIsIDEyNSwgMTI5LAorICAgIDEzMSwgMTMwLCAxMjksIDEyOCwgMTI5LCAxMjgsIDE2MywgMTY4LCAxMTcsIDEyMCwKKyAgICAxMjEsIDEyMSwgMTM2LCAxMzgsIDEzMSwgMTMyLCAxMzUsIDEzNiwgMTMxLCAxMzMsCisgICAgMTMzLCAxMzMsIDEzMywgMTM0LCAxMTcsIDExOCwgMTA1LCAxMDksIDE0MiwgMTUxLAorICAgIDE0NCwgMTU5LCAxMzEsIDEzOCwgMTIxLCAxMjYsIDEyMywgMTIzLCAxMjEsIDEyNCwKKyAgICAxMzEsIDEzMSwgMTI5LCAxMjksIDE0MSwgMTQwLCAxNDIsIDEzNCwgIDg3LCAgOTAsCisgICAgMTA5LCAxMDksIDEzMCwgMTI3LCAxMzksIDE0MywgMTMzLCAxMzEsIDEyNywgMTI2LAorICAgIDEzNCwgMTM1LCAxMzQsIDEzNiwgIDk3LCAgOTgsIDEzMCwgMTMyLCAxMzQsIDEzNywKKyAgICAxMTUsIDExOSwgMTI1LCAxMzAsIDEwNywgMTA5LCAxMTksIDExOCwgMTI2LCAxMjcsCisgICAgMTM0LCAxMzUsIDEyNywgMTMyLCAxNzIsIDIwMywgMTYwLCAxOTYsIDE1MiwgMTc5LAorICAgIDE1MiwgMTcyLCAxNDgsIDE2OCwgMTUzLCAxNzIsIDE0NSwgMTU2LCAxMzcsIDE0MCwKKyAgICAxMDIsIDExNiwgIDQyLCAgNTYsICA3NCwgIDYxLCAgODIsICA3MCwgIDg2LCAgNzgsCisgICAgMTAxLCAgOTcsIDEwNCwgMTAwLCAxMTUsIDEwOCwgMTE2LCAxMDgsIDEyMywgMTE4LAorICAgIDE0OSwgMTQzLCAxNjYsIDEyOSwgMTY4LCAgOTYsIDE0MiwgIDk1LCAxMzUsICA5OCwKKyAgICAxMTcsICA4NiwgMTE2LCAgOTMsIDEyMSwgMTA4LCAxMTksIDEwNywgMTIxLCAxMTcsCisgICAgMTM1LCAxMzUsIDEyNywgMTM4LCAgNzIsIDEzMiwgIDk5LCAxMzYsIDExMiwgMTQ3LAorICAgIDEyMCwgMTUyLCAxMzYsIDE1NSwgMTM4LCAxNDYsIDE0MCwgMTQyLCAxMzQsIDEzOSwKKyAgICAxNjMsIDE0NSwgMTkyLCAxMzAsIDE0NywgMTI0LCAxNDcsIDEyNSwgMTMzLCAxMjUsCisgICAgMTI3LCAxMjQsIDEyOCwgMTIzLCAxMjksIDEyMiwgMTMwLCAxMjIsIDEzMCwgMTI1LAorICAgIDEzMCwgMTM3LCAxMzUsIDE4MCwgMTI0LCAxMzMsIDEzMCwgMTI5LCAxMzIsIDEzMywKKyAgICAxMjQsIDEyNCwgMTMxLCAxMzAsIDEzMiwgMTM2LCAxMjYsIDEyNCwgMTI3LCAxMjUsCisgICAgMTMyLCAxMzIsIDEzMywgMTMzLCAxNDQsIDE0MCwgMTQzLCAxNDIsIDEzNywgMTM1LAorICAgIDE0MywgMTM4LCAxNTIsIDE0OSwgMjIxLCAyMTksIDE1OCwgMTYxLCAxNDMsIDE0MSwKKyAgICAxMzAsIDEyOSwgMTQwLCAxMzUsIDE3MCwgMTQ1LCAxOTMsIDE1NiwgMTg2LCAxNTIsCisgICAgMTY3LCAxMzksIDE1MSwgMTMxLCAxNDIsIDEyNywgMTM0LCAxMjAsIDEzMSwgMTI1LAorICAgIDEzNSwgMTMzLCAxNDEsIDEyNSwgMTk5LCAxMDksIDEzNywgMTI2LCAxMzQsIDEyMywKKyAgICAxMzAsIDEyOSwgMTMyLCAxMjMsIDEyOCwgMTI1LCAxMjIsIDEyNiwgMTI1LCAxMjUsCisgICAgMTMwLCAxMjgsICA5MSwgIDg5LCAxMzgsIDEzNSwgMTM5LCAxMzQsIDEzMywgMTI5LAorICAgIDEzMiwgMTMwLCAxMjUsIDEyOCwgMTM2LCAxMzUsIDEyOSwgMTI3LCAxMjYsIDEyNiwKKyAgICAxMzIsIDEzMSwgMTMzLCAxMzEsIDEyOCwgMTIwLCAxMzIsIDEyNiwgMTI2LCAxMTksCisgICAgMTM0LCAxMzAsIDEzMSwgMTIzLCAxMDQsICA5NSwgMTQwLCAxNDEsIDEzNiwgMTM3LAorICAgIDEzMywgMTMzLCAxMzMsIDEzNCwgMTE3LCAgOTgsICA3NCwgIDQ5LCAxMTIsIDExMSwKKyAgICAxMjMsIDEyMiwgMTI2LCAxMjcsIDEzMSwgMTMxLCAxMjcsIDEyNiwgMTI4LCAxMjksCisgICAgMTMwLCAxMzEsIDEyNCwgMTI3LCAxMDEsIDEwNywgMTA4LCAxMDksIDExNSwgMTE1LAorICAgIDEwMCwgIDk5LCAxMzAsIDEyOCwgMTM0LCAxMzYsIDEyNSwgMTI3LCAxMjgsIDEzMCwKKyAgICAxMzYsIDEzNywgMTQ1LCAxNTAsIDE0OSwgMTY0LCAxMzYsIDE1MSwgMTE0LCAxMTEsCisgICAgMTI0LCAxMjUsIDE0MywgMTUwLCAxNjIsIDE3NCwgMTU4LCAxNjksIDEzNiwgMTM3LAorICAgIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMyLCAxMzMsIDExMSwgMTEwLCAxMjIsIDEyMSwKKyAgICAxMzYsIDEzNiwgMTM0LCAxMzMsIDEzMSwgMTMyLCAxMjcsIDEyNywgMTI1LCAxMjUsCisgICAgMTI4LCAxMjksIDEyOSwgMTMwLCAxMjUsIDEyNywgMTQwLCAxNDAsIDE0OCwgMTQ5LAorICAgIDEzMywgMTM2LCAxNDYsIDE1MywgMTEwLCAxMTgsIDEyNywgMTI5LCAxMjgsIDEyOSwKKyAgICAxMzEsIDEzMywgMTI3LCAxMzEsIDE0MCwgMTYxLCAxNjcsIDIyNCwgMTMxLCAxMzksCisgICAgMTM2LCAxNDMsIDEzNSwgMTM5LCAxMzgsIDE0MywgMTQ5LCAxNTUsIDE0MSwgMTQzLAorICAgIDEzNCwgMTMyLCAxMjAsIDExMSwgIDgzLCAgODMsIDEyMSwgMTI2LCAxMDIsIDEwNywKKyAgICAxMTIsIDExNSwgIDk3LCAxMDQsIDEyMCwgMTE1LCAxMjksIDEyMywgMTIyLCAxMjIsCisgICAgMTM0LCAxMzUsIDEyMiwgMTMxLCAxMDIsIDEyNCwgMTE0LCAxMTksICA5MywgMTAzLAorICAgICA3OCwgIDc5LCAgNjcsICA3MiwgIDY2LCAgNzMsICA3OCwgIDgyLCAxMDMsIDEwMiwKKyAgICAxNDQsIDEzNSwgMTY1LCAxMzksIDE2NSwgMTI5LCAxNjAsIDEyNiwgMTUzLCAxMjcsCisgICAgMTYxLCAxMzQsIDE2MCwgMTQyLCAxNjAsIDE0MywgMTQ4LCAxNDAsIDEzOCwgMTM1LAorICAgIDEzOCwgIDk1LCAxNDcsICA1NCwgMTQzLCAgNzgsIDE0MCwgMTEyLCAxNDIsIDExMywKKyAgICAxNDAsIDEyMSwgMTM1LCAxMTcsIDEzNSwgMTIyLCAxMzYsIDEzMSwgMTMxLCAxMzIsCisgICAgMTQ3LCAxNTksIDE0MCwgMTU2LCAxMjcsICA4MSwgMTQyLCAxMjgsIDE0NiwgMTI3LAorICAgIDE0NCwgMTI1LCAxNDYsIDEyOCwgMTQ5LCAxMzAsIDE0NCwgMTM1LCAxMzMsIDEyOCwKKyAgICAxMzAsIDEzMSwgMTMxLCAxMzEsIDEzNCwgMTM5LCAxMjYsIDEzNCwgMTQxLCAxNTQsCisgICAgMTY4LCAyMDUsIDE1MywgMTc2LCAxNDgsIDE2MywgMTQ3LCAxNTgsIDE0MSwgMTQzLAorICAgIDEzMSwgMTM1LCAxMjYsIDE0NiwgMTA4LCAxNTcsIDEwNywgMTU2LCAxMTksIDE0NiwKKyAgICAxMDAsIDEzOCwgMTA0LCAxMjUsIDExOSwgMTM0LCAxMDEsIDEyMiwgMTEzLCAxMjIsCisgICAgIDk1LCAxMzMsICA1MiwgMTQwLCAgODMsIDEzNiwgMTEwLCAxMzMsIDExNCwgMTMxLAorICAgIDEyMywgMTMxLCAxMzMsIDEzMSwgMTM4LCAxMzUsIDEzMiwgMTMyLCAxMjcsIDEyNywKKyAgICAxMjksIDEyOCwgMTI0LCAxMjIsIDEyOCwgMTI2LCAxNDUsIDE3MCwgMTQzLCAxNzIsCisgICAgMTQxLCAxNjMsIDE0MywgMTc2LCAxMzgsIDE2NCwgMTM5LCAxNTUsIDEzNSwgMTQ1LAorICAgIDEzNSwgMTM2LCAxMzYsIDEyNywgMTMyLCAgNzYsIDEyOCwgIDc2LCAxMjcsICA2MywKKyAgICAxMjUsICA2NiwgMTIzLCAgNjcsIDEyMCwgIDcxLCAxMjQsICA5MiwgMTIyLCAxMTEsCisgICAgMTMzLCAxMzMsIDEzNSwgMTM2LCAxMzksIDE0MCwgMTQ3LCAxNDcsIDE1MCwgMTQ0LAorICAgIDE1NiwgMTQ3LCAxNTAsIDE0NSwgMTU0LCAxNDYsIDEyMCwgMTIzLCAxMjMsIDEyNCwKKyAgICAxMzcsIDEzMywgMTcwLCAxNDEsIDEyNCwgMTI0LCAxMzUsIDEzNCwgMTM0LCAxMzUsCisgICAgMTMyLCAxMzIsIDEyOSwgMTI5LCAxMzAsIDEzMCwgMTM2LCAxMzYsIDEzMCwgMTMyLAorICAgIDE0NywgMTU5LCAxMzUsIDE1OCwgMTE1LCAxNDYsIDEyMCwgMTQ4LCAxMTcsIDEzNiwKKyAgICAxMTUsIDEzNywgMTEzLCAxMzIsIDEzMywgMTQyLCAxNDAsIDE0NCwgMTMyLCAxMzQsCisgICAgMTM0LCAxMzUsIDEzNCwgMTM3LCAxMzcsIDE0NywgMTYyLCAxNzgsIDEzNiwgMTQ3LAorICAgIDEzNCwgMTQ0LCAxMjMsIDEzMiwgMTExLCAxMTMsIDExMywgMTEzLCAxMjQsIDEyNCwKKyAgICAxMzIsIDEzMSwgMTI2LCAxMjYsIDExNywgMTE0LCAxMDAsICA5NSwgMTMwLCAxMjUsCisgICAgMTU3LCAxNDUsIDE2NCwgMTU2LCAxNjMsIDE1OCwgMTQ1LCAxNDUsIDEzMywgMTM0LAorICAgIDEzNCwgMTM0LCAxMjcsIDEyNiwgMTEzLCAxMDIsIDEzNiwgMTMwLCAxMjQsIDEyMiwKKyAgICAxNDMsIDE0NSwgMTI3LCAxMzEsIDEzNSwgMTQzLCAxMzMsIDEzNywgMTMyLCAxMzIsCisgICAgIDkyLCAgOTQsIDEyMiwgMTI1LCAxMjgsIDEyOSwgMTMxLCAxMzAsIDEzNCwgMTM1LAorICAgIDEzMiwgMTI4LCAxMjksIDEyNywgMTMyLCAxMzIsIDEzMSwgMTI5LCAxMjcsIDEyNywKKyAgICAxMjksIDEyOSwgMTMyLCAxMzEsIDEzOSwgMTMxLCAxMzcsIDEzMiwgMjE2LCAxNzgsCisgICAgMTQ2LCAxMzQsIDE0NywgMTM3LCAxNTEsIDE0MiwgMTQ4LCAxMzksIDE0NCwgMTM4LAorICAgIDEyOCwgMTI3LCAxMjksIDEyOSwgMTIzLCAxMzEsICA3MSwgIDkxLCAxMjYsIDEyOCwKKyAgICAxMzAsIDEzNCwgMTE3LCAxMjMsIDEyNSwgMTI1LCAxMzUsIDE0MCwgMTI5LCAxMzIsCisgICAgMTMyLCAxMzIsIDEzMywgMTM0LCAxMjQsIDEzMCwgMTI3LCAxMzMsIDEzMywgMTM4LAorICAgIDE0MiwgMTQ5LCAxMzUsIDE0MSwgMTQ1LCAxNDksIDE1NCwgMTY0LCAxMzUsIDEzOCwKKyAgICAxMzUsIDEzNSwgMTQxLCAxNDIsIDEzOCwgMTM3LCAxMTYsICA5NiwgMTA1LCAgODYsCisgICAgMTI3LCAxMTgsIDEyOCwgMTIwLCAxMjQsIDExNywgMTI1LCAxMTcsIDEyNSwgMTIxLAorICAgIDEzMSwgMTMxLCAxMzIsIDEzNCwgMTQ0LCAxNDUsIDExMiwgMTEyLCAxMjEsIDEyMywKKyAgICAxMTMsIDExNiwgMTIxLCAxMjMsIDEzOSwgMTM4LCAxMjgsIDEyOCwgMTMxLCAxMzEsCisgICAgMTM0LCAxMzIsIDEzMiwgMTMyLCAxMjUsIDEyOCwgMTI3LCAxMzAsIDEyNSwgMTMxLAorICAgIDEyMCwgMTI4LCAgOTAsIDExOSwgIDY4LCAgOTgsICA5OSwgMTEyLCAxMTUsIDEyNCwKKyAgICAxMzUsIDEzNSwgMTM0LCAxMzQsIDEyOCwgMTI5LCAxMzcsIDEzNywgMTM3LCAxMzgsCisgICAgMTEwLCAxMTQsIDEyOSwgMTMwLCAxNDQsIDE0NSwgMTIzLCAxMjUsIDEyOSwgMTI5LAorICAgIDEzMiwgMTMzLCAxMjksIDEzMCwgMTY4LCAxODcsIDE0MCwgMTQ5LCAxMzcsIDE0NCwKKyAgICAxMjksIDEzMCwgMTI5LCAxMzQsIDEzMywgMTM4LCAxMTgsIDExOCwgMTIyLCAxMjAsCisgICAgMTMxLCAxMzAsIDEyOSwgMTI4LCAxMzMsIDEzMywgMTI1LCAxMjUsIDEyNCwgMTIzLAorICAgIDE4MSwgMTc5LCAxMjksIDEyOSwgMTMxLCAxMjcsIDEzOSwgMTM2LCAxMzAsIDEyOCwKKyAgICAxMzMsIDEzMywgMTMyLCAxMzIsIDEyMSwgMTIwLCAxMjIsIDExOSwgMTMyLCAxMjksCisgICAgMTI5LCAxMjUsIDEwNywgIDk2LCAxMzYsIDEzNywgMTUwLCAxNDYsIDEzNSwgMTM0LAorICAgIDEzMSwgMTMxLCAxMzAsIDEzMCwgMTI2LCAxMjMsIDEyNiwgMTIzLCAxMjgsIDEyNSwKKyAgICAxMzAsIDEyMywgMTM0LCAxMjcsIDE4MywgMTU5LCAxNDMsIDEzNSwgMTM3LCAxMzQsCisgICAgMTI5LCAxMjksIDEyOCwgMTI4LCAxMzQsIDEzMywgMTM5LCAxMzgsIDEzMywgMTMyLAorICAgIDEyOSwgMTI3LCAxNTQsIDE1MSwgMTUwLCAxNDQsIDE0NiwgMTQ2LCAxNDEsIDE0MiwKKyAgICAxMzIsIDEzMiwgMTMxLCAxMzEsIDEzMCwgMTMwLCAxMzIsIDEzMywgMTE0LCAxMTUsCisgICAgMTMyLCAxMzIsIDEyMiwgMTIyLCAxMzIsIDEzMSwgMTE1LCAxMTcsIDEyMCwgMTIwLAorICAgIDEyOSwgMTI5LCAxMzAsIDEzMCwgMTMwLCAxMjksIDEzMCwgMTMxLCAxMjksIDEzMSwKKyAgICAxMzAsIDEzMCwgMTI5LCAxMjksIDEzMywgMTMyLCAxNDMsIDE0NCwgIDkxLCAgOTEsCisgICAgMTM3LCAxMzYsIDExOCwgMTA3LCAgNjAsICA0NSwgIDU2LCAgNDksICA1NywgIDUyLAorICAgICA2MCwgIDU2LCAgNzEsICA3NSwgIDc3LCAgODAsICA5MiwgIDk3LCAxMDYsIDEwNiwKKyAgICAxMTIsIDEzMSwgIDU4LCAxMjEsICAxOSwgIDY1LCAgODQsIDEwMSwgMTA4LCAxMjIsCisgICAgMTIxLCAxMjcsIDExMiwgMTE3LCAxMDYsIDExMiwgMTE3LCAxMjQsIDEyNiwgMTI3LAorICAgIDEzMCwgMTI5LCAxMzgsIDEzMywgMTY2LCAxNTUsIDE5MiwgMTc5LCAxOTIsIDE3NywKKyAgICAyMDgsIDE5MSwgMjA0LCAxOTIsIDE4NiwgMTc5LCAxNjMsIDE2MywgMTM4LCAxNDIsCisgICAgMTM0LCAxMzQsIDE0NCwgMTQyLCAyNDMsIDIzNiwgMTQ4LCAxNDYsIDE0MSwgMTM3LAorICAgIDE0NSwgMTQxLCAxNTEsIDE0NCwgMTQ3LCAxNDMsIDEzNSwgMTM5LCAxMzQsIDEzMywKKyAgICAxMzQsIDEyOCwgMTM4LCAgODgsIDE0MiwgIDEwLCAxMjcsICA3NiwgMTMwLCAgOTYsCisgICAgMTI5LCAxMDIsIDEyOCwgMTA4LCAxMjMsIDExMSwgMTI3LCAxMTksIDEyNywgMTI0LAorICAgIDEzNiwgMTM2LCAxMzksIDEzOSwgMTQyLCAxNDAsIDI0NiwgMjQxLCAxNTgsIDE2NywKKyAgICAxNDMsIDE0NSwgMTQ2LCAxNDksIDE0MywgMTQ1LCAxNDgsIDE1MiwgMTMzLCAxMzQsCisgICAgMTM5LCAxMzUsIDEzNSwgMTM2LCAgOTksIDEzNywgIDk1LCAxMzMsICA3NSwgMTM4LAorICAgICA2NywgMTM1LCAgNzMsIDEyOCwgIDgzLCAxMzIsICA5NiwgMTI2LCAxMTUsIDEyNywKKyAgICAxMzAsIDEzMiwgMTM3LCAxMzYsIDE0MCwgMTM1LCAxMzQsIDEzMCwgMTM3LCAxMzEsCisgICAgMTU5LCAxNTEsIDIxNSwgMTk3LCAxODEsIDE3MCwgMTYwLCAxNDksIDE1MCwgMTQzLAorICAgIDE0NSwgMTQ4LCAxODYsIDIwNywgMTQxLCAxNDcsIDEzNSwgMTM3LCAxMjIsIDEyMiwKKyAgICAxMjYsIDEyNSwgMTI4LCAxMjYsIDEyNywgMTI3LCAxMzQsIDEyNiwgMTMxLCAxMjMsCisgICAgMTMzLCAxMzMsIDEyNiwgMTIyLCAxMjgsIDEyMiwgIDk5LCAgOTMsICA1OSwgIDYwLAorICAgICA4MiwgIDgyLCAxMDYsIDEwNywgMTE5LCAxMjMsIDEyNCwgMTI4LCAxMjgsIDEyOSwKKyAgICAxMzQsIDEzNywgMTMzLCAxMzksIDEzMywgMTM2LCAxNDEsIDEzMiwgMTM5LCAxMjIsCisgICAgMTQyLCAgOTcsIDEzMCwgIDgxLCAxMjgsICA4OSwgMTI5LCAxMDEsIDEyNSwgMTEyLAorICAgIDEzNywgMTQwLCAxMjksIDE0OCwgMTAxLCAxNTksIDExOCwgMTgwLCAxMjIsIDE3OCwKKyAgICAxMjAsIDE3OCwgMTE2LCAxNjgsIDExOCwgMTUzLCAxMjcsIDE1MSwgMTI2LCAxMzYsCisgICAgMTMyLCAxMzQsIDEyNSwgMTI2LCAxMTgsIDEwNSwgMTU2LCAxMjQsIDE4MCwgMTMyLAorICAgIDE2MywgMTI0LCAxNDgsIDEyMSwgMTMxLCAxMTIsIDEyNywgMTE1LCAxMjUsIDEyMiwKKyAgICAxMjksIDEzMSwgMTI4LCAxMjksIDEzNiwgMTM0LCAxNDIsIDE0MSwgMTY1LCAxNTgsCisgICAgMjAzLCAxODIsIDE0MSwgMTM2LCAxMzIsIDEzMCwgMTM1LCAxMzUsIDEzMCwgMTMwLAorICAgIDEzMywgMTMzLCAxMzIsIDEzMiwgMTI3LCAxMjYsIDEwNiwgMTA1LCAxMTIsIDExMCwKKyAgICAxMDYsIDEwNSwgIDgwLCAgODQsIDEwMCwgMTAxLCAxMjIsIDEyNSwgMTI2LCAxMjgsCisgICAgMTAxLCAxMDksICA0NiwgIDU5LCAxMTQsIDExMiwgMTE5LCAxMTksIDEyNiwgMTIxLAorICAgIDEyOSwgMTI0LCAxMjgsIDEyNSwgMTI1LCAxMjIsIDEyMywgMTIwLCAxMjUsIDEyMiwKKyAgICAxMzUsIDEzNCwgMTIxLCAxMzQsICA1NiwgMTM5LCAxMzEsIDE0NSwgMTM1LCAxMzgsCisgICAgMTM2LCAxMzksIDEyNiwgMTMwLCAxMjIsIDEzMiwgMTI2LCAxMjksIDEyNCwgMTI5LAorICAgIDE1MywgMTY5LCAxNDYsIDE3OSwgMTM4LCAxMzksIDE1MSwgMTQzLCAxNDgsIDEzOCwKKyAgICAxNTMsIDEzNywgMTQyLCAxMjksIDE0NCwgMTI2LCAxNDAsIDEyOCwgMTMzLCAxMjYsCisgICAgMTM2LCAxMzQsIDE1NCwgMTQ5LCAxNzMsIDE1NywgMTUyLCAxNDQsIDE0OSwgMTQxLAorICAgIDEzNywgMTM2LCAxMjcsIDEyMSwgMTIzLCAxMjEsIDEyMSwgMTI2LCAxMjAsIDEyMywKKyAgICAxNTcsIDE0MywgMTY2LCAxMzUsIDEyMCwgMTIyLCAxMTIsIDExOCwgMTAyLCAxMTgsCisgICAgMTExLCAxMjQsIDEzNCwgMTMxLCAxNDEsIDEzOCwgMTM1LCAxMzQsIDEyNiwgMTI5LAorICAgIDE0MCwgMTIzLCAxNTIsICA3NiwgMTMxLCAxMTYsIDEzOCwgMTM2LCAxMjYsIDEzNCwKKyAgICAxMzAsIDE0MiwgMTI2LCAxMzYsIDEyMCwgMTMyLCAxMjYsIDEyOCwgMTI0LCAxMjcsCisgICAgMTMxLCAxMzgsICA4MCwgMTQ3LCAxMjYsIDEzOCwgMTMwLCAxNDAsIDEyOSwgMTM0LAorICAgIDEzMywgMTM1LCAxMzEsIDEzMiwgMTI2LCAxMjcsIDEyNywgMTI1LCAxMjUsIDEyMywKKyAgICAxMzIsIDEzMiwgMTMwLCAxMzIsIDEyMywgMTMwLCAxMDIsIDEwMiwgMTA3LCAxMTAsCisgICAgMTE2LCAxMjcsIDEzMiwgMTUyLCAxNDIsIDE2MCwgMTQzLCAxNTEsIDE0MiwgMTQ2LAorICAgIDEzMiwgMTMyLCAxMzIsIDEzMiwgMTI1LCAxMjYsIDEzMiwgMTQwLCAxNTgsIDE5OSwKKyAgICAxMzUsIDE0OSwgMTM0LCAxNDAsIDEzNSwgMTMxLCAxMjksIDEyMCwgMTI3LCAxMjEsCisgICAgMTI5LCAxMzAsIDEyMiwgMTIzLCAxMjUsIDEyNCwgMTM4LCAxMzgsIDEzOCwgMTM1LAorICAgIDE0MCwgMTQxLCAxMDEsICA5NCwgMTA1LCAgOTgsIDEyMSwgMTIyLCAxMjcsIDEyOCwKKyAgICAxMjYsIDEyNywgMTE5LCAxMjEsIDEzMywgMTU2LCAxMzIsIDE1OSwgMTMwLCAxNDgsCisgICAgMTM3LCAxNjQsIDEyNywgMTM4LCAxMzAsIDEzNywgMTM1LCAxNDAsIDEyNiwgMTI2LAorICAgIDEyOCwgMTI5LCAxMjksIDEyOSwgMTI2LCAxMjQsIDEzMCwgMTI4LCAxNDMsIDEzOCwKKyAgICAxNDksIDE0MywgMTg1LCAxNzAsIDEyOSwgMTI3LCAxMzgsIDEzMywgMTM4LCAxMzUsCisgICAgMTMyLCAxMzQsIDEzNywgMTQ0LCAxMzksIDE4MywgMTMxLCAxNDUsIDEyNywgMTI4LAorICAgIDEyOCwgMTI3LCAxMjgsIDEyMiwgMTI5LCAxMjUsIDE0NSwgMTM5LCAxMzUsIDEzMSwKKyAgICAxMzIsIDEzMywgMTMyLCAxMzAsIDE1MiwgIDk2LCAxNTksICA4NSwgMTUwLCAxMDUsCisgICAgMTU0LCAxMTUsIDE0MywgMTIwLCAxMzgsIDEyNiwgMTM0LCAxMjQsIDEzMCwgMTI2LAorICAgIDEyOCwgMTI3LCAxMjEsIDEyMywgMTIyLCAxMjMsIDExNiwgMTI1LCAgODQsICA4NywKKyAgICAxMzMsIDEzNSwgMTI5LCAxMzEsIDEyMywgMTI2LCAxMzMsIDEzNSwgMTMxLCAxMzAsCisgICAgMTM2LCAxMzQsIDEyOSwgMTE5LCAgNzksICA2MywgMTE2LCAxMTYsIDEzNiwgMTMzLAorICAgIDEzMywgMTMwLCAxNDAsIDE0MywgMTI3LCAxMjcsIDEyNCwgMTI1LCAxMjcsIDEyOCwKKyAgICAxMjgsIDEyNiwgMTI0LCAxMjAsIDEzOSwgMTI4LCAxNTMsIDEzNCwgMTUxLCAxMzQsCisgICAgMTc0LCAxNDUsIDE1OSwgMTM2LCAxNjUsIDE0NCwgMTcxLCAxNDksIDE0MywgMTM1LAorICAgIDEzNCwgMTM0LCAxMzMsIDEzMywgMTIxLCAxMTksIDE3NywgMTYyLCAxNjYsIDE1NCwKKyAgICAxMjcsIDEzMCwgMTMyLCAxMzIsIDEzNiwgMTM3LCAxNDIsIDE0MywgMTM4LCAxMzcsCisgICAgMTY3LCAxNTEsIDE2MiwgMTQyLCAxMjgsIDEzNiwgMTQyLCAxNDgsIDEyOCwgMTQzLAorICAgIDE0NSwgMTUzLCAxNDAsIDE0OSwgMTMyLCAxNDEsIDEyOCwgMTM5LCAxMjcsIDEzMywKKyAgICAxNTYsIDE2OSwgMTMxLCAxMjksIDEyNiwgMTIwLCAxMjcsIDEyNSwgMTI5LCAxMjAsCisgICAgMTMxLCAxMjYsIDEyNiwgMTIzLCAxMjQsIDEyMSwgMTIyLCAxMjEsIDEyMywgMTIzLAorICAgIDEzOCwgMTQwLCAxNDksIDE1NiwgMTQ1LCAxNTIsIDEwNSwgMTAyLCAxMzEsIDEyNiwKKyAgICAxNTEsIDE0NiwgMTQ3LCAxMzksIDE0NCwgMTM3LCAxNDMsIDEzMywgMTM1LCAxMzAsCisgICAgMTMyLCAxMzAsIDEzMSwgMTI5LCAxMjYsIDEzMCwgMTI2LCAxMjksIDExMCwgMTM1LAorICAgIDExNSwgMTM5LCAxMDgsIDE0NiwgMTA1LCAxNDcsIDEyMSwgMTM0LCAxMjQsIDEzMywKKyAgICAxMzcsIDEzNywgMTM1LCAxMzQsIDE0MywgMTQyLCAxNDYsIDE0NiwgMTIwLCAxMjEsCisgICAgMTM5LCAxMzcsIDEzMywgMTI5LCAxNDksIDE0NSwgMTM5LCAxMzMsIDEzMCwgMTI3LAorICAgIDEzNCwgMTM0LCAxMzQsIDEzNCwgMTI1LCAxMjQsIDExNywgMTE5LCAxMjAsIDExMywKKyAgICAgODQsICA4MCwgMTIyLCAxMjUsIDEwOCwgMTEyLCAgOTcsIDEwMiwgMTE4LCAxMjAsCisgICAgMTI0LCAxMjMsIDExNSwgMTE2LCAxMTAsIDExMSwgIDk4LCAgOTcsIDEyNywgMTI0LAorICAgIDEyOSwgMTI3LCAxMjAsIDExNywgMTE0LCAxMDksIDEwNiwgMTA0LCAxMTYsIDExNiwKKyAgICAxMzgsIDEzOCwgMTM5LCAxNDEsIDE0MiwgMTQ2LCAxMjcsIDEyNSwgMTMzLCAxMzAsCisgICAgMTM0LCAxMjgsIDEzNCwgMTI3LCAxMTYsICA5MSwgMTA1LCAgODQsIDExNCwgMTA2LAorICAgIDEyOCwgMTI4LCAxMjYsIDEyNiwgMTMxLCAxMzcsIDEyNiwgMTI5LCAxMzMsIDEzOSwKKyAgICAxMzQsIDE0NSwgMTMyLCAxNDMsIDE1MCwgMTkyLCAxMzEsIDE0MiwgMTM4LCAxNDEsCisgICAgMTMyLCAxMzAsIDEzMiwgMTMwLCAxNDksIDEzOCwgMTk2LCAxNTIsIDEzNywgMTI1LAorICAgIDEzNCwgMTI1LCAxMzksIDEyOCwgMTMzLCAxMjUsIDE0MSwgMTM0LCAxMzQsIDEzNSwKKyAgICAxMzQsIDEzNSwgMTM0LCAxMzUsIDEzMSwgMTMwLCAxMzYsIDEzMywgMTEwLCAxMDYsCisgICAgMTQyLCAxNDQsIDE1MywgMTYyLCAxMzEsIDEyOSwgMTM0LCAxMzIsIDEzMSwgMTMwLAorICAgIDEyNiwgMTI1LCAxMzIsIDEzMCwgMTY4LCAxNTMsIDEyNiwgMTI0LCAxMzAsIDEyNiwKKyAgICAxNDAsIDEzNSwgMTQwLCAxMzQsIDEzOCwgMTMzLCAxNDUsIDEzNywgMTM1LCAxMzQsCisgICAgMTMwLCAxMzAsIDEzMiwgMTMxLCAxMzMsIDEzMiwgMTI5LCAxMjksIDEyNSwgMTI4LAorICAgIDEyOCwgMTMwLCAxMzMsIDEzOSwgMTQzLCAxNTIsIDE5MywgMjE1LCAxNTIsIDE2MCwKKyAgICAxMzAsIDEzMSwgMTI5LCAxMzEsIDEzMCwgMTMxLCAxMzUsIDEzNiwgMTM2LCAxNDEsCisgICAgIDgzLCAgODEsIDEyMSwgMTIwLCAxMzYsIDEzMCwgMTUwLCAxNDUsIDE0NywgMTQ1LAorICAgIDEzNCwgMTMzLCAxMzUsIDEzMywgMTQ2LCAxNDIsIDEzNSwgMTMxLCAxMjcsIDEyOCwKKyAgICAxMzQsIDEzNSwgIDkzLCAxMDIsIDEyNiwgMTMyLCAxMzEsIDEzMywgMTI3LCAxMjksCisgICAgMTI0LCAxMjUsIDEyMCwgMTIyLCAxMDMsIDEwNiwgMTI4LCAxMjksIDEzOSwgMTM4LAorICAgIDEyNywgMTI4LCAxMzQsIDEzNCwgMTQzLCAxMzgsIDEzOSwgMTM0LCAxMzUsIDEzMywKKyAgICAxMzEsIDEzMCwgMTMzLCAxMzEsIDEzOSwgMTM0LCAxMzgsIDEzNiwgMTY2LCAxNTYsCisgICAgMTE5LCAxMTYsIDEyMSwgMTIyLCAxMjYsIDEyNCwgMTE2LCAxMTcsIDEyMywgMTI0LAorICAgIDEzMSwgMTMxLCAxMjksIDEyOSwgMTMwLCAxMjgsIDE0MSwgMTM4LCAxMzUsIDEzMiwKKyAgICAxNTQsIDE0NSwgMTM3LCAxMjksIDEzMSwgMTI1LCAxNDYsIDEzNywgMTM4LCAxMzUsCisgICAgMTMxLCAxMzEsIDEzMSwgMTMyLCAxMjksIDEzMCwgMTM0LCAxMzgsIDExMSwgMTE2LAorICAgIDExMywgMTE4LCAxMjMsIDEyNSwgMTIyLCAxMjQsIDE0MywgMTQ3LCAxMzgsIDE0MCwKKyAgICAxMTYsIDExMywgMTE0LCAxMTIsIDEzMCwgMTI2LCAxMTcsIDExNSwgMTI3LCAxMjYsCisgICAgMTM5LCAxMzcsIDE0MSwgMTM5LCAxMzEsIDEzMiwgMTQzLCAxNDQsIDEzOSwgMTQwLAorICAgIDEzMCwgMTMwLCAxMjksIDEyOCwgMTM2LCAxMzQsIDExOSwgMTE3LCAxNTIsIDE0MywKKyAgICAxNTUsIDE0MywgMTIwLCAxMTksIDE0MiwgMTM5LCAxMjQsIDEzMCwgMTI2LCAxMjgsCisgICAgMTEyLCAxMTAsIDExMiwgMTA5LCAxMzYsIDEzMiwgMTI1LCAxMTgsIDEyMSwgMTE1LAorICAgIDEwMywgMTAxLCAxMDksIDEwMCwgMTI1LCAxMjAsIDEyMSwgMTE3LCAxMjIsIDEyMSwKKyAgICAxMjgsIDEyOCwgMTI3LCAxMjcsIDEyNCwgMTI0LCAxMjgsIDEyNywgMTMxLCAxMjksCisgICAgMTQyLCAxMzgsIDE0NywgMTQxLCAxMTUsIDEwOCwgMTEzLCAxMDksIDEyMiwgMTE5LAorICAgIDEzNiwgMTMzLCAxNTAsIDEzOSwgMTQyLCAxMzEsIDExOSwgMTExLCAxNTEsIDEzNywKKyAgICAxMjEsIDExNiwgMTQ2LCAxMzQsIDEzNywgMTI5LCAxMjEsIDEyMywgMTI3LCAxMjksCisgICAgMTMwLCAxMzAsIDEzMCwgMTMwLCAxMzYsIDEzNywgMTI2LCAxMjYsIDEzNiwgMTM2LAorICAgIDEzMywgMTMzLCAxMzksIDEzOSwgMTQyLCAxNDMsIDExOSwgMTIwLCAxMzQsIDEzNCwKKyAgICAxMzIsIDEzMiwgMTMzLCAxMzMsIDEzNSwgMTM4LCAxMjksIDEzMSwgMTMzLCAxMzQsCisgICAgMTM1LCAxMzgsIDEyNiwgMTMwLCAxMTcsIDExOCwgMTMxLCAxMzIsIDEzNSwgMTM1LAorICAgIDEyOSwgMTI5LCAxMjgsIDEyOCwgMTI2LCAxMjksIDEyNywgMTI5LCAxMjMsIDEyNSwKKyAgICAxMTUsIDExNywgMTU2LCAxNTcsIDEyNywgMTMxLCAxMjksIDEyOSwgMTI4LCAxMjksCisgICAgMTI5LCAxMzAsIDEzMSwgMTMxLCAxMjYsIDEyNywgMTM1LCAxMzQsIDEzNiwgMTM1LAorICAgIDE0MCwgMTM2LCAxMTcsIDExMywgMTMyLCAxMjgsIDEwNCwgIDk3LCAxMDksIDEwNiwKKyAgICAxMzEsIDEzMSwgMTMxLCAxMzEsIDEyMSwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisgICAgMTI3LCAxMjcsIDEzNSwgMTM1LCAxMjgsIDEyOCwgMTMwLCAxMzAsIDE0MSwgMTQwLAorICAgIDEyOSwgMTI5LCAxMjksIDEyOSwgMTI5LCAxMjcsIDEyNywgMTI1LCAxNDksIDE0NiwKKyAgICAxMjUsIDEyMywgMTM0LCAxMzMsIDEzNCwgMTMyLCAxNTIsIDE1MCwgMTM4LCAxMzgsCisgICAgMTI4LCAxMjgsIDEyNiwgMTI1LCAxMzIsIDEzMywgMTQxLCAxNDMsIDEzNiwgMTM2LAorICAgIDEyNiwgMTI3LCAxMjYsIDEyNywgMTI5LCAxMzEsIDEyOCwgMTI5LCAxMzUsIDEzNCwKKyAgICAxNzYsIDEzOSwgMTkyLCAxMzUsIDE0NSwgMTIyLCAxNDksIDExNywgMTU1LCAxMzQsCisgICAgMTY5LCAxMzMsIDE1NywgMTM5LCAxNDIsIDEzNiwgMTUxLCAxNTIsIDE0MiwgMTQ3LAorICAgIDE2NiwgMTc0LCAxMDMsIDEwNywgMTQxLCAxMzQsIDE0MCwgMTM2LCAxNDQsIDEzNSwKKyAgICAxNDcsIDEzNSwgMTU2LCAxMzEsIDE1MywgMTI3LCAxMzMsIDEyNiwgMTMwLCAxMjQsCisgICAgMTI3LCAxMzAsIDEyMywgMTI0LCAxMTQsIDEwNSwgMTk1LCAxOTMsIDE1NiwgMTU3LAorICAgIDE2NSwgMTU4LCAxMjYsIDEyMiwgMTQ5LCAxNDEsIDE3NCwgMTczLCAxNTIsIDE0NywKKyAgICAxMzYsIDEzOSwgMTMxLCAxMzgsIDE2MywgMTY5LCAxMDMsIDEyNCwgIDgwLCAxMDIsCisgICAgMTUzLCAxODYsIDEyMSwgMTUxLCAxMzQsIDE2MSwgMTU2LCAxOTAsIDE0MSwgMTUxLAorICAgIDEyMSwgMTIzLCAxMjQsIDEyNywgMTE5LCAxMjcsIDEzMywgMTM0LCAxNTcsIDE1NiwKKyAgICAgODEsICA2OSwgMTM2LCAxMzQsIDE2MCwgMTY5LCAxMTgsIDExNCwgMTM1LCAxMjgsCisgICAgMTE0LCAxMTYsICA5NywgIDk3LCAxMTcsIDEyMiwgMTUyLCAxNjEsIDExNSwgMTIxLAorICAgIDEwNiwgMTIyLCAxMzUsIDEzNywgMTExLCAxMTMsIDEyNSwgMTM1LCAxNDEsIDE0NSwKKyAgICAxNDMsIDE0NiwgMTQzLCAxNTAsIDEzMiwgMTM2LCAxNDIsIDE1MCwgMTUxLCAxNjcsCisgICAgMTAxLCAxMDcsIDE1NSwgMTczLCAxMTIsIDEyNCwgMTA1LCAxMDAsIDEyOCwgMTI2LAorICAgIDEyNywgMTMwLCAxMzMsIDEzNCwgMTQyLCAxMjEsIDEzMSwgMTE2LCAxNzYsIDE0NSwKKyAgICAxNjEsIDEyMCwgMjA5LCAxNTAsIDE5NiwgMTMzLCAxNDcsIDExNSwgMTQ5LCAxMzAsCisgICAgMTQ0LCAxNDUsIDE0NCwgMTQ1LCAxMjAsIDExOSwgMTYzLCAxNjAsIDExNywgMTE4LAorICAgIDEyMywgMTE3LCAxNTQsIDExOSwgMTkzLCAgOTgsIDE0OSwgMTAxLCAxMzcsIDExNiwKKyAgICAxMzMsIDEzNSwgMTQwLCAxNDMsIDE0NCwgMTU2LCAxMzEsIDE0NiwgMTg2LCAyMDEsCisgICAgMTQwLCAxMzksIDEyMywgMTI1LCAxNTgsIDE2OSwgMTU3LCAxNjYsIDE0MiwgMTQzLAorICAgIDEzMCwgMTMxLCAxMzIsIDEzMiwgMTI4LCAxMjgsIDE0MSwgMTQyLCAxNDcsIDE0OSwKKyAgICAxNDUsIDE0OCwgMTM3LCAxMzksIDEyOSwgMTI5LCAxMDcsIDEwOCwgMTU3LCAxNTcsCisgICAgMTIwLCAxMjEsIDExOSwgMTE5LCAxNDAsIDEzMiwgMTM3LCAxMzEsIDExOCwgMTEzLAorICAgIDE0MywgMTM2LCAxMzQsIDEzNSwgMTY0LCAxNTgsIDEzMywgMTI1LCAxMjcsIDEyNCwKKyAgICAxNDgsIDEyMiwgMTk3LCAxMzAsIDE3MywgMTQ1LCAxMTAsIDEzOSwgMTIzLCAxNjUsCisgICAgIDgzLCAxNTgsICA5MCwgMTY3LCAgOTMsIDE0MiwgMTM2LCAxNjksIDEzNCwgMTUyLAorICAgIDEzMCwgMTI2LCAxNTQsIDEzOCwgMjI3LCAxNTAsIDE1NiwgMTE0LCAxNDcsIDExNCwKKyAgICAxNDIsIDEwOSwgMTM1LCAxMTAsIDE2NiwgMTM1LCAxNzYsIDE1MCwgMTUyLCAxNDIsCisgICAgMTMyLCAxMzIsIDEzNiwgMTM2LCAxMzAsIDEzNSwgMTQzLCAxNTIsIDEzNiwgMTQ0LAorICAgIDE1MiwgMTYwLCAxNzcsIDE4NSwgMTEyLCAxMTIsIDE2NSwgMTY2LCAxNjAsIDE2MSwKKyAgICAxNDUsIDE0NSwgMTM4LCAxMzksIDExNiwgMTE4LCAxMjcsIDEzMSwgIDY2LCAgODAsCisgICAgMTMyLCAxNDIsIDExOSwgMTI3LCAxMDEsIDEwOCwgMTIwLCAxMzAsIDEyNiwgMTMwLAorICAgIDEzNSwgMTM1LCAxNDIsIDEzOSwgMTUzLCAxMzcsICA1NSwgIDMwLCAxNDIsIDEzOSwKKyAgICAxMzksIDE0MywgMTM1LCAxMzMsIDEyOSwgMTMzLCAxMDksIDEwOCwgMTI5LCAxMjksCisgICAgMTM2LCAxMzUsIDEzNCwgMTMxLCAxMjksIDEzMiwgMTMyLCAxMzQsIDEzNSwgMTQ5LAorICAgICA3OSwgMjA2LCAxMjMsIDEzNywgMTM1LCAxNDMsIDEzMCwgMTQwLCAxMzEsIDEzNCwKKyAgICAxMDAsICA5OSwgMTY1LCAxNjQsIDE0MiwgMTIzLCAxNDgsIDEzMywgMTMzLCAxMjIsCisgICAgMTQyLCAxMzMsIDEzOCwgMTI1LCAxMTksIDExMSwgMTI5LCAxMjMsIDEzNywgMTMwLAorICAgIDEzMSwgMTMyLCAxMjMsIDEyOSwgMTc0LCAxODUsIDE5NiwgMTgxLCAxMjcsIDExMSwKKyAgICAxNTYsIDE0MSwgMTMyLCAxMTQsIDEyOSwgMTA2LCAxMzIsIDEwNywgMTI2LCAxMTcsCisgICAgMTM0LCAxNDAsIDEzMSwgMTM2LCAxMTksIDE0NiwgIDkyLCAyNDYsIDEyOCwgMTMyLAorICAgIDEyNSwgMTI5LCAxMzIsIDE0MCwgMTI4LCAxNDEsIDEyNiwgMTQ1LCAxMzcsIDE0MiwKKyAgICAxMzAsIDEzMCwgMTEwLCAxMTUsIDEyNCwgMTM5LCAxMjcsIDE1MSwgMTE4LCAxNTIsCisgICAgIDk4LCAxNDYsICAzNiwgMTA4LCAxMjYsIDE1OCwgMTEyLCAxNDYsIDExMiwgMTMwLAorICAgIDEzOCwgMTM2LCAxNDUsIDEzOCwgMTUzLCAxNDUsIDExNiwgMTI1LCAgOTAsIDEwMywKKyAgICAxMzcsIDEzOCwgMTg5LCAxODUsIDE0MSwgMTUxLCAgODYsICA5MywgMTExLCAxMTEsCisgICAgMTMzLCAxNzEsIDEyNSwgMjA5LCAxNDAsIDEzMiwgMTMwLCAxMzQsIDEyOSwgMTAxLAorICAgIDE0MiwgMTIwLCAxNDIsIDEzMiwgMTM1LCAxMjYsIDE0MSwgMTQwLCAxNDAsIDEzNCwKKyAgICAxMjgsIDEyMywgMTMxLCAxMjMsIDEzOCwgMTE4LCAxNjMsIDEzMywgMjQwLCAxOTcsCisgICAgMTc2LCAxNTEsIDEyNiwgMTIzLCAgODEsICA5NCwgMTA5LCAxMTgsIDEyNCwgMTMzLAorICAgIDEzNSwgMTMzLCAxMzcsIDEzNCwgMTU0LCAxMzUsIDE0MCwgMTU1LCAgNjksIDE5MCwKKyAgICAxMTksIDE0OSwgMTQxLCAxNTEsIDE0MiwgMTIzLCAxMzUsIDEyNSwgMTI5LCAxMzAsCisgICAgMTI3LCAxMjUsIDEzMiwgMTI3LCAxMDcsICA4MCwgMTIzLCAxMDMsIDE0NSwgMTMxLAorICAgIDEzMywgMTA3LCAxNDAsIDEwMywgMTM1LCAxMDYsIDE3MCwgMTQ1LCAxNTksIDE0MywKKyAgICAxMzYsIDEzNywgMTI3LCAxMzAsIDEwNSwgMTE5LCAxMjksIDEzNCwgMTQxLCAxNTEsCisgICAgMTE2LCAxMjcsIDExOSwgMTQwLCAgNzUsIDExOSwgMTUyLCAxNjIsIDE0OSwgMTUyLAorICAgICA3MiwgMTM4LCAgIDksIDE0MywgMTE4LCAxNjAsIDEyNiwgMTM0LCAxNDEsIDE0NywKKyAgICAxMzUsIDEzMSwgMTI5LCAxMjksIDEzNSwgMTI5LCAxMzYsIDEyNiwgMTMzLCAxMjUsCisgICAgMTM3LCAxMzUsIDE0NiwgMTQxLCAxNDUsIDEzOSwgMTQxLCAxNDAsIDEzMywgMTMwLAorICAgIDIxMywgMjA4LCAxMzksIDEzMCwgMTM5LCAxMzYsIDExNywgMTE3LCAxMjYsIDEyNSwKKyAgICAxMzMsIDEzMCwgMTM4LCAxMzEsIDE0MSwgMTAwLCAxNDUsICA5MywgMTU5LCAxMjEsCisgICAgMTQ0LCAxMzIsIDExNywgMTYwLCAxMDIsIDE4NywgIDk5LCAxNjIsIDExNywgMTQ0LAorICAgIDEzMiwgMTMyLCAxMzQsIDEzNCwgMTQwLCAxNDEsIDEyNywgMTI2LCAxMjgsIDEzMSwKKyAgICAxMTYsIDExNiwgMTIxLCAxMjcsIDExOSwgMTI2LCAxMTQsIDExNCwgIDk5LCAxMDAsCisgICAgMTQxLCAxNDQsIDE0OCwgMTU5LCAxNzksIDIyNCwgIDk1LCAxMzEsIDEwMCwgMTI1LAorICAgICA4NywgMTEwLCAxMTIsIDEzMiwgMTM0LCAxNDcsIDExMSwgMTI1LCAxMjIsIDEyMiwKKyAgICAxMzcsIDE0MCwgMTQxLCAxMjksIDE2OSwgIDEyLCAxNDQsIDEzMiwgMTMzLCAxNDQsCisgICAgMTQxLCAxNDYsIDEzNywgMTQ3LCAxMzYsIDEyMiwgMTMzLCAxMzAsIDEzMSwgMTI4LAorICAgIDE0MSwgMTQyLCAxMjgsIDEzOSwgIDE1LCAgNjksIDE2MCwgMTU5LCAxNDIsIDEzMCwKKyAgICAxMzcsIDEyNiwgMTU5LCAxNDEsIDE0NSwgMTQzLCAxMjgsIDEyNSwgMTM0LCAxMjgsCisgICAgMTMxLCAxMzAsIDEyNywgMTI3LCAxMTQsIDEwNCwgMTE5LCAgOTgsICA4MywgIDY4LAorICAgIDEzOSwgMTIwLCAxNzMsIDE0MiwgMTk5LCAxNTQsIDE5MSwgMTUzLCAxNTgsIDE0NSwKKyAgICAxMjgsIDEzMCwgMTI3LCAxMjcsIDE0OCwgMTUwLCAxMTAsICA5OSwgMTE5LCAxMDksCisgICAgMTIwLCAxMTMsIDE2MywgMTU0LCAxMTAsICA5MCwgMTM4LCAxMjksIDE0OSwgMTQ0LAorICAgIDEzMSwgMTM0LCAxMjQsIDE0MiwgIDc2LCAyMTcsIDEzMCwgMTI5LCAxNDAsIDEzOCwKKyAgICAxMzMsIDEzNSwgMTQ1LCAxNTAsIDEzNiwgMTM4LCAxMjcsIDEzMCwgMTMwLCAxMzQsCisgICAgMTQ0LCAxMTksIDE3OCwgIDcwLCAxNDMsIDEzMCwgMTE1LCAxMzYsIDEzOSwgMTM4LAorICAgIDEyOSwgMTA5LCAxMzYsIDExNiwgMTQ3LCAxMjIsIDEyNiwgMTEyLCAxMjYsIDEyMywKKyAgICAxMzIsIDEzOSwgMTI4LCAxNDQsIDEwNywgMTU2LCAgNzUsIDE2MywgMTIwLCAxNjQsCisgICAgMTUxLCAxMzYsIDE1MSwgIDk5LCAxNjAsIDExMiwgMTU5LCAxMjYsIDE0MywgMTI2LAorICAgIDE0MCwgMTM4LCAxMzcsIDEzNSwgMTUyLCAxMDgsIDI1MSwgIDg1LCAxMzgsIDExNiwKKyAgICAxMzcsIDExOCwgMTQxLCAxMTksIDEzNiwgMTIxLCAxNTAsIDEzNCwgMTM4LCAxMzEsCisgICAgMTM3LCAxMzcsIDE0MywgMTQ0LCAxNTAsIDE1MywgMTQ4LCAxNTQsIDE1MiwgMTUxLAorICAgIDExNywgMTA0LCAxMjQsICA5NiwgIDkzLCAgNjcsIDE0NiwgMTM4LCAxNDksIDE0OCwKKyAgICAxNDksIDE1MywgMTcyLCAxOTMsIDEwOCwgMTE0LCAxMjUsIDEyOCwgMTQ1LCAxNjUsCisgICAgMTQ5LCAxNjAsIDEyMSwgMTMwLCAxMTUsIDEyMCwgMTEwLCAxMTIsIDEyMSwgMTE4LAorICAgIDE0NSwgMTQ2LCAxNDEsIDE0MiwgMTI3LCAxMjcsIDEwMywgIDk1LCAxMzgsIDE0MywKKyAgICAxMTQsIDEyNiwgMTA5LCAxMTUsIDE0MywgMTM2LCAxNTMsIDE0OSwgMTQ0LCAxNDIsCisgICAgMTQwLCAxMzgsIDE1MCwgMTQ0LCAxMjgsIDExNiwgMTQyLCAxMzYsIDEzNSwgMTIyLAorICAgICA5MywgIDg4LCAxNjQsIDE2MywgMTQxLCAxNDIsIDE3MSwgMTgyLCAxNTQsIDE2MCwKKyAgICAxMjQsIDEyNSwgMTIyLCAxMjMsIDE1OCwgMTU1LCAxMTEsICA5NywgMTM4LCAxMzAsCisgICAgMTU3LCAxMzQsIDEwMSwgIDY1LCAxMjksIDExOCwgMTIxLCAxMTQsIDEyNCwgMTE5LAorICAgIDEzMSwgMTMzLCAxMjUsIDEyOSwgMTM2LCAxNDcsIDEzNSwgMTUyLCAxMzEsIDEzMywKKyAgICAxMTAsIDExNSwgMTE4LCAxMTQsIDE2MSwgMTU5LCAyMzMsIDIxOCwgMTcyLCAxNjYsCisgICAgMTQwLCAxMDcsIDEyNSwgICAwLCAxNDAsIDEwMywgMTQwLCAxMTUsIDEyNSwgMTEzLAorICAgIDEzMiwgMTM1LCAxMjgsIDEzMywgMTM4LCAxNDYsIDEzMSwgMTQ1LCAxMjcsIDEzMywKKyAgICAxMzEsIDEzMSwgMTIyLCAxMjIsIDEzNSwgMTMyLCAxMjYsIDEyNCwgMTMyLCAxMzMsCisgICAgMTY0LCAxNjcsIDEyMSwgMTI3LCAxMTcsIDEyMCwgMTY3LCAxNjIsIDE0NSwgMTQzLAorICAgIDEzNSwgMTM0LCAxMzYsIDEzNCwgMTU2LCAxNDYsIDE5NSwgMTc3LCAxMjcsIDEzOSwKKyAgICAxMDgsIDE0MCwgMTQxLCAxNzMsIDE0MSwgMTc4LCAxMzEsIDE1NSwgMTI5LCAxNDEsCisgICAgMTM0LCAxMzQsIDExOSwgMTE0LCAxODQsIDE4NCwgMTI3LCAxMjYsIDE0NywgMTUxLAorICAgIDEzMCwgMTQwLCAxNDYsIDE1OSwgMTM0LCAxNDUsIDEzMSwgMTM2LCAxMzcsIDE0MiwKKyAgICAxMzUsIDEzNywgMTI4LCAxMzYsICA4MywgMTA4LCAgOTcsICA5OCwgMTUyLCAxMTksCisgICAgMjA3LCAxNDQsIDE0MiwgMTIxLCAxNDQsIDEyOSwgMTMxLCAxMjcsIDEzMCwgMTMyLAorICAgIDEyNCwgMTI1LCAxMDgsIDEwNywgIDk0LCAxMTYsICA4MSwgMTE0LCAxMzksIDE3MywKKyAgICAxMzEsIDE1OCwgMTQ1LCAxNzcsIDE0MSwgMTYzLCAxMzYsIDE0MCwgMTQzLCAxNDQsCisgICAgMTM1LCAxNDEsIDEzMiwgMTM2LCAxMzQsIDE0MiwgMTQyLCAxMzYsIDE3MywgIDUwLAorICAgIDE0MywgMTA2LCAxNDIsIDEyNywgMTM0LCAxMzksIDEyNywgMTMzLCAxMjUsIDEyNSwKKyAgICAxMjksIDEzMCwgMTMxLCAxMzMsIDEzMiwgMTQ4LCAxMTAsIDEzOCwgMTEzLCAxMzUsCisgICAgMTM4LCAxNzUsIDEwOCwgMTUxLCAgNTUsIDExOSwgIDUxLCAxMDAsICA5MywgMTE2LAorICAgIDEyMSwgMTIxLCAxNDYsIDE1MSwgIDk5LCAxMjAsIDEyNywgMTM3LCAxMDcsIDEyMiwKKyAgICAxMjUsIDEzOSwgMTEwLCAxMzIsIDEzNSwgMTU2LCAxNDEsIDE1NiwgMTQ4LCAxNTcsCisgICAgMTM3LCAxMzcsIDE0MSwgMTQwLCAxMzksIDEzNywgMTMwLCAxMjgsIDEzOCwgMTM2LAorICAgIDEzMiwgMTM0LCAxMTUsIDExMCwgMTc3LCAxNzksICA4MSwgIDg2LCAxMDAsICA5OCwKKyAgICAgODQsICA4MywgMTIxLCAxMjEsIDE0OCwgMTU3LCAxMjcsIDEzMywgMTQ2LCAxNTYsCisgICAgMTI3LCAxMzYsIDE0MywgMTUxLCAxMzUsIDEzOSwgMTM4LCAxNDIsIDEzNiwgMTM2LAorICAgIDIwMSwgMTY0LCAxNTEsIDEyOSwgMTIzLCAxMzYsIDE0NywgMTQ4LCAxMjcsIDE0MiwKKyAgICAxMjgsIDE0MywgMTAxLCAxMjYsIDExOSwgMTMzLCAxMTQsIDEzMSwgMTE2LCAxMjYsCisgICAgMTMyLCAxMzMsIDE0MCwgMTQwLCAxMjYsIDEyNSwgMTU2LCAxNTMsIDE0MiwgMTI5LAorICAgIDE0MCwgMTMwLCAgNzcsICA2OSwgMTM0LCAxMzIsIDE0NiwgMTQ4LCAxMzUsIDEzNiwKKyAgICAxMzMsIDEzMiwgMTIzLCAxMTYsIDExNiwgMTAzLCAxNTAsIDEzNSwgMTQ0LCAxMjcsCisgICAgMTMwLCAxMTcsIDEzNiwgMTIyLCAxMjIsIDEwNiwgIDQ4LCAgMzgsICA4MSwgIDc4LAorICAgIDE0NSwgMTQ2LCAxMzUsIDEzNiwgMTIzLCAxMjIsIDEyNiwgMTMzLCAxMzMsIDEzOCwKKyAgICAxNDUsIDE0NSwgMTQ0LCAxNTAsIDE2MCwgMTgxLCAxNDIsIDEzOSwgMTUwLCAxNTAsCisgICAgMTM2LCAxMzYsIDEzOSwgMTM5LCAxMzMsIDEzMywgMTM5LCAxMzUsIDEzNCwgMTI5LAorICAgIDE0MCwgMTM3LCAxNTMsIDE0NSwgMTMyLCAxMzEsIDE1MSwgMTQ0LCAgNjgsICA2NiwKKyAgICAxMzcsIDEzNywgMTM5LCAxMzksIDE0NiwgMTQ2LCAxNDIsIDEzOSwgMTI5LCAxMjgsCisgICAgMTMxLCAxMjksIDEzMywgMTMyLCAxMzUsIDEzNCwgMTM1LCAxMzQsIDIwMSwgMjAwLAorICAgIDEzNywgMTM2LCAxNDYsIDE0MywgMTU1LCAxNTMsIDE1NywgMTU4LCAxMzEsIDEzOCwKKyAgICAxNDAsIDEzOSwgMTQzLCAxNDQsIDEyOCwgMTIzLCAyMTYsIDE5MiwgMTU5LCAxNTAsCisgICAgMTM3LCAxMzgsIDEzNiwgMTQyLCAxNDUsIDE0OCwgMTI2LCAxNjIsIDE0MCwgMTcwLAorICAgIDE4NiwgIDk1LCAxMzEsIDE0MCwgMTQzLCAxNDgsIDEzMywgMTI4LCAxMzAsIDEzMywKKyAgICAxNDEsIDEzOSwgMTUzLCAxNTAsIDEyMiwgMTIyLCAxMzQsIDE0NCwgMTI0LCAxMzAsCisgICAgMTU5LCAxNjYsIDEzMywgMTM5LCAxNTEsIDE1MCwgMTM4LCAxMzksIDEzMSwgMTM0LAorICAgIDEyMSwgMTIxLCAxMzEsIDEyOSwgMTQ4LCAxODAsIDEyMSwgMTM1LCAxMTgsIDEzMSwKKyAgICAxMjQsIDE0OCwgMTE5LCAxMTksIDEyOSwgMTI2LCAxNTAsIDE1NiwgMTU1LCAxNjAsCisgICAgIDQwLCAxNTQsIDExNSwgMTU3LCAxMzMsIDEyOSwgMTQwLCAxMzMsIDE0MywgMTMzLAorICAgIDE0MywgMTMyLCAxNDQsIDEzMCwgMTQxLCAxMzEsIDEzNCwgMTMwLCAxMzcsIDEzMywKKyAgICAxMzQsIDEzNiwgMTQxLCAxNDAsIDE0NSwgMTM3LCAxNTIsIDEyNCwgMTgzLCAgOTEsCisgICAgMTE4LCAxNTQsIDEyMywgMTU4LCAxMzYsIDEzNCwgMTQwLCAxNDIsIDEzOCwgMTQyLAorICAgIDEzOCwgMTM1LCAxMzEsIDEzMSwgMTM4LCAxMjksIDEyMSwgMTI4LCAxNDYsIDIxOSwKKyAgICAxMjQsIDEyMywgMTI1LCAxMzUsIDEyMCwgMTI2LCAxMjcsIDE0MSwgMTMzLCAxMzYsCisgICAgMTI3LCAxMjQsIDEyMCwgMTA3LCAxNTIsIDEyNSwgMTQ5LCAxMDgsIDE1OCwgMTQ0LAorICAgIDE5NiwgMTg1LCAxNzQsIDE2NCwgMTUxLCAxNDksIDEzOCwgMTMxLCAxNDAsIDEzNywKKyAgICAxNDksIDE0OCwgMTQ0LCAxNDUsIDE0MywgMTQ1LCAxNDAsIDE0MywgMTQxLCAxNDcsCisgICAgMTEyLCAxMjUsIDExMywgMTEzLCAxNDksIDE1NSwgMTQzLCAxNDksIDE0NiwgMTUxLAorICAgIDEzOCwgMTM4LCAxNDEsIDEzOCwgMTQ0LCAxMjksIDEzNCwgMTI1LCAxNDMsIDE0MCwKKyAgICAxNTMsIDE1NCwgMTQyLCAxMjMsIDE2MiwgIDQyLCAxNTQsIDEwNiwgMTUzLCAxMzAsCisgICAgMTUzLCAxNTMsIDEzNywgMTM3LCAxNDQsIDE0NCwgMTQyLCAxNDAsIDE2NSwgMTUxLAorICAgIDE2MSwgMTQwLCAxNDQsIDEzNCwgMTU2LCAxMjQsIDE2NywgMTQzLCAxNjYsIDE1NSwKKyAgICAxMzIsIDEzMiwgMTM3LCAxMzgsIDEzNywgMTMyLCAxMjQsIDEyNywgMTQwLCAxNDQsCisgICAgMTM0LCAxNDAsIDE2MiwgMTgwLCAxMjcsIDEzMSwgMTUyLCAxNjksIDE0NSwgMTU2LAorICAgIDEzMywgMTM0LCAxMzEsIDEzMywgMTMwLCAxMzIsIDE0NywgMTQ5LCAxMjUsIDExNywKKyAgICAxMjcsIDExOCwgMTU5LCAxNTUsIDE0NywgMTQyLCAxMjIsIDExNywgMTQ1LCAxNDQsCisgICAgMTM4LCAxMzcsIDEzMCwgMTMzLCAxMTMsIDE0OSwgMTY4LCAyMjQsIDE2NiwgMjAxLAorICAgIDEyOSwgMTUxLCAxNDcsIDE1NCwgMTM2LCAxMzUsIDE0MCwgMTM2LCAxNTIsIDE0MSwKKyAgICAxMjAsIDExMiwgMTQwLCAxMjcsIDE2MSwgMTAwLCAxMzIsIDExNSwgMTE4LCAxMjUsCisgICAgMTE1LCAxMzMsIDExNSwgMTU3LCAxNDQsIDE0NiwgMTE0LCAxMzUsIDEyNywgMTM5LAorICAgIDEzOCwgMTQxLCAxMzUsIDEzNSwgMTM3LCAxMzYsIDE0NywgMTQyLCAxNDMsIDE0NCwKKyAgICAxMzksIDE1MiwgMTQyLCAxMzYsIDE0NywgMTQzLCAxNzcsICAzOSwgMTI1LCAgNzEsCisgICAgMTQ3LCAxNDMsICA2NiwgIDg4LCAxMzIsIDE1OCwgMTIzLCAxMjYsIDExNiwgMTM1LAorICAgIDExOSwgMTI0LCAxMjgsIDEzNSwgMTMzLCAxNDAsIDEzNywgMTI2LCAxMzcsIDEzMCwKKyAgICAxNTUsICAzOCwgMTQ5LCAxMDMsIDEzMCwgMTM1LCAxMzksIDE0MywgMTI3LCAxMzcsCisgICAgMTM1LCAxNDEsIDEzOCwgMTQ4LCAxMzEsIDE0OCwgMTM2LCAxNDcsIDEzMiwgMTM5LAorICAgIDEzNiwgMTQwLCAxMTUsIDEyOSwgMTE1LCAxNTEsIDEzNiwgMTYwLCAgODcsIDEzMSwKKyAgICAxNTcsIDE3NiwgMTUwLCAxNjQsIDE0MCwgMTQxLCAxMzUsIDExOSwgMTM3LCAxMzMsCisgICAgMTQxLCAxNDAsIDE0MCwgMTM5LCAxMzQsIDEzNCwgMTQyLCAxNDQsIDEzMSwgMTMyLAorICAgIDEzMSwgMTM0LCAxMzEsIDEzMiwgMTE2LCAxMTQsIDEyOSwgMTMzLCAyMDUsIDIwNywKKyAgICAxMzAsIDEzMywgMTYwLCAxNzAsIDEzNywgMTI3LCAxMjQsIDExMiwgMTU4LCAxNDYsCisgICAgMTU1LCAxMzcsIDEzNCwgMTM2LCAxMzcsIDE0MiwgMTc3LCAxODQsIDE0OSwgMTUyLAorICAgIDEzNSwgMTM0LCAxMzMsIDEzMiwgMTM1LCAxMjksIDE0NCwgMTM2LCAxMzksIDEzNCwKKyAgICAxNjEsIDE1NSwgMTI2LCAxMDksIDIxNSwgMTg2LCAxNzcsIDE1MywgMTYwLCAxNDksCisgICAgMTM5LCAxMzksIDEzNiwgMTQwLCAxNDAsIDE0MiwgMTg2LCAgNzEsIDEyOSwgMTQ0LAorICAgIDEzMSwgMTY1LCAxNDIsIDE1MiwgMTQwLCAxNTEsIDE0MSwgMTQzLCAxMzcsIDEzOSwKKyAgICAxNDQsIDEzOCwgMTUwLCAxMzUsIDEzMywgMTI2LCAxMzYsIDE0MywgIDk5LCAxNTIsCisgICAgMTM5LCAxMzEsIDE5MCwgMTE4LCAxMjIsIDE0NywgMTM0LCAxNTUsIDEzNiwgMTQzLAorICAgIDEzOCwgMTM1LCAxMzcsIDEzMiwgMTQ3LCAxNDQsIDE1MCwgMTQ0LCAxMzgsIDEzNCwKKyAgICAxMjksIDEzMywgMTMwLCAxMzgsICA1NiwgMTc1LCAxMjksIDE2NiwgMTQ3LCAxNjUsCisgICAgMTQwLCAxMzgsIDE0NCwgMTM3LCAxNDEsIDEzMywgMTUwLCAxMzksIDEyOSwgMTM1LAorICAgICA0MCwgIDgzLCAxMjYsIDEzMCwgMTEwLCAxMjAsIDEwMCwgMTEwLCAxMjYsIDEyOCwKKyAgICAxNDEsIDE0MiwgMjE3LCAxNzUsIDE3MiwgMTUxLCAxNDYsIDE1MywgMTI1LCAxMzIsCisgICAgMTI4LCAxMzcsIDE0MSwgMTQxLCAxNDUsIDE0NSwgMTQwLCAxMzMsIDEzMiwgMTMxLAorICAgIDEyOSwgMTQ0LCAxMjgsIDE3NywgMTMzLCAxOTUsIDE0NywgMTIwLCAxMzgsIDEzMSwKKyAgICAxNjEsIDExNCwgMTY2LCAxMzQsIDE2MiwgMTE4LCAxNjEsIDExNSwgMTU1LCAxMjksCisgICAgMTM3LCAxMzYsIDE0MSwgMTI5LCAxNDEsIDEzMiwgIDU1LCAxNjgsIDEyMSwgMTI2LAorICAgIDEzNiwgMTM5LCAxMjAsIDEzMywgMTQ5LCAxNDcsIDEzMiwgMTQxLCAxMzEsIDEzNiwKKyAgICAxNDcsIDE1MCwgMTUxLCAxMzIsIDEwMSwgIDMxLCAxMTcsIDEwMSwgMTI5LCAxMzIsCisgICAgMTIyLCAxMzgsIDEyOCwgMTM3LCAxNDAsIDE3MCwgMTMxLCAxNDMsIDEzMSwgMTM0LAorICAgIDE0OSwgMTkyLCAxMjIsIDE1OCwgMTM2LCAxNDYsIDEzMywgMTY2LCAxNDMsIDE0MSwKKyAgICAxNDEsIDEzNiwgMTQxLCAxMjksIDEyNSwgMTU1LCAxNDAsIDEzOCwgMTM3LCAxMzEsCisgICAgMTExLCAxMTIsIDEzMSwgMTMyLCAxMjAsIDEyNywgMTQ5LCAxNDgsIDE1MSwgMTQxLAorICAgIDE1NiwgMTQ4LCAxMzMsIDEyOSwgMTI3LCAxMjQsIDE0NCwgMTM3LCAxNDIsIDEzOSwKKyAgICAxMzQsIDEzMywgMTQxLCAxMzgsIDEzMywgMTM1LCAxMjQsICA5NiwgMjI2LCAxNTIsCisgICAgMTE2LCAxMDgsIDEyOCwgMTA1LCAxNTUsIDEzMCwgMTUzLCAxMzgsIDE0NCwgMTM5LAorICAgIDE0MiwgMTQxLCAxMzcsIDEzNSwgMTQyLCAxNDMsIDE1NiwgMTYyLCAxMzYsICA4OSwKKyAgICAxODgsIDE0NSwgMTgxLCAxNTIsIDEzOCwgMTQ2LCAxNDYsIDE1NCwgMTQ1LCAxNDksCisgICAgMTUyLCAxMzMsIDE1OCwgMTMzLCAgNDIsIDE1MywgMTE3LCAxNDQsIDE0OSwgMTM5LAorICAgIDEyNSwgMTM5LCAxMzQsIDEyOCwgMTUwLCAxMjgsIDE0MywgMTI1LCAxMzUsIDEzMiwKKyAgICAxNDMsIDE0MSwgMTQzLCAxNDEsIDE2NCwgMTczLCAxNDEsIDE0MiwgMTU2LCAxNTUsCisgICAgMTU0LCAxNTQsIDE2OSwgMTcwLCAgNzcsICA4MCwgMTEyLCAxMDUsIDEzNSwgMTM0LAorICAgIDEyNiwgMTQzLCAxMjAsIDE3MiwgMTExLCAxNDQsIDEyMCwgMTU0LCAxMDcsIDE1MywKKyAgICAgOTUsIDEzNCwgMTA0LCAxMzQsIDEyOCwgMTE2LCAxNjMsIDEzMSwgMTUxLCAxMzYsCisgICAgMTM1LCAxMzMsIDE0MiwgMTQzLCAxNTIsIDIwNCwgMTQ5LCAxMTIsIDE1NiwgMTI4LAorICAgIDE1MCwgMTI2LCAxMjcsIDEyOSwgMTM5LCAxNzUsIDE0MywgMTQxLCAxMzgsIDEzNSwKKyAgICAxNjgsIDE0OCwgMTUyLCAxMDUsIDE2NCwgMTIxLCAxMzQsIDEyMiwgMTE5LCAxMDksCisgICAgMTIyLCAxNDgsIDEzNiwgMTQzLCAxNTMsIDEzMiwgMTU4LCAxNDgsIDE0OSwgMTUwLAorICAgIDEzMywgMTMxLCAxNDIsIDE0MSwgMTUwLCAxNDksIDE1NiwgMTczLCAxMzgsIDE1NSwKKyAgICAxMjksIDE0NCwgMTExLCAxMDcsIDEzMCwgMTI5LCAgOTYsICA4OSwgMTA2LCAxMDQsCisgICAgMTM1LCAxMzUsIDE0NCwgMTQ2LCAxMzEsIDE1MywgMTM0LCAxNTQsIDE0NiwgMTY2LAorICAgIDExNywgMTM4LCAxNjMsIDE4NywgMTkwLCAyMTYsIDE0OSwgMTU2LCAxNDksIDE1MiwKKyAgICAxNDIsIDE0MiwgMTUzLCAxNTQsIDEwOSwgMTQ1LCAgNDAsIDEwMiwgMTE2LCAxMjYsCisgICAgMTM3LCAxMzksIDE0OSwgMTU3LCAxMDgsIDEyNCwgMTM5LCAxNDYsIDE0MiwgMTQ3LAorICAgIDEzMCwgMTI2LCAxMjAsIDExMSwgMTcyLCAxNDYsIDE2OSwgMTM2LCAxNTAsIDEzNSwKKyAgICAxMjYsICA5NiwgMTU5LCAxNDMsIDE1MCwgMTIyLCAxNjIsIDEyOSwgMTU2LCAxNDIsCisgICAgMTM1LCAxNDIsIDE0NCwgMTM4LCAyMjIsIDEwOSwgMTM3LCAxNDUsIDE0NCwgMTQyLAorICAgIDE0MSwgMTQzLCAxMzgsIDEzNiwgMTI0LCAxNTAsIDEzMywgMTQ0LCAxMzcsIDE0NSwKKyAgICAxNDEsIDE0NCwgMTM5LCAxNDQsIDEzNCwgMTU0LCAxMTQsIDEzNiwgMTQ1LCAxNzMsCisgICAgMTUxLCAyMTUsIDExMCwgMTE1LCAxMjcsIDEzNCwgMTQ1LCAxNTAsIDE0NSwgMTQ0LAorICAgIDE0NCwgMTQyLCAxMzksIDEzMSwgMTQ3LCAxMzIsIDE0MSwgMTE5LCAxNDMsIDEwNiwKKyAgICAxNjUsICA0MSwgMTQ3LCAxMjksIDEyOSwgMTQ0LCAxMzgsIDEzNSwgMTM4LCAxNDAsCisgICAgMTI4LCAxNTAsICA4OSwgMTYzLCAxNTQsIDExNSwgMTQxLCAxMjcsIDEzMiwgMTQ1LAorICAgIDEzNSwgMTU3LCAxNDMsIDE0NSwgMTQwLCAxNDEsIDEyNywgMTM1LCAxMjcsIDEyOSwKKyAgICAxNDIsIDE0NywgMTE2LCAxNDcsIDEwNCwgMTYyLCAxNTMsIDE0MywgMTQ2LCAxMzAsCisgICAgMTQ0LCAxMTAsIDEzMywgMTIzLCAxMzAsIDEzNywgMTE4LCAxOTgsIDEyNiwgMTUyLAorICAgIDE1NCwgMTQ2LCAxMzksIDEyNywgMTQ3LCAxMTIsIDIwNywgMTUxLCAxNTYsIDEzNiwKKyAgICAxNjIsIDEzNywgMTA4LCAxMjEsIDEzMCwgMTM1LCAxMjUsIDEzMSwgMTMxLCAxMzQsCisgICAgMTM0LCAxMzQsIDE0MSwgMTQ0LCAxMDcsIDE0MywgMTM3LCAxNDQsIDEyNCwgMTM2LAorICAgIDExNSwgMTQ3LCAxMzAsIDE1NywgMTE5LCAxNjcsICA3MSwgMTQ0LCAgOTcsIDEyOCwKKyAgICAxMzQsIDEzOCwgMTMyLCAxMzMsIDEzOCwgMTM4LCAxNDYsIDE0NiwgMTQ3LCAxMzEsCisgICAgMTQxLCAxMzgsIDE4NSwgIDY1LCAxNDUsIDEyMywgMTM5LCAxMzAsIDE0MiwgMTI4LAorICAgIDEzOSwgMTM2LCAxNTcsIDE0NywgMTI0LCAxMTksIDE2NCwgMTQ4LCAxNzAsIDE1NCwKKyAgICAxMzMsIDEzMCwgMTU3LCAxNDgsIDE0MCwgMTQxLCAxMzAsIDEzNSwgMTM0LCAxMzcsCisgICAgMTM2LCAxMzcsIDE0MywgMTQ0LCAxNDQsIDE0NCwgMTc4LCAxODYsICA3MSwgIDczLAorICAgIDEyMCwgMTE4LCAxMjcsIDEyNCwgMTUyLCAxNTEsIDE1NSwgMTQ2LCAxNDEsIDEzOCwKKyAgICAxNDIsIDE0MywgMTM5LCAxNDMsIDEzMywgMTM0LCAxMzksIDE0MCwgMTM4LCAxMzUsCisgICAgMTQ2LCAxNDEsICA3OCwgMTk4LCAxMjksIDEzOSwgMTQxLCAxNDEsIDEzNCwgMTQxLAorICAgIDEzNywgMTM2LCAxMjAsIDEyMCwgMTI0LCAxMTgsIDE0MywgMTQ4LCAxNDgsIDE1MiwKKyAgICAxMzEsIDE0MywgMTI5LCAxMzcsIDE1MiwgMTU4LCAxNTcsIDE2MCwgMTc1LCAxNzgsCisgICAgMTM3LCAxMzksIDEzMSwgMTMzLCAxNDYsIDE1MiwgMTIxLCAxNDcsIDE0MiwgMTQzLAorICAgIDEyOSwgMTM2LCAxNDksIDE0NSwgMTk3LCAxMTQsIDEwMywgMTQxLCAxMjQsIDE0MCwKKyAgICAxNDEsIDE0MCwgMTI5LCAxMjksIDEyNywgMTMwLCAxMzEsIDEyNCwgMTIzLCAxMTcsCisgICAgMTUwLCAxMzksIDEyMCwgMTA5LCAxMTksIDEyMCwgMTYzLCAxNjMsIDExNywgMTIxLAorICAgIDEzOSwgMTM5LCAxMzYsIDEzNiwgIDk0LCAgNzQsIDE1MCwgMTQ1LCAxMjYsIDEyNywKKyAgICAxNDcsIDE1MCwgMTU4LCAxNjIsICA4NCwgIDc0LCAxMzYsIDEyOSwgMTQwLCAxMzIsCisgICAgMTM2LCAxMzUsIDE0NiwgMTQ1LCAxMjQsIDExNiwgMTI5LCAxMjAsIDEzMCwgMTI5LAorICAgIDEzMCwgMTA5LCAxMjIsIDExMSwgMTYwLCAxNDEsIDEzNSwgMTEzLCAxMzEsIDEyMSwKKyAgICAxMzYsIDEzNSwgMTM1LCAxMzUsIDE0NywgMTQ3LCAxNDAsIDE0MCwgMTQ0LCAxNDUsCisgICAgMTM5LCAxNDIsIDEzMSwgMTM3LCAxNDUsIDE0NSwgMTQzLCAxNTMsICA0OCwgIDQ5LAorICAgIDE0NSwgMTQzLCAxNTEsIDE0NywgMTU4LCAxNDYsIDEzNSwgMTI0LCAxMjQsIDExNiwKKyAgICAxNTksIDE0MCwgMTMxLCAxMjYsIDEyMywgMTIwLCAxMDMsIDExNywgMTEzLCAxMTksCisgICAgMTQ4LCAxNDYsIDEyOCwgMTI0LCAxMjMsIDEyNiwgMTIzLCAxMjAsIDE1OCwgMTQxLAorICAgIDE0OCwgMTM3LCAxNDYsIDE0MywgMTI1LCAxNDMsICA4OSwgMTA3LCAxMTYsIDEyMywKKyAgICAxNDksIDE0NywgMTQxLCAxMzksIDE0OSwgMTUzLCAxMTgsIDEyMSwgMTM5LCAxMzgsCisgICAgMTA1LCAxMTksIDE2OCwgMTQ3LCAxMzksIDE0MSwgMTQzLCAxMzgsIDEzMywgMTMwLAorICAgIDEyNiwgMTI2LCAxNDMsIDE0MiwgMTQ2LCAxNDQsIDEyNCwgMTIzLCAxNDMsIDE0NSwKKyAgICAxNDksIDE0OCwgMTQ3LCAxNDEsIDE1MSwgMTQzLCAxMTgsIDExMywgMTc1LCAxNzEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHdtYXZvaWNlX2RxX2xzcDE2cjFbMHg1MDBdID0geworICAgIDE0NywgMTQ1LCAxOTMsIDE2OCwgMTg4LCAxNTYsIDE0MSwgMTQ1LCAxNDEsIDEzOSwKKyAgICAxNDgsIDE0OSwgMTQ4LCAxNDksIDE1MywgMTU3LCAxNDQsIDE0NCwgMTUyLCAxNTIsCisgICAgMTQxLCAxNDUsIDE1MywgMTQzLCAyNDMsIDEzNCwgMTUxLCAxMzMsIDE2NiwgMTM1LAorICAgIDE1MCwgMTQ5LCAxMzUsIDEzMiwgIDMyLCAgMzksIDExMCwgMTExLCAxMDksIDExNCwKKyAgICAxMjYsIDEyNywgMTQ3LCAxNDYsIDE3NywgMTY5LCAxNjIsIDE1NiwgMjEwLCAxODcsCisgICAgMTQxLCAxNDcsICA5NSwgMTUwLCAxMjcsIDE1NSwgMTA4LCAxMzMsIDEzOSwgMTQ4LAorICAgIDEzOCwgMTM4LCAxNDAsIDE0MCwgMTQ3LCAxNDYsIDEzNCwgMTMwLCAxMzYsIDEzNCwKKyAgICAxNDcsIDE0NiwgMTQyLCAxNTAsICA2MiwgMTc0LCAxMjYsIDE1MSwgMTIyLCAxNTYsCisgICAgMTU0LCAxNTYsIDE3OSwgMTg0LCAxMTUsIDEwNywgMTA1LCAgOTksIDEyNywgMTI0LAorICAgIDE0NiwgMTMxLCAxNDAsICA0NCwgMTMyLCAxMjUsIDE1NiwgMTQ2LCAxNTMsIDE1MywKKyAgICAxMzYsIDEzNywgMTQ1LCAxNDQsIDE0MSwgMTM5LCAxNTgsIDE1MiwgMTM4LCAxMzIsCisgICAgMTQ1LCAxNDUsIDE0NywgMTQ1LCAxNDYsIDE0MSwgMTQ0LCAxNDAsIDExMCwgIDk3LAorICAgIDE0MCwgMTQxLCAxNDMsIDE0MiwgMTMwLCAxMjMsIDEyNywgMTE3LCAxMjYsIDEyMCwKKyAgICAxNDcsIDE0NiwgMTYxLCAxNTUsIDE2OSwgMTM1LCAxMjIsIDExNywgMTY2LCAxNTUsCisgICAgMTQ0LCAxNDQsIDE0MiwgMTQyLCAxMjUsIDEyMiwgMTM3LCAxMjgsIDE5NCwgMTcyLAorICAgIDEyNywgIDg1LCAxNDgsIDE0MywgMTUzLCAxNDEsIDE0NywgMTQ3LCAxNDAsIDE0MywKKyAgICAxMTgsIDE0MCwgICAwLCAgNjksICA1MSwgIDYwLCAxMTEsIDEyMywgMTM3LCAxMzUsCisgICAgMTQ2LCAxNDYsIDE2NCwgMTY1LCAyMDcsIDIxNCwgMTQ1LCAxNDMsIDE0OSwgMTQ3LAorICAgIDE3OCwgMTY4LCAxOTcsIDE3MCwgMTM0LCAxNTQsIDE0OCwgMTU5LCAxMTUsIDE0MCwKKyAgICAxMDMsIDExOCwgIDEzLCAgMzgsIDEzOSwgMTM4LCAxMzUsIDEzOCwgMTQwLCAxNDEsCisgICAgMTQ0LCAxNDQsIDE0MCwgMTQwLCAxNTAsIDE1MCwgMTU2LCAxNTcsIDE2NCwgMTcxLAorICAgIDE0MywgMTQzLCAxNDAsIDE0MiwgMTE4LCAxMjAsIDE3MiwgMTcyLCAxNjAsIDE2MywKKyAgICAxNDYsIDE0NywgMTUwLCAxNTEsIDE3NiwgMTc2LCAyMzAsIDIzNywgMTUzLCAxNTMsCisgICAgMTY4LCAxNTYsIDE3MywgMTQ5LCAxNjQsIDE0OCwgMTYyLCAxNDYsIDE3OCwgMTU4LAorICAgIDE0NywgMTQ1LCAxNDMsIDE0NSwgMTExLCAxMjYsIDExMSwgMTMwLCAgODksIDExOCwKKyAgICAxNTMsIDE1OCwgMTIyLCAxMjAsIDE0MiwgMTI1LCAxMjQsIDEwNSwgMTQ4LCAxMzgsCisgICAgMTQ1LCAxNDQsIDE1NiwgMTUxLCAxOTMsIDE1NCwgMTQ2LCAxNDcsIDExOSwgMTM1LAorICAgIDE0MiwgMTQxLCAxNDUsIDE0NSwgMTUyLCAxNDcsIDE0MiwgMTQxLCAxNDYsIDE0NiwKKyAgICAxMzksIDEzOCwgMTU0LCAxNTQsIDE0OCwgMTUwLCAxNDcsIDE0OSwgMTQ0LCAxNDUsCisgICAgMTM0LCAxMzQsIDE0MSwgMTQwLCAxMzUsIDEzNCwgMTQ1LCAxNDcsIDE2MCwgMTYzLAorICAgIDE0NCwgMTQ1LCAxNDksIDE0NiwgMTE1LCAgNjcsIDEyNywgMTE5LCAxNDEsIDEzNSwKKyAgICAxNDUsIDE0MSwgMTMwLCAxMjQsIDE0MywgMTQ0LCAxNTEsIDE2NSwgMTQxLCAxNDQsCisgICAgMTU0LCAxNTIsIDE2MCwgMTM2LCAxMTUsICA4MiwgIDY0LCAgNzEsICA2NCwgIDY1LAorICAgIDE0MywgMTQzLCAxNTEsIDE0OSwgMjQwLCAyNTEsIDE2NSwgMTczLCAxNzMsIDE3OSwKKyAgICAxNDgsIDEzNCwgMTU2LCAgNTUsIDE2MCwgMTA1LCAxMzMsICA5MSwgMTI5LCAgOTYsCisgICAgMTQ5LCAxNDksIDE0NSwgMTQ0LCAxNjAsIDE1NCwgMTcxLCAxNTksIDE0MCwgMTQyLAorICAgIDE1NCwgMTYzLCAxNzgsIDI0NCwgMTQ3LCAxNDAsIDE1MywgMTUwLCAxMzcsIDEyMSwKKyAgICAxNDUsIDE0NCwgMTQ1LCAxNDYsIDEzOCwgMTM5LCAxNDksIDE1MiwgMTg5LCAxOTgsCisgICAgMTQ4LCAxNDgsIDE1NiwgMTU4LCAxNjgsIDE4MiwgMTY1LCAxODIsIDE3MiwgMjAxLAorICAgIDE0MywgMTQyLCAgOTksICA5MiwgMTUyLCAxNTIsIDE0MywgMTQzLCAxMjcsIDEyNywKKyAgICAxNjUsIDE0OCwgMTczLCAxMjQsIDExMywgMTIyLCAxMzQsIDE0MiwgMTI3LCAxNDIsCisgICAgMTI0LCAxMjYsIDEzNywgMTM3LCAxMzEsIDEzMiwgMTQ0LCAxNDIsIDE0MSwgMTM4LAorICAgIDE3MiwgMTc2LCAxMzgsIDExMSwgMTUyLCAxMzYsIDE2NywgMTU0LCAxNTYsIDEzNywKKyAgICAxNDAsIDE1MCwgIDc4LCAxNDUsIDE1OCwgMTU3LCAxNjEsIDE1NCwgMTU1LCAxNDcsCisgICAgMTUzLCAxNjQsIDE1NiwgMTkxLCAxMjksIDEwOSwgMTUzLCAxNDYsIDE1MywgMTQxLAorICAgIDEzOCwgMTM3LCAxNDEsIDEzOCwgMTE1LCAgOTQsIDE0NCwgMTQxLCAxNTUsIDE0NywKKyAgICAxNDQsIDE0MiwgMTQ0LCAxMzcsIDE2OCwgMTEzLCAxNDEsIDEzNCwgMTQ1LCAxMzcsCisgICAgMTQ2LCAxNDQsIDE1MCwgMTQ4LCAxNDAsIDE1NSwgMTAzLCAxNzgsIDEzNywgMTQ5LAorICAgIDE0NSwgMTQ3LCAxNDgsIDE1MywgMTc1LCAyMDEsIDEzOCwgMTQ2LCAxMTAsIDEwOCwKKyAgICAxNDMsIDE0NiwgMTI0LCAxMzQsIDEyNCwgMTI3LCAxNjQsIDE1OCwgMTI3LCAxMzUsCisgICAgMTQ1LCAxNDYsIDE1MCwgMTUwLCAxNDUsIDE0NywgIDk1LCAgODAsIDE1MCwgMTUxLAorICAgIDE0OSwgMTQ5LCAxNjIsIDE2MiwgMTQ0LCAxNTIsIDE3MCwgMTY5LCAxNDUsIDE1NCwKKyAgICAxNDUsIDE0OSwgMTQzLCAxNDYsIDE0MiwgMTQ1LCAxNTIsIDE0NiwgMTYwLCAgOTgsCisgICAgMTQxLCAxNDEsIDE1MywgMTUzLCAxNDAsIDEzNywgMTMxLCAxMzEsIDE0NSwgMTQ2LAorICAgIDEzMywgMTMyLCAxMjcsIDEyNCwgMTU4LCAxNTAsIDE3MywgMTY0LCAxNzgsIDE2NywKKyAgICAxNDYsIDE0NiwgMTU0LCAxNTUsIDExNywgMTI3LCAxNDMsIDE0NywgMTQ3LCAxNTYsCisgICAgMTQyLCAxNDMsIDE0NCwgMTQ1LCAxNDYsIDE1MiwgMTcwLCAxOTksIDE1MSwgMTY1LAorICAgIDE0NiwgMTQ3LCAxMzksIDE0MCwgMTQ3LCAxNDksIDEzMiwgMTM0LCAxNDcsIDE0OSwKKyAgICAxMzgsIDEzOSwgMTQyLCAxNDMsIDE2MiwgMTg4LCAxNDUsIDE0OSwgMTYwLCAxNjQsCisgICAgMTUwLCAxNTAsIDEzOSwgMTM5LCAxNDMsIDE0MiwgMTQ2LCAxNDYsIDEzNywgMTM4LAorICAgIDE0MiwgMTQyLCAxNDEsIDE0MCwgMTUyLCAxNTMsIDE2NCwgMTcxLCAxMTAsIDExMiwKKyAgICAxMzksIDEzOSwgMTQzLCAxNDMsIDEzOCwgMTM4LCAxNDIsIDE0MiwgMTQzLCAxNDMsCisgICAgMTM3LCAxNDAsIDE0MiwgMTQyLCAxNDUsIDE0MSwgMTQ5LCAxNDEsIDE4MiwgMTM1LAorICAgIDE0NiwgMTQ2LCAxNTAsIDE1MCwgMTQ0LCAxNDUsIDE1MCwgMTUxLCAxMzUsIDEzNywKKyAgICAxMzcsIDE0NSwgIDUxLCAgNjIsICA2OCwgIDU0LCAgNjksICA1NywgIDYyLCAgNDEsCisgICAgMTM3LCAxMzksIDEzOSwgMTQ0LCAxMzUsIDE1MCwgMjI1LCAyMzIsIDIwOCwgMTk3LAorICAgIDEzNiwgMTM1LCAxNDEsIDE0MywgMTQ1LCAxNTAsIDE2MCwgMTY5LCAyMTMsIDI0NywKKyAgICAxNDIsIDEzNywgIDcyLCAgNTQsIDExMCwgMTA3LCAxMDUsIDEwNywgMTI3LCAxMzAsCisgICAgMTQ1LCAxNDMsIDE2OSwgMTU1LCAyMTksIDE3NCwgMTk1LCAxNjQsIDE4MywgMTU3LAorICAgIDE1NSwgMTU3LCAyMzksIDIzMiwgMTY5LCAxNjQsIDE3MCwgMTcyLCAxNTYsIDE1OSwKKyAgICAxNDIsIDE0MywgMTM2LCAxNDQsICA1OSwgMTAwLCAxMzksIDE0MiwgMTMwLCAxMzgsCisgICAgMTQ3LCAxNDYsIDE1MCwgMTYxLCAxMjgsIDIzNSwgMTQzLCAxNTUsIDE0NiwgMTY3LAorICAgIDE1NCwgMTQ5LCAxMjgsIDE1MSwgIDQyLCAxNDksICA1NSwgMTM2LCAgNTksIDEyNywKKyAgICAxMjgsIDEyNiwgIDc0LCAgOTIsIDE0MywgMTUzLCAxNDAsIDE1MCwgMTY2LCAxNzYsCisgICAgMTQ2LCAxNTIsIDE1MCwgMTQ1LCAxNDAsIDEwMCwgMTQwLCAxMDUsIDEyNCwgIDU5LAorICAgIDE5NSwgMTkxLCAxNDYsIDE0OCwgMTQ0LCAxMzYsIDEzNiwgMTMzLCAxMjksIDEyMiwKKyAgICAxMzMsIDE0OCwgIDQwLCAxNDcsIDEwMiwgMTQwLCAxMjMsIDE0OCwgMTE4LCAxMzYsCisgICAgMTQzLCAxNDMsIDE1MCwgMTQ4LCAxODQsIDE1MywgMTYwLCAxNDcsIDE2NiwgMTQ5LAorICAgICA1OCwgIDY4LCAxMjcsIDEzNSwgMTQxLCAxNDUsIDE0MywgMTQ3LCAxNTAsIDE1MSwKKyAgICAxNDAsIDE0MywgMTM3LCAxMzcsIDEyMCwgMTE0LCAgNzEsICA2NSwgMTI1LCAxMjMsCisgICAgMTUzLCAxNDgsIDIxNSwgMTU5LCAxMzYsIDEzNSwgMTUwLCAxNDYsIDE1MCwgMTUwLAorICAgIDE0OCwgMTM4LCAxNjYsICA5NCwgMTUwLCAxNDUsIDE0NSwgMTM5LCAxNDcsIDE0NSwKKyAgICAxNDYsIDE0NywgMTUwLCAxMzksIDE3MSwgIDYzLCAxNTgsIDE0MiwgMTUzLCAxMzMsCisgICAgMTQ3LCAxNDgsIDE0MywgMTQzLCAgNzYsICA3MiwgMTU1LCAxNTksIDE2NCwgMTc2LAorICAgIDE0OSwgMTQ5LCAxNzMsIDE5NSwgMTQ1LCAxNjUsIDEzOCwgMTQ0LCAxNTAsIDE2NywKKyAgICAxODAsIDE2OSwgMTQ2LCAxNTEsIDE0NiwgMTY2LCAxNDcsIDE2NiwgMTQ5LCAxNzEsCisgICAgMTU3LCAxNTYsIDE2OCwgMTY2LCAxNDcsIDE0OSwgMTIxLCAxMjIsIDExNiwgMTI0LAorICAgIDE0NSwgMTQ1LCAxNDcsIDE0OCwgMTcyLCAxODksIDE2OCwgMTgwLCAxNDQsIDE0NiwKKyAgICAxMzksIDE0NSwgMTQxLCAxNTAsIDExNSwgMTcyLCAxNDEsIDE0NiwgMTQzLCAxNDgsCisgICAgMTQ1LCAxNDUsIDE0MiwgMTQzLCAxNDUsIDE0NywgMTM4LCAxNDMsICA1OCwgIDczLAorICAgIDE0MSwgMTQyLCAxNDYsIDE0NSwgMTYzLCAxNDksIDIxOCwgMTYxLCAxNDcsIDEzMiwKKyAgICAxNTIsIDE0NywgMTQ2LCAxNDcsIDE0MCwgMTUwLCAxNDEsIDE1MiwgIDg5LCAxNTAsCisgICAgIDc4LCAxMzQsIDEzNSwgMTM3LCAxMzksIDE0MiwgMTQwLCAxMzcsIDEzNywgMTMwLAorICAgIDE0NCwgMTQ0LCAxNTIsIDE1MSwgMTQ1LCAxNDAsIDE4MSwgMTcwLCAxOTEsIDE2OCwKKyAgICAxNjQsIDE2NiwgMTM2LCAxNDgsIDExMiwgMTI0LCAxMzksIDE0NCwgMTQ2LCAxNDksCisgICAgMTQyLCAxNTEsIDExMywgMTgyLCAxMzcsIDE1MCwgMTQzLCAxNTYsIDEzOCwgMTQ3LAorICAgIDE1NCwgMTU2LCAxMDgsIDEwMiwgMTE4LCAxMTksIDEzMywgMTM5LCAxMTMsIDExMSwKKyAgICAxNDUsIDE0NCwgMTUwLCAxNDcsIDE3NSwgMTUxLCAxMDQsIDEwNiwgMTE2LCAxMTQsCisgICAgMTQzLCAxNDQsIDE1MSwgMTU3LCAxNTEsIDE5MSwgMTM1LCAxMTMsIDEzOCwgMTIzLAorICAgIDE0NiwgMTQ2LCAxNTUsIDE1NywgMTA2LCAxNDUsIDEzMiwgMTI3LCAxNDAsIDEyNSwKKyAgICAxNjEsIDE2NSwgMTQ2LCAxNTAsIDE1MSwgMTU0LCAxMzksIDE0MCwgMTQyLCAxNDMsCisgICAgMTQ0LCAxNDgsIDE0NSwgMTQ5LCAxNDcsIDEzOCwgMTY4LCAxMDQsIDE0NiwgMTM2LAorICAgIDEzOCwgMTQwLCAgOTEsIDEwOCwgMTExLCAxMTAsIDE0NSwgMTQwLCAxNTgsIDE1NCwKKyAgICAxMzAsIDExMiwgMTIyLCAxMTgsIDEzNiwgMTM1LCAxMTksIDExOCwgMTQxLCAxNDAsCisgICAgMTQ3LCAxNDYsIDE0NiwgMTQ1LCAxMzgsIDEzOCwgMTgyLCAxODgsIDEzMiwgMTMyLAorICAgIDE0NCwgMTQ0LCAxNTYsIDE1NSwgMTY4LCAxNzIsIDEyMywgMTI4LCAxNDQsIDE1MSwKKyAgICAxNDIsIDE0MCwgMTQ1LCAxNDUsIDEzNywgMTQ0LCAxNDEsIDE1MiwgMTI4LCAxODgsCisgICAgMTQ5LCAxNDksIDE2MCwgMTYxLCAxNjAsIDE2MCwgMTY2LCAxNjMsIDEzMCwgMTA3LAorICAgIDE0MywgMTQzLCAxNDIsIDE0MiwgMTQ5LCAxNDksIDEzMiwgMTMyLCAxNzAsIDE3NCwKKyAgICAxNDgsIDE0OCwgMTU0LCAxNTMsIDExOCwgMTExLCAxNTcsIDE1NSwgMTE0LCAxMDksCisgICAgMTQwLCAxMzksIDEzOCwgMTM3LCAyMDUsIDE4NywgMTM3LCAxMzMsIDE0NywgMTQ0LAorICAgIDE0NCwgMTQ1LCAxNDcsIDE0OSwgMTA1LCAxMjUsIDEwOCwgMTE3LCAxNTUsIDE2MiwKKyAgICAxNDYsIDE0NiwgMTYyLCAxNTcsIDE0NCwgMTIyLCAxNTQsIDE0MywgMTYxLCAxMzksCisgICAgMTQxLCAxNDIsIDEzMCwgMTMxLCAxNDQsIDE0NCwgMTQyLCAxNDEsIDE0NCwgMTQyLAorICAgIDEzMiwgMTMyLCAxNDEsIDE0MSwgMTUwLCAxNTEsIDEzOSwgMTQxLCAxNTEsIDE1MywKKyAgICAxNDIsIDE0MiwgMTU0LCAxNTQsIDE1MCwgMTUwLCAxNDgsIDE0OCwgMTY2LCAxNjUsCisgICAgMTQzLCAxNDIsIDE0NCwgMTQ0LCAxMzIsIDEzMiwgMTQyLCAxNDQsIDEzMCwgMTI4LAorICAgIDE0MiwgMTQyLCAxNDMsIDE0MywgMTUzLCAxNTMsIDE0NywgMTQyLCAxMjksIDEyNSwKKyAgICAxNDIsIDE0MSwgMTQzLCAxNDIsIDE0MywgMTQ3LCAxMDUsIDEyMiwgMTM1LCAxNDAsCisgICAgMTQxLCAxNDAsIDE0MCwgMTQwLCAxNTEsIDE1MSwgMTU2LCAxNTUsIDE0NiwgMTQ2LAorICAgIDEzMywgMTM0LCAxNDAsIDE0MiwgMTQyLCAxNDUsIDE0MSwgMTQ2LCAxMTIsIDEzMywKKyAgICAxNDIsIDE0MiwgMTQ1LCAxNDUsIDEzNywgMTM4LCAxNTUsIDE1NywgMTQ5LCAxNTAsCisgICAgMTQ0LCAxNDQsIDEzOSwgMTM4LCAxMzAsIDEyOCwgMTMyLCAxMzEsIDE0NywgMTQ3LAorICAgIDEzOSwgMTQwLCAxNDIsIDE0MywgMTE1LCAxMjEsIDE0MSwgMTQzLCAxMzcsIDE0MSwKKyAgICAxNDYsIDE0NiwgMTUwLCAxNTAsIDE0NSwgMTQ0LCAxMzMsIDEzMywgMTMzLCAxMzUsCisgICAgMTQzLCAxNDQsIDE0NCwgMTQ0LCAxNjYsIDE2NywgMTM5LCAxNDIsIDEzOSwgMTQwLAorICAgIDE1MCwgMTQ5LCAxMzgsIDEzOCwgMTQyLCAxNDAsIDE0OCwgMTQ3LCAxNjAsIDE1NSwKKyAgICAxNDYsIDE0NiwgMTQ3LCAxNDcsIDEzOCwgMTM3LCAxNDMsIDE0MiwgMTUxLCAxNTAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHdtYXZvaWNlX2RxX2xzcDE2cjJbMHg1MDBdID0geworICAgICA5OCwgIDk4LCAxMTksIDEyMSwgMTA5LCAxMTIsIDEyOCwgMTM1LCAxMTUsIDEyMSwKKyAgICAxNTksIDExMywgMTEzLCAxMDYsIDEyNywgMTE0LCAxMDEsIDEwMiwgMTA1LCAxMTEsCisgICAgMTYxLCAxNjIsIDEzNywgMTM4LCAxNjEsIDE1OSwgMTUyLCAxNTAsIDE1MCwgMTQ4LAorICAgIDEyOCwgIDc5LCAxMzEsIDEwMiwgMTQyLCAxMjAsIDEzMywgMTE5LCAxMzAsIDExNywKKyAgICAxMjEsIDExNSwgMTQyLCAxMzMsIDE4NiwgMTU1LCAxNzksIDE0NCwgMTY5LCAxMzUsCisgICAgMTA3LCAxMDMsIDEwNiwgMTA2LCAxMjIsIDEyMiwgMTExLCAxMTIsIDExMiwgMTE1LAorICAgIDEyNywgMTIzLCAxMTgsIDExNSwgMTI4LCAxMjUsIDEyMywgMTE5LCAxMTUsIDEwOSwKKyAgICAxMjQsIDEzMCwgMTE3LCAxMjYsIDEyMSwgMTMzLCAgODQsIDE0NCwgIDk5LCAxMTQsCisgICAgMTIyLCAxMjUsIDEyMywgMTMxLCAxMjQsIDEzNSwgMTc2LCAyMDAsIDE1OCwgMTc2LAorICAgICA2OCwgIDc0LCAgODYsICA4NywgMTE3LCAxMTUsIDExOSwgMTE2LCAxMzUsIDEyOCwKKyAgICAxMTUsIDExNiwgMTAyLCAxMDQsIDExOSwgMTIzLCAxMzMsIDE0OCwgMTAyLCAxMDksCisgICAgIDcxLCAxMjEsIDEwNiwgMTE3LCAxMDcsIDEyNywgMTA2LCAxMjIsIDEwMCwgMTEwLAorICAgIDExNywgMTE1LCAxMjksIDEyOCwgIDg3LCAgODQsIDExNiwgMTE2LCAxNTEsIDE1NywKKyAgICAxMTYsIDEyOCwgMTEwLCAxMTcsIDExOSwgMTM0LCAxMDAsIDExNCwgMTIwLCAxMjksCisgICAgMTQyLCAxNDEsIDE0NiwgMTUxLCAgOTQsICA5MSwgMTE0LCAxMTQsIDExOCwgMTE4LAorICAgIDExNCwgMTEyLCAxMTIsIDEwOSwgMTE1LCAxMTIsIDEyMywgMTIzLCAxNDcsIDE0OCwKKyAgICAxMTAsIDE2NCwgMTA2LCAxNTIsIDExMCwgMTU4LCAxMDYsIDE1MSwgMTA1LCAxMzUsCisgICAgIDg1LCAgNTEsICA3MSwgIDI3LCAgNzEsICAzNCwgIDc0LCAgNDUsICA4NSwgIDUzLAorICAgIDE0NSwgMTM0LCAxNDAsIDEzMCwgMTM2LCAxMzQsIDExOCwgMTIyLCAxMTgsIDEyNiwKKyAgICAxMTcsICA4NCwgMTIxLCAgODEsIDEwNiwgIDgwLCAxMDksIDEwNiwgMTIxLCAxMjcsCisgICAgIDk1LCAgOTQsIDExMiwgMTEwLCAgOTAsICA5NCwgMTA5LCAxMDcsIDExNCwgMTA5LAorICAgIDExNywgMTE4LCAxMTgsIDEyMywgMTA3LCAxMDcsICA4NiwgIDkzLCAgMjksICAzMSwKKyAgICAxMjUsIDExMiwgMTA0LCAgNjAsIDEyMSwgMTExLCAxMjcsIDExNiwgMTMzLCAxMzAsCisgICAgMTE4LCAxMTcsIDE0OCwgMTQ1LCAxMjIsIDEyNiwgMTI0LCAxMjcsICA5MCwgIDkxLAorICAgIDExMywgMTEwLCAxMTksIDExOCwgMTUyLCAxNDcsIDExNSwgMTEyLCAxMzIsIDEzMSwKKyAgICAxMjksIDE0MCwgIDk4LCAxMTIsICA3MywgIDg1LCAxMDksIDExNSwgMTIyLCAxMjYsCisgICAgMTIzLCAxMjIsIDEyMiwgMTIyLCAxMjYsIDEyNSwgMTM3LCAxNDAsIDIwMywgMjEwLAorICAgIDE2NCwgMTc2LCAxMTQsIDExNCwgMTI1LCAxMjIsIDExOSwgMTEyLCAxMjUsIDEyMCwKKyAgICAxMjQsIDEyMiwgMTE4LCAxMTUsICA5NSwgIDk2LCAxNDEsIDE0NCwgMTMyLCAxMzEsCisgICAgMTI3LCAxMzAsIDEzMiwgMTM0LCAxMTYsIDExNCwgMTIyLCAxMjMsIDEzNywgMTM0LAorICAgIDExMSwgMTExLCAxMTIsIDExNiwgMTA2LCAxMTgsICA3NywgMTAxLCAxMDQsIDExNSwKKyAgICAxMTEsIDExMSwgMTI1LCAxMjYsIDExOCwgMTIxLCAxMTMsIDExNSwgMTEzLCAxMTMsCisgICAgMTcxLCAxNzAsIDIwMiwgMTk5LCAyMjEsIDIwNiwgMTk5LCAxODQsIDE3NywgMTY3LAorICAgICA3MywgIDkwLCAgNjEsICA5MywgIDQzLCAgNzQsICA1MSwgIDcxLCAgNTEsICA3MiwKKyAgICAxMzAsIDEzMCwgMTQwLCAxMzcsIDEzNCwgMTMyLCAxNjQsIDE2MCwgMTE4LCAxMTEsCisgICAgMTIzLCAxMzYsIDEzMywgMTU0LCAxMzAsIDE1OCwgMTA2LCAxMTAsIDExMCwgMTE0LAorICAgICA5NywgIDk3LCAgOTEsICA5NCwgIDcwLCAgNjksIDEyNSwgMTIzLCAxNDEsIDE0MCwKKyAgICAxMTksIDEwMCwgMTE2LCAgNzcsIDExMSwgIDY3LCAxMDUsICA1MiwgIDk1LCAgMzQsCisgICAgMTAwLCAxMjIsICA5MCwgMTI0LCAgNjgsIDEyMCwgIDQzLCAxMTcsICA1MCwgMTEyLAorICAgIDEzMCwgMTI5LCAxOTIsIDE4OCwgMTIzLCAxMTgsIDEyNCwgMTE3LCAxMjEsIDExNSwKKyAgICAxMjIsIDExMSwgMTI5LCAxMTEsIDE1NywgIDg1LCAxMjUsIDEwOSwgMTI1LCAxMTksCisgICAgMTQzLCAxNTIsIDExOSwgMTI4LCAxMTQsIDExNiwgMTI5LCAxMzYsIDE0OCwgMTU3LAorICAgIDExOSwgMTE3LCAxMTUsIDExNSwgMTUwLCAxNDgsIDE2MywgMTU0LCAxMDksIDEwMiwKKyAgICAxMjAsIDEyNiwgIDczLCAxMTksIDEwNiwgMTIxLCAxMDIsIDEyMiwgIDk2LCAxMTMsCisgICAgIDg0LCAgODMsIDExNywgMTE1LCAxMjIsIDExNywgMTU0LCAxNDMsIDE1OSwgMTQyLAorICAgIDExOCwgMTIyLCAxMTQsIDExNywgMTE1LCAxMjIsIDExNCwgMTMwLCAgOTksIDE1NiwKKyAgICAxMjMsIDEyMCwgMTIyLCAxMTYsIDEwMCwgIDgxLCAgOTksICA5MSwgMTIxLCAxMTIsCisgICAgMTM5LCAxMzEsIDE2NCwgMTQyLCAxMzIsIDExOSwgMTQ1LCAxMzMsIDE1NywgMTQxLAorICAgIDExMiwgMTA5LCAxMTgsIDExNiwgMTQyLCAxMzQsIDEwOCwgMTEwLCAgOTYsICA5OSwKKyAgICAxMTEsIDExMCwgMTEzLCAxMTIsIDExMSwgMTA0LCAgOTgsICA5NCwgMTMxLCAxMzEsCisgICAgMTE1LCAxMTQsIDEyMSwgMTE4LCAxMjAsIDExNSwgMTczLCAxNDgsIDEyMywgMTE3LAorICAgIDEyMSwgMTI0LCAxMjIsIDEyNCwgMTQwLCAxNDYsICA3OCwgIDgyLCAgOTYsICA5MywKKyAgICAgODYsICA5MCwgMTI0LCAxMjUsIDEyMSwgMTIzLCAxMDUsIDEwNiwgMTM0LCAxMzUsCisgICAgMTA3LCAxMDksIDEzMiwgMTQxLCAxMDAsICA5NSwgMTEzLCAxMTQsIDEwMiwgMTA1LAorICAgIDExMywgMTMwLCAgOTgsIDE0NSwgMTE2LCAxMTUsIDEyNCwgMTE3LCAxMTUsIDEwNSwKKyAgICAxMjAsIDEyMywgIDg5LCAgODcsIDEwOSwgMTA4LCAxMDIsIDEwMSwgMTE3LCAxMTcsCisgICAgMTEzLCAxMjIsIDEzMiwgMTM4LCAgNzcsIDExNiwgIDg2LCAgOTksIDExOCwgMTI2LAorICAgIDEyMywgMTIwLCAxMTcsIDExMSwgMTI0LCAxMTksIDEyOSwgMTE4LCAgNjMsICA1OCwKKyAgICAxNDEsIDEzNSwgMTA4LCAxMDYsIDEwOSwgMTExLCAxMDgsIDExMCwgMTM1LCAxMzgsCisgICAgMTE3LCAxMTQsIDEzNCwgMTI3LCAxMzksIDEyOSwgMTM4LCAxMzAsIDEyNiwgMTIyLAorICAgIDEyMSwgMTE4LCAxMjQsIDEyMSwgMTMzLCAxMzAsICA5OCwgIDg1LCAxMzAsIDEyMywKKyAgICAxNDcsIDEyOSwgMTE4LCAxMTIsIDE0OCwgMTMwLCAxMzYsIDEyMywgMTQ4LCAxMzEsCisgICAgMTEzLCAxMTIsIDEyMywgMTE4LCAxMjMsIDExNSwgMTQ3LCAgOTUsIDExNywgMTEwLAorICAgIDExOCwgMTE5LCAxMTIsIDExMywgMTEyLCAxMTMsIDExOSwgMTE5LCAxMjAsIDEyMCwKKyAgICAxNTgsIDEzMywgMTk4LCAxNDUsIDE4OCwgMTI5LCAxOTcsIDEzNywgMTk1LCAxMzMsCisgICAgMTMyLCAxNDAsIDE0MCwgMTM5LCAxNTgsIDE1NiwgMjIzLCAyMTcsIDIzMywgMjMzLAorICAgICA0OCwgIDU2LCAgMzQsICAzNywgIDgyLCAgODQsIDEwMiwgMTAyLCAxMDgsIDExMCwKKyAgICAxMjAsIDE0MiwgMTM2LCAxNjksIDE0NiwgMTk1LCAxMzYsIDE4NiwgMTQwLCAxODIsCisgICAgMTk2LCAxODYsIDE1OCwgMTU1LCAxNDIsIDEzNCwgMTMyLCAxMjUsIDEyMCwgMTE5LAorICAgICA5NywgMTA1LCAgNzIsICA3NSwgIDgyLCAgODUsICA4MSwgIDg0LCAxMDcsIDEwOSwKKyAgICAgNjcsIDEyMSwgIDQzLCAxMTksICA2OSwgMTI0LCAgODcsIDEyOSwgIDg4LCAxMjgsCisgICAgIDUzLCAgNTcsICA5MywgIDk4LCAgOTEsICA5NCwgIDkzLCAgOTgsIDEwNCwgMTA0LAorICAgIDEyNCwgMTIzLCAxMzMsIDEzMywgMTgyLCAxODEsIDExOSwgMTIxLCAxMTQsIDExNiwKKyAgICAxMjgsIDEwNSwgMTM0LCAxMTIsIDEzMSwgIDcyLCAxMTksICA1OSwgMTExLCAgODQsCisgICAgMTMyLCAxNDIsIDE0NSwgMTgwLCAxMjQsIDEzMiwgMTMxLCAxNDMsIDEyMiwgMTM0LAorICAgICA4OCwgIDg1LCAxMDMsIDEwMywgMTM2LCAxNDAsIDEzMSwgMTQzLCAxMTQsIDEzMiwKKyAgICAxMTYsICA1NywgMTEzLCAgNTcsIDEyMSwgIDc2LCAxMjYsICA4MCwgMTE4LCAgODYsCisgICAgMTI3LCAxMTIsIDEyNywgIDk3LCAxMzEsIDEwMCwgMTQ5LCAgOTEsIDE2MywgIDg2LAorICAgIDEyMiwgMTE5LCAxMjgsIDEyMSwgMTI4LCAxMTYsIDE0MiwgMTI3LCAxNzMsIDEzOSwKKyAgICAxNjIsIDExNiwgMTY2LCAxMDcsIDE0OSwgMTAzLCAxNTIsIDEwNywgMTQxLCAxMDgsCisgICAgMTE0LCAxMTMsIDExOCwgMTE2LCAgNTYsICA0MywgIDkwLCAgOTAsIDEwNSwgMTA1LAorICAgIDEzMiwgMTM0LCAxMTAsIDEwNywgMTA2LCAxMDUsICA4MiwgIDg0LCAgODQsICA4NCwKKyAgICAxMDIsIDEwNiwgIDc5LCAgODksICA5OSwgIDk5LCAxMjcsIDEyOSwgMTE0LCAxMTgsCisgICAgMTM5LCAxNTcsIDExNiwgMTIzLCAxMTYsIDEyMywgIDg3LCAgODksIDExMCwgMTEzLAorICAgIDExOSwgMTI2LCAgOTcsICA5NywgMTU1LCAxNjMsIDE0MiwgMTUzLCAxNDMsIDE0NiwKKyAgICAxMTcsIDExNCwgIDY2LCAgNjcsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTE0LCAxMTMsCisgICAgMTExLCAxMTQsIDEyNywgMTMzLCAxMjMsIDEzMiwgMTQzLCAxNjIsIDEzMywgMTQ4LAorICAgIDEwNSwgMTA4LCAxMTQsIDExNCwgMTEwLCAxMDksICA1NywgIDQ4LCAxMDksIDEwNiwKKyAgICAxMTMsIDEzMCwgMTA0LCAxMzEsICA4OCwgMTM5LCAxMDIsIDE2OSwgMTAwLCAxNzIsCisgICAgMTI5LCAxMTQsIDE1MCwgIDk3LCAxMTQsIDExMiwgMTE3LCAxMTksIDEwOSwgMTE2LAorICAgICA5MiwgMTA3LCAgOTYsIDExNiwgIDkwLCAxMjUsIDEwMSwgMTIyLCAxMjUsIDE0MCwKKyAgICAxMjUsIDEzMywgMTIyLCAxMjksIDEzNiwgMTUzLCAxMjUsIDEzNSwgMTMxLCAxMzksCisgICAgIDg0LCAgNzEsIDEyOSwgMTIzLCAxMzUsIDEyMCwgMTE0LCAxMDMsIDExMiwgMTAxLAorICAgIDEwOCwgMTIxLCAxMTUsIDE1NiwgMTA2LCAxMjMsIDExNiwgMTMxLCAxMjcsIDEzOSwKKyAgICAxMzcsIDE0NywgMTA5LCAxMTcsIDExOSwgMTI2LCAxMzUsIDE0NCwgMTE3LCAxMTksCisgICAgMTIwLCAxMjcsICA3NiwgMTA1LCAxMTEsIDExNiwgMTIwLCAxMjUsIDE0MSwgMTM4LAorICAgIDEwNywgMTA0LCAxNjIsIDE1NSwgMTM1LCAxMzAsIDEyNywgMTIzLCAxMjcsIDEyMSwKKyAgICAxMDIsIDEwNCwgIDg0LCAgODcsIDExMiwgMTE1LCAgOTcsIDEwMiwgIDc4LCAgODIsCisgICAgMTE5LCAxMTgsIDEyMCwgMTIzLCAgOTEsIDEwNSwgMTE0LCAxMTksIDExOSwgMTI2LAorICAgIDEzMCwgMTI2LCAxMzQsIDEyNiwgMTU4LCAxMzQsIDEzMywgIDk5LCAxMTYsIDEwMCwKKyAgICAxMjUsIDEyMiwgMTQ1LCAxNDMsIDEyNiwgMTE3LCAgOTgsICA5NiwgMTIxLCAxMjAsCisgICAgMTUyLCAxNDgsIDEzMSwgMTI2LCAxMzAsIDEyOSwgMTI2LCAxMTksICA4NywgIDg3LAorICAgIDEzMSwgMTMxLCAxMzksIDEzNywgMTAxLCAxMDIsIDEwNCwgMTA1LCAgODYsICA4MywKKyAgICAgOTIsICA4OSwgMTExLCAxMDUsIDEyMSwgMTE1LCAxMzcsIDEyNCwgIDk2LCAgODQsCisgICAgMTAwLCAgOTYsIDEyMiwgMTE5LCAxMDcsIDEwOCwgIDkzLCAgOTYsICA3OSwgIDgyLAorICAgIDEyOCwgMTIzLCAxMDgsIDEwNiwgMTIzLCAxMjAsIDE1MCwgMTUwLCAxNDMsIDE0MCwKKyAgICAxMjEsIDEyMCwgIDk3LCAgOTksICA3OSwgIDgwLCAxMTYsIDExNiwgIDg4LCAgOTAsCisgICAgMTI4LCAxMzEsIDEwMSwgIDk3LCAxNDAsIDE0MCwgMTE3LCAxMTYsIDExNiwgMTE4LAorICAgIDEzNywgMTM1LCAxMDAsICA5MSwgMTE1LCAxMTIsIDEzNCwgMTIxLCAxMDcsICA5OSwKKyAgICAxMjAsIDEyMiwgMTIyLCAxMjUsIDEyNCwgMTI2LCAxMzYsIDE0MSwgIDg5LCAgOTUsCisgICAgMTAzLCAxMTksIDEwMywgMTE2LCAxMjIsIDEzOSwgMTI1LCAxMzcsIDE1MiwgMTcwLAorICAgIDEyMSwgMTIyLCAxMjQsIDEyNCwgIDk4LCAgOTcsIDEzNywgMTQwLCAgOTYsICA5MiwKKyAgICAxMTUsIDExMywgMTM2LCAxMzYsIDEyOCwgMTMyLCAxMjIsIDEyNCwgMTUxLCAxNTgsCisgICAgMTAwLCAxMDcsIDEyMSwgMTMxLCAxMzEsIDE1OCwgMTE5LCAxMzAsIDExMywgMTE0LAorICAgIDExNCwgMTA5LCAxNDgsIDEzMCwgMTAzLCAgOTUsIDEyNywgMTE2LCAxMzcsIDEyMCwKKyAgICAxMDMsIDEwOCwgIDk3LCAgOTcsIDEzMywgMTI4LCAxMTMsIDEwOSwgMTM2LCAxMjgsCisgICAgMTI1LCAxMjQsIDExOCwgMTE4LCAxMjIsIDEyMSwgMTAxLCAgOTksIDE1NywgMTUyLAorICAgIDEzOCwgMTM0LCAxMjQsIDExNSwgMTEzLCAxMDEsIDEyMywgMTEyLCAxMjQsIDExMCwKKyAgICAxMTYsIDExMywgMTI4LCAxMjEsIDExOSwgMTEwLCAxMjQsIDExMywgMTI4LCAgNjcsCisgICAgMTE0LCAxMTgsIDExNCwgMTIzLCAxMDksIDEyMSwgMTAyLCAxMjMsICA1NiwgMTE2LAorICAgIDExNywgMTExLCAxMTIsICA5OSwgMTI0LCAxMTQsIDExMiwgIDc5LCAxMTQsICA4OCwKKyAgICAxMTIsIDExMywgMTE1LCAxMTcsIDEyNiwgMTI3LCAxMzAsIDEzMiwgMTIzLCAxMjIsCisgICAgMTExLCAxMDQsIDExMSwgMTAyLCAxMTIsIDEwMiwgMTI5LCAxMTgsIDEyOSwgMTE1LAorICAgIDEyMywgMTI0LCAxMzAsIDEzMywgMTE0LCAxMTcsIDEyNSwgMTI3LCAxMTIsIDExNywKKyAgICAxMjQsIDEyNSwgMTE5LCAxMjAsIDExNywgMTE2LCAxMDUsIDEwNCwgMTEwLCAxMTAsCisgICAgMTI1LCAxMjQsIDExOCwgMTE2LCAxMjQsIDEyMywgMTI0LCAxMjEsIDEzMywgMTMyLAorICAgIDExMSwgMTExLCAxMjQsIDEyNCwgMTIwLCAxMTksIDExNiwgMTE2LCAxMzQsIDEzMCwKKyAgICAxMTQsIDExNiwgMTEyLCAxMTMsIDEwOSwgMTExLCAxMTYsIDExOCwgIDk1LCAgOTgKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHdtYXZvaWNlX2RxX2xzcDE2cjNbMHg2MDBdID0geworICAgICA4NCwgIDgyLCAgOTUsICA5NCwgMTI1LCAxMzEsICA5OCwgMTAyLCAgOTQsICA5MywgMTA0LCAxMDQsCisgICAgMTI3LCAxMTMsICA4NywgIDc3LCAxMjUsIDExNCwgMTA5LCAgOTQsICA5NCwgIDkxLCAxMDYsIDEwNSwKKyAgICAxNjgsIDEyNSwgMTYzLCAxMjAsIDEyOCwgMTAwLCAxMTksICA5OSwgMTA4LCAgOTcsIDEwOCwgMTA2LAorICAgICA4NiwgIDg1LCAxMjgsIDEyNSwgIDc5LCAgNzMsIDEwMywgMTAyLCAxMjMsIDEyMywgMTE2LCAxMTcsCisgICAgIDg0LCAgNzYsIDEzNSwgMTMxLCAxMzMsIDEzMywgMTI5LCAxMzAsIDEyNSwgMTIzLCAxMTUsIDExNCwKKyAgICAgOTQsICA5NywgIDc5LCAgODEsIDExNSwgMTE1LCAgOTQsICA5MywgMTI4LCAxMjcsIDEyNiwgMTI1LAorICAgIDEyNCwgMTExLCAxMDUsIDExNCwgMTA0LCAxMTcsIDEwOSwgMTEwLCAxMjQsIDEyNSwgMTE4LCAxMTcsCisgICAgMTA3LCAxMTAsIDEwNiwgMTEwLCAgOTMsICA5MywgMTQ5LCAxNDgsIDExOCwgMTE5LCAxMTEsIDExMCwKKyAgICAxNDcsIDE1NywgMTQzLCAxNTYsIDEzNCwgMTM2LCAxMTgsIDEyMSwgMTA2LCAxMDcsIDEwNSwgMTA1LAorICAgIDExNCwgIDgzLCAxMTQsICA0NiwgMTA2LCAgNTMsIDExMCwgIDgzLCAxMDcsICA5NCwgMTA1LCAxMDMsCisgICAgIDkyLCAgOTAsIDEwOSwgMTA2LCAxNzIsIDE2MCwgMTE0LCAxMTAsIDEwOSwgMTEwLCAxMTAsIDEwOSwKKyAgICAgOTAsICA5OCwgIDk4LCAxMDksIDEwMiwgIDk4LCAgOTcsICA5MiwgMTAwLCAxMDAsIDEwMSwgMTAyLAorICAgIDEyMywgMTE3LCAxMjQsICA5OCwgIDgyLCAgODAsIDExNywgMTE1LCAxMTIsIDExMCwgMTA5LCAxMDgsCisgICAgMTA3LCAxMTEsIDEwMCwgMTE1LCAxMDUsIDEyMCwgMTA0LCAxMDUsICA4MywgIDgyLCAgOTUsICA5NiwKKyAgICAxMDksIDEyMCwgIDcyLCAgNzEsICA5NywgMTA0LCAgNjksICA3NCwgIDk5LCAxMDIsIDExOCwgMTE3LAorICAgIDEzNywgMTMzLCAxNDIsIDEzNSwgMTA1LCAxMTAsIDEyMSwgMTIxLCAxMjUsIDEyMiwgMTE0LCAxMTIsCisgICAgMTUxLCAxODYsIDExNSwgMTMyLCAxMDMsIDExMSwgMTAwLCAxMDQsICA5OSwgMTAxLCAxMDQsIDEwNSwKKyAgICAgMTgsICAzOCwgIDU2LCAgNjUsICA3NiwgIDgzLCAgODUsICA5MSwgMTAxLCAxMDMsIDEwOCwgMTEwLAorICAgIDE0NCwgMTM1LCAxMjYsIDEyMSwgMTE1LCAxMTMsICA3OSwgIDgwLCAxMTgsIDExNywgMTE3LCAxMTcsCisgICAgMTE3LCAxMjQsIDExNSwgMTE1LCAxMjYsIDExMywgMTMwLCAxMTYsIDExMiwgMTA2LCAxMDgsIDEwNSwKKyAgICAgNzcsICA3NiwgIDc2LCAgODAsIDEwOSwgMTA5LCAxMjUsIDEyOSwgMTMwLCAxMzMsIDExNiwgMTE4LAorICAgICA5NiwgIDg2LCAxMDksICA5OSwgMTAyLCAgNjksICA4NCwgIDY5LCAxMDcsIDEwMywgMTE0LCAxMTMsCisgICAgIDc4LCAxMTgsICA4MiwgMTE0LCAgODQsIDEyOSwgIDY5LCAxMTIsICA3OCwgIDk4LCAgOTYsIDEwMywKKyAgICAgODksIDEzNywgIDk2LCAxMTEsIDEwNSwgIDk3LCAgOTMsICA5MywgMTAxLCAxMDUsIDEwNSwgMTA1LAorICAgIDE0MSwgMTIzLCAxMDIsICA5MywgIDkxLCAgNzksICA4NywgIDgxLCAxMDIsICA5OSwgMTA5LCAxMDgsCisgICAgIDk0LCAgOTIsIDEyNCwgMTIzLCAxMzAsIDEzNCwgMTAwLCAxMDcsICA3MSwgIDc1LCAgOTIsICA5MSwKKyAgICAgOTQsIDEwNCwgMTA3LCAgODMsIDEwNiwgMTAxLCAxMTMsIDExNCwgMTIyLCAxMjIsIDExNCwgMTE0LAorICAgIDExOCwgMTI0LCAxMDMsIDEwNiwgIDk1LCAxMTYsICA5MCwgIDkzLCAxMDcsIDEwNCwgMTA5LCAxMDcsCisgICAgMTE2LCAxMTgsICA3NiwgIDcyLCAgODgsICA4OCwgMTMyLCAxMzIsIDE0MCwgMTQxLCAxMTYsIDExNiwKKyAgICAgOTAsICA4MSwgMTExLCAgOTUsIDEzOSwgIDk3LCAxMjMsICA5NiwgMTEyLCAxMDAsIDExMCwgMTA4LAorICAgIDExMiwgMTE2LCAxMzMsIDE0MCwgMTEyLCAxMjAsICA4MCwgIDg1LCAgNTUsICA1NSwgIDg1LCAgODQsCisgICAgMTI1LCAgOTQsIDExMSwgMTA0LCAxMTYsIDEwMywgMTEyLCAgODYsICA5MywgIDg0LCAgOTksICA5OCwKKyAgICAxODAsIDE3OSwgMTk3LCAxOTcsIDE2OSwgMTYzLCAxNDksIDE0NiwgMTMwLCAxMjQsIDExNiwgMTE1LAorICAgICA3NiwgIDQ3LCAgMzYsICAxMSwgIDQzLCAgMjgsICA2NiwgIDUzLCAgODIsICA4MCwgMTAyLCAgOTksCisgICAgMTE5LCAxMjMsIDE3NiwgMjAxLCAxMTMsIDEyMCwgMTEyLCAxMTEsIDEwMywgMTA1LCAxMDYsIDExMCwKKyAgICAxNDUsIDExNCwgMTEyLCAgODksIDEyMCwgIDkzLCAxMjMsIDEwNCwgMTMxLCAxMjMsIDExMywgMTExLAorICAgICA5NywgMTA5LCAgODIsIDEwNiwgIDc1LCAxMDQsIDEwMywgMTE1LCAxMjAsIDEyNCwgMTExLCAxMTQsCisgICAgMTE0LCAxMTEsIDExMywgMTA1LCAgMzQsICAzMywgIDYzLCAgNjMsIDEwNSwgMTA2LCAxMjIsIDEyMiwKKyAgICAgNTEsICA0MSwgIDk2LCAgOTIsIDEyNSwgMTI1LCAxMTgsIDExOCwgMTE4LCAxMTksIDExMywgMTEzLAorICAgIDExMSwgMTgwLCAxMDgsIDE3OCwgMTA3LCAxNzEsIDExMCwgMTYwLCAxMDUsIDEzNiwgMTAyLCAxMTcsCisgICAgIDc2LCAgNzksICA5MCwgIDkyLCAgODAsICA4OCwgIDg4LCAgOTMsIDEyMywgMTI0LCAxMjIsIDEyMiwKKyAgICAxMzEsIDEyOCwgMTIzLCAxMjIsIDE1MSwgMTU4LCAxMDgsIDEwNywgMTI5LCAxMjgsIDExOSwgMTE5LAorICAgICA5NywgIDk5LCAxMTQsIDEyMCwgMTIxLCAxMjUsIDE1MSwgMTU3LCAgODIsICA4OSwgIDk1LCAgOTYsCisgICAgMTI4LCAgOTQsIDEzMCwgIDk1LCAxNDksIDExMywgMTQ5LCAxMjAsIDEyNywgMTE1LCAxMTMsIDEwOSwKKyAgICAxNjcsIDE3MSwgIDgzLCAgODAsICA4NCwgIDc5LCAxMDYsIDEwNiwgMTEyLCAxMTAsIDEwNywgMTA4LAorICAgIDEzMCwgMTM5LCAgODEsICA4OCwgMTA3LCAxMDYsIDExMiwgMTEyLCAxMTksIDExOCwgMTE0LCAxMTIsCisgICAgMTA4LCAxMDUsIDEwMCwgIDk4LCAxMjAsIDExNiwgMTIyLCAxMTcsICAzOCwgIDM3LCAgNzIsICA3MywKKyAgICAxMTgsIDEyNSwgMTEwLCAxMjAsIDExNCwgMTI2LCAxMzUsIDE0MiwgMTM5LCAxNDIsIDExOCwgMTE5LAorICAgIDExOSwgMTE5LCAxNTYsIDE0NSwgIDc4LCAgNzUsICA5NCwgIDk0LCAxMTIsIDExMCwgMTEzLCAxMTMsCisgICAgMTAxLCAxMDgsICA5OCwgMTA0LCAxMDMsIDEwOSwgMTE3LCAxMTgsIDE2NywgMTY3LCAxMzIsIDEzMiwKKyAgICAxMTYsIDEwOCwgMTE4LCAxMTEsIDE0OSwgMTM2LCAgODUsICA3NCwgIDk1LCAgOTIsIDExMywgMTEyLAorICAgICA3NCwgIDY5LCAxMDQsIDEwNywgIDk2LCAxMDAsIDExNywgMTIxLCAxMDMsIDEwNSwgMTAzLCAxMDMsCisgICAgMTEwLCAxMDYsIDExMSwgMTAxLCAgODIsICA3MiwgIDk2LCAgOTIsIDEzMiwgMTMwLCAxMjAsIDEyMSwKKyAgICAxMTYsIDExMywgMTM4LCAxMzksIDEwNCwgMTAzLCAxMzEsIDEzMSwgIDY4LCAgNjksICA5MiwgIDkyLAorICAgICA5NywgIDk3LCAxNDYsIDE1MSwgMTIyLCAxMzIsICA5NywgIDk1LCAxMTcsIDExNiwgMTE1LCAxMTYsCisgICAgMTM5LCAxMzQsIDExMCwgMTEwLCAxMjQsIDEyOSwgMTAwLCAxMTAsICA4NiwgIDkxLCAxMDAsIDEwMiwKKyAgICAxMTYsIDEzNiwgIDg4LCAgOTAsIDEzNywgMTM5LCAxMDMsIDExNCwgMTE0LCAxMTcsIDExMSwgMTEwLAorICAgICA4MiwgIDgzLCAxMDQsIDEwMiwgIDk3LCAgOTksICA5NywgIDk3LCAgNTgsICA1NiwgIDg0LCAgODQsCisgICAgIDgzLCAxMjIsICA3NiwgMTA1LCAxMTIsIDEyNiwgMTIwLCAxMzQsIDExMiwgMTIwLCAxMDgsIDExMCwKKyAgICAxMTQsIDEyOCwgIDczLCAgOTAsICA3MiwgIDc2LCAgOTgsIDEwMCwgIDk1LCAgOTYsIDEwMSwgMTAyLAorICAgIDEwMSwgMTA4LCAxMTgsIDEyNiwgIDk0LCAxMDIsICA4MSwgIDgzLCAxMzgsIDE0MCwgMTMxLCAxMzAsCisgICAgIDg4LCAxMDAsIDExMiwgMTI0LCAxMDUsIDEwNiwgMTIyLCAxMjMsIDEyMSwgMTIxLCAxMTQsIDExNCwKKyAgICAgNzYsIDEwOCwgIDczLCAgODMsICA5MywgIDk1LCAxMTAsIDExMSwgIDk4LCAgOTksIDEwMywgMTAzLAorICAgIDEwNSwgMTEyLCAgOTgsIDEwOCwgMTE0LCAgOTUsIDExNywgIDk4LCAxMjAsIDExNiwgMTE2LCAxMTUsCisgICAgMjMxLCAyMzgsIDE1MCwgMTQ2LCAxMjQsIDEyNiwgMTE1LCAxMjIsIDExNywgMTIxLCAxMTIsIDExMiwKKyAgICAgNzQsICA3MywgIDcyLCAgNzQsICA2MCwgIDYxLCAgNjIsICA2MSwgIDg1LCAgODUsIDEwMSwgMTAxLAorICAgICA2NywgIDY5LCAgNTAsICA1MSwgIDgzLCAgODMsIDExMCwgMTEwLCAxMTgsIDExMywgMTEyLCAxMTEsCisgICAgMTk5LCAxMjQsIDE4NCwgMTE1LCAxNzYsIDExNywgMTY1LCAxMjAsIDEzOCwgMTE1LCAxMTYsIDExNCwKKyAgICAgNTIsIDExNiwgIDM2LCAxMDcsICA0OSwgIDk5LCAgNzIsIDEwNiwgIDkxLCAxMDcsIDEwNCwgMTA1LAorICAgIDE0MCwgMTM4LCAxNDEsIDEzNSwgMTU0LCAxNDcsIDE2NiwgMTU5LCAxMzksIDEzNiwgMTE2LCAxMTUsCisgICAgMTMwLCAxMTksIDE4MCwgMTU3LCAxODMsIDE0OSwgMTM2LCAxMjEsIDExOSwgMTE0LCAxMTEsIDExMCwKKyAgICAxMDQsIDEyOSwgMTEzLCAxNTQsIDExMSwgMTQ4LCAxMDgsIDEzMiwgMTA1LCAxMTcsIDEwNiwgMTExLAorICAgIDExNCwgIDM1LCAgOTksICA2NSwgMTEzLCAgOTQsIDExMCwgIDk4LCAxMTEsIDEwNywgMTA3LCAxMDYsCisgICAgMTA2LCAxMTAsIDEyOCwgMTM1LCAxNjIsIDE3NSwgMTQzLCAxNTUsIDExNSwgMTE2LCAxMDksIDEwOSwKKyAgICAxNjgsIDE1NSwgMTEyLCAxMDksIDEyNSwgMTI1LCAxMjYsIDEyMiwgMTI2LCAxMjQsIDExMSwgMTEyLAorICAgIDEyOCwgIDk2LCAxNjAsICA3NywgMTUxLCAgNzcsIDEyMSwgIDgwLCAxMTQsICA5NCwgMTA3LCAxMDMsCisgICAgIDk3LCAxMDQsIDEwMSwgMTE2LCAgNTYsICA3OSwgIDc0LCAgODMsICA5MiwgIDk1LCAxMDQsIDEwNiwKKyAgICAgNjMsICA2OCwgIDc2LCAgNzcsIDExMCwgMTA3LCAgOTYsICA5MCwgIDg1LCAgODMsICA5NywgIDk2LAorICAgIDExNiwgMTEwLCAgNDYsICA0MiwgMTAzLCAxMDAsIDEyMiwgMTIwLCAxMDIsIDEwMSwgMTA0LCAxMDQsCisgICAgMTA2LCAxMDEsIDEwOSwgIDk4LCAgOTYsICA2MSwgIDY3LCAgMzUsICA3MiwgIDYxLCAgOTYsICA5MywKKyAgICAgODgsICA4MCwgIDgxLCAgNzYsIDExMywgMTEwLCAxNDQsIDE0MywgIDg4LCAgODksICA5MywgIDk0LAorICAgICA5NSwgIDk2LCAxMDAsIDEwMSwgMTM2LCAxMzIsIDE2NiwgMTYwLCAxNDgsIDE0NywgMTE1LCAxMTYsCisgICAgIDgwLCAgNzgsIDEzMCwgMTI5LCAxMjAsIDEwOCwgIDkxLCAgODUsICA5NSwgIDkxLCAxMDQsIDEwMiwKKyAgICAxNTEsIDE0NywgMTA2LCAxMDksIDExMCwgMTEwLCAgNjQsICA2OSwgIDY4LCAgNjcsICA5NiwgIDk2LAorICAgICA5MCwgMTY2LCAgOTcsIDEyOCwgIDk5LCAxMjAsIDEwNCwgMTIxLCAxMDksIDExOCwgMTA1LCAxMDksCisgICAgMTIyLCAxMzgsIDExMCwgMTQzLCAgNzUsICA5NywgIDgzLCAgOTQsICA4OSwgIDk0LCAxMDIsIDEwMywKKyAgICAxMzYsIDE0MiwgMTAzLCAxMTAsICA4MywgIDg5LCAgOTksIDEwMSwgMTM4LCAxMzgsIDEyMCwgMTIyLAorICAgIDE2OCwgIDg4LCAxMDUsICA5MCwgMTA5LCAxMDcsIDExMCwgMTExLCAxMDYsIDEwNSwgMTAzLCAxMDIsCisgICAgIDY4LCAgNzIsIDEwMiwgMTA0LCAgOTIsIDEwMiwgIDY1LCAgNzUsICA4OSwgIDk0LCAxMDYsIDEwNiwKKyAgICAgODMsICA3NCwgIDkzLCAgODUsICA3MywgIDY2LCAxMDYsIDEwMiwgMTAwLCAgOTIsICA5OSwgIDk3LAorICAgICA5MywgIDk5LCAxMDEsICA5NiwgMTE2LCAxMTIsIDEyNSwgMTIwLCAgODgsICA4OCwgIDk2LCAgOTYsCisgICAgIDQ0LCAgOTgsICA5MywgMTE1LCAxMDQsIDExNiwgMTAzLCAxMDcsIDExMiwgMTEzLCAxMDcsIDEwNywKKyAgICAgOTMsICA4MywgMTA1LCAgOTksICA5MywgIDg0LCAxMjcsIDEyNSwgMTQxLCAxNDMsIDExNywgMTE4LAorICAgIDEwNiwgMTAzLCAxMjYsIDEyMSwgMTM3LCAxMjMsIDEyMywgMTE0LCAxNDcsIDE0MiwgMTI3LCAxMjMsCisgICAgMTAzLCAxMTAsICA4OSwgIDkxLCAxMjEsIDEyNCwgIDY2LCAgNzEsICA2OCwgIDY5LCAgOTYsICA5NywKKyAgICAxMTQsIDEwNSwgIDY4LCAgNjUsICA2OSwgIDY3LCAgOTYsICA5NCwgMTMxLCAxMzAsIDEyMywgMTIxLAorICAgIDExMSwgMTA0LCAxMzAsIDEyMSwgIDk1LCAgOTUsICA3MiwgIDc0LCAgODgsICA4OCwgMTA1LCAxMDQsCisgICAgMTM1LCAxMjQsIDExMCwgIDk4LCAxMTQsIDExMSwgMTU5LCAxNTgsIDExMSwgMTEzLCAxMDQsIDEwNiwKKyAgICAxMDMsIDEwOCwgIDk0LCAxMDcsICA1NSwgIDU3LCAxMTUsIDExOCwgMTIxLCAxMjIsIDExMSwgMTExLAorICAgICA5NywgIDk5LCAxMDYsIDExMSwgMTE5LCAxMjYsICA1OSwgIDYyLCAxMTEsIDExMiwgMTI0LCAxMjUsCisgICAgIDg2LCAgOTMsIDEwMCwgMTEwLCAxMTgsIDE0NSwgMTEzLCAxMzIsIDEyMCwgMTI1LCAxMTIsIDExMiwKKyAgICAxMDEsIDExNSwgIDc4LCAxNDksICA4MSwgMTE0LCAxMTEsIDEyMSwgMTA4LCAxMTIsIDEwNywgMTA4LAorICAgIDEwNCwgMTA0LCAgOTQsICA5NiwgIDg0LCAgODMsIDEzNSwgMTMyLCAgNzEsICA2OSwgIDg4LCAgODYsCisgICAgMTAwLCAgOTgsICA2MiwgIDYwLCAgODEsICA4MCwgIDkwLCAgODksICA2MywgIDY2LCAgODksICA5MCwKKyAgICAxMjMsIDExNiwgMTA4LCAgOTksICA5MCwgIDg2LCAgOTEsICA5MiwgIDY1LCAgNjUsICA4OCwgIDg4LAorICAgICA4NCwgIDc5LCAxMTUsIDEwOSwgMTIzLCAxMTEsICA5OSwgIDk5LCAxMzQsIDEzNiwgMTIxLCAxMjMsCisgICAgMTI3LCAxMzcsICA4NCwgIDg4LCAxMDQsIDEwNywgMTI4LCAxMzAsICA3NCwgIDY5LCAgODksICA4OSwKKyAgICAxMTgsIDExMiwgMTQzLCAxMzIsIDE0MSwgMTMxLCAxMTMsIDExMywgIDk5LCAxMDIsIDEwNCwgMTA1LAorICAgIDExNywgMTE1LCAxMDAsICA5OSwgMTMxLCAxMjYsICA5MCwgIDg4LCAxNDUsIDE0NCwgMTI4LCAxMjcsCisgICAgMTEyLCAxMTQsIDEzMSwgMTMzLCAgODUsICA4NCwgMTE4LCAxMTksIDE1MSwgMTUyLCAxMTcsIDExNywKKyAgICAxMTAsIDEwNSwgMTYyLCAxNDAsIDExNiwgMTA3LCAxNDAsIDEzNCwgMTI0LCAxMjIsIDExMywgMTEzLAorICAgIDEwNywgMTEwLCAxMjQsIDEzMywgIDk4LCAxMDMsICA5OSwgMTA3LCAxMDksIDExMywgMTEyLCAxMTIsCisgICAgMTE1LCAxMDUsICA4MiwgIDc3LCAxMjUsIDEyMiwgMTMzLCAxMzIsIDExOCwgMTIwLCAxMTMsIDExMywKKyAgICAxMDEsICA4OCwgIDg0LCAgODAsICA5NywgIDk5LCAgOTEsICA5MSwgIDk0LCAgOTQsIDEwMSwgMTAwLAorICAgIDEyMSwgIDg2LCAxMzksIDEwOCwgMTA2LCAgOTMsIDEwMywgIDk5LCAxMTIsIDEwOCwgMTA4LCAxMDcsCisgICAgMTEzLCAgODMsIDEwNSwgMTAyLCAxMjUsIDEyNSwgMTE0LCAxMTUsIDExMCwgMTEyLCAxMDgsIDEwOSwKKyAgICAgOTMsIDExMiwgMTEzLCAxMjEsIDEyNSwgMTMxLCAxMDEsIDEwMSwgMTA3LCAxMDksIDExMSwgMTExLAorICAgICA5OCwgMTAyLCAxMTcsIDEyNiwgIDgwLCAgODQsIDEwNywgMTA5LCAgODMsICA4NCwgIDk2LCAgOTcsCisgICAgMTMyLCAxMzYsIDExMiwgMTE4LCAgOTQsICA5MywgMTIxLCAxMTgsICA5OSwgIDk4LCAxMDIsIDEwMywKKyAgICAxMjIsIDEyNywgMTI4LCAxMzMsIDExOCwgMTA0LCAxMDIsICA4OCwgMTAwLCAgOTQsIDEwNCwgMTAyLAorICAgIDExNSwgMTE2LCAxMDIsIDEwNSwgMTQwLCAxNDIsIDEzNSwgMTMwLCAgOTAsICA4OCwgMTAwLCAxMDEsCisgICAgIDk0LCAgODYsIDExMiwgMTEyLCAgODksIDEyMSwgIDkyLCAxMDEsIDEwOSwgMTA4LCAxMTAsIDExMiwKKyAgICAgOTksICA5MywgMTI5LCAxMTQsIDEwOSwgIDk5LCAxMzEsIDExOSwgMTAyLCAgOTcsIDEwMywgMTAzLAorICAgIDEwMywgMTE2LCAxMjQsIDEwMSwgMTE1LCAgOTUsIDEwNSwgMTAxLCAgOTQsICA5MSwgMTAwLCAxMDAsCisgICAgMTEzLCAgOTAsICA5NCwgIDg2LCAgOTIsICA5MiwgMTE3LCAxMTEsIDEwNiwgMTAzLCAxMDYsIDEwNSwKKyAgICAxMTUsICA5OSwgMTEwLCAgOTEsIDEwNywgMTA0LCAgODEsICA5MCwgMTA4LCAxMTMsIDExMiwgMTEzLAorICAgIDExMywgMTE0LCAgOTMsIDEwMSwgMTAxLCAxMDIsIDEwMSwgMTI2LCAgOTMsIDEwMywgMTA0LCAxMDUsCisgICAgMTE3LCAxMDYsIDEyNCwgMTA3LCAxMDQsIDExOSwgMTA4LCAxMzMsIDEwNCwgMTExLCAxMDQsIDEwNgorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHdtYXZvaWNlX2xzcDEwX2ludGVyY29lZmZfYVszMl1bMl1bMTBdID0geworICAgIHsgeyAgMC41MTA4NjI3MDgxLCAgMC4wNDgwNTQ4NDQxLCAtMS41MDk5MTQ5NjQ0LCAgMC42NzM2OTM1Mzc3LAorICAgICAgICAgMC43NTM2NTUxMDU4LCAgMC43NjUxNDc0MTc4LCAgMC44NTEwNjI4MzQzLCAgMC42NjY3NzA0NTgyLAorICAgICAgICAgMC43NTc2MDEyNjExLCAgMC43MDkxMzk3MDQ3IH0sCisgICAgICB7ICAwLjEzNTE0NzE4NDEsIC0wLjE5NjUzNzU1NDMsIC0xLjYzMTM0NTc3ODcsICAwLjMyMTg2MjYzODAsCisgICAgICAgICAwLjQxMzI0NzI4NzMsICAwLjQ2NjM0NzMwNzAsICAwLjU4MDU3ODExODYsICAwLjM5NjIxNjUxMTcsCisgICAgICAgICAwLjQ4MTg1NTAwNTAsICAwLjQ5MDcxNjU0NjggfSB9LAorICAgIHsgeyAgMC44NTU2MzIwNjY3LCAgMC43Nzc0NzA0OTkzLCAtMC4wMTc1NzU5NDk0LCAtMC4xODgyMjk4NTg5LAorICAgICAgICAgMC4xODkyMTY0MzUwLCAgMC40ODUwMzk2MjE2LCAgMC42MjcwMzE5ODE5LCAgMC42MzI3MDg5MDcxLAorICAgICAgICAgMC42NTEzMzE5OTEwLCAgMC42MDc1MDg4OTc4IH0sCisgICAgICB7ICAwLjQzNzQwODgzNDcsICAwLjM1MDU5MzQxNzksIC0wLjA3NjIxNDQzMjcsIC0wLjI4MzA3NjA0NzksCisgICAgICAgIC0wLjA2MjY0NTE5NjksICAwLjE1MDAzMTgwNTAsICAwLjI2MDI0NzIzMDUsICAwLjI3ODE3ODAwNjQsCisgICAgICAgICAwLjMxNjczOTU1OTIsICAwLjM1OTY2MjY1MjAgfSB9LAorICAgIHsgeyAgMC4xODk5Nzc5NzM3LCAgMC4wNjUwODU2MTk3LCAgMC4xNjk5MDEwNDMyLCAgMC45MTIyNjI4NTcwLAorICAgICAgICAgMC45MDk3NzA1NDgzLCAgMC43NDMzMzk3MTc0LCAgMC42MzA0OTM1MjE3LCAgMC41MTY0NzA0MDI1LAorICAgICAgICAgMC40MTc0NzAzNjU4LCAgMC41MjE1MjQyNTA1IH0sCisgICAgICB7ICAwLjA3MDQ4NTYyMTcsICAwLjAxNjkwMDk4NjQsICAwLjAxODgzOTQ0ODcsICAwLjU1ODc3MDQxODIsCisgICAgICAgICAwLjUxOTQ0NzMyNjcsICAwLjM1MzkxNjQ5NjAsICAwLjI0MjY2MjYwODYsICAwLjE3MjExNjQyODYsCisgICAgICAgICAwLjEzNzE1NDg3NzIsICAwLjI1OTQ4NTY5MTggfSB9LAorICAgIHsgeyAgMC44ODU4ODU5MjQxLCAgMC45MTAwNDc0NzE1LCAgMC44OTIxODU5MjY0LCAgMC45MzMyMzk3ODc4LAorICAgICAgICAgMS4wMjI1NDc1MTMyLCAgMS4wNTU1MDEzNzE2LCAgMS4wOTgzNTUyMzM3LCAgMS4xMjkwMjQ0NzU4LAorICAgICAgICAgMS4wMzYzMjQ0NDE0LCAgMC45Mjc3NzA1NTUwIH0sCisgICAgICB7ICAwLjQ4MTA5MzQ2NjMsICAwLjU3ODI5MzUwMjMsICAwLjY4MzU5MzU0MTQsICAwLjc2NTA3ODE4NzAsCisgICAgICAgICAwLjkwMTgwOTAwNjksICAwLjk5OTYzMjEyMDEsICAxLjAyMTk5MzY2NjksICAxLjA0NzQ3MDU5OTQsCisgICAgICAgICAwLjkxMDk0NzQ3MTksICAwLjc3NzQ3MDQ5OTMgfSB9LAorICAgIHsgeyAgMC40MzU5NTQ5ODgwLCAgMC4yMjc1NzAyOTUzLCAgMC4wOTkzNTQ4NjMyLCAgMC4xNzYzMzk1MDcxLAorICAgICAgICAgMC4xMDU1ODU2MzQ3LCAgMC4xMDE4NDcxNzE4LCAgMC4xMTcwMDg3MTU5LCAgMC4xMjIxMzE3OTQ3LAorICAgICAgICAgMC4xODM0MDEwNDgyLCAgMC4yOTg4NzgwMTQxIH0sCisgICAgICB7ICAwLjE1NzM3MDI2OTMsICAwLjEwNDEzMTc4ODAsICAwLjA1MDY4NTYxNDMsICAwLjA3ODE3MDIzOTksCisgICAgICAgICAwLjAwNTg5MzI5MDAsIC0wLjAwMjY5MTMyODUsIC0wLjAwMzEwNjcxMzMsICAwLjAwNzA3MDIxMzYsCisgICAgICAgICAwLjAxMTYzOTQ0NjAsICAwLjA1NjYzOTQ2MjcgfSB9LAorICAgIHsgeyAgMC44NTI4NjI4MzQ5LCAgMC44MDI4NzgyMDEwLCAgMC40NjgwMDg4NDYwLCAgMC45MDU1NDc0Njk5LAorICAgICAgICAgMS4zNzQyMzk5NTE0LCAgMS4xMDkzNjI5MzAxLCAgMC40MTIyNzgwNTYxLCAgMC40MDAzNzAzNTk0LAorICAgICAgICAgMC42MzYwMzE5ODUzLCAgMC42NDE1NzA0NDg5IH0sCisgICAgICB7ICAwLjQyNTI5MzQ0NTYsICAwLjM4MjM3MDM1MjcsICAwLjE2NzY4NTY1NzcsICAwLjUyNDE1NTAyMDcsCisgICAgICAgICAxLjE5OTU3MDY1NTgsICAwLjkwODgwMTMxNzIsICAwLjEyMjQwODcxNzksICAwLjA3MzA0NzE2MTEsCisgICAgICAgICAwLjMwNzE4NTcwOTUsICAwLjM3NzI0NzI3MzkgfSB9LAorICAgIHsgeyAgMC41NTA4NzgxMDc1LCAgMC4yODI5NTQ5MzEzLCAtMC4wMDIyMDY3MTMwLCAgMC4xMDQyNzAyNDk2LAorICAgICAgICAgMS4wMzE4MjQ0Mzk4LCAgMS4zMjU4NDc2MjU3LCAgMS4zNTUwNjMwMjEyLCAgMC45OTMxOTM2NTYyLAorICAgICAgICAgMC43MTk1MjQzMjM5LCAgMC42ODA3NTUwNzg4IH0sCisgICAgICB7ICAwLjI2NzkzMTg0ODgsICAwLjA5NjAzMTc4NTAsIC0wLjEzNTc1MjkxNjMsIC0wLjEyOTE3NTk5MDgsCisgICAgICAgICAwLjY0NTEwMTIxOTQsICAwLjk5Njg2Mjg4ODMsICAwLjk1MTAzMjEwMjEsICAwLjY2MDgxNjYwOTksCisgICAgICAgICAwLjM3OTk0NzI3NDksICAwLjM3MzU3ODA0MTggfSB9LAorICAgIHsgeyAgMC45OTY3MjQ0MjY3LCAgMS4wMjU1MjQ0Mzc0LCAgMC45ODAwMzk4MDUyLCAgMC43OTM5NDc0Mjg1LAorICAgICAgICAgMC44Mjg4Mzk3NDkxLCAgMC44MzkwMTY2NzU5LCAgMC44NjYwMTY2ODYwLCAgMC45MjQ3OTM2MzA4LAorICAgICAgICAgMC45MTI3NDc0NzI1LCAgMC44Njg0Mzk3NjM4IH0sCisgICAgICB7ICAwLjc5MjE0NzQyNzgsICAwLjk0MTY4NTk0NDgsICAwLjg1NDczMjA2NjQsICAwLjUzNDgxNjU2MzEsCisgICAgICAgICAwLjYyMzE1NTA1NzQsICAwLjY3MDMwMTIyODgsICAwLjY5ODc1NTA4NTUsICAwLjgxNDc4NTg5NzcsCisgICAgICAgICAwLjc0MDYzOTcxNjQsICAwLjY0OTYwMTIyMTEgfSB9LAorICAgIHsgeyAgMC4xNDM5Mzk0OTUxLCAtMC4zMTkzNTI5ODQ0LCAtMC4yMDI0OTE0MDI2LCAtMC4xODU0NjA2MjcxLAorICAgICAgICAgMC4wODc3MjQwODk2LCAgMC4xNjE3MzE4MDk0LCAgMC4zMDg3MDg3ODcwLCAgMC4zNzc3MzE4ODk1LAorICAgICAgICAgMC4zOTEwMjQyMDIxLCAgMC40Nzk3NzgwODEyIH0sCisgICAgICB7IC0wLjAxNTcwNjcxODAsIC0wLjE3Nzg0NTIzOTYsIC0wLjE1NTQ4MzY5MjksIC0wLjE3NTk3NjAwODIsCisgICAgICAgIC0wLjA2MDc3NTk2NTUsIC0wLjAxNjEyMjEwMjcsICAwLjAzOTMzMTc2NDAsICAwLjA3NTg4NTYyMzcsCisgICAgICAgICAwLjExNjM4NTYzODcsICAwLjE5NDc1NDg5ODUgfSB9LAorICAgIHsgeyAgMS4xMDIxNjI5Mjc0LCAgMC45OTU4MjQ0MjY0LCAgMC40NjU4NjI2OTE0LCAgMC4zMDg5MTY0NzkzLAorICAgICAgICAgMC4zNzQwNjI2NTc0LCAgMC4yOTYyNDcyNDM5LCAgMC4zMTcwODU3MTMxLCAgMC4yNDIwMzk1MzE1LAorICAgICAgICAgMC4yNjQ5NTQ5MjQ2LCAgMC4yOTM2ODU3MDQ1IH0sCisgICAgICB7ICAwLjQ3MDA4NTc2OTksICAwLjE4MDkwODczOTYsICAwLjAzMTE2MjUzMDIsICAwLjAxMDYwMDk4NDEsCisgICAgICAgICAwLjAzMTE2MjUzMDIsICAwLjAyNjY2MjUyODUsICAwLjAyMjE2MjUyNjgsICAwLjAxNTY1NDgzMjEsCisgICAgICAgICAwLjA1NTExNjM4NTIsICAwLjEwMTAxNjQwMjIgfSB9LAorICAgIHsgeyAgMC4yOTI1MDg3ODEwLCAgMC4zNDE4MDExMDY5LCAgMC43MzM5MjQzMjkzLCAgMC43MzIyNjI3OTAyLAorICAgICAgICAgMC43Mjg4NzA0ODEzLCAgMC43OTI0OTM1ODE4LCAgMC43NzI0MTY2NTEyLCAgMC43ODE5MDEyNzAyLAorICAgICAgICAgMC44MzI1NzgyMTIwLCAgMC43OTU0NzA1MDYwIH0sCisgICAgICB7ICAwLjA1NTk0NzE1NDgsIC0wLjA0NTYxNDQyMTQsIC0wLjA0NjIzNzQ5ODUsIC0wLjEwMDUxNDQ0MTcsCisgICAgICAgIC0wLjA1MTE1Mjg4NTAsIC0wLjA0NTU0NTE5MDYsIC0wLjAwNDQyMjA5ODQsICAwLjA0NTE0NzE1MDgsCisgICAgICAgICAwLjEyMzIzOTQ4NzQsICAwLjIwODUzMTgyNjcgfSB9LAorICAgIHsgeyAgMC4yMjMwNzAyOTM3LCAtMC45MDUyNTMyMDE3LCAgMS4yNDQxNTUyODc3LCAgMS4wODI1NzA2MTI0LAorICAgICAgICAgMC45MDg4NzA1NDgwLCAgMC44Nzk3MjQzODM0LCAgMC44NjQ4Mzk3NjI0LCAgMC44MDkxMDg5NzI1LAorICAgICAgICAgMC43NjMzNDc0MTcxLCAgMC43NDY4NzA0ODc5IH0sCisgICAgICB7IC0wLjIwMzA0NTI0OTAsIC0xLjQxNjczMDMxNDUsICAxLjM1NDIzMjI1MTYsICAwLjgzNjkzOTc1MjEsCisgICAgICAgICAwLjYxNDg0NzM2MjAsICAwLjU1NjA3MDQxNzIsICAwLjU0NTA2MjcyMDgsICAwLjQ5Nzg0NzMxODYsCisgICAgICAgICAwLjQyMDAzMTkwNTIsICAwLjQ5MDQzOTYyMzYgfSB9LAorICAgIHsgeyAgMC42MDg4MjQyODI5LCAgMC41OTY1NzA0MzIyLCAgMC42NTQ3MjQyOTk5LCAgMC44NTU0OTM2MDUxLAorICAgICAgICAtMC4yOTg5Mjk4OTk5LCAgMC4yNDA0NDcyMjMyLCAgMC4zNTczNzgwMzU4LCAgMC43NDk5MTY2NDI5LAorICAgICAgICAgMC43NjkxNjI4MDM5LCAgMC42ODI0ODU4NDg3IH0sCisgICAgICB7ICAwLjI1ODIzOTUzNzUsICAwLjI3MjE1NDkyNzMsICAwLjM0NjIzMTg3NzgsICAwLjQ4MjA2MjY5NzQsCisgICAgICAgIC0wLjQ3ODAyOTk2NjQsIC0wLjA3MTI5OTA0NjMsICAwLjAyMDAxNjM3MjIsICAwLjQyNDY3MDM2ODQsCisgICAgICAgICAwLjQ2NjAwMTE1MzAsICAwLjQxNzI2MjY3MzQgfSB9LAorICAgIHsgeyAgMS4xNzQ5OTM3MjM2LCAgMS4wNzczMDkwNzIwLCAgMS4wNTY2NzgyOTUxLCAgMS4wMjQ5MDEzNjAzLAorICAgICAgICAgMC45OTQ3MTY3MzM3LCAgMC45NjI2NjI4NzU3LCAgMC45NTYyMjQ0MTE3LCAgMC45MDcyNzgyMzk3LAorICAgICAgICAgMC43NjU0MjQzNDEwLCAgMC42NDQ4OTM1MjcwIH0sCisgICAgICB7ICAxLjE1OTU1NTI1NjQsICAwLjkzNDAwMTMyNjYsICAwLjM5NTkzOTU4ODUsICAwLjM2OTM1NDk2MzMsCisgICAgICAgICAwLjM5MTU3ODA0ODUsICAwLjMxMDQzOTU1NjgsICAwLjM0OTkwMTEwOTksICAwLjIyMzY5MzM3MDgsCisgICAgICAgICAwLjE2MzgwODczMzIsICAwLjE4MTE4NTY2MjcgfSB9LAorICAgIHsgeyAgMC45NTcyNjI4NzM2LCAgMC45Mzg5ODU5NDM4LCAgMC42NjE5MjQzMDI2LCAgMC42ODQ5MDg5MjY1LAorICAgICAgICAgMC43Mjc2OTM1NTc3LCAgMC43ODM5NzgxOTQwLCAgMC43OTg3MjQzNTMzLCAgMC43NzQ4Mzk3MjkxLAorICAgICAgICAgMC43MTAxMDg5MzU4LCAgMC43Mjc3NjI3ODg1IH0sCisgICAgICB7ICAwLjU4MDk5MzUwMzMsICAwLjU1NzU5MzQ5NDcsICAwLjM1NDQ3MDM0MjQsICAwLjM2MzY3ODAzODEsCisgICAgICAgICAwLjM3MzY0NzI3MjYsICAwLjQ0ODYyNDIyMzUsICAwLjQ2ODQ5MzQ2MTYsICAwLjQ0ODEzOTYwNzksCisgICAgICAgICAwLjM0NTY3ODAzMTQsICAwLjQ0Nzg2MjY4NDcgfSB9LAorICAgIHsgeyAgMC4xMjU5Mzk0ODg0LCAgMS4zMDk2NDc2MTk3LCAgMS4wNzk0NTUyMjY3LCAgMS4wMDA5NDc1MDUyLAorICAgICAgICAgMC45MDYxMDEzMTYyLCAgMC45MjE2NzgyNDUxLCAgMC44OTU0Mzk3NzM4LCAgMC45MTYwMDEzMTk5LAorICAgICAgICAgMC44NTc1MDEyOTgyLCAgMC43NDc5MDg5NDk5IH0sCisgICAgICB7IC0wLjM2ODkyMjIzMzYsICAxLjUyOTM4NjE2MjgsICAwLjczMjMzMjAyMTAsICAwLjQxMDI3MDM2MzEsCisgICAgICAgICAwLjM4MjU3ODA0NTEsICAwLjI4MjgxNjQ2OTcsICAwLjI2NDQwMTA3ODIsICAwLjI0NTUwMTA3MTIsCisgICAgICAgICAwLjI0ODIwMTA3MjIsICAwLjIzMzUyNDE0MzcgfSB9LAorICAgIHsgeyAgMC41MzgwNzA0MTA1LCAgMC4xNjAwNzAyNzAzLCAtMC4wNjU3NjA1ODI3LCAtMC4yMzkwNDUyNjIzLAorICAgICAgICAtMC4zODg1ODM3NzkzLCAtMC40MTUwMjk5NDMwLCAtMC4zMDAxNzYwNTQyLCAtMC4xNDUxNjgzMDQ0LAorICAgICAgICAgMC4xMzEyMDEwMjg4LCAgMC4yNzk4Mzk1NDU1IH0sCisgICAgICB7ICAwLjIwNzQ5MzM2NDgsICAwLjA1NjAxNjM4NTYsIC0wLjA5NTY2ODI4NjEsIC0wLjI4OTMwNjgxOTQsCisgICAgICAgIC0wLjM4ODk5OTE2NDEsIC0wLjM5MTgzNzYyNjcsIC0wLjM1NTAwNjg0MzgsIC0wLjI2NDkzNzU3OTYsCisgICAgICAgIC0wLjA1NTQ0NTE5NDIsICAwLjExNjczMTc5MjcgfSB9LAorICAgIHsgeyAgMC42MDkyMzk2Njc3LCAgMC41MTAxMDExNjkzLCAgMC40MDEyMDExMjkwLCAgMC41NDE2MDExODEwLAorICAgICAgICAgMC41NzE1NzgxMTUyLCAgMC42NDc2NjI3NTg4LCAgMC42OTg4MjQzMTYzLCAgMC43MzA2MDEyNTExLAorICAgICAgICAgMC43NTMxNzA0OTAzLCAgMC42NTM0NzgxNDU2IH0sCisgICAgICB7ICAwLjIwNjAzOTUxODEsICAwLjE0MDk2MjU3MDksICAwLjEwMjQ3MDI0ODksICAwLjE4MzQwMTA0ODIsCisgICAgICAgICAwLjE5NDY4NTY2NzgsICAwLjI1NDc3Nzk5NzcsICAwLjMxMzQ4NTcxMTgsICAwLjMyODMwMTEwMTksCisgICAgICAgICAwLjM4Mzc1NDk2ODYsICAwLjM1MDE3ODAzMzEgfSB9LAorICAgIHsgeyAgMC40NTE2MDExNDc3LCAgMC41MzUxNjI3MTcxLCAgMC44MDY4MjQzNTYzLCAgMC43MDQ5ODU4NTcwLAorICAgICAgICAgMC43MTY1NDczOTk4LCAgMC42MDA1ODU4MTgzLCAgMC40ODcwNDczMTQ2LCAgMC4yNTAwMDEwNzI5LAorICAgICAgICAgMC4zMTMyMDg3ODg2LCAgMC40NDYyNzAzNzY0IH0sCisgICAgICB7ICAwLjEwNTMwODcxMTUsICAwLjEzNDg3MDI2MTAsICAwLjQ0NTc4NTc2MDksICAwLjM0OTk3MDM0MDcsCisgICAgICAgICAwLjM1Mzc3ODAzNDQsICAwLjI2Mjg3ODAwMDcsICAwLjE2NjUwODczNDIsICAwLjAyMDA4NTYwMzAsCisgICAgICAgICAwLjAzMjk2MjUzMDksICAwLjE1MjUyNDExMzcgfSB9LAorICAgIHsgeyAgMC43MDU4MTY2MjY1LCAgMC43MzA1MzIwMjAzLCAgMS4xNjg0ODYwMjg5LCAgMS40NTI0NzA3NDk2LAorICAgICAgICAgMS4zMjEyMDkxNjI1LCAgMS4yNjEzMjQ1MjQ5LCAgMS4xNzEyNTUyNjA3LCAgMS4xMTU0NTUyNDAwLAorICAgICAgICAgMS4wNDg3MTY3NTM3LCAgMC45MTUzNzgyNDI3IH0sCisgICAgICB7ICAwLjIyODYwODc1NzMsICAwLjI4NTE3MDMxNjcsICAxLjIwMTY0NzU3OTcsICAxLjUxNTQ3MDc3MzAsCisgICAgICAgICAxLjI3MjYwOTE0NDQsICAxLjE0NTkxNjc4OTgsICAwLjk4MDEwOTAzNjAsICAwLjkyOTYzOTc4NjUsCisgICAgICAgICAwLjg0OTA1NTE0MTIsICAwLjY3NzIyNDMwODMgfSB9LAorICAgIHsgeyAgMC42Njg2Mzk2ODk3LCAgMC41NzI4OTM1MDAzLCAgMC40NzM0NzgwNzg4LCAgMC42OTcwMjQzMTU2LAorICAgICAgICAgMC41ODUyMTY1ODE4LCAtMC4wNzYyODM2NjM1LCAtMC4yMDU0NjgzMjY4LCAtMC4xMzgwMzc1MzI2LAorICAgICAgICAgMC4xMjgyOTMzMzU0LCAgMC4zNDY3MTY0OTM0IH0sCisgICAgICB7ICAwLjI5MjUwODc4MTAsICAwLjIzNDQ5MzM3NDgsICAwLjE2Nzc1NDg4ODUsICAwLjI3NDc4NTY5NzUsCisgICAgICAgICAwLjIwOTcwODc1MDIsIC0wLjI3OTU0NTI3NzQsIC0wLjM3NjEyMjIzNjMsIC0wLjMxODM4Mzc1MzMsCisgICAgICAgIC0wLjA4MzQ4MzY2NjIsICAwLjE0ODIzMTgwNDQgfSB9LAorICAgIHsgeyAgMC42NTU5NzA0NTQyLCAgMC43NzM3MzIwMzY0LCAgMC45ODY3NTUxOTIzLCAgMC45OTEyNTUxOTM5LAorICAgICAgICAgMC45NTA4OTM2NDA1LCAgMC45MTE0MzIwODc0LCAgMC44MzM2ODU5MDQ3LCAgMC43OTA1NTUxMTk1LAorICAgICAgICAgMC43NjcyOTM1NzI0LCAgMC43NTMyMzk3MjExIH0sCisgICAgICB7ICAwLjE4NDM3MDI3OTMsICAwLjI1NjUwODc2NzYsICAwLjc1NzE4NTg3NjQsICAwLjc1NDU1NTEwNjIsCisgICAgICAgICAwLjY3OTM3MDQ2MjksICAwLjU5ODE2Mjc0MDUsICAwLjUwNzgxNjU1MzEsICAwLjQyODIwMTEzOTAsCisgICAgICAgICAwLjM5NDgzMTg5NTgsICAwLjQ1MDIxNjUzMTggfSB9LAorICAgIHsgeyAgMC40NDMwODU3NTk5LCAgMC42MTAyNzgxMjk2LCAgMC44NDg1MDEyOTQ5LCAgMC44NTczNjI4MzY2LAorICAgICAgICAgMC45MDc4MzIwODYxLCAgMC45OTc5NzA1ODExLCAgMS4wNDExMDEzNjYzLCAgMS4wNTI0NTUyMTY2LAorICAgICAgICAgMS4wMTk0MzIxMjc1LCAgMC45MDIzNjI4NTMzIH0sCisgICAgICB7ICAwLjAwNzAwMDk4MjgsICAwLjAwODQ1NDgyOTUsICAwLjE2MTM4NTY1NTQsICAwLjM0ODQ0NzI2MzIsCisgICAgICAgICAwLjQzODU4NTc1ODIsICAwLjU4OTUwODg5MTEsICAwLjYzNjc5MzUyNDAsICAwLjY3MzY5MzUzNzcsCisgICAgICAgICAwLjcwMjYzMjAxMDAsICAwLjU5MjQxNjU4NDUgfSB9LAorICAgIHsgeyAgMS4wNTMyODU5ODYyLCAgMS4xMDU5NzA2MjExLCAgMS4xMzExMDEzOTk3LCAgMS4xMjUwNzgzMjA1LAorICAgICAgICAgMS4wNDI1NTUyMTMwLCAgMC45OTkzNTUxOTcwLCAgMC45NjczMDEzMzg5LCAgMC45Mzg2Mzk3ODk4LAorICAgICAgICAgMC44ODM2MDEzMDc5LCAgMC44MzM2ODU5MDQ3IH0sCisgICAgICB7ICAwLjk3OTEzOTgwNDgsICAxLjE0ODEzMjE3NTIsICAxLjEyNzU3MDYyOTEsICAxLjAwODIxNjczODcsCisgICAgICAgICAwLjg4MDk3MDUzNzcsICAwLjgwMzE1NTEyNDIsICAwLjcyODczMjAxOTcsICAwLjY0OTY3MDQ1MTksCisgICAgICAgICAwLjUyMTEwODg2NTcsICAwLjQ3MzQwODg0ODAgfSB9LAorICAgIHsgeyAtMC4wMjUxMjIxMDYxLCAtMC4wNDQzNjgyNjcxLCAgMC4xMjgyMjQxMDQ2LCAgMC4zODUwNzAzNTM3LAorICAgICAgICAgMC40MjUyOTM0NDU2LCAgMC40NTQ3ODU3NjQyLCAgMC40NjkwNDczMDgwLCAgMC40ODczMjQyMzc4LAorICAgICAgICAgMC42MDAxMDEyMDI3LCAgMC41ODgyNjI3MzY4IH0sCisgICAgICB7IC0wLjA1NjI3NTk2MzgsIC0wLjAyNDYzNzQ5MDUsICAwLjAwNzAwMDk4MjgsICAwLjA5NzEzOTQ3NzcsCisgICAgICAgICAwLjEyMzIzOTQ4NzQsICAwLjEyNzg3Nzk1MDcsICAwLjEzMDIzMTc5NzcsICAwLjE0NjIyNDExMTMsCisgICAgICAgICAwLjIwNzM1NDkwMzIsICAwLjI0NDYwMTA3MDkgfSB9LAorICAgIHsgeyAgMS4xNzQ5MjQ0OTI4LCAgMS4xMTU1OTM3MDE2LCAgMC45MjM2MTY3MDczLCAgMC42Mjg4MzE5ODI2LAorICAgICAgICAgMC42NTE1Mzk2ODMzLCAgMC41MzkxNzgxMDMyLCAgMC41Mzk4MDExODA0LCAgMC40OTk3MTY1NTAxLAorICAgICAgICAgMC40MDY2NzAzNjE4LCAgMC4zOTk4ODU3NDM5IH0sCisgICAgICB7ICAwLjk0MDMwMTMyODksICAwLjczNDYxNjYzNzIsICAwLjE4NDE2MjU4NjksICAwLjEzMTk2MjU2NzYsCisgICAgICAgICAwLjEzOTUwODcyNDIsICAwLjA4NTc4NTYyNzQsICAwLjA5NTI3MDI0NjMsICAwLjA4NjA2MjU1MDUsCisgICAgICAgICAwLjA4Mjk0NzE2NDgsICAwLjExMzIwMTAyMjEgfSB9LAorICAgIHsgeyAgMC45MDQ3MTY3MDAzLCAgMC45ODQwNTUxOTEzLCAgMC45OTMzMzIxMTc4LCAgMC45MzYwMDkwMTk2LAorICAgICAgICAgMC45MTY0ODU5MzU0LCAgMC45MjEzMzIwOTExLCAgMC44NzAxNzA1MzM3LCAgMC44ODE1OTM2MTQ4LAorICAgICAgICAgMC44NDE0Mzk3NTM4LCAgMC44MTg4MDEyODM4IH0sCisgICAgICB7ICAwLjA5NjEwMTAxNTgsIC0wLjAxNDczNzQ4NjgsICAwLjAyMDIyNDA2NDYsICAwLjEwMDI1NDg2MzUsCisgICAgICAgICAwLjE0MDc1NDg3ODUsICAwLjE4Mzc0NzIwMjIsICAwLjE4NTgyNDEyNjAsICAwLjIwNjQ1NDkwMjksCisgICAgICAgICAwLjIyMjg2MjYwMTMsICAwLjI4NTkzMTg1NTQgfSB9LAorICAgIHsgeyAgMC40MDM0MTY1MTQ0LCAgMC4xOTE4NDcyMDUyLCAgMi4xOTU5NDAyNTYxLCAgMC40NzYzMTY1NDE0LAorICAgICAgICAgMC42NTc3MDEyMjQxLCAgMC43MDM2NzA0NzE5LCAgMC42NjI2ODU4NDEzLCAgMC43NjUwMDg5NTYyLAorICAgICAgICAgMC43NzAyNzA0OTY2LCAgMC42NTQzNzgxNDU5IH0sCisgICAgICB7ICAwLjA5NDA5MzMyMjgsIC0wLjEyMjI1MjkxMTMsICAyLjM0OTE0ODAwNTIsICAwLjEzODUzOTQ5MzEsCisgICAgICAgICAwLjMwNTI0NzI0NzIsICAwLjM2NjU4NTczMTUsICAwLjMzNTA4NTcxOTgsICAwLjQ3MjIzMTkyNDUsCisgICAgICAgICAwLjQzMTM4NTc1NTUsICAwLjM4NDY1NDk2OTAgfSB9LAorICAgIHsgeyAgMC44MjE1MDEyODQ4LCAgMC44NjEzNzgyMjI3LCAgMS4wMzk5OTM2NzM2LCAgMS40MDgyMzIyNzE3LAorICAgICAgICAgMC40MDc1MDExMzEzLCAgMC40MDkxNjI2NzA0LCAgMC41MjMwNDczMjgwLCAgMC42MTAxMzk2NjgwLAorICAgICAgICAgMC43NTEwMjQzMzU2LCAgMC43MjM3NDc0MDI0IH0sCisgICAgICB7ICAwLjQ4MTA5MzQ2NjMsICAwLjU2NzAwODg4MjgsICAwLjkyMDc3ODI0NDcsICAxLjMwMDc4NjA3ODAsCisgICAgICAgICAwLjA0NTM1NDg0MzEsICAwLjA4NTg1NDg1ODIsICAwLjE4MDM1NDg5MzIsICAwLjI3OTAwODc3NTksCisgICAgICAgICAwLjM5NzQ2MjY2NjAsICAwLjQ1ODE3ODA3MzIgfSB9LAorICAgIHsgeyAgMS41OTIxNzg0OTM3LCAgMS40OTg3MTY5MjA2LCAgMS4xMzIxMzk4NjE2LCAgMC44MjM1MDg5Nzc5LAorICAgICAgICAgMC42ODg4NTUwODE4LCAgMC42NjIxMzE5OTUwLCAgMC42MTkyMDg5MDIxLCAgMC42NTMzMzk2ODQwLAorICAgICAgICAgMC43MTk2NjI3ODU1LCAgMC42NTQ5MzE5OTIzIH0sCisgICAgICB7ICAxLjU5MTE0MDAzMTgsICAxLjQ3NjgzOTk4OTQsICAwLjkzNTg3MDU1ODAsICAwLjQ2NzQ1NDk5OTcsCisgICAgICAgICAwLjM1MjI1NDk1NzAsICAwLjMxNDQ1NDk0MjksICAwLjI5ODUzMTg2MDEsICAwLjM1NTkyNDE4OTEsCisgICAgICAgICAwLjQwNjE4NTc0NjIsICAwLjM5NTg3MDM1NzggfSB9LAorICAgIHsgeyAgMC43OTc1NDc0Mjk4LCAgMC44NzEyNzgyMjY0LCAgMC44OTc0NDc0NjY5LCAgMC4zMDA4MTY0NzYzLAorICAgICAgICAgMC41NTYyMDg4Nzg4LCAgMC42NjU1OTM1MzQ3LCAgMC44OTIxMTY2OTU2LCAgMS4wOTE4NDc1Mzg5LAorICAgICAgICAgMC45NTQ0OTM2NDE5LCAgMC44NTU0OTM2MDUxIH0sCisgICAgICB7ICAwLjM3Njk3MDM1MDcsICAwLjQ5MzA3MDM5MzgsICAwLjY2MTkyNDMwMjYsIC0wLjAzODI3NTk1NzEsCisgICAgICAgICAwLjE3NjY4NTY2MTEsICAwLjMwMTU3ODAxNTEsICAwLjU5NTI1NTA0NzEsICAwLjg5MDM4NTkyNTgsCisgICAgICAgICAwLjczOTUzMjAyMzcsICAwLjYyMDU5MzUxODAgfSB9LAorICAgIHsgeyAgMC4yMjA2NDcyMTU4LCAgMi40NDY3NjM0MjYxLCAgMS4yOTIwNjI5OTc4LCAgMS4wMjM5MzIxMjkxLAorICAgICAgICAgMC45MDE0NjI4NTMwLCAgMC44NTUyMTY2ODIwLCAgMC44MjE5ODU5MDA0LCAgMC45MDA1NjI4NTI2LAorICAgICAgICAgMC43NjE0NzgxODU3LCAgMC43NzYzNjI4MDY2IH0sCisgICAgICB7IC0wLjI3MjIwNjgxMzEsICAyLjg5Njc2MzU5MzAsICAxLjMwMzk3MDY5NDUsICAwLjc2OTUwODk1NzksCisgICAgICAgICAwLjYxMzI1NTA1MzgsICAwLjU3MDEyNDI2ODUsICAwLjU3Mzc5MzUwMDcsICAwLjY1MzMzOTY4NDAsCisgICAgICAgICAwLjU0MjI5MzQ4OTAsICAwLjUxNTA4NTc4NjYgfSB9LAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHdtYXZvaWNlX2xzcDEwX2ludGVyY29lZmZfYlszMl1bMl1bMTBdID0geworICAgIHsgeyAgMC40ODgxMDQ4Nzk5LCAtMC4xOTk4MTkyMzcwLCAtMC4zODcyNTAyMTQ4LCAgMC4wMTA5NDIzMTAxLAorICAgICAgICAgMC4wNDA2OTUzMzk0LCAgMC4xNzg4NDM3NjY1LCAgMC4xNjczNzUwODc3LCAgMC4zNDA5NzgxMTU4LAorICAgICAgICAgMC40MDYxMjAyMTA5LCAgMC41MjIxMTc3MDQyIH0sCisgICAgICB7ICAwLjE0OTIyMTgwNzcsIC0wLjEzNzIzMzAxODksIC0wLjI2ODM2OTE2ODAsIC0wLjA2MjE5NTA5MjQsCisgICAgICAgIC0wLjA2MjQ1NzIzMzcsIC0wLjAwNjgxNzc1ODEsIC0wLjAwNzYwNDE4MTgsICAwLjA2ODAyMzU2MjQsCisgICAgICAgICAwLjEwNTU3NTI5MzMsICAwLjExOTk5MzA2MDggfSB9LAorICAgIHsgeyAgMC43OTM0MzM4NzQ4LCAgMC4wMDEyNDMwODQ3LCAgMC40MjM5NDU4MTQ0LCAgMC41NTIxMzI4NzQ3LAorICAgICAgICAgMC42NDk3MTQ5NDY3LCAgMC42NDIzNzQ5OTI0LCAgMC43MTcwMTk3MDcwLCAgMC43MTY5NTQxNzE3LAorICAgICAgICAgMC43Nzc4MzY0NzE4LCAgMC44Mzk3MDE4MDE1IH0sCisgICAgICB7ICAwLjI3NjgxOTA1MDMsIC0wLjA0OTE1MzU2NjQsIC0wLjAzMjU3MzEzMzcsICAwLjAyNjE0NjUwMTMsCisgICAgICAgICAwLjA0Njk4NjcyODksICAwLjA2NDk0MzQwMzAsICAwLjA3ODE4MTUzNTAsICAwLjEwMzE1MDQ4NjksCisgICAgICAgICAwLjExOTQ2ODc3ODQsICAwLjI0NTE2NTQ5NzEgfSB9LAorICAgIHsgeyAgMC43MjEyMTM5NjY2LCAgMC4xNjU4Njc3NzU3LCAgMC4wMTAxNTU4ODY0LCAgMC41NjM2MDE1NTM0LAorICAgICAgICAgMS4zMTc1ODUyNTk3LCAgMS4xOTExNjc2NTI2LCAgMS4xMjY2ODA5MTA2LCAgMC44MjMwNTU4MzM2LAorICAgICAgICAgMC44NjA0MTA5NTg1LCAgMC44MDk0OTAwMjUwIH0sCisgICAgICB7ICAwLjM2NTg4MTUzMjQsICAwLjA4MTY1NDkwNjMsIC0wLjIwOTI1NjMyMTIsICAwLjE5NDYzNzc3NTQsCisgICAgICAgICAxLjA4NTY1NTgwODQsICAwLjk0OTE0NTc2NDEsICAwLjg0NjEyNDI2MTYsICAwLjUxOTM2NTIyMTMsCisgICAgICAgICAwLjU5NzU0ODg0MjQsICAwLjUyOTMyNjU4NzkgfSB9LAorICAgIHsgeyAgMC45NTA3MTg2MTE1LCAgMC45MDc4NTg1MjA3LCAgMC44NzczMTkwNjc3LCAgMC44Njc3NTA5MTI5LAorICAgICAgICAgMC44MDI0MTIyMTE5LCAgMC44MTI3NjY3OTA0LCAgMC44MjQ2Mjg2ODA5LCAgMC44Nzc5MDg4ODU1LAorICAgICAgICAgMC45NDU0MTAyNTE2LCAgMC45ODYzNjk4MTg0IH0sCisgICAgICB7ICAwLjY4ODM4MDc3NzgsICAwLjY5MDAxOTE2MDUsICAwLjcwNTk0NDI0MDEsICAwLjY1NTI4NTQ0NzgsCisgICAgICAgICAwLjU4NDMxMDcxMDQsICAwLjU1NTM0NDEwNDgsICAwLjU4ODc2NzExMTMsICAwLjY0OTQ1MjgwNTUsCisgICAgICAgICAwLjc3MjU5MzY0NzIsICAwLjc3OTI3ODI0ODUgfSB9LAorICAgIHsgeyAgMC4yMzk5ODgyMDc4LCAgMC4xOTM4NTEzNTE3LCAgMC40NDQxOTYyMjQyLCAgMC40NDc1Mzg1MjQ5LAorICAgICAgICAgMC4zMDU1MjM1MTQ3LCAgMC4xNzQ1MTg0MzYyLCAgMC4xMTc0MzcxODM5LCAgMC4wNjc5NTgwMjcxLAorICAgICAgICAgMC4wNzgyNDcwNzAzLCAgMC4xNjk1Mzc3NTI5IH0sCisgICAgICB7ICAwLjAxNzAzNzA5MzYsICAwLjAyNTM2MDA3NzYsICAwLjIwNzIyMDU1NDQsICAwLjE5MDc3MTE5MjMsCisgICAgICAgICAwLjEwOTYzODQ4MjMsICAwLjAzMjcwMDAzMjAsIC0wLjAxMzQzNjgyNDEsIC0wLjA0NjEzODk0MjIsCisgICAgICAgIC0wLjAzNzI5MTY3NTgsIC0wLjAyNDMxNTY4NTAgfSB9LAorICAgIHsgeyAgMC41NDU3MTA0MTQ2LCAgMC4zNzc0ODEyODE4LCAgMC41MjM1NTk0ODA5LCAgMC4yOTk0Mjg3MzEyLAorICAgICAgICAgMC4yMzk0NjM5MjU0LCAgMC41NzMxMDQxNzI5LCAgMC45OTcxMTc2MDg4LCAgMS4xNjQ2OTEzODg2LAorICAgICAgICAgMC45MDI4MTIzMDIxLCAgMC43Nzc3NzA5MzY1IH0sCisgICAgICB7ICAwLjIyODg0NzIwNTYsICAwLjExODE1ODA3MjIsICAwLjIwNzQxNzE2MDMsICAwLjAzNTUxODA1MDIsCisgICAgICAgIC0wLjAwMjQ5MjQyNzgsICAwLjI1OTY0ODc5OTksICAwLjc0NzQ5MzYyNDcsICAwLjkxMDM0ODg2MjQsCisgICAgICAgICAwLjU5Mjc2NDc2NTAsICAwLjQ3NzI5MTU1NDIgfSB9LAorICAgIHsgeyAgMC42NTQxNzEzNDc2LCAgMC42NDEyNjA4OTIyLCAgMC43NjI1MDEyMTAwLCAgMC43ODI2MjA1NDkyLAorICAgICAgICAgMC40ODM5MTA2MjAyLCAgMC4zMzExNDc4MTk4LCAgMC40NTc3NjIwMzI3LCAgMC44NTcyNjUyNjM4LAorICAgICAgICAgMC45NDQyMzA2MTYxLCAgMC44MjgyOTg2NTgxIH0sCisgICAgICB7ICAwLjI4NTIwNzU2OTYsICAwLjI2MTQ4Mzc4ODUsICAwLjQyMjE3NjM2MTEsICAwLjQzMTQ4MjM3NDcsCisgICAgICAgICAwLjE0MzQ1NDcwMDcsICAwLjA0MzU3ODg5MjksICAwLjEzOTcxOTE4ODIsICAwLjU1MjU5MTYyMTksCisgICAgICAgICAwLjY3NTIwODE4MTEsICAwLjU0ODcyNTAzODggfSB9LAorICAgIHsgeyAgMC42NzQyMjUxNTE1LCAgMS4wNjEwODAwNjgzLCAgMS4wNTAwNzAxMzY4LCAgMC45NTcwMTAwMDA5LAorICAgICAgICAgMC45MzI1NjUzMzE1LCAgMC45MjQzMDc4ODI4LCAgMC45MTQ4NzA3OTg2LCAgMC44MzE3NzIwMjk0LAorICAgICAgICAgMC43Njk2NDQ1NTg0LCAgMC42Nzg0ODQ5NDY1IH0sCisgICAgICB7ICAwLjIyODM4ODQ1ODUsICAwLjk3MzkxODExMDEsICAwLjUzMzY1MTkxODIsICAwLjQ5NzQ3NjQyODcsCisgICAgICAgICAwLjM5OTgyODgyMTQsICAwLjM2NzQ1NDM3OTgsICAwLjI3MTk2OTQzNzYsICAwLjI2MDg5Mzk3MDcsCisgICAgICAgICAwLjIwODc5MzQwMTcsICAwLjE2NzU3MTY5MzcgfSB9LAorICAgIHsgeyAgMC4zNzM2MTQ2OTg2LCAtMS41NDU3ODMzNzA3LCAgMC45MjE2ODY0NzA1LCAgMC43OTU5MjQyMTY1LAorICAgICAgICAgMC43MzU4MjgzNDAxLCAgMC43MjMzMTEwOTY0LCAgMC43MjcxMTIxNDQyLCAgMC42ODUyMzUwODMxLAorICAgICAgICAgMC42ODkxNjcyMDE1LCAgMC42NTg5NTU0MjUwIH0sCisgICAgICB7ICAwLjEyNDY0NjA2NzYsIC0xLjcxNjc2NDk4NjUsICAwLjcwMzcxNjAzOTcsICAwLjQ4MDMwNjE3ODMsCisgICAgICAgICAwLjQ2OTQ5Mjg1MjcsICAwLjQ2NTQ5NTE5OTAsICAwLjUyMDgwNjk5ODAsICAwLjUzMDU3MTc1ODcsCisgICAgICAgICAwLjUyODgwMjMwNTUsICAwLjUyNzgxOTI3NTkgfSB9LAorICAgIHsgeyAgMS4wMTE2MDA5MTE2LCAgMC45ODgyNzAzNDI0LCAgMC44MzkzNzQxMjUwLCAgMC44ODg5ODQzNTI0LAorICAgICAgICAgMC44OTM0NDA3NTMyLCAgMC44OTA2MjI3MzUwLCAgMC45MjIyMTA3NTMwLCAgMC44OTczMDczMzYzLAorICAgICAgICAgMC45MjU3NDk2NTk1LCAgMC45MzA2NjQ4MDc2IH0sCisgICAgICB7ICAwLjUwOTc5NzA2NjUsIC0wLjAxMDY4NDM0MTIsICAwLjE0MTk0NzM4ODYsICAwLjI4MDQ4OTAyNzUsCisgICAgICAgICAwLjM3MTk3NjMxNjAsICAwLjM2OTQ4NTk3NDMsICAwLjQ2NDA1MzQyMjIsICAwLjUwMzQ0MDE0MTcsCisgICAgICAgICAwLjU1OTIxMDY4NzksICAwLjY2NTI0NjgxNDUgfSB9LAorICAgIHsgeyAgMC45NzE4MjA5ODAzLCAgMC43NjE1MTgxODA0LCAgMC4yMTcyNDc0NTYzLCAgMC40OTIwMzY5OTgzLAorICAgICAgICAgMC40MzEwODkxNjI4LCAgMC41MDM4MzMzNTM1LCAgMC40NjY4MDU5MDUxLCAgMC41MzM5MTQwNTk0LAorICAgICAgICAgMC40NDUzNzU4NTk3LCAgMC40MDUwMDYxMTA3IH0sCisgICAgICB7ICAwLjY1NDM2Nzk1MzUsICAwLjEyMDUxNzM0MzMsIC0wLjAwNTA0ODMwNDgsICAwLjE1ODAwMzUzODgsCisgICAgICAgICAwLjEzMDg3MTkyMTgsICAwLjE3MDA2MjAzNTMsICAwLjE3NDA1OTY4OTAsICAwLjIxNzk2ODM0NDcsCisgICAgICAgICAwLjE5NjczNDkwNTIsICAwLjE3MDM4OTcxMTkgfSB9LAorICAgIHsgeyAgMC43NjYzMDIyNTc4LCAgMC40MDI1MTU3NjkwLCAgMS4zODExNTQ1MDc0LCAgMS4xNjQyOTgxNzY4LAorICAgICAgICAgMS4wNzA5NzU4OTk3LCAgMC45ODEyNTgwNjQ1LCAgMS4wMDkyNDE2NDA2LCAgMC45MDg5MDcwODU3LAorICAgICAgICAgMC43Nzc2Mzk4NjU5LCAgMC44MTg5OTI2NDQ1IH0sCisgICAgICB7ICAwLjM0NzEzODQzNDYsICAwLjA2MDIyNDg2MDksICAxLjM5Njg4Mjk4MTEsICAxLjA4NDE0ODQ5NjQsCisgICAgICAgICAwLjg5NDAzMDU3MTAsICAwLjczMTM3MTkzOTIsICAwLjczNDUxNzYzMzksICAwLjUzMDQ0MDY4ODEsCisgICAgICAgICAwLjQwNzYyNzUyMjksICAwLjQ1MzU2Nzc3MzEgfSB9LAorICAgIHsgeyAgMC4xMzAwODU0OTgxLCAgMC4xMzIzMTM2OTg1LCAgMC43NTY0MDY0MjY0LCAgMC43MzM1MzQ2MDQzLAorICAgICAgICAgMC43OTI0NTA4NDUyLCAgMC42MDM5MDU3NjcyLCAgMC42ODk2OTE0ODQwLCAgMC4zNjk0ODU5NzQzLAorICAgICAgICAgMC4yODI1ODYxNTczLCAgMC4zMTc5MDk2ODc4IH0sCisgICAgICB7IC0wLjAyMDg0MjMxMzgsIC0wLjA1MzA4NTY4NDgsICAwLjM0NDkxMDIzNDIsICAwLjM4MTkzNzY4MjYsCisgICAgICAgICAwLjQ0NjY4NjU2NTksICAwLjI4MDc1MTE2ODcsICAwLjM4NDI5Njk1MzcsICAwLjExNDQ4ODA5NTAsCisgICAgICAgICAwLjA2MTczMjE3MzAsICAwLjA3NjczOTc1ODMgfSB9LAorICAgIHsgeyAgMC43NTU5NDc2NzkzLCAgMC44NDYyNTUzMzIyLCAgMC42NDUyNTg1NDU5LCAgMS4xMzA4NzUxNzAyLAorICAgICAgICAgMS4wNjA2ODY4NTY1LCAgMC45NDk4NjY2NTI1LCAgMC43NDI1MTI5NDE0LCAgMC42MjIxOTAxMTc4LAorICAgICAgICAgMC42NTc0NDgxMTMwLCAgMC42OTc2MjEyNTYxIH0sCisgICAgICB7ICAwLjM0MjA5MjIxNjAsICAwLjQzMTAyMzYyNzUsICAwLjI4MDA5NTgxNTcsICAwLjkzMTcxMzM3MjUsCisgICAgICAgICAwLjgyMTA4OTc3NDQsICAwLjYxNDQ1Njk1MTYsICAwLjMyMjc1OTMwMDUsICAwLjI0NjQ3NjIwMzIsCisgICAgICAgICAwLjI3Njk1MDEyMDksICAwLjM1MjE4NDY1MzMgfSB9LAorICAgIHsgeyAgMC43NjA5OTM4OTc5LCAgMC42OTQzNDQ0OTA4LCAgMS4xNDkwOTM5ODU2LCAgMC40MzUwODY4MTY1LAorICAgICAgICAgMC42MTAxOTcxNTY3LCAgMC42MjQ2MTQ5MjQyLCAgMC43MzcwMDc5NzU2LCAgMC42NTIyMDUyODg0LAorICAgICAgICAgMC42OTY2MzgyMjY1LCAgMC43NTY1Mzc0OTcwIH0sCisgICAgICB7ICAwLjM5MzkzMDY0MzgsICAwLjM0NDkxMDIzNDIsICAwLjk4NzQ4MzkxODcsICAwLjA5MTA5MTk5MDUsCisgICAgICAgICAwLjI4MDQyMzQ5MjIsICAwLjI4ODg3NzU0NjgsICAwLjQwNjA1NDY3NTYsICAwLjMyODQ2MDg3MjIsCisgICAgICAgICAwLjM0ODM4MzYwNTUsICAwLjQ4MTk0NDU2MTAgfSB9LAorICAgIHsgeyAgMC43ODI4ODI2OTA0LCAgMS4xODMzMDM0MTU4LCAgMS45OTE2MTU4OTE1LCAgMC44NjY3Njc4ODMzLAorICAgICAgICAgMC45MjE4ODMwNzY0LCAgMC44ODU2NDIwNTE3LCAgMC45MzczNDk0MDg5LCAgMC43NDE1Mjk5MTE4LAorICAgICAgICAgMC43NDUwMDMyODMwLCAgMC43MDc0NTE1NTIyIH0sCisgICAgICB7ICAwLjQ2ODUwOTgyMzEsICAxLjE3MTMxMDQ1NDYsICAxLjk4NTMyNDUwMjAsICAwLjYyMDY4MjgwNTgsCisgICAgICAgICAwLjY2NjQyNjQ1MDAsICAwLjYwMzM4MTQ4NDcsICAwLjYwODk1MTk4NTgsICAwLjM3ODQ2NDMxMTQsCisgICAgICAgICAwLjQyMTI1ODg2NjgsICAwLjM0NDE4OTM0NTggfSB9LAorICAgIHsgeyAgMC40NjcxMzM1ODE2LCAgMC40MTc3MTk5NjAyLCAgMC4wODA0MDk3MzU0LCAtMC4xODM2OTc1NTE1LAorICAgICAgICAtMC4xODAyMjQxODAyLCAtMC4wNzc1OTU4ODk2LCAtMC4wMjUwMzY1NzM0LCAgMC4wODg0MDUwNDI5LAorICAgICAgICAgMC4yMTM2NDMwMTQ0LCAgMC4zNDcyMDM5NzAwIH0sCisgICAgICB7ICAwLjExODc0Nzg5MDAsICAwLjExMjI1OTg5NDYsIC0wLjAzODE0MzYzNDgsIC0wLjIyODQ1ODE2NjEsCisgICAgICAgIC0wLjIzMDIyNzYxOTQsIC0wLjE3Mzg2NzI1NTQsIC0wLjEzNTAwNDgxODQsIC0wLjA1NDc4OTYwMjgsCisgICAgICAgICAwLjAwMDA2MzQ0OTEsICAwLjA1NDU4ODgyNDUgfSB9LAorICAgIHsgeyAgMC41NTQ1NTc2ODExLCAgMC40NzkxOTIwNzgxLCAgMC44MjA0OTk5NTY2LCAgMC44NDYyNTUzMzIyLAorICAgICAgICAgMC45MjEyMjc3MjM0LCAgMC44OTQ2MjAzODg3LCAgMC45NjU5ODgzMzgwLCAgMC45MTM3NTY2OTg0LAorICAgICAgICAgMC45MjI1Mzg0Mjk1LCAgMC45MjA3MDM0NDA5IH0sCisgICAgICB7ICAwLjExNzY5OTMyNTEsIC0wLjA0MjkyNzcxMjIsIC0wLjAzMzAzMTg4MDksICAwLjA1NjY4NTk1NDMsCisgICAgICAgICAwLjA5ODMwMDg3NDIsICAwLjE1OTM3OTc4MDMsICAwLjE3MzIwNzczMDEsICAwLjIzMjA1ODQzNTcsCisgICAgICAgICAwLjI3MzkzNTQ5NjgsICAwLjM3NTMxODYxNjYgfSB9LAorICAgIHsgeyAgMC43MTU3NzQ1MzYxLCAgMC42MzY3Mzg5NTYwLCAtMS4yMDM2ODkwNjg2LCAgMC43MTA3MjgzMTc1LAorICAgICAgICAgMC42ODg1MTE4NDg0LCAgMC43MzMyNzI0NjMxLCAgMC43NDM2MjcwNDE2LCAgMC43MTEzMTgxMzUzLAorICAgICAgICAgMC41OTM1NTExODg3LCAgMC42MDIzOTg0NTUxIH0sCisgICAgICB7ICAwLjM2NjQwNTgxNDksICAwLjMyODA2NzY2MDMsIC0xLjMwODIxNzg4MzEsICAwLjM5MDk4MTU1NTAsCisgICAgICAgICAwLjM2NDE3NzYxNDUsICAwLjM5MjY4NTQ3MzAsICAwLjM4OTg2NzQ1NDgsICAwLjQwODY3NjA4NzksCisgICAgICAgICAwLjMxMjc5NzkzMzgsICAwLjM5NDk3OTIwODcgfSB9LAorICAgIHsgeyAgMS4wMjY3Mzk1Njc1LCAgMS4wNjIxOTQxNjg2LCAgMS4wNDE1NTA1NDY5LCAgMC45OTcxMTc2MDg4LAorICAgICAgICAgMC45NzY0NzM5ODcxLCAgMC45OTA0MzMwMDc1LCAgMC45NTkxMDcxMzA4LCAgMC45MzM4NzYwMzc2LAorICAgICAgICAgMC45MDI2MTU2OTYyLCAgMC45MDczOTk3NzM2IH0sCisgICAgICB7ICAwLjk4NTU4MzM5NDgsICAxLjA1NDg1NDIxNDIsICAwLjk3ODcwMjE4NzUsICAwLjg1NzMzMDc5OTEsCisgICAgICAgICAwLjgzNjA5NzM1OTcsICAwLjgxOTMyMDMyMTEsICAwLjczODY0NjM1ODMsICAwLjcwMzg0NzExMDMsCisgICAgICAgICAwLjYzMzM5NjY1NTMsICAwLjY0MzQyMzU1NzMgfSB9LAorICAgIHsgeyAgMC42MjM1MDA4MjQwLCAgMC43NjM1NDk3NzQ5LCAgMC44MDk0OTAwMjUwLCAgMC43MjI3MjEyNzg3LAorICAgICAgICAtMC4wNjEwODA5OTIyLCAtMC4xMzU3OTEyNDIxLCAtMC4yMzU5MjkxOTExLCAgMC4wODAwMTY1MjM2LAorICAgICAgICAgMC4zOTcyNzI5NDQ1LCAgMC41MDc4OTY1NDI1IH0sCisgICAgICB7ICAwLjI5ODMxNDYzMTAsICAwLjQ5ODM5MzkyMzAsICAwLjQxNDU3NDI2NTUsICAwLjMyODQ2MDg3MjIsCisgICAgICAgIC0wLjMyMDMzODY2NjQsIC0wLjM0OTUwMTg3ODAsIC0wLjQ3MzQyOTE0MzQsIC0wLjE4MDgxMzk5ODAsCisgICAgICAgICAwLjEyMTEwNzE2MTAsICAwLjIwMDE0Mjc0MTIgfSB9LAorICAgIHsgeyAgMC44OTI1ODg3OTQyLCAgMC44ODA0NjQ3NjI0LCAgMC42MTUzMDg5MTA2LCAgMC42NzYwNjAxNDAxLAorICAgICAgICAgMC43ODg3MTUzMzI3LCAgMS4wMDY1NTQ2OTMwLCAgMS4wODI5MDMzMjU2LCAgMS4wMzQ3MzQ4NzUwLAorICAgICAgICAgMC45ODAwMTI4OTM3LCAgMC45MTI1NzcwNjI4IH0sCisgICAgICB7ICAwLjU5NTU4Mjc4MzIsICAwLjYxOTU2ODcwNTYsICAwLjI5MjQxNjQ1MzQsICAwLjM1NTM5NTg4MzMsCisgICAgICAgICAwLjU0MTcxMjc2MDksICAwLjg3MTM1NTM1NDgsICAwLjk5Nzc3Mjk2MTksICAwLjg4MTc3NTQ2ODYsCisgICAgICAgICAwLjc2NDUzMjgwNDUsICAwLjY2MDQ2MjczNzEgfSB9LAorICAgIHsgeyAgMS4xNTgxMzc4NTc5LCAgMS4wMzU5MTQ1MTA1LCAgMC43NzMxMTc5Mjk3LCAgMC42ODM5MjQzNzcwLAorICAgICAgICAgMC42ODM5ODk5MTIzLCAgMC42NjY0MjY0NTAwLCAgMC42OTEwNjc3MjU0LCAgMC42NTc5MDY4NjAxLAorICAgICAgICAgMC42Nzc5NjA2NjQwLCAgMC42MjQzNTI3ODMwIH0sCisgICAgICB7ICAxLjE1MDg2MzQzODgsICAwLjg0MDAyOTQ3ODEsICAwLjIzNTg1OTQ4MzUsICAwLjI1NDI3NDkwNDcsCisgICAgICAgICAwLjI0ODQ0MjI2MjQsICAwLjI2MjA3MzYwNjMsICAwLjI2NzY0NDEwNzMsICAwLjI3MTM3OTYxOTgsCisgICAgICAgICAwLjMwNjg5OTc1NjIsICAwLjMyMjMwMDU1MzMgfSB9LAorICAgIHsgeyAgMC4xMzc2MjIwNTg0LCAgMS4yNTcyOTI3NzczLCAgMC44NTkzNjIzOTM2LCAgMC42MjE4NjI0NDEzLAorICAgICAgICAgMC41MTI4MTE2OTA2LCAgMC41MzkzNTM0ODk5LCAgMC40NDM2MDY0MDY1LCAgMC40MzM0NDg0MzM5LAorICAgICAgICAgMC40NDk0MzkwNDg4LCAgMC40MDAyMjIwMzMzIH0sCisgICAgICB7IC0wLjExNTk5OTU3OTQsICAxLjI0MzMzMzc1NjksICAwLjQ4MDUwMjc4NDMsICAwLjI2MzI1MzI0MTgsCisgICAgICAgICAwLjE3Njk0MzI0MjUsICAwLjE4NjgzOTA3MzksICAwLjE1NTUxMzE5NzIsICAwLjE1MzAyMjg1NTUsCisgICAgICAgICAwLjE0OTAyNTIwMTgsICAwLjE1NTkwNjQwOTAgfSB9LAorICAgIHsgeyAgMC4xODE3MjczMjAwLCAtMC4wMDg1MjE2NzYxLCAgMC4wNzM5ODcyNzU0LCAgMC4xODA4MDk4MjU3LAorICAgICAgICAgMC4yNzcwODExOTE1LCAgMC4zMzQ0OTAxMjA0LCAgMC40MjkyNTQxNzQyLCAgMC41NDA0MDIwNTQ4LAorICAgICAgICAgMC41NzgwMTkzMjEwLCAgMC41NzA3NDQ5MDE5IH0sCisgICAgICB7IC0wLjAwMzU0MDk5MjcsIC0wLjAxODgxMDcxOTMsIC0wLjAwNTc2OTE5MzIsICAwLjAxMzIzNjA0NTgsCisgICAgICAgICAwLjA1NjA5NjEzNjYsICAwLjA1MzQ3NDcyNDMsICAwLjEwMDIwMTM5ODEsICAwLjE3MzczMjAxMjUsCisgICAgICAgICAwLjE3MDY1MTg1MzEsICAwLjE2Mzc3MDY0NTkgfSB9LAorICAgIHsgeyAgMC45NjQ4MDg3MDI1LCAgMS4wMDMwODEzMjE3LCAgMC45NTAxOTQzMjkwLCAgMC44MzgxOTQ0ODk1LAorICAgICAgICAgMC43NTQ1MDU5MDI1LCAgMC43NjIxNzM1MzM0LCAgMC43MTIxNzAwOTQzLCAgMC43MzI4NzkyNTEyLAorICAgICAgICAgMC43NTM0NTczMzc2LCAgMC43NDE0NjQzNzY0IH0sCisgICAgICB7ICAwLjE4NzIzMjI4NTcsIC0wLjAwODE5Mzk5OTUsICAwLjA2NjM4NTE3OTgsICAwLjA5NjMzNDgxNTAsCisgICAgICAgICAwLjA1MDkxODg0NzMsICAwLjA1NjU1NDg4MzcsICAwLjA0NzE4MzMzNDgsICAwLjA4MDkzNDAxNzksCisgICAgICAgICAwLjEwNDkxOTk0MDIsICAwLjE3NTEwODI1NDAgfSB9LAorICAgIHsgeyAgMC42NzkyNzEzNzAyLCAgMC45NTIxNjAzODgyLCAgMC41Mjk2NTQyNjQ1LCAgMC4zNjU3NTA0NjE4LAorICAgICAgICAgMC4zOTA1ODgzNDMxLCAgMC4zMTIxNDI1ODA3LCAgMC4yNzI2OTAzMjYwLCAgMC4zMTU2MTU5NTIwLAorICAgICAgICAgMC4yODU5Mjg0NTgwLCAgMC4zMTc5MDk2ODc4IH0sCisgICAgICB7ICAwLjIzMDc0NzcyOTUsICAwLjM3NzE1MzYwNTIsICAwLjA3NDM4MDQ4NzIsICAwLjAyNjAxNTQzMDcsCisgICAgICAgICAwLjA0Nzc3MzE1MjYsICAwLjAzOTE4ODAyNzQsICAwLjAyMjgwNDIwMDYsICAwLjA1NzI3NTc3MjEsCisgICAgICAgICAwLjAzMzc0ODU5NjksICAwLjA0OTIxNDkyOTMgfSB9LAorICAgIHsgeyAgMC44NjQ5MzI4OTQ3LCAgMC45NTA1ODc1NDA5LCAgMS4wNDQzMDMwMjk4LCAgMS4xNzA0NTg0OTU2LAorICAgICAgICAgMS4yNzA5MjQxMjExLCAgMS4zMjMyMjEyOTYxLCAgMS4yNDc3OTAxNTc4LCAgMS4xNTEzODc3MjEzLAorICAgICAgICAgMS4wMzQ2MDM4MDQzLCAgMC45Njk1MjcyNDQ2IH0sCisgICAgICB7ICAwLjQ2MjA4NzM2MzAsICAwLjU2ODU4MjIzNjgsICAwLjg5NzUwMzk0MjMsICAxLjA0NzY0NTMzMDQsCisgICAgICAgICAxLjIyNzg2NzQyNDUsICAxLjIyOTA0NzA2MDAsICAxLjE5NjIxMzg3MTIsICAxLjAwNTExMjkxNjIsCisgICAgICAgICAwLjg3MDYzNDQ2NjQsICAwLjc0Nzc1NTc2NTkgfSB9LAorICAgIHsgeyAgMC40MTg4MzQwNjA0LCAgMC42MDExNTMyODQzLCAgMC40NzI2Mzg1NDc0LCAgMC42Mzg5NjcxNTY0LAorICAgICAgICAgMC42NzUzMzkyNTE4LCAgMC43ODQyNTg5MzE5LCAgMC42MTQ3ODQ2MjgyLCAgMC42NzA4ODI4NTA5LAorICAgICAgICAgMC42NDA2MDU1MzkxLCAgMC41Mzk4Nzc3NzIzIH0sCisgICAgICB7ICAwLjEwMTI0OTk2MzAsICAwLjIzMTIwNjQ3NjcsICAwLjE3NzMzNjQ1NDQsICAwLjI4MDAzMDI4MDQsCisgICAgICAgICAwLjMzNDgxNzc5NjksICAwLjQzNDMwMDM5MjksICAwLjI4MjI1ODQ4MDgsICAwLjMyOTMxMjgzMTIsCisgICAgICAgICAwLjMwMjQ0MzM1NTMsICAwLjI0MDE4NDgxMzcgfSB9LAorICAgIHsgeyAgMC41MDQ5NDc0NTM3LCAgMC43OTQzNTEzNjkxLCAgMC45NTM2MDIxNjUwLCAgMC45NDA3NTcyNDQ4LAorICAgICAgICAgMC45ODIzNzIxNjQ3LCAgMC45NzQ3MDQ1MzM4LCAgMS4wMTQ1NTAwMDA0LCAgMC45NjI5NzM3MTM5LAorICAgICAgICAgMC45NTI2MTkxMzU0LCAgMC45MjgzNzEwNzE4IH0sCisgICAgICB7ICAwLjA1NjYyMDQxOTAsICAwLjA5NzMxNzg0NDYsICAwLjU4MTIzMDU1MTAsICAwLjU2ODcxMzMwNzQsCisgICAgICAgICAwLjY4MzQwMDA5NDUsICAwLjY2MTY0MjM3MjYsICAwLjc2MTE5MDUwMzgsICAwLjY2ODM5MjUwOTIsCisgICAgICAgICAwLjY0NjMwNzExMDgsICAwLjYxMTgzNTUzOTMgfSB9LAorICAgIHsgeyAgMC44OTY5MTQxMjQ1LCAgMC45MzU5NzMxNjc0LCAgMC44NzU2MTUxNDk3LCAgMC44NDE5MzAwMDIwLAorICAgICAgICAgMC44MzUzMTA5MzYwLCAgMC42ODA3MTMxNDY5LCAgMC4zMzU4MDA4MjY1LCAgMC4zMzg2MTg4NDQ3LAorICAgICAgICAgMC4zNTI0NDY3OTQ1LCAgMC40NDk1MDQ1ODQxIH0sCisgICAgICB7ICAwLjUyOTg1MDg3MDQsICAwLjQ2MDY0NTU4NjMsICAwLjQ5MzQxMzIzOTcsICAwLjQ0MTU3NDgxMTksCisgICAgICAgICAwLjQwMTUzMjczOTQsICAwLjIwNTI1NDQ5NTEsIC0wLjAzMjk2NjM0NTUsIC0wLjAxNTQ2ODQxODYsCisgICAgICAgICAwLjA0MTgwOTQzOTcsICAwLjE2MzExNTI5MjggfSB9LAorICAgIHsgeyAgMC42MzQ1NzYyOTA4LCAgMi41MjA5NDQ1NjU1LCAgMS4wMzczNTYyODcyLCAgMC45MTY2NDAyNTE5LAorICAgICAgICAgMC44ODY1NTk1NDYwLCAgMC44OTA3NTM4MDU2LCAgMC44NTIyMTkwNDUyLCAgMC43MjkwNzgyMDM0LAorICAgICAgICAgMC43Mzg1ODA4MjI5LCAgMC42MzQ1MTA3NTU1IH0sCisgICAgICB7ICAwLjI2NDE3MDczNjEsICAyLjU2OTYzNzI5ODYsICAwLjg1Mzk4ODQ5ODQsICAwLjY1MzI1Mzg1MzMsCisgICAgICAgICAwLjYwODc1NTM3OTksICAwLjU4NTE2MjY2OTQsICAwLjUyNzYyMjY2OTksICAwLjQzMzA1NTIyMjAsCisgICAgICAgICAwLjM5NzE0MTg3MzgsICAwLjM1OTk4MzM1NDggfSB9LAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHdtYXZvaWNlX2xzcDE2X2ludGVyY29lZmZfYVszMl1bMl1bMTZdID0geworICAgIHsgeyAgMC41MzM3MjM4MzEyLCAgMC40ODEwNjk1NjQ4LCAtMC4zNzY2NTM2NzEzLCAtMC4xMjA0NzY3MjI3LAorICAgICAgICAtMC4wODk4NDM3NTAwLCAtMC4wMDcwODk2MTQ5LCAgMC4xMTM0NzM4OTIyLCAgMC4xMzM3NzI4NTAwLAorICAgICAgICAgMC4zNzM5MTU2NzIzLCAgMC4zODQ5MDU4MTUxLCAgMC40MjIwMTgwNTExLCAgMC41NDA0OTAxNTA1LAorICAgICAgICAgMC41MjI0ODc2NDA0LCAgMC41NTAyOTEwNjE0LCAgMC41MzEzNDUzNjc0LCAgMC40NDA1OTQ2NzMyIH0sCisgICAgICB7ICAwLjE3NzUyODM4MTMsICAwLjE2NzkzMjUxMDQsIC0wLjI3MDI3ODkzMDcsIC0wLjEzNTkzNjczNzEsCisgICAgICAgIC0wLjE0NTI0NTU1MjEsIC0wLjA4ODg1OTU1ODEsIC0wLjAyNTY2NjIzNjksIC0wLjAwMjM3MzY5NTQsCisgICAgICAgICAwLjEwNzQwNDcwODksICAwLjE0MzE2MzY4MTAsICAwLjEzNTc0MTIzMzgsICAwLjIwNDU1MjY1MDUsCisgICAgICAgICAwLjI2ODY0ODE0NzYsICAwLjM0MDQ1MzE0NzksICAwLjMyMDkzMzM0MjAsICAwLjE0OTM5Njg5NjQgfSB9LAorICAgIHsgeyAgMC43NDAyNDAwOTcwLCAgMC4wODM4MjUxMTE0LCAgMC42NDg2MjgyMzQ5LCAgMC42MTQ1MDk1ODI1LAorICAgICAgICAgMC43MzMxMDQ3MDU4LCAgMC43MTgzMDA4MTk0LCAgMC43NDM2ODQ3Njg3LCAgMC43NjI3OTQ0OTQ2LAorICAgICAgICAgMC43NjUzNzc5OTg0LCAgMC43Nzk1NjY3NjQ4LCAgMC44Mzk5MzA1MzQ0LCAgMC44MzkzMTU0MTQ0LAorICAgICAgICAgMC44MjE5NjkwMzIzLCAgMC43NDc0MTY0OTYzLCAgMC42NjgxMDcwMzI4LCAgMC42NDkwNzkzMjI4IH0sCisgICAgICB7ICAwLjI4NTA1MTM0NTgsIC0wLjA1NDQxMjg0MTgsIC0wLjAzMDAxMzA4NDQsICAwLjAyMDQ2Nzc1ODIsCisgICAgICAgICAwLjAzMjg5MzE4MDgsICAwLjA1ODkzMzI1ODEsICAwLjA3OTY0MjI5NTgsICAwLjExODc2MzkyMzYsCisgICAgICAgICAwLjEzMjA1MDUxNDIsICAwLjE1MzkwNzc3NTksICAwLjIxODk4NzQ2NDksICAwLjI4NjUyNzYzMzcsCisgICAgICAgICAwLjI5NzM5NDc1MjUsICAwLjI2MTQzMDc0MDQsICAwLjI0MTY2NDg4NjUsICAwLjI0Mjg5NTEyNjMgfSB9LAorICAgIHsgeyAgMC42MTI5OTIyODY3LCAgMC43MzAwNzAxMTQxLCAgMC4yMDczODIyMDIxLCAgMC41MDA1ODkzNzA3LAorICAgICAgICAgMC41NzEzNjkxNzExLCAgMC41Mzc0OTY1NjY4LCAgMC42MjkzMTM0Njg5LCAgMC41NjM5MDU3MTU5LAorICAgICAgICAgMC43NDAyODExMDUwLCAgMC42OTgyODg5MTc1LCAgMC40NjY4Mzk3OTAzLCAgMC42Njk4NzAzNzY2LAorICAgICAgICAgMC44NzU4NTM1Mzg1LCAgMC44Njc4NTY5Nzk0LCAgMC44Njc4NTY5Nzk0LCAgMC43ODEwODQwNjA3IH0sCisgICAgICB7ICAwLjI5ODYyNDk5MjQsICAwLjMyNjk2MTUxNzMsICAwLjAwOTY0MTY0NzMsICAwLjE4MDA3MDg3NzEsCisgICAgICAgICAwLjI0NzQwNjAwNTksICAwLjIyMDM0MDcyODgsICAwLjMwMDc5ODQxNjEsICAwLjI2NzQxNzkwNzcsCisgICAgICAgICAwLjQ0MjQ4MTA0MTAsICAwLjQwNDYzMDY2MTAsICAwLjIwNjM5ODAxMDMsICAwLjQyMzAwMjI0MzAsCisgICAgICAgICAwLjYyMjIxOTA4NTcsICAwLjY1NzQ0NDk1MzksICAwLjY3NzY2MTg5NTgsICAwLjY2MDQzODUzNzYgfSB9LAorICAgIHsgeyAgMC43MjU4MDUyODI2LCAgMC41MDczOTY2OTgwLCAtMC4zOTQ3MzgxOTczLCAgMC41MjU0ODEyMjQxLAorICAgICAgICAgMS4wNTYxMjQ2ODcyLCAgMC45NzA2MjMwMTY0LCAgMC45NzI3MTQ0MjQxLCAgMC45MTg1ODM4Njk5LAorICAgICAgICAgMC44MTg0ODMzNTI3LCAgMC45MDkzOTgwNzg5LCAgMC44NjQ1MzUzMzE3LCAgMC43ODcwMzAyMjAwLAorICAgICAgICAgMC42MzQ3Njc1MzIzLCAgMC41MTIzOTk2NzM1LCAgMC4yODQ2MDAyNTc5LCAgMC4zMjUyODAxODk1IH0sCisgICAgICB7ICAwLjQzMDYyOTczMDIsICAwLjIxODI5MDMyOTAsIC0wLjQ5MDI0NTgxOTEsICAwLjE3ODM0ODU0MTMsCisgICAgICAgICAwLjc3ODMzNjUyNTAsICAwLjcxNTIyNTIxOTcsICAwLjc0MDQ0NTEzNzAsICAwLjYwMTI2Mzk5OTksCisgICAgICAgICAwLjU0MjEzMDQ3MDMsICAwLjY2MTk1NTgzMzQsICAwLjYzMTY5MTkzMjcsICAwLjU1OTY4MTg5MjQsCisgICAgICAgICAwLjM5NTIzOTgzMDAsICAwLjM1NjczMzMyMjEsICAwLjE1MDUwNDExMjIsICAwLjEyOTAxNTkyMjUgfSB9LAorICAgIHsgeyAgMC4zMDc3Mjg3Njc0LCAgMC4yNTQzMzYzNTcxLCAgMC4yODM0NTIwMzQwLCAgMC41MjgyMjg3NTk4LAorICAgICAgICAgMC41MzUwMzYwODcwLCAgMC40OTQzOTcxNjM0LCAgMC40NTIxOTk5MzU5LCAgMC4zMDg2MzA5NDMzLAorICAgICAgICAgMC4yMzcyNzcwMzA5LCAgMC4wODE5Mzg3NDM2LCAtMC4xMzg1NjEyNDg4LCAtMC4wODQ4NDA3NzQ1LAorICAgICAgICAtMC4wMzgwOTE2NTk1LCAgMC4xMTkyMTUwMTE2LCAgMC4zMjI4MTk3MDk4LCAgMC4zMDEyOTA1MTIxIH0sCisgICAgICB7ICAwLjA1NjcxODgyNjMsICAwLjAxOTY4ODYwNjMsICAwLjA2ODI0MjA3MzEsICAwLjIxMDI1Mjc2MTgsCisgICAgICAgICAwLjI0NTIzMjU4MjEsICAwLjIwNjA2OTk0NjMsICAwLjE2MjAyNzM1OTAsICAwLjA3ODQxMjA1NjAsCisgICAgICAgICAwLjA0MTgzMjkyMzksIC0wLjA1MDgwNDEzODIsIC0wLjIxOTM4ODAwODEsIC0wLjE2NDQ3ODMwMjAsCisgICAgICAgIC0wLjEzNjE4Mjc4NTAsIC0wLjAzMDc1MTIyODMsICAwLjE0ODY1ODc1MjQsICAwLjIzNTYzNjcxMTEgfSB9LAorICAgIHsgeyAgMC40Mzg3OTAzMjE0LCAgMC41NzIzOTQzNzEwLCAgMC42MTQ3NTU2MzA1LCAgMC45OTczNjAyMjk1LAorICAgICAgICAgMS4xNjQ1NDk4Mjc2LCAgMS4xODk4OTI3Njg5LCAgMS4wMzI2NjgxMTM3LCAgMC42OTM5MDEwNjIwLAorICAgICAgICAgMC42MDY0MzEwMDc0LCAgMC40Njg2NDQxNDIyLCAgMC40NjQ2NjYzNjY2LCAgMC40ODk1NTgyMTk5LAorICAgICAgICAgMC41NjU0MjMwMTE4LCAgMC42MDA0ODQ4NDgwLCAgMC42MTc5MTMyNDYyLCAgMC42NDM5MTIzMTU0IH0sCisgICAgICB7ICAwLjEzMjQxOTU4NjIsICAwLjI0MjYwODA3MDQsICAwLjMxMzIyMzgzODgsICAwLjczNTk3NTI2NTUsCisgICAgICAgICAwLjk3NDkyODg1NTksICAwLjk1MzU2MzY5MDIsICAwLjgxMDUyNzgwMTUsICAwLjQxMTg4OTA3NjIsCisgICAgICAgICAwLjMwMTMzMTUyMDEsICAwLjIwMDYxNTg4MjksICAwLjIzMzEzNTIyMzQsICAwLjI1MzUxNjE5NzIsCisgICAgICAgICAwLjMzNzUwMDU3MjIsICAwLjQxMDMzMDc3MjQsICAwLjQxMDI4OTc2NDQsICAwLjQ1MjkzODA3OTggfSB9LAorICAgIHsgeyAgMC43MzM1NTU3OTM4LCAgMC45MjAzNDcyMTM3LCAgMC40ODUyMTEzNzI0LCAgMC44NjQ2OTkzNjM3LAorICAgICAgICAgMC43MzA0MzkxODYxLCAgMC43NTAzNjkwNzIwLCAgMC42Mjg5ODU0MDUwLCAgMC42OTAwNDYzMTA0LAorICAgICAgICAgMC42NDIxMDc5NjM2LCAgMC41MTg0Mjc4NDg4LCAgMC40NDQ0OTA0MzI3LCAgMC4yNjYwMjM2MzU5LAorICAgICAgICAgMC4yMTQzMTI1NTM0LCAgMC4yNDA2Mzk2ODY2LCAgMC40ODM2OTQwNzY1LCAgMC41NTk3MjI5MDA0IH0sCisgICAgICB7ICAwLjM2ODk5NDcxMjgsICAwLjQ5NjczNDYxOTEsICAwLjExNzY1NjcwNzgsICAwLjUxMjc2ODc0NTQsCisgICAgICAgICAwLjMyMzUxNjg0NTcsICAwLjM0MjYyNjU3MTcsICAwLjI0MTc0NjkwMjUsICAwLjMzMTA2MjMxNjksCisgICAgICAgICAwLjI2Mjk4OTA0NDIsICAwLjIxMzA4MjMxMzUsICAwLjEzMjkxMTY4MjEsICAwLjA0Njg3NjkwNzMsCisgICAgICAgIC0wLjAwODE5NjgzMDcsICAwLjAxNDY0NDYyMjgsICAwLjI0NDA0MzM1MDIsICAwLjM0MDg2MzIyNzggfSB9LAorICAgIHsgeyAgMC45NDI1MzI1Mzk0LCAgMC45NTk3OTY5MDU1LCAgMC42MTYwNjc4ODY0LCAgMC43MDUwOTYyNDQ4LAorICAgICAgICAgMC44MDYzODU5OTQwLCAgMC45MDYzMjI0NzkyLCAgMC45ODkwMzU2MDY0LCAgMS4wMDM4ODA1MDA4LAorICAgICAgICAgMS4wMzM4MTYzMzc2LCAgMC45NDUzNjIwOTExLCAgMC45NjM0MDU2MDkxLCAgMC44MDY4MzcwODE5LAorICAgICAgICAgMC42ODU5NDU1MTA5LCAgMC44OTA5MDM0NzI5LCAgMC45OTkwNDE1NTczLCAgMS4wMTIyODcxMzk5IH0sCisgICAgICB7ICAwLjY4OTU5NTIyMjUsICAwLjY0NTE4MzU2MzIsICAwLjMxNjk5NjU3NDQsICAwLjQyNjg1Njk5NDYsCisgICAgICAgICAwLjU2NjYxMjI0MzcsICAwLjc3MjI2NzM0MTYsICAwLjg4NDU4ODI0MTYsICAwLjkwNjE1ODQ0NzMsCisgICAgICAgICAwLjk1NTAzOTk3ODAsICAwLjgxMTg4MTA2NTQsICAwLjg2MDEwNjQ2ODIsICAwLjYxMjk5MjI4NjcsCisgICAgICAgICAwLjUwNjk4NjYxODAsICAwLjcwNjUzMTUyNDcsICAwLjc4NjI5MjA3NjEsICAwLjc3NjY1NTE5NzEgfSB9LAorICAgIHsgeyAgMC41NjQxNTE3NjM5LCAtMC4wOTQxOTA1OTc1LCAgMC4wNDEyOTk4MTk5LCAgMC4xODEwNTUwNjkwLAorICAgICAgICAgMC4zNDU5NDgyMTkzLCAgMC40MjEzMjA5MTUyLCAgMC40NDAxMDI1NzcyLCAgMC41Mzk3MTA5OTg1LAorICAgICAgICAgMC41NjA3ODkxMDgzLCAgMC42MzQ4OTA1NTYzLCAgMC42ODYxOTE1NTg4LCAgMC43MjgwNjA3MjI0LAorICAgICAgICAgMC43MjY3MDc0NTg1LCAgMC42NDQ3MzI0NzUzLCAgMC41OTQ4MjU3NDQ2LCAgMC41NDc1MDI1MTc3IH0sCisgICAgICB7ICAwLjE5MDY5MTk0NzksIC0wLjA1MTkxMTM1NDEsIC0wLjA2MDgxMDA4OTEsIC0wLjAwMTg4MTU5OTQsCisgICAgICAgICAwLjAzODMwNjIzNjMsICAwLjAzNjI1NTgzNjUsICAwLjA1Mjk4NzA5ODcsICAwLjA2OTI2NzI3MjksCisgICAgICAgICAwLjA5NTMwNzM1MDIsICAwLjEzMjc4ODY1ODEsICAwLjEzOTA2Mjg4MTUsICAwLjE5MDQ0NTkwMDAsCisgICAgICAgICAwLjIzNjI1MTgzMTEsICAwLjIwNjM5ODAxMDMsICAwLjIzMTE2NjgzOTYsICAwLjIyOTE1NzQ0NzggfSB9LAorICAgIHsgeyAgMC45OTAxNDI4MjIzLCAgMC45NTg5NzY3NDU2LCAgMC45MDEyMzc0ODc4LCAgMC44MDE3OTMwOTg0LAorICAgICAgICAgMC44OTI5NTM4NzI3LCAgMC44NTEyMDc3MzMyLCAgMC44NzkwMTExNTQyLCAgMC44ODMyNzU5ODU3LAorICAgICAgICAgMC44OTQ5NjMyNjQ1LCAgMC45MTU5MTgzNTAyLCAgMC45MjkzMjc5NjQ4LCAgMC45MTUyNjIyMjIzLAorICAgICAgICAgMC45MjQ3MzUwNjkzLCAgMC44NzUzNjE0NDI2LCAgMC44NzMwMjM5ODY4LCAgMC44MDY2NzMwNDk5IH0sCisgICAgICB7ICAwLjQyMzA0MzI1MTAsIC0wLjA0NjQ1NzI5MDYsICAwLjAxODI1MzMyNjQsICAwLjExNTk3NTM3OTksCisgICAgICAgICAwLjIzNDkzOTU3NTIsICAwLjI3NDA2MTIwMzAsICAwLjI5ODcwNzAwODQsICAwLjM2MjA2NDM2MTYsCisgICAgICAgICAwLjM5MjMyODI2MjMsICAwLjQ2OTQ2NDMwMjEsICAwLjUyMDIzMjIwMDYsICAwLjUzNTY1MTIwNzAsCisgICAgICAgICAwLjU1NjQwMTI1MjcsICAwLjUzNjI2NjMyNjksICAwLjQ3OTE4MzE5NzAsICAwLjUwNDY5MDE3MDMgfSB9LAorICAgIHsgeyAgMC45Nzg1Mzc1NTk1LCAgMC44ODIwNDU3NDU4LCAgMC4zOTY1MTEwNzc5LCAgMC40NzkwMTkxNjUwLAorICAgICAgICAgMC4zOTA3Njk5NTg1LCAgMC40MTk1NTc1NzE0LCAgMC4yOTM4MjcwNTY5LCAgMC40MDkxNDE1NDA1LAorICAgICAgICAgMC4zNjU5MTkxMTMyLCAgMC40MDMwNzIzNTcyLCAgMC40MTY4NTEwNDM3LCAgMC41MDMwOTA4NTg1LAorICAgICAgICAgMC41MDIzMTE3MDY1LCAgMC41NTExNTIyMjkzLCAgMC41MzU0MDUxNTkwLCAgMC41NTYzMTkyMzY4IH0sCisgICAgICB7ICAwLjY1OTI5MDMxMzcsICAwLjI5MzM3NTk2ODksICAwLjA1NjI2NzczODMsICAwLjEyODY4Nzg1ODYsCisgICAgICAgICAwLjA3NTgyODU1MjIsICAwLjExOTI1NjAxOTYsICAwLjA1MDg5NTY5MDksICAwLjExNzUzMzY4MzgsCisgICAgICAgICAwLjA2ODQwNjEwNTAsICAwLjA5ODg3NTA0NTgsICAwLjA5MjM5NTc4MjUsICAwLjE4MTk1NzI0NDksCisgICAgICAgICAwLjE5NjUxNTA4MzMsICAwLjIyNTc1Mzc4NDIsICAwLjMwNDk4MTIzMTcsICAwLjI5OTMyMjEyODMgfSB9LAorICAgIHsgeyAgMC43MTIwMjY1OTYxLCAgMC43ODQ3NzQ3ODAzLCAgMC42MDY1OTUwMzk0LCAgMC43MjM1OTA4NTA4LAorICAgICAgICAgMC42NzQwNTMxOTIxLCAgMC42NTM1MDgxODYzLCAgMC4zNzM0MjM1NzY0LCAgMC40Nzg4NTUxMzMxLAorICAgICAgICAgMC40NDEwODY3NjkxLCAgMC42OTI3NTI4MzgxLCAgMS4wNzU4NDk1MzMxLCAgMS4xMTQ4ODkxNDQ5LAorICAgICAgICAgMS4wNzA4ODc1NjU2LCAgMC44ODk2MzIyMjUwLCAgMC42NDAxODA1ODc4LCAgMC41MDU3MTUzNzAyIH0sCisgICAgICB7ICAwLjQyMTAzMzg1OTMsICAwLjQ3NjMxMjYzNzMsICAwLjMyMjkwMTcyNTgsICAwLjQwNzkxMTMwMDcsCisgICAgICAgICAwLjM5MjI0NjI0NjMsICAwLjM1MjkxOTU3ODYsICAwLjEyNTg5OTMxNDksICAwLjIxNjg5NjA1NzEsCisgICAgICAgICAwLjIyMDc1MDgwODcsICAwLjQ2MDU2NTU2NzAsICAwLjg3NTkzNTU1NDUsICAwLjk1MjYyMDUwNjMsCisgICAgICAgICAwLjg4NDM4MzIwMTYsICAwLjcwMDEzNDI3NzMsICAwLjQ1MDM1NDU3NjEsICAwLjM0ODQwODY5OTAgfSB9LAorICAgIHsgeyAgMC41MjU0NDAyMTYxLCAgMC41MzQ5NTQwNzEwLCAgMC43MDM2MTk5NTcwLCAgMC42MjQwMjM0Mzc1LAorICAgICAgICAgMC42NDY0NTQ4MTExLCAgMC43NTM3NzI3MzU2LCAgMC44MzExNTQ4MjMzLCAgMC43MzM0MzI3Njk4LAorICAgICAgICAgMC4zNDg0OTA3MTUwLCAgMC4xODQ2NjM3NzI2LCAgMC4wODk0MDIxOTg4LCAgMC4zOTc3ODIzMjU3LAorICAgICAgICAgMC43NjcyMjMzNTgyLCAgMC45MjI0Nzk2Mjk1LCAgMC44ODE4NDA3MDU5LCAgMC43NDUzMjUwODg1IH0sCisgICAgICB7ICAwLjI1ODc2NTIyMDYsICAwLjI1MjQ0OTk4OTMsICAwLjQxMzU3MDQwNDEsICAwLjMxMjkzNjc4MjgsCisgICAgICAgICAwLjM0MDM3MTEzMTksICAwLjQ0NzMxOTk4NDQsICAwLjUzMzAyNjY5NTMsICAwLjQyMjc1NjE5NTEsCisgICAgICAgICAwLjEwODAxOTgyODgsIC0wLjAwNDQ2NTEwMzEsIC0wLjA3MjcwMjQwNzgsICAwLjE1ODM3NzY0NzQsCisgICAgICAgICAwLjUzMDIzODE1MTYsICAwLjczMTM4MjM3MDAsICAwLjY3MzU2MTA5NjIsICAwLjU2MzA4NTU1NjAgfSB9LAorICAgIHsgeyAgMC43OTM2MzI1MDczLCAgMC44NTUxMDM0OTI3LCAgMC45NzU1ODQ5ODM4LCAgMC44OTUzMzIzMzY0LAorICAgICAgICAgMC45MzQ1NzY5ODgyLCAgMC43MjAyMjgxOTUyLCAgMC44Mzg4MjMzMTg1LCAgMC43OTQxNjU2MTEzLAorICAgICAgICAgMC43NTUwODQ5OTE1LCAgMC43ODk0OTA2OTk4LCAgMC44NTkwNDAyNjAzLCAgMC43ODEzNzExMTY2LAorICAgICAgICAgMC44NDgzMzcxNzM1LCAgMC44NjUyMzI0Njc3LCAgMC44NTg2NzExODg0LCAgMC45NTg0ODQ2NDk3IH0sCisgICAgICB7ICAwLjQ3ODE1Nzk5NzEsICAwLjQ3MzE5NjAyOTcsICAwLjgyODk0MDM5MTUsICAwLjYxNzUwMzE2NjIsCisgICAgICAgICAwLjcyNjI5NzM3ODUsICAwLjM2MzgyNzcwNTQsICAwLjU1NDQzMjg2OTAsICAwLjQ3NjE4OTYxMzMsCisgICAgICAgICAwLjQzODg3MjMzNzMsICAwLjUwMjE0NzY3NDYsICAwLjU2MzA0NDU0ODAsICAwLjQ1NjIxODcxOTUsCisgICAgICAgICAwLjUxOTA0Mjk2ODgsICAwLjU5Mzc1OTUzNjcsICAwLjYxMjE3MjEyNjgsICAwLjY5NzM0NTczMzYgfSB9LAorICAgIHsgeyAgMS4wNzI0NDU4Njk0LCAgMS4wNDQ5NzA1MTI0LCAgMC44NTk0NTAzNDAzLCAgMC43NjA0MTYwMzA5LAorICAgICAgICAgMC43ODM3OTA1ODg0LCAgMC44MTM2NDQ0MDkyLCAgMC43NjIzMDIzOTg3LCAgMC42MDk4NzU2NzkwLAorICAgICAgICAgMC42NDMyNTYxODc0LCAgMC42Mzk1MjQ0NTk4LCAgMC42ODUzNzEzOTg5LCAgMC43NDAxNTgwODExLAorICAgICAgICAgMC43Mzk5NTMwNDExLCAgMC43NjUyNTQ5NzQ0LCAgMC43Njc1MTA0MTQxLCAgMC43MzkzNzg5MjkxIH0sCisgICAgICB7ICAwLjkzODIyNjY5OTgsICAwLjg0MTk4MDkzNDEsICAwLjMwODc1Mzk2NzMsICAwLjM2MjAyMzM1MzYsCisgICAgICAgICAwLjM1NDc2NDkzODQsICAwLjQyNDEwOTQ1ODksICAwLjI4NTc4OTQ4OTcsICAwLjIxMjM4NTE3NzYsCisgICAgICAgICAwLjIzNTU5NTcwMzEsICAwLjI3OTQzMzI1MDQsICAwLjMyMTk5OTU0OTksICAwLjM4OTgyNjc3NDYsCisgICAgICAgICAwLjM5Mzc2MzU0MjIsICAwLjQwNTgxOTg5MjksICAwLjQyMjgzODIxMTEsICAwLjQxODEyMjI5MTYgfSB9LAorICAgIHsgeyAgMS4wMjc1NDIxMTQzLCAgMS4wOTQwNTcwODMxLCAgMS4wMTY0Mjg5NDc0LCAgMC45MDk3NjcxNTA5LAorICAgICAgICAgMC45NDAwNzIwNTk2LCAgMC44OTc2Mjg3ODQyLCAgMC45MTc1NTg2NzAwLCAgMC44OTAwODMzMTMwLAorICAgICAgICAgMC45MTU0MjYyNTQzLCAgMC45NDkyNTc4NTA2LCAgMS4wMDExMzI5NjUxLCAgMS4wMzYxNTM3OTMzLAorICAgICAgICAgMS4wMzU5NDg3NTM0LCAgMC45MzIwMzQ0OTI1LCAgMC44OTc0MjM3NDQyLCAgMC44ODExODQ1Nzc5IH0sCisgICAgICB7ICAxLjAwNDYxODY0NDcsICAxLjA4NjAxOTUxNjAsICAwLjk0NDI5NTg4MzIsICAwLjc0NzMzNDQ4MDMsCisgICAgICAgICAwLjc4NzYwNDMzMjAsICAwLjc0MTA2MDI1NzAsICAwLjc0MjIwODQ4MDgsICAwLjY4NDQ2OTIyMzAsCisgICAgICAgICAwLjcyNTY0MTI1MDYsICAwLjg0NTU0ODYyOTgsICAwLjg5NjkzMTY0ODMsICAwLjkzNjIxNzMwODAsCisgICAgICAgICAwLjkwOTIzNDA0NjksICAwLjgyMjcwNzE3NjIsICAwLjc0ODE1NDY0MDIsICAwLjcwODg2ODk4MDQgfSB9LAorICAgIHsgeyAgMC4yMjA1MDQ3NjA3LCAtMC4wMTI5NTM3NTgyLCAgMC4wOTcyMzQ3MjYwLCAgMC4xMTU0ODMyODQwLAorICAgICAgICAgMC4wOTUxODQzMjYyLCAgMC4xNTMyNTE2NDc5LCAgMC4xMjg4MTA4ODI2LCAgMC4xNzQ5ODU4ODU2LAorICAgICAgICAgMC4xNTkxMTU3OTEzLCAgMC4yMTM0OTIzOTM1LCAgMC4yNDc3MzQwNjk4LCAgMC4yNjM0ODExNDAxLAorICAgICAgICAgMC4zMDMyOTk5MDM5LCAgMC4zMjcyNDg1NzMzLCAgMC4zMTcwNzg1OTA0LCAgMC4zMTcyMDE2MTQ0IH0sCisgICAgICB7ICAwLjAwMzI4NTQwODAsIC0wLjA0NDYxMTkzMDgsICAwLjAyODQ2NDMxNzMsICAwLjAxNTU0Njc5ODcsCisgICAgICAgIC0wLjAwNjMxMDQ2MzAsICAwLjAyMjYwMDE3NDAsICAwLjAwODY5ODQ2MzQsICAwLjAyNjIwODg3NzYsCisgICAgICAgICAwLjAxNzM5MjE1ODUsICAwLjAzNjA1MDc5NjUsICAwLjAzNjY2NTkxNjQsICAwLjAyMTUzMzk2NjEsCisgICAgICAgICAwLjA0MTIxNzgwNDAsICAwLjEwNDczOTE4OTEsICAwLjEyNTgxNzI5ODksICAwLjA2MDk4MzY1NzggfSB9LAorICAgIHsgeyAgMC4xNDk1NjA5MjgzLCAgMC4zMjc1NzY2MzczLCAgMC44NTk4MTk0MTIyLCAgMC42ODQ3NTYyNzkwLAorICAgICAgICAgMC43NTUwODQ5OTE1LCAgMC41NjYyNDMxNzE3LCAgMC42OTMwMzk4OTQxLCAgMC43NTI2MjQ1MTE3LAorICAgICAgICAgMC43MzAwMjkxMDYxLCAgMC43Mjg0NzA4MDIzLCAgMC42NjA4ODk2MjU1LCAgMC41MjI0MDU2MjQ0LAorICAgICAgICAgMC40MjczOTAwOTg2LCAgMC41NzU3MTYwMTg3LCAgMC40NjI1NzQ5NTg4LCAgMC41MTIzNTg2NjU1IH0sCisgICAgICB7IC0wLjAzNTIyMTA5OTksIC0wLjA0Mjg4OTU5NTAsICAwLjMxMTA5MTQyMzAsICAwLjI2OTk2MDQwMzQsCisgICAgICAgICAwLjMzMDc3NTI2MDksICAwLjIwNTk0NjkyMjMsICAwLjIzMzIxNzIzOTQsICAwLjMyMDQ0MTI0NjAsCisgICAgICAgICAwLjI4NDY0MTI2NTksICAwLjMzNTQ5MTE4MDQsICAwLjI0NDg2MzUxMDEsICAwLjE1MTQwNjI4ODEsCisgICAgICAgICAwLjEwNjI1NjQ4NTAsICAwLjI2MTMwNzcxNjQsICAwLjIxMjM0NDE2OTYsICAwLjMwMDA2MDI3MjIgfSB9LAorICAgIHsgeyAgMC42MjE4OTEwMjE3LCAgMC42MDMzNTU0MDc3LCAgMC40NTUxNTI1MTE2LCAgMC4zMTYxNzY0MTQ1LAorICAgICAgICAgMC4yODY0ODY2MjU3LCAgMC42MTk1MTI1NTgwLCAgMC43NTc3NTA1MTEyLCAgMS4wMDYyMTc5NTY1LAorICAgICAgICAgMC44NDg1MDEyMDU0LCAgMC42Nzc3ODQ5MTk3LCAgMC43NDU1MzAxMjg1LCAgMC4zNjMwNDg1NTM1LAorICAgICAgICAgMC4yMzI3NjYxNTE0LCAgMC41NTYzMTkyMzY4LCAgMC40NDQ4NTk1MDQ3LCAgMC4zODA2ODE5OTE2IH0sCisgICAgICB7ICAwLjI2MjQ5Njk0ODIsICAwLjI2Nzk1MTAxMTcsICAwLjE4Mzk2NjYzNjcsICAwLjAzMzU5MDMxNjgsCisgICAgICAgICAwLjAyOTQwNzUwMTIsICAwLjI5MDI1OTM2MTMsICAwLjQ5NTkxNDQ1OTIsICAwLjc5MDU5NzkxNTYsCisgICAgICAgICAwLjU3NDg1NDg1MDgsICAwLjM3NTM5MTk2MDEsICAwLjQ4NTUzOTQzNjMsICAwLjEwODk2MzAxMjcsCisgICAgICAgICAwLjAzNjI5Njg0NDUsICAwLjM2MzI1MzU5MzQsICAwLjI2ODExNTA0MzYsICAwLjI3MzU2OTEwNzEgfSB9LAorICAgIHsgeyAgMC43MDY0NDk1MDg3LCAgMC40NDMxNzgxNzY5LCAgMC43NjI4MzU1MDI2LCAgMC43MjcxNTg1NDY0LAorICAgICAgICAgMC43ODEyMDcwODQ3LCAgMC43ODA2NzM5ODA3LCAgMC44OTA5ODU0ODg5LCAgMC44OTU4NjU0NDA0LAorICAgICAgICAgMC45MTI2Nzg3MTg2LCAgMC45MDM4MjA5OTE1LCAgMC45MjQ2MTIwNDUzLCAgMC45NjI0NjI0MjUyLAorICAgICAgICAgMC45NzMyNDc1MjgxLCAgMC43NDIwMDM0NDA5LCAgMC41MDYwODQ0NDIxLCAgMC41MTg5MTk5NDQ4IH0sCisgICAgICB7ICAwLjM0NTcwMjE3MTMsIC0wLjAxNDkyMjE0MjAsICAwLjMxNzQ0NzY2MjQsICAwLjM1ODA4NjU4NjAsCisgICAgICAgICAwLjQyNDM5NjUxNDksICAwLjQyNzU1NDEzMDYsICAwLjU4ODcxNTU1MzMsICAwLjY0Nzg0OTA4MjksCisgICAgICAgICAwLjYzMjA2MTAwNDYsICAwLjY2MjczNDk4NTQsICAwLjY4Njg4ODY5NDgsICAwLjczOTY2NTk4NTEsCisgICAgICAgICAwLjc1NTEyNTk5OTUsICAwLjUyNzUzMTYyMzgsICAwLjMwNzUyMzcyNzQsICAwLjM4MDY4MTk5MTYgfSB9LAorICAgIHsgeyAgMC40Mzc2ODMxMDU1LCAgMC40OTA0NjAzOTU4LCAgMC42MjYyNzg4NzczLCAgMC41OTAxMDk4MjUxLAorICAgICAgICAgMC40MTc2NzEyMDM2LCAgMC4wMjIxNDkwODYwLCAtMC4xNjEyNzk2NzgzLCAtMC4yMjM2MTE4MzE3LAorICAgICAgICAtMC4xMDg3ODk0NDQwLCAtMC4wMDIyNTA2NzE0LCAgMC4xMDUxOTAyNzcxLCAgMC4zMzA3NzUyNjA5LAorICAgICAgICAgMC40MTY3NjkwMjc3LCAgMC40OTk3NjkyMTA4LCAgMC40NjQ1ODQzNTA2LCAgMC41MjI4NTY3MTIzIH0sCisgICAgICB7ICAwLjEyMjgyMzcxNTIsICAwLjE2NzExMjM1MDUsICAwLjI5MzEyOTkyMTAsICAwLjI1NDk5MjQ4NTAsCisgICAgICAgICAwLjE0MzU3Mzc2MTAsIC0wLjExMjQ4MDE2MzYsIC0wLjIxODE5ODc3NjIsIC0wLjI3MjMyOTMzMDQsCisgICAgICAgIC0wLjE1NzM0MjkxMDgsIC0wLjA4Mzc3NDU2NjcsIC0wLjAzMjU1NTU4MDEsICAwLjEwMjQ0Mjc0MTQsCisgICAgICAgICAwLjE5Mzg0OTU2MzYsICAwLjI4MjU0OTg1ODEsICAwLjIyNDcyODU4NDMsICAwLjI4Nzk2MjkxMzUgfSB9LAorICAgIHsgeyAgMC42MTAwODA3MTkwLCAgMC43OTAwMjM4MDM3LCAgMC45NTgxMTU1Nzc3LCAgMC44OTk5NjYyMzk5LAorICAgICAgICAgMC45Mjc3Mjg2NTMwLCAgMC45NzIwOTkzMDQyLCAgMC45OTY2MjIwODU2LCAgMC45NjMwMzY1MzcyLAorICAgICAgICAgMC45NTcxNzIzOTM4LCAgMC44OTkyMjgwOTYwLCAgMC44MzcwMTg5NjY3LCAgMC43NDE3OTg0MDA5LAorICAgICAgICAgMC43MTc0Mzk2NTE1LCAgMC42MTIyOTUxNTA4LCAgMC42NzQ2NjgzMTIxLCAgMC43MDMwNDU4NDUwIH0sCisgICAgICB7ICAwLjA4NTkxNjUxOTIsICAwLjA5MTQxMTU5MDYsICAwLjYwNzc0MzI2MzIsICAwLjU0NzEzMzQ0NTcsCisgICAgICAgICAwLjU5NDM3NDY1NjcsICAwLjY4MDUzMjQ1NTQsICAwLjY2ODAyNTAxNjgsICAwLjYwMzM1NTQwNzcsCisgICAgICAgICAwLjYzMDI5NzY2MDgsICAwLjQ4NzQyNTgwNDEsICAwLjM2NDcyOTg4MTMsICAwLjI3NzAxMzc3ODcsCisgICAgICAgICAwLjI1NDQxODM3MzEsICAwLjI2MDgxNTYyMDQsICAwLjMzMzE1MzcyNDcsICAwLjQ5NTA5NDI5OTMgfSB9LAorICAgIHsgeyAgMC40MDUxMjI3NTcwLCAgMS4xMDIyMTc2NzQzLCAgMC44MjYyMzM4NjM4LCAgMC42NTczMjE5Mjk5LAorICAgICAgICAgMC41OTQ4NjY3NTI2LCAgMC41NDI2MjI1NjYyLCAgMC40OTg3ODUwMTg5LCAgMC40MzcwMjY5Nzc1LAorICAgICAgICAgMC40NDIxMTE5NjkwLCAgMC4zODM3MTY1ODMzLCAgMC4zNzI4NDk0NjQ0LCAgMC4zNzA2NzYwNDA2LAorICAgICAgICAgMC40MTY5NzQwNjc3LCAgMC4zNTU5OTUxNzgyLCAgMC4yOTk0MDQxNDQzLCAgMC4zODk2MjE3MzQ2IH0sCisgICAgICB7ICAwLjA3MTY4Njc0NDcsICAwLjkyNTM5MTE5NzIsICAwLjI3ODA3OTk4NjYsICAwLjI0NjAxMTczNDAsCisgICAgICAgICAwLjE2NzUyMjQzMDQsICAwLjE1Mjc1OTU1MjAsICAwLjEyNzgyNjY5MDcsICAwLjEyMjY1OTY4MzIsCisgICAgICAgICAwLjExNjUwODQ4MzksICAwLjA5ODIxODkxNzgsICAwLjA5NTIyNTMzNDIsICAwLjExMTM0MTQ3NjQsCisgICAgICAgICAwLjE0OTg4ODk5MjMsICAwLjA5NDAzNjEwMjMsICAwLjA4MDI5ODQyMzgsICAwLjE1NjA4MTE5OTYgfSB9LAorICAgIHsgeyAgMC43MDI0NzE3MzMxLCAgMC43MzYzODUzNDU1LCAgMC45NjI5NTQ1MjEyLCAgMC45NjM1Mjg2MzMxLAorICAgICAgICAgMS4wODE5NTk3MjQ0LCAgMS4xNTI5ODU1NzI4LCAgMS4yOTg0NDA5MzMyLCAgMS4yNjkzMjUyNTYzLAorICAgICAgICAgMS4yODQ4NjcyODY3LCAgMS4yODc3Mzc4NDY0LCAgMS4yMTMzMDgzMzQ0LCAgMS4wNjk2NTczMjU3LAorICAgICAgICAgMS4wODY0NzA2MDM5LCAgMC45ODUxODA4NTQ4LCAgMC44MzEyMzY4MzkzLCAgMC44MDQ3ODY2ODIxIH0sCisgICAgICB7ICAwLjMwMDE0MjI4ODIsICAwLjIyNzMxMjA4ODAsICAwLjYyNzk2MDIwNTEsICAwLjY5MzYxNDAwNjAsCisgICAgICAgICAwLjgwOTcwNzY0MTYsICAwLjk0NDA0OTgzNTIsICAxLjEwMjg3MzgwMjIsICAxLjE3NjY0NzE4NjMsCisgICAgICAgICAxLjExOTk3NDEzNjQsICAxLjE2MDgxODEwMDAsICAxLjA2NjU4MTcyNjEsICAwLjg4NzI1Mzc2MTMsCisgICAgICAgICAwLjkwODI5MDg2MzAsICAwLjc2MDI1MTk5ODksICAwLjY1NDIwNTMyMjMsICAwLjczMTc1MTQ0MjAgfSB9LAorICAgIHsgeyAgMC4wNjQzNDYzMTM1LCAtMC42ODA4OTE5OTA3LCAgMC4yODg5ODgxMTM0LCAgMC42MTQyMjI1MjY2LAorICAgICAgICAgMC42MzU2Njk3MDgzLCAgMC42ODI1ODI4NTUyLCAgMC42MjU5NTA4MTMzLCAgMC40OTQ1NjExOTU0LAorICAgICAgICAgMC41ODY2NjUxNTM1LCAgMC42MzU3NTE3MjQyLCAgMC41MjA4ODgzMjg2LCAgMC40MjA3ODc4MTEzLAorICAgICAgICAgMC41MTI1NjM3MDU0LCAgMC4zNzU4MDIwNDAxLCAgMC41NDI0MTc1MjYyLCAgMC42MTcyNTcxMTgyIH0sCisgICAgICB7IC0wLjA2MzY4MDY0ODgsIC0wLjc1ODU2MTEzNDMsICAwLjA4NTA1NTM1MTMsICAwLjI5OTY5MTIwMDMsCisgICAgICAgICAwLjM2MjA2NDM2MTYsICAwLjQ0NDQwODQxNjcsICAwLjQ1OTc0NTQwNzEsICAwLjMxMjA3NTYxNDksCisgICAgICAgICAwLjQwMTY3ODA4NTMsICAwLjUwMjY4MDc3ODUsICAwLjQxMTE5MTk0MDMsICAwLjMxODM0OTgzODMsCisgICAgICAgICAwLjM2NjY1NzI1NzEsICAwLjE4Mjk4MjQ0NDgsICAwLjMyNjkyMDUwOTMsICAwLjQwOTU5MjYyODUgfSB9LAorICAgIHsgeyAgMC45Mjc3Mjg2NTMwLCAgMC45NjUxMjc5NDQ5LCAgMC45NjAyMDY5ODU1LCAgMC45MzI3NzI2MzY0LAorICAgICAgICAgMC45MjA4MzkzMDk3LCAgMC44ODY4NDM2ODEzLCAgMC45MDExNTU0NzE4LCAgMC44NTY5NDg4NTI1LAorICAgICAgICAgMC45MDE1MjQ1NDM4LCAgMC44OTY5NzI2NTYyLCAgMC45MzY3MDk0MDQwLCAgMC45NDQ1MDA5MjMyLAorICAgICAgICAgMC44NjE3MDU3ODAwLCAgMC44MjE1NTg5NTIzLCAgMC44MzMzNjkyNTUxLCAgMC43OTM5MTk1NjMzIH0sCisgICAgICB7ICAwLjE3MTkxMDI4NTksICAwLjExNDI1MzA0NDEsICAwLjEyNDU0NjA1MTAsICAwLjE2NDYxMDg2MjcsCisgICAgICAgICAwLjE0MDg2NzIzMzMsICAwLjA5NDk3OTI4NjIsICAwLjAyNzE5MzA2OTUsICAwLjAyNjU3Nzk0OTUsCisgICAgICAgIC0wLjAwNjQzMzQ4NjksIC0wLjAxMDkwMzM1ODUsICAwLjAxNTIxODczNDcsICAwLjAyNTI2NTY5MzcsCisgICAgICAgICAwLjAxNjY5NTAyMjYsICAwLjA3MzYxNDEyMDUsICAwLjEyMDU2ODI3NTUsICAwLjE4OTU0MzcyNDEgfSB9LAorICAgIHsgeyAgMC41OTY0MjUwNTY1LCAgMC42MDY1MTMwMjM0LCAgMC43MjI4MTE2OTg5LCAgMC43MzQ4MjcwNDE2LAorICAgICAgICAgMC4wNzE4MDk3Njg3LCAgMC4yMzY5ODk5NzUwLCAgMC4yNDU2NDI2NjIwLCAgMC40OTYxMTk0OTkyLAorICAgICAgICAgMC42NDEwNDE3NTU3LCAgMC42NzY1OTU2ODc5LCAgMC42NzcxMjg3OTE4LCAgMC43Mjg1OTM4MjYzLAorICAgICAgICAgMC42NzA2OTA1MzY1LCAgMC41MTA1NTQzMTM3LCAgMC41MDY4NjM1OTQxLCAgMC41NDMwMzI2NDYyIH0sCisgICAgICB7ICAwLjI3ODI0NDAxODYsICAwLjI2MjAwNDg1MjMsICAwLjQ0MjQ0MDAzMzAsICAwLjQxMjQ2MzE4ODIsCisgICAgICAgIC0wLjExNTg4MzgyNzIsICAwLjAxODYyMjM5ODQsICAwLjAwNTk5MTkzNTcsICAwLjE4NTM2MDkwODUsCisgICAgICAgICAwLjM1Njg1NjM0NjEsICAwLjM3OTE2NDY5NTcsICAwLjQxMDA4NDcyNDQsICAwLjQ2NTQ4NjUyNjUsCisgICAgICAgICAwLjQ2MTQ2Nzc0MjksICAwLjMyMDk3NDM1MDAsICAwLjMxOTkwODE0MjEsICAwLjM4MzY3NTU3NTMgfSB9LAorICAgIHsgeyAgMC44MDUxNTU3NTQxLCAgMC44NTA2MzM2MjEyLCAgMC45NTQ0NjU4NjYxLCAgMC41NTg0NTE2NTI1LAorICAgICAgICAgMC41ODc0MDMyOTc0LCAgMC41NzI3MjI0MzUwLCAgMC42MTc3OTAyMjIyLCAgMC43NjU5NTIxMTAzLAorICAgICAgICAgMC45NTI2MjA1MDYzLCAgMS4wNDI0MjgwMTY3LCAgMS4wNzA1NTk1MDE2LCAgMS4wMDQyOTA1ODA3LAorICAgICAgICAgMC42MDA1MjU4NTYwLCAgMC4zODg2Nzg1NTA3LCAgMC40NzM5NzUxODE2LCAgMC42NTQyNDYzMzAzIH0sCisgICAgICB7ICAwLjQ3NzU0Mjg3NzIsICAwLjU1NDE4NjgyMTAsICAwLjcxMjgwNTc0ODAsICAwLjIxNDY4MTYyNTQsCisgICAgICAgICAwLjI1MDI3NjU2NTYsICAwLjI0ODg4MjI5MzcsICAwLjMwMDkyMTQ0MDEsICAwLjQ2Njc5ODc4MjMsCisgICAgICAgICAwLjY5Mjk5ODg4NjEsICAwLjg1OTk4MzQ0NDIsICAwLjg3ODQ3ODA1MDIsICAwLjc0NjM5MTI5NjQsCisgICAgICAgICAwLjMyMTc1MzUwMTksICAwLjEyNzQ5ODYyNjcsICAwLjI3NjcyNjcyMjcsICAwLjUxMTk0ODU4NTUgfSB9LAorICAgIHsgeyAgMC41OTc4MTkzMjgzLCAgMC41MDkyODMwNjU4LCAgMS4wNzM4NDAxNDEzLCAgMC43Njg4NjM2NzgwLAorICAgICAgICAgMC44MjE0NzY5MzYzLCAgMC43NjgyMDc1NTAwLCAgMC40OTcwNjI2ODMxLCAgMC4yNzgzMjYwMzQ1LAorICAgICAgICAgMC4yNjUyODU0OTE5LCAgMC4zNjI1MTU0NDk1LCAgMC41NzAwNTY5MTUzLCAgMC41MDQ0MDMxMTQzLAorICAgICAgICAgMC40MDAzMjQ4MjE1LCAgMC41MTYyNTQ0MjUwLCAgMC41NzI3NjM0NDMwLCAgMC41NTM4NTg3NTcwIH0sCisgICAgICB7ICAwLjI3NTIwOTQyNjksICAwLjE3NDc4MDg0NTYsICAwLjg1NTcxODYxMjcsICAwLjQyODA4NzIzNDUsCisgICAgICAgICAwLjUxNDM2ODA1NzMsICAwLjQxMzk4MDQ4NDAsICAwLjE4MTA5NjA3NzAsICAwLjAxMDk1MzkwMzIsCisgICAgICAgICAwLjAzMTcwMzk0OTAsICAwLjA4NDIzNTE5MTMsICAwLjMxMjkzNjc4MjgsICAwLjI2MTQ3MTc0ODQsCisgICAgICAgICAwLjE1NjQwOTI2MzYsICAwLjIzNTI2NzYzOTIsICAwLjMyNDk5MzEzMzUsICAwLjM1MDU4MjEyMjggfSB9LAorICAgIHsgeyAgMC43MDkzNjEwNzY0LCAgMC43NTg3NzU3MTExLCAgMS44NTE3NjE4MTc5LCAgMS4wMDkyNTI1NDgyLAorICAgICAgICAgMC44MDc4NjIyODE4LCAgMC44NzkyOTgyMTAxLCAgMC44MjEwNjY4NTY0LCAgMC44NjAwNjU0NjAyLAorICAgICAgICAgMC42OTEzNTg1NjYzLCAgMC42NDM2NjYyNjc0LCAgMC42MjE2ODU5ODE4LCAgMC42MTIzNzcxNjY3LAorICAgICAgICAgMC41OTQwNDY1OTI3LCAgMC41OTEwOTQwMTcwLCAgMC42NTA1OTY2MTg3LCAgMC41ODAxMDM4NzQyIH0sCisgICAgICB7ICAwLjMzNzA5MDQ5MjIsICAwLjQ2ODE5MzA1NDIsICAxLjkyMzYwNzgyNjIsICAwLjgwNTM2MDc5NDEsCisgICAgICAgICAwLjUzMjEyNDUxOTMsICAwLjYzNDIzNDQyODQsICAwLjUwNTQ2OTMyMjIsICAwLjU3ODgzMjYyNjMsCisgICAgICAgICAwLjQ0MDA2MTU2OTIsICAwLjQwODY5MDQ1MjYsICAwLjM5MjQxMDI3ODMsICAwLjQyMjAxODA1MTEsCisgICAgICAgICAwLjM4MzUxMTU0MzMsICAwLjQyMzA0MzI1MTAsICAwLjUxOTA4Mzk3NjcsICAwLjM5OTA1MzU3MzYgfSB9LAorICAgIHsgeyAgMC42Mjc3MTQxNTcxLCAgMS4xMTIyMjM2MjUyLCAgMS4wMjU5ODM4MTA0LCAgMC45NDg2NDI3MzA3LAorICAgICAgICAgMC45MTg0NjA4NDU5LCAgMC45MDU5OTQ0MTUzLCAgMC45MDgwMDM4MDcxLCAgMC44MjgyMDIyNDc2LAorICAgICAgICAgMC44NDQwMzEzMzM5LCAgMC43ODg3OTM1NjM4LCAgMC43NDY4MDEzNzYzLCAgMC42NzQ2NjgzMTIxLAorICAgICAgICAgMC42MzE5Mzc5ODA3LCAgMC42MjQ2Nzk1NjU0LCAgMC43MjYzNzkzOTQ1LCAgMC43MzQ5MDkwNTc2IH0sCisgICAgICB7ICAwLjI0Mjc3MjEwMjQsICAxLjA4NTE1ODM0ODEsICAwLjYxODAzNjI3MDEsICAwLjU4MzcxMjU3NzgsCisgICAgICAgICAwLjQzMjQ3NTA5MDAsICAwLjQ2ODQ4MDExMDIsICAwLjM3NDUzMDc5MjIsICAwLjMwMjcyNTc5MTksCisgICAgICAgICAwLjM2NDY4ODg3MzMsICAwLjI0MDkyNjc0MjYsICAwLjIxNTgyOTg0OTIsICAwLjIwNTI5MDc5NDQsCisgICAgICAgICAwLjIxMDA4ODcyOTksICAwLjIyNzY0MDE1MjAsICAwLjM0MDk0NTI0MzgsICAwLjQwNDU4OTY1MzAgfSB9LAorICAgIHsgeyAgMC44MzkxNTEzODI0LCAgMC44NzEzNDI2NTkwLCAgMS4xMzY2MjMzODI2LCAgMS4xNDQwODY4Mzc4LAorICAgICAgICAgMS4xNDQzNzM4OTM3LCAgMS4wODc3NDE4NTE4LCAgMS4wNTE2MTM4MDc3LCAgMS4wMDk5NDk2ODQxLAorICAgICAgICAgMC45MjE2MTg0NjE2LCAgMC44OTkwNjQwNjQwLCAgMC45MDAxMzAyNzE5LCAgMC44OTkzMTAxMTIwLAorICAgICAgICAgMC44MDU1MjQ4MjYwLCAgMC44MTUwNzk2ODkwLCAgMC43MjcyODE1NzA0LCAgMC43MTk2MTMwNzUzIH0sCisgICAgICB7ICAwLjQ2MzQ3NzEzNDcsICAwLjU4MDcxODk5NDEsICAxLjEyODc5MDg1NTQsICAxLjEwNjY4NzU0NTgsCisgICAgICAgICAxLjA3NjUwNTY2MTAsICAwLjkyODc1Mzg1MjgsICAwLjg5NTYxOTM5MjQsICAwLjgwMjYxMzI1ODQsCisgICAgICAgICAwLjY3MjU3NjkwNDMsICAwLjU4NTY4MDk2MTYsICAwLjU1Mjc1MTU0MTEsICAwLjUxODM4Njg0MDgsCisgICAgICAgICAwLjQ1MjkzODA3OTgsICAwLjUwNzQzNzcwNjAsICAwLjQ2MzI3MjA5NDcsICAwLjU1NTQ5OTA3NjggfSB9LAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHdtYXZvaWNlX2xzcDE2X2ludGVyY29lZmZfYlszMl1bMl1bMTZdID0geworICAgIHsgeyAgMC41NDMxNzc2MDQ3LCAtMC4xMjEyMTMwMTg5LCAtMC4yNDcxNjUwODM5LCAgMC4wNjgzNjcwMDQ0LAorICAgICAgICAgMC4xNDE4NTIwODA4LCAgMC4yNTE4OTcxNTYyLCAgMC4zNzA4MDg0MjI2LCAgMC40MTQxNDg0NDk5LAorICAgICAgICAgMC41NzEyMzY0OTEyLCAgMC41ODUyNjU5MzQ1LCAgMC41NjcwNjQxNjYxLCAgMC42NDAxMzIwMTAwLAorICAgICAgICAgMC42NDQ3NzM3MjE3LCAgMC42NzI2MjM5OTIwLCAgMC40OTk0NzI0OTg5LCAgMC41NTc0Njc4MTgzIH0sCisgICAgICB7ICAwLjIwNDA3MTg3OTQsIC0wLjEyNzEwNjQyODEsIC0wLjIyNjYxNjM4MjYsIC0wLjA0MDYzNDk4OTcsCisgICAgICAgIC0wLjAxNDUwNTgwMzYsICAwLjAyODMxMjY4MzEsICAwLjA4NTEwODQ1OTAsICAwLjA5MTMxNDc5MjYsCisgICAgICAgICAwLjEzMDc0MzI2NTIsICAwLjE5MjY1MDEzOTMsICAwLjIzMTAzNTUzMDYsICAwLjI4MjgyNDUxNjMsCisgICAgICAgICAwLjMxNzE5NDA0NDYsICAwLjQ0MjQ2ODEwNjcsICAwLjI5NjA3MTY0ODYsICAwLjM1MTA5NDE4NjMgfSB9LAorICAgIHsgeyAgMC44MDczOTAwOTM4LCAgMC4wNDAzMDgxMTc5LCAgMC41MzkyNjYwNDk5LCAgMC42OTI4NTk3Njg5LAorICAgICAgICAgMC42NDk5MzY5NzQwLCAgMC43MzI4MDk3ODIwLCAgMC43NzU1NzYxMTQ3LCAgMC43NzY2MTkxOTU5LAorICAgICAgICAgMC44ODIwMjI1NTk2LCAgMC44NDIzMzMzMTY4LCAgMC44ODk4OTc4MjMzLCAgMC44NDg4NTI1NzQ4LAorICAgICAgICAgMC44NjU0Mzc1NjcyLCAgMC42NzI4MzI2MDgyLCAgMC42MTY5MjM0NTE0LCAgMC42NzU1OTY3NzM2IH0sCisgICAgICB7ICAwLjM2NTM4NDM5OTksIC0wLjA4NDYwMDg2NTgsIC0wLjAyMjQzMzIyMTMsICAwLjExMjA3MjExMDIsCisgICAgICAgICAwLjEwMjA1ODUyOTksICAwLjE3NDE4NzYwMDYsICAwLjIxMjk5MDIyNDQsICAwLjIxNjAxNTE2MDEsCisgICAgICAgICAwLjM2MTk0MjIzMTcsICAwLjQxODU4MTU0NTQsICAwLjU0NTUyNDUzNzYsICAwLjUzNjM5NzU3NjMsCisgICAgICAgICAwLjU0MjkxNjgzNDQsICAwLjM1MDU3MjY0NTcsICAwLjMyOTYwNjcxMTksICAwLjM2MjA5ODY5MzggfSB9LAorICAgIHsgeyAgMC4xODQzNTc2NDMxLCAgMC4wMTc5ODYxNzg0LCAgMC4zMTIyOTE1NjI2LCAgMC4zNjAwMTI1MzEzLAorICAgICAgICAgMC4yNDY2ODE3NDk4LCAgMC4yMTcyNjY4NTc2LCAgMC4xOTc1NTI2MjE0LCAgMC4xMTc3NTY5MDMyLAorICAgICAgICAgMC4xMTk2ODY2MDM1LCAgMC4wODQ5NTE5OTY4LCAgMC4wOTYyNjk0Mjg3LCAgMC4xNTkxNjcyMzAxLAorICAgICAgICAgMC4yMzAwNDQ2MDMzLCAgMC4zMDgyNzU2OTk2LCAgMC40MDQ3NjA3MTgzLCAgMC4zOTI1MDQ1MTMzIH0sCisgICAgICB7IC0wLjAyNzU5NjQ3MzcsIC0wLjA3OTQ4OTc2NzYsICAwLjExNjgxODEzMDAsICAwLjE1OTExNTA3NjEsCisgICAgICAgICAwLjA5MTU3NTU2MzAsICAwLjA0NjA5NzIxOTAsICAwLjA1NjIxNTEwNzQsICAwLjAwODQ0MTk4NDcsCisgICAgICAgIC0wLjAwOTU1MTE2NzUsIC0wLjA0MDg5NTc2MDEsIC0wLjAzNzYxMDA1NDAsIC0wLjAxNjY5NjI3NDMsCisgICAgICAgICAwLjA2NTYwMjgzOTAsICAwLjEyMjYwNzIzMTEsICAwLjIyOTMxNDQ0NjQsICAwLjIxNDI0MTkyMTkgfSB9LAorICAgIHsgeyAgMC40NzgxOTM2NDA3LCAtMS4yNDc4OTcyNjczLCAgMC40ODg0Njc5OTE0LCAgMC43NzU1MjM5NjA2LAorICAgICAgICAgMC42Nzg1MTc0MDEyLCAgMC42NTkwMTE3ODEyLCAgMC42MTc3MDU3NjI0LCAgMC42NDI3OTE4NjczLAorICAgICAgICAgMC41NDAyMDQ4MjMwLCAgMC41NTEyNjE0ODQ2LCAgMC42NDI0MjY3ODg4LCAgMC40MjI5MTAzMzI3LAorICAgICAgICAgMC41MTA2MzM0Njg2LCAgMC41MTM2MDYyNTAzLCAgMC40NDkwMzk1MTg4LCAgMC40NzUzMjUxNjcyIH0sCisgICAgICB7ICAwLjI4NTIyMzYwMzIsIC0xLjM4MTUxNTk3OTgsICAwLjE5MDQwNzUxNDYsICAwLjQ4NzQ3NzA2NDEsCisgICAgICAgICAwLjQ1OTMxMzg2OTUsICAwLjQxODI2ODYyMTAsICAwLjQxNzQ4NjMxMDAsICAwLjQ2MDQ2MTI1ODksCisgICAgICAgICAwLjQwODkzMzA0MzUsICAwLjM4OTE2NjY1MzIsICAwLjQ3MDA1NzYwNjcsICAwLjIzODMzNzA5OTYsCisgICAgICAgICAwLjI4MDE2NDY1OTAsICAwLjMzOTgyODkwODQsICAwLjI3NjY3MDMzNjcsICAwLjMzNzQyOTgyMTUgfSB9LAorICAgIHsgeyAgMC41OTI1MTUzNDk0LCAgMC4zODU4ODA5NDcxLCAgMS4wNzU0MDk4Mjk2LCAgMC41NzUyMDAyMDAxLAorICAgICAgICAgMC41NTE2MjY1NjMxLCAgMC40ODUzOTA5MDE2LCAgMC40NzE5MzUxNTMwLCAgMC41MDE4MTk0MzE4LAorICAgICAgICAgMC4zMDM3MzgyOTYwLCAgMC41MTU0MzE2NDI1LCAgMC44ODA5Nzk0Nzg0LCAgMC43NzU1NzYxMTQ3LAorICAgICAgICAgMC41OTQxMzIxMjU0LCAgMC4zOTc0MDY5OTUzLCAgMC41OTI1Njc1MDM1LCAgMC42MDk3MjYxOTA2IH0sCisgICAgICB7ICAwLjMwMDgxNzY2ODQsICAwLjA3MDY2MTc4MzIsICAwLjg0ODQzNTM0MjMsICAwLjI1NzQyNTQ4NzAsCisgICAgICAgICAwLjI4MTU3MjgxODgsICAwLjE5MzA2NzM3MTgsICAwLjI1MjM2NjU0MjgsICAwLjI2OTE2MDE1MTUsCisgICAgICAgICAwLjEyNzE5Njc4ODgsICAwLjI2NTMwMDc1MDcsICAwLjY0NzMyOTI3MDgsICAwLjUyNzU4MzUzOTUsCisgICAgICAgICAwLjM5MjgxNzQzNzYsICAwLjI0MDUyNzU3MDIsICAwLjQwMDg0OTE2MzUsICAwLjQ1NTYxMDkzMDkgfSB9LAorICAgIHsgeyAgMC43MzM5MDUwMTc0LCAgMC40MjkwNjQ1MTIzLCAgMC42ODU5NzU0MzI0LCAgMC42MzQ5MTY2MDM2LAorICAgICAgICAgMC44MDM0MjYzODQ5LCAgMC44NTA5Mzg3Mzc0LCAgMC44NTkxMjY5MjU1LCAgMS4xMDQ5ODExODQwLAorICAgICAgICAgMS4zOTI4MTk0NjQyLCAgMS4zNDIzMzQzMzAxLCAgMS4wODQ5MDE4NjkzLCAgMC44OTQzODMwNzI5LAorICAgICAgICAgMC44NTc5Nzk1MzYxLCAgMC42OTIwNzc0NTc5LCAgMC41NjEzMjcyMTkwLCAgMC40MzAzMTYyMDk4IH0sCisgICAgICB7ICAwLjQ1MzQ3MjYxNDMsICAwLjA5MDE2NzQwMzIsICAwLjM0NjUwNDYyODcsICAwLjM0NzAyNjE2OTMsCisgICAgICAgICAwLjUyMTc0MjI4NDMsICAwLjU4NzQ1NjQwNTIsICAwLjYwMTQzMzY5NDQsICAwLjkxNjE4MzQ3MTcsCisgICAgICAgICAxLjI4MjM1NzE1NjMsICAxLjIxOTM1NTA0NjcsICAwLjg4NjgyMDczMzUsICAwLjY1MTQ0OTQ0MTksCisgICAgICAgICAwLjYyNDkwMzAyMzIsICAwLjQ0NTM4ODczNDMsICAwLjM2NjUzMTc4OTMsICAwLjIyNDIwMzM0ODIgfSB9LAorICAgIHsgeyAgMC40MjkzMjUyODI2LCAgMC4zMzAzMzY4Njg4LCAgMC42MTgxNzUxNDkwLCAgMC45ODg0MTY4NTA2LAorICAgICAgICAgMC45OTE1NDYwOTQ0LCAgMC43OTM5ODY0OTkzLCAgMC4zMDE5MTI5MDM4LCAgMC4yNDQzMzQ4MTY5LAorICAgICAgICAgMC40NTQzMDcwNzkzLCAgMC41NjE3NDQ0NTE1LCAgMC40ODk1MTEwNzI2LCAgMC42NjAwMDI3MDg0LAorICAgICAgICAgMC42MjkwMjMxOTQzLCAgMC41NTgwOTM2NjcwLCAgMC41NDU5NDE3NzAxLCAgMC40NjQ3Mzc4OTIyIH0sCisgICAgICB7ICAwLjE0MDkxMzMwNzcsIC0wLjAwNTAxMzc2MzksICAwLjI1NTEzMDcwODIsICAwLjY3NjQ4MzM5MjcsCisgICAgICAgICAwLjcxMTI3MDE1MzUsICAwLjQ2NDg5NDM1NDMsICAwLjAzMDEzODA3NTQsIC0wLjAyMzU4MDYxMDgsCisgICAgICAgICAwLjEwMTg0OTkxMzYsICAwLjI0MjI0ODY1NDQsICAwLjI0MDYzMTg3ODQsICAwLjQwMDAxNDY5ODUsCisgICAgICAgICAwLjM3MTMyOTk2MzIsICAwLjMyNTk1NTkyNzQsICAwLjM4MjA3MzcwMDQsICAwLjI4ODg3NDM4NzcgfSB9LAorICAgIHsgeyAgMC43NzMzMzM0ODk5LCAgMC44MzIxMTExMjAyLCAgMS4zMDk4OTQ1MDIyLCAgMS4wMzMxMTI4ODM2LAorICAgICAgICAgMS4wMzgwNjc1MTk3LCAgMC45NDc5OTc0NTA4LCAgMC45NzQwMjIzMjg5LCAgMC45NDQyOTQ1MTIzLAorICAgICAgICAgMC44OTI2NjE5ODg3LCAgMC44NzE5MDQ2NzEyLCAgMC44NjQwODE1NjE2LCAgMC44NDA0MDM2MTY0LAorICAgICAgICAgMC44MzU5MTgzNjY5LCAgMC43Njc1OTY1NDI4LCAgMC42ODk1MjE5MDg4LCAgMC43MjY2MDM0NDg0IH0sCisgICAgICB7ICAwLjM2NTU0MDg2MjEsICAwLjQ2NDMyMDY1OTYsICAxLjIxNzE2NDU3NjEsICAwLjgzNDE0NTEyODcsCisgICAgICAgICAwLjgzODc4Njg0MDQsICAwLjY3MTMyMDE0MDQsICAwLjY4MTQ5MDE4MjksICAwLjYyOTQ0MDQyNjgsCisgICAgICAgICAwLjUxNzIwNDg4MDcsICAwLjUyMDU5NDg5NDksICAwLjU0MDg4MjgyNTksICAwLjUyOTg3ODMxODMsCisgICAgICAgICAwLjU3ODE3Mjk4MTcsICAwLjUwMDA5ODM0NzcsICAwLjQ3MjcxNzQ2NDAsICAwLjQzMjYxMDk4ODYgfSB9LAorICAgIHsgeyAgMC44OTAyNjI5MDE4LCAgMC40NTk4MzU0MTAxLCAgMC42MzkyOTc1NDUwLCAgMC40NDgzMDkzNjE5LAorICAgICAgICAgMC42MjIwODY3MDM4LCAgMC42MzIzMDg5MDA0LCAgMC43MDYzNjc2NzE1LCAgMC4zNzE3OTkzNDk4LAorICAgICAgICAgMC42NzE4NDE2ODEwLCAgMC43ODc2NzU4NTc1LCAgMC4yODA3MzgzNTM3LCAgMC4zMTE4MjIxNzYwLAorICAgICAgICAgMC42NzAzODEzNjcyLCAgMC43NjYyNDA1MzcyLCAgMC43MTIyNjEwODA3LCAgMC43ODUxNzI0NjI1IH0sCisgICAgICB7ICAwLjYzMDE3MDU4MzcsICAwLjEyMjEzNzg0NDYsICAwLjM1MzI4NDY1NzAsICAwLjE0MTI3ODM4NjEsCisgICAgICAgICAwLjM0NzE4MjYzMTUsICAwLjM0MzUzMTg0NzAsICAwLjQ0NjY5MjU4NTksICAwLjEzOTAzNTc2MTQsCisgICAgICAgICAwLjQwOTI5ODEyMTksICAwLjU0MDY3NDIwOTYsICAwLjA2OTA0NTAwNzIsICAwLjA4MjkxNzk4ODMsCisgICAgICAgICAwLjQ2MjU5OTU3NTUsICAwLjU3MDA4OTEwMTgsICAwLjU1NDI4NjQyMDMsICAwLjY1NDUyNjUzMTcgfSB9LAorICAgIHsgeyAtMC4xMTAwNTIwNDkyLCAgMC4zODAzNTI2MTYzLCAgMC44MDc1OTg3MTAxLCAgMC42OTAzNTYzNzM4LAorICAgICAgICAgMC44MDEyMzU5MTQyLCAgMC43ODM1MDM1MzI0LCAgMC44MTk1OTQxNDQ4LCAgMC44MzgxMDg4Mzc2LAorICAgICAgICAgMC44MDMzMjIwNzY4LCAgMC43NTExNjgwMTI2LCAgMC42MzkzNDk2OTkwLCAgMC42MDk2MjE4ODI0LAorICAgICAgICAgMC42OTM0ODU2MTc2LCAgMC42NjkwMjUzNjE1LCAgMC42NDAxODQxNjQwLCAgMC41NjAwMjMzNjc0IH0sCisgICAgICB7IC0wLjE3NzY5NTg3MDQsIC0wLjAyOTMxNzU1NzgsICAwLjE1MjA3NDI3NzQsICAwLjE3NDYwNDgzMzEsCisgICAgICAgICAwLjIyMjIyMTQ5MzcsICAwLjMwNTI1MDc2MzksICAwLjI5Nzc5MjczMjcsICAwLjM3OTc3ODkyMTYsCisgICAgICAgICAwLjMzOTU2ODEzODEsICAwLjI5NzY4ODQyNDYsICAwLjI1MTY4ODU0MDAsICAwLjI0MDM3MTEwODEsCisgICAgICAgICAwLjM1Njc3ODk3OTMsICAwLjMzMDI4NDcxNDcsICAwLjMzNjgwMzk3MjcsICAwLjMzMTAxNDg3MTYgfSB9LAorICAgIHsgeyAgMC41NTg3MTk1MTU4LCAgMC40Njc2MDYzNjU3LCAgMC4xMzkyOTY1MzE3LCAtMC4wOTkwOTk2OTU3LAorICAgICAgICAtMC4wODE2MjgwODQyLCAtMC4xMTQ2NDE2MDY4LCAtMC4wMTE2ODk0ODQxLCAgMC4wNTIxOTkyNDQ1LAorICAgICAgICAgMC4xNjI2NjE1NTI0LCAgMC4yOTIzNjg3MTAwLCAgMC40MDI5ODc0ODAyLCAgMC40NTI4OTg5MTk2LAorICAgICAgICAgMC40Njk0ODM5MTIwLCAgMC41MDU4MzUyOTQ3LCAgMC41MzY5MTkxMTcwLCAgMC41MTA1MjkxNjA1IH0sCisgICAgICB7ICAwLjIxOTM1MzAyMDIsICAwLjEyMTE0NjkxNzMsICAwLjAxNzk4NjE3ODQsIC0wLjIwMjI2MDQzNDYsCisgICAgICAgIC0wLjE0MDk3OTQwOTIsIC0wLjIxMjExNzU1MjgsIC0wLjExNTI2NzQ1NTYsIC0wLjA1OTQ2MjYwNjksCisgICAgICAgIC0wLjAxMjIxMTAyNDgsICAwLjAyNzQyNjA2NDAsICAwLjE0MTQ4NzAwMjQsICAwLjIwNDQzNjk1NzgsCisgICAgICAgICAwLjIxNjc5NzQ3MTAsICAwLjI2MTU5NzgxMjIsICAwLjMzNDgyMjExODMsICAwLjM3MDc1NjI2ODUgfSB9LAorICAgIHsgeyAgMC41OTQ4NjIyODIzLCAgMC43MDY1MjQxMzM3LCAgMC45NDE0NzgxOTI4LCAgMC45MzQwNzIzMTU3LAorICAgICAgICAgMC44ODM1MzUwMjc1LCAgMC45NzMwODM1NTU3LCAgMC44NTAzNjUwNDI3LCAgMC44OTAyNjI5MDE4LAorICAgICAgICAgMC44NzQ2Njg4MzY2LCAgMC42OTEwODY1MzA3LCAgMC42NDA0NDQ5MzQ0LCAgMC42OTc2MDU3ODg3LAorICAgICAgICAgMC41OTE2Mjg3MzAzLCAgMC42MDIyMTYwMDUzLCAgMC43NzI5Njg0MTE0LCAgMC42MDk2NzQwMzY1IH0sCisgICAgICB7ICAwLjEyNjIwNTg2MTYsICAwLjEzMDA2NTI2MjMsICAwLjY1OTQyOTAxMzcsICAwLjY1MzU4Nzc1ODUsCisgICAgICAgICAwLjU2MzkzNDkyMjIsICAwLjY5ODIzMTYzNzUsICAwLjQ4Mjg4NzUwNjUsICAwLjU1NzcyODU4ODYsCisgICAgICAgICAwLjQ1OTEwNTI1MzIsICAwLjI5NjQzNjcyNzAsICAwLjI2OTUyNTIyOTksICAwLjMzMjQ3NTE4NTQsCisgICAgICAgICAwLjI4NjA1ODA2ODMsICAwLjI5MDI4MjU0NzUsICAwLjQ2MjMzODgwNTIsICAwLjMzNjk2MDQzNDkgfSB9LAorICAgIHsgeyAgMC44ODIxMjY4Njc4LCAgMC44NTM5NjM2NzMxLCAgMC4yODk4NjUzMTUwLCAgMC43NDc4MzAxNTI1LAorICAgICAgICAgMC41MTA5NDYzOTMwLCAgMC44NTc3MTg3NjU3LCAgMC40ODg0Njc5OTE0LCAgMC43ODQ2NTA5MjE4LAorICAgICAgICAgMC43Njg0MzEwMDc5LCAgMC43MDMyMzg0Mjc2LCAgMC42NjkxMjk2Njk3LCAgMC44NTkzMzU1NDE3LAorICAgICAgICAgMC45MzgzNDg5NDkwLCAgMC45ODA4MDIzNTcyLCAgMC42ODA0OTkyNTU3LCAgMC42NDAzOTI3ODAzIH0sCisgICAgICB7ICAwLjU1OTAzMjQ0MDIsICAwLjQyMDk4MDYzMjMsICAwLjAyNTkxMzU5NjIsICAwLjQzMTg4MDgzMTcsCisgICAgICAgICAwLjIxMDQzNDY3NTIsICAwLjU0NTM2ODA3NTQsICAwLjE3ODM1OTkyNTcsICAwLjQ0Njc0NDc0MDAsCisgICAgICAgICAwLjQzNTI3MDg0NTksICAwLjQwODkzMzA0MzUsICAwLjM5OTQ0MTAwMzgsICAwLjU5ODQ2MDkxMjcsCisgICAgICAgICAwLjY4NzI3OTI4NDAsICAwLjczMjEzMTc3OTIsICAwLjQ0MDg1MTMzMDgsICAwLjQ1NDIwMjc3MTIgfSB9LAorICAgIHsgeyAgMC42MzcxMDcwNzQzLCAgMC42MzExMDkzNTY5LCAgMC43MTUyODYwMTY1LCAgMC42OTI5NjQwNzcwLAorICAgICAgICAgMC4yMjkyMTAxMzgzLCAgMC4zMjM0NTI1MzIzLCAgMC45NjQ0MjU5ODEwLCAgMC45ODgxMDM5MjYyLAorICAgICAgICAgMC44NzIyNjk3NDk2LCAgMC40MzcwNDQwODQxLCAgMC40MDUxNzc5NTA5LCAgMC40OTQ0MTM1NTQ3LAorICAgICAgICAgMC41MzkyNjYwNDk5LCAgMC41OTY5NDg0NDQ4LCAgMC40MjY4NzQwNDE2LCAgMC40OTkwNTUyNjY0IH0sCisgICAgICB7ICAwLjQyMzM3OTcxOTMsICAwLjM2NDcwNjM5NzEsICAwLjQzNDU0MDY4OTAsICAwLjQxODAwNzg1MDYsCisgICAgICAgIC0wLjAwMDYzMjgyMjUsICAwLjA1ODYxNDE5NDQsICAwLjc2MjAxNjA1ODAsICAwLjgxNTIxMzIwMzQsCisgICAgICAgICAwLjY3MDc5ODU5OTcsICAwLjIwOTU0ODA1NjEsICAwLjIxNzg0MDU1MjMsICAwLjI3NzY2MTI2MzksCisgICAgICAgICAwLjMxNDIyMTI2MjksICAwLjM4MDg3NDE1NzAsICAwLjI2NzY5OTgzNzcsICAwLjI4MDQ3NzU4MzQgfSB9LAorICAgIHsgeyAgMC40NTA5MTcwNjUxLCAgMC45NDkwNDA1MzIxLCAgMC44NTU3ODkwNjU0LCAgMC44MjcxMDQzMzAxLAorICAgICAgICAgMC42OTE1NTU5MTczLCAgMC43MzIxODM5MzMzLCAgMC42MjU3ODk2NDIzLCAgMC42Mjc0MDY0MTgzLAorICAgICAgICAgMC41MjM4Mjg0NDY5LCAgMC41MTk0OTk2NTk1LCAgMC40MTE2OTcyMDg5LCAgMC4zMzgyNjQyODY1LAorICAgICAgICAgMC4zNzU1MDIyODgzLCAgMC40ODY3OTkwNjEzLCAgMC41Njg2Mjg3ODgwLCAgMC41MTA2ODU2MjI3IH0sCisgICAgICB7ICAwLjA5ODkyOTI4NjAsICAwLjYyNDQ4NTc5MDcsICAwLjQ3MDA1NzYwNjcsICAwLjM5MDUyMjY1ODgsCisgICAgICAgICAwLjI2MzAwNTk3MTksICAwLjMwMDk3NDEzMDYsICAwLjIxNTA3NjM4NjksICAwLjIwNjc4Mzg5MDcsCisgICAgICAgICAwLjE1MzM3ODEyOTAsICAwLjE4MTU5MzQ3NzcsICAwLjEwMjM3MTQ1NDIsICAwLjAzNzM4NzQ5MDMsCisgICAgICAgICAwLjA4OTc1MDE3MDcsICAwLjE4NDkzMTMzNzgsICAwLjI4NTI3NTc1NzMsICAwLjI2MjU4ODczOTQgfSB9LAorICAgIHsgeyAgMC45OTU0MDU0OTUyLCAgMC45NTU0MDMzMjc5LCAgMC44MjM3NjY0NzAwLCAgMC45NzgwOTAzNDU5LAorICAgICAgICAgMC43MjYxODYyMTU5LCAgMC43ODg0NTgxNjg1LCAgMC43OTMzMDg0OTY1LCAgMC43MzkzMjkwNDAxLAorICAgICAgICAgMC44NzgzMTk2MjExLCAgMS4wNDA5MzU5OTMyLCAgMS4wMjE3OTU0NTE2LCAgMC45MTU5MjI3MDE0LAorICAgICAgICAgMC44Njk4MTg1MDg2LCAgMC43MDU3OTM5NzY4LCAgMC43NjYyOTI2OTEyLCAgMC43MzM5NTcxNzE0IH0sCisgICAgICB7ICAwLjc5MTMyNjY0MjAsICAwLjY3MzkyNzg0MzYsICAwLjUwNjE0ODIxOTEsICAwLjcwNTg5ODI4NDksCisgICAgICAgICAwLjM0ODA2OTI1MDYsICAwLjQzMzgxMDUzMjEsICAwLjQ0Mjg4NTMzOTMsICAwLjM3NTgxNTIxMjcsCisgICAgICAgICAwLjU5NjIxODI4NzksICAwLjc5MjUyNjE4NTUsICAwLjc5Njg1NDk3MjgsICAwLjY2Mjk3NTQ5MDEsCisgICAgICAgICAwLjYzMjUxNzUxNjYsICAwLjQ1OTgzNTQxMDEsICAwLjUzMTA3Nzg2MTgsICAwLjU1MTg4NzMzMzQgfSB9LAorICAgIHsgeyAgMC40NjM4NTEyNzMxLCAgMC4wNjA0OTE3NDA3LCAgMC4xODk3Mjk1MTE3LCAgMC4zNDAzNTA0NDkxLAorICAgICAgICAgMC40NzA4Mzk5MTc3LCAgMC41MjQxNDEzNzEzLCAgMC42MDYxMjc1NjAxLCAgMC42NDQ2Njk0MTM2LAorICAgICAgICAgMC43MzEzNDk0NjgyLCAgMC43MjA4MTQzNDczLCAgMC42MjY4ODQ4Nzc3LCAgMC42MDgxMDk0MTQ2LAorICAgICAgICAgMC40OTEzMzY0NjQ5LCAgMC4zNTI5NzE3MzI2LCAgMC40OTU0NTY2MzYwLCAgMC41NzY3MTI2Njc5IH0sCisgICAgICB7ICAwLjEzNTM4NDk3NjksIC0wLjAyNzQ0MDAxMTUsICAwLjAwMDI1Mzc5NjYsICAwLjAyNzIxNzQ0NzgsCisgICAgICAgICAwLjA1NTUzNzEwNDYsICAwLjA2NTI4OTkxNDYsICAwLjEwMTA2NzYwMjYsICAwLjEwNzMyNjA5MDMsCisgICAgICAgICAwLjE1Njg3MjQ1MTMsICAwLjIyMDc2MTE3OTksICAwLjE0MzQxNjcwMjcsICAwLjIyNjIzNzM1NjcsCisgICAgICAgICAwLjExNzcwNDc0OTEsICAwLjAxNjI2NTA5NDMsICAwLjI1Mjk0MDIzNzUsICAwLjQwODc3NjU4MTMgfSB9LAorICAgIHsgeyAgMC45NzAwMDY0NjU5LCAgMC45OTE3MDI1NTY2LCAgMC45MTU5MjI3MDE0LCAgMC45MzA5NDMwNzE4LAorICAgICAgICAgMC44OTkxMjkwOTI3LCAgMC45MzE0MTI0NTg0LCAgMC45MDU5NjEyNzUxLCAgMC45NDczMTk0NDgwLAorICAgICAgICAgMC45NjA0NjIyNzIyLCAgMC45Mzc3NzUyNTQyLCAgMC45MTk3ODIxMDIxLCAgMC44ODY5NzcxOTU3LAorICAgICAgICAgMC44NTA2Nzc5NjcxLCAgMC44NTk0OTIwMDM5LCAgMC44MzIwNTg5NjYyLCAgMC44NzM5OTA4MzM4IH0sCisgICAgICB7ICAwLjI4OTIzOTQ2NjIsICAwLjA1NTExOTg3MjEsICAwLjA4OTI4MDc4NDEsICAwLjExNTg3OTM1NjksCisgICAgICAgICAwLjA5MDU4NDYzNTcsICAwLjA3Mzg5NTMzNTIsICAwLjAzOTUyNTgwNjksICAwLjAyNDAzNjA0OTgsCisgICAgICAgICAwLjA0NzcxMzk5NTAsICAwLjA3NTE0NzAzMjcsICAwLjExNzEzMTA1NDQsICAwLjE1NTUxNjQ0NTYsCisgICAgICAgICAwLjEzODQ2MjA2NjcsICAwLjE4MTg1NDI0ODAsICAwLjIxMDQ4NjgyOTMsICAwLjEyODgxMzU2NDggfSB9LAorICAgIHsgeyAgMC40MTAxODQ3NDEwLCAgMC4zMzI2MzE2NDc2LCAgMC40NjY2Njc1OTI1LCAgMC41MDc3MTI4NDEwLAorICAgICAgICAgMC41ODkyMjk2NDMzLCAgMC40MjcyOTEyNzQxLCAgMC4wNjAzMzUyNzg1LCAtMC44NjY4NTk2NzQ1LAorICAgICAgICAtMS4xMTAzNjcwMDAxLCAtMC4wOTAwMjQ4ODg1LCAgMC4xNjI2NjE1NTI0LCAgMC4xNDg3ODg1NzE0LAorICAgICAgICAgMC40MTMwMDEwNjA1LCAgMC41MTE5MzczMjAyLCAgMC41ODIwMzIzODI1LCAgMC41NDg2MDE2MjczIH0sCisgICAgICB7ICAwLjAzODMyNjI2MzQsICAwLjEzMDA2NTI2MjMsICAwLjIyOTUyMzA2MjcsICAwLjI3MDYyMDQ2NTMsCisgICAgICAgICAwLjM3MjIxNjU4MjMsICAwLjE2OTgwNjY1OTIsIC0wLjA5MzQ2NzA1NjgsIC0wLjg2Nzc0NjI5MzUsCisgICAgICAgIC0xLjA3MjQ1MDk5NTQsIC0wLjIxNjQ0NjM0MDEsIC0wLjAwNTY5MTc2NjcsIC0wLjAzMDE1MjAyMjgsCisgICAgICAgICAwLjEyOTkwODgwMDEsICAwLjI1Nzk5OTE4MTcsICAwLjM0ODIyNTcxMjgsICAwLjI0Njk0MjUyMDEgfSB9LAorICAgIHsgeyAgMC42MDMxNTQ3Nzg1LCAgMC41NTE1MjIyNTQ5LCAgMC40MjkyMjA5NzQ0LCAgMC41MDI3NTgyMDQ5LAorICAgICAgICAgMC44MTY3Nzc4MjU0LCAgMS4wOTI1Njg1MTY3LCAgMC45ODc4OTUzMDk5LCAgMC43MDE5MzQ1NzYwLAorICAgICAgICAgMC4yNTA5NTgzODMxLCAgMC4yNDc1MTYyMTQ4LCAgMC41NjYwNzMyMzg4LCAgMC41MTQ1OTcxNzc1LAorICAgICAgICAgMC40ODI0MTgxMTk5LCAgMC41OTcwMDA1OTg5LCAgMC41OTk2NjA0NTYyLCAgMC41Mzg0MzE1ODQ4IH0sCisgICAgICB7ICAwLjM2NzczMTMzMjgsICAwLjI2NTAzOTk4MDQsICAwLjE1ODU5MzUzNTQsICAwLjIyMTMzNDg3NDYsCisgICAgICAgICAwLjU1NjYzMzM1MzIsICAwLjg0MjU5NDA4NzEsICAwLjc2MDQ1MTQzNjAsICAwLjQ1MjM3NzM3ODksCisgICAgICAgICAwLjA2ODEwNjIzNDEsICAwLjA3MzczODg3MzAsICAwLjMxNjk4NTQyODMsICAwLjI4Njg0MDM3OTIsCisgICAgICAgICAwLjI2NjE4NzM2OTgsICAwLjM2MzUwNjg1MzYsICAwLjQzMDA1NTQzOTUsICAwLjM3NDMwMjc0NDkgfSB9LAorICAgIHsgeyAgMC41MDE3NjcyNzc3LCAgMC42NjM0OTcwMzA3LCAgMC42ODY5MTQyMDU2LCAgMC43MDY2Mjg0NDE4LAorICAgICAgICAgMC41NjY5NTk4NTc5LCAgMC4wNjIxMDg1MTY3LCAgMC4wNjM0NjQ1MjI0LCAgMC4yMzIxMzA3NjU5LAorICAgICAgICAgMC44MzIyNjc1ODI0LCAgMC45ODU1NDgzNzcwLCAgMC44Mjk2NTk4NzkyLCAgMC42MTQwMDI4MjM4LAorICAgICAgICAgMC41NDYyNTQ2OTQ1LCAgMC42NzMwNDEyMjQ1LCAgMC42ODU2MTAzNTM5LCAgMC41OTc1MjIxMzk1IH0sCisgICAgICB7ICAwLjI2ODA2NDkxNjEsICAwLjMzMjQyMzAzMTMsICAwLjM2ODg3ODcyMjIsICAwLjM4ODY0NTExMjUsCisgICAgICAgICAwLjI3NzQwMDQ5MzYsIC0wLjE2OTUwNzY4MjMsIC0wLjEzNTM0Njc3MDMsICAwLjAxNTkwMDAxNTgsCisgICAgICAgICAwLjU4OTU0MjU2NzcsICAwLjc1ODY3ODE5NzksICAwLjU2Mzk4NzA3NjMsICAwLjM2ODc3NDQxNDEsCisgICAgICAgICAwLjM0MDE0MTgzMjgsICAwLjQ0NzczNTY2NzIsICAwLjQ3ODI5Nzk0ODgsICAwLjQwMzQ1Njg2NjcgfSB9LAorICAgIHsgeyAgMC44ODM4NDc5NTE5LCAgMC45MDI1NzEyNjA5LCAgMC43MzI2NTMzMTk4LCAgMC44MTI0NDkwMzgwLAorICAgICAgICAgMC44OTU2MzQ3NzA0LCAgMS4xMDA3MDQ1NTA3LCAgMS4yNzMxNzgwNDEwLCAgMS4yMDI5Nzg2NzA2LAorICAgICAgICAgMS4wODM5MTA5NDIxLCAgMC45NjY0MDc4MzU1LCAgMC43MzU2NzgyNTU2LCAgMC42OTQyMTU3NzQ1LAorICAgICAgICAgMC42OTE3NjQ1MzM1LCAgMC42MzgzNTg3NzE4LCAgMC42NTAzMDIwNTI1LCAgMC41OTg5MzAyOTkzIH0sCisgICAgICB7ICAwLjU1NzY3NjQzNDUsICAwLjQ1OTY3ODk0NzksICAwLjM3OTA0ODc2NDcsICAwLjU1MTQxNzk0NjgsCisgICAgICAgICAwLjczMzM4MzQ3NjcsICAwLjk2MTI0NDU4MzEsICAxLjE5NzY1ODk1NjEsICAxLjEwOTQ2NjQzMzUsCisgICAgICAgICAwLjg4NjgyMDczMzUsICAwLjY3ODkzNDYzMzcsICAwLjQ2NDMyMDY1OTYsICAwLjQwMjkzNTMyNjEsCisgICAgICAgICAwLjQzODQ1MjI0MzgsICAwLjM4NzE4NDc5ODcsICAwLjQzMjYxMDk4ODYsICAwLjM2OTE5MTY0NjYgfSB9LAorICAgIHsgeyAgMC44NTIwODYxMjY4LCAgMC44NDEzNDIzODk2LCAgMC43MjM4MzkyODMwLCAgMC45MTAzOTQzNzA2LAorICAgICAgICAgMC43MDcyNTQyOTA2LCAgMC42NDc5MDI5NjU1LCAgMC40NTU3NjczOTMxLCAgMC4xOTA4MjQ3NDcxLAorICAgICAgICAtMC4wNTY5MDcwNTc4LCAtMC4xMDEzNDIzMjA0LCAgMC4yNTE3NDA2OTQwLCAgMC40ODU0OTUyMDk3LAorICAgICAgICAgMC41ODIwODQ1MzY2LCAgMC41ODg2MDM3OTQ2LCAgMC42MTc3NTc5MTY1LCAgMC42MjI2NjAzOTg1IH0sCisgICAgICB7ICAwLjYxNjA4ODk4NjQsICAwLjQ1OTIwOTU2MTMsICAwLjQ3NTIyMDg1OTEsICAwLjY2ODU1NTk3NTAsCisgICAgICAgICAwLjQzMjYxMDk4ODYsICAwLjQwNzczMzUwMDAsICAwLjIzMTQwMDYwOTAsICAwLjAxNzM2MDMyOTYsCisgICAgICAgIC0wLjIyMDgyNzI4MTUsIC0wLjMwMTQ1NzQ2NDcsICAwLjAzMjExOTkyOTgsICAwLjI1NTkxMzAxOTIsCisgICAgICAgICAwLjM2MDMyNTQ1NTcsICAwLjM0NjYwODkzNjgsICAwLjQwNzIxMTk1OTQsICAwLjQ3NzYxOTk0NjAgfSB9LAorICAgIHsgeyAgMC43MDgzNDk1MjU5LCAgMC45MDAxNzIxNzQwLCAgMC42Nzk1MDgzMjg0LCAgMS4yNzQzMjU0MzA0LAorICAgICAgICAgMS4zNjcyNjM5NzI4LCAgMS4yNTYzMzIyNzgzLCAgMC44NTU3MzY5MTEzLCAgMC44Mjg3NzMyNjAxLAorICAgICAgICAgMC43OTQyNDcyNjk2LCAgMC44MDA2NjIyMTk1LCAgMC43MDM0OTkxOTgwLCAgMC41NDc5MjM2MjQ1LAorICAgICAgICAgMC42MzkxOTMyMzY4LCAgMC42MjQ4NTA4NjkyLCAgMC41NDk1OTI1NTQ2LCAgMC40NzE5MzUxNTMwIH0sCisgICAgICB7ICAwLjQwMDAxNDY5ODUsICAwLjY0OTM2MzI3OTMsICAwLjQ1ODMyMjk0MjMsICAxLjE0ODQyNTUxOTUsCisgICAgICAgICAxLjI1MjE1OTk1MzEsICAxLjEyMzIzNTEwNjUsICAwLjYxNTA0NTkwNTEsICAwLjUzNDc4MDgwMDMsCisgICAgICAgICAwLjQ3MjY2NTMwOTksICAwLjUyNjk1NzY5MDcsICAwLjQyNzgxMjgxNDcsICAwLjI3NDU4NDE3NDIsCisgICAgICAgICAwLjM4Njg3MTg3NDMsICAwLjQxODM3MjkyOTEsICAwLjM0NzQ0MzQwMTgsICAwLjMxNTAwMzU3MzkgfSB9LAorICAgIHsgeyAgMC45MDcwMDQzNTY0LCAgMC43NjQ4MzIzNzc0LCAgMC40MjgxNzc4OTMyLCAgMC41NDc1MDYzOTIwLAorICAgICAgICAgMC40MTM0NzA0NDcxLCAgMC40NzA2ODM0NTU1LCAgMC40NTQ5MzI5MjgxLCAgMC40NjQ4NDIyMDAzLAorICAgICAgICAgMC40NTcyNzk4NjEwLCAgMC40ODIzMTM4MTE4LCAgMC40NjY2MTU0Mzg1LCAgMC40ODQxOTEzNTgxLAorICAgICAgICAgMC40MDE4OTIyNDQ4LCAgMC40Mjk3OTQ2NjkyLCAgMC40NjQ2ODU3MzgxLCAgMC42MDkxMDAzNDE4IH0sCisgICAgICB7ICAwLjQ5MjUzNjAwODQsICAwLjIwNjUyMzEyMDQsICAwLjA5NDg2MTI2OTAsICAwLjE3MTY4NDIwNTUsCisgICAgICAgICAwLjA5OTI0MjIxMDQsICAwLjEzMzI5ODgxNDMsICAwLjEyNTU4MDAxMjgsICAwLjEyNTczNjQ3NTAsCisgICAgICAgICAwLjA5NTUzOTI3MTgsICAwLjExMTg2MzQ5MzksICAwLjEzNzIxMDM2OTEsICAwLjE1MjU5NTgxODAsCisgICAgICAgICAwLjA5MDI3MTcxMTMsICAwLjE1OTE2NzIzMDEsICAwLjIzMzU5MTA3OTcsICAwLjM3NjcwMTgzMTggfSB9LAorICAgIHsgeyAgMC4zMTg1NTAwNTAzLCAgMC44Njc3ODQ1MDAxLCAgMC43Nzc2NjIyNzcyLCAgMC44MTYwNDc2Njg1LAorICAgICAgICAgMC44NjI0MTI2MzE1LCAgMC44MDU3MjExNjM3LCAgMC44ODUyNTYxMTE2LCAgMC44NDcxMzE0OTA3LAorICAgICAgICAgMC45MTQ1MTQ1NDE2LCAgMC44OTQ1OTE2ODkxLCAgMC44NjM4NzI5NDUzLCAgMC44NTMxMjkyMDgxLAorICAgICAgICAgMC43NDI1MTA0MzgwLCAgMC42MjE1NjUxNjMxLCAgMC42NTAxNDU1OTAzLCAgMC42MzQxODY0NDY3IH0sCisgICAgICB7IC0wLjA0OTk3MDU2NzIsICAwLjA2ODc4NDIzNjksICAwLjMwNTE0NjQ1NTgsICAwLjMzNjgwMzk3MjcsCisgICAgICAgICAwLjQ5NDIwNDkzODQsICAwLjM4MjMzNDQ3MDcsICAwLjU2ODMxNTg2MzYsICAwLjUwNDQyNzEzNTAsCisgICAgICAgICAwLjYyNzgyMzY1MDgsICAwLjU3NzcwMzU5NTIsICAwLjU3NDUyMjE5NzIsICAwLjU1MDIxODQwMzMsCisgICAgICAgICAwLjQyNDQyMjgwMDUsICAwLjMxNjM1OTU3OTYsICAwLjM1MjU1NDUwMDEsICAwLjM1ODI5MTQ0NzIgfSB9LAorICAgIHsgeyAgMC4zMjAwNjI1MTgxLCAgMC45NDE1MzAzNDY5LCAgMC42MDY3NTM0MDg5LCAgMC4zNTY4ODMyODc0LAorICAgICAgICAgMC4xNjAwNTM4NDkyLCAgMC4yOTM4ODExNzc5LCAgMC4yMDM3NTg5NTUwLCAgMC4zMDE3NTY0NDE2LAorICAgICAgICAgMC4yNTcyMTY4NzA4LCAgMC40Nzk2MDE4MDA0LCAgMC42OTM4NTA2OTYxLCAgMC42ODQ3NzU4ODg5LAorICAgICAgICAgMC43MjMyMTM0MzQyLCAgMC42MTExMzQzNTAzLCAgMC41MTU5NTMxODMyLCAgMC40ODU2NTE2NzE5IH0sCisgICAgICB7ICAwLjA2ODA1NDA4MDAsICAwLjYyODUwMTY1MzcsICAwLjI1MTQyNzc2OTcsICAwLjA3OTAwNjQzMzUsCisgICAgICAgIC0wLjA2ODc5ODE4NDQsICAwLjA1MjE5OTI0NDUsIC0wLjAwNTU4NzQ1ODYsICAwLjA1MzcxMTcxMjQsCisgICAgICAgICAwLjAxODgyMDY0MzQsICAwLjE4ODMyMTM1MjAsICAwLjQ0OTMwMDI4OTIsICAwLjQzMDA1NTQzOTUsCisgICAgICAgICAwLjQ3NTAxMjI0MjgsICAwLjM2NTgwMTYzMjQsICAwLjMxMTk3ODYzODIsICAwLjI4MTgzMzU4OTEgfSB9LAorICAgIHsgeyAgMC42ODY0OTY5NzMwLCAgMS4wODE1NjQwMDkyLCAgMC45ODM4Nzk0NDcwLCAgMC44ODQ1MjU5NTQ3LAorICAgICAgICAgMC45NDM4NzcyNzk4LCAgMC44ODg4MDI1ODgwLCAgMC44MTc4NzMwNjA3LCAgMC44NTgxODgxNTIzLAorICAgICAgICAgMC43MTI4MzQ3NzU0LCAgMC43MTIwNTI0NjQ1LCAgMC43MzQ1MzA4NjYxLCAgMC43OTQ1NjAxOTQwLAorICAgICAgICAgMC43ODU0ODUzODY4LCAgMC44MjYxNjU1NTY5LCAgMC42OTQxMTE0NjY0LCAgMC42NjQ2NDQ0MjAxIH0sCisgICAgICB7ICAwLjI4NDc1NDIxNjcsICAwLjk1MzUyNTc4MTYsICAwLjY2OTE4MTgyMzcsICAwLjUwMjY1Mzg5NjgsCisgICAgICAgICAwLjU5NDU0OTM1NzksICAwLjQxMjU4MzgyODAsICAwLjM4ODY0NTExMjUsICAwLjM3NDA5NDEyODYsCisgICAgICAgICAwLjI0NTM3Nzg5ODIsICAwLjI5Mjg5MDI1MDcsICAwLjMyMTk5MjIxODUsICAwLjQwNjU4NjExMDYsCisgICAgICAgICAwLjM4Mzg0NjkzODYsICAwLjQyODk2MDIwNDEsICAwLjM5MTA0NDE5OTUsICAwLjM4MjE3ODAwODYgfSB9LAorICAgIHsgeyAgMS4xMzM1MDk0NTcxLCAgMS4wMzkwMDYyOTI4LCAgMC43MDE5ODY3MzAxLCAgMC42MjAzMTM0NjU2LAorICAgICAgICAgMC42OTUxNTQ1NDc3LCAgMC40ODYzODE4Mjg4LCAgMC42MTcxMzIwNjc3LCAgMC42MjQ3NDY1NjExLAorICAgICAgICAgMC41OTA3NDIxMTEyLCAgMC42NzExMTE1MjQxLCAgMC43MzIyODgyNDE0LCAgMC43MDQyMjkzNTQ5LAorICAgICAgICAgMC41NjM1Njk4NDM4LCAgMC42MTc0NDQ5OTIxLCAgMC42NzI3MjgzMDAxLCAgMC42NDMxMDQ3OTE2IH0sCisgICAgICB7ICAxLjAxNDY1MDM0NDgsICAwLjc3NjI1NDExNzUsICAwLjIyMDAzMTAyMzAsICAwLjI0NTk1MTU5MjksCisgICAgICAgICAwLjI3MDM1OTY5NTAsICAwLjEzNzYyNzYwMTYsICAwLjI1MjIxMDA4MDYsICAwLjI2MjI3NTgxNTAsCisgICAgICAgICAwLjIzODkxMDc5NDMsICAwLjI5NTY1NDQxNjEsICAwLjM3OTk4NzUzNzksICAwLjM2NTM4NDM5OTksCisgICAgICAgICAwLjI1NjEyMTYzNTQsICAwLjI4NDIzMjY3NjAsICAwLjQwMzQ1Njg2NjcsICAwLjM3MDA3ODI2NTcgfSB9LAorICAgIHsgeyAgMC42MzQyOTA3NTQ4LCAgMC45NjI3NTcwNTEwLCAgMC41MjE0ODE1MTQwLCAtMC4wMjI2OTM5OTE3LAorICAgICAgICAgMC41NjE2NDAxNDM0LCAgMC43MjMxMDkxMjYxLCAgMC43NDE3ODAyODExLCAgMC45MDkyOTkxMzUyLAorICAgICAgICAgMC45NzM5NzAxNzQ4LCAgMC43ODA0Nzg1OTY3LCAgMC42NzcxMDkyNDE1LCAgMC42MzUyMjk1MjgwLAorICAgICAgICAgMC40NjYwNDE3NDM4LCAgMC41ODY5ODcwMTg2LCAgMC42NjkyMzM5Nzc4LCAgMC41OTg2MTczNzQ5IH0sCisgICAgICB7ICAwLjM5ODg2NzMwOTEsICAwLjY5OTc0NDEwNTMsICAwLjIzMTY2MTM3OTMsIC0wLjI1NjY1NzEyMzYsCisgICAgICAgICAwLjI2ODUzNDMwMjcsICAwLjQ0ODQxMzY3MDEsICAwLjQ0OTAzOTUxODgsICAwLjY4ODY4NzQ0MzcsCisgICAgICAgICAwLjc3MDMwODU1NDIsICAwLjU4NDc0NDM5MzgsICAwLjQ1Mzk5NDE1NDksICAwLjQwOTgxOTY2MjYsCisgICAgICAgICAwLjI1Nzk5OTE4MTcsICAwLjMzNzYzODQzNzcsICAwLjQ3NTQ4MTYyOTQsICAwLjUwOTUzODIzMzMgfSB9LAorICAgIHsgeyAgMC40NDQzNDU2NTMxLCAgMi4wMjk2NzI3NDE5LCAgMC42NTY5MjU2MTg2LCAgMC42NDM5OTE0MTA3LAorICAgICAgICAgMC42NDM2MjYzMzIzLCAgMC41NTA3Mzk5NDQwLCAgMC42MDk1MTc1NzQzLCAgMC42MDY2NDkxMDA4LAorICAgICAgICAgMC41MzQ3ODA4MDAzLCAgMC4yNTI5NDAyMzc1LCAgMC40NDQzOTc4MDcxLCAgMC43MDAwNTcwMjk3LAorICAgICAgICAgMC44MjU5NTY5NDA3LCAgMC41OTI3NzYxMTk3LCAgMC41MDc4MTcxNDkyLCAgMC40NDE4NDIyNTgwIH0sCisgICAgICB7ICAwLjI0MzA4MzExOTQsICAxLjkxMzM2OTE3ODgsICAwLjM3MjM3MzA0NDUsICAwLjM3NjQ0MTA2MTUsCisgICAgICAgICAwLjM4NzQ5NzcyMzEsICAwLjMyMTIwOTkwNzUsICAwLjM4MzIyMTA4OTgsICAwLjQ0NzQyMjc0MjgsCisgICAgICAgICAwLjM2NDQ5Nzc4MDgsICAwLjA4MTQwNTUyMDQsICAwLjI3NTI2MjE3NzAsICAwLjQ2NDczNzg5MjIsCisgICAgICAgICAwLjY2MTk4NDU2MjksICAwLjQzMDQyMDUxNzksICAwLjMxNDM3NzcyNTEsICAwLjI3MDU2ODMxMTIgfSB9LAorICAgIHsgeyAgMC45NzQwNzQ0ODI5LCAgMS4wNzMwNjI4OTY3LCAgMC45NzQzMzUyNTMyLCAgMC45MDk4NzI4Mjk5LAorICAgICAgICAgMC45NDUzMzc1OTM2LCAgMC45NjYxNDcwNjUyLCAgMC45MjcwODM2NzExLCAgMC45NjQzNzM4MjcwLAorICAgICAgICAgMC45OTg5NTE5NzE1LCAgMC45NjI3MDQ4OTY5LCAgMC45MzQ4NTQ2MjY3LCAgMC45ODY1MzkzMDQzLAorICAgICAgICAgMC45Mzk5NjU3MjQ5LCAgMC45NzUyMjE4NzIzLCAgMC44NDQwNTQ0MDA5LCAgMC44ODE5MTgyNTE1IH0sCisgICAgICB7ICAwLjkyNTgzMTk3MzYsICAxLjAzNTcyMDU4NjgsICAwLjg0NjM0OTE3OTcsICAwLjgxMDg4NDQxNjEsCisgICAgICAgICAwLjgzOTE1MTkxODksICAwLjg1NjYyMzUzMDQsICAwLjgzMDU5ODY1MjQsICAwLjg4ODA3MjQzMTEsCisgICAgICAgICAwLjkxODE2NTMyNjEsICAwLjg2NzAwMjE4OTIsICAwLjgzMDU5ODY1MjQsICAwLjg5OTU5ODQ3OTMsCisgICAgICAgICAwLjgzMDAyNDk1NzcsICAwLjg3MTEyMjM2MDIsICAwLjcxOTU2MjY0OTcsICAwLjgxMzg1NzE5NzggfSB9LAorfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSB3bWF2b2ljZV9tZWFuX2xzZjEwWzJdWzEwXSA9IHsKKyAgICB7IDAuMjIzNTM5NDA2NiwgMC40MDk3NDg0OTA5LCAwLjcwMjUyOTI3MzIsIDEuMTA3NzE2MDE2OSwKKyAgICAgIDEuMzkzOTE3OTA0NCwgMS42NzQxMjkxNzE2LCAxLjk1NTI5NDkyMjYsIDIuMjE5OTc5MzkxOCwKKyAgICAgIDIuNTEwMzQwMDI0NywgMi43ODI5MjEyOTA2IH0sCisgICAgeyAwLjE0OTM2ODMzOTMsIDAuMzcxNDM1NzM3MywgMC43NzAyNzMwMjQ1LCAxLjA2MDk0MTEzOTQsCisgICAgICAxLjMyNzAzNjI1MzYsIDEuNTgwNjAzMzExOSwgMS44Mzk4NTA3NTI0LCAyLjExMTY3NDAyNDgsCisgICAgICAyLjM4MjM1MDU3NzEsIDIuNjg2NTcxODUyNyB9Cit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHdtYXZvaWNlX21lYW5fbHNmMTZbMl1bMTZdID0geworICAgIHsgMC4wOTk5MjA2NzU0LCAwLjIzNDU5MzM1OTAsIDAuNDYyMTAxMTIxMCwgMC42NzcyNTQ2MTYwLAorICAgICAgMC44MzQ2Mzk2MDYwLCAxLjAwNjc0OTUxMzAsIDEuMTU3MTY5MTY2OCwgMS4zMjkyNTA4Njg4LAorICAgICAgMS40OTQxNDY1NjUwLCAxLjY2MDA3NTU1ODQsIDEuODQ2MTI4NDkwOCwgMi4wNTI5NDg3MzMzLAorICAgICAgMi4yNjkwODEwMTEyLCAyLjQ5NDk4OTQ4MjAsIDIuNzE3Mjc1Mjk2NSwgMi45MTY0ODQwOTAzIH0sCisgICAgeyAwLjA5MTgyOTg0MDIsIDAuMjQ3NTYyMTg5MiwgMC40NzgyOTM3NzIxLCAwLjYyODQ3NzQwNDUsCisgICAgICAwLjc4NjE5NTEyNjQsIDAuOTMwMzczNjAwMCwgMS4wOTQwNDQxMDI0LCAxLjI1MjEwMjkzMDAsCisgICAgICAxLjQ0MzQ3MzIwOTgsIDEuNjU1MTQxMDc0MiwgMS44OTE3OTYyOTYzLCAyLjA5NjcyODA0MDMsCisgICAgICAyLjI5ODE0MzAzNzUsIDIuNDgyNjE3MzQ5NywgMi42ODI3OTcyNDYxLCAyLjg4MTEzNTA4MDAgfQorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHdtYXZvaWNlX3N0ZF9jb2RlYm9va1sxMDAwXSA9IHsKKyAgICAtMC4xODUwMTMsIC0wLjE1MDQwNSwgLTAuNzA3MjY3LCAtMC4yODQxMDAsICAwLjg4Mjg5OCwKKyAgICAtMC43ODg2MjcsICAwLjA2MTAwNSwgIDAuMzc0NDMxLCAgMC4wNTM4NDMsIC0wLjkwOTgyNiwKKyAgICAgMC41NDM2MDIsICAwLjIxOTMyNiwgIDAuMjg1Njk4LCAgMC4xNTQ3MDksIC0wLjQ1NTAwNSwKKyAgICAgMC40MjYyNzYsIC0wLjg2ODg1MiwgLTAuOTUyMzI0LCAtMC41NTAwMDEsICAwLjgxMzgxNCwKKyAgICAtMC4zNTI4MTUsICAwLjI0MjEyMiwgIDAuODIwNDk1LCAtMC4xODk1NzQsIC0wLjQ0OTUzOCwKKyAgICAgMC40OTkxMzIsIC0wLjI0Nzc4MywgIDAuNTk4MTU5LCAgMC43MzIwNDAsIC0wLjU2NDQwNiwKKyAgICAtMC42MzE3ODgsIC0wLjQ1Mjk3MywgIDAuMjg1MTg5LCAtMC4zMzkwNTUsICAwLjI2MjkyNywKKyAgICAgMC4xNjgwODcsIC0wLjEyNzY4MiwgLTAuNjc2MDY3LCAtMC40NTc0ODEsICAwLjkyNjE2MSwKKyAgICAtMC41ODU4OTMsIC0wLjkxMzg4MCwgIDAuMTQ1NDg3LCAgMC42OTk4MDQsICAwLjI0MDgyOSwKKyAgICAgMC42OTA0ODIsICAwLjEyNjA4MSwgIDAuMzcxOTc3LCAgMC43MzgxNTgsICAwLjU3NjA4MCwKKyAgICAgMC4xODU3OTEsIC0wLjYxNDY1NywgLTAuMTgxNzk5LCAgMC4wMDYyODUsICAwLjE5NTc2OCwKKyAgICAgMC4zNjg2NjMsIC0wLjQ5NDU4MywgIDAuOTQ3OTg1LCAtMC4wMzMxNzgsIC0wLjc2MjU0MywKKyAgICAtMC42MTY0MjEsICAwLjMzNTAzNCwgLTAuMjE1NTE2LCAgMC42Njg3NjksICAwLjk5NTk3OSwKKyAgICAtMC45NTI1ODgsIC0wLjE2MzE0NCwgLTAuMTMxNzA0LCAtMC42Mjg2NTUsICAwLjM3OTM3NCwKKyAgICAtMC4yMDU1NDMsIC0wLjIxNDU0OSwgIDAuNDY1NDk0LCAgMC45Mzk5NDQsIC0wLjUxNDc0NCwKKyAgICAtMC4yOTM2NzYsICAwLjYzMDQyNiwgIDAuNjExMzM2LCAtMC45MjE2OTksICAwLjM2ODU4NCwKKyAgICAgMC4xODc0MTYsICAwLjI2NDA5MiwgIDAuNzUzOTI3LCAtMC45OTQzODIsIC0wLjcyOTYyMywKKyAgICAtMC4wNTAzMDQsICAwLjM3NDI4MCwgLTAuMjI0MjA1LCAtMC4xMDIzMTksIC0wLjY1ODg5NywKKyAgICAgMC4wMTMyNTIsICAwLjI4MTI2MCwgIDAuNjc2MTM3LCAgMC43OTc3MzYsIC0wLjA0OTk3MSwKKyAgICAgMC42NzIxMTUsICAwLjg0NTE0OCwgIDAuNzg2ODg1LCAtMC40NTk1ODgsIC0wLjc4MzUwNywKKyAgICAgMC4xNjYyNTksICAwLjMzNDg2OSwgIDAuMDAxOTQ0LCAtMC4zNjgyNDcsICAwLjI3NDgxMywKKyAgICAgMC40ODcyMDAsICAwLjMzODA3NywgLTAuMDk0NzYxLCAgMC4wOTg1MzYsICAwLjQxNjM3OCwKKyAgICAtMC43MjYxNzYsIC0wLjcxNDA0OCwgLTAuMzE5NTMwLCAtMC45NzIyNDksIC0wLjcwODQzMCwKKyAgICAtMC4wNDkxNTMsIC0wLjAyMjU1MywgIDAuNjY1ODUwLCAgMC43MjY2NDIsICAwLjg3NTEyNywKKyAgICAtMC45OTMwNDcsIC0wLjI2MDEwNiwgIDAuMTU2Mzg3LCAgMC42ODMwOTAsIC0wLjQ2MjM3MCwKKyAgICAtMC44OTM1ODQsICAwLjM1NTIwNSwgLTAuNjE3MjIyLCAgMC44OTMzMDEsICAwLjg5NTYxNywKKyAgICAtMC40MDA3MjksICAwLjA1OTU1OSwgIDAuMjMwNDg2LCAgMC42MDEyMTUsICAwLjY5MTMxMywKKyAgICAtMC40OTQ3MDEsICAwLjA4ODQxNSwgIDAuMDI5MzkwLCAgMC40MTA1MzksIC0wLjgxMzA0OSwKKyAgICAtMC41NTQyMzIsICAwLjY4NDM2MiwgLTAuNTI3MDk3LCAgMC4xMjYyMzgsICAwLjcxMjExMywKKyAgICAtMC4yMzU1MjgsIC0wLjkyMjkxNSwgLTAuMzEwNDQwLCAtMC41Njk2NzgsICAwLjgwMzcyNywKKyAgICAtMC40MzUzMTMsIC0wLjU2MjcyNSwgLTAuNDU2MzgwLCAgMC43MjEwNzUsIC0wLjg3OTYzNSwKKyAgICAgMC4wODEyNTAsICAwLjgyNzQ5MSwgIDAuNDc1NTcwLCAgMC40NjQwMjksICAwLjcyMDc5MiwKKyAgICAgMC4zNzExODcsIC0wLjkzNjcwMCwgLTAuMjE5NjQ5LCAtMC4zOTgzMjcsICAwLjY2NDUxNSwKKyAgICAtMC41MjgzMzYsICAwLjEwNjk3MiwgLTAuMjQ3MDcwLCAgMC41MDEwNTMsIC0wLjQ4MjQ5MCwKKyAgICAtMC4wNjAxMTksICAwLjk0NjgyMSwgLTAuNzk4MTI3LCAgMC40MTI3ODQsICAwLjA3MzA1OCwKKyAgICAgMC45MTM5ODYsIC0wLjgyMjc0NCwgIDAuMTUwMTQzLCAtMC4zOTY0NTMsIC0wLjM5MjQyMSwKKyAgICAtMC4wNDYxMzAsICAwLjE2ODIzNCwgIDAuMDQ0ODU0LCAgMC40OTc0OTAsIC0wLjExMDY5MSwKKyAgICAgMC4xNjUyMTksIC0wLjQyMTI1OSwgLTAuMjgzMjAwLCAtMC4zNTkyMTIsIC0wLjk1NzIzMSwKKyAgICAtMC41NjI0MDksIC0wLjk4ODAyNSwgLTAuODkzOTMxLCAgMC4yMTc5NDIsIC0wLjM4NjM1MiwKKyAgICAgMC43NzA1ODUsICAwLjY4OTYwNiwgIDAuNzIwNjIwLCAtMC40NzY0ODUsICAwLjE5MDY1OSwKKyAgICAtMC43NjE4NzAsICAwLjQ2MzM5NSwgIDAuMTM3NDgwLCAtMC41NTk5OTcsIC0wLjEyMzgyMSwKKyAgICAtMC43ODk0NjEsIC0wLjY0NjAxMSwgIDAuMDUzNDM1LCAgMC4zNjA2ODIsIC0wLjA0MjQ2NCwKKyAgICAgMC42NjEwMTQsIC0wLjY4NTQ0OCwgLTAuODc0MjMwLCAtMC4yOTQxMzMsICAwLjgxMjA0MiwKKyAgICAgMC4wMTUwNzgsICAwLjg3MTA4NiwgLTAuNjA5MjE4LCAgMC43MzE4NzgsIC0wLjQ4ODEyNiwKKyAgICAtMC41NjY0NDgsIC0wLjgzMDUzMCwgLTAuNDc2MTUwLCAtMC40NjAzNzksICAwLjM4NzQxMiwKKyAgICAgMC4xMzc0OTcsIC0wLjY4OTc5NCwgIDAuMDc3MDE4LCAtMC4xNDE4ODMsIC0wLjE2NjI4MCwKKyAgICAtMC43MzIzMjIsICAwLjA5NjI0NywgLTAuNzAyODg0LCAgMC40MDUxNTgsICAwLjUzNjI1MCwKKyAgICAgMC4xNzMyOTUsICAwLjYxNTY5NiwgIDAuODkwMjM5LCAtMC43NzMyNzAsIC0wLjAyMzYyMiwKKyAgICAtMC4xNTIyMjYsICAwLjg4Nzc0NCwgIDAuMjkwOTMwLCAtMC4wMjY0NTYsIC0wLjQwNjM4OSwKKyAgICAgMC4xMDI5NzIsICAwLjk4ODYyMiwgLTAuNTM1MzAzLCAgMC40OTM3NTQsICAwLjcyMDUwMCwKKyAgICAtMC4wMjM0MjgsICAwLjkyNzMwNiwgIDAuODg5OTcwLCAgMC41MDA0MjEsIC0wLjUzMzA3MywKKyAgICAgMC4yNzczODIsIC0wLjM2MjA4MSwgLTAuMjIyODY3LCAtMC42NDU1OTksICAwLjQ5NjAzNSwKKyAgICAgMC42MTA4NTMsIC0wLjM3NzkyMiwgLTAuNDA3NzE4LCAgMC45MDc5NjksIC0wLjk3Mjc2NCwKKyAgICAtMC44NzE0NjgsICAwLjA4MTI2NCwgIDAuNjQyOTMzLCAtMC45ODEyMzAsICAwLjMwNzk5NCwKKyAgICAtMC4zODA2ODksIC0wLjEzMzQ1NiwgIDAuMTk1NzM4LCAgMC45MTAyNDEsICAwLjg0MDA4OCwKKyAgICAgMC43ODkzNDksICAwLjAxMzIxMywgIDAuODI4NzEwLCAtMC43NDU5NTQsIC0wLjQ5MzAzMywKKyAgICAgMC41NDkyMTAsICAwLjIzMDYxOCwgLTAuNTY1NzI3LCAgMC40MzkxODAsIC0wLjI2ODk2MSwKKyAgICAtMC4wOTg4MDAsIC0wLjI4MzQzOCwgIDAuMzY4OTU4LCAgMC42NzgzMzMsICAwLjA3MDk2MywKKyAgICAtMC4xMzUwMDcsICAwLjI4OTE4NiwgIDAuNjkzMDQxLCAgMC40NTcyNzUsICAwLjE5NzE1NSwKKyAgICAgMC43MjAyNzcsICAwLjU4NTgwNywgLTAuNzIxNTgxLCAgMC4zNjMyMTAsICAwLjYwNDU3NywKKyAgICAgMC41ODY0MTMsICAwLjk4MjUyMSwgLTAuNTI4ODc4LCAtMC4yMTc4NDksICAwLjg5Mjc2MiwKKyAgICAtMC42ODg3OTEsIC0wLjQyODUwMCwgLTAuMDk0MDI1LCAtMC44NjAwODEsIC0wLjE3NDQ1NCwKKyAgICAgMC40MTI5NDIsICAwLjY4OTEyOSwgLTAuOTQzODM2LCAgMC44NDcyMTUsICAwLjEyODMwOSwKKyAgICAtMC4yMTI3OTcsIC0wLjI1MTU4NSwgIDAuODQ0ODcxLCAtMC44NDM4MzksIC0wLjU3MzI1MiwKKyAgICAtMC4wODQxNjcsICAwLjAyMTE1NCwgIDAuNzE1OTM1LCAtMC4zOTExMjYsIC0wLjUyMTU3MCwKKyAgICAtMC4wODY5MTAsIC0wLjY3MDg0OCwgLTAuOTM1NzYzLCAgMC4xOTE1MDksICAwLjY5MjM2MSwKKyAgICAgMC42Njg4MTQsIC0wLjIyMjA3OCwgIDAuNjc0ODgyLCAtMC44NjAwNjQsICAwLjU2MDA3MywKKyAgICAgMC41Njc2NDQsIC0wLjU0ODg1NSwgLTAuODY4NDI3LCAtMC41MjYzODIsIC0wLjQwODkzNiwKKyAgICAtMC4wNDI4ODEsICAwLjg4NjU2MCwgLTAuNzE5ODA3LCAgMC4wMTMyODMsICAwLjczMzc3NSwKKyAgICAgMC40MDg1MDIsICAwLjgwMDQ4NywgLTAuNTE3ODEwLCAgMC4yNTMzNzIsICAwLjk1NjY0OCwKKyAgICAtMC4wOTEwNjIsIC0wLjgzMDc5NCwgLTAuMDIyMTk4LCAtMC4zNzUxMjcsIC0wLjIyMTkyMCwKKyAgICAgMC40NTYyMzIsICAwLjUzNzk2MywgIDAuMTA3MjMyLCAgMC41MjA0NjksIC0wLjI3MDUyOSwKKyAgICAtMC4yMDA0MDYsICAwLjE4OTI4NCwgIDAuNTA3MzkzLCAtMC41MjU1MjQsICAwLjMyOTIyMCwKKyAgICAgMC4wNjc0NjYsIC0wLjk1Nzg4MSwgIDAuNzgwMzY1LCAgMC4xOTkwMzksIC0wLjQ4NDI2MiwKKyAgICAtMC42Mjg1NzAsIC0wLjg0Mzg0MywgLTAuNTk3NzAzLCAtMC4zNDgzNzcsICAwLjE2OTQ0MSwKKyAgICAtMC44NjM5MjgsIC0wLjkzOTg3NSwgLTAuMDMwMDczLCAtMC4zODE3MzgsICAwLjMxMzQ5NywKKyAgICAtMC4wNzM0MjUsICAwLjUyNzIwMCwgIDAuNDgyNzAzLCAgMC45MDQzNzcsIC0wLjg0NzkyNywKKyAgICAtMC43MzkyMTcsICAwLjM2MDYwOSwgIDAuNjkwMDM1LCAgMC4zNjgwMTUsIC0wLjExODkyMSwKKyAgICAtMC41ODA0OTMsIC0wLjgzMjM5MSwgLTAuOTI5NjM4LCAgMC45MjY5MDAsIC0wLjM1NzkxNSwKKyAgICAgMC4zOTk1ODIsIC0wLjAwNTYzNCwgLTAuMzE1Nzk2LCAgMC4xNzk5NDcsIC0wLjgwNjU5NiwKKyAgICAgMC4zOTMzNjAsICAwLjczMjkzMSwgLTAuNDE1ODMzLCAtMC43MjQ1MjYsICAwLjk1NzM0NywKKyAgICAtMC44OTI4ODcsICAwLjQ3NTM2NiwgIDAuMTczNTgzLCAtMC40MTg1NTQsIC0wLjMwMjUzNiwKKyAgICAgMC42MjczMTUsICAwLjc4MjAwMCwgIDAuNDk3NTQyLCAgMC4xMzkwODIsICAwLjU3MDExMSwKKyAgICAgMC43MzIzNzUsIC0wLjQ1NDY0MywgIDAuMzAyMjE4LCAtMC4wMTk1MDUsICAwLjg4MTc3OCwKKyAgICAtMC4wNTc2MDYsICAwLjI3MzA0MSwgIDAuNDE0MTcwLCAtMC41MDM1MDEsIC0wLjA3OTYwMiwKKyAgICAtMC4wODM5NDEsICAwLjAwNzE3OCwgLTAuMTcxOTI1LCAgMC41MDY4NTYsICAwLjUyMDk1MywKKyAgICAgMC42MzE2ODQsIC0wLjA5OTc4NCwgIDAuMjUzODg1LCAtMC43ODQxNDksICAwLjE3NTY5MSwKKyAgICAgMC4yMTEyMzEsIC0wLjY3NzAzNiwgLTAuMzQ4OTQzLCAtMC42MTUxODYsIC0wLjA5NTU5MSwKKyAgICAgMC4zNDg1MjEsIC0wLjk4Nzg3MSwgLTAuMzEzNTkwLCAtMC4xNTM5MzgsICAwLjE1MTIxMCwKKyAgICAtMC43NDM0NzksIC0wLjQyMTU2MiwgIDAuNjk2NTY3LCAgMC41NTg3MzksICAwLjU1ODkzMywKKyAgICAgMC41NzgzNDYsIC0wLjQ5ODg2NywgLTAuMTY4MDI2LCAtMC4wMDc0ODUsIC0wLjAwMjM2OCwKKyAgICAgMC43NTIzNzIsICAwLjkwODU3NSwgLTAuOTk1MTkwLCAtMC40MTk1NTMsICAwLjQxNTQzMCwKKyAgICAgMC41MjU3NjMsIC0wLjc4Nzg2OSwgLTAuNjg0MzUzLCAtMC4yMjAzNTMsIC0wLjU3MjAxOCwKKyAgICAgMC40OTEzMzcsICAwLjk5MDg3OSwgLTAuMjQ5MDU0LCAtMC44NTc2MDYsIC0wLjYyNDMwNywKKyAgICAgMC42NTUzNTUsICAwLjQ5MDkxNSwgLTAuNjEyMTc4LCAtMC42NTgyMzUsIC0wLjY2MzAyMywKKyAgICAgMC41MzkwMzIsIC0wLjQwMTcxNCwgLTAuMDg0NTg1LCAgMC4yMzU1OTksIC0wLjg0Mjk3NSwKKyAgICAtMC41MjU2NTMsIC0wLjE4NjA1NSwgLTAuMzQxODQxLCAgMC4zMDYzMjEsICAwLjgwNjQ2MCwKKyAgICAgMC42NTU3OTEsICAwLjA1ODY5MywgIDAuNzE1MDM1LCAgMC42NjA2MDEsICAwLjYzOTE0MCwKKyAgICAgMC4xMzA0NjUsICAwLjE4NjM2MywgIDAuODUxMjcxLCAgMC40NDYxMTIsICAwLjk2NjAxMSwKKyAgICAtMC43MjA3NDYsIC0wLjA2MjU1MSwgIDAuOTU2ODkwLCAgMC4wMzAyMDAsICAwLjA3OTg0MywKKyAgICAtMC42Njc0MTgsIC0wLjMxNDQ0NSwgLTAuNDI5MjQzLCAtMC4yNzk1OTYsICAwLjAyNzMyMCwKKyAgICAtMC4wOTIyNjYsIC0wLjc0MDU2NCwgIDAuNjI1NjA2LCAgMC44MjMxNDksICAwLjQ5NTAzNSwKKyAgICAgMC43ODI2MzIsIC0wLjcwMjUwNCwgLTAuNjkxMDIwLCAtMC41NTkyMDksICAwLjYwMzgxOCwKKyAgICAtMC44ODQ1NjAsIC0wLjkwMzQxOSwgLTAuMzM3NDg5LCAgMC44MzA0NzUsICAwLjc1NzE4MiwKKyAgICAtMC42OTgzNDksIC0wLjAzOTA2MCwgLTAuMDU2NDU1LCAtMC44NDcwNzgsIC0wLjU5Mjk0OCwKKyAgICAtMC4wOTA0NDQsIC0wLjU2NzgyNCwgIDAuMzQ0NTAxLCAtMC4xMzM1NTQsICAwLjQ2MjM3NSwKKyAgICAtMC41NzU2NTYsICAwLjE5OTAyOCwgLTAuODUyMDcwLCAtMC4wMDQ4OTksICAwLjkxOTQzMiwKKyAgICAgMC4xNzUyNTEsICAwLjkwMjgzNSwgLTAuODIxMTMyLCAtMC4xOTkxNDMsICAwLjcyNTk4NCwKKyAgICAgMC42NzM5MDMsIC0wLjQxNjUxMSwgLTAuOTc2NTE5LCAgMC45ODI4ODMsICAwLjAyNDI3OSwKKyAgICAgMC42MjcyOTgsIC0wLjkwMTY3NywgIDAuMTIwODYxLCAtMC43MTAxOTEsICAwLjkyODc5OCwKKyAgICAtMC4xMjE5NTgsIC0wLjQwODU0MCwgLTAuMTEwMjYxLCAgMC44MjE1ODgsIC0wLjI1NTYxOCwKKyAgICAgMC4yOTY3OTAsIC0wLjI2ODg1NiwgIDAuMTc2NTU3LCAtMC4zNTg3MDksICAwLjU5NzU4OSwKKyAgICAtMC4zNjEwNjcsICAwLjA2NTYzNSwgLTAuMjAzMzgyLCAtMC4yMTMxMzcsIC0wLjkzOTI2NCwKKyAgICAtMC4yODM5NTEsICAwLjk2MjExMywgIDAuOTYzNTcxLCAtMC4xMDUwODMsIC0wLjIzNzAzMCwKKyAgICAgMC42ODk1NTYsIC0wLjQzMTE4MCwgIDAuMzQ2NDU5LCAgMC43MTMwMzcsIC0wLjQ0ODI5NywKKyAgICAtMC42MjkyNjIsICAwLjM0MDMzNSwgLTAuMzQ5OTczLCAgMC40OTE1OTksICAwLjYzMDE0NCwKKyAgICAtMC40MjExNzUsIC0wLjYzMDM1OSwgLTAuNzc4Mzk2LCAgMC40Njg1NjQsIC0wLjgwODc3MSwKKyAgICAtMC4wMzQwMTQsIC0wLjIzNDY0NiwgLTAuMDc3NjI3LCAtMC44NTc0NTcsICAwLjQwNjY0NSwKKyAgICAtMC40ODAwMzgsIC0wLjIxODUyNCwgLTAuNTI3NzIwLCAgMC4zMTY1ODAsICAwLjU2ODMzOCwKKyAgICAtMC40NjY5ODQsIC0wLjk2NzM3MSwgIDAuNTMwNDUyLCAtMC41MDM0MTMsIC0wLjA3MjQ1NCwKKyAgICAtMC43MDY1NzgsIC0wLjgxMzg1NywgIDAuNDk2MzY2LCAgMC42Mzk4ODEsICAwLjg5OTE3OSwKKyAgICAtMC45NTE5MzEsIC0wLjk4OTM4MSwgIDAuMjM5NTE0LCAtMC4zMDE5MDQsICAwLjUwMjIxOCwKKyAgICAtMC4xMzAzNDEsICAwLjI3NjkyMSwgIDAuODcxODYwLCAgMC4wOTEyNjIsIC0wLjI1NDUxNSwKKyAgICAtMC45MzY5MTEsIC0wLjk0Mjc1MiwgIDAuNTEwODM5LCAtMC4wMTQ1MzksIC0wLjgwMDIwOSwKKyAgICAtMC4wODI1MTYsICAwLjUwNTQyMywgLTAuMDE4NzMzLCAgMC4zODk3NjMsIC0wLjE3Nzk5NywKKyAgICAtMC40NTAzOTUsICAwLjkyMjc3OSwgLTAuMTQ1MzY4LCAtMC45MTk5NDMsIC0wLjU4MDYzNCwKKyAgICAgMC43ODIxNzgsIC0wLjYyNjUyMSwgLTAuMzk0NDkxLCAgMC4yNzg1NDUsIC0wLjk4NjY0MCwKKyAgICAtMC40OTUzMTIsICAwLjMyNjYxNCwgLTAuOTc2MDIxLCAgMC43NDQyMDMsIC0wLjk3NTI5MCwKKyAgICAgMC41MjYxOTcsIC0wLjM4NjEzOSwgIDAuMzAxNjMxLCAgMC4zOTgwNTcsICAwLjcwNTEyNCwKKyAgICAtMC45NTI4ODQsICAwLjQ2MTE0NiwgIDAuNzYyMzcyLCAgMC41NTc5NTQsIC0wLjU1MzM5MywKKyAgICAgMC45NjIxNjMsIC0wLjUyNDU2MiwgIDAuOTUyMDMwLCAtMC4wNTY1NzAsICAwLjg2NTIwMiwKKyAgICAtMC4yMjU5NjcsICAwLjQ5MzAzNSwgIDAuNzg3OTgxLCAgMC42Mjg2NjUsICAwLjU3MzA5MywKKyAgICAtMC43OTI2NTMsICAwLjQxMDg0NCwgIDAuOTQ2NTcxLCAtMC4xODcxNDQsIC0wLjMxMDYxMiwKKyAgICAgMC45NTk5MzEsICAwLjMxNzU0NCwgLTAuOTgzOTk4LCAgMC45ODM5MTEsICAwLjA2MTc0NywKKyAgICAtMC45NTkyODcsICAwLjUxMDEwOCwgIDAuNjc1NjA4LCAgMC4zNDIzNDQsIC0wLjA5MTgzNSwKKyAgICAgMC4zODA3MzEsICAwLjM4OTQ2MCwgLTAuNjMwNjg5LCAgMC4xNDMxMDMsIC0wLjA1MjU4NiwKKyAgICAtMC4xODQwODMsICAwLjEwNTI2NiwgIDAuNDIyODUyLCAtMC4yMzIwNTIsIC0wLjk1MTMwMywKKyAgICAgMC4yODgwNTQsICAwLjU0MTk4MSwgIDAuNTQxNzMyLCAgMC4wNzYwMzUsICAwLjE3MDY0NiwKKyAgICAgMC4xMTQ4MjUsICAwLjI4MzM4MiwgLTAuNDE4NTEwLCAgMC4wNjEzOTYsIC0wLjkwMzc2MywKKyAgICAgMC4yNzA4NzksICAwLjAyMTMyNywgIDAuNDEzNzgyLCAgMC4yODY4ODEsICAwLjAwNTIzOCwKKyAgICAtMC41MjQ0NzIsICAwLjMyNzU5NCwgLTAuNDg0NjU0LCAtMC44NDg4NjQsIC0wLjMzMDA2MywKKyAgICAgMC40MjM1MTEsICAwLjUzMTg2OCwgLTAuOTQwNjAzLCAgMC43OTI4MjIsIC0wLjMyNTAyOSwKKyAgICAgMC4wMDY4MTEsIC0wLjM5MTI2MSwgIDAuNzgwMjM3LCAtMC41NzAzMzcsICAwLjM3NjY4NywKKyAgICAgMC44Mjg5MzQsICAwLjcxNzcxNywgLTAuMDgxMzMzLCAgMC4zNzA2NjYsIC0wLjIwNjI0OCwKKyAgICAtMC45MTA2ODYsIC0wLjUxNDUxMCwgLTAuOTIyODY3LCAtMC4zMjkxOTYsICAwLjU0Njg4NiwKKyAgICAtMC44MjY2MjksICAwLjk0MTY4MywgLTAuNDMxNzg2LCAgMC41ODcxNTIsICAwLjIyODU2NCwKKyAgICAgMC41NzM0NTIsIC0wLjkzNzMyMCwgLTAuNDQzODQzLCAtMC45MTEyMDIsIC0wLjc4NjE4NCwKKyAgICAgMC4yMjYwOTQsICAwLjUxMjMwOSwgIDAuNzQ1Njg0LCAgMC4yODU0OTEsICAwLjMwNTEzMSwKKyAgICAtMC41NzkzNDUsIC0wLjcwNzY5OCwgIDAuOTEzODcwLCAtMC43OTkxMDgsIC0wLjI3ODAzNSwKKyAgICAgMC4yOTA1NTYsIC0wLjk3MDE3NCwgLTAuNTYwMzE4LCAtMC43OTA3NzYsICAwLjQwMDQ5MiwKKyAgICAgMC4yMzM0MzQsIC0wLjcwMTQ2MiwgIDAuODg1OTgyLCAgMC4zMTA1NjcsIC0wLjAzMDY1OCwKKyAgICAgMC40MzI4NjgsICAwLjQ4MzkzOCwgLTAuMDg4OTc2LCAtMC45OTg5MTgsICAwLjA3MTA5MCwKKyAgICAtMC44NjA0MTIsICAwLjU3NDUzNCwgIDAuMTMzNzcwLCAtMC4zMDQyNTUsICAwLjY2MzMzMiwKKyAgICAgMC4zNDc1ODYsICAwLjkyMTgzOSwgIDAuMTc1NjQxLCAgMC4wOTMyNzAsICAwLjIwNzMzMCwKKyAgICAtMC41MTkyMjgsICAwLjUxMzkyNSwgIDAuNDk5NjMzLCAtMC42MDUzNTgsICAwLjcxNDgxNywKKyAgICAtMC43Nzg0MDIsICAwLjY4NTE5OCwgIDAuNzQ0NjQzLCAtMC4zMzg3MjAsICAwLjg5NDQyMiwKKyAgICAgMC4xNDUxMzUsICAwLjg5NDcxNCwgLTAuODA3MDQxLCAgMC4wMzExMTcsICAwLjIwNTI4MSwKKyAgICAgMC4xNjIzMDEsIC0wLjUzNjAxNSwgLTAuMzEwNzgxLCAtMC45MjY2NzUsIC0wLjUzNDkzMiwKKyAgICAgMC43NjAzMDgsIC0wLjc4NzA4OCwgLTAuOTYwMzk4LCAtMC4xMDU5MjIsIC0wLjA5MTM0MywKKyAgICAgMC43MDI5MzQsIC0wLjc1ODMzNiwgLTAuMTY5NTA0LCAtMC4xMjE0MjUsICAwLjMzNDkzNSwKKyAgICAtMC45NjIxNzMsICAwLjM1OTM0NywgLTAuMTUxMTQwLCAgMC41Mzc0NjAsICAwLjc1Mzk4OSwKKyAgICAtMC40MzYzMjMsICAwLjc1OTA1OCwgIDAuNDM5MTg3LCAtMC42OTE2ODAsIC0wLjU3OTY2MiwKKyAgICAgMC4zMzM2MDgsICAwLjQ1MzQ1NCwgLTAuNjg0OTQ4LCAgMC41MjY1NjcsIC0wLjUxNTQyOSwKKyAgICAgMC41MjAzMzMsIC0wLjMxMTEzMiwgLTAuMDUxNDQzLCAtMC43OTA0NDgsIC0wLjIzNzgwNywKKyAgICAgMC40MTM2MjUsICAwLjk2OTg2MSwgLTAuMDI0ODk1LCAgMC40NTMyMjYsIC0wLjEzNjA2MSwKKyAgICAgMC44ODM3NjIsICAwLjE1NjE2MCwgIDAuMTA1NjAzLCAtMC4yODU3NDEsIC0wLjk2NTI2NCwKKyAgICAtMC41NTk0NjIsIC0wLjI0NzkxNCwgIDAuMzk0MDgzLCAgMC4yODkzOTgsIC0wLjcxMDQ1NSwKKyAgICAgMC4xNDgwNzIsICAwLjg1MzA3NCwgLTAuOTUxMzk3LCAtMC40MTI3NDIsIC0wLjgzODYwNiwKKyAgICAtMC41MzEwNTksICAwLjkyMDg2NiwgIDAuNjE0ODQ4LCAtMC4yMTYwMDcsICAwLjQ0NzQzNCwKKyAgICAtMC45MDA1ODAsIC0wLjY5NTY3MywgLTAuODYzNjk4LCAgMC4wNDc5NzcsIC0wLjQ4NjEyMSwKKyAgICAtMC4xMDE1MDUsIC0wLjUzODM5OSwgLTAuNTE2MjYxLCAgMC44NzM2MDAsICAwLjkxNDgyOCwKKyAgICAgMC4zNDc2NzgsICAwLjc1NzM2MiwgIDAuMDcwOTg4LCAtMC41NDY3MTgsIC0wLjUyODM4MCwKKyAgICAgMC4xMDU3MjQsIC0wLjEwNjE4MCwgIDAuMjIzNzA2LCAtMC41MDAxOTQsIC0wLjgxNjc4MiwKKyAgICAgMC41MTMyNTEsICAwLjY0Nzg3OCwgLTAuOTYzNzA4LCAgMC41NjE4NTQsIC0wLjc2NDg2NCwKKyAgICAtMC44MDIzMTQsIC0wLjk2OTIwNSwgLTAuODQzOTk3LCAgMC44MTI1MzQsIC0wLjE4NTIxMiwKKyAgICAgMC42MDM0MzYsICAwLjkxMTk1NCwgIDAuMTE5MTE0LCAgMC43Mzk3MzgsIC0wLjA0MDA2OSwKKyAgICAgMC42MzI5OTMsIC0wLjM2MTc2NywgIDAuNDIxNTMyLCAtMC44ODMyNjgsIC0wLjQ4ODE2OCwKKyAgICAgMC4zMzYzNjAsICAwLjQ2NDQxMSwgLTAuNzMwODA2LCAtMC41OTI2NTIsICAwLjkxNzY5MywKKyAgICAtMC4yNTkxODYsICAwLjUxMzA3MSwgLTAuMTg4NDg3LCAgMC45NjQ1MjAsIC0wLjk4NzEyMiwKKyAgICAtMC4wMDUyNzAsICAwLjQ3Nzc3MSwgIDAuNjYwNzU2LCAgMC4wMzEwMjMsICAwLjAzOTYyNSwKKyAgICAgMC44OTU4OTIsICAwLjIyODcwOSwgIDAuMDcwNDE5LCAtMC45NDgxMDUsICAwLjA0MTI0MywKKyAgICAgMC44ODUyMDcsICAwLjY1NTMzMSwgLTAuMDQ2ODAzLCAgMC4wMDQzMjEsICAwLjM5NTA2OSwKKyAgICAgMC45MTMxMjgsIC0wLjM2MjY4NiwgLTAuOTY2Njk4LCAgMC4zMzQ2NjEsIC0wLjI0NTk1NCwKKyAgICAtMC40NTQ4NjUsIC0wLjMyODk4MCwgLTAuNzgxNTQzLCAtMC4xODU2NzEsICAwLjA3ODM2OCwKKyAgICAtMC44NjM4NTAsICAwLjU1NTE0MywgLTAuNDA4NTYwLCAtMC4wNTIzMzgsICAwLjUxOTY2MywKKyAgICAtMC4zOTU2ODMsICAwLjk0MjM5MywgLTAuMDAyNTY1LCAtMC43MzQ5MjcsIC0wLjAyNjU4NSwKKyAgICAtMC45NjI5NDEsIC0wLjgzOTAzNSwgLTAuNzk3ODc2LCAgMC4xMDc0NzksIC0wLjc4NzE0MCwKKyAgICAgMC4yNDMzNjcsIC0wLjAwNzMxNCwgIDAuODY4MTkxLCAtMC44MDM0MzUsICAwLjk5NzAwNywKKyAgICAgMC4yNjMyNjEsIC0wLjg5MDMwNywgLTAuMzY1Njc5LCAgMC4yOTY1NjMsICAwLjQ0NDM1NCwKKyAgICAgMC4zODgzNjcsICAwLjg0MTY5OCwgLTAuODg0NjI2LCAgMC42MDY4MjQsIC0wLjM0Mzk3MywKKyAgICAgMC4xOTM3NDMsICAwLjc0Mjk3NCwgLTAuNzg4ODMwLCAgMC43ODUxODIsIC0wLjMwOTM2NCwKKyAgICAgMC43MzA4MzMsIC0wLjYxMDUwMCwgLTAuMzY2OTcxLCAtMC4yNzE3MzIsIC0wLjM0NTQyNywKKyAgICAgMC42MDY0NDQsIC0wLjIzNDY3MywgLTAuMTg0NDYyLCAgMC44MDg1NjgsICAwLjg3MjgwNiwKKyAgICAgMC4wMjgzOTgsICAwLjA1MTkzNiwgLTAuMTM0NTA4LCAtMC4xMDM0MTAsICAwLjI0ODUwMCwKKyAgICAtMC4xMzc1MDEsIC0wLjg0MDE1MCwgIDAuMzU4MTk0LCAgMC40OTY4MTksICAwLjQ1NjQxMywKKyAgICAtMC4xOTc0NTMsIC0wLjExNDgxNCwgIDAuMjk4MTExLCAtMC4wODIwNzgsIC0wLjUwNzk5MCwKKyAgICAgMC45NTQxMzgsIC0wLjg4ODMzNiwgLTAuNzY1MDE2LCAtMC44MzQ2OTIsICAwLjg5Njg0NywKKyAgICAtMC4wNzQzODAsICAwLjg5NjE0MSwgLTAuNzEzNjU0LCAgMC41NTg2NDksIC0wLjM3NTU5MSwKKyAgICAtMC4wNTkwODEsICAwLjE2NTA5MywgIDAuMzg5NzM2LCAgMC43NTY0NTgsIC0wLjAyNjMzOSwKKyAgICAgMC4yNjI1NDIsIC0wLjIxNTE0NCwgLTAuOTc0NDAzLCAtMC44NzE5NjYsICAwLjY4MTQ0NgorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHdtYXZvaWNlX2dhaW5fc2lsZW5jZVsyNTZdID0geworICAgIDAuMDAwMDE4ODM1MSwgMC4wMDAwMjQ5MTQ3LCAwLjAwMDAyOTQ0NDcsIDAuMDAwMDM2NTk3MywKKyAgICAwLjAwMDA0MjMxOTMsIDAuMDAwMDQ2NDkxNiwgMC4wMDAwNDk4Mjk1LCAwLjAwMDA1MjU3MTMsCisgICAgMC4wMDAwNTUwNzQ3LCAwLjAwMDA1NzQ1ODksIDAuMDAwMDU5NjA0NiwgMC4wMDAwNjE1MTIwLAorICAgIDAuMDAwMDYzNDE5MywgMC4wMDAwNjQ5NjkxLCAwLjAwMDA2NjUxODgsIDAuMDAwMDY3OTQ5MywKKyAgICAwLjAwMDA2OTI2MDYsIDAuMDAwMDcwNDUyNywgMC4wMDAwNzE2NDQ4LCAwLjAwMDA3MjgzNjksCisgICAgMC4wMDAwNzM3OTA2LCAwLjAwMDA3NDc0NDIsIDAuMDAwMDc1NTc4NywgMC4wMDAwNzYyOTM5LAorICAgIDAuMDAwMDc3MDA5MiwgMC4wMDAwNzc4NDM3LCAwLjAwMDA3ODU1ODksIDAuMDAwMDc5Mjc0MiwKKyAgICAwLjAwMDA3OTk4OTQsIDAuMDAwMDgwNzA0NywgMC4wMDAwODE0MTk5LCAwLjAwMDA4MjI1NDQsCisgICAgMC4wMDAwODI5Njk3LCAwLjAwMDA4MzgwNDEsIDAuMDAwMDg0NTE5NCwgMC4wMDAwODU0NzMxLAorICAgIDAuMDAwMDg2NTQ1OSwgMC4wMDAwODc2MTg4LCAwLjAwMDA4ODkzMDEsIDAuMDAwMDkwNDc5OSwKKyAgICAwLjAwMDA5MjM4NzIsIDAuMDAwMDk1MDA5OCwgMC4wMDAwOTg4MjQ1LCAwLjAwMDEwMzIzNTIsCisgICAgMC4wMDAxMDg4MzgxLCAwLjAwMDExNDc5ODUsIDAuMDAwMTIyNTQ3MSwgMC4wMDAxMzE5NjQ3LAorICAgIDAuMDAwMTQzMTcwNCwgMC4wMDAxNTY4Nzk0LCAwLjAwMDE3NDQwMzIsIDAuMDAwMTk1MjY0OCwKKyAgICAwLjAwMDIyMDY1NjQsIDAuMDAwMjUzNTU4MiwgMC4wMDAyOTY1OTI3LCAwLjAwMDM0NjQyMjIsCisgICAgMC4wMDA0MTA5MTQ0LCAwLjAwMDQ4OTExNTcsIDAuMDAwNTkwOTIwNCwgMC4wMDA3MjYxMDM4LAorICAgIDAuMDAwODg2Nzk3OSwgMC4wMDEwNzIxNjg0LCAwLjAwMTI2OTY5ODEsIDAuMDAxNTA3OTk3NSwKKyAgICAwLjAwMTc0NjE3NzcsIDAuMDAxOTk3OTQ3NywgMC4wMDIyMDUyNTI2LCAwLjAwMjM2Nzk3MzMsCisgICAgMC4wMDI1MTczNDI2LCAwLjAwMjY1NTYyNTMsIDAuMDAyNzkyNzE2MCwgMC4wMDI5MjY0Njg4LAorICAgIDAuMDAzMDQ0NzI0NSwgMC4wMDMxODA3NDIzLCAwLjAwMzMwNjAzMTIsIDAuMDAzNDMxMzIwMiwKKyAgICAwLjAwMzU0NTQwMzUsIDAuMDAzNjU5ODQ0NCwgMC4wMDM3Njg2ODI1LCAwLjAwMzg3MzEwOTgsCisgICAgMC4wMDM5NzY5NDExLCAwLjAwNDA3MDI4MjAsIDAuMDA0MTY2MTI2MywgMC4wMDQyNTYyNDg1LAorICAgIDAuMDA0MzQwMDUyNiwgMC4wMDQ0MjQ5Mjk2LCAwLjAwNDUwODI1NjksIDAuMDA0NTkwMDM0NSwKKyAgICAwLjAwNDY2OTMwODcsIDAuMDA0NzQzMDk5MiwgMC4wMDQ4MTcxMjgyLCAwLjAwNDg4ODE3NjksCisgICAgMC4wMDQ5NTg5ODcyLCAwLjAwNTAyNTI2NzYsIDAuMDA1MDg4MDkwOSwgMC4wMDUxNDk3MjIxLAorICAgIDAuMDA1MjA4MjUzOSwgMC4wMDUyNjcxNDMyLCAwLjAwNTMyNDYwMjEsIDAuMDA1MzgwMDM0NCwKKyAgICAwLjAwNTQzNDg3MDcsIDAuMDA1NDg2MTMwNywgMC4wMDU1MzY3OTQ3LCAwLjAwNTU4NjI2NjUsCisgICAgMC4wMDU2MzU1MDAwLCAwLjAwNTY4MDU2MTEsIDAuMDA1NzI1MjY0NSwgMC4wMDU3NzA1NjQxLAorICAgIDAuMDA1ODExMDk1MiwgMC4wMDU4NTM4OTE0LCAwLjAwNTg5NjY4NzUsIDAuMDA1OTM2NjIyNiwKKyAgICAwLjAwNTk3MjM4NTQsIDAuMDA2MDA5MTAxOSwgMC4wMDYwNDM3OTE4LCAwLjAwNjA3OTQzNTMsCisgICAgMC4wMDYxMTU5MTM0LCAwLjAwNjE0ODU3NjcsIDAuMDA2MTgyNDMyMiwgMC4wMDYyMTUzMzM5LAorICAgIDAuMDA2MjQ5Nzg1NCwgMC4wMDYyODIwOTExLCAwLjAwNjMxOTc2MTMsIDAuMDA2MzU1MDQ3MiwKKyAgICAwLjAwNjM5MjcxNzQsIDAuMDA2NDMzNjA2MSwgMC4wMDY0NzY5OTgzLCAwLjAwNjUxOTQzNjgsCisgICAgMC4wMDY1NjAzMjU2LCAwLjAwNjYwMDYxODQsIDAuMDA2NjQxMDMwMywgMC4wMDY2ODI2MzQ0LAorICAgIDAuMDA2NzIzNDAzOSwgMC4wMDY3NjU0ODQ4LCAwLjAwNjgwNjAxNjAsIDAuMDA2ODQ2NjY2MywKKyAgICAwLjAwNjg4NjYwMTQsIDAuMDA2OTIzMTk4NywgMC4wMDY5NjA5ODgwLCAwLjAwNjk5ODMwMDYsCisgICAgMC4wMDcwMzY2ODU5LCAwLjAwNzA3NTA3MTMsIDAuMDA3MTEyMjY0NiwgMC4wMDcxNTM1MTEwLAorICAgIDAuMDA3MTk3MzgwMSwgMC4wMDcyNDEwMTA3LCAwLjAwNzI4NDY0MTMsIDAuMDA3MzM0MzUxNSwKKyAgICAwLjAwNzM4MzIyNzMsIDAuMDA3NDM2MDM3MSwgMC4wMDc0ODc4OTMxLCAwLjAwNzU0MjYxMDIsCisgICAgMC4wMDc2MDA3ODQzLCAwLjAwNzY1NjA5NzQsIDAuMDA3NzEzNDM3MSwgMC4wMDc3NjgzOTI2LAorICAgIDAuMDA3ODI2NTY2NywgMC4wMDc4ODU1NzUzLCAwLjAwNzk0ODg3NTQsIDAuMDA4MDE3MDYzMSwKKyAgICAwLjAwODA4Mjc0NzUsIDAuMDA4MTUyODQyNSwgMC4wMDgyMjEyNjg3LCAwLjAwODI4Nzc4NzQsCisgICAgMC4wMDgzNTEwODc2LCAwLjAwODQxMjk1NzIsIDAuMDA4NDc3NTY4NiwgMC4wMDg1NDU1MTc5LAorICAgIDAuMDA4NjExMDgzMCwgMC4wMDg2NzgxOTc5LCAwLjAwODc1MDMxOTUsIDAuMDA4ODI0MjI5MiwKKyAgICAwLjAwODkwMDI4NDgsIDAuMDA4OTczNDc5MywgMC4wMDkwNDIzODIyLCAwLjAwOTExMzMxMTgsCisgICAgMC4wMDkxODE2MTg3LCAwLjAwOTI0NzMwMzAsIDAuMDA5MzE2NDQ0NCwgMC4wMDkzOTExODg2LAorICAgIDAuMDA5NDY3ODQwMiwgMC4wMDk1NDI3MDM2LCAwLjAwOTYxNzU2NzEsIDAuMDA5NjkzMTQ1OCwKKyAgICAwLjAwOTc2NjY5NzksIDAuMDA5ODM5NzczMiwgMC4wMDk5MTY2NjMyLCAwLjAwOTk5NDYyNjAsCisgICAgMC4wMTAwNzQ5NzMxLCAwLjAxMDE2MTI4MDYsIDAuMDEwMjUyODMzNCwgMC4wMTAzNDkzOTI5LAorICAgIDAuMDEwNDQzNDQ5MCwgMC4wMTA1NDQ4OTYxLCAwLjAxMDY1ODM4MzQsIDAuMDEwNzczNzc4MCwKKyAgICAwLjAxMDg5ODExMzMsIDAuMDExMDE0MjIzMSwgMC4wMTExMzE4ODI3LCAwLjAxMTI0NzI3NzMsCisgICAgMC4wMTEzNTc2NjUxLCAwLjAxMTQ3ODY2MjUsIDAuMDExNjAyODc4NiwgMC4wMTE3MzMxNzQzLAorICAgIDAuMDExODY3NjQyNCwgMC4wMTIwMTIyNDMzLCAwLjAxMjE1ODAzNjIsIDAuMDEyMzAxMDg3NCwKKyAgICAwLjAxMjQ2MzMzMTIsIDAuMDEyNjQwMjM3OCwgMC4wMTI4MjMyMjQxLCAwLjAxMzAxNDA3ODEsCisgICAgMC4wMTMyMTA4OTI3LCAwLjAxMzQyODkyNjUsIDAuMDEzNjYyNTc2NywgMC4wMTM4OTEyMjAxLAorICAgIDAuMDE0MTM2NDMzNiwgMC4wMTQ0MDA2MDE0LCAwLjAxNDY2MTU1MDUsIDAuMDE0OTMzNTg2MSwKKyAgICAwLjAxNTIxMzQ4OTUsIDAuMDE1NTA1MDc1NSwgMC4wMTU4Mzc2Njk0LCAwLjAxNjIwNjc0MTMsCisgICAgMC4wMTY1OTczOTAyLCAwLjAxNjk5MjY4ODIsIDAuMDE3NDMxOTc0NCwgMC4wMTc5MjcxNjk4LAorICAgIDAuMDE4NDQ0ODk1NywgMC4wMTkwNzQ0NDAwLCAwLjAxOTcyNDg0NTksIDAuMDIwNDIwMzEyOSwKKyAgICAwLjAyMTI0NjA3NTYsIDAuMDIyMTUyMzA0NiwgMC4wMjMxNTYyODUzLCAwLjAyNDMwMzE5NzksCisgICAgMC4wMjU2Mzk3NzI0LCAwLjAyNzE5MTg3NzQsIDAuMDI4OTYwMjI4MCwgMC4wMzEwMDcyODk5LAorICAgIDAuMDMzMzcwMjU2NCwgMC4wMzYzODA1Mjk0LCAwLjA0MDE0MTM0NDEsIDAuMDQ0Mzk5ODU3NSwKKyAgICAwLjA0OTgxNzY4MTMsIDAuMDU2MjU4MDgyNCwgMC4wNjQwMDY2ODYyLCAwLjA3MzI3NzU5MjcsCisgICAgMC4wODM2NjA0ODM0LCAwLjA5NjI5NTk1MjgsIDAuMTEyMjQ5NjEyOCwgMC4xMzM1ODU0NTMwLAorICAgIDAuMTYwODk4MDg5NCwgMC4xOTkwMTAyNTMwLCAwLjI2MTY0OTAxMjYsIDAuMzkyNjAzMDM5NworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHdtYXZvaWNlX2dhaW5fdW5pdmVyc2FsWzY0XSA9IHsKKyAgICAwLjAwMDAwMDAwMDAsIDAuMDAwMDAwMDAwMCwgMC4wMDAwMDE1NDk3LCAwLjAwMDAwMTU0OTcsCisgICAgMC4wMDAwMDk1MzY3LCAwLjAwMDAxNjQ1MDksIDAuMDAwMDM3OTA4NiwgMC4wMDAwNDk0NzE5LAorICAgIDAuMDAwMDc5OTg5NCwgMC4wMDAxMDU4NTc4LCAwLjAwMDEzNDk0NDksIDAuMDAwMTYyNzIwNywKKyAgICAwLjAwMDE5NzI5MTQsIDAuMDAwMjMyNTc3MywgMC4wMDAyNjcxNDgwLCAwLjAwMDMxMDY1OTQsCisgICAgMC4wMDAzNTg5MzkyLCAwLjAwMDQxMjcwMjYsIDAuMDAwNDU4MjQwNSwgMC4wMDA1MDcxMTYzLAorICAgIDAuMDAwNTc1OTAwMSwgMC4wMDA2NTg4Njk3LCAwLjAwMDc1NTQyOTMsIDAuMDAwODYwMjE0MiwKKyAgICAwLjAwMDk3NzI3NzgsIDAuMDAxMTA2ODU4MywgMC4wMDEyNjAzOTk4LCAwLjAwMTM4ODkwNzQsCisgICAgMC4wMDE1NDM3NjAzLCAwLjAwMTY5MjQxNDMsIDAuMDAxODk4MDUwMywgMC4wMDIxMjY0NTUzLAorICAgIDAuMDAyMzYzMjA1MCwgMC4wMDI1NjkzMTc4LCAwLjAwMjg1MjIwMTUsIDAuMDAzMTg5NjgzMCwKKyAgICAwLjAwMzQ2NTQxNDAsIDAuMDAzNzg4NTkwNCwgMC4wMDQxNjgzOTEyLCAwLjAwNDYwODE1NDMsCisgICAgMC4wMDUwNTc2OTI1LCAwLjAwNTU2MzI1OTEsIDAuMDA2MTgxODM2MSwgMC4wMDY4MTUxOTUxLAorICAgIDAuMDA3Mzk1Mzg2NywgMC4wMDgxODE4MTA0LCAwLjAwOTExODY3NjIsIDAuMDEwMjc4OTQwMiwKKyAgICAwLjAxMTk5MTk3NzcsIDAuMDEzNDE1NTc1MCwgMC4wMTU0ODI5MDI1LCAwLjAxNzM3OTg4MDAsCisgICAgMC4wMTk5NzExMzIzLCAwLjAyMjk0NzMxMTQsIDAuMDI2ODE4NTEzOSwgMC4wMzE5NDc0OTM2LAorICAgIDAuMDM5MzA2ODc5MCwgMC4wNDYwMTE0NDc5LCAwLjA1MjM0Njk0NDgsIDAuMDYzNzkwNjc5MCwKKyAgICAwLjA4NDU0NzE2MjEsIDAuMTEwNTQ1ODczNiwgMC4xNDk5MzAwMDAzLCAwLjIyMTkxNjkxNDAKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCB3bWF2b2ljZV9nYWluX2NvZGVib29rX2FjYlsxMjhdID0geworICAgIDAuMDUsIDAuMTQsIDAuMTYsIDAuMDUsIDAuMTcsIDAuMjUsIDAuMDcsIDAuMjEsCisgICAgMC4xMiwgMC4yMiwgMC4yMywgMC4xMywgMC4yNCwgMC4zMiwgMC4xNCwgMC4yOSwKKyAgICAwLjMxLCAwLjQxLCAwLjQzLCAwLjMyLCAwLjQzLCAwLjUxLCAwLjM0LCAwLjQ4LAorICAgIDAuMzgsIDAuNDcsIDAuNDksIDAuMzgsIDAuNDksIDAuNTcsIDAuNDAsIDAuNTQsCisgICAgMC40OSwgMC41OSwgMC42MSwgMC41MCwgMC42MSwgMC42OSwgMC41MiwgMC42NiwKKyAgICAwLjU2LCAwLjY1LCAwLjY3LCAwLjU2LCAwLjY3LCAwLjc1LCAwLjU4LCAwLjcyLAorICAgIDAuNjUsIDAuNzQsIDAuNzYsIDAuNjUsIDAuNzYsIDAuODQsIDAuNjcsIDAuODEsCisgICAgMC43MSwgMC44MCwgMC44MiwgMC43MSwgMC44MiwgMC45MCwgMC43MywgMC44NywKKyAgICAwLjgxLCAwLjkwLCAwLjkyLCAwLjgxLCAwLjkzLCAxLjAxLCAwLjgzLCAwLjk3LAorICAgIDAuODcsIDAuOTYsIDAuOTgsIDAuODcsIDAuOTgsIDEuMDYsIDAuODksIDEuMDMsCisgICAgMC45MiwgMS4wMiwgMS4wNCwgMC45MywgMS4wNCwgMS4xMiwgMC45NSwgMS4wOSwKKyAgICAwLjkzLCAxLjAyLCAxLjA0LCAwLjkzLCAxLjA0LCAxLjEyLCAwLjk1LCAxLjA5LAorICAgIDAuOTQsIDEuMDQsIDEuMDUsIDAuMTAsIDEuMDYsIDEuMTQsIDAuOTYsIDEuMTEsCisgICAgMC45OCwgMS4wOCwgMS4xMCwgMC45OSwgMS4xMCwgMS4xOCwgMS4wMSwgMS4xNSwKKyAgICAxLjA2LCAxLjE1LCAxLjE3LCAxLjA2LCAxLjE3LCAxLjI1LCAxLjA4LCAxLjIyLAorICAgIDEuMTYsIDEuMjUsIDEuMjcsIDEuMTYsIDEuMjgsIDEuMzYsIDEuMTgsIDEuMzIKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCB3bWF2b2ljZV9nYWluX2NvZGVib29rX2ZjYlsxMjhdID0geworICAgIC0wLjg0Mzk3MDA3MDMgLyogbG9nKDAuNDMwKSAqLywgLTAuNjE0MzM2MDAwMSAvKiBsb2coMC41NDEpICovLAorICAgIC0wLjE1MzE1MTE3OTUgLyogbG9nKDAuODU4KSAqLywgLTAuMDk5ODIwMzM1MyAvKiBsb2coMC45MDUpICovLAorICAgICAwLjMyMTM1ODU5ODggLyogbG9nKDEuMzc5KSAqLywgIDAuMzc3NzUxMjY5NSAvKiBsb2coMS40NTkpICovLAorICAgICAwLjcxNTg4NjY2NzUgLyogbG9nKDIuMDQ2KSAqLywgIDEuMjcwMDQxNDA0MyAvKiBsb2coMy41NjEpICovLAorICAgIC0xLjY4NzM5OTQ1MzkgLyogbG9nKDAuMTg1KSAqLywgLTEuMjE3Mzk1ODI0NyAvKiBsb2coMC4yOTYpICovLAorICAgIC0wLjQ4OTM5MDM0MzAgLyogbG9nKDAuNjEzKSAqLywgLTAuNDE1NTE1NDQ0MCAvKiBsb2coMC42NjApICovLAorICAgICAwLjEyNTc1MTIwNTMgLyogbG9nKDEuMTM0KSAqLywgIDAuMTk0NzQ0MDc2OCAvKiBsb2coMS4yMTUpICovLAorICAgICAwLjU4ODM0MjA2NjIgLyogbG9nKDEuODAxKSAqLywgIDEuMTk4NzU5MjM3MyAvKiBsb2coMy4zMTYpICovLAorICAgIC0xLjM1ODY3OTE5NDEgLyogbG9nKDAuMjU3KSAqLywgLTAuOTk5NjcyMzQwOCAvKiBsb2coMC4zNjgpICovLAorICAgIC0wLjM3Njg3NzY1MTMgLyogbG9nKDAuNjg2KSAqLywgLTAuMzExOTc0NzY1MCAvKiBsb2coMC43MzIpICovLAorICAgICAwLjE4ODEzNzk0MjEgLyogbG9nKDEuMjA3KSAqLywgIDAuMjUyMzEzOTI4NiAvKiBsb2coMS4yODcpICovLAorICAgICAwLjYyODA3NTE4MzggLyogbG9nKDEuODc0KSAqLywgIDEuMjIwMjM5Nzc2OCAvKiBsb2coMy4zODgpICovLAorICAgIC0wLjczODE0NDU0NjUgLyogbG9nKDAuNDc4KSAqLywgLTAuNTMxMDI4MzMxMSAvKiBsb2coMC41ODgpICovLAorICAgIC0wLjA5ODcxNTk3MjkgLyogbG9nKDAuOTA2KSAqLywgLTAuMDQ5MTkwMjQ0MiAvKiBsb2coMC45NTIpICovLAorICAgICAwLjM1NTU3NDMzODUgLyogbG9nKDEuNDI3KSAqLywgIDAuNDEwMTIwOTE5NiAvKiBsb2coMS41MDcpICovLAorICAgICAwLjczOTA3NjExMjQgLyogbG9nKDIuMDk0KSAqLywgIDEuMjgzMTUzNjAyMiAvKiBsb2coMy42MDgpICovLAorICAgIC0wLjI0OTc0NDIzMzEgLyogbG9nKDAuNzc5KSAqLywgLTAuMTE2NTMzODE2MyAvKiBsb2coMC44OTApICovLAorICAgICAwLjE4ODEzNzk0MjEgLyogbG9nKDEuMjA3KSAqLywgIDAuMjI1NTQwNjc1OSAvKiBsb2coMS4yNTMpICovLAorICAgICAwLjU0Njk2NDY3MDQgLyogbG9nKDEuNzI4KSAqLywgIDAuNTkyMjIxMjYyMCAvKiBsb2coMS44MDgpICovLAorICAgICAwLjg3MzM4MzIzMDkgLyogbG9nKDIuMzk1KSAqLywgIDEuMzYzMjgxNTg2OCAvKiBsb2coMy45MDkpICovLAorICAgIC0xLjM5MDMwMjM4MjUgLyogbG9nKDAuMjQ5KSAqLywgLTEuMDIxNjUxMjQ3NSAvKiBsb2coMC4zNjApICovLAorICAgIC0wLjM5MDA4NDAwNjEgLyogbG9nKDAuNjc3KSAqLywgLTAuMzIyOTYzODg2NiAvKiBsb2coMC43MjQpICovLAorICAgICAwLjE4MDY1MzQ5OTcgLyogbG9nKDEuMTk4KSAqLywgIDAuMjQ2MDc4NTIyNiAvKiBsb2coMS4yNzkpICovLAorICAgICAwLjYyMzI2MTA1MzEgLyogbG9nKDEuODY1KSAqLywgIDEuMjE3ODc1NzA5NSAvKiBsb2coMy4zODApICovLAorICAgIC0wLjYwMzMwNjQ3NjYgLyogbG9nKDAuNTQ3KSAqLywgLTAuNDE4NTUwMzQ3NyAvKiBsb2coMC42NTgpICovLAorICAgIC0wLjAyNTMxNzgwODAgLyogbG9nKDAuOTc1KSAqLywgIDAuMDIxNzYxNDkxOCAvKiBsb2coMS4wMjIpICovLAorICAgICAwLjQwMjc5NDg3OTYgLyogbG9nKDEuNDk2KSAqLywgIDAuNDU1NTI0MzA4MCAvKiBsb2coMS41NzcpICovLAorICAgICAwLjc3MTQ5NjE0NzAgLyogbG9nKDIuMTYzKSAqLywgIDEuMzAyMzY5MTI2MiAvKiBsb2coMy42NzgpICovLAorICAgIC0xLjEwNTYzNjkwMzYgLyogbG9nKDAuMzMxKSAqLywgLTAuODE2NDQ1Mzk2OSAvKiBsb2coMC40NDIpICovLAorICAgIC0wLjI3NTc1MzUwMTYgLyogbG9nKDAuNzU5KSAqLywgLTAuMjE1NjcxNTM2NSAvKiBsb2coMC44MDYpICovLAorICAgICAwLjI0Njg2MDA3NzkgLyogbG9nKDEuMjgwKSAqLywgIDAuMzA4MjE5NzIzNyAvKiBsb2coMS4zNjEpICovLAorICAgICAwLjY2NjI4OTcyNjQgLyogbG9nKDEuOTQ3KSAqLywgIDEuMjQxODQ2NDU2OCAvKiBsb2coMy40NjIpICovLAorICAgIC0wLjUzOTU2ODA5MjYgLyogbG9nKDAuNTgzKSAqLywgLTAuMzY1MjgzMzE4NSAvKiBsb2coMC42OTQpICovLAorICAgICAwLjAxMDkzOTk0MDAgLyogbG9nKDEuMDExKSAqLywgIDAuMDU1NDM0NzA2OSAvKiBsb2coMS4wNTcpICovLAorICAgICAwLjQyNjU3NDA3MTMgLyogbG9nKDEuNTMyKSAqLywgIDAuNDc3NDc1NjQ0MSAvKiBsb2coMS42MTIpICovLAorICAgICAwLjc4ODAwMjcxMTYgLyogbG9nKDIuMTk5KSAqLywgIDEuMzExODQwMTc1MiAvKiBsb2coMy43MTMpICovLAorICAgIC0wLjk1NzExMjcyNjQgLyogbG9nKDAuMzg0KSAqLywgLTAuNzAzMTk3NTE2NCAvKiBsb2coMC40OTUpICovLAorICAgIC0wLjIwODI1NDkzODggLyogbG9nKDAuODEyKSAqLywgLTAuMTUxOTg2MzU3MCAvKiBsb2coMC44NTkpICovLAorICAgICAwLjI4NzQzMjA0MTIgLyogbG9nKDEuMzMzKSAqLywgIDAuMzQ2NDIyNTY3NSAvKiBsb2coMS40MTQpICovLAorICAgICAwLjY5MzE0NzE4MDYgLyogbG9nKDIuMDAwKSAqLywgIDEuMjU3MDM5NTI1MyAvKiBsb2coMy41MTUpICovLAorICAgIC0wLjI0MjA3MTU2MTIgLyogbG9nKDAuNzg1KSAqLywgLTAuMTA5ODE0ODY2MCAvKiBsb2coMC44OTYpICovLAorICAgICAwLjE5MzA5NjYzMDAgLyogbG9nKDEuMjEzKSAqLywgIDAuMjMxMTExNzIxMCAvKiBsb2coMS4yNjApICovLAorICAgICAwLjU1MDQzMDg3ODQgLyogbG9nKDEuNzM0KSAqLywgIDAuNTk2MDg1NDY3NyAvKiBsb2coMS44MTUpICovLAorICAgICAwLjg3NTg4NTMxNzIgLyogbG9nKDIuNDAxKSAqLywgIDEuMzY1MDcwNzI0NyAvKiBsb2coMy45MTYpICovLAorICAgICAwLjY1NjQ4MzE5NjIgLyogbG9nKDEuOTI4KSAqLywgIDAuNzEyNDU5NDkxNiAvKiBsb2coMi4wMzkpICovLAorICAgICAwLjg1Njk2NTI2NTggLyogbG9nKDIuMzU2KSAqLywgIDAuODc2NzE3OTU2OCAvKiBsb2coMi40MDMpICovLAorICAgICAxLjA1Njc0ODA4NDYgLyogbG9nKDIuODc3KSAqLywgIDEuMDg0MTc1MjQwOSAvKiBsb2coMi45NTcpICovLAorICAgICAxLjI2NTI1NjAzMjcgLyogbG9nKDMuNTQ0KSAqLywgIDEuNjIxMTY4ODM1MyAvKiBsb2coNS4wNTkpICovLAorICAgIC0xLjU0MTc3OTI2NDAgLyogbG9nKDAuMjE0KSAqLywgLTEuMTIzOTMwMDk2NyAvKiBsb2coMC4zMjUpICovLAorICAgIC0wLjQ0MzE2Njk3NTMgLyogbG9nKDAuNjQyKSAqLywgLTUuMjk4MzE3MzY2NSAvKiBsb2coMC4wMDUpICovLAorICAgICAwLjE1MTAwMjg3MzUgLyogbG9nKDEuMTYzKSAqLywgIDAuMjE4MzMxOTk0MyAvKiBsb2coMS4yNDQpICovLAorICAgICAwLjYwNDMxNTk2NjkgLyogbG9nKDEuODMwKSAqLywgIDEuMjA3NDY2NjkzNiAvKiBsb2coMy4zNDUpICovLAorICAgIC0wLjUxMjQ5MzY4MDkgLyogbG9nKDAuNTk5KSAqLywgLTAuMzQyNDkwMzA4OSAvKiBsb2coMC43MTApICovLAorICAgICAwLjAyNjY0MTkzMDkgLyogbG9nKDEuMDI3KSAqLywgIDAuMDcxMzg5OTk2MSAvKiBsb2coMS4wNzQpICovLAorICAgICAwLjQzNjk2Mzc3NTIgLyogbG9nKDEuNTQ4KSAqLywgIDAuNDg3OTY2MzI5NiAvKiBsb2coMS42MjkpICovLAorICAgICAwLjc5NTI1MjQwMzUgLyogbG9nKDIuMjE1KSAqLywgIDEuMzE2NDA4MjMzNyAvKiBsb2coMy43MzApICovLAorICAgIC0wLjg4NjczMTkyOTYgLyogbG9nKDAuNDEyKSAqLywgLTAuNjQ4MTczODE0OSAvKiBsb2coMC41MjMpICovLAorICAgIC0wLjE3NDM1MzM4NzEgLyogbG9nKDAuODQwKSAqLywgLTAuMTE5OTEwMjk2NyAvKiBsb2coMC44ODcpICovLAorICAgICAwLjMwODk1NDIwNzcgLyogbG9nKDEuMzYyKSAqLywgIDAuMzY2MDMxMDM4OSAvKiBsb2coMS40NDIpICovLAorICAgICAwLjcwNzU0MzA2MDggLyogbG9nKDIuMDI5KSAqLywgIDEuMjY0OTczODI1OSAvKiBsb2coMy41NDMpICovLAorICAgIC0wLjA5NDMxMDY3OTUgLyogbG9nKDAuOTEwKSAqLywgIDAuMDIwNzgyNTM5MiAvKiBsb2coMS4wMjEpICovLAorICAgICAwLjI5MTE3NTk2MTcgLyogbG9nKDEuMzM4KSAqLywgIDAuMzI0OTc3ODU3MiAvKiBsb2coMS4zODQpICovLAorICAgICAwLjYyMDAzODcwODcgLyogbG9nKDEuODU5KSAqLywgIDAuNjYyMTcyMzc2MyAvKiBsb2coMS45MzkpICovLAorICAgICAwLjkyNjYzNzAyMzkgLyogbG9nKDIuNTI2KSAqLywgIDEuMzk2MjQ0NjkyMCAvKiBsb2coNC4wNDApICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgd21hdm9pY2VfaXBvbDFfY29lZmZzWzE3KjldID0geworICAgICAwLAorICAgICAwLjYzMDgxNzExNTEsICAwLjc2MTMwNTAzNDAsICAwLjg2MzI1NzcwNjEsICAwLjkyODAxNDM5NzYsCisgICAgIDAuOTQ5OTk4NTU3NSwgIDAuOTI3MzA0NzQ0NywgIDAuODYxODk5OTEyMywgIDAuNzU5NDE1MzI4NCwKKyAgICAtMC4xNzkxMDU4MTc5LCAtMC4xMzUxMzQxNDUyLCAtMC4wNTg5OTU5ODc4LCAgMC4wNDcyODgyMjc0LAorICAgICAwLjE3ODQzMzk5OTAsICAwLjMyNjIyMzc2MDUsICAwLjQ4MDE4NTU5NzksICAwLjYyODU1NDU4MjQsCisgICAgIDAsCisgICAgLTAuMTkyMTM0MjQ1OSwgLTAuMTc4NjUzMjY5NiwgLTAuMTM0MTY4MTYyNSwgLTAuMDU3NTIyOTE4NiwKKyAgICAgMC4wNDkyMDkxMjg2LCAgMC4xODA2OTI5NTU1LCAgMC4zMjg2Njg3NzI5LCAgMC40ODI2MzU3MDY0LAorICAgICAwLjA4MDc0NjQxMTgsICAwLjA1MDYzMzczOTIsICAwLjAwODAxMTU0NDYsIC0wLjA0Mjg1MjMzMDUsCisgICAgLTAuMDk1ODU3MjAyNiwgLTAuMTQzNjE0ODQzMSwgLTAuMTc4MjEyODUwOSwgLTAuMTkyMTE2NDY4OCwKKyAgICAgMCwKKyAgICAgMC4wOTYwNjUzNjQ0LCAgMC4wODAzNzcxNzYwLCAgMC4wNTAwNDE2MDgxLCAgMC4wMDcyNDg1NDY1LAorICAgIC0wLjA0MzcwMTg5NDEsIC0wLjA5NjY4MzQ3OTQsIC0wLjE0NDI5MzA4NDMsIC0wLjE3ODYxNzAxNTEsCisgICAgLTAuMDM5MTkzMjAxNCwgLTAuMDE4OTYyMjUwNiwgIDAuMDA3MDIzMDE4MywgIDAuMDM1NjU4OTI5MCwKKyAgICAgMC4wNjMwMTQyNjEwLCAgMC4wODQ3OTc5MjU4LCAgMC4wOTY5MzY4MjkwLCAgMC4wOTYxOTQyMjIxLAorICAgICAwLAorICAgIC0wLjA1MTU2ODA2ODEsIC0wLjAzODkyNjcwMTUsIC0wLjAxODU4NDg5OTEsICAwLjAwNzQ2OTkxOTAsCisgICAgIDAuMDM2MTE3OTQwNywgIDAuMDYzNDE4MTM0NiwgIDAuMDg1MDc4MTM0NywgIDAuMDk3MDMzMzU4NywKKyAgICAgMC4wMTc4ODExODI1LCAgMC4wMDQ4NzA4NTcxLCAtMC4wMTA4MDQxNTI2LCAtMC4wMjcxMTY3ODI1LAorICAgIC0wLjA0MTY1MzQ5ODYsIC0wLjA1MTkzMzg2MTgsIC0wLjA1NTc4MjM3MzYsIC0wLjA1MTcwMjA3NDMsCisgICAgIDAsCisgICAgIDAuMDI2NzA5MTEyOCwgIDAuMDE3NzAyMjgxMCwgIDAuMDA0NjM2MzUyNCwgLTAuMDExMDY2MjA1MywKKyAgICAtMC4wMjczNzAwNjEzLCAtMC4wNDE4NTc4OTc4LCAtMC4wNTIwNTExNDUxLCAtMC4wNTU3ODIzMDI4LAorICAgIC0wLjAwNjkyNzA0MzcsICAwLjAwMDgyMTczODUsICAwLjAwOTcyOTM1MzIsICAwLjAxODU3NDk1MjYsCisgICAgIDAuMDI1OTU0MjY4NCwgIDAuMDMwNDc3NzMzOCwgIDAuMDMwOTk1MzQ4MCwgIDAuMDI2ODE1NDQxOSwKKyAgICAgMCwKKyAgICAtMC4wMTI1NTM5MTk2LCAtMC4wMDY4MTczNDM2LCAgMC4wMDA5NTgwMTYxLCAgMC4wMDk4NzQ5NjQ2LAorICAgICAwLjAxODcwODQwMzcsICAwLjAyNjA1MjYyOTEsICAwLjAzMDUyMDEwNzEsICAwLjAzMDk2NjUxODAsCisgICAgIDAuMDAxOTE0OTU3MSwgLTAuMDAyMjUwMzQwOCwgLTAuMDA2ODU5MjQ2NiwgLTAuMDExMjQ2NTkwNCwKKyAgICAtMC4wMTQ2NTk1ODY4LCAtMC4wMTYzNjg1OTM2LCAtMC4wMTU3OTM0MTYyLCAtMC4wMTI2MjU4ODg1LAorICAgICAwLAorICAgICAwLjAwNTA5NzYwNzYsICAwLjAwMTg1NDY1ODEsIC0wLjAwMjMyMjE3NDEsIC0wLjAwNjkzMzEzMDgsCisgICAgLTAuMDExMzEwOTA4NSwgLTAuMDE0NzAyMTU3NiwgLTAuMDE2Mzc4NjE0NiwgLTAuMDE1NzYzNTA5NiwKKyAgICAtMC4wMDAxMTYyNzMzLCAgMC4wMDE5MzEzNTExLCAgMC4wMDQwODIzODUwLCAgMC4wMDYwMTkyNDU0LAorICAgICAwLjAwNzM4NzY1MzUsICAwLjAwNzg0ODYzMjEsICAwLjAwNzE0MDMxODQsICAwLjAwNTE0MDAzMTIsCisgICAgIDAsCisgICAgLTAuMDAxNzkyMDYwNywgLTAuMDAwMDg1NzE1NywgIDAuMDAxOTY1NzE4MywgIDAuMDA0MTE1OTgwNiwKKyAgICAgMC4wMDYwNDY1Njk0LCAgMC4wMDc0MDMwMDY4LCAgMC4wMDc4NDcwNDYwLCAgMC4wMDcxMTg1Nzg1LAorICAgIC0wLjAwMDQxMDAxNzEsIC0wLjAwMTUzNjQ3MDgsIC0wLjAwMjU0OTAwNzEsIC0wLjAwMzMxODg2MTYsCisgICAgLTAuMDAzNzE5NjMwNywgLTAuMDAzNjQxNzI4MywgLTAuMDAzMDExOTYyOSwgLTAuMDAxODE1NTc4NCwKKyAgICAgMCwKKyAgICAgMC4wMDA2OTA3NTMxLCAtMC4wMDA0MjgyODY4LCAtMC4wMDE1NTM5MDYxLCAtMC4wMDI1NjM1ODEzLAorICAgIC0wLjAwMzMyODUwMjYsIC0wLjAwMzcyMjQwNjksIC0wLjAwMzYzNjEyNDUsIC0wLjAwMjk5NzIyNDcsCisgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKKy8qKgorICogSGFtbWluZy13aW5kb3cgc2luYyBmdW5jdGlvbiAobnVtID0gMzIsIHggPSBbIDAsIDMxIF0pOgorICogKDAuNTQgKyAwLjQ2ICogY29zKDIgKiBNX1BJICogeCAvIChudW0gLSAxKSkpICoKKyAqICAgICBzaW4oeCAqIE1fUEkgLyA0KSAvICh4ICogTV9QSSAvIDQpCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCB3bWF2b2ljZV9pcG9sMl9jb2VmZnNbMzJdID0geworICAgIDEsICAwLjg1NjM0NTk1MTUsICAwLjU4ODg2MzQ5MTgsICAwLjI2NDgzNTg2NDAsCisgICAgMCwgLTAuMTM2MDQ5MDMxOCwgLTAuMTQzNDU4OTQ3MSwgLTAuMDc1ODUwNTMxMCwKKyAgICAwLCAgMC4wNDEwNDAyNjM2LCAgMC4wNDEyNDg1NzgxLCAgMC4wMjAwMDY0NTg3LAorICAgIDAsIC0wLjAwODEzOTEzNTgsIC0wLjAwNjgyMjMyNTMsIC0wLjAwMjkzMTM1NDYsCisgICAgMCwgIDAuMDAyNTg2NDkxOSwgIDAuMDA1MzA2MjU1NSwgIDAuMDA1NTY4ODgwMSwKKyAgICAwLCAtMC4wMTA0Nzk1OTQxLCAtMC4wMTg3NDkzNTc3LCAtMC4wMTYwNTkyMzk5LAorICAgIDAsICAwLjAyMTIzODE2NjQsICAwLjAzMzEwNTkxMzEsICAwLjAyNTE5NDIzNjYsCisgICAgMCwgLTAuMDI3Mzk2ODA3MCwgLTAuMDM5MjU3NTY2OSwgLTAuMDI3NjI0MDUzNAorfTsKKworLyoqCisgKiBMVVQgZm9yIDEuMDcxNTc1NjQxNjMyICogcG93KDEuMDMzMTY2MywgbiAtIDEyNykKKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IHdtYXZvaWNlX2VuZXJneV90YWJsZVsxMjhdID0geworICAgIDAuMDE2OTk4MjE3OCwgMC4wMTc1NjE5ODU4LCAwLjAxODE0NDQ1MTksIDAuMDE4NzQ2MjM2MiwKKyAgICAwLjAxOTM2Nzk3OTUsIDAuMDIwMDEwMzQzNywgMC4wMjA2NzQwMTI4LCAwLjAyMTM1OTY5MzMsCisgICAgMC4wMjIwNjgxMTUzLCAwLjAyMjgwMDAzMzAsIDAuMDIzNTU2MjI1OCwgMC4wMjQzMzc0OTg2LAorICAgIDAuMDI1MTQ0NjgzNCwgMC4wMjU5Nzg2Mzk1LCAwLjAyNjg0MDI1NDksIDAuMDI3NzMwNDQ2OCwKKyAgICAwLjAyODY1MDE2MzEsIDAuMDI5NjAwMzgzMCwgMC4wMzA1ODIxMTgyLCAwLjAzMTU5NjQxMzksCisgICAgMC4wMzI2NDQzNTAxLCAwLjAzMzcyNzA0MjQsIDAuMDM0ODQ1NjQzNiwgMC4wMzYwMDEzNDQ2LAorICAgIDAuMDM3MTk1Mzc2MCwgMC4wMzg0MjkwMDkwLCAwLjAzOTcwMzU1NzEsIDAuMDQxMDIwMzc3MiwKKyAgICAwLjA0MjM4MDg3MTMsIDAuMDQzNzg2NDg4MCwgMC4wNDUyMzg3MjM4LCAwLjA0NjczOTEyNDksCisgICAgMC4wNDgyODkyODg3LCAwLjA0OTg5MDg2NTcsIDAuMDUxNTQ1NTYxMiwgMC4wNTMyNTUxMzY3LAorICAgIDAuMDU1MDIxNDEyNSwgMC4wNTY4NDYyNjkyLCAwLjA1ODczMTY0OTYsIDAuMDYwNjc5NTYxMSwKKyAgICAwLjA2MjY5MjA3NzcsIDAuMDY0NzcxMzQxOSwgMC4wNjY5MTk1Njc3LCAwLjA2OTEzOTA0MjEsCisgICAgMC4wNzE0MzIxMjg0LCAwLjA3MzgwMTI2NzgsIDAuMDc2MjQ4OTgyNywgMC4wNzg3Nzc4Nzk0LAorICAgIDAuMDgxMzkwNjUwMiwgMC4wODQwOTAwNzY5LCAwLjA4Njg3OTAzMzYsIDAuMDg5NzYwNDg5NywKKyAgICAwLjA5MjczNzUxMzAsIDAuMDk1ODEzMjczMiwgMC4wOTg5OTEwNDUwLCAwLjEwMjI3NDIxMTcsCisgICAgMC4xMDU2NjYyNjg4LCAwLjEwOTE3MDgyODAsIDAuMTEyNzkxNjIwNCwgMC4xMTY1MzI1MDEyLAorICAgIDAuMTIwMzk3NDUzMSwgMC4xMjQzOTA1OTExLCAwLjEyODUxNjE2NjgsIDAuMTMyNzc4NTcyNSwKKyAgICAwLjEzNzE4MjM0NjUsIDAuMTQxNzMyMTc3MywgMC4xNDY0MzI5MDkzLCAwLjE1MTI4OTU0NzAsCisgICAgMC4xNTYzMDcyNjE2LCAwLjE2MTQ5MTM5NTEsIDAuMTY2ODQ3NDY3MSwgMC4xNzIzODExODAzLAorICAgIDAuMTc4MDk4NDI2MiwgMC4xODQwMDUyOTIxLCAwLjE5MDEwODA2NjgsIDAuMTk2NDEzMjQ4MCwKKyAgICAwLjIwMjkyNzU0ODcsIDAuMjA5NjU3OTA0NiwgMC4yMTY2MTE0ODE2LCAwLjIyMzc5NTY4MzAsCisgICAgMC4yMzEyMTgxNTc3LCAwLjIzODg4NjgwODUsIDAuMjQ2ODA5ODAwMSwgMC4yNTQ5OTU1Njc5LAorICAgIDAuMjYzNDUyODI3NCwgMC4yNzIxOTA1ODMwLCAwLjI4MTIxODEzNzUsIDAuMjkwNTQ1MTAyNiwKKyAgICAwLjMwMDE4MTQwODYsIDAuMzEwMTM3MzE1MywgMC4zMjA0MjM0MjI1LCAwLjMzMTA1MDY4MTksCisgICAgMC4zNDIwMzA0MDgxLCAwLjM1MzM3NDI5MTIsIDAuMzY1MDk0NDA5MCwgMC4zNzcyMDMyMzk3LAorICAgIDAuMzg5NzEzNjc1NSwgMC40MDI2MzkwMzYyLCAwLjQxNTk5MzA4MzIsIDAuNDI5NzkwMDM0NiwKKyAgICAwLjQ0NDA0NDU3OTksIDAuNDU4NzcxODk1NiwgMC40NzM5ODc2NjE5LCAwLjQ4OTcwODA3ODksCisgICAgMC41MDU5NDk4ODQwLCAwLjUyMjczMDM2OTYsIDAuNTQwMDY3NDAxOSwgMC41NTc5Nzk0MzkzLAorICAgIDAuNTc2NDg1NTUyOCwgMC41OTU2MDU0NDU2LCAwLjYxNTM1OTQ3NDUsIDAuNjM1NzY4NjcxNCwKKyAgICAwLjY1Njg1NDc2NTksIDAuNjc4NjQwMjA4MiwgMC43MDExNDgxOTI5LCAwLjcyNDQwMjY4NDIsCisgICAgMC43NDg0Mjg0NDEwLCAwLjc3MzI1MTA0MzIsIDAuNzk4ODk2OTE5MiwgMC44MjUzOTMzNzQxLAorICAgIDAuODUyNzY4NjE4NCwgMC44ODEwNTE3OTgyLCAwLjkxMDI3MzAyNjUsIDAuOTQwNDYzNDE0NywKKyAgICAwLjk3MTY1NTEwNjUsIDEuMDAzODgxMzExMywgMS4wMzcxNzYzNDAwLCAxLjA3MTU3NTY0MTYKK307CisKKy8qKgorICogTFVUIGZvciBmKHgseSkgPSBwb3coKHkgKyA2LjkpIC8gNjQsIDAuMDI1ICogKHggKyAxKSkuCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCB3bWF2b2ljZV9kZW5vaXNlX3Bvd2VyX3RhYmxlWzEyXVs2NF0gPSB7CisgICAgeyAwLjk0NTgzNzkzMzksIDAuOTQ5MDQzNjI4NywgMC45NTE4NzU3MjM2LCAwLjk1NDQxMzA3NTQsCisgICAgICAwLjk1NjcxMTg3MTcsIDAuOTU4ODEzNTc2MSwgMC45NjA3NDk2Njg4LCAwLjk2MjU0NDYxOTQsCisgICAgICAwLjk2NDIxNzgyODUsIDAuOTY1Nzg0OTM5NiwgMC45NjcyNTg3NTI2LCAwLjk2ODY0OTg3NDMsCisgICAgICAwLjk2OTk2NzE5MzcsIDAuOTcxMjE4MjM0MywgMC45NzI0MDk0MjExLCAwLjk3MzU0NjI4NDIsCisgICAgICAwLjk3NDYzMzYxODcsIDAuOTc1Njc1NjA5MCwgMC45NzY2NzU5MjkxLCAwLjk3NzYzNzgyMTgsCisgICAgICAwLjk3ODU2NDE2NDUsIDAuOTc5NDU3NTIxNywgMC45ODAzMjAxODkwLCAwLjk4MTE1NDIyOTYsCisgICAgICAwLjk4MTk2MTUwNDUsIDAuOTgyNzQzNjk4NSwgMC45ODM1MDIzNDEyLCAwLjk4NDIzODgyNjMsCisgICAgICAwLjk4NDk1NDQyNjUsIDAuOTg1NjUwMzA3OCwgMC45ODYzMjc1NDA2LCAwLjk4Njk4NzExMDEsCisgICAgICAwLjk4NzYyOTkyNTQsIDAuOTg4MjU2ODI2NywgMC45ODg4Njg1OTIyLCAwLjk4OTQ2NTk0NDUsCisgICAgICAwLjk5MDA0OTU1NTEsIDAuOTkwNjIwMDQ5NywgMC45OTExNzgwMTE5LCAwLjk5MTcyMzk4NzIsCisgICAgICAwLjk5MjI1ODQ4NTksIDAuOTkyNzgxOTg2NCwgMC45OTMyOTQ5Mzc3LCAwLjk5Mzc5Nzc2MTgsCisgICAgICAwLjk5NDI5MDg1NTUsIDAuOTk0Nzc0NTkyOSwgMC45OTUyNDkzMjY3LCAwLjk5NTcxNTM5MDEsCisgICAgICAwLjk5NjE3MzA5ODAsIDAuOTk2NjIyNzQ4MiwgMC45OTcwNjQ2MjMxLCAwLjk5NzQ5ODk5MDMsCisgICAgICAwLjk5NzkyNjEwMzcsIDAuOTk4MzQ2MjA0NiwgMC45OTg3NTk1MjIzLCAwLjk5OTE2NjI3NTIsCisgICAgICAwLjk5OTU2NjY3MDksIDAuOTk5OTYwOTA3NywgMS4wMDAzNDkxNzQ1LCAxLjAwMDczMTY1MTUsCisgICAgICAxLjAwMTEwODUxMTAsIDEuMDAxNDc5OTE3OCwgMS4wMDE4NDYwMjkyLCAxLjAwMjIwNjk5NjAgfSwKKyAgICB7IDAuODk0NjA5Mzk3MywgMC45MDA2ODM4MDkyLCAwLjkwNjA2NzM5MzEsIDAuOTEwOTA0MzE4NSwKKyAgICAgIDAuOTE1Mjk3NjA1NSwgMC45MTkzMjM0NzM3LCAwLjkyMzAzOTkyNjAsIDAuOTI2NDkyMTQ0MywKKyAgICAgIDAuOTI5NzE2MDIwNywgMC45MzI3NDA1NDk2LCAwLjkzNTU4OTQ5NDQsIDAuOTM4MjgyNTc4OSwKKyAgICAgIDAuOTQwODM2MzU2OCwgMC45NDMyNjQ4NTg3LCAwLjk0NTU4MDA4MjIsIDAuOTQ3NzkyMzY3NSwKKyAgICAgIDAuOTQ5OTEwNjkwNywgMC45NTE5NDI4OTQxLCAwLjk1Mzg5NTg3MDQsIDAuOTU1Nzc1NzEwNywKKyAgICAgIDAuOTU3NTg3ODI0MSwgMC45NTkzMzcwMzY4LCAwLjk2MTAyNzY3MzAsIDAuOTYyNjYzNjIyMiwKKyAgICAgIDAuOTY0MjQ4Mzk2NCwgMC45NjU3ODUxNzY5LCAwLjk2NzI3Njg1NTIsIDAuOTY4NzI2MDY3MiwKKyAgICAgIDAuOTcwMTM1MjIyNCwgMC45NzE1MDY1MjkzLCAwLjk3Mjg0MjAxNzMsIDAuOTc0MTQzNTU1NiwKKyAgICAgIDAuOTc1NDEyODY5NiwgMC45NzY2NTE1NTU1LCAwLjk3Nzg2MTA5MjcsIDAuOTc5MDQyODU1MywKKyAgICAgIDAuOTgwMTk4MTIxNiwgMC45ODEzMjgwODI5LCAwLjk4MjQzMzg1MTMsIDAuOTgzNTE2NDY2NywKKyAgICAgIDAuOTg0NTc2OTAyOCwgMC45ODU2MTYwNzI2LCAwLjk4NjYzNDgzMzQsIDAuOTg3NjMzOTkxMywKKyAgICAgIDAuOTg4NjE0MzA1MywgMC45ODk1NzY0OTA2LCAwLjk5MDUyMTIyMjMsIDAuOTkxNDQ5MTM4MSwKKyAgICAgIDAuOTkyMzYwODQxMSwgMC45OTMyNTY5MDIyLCAwLjk5NDEzNzg2MjcsIDAuOTk1MDA0MjM1NiwKKyAgICAgIDAuOTk1ODU2NTA4NCwgMC45OTY2OTUxNDQyLCAwLjk5NzUyMDU4MzQsIDAuOTk4MzMzMjQ1NCwKKyAgICAgIDAuOTk5MTMzNTI5NiwgMC45OTk5MjE4MTcwLCAxLjAwMDY5ODQ3MDgsIDEuMDAxNDYzODM4MywKKyAgICAgIDEuMDAyMjE4MjUwOSwgMS4wMDI5NjIwMjU3LCAxLjAwMzY5NTQ2NjIsIDEuMDA0NDE4ODYyOCB9LAorICAgIHsgMC44NDYxNTU1MDQwLCAwLjg1NDc4ODIzMDUsIDAuODYyNDYzNTU1NSwgMC44NjkzNzg5OTIwLAorICAgICAgMC44NzU2NzYwODUzLCAwLjg4MTQ1OTgyNzMsIDAuODg2ODEwMzAzMiwgMC44OTE3OTAwMjg0LAorICAgICAgMC44OTY0NDg3NjI2LCAwLjkwMDgyNjc3NTQsIDAuOTA0OTU3MTI3MywgMC45MDg4NjczMDIxLAorICAgICAgMC45MTI1ODA0MDA3LCAwLjkxNjExNjAzMDYsIDAuOTE5NDkwOTgwMywgMC45MjI3MTk3Mzc2LAorICAgICAgMC45MjU4MTQ4OTM5LCAwLjkyODc4NzQ2MjksIDAuOTMxNjQ3MTM1NSwgMC45MzQ0MDI0ODM5LAorICAgICAgMC45MzcwNjExMjkxLCAwLjkzOTYyOTg3NjYsIDAuOTQyMTE0ODMwMCwgMC45NDQ1MjE0ODQ2LAorICAgICAgMC45NDY4NTQ4MDYwLCAwLjk0OTExOTI5NjcsIDAuOTUxMzE5MDUxNywgMC45NTM0NTc4MDc0LAorICAgICAgMC45NTU1Mzg5ODE2LCAwLjk1NzU2NTcwOTYsIDAuOTU5NTQwODc0MiwgMC45NjE0NjcxMzI3LAorICAgICAgMC45NjMzNDY5Mzk2LCAwLjk2NTE4MjU2NzAsIDAuOTY2OTc2MTIyMiwgMC45Njg3Mjk1NjM1LAorICAgICAgMC45NzA0NDQ3MTQyLCAwLjk3MjEyMzI3NDIsIDAuOTczNzY2ODMxNiwgMC45NzUzNzY4NzE4LAorICAgICAgMC45NzY5NTQ3ODY4LCAwLjk3ODUwMTg4MjQsIDAuOTgwMDE5Mzg1NCwgMC45ODE1MDg0NTAwLAorICAgICAgMC45ODI5NzAxNjMzLCAwLjk4NDQwNTU1MDUsIDAuOTg1ODE1NTc5NiwgMC45ODcyMDExNjUzLAorICAgICAgMC45ODg1NjMxNzM0LCAwLjk4OTkwMjQyMzYsIDAuOTkxMjE5NjkzNCwgMC45OTI1MTU3MjAzLAorICAgICAgMC45OTM3OTEyMDUzLCAwLjk5NTA0NjgxNDMsIDAuOTk2MjgzMTgxNCwgMC45OTc1MDA5MTAyLAorICAgICAgMC45OTg3MDA1NzYwLCAwLjk5OTg4MjcyNzcsIDEuMDAxMDQ3ODg5MiwgMS4wMDIxOTY1NjA4LAorICAgICAgMS4wMDMzMjkyMjA5LCAxLjAwNDQ0NjMyNzAsIDEuMDA1NTQ4MzE3MywgMS4wMDY2MzU2MTEyIH0sCisgICAgeyAwLjgwMDMyNTk3MzcsIDAuODExMjMxMzI0MSwgMC44MjA5NTgxMjA5LCAwLjgyOTc0NjY3NzUsCisgICAgICAwLjgzNzc2OTcwNjYsIDAuODQ1MTU1NjQ5MiwgMC44NTIwMDI3MDUxLCAwLjg1ODM4NzY5MzUsCisgICAgICAwLjg2NDM3MTg3OTIsIDAuODcwMDA0OTMyOCwgMC44NzUzMjc3MDIwLCAwLjg4MDM3NDE5NzksCisgICAgICAwLjg4NTE3MzA1MDIsIDAuODg5NzQ4NTkzNywgMC44OTQxMjE2OTE4LCAwLjg5ODMxMDM3MTksCisgICAgICAwLjkwMjMzMDMyMDIsIDAuOTA2MTk1MjczNiwgMC45MDk5MTczMzE2LCAwLjkxMzUwNzIwOTEsCisgICAgICAwLjkxNjk3NDQ0MDksIDAuOTIwMzI3NTUwMiwgMC45MjM1NzQxODgyLCAwLjkyNjcyMTI0OTYsCisgICAgICAwLjkyOTc3NDk2OTksIDAuOTMyNzQxMDA3OSwgMC45MzU2MjQ1MTQ2LCAwLjkzODQzMDE5MzMsCisgICAgICAwLjk0MTE2MjM0OTcsIDAuOTQzODI0OTM2NCwgMC45NDY0MjE1OTA2LCAwLjk0ODk1NTY2NjgsCisgICAgICAwLjk1MTQzMDI2NjEsIDAuOTUzODQ4MjYwOCwgMC45NTYyMTIzMTY3LCAwLjk1ODUyNDkxMjYsCisgICAgICAwLjk2MDc4ODM1NzYsIDAuOTYzMDA0ODA2MiwgMC45NjUxNzYyNzIyLCAwLjk2NzMwNDY0MDMsCisgICAgICAwLjk2OTM5MTY3NzUsIDAuOTcxNDM5MDQyNSwgMC45NzM0NDgyOTQ0LCAwLjk3NTQyMDkwMDcsCisgICAgICAwLjk3NzM1ODI0NDYsIDAuOTc5MjYxNjMwNywgMC45ODExMzIyOTE4LCAwLjk4Mjk3MTM5MzQsCisgICAgICAwLjk4NDc4MDAzODksIDAuOTg2NTU5MjczOSwgMC45ODgzMTAwOTAwLCAwLjk5MDAzMzQyODksCisgICAgICAwLjk5MTczMDE4NTMsIDAuOTkzNDAxMjEwNCwgMC45OTUwNDczMTQzLCAwLjk5NjY2OTI2ODksCisgICAgICAwLjk5ODI2NzgxMDAsIDAuOTk5ODQzNjQwMCwgMS4wMDEzOTc0Mjk1LCAxLjAwMjkyOTgxOTQsCisgICAgICAxLjAwNDQ0MTQyMjQsIDEuMDA1OTMyODI1MCwgMS4wMDc0MDQ1ODg5LCAxLjAwODg1NzI1MjAgfSwKKyAgICB7IDAuNzU2OTc4NjY1NCwgMC43Njk4OTM5MTk1LCAwLjc4MTQ1MDEwNTQsIDAuNzkxOTIxMDc4MywKKyAgICAgIDAuODAxNTA0MjI0MCwgMC44MTAzNDY3MTA0LCAwLjgxODU2MTMxNjcsIDAuODI2MjM2NDU1NywKKyAgICAgIDAuODMzNDQyNzc2MywgMC44NDAyMzc2NjE1LCAwLjg0NjY2ODM4MTEsIDAuODUyNzc0MzU2MSwKKyAgICAgIDAuODU4NTg4ODE5NCwgMC44NjQxNDAwNTgyLCAwLjg2OTQ1MjM1NjcsIDAuODc0NTQ2NzI0NywKKyAgICAgIDAuODc5NDQxNDY1MiwgMC44ODQxNTI2MjU0LCAwLjg4ODY5NDM1NTIsIDAuODkzMDc5MTk4MSwKKyAgICAgIDAuODk3MzE4MzI3NiwgMC45MDE0MjE3NDE1LCAwLjkwNTM5ODQyMjcsIDAuOTA5MjU2NDczNywKKyAgICAgIDAuOTEzMDAzMjI4MywgMC45MTY2NDUzNDc4LCAwLjkyMDE4ODkwMDcsIDAuOTIzNjM5NDMyMCwKKyAgICAgIDAuOTI3MDAyMDIyNCwgMC45MzAyODEzMzkwLCAwLjkzMzQ4MTY3OTcsIDAuOTM2NjA3MDExMiwKKyAgICAgIDAuOTM5NjYxMDAyOCwgMC45NDI2NDcwNTU0LCAwLjk0NTU2ODMyNzUsIDAuOTQ4NDI3NzU3OSwKKyAgICAgIDAuOTUxMjI4MDg2MCwgMC45NTM5NzE4NjkwLCAwLjk1NjY2MTQ5ODYsIDAuOTU5Mjk5MjE0NywKKyAgICAgIDAuOTYxODg3MTE4MiwgMC45NjQ0MjcxODIzLCAwLjk2NjkyMTI2MzAsIDAuOTY5MzcxMTA3OSwKKyAgICAgIDAuOTcxNzc4MzY1MSwgMC45NzQxNDQ1OTAwLCAwLjk3NjQ3MTI1MjksIDAuOTc4NzU5NzQ0NSwKKyAgICAgIDAuOTgxMDExMzgyMiwgMC45ODMyMjc0MTQ4LCAwLjk4NTQwOTAyNzQsIDAuOTg3NTU3MzQ1NywKKyAgICAgIDAuOTg5NjczNDM5OCwgMC45OTE3NTgzMjgxLCAwLjk5MzgxMjk4MDMsIDAuOTk1ODM4MzIwOSwKKyAgICAgIDAuOTk3ODM1MjMxNSwgMC45OTk4MDQ1NTM5LCAxLjAwMTc0NzA5MTksIDEuMDAzNjYzNjE0NSwKKyAgICAgIDEuMDA1NTU0ODU2OCwgMS4wMDc0MjE1MjI5LCAxLjAwOTI2NDI4NzEsIDEuMDExMDgzNzk1OSB9LAorICAgIHsgMC43MTU5NzkxMzcwLCAwLjczMDY2MjkxOTEsIDAuNzQzODQzMzg0NSwgMC43NTU4MTk4MzE4LAorICAgICAgMC43NjY4MDg2MDY0LCAwLjc3Njk3MTQyNzIsIDAuNzg2NDMyNTEzOSwgMC43OTUyODk0NTQ4LAorICAgICAgMC44MDM2MjAzODQwLCAwLjgxMTQ4ODg3OTIsIDAuODE4OTQ3NDAyMiwgMC44MjYwMzk3NzI4LAorICAgICAgMC44MzI4MDI5ODc3LCAwLjgzOTI2ODU4MTUsIDAuODQ1NDYzNjYyOSwgMC44NTE0MTE3MTQyLAorICAgICAgMC44NTcxMzMyMTc3LCAwLjg2MjY0NjE1MTMsIDAuODY3OTY2Mzg1MCwgMC44NzMxMDgwMDIwLAorICAgICAgMC44NzgwODM1NTk2LCAwLjg4MjkwNDMwNDksIDAuODg3NTgwMzUyOSwgMC44OTIxMjA4MzQ5LAorICAgICAgMC44OTY1MzQwMjM3LCAwLjkwMDgyNzQzOTMsIDAuOTA1MDA3OTM4MiwgMC45MDkwODE3OTA1LAorICAgICAgMC45MTMwNTQ3NDU0LCAwLjkxNjkzMjA4ODIsIDAuOTIwNzE4Njg5MywgMC45MjQ0MTkwNDc0LAorICAgICAgMC45MjgwMzczMjYxLCAwLjkzMTU3NzM4NzYsIDAuOTM1MDQyODIwOCwgMC45Mzg0MzY5NjczLAorICAgICAgMC45NDE3NjI5NDMzLCAwLjk0NTAyMzY2MDMsIDAuOTQ4MjIxODQyMiwgMC45NTEzNjAwNDIxLAorICAgICAgMC45NTQ0NDA2NTU1LCAwLjk1NzQ2NTkzMzgsIDAuOTYwNDM3OTk1NywgMC45NjMzNTg4Mzc0LAorICAgICAgMC45NjYyMzAzNDIwLCAwLjk2OTA1NDI4NzksIDAuOTcxODMyMzU2OSwgMC45NzQ1NjYxNDA4LAorICAgICAgMC45NzcyNTcxNDc3LCAwLjk3OTkwNjgwODIsIDAuOTgyNTE2NDgwNSwgMC45ODUwODc0NTUxLAorICAgICAgMC45ODc2MjA5NTk3LCAwLjk5MDExODE2MjcsIDAuOTkyNTgwMTc3NSwgMC45OTUwMDgwNjU4LAorICAgICAgMC45OTc0MDI4NDA1LCAwLjk5OTc2NTQ2OTIsIDEuMDAyMDk2ODc2NCwgMS4wMDQzOTc5NDY0LAorICAgICAgMS4wMDY2Njk1MjU1LCAxLjAwODkxMjQyMzksIDEuMDExMTI3NDE4NSwgMS4wMTMzMTUyNTM3IH0sCisgICAgeyAwLjY3NzIwMDIyNzcsIDAuNjkzNDMwOTg4MSwgMC43MDgwNDY0NTk5LCAwLjcyMTM2NDMzMDEsCisgICAgICAwLjczMzYxNDg5NzAsIDAuNzQ0OTcwNzUyNiwgMC43NTU1NjQ3NzcyLCAwLjc2NTUwMTU4NTYsCisgICAgICAwLjc3NDg2NTEwMTUsIDAuNzgzNzIzNzM4MiwgMC43OTIxMzQwNDI2LCAwLjgwMDE0MzMyMjAsCisgICAgICAwLjgwNzc5MTU3NjgsIDAuODE1MTEyOTQ5OSwgMC44MjIxMzY4MzEwLCAwLjgyODg4ODcxMDcsCisgICAgICAwLjgzNTM5MDg0OTYsIDAuODQxNjYyODA5MCwgMC44NDc3MjE4NzU1LCAwLjg1MzU4MzQwNTMsCisgICAgICAwLjg1OTI2MTEwNDksIDAuODY0NzY3MjYyNCwgMC44NzAxMTI5MzkzLCAwLjg3NTMwODEzMDUsCisgICAgICAwLjg4MDM2MTg5ODgsIDAuODg1MjgyNDg5NCwgMC44OTAwNzc0MjYxLCAwLjg5NDc1MzU5NDUsCisgICAgICAwLjg5OTMxNzMxMzEsIDAuOTAzNzc0Mzk0OSwgMC45MDgxMzAyMDA0LCAwLjkxMjM4OTY4NDEsCisgICAgICAwLjkxNjU1NzQzNTIsIDAuOTIwNjM3NzEyOSwgMC45MjQ2MzQ0Nzc5LCAwLjkyODU1MTQyMDIsCisgICAgICAwLjkzMjM5MTk4MzAsIDAuOTM2MTU5Mzg1MywgMC45Mzk4NTY2NDA1LCAwLjk0MzQ4NjU3NDIsCisgICAgICAwLjk0NzA1MTgzOTYsIDAuOTUwNTU0OTMxNywgMC45NTM5OTgxOTkyLCAwLjk1NzM4Mzg1NjQsCisgICAgICAwLjk2MDcxMzk5MzMsIDAuOTYzOTkwNTg0NywgMC45NjcyMTU0OTg5LCAwLjk3MDM5MDUwNTEsCisgICAgICAwLjk3MzUxNzI4MDMsIDAuOTc2NTk3NDE2MiwgMC45Nzk2MzI0MjQzLCAwLjk4MjYyMzc0MTgsCisgICAgICAwLjk4NTU3MjczNjIsIDAuOTg4NDgwNzA5OCwgMC45OTEzNDg5MDM5LCAwLjk5NDE3ODUwMjgsCisgICAgICAwLjk5Njk3MDYzNjksIDAuOTk5NzI2Mzg2MSwgMS4wMDI0NDY3ODMxLCAxLjAwNTEzMjgxNTcsCisgICAgICAxLjAwNzc4NTQyOTcsIDEuMDEwNDA1NTMxNCwgMS4wMTI5OTM5ODkyLCAxLjAxNTU1MTYzNjQgfSwKKyAgICB7IDAuNjQwNTIxNjY0MiwgMC42NTgwOTYyNjEyLCAwLjY3Mzk3MjIzNjMsIDAuNjg4NDc5NTQ4OCwKKyAgICAgIDAuNzAxODU4MDgxMywgMC43MTQyODgwNzE0LCAwLjcyNTkwODYwOTQsIDAuNzM2ODI5NDMyNCwKKyAgICAgIDAuNzQ3MTM4NzQ1NSwgMC43NTY5MDg1ODMyLCAwLjc2NjE5ODU4NTksIDAuNzc1MDU4NzI4MywKKyAgICAgIDAuNzgzNTMxMzI4OCwgMC43OTE2NTI1NjAwLCAwLjc5OTQ1MzU5OTgsIDAuODA2OTYxNTI0MywKKyAgICAgIDAuODE0MjAwMDA2OCwgMC44MjExODk4NzM4LCAwLjgyNzk0OTU1MDQsIDAuODM0NDk1NDIxMSwKKyAgICAgIDAuODQwODQyMTI1MiwgMC44NDcwMDI3OTk3LCAwLjg1Mjk4OTI4MTEsIDAuODU4ODEyMjc0NCwKKyAgICAgIDAuODY0NDgxNDk0NywgMC44NzAwMDU3ODc4LCAwLjg3NTM5MzIzMjQsIDAuODgwNjUxMjI3NiwKKyAgICAgIDAuODg1Nzg2NTY4NCwgMC44OTA4MDU1MTA1LCAwLjg5NTcxMzgyNzEsIDAuOTAwNTE2ODU3NiwKKyAgICAgIDAuOTA1MjE5NTUxMywgMC45MDk4MjY1MDQ2LCAwLjkxNDM0MTk5NDUsIDAuOTE4NzcwMDA4MCwKKyAgICAgIDAuOTIzMTE0MjY4MCwgMC45MjczNzgyNTY4LCAwLjkzMTU2NTIzNjQsIDAuOTM1Njc4MjY3MiwKKyAgICAgIDAuOTM5NzIwMjI0NSwgMC45NDM2OTM4MTMzLCAwLjk0NzYwMTU4MTksIDAuOTUxNDQ1OTMzNiwKKyAgICAgIDAuOTU1MjI5MTM4MiwgMC45NTg5NTMzNDE0LCAwLjk2MjYyMDU3NDEsIDAuOTY2MjMyNzYwMywKKyAgICAgIDAuOTY5NzkxNzI1MSwgMC45NzMyOTkyMDA4LCAwLjk3Njc1NjgzNDAsIDAuOTgwMTY2MTkwMywKKyAgICAgIDAuOTgzNTI4NzYwNSwgMC45ODY4NDU5NjQ5LCAwLjk5MDExOTE1NzgsIDAuOTkzMzQ5NjMxNSwKKyAgICAgIDAuOTk2NTM4NjIwNSwgMC45OTk2ODczMDQ1LCAxLjAwMjc5NjgxMTksIDEuMDA1ODY4MjIyNiwKKyAgICAgIDEuMDA4OTAyNTcxMCwgMS4wMTE5MDA4NDg1LCAxLjAxNDg2NDAwNTYsIDEuMDE3NzkyOTU0OCB9LAorICAgIHsgMC42MDU4Mjk2ODc1LCAwLjYyNDU2MjA2MzcsIDAuNjQxNTM3ODEwMSwgMC42NTcwOTM4ODM1LAorICAgICAgMC42NzE0NzU5NTg2LCAwLjY4NDg2OTEwMDEsIDAuNjk3NDE2NDU2MSwgMC43MDkyMzEyMDU1LAorICAgICAgMC43MjA0MDQ0OTg4LCAwLjczMTAxMDkxMDMsIDAuNzQxMTEyMjg4NCwgMC43NTA3NjA1Mzk3LAorICAgICAgMC43NTk5OTk2ODQyLCAwLjc2ODg2NzQwMTUsIDAuNzc3Mzk2MjEyMiwgMC43ODU2MTQzOTM1LAorICAgICAgMC43OTM1NDY2OTkwLCAwLjgwMTIxNDkzMDMsIDAuODA4NjM4Mzk2MywgMC44MTU4MzQyODU4LAorICAgICAgMC44MjI4MTc5NzE3LCAwLjgyOTYwMzI2MzEsIDAuODM2MjAyNjEzMywgMC44NDI2MjcyOTU0LAorICAgICAgMC44NDg4ODc1NDkyLCAwLjg1NDk5MjcwNTYsIDAuODYwOTUxMjkzNiwgMC44NjY3NzExMzA3LAorICAgICAgMC44NzI0NTk0MDE1LCAwLjg3ODAyMjcyNTYsIDAuODgzNDY3MjE2MSwgMC44ODg3OTg1MzA5LAorICAgICAgMC44OTQwMjE5MTgwLCAwLjg5OTE0MjI1NDMsIDAuOTA0MTY0MDgxMCwgMC45MDkwOTE2MzM3LAorICAgICAgMC45MTM5Mjg4NzA0LCAwLjkxODY3OTQ5NDgsIDAuOTIzMzQ2OTc4OSwgMC45Mjc5MzQ1ODE4LAorICAgICAgMC45MzI0NDUzNjcxLCAwLjkzNjg4MjIxODUsIDAuOTQxMjQ3ODU0MywgMC45NDU1NDQ4MzkzLAorICAgICAgMC45NDk3NzU1OTcwLCAwLjk1Mzk0MjQxOTgsIDAuOTU4MDQ3NDc4MiwgMC45NjIwOTI4Mjk5LAorICAgICAgMC45NjYwODA0MjcxLCAwLjk3MDAxMjEyNDQsIDAuOTczODg5Njg0NSwgMC45Nzc3MTQ3ODUxLAorICAgICAgMC45ODE0ODkwMjM5LCAwLjk4NTIxMzkyMzYsIDAuOTg4ODkwOTM3MCwgMC45OTI1MjE0NTEyLAorICAgICAgMC45OTYxMDY3OTEzLCAwLjk5OTY0ODIyNDQsIDEuMDAzMTQ2OTYyOSwgMS4wMDY2MDQxNjc2LAorICAgICAgMS4wMTAwMjA5NTA2LCAxLjAxMzM5ODM3ODUsIDEuMDE2NzM3NDc0MiwgMS4wMjAwMzkyMTk4IH0sCisgICAgeyAwLjU3MzAxNjY5OTksIDAuNTkyNzM2NjQ3MywgMC42MTA2NjQyNjcyLCAwLjYyNzEzODk5NDIsCisgICAgICAwLjY0MjQwOTAyMTIsIDAuNjU2NjYxNzkxMCwgMC42NzAwNDI2MjkyLCAwLjY4MjY2NjY4MDgsCisgICAgICAwLjY5NDYyNjg2MTQsIDAuNzA1OTk5MzI3OSwgMC43MTY4NDczNDc2LCAwLjcyNzIyNDEwMjMsCisgICAgICAwLjczNzE3NDc2MDgsIDAuNzQ2NzM4MDQwMSwgMC43NTU5NDc0MDA2LCAwLjc2NDgzMTk3MzYsCisgICAgICAwLjc3MzQxNzI5MDgsIDAuNzgxNzI1ODY1MCwgMC43ODk3Nzc2NTcwLCAwLjc5NzU5MDQ1NDEsCisgICAgICAwLjgwNTE4MDE4MTEsIDAuODEyNTYxMTU2MCwgMC44MTk3NDYzMDM5LCAwLjgyNjc0NzMzNDksCisgICAgICAwLjgzMzU3NDg5NDksIDAuODQwMjM4NjkzNywgMC44NDY3NDc2MTI5LCAwLjg1MzEwOTgwMDMsCisgICAgICAwLjg1OTMzMjc0OTUsIDAuODY1NDIzMzY5OCwgMC44NzEzODgwNDY0LCAwLjg3NzIzMjY5MzUsCisgICAgICAwLjg4Mjk2MjgwMDIsIDAuODg4NTgzNDcxMCwgMC44OTQwOTk0NjE5LCAwLjg5OTUxNTIxMjAsCisgICAgICAwLjkwNDgzNDg3MTUsIDAuOTEwMDYyMzI2OCwgMC45MTUyMDEyMjI5LCAwLjkyMDI1NDk4MzMsCisgICAgICAwLjkyNTIyNjgyODEsIDAuOTMwMTE5Nzg5OSwgMC45MzQ5MzY3Mjg4LCAwLjkzOTY4MDM0NDksCisgICAgICAwLjk0NDM1MzE5MDksIDAuOTQ4OTU3NjgyMywgMC45NTM0OTYxMDc2LCAwLjk1Nzk3MDYzNzQsCisgICAgICAwLjk2MjM4MzMzMjAsIDAuOTY2NzM2MTQ5MiwgMC45NzEwMzA5NTEyLCAwLjk3NTI2OTUxMDksCisgICAgICAwLjk3OTQ1MzUxNzQsIDAuOTgzNTg0NTgxMywgMC45ODc2NjQyMzk5LCAwLjk5MTY5Mzk2MTQsCisgICAgICAwLjk5NTY3NTE0OTMsIDAuOTk5NjA5MTQ1OSwgMS4wMDM0OTcyMzYyLCAxLjAwNzM0MDY1MTAsCisgICAgICAxLjAxMTE0MDU3MDAsIDEuMDE0ODk4MTI0OCwgMS4wMTg2MTQ0MDEzLCAxLjAyMjI5MDQ0MjIgfSwKKyAgICB7IDAuNTQxOTgwOTMxNiwgMC41NjI1MzI5Mzg2LCAwLjU4MTI3NjQ5MTIsIDAuNTk4NTQ5NjU2MiwKKyAgICAgIDAuNjE0NjAwMzM3MCwgMC42Mjk2MTYyNDAxLCAwLjY0Mzc0MzIzNDAsIDAuNjU3MDk3MTQwNCwKKyAgICAgIDAuNjY5NzcxNjAzOSwgMC42ODE4NDM1MTgyLCAwLjY5MzM3Njg3MTIsIDAuNzA0NDI1NTM1MywKKyAgICAgIDAuNzE1MDM1MzM0MCwgMC43MjUyNDU2MDA5LCAwLjczNTA5MDM3NDIsIDAuNzQ0NTk5MzI1OSwKKyAgICAgIDAuNzUzNzk4NDkyOSwgMC43NjI3MTA4NTk1LCAwLjc3MTM1NjgyNjksIDAuNzc5NzU0NTk0MywKKyAgICAgIDAuNzg3OTIwNDcxMiwgMC43OTU4NjkxMzYxLCAwLjgwMzYxMzg1MTYsIDAuODExMTY2NjQ0NCwKKyAgICAgIDAuODE4NTM4NDU4MCwgMC44MjU3MzkyODE0LCAwLjgzMjc3ODI1OTcsIDAuODM5NjYzNzg4NiwKKyAgICAgIDAuODQ2NDAzNTk1NSwgMC44NTMwMDQ4MTA4LCAwLjg1OTQ3NDAyODcsIDAuODY1ODE3MzYxMSwKKyAgICAgIDAuODcyMDQwNDg0NSwgMC44NzgxNDg2ODEyLCAwLjg4NDE0Njg3NjIsIDAuODkwMDM5NjY4OCwKKyAgICAgIDAuODk1ODMxMzYyMCwgMC45MDE1MjU5ODc0LCAwLjkwNzEyNzMyODYsIDAuOTEyNjM4OTQxMywKKyAgICAgIDAuOTE4MDY0MTcxNSwgMC45MjM0MDYxNzI3LCAwLjkyODY2NzkxOTgsIDAuOTMzODUyMjIzNiwKKyAgICAgIDAuOTM4OTYxNzQyMCwgMC45NDM5OTg5OTIwLCAwLjk0ODk2NjM1OTEsIDAuOTUzODY2MTA2OSwKKyAgICAgIDAuOTU4NzAwMzg1MiwgMC45NjM0NzEyMzc4LCAwLjk2ODE4MDYwOTQsIDAuOTcyODMwMzUyNCwKKyAgICAgIDAuOTc3NDIyMjMyMywgMC45ODE5NTc5MzM2LCAwLjk4NjQzOTA2NDQsIDAuOTkwODY3MTYxNSwKKyAgICAgIDAuOTk1MjQzNjk0MywgMC45OTk1NzAwNjg5LCAxLjAwMzg0NzYzMTgsIDEuMDA4MDc3NjczMywKKyAgICAgIDEuMDEyMjYxNDMwNSwgMS4wMTY0MDAwOTA2LCAxLjAyMDQ5NDc5MzIsIDEuMDI0NTQ2NjMzMSB9LAorICAgIHsgMC41MTI2MjYxMjQ2LCAwLjUzMzg2ODMwMTMsIDAuNTUzMzAyOTgwNywgMC41NzEyNjM2MTgxLAorICAgICAgMC41ODc5OTU0Mzg4LCAwLjYwMzY4NDU5ODcsIDAuNjE4NDc2MDk4OSwgMC42MzI0ODUzMTY5LAorICAgICAgMC42NDU4MDU3MjE1LCAwLjY1ODUxNDIwMTEsIDAuNjcwNjc0ODQ3NSwgMC42ODIzNDE3MDYyLAorICAgICAgMC42OTM1NjA4MTYzLCAwLjcwNDM3MTc1MTksIDAuNzE0ODA4ODA1MiwgMC43MjQ5MDE5MDcwLAorICAgICAgMC43MzQ2NzczNTI5LCAwLjc0NDE1ODM4MjMsIDAuNzUzMzY1NjQ1NiwgMC43NjIzMTc1ODMxLAorICAgICAgMC43NzEwMzA3Mzc2LCAwLjc3OTUyMDAxMTcsIDAuNzg3Nzk4ODgyOSwgMC43OTU4Nzk1ODQxLAorICAgICAgMC44MDM3NzMyNTU3LCAwLjgxMTQ5MDA3NTQsIDAuODE5MDM5MzY4MiwgMC44MjY0Mjk3MDE4LAorICAgICAgMC44MzM2Njg5NjgwLCAwLjg0MDc2NDQ1NDMsIDAuODQ3NzIyOTA0OSwgMC44NTQ1NTA1NzUxLAorICAgICAgMC44NjEyNTMyNzg2LCAwLjg2NzgzNjQyOTEsIDAuODc0MzA1MDc2OCwgMC44ODA2NjM5NDE2LAorICAgICAgMC44ODY5MTc0NDE0LCAwLjg5MzA2OTcxODQsIDAuODk5MTI0NjYyMSwgMC45MDUwODU5Mjk3LAorICAgICAgMC45MTA5NTY5NjQ4LCAwLjkxNjc0MTAxNDQsIDAuOTIyNDQxMTQzNiwgMC45MjgwNjAyNDk2LAorICAgICAgMC45MzM2MDEwNzM3LCAwLjkzOTA2NjIxMjksIDAuOTQ0NDU4MTMwMCwgMC45NDk3NzkxNjI4LAorICAgICAgMC45NTUwMzE1MzI4LCAwLjk2MDIxNzM1MjgsIDAuOTY1MzM4NjM0NSwgMC45NzAzOTcyOTQzLAorICAgICAgMC45NzUzOTUxNjAwLCAwLjk4MDMzMzk3NjEsIDAuOTg1MjE1NDA4OCwgMC45OTAwNDEwNTEwLAorICAgICAgMC45OTQ4MTI0MjYzLCAwLjk5OTUzMDk5MzQsIDEuMDA0MTk4MTQ5NywgMS4wMDg4MTUyMzQ4LAorICAgICAgMS4wMTMzODM1MzM1LCAxLjAxNzkwNDI3OTEsIDEuMDIyMzc4NjU2NCwgMS4wMjY4MDc4MDM1IH0sCit9OworCisjZW5kaWYgLyogQVZDT0RFQ19XTUFWT0lDRV9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dtdjIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTAyZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvd212Mi5jCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJtc21wZWc0ZGF0YS5oIgorI2luY2x1ZGUgInNpbXBsZV9pZGN0LmgiCisjaW5jbHVkZSAid212Mi5oIgorCisKK2F2X2NvbGQgdm9pZCBmZl93bXYyX2NvbW1vbl9pbml0KFdtdjJDb250ZXh0ICp3KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpjb25zdCBzID0gJnctPnM7CisKKyAgICBmZl9ibG9ja2RzcF9pbml0KCZzLT5iZHNwLCBzLT5hdmN0eCk7CisgICAgZmZfd212MmRzcF9pbml0KCZ3LT53ZHNwKTsKKyAgICBzLT5pZHNwLnBlcm1fdHlwZSA9IHctPndkc3AuaWRjdF9wZXJtOworICAgIGZmX2luaXRfc2NhbnRhYmxlX3Blcm11dGF0aW9uKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT53ZHNwLmlkY3RfcGVybSk7CisgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmdy0+YWJ0X3NjYW50YWJsZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICBmZl93bXYyX3NjYW50YWJsZUEpOworICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnctPmFidF9zY2FudGFibGVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgZmZfd212Ml9zY2FudGFibGVCKTsKKyAgICBmZl9pbml0X3NjYW50YWJsZShzLT5pZHNwLmlkY3RfcGVybXV0YXRpb24sICZzLT5pbnRyYV9zY2FudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgZmZfd212MV9zY2FudGFibGVbMV0pOworICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX2hfc2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIGZmX3dtdjFfc2NhbnRhYmxlWzJdKTsKKyAgICBmZl9pbml0X3NjYW50YWJsZShzLT5pZHNwLmlkY3RfcGVybXV0YXRpb24sICZzLT5pbnRyYV92X3NjYW50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICBmZl93bXYxX3NjYW50YWJsZVszXSk7CisgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50ZXJfc2NhbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIGZmX3dtdjFfc2NhbnRhYmxlWzBdKTsKKyAgICBzLT5pZHNwLmlkY3RfcHV0ID0gdy0+d2RzcC5pZGN0X3B1dDsKKyAgICBzLT5pZHNwLmlkY3RfYWRkID0gdy0+d2RzcC5pZGN0X2FkZDsKKyAgICBzLT5pZHNwLmlkY3QgICAgID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgd212Ml9hZGRfYmxvY2soV212MkNvbnRleHQgKncsIGludDE2X3QgKmJsb2NrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IG4pCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKmNvbnN0IHMgPSAmdy0+czsKKworICAgIGlmIChzLT5ibG9ja19sYXN0X2luZGV4W25dID49IDApIHsKKyAgICAgICAgc3dpdGNoICh3LT5hYnRfdHlwZV90YWJsZVtuXSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB3LT53ZHNwLmlkY3RfYWRkKGRzdCwgc3RyaWRlLCBibG9jazEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGZmX3NpbXBsZV9pZGN0ODRfYWRkKGRzdCwgc3RyaWRlLCBibG9jazEpOworICAgICAgICAgICAgZmZfc2ltcGxlX2lkY3Q4NF9hZGQoZHN0ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCB3LT5hYnRfYmxvY2syW25dKTsKKyAgICAgICAgICAgIHMtPmJkc3AuY2xlYXJfYmxvY2sody0+YWJ0X2Jsb2NrMltuXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZmZfc2ltcGxlX2lkY3Q0OF9hZGQoZHN0LCBzdHJpZGUsIGJsb2NrMSk7CisgICAgICAgICAgICBmZl9zaW1wbGVfaWRjdDQ4X2FkZChkc3QgKyA0LCBzdHJpZGUsIHctPmFidF9ibG9jazJbbl0pOworICAgICAgICAgICAgcy0+YmRzcC5jbGVhcl9ibG9jayh3LT5hYnRfYmxvY2syW25dKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnRlcm5hbCBlcnJvciBpbiBXTVYyIGFidFxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZmZfd212Ml9hZGRfbWIoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgYmxvY2sxWzZdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF95LCB1aW50OF90ICpkZXN0X2NiLCB1aW50OF90ICpkZXN0X2NyKQoreworICAgIFdtdjJDb250ZXh0ICpjb25zdCB3ID0gKFdtdjJDb250ZXh0ICopIHM7CisKKyAgICB3bXYyX2FkZF9ibG9jayh3LCBibG9jazFbMF0sIGRlc3RfeSwgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVzaXplLCAwKTsKKyAgICB3bXYyX2FkZF9ibG9jayh3LCBibG9jazFbMV0sIGRlc3RfeSArIDgsICAgICAgICAgICAgICAgICAgIHMtPmxpbmVzaXplLCAxKTsKKyAgICB3bXYyX2FkZF9ibG9jayh3LCBibG9jazFbMl0sIGRlc3RfeSArIDggKiBzLT5saW5lc2l6ZSwgICAgIHMtPmxpbmVzaXplLCAyKTsKKyAgICB3bXYyX2FkZF9ibG9jayh3LCBibG9jazFbM10sIGRlc3RfeSArIDggKyA4ICogcy0+bGluZXNpemUsIHMtPmxpbmVzaXplLCAzKTsKKworICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkKKyAgICAgICAgcmV0dXJuOworCisgICAgd212Ml9hZGRfYmxvY2sodywgYmxvY2sxWzRdLCBkZXN0X2NiLCBzLT51dmxpbmVzaXplLCA0KTsKKyAgICB3bXYyX2FkZF9ibG9jayh3LCBibG9jazFbNV0sIGRlc3RfY3IsIHMtPnV2bGluZXNpemUsIDUpOworfQorCit2b2lkIGZmX21zcGVsX21vdGlvbihNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqZGVzdF95LAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF9jYiwgdWludDhfdCAqZGVzdF9jciwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipyZWZfcGljdHVyZSwgb3BfcGl4ZWxzX2Z1bmMgKCpwaXhfb3ApWzRdLAorICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3ksIGludCBoKQoreworICAgIFdtdjJDb250ZXh0ICpjb25zdCB3ID0gKFdtdjJDb250ZXh0ICopIHM7CisgICAgdWludDhfdCAqcHRyOworICAgIGludCBkeHksIG14LCBteSwgc3JjX3gsIHNyY195LCB2X2VkZ2VfcG9zOworICAgIHB0cmRpZmZfdCBvZmZzZXQsIGxpbmVzaXplLCB1dmxpbmVzaXplOworICAgIGludCBlbXUgPSAwOworCisgICAgZHh5ICAgPSAoKG1vdGlvbl95ICYgMSkgPDwgMSkgfCAobW90aW9uX3ggJiAxKTsKKyAgICBkeHkgICA9IDIgKiBkeHkgKyB3LT5oc2hpZnQ7CisgICAgc3JjX3ggPSBzLT5tYl94ICogMTYgKyAobW90aW9uX3ggPj4gMSk7CisgICAgc3JjX3kgPSBzLT5tYl95ICogMTYgKyAobW90aW9uX3kgPj4gMSk7CisKKyAgICAvKiBXQVJOSU5HOiBkbyBubyBmb3JnZXQgaGFsZiBwZWxzICovCisgICAgdl9lZGdlX3BvcyA9IHMtPnZfZWRnZV9wb3M7CisgICAgc3JjX3ggICAgICA9IGF2X2NsaXAoc3JjX3gsIC0xNiwgcy0+d2lkdGgpOworICAgIHNyY195ICAgICAgPSBhdl9jbGlwKHNyY195LCAtMTYsIHMtPmhlaWdodCk7CisKKyAgICBpZiAoc3JjX3ggPD0gLTE2IHx8IHNyY194ID49IHMtPndpZHRoKQorICAgICAgICBkeHkgJj0gfjM7CisgICAgaWYgKHNyY195IDw9IC0xNiB8fCBzcmNfeSA+PSBzLT5oZWlnaHQpCisgICAgICAgIGR4eSAmPSB+NDsKKworICAgIGxpbmVzaXplICAgPSBzLT5saW5lc2l6ZTsKKyAgICB1dmxpbmVzaXplID0gcy0+dXZsaW5lc2l6ZTsKKyAgICBwdHIgICAgICAgID0gcmVmX3BpY3R1cmVbMF0gKyAoc3JjX3kgKiBsaW5lc2l6ZSkgKyBzcmNfeDsKKworICAgIGlmIChzcmNfeCA8IDEgfHwgc3JjX3kgPCAxIHx8IHNyY194ICsgMTcgPj0gcy0+aF9lZGdlX3BvcyB8fAorICAgICAgICBzcmNfeSArIGggKyAxID49IHZfZWRnZV9wb3MpIHsKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlciwgcHRyIC0gMSAtIHMtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemUsIHMtPmxpbmVzaXplLCAxOSwgMTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfeCAtIDEsIHNyY195IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhfZWRnZV9wb3MsIHMtPnZfZWRnZV9wb3MpOworICAgICAgICBwdHIgPSBzLT5lZGdlX2VtdV9idWZmZXIgKyAxICsgcy0+bGluZXNpemU7CisgICAgICAgIGVtdSA9IDE7CisgICAgfQorCisgICAgdy0+d2RzcC5wdXRfbXNwZWxfcGl4ZWxzX3RhYltkeHldKGRlc3RfeSwgICAgICAgICAgICAgICAgICAgIHB0ciwgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplKTsKKyAgICB3LT53ZHNwLnB1dF9tc3BlbF9waXhlbHNfdGFiW2R4eV0oZGVzdF95ICAgICArIDgsICAgICAgICAgICAgcHRyICAgICArIDgsICAgICAgICAgICAgbGluZXNpemUpOworICAgIHctPndkc3AucHV0X21zcGVsX3BpeGVsc190YWJbZHh5XShkZXN0X3kgICAgICsgOCAqIGxpbmVzaXplLCBwdHIgICAgICsgOCAqIGxpbmVzaXplLCBsaW5lc2l6ZSk7CisgICAgdy0+d2RzcC5wdXRfbXNwZWxfcGl4ZWxzX3RhYltkeHldKGRlc3RfeSArIDggKyA4ICogbGluZXNpemUsIHB0ciArIDggKyA4ICogbGluZXNpemUsIGxpbmVzaXplKTsKKworICAgIGlmIChzLT5mbGFncyAmIENPREVDX0ZMQUdfR1JBWSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZHh5ID0gMDsKKyAgICBpZiAoKG1vdGlvbl94ICYgMykgIT0gMCkKKyAgICAgICAgZHh5IHw9IDE7CisgICAgaWYgKChtb3Rpb25feSAmIDMpICE9IDApCisgICAgICAgIGR4eSB8PSAyOworICAgIG14ID0gbW90aW9uX3ggPj4gMjsKKyAgICBteSA9IG1vdGlvbl95ID4+IDI7CisKKyAgICBzcmNfeCA9IHMtPm1iX3ggKiA4ICsgbXg7CisgICAgc3JjX3kgPSBzLT5tYl95ICogOCArIG15OworICAgIHNyY194ID0gYXZfY2xpcChzcmNfeCwgLTgsIHMtPndpZHRoID4+IDEpOworICAgIGlmIChzcmNfeCA9PSAocy0+d2lkdGggPj4gMSkpCisgICAgICAgIGR4eSAmPSB+MTsKKyAgICBzcmNfeSA9IGF2X2NsaXAoc3JjX3ksIC04LCBzLT5oZWlnaHQgPj4gMSk7CisgICAgaWYgKHNyY195ID09IChzLT5oZWlnaHQgPj4gMSkpCisgICAgICAgIGR4eSAmPSB+MjsKKyAgICBvZmZzZXQgPSAoc3JjX3kgKiB1dmxpbmVzaXplKSArIHNyY194OworICAgIHB0ciAgICA9IHJlZl9waWN0dXJlWzFdICsgb2Zmc2V0OworICAgIGlmIChlbXUpIHsKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlciwgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZsaW5lc2l6ZSwgcy0+dXZsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfeCwgc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zID4+IDEsIHMtPnZfZWRnZV9wb3MgPj4gMSk7CisgICAgICAgIHB0ciA9IHMtPmVkZ2VfZW11X2J1ZmZlcjsKKyAgICB9CisgICAgcGl4X29wWzFdW2R4eV0oZGVzdF9jYiwgcHRyLCB1dmxpbmVzaXplLCBoID4+IDEpOworCisgICAgcHRyID0gcmVmX3BpY3R1cmVbMl0gKyBvZmZzZXQ7CisgICAgaWYgKGVtdSkgeworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyLCBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT51dmxpbmVzaXplLCBzLT51dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY194LCBzcmNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhfZWRnZV9wb3MgPj4gMSwgcy0+dl9lZGdlX3BvcyA+PiAxKTsKKyAgICAgICAgcHRyID0gcy0+ZWRnZV9lbXVfYnVmZmVyOworICAgIH0KKyAgICBwaXhfb3BbMV1bZHh5XShkZXN0X2NyLCBwdHIsIHV2bGluZXNpemUsIGggPj4gMSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy93bXYyLmggYi9mZm1wZWcvbGliYXZjb2RlYy93bXYyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1YjE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtdjIuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfV01WMl9ICisjZGVmaW5lIEFWQ09ERUNfV01WMl9ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50cmF4OC5oIgorI2luY2x1ZGUgIm1wZWd2aWRlby5oIgorI2luY2x1ZGUgIndtdjJkc3AuaCIKKworI2RlZmluZSBTS0lQX1RZUEVfTk9ORSAwCisjZGVmaW5lIFNLSVBfVFlQRV9NUEVHIDEKKyNkZWZpbmUgU0tJUF9UWVBFX1JPVyAgMgorI2RlZmluZSBTS0lQX1RZUEVfQ09MICAzCisKKwordHlwZWRlZiBzdHJ1Y3QgV212MkNvbnRleHQgeworICAgIE1wZWdFbmNDb250ZXh0IHM7CisgICAgSW50cmFYOENvbnRleHQgeDg7CisgICAgV01WMkRTUENvbnRleHQgd2RzcDsKKyAgICBpbnQgal90eXBlX2JpdDsKKyAgICBpbnQgal90eXBlOworICAgIGludCBhYnRfZmxhZzsKKyAgICBpbnQgYWJ0X3R5cGU7CisgICAgaW50IGFidF90eXBlX3RhYmxlWzZdOworICAgIGludCBwZXJfbWJfYWJ0OworICAgIGludCBwZXJfYmxvY2tfYWJ0OworICAgIGludCBtc3BlbF9iaXQ7CisgICAgaW50IGNicF90YWJsZV9pbmRleDsKKyAgICBpbnQgdG9wX2xlZnRfbXZfZmxhZzsKKyAgICBpbnQgcGVyX21iX3JsX2JpdDsKKyAgICBpbnQgc2tpcF90eXBlOworICAgIGludCBoc2hpZnQ7CisKKyAgICBTY2FuVGFibGUgYWJ0X3NjYW50YWJsZVsyXTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGFidF9ibG9jazIpWzZdWzY0XTsKK30gV212MkNvbnRleHQ7CisKK3ZvaWQgZmZfd212Ml9jb21tb25faW5pdChXbXYyQ29udGV4dCAqdyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1dNVjJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvd212MmRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvd212MmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Y2JmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy93bXYyZGVjLmMKQEAgLTAsMCArMSw0OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaDI2My5oIgorI2luY2x1ZGUgImludHJheDguaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAibXNtcGVnNC5oIgorI2luY2x1ZGUgIm1zbXBlZzRkYXRhLmgiCisjaW5jbHVkZSAid212Mi5oIgorCisKK3N0YXRpYyB2b2lkIHBhcnNlX21iX3NraXAoV212MkNvbnRleHQgKncpCit7CisgICAgaW50IG1iX3gsIG1iX3k7CisgICAgTXBlZ0VuY0NvbnRleHQgKmNvbnN0IHMgPSAmdy0+czsKKyAgICB1aW50MzJfdCAqY29uc3QgbWJfdHlwZSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPm1iX3R5cGU7CisKKyAgICB3LT5za2lwX3R5cGUgPSBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgIHN3aXRjaCAody0+c2tpcF90eXBlKSB7CisgICAgY2FzZSBTS0lQX1RZUEVfTk9ORToKKyAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IHMtPm1iX2hlaWdodDsgbWJfeSsrKQorICAgICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IHMtPm1iX3dpZHRoOyBtYl94KyspCisgICAgICAgICAgICAgICAgbWJfdHlwZVttYl95ICogcy0+bWJfc3RyaWRlICsgbWJfeF0gPQorICAgICAgICAgICAgICAgICAgICBNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV9MMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTS0lQX1RZUEVfTVBFRzoKKyAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IHMtPm1iX2hlaWdodDsgbWJfeSsrKQorICAgICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IHMtPm1iX3dpZHRoOyBtYl94KyspCisgICAgICAgICAgICAgICAgbWJfdHlwZVttYl95ICogcy0+bWJfc3RyaWRlICsgbWJfeF0gPQorICAgICAgICAgICAgICAgICAgICAoZ2V0X2JpdHMxKCZzLT5nYikgPyBNQl9UWVBFX1NLSVAgOiAwKSB8IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0wwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNLSVBfVFlQRV9ST1c6CisgICAgICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBzLT5tYl9oZWlnaHQ7IG1iX3krKykgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IHMtPm1iX3dpZHRoOyBtYl94KyspCisgICAgICAgICAgICAgICAgICAgIG1iX3R5cGVbbWJfeSAqIHMtPm1iX3N0cmlkZSArIG1iX3hdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfU0tJUCB8IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0wwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykKKyAgICAgICAgICAgICAgICAgICAgbWJfdHlwZVttYl95ICogcy0+bWJfc3RyaWRlICsgbWJfeF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9iaXRzMSgmcy0+Z2IpID8gTUJfVFlQRV9TS0lQIDogMCkgfCBNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV9MMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFNLSVBfVFlQRV9DT0w6CisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKyAgICAgICAgICAgICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgcy0+bWJfaGVpZ2h0OyBtYl95KyspCisgICAgICAgICAgICAgICAgICAgIG1iX3R5cGVbbWJfeSAqIHMtPm1iX3N0cmlkZSArIG1iX3hdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfU0tJUCB8IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0wwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgcy0+bWJfaGVpZ2h0OyBtYl95KyspCisgICAgICAgICAgICAgICAgICAgIG1iX3R5cGVbbWJfeSAqIHMtPm1iX3N0cmlkZSArIG1iX3hdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfYml0czEoJnMtPmdiKSA/IE1CX1RZUEVfU0tJUCA6IDApIHwgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfTDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9leHRfaGVhZGVyKFdtdjJDb250ZXh0ICp3KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpjb25zdCBzID0gJnctPnM7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgZnBzOworICAgIGludCBjb2RlOworCisgICAgaWYgKHMtPmF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBzLT5hdmN0eC0+ZXh0cmFkYXRhLCAzMik7CisKKyAgICBmcHMgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoJmdiLCA1KTsKKyAgICBzLT5iaXRfcmF0ZSAgICAgICAgID0gZ2V0X2JpdHMoJmdiLCAxMSkgKiAxMDI0OworICAgIHctPm1zcGVsX2JpdCAgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBzLT5sb29wX2ZpbHRlciAgICAgID0gZ2V0X2JpdHMxKCZnYik7CisgICAgdy0+YWJ0X2ZsYWcgICAgICAgICA9IGdldF9iaXRzMSgmZ2IpOworICAgIHctPmpfdHlwZV9iaXQgICAgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICB3LT50b3BfbGVmdF9tdl9mbGFnID0gZ2V0X2JpdHMxKCZnYik7CisgICAgdy0+cGVyX21iX3JsX2JpdCAgICA9IGdldF9iaXRzMSgmZ2IpOworICAgIGNvZGUgICAgICAgICAgICAgICAgPSBnZXRfYml0cygmZ2IsIDMpOworCisgICAgaWYgKGNvZGUgPT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcy0+c2xpY2VfaGVpZ2h0ID0gcy0+bWJfaGVpZ2h0IC8gY29kZTsKKworICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgImZwczolZCwgYnI6JWQsIHFwYml0OiVkLCBhYnRfZmxhZzolZCwgal90eXBlX2JpdDolZCwgIgorICAgICAgICAgICAgICAgInRsX212X2ZsYWc6JWQsIG1icmxfYml0OiVkLCBjb2RlOiVkLCBsb29wX2ZpbHRlcjolZCwgIgorICAgICAgICAgICAgICAgInNsaWNlczolZFxuIiwKKyAgICAgICAgICAgICAgIGZwcywgcy0+Yml0X3JhdGUsIHctPm1zcGVsX2JpdCwgdy0+YWJ0X2ZsYWcsIHctPmpfdHlwZV9iaXQsCisgICAgICAgICAgICAgICB3LT50b3BfbGVmdF9tdl9mbGFnLCB3LT5wZXJfbWJfcmxfYml0LCBjb2RlLCBzLT5sb29wX2ZpbHRlciwKKyAgICAgICAgICAgICAgIGNvZGUpOworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfd212Ml9kZWNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgV212MkNvbnRleHQgKmNvbnN0IHcgPSAoV212MkNvbnRleHQgKikgczsKKyAgICBpbnQgY29kZTsKKworICAgIGlmIChzLT5waWN0dXJlX251bWJlciA9PSAwKQorICAgICAgICBkZWNvZGVfZXh0X2hlYWRlcih3KTsKKworICAgIHMtPnBpY3RfdHlwZSA9IGdldF9iaXRzMSgmcy0+Z2IpICsgMTsKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgIGNvZGUgPSBnZXRfYml0cygmcy0+Z2IsIDcpOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkk3OiVYL1xuIiwgY29kZSk7CisgICAgfQorICAgIHMtPmNocm9tYV9xc2NhbGUgPSBzLT5xc2NhbGUgPSBnZXRfYml0cygmcy0+Z2IsIDUpOworICAgIGlmIChzLT5xc2NhbGUgPD0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl93bXYyX2RlY29kZV9zZWNvbmRhcnlfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgV212MkNvbnRleHQgKmNvbnN0IHcgPSAoV212MkNvbnRleHQgKikgczsKKworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgaWYgKHctPmpfdHlwZV9iaXQpCisgICAgICAgICAgICB3LT5qX3R5cGUgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdy0+al90eXBlID0gMDsgLy8gRklYTUUgY2hlY2sKKworICAgICAgICBpZiAoIXctPmpfdHlwZSkgeworICAgICAgICAgICAgaWYgKHctPnBlcl9tYl9ybF9iaXQpCisgICAgICAgICAgICAgICAgcy0+cGVyX21iX3JsX3RhYmxlID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcy0+cGVyX21iX3JsX3RhYmxlID0gMDsKKworICAgICAgICAgICAgaWYgKCFzLT5wZXJfbWJfcmxfdGFibGUpIHsKKyAgICAgICAgICAgICAgICBzLT5ybF9jaHJvbWFfdGFibGVfaW5kZXggPSBkZWNvZGUwMTIoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBzLT5ybF90YWJsZV9pbmRleCAgICAgICAgPSBkZWNvZGUwMTIoJnMtPmdiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+ZGNfdGFibGVfaW5kZXggPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgfQorICAgICAgICBzLT5pbnRlcl9pbnRyYV9wcmVkID0gMDsKKyAgICAgICAgcy0+bm9fcm91bmRpbmcgICAgICA9IDE7CisgICAgICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJxc2NhbGU6JWQgcmxjOiVkIHJsOiVkIGRjOiVkIG1icmw6JWQgal90eXBlOiVkIFxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5xc2NhbGUsIHMtPnJsX2Nocm9tYV90YWJsZV9pbmRleCwgcy0+cmxfdGFibGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgcy0+ZGNfdGFibGVfaW5kZXgsIHMtPnBlcl9tYl9ybF90YWJsZSwgdy0+al90eXBlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBjYnBfaW5kZXg7CisgICAgICAgIHctPmpfdHlwZSA9IDA7CisKKyAgICAgICAgcGFyc2VfbWJfc2tpcCh3KTsKKyAgICAgICAgY2JwX2luZGV4ID0gZGVjb2RlMDEyKCZzLT5nYik7CisgICAgICAgIGlmIChzLT5xc2NhbGUgPD0gMTApIHsKKyAgICAgICAgICAgIGludCBtYXBbM10gICAgICAgICA9IHsgMCwgMiwgMSB9OworICAgICAgICAgICAgdy0+Y2JwX3RhYmxlX2luZGV4ID0gbWFwW2NicF9pbmRleF07CisgICAgICAgIH0gZWxzZSBpZiAocy0+cXNjYWxlIDw9IDIwKSB7CisgICAgICAgICAgICBpbnQgbWFwWzNdICAgICAgICAgPSB7IDEsIDAsIDIgfTsKKyAgICAgICAgICAgIHctPmNicF90YWJsZV9pbmRleCA9IG1hcFtjYnBfaW5kZXhdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IG1hcFszXSAgICAgICAgID0gezIsMSwwfTsKKyAgICAgICAgICAgIHctPmNicF90YWJsZV9pbmRleCA9IG1hcFtjYnBfaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHctPm1zcGVsX2JpdCkKKyAgICAgICAgICAgIHMtPm1zcGVsID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPm1zcGVsID0gMDsgLy8gRklYTUUgY2hlY2sKKworICAgICAgICBpZiAody0+YWJ0X2ZsYWcpIHsKKyAgICAgICAgICAgIHctPnBlcl9tYl9hYnQgPSBnZXRfYml0czEoJnMtPmdiKSBeIDE7CisgICAgICAgICAgICBpZiAoIXctPnBlcl9tYl9hYnQpCisgICAgICAgICAgICAgICAgdy0+YWJ0X3R5cGUgPSBkZWNvZGUwMTIoJnMtPmdiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3LT5wZXJfbWJfcmxfYml0KQorICAgICAgICAgICAgcy0+cGVyX21iX3JsX3RhYmxlID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPnBlcl9tYl9ybF90YWJsZSA9IDA7CisKKyAgICAgICAgaWYgKCFzLT5wZXJfbWJfcmxfdGFibGUpIHsKKyAgICAgICAgICAgIHMtPnJsX3RhYmxlX2luZGV4ICAgICAgICA9IGRlY29kZTAxMigmcy0+Z2IpOworICAgICAgICAgICAgcy0+cmxfY2hyb21hX3RhYmxlX2luZGV4ID0gcy0+cmxfdGFibGVfaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBzLT5kY190YWJsZV9pbmRleCAgID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgIHMtPm12X3RhYmxlX2luZGV4ICAgPSBnZXRfYml0czEoJnMtPmdiKTsKKworICAgICAgICBzLT5pbnRlcl9pbnRyYV9wcmVkID0gMDsgLy8gKHMtPndpZHRoICogcy0+aGVpZ2h0IDwgMzIwICogMjQwICYmIHMtPmJpdF9yYXRlIDw9IElJX0JJVFJBVEUpOworICAgICAgICBzLT5ub19yb3VuZGluZyAgICAgXj0gMTsKKworICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAicmw6JWQgcmxjOiVkIGRjOiVkIG12OiVkIG1icmw6JWQgcXA6JWQgbXNwZWw6JWQgIgorICAgICAgICAgICAgICAgICAgICJwZXJfbWJfYWJ0OiVkIGFidF90eXBlOiVkIGNicDolZCBpaTolZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5ybF90YWJsZV9pbmRleCwgcy0+cmxfY2hyb21hX3RhYmxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgIHMtPmRjX3RhYmxlX2luZGV4LCBzLT5tdl90YWJsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICBzLT5wZXJfbWJfcmxfdGFibGUsIHMtPnFzY2FsZSwgcy0+bXNwZWwsCisgICAgICAgICAgICAgICAgICAgdy0+cGVyX21iX2FidCwgdy0+YWJ0X3R5cGUsIHctPmNicF90YWJsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICBzLT5pbnRlcl9pbnRyYV9wcmVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5lc2MzX2xldmVsX2xlbmd0aCA9IDA7CisgICAgcy0+ZXNjM19ydW5fbGVuZ3RoICAgPSAwOworICAgIHMtPnBpY3R1cmVfbnVtYmVyKys7IC8vIEZJWE1FID8KKworICAgIGlmICh3LT5qX3R5cGUpIHsKKyAgICAgICAgZmZfaW50cmF4OF9kZWNvZGVfcGljdHVyZSgmdy0+eDgsIDIgKiBzLT5xc2NhbGUsIChzLT5xc2NhbGUgLSAxKSB8IDEpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgd212Ml9kZWNvZGVfbW90aW9uKFdtdjJDb250ZXh0ICp3LCBpbnQgKm14X3B0ciwgaW50ICpteV9wdHIpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKmNvbnN0IHMgPSAmdy0+czsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfbXNtcGVnNF9kZWNvZGVfbW90aW9uKHMsIG14X3B0ciwgbXlfcHRyKTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoKCgoKm14X3B0cikgfCAoKm15X3B0cikpICYgMSkgJiYgcy0+bXNwZWwpCisgICAgICAgIHctPmhzaGlmdCA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgIGVsc2UKKyAgICAgICAgdy0+aHNoaWZ0ID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50MTZfdCAqd212Ml9wcmVkX21vdGlvbihXbXYyQ29udGV4dCAqdywgaW50ICpweCwgaW50ICpweSkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqY29uc3QgcyA9ICZ3LT5zOworICAgIGludCB4eSwgd3JhcCwgZGlmZiwgdHlwZTsKKyAgICBpbnQxNl90ICpBLCAqQiwgKkMsICptb3RfdmFsOworCisgICAgd3JhcCAgICA9IHMtPmI4X3N0cmlkZTsKKyAgICB4eSAgICAgID0gcy0+YmxvY2tfaW5kZXhbMF07CisKKyAgICBtb3RfdmFsID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1beHldOworCisgICAgQSAgICAgICA9IHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzBdW3h5ICAgICAtIDFdOworICAgIEIgICAgICAgPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVt4eSAgICAgLSB3cmFwXTsKKyAgICBDICAgICAgID0gcy0+Y3VycmVudF9waWN0dXJlLm1vdGlvbl92YWxbMF1beHkgKyAyIC0gd3JhcF07CisKKyAgICBpZiAocy0+bWJfeCAmJiAhcy0+Zmlyc3Rfc2xpY2VfbGluZSAmJiAhcy0+bXNwZWwgJiYgdy0+dG9wX2xlZnRfbXZfZmxhZykKKyAgICAgICAgZGlmZiA9IEZGTUFYKEZGQUJTKEFbMF0gLSBCWzBdKSwgRkZBQlMoQVsxXSAtIEJbMV0pKTsKKyAgICBlbHNlCisgICAgICAgIGRpZmYgPSAwOworCisgICAgaWYgKGRpZmYgPj0gOCkKKyAgICAgICAgdHlwZSA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgIGVsc2UKKyAgICAgICAgdHlwZSA9IDI7CisKKyAgICBpZiAodHlwZSA9PSAwKSB7CisgICAgICAgICpweCA9IEFbMF07CisgICAgICAgICpweSA9IEFbMV07CisgICAgfSBlbHNlIGlmICh0eXBlID09IDEpIHsKKyAgICAgICAgKnB4ID0gQlswXTsKKyAgICAgICAgKnB5ID0gQlsxXTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGZpcnN0IChzbGljZSkgbGluZSAqLworICAgICAgICBpZiAocy0+Zmlyc3Rfc2xpY2VfbGluZSkgeworICAgICAgICAgICAgKnB4ID0gQVswXTsKKyAgICAgICAgICAgICpweSA9IEFbMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcHggPSBtaWRfcHJlZChBWzBdLCBCWzBdLCBDWzBdKTsKKyAgICAgICAgICAgICpweSA9IG1pZF9wcmVkKEFbMV0sIEJbMV0sIENbMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1vdF92YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdtdjJfZGVjb2RlX2ludGVyX2Jsb2NrKFdtdjJDb250ZXh0ICp3LCBpbnQxNl90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgY2JwKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpjb25zdCBzID0gJnctPnM7CisgICAgc3RhdGljIGNvbnN0IGludCBzdWJfY2JwX3RhYmxlWzNdID0geyAyLCAzLCAxIH07CisgICAgaW50IHN1Yl9jYnA7CisKKyAgICBpZiAoIWNicCkgeworICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gLTE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICh3LT5wZXJfYmxvY2tfYWJ0KQorICAgICAgICB3LT5hYnRfdHlwZSA9IGRlY29kZTAxMigmcy0+Z2IpOworICAgIHctPmFidF90eXBlX3RhYmxlW25dID0gdy0+YWJ0X3R5cGU7CisKKyAgICBpZiAody0+YWJ0X3R5cGUpIHsKKy8vICAgICAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGUgPSB3LT5hYnRfc2NhbnRhYmxlW3ctPmFidF90eXBlIC0gMV0ucGVybXV0YXRlZDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc2NhbnRhYmxlID0gdy0+YWJ0X3NjYW50YWJsZVt3LT5hYnRfdHlwZSAtIDFdLnNjYW50YWJsZTsKKy8vICAgICAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGUgPSB3LT5hYnRfdHlwZSAtIDEgPyB3LT5hYnRfc2NhbnRhYmxlWzFdLnBlcm11dGF0ZWQgOiB3LT5hYnRfc2NhbnRhYmxlWzBdLnNjYW50YWJsZTsKKworICAgICAgICBzdWJfY2JwID0gc3ViX2NicF90YWJsZVtkZWNvZGUwMTIoJnMtPmdiKV07CisKKyAgICAgICAgaWYgKHN1Yl9jYnAgJiAxKQorICAgICAgICAgICAgaWYgKGZmX21zbXBlZzRfZGVjb2RlX2Jsb2NrKHMsIGJsb2NrLCBuLCAxLCBzY2FudGFibGUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgaWYgKHN1Yl9jYnAgJiAyKQorICAgICAgICAgICAgaWYgKGZmX21zbXBlZzRfZGVjb2RlX2Jsb2NrKHMsIHctPmFidF9ibG9jazJbbl0sIG4sIDEsIHNjYW50YWJsZSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gNjM7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZmX21zbXBlZzRfZGVjb2RlX2Jsb2NrKHMsIGJsb2NrLCBuLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW50ZXJfc2NhbnRhYmxlLnBlcm11dGF0ZWQpOworICAgIH0KK30KKworaW50IGZmX3dtdjJfZGVjb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzZdWzY0XSkKK3sKKyAgICBXbXYyQ29udGV4dCAqY29uc3QgdyA9IChXbXYyQ29udGV4dCAqKSBzOworICAgIGludCBjYnAsIGNvZGUsIGk7CisgICAgdWludDhfdCAqY29kZWRfdmFsOworCisgICAgaWYgKHctPmpfdHlwZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB7CisgICAgICAgIGlmIChJU19TS0lQKHMtPmN1cnJlbnRfcGljdHVyZS5tYl90eXBlW3MtPm1iX3kgKiBzLT5tYl9zdHJpZGUgKyBzLT5tYl94XSkpIHsKKyAgICAgICAgICAgIC8qIHNraXAgbWIgKi8KKyAgICAgICAgICAgIHMtPm1iX2ludHJhID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9IC0xOworICAgICAgICAgICAgcy0+bXZfZGlyICAgICAgPSBNVl9ESVJfRk9SV0FSRDsKKyAgICAgICAgICAgIHMtPm12X3R5cGUgICAgID0gTVZfVFlQRV8xNlgxNjsKKyAgICAgICAgICAgIHMtPm12WzBdWzBdWzBdID0gMDsKKyAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdID0gMDsKKyAgICAgICAgICAgIHMtPm1iX3NraXBwZWQgID0gMTsKKyAgICAgICAgICAgIHctPmhzaGlmdCAgICAgID0gMDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgY29kZSA9IGdldF92bGMyKCZzLT5nYiwgZmZfbWJfbm9uX2ludHJhX3ZsY1t3LT5jYnBfdGFibGVfaW5kZXhdLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgTUJfTk9OX0lOVFJBX1ZMQ19CSVRTLCAzKTsKKyAgICAgICAgaWYgKGNvZGUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzLT5tYl9pbnRyYSA9ICh+Y29kZSAmIDB4NDApID4+IDY7CisKKyAgICAgICAgY2JwID0gY29kZSAmIDB4M2Y7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bWJfaW50cmEgPSAxOworICAgICAgICBjb2RlID0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9tc21wNF9tYl9pX3ZsYy50YWJsZSwgTUJfSU5UUkFfVkxDX0JJVFMsIDIpOworICAgICAgICBpZiAoY29kZSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJSS1jYnAgaWxsZWdhbCBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgLyogcHJlZGljdCBjb2RlZCBibG9jayBwYXR0ZXJuICovCisgICAgICAgIGNicCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgIGludCB2YWwgPSAoKGNvZGUgPj4gKDUgLSBpKSkgJiAxKTsKKyAgICAgICAgICAgIGlmIChpIDwgNCkgeworICAgICAgICAgICAgICAgIGludCBwcmVkICAgPSBmZl9tc21wZWc0X2NvZGVkX2Jsb2NrX3ByZWQocywgaSwgJmNvZGVkX3ZhbCk7CisgICAgICAgICAgICAgICAgdmFsICAgICAgICA9IHZhbCBeIHByZWQ7CisgICAgICAgICAgICAgICAgKmNvZGVkX3ZhbCA9IHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNicCB8PSB2YWwgPDwgKDUgLSBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcy0+bWJfaW50cmEpIHsKKyAgICAgICAgaW50IG14LCBteTsKKyAgICAgICAgd212Ml9wcmVkX21vdGlvbih3LCAmbXgsICZteSk7CisKKyAgICAgICAgaWYgKGNicCkgeworICAgICAgICAgICAgcy0+YmRzcC5jbGVhcl9ibG9ja3Mocy0+YmxvY2tbMF0pOworICAgICAgICAgICAgaWYgKHMtPnBlcl9tYl9ybF90YWJsZSkgeworICAgICAgICAgICAgICAgIHMtPnJsX3RhYmxlX2luZGV4ICAgICAgICA9IGRlY29kZTAxMigmcy0+Z2IpOworICAgICAgICAgICAgICAgIHMtPnJsX2Nocm9tYV90YWJsZV9pbmRleCA9IHMtPnJsX3RhYmxlX2luZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAody0+YWJ0X2ZsYWcgJiYgdy0+cGVyX21iX2FidCkgeworICAgICAgICAgICAgICAgIHctPnBlcl9ibG9ja19hYnQgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBpZiAoIXctPnBlcl9ibG9ja19hYnQpCisgICAgICAgICAgICAgICAgICAgIHctPmFidF90eXBlID0gZGVjb2RlMDEyKCZzLT5nYik7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB3LT5wZXJfYmxvY2tfYWJ0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3bXYyX2RlY29kZV9tb3Rpb24odywgJm14LCAmbXkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBzLT5tdl9kaXIgICAgICA9IE1WX0RJUl9GT1JXQVJEOworICAgICAgICBzLT5tdl90eXBlICAgICA9IE1WX1RZUEVfMTZYMTY7CisgICAgICAgIHMtPm12WzBdWzBdWzBdID0gbXg7CisgICAgICAgIHMtPm12WzBdWzBdWzFdID0gbXk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgaWYgKHdtdjJfZGVjb2RlX2ludGVyX2Jsb2NrKHcsIGJsb2NrW2ldLCBpLCAoY2JwID4+ICg1IC0gaSkpICYgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJcbmVycm9yIHdoaWxlIGRlY29kaW5nIGludGVyIGJsb2NrOiAlZCB4ICVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3gsIHMtPm1iX3ksIGkpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApCisgICAgICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiJWQlZCAiLCBzLT5pbnRlcl9pbnRyYV9wcmVkLCBjYnApOworICAgICAgICBhdl9kbG9nKHMtPmF2Y3R4LCAiSSBhdCAlZCAlZCAlZCAlMDZYXG4iLCBzLT5tYl94LCBzLT5tYl95LAorICAgICAgICAgICAgICAgICgoY2JwICYgMykgPyAxIDogMCkgKyAoKGNicCAmIDB4M0MpID8gMiA6IDApLAorICAgICAgICAgICAgICAgIHNob3dfYml0cygmcy0+Z2IsIDI0KSk7CisgICAgICAgIHMtPmFjX3ByZWQgPSBnZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgaWYgKHMtPmludGVyX2ludHJhX3ByZWQpIHsKKyAgICAgICAgICAgIHMtPmgyNjNfYWljX2RpciA9IGdldF92bGMyKCZzLT5nYiwgZmZfaW50ZXJfaW50cmFfdmxjLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJfSU5UUkFfVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgYXZfZGxvZyhzLT5hdmN0eCwgIiVkJWQgJWQgJWQvIiwKKyAgICAgICAgICAgICAgICAgICAgcy0+YWNfcHJlZCwgcy0+aDI2M19haWNfZGlyLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+cGVyX21iX3JsX3RhYmxlICYmIGNicCkgeworICAgICAgICAgICAgcy0+cmxfdGFibGVfaW5kZXggICAgICAgID0gZGVjb2RlMDEyKCZzLT5nYik7CisgICAgICAgICAgICBzLT5ybF9jaHJvbWFfdGFibGVfaW5kZXggPSBzLT5ybF90YWJsZV9pbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmJkc3AuY2xlYXJfYmxvY2tzKHMtPmJsb2NrWzBdKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgaWYgKGZmX21zbXBlZzRfZGVjb2RlX2Jsb2NrKHMsIGJsb2NrW2ldLCBpLCAoY2JwID4+ICg1IC0gaSkpICYgMSwgTlVMTCkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJcbmVycm9yIHdoaWxlIGRlY29kaW5nIGludHJhIGJsb2NrOiAlZCB4ICVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3gsIHMtPm1iX3ksIGkpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgd212Ml9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgV212MkNvbnRleHQgKmNvbnN0IHcgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZjdHgtPmZsYWdzIHw9IENPREVDX0ZMQUdfRU1VX0VER0U7CisKKyAgICBpZiAoZmZfbXNtcGVnNF9kZWNvZGVfaW5pdChhdmN0eCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmZl93bXYyX2NvbW1vbl9pbml0KHcpOworCisgICAgZmZfaW50cmF4OF9jb21tb25faW5pdCgmdy0+eDgsICZ3LT5zKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgd212Ml9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBXbXYyQ29udGV4dCAqdyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBmZl9pbnRyYXg4X2NvbW1vbl9lbmQoJnctPng4KTsKKyAgICByZXR1cm4gZmZfaDI2M19kZWNvZGVfZW5kKGF2Y3R4KTsKK30KKworQVZDb2RlYyBmZl93bXYyX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIndtdjIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIFZpZGVvIDgiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV01WMiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoV212MkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHdtdjJfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gd212Ml9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBDT0RFQ19DQVBfRFIxLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeyBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dtdjJkc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtdjJkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGUwYmVmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvd212MmRzcC5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJ3bXYyZHNwLmgiCisKKyNkZWZpbmUgVzAgMjA0OAorI2RlZmluZSBXMSAyODQxIC8qIDIwNDgqc3FydCAoMikqY29zICgxKnBpLzE2KSAqLworI2RlZmluZSBXMiAyNjc2IC8qIDIwNDgqc3FydCAoMikqY29zICgyKnBpLzE2KSAqLworI2RlZmluZSBXMyAyNDA4IC8qIDIwNDgqc3FydCAoMikqY29zICgzKnBpLzE2KSAqLworI2RlZmluZSBXNCAyMDQ4IC8qIDIwNDgqc3FydCAoMikqY29zICg0KnBpLzE2KSAqLworI2RlZmluZSBXNSAxNjA5IC8qIDIwNDgqc3FydCAoMikqY29zICg1KnBpLzE2KSAqLworI2RlZmluZSBXNiAxMTA4IC8qIDIwNDgqc3FydCAoMikqY29zICg2KnBpLzE2KSAqLworI2RlZmluZSBXNyA1NjUgIC8qIDIwNDgqc3FydCAoMikqY29zICg3KnBpLzE2KSAqLworCitzdGF0aWMgdm9pZCB3bXYyX2lkY3Rfcm93KHNob3J0ICogYikKK3sKKyAgICBpbnQgczEsIHMyOworICAgIGludCBhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTc7CisKKyAgICAvKiBzdGVwIDEgKi8KKyAgICBhMSA9IFcxICogYlsxXSArIFc3ICogYls3XTsKKyAgICBhNyA9IFc3ICogYlsxXSAtIFcxICogYls3XTsKKyAgICBhNSA9IFc1ICogYls1XSArIFczICogYlszXTsKKyAgICBhMyA9IFczICogYls1XSAtIFc1ICogYlszXTsKKyAgICBhMiA9IFcyICogYlsyXSArIFc2ICogYls2XTsKKyAgICBhNiA9IFc2ICogYlsyXSAtIFcyICogYls2XTsKKyAgICBhMCA9IFcwICogYlswXSArIFcwICogYls0XTsKKyAgICBhNCA9IFcwICogYlswXSAtIFcwICogYls0XTsKKworICAgIC8qIHN0ZXAgMiAqLworICAgIHMxID0gKDE4MSAqIChhMSAtIGE1ICsgYTcgLSBhMykgKyAxMjgpID4+IDg7IC8vIDEsIDMsIDUsIDcKKyAgICBzMiA9ICgxODEgKiAoYTEgLSBhNSAtIGE3ICsgYTMpICsgMTI4KSA+PiA4OworCisgICAgLyogc3RlcCAzICovCisgICAgYlswXSA9IChhMCArIGEyICsgYTEgKyBhNSArICgxIDw8IDcpKSA+PiA4OworICAgIGJbMV0gPSAoYTQgKyBhNiArIHMxICAgICAgKyAoMSA8PCA3KSkgPj4gODsKKyAgICBiWzJdID0gKGE0IC0gYTYgKyBzMiAgICAgICsgKDEgPDwgNykpID4+IDg7CisgICAgYlszXSA9IChhMCAtIGEyICsgYTcgKyBhMyArICgxIDw8IDcpKSA+PiA4OworICAgIGJbNF0gPSAoYTAgLSBhMiAtIGE3IC0gYTMgKyAoMSA8PCA3KSkgPj4gODsKKyAgICBiWzVdID0gKGE0IC0gYTYgLSBzMiAgICAgICsgKDEgPDwgNykpID4+IDg7CisgICAgYls2XSA9IChhNCArIGE2IC0gczEgICAgICArICgxIDw8IDcpKSA+PiA4OworICAgIGJbN10gPSAoYTAgKyBhMiAtIGExIC0gYTUgKyAoMSA8PCA3KSkgPj4gODsKK30KKworc3RhdGljIHZvaWQgd212Ml9pZGN0X2NvbChzaG9ydCAqIGIpCit7CisgICAgaW50IHMxLCBzMjsKKyAgICBpbnQgYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3OworCisgICAgLyogc3RlcCAxLCB3aXRoIGV4dGVuZGVkIHByZWNpc2lvbiAqLworICAgIGExID0gKFcxICogYls4ICogMV0gKyBXNyAqIGJbOCAqIDddICsgNCkgPj4gMzsKKyAgICBhNyA9IChXNyAqIGJbOCAqIDFdIC0gVzEgKiBiWzggKiA3XSArIDQpID4+IDM7CisgICAgYTUgPSAoVzUgKiBiWzggKiA1XSArIFczICogYls4ICogM10gKyA0KSA+PiAzOworICAgIGEzID0gKFczICogYls4ICogNV0gLSBXNSAqIGJbOCAqIDNdICsgNCkgPj4gMzsKKyAgICBhMiA9IChXMiAqIGJbOCAqIDJdICsgVzYgKiBiWzggKiA2XSArIDQpID4+IDM7CisgICAgYTYgPSAoVzYgKiBiWzggKiAyXSAtIFcyICogYls4ICogNl0gKyA0KSA+PiAzOworICAgIGEwID0gKFcwICogYls4ICogMF0gKyBXMCAqIGJbOCAqIDRdICAgICkgPj4gMzsKKyAgICBhNCA9IChXMCAqIGJbOCAqIDBdIC0gVzAgKiBiWzggKiA0XSAgICApID4+IDM7CisKKyAgICAvKiBzdGVwIDIgKi8KKyAgICBzMSA9ICgxODEgKiAoYTEgLSBhNSArIGE3IC0gYTMpICsgMTI4KSA+PiA4OworICAgIHMyID0gKDE4MSAqIChhMSAtIGE1IC0gYTcgKyBhMykgKyAxMjgpID4+IDg7CisKKyAgICAvKiBzdGVwIDMgKi8KKyAgICBiWzggKiAwXSA9IChhMCArIGEyICsgYTEgKyBhNSArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgYls4ICogMV0gPSAoYTQgKyBhNiArIHMxICAgICAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIGJbOCAqIDJdID0gKGE0IC0gYTYgKyBzMiAgICAgICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICBiWzggKiAzXSA9IChhMCAtIGEyICsgYTcgKyBhMyArICgxIDw8IDEzKSkgPj4gMTQ7CisKKyAgICBiWzggKiA0XSA9IChhMCAtIGEyIC0gYTcgLSBhMyArICgxIDw8IDEzKSkgPj4gMTQ7CisgICAgYls4ICogNV0gPSAoYTQgLSBhNiAtIHMyICAgICAgKyAoMSA8PCAxMykpID4+IDE0OworICAgIGJbOCAqIDZdID0gKGE0ICsgYTYgLSBzMSAgICAgICsgKDEgPDwgMTMpKSA+PiAxNDsKKyAgICBiWzggKiA3XSA9IChhMCArIGEyIC0gYTEgLSBhNSArICgxIDw8IDEzKSkgPj4gMTQ7Cit9CisKK3N0YXRpYyB2b2lkIHdtdjJfaWRjdF9hZGRfYyh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSArPSA4KQorICAgICAgICB3bXYyX2lkY3Rfcm93KGJsb2NrICsgaSk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgd212Ml9pZGN0X2NvbChibG9jayArIGkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBkZXN0WzBdID0gYXZfY2xpcF91aW50OChkZXN0WzBdICsgYmxvY2tbMF0pOworICAgICAgICBkZXN0WzFdID0gYXZfY2xpcF91aW50OChkZXN0WzFdICsgYmxvY2tbMV0pOworICAgICAgICBkZXN0WzJdID0gYXZfY2xpcF91aW50OChkZXN0WzJdICsgYmxvY2tbMl0pOworICAgICAgICBkZXN0WzNdID0gYXZfY2xpcF91aW50OChkZXN0WzNdICsgYmxvY2tbM10pOworICAgICAgICBkZXN0WzRdID0gYXZfY2xpcF91aW50OChkZXN0WzRdICsgYmxvY2tbNF0pOworICAgICAgICBkZXN0WzVdID0gYXZfY2xpcF91aW50OChkZXN0WzVdICsgYmxvY2tbNV0pOworICAgICAgICBkZXN0WzZdID0gYXZfY2xpcF91aW50OChkZXN0WzZdICsgYmxvY2tbNl0pOworICAgICAgICBkZXN0WzddID0gYXZfY2xpcF91aW50OChkZXN0WzddICsgYmxvY2tbN10pOworICAgICAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgYmxvY2sgKz0gODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHdtdjJfaWRjdF9wdXRfYyh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSArPSA4KQorICAgICAgICB3bXYyX2lkY3Rfcm93KGJsb2NrICsgaSk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgd212Ml9pZGN0X2NvbChibG9jayArIGkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBkZXN0WzBdID0gYXZfY2xpcF91aW50OChibG9ja1swXSk7CisgICAgICAgIGRlc3RbMV0gPSBhdl9jbGlwX3VpbnQ4KGJsb2NrWzFdKTsKKyAgICAgICAgZGVzdFsyXSA9IGF2X2NsaXBfdWludDgoYmxvY2tbMl0pOworICAgICAgICBkZXN0WzNdID0gYXZfY2xpcF91aW50OChibG9ja1szXSk7CisgICAgICAgIGRlc3RbNF0gPSBhdl9jbGlwX3VpbnQ4KGJsb2NrWzRdKTsKKyAgICAgICAgZGVzdFs1XSA9IGF2X2NsaXBfdWludDgoYmxvY2tbNV0pOworICAgICAgICBkZXN0WzZdID0gYXZfY2xpcF91aW50OChibG9ja1s2XSk7CisgICAgICAgIGRlc3RbN10gPSBhdl9jbGlwX3VpbnQ4KGJsb2NrWzddKTsKKyAgICAgICAgZGVzdCArPSBsaW5lX3NpemU7CisgICAgICAgIGJsb2NrICs9IDg7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB3bXYyX21zcGVsOF9oX2xvd3Bhc3ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50IGgpCit7CisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgZHN0WzBdID0gY21bKDkgKiAoc3JjWzBdICsgc3JjWzFdKSAtIChzcmNbLTFdICsgc3JjWzJdKSArIDgpID4+IDRdOworICAgICAgICBkc3RbMV0gPSBjbVsoOSAqIChzcmNbMV0gKyBzcmNbMl0pIC0gKHNyY1swXSAgKyBzcmNbM10pICsgOCkgPj4gNF07CisgICAgICAgIGRzdFsyXSA9IGNtWyg5ICogKHNyY1syXSArIHNyY1szXSkgLSAoc3JjWzFdICArIHNyY1s0XSkgKyA4KSA+PiA0XTsKKyAgICAgICAgZHN0WzNdID0gY21bKDkgKiAoc3JjWzNdICsgc3JjWzRdKSAtIChzcmNbMl0gICsgc3JjWzVdKSArIDgpID4+IDRdOworICAgICAgICBkc3RbNF0gPSBjbVsoOSAqIChzcmNbNF0gKyBzcmNbNV0pIC0gKHNyY1szXSAgKyBzcmNbNl0pICsgOCkgPj4gNF07CisgICAgICAgIGRzdFs1XSA9IGNtWyg5ICogKHNyY1s1XSArIHNyY1s2XSkgLSAoc3JjWzRdICArIHNyY1s3XSkgKyA4KSA+PiA0XTsKKyAgICAgICAgZHN0WzZdID0gY21bKDkgKiAoc3JjWzZdICsgc3JjWzddKSAtIChzcmNbNV0gICsgc3JjWzhdKSArIDgpID4+IDRdOworICAgICAgICBkc3RbN10gPSBjbVsoOSAqIChzcmNbN10gKyBzcmNbOF0pIC0gKHNyY1s2XSAgKyBzcmNbOV0pICsgOCkgPj4gNF07CisgICAgICAgIGRzdCAgICs9IGRzdFN0cmlkZTsKKyAgICAgICAgc3JjICAgKz0gc3JjU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgd212Ml9tc3BlbDhfdl9sb3dwYXNzKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCB3KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmNtID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBzcmNfMSA9IHNyY1stc3JjU3RyaWRlXTsKKyAgICAgICAgY29uc3QgaW50IHNyYzAgID0gc3JjWzBdOworICAgICAgICBjb25zdCBpbnQgc3JjMSAgPSBzcmNbc3JjU3RyaWRlXTsKKyAgICAgICAgY29uc3QgaW50IHNyYzIgID0gc3JjWzIgKiBzcmNTdHJpZGVdOworICAgICAgICBjb25zdCBpbnQgc3JjMyAgPSBzcmNbMyAqIHNyY1N0cmlkZV07CisgICAgICAgIGNvbnN0IGludCBzcmM0ICA9IHNyY1s0ICogc3JjU3RyaWRlXTsKKyAgICAgICAgY29uc3QgaW50IHNyYzUgID0gc3JjWzUgKiBzcmNTdHJpZGVdOworICAgICAgICBjb25zdCBpbnQgc3JjNiAgPSBzcmNbNiAqIHNyY1N0cmlkZV07CisgICAgICAgIGNvbnN0IGludCBzcmM3ICA9IHNyY1s3ICogc3JjU3RyaWRlXTsKKyAgICAgICAgY29uc3QgaW50IHNyYzggID0gc3JjWzggKiBzcmNTdHJpZGVdOworICAgICAgICBjb25zdCBpbnQgc3JjOSAgPSBzcmNbOSAqIHNyY1N0cmlkZV07CisgICAgICAgIGRzdFswICogZHN0U3RyaWRlXSA9IGNtWyg5ICogKHNyYzAgKyBzcmMxKSAtIChzcmNfMSArIHNyYzIpICsgOCkgPj4gNF07CisgICAgICAgIGRzdFsxICogZHN0U3RyaWRlXSA9IGNtWyg5ICogKHNyYzEgKyBzcmMyKSAtIChzcmMwICArIHNyYzMpICsgOCkgPj4gNF07CisgICAgICAgIGRzdFsyICogZHN0U3RyaWRlXSA9IGNtWyg5ICogKHNyYzIgKyBzcmMzKSAtIChzcmMxICArIHNyYzQpICsgOCkgPj4gNF07CisgICAgICAgIGRzdFszICogZHN0U3RyaWRlXSA9IGNtWyg5ICogKHNyYzMgKyBzcmM0KSAtIChzcmMyICArIHNyYzUpICsgOCkgPj4gNF07CisgICAgICAgIGRzdFs0ICogZHN0U3RyaWRlXSA9IGNtWyg5ICogKHNyYzQgKyBzcmM1KSAtIChzcmMzICArIHNyYzYpICsgOCkgPj4gNF07CisgICAgICAgIGRzdFs1ICogZHN0U3RyaWRlXSA9IGNtWyg5ICogKHNyYzUgKyBzcmM2KSAtIChzcmM0ICArIHNyYzcpICsgOCkgPj4gNF07CisgICAgICAgIGRzdFs2ICogZHN0U3RyaWRlXSA9IGNtWyg5ICogKHNyYzYgKyBzcmM3KSAtIChzcmM1ICArIHNyYzgpICsgOCkgPj4gNF07CisgICAgICAgIGRzdFs3ICogZHN0U3RyaWRlXSA9IGNtWyg5ICogKHNyYzcgKyBzcmM4KSAtIChzcmM2ICArIHNyYzkpICsgOCkgPj4gNF07CisgICAgICAgIHNyYysrOworICAgICAgICBkc3QrKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9tc3BlbDhfbWMxMF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHVpbnQ4X3QgaGFsZls2NF07CisKKyAgICB3bXYyX21zcGVsOF9oX2xvd3Bhc3MoaGFsZiwgc3JjLCA4LCBzdHJpZGUsIDgpOworICAgIGZmX3B1dF9waXhlbHM4X2wyXzgoZHN0LCBzcmMsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCA4LCA4KTsKK30KKworc3RhdGljIHZvaWQgcHV0X21zcGVsOF9tYzIwX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgd212Ml9tc3BlbDhfaF9sb3dwYXNzKGRzdCwgc3JjLCBzdHJpZGUsIHN0cmlkZSwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9tc3BlbDhfbWMzMF9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHVpbnQ4X3QgaGFsZls2NF07CisKKyAgICB3bXYyX21zcGVsOF9oX2xvd3Bhc3MoaGFsZiwgc3JjLCA4LCBzdHJpZGUsIDgpOworICAgIGZmX3B1dF9waXhlbHM4X2wyXzgoZHN0LCBzcmMgKyAxLCBoYWxmLCBzdHJpZGUsIHN0cmlkZSwgOCwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9tc3BlbDhfbWMwMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHdtdjJfbXNwZWw4X3ZfbG93cGFzcyhkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUsIDgpOworfQorCitzdGF0aWMgdm9pZCBwdXRfbXNwZWw4X21jMTJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50OF90IGhhbGZIWzg4XTsKKyAgICB1aW50OF90IGhhbGZWWzY0XTsKKyAgICB1aW50OF90IGhhbGZIVls2NF07CisKKyAgICB3bXYyX21zcGVsOF9oX2xvd3Bhc3MoaGFsZkgsIHNyYyAtIHN0cmlkZSwgOCwgc3RyaWRlLCAxMSk7CisgICAgd212Ml9tc3BlbDhfdl9sb3dwYXNzKGhhbGZWLCBzcmMsIDgsIHN0cmlkZSwgOCk7CisgICAgd212Ml9tc3BlbDhfdl9sb3dwYXNzKGhhbGZIViwgaGFsZkggKyA4LCA4LCA4LCA4KTsKKyAgICBmZl9wdXRfcGl4ZWxzOF9sMl84KGRzdCwgaGFsZlYsIGhhbGZIViwgc3RyaWRlLCA4LCA4LCA4KTsKK30KKworc3RhdGljIHZvaWQgcHV0X21zcGVsOF9tYzMyX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgdWludDhfdCBoYWxmSFs4OF07CisgICAgdWludDhfdCBoYWxmVls2NF07CisgICAgdWludDhfdCBoYWxmSFZbNjRdOworCisgICAgd212Ml9tc3BlbDhfaF9sb3dwYXNzKGhhbGZILCBzcmMgLSBzdHJpZGUsIDgsIHN0cmlkZSwgMTEpOworICAgIHdtdjJfbXNwZWw4X3ZfbG93cGFzcyhoYWxmViwgc3JjICsgMSwgOCwgc3RyaWRlLCA4KTsKKyAgICB3bXYyX21zcGVsOF92X2xvd3Bhc3MoaGFsZkhWLCBoYWxmSCArIDgsIDgsIDgsIDgpOworICAgIGZmX3B1dF9waXhlbHM4X2wyXzgoZHN0LCBoYWxmViwgaGFsZkhWLCBzdHJpZGUsIDgsIDgsIDgpOworfQorCitzdGF0aWMgdm9pZCBwdXRfbXNwZWw4X21jMjJfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50OF90IGhhbGZIWzg4XTsKKworICAgIHdtdjJfbXNwZWw4X2hfbG93cGFzcyhoYWxmSCwgc3JjIC0gc3RyaWRlLCA4LCBzdHJpZGUsIDExKTsKKyAgICB3bXYyX21zcGVsOF92X2xvd3Bhc3MoZHN0LCBoYWxmSCArIDgsIHN0cmlkZSwgOCwgOCk7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl93bXYyZHNwX2luaXQoV01WMkRTUENvbnRleHQgKmMpCit7CisgICAgYy0+aWRjdF9hZGQgID0gd212Ml9pZGN0X2FkZF9jOworICAgIGMtPmlkY3RfcHV0ICA9IHdtdjJfaWRjdF9wdXRfYzsKKyAgICBjLT5pZGN0X3Blcm0gPSBGRl9JRENUX1BFUk1fTk9ORTsKKworICAgIGMtPnB1dF9tc3BlbF9waXhlbHNfdGFiWzBdID0gZmZfcHV0X3BpeGVsczh4OF9jOworICAgIGMtPnB1dF9tc3BlbF9waXhlbHNfdGFiWzFdID0gcHV0X21zcGVsOF9tYzEwX2M7CisgICAgYy0+cHV0X21zcGVsX3BpeGVsc190YWJbMl0gPSBwdXRfbXNwZWw4X21jMjBfYzsKKyAgICBjLT5wdXRfbXNwZWxfcGl4ZWxzX3RhYlszXSA9IHB1dF9tc3BlbDhfbWMzMF9jOworICAgIGMtPnB1dF9tc3BlbF9waXhlbHNfdGFiWzRdID0gcHV0X21zcGVsOF9tYzAyX2M7CisgICAgYy0+cHV0X21zcGVsX3BpeGVsc190YWJbNV0gPSBwdXRfbXNwZWw4X21jMTJfYzsKKyAgICBjLT5wdXRfbXNwZWxfcGl4ZWxzX3RhYls2XSA9IHB1dF9tc3BlbDhfbWMyMl9jOworICAgIGMtPnB1dF9tc3BlbF9waXhlbHNfdGFiWzddID0gcHV0X21zcGVsOF9tYzMyX2M7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy93bXYyZHNwLmggYi9mZm1wZWcvbGliYXZjb2RlYy93bXYyZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmOTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtdjJkc3AuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19XTVYyRFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19XTVYyRFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAicXBlbGRzcC5oIgorCit0eXBlZGVmIHN0cnVjdCBXTVYyRFNQQ29udGV4dCB7CisgICAgdm9pZCAoKmlkY3RfYWRkKSh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CisgICAgdm9pZCAoKmlkY3RfcHV0KSh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CisKKyAgICBxcGVsX21jX2Z1bmMgcHV0X21zcGVsX3BpeGVsc190YWJbOF07CisKKyAgICBpbnQgaWRjdF9wZXJtOworfSBXTVYyRFNQQ29udGV4dDsKKwordm9pZCBmZl93bXYyZHNwX2luaXQoV01WMkRTUENvbnRleHQgKmMpOworCisjZW5kaWYgLyogQVZDT0RFQ19XTVYyRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3dtdjJlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3dtdjJlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmU5OWMwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvd212MmVuYy5jCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJtc21wZWc0LmgiCisjaW5jbHVkZSAibXNtcGVnNGRhdGEuaCIKKyNpbmNsdWRlICJ3bXYyLmgiCisKKworc3RhdGljIGludCBlbmNvZGVfZXh0X2hlYWRlcihXbXYyQ29udGV4dCAqdykKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqY29uc3QgcyA9ICZ3LT5zOworICAgIFB1dEJpdENvbnRleHQgcGI7CisgICAgaW50IGNvZGU7CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgcy0+YXZjdHgtPmV4dHJhZGF0YSwgcy0+YXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKworICAgIHB1dF9iaXRzKCZwYiwgNSwgcy0+YXZjdHgtPnRpbWVfYmFzZS5kZW4gLyBzLT5hdmN0eC0+dGltZV9iYXNlLm51bSk7IC8vIHllcyAyOS45NyAtPiAyOQorICAgIHB1dF9iaXRzKCZwYiwgMTEsIEZGTUlOKHMtPmJpdF9yYXRlIC8gMTAyNCwgMjA0NykpOworCisgICAgcHV0X2JpdHMoJnBiLCAxLCB3LT5tc3BlbF9iaXQgICAgICAgID0gMSk7CisgICAgcHV0X2JpdHMoJnBiLCAxLCBzLT5sb29wX2ZpbHRlcik7CisgICAgcHV0X2JpdHMoJnBiLCAxLCB3LT5hYnRfZmxhZyAgICAgICAgID0gMSk7CisgICAgcHV0X2JpdHMoJnBiLCAxLCB3LT5qX3R5cGVfYml0ICAgICAgID0gMSk7CisgICAgcHV0X2JpdHMoJnBiLCAxLCB3LT50b3BfbGVmdF9tdl9mbGFnID0gMCk7CisgICAgcHV0X2JpdHMoJnBiLCAxLCB3LT5wZXJfbWJfcmxfYml0ICAgID0gMSk7CisgICAgcHV0X2JpdHMoJnBiLCAzLCBjb2RlICAgICAgICAgICAgICAgID0gMSk7CisKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworCisgICAgcy0+c2xpY2VfaGVpZ2h0ID0gcy0+bWJfaGVpZ2h0IC8gY29kZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgd212Ml9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgV212MkNvbnRleHQgKmNvbnN0IHcgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGZmX21wdl9lbmNvZGVfaW5pdChhdmN0eCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmZl93bXYyX2NvbW1vbl9pbml0KHcpOworCisgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gNDsKKyAgICBhdmN0eC0+ZXh0cmFkYXRhICAgICAgPSBhdl9tYWxsb2N6KGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBlbmNvZGVfZXh0X2hlYWRlcih3KTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfd212Ml9lbmNvZGVfcGljdHVyZV9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBwaWN0dXJlX251bWJlcikKK3sKKyAgICBXbXYyQ29udGV4dCAqY29uc3QgdyA9IChXbXYyQ29udGV4dCAqKSBzOworCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5waWN0X3R5cGUgLSAxKTsKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKQorICAgICAgICBwdXRfYml0cygmcy0+cGIsIDcsIDApOworICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgcy0+cXNjYWxlKTsKKworICAgIHMtPmRjX3RhYmxlX2luZGV4ICA9IDE7CisgICAgcy0+bXZfdGFibGVfaW5kZXggID0gMTsgLyogb25seSBpZiBQIGZyYW1lICovCisgICAgcy0+cGVyX21iX3JsX3RhYmxlID0gMDsKKyAgICBzLT5tc3BlbCAgICAgICAgICAgPSAwOworICAgIHctPnBlcl9tYl9hYnQgICAgICA9IDA7CisgICAgdy0+YWJ0X3R5cGUgICAgICAgID0gMDsKKyAgICB3LT5qX3R5cGUgICAgICAgICAgPSAwOworCisgICAgYXZfYXNzZXJ0MChzLT5mbGlwZmxvcF9yb3VuZGluZyk7CisKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgIGF2X2Fzc2VydDAocy0+bm9fcm91bmRpbmcgPT0gMSk7CisgICAgICAgIGlmICh3LT5qX3R5cGVfYml0KQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCB3LT5qX3R5cGUpOworCisgICAgICAgIGlmICh3LT5wZXJfbWJfcmxfYml0KQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5wZXJfbWJfcmxfdGFibGUpOworCisgICAgICAgIGlmICghcy0+cGVyX21iX3JsX3RhYmxlKSB7CisgICAgICAgICAgICBmZl9tc21wZWc0X2NvZGUwMTIoJnMtPnBiLCBzLT5ybF9jaHJvbWFfdGFibGVfaW5kZXgpOworICAgICAgICAgICAgZmZfbXNtcGVnNF9jb2RlMDEyKCZzLT5wYiwgcy0+cmxfdGFibGVfaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5kY190YWJsZV9pbmRleCk7CisKKyAgICAgICAgcy0+aW50ZXJfaW50cmFfcHJlZCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGNicF9pbmRleDsKKworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIFNLSVBfVFlQRV9OT05FKTsKKworICAgICAgICBmZl9tc21wZWc0X2NvZGUwMTIoJnMtPnBiLCBjYnBfaW5kZXggPSAwKTsKKyAgICAgICAgaWYgKHMtPnFzY2FsZSA8PSAxMCkgeworICAgICAgICAgICAgaW50IG1hcFszXSAgICAgICAgID0geyAwLCAyLCAxIH07CisgICAgICAgICAgICB3LT5jYnBfdGFibGVfaW5kZXggPSBtYXBbY2JwX2luZGV4XTsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5xc2NhbGUgPD0gMjApIHsKKyAgICAgICAgICAgIGludCBtYXBbM10gICAgICAgICA9IHsgMSwgMCwgMiB9OworICAgICAgICAgICAgdy0+Y2JwX3RhYmxlX2luZGV4ID0gbWFwW2NicF9pbmRleF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgbWFwWzNdICAgICAgICAgPSB7IDIsIDEsIDAgfTsKKyAgICAgICAgICAgIHctPmNicF90YWJsZV9pbmRleCA9IG1hcFtjYnBfaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHctPm1zcGVsX2JpdCkKKyAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+bXNwZWwpOworCisgICAgICAgIGlmICh3LT5hYnRfZmxhZykgeworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCB3LT5wZXJfbWJfYWJ0IF4gMSk7CisgICAgICAgICAgICBpZiAoIXctPnBlcl9tYl9hYnQpCisgICAgICAgICAgICAgICAgZmZfbXNtcGVnNF9jb2RlMDEyKCZzLT5wYiwgdy0+YWJ0X3R5cGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHctPnBlcl9tYl9ybF9iaXQpCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPnBlcl9tYl9ybF90YWJsZSk7CisKKyAgICAgICAgaWYgKCFzLT5wZXJfbWJfcmxfdGFibGUpIHsKKyAgICAgICAgICAgIGZmX21zbXBlZzRfY29kZTAxMigmcy0+cGIsIHMtPnJsX3RhYmxlX2luZGV4KTsKKyAgICAgICAgICAgIHMtPnJsX2Nocm9tYV90YWJsZV9pbmRleCA9IHMtPnJsX3RhYmxlX2luZGV4OworICAgICAgICB9CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgcy0+ZGNfdGFibGVfaW5kZXgpOworICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPm12X3RhYmxlX2luZGV4KTsKKworICAgICAgICBzLT5pbnRlcl9pbnRyYV9wcmVkID0gMDsgLy8gKHMtPndpZHRoICogcy0+aGVpZ2h0IDwgMzIwICogMjQwICYmIHMtPmJpdF9yYXRlIDw9IElJX0JJVFJBVEUpOworICAgIH0KKyAgICBzLT5lc2MzX2xldmVsX2xlbmd0aCA9IDA7CisgICAgcy0+ZXNjM19ydW5fbGVuZ3RoICAgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIE5lYXJseSBpZGVudGljYWwgdG8gd212MSBidXQgdGhhdCBpcyBqdXN0IGJlY2F1c2Ugd2UgZG8gbm90IHVzZSB0aGUKKyAqIHVzZWxlc3MgTSQgY3JhcCBmZWF0dXJlcy4gSXQgaXMgZHVwbGljYXRlZCBoZXJlIGluIGNhc2Ugc29tZW9uZSB3YW50cworICogdG8gYWRkIHN1cHBvcnQgZm9yIHRoZXNlIGNyYXAgZmVhdHVyZXMuICovCit2b2lkIGZmX3dtdjJfZW5jb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzZdWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3kpCit7CisgICAgV212MkNvbnRleHQgKmNvbnN0IHcgPSAoV212MkNvbnRleHQgKikgczsKKyAgICBpbnQgY2JwLCBjb2RlZF9jYnAsIGk7CisgICAgaW50IHByZWRfeCwgcHJlZF95OworICAgIHVpbnQ4X3QgKmNvZGVkX2Jsb2NrOworCisgICAgZmZfbXNtcGVnNF9oYW5kbGVfc2xpY2VzKHMpOworCisgICAgaWYgKCFzLT5tYl9pbnRyYSkgeworICAgICAgICAvKiBjb21wdXRlIGNicCAqLworICAgICAgICBjYnAgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgaWYgKHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPj0gMCkKKyAgICAgICAgICAgICAgICBjYnAgfD0gMSA8PCAoNSAtIGkpOworCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwKKyAgICAgICAgICAgICAgICAgZmZfd212Ml9pbnRlcl90YWJsZVt3LT5jYnBfdGFibGVfaW5kZXhdW2NicCArIDY0XVsxXSwKKyAgICAgICAgICAgICAgICAgZmZfd212Ml9pbnRlcl90YWJsZVt3LT5jYnBfdGFibGVfaW5kZXhdW2NicCArIDY0XVswXSk7CisKKyAgICAgICAgcy0+bWlzY19iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisgICAgICAgIC8qIG1vdGlvbiB2ZWN0b3IgKi8KKyAgICAgICAgZmZfaDI2M19wcmVkX21vdGlvbihzLCAwLCAwLCAmcHJlZF94LCAmcHJlZF95KTsKKyAgICAgICAgZmZfbXNtcGVnNF9lbmNvZGVfbW90aW9uKHMsIG1vdGlvbl94IC0gcHJlZF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3kgLSBwcmVkX3kpOworICAgICAgICBzLT5tdl9iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogY29tcHV0ZSBjYnAgKi8KKyAgICAgICAgY2JwICAgICAgID0gMDsKKyAgICAgICAgY29kZWRfY2JwID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgaW50IHZhbCwgcHJlZDsKKyAgICAgICAgICAgIHZhbCAgPSAocy0+YmxvY2tfbGFzdF9pbmRleFtpXSA+PSAxKTsKKyAgICAgICAgICAgIGNicCB8PSB2YWwgPDwgKDUgLSBpKTsKKyAgICAgICAgICAgIGlmIChpIDwgNCkgeworICAgICAgICAgICAgICAgIC8qIHByZWRpY3QgdmFsdWUgZm9yIGNsb3NlIGJsb2NrcyBvbmx5IGZvciBsdW1hICovCisgICAgICAgICAgICAgICAgcHJlZCAgICAgICAgID0gZmZfbXNtcGVnNF9jb2RlZF9ibG9ja19wcmVkKHMsIGksICZjb2RlZF9ibG9jayk7CisgICAgICAgICAgICAgICAgKmNvZGVkX2Jsb2NrID0gdmFsOworICAgICAgICAgICAgICAgIHZhbCAgICAgICAgICA9IHZhbCBeIHByZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlZF9jYnAgfD0gdmFsIDw8ICg1IC0gaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgZmZfbXNtcDRfbWJfaV90YWJsZVtjb2RlZF9jYnBdWzFdLAorICAgICAgICAgICAgICAgICAgICAgZmZfbXNtcDRfbWJfaV90YWJsZVtjb2RlZF9jYnBdWzBdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgZmZfd212Ml9pbnRlcl90YWJsZVt3LT5jYnBfdGFibGVfaW5kZXhdW2NicF1bMV0sCisgICAgICAgICAgICAgICAgICAgICBmZl93bXYyX2ludGVyX3RhYmxlW3ctPmNicF90YWJsZV9pbmRleF1bY2JwXVswXSk7CisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgLyogbm8gQUMgcHJlZGljdGlvbiB5ZXQgKi8KKyAgICAgICAgaWYgKHMtPmludGVyX2ludHJhX3ByZWQpIHsKKyAgICAgICAgICAgIHMtPmgyNjNfYWljX2RpciA9IDA7CisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsCisgICAgICAgICAgICAgICAgICAgICBmZl90YWJsZV9pbnRlcl9pbnRyYVtzLT5oMjYzX2FpY19kaXJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgZmZfdGFibGVfaW50ZXJfaW50cmFbcy0+aDI2M19haWNfZGlyXVswXSk7CisgICAgICAgIH0KKyAgICAgICAgcy0+bWlzY19iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgZmZfbXNtcGVnNF9lbmNvZGVfYmxvY2socywgYmxvY2tbaV0sIGkpOworICAgIGlmIChzLT5tYl9pbnRyYSkKKyAgICAgICAgcy0+aV90ZXhfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworICAgIGVsc2UKKyAgICAgICAgcy0+cF90ZXhfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworfQorCitGRl9NUFZfR0VORVJJQ19DTEFTUyh3bXYyKQorCitBVkNvZGVjIGZmX3dtdjJfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid212MiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldpbmRvd3MgTWVkaWEgVmlkZW8gOCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XTVYyLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihXbXYyQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gd212Ml9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBmZl9tcHZfZW5jb2RlX3BpY3R1cmUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9lbmQsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJndtdjJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvd252MS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvd252MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWVlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy93bnYxLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBXaW5ub3YgV05WMSBjb2RlYworICogQ29weXJpZ2h0IChjKSAyMDA1IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogV2lubm92IFdOVjEgY29kZWMuCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCisKK3R5cGVkZWYgc3RydWN0IFdOVjFDb250ZXh0IHsKKyAgICBpbnQgc2hpZnQ7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKK30gV05WMUNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjb2RlX3RhYlsxNl1bMl0gPSB7CisgICAgeyAweDFGRCwgOSB9LCB7IDB4RkQsIDggfSwgeyAweDdELCA3IH0sIHsgMHgzRCwgNiB9LCB7IDB4MUQsIDUgfSwgeyAweDBELCA0IH0sIHsgMHgwMDUsIDMgfSwKKyAgICB7IDB4MDAwLCAxIH0sCisgICAgeyAweDAwNCwgMyB9LCB7IDB4MEMsIDQgfSwgeyAweDFDLCA1IH0sIHsgMHgzQywgNiB9LCB7IDB4N0MsIDcgfSwgeyAweEZDLCA4IH0sIHsgMHgxRkMsIDkgfSwgeyAweEZGLCA4IH0KK307CisKKyNkZWZpbmUgQ09ERV9WTENfQklUUyA5CitzdGF0aWMgVkxDIGNvZGVfdmxjOworCisvKiByZXR1cm5zIG1vZGlmaWVkIGJhc2VfdmFsdWUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHdudjFfZ2V0X2NvZGUoV05WMUNvbnRleHQgKncsIGludCBiYXNlX3ZhbHVlKQoreworICAgIGludCB2ID0gZ2V0X3ZsYzIoJnctPmdiLCBjb2RlX3ZsYy50YWJsZSwgQ09ERV9WTENfQklUUywgMSk7CisKKyAgICBpZiAodiA9PSAxNSkKKyAgICAgICAgcmV0dXJuIGZmX3JldmVyc2VbZ2V0X2JpdHMoJnctPmdiLCA4IC0gdy0+c2hpZnQpXTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBiYXNlX3ZhbHVlICsgKCh2IC0gNykgPDwgdy0+c2hpZnQpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBXTlYxQ29udGV4dCAqIGNvbnN0IGwgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiAgICA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgICA9IGF2cGt0LT5zaXplOworICAgIEFWRnJhbWUgKiBjb25zdCBwICAgICA9IGRhdGE7CisgICAgdW5zaWduZWQgY2hhciAqWSwqVSwqVjsKKyAgICBpbnQgaSwgaiwgcmV0OworICAgIGludCBwcmV2X3kgPSAwLCBwcmV2X3UgPSAwLCBwcmV2X3YgPSAwOworICAgIHVpbnQ4X3QgKnJidWY7CisKKyAgICBpZiAoYnVmX3NpemUgPD0gOCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCBzaXplICVkIGlzIHRvbyBzbWFsbFxuIiwgYnVmX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByYnVmID0gYXZfbWFsbG9jKGJ1Zl9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFyYnVmKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBtZW1zZXQocmJ1ZiArIGJ1Zl9zaXplLCAwLCBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcCwgMCkpIDwgMCkgeworICAgICAgICBhdl9mcmVlKHJidWYpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBwLT5rZXlfZnJhbWUgPSAxOworCisgICAgZm9yIChpID0gODsgaSA8IGJ1Zl9zaXplOyBpKyspCisgICAgICAgIHJidWZbaV0gPSBmZl9yZXZlcnNlW2J1ZltpXV07CisgICAgaW5pdF9nZXRfYml0cygmbC0+Z2IsIHJidWYgKyA4LCAoYnVmX3NpemUgLSA4KSAqIDgpOworCisgICAgaWYgKGJ1ZlsyXSA+PiA0ID09IDYpCisgICAgICAgIGwtPnNoaWZ0ID0gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgbC0+c2hpZnQgPSA4IC0gKGJ1ZlsyXSA+PiA0KTsKKyAgICAgICAgaWYgKGwtPnNoaWZ0ID4gNCkgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIFdOVjEgZnJhbWUgaGVhZGVyIHZhbHVlICVpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbMl0gPj4gNCk7CisgICAgICAgICAgICBsLT5zaGlmdCA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGwtPnNoaWZ0IDwgMSkgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIFdOVjEgZnJhbWUgaGVhZGVyIHZhbHVlICVpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbMl0gPj4gNCk7CisgICAgICAgICAgICBsLT5zaGlmdCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBZID0gcC0+ZGF0YVswXTsKKyAgICBVID0gcC0+ZGF0YVsxXTsKKyAgICBWID0gcC0+ZGF0YVsyXTsKKyAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPmhlaWdodDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+d2lkdGggLyAyOyBpKyspIHsKKyAgICAgICAgICAgIFlbaSAqIDJdID0gd252MV9nZXRfY29kZShsLCBwcmV2X3kpOworICAgICAgICAgICAgcHJldl91ID0gVVtpXSA9IHdudjFfZ2V0X2NvZGUobCwgcHJldl91KTsKKyAgICAgICAgICAgIHByZXZfeSA9IFlbKGkgKiAyKSArIDFdID0gd252MV9nZXRfY29kZShsLCBZW2kgKiAyXSk7CisgICAgICAgICAgICBwcmV2X3YgPSBWW2ldID0gd252MV9nZXRfY29kZShsLCBwcmV2X3YpOworICAgICAgICB9CisgICAgICAgIFkgKz0gcC0+bGluZXNpemVbMF07CisgICAgICAgIFUgKz0gcC0+bGluZXNpemVbMV07CisgICAgICAgIFYgKz0gcC0+bGluZXNpemVbMl07CisgICAgfQorCisKKyAgICAqZ290X2ZyYW1lICAgICAgPSAxOworICAgIGF2X2ZyZWUocmJ1Zik7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgc3RhdGljIFZMQ19UWVBFIGNvZGVfdGFibGVbMSA8PCBDT0RFX1ZMQ19CSVRTXVsyXTsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworCisgICAgY29kZV92bGMudGFibGUgICAgICAgICAgID0gY29kZV90YWJsZTsKKyAgICBjb2RlX3ZsYy50YWJsZV9hbGxvY2F0ZWQgPSAxIDw8IENPREVfVkxDX0JJVFM7CisgICAgaW5pdF92bGMoJmNvZGVfdmxjLCBDT0RFX1ZMQ19CSVRTLCAxNiwKKyAgICAgICAgICAgICAmY29kZV90YWJbMF1bMV0sIDQsIDIsCisgICAgICAgICAgICAgJmNvZGVfdGFiWzBdWzBdLCA0LCAyLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl93bnYxX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIndudjEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5ub3YgV05WMSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XTlYxLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihXTlYxQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMvd3Mtc25kMS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMvd3Mtc25kMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjljYmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy93cy1zbmQxLmMKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBXZXN0d29vZCBTTkR4IGNvZGVjcworICogQ29weXJpZ2h0IChjKSAyMDA1IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyoqCisgKiBAZmlsZQorICogV2VzdHdvb2QgU05EeCBjb2RlY3MKKyAqCisgKiBSZWZlcmVuY2UgZG9jdW1lbnRzIGFib3V0IFZRQSBmb3JtYXQgYW5kIGl0cyBhdWRpbyBjb2RlY3MKKyAqIGNhbiBiZSBmb3VuZCBoZXJlOgorICogaHR0cDovL3d3dy5tdWx0aW1lZGlhLmN4CisgKi8KKworc3RhdGljIGNvbnN0IGludDhfdCB3c19hZHBjbV80Yml0W10gPSB7CisgICAgLTksIC04LCAtNiwgLTUsIC00LCAtMywgLTIsIC0xLAorICAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgOAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IHdzX3NuZF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCAgICAgPSBBVl9TQU1QTEVfRk1UX1U4OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3Nfc25kX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKKworICAgIGludCBpbl9zaXplLCBvdXRfc2l6ZSwgcmV0OworICAgIGludCBzYW1wbGUgPSAxMjg7CisgICAgdWludDhfdCAqc2FtcGxlczsKKyAgICB1aW50OF90ICpzYW1wbGVzX2VuZDsKKworICAgIGlmICghYnVmX3NpemUpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGJ1Zl9zaXplIDwgNCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBhY2tldCBpcyB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG91dF9zaXplID0gQVZfUkwxNigmYnVmWzBdKTsKKyAgICBpbl9zaXplICA9IEFWX1JMMTYoJmJ1ZlsyXSk7CisgICAgYnVmICs9IDQ7CisKKyAgICBpZiAoaW5fc2l6ZSA+IGJ1Zl9zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRnJhbWUgZGF0YSBpcyBsYXJnZXIgdGhhbiBpbnB1dCBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gb3V0X3NpemU7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzYW1wbGVzICAgICA9IGZyYW1lLT5kYXRhWzBdOworICAgIHNhbXBsZXNfZW5kID0gc2FtcGxlcyArIG91dF9zaXplOworCisgICAgaWYgKGluX3NpemUgPT0gb3V0X3NpemUpIHsKKyAgICAgICAgbWVtY3B5KHNhbXBsZXMsIGJ1Ziwgb3V0X3NpemUpOworICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICB9CisKKyAgICB3aGlsZSAoc2FtcGxlcyA8IHNhbXBsZXNfZW5kICYmIGJ1ZiAtIGF2cGt0LT5kYXRhIDwgYnVmX3NpemUpIHsKKyAgICAgICAgaW50IGNvZGUsIHNtcCwgc2l6ZTsKKyAgICAgICAgdWludDhfdCBjb3VudDsKKyAgICAgICAgY29kZSAgPSAqYnVmID4+IDY7CisgICAgICAgIGNvdW50ID0gKmJ1ZiAmIDB4M0Y7CisgICAgICAgIGJ1ZisrOworCisgICAgICAgIC8qIG1ha2Ugc3VyZSB3ZSBkb24ndCB3cml0ZSBwYXN0IHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIDA6ICBzbXAgPSA0ICogKGNvdW50ICsgMSk7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6ICBzbXAgPSAyICogKGNvdW50ICsgMSk7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6ICBzbXAgPSAoY291bnQgJiAweDIwKSA/IDEgOiBjb3VudCArIDE7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzbXAgPSBjb3VudCArIDE7ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChzYW1wbGVzX2VuZCAtIHNhbXBsZXMgPCBzbXApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgcmVhZCBwYXN0IHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICAgICAgc2l6ZSA9ICgoY29kZSA9PSAyICYmIChjb3VudCAmIDB4MjApKSB8fCBjb2RlID09IDMpID8gMCA6IGNvdW50ICsgMTsKKyAgICAgICAgaWYgKChidWYgLSBhdnBrdC0+ZGF0YSkgKyBzaXplID4gYnVmX3NpemUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSAwOiAvKiBBRFBDTSAyLWJpdCAqLworICAgICAgICAgICAgZm9yIChjb3VudCsrOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKyAgICAgICAgICAgICAgICBjb2RlID0gKmJ1ZisrOworICAgICAgICAgICAgICAgIHNhbXBsZSArPSAoIGNvZGUgICAgICAgJiAweDMpIC0gMjsKKyAgICAgICAgICAgICAgICBzYW1wbGUgPSBhdl9jbGlwX3VpbnQ4KHNhbXBsZSk7CisgICAgICAgICAgICAgICAgKnNhbXBsZXMrKyA9IHNhbXBsZTsKKyAgICAgICAgICAgICAgICBzYW1wbGUgKz0gKChjb2RlID4+IDIpICYgMHgzKSAtIDI7CisgICAgICAgICAgICAgICAgc2FtcGxlID0gYXZfY2xpcF91aW50OChzYW1wbGUpOworICAgICAgICAgICAgICAgICpzYW1wbGVzKysgPSBzYW1wbGU7CisgICAgICAgICAgICAgICAgc2FtcGxlICs9ICgoY29kZSA+PiA0KSAmIDB4MykgLSAyOworICAgICAgICAgICAgICAgIHNhbXBsZSA9IGF2X2NsaXBfdWludDgoc2FtcGxlKTsKKyAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gc2FtcGxlOworICAgICAgICAgICAgICAgIHNhbXBsZSArPSAgKGNvZGUgPj4gNikgICAgICAgIC0gMjsKKyAgICAgICAgICAgICAgICBzYW1wbGUgPSBhdl9jbGlwX3VpbnQ4KHNhbXBsZSk7CisgICAgICAgICAgICAgICAgKnNhbXBsZXMrKyA9IHNhbXBsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8qIEFEUENNIDQtYml0ICovCisgICAgICAgICAgICBmb3IgKGNvdW50Kys7IGNvdW50ID4gMDsgY291bnQtLSkgeworICAgICAgICAgICAgICAgIGNvZGUgPSAqYnVmKys7CisgICAgICAgICAgICAgICAgc2FtcGxlICs9IHdzX2FkcGNtXzRiaXRbY29kZSAmIDB4Rl07CisgICAgICAgICAgICAgICAgc2FtcGxlID0gYXZfY2xpcF91aW50OChzYW1wbGUpOworICAgICAgICAgICAgICAgICpzYW1wbGVzKysgPSBzYW1wbGU7CisgICAgICAgICAgICAgICAgc2FtcGxlICs9IHdzX2FkcGNtXzRiaXRbY29kZSA+PiA0XTsKKyAgICAgICAgICAgICAgICBzYW1wbGUgPSBhdl9jbGlwX3VpbnQ4KHNhbXBsZSk7CisgICAgICAgICAgICAgICAgKnNhbXBsZXMrKyA9IHNhbXBsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IC8qIG5vIGNvbXByZXNzaW9uICovCisgICAgICAgICAgICBpZiAoY291bnQgJiAweDIwKSB7IC8qIGJpZyBkZWx0YSAqLworICAgICAgICAgICAgICAgIGludDhfdCB0OworICAgICAgICAgICAgICAgIHQgPSBjb3VudDsKKyAgICAgICAgICAgICAgICB0IDw8PSAzOworICAgICAgICAgICAgICAgIHNhbXBsZSArPSB0ID4+IDM7CisgICAgICAgICAgICAgICAgc2FtcGxlID0gYXZfY2xpcF91aW50OChzYW1wbGUpOworICAgICAgICAgICAgICAgICpzYW1wbGVzKysgPSBzYW1wbGU7CisgICAgICAgICAgICB9IGVsc2UgeyAvKiBjb3B5ICovCisgICAgICAgICAgICAgICAgbWVtY3B5KHNhbXBsZXMsIGJ1Ziwgc21wKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVzICs9IHNtcDsKKyAgICAgICAgICAgICAgICBidWYgICAgICs9IHNtcDsKKyAgICAgICAgICAgICAgICBzYW1wbGUgPSBidWZbLTFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8qIHJ1biAqLworICAgICAgICAgICAgbWVtc2V0KHNhbXBsZXMsIHNhbXBsZSwgc21wKTsKKyAgICAgICAgICAgIHNhbXBsZXMgKz0gc21wOworICAgICAgICB9CisgICAgfQorCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBzYW1wbGVzIC0gZnJhbWUtPmRhdGFbMF07CisgICAgKmdvdF9mcmFtZV9wdHIgICAgPSAxOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitBVkNvZGVjIGZmX3dzX3NuZDFfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid3Nfc25kMSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldlc3R3b29kIEF1ZGlvIChTTkQxKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XRVNUV09PRF9TTkQxLAorICAgIC5pbml0ICAgICAgICAgICA9IHdzX3NuZF9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSB3c19zbmRfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L01ha2VmaWxlIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOGU3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvTWFrZWZpbGUKQEAgLTAsMCArMSwxNjEgQEAKK09CSlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IHg4Ni9jb25zdGFudHMubyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9mbXRjb252ZXJ0X2luaXQubyAgICAgICAgIFwKKworIyBzdWJzeXN0ZW1zCitPQkpTLSQoQ09ORklHX0FDM0RTUCkgICAgICAgICAgICAgICAgICArPSB4ODYvYWMzZHNwX2luaXQubworT0JKUy0kKENPTkZJR19BVURJT0RTUCkgICAgICAgICAgICAgICAgKz0geDg2L2F1ZGlvZHNwX2luaXQubworT0JKUy0kKENPTkZJR19CTE9DS0RTUCkgICAgICAgICAgICAgICAgKz0geDg2L2Jsb2NrZHNwX2luaXQubworT0JKUy0kKENPTkZJR19CU1dBUERTUCkgICAgICAgICAgICAgICAgKz0geDg2L2Jzd2FwZHNwX2luaXQubworT0JKUy0kKENPTkZJR19EQ1QpICAgICAgICAgICAgICAgICAgICAgKz0geDg2L2RjdF9pbml0Lm8KK09CSlMtJChDT05GSUdfRkRDVERTUCkgICAgICAgICAgICAgICAgICs9IHg4Ni9mZGN0ZHNwX2luaXQubworT0JKUy0kKENPTkZJR19GRlQpICAgICAgICAgICAgICAgICAgICAgKz0geDg2L2ZmdF9pbml0Lm8KK09CSlMtJChDT05GSUdfRkxBQ19ERUNPREVSKSAgICAgICAgICAgICs9IHg4Ni9mbGFjZHNwX2luaXQubworT0JKUy0kKENPTkZJR19GTEFDX0VOQ09ERVIpICAgICAgICAgICAgKz0geDg2L2ZsYWNkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX0gyNjNEU1ApICAgICAgICAgICAgICAgICArPSB4ODYvaDI2M2RzcF9pbml0Lm8KK09CSlMtJChDT05GSUdfSDI2NENIUk9NQSkgICAgICAgICAgICAgICs9IHg4Ni9oMjY0Y2hyb21hX2luaXQubworT0JKUy0kKENPTkZJR19IMjY0RFNQKSAgICAgICAgICAgICAgICAgKz0geDg2L2gyNjRkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX0gyNjRQUkVEKSAgICAgICAgICAgICAgICArPSB4ODYvaDI2NF9pbnRyYXByZWRfaW5pdC5vCitPQkpTLSQoQ09ORklHX0gyNjRRUEVMKSAgICAgICAgICAgICAgICArPSB4ODYvaDI2NF9xcGVsLm8KK09CSlMtJChDT05GSUdfSFBFTERTUCkgICAgICAgICAgICAgICAgICs9IHg4Ni9ocGVsZHNwX2luaXQubworT0JKUy0kKENPTkZJR19MTEFVRERTUCkgICAgICAgICAgICAgICAgKz0geDg2L2xvc3NsZXNzX2F1ZGlvZHNwX2luaXQubworT0JKUy0kKENPTkZJR19MTFZJRERTUCkgICAgICAgICAgICAgICAgKz0geDg2L2xvc3NsZXNzX3ZpZGVvZHNwX2luaXQubworT0JKUy0kKENPTkZJR19IVUZGWVVWRFNQKSAgICAgICAgICAgICAgKz0geDg2L2h1ZmZ5dXZkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX0hVRkZZVVZFTkNEU1ApICAgICAgICAgICArPSB4ODYvaHVmZnl1dmVuY2RzcF9tbXgubworT0JKUy0kKENPTkZJR19JRENURFNQKSAgICAgICAgICAgICAgICAgKz0geDg2L2lkY3Rkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX0xQQykgICAgICAgICAgICAgICAgICAgICArPSB4ODYvbHBjLm8KK09CSlMtJChDT05GSUdfTUVfQ01QKSAgICAgICAgICAgICAgICAgICs9IHg4Ni9tZV9jbXBfaW5pdC5vCitPQkpTLSQoQ09ORklHX01QRUdBVURJT0RTUCkgICAgICAgICAgICArPSB4ODYvbXBlZ2F1ZGlvZHNwLm8KK09CSlMtJChDT05GSUdfTVBFR1ZJREVPKSAgICAgICAgICAgICAgICs9IHg4Ni9tcGVndmlkZW8ubyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L21wZWd2aWRlb2RzcC5vCitPQkpTLSQoQ09ORklHX01QRUdWSURFT0VOQykgICAgICAgICAgICArPSB4ODYvbXBlZ3ZpZGVvZW5jLm8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9tcGVndmlkZW9lbmNkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX1BJWEJMT0NLRFNQKSAgICAgICAgICAgICArPSB4ODYvcGl4YmxvY2tkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX1FQRUxEU1ApICAgICAgICAgICAgICAgICArPSB4ODYvcXBlbGRzcF9pbml0Lm8KK09CSlMtJChDT05GSUdfVklERU9EU1ApICAgICAgICAgICAgICAgICs9IHg4Ni92aWRlb2RzcF9pbml0Lm8KK09CSlMtJChDT05GSUdfVlAzRFNQKSAgICAgICAgICAgICAgICAgICs9IHg4Ni92cDNkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX1hNTV9DTE9CQkVSX1RFU1QpICAgICAgICArPSB4ODYvdzY0eG1tdGVzdC5vCisKKyMgZGVjb2RlcnMvZW5jb2RlcnMKK09CSlMtJChDT05GSUdfQUFDX0RFQ09ERVIpICAgICAgICAgICAgICs9IHg4Ni9zYnJkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX0FQTkdfREVDT0RFUikgICAgICAgICAgICArPSB4ODYvcG5nZHNwX2luaXQubworT0JKUy0kKENPTkZJR19DQVZTX0RFQ09ERVIpICAgICAgICAgICAgKz0geDg2L2NhdnNkc3AubworT0JKUy0kKENPTkZJR19EQ0FfREVDT0RFUikgICAgICAgICAgICAgKz0geDg2L2RjYWRzcF9pbml0Lm8KK09CSlMtJChDT05GSUdfRE5YSERfRU5DT0RFUikgICAgICAgICAgICs9IHg4Ni9kbnhoZGVuY19pbml0Lm8KK09CSlMtJChDT05GSUdfSEVWQ19ERUNPREVSKSAgICAgICAgICAgICs9IHg4Ni9oZXZjZHNwX2luaXQubworT0JKUy0kKENPTkZJR19NTFBfREVDT0RFUikgICAgICAgICAgICAgKz0geDg2L21scGRzcF9pbml0Lm8KK09CSlMtJChDT05GSUdfTVBFRzRfREVDT0RFUikgICAgICAgICAgICs9IHg4Ni94dmlkaWRjdF9pbml0Lm8KK09CSlMtJChDT05GSUdfUE5HX0RFQ09ERVIpICAgICAgICAgICAgICs9IHg4Ni9wbmdkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX1BST1JFU19ERUNPREVSKSAgICAgICAgICArPSB4ODYvcHJvcmVzZHNwX2luaXQubworT0JKUy0kKENPTkZJR19QUk9SRVNfTEdQTF9ERUNPREVSKSAgICAgKz0geDg2L3Byb3Jlc2RzcF9pbml0Lm8KK09CSlMtJChDT05GSUdfUlYzMF9ERUNPREVSKSAgICAgICAgICAgICs9IHg4Ni9ydjM0ZHNwX2luaXQubworT0JKUy0kKENPTkZJR19SVjQwX0RFQ09ERVIpICAgICAgICAgICAgKz0geDg2L3J2MzRkc3BfaW5pdC5vICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3J2NDBkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX1NWUTFfRU5DT0RFUikgICAgICAgICAgICArPSB4ODYvc3ZxMWVuY19pbml0Lm8KK09CSlMtJChDT05GSUdfVFJVRUhEX0RFQ09ERVIpICAgICAgICAgICs9IHg4Ni9tbHBkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX1RUQV9ERUNPREVSKSAgICAgICAgICAgICArPSB4ODYvdHRhZHNwX2luaXQubworT0JKUy0kKENPTkZJR19WMjEwX0RFQ09ERVIpICAgICAgICAgICAgKz0geDg2L3YyMTAtaW5pdC5vCitPQkpTLSQoQ09ORklHX1YyMTBfRU5DT0RFUikgICAgICAgICAgICArPSB4ODYvdjIxMGVuY19pbml0Lm8KK09CSlMtJChDT05GSUdfVkMxX0RFQ09ERVIpICAgICAgICAgICAgICs9IHg4Ni92YzFkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX1ZPUkJJU19ERUNPREVSKSAgICAgICAgICArPSB4ODYvdm9yYmlzZHNwX2luaXQubworT0JKUy0kKENPTkZJR19WUDZfREVDT0RFUikgICAgICAgICAgICAgKz0geDg2L3ZwNmRzcF9pbml0Lm8KK09CSlMtJChDT05GSUdfVlA3X0RFQ09ERVIpICAgICAgICAgICAgICs9IHg4Ni92cDhkc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX1ZQOF9ERUNPREVSKSAgICAgICAgICAgICArPSB4ODYvdnA4ZHNwX2luaXQubworT0JKUy0kKENPTkZJR19WUDlfREVDT0RFUikgICAgICAgICAgICAgKz0geDg2L3ZwOWRzcF9pbml0Lm8KK09CSlMtJChDT05GSUdfV0VCUF9ERUNPREVSKSAgICAgICAgICAgICs9IHg4Ni92cDhkc3BfaW5pdC5vCisKKworIyBHQ0MgaW5saW5lIGFzc2VtYmx5IG9wdGltaXphdGlvbnMKKyMgc3Vic3lzdGVtcworTU1YLU9CSlMtJChDT05GSUdfRElSQUNfREVDT0RFUikgICAgICAgKz0geDg2L2RpcmFjX2R3dC5vCitNTVgtT0JKUy0kKENPTkZJR19GRENURFNQKSAgICAgICAgICAgICArPSB4ODYvZmRjdC5vCitNTVgtT0JKUy0kKENPTkZJR19JRENURFNQKSAgICAgICAgICAgICArPSB4ODYvc2ltcGxlX2lkY3QubworCisjIGRlY29kZXJzL2VuY29kZXJzCitNTVgtT0JKUy0kKENPTkZJR19NUEVHNF9ERUNPREVSKSAgICAgICArPSB4ODYveHZpZGlkY3RfbW14Lm8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYveHZpZGlkY3Rfc3NlMi5vCitNTVgtT0JKUy0kKENPTkZJR19TTk9XX0RFQ09ERVIpICAgICAgICArPSB4ODYvc25vd2RzcC5vCitNTVgtT0JKUy0kKENPTkZJR19TTk9XX0VOQ09ERVIpICAgICAgICArPSB4ODYvc25vd2RzcC5vCitNTVgtT0JKUy0kKENPTkZJR19WQzFfREVDT0RFUikgICAgICAgICArPSB4ODYvdmMxZHNwX21teC5vCisKKworIyBZQVNNIG9wdGltaXphdGlvbnMKK1lBU00tT0JKUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IHg4Ni9kZWludGVybGFjZS5vICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9mbXRjb252ZXJ0Lm8gICAgICAgICAgICAgIFwKKworIyBzdWJzeXN0ZW1zCitZQVNNLU9CSlMtJChDT05GSUdfQUMzRFNQKSAgICAgICAgICAgICArPSB4ODYvYWMzZHNwLm8KK1lBU00tT0JKUy0kKENPTkZJR19BVURJT0RTUCkgICAgICAgICAgICs9IHg4Ni9hdWRpb2RzcC5vCitZQVNNLU9CSlMtJChDT05GSUdfQkxPQ0tEU1ApICAgICAgICAgICArPSB4ODYvYmxvY2tkc3AubworWUFTTS1PQkpTLSQoQ09ORklHX0JTV0FQRFNQKSAgICAgICAgICAgKz0geDg2L2Jzd2FwZHNwLm8KK1lBU00tT0JKUy0kKENPTkZJR19EQ1QpICAgICAgICAgICAgICAgICs9IHg4Ni9kY3QzMi5vCitZQVNNLU9CSlMtJChDT05GSUdfRElSQUNfREVDT0RFUikgICAgICArPSB4ODYvZGlyYWNkc3BfbW14Lm8geDg2L2RpcmFjZHNwX3lhc20ub1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9kd3RfeWFzbS5vCitZQVNNLU9CSlMtJChDT05GSUdfRE5YSERfRU5DT0RFUikgICAgICArPSB4ODYvZG54aGRlbmMubworWUFTTS1PQkpTLSQoQ09ORklHX0ZGVCkgICAgICAgICAgICAgICAgKz0geDg2L2ZmdC5vCitZQVNNLU9CSlMtJChDT05GSUdfRkxBQ19ERUNPREVSKSAgICAgICArPSB4ODYvZmxhY2RzcC5vCitpZmRlZiBDT05GSUdfR1BMCitZQVNNLU9CSlMtJChDT05GSUdfRkxBQ19FTkNPREVSKSAgICAgICArPSB4ODYvZmxhY19kc3BfZ3BsLm8KK2VuZGlmCitZQVNNLU9CSlMtJChDT05GSUdfSDI2M0RTUCkgICAgICAgICAgICArPSB4ODYvaDI2M19sb29wZmlsdGVyLm8KK1lBU00tT0JKUy0kKENPTkZJR19IMjY0Q0hST01BKSAgICAgICAgICs9IHg4Ni9oMjY0X2Nocm9tYW1jLm8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X2Nocm9tYW1jXzEwYml0Lm8KK1lBU00tT0JKUy0kKENPTkZJR19IMjY0RFNQKSAgICAgICAgICAgICs9IHg4Ni9oMjY0X2RlYmxvY2subyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X2RlYmxvY2tfMTBiaXQubyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X2lkY3QubyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X2lkY3RfMTBiaXQubyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X3dlaWdodC5vICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X3dlaWdodF8xMGJpdC5vCitZQVNNLU9CSlMtJChDT05GSUdfSDI2NFBSRUQpICAgICAgICAgICArPSB4ODYvaDI2NF9pbnRyYXByZWQubyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvaDI2NF9pbnRyYXByZWRfMTBiaXQubworWUFTTS1PQkpTLSQoQ09ORklHX0gyNjRRUEVMKSAgICAgICAgICAgKz0geDg2L2gyNjRfcXBlbF84Yml0Lm8gICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L2gyNjRfcXBlbF8xMGJpdC5vICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L2ZwZWwubyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3FwZWwubworWUFTTS1PQkpTLSQoQ09ORklHX0hQRUxEU1ApICAgICAgICAgICAgKz0geDg2L2ZwZWwubyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L2hwZWxkc3AubworWUFTTS1PQkpTLSQoQ09ORklHX0hVRkZZVVZEU1ApICAgICAgICAgKz0geDg2L2h1ZmZ5dXZkc3AubworWUFTTS1PQkpTLSQoQ09ORklHX0lEQ1REU1ApICAgICAgICAgICAgKz0geDg2L2lkY3Rkc3AubworWUFTTS1PQkpTLSQoQ09ORklHX0xMQVVERFNQKSAgICAgICAgICAgKz0geDg2L2xvc3NsZXNzX2F1ZGlvZHNwLm8KK1lBU00tT0JKUy0kKENPTkZJR19MTFZJRERTUCkgICAgICAgICAgICs9IHg4Ni9sb3NzbGVzc192aWRlb2RzcC5vCitZQVNNLU9CSlMtJChDT05GSUdfTUVfQ01QKSAgICAgICAgICAgICArPSB4ODYvbWVfY21wLm8KK1lBU00tT0JKUy0kKENPTkZJR19NUEVHQVVESU9EU1ApICAgICAgICs9IHg4Ni9pbWRjdDM2Lm8KK1lBU00tT0JKUy0kKENPTkZJR19NUEVHVklERU9FTkMpICAgICAgICs9IHg4Ni9tcGVndmlkZW9lbmNkc3AubworWUFTTS1PQkpTLSQoQ09ORklHX1BJWEJMT0NLRFNQKSAgICAgICAgKz0geDg2L3BpeGJsb2NrZHNwLm8KK1lBU00tT0JKUy0kKENPTkZJR19RUEVMRFNQKSAgICAgICAgICAgICs9IHg4Ni9xcGVsZHNwLm8gICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9mcGVsLm8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9xcGVsLm8KK1lBU00tT0JKUy0kKENPTkZJR19WSURFT0RTUCkgICAgICAgICAgICs9IHg4Ni92aWRlb2RzcC5vCitZQVNNLU9CSlMtJChDT05GSUdfVlAzRFNQKSAgICAgICAgICAgICArPSB4ODYvdnAzZHNwLm8KKworIyBkZWNvZGVycy9lbmNvZGVycworWUFTTS1PQkpTLSQoQ09ORklHX0FBQ19ERUNPREVSKSAgICAgICAgKz0geDg2L3NicmRzcC5vCitZQVNNLU9CSlMtJChDT05GSUdfQVBOR19ERUNPREVSKSAgICAgICArPSB4ODYvcG5nZHNwLm8KK1lBU00tT0JKUy0kKENPTkZJR19EQ0FfREVDT0RFUikgICAgICAgICs9IHg4Ni9kY2Fkc3AubworWUFTTS1PQkpTLSQoQ09ORklHX0hFVkNfREVDT0RFUikgICAgICAgKz0geDg2L2hldmNfbWMubyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L2hldmNfZGVibG9jay5vICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L2hldmNfaWRjdC5vICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L2hldmNfcmVzX2FkZC5vCitZQVNNLU9CSlMtJChDT05GSUdfTUxQX0RFQ09ERVIpICAgICAgICArPSB4ODYvbWxwZHNwLm8KK1lBU00tT0JKUy0kKENPTkZJR19QTkdfREVDT0RFUikgICAgICAgICs9IHg4Ni9wbmdkc3AubworWUFTTS1PQkpTLSQoQ09ORklHX1BST1JFU19ERUNPREVSKSAgICAgKz0geDg2L3Byb3Jlc2RzcC5vCitZQVNNLU9CSlMtJChDT05GSUdfUFJPUkVTX0xHUExfREVDT0RFUikgKz0geDg2L3Byb3Jlc2RzcC5vCitZQVNNLU9CSlMtJChDT05GSUdfUlYzMF9ERUNPREVSKSAgICAgICArPSB4ODYvcnYzNGRzcC5vCitZQVNNLU9CSlMtJChDT05GSUdfUlY0MF9ERUNPREVSKSAgICAgICArPSB4ODYvcnYzNGRzcC5vICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvcnY0MGRzcC5vCitZQVNNLU9CSlMtJChDT05GSUdfU1ZRMV9FTkNPREVSKSAgICAgICArPSB4ODYvc3ZxMWVuYy5vCitZQVNNLU9CSlMtJChDT05GSUdfVFJVRUhEX0RFQ09ERVIpICAgICArPSB4ODYvbWxwZHNwLm8KK1lBU00tT0JKUy0kKENPTkZJR19UVEFfREVDT0RFUikgICAgICAgICs9IHg4Ni90dGFkc3AubworWUFTTS1PQkpTLSQoQ09ORklHX1YyMTBfRU5DT0RFUikgICAgICAgKz0geDg2L3YyMTBlbmMubworWUFTTS1PQkpTLSQoQ09ORklHX1YyMTBfREVDT0RFUikgICAgICAgKz0geDg2L3YyMTAubworWUFTTS1PQkpTLSQoQ09ORklHX1ZDMV9ERUNPREVSKSAgICAgICAgKz0geDg2L3ZjMWRzcC5vCitZQVNNLU9CSlMtJChDT05GSUdfVk9SQklTX0RFQ09ERVIpICAgICArPSB4ODYvdm9yYmlzZHNwLm8KK1lBU00tT0JKUy0kKENPTkZJR19WUDZfREVDT0RFUikgICAgICAgICs9IHg4Ni92cDZkc3AubworWUFTTS1PQkpTLSQoQ09ORklHX1ZQN19ERUNPREVSKSAgICAgICAgKz0geDg2L3ZwOGRzcC5vICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3ZwOGRzcF9sb29wZmlsdGVyLm8KK1lBU00tT0JKUy0kKENPTkZJR19WUDhfREVDT0RFUikgICAgICAgICs9IHg4Ni92cDhkc3AubyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni92cDhkc3BfbG9vcGZpbHRlci5vCitZQVNNLU9CSlMtJChDT05GSUdfVlA5X0RFQ09ERVIpICAgICAgICArPSB4ODYvdnA5aW50cmFwcmVkLm8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvdnA5aXR4Zm0ubyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvdnA5bHBmLm8gICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvdnA5bWMubworWUFTTS1PQkpTLSQoQ09ORklHX1dFQlBfREVDT0RFUikgICAgICAgKz0geDg2L3ZwOGRzcC5vCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvYWMzZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9hYzNkc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDQ0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvYWMzZHNwLmFzbQpAQCAtMCwwICsxLDU1MiBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiB4ODYtb3B0aW1pemVkIEFDLTMgRFNQIGZ1bmN0aW9ucworOyogQ29weXJpZ2h0IChjKSAyMDExIEp1c3RpbiBSdWdnbGVzCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworOyAxNjc3NzIxNi4wZiAtIHVzZWQgaW4gZmZfZmxvYXRfdG9fZml4ZWQyNCgpCitwZl8xXzI0OiB0aW1lcyA0IGRkIDB4NEI4MDAwMDAKKworOyB1c2VkIGluIGZmX2FjM19jb21wdXRlX21hbnRpc3NhX3NpemUoKQorY2V4dGVybiBhYzNfYmFwX2JpdHMKK3B3X2JhcF9tdWwxOiBkdyAyMTg0NiwgMjE4NDYsIDAsIDMyNzY4LCAyMTg0NiwgMjE4NDYsIDAsIDMyNzY4Citwd19iYXBfbXVsMjogZHcgNSwgNywgMCwgNywgNSwgNywgMCwgNworCis7IHVzZWQgaW4gZmZfYWMzX2V4dHJhY3RfZXhwb25lbnRzKCkKK3BkXzE6ICAgdGltZXMgNCBkZCAxCitwZF8xNTE6IHRpbWVzIDQgZGQgMTUxCisKKzsgdXNlZCBpbiBmZl9hcHBseV93aW5kb3dfaW50MTYoKQorcGJfcmV2d29yZHM6IFNIVUZGTEVfTUFTS19XIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAKK3BkXzE2Mzg0OiB0aW1lcyA0IGRkIDE2Mzg0CisKK1NFQ1RJT04gLnRleHQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfYWMzX2V4cG9uZW50X21pbih1aW50OF90ICpleHAsIGludCBudW1fcmV1c2VfYmxvY2tzLCBpbnQgbmJfY29lZnMpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIEFDM19FWFBPTkVOVF9NSU4gMAorY2dsb2JhbCBhYzNfZXhwb25lbnRfbWluLCAzLCA0LCAyLCBleHAsIHJldXNlX2Jsa3MsIGV4cG4sIG9mZnNldAorICAgIHNobCAgcmV1c2VfYmxrc3EsIDgKKyAgICBqeiAuZW5kCisgICAgTE9PUF9BTElHTgorLm5leHRleHA6CisgICAgbW92ICAgICAgb2Zmc2V0cSwgcmV1c2VfYmxrc3EKKyAgICBtb3ZhICAgICAgICAgIG0wLCBbZXhwcStvZmZzZXRxXQorICAgIHN1YiAgICAgIG9mZnNldHEsIDI1NgorICAgIExPT1BfQUxJR04KKy5uZXh0YmxrOgorICAgIFBNSU5VQiAgICAgICAgbTAsIFtleHBxK29mZnNldHFdLCBtMQorICAgIHN1YiAgICAgIG9mZnNldHEsIDI1NgorICAgIGphZSAubmV4dGJsaworICAgIG1vdmEgICAgICBbZXhwcV0sIG0wCisgICAgYWRkICAgICAgICAgZXhwcSwgbW1zaXplCisgICAgc3ViICAgICAgICBleHBucSwgbW1zaXplCisgICAgamcgLm5leHRleHAKKy5lbmQ6CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKKyVkZWZpbmUgTE9PUF9BTElHTgorSU5JVF9NTVggbW14CitBQzNfRVhQT05FTlRfTUlOCislaWYgSEFWRV9NTVhFWFRfRVhURVJOQUwKKyVkZWZpbmUgTE9PUF9BTElHTiBBTElHTiAxNgorSU5JVF9NTVggbW14ZXh0CitBQzNfRVhQT05FTlRfTUlOCislZW5kaWYKKyVpZiBIQVZFX1NTRTJfRVhURVJOQUwKK0lOSVRfWE1NIHNzZTIKK0FDM19FWFBPTkVOVF9NSU4KKyVlbmRpZgorJXVuZGVmIExPT1BfQUxJR04KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBmZl9hYzNfbWF4X21zYl9hYnNfaW50MTYoY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgbGVuKQorOworOyBUaGlzIGZ1bmN0aW9uIHVzZXMgMiBkaWZmZXJlbnQgbWV0aG9kcyB0byBjYWxjdWxhdGUgYSB2YWxpZCByZXN1bHQuCis7IDEpIGxvZ2ljYWwgJ29yJyBvZiBhYnMgb2YgZWFjaCBlbGVtZW50Cis7ICAgICAgICBUaGlzIGlzIHVzZWQgZm9yIHNzc2UzIGJlY2F1c2Ugb2YgdGhlIHBhYnN3IGluc3RydWN0aW9uLgorOyAgICAgICAgSXQgaXMgYWxzbyB1c2VkIGZvciBtbXggYmVjYXVzZSBvZiB0aGUgbGFjayBvZiBtaW4vbWF4IGluc3RydWN0aW9ucy4KKzsgMikgY2FsY3VsYXRlIG1pbi9tYXggZm9yIHRoZSBhcnJheSwgdGhlbiBvcihhYnMobWluKSxhYnMobWF4KSkKKzsgICAgICAgIFRoaXMgaXMgdXNlZCBmb3IgbW14ZXh0IGFuZCBzc2UyIGJlY2F1c2UgdGhleSBoYXZlIHBtaW5zdy9wbWF4c3cuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOyBsb2dpY2FsICdvcicgb2YgNCBvciA4IHdvcmRzIGluIGFuIG1teCBvciB4bW0gcmVnaXN0ZXIgaW50byB0aGUgbG93IHdvcmQKKyVtYWNybyBPUl9XT1JEU19IT1JJWiAyIDsgc3JjLCB0bXAKKyVpZiBjcHVmbGFnKHNzZTIpCisgICAgbW92aGxwcyAgICAgJTIsICUxCisgICAgcG9yICAgICAgICAgJTEsICUyCisgICAgcHNodWZsdyAgICAgJTIsICUxLCBxMDAzMgorICAgIHBvciAgICAgICAgICUxLCAlMgorICAgIHBzaHVmbHcgICAgICUyLCAlMSwgcTAwMDEKKyAgICBwb3IgICAgICAgICAlMSwgJTIKKyVlbGlmIGNwdWZsYWcobW14ZXh0KQorICAgIHBzaHVmdyAgICAgICUyLCAlMSwgcTAwMzIKKyAgICBwb3IgICAgICAgICAlMSwgJTIKKyAgICBwc2h1ZncgICAgICAlMiwgJTEsIHEwMDAxCisgICAgcG9yICAgICAgICAgJTEsICUyCislZWxzZSA7IG1teAorICAgIG1vdnEgICAgICAgICUyLCAlMQorICAgIHBzcmxxICAgICAgICUyLCAzMgorICAgIHBvciAgICAgICAgICUxLCAlMgorICAgIG1vdnEgICAgICAgICUyLCAlMQorICAgIHBzcmxxICAgICAgICUyLCAxNgorICAgIHBvciAgICAgICAgICUxLCAlMgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEFDM19NQVhfTVNCX0FCU19JTlQxNiAxCitjZ2xvYmFsIGFjM19tYXhfbXNiX2Fic19pbnQxNiwgMiwyLDUsIHNyYywgbGVuCisgICAgcHhvciAgICAgICAgbTIsIG0yCisgICAgcHhvciAgICAgICAgbTMsIG0zCisubG9vcDoKKyVpZmlkbiAlMSwgbWluX21heAorICAgIG1vdmEgICAgICAgIG0wLCBbc3JjcV0KKyAgICBtb3ZhICAgICAgICBtMSwgW3NyY3ErbW1zaXplXQorICAgIHBtaW5zdyAgICAgIG0yLCBtMAorICAgIHBtaW5zdyAgICAgIG0yLCBtMQorICAgIHBtYXhzdyAgICAgIG0zLCBtMAorICAgIHBtYXhzdyAgICAgIG0zLCBtMQorJWVsc2UgOyBvcl9hYnMKKyVpZiBub3RjcHVmbGFnKHNzc2UzKQorICAgIG1vdmEgICAgICAgIG0wLCBbc3JjcV0KKyAgICBtb3ZhICAgICAgICBtMSwgW3NyY3ErbW1zaXplXQorICAgIEFCUzIgICAgICAgIG0wLCBtMSwgbTMsIG00CislZWxzZSA7IHNzc2UzCisgICAgOyB1c2luZyBtZW1vcnkgYXJncyBpcyBmYXN0ZXIgZm9yIHNzc2UzCisgICAgcGFic3cgICAgICAgbTAsIFtzcmNxXQorICAgIHBhYnN3ICAgICAgIG0xLCBbc3JjcSttbXNpemVdCislZW5kaWYKKyAgICBwb3IgICAgICAgICBtMiwgbTAKKyAgICBwb3IgICAgICAgICBtMiwgbTEKKyVlbmRpZgorICAgIGFkZCAgICAgICBzcmNxLCBtbXNpemUqMgorICAgIHN1YiAgICAgICBsZW5kLCBtbXNpemUKKyAgICBqYSAubG9vcAorJWlmaWRuICUxLCBtaW5fbWF4CisgICAgQUJTMiAgICAgICAgbTIsIG0zLCBtMCwgbTEKKyAgICBwb3IgICAgICAgICBtMiwgbTMKKyVlbmRpZgorICAgIE9SX1dPUkRTX0hPUklaIG0yLCBtMAorICAgIG1vdmQgICAgICAgZWF4LCBtMgorICAgIGFuZCAgICAgICAgZWF4LCAweEZGRkYKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK0FDM19NQVhfTVNCX0FCU19JTlQxNiBvcl9hYnMKK0lOSVRfTU1YIG1teGV4dAorQUMzX01BWF9NU0JfQUJTX0lOVDE2IG1pbl9tYXgKK0lOSVRfWE1NIHNzZTIKK0FDM19NQVhfTVNCX0FCU19JTlQxNiBtaW5fbWF4CitJTklUX1hNTSBzc3NlMworQUMzX01BWF9NU0JfQUJTX0lOVDE2IG9yX2FicworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgbWFjcm8gdXNlZCBmb3IgZmZfYWMzX2xzaGlmdF9pbnQxNigpIGFuZCBmZl9hYzNfcnNoaWZ0X2ludDMyKCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQUMzX1NISUZUIDMgOyBsL3IsIDE2LzMyLCBzaGlmdCBpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb24gc2V0CitjZ2xvYmFsIGFjM18lMXNoaWZ0X2ludCUyLCAzLCAzLCA1LCBzcmMsIGxlbiwgc2hpZnQKKyAgICBtb3ZkICAgICAgbTAsIHNoaWZ0ZAorLmxvb3A6CisgICAgbW92YSAgICAgIG0xLCBbc3JjcSAgICAgICAgIF0KKyAgICBtb3ZhICAgICAgbTIsIFtzcmNxK21tc2l6ZSAgXQorICAgIG1vdmEgICAgICBtMywgW3NyY3ErbW1zaXplKjJdCisgICAgbW92YSAgICAgIG00LCBbc3JjcSttbXNpemUqM10KKyAgICAlMyAgICAgICAgbTEsIG0wCisgICAgJTMgICAgICAgIG0yLCBtMAorICAgICUzICAgICAgICBtMywgbTAKKyAgICAlMyAgICAgICAgbTQsIG0wCisgICAgbW92YSAgW3NyY3EgICAgICAgICBdLCBtMQorICAgIG1vdmEgIFtzcmNxK21tc2l6ZSAgXSwgbTIKKyAgICBtb3ZhICBbc3JjcSttbXNpemUqMl0sIG0zCisgICAgbW92YSAgW3NyY3ErbW1zaXplKjNdLCBtNAorICAgIGFkZCAgICAgc3JjcSwgbW1zaXplKjQKKyAgICBzdWIgICAgIGxlbmQsIG1tc2l6ZSozMi8lMgorICAgIGphIC5sb29wCisuZW5kOgorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9hYzNfbHNoaWZ0X2ludDE2KGludDE2X3QgKnNyYywgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IHNoaWZ0KQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOSVRfTU1YIG1teAorQUMzX1NISUZUIGwsIDE2LCBwc2xsdworSU5JVF9YTU0gc3NlMgorQUMzX1NISUZUIGwsIDE2LCBwc2xsdworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9hYzNfcnNoaWZ0X2ludDMyKGludDMyX3QgKnNyYywgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IHNoaWZ0KQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOSVRfTU1YIG1teAorQUMzX1NISUZUIHIsIDMyLCBwc3JhZAorSU5JVF9YTU0gc3NlMgorQUMzX1NISUZUIHIsIDMyLCBwc3JhZAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9mbG9hdF90b19maXhlZDI0KGludDMyX3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgdW5zaWduZWQgaW50IGxlbikKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7IFRoZSAzRE5vdyEgdmVyc2lvbiBpcyBub3QgYml0LWlkZW50aWNhbCBiZWNhdXNlIHBmMmlkIHVzZXMgdHJ1bmNhdGlvbiByYXRoZXIKKzsgdGhhbiByb3VuZC10by1uZWFyZXN0LgorSU5JVF9NTVggM2Rub3cKK2NnbG9iYWwgZmxvYXRfdG9fZml4ZWQyNCwgMywgMywgMCwgZHN0LCBzcmMsIGxlbgorICAgIG1vdnEgICBtMCwgW3BmXzFfMjRdCisubG9vcDoKKyAgICBtb3ZxICAgbTEsIFtzcmNxICAgXQorICAgIG1vdnEgICBtMiwgW3NyY3ErOCBdCisgICAgbW92cSAgIG0zLCBbc3JjcSsxNl0KKyAgICBtb3ZxICAgbTQsIFtzcmNxKzI0XQorICAgIHBmbXVsICBtMSwgbTAKKyAgICBwZm11bCAgbTIsIG0wCisgICAgcGZtdWwgIG0zLCBtMAorICAgIHBmbXVsICBtNCwgbTAKKyAgICBwZjJpZCAgbTEsIG0xCisgICAgcGYyaWQgIG0yLCBtMgorICAgIHBmMmlkICBtMywgbTMKKyAgICBwZjJpZCAgbTQsIG00CisgICAgbW92cSAgW2RzdHEgICBdLCBtMQorICAgIG1vdnEgIFtkc3RxKzggXSwgbTIKKyAgICBtb3ZxICBbZHN0cSsxNl0sIG0zCisgICAgbW92cSAgW2RzdHErMjRdLCBtNAorICAgIGFkZCAgc3JjcSwgMzIKKyAgICBhZGQgIGRzdHEsIDMyCisgICAgc3ViICBsZW5kLCA4CisgICAgamEgLmxvb3AKKyAgICBmZW1tcworICAgIFJFVAorCitJTklUX1hNTSBzc2UKK2NnbG9iYWwgZmxvYXRfdG9fZml4ZWQyNCwgMywgMywgMywgZHN0LCBzcmMsIGxlbgorICAgIG1vdmFwcyAgICAgbTAsIFtwZl8xXzI0XQorLmxvb3A6CisgICAgbW92YXBzICAgICBtMSwgW3NyY3EgICBdCisgICAgbW92YXBzICAgICBtMiwgW3NyY3ErMTZdCisgICAgbXVscHMgICAgICBtMSwgbTAKKyAgICBtdWxwcyAgICAgIG0yLCBtMAorICAgIGN2dHBzMnBpICBtbTAsIG0xCisgICAgbW92aGxwcyAgICBtMSwgbTEKKyAgICBjdnRwczJwaSAgbW0xLCBtMQorICAgIGN2dHBzMnBpICBtbTIsIG0yCisgICAgbW92aGxwcyAgICBtMiwgbTIKKyAgICBjdnRwczJwaSAgbW0zLCBtMgorICAgIG1vdnEgIFtkc3RxICAgXSwgbW0wCisgICAgbW92cSAgW2RzdHErIDhdLCBtbTEKKyAgICBtb3ZxICBbZHN0cSsxNl0sIG1tMgorICAgIG1vdnEgIFtkc3RxKzI0XSwgbW0zCisgICAgYWRkICAgICAgc3JjcSwgMzIKKyAgICBhZGQgICAgICBkc3RxLCAzMgorICAgIHN1YiAgICAgIGxlbmQsIDgKKyAgICBqYSAubG9vcAorICAgIGVtbXMKKyAgICBSRVQKKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBmbG9hdF90b19maXhlZDI0LCAzLCAzLCA5LCBkc3QsIHNyYywgbGVuCisgICAgbW92YXBzICAgICBtMCwgW3BmXzFfMjRdCisubG9vcDoKKyAgICBtb3ZhcHMgICAgIG0xLCBbc3JjcSAgICBdCisgICAgbW92YXBzICAgICBtMiwgW3NyY3ErMTYgXQorICAgIG1vdmFwcyAgICAgbTMsIFtzcmNxKzMyIF0KKyAgICBtb3ZhcHMgICAgIG00LCBbc3JjcSs0OCBdCislaWZkZWYgbTgKKyAgICBtb3ZhcHMgICAgIG01LCBbc3JjcSs2NCBdCisgICAgbW92YXBzICAgICBtNiwgW3NyY3ErODAgXQorICAgIG1vdmFwcyAgICAgbTcsIFtzcmNxKzk2IF0KKyAgICBtb3ZhcHMgICAgIG04LCBbc3JjcSsxMTJdCislZW5kaWYKKyAgICBtdWxwcyAgICAgIG0xLCBtMAorICAgIG11bHBzICAgICAgbTIsIG0wCisgICAgbXVscHMgICAgICBtMywgbTAKKyAgICBtdWxwcyAgICAgIG00LCBtMAorJWlmZGVmIG04CisgICAgbXVscHMgICAgICBtNSwgbTAKKyAgICBtdWxwcyAgICAgIG02LCBtMAorICAgIG11bHBzICAgICAgbTcsIG0wCisgICAgbXVscHMgICAgICBtOCwgbTAKKyVlbmRpZgorICAgIGN2dHBzMmRxICAgbTEsIG0xCisgICAgY3Z0cHMyZHEgICBtMiwgbTIKKyAgICBjdnRwczJkcSAgIG0zLCBtMworICAgIGN2dHBzMmRxICAgbTQsIG00CislaWZkZWYgbTgKKyAgICBjdnRwczJkcSAgIG01LCBtNQorICAgIGN2dHBzMmRxICAgbTYsIG02CisgICAgY3Z0cHMyZHEgICBtNywgbTcKKyAgICBjdnRwczJkcSAgIG04LCBtOAorJWVuZGlmCisgICAgbW92ZHFhICBbZHN0cSAgICBdLCBtMQorICAgIG1vdmRxYSAgW2RzdHErMTYgXSwgbTIKKyAgICBtb3ZkcWEgIFtkc3RxKzMyIF0sIG0zCisgICAgbW92ZHFhICBbZHN0cSs0OCBdLCBtNAorJWlmZGVmIG04CisgICAgbW92ZHFhICBbZHN0cSs2NCBdLCBtNQorICAgIG1vdmRxYSAgW2RzdHErODAgXSwgbTYKKyAgICBtb3ZkcWEgIFtkc3RxKzk2IF0sIG03CisgICAgbW92ZHFhICBbZHN0cSsxMTJdLCBtOAorICAgIGFkZCAgICAgIHNyY3EsIDEyOAorICAgIGFkZCAgICAgIGRzdHEsIDEyOAorICAgIHN1YiAgICAgIGxlbnEsIDMyCislZWxzZQorICAgIGFkZCAgICAgIHNyY3EsIDY0CisgICAgYWRkICAgICAgZHN0cSwgNjQKKyAgICBzdWIgICAgICBsZW5xLCAxNgorJWVuZGlmCisgICAgamEgLmxvb3AKKyAgICBSRVBfUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgaW50IGZmX2FjM19jb21wdXRlX21hbnRpc3NhX3NpemUodWludDE2X3QgbWFudF9jbnRbNl1bMTZdKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gUEhBRERENCAyIDsgeG1tIHNyYywgeG1tIHRtcAorICAgIG1vdmhscHMgICUyLCAlMQorICAgIHBhZGRkICAgICUxLCAlMgorICAgIHBzaHVmZCAgICUyLCAlMSwgMHgxCisgICAgcGFkZGQgICAgJTEsICUyCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBhYzNfY29tcHV0ZV9tYW50aXNzYV9zaXplLCAxLCAyLCA0LCBtYW50X2NudCwgc3VtCisgICAgbW92ZHFhICAgICAgbTAsIFttYW50X2NudHEgICAgICBdCisgICAgbW92ZHFhICAgICAgbTEsIFttYW50X2NudHErIDEqMTZdCisgICAgcGFkZHcgICAgICAgbTAsIFttYW50X2NudHErIDIqMTZdCisgICAgcGFkZHcgICAgICAgbTEsIFttYW50X2NudHErIDMqMTZdCisgICAgcGFkZHcgICAgICAgbTAsIFttYW50X2NudHErIDQqMTZdCisgICAgcGFkZHcgICAgICAgbTEsIFttYW50X2NudHErIDUqMTZdCisgICAgcGFkZHcgICAgICAgbTAsIFttYW50X2NudHErIDYqMTZdCisgICAgcGFkZHcgICAgICAgbTEsIFttYW50X2NudHErIDcqMTZdCisgICAgcGFkZHcgICAgICAgbTAsIFttYW50X2NudHErIDgqMTZdCisgICAgcGFkZHcgICAgICAgbTEsIFttYW50X2NudHErIDkqMTZdCisgICAgcGFkZHcgICAgICAgbTAsIFttYW50X2NudHErMTAqMTZdCisgICAgcGFkZHcgICAgICAgbTEsIFttYW50X2NudHErMTEqMTZdCisgICAgcG1hZGR3ZCAgICAgbTAsIFthYzNfYmFwX2JpdHMgICBdCisgICAgcG1hZGR3ZCAgICAgbTEsIFthYzNfYmFwX2JpdHMrMTZdCisgICAgcGFkZGQgICAgICAgbTAsIG0xCisgICAgUEhBRERENCAgICAgbTAsIG0xCisgICAgbW92ZCAgICAgIHN1bWQsIG0wCisgICAgbW92ZHFhICAgICAgbTMsIFtwd19iYXBfbXVsMV0KKyAgICBtb3ZocGQgICAgICBtMCwgW21hbnRfY250cSAgICAgKzJdCisgICAgbW92bHBkICAgICAgbTAsIFttYW50X2NudHErMSozMisyXQorICAgIG1vdmhwZCAgICAgIG0xLCBbbWFudF9jbnRxKzIqMzIrMl0KKyAgICBtb3ZscGQgICAgICBtMSwgW21hbnRfY250cSszKjMyKzJdCisgICAgbW92aHBkICAgICAgbTIsIFttYW50X2NudHErNCozMisyXQorICAgIG1vdmxwZCAgICAgIG0yLCBbbWFudF9jbnRxKzUqMzIrMl0KKyAgICBwbXVsaHV3ICAgICBtMCwgbTMKKyAgICBwbXVsaHV3ICAgICBtMSwgbTMKKyAgICBwbXVsaHV3ICAgICBtMiwgbTMKKyAgICBwYWRkdXN3ICAgICBtMCwgbTEKKyAgICBwYWRkdXN3ICAgICBtMCwgbTIKKyAgICBwbWFkZHdkICAgICBtMCwgW3B3X2JhcF9tdWwyXQorICAgIFBIQURERDQgICAgIG0wLCBtMQorICAgIG1vdmQgICAgICAgZWF4LCBtMAorICAgIGFkZCAgICAgICAgZWF4LCBzdW1kCisgICAgUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9hYzNfZXh0cmFjdF9leHBvbmVudHModWludDhfdCAqZXhwLCBpbnQzMl90ICpjb2VmLCBpbnQgbmJfY29lZnMpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBQQUJTRCAxLTIgOyBzcmMvZHN0LCB1bnVzZWQKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHBhYnNkICAgICUxLCAlMQorJWVsc2UgOyBzcmMvZHN0LCB0bXAKKyAgICBweG9yICAgICAlMiwgJTIKKyAgICBwY21wZ3RkICAlMiwgJTEKKyAgICBweG9yICAgICAlMSwgJTIKKyAgICBwc3ViZCAgICAlMSwgJTIKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBBQzNfRVhUUkFDVF9FWFBPTkVOVFMgMAorY2dsb2JhbCBhYzNfZXh0cmFjdF9leHBvbmVudHMsIDMsIDMsIDQsIGV4cCwgY29lZiwgbGVuCisgICAgYWRkICAgICBleHBxLCBsZW5xCisgICAgbGVhICAgIGNvZWZxLCBbY29lZnErNCpsZW5xXQorICAgIG5lZyAgICAgbGVucQorICAgIG1vdmEgICAgICBtMiwgW3BkXzFdCisgICAgbW92YSAgICAgIG0zLCBbcGRfMTUxXQorLmxvb3A6CisgICAgOyBtb3ZlIDQgMzItYml0IGNvZWZzIHRvIHhtbTAKKyAgICBtb3ZhICAgICAgbTAsIFtjb2VmcSs0KmxlbnFdCisgICAgOyBhYnNvbHV0ZSB2YWx1ZQorICAgIFBBQlNEICAgICBtMCwgbTEKKyAgICA7IGNvbnZlcnQgdG8gZmxvYXQgYW5kIGV4dHJhY3QgZXhwb25lbnRzCisgICAgcHNsbGQgICAgIG0wLCAxCisgICAgcG9yICAgICAgIG0wLCBtMgorICAgIGN2dGRxMnBzICBtMSwgbTAKKyAgICBwc3JsZCAgICAgbTEsIDIzCisgICAgbW92YSAgICAgIG0wLCBtMworICAgIHBzdWJkICAgICBtMCwgbTEKKyAgICA7IG1vdmUgdGhlIGxvd2VzdCBieXRlIGluIGVhY2ggb2YgNCBkd29yZHMgdG8gdGhlIGxvdyBkd29yZAorICAgIDsgTk9URTogV2UgY2Fubm90IGp1c3QgZXh0cmFjdCB0aGUgbG93IGJ5dGVzIHdpdGggcHNodWZiIGJlY2F1c2UgdGhlIGR3b3JkCisgICAgOyAgICAgICByZXN1bHQgZm9yIDE2Nzc3MjE1IGlzIC0xIGR1ZSB0byBmbG9hdCBpbmFjY3VyYWN5LiBVc2luZyBwYWNrdXN3YgorICAgIDsgICAgICAgY2xpcHMgdGhpcyB0byAwLCB3aGljaCBpcyB0aGUgY29ycmVjdCBleHBvbmVudC4KKyAgICBwYWNrc3NkdyAgbTAsIG0wCisgICAgcGFja3Vzd2IgIG0wLCBtMAorICAgIG1vdmQgIFtleHBxK2xlbnFdLCBtMAorCisgICAgYWRkICAgICBsZW5xLCA0CisgICAgamwgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworJWlmIEhBVkVfU1NFMl9FWFRFUk5BTAorSU5JVF9YTU0gc3NlMgorQUMzX0VYVFJBQ1RfRVhQT05FTlRTCislZW5kaWYKKyVpZiBIQVZFX1NTU0UzX0VYVEVSTkFMCitJTklUX1hNTSBzc3NlMworQUMzX0VYVFJBQ1RfRVhQT05FTlRTCislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfYXBwbHlfd2luZG93X2ludDE2KGludDE2X3QgKm91dHB1dCwgY29uc3QgaW50MTZfdCAqaW5wdXQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKndpbmRvdywgdW5zaWduZWQgaW50IGxlbikKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gUkVWRVJTRV9XT1JEUyAxLTIKKyVpZiBjcHVmbGFnKHNzc2UzKSAmJiBub3RjcHVmbGFnKGF0b20pCisgICAgcHNodWZiICAlMSwgJTIKKyVlbGlmIGNwdWZsYWcoc3NlMikKKyAgICBwc2h1Zmx3ICAlMSwgJTEsIDB4MUIKKyAgICBwc2h1Zmh3ICAlMSwgJTEsIDB4MUIKKyAgICBwc2h1ZmQgICAlMSwgJTEsIDB4NEUKKyVlbGlmIGNwdWZsYWcobW14ZXh0KQorICAgIHBzaHVmdyAgICUxLCAlMSwgMHgxQgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIE1VTDE2RklYRUQgMworJWlmIGNwdWZsYWcoc3NzZTMpIDsgZHN0LCBzcmMsIHVudXNlZAorOyBkc3QgPSAoKGRzdCAqIHNyYykgKyAoMTw8MTQpKSA+PiAxNQorICAgIHBtdWxocnN3ICAgJTEsICUyCislZWxpZiBjcHVmbGFnKG1teGV4dCkgOyBkc3QsIHNyYywgdGVtcAorOyBkc3QgPSAoZHN0ICogc3JjKSA+PiAxNQorOyBwbXVsaHcgY3V0cyBvZmYgdGhlIGJvdHRvbSBiaXQsIHNvIHdlIGhhdmUgdG8gbHNoaWZ0IGJ5IDEgYW5kIGFkZCBpdCBiYWNrCis7IGluIGZyb20gdGhlIHBtdWxsdyByZXN1bHQuCisgICAgbW92YSAgICAlMywgJTEKKyAgICBwbXVsaHcgICUxLCAlMgorICAgIHBtdWxsdyAgJTMsICUyCisgICAgcHNybHcgICAlMywgMTUKKyAgICBwc2xsdyAgICUxLCAxCisgICAgcG9yICAgICAlMSwgJTMKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBBUFBMWV9XSU5ET1dfSU5UMTYgMSA7ICUxIGJpdGV4YWN0IHZlcnNpb24KKyVpZiAlMQorY2dsb2JhbCBhcHBseV93aW5kb3dfaW50MTYsIDQsNSw2LCBvdXRwdXQsIGlucHV0LCB3aW5kb3csIG9mZnNldCwgb2Zmc2V0MgorJWVsc2UKK2NnbG9iYWwgYXBwbHlfd2luZG93X2ludDE2X3JvdW5kLCA0LDUsNiwgb3V0cHV0LCBpbnB1dCwgd2luZG93LCBvZmZzZXQsIG9mZnNldDIKKyVlbmRpZgorICAgIGxlYSAgICAgb2Zmc2V0MnEsIFtvZmZzZXRxLW1tc2l6ZV0KKyVpZiBjcHVmbGFnKHNzc2UzKSAmJiBub3RjcHVmbGFnKGF0b20pCisgICAgbW92YSAgICAgICAgICBtNSwgW3BiX3JldndvcmRzXQorICAgIEFMSUdOIDE2CislZWxpZiAlMQorICAgIG1vdmEgICAgICAgICAgbTUsIFtwZF8xNjM4NF0KKyVlbmRpZgorLmxvb3A6CislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICA7IFRoaXMgdmVyc2lvbiBkb2VzIHRoZSAxNngxNi0+MTYgbXVsdGlwbGljYXRpb24gaW4tcGxhY2Ugd2l0aG91dCBleHBhbmRpbmcKKyAgICA7IHRvIDMyLWJpdC4gVGhlIHNzc2UzIHZlcnNpb24gaXMgYml0LWlkZW50aWNhbC4KKyAgICBtb3ZhICAgICAgICAgIG0wLCBbd2luZG93cStvZmZzZXQycV0KKyAgICBtb3ZhICAgICAgICAgIG0xLCBbIGlucHV0cStvZmZzZXQycV0KKyAgICBwbXVsaHJzdyAgICAgIG0xLCBtMAorICAgIFJFVkVSU0VfV09SRFMgbTAsIG01CisgICAgcG11bGhyc3cgICAgICBtMCwgWyBpbnB1dHErb2Zmc2V0cSBdCisgICAgbW92YSAgW291dHB1dHErb2Zmc2V0MnFdLCBtMQorICAgIG1vdmEgIFtvdXRwdXRxK29mZnNldHEgXSwgbTAKKyVlbGlmICUxCisgICAgOyBUaGlzIHZlcnNpb24gZXhwYW5kcyAxNi1iaXQgdG8gMzItYml0LCBtdWx0aXBsaWVzIGJ5IHRoZSB3aW5kb3csCisgICAgOyBhZGRzIDE2Mzg0IGZvciByb3VuZGluZywgcmlnaHQgc2hpZnRzIDE1LCB0aGVuIHJlcGFja3MgYmFjayB0byB3b3JkcyB0bworICAgIDsgc2F2ZSB0byB0aGUgb3V0cHV0LiBUaGUgd2luZG93IGlzIHJldmVyc2VkIGZvciB0aGUgc2Vjb25kIGhhbGYuCisgICAgbW92YSAgICAgICAgICBtMywgW3dpbmRvd3Erb2Zmc2V0MnFdCisgICAgbW92YSAgICAgICAgICBtNCwgWyBpbnB1dHErb2Zmc2V0MnFdCisgICAgcHhvciAgICAgICAgICBtMCwgbTAKKyAgICBwdW5wY2tsd2QgICAgIG0wLCBtMworICAgIHB1bnBja2x3ZCAgICAgbTEsIG00CisgICAgcG1hZGR3ZCAgICAgICBtMCwgbTEKKyAgICBwYWRkZCAgICAgICAgIG0wLCBtNQorICAgIHBzcmFkICAgICAgICAgbTAsIDE1CisgICAgcHhvciAgICAgICAgICBtMiwgbTIKKyAgICBwdW5wY2tod2QgICAgIG0yLCBtMworICAgIHB1bnBja2h3ZCAgICAgbTEsIG00CisgICAgcG1hZGR3ZCAgICAgICBtMiwgbTEKKyAgICBwYWRkZCAgICAgICAgIG0yLCBtNQorICAgIHBzcmFkICAgICAgICAgbTIsIDE1CisgICAgcGFja3NzZHcgICAgICBtMCwgbTIKKyAgICBtb3ZhICBbb3V0cHV0cStvZmZzZXQycV0sIG0wCisgICAgUkVWRVJTRV9XT1JEUyBtMworICAgIG1vdmEgICAgICAgICAgbTQsIFsgaW5wdXRxK29mZnNldHFdCisgICAgcHhvciAgICAgICAgICBtMCwgbTAKKyAgICBwdW5wY2tsd2QgICAgIG0wLCBtMworICAgIHB1bnBja2x3ZCAgICAgbTEsIG00CisgICAgcG1hZGR3ZCAgICAgICBtMCwgbTEKKyAgICBwYWRkZCAgICAgICAgIG0wLCBtNQorICAgIHBzcmFkICAgICAgICAgbTAsIDE1CisgICAgcHhvciAgICAgICAgICBtMiwgbTIKKyAgICBwdW5wY2tod2QgICAgIG0yLCBtMworICAgIHB1bnBja2h3ZCAgICAgbTEsIG00CisgICAgcG1hZGR3ZCAgICAgICBtMiwgbTEKKyAgICBwYWRkZCAgICAgICAgIG0yLCBtNQorICAgIHBzcmFkICAgICAgICAgbTIsIDE1CisgICAgcGFja3NzZHcgICAgICBtMCwgbTIKKyAgICBtb3ZhICBbb3V0cHV0cStvZmZzZXRxXSwgbTAKKyVlbHNlCisgICAgOyBUaGlzIHZlcnNpb24gZG9lcyB0aGUgMTZ4MTYtPjE2IG11bHRpcGxpY2F0aW9uIGluLXBsYWNlIHdpdGhvdXQgZXhwYW5kaW5nCisgICAgOyB0byAzMi1iaXQuIFRoZSBtbXhleHQgYW5kIHNzZTIgdmVyc2lvbnMgZG8gbm90IHVzZSByb3VuZGluZywgYW5kCisgICAgOyB0aGVyZWZvcmUgYXJlIG5vdCBiaXQtaWRlbnRpY2FsIHRvIHRoZSBDIHZlcnNpb24uCisgICAgbW92YSAgICAgICAgICBtMCwgW3dpbmRvd3Erb2Zmc2V0MnFdCisgICAgbW92YSAgICAgICAgICBtMSwgWyBpbnB1dHErb2Zmc2V0MnFdCisgICAgbW92YSAgICAgICAgICBtMiwgWyBpbnB1dHErb2Zmc2V0cSBdCisgICAgTVVMMTZGSVhFRCAgICBtMSwgbTAsIG0zCisgICAgUkVWRVJTRV9XT1JEUyBtMAorICAgIE1VTDE2RklYRUQgICAgbTIsIG0wLCBtMworICAgIG1vdmEgIFtvdXRwdXRxK29mZnNldDJxXSwgbTEKKyAgICBtb3ZhICBbb3V0cHV0cStvZmZzZXRxIF0sIG0yCislZW5kaWYKKyAgICBhZGQgICAgICBvZmZzZXRkLCBtbXNpemUKKyAgICBzdWIgICAgIG9mZnNldDJkLCBtbXNpemUKKyAgICBqYWUgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitBUFBMWV9XSU5ET1dfSU5UMTYgMAorSU5JVF9YTU0gc3NlMgorQVBQTFlfV0lORE9XX0lOVDE2IDAKKworSU5JVF9NTVggbW14ZXh0CitBUFBMWV9XSU5ET1dfSU5UMTYgMQorSU5JVF9YTU0gc3NlMgorQVBQTFlfV0lORE9XX0lOVDE2IDEKK0lOSVRfWE1NIHNzc2UzCitBUFBMWV9XSU5ET1dfSU5UMTYgMQorSU5JVF9YTU0gc3NzZTMsIGF0b20KK0FQUExZX1dJTkRPV19JTlQxNiAxCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvYWMzZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9hYzNkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTg1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvYWMzZHNwX2luaXQuYwpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIHg4Ni1vcHRpbWl6ZWQgQUMtMyBEU1AgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSnVzdGluIFJ1Z2dsZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2FjMy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYWMzZHNwLmgiCisKK3ZvaWQgZmZfYWMzX2V4cG9uZW50X21pbl9tbXggICAodWludDhfdCAqZXhwLCBpbnQgbnVtX3JldXNlX2Jsb2NrcywgaW50IG5iX2NvZWZzKTsKK3ZvaWQgZmZfYWMzX2V4cG9uZW50X21pbl9tbXhleHQodWludDhfdCAqZXhwLCBpbnQgbnVtX3JldXNlX2Jsb2NrcywgaW50IG5iX2NvZWZzKTsKK3ZvaWQgZmZfYWMzX2V4cG9uZW50X21pbl9zc2UyICAodWludDhfdCAqZXhwLCBpbnQgbnVtX3JldXNlX2Jsb2NrcywgaW50IG5iX2NvZWZzKTsKKworaW50IGZmX2FjM19tYXhfbXNiX2Fic19pbnQxNl9tbXggIChjb25zdCBpbnQxNl90ICpzcmMsIGludCBsZW4pOworaW50IGZmX2FjM19tYXhfbXNiX2Fic19pbnQxNl9tbXhleHQoY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgbGVuKTsKK2ludCBmZl9hYzNfbWF4X21zYl9hYnNfaW50MTZfc3NlMiAoY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgbGVuKTsKK2ludCBmZl9hYzNfbWF4X21zYl9hYnNfaW50MTZfc3NzZTMoY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgbGVuKTsKKwordm9pZCBmZl9hYzNfbHNoaWZ0X2ludDE2X21teCAoaW50MTZfdCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc2hpZnQpOwordm9pZCBmZl9hYzNfbHNoaWZ0X2ludDE2X3NzZTIoaW50MTZfdCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc2hpZnQpOworCit2b2lkIGZmX2FjM19yc2hpZnRfaW50MzJfbW14IChpbnQzMl90ICpzcmMsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBzaGlmdCk7Cit2b2lkIGZmX2FjM19yc2hpZnRfaW50MzJfc3NlMihpbnQzMl90ICpzcmMsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBzaGlmdCk7CisKK3ZvaWQgZmZfZmxvYXRfdG9fZml4ZWQyNF8zZG5vdyhpbnQzMl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIHVuc2lnbmVkIGludCBsZW4pOwordm9pZCBmZl9mbG9hdF90b19maXhlZDI0X3NzZSAgKGludDMyX3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgdW5zaWduZWQgaW50IGxlbik7Cit2b2lkIGZmX2Zsb2F0X3RvX2ZpeGVkMjRfc3NlMiAoaW50MzJfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKTsKKworaW50IGZmX2FjM19jb21wdXRlX21hbnRpc3NhX3NpemVfc3NlMih1aW50MTZfdCBtYW50X2NudFs2XVsxNl0pOworCit2b2lkIGZmX2FjM19leHRyYWN0X2V4cG9uZW50c18zZG5vdyh1aW50OF90ICpleHAsIGludDMyX3QgKmNvZWYsIGludCBuYl9jb2Vmcyk7Cit2b2lkIGZmX2FjM19leHRyYWN0X2V4cG9uZW50c19zc2UyICh1aW50OF90ICpleHAsIGludDMyX3QgKmNvZWYsIGludCBuYl9jb2Vmcyk7Cit2b2lkIGZmX2FjM19leHRyYWN0X2V4cG9uZW50c19zc3NlMyh1aW50OF90ICpleHAsIGludDMyX3QgKmNvZWYsIGludCBuYl9jb2Vmcyk7CisKK3ZvaWQgZmZfYXBwbHlfd2luZG93X2ludDE2X3JvdW5kX21teGV4dChpbnQxNl90ICpvdXRwdXQsIGNvbnN0IGludDE2X3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKndpbmRvdywgdW5zaWduZWQgaW50IGxlbik7Cit2b2lkIGZmX2FwcGx5X3dpbmRvd19pbnQxNl9yb3VuZF9zc2UyKGludDE2X3QgKm91dHB1dCwgY29uc3QgaW50MTZfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKndpbmRvdywgdW5zaWduZWQgaW50IGxlbik7Cit2b2lkIGZmX2FwcGx5X3dpbmRvd19pbnQxNl9tbXhleHQoaW50MTZfdCAqb3V0cHV0LCBjb25zdCBpbnQxNl90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp3aW5kb3csIHVuc2lnbmVkIGludCBsZW4pOwordm9pZCBmZl9hcHBseV93aW5kb3dfaW50MTZfc3NlMihpbnQxNl90ICpvdXRwdXQsIGNvbnN0IGludDE2X3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp3aW5kb3csIHVuc2lnbmVkIGludCBsZW4pOwordm9pZCBmZl9hcHBseV93aW5kb3dfaW50MTZfc3NzZTMoaW50MTZfdCAqb3V0cHV0LCBjb25zdCBpbnQxNl90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKndpbmRvdywgdW5zaWduZWQgaW50IGxlbik7Cit2b2lkIGZmX2FwcGx5X3dpbmRvd19pbnQxNl9zc3NlM19hdG9tKGludDE2X3QgKm91dHB1dCwgY29uc3QgaW50MTZfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKndpbmRvdywgdW5zaWduZWQgaW50IGxlbik7CisKKyNpZiBBUkNIX1g4Nl8zMiAmJiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisjICAgICAgIHVuZGVmIEhBVkVfN1JFR1MKKyMgICAgICAgZGVmaW5lIEhBVkVfN1JFR1MgMAorI2VuZGlmCisKKyNpZiBIQVZFX1NTRV9JTkxJTkUgJiYgSEFWRV83UkVHUworCisjZGVmaW5lIElGMSh4KSB4CisjZGVmaW5lIElGMCh4KQorCisjZGVmaW5lIE1JWDUobW9ubywgc3RlcmVvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnNzICAgICAgICAgICAwKCUxKSwgJSV4bW01ICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCisgICAgICAgICJtb3ZzcyAgICAgICAgICAgOCglMSksICUleG1tNiAgICAgICAgICBcbiIgICAgICAgICAgICAgXAorICAgICAgICAibW92c3MgICAgICAgICAgMjQoJTEpLCAlJXhtbTcgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKKyAgICAgICAgInNodWZwcyAgICAgJDAsICUleG1tNSwgJSV4bW01ICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCisgICAgICAgICJzaHVmcHMgICAgICQwLCAlJXhtbTYsICUleG1tNiAgICAgICAgICBcbiIgICAgICAgICAgICAgXAorICAgICAgICAic2h1ZnBzICAgICAkMCwgJSV4bW03LCAlJXhtbTcgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCisgICAgICAgICJtb3ZhcHMgICAgICAgKCUwLCAlMiksICUleG1tMCAgICAgICAgICBcbiIgICAgICAgICAgICAgXAorICAgICAgICAibW92YXBzICAgICAgICglMCwgJTMpLCAlJXhtbTEgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdmFwcyAgICAgICAoJTAsICU0KSwgJSV4bW0yICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCisgICAgICAgICJtb3ZhcHMgICAgICAgKCUwLCAlNSksICUleG1tMyAgICAgICAgICBcbiIgICAgICAgICAgICAgXAorICAgICAgICAibW92YXBzICAgICAgICglMCwgJTYpLCAlJXhtbTQgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKKyAgICAgICAgIm11bHBzICAgICAgICAgICUleG1tNSwgJSV4bW0wICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCisgICAgICAgICJtdWxwcyAgICAgICAgICAlJXhtbTYsICUleG1tMSAgICAgICAgICBcbiIgICAgICAgICAgICAgXAorICAgICAgICAibXVscHMgICAgICAgICAgJSV4bW01LCAlJXhtbTIgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKKyAgICAgICAgIm11bHBzICAgICAgICAgICUleG1tNywgJSV4bW0zICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCisgICAgICAgICJtdWxwcyAgICAgICAgICAlJXhtbTcsICUleG1tNCAgICAgICAgICBcbiIgICAgICAgICAgICAgXAorIHN0ZXJlbygiYWRkcHMgICAgICAgICAgJSV4bW0xLCAlJXhtbTAgICAgICAgICAgXG4iKSAgICAgICAgICAgIFwKKyAgICAgICAgImFkZHBzICAgICAgICAgICUleG1tMSwgJSV4bW0yICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCisgICAgICAgICJhZGRwcyAgICAgICAgICAlJXhtbTMsICUleG1tMCAgICAgICAgICBcbiIgICAgICAgICAgICAgXAorICAgICAgICAiYWRkcHMgICAgICAgICAgJSV4bW00LCAlJXhtbTIgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKKyAgIG1vbm8oImFkZHBzICAgICAgICAgICUleG1tMiwgJSV4bW0wICAgICAgICAgIFxuIikgICAgICAgICAgICBcCisgICAgICAgICJtb3ZhcHMgICAgICAgICAlJXhtbTAsICglMCwgJTIpICAgICAgICBcbiIgICAgICAgICAgICAgXAorIHN0ZXJlbygibW92YXBzICAgICAgICAgJSV4bW0yLCAoJTAsICUzKSAgICAgICAgXG4iKSAgICAgICAgICAgIFwKKyAgICAgICAgImFkZCAgICAgICAgICAgICAgICQxNiwgJTAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCisgICAgICAgICJqbCAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgXAorICAgICAgICA6ICIrJnIiKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiciIobWF0cml4KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgInIiKHNhbXBsZXNbMF0gKyBsZW4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJyIihzYW1wbGVzWzFdICsgbGVuKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiciIoc2FtcGxlc1syXSArIGxlbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgInIiKHNhbXBsZXNbM10gKyBsZW4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJyIihzYW1wbGVzWzRdICsgbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiBYTU1fQ0xPQkJFUlMoIiV4bW0wIiwgIiV4bW0xIiwgIiV4bW0yIiwgIiV4bW0zIiwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIiV4bW00IiwgIiV4bW01IiwgIiV4bW02IiwgIiV4bW03IiwpICAgICAgXAorICAgICAgICAgIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOworCisjZGVmaW5lIE1JWF9NSVNDKHN0ZXJlbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgJTUsICUyICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICBcCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92IC0lYzcoJTYsICUyLCAlYzgpLCAlMyAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdmFwcyAgICAgKCUzLCAlMCksICUleG1tMCAgICAgICAgXG4iICAgICAgICAgICAgICAgICBcCisgc3RlcmVvKCJtb3ZhcHMgICAgICAgJSV4bW0wLCAlJXhtbTEgICAgICAgIFxuIikgICAgICAgICAgICAgICAgXAorICAgICAgICAibXVscHMgICAgICAgICUleG1tNCwgJSV4bW0wICAgICAgICBcbiIgICAgICAgICAgICAgICAgIFwKKyBzdGVyZW8oIm11bHBzICAgICAgICAlJXhtbTUsICUleG1tMSAgICAgICAgXG4iKSAgICAgICAgICAgICAgICBcCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92ICAgKCU2LCAlMiwgJWM4KSwgJTEgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdmFwcyAgICAgKCUxLCAlMCksICUleG1tMiAgICAgICAgXG4iICAgICAgICAgICAgICAgICBcCisgc3RlcmVvKCJtb3ZhcHMgICAgICAgJSV4bW0yLCAlJXhtbTMgICAgICAgIFxuIikgICAgICAgICAgICAgICAgXAorICAgICAgICAibXVscHMgICAoJTQsICUyLCA4KSwgJSV4bW0yICAgICAgICBcbiIgICAgICAgICAgICAgICAgIFwKKyBzdGVyZW8oIm11bHBzIDE2KCU0LCAlMiwgOCksICUleG1tMyAgICAgICAgXG4iKSAgICAgICAgICAgICAgICBcCisgICAgICAgICJhZGRwcyAgICAgICAgJSV4bW0yLCAlJXhtbTAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAorIHN0ZXJlbygiYWRkcHMgICAgICAgICUleG1tMywgJSV4bW0xICAgICAgICBcbiIpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZCAgICAgICAgICAgICAgJDQsICUyICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICBcCisgICAgICAgICJqbCAgICAgICAgICAgICAgIDJiICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92ICAgICAgICAgICAgICAlNSwgJTIgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgIFwKKyBzdGVyZW8oIm1vdiAgICglNiwgJTIsICVjOCksICUxICAgICAgICAgICAgXG4iKSAgICAgICAgICAgICAgICBcCisgICAgICAgICJtb3ZhcHMgICAgICAgJSV4bW0wLCAoJTMsICUwKSAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAorIHN0ZXJlbygibW92YXBzICAgICAgICUleG1tMSwgKCUxLCAlMCkgICAgICBcbiIpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZCAgICAgICAgICAgICAkMTYsICUwICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICBcCisgICAgICAgICJqbCAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICIrJnIiKGkpLCAiPSZyIihqKSwgIj0mciIoayksICI9JnIiKG0pICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiciIobWF0cml4X3NpbWQgKyBpbl9jaCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgImciKChpbnRwdHJfdCkgLSA0ICogKGluX2NoIC0gMSkpLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJyIihzYW1wICsgaW5fY2gpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiaSIoc2l6ZW9mKGZsb2F0ICopKSwgImkiKHNpemVvZihmbG9hdCAqKS80KSAgICAgICAgICBcCisgICAgICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk7CisKK3N0YXRpYyB2b2lkIGFjM19kb3dubWl4X3NzZShmbG9hdCAqKnNhbXBsZXMsIGZsb2F0ICgqbWF0cml4KVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gsIGludCBsZW4pCit7CisgICAgaW50ICgqbWF0cml4X2NtcClbMl0gPSAoaW50KCopWzJdKW1hdHJpeDsKKyAgICBpbnRwdHJfdCBpLCBqLCBrLCBtOworCisgICAgaSA9IC1sZW4gKiBzaXplb2YoZmxvYXQpOworICAgIGlmIChpbl9jaCA9PSA1ICYmIG91dF9jaCA9PSAyICYmCisgICAgICAgICEobWF0cml4X2NtcFswXVsxXSB8IG1hdHJpeF9jbXBbMl1bMF0gICB8CisgICAgICAgICAgbWF0cml4X2NtcFszXVsxXSB8IG1hdHJpeF9jbXBbNF1bMF0gICB8CisgICAgICAgICAgKG1hdHJpeF9jbXBbMV1bMF0gXiBtYXRyaXhfY21wWzFdWzFdKSB8CisgICAgICAgICAgKG1hdHJpeF9jbXBbMF1bMF0gXiBtYXRyaXhfY21wWzJdWzFdKSkpIHsKKyAgICAgICAgTUlYNShJRjAsIElGMSk7CisgICAgfSBlbHNlIGlmIChpbl9jaCA9PSA1ICYmIG91dF9jaCA9PSAxICYmCisgICAgICAgICAgICAgICBtYXRyaXhfY21wWzBdWzBdID09IG1hdHJpeF9jbXBbMl1bMF0gJiYKKyAgICAgICAgICAgICAgIG1hdHJpeF9jbXBbM11bMF0gPT0gbWF0cml4X2NtcFs0XVswXSkgeworICAgICAgICBNSVg1KElGMSwgSUYwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUNMQVJFX0FMSUdORUQoMTYsIGZsb2F0LCBtYXRyaXhfc2ltZClbQUMzX01BWF9DSEFOTkVMU11bMl1bNF07CisgICAgICAgIGZsb2F0ICpzYW1wW0FDM19NQVhfQ0hBTk5FTFNdOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbl9jaDsgaisrKQorICAgICAgICAgICAgc2FtcFtqXSA9IHNhbXBsZXNbal0gKyBsZW47CisKKyAgICAgICAgaiA9IDIgKiBpbl9jaCAqIHNpemVvZihmbG9hdCk7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgICAic3ViICAgICAgICAgICAgICQ4LCAlMCAgICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICJtb3ZzcyAgICAgKCUyLCAlMCksICUleG1tNCAgICAgICAgIFxuIgorICAgICAgICAgICAgIm1vdnNzICAgIDQoJTIsICUwKSwgJSV4bW01ICAgICAgICAgXG4iCisgICAgICAgICAgICAic2h1ZnBzICAgICAgICAgICQwLCAlJXhtbTQsICUleG1tNCBcbiIKKyAgICAgICAgICAgICJzaHVmcHMgICAgICAgICAgJDAsICUleG1tNSwgJSV4bW01IFxuIgorICAgICAgICAgICAgIm1vdmFwcyAgICAgICUleG1tNCwgICAoJTEsICUwLCA0KSAgXG4iCisgICAgICAgICAgICAibW92YXBzICAgICAgJSV4bW01LCAxNiglMSwgJTAsIDQpICBcbiIKKyAgICAgICAgICAgICJqZyAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgOiAiKyZyIihqKQorICAgICAgICAgICAgOiAiciIobWF0cml4X3NpbWQpLCAiciIobWF0cml4KQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgICAgICBpZiAob3V0X2NoID09IDIpIHsKKyAgICAgICAgICAgIE1JWF9NSVNDKElGMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNSVhfTUlTQyhJRjApOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYgLyogSEFWRV9TU0VfSU5MSU5FICYmIEhBVkVfN1JFR1MgKi8KKworYXZfY29sZCB2b2lkIGZmX2FjM2RzcF9pbml0X3g4NihBQzNEU1BDb250ZXh0ICpjLCBpbnQgYml0X2V4YWN0KQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YWMzX2V4cG9uZW50X21pbiA9IGZmX2FjM19leHBvbmVudF9taW5fbW14OworICAgICAgICBjLT5hYzNfbWF4X21zYl9hYnNfaW50MTYgPSBmZl9hYzNfbWF4X21zYl9hYnNfaW50MTZfbW14OworICAgICAgICBjLT5hYzNfbHNoaWZ0X2ludDE2ID0gZmZfYWMzX2xzaGlmdF9pbnQxNl9tbXg7CisgICAgICAgIGMtPmFjM19yc2hpZnRfaW50MzIgPSBmZl9hYzNfcnNoaWZ0X2ludDMyX21teDsKKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX0FNRDNETk9XKGNwdV9mbGFncykpIHsKKyAgICAgICAgaWYgKCFiaXRfZXhhY3QpIHsKKyAgICAgICAgICAgIGMtPmZsb2F0X3RvX2ZpeGVkMjQgPSBmZl9mbG9hdF90b19maXhlZDI0XzNkbm93OworICAgICAgICB9CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5hYzNfZXhwb25lbnRfbWluID0gZmZfYWMzX2V4cG9uZW50X21pbl9tbXhleHQ7CisgICAgICAgIGMtPmFjM19tYXhfbXNiX2Fic19pbnQxNiA9IGZmX2FjM19tYXhfbXNiX2Fic19pbnQxNl9tbXhleHQ7CisgICAgICAgIGlmIChiaXRfZXhhY3QpIHsKKyAgICAgICAgICAgIGMtPmFwcGx5X3dpbmRvd19pbnQxNiA9IGZmX2FwcGx5X3dpbmRvd19pbnQxNl9tbXhleHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjLT5hcHBseV93aW5kb3dfaW50MTYgPSBmZl9hcHBseV93aW5kb3dfaW50MTZfcm91bmRfbW14ZXh0OworICAgICAgICB9CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU0UoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5mbG9hdF90b19maXhlZDI0ID0gZmZfZmxvYXRfdG9fZml4ZWQyNF9zc2U7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YWMzX2V4cG9uZW50X21pbiA9IGZmX2FjM19leHBvbmVudF9taW5fc3NlMjsKKyAgICAgICAgYy0+YWMzX21heF9tc2JfYWJzX2ludDE2ID0gZmZfYWMzX21heF9tc2JfYWJzX2ludDE2X3NzZTI7CisgICAgICAgIGMtPmZsb2F0X3RvX2ZpeGVkMjQgPSBmZl9mbG9hdF90b19maXhlZDI0X3NzZTI7CisgICAgICAgIGMtPmNvbXB1dGVfbWFudGlzc2Ffc2l6ZSA9IGZmX2FjM19jb21wdXRlX21hbnRpc3NhX3NpemVfc3NlMjsKKyAgICAgICAgYy0+ZXh0cmFjdF9leHBvbmVudHMgPSBmZl9hYzNfZXh0cmFjdF9leHBvbmVudHNfc3NlMjsKKyAgICAgICAgaWYgKCEoY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfU1NFMlNMT1cpKSB7CisgICAgICAgICAgICBjLT5hYzNfbHNoaWZ0X2ludDE2ID0gZmZfYWMzX2xzaGlmdF9pbnQxNl9zc2UyOworICAgICAgICAgICAgYy0+YWMzX3JzaGlmdF9pbnQzMiA9IGZmX2FjM19yc2hpZnRfaW50MzJfc3NlMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYml0X2V4YWN0KSB7CisgICAgICAgICAgICBjLT5hcHBseV93aW5kb3dfaW50MTYgPSBmZl9hcHBseV93aW5kb3dfaW50MTZfc3NlMjsKKyAgICAgICAgfSBlbHNlIGlmICghKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX1NTRTJTTE9XKSkgeworICAgICAgICAgICAgYy0+YXBwbHlfd2luZG93X2ludDE2ID0gZmZfYXBwbHlfd2luZG93X2ludDE2X3JvdW5kX3NzZTI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YWMzX21heF9tc2JfYWJzX2ludDE2ID0gZmZfYWMzX21heF9tc2JfYWJzX2ludDE2X3Nzc2UzOworICAgICAgICBpZiAoY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfQVRPTSkgeworICAgICAgICAgICAgYy0+YXBwbHlfd2luZG93X2ludDE2ID0gZmZfYXBwbHlfd2luZG93X2ludDE2X3Nzc2UzX2F0b207CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjLT5leHRyYWN0X2V4cG9uZW50cyA9IGZmX2FjM19leHRyYWN0X2V4cG9uZW50c19zc3NlMzsKKyAgICAgICAgICAgIGMtPmFwcGx5X3dpbmRvd19pbnQxNiA9IGZmX2FwcGx5X3dpbmRvd19pbnQxNl9zc3NlMzsKKyAgICAgICAgfQorICAgIH0KKworI2lmIEhBVkVfU1NFX0lOTElORSAmJiBIQVZFXzdSRUdTCisgICAgaWYgKElOTElORV9TU0UoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5kb3dubWl4ID0gYWMzX2Rvd25taXhfc3NlOworICAgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2F1ZGlvZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9hdWRpb2RzcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczYjllZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9hdWRpb2RzcC5hc20KQEAgLTAsMCArMSwxNzcgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIG9wdGltaXplZCBhdWRpbyBmdW5jdGlvbnMKKzsqIENvcHlyaWdodCAoYykgMjAwOCBMb3JlbiBNZXJyaXR0Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9URVhUCisKKyVtYWNybyBTQ0FMQVJQUk9EVUNUIDAKKzsgaW50IGZmX3NjYWxhcnByb2R1Y3RfaW50MTYoaW50MTZfdCAqdjEsIGludDE2X3QgKnYyLCBpbnQgb3JkZXIpCitjZ2xvYmFsIHNjYWxhcnByb2R1Y3RfaW50MTYsIDMsMywzLCB2MSwgdjIsIG9yZGVyCisgICAgc2hsIG9yZGVycSwgMQorICAgIGFkZCB2MXEsIG9yZGVycQorICAgIGFkZCB2MnEsIG9yZGVycQorICAgIG5lZyBvcmRlcnEKKyAgICBweG9yICAgIG0yLCBtMgorLmxvb3A6CisgICAgbW92dSAgICBtMCwgW3YxcSArIG9yZGVycV0KKyAgICBtb3Z1ICAgIG0xLCBbdjFxICsgb3JkZXJxICsgbW1zaXplXQorICAgIHBtYWRkd2QgbTAsIFt2MnEgKyBvcmRlcnFdCisgICAgcG1hZGR3ZCBtMSwgW3YycSArIG9yZGVycSArIG1tc2l6ZV0KKyAgICBwYWRkZCAgIG0yLCBtMAorICAgIHBhZGRkICAgbTIsIG0xCisgICAgYWRkICAgICBvcmRlcnEsIG1tc2l6ZSoyCisgICAgamwgLmxvb3AKKyAgICBIQURERCAgIG0yLCBtMAorICAgIG1vdmQgICBlYXgsIG0yCislaWYgbW1zaXplID09IDgKKyAgICBlbW1zCislZW5kaWYKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1NDQUxBUlBST0RVQ1QKK0lOSVRfWE1NIHNzZTIKK1NDQUxBUlBST0RVQ1QKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl92ZWN0b3JfY2xpcF9pbnQzMihpbnQzMl90ICpkc3QsIGNvbnN0IGludDMyX3QgKnNyYywgaW50MzJfdCBtaW4sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXgsIHVuc2lnbmVkIGludCBsZW4pCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOyAlMSA9IG51bWJlciBvZiB4bW0gcmVnaXN0ZXJzIHVzZWQKKzsgJTIgPSBudW1iZXIgb2YgaW5saW5lIGxvYWQvcHJvY2Vzcy9zdG9yZSBsb29wcyBwZXIgYXNtIGxvb3AKKzsgJTMgPSBwcm9jZXNzIDQqbW1zaXplICglMz0wKSBvciA4Km1tc2l6ZSAoJTM9MSkgYnl0ZXMgcGVyIGxvb3AKKzsgJTQgPSBDTElQRCBmdW5jdGlvbiB0YWtlcyBtaW4vbWF4IGFzIGZsb2F0IGluc3RlYWQgb2YgaW50IChDTElQRF9TU0UyKQorOyAlNSA9IHN1ZmZpeAorJW1hY3JvIFZFQ1RPUl9DTElQX0lOVDMyIDQtNQorY2dsb2JhbCB2ZWN0b3JfY2xpcF9pbnQzMiU1LCA1LDUsJTEsIGRzdCwgc3JjLCBtaW4sIG1heCwgbGVuCislaWYgJTQKKyAgICBjdnRzaTJzcyAgbTQsIG1pbm0KKyAgICBjdnRzaTJzcyAgbTUsIG1heG0KKyVlbHNlCisgICAgbW92ZCAgICAgIG00LCBtaW5tCisgICAgbW92ZCAgICAgIG01LCBtYXhtCislZW5kaWYKKyAgICBTUExBVEQgICAgbTQKKyAgICBTUExBVEQgICAgbTUKKy5sb29wOgorJWFzc2lnbiAlJWkgMAorJXJlcCAlMgorICAgIG1vdmEgICAgICBtMCwgIFtzcmNxK21tc2l6ZSooMCslJWkpXQorICAgIG1vdmEgICAgICBtMSwgIFtzcmNxK21tc2l6ZSooMSslJWkpXQorICAgIG1vdmEgICAgICBtMiwgIFtzcmNxK21tc2l6ZSooMislJWkpXQorICAgIG1vdmEgICAgICBtMywgIFtzcmNxK21tc2l6ZSooMyslJWkpXQorJWlmICUzCisgICAgbW92YSAgICAgIG03LCAgW3NyY3ErbW1zaXplKig0KyUlaSldCisgICAgbW92YSAgICAgIG04LCAgW3NyY3ErbW1zaXplKig1KyUlaSldCisgICAgbW92YSAgICAgIG05LCAgW3NyY3ErbW1zaXplKig2KyUlaSldCisgICAgbW92YSAgICAgIG0xMCwgW3NyY3ErbW1zaXplKig3KyUlaSldCislZW5kaWYKKyAgICBDTElQRCAgbTAsICBtNCwgbTUsIG02CisgICAgQ0xJUEQgIG0xLCAgbTQsIG01LCBtNgorICAgIENMSVBEICBtMiwgIG00LCBtNSwgbTYKKyAgICBDTElQRCAgbTMsICBtNCwgbTUsIG02CislaWYgJTMKKyAgICBDTElQRCAgbTcsICBtNCwgbTUsIG02CisgICAgQ0xJUEQgIG04LCAgbTQsIG01LCBtNgorICAgIENMSVBEICBtOSwgIG00LCBtNSwgbTYKKyAgICBDTElQRCAgbTEwLCBtNCwgbTUsIG02CislZW5kaWYKKyAgICBtb3ZhICBbZHN0cSttbXNpemUqKDArJSVpKV0sIG0wCisgICAgbW92YSAgW2RzdHErbW1zaXplKigxKyUlaSldLCBtMQorICAgIG1vdmEgIFtkc3RxK21tc2l6ZSooMislJWkpXSwgbTIKKyAgICBtb3ZhICBbZHN0cSttbXNpemUqKDMrJSVpKV0sIG0zCislaWYgJTMKKyAgICBtb3ZhICBbZHN0cSttbXNpemUqKDQrJSVpKV0sIG03CisgICAgbW92YSAgW2RzdHErbW1zaXplKig1KyUlaSldLCBtOAorICAgIG1vdmEgIFtkc3RxK21tc2l6ZSooNislJWkpXSwgbTkKKyAgICBtb3ZhICBbZHN0cSttbXNpemUqKDcrJSVpKV0sIG0xMAorJWVuZGlmCislYXNzaWduICUlaSAlJWkrNCooJTMrMSkKKyVlbmRyZXAKKyAgICBhZGQgICAgIHNyY3EsIG1tc2l6ZSo0KiglMislMykKKyAgICBhZGQgICAgIGRzdHEsIG1tc2l6ZSo0KiglMislMykKKyAgICBzdWIgICAgIGxlbmQsIG1tc2l6ZSooJTIrJTMpCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CislZGVmaW5lIENMSVBEIENMSVBEX01NWAorVkVDVE9SX0NMSVBfSU5UMzIgMCwgMSwgMCwgMAorSU5JVF9YTU0gc3NlMgorVkVDVE9SX0NMSVBfSU5UMzIgNiwgMSwgMCwgMCwgX2ludAorJWRlZmluZSBDTElQRCBDTElQRF9TU0UyCitWRUNUT1JfQ0xJUF9JTlQzMiA2LCAyLCAwLCAxCitJTklUX1hNTSBzc2U0CislZGVmaW5lIENMSVBEIENMSVBEX1NTRTQxCislaWZkZWYgbTgKK1ZFQ1RPUl9DTElQX0lOVDMyIDExLCAxLCAxLCAwCislZWxzZQorVkVDVE9SX0NMSVBfSU5UMzIgNiwgMSwgMCwgMAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorO3ZvaWQgZmZfdmVjdG9yX2NsaXBmKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsCis7ICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWluLCBmbG9hdCBtYXgsIGludCBsZW4pCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lOSVRfWE1NIHNzZQorJWlmIFVOSVg2NAorY2dsb2JhbCB2ZWN0b3JfY2xpcGYsIDMsMyw2LCBkc3QsIHNyYywgbGVuCislZWxzZQorY2dsb2JhbCB2ZWN0b3JfY2xpcGYsIDUsNSw2LCBkc3QsIHNyYywgbWluLCBtYXgsIGxlbgorJWVuZGlmCislaWYgV0lONjQKKyAgICBTV0FQIDAsIDIKKyAgICBTV0FQIDEsIDMKKyVlbGlmIEFSQ0hfWDg2XzMyCisgICAgbW92c3MgICBtMCwgbWlubQorICAgIG1vdnNzICAgbTEsIG1heG0KKyVlbmRpZgorICAgIFNQTEFURCAgbTAKKyAgICBTUExBVEQgIG0xCisgICAgICAgIHNobCBsZW5kLCAyCisgICAgICAgIGFkZCBzcmNxLCBsZW5xCisgICAgICAgIGFkZCBkc3RxLCBsZW5xCisgICAgICAgIG5lZyBsZW5xCisubG9vcDoKKyAgICBtb3ZhICAgIG0yLCAgW3NyY3ErbGVucSttbXNpemUqMF0KKyAgICBtb3ZhICAgIG0zLCAgW3NyY3ErbGVucSttbXNpemUqMV0KKyAgICBtb3ZhICAgIG00LCAgW3NyY3ErbGVucSttbXNpemUqMl0KKyAgICBtb3ZhICAgIG01LCAgW3NyY3ErbGVucSttbXNpemUqM10KKyAgICBtYXhwcyAgIG0yLCBtMAorICAgIG1heHBzICAgbTMsIG0wCisgICAgbWF4cHMgICBtNCwgbTAKKyAgICBtYXhwcyAgIG01LCBtMAorICAgIG1pbnBzICAgbTIsIG0xCisgICAgbWlucHMgICBtMywgbTEKKyAgICBtaW5wcyAgIG00LCBtMQorICAgIG1pbnBzICAgbTUsIG0xCisgICAgbW92YSAgICBbZHN0cStsZW5xK21tc2l6ZSowXSwgbTIKKyAgICBtb3ZhICAgIFtkc3RxK2xlbnErbW1zaXplKjFdLCBtMworICAgIG1vdmEgICAgW2RzdHErbGVucSttbXNpemUqMl0sIG00CisgICAgbW92YSAgICBbZHN0cStsZW5xK21tc2l6ZSozXSwgbTUKKyAgICBhZGQgICAgIGxlbnEsIG1tc2l6ZSo0CisgICAgamwgLmxvb3AKKyAgICBSRVBfUkVUCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvYXVkaW9kc3BfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2F1ZGlvZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmNlMjMxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2F1ZGlvZHNwX2luaXQuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F1ZGlvZHNwLmgiCisKK2ludDMyX3QgZmZfc2NhbGFycHJvZHVjdF9pbnQxNl9tbXhleHQoY29uc3QgaW50MTZfdCAqdjEsIGNvbnN0IGludDE2X3QgKnYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIpOworaW50MzJfdCBmZl9zY2FsYXJwcm9kdWN0X2ludDE2X3NzZTIoY29uc3QgaW50MTZfdCAqdjEsIGNvbnN0IGludDE2X3QgKnYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yZGVyKTsKKwordm9pZCBmZl92ZWN0b3JfY2xpcF9pbnQzMl9tbXgoaW50MzJfdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbiwgaW50MzJfdCBtYXgsIHVuc2lnbmVkIGludCBsZW4pOwordm9pZCBmZl92ZWN0b3JfY2xpcF9pbnQzMl9zc2UyKGludDMyX3QgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluLCBpbnQzMl90IG1heCwgdW5zaWduZWQgaW50IGxlbik7Cit2b2lkIGZmX3ZlY3Rvcl9jbGlwX2ludDMyX2ludF9zc2UyKGludDMyX3QgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbiwgaW50MzJfdCBtYXgsIHVuc2lnbmVkIGludCBsZW4pOwordm9pZCBmZl92ZWN0b3JfY2xpcF9pbnQzMl9zc2U0KGludDMyX3QgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluLCBpbnQzMl90IG1heCwgdW5zaWduZWQgaW50IGxlbik7Cit2b2lkIGZmX3ZlY3Rvcl9jbGlwZl9zc2UoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaW4sIGZsb2F0IG1heCwgaW50IGxlbik7CisKK2F2X2NvbGQgdm9pZCBmZl9hdWRpb2RzcF9pbml0X3g4NihBdWRpb0RTUENvbnRleHQgKmMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkKKyAgICAgICAgYy0+dmVjdG9yX2NsaXBfaW50MzIgPSBmZl92ZWN0b3JfY2xpcF9pbnQzMl9tbXg7CisKKyAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpCisgICAgICAgIGMtPnNjYWxhcnByb2R1Y3RfaW50MTYgPSBmZl9zY2FsYXJwcm9kdWN0X2ludDE2X21teGV4dDsKKworICAgIGlmIChFWFRFUk5BTF9TU0UoY3B1X2ZsYWdzKSkKKyAgICAgICAgYy0+dmVjdG9yX2NsaXBmID0gZmZfdmVjdG9yX2NsaXBmX3NzZTsKKworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+c2NhbGFycHJvZHVjdF9pbnQxNiA9IGZmX3NjYWxhcnByb2R1Y3RfaW50MTZfc3NlMjsKKyAgICAgICAgaWYgKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX0FUT00pCisgICAgICAgICAgICBjLT52ZWN0b3JfY2xpcF9pbnQzMiA9IGZmX3ZlY3Rvcl9jbGlwX2ludDMyX2ludF9zc2UyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjLT52ZWN0b3JfY2xpcF9pbnQzMiA9IGZmX3ZlY3Rvcl9jbGlwX2ludDMyX3NzZTI7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkKKyAgICAgICAgYy0+dmVjdG9yX2NsaXBfaW50MzIgPSBmZl92ZWN0b3JfY2xpcF9pbnQzMl9zc2U0OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2Jsb2NrZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ibG9ja2RzcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5Mzg1OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ibG9ja2RzcC5hc20KQEAgLTAsMCArMSw4NiBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogU0lNRC1vcHRpbWl6ZWQgY2xlYXIgYmxvY2sgZnVuY3Rpb25zCis7KiBDb3B5cmlnaHQgKGMpIDIwMDIgTWljaGFlbCBOaWVkZXJtYXllcgorOyogQ29weXJpZ2h0IChjKSAyMDA4IExvcmVuIE1lcnJpdHQKKzsqIENvcHlyaWdodCAoYykgMjAwOSBGaW9uYSBHbGFzZXIKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1RFWFQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jbGVhcl9ibG9jayhpbnQxNl90ICpibG9ja3MpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgJTEgPSBudW1iZXIgb2YgeG1tIHJlZ2lzdGVycyB1c2VkCis7ICUyID0gbnVtYmVyIG9mIGlubGluZSBzdG9yZSBsb29wcworJW1hY3JvIENMRUFSX0JMT0NLIDIKK2NnbG9iYWwgY2xlYXJfYmxvY2ssIDEsIDEsICUxLCBibG9ja3MKKyAgICBaRVJPICBtMCwgbTAKKyVhc3NpZ24gJSVpIDAKKyVyZXAgJTIKKyAgICBtb3ZhICBbYmxvY2tzcSttbXNpemUqKDArJSVpKV0sIG0wCisgICAgbW92YSAgW2Jsb2Nrc3ErbW1zaXplKigxKyUlaSldLCBtMAorICAgIG1vdmEgIFtibG9ja3NxK21tc2l6ZSooMislJWkpXSwgbTAKKyAgICBtb3ZhICBbYmxvY2tzcSttbXNpemUqKDMrJSVpKV0sIG0wCisgICAgbW92YSAgW2Jsb2Nrc3ErbW1zaXplKig0KyUlaSldLCBtMAorICAgIG1vdmEgIFtibG9ja3NxK21tc2l6ZSooNSslJWkpXSwgbTAKKyAgICBtb3ZhICBbYmxvY2tzcSttbXNpemUqKDYrJSVpKV0sIG0wCisgICAgbW92YSAgW2Jsb2Nrc3ErbW1zaXplKig3KyUlaSldLCBtMAorJWFzc2lnbiAlJWkgJSVpKzgKKyVlbmRyZXAKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKKyVkZWZpbmUgWkVSTyBweG9yCitDTEVBUl9CTE9DSyAwLCAyCitJTklUX1hNTSBzc2UKKyVkZWZpbmUgWkVSTyB4b3JwcworQ0xFQVJfQkxPQ0sgMSwgMQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jbGVhcl9ibG9ja3MoaW50MTZfdCAqYmxvY2tzKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAlMSA9IG51bWJlciBvZiB4bW0gcmVnaXN0ZXJzIHVzZWQKKyVtYWNybyBDTEVBUl9CTE9DS1MgMQorY2dsb2JhbCBjbGVhcl9ibG9ja3MsIDEsIDIsICUxLCBibG9ja3MsIGxlbgorICAgIGFkZCAgIGJsb2Nrc3EsIDc2OAorICAgIG1vdiAgICAgIGxlbnEsIC03NjgKKyAgICBaRVJPICAgICAgIG0wLCBtMAorLmxvb3AKKyAgICBtb3ZhICBbYmxvY2tzcStsZW5xK21tc2l6ZSowXSwgbTAKKyAgICBtb3ZhICBbYmxvY2tzcStsZW5xK21tc2l6ZSoxXSwgbTAKKyAgICBtb3ZhICBbYmxvY2tzcStsZW5xK21tc2l6ZSoyXSwgbTAKKyAgICBtb3ZhICBbYmxvY2tzcStsZW5xK21tc2l6ZSozXSwgbTAKKyAgICBtb3ZhICBbYmxvY2tzcStsZW5xK21tc2l6ZSo0XSwgbTAKKyAgICBtb3ZhICBbYmxvY2tzcStsZW5xK21tc2l6ZSo1XSwgbTAKKyAgICBtb3ZhICBbYmxvY2tzcStsZW5xK21tc2l6ZSo2XSwgbTAKKyAgICBtb3ZhICBbYmxvY2tzcStsZW5xK21tc2l6ZSo3XSwgbTAKKyAgICBhZGQgICBsZW5xLCBtbXNpemUqOAorICAgIGpzIC5sb29wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CislZGVmaW5lIFpFUk8gcHhvcgorQ0xFQVJfQkxPQ0tTIDAKK0lOSVRfWE1NIHNzZQorJWRlZmluZSBaRVJPIHhvcnBzCitDTEVBUl9CTE9DS1MgMQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2Jsb2NrZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ibG9ja2RzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc4MDE4NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ibG9ja2RzcF9pbml0LmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYmxvY2tkc3AuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZlcnNpb24uaCIKKwordm9pZCBmZl9jbGVhcl9ibG9ja19tbXgoaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9jbGVhcl9ibG9ja19zc2UoaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9jbGVhcl9ibG9ja3NfbW14KGludDE2X3QgKmJsb2Nrcyk7Cit2b2lkIGZmX2NsZWFyX2Jsb2Nrc19zc2UoaW50MTZfdCAqYmxvY2tzKTsKKworI2lmIEZGX0FQSV9YVk1DCithdl9jb2xkIHZvaWQgZmZfYmxvY2tkc3BfaW5pdF94ODYoQmxvY2tEU1BDb250ZXh0ICpjLCB1bnNpZ25lZCBoaWdoX2JpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCisjZWxzZQorYXZfY29sZCB2b2lkIGZmX2Jsb2NrZHNwX2luaXRfeDg2KEJsb2NrRFNQQ29udGV4dCAqYywgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpCisjZW5kaWYgLyogRkZfQVBJX1hWTUMgKi8KK3sKKyNpZiBIQVZFX1lBU00KKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKCFoaWdoX2JpdF9kZXB0aCkgeworICAgICAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmNsZWFyX2Jsb2NrICA9IGZmX2NsZWFyX2Jsb2NrX21teDsKKyAgICAgICAgICAgIGMtPmNsZWFyX2Jsb2NrcyA9IGZmX2NsZWFyX2Jsb2Nrc19tbXg7CisgICAgICAgIH0KKworICAgIC8qIFh2TUNDcmVhdGVCbG9ja3MoKSBtYXkgbm90IGFsbG9jYXRlIDE2LWJ5dGUgYWxpZ25lZCBibG9ja3MgKi8KKyAgICBpZiAoQ09ORklHX1hWTUMgJiYgYXZjdHgtPmh3YWNjZWwgJiYgYXZjdHgtPmh3YWNjZWwtPmRlY29kZV9tYikKKyAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgYy0+Y2xlYXJfYmxvY2sgID0gZmZfY2xlYXJfYmxvY2tfc3NlOworICAgICAgICAgICAgYy0+Y2xlYXJfYmxvY2tzID0gZmZfY2xlYXJfYmxvY2tzX3NzZTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBIQVZFX1lBU00gKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ic3dhcGRzcC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvYnN3YXBkc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMDYwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvYnN3YXBkc3AuYXNtCkBAIC0wLDAgKzEsMTQwIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBvcHRpbWl6ZWQgYnN3YXAgYnVmZmVyIGZ1bmN0aW9ucworOyogQ29weXJpZ2h0IChjKSAyMDA4IExvcmVuIE1lcnJpdHQKKzsqIENvcHlyaWdodCAoYykgMjAwMy0yMDEzIE1pY2hhZWwgTmllZGVybWF5ZXIKKzsqIENvcHlyaWdodCAoYykgMjAxMyBEYW5pZWwgS2FuZworOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCitwYl9ic3dhcDMyOiBkYiAzLCAyLCAxLCAwLCA3LCA2LCA1LCA0LCAxMSwgMTAsIDksIDgsIDE1LCAxNCwgMTMsIDEyCisKK2NleHRlcm4gcGJfODAKKworU0VDVElPTl9URVhUCisKKzsgJTEgPSBhbGlnbmVkL3VuYWxpZ25lZAorJW1hY3JvIEJTV0FQX0xPT1BTICAxCisgICAgbW92ICAgICAgcjMsIHIyCisgICAgc2FyICAgICAgcjIsIDMKKyAgICBqeiAgICAgICAubGVmdDRfJTEKKy5sb29wOF8lMToKKyAgICBtb3YlMSAgICBtMCwgW3IxICsgIDBdCisgICAgbW92JTEgICAgbTEsIFtyMSArIDE2XQorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgcHNodWZiICAgbTAsIG0yCisgICAgcHNodWZiICAgbTEsIG0yCisgICAgbW92JTEgICAgW3IwICsgIDBdLCBtMAorICAgIG1vdiUxICAgIFtyMCArIDE2XSwgbTEKKyVlbHNlCisgICAgcHNodWZsdyAgbTAsIG0wLCAxMDExMDAwMWIKKyAgICBwc2h1Zmx3ICBtMSwgbTEsIDEwMTEwMDAxYgorICAgIHBzaHVmaHcgIG0wLCBtMCwgMTAxMTAwMDFiCisgICAgcHNodWZodyAgbTEsIG0xLCAxMDExMDAwMWIKKyAgICBtb3ZhICAgICBtMiwgbTAKKyAgICBtb3ZhICAgICBtMywgbTEKKyAgICBwc2xsdyAgICBtMCwgOAorICAgIHBzbGx3ICAgIG0xLCA4CisgICAgcHNybHcgICAgbTIsIDgKKyAgICBwc3JsdyAgICBtMywgOAorICAgIHBvciAgICAgIG0yLCBtMAorICAgIHBvciAgICAgIG0zLCBtMQorICAgIG1vdiUxICAgIFtyMCArICAwXSwgbTIKKyAgICBtb3YlMSAgICBbcjAgKyAxNl0sIG0zCislZW5kaWYKKyAgICBhZGQgICAgICByMCwgMzIKKyAgICBhZGQgICAgICByMSwgMzIKKyAgICBkZWMgICAgICByMgorICAgIGpueiAgICAgIC5sb29wOF8lMQorLmxlZnQ0XyUxOgorICAgIG1vdiAgICAgIHIyLCByMworICAgIGFuZCAgICAgIHIzLCA0CisgICAganogICAgICAgLmxlZnQKKyAgICBtb3YlMSAgICBtMCwgW3IxXQorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgcHNodWZiICAgbTAsIG0yCisgICAgbW92JTEgICAgW3IwXSwgbTAKKyVlbHNlCisgICAgcHNodWZsdyAgbTAsIG0wLCAxMDExMDAwMWIKKyAgICBwc2h1Zmh3ICBtMCwgbTAsIDEwMTEwMDAxYgorICAgIG1vdmEgICAgIG0yLCBtMAorICAgIHBzbGx3ICAgIG0wLCA4CisgICAgcHNybHcgICAgbTIsIDgKKyAgICBwb3IgICAgICBtMiwgbTAKKyAgICBtb3YlMSAgICBbcjBdLCBtMgorJWVuZGlmCisgICAgYWRkICAgICAgcjEsIDE2CisgICAgYWRkICAgICAgcjAsIDE2CislZW5kbWFjcm8KKworOyB2b2lkIGZmX2Jzd2FwX2J1Zih1aW50MzJfdCAqZHN0LCBjb25zdCB1aW50MzJfdCAqc3JjLCBpbnQgdyk7CislbWFjcm8gQlNXQVAzMl9CVUYgMAorJWlmIGNwdWZsYWcoc3NzZTMpCitjZ2xvYmFsIGJzd2FwMzJfYnVmLCAzLDQsMworICAgIG1vdiAgICAgIHIzLCByMQorICAgIG1vdmEgICAgIG0yLCBbcGJfYnN3YXAzMl0KKyVlbHNlCitjZ2xvYmFsIGJzd2FwMzJfYnVmLCAzLDQsNQorICAgIG1vdiAgICAgIHIzLCByMQorJWVuZGlmCisgICAgb3IgICAgICAgcjMsIHIwCisgICAgYW5kICAgICAgcjMsIDE1CisgICAganogICAgICAgLnN0YXJ0X2FsaWduCisgICAgQlNXQVBfTE9PUFMgIHUKKyAgICBqbXAgICAgICAubGVmdAorLnN0YXJ0X2FsaWduOgorICAgIEJTV0FQX0xPT1BTICBhCisubGVmdDoKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIG1vdiAgICAgIHIzLCByMgorICAgIGFuZCAgICAgIHIyLCAyCisgICAganogICAgICAgLmxlZnQxCisgICAgbW92cSAgICAgbTAsIFtyMV0KKyAgICBwc2h1ZmIgICBtMCwgbTIKKyAgICBtb3ZxICAgICBbcjBdLCBtMAorICAgIGFkZCAgICAgIHIxLCA4CisgICAgYWRkICAgICAgcjAsIDgKKy5sZWZ0MToKKyAgICBhbmQgICAgICByMywgMQorICAgIGp6ICAgICAgIC5lbmQKKyAgICBtb3YgICAgICByMmQsIFtyMV0KKyAgICBic3dhcCAgICByMmQKKyAgICBtb3YgICAgICBbcjBdLCByMmQKKyVlbHNlCisgICAgYW5kICAgICAgcjIsIDMKKyAgICBqeiAgICAgICAuZW5kCisubG9vcDI6CisgICAgbW92ICAgICAgcjNkLCBbcjFdCisgICAgYnN3YXAgICAgcjNkCisgICAgbW92ICAgICAgW3IwXSwgcjNkCisgICAgYWRkICAgICAgcjEsIDQKKyAgICBhZGQgICAgICByMCwgNAorICAgIGRlYyAgICAgIHIyCisgICAgam56ICAgICAgLmxvb3AyCislZW5kaWYKKy5lbmQ6CisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorQlNXQVAzMl9CVUYKKworSU5JVF9YTU0gc3NzZTMKK0JTV0FQMzJfQlVGCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvYnN3YXBkc3BfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2Jzd2FwZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQyZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2Jzd2FwZHNwX2luaXQuYwpAQCAtMCwwICsxLDM3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9ic3dhcGRzcC5oIgorCit2b2lkIGZmX2Jzd2FwMzJfYnVmX3NzZTIodWludDMyX3QgKmRzdCwgY29uc3QgdWludDMyX3QgKnNyYywgaW50IHcpOwordm9pZCBmZl9ic3dhcDMyX2J1Zl9zc3NlMyh1aW50MzJfdCAqZHN0LCBjb25zdCB1aW50MzJfdCAqc3JjLCBpbnQgdyk7CisKK2F2X2NvbGQgdm9pZCBmZl9ic3dhcGRzcF9pbml0X3g4NihCc3dhcERTUENvbnRleHQgKmMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpCisgICAgICAgIGMtPmJzd2FwX2J1ZiA9IGZmX2Jzd2FwMzJfYnVmX3NzZTI7CisgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpCisgICAgICAgIGMtPmJzd2FwX2J1ZiA9IGZmX2Jzd2FwMzJfYnVmX3Nzc2UzOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2NhYmFjLmggYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvY2FiYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTEwMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2NhYmFjLmgKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1g4Nl9DQUJBQ19ICisjZGVmaW5lIEFWQ09ERUNfWDg2X0NBQkFDX0gKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvY2FiYWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYWNyb3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgICAoZGVmaW5lZChfX2kzODYpICYmIGRlZmluZWQoX19jbGFuZ19fKSAmJiAoX19jbGFuZ19tYWpvcl9fPDIgfHwgKF9fY2xhbmdfbWFqb3JfXz09MiAmJiBfX2NsYW5nX21pbm9yX188MTApKSlcCisgICB8fCAoICAgICAgICAgICAgICAgICAgIWRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9fbGx2bV9fKSAmJiBfX0dOVUNfXz09NCAmJiBfX0dOVUNfTUlOT1JfXz09MiAmJiBfX0dOVUNfUEFUQ0hMRVZFTF9fPD0xKVwKKyAgIHx8IChkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmIGRlZmluZWQoX01TQ19WRVIpKQorIyAgICAgICBkZWZpbmUgQlJPS0VOX0NPTVBJTEVSIDEKKyNlbHNlCisjICAgICAgIGRlZmluZSBCUk9LRU5fQ09NUElMRVIgMAorI2VuZGlmCisKKyNpZiBIQVZFX0lOTElORV9BU00KKworI2lmbmRlZiBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUgorI2RlZmluZSBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUiAhQ09ORklHX1NBRkVfQklUU1RSRUFNX1JFQURFUgorI2VuZGlmCisKKyNpZiBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUgorI2RlZmluZSBFTkRfQ0hFQ0soZW5kKSAiIgorI2Vsc2UKKyNkZWZpbmUgRU5EX0NIRUNLKGVuZCkgXAorICAgICAgICAiY21wICAgICJlbmQiICAgICAgICwgJSUiUkVHX2MiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJqZ2UgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmCisKKyNpZmRlZiBCUk9LRU5fUkVMT0NBVElPTlMKKyNkZWZpbmUgVEFCTEVTX0FSRyAsICJyIih0YWJsZXMpCisKKyNpZiBIQVZFX0ZBU1RfQ01PVgorI2RlZmluZSBCUkFOQ0hMRVNTX0dFVF9DQUJBQ19VUERBVEUocmV0LCByZXRxLCBsb3csIHJhbmdlLCB0bXApIFwKKyAgICAgICAgImNtcCAgICAibG93IiAgICAgICAsICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJjbW92YSAgJSVlY3ggICAgICAgLCAicmFuZ2UiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAic2JiICAgICUlcmN4ICAgICAgICwgJSVyY3ggICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImFuZCAgICAlJWVjeCAgICAgICAsICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJ4b3IgICAgJSVyY3ggICAgICAgLCAicmV0cSIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAic3ViICAgICJ0bXAiICAgICAgICwgImxvdyIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2Vsc2UgLyogSEFWRV9GQVNUX0NNT1YgKi8KKyNkZWZpbmUgQlJBTkNITEVTU19HRVRfQ0FCQUNfVVBEQVRFKHJldCwgcmV0cSwgbG93LCByYW5nZSwgdG1wKSBcCisvKiBQNCBQcmVzY290dCBoYXMgY3JhcHB5IGNtb3Ysc2JiLDY0Yml0IHNoaWZ0IHNvIGF2b2lkIHRoZW0gKi8gXAorICAgICAgICAic3ViICAgICJsb3ciICAgICAgICwgInRtcCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInNhciAgICAkMzEgICAgICAgICAsICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJzdWIgICAgJSVlY3ggICAgICAgLCAicmFuZ2UiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiYW5kICAgICJ0bXAiICAgICAgICwgInJhbmdlIiAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImFkZCAgICAlJWVjeCAgICAgICAsICJyYW5nZSIgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJzaGwgICAgJDE3ICAgICAgICAgLCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiYW5kICAgICJ0bXAiICAgICAgICwgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInN1YiAgICAlJWVjeCAgICAgICAsICJsb3ciICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJ4b3IgICAgInRtcCIgICAgICAgLCAicmV0IiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92c2xxICJyZXQiICAgICAgICwgInJldHEiICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmIC8qIEhBVkVfRkFTVF9DTU9WICovCisKKyNkZWZpbmUgQlJBTkNITEVTU19HRVRfQ0FCQUMocmV0LCByZXRxLCBzdGF0ZXAsIGxvdywgbG93d29yZCwgcmFuZ2UsIHJhbmdlcSwgdG1wLCB0bXBieXRlLCBieXRlLCBlbmQsIG5vcm1fb2ZmLCBscHNfb2ZmLCBtbHBzX29mZiwgdGFibGVzKSBcCisgICAgICAgICJtb3Z6YmwgInN0YXRlcCIgICAgLCAicmV0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAicmFuZ2UiICAgICAsICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiYW5kICAgICQweEMwICAgICAgICwgInJhbmdlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJsZWEgICAgKCJyZXQiLCAicmFuZ2UiLCAyKSwgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnpibCAibHBzX29mZiIoInRhYmxlcyIsICUlcmN4KSwgInJhbmdlIiAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAic3ViICAgICJyYW5nZSIgICAgICwgInRtcCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3YgICAgInRtcCIgICAgICAgLCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInNobCAgICAkMTcgICAgICAgICAsICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICBCUkFOQ0hMRVNTX0dFVF9DQUJBQ19VUERBVEUocmV0LCByZXRxLCBsb3csIHJhbmdlLCB0bXApICAgICAgICAgICAgICBcCisgICAgICAgICJtb3Z6YmwgIm5vcm1fb2ZmIigidGFibGVzIiwgInJhbmdlcSIpLCAlJWVjeCAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInNobCAgICAlJWNsICAgICAgICAsICJyYW5nZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92emJsICJtbHBzX29mZiIrMTI4KCJ0YWJsZXMiLCAicmV0cSIpLCAidG1wIiAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJzaGwgICAgJSVjbCAgICAgICAgLCAibG93IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAidG1wYnl0ZSIgICAsICJzdGF0ZXAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAidGVzdCAgICJsb3d3b3JkIiAgICwgImxvd3dvcmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJqbnogICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAiYnl0ZSIgICAgICAsICUlIlJFR19jIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICBFTkRfQ0hFQ0soZW5kKVwKKyAgICAgICAgImFkZCJPUFNJWkUiICQyICAgICAsICJieXRlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3Z6d2wgKCUlIlJFR19jIikgLCAidG1wIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImxlYSAgICAtMSgibG93IikgICAsICUlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAieG9yICAgICJsb3ciICAgICAgICwgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJzaHIgICAgJDE1ICAgICAgICAgLCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImJzd2FwICAidG1wIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAic2hyICAgICQxNSAgICAgICAgICwgInRtcCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3Z6YmwgIm5vcm1fb2ZmIigidGFibGVzIiwgJSVyY3gpLCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInN1YiAgICAkMHhGRkZGICAgICAsICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibmVnICAgICUlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJhZGQgICAgJDcgICAgICAgICAgLCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInNobCAgICAlJWNsICAgICAgICAsICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiYWRkICAgICJ0bXAiICAgICAgICwgImxvdyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZWxzZSAvKiBCUk9LRU5fUkVMT0NBVElPTlMgKi8KKyNkZWZpbmUgVEFCTEVTX0FSRyBOQU1FRF9DT05TVFJBSU5UU19BUlJBWV9BREQoZmZfaDI2NF9jYWJhY190YWJsZXMpCisjZGVmaW5lIFJJUF9BUkcKKworI2lmIEhBVkVfRkFTVF9DTU9WCisjZGVmaW5lIEJSQU5DSExFU1NfR0VUX0NBQkFDX1VQREFURShyZXQsIGxvdywgcmFuZ2UsIHRtcClcCisgICAgICAgICJtb3YgICAgInRtcCIgICAgICAgLCAlJWVjeCAgICAgXG5cdCJcCisgICAgICAgICJzaGwgICAgJDE3ICAgICAgICAgLCAidG1wIiAgICAgXG5cdCJcCisgICAgICAgICJjbXAgICAgImxvdyIgICAgICAgLCAidG1wIiAgICAgXG5cdCJcCisgICAgICAgICJjbW92YSAgJSVlY3ggICAgICAgLCAicmFuZ2UiICAgXG5cdCJcCisgICAgICAgICJzYmIgICAgJSVlY3ggICAgICAgLCAlJWVjeCAgICAgXG5cdCJcCisgICAgICAgICJhbmQgICAgJSVlY3ggICAgICAgLCAidG1wIiAgICAgXG5cdCJcCisgICAgICAgICJ4b3IgICAgJSVlY3ggICAgICAgLCAicmV0IiAgICAgXG5cdCJcCisgICAgICAgICJzdWIgICAgInRtcCIgICAgICAgLCAibG93IiAgICAgXG5cdCIKKyNlbHNlIC8qIEhBVkVfRkFTVF9DTU9WICovCisjZGVmaW5lIEJSQU5DSExFU1NfR0VUX0NBQkFDX1VQREFURShyZXQsIGxvdywgcmFuZ2UsIHRtcClcCisgICAgICAgICJtb3YgICAgInRtcCIgICAgICAgLCAlJWVjeCAgICAgXG5cdCJcCisgICAgICAgICJzaGwgICAgJDE3ICAgICAgICAgLCAidG1wIiAgICAgXG5cdCJcCisgICAgICAgICJzdWIgICAgImxvdyIgICAgICAgLCAidG1wIiAgICAgXG5cdCJcCisgICAgICAgICJzYXIgICAgJDMxICAgICAgICAgLCAidG1wIiAgICAgXG5cdCIgLypscHNfbWFzayovXAorICAgICAgICAic3ViICAgICUlZWN4ICAgICAgICwgInJhbmdlIiAgIFxuXHQiIC8qUmFuZ2VMUFMgLSByYW5nZSovXAorICAgICAgICAiYW5kICAgICJ0bXAiICAgICAgICwgInJhbmdlIiAgIFxuXHQiIC8qKFJhbmdlTFBTIC0gcmFuZ2UpJmxwc19tYXNrKi9cCisgICAgICAgICJhZGQgICAgJSVlY3ggICAgICAgLCAicmFuZ2UiICAgXG5cdCIgLypuZXcgcmFuZ2UqL1wKKyAgICAgICAgInNobCAgICAkMTcgICAgICAgICAsICUlZWN4ICAgICBcblx0IlwKKyAgICAgICAgImFuZCAgICAidG1wIiAgICAgICAsICUlZWN4ICAgICBcblx0IlwKKyAgICAgICAgInN1YiAgICAlJWVjeCAgICAgICAsICJsb3ciICAgICBcblx0IlwKKyAgICAgICAgInhvciAgICAidG1wIiAgICAgICAsICJyZXQiICAgICBcblx0IgorI2VuZGlmIC8qIEhBVkVfRkFTVF9DTU9WICovCisKKyNkZWZpbmUgQlJBTkNITEVTU19HRVRfQ0FCQUMocmV0LCByZXRxLCBzdGF0ZXAsIGxvdywgbG93d29yZCwgcmFuZ2UsIHJhbmdlcSwgdG1wLCB0bXBieXRlLCBieXRlLCBlbmQsIG5vcm1fb2ZmLCBscHNfb2ZmLCBtbHBzX29mZiwgdGFibGVzKSBcCisgICAgICAgICJtb3Z6YmwgInN0YXRlcCIgICAgLCAicmV0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAicmFuZ2UiICAgICAsICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiYW5kICAgICQweEMwICAgICAgICwgInJhbmdlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3Z6YmwgIk1BTkdMRShmZl9oMjY0X2NhYmFjX3RhYmxlcykiKyJscHNfb2ZmIigicmV0IiwgInJhbmdlIiwgMiksICJyYW5nZSIgXG5cdCJcCisgICAgICAgICJzdWIgICAgInJhbmdlIiAgICAgLCAidG1wIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgQlJBTkNITEVTU19HRVRfQ0FCQUNfVVBEQVRFKHJldCwgbG93LCByYW5nZSwgdG1wKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92emJsICJNQU5HTEUoZmZfaDI2NF9jYWJhY190YWJsZXMpIisibm9ybV9vZmYiKCJyYW5nZSIpLCAlJWVjeCAgICBcblx0IlwKKyAgICAgICAgInNobCAgICAlJWNsICAgICAgICAsICJyYW5nZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92emJsICJNQU5HTEUoZmZfaDI2NF9jYWJhY190YWJsZXMpIisibWxwc19vZmYiKzEyOCgicmV0IiksICJ0bXAiICBcblx0IlwKKyAgICAgICAgInNobCAgICAlJWNsICAgICAgICAsICJsb3ciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ICAgICJ0bXBieXRlIiAgICwgInN0YXRlcCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJ0ZXN0ICAgImxvd3dvcmQiICAgLCAibG93d29yZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIiBqbnogICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ICAgICJieXRlIiAgICAgICwgJSUiUkVHX2MiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgIEVORF9DSEVDSyhlbmQpXAorICAgICAgICAiYWRkIk9QU0laRSIgJDIgICAgICwgImJ5dGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnp3bCAoJSUiUkVHX2MiKSAgICAgLCAidG1wIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibGVhICAgIC0xKCJsb3ciKSAgICwgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJ4b3IgICAgImxvdyIgICAgICAgLCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInNociAgICAkMTUgICAgICAgICAsICUlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiYnN3YXAgICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJzaHIgICAgJDE1ICAgICAgICAgLCAidG1wIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnpibCAiTUFOR0xFKGZmX2gyNjRfY2FiYWNfdGFibGVzKSIrIm5vcm1fb2ZmIiglJWVjeCksICUlZWN4IFxuXHQiXAorICAgICAgICAic3ViICAgICQweEZGRkYgICAgICwgInRtcCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJuZWcgICAgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImFkZCAgICAkNyAgICAgICAgICAsICUlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAic2hsICAgICUlY2wgICAgICAgICwgInRtcCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJhZGQgICAgInRtcCIgICAgICAgLCAibG93IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNlbmRpZiAvKiBCUk9LRU5fUkVMT0NBVElPTlMgKi8KKworI2lmIEhBVkVfN1JFR1MgJiYgIUJST0tFTl9DT01QSUxFUgorI2RlZmluZSBnZXRfY2FiYWNfaW5saW5lIGdldF9jYWJhY19pbmxpbmVfeDg2CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X2NhYmFjX2lubGluZV94ODYoQ0FCQUNDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNvbnN0IHN0YXRlKQoreworICAgIGludCBiaXQsIHRtcDsKKyNpZmRlZiBCUk9LRU5fUkVMT0NBVElPTlMKKyAgICB2b2lkICp0YWJsZXM7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibGVhICAgICJNQU5HTEUoZmZfaDI2NF9jYWJhY190YWJsZXMpIiwgJTAgICAgICBcblx0IgorICAgICAgICA6ICI9JnIiKHRhYmxlcykKKyAgICAgICAgOiBOQU1FRF9DT05TVFJBSU5UU19BUlJBWShmZl9oMjY0X2NhYmFjX3RhYmxlcykKKyAgICApOworI2VuZGlmCisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICBCUkFOQ0hMRVNTX0dFVF9DQUJBQygiJTAiLCAiJXEwIiwgIiglNCkiLCAiJTEiLCAiJXcxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUyIiwgIiVxMiIsICIlMyIsICIlYjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWM2KCU1KSIsICIlYzcoJTUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTk9STV9TSElGVF9PRkZTRVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TVFJJTkdJRlkoSDI2NF9MUFNfUkFOR0VfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTUxQU19TVEFURV9PRkZTRVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTgiKQorICAgICAgICA6ICI9JnIiKGJpdCksICI9JnIiKGMtPmxvdyksICI9JnIiKGMtPnJhbmdlKSwgIj0mcSIodG1wKQorICAgICAgICA6ICJyIihzdGF0ZSksICJyIihjKSwKKyAgICAgICAgICAiaSIob2Zmc2V0b2YoQ0FCQUNDb250ZXh0LCBieXRlc3RyZWFtKSksCisgICAgICAgICAgImkiKG9mZnNldG9mKENBQkFDQ29udGV4dCwgYnl0ZXN0cmVhbV9lbmQpKQorICAgICAgICAgIFRBQkxFU19BUkcKKyAgICAgICAgICAsIjEiKGMtPmxvdyksICIyIihjLT5yYW5nZSkKKyAgICAgICAgOiAiJSJSRUdfYywgIm1lbW9yeSIKKyAgICApOworICAgIHJldHVybiBiaXQgJiAxOworfQorI2VuZGlmIC8qIEhBVkVfN1JFR1MgJiYgIUJST0tFTl9DT01QSUxFUiAqLworCisjaWYgIUJST0tFTl9DT01QSUxFUgorI2RlZmluZSBnZXRfY2FiYWNfYnlwYXNzX3NpZ24gZ2V0X2NhYmFjX2J5cGFzc19zaWduX3g4Ngorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF9jYWJhY19ieXBhc3Nfc2lnbl94ODYoQ0FCQUNDb250ZXh0ICpjLCBpbnQgdmFsKQoreworICAgIHg4Nl9yZWcgdG1wOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZsICAgICAgICAlYzYoJTIpLCAlazEgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmwgICAgICAgICVjMyglMiksICUlZWF4ICAgICBcblx0IgorICAgICAgICAic2hsICAgICAgICAgICAgICQxNywgJWsxICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgICAgICAgICUlZWF4LCAlJWVheCAgICAgXG5cdCIKKyAgICAgICAgInN1YiAgICAgICAgICAgICAlazEsICUlZWF4ICAgICBcblx0IgorICAgICAgICAiY2RxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICAgICUlZWR4LCAlazEgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAgICAgICAgICAlazEsICUlZWF4ICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAgICAlJWVkeCwgJSVlY3ggICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgICAgICAgICUlZWR4LCAlJWVjeCAgICAgXG5cdCIKKyAgICAgICAgInRlc3QgICAgICAgICAgICUlYXgsICUlYXggICAgICBcblx0IgorICAgICAgICAiam56ICAgICAgICAgICAgICAxZiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAlYzQoJTIpLCAlMSAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YmwgICAgICAgICQweEZGRkYsICUlZWF4ICAgICBcblx0IgorICAgICAgICAibW92endsICAgICAgICAgKCUxKSwgJSVlZHggICAgIFxuXHQiCisgICAgICAgICJic3dhcCAgICAgICAgICUlZWR4ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmwgICAgICAgICAgICAkMTUsICUlZWR4ICAgICBcblx0IgorI2lmIFVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSCisgICAgICAgICJhZGQgICAgICAgICAgICAgICQyLCAlMSAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGwgICAgICAgICAgJSVlZHgsICUlZWF4ICAgICBcblx0IgorICAgICAgICAibW92ICAgICAgICAgICAgICAlMSwgJWM0KCUyKSAgIFxuXHQiCisjZWxzZQorICAgICAgICAiYWRkbCAgICAgICAgICAlJWVkeCwgJSVlYXggICAgIFxuXHQiCisgICAgICAgICJjbXAgICAgICAgICAlYzUoJTIpLCAlMSAgICAgICAgXG5cdCIKKyAgICAgICAgImpnZSAgICAgICAgICAgICAgMWYgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkIk9QU0laRSIgICAgICAkMiwgJWM0KCUyKSAgIFxuXHQiCisjZW5kaWYKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92bCAgICAgICAgICAlJWVheCwgJWMzKCUyKSAgIFxuXHQiCisKKyAgICAgICAgOiAiK2MiKHZhbCksICI9JnIiKHRtcCkKKyAgICAgICAgOiAiciIoYyksCisgICAgICAgICAgImkiKG9mZnNldG9mKENBQkFDQ29udGV4dCwgbG93KSksCisgICAgICAgICAgImkiKG9mZnNldG9mKENBQkFDQ29udGV4dCwgYnl0ZXN0cmVhbSkpLAorICAgICAgICAgICJpIihvZmZzZXRvZihDQUJBQ0NvbnRleHQsIGJ5dGVzdHJlYW1fZW5kKSksCisgICAgICAgICAgImkiKG9mZnNldG9mKENBQkFDQ29udGV4dCwgcmFuZ2UpKQorICAgICAgICA6ICIlZWF4IiwgIiVlZHgiLCAibWVtb3J5IgorICAgICk7CisgICAgcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBnZXRfY2FiYWNfYnlwYXNzIGdldF9jYWJhY19ieXBhc3NfeDg2CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X2NhYmFjX2J5cGFzc194ODYoQ0FCQUNDb250ZXh0ICpjKQoreworICAgIHg4Nl9yZWcgdG1wOworICAgIGludCByZXM7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdmwgICAgICAgICVjNiglMiksICVrMSAgICAgICBcblx0IgorICAgICAgICAibW92bCAgICAgICAgJWMzKCUyKSwgJSVlYXggICAgIFxuXHQiCisgICAgICAgICJzaGwgICAgICAgICAgICAgJDE3LCAlazEgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAgICAgICAgJSVlYXgsICUlZWF4ICAgICBcblx0IgorICAgICAgICAic3ViICAgICAgICAgICAgICVrMSwgJSVlYXggICAgIFxuXHQiCisgICAgICAgICJjZHEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgICAgJSVlZHgsICVrMSAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICAgICAgICAgICVrMSwgJSVlYXggICAgIFxuXHQiCisgICAgICAgICJpbmMgICAgICAgICAgICUlZWR4ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInRlc3QgICAgICAgICAgICUlYXgsICUlYXggICAgICBcblx0IgorICAgICAgICAiam56ICAgICAgICAgICAgICAxZiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAlYzQoJTIpLCAlMSAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YmwgICAgICAgICQweEZGRkYsICUlZWF4ICAgICBcblx0IgorICAgICAgICAibW92endsICAgICAgICAgKCUxKSwgJSVlY3ggICAgIFxuXHQiCisgICAgICAgICJic3dhcCAgICAgICAgICUlZWN4ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmwgICAgICAgICAgICAkMTUsICUlZWN4ICAgICBcblx0IgorICAgICAgICAiYWRkbCAgICAgICAgICAlJWVjeCwgJSVlYXggICAgIFxuXHQiCisgICAgICAgICJjbXAgICAgICAgICAlYzUoJTIpLCAlMSAgICAgICAgXG5cdCIKKyAgICAgICAgImpnZSAgICAgICAgICAgICAgMWYgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkIk9QU0laRSIgICAgICAkMiwgJWM0KCUyKSAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmwgICAgICAgICAgJSVlYXgsICVjMyglMikgICBcblx0IgorCisgICAgICAgIDogIj0mZCIocmVzKSwgIj0mciIodG1wKQorICAgICAgICA6ICJyIihjKSwKKyAgICAgICAgICAiaSIob2Zmc2V0b2YoQ0FCQUNDb250ZXh0LCBsb3cpKSwKKyAgICAgICAgICAiaSIob2Zmc2V0b2YoQ0FCQUNDb250ZXh0LCBieXRlc3RyZWFtKSksCisgICAgICAgICAgImkiKG9mZnNldG9mKENBQkFDQ29udGV4dCwgYnl0ZXN0cmVhbV9lbmQpKSwKKyAgICAgICAgICAiaSIob2Zmc2V0b2YoQ0FCQUNDb250ZXh0LCByYW5nZSkpCisgICAgICAgIDogIiVlYXgiLCAiJWVjeCIsICJtZW1vcnkiCisgICAgKTsKKyAgICByZXR1cm4gcmVzOworfQorI2VuZGlmIC8qICFCUk9LRU5fQ09NUElMRVIgKi8KKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworI2VuZGlmIC8qIEFWQ09ERUNfWDg2X0NBQkFDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9jYXZzZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvY2F2c2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MGY2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvY2F2c2RzcC5jCkBAIC0wLDAgKzEsNTk1IEBACisvKgorICogQ2hpbmVzZSBBVlMgdmlkZW8gKEFWUzEtUDIsIEppWmh1biBwcm9maWxlKSBkZWNvZGVyLgorICogQ29weXJpZ2h0IChjKSAyMDA2ICBTdGVmYW4gR2VocmVyIDxzdGVmYW4uZ2VocmVyQGdteC5kZT4KKyAqCisgKiBNTVgtb3B0aW1pemVkIERTUCBmdW5jdGlvbnMsIGJhc2VkIG9uIEguMjY0IG9wdGltaXphdGlvbnMgYnkKKyAqIE1pY2hhZWwgTmllZGVybWF5ZXIgYW5kIExvcmVuIE1lcnJpdHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9jYXZzZHNwLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pZGN0ZHNwLmgiCisjaW5jbHVkZSAiY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiZnBlbC5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEhBVkVfTU1YX0lOTElORQorCisvKiBpbi9vdXQ6IG1tYT1tbWErbW1iLCBtbWI9bW1iLW1tYSAqLworI2RlZmluZSBTVU1TVUJfQkEoIGEsIGIgKSBcCisgICAgInBhZGR3ICIjYiIsICIjYSIgXG5cdCJcCisgICAgInBhZGR3ICIjYiIsICIjYiIgXG5cdCJcCisgICAgInBzdWJ3ICIjYSIsICIjYiIgXG5cdCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogaW52ZXJzZSB0cmFuc2Zvcm0KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB2b2lkIGNhdnNfaWRjdDhfMWQoaW50MTZfdCAqYmxvY2ssIHVpbnQ2NF90IGJpYXMpCit7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdnEgMTEyKCUwKSwgJSVtbTQgIFxuXHQiIC8qIG1tNCA9IHNyYzcgKi8KKyAgICAgICAgIm1vdnEgIDE2KCUwKSwgJSVtbTUgIFxuXHQiIC8qIG1tNSA9IHNyYzEgKi8KKyAgICAgICAgIm1vdnEgIDgwKCUwKSwgJSVtbTIgIFxuXHQiIC8qIG1tMiA9IHNyYzUgKi8KKyAgICAgICAgIm1vdnEgIDQ4KCUwKSwgJSVtbTcgIFxuXHQiIC8qIG1tNyA9IHNyYzMgKi8KKyAgICAgICAgIm1vdnEgICAlJW1tNCwgJSVtbTAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTUsICUlbW0zICBcblx0IgorICAgICAgICAibW92cSAgICUlbW0yLCAlJW1tNiAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAlJW1tNywgJSVtbTEgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICAlJW1tNCwgJSVtbTQgIFxuXHQiIC8qIG1tNCA9IDIqc3JjNyAqLworICAgICAgICAicGFkZHcgICUlbW0zLCAlJW1tMyAgXG5cdCIgLyogbW0zID0gMipzcmMxICovCisgICAgICAgICJwYWRkdyAgJSVtbTYsICUlbW02ICBcblx0IiAvKiBtbTYgPSAyKnNyYzUgKi8KKyAgICAgICAgInBhZGR3ICAlJW1tMSwgJSVtbTEgIFxuXHQiIC8qIG1tMSA9IDIqc3JjMyAqLworICAgICAgICAicGFkZHcgICUlbW00LCAlJW1tMCAgXG5cdCIgLyogbW0wID0gMypzcmM3ICovCisgICAgICAgICJwYWRkdyAgJSVtbTMsICUlbW01ICBcblx0IiAvKiBtbTUgPSAzKnNyYzEgKi8KKyAgICAgICAgInBhZGR3ICAlJW1tNiwgJSVtbTIgIFxuXHQiIC8qIG1tMiA9IDMqc3JjNSAqLworICAgICAgICAicGFkZHcgICUlbW0xLCAlJW1tNyAgXG5cdCIgLyogbW03ID0gMypzcmMzICovCisgICAgICAgICJwc3VidyAgJSVtbTQsICUlbW01ICBcblx0IiAvKiBtbTUgPSAzKnNyYzEgLSAyKnNyYzcgPSBhMCAqLworICAgICAgICAicGFkZHcgICUlbW02LCAlJW1tNyAgXG5cdCIgLyogbW03ID0gMypzcmMzICsgMipzcmM1ID0gYTEgKi8KKyAgICAgICAgInBzdWJ3ICAlJW1tMiwgJSVtbTEgIFxuXHQiIC8qIG1tMSA9IDIqc3JjMyAtIDMqc3JjNSA9IGEyICovCisgICAgICAgICJwYWRkdyAgJSVtbTAsICUlbW0zICBcblx0IiAvKiBtbTMgPSAyKnNyYzEgKyAzKnNyYzcgPSBhMyAqLworCisgICAgICAgICJtb3ZxICAgJSVtbTUsICUlbW00ICBcblx0IgorICAgICAgICAibW92cSAgICUlbW03LCAlJW1tNiAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAlJW1tMywgJSVtbTAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTEsICUlbW0yICBcblx0IgorICAgICAgICBTVU1TVUJfQkEoICUlbW03LCAlJW1tNSApICAgLyogbW03ID0gYTAgKyBhMSAgbW01ID0gYTAgLSBhMSAqLworICAgICAgICAicGFkZHcgICUlbW0zLCAlJW1tNyAgXG5cdCIgLyogbW03ID0gYTAgKyBhMSArIGEzICovCisgICAgICAgICJwYWRkdyAgJSVtbTEsICUlbW01ICBcblx0IiAvKiBtbTUgPSBhMCAtIGExICsgYTIgKi8KKyAgICAgICAgInBhZGR3ICAlJW1tNywgJSVtbTcgIFxuXHQiCisgICAgICAgICJwYWRkdyAgJSVtbTUsICUlbW01ICBcblx0IgorICAgICAgICAicGFkZHcgICUlbW02LCAlJW1tNyAgXG5cdCIgLyogbW03ID0gYjQgKi8KKyAgICAgICAgInBhZGR3ICAlJW1tNCwgJSVtbTUgIFxuXHQiIC8qIG1tNSA9IGI1ICovCisKKyAgICAgICAgU1VNU1VCX0JBKCAlJW1tMSwgJSVtbTMgKSAgIC8qIG1tMSA9IGEzICsgYTIgIG1tMyA9IGEzIC0gYTIgKi8KKyAgICAgICAgInBzdWJ3ICAlJW1tMSwgJSVtbTQgIFxuXHQiIC8qIG1tNCA9IGEwIC0gYTIgLSBhMyAqLworICAgICAgICAibW92cSAgICUlbW00LCAlJW1tMSAgXG5cdCIgLyogbW0xID0gYTAgLSBhMiAtIGEzICovCisgICAgICAgICJwc3VidyAgJSVtbTYsICUlbW0zICBcblx0IiAvKiBtbTMgPSBhMyAtIGEyIC0gYTEgKi8KKyAgICAgICAgInBhZGR3ICAlJW1tMSwgJSVtbTEgIFxuXHQiCisgICAgICAgICJwYWRkdyAgJSVtbTMsICUlbW0zICBcblx0IgorICAgICAgICAicHN1YncgICUlbW0yLCAlJW1tMSAgXG5cdCIgLyogbW0xID0gYjcgKi8KKyAgICAgICAgInBhZGR3ICAlJW1tMCwgJSVtbTMgIFxuXHQiIC8qIG1tMyA9IGI2ICovCisKKyAgICAgICAgIm1vdnEgIDMyKCUwKSwgJSVtbTIgIFxuXHQiIC8qIG1tMiA9IHNyYzIgKi8KKyAgICAgICAgIm1vdnEgIDk2KCUwKSwgJSVtbTYgIFxuXHQiIC8qIG1tNiA9IHNyYzYgKi8KKyAgICAgICAgIm1vdnEgICAlJW1tMiwgJSVtbTQgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTYsICUlbW0wICBcblx0IgorICAgICAgICAicHNsbHcgICQyLCAgICAlJW1tNCAgXG5cdCIgLyogbW00ID0gNCpzcmMyICovCisgICAgICAgICJwc2xsdyAgJDIsICAgICUlbW02ICBcblx0IiAvKiBtbTYgPSA0KnNyYzYgKi8KKyAgICAgICAgInBhZGR3ICAlJW1tNCwgJSVtbTIgIFxuXHQiIC8qIG1tMiA9IDUqc3JjMiAqLworICAgICAgICAicGFkZHcgICUlbW02LCAlJW1tMCAgXG5cdCIgLyogbW0wID0gNSpzcmM2ICovCisgICAgICAgICJwYWRkdyAgJSVtbTIsICUlbW0yICBcblx0IgorICAgICAgICAicGFkZHcgICUlbW0wLCAlJW1tMCAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICAlJW1tMCwgJSVtbTQgIFxuXHQiIC8qIG1tNCA9IDQqc3JjMiAtIDEwKnNyYzYgPSBhNyAqLworICAgICAgICAicGFkZHcgICUlbW0yLCAlJW1tNiAgXG5cdCIgLyogbW02ID0gNCpzcmM2ICsgMTAqc3JjMiA9IGE2ICovCisKKyAgICAgICAgIm1vdnEgICAgKCUwKSwgJSVtbTIgIFxuXHQiIC8qIG1tMiA9IHNyYzAgKi8KKyAgICAgICAgIm1vdnEgIDY0KCUwKSwgJSVtbTAgIFxuXHQiIC8qIG1tMCA9IHNyYzQgKi8KKyAgICAgICAgU1VNU1VCX0JBKCAlJW1tMCwgJSVtbTIgKSAgIC8qIG1tMCA9IHNyYzArc3JjNCAgbW0yID0gc3JjMC1zcmM0ICovCisgICAgICAgICJwc2xsdyAgJDMsICAgICUlbW0wICBcblx0IgorICAgICAgICAicHNsbHcgICQzLCAgICAlJW1tMiAgXG5cdCIKKyAgICAgICAgInBhZGR3ICAlMSwgICAgJSVtbTAgIFxuXHQiIC8qIGFkZCByb3VuZGluZyBiaWFzICovCisgICAgICAgICJwYWRkdyAgJTEsICAgICUlbW0yICBcblx0IiAvKiBhZGQgcm91bmRpbmcgYmlhcyAqLworCisgICAgICAgIFNVTVNVQl9CQSggJSVtbTYsICUlbW0wICkgICAvKiBtbTYgPSBhNCArIGE2ICBtbTAgPSBhNCAtIGE2ICovCisgICAgICAgIFNVTVNVQl9CQSggJSVtbTQsICUlbW0yICkgICAvKiBtbTQgPSBhNSArIGE3ICBtbTIgPSBhNSAtIGE3ICovCisgICAgICAgIFNVTVNVQl9CQSggJSVtbTcsICUlbW02ICkgICAvKiBtbTcgPSBkc3QwICBtbTYgPSBkc3Q3ICovCisgICAgICAgIFNVTVNVQl9CQSggJSVtbTUsICUlbW00ICkgICAvKiBtbTUgPSBkc3QxICBtbTQgPSBkc3Q2ICovCisgICAgICAgIFNVTVNVQl9CQSggJSVtbTMsICUlbW0yICkgICAvKiBtbTMgPSBkc3QyICBtbTIgPSBkc3Q1ICovCisgICAgICAgIFNVTVNVQl9CQSggJSVtbTEsICUlbW0wICkgICAvKiBtbTEgPSBkc3QzICBtbTAgPSBkc3Q0ICovCisgICAgICAgIDo6ICJyIihibG9jayksICJtIihiaWFzKQorICAgICk7Cit9CisKKyNkZWZpbmUgU0JVVFRFUkZMWShhLGIsdCxuLG0pXAorICAgICJtb3YiICNtICIgIiAjYSAiLCAiICN0ICIgICAgICAgICBcblx0IiAvKiBhYmNkICovXAorICAgICJwdW5wY2tsIiAjbiAiICIgI2IgIiwgIiAjYSAiICAgICBcblx0IiAvKiBhZWJmICovXAorICAgICJwdW5wY2toIiAjbiAiICIgI2IgIiwgIiAjdCAiICAgICBcblx0IiAvKiBjZ2RoICovXAorCisjZGVmaW5lIFRSQU5TUE9TRTQoYSxiLGMsZCx0KVwKKyAgICBTQlVUVEVSRkxZKGEsYix0LHdkLHEpIC8qIGE9YWViZiB0PWNnZGggKi9cCisgICAgU0JVVFRFUkZMWShjLGQsYix3ZCxxKSAvKiBjPWltam4gYj1rb2xwICovXAorICAgIFNCVVRURVJGTFkoYSxjLGQsZHEscSkgLyogYT1hZWltIGQ9YmZqbiAqL1wKKyAgICBTQlVUVEVSRkxZKHQsYixjLGRxLHEpIC8qIHQ9Y2drbyBjPWRobHAgKi8KKworc3RhdGljIHZvaWQgY2F2c19pZGN0OF9hZGRfbW14KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBiMilbNjRdOworCisgICAgZm9yKGk9MDsgaTwyOyBpKyspeworICAgICAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIHRtcCk7CisKKyAgICAgICAgY2F2c19pZGN0OF8xZChibG9jays0KmksIGZmX3B3XzQuYSk7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJwc3JhdyAgICAgJDMsICUlbW03ICBcblx0IgorICAgICAgICAgICAgInBzcmF3ICAgICAkMywgJSVtbTYgIFxuXHQiCisgICAgICAgICAgICAicHNyYXcgICAgICQzLCAlJW1tNSAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhdyAgICAgJDMsICUlbW00ICBcblx0IgorICAgICAgICAgICAgInBzcmF3ICAgICAkMywgJSVtbTMgIFxuXHQiCisgICAgICAgICAgICAicHNyYXcgICAgICQzLCAlJW1tMiAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhdyAgICAgJDMsICUlbW0xICBcblx0IgorICAgICAgICAgICAgInBzcmF3ICAgICAkMywgJSVtbTAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICUlbW03LCAgICAlMCAgIFxuXHQiCisgICAgICAgICAgICBUUkFOU1BPU0U0KCAlJW1tMCwgJSVtbTIsICUlbW00LCAlJW1tNiwgJSVtbTcgKQorICAgICAgICAgICAgIm1vdnEgICAlJW1tMCwgIDgoJTEpICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAlJW1tNiwgMjQoJTEpICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAlJW1tNywgNDAoJTEpICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAlJW1tNCwgNTYoJTEpICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgJTAsICAgICUlbW03ICBcblx0IgorICAgICAgICAgICAgVFJBTlNQT1NFNCggJSVtbTcsICUlbW01LCAlJW1tMywgJSVtbTEsICUlbW0wICkKKyAgICAgICAgICAgICJtb3ZxICAgJSVtbTcsICAgKCUxKSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgJSVtbTEsIDE2KCUxKSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgJSVtbTAsIDMyKCUxKSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgJSVtbTMsIDQ4KCUxKSAgXG5cdCIKKyAgICAgICAgICAgIDogIj1tIih0bXApCisgICAgICAgICAgICA6ICJyIihiMiszMippKQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgIH0KKworICAgIGZvcihpPTA7IGk8MjsgaSsrKXsKKyAgICAgICAgY2F2c19pZGN0OF8xZChiMis0KmksIGZmX3B3XzY0LmEpOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAicHNyYXcgICAgICQ3LCAlJW1tNyAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhdyAgICAgJDcsICUlbW02ICBcblx0IgorICAgICAgICAgICAgInBzcmF3ICAgICAkNywgJSVtbTUgIFxuXHQiCisgICAgICAgICAgICAicHNyYXcgICAgICQ3LCAlJW1tNCAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhdyAgICAgJDcsICUlbW0zICBcblx0IgorICAgICAgICAgICAgInBzcmF3ICAgICAkNywgJSVtbTIgIFxuXHQiCisgICAgICAgICAgICAicHNyYXcgICAgICQ3LCAlJW1tMSAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhdyAgICAgJDcsICUlbW0wICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAlJW1tNywgICAgKCUwKSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgJSVtbTUsICAxNiglMCkgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICUlbW0zLCAgMzIoJTApICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAlJW1tMSwgIDQ4KCUwKSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgJSVtbTAsICA2NCglMCkgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICUlbW0yLCAgODAoJTApICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAlJW1tNCwgIDk2KCUwKSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgJSVtbTYsIDExMiglMCkgIFxuXHQiCisgICAgICAgICAgICA6OiAiciIoYjIrNCppKQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgIH0KKworICAgIGZmX2FkZF9waXhlbHNfY2xhbXBlZChiMiwgZHN0LCBzdHJpZGUpOworfQorCisjZW5kaWYgLyogSEFWRV9NTVhfSU5MSU5FICovCisKKyNpZiAoSEFWRV9NTVhFWFRfSU5MSU5FIHx8IEhBVkVfQU1EM0ROT1dfSU5MSU5FKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtb3Rpb24gY29tcGVuc2F0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHZlcnRpY2FsIGZpbHRlciBbLTEgLTIgOTYgNDIgLTcgIDBdICAqLworI2RlZmluZSBRUEVMX0NBVlNWMShBLEIsQyxELEUsRixPUCxBREQsIE1VTDEsIE1VTDIpIFwKKyAgICAgICAgIm1vdmQgKCUwKSwgIiNGIiAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAiI0MiLCAlJW1tNiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwbXVsbHcgIk1BTkdMRShNVUwxKSIsICUlbW02XG5cdCJcCisgICAgICAgICJtb3ZxICIjRCIsICUlbW03ICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxsdyAiTUFOR0xFKE1VTDIpIiwgJSVtbTdcblx0IlwKKyAgICAgICAgInBzbGx3ICQzLCAiI0UiICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YncgIiNFIiwgJSVtbTYgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhdyAkMywgIiNFIiAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICUlbW03LCAlJW1tNiAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgIiNFIiwgJSVtbTYgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWRkdyAiI0IiLCAiI0IiICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgIFxuXHQiXAorICAgICAgICAiYWRkICUyLCAlMCAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICIjRiIgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICIjQiIsICUlbW02ICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYXcgJDEsICIjQiIgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3VidyAiI0EiLCAlJW1tNiAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICJNQU5HTEUoQUREKSIsICUlbW02IFxuXHQiXAorICAgICAgICAicHNyYXcgJDcsICUlbW02ICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrdXN3YiAlJW1tNiwgJSVtbTYgICAgICBcblx0IlwKKyAgICAgICAgT1AoJSVtbTYsICglMSksIEEsIGQpICAgICAgICAgICAgXAorICAgICAgICAiYWRkICUzLCAlMSAgICAgICAgICAgICAgICAgXG5cdCIKKworLyogdmVydGljYWwgZmlsdGVyIFsgMCAtMSAgNSAgNSAtMSAgMF0gICovCisjZGVmaW5lIFFQRUxfQ0FWU1YyKEEsQixDLEQsRSxGLE9QLEFERCwgTVVMMSwgTVVMMikgXAorICAgICAgICAibW92ZCAoJTApLCAiI0YiICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIjQyIsICUlbW02ICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICIjRCIsICUlbW02ICAgICAgICAgIFxuXHQiXAorICAgICAgICAicG11bGx3ICJNQU5HTEUoTVVMMSkiLCAlJW1tNlxuXHQiXAorICAgICAgICAiYWRkICUyLCAlMCAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICIjRiIgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICIjQiIsICUlbW02ICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YncgIiNFIiwgJSVtbTYgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWRkdyAiTUFOR0xFKEFERCkiLCAlJW1tNiBcblx0IlwKKyAgICAgICAgInBzcmF3ICQzLCAlJW1tNiAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3Vzd2IgJSVtbTYsICUlbW02ICAgICAgXG5cdCJcCisgICAgICAgIE9QKCUlbW02LCAoJTEpLCBBLCBkKSAgICAgICAgICAgIFwKKyAgICAgICAgImFkZCAlMywgJTEgICAgICAgICAgICAgICAgIFxuXHQiCisKKy8qIHZlcnRpY2FsIGZpbHRlciBbIDAgLTcgNDIgOTYgLTIgLTFdICAqLworI2RlZmluZSBRUEVMX0NBVlNWMyhBLEIsQyxELEUsRixPUCxBREQsIE1VTDEsIE1VTDIpIFwKKyAgICAgICAgIm1vdmQgKCUwKSwgIiNGIiAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAiI0MiLCAlJW1tNiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwbXVsbHcgIk1BTkdMRShNVUwyKSIsICUlbW02XG5cdCJcCisgICAgICAgICJtb3ZxICIjRCIsICUlbW03ICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxsdyAiTUFOR0xFKE1VTDEpIiwgJSVtbTdcblx0IlwKKyAgICAgICAgInBzbGx3ICQzLCAiI0IiICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YncgIiNCIiwgJSVtbTYgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhdyAkMywgIiNCIiAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICUlbW03LCAlJW1tNiAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgIiNCIiwgJSVtbTYgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWRkdyAiI0UiLCAiI0UiICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgIFxuXHQiXAorICAgICAgICAiYWRkICUyLCAlMCAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICIjRiIgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICIjRSIsICUlbW02ICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYXcgJDEsICIjRSIgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3VidyAiI0YiLCAlJW1tNiAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICJNQU5HTEUoQUREKSIsICUlbW02IFxuXHQiXAorICAgICAgICAicHNyYXcgJDcsICUlbW02ICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrdXN3YiAlJW1tNiwgJSVtbTYgICAgICBcblx0IlwKKyAgICAgICAgT1AoJSVtbTYsICglMSksIEEsIGQpICAgICAgICAgICAgXAorICAgICAgICAiYWRkICUzLCAlMSAgICAgICAgICAgICAgICAgXG5cdCIKKworCisjZGVmaW5lIFFQRUxfQ0FWU1ZOVU0oVk9QLE9QLEFERCxNVUwxLE1VTDIpXAorICAgIGludCB3PSAyO1wKKyAgICBzcmMgLT0gMipzcmNTdHJpZGU7XAorICAgIFwKKyAgICB3aGlsZSh3LS0pe1wKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUoXAorICAgICAgICAicHhvciAlJW1tNywgJSVtbTcgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZkICglMCksICUlbW0wICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImFkZCAlMiwgJTAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ZCAoJTApLCAlJW1tMSAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJhZGQgJTIsICUwICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgKCUwKSwgJSVtbTIgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiYWRkICUyLCAlMCAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZkICglMCksICUlbW0zICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImFkZCAlMiwgJTAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ZCAoJTApLCAlJW1tNCAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJhZGQgJTIsICUwICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTAgICAgIFxuXHQiXAorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMSAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTMgICAgIFxuXHQiXAorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNCAgICAgXG5cdCJcCisgICAgICAgIFZPUCglJW1tMCwgJSVtbTEsICUlbW0yLCAlJW1tMywgJSVtbTQsICUlbW01LCBPUCwgQURELCBNVUwxLCBNVUwyKVwKKyAgICAgICAgVk9QKCUlbW0xLCAlJW1tMiwgJSVtbTMsICUlbW00LCAlJW1tNSwgJSVtbTAsIE9QLCBBREQsIE1VTDEsIE1VTDIpXAorICAgICAgICBWT1AoJSVtbTIsICUlbW0zLCAlJW1tNCwgJSVtbTUsICUlbW0wLCAlJW1tMSwgT1AsIEFERCwgTVVMMSwgTVVMMilcCisgICAgICAgIFZPUCglJW1tMywgJSVtbTQsICUlbW01LCAlJW1tMCwgJSVtbTEsICUlbW0yLCBPUCwgQURELCBNVUwxLCBNVUwyKVwKKyAgICAgICAgVk9QKCUlbW00LCAlJW1tNSwgJSVtbTAsICUlbW0xLCAlJW1tMiwgJSVtbTMsIE9QLCBBREQsIE1VTDEsIE1VTDIpXAorICAgICAgICBWT1AoJSVtbTUsICUlbW0wLCAlJW1tMSwgJSVtbTIsICUlbW0zLCAlJW1tNCwgT1AsIEFERCwgTVVMMSwgTVVMMilcCisgICAgICAgIFZPUCglJW1tMCwgJSVtbTEsICUlbW0yLCAlJW1tMywgJSVtbTQsICUlbW01LCBPUCwgQURELCBNVUwxLCBNVUwyKVwKKyAgICAgICAgVk9QKCUlbW0xLCAlJW1tMiwgJSVtbTMsICUlbW00LCAlJW1tNSwgJSVtbTAsIE9QLCBBREQsIE1VTDEsIE1VTDIpXAorICAgICAgICBcCisgICAgICAgIDogIithIihzcmMpLCAiK2MiKGRzdClcCisgICAgICAgIDogIlMiKCh4ODZfcmVnKXNyY1N0cmlkZSksICJyIigoeDg2X3JlZylkc3RTdHJpZGUpXAorICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChBREQsTVVMMSxNVUwyKVwKKyAgICAgICAgOiAibWVtb3J5IlwKKyAgICAgKTtcCisgICAgIGlmKGg9PTE2KXtcCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoXAorICAgICAgICAgICAgVk9QKCUlbW0yLCAlJW1tMywgJSVtbTQsICUlbW01LCAlJW1tMCwgJSVtbTEsIE9QLCBBREQsIE1VTDEsIE1VTDIpXAorICAgICAgICAgICAgVk9QKCUlbW0zLCAlJW1tNCwgJSVtbTUsICUlbW0wLCAlJW1tMSwgJSVtbTIsIE9QLCBBREQsIE1VTDEsIE1VTDIpXAorICAgICAgICAgICAgVk9QKCUlbW00LCAlJW1tNSwgJSVtbTAsICUlbW0xLCAlJW1tMiwgJSVtbTMsIE9QLCBBREQsIE1VTDEsIE1VTDIpXAorICAgICAgICAgICAgVk9QKCUlbW01LCAlJW1tMCwgJSVtbTEsICUlbW0yLCAlJW1tMywgJSVtbTQsIE9QLCBBREQsIE1VTDEsIE1VTDIpXAorICAgICAgICAgICAgVk9QKCUlbW0wLCAlJW1tMSwgJSVtbTIsICUlbW0zLCAlJW1tNCwgJSVtbTUsIE9QLCBBREQsIE1VTDEsIE1VTDIpXAorICAgICAgICAgICAgVk9QKCUlbW0xLCAlJW1tMiwgJSVtbTMsICUlbW00LCAlJW1tNSwgJSVtbTAsIE9QLCBBREQsIE1VTDEsIE1VTDIpXAorICAgICAgICAgICAgVk9QKCUlbW0yLCAlJW1tMywgJSVtbTQsICUlbW01LCAlJW1tMCwgJSVtbTEsIE9QLCBBREQsIE1VTDEsIE1VTDIpXAorICAgICAgICAgICAgVk9QKCUlbW0zLCAlJW1tNCwgJSVtbTUsICUlbW0wLCAlJW1tMSwgJSVtbTIsIE9QLCBBREQsIE1VTDEsIE1VTDIpXAorICAgICAgICAgICAgXAorICAgICAgICAgICA6ICIrYSIoc3JjKSwgIitjIihkc3QpXAorICAgICAgICAgICA6ICJTIigoeDg2X3JlZylzcmNTdHJpZGUpLCAiciIoKHg4Nl9yZWcpZHN0U3RyaWRlKVwKKyAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoQURELE1VTDEsTVVMMilcCisgICAgICAgICAgIDogIm1lbW9yeSJcCisgICAgICAgICk7XAorICAgICB9XAorICAgICBzcmMgKz0gNC0oaCs1KSpzcmNTdHJpZGU7XAorICAgICBkc3QgKz0gNC1oKmRzdFN0cmlkZTtcCisgICB9CisKKyNkZWZpbmUgUVBFTF9DQVZTKE9QTkFNRSwgT1AsIE1NWClcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsOF9oXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKKyAgICBpbnQgaD04O1wKKyAgICBfX2FzbV9fIHZvbGF0aWxlKFwKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAiTUFOR0xFKGZmX3B3XzUpIiwgJSVtbTZcblx0IlwKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAoJTApLCAlJW1tMCAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICAgMSglMCksICUlbW0yICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0wICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTEgICAgIFxuXHQiXAorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0zICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMCAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0xICAgICAgICAgXG5cdCJcCisgICAgICAgICJwbXVsbHcgJSVtbTYsICUlbW0wICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxsdyAlJW1tNiwgJSVtbTEgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgIC0xKCUwKSwgJSVtbTIgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICAgIDIoJTApLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTUgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgICAgIFxuXHQiXAorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNCAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW01ICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICUlbW00LCAlJW1tMiAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW01ICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW01LCAlJW1tMSAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAiTUFOR0xFKGZmX3B3XzQpIiwgJSVtbTVcblx0IlwKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tMCAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW0xICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhdyAkMywgJSVtbTAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmF3ICQzLCAlJW1tMSAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3Vzd2IgJSVtbTEsICUlbW0wICAgICAgXG5cdCJcCisgICAgICAgIE9QKCUlbW0wLCAoJTEpLCUlbW01LCBxKSAgICAgICAgIFwKKyAgICAgICAgImFkZCAlMywgJTAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiYWRkICU0LCAlMSAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJkZWNsICUyICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIiBqbnogMWIgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICA6ICIrYSIoc3JjKSwgIitjIihkc3QpLCAiK20iKGgpXAorICAgICAgICA6ICJkIigoeDg2X3JlZylzcmNTdHJpZGUpLCAiUyIoKHg4Nl9yZWcpZHN0U3RyaWRlKVwKKyAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfcHdfNCxmZl9wd181KVwKKyAgICAgICAgOiAibWVtb3J5IlwKKyAgICApO1wKK31cCitcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbDhvcjE2X3YxXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKXtcCisgIFFQRUxfQ0FWU1ZOVU0oUVBFTF9DQVZTVjEsT1AsZmZfcHdfNjQsZmZfcHdfOTYsZmZfcHdfNDIpICAgICAgXAorfVwKK1wKK3N0YXRpYyBpbmxpbmUgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsOG9yMTZfdjJfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50IGgpe1wKKyAgUVBFTF9DQVZTVk5VTShRUEVMX0NBVlNWMixPUCxmZl9wd180LGZmX3B3XzUsZmZfcHdfNDIpICAgICAgICBcCit9XAorXAorc3RhdGljIGlubGluZSB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWw4b3IxNl92M18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgaCl7XAorICBRUEVMX0NBVlNWTlVNKFFQRUxfQ0FWU1YzLE9QLGZmX3B3XzY0LGZmX3B3Xzk2LGZmX3B3XzQyKSAgICAgIFwKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsOF92MV8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgT1BOQU1FICMjIGNhdnNfcXBlbDhvcjE2X3YxXyAjIyBNTVgoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgOCk7XAorfVwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWwxNl92MV8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgT1BOQU1FICMjIGNhdnNfcXBlbDhvcjE2X3YxXyAjIyBNTVgoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgMTYpO1wKKyAgICBPUE5BTUUgIyMgY2F2c19xcGVsOG9yMTZfdjFfICMjIE1NWChkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCAxNik7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWw4X3YyXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKKyAgICBPUE5BTUUgIyMgY2F2c19xcGVsOG9yMTZfdjJfICMjIE1NWChkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCA4KTtcCit9XAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbDE2X3YyXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKKyAgICBPUE5BTUUgIyMgY2F2c19xcGVsOG9yMTZfdjJfICMjIE1NWChkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCAxNik7XAorICAgIE9QTkFNRSAjIyBjYXZzX3FwZWw4b3IxNl92Ml8gIyMgTU1YKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIDE2KTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbDhfdjNfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIE9QTkFNRSAjIyBjYXZzX3FwZWw4b3IxNl92M18gIyMgTU1YKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIDgpO1wKK31cCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsMTZfdjNfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIE9QTkFNRSAjIyBjYXZzX3FwZWw4b3IxNl92M18gIyMgTU1YKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIDE2KTtcCisgICAgT1BOQU1FICMjIGNhdnNfcXBlbDhvcjE2X3YzXyAjIyBNTVgoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgMTYpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsMTZfaF8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgT1BOQU1FICMjIGNhdnNfcXBlbDhfaF8gIyMgTU1YKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBPUE5BTUUgIyMgY2F2c19xcGVsOF9oXyAjIyBNTVgoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIHNyYyArPSA4KnNyY1N0cmlkZTtcCisgICAgZHN0ICs9IDgqZHN0U3RyaWRlO1wKKyAgICBPUE5BTUUgIyMgY2F2c19xcGVsOF9oXyAjIyBNTVgoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIE9QTkFNRSAjIyBjYXZzX3FwZWw4X2hfICMjIE1NWChkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTtcCit9XAorCisjZGVmaW5lIENBVlNfTUMoT1BOQU1FLCBTSVpFLCBNTVgpIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWwgIyMgU0laRSAjIyBfbWMyMF8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgT1BOQU1FICMjIGNhdnNfcXBlbCAjIyBTSVpFICMjIF9oXyAjIyBNTVgoZHN0LCBzcmMsIHN0cmlkZSwgc3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbCAjIyBTSVpFICMjIF9tYzAxXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBPUE5BTUUgIyMgY2F2c19xcGVsICMjIFNJWkUgIyMgX3YxXyAjIyBNTVgoZHN0LCBzcmMsIHN0cmlkZSwgc3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbCAjIyBTSVpFICMjIF9tYzAyXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBPUE5BTUUgIyMgY2F2c19xcGVsICMjIFNJWkUgIyMgX3YyXyAjIyBNTVgoZHN0LCBzcmMsIHN0cmlkZSwgc3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbCAjIyBTSVpFICMjIF9tYzAzXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBPUE5BTUUgIyMgY2F2c19xcGVsICMjIFNJWkUgIyMgX3YzXyAjIyBNTVgoZHN0LCBzcmMsIHN0cmlkZSwgc3RyaWRlKTtcCit9XAorCisjZGVmaW5lIFBVVF9PUChhLGIsdGVtcCwgc2l6ZSkgIm1vdiIgI3NpemUgIiAiICNhICIsICIgI2IgIiAgICBcblx0IgorI2RlZmluZSBBVkdfM0ROT1dfT1AoYSxiLHRlbXAsIHNpemUpIFwKKyJtb3YiICNzaXplICIgIiAjYiAiLCAiICN0ZW1wICIgICBcblx0IlwKKyJwYXZndXNiICIgI3RlbXAgIiwgIiAjYSAiICAgICAgICBcblx0IlwKKyJtb3YiICNzaXplICIgIiAjYSAiLCAiICNiICIgICAgICBcblx0IgorI2RlZmluZSBBVkdfTU1YRVhUX09QKGEsIGIsIHRlbXAsIHNpemUpIFwKKyJtb3YiICNzaXplICIgIiAjYiAiLCAiICN0ZW1wICIgICBcblx0IlwKKyJwYXZnYiAiICN0ZW1wICIsICIgI2EgIiAgICAgICAgICBcblx0IlwKKyJtb3YiICNzaXplICIgIiAjYSAiLCAiICNiICIgICAgICBcblx0IgorCisjZW5kaWYgLyogKEhBVkVfTU1YRVhUX0lOTElORSB8fCBIQVZFX0FNRDNETk9XX0lOTElORSkgKi8KKworI2lmIEhBVkVfTU1YX0VYVEVSTkFMCitzdGF0aWMgdm9pZCBwdXRfY2F2c19xcGVsOF9tYzAwX21teCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgZmZfcHV0X3BpeGVsczhfbW14KGRzdCwgc3JjLCBzdHJpZGUsIDgpOworfQorCitzdGF0aWMgdm9pZCBhdmdfY2F2c19xcGVsOF9tYzAwX21teCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgZmZfYXZnX3BpeGVsczhfbW14KGRzdCwgc3JjLCBzdHJpZGUsIDgpOworfQorCitzdGF0aWMgdm9pZCBhdmdfY2F2c19xcGVsOF9tYzAwX21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgZmZfYXZnX3BpeGVsczhfbW14ZXh0KGRzdCwgc3JjLCBzdHJpZGUsIDgpOworfQorCitzdGF0aWMgdm9pZCBwdXRfY2F2c19xcGVsMTZfbWMwMF9tbXgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBmZl9wdXRfcGl4ZWxzMTZfbW14KGRzdCwgc3JjLCBzdHJpZGUsIDE2KTsKK30KKworc3RhdGljIHZvaWQgYXZnX2NhdnNfcXBlbDE2X21jMDBfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgZmZfYXZnX3BpeGVsczE2X21teChkc3QsIHNyYywgc3RyaWRlLCAxNik7Cit9CisKK3N0YXRpYyB2b2lkIGF2Z19jYXZzX3FwZWwxNl9tYzAwX21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGZmX2F2Z19waXhlbHMxNl9tbXhleHQoZHN0LCBzcmMsIHN0cmlkZSwgMTYpOworfQorCitzdGF0aWMgdm9pZCBwdXRfY2F2c19xcGVsMTZfbWMwMF9zc2UyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGZmX3B1dF9waXhlbHMxNl9zc2UyKGRzdCwgc3JjLCBzdHJpZGUsIDE2KTsKK30KKworc3RhdGljIHZvaWQgYXZnX2NhdnNfcXBlbDE2X21jMDBfc3NlMih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBmZl9hdmdfcGl4ZWxzMTZfc3NlMihkc3QsIHNyYywgc3RyaWRlLCAxNik7Cit9CisjZW5kaWYKKworc3RhdGljIGF2X2NvbGQgdm9pZCBjYXZzZHNwX2luaXRfbW14KENBVlNEU1BDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyNpZiBIQVZFX01NWF9FWFRFUk5BTAorICAgIGMtPnB1dF9jYXZzX3FwZWxfcGl4ZWxzX3RhYlswXVswXSA9IHB1dF9jYXZzX3FwZWwxNl9tYzAwX21teDsKKyAgICBjLT5wdXRfY2F2c19xcGVsX3BpeGVsc190YWJbMV1bMF0gPSBwdXRfY2F2c19xcGVsOF9tYzAwX21teDsKKyAgICBjLT5hdmdfY2F2c19xcGVsX3BpeGVsc190YWJbMF1bMF0gPSBhdmdfY2F2c19xcGVsMTZfbWMwMF9tbXg7CisgICAgYy0+YXZnX2NhdnNfcXBlbF9waXhlbHNfdGFiWzFdWzBdID0gYXZnX2NhdnNfcXBlbDhfbWMwMF9tbXg7CisjZW5kaWYKKworI2lmIEhBVkVfTU1YX0lOTElORQorICAgIGMtPmNhdnNfaWRjdDhfYWRkID0gY2F2c19pZGN0OF9hZGRfbW14OworICAgIGMtPmlkY3RfcGVybSAgICAgID0gRkZfSURDVF9QRVJNX1RSQU5TUE9TRTsKKyNlbmRpZiAvKiBIQVZFX01NWF9JTkxJTkUgKi8KK30KKworI2RlZmluZSBEU1BGVU5DKFBGWCwgSURYLCBOVU0sIEVYVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGMtPlBGWCAjIyBfY2F2c19xcGVsX3BpeGVsc190YWJbSURYXVsgMl0gPSBQRlggIyMgX2NhdnNfcXBlbCAjIyBOVU0gIyMgX21jMjBfICMjIEVYVDsgXAorICAgIGMtPlBGWCAjIyBfY2F2c19xcGVsX3BpeGVsc190YWJbSURYXVsgNF0gPSBQRlggIyMgX2NhdnNfcXBlbCAjIyBOVU0gIyMgX21jMDFfICMjIEVYVDsgXAorICAgIGMtPlBGWCAjIyBfY2F2c19xcGVsX3BpeGVsc190YWJbSURYXVsgOF0gPSBQRlggIyMgX2NhdnNfcXBlbCAjIyBOVU0gIyMgX21jMDJfICMjIEVYVDsgXAorICAgIGMtPlBGWCAjIyBfY2F2c19xcGVsX3BpeGVsc190YWJbSURYXVsxMl0gPSBQRlggIyMgX2NhdnNfcXBlbCAjIyBOVU0gIyMgX21jMDNfICMjIEVYVDsgXAorCisjaWYgSEFWRV9NTVhFWFRfSU5MSU5FCitRUEVMX0NBVlMocHV0XywgICAgICAgIFBVVF9PUCwgbW14ZXh0KQorUVBFTF9DQVZTKGF2Z18sIEFWR19NTVhFWFRfT1AsIG1teGV4dCkKKworQ0FWU19NQyhwdXRfLCAgOCwgbW14ZXh0KQorQ0FWU19NQyhwdXRfLCAxNiwgbW14ZXh0KQorQ0FWU19NQyhhdmdfLCAgOCwgbW14ZXh0KQorQ0FWU19NQyhhdmdfLCAxNiwgbW14ZXh0KQorI2VuZGlmIC8qIEhBVkVfTU1YRVhUX0lOTElORSAqLworCisjaWYgSEFWRV9BTUQzRE5PV19JTkxJTkUKK1FQRUxfQ0FWUyhwdXRfLCAgICAgICBQVVRfT1AsIDNkbm93KQorUVBFTF9DQVZTKGF2Z18sIEFWR18zRE5PV19PUCwgM2Rub3cpCisKK0NBVlNfTUMocHV0XywgOCwgM2Rub3cpCitDQVZTX01DKHB1dF8sIDE2LDNkbm93KQorQ0FWU19NQyhhdmdfLCA4LCAzZG5vdykKK0NBVlNfTUMoYXZnXywgMTYsM2Rub3cpCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgY2F2c2RzcF9pbml0XzNkbm93KENBVlNEU1BDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIERTUEZVTkMocHV0LCAwLCAxNiwgM2Rub3cpOworICAgIERTUEZVTkMocHV0LCAxLCAgOCwgM2Rub3cpOworICAgIERTUEZVTkMoYXZnLCAwLCAxNiwgM2Rub3cpOworICAgIERTUEZVTkMoYXZnLCAxLCAgOCwgM2Rub3cpOworfQorI2VuZGlmIC8qIEhBVkVfQU1EM0ROT1dfSU5MSU5FICovCisKK2F2X2NvbGQgdm9pZCBmZl9jYXZzZHNwX2luaXRfeDg2KENBVlNEU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGNhdnNkc3BfaW5pdF9tbXgoYywgYXZjdHgpOworI2lmIEhBVkVfQU1EM0ROT1dfSU5MSU5FCisgICAgaWYgKElOTElORV9BTUQzRE5PVyhjcHVfZmxhZ3MpKQorICAgICAgICBjYXZzZHNwX2luaXRfM2Rub3coYywgYXZjdHgpOworI2VuZGlmIC8qIEhBVkVfQU1EM0ROT1dfSU5MSU5FICovCisjaWYgSEFWRV9NTVhFWFRfSU5MSU5FCisgICAgaWYgKElOTElORV9NTVhFWFQoY3B1X2ZsYWdzKSkgeworICAgICAgICBEU1BGVU5DKHB1dCwgMCwgMTYsIG1teGV4dCk7CisgICAgICAgIERTUEZVTkMocHV0LCAxLCAgOCwgbW14ZXh0KTsKKyAgICAgICAgRFNQRlVOQyhhdmcsIDAsIDE2LCBtbXhleHQpOworICAgICAgICBEU1BGVU5DKGF2ZywgMSwgIDgsIG1teGV4dCk7CisgICAgfQorI2VuZGlmCisjaWYgSEFWRV9NTVhfRVhURVJOQUwKKyAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YXZnX2NhdnNfcXBlbF9waXhlbHNfdGFiWzBdWzBdID0gYXZnX2NhdnNfcXBlbDE2X21jMDBfbW14ZXh0OworICAgICAgICBjLT5hdmdfY2F2c19xcGVsX3BpeGVsc190YWJbMV1bMF0gPSBhdmdfY2F2c19xcGVsOF9tYzAwX21teGV4dDsKKyAgICB9CisjZW5kaWYKKyNpZiBIQVZFX1NTRTJfRVhURVJOQUwKKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnB1dF9jYXZzX3FwZWxfcGl4ZWxzX3RhYlswXVswXSA9IHB1dF9jYXZzX3FwZWwxNl9tYzAwX3NzZTI7CisgICAgICAgIGMtPmF2Z19jYXZzX3FwZWxfcGl4ZWxzX3RhYlswXVswXSA9IGF2Z19jYXZzX3FwZWwxNl9tYzAwX3NzZTI7CisgICAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvY29uc3RhbnRzLmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvY29uc3RhbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzZGYwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9jb25zdGFudHMuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogTU1YL1NTRS9BVlggY29uc3RhbnRzIHVzZWQgYWNyb3NzIHg4NiBkc3Agb3B0aW1pemF0aW9ucy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIiAvLyBmb3IgeG1tX3JlZworI2luY2x1ZGUgImNvbnN0YW50cy5oIgorCitERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHhtbV9yZWcsICBmZl9wd18xKSAgICA9IHsgMHgwMDAxMDAwMTAwMDEwMDAxVUxMLCAweDAwMDEwMDAxMDAwMTAwMDFVTEwgfTsKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzIpICAgID0geyAweDAwMDIwMDAyMDAwMjAwMDJVTEwsIDB4MDAwMjAwMDIwMDAyMDAwMlVMTCB9OworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCB4bW1fcmVnLCAgZmZfcHdfMykgICAgPSB7IDB4MDAwMzAwMDMwMDAzMDAwM1VMTCwgMHgwMDAzMDAwMzAwMDMwMDAzVUxMIH07CitERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHhtbV9yZWcsICBmZl9wd180KSAgICA9IHsgMHgwMDA0MDAwNDAwMDQwMDA0VUxMLCAweDAwMDQwMDA0MDAwNDAwMDRVTEwgfTsKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzUpICAgID0geyAweDAwMDUwMDA1MDAwNTAwMDVVTEwsIDB4MDAwNTAwMDUwMDA1MDAwNVVMTCB9OworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCB4bW1fcmVnLCAgZmZfcHdfOCkgICAgPSB7IDB4MDAwODAwMDgwMDA4MDAwOFVMTCwgMHgwMDA4MDAwODAwMDgwMDA4VUxMIH07CitERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHhtbV9yZWcsICBmZl9wd185KSAgICA9IHsgMHgwMDA5MDAwOTAwMDkwMDA5VUxMLCAweDAwMDkwMDA5MDAwOTAwMDlVTEwgfTsKK0RFQ0xBUkVfQUxJR05FRCg4LCAgY29uc3QgdWludDY0X3QsIGZmX3B3XzE1KSAgID0gICAweDAwMEYwMDBGMDAwRjAwMEZVTEw7CitERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHhtbV9yZWcsICBmZl9wd18xNikgICA9IHsgMHgwMDEwMDAxMDAwMTAwMDEwVUxMLCAweDAwMTAwMDEwMDAxMDAwMTBVTEwgfTsKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzE3KSAgID0geyAweDAwMTEwMDExMDAxMTAwMTFVTEwsIDB4MDAxMTAwMTEwMDExMDAxMVVMTCB9OworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCB4bW1fcmVnLCAgZmZfcHdfMTgpICAgPSB7IDB4MDAxMjAwMTIwMDEyMDAxMlVMTCwgMHgwMDEyMDAxMjAwMTIwMDEyVUxMIH07CitERUNMQVJFX0FMSUdORUQoOCwgIGNvbnN0IHVpbnQ2NF90LCBmZl9wd18yMCkgICA9ICAgMHgwMDE0MDAxNDAwMTQwMDE0VUxMOworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCB4bW1fcmVnLCAgZmZfcHdfMzIpICAgPSB7IDB4MDAyMDAwMjAwMDIwMDAyMFVMTCwgMHgwMDIwMDAyMDAwMjAwMDIwVUxMIH07CitERUNMQVJFX0FMSUdORUQoOCwgIGNvbnN0IHVpbnQ2NF90LCBmZl9wd180MikgICA9ICAgMHgwMDJBMDAyQTAwMkEwMDJBVUxMOworREVDTEFSRV9BTElHTkVEKDgsICBjb25zdCB1aW50NjRfdCwgZmZfcHdfNTMpICAgPSAgIDB4MDAzNTAwMzUwMDM1MDAzNVVMTDsKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzY0KSAgID0geyAweDAwNDAwMDQwMDA0MDAwNDBVTEwsIDB4MDA0MDAwNDAwMDQwMDA0MFVMTCB9OworREVDTEFSRV9BTElHTkVEKDgsICBjb25zdCB1aW50NjRfdCwgZmZfcHdfOTYpICAgPSAgIDB4MDA2MDAwNjAwMDYwMDA2MFVMTDsKK0RFQ0xBUkVfQUxJR05FRCg4LCAgY29uc3QgdWludDY0X3QsIGZmX3B3XzEyOCkgID0gICAweDAwODAwMDgwMDA4MDAwODBVTEw7CitERUNMQVJFX0FMSUdORUQoOCwgIGNvbnN0IHVpbnQ2NF90LCBmZl9wd18yNTUpICA9ICAgMHgwMGZmMDBmZjAwZmYwMGZmVUxMOworREVDTEFSRV9BTElHTkVEKDMyLCBjb25zdCB5bW1fcmVnLCAgZmZfcHdfMjU2KSAgPSB7IDB4MDEwMDAxMDAwMTAwMDEwMFVMTCwgMHgwMTAwMDEwMDAxMDAwMTAwVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAxMDAwMTAwMDEwMFVMTCwgMHgwMTAwMDEwMDAxMDAwMTAwVUxMIH07CitERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHhtbV9yZWcsICBmZl9wd181MTIpICA9IHsgMHgwMjAwMDIwMDAyMDAwMjAwVUxMLCAweDAyMDAwMjAwMDIwMDAyMDBVTEwgfTsKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzEwMTkpID0geyAweDAzRkIwM0ZCMDNGQjAzRkJVTEwsIDB4MDNGQjAzRkIwM0ZCMDNGQlVMTCB9OworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCB4bW1fcmVnLCAgZmZfcHdfMTAyNCkgPSB7IDB4MDQwMDA0MDAwNDAwMDQwMFVMTCwgMHgwNDAwMDQwMDA0MDAwNDAwVUxMIH07CitERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHhtbV9yZWcsICBmZl9wd18yMDQ4KSA9IHsgMHgwODAwMDgwMDA4MDAwODAwVUxMLCAweDA4MDAwODAwMDgwMDA4MDBVTEwgfTsKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzgxOTIpID0geyAweDIwMDAyMDAwMjAwMDIwMDBVTEwsIDB4MjAwMDIwMDAyMDAwMjAwMFVMTCB9OworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCB4bW1fcmVnLCAgZmZfcHdfbTEpICAgPSB7IDB4RkZGRkZGRkZGRkZGRkZGRlVMTCwgMHhGRkZGRkZGRkZGRkZGRkZGVUxMIH07CisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3BiXzApICAgID0geyAweDAwMDAwMDAwMDAwMDAwMDBVTEwsIDB4MDAwMDAwMDAwMDAwMDAwMFVMTCB9OworREVDTEFSRV9BTElHTkVEKDMyLCBjb25zdCB5bW1fcmVnLCAgZmZfcGJfMSkgICAgPSB7IDB4MDEwMTAxMDEwMTAxMDEwMVVMTCwgMHgwMTAxMDEwMTAxMDEwMTAxVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMTAxMDEwMTAxMDEwMVVMTCwgMHgwMTAxMDEwMTAxMDEwMTAxVUxMIH07CitERUNMQVJFX0FMSUdORUQoMzIsIGNvbnN0IHltbV9yZWcsICBmZl9wYl8zKSAgICA9IHsgMHgwMzAzMDMwMzAzMDMwMzAzVUxMLCAweDAzMDMwMzAzMDMwMzAzMDNVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzAzMDMwMzAzMDMwMzAzVUxMLCAweDAzMDMwMzAzMDMwMzAzMDNVTEwgfTsKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3BiXzgwKSAgID0geyAweDgwODA4MDgwODA4MDgwODBVTEwsIDB4ODA4MDgwODA4MDgwODA4MFVMTCB9OworREVDTEFSRV9BTElHTkVEKDgsICBjb25zdCB1aW50NjRfdCwgZmZfcGJfRkMpICAgPSAgIDB4RkNGQ0ZDRkNGQ0ZDRkNGQ1VMTDsKKworREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCB4bW1fcmVnLCAgZmZfcHNfbmVnKSAgPSB7IDB4ODAwMDAwMDA4MDAwMDAwMFVMTCwgMHg4MDAwMDAwMDgwMDAwMDAwVUxMIH07CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvY29uc3RhbnRzLmggYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1ZmZmOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9jb25zdGFudHMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogTU1YL1NTRSBjb25zdGFudHMgdXNlZCBhY3Jvc3MgeDg2IGRzcCBvcHRpbWl6YXRpb25zLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfWDg2X0NPTlNUQU5UU19ICisjZGVmaW5lIEFWQ09ERUNfWDg2X0NPTlNUQU5UU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisKK2V4dGVybiBjb25zdCB4bW1fcmVnICBmZl9wd18xOworZXh0ZXJuIGNvbnN0IHhtbV9yZWcgIGZmX3B3XzI7CitleHRlcm4gY29uc3QgeG1tX3JlZyAgZmZfcHdfMzsKK2V4dGVybiBjb25zdCB4bW1fcmVnICBmZl9wd180OworZXh0ZXJuIGNvbnN0IHhtbV9yZWcgIGZmX3B3XzU7CitleHRlcm4gY29uc3QgeG1tX3JlZyAgZmZfcHdfODsKK2V4dGVybiBjb25zdCB4bW1fcmVnICBmZl9wd185OworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX3B3XzE1OworZXh0ZXJuIGNvbnN0IHhtbV9yZWcgIGZmX3B3XzE2OworZXh0ZXJuIGNvbnN0IHhtbV9yZWcgIGZmX3B3XzE4OworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX3B3XzIwOworZXh0ZXJuIGNvbnN0IHhtbV9yZWcgIGZmX3B3XzMyOworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX3B3XzQyOworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX3B3XzUzOworZXh0ZXJuIGNvbnN0IHhtbV9yZWcgIGZmX3B3XzY0OworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX3B3Xzk2OworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX3B3XzEyODsKK2V4dGVybiBjb25zdCB1aW50NjRfdCBmZl9wd18yNTU7CitleHRlcm4gY29uc3QgeG1tX3JlZyAgZmZfcHdfNTEyOworZXh0ZXJuIGNvbnN0IHhtbV9yZWcgIGZmX3B3XzEwMjQ7CitleHRlcm4gY29uc3QgeG1tX3JlZyAgZmZfcHdfMjA0ODsKK2V4dGVybiBjb25zdCB4bW1fcmVnICBmZl9wd184MTkyOworZXh0ZXJuIGNvbnN0IHhtbV9yZWcgIGZmX3B3X20xOworCitleHRlcm4gY29uc3QgeW1tX3JlZyAgZmZfcGJfMTsKK2V4dGVybiBjb25zdCB5bW1fcmVnICBmZl9wYl8zOworZXh0ZXJuIGNvbnN0IHhtbV9yZWcgIGZmX3BiXzgwOworZXh0ZXJuIGNvbnN0IHhtbV9yZWcgIGZmX3BiX0Y4OworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX3BiX0ZDOworCitleHRlcm4gY29uc3QgeG1tX3JlZyAgZmZfcHNfbmVnOworCisjZW5kaWYgLyogQVZDT0RFQ19YODZfQ09OU1RBTlRTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kY2Fkc3AuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RjYWRzcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjMjM3OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kY2Fkc3AuYXNtCkBAIC0wLDAgKzEsNDMxIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBTU0Utb3B0aW1pemVkIGZ1bmN0aW9ucyBmb3IgdGhlIERDQSBkZWNvZGVyCis7KiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBDaHJpc3RvcGhlIEdpc3F1ZXQgPGNocmlzdG9waGUuZ2lzcXVldEBnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKK3BmX2ludjE2OiAgdGltZXMgNCBkZCAweDNEODAwMDAwIDsgMS8xNgorCitTRUNUSU9OX1RFWFQKKworOyB2b2lkIGRlY29kZV9oZihmbG9hdCBkc3RbRENBX1NVQkJBTkRTXVs4XSwgY29uc3QgaW50MzJfdCB2cV9udW1bRENBX1NVQkJBTkRTXSwKKzsgICAgICAgICAgICAgICAgY29uc3QgaW50OF90IGhmX3ZxWzEwMjRdWzMyXSwgaW50cHRyX3QgdnFfb2Zmc2V0LAorOyAgICAgICAgICAgICAgICBpbnQzMl90IHNjYWxlW0RDQV9TVUJCQU5EU11bMl0sIGludHB0cl90IHN0YXJ0LCBpbnRwdHJfdCBlbmQpCisKKyVtYWNybyBERUNPREVfSEYgMAorY2dsb2JhbCBkZWNvZGVfaGYsIDYsNiw1LCBkc3QsIG51bSwgc3JjLCBvZmZzZXQsIHNjYWxlLCBzdGFydCwgZW5kCisgICAgbGVhICAgICAgIHNyY3EsIFtzcmNxICsgb2Zmc2V0cV0KKyAgICBzaGwgICAgIHN0YXJ0cSwgMgorICAgIG1vdiAgICBvZmZzZXRkLCBlbmRtCislZGVmaW5lIERJQ1Qgb2Zmc2V0cQorICAgIHNobCAgICBvZmZzZXRxLCAyCisgICAgbW92ICAgICAgIGVuZG0sIG9mZnNldHEKKy5sb29wOgorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92ICAgIG9mZnNldGQsIFtzY2FsZXEgKyAyICogc3RhcnRxXQorICAgIGN2dHNpMnNzICAgIG0wLCBvZmZzZXRkCislZWxzZQorICAgIGN2dHNpMnNzICAgIG0wLCBbc2NhbGVxICsgMiAqIHN0YXJ0cV0KKyVlbmRpZgorICAgIG1vdiAgICBvZmZzZXRkLCBbbnVtcSArIHN0YXJ0cV0KKyAgICBtdWxzcyAgICAgICBtMCwgW3BmX2ludjE2XQorICAgIHNobCAgICAgICBESUNULCA1CisgICAgc2h1ZnBzICAgICAgbTAsIG0wLCAwCislaWYgY3B1ZmxhZyhzc2UyKQorJWlmIGNwdWZsYWcoc3NlNCkKKyAgICBwbW92c3hiZCAgICBtMSwgW3NyY3EgKyBESUNUICsgMF0KKyAgICBwbW92c3hiZCAgICBtMiwgW3NyY3EgKyBESUNUICsgNF0KKyVlbHNlCisgICAgbW92cSAgICAgICAgbTEsIFtzcmNxICsgRElDVF0KKyAgICBwdW5wY2tsYncgICBtMSwgbTEKKyAgICBtb3ZhICAgICAgICBtMiwgbTEKKyAgICBwdW5wY2tsd2QgICBtMSwgbTEKKyAgICBwdW5wY2tod2QgICBtMiwgbTIKKyAgICBwc3JhZCAgICAgICBtMSwgMjQKKyAgICBwc3JhZCAgICAgICBtMiwgMjQKKyVlbmRpZgorICAgIGN2dGRxMnBzICAgIG0xLCBtMQorICAgIGN2dGRxMnBzICAgIG0yLCBtMgorJWVsc2UKKyAgICBtb3ZkICAgICAgIG1tMCwgW3NyY3EgKyBESUNUICsgMF0KKyAgICBtb3ZkICAgICAgIG1tMSwgW3NyY3EgKyBESUNUICsgNF0KKyAgICBwdW5wY2tsYncgIG1tMCwgbW0wCisgICAgcHVucGNrbGJ3ICBtbTEsIG1tMQorICAgIG1vdnEgICAgICAgbW0yLCBtbTAKKyAgICBtb3ZxICAgICAgIG1tMywgbW0xCisgICAgcHVucGNrbHdkICBtbTAsIG1tMAorICAgIHB1bnBja2x3ZCAgbW0xLCBtbTEKKyAgICBwdW5wY2tod2QgIG1tMiwgbW0yCisgICAgcHVucGNraHdkICBtbTMsIG1tMworICAgIHBzcmFkICAgICAgbW0wLCAyNAorICAgIHBzcmFkICAgICAgbW0xLCAyNAorICAgIHBzcmFkICAgICAgbW0yLCAyNAorICAgIHBzcmFkICAgICAgbW0zLCAyNAorICAgIGN2dHBpMnBzICAgIG0xLCBtbTAKKyAgICBjdnRwaTJwcyAgICBtMiwgbW0xCisgICAgY3Z0cGkycHMgICAgbTMsIG1tMgorICAgIGN2dHBpMnBzICAgIG00LCBtbTMKKyAgICBzaHVmcHMgICAgICBtMCwgbTAsIDAKKyAgICBzaHVmcHMgICAgICBtMSwgbTMsIHExMDEwCisgICAgc2h1ZnBzICAgICAgbTIsIG00LCBxMTAxMAorJWVuZGlmCisgICAgbXVscHMgICAgICAgbTEsIG0wCisgICAgbXVscHMgICAgICAgbTIsIG0wCisgICAgbW92YSBbZHN0cSArIDggKiBzdGFydHEgKyAgMF0sIG0xCisgICAgbW92YSBbZHN0cSArIDggKiBzdGFydHEgKyAxNl0sIG0yCisgICAgYWRkICAgICBzdGFydHEsIDQKKyAgICBjbXAgICAgIHN0YXJ0cSwgZW5kbQorICAgIGpsICAgICAgIC5sb29wCisuZW5kOgorJWlmIG5vdGNwdWZsYWcoc3NlMikKKyAgICBlbW1zCislZW5kaWYKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzMyCitJTklUX1hNTSBzc2UKK0RFQ09ERV9IRgorJWVuZGlmCisKK0lOSVRfWE1NIHNzZTIKK0RFQ09ERV9IRgorCitJTklUX1hNTSBzc2U0CitERUNPREVfSEYKKworOyAlMT12MC92MSAgJTI9aW4xICAlMz1pbjIKKyVtYWNybyBGSVJfTE9PUCAyLTMKKy5sb29wJTE6CislZGVmaW5lIHZhICAgICAgICAgIG0xCislZGVmaW5lIHZiICAgICAgICAgIG0yCislaWYgJTEKKyVkZWZpbmUgT0ZGU0VUICAgICAgMAorJWVsc2UKKyVkZWZpbmUgT0ZGU0VUICAgICAgTlVNX0NPRUYqY291bnQKKyVlbmRpZgorOyBmb3IgdjAsIGluY3JlbWVudGluZyBhbmQgZm9yIHYxLCBkZWNyZW1lbnRpbmcKKyAgICBtb3ZhICAgICAgICB2YSwgW2NmMHEgKyBPRkZTRVRdCisgICAgbW92YSAgICAgICAgdmIsIFtjZjBxICsgT0ZGU0VUICsgNCpOVU1fQ09FRl0KKyVpZiAlMCA9PSAzCisgICAgbW92YSAgICAgICAgbTQsIFtjZjBxICsgT0ZGU0VUICsgbW1zaXplXQorICAgIG1vdmEgICAgICAgIG0wLCBbY2YwcSArIE9GRlNFVCArIDQqTlVNX0NPRUYgKyBtbXNpemVdCislZW5kaWYKKyAgICBtdWxwcyAgICAgICB2YSwgJTIKKyAgICBtdWxwcyAgICAgICB2YiwgJTIKKyVpZiAlMCA9PSAzCislaWYgY3B1ZmxhZyhmbWEzKQorICAgIGZtYWRkcHMgICAgIHZhLCBtNCwgJTMsIHZhCisgICAgZm1hZGRwcyAgICAgdmIsIG0wLCAlMywgdmIKKyVlbHNlCisgICAgbXVscHMgICAgICAgbTQsICUzCisgICAgbXVscHMgICAgICAgbTAsICUzCisgICAgYWRkcHMgICAgICAgdmEsIG00CisgICAgYWRkcHMgICAgICAgdmIsIG0wCislZW5kaWYKKyVlbmRpZgorICAgIDsgdmEgPSB2YTEgdmEyIHZhMyB2YTQKKyAgICA7IHZiID0gdmIxIHZiMiB2YjMgdmI0CislaWYgJTEKKyAgICBTV0FQICAgICAgICB2YSwgdmIKKyVlbmRpZgorICAgIG1vdmEgICAgICAgIG00LCB2YQorICAgIHVucGNrbHBzICAgIHZhLCB2YiA7IHZhMyB2YjMgdmE0IHZiNAorICAgIHVucGNraHBzICAgIG00LCB2YiA7IHZhMSB2YjEgdmEyIHZiMgorICAgIGFkZHBzICAgICAgIG00LCB2YSA7IHZhMSszIHZiMSszIHZhMis0IHZiMis0CisgICAgbW92aGxwcyAgICAgdmIsIG00IDsgdmExKzMgIHZiMSszCisgICAgYWRkcHMgICAgICAgdmIsIG00IDsgdmEwLi40IHZiMC4uNAorICAgIG1vdmxwcyAgW291dHEgKyBjb3VudF0sIHZiCislaWYgJTEKKyAgICBzdWIgICAgICAgY2YwcSwgOCpOVU1fQ09FRgorJWVuZGlmCisgICAgYWRkICAgICAgY291bnQsIDgKKyAgICBqbCAgIC5sb29wJTEKKyVlbmRtYWNybworCis7IHZvaWQgZGNhX2xmZV9maXIoZmxvYXQgKm91dCwgZmxvYXQgKmluLCBmbG9hdCAqY29lZnMpCislbWFjcm8gRENBX0xGRV9GSVIgMQorY2dsb2JhbCBkY2FfbGZlX2ZpciUxLCAzLDMsNi0lMSwgb3V0LCBpbiwgY2YwCislZGVmaW5lIElOMSAgICAgICBtMworJWRlZmluZSBJTjIgICAgICAgbTUKKyVkZWZpbmUgY291bnQgICAgIGlucQorJWRlZmluZSBOVU1fQ09FRiAgNCooMi0lMSkKKyVkZWZpbmUgTlVNX09VVCAgIDMyKiglMSsxKQorCisgICAgbW92dSAgICAgSU4xLCBbaW5xICsgNCAtIDEqbW1zaXplXQorICAgIHNodWZwcyAgIElOMSwgSU4xLCBxMDEyMworJWlmICUxID09IDAKKyAgICBtb3Z1ICAgICBJTjIsIFtpbnEgKyA0IC0gMiptbXNpemVdCisgICAgc2h1ZnBzICAgSU4yLCBJTjIsIHEwMTIzCislZW5kaWYKKworICAgIG1vdiAgICBjb3VudCwgLTQqTlVNX09VVAorICAgIGFkZCAgICAgY2YwcSwgNCpOVU1fQ09FRipOVU1fT1VUCisgICAgYWRkICAgICBvdXRxLCA0Kk5VTV9PVVQKKyAgICA7IGNvbXB1dGUgdjAgZmlyc3QKKyVpZiAlMSA9PSAwCisgICAgRklSX0xPT1AgICAwLCBJTjEsIElOMgorJWVsc2UKKyAgICBGSVJfTE9PUCAgIDAsIElOMQorJWVuZGlmCisgICAgc2h1ZnBzICAgSU4xLCBJTjEsIHEwMTIzCisgICAgbW92ICAgIGNvdW50LCAtNCpOVU1fT1VUCisgICAgOyBjZjEgYWxyZWFkeSBjb3JyZWN0bHkgcG9zaXRpb25lZAorICAgIGFkZCAgICAgb3V0cSwgNCpOVU1fT1VUICAgICAgICAgIDsgb3V0cSBub3cgYXQgb3V0MgorICAgIHN1YiAgICAgY2YwcSwgOCpOVU1fQ09FRgorJWlmICUxID09IDAKKyAgICBzaHVmcHMgICBJTjIsIElOMiwgcTAxMjMKKyAgICBGSVJfTE9PUCAgIDEsIElOMiwgSU4xCislZWxzZQorICAgIEZJUl9MT09QICAgMSwgSU4xCislZW5kaWYKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UKK0RDQV9MRkVfRklSIDAKK0RDQV9MRkVfRklSIDEKKyVpZiBIQVZFX0ZNQTNfRVhURVJOQUwKK0lOSVRfWE1NIGZtYTMKK0RDQV9MRkVfRklSIDAKKyVlbmRpZgorCislbWFjcm8gU0VUWkVSTyAxCislaWYgY3B1ZmxhZyhzc2UyKSAmJiBub3RjcHVmbGFnKGF2eCkKKyAgICBweG9yICAgICAgICAgICUxLCAlMQorJWVsc2UKKyAgICB4b3JwcyAgICAgICAgICUxLCAlMSwgJTEKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBTSFVGIDMKKyVpZiBjcHVmbGFnKGF2eCkKKyAgICBtb3ZhICAgICAgICAgICUzLCBbJTIgLSAxNl0KKyAgICB2cGVybTJmMTI4ICAgICUxLCAlMywgJTMsIDEKKyAgICB2c2h1ZnBzICAgICAgICUxLCAlMSwgJTEsIHEwMTIzCislZWxpZiBjcHVmbGFnKHNzZTIpCisgICAgcHNodWZkICAgICAgICAlMSwgWyUyXSwgcTAxMjMKKyVlbHNlCisgICAgbW92YSAgICAgICAgICAlMSwgWyUyXQorICAgIHNodWZwcyAgICAgICAgJTEsICUxLCBxMDEyMworJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIElOTkVSX0xPT1AgICAxCisgICAgOyByZWFkaW5nIGJhY2t3YXJkczogIHB0cjEgPSBzeW50aF9idWYgKyBqICsgaTsgcHRyMiA9IHN5bnRoX2J1ZiArIGogLSBpCisgICAgO34gYSArPSB3aW5kb3dbaSArIGpdICAgICAgKiAoLXN5bnRoX2J1ZlsxNSAtIGkgKyBqXSkKKyAgICA7fiBiICs9IHdpbmRvd1tpICsgaiArIDE2XSAqIChzeW50aF9idWZbaSArIGpdKQorICAgIFNIVUYgICAgICAgICAgbTUsICBwdHIyICsgaiArICgxNSAtIDMpICogNCwgbTYKKyAgICBtb3ZhICAgICAgICAgIG02LCBbcHRyMSArIGpdCislaWYgQVJDSF9YODZfNjQKKyAgICBTSFVGICAgICAgICAgbTExLCAgcHRyMiArIGogKyAoMTUgLSAzKSAqIDQgLSBtbXNpemUsIG0xMgorICAgIG1vdmEgICAgICAgICBtMTIsIFtwdHIxICsgaiArIG1tc2l6ZV0KKyVlbmRpZgorJWlmIGNwdWZsYWcoZm1hMykKKyAgICBmbWFkZHBzICAgICAgIG0yLCBtNiwgIFt3aW4gKyAlMSArIGogKyAxNiAqIDRdLCBtMgorICAgIGZubWFkZHBzICAgICAgbTEsIG01LCAgW3dpbiArICUxICsgal0sIG0xCislaWYgQVJDSF9YODZfNjQKKyAgICBmbWFkZHBzICAgICAgIG04LCBtMTIsIFt3aW4gKyAlMSArIGogKyBtbXNpemUgKyAxNiAqIDRdLCBtOAorICAgIGZubWFkZHBzICAgICAgbTcsIG0xMSwgW3dpbiArICUxICsgaiArIG1tc2l6ZV0sIG03CislZW5kaWYKKyVlbHNlIDsgbm9uLUZNQQorICAgIG11bHBzICAgICAgICAgbTYsIG02LCAgW3dpbiArICUxICsgaiArIDE2ICogNF0KKyAgICBtdWxwcyAgICAgICAgIG01LCBtNSwgIFt3aW4gKyAlMSArIGpdCislaWYgQVJDSF9YODZfNjQKKyAgICBtdWxwcyAgICAgICAgbTEyLCBtMTIsIFt3aW4gKyAlMSArIGogKyBtbXNpemUgKyAxNiAqIDRdCisgICAgbXVscHMgICAgICAgIG0xMSwgbTExLCBbd2luICsgJTEgKyBqICsgbW1zaXplXQorJWVuZGlmCisgICAgYWRkcHMgICAgICAgICBtMiwgbTIsIG02CisgICAgc3VicHMgICAgICAgICBtMSwgbTEsIG01CislaWYgQVJDSF9YODZfNjQKKyAgICBhZGRwcyAgICAgICAgIG04LCBtOCwgbTEyCisgICAgc3VicHMgICAgICAgICBtNywgbTcsIG0xMQorJWVuZGlmCislZW5kaWYgOyBjcHVmbGFnKGZtYTMpCisgICAgO34gYyArPSB3aW5kb3dbaSArIGogKyAzMl0gKiAoc3ludGhfYnVmWzE2ICsgaSArIGpdKQorICAgIDt+IGQgKz0gd2luZG93W2kgKyBqICsgNDhdICogKHN5bnRoX2J1ZlszMSAtIGkgKyBqXSkKKyAgICBTSFVGICAgICAgICAgIG02LCAgcHRyMiArIGogKyAoMzEgLSAzKSAqIDQsIG01CisgICAgbW92YSAgICAgICAgICBtNSwgW3B0cjEgKyBqICsgMTYgKiA0XQorJWlmIEFSQ0hfWDg2XzY0CisgICAgU0hVRiAgICAgICAgIG0xMiwgIHB0cjIgKyBqICsgKDMxIC0gMykgKiA0IC0gbW1zaXplLCBtMTEKKyAgICBtb3ZhICAgICAgICAgbTExLCBbcHRyMSArIGogKyBtbXNpemUgKyAxNiAqIDRdCislZW5kaWYKKyVpZiBjcHVmbGFnKGZtYTMpCisgICAgZm1hZGRwcyAgICAgICBtMywgbTUsICBbd2luICsgJTEgKyBqICsgMzIgKiA0XSwgbTMKKyAgICBmbWFkZHBzICAgICAgIG00LCBtNiwgIFt3aW4gKyAlMSArIGogKyA0OCAqIDRdLCBtNAorJWlmIEFSQ0hfWDg2XzY0CisgICAgZm1hZGRwcyAgICAgICBtOSwgbTExLCBbd2luICsgJTEgKyBqICsgbW1zaXplICsgMzIgKiA0XSwgbTkKKyAgICBmbWFkZHBzICAgICAgbTEwLCBtMTIsIFt3aW4gKyAlMSArIGogKyBtbXNpemUgKyA0OCAqIDRdLCBtMTAKKyVlbmRpZgorJWVsc2UgOyBub24tRk1BCisgICAgbXVscHMgICAgICAgICBtNSwgbTUsICBbd2luICsgJTEgKyBqICsgMzIgKiA0XQorICAgIG11bHBzICAgICAgICAgbTYsIG02LCAgW3dpbiArICUxICsgaiArIDQ4ICogNF0KKyVpZiBBUkNIX1g4Nl82NAorICAgIG11bHBzICAgICAgICBtMTEsIG0xMSwgW3dpbiArICUxICsgaiArIG1tc2l6ZSArIDMyICogNF0KKyAgICBtdWxwcyAgICAgICAgbTEyLCBtMTIsIFt3aW4gKyAlMSArIGogKyBtbXNpemUgKyA0OCAqIDRdCislZW5kaWYKKyAgICBhZGRwcyAgICAgICAgIG0zLCBtMywgbTUKKyAgICBhZGRwcyAgICAgICAgIG00LCBtNCwgbTYKKyVpZiBBUkNIX1g4Nl82NAorICAgIGFkZHBzICAgICAgICAgbTksIG05LCBtMTEKKyAgICBhZGRwcyAgICAgICAgbTEwLCBtMTAsIG0xMgorJWVuZGlmCislZW5kaWYgOyBjcHVmbGFnKGZtYTMpCisgICAgc3ViICAgICAgICAgICAgaiwgNjQgKiA0CislZW5kbWFjcm8KKworOyB2b2lkIGZmX3N5bnRoX2ZpbHRlcl9pbm5lcl88b3B0PihmbG9hdCAqc3ludGhfYnVmLCBmbG9hdCBzeW50aF9idWYyWzMyXSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgd2luZG93WzUxMl0sIGZsb2F0IG91dFszMl0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG9mZnNldCwgZmxvYXQgc2NhbGUpCislbWFjcm8gU1lOVEhfRklMVEVSIDAKK2NnbG9iYWwgc3ludGhfZmlsdGVyX2lubmVyLCAwLCA2ICsgNCAqIEFSQ0hfWDg2XzY0LCA3ICsgNiAqIEFSQ0hfWDg2XzY0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aF9idWYsIHN5bnRoX2J1ZjIsIHdpbmRvdywgb3V0LCBvZmYsIHNjYWxlCislZGVmaW5lIHNjYWxlIG0wCislaWYgQVJDSF9YODZfMzIgfHwgV0lONjQKKyVpZiBjcHVmbGFnKHNzZTIpICYmIG5vdGNwdWZsYWcoYXZ4KQorICAgIG1vdmQgICAgICAgc2NhbGUsIHNjYWxlbQorICAgIFNQTEFURCAgICAgICAgbTAKKyVlbHNlCisgICAgVkJST0FEQ0FTVFNTICBtMCwgc2NhbGVtCislZW5kaWYKKzsgTWFrZSBzdXJlIG9mZnNldCBpcyBpbiBhIHJlZ2lzdGVyIGFuZCBub3Qgb24gdGhlIHN0YWNrCislZGVmaW5lIE9GRlEgIHI0cQorJWVsc2UKKyAgICBTUExBVEQgICAgICB4bW0wCislaWYgY3B1ZmxhZyhhdngpCisgICAgdmluc2VydGYxMjggICBtMCwgbTAsIHhtbTAsIDEKKyVlbmRpZgorJWRlZmluZSBPRkZRICBvZmZxCislZW5kaWYKKyAgICA7IHByZXBhcmUgaW5uZXIgY291bnRlciBsaW1pdCAxCisgICAgbW92ICAgICAgICAgIHI1cSwgNDgwCisgICAgc3ViICAgICAgICAgIHI1cSwgb2ZmbXAKKyAgICBhbmQgICAgICAgICAgcjVxLCAtNjQKKyAgICBzaGwgICAgICAgICAgcjVxLCAyCislaWYgQVJDSF9YODZfMzIgfHwgbm90Y3B1ZmxhZyhhdngpCisgICAgbW92ICAgICAgICAgT0ZGUSwgcjVxCislZGVmaW5lIGkgICAgICAgIHI1cQorICAgIG1vdiAgICAgICAgICAgIGksIDE2ICogNCAtIChBUkNIX1g4Nl82NCArIDEpICogbW1zaXplICA7IG1haW4gbG9vcCBjb3VudGVyCislZWxzZQorJWRlZmluZSBpIDAKKyVkZWZpbmUgT0ZGUSAgcjVxCislZW5kaWYKKworJWRlZmluZSBidWYyICAgICBzeW50aF9idWYycQorJWlmIEFSQ0hfWDg2XzMyCisgICAgbW92ICAgICAgICAgYnVmMiwgc3ludGhfYnVmMm1wCislZW5kaWYKKy5tYWlubG9vcAorICAgIDsgbTEgPSBhICBtMiA9IGIgIG0zID0gYyAgbTQgPSBkCisgICAgU0VUWkVSTyAgICAgICBtMworICAgIFNFVFpFUk8gICAgICAgbTQKKyAgICBtb3ZhICAgICAgICAgIG0xLCBbYnVmMiArIGldCisgICAgbW92YSAgICAgICAgICBtMiwgW2J1ZjIgKyBpICsgMTYgKiA0XQorJWlmIEFSQ0hfWDg2XzMyCislZGVmaW5lIHB0cjEgICAgIHIwcQorJWRlZmluZSBwdHIyICAgICByMXEKKyVkZWZpbmUgd2luICAgICAgcjJxCislZGVmaW5lIGogICAgICAgIHIzcQorICAgIG1vdiAgICAgICAgICB3aW4sIHdpbmRvd20KKyAgICBtb3YgICAgICAgICBwdHIxLCBzeW50aF9idWZtCislaWYgQVJDSF9YODZfMzIgfHwgbm90Y3B1ZmxhZyhhdngpCisgICAgYWRkICAgICAgICAgIHdpbiwgaQorICAgIGFkZCAgICAgICAgIHB0cjEsIGkKKyVlbmRpZgorJWVsc2UgOyBBUkNIX1g4Nl82NAorJWRlZmluZSBwdHIxICAgICByNnEKKyVkZWZpbmUgcHRyMiAgICAgcjdxIDsgbXVzdCBiZSBsb2FkZWQKKyVkZWZpbmUgd2luICAgICAgcjhxCislZGVmaW5lIGogICAgICAgIHI5cQorICAgIFNFVFpFUk8gICAgICAgbTkKKyAgICBTRVRaRVJPICAgICAgbTEwCisgICAgbW92YSAgICAgICAgICBtNywgW2J1ZjIgKyBpICsgbW1zaXplXQorICAgIG1vdmEgICAgICAgICAgbTgsIFtidWYyICsgaSArIG1tc2l6ZSArIDE2ICogNF0KKyAgICBsZWEgICAgICAgICAgd2luLCBbd2luZG93cSArIGldCisgICAgbGVhICAgICAgICAgcHRyMSwgW3N5bnRoX2J1ZnEgKyBpXQorJWVuZGlmCisgICAgbW92ICAgICAgICAgcHRyMiwgc3ludGhfYnVmbXAKKyAgICA7IHByZXBhcmUgdGhlIGlubmVyIGxvb3AgY291bnRlcgorICAgIG1vdiAgICAgICAgICAgIGosIE9GRlEKKyVpZiBBUkNIX1g4Nl8zMiB8fCBub3RjcHVmbGFnKGF2eCkKKyAgICBzdWIgICAgICAgICBwdHIyLCBpCislZW5kaWYKKy5sb29wMToKKyAgICBJTk5FUl9MT09QICAwCisgICAgamdlICAgICAgIC5sb29wMQorCisgICAgbW92ICAgICAgICAgICAgaiwgNDQ4ICogNAorICAgIHN1YiAgICAgICAgICAgIGosIE9GRlEKKyAgICBqeiAgICAgICAgICAuZW5kCisgICAgc3ViICAgICAgICAgcHRyMSwgagorICAgIHN1YiAgICAgICAgIHB0cjIsIGoKKyAgICBhZGQgICAgICAgICAgd2luLCBPRkZRIDsgbm93IGF0IGotNjQsIHNvIGRlZmluZSBPRkZTRVQKKyAgICBzdWIgICAgICAgICAgICBqLCA2NCAqIDQKKy5sb29wMjoKKyAgICBJTk5FUl9MT09QICA2NCAqIDQKKyAgICBqZ2UgICAgICAgLmxvb3AyCisKKy5lbmQ6CislaWYgQVJDSF9YODZfMzIKKyAgICBtb3YgICAgICAgICBidWYyLCBzeW50aF9idWYybSA7IG5lZWRlZCBmb3IgbmV4dCBpdGVyYXRpb24gYW55d2F5CisgICAgbW92ICAgICAgICAgb3V0cSwgb3V0bXAgICAgICAgOyBqLCB3aGljaCB3aWxsIGJlIHNldCBhZ2FpbiBkdXJpbmcgaXQKKyVlbmRpZgorICAgIDt+IG91dFtpXSAgICAgID0gYSAqIHNjYWxlOworICAgIDt+IG91dFtpICsgMTZdID0gYiAqIHNjYWxlOworICAgIG11bHBzICAgICAgICAgbTEsIG0xLCBzY2FsZQorICAgIG11bHBzICAgICAgICAgbTIsIG0yLCBzY2FsZQorJWlmIEFSQ0hfWDg2XzY0CisgICAgbXVscHMgICAgICAgICBtNywgbTcsIHNjYWxlCisgICAgbXVscHMgICAgICAgICBtOCwgbTgsIHNjYWxlCislZW5kaWYKKyAgICA7fiBzeW50aF9idWYyW2ldICAgICAgPSBjOworICAgIDt+IHN5bnRoX2J1ZjJbaSArIDE2XSA9IGQ7CisgICAgbW92YSAgIFtidWYyICsgaSArICAwICogNF0sIG0zCisgICAgbW92YSAgIFtidWYyICsgaSArIDE2ICogNF0sIG00CislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZhICAgW2J1ZjIgKyBpICsgIDAgKiA0ICsgbW1zaXplXSwgbTkKKyAgICBtb3ZhICAgW2J1ZjIgKyBpICsgMTYgKiA0ICsgbW1zaXplXSwgbTEwCislZW5kaWYKKyAgICA7fiBvdXRbaV0gICAgICA9IGE7CisgICAgO34gb3V0W2kgKyAxNl0gPSBhOworICAgIG1vdmEgICBbb3V0cSArIGkgKyAgMCAqIDRdLCBtMQorICAgIG1vdmEgICBbb3V0cSArIGkgKyAxNiAqIDRdLCBtMgorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92YSAgIFtvdXRxICsgaSArICAwICogNCArIG1tc2l6ZV0sIG03CisgICAgbW92YSAgIFtvdXRxICsgaSArIDE2ICogNCArIG1tc2l6ZV0sIG04CislZW5kaWYKKyVpZiBBUkNIX1g4Nl8zMiB8fCBub3RjcHVmbGFnKGF2eCkKKyAgICBzdWIgICAgICAgICAgICBpLCAoQVJDSF9YODZfNjQgKyAxKSAqIG1tc2l6ZQorICAgIGpnZSAgICAubWFpbmxvb3AKKyVlbmRpZgorICAgIFJFVAorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9YTU0gc3NlCitTWU5USF9GSUxURVIKKyVlbmRpZgorSU5JVF9YTU0gc3NlMgorU1lOVEhfRklMVEVSCitJTklUX1lNTSBhdngKK1NZTlRIX0ZJTFRFUgorSU5JVF9ZTU0gZm1hMworU1lOVEhfRklMVEVSCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGNhZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kY2Fkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODZjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGNhZHNwX2luaXQuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzdG9waGUgR2lzcXVldCA8Y2hyaXN0b3BoZS5naXNxdWV0QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9kY2Fkc3AuaCIKKwordm9pZCBmZl9kZWNvZGVfaGZfc3NlKGZsb2F0IGRzdFtEQ0FfU1VCQkFORFNdWzhdLCBjb25zdCBpbnQgdnFfbnVtW0RDQV9TVUJCQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90IGhmX3ZxWzEwMjRdWzMyXSwgaW50cHRyX3QgdnFfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGludCBzY2FsZVtEQ0FfU1VCQkFORFNdWzJdLCBpbnRwdHJfdCBzdGFydCwgaW50cHRyX3QgZW5kKTsKK3ZvaWQgZmZfZGVjb2RlX2hmX3NzZTIoZmxvYXQgZHN0W0RDQV9TVUJCQU5EU11bOF0sIGNvbnN0IGludCB2cV9udW1bRENBX1NVQkJBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90IGhmX3ZxWzEwMjRdWzMyXSwgaW50cHRyX3QgdnFfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NhbGVbRENBX1NVQkJBTkRTXVsyXSwgaW50cHRyX3Qgc3RhcnQsIGludHB0cl90IGVuZCk7Cit2b2lkIGZmX2RlY29kZV9oZl9zc2U0KGZsb2F0IGRzdFtEQ0FfU1VCQkFORFNdWzhdLCBjb25zdCBpbnQgdnFfbnVtW0RDQV9TVUJCQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCBoZl92cVsxMDI0XVszMl0sIGludHB0cl90IHZxX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYWxlW0RDQV9TVUJCQU5EU11bMl0sIGludHB0cl90IHN0YXJ0LCBpbnRwdHJfdCBlbmQpOwordm9pZCBmZl9kY2FfbGZlX2ZpcjBfc3NlKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgY29uc3QgZmxvYXQgKmNvZWZzKTsKK3ZvaWQgZmZfZGNhX2xmZV9maXIxX3NzZShmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIGNvbnN0IGZsb2F0ICpjb2Vmcyk7Cit2b2lkIGZmX2RjYV9sZmVfZmlyMF9mbWEzKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgY29uc3QgZmxvYXQgKmNvZWZzKTsKKworYXZfY29sZCB2b2lkIGZmX2RjYWRzcF9pbml0X3g4NihEQ0FEU1BDb250ZXh0ICpzKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoRVhURVJOQUxfU1NFKGNwdV9mbGFncykpIHsKKyNpZiBBUkNIX1g4Nl8zMgorICAgICAgICBzLT5kZWNvZGVfaGYgPSBmZl9kZWNvZGVfaGZfc3NlOworI2VuZGlmCisgICAgICAgIHMtPmxmZV9maXJbMF0gICAgICAgID0gZmZfZGNhX2xmZV9maXIwX3NzZTsKKyAgICAgICAgcy0+bGZlX2ZpclsxXSAgICAgICAgPSBmZl9kY2FfbGZlX2ZpcjFfc3NlOworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+ZGVjb2RlX2hmID0gZmZfZGVjb2RlX2hmX3NzZTI7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5kZWNvZGVfaGYgPSBmZl9kZWNvZGVfaGZfc3NlNDsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfRk1BMyhjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPmxmZV9maXJbMF0gICAgICAgID0gZmZfZGNhX2xmZV9maXIwX2ZtYTM7CisgICAgfQorfQorCisKKyNkZWZpbmUgU1lOVEhfRklMVEVSX0ZVTkMob3B0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3N5bnRoX2ZpbHRlcl9pbm5lcl8jI29wdChmbG9hdCAqc3ludGhfYnVmX3B0ciwgZmxvYXQgc3ludGhfYnVmMlszMl0sICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgd2luZG93WzUxMl0sICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG91dFszMl0sIGludHB0cl90IG9mZnNldCwgZmxvYXQgc2NhbGUpOyBcCitzdGF0aWMgdm9pZCBzeW50aF9maWx0ZXJfIyNvcHQoRkZUQ29udGV4dCAqaW1kY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpzeW50aF9idWZfcHRyLCBpbnQgKnN5bnRoX2J1Zl9vZmZzZXQsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzeW50aF9idWYyWzMyXSwgY29uc3QgZmxvYXQgd2luZG93WzUxMl0sICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3V0WzMyXSwgY29uc3QgZmxvYXQgaW5bMzJdLCBmbG9hdCBzY2FsZSkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmbG9hdCAqc3ludGhfYnVmPSBzeW50aF9idWZfcHRyICsgKnN5bnRoX2J1Zl9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGltZGN0LT5pbWRjdF9oYWxmKGltZGN0LCBzeW50aF9idWYsIGluKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmZfc3ludGhfZmlsdGVyX2lubmVyXyMjb3B0KHN5bnRoX2J1Ziwgc3ludGhfYnVmMiwgd2luZG93LCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQsICpzeW50aF9idWZfb2Zmc2V0LCBzY2FsZSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKnN5bnRoX2J1Zl9vZmZzZXQgPSAoKnN5bnRoX2J1Zl9vZmZzZXQgLSAzMikgJiA1MTE7ICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworI2lmIEhBVkVfWUFTTQorI2lmIEFSQ0hfWDg2XzMyCitTWU5USF9GSUxURVJfRlVOQyhzc2UpCisjZW5kaWYKK1NZTlRIX0ZJTFRFUl9GVU5DKHNzZTIpCitTWU5USF9GSUxURVJfRlVOQyhhdngpCitTWU5USF9GSUxURVJfRlVOQyhmbWEzKQorI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworCithdl9jb2xkIHZvaWQgZmZfc3ludGhfZmlsdGVyX2luaXRfeDg2KFN5bnRoRmlsdGVyQ29udGV4dCAqcykKK3sKKyNpZiBIQVZFX1lBU00KKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisjaWYgQVJDSF9YODZfMzIKKyAgICBpZiAoRVhURVJOQUxfU1NFKGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+c3ludGhfZmlsdGVyX2Zsb2F0ID0gc3ludGhfZmlsdGVyX3NzZTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPnN5bnRoX2ZpbHRlcl9mbG9hdCA9IHN5bnRoX2ZpbHRlcl9zc2UyOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+c3ludGhfZmlsdGVyX2Zsb2F0ID0gc3ludGhfZmlsdGVyX2F2eDsKKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX0ZNQTMoY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5zeW50aF9maWx0ZXJfZmxvYXQgPSBzeW50aF9maWx0ZXJfZm1hMzsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9ZQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGN0LXRlc3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kY3QtdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MTRjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGN0LXRlc3QuYwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJmZGN0LmgiCisjaW5jbHVkZSAieHZpZGlkY3QuaCIKKyNpbmNsdWRlICJzaW1wbGVfaWRjdC5oIgorCisjaWYgQVJDSF9YODZfNjQgJiYgSEFWRV9NTVggJiYgSEFWRV9ZQVNNCit2b2lkIGZmX3Byb3Jlc19pZGN0X3B1dF8xMF9zc2UyKHVpbnQxNl90ICpkc3QsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludDE2X3QgKnFtYXQpOworCitzdGF0aWMgdm9pZCBmZl9wcm9yZXNfaWRjdF9wdXRfMTBfc3NlMl93cmFwKGludDE2X3QgKmRzdCl7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzdGF0aWMgaW50MTZfdCwgcW1hdClbNjRdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGludDE2X3QsIHRtcClbNjRdOworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTw2NDsgaSsrKXsKKyAgICAgICAgcW1hdFtpXT00OworICAgICAgICB0bXBbaV09IGRzdFtpXTsKKyAgICB9CisgICAgZmZfcHJvcmVzX2lkY3RfcHV0XzEwX3NzZTIoZHN0LCAxNiwgdG1wLCBxbWF0KTsKKworICAgIGZvcihpPTA7IGk8NjQ7IGkrKykgeworICAgICAgICAgZHN0W2ldIC09IDUxMjsKKyAgICB9Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGZkY3RfdGFiX2FyY2hbXSA9IHsKKyNpZiBIQVZFX01NWF9JTkxJTkUKKyAgICB7ICJNTVgiLCAgICBmZl9mZGN0X21teCwgICAgRkZfSURDVF9QRVJNX05PTkUsIEFWX0NQVV9GTEFHX01NWCB9LAorI2VuZGlmCisjaWYgSEFWRV9NTVhFWFRfSU5MSU5FCisgICAgeyAiTU1YRVhUIiwgZmZfZmRjdF9tbXhleHQsIEZGX0lEQ1RfUEVSTV9OT05FLCBBVl9DUFVfRkxBR19NTVhFWFQgfSwKKyNlbmRpZgorI2lmIEhBVkVfU1NFMl9JTkxJTkUKKyAgICB7ICJTU0UyIiwgICBmZl9mZGN0X3NzZTIsICAgRkZfSURDVF9QRVJNX05PTkUsIEFWX0NQVV9GTEFHX1NTRTIgfSwKKyNlbmRpZgorICAgIHsgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsZ28gaWRjdF90YWJfYXJjaFtdID0geworI2lmIEhBVkVfTU1YX0lOTElORQorICAgIHsgIlNJTVBMRS1NTVgiLCAgZmZfc2ltcGxlX2lkY3RfbW14LCAgRkZfSURDVF9QRVJNX1NJTVBMRSwgQVZfQ1BVX0ZMQUdfTU1YIH0sCisjZW5kaWYKKyNpZiBDT05GSUdfTVBFRzRfREVDT0RFUgorI2lmIEhBVkVfTU1YX0lOTElORQorICAgIHsgIlhWSUQtTU1YIiwgICAgZmZfeHZpZF9pZGN0X21teCwgICAgRkZfSURDVF9QRVJNX05PTkUsICAgQVZfQ1BVX0ZMQUdfTU1YLCAgICAxIH0sCisjZW5kaWYKKyNpZiBIQVZFX01NWEVYVF9JTkxJTkUKKyAgICB7ICJYVklELU1NWEVYVCIsIGZmX3h2aWRfaWRjdF9tbXhleHQsIEZGX0lEQ1RfUEVSTV9OT05FLCAgIEFWX0NQVV9GTEFHX01NWEVYVCwgMSB9LAorI2VuZGlmCisjaWYgSEFWRV9TU0UyX0lOTElORQorICAgIHsgIlhWSUQtU1NFMiIsICAgZmZfeHZpZF9pZGN0X3NzZTIsICAgRkZfSURDVF9QRVJNX1NTRTIsICAgQVZfQ1BVX0ZMQUdfU1NFMiwgICAxIH0sCisjaWYgQVJDSF9YODZfNjQgJiYgSEFWRV9ZQVNNCisgICAgeyAiUFItU1NFMiIsICAgICBmZl9wcm9yZXNfaWRjdF9wdXRfMTBfc3NlMl93cmFwLCBGRl9JRENUX1BFUk1fVFJBTlNQT1NFLCBBVl9DUFVfRkxBR19TU0UyLCAxIH0sCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19NUEVHNF9ERUNPREVSICovCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBzaG9ydCBpZGN0X3NpbXBsZV9tbXhfcGVybVs2NF0gPSB7CisgICAgMHgwMCwgMHgwOCwgMHgwNCwgMHgwOSwgMHgwMSwgMHgwQywgMHgwNSwgMHgwRCwKKyAgICAweDEwLCAweDE4LCAweDE0LCAweDE5LCAweDExLCAweDFDLCAweDE1LCAweDFELAorICAgIDB4MjAsIDB4MjgsIDB4MjQsIDB4MjksIDB4MjEsIDB4MkMsIDB4MjUsIDB4MkQsCisgICAgMHgxMiwgMHgxQSwgMHgxNiwgMHgxQiwgMHgxMywgMHgxRSwgMHgxNywgMHgxRiwKKyAgICAweDAyLCAweDBBLCAweDA2LCAweDBCLCAweDAzLCAweDBFLCAweDA3LCAweDBGLAorICAgIDB4MzAsIDB4MzgsIDB4MzQsIDB4MzksIDB4MzEsIDB4M0MsIDB4MzUsIDB4M0QsCisgICAgMHgyMiwgMHgyQSwgMHgyNiwgMHgyQiwgMHgyMywgMHgyRSwgMHgyNywgMHgyRiwKKyAgICAweDMyLCAweDNBLCAweDM2LCAweDNCLCAweDMzLCAweDNFLCAweDM3LCAweDNGLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaWRjdF9zc2UyX3Jvd19wZXJtWzhdID0geyAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IH07CisKK3N0YXRpYyBpbnQgcGVybXV0ZV94ODYoaW50MTZfdCBkc3RbNjRdLCBjb25zdCBpbnQxNl90IHNyY1s2NF0sCisgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaWRjdF9wZXJtdXRhdGlvbl90eXBlIHBlcm1fdHlwZSkKK3sKKyAgICBpbnQgaTsKKworICAgIHN3aXRjaCAocGVybV90eXBlKSB7CisgICAgY2FzZSBGRl9JRENUX1BFUk1fU0lNUExFOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGRzdFtpZGN0X3NpbXBsZV9tbXhfcGVybVtpXV0gPSBzcmNbaV07CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgRkZfSURDVF9QRVJNX1NTRTI6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgZHN0WyhpICYgMHgzOCkgfCBpZGN0X3NzZTJfcm93X3Blcm1baSAmIDddXSA9IHNyY1tpXTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGN0MzIuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RjdDMyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzBmNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RjdDMyLmFzbQpAQCAtMCwwICsxLDQ5MiBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogMzIgcG9pbnQgU1NFLW9wdGltaXplZCBEQ1QgdHJhbnNmb3JtCis7KiBDb3B5cmlnaHQgKGMpIDIwMTAgVml0b3IgU2Vzc2FrCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEgMzIKKworYWxpZ24gMzIKK3BzX2Nvc192ZWM6IGRkICAgMC41MDA2MDMsICAwLjUwNTQ3MSwgIDAuNTE1NDQ3LCAgMC41MzEwNDMKKyAgICAgICAgICAgIGRkICAgMC41NTMxMDQsICAwLjU4MjkzNSwgIDAuNjIyNTA0LCAgMC42NzQ4MDgKKyAgICAgICAgICAgIGRkIC0xMC4xOTAwMDgsIC0zLjQwNzYwOSwgLTIuMDU3NzgxLCAtMS40ODQxNjUKKyAgICAgICAgICAgIGRkICAtMS4xNjk0NDAsIC0wLjk3MjU2OCwgLTAuODM5MzUwLCAtMC43NDQ1MzYKKyAgICAgICAgICAgIGRkICAgMC41MDI0MTksICAwLjUyMjQ5OSwgIDAuNTY2OTQ0LCAgMC42NDY4MjIKKyAgICAgICAgICAgIGRkICAgMC43ODgxNTUsICAxLjA2MDY3OCwgIDEuNzIyNDQ3LCAgNS4xMDExNDkKKyAgICAgICAgICAgIGRkICAgMC41MDk3OTYsICAwLjYwMTM0NSwgIDAuODk5OTc2LCAgMi41NjI5MTYKKyAgICAgICAgICAgIGRkICAgMC41MDk3OTYsICAwLjYwMTM0NSwgIDAuODk5OTc2LCAgMi41NjI5MTYKKyAgICAgICAgICAgIGRkICAgMS4wMDAwMDAsICAxLjAwMDAwMCwgIDEuMzA2NTYzLCAgMC41NDExOTYKKyAgICAgICAgICAgIGRkICAgMS4wMDAwMDAsICAxLjAwMDAwMCwgIDEuMzA2NTYzLCAgMC41NDExOTYKKyAgICAgICAgICAgIGRkICAgMS4wMDAwMDAsICAwLjcwNzEwNywgIDEuMDAwMDAwLCAtMC43MDcxMDcKKyAgICAgICAgICAgIGRkICAgMS4wMDAwMDAsICAwLjcwNzEwNywgIDEuMDAwMDAwLCAtMC43MDcxMDcKKyAgICAgICAgICAgIGRkICAgMC43MDcxMDcsICAwLjcwNzEwNywgIDAuNzA3MTA3LCAgMC43MDcxMDcKKworYWxpZ24gMzIKK3BzX3AxcDFtMW0xOiBkZCAwLCAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAwLCAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwCisKKyVtYWNybyBCVVRURVJGTFkgNAorICAgIHN1YnBzICAlNCwgJTEsICUyCisgICAgYWRkcHMgICUyLCAlMiwgJTEKKyAgICBtdWxwcyAgJTEsICU0LCAlMworJWVuZG1hY3JvCisKKyVtYWNybyBCVVRURVJGTFkwIDUKKyVpZiBjcHVmbGFnKHNzZTIpICYmIG5vdGNwdWZsYWcoYXZ4KQorICAgIHBzaHVmZCAlNCwgJTEsICU1CisgICAgeG9ycHMgICUxLCAlMgorICAgIGFkZHBzICAlMSwgJTQKKyAgICBtdWxwcyAgJTEsICUzCislZWxzZQorICAgIHNodWZwcyAlNCwgJTEsICUxLCAlNQorICAgIHhvcnBzICAlMSwgJTEsICUyCisgICAgYWRkcHMgICU0LCAlNCwgJTEKKyAgICBtdWxwcyAgJTEsICU0LCAlMworJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEJVVFRFUkZMWTIgNAorICAgIEJVVFRFUkZMWTAgJTEsICUyLCAlMywgJTQsIDB4MWIKKyVlbmRtYWNybworCislbWFjcm8gQlVUVEVSRkxZMyA0CisgICAgQlVUVEVSRkxZMCAlMSwgJTIsICUzLCAlNCwgMHhiMQorJWVuZG1hY3JvCisKKyVtYWNybyBCVVRURVJGTFkzViA1CisgICAgbW92YXBzIG0lNSwgbSUxCisgICAgYWRkcHMgIG0lMSwgbSUyCisgICAgc3VicHMgIG0lNSwgbSUyCisgICAgU1dBUCAlMiwgJTUKKyAgICBtdWxwcyAgbSUyLCBbcHNfY29zX3ZlYysxOTJdCisgICAgbW92YXBzIG0lNSwgbSUzCisgICAgYWRkcHMgIG0lMywgbSU0CisgICAgc3VicHMgIG0lNCwgbSU1CisgICAgbXVscHMgIG0lNCwgW3BzX2Nvc192ZWMrMTkyXQorJWVuZG1hY3JvCisKKyVtYWNybyBQQVNTNl9BTkRfUEVSTVVURSAwCisgICAgbW92ICAgICAgICAgdG1wZCwgW291dHErNF0KKyAgICBtb3ZzcyAgICAgICAgIG03LCBbb3V0cSs3Ml0KKyAgICBhZGRzcyAgICAgICAgIG03LCBbb3V0cSs3Nl0KKyAgICBtb3ZzcyAgICAgICAgIG0zLCBbb3V0cSs1Nl0KKyAgICBhZGRzcyAgICAgICAgIG0zLCBbb3V0cSs2MF0KKyAgICBhZGRzcyAgICAgICAgIG00LCBtMworICAgIG1vdnNzICAgICAgICAgbTIsIFtvdXRxKzUyXQorICAgIGFkZHNzICAgICAgICAgbTIsIG0zCisgICAgbW92c3MgICAgICAgICBtMywgW291dHErMTA0XQorICAgIGFkZHNzICAgICAgICAgbTMsIFtvdXRxKzEwOF0KKyAgICBhZGRzcyAgICAgICAgIG0xLCBtMworICAgIGFkZHNzICAgICAgICAgbTUsIG00CisgICAgbW92c3MgW291dHErIDE2XSwgbTEKKyAgICBtb3ZzcyAgICAgICAgIG0xLCBbb3V0cSsxMDBdCisgICAgYWRkc3MgICAgICAgICBtMSwgbTMKKyAgICBtb3ZzcyAgICAgICAgIG0zLCBbb3V0cSs0MF0KKyAgICBtb3ZzcyBbb3V0cSsgNDhdLCBtMQorICAgIGFkZHNzICAgICAgICAgbTMsIFtvdXRxKzQ0XQorICAgIG1vdnNzICAgICAgICAgbTEsIFtvdXRxKzEwMF0KKyAgICBhZGRzcyAgICAgICAgIG00LCBtMworICAgIGFkZHNzICAgICAgICAgbTMsIG0yCisgICAgYWRkc3MgICAgICAgICBtMSwgW291dHErMTA4XQorICAgIG1vdnNzIFtvdXRxKyA0MF0sIG0zCisgICAgYWRkc3MgICAgICAgICBtMiwgW291dHErMzZdCisgICAgbW92c3MgICAgICAgICBtMywgW291dHErOF0KKyAgICBtb3ZzcyBbb3V0cSsgNTZdLCBtMgorICAgIGFkZHNzICAgICAgICAgbTMsIFtvdXRxKzEyXQorICAgIG1vdnNzIFtvdXRxKyAzMl0sIG0zCisgICAgbW92c3MgICAgICAgICBtMywgW291dHErODBdCisgICAgbW92c3MgW291dHErICA4XSwgbTUKKyAgICBtb3ZzcyBbb3V0cSsgODBdLCBtMQorICAgIG1vdnNzICAgICAgICAgbTIsIFtvdXRxKzUyXQorICAgIG1vdnNzICAgICAgICAgbTUsIFtvdXRxKzEyMF0KKyAgICBhZGRzcyAgICAgICAgIG01LCBbb3V0cSsxMjRdCisgICAgbW92c3MgICAgICAgICBtMSwgW291dHErNjRdCisgICAgYWRkc3MgICAgICAgICBtMiwgW291dHErNjBdCisgICAgYWRkc3MgICAgICAgICBtMCwgbTUKKyAgICBhZGRzcyAgICAgICAgIG01LCBbb3V0cSsxMTZdCisgICAgbW92ICAgIFtvdXRxKzY0XSwgdG1wZAorICAgIGFkZHNzICAgICAgICAgbTYsIG0wCisgICAgYWRkc3MgICAgICAgICBtMSwgbTYKKyAgICBtb3YgICAgICAgICB0bXBkLCBbb3V0cSsxMl0KKyAgICBtb3YgICBbb3V0cSsgOTZdLCB0bXBkCisgICAgbW92c3MgW291dHErICA0XSwgbTEKKyAgICBtb3ZzcyAgICAgICAgIG0xLCBbb3V0cSsyNF0KKyAgICBtb3ZzcyBbb3V0cSsgMjRdLCBtNAorICAgIG1vdnNzICAgICAgICAgbTQsIFtvdXRxKzg4XQorICAgIGFkZHNzICAgICAgICAgbTQsIFtvdXRxKzkyXQorICAgIGFkZHNzICAgICAgICAgbTMsIG00CisgICAgYWRkc3MgICAgICAgICBtNCwgW291dHErODRdCisgICAgbW92ICAgICAgICAgdG1wZCwgW291dHErMTA4XQorICAgIGFkZHNzICAgICAgICAgbTEsIFtvdXRxKzI4XQorICAgIGFkZHNzICAgICAgICAgbTAsIG0xCisgICAgYWRkc3MgICAgICAgICBtMSwgbTUKKyAgICBhZGRzcyAgICAgICAgIG02LCBtMworICAgIGFkZHNzICAgICAgICAgbTMsIG0wCisgICAgYWRkc3MgICAgICAgICBtMCwgbTcKKyAgICBhZGRzcyAgICAgICAgIG01LCBbb3V0cSsyMF0KKyAgICBhZGRzcyAgICAgICAgIG03LCBtMQorICAgIG1vdnNzIFtvdXRxKyAxMl0sIG02CisgICAgbW92ICAgW291dHErMTEyXSwgdG1wZAorICAgIG1vdnNzICAgICAgICAgbTYsIFtvdXRxKzI4XQorICAgIG1vdnNzIFtvdXRxKyAyOF0sIG0wCisgICAgbW92c3MgICAgICAgICBtMCwgW291dHErMzZdCisgICAgbW92c3MgW291dHErIDM2XSwgbTcKKyAgICBhZGRzcyAgICAgICAgIG0xLCBtNAorICAgIG1vdnNzICAgICAgICAgbTcsIFtvdXRxKzExNl0KKyAgICBhZGRzcyAgICAgICAgIG0wLCBtMgorICAgIGFkZHNzICAgICAgICAgbTcsIFtvdXRxKzEyNF0KKyAgICBtb3ZzcyBbb3V0cSsgNzJdLCBtMAorICAgIG1vdnNzICAgICAgICAgbTAsIFtvdXRxKzQ0XQorICAgIGFkZHNzICAgICAgICAgbTIsIG0wCisgICAgbW92c3MgW291dHErIDQ0XSwgbTEKKyAgICBtb3ZzcyBbb3V0cSsgODhdLCBtMgorICAgIGFkZHNzICAgICAgICAgbTAsIFtvdXRxKzYwXQorICAgIG1vdiAgICAgICAgIHRtcGQsIFtvdXRxKzYwXQorICAgIG1vdiAgIFtvdXRxKzEyMF0sIHRtcGQKKyAgICBtb3ZzcyBbb3V0cSsxMDRdLCBtMAorICAgIGFkZHNzICAgICAgICAgbTQsIG01CisgICAgYWRkc3MgICAgICAgICBtNSwgW291dHErNjhdCisgICAgbW92c3MgIFtvdXRxKzUyXSwgbTQKKyAgICBtb3ZzcyAgW291dHErNjBdLCBtNQorICAgIG1vdnNzICAgICAgICAgbTQsIFtvdXRxKzY4XQorICAgIG1vdnNzICAgICAgICAgbTUsIFtvdXRxKzIwXQorICAgIG1vdnNzIFtvdXRxKyAyMF0sIG0zCisgICAgYWRkc3MgICAgICAgICBtNSwgbTcKKyAgICBhZGRzcyAgICAgICAgIG03LCBtNgorICAgIGFkZHNzICAgICAgICAgbTQsIG01CisgICAgbW92c3MgICAgICAgICBtMiwgW291dHErODRdCisgICAgYWRkc3MgICAgICAgICBtMiwgW291dHErOTJdCisgICAgYWRkc3MgICAgICAgICBtNSwgbTIKKyAgICBtb3ZzcyBbb3V0cSsgNjhdLCBtNAorICAgIGFkZHNzICAgICAgICAgbTIsIG03CisgICAgbW92c3MgICAgICAgICBtNCwgW291dHErNzZdCisgICAgbW92c3MgW291dHErIDg0XSwgbTIKKyAgICBtb3ZzcyBbb3V0cSsgNzZdLCBtNQorICAgIGFkZHNzICAgICAgICAgbTcsIG00CisgICAgYWRkc3MgICAgICAgICBtNiwgW291dHErMTI0XQorICAgIGFkZHNzICAgICAgICAgbTQsIG02CisgICAgYWRkc3MgICAgICAgICBtNiwgW291dHErOTJdCisgICAgbW92c3MgW291dHErMTAwXSwgbTQKKyAgICBtb3ZzcyBbb3V0cSsxMDhdLCBtNgorICAgIG1vdnNzICAgICAgICAgbTYsIFtvdXRxKzkyXQorICAgIG1vdnNzICBbb3V0cSs5Ml0sIG03CisgICAgYWRkc3MgICAgICAgICBtNiwgW291dHErMTI0XQorICAgIG1vdnNzIFtvdXRxKzExNl0sIG02CislZW5kbWFjcm8KKworSU5JVF9ZTU0gYXZ4CitTRUNUSU9OX1RFWFQKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorOyB2b2lkIGZmX2RjdDMyX2Zsb2F0X2F2eChGRlRTYW1wbGUgKm91dCwgY29uc3QgRkZUU2FtcGxlICppbikKK2NnbG9iYWwgZGN0MzJfZmxvYXQsIDIsMyw4LCBvdXQsIGluLCB0bXAKKyAgICA7IHBhc3MgMQorICAgIHZtb3ZhcHMgICAgIG00LCBbaW5xKzBdCisgICAgdmluc2VydGYxMjggbTUsIG01LCBbaW5xKzk2XSwgMQorICAgIHZpbnNlcnRmMTI4IG01LCBtNSwgW2lucSsxMTJdLCAwCisgICAgdnNodWZwcyAgICAgbTUsIG01LCBtNSwgMHgxYgorICAgIEJVVFRFUkZMWSAgIG00LCBtNSwgW3BzX2Nvc192ZWNdLCBtNgorCisgICAgdm1vdmFwcyAgICAgbTIsIFtpbnErNjRdCisgICAgdmluc2VydGYxMjggbTYsIG02LCBbaW5xKzMyXSwgMQorICAgIHZpbnNlcnRmMTI4IG02LCBtNiwgW2lucSs0OF0sIDAKKyAgICB2c2h1ZnBzICAgICBtNiwgbTYsIG02LCAweDFiCisgICAgQlVUVEVSRkxZICAgbTIsIG02LCBbcHNfY29zX3ZlYyszMl0sIG0wCisKKyAgICA7IHBhc3MgMgorCisgICAgQlVUVEVSRkxZICBtNSwgbTYsIFtwc19jb3NfdmVjKzY0XSwgbTAKKyAgICBCVVRURVJGTFkgIG00LCBtMiwgW3BzX2Nvc192ZWMrNjRdLCBtNworCisKKyAgICA7IHBhc3MgMworICAgIHZwZXJtMmYxMjggIG0zLCBtNiwgbTQsIDB4MzEKKyAgICB2cGVybTJmMTI4ICBtMSwgbTYsIG00LCAweDIwCisgICAgdnNodWZwcyAgICAgbTMsIG0zLCBtMywgMHgxYgorCisgICAgQlVUVEVSRkxZICAgbTEsIG0zLCBbcHNfY29zX3ZlYys5Nl0sIG02CisKKworICAgIHZwZXJtMmYxMjggIG00LCBtNSwgbTIsIDB4MjAKKyAgICB2cGVybTJmMTI4ICBtNSwgbTUsIG0yLCAweDMxCisgICAgdnNodWZwcyAgICAgbTUsIG01LCBtNSwgMHgxYgorCisgICAgQlVUVEVSRkxZICAgbTQsIG01LCBbcHNfY29zX3ZlYys5Nl0sIG02CisKKyAgICA7IHBhc3MgNAorICAgIHZtb3ZhcHMgbTYsIFtwc19wMXAxbTFtMSswXQorICAgIHZtb3ZhcHMgbTIsIFtwc19jb3NfdmVjKzEyOF0KKworICAgIEJVVFRFUkZMWTIgIG01LCBtNiwgbTIsIG03CisgICAgQlVUVEVSRkxZMiAgbTQsIG02LCBtMiwgbTcKKyAgICBCVVRURVJGTFkyICBtMSwgbTYsIG0yLCBtNworICAgIEJVVFRFUkZMWTIgIG0zLCBtNiwgbTIsIG03CisKKworICAgIDsgcGFzcyA1CisgICAgdnNodWZwcyBtNiwgbTYsIG02LCAweGNjCisgICAgdm1vdmFwcyBtMiwgW3BzX2Nvc192ZWMrMTYwXQorCisgICAgQlVUVEVSRkxZMyAgbTUsIG02LCBtMiwgbTcKKyAgICBCVVRURVJGTFkzICBtNCwgbTYsIG0yLCBtNworICAgIEJVVFRFUkZMWTMgIG0xLCBtNiwgbTIsIG03CisgICAgQlVUVEVSRkxZMyAgbTMsIG02LCBtMiwgbTcKKworICAgIHZwZXJtMmYxMjggIG02LCBtMywgbTMsIDB4MzEKKyAgICB2bW92YXBzIFtvdXRxXSwgbTMKKworICAgIHZleHRyYWN0ZjEyOCAgW291dHErNjRdLCBtNSwgMQorICAgIHZleHRyYWN0ZjEyOCAgW291dHErMzJdLCBtNSwgMAorCisgICAgdmV4dHJhY3RmMTI4ICBbb3V0cSs4MF0sIG00LCAxCisgICAgdmV4dHJhY3RmMTI4ICBbb3V0cSs0OF0sIG00LCAwCisKKyAgICB2cGVybTJmMTI4ICBtMCwgbTEsIG0xLCAweDMxCisgICAgdm1vdmFwcyBbb3V0cSs5Nl0sIG0xCisKKyAgICB2emVyb3VwcGVyCisKKyAgICA7ICAgIHBhc3MgNiwgbm8gU0lNRC4uLgorSU5JVF9YTU0KKyAgICBQQVNTNl9BTkRfUEVSTVVURQorICAgIFJFVAorJWVuZGlmCisKKyVpZiBBUkNIX1g4Nl82NAorJWRlZmluZSBTUElMTCBTV0FQCislZGVmaW5lIFVOU1BJTEwgU1dBUAorCislbWFjcm8gUEFTUzUgMAorICAgIG5vcCA7IEZJWE1FIGNvZGUgYWxpZ25tZW50CisgICAgU1dBUCA1LCA4CisgICAgU1dBUCA0LCAxMgorICAgIFNXQVAgNiwgMTQKKyAgICBTV0FQIDcsIDEzCisgICAgU1dBUCAwLCAxNQorICAgIFBFUk1VVEUgOSwxMCwgMTAsMTIsIDExLDE0LCAxMiw5LCAxMywxMSwgMTQsMTMKKyAgICBUUkFOU1BPU0U0eDRQUyA4LCA5LCAxMCwgMTEsIDAKKyAgICBCVVRURVJGTFkzViAgICA4LCA5LCAxMCwgMTEsIDAKKyAgICBhZGRwcyAgIG0xMCwgbTExCisgICAgVFJBTlNQT1NFNHg0UFMgMTIsIDEzLCAxNCwgMTUsIDAKKyAgICBCVVRURVJGTFkzViAgICAxMiwgMTMsIDE0LCAxNSwgMAorICAgIGFkZHBzICAgbTE0LCBtMTUKKyAgICBhZGRwcyAgIG0xMiwgbTE0CisgICAgYWRkcHMgICBtMTQsIG0xMworICAgIGFkZHBzICAgbTEzLCBtMTUKKyVlbmRtYWNybworCislbWFjcm8gUEFTUzYgMAorICAgIFNXQVAgOSwgMTIKKyAgICBTV0FQIDExLCAxNAorICAgIG1vdnNzIFtvdXRxKzB4MDBdLCBtOAorICAgIHBzaHVmbHcgbTAsIG04LCAweGUKKyAgICBtb3ZzcyBbb3V0cSsweDEwXSwgbTkKKyAgICBwc2h1Zmx3IG0xLCBtOSwgMHhlCisgICAgbW92c3MgW291dHErMHgyMF0sIG0xMAorICAgIHBzaHVmbHcgbTIsIG0xMCwgMHhlCisgICAgbW92c3MgW291dHErMHgzMF0sIG0xMQorICAgIHBzaHVmbHcgbTMsIG0xMSwgMHhlCisgICAgbW92c3MgW291dHErMHg0MF0sIG0xMgorICAgIHBzaHVmbHcgbTQsIG0xMiwgMHhlCisgICAgbW92c3MgW291dHErMHg1MF0sIG0xMworICAgIHBzaHVmbHcgbTUsIG0xMywgMHhlCisgICAgbW92c3MgW291dHErMHg2MF0sIG0xNAorICAgIHBzaHVmbHcgbTYsIG0xNCwgMHhlCisgICAgbW92YXBzIFtvdXRxKzB4NzBdLCBtMTUKKyAgICBwc2h1Zmx3IG03LCBtMTUsIDB4ZQorICAgIGFkZHNzICAgbTAsIG0xCisgICAgYWRkc3MgICBtMSwgbTIKKyAgICBtb3ZzcyBbb3V0cSsweDA4XSwgbTAKKyAgICBhZGRzcyAgIG0yLCBtMworICAgIG1vdnNzIFtvdXRxKzB4MThdLCBtMQorICAgIGFkZHNzICAgbTMsIG00CisgICAgbW92c3MgW291dHErMHgyOF0sIG0yCisgICAgYWRkc3MgICBtNCwgbTUKKyAgICBtb3ZzcyBbb3V0cSsweDM4XSwgbTMKKyAgICBhZGRzcyAgIG01LCBtNgorICAgIG1vdnNzIFtvdXRxKzB4NDhdLCBtNAorICAgIGFkZHNzICAgbTYsIG03CisgICAgbW92c3MgW291dHErMHg1OF0sIG01CisgICAgbW92c3MgW291dHErMHg2OF0sIG02CisgICAgbW92c3MgW291dHErMHg3OF0sIG03CisKKyAgICBQRVJNVVRFIDEsOCwgMyw5LCA1LDEwLCA3LDExLCA5LDEyLCAxMSwxMywgMTMsMTQsIDgsMSwgMTAsMywgMTIsNSwgMTQsNworICAgIG1vdmhscHMgbTAsIG0xCisgICAgcHNodWZkICBtMSwgbTEsIDMKKyAgICBTV0FQIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQKKyAgICBTV0FQIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUKKyVyZXAgNworICAgIG1vdmhscHMgbTAsIG0xCisgICAgcHNodWZkICBtMSwgbTEsIDMKKyAgICBhZGRzcyAgIG0xNSwgbTEKKyAgICBTV0FQIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQKKyAgICBTV0FQIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUKKyVlbmRyZXAKKyVhc3NpZ24gaSA0CislcmVwIDE1CisgICAgYWRkc3MgbTAsIG0xCisgICAgbW92c3MgW291dHEraV0sIG0wCisgICAgU1dBUCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1CisgICAgJWFzc2lnbiBpIGkrOAorJWVuZHJlcAorJWVuZG1hY3JvCisKKyVlbHNlIDsgQVJDSF9YODZfMzIKKyVtYWNybyBTUElMTCAyIDsgeG1tIywgbWVtcG9zCisgICAgbW92YXBzIFtvdXRxKyglMi04KSoxNl0sIG0lMQorJWVuZG1hY3JvCislbWFjcm8gVU5TUElMTCAyCisgICAgbW92YXBzIG0lMSwgW291dHErKCUyLTgpKjE2XQorJWVuZG1hY3JvCisKKyVkZWZpbmUgUEFTUzYgUEFTUzZfQU5EX1BFUk1VVEUKKyVtYWNybyBQQVNTNSAwCisgICAgbW92YXBzICAgICAgbTIsIFtwc19jb3NfdmVjKzE2MF0KKyAgICBzaHVmcHMgICAgICBtMywgbTMsIDB4Y2MKKworICAgIEJVVFRFUkZMWTMgIG01LCBtMywgbTIsIG0xCisgICAgU1BJTEwgNSwgOAorCisgICAgVU5TUElMTCAxLCA5CisgICAgQlVUVEVSRkxZMyAgbTEsIG0zLCBtMiwgbTUKKyAgICBTUElMTCAxLCAxNAorCisgICAgQlVUVEVSRkxZMyAgbTQsIG0zLCBtMiwgbTUKKyAgICBTUElMTCA0LCAxMgorCisgICAgQlVUVEVSRkxZMyAgbTcsIG0zLCBtMiwgbTUKKyAgICBTUElMTCA3LCAxMworCisgICAgVU5TUElMTCA1LCAxMAorICAgIEJVVFRFUkZMWTMgIG01LCBtMywgbTIsIG03CisgICAgU1BJTEwgNSwgMTAKKworICAgIFVOU1BJTEwgNCwgMTEKKyAgICBCVVRURVJGTFkzICBtNCwgbTMsIG0yLCBtNworICAgIFNQSUxMIDQsIDExCisKKyAgICBCVVRURVJGTFkzICBtNiwgbTMsIG0yLCBtNworICAgIFNQSUxMIDYsIDkKKworICAgIEJVVFRFUkZMWTMgIG0wLCBtMywgbTIsIG03CisgICAgU1BJTEwgMCwgMTUKKyVlbmRtYWNybworJWVuZGlmCisKKworOyB2b2lkIGZmX2RjdDMyX2Zsb2F0X3NzZShGRlRTYW1wbGUgKm91dCwgY29uc3QgRkZUU2FtcGxlICppbikKKyVtYWNybyBEQ1QzMl9GVU5DIDAKK2NnbG9iYWwgZGN0MzJfZmxvYXQsIDIsIDMsIDE2LCBvdXQsIGluLCB0bXAKKyAgICA7IHBhc3MgMQorCisgICAgbW92YXBzICAgICAgbTAsIFtpbnErMF0KKyAgICBMT0FEX0lOViAgICBtMSwgW2lucSsxMTJdCisgICAgQlVUVEVSRkxZICAgbTAsIG0xLCBbcHNfY29zX3ZlY10sIG0zCisKKyAgICBtb3ZhcHMgICAgICBtNywgW2lucSs2NF0KKyAgICBMT0FEX0lOViAgICBtNCwgW2lucSs0OF0KKyAgICBCVVRURVJGTFkgICBtNywgbTQsIFtwc19jb3NfdmVjKzMyXSwgbTMKKworICAgIDsgcGFzcyAyCisgICAgbW92YXBzICAgICAgbTIsIFtwc19jb3NfdmVjKzY0XQorICAgIEJVVFRFUkZMWSAgIG0xLCBtNCwgbTIsIG0zCisgICAgU1BJTEwgMSwgMTEKKyAgICBTUElMTCA0LCA4CisKKyAgICA7IHBhc3MgMQorICAgIG1vdmFwcyAgICAgIG0xLCBbaW5xKzE2XQorICAgIExPQURfSU5WICAgIG02LCBbaW5xKzk2XQorICAgIEJVVFRFUkZMWSAgIG0xLCBtNiwgW3BzX2Nvc192ZWMrMTZdLCBtMworCisgICAgbW92YXBzICAgICAgbTQsIFtpbnErODBdCisgICAgTE9BRF9JTlYgICAgbTUsIFtpbnErMzJdCisgICAgQlVUVEVSRkxZICAgbTQsIG01LCBbcHNfY29zX3ZlYys0OF0sIG0zCisKKyAgICA7IHBhc3MgMgorICAgIEJVVFRFUkZMWSAgIG0wLCBtNywgbTIsIG0zCisKKyAgICBtb3ZhcHMgICAgICBtMiwgW3BzX2Nvc192ZWMrODBdCisgICAgQlVUVEVSRkxZICAgbTYsIG01LCBtMiwgbTMKKworICAgIEJVVFRFUkZMWSAgIG0xLCBtNCwgbTIsIG0zCisKKyAgICA7IHBhc3MgMworICAgIG1vdmFwcyAgICAgIG0yLCBbcHNfY29zX3ZlYys5Nl0KKyAgICBzaHVmcHMgICAgICBtMSwgbTEsIDB4MWIKKyAgICBCVVRURVJGTFkgICBtMCwgbTEsIG0yLCBtMworICAgIFNQSUxMIDAsIDE1CisgICAgU1BJTEwgMSwgMTQKKworICAgIFVOU1BJTEwgMCwgOAorICAgIHNodWZwcyAgICAgIG01LCBtNSwgMHgxYgorICAgIEJVVFRFUkZMWSAgIG0wLCBtNSwgbTIsIG0zCisKKyAgICBVTlNQSUxMIDEsIDExCisgICAgc2h1ZnBzICAgICAgbTYsIG02LCAweDFiCisgICAgQlVUVEVSRkxZICAgbTEsIG02LCBtMiwgbTMKKyAgICBTUElMTCAxLCAxMQorCisgICAgc2h1ZnBzICAgICAgbTQsIG00LCAweDFiCisgICAgQlVUVEVSRkxZICAgbTcsIG00LCBtMiwgbTMKKworICAgIDsgcGFzcyA0CisgICAgbW92YXBzICAgICAgbTMsIFtwc19wMXAxbTFtMSswXQorICAgIG1vdmFwcyAgICAgIG0yLCBbcHNfY29zX3ZlYysxMjhdCisKKyAgICBCVVRURVJGTFkyICBtNSwgbTMsIG0yLCBtMQorCisgICAgQlVUVEVSRkxZMiAgbTAsIG0zLCBtMiwgbTEKKyAgICBTUElMTCAwLCA5CisKKyAgICBCVVRURVJGTFkyICBtNiwgbTMsIG0yLCBtMQorICAgIFNQSUxMIDYsIDEwCisKKyAgICBVTlNQSUxMIDAsIDExCisgICAgQlVUVEVSRkxZMiAgbTAsIG0zLCBtMiwgbTEKKyAgICBTUElMTCAwLCAxMQorCisgICAgQlVUVEVSRkxZMiAgbTQsIG0zLCBtMiwgbTEKKworICAgIEJVVFRFUkZMWTIgIG03LCBtMywgbTIsIG0xCisKKyAgICBVTlNQSUxMIDYsIDE0CisgICAgQlVUVEVSRkxZMiAgbTYsIG0zLCBtMiwgbTEKKworICAgIFVOU1BJTEwgMCwgMTUKKyAgICBCVVRURVJGTFkyICBtMCwgbTMsIG0yLCBtMQorCisgICAgUEFTUzUKKyAgICBQQVNTNgorICAgIFJFVAorJWVuZG1hY3JvCisKKyVtYWNybyBMT0FEX0lOViAyCislaWYgY3B1ZmxhZyhzc2UyKQorICAgIHBzaHVmZCAgICAgICUxLCAlMiwgMHgxYgorJWVsaWYgY3B1ZmxhZyhzc2UpCisgICAgbW92YXBzICAgICAgJTEsICUyCisgICAgc2h1ZnBzICAgICAgJTEsICUxLCAweDFiCislZW5kaWYKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfWE1NIHNzZQorRENUMzJfRlVOQworJWVuZGlmCitJTklUX1hNTSBzc2UyCitEQ1QzMl9GVU5DCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGN0X2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kY3RfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzhmMTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGN0X2luaXQuYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZGN0LmgiCisKK3ZvaWQgZmZfZGN0MzJfZmxvYXRfc3NlKEZGVFNhbXBsZSAqb3V0LCBjb25zdCBGRlRTYW1wbGUgKmluKTsKK3ZvaWQgZmZfZGN0MzJfZmxvYXRfc3NlMihGRlRTYW1wbGUgKm91dCwgY29uc3QgRkZUU2FtcGxlICppbik7Cit2b2lkIGZmX2RjdDMyX2Zsb2F0X2F2eChGRlRTYW1wbGUgKm91dCwgY29uc3QgRkZUU2FtcGxlICppbik7CisKK2F2X2NvbGQgdm9pZCBmZl9kY3RfaW5pdF94ODYoRENUQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEFSQ0hfWDg2XzMyICYmIEVYVEVSTkFMX1NTRShjcHVfZmxhZ3MpKQorICAgICAgICBzLT5kY3QzMiA9IGZmX2RjdDMyX2Zsb2F0X3NzZTsKKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKQorICAgICAgICBzLT5kY3QzMiA9IGZmX2RjdDMyX2Zsb2F0X3NzZTI7CisgICAgaWYgKEVYVEVSTkFMX0FWWChjcHVfZmxhZ3MpKQorICAgICAgICBzLT5kY3QzMiA9IGZmX2RjdDMyX2Zsb2F0X2F2eDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kZWludGVybGFjZS5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGVpbnRlcmxhY2UuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTkyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGVpbnRlcmxhY2UuYXNtCkBAIC0wLDAgKzEsODIgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIFNJTUQtb3B0aW1pemVkIGRlaW50ZXJsYWNpbmcgZnVuY3Rpb25zCis7KiBDb3B5cmlnaHQgKGMpIDIwMTAgVml0b3IgU2Vzc2FrCis7KiBDb3B5cmlnaHQgKGMpIDIwMDIgTWljaGFlbCBOaWVkZXJtYXllcgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK2NleHRlcm4gcHdfNAorCitTRUNUSU9OIC50ZXh0CisKKyVtYWNybyBERUlOVEVSTEFDRSAxCislaWZpZG4gJTEsIGlucGxhY2UKKzt2b2lkIGZmX2RlaW50ZXJsYWNlX2xpbmVfaW5wbGFjZV9tbXgoY29uc3QgdWludDhfdCAqbHVtX200LCBjb25zdCB1aW50OF90ICpsdW1fbTMsIGNvbnN0IHVpbnQ4X3QgKmx1bV9tMiwgY29uc3QgdWludDhfdCAqbHVtX20xLCBjb25zdCB1aW50OF90ICpsdW0sICBpbnQgc2l6ZSkKK2NnbG9iYWwgZGVpbnRlcmxhY2VfbGluZV9pbnBsYWNlX21teCwgNiw2LDcsICAgICAgbHVtX200LCBsdW1fbTMsIGx1bV9tMiwgbHVtX20xLCBsdW0sIHNpemUKKyVlbHNlCis7dm9pZCBmZl9kZWludGVybGFjZV9saW5lX21teCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKmx1bV9tNCwgY29uc3QgdWludDhfdCAqbHVtX20zLCBjb25zdCB1aW50OF90ICpsdW1fbTIsIGNvbnN0IHVpbnQ4X3QgKmx1bV9tMSwgY29uc3QgdWludDhfdCAqbHVtLCAgaW50IHNpemUpCitjZ2xvYmFsIGRlaW50ZXJsYWNlX2xpbmVfbW14LCAgICAgICAgIDcsNyw3LCBkc3QsIGx1bV9tNCwgbHVtX20zLCBsdW1fbTIsIGx1bV9tMSwgbHVtLCBzaXplCislZW5kaWYKKyAgICBweG9yICBtbTcsIG1tNworICAgIG1vdnEgIG1tNiwgW3B3XzRdCisubmV4dHJvdzoKKyAgICBtb3ZkICBtbTAsIFtsdW1fbTRxXQorICAgIG1vdmQgIG1tMSwgW2x1bV9tM3FdCisgICAgbW92ZCAgbW0yLCBbbHVtX20ycV0KKyVpZmlkbiAlMSwgaW5wbGFjZQorICAgIG1vdmQgW2x1bV9tNHFdLCBtbTIKKyVlbmRpZgorICAgIG1vdmQgIG1tMywgW2x1bV9tMXFdCisgICAgbW92ZCAgbW00LCBbbHVtcV0KKyAgICBwdW5wY2tsYncgbW0wLCBtbTcKKyAgICBwdW5wY2tsYncgbW0xLCBtbTcKKyAgICBwdW5wY2tsYncgbW0yLCBtbTcKKyAgICBwdW5wY2tsYncgbW0zLCBtbTcKKyAgICBwdW5wY2tsYncgbW00LCBtbTcKKyAgICBwYWRkdyAgICAgbW0xLCBtbTMKKyAgICBwc2xsdyAgICAgbW0yLCAxCisgICAgcGFkZHcgICAgIG1tMCwgbW00CisgICAgcHNsbHcgICAgIG1tMSwgMgorICAgIHBhZGR3ICAgICBtbTIsIG1tNgorICAgIHBhZGR3ICAgICBtbTEsIG1tMgorICAgIHBzdWJ1c3cgICBtbTEsIG1tMAorICAgIHBzcmx3ICAgICBtbTEsIDMKKyAgICBwYWNrdXN3YiAgbW0xLCBtbTcKKyVpZmlkbiAlMSwgaW5wbGFjZQorICAgIG1vdmQgW2x1bV9tMnFdLCBtbTEKKyVlbHNlCisgICAgbW92ZCAgIFtkc3RxXSwgbW0xCisgICAgYWRkICAgICAgIGRzdHEsIDQKKyVlbmRpZgorICAgIGFkZCAgICBsdW1fbTRxLCA0CisgICAgYWRkICAgIGx1bV9tM3EsIDQKKyAgICBhZGQgICAgbHVtX20ycSwgNAorICAgIGFkZCAgICBsdW1fbTFxLCA0CisgICAgYWRkICAgICAgIGx1bXEsIDQKKyAgICBzdWIgICAgICBzaXplZCwgNAorICAgIGpnIC5uZXh0cm93CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0RFSU5URVJMQUNFICIiCisKK0RFSU5URVJMQUNFIGlucGxhY2UKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kaXJhY19kd3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kaXJhY19kd3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzUxZWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RpcmFjX2R3dC5jCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogTU1YIG9wdGltaXplZCBkaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybQorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBEYXZpZCBDb25yYWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJkaXJhY19kd3QuaCIKKworI2RlZmluZSBDT01QT1NFX1ZFUlRJQ0FMKGV4dCwgYWxpZ24pIFwKK3ZvaWQgZmZfdmVydGljYWxfY29tcG9zZTUzaUwwIyNleHQoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwgaW50IHdpZHRoKTsgXAordm9pZCBmZl92ZXJ0aWNhbF9jb21wb3NlX2RpcmFjNTNpSDAjI2V4dChJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgSURXVEVMRU0gKmIyLCBpbnQgd2lkdGgpOyBcCit2b2lkIGZmX3ZlcnRpY2FsX2NvbXBvc2VfZGQxMzdpTDAjI2V4dChJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgSURXVEVMRU0gKmIyLCBJRFdURUxFTSAqYjMsIElEV1RFTEVNICpiNCwgaW50IHdpZHRoKTsgXAordm9pZCBmZl92ZXJ0aWNhbF9jb21wb3NlX2RkOTdpSDAjI2V4dChJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgSURXVEVMRU0gKmIyLCBJRFdURUxFTSAqYjMsIElEV1RFTEVNICpiNCwgaW50IHdpZHRoKTsgXAordm9pZCBmZl92ZXJ0aWNhbF9jb21wb3NlX2hhYXIjI2V4dChJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgaW50IHdpZHRoKTsgXAordm9pZCBmZl9ob3Jpem9udGFsX2NvbXBvc2VfaGFhcjBpIyNleHQoSURXVEVMRU0gKmIsIElEV1RFTEVNICp0bXAsIGludCB3KTtcCit2b2lkIGZmX2hvcml6b250YWxfY29tcG9zZV9oYWFyMWkjI2V4dChJRFdURUxFTSAqYiwgSURXVEVMRU0gKnRtcCwgaW50IHcpO1wKK1wKK3N0YXRpYyB2b2lkIHZlcnRpY2FsX2NvbXBvc2U1M2lMMCMjZXh0KElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBJRFdURUxFTSAqYjIsIGludCB3aWR0aCkgXAoreyBcCisgICAgaW50IGksIHdpZHRoX2FsaWduID0gd2lkdGgmfihhbGlnbi0xKTsgXAorXAorICAgIGZvcihpPXdpZHRoX2FsaWduOyBpPHdpZHRoOyBpKyspIFwKKyAgICAgICAgYjFbaV0gPSBDT01QT1NFXzUzaUwwKGIwW2ldLCBiMVtpXSwgYjJbaV0pOyBcCitcCisgICAgZmZfdmVydGljYWxfY29tcG9zZTUzaUwwIyNleHQoYjAsIGIxLCBiMiwgd2lkdGhfYWxpZ24pOyBcCit9IFwKK1wKK3N0YXRpYyB2b2lkIHZlcnRpY2FsX2NvbXBvc2VfZGlyYWM1M2lIMCMjZXh0KElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBJRFdURUxFTSAqYjIsIGludCB3aWR0aCkgXAoreyBcCisgICAgaW50IGksIHdpZHRoX2FsaWduID0gd2lkdGgmfihhbGlnbi0xKTsgXAorXAorICAgIGZvcihpPXdpZHRoX2FsaWduOyBpPHdpZHRoOyBpKyspIFwKKyAgICAgICAgYjFbaV0gPSBDT01QT1NFX0RJUkFDNTNpSDAoYjBbaV0sIGIxW2ldLCBiMltpXSk7IFwKK1wKKyAgICBmZl92ZXJ0aWNhbF9jb21wb3NlX2RpcmFjNTNpSDAjI2V4dChiMCwgYjEsIGIyLCB3aWR0aF9hbGlnbik7IFwKK30gXAorXAorc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZV9kZDEzN2lMMCMjZXh0KElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBJRFdURUxFTSAqYjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRFdURUxFTSAqYjMsIElEV1RFTEVNICpiNCwgaW50IHdpZHRoKSBcCit7IFwKKyAgICBpbnQgaSwgd2lkdGhfYWxpZ24gPSB3aWR0aCZ+KGFsaWduLTEpOyBcCitcCisgICAgZm9yKGk9d2lkdGhfYWxpZ247IGk8d2lkdGg7IGkrKykgXAorICAgICAgICBiMltpXSA9IENPTVBPU0VfREQxMzdpTDAoYjBbaV0sIGIxW2ldLCBiMltpXSwgYjNbaV0sIGI0W2ldKTsgXAorXAorICAgIGZmX3ZlcnRpY2FsX2NvbXBvc2VfZGQxMzdpTDAjI2V4dChiMCwgYjEsIGIyLCBiMywgYjQsIHdpZHRoX2FsaWduKTsgXAorfSBcCitcCitzdGF0aWMgdm9pZCB2ZXJ0aWNhbF9jb21wb3NlX2RkOTdpSDAjI2V4dChJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgSURXVEVMRU0gKmIyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRFdURUxFTSAqYjMsIElEV1RFTEVNICpiNCwgaW50IHdpZHRoKSBcCit7IFwKKyAgICBpbnQgaSwgd2lkdGhfYWxpZ24gPSB3aWR0aCZ+KGFsaWduLTEpOyBcCitcCisgICAgZm9yKGk9d2lkdGhfYWxpZ247IGk8d2lkdGg7IGkrKykgXAorICAgICAgICBiMltpXSA9IENPTVBPU0VfREQ5N2lIMChiMFtpXSwgYjFbaV0sIGIyW2ldLCBiM1tpXSwgYjRbaV0pOyBcCitcCisgICAgZmZfdmVydGljYWxfY29tcG9zZV9kZDk3aUgwIyNleHQoYjAsIGIxLCBiMiwgYjMsIGI0LCB3aWR0aF9hbGlnbik7IFwKK30gXAorc3RhdGljIHZvaWQgdmVydGljYWxfY29tcG9zZV9oYWFyIyNleHQoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIGludCB3aWR0aCkgXAoreyBcCisgICAgaW50IGksIHdpZHRoX2FsaWduID0gd2lkdGgmfihhbGlnbi0xKTsgXAorXAorICAgIGZvcihpPXdpZHRoX2FsaWduOyBpPHdpZHRoOyBpKyspIHsgXAorICAgICAgICBiMFtpXSA9IENPTVBPU0VfSEFBUmlMMChiMFtpXSwgYjFbaV0pOyBcCisgICAgICAgIGIxW2ldID0gQ09NUE9TRV9IQUFSaUgwKGIxW2ldLCBiMFtpXSk7IFwKKyAgICB9IFwKK1wKKyAgICBmZl92ZXJ0aWNhbF9jb21wb3NlX2hhYXIjI2V4dChiMCwgYjEsIHdpZHRoX2FsaWduKTsgXAorfSBcCitzdGF0aWMgdm9pZCBob3Jpem9udGFsX2NvbXBvc2VfaGFhcjBpIyNleHQoSURXVEVMRU0gKmIsIElEV1RFTEVNICp0bXAsIGludCB3KVwKK3tcCisgICAgaW50IHcyPSB3Pj4xO1wKKyAgICBpbnQgeD0gdzIgLSAodzImKGFsaWduLTEpKTtcCisgICAgZmZfaG9yaXpvbnRhbF9jb21wb3NlX2hhYXIwaSMjZXh0KGIsIHRtcCwgdyk7XAorXAorICAgIGZvciAoOyB4IDwgdzI7IHgrKykge1wKKyAgICAgICAgYlsyKnggIF0gPSB0bXBbeF07XAorICAgICAgICBiWzIqeCsxXSA9IENPTVBPU0VfSEFBUmlIMChiW3grdzJdLCB0bXBbeF0pO1wKKyAgICB9XAorfVwKK3N0YXRpYyB2b2lkIGhvcml6b250YWxfY29tcG9zZV9oYWFyMWkjI2V4dChJRFdURUxFTSAqYiwgSURXVEVMRU0gKnRtcCwgaW50IHcpXAore1wKKyAgICBpbnQgdzI9IHc+PjE7XAorICAgIGludCB4PSB3MiAtICh3MiYoYWxpZ24tMSkpO1wKKyAgICBmZl9ob3Jpem9udGFsX2NvbXBvc2VfaGFhcjFpIyNleHQoYiwgdG1wLCB3KTtcCitcCisgICAgZm9yICg7IHggPCB3MjsgeCsrKSB7XAorICAgICAgICBiWzIqeCAgXSA9ICh0bXBbeF0gKyAxKT4+MTtcCisgICAgICAgIGJbMip4KzFdID0gKENPTVBPU0VfSEFBUmlIMChiW3grdzJdLCB0bXBbeF0pICsgMSk+PjE7XAorICAgIH1cCit9XAorXAorCisjaWYgSEFWRV9ZQVNNCisjaWYgIUFSQ0hfWDg2XzY0CitDT01QT1NFX1ZFUlRJQ0FMKF9tbXgsIDQpCisjZW5kaWYKK0NPTVBPU0VfVkVSVElDQUwoX3NzZTIsIDgpCisKKwordm9pZCBmZl9ob3Jpem9udGFsX2NvbXBvc2VfZGQ5N2lfc3NzZTMoSURXVEVMRU0gKmIsIElEV1RFTEVNICp0bXAsIGludCB3KTsKKworc3RhdGljIHZvaWQgaG9yaXpvbnRhbF9jb21wb3NlX2RkOTdpX3Nzc2UzKElEV1RFTEVNICpiLCBJRFdURUxFTSAqdG1wLCBpbnQgdykKK3sKKyAgICBpbnQgdzI9IHc+PjE7CisgICAgaW50IHg9IHcyIC0gKHcyJjcpOworICAgIGZmX2hvcml6b250YWxfY29tcG9zZV9kZDk3aV9zc3NlMyhiLCB0bXAsIHcpOworCisgICAgZm9yICg7IHggPCB3MjsgeCsrKSB7CisgICAgICAgIGJbMip4ICBdID0gKHRtcFt4XSArIDEpPj4xOworICAgICAgICBiWzIqeCsxXSA9IChDT01QT1NFX0REOTdpSDAodG1wW3gtMV0sIHRtcFt4XSwgYlt4K3cyXSwgdG1wW3grMV0sIHRtcFt4KzJdKSArIDEpPj4xOworICAgIH0KK30KKyNlbmRpZgorCit2b2lkIGZmX3NwYXRpYWxfaWR3dF9pbml0X21teChEV1RDb250ZXh0ICpkLCBlbnVtIGR3dF90eXBlIHR5cGUpCit7CisjaWYgSEFWRV9ZQVNNCisgIGludCBtbV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworI2lmICFBUkNIX1g4Nl82NAorICAgIGlmICghKG1tX2ZsYWdzICYgQVZfQ1BVX0ZMQUdfTU1YKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBEV1RfRElSQUNfREQ5Xzc6CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2VfbDAgPSAodm9pZCopdmVydGljYWxfY29tcG9zZTUzaUwwX21teDsKKyAgICAgICAgZC0+dmVydGljYWxfY29tcG9zZV9oMCA9ICh2b2lkKil2ZXJ0aWNhbF9jb21wb3NlX2RkOTdpSDBfbW14OworICAgICAgICBicmVhazsKKyAgICBjYXNlIERXVF9ESVJBQ19MRUdBTEw1XzM6CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2VfbDAgPSAodm9pZCopdmVydGljYWxfY29tcG9zZTUzaUwwX21teDsKKyAgICAgICAgZC0+dmVydGljYWxfY29tcG9zZV9oMCA9ICh2b2lkKil2ZXJ0aWNhbF9jb21wb3NlX2RpcmFjNTNpSDBfbW14OworICAgICAgICBicmVhazsKKyAgICBjYXNlIERXVF9ESVJBQ19ERDEzXzc6CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2VfbDAgPSAodm9pZCopdmVydGljYWxfY29tcG9zZV9kZDEzN2lMMF9tbXg7CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2VfaDAgPSAodm9pZCopdmVydGljYWxfY29tcG9zZV9kZDk3aUgwX21teDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEV1RfRElSQUNfSEFBUjA6CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2UgICA9ICh2b2lkKil2ZXJ0aWNhbF9jb21wb3NlX2hhYXJfbW14OworICAgICAgICBkLT5ob3Jpem9udGFsX2NvbXBvc2UgPSBob3Jpem9udGFsX2NvbXBvc2VfaGFhcjBpX21teDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEV1RfRElSQUNfSEFBUjE6CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2UgICA9ICh2b2lkKil2ZXJ0aWNhbF9jb21wb3NlX2hhYXJfbW14OworICAgICAgICBkLT5ob3Jpem9udGFsX2NvbXBvc2UgPSBob3Jpem9udGFsX2NvbXBvc2VfaGFhcjFpX21teDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIShtbV9mbGFncyAmIEFWX0NQVV9GTEFHX1NTRTIpKQorICAgICAgICByZXR1cm47CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIERXVF9ESVJBQ19ERDlfNzoKKyAgICAgICAgZC0+dmVydGljYWxfY29tcG9zZV9sMCA9ICh2b2lkKil2ZXJ0aWNhbF9jb21wb3NlNTNpTDBfc3NlMjsKKyAgICAgICAgZC0+dmVydGljYWxfY29tcG9zZV9oMCA9ICh2b2lkKil2ZXJ0aWNhbF9jb21wb3NlX2RkOTdpSDBfc3NlMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEV1RfRElSQUNfTEVHQUxMNV8zOgorICAgICAgICBkLT52ZXJ0aWNhbF9jb21wb3NlX2wwID0gKHZvaWQqKXZlcnRpY2FsX2NvbXBvc2U1M2lMMF9zc2UyOworICAgICAgICBkLT52ZXJ0aWNhbF9jb21wb3NlX2gwID0gKHZvaWQqKXZlcnRpY2FsX2NvbXBvc2VfZGlyYWM1M2lIMF9zc2UyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERXVF9ESVJBQ19ERDEzXzc6CisgICAgICAgIGQtPnZlcnRpY2FsX2NvbXBvc2VfbDAgPSAodm9pZCopdmVydGljYWxfY29tcG9zZV9kZDEzN2lMMF9zc2UyOworICAgICAgICBkLT52ZXJ0aWNhbF9jb21wb3NlX2gwID0gKHZvaWQqKXZlcnRpY2FsX2NvbXBvc2VfZGQ5N2lIMF9zc2UyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERXVF9ESVJBQ19IQUFSMDoKKyAgICAgICAgZC0+dmVydGljYWxfY29tcG9zZSAgID0gKHZvaWQqKXZlcnRpY2FsX2NvbXBvc2VfaGFhcl9zc2UyOworICAgICAgICBkLT5ob3Jpem9udGFsX2NvbXBvc2UgPSBob3Jpem9udGFsX2NvbXBvc2VfaGFhcjBpX3NzZTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFdUX0RJUkFDX0hBQVIxOgorICAgICAgICBkLT52ZXJ0aWNhbF9jb21wb3NlICAgPSAodm9pZCopdmVydGljYWxfY29tcG9zZV9oYWFyX3NzZTI7CisgICAgICAgIGQtPmhvcml6b250YWxfY29tcG9zZSA9IGhvcml6b250YWxfY29tcG9zZV9oYWFyMWlfc3NlMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCEobW1fZmxhZ3MgJiBBVl9DUFVfRkxBR19TU1NFMykpCisgICAgICAgIHJldHVybjsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRFdUX0RJUkFDX0REOV83OgorICAgICAgICBkLT5ob3Jpem9udGFsX2NvbXBvc2UgPSBob3Jpem9udGFsX2NvbXBvc2VfZGQ5N2lfc3NzZTM7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvLyBIQVZFX1lBU00KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kaXJhY19kd3QuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kaXJhY19kd3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZiMjkwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RpcmFjX2R3dC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1g4Nl9ESVJBQ19EV1RfSAorI2RlZmluZSBBVkNPREVDX1g4Nl9ESVJBQ19EV1RfSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy9kaXJhY19kd3QuaCIKKwordm9pZCBmZl9ob3Jpem9udGFsX2NvbXBvc2VfZGQ5N2lfZW5kX2MoSURXVEVMRU0gKmIsIElEV1RFTEVNICp0bXAsIGludCB3MiwgaW50IHgpOwordm9pZCBmZl9ob3Jpem9udGFsX2NvbXBvc2VfaGFhcjFpX2VuZF9jKElEV1RFTEVNICpiLCBJRFdURUxFTSAqdG1wLCBpbnQgdzIsIGludCB4KTsKK3ZvaWQgZmZfaG9yaXpvbnRhbF9jb21wb3NlX2hhYXIwaV9lbmRfYyhJRFdURUxFTSAqYiwgSURXVEVMRU0gKnRtcCwgaW50IHcyLCBpbnQgeCk7CisKK3ZvaWQgZmZfc3BhdGlhbF9pZHd0X2luaXRfbW14KERXVENvbnRleHQgKmQsIGVudW0gZHd0X3R5cGUgdHlwZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RpcmFjZHNwX21teC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RpcmFjZHNwX21teC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZGY1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGlyYWNkc3BfbW14LmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGF2aWQgQ29ucmFkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImRpcmFjZHNwX21teC5oIgorI2luY2x1ZGUgImZwZWwuaCIKKwordm9pZCBmZl9wdXRfcmVjdF9jbGFtcGVkX21teCh1aW50OF90ICpkc3QsIGludCBkc3Rfc3RyaWRlLCBjb25zdCBpbnQxNl90ICpzcmMsIGludCBzcmNfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwordm9pZCBmZl9wdXRfcmVjdF9jbGFtcGVkX3NzZTIodWludDhfdCAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK3ZvaWQgZmZfcHV0X3NpZ25lZF9yZWN0X2NsYW1wZWRfbW14KHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsIGNvbnN0IGludDE2X3QgKnNyYywgaW50IHNyY19zdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Cit2b2lkIGZmX3B1dF9zaWduZWRfcmVjdF9jbGFtcGVkX3NzZTIodWludDhfdCAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworI2RlZmluZSBIUEVMX0ZJTFRFUihNTVNJWkUsIEVYVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgZmZfZGlyYWNfaHBlbF9maWx0ZXJfdl8gIyMgRVhUKHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBpbnQsIGludCk7ICAgICAgICAgICAgICAgXAorICAgIHZvaWQgZmZfZGlyYWNfaHBlbF9maWx0ZXJfaF8gIyMgRVhUKHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBpbnQpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIGRpcmFjX2hwZWxfZmlsdGVyXyAjIyBFWFQodWludDhfdCAqZHN0aCwgdWludDhfdCAqZHN0diwgdWludDhfdCAqZHN0YywgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSggaGVpZ2h0LS0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmZfZGlyYWNfaHBlbF9maWx0ZXJfdl8gIyMgRVhUKGRzdHYtTU1TSVpFLCBzcmMtTU1TSVpFLCBzdHJpZGUsIHdpZHRoK01NU0laRSs1KTsgXAorICAgICAgICAgICAgZmZfZGlyYWNfaHBlbF9maWx0ZXJfaF8gIyMgRVhUKGRzdGgsIHNyYywgd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmZfZGlyYWNfaHBlbF9maWx0ZXJfaF8gIyMgRVhUKGRzdGMsIGRzdHYsIHdpZHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0aCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0diArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0YyArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3JjICArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2lmICFBUkNIX1g4Nl82NAorSFBFTF9GSUxURVIoOCwgbW14KQorI2VuZGlmCitIUEVMX0ZJTFRFUigxNiwgc3NlMikKKworI2RlZmluZSBQSVhGVU5DKFBGWCwgSURYLCBFWFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qTU1YRElTQUJMRURjLT5QRlggIyMgX2RpcmFjX3BpeGVsc190YWJbMF1bSURYXSA9IGZmXyAjIyBQRlggIyMgX2RpcmFjX3BpeGVsczhfICMjIEVYVDsqLyAgXAorICAgIGMtPlBGWCAjIyBfZGlyYWNfcGl4ZWxzX3RhYlsxXVtJRFhdID0gZmZfICMjIFBGWCAjIyBfZGlyYWNfcGl4ZWxzMTZfICMjIEVYVDsgXAorICAgIGMtPlBGWCAjIyBfZGlyYWNfcGl4ZWxzX3RhYlsyXVtJRFhdID0gZmZfICMjIFBGWCAjIyBfZGlyYWNfcGl4ZWxzMzJfICMjIEVYVAorCisjZGVmaW5lIERJUkFDX1BJWE9QKE9QTkFNRTIsIE9QTkFNRSwgRVhUKVwKK3ZvaWQgZmZfICMjIE9QTkFNRTIgIyMgX2RpcmFjX3BpeGVsczhfICMjIEVYVCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSwgaW50IGgpXAore1wKKyAgICBpZiAoaCYzKVwKKyAgICAgICAgZmZfICMjIE9QTkFNRTIgIyMgX2RpcmFjX3BpeGVsczhfYyhkc3QsIHNyYywgc3RyaWRlLCBoKTtcCisgICAgZWxzZVwKKyAgICAgICAgT1BOQU1FICMjIF9waXhlbHM4XyAjIyBFWFQoZHN0LCBzcmNbMF0sIHN0cmlkZSwgaCk7XAorfVwKK3ZvaWQgZmZfICMjIE9QTkFNRTIgIyMgX2RpcmFjX3BpeGVsczE2XyAjIyBFWFQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNV0sIGludCBzdHJpZGUsIGludCBoKVwKK3tcCisgICAgaWYgKGgmMylcCisgICAgICAgIGZmXyAjIyBPUE5BTUUyICMjIF9kaXJhY19waXhlbHMxNl9jKGRzdCwgc3JjLCBzdHJpZGUsIGgpO1wKKyAgICBlbHNlXAorICAgICAgICBPUE5BTUUgIyMgX3BpeGVsczE2XyAjIyBFWFQoZHN0LCBzcmNbMF0sIHN0cmlkZSwgaCk7XAorfVwKK3ZvaWQgZmZfICMjIE9QTkFNRTIgIyMgX2RpcmFjX3BpeGVsczMyXyAjIyBFWFQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNV0sIGludCBzdHJpZGUsIGludCBoKVwKK3tcCisgICAgaWYgKGgmMykge1wKKyAgICAgICAgZmZfICMjIE9QTkFNRTIgIyMgX2RpcmFjX3BpeGVsczMyX2MoZHN0LCBzcmMsIHN0cmlkZSwgaCk7XAorICAgIH0gZWxzZSB7XAorICAgICAgICBPUE5BTUUgIyMgX3BpeGVsczE2XyAjIyBFWFQoZHN0ICAgLCBzcmNbMF0gICAsIHN0cmlkZSwgaCk7XAorICAgICAgICBPUE5BTUUgIyMgX3BpeGVsczE2XyAjIyBFWFQoZHN0KzE2LCBzcmNbMF0rMTYsIHN0cmlkZSwgaCk7XAorICAgIH1cCit9CisKK0RJUkFDX1BJWE9QKHB1dCwgZmZfcHV0LCBtbXgpCitESVJBQ19QSVhPUChhdmcsIGZmX2F2ZywgbW14KQorRElSQUNfUElYT1AoYXZnLCBmZl9hdmcsIG1teGV4dCkKKwordm9pZCBmZl9wdXRfZGlyYWNfcGl4ZWxzMTZfc3NlMih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSwgaW50IGgpCit7CisgICAgaWYgKGgmMykKKyAgICAgICAgZmZfcHV0X2RpcmFjX3BpeGVsczE2X2MoZHN0LCBzcmMsIHN0cmlkZSwgaCk7CisgICAgZWxzZQorICAgIGZmX3B1dF9waXhlbHMxNl9zc2UyKGRzdCwgc3JjWzBdLCBzdHJpZGUsIGgpOworfQordm9pZCBmZl9hdmdfZGlyYWNfcGl4ZWxzMTZfc3NlMih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSwgaW50IGgpCit7CisgICAgaWYgKGgmMykKKyAgICAgICAgZmZfYXZnX2RpcmFjX3BpeGVsczE2X2MoZHN0LCBzcmMsIHN0cmlkZSwgaCk7CisgICAgZWxzZQorICAgIGZmX2F2Z19waXhlbHMxNl9zc2UyKGRzdCwgc3JjWzBdLCBzdHJpZGUsIGgpOworfQordm9pZCBmZl9wdXRfZGlyYWNfcGl4ZWxzMzJfc3NlMih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1s1XSwgaW50IHN0cmlkZSwgaW50IGgpCit7CisgICAgaWYgKGgmMykgeworICAgICAgICBmZl9wdXRfZGlyYWNfcGl4ZWxzMzJfYyhkc3QsIHNyYywgc3RyaWRlLCBoKTsKKyAgICB9IGVsc2UgeworICAgIGZmX3B1dF9waXhlbHMxNl9zc2UyKGRzdCAgICwgc3JjWzBdICAgLCBzdHJpZGUsIGgpOworICAgIGZmX3B1dF9waXhlbHMxNl9zc2UyKGRzdCsxNiwgc3JjWzBdKzE2LCBzdHJpZGUsIGgpOworICAgIH0KK30KK3ZvaWQgZmZfYXZnX2RpcmFjX3BpeGVsczMyX3NzZTIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNV0sIGludCBzdHJpZGUsIGludCBoKQoreworICAgIGlmIChoJjMpIHsKKyAgICAgICAgZmZfYXZnX2RpcmFjX3BpeGVsczMyX2MoZHN0LCBzcmMsIHN0cmlkZSwgaCk7CisgICAgfSBlbHNlIHsKKyAgICBmZl9hdmdfcGl4ZWxzMTZfc3NlMihkc3QgICAsIHNyY1swXSAgICwgc3RyaWRlLCBoKTsKKyAgICBmZl9hdmdfcGl4ZWxzMTZfc3NlMihkc3QrMTYsIHNyY1swXSsxNiwgc3RyaWRlLCBoKTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfZGlyYWNkc3BfaW5pdF9tbXgoRGlyYWNEU1BDb250ZXh0KiBjKQoreworICAgIGludCBtbV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9NTVgobW1fZmxhZ3MpKSB7CisgICAgYy0+YWRkX2RpcmFjX29ibWNbMF0gPSBmZl9hZGRfZGlyYWNfb2JtYzhfbW14OworI2lmICFBUkNIX1g4Nl82NAorICAgIGMtPmFkZF9kaXJhY19vYm1jWzFdID0gZmZfYWRkX2RpcmFjX29ibWMxNl9tbXg7CisgICAgYy0+YWRkX2RpcmFjX29ibWNbMl0gPSBmZl9hZGRfZGlyYWNfb2JtYzMyX21teDsKKyAgICBjLT5kaXJhY19ocGVsX2ZpbHRlciA9IGRpcmFjX2hwZWxfZmlsdGVyX21teDsKKyAgICBjLT5hZGRfcmVjdF9jbGFtcGVkID0gZmZfYWRkX3JlY3RfY2xhbXBlZF9tbXg7CisgICAgYy0+cHV0X3NpZ25lZF9yZWN0X2NsYW1wZWQgPSBmZl9wdXRfc2lnbmVkX3JlY3RfY2xhbXBlZF9tbXg7CisjZW5kaWYKKyAgICBQSVhGVU5DKHB1dCwgMCwgbW14KTsKKyAgICBQSVhGVU5DKGF2ZywgMCwgbW14KTsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfTU1YRVhUKG1tX2ZsYWdzKSkgeworICAgICAgICBQSVhGVU5DKGF2ZywgMCwgbW14ZXh0KTsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NFMihtbV9mbGFncykpIHsKKyAgICAgICAgYy0+ZGlyYWNfaHBlbF9maWx0ZXIgPSBkaXJhY19ocGVsX2ZpbHRlcl9zc2UyOworICAgICAgICBjLT5hZGRfcmVjdF9jbGFtcGVkID0gZmZfYWRkX3JlY3RfY2xhbXBlZF9zc2UyOworICAgICAgICBjLT5wdXRfc2lnbmVkX3JlY3RfY2xhbXBlZCA9IGZmX3B1dF9zaWduZWRfcmVjdF9jbGFtcGVkX3NzZTI7CisKKyAgICAgICAgYy0+YWRkX2RpcmFjX29ibWNbMV0gPSBmZl9hZGRfZGlyYWNfb2JtYzE2X3NzZTI7CisgICAgICAgIGMtPmFkZF9kaXJhY19vYm1jWzJdID0gZmZfYWRkX2RpcmFjX29ibWMzMl9zc2UyOworCisgICAgICAgIGMtPnB1dF9kaXJhY19waXhlbHNfdGFiWzFdWzBdID0gZmZfcHV0X2RpcmFjX3BpeGVsczE2X3NzZTI7CisgICAgICAgIGMtPmF2Z19kaXJhY19waXhlbHNfdGFiWzFdWzBdID0gZmZfYXZnX2RpcmFjX3BpeGVsczE2X3NzZTI7CisgICAgICAgIGMtPnB1dF9kaXJhY19waXhlbHNfdGFiWzJdWzBdID0gZmZfcHV0X2RpcmFjX3BpeGVsczMyX3NzZTI7CisgICAgICAgIGMtPmF2Z19kaXJhY19waXhlbHNfdGFiWzJdWzBdID0gZmZfYXZnX2RpcmFjX3BpeGVsczMyX3NzZTI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RpcmFjZHNwX21teC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RpcmFjZHNwX21teC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODU4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGlyYWNkc3BfbW14LmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBEYXZpZCBDb25yYWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1g4Nl9ESVJBQ0RTUF9ICisjZGVmaW5lIEFWQ09ERUNfWDg2X0RJUkFDRFNQX0gKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvZGlyYWNkc3AuaCIKKwordm9pZCBmZl9kaXJhY2RzcF9pbml0X21teChEaXJhY0RTUENvbnRleHQqIGMpOworCitERUNMX0RJUkFDX1BJWE9QKHB1dCwgbW14KTsKK0RFQ0xfRElSQUNfUElYT1AoYXZnLCBtbXgpOworREVDTF9ESVJBQ19QSVhPUChhdmcsIG1teGV4dCk7CisKK3ZvaWQgZmZfcHV0X2RpcmFjX3BpeGVsczE2X3NzZTIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNV0sIGludCBzdHJpZGUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX2RpcmFjX3BpeGVsczE2X3NzZTIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNV0sIGludCBzdHJpZGUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X2RpcmFjX3BpeGVsczMyX3NzZTIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNV0sIGludCBzdHJpZGUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX2RpcmFjX3BpeGVsczMyX3NzZTIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNV0sIGludCBzdHJpZGUsIGludCBoKTsKKwordm9pZCBmZl9hZGRfcmVjdF9jbGFtcGVkX21teCh1aW50OF90ICosIGNvbnN0IHVpbnQxNl90ICosIGludCwgY29uc3QgaW50MTZfdCAqLCBpbnQsIGludCwgaW50KTsKK3ZvaWQgZmZfYWRkX3JlY3RfY2xhbXBlZF9zc2UyKHVpbnQ4X3QgKiwgY29uc3QgdWludDE2X3QgKiwgaW50LCBjb25zdCBpbnQxNl90ICosIGludCwgaW50LCBpbnQpOworCit2b2lkIGZmX2FkZF9kaXJhY19vYm1jOF9tbXgodWludDE2X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBjb25zdCB1aW50OF90ICpvYm1jX3dlaWdodCwgaW50IHlibGVuKTsKK3ZvaWQgZmZfYWRkX2RpcmFjX29ibWMxNl9tbXgodWludDE2X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBjb25zdCB1aW50OF90ICpvYm1jX3dlaWdodCwgaW50IHlibGVuKTsKK3ZvaWQgZmZfYWRkX2RpcmFjX29ibWMzMl9tbXgodWludDE2X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBjb25zdCB1aW50OF90ICpvYm1jX3dlaWdodCwgaW50IHlibGVuKTsKKwordm9pZCBmZl9hZGRfZGlyYWNfb2JtYzE2X3NzZTIodWludDE2X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBjb25zdCB1aW50OF90ICpvYm1jX3dlaWdodCwgaW50IHlibGVuKTsKK3ZvaWQgZmZfYWRkX2RpcmFjX29ibWMzMl9zc2UyKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgY29uc3QgdWludDhfdCAqb2JtY193ZWlnaHQsIGludCB5Ymxlbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RpcmFjZHNwX3lhc20uYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RpcmFjZHNwX3lhc20uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzY2Y5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZGlyYWNkc3BfeWFzbS5hc20KQEAgLTAsMCArMSwyNjUgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIENvcHlyaWdodCAoYykgMjAxMCBEYXZpZCBDb25yYWQKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiA1MSwgSW5jLiwgRm91bmRhdGlvbiBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorcHdfNzogdGltZXMgOCBkdyA3CisKK2NleHRlcm4gcHdfMworY2V4dGVybiBwd18xNgorY2V4dGVybiBwd18zMgorY2V4dGVybiBwYl84MAorCitzZWN0aW9uIC50ZXh0CisKKyVtYWNybyBVTlBBQ0tfQUREIDYKKyAgICBtb3YlNSAgICUxLCAlMworICAgIG1vdiU2ICAgbTUsICU0CisgICAgbW92YSAgICBtNCwgJTEKKyAgICBtb3ZhICAgICUyLCBtNQorICAgIHB1bnBja2xidyAlMSwgbTcKKyAgICBwdW5wY2tsYncgbTUsIG03CisgICAgcHVucGNraGJ3IG00LCBtNworICAgIHB1bnBja2hidyAlMiwgbTcKKyAgICBwYWRkdyAgICUxLCBtNQorICAgIHBhZGR3ICAgJTIsIG00CislZW5kbWFjcm8KKworJW1hY3JvIEhQRUxfRklMVEVSIDEKKzsgZGlyYWNfaHBlbF9maWx0ZXJfdl9zc2UyKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgd2lkdGgpOworY2dsb2JhbCBkaXJhY19ocGVsX2ZpbHRlcl92XyUxLCA0LDYsOCwgZHN0LCBzcmMsIHN0cmlkZSwgd2lkdGgsIHNyYzAsIHN0cmlkZXgzCisgICAgbW92ICAgICBzcmMwcSwgc3JjcQorICAgIGxlYSAgICAgc3RyaWRleDNxLCBbMypzdHJpZGVxXQorICAgIHN1YiAgICAgc3JjMHEsIHN0cmlkZXgzcQorICAgIHB4b3IgICAgbTcsIG03CisubG9vcDoKKyAgICA7IDcqKHNyY1swXSArIHNyY1sxXSkKKyAgICBVTlBBQ0tfQUREIG0wLCBtMSwgW3NyY3FdLCBbc3JjcSArIHN0cmlkZXFdLCBhLGEKKyAgICBwbXVsbHcgIG0wLCBbcHdfN10KKyAgICBwbXVsbHcgIG0xLCBbcHdfN10KKworICAgIDsgMyooIC4uLiArIHNyY1stMl0gKyBzcmNbM10pCisgICAgVU5QQUNLX0FERCBtMiwgbTMsIFtzcmMwcSArIHN0cmlkZXFdLCBbc3JjcSArIHN0cmlkZXgzcV0sIGEsYQorICAgIHBhZGR3ICAgbTAsIG0yCisgICAgcGFkZHcgICBtMSwgbTMKKyAgICBwbXVsbHcgIG0wLCBbcHdfM10KKyAgICBwbXVsbHcgIG0xLCBbcHdfM10KKworICAgIDsgLi4uIC0gNyooc3JjWy0xXSArIHNyY1syXSkKKyAgICBVTlBBQ0tfQUREIG0yLCBtMywgW3NyYzBxICsgc3RyaWRlcSoyXSwgW3NyY3EgKyBzdHJpZGVxKjJdLCBhLGEKKyAgICBwbXVsbHcgIG0yLCBbcHdfN10KKyAgICBwbXVsbHcgIG0zLCBbcHdfN10KKyAgICBwc3VidyAgIG0wLCBtMgorICAgIHBzdWJ3ICAgbTEsIG0zCisKKyAgICA7IC4uLiAtIChzcmNbLTNdICsgc3JjWzRdKQorICAgIFVOUEFDS19BREQgbTIsIG0zLCBbc3JjMHFdLCBbc3JjcSArIHN0cmlkZXEqNF0sIGEsYQorICAgIHBzdWJ3ICAgbTAsIG0yCisgICAgcHN1YncgICBtMSwgbTMKKworICAgIHBhZGR3ICAgbTAsIFtwd18xNl0KKyAgICBwYWRkdyAgIG0xLCBbcHdfMTZdCisgICAgcHNyYXcgICBtMCwgNQorICAgIHBzcmF3ICAgbTEsIDUKKyAgICBwYWNrdXN3YiBtMCwgbTEKKyAgICBtb3ZhICAgIFtkc3RxXSwgbTAKKyAgICBhZGQgICAgIGRzdHEsIG1tc2l6ZQorICAgIGFkZCAgICAgc3JjcSwgbW1zaXplCisgICAgYWRkICAgICBzcmMwcSwgbW1zaXplCisgICAgc3ViICAgICB3aWR0aGQsIG1tc2l6ZQorICAgIGpnICAgICAgLmxvb3AKKyAgICBSRVQKKworOyBkaXJhY19ocGVsX2ZpbHRlcl9oX3NzZTIodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCB3aWR0aCk7CitjZ2xvYmFsIGRpcmFjX2hwZWxfZmlsdGVyX2hfJTEsIDMsMyw4LCBkc3QsIHNyYywgd2lkdGgKKyAgICBkZWMgICAgIHdpZHRoZAorICAgIHB4b3IgICAgbTcsIG03CisgICAgYW5kICAgICB3aWR0aGQsIH4obW1zaXplLTEpCisubG9vcDoKKyAgICA7IDcqKHNyY1swXSArIHNyY1sxXSkKKyAgICBVTlBBQ0tfQUREIG0wLCBtMSwgW3NyY3EgKyB3aWR0aHFdLCBbc3JjcSArIHdpZHRocSArIDFdLCB1LHUKKyAgICBwbXVsbHcgIG0wLCBbcHdfN10KKyAgICBwbXVsbHcgIG0xLCBbcHdfN10KKworICAgIDsgMyooIC4uLiArIHNyY1stMl0gKyBzcmNbM10pCisgICAgVU5QQUNLX0FERCBtMiwgbTMsIFtzcmNxICsgd2lkdGhxIC0gMl0sIFtzcmNxICsgd2lkdGhxICsgM10sIHUsdQorICAgIHBhZGR3ICAgbTAsIG0yCisgICAgcGFkZHcgICBtMSwgbTMKKyAgICBwbXVsbHcgIG0wLCBbcHdfM10KKyAgICBwbXVsbHcgIG0xLCBbcHdfM10KKworICAgIDsgLi4uIC0gNyooc3JjWy0xXSArIHNyY1syXSkKKyAgICBVTlBBQ0tfQUREIG0yLCBtMywgW3NyY3EgKyB3aWR0aHEgLSAxXSwgW3NyY3EgKyB3aWR0aHEgKyAyXSwgdSx1CisgICAgcG11bGx3ICBtMiwgW3B3XzddCisgICAgcG11bGx3ICBtMywgW3B3XzddCisgICAgcHN1YncgICBtMCwgbTIKKyAgICBwc3VidyAgIG0xLCBtMworCisgICAgOyAuLi4gLSAoc3JjWy0zXSArIHNyY1s0XSkKKyAgICBVTlBBQ0tfQUREIG0yLCBtMywgW3NyY3EgKyB3aWR0aHEgLSAzXSwgW3NyY3EgKyB3aWR0aHEgKyA0XSwgdSx1CisgICAgcHN1YncgICBtMCwgbTIKKyAgICBwc3VidyAgIG0xLCBtMworCisgICAgcGFkZHcgICBtMCwgW3B3XzE2XQorICAgIHBhZGR3ICAgbTEsIFtwd18xNl0KKyAgICBwc3JhdyAgIG0wLCA1CisgICAgcHNyYXcgICBtMSwgNQorICAgIHBhY2t1c3diIG0wLCBtMQorICAgIG1vdmEgICAgW2RzdHEgKyB3aWR0aHFdLCBtMAorICAgIHN1YiAgICAgd2lkdGhkLCBtbXNpemUKKyAgICBqZ2UgICAgIC5sb29wCisgICAgUkVUCislZW5kbWFjcm8KKworJW1hY3JvIFBVVF9SRUNUIDEKKzsgdm9pZCBwdXRfcmVjdF9jbGFtcGVkKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsIGludDE2X3QgKnNyYywgaW50IHNyY19zdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK2NnbG9iYWwgcHV0X3NpZ25lZF9yZWN0X2NsYW1wZWRfJTEsIDUsOSwzLCBkc3QsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgdywgZHN0Miwgc3JjMgorICAgIG1vdmEgICAgbTAsIFtwYl84MF0KKyAgICBhZGQgICAgIHdkLCAobW1zaXplLTEpCisgICAgYW5kICAgICB3ZCwgfihtbXNpemUtMSkKKworJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92c3hkICAgZHN0X3N0cmlkZXEsIGRzdF9zdHJpZGVkCisgICAgbW92c3hkICAgc3JjX3N0cmlkZXEsIHNyY19zdHJpZGVkCisgICAgbW92ICAgcjdkLCByNW0KKyAgICBtb3YgICByOGQsIHdkCisgICAgJWRlZmluZSB3c3BpbGwgcjhkCisgICAgJWRlZmluZSBoZCByN2QKKyVlbHNlCisgICAgbW92ICAgIHI0bSwgd2QKKyAgICAlZGVmaW5lIHdzcGlsbCByNG0KKyAgICAlZGVmaW5lIGhkIHI1bXAKKyVlbmRpZgorCisubG9vcHkKKyAgICBsZWEgICAgIHNyYzJxLCBbc3JjcStzcmNfc3RyaWRlcSoyXQorICAgIGxlYSAgICAgZHN0MnEsIFtkc3RxK2RzdF9zdHJpZGVxXQorLmxvb3B4OgorICAgIHN1YiAgICAgIHdkLCBtbXNpemUKKyAgICBtb3ZhICAgICBtMSwgW3NyY3EgKzIqd3FdCisgICAgbW92YSAgICAgbTIsIFtzcmMycSsyKndxXQorICAgIHBhY2tzc3diIG0xLCBbc3JjcSArMip3cSttbXNpemVdCisgICAgcGFja3Nzd2IgbTIsIFtzcmMycSsyKndxK21tc2l6ZV0KKyAgICBwYWRkYiAgICBtMSwgbTAKKyAgICBwYWRkYiAgICBtMiwgbTAKKyAgICBtb3ZhICAgIFtkc3RxICt3cV0sIG0xCisgICAgbW92YSAgICBbZHN0MnErd3FdLCBtMgorICAgIGpnICAgICAgLmxvb3B4CisKKyAgICBsZWEgICBzcmNxLCBbc3JjcStzcmNfc3RyaWRlcSo0XQorICAgIGxlYSAgIGRzdHEsIFtkc3RxK2RzdF9zdHJpZGVxKjJdCisgICAgc3ViICAgICBoZCwgMgorICAgIG1vdiAgICAgd2QsIHdzcGlsbAorICAgIGpnICAgICAgLmxvb3B5CisgICAgUkVUCislZW5kbQorCislbWFjcm8gQUREX1JFQ1QgMQorOyB2b2lkIGFkZF9yZWN0X2NsYW1wZWQodWludDhfdCAqZHN0LCB1aW50MTZfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQxNl90ICppZHd0LCBpbnQgaWR3dF9zdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK2NnbG9iYWwgYWRkX3JlY3RfY2xhbXBlZF8lMSwgNyw5LDMsIGRzdCwgc3JjLCBzdHJpZGUsIGlkd3QsIGlkd3Rfc3RyaWRlLCB3LCBoCisgICAgbW92YSAgICBtMCwgW3B3XzMyXQorICAgIGFkZCAgICAgd2QsIChtbXNpemUtMSkKKyAgICBhbmQgICAgIHdkLCB+KG1tc2l6ZS0xKQorCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICBzdHJpZGVxLCBzdHJpZGVkCisgICAgbW92c3hkICAgaWR3dF9zdHJpZGVxLCBpZHd0X3N0cmlkZWQKKyAgICBtb3YgICByOGQsIHdkCisgICAgJWRlZmluZSB3c3BpbGwgcjhkCislZWxzZQorICAgIG1vdiAgICByNW0sIHdkCisgICAgJWRlZmluZSB3c3BpbGwgcjVtCislZW5kaWYKKworLmxvb3A6CisgICAgc3ViICAgICB3ZCwgbW1zaXplCisgICAgbW92dSAgICBtMSwgW3NyY3EgKzIqd3FdIDsgRklYTUU6IGVuc3VyZSBhbGlnbm1lbnQKKyAgICBwYWRkdyAgIG0xLCBtMAorICAgIHBzcmF3ICAgbTEsIDYKKyAgICBtb3Z1ICAgIG0yLCBbc3JjcSArMip3cSttbXNpemVdIDsgRklYTUU6IGVuc3VyZSBhbGlnbm1lbnQKKyAgICBwYWRkdyAgIG0yLCBtMAorICAgIHBzcmF3ICAgbTIsIDYKKyAgICBwYWRkdyAgIG0xLCBbaWR3dHErMip3cV0KKyAgICBwYWRkdyAgIG0yLCBbaWR3dHErMip3cSttbXNpemVdCisgICAgcGFja3Vzd2IgbTEsIG0yCisgICAgbW92YSAgICBbZHN0cSArd3FdLCBtMQorICAgIGpnICAgICAgLmxvb3AKKworICAgIGxlYSAgIHNyY3EsIFtzcmNxICsgMipzdHJpZGVxXQorICAgIGFkZCAgIGRzdHEsIHN0cmlkZXEKKyAgICBsZWEgIGlkd3RxLCBbaWR3dHErIDIqaWR3dF9zdHJpZGVxXQorICAgIHN1YiAgICAgaGQsIDEKKyAgICBtb3YgICAgIHdkLCB3c3BpbGwKKyAgICBqZyAgICAgIC5sb29wCisgICAgUkVUCislZW5kbQorCislbWFjcm8gQUREX09CTUMgMgorOyB2b2lkIGFkZF9vYm1jKHVpbnQxNl90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgdWludDhfdCAqb2JtY193ZWlnaHQsIGludCB5YmxlbikKK2NnbG9iYWwgYWRkX2RpcmFjX29ibWMlMV8lMiwgNiw2LDUsIGRzdCwgc3JjLCBzdHJpZGUsIG9ibWMsIHlibGVuCisgICAgcHhvciAgICAgICAgbTQsIG00CisubG9vcDoKKyVhc3NpZ24gaSAwCislcmVwICUxIC8gbW1zaXplCisgICAgbW92YSAgICAgICAgbTAsIFtzcmNxK2ldCisgICAgbW92YSAgICAgICAgbTEsIG0wCisgICAgcHVucGNrbGJ3ICAgbTAsIG00CisgICAgcHVucGNraGJ3ICAgbTEsIG00CisgICAgbW92YSAgICAgICAgbTIsIFtvYm1jcStpXQorICAgIG1vdmEgICAgICAgIG0zLCBtMgorICAgcHVucGNrbGJ3ICAgbTIsIG00CisgICAgcHVucGNraGJ3ICAgbTMsIG00CisgICAgcG11bGx3ICAgICAgbTAsIG0yCisgICAgcG11bGx3ICAgICAgbTEsIG0zCisgICAgbW92dSAgICAgICAgbTIsIFtkc3RxKzIqaV0KKyAgICBtb3Z1ICAgICAgICBtMywgW2RzdHErMippK21tc2l6ZV0KKyAgICBwYWRkdyAgICAgICBtMCwgbTIKKyAgICBwYWRkdyAgICAgICBtMSwgbTMKKyAgICBtb3Z1ICAgICAgICBbZHN0cSsyKmldLCBtMAorICAgIG1vdnUgICAgICAgIFtkc3RxKzIqaSttbXNpemVdLCBtMQorJWFzc2lnbiBpIGkrbW1zaXplCislZW5kcmVwCisgICAgbGVhICAgICAgICAgc3JjcSwgW3NyY3Erc3RyaWRlcV0KKyAgICBsZWEgICAgICAgICBkc3RxLCBbZHN0cSsyKnN0cmlkZXFdCisgICAgYWRkICAgICAgICAgb2JtY3EsIDMyCisgICAgc3ViICAgICAgICAgeWJsZW5kLCAxCisgICAgamcgICAgICAgICAgLmxvb3AKKyAgICBSRVQKKyVlbmRtCisKK0lOSVRfTU1YCislaWYgQVJDSF9YODZfNjQgPT0gMAorUFVUX1JFQ1QgbW14CitBRERfUkVDVCBtbXgKKworSFBFTF9GSUxURVIgbW14CitBRERfT0JNQyAzMiwgbW14CitBRERfT0JNQyAxNiwgbW14CislZW5kaWYKK0FERF9PQk1DIDgsIG1teAorCitJTklUX1hNTQorUFVUX1JFQ1Qgc3NlMgorQUREX1JFQ1Qgc3NlMgorCitIUEVMX0ZJTFRFUiBzc2UyCitBRERfT0JNQyAzMiwgc3NlMgorQUREX09CTUMgMTYsIHNzZTIKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kbnhoZGVuYy5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZG54aGRlbmMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDZkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZG54aGRlbmMuYXNtCkBAIC0wLDAgKzEsNDkgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIFZDMy9ETnhIRCBTSU1EIGZ1bmN0aW9ucworOyogQ29weXJpZ2h0IChjKSAyMDA3IEJhcHRpc3RlIENvdWR1cmllciA8YmFwdGlzdGUgZG90IGNvdWR1cmllciBhdCBzbWFydGpvZyBkb3QgY29tPgorOyogQ29weXJpZ2h0IChjKSAyMDE0IFRpYW5jaGVuZyAiVGltb3RoeSIgR3UgPHRpbW90aHlndTk5QGdtYWlsLmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiA1MSwgSW5jLiwgRm91bmRhdGlvbiBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitzZWN0aW9uIC50ZXh0CisKKzsgdm9pZCBnZXRfcGl4ZWxzXzh4NF9zeW1fc3NlMihpbnQxNl90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCitJTklUX1hNTSBzc2UyCitjZ2xvYmFsIGdldF9waXhlbHNfOHg0X3N5bSwgMywzLDUsIGJsb2NrLCBwaXhlbHMsIGxpbmVzaXplCisgICAgcHhvciAgICAgIG00LCAgICAgICBtNAorICAgIG1vdnEgICAgICBtMCwgICAgICAgW3BpeGVsc3FdCisgICAgYWRkICAgICAgIHBpeGVsc3EsICBsaW5lc2l6ZXEKKyAgICBtb3ZxICAgICAgbTEsICAgICAgIFtwaXhlbHNxXQorICAgIG1vdnEgICAgICBtMiwgICAgICAgW3BpeGVsc3ErbGluZXNpemVxXQorICAgIG1vdnEgICAgICBtMywgICAgICAgW3BpeGVsc3ErbGluZXNpemVxKjJdCisgICAgcHVucGNrbGJ3IG0wLCAgICAgICBtNAorICAgIHB1bnBja2xidyBtMSwgICAgICAgbTQKKyAgICBwdW5wY2tsYncgbTIsICAgICAgIG00CisgICAgcHVucGNrbGJ3IG0zLCAgICAgICBtNAorICAgIG1vdmEgIFtibG9ja3EgICAgXSwgbTAKKyAgICBtb3ZhICBbYmxvY2txKzE2IF0sIG0xCisgICAgbW92YSAgW2Jsb2NrcSszMiBdLCBtMgorICAgIG1vdmEgIFtibG9ja3ErNDggXSwgbTMKKyAgICBtb3ZhICBbYmxvY2txKzY0IF0sIG0zCisgICAgbW92YSAgW2Jsb2NrcSs4MCBdLCBtMgorICAgIG1vdmEgIFtibG9ja3ErOTYgXSwgbTEKKyAgICBtb3ZhICBbYmxvY2txKzExMl0sIG0wCisgICAgUkVUCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvZG54aGRlbmNfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RueGhkZW5jX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDZmMTUwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2RueGhkZW5jX2luaXQuYwpAQCAtMCwwICsxLDM3IEBACisvKgorICogVkMzL0ROeEhEIFNJTUQgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZSBkb3QgY291ZHVyaWVyIGF0IHNtYXJ0am9nIGRvdCBjb20+CisgKgorICogVkMtMyBlbmNvZGVyIGZ1bmRlZCBieSB0aGUgQnJpdGlzaCBCcm9hZGNhc3RpbmcgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2RueGhkZW5jLmgiCisKK3ZvaWQgZmZfZ2V0X3BpeGVsc184eDRfc3ltX3NzZTIoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CisKK2F2X2NvbGQgdm9pZCBmZl9kbnhoZGVuY19pbml0X3g4NihETlhIREVuY0NvbnRleHQgKmN0eCkKK3sKKyAgICBpZiAoRVhURVJOQUxfU1NFMihhdl9nZXRfY3B1X2ZsYWdzKCkpKSB7CisgICAgICAgIGlmIChjdHgtPmNpZF90YWJsZS0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICAgICBjdHgtPmdldF9waXhlbHNfOHg0X3N5bSA9IGZmX2dldF9waXhlbHNfOHg0X3N5bV9zc2UyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9kd3RfeWFzbS5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZHd0X3lhc20uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OGFjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZHd0X3lhc20uYXNtCkBAIC0wLDAgKzEsMzA3IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBNTVggb3B0aW1pemVkIGRpc2NyZXRlIHdhdmVsZXQgdHJhc25mb3JtCis7KiBDb3B5cmlnaHQgKGMpIDIwMTAgRGF2aWQgQ29ucmFkCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogNTEsIEluYy4sIEZvdW5kYXRpb24gRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKK3B3XzE5OTE6IHRpbWVzIDQgZHcgOSwtMQorCitjZXh0ZXJuIHB3XzEKK2NleHRlcm4gcHdfMgorY2V4dGVybiBwd184CitjZXh0ZXJuIHB3XzE2CisKK3NlY3Rpb24gLnRleHQKKworOyAlMSAtPSAoJTIgKyAlMyArIDIpPj4yICAgICAlNCBpcyBwd18yCislbWFjcm8gQ09NUE9TRV81M2lMMCA0CisgICAgcGFkZHcgICAlMiwgJTMKKyAgICBwYWRkdyAgICUyLCAlNAorICAgIHBzcmF3ICAgJTIsIDIKKyAgICBwc3VidyAgICUxLCAlMgorJWVuZG0KKworOyBtMSA9ICUxICsgKC1tMCArIDkqbTEgKyA5KiUyIC0lMyArIDgpPj40Cis7IGlmICU0IGlzIHN1cHBsaWVkLCAlMSBpcyBsb2FkZWQgdW5hbGlnbmVkIGZyb20gdGhlcmUKKzsgbTI6IGNsb2JiZXJlZCAgbTM6IHB3XzggIG00OiBwd18xOTkxCislbWFjcm8gQ09NUE9TRV9ERDk3aUgwIDMtNAorICAgIHBhZGR3ICAgbTAsICUzCisgICAgcGFkZHcgICBtMSwgJTIKKyAgICBwc3VidyAgIG0wLCBtMworICAgIG1vdmEgICAgbTIsIG0xCisgICAgcHVucGNrbHdkIG0xLCBtMAorICAgIHB1bnBja2h3ZCBtMiwgbTAKKyAgICBwbWFkZHdkIG0xLCBtNAorICAgIHBtYWRkd2QgbTIsIG00CislaWYgJTAgPiAzCisgICAgbW92dSAgICAlMSwgJTQKKyVlbmRpZgorICAgIHBzcmFkICAgbTEsIDQKKyAgICBwc3JhZCAgIG0yLCA0CisgICAgcGFja3NzZHcgbTEsIG0yCisgICAgcGFkZHcgICBtMSwgJTEKKyVlbmRtCisKKyVtYWNybyBDT01QT1NFX1ZFUlRJQ0FMIDEKKzsgdm9pZCB2ZXJ0aWNhbF9jb21wb3NlNTNpTDAoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQorY2dsb2JhbCB2ZXJ0aWNhbF9jb21wb3NlNTNpTDBfJTEsIDQsNCwxLCBiMCwgYjEsIGIyLCB3aWR0aAorICAgIG1vdmEgICAgbTIsIFtwd18yXQorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92ICAgICB3aWR0aGQsIHdpZHRoZAorJWVuZGlmCisubG9vcDoKKyAgICBzdWIgICAgIHdpZHRocSwgbW1zaXplLzIKKyAgICBtb3ZhICAgIG0xLCBbYjBxKzIqd2lkdGhxXQorICAgIG1vdmEgICAgbTAsIFtiMXErMip3aWR0aHFdCisgICAgQ09NUE9TRV81M2lMMCBtMCwgbTEsIFtiMnErMip3aWR0aHFdLCBtMgorICAgIG1vdmEgICAgW2IxcSsyKndpZHRocV0sIG0wCisgICAgamcgICAgICAubG9vcAorICAgIFJFUF9SRVQKKworOyB2b2lkIHZlcnRpY2FsX2NvbXBvc2VfZGlyYWM1M2lIMChJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgSURXVEVMRU0gKmIyLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCitjZ2xvYmFsIHZlcnRpY2FsX2NvbXBvc2VfZGlyYWM1M2lIMF8lMSwgNCw0LDEsIGIwLCBiMSwgYjIsIHdpZHRoCisgICAgbW92YSAgICBtMSwgW3B3XzFdCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3YgICAgIHdpZHRoZCwgd2lkdGhkCislZW5kaWYKKy5sb29wOgorICAgIHN1YiAgICAgd2lkdGhxLCBtbXNpemUvMgorICAgIG1vdmEgICAgbTAsIFtiMHErMip3aWR0aHFdCisgICAgcGFkZHcgICBtMCwgW2IycSsyKndpZHRocV0KKyAgICBwYWRkdyAgIG0wLCBtMQorICAgIHBzcmF3ICAgbTAsIDEKKyAgICBwYWRkdyAgIG0wLCBbYjFxKzIqd2lkdGhxXQorICAgIG1vdmEgICAgW2IxcSsyKndpZHRocV0sIG0wCisgICAgamcgICAgICAubG9vcAorICAgIFJFUF9SRVQKKworOyB2b2lkIHZlcnRpY2FsX2NvbXBvc2VfZGQ5N2lIMChJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgSURXVEVMRU0gKmIyLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRFdURUxFTSAqYjMsIElEV1RFTEVNICpiNCwgaW50IHdpZHRoKQorY2dsb2JhbCB2ZXJ0aWNhbF9jb21wb3NlX2RkOTdpSDBfJTEsIDYsNiw1LCBiMCwgYjEsIGIyLCBiMywgYjQsIHdpZHRoCisgICAgbW92YSAgICBtMywgW3B3XzhdCisgICAgbW92YSAgICBtNCwgW3B3XzE5OTFdCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3YgICAgIHdpZHRoZCwgd2lkdGhkCislZW5kaWYKKy5sb29wOgorICAgIHN1YiAgICAgd2lkdGhxLCBtbXNpemUvMgorICAgIG1vdmEgICAgbTAsIFtiMHErMip3aWR0aHFdCisgICAgbW92YSAgICBtMSwgW2IxcSsyKndpZHRocV0KKyAgICBDT01QT1NFX0REOTdpSDAgW2IycSsyKndpZHRocV0sIFtiM3ErMip3aWR0aHFdLCBbYjRxKzIqd2lkdGhxXQorICAgIG1vdmEgICAgW2IycSsyKndpZHRocV0sIG0xCisgICAgamcgICAgICAubG9vcAorICAgIFJFUF9SRVQKKworOyB2b2lkIHZlcnRpY2FsX2NvbXBvc2VfZGQxMzdpTDAoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIElEV1RFTEVNICpiMiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEV1RFTEVNICpiMywgSURXVEVMRU0gKmI0LCBpbnQgd2lkdGgpCitjZ2xvYmFsIHZlcnRpY2FsX2NvbXBvc2VfZGQxMzdpTDBfJTEsIDYsNiw2LCBiMCwgYjEsIGIyLCBiMywgYjQsIHdpZHRoCisgICAgbW92YSAgICBtMywgW3B3XzE2XQorICAgIG1vdmEgICAgbTQsIFtwd18xOTkxXQorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92ICAgICB3aWR0aGQsIHdpZHRoZAorJWVuZGlmCisubG9vcDoKKyAgICBzdWIgICAgIHdpZHRocSwgbW1zaXplLzIKKyAgICBtb3ZhICAgIG0wLCBbYjBxKzIqd2lkdGhxXQorICAgIG1vdmEgICAgbTEsIFtiMXErMip3aWR0aHFdCisgICAgbW92YSAgICBtNSwgW2IycSsyKndpZHRocV0KKyAgICBwYWRkdyAgIG0wLCBbYjRxKzIqd2lkdGhxXQorICAgIHBhZGR3ICAgbTEsIFtiM3ErMip3aWR0aHFdCisgICAgcHN1YncgICBtMCwgbTMKKyAgICBtb3ZhICAgIG0yLCBtMQorICAgIHB1bnBja2x3ZCBtMSwgbTAKKyAgICBwdW5wY2tod2QgbTIsIG0wCisgICAgcG1hZGR3ZCBtMSwgbTQKKyAgICBwbWFkZHdkIG0yLCBtNAorICAgIHBzcmFkICAgbTEsIDUKKyAgICBwc3JhZCAgIG0yLCA1CisgICAgcGFja3NzZHcgbTEsIG0yCisgICAgcHN1YncgICBtNSwgbTEKKyAgICBtb3ZhICAgIFtiMnErMip3aWR0aHFdLCBtNQorICAgIGpnICAgICAgLmxvb3AKKyAgICBSRVBfUkVUCisKKzsgdm9pZCB2ZXJ0aWNhbF9jb21wb3NlX2hhYXIoSURXVEVMRU0gKmIwLCBJRFdURUxFTSAqYjEsIGludCB3aWR0aCkKK2NnbG9iYWwgdmVydGljYWxfY29tcG9zZV9oYWFyXyUxLCAzLDQsMywgYjAsIGIxLCB3aWR0aAorICAgIG1vdmEgICAgbTMsIFtwd18xXQorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92ICAgICB3aWR0aGQsIHdpZHRoZAorJWVuZGlmCisubG9vcDoKKyAgICBzdWIgICAgIHdpZHRocSwgbW1zaXplLzIKKyAgICBtb3ZhICAgIG0xLCBbYjFxKzIqd2lkdGhxXQorICAgIG1vdmEgICAgbTAsIFtiMHErMip3aWR0aHFdCisgICAgbW92YSAgICBtMiwgbTEKKyAgICBwYWRkdyAgIG0xLCBtMworICAgIHBzcmF3ICAgbTEsIDEKKyAgICBwc3VidyAgIG0wLCBtMQorICAgIG1vdmEgICAgW2IwcSsyKndpZHRocV0sIG0wCisgICAgcGFkZHcgICBtMiwgbTAKKyAgICBtb3ZhICAgIFtiMXErMip3aWR0aHFdLCBtMgorICAgIGpnICAgICAgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworOyBleHRlbmQgdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzIG9mIHRoZSB0bXAgYXJyYXkgYnkgJTEgYW5kICUyIHJlc3BlY3RpdmVseQorJW1hY3JvIEVER0VfRVhURU5TSU9OIDMKKyAgICBtb3YgICAgICUzLCBbdG1wcV0KKyVhc3NpZ24gJSVpIDEKKyVyZXAgJTEKKyAgICBtb3YgICAgIFt0bXBxLTIqJSVpXSwgJTMKKyAgICAlYXNzaWduICUlaSAlJWkrMQorJWVuZHJlcAorICAgIG1vdiAgICAgJTMsIFt0bXBxKzIqdzJxLTJdCislYXNzaWduICUlaSAwCislcmVwICUyCisgICAgbW92ICAgICBbdG1wcSsyKncycSsyKiUlaV0sICUzCisgICAgJWFzc2lnbiAlJWkgJSVpKzEKKyVlbmRyZXAKKyVlbmRtYWNybworCisKKyVtYWNybyBIQUFSX0hPUklaT05UQUwgMgorOyB2b2lkIGhvcml6b250YWxfY29tcG9zZV9oYWFyaShJRFdURUxFTSAqYiwgSURXVEVMRU0gKnRtcCwgaW50IHdpZHRoKQorY2dsb2JhbCBob3Jpem9udGFsX2NvbXBvc2VfaGFhciUyaV8lMSwgMyw2LDQsIGIsIHRtcCwgdywgeCwgdzIsIGJfdzIKKyAgICBtb3YgICAgdzJkLCB3ZAorICAgIHhvciAgICAgeHEsIHhxCisgICAgc2hyICAgIHcyZCwgMQorICAgIGxlYSAgYl93MnEsIFticSt3cV0KKyAgICBtb3ZhICAgIG0zLCBbcHdfMV0KKy5sb3dwYXNzX2xvb3A6CisgICAgbW92dSAgICBtMSwgW2JfdzJxICsgMip4cV0KKyAgICBtb3ZhICAgIG0wLCBbYnEgICAgKyAyKnhxXQorICAgIHBhZGR3ICAgbTEsIG0zCisgICAgcHNyYXcgICBtMSwgMQorICAgIHBzdWJ3ICAgbTAsIG0xCisgICAgbW92YSAgICBbdG1wcSArIDIqeHFdLCBtMAorICAgIGFkZCAgICAgeHEsIG1tc2l6ZS8yCisgICAgY21wICAgICB4cSwgdzJxCisgICAgamwgICAgICAubG93cGFzc19sb29wCisKKyAgICB4b3IgICAgIHhxLCB4cQorICAgIGFuZCAgICB3MnEsIH4obW1zaXplLzIgLSAxKQorICAgIGNtcCAgICB3MnEsIG1tc2l6ZS8yCisgICAgamwgICAgICAuZW5kCisKKy5oaWdocGFzc19sb29wOgorICAgIG1vdnUgICAgbTEsIFtiX3cycSArIDIqeHFdCisgICAgbW92YSAgICBtMCwgW3RtcHEgICsgMip4cV0KKyAgICBwYWRkdyAgIG0xLCBtMAorCisgICAgOyBzaGlmdCBhbmQgaW50ZXJsZWF2ZQorJWlmICUyID09IDEKKyAgICBwYWRkdyAgIG0wLCBtMworICAgIHBhZGR3ICAgbTEsIG0zCisgICAgcHNyYXcgICBtMCwgMQorICAgIHBzcmF3ICAgbTEsIDEKKyVlbmRpZgorICAgIG1vdmEgICAgbTIsIG0wCisgICAgcHVucGNrbHdkIG0wLCBtMQorICAgIHB1bnBja2h3ZCBtMiwgbTEKKyAgICBtb3ZhICAgIFticSs0KnhxXSwgbTAKKyAgICBtb3ZhICAgIFticSs0KnhxK21tc2l6ZV0sIG0yCisKKyAgICBhZGQgICAgIHhxLCBtbXNpemUvMgorICAgIGNtcCAgICAgeHEsIHcycQorICAgIGpsICAgICAgLmhpZ2hwYXNzX2xvb3AKKy5lbmQ6CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKKworSU5JVF9YTU0KKzsgdm9pZCBob3Jpem9udGFsX2NvbXBvc2VfZGQ5N2koSURXVEVMRU0gKmIsIElEV1RFTEVNICp0bXAsIGludCB3aWR0aCkKK2NnbG9iYWwgaG9yaXpvbnRhbF9jb21wb3NlX2RkOTdpX3Nzc2UzLCAzLDYsOCwgYiwgdG1wLCB3LCB4LCB3MiwgYl93MgorICAgIG1vdiAgICB3MmQsIHdkCisgICAgeG9yICAgICB4ZCwgeGQKKyAgICBzaHIgICAgdzJkLCAxCisgICAgbGVhICBiX3cycSwgW2JxK3dxXQorICAgIG1vdnUgICAgbTQsIFticSt3cV0KKyAgICBtb3ZhICAgIG03LCBbcHdfMl0KKyAgICBwc2xsZHEgIG00LCAxNAorLmxvd3Bhc3NfbG9vcDoKKyAgICBtb3Z1ICAgIG0xLCBbYl93MnEgKyAyKnhxXQorICAgIG1vdmEgICAgbTAsIFticSAgICArIDIqeHFdCisgICAgbW92YSAgICBtMiwgbTEKKyAgICBwYWxpZ25yIG0xLCBtNCwgMTQKKyAgICBtb3ZhICAgIG00LCBtMgorICAgIENPTVBPU0VfNTNpTDAgbTAsIG0xLCBtMiwgbTcKKyAgICBtb3ZhICAgIFt0bXBxICsgMip4cV0sIG0wCisgICAgYWRkICAgICB4ZCwgbW1zaXplLzIKKyAgICBjbXAgICAgIHhkLCB3MmQKKyAgICBqbCAgICAgIC5sb3dwYXNzX2xvb3AKKworICAgIEVER0VfRVhURU5TSU9OIDEsIDIsIHh3CisgICAgOyBsZWF2ZSB0aGUgbGFzdCB1cCB0byA3IChzc2UpIG9yIDMgKG1teCkgdmFsdWVzIGZvciBDCisgICAgeG9yICAgICB4ZCwgeGQKKyAgICBhbmQgICAgdzJkLCB+KG1tc2l6ZS8yIC0gMSkKKyAgICBjbXAgICAgdzJkLCBtbXNpemUvMgorICAgIGpsICAgICAgLmVuZAorCisgICAgbW92YSAgICBtNywgW3RtcHEtbW1zaXplXQorICAgIG1vdmEgICAgbTAsIFt0bXBxXQorICAgIG1vdmEgICAgbTUsIFtwd18xXQorICAgIG1vdmEgICAgbTMsIFtwd184XQorICAgIG1vdmEgICAgbTQsIFtwd18xOTkxXQorLmhpZ2hwYXNzX2xvb3A6CisgICAgbW92YSAgICBtNiwgbTAKKyAgICBwYWxpZ25yIG0wLCBtNywgMTQKKyAgICBtb3ZhICAgIG03LCBbdG1wcSArIDIqeHEgKyAxNl0KKyAgICBtb3ZhICAgIG0xLCBtNworICAgIG1vdmEgICAgbTIsIG03CisgICAgcGFsaWduciBtMSwgbTYsIDIKKyAgICBwYWxpZ25yIG0yLCBtNiwgNAorICAgIENPTVBPU0VfREQ5N2lIMCBtMCwgbTYsIG0yLCBbYl93MnEgKyAyKnhxXQorICAgIG1vdmEgICAgbTAsIG03CisgICAgbW92YSAgICBtNywgbTYKKworICAgIDsgc2hpZnQgYW5kIGludGVybGVhdmUKKyAgICBwYWRkdyAgIG02LCBtNQorICAgIHBhZGR3ICAgbTEsIG01CisgICAgcHNyYXcgICBtNiwgMQorICAgIHBzcmF3ICAgbTEsIDEKKyAgICBtb3ZhICAgIG0yLCBtNgorICAgIHB1bnBja2x3ZCBtNiwgbTEKKyAgICBwdW5wY2tod2QgbTIsIG0xCisgICAgbW92YSAgICBbYnErNCp4cV0sIG02CisgICAgbW92YSAgICBbYnErNCp4cSttbXNpemVdLCBtMgorCisgICAgYWRkICAgICB4ZCwgbW1zaXplLzIKKyAgICBjbXAgICAgIHhkLCB3MmQKKyAgICBqbCAgICAgIC5oaWdocGFzc19sb29wCisuZW5kOgorICAgIFJFUF9SRVQKKworCislaWYgQVJDSF9YODZfNjQgPT0gMAorSU5JVF9NTVgKK0NPTVBPU0VfVkVSVElDQUwgbW14CitIQUFSX0hPUklaT05UQUwgbW14LCAwCitIQUFSX0hPUklaT05UQUwgbW14LCAxCislZW5kaWYKKworOztJTklUX1hNTQorSU5JVF9YTU0KK0NPTVBPU0VfVkVSVElDQUwgc3NlMgorSEFBUl9IT1JJWk9OVEFMIHNzZTIsIDAKK0hBQVJfSE9SSVpPTlRBTCBzc2UyLCAxCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmRjdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZkY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTI1NjZkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZkY3QuYwpAQCAtMCwwICsxLDU5NCBAQAorLyoKKyAqIFNJTUQtb3B0aW1pemVkIGZvcndhcmQgRENUCisgKiBUaGUgZ2NjIHBvcnRpbmcgaXMgQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZC4KKyAqIGNsZWFudXAvb3B0aW1pemF0aW9ucyBhcmUgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIFNTRTIgb3B0aW1pemF0aW9uIGlzIENvcHlyaWdodCAoYykgMjAwNCBEZW5lcyBCYWxhdG9uaS4KKyAqCisgKiBmcm9tICBmZGN0YW0zMi5jIC0gQVA5MjIgTU1YKDNELU5vdykgZm9yd2FyZC1EQ1QKKyAqCisgKiAgSW50ZWwgQXBwbGljYXRpb24gTm90ZSBBUC05MjIgLSBmYXN0LCBwcmVjaXNlIGltcGxlbWVudGF0aW9uIG9mIERDVAorICogICAgICAgIGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL3Z0dW5lL2NidHMvYXBwbm90ZXMuaHRtCisgKgorICogQWxzbyBvZiBpbnNwaXJhdGlvbjoKKyAqIGEgcGFnZSBhYm91dCBmZGN0IGF0IGh0dHA6Ly93d3cuZ2VvY2l0aWVzLmNvbS9zc2F2ZWthci9kY3QuaHRtCisgKiBTa2FsJ3MgZmRjdCBhdCBodHRwOi8vc2thbC5wbGFuZXQtZC5uZXQvY29kaW5nL2RjdC5odG1sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJmZGN0LmgiCisKKyNpZiBIQVZFX01NWF9JTkxJTkUKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIGNvbnN0YW50cyBmb3IgdGhlIGZvcndhcmQgRENUCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEJlIHN1cmUgdG8gY2hlY2sgdGhhdCB5b3VyIGNvbXBpbGVyIGlzIGFsaWduaW5nIGFsbCBjb25zdGFudHMgdG8gUVdPUkQKKy8vICg4LWJ5dGUpIG1lbW9yeSBib3VuZGFyaWVzISAgT3RoZXJ3aXNlIHRoZSB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyB3aWxsCisvLyBzZXZlcmVseSBzdGFsbCBNTVggZXhlY3V0aW9uLgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBCSVRTX0ZSV19BQ0MgICAzIC8vOyAyIG9yIDMgZm9yIGFjY3VyYWN5CisjZGVmaW5lIFNISUZUX0ZSV19DT0wgIEJJVFNfRlJXX0FDQworI2RlZmluZSBTSElGVF9GUldfUk9XICAoQklUU19GUldfQUNDICsgMTcgLSAzKQorI2RlZmluZSBSTkRfRlJXX1JPVyAgICAoMSA8PCAoU0hJRlRfRlJXX1JPVy0xKSkKKy8vI2RlZmluZSBSTkRfRlJXX0NPTCAgICAoMSA8PCAoU0hJRlRfRlJXX0NPTC0xKSkKKworI2RlZmluZSBYOCh4KSB4LHgseCx4LHgseCx4LHgKKworLy9jb25jYXRlbmF0ZWQgdGFibGUsIGZvciBmb3J3YXJkIERDVCB0cmFuc2Zvcm1hdGlvbgorREVDTEFSRV9BTElHTkVEKDE2LCBzdGF0aWMgY29uc3QgaW50MTZfdCwgZmRjdF90Z19hbGxfMTYpWzI0XSA9IHsKKyAgICBYOCgxMzAzNiksICAvLyB0ZyAqICgyPDwxNikgKyAwLjUKKyAgICBYOCgyNzE0NiksICAvLyB0ZyAqICgyPDwxNikgKyAwLjUKKyAgICBYOCgtMjE3NDYpICAvLyB0ZyAqICgyPDwxNikgKyAwLjUKK307CisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGNvbnN0IGludDE2X3QsIG9jb3NfNF8xNilbOF0gPSB7CisgICAgWDgoMjMxNzApICAgLy9jb3MgKiAoMjw8MTUpICsgMC41Cit9OworCitERUNMQVJFX0FMSUdORUQoMTYsIHN0YXRpYyBjb25zdCBpbnQxNl90LCBmZGN0X29uZV9jb3JyKVs4XSA9IHsgWDgoMSkgfTsKKworREVDTEFSRV9BTElHTkVEKDgsIHN0YXRpYyBjb25zdCBpbnQzMl90LCBmZGN0X3Jfcm93KVsyXSA9IHtSTkRfRlJXX1JPVywgUk5EX0ZSV19ST1cgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdAoreworIERFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgaW50MzJfdCwgZmRjdF9yX3Jvd19zc2UyKVs0XTsKK30gZmRjdF9yX3Jvd19zc2UyID0KK3t7CisgUk5EX0ZSV19ST1csIFJORF9GUldfUk9XLCBSTkRfRlJXX1JPVywgUk5EX0ZSV19ST1cKK319OworLy9ERUNMQVJFX0FMSUdORUQoMTYsIHN0YXRpYyBjb25zdCBsb25nLCBmZGN0X3Jfcm93X3NzZTIpWzRdID0ge1JORF9GUldfUk9XLCBSTkRfRlJXX1JPVywgUk5EX0ZSV19ST1csIFJORF9GUldfUk9XfTsKKworREVDTEFSRV9BTElHTkVEKDgsIHN0YXRpYyBjb25zdCBpbnQxNl90LCB0YWJfZnJ3XzAxMjM0NTY3KVtdID0geyAgLy8gZm9yd2FyZF9kY3QgY29lZmYgdGFibGUKKyAgMTYzODQsICAgMTYzODQsICAgMjI3MjUsICAgMTkyNjYsCisgIDE2Mzg0LCAgIDE2Mzg0LCAgIDEyODczLCAgICA0NTIwLAorICAyMTQwNywgICAgODg2NywgICAxOTI2NiwgICAtNDUyMCwKKyAgLTg4NjcsICAtMjE0MDcsICAtMjI3MjUsICAtMTI4NzMsCisgIDE2Mzg0LCAgLTE2Mzg0LCAgIDEyODczLCAgLTIyNzI1LAorIC0xNjM4NCwgICAxNjM4NCwgICAgNDUyMCwgICAxOTI2NiwKKyAgIDg4NjcsICAtMjE0MDcsICAgIDQ1MjAsICAtMTI4NzMsCisgIDIxNDA3LCAgIC04ODY3LCAgIDE5MjY2LCAgLTIyNzI1LAorCisgIDIyNzI1LCAgIDIyNzI1LCAgIDMxNTIxLCAgIDI2NzIyLAorICAyMjcyNSwgICAyMjcyNSwgICAxNzg1NSwgICAgNjI3MCwKKyAgMjk2OTIsICAgMTIyOTksICAgMjY3MjIsICAgLTYyNzAsCisgLTEyMjk5LCAgLTI5NjkyLCAgLTMxNTIxLCAgLTE3ODU1LAorICAyMjcyNSwgIC0yMjcyNSwgICAxNzg1NSwgIC0zMTUyMSwKKyAtMjI3MjUsICAgMjI3MjUsICAgIDYyNzAsICAgMjY3MjIsCisgIDEyMjk5LCAgLTI5NjkyLCAgICA2MjcwLCAgLTE3ODU1LAorICAyOTY5MiwgIC0xMjI5OSwgICAyNjcyMiwgIC0zMTUyMSwKKworICAyMTQwNywgICAyMTQwNywgICAyOTY5MiwgICAyNTE3MiwKKyAgMjE0MDcsICAgMjE0MDcsICAgMTY4MTksICAgIDU5MDYsCisgIDI3OTY5LCAgIDExNTg1LCAgIDI1MTcyLCAgIC01OTA2LAorIC0xMTU4NSwgIC0yNzk2OSwgIC0yOTY5MiwgIC0xNjgxOSwKKyAgMjE0MDcsICAtMjE0MDcsICAgMTY4MTksICAtMjk2OTIsCisgLTIxNDA3LCAgIDIxNDA3LCAgICA1OTA2LCAgIDI1MTcyLAorICAxMTU4NSwgIC0yNzk2OSwgICAgNTkwNiwgIC0xNjgxOSwKKyAgMjc5NjksICAtMTE1ODUsICAgMjUxNzIsICAtMjk2OTIsCisKKyAgMTkyNjYsICAgMTkyNjYsICAgMjY3MjIsICAgMjI2NTQsCisgIDE5MjY2LCAgIDE5MjY2LCAgIDE1MTM3LCAgICA1MzE1LAorICAyNTE3MiwgICAxMDQyNiwgICAyMjY1NCwgICAtNTMxNSwKKyAtMTA0MjYsICAtMjUxNzIsICAtMjY3MjIsICAtMTUxMzcsCisgIDE5MjY2LCAgLTE5MjY2LCAgIDE1MTM3LCAgLTI2NzIyLAorIC0xOTI2NiwgICAxOTI2NiwgICAgNTMxNSwgICAyMjY1NCwKKyAgMTA0MjYsICAtMjUxNzIsICAgIDUzMTUsICAtMTUxMzcsCisgIDI1MTcyLCAgLTEwNDI2LCAgIDIyNjU0LCAgLTI2NzIyLAorCisgIDE2Mzg0LCAgIDE2Mzg0LCAgIDIyNzI1LCAgIDE5MjY2LAorICAxNjM4NCwgICAxNjM4NCwgICAxMjg3MywgICAgNDUyMCwKKyAgMjE0MDcsICAgIDg4NjcsICAgMTkyNjYsICAgLTQ1MjAsCisgIC04ODY3LCAgLTIxNDA3LCAgLTIyNzI1LCAgLTEyODczLAorICAxNjM4NCwgIC0xNjM4NCwgICAxMjg3MywgIC0yMjcyNSwKKyAtMTYzODQsICAgMTYzODQsICAgIDQ1MjAsICAgMTkyNjYsCisgICA4ODY3LCAgLTIxNDA3LCAgICA0NTIwLCAgLTEyODczLAorICAyMTQwNywgICAtODg2NywgICAxOTI2NiwgIC0yMjcyNSwKKworICAxOTI2NiwgICAxOTI2NiwgICAyNjcyMiwgICAyMjY1NCwKKyAgMTkyNjYsICAgMTkyNjYsICAgMTUxMzcsICAgIDUzMTUsCisgIDI1MTcyLCAgIDEwNDI2LCAgIDIyNjU0LCAgIC01MzE1LAorIC0xMDQyNiwgIC0yNTE3MiwgIC0yNjcyMiwgIC0xNTEzNywKKyAgMTkyNjYsICAtMTkyNjYsICAgMTUxMzcsICAtMjY3MjIsCisgLTE5MjY2LCAgIDE5MjY2LCAgICA1MzE1LCAgIDIyNjU0LAorICAxMDQyNiwgIC0yNTE3MiwgICAgNTMxNSwgIC0xNTEzNywKKyAgMjUxNzIsICAtMTA0MjYsICAgMjI2NTQsICAtMjY3MjIsCisKKyAgMjE0MDcsICAgMjE0MDcsICAgMjk2OTIsICAgMjUxNzIsCisgIDIxNDA3LCAgIDIxNDA3LCAgIDE2ODE5LCAgICA1OTA2LAorICAyNzk2OSwgICAxMTU4NSwgICAyNTE3MiwgICAtNTkwNiwKKyAtMTE1ODUsICAtMjc5NjksICAtMjk2OTIsICAtMTY4MTksCisgIDIxNDA3LCAgLTIxNDA3LCAgIDE2ODE5LCAgLTI5NjkyLAorIC0yMTQwNywgICAyMTQwNywgICAgNTkwNiwgICAyNTE3MiwKKyAgMTE1ODUsICAtMjc5NjksICAgIDU5MDYsICAtMTY4MTksCisgIDI3OTY5LCAgLTExNTg1LCAgIDI1MTcyLCAgLTI5NjkyLAorCisgIDIyNzI1LCAgIDIyNzI1LCAgIDMxNTIxLCAgIDI2NzIyLAorICAyMjcyNSwgICAyMjcyNSwgICAxNzg1NSwgICAgNjI3MCwKKyAgMjk2OTIsICAgMTIyOTksICAgMjY3MjIsICAgLTYyNzAsCisgLTEyMjk5LCAgLTI5NjkyLCAgLTMxNTIxLCAgLTE3ODU1LAorICAyMjcyNSwgIC0yMjcyNSwgICAxNzg1NSwgIC0zMTUyMSwKKyAtMjI3MjUsICAgMjI3MjUsICAgIDYyNzAsICAgMjY3MjIsCisgIDEyMjk5LCAgLTI5NjkyLCAgICA2MjcwLCAgLTE3ODU1LAorICAyOTY5MiwgIC0xMjI5OSwgICAyNjcyMiwgIC0zMTUyMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKyBERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IGludDE2X3QsIHRhYl9mcndfMDEyMzQ1Njdfc3NlMilbMjU2XTsKK30gdGFiX2Zyd18wMTIzNDU2N19zc2UyID0KK3t7CisvL0RFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGNvbnN0IGludDE2X3QsIHRhYl9mcndfMDEyMzQ1Njdfc3NlMilbXSA9IHsgIC8vIGZvcndhcmRfZGN0IGNvZWZmIHRhYmxlCisjZGVmaW5lIFRBQkxFX1NTRTIgQzQsICBDNCwgIEMxLCAgQzMsIC1DNiwgLUMyLCAtQzEsIC1DNSwgXAorICAgICAgICAgICAgICAgICAgIEM0LCAgQzQsICBDNSwgIEM3LCAgQzIsICBDNiwgIEMzLCAtQzcsIFwKKyAgICAgICAgICAgICAgICAgIC1DNCwgIEM0LCAgQzcsICBDMywgIEM2LCAtQzIsICBDNywgLUM1LCBcCisgICAgICAgICAgICAgICAgICAgQzQsIC1DNCwgIEM1LCAtQzEsICBDMiwgLUM2LCAgQzMsIC1DMSwKKy8vIGMxLi5jNyAqIGNvcyhwaS80KSAqIDJeMTUKKyNkZWZpbmUgQzEgMjI3MjUKKyNkZWZpbmUgQzIgMjE0MDcKKyNkZWZpbmUgQzMgMTkyNjYKKyNkZWZpbmUgQzQgMTYzODQKKyNkZWZpbmUgQzUgMTI4NzMKKyNkZWZpbmUgQzYgODg2NworI2RlZmluZSBDNyA0NTIwCitUQUJMRV9TU0UyCisKKyN1bmRlZiBDMQorI3VuZGVmIEMyCisjdW5kZWYgQzMKKyN1bmRlZiBDNAorI3VuZGVmIEM1CisjdW5kZWYgQzYKKyN1bmRlZiBDNworI2RlZmluZSBDMSAzMTUyMQorI2RlZmluZSBDMiAyOTY5MgorI2RlZmluZSBDMyAyNjcyMgorI2RlZmluZSBDNCAyMjcyNQorI2RlZmluZSBDNSAxNzg1NQorI2RlZmluZSBDNiAxMjI5OQorI2RlZmluZSBDNyA2MjcwCitUQUJMRV9TU0UyCisKKyN1bmRlZiBDMQorI3VuZGVmIEMyCisjdW5kZWYgQzMKKyN1bmRlZiBDNAorI3VuZGVmIEM1CisjdW5kZWYgQzYKKyN1bmRlZiBDNworI2RlZmluZSBDMSAyOTY5MgorI2RlZmluZSBDMiAyNzk2OQorI2RlZmluZSBDMyAyNTE3MgorI2RlZmluZSBDNCAyMTQwNworI2RlZmluZSBDNSAxNjgxOQorI2RlZmluZSBDNiAxMTU4NQorI2RlZmluZSBDNyA1OTA2CitUQUJMRV9TU0UyCisKKyN1bmRlZiBDMQorI3VuZGVmIEMyCisjdW5kZWYgQzMKKyN1bmRlZiBDNAorI3VuZGVmIEM1CisjdW5kZWYgQzYKKyN1bmRlZiBDNworI2RlZmluZSBDMSAyNjcyMgorI2RlZmluZSBDMiAyNTE3MgorI2RlZmluZSBDMyAyMjY1NAorI2RlZmluZSBDNCAxOTI2NgorI2RlZmluZSBDNSAxNTEzNworI2RlZmluZSBDNiAxMDQyNgorI2RlZmluZSBDNyA1MzE1CitUQUJMRV9TU0UyCisKKyN1bmRlZiBDMQorI3VuZGVmIEMyCisjdW5kZWYgQzMKKyN1bmRlZiBDNAorI3VuZGVmIEM1CisjdW5kZWYgQzYKKyN1bmRlZiBDNworI2RlZmluZSBDMSAyMjcyNQorI2RlZmluZSBDMiAyMTQwNworI2RlZmluZSBDMyAxOTI2NgorI2RlZmluZSBDNCAxNjM4NAorI2RlZmluZSBDNSAxMjg3MworI2RlZmluZSBDNiA4ODY3CisjZGVmaW5lIEM3IDQ1MjAKK1RBQkxFX1NTRTIKKworI3VuZGVmIEMxCisjdW5kZWYgQzIKKyN1bmRlZiBDMworI3VuZGVmIEM0CisjdW5kZWYgQzUKKyN1bmRlZiBDNgorI3VuZGVmIEM3CisjZGVmaW5lIEMxIDI2NzIyCisjZGVmaW5lIEMyIDI1MTcyCisjZGVmaW5lIEMzIDIyNjU0CisjZGVmaW5lIEM0IDE5MjY2CisjZGVmaW5lIEM1IDE1MTM3CisjZGVmaW5lIEM2IDEwNDI2CisjZGVmaW5lIEM3IDUzMTUKK1RBQkxFX1NTRTIKKworI3VuZGVmIEMxCisjdW5kZWYgQzIKKyN1bmRlZiBDMworI3VuZGVmIEM0CisjdW5kZWYgQzUKKyN1bmRlZiBDNgorI3VuZGVmIEM3CisjZGVmaW5lIEMxIDI5NjkyCisjZGVmaW5lIEMyIDI3OTY5CisjZGVmaW5lIEMzIDI1MTcyCisjZGVmaW5lIEM0IDIxNDA3CisjZGVmaW5lIEM1IDE2ODE5CisjZGVmaW5lIEM2IDExNTg1CisjZGVmaW5lIEM3IDU5MDYKK1RBQkxFX1NTRTIKKworI3VuZGVmIEMxCisjdW5kZWYgQzIKKyN1bmRlZiBDMworI3VuZGVmIEM0CisjdW5kZWYgQzUKKyN1bmRlZiBDNgorI3VuZGVmIEM3CisjZGVmaW5lIEMxIDMxNTIxCisjZGVmaW5lIEMyIDI5NjkyCisjZGVmaW5lIEMzIDI2NzIyCisjZGVmaW5lIEM0IDIyNzI1CisjZGVmaW5lIEM1IDE3ODU1CisjZGVmaW5lIEM2IDEyMjk5CisjZGVmaW5lIEM3IDYyNzAKK1RBQkxFX1NTRTIKK319OworCisjZGVmaW5lIFMocykgQVZfVE9TVFJJTkcocykgLy9BVl9TVFJJTkdJRlkgaXMgdG9vIGxvbmcKKworI2RlZmluZSBGRENUX0NPTChjcHUsIG1tLCBtb3YpXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmZGN0X2NvbF8jI2NwdShjb25zdCBpbnQxNl90ICppbiwgaW50MTZfdCAqb3V0LCBpbnQgb2Zmc2V0KVwKK3tcCisgICAgX19hc21fXyB2b2xhdGlsZSAoXAorICAgICAgICAjbW92IiAgICAgIDE2KCUwKSwgICUlIiNtbSIwIFxuXHQiIFwKKyAgICAgICAgI21vdiIgICAgICA5NiglMCksICAlJSIjbW0iMSBcblx0IiBcCisgICAgICAgICNtb3YiICAgICUlIiNtbSIwLCAgJSUiI21tIjIgXG5cdCIgXAorICAgICAgICAjbW92IiAgICAgIDMyKCUwKSwgICUlIiNtbSIzIFxuXHQiIFwKKyAgICAgICAgInBhZGRzdyAgJSUiI21tIjEsICAlJSIjbW0iMCBcblx0IiBcCisgICAgICAgICNtb3YiICAgICAgODAoJTApLCAgJSUiI21tIjQgXG5cdCIgXAorICAgICAgICAicHNsbHcgICQiUyhTSElGVF9GUldfQ09MKSIsICUlIiNtbSIwIFxuXHQiIFwKKyAgICAgICAgI21vdiIgICAgICAgICglMCksICAlJSIjbW0iNSBcblx0IiBcCisgICAgICAgICJwYWRkc3cgICUlIiNtbSIzLCAgJSUiI21tIjQgXG5cdCIgXAorICAgICAgICAicGFkZHN3ICAgMTEyKCUwKSwgICUlIiNtbSI1IFxuXHQiIFwKKyAgICAgICAgInBzbGx3ICAkIlMoU0hJRlRfRlJXX0NPTCkiLCAlJSIjbW0iNCBcblx0IiBcCisgICAgICAgICNtb3YiICAgICUlIiNtbSIwLCAgJSUiI21tIjYgXG5cdCIgXAorICAgICAgICAicHN1YnN3ICAlJSIjbW0iMSwgICUlIiNtbSIyIFxuXHQiIFwKKyAgICAgICAgI21vdiIgICAgICAxNiglMSksICAlJSIjbW0iMSBcblx0IiBcCisgICAgICAgICJwc3Vic3cgICUlIiNtbSI0LCAgJSUiI21tIjAgXG5cdCIgXAorICAgICAgICAjbW92IiAgICAgIDQ4KCUwKSwgICUlIiNtbSI3IFxuXHQiIFwKKyAgICAgICAgInBtdWxodyAgJSUiI21tIjAsICAlJSIjbW0iMSBcblx0IiBcCisgICAgICAgICJwYWRkc3cgICAgNjQoJTApLCAgJSUiI21tIjcgXG5cdCIgXAorICAgICAgICAicHNsbHcgICQiUyhTSElGVF9GUldfQ09MKSIsICUlIiNtbSI1IFxuXHQiIFwKKyAgICAgICAgInBhZGRzdyAgJSUiI21tIjQsICAlJSIjbW0iNiBcblx0IiBcCisgICAgICAgICJwc2xsdyAgJCJTKFNISUZUX0ZSV19DT0wpIiwgJSUiI21tIjcgXG5cdCIgXAorICAgICAgICAjbW92IiAgICAlJSIjbW0iNSwgICUlIiNtbSI0IFxuXHQiIFwKKyAgICAgICAgInBzdWJzdyAgJSUiI21tIjcsICAlJSIjbW0iNSBcblx0IiBcCisgICAgICAgICJwYWRkc3cgICUlIiNtbSI1LCAgJSUiI21tIjEgXG5cdCIgXAorICAgICAgICAicGFkZHN3ICAlJSIjbW0iNywgICUlIiNtbSI0IFxuXHQiIFwKKyAgICAgICAgInBvciAgICAgICAgICglMiksICAlJSIjbW0iMSBcblx0IiBcCisgICAgICAgICJwc2xsdyAgJCJTKFNISUZUX0ZSV19DT0wpIisxLCAlJSIjbW0iMiBcblx0IiBcCisgICAgICAgICJwbXVsaHcgICAgMTYoJTEpLCAgJSUiI21tIjUgXG5cdCIgXAorICAgICAgICAjbW92IiAgICAlJSIjbW0iNCwgICUlIiNtbSI3IFxuXHQiIFwKKyAgICAgICAgInBzdWJzdyAgICA4MCglMCksICAlJSIjbW0iMyBcblx0IiBcCisgICAgICAgICJwc3Vic3cgICUlIiNtbSI2LCAgJSUiI21tIjQgXG5cdCIgXAorICAgICAgICAjbW92IiAgICAlJSIjbW0iMSwgICAgMzIoJTMpIFxuXHQiIFwKKyAgICAgICAgInBhZGRzdyAgJSUiI21tIjYsICAlJSIjbW0iNyBcblx0IiBcCisgICAgICAgICNtb3YiICAgICAgNDgoJTApLCAgJSUiI21tIjEgXG5cdCIgXAorICAgICAgICAicHNsbHcgICQiUyhTSElGVF9GUldfQ09MKSIrMSwgJSUiI21tIjMgXG5cdCIgXAorICAgICAgICAicHN1YnN3ICAgIDY0KCUwKSwgICUlIiNtbSIxIFxuXHQiIFwKKyAgICAgICAgI21vdiIgICAgJSUiI21tIjIsICAlJSIjbW0iNiBcblx0IiBcCisgICAgICAgICNtb3YiICAgICUlIiNtbSI0LCAgICA2NCglMykgXG5cdCIgXAorICAgICAgICAicGFkZHN3ICAlJSIjbW0iMywgICUlIiNtbSIyIFxuXHQiIFwKKyAgICAgICAgInBtdWxodyAgICAgICglNCksICAlJSIjbW0iMiBcblx0IiBcCisgICAgICAgICJwc3Vic3cgICUlIiNtbSIzLCAgJSUiI21tIjYgXG5cdCIgXAorICAgICAgICAicG11bGh3ICAgICAgKCU0KSwgICUlIiNtbSI2IFxuXHQiIFwKKyAgICAgICAgInBzdWJzdyAgJSUiI21tIjAsICAlJSIjbW0iNSBcblx0IiBcCisgICAgICAgICJwb3IgICAgICAgICAoJTIpLCAgJSUiI21tIjUgXG5cdCIgXAorICAgICAgICAicHNsbHcgICQiUyhTSElGVF9GUldfQ09MKSIsICUlIiNtbSIxIFxuXHQiIFwKKyAgICAgICAgInBvciAgICAgICAgICglMiksICAlJSIjbW0iMiBcblx0IiBcCisgICAgICAgICNtb3YiICAgICUlIiNtbSIxLCAgJSUiI21tIjQgXG5cdCIgXAorICAgICAgICAjbW92IiAgICAgICAgKCUwKSwgICUlIiNtbSIzIFxuXHQiIFwKKyAgICAgICAgInBhZGRzdyAgJSUiI21tIjYsICAlJSIjbW0iMSBcblx0IiBcCisgICAgICAgICJwc3Vic3cgICAxMTIoJTApLCAgJSUiI21tIjMgXG5cdCIgXAorICAgICAgICAicHN1YnN3ICAlJSIjbW0iNiwgICUlIiNtbSI0IFxuXHQiIFwKKyAgICAgICAgI21vdiIgICAgICAgICglMSksICAlJSIjbW0iMCBcblx0IiBcCisgICAgICAgICJwc2xsdyAgJCJTKFNISUZUX0ZSV19DT0wpIiwgJSUiI21tIjMgXG5cdCIgXAorICAgICAgICAjbW92IiAgICAgIDMyKCUxKSwgICUlIiNtbSI2IFxuXHQiIFwKKyAgICAgICAgInBtdWxodyAgJSUiI21tIjEsICAlJSIjbW0iMCBcblx0IiBcCisgICAgICAgICNtb3YiICAgICUlIiNtbSI3LCAgICAgICglMykgXG5cdCIgXAorICAgICAgICAicG11bGh3ICAlJSIjbW0iNCwgICUlIiNtbSI2IFxuXHQiIFwKKyAgICAgICAgI21vdiIgICAgJSUiI21tIjUsICAgIDk2KCUzKSBcblx0IiBcCisgICAgICAgICNtb3YiICAgICUlIiNtbSIzLCAgJSUiI21tIjcgXG5cdCIgXAorICAgICAgICAjbW92IiAgICAgIDMyKCUxKSwgICUlIiNtbSI1IFxuXHQiIFwKKyAgICAgICAgInBzdWJzdyAgJSUiI21tIjIsICAlJSIjbW0iNyBcblx0IiBcCisgICAgICAgICJwYWRkc3cgICUlIiNtbSIyLCAgJSUiI21tIjMgXG5cdCIgXAorICAgICAgICAicG11bGh3ICAlJSIjbW0iNywgICUlIiNtbSI1IFxuXHQiIFwKKyAgICAgICAgInBhZGRzdyAgJSUiI21tIjMsICAlJSIjbW0iMCBcblx0IiBcCisgICAgICAgICJwYWRkc3cgICUlIiNtbSI0LCAgJSUiI21tIjYgXG5cdCIgXAorICAgICAgICAicG11bGh3ICAgICAgKCUxKSwgICUlIiNtbSIzIFxuXHQiIFwKKyAgICAgICAgInBvciAgICAgICAgICglMiksICAlJSIjbW0iMCBcblx0IiBcCisgICAgICAgICJwYWRkc3cgICUlIiNtbSI3LCAgJSUiI21tIjUgXG5cdCIgXAorICAgICAgICAicHN1YnN3ICAlJSIjbW0iNiwgICUlIiNtbSI3IFxuXHQiIFwKKyAgICAgICAgI21vdiIgICAgJSUiI21tIjAsICAgIDE2KCUzKSBcblx0IiBcCisgICAgICAgICJwYWRkc3cgICUlIiNtbSI0LCAgJSUiI21tIjUgXG5cdCIgXAorICAgICAgICAjbW92IiAgICAlJSIjbW0iNywgICAgNDgoJTMpIFxuXHQiIFwKKyAgICAgICAgInBzdWJzdyAgJSUiI21tIjEsICAlJSIjbW0iMyBcblx0IiBcCisgICAgICAgICNtb3YiICAgICUlIiNtbSI1LCAgICA4MCglMykgXG5cdCIgXAorICAgICAgICAjbW92IiAgICAlJSIjbW0iMywgICAxMTIoJTMpIFxuXHQiIFwKKyAgICAgICAgOiBcCisgICAgICAgIDogInIiIChpbiAgKyBvZmZzZXQpLCAiciIgKGZkY3RfdGdfYWxsXzE2KSwgInIiIChmZGN0X29uZV9jb3JyKSwgXAorICAgICAgICAgICJyIiAob3V0ICsgb2Zmc2V0KSwgInIiIChvY29zXzRfMTYpKTsgXAorfQorCitGRENUX0NPTChtbXgsIG1tLCBtb3ZxKQorRkRDVF9DT0woc3NlMiwgeG1tLCBtb3ZkcWEpCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmRjdF9yb3dfc3NlMihjb25zdCBpbnQxNl90ICppbiwgaW50MTZfdCAqb3V0KQoreworICAgIF9fYXNtX18gdm9sYXRpbGUoCisjZGVmaW5lIEZEQ1RfUk9XX1NTRTJfSDEoaSx0KSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92cSAgICAgICIgI2kgIiglMCksICUleG1tMiAgICAgIFxuXHQiIFwKKyAgICAgICAgIm1vdnEgICAgICAiICNpICIrOCglMCksICUleG1tMCAgICBcblx0IiBcCisgICAgICAgICJtb3ZkcWEgICAgIiAjdCAiKzMyKCUxKSwgJSV4bW0zICAgXG5cdCIgXAorICAgICAgICAibW92ZHFhICAgICIgI3QgIis0OCglMSksICUleG1tNyAgIFxuXHQiIFwKKyAgICAgICAgIm1vdmRxYSAgICAiICN0ICIoJTEpLCAlJXhtbTQgICAgICBcblx0IiBcCisgICAgICAgICJtb3ZkcWEgICAgIiAjdCAiKzE2KCUxKSwgJSV4bW01ICAgXG5cdCIKKworI2RlZmluZSBGRENUX1JPV19TU0UyX0gyKGksdCkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgICAgICAiICNpICIoJTApLCAlJXhtbTIgICAgICBcblx0IiBcCisgICAgICAgICJtb3ZxICAgICAgIiAjaSAiKzgoJTApLCAlJXhtbTAgICAgXG5cdCIgXAorICAgICAgICAibW92ZHFhICAgICIgI3QgIiszMiglMSksICUleG1tMyAgIFxuXHQiIFwKKyAgICAgICAgIm1vdmRxYSAgICAiICN0ICIrNDgoJTEpLCAlJXhtbTcgICBcblx0IgorCisjZGVmaW5lIEZEQ1RfUk9XX1NTRTIoaSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92cSAgICAgICUleG1tMiwgJSV4bW0xICAgICAgIFxuXHQiIFwKKyAgICAgICAgInBzaHVmbHcgICAkMjcsICUleG1tMCwgJSV4bW0wICBcblx0IiBcCisgICAgICAgICJwYWRkc3cgICAgJSV4bW0wLCAlJXhtbTEgICAgICAgXG5cdCIgXAorICAgICAgICAicHN1YnN3ICAgICUleG1tMCwgJSV4bW0yICAgICAgIFxuXHQiIFwKKyAgICAgICAgInB1bnBja2xkcSAlJXhtbTIsICUleG1tMSAgICAgICBcblx0IiBcCisgICAgICAgICJwc2h1ZmQgICAgJDc4LCAlJXhtbTEsICUleG1tMiAgXG5cdCIgXAorICAgICAgICAicG1hZGR3ZCAgICUleG1tMiwgJSV4bW0zICAgICAgIFxuXHQiIFwKKyAgICAgICAgInBtYWRkd2QgICAlJXhtbTEsICUleG1tNyAgICAgICBcblx0IiBcCisgICAgICAgICJwbWFkZHdkICAgJSV4bW01LCAlJXhtbTIgICAgICAgXG5cdCIgXAorICAgICAgICAicG1hZGR3ZCAgICUleG1tNCwgJSV4bW0xICAgICAgIFxuXHQiIFwKKyAgICAgICAgInBhZGRkICAgICAlJXhtbTcsICUleG1tMyAgICAgICBcblx0IiBcCisgICAgICAgICJwYWRkZCAgICAgJSV4bW0yLCAlJXhtbTEgICAgICAgXG5cdCIgXAorICAgICAgICAicGFkZGQgICAgICUleG1tNiwgJSV4bW0zICAgICAgIFxuXHQiIFwKKyAgICAgICAgInBhZGRkICAgICAlJXhtbTYsICUleG1tMSAgICAgICBcblx0IiBcCisgICAgICAgICJwc3JhZCAgICAgJTMsICUleG1tMyAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAicHNyYWQgICAgICUzLCAlJXhtbTEgICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgInBhY2tzc2R3ICAlJXhtbTMsICUleG1tMSAgICAgICBcblx0IiBcCisgICAgICAgICJtb3ZkcWEgICAgJSV4bW0xLCAiICNpICIoJTQpICAgXG5cdCIKKworICAgICAgICAibW92ZHFhICAgICglMiksICUleG1tNiAgICAgICAgIFxuXHQiCisgICAgICAgIEZEQ1RfUk9XX1NTRTJfSDEoMCwwKQorICAgICAgICBGRENUX1JPV19TU0UyKDApCisgICAgICAgIEZEQ1RfUk9XX1NTRTJfSDIoNjQsMCkKKyAgICAgICAgRkRDVF9ST1dfU1NFMig2NCkKKworICAgICAgICBGRENUX1JPV19TU0UyX0gxKDE2LDY0KQorICAgICAgICBGRENUX1JPV19TU0UyKDE2KQorICAgICAgICBGRENUX1JPV19TU0UyX0gyKDExMiw2NCkKKyAgICAgICAgRkRDVF9ST1dfU1NFMigxMTIpCisKKyAgICAgICAgRkRDVF9ST1dfU1NFMl9IMSgzMiwxMjgpCisgICAgICAgIEZEQ1RfUk9XX1NTRTIoMzIpCisgICAgICAgIEZEQ1RfUk9XX1NTRTJfSDIoOTYsMTI4KQorICAgICAgICBGRENUX1JPV19TU0UyKDk2KQorCisgICAgICAgIEZEQ1RfUk9XX1NTRTJfSDEoNDgsMTkyKQorICAgICAgICBGRENUX1JPV19TU0UyKDQ4KQorICAgICAgICBGRENUX1JPV19TU0UyX0gyKDgwLDE5MikKKyAgICAgICAgRkRDVF9ST1dfU1NFMig4MCkKKyAgICAgICAgOgorICAgICAgICA6ICJyIiAoaW4pLCAiciIgKHRhYl9mcndfMDEyMzQ1Njdfc3NlMi50YWJfZnJ3XzAxMjM0NTY3X3NzZTIpLAorICAgICAgICAgICJyIiAoZmRjdF9yX3Jvd19zc2UyLmZkY3Rfcl9yb3dfc3NlMiksICJpIiAoU0hJRlRfRlJXX1JPVyksICJyIiAob3V0KQorICAgICAgICAgIFhNTV9DTE9CQkVSU19PTkxZKCIleG1tMCIsICIleG1tMSIsICIleG1tMiIsICIleG1tMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV4bW00IiwgIiV4bW01IiwgIiV4bW02IiwgIiV4bW03IikKKyAgICApOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZkY3Rfcm93X21teGV4dChjb25zdCBpbnQxNl90ICppbiwgaW50MTZfdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdGFibGUpCit7CisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJwc2h1ZncgICAgJDB4MUIsIDgoJTApLCAlJW1tNSBcblx0IgorICAgICAgICAibW92cSAgICAgICAoJTApLCAlJW1tMCBcblx0IgorICAgICAgICAibW92cSAgICAgICUlbW0wLCAlJW1tMSBcblx0IgorICAgICAgICAicGFkZHN3ICAgICUlbW01LCAlJW1tMCBcblx0IgorICAgICAgICAicHN1YnN3ICAgICUlbW01LCAlJW1tMSBcblx0IgorICAgICAgICAibW92cSAgICAgICUlbW0wLCAlJW1tMiBcblx0IgorICAgICAgICAicHVucGNrbGRxICUlbW0xLCAlJW1tMCBcblx0IgorICAgICAgICAicHVucGNraGRxICUlbW0xLCAlJW1tMiBcblx0IgorICAgICAgICAibW92cSAgICAgICAoJTEpLCAlJW1tMSBcblx0IgorICAgICAgICAibW92cSAgICAgIDgoJTEpLCAlJW1tMyBcblx0IgorICAgICAgICAibW92cSAgICAgMTYoJTEpLCAlJW1tNCBcblx0IgorICAgICAgICAibW92cSAgICAgMjQoJTEpLCAlJW1tNSBcblx0IgorICAgICAgICAibW92cSAgICAgMzIoJTEpLCAlJW1tNiBcblx0IgorICAgICAgICAibW92cSAgICAgNDAoJTEpLCAlJW1tNyBcblx0IgorICAgICAgICAicG1hZGR3ZCAgICUlbW0wLCAlJW1tMSBcblx0IgorICAgICAgICAicG1hZGR3ZCAgICUlbW0yLCAlJW1tMyBcblx0IgorICAgICAgICAicG1hZGR3ZCAgICUlbW0wLCAlJW1tNCBcblx0IgorICAgICAgICAicG1hZGR3ZCAgICUlbW0yLCAlJW1tNSBcblx0IgorICAgICAgICAicG1hZGR3ZCAgICUlbW0wLCAlJW1tNiBcblx0IgorICAgICAgICAicG1hZGR3ZCAgICUlbW0yLCAlJW1tNyBcblx0IgorICAgICAgICAicG1hZGR3ZCAgNDgoJTEpLCAlJW1tMCBcblx0IgorICAgICAgICAicG1hZGR3ZCAgNTYoJTEpLCAlJW1tMiBcblx0IgorICAgICAgICAicGFkZGQgICAgICUlbW0xLCAlJW1tMyBcblx0IgorICAgICAgICAicGFkZGQgICAgICUlbW00LCAlJW1tNSBcblx0IgorICAgICAgICAicGFkZGQgICAgICUlbW02LCAlJW1tNyBcblx0IgorICAgICAgICAicGFkZGQgICAgICUlbW0wLCAlJW1tMiBcblx0IgorICAgICAgICAibW92cSAgICAgICAoJTIpLCAlJW1tMCBcblx0IgorICAgICAgICAicGFkZGQgICAgICUlbW0wLCAlJW1tMyBcblx0IgorICAgICAgICAicGFkZGQgICAgICUlbW0wLCAlJW1tNSBcblx0IgorICAgICAgICAicGFkZGQgICAgICUlbW0wLCAlJW1tNyBcblx0IgorICAgICAgICAicGFkZGQgICAgICUlbW0wLCAlJW1tMiBcblx0IgorICAgICAgICAicHNyYWQgJCJTKFNISUZUX0ZSV19ST1cpIiwgJSVtbTMgXG5cdCIKKyAgICAgICAgInBzcmFkICQiUyhTSElGVF9GUldfUk9XKSIsICUlbW01IFxuXHQiCisgICAgICAgICJwc3JhZCAkIlMoU0hJRlRfRlJXX1JPVykiLCAlJW1tNyBcblx0IgorICAgICAgICAicHNyYWQgJCJTKFNISUZUX0ZSV19ST1cpIiwgJSVtbTIgXG5cdCIKKyAgICAgICAgInBhY2tzc2R3ICAlJW1tNSwgJSVtbTMgXG5cdCIKKyAgICAgICAgInBhY2tzc2R3ICAlJW1tMiwgJSVtbTcgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAlJW1tMywgICglMykgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAlJW1tNywgOCglMykgXG5cdCIKKyAgICAgICAgOgorICAgICAgICA6ICJyIiAoaW4pLCAiciIgKHRhYmxlKSwgInIiIChmZGN0X3Jfcm93KSwgInIiIChvdXQpKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmZGN0X3Jvd19tbXgoY29uc3QgaW50MTZfdCAqaW4sIGludDE2X3QgKm91dCwgY29uc3QgaW50MTZfdCAqdGFibGUpCit7CisgICAgLy9GSVhNRSByZW9yZGVyIChJIGRvIG5vdCBoYXZlIGFuIG9sZCBNTVgtb25seSBDUFUgaGVyZSB0byBiZW5jaG1hcmsgLi4uKQorICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZkICAgICAxMiglMCksICUlbW0xIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgOCglMCksICUlbW0xIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgJSVtbTEsICUlbW0yIFxuXHQiCisgICAgICAgICJwc3JscSAgICAgJDB4MjAsICUlbW0xIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgMCglMCksICUlbW0wIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgJSVtbTIsICUlbW0xIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgJSVtbTAsICUlbW01IFxuXHQiCisgICAgICAgICJwYWRkc3cgICAgJSVtbTEsICUlbW0wIFxuXHQiCisgICAgICAgICJwc3Vic3cgICAgJSVtbTEsICUlbW01IFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgJSVtbTAsICUlbW0yIFxuXHQiCisgICAgICAgICJwdW5wY2tsZHEgJSVtbTUsICUlbW0wIFxuXHQiCisgICAgICAgICJwdW5wY2toZHEgJSVtbTUsICUlbW0yIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgMCglMSksICUlbW0xIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgOCglMSksICUlbW0zIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAxNiglMSksICUlbW00IFxuXHQiCisgICAgICAgICJtb3ZxICAgICAyNCglMSksICUlbW01IFxuXHQiCisgICAgICAgICJtb3ZxICAgICAzMiglMSksICUlbW02IFxuXHQiCisgICAgICAgICJtb3ZxICAgICA0MCglMSksICUlbW03IFxuXHQiCisgICAgICAgICJwbWFkZHdkICAgJSVtbTAsICUlbW0xIFxuXHQiCisgICAgICAgICJwbWFkZHdkICAgJSVtbTIsICUlbW0zIFxuXHQiCisgICAgICAgICJwbWFkZHdkICAgJSVtbTAsICUlbW00IFxuXHQiCisgICAgICAgICJwbWFkZHdkICAgJSVtbTIsICUlbW01IFxuXHQiCisgICAgICAgICJwbWFkZHdkICAgJSVtbTAsICUlbW02IFxuXHQiCisgICAgICAgICJwbWFkZHdkICAgJSVtbTIsICUlbW03IFxuXHQiCisgICAgICAgICJwbWFkZHdkICA0OCglMSksICUlbW0wIFxuXHQiCisgICAgICAgICJwbWFkZHdkICA1NiglMSksICUlbW0yIFxuXHQiCisgICAgICAgICJwYWRkZCAgICAgJSVtbTEsICUlbW0zIFxuXHQiCisgICAgICAgICJwYWRkZCAgICAgJSVtbTQsICUlbW01IFxuXHQiCisgICAgICAgICJwYWRkZCAgICAgJSVtbTYsICUlbW03IFxuXHQiCisgICAgICAgICJwYWRkZCAgICAgJSVtbTAsICUlbW0yIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICglMiksICUlbW0wIFxuXHQiCisgICAgICAgICJwYWRkZCAgICAgJSVtbTAsICUlbW0zIFxuXHQiCisgICAgICAgICJwYWRkZCAgICAgJSVtbTAsICUlbW01IFxuXHQiCisgICAgICAgICJwYWRkZCAgICAgJSVtbTAsICUlbW03IFxuXHQiCisgICAgICAgICJwYWRkZCAgICAgJSVtbTAsICUlbW0yIFxuXHQiCisgICAgICAgICJwc3JhZCAkIlMoU0hJRlRfRlJXX1JPVykiLCAlJW1tMyBcblx0IgorICAgICAgICAicHNyYWQgJCJTKFNISUZUX0ZSV19ST1cpIiwgJSVtbTUgXG5cdCIKKyAgICAgICAgInBzcmFkICQiUyhTSElGVF9GUldfUk9XKSIsICUlbW03IFxuXHQiCisgICAgICAgICJwc3JhZCAkIlMoU0hJRlRfRlJXX1JPVykiLCAlJW1tMiBcblx0IgorICAgICAgICAicGFja3NzZHcgICUlbW01LCAlJW1tMyBcblx0IgorICAgICAgICAicGFja3NzZHcgICUlbW0yLCAlJW1tNyBcblx0IgorICAgICAgICAibW92cSAgICAgICUlbW0zLCAwKCUzKSBcblx0IgorICAgICAgICAibW92cSAgICAgICUlbW03LCA4KCUzKSBcblx0IgorICAgICAgICA6CisgICAgICAgIDogInIiIChpbiksICJyIiAodGFibGUpLCAiciIgKGZkY3Rfcl9yb3cpLCAiciIgKG91dCkpOworfQorCit2b2lkIGZmX2ZkY3RfbW14KGludDE2X3QgKmJsb2NrKQoreworICAgIERFQ0xBUkVfQUxJR05FRCg4LCBpbnQ2NF90LCBhbGlnbl90bXApWzE2XTsKKyAgICBpbnQxNl90ICogYmxvY2sxPSAoaW50MTZfdCopYWxpZ25fdG1wOworICAgIGNvbnN0IGludDE2X3QgKnRhYmxlPSB0YWJfZnJ3XzAxMjM0NTY3OworICAgIGludCBpOworCisgICAgZmRjdF9jb2xfbW14KGJsb2NrLCBibG9jazEsIDApOworICAgIGZkY3RfY29sX21teChibG9jaywgYmxvY2sxLCA0KTsKKworICAgIGZvcihpPTg7aT4wO2ktLSkgeworICAgICAgICBmZGN0X3Jvd19tbXgoYmxvY2sxLCBibG9jaywgdGFibGUpOworICAgICAgICBibG9jazEgKz0gODsKKyAgICAgICAgdGFibGUgKz0gMzI7CisgICAgICAgIGJsb2NrICs9IDg7CisgICAgfQorfQorCisjZW5kaWYgLyogSEFWRV9NTVhfSU5MSU5FICovCisKKyNpZiBIQVZFX01NWEVYVF9JTkxJTkUKKwordm9pZCBmZl9mZGN0X21teGV4dChpbnQxNl90ICpibG9jaykKK3sKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgaW50NjRfdCwgYWxpZ25fdG1wKVsxNl07CisgICAgaW50MTZfdCAqYmxvY2sxPSAoaW50MTZfdCopYWxpZ25fdG1wOworICAgIGNvbnN0IGludDE2X3QgKnRhYmxlPSB0YWJfZnJ3XzAxMjM0NTY3OworICAgIGludCBpOworCisgICAgZmRjdF9jb2xfbW14KGJsb2NrLCBibG9jazEsIDApOworICAgIGZkY3RfY29sX21teChibG9jaywgYmxvY2sxLCA0KTsKKworICAgIGZvcihpPTg7aT4wO2ktLSkgeworICAgICAgICBmZGN0X3Jvd19tbXhleHQoYmxvY2sxLCBibG9jaywgdGFibGUpOworICAgICAgICBibG9jazEgKz0gODsKKyAgICAgICAgdGFibGUgKz0gMzI7CisgICAgICAgIGJsb2NrICs9IDg7CisgICAgfQorfQorCisjZW5kaWYgLyogSEFWRV9NTVhFWFRfSU5MSU5FICovCisKKyNpZiBIQVZFX1NTRTJfSU5MSU5FCisKK3ZvaWQgZmZfZmRjdF9zc2UyKGludDE2X3QgKmJsb2NrKQoreworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50NjRfdCwgYWxpZ25fdG1wKVsxNl07CisgICAgaW50MTZfdCAqIGNvbnN0IGJsb2NrMT0gKGludDE2X3QqKWFsaWduX3RtcDsKKworICAgIGZkY3RfY29sX3NzZTIoYmxvY2ssIGJsb2NrMSwgMCk7CisgICAgZmRjdF9yb3dfc3NlMihibG9jazEsIGJsb2NrKTsKK30KKworI2VuZGlmIC8qIEhBVkVfU1NFMl9JTkxJTkUgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9mZGN0LmggYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmRjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGNkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmRjdC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1g4Nl9GRENUX0gKKyNkZWZpbmUgQVZDT0RFQ19YODZfRkRDVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordm9pZCBmZl9mZGN0X21teChpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX2ZkY3RfbW14ZXh0KGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfZmRjdF9zc2UyKGludDE2X3QgKmJsb2NrKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfWDg2X0ZEQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZkY3Rkc3BfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZkY3Rkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjVmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmRjdGRzcF9pbml0LmMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ZkY3Rkc3AuaCIKKyNpbmNsdWRlICJmZGN0LmgiCisKK2F2X2NvbGQgdm9pZCBmZl9mZGN0ZHNwX2luaXRfeDg2KEZEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoaWdoX2JpdF9kZXB0aCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgIGNvbnN0IGludCBkY3RfYWxnbyA9IGF2Y3R4LT5kY3RfYWxnbzsKKworICAgIGlmICghaGlnaF9iaXRfZGVwdGgpIHsKKyAgICAgICAgaWYgKChkY3RfYWxnbyA9PSBGRl9EQ1RfQVVUTyB8fCBkY3RfYWxnbyA9PSBGRl9EQ1RfTU1YKSkgeworICAgICAgICAgICAgaWYgKElOTElORV9NTVgoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgICAgICBjLT5mZGN0ID0gZmZfZmRjdF9tbXg7CisKKyAgICAgICAgICAgIGlmIChJTkxJTkVfTU1YRVhUKGNwdV9mbGFncykpCisgICAgICAgICAgICAgICAgYy0+ZmRjdCA9IGZmX2ZkY3RfbW14ZXh0OworCisgICAgICAgICAgICBpZiAoSU5MSU5FX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgICAgICBjLT5mZGN0ID0gZmZfZmRjdF9zc2UyOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZmdC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmZ0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzc5OTdlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZmdC5hc20KQEAgLTAsMCArMSwxMDkzIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBGRlQgdHJhbnNmb3JtIHdpdGggU1NFLzNETm93IG9wdGltaXphdGlvbnMKKzsqIENvcHlyaWdodCAoYykgMjAwOCBMb3JlbiBNZXJyaXR0Cis7KiBDb3B5cmlnaHQgKGMpIDIwMTEgVml0b3IgU2Vzc2FrCis7KgorOyogVGhpcyBhbGdvcml0aG0gKHRob3VnaCBub3QgYW55IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzKSBpcworOyogYmFzZWQgb24gbGliZGpiZmZ0IGJ5IEQuIEouIEJlcm5zdGVpbi4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzsgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgaW5kaXZpZHVhbGx5IGludGVyY2hhbmdlYWJsZSB3aXRoIHRoZSBDIHZlcnNpb25zLgorOyBXaGlsZSBDIHRha2VzIGFycmF5cyBvZiBGRlRDb21wbGV4LCBTU0UvM0ROb3cgbGVhdmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMKKzsgaW4gYmxvY2tzIGFzIGNvbnZlbnRpZW50IHRvIHRoZSB2ZWN0b3Igc2l6ZS4KKzsgaS5lLiB7NHggcmVhbCwgNHggaW1hZ2luYXJ5LCA0eCByZWFsLCAuLi59IChvciAyeCByZXNwZWN0aXZlbHkpCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCislaWYgQVJDSF9YODZfNjQKKyVkZWZpbmUgcG9pbnRlciByZXNxCislZWxzZQorJWRlZmluZSBwb2ludGVyIHJlc2QKKyVlbmRpZgorCitTRUNUSU9OX1JPREFUQSAzMgorCitzdHJ1YyBGRlRDb250ZXh0CisgICAgLm5iaXRzOiAgICByZXNkIDEKKyAgICAucmV2ZXJzZTogIHJlc2QgMQorICAgIC5yZXZ0YWI6ICAgcG9pbnRlciAxCisgICAgLnRtcGJ1ZjogICBwb2ludGVyIDEKKyAgICAubWRjdHNpemU6IHJlc2QgMQorICAgIC5tZGN0Yml0czogcmVzZCAxCisgICAgLnRjb3M6ICAgICBwb2ludGVyIDEKKyAgICAudHNpbjogICAgIHBvaW50ZXIgMQorICAgIC5mZnRwZXJtOiAgcG9pbnRlciAxCisgICAgLmZmdGNhbGM6ICBwb2ludGVyIDEKKyAgICAuaW1kY3RjYWxjOnBvaW50ZXIgMQorICAgIC5pbWRjdGhhbGY6cG9pbnRlciAxCitlbmRzdHJ1YworCislZGVmaW5lIE1fU1FSVDFfMiAwLjcwNzEwNjc4MTE4NjU0NzUyNDQwCislZGVmaW5lIE1fQ09TX1BJXzFfOCAwLjkyMzg3OTUzMjUxMTI4NworJWRlZmluZSBNX0NPU19QSV8zXzggMC4zODI2ODM0MzIzNjUwOQorCitwc19jb3MxNl8xOiBkZCAxLjAsIE1fQ09TX1BJXzFfOCwgTV9TUVJUMV8yLCBNX0NPU19QSV8zXzgsIDEuMCwgTV9DT1NfUElfMV84LCBNX1NRUlQxXzIsIE1fQ09TX1BJXzNfOAorcHNfY29zMTZfMjogZGQgMCwgTV9DT1NfUElfM184LCBNX1NRUlQxXzIsIE1fQ09TX1BJXzFfOCwgMCwgLU1fQ09TX1BJXzNfOCwgLU1fU1FSVDFfMiwgLU1fQ09TX1BJXzFfOAorCitwc19yb290MjogdGltZXMgOCBkZCBNX1NRUlQxXzIKK3BzX3Jvb3QybXBwbTogZGQgLU1fU1FSVDFfMiwgTV9TUVJUMV8yLCBNX1NRUlQxXzIsIC1NX1NRUlQxXzIsIC1NX1NRUlQxXzIsIE1fU1FSVDFfMiwgTV9TUVJUMV8yLCAtTV9TUVJUMV8yCitwc19wMXAxbTFwMTogZGQgMCwgMCwgMTw8MzEsIDAsIDAsIDAsIDE8PDMxLCAwCisKK3Blcm0xOiBkZCAweDAwLCAweDAyLCAweDAzLCAweDAxLCAweDAzLCAweDAwLCAweDAyLCAweDAxCitwZXJtMjogZGQgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMworcHNfcDFwMW0xcDFyb290MjogZGQgMS4wLCAxLjAsIC0xLjAsIDEuMCwgTV9TUVJUMV8yLCBNX1NRUlQxXzIsIE1fU1FSVDFfMiwgTV9TUVJUMV8yCitwc19tMW0xcDFtMXAxbTFtMW0xOiBkZCAxPDwzMSwgMTw8MzEsIDAsIDE8PDMxLCAwLCAxPDwzMSwgMTw8MzEsIDE8PDMxCitwc19tMXAxOiBkZCAxPDwzMSwgMAorCitjZXh0ZXJuIHBzX25lZworCislYXNzaWduIGkgMTYKKyVyZXAgMTMKK2NleHRlcm4gY29zXyAlKyBpCislYXNzaWduIGkgaTw8MQorJWVuZHJlcAorCislaWYgQVJDSF9YODZfNjQKKyAgICAlZGVmaW5lIHBvaW50ZXIgZHEKKyVlbHNlCisgICAgJWRlZmluZSBwb2ludGVyIGRkCislZW5kaWYKKworJW1hY3JvIElGMCAxKworJWVuZG1hY3JvCislbWFjcm8gSUYxIDErCisgICAgJTEKKyVlbmRtYWNybworCitTRUNUSU9OX1RFWFQKKworJW1hY3JvIFQyXzNETk9XIDQgOyB6MCwgejEsIG1lbTAsIG1lbTEKKyAgICBtb3ZhICAgICAlMSwgJTMKKyAgICBtb3ZhICAgICAlMiwgJTEKKyAgICBwZmFkZCAgICAlMSwgJTQKKyAgICBwZnN1YiAgICAlMiwgJTQKKyVlbmRtYWNybworCislbWFjcm8gVDRfM0ROT1cgNiA7IHowLCB6MSwgejIsIHozLCB0bXAwLCB0bXAxCisgICAgbW92YSAgICAgJTUsICUzCisgICAgcGZzdWIgICAgJTMsICU0CisgICAgcGZhZGQgICAgJTUsICU0IDsge3Q2LHQ1fQorICAgIHB4b3IgICAgICUzLCBbcHNfbTFwMV0gOyB7dDgsdDd9CisgICAgbW92YSAgICAgJTYsICUxCisgICAgbW92ZCBbcjArMTJdLCAlMworICAgIHB1bnBja2hkcSAlMywgW3IwKzhdCisgICAgcGZhZGQgICAgJTEsICU1IDsge3IwLGkwfQorICAgIHBmc3ViICAgICU2LCAlNSA7IHtyMixpMn0KKyAgICBtb3ZhICAgICAlNCwgJTIKKyAgICBwZmFkZCAgICAlMiwgJTMgOyB7cjEsaTF9CisgICAgcGZzdWIgICAgJTQsICUzIDsge3IzLGkzfQorICAgIFNXQVAgICAgICUzLCAlNgorJWVuZG1hY3JvCisKKzsgIGluOiAlMSA9IHtyMCxpMCxyMixpMixyNCxpNCxyNixpNn0KKzsgICAgICAlMiA9IHtyMSxpMSxyMyxpMyxyNSxpNSxyNyxpN30KKzsgICAgICAlMywgJTQsICU1IHRtcAorOyBvdXQ6ICUxID0ge3IwLHIxLHIyLHIzLGkwLGkxLGkyLGkzfQorOyAgICAgICUyID0ge3I0LHI1LHI2LHI3LGk0LGk1LGk2LGk3fQorJW1hY3JvIFQ4X0FWWCA1CisgICAgdnN1YnBzICAgICAlNSwgJTEsICUyICAgICAgIDsgdiAgPSAlMSAtICUyCisgICAgdmFkZHBzICAgICAlMywgJTEsICUyICAgICAgIDsgdyAgPSAlMSArICUyCisgICAgdm11bHBzICAgICAlMiwgJTUsIFtwc19wMXAxbTFwMXJvb3QyXSAgOyB2ICo9IHZhbHMxCisgICAgdnBlcm1pbHBzICAlMiwgJTIsIFtwZXJtMV0KKyAgICB2YmxlbmRwcyAgICUxLCAlMiwgJTMsIDB4MzMgOyBxID0ge3cxLHcyLHY0LHYyLHc1LHc2LHY3LHY2fQorICAgIHZzaHVmcHMgICAgJTUsICUzLCAlMiwgMHg0ZSA7IHIgPSB7dzMsdzQsdjEsdjMsdzcsdzgsdjgsdjV9CisgICAgdnN1YnBzICAgICAlNCwgJTUsICUxICAgICAgIDsgcyA9IHIgLSBxCisgICAgdmFkZHBzICAgICAlMSwgJTUsICUxICAgICAgIDsgdSA9IHIgKyBxCisgICAgdnBlcm1pbHBzICAlMSwgJTEsIFtwZXJtMl0gIDsgayAgPSB7dTEsdTIsdTMsdTQsdTYsdTUsdTcsdTh9CisgICAgdnNodWZwcyAgICAlNSwgJTQsICUxLCAweGJiCisgICAgdnNodWZwcyAgICAlMywgJTQsICUxLCAweGVlCisgICAgdnBlcm0yZjEyOCAlMywgJTMsICU1LCAweDEzCisgICAgdnhvcnBzICAgICAlNCwgJTQsIFtwc19tMW0xcDFtMXAxbTFtMW0xXSAgOyBzICo9IHsxLDEsLTEsLTEsMSwtMSwtMSwtMX0KKyAgICB2c2h1ZnBzICAgICUyLCAlMSwgJTQsIDB4ZGQKKyAgICB2c2h1ZnBzICAgICUxLCAlMSwgJTQsIDB4ODgKKyAgICB2cGVybTJmMTI4ICU0LCAlMiwgJTEsIDB4MDIgOyB2ICA9IHtrMSxrMyxzMSxzMyxrMixrNCxzMixzNH0KKyAgICB2cGVybTJmMTI4ICUxLCAlMSwgJTIsIDB4MTMgOyB3ICA9IHtrNixrOCxzNixzOCxrNSxrNyxzNSxzN30KKyAgICB2c3VicHMgICAgICU1LCAlMSwgJTMKKyAgICB2YmxlbmRwcyAgICUxLCAlNSwgJTEsIDB4NTUgOyB3IC09IHswLHM3LDAsazcsMCxzOCwwLGs4fQorICAgIHZzdWJwcyAgICAgJTIsICU0LCAlMSAgICAgICA7ICUyID0gdiAtIHcKKyAgICB2YWRkcHMgICAgICUxLCAlNCwgJTEgICAgICAgOyAlMSA9IHYgKyB3CislZW5kbWFjcm8KKworOyBJbiBTU0UgbW9kZSBkbyBvbmUgZmZ0NCB0cmFuc2Zvcm1zCis7IGluOiAgJTE9e3IwLGkwLHIyLGkyfSAlMj17cjEsaTEscjMsaTN9Cis7IG91dDogJTE9e3IwLHIxLHIyLHIzfSAlMj17aTAsaTEsaTIsaTN9Cis7Cis7IEluIEFWWCBtb2RlIGRvIHR3byBmZnQ0IHRyYW5zZm9ybXMKKzsgaW46ICAlMT17cjAsaTAscjIsaTIscjQsaTQscjYsaTZ9ICUyPXtyMSxpMSxyMyxpMyxyNSxpNSxyNyxpN30KKzsgb3V0OiAlMT17cjAscjEscjIscjMscjQscjUscjYscjd9ICUyPXtpMCxpMSxpMixpMyxpNCxpNSxpNixpN30KKyVtYWNybyBUNF9TU0UgMworICAgIHN1YnBzICAgICUzLCAlMSwgJTIgICAgICAgOyB7dDMsdDQsLXQ4LHQ3fQorICAgIGFkZHBzICAgICUxLCAlMSwgJTIgICAgICAgOyB7dDEsdDIsdDYsdDV9CisgICAgeG9ycHMgICAgJTMsICUzLCBbcHNfcDFwMW0xcDFdCisgICAgc2h1ZnBzICAgJTIsICUxLCAlMywgMHhiZSA7IHt0Nix0NSx0Nyx0OH0KKyAgICBzaHVmcHMgICAlMSwgJTEsICUzLCAweDQ0IDsge3QxLHQyLHQzLHQ0fQorICAgIHN1YnBzICAgICUzLCAlMSwgJTIgICAgICAgOyB7cjIsaTIscjMsaTN9CisgICAgYWRkcHMgICAgJTEsICUxLCAlMiAgICAgICA7IHtyMCxpMCxyMSxpMX0KKyAgICBzaHVmcHMgICAlMiwgJTEsICUzLCAweGRkIDsge2kwLGkxLGkyLGkzfQorICAgIHNodWZwcyAgICUxLCAlMSwgJTMsIDB4ODggOyB7cjAscjEscjIscjN9CislZW5kbWFjcm8KKworOyBJbiBTU0UgbW9kZSBkbyBvbmUgRkZUOAorOyBpbjogICUxPXtyMCxyMSxyMixyM30gJTI9e2kwLGkxLGkyLGkzfSAlMz17cjQsaTQscjYsaTZ9ICU0PXtyNSxpNSxyNyxpN30KKzsgb3V0OiAlMT17cjAscjEscjIscjN9ICUyPXtpMCxpMSxpMixpM30gJTE9e3I0LHI1LHI2LHI3fSAlMj17aTQsaTUsaTYsaTd9Cis7Cis7IEluIEFWWCBtb2RlIGRvIHR3byBGRlQ4Cis7IGluOiAgJTE9e3IwLGkwLHIyLGkyLHI4LCBpOCwgcjEwLGkxMH0gJTI9e3IxLGkxLHIzLGkzLHI5LCBpOSwgcjExLGkxMX0KKzsgICAgICAlMz17cjQsaTQscjYsaTYscjEyLGkxMixyMTQsaTE0fSAlND17cjUsaTUscjcsaTcscjEzLGkxMyxyMTUsaTE1fQorOyBvdXQ6ICUxPXtyMCxyMSxyMixyMyxyOCwgcjksIHIxMCxyMTF9ICUyPXtpMCxpMSxpMixpMyxpOCwgaTksIGkxMCxpMTF9Cis7ICAgICAgJTM9e3I0LHI1LHI2LHI3LHIxMixyMTMscjE0LHIxNX0gJTQ9e2k0LGk1LGk2LGk3LGkxMixpMTMsaTE0LGkxNX0KKyVtYWNybyBUOF9TU0UgNgorICAgIGFkZHBzICAgICU2LCAlMywgJTQgICAgICAgOyB7dDEsdDIsdDMsdDR9CisgICAgc3VicHMgICAgJTMsICUzLCAlNCAgICAgICA7IHtyNSxpNSxyNyxpN30KKyAgICBzaHVmcHMgICAlNCwgJTMsICUzLCAweGIxIDsge2k1LHI1LGk3LHI3fQorICAgIG11bHBzICAgICUzLCAlMywgW3BzX3Jvb3QybXBwbV0gOyB7LXI1LGk1LHI3LC1pN30KKyAgICBtdWxwcyAgICAlNCwgJTQsIFtwc19yb290Ml0KKyAgICBhZGRwcyAgICAlMywgJTMsICU0ICAgICAgIDsge3Q4LHQ3LHRhLHQ5fQorICAgIHNodWZwcyAgICU0LCAlNiwgJTMsIDB4OWMgOyB7dDEsdDQsdDcsdGF9CisgICAgc2h1ZnBzICAgJTYsICU2LCAlMywgMHgzNiA7IHt0Myx0Mix0OSx0OH0KKyAgICBzdWJwcyAgICAlMywgJTYsICU0ICAgICAgIDsge3Q2LHQ1LHRjLHRifQorICAgIGFkZHBzICAgICU2LCAlNiwgJTQgICAgICAgOyB7dDEsdDIsdDksdGF9CisgICAgc2h1ZnBzICAgJTUsICU2LCAlMywgMHg4ZCA7IHt0Mix0YSx0Nix0Y30KKyAgICBzaHVmcHMgICAlNiwgJTYsICUzLCAweGQ4IDsge3QxLHQ5LHQ1LHRifQorICAgIHN1YnBzICAgICUzLCAlMSwgJTYgICAgICAgOyB7cjQscjUscjYscjd9CisgICAgYWRkcHMgICAgJTEsICUxLCAlNiAgICAgICA7IHtyMCxyMSxyMixyM30KKyAgICBzdWJwcyAgICAlNCwgJTIsICU1ICAgICAgIDsge2k0LGk1LGk2LGk3fQorICAgIGFkZHBzICAgICUyLCAlMiwgJTUgICAgICAgOyB7aTAsaTEsaTIsaTN9CislZW5kbWFjcm8KKworOyBzY2hlZHVsZWQgZm9yIGNwdS1ib3VuZCBzaXplcworJW1hY3JvIFBBU1NfU01BTEwgMyA7ICh0byBsb2FkIG00LW03KSwgd3JlLCB3aW0KK0lGJTEgbW92YSAgICBtNCwgWig0KQorSUYlMSBtb3ZhICAgIG01LCBaKDUpCisgICAgbW92YSAgICAgbTAsICUyIDsgd3JlCisgICAgbW92YSAgICAgbTEsICUzIDsgd2ltCisgICAgbXVscHMgICAgbTIsIG00LCBtMCA7IHIyKndyZQorSUYlMSBtb3ZhICAgIG02LCBaMig2KQorICAgIG11bHBzICAgIG0zLCBtNSwgbTEgOyBpMip3aW0KK0lGJTEgbW92YSAgICBtNywgWjIoNykKKyAgICBtdWxwcyAgICBtNCwgbTQsIG0xIDsgcjIqd2ltCisgICAgbXVscHMgICAgbTUsIG01LCBtMCA7IGkyKndyZQorICAgIGFkZHBzICAgIG0yLCBtMiwgbTMgOyByMip3cmUgKyBpMip3aW0KKyAgICBtdWxwcyAgICBtMywgbTEsIG03IDsgaTMqd2ltCisgICAgc3VicHMgICAgbTUsIG01LCBtNCA7IGkyKndyZSAtIHIyKndpbQorICAgIG11bHBzICAgIG0xLCBtMSwgbTYgOyByMyp3aW0KKyAgICBtdWxwcyAgICBtNCwgbTAsIG02IDsgcjMqd3JlCisgICAgbXVscHMgICAgbTAsIG0wLCBtNyA7IGkzKndyZQorICAgIHN1YnBzICAgIG00LCBtNCwgbTMgOyByMyp3cmUgLSBpMyp3aW0KKyAgICBtb3ZhICAgICBtMywgWigwKQorICAgIGFkZHBzICAgIG0wLCBtMCwgbTEgOyBpMyp3cmUgKyByMyp3aW0KKyAgICBzdWJwcyAgICBtMSwgbTQsIG0yIDsgdDMKKyAgICBhZGRwcyAgICBtNCwgbTQsIG0yIDsgdDUKKyAgICBzdWJwcyAgICBtMywgbTMsIG00IDsgcjIKKyAgICBhZGRwcyAgICBtNCwgbTQsIFooMCkgOyByMAorICAgIG1vdmEgICAgIG02LCBaKDIpCisgICAgbW92YSAgIFooNCksIG0zCisgICAgbW92YSAgIFooMCksIG00CisgICAgc3VicHMgICAgbTMsIG01LCBtMCA7IHQ0CisgICAgc3VicHMgICAgbTQsIG02LCBtMyA7IHIzCisgICAgYWRkcHMgICAgbTMsIG0zLCBtNiA7IHIxCisgICAgbW92YSAgWjIoNiksIG00CisgICAgbW92YSAgIFooMiksIG0zCisgICAgbW92YSAgICAgbTIsIFooMykKKyAgICBhZGRwcyAgICBtMywgbTUsIG0wIDsgdDYKKyAgICBzdWJwcyAgICBtMiwgbTIsIG0xIDsgaTMKKyAgICBtb3ZhICAgICBtNywgWigxKQorICAgIGFkZHBzICAgIG0xLCBtMSwgWigzKSA7IGkxCisgICAgbW92YSAgWjIoNyksIG0yCisgICAgbW92YSAgIFooMyksIG0xCisgICAgc3VicHMgICAgbTQsIG03LCBtMyA7IGkyCisgICAgYWRkcHMgICAgbTMsIG0zLCBtNyA7IGkwCisgICAgbW92YSAgIFooNSksIG00CisgICAgbW92YSAgIFooMSksIG0zCislZW5kbWFjcm8KKworOyBzY2hlZHVsZWQgdG8gYXZvaWQgc3RvcmUtPmxvYWQgYWxpYXNpbmcKKyVtYWNybyBQQVNTX0JJRyAxIDsgKCFpbnRlcmxlYXZlKQorICAgIG1vdmEgICAgIG00LCBaKDQpIDsgcjIKKyAgICBtb3ZhICAgICBtNSwgWig1KSA7IGkyCisgICAgbW92YSAgICAgbTAsIFt3cV0gOyB3cmUKKyAgICBtb3ZhICAgICBtMSwgW3dxK28xcV0gOyB3aW0KKyAgICBtdWxwcyAgICBtMiwgbTQsIG0wIDsgcjIqd3JlCisgICAgbW92YSAgICAgbTYsIFoyKDYpIDsgcjMKKyAgICBtdWxwcyAgICBtMywgbTUsIG0xIDsgaTIqd2ltCisgICAgbW92YSAgICAgbTcsIFoyKDcpIDsgaTMKKyAgICBtdWxwcyAgICBtNCwgbTQsIG0xIDsgcjIqd2ltCisgICAgbXVscHMgICAgbTUsIG01LCBtMCA7IGkyKndyZQorICAgIGFkZHBzICAgIG0yLCBtMiwgbTMgOyByMip3cmUgKyBpMip3aW0KKyAgICBtdWxwcyAgICBtMywgbTEsIG03IDsgaTMqd2ltCisgICAgbXVscHMgICAgbTEsIG0xLCBtNiA7IHIzKndpbQorICAgIHN1YnBzICAgIG01LCBtNSwgbTQgOyBpMip3cmUgLSByMip3aW0KKyAgICBtdWxwcyAgICBtNCwgbTAsIG02IDsgcjMqd3JlCisgICAgbXVscHMgICAgbTAsIG0wLCBtNyA7IGkzKndyZQorICAgIHN1YnBzICAgIG00LCBtNCwgbTMgOyByMyp3cmUgLSBpMyp3aW0KKyAgICBtb3ZhICAgICBtMywgWigwKQorICAgIGFkZHBzICAgIG0wLCBtMCwgbTEgOyBpMyp3cmUgKyByMyp3aW0KKyAgICBzdWJwcyAgICBtMSwgbTQsIG0yIDsgdDMKKyAgICBhZGRwcyAgICBtNCwgbTQsIG0yIDsgdDUKKyAgICBzdWJwcyAgICBtMywgbTMsIG00IDsgcjIKKyAgICBhZGRwcyAgICBtNCwgbTQsIFooMCkgOyByMAorICAgIG1vdmEgICAgIG02LCBaKDIpCisgICAgbW92YSAgIFooNCksIG0zCisgICAgbW92YSAgIFooMCksIG00CisgICAgc3VicHMgICAgbTMsIG01LCBtMCA7IHQ0CisgICAgc3VicHMgICAgbTQsIG02LCBtMyA7IHIzCisgICAgYWRkcHMgICAgbTMsIG0zLCBtNiA7IHIxCitJRiUxIG1vdmEgWjIoNiksIG00CitJRiUxIG1vdmEgIFooMiksIG0zCisgICAgbW92YSAgICAgbTIsIFooMykKKyAgICBhZGRwcyAgICBtNSwgbTUsIG0wIDsgdDYKKyAgICBzdWJwcyAgICBtMiwgbTIsIG0xIDsgaTMKKyAgICBtb3ZhICAgICBtNywgWigxKQorICAgIGFkZHBzICAgIG0xLCBtMSwgWigzKSA7IGkxCitJRiUxIG1vdmEgWjIoNyksIG0yCitJRiUxIG1vdmEgIFooMyksIG0xCisgICAgc3VicHMgICAgbTYsIG03LCBtNSA7IGkyCisgICAgYWRkcHMgICAgbTUsIG01LCBtNyA7IGkwCitJRiUxIG1vdmEgIFooNSksIG02CitJRiUxIG1vdmEgIFooMSksIG01CislaWYgJTE9PTAKKyAgICBJTlRFUkwgbTEsIG0zLCBtNywgWiwgMgorICAgIElOVEVSTCBtMiwgbTQsIG0wLCBaMiwgNgorCisgICAgbW92YSAgICAgbTEsIFooMCkKKyAgICBtb3ZhICAgICBtMiwgWig0KQorCisgICAgSU5URVJMIG01LCBtMSwgbTMsIFosIDAKKyAgICBJTlRFUkwgbTYsIG0yLCBtNywgWiwgNAorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFBVTlBDSyAzCisgICAgbW92YSAgICAgICUzLCAlMQorICAgIHB1bnBja2xkcSAlMSwgJTIKKyAgICBwdW5wY2toZHEgJTMsICUyCislZW5kbWFjcm8KKworJWRlZmluZSBaKHgpIFtyMCttbXNpemUqeF0KKyVkZWZpbmUgWjIoeCkgW3IwK21tc2l6ZSp4XQorJWRlZmluZSBaSCh4KSBbcjArbW1zaXplKngrbW1zaXplLzJdCisKK0lOSVRfWU1NIGF2eAorCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK2FsaWduIDE2CitmZnQ4X2F2eDoKKyAgICBtb3ZhICAgICAgbTAsIFooMCkKKyAgICBtb3ZhICAgICAgbTEsIFooMSkKKyAgICBUOF9BVlggICAgbTAsIG0xLCBtMiwgbTMsIG00CisgICAgbW92YSAgICAgIFooMCksIG0wCisgICAgbW92YSAgICAgIFooMSksIG0xCisgICAgcmV0CisKKworYWxpZ24gMTYKK2ZmdDE2X2F2eDoKKyAgICBtb3ZhICAgICAgIG0yLCBaKDIpCisgICAgbW92YSAgICAgICBtMywgWigzKQorICAgIFQ0X1NTRSAgICAgbTIsIG0zLCBtNworCisgICAgbW92YSAgICAgICBtMCwgWigwKQorICAgIG1vdmEgICAgICAgbTEsIFooMSkKKyAgICBUOF9BVlggICAgIG0wLCBtMSwgbTQsIG01LCBtNworCisgICAgbW92YSAgICAgICBtNCwgW3BzX2NvczE2XzFdCisgICAgbW92YSAgICAgICBtNSwgW3BzX2NvczE2XzJdCisgICAgdm11bHBzICAgICBtNiwgbTIsIG00CisgICAgdm11bHBzICAgICBtNywgbTMsIG01CisgICAgdmFkZHBzICAgICBtNywgbTcsIG02CisgICAgdm11bHBzICAgICBtMiwgbTIsIG01CisgICAgdm11bHBzICAgICBtMywgbTMsIG00CisgICAgdnN1YnBzICAgICBtMywgbTMsIG0yCisgICAgdmJsZW5kcHMgICBtMiwgbTcsIG0zLCAweGYwCisgICAgdnBlcm0yZjEyOCBtMywgbTcsIG0zLCAweDIxCisgICAgdmFkZHBzICAgICBtNCwgbTIsIG0zCisgICAgdnN1YnBzICAgICBtMiwgbTMsIG0yCisgICAgdnBlcm0yZjEyOCBtMiwgbTIsIG0yLCAweDAxCisgICAgdnN1YnBzICAgICBtMywgbTEsIG0yCisgICAgdmFkZHBzICAgICBtMSwgbTEsIG0yCisgICAgdnN1YnBzICAgICBtNSwgbTAsIG00CisgICAgdmFkZHBzICAgICBtMCwgbTAsIG00CisgICAgdmV4dHJhY3RmMTI4ICAgWigwKSwgbTAsIDAKKyAgICB2ZXh0cmFjdGYxMjggIFpIKDApLCBtMSwgMAorICAgIHZleHRyYWN0ZjEyOCAgIFooMSksIG0wLCAxCisgICAgdmV4dHJhY3RmMTI4ICBaSCgxKSwgbTEsIDEKKyAgICB2ZXh0cmFjdGYxMjggICBaKDIpLCBtNSwgMAorICAgIHZleHRyYWN0ZjEyOCAgWkgoMiksIG0zLCAwCisgICAgdmV4dHJhY3RmMTI4ICAgWigzKSwgbTUsIDEKKyAgICB2ZXh0cmFjdGYxMjggIFpIKDMpLCBtMywgMQorICAgIHJldAorCithbGlnbiAxNgorZmZ0MzJfYXZ4OgorICAgIGNhbGwgZmZ0MTZfYXZ4CisKKyAgICBtb3ZhIG0wLCBaKDQpCisgICAgbW92YSBtMSwgWig1KQorCisgICAgVDRfU1NFICAgICAgbTAsIG0xLCBtNAorCisgICAgbW92YSBtMiwgWig2KQorICAgIG1vdmEgbTMsIFooNykKKworICAgIFQ4X1NTRSAgICAgIG0wLCBtMSwgbTIsIG0zLCBtNCwgbTYKKyAgICA7IG0wPXtyMCxyMSxyMixyMyxyOCwgcjksIHIxMCxyMTF9IG0xPXtpMCxpMSxpMixpMyxpOCwgaTksIGkxMCxpMTF9CisgICAgOyBtMj17cjQscjUscjYscjcscjEyLHIxMyxyMTQscjE1fSBtMz17aTQsaTUsaTYsaTcsaTEyLGkxMyxpMTQsaTE1fQorCisgICAgdnBlcm0yZjEyOCAgbTQsIG0wLCBtMiwgMHgyMAorICAgIHZwZXJtMmYxMjggIG01LCBtMSwgbTMsIDB4MjAKKyAgICB2cGVybTJmMTI4ICBtNiwgbTAsIG0yLCAweDMxCisgICAgdnBlcm0yZjEyOCAgbTcsIG0xLCBtMywgMHgzMQorCisgICAgUEFTU19TTUFMTCAwLCBbY29zXzMyXSwgW2Nvc18zMiszMl0KKworICAgIHJldAorCitmZnQzMl9pbnRlcmxlYXZlX2F2eDoKKyAgICBjYWxsIGZmdDMyX2F2eAorICAgIG1vdiByMmQsIDMyCisuZGVpbnRfbG9vcDoKKyAgICBtb3ZhICAgICBtMiwgWigwKQorICAgIG1vdmEgICAgIG0zLCBaKDEpCisgICAgdnVucGNrbHBzICAgICAgbTAsIG0yLCBtMworICAgIHZ1bnBja2hwcyAgICAgIG0xLCBtMiwgbTMKKyAgICB2ZXh0cmFjdGYxMjggICBaKDApLCBtMCwgMAorICAgIHZleHRyYWN0ZjEyOCAgWkgoMCksIG0xLCAwCisgICAgdmV4dHJhY3RmMTI4ICAgWigxKSwgbTAsIDEKKyAgICB2ZXh0cmFjdGYxMjggIFpIKDEpLCBtMSwgMQorICAgIGFkZCByMCwgbW1zaXplKjIKKyAgICBzdWIgcjJkLCBtbXNpemUvNAorICAgIGpnIC5kZWludF9sb29wCisgICAgcmV0CisKKyVlbmRpZgorCitJTklUX1hNTSBzc2UKKworYWxpZ24gMTYKK2ZmdDRfYXZ4OgorZmZ0NF9zc2U6CisgICAgbW92YSAgICAgbTAsIFooMCkKKyAgICBtb3ZhICAgICBtMSwgWigxKQorICAgIFQ0X1NTRSAgIG0wLCBtMSwgbTIKKyAgICBtb3ZhICAgWigwKSwgbTAKKyAgICBtb3ZhICAgWigxKSwgbTEKKyAgICByZXQKKworYWxpZ24gMTYKK2ZmdDhfc3NlOgorICAgIG1vdmEgICAgIG0wLCBaKDApCisgICAgbW92YSAgICAgbTEsIFooMSkKKyAgICBUNF9TU0UgICBtMCwgbTEsIG0yCisgICAgbW92YSAgICAgbTIsIFooMikKKyAgICBtb3ZhICAgICBtMywgWigzKQorICAgIFQ4X1NTRSAgIG0wLCBtMSwgbTIsIG0zLCBtNCwgbTUKKyAgICBtb3ZhICAgWigwKSwgbTAKKyAgICBtb3ZhICAgWigxKSwgbTEKKyAgICBtb3ZhICAgWigyKSwgbTIKKyAgICBtb3ZhICAgWigzKSwgbTMKKyAgICByZXQKKworYWxpZ24gMTYKK2ZmdDE2X3NzZToKKyAgICBtb3ZhICAgICBtMCwgWigwKQorICAgIG1vdmEgICAgIG0xLCBaKDEpCisgICAgVDRfU1NFICAgbTAsIG0xLCBtMgorICAgIG1vdmEgICAgIG0yLCBaKDIpCisgICAgbW92YSAgICAgbTMsIFooMykKKyAgICBUOF9TU0UgICBtMCwgbTEsIG0yLCBtMywgbTQsIG01CisgICAgbW92YSAgICAgbTQsIFooNCkKKyAgICBtb3ZhICAgICBtNSwgWig1KQorICAgIG1vdmEgICBaKDApLCBtMAorICAgIG1vdmEgICBaKDEpLCBtMQorICAgIG1vdmEgICBaKDIpLCBtMgorICAgIG1vdmEgICBaKDMpLCBtMworICAgIFQ0X1NTRSAgIG00LCBtNSwgbTYKKyAgICBtb3ZhICAgICBtNiwgWjIoNikKKyAgICBtb3ZhICAgICBtNywgWjIoNykKKyAgICBUNF9TU0UgICBtNiwgbTcsIG0wCisgICAgUEFTU19TTUFMTCAwLCBbY29zXzE2XSwgW2Nvc18xNisxNl0KKyAgICByZXQKKworCislbWFjcm8gRkZUNDhfM0ROT1cgMAorYWxpZ24gMTYKK2ZmdDQgJSsgU1VGRklYOgorICAgIFQyXzNETk9XIG0wLCBtMSwgWigwKSwgWigxKQorICAgIG1vdmEgICAgIG0yLCBaKDIpCisgICAgbW92YSAgICAgbTMsIFooMykKKyAgICBUNF8zRE5PVyBtMCwgbTEsIG0yLCBtMywgbTQsIG01CisgICAgUFVOUENLICAgbTAsIG0xLCBtNAorICAgIFBVTlBDSyAgIG0yLCBtMywgbTUKKyAgICBtb3ZhICAgWigwKSwgbTAKKyAgICBtb3ZhICAgWigxKSwgbTQKKyAgICBtb3ZhICAgWigyKSwgbTIKKyAgICBtb3ZhICAgWigzKSwgbTUKKyAgICByZXQKKworYWxpZ24gMTYKK2ZmdDggJSsgU1VGRklYOgorICAgIFQyXzNETk9XIG0wLCBtMSwgWigwKSwgWigxKQorICAgIG1vdmEgICAgIG0yLCBaKDIpCisgICAgbW92YSAgICAgbTMsIFooMykKKyAgICBUNF8zRE5PVyBtMCwgbTEsIG0yLCBtMywgbTQsIG01CisgICAgbW92YSAgIFooMCksIG0wCisgICAgbW92YSAgIFooMiksIG0yCisgICAgVDJfM0ROT1cgbTQsIG01LCAgWig0KSwgIFooNSkKKyAgICBUMl8zRE5PVyBtNiwgbTcsIFoyKDYpLCBaMig3KQorICAgIFBTV0FQRCAgIG0wLCBtNQorICAgIFBTV0FQRCAgIG0yLCBtNworICAgIHB4b3IgICAgIG0wLCBbcHNfbTFwMV0KKyAgICBweG9yICAgICBtMiwgW3BzX20xcDFdCisgICAgcGZzdWIgICAgbTUsIG0wCisgICAgcGZhZGQgICAgbTcsIG0yCisgICAgcGZtdWwgICAgbTUsIFtwc19yb290Ml0KKyAgICBwZm11bCAgICBtNywgW3BzX3Jvb3QyXQorICAgIFQ0XzNETk9XIG0xLCBtMywgbTUsIG03LCBtMCwgbTIKKyAgICBtb3ZhICAgWig1KSwgbTUKKyAgICBtb3ZhICBaMig3KSwgbTcKKyAgICBtb3ZhICAgICBtMCwgWigwKQorICAgIG1vdmEgICAgIG0yLCBaKDIpCisgICAgVDRfM0ROT1cgbTAsIG0yLCBtNCwgbTYsIG01LCBtNworICAgIFBVTlBDSyAgIG0wLCBtMSwgbTUKKyAgICBQVU5QQ0sgICBtMiwgbTMsIG03CisgICAgbW92YSAgIFooMCksIG0wCisgICAgbW92YSAgIFooMSksIG01CisgICAgbW92YSAgIFooMiksIG0yCisgICAgbW92YSAgIFooMyksIG03CisgICAgUFVOUENLICAgbTQsICBaKDUpLCBtNQorICAgIFBVTlBDSyAgIG02LCBaMig3KSwgbTcKKyAgICBtb3ZhICAgWig0KSwgbTQKKyAgICBtb3ZhICAgWig1KSwgbTUKKyAgICBtb3ZhICBaMig2KSwgbTYKKyAgICBtb3ZhICBaMig3KSwgbTcKKyAgICByZXQKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIDNkbm93ZXh0CitGRlQ0OF8zRE5PVworCitJTklUX01NWCAzZG5vdworRkZUNDhfM0ROT1cKKyVlbmRpZgorCislZGVmaW5lIFooeCkgW3pjcSArIG8xcSooeCY2KSArIG1tc2l6ZSooeCYxKV0KKyVkZWZpbmUgWjIoeCkgW3pjcSArIG8zcSArIG1tc2l6ZSooeCYxKV0KKyVkZWZpbmUgWkgoeCkgW3pjcSArIG8xcSooeCY2KSArIG1tc2l6ZSooeCYxKSArIG1tc2l6ZS8yXQorJWRlZmluZSBaMkgoeCkgW3pjcSArIG8zcSArIG1tc2l6ZSooeCYxKSArIG1tc2l6ZS8yXQorCislbWFjcm8gREVDTF9QQVNTIDIrIDsgbmFtZSwgcGF5bG9hZAorYWxpZ24gMTYKKyUxOgorREVGSU5FX0FSR1MgemMsIHcsIG4sIG8xLCBvMworICAgIGxlYSBvM3EsIFtucSozXQorICAgIGxlYSBvMXEsIFtucSo4XQorICAgIHNobCBvM3EsIDQKKy5sb29wOgorICAgICUyCisgICAgYWRkIHpjcSwgbW1zaXplKjIKKyAgICBhZGQgIHdxLCBtbXNpemUKKyAgICBzdWIgIG5kLCBtbXNpemUvOAorICAgIGpnIC5sb29wCisgICAgcmVwIHJldAorJWVuZG1hY3JvCisKKyVtYWNybyBGRlRfRElTUEFUQ0ggMjsgY2xvYmJlcnMgNSBHUFJzLCA4IFhNTXMKKyAgICBsZWEgcjIsIFtkaXNwYXRjaF90YWIlMV0KKyAgICBtb3YgcjIsIFtyMiArICglMnEtMikqZ3Byc2l6ZV0KKyVpZmRlZiBQSUMKKyAgICBsZWEgcjMsIFskJF0KKyAgICBhZGQgcjIsIHIzCislZW5kaWYKKyAgICBjYWxsIHIyCislZW5kbWFjcm8gOyBGRlRfRElTUEFUQ0gKKworSU5JVF9ZTU0gYXZ4CisKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorJW1hY3JvIElOVEVSTF9BVlggNQorICAgIHZ1bnBja2hwcyAgICAgICUzLCAlMiwgJTEKKyAgICB2dW5wY2tscHMgICAgICAlMiwgJTIsICUxCisgICAgdmV4dHJhY3RmMTI4ICAgJTQoJTUpLCAlMiwgMAorICAgIHZleHRyYWN0ZjEyOCAgJTQgJSsgSCglNSksICUzLCAwCisgICAgdmV4dHJhY3RmMTI4ICAgJTQoJTUgKyAxKSwgJTIsIDEKKyAgICB2ZXh0cmFjdGYxMjggICU0ICUrIEgoJTUgKyAxKSwgJTMsIDEKKyVlbmRtYWNybworCislZGVmaW5lIElOVEVSTCBJTlRFUkxfQVZYCisKK0RFQ0xfUEFTUyBwYXNzX2F2eCwgUEFTU19CSUcgMQorREVDTF9QQVNTIHBhc3NfaW50ZXJsZWF2ZV9hdngsIFBBU1NfQklHIDAKKworY2dsb2JhbCBmZnRfY2FsYywgMiw1LDgKKyAgICBtb3YgICAgIHIzZCwgW3IwICsgRkZUQ29udGV4dC5uYml0c10KKyAgICBtb3YgICAgIHIwLCByMQorICAgIG1vdiAgICAgcjEsIHIzCisgICAgRkZUX0RJU1BBVENIIF9pbnRlcmxlYXZlICUrIFNVRkZJWCwgcjEKKyAgICBSRVBfUkVUCisKKyVlbmRpZgorCitJTklUX1hNTSBzc2UKKworJW1hY3JvIElOVEVSTF9TU0UgNQorICAgIG1vdmEgICAgICUzLCAlMgorICAgIHVucGNrbHBzICUyLCAlMQorICAgIHVucGNraHBzICUzLCAlMQorICAgIG1vdmEgICU0KCU1KSwgJTIKKyAgICBtb3ZhICAlNCglNSsxKSwgJTMKKyVlbmRtYWNybworCislZGVmaW5lIElOVEVSTCBJTlRFUkxfU1NFCisKK0RFQ0xfUEFTUyBwYXNzX3NzZSwgUEFTU19CSUcgMQorREVDTF9QQVNTIHBhc3NfaW50ZXJsZWF2ZV9zc2UsIFBBU1NfQklHIDAKKworJW1hY3JvIEZGVF9DQUxDX0ZVTkMgMAorY2dsb2JhbCBmZnRfY2FsYywgMiw1LDgKKyAgICBtb3YgICAgIHIzZCwgW3IwICsgRkZUQ29udGV4dC5uYml0c10KKyAgICBQVVNIICAgIHIxCisgICAgUFVTSCAgICByMworICAgIG1vdiAgICAgcjAsIHIxCisgICAgbW92ICAgICByMSwgcjMKKyAgICBGRlRfRElTUEFUQ0ggX2ludGVybGVhdmUgJSsgU1VGRklYLCByMQorICAgIFBPUCAgICAgcmN4CisgICAgUE9QICAgICByNAorICAgIGNtcCAgICAgcmN4LCAzKyhtbXNpemUvMTYpCisgICAgamcgICAgICAuZW5kCisgICAgbW92ICAgICByMiwgLTEKKyAgICBhZGQgICAgIHJjeCwgMworICAgIHNobCAgICAgcjIsIGNsCisgICAgc3ViICAgICByNCwgcjIKKy5sb29wOgorJWlmIG1tc2l6ZSA9PSA4CisgICAgUFNXQVBEICBtMCwgW3I0ICsgcjIgKyA0XQorICAgIG1vdmEgW3I0ICsgcjIgKyA0XSwgbTAKKyVlbHNlCisgICAgbW92YXBzICAgeG1tMCwgW3I0ICsgcjJdCisgICAgbW92YXBzICAgeG1tMSwgeG1tMAorICAgIHVucGNrbHBzIHhtbTAsIFtyNCArIHIyICsgMTZdCisgICAgdW5wY2tocHMgeG1tMSwgW3I0ICsgcjIgKyAxNl0KKyAgICBtb3ZhcHMgICBbcjQgKyByMl0sICAgICAgeG1tMAorICAgIG1vdmFwcyAgIFtyNCArIHIyICsgMTZdLCB4bW0xCislZW5kaWYKKyAgICBhZGQgICAgICByMiwgbW1zaXplKjIKKyAgICBqbCAgICAgICAubG9vcAorLmVuZDoKKyVpZiBjcHVmbGFnKDNkbm93KQorICAgIGZlbW1zCisgICAgUkVUCislZWxzZQorICAgIFJFUF9SRVQKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggM2Rub3cKK0ZGVF9DQUxDX0ZVTkMKK0lOSVRfTU1YIDNkbm93ZXh0CitGRlRfQ0FMQ19GVU5DCislZW5kaWYKK0lOSVRfWE1NIHNzZQorRkZUX0NBTENfRlVOQworCitjZ2xvYmFsIGZmdF9wZXJtdXRlLCAyLDcsMQorICAgIG1vdiAgICAgcjQsICBbcjAgKyBGRlRDb250ZXh0LnJldnRhYl0KKyAgICBtb3YgICAgIHI1LCAgW3IwICsgRkZUQ29udGV4dC50bXBidWZdCisgICAgbW92ICAgICBlY3gsIFtyMCArIEZGVENvbnRleHQubmJpdHNdCisgICAgbW92ICAgICByMiwgMQorICAgIHNobCAgICAgcjIsIGNsCisgICAgeG9yICAgICByMCwgcjAKKyVpZiBBUkNIX1g4Nl8zMgorICAgIG1vdiAgICAgcjEsIHIxbQorJWVuZGlmCisubG9vcDoKKyAgICBtb3ZhcHMgIHhtbTAsIFtyMSArIDgqcjBdCisgICAgbW92enggICByNiwgd29yZCBbcjQgKyAyKnIwXQorICAgIG1vdnp4ICAgcjMsIHdvcmQgW3I0ICsgMipyMCArIDJdCisgICAgbW92bHBzICBbcjUgKyA4KnI2XSwgeG1tMAorICAgIG1vdmhwcyAgW3I1ICsgOCpyM10sIHhtbTAKKyAgICBhZGQgICAgIHIwLCAyCisgICAgY21wICAgICByMCwgcjIKKyAgICBqbCAgICAgIC5sb29wCisgICAgc2hsICAgICByMiwgMworICAgIGFkZCAgICAgcjEsIHIyCisgICAgYWRkICAgICByNSwgcjIKKyAgICBuZWcgICAgIHIyCis7IG5iaXRzID49IDIgKEZGVDQpIGFuZCBzaXplb2YoRkZUQ29tcGxleCk9OCA9PiBhdCBsZWFzdCAzMkIKKy5sb29wY29weToKKyAgICBtb3ZhcHMgIHhtbTAsIFtyNSArIHIyXQorICAgIG1vdmFwcyAgeG1tMSwgW3I1ICsgcjIgKyAxNl0KKyAgICBtb3ZhcHMgIFtyMSArIHIyXSwgeG1tMAorICAgIG1vdmFwcyAgW3IxICsgcjIgKyAxNl0sIHhtbTEKKyAgICBhZGQgICAgIHIyLCAzMgorICAgIGpsICAgICAgLmxvb3Bjb3B5CisgICAgUkVQX1JFVAorCislbWFjcm8gSU1EQ1RfQ0FMQ19GVU5DIDAKK2NnbG9iYWwgaW1kY3RfY2FsYywgMyw1LDMKKyAgICBtb3YgICAgIHIzZCwgW3IwICsgRkZUQ29udGV4dC5tZGN0c2l6ZV0KKyAgICBtb3YgICAgIHI0LCAgW3IwICsgRkZUQ29udGV4dC5pbWRjdGhhbGZdCisgICAgYWRkICAgICByMSwgIHIzCisgICAgUFVTSCAgICByMworICAgIFBVU0ggICAgcjEKKyVpZiBBUkNIX1g4Nl8zMgorICAgIHB1c2ggICAgcjIKKyAgICBwdXNoICAgIHIxCisgICAgcHVzaCAgICByMAorJWVsc2UKKyAgICBzdWIgICAgIHJzcCwgOCszMipXSU42NCA7IGFsbG9jYXRlIHdpbjY0IHNoYWRvdyBzcGFjZQorJWVuZGlmCisgICAgY2FsbCAgICByNAorJWlmIEFSQ0hfWDg2XzMyCisgICAgYWRkICAgICBlc3AsIDEyCislZWxzZQorICAgIGFkZCAgICAgcnNwLCA4KzMyKldJTjY0CislZW5kaWYKKyAgICBQT1AgICAgIHIxCisgICAgUE9QICAgICByMworICAgIGxlYSAgICAgcjAsIFtyMSArIDIqcjNdCisgICAgbW92ICAgICByMiwgcjMKKyAgICBzdWIgICAgIHIzLCBtbXNpemUKKyAgICBuZWcgICAgIHIyCisgICAgbW92YSAgICBtMiwgW3BzX25lZ10KKy5sb29wOgorJWlmIG1tc2l6ZSA9PSA4CisgICAgUFNXQVBEICBtMCwgW3IxICsgcjNdCisgICAgUFNXQVBEICBtMSwgW3IwICsgcjJdCisgICAgcHhvciAgICBtMCwgbTIKKyVlbHNlCisgICAgbW92YSAgICBtMCwgW3IxICsgcjNdCisgICAgbW92YSAgICBtMSwgW3IwICsgcjJdCisgICAgc2h1ZnBzICBtMCwgbTAsIDB4MWIKKyAgICBzaHVmcHMgIG0xLCBtMSwgMHgxYgorICAgIHhvcnBzICAgbTAsIG0yCislZW5kaWYKKyAgICBtb3ZhIFtyMCArIHIzXSwgbTEKKyAgICBtb3ZhIFtyMSArIHIyXSwgbTAKKyAgICBzdWIgICAgIHIzLCBtbXNpemUKKyAgICBhZGQgICAgIHIyLCBtbXNpemUKKyAgICBqbCAgICAgIC5sb29wCislaWYgY3B1ZmxhZygzZG5vdykKKyAgICBmZW1tcworICAgIFJFVAorJWVsc2UKKyAgICBSRVBfUkVUCislZW5kaWYKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIDNkbm93CitJTURDVF9DQUxDX0ZVTkMKK0lOSVRfTU1YIDNkbm93ZXh0CitJTURDVF9DQUxDX0ZVTkMKKyVlbmRpZgorCitJTklUX1hNTSBzc2UKK0lNRENUX0NBTENfRlVOQworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIDNkbm93CislZGVmaW5lIG11bHBzIHBmbXVsCislZGVmaW5lIGFkZHBzIHBmYWRkCislZGVmaW5lIHN1YnBzIHBmc3ViCislZGVmaW5lIHVucGNrbHBzIHB1bnBja2xkcQorJWRlZmluZSB1bnBja2hwcyBwdW5wY2toZHEKK0RFQ0xfUEFTUyBwYXNzXzNkbm93LCBQQVNTX1NNQUxMIDEsIFt3cV0sIFt3cStvMXFdCitERUNMX1BBU1MgcGFzc19pbnRlcmxlYXZlXzNkbm93LCBQQVNTX0JJRyAwCislZGVmaW5lIHBhc3NfM2Rub3dleHQgcGFzc18zZG5vdworJWRlZmluZSBwYXNzX2ludGVybGVhdmVfM2Rub3dleHQgcGFzc19pbnRlcmxlYXZlXzNkbm93CislZW5kaWYKKworJWlmZGVmIFBJQworJWRlZmluZSBTRUNUSU9OX1JFTCAtICQkCislZWxzZQorJWRlZmluZSBTRUNUSU9OX1JFTAorJWVuZGlmCisKKyVtYWNybyBERUNMX0ZGVCAxLTIgOyBuYml0cywgc3VmZml4CislaWZpZG4gJTAsIDEKKyV4ZGVmaW5lIGZ1bGxzdWZmaXggU1VGRklYCislZWxzZQorJXhkZWZpbmUgZnVsbHN1ZmZpeCAlMiAlKyBTVUZGSVgKKyVlbmRpZgorJXhkZWZpbmUgbGlzdF9vZl9mZnQgZmZ0NCAlKyBTVUZGSVggU0VDVElPTl9SRUwsIGZmdDggJSsgU1VGRklYIFNFQ1RJT05fUkVMCislaWYgJTE+PTUKKyV4ZGVmaW5lIGxpc3Rfb2ZfZmZ0IGxpc3Rfb2ZfZmZ0LCBmZnQxNiAlKyBTVUZGSVggU0VDVElPTl9SRUwKKyVlbmRpZgorJWlmICUxPj02CisleGRlZmluZSBsaXN0X29mX2ZmdCBsaXN0X29mX2ZmdCwgZmZ0MzIgJSsgZnVsbHN1ZmZpeCBTRUNUSU9OX1JFTAorJWVuZGlmCisKKyVhc3NpZ24gbiAxPDwlMQorJXJlcCAxNy0lMQorJWFzc2lnbiBuMiBuLzIKKyVhc3NpZ24gbjQgbi80CisleGRlZmluZSBsaXN0X29mX2ZmdCBsaXN0X29mX2ZmdCwgZmZ0ICUrIG4gJSsgZnVsbHN1ZmZpeCBTRUNUSU9OX1JFTAorCithbGlnbiAxNgorZmZ0ICUrIG4gJSsgZnVsbHN1ZmZpeDoKKyAgICBjYWxsIGZmdCAlKyBuMiAlKyBTVUZGSVgKKyAgICBhZGQgcjAsIG4qNCAtIChuJigtMjw8JTEpKQorICAgIGNhbGwgZmZ0ICUrIG40ICUrIFNVRkZJWAorICAgIGFkZCByMCwgbioyIC0gKG4yJigtMjw8JTEpKQorICAgIGNhbGwgZmZ0ICUrIG40ICUrIFNVRkZJWAorICAgIHN1YiByMCwgbio2ICsgKG4yJigtMjw8JTEpKQorICAgIGxlYSByMSwgW2Nvc18gJSsgbl0KKyAgICBtb3YgcjJkLCBuNC8yCisgICAgam1wIHBhc3MgJSsgZnVsbHN1ZmZpeAorCislYXNzaWduIG4gbioyCislZW5kcmVwCisldW5kZWYgbgorCithbGlnbiA4CitkaXNwYXRjaF90YWIgJSsgZnVsbHN1ZmZpeDogcG9pbnRlciBsaXN0X29mX2ZmdAorJWVuZG1hY3JvIDsgREVDTF9GRlQKKworJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1lNTSBhdngKK0RFQ0xfRkZUIDYKK0RFQ0xfRkZUIDYsIF9pbnRlcmxlYXZlCislZW5kaWYKK0lOSVRfWE1NIHNzZQorREVDTF9GRlQgNQorREVDTF9GRlQgNSwgX2ludGVybGVhdmUKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggM2Rub3cKK0RFQ0xfRkZUIDQKK0RFQ0xfRkZUIDQsIF9pbnRlcmxlYXZlCitJTklUX01NWCAzZG5vd2V4dAorREVDTF9GRlQgNAorREVDTF9GRlQgNCwgX2ludGVybGVhdmUKKyVlbmRpZgorCitJTklUX1hNTSBzc2UKKyV1bmRlZiBtdWxwcworJXVuZGVmIGFkZHBzCisldW5kZWYgc3VicHMKKyV1bmRlZiB1bnBja2xwcworJXVuZGVmIHVucGNraHBzCisKKyVtYWNybyBQUkVST1RBVEVSIDUgOy0yKmssIDIqaywgaW5wdXQrbjQsIHRjb3MrbjgsIHRzaW4rbjgKKyVpZiBtbXNpemUgPT0gOCA7IGoqMisyLW40LCBuNC0yLWoqMiwgaW5wdXQrbjQsIHRjb3MrbjgsIHRzaW4rbjgKKyAgICBQU1dBUEQgICAgIG0wLCBbJTMrJTIqNF0KKyAgICBtb3ZxICAgICAgIG0yLCBbJTMrJTEqNC04XQorICAgIG1vdnEgICAgICAgbTMsIG0wCisgICAgcHVucGNrbGRxICBtMCwgbTIKKyAgICBwdW5wY2toZHEgIG0yLCBtMworICAgIG1vdmQgICAgICAgbTEsIFslNCslMSoyLTRdIDsgdGNvc1tqXQorICAgIG1vdmQgICAgICAgbTMsIFslNCslMioyXSAgIDsgdGNvc1tuNC1qLTFdCisgICAgcHVucGNrbGRxICBtMSwgWyU1KyUxKjItNF0gOyB0c2luW2pdCisgICAgcHVucGNrbGRxICBtMywgWyU1KyUyKjJdICAgOyB0c2luW240LWotMV0KKworICAgIG1vdmEgICAgICAgbTQsIG0wCisgICAgUFNXQVBEICAgICBtNSwgbTEKKyAgICBwZm11bCAgICAgIG0wLCBtMQorICAgIHBmbXVsICAgICAgbTQsIG01CisgICAgbW92YSAgICAgICBtNiwgbTIKKyAgICBQU1dBUEQgICAgIG01LCBtMworICAgIHBmbXVsICAgICAgbTIsIG0zCisgICAgcGZtdWwgICAgICBtNiwgbTUKKyVpZiBjcHVmbGFnKDNkbm93ZXh0KQorICAgIHBmcG5hY2MgICAgbTAsIG00CisgICAgcGZwbmFjYyAgICBtMiwgbTYKKyVlbHNlCisgICAgU0JVVFRFUkZMWSBkcSwgMCwgNCwgMQorICAgIFNCVVRURVJGTFkgZHEsIDIsIDYsIDMKKyAgICBweG9yICAgICAgIG00LCBtNworICAgIHB4b3IgICAgICAgbTYsIG03CisgICAgcGZhZGQgICAgICBtMCwgbTQKKyAgICBwZmFkZCAgICAgIG0yLCBtNgorJWVuZGlmCislZWxzZQorICAgIG1vdmFwcyAgIHhtbTAsIFslMyslMio0XQorICAgIG1vdmFwcyAgIHhtbTEsIFslMyslMSo0LTB4MTBdCisgICAgbW92YXBzICAgeG1tMiwgeG1tMAorICAgIHNodWZwcyAgIHhtbTAsIHhtbTEsIDB4ODgKKyAgICBzaHVmcHMgICB4bW0xLCB4bW0yLCAweDc3CisgICAgbW92bHBzICAgeG1tNCwgWyU0KyUyKjJdCisgICAgbW92bHBzICAgeG1tNSwgWyU1KyUyKjIrMHgwXQorICAgIG1vdmhwcyAgIHhtbTQsIFslNCslMSoyLTB4OF0KKyAgICBtb3ZocHMgICB4bW01LCBbJTUrJTEqMi0weDhdCisgICAgbW92YXBzICAgeG1tMiwgeG1tMAorICAgIG1vdmFwcyAgIHhtbTMsIHhtbTEKKyAgICBtdWxwcyAgICB4bW0wLCB4bW01CisgICAgbXVscHMgICAgeG1tMSwgeG1tNAorICAgIG11bHBzICAgIHhtbTIsIHhtbTQKKyAgICBtdWxwcyAgICB4bW0zLCB4bW01CisgICAgc3VicHMgICAgeG1tMSwgeG1tMAorICAgIGFkZHBzICAgIHhtbTIsIHhtbTMKKyAgICBtb3ZhcHMgICB4bW0wLCB4bW0xCisgICAgdW5wY2tscHMgeG1tMSwgeG1tMgorICAgIHVucGNraHBzIHhtbTAsIHhtbTIKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBDTVVMIDYgO2osIHhtbTAsIHhtbTEsIDMsIDQsIDUKKyAgICBtdWxwcyAgICAgIG02LCAlMywgWyU1KyUxXQorICAgIG11bHBzICAgICAgbTcsICUyLCBbJTUrJTFdCisgICAgbXVscHMgICAgICAlMiwgJTIsIFslNislMV0KKyAgICBtdWxwcyAgICAgICUzLCAlMywgWyU2KyUxXQorICAgIHN1YnBzICAgICAgJTIsICUyLCBtNgorICAgIGFkZHBzICAgICAgJTMsICUzLCBtNworJWVuZG1hY3JvCisKKyVtYWNybyBQT1NST1RBVEVTSFVGX0FWWCA1IDtqLCBrLCB6K244LCB0Y29zK244LCB0c2luK244CisucG9zdDoKKyAgICB2bW92YXBzICAgICAgeW1tMSwgICBbJTMrJTEqMl0KKyAgICB2bW92YXBzICAgICAgeW1tMCwgICBbJTMrJTEqMisweDIwXQorICAgIHZtb3ZhcHMgICAgICB5bW0zLCAgIFslMyslMioyXQorICAgIHZtb3ZhcHMgICAgICB5bW0yLCAgIFslMyslMioyKzB4MjBdCisKKyAgICBDTVVMICAgICAgICAgJTEsIHltbTAsIHltbTEsICUzLCAlNCwgJTUKKyAgICBDTVVMICAgICAgICAgJTIsIHltbTIsIHltbTMsICUzLCAlNCwgJTUKKyAgICB2c2h1ZnBzICAgICAgeW1tMSwgeW1tMSwgeW1tMSwgMHgxYgorICAgIHZzaHVmcHMgICAgICB5bW0zLCB5bW0zLCB5bW0zLCAweDFiCisgICAgdnBlcm0yZjEyOCAgIHltbTEsIHltbTEsIHltbTEsIDB4MDEKKyAgICB2cGVybTJmMTI4ICAgeW1tMywgeW1tMywgeW1tMywgMHgwMQorICAgIHZ1bnBja2xwcyAgICB5bW02LCB5bW0yLCB5bW0xCisgICAgdnVucGNraHBzICAgIHltbTQsIHltbTIsIHltbTEKKyAgICB2dW5wY2tscHMgICAgeW1tNywgeW1tMCwgeW1tMworICAgIHZ1bnBja2hwcyAgICB5bW01LCB5bW0wLCB5bW0zCisKKyAgICB2ZXh0cmFjdGYxMjggWyUzKyUxKjJdLCAgICAgIHltbTcsIDAKKyAgICB2ZXh0cmFjdGYxMjggWyUzKyUxKjIrMHgxMF0sIHltbTUsIDAKKyAgICB2ZXh0cmFjdGYxMjggWyUzKyUxKjIrMHgyMF0sIHltbTcsIDEKKyAgICB2ZXh0cmFjdGYxMjggWyUzKyUxKjIrMHgzMF0sIHltbTUsIDEKKworICAgIHZleHRyYWN0ZjEyOCBbJTMrJTIqMl0sICAgICAgeW1tNiwgMAorICAgIHZleHRyYWN0ZjEyOCBbJTMrJTIqMisweDEwXSwgeW1tNCwgMAorICAgIHZleHRyYWN0ZjEyOCBbJTMrJTIqMisweDIwXSwgeW1tNiwgMQorICAgIHZleHRyYWN0ZjEyOCBbJTMrJTIqMisweDMwXSwgeW1tNCwgMQorICAgIHN1YiAgICAgICUyLCAgIDB4MjAKKyAgICBhZGQgICAgICAlMSwgICAweDIwCisgICAgamwgICAgICAgLnBvc3QKKyVlbmRtYWNybworCislbWFjcm8gUE9TUk9UQVRFU0hVRiA1IDtqLCBrLCB6K244LCB0Y29zK244LCB0c2luK244CisucG9zdDoKKyAgICBtb3ZhcHMgICB4bW0xLCBbJTMrJTEqMl0KKyAgICBtb3ZhcHMgICB4bW0wLCBbJTMrJTEqMisweDEwXQorICAgIENNVUwgICAgICUxLCAgIHhtbTAsIHhtbTEsICUzLCAlNCwgJTUKKyAgICBtb3ZhcHMgICB4bW01LCBbJTMrJTIqMl0KKyAgICBtb3ZhcHMgICB4bW00LCBbJTMrJTIqMisweDEwXQorICAgIENNVUwgICAgICUyLCAgIHhtbTQsIHhtbTUsICUzLCAlNCwgJTUKKyAgICBzaHVmcHMgICB4bW0xLCB4bW0xLCAweDFiCisgICAgc2h1ZnBzICAgeG1tNSwgeG1tNSwgMHgxYgorICAgIG1vdmFwcyAgIHhtbTYsIHhtbTQKKyAgICB1bnBja2hwcyB4bW00LCB4bW0xCisgICAgdW5wY2tscHMgeG1tNiwgeG1tMQorICAgIG1vdmFwcyAgIHhtbTIsIHhtbTAKKyAgICB1bnBja2xwcyB4bW0wLCB4bW01CisgICAgdW5wY2tocHMgeG1tMiwgeG1tNQorICAgIG1vdmFwcyAgIFslMyslMioyXSwgICAgICB4bW02CisgICAgbW92YXBzICAgWyUzKyUyKjIrMHgxMF0sIHhtbTQKKyAgICBtb3ZhcHMgICBbJTMrJTEqMl0sICAgICAgeG1tMAorICAgIG1vdmFwcyAgIFslMyslMSoyKzB4MTBdLCB4bW0yCisgICAgc3ViICAgICAgJTIsICAgMHgxMAorICAgIGFkZCAgICAgICUxLCAgIDB4MTAKKyAgICBqbCAgICAgICAucG9zdAorJWVuZG1hY3JvCisKKyVtYWNybyBDTVVMXzNETk9XIDYKKyAgICBtb3ZhICAgICAgIG02LCBbJTErJTIqMl0KKyAgICBtb3ZhICAgICAgICUzLCBbJTErJTIqMis4XQorICAgIG1vdmEgICAgICAgJTQsIG02CisgICAgbW92YSAgICAgICBtNywgJTMKKyAgICBwZm11bCAgICAgIG02LCBbJTUrJTJdCisgICAgcGZtdWwgICAgICAlMywgWyU2KyUyXQorICAgIHBmbXVsICAgICAgJTQsIFslNislMl0KKyAgICBwZm11bCAgICAgIG03LCBbJTUrJTJdCisgICAgcGZzdWIgICAgICAlMywgbTYKKyAgICBwZmFkZCAgICAgICU0LCBtNworJWVuZG1hY3JvCisKKyVtYWNybyBQT1NST1RBVEVTSFVGXzNETk9XIDUgO2osIGssIHorbjgsIHRjb3MrbjgsIHRzaW4rbjgKKy5wb3N0OgorICAgIENNVUxfM0ROT1cgJTMsICUxLCBtMCwgbTEsICU0LCAlNQorICAgIENNVUxfM0ROT1cgJTMsICUyLCBtMiwgbTMsICU0LCAlNQorICAgIG1vdmQgIFslMyslMSoyKyAwXSwgbTAKKyAgICBtb3ZkICBbJTMrJTIqMisxMl0sIG0xCisgICAgbW92ZCAgWyUzKyUyKjIrIDBdLCBtMgorICAgIG1vdmQgIFslMyslMSoyKzEyXSwgbTMKKyAgICBwc3JscSAgICAgIG0wLCAzMgorICAgIHBzcmxxICAgICAgbTEsIDMyCisgICAgcHNybHEgICAgICBtMiwgMzIKKyAgICBwc3JscSAgICAgIG0zLCAzMgorICAgIG1vdmQgIFslMyslMSoyKyA4XSwgbTAKKyAgICBtb3ZkICBbJTMrJTIqMisgNF0sIG0xCisgICAgbW92ZCAgWyUzKyUyKjIrIDhdLCBtMgorICAgIG1vdmQgIFslMyslMSoyKyA0XSwgbTMKKyAgICBzdWIgICAgICAgICUyLCA4CisgICAgYWRkICAgICAgICAlMSwgOAorICAgIGpsICAgICAgICAgLnBvc3QKKyVlbmRtYWNybworCislbWFjcm8gREVDTF9JTURDVCAxCitjZ2xvYmFsIGltZGN0X2hhbGYsIDMsMTIsODsgRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQKKyVpZiBBUkNIX1g4Nl82NAorJWRlZmluZSBycmV2dGFiIHI3CislZGVmaW5lIHJ0Y29zICAgcjgKKyVkZWZpbmUgcnRzaW4gICByOQorJWVsc2UKKyVkZWZpbmUgcnJldnRhYiByNgorJWRlZmluZSBydHNpbiAgIHI2CislZGVmaW5lIHJ0Y29zICAgcjUKKyVlbmRpZgorICAgIG1vdiAgIHIzZCwgW3IwK0ZGVENvbnRleHQubWRjdHNpemVdCisgICAgYWRkICAgcjIsIHIzCisgICAgc2hyICAgcjMsIDEKKyAgICBtb3YgICBydGNvcywgW3IwK0ZGVENvbnRleHQudGNvc10KKyAgICBtb3YgICBydHNpbiwgW3IwK0ZGVENvbnRleHQudHNpbl0KKyAgICBhZGQgICBydGNvcywgcjMKKyAgICBhZGQgICBydHNpbiwgcjMKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCisgICAgcHVzaCAgcnRjb3MKKyAgICBwdXNoICBydHNpbgorJWVuZGlmCisgICAgc2hyICAgcjMsIDEKKyAgICBtb3YgICBycmV2dGFiLCBbcjArRkZUQ29udGV4dC5yZXZ0YWJdCisgICAgYWRkICAgcnJldnRhYiwgcjMKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCisgICAgcHVzaCAgcnJldnRhYgorJWVuZGlmCisKKyVpZiBtbXNpemUgPT0gOAorICAgIHN1YiAgIHIzLCAyCislZWxzZQorICAgIHN1YiAgIHIzLCA0CislZW5kaWYKKyVpZiBBUkNIX1g4Nl82NCB8fCBtbXNpemUgPT0gOAorICAgIHhvciAgIHI0LCByNAorICAgIHN1YiAgIHI0LCByMworJWVuZGlmCislaWYgbm90Y3B1ZmxhZygzZG5vd2V4dCkgJiYgbW1zaXplID09IDgKKyAgICBtb3ZkICBtNywgW3BzX25lZ10KKyVlbmRpZgorLnByZToKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCis7dW5zcGlsbAorJWlmIG1tc2l6ZSAhPSA4CisgICAgeG9yICAgcjQsIHI0CisgICAgc3ViICAgcjQsIHIzCislZW5kaWYKKyAgICBtb3YgICBydGNvcywgW2VzcCs4XQorICAgIG1vdiAgIHJ0c2luLCBbZXNwKzRdCislZW5kaWYKKworICAgIFBSRVJPVEFURVIgcjQsIHIzLCByMiwgcnRjb3MsIHJ0c2luCislaWYgbW1zaXplID09IDgKKyAgICBtb3YgICAgcjYsIFtlc3BdICAgICAgICAgICAgICAgIDsgcnJldnRhYiA9IHB0cituOAorICAgIG1vdnp4ICByNSwgIHdvcmQgW3JyZXZ0YWIrcjQtMl0gOyBycmV2dGFiW2pdCisgICAgbW92enggIHI2LCAgd29yZCBbcnJldnRhYityM10gICA7IHJyZXZ0YWJbbjQtai0xXQorICAgIG1vdmEgW3IxK3I1KjhdLCBtMAorICAgIG1vdmEgW3IxK3I2KjhdLCBtMgorICAgIGFkZCAgICByNCwgMgorICAgIHN1YiAgICByMywgMgorJWVsc2UKKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdnp4ICByNSwgIHdvcmQgW3JyZXZ0YWIrcjQtNF0KKyAgICBtb3Z6eCAgcjYsICB3b3JkIFtycmV2dGFiK3I0LTJdCisgICAgbW92enggIHIxMCwgd29yZCBbcnJldnRhYityM10KKyAgICBtb3Z6eCAgcjExLCB3b3JkIFtycmV2dGFiK3IzKzJdCisgICAgbW92bHBzIFtyMStyNSAqOF0sIHhtbTAKKyAgICBtb3ZocHMgW3IxK3I2ICo4XSwgeG1tMAorICAgIG1vdmxwcyBbcjErcjEwKjhdLCB4bW0xCisgICAgbW92aHBzIFtyMStyMTEqOF0sIHhtbTEKKyAgICBhZGQgICAgcjQsIDQKKyVlbHNlCisgICAgbW92ICAgIHI2LCBbZXNwXQorICAgIG1vdnp4ICByNSwgd29yZCBbcjYrcjQtNF0KKyAgICBtb3Z6eCAgcjQsIHdvcmQgW3I2K3I0LTJdCisgICAgbW92bHBzIFtyMStyNSo4XSwgeG1tMAorICAgIG1vdmhwcyBbcjErcjQqOF0sIHhtbTAKKyAgICBtb3Z6eCAgcjUsIHdvcmQgW3I2K3IzXQorICAgIG1vdnp4ICByNCwgd29yZCBbcjYrcjMrMl0KKyAgICBtb3ZscHMgW3IxK3I1KjhdLCB4bW0xCisgICAgbW92aHBzIFtyMStyNCo4XSwgeG1tMQorJWVuZGlmCisgICAgc3ViICAgIHIzLCA0CislZW5kaWYKKyAgICBqbnMgICAgLnByZQorCisgICAgbW92ICByNSwgcjAKKyAgICBtb3YgIHI2LCByMQorICAgIG1vdiAgcjAsIHIxCisgICAgbW92ICByMWQsIFtyNStGRlRDb250ZXh0Lm5iaXRzXQorCisgICAgRkZUX0RJU1BBVENIIFNVRkZJWCwgcjEKKworICAgIG1vdiAgcjBkLCBbcjUrRkZUQ29udGV4dC5tZGN0c2l6ZV0KKyAgICBhZGQgIHI2LCByMAorICAgIHNociAgcjAsIDEKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCislZGVmaW5lIHJ0Y29zIHIyCislZGVmaW5lIHJ0c2luIHIzCisgICAgbW92ICBydGNvcywgW2VzcCs4XQorICAgIG1vdiAgcnRzaW4sIFtlc3ArNF0KKyVlbmRpZgorICAgIG5lZyAgcjAKKyAgICBtb3YgIHIxLCAtbW1zaXplCisgICAgc3ViICByMSwgcjAKKyAgICAlMSByMCwgcjEsIHI2LCBydGNvcywgcnRzaW4KKyVpZiBBUkNIX1g4Nl82NCA9PSAwCisgICAgYWRkIGVzcCwgMTIKKyVlbmRpZgorJWlmIG1tc2l6ZSA9PSA4CisgICAgZmVtbXMKKyVlbmRpZgorICAgIFJFVAorJWVuZG1hY3JvCisKK0RFQ0xfSU1EQ1QgUE9TUk9UQVRFU0hVRgorCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIDNkbm93CitERUNMX0lNRENUIFBPU1JPVEFURVNIVUZfM0ROT1cKKworSU5JVF9NTVggM2Rub3dleHQKK0RFQ0xfSU1EQ1QgUE9TUk9UQVRFU0hVRl8zRE5PVworJWVuZGlmCisKK0lOSVRfWU1NIGF2eAorCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0RFQ0xfSU1EQ1QgUE9TUk9UQVRFU0hVRl9BVlgKKyVlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZmdC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZmdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ODA5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmZ0LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfWDg2X0ZGVF9ICisjZGVmaW5lIEFWQ09ERUNfWDg2X0ZGVF9ICisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ZmdC5oIgorCit2b2lkIGZmX2ZmdF9wZXJtdXRlX3NzZShGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KTsKK3ZvaWQgZmZfZmZ0X2NhbGNfYXZ4KEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopOwordm9pZCBmZl9mZnRfY2FsY19zc2UoRkZUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqeik7Cit2b2lkIGZmX2ZmdF9jYWxjXzNkbm93KEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopOwordm9pZCBmZl9mZnRfY2FsY18zZG5vd2V4dChGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KTsKKwordm9pZCBmZl9pbWRjdF9jYWxjXzNkbm93KEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKK3ZvaWQgZmZfaW1kY3RfaGFsZl8zZG5vdyhGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm91dHB1dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dCk7Cit2b2lkIGZmX2ltZGN0X2NhbGNfM2Rub3dleHQoRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpOwordm9pZCBmZl9pbWRjdF9oYWxmXzNkbm93ZXh0KEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKK3ZvaWQgZmZfaW1kY3RfY2FsY19zc2UoRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpOwordm9pZCBmZl9pbWRjdF9oYWxmX3NzZShGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm91dHB1dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dCk7Cit2b2lkIGZmX2ltZGN0X2hhbGZfYXZ4KEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfWDg2X0ZGVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmZ0X2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9mZnRfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODIyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmZ0X2luaXQuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImZmdC5oIgorCithdl9jb2xkIHZvaWQgZmZfZmZ0X2luaXRfeDg2KEZGVENvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworI2lmIEFSQ0hfWDg2XzMyCisgICAgaWYgKEVYVEVSTkFMX0FNRDNETk9XKGNwdV9mbGFncykpIHsKKyAgICAgICAgLyogM0ROb3chIGZvciBLNi0yLzMgKi8KKyAgICAgICAgcy0+aW1kY3RfY2FsYyA9IGZmX2ltZGN0X2NhbGNfM2Rub3c7CisgICAgICAgIHMtPmltZGN0X2hhbGYgPSBmZl9pbWRjdF9oYWxmXzNkbm93OworICAgICAgICBzLT5mZnRfY2FsYyAgID0gZmZfZmZ0X2NhbGNfM2Rub3c7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9BTUQzRE5PV0VYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIC8qIDNETm93RXggZm9yIEs3ICovCisgICAgICAgIHMtPmltZGN0X2NhbGMgPSBmZl9pbWRjdF9jYWxjXzNkbm93ZXh0OworICAgICAgICBzLT5pbWRjdF9oYWxmID0gZmZfaW1kY3RfaGFsZl8zZG5vd2V4dDsKKyAgICAgICAgcy0+ZmZ0X2NhbGMgICA9IGZmX2ZmdF9jYWxjXzNkbm93ZXh0OworICAgIH0KKyNlbmRpZgorICAgIGlmIChFWFRFUk5BTF9TU0UoY3B1X2ZsYWdzKSkgeworICAgICAgICAvKiBTU0UgZm9yIFAzL1A0L0s4ICovCisgICAgICAgIHMtPmltZGN0X2NhbGMgID0gZmZfaW1kY3RfY2FsY19zc2U7CisgICAgICAgIHMtPmltZGN0X2hhbGYgID0gZmZfaW1kY3RfaGFsZl9zc2U7CisgICAgICAgIHMtPmZmdF9wZXJtdXRlID0gZmZfZmZ0X3Blcm11dGVfc3NlOworICAgICAgICBzLT5mZnRfY2FsYyAgICA9IGZmX2ZmdF9jYWxjX3NzZTsKKyAgICAgICAgcy0+ZmZ0X3Blcm11dGF0aW9uID0gRkZfRkZUX1BFUk1fU1dBUF9MU0JTOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykgJiYgcy0+bmJpdHMgPj0gNSkgeworICAgICAgICAvKiBBVlggZm9yIFNCICovCisgICAgICAgIHMtPmltZGN0X2hhbGYgICAgICA9IGZmX2ltZGN0X2hhbGZfYXZ4OworICAgICAgICBzLT5mZnRfY2FsYyAgICAgICAgPSBmZl9mZnRfY2FsY19hdng7CisgICAgICAgIHMtPmZmdF9wZXJtdXRhdGlvbiA9IEZGX0ZGVF9QRVJNX0FWWDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmxhY19kc3BfZ3BsLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9mbGFjX2RzcF9ncGwuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZGYwODMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmxhY19kc3BfZ3BsLmFzbQpAQCAtMCwwICsxLDEwMSBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogRkxBQyBEU1AgZnVuY3Rpb25zCis7KgorOyogQ29weXJpZ2h0IChjKSAyMDE0IEphbWVzIERhcm5sZXkgPGphbWVzLmRhcm5sZXlAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzsqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7KiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKzsqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKzsqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis7KiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9URVhUCisKK0lOSVRfWE1NIHNzZTQKKyVpZiBBUkNIX1g4Nl82NAorICAgIGNnbG9iYWwgZmxhY19lbmNfbHBjXzE2LCA1LCA3LCA4LCAwLCByZXMsIHNtcCwgbGVuLCBvcmRlciwgY29lZnMKKyAgICBERUNMQVJFX1JFR19UTVAgNSwgNgorICAgICVkZWZpbmUgbGVuZ3RoIHIyZAorCisgICAgbW92c3hkIG9yZGVycSwgb3JkZXJkCislZWxzZQorICAgIGNnbG9iYWwgZmxhY19lbmNfbHBjXzE2LCA1LCA2LCA4LCAwLCByZXMsIHNtcCwgbGVuLCBvcmRlciwgY29lZnMKKyAgICBERUNMQVJFX1JFR19UTVAgMiwgNQorICAgICVkZWZpbmUgbGVuZ3RoIHIybXAKKyVlbmRpZgorCis7IEhlcmUgd2UgYXNzdW1lIHRoYXQgdGhlIG1heGltdW0gb3JkZXIgdmFsdWUgaXMgMzIuICBUaGlzIG1lYW5zIHRoYXQgd2Ugb25seQorOyBuZWVkIHRvIGNvcHkgYSBtYXhpbXVtIG9mIDMyIHNhbXBsZXMuICBUaGVyZWZvcmUgd2UgbGV0IHRoZSBwcmVwcm9jZXNzb3IKKzsgdW5yb2xsIHRoaXMgbG9vcCBhbmQgY29weSBhbGwgMzIuCislYXNzaWduIGl0ZXIgMAorJXJlcCAzMi8obW1zaXplLzQpCisgICAgbW92dSAgbTAsICAgICAgICAgW3NtcHEraXRlcl0KKyAgICBtb3Z1IFtyZXNxK2l0ZXJdLCAgbTAKKyAgICAlYXNzaWduIGl0ZXIgaXRlcittbXNpemUKKyVlbmRyZXAKKworbGVhICByZXNxLCAgIFtyZXNxK29yZGVycSo0XQorbGVhICBzbXBxLCAgIFtzbXBxK29yZGVycSo0XQorbGVhICBjb2Vmc3EsIFtjb2Vmc3Erb3JkZXJxKjRdCitzdWIgIGxlbmd0aCwgIG9yZGVyZAorbW92ZCBtMywgICAgICByNW0KK25lZyAgb3JkZXJxCisKKyVkZWZpbmUgcG9zaiB0MHEKKyVkZWZpbmUgbmVnaiB0MXEKKworLmxvb3BsZW46CisgICAgcHhvciBtMCwgICBtMAorICAgIHB4b3IgbTQsICAgbTQKKyAgICBweG9yIG02LCAgIG02CisgICAgbW92ICBwb3NqLCBvcmRlcnEKKyAgICB4b3IgIG5lZ2osIG5lZ2oKKworICAgIC5sb29wb3JkZXI6CisgICAgICAgIG1vdmQgICBtMiwgW2NvZWZzcStwb3NqKjRdIDsgYyA9IGNvZWZzW2pdCisgICAgICAgIFNQTEFURCBtMgorICAgICAgICBtb3Z1ICAgbTEsIFtzbXBxK25lZ2oqNC00XSA7IHMgPSBzbXBbaS1qLTFdCisgICAgICAgIG1vdnUgICBtNSwgW3NtcHErbmVnaio0LTQrbW1zaXplXQorICAgICAgICBtb3Z1ICAgbTcsIFtzbXBxK25lZ2oqNC00K21tc2l6ZSoyXQorICAgICAgICBwbXVsbGQgbTEsICBtMgorICAgICAgICBwbXVsbGQgbTUsICBtMgorICAgICAgICBwbXVsbGQgbTcsICBtMgorICAgICAgICBwYWRkZCAgbTAsICBtMSAgICAgICAgICAgICA7IHAgKz0gYyAqIHMKKyAgICAgICAgcGFkZGQgIG00LCAgbTUKKyAgICAgICAgcGFkZGQgIG02LCAgbTcKKworICAgICAgICBkZWMgICAgbmVnagorICAgICAgICBpbmMgICAgcG9zagorICAgIGpueiAubG9vcG9yZGVyCisKKyAgICBwc3JhZCAgbTAsICAgICBtMyAgICAgICAgICAgICAgOyBwID4+PSBzaGlmdAorICAgIHBzcmFkICBtNCwgICAgIG0zCisgICAgcHNyYWQgIG02LCAgICAgbTMKKyAgICBtb3Z1ICAgbTEsICAgIFtzbXBxXQorICAgIG1vdnUgICBtNSwgICAgW3NtcHErbW1zaXplXQorICAgIG1vdnUgICBtNywgICAgW3NtcHErbW1zaXplKjJdCisgICAgcHN1YmQgIG0xLCAgICAgbTAgICAgICAgICAgICAgIDsgc21wW2ldIC0gcAorICAgIHBzdWJkICBtNSwgICAgIG00CisgICAgcHN1YmQgIG03LCAgICAgbTYKKyAgICBtb3Z1ICBbcmVzcV0sICBtMSAgICAgICAgICAgICAgOyByZXNbaV0gPSBzbXBbaV0gLSAocCA+PiBzaGlmdCkKKyAgICBtb3Z1ICBbcmVzcSttbXNpemVdLCBtNQorICAgIG1vdnUgIFtyZXNxK21tc2l6ZSoyXSwgbTcKKworICAgIGFkZCByZXNxLCAgICAzKm1tc2l6ZQorICAgIGFkZCBzbXBxLCAgICAzKm1tc2l6ZQorICAgIHN1YiBsZW5ndGgsICgzKm1tc2l6ZSkvNAoramcgLmxvb3BsZW4KK1JFVApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZsYWNkc3AuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZsYWNkc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MGE2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmxhY2RzcC5hc20KQEAgLTAsMCArMSwzMjkgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIEZMQUMgRFNQIFNJTUQgb3B0aW1pemF0aW9ucworOyoKKzsqIENvcHlyaWdodCAoQykgMjAxNCBMb3JlbiBNZXJyaXR0Cis7KiBDb3B5cmlnaHQgKEMpIDIwMTQgSmFtZXMgQWxtZXIKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OIC50ZXh0CisKKyVtYWNybyBMUENfMzIgMQorSU5JVF9YTU0gJTEKK2NnbG9iYWwgZmxhY19scGNfMzIsIDUsNiw1LCBkZWNvZGVkLCBjb2VmZnMsIHByZWRfb3JkZXIsIHFsZXZlbCwgbGVuLCBqCisgICAgc3ViICAgIGxlbmQsIHByZWRfb3JkZXJkCisgICAgamxlIC5yZXQKKyAgICBsZWEgICAgZGVjb2RlZHEsIFtkZWNvZGVkcStwcmVkX29yZGVycSo0LThdCisgICAgbGVhICAgIGNvZWZmc3EsIFtjb2VmZnNxK3ByZWRfb3JkZXJxKjRdCisgICAgbmVnICAgIHByZWRfb3JkZXJxCisgICAgbW92ZCAgIG00LCBxbGV2ZWxtCitBTElHTiAxNgorLmxvb3Bfc2FtcGxlOgorICAgIG1vdmQgICBtMCwgW2RlY29kZWRxK3ByZWRfb3JkZXJxKjQrOF0KKyAgICBhZGQgICAgZGVjb2RlZHEsIDgKKyAgICBtb3ZkICAgbTEsIFtjb2VmZnNxK3ByZWRfb3JkZXJxKjRdCisgICAgcHhvciAgIG0yLCBtMgorICAgIHB4b3IgICBtMywgbTMKKyAgICBsZWEgICAganEsIFtwcmVkX29yZGVycSsxXQorICAgIHRlc3QgICBqcSwganEKKyAgICBqeiAuZW5kX29yZGVyCisubG9vcF9vcmRlcjoKKyAgICBQTUFDU0RRTCBtMiwgbTAsIG0xLCBtMiwgbTAKKyAgICBtb3ZkICAgbTAsIFtkZWNvZGVkcStqcSo0XQorICAgIFBNQUNTRFFMIG0zLCBtMSwgbTAsIG0zLCBtMQorICAgIG1vdmQgICBtMSwgW2NvZWZmc3EranEqNF0KKyAgICBpbmMgICAganEKKyAgICBqbCAubG9vcF9vcmRlcgorLmVuZF9vcmRlcjoKKyAgICBQTUFDU0RRTCBtMiwgbTAsIG0xLCBtMiwgbTAKKyAgICBwc3JscSAgbTIsIG00CisgICAgbW92ZCAgIG0wLCBbZGVjb2RlZHFdCisgICAgcGFkZGQgIG0wLCBtMgorICAgIG1vdmQgICBbZGVjb2RlZHFdLCBtMAorICAgIHN1YiAgbGVuZCwgMgorICAgIGpsIC5yZXQKKyAgICBQTUFDU0RRTCBtMywgbTEsIG0wLCBtMywgbTEKKyAgICBwc3JscSAgbTMsIG00CisgICAgbW92ZCAgIG0xLCBbZGVjb2RlZHErNF0KKyAgICBwYWRkZCAgbTEsIG0zCisgICAgbW92ZCAgIFtkZWNvZGVkcSs0XSwgbTEKKyAgICBqZyAubG9vcF9zYW1wbGUKKy5yZXQ6CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKKyVpZiBIQVZFX1hPUF9FWFRFUk5BTAorTFBDXzMyIHhvcAorJWVuZGlmCitMUENfMzIgc3NlNAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorO3ZvaWQgZmZfZmxhY19kZWNvcnJlbGF0ZV9bbHJtXXNfMTZfc3NlMih1aW50OF90ICoqb3V0LCBpbnQzMl90ICoqaW4sIGludCBjaGFubmVscywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgc2hpZnQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBGTEFDX0RFQ09SUkVMQVRFXzE2IDMtNAorY2dsb2JhbCBmbGFjX2RlY29ycmVsYXRlXyUxXzE2LCAyLCA0LCA0LCBvdXQsIGluMCwgaW4xLCBsZW4KKyVpZiBBUkNIX1g4Nl8zMiB8fCBXSU42NAorICAgIG1vdmQgICAgICAgbTMsIHI0bQorJWlmIEFSQ0hfWDg2XzMyCisgICAgbW92ICAgICAgbGVuZCwgbGVubQorJWVuZGlmCislZWxzZSA7IFVOSVg2NAorICAgIG1vdmQgICAgICAgbTMsIHI0ZAorJWVuZGlmCisgICAgc2hsICAgICAgbGVuZCwgMgorICAgIG1vdiAgICAgIGluMXEsIFtpbjBxICsgZ3Byc2l6ZV0KKyAgICBtb3YgICAgICBpbjBxLCBbaW4wcV0KKyAgICBtb3YgICAgICBvdXRxLCBbb3V0cV0KKyAgICBhZGQgICAgICBpbjFxLCBsZW5xCisgICAgYWRkICAgICAgaW4wcSwgbGVucQorICAgIGFkZCAgICAgIG91dHEsIGxlbnEKKyAgICBuZWcgICAgICBsZW5xCisKK2FsaWduIDE2CisubG9vcDoKKyAgICBtb3ZhICAgICAgIG0wLCBbaW4wcSArIGxlbnFdCisgICAgbW92YSAgICAgICBtMSwgW2luMXEgKyBsZW5xXQorJWlmaWRuICUxLCBtcworICAgIHBzcmFkICAgICAgbTIsIG0xLCAxCisgICAgcHN1YmQgICAgICBtMCwgbTIKKyVlbmRpZgorJWlmbmlkbiAlMSwgaW5kZXAyCisgICAgcCU0ZCAgICAgICBtMiwgbTAsIG0xCislZW5kaWYKKyAgICBwYWNrc3NkdyAgbSUyLCBtJTIKKyAgICBwYWNrc3NkdyAgbSUzLCBtJTMKKyAgICBwdW5wY2tsd2QgbSUyLCBtJTMKKyAgICBwc2xsdyAgICAgbSUyLCBtMworICAgIG1vdmEgW291dHEgKyBsZW5xXSwgbSUyCisgICAgYWRkICAgICAgbGVucSwgMTYKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitGTEFDX0RFQ09SUkVMQVRFXzE2IGxzLCAwLCAyLCBzdWIKK0ZMQUNfREVDT1JSRUxBVEVfMTYgcnMsIDIsIDEsIGFkZAorRkxBQ19ERUNPUlJFTEFURV8xNiBtcywgMiwgMCwgYWRkCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7dm9pZCBmZl9mbGFjX2RlY29ycmVsYXRlX1tscm1dc18zMl9zc2UyKHVpbnQ4X3QgKipvdXQsIGludDMyX3QgKippbiwgaW50IGNoYW5uZWxzLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgc2hpZnQpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBGTEFDX0RFQ09SUkVMQVRFXzMyIDUKK2NnbG9iYWwgZmxhY19kZWNvcnJlbGF0ZV8lMV8zMiwgMiwgNCwgNCwgb3V0LCBpbjAsIGluMSwgbGVuCislaWYgQVJDSF9YODZfMzIgfHwgV0lONjQKKyAgICBtb3ZkICAgICAgIG0zLCByNG0KKyVpZiBBUkNIX1g4Nl8zMgorICAgIG1vdiAgICAgIGxlbmQsIGxlbm0KKyVlbmRpZgorJWVsc2UgOyBVTklYNjQKKyAgICBtb3ZkICAgICAgIG0zLCByNGQKKyVlbmRpZgorICAgIG1vdiAgICAgIGluMXEsIFtpbjBxICsgZ3Byc2l6ZV0KKyAgICBtb3YgICAgICBpbjBxLCBbaW4wcV0KKyAgICBtb3YgICAgICBvdXRxLCBbb3V0cV0KKyAgICBzdWIgICAgICBpbjFxLCBpbjBxCisKK2FsaWduIDE2CisubG9vcDoKKyAgICBtb3ZhICAgICAgIG0wLCBbaW4wcV0KKyAgICBtb3ZhICAgICAgIG0xLCBbaW4wcSArIGluMXFdCislaWZpZG4gJTEsIG1zCisgICAgcHNyYWQgICAgICBtMiwgbTEsIDEKKyAgICBwc3ViZCAgICAgIG0wLCBtMgorJWVuZGlmCisgICAgcCU1ZCAgICAgICBtMiwgbTAsIG0xCisgICAgcHNsbGQgICAgIG0lMiwgbTMKKyAgICBwc2xsZCAgICAgbSUzLCBtMworCisgICAgU0JVVFRFUkZMWSBkcSwgJTIsICUzLCAlNAorCisgICAgbW92YSAgW291dHEgICAgICAgICBdLCBtJTIKKyAgICBtb3ZhICBbb3V0cSArIG1tc2l6ZV0sIG0lMworCisgICAgYWRkICAgICAgaW4wcSwgbW1zaXplCisgICAgYWRkICAgICAgb3V0cSwgbW1zaXplKjIKKyAgICBzdWIgICAgICBsZW5kLCBtbXNpemUvNAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK0ZMQUNfREVDT1JSRUxBVEVfMzIgbHMsIDAsIDIsIDEsIHN1YgorRkxBQ19ERUNPUlJFTEFURV8zMiBycywgMiwgMSwgMCwgYWRkCitGTEFDX0RFQ09SUkVMQVRFXzMyIG1zLCAyLCAwLCAxLCBhZGQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7dm9pZCBmZl9mbGFjX2RlY29ycmVsYXRlX2luZGVwPGNoPl88YnBzPl88b3B0Pih1aW50OF90ICoqb3V0LCBpbnQzMl90ICoqaW4sIGludCBjaGFubmVscywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBzaGlmdCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBUUkFOU1BPU0U4eDREIDkKKyAgICBTQlVUVEVSRkxZIGRxLCAgJTEsICUyLCAlOQorICAgIFNCVVRURVJGTFkgZHEsICAlMywgJTQsICU5CisgICAgU0JVVFRFUkZMWSBkcSwgICU1LCAlNiwgJTkKKyAgICBTQlVUVEVSRkxZIGRxLCAgJTcsICU4LCAlOQorICAgIFNCVVRURVJGTFkgcWRxLCAlMSwgJTMsICU5CisgICAgU0JVVFRFUkZMWSBxZHEsICUyLCAlNCwgJTkKKyAgICBTQlVUVEVSRkxZIHFkcSwgJTUsICU3LCAlOQorICAgIFNCVVRURVJGTFkgcWRxLCAlNiwgJTgsICU5CisgICAgU1dBUCAlMiwgJTUKKyAgICBTV0FQICU0LCAlNworJWVuZG1hY3JvCisKKzslMSA9IGJwcworOyUyID0gY2hhbm5lbHMKKzslMyA9IGxhc3QgeG1tIHJlZyB1c2VkCis7JTQgPSB3b3JkL2R3b3JkIChzaGlmdCBpbnN0cnVjdGlvbikKKyVtYWNybyBGTEFDX0RFQ09SUkVMQVRFX0lOREVQIDQKKyVkZWZpbmUgUkVQQ09VTlQgJTIvKDMyLyUxKSA7IDE2Yml0cyA9IGNoYW5uZWxzIC8gMjsgMzJiaXRzID0gY2hhbm5lbHMKK2NnbG9iYWwgZmxhY19kZWNvcnJlbGF0ZV9pbmRlcCUyXyUxLCAyLCAlMisyLCAlMysxLCBvdXQsIGluMCwgaW4xLCBsZW4sIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcKKyVpZiBBUkNIX1g4Nl8zMgorICAgIG1vdmQgICAgICBtJTMsIHI0bQorJWlmICUyID09IDYKKyAgICBERUZJTkVfQVJHUyBvdXQsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUKKyAgICAlZGVmaW5lICBsZW5kICBkd29yZCByM20KKyVlbHNlCisgICAgbW92ICAgICAgbGVuZCwgbGVubQorJWVuZGlmCislZWxpZiBXSU42NAorICAgIG1vdmQgICAgICBtJTMsIHI0bQorJWVsc2UgOyBVTklYNjQKKyAgICBtb3ZkICAgICAgbSUzLCByNGQKKyVlbmRpZgorCislYXNzaWduICUlaSAxCislcmVwICUyLTEKKyAgICBtb3YgICAgICBpbiAlKyAlJWkgJSsgcSwgW2luMHErJSVpKmdwcnNpemVdCislYXNzaWduICUlaSAlJWkrMQorJWVuZHJlcAorCisgICAgbW92ICAgICAgaW4wcSwgW2luMHFdCisgICAgbW92ICAgICAgb3V0cSwgW291dHFdCisKKyVhc3NpZ24gJSVpIDEKKyVyZXAgJTItMQorICAgIHN1YiAgICAgIGluICUrICUlaSAlKyBxLCBpbjBxCislYXNzaWduICUlaSAlJWkrMQorJWVuZHJlcAorCithbGlnbiAxNgorLmxvb3A6CisgICAgbW92YSAgICAgICBtMCwgW2luMHFdCisKKyVhc3NpZ24gJSVpIDEKKyVyZXAgUkVQQ09VTlQtMQorICAgIG1vdmEgICAgIG0gJSsgJSVpLCBbaW4wcSArIGluICUrICUlaSAlKyBxXQorJWFzc2lnbiAlJWkgJSVpKzEKKyVlbmRyZXAKKworJWlmICUxID09IDMyCisKKyVpZiAlMiA9PSA4CisgICAgVFJBTlNQT1NFOHg0RCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4CislZWxpZiAlMiA9PSA2CisgICAgU0JVVFRFUkZMWSBkcSwgMCwgMSwgNgorICAgIFNCVVRURVJGTFkgZHEsIDIsIDMsIDYKKyAgICBTQlVUVEVSRkxZIGRxLCA0LCA1LCA2CisKKyAgICBwdW5wY2tscWRxIG02LCBtMCwgbTIKKyAgICBwdW5wY2tocWRxIG0yLCBtNAorICAgIHNodWZwcyAgICAgbTQsIG0wLCAweGU0CisgICAgcHVucGNrbHFkcSBtMCwgbTEsIG0zCisgICAgcHVucGNraHFkcSBtMywgbTUKKyAgICBzaHVmcHMgICAgIG01LCBtMSwgMHhlNAorICAgIFNXQVAgMCw2LDEsNCw1LDMKKyVlbGlmICUyID09IDQKKyAgICBUUkFOU1BPU0U0eDREIDAsIDEsIDIsIDMsIDQKKyVlbHNlIDsgJTIgPT0gMgorICAgIFNCVVRURVJGTFkgZHEsIDAsIDEsIDIKKyVlbmRpZgorCislZWxzZSA7ICUxID09IDE2CisKKyVpZiAlMiA9PSA4CisgICAgcGFja3NzZHcgICBtMCwgW2luMHEgKyBpbjRxXQorICAgIHBhY2tzc2R3ICAgbTEsIFtpbjBxICsgaW41cV0KKyAgICBwYWNrc3NkdyAgIG0yLCBbaW4wcSArIGluNnFdCisgICAgcGFja3NzZHcgICBtMywgW2luMHEgKyBpbjdxXQorICAgIFRSQU5TUE9TRTJ4NHg0VyAwLCAxLCAyLCAzLCA0CislZWxpZiAlMiA9PSA2CisgICAgcGFja3NzZHcgICBtMCwgW2luMHEgKyBpbjNxXQorICAgIHBhY2tzc2R3ICAgbTEsIFtpbjBxICsgaW40cV0KKyAgICBwYWNrc3NkdyAgIG0yLCBbaW4wcSArIGluNXFdCisgICAgcHNodWZkICAgICBtMywgbTAsICAgICBxMTAzMgorICAgIHB1bnBja2x3ZCAgbTAsIG0xCisgICAgcHVucGNraHdkICBtMSwgbTIKKyAgICBwdW5wY2tsd2QgIG0yLCBtMworCisgICAgc2h1ZnBzICAgICBtMywgbTAsIG0yLCBxMjAyMAorICAgIHNodWZwcyAgICAgbTAsIG0xLCAgICAgcTIwMzEKKyAgICBzaHVmcHMgICAgIG0yLCBtMSwgICAgIHEzMTMxCisgICAgc2h1ZnBzICAgICBtMSwgbTIsIG0zLCBxMzEyMAorICAgIHNodWZwcyAgICAgbTMsIG0wLCAgICAgcTAyMjAKKyAgICBzaHVmcHMgICAgIG0wLCBtMiwgICAgIHEzMTEzCisgICAgU1dBUCAyLCAwLCAzCislZWxzZSA7ICUyID09IDQKKyAgICBwYWNrc3NkdyAgIG0wLCBbaW4wcSArIGluMnFdCisgICAgcGFja3NzZHcgICBtMSwgW2luMHEgKyBpbjNxXQorICAgIFNCVVRURVJGTFkgd2QsIDAsIDEsIDIKKyAgICBTQlVUVEVSRkxZIGRxLCAwLCAxLCAyCislZW5kaWYKKworJWVuZGlmCisKKyVhc3NpZ24gJSVpIDAKKyVyZXAgUkVQQ09VTlQKKyAgICBwc2xsJTQgICBtICUrICUlaSwgbSUzCislYXNzaWduICUlaSAlJWkrMQorJWVuZHJlcAorCislYXNzaWduICUlaSAwCislcmVwIFJFUENPVU5UCisgICAgbW92YSBbb3V0cSArICUlaSptbXNpemVdLCBtICUrICUlaQorJWFzc2lnbiAlJWkgJSVpKzEKKyVlbmRyZXAKKworICAgIGFkZCAgICAgIGluMHEsIG1tc2l6ZQorICAgIGFkZCAgICAgIG91dHEsIG1tc2l6ZSpSRVBDT1VOVAorICAgIHN1YiAgICAgIGxlbmQsIG1tc2l6ZS80CisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorRkxBQ19ERUNPUlJFTEFURV8xNiBpbmRlcDIsIDAsIDEgOyBSZXVzZSBzdGVyZW8gMTZiaXRzIG1hY3JvCitGTEFDX0RFQ09SUkVMQVRFX0lOREVQIDMyLCAyLCAzLCBkCitGTEFDX0RFQ09SUkVMQVRFX0lOREVQIDE2LCA0LCAzLCB3CitGTEFDX0RFQ09SUkVMQVRFX0lOREVQIDMyLCA0LCA1LCBkCitGTEFDX0RFQ09SUkVMQVRFX0lOREVQIDE2LCA2LCA0LCB3CitGTEFDX0RFQ09SUkVMQVRFX0lOREVQIDMyLCA2LCA3LCBkCislaWYgQVJDSF9YODZfNjQKK0ZMQUNfREVDT1JSRUxBVEVfSU5ERVAgMTYsIDgsIDUsIHcKK0ZMQUNfREVDT1JSRUxBVEVfSU5ERVAgMzIsIDgsIDksIGQKKyVlbmRpZgorCitJTklUX1hNTSBhdngKK0ZMQUNfREVDT1JSRUxBVEVfSU5ERVAgMzIsIDQsIDUsIGQKK0ZMQUNfREVDT1JSRUxBVEVfSU5ERVAgMzIsIDYsIDcsIGQKKyVpZiBBUkNIX1g4Nl82NAorRkxBQ19ERUNPUlJFTEFURV9JTkRFUCAxNiwgOCwgNSwgdworRkxBQ19ERUNPUlJFTEFURV9JTkRFUCAzMiwgOCwgOSwgZAorJWVuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmxhY2RzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZmxhY2RzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0YWY0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9mbGFjZHNwX2luaXQuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBKYW1lcyBBbG1lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9mbGFjZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKwordm9pZCBmZl9mbGFjX2xwY18zMl9zc2U0KGludDMyX3QgKnNhbXBsZXMsIGNvbnN0IGludCBjb2VmZnNbMzJdLCBpbnQgb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHFsZXZlbCwgaW50IGxlbik7Cit2b2lkIGZmX2ZsYWNfbHBjXzMyX3hvcChpbnQzMl90ICpzYW1wbGVzLCBjb25zdCBpbnQgY29lZmZzWzMyXSwgaW50IG9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHFsZXZlbCwgaW50IGxlbik7CisKK3ZvaWQgZmZfZmxhY19lbmNfbHBjXzE2X3NzZTQoaW50MzJfdCAqLCBjb25zdCBpbnQzMl90ICosIGludCwgaW50LCBjb25zdCBpbnQzMl90ICosaW50KTsKKworI2RlZmluZSBERUNPUlJFTEFURV9GVU5DUyhmbXQsIG9wdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX2ZsYWNfZGVjb3JyZWxhdGVfbHNfIyNmbXQjI18jI29wdCh1aW50OF90ICoqb3V0LCBpbnQzMl90ICoqaW4sIGludCBjaGFubmVscywgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9mbGFjX2RlY29ycmVsYXRlX3JzXyMjZm10IyNfIyNvcHQodWludDhfdCAqKm91dCwgaW50MzJfdCAqKmluLCBpbnQgY2hhbm5lbHMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfZmxhY19kZWNvcnJlbGF0ZV9tc18jI2ZtdCMjXyMjb3B0KHVpbnQ4X3QgKipvdXQsIGludDMyX3QgKippbiwgaW50IGNoYW5uZWxzLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX2ZsYWNfZGVjb3JyZWxhdGVfaW5kZXAyXyMjZm10IyNfIyNvcHQodWludDhfdCAqKm91dCwgaW50MzJfdCAqKmluLCBpbnQgY2hhbm5lbHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9mbGFjX2RlY29ycmVsYXRlX2luZGVwNF8jI2ZtdCMjXyMjb3B0KHVpbnQ4X3QgKipvdXQsIGludDMyX3QgKippbiwgaW50IGNoYW5uZWxzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfZmxhY19kZWNvcnJlbGF0ZV9pbmRlcDZfIyNmbXQjI18jI29wdCh1aW50OF90ICoqb3V0LCBpbnQzMl90ICoqaW4sIGludCBjaGFubmVscywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX2ZsYWNfZGVjb3JyZWxhdGVfaW5kZXA4XyMjZm10IyNfIyNvcHQodWludDhfdCAqKm91dCwgaW50MzJfdCAqKmluLCBpbnQgY2hhbm5lbHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgc2hpZnQpCisKK0RFQ09SUkVMQVRFX0ZVTkNTKDE2LCBzc2UyKTsKK0RFQ09SUkVMQVRFX0ZVTkNTKDE2LCAgYXZ4KTsKK0RFQ09SUkVMQVRFX0ZVTkNTKDMyLCBzc2UyKTsKK0RFQ09SUkVMQVRFX0ZVTkNTKDMyLCAgYXZ4KTsKKworYXZfY29sZCB2b2lkIGZmX2ZsYWNkc3BfaW5pdF94ODYoRkxBQ0RTUENvbnRleHQgKmMsIGVudW0gQVZTYW1wbGVGb3JtYXQgZm10LCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBzKQoreworI2lmIEhBVkVfWUFTTQorICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyNpZiBDT05GSUdfRkxBQ19ERUNPREVSCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoZm10ID09IEFWX1NBTVBMRV9GTVRfUzE2KSB7CisgICAgICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMikKKyAgICAgICAgICAgICAgICBjLT5kZWNvcnJlbGF0ZVswXSA9IGZmX2ZsYWNfZGVjb3JyZWxhdGVfaW5kZXAyXzE2X3NzZTI7CisgICAgICAgICAgICBlbHNlIGlmIChjaGFubmVscyA9PSA0KQorICAgICAgICAgICAgICAgIGMtPmRlY29ycmVsYXRlWzBdID0gZmZfZmxhY19kZWNvcnJlbGF0ZV9pbmRlcDRfMTZfc3NlMjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNoYW5uZWxzID09IDYpCisgICAgICAgICAgICAgICAgYy0+ZGVjb3JyZWxhdGVbMF0gPSBmZl9mbGFjX2RlY29ycmVsYXRlX2luZGVwNl8xNl9zc2UyOworICAgICAgICAgICAgZWxzZSBpZiAoQVJDSF9YODZfNjQgJiYgY2hhbm5lbHMgPT0gOCkKKyAgICAgICAgICAgICAgICBjLT5kZWNvcnJlbGF0ZVswXSA9IGZmX2ZsYWNfZGVjb3JyZWxhdGVfaW5kZXA4XzE2X3NzZTI7CisgICAgICAgICAgICBjLT5kZWNvcnJlbGF0ZVsxXSA9IGZmX2ZsYWNfZGVjb3JyZWxhdGVfbHNfMTZfc3NlMjsKKyAgICAgICAgICAgIGMtPmRlY29ycmVsYXRlWzJdID0gZmZfZmxhY19kZWNvcnJlbGF0ZV9yc18xNl9zc2UyOworICAgICAgICAgICAgYy0+ZGVjb3JyZWxhdGVbM10gPSBmZl9mbGFjX2RlY29ycmVsYXRlX21zXzE2X3NzZTI7CisgICAgICAgIH0gZWxzZSBpZiAoZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyKSB7CisgICAgICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMikKKyAgICAgICAgICAgICAgICBjLT5kZWNvcnJlbGF0ZVswXSA9IGZmX2ZsYWNfZGVjb3JyZWxhdGVfaW5kZXAyXzMyX3NzZTI7CisgICAgICAgICAgICBlbHNlIGlmIChjaGFubmVscyA9PSA0KQorICAgICAgICAgICAgICAgIGMtPmRlY29ycmVsYXRlWzBdID0gZmZfZmxhY19kZWNvcnJlbGF0ZV9pbmRlcDRfMzJfc3NlMjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNoYW5uZWxzID09IDYpCisgICAgICAgICAgICAgICAgYy0+ZGVjb3JyZWxhdGVbMF0gPSBmZl9mbGFjX2RlY29ycmVsYXRlX2luZGVwNl8zMl9zc2UyOworICAgICAgICAgICAgZWxzZSBpZiAoQVJDSF9YODZfNjQgJiYgY2hhbm5lbHMgPT0gOCkKKyAgICAgICAgICAgICAgICBjLT5kZWNvcnJlbGF0ZVswXSA9IGZmX2ZsYWNfZGVjb3JyZWxhdGVfaW5kZXA4XzMyX3NzZTI7CisgICAgICAgICAgICBjLT5kZWNvcnJlbGF0ZVsxXSA9IGZmX2ZsYWNfZGVjb3JyZWxhdGVfbHNfMzJfc3NlMjsKKyAgICAgICAgICAgIGMtPmRlY29ycmVsYXRlWzJdID0gZmZfZmxhY19kZWNvcnJlbGF0ZV9yc18zMl9zc2UyOworICAgICAgICAgICAgYy0+ZGVjb3JyZWxhdGVbM10gPSBmZl9mbGFjX2RlY29ycmVsYXRlX21zXzMyX3NzZTI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoYnBzID4gMTYpCisgICAgICAgICAgICBjLT5scGMgPSBmZl9mbGFjX2xwY18zMl9zc2U0OworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKKyAgICAgICAgaWYgKGZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNikgeworICAgICAgICAgICAgaWYgKEFSQ0hfWDg2XzY0ICYmIGNoYW5uZWxzID09IDgpCisgICAgICAgICAgICAgICAgYy0+ZGVjb3JyZWxhdGVbMF0gPSBmZl9mbGFjX2RlY29ycmVsYXRlX2luZGVwOF8xNl9hdng7CisgICAgICAgIH0gZWxzZSBpZiAoZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyKSB7CisgICAgICAgICAgICBpZiAoY2hhbm5lbHMgPT0gNCkKKyAgICAgICAgICAgICAgICBjLT5kZWNvcnJlbGF0ZVswXSA9IGZmX2ZsYWNfZGVjb3JyZWxhdGVfaW5kZXA0XzMyX2F2eDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNoYW5uZWxzID09IDYpCisgICAgICAgICAgICAgICAgYy0+ZGVjb3JyZWxhdGVbMF0gPSBmZl9mbGFjX2RlY29ycmVsYXRlX2luZGVwNl8zMl9hdng7CisgICAgICAgICAgICBlbHNlIGlmIChBUkNIX1g4Nl82NCAmJiBjaGFubmVscyA9PSA4KQorICAgICAgICAgICAgICAgIGMtPmRlY29ycmVsYXRlWzBdID0gZmZfZmxhY19kZWNvcnJlbGF0ZV9pbmRlcDhfMzJfYXZ4OworICAgICAgICB9CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9YT1AoY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoYnBzID4gMTYpCisgICAgICAgICAgICBjLT5scGMgPSBmZl9mbGFjX2xwY18zMl94b3A7CisgICAgfQorI2VuZGlmCisKKyNpZiBDT05GSUdfRkxBQ19FTkNPREVSCisgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoQ09ORklHX0dQTCAmJiBicHMgPT0gMTYpCisgICAgICAgICAgICBjLT5scGNfZW5jb2RlID0gZmZfZmxhY19lbmNfbHBjXzE2X3NzZTQ7CisgICAgfQorI2VuZGlmCisjZW5kaWYgLyogSEFWRV9ZQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvZm10Y29udmVydC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZm10Y29udmVydC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1OTVmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9mbXRjb252ZXJ0LmFzbQpAQCAtMCwwICsxLDQ3MCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2IG9wdGltaXplZCBGb3JtYXQgQ29udmVyc2lvbiBVdGlscworOyogQ29weXJpZ2h0IChjKSAyMDA4IExvcmVuIE1lcnJpdHQKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1RFWFQKKworJW1hY3JvIENWVFBTMlBJIDIKKyVpZiBjcHVmbGFnKHNzZSkKKyAgICBjdnRwczJwaSAlMSwgJTIKKyVlbGlmIGNwdWZsYWcoM2Rub3cpCisgICAgcGYyaWQgJTEsICUyCislZW5kaWYKKyVlbmRtYWNybworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXIoZmxvYXQgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLCBmbG9hdCBtdWwsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gSU5UMzJfVE9fRkxPQVRfRk1VTF9TQ0FMQVIgMQorJWlmIFVOSVg2NAorY2dsb2JhbCBpbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhciwgMywgMywgJTEsIGRzdCwgc3JjLCBsZW4KKyVlbHNlCitjZ2xvYmFsIGludDMyX3RvX2Zsb2F0X2ZtdWxfc2NhbGFyLCA0LCA0LCAlMSwgZHN0LCBzcmMsIG11bCwgbGVuCislZW5kaWYKKyVpZiBXSU42NAorICAgIFNXQVAgMCwgMgorJWVsaWYgQVJDSF9YODZfMzIKKyAgICBtb3ZzcyAgIG0wLCBtdWxtCislZW5kaWYKKyAgICBTUExBVEQgIG0wCisgICAgc2hsICAgICBsZW5xLCAyCisgICAgYWRkICAgICBzcmNxLCBsZW5xCisgICAgYWRkICAgICBkc3RxLCBsZW5xCisgICAgbmVnICAgICBsZW5xCisubG9vcDoKKyVpZiBjcHVmbGFnKHNzZTIpCisgICAgY3Z0ZHEycHMgIG0xLCBbc3JjcStsZW5xICAgXQorICAgIGN2dGRxMnBzICBtMiwgW3NyY3ErbGVucSsxNl0KKyVlbHNlCisgICAgY3Z0cGkycHMgIG0xLCBbc3JjcStsZW5xICAgXQorICAgIGN2dHBpMnBzICBtMywgW3NyY3ErbGVucSsgOF0KKyAgICBjdnRwaTJwcyAgbTIsIFtzcmNxK2xlbnErMTZdCisgICAgY3Z0cGkycHMgIG00LCBbc3JjcStsZW5xKzI0XQorICAgIG1vdmxocHMgICBtMSwgbTMKKyAgICBtb3ZsaHBzICAgbTIsIG00CislZW5kaWYKKyAgICBtdWxwcyAgICAgbTEsIG0wCisgICAgbXVscHMgICAgIG0yLCBtMAorICAgIG1vdmEgIFtkc3RxK2xlbnEgICBdLCBtMQorICAgIG1vdmEgIFtkc3RxK2xlbnErMTZdLCBtMgorICAgIGFkZCAgICAgbGVucSwgMzIKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UKK0lOVDMyX1RPX0ZMT0FUX0ZNVUxfU0NBTEFSIDUKK0lOSVRfWE1NIHNzZTIKK0lOVDMyX1RPX0ZMT0FUX0ZNVUxfU0NBTEFSIDMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2ludDMyX3RvX2Zsb2F0X2ZtdWxfYXJyYXk4KEZtdENvbnZlcnRDb250ZXh0ICpjLCBmbG9hdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKm11bCwgaW50IGxlbik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gSU5UMzJfVE9fRkxPQVRfRk1VTF9BUlJBWTggMAorY2dsb2JhbCBpbnQzMl90b19mbG9hdF9mbXVsX2FycmF5OCwgNSwgNSwgNSwgYywgZHN0LCBzcmMsIG11bCwgbGVuCisgICAgc2hsICAgICBsZW5kLCAyCisgICAgYWRkICAgICBzcmNxLCBsZW5xCisgICAgYWRkICAgICBkc3RxLCBsZW5xCisgICAgbmVnICAgICBsZW5xCisubG9vcDoKKyAgICBtb3ZzcyAgICAgbTAsIFttdWxxXQorICAgIFNQTEFURCAgICBtMAorJWlmIGNwdWZsYWcoc3NlMikKKyAgICBjdnRkcTJwcyAgbTEsIFtzcmNxK2xlbnEgICBdCisgICAgY3Z0ZHEycHMgIG0yLCBbc3JjcStsZW5xKzE2XQorJWVsc2UKKyAgICBjdnRwaTJwcyAgbTEsIFtzcmNxK2xlbnEgICBdCisgICAgY3Z0cGkycHMgIG0zLCBbc3JjcStsZW5xKyA4XQorICAgIGN2dHBpMnBzICBtMiwgW3NyY3ErbGVucSsxNl0KKyAgICBjdnRwaTJwcyAgbTQsIFtzcmNxK2xlbnErMjRdCisgICAgbW92bGhwcyAgIG0xLCBtMworICAgIG1vdmxocHMgICBtMiwgbTQKKyVlbmRpZgorICAgIG11bHBzICAgICBtMSwgbTAKKyAgICBtdWxwcyAgICAgbTIsIG0wCisgICAgbW92YSAgW2RzdHErbGVucSAgIF0sIG0xCisgICAgbW92YSAgW2RzdHErbGVucSsxNl0sIG0yCisgICAgYWRkICAgICBtdWxxLCA0CisgICAgYWRkICAgICBsZW5xLCAzMgorICAgIGpsIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZQorSU5UMzJfVE9fRkxPQVRfRk1VTF9BUlJBWTgKK0lOSVRfWE1NIHNzZTIKK0lOVDMyX1RPX0ZMT0FUX0ZNVUxfQVJSQVk4CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9mbG9hdF90b19pbnQxNihpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGxvbmcgbGVuKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBGTE9BVF9UT19JTlQxNiAxCitjZ2xvYmFsIGZsb2F0X3RvX2ludDE2LCAzLCAzLCAlMSwgZHN0LCBzcmMsIGxlbgorICAgIGFkZCAgICAgICBsZW5xLCBsZW5xCisgICAgbGVhICAgICAgIHNyY3EsIFtzcmNxKzIqbGVucV0KKyAgICBhZGQgICAgICAgZHN0cSwgbGVucQorICAgIG5lZyAgICAgICBsZW5xCisubG9vcDoKKyVpZiBjcHVmbGFnKHNzZTIpCisgICAgY3Z0cHMyZHEgICAgbTAsIFtzcmNxKzIqbGVucSAgIF0KKyAgICBjdnRwczJkcSAgICBtMSwgW3NyY3ErMipsZW5xKzE2XQorICAgIHBhY2tzc2R3ICAgIG0wLCBtMQorICAgIG1vdmEgIFtkc3RxK2xlbnFdLCBtMAorJWVsc2UKKyAgICBDVlRQUzJQSSAgICBtMCwgW3NyY3ErMipsZW5xICAgXQorICAgIENWVFBTMlBJICAgIG0xLCBbc3JjcSsyKmxlbnErIDhdCisgICAgQ1ZUUFMyUEkgICAgbTIsIFtzcmNxKzIqbGVucSsxNl0KKyAgICBDVlRQUzJQSSAgICBtMywgW3NyY3ErMipsZW5xKzI0XQorICAgIHBhY2tzc2R3ICAgIG0wLCBtMQorICAgIHBhY2tzc2R3ICAgIG0yLCBtMworICAgIG1vdmEgIFtkc3RxK2xlbnEgIF0sIG0wCisgICAgbW92YSAgW2RzdHErbGVucSs4XSwgbTIKKyVlbmRpZgorICAgIGFkZCAgICAgICBsZW5xLCAxNgorICAgIGpzIC5sb29wCislaWYgbW1zaXplID09IDgKKyAgICBlbW1zCislZW5kaWYKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorRkxPQVRfVE9fSU5UMTYgMgorSU5JVF9NTVggc3NlCitGTE9BVF9UT19JTlQxNiAwCitJTklUX01NWCAzZG5vdworRkxPQVRfVE9fSU5UMTYgMAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZmxvYXRfdG9faW50MTZfc3RlcChpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGxvbmcgbGVuLCBsb25nIHN0ZXApOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIEZMT0FUX1RPX0lOVDE2X1NURVAgMQorY2dsb2JhbCBmbG9hdF90b19pbnQxNl9zdGVwLCA0LCA3LCAlMSwgZHN0LCBzcmMsIGxlbiwgc3RlcCwgc3RlcDMsIHYxLCB2MgorICAgIGFkZCAgICAgICBsZW5xLCBsZW5xCisgICAgbGVhICAgICAgIHNyY3EsIFtzcmNxKzIqbGVucV0KKyAgICBsZWEgICAgIHN0ZXAzcSwgW3N0ZXBxKjNdCisgICAgbmVnICAgICAgIGxlbnEKKy5sb29wOgorJWlmIGNwdWZsYWcoc3NlMikKKyAgICBjdnRwczJkcSAgICBtMCwgW3NyY3ErMipsZW5xICAgXQorICAgIGN2dHBzMmRxICAgIG0xLCBbc3JjcSsyKmxlbnErMTZdCisgICAgcGFja3NzZHcgICAgbTAsIG0xCisgICAgbW92ZCAgICAgICB2MWQsIG0wCisgICAgcHNybGRxICAgICAgbTAsIDQKKyAgICBtb3ZkICAgICAgIHYyZCwgbTAKKyAgICBwc3JsZHEgICAgICBtMCwgNAorICAgIG1vdiAgICAgW2RzdHFdLCB2MXcKKyAgICBtb3YgIFtkc3RxK3N0ZXBxKjRdLCB2MncKKyAgICBzaHIgICAgICAgIHYxZCwgMTYKKyAgICBzaHIgICAgICAgIHYyZCwgMTYKKyAgICBtb3YgIFtkc3RxK3N0ZXBxKjJdLCB2MXcKKyAgICBtb3YgIFtkc3RxK3N0ZXAzcSoyXSwgdjJ3CisgICAgbGVhICAgICAgIGRzdHEsIFtkc3RxK3N0ZXBxKjhdCisgICAgbW92ZCAgICAgICB2MWQsIG0wCisgICAgcHNybGRxICAgICAgbTAsIDQKKyAgICBtb3ZkICAgICAgIHYyZCwgbTAKKyAgICBtb3YgICAgIFtkc3RxXSwgdjF3CisgICAgbW92ICBbZHN0cStzdGVwcSo0XSwgdjJ3CisgICAgc2hyICAgICAgICB2MWQsIDE2CisgICAgc2hyICAgICAgICB2MmQsIDE2CisgICAgbW92ICBbZHN0cStzdGVwcSoyXSwgdjF3CisgICAgbW92ICBbZHN0cStzdGVwM3EqMl0sIHYydworICAgIGxlYSAgICAgICBkc3RxLCBbZHN0cStzdGVwcSo4XQorJWVsc2UKKyAgICBDVlRQUzJQSSAgICBtMCwgW3NyY3ErMipsZW5xICAgXQorICAgIENWVFBTMlBJICAgIG0xLCBbc3JjcSsyKmxlbnErIDhdCisgICAgQ1ZUUFMyUEkgICAgbTIsIFtzcmNxKzIqbGVucSsxNl0KKyAgICBDVlRQUzJQSSAgICBtMywgW3NyY3ErMipsZW5xKzI0XQorICAgIHBhY2tzc2R3ICAgIG0wLCBtMQorICAgIHBhY2tzc2R3ICAgIG0yLCBtMworICAgIG1vdmQgICAgICAgdjFkLCBtMAorICAgIHBzcmxxICAgICAgIG0wLCAzMgorICAgIG1vdmQgICAgICAgdjJkLCBtMAorICAgIG1vdiAgICAgW2RzdHFdLCB2MXcKKyAgICBtb3YgIFtkc3RxK3N0ZXBxKjRdLCB2MncKKyAgICBzaHIgICAgICAgIHYxZCwgMTYKKyAgICBzaHIgICAgICAgIHYyZCwgMTYKKyAgICBtb3YgIFtkc3RxK3N0ZXBxKjJdLCB2MXcKKyAgICBtb3YgIFtkc3RxK3N0ZXAzcSoyXSwgdjJ3CisgICAgbGVhICAgICAgIGRzdHEsIFtkc3RxK3N0ZXBxKjhdCisgICAgbW92ZCAgICAgICB2MWQsIG0yCisgICAgcHNybHEgICAgICAgbTIsIDMyCisgICAgbW92ZCAgICAgICB2MmQsIG0yCisgICAgbW92ICAgICBbZHN0cV0sIHYxdworICAgIG1vdiAgW2RzdHErc3RlcHEqNF0sIHYydworICAgIHNociAgICAgICAgdjFkLCAxNgorICAgIHNociAgICAgICAgdjJkLCAxNgorICAgIG1vdiAgW2RzdHErc3RlcHEqMl0sIHYxdworICAgIG1vdiAgW2RzdHErc3RlcDNxKjJdLCB2MncKKyAgICBsZWEgICAgICAgZHN0cSwgW2RzdHErc3RlcHEqOF0KKyVlbmRpZgorICAgIGFkZCAgICAgICBsZW5xLCAxNgorICAgIGpzIC5sb29wCislaWYgbW1zaXplID09IDgKKyAgICBlbW1zCislZW5kaWYKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorRkxPQVRfVE9fSU5UMTZfU1RFUCAyCitJTklUX01NWCBzc2UKK0ZMT0FUX1RPX0lOVDE2X1NURVAgMAorSU5JVF9NTVggM2Rub3cKK0ZMT0FUX1RPX0lOVDE2X1NURVAgMAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2Zsb2F0X3RvX2ludDE2X2ludGVybGVhdmUyKGludDE2X3QgKmRzdCwgY29uc3QgZmxvYXQgKipzcmMsIGxvbmcgbGVuKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gRkxPQVRfVE9fSU5UMTZfSU5URVJMRUFWRTIgMAorY2dsb2JhbCBmbG9hdF90b19pbnQxNl9pbnRlcmxlYXZlMiwgMywgNCwgMiwgZHN0LCBzcmMwLCBzcmMxLCBsZW4KKyAgICBsZWEgICAgICBsZW5xLCBbNCpyMnFdCisgICAgbW92ICAgICBzcmMxcSwgW3NyYzBxK2dwcnNpemVdCisgICAgbW92ICAgICBzcmMwcSwgW3NyYzBxXQorICAgIGFkZCAgICAgIGRzdHEsIGxlbnEKKyAgICBhZGQgICAgIHNyYzBxLCBsZW5xCisgICAgYWRkICAgICBzcmMxcSwgbGVucQorICAgIG5lZyAgICAgIGxlbnEKKy5sb29wOgorJWlmIGNwdWZsYWcoc3NlMikKKyAgICBjdnRwczJkcSAgIG0wLCBbc3JjMHErbGVucV0KKyAgICBjdnRwczJkcSAgIG0xLCBbc3JjMXErbGVucV0KKyAgICBwYWNrc3NkdyAgIG0wLCBtMQorICAgIG1vdmhscHMgICAgbTEsIG0wCisgICAgcHVucGNrbHdkICBtMCwgbTEKKyAgICBtb3ZhICBbZHN0cStsZW5xXSwgbTAKKyVlbHNlCisgICAgQ1ZUUFMyUEkgICBtMCwgW3NyYzBxK2xlbnEgIF0KKyAgICBDVlRQUzJQSSAgIG0xLCBbc3JjMHErbGVucSs4XQorICAgIENWVFBTMlBJICAgbTIsIFtzcmMxcStsZW5xICBdCisgICAgQ1ZUUFMyUEkgICBtMywgW3NyYzFxK2xlbnErOF0KKyAgICBwYWNrc3NkdyAgIG0wLCBtMQorICAgIHBhY2tzc2R3ICAgbTIsIG0zCisgICAgbW92YSAgICAgICBtMSwgbTAKKyAgICBwdW5wY2tsd2QgIG0wLCBtMgorICAgIHB1bnBja2h3ZCAgbTEsIG0yCisgICAgbW92YSAgW2RzdHErbGVucSAgXSwgbTAKKyAgICBtb3ZhICBbZHN0cStsZW5xKzhdLCBtMQorJWVuZGlmCisgICAgYWRkICAgICAgbGVucSwgMTYKKyAgICBqcyAubG9vcAorJWlmIG1tc2l6ZSA9PSA4CisgICAgZW1tcworJWVuZGlmCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIDNkbm93CitGTE9BVF9UT19JTlQxNl9JTlRFUkxFQVZFMgorSU5JVF9NTVggc3NlCitGTE9BVF9UT19JTlQxNl9JTlRFUkxFQVZFMgorSU5JVF9YTU0gc3NlMgorRkxPQVRfVE9fSU5UMTZfSU5URVJMRUFWRTIKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZTYoaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqKnNyYywgaW50IGxlbikKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIEZMT0FUX1RPX0lOVDE2X0lOVEVSTEVBVkU2IDAKK2NnbG9iYWwgZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZTYsIDIsIDgsIDAsIGRzdCwgc3JjLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBsZW4KKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdiAgICAgbGVuZCwgcjJkCislZWxzZQorICAgICVkZWZpbmUgbGVuZCBkd29yZCByMm0KKyVlbmRpZgorICAgIG1vdiBzcmMxcSwgW3NyY3ErMSpncHJzaXplXQorICAgIG1vdiBzcmMycSwgW3NyY3ErMipncHJzaXplXQorICAgIG1vdiBzcmMzcSwgW3NyY3ErMypncHJzaXplXQorICAgIG1vdiBzcmM0cSwgW3NyY3ErNCpncHJzaXplXQorICAgIG1vdiBzcmM1cSwgW3NyY3ErNSpncHJzaXplXQorICAgIG1vdiBzcmNxLCAgW3NyY3FdCisgICAgc3ViIHNyYzFxLCBzcmNxCisgICAgc3ViIHNyYzJxLCBzcmNxCisgICAgc3ViIHNyYzNxLCBzcmNxCisgICAgc3ViIHNyYzRxLCBzcmNxCisgICAgc3ViIHNyYzVxLCBzcmNxCisubG9vcDoKKyAgICBDVlRQUzJQSSAgIG1tMCwgW3NyY3FdCisgICAgQ1ZUUFMyUEkgICBtbTEsIFtzcmNxK3NyYzFxXQorICAgIENWVFBTMlBJICAgbW0yLCBbc3JjcStzcmMycV0KKyAgICBDVlRQUzJQSSAgIG1tMywgW3NyY3Erc3JjM3FdCisgICAgQ1ZUUFMyUEkgICBtbTQsIFtzcmNxK3NyYzRxXQorICAgIENWVFBTMlBJICAgbW01LCBbc3JjcStzcmM1cV0KKyAgICBwYWNrc3NkdyAgIG1tMCwgbW0zCisgICAgcGFja3NzZHcgICBtbTEsIG1tNAorICAgIHBhY2tzc2R3ICAgbW0yLCBtbTUKKyAgICBQU1dBUEQgICAgIG1tMywgbW0wCisgICAgcHVucGNrbHdkICBtbTAsIG1tMQorICAgIHB1bnBja2h3ZCAgbW0xLCBtbTIKKyAgICBwdW5wY2tsd2QgIG1tMiwgbW0zCisgICAgUFNXQVBEICAgICBtbTMsIG1tMAorICAgIHB1bnBja2xkcSAgbW0wLCBtbTIKKyAgICBwdW5wY2toZHEgIG1tMiwgbW0xCisgICAgcHVucGNrbGRxICBtbTEsIG1tMworICAgIG1vdnEgW2RzdHEgICBdLCBtbTAKKyAgICBtb3ZxIFtkc3RxKzE2XSwgbW0yCisgICAgbW92cSBbZHN0cSsgOF0sIG1tMQorICAgIGFkZCBzcmNxLCA4CisgICAgYWRkIGRzdHEsIDI0CisgICAgc3ViIGxlbmQsIDIKKyAgICBqZyAubG9vcAorICAgIGVtbXMKKyAgICBSRVQKKyVlbmRtYWNybyA7IEZMT0FUX1RPX0lOVDE2X0lOVEVSTEVBVkU2CisKK0lOSVRfTU1YIHNzZQorRkxPQVRfVE9fSU5UMTZfSU5URVJMRUFWRTYKK0lOSVRfTU1YIDNkbm93CitGTE9BVF9UT19JTlQxNl9JTlRFUkxFQVZFNgorSU5JVF9NTVggM2Rub3dleHQKK0ZMT0FUX1RPX0lOVDE2X0lOVEVSTEVBVkU2CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2Zsb2F0X2ludGVybGVhdmU2KGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gRkxPQVRfSU5URVJMRUFWRTYgMQorY2dsb2JhbCBmbG9hdF9pbnRlcmxlYXZlNiwgMiwgOCwgJTEsIGRzdCwgc3JjLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBsZW4KKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdiAgICAgbGVuZCwgcjJkCislZWxzZQorICAgICVkZWZpbmUgbGVuZCBkd29yZCByMm0KKyVlbmRpZgorICAgIG1vdiAgICBzcmMxcSwgW3NyY3ErMSpncHJzaXplXQorICAgIG1vdiAgICBzcmMycSwgW3NyY3ErMipncHJzaXplXQorICAgIG1vdiAgICBzcmMzcSwgW3NyY3ErMypncHJzaXplXQorICAgIG1vdiAgICBzcmM0cSwgW3NyY3ErNCpncHJzaXplXQorICAgIG1vdiAgICBzcmM1cSwgW3NyY3ErNSpncHJzaXplXQorICAgIG1vdiAgICAgc3JjcSwgW3NyY3FdCisgICAgc3ViICAgIHNyYzFxLCBzcmNxCisgICAgc3ViICAgIHNyYzJxLCBzcmNxCisgICAgc3ViICAgIHNyYzNxLCBzcmNxCisgICAgc3ViICAgIHNyYzRxLCBzcmNxCisgICAgc3ViICAgIHNyYzVxLCBzcmNxCisubG9vcDoKKyVpZiBjcHVmbGFnKHNzZSkKKyAgICBtb3ZhcHMgICAgbTAsIFtzcmNxXQorICAgIG1vdmFwcyAgICBtMSwgW3NyY3Erc3JjMXFdCisgICAgbW92YXBzICAgIG0yLCBbc3JjcStzcmMycV0KKyAgICBtb3ZhcHMgICAgbTMsIFtzcmNxK3NyYzNxXQorICAgIG1vdmFwcyAgICBtNCwgW3NyY3Erc3JjNHFdCisgICAgbW92YXBzICAgIG01LCBbc3JjcStzcmM1cV0KKworICAgIFNCVVRURVJGTFlQUyAwLCAxLCA2CisgICAgU0JVVFRFUkZMWVBTIDIsIDMsIDYKKyAgICBTQlVUVEVSRkxZUFMgNCwgNSwgNgorCisgICAgbW92YXBzICAgIG02LCBtNAorICAgIHNodWZwcyAgICBtNCwgbTAsIDB4ZTQKKyAgICBtb3ZsaHBzICAgbTAsIG0yCisgICAgbW92aGxwcyAgIG02LCBtMgorICAgIG1vdmFwcyBbZHN0cSAgIF0sIG0wCisgICAgbW92YXBzIFtkc3RxKzE2XSwgbTQKKyAgICBtb3ZhcHMgW2RzdHErMzJdLCBtNgorCisgICAgbW92YXBzICAgIG02LCBtNQorICAgIHNodWZwcyAgICBtNSwgbTEsIDB4ZTQKKyAgICBtb3ZsaHBzICAgbTEsIG0zCisgICAgbW92aGxwcyAgIG02LCBtMworICAgIG1vdmFwcyBbZHN0cSs0OF0sIG0xCisgICAgbW92YXBzIFtkc3RxKzY0XSwgbTUKKyAgICBtb3ZhcHMgW2RzdHErODBdLCBtNgorJWVsc2UgOyBtbXgKKyAgICBtb3ZxICAgICAgIG0wLCBbc3JjcV0KKyAgICBtb3ZxICAgICAgIG0xLCBbc3JjcStzcmMxcV0KKyAgICBtb3ZxICAgICAgIG0yLCBbc3JjcStzcmMycV0KKyAgICBtb3ZxICAgICAgIG0zLCBbc3JjcStzcmMzcV0KKyAgICBtb3ZxICAgICAgIG00LCBbc3JjcStzcmM0cV0KKyAgICBtb3ZxICAgICAgIG01LCBbc3JjcStzcmM1cV0KKworICAgIFNCVVRURVJGTFkgZHEsIDAsIDEsIDYKKyAgICBTQlVUVEVSRkxZIGRxLCAyLCAzLCA2CisgICAgU0JVVFRFUkZMWSBkcSwgNCwgNSwgNgorICAgIG1vdnEgW2RzdHEgICBdLCBtMAorICAgIG1vdnEgW2RzdHErIDhdLCBtMgorICAgIG1vdnEgW2RzdHErMTZdLCBtNAorICAgIG1vdnEgW2RzdHErMjRdLCBtMQorICAgIG1vdnEgW2RzdHErMzJdLCBtMworICAgIG1vdnEgW2RzdHErNDBdLCBtNQorJWVuZGlmCisgICAgYWRkICAgICAgc3JjcSwgbW1zaXplCisgICAgYWRkICAgICAgZHN0cSwgbW1zaXplKjYKKyAgICBzdWIgICAgICBsZW5kLCBtbXNpemUvNAorICAgIGpnIC5sb29wCislaWYgbW1zaXplID09IDgKKyAgICBlbW1zCislZW5kaWYKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CitGTE9BVF9JTlRFUkxFQVZFNiAwCitJTklUX1hNTSBzc2UKK0ZMT0FUX0lOVEVSTEVBVkU2IDcKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZmxvYXRfaW50ZXJsZWF2ZTIoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKipzcmMsIHVuc2lnbmVkIGludCBsZW4pOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBGTE9BVF9JTlRFUkxFQVZFMiAxCitjZ2xvYmFsIGZsb2F0X2ludGVybGVhdmUyLCAzLCA0LCAlMSwgZHN0LCBzcmMsIGxlbiwgc3JjMQorICAgIG1vdiAgICAgc3JjMXEsIFtzcmNxK2dwcnNpemVdCisgICAgbW92ICAgICAgc3JjcSwgW3NyY3EgICAgICAgIF0KKyAgICBzdWIgICAgIHNyYzFxLCBzcmNxCisubG9vcDoKKyAgICBtb3ZhICAgICAgIG0wLCBbc3JjcSAgICAgICAgICAgICBdCisgICAgbW92YSAgICAgICBtMSwgW3NyY3Erc3JjMXEgICAgICAgXQorICAgIG1vdmEgICAgICAgbTMsIFtzcmNxICAgICAgK21tc2l6ZV0KKyAgICBtb3ZhICAgICAgIG00LCBbc3JjcStzcmMxcSttbXNpemVdCisKKyAgICBtb3ZhICAgICAgIG0yLCBtMAorICAgIFBVTlBDS0xEUSAgbTAsIG0xCisgICAgUFVOUENLSERRICBtMiwgbTEKKworICAgIG1vdmEgICAgICAgbTEsIG0zCisgICAgUFVOUENLTERRICBtMywgbTQKKyAgICBQVU5QQ0tIRFEgIG0xLCBtNAorCisgICAgbW92YSAgW2RzdHEgICAgICAgICBdLCBtMAorICAgIG1vdmEgIFtkc3RxKzEqbW1zaXplXSwgbTIKKyAgICBtb3ZhICBbZHN0cSsyKm1tc2l6ZV0sIG0zCisgICAgbW92YSAgW2RzdHErMyptbXNpemVdLCBtMQorCisgICAgYWRkICAgICAgc3JjcSwgbW1zaXplKjIKKyAgICBhZGQgICAgICBkc3RxLCBtbXNpemUqNAorICAgIHN1YiAgICAgIGxlbmQsIG1tc2l6ZS8yCisgICAgamcgLmxvb3AKKyVpZiBtbXNpemUgPT0gOAorICAgIGVtbXMKKyVlbmRpZgorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKKyVkZWZpbmUgUFVOUENLTERRIHB1bnBja2xkcQorJWRlZmluZSBQVU5QQ0tIRFEgcHVucGNraGRxCitGTE9BVF9JTlRFUkxFQVZFMiAwCitJTklUX1hNTSBzc2UKKyVkZWZpbmUgUFVOUENLTERRIHVucGNrbHBzCislZGVmaW5lIFBVTlBDS0hEUSB1bnBja2hwcworRkxPQVRfSU5URVJMRUFWRTIgNQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZtdGNvbnZlcnRfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZtdGNvbnZlcnRfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYjk2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZm10Y29udmVydF9pbml0LmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBGb3JtYXQgQ29udmVyc2lvbiBVdGlscworICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBNTVggb3B0aW1pemF0aW9uIGJ5IE5pY2sgS3Vyc2hldiA8bmlja29sc19rQG1haWwucnU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9mbXRjb252ZXJ0LmgiCisKKyNpZiBIQVZFX1lBU00KKwordm9pZCBmZl9pbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhcl9zc2UgKGZsb2F0ICpkc3QsIGNvbnN0IGludDMyX3QgKnNyYywgZmxvYXQgbXVsLCBpbnQgbGVuKTsKK3ZvaWQgZmZfaW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXJfc3NlMihmbG9hdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsIGZsb2F0IG11bCwgaW50IGxlbik7Cit2b2lkIGZmX2ludDMyX3RvX2Zsb2F0X2ZtdWxfYXJyYXk4X3NzZSAoRm10Q29udmVydENvbnRleHQgKmMsIGZsb2F0ICpkc3QsIGNvbnN0IGludDMyX3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbXVsLCBpbnQgbGVuKTsKK3ZvaWQgZmZfaW50MzJfdG9fZmxvYXRfZm11bF9hcnJheThfc3NlMihGbXRDb252ZXJ0Q29udGV4dCAqYywgZmxvYXQgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICptdWwsIGludCBsZW4pOworCit2b2lkIGZmX2Zsb2F0X3RvX2ludDE2XzNkbm93KGludDE2X3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgbG9uZyBsZW4pOwordm9pZCBmZl9mbG9hdF90b19pbnQxNl9zc2UgIChpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGxvbmcgbGVuKTsKK3ZvaWQgZmZfZmxvYXRfdG9faW50MTZfc3NlMiAoaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBsb25nIGxlbik7CisKK3ZvaWQgZmZfZmxvYXRfdG9faW50MTZfc3RlcF8zZG5vdyhpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGxvbmcgbGVuLCBsb25nIHN0ZXApOwordm9pZCBmZl9mbG9hdF90b19pbnQxNl9zdGVwX3NzZSAgKGludDE2X3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgbG9uZyBsZW4sIGxvbmcgc3RlcCk7Cit2b2lkIGZmX2Zsb2F0X3RvX2ludDE2X3N0ZXBfc3NlMiAoaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBsb25nIGxlbiwgbG9uZyBzdGVwKTsKKwordm9pZCBmZl9mbG9hdF90b19pbnQxNl9pbnRlcmxlYXZlMl8zZG5vdyhpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCBsb25nIGxlbik7Cit2b2lkIGZmX2Zsb2F0X3RvX2ludDE2X2ludGVybGVhdmUyX3NzZSAgKGludDE2X3QgKmRzdCwgY29uc3QgZmxvYXQgKipzcmMsIGxvbmcgbGVuKTsKK3ZvaWQgZmZfZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZTJfc3NlMiAoaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqKnNyYywgbG9uZyBsZW4pOworCit2b2lkIGZmX2Zsb2F0X3RvX2ludDE2X2ludGVybGVhdmU2X3NzZShpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCBpbnQgbGVuKTsKK3ZvaWQgZmZfZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZTZfM2Rub3coaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqKnNyYywgaW50IGxlbik7Cit2b2lkIGZmX2Zsb2F0X3RvX2ludDE2X2ludGVybGVhdmU2XzNkbm93ZXh0KGludDE2X3QgKmRzdCwgY29uc3QgZmxvYXQgKipzcmMsIGludCBsZW4pOworCisjZGVmaW5lIGZmX2Zsb2F0X3RvX2ludDE2X2ludGVybGVhdmU2X3NzZTIgZmZfZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZTZfc3NlCisKKyNkZWZpbmUgRkxPQVRfVE9fSU5UMTZfSU5URVJMRUFWRShjcHUpIFwKKy8qIGdjYyBwZXNzaW1pemVzIHJlZ2lzdGVyIGFsbG9jYXRpb24gaWYgdGhpcyBpcyBpbiB0aGUgc2FtZSBmdW5jdGlvbiBhcyBmbG9hdF90b19pbnQxNl9pbnRlcmxlYXZlX3NzZTIqL1wKK3N0YXRpYyBhdl9ub2lubGluZSB2b2lkIGZsb2F0X3RvX2ludDE2X2ludGVybGVhdmVfbWlzY18jI2NwdShpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCBsb25nIGxlbiwgaW50IGNoYW5uZWxzKXtcCisgICAgaW50IGM7XAorICAgIGZvcihjPTA7IGM8Y2hhbm5lbHM7IGMrKyl7XAorICAgICAgICBmZl9mbG9hdF90b19pbnQxNl9zdGVwXyMjY3B1KGRzdCtjLCBzcmNbY10sIGxlbiwgY2hhbm5lbHMpO1wKKyAgICB9XAorfVwKK1wKK3N0YXRpYyB2b2lkIGZsb2F0X3RvX2ludDE2X2ludGVybGVhdmVfIyNjcHUoaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqKnNyYywgbG9uZyBsZW4sIGludCBjaGFubmVscyl7XAorICAgIGlmKGNoYW5uZWxzPT0xKVwKKyAgICAgICAgZmZfZmxvYXRfdG9faW50MTZfIyNjcHUoZHN0LCBzcmNbMF0sIGxlbik7XAorICAgIGVsc2UgaWYoY2hhbm5lbHM9PTIpe1wKKyAgICAgICAgZmZfZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZTJfIyNjcHUoZHN0LCBzcmMsIGxlbik7XAorICAgIH1lbHNlIGlmKGNoYW5uZWxzPT02KXtcCisgICAgICAgIGZmX2Zsb2F0X3RvX2ludDE2X2ludGVybGVhdmU2XyMjY3B1KGRzdCwgc3JjLCBsZW4pO1wKKyAgICB9ZWxzZVwKKyAgICAgICAgZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZV9taXNjXyMjY3B1KGRzdCwgc3JjLCBsZW4sIGNoYW5uZWxzKTtcCit9CisKK0ZMT0FUX1RPX0lOVDE2X0lOVEVSTEVBVkUoM2Rub3cpCitGTE9BVF9UT19JTlQxNl9JTlRFUkxFQVZFKHNzZSkKK0ZMT0FUX1RPX0lOVDE2X0lOVEVSTEVBVkUoc3NlMikKKworc3RhdGljIHZvaWQgZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZV8zZG5vd2V4dChpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlbiwgaW50IGNoYW5uZWxzKQoreworICAgIGlmKGNoYW5uZWxzPT02KQorICAgICAgICBmZl9mbG9hdF90b19pbnQxNl9pbnRlcmxlYXZlNl8zZG5vd2V4dChkc3QsIHNyYywgbGVuKTsKKyAgICBlbHNlCisgICAgICAgIGZsb2F0X3RvX2ludDE2X2ludGVybGVhdmVfM2Rub3coZHN0LCBzcmMsIGxlbiwgY2hhbm5lbHMpOworfQorCit2b2lkIGZmX2Zsb2F0X2ludGVybGVhdmUyX21teChmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqKnNyYywgdW5zaWduZWQgaW50IGxlbik7Cit2b2lkIGZmX2Zsb2F0X2ludGVybGVhdmUyX3NzZShmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqKnNyYywgdW5zaWduZWQgaW50IGxlbik7CisKK3ZvaWQgZmZfZmxvYXRfaW50ZXJsZWF2ZTZfbW14KGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKTsKK3ZvaWQgZmZfZmxvYXRfaW50ZXJsZWF2ZTZfc3NlKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICoqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKTsKKworc3RhdGljIHZvaWQgZmxvYXRfaW50ZXJsZWF2ZV9tbXgoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKipzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpCit7CisgICAgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgZmZfZmxvYXRfaW50ZXJsZWF2ZTJfbW14KGRzdCwgc3JjLCBsZW4pOworICAgIH0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNikKKyAgICAgICAgZmZfZmxvYXRfaW50ZXJsZWF2ZTZfbW14KGRzdCwgc3JjLCBsZW4pOworICAgIGVsc2UKKyAgICAgICAgZmZfZmxvYXRfaW50ZXJsZWF2ZV9jKGRzdCwgc3JjLCBsZW4sIGNoYW5uZWxzKTsKK30KKworc3RhdGljIHZvaWQgZmxvYXRfaW50ZXJsZWF2ZV9zc2UoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKipzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpCit7CisgICAgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgZmZfZmxvYXRfaW50ZXJsZWF2ZTJfc3NlKGRzdCwgc3JjLCBsZW4pOworICAgIH0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNikKKyAgICAgICAgZmZfZmxvYXRfaW50ZXJsZWF2ZTZfc3NlKGRzdCwgc3JjLCBsZW4pOworICAgIGVsc2UKKyAgICAgICAgZmZfZmxvYXRfaW50ZXJsZWF2ZV9jKGRzdCwgc3JjLCBsZW4sIGNoYW5uZWxzKTsKK30KKyNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKworYXZfY29sZCB2b2lkIGZmX2ZtdF9jb252ZXJ0X2luaXRfeDg2KEZtdENvbnZlcnRDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisjaWYgSEFWRV9ZQVNNCisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5mbG9hdF9pbnRlcmxlYXZlID0gZmxvYXRfaW50ZXJsZWF2ZV9tbXg7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9BTUQzRE5PVyhjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlmICghKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKSB7CisgICAgICAgICAgICBjLT5mbG9hdF90b19pbnQxNiAgICAgICAgICAgID0gZmZfZmxvYXRfdG9faW50MTZfM2Rub3c7CisgICAgICAgICAgICBjLT5mbG9hdF90b19pbnQxNl9pbnRlcmxlYXZlID0gZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZV8zZG5vdzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoRVhURVJOQUxfQU1EM0ROT1dFWFQoY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKSkgeworICAgICAgICAgICAgYy0+ZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZSA9IGZsb2F0X3RvX2ludDE2X2ludGVybGVhdmVfM2Rub3dleHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX1NTRShjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmludDMyX3RvX2Zsb2F0X2ZtdWxfc2NhbGFyID0gZmZfaW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXJfc3NlOworICAgICAgICBjLT5pbnQzMl90b19mbG9hdF9mbXVsX2FycmF5OCA9IGZmX2ludDMyX3RvX2Zsb2F0X2ZtdWxfYXJyYXk4X3NzZTsKKyAgICAgICAgYy0+ZmxvYXRfdG9faW50MTYgICAgICAgICAgICAgPSBmZl9mbG9hdF90b19pbnQxNl9zc2U7CisgICAgICAgIGMtPmZsb2F0X3RvX2ludDE2X2ludGVybGVhdmUgID0gZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZV9zc2U7CisgICAgICAgIGMtPmZsb2F0X2ludGVybGVhdmUgICAgICAgICAgID0gZmxvYXRfaW50ZXJsZWF2ZV9zc2U7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+aW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXIgPSBmZl9pbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhcl9zc2UyOworICAgICAgICBjLT5pbnQzMl90b19mbG9hdF9mbXVsX2FycmF5OCA9IGZmX2ludDMyX3RvX2Zsb2F0X2ZtdWxfYXJyYXk4X3NzZTI7CisgICAgICAgIGMtPmZsb2F0X3RvX2ludDE2ICAgICAgICAgICAgID0gZmZfZmxvYXRfdG9faW50MTZfc3NlMjsKKyAgICAgICAgYy0+ZmxvYXRfdG9faW50MTZfaW50ZXJsZWF2ZSAgPSBmbG9hdF90b19pbnQxNl9pbnRlcmxlYXZlX3NzZTI7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZwZWwuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZwZWwuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlM2I0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvZnBlbC5hc20KQEAgLTAsMCArMSwxMDcgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIFNJTUQtb3B0aW1pemVkIGZ1bGxwZWwgZnVuY3Rpb25zCis7KiBDb3B5cmlnaHQgKGMpIDIwMDggTG9yZW4gTWVycml0dAorOyogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTMgTWljaGFlbCBOaWVkZXJtYXllcgorOyogQ29weXJpZ2h0IChjKSAyMDEzIERhbmllbCBLYW5nCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTiAudGV4dAorCislbWFjcm8gUEFWR0JfTU1YIDQKKyAgICBMT0FEICAgJTMsICUxCisgICAgcG9yICAgICUzLCAlMgorICAgIHB4b3IgICAlMiwgJTEKKyAgICBwYW5kICAgJTIsICU0CisgICAgcHNybHEgICUyLCAxCisgICAgcHN1YmIgICUzLCAlMgorICAgIFNXQVAgICAlMiwgJTMKKyVlbmRtYWNybworCis7IHZvaWQgZmZfcHV0L2F2Z19waXhlbHModWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKzsgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKKyVtYWNybyBPUF9QSVhFTFMgMgorJWlmICUyID09IG1tc2l6ZS8yCislZGVmaW5lIExPQUQgbW92aAorJWRlZmluZSBTQVZFIG1vdmgKKyVkZWZpbmUgTEVOICBtbXNpemUKKyVlbHNlCislZGVmaW5lIExPQUQgbW92dQorJWRlZmluZSBTQVZFIG1vdmEKKyVkZWZpbmUgTEVOICAlMgorJWVuZGlmCitjZ2xvYmFsICUxX3BpeGVscyUyLCA0LDUsNAorICAgIG1vdnN4ZGlmbmlkbiByMiwgcjJkCisgICAgbGVhICAgICAgICAgIHI0LCBbcjIqM10KKyVpZmlkbiAlMSwgYXZnCislaWYgbm90Y3B1ZmxhZyhtbXhleHQpCisgICAgcGNtcGVxZCAgICAgIG02LCBtNgorICAgIHBhZGRiICAgICAgICBtNiwgbTYKKyVlbmRpZgorJWVuZGlmCisubG9vcDoKKyVhc3NpZ24gJSVpIDAKKyVyZXAgTEVOL21tc2l6ZQorICAgIExPQUQgICAgICAgICBtMCwgW3IxICsgJSVpXQorICAgIExPQUQgICAgICAgICBtMSwgW3IxK3IyICsgJSVpXQorICAgIExPQUQgICAgICAgICBtMiwgW3IxK3IyKjIgKyAlJWldCisgICAgTE9BRCAgICAgICAgIG0zLCBbcjErcjQgKyAlJWldCislaWZpZG4gJTEsIGF2ZworJWlmIG5vdGNwdWZsYWcobW14ZXh0KQorICAgIFBBVkdCX01NWCAgICBbcjAgKyAlJWldLCBtMCwgbTQsIG02CisgICAgUEFWR0JfTU1YICAgIFtyMCtyMiArICUlaV0sIG0xLCBtNSwgbTYKKyAgICBQQVZHQl9NTVggICAgW3IwK3IyKjIgKyAlJWldLCBtMiwgbTQsIG02CisgICAgUEFWR0JfTU1YICAgIFtyMCtyNCArICUlaV0sIG0zLCBtNSwgbTYKKyVlbHNlCisgICAgcGF2Z2IgICAgICAgIG0wLCBbcjAgKyAlJWldCisgICAgcGF2Z2IgICAgICAgIG0xLCBbcjArcjIgKyAlJWldCisgICAgcGF2Z2IgICAgICAgIG0yLCBbcjArcjIqMiArICUlaV0KKyAgICBwYXZnYiAgICAgICAgbTMsIFtyMCtyNCArICUlaV0KKyVlbmRpZgorJWVuZGlmCisgICAgU0FWRSAgICAgICBbcjAgKyAlJWldLCBtMAorICAgIFNBVkUgICAgW3IwK3IyICsgJSVpXSwgbTEKKyAgICBTQVZFICBbcjArcjIqMiArICUlaV0sIG0yCisgICAgU0FWRSAgICBbcjArcjQgKyAlJWldLCBtMworJWFzc2lnbiAlJWkgJSVpK21tc2l6ZQorJWVuZHJlcAorICAgIHN1YiAgICAgICAgIHIzZCwgNAorICAgIGxlYSAgICAgICAgICByMSwgW3IxK3IyKjRdCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjIqNF0KKyAgICBqbmUgICAgICAgLmxvb3AKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK09QX1BJWEVMUyBwdXQsIDQKK09QX1BJWEVMUyBhdmcsIDQKK09QX1BJWEVMUyBwdXQsIDgKK09QX1BJWEVMUyBhdmcsIDgKK09QX1BJWEVMUyBwdXQsIDE2CitPUF9QSVhFTFMgYXZnLCAxNgorCitJTklUX01NWCBtbXhleHQKK09QX1BJWEVMUyBhdmcsIDQKK09QX1BJWEVMUyBhdmcsIDgKK09QX1BJWEVMUyBhdmcsIDE2CisKK0lOSVRfWE1NIHNzZTIKK09QX1BJWEVMUyBwdXQsIDE2CitPUF9QSVhFTFMgYXZnLCAxNgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ZwZWwuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9mcGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5Mzk1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9mcGVsLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfWDg2X0ZQRUxfSAorI2RlZmluZSBBVkNPREVDX1g4Nl9GUEVMX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIGZmX2F2Z19waXhlbHM4X21teCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzOF9tbXhleHQodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X21teCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X21teGV4dCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X3NzZTIodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzOF9tbXgodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfbW14ZXh0KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHMxNl9tbXgodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHMxNl9zc2UyKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKKworCisjZW5kaWYgLyogQVZDT0RFQ19YODZfRlBFTF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2M19sb29wZmlsdGVyLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjYzX2xvb3BmaWx0ZXIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmY2QxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2M19sb29wZmlsdGVyLmFzbQpAQCAtMCwwICsxLDE4OSBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogTU1YLW9wdGltaXplZCBILjI2MyBsb29wIGZpbHRlcgorOyogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTMgTWljaGFlbCBOaWVkZXJtYXllcgorOyogQ29weXJpZ2h0IChjKSAyMDEzIERhbmllbCBLYW5nCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKK2NleHRlcm4gcGJfRkMKK2NleHRlcm4gaDI2M19sb29wX2ZpbHRlcl9zdHJlbmd0aAorCitTRUNUSU9OX1RFWFQKKworJW1hY3JvIEgyNjNfTE9PUF9GSUxURVIgNQorICAgIHB4b3IgICAgICAgICBtNywgbTcKKyAgICBtb3ZhICAgICAgICAgbTAsIFslMV0KKyAgICBtb3ZhICAgICAgICAgbTEsIFslMV0KKyAgICBtb3ZhICAgICAgICAgbTIsIFslNF0KKyAgICBtb3ZhICAgICAgICAgbTMsIFslNF0KKyAgICBwdW5wY2tsYncgICAgbTAsIG03CisgICAgcHVucGNraGJ3ICAgIG0xLCBtNworICAgIHB1bnBja2xidyAgICBtMiwgbTcKKyAgICBwdW5wY2toYncgICAgbTMsIG03CisgICAgcHN1YncgICAgICAgIG0wLCBtMgorICAgIHBzdWJ3ICAgICAgICBtMSwgbTMKKyAgICBtb3ZhICAgICAgICAgbTIsIFslMl0KKyAgICBtb3ZhICAgICAgICAgbTMsIFslMl0KKyAgICBtb3ZhICAgICAgICAgbTQsIFslM10KKyAgICBtb3ZhICAgICAgICAgbTUsIFslM10KKyAgICBwdW5wY2tsYncgICAgbTIsIG03CisgICAgcHVucGNraGJ3ICAgIG0zLCBtNworICAgIHB1bnBja2xidyAgICBtNCwgbTcKKyAgICBwdW5wY2toYncgICAgbTUsIG03CisgICAgcHN1YncgICAgICAgIG00LCBtMgorICAgIHBzdWJ3ICAgICAgICBtNSwgbTMKKyAgICBwc2xsdyAgICAgICAgbTQsIDIKKyAgICBwc2xsdyAgICAgICAgbTUsIDIKKyAgICBwYWRkdyAgICAgICAgbTQsIG0wCisgICAgcGFkZHcgICAgICAgIG01LCBtMQorICAgIHB4b3IgICAgICAgICBtNiwgbTYKKyAgICBwY21wZ3R3ICAgICAgbTYsIG00CisgICAgcGNtcGd0dyAgICAgIG03LCBtNQorICAgIHB4b3IgICAgICAgICBtNCwgbTYKKyAgICBweG9yICAgICAgICAgbTUsIG03CisgICAgcHN1YncgICAgICAgIG00LCBtNgorICAgIHBzdWJ3ICAgICAgICBtNSwgbTcKKyAgICBwc3JsdyAgICAgICAgbTQsIDMKKyAgICBwc3JsdyAgICAgICAgbTUsIDMKKyAgICBwYWNrdXN3YiAgICAgbTQsIG01CisgICAgcGFja3Nzd2IgICAgIG02LCBtNworICAgIHB4b3IgICAgICAgICBtNywgbTcKKyAgICBtb3ZkICAgICAgICAgbTIsICU1CisgICAgcHVucGNrbGJ3ICAgIG0yLCBtMgorICAgIHB1bnBja2xidyAgICBtMiwgbTIKKyAgICBwdW5wY2tsYncgICAgbTIsIG0yCisgICAgcHN1YnVzYiAgICAgIG0yLCBtNAorICAgIG1vdmEgICAgICAgICBtMywgbTIKKyAgICBwc3VidXNiICAgICAgbTMsIG00CisgICAgcHN1YmIgICAgICAgIG0yLCBtMworICAgIG1vdmEgICAgICAgICBtMywgWyUyXQorICAgIG1vdmEgICAgICAgICBtNCwgWyUzXQorICAgIHB4b3IgICAgICAgICBtMywgbTYKKyAgICBweG9yICAgICAgICAgbTQsIG02CisgICAgcGFkZHVzYiAgICAgIG0zLCBtMgorICAgIHBzdWJ1c2IgICAgICBtNCwgbTIKKyAgICBweG9yICAgICAgICAgbTMsIG02CisgICAgcHhvciAgICAgICAgIG00LCBtNgorICAgIHBhZGR1c2IgICAgICBtMiwgbTIKKyAgICBwYWNrc3N3YiAgICAgbTAsIG0xCisgICAgcGNtcGd0YiAgICAgIG03LCBtMAorICAgIHB4b3IgICAgICAgICBtMCwgbTcKKyAgICBwc3ViYiAgICAgICAgbTAsIG03CisgICAgbW92YSAgICAgICAgIG0xLCBtMAorICAgIHBzdWJ1c2IgICAgICBtMCwgbTIKKyAgICBwc3ViYiAgICAgICAgbTEsIG0wCisgICAgcGFuZCAgICAgICAgIG0xLCBbcGJfRkNdCisgICAgcHNybHcgICAgICAgIG0xLCAyCisgICAgcHhvciAgICAgICAgIG0xLCBtNworICAgIHBzdWJiICAgICAgICBtMSwgbTcKKyAgICBtb3ZhICAgICAgICAgbTUsIFslMV0KKyAgICBtb3ZhICAgICAgICAgbTYsIFslNF0KKyAgICBwc3ViYiAgICAgICAgbTUsIG0xCisgICAgcGFkZGIgICAgICAgIG02LCBtMQorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teAorOyB2b2lkIGZmX2gyNjNfdl9sb29wX2ZpbHRlcl9tbXgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcXNjYWxlKQorY2dsb2JhbCBoMjYzX3ZfbG9vcF9maWx0ZXIsIDMsNQorICAgIG1vdnN4ZGlmbmlkbiByMSwgcjFkCisgICAgbW92c3hkaWZuaWRuIHIyLCByMmQKKworICAgIGxlYSAgICAgICAgICByNCwgW2gyNjNfbG9vcF9maWx0ZXJfc3RyZW5ndGhdCisgICAgbW92enggICAgICAgcjNkLCBCWVRFIFtyNCtyMl0KKyAgICBtb3ZzeCAgICAgICAgcjIsIHIzYgorICAgIHNobCAgICAgICAgICByMiwgMQorCisgICAgbW92ICAgICAgICAgIHIzLCByMAorICAgIHN1YiAgICAgICAgICByMywgcjEKKyAgICBtb3YgICAgICAgICAgcjQsIHIzCisgICAgc3ViICAgICAgICAgIHI0LCByMQorICAgIEgyNjNfTE9PUF9GSUxURVIgcjQsIHIzLCByMCwgcjArcjEsIHIyZAorCisgICAgbW92YSAgICAgICBbcjNdLCBtMworICAgIG1vdmEgICAgICAgW3IwXSwgbTQKKyAgICBtb3ZhICAgICAgIFtyNF0sIG01CisgICAgbW92YSAgICBbcjArcjFdLCBtNgorICAgIFJFVAorCislbWFjcm8gVFJBTlNQT1NFNFg0IDIKKyAgICBtb3ZkICAgICAgbTAsIFslMV0KKyAgICBtb3ZkICAgICAgbTEsIFslMStyMV0KKyAgICBtb3ZkICAgICAgbTIsIFslMStyMSoyXQorICAgIG1vdmQgICAgICBtMywgWyUxK3IzXQorICAgIHB1bnBja2xidyBtMCwgbTEKKyAgICBwdW5wY2tsYncgbTIsIG0zCisgICAgbW92YSAgICAgIG0xLCBtMAorICAgIHB1bnBja2x3ZCBtMCwgbTIKKyAgICBwdW5wY2tod2QgbTEsIG0yCisgICAgbW92ZCBbJTIrIDBdLCBtMAorICAgIHB1bnBja2hkcSBtMCwgbTAKKyAgICBtb3ZkIFslMisgOF0sIG0wCisgICAgbW92ZCBbJTIrMTZdLCBtMQorICAgIHB1bnBja2hkcSBtMSwgbTEKKyAgICBtb3ZkIFslMisyNF0sIG0xCislZW5kbWFjcm8KKworCis7IHZvaWQgZmZfaDI2M19oX2xvb3BfZmlsdGVyX21teCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBxc2NhbGUpCitJTklUX01NWCBtbXgKK2NnbG9iYWwgaDI2M19oX2xvb3BfZmlsdGVyLCAzLDUsMCwzMgorICAgIG1vdnN4ZGlmbmlkbiByMSwgcjFkCisgICAgbW92c3hkaWZuaWRuIHIyLCByMmQKKworICAgIGxlYSAgICAgICAgICByNCwgW2gyNjNfbG9vcF9maWx0ZXJfc3RyZW5ndGhdCisgICAgbW92enggICAgICAgcjNkLCBCWVRFIFtyNCtyMl0KKyAgICBtb3ZzeCAgICAgICAgcjIsIHIzYgorICAgIHNobCAgICAgICAgICByMiwgMQorCisgICAgc3ViICAgICAgICAgIHIwLCAyCisgICAgbGVhICAgICAgICAgIHIzLCBbcjEqM10KKworICAgIFRSQU5TUE9TRTRYNCByMCwgcnNwCisgICAgbGVhICAgICAgICAgIHI0LCBbcjArcjEqNF0KKyAgICBUUkFOU1BPU0U0WDQgcjQsIHJzcCs0CisKKyAgICBIMjYzX0xPT1BfRklMVEVSIHJzcCwgcnNwKzgsIHJzcCsxNiwgcnNwKzI0LCByMmQKKworICAgIG1vdmEgICAgICAgICBtMSwgbTUKKyAgICBtb3ZhICAgICAgICAgbTAsIG00CisgICAgcHVucGNrbGJ3ICAgIG01LCBtMworICAgIHB1bnBja2xidyAgICBtNCwgbTYKKyAgICBwdW5wY2toYncgICAgbTEsIG0zCisgICAgcHVucGNraGJ3ICAgIG0wLCBtNgorICAgIG1vdmEgICAgICAgICBtMywgbTUKKyAgICBtb3ZhICAgICAgICAgbTYsIG0xCisgICAgcHVucGNrbHdkICAgIG01LCBtNAorICAgIHB1bnBja2x3ZCAgICBtMSwgbTAKKyAgICBwdW5wY2tod2QgICAgbTMsIG00CisgICAgcHVucGNraHdkICAgIG02LCBtMAorICAgIG1vdmQgICAgICAgW3IwXSwgbTUKKyAgICBwdW5wY2toZHEgICAgbTUsIG01CisgICAgbW92ZCAgW3IwK3IxKjFdLCBtNQorICAgIG1vdmQgIFtyMCtyMSoyXSwgbTMKKyAgICBwdW5wY2toZHEgICAgbTMsIG0zCisgICAgbW92ZCAgICBbcjArcjNdLCBtMworICAgIG1vdmQgICAgICAgW3I0XSwgbTEKKyAgICBwdW5wY2toZHEgICAgbTEsIG0xCisgICAgbW92ZCAgW3I0K3IxKjFdLCBtMQorICAgIG1vdmQgIFtyNCtyMSoyXSwgbTYKKyAgICBwdW5wY2toZHEgICAgbTYsIG02CisgICAgbW92ZCAgICBbcjQrcjNdLCBtNgorICAgIFJFVApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjNkc3BfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjNkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiODEwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2M2RzcF9pbml0LmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBEaWVnbyBCaXVycnVuIDxkaWVnb0BiaXVycnVuLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaDI2M2RzcC5oIgorCit2b2lkIGZmX2gyNjNfaF9sb29wX2ZpbHRlcl9tbXgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcXNjYWxlKTsKK3ZvaWQgZmZfaDI2M192X2xvb3BfZmlsdGVyX21teCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBxc2NhbGUpOworCithdl9jb2xkIHZvaWQgZmZfaDI2M2RzcF9pbml0X3g4NihIMjYzRFNQQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmgyNjNfaF9sb29wX2ZpbHRlciA9IGZmX2gyNjNfaF9sb29wX2ZpbHRlcl9tbXg7CisgICAgICAgIGMtPmgyNjNfdl9sb29wX2ZpbHRlciA9IGZmX2gyNjNfdl9sb29wX2ZpbHRlcl9tbXg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfY2hyb21hbWMuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfY2hyb21hbWMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwN2FlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NF9jaHJvbWFtYy5hc20KQEAgLTAsMCArMSw2NzkgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIE1NWC9TU1NFMy1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciBIMjY0IGNocm9tYSBNQworOyogQ29weXJpZ2h0IChjKSAyMDA1IFpvbHRhbiBIaWR2ZWdpIDxoem9saSAtYS0gaHpvbGkgLWQtIGNvbT4sCis7KiAgICAgICAgICAgICAgIDIwMDUtMjAwOCBMb3JlbiBNZXJyaXR0Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworcm5kX3J2NDBfMmRfdGJsOiB0aW1lcyA0IGR3ICAwCisgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgMTYKKyAgICAgICAgICAgICAgICAgdGltZXMgNCBkdyAzMgorICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3IDE2CisgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgMzIKKyAgICAgICAgICAgICAgICAgdGltZXMgNCBkdyAyOAorICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3IDMyCisgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgMjgKKyAgICAgICAgICAgICAgICAgdGltZXMgNCBkdyAgMAorICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3IDMyCisgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgMTYKKyAgICAgICAgICAgICAgICAgdGltZXMgNCBkdyAzMgorICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3IDMyCisgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgMjgKKyAgICAgICAgICAgICAgICAgdGltZXMgNCBkdyAzMgorICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3IDI4CitybmRfcnY0MF8xZF90Ymw6IHRpbWVzIDQgZHcgIDAKKyAgICAgICAgICAgICAgICAgdGltZXMgNCBkdyAgMgorICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICA0CisgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgIDIKKyAgICAgICAgICAgICAgICAgdGltZXMgNCBkdyAgNAorICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICAzCisgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgIDQKKyAgICAgICAgICAgICAgICAgdGltZXMgNCBkdyAgMworICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICAwCisgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgIDQKKyAgICAgICAgICAgICAgICAgdGltZXMgNCBkdyAgMgorICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICA0CisgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgIDQKKyAgICAgICAgICAgICAgICAgdGltZXMgNCBkdyAgMworICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICA0CisgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgIDMKKworY2V4dGVybiBwd18zCitjZXh0ZXJuIHB3XzQKK2NleHRlcm4gcHdfOAorcHdfMjg6IHRpbWVzIDggZHcgMjgKK2NleHRlcm4gcHdfMzIKK2NleHRlcm4gcHdfNjQKKworU0VDVElPTiAudGV4dAorCislbWFjcm8gbXYwX3BpeGVsc19tYzggMAorICAgIGxlYSAgICAgICAgICAgcjQsIFtyMioyIF0KKy5uZXh0NHJvd3M6CisgICAgbW92cSAgICAgICAgIG1tMCwgW3IxICAgXQorICAgIG1vdnEgICAgICAgICBtbTEsIFtyMStyMl0KKyAgICBhZGQgICAgICAgICAgIHIxLCByNAorICAgIENIUk9NQU1DX0FWRyBtbTAsIFtyMCAgIF0KKyAgICBDSFJPTUFNQ19BVkcgbW0xLCBbcjArcjJdCisgICAgbW92cSAgICAgW3IwICAgXSwgbW0wCisgICAgbW92cSAgICAgW3IwK3IyXSwgbW0xCisgICAgYWRkICAgICAgICAgICByMCwgcjQKKyAgICBtb3ZxICAgICAgICAgbW0wLCBbcjEgICBdCisgICAgbW92cSAgICAgICAgIG1tMSwgW3IxK3IyXQorICAgIGFkZCAgICAgICAgICAgcjEsIHI0CisgICAgQ0hST01BTUNfQVZHIG1tMCwgW3IwICAgXQorICAgIENIUk9NQU1DX0FWRyBtbTEsIFtyMCtyMl0KKyAgICBtb3ZxICAgICBbcjAgICBdLCBtbTAKKyAgICBtb3ZxICAgICBbcjArcjJdLCBtbTEKKyAgICBhZGQgICAgICAgICAgIHIwLCByNAorICAgIHN1YiAgICAgICAgICByM2QsIDQKKyAgICBqbmUgLm5leHQ0cm93cworJWVuZG1hY3JvCisKKyVtYWNybyBjaHJvbWFfbWM4X21teF9mdW5jIDItMworJWlmaWRuICUyLCBydjQwCislaWZkZWYgUElDCislZGVmaW5lIHJuZF8xZF9ydjQwIHI4CislZGVmaW5lIHJuZF8yZF9ydjQwIHI4CislZGVmaW5lIGV4dHJhX3JlZ3MgMgorJWVsc2UgOyBuby1QSUMKKyVkZWZpbmUgcm5kXzFkX3J2NDAgcm5kX3J2NDBfMWRfdGJsCislZGVmaW5lIHJuZF8yZF9ydjQwIHJuZF9ydjQwXzJkX3RibAorJWRlZmluZSBleHRyYV9yZWdzIDEKKyVlbmRpZiA7IFBJQworJWVsc2UKKyVkZWZpbmUgZXh0cmFfcmVncyAwCislZW5kaWYgOyBydjQwCis7IHZvaWQgZmZfcHV0L2F2Z19oMjY0X2Nocm9tYV9tYzhfKih1aW50OF90ICpkc3QgLyogYWxpZ24gOCAqLywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQorY2dsb2JhbCAlMV8lMl9jaHJvbWFfbWM4JTMsIDYsIDcgKyBleHRyYV9yZWdzLCAwCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgIHIyLCByMmQKKyVlbmRpZgorICAgIG1vdiAgICAgICAgICByNmQsIHI1ZAorICAgIG9yICAgICAgICAgICByNmQsIHI0ZAorICAgIGpuZSAuYXRfbGVhc3Rfb25lX25vbl96ZXJvCisgICAgOyBteCA9PSAwIEFORCBteSA9PSAwIC0gbm8gZmlsdGVyIG5lZWRlZAorICAgIG12MF9waXhlbHNfbWM4CisgICAgUkVQX1JFVAorCisuYXRfbGVhc3Rfb25lX25vbl96ZXJvOgorJWlmaWRuICUyLCBydjQwCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3YgICAgICAgICAgIHI3LCByNQorICAgIGFuZCAgICAgICAgICAgcjcsIDYgICAgICAgICA7ICZ+MSBmb3IgbXgvbXk9WzAsN10KKyAgICBsZWEgICAgICAgICAgIHI3LCBbcjcqNCtyNF0KKyAgICBzYXIgICAgICAgICAgcjdkLCAxCislZGVmaW5lIHJuZF9iaWFzIHI3CislZGVmaW5lIGRlc3RfcmVnIHIwCislZWxzZSA7IHg4Ni0zMgorICAgIG1vdiAgICAgICAgICAgcjAsIHI1CisgICAgYW5kICAgICAgICAgICByMCwgNiAgICAgICAgIDsgJn4xIGZvciBteC9teT1bMCw3XQorICAgIGxlYSAgICAgICAgICAgcjAsIFtyMCo0K3I0XQorICAgIHNhciAgICAgICAgICByMGQsIDEKKyVkZWZpbmUgcm5kX2JpYXMgcjAKKyVkZWZpbmUgZGVzdF9yZWcgcjUKKyVlbmRpZgorJWVsc2UgOyB2YzEsIGgyNjQKKyVkZWZpbmUgcm5kX2JpYXMgIDAKKyVkZWZpbmUgZGVzdF9yZWcgcjAKKyVlbmRpZgorCisgICAgdGVzdCAgICAgICAgIHI1ZCwgcjVkCisgICAgbW92ICAgICAgICAgICByNiwgMQorICAgIGplIC5teV9pc196ZXJvCisgICAgdGVzdCAgICAgICAgIHI0ZCwgcjRkCisgICAgbW92ICAgICAgICAgICByNiwgcjIgICAgICAgIDsgZHh5ID0geCA/IDEgOiBzdHJpZGUKKyAgICBqbmUgLmJvdGhfbm9uX3plcm8KKy5teV9pc196ZXJvOgorICAgIDsgbXggPT0gMCBYT1IgbXkgPT0gMCAtIDEgZGltZW5zaW9uYWwgZmlsdGVyIG9ubHkKKyAgICBvciAgICAgICAgICAgcjRkLCByNWQgICAgICAgOyB4ICsgeQorCislaWZpZG4gJTIsIHJ2NDAKKyVpZmRlZiBQSUMKKyAgICBsZWEgICAgICAgICAgIHI4LCBbcm5kX3J2NDBfMWRfdGJsXQorJWVuZGlmCislaWYgQVJDSF9YODZfNjQgPT0gMAorICAgIG1vdiAgICAgICAgICAgcjUsIHIwbQorJWVuZGlmCislZW5kaWYKKworICAgIG1vdmQgICAgICAgICAgbTUsIHI0ZAorICAgIG1vdnEgICAgICAgICAgbTQsIFtwd184XQorICAgIG1vdnEgICAgICAgICAgbTYsIFtybmRfMWRfJTIrcm5kX2JpYXMqOF0gOyBtbTYgPSBybmQgPj4gMworICAgIHB1bnBja2x3ZCAgICAgbTUsIG01CisgICAgcHVucGNrbGRxICAgICBtNSwgbTUgICAgICAgIDsgbW01ID0gQiA9IHgKKyAgICBweG9yICAgICAgICAgIG03LCBtNworICAgIHBzdWJ3ICAgICAgICAgbTQsIG01ICAgICAgICA7IG1tNCA9IEEgPSA4LXgKKworLm5leHQxZHJvdzoKKyAgICBtb3ZxICAgICAgICAgIG0wLCBbcjEgICBdICAgOyBtbTAgPSBzcmNbMC4uN10KKyAgICBtb3ZxICAgICAgICAgIG0yLCBbcjErcjZdICAgOyBtbTEgPSBzcmNbMS4uOF0KKworICAgIG1vdnEgICAgICAgICAgbTEsIG0wCisgICAgbW92cSAgICAgICAgICBtMywgbTIKKyAgICBwdW5wY2tsYncgICAgIG0wLCBtNworICAgIHB1bnBja2hidyAgICAgbTEsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMiwgbTcKKyAgICBwdW5wY2toYncgICAgIG0zLCBtNworICAgIHBtdWxsdyAgICAgICAgbTAsIG00ICAgICAgICA7IFttbTAsbW0xXSA9IEEgKiBzcmNbMC4uN10KKyAgICBwbXVsbHcgICAgICAgIG0xLCBtNAorICAgIHBtdWxsdyAgICAgICAgbTIsIG01ICAgICAgICA7IFttbTIsbW0zXSA9IEIgKiBzcmNbMS4uOF0KKyAgICBwbXVsbHcgICAgICAgIG0zLCBtNQorCisgICAgcGFkZHcgICAgICAgICBtMCwgbTYKKyAgICBwYWRkdyAgICAgICAgIG0xLCBtNgorICAgIHBhZGR3ICAgICAgICAgbTAsIG0yCisgICAgcGFkZHcgICAgICAgICBtMSwgbTMKKyAgICBwc3JsdyAgICAgICAgIG0wLCAzCisgICAgcHNybHcgICAgICAgICBtMSwgMworICAgIHBhY2t1c3diICAgICAgbTAsIG0xCisgICAgQ0hST01BTUNfQVZHICBtMCwgW2Rlc3RfcmVnXQorICAgIG1vdnEgIFtkZXN0X3JlZ10sIG0wICAgICAgICA7IGRzdFswLi43XSA9IChBICogc3JjWzAuLjddICsgQiAqIHNyY1sxLi44XSArIChybmQgPj4gMykpID4+IDMKKworICAgIGFkZCAgICAgZGVzdF9yZWcsIHIyCisgICAgYWRkICAgICAgICAgICByMSwgcjIKKyAgICBkZWMgICAgICAgICAgIHIzZAorICAgIGpuZSAubmV4dDFkcm93CisgICAgUkVQX1JFVAorCisuYm90aF9ub25femVybzogOyBnZW5lcmFsIGNhc2UsIGJpbGluZWFyCisgICAgbW92ZCAgICAgICAgICBtNCwgcjRkICAgICAgICAgOyB4CisgICAgbW92ZCAgICAgICAgICBtNiwgcjVkICAgICAgICAgOyB5CislaWZpZG4gJTIsIHJ2NDAKKyVpZmRlZiBQSUMKKyAgICBsZWEgICAgICAgICAgIHI4LCBbcm5kX3J2NDBfMmRfdGJsXQorJWVuZGlmCislaWYgQVJDSF9YODZfNjQgPT0gMAorICAgIG1vdiAgICAgICAgICAgcjUsIHIwbQorJWVuZGlmCislZW5kaWYKKyAgICBtb3YgICAgICAgICAgIHI2LCByc3AgICAgICAgICA7IGJhY2t1cCBzdGFjayBwb2ludGVyCisgICAgYW5kICAgICAgICAgIHJzcCwgfihtbXNpemUtMSkgOyBhbGlnbiBzdGFjaworICAgIHN1YiAgICAgICAgICByc3AsIDE2ICAgICAgICAgIDsgQUEgYW5kIERECisKKyAgICBwdW5wY2tsd2QgICAgIG00LCBtNAorICAgIHB1bnBja2x3ZCAgICAgbTYsIG02CisgICAgcHVucGNrbGRxICAgICBtNCwgbTQgICAgICAgICAgOyBtbTQgPSB4IHdvcmRzCisgICAgcHVucGNrbGRxICAgICBtNiwgbTYgICAgICAgICAgOyBtbTYgPSB5IHdvcmRzCisgICAgbW92cSAgICAgICAgICBtNSwgbTQKKyAgICBwbXVsbHcgICAgICAgIG00LCBtNiAgICAgICAgICA7IG1tNCA9IHggKiB5CisgICAgcHNsbHcgICAgICAgICBtNSwgMworICAgIHBzbGx3ICAgICAgICAgbTYsIDMKKyAgICBtb3ZxICAgICAgICAgIG03LCBtNQorICAgIHBhZGR3ICAgICAgICAgbTcsIG02CisgICAgbW92cSAgICAgW3JzcCs4XSwgbTQgICAgICAgICAgOyBERCA9IHggKiB5CisgICAgcHN1YncgICAgICAgICBtNSwgbTQgICAgICAgICAgOyBtbTUgPSBCID0gOHggLSB4eQorICAgIHBzdWJ3ICAgICAgICAgbTYsIG00ICAgICAgICAgIDsgbW02ID0gQyA9IDh5IC0geHkKKyAgICBwYWRkdyAgICAgICAgIG00LCBbcHdfNjRdCisgICAgcHN1YncgICAgICAgICBtNCwgbTcgICAgICAgICAgOyBtbTQgPSBBID0geHkgLSAoOHgrOHkpICsgNjQKKyAgICBweG9yICAgICAgICAgIG03LCBtNworICAgIG1vdnEgICAgIFtyc3AgIF0sIG00CisKKyAgICBtb3ZxICAgICAgICAgIG0wLCBbcjEgIF0gICAgICA7IG1tMCA9IHNyY1swLi43XQorICAgIG1vdnEgICAgICAgICAgbTEsIFtyMSsxXSAgICAgIDsgbW0xID0gc3JjWzEuLjhdCisubmV4dDJkcm93OgorICAgIGFkZCAgICAgICAgICAgcjEsIHIyCisKKyAgICBtb3ZxICAgICAgICAgIG0yLCBtMAorICAgIG1vdnEgICAgICAgICAgbTMsIG0xCisgICAgcHVucGNraGJ3ICAgICBtMCwgbTcKKyAgICBwdW5wY2tsYncgICAgIG0xLCBtNworICAgIHB1bnBja2xidyAgICAgbTIsIG03CisgICAgcHVucGNraGJ3ICAgICBtMywgbTcKKyAgICBwbXVsbHcgICAgICAgIG0wLCBbcnNwXQorICAgIHBtdWxsdyAgICAgICAgbTIsIFtyc3BdCisgICAgcG11bGx3ICAgICAgICBtMSwgbTUKKyAgICBwbXVsbHcgICAgICAgIG0zLCBtNQorICAgIHBhZGR3ICAgICAgICAgbTIsIG0xICAgICAgICAgIDsgbW0yID0gQSAqIHNyY1swLi4zXSArIEIgKiBzcmNbMS4uNF0KKyAgICBwYWRkdyAgICAgICAgIG0zLCBtMCAgICAgICAgICA7IG1tMyA9IEEgKiBzcmNbNC4uN10gKyBCICogc3JjWzUuLjhdCisKKyAgICBtb3ZxICAgICAgICAgIG0wLCBbcjFdCisgICAgbW92cSAgICAgICAgICBtMSwgbTAKKyAgICBwdW5wY2tsYncgICAgIG0wLCBtNworICAgIHB1bnBja2hidyAgICAgbTEsIG03CisgICAgcG11bGx3ICAgICAgICBtMCwgbTYKKyAgICBwbXVsbHcgICAgICAgIG0xLCBtNgorICAgIHBhZGR3ICAgICAgICAgbTIsIG0wCisgICAgcGFkZHcgICAgICAgICBtMywgbTEgICAgICAgICAgOyBbbW0yLG1tM10gKz0gQyAqIHNyY1swLi43XQorCisgICAgbW92cSAgICAgICAgICBtMSwgW3IxKzFdCisgICAgbW92cSAgICAgICAgICBtMCwgbTEKKyAgICBtb3ZxICAgICAgICAgIG00LCBtMQorICAgIHB1bnBja2xidyAgICAgbTAsIG03CisgICAgcHVucGNraGJ3ICAgICBtNCwgbTcKKyAgICBwbXVsbHcgICAgICAgIG0wLCBbcnNwKzhdCisgICAgcG11bGx3ICAgICAgICBtNCwgW3JzcCs4XQorICAgIHBhZGR3ICAgICAgICAgbTIsIG0wCisgICAgcGFkZHcgICAgICAgICBtMywgbTQgICAgICAgICAgOyBbbW0yLG1tM10gKz0gRCAqIHNyY1sxLi44XQorICAgIG1vdnEgICAgICAgICAgbTAsIFtyMV0KKworICAgIHBhZGR3ICAgICAgICAgbTIsIFtybmRfMmRfJTIrcm5kX2JpYXMqOF0KKyAgICBwYWRkdyAgICAgICAgIG0zLCBbcm5kXzJkXyUyK3JuZF9iaWFzKjhdCisgICAgcHNybHcgICAgICAgICBtMiwgNgorICAgIHBzcmx3ICAgICAgICAgbTMsIDYKKyAgICBwYWNrdXN3YiAgICAgIG0yLCBtMworICAgIENIUk9NQU1DX0FWRyAgbTIsIFtkZXN0X3JlZ10KKyAgICBtb3ZxICBbZGVzdF9yZWddLCBtMiAgICAgICAgICA7IGRzdFswLi43XSA9IChbbW0yLG1tM10gKyBybmQpID4+IDYKKworICAgIGFkZCAgICAgZGVzdF9yZWcsIHIyCisgICAgZGVjICAgICAgICAgIHIzZAorICAgIGpuZSAubmV4dDJkcm93CisgICAgbW92ICAgICAgICAgIHJzcCwgcjYgICAgICAgICAgOyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKKyAgICBSRVQKKyVlbmRtYWNybworCislbWFjcm8gY2hyb21hX21jNF9tbXhfZnVuYyAyCislZGVmaW5lIGV4dHJhX3JlZ3MgMAorJWlmaWRuICUyLCBydjQwCislaWZkZWYgUElDCislZGVmaW5lIGV4dHJhX3JlZ3MgMQorJWVuZGlmIDsgUElDCislZW5kaWYgOyBydjQwCitjZ2xvYmFsICUxXyUyX2Nocm9tYV9tYzQsIDYsIDYgKyBleHRyYV9yZWdzLCAwCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgIHIyLCByMmQKKyVlbmRpZgorICAgIHB4b3IgICAgICAgICAgbTcsIG03CisgICAgbW92ZCAgICAgICAgICBtMiwgcjRkICAgICAgICAgOyB4CisgICAgbW92ZCAgICAgICAgICBtMywgcjVkICAgICAgICAgOyB5CisgICAgbW92cSAgICAgICAgICBtNCwgW3B3XzhdCisgICAgbW92cSAgICAgICAgICBtNSwgW3B3XzhdCisgICAgcHVucGNrbHdkICAgICBtMiwgbTIKKyAgICBwdW5wY2tsd2QgICAgIG0zLCBtMworICAgIHB1bnBja2x3ZCAgICAgbTIsIG0yCisgICAgcHVucGNrbHdkICAgICBtMywgbTMKKyAgICBwc3VidyAgICAgICAgIG00LCBtMgorICAgIHBzdWJ3ICAgICAgICAgbTUsIG0zCisKKyVpZmlkbiAlMiwgcnY0MAorJWlmZGVmIFBJQworICAgbGVhICAgICAgICAgICAgcjYsIFtybmRfcnY0MF8yZF90YmxdCislZGVmaW5lIHJuZF8yZF9ydjQwIHI2CislZWxzZQorJWRlZmluZSBybmRfMmRfcnY0MCBybmRfcnY0MF8yZF90YmwKKyVlbmRpZgorICAgIGFuZCAgICAgICAgICAgcjUsIDYgICAgICAgICA7ICZ+MSBmb3IgbXgvbXk9WzAsN10KKyAgICBsZWEgICAgICAgICAgIHI1LCBbcjUqNCtyNF0KKyAgICBzYXIgICAgICAgICAgcjVkLCAxCislZGVmaW5lIHJuZF9iaWFzIHI1CislZWxzZSA7IHZjMSwgaDI2NAorJWRlZmluZSBybmRfYmlhcyAwCislZW5kaWYKKworICAgIG1vdmQgICAgICAgICAgbTAsIFtyMSAgXQorICAgIG1vdmQgICAgICAgICAgbTYsIFtyMSsxXQorICAgIGFkZCAgICAgICAgICAgcjEsIHIyCisgICAgcHVucGNrbGJ3ICAgICBtMCwgbTcKKyAgICBwdW5wY2tsYncgICAgIG02LCBtNworICAgIHBtdWxsdyAgICAgICAgbTAsIG00CisgICAgcG11bGx3ICAgICAgICBtNiwgbTIKKyAgICBwYWRkdyAgICAgICAgIG02LCBtMAorCisubmV4dDJyb3dzOgorICAgIG1vdmQgICAgICAgICAgbTAsIFtyMSAgXQorICAgIG1vdmQgICAgICAgICAgbTEsIFtyMSsxXQorICAgIGFkZCAgICAgICAgICAgcjEsIHIyCisgICAgcHVucGNrbGJ3ICAgICBtMCwgbTcKKyAgICBwdW5wY2tsYncgICAgIG0xLCBtNworICAgIHBtdWxsdyAgICAgICAgbTAsIG00CisgICAgcG11bGx3ICAgICAgICBtMSwgbTIKKyAgICBwYWRkdyAgICAgICAgIG0xLCBtMAorICAgIG1vdnEgICAgICAgICAgbTAsIG0xCisKKyAgICBwbXVsbHcgICAgICAgIG02LCBtNQorICAgIHBtdWxsdyAgICAgICAgbTEsIG0zCisgICAgcGFkZHcgICAgICAgICBtNiwgW3JuZF8yZF8lMitybmRfYmlhcyo4XQorICAgIHBhZGR3ICAgICAgICAgbTEsIG02CisgICAgcHNybHcgICAgICAgICBtMSwgNgorICAgIHBhY2t1c3diICAgICAgbTEsIG0xCisgICAgQ0hST01BTUNfQVZHNCBtMSwgbTYsIFtyMF0KKyAgICBtb3ZkICAgICAgICBbcjBdLCBtMQorICAgIGFkZCAgICAgICAgICAgcjAsIHIyCisKKyAgICBtb3ZkICAgICAgICAgIG02LCBbcjEgIF0KKyAgICBtb3ZkICAgICAgICAgIG0xLCBbcjErMV0KKyAgICBhZGQgICAgICAgICAgIHIxLCByMgorICAgIHB1bnBja2xidyAgICAgbTYsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMSwgbTcKKyAgICBwbXVsbHcgICAgICAgIG02LCBtNAorICAgIHBtdWxsdyAgICAgICAgbTEsIG0yCisgICAgcGFkZHcgICAgICAgICBtMSwgbTYKKyAgICBtb3ZxICAgICAgICAgIG02LCBtMQorICAgIHBtdWxsdyAgICAgICAgbTAsIG01CisgICAgcG11bGx3ICAgICAgICBtMSwgbTMKKyAgICBwYWRkdyAgICAgICAgIG0wLCBbcm5kXzJkXyUyK3JuZF9iaWFzKjhdCisgICAgcGFkZHcgICAgICAgICBtMSwgbTAKKyAgICBwc3JsdyAgICAgICAgIG0xLCA2CisgICAgcGFja3Vzd2IgICAgICBtMSwgbTEKKyAgICBDSFJPTUFNQ19BVkc0IG0xLCBtMCwgW3IwXQorICAgIG1vdmQgICAgICAgIFtyMF0sIG0xCisgICAgYWRkICAgICAgICAgICByMCwgcjIKKyAgICBzdWIgICAgICAgICAgcjNkLCAyCisgICAgam56IC5uZXh0MnJvd3MKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworJW1hY3JvIGNocm9tYV9tYzJfbW14X2Z1bmMgMgorY2dsb2JhbCAlMV8lMl9jaHJvbWFfbWMyLCA2LCA3LCAwCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgIHIyLCByMmQKKyVlbmRpZgorCisgICAgbW92ICAgICAgICAgIHI2ZCwgcjRkCisgICAgc2hsICAgICAgICAgIHI0ZCwgMTYKKyAgICBzdWIgICAgICAgICAgcjRkLCByNmQKKyAgICBhZGQgICAgICAgICAgcjRkLCA4CisgICAgaW11bCAgICAgICAgIHI1ZCwgcjRkICAgICAgICAgOyB4Knk8PDE2IHwgeSooOC14KQorICAgIHNobCAgICAgICAgICByNGQsIDMKKyAgICBzdWIgICAgICAgICAgcjRkLCByNWQgICAgICAgICA7IHgqKDgteSk8PDE2IHwgKDgteCkqKDgteSkKKworICAgIG1vdmQgICAgICAgICAgbTUsIHI0ZAorICAgIG1vdmQgICAgICAgICAgbTYsIHI1ZAorICAgIHB1bnBja2xkcSAgICAgbTUsIG01ICAgICAgICAgIDsgbW01ID0ge0EsQixBLEJ9CisgICAgcHVucGNrbGRxICAgICBtNiwgbTYgICAgICAgICAgOyBtbTYgPSB7QyxELEMsRH0KKyAgICBweG9yICAgICAgICAgIG03LCBtNworICAgIG1vdmQgICAgICAgICAgbTIsIFtyMV0KKyAgICBwdW5wY2tsYncgICAgIG0yLCBtNworICAgIHBzaHVmdyAgICAgICAgbTIsIG0yLCAweDk0ICAgIDsgbW0wID0gc3JjWzAsMSwxLDJdCisKKy5uZXh0cm93OgorICAgIGFkZCAgICAgICAgICAgcjEsIHIyCisgICAgbW92cSAgICAgICAgICBtMSwgbTIKKyAgICBwbWFkZHdkICAgICAgIG0xLCBtNSAgICAgICAgICA7IG1tMSA9IEEgKiBzcmNbMCwxXSArIEIgKiBzcmNbMSwyXQorICAgIG1vdmQgICAgICAgICAgbTAsIFtyMV0KKyAgICBwdW5wY2tsYncgICAgIG0wLCBtNworICAgIHBzaHVmdyAgICAgICAgbTAsIG0wLCAweDk0ICAgIDsgbW0wID0gc3JjWzAsMSwxLDJdCisgICAgbW92cSAgICAgICAgICBtMiwgbTAKKyAgICBwbWFkZHdkICAgICAgIG0wLCBtNgorICAgIHBhZGR3ICAgICAgICAgbTEsIFtybmRfMmRfJTJdCisgICAgcGFkZHcgICAgICAgICBtMSwgbTAgICAgICAgICAgOyBtbTEgKz0gQyAqIHNyY1swLDFdICsgRCAqIHNyY1sxLDJdCisgICAgcHNybHcgICAgICAgICBtMSwgNgorICAgIHBhY2tzc2R3ICAgICAgbTEsIG03CisgICAgcGFja3Vzd2IgICAgICBtMSwgbTcKKyAgICBDSFJPTUFNQ19BVkc0IG0xLCBtMywgW3IwXQorICAgIG1vdmQgICAgICAgICByNWQsIG0xCisgICAgbW92ICAgICAgICAgW3IwXSwgcjV3CisgICAgYWRkICAgICAgICAgICByMCwgcjIKKyAgICBzdWIgICAgICAgICAgcjNkLCAxCisgICAgam56IC5uZXh0cm93CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKKyVkZWZpbmUgcm5kXzFkX2gyNjQgcHdfNAorJWRlZmluZSBybmRfMmRfaDI2NCBwd18zMgorJWRlZmluZSBybmRfMWRfdmMxICBwd18zCislZGVmaW5lIHJuZF8yZF92YzEgIHB3XzI4CisKKyVtYWNybyBOT1RISU5HIDItMworJWVuZG1hY3JvCislbWFjcm8gRElSRUNUX0FWRyAyCisgICAgUEFWR0IgICAgICAgICAlMSwgJTIKKyVlbmRtYWNybworJW1hY3JvIENPUFlfQVZHIDMKKyAgICBtb3ZkICAgICAgICAgICUyLCAlMworICAgIFBBVkdCICAgICAgICAgJTEsICUyCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CislZGVmaW5lIENIUk9NQU1DX0FWRyAgTk9USElORworJWRlZmluZSBDSFJPTUFNQ19BVkc0IE5PVEhJTkcKK2Nocm9tYV9tYzhfbW14X2Z1bmMgcHV0LCBoMjY0LCBfcm5kCitjaHJvbWFfbWM4X21teF9mdW5jIHB1dCwgdmMxLCAgX25vcm5kCitjaHJvbWFfbWM4X21teF9mdW5jIHB1dCwgcnY0MAorY2hyb21hX21jNF9tbXhfZnVuYyBwdXQsIGgyNjQKK2Nocm9tYV9tYzRfbW14X2Z1bmMgcHV0LCBydjQwCisKK0lOSVRfTU1YIG1teGV4dAorY2hyb21hX21jMl9tbXhfZnVuYyBwdXQsIGgyNjQKKworJWRlZmluZSBDSFJPTUFNQ19BVkcgIERJUkVDVF9BVkcKKyVkZWZpbmUgQ0hST01BTUNfQVZHNCBDT1BZX0FWRworY2hyb21hX21jOF9tbXhfZnVuYyBhdmcsIGgyNjQsIF9ybmQKK2Nocm9tYV9tYzhfbW14X2Z1bmMgYXZnLCB2YzEsICBfbm9ybmQKK2Nocm9tYV9tYzhfbW14X2Z1bmMgYXZnLCBydjQwCitjaHJvbWFfbWM0X21teF9mdW5jIGF2ZywgaDI2NAorY2hyb21hX21jNF9tbXhfZnVuYyBhdmcsIHJ2NDAKK2Nocm9tYV9tYzJfbW14X2Z1bmMgYXZnLCBoMjY0CisKK0lOSVRfTU1YIDNkbm93CitjaHJvbWFfbWM4X21teF9mdW5jIGF2ZywgaDI2NCwgX3JuZAorY2hyb21hX21jOF9tbXhfZnVuYyBhdmcsIHZjMSwgIF9ub3JuZAorY2hyb21hX21jOF9tbXhfZnVuYyBhdmcsIHJ2NDAKK2Nocm9tYV9tYzRfbW14X2Z1bmMgYXZnLCBoMjY0CitjaHJvbWFfbWM0X21teF9mdW5jIGF2ZywgcnY0MAorCislbWFjcm8gY2hyb21hX21jOF9zc3NlM19mdW5jIDItMworY2dsb2JhbCAlMV8lMl9jaHJvbWFfbWM4JTMsIDYsIDcsIDgKKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdnN4ZCAgICAgICAgcjIsIHIyZAorJWVuZGlmCisgICAgbW92ICAgICAgICAgIHI2ZCwgcjVkCisgICAgb3IgICAgICAgICAgIHI2ZCwgcjRkCisgICAgam5lIC5hdF9sZWFzdF9vbmVfbm9uX3plcm8KKyAgICA7IG14ID09IDAgQU5EIG15ID09IDAgLSBubyBmaWx0ZXIgbmVlZGVkCisgICAgbXYwX3BpeGVsc19tYzgKKyAgICBSRVBfUkVUCisKKy5hdF9sZWFzdF9vbmVfbm9uX3plcm86CisgICAgdGVzdCAgICAgICAgIHI1ZCwgcjVkCisgICAgamUgLm15X2lzX3plcm8KKyAgICB0ZXN0ICAgICAgICAgcjRkLCByNGQKKyAgICBqZSAubXhfaXNfemVybworCisgICAgOyBnZW5lcmFsIGNhc2UsIGJpbGluZWFyCisgICAgbW92ICAgICAgICAgIHI2ZCwgcjRkCisgICAgc2hsICAgICAgICAgIHI0ZCwgOAorICAgIHN1YiAgICAgICAgICAgcjQsIHI2CisgICAgbW92ICAgICAgICAgICByNiwgOAorICAgIGFkZCAgICAgICAgICAgcjQsIDggICAgICAgICAgIDsgeCoyODgrOCA9IHg8PDggfCAoOC14KQorICAgIHN1YiAgICAgICAgICByNmQsIHI1ZAorICAgIGltdWwgICAgICAgICAgcjYsIHI0ICAgICAgICAgIDsgKDgteSkqKHgqMjU1KzgpID0gKDgteSkqeDw8OCB8ICg4LXkpKig4LXgpCisgICAgaW11bCAgICAgICAgIHI0ZCwgcjVkICAgICAgICAgOyAgICB5ICooeCoyNTUrOCkgPSAgICB5ICp4PDw4IHwgICAgeSAqKDgteCkKKworICAgIG1vdmQgICAgICAgICAgbTcsIHI2ZAorICAgIG1vdmQgICAgICAgICAgbTYsIHI0ZAorICAgIG1vdmRxYSAgICAgICAgbTUsIFtybmRfMmRfJTJdCisgICAgbW92cSAgICAgICAgICBtMCwgW3IxICBdCisgICAgbW92cSAgICAgICAgICBtMSwgW3IxKzFdCisgICAgcHNodWZsdyAgICAgICBtNywgbTcsIDAKKyAgICBwc2h1Zmx3ICAgICAgIG02LCBtNiwgMAorICAgIHB1bnBja2xidyAgICAgbTAsIG0xCisgICAgbW92bGhwcyAgICAgICBtNywgbTcKKyAgICBtb3ZsaHBzICAgICAgIG02LCBtNgorCisubmV4dDJyb3dzOgorICAgIG1vdnEgICAgICAgICAgbTEsIFtyMStyMioxICAgXQorICAgIG1vdnEgICAgICAgICAgbTIsIFtyMStyMioxKzFdCisgICAgbW92cSAgICAgICAgICBtMywgW3IxK3IyKjIgIF0KKyAgICBtb3ZxICAgICAgICAgIG00LCBbcjErcjIqMisxXQorICAgIGxlYSAgICAgICAgICAgcjEsIFtyMStyMioyXQorICAgIHB1bnBja2xidyAgICAgbTEsIG0yCisgICAgbW92ZHFhICAgICAgICBtMiwgbTEKKyAgICBwdW5wY2tsYncgICAgIG0zLCBtNAorICAgIG1vdmRxYSAgICAgICAgbTQsIG0zCisgICAgcG1hZGR1YnN3ICAgICBtMCwgbTcKKyAgICBwbWFkZHVic3cgICAgIG0xLCBtNgorICAgIHBtYWRkdWJzdyAgICAgbTIsIG03CisgICAgcG1hZGR1YnN3ICAgICBtMywgbTYKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtNQorICAgIHBhZGR3ICAgICAgICAgbTIsIG01CisgICAgcGFkZHcgICAgICAgICBtMSwgbTAKKyAgICBwYWRkdyAgICAgICAgIG0zLCBtMgorICAgIHBzcmx3ICAgICAgICAgbTEsIDYKKyAgICBtb3ZkcWEgICAgICAgIG0wLCBtNAorICAgIHBzcmx3ICAgICAgICAgbTMsIDYKKyVpZmlkbiAlMSwgYXZnCisgICAgbW92cSAgICAgICAgICBtMiwgW3IwICAgXQorICAgIG1vdmhwcyAgICAgICAgbTIsIFtyMCtyMl0KKyVlbmRpZgorICAgIHBhY2t1c3diICAgICAgbTEsIG0zCisgICAgQ0hST01BTUNfQVZHICBtMSwgbTIKKyAgICBtb3ZxICAgICBbcjAgICBdLCBtMQorICAgIG1vdmhwcyAgIFtyMCtyMl0sIG0xCisgICAgc3ViICAgICAgICAgIHIzZCwgMgorICAgIGxlYSAgICAgICAgICAgcjAsIFtyMCtyMioyXQorICAgIGpnIC5uZXh0MnJvd3MKKyAgICBSRVBfUkVUCisKKy5teV9pc196ZXJvOgorICAgIG1vdiAgICAgICAgICByNWQsIHI0ZAorICAgIHNobCAgICAgICAgICByNGQsIDgKKyAgICBhZGQgICAgICAgICAgIHI0LCA4CisgICAgc3ViICAgICAgICAgICByNCwgcjUgICAgICAgICAgOyAyNTUqeCs4ID0geDw8OCB8ICg4LXgpCisgICAgbW92ZCAgICAgICAgICBtNywgcjRkCisgICAgbW92ZHFhICAgICAgICBtNiwgW3JuZF8xZF8lMl0KKyAgICBwc2h1Zmx3ICAgICAgIG03LCBtNywgMAorICAgIG1vdmxocHMgICAgICAgbTcsIG03CisKKy5uZXh0Mnhyb3dzOgorICAgIG1vdnEgICAgICAgICAgbTAsIFtyMSAgICAgXQorICAgIG1vdnEgICAgICAgICAgbTEsIFtyMSAgICsxXQorICAgIG1vdnEgICAgICAgICAgbTIsIFtyMStyMiAgXQorICAgIG1vdnEgICAgICAgICAgbTMsIFtyMStyMisxXQorICAgIHB1bnBja2xidyAgICAgbTAsIG0xCisgICAgcHVucGNrbGJ3ICAgICBtMiwgbTMKKyAgICBwbWFkZHVic3cgICAgIG0wLCBtNworICAgIHBtYWRkdWJzdyAgICAgbTIsIG03CislaWZpZG4gJTEsIGF2ZworICAgIG1vdnEgICAgICAgICAgbTQsIFtyMCAgIF0KKyAgICBtb3ZocHMgICAgICAgIG00LCBbcjArcjJdCislZW5kaWYKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtNgorICAgIHBhZGR3ICAgICAgICAgbTIsIG02CisgICAgcHNybHcgICAgICAgICBtMCwgMworICAgIHBzcmx3ICAgICAgICAgbTIsIDMKKyAgICBwYWNrdXN3YiAgICAgIG0wLCBtMgorICAgIENIUk9NQU1DX0FWRyAgbTAsIG00CisgICAgbW92cSAgICAgW3IwICAgXSwgbTAKKyAgICBtb3ZocHMgICBbcjArcjJdLCBtMAorICAgIHN1YiAgICAgICAgICByM2QsIDIKKyAgICBsZWEgICAgICAgICAgIHIwLCBbcjArcjIqMl0KKyAgICBsZWEgICAgICAgICAgIHIxLCBbcjErcjIqMl0KKyAgICBqZyAubmV4dDJ4cm93cworICAgIFJFUF9SRVQKKworLm14X2lzX3plcm86CisgICAgbW92ICAgICAgICAgIHI0ZCwgcjVkCisgICAgc2hsICAgICAgICAgIHI1ZCwgOAorICAgIGFkZCAgICAgICAgICAgcjUsIDgKKyAgICBzdWIgICAgICAgICAgIHI1LCByNCAgICAgICAgICA7IDI1NSp5KzggPSB5PDw4IHwgKDgteSkKKyAgICBtb3ZkICAgICAgICAgIG03LCByNWQKKyAgICBtb3ZkcWEgICAgICAgIG02LCBbcm5kXzFkXyUyXQorICAgIHBzaHVmbHcgICAgICAgbTcsIG03LCAwCisgICAgbW92bGhwcyAgICAgICBtNywgbTcKKworLm5leHQyeXJvd3M6CisgICAgbW92cSAgICAgICAgICBtMCwgW3IxICAgICBdCisgICAgbW92cSAgICAgICAgICBtMSwgW3IxK3IyICBdCisgICAgbW92ZHFhICAgICAgICBtMiwgbTEKKyAgICBtb3ZxICAgICAgICAgIG0zLCBbcjErcjIqMl0KKyAgICBsZWEgICAgICAgICAgIHIxLCBbcjErcjIqMl0KKyAgICBwdW5wY2tsYncgICAgIG0wLCBtMQorICAgIHB1bnBja2xidyAgICAgbTIsIG0zCisgICAgcG1hZGR1YnN3ICAgICBtMCwgbTcKKyAgICBwbWFkZHVic3cgICAgIG0yLCBtNworJWlmaWRuICUxLCBhdmcKKyAgICBtb3ZxICAgICAgICAgIG00LCBbcjAgICBdCisgICAgbW92aHBzICAgICAgICBtNCwgW3IwK3IyXQorJWVuZGlmCisgICAgcGFkZHcgICAgICAgICBtMCwgbTYKKyAgICBwYWRkdyAgICAgICAgIG0yLCBtNgorICAgIHBzcmx3ICAgICAgICAgbTAsIDMKKyAgICBwc3JsdyAgICAgICAgIG0yLCAzCisgICAgcGFja3Vzd2IgICAgICBtMCwgbTIKKyAgICBDSFJPTUFNQ19BVkcgIG0wLCBtNAorICAgIG1vdnEgICAgIFtyMCAgIF0sIG0wCisgICAgbW92aHBzICAgW3IwK3IyXSwgbTAKKyAgICBzdWIgICAgICAgICAgcjNkLCAyCisgICAgbGVhICAgICAgICAgICByMCwgW3IwK3IyKjJdCisgICAgamcgLm5leHQyeXJvd3MKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworJW1hY3JvIGNocm9tYV9tYzRfc3NzZTNfZnVuYyAyCitjZ2xvYmFsICUxXyUyX2Nocm9tYV9tYzQsIDYsIDcsIDAKKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdnN4ZCAgICAgICAgcjIsIHIyZAorJWVuZGlmCisgICAgbW92ICAgICAgICAgICByNiwgcjQKKyAgICBzaGwgICAgICAgICAgcjRkLCA4CisgICAgc3ViICAgICAgICAgIHI0ZCwgcjZkCisgICAgbW92ICAgICAgICAgICByNiwgOAorICAgIGFkZCAgICAgICAgICByNGQsIDggICAgICAgICAgIDsgeCoyODgrOAorICAgIHN1YiAgICAgICAgICByNmQsIHI1ZAorICAgIGltdWwgICAgICAgICByNmQsIHI0ZCAgICAgICAgIDsgKDgteSkqKHgqMjU1KzgpID0gKDgteSkqeDw8OCB8ICg4LXkpKig4LXgpCisgICAgaW11bCAgICAgICAgIHI0ZCwgcjVkICAgICAgICAgOyAgICB5ICooeCoyNTUrOCkgPSAgICB5ICp4PDw4IHwgICAgeSAqKDgteCkKKworICAgIG1vdmQgICAgICAgICAgbTcsIHI2ZAorICAgIG1vdmQgICAgICAgICAgbTYsIHI0ZAorICAgIG1vdnEgICAgICAgICAgbTUsIFtwd18zMl0KKyAgICBtb3ZkICAgICAgICAgIG0wLCBbcjEgIF0KKyAgICBwc2h1ZncgICAgICAgIG03LCBtNywgMAorICAgIHB1bnBja2xidyAgICAgbTAsIFtyMSsxXQorICAgIHBzaHVmdyAgICAgICAgbTYsIG02LCAwCisKKy5uZXh0MnJvd3M6CisgICAgbW92ZCAgICAgICAgICBtMSwgW3IxK3IyKjEgIF0KKyAgICBtb3ZkICAgICAgICAgIG0zLCBbcjErcjIqMiAgXQorICAgIHB1bnBja2xidyAgICAgbTEsIFtyMStyMioxKzFdCisgICAgcHVucGNrbGJ3ICAgICBtMywgW3IxK3IyKjIrMV0KKyAgICBsZWEgICAgICAgICAgIHIxLCBbcjErcjIqMl0KKyAgICBtb3ZxICAgICAgICAgIG0yLCBtMQorICAgIG1vdnEgICAgICAgICAgbTQsIG0zCisgICAgcG1hZGR1YnN3ICAgICBtMCwgbTcKKyAgICBwbWFkZHVic3cgICAgIG0xLCBtNgorICAgIHBtYWRkdWJzdyAgICAgbTIsIG03CisgICAgcG1hZGR1YnN3ICAgICBtMywgbTYKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtNQorICAgIHBhZGR3ICAgICAgICAgbTIsIG01CisgICAgcGFkZHcgICAgICAgICBtMSwgbTAKKyAgICBwYWRkdyAgICAgICAgIG0zLCBtMgorICAgIHBzcmx3ICAgICAgICAgbTEsIDYKKyAgICBtb3ZxICAgICAgICAgIG0wLCBtNAorICAgIHBzcmx3ICAgICAgICAgbTMsIDYKKyAgICBwYWNrdXN3YiAgICAgIG0xLCBtMQorICAgIHBhY2t1c3diICAgICAgbTMsIG0zCisgICAgQ0hST01BTUNfQVZHICBtMSwgW3IwICBdCisgICAgQ0hST01BTUNfQVZHICBtMywgW3IwK3IyXQorICAgIG1vdmQgICAgIFtyMCAgIF0sIG0xCisgICAgbW92ZCAgICAgW3IwK3IyXSwgbTMKKyAgICBzdWIgICAgICAgICAgcjNkLCAyCisgICAgbGVhICAgICAgICAgICByMCwgW3IwK3IyKjJdCisgICAgamcgLm5leHQycm93cworICAgIFJFUF9SRVQKKyVlbmRtYWNybworCislZGVmaW5lIENIUk9NQU1DX0FWRyBOT1RISU5HCitJTklUX1hNTSBzc3NlMworY2hyb21hX21jOF9zc3NlM19mdW5jIHB1dCwgaDI2NCwgX3JuZAorY2hyb21hX21jOF9zc3NlM19mdW5jIHB1dCwgdmMxLCAgX25vcm5kCitJTklUX01NWCBzc3NlMworY2hyb21hX21jNF9zc3NlM19mdW5jIHB1dCwgaDI2NAorCislZGVmaW5lIENIUk9NQU1DX0FWRyBESVJFQ1RfQVZHCitJTklUX1hNTSBzc3NlMworY2hyb21hX21jOF9zc3NlM19mdW5jIGF2ZywgaDI2NCwgX3JuZAorY2hyb21hX21jOF9zc3NlM19mdW5jIGF2ZywgdmMxLCAgX25vcm5kCitJTklUX01NWCBzc3NlMworY2hyb21hX21jNF9zc3NlM19mdW5jIGF2ZywgaDI2NApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfY2hyb21hbWNfMTBiaXQuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfY2hyb21hbWNfMTBiaXQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTg0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NF9jaHJvbWFtY18xMGJpdC5hc20KQEAgLTAsMCArMSwyNzIgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogTU1YL1NTRTIvQVZYLW9wdGltaXplZCAxMC1iaXQgSC4yNjQgY2hyb21hIE1DIGNvZGUKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTEgeDI2NCBwcm9qZWN0Cis7KgorOyogQXV0aG9yczogRGFuaWVsIEthbmcgPGRhbmllbC5kLmthbmdAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK2NleHRlcm4gcHdfNAorY2V4dGVybiBwd184CitjZXh0ZXJuIHB3XzMyCitjZXh0ZXJuIHB3XzY0CisKK1NFQ1RJT04gLnRleHQKKworCislbWFjcm8gTVYwX1BJWEVMU19NQzggMAorICAgIGxlYSAgICAgICAgICAgcjQsIFtyMiozICAgXQorICAgIGxlYSAgICAgICAgICAgcjUsIFtyMio0ICAgXQorLm5leHQ0cm93czoKKyAgICBtb3Z1ICAgICAgICAgIG0wLCBbcjEgICAgIF0KKyAgICBtb3Z1ICAgICAgICAgIG0xLCBbcjErcjIgIF0KKyAgICBDSFJPTUFNQ19BVkcgIG0wLCBbcjAgICAgIF0KKyAgICBDSFJPTUFNQ19BVkcgIG0xLCBbcjArcjIgIF0KKyAgICBtb3ZhICAgW3IwICAgICBdLCBtMAorICAgIG1vdmEgICBbcjArcjIgIF0sIG0xCisgICAgbW92dSAgICAgICAgICBtMCwgW3IxK3IyKjJdCisgICAgbW92dSAgICAgICAgICBtMSwgW3IxK3I0ICBdCisgICAgQ0hST01BTUNfQVZHICBtMCwgW3IwK3IyKjJdCisgICAgQ0hST01BTUNfQVZHICBtMSwgW3IwK3I0ICBdCisgICAgbW92YSAgIFtyMCtyMioyXSwgbTAKKyAgICBtb3ZhICAgW3IwK3I0ICBdLCBtMQorICAgIGFkZCAgICAgICAgICAgcjEsIHI1CisgICAgYWRkICAgICAgICAgICByMCwgcjUKKyAgICBzdWIgICAgICAgICAgcjNkLCA0CisgICAgam5lIC5uZXh0NHJvd3MKKyVlbmRtYWNybworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wdXQvYXZnX2gyNjRfY2hyb21hX21jOChwaXhlbCAqZHN0LCBwaXhlbCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXgsIGludCBteSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIENIUk9NQV9NQzggMQorY2dsb2JhbCAlMV9oMjY0X2Nocm9tYV9tYzhfMTAsIDYsNyw4CisgICAgbW92c3hkaWZuaWRuICByMiwgcjJkCisgICAgbW92ICAgICAgICAgIHI2ZCwgcjVkCisgICAgb3IgICAgICAgICAgIHI2ZCwgcjRkCisgICAgam5lIC5hdF9sZWFzdF9vbmVfbm9uX3plcm8KKyAgICA7IG14ID09IDAgQU5EIG15ID09IDAgLSBubyBmaWx0ZXIgbmVlZGVkCisgICAgTVYwX1BJWEVMU19NQzgKKyAgICBSRVBfUkVUCisKKy5hdF9sZWFzdF9vbmVfbm9uX3plcm86CisgICAgbW92ICAgICAgICAgIHI2ZCwgMgorICAgIHRlc3QgICAgICAgICByNWQsIHI1ZAorICAgIGplIC54X2ludGVycG9sYXRpb24KKyAgICBtb3YgICAgICAgICAgIHI2LCByMiAgICAgICAgOyBkeHkgPSB4ID8gMSA6IHN0cmlkZQorICAgIHRlc3QgICAgICAgICByNGQsIHI0ZAorICAgIGpuZSAueHlfaW50ZXJwb2xhdGlvbgorLnhfaW50ZXJwb2xhdGlvbjoKKyAgICA7IG14ID09IDAgWE9SIG15ID09IDAgLSAxIGRpbWVuc2lvbmFsIGZpbHRlciBvbmx5CisgICAgb3IgICAgICAgICAgIHI0ZCwgcjVkICAgICAgIDsgeCArIHkKKyAgICBtb3ZkICAgICAgICAgIG01LCByNGQKKyAgICBtb3ZhICAgICAgICAgIG00LCBbcHdfOF0KKyAgICBtb3ZhICAgICAgICAgIG02LCBbcHdfNF0gICAgOyBtbTYgPSBybmQgPj4gMworICAgIFNQTEFUVyAgICAgICAgbTUsIG01ICAgICAgICA7IG1tNSA9IEIgPSB4CisgICAgcHN1YncgICAgICAgICBtNCwgbTUgICAgICAgIDsgbW00ID0gQSA9IDgteAorCisubmV4dDFkcm93OgorICAgIG1vdnUgICAgICAgICAgbTAsIFtyMSAgIF0gICA7IG1tMCA9IHNyY1swLi43XQorICAgIG1vdnUgICAgICAgICAgbTIsIFtyMStyNl0gICA7IG1tMiA9IHNyY1sxLi44XQorCisgICAgcG11bGx3ICAgICAgICBtMCwgbTQgICAgICAgIDsgbW0wID0gQSAqIHNyY1swLi43XQorICAgIHBtdWxsdyAgICAgICAgbTIsIG01ICAgICAgICA7IG1tMiA9IEIgKiBzcmNbMS4uOF0KKworICAgIHBhZGR3ICAgICAgICAgbTAsIG02CisgICAgcGFkZHcgICAgICAgICBtMCwgbTIKKyAgICBwc3JsdyAgICAgICAgIG0wLCAzCisgICAgQ0hST01BTUNfQVZHICBtMCwgW3IwXQorICAgIG1vdmEgICAgICAgIFtyMF0sIG0wICAgICAgICA7IGRzdFswLi43XSA9IChBICogc3JjWzAuLjddICsgQiAqIHNyY1sxLi44XSArIChybmQgPj4gMykpID4+IDMKKworICAgIGFkZCAgICAgICAgICAgcjAsIHIyCisgICAgYWRkICAgICAgICAgICByMSwgcjIKKyAgICBkZWMgICAgICAgICAgIHIzZAorICAgIGpuZSAubmV4dDFkcm93CisgICAgUkVQX1JFVAorCisueHlfaW50ZXJwb2xhdGlvbjogOyBnZW5lcmFsIGNhc2UsIGJpbGluZWFyCisgICAgbW92ZCAgICAgICAgICBtNCwgcjRtICAgICAgICAgOyB4CisgICAgbW92ZCAgICAgICAgICBtNiwgcjVtICAgICAgICAgOyB5CisKKyAgICBTUExBVFcgICAgICAgIG00LCBtNCAgICAgICAgICA7IG1tNCA9IHggd29yZHMKKyAgICBTUExBVFcgICAgICAgIG02LCBtNiAgICAgICAgICA7IG1tNiA9IHkgd29yZHMKKyAgICBwc2xsdyAgICAgICAgIG01LCBtNCwgMyAgICAgICA7IG1tNSA9IDh4CisgICAgcG11bGx3ICAgICAgICBtNCwgbTYgICAgICAgICAgOyBtbTQgPSB4ICogeQorICAgIHBzbGx3ICAgICAgICAgbTYsIDMgICAgICAgICAgIDsgbW02ID0gOHkKKyAgICBwYWRkdyAgICAgICAgIG0xLCBtNSwgbTYgICAgICA7IG1tNyA9IDh4Kzh5CisgICAgbW92YSAgICAgICAgICBtNywgbTQgICAgICAgICAgOyBERCA9IHggKiB5CisgICAgcHN1YncgICAgICAgICBtNSwgbTQgICAgICAgICAgOyBtbTUgPSBCID0gOHggLSB4eQorICAgIHBzdWJ3ICAgICAgICAgbTYsIG00ICAgICAgICAgIDsgbW02ID0gQyA9IDh5IC0geHkKKyAgICBwYWRkdyAgICAgICAgIG00LCBbcHdfNjRdCisgICAgcHN1YncgICAgICAgICBtNCwgbTEgICAgICAgICAgOyBtbTQgPSBBID0geHkgLSAoOHgrOHkpICsgNjQKKworICAgIG1vdnUgICAgICAgICAgbTAsIFtyMSAgXSAgICAgIDsgbW0wID0gc3JjWzAuLjddCisgICAgbW92dSAgICAgICAgICBtMSwgW3IxKzJdICAgICAgOyBtbTEgPSBzcmNbMS4uOF0KKy5uZXh0MmRyb3c6CisgICAgYWRkICAgICAgICAgICByMSwgcjIKKworICAgIHBtdWxsdyAgICAgICAgbTIsIG0wLCBtNAorICAgIHBtdWxsdyAgICAgICAgbTEsIG01CisgICAgcGFkZHcgICAgICAgICBtMiwgbTEgICAgICAgICAgOyBtbTIgPSBBICogc3JjWzAuLjddICsgQiAqIHNyY1sxLi44XQorCisgICAgbW92dSAgICAgICAgICBtMCwgW3IxXQorICAgIG1vdnUgICAgICAgICAgbTEsIFtyMSsyXQorICAgIHBtdWxsdyAgICAgICAgbTMsIG0wLCBtNgorICAgIHBhZGR3ICAgICAgICAgbTIsIG0zICAgICAgICAgIDsgbW0yICs9IEMgKiBzcmNbMC4uNytzdHJkZV0KKyAgICBwbXVsbHcgICAgICAgIG0zLCBtMSwgbTcKKyAgICBwYWRkdyAgICAgICAgIG0yLCBtMyAgICAgICAgICA7IG1tMiArPSBEICogc3JjWzEuLjgrc3RyZGVdCisKKyAgICBwYWRkdyAgICAgICAgIG0yLCBbcHdfMzJdCisgICAgcHNybHcgICAgICAgICBtMiwgNgorICAgIENIUk9NQU1DX0FWRyAgbTIsIFtyMF0KKyAgICBtb3ZhICAgICAgICBbcjBdLCBtMiAgICAgICAgICA7IGRzdFswLi43XSA9IChtbTIgKyAzMikgPj4gNgorCisgICAgYWRkICAgICAgICAgICByMCwgcjIKKyAgICBkZWMgICAgICAgICAgcjNkCisgICAgam5lIC5uZXh0MmRyb3cKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHV0L2F2Z19oMjY0X2Nocm9tYV9tYzQocGl4ZWwgKmRzdCwgcGl4ZWwgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14LCBpbnQgbXkpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKztUT0RPOiB4bW0gbWM0CislbWFjcm8gTUM0X09QIDIKKyAgICBtb3ZxICAgICAgICAgICUxLCBbcjEgIF0KKyAgICBtb3ZxICAgICAgICAgIG0xLCBbcjErMl0KKyAgICBhZGQgICAgICAgICAgIHIxLCByMgorICAgIHBtdWxsdyAgICAgICAgJTEsIG00CisgICAgcG11bGx3ICAgICAgICBtMSwgbTIKKyAgICBwYWRkdyAgICAgICAgIG0xLCAlMQorICAgIG1vdmEgICAgICAgICAgJTEsIG0xCisKKyAgICBwbXVsbHcgICAgICAgICUyLCBtNQorICAgIHBtdWxsdyAgICAgICAgbTEsIG0zCisgICAgcGFkZHcgICAgICAgICAlMiwgW3B3XzMyXQorICAgIHBhZGR3ICAgICAgICAgbTEsICUyCisgICAgcHNybHcgICAgICAgICBtMSwgNgorICAgIENIUk9NQU1DX0FWRyAgbTEsICUyLCBbcjBdCisgICAgbW92cSAgICAgICAgW3IwXSwgbTEKKyAgICBhZGQgICAgICAgICAgIHIwLCByMgorJWVuZG1hY3JvCisKKyVtYWNybyBDSFJPTUFfTUM0IDEKK2NnbG9iYWwgJTFfaDI2NF9jaHJvbWFfbWM0XzEwLCA2LDYsNworICAgIG1vdnN4ZGlmbmlkbiAgcjIsIHIyZAorICAgIG1vdmQgICAgICAgICAgbTIsIHI0bSAgICAgICAgIDsgeAorICAgIG1vdmQgICAgICAgICAgbTMsIHI1bSAgICAgICAgIDsgeQorICAgIG1vdmEgICAgICAgICAgbTQsIFtwd184XQorICAgIG1vdmEgICAgICAgICAgbTUsIG00CisgICAgU1BMQVRXICAgICAgICBtMiwgbTIKKyAgICBTUExBVFcgICAgICAgIG0zLCBtMworICAgIHBzdWJ3ICAgICAgICAgbTQsIG0yCisgICAgcHN1YncgICAgICAgICBtNSwgbTMKKworICAgIG1vdnEgICAgICAgICAgbTAsIFtyMSAgXQorICAgIG1vdnEgICAgICAgICAgbTYsIFtyMSsyXQorICAgIGFkZCAgICAgICAgICAgcjEsIHIyCisgICAgcG11bGx3ICAgICAgICBtMCwgbTQKKyAgICBwbXVsbHcgICAgICAgIG02LCBtMgorICAgIHBhZGR3ICAgICAgICAgbTYsIG0wCisKKy5uZXh0MnJvd3M6CisgICAgTUM0X09QIG0wLCBtNgorICAgIE1DNF9PUCBtNiwgbTAKKyAgICBzdWIgICByM2QsIDIKKyAgICBqbnogLm5leHQycm93cworICAgIFJFUF9SRVQKKyVlbmRtYWNybworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wdXQvYXZnX2gyNjRfY2hyb21hX21jMihwaXhlbCAqZHN0LCBwaXhlbCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXgsIGludCBteSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIENIUk9NQV9NQzIgMQorY2dsb2JhbCAlMV9oMjY0X2Nocm9tYV9tYzJfMTAsIDYsNworICAgIG1vdnN4ZGlmbmlkbiAgcjIsIHIyZAorICAgIG1vdiAgICAgICAgICByNmQsIHI0ZAorICAgIHNobCAgICAgICAgICByNGQsIDE2CisgICAgc3ViICAgICAgICAgIHI0ZCwgcjZkCisgICAgYWRkICAgICAgICAgIHI0ZCwgOAorICAgIGltdWwgICAgICAgICByNWQsIHI0ZCAgICAgICAgIDsgeCp5PDwxNiB8IHkqKDgteCkKKyAgICBzaGwgICAgICAgICAgcjRkLCAzCisgICAgc3ViICAgICAgICAgIHI0ZCwgcjVkICAgICAgICAgOyB4Kig4LXkpPDwxNiB8ICg4LXgpKig4LXkpCisKKyAgICBtb3ZkICAgICAgICAgIG01LCByNGQKKyAgICBtb3ZkICAgICAgICAgIG02LCByNWQKKyAgICBwdW5wY2tsZHEgICAgIG01LCBtNSAgICAgICAgICA7IG1tNSA9IHtBLEIsQSxCfQorICAgIHB1bnBja2xkcSAgICAgbTYsIG02ICAgICAgICAgIDsgbW02ID0ge0MsRCxDLER9CisgICAgcHhvciAgICAgICAgICBtNywgbTcKKyAgICBwc2h1ZncgICAgICAgIG0yLCBbcjFdLCAweDk0ICAgIDsgbW0wID0gc3JjWzAsMSwxLDJdCisKKy5uZXh0cm93OgorICAgIGFkZCAgICAgICAgICAgcjEsIHIyCisgICAgbW92cSAgICAgICAgICBtMSwgbTIKKyAgICBwbWFkZHdkICAgICAgIG0xLCBtNSAgICAgICAgICA7IG1tMSA9IEEgKiBzcmNbMCwxXSArIEIgKiBzcmNbMSwyXQorICAgIHBzaHVmdyAgICAgICAgbTAsIFtyMV0sIDB4OTQgICAgOyBtbTAgPSBzcmNbMCwxLDEsMl0KKyAgICBtb3ZxICAgICAgICAgIG0yLCBtMAorICAgIHBtYWRkd2QgICAgICAgbTAsIG02CisgICAgcGFkZHcgICAgICAgICBtMSwgW3B3XzMyXQorICAgIHBhZGR3ICAgICAgICAgbTEsIG0wICAgICAgICAgIDsgbW0xICs9IEMgKiBzcmNbMCwxXSArIEQgKiBzcmNbMSwyXQorICAgIHBzcmx3ICAgICAgICAgbTEsIDYKKyAgICBwYWNrc3NkdyAgICAgIG0xLCBtNworICAgIENIUk9NQU1DX0FWRyAgbTEsIG0zLCBbcjBdCisgICAgbW92ZCAgICAgICAgW3IwXSwgbTEKKyAgICBhZGQgICAgICAgICAgIHIwLCByMgorICAgIGRlYyAgICAgICAgICByM2QKKyAgICBqbnogLm5leHRyb3cKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworJW1hY3JvIE5PVEhJTkcgMi0zCislZW5kbWFjcm8KKyVtYWNybyBBVkcgMi0zCislaWYgJTA9PTMKKyAgICBtb3ZxICAgICAgICAgICUyLCAlMworJWVuZGlmCisgICAgcGF2Z3cgICAgICAgICAlMSwgJTIKKyVlbmRtYWNybworCislZGVmaW5lIENIUk9NQU1DX0FWRyAgTk9USElORworSU5JVF9YTU0gc3NlMgorQ0hST01BX01DOCBwdXQKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitDSFJPTUFfTUM4IHB1dAorJWVuZGlmCitJTklUX01NWCBtbXhleHQKK0NIUk9NQV9NQzQgcHV0CitDSFJPTUFfTUMyIHB1dAorCislZGVmaW5lIENIUk9NQU1DX0FWRyAgQVZHCitJTklUX1hNTSBzc2UyCitDSFJPTUFfTUM4IGF2ZworJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0NIUk9NQV9NQzggYXZnCislZW5kaWYKK0lOSVRfTU1YIG1teGV4dAorQ0hST01BX01DNCBhdmcKK0NIUk9NQV9NQzIgYXZnCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NF9kZWJsb2NrLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X2RlYmxvY2suYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YzgyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NF9kZWJsb2NrLmFzbQpAQCAtMCwwICsxLDEwODQgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogTU1YL1NTRTIvQVZYLW9wdGltaXplZCBILjI2NCBkZWJsb2NraW5nIGNvZGUKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTEgeDI2NCBwcm9qZWN0Cis7KgorOyogQXV0aG9yczogTG9yZW4gTWVycml0dCA8bG9yZW5tQHUud2FzaGluZ3Rvbi5lZHU+Cis7KiAgICAgICAgICBGaW9uYSBHbGFzZXIgPGZpb25hQHgyNjQuY29tPgorOyogICAgICAgICAgT3NrYXIgQXJ2aWRzc29uIDxvc2thckBpcm9jay5zZT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorCitwYl9BMTogdGltZXMgMTYgZGIgMHhBMQorcGJfM18xOiB0aW1lcyA0IGRiIDMsIDEKKworU0VDVElPTiAudGV4dAorCitjZXh0ZXJuIHBiXzAKK2NleHRlcm4gcGJfMQorY2V4dGVybiBwYl8zCisKKzsgZXhwYW5kcyB0byBbYmFzZV0sLi4uLFtiYXNlKzcqc3RyaWRlXQorJWRlZmluZSBQQVNTOFJPV1MoYmFzZSwgYmFzZTMsIHN0cmlkZSwgc3RyaWRlMykgXAorICAgIFtiYXNlXSwgW2Jhc2Urc3RyaWRlXSwgW2Jhc2Urc3RyaWRlKjJdLCBbYmFzZTNdLCBcCisgICAgW2Jhc2UzK3N0cmlkZV0sIFtiYXNlMytzdHJpZGUqMl0sIFtiYXNlMytzdHJpZGUzXSwgW2Jhc2UzK3N0cmlkZSo0XQorCislZGVmaW5lIFBBU1M4Uk9XUyhiYXNlLCBiYXNlMywgc3RyaWRlLCBzdHJpZGUzLCBvZmZzZXQpIFwKKyAgICBQQVNTOFJPV1MoYmFzZStvZmZzZXQsIGJhc2UzK29mZnNldCwgc3RyaWRlLCBzdHJpZGUzKQorCis7IGluOiA4IHJvd3Mgb2YgNCBieXRlcyBpbiAlNC4uJTExCis7IG91dDogNCByb3dzIG9mIDggYnl0ZXMgaW4gbTAuLm0zCislbWFjcm8gVFJBTlNQT1NFNHg4X0xPQUQgMTEKKyAgICBtb3ZoICAgICAgIG0wLCAlNAorICAgIG1vdmggICAgICAgbTIsICU1CisgICAgbW92aCAgICAgICBtMSwgJTYKKyAgICBtb3ZoICAgICAgIG0zLCAlNworICAgIHB1bnBja2wlMSAgbTAsIG0yCisgICAgcHVucGNrbCUxICBtMSwgbTMKKyAgICBtb3ZhICAgICAgIG0yLCBtMAorICAgIHB1bnBja2wlMiAgbTAsIG0xCisgICAgcHVucGNraCUyICBtMiwgbTEKKworICAgIG1vdmggICAgICAgbTQsICU4CisgICAgbW92aCAgICAgICBtNiwgJTkKKyAgICBtb3ZoICAgICAgIG01LCAlMTAKKyAgICBtb3ZoICAgICAgIG03LCAlMTEKKyAgICBwdW5wY2tsJTEgIG00LCBtNgorICAgIHB1bnBja2wlMSAgbTUsIG03CisgICAgbW92YSAgICAgICBtNiwgbTQKKyAgICBwdW5wY2tsJTIgIG00LCBtNQorICAgIHB1bnBja2glMiAgbTYsIG01CisKKyAgICBwdW5wY2toJTMgIG0xLCBtMCwgbTQKKyAgICBwdW5wY2toJTMgIG0zLCBtMiwgbTYKKyAgICBwdW5wY2tsJTMgIG0wLCBtNAorICAgIHB1bnBja2wlMyAgbTIsIG02CislZW5kbWFjcm8KKworOyBpbjogNCByb3dzIG9mIDggYnl0ZXMgaW4gbTAuLm0zCis7IG91dDogOCByb3dzIG9mIDQgYnl0ZXMgaW4gJTEuLiU4CislbWFjcm8gVFJBTlNQT1NFOHg0Ql9TVE9SRSA4CisgICAgcHVucGNraGRxICBtNCwgbTAsIG0wCisgICAgcHVucGNraGRxICBtNSwgbTEsIG0xCisgICAgcHVucGNraGRxICBtNiwgbTIsIG0yCisKKyAgICBwdW5wY2tsYncgIG0wLCBtMQorICAgIHB1bnBja2xidyAgbTIsIG0zCisgICAgcHVucGNrbHdkICBtMSwgbTAsIG0yCisgICAgcHVucGNraHdkICBtMCwgbTIKKyAgICBtb3ZoICAgICAgICUxLCBtMQorICAgIHB1bnBja2hkcSAgbTEsIG0xCisgICAgbW92aCAgICAgICAlMiwgbTEKKyAgICBtb3ZoICAgICAgICUzLCBtMAorICAgIHB1bnBja2hkcSAgbTAsIG0wCisgICAgbW92aCAgICAgICAlNCwgbTAKKworICAgIHB1bnBja2hkcSAgbTMsIG0zCisgICAgcHVucGNrbGJ3ICBtNCwgbTUKKyAgICBwdW5wY2tsYncgIG02LCBtMworICAgIHB1bnBja2x3ZCAgbTUsIG00LCBtNgorICAgIHB1bnBja2h3ZCAgbTQsIG02CisgICAgbW92aCAgICAgICAlNSwgbTUKKyAgICBwdW5wY2toZHEgIG01LCBtNQorICAgIG1vdmggICAgICAgJTYsIG01CisgICAgbW92aCAgICAgICAlNywgbTQKKyAgICBwdW5wY2toZHEgIG00LCBtNAorICAgIG1vdmggICAgICAgJTgsIG00CislZW5kbWFjcm8KKworJW1hY3JvIFRSQU5TUE9TRTR4OEJfTE9BRCA4CisgICAgVFJBTlNQT1NFNHg4X0xPQUQgYncsIHdkLCBkcSwgJTEsICUyLCAlMywgJTQsICU1LCAlNiwgJTcsICU4CislZW5kbWFjcm8KKworJW1hY3JvIFNCVVRURVJGTFkzIDQKKyAgICBwdW5wY2toJTEgICU0LCAlMiwgJTMKKyAgICBwdW5wY2tsJTEgICUyLCAlMworJWVuZG1hY3JvCisKKzsgaW46IDggcm93cyBvZiA4IChvbmx5IHRoZSBtaWRkbGUgNiBwZWxzIGFyZSB1c2VkKSBpbiAlMS4uJTgKKzsgb3V0OiA2IHJvd3Mgb2YgOCBpbiBbJTkrMCoxNl0gLi4gWyU5KzUqMTZdCislbWFjcm8gVFJBTlNQT1NFNng4X01FTSA5CisgICAgUkVTRVRfTU1fUEVSTVVUQVRJT04KKyAgICBtb3ZxICBtMCwgJTEKKyAgICBtb3ZxICBtMSwgJTIKKyAgICBtb3ZxICBtMiwgJTMKKyAgICBtb3ZxICBtMywgJTQKKyAgICBtb3ZxICBtNCwgJTUKKyAgICBtb3ZxICBtNSwgJTYKKyAgICBtb3ZxICBtNiwgJTcKKyAgICBTQlVUVEVSRkxZIGJ3LCAwLCAxLCA3CisgICAgU0JVVFRFUkZMWSBidywgMiwgMywgNworICAgIFNCVVRURVJGTFkgYncsIDQsIDUsIDcKKyAgICBtb3ZxICBbJTkrMHgxMF0sIG0zCisgICAgU0JVVFRFUkZMWTMgYncsIG02LCAlOCwgbTcKKyAgICBTQlVUVEVSRkxZIHdkLCAwLCAyLCAzCisgICAgU0JVVFRFUkZMWSB3ZCwgNCwgNiwgMworICAgIHB1bnBja2hkcSBtMCwgbTQKKyAgICBtb3ZxICBbJTkrMHgwMF0sIG0wCisgICAgU0JVVFRFUkZMWTMgd2QsIG0xLCBbJTkrMHgxMF0sIG0zCisgICAgU0JVVFRFUkZMWSB3ZCwgNSwgNywgMAorICAgIFNCVVRURVJGTFkgZHEsIDEsIDUsIDAKKyAgICBTQlVUVEVSRkxZIGRxLCAyLCA2LCAwCisgICAgcHVucGNrbGRxIG0zLCBtNworICAgIG1vdnEgIFslOSsweDEwXSwgbTIKKyAgICBtb3ZxICBbJTkrMHgyMF0sIG02CisgICAgbW92cSAgWyU5KzB4MzBdLCBtMQorICAgIG1vdnEgIFslOSsweDQwXSwgbTUKKyAgICBtb3ZxICBbJTkrMHg1MF0sIG0zCisgICAgUkVTRVRfTU1fUEVSTVVUQVRJT04KKyVlbmRtYWNybworCis7IGluOiA4IHJvd3Mgb2YgOCBpbiAlMS4uJTgKKzsgb3V0OiA4IHJvd3Mgb2YgOCBpbiAlOS4uJTE2CislbWFjcm8gVFJBTlNQT1NFOHg4X01FTSAxNgorICAgIFJFU0VUX01NX1BFUk1VVEFUSU9OCisgICAgbW92cSAgbTAsICUxCisgICAgbW92cSAgbTEsICUyCisgICAgbW92cSAgbTIsICUzCisgICAgbW92cSAgbTMsICU0CisgICAgbW92cSAgbTQsICU1CisgICAgbW92cSAgbTUsICU2CisgICAgbW92cSAgbTYsICU3CisgICAgU0JVVFRFUkZMWSBidywgMCwgMSwgNworICAgIFNCVVRURVJGTFkgYncsIDIsIDMsIDcKKyAgICBTQlVUVEVSRkxZIGJ3LCA0LCA1LCA3CisgICAgU0JVVFRFUkZMWTMgYncsIG02LCAlOCwgbTcKKyAgICBtb3ZxICAlOSwgIG01CisgICAgU0JVVFRFUkZMWSB3ZCwgMCwgMiwgNQorICAgIFNCVVRURVJGTFkgd2QsIDQsIDYsIDUKKyAgICBTQlVUVEVSRkxZIHdkLCAxLCAzLCA1CisgICAgbW92cSAgJTExLCBtNgorICAgIG1vdnEgIG02LCAgJTkKKyAgICBTQlVUVEVSRkxZIHdkLCA2LCA3LCA1CisgICAgU0JVVFRFUkZMWSBkcSwgMCwgNCwgNQorICAgIFNCVVRURVJGTFkgZHEsIDEsIDYsIDUKKyAgICBtb3ZxICAlOSwgIG0wCisgICAgbW92cSAgJTEwLCBtNAorICAgIG1vdnEgICUxMywgbTEKKyAgICBtb3ZxICAlMTQsIG02CisgICAgU0JVVFRFUkZMWTMgZHEsIG0yLCAlMTEsIG0wCisgICAgU0JVVFRFUkZMWSBkcSwgMywgNywgNAorICAgIG1vdnEgICUxMSwgbTIKKyAgICBtb3ZxICAlMTIsIG0wCisgICAgbW92cSAgJTE1LCBtMworICAgIG1vdnEgICUxNiwgbTcKKyAgICBSRVNFVF9NTV9QRVJNVVRBVElPTgorJWVuZG1hY3JvCisKKzsgb3V0OiAlNCA9IHwlMS0lMnw+JTMKKzsgY2xvYmJlcnM6ICU1CislbWFjcm8gRElGRl9HVCA1CislaWYgYXZ4X2VuYWJsZWQgPT0gMAorICAgIG1vdmEgICAgJTUsICUyCisgICAgbW92YSAgICAlNCwgJTEKKyAgICBwc3VidXNiICU1LCAlMQorICAgIHBzdWJ1c2IgJTQsICUyCislZWxzZQorICAgIHBzdWJ1c2IgJTUsICUyLCAlMQorICAgIHBzdWJ1c2IgJTQsICUxLCAlMgorJWVuZGlmCisgICAgcG9yICAgICAlNCwgJTUKKyAgICBwc3VidXNiICU0LCAlMworJWVuZG1hY3JvCisKKzsgb3V0OiAlNCA9IHwlMS0lMnw+JTMKKzsgY2xvYmJlcnM6ICU1CislbWFjcm8gRElGRl9HVDIgNQorJWlmIEFSQ0hfWDg2XzY0CisgICAgcHN1YnVzYiAlNSwgJTIsICUxCisgICAgcHN1YnVzYiAlNCwgJTEsICUyCislZWxzZQorICAgIG1vdmEgICAgJTUsICUyCisgICAgbW92YSAgICAlNCwgJTEKKyAgICBwc3VidXNiICU1LCAlMQorICAgIHBzdWJ1c2IgJTQsICUyCislZW5kaWYKKyAgICBwc3VidXNiICU1LCAlMworICAgIHBzdWJ1c2IgJTQsICUzCisgICAgcGNtcGVxYiAlNCwgJTUKKyVlbmRtYWNybworCis7IGluOiBtMD1wMSBtMT1wMCBtMj1xMCBtMz1xMSAlMT1hbHBoYS0xICUyPWJldGEtMQorOyBvdXQ6IG01PWJldGEtMSwgbTc9bWFzaywgJTM9YWxwaGEtMQorOyBjbG9iYmVyczogbTQsbTYKKyVtYWNybyBMT0FEX01BU0sgMi0zCisgICAgbW92ZCAgICAgbTQsICUxCisgICAgbW92ZCAgICAgbTUsICUyCisgICAgU1BMQVRXICAgbTQsIG00CisgICAgU1BMQVRXICAgbTUsIG01CisgICAgcGFja3Vzd2IgbTQsIG00ICA7IDE2eCBhbHBoYS0xCisgICAgcGFja3Vzd2IgbTUsIG01ICA7IDE2eCBiZXRhLTEKKyVpZiAlMD4yCisgICAgbW92YSAgICAgJTMsIG00CislZW5kaWYKKyAgICBESUZGX0dUICBtMSwgbTIsIG00LCBtNywgbTYgOyB8cDAtcTB8ID4gYWxwaGEtMQorICAgIERJRkZfR1QgIG0wLCBtMSwgbTUsIG00LCBtNiA7IHxwMS1wMHwgPiBiZXRhLTEKKyAgICBwb3IgICAgICBtNywgbTQKKyAgICBESUZGX0dUICBtMywgbTIsIG01LCBtNCwgbTYgOyB8cTEtcTB8ID4gYmV0YS0xCisgICAgcG9yICAgICAgbTcsIG00CisgICAgcHhvciAgICAgbTYsIG02CisgICAgcGNtcGVxYiAgbTcsIG02CislZW5kbWFjcm8KKworOyBpbjogbTA9cDEgbTE9cDAgbTI9cTAgbTM9cTEgbTc9KHRjJm1hc2spCis7IG91dDogbTE9cDAnIG0yPXEwJworOyBjbG9iYmVyczogbTAsMy02CislbWFjcm8gREVCTE9DS19QMF9RMCAwCisgICAgcGNtcGVxYiBtNCwgbTQKKyAgICBweG9yICAgIG01LCBtMSwgbTIgICA7IHAwXnEwCisgICAgcHhvciAgICBtMywgbTQKKyAgICBwYW5kICAgIG01LCBbcGJfMV0gICA7IChwMF5xMCkmMQorICAgIHBhdmdiICAgbTMsIG0wICAgICAgIDsgKHAxIC0gcTEgKyAyNTYpPj4xCisgICAgcHhvciAgICBtNCwgbTEKKyAgICBwYXZnYiAgIG0zLCBbcGJfM10gICA7ICgoKHAxIC0gcTEgKyAyNTYpPj4xKSs0KT4+MSA9IDY0KzIrKHAxLXExKT4+MgorICAgIHBhdmdiICAgbTQsIG0yICAgICAgIDsgKHEwIC0gcDAgKyAyNTYpPj4xCisgICAgcGF2Z2IgICBtMywgbTUKKyAgICBtb3ZhICAgIG02LCBbcGJfQTFdCisgICAgcGFkZHVzYiBtMywgbTQgICAgICAgOyBkKzEyOCszMworICAgIHBzdWJ1c2IgbTYsIG0zCisgICAgcHN1YnVzYiBtMywgW3BiX0ExXQorICAgIHBtaW51YiAgbTYsIG03CisgICAgcG1pbnViICBtMywgbTcKKyAgICBwc3VidXNiIG0xLCBtNgorICAgIHBzdWJ1c2IgbTIsIG0zCisgICAgcGFkZHVzYiBtMSwgbTMKKyAgICBwYWRkdXNiIG0yLCBtNgorJWVuZG1hY3JvCisKKzsgaW46IG0xPXAwIG0yPXEwCis7ICAgICAlMT1wMSAlMj1xMiAlMz1bcTJdICU0PVtxMV0gJTU9dGMwICU2PXRtcAorOyBvdXQ6IFtxMV0gPSBjbGlwKCAocTIrKChwMCtxMCsxKT4+MSkpPj4xLCBxMS10YzAsIHExK3RjMCApCis7IGNsb2JiZXJzOiBxMiwgdG1wLCB0YzAKKyVtYWNybyBMVU1BX1ExIDYKKyAgICBwYXZnYiAgICU2LCBtMSwgbTIKKyAgICBwYXZnYiAgICUyLCAlNiAgICAgICA7IGF2ZyhwMixhdmcocDAscTApKQorICAgIHB4b3IgICAgJTYsICUzCisgICAgcGFuZCAgICAlNiwgW3BiXzFdICAgOyAocDJeYXZnKHAwLHEwKSkmMQorICAgIHBzdWJ1c2IgJTIsICU2ICAgICAgIDsgKHAyKygocDArcTArMSk+PjEpKT4+MQorICAgIHBzdWJ1c2IgJTYsICUxLCAlNQorICAgIHBhZGR1c2IgJTUsICUxCisgICAgcG1heHViICAlMiwgJTYKKyAgICBwbWludWIgICUyLCAlNQorICAgIG1vdmEgICAgJTQsICUyCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzY0Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9kZWJsb2NrX3ZfbHVtYSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICp0YzApCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBERUJMT0NLX0xVTUEgMAorY2dsb2JhbCBkZWJsb2NrX3ZfbHVtYV84LCA1LDUsMTAKKyAgICBtb3ZkICAgIG04LCBbcjRdIDsgdGMwCisgICAgbGVhICAgICByNCwgW3IxKjNdCisgICAgZGVjICAgICByMmQgICAgICAgIDsgYWxwaGEtMQorICAgIG5lZyAgICAgcjQKKyAgICBkZWMgICAgIHIzZCAgICAgICAgOyBiZXRhLTEKKyAgICBhZGQgICAgIHI0LCByMCAgICAgOyBwaXgtMypzdHJpZGUKKworICAgIG1vdmEgICAgbTAsIFtyNCtyMV0gICA7IHAxCisgICAgbW92YSAgICBtMSwgW3I0KzIqcjFdIDsgcDAKKyAgICBtb3ZhICAgIG0yLCBbcjBdICAgICAgOyBxMAorICAgIG1vdmEgICAgbTMsIFtyMCtyMV0gICA7IHExCisgICAgTE9BRF9NQVNLIHIyZCwgcjNkCisKKyAgICBwdW5wY2tsYncgbTgsIG04CisgICAgcHVucGNrbGJ3IG04LCBtOCA7IHRjID0gNHggdGMwWzNdLCA0eCB0YzBbMl0sIDR4IHRjMFsxXSwgNHggdGMwWzBdCisgICAgcGNtcGVxYiBtOSwgbTkKKyAgICBwY21wZXFiIG05LCBtOAorICAgIHBhbmRuICAgbTksIG03CisgICAgcGFuZCAgICBtOCwgbTkKKworICAgIG1vdmRxYSAgbTMsIFtyNF0gOyBwMgorICAgIERJRkZfR1QyIG0xLCBtMywgbTUsIG02LCBtNyA7IHxwMi1wMHwgPiBiZXRhLTEKKyAgICBwYW5kICAgIG02LCBtOQorICAgIHBzdWJiICAgbTcsIG04LCBtNgorICAgIHBhbmQgICAgbTYsIG04CisgICAgTFVNQV9RMSBtMCwgbTMsIFtyNF0sIFtyNCtyMV0sIG02LCBtNAorCisgICAgbW92ZHFhICBtNCwgW3IwKzIqcjFdIDsgcTIKKyAgICBESUZGX0dUMiBtMiwgbTQsIG01LCBtNiwgbTMgOyB8cTItcTB8ID4gYmV0YS0xCisgICAgcGFuZCAgICBtNiwgbTkKKyAgICBwYW5kICAgIG04LCBtNgorICAgIHBzdWJiICAgbTcsIG02CisgICAgbW92YSAgICBtMywgW3IwK3IxXQorICAgIExVTUFfUTEgbTMsIG00LCBbcjArMipyMV0sIFtyMCtyMV0sIG04LCBtNgorCisgICAgREVCTE9DS19QMF9RMAorICAgIG1vdmEgICAgW3I0KzIqcjFdLCBtMQorICAgIG1vdmEgICAgW3IwXSwgbTIKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZGVibG9ja19oX2x1bWEodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLAorOyAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqdGMwKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJTklUX01NWCBjcHVuYW1lCitjZ2xvYmFsIGRlYmxvY2tfaF9sdW1hXzgsIDUsOSwwLDB4NjArMTYqV0lONjQKKyAgICBtb3ZzeGQgcjcsICByMWQKKyAgICBsZWEgICAgcjgsICBbcjcrcjcqMl0KKyAgICBsZWEgICAgcjYsICBbcjAtNF0KKyAgICBsZWEgICAgcjUsICBbcjAtNCtyOF0KKyVpZiBXSU42NAorICAgICVkZWZpbmUgcGl4X3RtcCByc3ArMHgzMCA7IHNoYWRvdyBzcGFjZSArIHI0CislZWxzZQorICAgICVkZWZpbmUgcGl4X3RtcCByc3AKKyVlbmRpZgorCisgICAgOyB0cmFuc3Bvc2UgNngxNiAtPiB0bXAgc3BhY2UKKyAgICBUUkFOU1BPU0U2eDhfTUVNICBQQVNTOFJPV1MocjYsIHI1LCByNywgcjgpLCBwaXhfdG1wCisgICAgbGVhICAgIHI2LCBbcjYrcjcqOF0KKyAgICBsZWEgICAgcjUsIFtyNStyNyo4XQorICAgIFRSQU5TUE9TRTZ4OF9NRU0gIFBBU1M4Uk9XUyhyNiwgcjUsIHI3LCByOCksIHBpeF90bXArOAorCisgICAgOyB2ZXJ0aWNhbCBmaWx0ZXIKKyAgICA7IGFscGhhLCBiZXRhLCB0YzAgYXJlIHN0aWxsIGluIHIyZCwgcjNkLCByNAorICAgIDsgZG9uJ3QgYmFja3VwIHI2LCByNSwgcjcsIHI4IGJlY2F1c2UgZGVibG9ja192X2x1bWFfc3NlMiBkb2Vzbid0IHVzZSB0aGVtCisgICAgbGVhICAgIHIwLCBbcGl4X3RtcCsweDMwXQorICAgIG1vdiAgICByMWQsIDB4MTAKKyVpZiBXSU42NAorICAgIG1vdiAgICBbcnNwKzB4MjBdLCByNAorJWVuZGlmCisgICAgY2FsbCAgIGRlYmxvY2tfdl9sdW1hXzgKKworICAgIDsgdHJhbnNwb3NlIDE2eDQgLT4gb3JpZ2luYWwgc3BhY2UgIChvbmx5IHRoZSBtaWRkbGUgNCByb3dzIHdlcmUgY2hhbmdlZCBieSB0aGUgZmlsdGVyKQorICAgIGFkZCAgICByNiwgMgorICAgIGFkZCAgICByNSwgMgorICAgIG1vdnEgICBtMCwgW3BpeF90bXArMHgxOF0KKyAgICBtb3ZxICAgbTEsIFtwaXhfdG1wKzB4MjhdCisgICAgbW92cSAgIG0yLCBbcGl4X3RtcCsweDM4XQorICAgIG1vdnEgICBtMywgW3BpeF90bXArMHg0OF0KKyAgICBUUkFOU1BPU0U4eDRCX1NUT1JFICBQQVNTOFJPV1MocjYsIHI1LCByNywgcjgpCisKKyAgICBzaGwgICAgcjcsICAzCisgICAgc3ViICAgIHI2LCAgcjcKKyAgICBzdWIgICAgcjUsICByNworICAgIHNociAgICByNywgIDMKKyAgICBtb3ZxICAgbTAsIFtwaXhfdG1wKzB4MTBdCisgICAgbW92cSAgIG0xLCBbcGl4X3RtcCsweDIwXQorICAgIG1vdnEgICBtMiwgW3BpeF90bXArMHgzMF0KKyAgICBtb3ZxICAgbTMsIFtwaXhfdG1wKzB4NDBdCisgICAgVFJBTlNQT1NFOHg0Ql9TVE9SRSAgUEFTUzhST1dTKHI2LCByNSwgcjcsIHI4KQorCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorREVCTE9DS19MVU1BCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorREVCTE9DS19MVU1BCislZW5kaWYKKworJWVsc2UKKworJW1hY3JvIERFQkxPQ0tfTFVNQSAyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9kZWJsb2NrX3Y4X2x1bWEodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnRjMCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2dsb2JhbCBkZWJsb2NrXyUxX2x1bWFfOCwgNSw1LDgsMiolMgorICAgIGxlYSAgICAgcjQsIFtyMSozXQorICAgIGRlYyAgICAgcjIgICAgIDsgYWxwaGEtMQorICAgIG5lZyAgICAgcjQKKyAgICBkZWMgICAgIHIzICAgICA7IGJldGEtMQorICAgIGFkZCAgICAgcjQsIHIwIDsgcGl4LTMqc3RyaWRlCisKKyAgICBtb3ZhICAgIG0wLCBbcjQrcjFdICAgOyBwMQorICAgIG1vdmEgICAgbTEsIFtyNCsyKnIxXSA7IHAwCisgICAgbW92YSAgICBtMiwgW3IwXSAgICAgIDsgcTAKKyAgICBtb3ZhICAgIG0zLCBbcjArcjFdICAgOyBxMQorICAgIExPQURfTUFTSyByMiwgcjMKKworICAgIG1vdiAgICAgcjMsIHI0bXAKKyAgICBwY21wZXFiIG0zLCBtMworICAgIG1vdmQgICAgbTQsIFtyM10gOyB0YzAKKyAgICBwdW5wY2tsYncgbTQsIG00CisgICAgcHVucGNrbGJ3IG00LCBtNCA7IHRjID0gNHggdGMwWzNdLCA0eCB0YzBbMl0sIDR4IHRjMFsxXSwgNHggdGMwWzBdCisgICAgbW92YSAgIFtlc3ArJTJdLCBtNCA7IHRjCisgICAgcGNtcGd0YiBtNCwgbTMKKyAgICBtb3ZhICAgIG0zLCBbcjRdIDsgcDIKKyAgICBwYW5kICAgIG00LCBtNworICAgIG1vdmEgICBbZXNwXSwgbTQgOyBtYXNrCisKKyAgICBESUZGX0dUMiBtMSwgbTMsIG01LCBtNiwgbTcgOyB8cDItcDB8ID4gYmV0YS0xCisgICAgcGFuZCAgICBtNiwgbTQKKyAgICBwYW5kICAgIG00LCBbZXNwKyUyXSA7IHRjCisgICAgcHN1YmIgICBtNywgbTQsIG02CisgICAgcGFuZCAgICBtNiwgbTQKKyAgICBMVU1BX1ExIG0wLCBtMywgW3I0XSwgW3I0K3IxXSwgbTYsIG00CisKKyAgICBtb3ZhICAgIG00LCBbcjArMipyMV0gOyBxMgorICAgIERJRkZfR1QyIG0yLCBtNCwgbTUsIG02LCBtMyA7IHxxMi1xMHwgPiBiZXRhLTEKKyAgICBwYW5kICAgIG02LCBbZXNwXSA7IG1hc2sKKyAgICBtb3ZhICAgIG01LCBbZXNwKyUyXSA7IHRjCisgICAgcHN1YmIgICBtNywgbTYKKyAgICBwYW5kICAgIG01LCBtNgorICAgIG1vdmEgICAgbTMsIFtyMCtyMV0KKyAgICBMVU1BX1ExIG0zLCBtNCwgW3IwKzIqcjFdLCBbcjArcjFdLCBtNSwgbTYKKworICAgIERFQkxPQ0tfUDBfUTAKKyAgICBtb3ZhICAgIFtyNCsyKnIxXSwgbTEKKyAgICBtb3ZhICAgIFtyMF0sIG0yCisgICAgUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2RlYmxvY2tfaF9sdW1hKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwKKzsgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnRjMCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSU5JVF9NTVggY3B1bmFtZQorY2dsb2JhbCBkZWJsb2NrX2hfbHVtYV84LCAwLDUsOCwweDYwK0hBVkVfQUxJR05FRF9TVEFDSyoxMgorICAgIG1vdiAgICByMCwgcjBtcAorICAgIG1vdiAgICByMywgcjFtCisgICAgbGVhICAgIHI0LCBbcjMqM10KKyAgICBzdWIgICAgcjAsIDQKKyAgICBsZWEgICAgcjEsIFtyMCtyNF0KKyVkZWZpbmUgcGl4X3RtcCBlc3ArMTIqSEFWRV9BTElHTkVEX1NUQUNLCisKKyAgICA7IHRyYW5zcG9zZSA2eDE2IC0+IHRtcCBzcGFjZQorICAgIFRSQU5TUE9TRTZ4OF9NRU0gIFBBU1M4Uk9XUyhyMCwgcjEsIHIzLCByNCksIHBpeF90bXAKKyAgICBsZWEgICAgcjAsIFtyMCtyMyo4XQorICAgIGxlYSAgICByMSwgW3IxK3IzKjhdCisgICAgVFJBTlNQT1NFNng4X01FTSAgUEFTUzhST1dTKHIwLCByMSwgcjMsIHI0KSwgcGl4X3RtcCs4CisKKyAgICA7IHZlcnRpY2FsIGZpbHRlcgorICAgIGxlYSAgICByMCwgW3BpeF90bXArMHgzMF0KKyAgICBQVVNIICAgZHdvcmQgcjRtCisgICAgUFVTSCAgIGR3b3JkIHIzbQorICAgIFBVU0ggICBkd29yZCByMm0KKyAgICBQVVNIICAgZHdvcmQgMTYKKyAgICBQVVNIICAgZHdvcmQgcjAKKyAgICBjYWxsICAgZGVibG9ja18lMV9sdW1hXzgKKyVpZmlkbiAlMSwgdjgKKyAgICBhZGQgICAgZHdvcmQgW2VzcCAgIF0sIDggOyBwaXhfdG1wKzB4MzgKKyAgICBhZGQgICAgZHdvcmQgW2VzcCsxNl0sIDIgOyB0YzArMgorICAgIGNhbGwgICBkZWJsb2NrXyUxX2x1bWFfOAorJWVuZGlmCisgICAgQUREICAgIGVzcCwgMjAKKworICAgIDsgdHJhbnNwb3NlIDE2eDQgLT4gb3JpZ2luYWwgc3BhY2UgIChvbmx5IHRoZSBtaWRkbGUgNCByb3dzIHdlcmUgY2hhbmdlZCBieSB0aGUgZmlsdGVyKQorICAgIG1vdiAgICByMCwgcjBtcAorICAgIHN1YiAgICByMCwgMgorCisgICAgbW92cSAgIG0wLCBbcGl4X3RtcCsweDEwXQorICAgIG1vdnEgICBtMSwgW3BpeF90bXArMHgyMF0KKyAgICBsZWEgICAgcjEsIFtyMCtyNF0KKyAgICBtb3ZxICAgbTIsIFtwaXhfdG1wKzB4MzBdCisgICAgbW92cSAgIG0zLCBbcGl4X3RtcCsweDQwXQorICAgIFRSQU5TUE9TRTh4NEJfU1RPUkUgIFBBU1M4Uk9XUyhyMCwgcjEsIHIzLCByNCkKKworICAgIGxlYSAgICByMCwgW3IwK3IzKjhdCisgICAgbGVhICAgIHIxLCBbcjErcjMqOF0KKyAgICBtb3ZxICAgbTAsIFtwaXhfdG1wKzB4MThdCisgICAgbW92cSAgIG0xLCBbcGl4X3RtcCsweDI4XQorICAgIG1vdnEgICBtMiwgW3BpeF90bXArMHgzOF0KKyAgICBtb3ZxICAgbTMsIFtwaXhfdG1wKzB4NDhdCisgICAgVFJBTlNQT1NFOHg0Ql9TVE9SRSAgUEFTUzhST1dTKHIwLCByMSwgcjMsIHI0KQorCisgICAgUkVUCislZW5kbWFjcm8gOyBERUJMT0NLX0xVTUEKKworSU5JVF9NTVggbW14ZXh0CitERUJMT0NLX0xVTUEgdjgsIDgKK0lOSVRfWE1NIHNzZTIKK0RFQkxPQ0tfTFVNQSB2LCAxNgorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0RFQkxPQ0tfTFVNQSB2LCAxNgorJWVuZGlmCisKKyVlbmRpZiA7IEFSQ0gKKworCisKKyVtYWNybyBMVU1BX0lOVFJBX1AwMTIgNCA7IHAwLi5wMyBpbiBtZW1vcnkKKyVpZiBBUkNIX1g4Nl82NAorICAgIHBhdmdiIHQwLCBwMiwgcDEKKyAgICBwYXZnYiB0MSwgcDAsIHEwCislZWxzZQorICAgIG1vdmEgIHQwLCBwMgorICAgIG1vdmEgIHQxLCBwMAorICAgIHBhdmdiIHQwLCBwMQorICAgIHBhdmdiIHQxLCBxMAorJWVuZGlmCisgICAgcGF2Z2IgdDAsIHQxIDsgKChwMitwMSsxKS8yICsgKHAwK3EwKzEpLzIgKyAxKS8yCisgICAgbW92YSAgdDUsIHQxCislaWYgQVJDSF9YODZfNjQKKyAgICBwYWRkYiB0MiwgcDIsIHAxCisgICAgcGFkZGIgdDMsIHAwLCBxMAorJWVsc2UKKyAgICBtb3ZhICB0MiwgcDIKKyAgICBtb3ZhICB0MywgcDAKKyAgICBwYWRkYiB0MiwgcDEKKyAgICBwYWRkYiB0MywgcTAKKyVlbmRpZgorICAgIHBhZGRiIHQyLCB0MworICAgIG1vdmEgIHQzLCB0MgorICAgIG1vdmEgIHQ0LCB0MgorICAgIHBzcmx3IHQyLCAxCisgICAgcGF2Z2IgdDIsIG1wYl8wCisgICAgcHhvciAgdDIsIHQwCisgICAgcGFuZCAgdDIsIG1wYl8xCisgICAgcHN1YmIgdDAsIHQyIDsgcDEnID0gKHAyK3AxK3AwK3EwKzIpLzQ7CisKKyVpZiBBUkNIX1g4Nl82NAorICAgIHBhdmdiIHQxLCBwMiwgcTEKKyAgICBwc3ViYiB0MiwgcDIsIHExCislZWxzZQorICAgIG1vdmEgIHQxLCBwMgorICAgIG1vdmEgIHQyLCBwMgorICAgIHBhdmdiIHQxLCBxMQorICAgIHBzdWJiIHQyLCBxMQorJWVuZGlmCisgICAgcGFkZGIgdDMsIHQzCisgICAgcHN1YmIgdDMsIHQyIDsgcDIrMipwMSsyKnAwKzIqcTArcTEKKyAgICBwYW5kICB0MiwgbXBiXzEKKyAgICBwc3ViYiB0MSwgdDIKKyAgICBwYXZnYiB0MSwgcDEKKyAgICBwYXZnYiB0MSwgdDUgOyAoKChwMitxMSkvMiArIHAxKzEpLzIgKyAocDArcTArMSkvMiArIDEpLzIKKyAgICBwc3JsdyB0MywgMgorICAgIHBhdmdiIHQzLCBtcGJfMAorICAgIHB4b3IgIHQzLCB0MQorICAgIHBhbmQgIHQzLCBtcGJfMQorICAgIHBzdWJiIHQxLCB0MyA7IHAwJ2EgPSAocDIrMipwMSsyKnAwKzIqcTArcTErNCkvOAorCisgICAgcHhvciAgdDMsIHAwLCBxMQorICAgIHBhdmdiIHQyLCBwMCwgcTEKKyAgICBwYW5kICB0MywgbXBiXzEKKyAgICBwc3ViYiB0MiwgdDMKKyAgICBwYXZnYiB0MiwgcDEgOyBwMCdiID0gKDIqcDErcDArcTArMikvNAorCisgICAgcHhvciAgdDEsIHQyCisgICAgcHhvciAgdDIsIHAwCisgICAgcGFuZCAgdDEsIG1hc2sxcAorICAgIHBhbmQgIHQyLCBtYXNrMAorICAgIHB4b3IgIHQxLCB0MgorICAgIHB4b3IgIHQxLCBwMAorICAgIG1vdmEgICUxLCB0MSA7IHN0b3JlIHAwCisKKyAgICBtb3ZhICB0MSwgJTQgOyBwMworICAgIHBhZGRiIHQyLCB0MSwgcDIKKyAgICBwYXZnYiB0MSwgcDIKKyAgICBwYXZnYiB0MSwgdDAgOyAocDMrcDIrMSkvMiArIChwMitwMStwMCtxMCsyKS80CisgICAgcGFkZGIgdDIsIHQyCisgICAgcGFkZGIgdDIsIHQ0IDsgMipwMyszKnAyK3AxK3AwK3EwCisgICAgcHNybHcgdDIsIDIKKyAgICBwYXZnYiB0MiwgbXBiXzAKKyAgICBweG9yICB0MiwgdDEKKyAgICBwYW5kICB0MiwgbXBiXzEKKyAgICBwc3ViYiB0MSwgdDIgOyBwMicgPSAoMipwMyszKnAyK3AxK3AwK3EwKzQpLzgKKworICAgIHB4b3IgIHQwLCBwMQorICAgIHB4b3IgIHQxLCBwMgorICAgIHBhbmQgIHQwLCBtYXNrMXAKKyAgICBwYW5kICB0MSwgbWFzazFwCisgICAgcHhvciAgdDAsIHAxCisgICAgcHhvciAgdDEsIHAyCisgICAgbW92YSAgJTIsIHQwIDsgc3RvcmUgcDEKKyAgICBtb3ZhICAlMywgdDEgOyBzdG9yZSBwMgorJWVuZG1hY3JvCisKKyVtYWNybyBMVU1BX0lOVFJBX1NXQVBfUFEgMAorICAgICVkZWZpbmUgcTEgbTAKKyAgICAlZGVmaW5lIHEwIG0xCisgICAgJWRlZmluZSBwMCBtMgorICAgICVkZWZpbmUgcDEgbTMKKyAgICAlZGVmaW5lIHAyIHEyCisgICAgJWRlZmluZSBtYXNrMXAgbWFzazFxCislZW5kbWFjcm8KKworJW1hY3JvIERFQkxPQ0tfTFVNQV9JTlRSQSAxCisgICAgJWRlZmluZSBwMSBtMAorICAgICVkZWZpbmUgcDAgbTEKKyAgICAlZGVmaW5lIHEwIG0yCisgICAgJWRlZmluZSBxMSBtMworICAgICVkZWZpbmUgdDAgbTQKKyAgICAlZGVmaW5lIHQxIG01CisgICAgJWRlZmluZSB0MiBtNgorICAgICVkZWZpbmUgdDMgbTcKKyVpZiBBUkNIX1g4Nl82NAorICAgICVkZWZpbmUgcDIgbTgKKyAgICAlZGVmaW5lIHEyIG05CisgICAgJWRlZmluZSB0NCBtMTAKKyAgICAlZGVmaW5lIHQ1IG0xMQorICAgICVkZWZpbmUgbWFzazAgbTEyCisgICAgJWRlZmluZSBtYXNrMXAgbTEzCislaWYgV0lONjQKKyAgICAlZGVmaW5lIG1hc2sxcSBbcnNwXQorJWVsc2UKKyAgICAlZGVmaW5lIG1hc2sxcSBbcnNwLTI0XQorJWVuZGlmCisgICAgJWRlZmluZSBtcGJfMCBtMTQKKyAgICAlZGVmaW5lIG1wYl8xIG0xNQorJWVsc2UKKyAgICAlZGVmaW5lIHNwaWxsKHgpIFtlc3ArMTYqeF0KKyAgICAlZGVmaW5lIHAyIFtyNCtyMV0KKyAgICAlZGVmaW5lIHEyIFtyMCsyKnIxXQorICAgICVkZWZpbmUgdDQgc3BpbGwoMCkKKyAgICAlZGVmaW5lIHQ1IHNwaWxsKDEpCisgICAgJWRlZmluZSBtYXNrMCBzcGlsbCgyKQorICAgICVkZWZpbmUgbWFzazFwIHNwaWxsKDMpCisgICAgJWRlZmluZSBtYXNrMXEgc3BpbGwoNCkKKyAgICAlZGVmaW5lIG1wYl8wIFtwYl8wXQorICAgICVkZWZpbmUgbXBiXzEgW3BiXzFdCislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZGVibG9ja192X2x1bWFfaW50cmEodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislaWYgV0lONjQKK2NnbG9iYWwgZGVibG9ja18lMV9sdW1hX2ludHJhXzgsIDQsNiwxNiwweDEwCislZWxzZQorY2dsb2JhbCBkZWJsb2NrXyUxX2x1bWFfaW50cmFfOCwgNCw2LDE2LEFSQ0hfWDg2XzY0KjB4NTAtMHg1MAorJWVuZGlmCisgICAgbGVhICAgICByNCwgW3IxKjRdCisgICAgbGVhICAgICByNSwgW3IxKjNdIDsgMypzdHJpZGUKKyAgICBkZWMgICAgIHIyZCAgICAgICAgOyBhbHBoYS0xCisgICAgamwgLmVuZAorICAgIG5lZyAgICAgcjQKKyAgICBkZWMgICAgIHIzZCAgICAgICAgOyBiZXRhLTEKKyAgICBqbCAuZW5kCisgICAgYWRkICAgICByNCwgcjAgICAgIDsgcGl4LTQqc3RyaWRlCisgICAgbW92YSAgICBwMSwgW3I0KzIqcjFdCisgICAgbW92YSAgICBwMCwgW3I0K3I1XQorICAgIG1vdmEgICAgcTAsIFtyMF0KKyAgICBtb3ZhICAgIHExLCBbcjArcjFdCislaWYgQVJDSF9YODZfNjQKKyAgICBweG9yICAgIG1wYl8wLCBtcGJfMAorICAgIG1vdmEgICAgbXBiXzEsIFtwYl8xXQorICAgIExPQURfTUFTSyByMmQsIHIzZCwgdDUgOyBtNT1iZXRhLTEsIHQ1PWFscGhhLTEsIG03PW1hc2swCisgICAgU1dBUCAgICA3LCAxMiA7IG0xMj1tYXNrMAorICAgIHBhdmdiICAgdDUsIG1wYl8wCisgICAgcGF2Z2IgICB0NSwgbXBiXzEgOyBhbHBoYS80KzEKKyAgICBtb3ZkcWEgIHAyLCBbcjQrcjFdCisgICAgbW92ZHFhICBxMiwgW3IwKzIqcjFdCisgICAgRElGRl9HVDIgcDAsIHEwLCB0NSwgdDAsIHQzIDsgdDAgPSB8cDAtcTB8ID4gYWxwaGEvNCsxCisgICAgRElGRl9HVDIgcDAsIHAyLCBtNSwgdDIsIHQ1IDsgbWFzazEgPSB8cDItcDB8ID4gYmV0YS0xCisgICAgRElGRl9HVDIgcTAsIHEyLCBtNSwgdDQsIHQ1IDsgdDQgPSB8cTItcTB8ID4gYmV0YS0xCisgICAgcGFuZCAgICB0MCwgbWFzazAKKyAgICBwYW5kICAgIHQ0LCB0MAorICAgIHBhbmQgICAgdDIsIHQwCisgICAgbW92YSAgICBtYXNrMXEsIHQ0CisgICAgbW92YSAgICBtYXNrMXAsIHQyCislZWxzZQorICAgIExPQURfTUFTSyByMmQsIHIzZCwgdDUgOyBtNT1iZXRhLTEsIHQ1PWFscGhhLTEsIG03PW1hc2swCisgICAgbW92YSAgICBtNCwgdDUKKyAgICBtb3ZhICAgIG1hc2swLCBtNworICAgIHBhdmdiICAgbTQsIFtwYl8wXQorICAgIHBhdmdiICAgbTQsIFtwYl8xXSA7IGFscGhhLzQrMQorICAgIERJRkZfR1QyIHAwLCBxMCwgbTQsIG02LCBtNyA7IG02ID0gfHAwLXEwfCA+IGFscGhhLzQrMQorICAgIHBhbmQgICAgbTYsIG1hc2swCisgICAgRElGRl9HVDIgcDAsIHAyLCBtNSwgbTQsIG03IDsgbTQgPSB8cDItcDB8ID4gYmV0YS0xCisgICAgcGFuZCAgICBtNCwgbTYKKyAgICBtb3ZhICAgIG1hc2sxcCwgbTQKKyAgICBESUZGX0dUMiBxMCwgcTIsIG01LCBtNCwgbTcgOyBtNCA9IHxxMi1xMHwgPiBiZXRhLTEKKyAgICBwYW5kICAgIG00LCBtNgorICAgIG1vdmEgICAgbWFzazFxLCBtNAorJWVuZGlmCisgICAgTFVNQV9JTlRSQV9QMDEyIFtyNCtyNV0sIFtyNCsyKnIxXSwgW3I0K3IxXSwgW3I0XQorICAgIExVTUFfSU5UUkFfU1dBUF9QUQorICAgIExVTUFfSU5UUkFfUDAxMiBbcjBdLCBbcjArcjFdLCBbcjArMipyMV0sIFtyMCtyNV0KKy5lbmQ6CisgICAgUkVUCisKK0lOSVRfTU1YIGNwdW5hbWUKKyVpZiBBUkNIX1g4Nl82NAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZGVibG9ja19oX2x1bWFfaW50cmEodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjZ2xvYmFsIGRlYmxvY2tfaF9sdW1hX2ludHJhXzgsIDQsOSwwLDB4ODAKKyAgICBtb3ZzeGQgcjcsICByMWQKKyAgICBsZWEgICAgcjgsICBbcjcqM10KKyAgICBsZWEgICAgcjYsICBbcjAtNF0KKyAgICBsZWEgICAgcjUsICBbcjAtNCtyOF0KKyVpZiBXSU42NAorICAgICVkZWZpbmUgcGl4X3RtcCByc3ArMHgyMCA7IHNoYWRvdyBzcGFjZQorJWVsc2UKKyAgICAlZGVmaW5lIHBpeF90bXAgcnNwCislZW5kaWYKKworICAgIDsgdHJhbnNwb3NlIDh4MTYgLT4gdG1wIHNwYWNlCisgICAgVFJBTlNQT1NFOHg4X01FTSAgUEFTUzhST1dTKHI2LCByNSwgcjcsIHI4KSwgUEFTUzhST1dTKHBpeF90bXAsIHBpeF90bXArMHgzMCwgMHgxMCwgMHgzMCkKKyAgICBsZWEgICAgcjYsIFtyNityNyo4XQorICAgIGxlYSAgICByNSwgW3I1K3I3KjhdCisgICAgVFJBTlNQT1NFOHg4X01FTSAgUEFTUzhST1dTKHI2LCByNSwgcjcsIHI4KSwgUEFTUzhST1dTKHBpeF90bXArOCwgcGl4X3RtcCsweDM4LCAweDEwLCAweDMwKQorCisgICAgbGVhICAgIHIwLCAgW3BpeF90bXArMHg0MF0KKyAgICBtb3YgICAgcjEsICAweDEwCisgICAgY2FsbCAgIGRlYmxvY2tfdl9sdW1hX2ludHJhXzgKKworICAgIDsgdHJhbnNwb3NlIDE2eDYgLT4gb3JpZ2luYWwgc3BhY2UgKGJ1dCB3ZSBjYW4ndCB3cml0ZSBvbmx5IDYgcGl4ZWxzLCBzbyByZWFsbHkgMTZ4OCkKKyAgICBsZWEgICAgcjUsIFtyNityOF0KKyAgICBUUkFOU1BPU0U4eDhfTUVNICBQQVNTOFJPV1MocGl4X3RtcCs4LCBwaXhfdG1wKzB4MzgsIDB4MTAsIDB4MzApLCBQQVNTOFJPV1MocjYsIHI1LCByNywgcjgpCisgICAgc2hsICAgIHI3LCAgMworICAgIHN1YiAgICByNiwgIHI3CisgICAgc3ViICAgIHI1LCAgcjcKKyAgICBzaHIgICAgcjcsICAzCisgICAgVFJBTlNQT1NFOHg4X01FTSAgUEFTUzhST1dTKHBpeF90bXAsIHBpeF90bXArMHgzMCwgMHgxMCwgMHgzMCksIFBBU1M4Uk9XUyhyNiwgcjUsIHI3LCByOCkKKyAgICBSRVQKKyVlbHNlCitjZ2xvYmFsIGRlYmxvY2tfaF9sdW1hX2ludHJhXzgsIDIsNCw4LDB4ODAKKyAgICBsZWEgICAgcjMsICBbcjEqM10KKyAgICBzdWIgICAgcjAsICA0CisgICAgbGVhICAgIHIyLCAgW3IwK3IzXQorICAgICVkZWZpbmUgcGl4X3RtcCByc3AKKworICAgIDsgdHJhbnNwb3NlIDh4MTYgLT4gdG1wIHNwYWNlCisgICAgVFJBTlNQT1NFOHg4X01FTSAgUEFTUzhST1dTKHIwLCByMiwgcjEsIHIzKSwgUEFTUzhST1dTKHBpeF90bXAsIHBpeF90bXArMHgzMCwgMHgxMCwgMHgzMCkKKyAgICBsZWEgICAgcjAsICBbcjArcjEqOF0KKyAgICBsZWEgICAgcjIsICBbcjIrcjEqOF0KKyAgICBUUkFOU1BPU0U4eDhfTUVNICBQQVNTOFJPV1MocjAsIHIyLCByMSwgcjMpLCBQQVNTOFJPV1MocGl4X3RtcCs4LCBwaXhfdG1wKzB4MzgsIDB4MTAsIDB4MzApCisKKyAgICBsZWEgICAgcjAsICBbcGl4X3RtcCsweDQwXQorICAgIFBVU0ggICBkd29yZCByM20KKyAgICBQVVNIICAgZHdvcmQgcjJtCisgICAgUFVTSCAgIGR3b3JkIDE2CisgICAgUFVTSCAgIHIwCisgICAgY2FsbCAgIGRlYmxvY2tfJTFfbHVtYV9pbnRyYV84CislaWZpZG4gJTEsIHY4CisgICAgYWRkICAgIGR3b3JkIFtyc3BdLCA4IDsgcGl4X3RtcCs4CisgICAgY2FsbCAgIGRlYmxvY2tfJTFfbHVtYV9pbnRyYV84CislZW5kaWYKKyAgICBBREQgICAgZXNwLCAxNgorCisgICAgbW92ICAgIHIxLCAgcjFtCisgICAgbW92ICAgIHIwLCAgcjBtcAorICAgIGxlYSAgICByMywgIFtyMSozXQorICAgIHN1YiAgICByMCwgIDQKKyAgICBsZWEgICAgcjIsICBbcjArcjNdCisgICAgOyB0cmFuc3Bvc2UgMTZ4NiAtPiBvcmlnaW5hbCBzcGFjZSAoYnV0IHdlIGNhbid0IHdyaXRlIG9ubHkgNiBwaXhlbHMsIHNvIHJlYWxseSAxNng4KQorICAgIFRSQU5TUE9TRTh4OF9NRU0gIFBBU1M4Uk9XUyhwaXhfdG1wLCBwaXhfdG1wKzB4MzAsIDB4MTAsIDB4MzApLCBQQVNTOFJPV1MocjAsIHIyLCByMSwgcjMpCisgICAgbGVhICAgIHIwLCAgW3IwK3IxKjhdCisgICAgbGVhICAgIHIyLCAgW3IyK3IxKjhdCisgICAgVFJBTlNQT1NFOHg4X01FTSAgUEFTUzhST1dTKHBpeF90bXArOCwgcGl4X3RtcCsweDM4LCAweDEwLCAweDMwKSwgUEFTUzhST1dTKHIwLCByMiwgcjEsIHIzKQorICAgIFJFVAorJWVuZGlmIDsgQVJDSF9YODZfNjQKKyVlbmRtYWNybyA7IERFQkxPQ0tfTFVNQV9JTlRSQQorCitJTklUX1hNTSBzc2UyCitERUJMT0NLX0xVTUFfSU5UUkEgdgorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0RFQkxPQ0tfTFVNQV9JTlRSQSB2CislZW5kaWYKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCitJTklUX01NWCBtbXhleHQKK0RFQkxPQ0tfTFVNQV9JTlRSQSB2OAorJWVuZGlmCisKK0lOSVRfTU1YIG1teGV4dAorCislbWFjcm8gQ0hST01BX1ZfU1RBUlQgMAorICAgIGRlYyAgICByMmQgICAgICA7IGFscGhhLTEKKyAgICBkZWMgICAgcjNkICAgICAgOyBiZXRhLTEKKyAgICBtb3YgICAgdDUsIHIwCisgICAgc3ViICAgIHQ1LCByMQorICAgIHN1YiAgICB0NSwgcjEKKyVlbmRtYWNybworCislbWFjcm8gQ0hST01BX0hfU1RBUlQgMAorICAgIGRlYyAgICByMmQKKyAgICBkZWMgICAgcjNkCisgICAgc3ViICAgIHIwLCAyCisgICAgbGVhICAgIHQ2LCBbcjEqM10KKyAgICBtb3YgICAgdDUsIHIwCisgICAgYWRkICAgIHIwLCB0NgorJWVuZG1hY3JvCisKKyVkZWZpbmUgdDUgcjUKKyVkZWZpbmUgdDYgcjYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZGVibG9ja192X2Nocm9tYSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnRjMCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2dsb2JhbCBkZWJsb2NrX3ZfY2hyb21hXzgsIDUsNgorICAgIENIUk9NQV9WX1NUQVJUCisgICAgbW92cSAgbTAsIFt0NV0KKyAgICBtb3ZxICBtMSwgW3Q1K3IxXQorICAgIG1vdnEgIG0yLCBbcjBdCisgICAgbW92cSAgbTMsIFtyMCtyMV0KKyAgICBjYWxsIGZmX2Nocm9tYV9pbnRlcl9ib2R5X21teGV4dAorICAgIG1vdnEgIFt0NStyMV0sIG0xCisgICAgbW92cSAgW3IwXSwgbTIKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZGVibG9ja19oX2Nocm9tYSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnRjMCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2dsb2JhbCBkZWJsb2NrX2hfY2hyb21hXzgsIDUsNworJWlmIEFSQ0hfWDg2XzY0CisgICAgOyBUaGlzIGNvdWxkIHVzZSB0aGUgcmVkIHpvbmUgb24gNjQgYml0IHVuaXggdG8gYXZvaWQgdGhlIHN0YWNrIHBvaW50ZXIKKyAgICA7IHJlYWRqdXN0bWVudCwgYnV0IHZhbGdyaW5kIGFzc3VtZXMgdGhlIHJlZCB6b25lIGlzIGNsb2JiZXJlZCBvbgorICAgIDsgZnVuY3Rpb24gY2FsbHMgYW5kIHJldHVybnMuCisgICAgc3ViICAgcnNwLCAxNgorICAgICVkZWZpbmUgYnVmMCBbcnNwXQorICAgICVkZWZpbmUgYnVmMSBbcnNwKzhdCislZWxzZQorICAgICVkZWZpbmUgYnVmMCByMG0KKyAgICAlZGVmaW5lIGJ1ZjEgcjJtCislZW5kaWYKKyAgICBDSFJPTUFfSF9TVEFSVAorICAgIFRSQU5TUE9TRTR4OF9MT0FEICBidywgd2QsIGRxLCBQQVNTOFJPV1ModDUsIHIwLCByMSwgdDYpCisgICAgbW92cSAgYnVmMCwgbTAKKyAgICBtb3ZxICBidWYxLCBtMworICAgIExPQURfTUFTSyAgcjJkLCByM2QKKyAgICBtb3ZkICAgICAgIG02LCBbcjRdIDsgdGMwCisgICAgcHVucGNrbGJ3ICBtNiwgbTYKKyAgICBwYW5kICAgICAgIG03LCBtNgorICAgIERFQkxPQ0tfUDBfUTAKKyAgICBtb3ZxICBtMCwgYnVmMAorICAgIG1vdnEgIG0zLCBidWYxCisgICAgVFJBTlNQT1NFOHg0Ql9TVE9SRSBQQVNTOFJPV1ModDUsIHIwLCByMSwgdDYpCislaWYgQVJDSF9YODZfNjQKKyAgICBhZGQgICByc3AsIDE2CislZW5kaWYKKyAgICBSRVQKKworQUxJR04gMTYKK2ZmX2Nocm9tYV9pbnRlcl9ib2R5X21teGV4dDoKKyAgICBMT0FEX01BU0sgIHIyZCwgcjNkCisgICAgbW92ZCAgICAgICBtNiwgW3I0XSA7IHRjMAorICAgIHB1bnBja2xidyAgbTYsIG02CisgICAgcGFuZCAgICAgICBtNywgbTYKKyAgICBERUJMT0NLX1AwX1EwCisgICAgcmV0CisKKworCis7IGluOiAlMT1wMCAlMj1wMSAlMz1xMQorOyBvdXQ6IHAwID0gKHAwICsgcTEgKyAyKnAxICsgMikgPj4gMgorJW1hY3JvIENIUk9NQV9JTlRSQV9QMCAzCisgICAgbW92cSAgICBtNCwgJTEKKyAgICBweG9yICAgIG00LCAlMworICAgIHBhbmQgICAgbTQsIFtwYl8xXSA7IG00ID0gKHAwXnExKSYxCisgICAgcGF2Z2IgICAlMSwgJTMKKyAgICBwc3VidXNiICUxLCBtNAorICAgIHBhdmdiICAgJTEsICUyICAgICAgICAgICAgIDsgZHN0ID0gYXZnKHAxLCBhdmcocDAscTEpIC0gKChwMF5xMSkmMSkpCislZW5kbWFjcm8KKworJWRlZmluZSB0NSByNAorJWRlZmluZSB0NiByNQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZGVibG9ja192X2Nocm9tYV9pbnRyYSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjZ2xvYmFsIGRlYmxvY2tfdl9jaHJvbWFfaW50cmFfOCwgNCw1CisgICAgQ0hST01BX1ZfU1RBUlQKKyAgICBtb3ZxICBtMCwgW3Q1XQorICAgIG1vdnEgIG0xLCBbdDUrcjFdCisgICAgbW92cSAgbTIsIFtyMF0KKyAgICBtb3ZxICBtMywgW3IwK3IxXQorICAgIGNhbGwgZmZfY2hyb21hX2ludHJhX2JvZHlfbW14ZXh0CisgICAgbW92cSAgW3Q1K3IxXSwgbTEKKyAgICBtb3ZxICBbcjBdLCBtMgorICAgIFJFVAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZGVibG9ja19oX2Nocm9tYV9pbnRyYSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjZ2xvYmFsIGRlYmxvY2tfaF9jaHJvbWFfaW50cmFfOCwgNCw2CisgICAgQ0hST01BX0hfU1RBUlQKKyAgICBUUkFOU1BPU0U0eDhfTE9BRCAgYncsIHdkLCBkcSwgUEFTUzhST1dTKHQ1LCByMCwgcjEsIHQ2KQorICAgIGNhbGwgZmZfY2hyb21hX2ludHJhX2JvZHlfbW14ZXh0CisgICAgVFJBTlNQT1NFOHg0Ql9TVE9SRSBQQVNTOFJPV1ModDUsIHIwLCByMSwgdDYpCisgICAgUkVUCisKK0FMSUdOIDE2CitmZl9jaHJvbWFfaW50cmFfYm9keV9tbXhleHQ6CisgICAgTE9BRF9NQVNLIHIyZCwgcjNkCisgICAgbW92cSAgIG01LCBtMQorICAgIG1vdnEgICBtNiwgbTIKKyAgICBDSFJPTUFfSU5UUkFfUDAgIG0xLCBtMCwgbTMKKyAgICBDSFJPTUFfSU5UUkFfUDAgIG0yLCBtMywgbTAKKyAgICBwc3ViYiAgbTEsIG01CisgICAgcHN1YmIgIG0yLCBtNgorICAgIHBhbmQgICBtMSwgbTcKKyAgICBwYW5kICAgbTIsIG03CisgICAgcGFkZGIgIG0xLCBtNQorICAgIHBhZGRiICBtMiwgbTYKKyAgICByZXQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaDI2NF9sb29wX2ZpbHRlcl9zdHJlbmd0aChpbnQxNl90IGJzWzJdWzRdWzRdLCB1aW50OF90IG5uels0MF0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgcmVmWzJdWzQwXSwgaW50MTZfdCBtdlsyXVs0MF1bMl0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaXIsICAgIGludCBlZGdlcywgICAgaW50IHN0ZXAsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19tdjAsIGludCBtYXNrX212MSwgaW50IGZpZWxkKTsKKzsKKzsgYmlkaXIgICAgaXMgMCBvciAxCis7IGVkZ2VzICAgIGlzIDEgb3IgNAorOyBzdGVwICAgICBpcyAxIG9yIDIKKzsgbWFza19tdjAgaXMgMCBvciAzCis7IG1hc2tfbXYxIGlzIDAgb3IgMQorOyBmaWVsZCAgICBpcyAwIG9yIDEKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIGxvb3BfZmlsdGVyX3N0cmVuZ3RoX2l0ZXJhdGlvbiA3IDsgZWRnZXMsIHN0ZXAsIG1hc2tfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBkaXIsIGRfaWR4LCBtYXNrX2RpciwgYmlkaXIKKyVkZWZpbmUgZWRnZXNkICAgICUxCislZGVmaW5lIHN0ZXBkICAgICAlMgorJWRlZmluZSBtYXNrX212ZCAgJTMKKyVkZWZpbmUgZGlyICAgICAgICU0CislZGVmaW5lIGRfaWR4ICAgICAlNQorJWRlZmluZSBtYXNrX2RpciAgJTYKKyVkZWZpbmUgYmlkaXIgICAgICU3CisgICAgeG9yICAgICAgICAgIGJfaWR4ZCwgYl9pZHhkIDsgZm9yIChiX2lkeCA9IDA7IGJfaWR4IDwgZWRnZXM7IGJfaWR4ICs9IHN0ZXApCislJS5iX2lkeF9sb29wOgorJWlmIG1hc2tfZGlyID09IDAKKyAgICBweG9yICAgICAgICAgICAgIG0wLCBtMAorJWVuZGlmCisgICAgdGVzdCAgICAgICAgIGJfaWR4ZCwgZHdvcmQgbWFza19tdmQKKyAgICBqbnogJSUuc2tpcF9sb29wX2l0ZXIgICAgICAgICAgICAgICAgICAgICAgIDsgaWYgKCEoYl9pZHggJiBtYXNrX212KSkKKyVpZiBiaWRpciA9PSAxCisgICAgbW92ZCAgICAgICAgICAgICBtMiwgW3JlZnErYl9pZHhxK2RfaWR4KzEyXSA7IHsgcmVmMFtibl0gfQorICAgIHB1bnBja2xkcSAgICAgICAgbTIsIFtyZWZxK2JfaWR4cStkX2lkeCs1Ml0gOyB7IHJlZjBbYm5dLCByZWYxW2JuXSB9CisgICAgcHNodWZ3ICAgICAgICAgICBtMCwgW3JlZnErYl9pZHhxKzEyXSwgMHg0NCA7IHsgcmVmMFtiXSwgIHJlZjBbYl0gIH0KKyAgICBwc2h1ZncgICAgICAgICAgIG0xLCBbcmVmcStiX2lkeHErNTJdLCAweDQ0IDsgeyByZWYxW2JdLCAgcmVmMVtiXSAgfQorICAgIHBzaHVmdyAgICAgICAgICAgbTMsIG0yLCAweDRFICAgICAgICAgICAgICAgOyB7IHJlZjFbYm5dLCByZWYwW2JuXSB9CisgICAgcHN1YmIgICAgICAgICAgICBtMCwgbTIgICAgICAgICAgICAgICAgICAgICA7IHsgcmVmMFtiXSAhPSByZWYwW2JuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgICByZWYwW2JdICE9IHJlZjFbYm5dIH0KKyAgICBwc3ViYiAgICAgICAgICAgIG0xLCBtMyAgICAgICAgICAgICAgICAgICAgIDsgeyByZWYxW2JdICE9IHJlZjFbYm5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIHJlZjFbYl0gIT0gcmVmMFtibl0gfQorCisgICAgcG9yICAgICAgICAgICAgICBtMCwgbTEKKyAgICBtb3ZhICAgICAgICAgICAgIG0xLCBbbXZxK2JfaWR4cSo0KyhkX2lkeCsxMikqNF0KKyAgICBtb3ZhICAgICAgICAgICAgIG0yLCBbbXZxK2JfaWR4cSo0KyhkX2lkeCsxMikqNCttbXNpemVdCisgICAgbW92YSAgICAgICAgICAgICBtMywgbTEKKyAgICBtb3ZhICAgICAgICAgICAgIG00LCBtMgorICAgIHBzdWJ3ICAgICAgICAgICAgbTEsIFttdnErYl9pZHhxKjQrMTIqNF0KKyAgICBwc3VidyAgICAgICAgICAgIG0yLCBbbXZxK2JfaWR4cSo0KzEyKjQrbW1zaXplXQorICAgIHBzdWJ3ICAgICAgICAgICAgbTMsIFttdnErYl9pZHhxKjQrNTIqNF0KKyAgICBwc3VidyAgICAgICAgICAgIG00LCBbbXZxK2JfaWR4cSo0KzUyKjQrbW1zaXplXQorICAgIHBhY2tzc3diICAgICAgICAgbTEsIG0yCisgICAgcGFja3Nzd2IgICAgICAgICBtMywgbTQKKyAgICBwYWRkYiAgICAgICAgICAgIG0xLCBtNgorICAgIHBhZGRiICAgICAgICAgICAgbTMsIG02CisgICAgcHN1YnVzYiAgICAgICAgICBtMSwgbTUgOyBhYnMobXZbYl0gLSBtdltibl0pID49IGxpbWl0CisgICAgcHN1YnVzYiAgICAgICAgICBtMywgbTUKKyAgICBwYWNrc3N3YiAgICAgICAgIG0xLCBtMworCisgICAgcG9yICAgICAgICAgICAgICBtMCwgbTEKKyAgICBtb3ZhICAgICAgICAgICAgIG0xLCBbbXZxK2JfaWR4cSo0KyhkX2lkeCs1MikqNF0KKyAgICBtb3ZhICAgICAgICAgICAgIG0yLCBbbXZxK2JfaWR4cSo0KyhkX2lkeCs1MikqNCttbXNpemVdCisgICAgbW92YSAgICAgICAgICAgICBtMywgbTEKKyAgICBtb3ZhICAgICAgICAgICAgIG00LCBtMgorICAgIHBzdWJ3ICAgICAgICAgICAgbTEsIFttdnErYl9pZHhxKjQrMTIqNF0KKyAgICBwc3VidyAgICAgICAgICAgIG0yLCBbbXZxK2JfaWR4cSo0KzEyKjQrbW1zaXplXQorICAgIHBzdWJ3ICAgICAgICAgICAgbTMsIFttdnErYl9pZHhxKjQrNTIqNF0KKyAgICBwc3VidyAgICAgICAgICAgIG00LCBbbXZxK2JfaWR4cSo0KzUyKjQrbW1zaXplXQorICAgIHBhY2tzc3diICAgICAgICAgbTEsIG0yCisgICAgcGFja3Nzd2IgICAgICAgICBtMywgbTQKKyAgICBwYWRkYiAgICAgICAgICAgIG0xLCBtNgorICAgIHBhZGRiICAgICAgICAgICAgbTMsIG02CisgICAgcHN1YnVzYiAgICAgICAgICBtMSwgbTUgOyBhYnMobXZbYl0gLSBtdltibl0pID49IGxpbWl0CisgICAgcHN1YnVzYiAgICAgICAgICBtMywgbTUKKyAgICBwYWNrc3N3YiAgICAgICAgIG0xLCBtMworCisgICAgcHNodWZ3ICAgICAgICAgICBtMSwgbTEsIDB4NEUKKyAgICBwb3IgICAgICAgICAgICAgIG0wLCBtMQorICAgIHBzaHVmdyAgICAgICAgICAgbTEsIG0wLCAweDRFCisgICAgcG1pbnViICAgICAgICAgICBtMCwgbTEKKyVlbHNlIDsgYmlkaXIgPT0gMAorICAgIG1vdmQgICAgICAgICAgICAgbTAsIFtyZWZxK2JfaWR4cSsxMl0KKyAgICBwc3ViYiAgICAgICAgICAgIG0wLCBbcmVmcStiX2lkeHErZF9pZHgrMTJdIDsgcmVmW2JdICE9IHJlZltibl0KKworICAgIG1vdmEgICAgICAgICAgICAgbTEsIFttdnErYl9pZHhxKjQrMTIqNF0KKyAgICBtb3ZhICAgICAgICAgICAgIG0yLCBbbXZxK2JfaWR4cSo0KzEyKjQrbW1zaXplXQorICAgIHBzdWJ3ICAgICAgICAgICAgbTEsIFttdnErYl9pZHhxKjQrKGRfaWR4KzEyKSo0XQorICAgIHBzdWJ3ICAgICAgICAgICAgbTIsIFttdnErYl9pZHhxKjQrKGRfaWR4KzEyKSo0K21tc2l6ZV0KKyAgICBwYWNrc3N3YiAgICAgICAgIG0xLCBtMgorICAgIHBhZGRiICAgICAgICAgICAgbTEsIG02CisgICAgcHN1YnVzYiAgICAgICAgICBtMSwgbTUgOyBhYnMobXZbYl0gLSBtdltibl0pID49IGxpbWl0CisgICAgcGFja3Nzd2IgICAgICAgICBtMSwgbTEKKyAgICBwb3IgICAgICAgICAgICAgIG0wLCBtMQorJWVuZGlmIDsgYmlkaXIgPT0gMS8wCisKKyUlLnNraXBfbG9vcF9pdGVyOgorICAgIG1vdmQgICAgICAgICAgICAgbTEsIFtubnpxK2JfaWR4cSsxMl0KKyAgICBwb3IgICAgICAgICAgICAgIG0xLCBbbm56cStiX2lkeHErZF9pZHgrMTJdIDsgbm56W2JdIHx8IG5ueltibl0KKworICAgIHBtaW51YiAgICAgICAgICAgbTEsIG03CisgICAgcG1pbnViICAgICAgICAgICBtMCwgbTcKKyAgICBwc2xsdyAgICAgICAgICAgIG0xLCAxCisgICAgcHhvciAgICAgICAgICAgICBtMiwgbTIKKyAgICBwbWF4dWIgICAgICAgICAgIG0xLCBtMAorICAgIHB1bnBja2xidyAgICAgICAgbTEsIG0yCisgICAgbW92cSBbYnNxK2JfaWR4cSszMipkaXJdLCBtMQorCisgICAgYWRkICAgICAgICAgIGJfaWR4ZCwgZHdvcmQgc3RlcGQKKyAgICBjbXAgICAgICAgICAgYl9pZHhkLCBkd29yZCBlZGdlc2QKKyAgICBqbCAlJS5iX2lkeF9sb29wCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIGgyNjRfbG9vcF9maWx0ZXJfc3RyZW5ndGgsIDksIDksIDAsIGJzLCBubnosIHJlZiwgbXYsIGJpZGlyLCBlZGdlcywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLCBtYXNrX212MCwgbWFza19tdjEsIGZpZWxkCislZGVmaW5lIGJfaWR4cSBiaWRpcnEKKyVkZWZpbmUgYl9pZHhkIGJpZGlyZAorICAgIGNtcCAgICBkd29yZCBmaWVsZG0sIDAKKyAgICBtb3ZhICAgICAgICAgICAgIG03LCBbcGJfMV0KKyAgICBtb3ZhICAgICAgICAgICAgIG01LCBbcGJfM10KKyAgICBqZSAubm9maWVsZAorICAgIG1vdmEgICAgICAgICAgICAgbTUsIFtwYl8zXzFdCisubm9maWVsZDoKKyAgICBtb3ZhICAgICAgICAgICAgIG02LCBtNQorICAgIHBhZGRiICAgICAgICAgICAgbTUsIG01CisKKyAgICBzaGwgICAgIGR3b3JkIHN0ZXBkLCAzCisgICAgc2hsICAgIGR3b3JkIGVkZ2VzZCwgMworJWlmIEFSQ0hfWDg2XzMyCislZGVmaW5lIG1hc2tfbXYwZCBtYXNrX212MG0KKyVkZWZpbmUgbWFza19tdjFkIG1hc2tfbXYxbQorJWVuZGlmCisgICAgc2hsIGR3b3JkIG1hc2tfbXYxZCwgMworICAgIHNobCBkd29yZCBtYXNrX212MGQsIDMKKworICAgIGNtcCAgICBkd29yZCBiaWRpcmQsIDAKKyAgICBqbmUgLmJpZGlyCisgICAgbG9vcF9maWx0ZXJfc3RyZW5ndGhfaXRlcmF0aW9uIGVkZ2VzZCwgc3RlcGQsIG1hc2tfbXYxZCwgMSwgLTgsICAwLCAwCisgICAgbG9vcF9maWx0ZXJfc3RyZW5ndGhfaXRlcmF0aW9uICAgICAzMiwgICAgIDgsIG1hc2tfbXYwZCwgMCwgLTEsIC0xLCAwCisKKyAgICBtb3ZhICAgICAgICAgICAgIG0wLCBbYnNxK21tc2l6ZSowXQorICAgIG1vdmEgICAgICAgICAgICAgbTEsIFtic3ErbW1zaXplKjFdCisgICAgbW92YSAgICAgICAgICAgICBtMiwgW2JzcSttbXNpemUqMl0KKyAgICBtb3ZhICAgICAgICAgICAgIG0zLCBbYnNxK21tc2l6ZSozXQorICAgIFRSQU5TUE9TRTR4NFcgMCwgMSwgMiwgMywgNAorICAgIG1vdmEgIFtic3ErbW1zaXplKjBdLCBtMAorICAgIG1vdmEgIFtic3ErbW1zaXplKjFdLCBtMQorICAgIG1vdmEgIFtic3ErbW1zaXplKjJdLCBtMgorICAgIG1vdmEgIFtic3ErbW1zaXplKjNdLCBtMworICAgIFJFVAorCisuYmlkaXI6CisgICAgbG9vcF9maWx0ZXJfc3RyZW5ndGhfaXRlcmF0aW9uIGVkZ2VzZCwgc3RlcGQsIG1hc2tfbXYxZCwgMSwgLTgsICAwLCAxCisgICAgbG9vcF9maWx0ZXJfc3RyZW5ndGhfaXRlcmF0aW9uICAgICAzMiwgICAgIDgsIG1hc2tfbXYwZCwgMCwgLTEsIC0xLCAxCisKKyAgICBtb3ZhICAgICAgICAgICAgIG0wLCBbYnNxK21tc2l6ZSowXQorICAgIG1vdmEgICAgICAgICAgICAgbTEsIFtic3ErbW1zaXplKjFdCisgICAgbW92YSAgICAgICAgICAgICBtMiwgW2JzcSttbXNpemUqMl0KKyAgICBtb3ZhICAgICAgICAgICAgIG0zLCBbYnNxK21tc2l6ZSozXQorICAgIFRSQU5TUE9TRTR4NFcgMCwgMSwgMiwgMywgNAorICAgIG1vdmEgIFtic3ErbW1zaXplKjBdLCBtMAorICAgIG1vdmEgIFtic3ErbW1zaXplKjFdLCBtMQorICAgIG1vdmEgIFtic3ErbW1zaXplKjJdLCBtMgorICAgIG1vdmEgIFtic3ErbW1zaXplKjNdLCBtMworICAgIFJFVApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfZGVibG9ja18xMGJpdC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NF9kZWJsb2NrXzEwYml0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGFjZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfZGVibG9ja18xMGJpdC5hc20KQEAgLTAsMCArMSw5MzAgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogTU1YL1NTRTIvQVZYLW9wdGltaXplZCAxMC1iaXQgSC4yNjQgZGVibG9ja2luZyBjb2RlCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIENvcHlyaWdodCAoQykgMjAwNS0yMDExIHgyNjQgcHJvamVjdAorOyoKKzsqIEF1dGhvcnM6IE9za2FyIEFydmlkc3NvbiA8b3NrYXJAaXJvY2suc2U+Cis7KiAgICAgICAgICBMb3JlbiBNZXJyaXR0IDxsb3Jlbm1AdS53YXNoaW5ndG9uLmVkdT4KKzsqICAgICAgICAgIEZpb25hIEdsYXNlciA8ZmlvbmFAeDI2NC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworcHdfcGl4ZWxfbWF4OiB0aW1lcyA4IGR3ICgoMSA8PCAxMCktMSkKKworU0VDVElPTiAudGV4dAorCitjZXh0ZXJuIHB3XzIKK2NleHRlcm4gcHdfMworY2V4dGVybiBwd180CisKKzsgb3V0OiAlNCA9IHwlMS0lMnwtJTMKKzsgY2xvYmJlcnM6ICU1CislbWFjcm8gQUJTX1NVQiA1CisgICAgcHN1YnVzdyAlNSwgJTIsICUxCisgICAgcHN1YnVzdyAlNCwgJTEsICUyCisgICAgcG9yICAgICAlNCwgJTUKKyAgICBwc3VidyAgICU0LCAlMworJWVuZG1hY3JvCisKKzsgb3V0OiAlNCA9IHwlMS0lMnw8JTMKKyVtYWNybyBESUZGX0xUICAgNQorICAgIHBzdWJ1c3cgJTQsICUyLCAlMQorICAgIHBzdWJ1c3cgJTUsICUxLCAlMgorICAgIHBvciAgICAgJTUsICU0IDsgfCUxLSUyfAorICAgIHB4b3IgICAgJTQsICU0CisgICAgcHN1YncgICAlNSwgJTMgOyB8JTEtJTJ8LSUzCisgICAgcGNtcGd0dyAlNCwgJTUgOyAwID4gfCUxLSUyfC0lMworJWVuZG1hY3JvCisKKyVtYWNybyBMT0FEX0FCIDQKKyAgICBtb3ZkICAgICAgICUxLCAlMworICAgIG1vdmQgICAgICAgJTIsICU0CisgICAgU1BMQVRXICAgICAlMSwgJTEKKyAgICBTUExBVFcgICAgICUyLCAlMgorJWVuZG1hY3JvCisKKzsgaW46ICAlMj10YyByZWcKKzsgb3V0OiAlMT1zcGxhdHRlZCB0YworJW1hY3JvIExPQURfVEMgMgorICAgIG1vdmQgICAgICAgICUxLCBbJTJdCisgICAgcHVucGNrbGJ3ICAgJTEsICUxCislaWYgbW1zaXplID09IDgKKyAgICBwc2h1ZncgICAgICAlMSwgJTEsIDAKKyVlbHNlCisgICAgcHNodWZsdyAgICAgJTEsICUxLCAwMTAxMDAwMGIKKyAgICBwc2h1ZmQgICAgICAlMSwgJTEsIDAxMDEwMDAwYgorJWVuZGlmCisgICAgcHNyYXcgICAgICAgJTEsIDYKKyVlbmRtYWNybworCis7IGluOiAlMT1wMSwgJTI9cDAsICUzPXEwLCAlND1xMQorOyAgICAgJTU9YWxwaGEsICU2PWJldGEsICU3LSU5PXRtcAorOyBvdXQ6ICU3PW1hc2sKKyVtYWNybyBMT0FEX01BU0sgOQorICAgIEFCU19TVUIgICAgICUyLCAlMywgJTUsICU4LCAlNyA7IHxwMC1xMHwgLSBhbHBoYQorICAgIEFCU19TVUIgICAgICUxLCAlMiwgJTYsICU5LCAlNyA7IHxwMS1wMHwgLSBiZXRhCisgICAgcGFuZCAgICAgICAgJTgsICU5CisgICAgQUJTX1NVQiAgICAgJTMsICU0LCAlNiwgJTksICU3IDsgfHExLXEwfCAtIGJldGEKKyAgICBweG9yICAgICAgICAlNywgJTcKKyAgICBwYW5kICAgICAgICAlOCwgJTkKKyAgICBwY21wZ3R3ICAgICAlNywgJTgKKyVlbmRtYWNybworCis7IGluOiAlMT1wMCwgJTI9cTAsICUzPXAxLCAlND1xMSwgJTU9bWFzaywgJTY9dG1wLCAlNz10bXAKKzsgb3V0OiAlMT1wMCcsIG0yPXEwJworJW1hY3JvIERFQkxPQ0tfUDBfUTAgNworICAgIHBzdWJ3ICAgJTMsICU0CisgICAgcHhvciAgICAlNywgJTcKKyAgICBwYWRkdyAgICUzLCBbcHdfNF0KKyAgICBwc3VidyAgICU3LCAlNQorICAgIHBzdWJ3ICAgJTYsICUyLCAlMQorICAgIHBzbGx3ICAgJTYsIDIKKyAgICBwYWRkdyAgICUzLCAlNgorICAgIHBzcmF3ICAgJTMsIDMKKyAgICBtb3ZhICAgICU2LCBbcHdfcGl4ZWxfbWF4XQorICAgIENMSVBXICAgJTMsICU3LCAlNQorICAgIHB4b3IgICAgJTcsICU3CisgICAgcGFkZHcgICAlMSwgJTMKKyAgICBwc3VidyAgICUyLCAlMworICAgIENMSVBXICAgJTEsICU3LCAlNgorICAgIENMSVBXICAgJTIsICU3LCAlNgorJWVuZG1hY3JvCisKKzsgaW46ICUxPXgyLCAlMj14MSwgJTM9cDAsICU0PXEwICU1PW1hc2smdGMsICU2PXRtcAorJW1hY3JvIExVTUFfUTEgNgorICAgIHBhdmd3ICAgICAgICU2LCAlMywgJTQgICAgICA7IChwMCtxMCsxKT4+MQorICAgIHBhZGR3ICAgICAgICUxLCAlNgorICAgIHB4b3IgICAgICAgICU2LCAlNgorICAgIHBzcmF3ICAgICAgICUxLCAxCisgICAgcHN1YncgICAgICAgJTYsICU1CisgICAgcHN1YncgICAgICAgJTEsICUyCisgICAgQ0xJUFcgICAgICAgJTEsICU2LCAlNQorICAgIHBhZGR3ICAgICAgICUxLCAlMgorJWVuZG1hY3JvCisKKyVtYWNybyBMVU1BX0RFQkxPQ0tfT05FIDMKKyAgICBESUZGX0xUICAgICBtNSwgJTEsIGJtLCBtNCwgbTYKKyAgICBweG9yICAgICAgICBtNiwgbTYKKyAgICBtb3ZhICAgICAgICAlMywgbTQKKyAgICBwY21wZ3R3ICAgICBtNiwgdGNtCisgICAgcGFuZCAgICAgICAgbTQsIHRjbQorICAgIHBhbmRuICAgICAgIG02LCBtNworICAgIHBhbmQgICAgICAgIG00LCBtNgorICAgIExVTUFfUTEgbTUsICUyLCBtMSwgbTIsIG00LCBtNgorJWVuZG1hY3JvCisKKyVtYWNybyBMVU1BX0hfU1RPUkUgMgorJWlmIG1tc2l6ZSA9PSA4CisgICAgbW92cSAgICAgICAgW3IwLTRdLCBtMAorICAgIG1vdnEgICAgICAgIFtyMCtyMS00XSwgbTEKKyAgICBtb3ZxICAgICAgICBbcjArcjEqMi00XSwgbTIKKyAgICBtb3ZxICAgICAgICBbcjArJTItNF0sIG0zCislZWxzZQorICAgIG1vdnEgICAgICAgIFtyMC00XSwgbTAKKyAgICBtb3ZocHMgICAgICBbcjArcjEtNF0sIG0wCisgICAgbW92cSAgICAgICAgW3IwK3IxKjItNF0sIG0xCisgICAgbW92aHBzICAgICAgWyUxLTRdLCBtMQorICAgIG1vdnEgICAgICAgIFslMStyMS00XSwgbTIKKyAgICBtb3ZocHMgICAgICBbJTErcjEqMi00XSwgbTIKKyAgICBtb3ZxICAgICAgICBbJTErJTItNF0sIG0zCisgICAgbW92aHBzICAgICAgWyUxK3IxKjQtNF0sIG0zCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gREVCTE9DS19MVU1BIDAKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2RlYmxvY2tfdl9sdW1hXzEwKHVpbnQxNl90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICp0YzApCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NnbG9iYWwgZGVibG9ja192X2x1bWFfMTAsIDUsNSw4KihtbXNpemUvMTYpCisgICAgJWFzc2lnbiBwYWQgNSptbXNpemUrMTItKHN0YWNrX29mZnNldCYxNSkKKyAgICAlZGVmaW5lIHRjbSBbcnNwXQorICAgICVkZWZpbmUgbXMxIFtyc3ArbW1zaXplXQorICAgICVkZWZpbmUgbXMyIFtyc3ArbW1zaXplKjJdCisgICAgJWRlZmluZSBhbSAgW3JzcCttbXNpemUqM10KKyAgICAlZGVmaW5lIGJtICBbcnNwK21tc2l6ZSo0XQorICAgIFNVQiAgICAgICAgcnNwLCBwYWQKKyAgICBzaGwgICAgICAgIHIyZCwgMgorICAgIHNobCAgICAgICAgcjNkLCAyCisgICAgTE9BRF9BQiAgICAgbTQsIG01LCByMmQsIHIzZAorICAgIG1vdiAgICAgICAgIHIzLCAzMi9tbXNpemUKKyAgICBtb3YgICAgICAgICByMiwgcjAKKyAgICBzdWIgICAgICAgICByMCwgcjEKKyAgICBtb3ZhICAgICAgICBhbSwgbTQKKyAgICBzdWIgICAgICAgICByMCwgcjEKKyAgICBtb3ZhICAgICAgICBibSwgbTUKKyAgICBzdWIgICAgICAgICByMCwgcjEKKy5sb29wOgorICAgIG1vdmEgICAgICAgIG0wLCBbcjArcjFdCisgICAgbW92YSAgICAgICAgbTEsIFtyMCtyMSoyXQorICAgIG1vdmEgICAgICAgIG0yLCBbcjJdCisgICAgbW92YSAgICAgICAgbTMsIFtyMityMV0KKworICAgIExPQURfTUFTSyAgIG0wLCBtMSwgbTIsIG0zLCBhbSwgYm0sIG03LCBtNCwgbTYKKyAgICBMT0FEX1RDICAgICBtNiwgcjQKKyAgICBtb3ZhICAgICAgIHRjbSwgbTYKKworICAgIG1vdmEgICAgICAgIG01LCBbcjBdCisgICAgTFVNQV9ERUJMT0NLX09ORSBtMSwgbTAsIG1zMQorICAgIG1vdmEgICBbcjArcjFdLCBtNQorCisgICAgbW92YSAgICAgICAgbTUsIFtyMityMSoyXQorICAgIExVTUFfREVCTE9DS19PTkUgbTIsIG0zLCBtczIKKyAgICBtb3ZhICAgW3IyK3IxXSwgbTUKKworICAgIHB4b3IgICAgICAgIG01LCBtNQorICAgIG1vdmEgICAgICAgIG02LCB0Y20KKyAgICBwY21wZ3R3ICAgICBtNSwgdGNtCisgICAgcHN1YncgICAgICAgbTYsIG1zMQorICAgIHBhbmRuICAgICAgIG01LCBtNworICAgIHBzdWJ3ICAgICAgIG02LCBtczIKKyAgICBwYW5kICAgICAgICBtNSwgbTYKKyAgICBERUJMT0NLX1AwX1EwIG0xLCBtMiwgbTAsIG0zLCBtNSwgbTcsIG02CisgICAgbW92YSBbcjArcjEqMl0sIG0xCisgICAgbW92YSAgICAgIFtyMl0sIG0yCisKKyAgICBhZGQgICAgICAgICByMCwgbW1zaXplCisgICAgYWRkICAgICAgICAgcjIsIG1tc2l6ZQorICAgIGFkZCAgICAgICAgIHI0LCBtbXNpemUvOAorICAgIGRlYyAgICAgICAgIHIzCisgICAgamcgLmxvb3AKKyAgICBBREQgICAgICAgICByc3AsIHBhZAorICAgIFJFVAorCitjZ2xvYmFsIGRlYmxvY2tfaF9sdW1hXzEwLCA1LDYsOCoobW1zaXplLzE2KQorICAgICVhc3NpZ24gcGFkIDcqbW1zaXplKzEyLShzdGFja19vZmZzZXQmMTUpCisgICAgJWRlZmluZSB0Y20gW3JzcF0KKyAgICAlZGVmaW5lIG1zMSBbcnNwK21tc2l6ZV0KKyAgICAlZGVmaW5lIG1zMiBbcnNwK21tc2l6ZSoyXQorICAgICVkZWZpbmUgcDFtIFtyc3ArbW1zaXplKjNdCisgICAgJWRlZmluZSBwMm0gW3JzcCttbXNpemUqNF0KKyAgICAlZGVmaW5lIGFtICBbcnNwK21tc2l6ZSo1XQorICAgICVkZWZpbmUgYm0gIFtyc3ArbW1zaXplKjZdCisgICAgU1VCICAgICAgICByc3AsIHBhZAorICAgIHNobCAgICAgICAgcjJkLCAyCisgICAgc2hsICAgICAgICByM2QsIDIKKyAgICBMT0FEX0FCICAgICBtNCwgbTUsIHIyZCwgcjNkCisgICAgbW92ICAgICAgICAgcjMsIHIxCisgICAgbW92YSAgICAgICAgYW0sIG00CisgICAgYWRkICAgICAgICAgcjMsIHIxCisgICAgbW92ICAgICAgICAgcjUsIDMyL21tc2l6ZQorICAgIG1vdmEgICAgICAgIGJtLCBtNQorICAgIGFkZCAgICAgICAgIHIzLCByMQorJWlmIG1tc2l6ZSA9PSAxNgorICAgIG1vdiAgICAgICAgIHIyLCByMAorICAgIGFkZCAgICAgICAgIHIyLCByMworJWVuZGlmCisubG9vcDoKKyVpZiBtbXNpemUgPT0gOAorICAgIG1vdnEgICAgICAgIG0yLCBbcjAtOF0gICAgIDsgeSBxMiBxMSBxMAorICAgIG1vdnEgICAgICAgIG03LCBbcjArMF0KKyAgICBtb3ZxICAgICAgICBtNSwgW3IwK3IxLThdCisgICAgbW92cSAgICAgICAgbTMsIFtyMCtyMSswXQorICAgIG1vdnEgICAgICAgIG0wLCBbcjArcjEqMi04XQorICAgIG1vdnEgICAgICAgIG02LCBbcjArcjEqMiswXQorICAgIG1vdnEgICAgICAgIG0xLCBbcjArcjMtOF0KKyAgICBUUkFOU1BPU0U0eDRXIDIsIDUsIDAsIDEsIDQKKyAgICBTV0FQICAgICAgICAgMiwgNworICAgIG1vdnEgICAgICAgIG03LCBbcjArcjNdCisgICAgVFJBTlNQT1NFNHg0VyAyLCAzLCA2LCA3LCA0CislZWxzZQorICAgIG1vdnUgICAgICAgIG01LCBbcjAtOF0gICAgIDsgeSBxMiBxMSBxMCBwMCBwMSBwMiB4CisgICAgbW92dSAgICAgICAgbTAsIFtyMCtyMS04XQorICAgIG1vdnUgICAgICAgIG0yLCBbcjArcjEqMi04XQorICAgIG1vdnUgICAgICAgIG0zLCBbcjItOF0KKyAgICBUUkFOU1BPU0U0eDRXIDUsIDAsIDIsIDMsIDYKKyAgICBtb3ZhICAgICAgIHRjbSwgbTMKKworICAgIG1vdnUgICAgICAgIG00LCBbcjIrcjEtOF0KKyAgICBtb3Z1ICAgICAgICBtMSwgW3IyK3IxKjItOF0KKyAgICBtb3Z1ICAgICAgICBtMywgW3IyK3IzLThdCisgICAgbW92dSAgICAgICAgbTcsIFtyMityMSo0LThdCisgICAgVFJBTlNQT1NFNHg0VyA0LCAxLCAzLCA3LCA2CisKKyAgICBtb3ZhICAgICAgICBtNiwgdGNtCisgICAgcHVucGNrbHFkcSAgbTYsIG03CisgICAgcHVucGNraHFkcSAgbTUsIG00CisgICAgU0JVVFRFUkZMWSBxZHEsIDAsIDEsIDcKKyAgICBTQlVUVEVSRkxZIHFkcSwgMiwgMywgNworJWVuZGlmCisKKyAgICBtb3ZhICAgICAgIHAybSwgbTYKKyAgICBMT0FEX01BU0sgICBtMCwgbTEsIG0yLCBtMywgYW0sIGJtLCBtNywgbTQsIG02CisgICAgTE9BRF9UQyAgICAgbTYsIHI0CisgICAgbW92YSAgICAgICB0Y20sIG02CisKKyAgICBMVU1BX0RFQkxPQ0tfT05FIG0xLCBtMCwgbXMxCisgICAgbW92YSAgICAgICBwMW0sIG01CisKKyAgICBtb3ZhICAgICAgICBtNSwgcDJtCisgICAgTFVNQV9ERUJMT0NLX09ORSBtMiwgbTMsIG1zMgorICAgIG1vdmEgICAgICAgcDJtLCBtNQorCisgICAgcHhvciAgICAgICAgbTUsIG01CisgICAgbW92YSAgICAgICAgbTYsIHRjbQorICAgIHBjbXBndHcgICAgIG01LCB0Y20KKyAgICBwc3VidyAgICAgICBtNiwgbXMxCisgICAgcGFuZG4gICAgICAgbTUsIG03CisgICAgcHN1YncgICAgICAgbTYsIG1zMgorICAgIHBhbmQgICAgICAgIG01LCBtNgorICAgIERFQkxPQ0tfUDBfUTAgbTEsIG0yLCBtMCwgbTMsIG01LCBtNywgbTYKKyAgICBtb3ZhICAgICAgICBtMCwgcDFtCisgICAgbW92YSAgICAgICAgbTMsIHAybQorICAgIFRSQU5TUE9TRTR4NFcgMCwgMSwgMiwgMywgNAorICAgIExVTUFfSF9TVE9SRSByMiwgcjMKKworICAgIGFkZCAgICAgICAgIHI0LCBtbXNpemUvOAorICAgIGxlYSAgICAgICAgIHIwLCBbcjArcjEqKG1tc2l6ZS8yKV0KKyAgICBsZWEgICAgICAgICByMiwgW3IyK3IxKihtbXNpemUvMildCisgICAgZGVjICAgICAgICAgcjUKKyAgICBqZyAubG9vcAorICAgIEFERCAgICAgICAgcnNwLCBwYWQKKyAgICBSRVQKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfNjQKKzsgaW46ICBtMD1wMSwgbTE9cDAsIG0yPXEwLCBtMz1xMSwgbTg9cDIsIG05PXEyCis7ICAgICAgbTEyPWFscGhhLCBtMTM9YmV0YQorOyBvdXQ6IG0wPXAxJywgbTM9cTEnLCBtMT1wMCcsIG0yPXEwJworOyBjbG9iYmVyczogbTQsIG01LCBtNiwgbTcsIG0xMCwgbTExLCBtMTQKKyVtYWNybyBERUJMT0NLX0xVTUFfSU5URVJfU1NFMiAwCisgICAgTE9BRF9NQVNLICAgbTAsIG0xLCBtMiwgbTMsIG0xMiwgbTEzLCBtNywgbTQsIG02CisgICAgTE9BRF9UQyAgICAgbTYsIHI0CisgICAgRElGRl9MVCAgICAgbTgsIG0xLCBtMTMsIG0xMCwgbTQKKyAgICBESUZGX0xUICAgICBtOSwgbTIsIG0xMywgbTExLCBtNAorICAgIHBhbmQgICAgICAgIG02LCBtNworCisgICAgbW92YSAgICAgICBtMTQsIG02CisgICAgcHhvciAgICAgICAgbTQsIG00CisgICAgcGNtcGd0dyAgICAgbTYsIG00CisgICAgcGFuZCAgICAgICAgbTYsIG0xNAorCisgICAgbW92YSAgICAgICAgbTUsIG0xMAorICAgIHBhbmQgICAgICAgIG01LCBtNgorICAgIExVTUFfUTEgbTgsIG0wLCBtMSwgbTIsIG01LCBtNAorCisgICAgbW92YSAgICAgICAgbTUsIG0xMQorICAgIHBhbmQgICAgICAgIG01LCBtNgorICAgIExVTUFfUTEgbTksIG0zLCBtMSwgbTIsIG01LCBtNAorCisgICAgcHhvciAgICAgICAgbTQsIG00CisgICAgcHN1YncgICAgICAgbTYsIG0xMAorICAgIHBjbXBndHcgICAgIG00LCBtMTQKKyAgICBwYW5kbiAgICAgICBtNCwgbTcKKyAgICBwc3VidyAgICAgICBtNiwgbTExCisgICAgcGFuZCAgICAgICAgbTQsIG02CisgICAgREVCTE9DS19QMF9RMCBtMSwgbTIsIG0wLCBtMywgbTQsIG01LCBtNgorCisgICAgU1dBUCAgICAgICAgIDAsIDgKKyAgICBTV0FQICAgICAgICAgMywgOQorJWVuZG1hY3JvCisKKyVtYWNybyBERUJMT0NLX0xVTUFfNjQgMAorY2dsb2JhbCBkZWJsb2NrX3ZfbHVtYV8xMCwgNSw1LDE1CisgICAgJWRlZmluZSBwMiBtOAorICAgICVkZWZpbmUgcDEgbTAKKyAgICAlZGVmaW5lIHAwIG0xCisgICAgJWRlZmluZSBxMCBtMgorICAgICVkZWZpbmUgcTEgbTMKKyAgICAlZGVmaW5lIHEyIG05CisgICAgJWRlZmluZSBtYXNrMCBtNworICAgICVkZWZpbmUgbWFzazEgbTEwCisgICAgJWRlZmluZSBtYXNrMiBtMTEKKyAgICBzaGwgICAgICAgIHIyZCwgMgorICAgIHNobCAgICAgICAgcjNkLCAyCisgICAgTE9BRF9BQiAgICBtMTIsIG0xMywgcjJkLCByM2QKKyAgICBtb3YgICAgICAgICByMiwgcjAKKyAgICBzdWIgICAgICAgICByMCwgcjEKKyAgICBzdWIgICAgICAgICByMCwgcjEKKyAgICBzdWIgICAgICAgICByMCwgcjEKKyAgICBtb3YgICAgICAgICByMywgMgorLmxvb3A6CisgICAgbW92YSAgICAgICAgcDIsIFtyMF0KKyAgICBtb3ZhICAgICAgICBwMSwgW3IwK3IxXQorICAgIG1vdmEgICAgICAgIHAwLCBbcjArcjEqMl0KKyAgICBtb3ZhICAgICAgICBxMCwgW3IyXQorICAgIG1vdmEgICAgICAgIHExLCBbcjIrcjFdCisgICAgbW92YSAgICAgICAgcTIsIFtyMityMSoyXQorICAgIERFQkxPQ0tfTFVNQV9JTlRFUl9TU0UyCisgICAgbW92YSAgIFtyMCtyMV0sIHAxCisgICAgbW92YSBbcjArcjEqMl0sIHAwCisgICAgbW92YSAgICAgIFtyMl0sIHEwCisgICAgbW92YSAgIFtyMityMV0sIHExCisgICAgYWRkICAgICAgICAgcjAsIG1tc2l6ZQorICAgIGFkZCAgICAgICAgIHIyLCBtbXNpemUKKyAgICBhZGQgICAgICAgICByNCwgMgorICAgIGRlYyAgICAgICAgIHIzCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCisKK2NnbG9iYWwgZGVibG9ja19oX2x1bWFfMTAsIDUsNywxNQorICAgIHNobCAgICAgICAgcjJkLCAyCisgICAgc2hsICAgICAgICByM2QsIDIKKyAgICBMT0FEX0FCICAgIG0xMiwgbTEzLCByMmQsIHIzZAorICAgIG1vdiAgICAgICAgIHIyLCByMQorICAgIGFkZCAgICAgICAgIHIyLCByMQorICAgIGFkZCAgICAgICAgIHIyLCByMQorICAgIG1vdiAgICAgICAgIHI1LCByMAorICAgIGFkZCAgICAgICAgIHI1LCByMgorICAgIG1vdiAgICAgICAgIHI2LCAyCisubG9vcDoKKyAgICBtb3Z1ICAgICAgICBtOCwgW3IwLThdICAgICA7IHkgcTIgcTEgcTAgcDAgcDEgcDIgeAorICAgIG1vdnUgICAgICAgIG0wLCBbcjArcjEtOF0KKyAgICBtb3Z1ICAgICAgICBtMiwgW3IwK3IxKjItOF0KKyAgICBtb3Z1ICAgICAgICBtOSwgW3I1LThdCisgICAgbW92dSAgICAgICAgbTUsIFtyNStyMS04XQorICAgIG1vdnUgICAgICAgIG0xLCBbcjUrcjEqMi04XQorICAgIG1vdnUgICAgICAgIG0zLCBbcjUrcjItOF0KKyAgICBtb3Z1ICAgICAgICBtNywgW3I1K3IxKjQtOF0KKworICAgIFRSQU5TUE9TRTR4NFcgOCwgMCwgMiwgOSwgMTAKKyAgICBUUkFOU1BPU0U0eDRXIDUsIDEsIDMsIDcsIDEwCisKKyAgICBwdW5wY2tocWRxICBtOCwgbTUKKyAgICBTQlVUVEVSRkxZIHFkcSwgMCwgMSwgMTAKKyAgICBTQlVUVEVSRkxZIHFkcSwgMiwgMywgMTAKKyAgICBwdW5wY2tscWRxICBtOSwgbTcKKworICAgIERFQkxPQ0tfTFVNQV9JTlRFUl9TU0UyCisKKyAgICBUUkFOU1BPU0U0eDRXIDAsIDEsIDIsIDMsIDQKKyAgICBMVU1BX0hfU1RPUkUgcjUsIHIyCisgICAgYWRkICAgICAgICAgcjQsIDIKKyAgICBsZWEgICAgICAgICByMCwgW3IwK3IxKjhdCisgICAgbGVhICAgICAgICAgcjUsIFtyNStyMSo4XQorICAgIGRlYyAgICAgICAgIHI2CisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorREVCTE9DS19MVU1BXzY0CislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorREVCTE9DS19MVU1BXzY0CislZW5kaWYKKyVlbmRpZgorCislbWFjcm8gU1dBUE1PVkEgMgorJWlmaWQgJTEKKyAgICBTV0FQICUxLCAlMgorJWVsc2UKKyAgICBtb3ZhICUxLCAlMgorJWVuZGlmCislZW5kbWFjcm8KKworOyBpbjogdDAtdDI6IHRtcCByZWdpc3RlcnMKKzsgICAgICUxPXAwICUyPXAxICUzPXAyICU0PXAzICU1PXEwICU2PXExICU3PW1hc2swCis7ICAgICAlOD1tYXNrMXAgJTk9MiAlMTA9cDAnICUxMT1wMScgJTEyPXAyJworJW1hY3JvIExVTUFfSU5UUkFfUDAxMiAxMiA7IHAwLi5wMyBpbiBtZW1vcnkKKyVpZiBBUkNIX1g4Nl82NAorICAgIHBhZGR3ICAgICB0MCwgJTMsICUyCisgICAgbW92YSAgICAgIHQyLCAlNAorICAgIHBhZGR3ICAgICB0MiwgJTMKKyVlbHNlCisgICAgbW92YSAgICAgIHQwLCAlMworICAgIG1vdmEgICAgICB0MiwgJTQKKyAgICBwYWRkdyAgICAgdDAsICUyCisgICAgcGFkZHcgICAgIHQyLCAlMworJWVuZGlmCisgICAgcGFkZHcgICAgIHQwLCAlMQorICAgIHBhZGR3ICAgICB0MiwgdDIKKyAgICBwYWRkdyAgICAgdDAsICU1CisgICAgcGFkZHcgICAgIHQyLCAlOQorICAgIHBhZGR3ICAgICB0MCwgJTkgICAgOyAocDIgKyBwMSArIHAwICsgcTAgKyAyKQorICAgIHBhZGR3ICAgICB0MiwgdDAgICAgOyAoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KQorCisgICAgcHNybHcgICAgIHQyLCAzCisgICAgcHNybHcgICAgIHQxLCB0MCwgMgorICAgIHBzdWJ3ICAgICB0MiwgJTMKKyAgICBwc3VidyAgICAgdDEsICUyCisgICAgcGFuZCAgICAgIHQyLCAlOAorICAgIHBhbmQgICAgICB0MSwgJTgKKyAgICBwYWRkdyAgICAgdDIsICUzCisgICAgcGFkZHcgICAgIHQxLCAlMgorICAgIFNXQVBNT1ZBICUxMSwgdDEKKworICAgIHBzdWJ3ICAgICB0MSwgdDAsICUzCisgICAgcGFkZHcgICAgIHQwLCB0MAorICAgIHBzdWJ3ICAgICB0MSwgJTUKKyAgICBwc3VidyAgICAgdDAsICUzCisgICAgcGFkZHcgICAgIHQxLCAlNgorICAgIHBhZGR3ICAgICB0MSwgJTIKKyAgICBwYWRkdyAgICAgdDAsICU2CisgICAgcHNybHcgICAgIHQxLCAyICAgICA7ICgyKnAxICsgcDAgKyBxMSArIDIpLzQKKyAgICBwc3JsdyAgICAgdDAsIDMgICAgIDsgKHAyICsgMipwMSArIDIqcDAgKyAyKnEwICsgcTEgKyA0KT4+MworCisgICAgcHhvciAgICAgIHQwLCB0MQorICAgIHB4b3IgICAgICB0MSwgJTEKKyAgICBwYW5kICAgICAgdDAsICU4CisgICAgcGFuZCAgICAgIHQxLCAlNworICAgIHB4b3IgICAgICB0MCwgdDEKKyAgICBweG9yICAgICAgdDAsICUxCisgICAgU1dBUE1PVkEgJTEwLCB0MAorICAgIFNXQVBNT1ZBICUxMiwgdDIKKyVlbmRtYWNybworCislbWFjcm8gTFVNQV9JTlRSQV9JTklUIDEKKyAgICAleGRlZmluZSBwYWQgJTEqbW1zaXplKygoZ3Byc2l6ZSozKSAlIG1tc2l6ZSktKHN0YWNrX29mZnNldCYxNSkKKyAgICAlZGVmaW5lIHQwIG00CisgICAgJWRlZmluZSB0MSBtNQorICAgICVkZWZpbmUgdDIgbTYKKyAgICAlZGVmaW5lIHQzIG03CisgICAgJWFzc2lnbiBpIDQKKyVyZXAgJTEKKyAgICBDQVRfWERFRklORSB0LCBpLCBbcnNwK21tc2l6ZSooaS00KV0KKyAgICAlYXNzaWduIGkgaSsxCislZW5kcmVwCisgICAgU1VCICAgIHJzcCwgcGFkCislZW5kbWFjcm8KKworOyBpbjogJTEtJTM9dG1wLCAlND1wMiwgJTU9cTIKKyVtYWNybyBMVU1BX0lOVFJBX0lOVEVSIDUKKyAgICBMT0FEX0FCIHQwLCB0MSwgcjJkLCByM2QKKyAgICBtb3ZhICAgICUxLCB0MAorICAgIExPQURfTUFTSyBtMCwgbTEsIG0yLCBtMywgJTEsIHQxLCB0MCwgdDIsIHQzCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZhICAgICUyLCB0MCAgICAgICAgOyBtYXNrMAorICAgIHBzcmx3ICAgdDMsICUxLCAyCislZWxzZQorICAgIG1vdmEgICAgdDMsICUxCisgICAgbW92YSAgICAlMiwgdDAgICAgICAgIDsgbWFzazAKKyAgICBwc3JsdyAgIHQzLCAyCislZW5kaWYKKyAgICBwYWRkdyAgIHQzLCBbcHdfMl0gICAgOyBhbHBoYS80KzIKKyAgICBESUZGX0xUIG0xLCBtMiwgdDMsIHQyLCB0MCA7IHQyID0gfHAwLXEwfCA8IGFscGhhLzQrMgorICAgIHBhbmQgICAgdDIsICUyCisgICAgbW92YSAgICB0MywgJTUgICAgICAgIDsgcTIKKyAgICBtb3ZhICAgICUxLCB0MiAgICAgICAgOyBtYXNrMQorICAgIERJRkZfTFQgdDMsIG0yLCB0MSwgdDIsIHQwIDsgdDIgPSB8cTItcTB8IDwgYmV0YQorICAgIHBhbmQgICAgdDIsICUxCisgICAgbW92YSAgICB0MywgJTQgICAgICAgIDsgcDIKKyAgICBtb3ZhICAgICUzLCB0MiAgICAgICAgOyBtYXNrMXEKKyAgICBESUZGX0xUIHQzLCBtMSwgdDEsIHQyLCB0MCA7IHQyID0gfHAyLXAwfCA8IGJldGEKKyAgICBwYW5kICAgIHQyLCAlMQorICAgIG1vdmEgICAgJTEsIHQyICAgICAgICA7IG1hc2sxcAorJWVuZG1hY3JvCisKKyVtYWNybyBMVU1BX0hfSU5UUkFfTE9BRCAwCislaWYgbW1zaXplID09IDgKKyAgICBtb3Z1ICAgIHQwLCBbcjAtOF0KKyAgICBtb3Z1ICAgIHQxLCBbcjArcjEtOF0KKyAgICBtb3Z1ICAgIG0wLCBbcjArcjEqMi04XQorICAgIG1vdnUgICAgbTEsIFtyMCtyNC04XQorICAgIFRSQU5TUE9TRTR4NFcgNCwgNSwgMCwgMSwgMgorICAgIG1vdmEgICAgdDQsIHQwICAgICAgICA7IHAzCisgICAgbW92YSAgICB0NSwgdDEgICAgICAgIDsgcDIKKworICAgIG1vdnUgICAgbTIsIFtyMF0KKyAgICBtb3Z1ICAgIG0zLCBbcjArcjFdCisgICAgbW92dSAgICB0MCwgW3IwK3IxKjJdCisgICAgbW92dSAgICB0MSwgW3IwK3I0XQorICAgIFRSQU5TUE9TRTR4NFcgMiwgMywgNCwgNSwgNgorICAgIG1vdmEgICAgdDYsIHQwICAgICAgICA7IHEyCisgICAgbW92YSAgICB0NywgdDEgICAgICAgIDsgcTMKKyVlbHNlCisgICAgbW92dSAgICB0MCwgW3IwLThdCisgICAgbW92dSAgICB0MSwgW3IwK3IxLThdCisgICAgbW92dSAgICBtMCwgW3IwK3IxKjItOF0KKyAgICBtb3Z1ICAgIG0xLCBbcjArcjUtOF0KKyAgICBtb3Z1ICAgIG0yLCBbcjQtOF0KKyAgICBtb3Z1ICAgIG0zLCBbcjQrcjEtOF0KKyAgICBtb3Z1ICAgIHQyLCBbcjQrcjEqMi04XQorICAgIG1vdnUgICAgdDMsIFtyNCtyNS04XQorICAgIFRSQU5TUE9TRTh4OFcgNCwgNSwgMCwgMSwgMiwgMywgNiwgNywgdDQsIHQ1CisgICAgbW92YSAgICB0NCwgdDAgICAgICAgIDsgcDMKKyAgICBtb3ZhICAgIHQ1LCB0MSAgICAgICAgOyBwMgorICAgIG1vdmEgICAgdDYsIHQyICAgICAgICA7IHEyCisgICAgbW92YSAgICB0NywgdDMgICAgICAgIDsgcTMKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgaW46ICUxPXEzICUyPXEyJyAlMz1xMScgJTQ9cTAnICU1PXAwJyAlNj1wMScgJTc9cDInICU4PXAzICU5PXRtcAorJW1hY3JvIExVTUFfSF9JTlRSQV9TVE9SRSA5CislaWYgbW1zaXplID09IDgKKyAgICBUUkFOU1BPU0U0eDRXICUxLCAlMiwgJTMsICU0LCAlOQorICAgIG1vdnEgICAgICAgW3IwLThdLCBtJTEKKyAgICBtb3ZxICAgICAgIFtyMCtyMS04XSwgbSUyCisgICAgbW92cSAgICAgICBbcjArcjEqMi04XSwgbSUzCisgICAgbW92cSAgICAgICBbcjArcjQtOF0sIG0lNAorICAgIG1vdnEgICAgICAgbSUxLCAlOAorICAgIFRSQU5TUE9TRTR4NFcgJTUsICU2LCAlNywgJTEsICU5CisgICAgbW92cSAgICAgICBbcjBdLCBtJTUKKyAgICBtb3ZxICAgICAgIFtyMCtyMV0sIG0lNgorICAgIG1vdnEgICAgICAgW3IwK3IxKjJdLCBtJTcKKyAgICBtb3ZxICAgICAgIFtyMCtyNF0sIG0lMQorJWVsc2UKKyAgICBUUkFOU1BPU0UyeDR4NFcgJTEsICUyLCAlMywgJTQsICU5CisgICAgbW92cSAgICAgICBbcjAtOF0sIG0lMQorICAgIG1vdnEgICAgICAgW3IwK3IxLThdLCBtJTIKKyAgICBtb3ZxICAgICAgIFtyMCtyMSoyLThdLCBtJTMKKyAgICBtb3ZxICAgICAgIFtyMCtyNS04XSwgbSU0CisgICAgbW92aHBzICAgICBbcjQtOF0sIG0lMQorICAgIG1vdmhwcyAgICAgW3I0K3IxLThdLCBtJTIKKyAgICBtb3ZocHMgICAgIFtyNCtyMSoyLThdLCBtJTMKKyAgICBtb3ZocHMgICAgIFtyNCtyNS04XSwgbSU0CislaWZudW0gJTgKKyAgICBTV0FQICAgICAgICUxLCAlOAorJWVsc2UKKyAgICBtb3ZhICAgICAgIG0lMSwgJTgKKyVlbmRpZgorICAgIFRSQU5TUE9TRTJ4NHg0VyAlNSwgJTYsICU3LCAlMSwgJTkKKyAgICBtb3ZxICAgICAgIFtyMF0sIG0lNQorICAgIG1vdnEgICAgICAgW3IwK3IxXSwgbSU2CisgICAgbW92cSAgICAgICBbcjArcjEqMl0sIG0lNworICAgIG1vdnEgICAgICAgW3IwK3I1XSwgbSUxCisgICAgbW92aHBzICAgICBbcjRdLCBtJTUKKyAgICBtb3ZocHMgICAgIFtyNCtyMV0sIG0lNgorICAgIG1vdmhwcyAgICAgW3I0K3IxKjJdLCBtJTcKKyAgICBtb3ZocHMgICAgIFtyNCtyNV0sIG0lMQorJWVuZGlmCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzY0Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9kZWJsb2NrX3ZfbHVtYV9pbnRyYV8xMCh1aW50MTZfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBERUJMT0NLX0xVTUFfSU5UUkFfNjQgMAorY2dsb2JhbCBkZWJsb2NrX3ZfbHVtYV9pbnRyYV8xMCwgNCw3LDE2CisgICAgJWRlZmluZSB0MCBtMQorICAgICVkZWZpbmUgdDEgbTIKKyAgICAlZGVmaW5lIHQyIG00CisgICAgJWRlZmluZSBwMiBtOAorICAgICVkZWZpbmUgcDEgbTkKKyAgICAlZGVmaW5lIHAwIG0xMAorICAgICVkZWZpbmUgcTAgbTExCisgICAgJWRlZmluZSBxMSBtMTIKKyAgICAlZGVmaW5lIHEyIG0xMworICAgICVkZWZpbmUgYWEgbTUKKyAgICAlZGVmaW5lIGJiIG0xNAorICAgIGxlYSAgICAgcjQsIFtyMSo0XQorICAgIGxlYSAgICAgcjUsIFtyMSozXSA7IDMqc3RyaWRlCisgICAgbmVnICAgICByNAorICAgIGFkZCAgICAgcjQsIHIwICAgICA7IHBpeC00KnN0cmlkZQorICAgIG1vdiAgICAgcjYsIDIKKyAgICBtb3ZhICAgIG0wLCBbcHdfMl0KKyAgICBzaGwgICAgcjJkLCAyCisgICAgc2hsICAgIHIzZCwgMgorICAgIExPQURfQUIgYWEsIGJiLCByMmQsIHIzZAorLmxvb3A6CisgICAgbW92YSAgICBwMiwgW3I0K3IxXQorICAgIG1vdmEgICAgcDEsIFtyNCsyKnIxXQorICAgIG1vdmEgICAgcDAsIFtyNCtyNV0KKyAgICBtb3ZhICAgIHEwLCBbcjBdCisgICAgbW92YSAgICBxMSwgW3IwK3IxXQorICAgIG1vdmEgICAgcTIsIFtyMCsyKnIxXQorCisgICAgTE9BRF9NQVNLIHAxLCBwMCwgcTAsIHExLCBhYSwgYmIsIG0zLCB0MCwgdDEKKyAgICBtb3ZhICAgIHQyLCBhYQorICAgIHBzcmx3ICAgdDIsIDIKKyAgICBwYWRkdyAgIHQyLCBtMCA7IGFscGhhLzQrMgorICAgIERJRkZfTFQgcDAsIHEwLCB0MiwgbTYsIHQwIDsgbTYgPSB8cDAtcTB8IDwgYWxwaGEvNCsyCisgICAgRElGRl9MVCBwMiwgcDAsIGJiLCB0MSwgdDAgOyBtNyA9IHxwMi1wMHwgPCBiZXRhCisgICAgRElGRl9MVCBxMiwgcTAsIGJiLCBtNywgdDAgOyB0MSA9IHxxMi1xMHwgPCBiZXRhCisgICAgcGFuZCAgICBtNiwgbTMKKyAgICBwYW5kICAgIG03LCBtNgorICAgIHBhbmQgICAgbTYsIHQxCisgICAgTFVNQV9JTlRSQV9QMDEyIHAwLCBwMSwgcDIsIFtyNF0sIHEwLCBxMSwgbTMsIG02LCBtMCwgW3I0K3I1XSwgW3I0KzIqcjFdLCBbcjQrcjFdCisgICAgTFVNQV9JTlRSQV9QMDEyIHEwLCBxMSwgcTIsIFtyMCtyNV0sIHAwLCBwMSwgbTMsIG03LCBtMCwgW3IwXSwgW3IwK3IxXSwgW3IwKzIqcjFdCisgICAgYWRkICAgICByMCwgbW1zaXplCisgICAgYWRkICAgICByNCwgbW1zaXplCisgICAgZGVjICAgICByNgorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9kZWJsb2NrX2hfbHVtYV9pbnRyYV8xMCh1aW50MTZfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NnbG9iYWwgZGVibG9ja19oX2x1bWFfaW50cmFfMTAsIDQsNywxNgorICAgICVkZWZpbmUgdDAgbTE1CisgICAgJWRlZmluZSB0MSBtMTQKKyAgICAlZGVmaW5lIHQyIG0yCisgICAgJWRlZmluZSBxMyBtNQorICAgICVkZWZpbmUgcTIgbTgKKyAgICAlZGVmaW5lIHExIG05CisgICAgJWRlZmluZSBxMCBtMTAKKyAgICAlZGVmaW5lIHAwIG0xMQorICAgICVkZWZpbmUgcDEgbTEyCisgICAgJWRlZmluZSBwMiBtMTMKKyAgICAlZGVmaW5lIHAzIG00CisgICAgJWRlZmluZSBzcGlsbCBbcnNwXQorICAgICVhc3NpZ24gcGFkIDI0LShzdGFja19vZmZzZXQmMTUpCisgICAgU1VCICAgICByc3AsIHBhZAorICAgIGxlYSAgICAgcjQsIFtyMSo0XQorICAgIGxlYSAgICAgcjUsIFtyMSozXSA7IDMqc3RyaWRlCisgICAgYWRkICAgICByNCwgcjAgICAgIDsgcGl4KzQqc3RyaWRlCisgICAgbW92ICAgICByNiwgMgorICAgIG1vdmEgICAgbTAsIFtwd18yXQorICAgIHNobCAgICByMmQsIDIKKyAgICBzaGwgICAgcjNkLCAyCisubG9vcDoKKyAgICBtb3Z1ICAgIHEzLCBbcjAtOF0KKyAgICBtb3Z1ICAgIHEyLCBbcjArcjEtOF0KKyAgICBtb3Z1ICAgIHExLCBbcjArcjEqMi04XQorICAgIG1vdnUgICAgcTAsIFtyMCtyNS04XQorICAgIG1vdnUgICAgcDAsIFtyNC04XQorICAgIG1vdnUgICAgcDEsIFtyNCtyMS04XQorICAgIG1vdnUgICAgcDIsIFtyNCtyMSoyLThdCisgICAgbW92dSAgICBwMywgW3I0K3I1LThdCisgICAgVFJBTlNQT1NFOHg4VyA1LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgNCwgMQorCisgICAgTE9BRF9BQiBtMSwgbTIsIHIyZCwgcjNkCisgICAgTE9BRF9NQVNLIHExLCBxMCwgcDAsIHAxLCBtMSwgbTIsIG0zLCB0MCwgdDEKKyAgICBwc3JsdyAgIG0xLCAyCisgICAgcGFkZHcgICBtMSwgbTAgOyBhbHBoYS80KzIKKyAgICBESUZGX0xUIHAwLCBxMCwgbTEsIG02LCB0MCA7IG02ID0gfHAwLXEwfCA8IGFscGhhLzQrMgorICAgIERJRkZfTFQgcTIsIHEwLCBtMiwgdDEsIHQwIDsgdDEgPSB8cTItcTB8IDwgYmV0YQorICAgIERJRkZfTFQgcDAsIHAyLCBtMiwgbTcsIHQwIDsgbTcgPSB8cDItcDB8IDwgYmV0YQorICAgIHBhbmQgICAgbTYsIG0zCisgICAgcGFuZCAgICBtNywgbTYKKyAgICBwYW5kICAgIG02LCB0MQorCisgICAgbW92YSBzcGlsbCwgcTMKKyAgICBMVU1BX0lOVFJBX1AwMTIgcTAsIHExLCBxMiwgcTMsIHAwLCBwMSwgbTMsIG02LCBtMCwgbTUsIG0xLCBxMgorICAgIExVTUFfSU5UUkFfUDAxMiBwMCwgcDEsIHAyLCBwMywgcTAsIHExLCBtMywgbTcsIG0wLCBwMCwgbTYsIHAyCisgICAgbW92YSAgICBtNywgc3BpbGwKKworICAgIExVTUFfSF9JTlRSQV9TVE9SRSA3LCA4LCAxLCA1LCAxMSwgNiwgMTMsIDQsIDE0CisKKyAgICBsZWEgICAgIHIwLCBbcjArcjEqOF0KKyAgICBsZWEgICAgIHI0LCBbcjQrcjEqOF0KKyAgICBkZWMgICAgIHI2CisgICAgamcgLmxvb3AKKyAgICBBREQgICAgcnNwLCBwYWQKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitERUJMT0NLX0xVTUFfSU5UUkFfNjQKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitERUJMT0NLX0xVTUFfSU5UUkFfNjQKKyVlbmRpZgorCislZW5kaWYKKworJW1hY3JvIERFQkxPQ0tfTFVNQV9JTlRSQSAwCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9kZWJsb2NrX3ZfbHVtYV9pbnRyYV8xMCh1aW50MTZfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NnbG9iYWwgZGVibG9ja192X2x1bWFfaW50cmFfMTAsIDQsNyw4KihtbXNpemUvMTYpCisgICAgTFVNQV9JTlRSQV9JTklUIDMKKyAgICBsZWEgICAgIHI0LCBbcjEqNF0KKyAgICBsZWEgICAgIHI1LCBbcjEqM10KKyAgICBuZWcgICAgIHI0CisgICAgYWRkICAgICByNCwgcjAKKyAgICBtb3YgICAgIHI2LCAzMi9tbXNpemUKKyAgICBzaGwgICAgcjJkLCAyCisgICAgc2hsICAgIHIzZCwgMgorLmxvb3A6CisgICAgbW92YSAgICBtMCwgW3I0K3IxKjJdIDsgcDEKKyAgICBtb3ZhICAgIG0xLCBbcjQrcjVdICAgOyBwMAorICAgIG1vdmEgICAgbTIsIFtyMF0gICAgICA7IHEwCisgICAgbW92YSAgICBtMywgW3IwK3IxXSAgIDsgcTEKKyAgICBMVU1BX0lOVFJBX0lOVEVSIHQ0LCB0NSwgdDYsIFtyNCtyMV0sIFtyMCtyMSoyXQorICAgIExVTUFfSU5UUkFfUDAxMiBtMSwgbTAsIHQzLCBbcjRdLCBtMiwgbTMsIHQ1LCB0NCwgW3B3XzJdLCBbcjQrcjVdLCBbcjQrMipyMV0sIFtyNCtyMV0KKyAgICBtb3ZhICAgIHQzLCBbcjArcjEqMl0gOyBxMgorICAgIExVTUFfSU5UUkFfUDAxMiBtMiwgbTMsIHQzLCBbcjArcjVdLCBtMSwgbTAsIHQ1LCB0NiwgW3B3XzJdLCBbcjBdLCBbcjArcjFdLCBbcjArMipyMV0KKyAgICBhZGQgICAgIHIwLCBtbXNpemUKKyAgICBhZGQgICAgIHI0LCBtbXNpemUKKyAgICBkZWMgICAgIHI2CisgICAgamcgLmxvb3AKKyAgICBBREQgICAgcnNwLCBwYWQKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZGVibG9ja19oX2x1bWFfaW50cmFfMTAodWludDE2X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXRhKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjZ2xvYmFsIGRlYmxvY2tfaF9sdW1hX2ludHJhXzEwLCA0LDcsOCoobW1zaXplLzE2KQorICAgIExVTUFfSU5UUkFfSU5JVCA4CislaWYgbW1zaXplID09IDgKKyAgICBsZWEgICAgIHI0LCBbcjEqM10KKyAgICBtb3YgICAgIHI1LCAzMi9tbXNpemUKKyVlbHNlCisgICAgbGVhICAgICByNCwgW3IxKjRdCisgICAgbGVhICAgICByNSwgW3IxKjNdIDsgMypzdHJpZGUKKyAgICBhZGQgICAgIHI0LCByMCAgICAgOyBwaXgrNCpzdHJpZGUKKyAgICBtb3YgICAgIHI2LCAzMi9tbXNpemUKKyVlbmRpZgorICAgIHNobCAgICByMmQsIDIKKyAgICBzaGwgICAgcjNkLCAyCisubG9vcDoKKyAgICBMVU1BX0hfSU5UUkFfTE9BRAorICAgIExVTUFfSU5UUkFfSU5URVIgdDgsIHQ5LCB0MTAsIHQ1LCB0NgorCisgICAgTFVNQV9JTlRSQV9QMDEyIG0xLCBtMCwgdDMsIHQ0LCBtMiwgbTMsIHQ5LCB0OCwgW3B3XzJdLCB0OCwgdDUsIHQxMQorICAgIG1vdmEgICAgdDMsIHQ2ICAgICA7IHEyCisgICAgTFVNQV9JTlRSQV9QMDEyIG0yLCBtMywgdDMsIHQ3LCBtMSwgbTAsIHQ5LCB0MTAsIFtwd18yXSwgbTQsIHQ2LCBtNQorCisgICAgbW92YSAgICBtMiwgdDQKKyAgICBtb3ZhICAgIG0wLCB0MTEKKyAgICBtb3ZhICAgIG0xLCB0NQorICAgIG1vdmEgICAgbTMsIHQ4CisgICAgbW92YSAgICBtNiwgdDYKKworICAgIExVTUFfSF9JTlRSQV9TVE9SRSAyLCAwLCAxLCAzLCA0LCA2LCA1LCB0NywgNworCisgICAgbGVhICAgICByMCwgW3IwK3IxKihtbXNpemUvMildCislaWYgbW1zaXplID09IDgKKyAgICBkZWMgICAgIHI1CislZWxzZQorICAgIGxlYSAgICAgcjQsIFtyNCtyMSoobW1zaXplLzIpXQorICAgIGRlYyAgICAgcjYKKyVlbmRpZgorICAgIGpnIC5sb29wCisgICAgQUREICAgIHJzcCwgcGFkCisgICAgUkVUCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzY0ID09IDAKK0lOSVRfTU1YIG1teGV4dAorREVCTE9DS19MVU1BCitERUJMT0NLX0xVTUFfSU5UUkEKK0lOSVRfWE1NIHNzZTIKK0RFQkxPQ0tfTFVNQQorREVCTE9DS19MVU1BX0lOVFJBCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorREVCTE9DS19MVU1BCitERUJMT0NLX0xVTUFfSU5UUkEKKyVlbmRpZgorJWVuZGlmCisKKzsgaW46ICUxPXAwLCAlMj1xMCwgJTM9cDEsICU0PXExLCAlNT1tYXNrLCAlNj10bXAsICU3PXRtcAorOyBvdXQ6ICUxPXAwJywgJTI9cTAnCislbWFjcm8gQ0hST01BX0RFQkxPQ0tfUDBfUTBfSU5UUkEgNworICAgIG1vdmEgICAgJTYsIFtwd18yXQorICAgIHBhZGR3ICAgJTYsICUzCisgICAgcGFkZHcgICAlNiwgJTQKKyAgICBwYWRkdyAgICU3LCAlNiwgJTIKKyAgICBwYWRkdyAgICU2LCAlMQorICAgIHBhZGR3ICAgJTYsICUzCisgICAgcGFkZHcgICAlNywgJTQKKyAgICBwc3JhdyAgICU2LCAyCisgICAgcHNyYXcgICAlNywgMgorICAgIHBzdWJ3ICAgJTYsICUxCisgICAgcHN1YncgICAlNywgJTIKKyAgICBwYW5kICAgICU2LCAlNQorICAgIHBhbmQgICAgJTcsICU1CisgICAgcGFkZHcgICAlMSwgJTYKKyAgICBwYWRkdyAgICUyLCAlNworJWVuZG1hY3JvCisKKyVtYWNybyBDSFJPTUFfVl9MT0FEIDEKKyAgICBtb3ZhICAgICAgICBtMCwgW3IwXSAgICA7IHAxCisgICAgbW92YSAgICAgICAgbTEsIFtyMCtyMV0gOyBwMAorICAgIG1vdmEgICAgICAgIG0yLCBbJTFdICAgIDsgcTAKKyAgICBtb3ZhICAgICAgICBtMywgWyUxK3IxXSA7IHExCislZW5kbWFjcm8KKworJW1hY3JvIENIUk9NQV9WX1NUT1JFIDAKKyAgICBtb3ZhIFtyMCsxKnIxXSwgbTEKKyAgICBtb3ZhIFtyMCsyKnIxXSwgbTIKKyVlbmRtYWNybworCislbWFjcm8gQ0hST01BX1ZfTE9BRF9UQyAyCisgICAgbW92ZCAgICAgICAgJTEsIFslMl0KKyAgICBwdW5wY2tsYncgICAlMSwgJTEKKyAgICBwdW5wY2tsd2QgICAlMSwgJTEKKyAgICBwc3JhdyAgICAgICAlMSwgNgorJWVuZG1hY3JvCisKKyVtYWNybyBERUJMT0NLX0NIUk9NQSAwCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9kZWJsb2NrX3ZfY2hyb21hXzEwKHVpbnQxNl90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnRjMCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2dsb2JhbCBkZWJsb2NrX3ZfY2hyb21hXzEwLCA1LDctKG1tc2l6ZS8xNiksOCoobW1zaXplLzE2KQorICAgIG1vdiAgICAgICAgIHI1LCByMAorICAgIHN1YiAgICAgICAgIHIwLCByMQorICAgIHN1YiAgICAgICAgIHIwLCByMQorICAgIHNobCAgICAgICAgcjJkLCAyCisgICAgc2hsICAgICAgICByM2QsIDIKKyVpZiBtbXNpemUgPCAxNgorICAgIG1vdiAgICAgICAgIHI2LCAxNi9tbXNpemUKKy5sb29wOgorJWVuZGlmCisgICAgQ0hST01BX1ZfTE9BRCByNQorICAgIExPQURfQUIgICAgIG00LCBtNSwgcjJkLCByM2QKKyAgICBMT0FEX01BU0sgICBtMCwgbTEsIG0yLCBtMywgbTQsIG01LCBtNywgbTYsIG00CisgICAgcHhvciAgICAgICAgbTQsIG00CisgICAgQ0hST01BX1ZfTE9BRF9UQyBtNiwgcjQKKyAgICBwc3VidyAgICAgICBtNiwgW3B3XzNdCisgICAgcG1heHN3ICAgICAgbTYsIG00CisgICAgcGFuZCAgICAgICAgbTcsIG02CisgICAgREVCTE9DS19QMF9RMCBtMSwgbTIsIG0wLCBtMywgbTcsIG01LCBtNgorICAgIENIUk9NQV9WX1NUT1JFCislaWYgbW1zaXplIDwgMTYKKyAgICBhZGQgICAgICAgICByMCwgbW1zaXplCisgICAgYWRkICAgICAgICAgcjUsIG1tc2l6ZQorICAgIGFkZCAgICAgICAgIHI0LCBtbXNpemUvNAorICAgIGRlYyAgICAgICAgIHI2CisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZWxzZQorICAgIFJFVAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2RlYmxvY2tfdl9jaHJvbWFfaW50cmFfMTAodWludDE2X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NnbG9iYWwgZGVibG9ja192X2Nocm9tYV9pbnRyYV8xMCwgNCw2LShtbXNpemUvMTYpLDgqKG1tc2l6ZS8xNikKKyAgICBtb3YgICAgICAgICByNCwgcjAKKyAgICBzdWIgICAgICAgICByMCwgcjEKKyAgICBzdWIgICAgICAgICByMCwgcjEKKyAgICBzaGwgICAgICAgIHIyZCwgMgorICAgIHNobCAgICAgICAgcjNkLCAyCislaWYgbW1zaXplIDwgMTYKKyAgICBtb3YgICAgICAgICByNSwgMTYvbW1zaXplCisubG9vcDoKKyVlbmRpZgorICAgIENIUk9NQV9WX0xPQUQgcjQKKyAgICBMT0FEX0FCICAgICBtNCwgbTUsIHIyZCwgcjNkCisgICAgTE9BRF9NQVNLICAgbTAsIG0xLCBtMiwgbTMsIG00LCBtNSwgbTcsIG02LCBtNAorICAgIENIUk9NQV9ERUJMT0NLX1AwX1EwX0lOVFJBIG0xLCBtMiwgbTAsIG0zLCBtNywgbTUsIG02CisgICAgQ0hST01BX1ZfU1RPUkUKKyVpZiBtbXNpemUgPCAxNgorICAgIGFkZCAgICAgICAgIHIwLCBtbXNpemUKKyAgICBhZGQgICAgICAgICByNCwgbW1zaXplCisgICAgZGVjICAgICAgICAgcjUKKyAgICBqZyAubG9vcAorICAgIFJFUF9SRVQKKyVlbHNlCisgICAgUkVUCislZW5kaWYKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfNjQgPT0gMAorSU5JVF9NTVggbW14ZXh0CitERUJMT0NLX0NIUk9NQQorJWVuZGlmCitJTklUX1hNTSBzc2UyCitERUJMT0NLX0NIUk9NQQorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0RFQkxPQ0tfQ0hST01BCislZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X2kzODYuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X2kzODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWFkMGUwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfaTM4Ni5oCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZW5jb2Rlci9kZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgY29kZWMuCisgKiBub24tTU1YIGkzODYtc3BlY2lmaWMgb3B0aW1pemF0aW9ucyBmb3IgSC4yNjQKKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaWZuZGVmIEFWQ09ERUNfWDg2X0gyNjRfSTM4Nl9ICisjZGVmaW5lIEFWQ09ERUNfWDg2X0gyNjRfSTM4Nl9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvY2FiYWMuaCIKKyNpbmNsdWRlICJjYWJhYy5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKKyNpZiBBUkNIX1g4Nl82NAorI2RlZmluZSBSRUc2NCAiciIKKyNlbHNlCisjZGVmaW5lIFJFRzY0ICJtIgorI2VuZGlmCisKKy8vRklYTUUgdXNlIHNvbWUgbWFjcm9zIHRvIGF2b2lkIGR1cGxpY2F0aW5nIGdldF9jYWJhYyAoY2Fubm90IGJlIGRvbmUgeWV0CisvL2FzIHRoYXQgd291bGQgbWFrZSBvcHRpbWl6YXRpb24gd29yayBoYXJkKQorI2lmIEhBVkVfN1JFR1MgJiYgIUJST0tFTl9DT01QSUxFUgorI2RlZmluZSBkZWNvZGVfc2lnbmlmaWNhbmNlIGRlY29kZV9zaWduaWZpY2FuY2VfeDg2CitzdGF0aWMgaW50IGRlY29kZV9zaWduaWZpY2FuY2VfeDg2KENBQkFDQ29udGV4dCAqYywgaW50IG1heF9jb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc2lnbmlmaWNhbnRfY29lZmZfY3R4X2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsIHg4Nl9yZWcgbGFzdF9vZmYpeworICAgIHZvaWQgKmVuZD0gc2lnbmlmaWNhbnRfY29lZmZfY3R4X2Jhc2UgKyBtYXhfY29lZmYgLSAxOworICAgIGludCBtaW51c3N0YXJ0PSAtKGludHB0cl90KXNpZ25pZmljYW50X2NvZWZmX2N0eF9iYXNlOworICAgIGludCBtaW51c2luZGV4PSA0LShpbnRwdHJfdClpbmRleDsKKyAgICBpbnQgYml0OworICAgIHg4Nl9yZWcgY29lZmZfY291bnQ7CisKKyNpZmRlZiBCUk9LRU5fUkVMT0NBVElPTlMKKyAgICB2b2lkICp0YWJsZXM7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibGVhICAgIk1BTkdMRShmZl9oMjY0X2NhYmFjX3RhYmxlcykiLCAlMCAgICAgIFxuXHQiCisgICAgICAgIDogIj0mciIodGFibGVzKQorICAgICAgICA6IE5BTUVEX0NPTlNUUkFJTlRTX0FSUkFZKGZmX2gyNjRfY2FiYWNfdGFibGVzKQorICAgICk7CisjZW5kaWYKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIEJSQU5DSExFU1NfR0VUX0NBQkFDKCIlNCIsICIlcTQiLCAiKCUxKSIsICIlMyIsICIldzMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTUiLCAiJXE1IiwgIiVrMCIsICIlYjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWMxMSglNikiLCAiJWMxMiglNikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TVFJJTkdJRlkoSDI2NF9OT1JNX1NISUZUX09GRlNFVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X0xQU19SQU5HRV9PRkZTRVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TVFJJTkdJRlkoSDI2NF9NTFBTX1NUQVRFX09GRlNFVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMTMiKQorCisgICAgICAgICJ0ZXN0ICQxLCAlNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiIGp6IDRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgJTEwLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgQlJBTkNITEVTU19HRVRfQ0FCQUMoIiU0IiwgIiVxNCIsICIoJTEpIiwgIiUzIiwgIiV3MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlNSIsICIlcTUiLCAiJWswIiwgIiViMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlYzExKCU2KSIsICIlYzEyKCU2KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X05PUk1fU0hJRlRfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTFBTX1JBTkdFX09GRlNFVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X01MUFNfU1RBVEVfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUxMyIpCisKKyAgICAgICAgInN1YiAgJTEwLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgICUyLCAlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92bCAlNywgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgJTEsICUlIlJFR19jIiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZsICUlZWN4LCAoJTApICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJ0ZXN0ICQxLCAlNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiIGpueiA1ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiYWRkIk9QU0laRSIgICQ0LCAlMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgJDEsICUxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjbXAgICU4LCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiIGpiIDNiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgJTIsICUwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZsICU3LCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAlMSwgJSUiUkVHX2MiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmwgJSVlY3gsICglMCkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICI1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAlOSwgJWswICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNociAkMiwgJWswICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogIj0mcSIoY29lZmZfY291bnQpLCAiK3IiKHNpZ25pZmljYW50X2NvZWZmX2N0eF9iYXNlKSwgIittIihpbmRleCksCisgICAgICAgICAgIismciIoYy0+bG93KSwgIj0mciIoYml0KSwgIismciIoYy0+cmFuZ2UpCisgICAgICAgIDogInIiKGMpLCAibSIobWludXNzdGFydCksICJtIihlbmQpLCAibSIobWludXNpbmRleCksICJtIihsYXN0X29mZiksCisgICAgICAgICAgImkiKG9mZnNldG9mKENBQkFDQ29udGV4dCwgYnl0ZXN0cmVhbSkpLAorICAgICAgICAgICJpIihvZmZzZXRvZihDQUJBQ0NvbnRleHQsIGJ5dGVzdHJlYW1fZW5kKSkKKyAgICAgICAgICBUQUJMRVNfQVJHCisgICAgICAgIDogIiUiUkVHX2MsICJtZW1vcnkiCisgICAgKTsKKyAgICByZXR1cm4gY29lZmZfY291bnQ7Cit9CisKKyNkZWZpbmUgZGVjb2RlX3NpZ25pZmljYW5jZV84eDggZGVjb2RlX3NpZ25pZmljYW5jZV84eDhfeDg2CitzdGF0aWMgaW50IGRlY29kZV9zaWduaWZpY2FuY2VfOHg4X3g4NihDQUJBQ0NvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzaWduaWZpY2FudF9jb2VmZl9jdHhfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsIHVpbnQ4X3QgKmxhc3RfY29lZmZfY3R4X2Jhc2UsIGNvbnN0IHVpbnQ4X3QgKnNpZ19vZmYpeworICAgIGludCBtaW51c2luZGV4PSA0LShpbnRwdHJfdClpbmRleDsKKyAgICBpbnQgYml0OworICAgIHg4Nl9yZWcgY29lZmZfY291bnQ7CisgICAgeDg2X3JlZyBsYXN0PTA7CisgICAgeDg2X3JlZyBzdGF0ZTsKKworI2lmZGVmIEJST0tFTl9SRUxPQ0FUSU9OUworICAgIHZvaWQgKnRhYmxlczsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJsZWEgICAgIk1BTkdMRShmZl9oMjY0X2NhYmFjX3RhYmxlcykiLCAlMCAgICAgIFxuXHQiCisgICAgICAgIDogIj0mciIodGFibGVzKQorICAgICAgICA6IE5BTUVEX0NPTlNUUkFJTlRTX0FSUkFZKGZmX2gyNjRfY2FiYWNfdGFibGVzKQorICAgICk7CisjZW5kaWYKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3YgJTEsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92ICUxMCwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnpiICglMCwgJTYpLCAlNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJTksICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIEJSQU5DSExFU1NfR0VUX0NBQkFDKCIlNCIsICIlcTQiLCAiKCU2KSIsICIlMyIsICIldzMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTUiLCAiJXE1IiwgIiVrMCIsICIlYjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWMxMiglNykiLCAiJWMxMyglNykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TVFJJTkdJRlkoSDI2NF9OT1JNX1NISUZUX09GRlNFVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X0xQU19SQU5HRV9PRkZTRVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TVFJJTkdJRlkoSDI2NF9NTFBTX1NUQVRFX09GRlNFVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMTUiKQorCisgICAgICAgICJtb3YgJTEsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAidGVzdCAkMSwgJTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIiBqeiA0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNpZmRlZiBCUk9LRU5fUkVMT0NBVElPTlMKKyAgICAgICAgIm1vdnpiICVjMTQoJTE1LCAlcTYpLCAlNlxuXHQiCisjZWxzZQorICAgICAgICAibW92emIgIk1BTkdMRShmZl9oMjY0X2NhYmFjX3RhYmxlcykiKyVjMTQoJTYpLCAlNlxuXHQiCisjZW5kaWYKKyAgICAgICAgImFkZCAlMTEsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgQlJBTkNITEVTU19HRVRfQ0FCQUMoIiU0IiwgIiVxNCIsICIoJTYpIiwgIiUzIiwgIiV3MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlNSIsICIlcTUiLCAiJWswIiwgIiViMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlYzEyKCU3KSIsICIlYzEzKCU3KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X05PUk1fU0hJRlRfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTFBTX1JBTkdFX09GRlNFVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X01MUFNfU1RBVEVfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUxNSIpCisKKyAgICAgICAgIm1vdiAlMiwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJTEsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICVrNiwgKCUwKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAidGVzdCAkMSwgJTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIiBqbnogNWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImFkZCJPUFNJWkUiICAkNCwgJTIgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJDEsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICU2LCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImNtcCAkNjMsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIgamIgM2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICUyLCAlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAlazYsICglMCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICI1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkbCAlOCwgJWswICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNociAkMiwgJWswICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogIj0mcSIoY29lZmZfY291bnQpLCAiKyJSRUc2NChsYXN0KSwgIisiUkVHNjQoaW5kZXgpLCAiKyZyIihjLT5sb3cpLAorICAgICAgICAgICI9JnIiKGJpdCksICIrJnIiKGMtPnJhbmdlKSwgIj0mciIoc3RhdGUpCisgICAgICAgIDogInIiKGMpLCAibSIobWludXNpbmRleCksICJtIihzaWduaWZpY2FudF9jb2VmZl9jdHhfYmFzZSksCisgICAgICAgICAgUkVHNjQoc2lnX29mZiksIFJFRzY0KGxhc3RfY29lZmZfY3R4X2Jhc2UpLAorICAgICAgICAgICJpIihvZmZzZXRvZihDQUJBQ0NvbnRleHQsIGJ5dGVzdHJlYW0pKSwKKyAgICAgICAgICAiaSIob2Zmc2V0b2YoQ0FCQUNDb250ZXh0LCBieXRlc3RyZWFtX2VuZCkpLAorICAgICAgICAgICJpIihIMjY0X0xBU1RfQ09FRkZfRkxBR19PRkZTRVRfOHg4X09GRlNFVCkgVEFCTEVTX0FSRworICAgICAgICA6ICIlIlJFR19jLCAibWVtb3J5IgorICAgICk7CisgICAgcmV0dXJuIGNvZWZmX2NvdW50OworfQorI2VuZGlmIC8qIEhBVkVfN1JFR1MgJiYgQlJPS0VOX0NPTVBJTEVSICovCisKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKyNlbmRpZiAvKiBBVkNPREVDX1g4Nl9IMjY0X0kzODZfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfaWRjdC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NF9pZGN0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmFmZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfaWRjdC5hc20KQEAgLTAsMCArMSwxMDgzIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIE1NWC9TU0UyLW9wdGltaXplZCBILjI2NCBpRENUCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IE1pY2hhZWwgTmllZGVybWF5ZXIsIExvcmVuIE1lcnJpdHQKKzsqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IHgyNjQgcHJvamVjdAorOyoKKzsqIEF1dGhvcnM6IExhdXJlbnQgQWltYXIgPGZlbnJpckB2aWEuZWNwLmZyPgorOyogICAgICAgICAgTG9yZW4gTWVycml0dCA8bG9yZW5tQHUud2FzaGluZ3Rvbi5lZHU+Cis7KiAgICAgICAgICBIb2xnZXIgTHViaXR6IDxoYWxAZHVuY2FuLm9sLnN1Yi5kZT4KKzsqICAgICAgICAgIE1pbiBDaGVuIDxjaGVubTAwMS4xNjMuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworc2NhbjhfbWVtOiBkYiAgNCsgMSo4LCA1KyAxKjgsIDQrIDIqOCwgNSsgMio4CisgICAgICAgICAgIGRiICA2KyAxKjgsIDcrIDEqOCwgNisgMio4LCA3KyAyKjgKKyAgICAgICAgICAgZGIgIDQrIDMqOCwgNSsgMyo4LCA0KyA0KjgsIDUrIDQqOAorICAgICAgICAgICBkYiAgNisgMyo4LCA3KyAzKjgsIDYrIDQqOCwgNysgNCo4CisgICAgICAgICAgIGRiICA0KyA2KjgsIDUrIDYqOCwgNCsgNyo4LCA1KyA3KjgKKyAgICAgICAgICAgZGIgIDYrIDYqOCwgNysgNio4LCA2KyA3KjgsIDcrIDcqOAorICAgICAgICAgICBkYiAgNCsgOCo4LCA1KyA4KjgsIDQrIDkqOCwgNSsgOSo4CisgICAgICAgICAgIGRiICA2KyA4KjgsIDcrIDgqOCwgNisgOSo4LCA3KyA5KjgKKyAgICAgICAgICAgZGIgIDQrMTEqOCwgNSsxMSo4LCA0KzEyKjgsIDUrMTIqOAorICAgICAgICAgICBkYiAgNisxMSo4LCA3KzExKjgsIDYrMTIqOCwgNysxMio4CisgICAgICAgICAgIGRiICA0KzEzKjgsIDUrMTMqOCwgNCsxNCo4LCA1KzE0KjgKKyAgICAgICAgICAgZGIgIDYrMTMqOCwgNysxMyo4LCA2KzE0KjgsIDcrMTQqOAorJWlmZGVmIFBJQworJWRlZmluZSBucGljcmVncyAxCislZGVmaW5lIHNjYW44IHBpY3JlZ3EKKyVlbHNlCislZGVmaW5lIG5waWNyZWdzIDAKKyVkZWZpbmUgc2Nhbjggc2NhbjhfbWVtCislZW5kaWYKKworY2V4dGVybiBwd18zMgorY2V4dGVybiBwd18xCisKK1NFQ1RJT04gLnRleHQKKworOyAlMT11aW50OF90ICpkc3QsICUyPWludDE2X3QgKmJsb2NrLCAlMz1pbnQgc3RyaWRlCislbWFjcm8gSURDVDRfQUREIDMKKyAgICA7IExvYWQgZGN0IGNvZWZmcworICAgIG1vdnEgICAgICAgICBtMCwgWyUyXQorICAgIG1vdnEgICAgICAgICBtMSwgWyUyKzhdCisgICAgbW92cSAgICAgICAgIG0yLCBbJTIrMTZdCisgICAgbW92cSAgICAgICAgIG0zLCBbJTIrMjRdCisKKyAgICBJRENUNF8xRCAgICAgIHcsIDAsIDEsIDIsIDMsIDQsIDUKKyAgICBtb3ZhICAgICAgICAgbTYsIFtwd18zMl0KKyAgICBUUkFOU1BPU0U0eDRXIDAsIDEsIDIsIDMsIDQKKyAgICBwYWRkdyAgICAgICAgbTAsIG02CisgICAgSURDVDRfMUQgICAgICB3LCAwLCAxLCAyLCAzLCA0LCA1CisgICAgcHhvciAgICAgICAgIG03LCBtNworICAgIG1vdnEgICAgWyUyKyAwXSwgbTcKKyAgICBtb3ZxICAgIFslMisgOF0sIG03CisgICAgbW92cSAgICBbJTIrMTZdLCBtNworICAgIG1vdnEgICAgWyUyKzI0XSwgbTcKKworICAgIFNUT1JFX0RJRkZ4MiBtMCwgbTEsIG00LCBtNSwgbTcsIDYsICUxLCAlMworICAgIGxlYSAgICAgICAgICAlMSwgWyUxKyUzKjJdCisgICAgU1RPUkVfRElGRngyIG0yLCBtMywgbTQsIG01LCBtNywgNiwgJTEsICUzCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14Cis7IHZvaWQgZmZfaDI2NF9pZGN0X2FkZF84X21teCh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKQorY2dsb2JhbCBoMjY0X2lkY3RfYWRkXzgsIDMsIDMsIDAKKyAgICBJRENUNF9BREQgICAgcjAsIHIxLCByMgorICAgIFJFVAorCislbWFjcm8gSURDVDhfMUQgMgorICAgIG1vdmEgICAgICAgICBtMCwgbTEKKyAgICBwc3JhdyAgICAgICAgbTEsIDEKKyAgICBtb3ZhICAgICAgICAgbTQsIG01CisgICAgcHNyYXcgICAgICAgIG00LCAxCisgICAgcGFkZHcgICAgICAgIG00LCBtNQorICAgIHBhZGR3ICAgICAgICBtMSwgbTAKKyAgICBwYWRkdyAgICAgICAgbTQsIG03CisgICAgcGFkZHcgICAgICAgIG0xLCBtNQorICAgIHBzdWJ3ICAgICAgICBtNCwgbTAKKyAgICBwYWRkdyAgICAgICAgbTEsIG0zCisKKyAgICBwc3VidyAgICAgICAgbTAsIG0zCisgICAgcHN1YncgICAgICAgIG01LCBtMworICAgIHBzcmF3ICAgICAgICBtMywgMQorICAgIHBhZGR3ICAgICAgICBtMCwgbTcKKyAgICBwc3VidyAgICAgICAgbTUsIG03CisgICAgcHNyYXcgICAgICAgIG03LCAxCisgICAgcHN1YncgICAgICAgIG0wLCBtMworICAgIHBzdWJ3ICAgICAgICBtNSwgbTcKKworICAgIG1vdmEgICAgICAgICBtNywgbTEKKyAgICBwc3JhdyAgICAgICAgbTEsIDIKKyAgICBtb3ZhICAgICAgICAgbTMsIG00CisgICAgcHNyYXcgICAgICAgIG0zLCAyCisgICAgcGFkZHcgICAgICAgIG0zLCBtMAorICAgIHBzcmF3ICAgICAgICBtMCwgMgorICAgIHBhZGR3ICAgICAgICBtMSwgbTUKKyAgICBwc3JhdyAgICAgICAgbTUsIDIKKyAgICBwc3VidyAgICAgICAgbTAsIG00CisgICAgcHN1YncgICAgICAgIG03LCBtNQorCisgICAgbW92YSAgICAgICAgIG01LCBtNgorICAgIHBzcmF3ICAgICAgICBtNiwgMQorICAgIG1vdmEgICAgICAgICBtNCwgbTIKKyAgICBwc3JhdyAgICAgICAgbTQsIDEKKyAgICBwYWRkdyAgICAgICAgbTYsIG0yCisgICAgcHN1YncgICAgICAgIG00LCBtNQorCisgICAgbW92YSAgICAgICAgIG0yLCAlMQorICAgIG1vdmEgICAgICAgICBtNSwgJTIKKyAgICBTVU1TVUJfQkEgICAgdywgNSwgMgorICAgIFNVTVNVQl9CQSAgICB3LCA2LCA1CisgICAgU1VNU1VCX0JBICAgIHcsIDQsIDIKKyAgICBTVU1TVUJfQkEgICAgdywgNywgNgorICAgIFNVTVNVQl9CQSAgICB3LCAwLCA0CisgICAgU1VNU1VCX0JBICAgIHcsIDMsIDIKKyAgICBTVU1TVUJfQkEgICAgdywgMSwgNQorICAgIFNXQVAgICAgICAgICA3LCA2LCA0LCA1LCAyLCAzLCAxLCAwIDsgNzAzMTUyNDYgLT4gMDEyMzQ1NjcKKyVlbmRtYWNybworCislbWFjcm8gSURDVDhfMURfRlVMTCAxCisgICAgbW92YSAgICAgICAgIG03LCBbJTErMTEyXQorICAgIG1vdmEgICAgICAgICBtNiwgWyUxKyA5Nl0KKyAgICBtb3ZhICAgICAgICAgbTUsIFslMSsgODBdCisgICAgbW92YSAgICAgICAgIG0zLCBbJTErIDQ4XQorICAgIG1vdmEgICAgICAgICBtMiwgWyUxKyAzMl0KKyAgICBtb3ZhICAgICAgICAgbTEsIFslMSsgMTZdCisgICAgSURDVDhfMUQgICBbJTFdLCBbJTErIDY0XQorJWVuZG1hY3JvCisKKzsgJTE9aW50MTZfdCAqYmxvY2ssICUyPWludDE2X3QgKmRzdGJsb2NrCislbWFjcm8gSURDVDhfQUREX01NWF9TVEFSVCAyCisgICAgSURDVDhfMURfRlVMTCAlMQorICAgIG1vdmEgICAgICAgWyUxXSwgbTcKKyAgICBUUkFOU1BPU0U0eDRXIDAsIDEsIDIsIDMsIDcKKyAgICBtb3ZhICAgICAgICAgbTcsIFslMV0KKyAgICBtb3ZhICAgIFslMiAgIF0sIG0wCisgICAgbW92YSAgICBbJTIrMTZdLCBtMQorICAgIG1vdmEgICAgWyUyKzMyXSwgbTIKKyAgICBtb3ZhICAgIFslMis0OF0sIG0zCisgICAgVFJBTlNQT1NFNHg0VyA0LCA1LCA2LCA3LCAzCisgICAgbW92YSAgICBbJTIrIDhdLCBtNAorICAgIG1vdmEgICAgWyUyKzI0XSwgbTUKKyAgICBtb3ZhICAgIFslMis0MF0sIG02CisgICAgbW92YSAgICBbJTIrNTZdLCBtNworJWVuZG1hY3JvCisKKzsgJTE9dWludDhfdCAqZHN0LCAlMj1pbnQxNl90ICpibG9jaywgJTM9aW50IHN0cmlkZQorJW1hY3JvIElEQ1Q4X0FERF9NTVhfRU5EIDMtNAorICAgIElEQ1Q4XzFEX0ZVTEwgJTIKKyAgICBtb3ZhICAgIFslMiAgIF0sIG01CisgICAgbW92YSAgICBbJTIrMTZdLCBtNgorICAgIG1vdmEgICAgWyUyKzMyXSwgbTcKKworICAgIHB4b3IgICAgICAgICBtNywgbTcKKyVpZiAlMCA9PSA0CisgICAgbW92cSAgIFslNCsgIDBdLCBtNworICAgIG1vdnEgICBbJTQrICA4XSwgbTcKKyAgICBtb3ZxICAgWyU0KyAxNl0sIG03CisgICAgbW92cSAgIFslNCsgMjRdLCBtNworICAgIG1vdnEgICBbJTQrIDMyXSwgbTcKKyAgICBtb3ZxICAgWyU0KyA0MF0sIG03CisgICAgbW92cSAgIFslNCsgNDhdLCBtNworICAgIG1vdnEgICBbJTQrIDU2XSwgbTcKKyAgICBtb3ZxICAgWyU0KyA2NF0sIG03CisgICAgbW92cSAgIFslNCsgNzJdLCBtNworICAgIG1vdnEgICBbJTQrIDgwXSwgbTcKKyAgICBtb3ZxICAgWyU0KyA4OF0sIG03CisgICAgbW92cSAgIFslNCsgOTZdLCBtNworICAgIG1vdnEgICBbJTQrMTA0XSwgbTcKKyAgICBtb3ZxICAgWyU0KzExMl0sIG03CisgICAgbW92cSAgIFslNCsxMjBdLCBtNworJWVuZGlmCisgICAgU1RPUkVfRElGRngyIG0wLCBtMSwgbTUsIG02LCBtNywgNiwgJTEsICUzCisgICAgbGVhICAgICAgICAgICUxLCBbJTErJTMqMl0KKyAgICBTVE9SRV9ESUZGeDIgbTIsIG0zLCBtNSwgbTYsIG03LCA2LCAlMSwgJTMKKyAgICBtb3ZhICAgICAgICAgbTAsIFslMiAgIF0KKyAgICBtb3ZhICAgICAgICAgbTEsIFslMisxNl0KKyAgICBtb3ZhICAgICAgICAgbTIsIFslMiszMl0KKyAgICBsZWEgICAgICAgICAgJTEsIFslMSslMyoyXQorICAgIFNUT1JFX0RJRkZ4MiBtNCwgbTAsIG01LCBtNiwgbTcsIDYsICUxLCAlMworICAgIGxlYSAgICAgICAgICAlMSwgWyUxKyUzKjJdCisgICAgU1RPUkVfRElGRngyIG0xLCBtMiwgbTUsIG02LCBtNywgNiwgJTEsICUzCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14Cis7IHZvaWQgZmZfaDI2NF9pZGN0OF9hZGRfOF9tbXgodWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKK2NnbG9iYWwgaDI2NF9pZGN0OF9hZGRfOCwgMywgNCwgMAorICAgICVhc3NpZ24gcGFkIDEyOCs0LShzdGFja19vZmZzZXQmNykKKyAgICBTVUIgICAgICAgICByc3AsIHBhZAorCisgICAgYWRkICAgd29yZCBbcjFdLCAzMgorICAgIElEQ1Q4X0FERF9NTVhfU1RBUlQgcjEgICwgcnNwCisgICAgSURDVDhfQUREX01NWF9TVEFSVCByMSs4LCByc3ArNjQKKyAgICBsZWEgICAgICAgICAgcjMsIFtyMCs0XQorICAgIElEQ1Q4X0FERF9NTVhfRU5EICAgcjAgICwgcnNwLCAgIHIyLCByMQorICAgIElEQ1Q4X0FERF9NTVhfRU5EICAgcjMgICwgcnNwKzgsIHIyCisKKyAgICBBREQgICAgICAgICByc3AsIHBhZAorICAgIFJFVAorCis7ICUxPXVpbnQ4X3QgKmRzdCwgJTI9aW50MTZfdCAqYmxvY2ssICUzPWludCBzdHJpZGUKKyVtYWNybyBJRENUOF9BRERfU1NFIDQKKyAgICBJRENUOF8xRF9GVUxMICUyCislaWYgQVJDSF9YODZfNjQKKyAgICBUUkFOU1BPU0U4eDhXIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgKKyVlbHNlCisgICAgVFJBTlNQT1NFOHg4VyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCBbJTJdLCBbJTIrMTZdCislZW5kaWYKKyAgICBwYWRkdyAgICAgICAgbTAsIFtwd18zMl0KKworJWlmIEFSQ0hfWDg2XzY0ID09IDAKKyAgICBtb3ZhICAgIFslMiAgIF0sIG0wCisgICAgbW92YSAgICBbJTIrMTZdLCBtNAorICAgIElEQ1Q4XzFEICAgWyUyXSwgWyUyKyAxNl0KKyAgICBtb3ZhICAgIFslMiAgIF0sIG02CisgICAgbW92YSAgICBbJTIrMTZdLCBtNworJWVsc2UKKyAgICBTV0FQICAgICAgICAgIDAsIDgKKyAgICBTV0FQICAgICAgICAgIDQsIDkKKyAgICBJRENUOF8xRCAgICAgbTgsIG05CisgICAgU1dBUCAgICAgICAgICA2LCA4CisgICAgU1dBUCAgICAgICAgICA3LCA5CislZW5kaWYKKworICAgIHB4b3IgICAgICAgICBtNywgbTcKKyAgICBsZWEgICAgICAgICAgJTQsIFslMyozXQorICAgIFNUT1JFX0RJRkYgICBtMCwgbTYsIG03LCBbJTEgICAgIF0KKyAgICBTVE9SRV9ESUZGICAgbTEsIG02LCBtNywgWyUxKyUzICBdCisgICAgU1RPUkVfRElGRiAgIG0yLCBtNiwgbTcsIFslMSslMyoyXQorICAgIFNUT1JFX0RJRkYgICBtMywgbTYsIG03LCBbJTErJTQgIF0KKyVpZiBBUkNIX1g4Nl82NCA9PSAwCisgICAgbW92YSAgICAgICAgIG0wLCBbJTIgICBdCisgICAgbW92YSAgICAgICAgIG0xLCBbJTIrMTZdCislZWxzZQorICAgIFNXQVAgICAgICAgICAgMCwgOAorICAgIFNXQVAgICAgICAgICAgMSwgOQorJWVuZGlmCisgICAgbW92YSAgIFslMisgIDBdLCBtNworICAgIG1vdmEgICBbJTIrIDE2XSwgbTcKKyAgICBtb3ZhICAgWyUyKyAzMl0sIG03CisgICAgbW92YSAgIFslMisgNDhdLCBtNworICAgIG1vdmEgICBbJTIrIDY0XSwgbTcKKyAgICBtb3ZhICAgWyUyKyA4MF0sIG03CisgICAgbW92YSAgIFslMisgOTZdLCBtNworICAgIG1vdmEgICBbJTIrMTEyXSwgbTcKKyAgICBsZWEgICAgICAgICAgJTEsIFslMSslMyo0XQorICAgIFNUT1JFX0RJRkYgICBtNCwgbTYsIG03LCBbJTEgICAgIF0KKyAgICBTVE9SRV9ESUZGICAgbTUsIG02LCBtNywgWyUxKyUzICBdCisgICAgU1RPUkVfRElGRiAgIG0wLCBtNiwgbTcsIFslMSslMyoyXQorICAgIFNUT1JFX0RJRkYgICBtMSwgbTYsIG03LCBbJTErJTQgIF0KKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCis7IHZvaWQgZmZfaDI2NF9pZGN0OF9hZGRfOF9zc2UyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpCitjZ2xvYmFsIGgyNjRfaWRjdDhfYWRkXzgsIDMsIDQsIDEwCisgICAgSURDVDhfQUREX1NTRSByMCwgcjEsIHIyLCByMworICAgIFJFVAorCislbWFjcm8gRENfQUREX01NWEVYVF9JTklUIDIKKyAgICBhZGQgICAgICAgICAgJTEsIDMyCisgICAgc2FyICAgICAgICAgICUxLCA2CisgICAgbW92ZCAgICAgICAgIG0wLCAlMWQKKyAgICBsZWEgICAgICAgICAgJTEsIFslMiozXQorICAgIHBzaHVmdyAgICAgICBtMCwgbTAsIDAKKyAgICBweG9yICAgICAgICAgbTEsIG0xCisgICAgcHN1YncgICAgICAgIG0xLCBtMAorICAgIHBhY2t1c3diICAgICBtMCwgbTAKKyAgICBwYWNrdXN3YiAgICAgbTEsIG0xCislZW5kbWFjcm8KKworJW1hY3JvIERDX0FERF9NTVhFWFRfT1AgNAorICAgICUxICAgICAgICAgICBtMiwgWyUyICAgICBdCisgICAgJTEgICAgICAgICAgIG0zLCBbJTIrJTMgIF0KKyAgICAlMSAgICAgICAgICAgbTQsIFslMislMyoyXQorICAgICUxICAgICAgICAgICBtNSwgWyUyKyU0ICBdCisgICAgcGFkZHVzYiAgICAgIG0yLCBtMAorICAgIHBhZGR1c2IgICAgICBtMywgbTAKKyAgICBwYWRkdXNiICAgICAgbTQsIG0wCisgICAgcGFkZHVzYiAgICAgIG01LCBtMAorICAgIHBzdWJ1c2IgICAgICBtMiwgbTEKKyAgICBwc3VidXNiICAgICAgbTMsIG0xCisgICAgcHN1YnVzYiAgICAgIG00LCBtMQorICAgIHBzdWJ1c2IgICAgICBtNSwgbTEKKyAgICAlMSAgICBbJTIgICAgIF0sIG0yCisgICAgJTEgICAgWyUyKyUzICBdLCBtMworICAgICUxICAgIFslMislMyoyXSwgbTQKKyAgICAlMSAgICBbJTIrJTQgIF0sIG01CislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0Cis7IHZvaWQgZmZfaDI2NF9pZGN0X2RjX2FkZF84X21teGV4dCh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKQorJWlmIEFSQ0hfWDg2XzY0CitjZ2xvYmFsIGgyNjRfaWRjdF9kY19hZGRfOCwgMywgNCwgMAorICAgIG1vdnN4ICAgICAgICByMywgd29yZCBbcjFdCisgICAgbW92ICBkd29yZCBbcjFdLCAwCisgICAgRENfQUREX01NWEVYVF9JTklUIHIzLCByMgorICAgIERDX0FERF9NTVhFWFRfT1AgbW92aCwgcjAsIHIyLCByMworICAgIFJFVAorCis7IHZvaWQgZmZfaDI2NF9pZGN0OF9kY19hZGRfOF9tbXhleHQodWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKK2NnbG9iYWwgaDI2NF9pZGN0OF9kY19hZGRfOCwgMywgNCwgMAorICAgIG1vdnN4ICAgICAgICByMywgd29yZCBbcjFdCisgICAgbW92ICBkd29yZCBbcjFdLCAwCisgICAgRENfQUREX01NWEVYVF9JTklUIHIzLCByMgorICAgIERDX0FERF9NTVhFWFRfT1AgbW92YSwgcjAsIHIyLCByMworICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IyKjRdCisgICAgRENfQUREX01NWEVYVF9PUCBtb3ZhLCByMCwgcjIsIHIzCisgICAgUkVUCislZWxzZQorOyB2b2lkIGZmX2gyNjRfaWRjdF9kY19hZGRfOF9tbXhleHQodWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKK2NnbG9iYWwgaDI2NF9pZGN0X2RjX2FkZF84LCAyLCAzLCAwCisgICAgbW92c3ggICAgICAgIHIyLCB3b3JkIFtyMV0KKyAgICBtb3YgIGR3b3JkIFtyMV0sIDAKKyAgICBtb3YgICAgICAgICAgcjEsIHIybQorICAgIERDX0FERF9NTVhFWFRfSU5JVCByMiwgcjEKKyAgICBEQ19BRERfTU1YRVhUX09QIG1vdmgsIHIwLCByMSwgcjIKKyAgICBSRVQKKworOyB2b2lkIGZmX2gyNjRfaWRjdDhfZGNfYWRkXzhfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpCitjZ2xvYmFsIGgyNjRfaWRjdDhfZGNfYWRkXzgsIDIsIDMsIDAKKyAgICBtb3ZzeCAgICAgICAgcjIsIHdvcmQgW3IxXQorICAgIG1vdiAgZHdvcmQgW3IxXSwgMAorICAgIG1vdiAgICAgICAgICByMSwgcjJtCisgICAgRENfQUREX01NWEVYVF9JTklUIHIyLCByMQorICAgIERDX0FERF9NTVhFWFRfT1AgbW92YSwgcjAsIHIxLCByMgorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IxKjRdCisgICAgRENfQUREX01NWEVYVF9PUCBtb3ZhLCByMCwgcjEsIHIyCisgICAgUkVUCislZW5kaWYKKworSU5JVF9NTVggbW14Cis7IHZvaWQgZmZfaDI2NF9pZGN0X2FkZDE2XzhfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgaW50ICpibG9ja19vZmZzZXQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5uemNbNiAqIDhdKQorY2dsb2JhbCBoMjY0X2lkY3RfYWRkMTZfOCwgNSwgNyArIG5waWNyZWdzLCAwLCBkc3QsIGJsb2NrX29mZnNldCwgYmxvY2ssIHN0cmlkZSwgbm56YywgY250ciwgY29lZmYsIHBpY3JlZworICAgIHhvciAgICAgICAgICByNSwgcjUKKyVpZmRlZiBQSUMKKyAgICBsZWEgICAgIHBpY3JlZ3EsIFtzY2FuOF9tZW1dCislZW5kaWYKKy5uZXh0YmxvY2s6CisgICAgbW92enggICAgICAgIHI2LCBieXRlIFtzY2FuOCtyNV0KKyAgICBtb3Z6eCAgICAgICAgcjYsIGJ5dGUgW3I0K3I2XQorICAgIHRlc3QgICAgICAgICByNiwgcjYKKyAgICBqeiAuc2tpcGJsb2NrCisgICAgbW92ICAgICAgICAgcjZkLCBkd29yZCBbcjErcjUqNF0KKyAgICBsZWEgICAgICAgICAgcjYsIFtyMCtyNl0KKyAgICBJRENUNF9BREQgICAgcjYsIHIyLCByMworLnNraXBibG9jazoKKyAgICBpbmMgICAgICAgICAgcjUKKyAgICBhZGQgICAgICAgICAgcjIsIDMyCisgICAgY21wICAgICAgICAgIHI1LCAxNgorICAgIGpsIC5uZXh0YmxvY2sKKyAgICBSRVBfUkVUCisKKzsgdm9pZCBmZl9oMjY0X2lkY3Q4X2FkZDRfOF9tbXgodWludDhfdCAqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2ICogOF0pCitjZ2xvYmFsIGgyNjRfaWRjdDhfYWRkNF84LCA1LCA3ICsgbnBpY3JlZ3MsIDAsIGRzdCwgYmxvY2tfb2Zmc2V0LCBibG9jaywgc3RyaWRlLCBubnpjLCBjbnRyLCBjb2VmZiwgcGljcmVnCisgICAgJWFzc2lnbiBwYWQgMTI4KzQtKHN0YWNrX29mZnNldCY3KQorICAgIFNVQiAgICAgICAgIHJzcCwgcGFkCisKKyAgICB4b3IgICAgICAgICAgcjUsIHI1CislaWZkZWYgUElDCisgICAgbGVhICAgICBwaWNyZWdxLCBbc2NhbjhfbWVtXQorJWVuZGlmCisubmV4dGJsb2NrOgorICAgIG1vdnp4ICAgICAgICByNiwgYnl0ZSBbc2NhbjgrcjVdCisgICAgbW92enggICAgICAgIHI2LCBieXRlIFtyNCtyNl0KKyAgICB0ZXN0ICAgICAgICAgcjYsIHI2CisgICAganogLnNraXBibG9jaworICAgIG1vdiAgICAgICAgIHI2ZCwgZHdvcmQgW3IxK3I1KjRdCisgICAgYWRkICAgICAgICAgIHI2LCByMAorICAgIGFkZCAgIHdvcmQgW3IyXSwgMzIKKyAgICBJRENUOF9BRERfTU1YX1NUQVJUIHIyICAsIHJzcAorICAgIElEQ1Q4X0FERF9NTVhfU1RBUlQgcjIrOCwgcnNwKzY0CisgICAgSURDVDhfQUREX01NWF9FTkQgICByNiAgLCByc3AsICAgcjMsIHIyCisgICAgbW92ICAgICAgICAgcjZkLCBkd29yZCBbcjErcjUqNF0KKyAgICBsZWEgICAgICAgICAgcjYsIFtyMCtyNis0XQorICAgIElEQ1Q4X0FERF9NTVhfRU5EICAgcjYgICwgcnNwKzgsIHIzCisuc2tpcGJsb2NrOgorICAgIGFkZCAgICAgICAgICByNSwgNAorICAgIGFkZCAgICAgICAgICByMiwgMTI4CisgICAgY21wICAgICAgICAgIHI1LCAxNgorICAgIGpsIC5uZXh0YmxvY2sKKyAgICBBREQgICAgICAgICByc3AsIHBhZAorICAgIFJFVAorCitJTklUX01NWCBtbXhleHQKKzsgdm9pZCBmZl9oMjY0X2lkY3RfYWRkMTZfOF9tbXhleHQodWludDhfdCAqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2ICogOF0pCitjZ2xvYmFsIGgyNjRfaWRjdF9hZGQxNl84LCA1LCA4ICsgbnBpY3JlZ3MsIDAsIGRzdDEsIGJsb2NrX29mZnNldCwgYmxvY2ssIHN0cmlkZSwgbm56YywgY250ciwgY29lZmYsIGRzdDIsIHBpY3JlZworICAgIHhvciAgICAgICAgICByNSwgcjUKKyVpZmRlZiBQSUMKKyAgICBsZWEgICAgIHBpY3JlZ3EsIFtzY2FuOF9tZW1dCislZW5kaWYKKy5uZXh0YmxvY2s6CisgICAgbW92enggICAgICAgIHI2LCBieXRlIFtzY2FuOCtyNV0KKyAgICBtb3Z6eCAgICAgICAgcjYsIGJ5dGUgW3I0K3I2XQorICAgIHRlc3QgICAgICAgICByNiwgcjYKKyAgICBqeiAuc2tpcGJsb2NrCisgICAgY21wICAgICAgICAgIHI2LCAxCisgICAgam56IC5ub19kYworICAgIG1vdnN4ICAgICAgICByNiwgd29yZCBbcjJdCisgICAgdGVzdCAgICAgICAgIHI2LCByNgorICAgIGp6IC5ub19kYworICAgIG1vdiAgIHdvcmQgW3IyXSwgMAorICAgIERDX0FERF9NTVhFWFRfSU5JVCByNiwgcjMKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCislZGVmaW5lIGRzdDJxIHIxCislZGVmaW5lIGRzdDJkIHIxZAorJWVuZGlmCisgICAgbW92ICAgICAgIGRzdDJkLCBkd29yZCBbcjErcjUqNF0KKyAgICBsZWEgICAgICAgZHN0MnEsIFtyMCtkc3QycV0KKyAgICBEQ19BRERfTU1YRVhUX09QIG1vdmgsIGRzdDJxLCByMywgcjYKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCisgICAgbW92ICAgICAgICAgIHIxLCByMW0KKyVlbmRpZgorICAgIGluYyAgICAgICAgICByNQorICAgIGFkZCAgICAgICAgICByMiwgMzIKKyAgICBjbXAgICAgICAgICAgcjUsIDE2CisgICAgamwgLm5leHRibG9jaworICAgIFJFUF9SRVQKKy5ub19kYzoKKyAgICBtb3YgICAgICAgICByNmQsIGR3b3JkIFtyMStyNSo0XQorICAgIGFkZCAgICAgICAgICByNiwgcjAKKyAgICBJRENUNF9BREQgICAgcjYsIHIyLCByMworLnNraXBibG9jazoKKyAgICBpbmMgICAgICAgICAgcjUKKyAgICBhZGQgICAgICAgICAgcjIsIDMyCisgICAgY21wICAgICAgICAgIHI1LCAxNgorICAgIGpsIC5uZXh0YmxvY2sKKyAgICBSRVBfUkVUCisKK0lOSVRfTU1YIG1teAorOyB2b2lkIGZmX2gyNjRfaWRjdF9hZGQxNmludHJhXzhfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgaW50ICpibG9ja19vZmZzZXQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKK2NnbG9iYWwgaDI2NF9pZGN0X2FkZDE2aW50cmFfOCwgNSwgNyArIG5waWNyZWdzLCAwLCBkc3QsIGJsb2NrX29mZnNldCwgYmxvY2ssIHN0cmlkZSwgbm56YywgY250ciwgY29lZmYsIHBpY3JlZworICAgIHhvciAgICAgICAgICByNSwgcjUKKyVpZmRlZiBQSUMKKyAgICBsZWEgICAgIHBpY3JlZ3EsIFtzY2FuOF9tZW1dCislZW5kaWYKKy5uZXh0YmxvY2s6CisgICAgbW92enggICAgICAgIHI2LCBieXRlIFtzY2FuOCtyNV0KKyAgICBtb3Z6eCAgICAgICAgcjYsIGJ5dGUgW3I0K3I2XQorICAgIG9yICAgICAgICAgIHI2dywgd29yZCBbcjJdCisgICAgdGVzdCAgICAgICAgIHI2LCByNgorICAgIGp6IC5za2lwYmxvY2sKKyAgICBtb3YgICAgICAgICByNmQsIGR3b3JkIFtyMStyNSo0XQorICAgIGFkZCAgICAgICAgICByNiwgcjAKKyAgICBJRENUNF9BREQgICAgcjYsIHIyLCByMworLnNraXBibG9jazoKKyAgICBpbmMgICAgICAgICAgcjUKKyAgICBhZGQgICAgICAgICAgcjIsIDMyCisgICAgY21wICAgICAgICAgIHI1LCAxNgorICAgIGpsIC5uZXh0YmxvY2sKKyAgICBSRVBfUkVUCisKK0lOSVRfTU1YIG1teGV4dAorOyB2b2lkIGZmX2gyNjRfaWRjdF9hZGQxNmludHJhXzhfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgaW50ICpibG9ja19vZmZzZXQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKK2NnbG9iYWwgaDI2NF9pZGN0X2FkZDE2aW50cmFfOCwgNSwgOCArIG5waWNyZWdzLCAwLCBkc3QxLCBibG9ja19vZmZzZXQsIGJsb2NrLCBzdHJpZGUsIG5uemMsIGNudHIsIGNvZWZmLCBkc3QyLCBwaWNyZWcKKyAgICB4b3IgICAgICAgICAgcjUsIHI1CislaWZkZWYgUElDCisgICAgbGVhICAgICBwaWNyZWdxLCBbc2NhbjhfbWVtXQorJWVuZGlmCisubmV4dGJsb2NrOgorICAgIG1vdnp4ICAgICAgICByNiwgYnl0ZSBbc2NhbjgrcjVdCisgICAgbW92enggICAgICAgIHI2LCBieXRlIFtyNCtyNl0KKyAgICB0ZXN0ICAgICAgICAgcjYsIHI2CisgICAganogLnRyeV9kYworICAgIG1vdiAgICAgICAgIHI2ZCwgZHdvcmQgW3IxK3I1KjRdCisgICAgbGVhICAgICAgICAgIHI2LCBbcjArcjZdCisgICAgSURDVDRfQUREICAgIHI2LCByMiwgcjMKKyAgICBpbmMgICAgICAgICAgcjUKKyAgICBhZGQgICAgICAgICAgcjIsIDMyCisgICAgY21wICAgICAgICAgIHI1LCAxNgorICAgIGpsIC5uZXh0YmxvY2sKKyAgICBSRVBfUkVUCisudHJ5X2RjOgorICAgIG1vdnN4ICAgICAgICByNiwgd29yZCBbcjJdCisgICAgdGVzdCAgICAgICAgIHI2LCByNgorICAgIGp6IC5za2lwYmxvY2sKKyAgICBtb3YgICB3b3JkIFtyMl0sIDAKKyAgICBEQ19BRERfTU1YRVhUX0lOSVQgcjYsIHIzCislaWYgQVJDSF9YODZfNjQgPT0gMAorJWRlZmluZSBkc3QycSByMQorJWRlZmluZSBkc3QyZCByMWQKKyVlbmRpZgorICAgIG1vdiAgICAgICBkc3QyZCwgZHdvcmQgW3IxK3I1KjRdCisgICAgYWRkICAgICAgIGRzdDJxLCByMAorICAgIERDX0FERF9NTVhFWFRfT1AgbW92aCwgZHN0MnEsIHIzLCByNgorJWlmIEFSQ0hfWDg2XzY0ID09IDAKKyAgICBtb3YgICAgICAgICAgcjEsIHIxbQorJWVuZGlmCisuc2tpcGJsb2NrOgorICAgIGluYyAgICAgICAgICByNQorICAgIGFkZCAgICAgICAgICByMiwgMzIKKyAgICBjbXAgICAgICAgICAgcjUsIDE2CisgICAgamwgLm5leHRibG9jaworICAgIFJFUF9SRVQKKworOyB2b2lkIGZmX2gyNjRfaWRjdDhfYWRkNF84X21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKK2NnbG9iYWwgaDI2NF9pZGN0OF9hZGQ0XzgsIDUsIDggKyBucGljcmVncywgMCwgZHN0MSwgYmxvY2tfb2Zmc2V0LCBibG9jaywgc3RyaWRlLCBubnpjLCBjbnRyLCBjb2VmZiwgZHN0MiwgcGljcmVnCisgICAgJWFzc2lnbiBwYWQgMTI4KzQtKHN0YWNrX29mZnNldCY3KQorICAgIFNVQiAgICAgICAgIHJzcCwgcGFkCisKKyAgICB4b3IgICAgICAgICAgcjUsIHI1CislaWZkZWYgUElDCisgICAgbGVhICAgICBwaWNyZWdxLCBbc2NhbjhfbWVtXQorJWVuZGlmCisubmV4dGJsb2NrOgorICAgIG1vdnp4ICAgICAgICByNiwgYnl0ZSBbc2NhbjgrcjVdCisgICAgbW92enggICAgICAgIHI2LCBieXRlIFtyNCtyNl0KKyAgICB0ZXN0ICAgICAgICAgcjYsIHI2CisgICAganogLnNraXBibG9jaworICAgIGNtcCAgICAgICAgICByNiwgMQorICAgIGpueiAubm9fZGMKKyAgICBtb3ZzeCAgICAgICAgcjYsIHdvcmQgW3IyXQorICAgIHRlc3QgICAgICAgICByNiwgcjYKKyAgICBqeiAubm9fZGMKKyAgICBtb3YgICB3b3JkIFtyMl0sIDAKKyAgICBEQ19BRERfTU1YRVhUX0lOSVQgcjYsIHIzCislaWYgQVJDSF9YODZfNjQgPT0gMAorJWRlZmluZSBkc3QycSByMQorJWRlZmluZSBkc3QyZCByMWQKKyVlbmRpZgorICAgIG1vdiAgICAgICBkc3QyZCwgZHdvcmQgW3IxK3I1KjRdCisgICAgbGVhICAgICAgIGRzdDJxLCBbcjArZHN0MnFdCisgICAgRENfQUREX01NWEVYVF9PUCBtb3ZhLCBkc3QycSwgcjMsIHI2CisgICAgbGVhICAgICAgIGRzdDJxLCBbZHN0MnErcjMqNF0KKyAgICBEQ19BRERfTU1YRVhUX09QIG1vdmEsIGRzdDJxLCByMywgcjYKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCisgICAgbW92ICAgICAgICAgIHIxLCByMW0KKyVlbmRpZgorICAgIGFkZCAgICAgICAgICByNSwgNAorICAgIGFkZCAgICAgICAgICByMiwgMTI4CisgICAgY21wICAgICAgICAgIHI1LCAxNgorICAgIGpsIC5uZXh0YmxvY2sKKworICAgIEFERCAgICAgICAgIHJzcCwgcGFkCisgICAgUkVUCisubm9fZGM6CisgICAgbW92ICAgICAgICAgcjZkLCBkd29yZCBbcjErcjUqNF0KKyAgICBhZGQgICAgICAgICAgcjYsIHIwCisgICAgYWRkICAgd29yZCBbcjJdLCAzMgorICAgIElEQ1Q4X0FERF9NTVhfU1RBUlQgcjIgICwgcnNwCisgICAgSURDVDhfQUREX01NWF9TVEFSVCByMis4LCByc3ArNjQKKyAgICBJRENUOF9BRERfTU1YX0VORCAgIHI2ICAsIHJzcCwgICByMywgcjIKKyAgICBtb3YgICAgICAgICByNmQsIGR3b3JkIFtyMStyNSo0XQorICAgIGxlYSAgICAgICAgICByNiwgW3IwK3I2KzRdCisgICAgSURDVDhfQUREX01NWF9FTkQgICByNiAgLCByc3ArOCwgcjMKKy5za2lwYmxvY2s6CisgICAgYWRkICAgICAgICAgIHI1LCA0CisgICAgYWRkICAgICAgICAgIHIyLCAxMjgKKyAgICBjbXAgICAgICAgICAgcjUsIDE2CisgICAgamwgLm5leHRibG9jaworCisgICAgQUREICAgICAgICAgcnNwLCBwYWQKKyAgICBSRVQKKworSU5JVF9YTU0gc3NlMgorOyB2b2lkIGZmX2gyNjRfaWRjdDhfYWRkNF84X3NzZTIodWludDhfdCAqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKK2NnbG9iYWwgaDI2NF9pZGN0OF9hZGQ0XzgsIDUsIDggKyBucGljcmVncywgMTAsIGRzdDEsIGJsb2NrX29mZnNldCwgYmxvY2ssIHN0cmlkZSwgbm56YywgY250ciwgY29lZmYsIGRzdDIsIHBpY3JlZworICAgIHhvciAgICAgICAgICByNSwgcjUKKyVpZmRlZiBQSUMKKyAgICBsZWEgICAgIHBpY3JlZ3EsIFtzY2FuOF9tZW1dCislZW5kaWYKKy5uZXh0YmxvY2s6CisgICAgbW92enggICAgICAgIHI2LCBieXRlIFtzY2FuOCtyNV0KKyAgICBtb3Z6eCAgICAgICAgcjYsIGJ5dGUgW3I0K3I2XQorICAgIHRlc3QgICAgICAgICByNiwgcjYKKyAgICBqeiAuc2tpcGJsb2NrCisgICAgY21wICAgICAgICAgIHI2LCAxCisgICAgam56IC5ub19kYworICAgIG1vdnN4ICAgICAgICByNiwgd29yZCBbcjJdCisgICAgdGVzdCAgICAgICAgIHI2LCByNgorICAgIGp6IC5ub19kYworSU5JVF9NTVggY3B1bmFtZQorICAgIG1vdiAgIHdvcmQgW3IyXSwgMAorICAgIERDX0FERF9NTVhFWFRfSU5JVCByNiwgcjMKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCislZGVmaW5lIGRzdDJxIHIxCislZGVmaW5lIGRzdDJkIHIxZAorJWVuZGlmCisgICAgbW92ICAgICAgIGRzdDJkLCBkd29yZCBbcjErcjUqNF0KKyAgICBhZGQgICAgICAgZHN0MnEsIHIwCisgICAgRENfQUREX01NWEVYVF9PUCBtb3ZhLCBkc3QycSwgcjMsIHI2CisgICAgbGVhICAgICAgIGRzdDJxLCBbZHN0MnErcjMqNF0KKyAgICBEQ19BRERfTU1YRVhUX09QIG1vdmEsIGRzdDJxLCByMywgcjYKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCisgICAgbW92ICAgICAgICAgIHIxLCByMW0KKyVlbmRpZgorICAgIGFkZCAgICAgICAgICByNSwgNAorICAgIGFkZCAgICAgICAgICByMiwgMTI4CisgICAgY21wICAgICAgICAgIHI1LCAxNgorICAgIGpsIC5uZXh0YmxvY2sKKyAgICBSRVBfUkVUCisubm9fZGM6CitJTklUX1hNTSBjcHVuYW1lCisgICAgbW92ICAgICAgIGRzdDJkLCBkd29yZCBbcjErcjUqNF0KKyAgICBhZGQgICAgICAgZHN0MnEsIHIwCisgICAgSURDVDhfQUREX1NTRSBkc3QycSwgcjIsIHIzLCByNgorJWlmIEFSQ0hfWDg2XzY0ID09IDAKKyAgICBtb3YgICAgICAgICAgcjEsIHIxbQorJWVuZGlmCisuc2tpcGJsb2NrOgorICAgIGFkZCAgICAgICAgICByNSwgNAorICAgIGFkZCAgICAgICAgICByMiwgMTI4CisgICAgY21wICAgICAgICAgIHI1LCAxNgorICAgIGpsIC5uZXh0YmxvY2sKKyAgICBSRVBfUkVUCisKK0lOSVRfTU1YIG1teAoraDI2NF9pZGN0X2FkZDhfbW14X3BsYW5lOgorLm5leHRibG9jazoKKyAgICBtb3Z6eCAgICAgICAgcjYsIGJ5dGUgW3NjYW44K3I1XQorICAgIG1vdnp4ICAgICAgICByNiwgYnl0ZSBbcjQrcjZdCisgICAgb3IgICAgICAgICAgcjZ3LCB3b3JkIFtyMl0KKyAgICB0ZXN0ICAgICAgICAgcjYsIHI2CisgICAganogLnNraXBibG9jaworJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92ICAgICAgICAgcjBkLCBkd29yZCBbcjErcjUqNF0KKyAgICBhZGQgICAgICAgICAgcjAsIFtkc3QycV0KKyVlbHNlCisgICAgbW92ICAgICAgICAgIHIwLCByMW0gOyBYWFggcjFtIGhlcmUgaXMgYWN0dWFsbHkgcjBtIG9mIHRoZSBjYWxsaW5nIGZ1bmMKKyAgICBtb3YgICAgICAgICAgcjAsIFtyMF0KKyAgICBhZGQgICAgICAgICAgcjAsIGR3b3JkIFtyMStyNSo0XQorJWVuZGlmCisgICAgSURDVDRfQUREICAgIHIwLCByMiwgcjMKKy5za2lwYmxvY2s6CisgICAgaW5jICAgICAgICAgIHI1CisgICAgYWRkICAgICAgICAgIHIyLCAzMgorICAgIHRlc3QgICAgICAgICByNSwgMworICAgIGpueiAubmV4dGJsb2NrCisgICAgcmVwIHJldAorCis7IHZvaWQgZmZfaDI2NF9pZGN0X2FkZDhfOF9tbXgodWludDhfdCAqKmRlc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2ICogOF0pCitjZ2xvYmFsIGgyNjRfaWRjdF9hZGQ4XzgsIDUsIDggKyBucGljcmVncywgMCwgZHN0MSwgYmxvY2tfb2Zmc2V0LCBibG9jaywgc3RyaWRlLCBubnpjLCBjbnRyLCBjb2VmZiwgZHN0MiwgcGljcmVnCisgICAgbW92ICAgICAgICAgIHI1LCAxNgorICAgIGFkZCAgICAgICAgICByMiwgNTEyCislaWZkZWYgUElDCisgICAgbGVhICAgICBwaWNyZWdxLCBbc2NhbjhfbWVtXQorJWVuZGlmCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3YgICAgICAgZHN0MnEsIHIwCislZW5kaWYKKyAgICBjYWxsICAgICAgICAgaDI2NF9pZGN0X2FkZDhfbW14X3BsYW5lCisgICAgbW92ICAgICAgICAgIHI1LCAzMgorICAgIGFkZCAgICAgICAgICByMiwgMzg0CislaWYgQVJDSF9YODZfNjQKKyAgICBhZGQgICAgICAgZHN0MnEsIGdwcnNpemUKKyVlbHNlCisgICAgYWRkICAgICAgICByMG1wLCBncHJzaXplCislZW5kaWYKKyAgICBjYWxsICAgICAgICAgaDI2NF9pZGN0X2FkZDhfbW14X3BsYW5lCisgICAgUkVUCisKK2gyNjRfaWRjdF9hZGQ4X21teGV4dF9wbGFuZToKKy5uZXh0YmxvY2s6CisgICAgbW92enggICAgICAgIHI2LCBieXRlIFtzY2FuOCtyNV0KKyAgICBtb3Z6eCAgICAgICAgcjYsIGJ5dGUgW3I0K3I2XQorICAgIHRlc3QgICAgICAgICByNiwgcjYKKyAgICBqeiAudHJ5X2RjCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3YgICAgICAgICByMGQsIGR3b3JkIFtyMStyNSo0XQorICAgIGFkZCAgICAgICAgICByMCwgW2RzdDJxXQorJWVsc2UKKyAgICBtb3YgICAgICAgICAgcjAsIHIxbSA7IFhYWCByMW0gaGVyZSBpcyBhY3R1YWxseSByMG0gb2YgdGhlIGNhbGxpbmcgZnVuYworICAgIG1vdiAgICAgICAgICByMCwgW3IwXQorICAgIGFkZCAgICAgICAgICByMCwgZHdvcmQgW3IxK3I1KjRdCislZW5kaWYKKyAgICBJRENUNF9BREQgICAgcjAsIHIyLCByMworICAgIGluYyAgICAgICAgICByNQorICAgIGFkZCAgICAgICAgICByMiwgMzIKKyAgICB0ZXN0ICAgICAgICAgcjUsIDMKKyAgICBqbnogLm5leHRibG9jaworICAgIHJlcCByZXQKKy50cnlfZGM6CisgICAgbW92c3ggICAgICAgIHI2LCB3b3JkIFtyMl0KKyAgICB0ZXN0ICAgICAgICAgcjYsIHI2CisgICAganogLnNraXBibG9jaworICAgIG1vdiAgIHdvcmQgW3IyXSwgMAorICAgIERDX0FERF9NTVhFWFRfSU5JVCByNiwgcjMKKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdiAgICAgICAgIHIwZCwgZHdvcmQgW3IxK3I1KjRdCisgICAgYWRkICAgICAgICAgIHIwLCBbZHN0MnFdCislZWxzZQorICAgIG1vdiAgICAgICAgICByMCwgcjFtIDsgWFhYIHIxbSBoZXJlIGlzIGFjdHVhbGx5IHIwbSBvZiB0aGUgY2FsbGluZyBmdW5jCisgICAgbW92ICAgICAgICAgIHIwLCBbcjBdCisgICAgYWRkICAgICAgICAgIHIwLCBkd29yZCBbcjErcjUqNF0KKyVlbmRpZgorICAgIERDX0FERF9NTVhFWFRfT1AgbW92aCwgcjAsIHIzLCByNgorLnNraXBibG9jazoKKyAgICBpbmMgICAgICAgICAgcjUKKyAgICBhZGQgICAgICAgICAgcjIsIDMyCisgICAgdGVzdCAgICAgICAgIHI1LCAzCisgICAgam56IC5uZXh0YmxvY2sKKyAgICByZXAgcmV0CisKK0lOSVRfTU1YIG1teGV4dAorOyB2b2lkIGZmX2gyNjRfaWRjdF9hZGQ4XzhfbW14ZXh0KHVpbnQ4X3QgKipkZXN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5uemNbNiAqIDhdKQorY2dsb2JhbCBoMjY0X2lkY3RfYWRkOF84LCA1LCA4ICsgbnBpY3JlZ3MsIDAsIGRzdDEsIGJsb2NrX29mZnNldCwgYmxvY2ssIHN0cmlkZSwgbm56YywgY250ciwgY29lZmYsIGRzdDIsIHBpY3JlZworICAgIG1vdiAgICAgICAgICByNSwgMTYKKyAgICBhZGQgICAgICAgICAgcjIsIDUxMgorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92ICAgICAgIGRzdDJxLCByMAorJWVuZGlmCislaWZkZWYgUElDCisgICAgbGVhICAgICBwaWNyZWdxLCBbc2NhbjhfbWVtXQorJWVuZGlmCisgICAgY2FsbCBoMjY0X2lkY3RfYWRkOF9tbXhleHRfcGxhbmUKKyAgICBtb3YgICAgICAgICAgcjUsIDMyCisgICAgYWRkICAgICAgICAgIHIyLCAzODQKKyVpZiBBUkNIX1g4Nl82NAorICAgIGFkZCAgICAgICBkc3QycSwgZ3Byc2l6ZQorJWVsc2UKKyAgICBhZGQgICAgICAgIHIwbXAsIGdwcnNpemUKKyVlbmRpZgorICAgIGNhbGwgaDI2NF9pZGN0X2FkZDhfbW14ZXh0X3BsYW5lCisgICAgUkVUCisKKzsgcjAgPSB1aW50OF90ICpkc3QsIHIyID0gaW50MTZfdCAqYmxvY2ssIHIzID0gaW50IHN0cmlkZSwgcjY9Y2xvYmJlcmVkCitoMjY0X2lkY3RfZGNfYWRkOF9tbXhleHQ6CisgICAgbW92ZCAgICAgICAgIG0wLCBbcjIgICBdICAgICAgICAgIDsgIDAgMCBYIEQKKyAgICBtb3Ygd29yZCBbcjIrIDBdLCAwCisgICAgcHVucGNrbHdkICAgIG0wLCBbcjIrMzJdICAgICAgICAgIDsgIHggWCBkIEQKKyAgICBtb3Ygd29yZCBbcjIrMzJdLCAwCisgICAgcGFkZHN3ICAgICAgIG0wLCBbcHdfMzJdCisgICAgcHNyYXcgICAgICAgIG0wLCA2CisgICAgcHVucGNrbHdkICAgIG0wLCBtMCAgICAgICAgICAgICAgIDsgIGQgZCBEIEQKKyAgICBweG9yICAgICAgICAgbTEsIG0xICAgICAgICAgICAgICAgOyAgMCAwIDAgMAorICAgIHBzdWJ3ICAgICAgICBtMSwgbTAgICAgICAgICAgICAgICA7IC1kLWQtRC1ECisgICAgcGFja3Vzd2IgICAgIG0wLCBtMSAgICAgICAgICAgICAgIDsgLWQtZC1ELUQgZCBkIEQgRAorICAgIHBzaHVmdyAgICAgICBtMSwgbTAsIDB4RkEgICAgICAgICA7IC1kLWQtZC1kLUQtRC1ELUQKKyAgICBwdW5wY2tsd2QgICAgbTAsIG0wICAgICAgICAgICAgICAgOyAgZCBkIGQgZCBEIEQgRCBECisgICAgbGVhICAgICAgICAgIHI2LCBbcjMqM10KKyAgICBEQ19BRERfTU1YRVhUX09QIG1vdnEsIHIwLCByMywgcjYKKyAgICByZXQKKworQUxJR04gMTYKK0lOSVRfWE1NIHNzZTIKKzsgcjAgPSB1aW50OF90ICpkc3QgKGNsb2JiZXJlZCksIHIyID0gaW50MTZfdCAqYmxvY2ssIHIzID0gaW50IHN0cmlkZQoraDI2NF9hZGQ4eDRfaWRjdF9zc2UyOgorICAgIG1vdnEgICBtMCwgW3IyKyAwXQorICAgIG1vdnEgICBtMSwgW3IyKyA4XQorICAgIG1vdnEgICBtMiwgW3IyKzE2XQorICAgIG1vdnEgICBtMywgW3IyKzI0XQorICAgIG1vdmhwcyBtMCwgW3IyKzMyXQorICAgIG1vdmhwcyBtMSwgW3IyKzQwXQorICAgIG1vdmhwcyBtMiwgW3IyKzQ4XQorICAgIG1vdmhwcyBtMywgW3IyKzU2XQorICAgIElEQ1Q0XzFEIHcsMCwxLDIsMyw0LDUKKyAgICBUUkFOU1BPU0UyeDR4NFcgMCwxLDIsMyw0CisgICAgcGFkZHcgbTAsIFtwd18zMl0KKyAgICBJRENUNF8xRCB3LDAsMSwyLDMsNCw1CisgICAgcHhvciAgbTcsIG03CisgICAgbW92YSBbcjIrIDBdLCBtNworICAgIG1vdmEgW3IyKzE2XSwgbTcKKyAgICBtb3ZhIFtyMiszMl0sIG03CisgICAgbW92YSBbcjIrNDhdLCBtNworICAgIFNUT1JFX0RJRkZ4MiBtMCwgbTEsIG00LCBtNSwgbTcsIDYsIHIwLCByMworICAgIGxlYSAgIHIwLCBbcjArcjMqMl0KKyAgICBTVE9SRV9ESUZGeDIgbTIsIG0zLCBtNCwgbTUsIG03LCA2LCByMCwgcjMKKyAgICByZXQKKworJW1hY3JvIGFkZDE2X3NzZTJfY3ljbGUgMgorICAgIG1vdnp4ICAgICAgIHIwLCB3b3JkIFtyNCslMl0KKyAgICB0ZXN0ICAgICAgICByMCwgcjAKKyAgICBqeiAuY3ljbGUlMWVuZAorICAgIG1vdiAgICAgICAgcjBkLCBkd29yZCBbcjErJTEqOF0KKyVpZiBBUkNIX1g4Nl82NAorICAgIGFkZCAgICAgICAgIHIwLCByNQorJWVsc2UKKyAgICBhZGQgICAgICAgICByMCwgcjBtCislZW5kaWYKKyAgICBjYWxsICAgICAgICBoMjY0X2FkZDh4NF9pZGN0X3NzZTIKKy5jeWNsZSUxZW5kOgorJWlmICUxIDwgNworICAgIGFkZCAgICAgICAgIHIyLCA2NAorJWVuZGlmCislZW5kbWFjcm8KKworOyB2b2lkIGZmX2gyNjRfaWRjdF9hZGQxNl84X3NzZTIodWludDhfdCAqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKK2NnbG9iYWwgaDI2NF9pZGN0X2FkZDE2XzgsIDUsIDUgKyBBUkNIX1g4Nl82NCwgOAorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92ICAgICAgICAgcjUsIHIwCislZW5kaWYKKyAgICA7IHVucm9sbGluZyBvZiB0aGUgbG9vcCBsZWFkcyB0byBhbiBhdmVyYWdlIHBlcmZvcm1hbmNlIGdhaW4gb2YKKyAgICA7IDIwLTI1JQorICAgIGFkZDE2X3NzZTJfY3ljbGUgMCwgMHhjCisgICAgYWRkMTZfc3NlMl9jeWNsZSAxLCAweDE0CisgICAgYWRkMTZfc3NlMl9jeWNsZSAyLCAweGUKKyAgICBhZGQxNl9zc2UyX2N5Y2xlIDMsIDB4MTYKKyAgICBhZGQxNl9zc2UyX2N5Y2xlIDQsIDB4MWMKKyAgICBhZGQxNl9zc2UyX2N5Y2xlIDUsIDB4MjQKKyAgICBhZGQxNl9zc2UyX2N5Y2xlIDYsIDB4MWUKKyAgICBhZGQxNl9zc2UyX2N5Y2xlIDcsIDB4MjYKKyAgICBSRVQKKworJW1hY3JvIGFkZDE2aW50cmFfc3NlMl9jeWNsZSAyCisgICAgbW92enggICAgICAgcjAsIHdvcmQgW3I0KyUyXQorICAgIHRlc3QgICAgICAgIHIwLCByMAorICAgIGp6IC50cnklMWRjCisgICAgbW92ICAgICAgICByMGQsIGR3b3JkIFtyMSslMSo4XQorJWlmIEFSQ0hfWDg2XzY0CisgICAgYWRkICAgICAgICAgcjAsIHI3CislZWxzZQorICAgIGFkZCAgICAgICAgIHIwLCByMG0KKyVlbmRpZgorICAgIGNhbGwgICAgICAgIGgyNjRfYWRkOHg0X2lkY3Rfc3NlMgorICAgIGptcCAuY3ljbGUlMWVuZAorLnRyeSUxZGM6CisgICAgbW92c3ggICAgICAgcjAsIHdvcmQgW3IyICAgXQorICAgIG9yICAgICAgICAgcjB3LCB3b3JkIFtyMiszMl0KKyAgICBqeiAuY3ljbGUlMWVuZAorICAgIG1vdiAgICAgICAgcjBkLCBkd29yZCBbcjErJTEqOF0KKyVpZiBBUkNIX1g4Nl82NAorICAgIGFkZCAgICAgICAgIHIwLCByNworJWVsc2UKKyAgICBhZGQgICAgICAgICByMCwgcjBtCislZW5kaWYKKyAgICBjYWxsICAgICAgICBoMjY0X2lkY3RfZGNfYWRkOF9tbXhleHQKKy5jeWNsZSUxZW5kOgorJWlmICUxIDwgNworICAgIGFkZCAgICAgICAgIHIyLCA2NAorJWVuZGlmCislZW5kbWFjcm8KKworOyB2b2lkIGZmX2gyNjRfaWRjdF9hZGQxNmludHJhXzhfc3NlMih1aW50OF90ICpkc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKK2NnbG9iYWwgaDI2NF9pZGN0X2FkZDE2aW50cmFfOCwgNSwgNyArIEFSQ0hfWDg2XzY0LCA4CislaWYgQVJDSF9YODZfNjQKKyAgICBtb3YgICAgICAgICByNywgcjAKKyVlbmRpZgorICAgIGFkZDE2aW50cmFfc3NlMl9jeWNsZSAwLCAweGMKKyAgICBhZGQxNmludHJhX3NzZTJfY3ljbGUgMSwgMHgxNAorICAgIGFkZDE2aW50cmFfc3NlMl9jeWNsZSAyLCAweGUKKyAgICBhZGQxNmludHJhX3NzZTJfY3ljbGUgMywgMHgxNgorICAgIGFkZDE2aW50cmFfc3NlMl9jeWNsZSA0LCAweDFjCisgICAgYWRkMTZpbnRyYV9zc2UyX2N5Y2xlIDUsIDB4MjQKKyAgICBhZGQxNmludHJhX3NzZTJfY3ljbGUgNiwgMHgxZQorICAgIGFkZDE2aW50cmFfc3NlMl9jeWNsZSA3LCAweDI2CisgICAgUkVUCisKKyVtYWNybyBhZGQ4X3NzZTJfY3ljbGUgMgorICAgIG1vdnp4ICAgICAgIHIwLCB3b3JkIFtyNCslMl0KKyAgICB0ZXN0ICAgICAgICByMCwgcjAKKyAgICBqeiAudHJ5JTFkYworJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92ICAgICAgICByMGQsIGR3b3JkIFtyMSsoJTEmMSkqOCs2NCooMSsoJTE+PjEpKV0KKyAgICBhZGQgICAgICAgICByMCwgW3I3XQorJWVsc2UKKyAgICBtb3YgICAgICAgICByMCwgcjBtCisgICAgbW92ICAgICAgICAgcjAsIFtyMF0KKyAgICBhZGQgICAgICAgICByMCwgZHdvcmQgW3IxKyglMSYxKSo4KzY0KigxKyglMT4+MSkpXQorJWVuZGlmCisgICAgY2FsbCAgICAgICAgaDI2NF9hZGQ4eDRfaWRjdF9zc2UyCisgICAgam1wIC5jeWNsZSUxZW5kCisudHJ5JTFkYzoKKyAgICBtb3ZzeCAgICAgICByMCwgd29yZCBbcjIgICBdCisgICAgb3IgICAgICAgICByMHcsIHdvcmQgW3IyKzMyXQorICAgIGp6IC5jeWNsZSUxZW5kCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3YgICAgICAgIHIwZCwgZHdvcmQgW3IxKyglMSYxKSo4KzY0KigxKyglMT4+MSkpXQorICAgIGFkZCAgICAgICAgIHIwLCBbcjddCislZWxzZQorICAgIG1vdiAgICAgICAgIHIwLCByMG0KKyAgICBtb3YgICAgICAgICByMCwgW3IwXQorICAgIGFkZCAgICAgICAgIHIwLCBkd29yZCBbcjErKCUxJjEpKjgrNjQqKDErKCUxPj4xKSldCislZW5kaWYKKyAgICBjYWxsICAgICAgICBoMjY0X2lkY3RfZGNfYWRkOF9tbXhleHQKKy5jeWNsZSUxZW5kOgorJWlmICUxID09IDEKKyAgICBhZGQgICAgICAgICByMiwgMzg0KzY0CislZWxpZiAlMSA8IDMKKyAgICBhZGQgICAgICAgICByMiwgNjQKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgdm9pZCBmZl9oMjY0X2lkY3RfYWRkOF84X3NzZTIodWludDhfdCAqKmRlc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKK2NnbG9iYWwgaDI2NF9pZGN0X2FkZDhfOCwgNSwgNyArIEFSQ0hfWDg2XzY0LCA4CisgICAgYWRkICAgICAgICAgIHIyLCA1MTIKKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdiAgICAgICAgICByNywgcjAKKyVlbmRpZgorICAgIGFkZDhfc3NlMl9jeWNsZSAwLCAweDM0CisgICAgYWRkOF9zc2UyX2N5Y2xlIDEsIDB4M2MKKyVpZiBBUkNIX1g4Nl82NAorICAgIGFkZCAgICAgICAgICByNywgZ3Byc2l6ZQorJWVsc2UKKyAgICBhZGQgICAgICAgIHIwbXAsIGdwcnNpemUKKyVlbmRpZgorICAgIGFkZDhfc3NlMl9jeWNsZSAyLCAweDVjCisgICAgYWRkOF9zc2UyX2N5Y2xlIDMsIDB4NjQKKyAgICBSRVQKKworO3ZvaWQgZmZfaDI2NF9sdW1hX2RjX2RlcXVhbnRfaWRjdF9tbXgoaW50MTZfdCAqb3V0cHV0LCBpbnQxNl90ICppbnB1dCwgaW50IHFtdWwpCisKKyVtYWNybyBXQUxTSDRfMUQgNQorICAgIFNVTVNVQl9CQURDIHcsICU0LCAlMywgJTIsICUxLCAlNQorICAgIFNVTVNVQl9CQURDIHcsICU0LCAlMiwgJTMsICUxLCAlNQorICAgIFNXQVAgJTEsICU0LCAlMworJWVuZG1hY3JvCisKKyVtYWNybyBERVFVQU5UX01NWCAzCisgICAgbW92YSAgICAgICAgbTcsIFtwd18xXQorICAgIG1vdmEgICAgICAgIG00LCAlMQorICAgIHB1bnBja2x3ZCAgICUxLCBtNworICAgIHB1bnBja2h3ZCAgIG00LCBtNworICAgIG1vdmEgICAgICAgIG01LCAlMgorICAgIHB1bnBja2x3ZCAgICUyLCBtNworICAgIHB1bnBja2h3ZCAgIG01LCBtNworICAgIG1vdmQgICAgICAgIG03LCB0M2QKKyAgICBwdW5wY2tsZHEgICBtNywgbTcKKyAgICBwbWFkZHdkICAgICAlMSwgbTcKKyAgICBwbWFkZHdkICAgICAlMiwgbTcKKyAgICBwbWFkZHdkICAgICBtNCwgbTcKKyAgICBwbWFkZHdkICAgICBtNSwgbTcKKyAgICBwc3JhZCAgICAgICAlMSwgJTMKKyAgICBwc3JhZCAgICAgICAlMiwgJTMKKyAgICBwc3JhZCAgICAgICBtNCwgJTMKKyAgICBwc3JhZCAgICAgICBtNSwgJTMKKyAgICBwYWNrc3NkdyAgICAlMSwgbTQKKyAgICBwYWNrc3NkdyAgICAlMiwgbTUKKyVlbmRtYWNybworCislbWFjcm8gU1RPUkVfV09SRFMgNS05CislaWYgY3B1ZmxhZyhzc2UpCisgICAgbW92ZCAgdDBkLCAlMQorICAgIHBzcmxkcSAgJTEsIDQKKyAgICBtb3ZkICB0MWQsICUxCisgICAgcHNybGRxICAlMSwgNAorICAgIG1vdiBbdDIrJTIqMzJdLCB0MHcKKyAgICBtb3YgW3QyKyU0KjMyXSwgdDF3CisgICAgc2hyICAgdDBkLCAxNgorICAgIHNociAgIHQxZCwgMTYKKyAgICBtb3YgW3QyKyUzKjMyXSwgdDB3CisgICAgbW92IFt0MislNSozMl0sIHQxdworICAgIG1vdmQgIHQwZCwgJTEKKyAgICBwc3JsZHEgICUxLCA0CisgICAgbW92ZCAgdDFkLCAlMQorICAgIG1vdiBbdDIrJTYqMzJdLCB0MHcKKyAgICBtb3YgW3QyKyU4KjMyXSwgdDF3CisgICAgc2hyICAgdDBkLCAxNgorICAgIHNociAgIHQxZCwgMTYKKyAgICBtb3YgW3QyKyU3KjMyXSwgdDB3CisgICAgbW92IFt0MislOSozMl0sIHQxdworJWVsc2UKKyAgICBtb3ZkICB0MGQsICUxCisgICAgcHNybHEgICUxLCAzMgorICAgIG1vdmQgIHQxZCwgJTEKKyAgICBtb3YgW3QyKyUyKjMyXSwgdDB3CisgICAgbW92IFt0MislNCozMl0sIHQxdworICAgIHNociAgIHQwZCwgMTYKKyAgICBzaHIgICB0MWQsIDE2CisgICAgbW92IFt0MislMyozMl0sIHQwdworICAgIG1vdiBbdDIrJTUqMzJdLCB0MXcKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBERVFVQU5UX1NUT1JFIDEKKyVpZiBjcHVmbGFnKHNzZTIpCisgICAgbW92ZCAgICAgIHhtbTQsIHQzZAorICAgIG1vdnEgICAgICB4bW01LCBbcHdfMV0KKyAgICBwc2h1ZmQgICAgeG1tNCwgeG1tNCwgMAorICAgIG1vdnEyZHEgICB4bW0wLCBtMAorICAgIG1vdnEyZHEgICB4bW0xLCBtMQorICAgIG1vdnEyZHEgICB4bW0yLCBtMgorICAgIG1vdnEyZHEgICB4bW0zLCBtMworICAgIHB1bnBja2x3ZCB4bW0wLCB4bW01CisgICAgcHVucGNrbHdkIHhtbTEsIHhtbTUKKyAgICBwdW5wY2tsd2QgeG1tMiwgeG1tNQorICAgIHB1bnBja2x3ZCB4bW0zLCB4bW01CisgICAgcG1hZGR3ZCAgIHhtbTAsIHhtbTQKKyAgICBwbWFkZHdkICAgeG1tMSwgeG1tNAorICAgIHBtYWRkd2QgICB4bW0yLCB4bW00CisgICAgcG1hZGR3ZCAgIHhtbTMsIHhtbTQKKyAgICBwc3JhZCAgICAgeG1tMCwgJTEKKyAgICBwc3JhZCAgICAgeG1tMSwgJTEKKyAgICBwc3JhZCAgICAgeG1tMiwgJTEKKyAgICBwc3JhZCAgICAgeG1tMywgJTEKKyAgICBwYWNrc3NkdyAgeG1tMCwgeG1tMQorICAgIHBhY2tzc2R3ICB4bW0yLCB4bW0zCisgICAgU1RPUkVfV09SRFMgeG1tMCwgIDAsICAxLCAgNCwgIDUsICAyLCAgMywgIDYsICA3CisgICAgU1RPUkVfV09SRFMgeG1tMiwgIDgsICA5LCAxMiwgMTMsIDEwLCAxMSwgMTQsIDE1CislZWxzZQorICAgIERFUVVBTlRfTU1YIG0wLCBtMSwgJTEKKyAgICBTVE9SRV9XT1JEUyBtMCwgIDAsICAxLCAgNCwgIDUKKyAgICBTVE9SRV9XT1JEUyBtMSwgIDIsICAzLCAgNiwgIDcKKworICAgIERFUVVBTlRfTU1YIG0yLCBtMywgJTEKKyAgICBTVE9SRV9XT1JEUyBtMiwgIDgsICA5LCAxMiwgMTMKKyAgICBTVE9SRV9XT1JEUyBtMywgMTAsIDExLCAxNCwgMTUKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBJRENUX0RDX0RFUVVBTlQgMQorY2dsb2JhbCBoMjY0X2x1bWFfZGNfZGVxdWFudF9pZGN0LCAzLCA0LCAlMQorICAgIDsgbWFudWFsbHkgc3BpbGwgWE1NIHJlZ2lzdGVycyBmb3IgV2luNjQgYmVjYXVzZQorICAgIDsgdGhlIGNvZGUgaGVyZSBpcyBpbml0aWFsaXplZCB3aXRoIElOSVRfTU1YCisgICAgV0lONjRfU1BJTExfWE1NICUxCisgICAgbW92cSAgICAgICAgbTMsIFtyMSsyNF0KKyAgICBtb3ZxICAgICAgICBtMiwgW3IxKzE2XQorICAgIG1vdnEgICAgICAgIG0xLCBbcjErIDhdCisgICAgbW92cSAgICAgICAgbTAsIFtyMSsgMF0KKyAgICBXQUxTSDRfMUQgICAgMCwxLDIsMyw0CisgICAgVFJBTlNQT1NFNHg0VyAwLDEsMiwzLDQKKyAgICBXQUxTSDRfMUQgICAgMCwxLDIsMyw0CisKKzsgc2hpZnQsIHRtcCwgb3V0cHV0LCBxbXVsCislaWYgV0lONjQKKyAgICBERUNMQVJFX1JFR19UTVAgMCwzLDEsMgorICAgIDsgd2UgY2FuJ3QgYXZvaWQgdGhpcywgYmVjYXVzZSByMCBpcyB0aGUgc2hpZnQgcmVnaXN0ZXIgKGVjeCkgb24gd2luNjQKKyAgICB4Y2hnICAgICAgICByMCwgdDIKKyVlbGlmIEFSQ0hfWDg2XzY0CisgICAgREVDTEFSRV9SRUdfVE1QIDMsMSwwLDIKKyVlbHNlCisgICAgREVDTEFSRV9SRUdfVE1QIDEsMywwLDIKKyVlbmRpZgorCisgICAgY21wICAgICAgICB0M2QsIDMyNzY3CisgICAgamcgLmJpZ19xbXVsCisgICAgYWRkICAgICAgICB0M2QsIDEyOCA8PCAxNgorICAgIERFUVVBTlRfU1RPUkUgOAorICAgIFJFVAorLmJpZ19xbXVsOgorICAgIGJzciAgICAgICAgdDBkLCB0M2QKKyAgICBhZGQgICAgICAgIHQzZCwgMTI4IDw8IDE2CisgICAgbW92ICAgICAgICB0MWQsIDcKKyAgICBjbXAgICAgICAgIHQwZCwgdDFkCisgICAgY21vdmcgICAgICB0MGQsIHQxZAorICAgIGluYyAgICAgICAgdDFkCisgICAgc2hyICAgICAgICB0M2QsIHQwYgorICAgIHN1YiAgICAgICAgdDFkLCB0MGQKKyVpZiBjcHVmbGFnKHNzZTIpCisgICAgbW92ZCAgICAgIHhtbTYsIHQxZAorICAgIERFUVVBTlRfU1RPUkUgeG1tNgorJWVsc2UKKyAgICBtb3ZkICAgICAgICBtNiwgdDFkCisgICAgREVRVUFOVF9TVE9SRSBtNgorJWVuZGlmCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CitJRENUX0RDX0RFUVVBTlQgMAorSU5JVF9NTVggc3NlMgorSURDVF9EQ19ERVFVQU5UIDcKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X2lkY3RfMTBiaXQuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfaWRjdF8xMGJpdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzYWNiMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X2lkY3RfMTBiaXQuYXNtCkBAIC0wLDAgKzEsNTk3IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIE1NWC9TU0UyL0FWWC1vcHRpbWl6ZWQgMTAtYml0IEguMjY0IGlEQ1QgY29kZQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMSB4MjY0IHByb2plY3QKKzsqCis7KiBBdXRob3JzOiBEYW5pZWwgS2FuZyA8ZGFuaWVsLmQua2FuZ0BnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworcHdfcGl4ZWxfbWF4OiB0aW1lcyA4IGR3ICgoMSA8PCAxMCktMSkKK3BkXzMyOiAgICAgICAgdGltZXMgNCBkZCAzMgorCitTRUNUSU9OIC50ZXh0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2gyNjRfaWRjdF9hZGRfMTAocGl4ZWwgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBTVE9SRV9ESUZGeDIgNgorICAgIHBzcmFkICAgICAgICUxLCA2CisgICAgcHNyYWQgICAgICAgJTIsIDYKKyAgICBwYWNrc3NkdyAgICAlMSwgJTIKKyAgICBtb3ZxICAgICAgICAlMywgWyU1XQorICAgIG1vdmhwcyAgICAgICUzLCBbJTUrJTZdCisgICAgcGFkZHN3ICAgICAgJTEsICUzCisgICAgQ0xJUFcgICAgICAgJTEsICU0LCBbcHdfcGl4ZWxfbWF4XQorICAgIG1vdnEgICAgICBbJTVdLCAlMQorICAgIG1vdmhwcyBbJTUrJTZdLCAlMQorJWVuZG1hY3JvCisKKyVtYWNybyBTVE9SRV9ESUZGMTYgNQorICAgIHBzcmFkICAgICAgICUxLCA2CisgICAgcHNyYWQgICAgICAgJTIsIDYKKyAgICBwYWNrc3NkdyAgICAlMSwgJTIKKyAgICBwYWRkc3cgICAgICAlMSwgWyU1XQorICAgIENMSVBXICAgICAgICUxLCAlMywgJTQKKyAgICBtb3ZhICAgICAgWyU1XSwgJTEKKyVlbmRtYWNybworCis7ZHN0LCBpbiwgc3RyaWRlCislbWFjcm8gSURDVDRfQUREXzEwIDMKKyAgICBtb3ZhICBtMCwgWyUyKyAwXQorICAgIG1vdmEgIG0xLCBbJTIrMTZdCisgICAgbW92YSAgbTIsIFslMiszMl0KKyAgICBtb3ZhICBtMywgWyUyKzQ4XQorICAgIElEQ1Q0XzFEIGQsMCwxLDIsMyw0LDUKKyAgICBUUkFOU1BPU0U0eDREIDAsMSwyLDMsNAorICAgIHBhZGRkIG0wLCBbcGRfMzJdCisgICAgSURDVDRfMUQgZCwwLDEsMiwzLDQsNQorICAgIHB4b3IgIG01LCBtNQorICAgIG1vdmEgWyUyKyAwXSwgbTUKKyAgICBtb3ZhIFslMisxNl0sIG01CisgICAgbW92YSBbJTIrMzJdLCBtNQorICAgIG1vdmEgWyUyKzQ4XSwgbTUKKyAgICBTVE9SRV9ESUZGeDIgbTAsIG0xLCBtNCwgbTUsICUxLCAlMworICAgIGxlYSAgICUxLCBbJTErJTMqMl0KKyAgICBTVE9SRV9ESUZGeDIgbTIsIG0zLCBtNCwgbTUsICUxLCAlMworJWVuZG1hY3JvCisKKyVtYWNybyBJRENUX0FERF8xMCAwCitjZ2xvYmFsIGgyNjRfaWRjdF9hZGRfMTAsIDMsMworICAgIElEQ1Q0X0FERF8xMCByMCwgcjEsIHIyCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorSURDVF9BRERfMTAKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitJRENUX0FERF8xMAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2gyNjRfaWRjdF9hZGQxNl8xMChwaXhlbCAqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2KjhdKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ozs7Ozs7IE5PIEZBVEUgU0FNUExFUyBUUklHR0VSIFRISVMKKyVtYWNybyBBREQ0eDRJRENUIDAKK2FkZDR4NF9pZGN0ICUrIFNVRkZJWDoKKyAgICBhZGQgICByNSwgcjAKKyAgICBtb3ZhICBtMCwgW3IyKyAwXQorICAgIG1vdmEgIG0xLCBbcjIrMTZdCisgICAgbW92YSAgbTIsIFtyMiszMl0KKyAgICBtb3ZhICBtMywgW3IyKzQ4XQorICAgIElEQ1Q0XzFEIGQsMCwxLDIsMyw0LDUKKyAgICBUUkFOU1BPU0U0eDREIDAsMSwyLDMsNAorICAgIHBhZGRkIG0wLCBbcGRfMzJdCisgICAgSURDVDRfMUQgZCwwLDEsMiwzLDQsNQorICAgIHB4b3IgIG01LCBtNQorICAgIG1vdmEgIFtyMisgMF0sIG01CisgICAgbW92YSAgW3IyKzE2XSwgbTUKKyAgICBtb3ZhICBbcjIrMzJdLCBtNQorICAgIG1vdmEgIFtyMis0OF0sIG01CisgICAgU1RPUkVfRElGRngyIG0wLCBtMSwgbTQsIG01LCByNSwgcjMKKyAgICBsZWEgICByNSwgW3I1K3IzKjJdCisgICAgU1RPUkVfRElGRngyIG0yLCBtMywgbTQsIG01LCByNSwgcjMKKyAgICByZXQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitBTElHTiAxNgorQURENHg0SURDVAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0FMSUdOIDE2CitBREQ0eDRJRENUCislZW5kaWYKKworJW1hY3JvIEFERDE2X09QIDIKKyAgICBjbXAgICAgICAgICAgYnl0ZSBbcjQrJTJdLCAwCisgICAganogLnNraXBibG9jayUxCisgICAgbW92ICAgICAgICAgcjVkLCBbcjErJTEqNF0KKyAgICBjYWxsIGFkZDR4NF9pZGN0ICUrIFNVRkZJWAorLnNraXBibG9jayUxOgorJWlmICUxPDE1CisgICAgYWRkICAgICAgICAgIHIyLCA2NAorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIElEQ1RfQUREMTZfMTAgMAorY2dsb2JhbCBoMjY0X2lkY3RfYWRkMTZfMTAsIDUsNgorICAgIEFERDE2X09QIDAsIDQrMSo4CisgICAgQUREMTZfT1AgMSwgNSsxKjgKKyAgICBBREQxNl9PUCAyLCA0KzIqOAorICAgIEFERDE2X09QIDMsIDUrMio4CisgICAgQUREMTZfT1AgNCwgNisxKjgKKyAgICBBREQxNl9PUCA1LCA3KzEqOAorICAgIEFERDE2X09QIDYsIDYrMio4CisgICAgQUREMTZfT1AgNywgNysyKjgKKyAgICBBREQxNl9PUCA4LCA0KzMqOAorICAgIEFERDE2X09QIDksIDUrMyo4CisgICAgQUREMTZfT1AgMTAsIDQrNCo4CisgICAgQUREMTZfT1AgMTEsIDUrNCo4CisgICAgQUREMTZfT1AgMTIsIDYrMyo4CisgICAgQUREMTZfT1AgMTMsIDcrMyo4CisgICAgQUREMTZfT1AgMTQsIDYrNCo4CisgICAgQUREMTZfT1AgMTUsIDcrNCo4CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK0lEQ1RfQUREMTZfMTAKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitJRENUX0FERDE2XzEwCislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaDI2NF9pZGN0X2RjX2FkZF8xMChwaXhlbCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIElEQ1RfRENfQUREX09QXzEwIDMKKyAgICBweG9yICAgICAgbTUsIG01CislaWYgYXZ4X2VuYWJsZWQKKyAgICBwYWRkdyAgICAgbTEsIG0wLCBbJTErMCAgIF0KKyAgICBwYWRkdyAgICAgbTIsIG0wLCBbJTErJTIgIF0KKyAgICBwYWRkdyAgICAgbTMsIG0wLCBbJTErJTIqMl0KKyAgICBwYWRkdyAgICAgbTQsIG0wLCBbJTErJTMgIF0KKyVlbHNlCisgICAgbW92YSAgICAgIG0xLCBbJTErMCAgIF0KKyAgICBtb3ZhICAgICAgbTIsIFslMSslMiAgXQorICAgIG1vdmEgICAgICBtMywgWyUxKyUyKjJdCisgICAgbW92YSAgICAgIG00LCBbJTErJTMgIF0KKyAgICBwYWRkdyAgICAgbTEsIG0wCisgICAgcGFkZHcgICAgIG0yLCBtMAorICAgIHBhZGR3ICAgICBtMywgbTAKKyAgICBwYWRkdyAgICAgbTQsIG0wCislZW5kaWYKKyAgICBDTElQVyAgICAgbTEsIG01LCBtNgorICAgIENMSVBXICAgICBtMiwgbTUsIG02CisgICAgQ0xJUFcgICAgIG0zLCBtNSwgbTYKKyAgICBDTElQVyAgICAgbTQsIG01LCBtNgorICAgIG1vdmEgWyUxKzAgICBdLCBtMQorICAgIG1vdmEgWyUxKyUyICBdLCBtMgorICAgIG1vdmEgWyUxKyUyKjJdLCBtMworICAgIG1vdmEgWyUxKyUzICBdLCBtNAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCBoMjY0X2lkY3RfZGNfYWRkXzEwLDMsMworICAgIG1vdmQgICAgICBtMCwgW3IxXQorICAgIG1vdiBkd29yZCBbcjFdLCAwCisgICAgcGFkZGQgICAgIG0wLCBbcGRfMzJdCisgICAgcHNyYWQgICAgIG0wLCA2CisgICAgbGVhICAgICAgIHIxLCBbcjIqM10KKyAgICBwc2h1ZncgICAgbTAsIG0wLCAwCisgICAgbW92YSAgICAgIG02LCBbcHdfcGl4ZWxfbWF4XQorICAgIElEQ1RfRENfQUREX09QXzEwIHIwLCByMiwgcjEKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaDI2NF9pZGN0OF9kY19hZGRfMTAocGl4ZWwgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBJRENUOF9EQ19BREQgMAorY2dsb2JhbCBoMjY0X2lkY3Q4X2RjX2FkZF8xMCwzLDQsNworICAgIG1vdmQgICAgICBtMCwgW3IxXQorICAgIG1vdiBkd29yZFtyMV0sIDAKKyAgICBwYWRkZCAgICAgbTAsIFtwZF8zMl0KKyAgICBwc3JhZCAgICAgbTAsIDYKKyAgICBsZWEgICAgICAgcjEsIFtyMiozXQorICAgIFNQTEFUVyAgICBtMCwgbTAsIDAKKyAgICBtb3ZhICAgICAgbTYsIFtwd19waXhlbF9tYXhdCisgICAgSURDVF9EQ19BRERfT1BfMTAgcjAsIHIyLCByMQorICAgIGxlYSAgICAgICByMCwgW3IwK3IyKjRdCisgICAgSURDVF9EQ19BRERfT1BfMTAgcjAsIHIyLCByMQorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK0lEQ1Q4X0RDX0FERAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0lEQ1Q4X0RDX0FERAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2gyNjRfaWRjdF9hZGQxNmludHJhXzEwKHBpeGVsICpkc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2KjhdKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gQUMgMQorLmFjJTE6CisgICAgbW92ICByNWQsIFtyMSsoJTErMCkqNF0KKyAgICBjYWxsIGFkZDR4NF9pZGN0ICUrIFNVRkZJWAorICAgIG1vdiAgcjVkLCBbcjErKCUxKzEpKjRdCisgICAgYWRkICByMiwgNjQKKyAgICBjYWxsIGFkZDR4NF9pZGN0ICUrIFNVRkZJWAorICAgIGFkZCAgcjIsIDY0CisgICAgam1wIC5za2lwYWRkJTEKKyVlbmRtYWNybworCislYXNzaWduIGxhc3RfYmxvY2sgMTYKKyVtYWNybyBBREQxNl9PUF9JTlRSQSAyCisgICAgY21wICAgICAgd29yZCBbcjQrJTJdLCAwCisgICAgam56IC5hYyUxCisgICAgbW92ICAgICAgcjVkLCBbcjIrIDBdCisgICAgb3IgICAgICAgcjVkLCBbcjIrNjRdCisgICAganogLnNraXBibG9jayUxCisgICAgbW92ICAgICAgcjVkLCBbcjErKCUxKzApKjRdCisgICAgY2FsbCBpZGN0X2RjX2FkZCAlKyBTVUZGSVgKKy5za2lwYmxvY2slMToKKyVpZiAlMTxsYXN0X2Jsb2NrLTIKKyAgICBhZGQgICAgICAgcjIsIDEyOAorJWVuZGlmCisuc2tpcGFkZCUxOgorJWVuZG1hY3JvCisKKyVtYWNybyBJRENUX0FERDE2SU5UUkFfMTAgMAoraWRjdF9kY19hZGQgJSsgU1VGRklYOgorICAgIGFkZCAgICAgICByNSwgcjAKKyAgICBtb3ZxICAgICAgbTAsIFtyMisgMF0KKyAgICBtb3ZocHMgICAgbTAsIFtyMis2NF0KKyAgICBtb3YgZHdvcmQgW3IyKyAwXSwgMAorICAgIG1vdiBkd29yZCBbcjIrNjRdLCAwCisgICAgcGFkZGQgICAgIG0wLCBbcGRfMzJdCisgICAgcHNyYWQgICAgIG0wLCA2CisgICAgcHNodWZodyAgIG0wLCBtMCwgMAorICAgIHBzaHVmbHcgICBtMCwgbTAsIDAKKyAgICBsZWEgICAgICAgcjYsIFtyMyozXQorICAgIG1vdmEgICAgICBtNiwgW3B3X3BpeGVsX21heF0KKyAgICBJRENUX0RDX0FERF9PUF8xMCByNSwgcjMsIHI2CisgICAgcmV0CisKK2NnbG9iYWwgaDI2NF9pZGN0X2FkZDE2aW50cmFfMTAsNSw3LDgKKyAgICBBREQxNl9PUF9JTlRSQSAwLCA0KzEqOAorICAgIEFERDE2X09QX0lOVFJBIDIsIDQrMio4CisgICAgQUREMTZfT1BfSU5UUkEgNCwgNisxKjgKKyAgICBBREQxNl9PUF9JTlRSQSA2LCA2KzIqOAorICAgIEFERDE2X09QX0lOVFJBIDgsIDQrMyo4CisgICAgQUREMTZfT1BfSU5UUkEgMTAsIDQrNCo4CisgICAgQUREMTZfT1BfSU5UUkEgMTIsIDYrMyo4CisgICAgQUREMTZfT1BfSU5UUkEgMTQsIDYrNCo4CisgICAgUkVQX1JFVAorICAgIEFDIDgKKyAgICBBQyAxMAorICAgIEFDIDEyCisgICAgQUMgMTQKKyAgICBBQyAwCisgICAgQUMgMgorICAgIEFDIDQKKyAgICBBQyA2CislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorSURDVF9BREQxNklOVFJBXzEwCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorSURDVF9BREQxNklOVFJBXzEwCislZW5kaWYKKworJWFzc2lnbiBsYXN0X2Jsb2NrIDM2Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9oMjY0X2lkY3RfYWRkOF8xMChwaXhlbCAqKmRzdCwgY29uc3QgaW50ICpibG9ja19vZmZzZXQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYqOF0pCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBJRENUX0FERDggMAorY2dsb2JhbCBoMjY0X2lkY3RfYWRkOF8xMCw1LDgsNworJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92ICAgICAgcjcsIHIwCislZW5kaWYKKyAgICBhZGQgICAgICByMiwgMTAyNAorICAgIG1vdiAgICAgIHIwLCBbcjBdCisgICAgQUREMTZfT1BfSU5UUkEgMTYsIDQrIDYqOAorICAgIEFERDE2X09QX0lOVFJBIDE4LCA0KyA3KjgKKyAgICBhZGQgICAgICByMiwgMTAyNC0xMjgqMgorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92ICAgICAgcjAsIFtyNytncHJzaXplXQorJWVsc2UKKyAgICBtb3YgICAgICByMCwgcjBtCisgICAgbW92ICAgICAgcjAsIFtyMCtncHJzaXplXQorJWVuZGlmCisgICAgQUREMTZfT1BfSU5UUkEgMzIsIDQrMTEqOAorICAgIEFERDE2X09QX0lOVFJBIDM0LCA0KzEyKjgKKyAgICBSRVBfUkVUCisgICAgQUMgMTYKKyAgICBBQyAxOAorICAgIEFDIDMyCisgICAgQUMgMzQKKworJWVuZG1hY3JvIDsgSURDVF9BREQ4CisKK0lOSVRfWE1NIHNzZTIKK0lEQ1RfQUREOAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0lEQ1RfQUREOAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2gyNjRfaWRjdDhfYWRkXzEwKHBpeGVsICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gSURDVDhfMUQgMgorICAgIFNXQVAgICAgICAwLCAxCisgICAgcHNyYWQgICAgIG00LCBtNSwgMQorICAgIHBzcmFkICAgICBtMSwgbTAsIDEKKyAgICBwYWRkZCAgICAgbTQsIG01CisgICAgcGFkZGQgICAgIG0xLCBtMAorICAgIHBhZGRkICAgICBtNCwgbTcKKyAgICBwYWRkZCAgICAgbTEsIG01CisgICAgcHN1YmQgICAgIG00LCBtMAorICAgIHBhZGRkICAgICBtMSwgbTMKKworICAgIHBzdWJkICAgICBtMCwgbTMKKyAgICBwc3ViZCAgICAgbTUsIG0zCisgICAgcGFkZGQgICAgIG0wLCBtNworICAgIHBzdWJkICAgICBtNSwgbTcKKyAgICBwc3JhZCAgICAgbTMsIDEKKyAgICBwc3JhZCAgICAgbTcsIDEKKyAgICBwc3ViZCAgICAgbTAsIG0zCisgICAgcHN1YmQgICAgIG01LCBtNworCisgICAgU1dBUCAgICAgIDEsIDcKKyAgICBwc3JhZCAgICAgbTEsIG03LCAyCisgICAgcHNyYWQgICAgIG0zLCBtNCwgMgorICAgIHBhZGRkICAgICBtMywgbTAKKyAgICBwc3JhZCAgICAgbTAsIDIKKyAgICBwYWRkZCAgICAgbTEsIG01CisgICAgcHNyYWQgICAgIG01LCAyCisgICAgcHN1YmQgICAgIG0wLCBtNAorICAgIHBzdWJkICAgICBtNywgbTUKKworICAgIFNXQVAgICAgICA1LCA2CisgICAgcHNyYWQgICAgIG00LCBtMiwgMQorICAgIHBzcmFkICAgICBtNiwgbTUsIDEKKyAgICBwc3ViZCAgICAgbTQsIG01CisgICAgcGFkZGQgICAgIG02LCBtMgorCisgICAgbW92YSAgICAgIG0yLCAlMQorICAgIG1vdmEgICAgICBtNSwgJTIKKyAgICBTVU1TVUJfQkEgZCwgNSwgMgorICAgIFNVTVNVQl9CQSBkLCA2LCA1CisgICAgU1VNU1VCX0JBIGQsIDQsIDIKKyAgICBTVU1TVUJfQkEgZCwgNywgNgorICAgIFNVTVNVQl9CQSBkLCAwLCA0CisgICAgU1VNU1VCX0JBIGQsIDMsIDIKKyAgICBTVU1TVUJfQkEgZCwgMSwgNQorICAgIFNXQVAgICAgICA3LCA2LCA0LCA1LCAyLCAzLCAxLCAwIDsgNzAzMTUyNDYgLT4gMDEyMzQ1NjcKKyVlbmRtYWNybworCislbWFjcm8gSURDVDhfMURfRlVMTCAxCisgICAgbW92YSAgICAgICAgIG03LCBbJTErMTEyKjJdCisgICAgbW92YSAgICAgICAgIG02LCBbJTErIDk2KjJdCisgICAgbW92YSAgICAgICAgIG01LCBbJTErIDgwKjJdCisgICAgbW92YSAgICAgICAgIG0zLCBbJTErIDQ4KjJdCisgICAgbW92YSAgICAgICAgIG0yLCBbJTErIDMyKjJdCisgICAgbW92YSAgICAgICAgIG0xLCBbJTErIDE2KjJdCisgICAgSURDVDhfMUQgICBbJTFdLCBbJTErIDY0KjJdCislZW5kbWFjcm8KKworOyAlMT1pbnQxNl90ICpibG9jaywgJTI9aW50MTZfdCAqZHN0YmxvY2sKKyVtYWNybyBJRENUOF9BRERfU1NFX1NUQVJUIDIKKyAgICBJRENUOF8xRF9GVUxMICUxCislaWYgQVJDSF9YODZfNjQKKyAgICBUUkFOU1BPU0U0eDREICAwLDEsMiwzLDgKKyAgICBtb3ZhICAgIFslMiAgICBdLCBtMAorICAgIFRSQU5TUE9TRTR4NEQgIDQsNSw2LDcsOAorICAgIG1vdmEgICAgWyUyKzgqMl0sIG00CislZWxzZQorICAgIG1vdmEgICAgICAgICBbJTFdLCBtNworICAgIFRSQU5TUE9TRTR4NEQgICAwLDEsMiwzLDcKKyAgICBtb3ZhICAgICAgICAgICBtNywgWyUxXQorICAgIG1vdmEgICAgWyUyICAgICBdLCBtMAorICAgIG1vdmEgICAgWyUyKzE2KjJdLCBtMQorICAgIG1vdmEgICAgWyUyKzMyKjJdLCBtMgorICAgIG1vdmEgICAgWyUyKzQ4KjJdLCBtMworICAgIFRSQU5TUE9TRTR4NEQgICA0LDUsNiw3LDMKKyAgICBtb3ZhICAgIFslMisgOCoyXSwgbTQKKyAgICBtb3ZhICAgIFslMisyNCoyXSwgbTUKKyAgICBtb3ZhICAgIFslMis0MCoyXSwgbTYKKyAgICBtb3ZhICAgIFslMis1NioyXSwgbTcKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgJTE9dWludDhfdCAqZHN0LCAlMj1pbnQxNl90ICpibG9jaywgJTM9aW50IHN0cmlkZQorJW1hY3JvIElEQ1Q4X0FERF9TU0VfRU5EIDMKKyAgICBJRENUOF8xRF9GVUxMICUyCisgICAgbW92YSAgWyUyICAgICBdLCBtNgorICAgIG1vdmEgIFslMisxNioyXSwgbTcKKworICAgIHB4b3IgICAgICAgICBtNywgbTcKKyAgICBTVE9SRV9ESUZGeDIgbTAsIG0xLCBtNiwgbTcsICUxLCAlMworICAgIGxlYSAgICAgICAgICAlMSwgWyUxKyUzKjJdCisgICAgU1RPUkVfRElGRngyIG0yLCBtMywgbTYsIG03LCAlMSwgJTMKKyAgICBtb3ZhICAgICAgICAgbTAsIFslMiAgICAgXQorICAgIG1vdmEgICAgICAgICBtMSwgWyUyKzE2KjJdCisgICAgbGVhICAgICAgICAgICUxLCBbJTErJTMqMl0KKyAgICBTVE9SRV9ESUZGeDIgbTQsIG01LCBtNiwgbTcsICUxLCAlMworICAgIGxlYSAgICAgICAgICAlMSwgWyUxKyUzKjJdCisgICAgU1RPUkVfRElGRngyIG0wLCBtMSwgbTYsIG03LCAlMSwgJTMKKyVlbmRtYWNybworCislbWFjcm8gSURDVDhfQUREIDAKK2NnbG9iYWwgaDI2NF9pZGN0OF9hZGRfMTAsIDMsNCwxNgorJWlmIFVOSVg2NCA9PSAwCisgICAgJWFzc2lnbiBwYWQgMTYtZ3Byc2l6ZS0oc3RhY2tfb2Zmc2V0JjE1KQorICAgIHN1YiAgcnNwLCBwYWQKKyAgICBjYWxsIGgyNjRfaWRjdDhfYWRkMV8xMCAlKyBTVUZGSVgKKyAgICBhZGQgIHJzcCwgcGFkCisgICAgUkVUCislZW5kaWYKKworQUxJR04gMTYKKzsgVE9ETzogZG9lcyBub3QgbmVlZCB0byB1c2Ugc3RhY2sKK2gyNjRfaWRjdDhfYWRkMV8xMCAlKyBTVUZGSVg6CislYXNzaWduIHBhZCAyNTYrMTYtZ3Byc2l6ZQorICAgIHN1YiAgICAgICAgICByc3AsIHBhZAorICAgIGFkZCAgIGR3b3JkIFtyMV0sIDMyCisKKyVpZiBBUkNIX1g4Nl82NAorICAgIElEQ1Q4X0FERF9TU0VfU1RBUlQgcjEsIHJzcAorICAgIFNXQVAgMSwgIDkKKyAgICBTV0FQIDIsIDEwCisgICAgU1dBUCAzLCAxMQorICAgIFNXQVAgNSwgMTMKKyAgICBTV0FQIDYsIDE0CisgICAgU1dBUCA3LCAxNQorICAgIElEQ1Q4X0FERF9TU0VfU1RBUlQgcjErMTYsIHJzcCsxMjgKKyAgICBQRVJNVVRFIDEsOSwgMiwxMCwgMywxMSwgNSwxLCA2LDIsIDcsMywgOSwxMywgMTAsMTQsIDExLDE1LCAxMyw1LCAxNCw2LCAxNSw3CisgICAgSURDVDhfMUQgW3JzcF0sIFtyc3ArMTI4XQorICAgIFNXQVAgMCwgIDgKKyAgICBTV0FQIDEsICA5CisgICAgU1dBUCAyLCAxMAorICAgIFNXQVAgMywgMTEKKyAgICBTV0FQIDQsIDEyCisgICAgU1dBUCA1LCAxMworICAgIFNXQVAgNiwgMTQKKyAgICBTV0FQIDcsIDE1CisgICAgSURDVDhfMUQgW3JzcCsxNl0sIFtyc3ArMTQ0XQorICAgIHBzcmFkICAgICAgICAgbTgsIDYKKyAgICBwc3JhZCAgICAgICAgIG0wLCA2CisgICAgcGFja3NzZHcgICAgICBtOCwgbTAKKyAgICBwYWRkc3cgICAgICAgIG04LCBbcjBdCisgICAgcHhvciAgICAgICAgICBtMCwgbTAKKyAgICBtb3ZhICAgIFtyMSsgIDBdLCBtMAorICAgIG1vdmEgICAgW3IxKyAxNl0sIG0wCisgICAgbW92YSAgICBbcjErIDMyXSwgbTAKKyAgICBtb3ZhICAgIFtyMSsgNDhdLCBtMAorICAgIG1vdmEgICAgW3IxKyA2NF0sIG0wCisgICAgbW92YSAgICBbcjErIDgwXSwgbTAKKyAgICBtb3ZhICAgIFtyMSsgOTZdLCBtMAorICAgIG1vdmEgICAgW3IxKzExMl0sIG0wCisgICAgbW92YSAgICBbcjErMTI4XSwgbTAKKyAgICBtb3ZhICAgIFtyMSsxNDRdLCBtMAorICAgIG1vdmEgICAgW3IxKzE2MF0sIG0wCisgICAgbW92YSAgICBbcjErMTc2XSwgbTAKKyAgICBtb3ZhICAgIFtyMSsxOTJdLCBtMAorICAgIG1vdmEgICAgW3IxKzIwOF0sIG0wCisgICAgbW92YSAgICBbcjErMjI0XSwgbTAKKyAgICBtb3ZhICAgIFtyMSsyNDBdLCBtMAorICAgIENMSVBXICAgICAgICAgbTgsIG0wLCBbcHdfcGl4ZWxfbWF4XQorICAgIG1vdmEgICAgICAgIFtyMF0sIG04CisgICAgbW92YSAgICAgICAgICBtOCwgW3B3X3BpeGVsX21heF0KKyAgICBTVE9SRV9ESUZGMTYgIG05LCBtMSwgbTAsIG04LCByMCtyMgorICAgIGxlYSAgICAgICAgICAgcjAsIFtyMCtyMioyXQorICAgIFNUT1JFX0RJRkYxNiBtMTAsIG0yLCBtMCwgbTgsIHIwCisgICAgU1RPUkVfRElGRjE2IG0xMSwgbTMsIG0wLCBtOCwgcjArcjIKKyAgICBsZWEgICAgICAgICAgIHIwLCBbcjArcjIqMl0KKyAgICBTVE9SRV9ESUZGMTYgbTEyLCBtNCwgbTAsIG04LCByMAorICAgIFNUT1JFX0RJRkYxNiBtMTMsIG01LCBtMCwgbTgsIHIwK3IyCisgICAgbGVhICAgICAgICAgICByMCwgW3IwK3IyKjJdCisgICAgU1RPUkVfRElGRjE2IG0xNCwgbTYsIG0wLCBtOCwgcjAKKyAgICBTVE9SRV9ESUZGMTYgbTE1LCBtNywgbTAsIG04LCByMCtyMgorJWVsc2UKKyAgICBJRENUOF9BRERfU1NFX1NUQVJUIHIxLCAgICByc3AKKyAgICBJRENUOF9BRERfU1NFX1NUQVJUIHIxKzE2LCByc3ArMTI4CisgICAgbGVhICAgICAgICAgICByMywgW3IwKzhdCisgICAgSURDVDhfQUREX1NTRV9FTkQgcjAsIHJzcCwgICAgcjIKKyAgICBJRENUOF9BRERfU1NFX0VORCByMywgcnNwKzE2LCByMgorICAgIG1vdmEgICAgW3IxKyAgMF0sIG03CisgICAgbW92YSAgICBbcjErIDE2XSwgbTcKKyAgICBtb3ZhICAgIFtyMSsgMzJdLCBtNworICAgIG1vdmEgICAgW3IxKyA0OF0sIG03CisgICAgbW92YSAgICBbcjErIDY0XSwgbTcKKyAgICBtb3ZhICAgIFtyMSsgODBdLCBtNworICAgIG1vdmEgICAgW3IxKyA5Nl0sIG03CisgICAgbW92YSAgICBbcjErMTEyXSwgbTcKKyAgICBtb3ZhICAgIFtyMSsxMjhdLCBtNworICAgIG1vdmEgICAgW3IxKzE0NF0sIG03CisgICAgbW92YSAgICBbcjErMTYwXSwgbTcKKyAgICBtb3ZhICAgIFtyMSsxNzZdLCBtNworICAgIG1vdmEgICAgW3IxKzE5Ml0sIG03CisgICAgbW92YSAgICBbcjErMjA4XSwgbTcKKyAgICBtb3ZhICAgIFtyMSsyMjRdLCBtNworICAgIG1vdmEgICAgW3IxKzI0MF0sIG03CislZW5kaWYgOyBBUkNIX1g4Nl82NAorCisgICAgYWRkICAgICAgICAgIHJzcCwgcGFkCisgICAgcmV0CislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorSURDVDhfQURECislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorSURDVDhfQURECislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaDI2NF9pZGN0OF9hZGQ0XzEwKHBpeGVsICoqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2KjhdKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ozs7Ozs7IE5PIEZBVEUgU0FNUExFUyBUUklHR0VSIFRISVMKKyVtYWNybyBJRENUOF9BREQ0X09QIDIKKyAgICBjbXAgICAgICAgYnl0ZSBbcjQrJTJdLCAwCisgICAganogLnNraXBibG9jayUxCisgICAgbW92ICAgICAgcjBkLCBbcjYrJTEqNF0KKyAgICBhZGQgICAgICAgcjAsIHI1CisgICAgY2FsbCBoMjY0X2lkY3Q4X2FkZDFfMTAgJSsgU1VGRklYCisuc2tpcGJsb2NrJTE6CislaWYgJTE8MTIKKyAgICBhZGQgICAgICAgcjEsIDI1NgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIElEQ1Q4X0FERDQgMAorY2dsb2JhbCBoMjY0X2lkY3Q4X2FkZDRfMTAsIDAsNywxNgorICAgICVhc3NpZ24gcGFkIDE2LWdwcnNpemUtKHN0YWNrX29mZnNldCYxNSkKKyAgICBTVUIgICAgICByc3AsIHBhZAorICAgIG1vdiAgICAgICByNSwgcjBtcAorICAgIG1vdiAgICAgICByNiwgcjFtcAorICAgIG1vdiAgICAgICByMSwgcjJtcAorICAgIG1vdiAgICAgIHIyZCwgcjNtCisgICAgbW92aWZuaWRuIHI0LCByNG1wCisgICAgSURDVDhfQURENF9PUCAgMCwgNCsxKjgKKyAgICBJRENUOF9BREQ0X09QICA0LCA2KzEqOAorICAgIElEQ1Q4X0FERDRfT1AgIDgsIDQrMyo4CisgICAgSURDVDhfQURENF9PUCAxMiwgNiszKjgKKyAgICBBREQgICAgICAgcnNwLCBwYWQKKyAgICBSRVQKKyVlbmRtYWNybyA7IElEQ1Q4X0FERDQKKworSU5JVF9YTU0gc3NlMgorSURDVDhfQURENAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0lEQ1Q4X0FERDQKKyVlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfaW50cmFwcmVkLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4ZDkxYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZC5hc20KQEAgLTAsMCArMSwyNzE3IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBILjI2NCBpbnRyYSBwcmVkaWN0aW9uIGFzbSBvcHRpbWl6YXRpb25zCis7KiBDb3B5cmlnaHQgKGMpIDIwMTAgRmlvbmEgR2xhc2VyCis7KiBDb3B5cmlnaHQgKGMpIDIwMTAgSG9sZ2VyIEx1Yml0egorOyogQ29weXJpZ2h0IChjKSAyMDEwIExvcmVuIE1lcnJpdHQKKzsqIENvcHlyaWdodCAoYykgMjAxMCBSb25hbGQgUy4gQnVsdGplCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKwordG1fc2h1ZjogdGltZXMgOCBkYiAweDAzLCAweDgwCitwd19mZjAwOiB0aW1lcyA4IGR3IDB4ZmYwMAorcGxhbmVfc2h1ZjogIGRiIC04LCAtNywgLTYsIC01LCAtNCwgLTMsIC0yLCAtMQorICAgICAgICAgICAgIGRiICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOAorcGxhbmU4X3NodWY6IGRiIC00LCAtMywgLTIsIC0xLCAgMCwgIDAsICAwLCAgMAorICAgICAgICAgICAgIGRiICAxLCAgMiwgIDMsICA0LCAgMCwgIDAsICAwLCAgMAorcHdfMHRvNzogICAgIGR3ICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNworcHdfMXRvODogICAgIGR3ICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOAorcHdfbTh0b20xOiAgIGR3IC04LCAtNywgLTYsIC01LCAtNCwgLTMsIC0yLCAtMQorcHdfbTR0bzQ6ICAgIGR3IC00LCAtMywgLTIsIC0xLCAgMSwgIDIsICAzLCAgNAorCitTRUNUSU9OIC50ZXh0CisKK2NleHRlcm4gcGJfMQorY2V4dGVybiBwYl8zCitjZXh0ZXJuIHB3XzQKK2NleHRlcm4gcHdfNQorY2V4dGVybiBwd184CitjZXh0ZXJuIHB3XzE2CitjZXh0ZXJuIHB3XzE3CitjZXh0ZXJuIHB3XzMyCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQxNngxNl92ZXJ0aWNhbF84KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTklUX01NWCBtbXgKK2NnbG9iYWwgcHJlZDE2eDE2X3ZlcnRpY2FsXzgsIDIsMworICAgIHN1YiAgIHIwLCByMQorICAgIG1vdiAgIHIyLCA4CisgICAgbW92cSBtbTAsIFtyMCswXQorICAgIG1vdnEgbW0xLCBbcjArOF0KKy5sb29wOgorICAgIG1vdnEgW3IwK3IxKjErMF0sIG1tMAorICAgIG1vdnEgW3IwK3IxKjErOF0sIG1tMQorICAgIG1vdnEgW3IwK3IxKjIrMF0sIG1tMAorICAgIG1vdnEgW3IwK3IxKjIrOF0sIG1tMQorICAgIGxlYSAgIHIwLCBbcjArcjEqMl0KKyAgICBkZWMgICByMgorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorCitJTklUX1hNTSBzc2UKK2NnbG9iYWwgcHJlZDE2eDE2X3ZlcnRpY2FsXzgsIDIsMworICAgIHN1YiAgIHIwLCByMQorICAgIG1vdiAgIHIyLCA0CisgICAgbW92YXBzIHhtbTAsIFtyMF0KKy5sb29wOgorICAgIG1vdmFwcyBbcjArcjEqMV0sIHhtbTAKKyAgICBtb3ZhcHMgW3IwK3IxKjJdLCB4bW0wCisgICAgbGVhICAgcjAsIFtyMCtyMSoyXQorICAgIG1vdmFwcyBbcjArcjEqMV0sIHhtbTAKKyAgICBtb3ZhcHMgW3IwK3IxKjJdLCB4bW0wCisgICAgbGVhICAgcjAsIFtyMCtyMSoyXQorICAgIGRlYyAgIHIyCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQxNngxNl9ob3Jpem9udGFsXzgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBQUkVEMTZ4MTZfSCAwCitjZ2xvYmFsIHByZWQxNngxNl9ob3Jpem9udGFsXzgsIDIsMworICAgIG1vdiAgICAgICByMiwgOAorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92YSAgICAgIG0yLCBbcGJfM10KKyVlbmRpZgorLmxvb3A6CisgICAgbW92ZCAgICAgIG0wLCBbcjArcjEqMC00XQorICAgIG1vdmQgICAgICBtMSwgW3IwK3IxKjEtNF0KKworJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgcHNodWZiICAgIG0wLCBtMgorICAgIHBzaHVmYiAgICBtMSwgbTIKKyVlbHNlCisgICAgcHVucGNrbGJ3IG0wLCBtMAorICAgIHB1bnBja2xidyBtMSwgbTEKKyAgICBTUExBVFcgICAgbTAsIG0wLCAzCisgICAgU1BMQVRXICAgIG0xLCBtMSwgMworICAgIG1vdmEgW3IwK3IxKjArOF0sIG0wCisgICAgbW92YSBbcjArcjEqMSs4XSwgbTEKKyVlbmRpZgorCisgICAgbW92YSBbcjArcjEqMF0sIG0wCisgICAgbW92YSBbcjArcjEqMV0sIG0xCisgICAgbGVhICAgICAgIHIwLCBbcjArcjEqMl0KKyAgICBkZWMgICAgICAgcjIKKyAgICBqZyAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK1BSRUQxNngxNl9ICitJTklUX01NWCBtbXhleHQKK1BSRUQxNngxNl9ICitJTklUX1hNTSBzc3NlMworUFJFRDE2eDE2X0gKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDE2eDE2X2RjXzgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBQUkVEMTZ4MTZfREMgMAorY2dsb2JhbCBwcmVkMTZ4MTZfZGNfOCwgMiw3CisgICAgbW92ICAgICAgIHI0LCByMAorICAgIHN1YiAgICAgICByMCwgcjEKKyAgICBweG9yICAgICAgbW0wLCBtbTAKKyAgICBweG9yICAgICAgbW0xLCBtbTEKKyAgICBwc2FkYncgICAgbW0wLCBbcjArMF0KKyAgICBwc2FkYncgICAgbW0xLCBbcjArOF0KKyAgICBkZWMgICAgICAgIHIwCisgICAgbW92enggICAgIHI1ZCwgYnl0ZSBbcjArcjEqMV0KKyAgICBwYWRkdyAgICAgbW0wLCBtbTEKKyAgICBtb3ZkICAgICAgcjZkLCBtbTAKKyAgICBsZWEgICAgICAgIHIwLCBbcjArcjEqMl0KKyVyZXAgNworICAgIG1vdnp4ICAgICByMmQsIGJ5dGUgW3IwK3IxKjBdCisgICAgbW92enggICAgIHIzZCwgYnl0ZSBbcjArcjEqMV0KKyAgICBhZGQgICAgICAgcjVkLCByMmQKKyAgICBhZGQgICAgICAgcjZkLCByM2QKKyAgICBsZWEgICAgICAgIHIwLCBbcjArcjEqMl0KKyVlbmRyZXAKKyAgICBtb3Z6eCAgICAgcjJkLCBieXRlIFtyMCtyMSowXQorICAgIGFkZCAgICAgICByNWQsIHI2ZAorICAgIGxlYSAgICAgICByMmQsIFtyMityNSsxNl0KKyAgICBzaHIgICAgICAgcjJkLCA1CislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICBweG9yICAgICAgIG0xLCBtMQorJWVuZGlmCisgICAgU1BMQVRCX1JFRyBtMCwgcjIsIG0xCisKKyVpZiBtbXNpemU9PTgKKyAgICBtb3YgICAgICAgcjNkLCA4CisubG9vcDoKKyAgICBtb3ZhIFtyNCtyMSowKzBdLCBtMAorICAgIG1vdmEgW3I0K3IxKjArOF0sIG0wCisgICAgbW92YSBbcjQrcjEqMSswXSwgbTAKKyAgICBtb3ZhIFtyNCtyMSoxKzhdLCBtMAorJWVsc2UKKyAgICBtb3YgICAgICAgcjNkLCA0CisubG9vcDoKKyAgICBtb3ZhIFtyNCtyMSowXSwgbTAKKyAgICBtb3ZhIFtyNCtyMSoxXSwgbTAKKyAgICBsZWEgICByNCwgW3I0K3IxKjJdCisgICAgbW92YSBbcjQrcjEqMF0sIG0wCisgICAgbW92YSBbcjQrcjEqMV0sIG0wCislZW5kaWYKKyAgICBsZWEgICByNCwgW3I0K3IxKjJdCisgICAgZGVjICAgcjNkCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitQUkVEMTZ4MTZfREMKK0lOSVRfWE1NIHNzZTIKK1BSRUQxNngxNl9EQworSU5JVF9YTU0gc3NzZTMKK1BSRUQxNngxNl9EQworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkMTZ4MTZfdG1fdnA4XzgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBQUkVEMTZ4MTZfVE0gMAorY2dsb2JhbCBwcmVkMTZ4MTZfdG1fdnA4XzgsIDIsNQorICAgIHN1YiAgICAgICAgcjAsIHIxCisgICAgcHhvciAgICAgIG1tNywgbW03CisgICAgbW92cSAgICAgIG1tMCwgW3IwKzBdCisgICAgbW92cSAgICAgIG1tMiwgW3IwKzhdCisgICAgbW92cSAgICAgIG1tMSwgbW0wCisgICAgbW92cSAgICAgIG1tMywgbW0yCisgICAgcHVucGNrbGJ3IG1tMCwgbW03CisgICAgcHVucGNraGJ3IG1tMSwgbW03CisgICAgcHVucGNrbGJ3IG1tMiwgbW03CisgICAgcHVucGNraGJ3IG1tMywgbW03CisgICAgbW92enggICAgIHIzZCwgYnl0ZSBbcjAtMV0KKyAgICBtb3YgICAgICAgcjRkLCAxNgorLmxvb3A6CisgICAgbW92enggICAgIHIyZCwgYnl0ZSBbcjArcjEtMV0KKyAgICBzdWIgICAgICAgcjJkLCByM2QKKyAgICBtb3ZkICAgICAgbW00LCByMmQKKyAgICBTUExBVFcgICAgbW00LCBtbTQsIDAKKyAgICBtb3ZxICAgICAgbW01LCBtbTQKKyAgICBtb3ZxICAgICAgbW02LCBtbTQKKyAgICBtb3ZxICAgICAgbW03LCBtbTQKKyAgICBwYWRkdyAgICAgbW00LCBtbTAKKyAgICBwYWRkdyAgICAgbW01LCBtbTEKKyAgICBwYWRkdyAgICAgbW02LCBtbTIKKyAgICBwYWRkdyAgICAgbW03LCBtbTMKKyAgICBwYWNrdXN3YiAgbW00LCBtbTUKKyAgICBwYWNrdXN3YiAgbW02LCBtbTcKKyAgICBtb3ZxIFtyMCtyMSswXSwgbW00CisgICAgbW92cSBbcjArcjErOF0sIG1tNgorICAgIGFkZCAgICAgICAgcjAsIHIxCisgICAgZGVjICAgICAgIHI0ZAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teAorUFJFRDE2eDE2X1RNCitJTklUX01NWCBtbXhleHQKK1BSRUQxNngxNl9UTQorCitJTklUX1hNTSBzc2UyCitjZ2xvYmFsIHByZWQxNngxNl90bV92cDhfOCwgMiw2LDYKKyAgICBzdWIgICAgICAgICAgcjAsIHIxCisgICAgcHhvciAgICAgICB4bW0yLCB4bW0yCisgICAgbW92ZHFhICAgICB4bW0wLCBbcjBdCisgICAgbW92ZHFhICAgICB4bW0xLCB4bW0wCisgICAgcHVucGNrbGJ3ICB4bW0wLCB4bW0yCisgICAgcHVucGNraGJ3ICB4bW0xLCB4bW0yCisgICAgbW92enggICAgICAgcjRkLCBieXRlIFtyMC0xXQorICAgIG1vdiAgICAgICAgIHI1ZCwgOAorLmxvb3A6CisgICAgbW92enggICAgICAgcjJkLCBieXRlIFtyMCtyMSoxLTFdCisgICAgbW92enggICAgICAgcjNkLCBieXRlIFtyMCtyMSoyLTFdCisgICAgc3ViICAgICAgICAgcjJkLCByNGQKKyAgICBzdWIgICAgICAgICByM2QsIHI0ZAorICAgIG1vdmQgICAgICAgeG1tMiwgcjJkCisgICAgbW92ZCAgICAgICB4bW00LCByM2QKKyAgICBwc2h1Zmx3ICAgIHhtbTIsIHhtbTIsIDAKKyAgICBwc2h1Zmx3ICAgIHhtbTQsIHhtbTQsIDAKKyAgICBwdW5wY2tscWRxIHhtbTIsIHhtbTIKKyAgICBwdW5wY2tscWRxIHhtbTQsIHhtbTQKKyAgICBtb3ZkcWEgICAgIHhtbTMsIHhtbTIKKyAgICBtb3ZkcWEgICAgIHhtbTUsIHhtbTQKKyAgICBwYWRkdyAgICAgIHhtbTIsIHhtbTAKKyAgICBwYWRkdyAgICAgIHhtbTMsIHhtbTEKKyAgICBwYWRkdyAgICAgIHhtbTQsIHhtbTAKKyAgICBwYWRkdyAgICAgIHhtbTUsIHhtbTEKKyAgICBwYWNrdXN3YiAgIHhtbTIsIHhtbTMKKyAgICBwYWNrdXN3YiAgIHhtbTQsIHhtbTUKKyAgICBtb3ZkcWEgW3IwK3IxKjFdLCB4bW0yCisgICAgbW92ZHFhIFtyMCtyMSoyXSwgeG1tNAorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IxKjJdCisgICAgZGVjICAgICAgICAgcjVkCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQxNngxNl9wbGFuZV8qXzgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBIMjY0X1BSRUQxNngxNl9QTEFORSAxCitjZ2xvYmFsIHByZWQxNngxNl9wbGFuZV8lMV84LCAyLDksNworICAgIG1vdiAgICAgICAgICByMiwgcjEgICAgICAgICAgIDsgK3N0cmlkZQorICAgIG5lZyAgICAgICAgICByMSAgICAgICAgICAgICAgIDsgLXN0cmlkZQorCisgICAgbW92aCAgICAgICAgIG0wLCBbcjArcjEgIC0xXQorJWlmIG1tc2l6ZSA9PSA4CisgICAgcHhvciAgICAgICAgIG00LCBtNAorICAgIG1vdmggICAgICAgICBtMSwgW3IwK3IxICArMyBdCisgICAgbW92aCAgICAgICAgIG0yLCBbcjArcjEgICs4IF0KKyAgICBtb3ZoICAgICAgICAgbTMsIFtyMCtyMSAgKzEyXQorICAgIHB1bnBja2xidyAgICBtMCwgbTQKKyAgICBwdW5wY2tsYncgICAgbTEsIG00CisgICAgcHVucGNrbGJ3ICAgIG0yLCBtNAorICAgIHB1bnBja2xidyAgICBtMywgbTQKKyAgICBwbXVsbHcgICAgICAgbTAsIFtwd19tOHRvbTEgIF0KKyAgICBwbXVsbHcgICAgICAgbTEsIFtwd19tOHRvbTErOF0KKyAgICBwbXVsbHcgICAgICAgbTIsIFtwd18xdG84ICAgIF0KKyAgICBwbXVsbHcgICAgICAgbTMsIFtwd18xdG84ICArOF0KKyAgICBwYWRkdyAgICAgICAgbTAsIG0yCisgICAgcGFkZHcgICAgICAgIG0xLCBtMworJWVsc2UgOyBtbXNpemUgPT0gMTYKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIG1vdmhwcyAgICAgICBtMCwgW3IwK3IxICArOF0KKyAgICBwbWFkZHVic3cgICAgbTAsIFtwbGFuZV9zaHVmXSA7IEggY29lZmZpY2llbnRzCislZWxzZSA7IHNzZTIKKyAgICBweG9yICAgICAgICAgbTIsIG0yCisgICAgbW92aCAgICAgICAgIG0xLCBbcjArcjEgICs4XQorICAgIHB1bnBja2xidyAgICBtMCwgbTIKKyAgICBwdW5wY2tsYncgICAgbTEsIG0yCisgICAgcG11bGx3ICAgICAgIG0wLCBbcHdfbTh0b20xXQorICAgIHBtdWxsdyAgICAgICBtMSwgW3B3XzF0bzhdCisgICAgcGFkZHcgICAgICAgIG0wLCBtMQorJWVuZGlmCisgICAgbW92aGxwcyAgICAgIG0xLCBtMAorJWVuZGlmCisgICAgcGFkZHcgICAgICAgIG0wLCBtMQorJWlmIGNwdWZsYWcobW14ZXh0KQorICAgIFBTSFVGTFcgICAgICBtMSwgbTAsIDB4RQorJWVsaWYgY3B1ZmxhZyhtbXgpCisgICAgbW92YSAgICAgICAgIG0xLCBtMAorICAgIHBzcmxxICAgICAgICBtMSwgMzIKKyVlbmRpZgorICAgIHBhZGR3ICAgICAgICBtMCwgbTEKKyVpZiBjcHVmbGFnKG1teGV4dCkKKyAgICBQU0hVRkxXICAgICAgbTEsIG0wLCAweDEKKyVlbGlmIGNwdWZsYWcobW14KQorICAgIG1vdmEgICAgICAgICBtMSwgbTAKKyAgICBwc3JscSAgICAgICAgbTEsIDE2CislZW5kaWYKKyAgICBwYWRkdyAgICAgICAgbTAsIG0xICAgICAgICAgICA7IHN1bSBvZiBIIGNvZWZmaWNpZW50cworCisgICAgbGVhICAgICAgICAgIHI0LCBbcjArcjIqOC0xXQorICAgIGxlYSAgICAgICAgICByMywgW3IwK3IyKjQtMV0KKyAgICBhZGQgICAgICAgICAgcjQsIHIyCisKKyVpZiBBUkNIX1g4Nl82NAorJWRlZmluZSBlX3JlZyByOAorJWVsc2UKKyVkZWZpbmUgZV9yZWcgcjAKKyVlbmRpZgorCisgICAgbW92enggICAgIGVfcmVnLCBieXRlIFtyMytyMioyICAgXQorICAgIG1vdnp4ICAgICAgICByNSwgYnl0ZSBbcjQrcjEgICAgIF0KKyAgICBzdWIgICAgICAgICAgcjUsIGVfcmVnCisKKyAgICBtb3Z6eCAgICAgZV9yZWcsIGJ5dGUgW3IzK3IyICAgICBdCisgICAgbW92enggICAgICAgIHI2LCBieXRlIFtyNCAgICAgICAgXQorICAgIHN1YiAgICAgICAgICByNiwgZV9yZWcKKyAgICBsZWEgICAgICAgICAgcjUsIFtyNStyNioyXQorCisgICAgbW92enggICAgIGVfcmVnLCBieXRlIFtyMytyMSAgICAgXQorICAgIG1vdnp4ICAgICAgICByNiwgYnl0ZSBbcjQrcjIqMiAgIF0KKyAgICBzdWIgICAgICAgICAgcjYsIGVfcmVnCisgICAgbGVhICAgICAgICAgIHI1LCBbcjUrcjYqNF0KKworICAgIG1vdnp4ICAgICBlX3JlZywgYnl0ZSBbcjMgICAgICAgIF0KKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdnp4ICAgICAgICByNywgYnl0ZSBbcjQrcjIgICAgIF0KKyAgICBzdWIgICAgICAgICAgcjcsIGVfcmVnCislZWxzZQorICAgIG1vdnp4ICAgICAgICByNiwgYnl0ZSBbcjQrcjIgICAgIF0KKyAgICBzdWIgICAgICAgICAgcjYsIGVfcmVnCisgICAgbGVhICAgICAgICAgIHI1LCBbcjUrcjYqNF0KKyAgICBzdWIgICAgICAgICAgcjUsIHI2CislZW5kaWYKKworICAgIGxlYSAgICAgICBlX3JlZywgW3IzK3IxKjRdCisgICAgbGVhICAgICAgICAgIHIzLCBbcjQrcjIqNF0KKworICAgIG1vdnp4ICAgICAgICByNCwgYnl0ZSBbZV9yZWcrcjIgIF0KKyAgICBtb3Z6eCAgICAgICAgcjYsIGJ5dGUgW3IzICAgICAgICBdCisgICAgc3ViICAgICAgICAgIHI2LCByNAorJWlmIEFSQ0hfWDg2XzY0CisgICAgbGVhICAgICAgICAgIHI2LCBbcjcrcjYqMl0KKyAgICBsZWEgICAgICAgICAgcjUsIFtyNStyNioyXQorICAgIGFkZCAgICAgICAgICByNSwgcjYKKyVlbHNlCisgICAgbGVhICAgICAgICAgIHI1LCBbcjUrcjYqNF0KKyAgICBsZWEgICAgICAgICAgcjUsIFtyNStyNioyXQorJWVuZGlmCisKKyAgICBtb3Z6eCAgICAgICAgcjQsIGJ5dGUgW2VfcmVnICAgICBdCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3Z6eCAgICAgICAgcjcsIGJ5dGUgW3IzICAgK3IyICBdCisgICAgc3ViICAgICAgICAgIHI3LCByNAorICAgIHN1YiAgICAgICAgICByNSwgcjcKKyVlbHNlCisgICAgbW92enggICAgICAgIHI2LCBieXRlIFtyMyAgICtyMiAgXQorICAgIHN1YiAgICAgICAgICByNiwgcjQKKyAgICBsZWEgICAgICAgICAgcjUsIFtyNStyNio4XQorICAgIHN1YiAgICAgICAgICByNSwgcjYKKyVlbmRpZgorCisgICAgbW92enggICAgICAgIHI0LCBieXRlIFtlX3JlZytyMSAgXQorICAgIG1vdnp4ICAgICAgICByNiwgYnl0ZSBbcjMgICArcjIqMl0KKyAgICBzdWIgICAgICAgICAgcjYsIHI0CislaWYgQVJDSF9YODZfNjQKKyAgICBhZGQgICAgICAgICAgcjYsIHI3CislZW5kaWYKKyAgICBsZWEgICAgICAgICAgcjUsIFtyNStyNio4XQorCisgICAgbW92enggICAgICAgIHI0LCBieXRlIFtlX3JlZytyMioyXQorICAgIG1vdnp4ICAgICAgICByNiwgYnl0ZSBbcjMgICArcjEgIF0KKyAgICBzdWIgICAgICAgICAgcjYsIHI0CisgICAgbGVhICAgICAgICAgIHI1LCBbcjUrcjYqNF0KKyAgICBhZGQgICAgICAgICAgcjUsIHI2ICAgICAgICAgICA7IHN1bSBvZiBWIGNvZWZmaWNpZW50cworCislaWYgQVJDSF9YODZfNjQgPT0gMAorICAgIG1vdiAgICAgICAgICByMCwgcjBtCislZW5kaWYKKworJWlmaWRuICUxLCBoMjY0CisgICAgbGVhICAgICAgICAgIHI1LCBbcjUqNSszMl0KKyAgICBzYXIgICAgICAgICAgcjUsIDYKKyVlbGlmaWRuICUxLCBydjQwCisgICAgbGVhICAgICAgICAgIHI1LCBbcjUqNV0KKyAgICBzYXIgICAgICAgICAgcjUsIDYKKyVlbGlmaWRuICUxLCBzdnEzCisgICAgdGVzdCAgICAgICAgIHI1LCByNQorICAgIGxlYSAgICAgICAgICByNiwgW3I1KzNdCisgICAgY21vdnMgICAgICAgIHI1LCByNgorICAgIHNhciAgICAgICAgICByNSwgMiAgICAgICAgICAgIDsgVi80CisgICAgbGVhICAgICAgICAgIHI1LCBbcjUqNV0gICAgICAgOyA1KihWLzQpCisgICAgdGVzdCAgICAgICAgIHI1LCByNQorICAgIGxlYSAgICAgICAgICByNiwgW3I1KzE1XQorICAgIGNtb3ZzICAgICAgICByNSwgcjYKKyAgICBzYXIgICAgICAgICAgcjUsIDQgICAgICAgICAgICA7ICg1KihWLzQpKS8xNgorJWVuZGlmCisKKyAgICBtb3Z6eCAgICAgICAgcjQsIGJ5dGUgW3IwK3IxICArMTVdCisgICAgbW92enggICAgICAgIHIzLCBieXRlIFtyMytyMioyICAgXQorICAgIGxlYSAgICAgICAgICByMywgW3IzK3I0KzFdCisgICAgc2hsICAgICAgICAgIHIzLCA0CisKKyAgICBtb3ZkICAgICAgICByMWQsIG0wCisgICAgbW92c3ggICAgICAgcjFkLCByMXcKKyVpZm5pZG4gJTEsIHN2cTMKKyVpZmlkbiAlMSwgaDI2NAorICAgIGxlYSAgICAgICAgIHIxZCwgW3IxZCo1KzMyXQorJWVsc2UgOyBydjQwCisgICAgbGVhICAgICAgICAgcjFkLCBbcjFkKjVdCislZW5kaWYKKyAgICBzYXIgICAgICAgICByMWQsIDYKKyVlbHNlIDsgc3ZxMworICAgIHRlc3QgICAgICAgIHIxZCwgcjFkCisgICAgbGVhICAgICAgICAgcjRkLCBbcjFkKzNdCisgICAgY21vdnMgICAgICAgcjFkLCByNGQKKyAgICBzYXIgICAgICAgICByMWQsIDIgICAgICAgICAgIDsgSC80CisgICAgbGVhICAgICAgICAgcjFkLCBbcjFkKjVdICAgICA7IDUqKEgvNCkKKyAgICB0ZXN0ICAgICAgICByMWQsIHIxZAorICAgIGxlYSAgICAgICAgIHI0ZCwgW3IxZCsxNV0KKyAgICBjbW92cyAgICAgICByMWQsIHI0ZAorICAgIHNhciAgICAgICAgIHIxZCwgNCAgICAgICAgICAgOyAoNSooSC80KSkvMTYKKyVlbmRpZgorICAgIG1vdmQgICAgICAgICBtMCwgcjFkCisKKyAgICBhZGQgICAgICAgICByMWQsIHI1ZAorICAgIGFkZCAgICAgICAgIHIzZCwgcjFkCisgICAgc2hsICAgICAgICAgcjFkLCAzCisgICAgc3ViICAgICAgICAgcjNkLCByMWQgICAgICAgICAgOyBhCisKKyAgICBtb3ZkICAgICAgICAgbTEsIHI1ZAorICAgIG1vdmQgICAgICAgICBtMywgcjNkCisgICAgU1BMQVRXICAgICAgIG0wLCBtMCwgMCAgICAgICAgOyBICisgICAgU1BMQVRXICAgICAgIG0xLCBtMSwgMCAgICAgICAgOyBWCisgICAgU1BMQVRXICAgICAgIG0zLCBtMywgMCAgICAgICAgOyBhCislaWZpZG4gJTEsIHN2cTMKKyAgICBTV0FQICAgICAgICAgIDAsIDEKKyVlbmRpZgorICAgIG1vdmEgICAgICAgICBtMiwgbTAKKyVpZiBtbXNpemUgPT0gOAorICAgIG1vdmEgICAgICAgICBtNSwgbTAKKyVlbmRpZgorICAgIHBtdWxsdyAgICAgICBtMCwgW3B3XzB0bzddICAgIDsgMCpILCAxKkgsIC4uLiwgNypIICAod29yZHMpCislaWYgbW1zaXplID09IDE2CisgICAgcHNsbHcgICAgICAgIG0yLCAzCislZWxzZQorICAgIHBzbGx3ICAgICAgICBtNSwgMworICAgIHBzbGx3ICAgICAgICBtMiwgMgorICAgIG1vdmEgICAgICAgICBtNiwgbTUKKyAgICBwYWRkdyAgICAgICAgbTYsIG0yCislZW5kaWYKKyAgICBwYWRkdyAgICAgICAgbTAsIG0zICAgICAgICAgICA7IGEgKyB7MCwxLDIsMyw0LDUsNiw3fSpICisgICAgcGFkZHcgICAgICAgIG0yLCBtMCAgICAgICAgICAgOyBhICsgezgsOSwxMCwxMSwxMiwxMywxNCwxNX0qSAorJWlmIG1tc2l6ZSA9PSA4CisgICAgcGFkZHcgICAgICAgIG01LCBtMCAgICAgICAgICAgOyBhICsgezgsOSwxMCwxMX0qSAorICAgIHBhZGR3ICAgICAgICBtNiwgbTAgICAgICAgICAgIDsgYSArIHsxMiwxMywxNCwxNX0qSAorJWVuZGlmCisKKyAgICBtb3YgICAgICAgICAgcjQsIDgKKy5sb29wOgorICAgIG1vdmEgICAgICAgICBtMywgbTAgICAgICAgICAgIDsgYlswLi43XQorICAgIG1vdmEgICAgICAgICBtNCwgbTIgICAgICAgICAgIDsgYls4Li4xNV0KKyAgICBwc3JhdyAgICAgICAgbTMsIDUKKyAgICBwc3JhdyAgICAgICAgbTQsIDUKKyAgICBwYWNrdXN3YiAgICAgbTMsIG00CisgICAgbW92YSAgICAgICBbcjBdLCBtMworJWlmIG1tc2l6ZSA9PSA4CisgICAgbW92YSAgICAgICAgIG0zLCBtNSAgICAgICAgICAgOyBiWzguLjExXQorICAgIG1vdmEgICAgICAgICBtNCwgbTYgICAgICAgICAgIDsgYlsxMi4uMTVdCisgICAgcHNyYXcgICAgICAgIG0zLCA1CisgICAgcHNyYXcgICAgICAgIG00LCA1CisgICAgcGFja3Vzd2IgICAgIG0zLCBtNAorICAgIG1vdmEgICAgIFtyMCs4XSwgbTMKKyVlbmRpZgorICAgIHBhZGR3ICAgICAgICBtMCwgbTEKKyAgICBwYWRkdyAgICAgICAgbTIsIG0xCislaWYgbW1zaXplID09IDgKKyAgICBwYWRkdyAgICAgICAgbTUsIG0xCisgICAgcGFkZHcgICAgICAgIG02LCBtMQorJWVuZGlmCisKKyAgICBtb3ZhICAgICAgICAgbTMsIG0wICAgICAgICAgICA7IGJbMC4uN10KKyAgICBtb3ZhICAgICAgICAgbTQsIG0yICAgICAgICAgICA7IGJbOC4uMTVdCisgICAgcHNyYXcgICAgICAgIG0zLCA1CisgICAgcHNyYXcgICAgICAgIG00LCA1CisgICAgcGFja3Vzd2IgICAgIG0zLCBtNAorICAgIG1vdmEgICAgW3IwK3IyXSwgbTMKKyVpZiBtbXNpemUgPT0gOAorICAgIG1vdmEgICAgICAgICBtMywgbTUgICAgICAgICAgIDsgYls4Li4xMV0KKyAgICBtb3ZhICAgICAgICAgbTQsIG02ICAgICAgICAgICA7IGJbMTIuLjE1XQorICAgIHBzcmF3ICAgICAgICBtMywgNQorICAgIHBzcmF3ICAgICAgICBtNCwgNQorICAgIHBhY2t1c3diICAgICBtMywgbTQKKyAgICBtb3ZhICBbcjArcjIrOF0sIG0zCislZW5kaWYKKyAgICBwYWRkdyAgICAgICAgbTAsIG0xCisgICAgcGFkZHcgICAgICAgIG0yLCBtMQorJWlmIG1tc2l6ZSA9PSA4CisgICAgcGFkZHcgICAgICAgIG01LCBtMQorICAgIHBhZGR3ICAgICAgICBtNiwgbTEKKyVlbmRpZgorCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjIqMl0KKyAgICBkZWMgICAgICAgICAgcjQKKyAgICBqZyAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK0gyNjRfUFJFRDE2eDE2X1BMQU5FIGgyNjQKK0gyNjRfUFJFRDE2eDE2X1BMQU5FIHJ2NDAKK0gyNjRfUFJFRDE2eDE2X1BMQU5FIHN2cTMKK0lOSVRfTU1YIG1teGV4dAorSDI2NF9QUkVEMTZ4MTZfUExBTkUgaDI2NAorSDI2NF9QUkVEMTZ4MTZfUExBTkUgcnY0MAorSDI2NF9QUkVEMTZ4MTZfUExBTkUgc3ZxMworSU5JVF9YTU0gc3NlMgorSDI2NF9QUkVEMTZ4MTZfUExBTkUgaDI2NAorSDI2NF9QUkVEMTZ4MTZfUExBTkUgcnY0MAorSDI2NF9QUkVEMTZ4MTZfUExBTkUgc3ZxMworSU5JVF9YTU0gc3NzZTMKK0gyNjRfUFJFRDE2eDE2X1BMQU5FIGgyNjQKK0gyNjRfUFJFRDE2eDE2X1BMQU5FIHJ2NDAKK0gyNjRfUFJFRDE2eDE2X1BMQU5FIHN2cTMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDh4OF9wbGFuZV84KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gSDI2NF9QUkVEOHg4X1BMQU5FIDAKK2NnbG9iYWwgcHJlZDh4OF9wbGFuZV84LCAyLDksNworICAgIG1vdiAgICAgICAgICByMiwgcjEgICAgICAgICAgIDsgK3N0cmlkZQorICAgIG5lZyAgICAgICAgICByMSAgICAgICAgICAgICAgIDsgLXN0cmlkZQorCisgICAgbW92ZCAgICAgICAgIG0wLCBbcjArcjEgIC0xXQorJWlmIG1tc2l6ZSA9PSA4CisgICAgcHhvciAgICAgICAgIG0yLCBtMgorICAgIG1vdmggICAgICAgICBtMSwgW3IwK3IxICArNCBdCisgICAgcHVucGNrbGJ3ICAgIG0wLCBtMgorICAgIHB1bnBja2xidyAgICBtMSwgbTIKKyAgICBwbXVsbHcgICAgICAgbTAsIFtwd19tNHRvNF0KKyAgICBwbXVsbHcgICAgICAgbTEsIFtwd19tNHRvNCs4XQorJWVsc2UgOyBtbXNpemUgPT0gMTYKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIG1vdmhwcyAgICAgICBtMCwgW3IwK3IxICArNF0gICA7IHRoaXMgcmVhZHMgNCBieXRlcyBtb3JlIHRoYW4gbmVjZXNzYXJ5CisgICAgcG1hZGR1YnN3ICAgIG0wLCBbcGxhbmU4X3NodWZdIDsgSCBjb2VmZmljaWVudHMKKyVlbHNlIDsgc3NlMgorICAgIHB4b3IgICAgICAgICBtMiwgbTIKKyAgICBtb3ZkICAgICAgICAgbTEsIFtyMCtyMSAgKzRdCisgICAgcHVucGNrbGRxICAgIG0wLCBtMQorICAgIHB1bnBja2xidyAgICBtMCwgbTIKKyAgICBwbXVsbHcgICAgICAgbTAsIFtwd19tNHRvNF0KKyVlbmRpZgorICAgIG1vdmhscHMgICAgICBtMSwgbTAKKyVlbmRpZgorICAgIHBhZGR3ICAgICAgICBtMCwgbTEKKworJWlmIG5vdGNwdWZsYWcoc3NzZTMpCislaWYgY3B1ZmxhZyhtbXhleHQpCisgICAgUFNIVUZMVyAgICAgIG0xLCBtMCwgMHhFCislZWxpZiBjcHVmbGFnKG1teCkKKyAgICBtb3ZhICAgICAgICAgbTEsIG0wCisgICAgcHNybHEgICAgICAgIG0xLCAzMgorJWVuZGlmCisgICAgcGFkZHcgICAgICAgIG0wLCBtMQorJWVuZGlmIDsgIXNzc2UzCisKKyVpZiBjcHVmbGFnKG1teGV4dCkKKyAgICBQU0hVRkxXICAgICAgbTEsIG0wLCAweDEKKyVlbGlmIGNwdWZsYWcobW14KQorICAgIG1vdmEgICAgICAgICBtMSwgbTAKKyAgICBwc3JscSAgICAgICAgbTEsIDE2CislZW5kaWYKKyAgICBwYWRkdyAgICAgICAgbTAsIG0xICAgICAgICAgICA7IHN1bSBvZiBIIGNvZWZmaWNpZW50cworCisgICAgbGVhICAgICAgICAgIHI0LCBbcjArcjIqNC0xXQorICAgIGxlYSAgICAgICAgICByMywgW3IwICAgICAtMV0KKyAgICBhZGQgICAgICAgICAgcjQsIHIyCisKKyVpZiBBUkNIX1g4Nl82NAorJWRlZmluZSBlX3JlZyByOAorJWVsc2UKKyVkZWZpbmUgZV9yZWcgcjAKKyVlbmRpZgorCisgICAgbW92enggICAgIGVfcmVnLCBieXRlIFtyMytyMioyICAgXQorICAgIG1vdnp4ICAgICAgICByNSwgYnl0ZSBbcjQrcjEgICAgIF0KKyAgICBzdWIgICAgICAgICAgcjUsIGVfcmVnCisKKyAgICBtb3Z6eCAgICAgZV9yZWcsIGJ5dGUgW3IzICAgICAgICBdCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3Z6eCAgICAgICAgcjcsIGJ5dGUgW3I0K3IyICAgICBdCisgICAgc3ViICAgICAgICAgIHI3LCBlX3JlZworICAgIHN1YiAgICAgICAgICByNSwgcjcKKyVlbHNlCisgICAgbW92enggICAgICAgIHI2LCBieXRlIFtyNCtyMiAgICAgXQorICAgIHN1YiAgICAgICAgICByNiwgZV9yZWcKKyAgICBsZWEgICAgICAgICAgcjUsIFtyNStyNio0XQorICAgIHN1YiAgICAgICAgICByNSwgcjYKKyVlbmRpZgorCisgICAgbW92enggICAgIGVfcmVnLCBieXRlIFtyMytyMSAgICAgXQorICAgIG1vdnp4ICAgICAgICByNiwgYnl0ZSBbcjQrcjIqMiAgIF0KKyAgICBzdWIgICAgICAgICAgcjYsIGVfcmVnCislaWYgQVJDSF9YODZfNjQKKyAgICBhZGQgICAgICAgICAgcjYsIHI3CislZW5kaWYKKyAgICBsZWEgICAgICAgICAgcjUsIFtyNStyNio0XQorCisgICAgbW92enggICAgIGVfcmVnLCBieXRlIFtyMytyMiAgICAgXQorICAgIG1vdnp4ICAgICAgICByNiwgYnl0ZSBbcjQgICAgICAgIF0KKyAgICBzdWIgICAgICAgICAgcjYsIGVfcmVnCisgICAgbGVhICAgICAgICAgIHI2LCBbcjUrcjYqMl0KKworICAgIGxlYSAgICAgICAgICByNSwgW3I2KjkrMTZdCisgICAgbGVhICAgICAgICAgIHI1LCBbcjUrcjYqOF0KKyAgICBzYXIgICAgICAgICAgcjUsIDUKKworJWlmIEFSQ0hfWDg2XzY0ID09IDAKKyAgICBtb3YgICAgICAgICAgcjAsIHIwbQorJWVuZGlmCisKKyAgICBtb3Z6eCAgICAgICAgcjMsIGJ5dGUgW3I0K3IyKjIgIF0KKyAgICBtb3Z6eCAgICAgICAgcjQsIGJ5dGUgW3IwK3IxICArN10KKyAgICBsZWEgICAgICAgICAgcjMsIFtyMytyNCsxXQorICAgIHNobCAgICAgICAgICByMywgNAorICAgIG1vdmQgICAgICAgIHIxZCwgbTAKKyAgICBtb3ZzeCAgICAgICByMWQsIHIxdworICAgIGltdWwgICAgICAgIHIxZCwgMTcKKyAgICBhZGQgICAgICAgICByMWQsIDE2CisgICAgc2FyICAgICAgICAgcjFkLCA1CisgICAgbW92ZCAgICAgICAgIG0wLCByMWQKKyAgICBhZGQgICAgICAgICByMWQsIHI1ZAorICAgIHN1YiAgICAgICAgIHIzZCwgcjFkCisgICAgYWRkICAgICAgICAgcjFkLCByMWQKKyAgICBzdWIgICAgICAgICByM2QsIHIxZCAgICAgICAgICA7IGEKKworICAgIG1vdmQgICAgICAgICBtMSwgcjVkCisgICAgbW92ZCAgICAgICAgIG0zLCByM2QKKyAgICBTUExBVFcgICAgICAgbTAsIG0wLCAwICAgICAgICA7IEgKKyAgICBTUExBVFcgICAgICAgbTEsIG0xLCAwICAgICAgICA7IFYKKyAgICBTUExBVFcgICAgICAgbTMsIG0zLCAwICAgICAgICA7IGEKKyVpZiBtbXNpemUgPT0gOAorICAgIG1vdmEgICAgICAgICBtMiwgbTAKKyVlbmRpZgorICAgIHBtdWxsdyAgICAgICBtMCwgW3B3XzB0bzddICAgIDsgMCpILCAxKkgsIC4uLiwgNypIICAod29yZHMpCisgICAgcGFkZHcgICAgICAgIG0wLCBtMyAgICAgICAgICAgOyBhICsgezAsMSwyLDMsNCw1LDYsN30qSAorJWlmIG1tc2l6ZSA9PSA4CisgICAgcHNsbHcgICAgICAgIG0yLCAyCisgICAgcGFkZHcgICAgICAgIG0yLCBtMCAgICAgICAgICAgOyBhICsgezQsNSw2LDd9KkgKKyVlbmRpZgorCisgICAgbW92ICAgICAgICAgIHI0LCA0CitBTElHTiAxNgorLmxvb3A6CislaWYgbW1zaXplID09IDE2CisgICAgbW92YSAgICAgICAgIG0zLCBtMCAgICAgICAgICAgOyBiWzAuLjddCisgICAgcGFkZHcgICAgICAgIG0wLCBtMQorICAgIHBzcmF3ICAgICAgICBtMywgNQorICAgIG1vdmEgICAgICAgICBtNCwgbTAgICAgICAgICAgIDsgVitiWzAuLjddCisgICAgcGFkZHcgICAgICAgIG0wLCBtMQorICAgIHBzcmF3ICAgICAgICBtNCwgNQorICAgIHBhY2t1c3diICAgICBtMywgbTQKKyAgICBtb3ZoICAgICAgIFtyMF0sIG0zCisgICAgbW92aHBzICBbcjArcjJdLCBtMworJWVsc2UgOyBtbXNpemUgPT0gOAorICAgIG1vdmEgICAgICAgICBtMywgbTAgICAgICAgICAgIDsgYlswLi4zXQorICAgIG1vdmEgICAgICAgICBtNCwgbTIgICAgICAgICAgIDsgYls0Li43XQorICAgIHBhZGR3ICAgICAgICBtMCwgbTEKKyAgICBwYWRkdyAgICAgICAgbTIsIG0xCisgICAgcHNyYXcgICAgICAgIG0zLCA1CisgICAgcHNyYXcgICAgICAgIG00LCA1CisgICAgbW92YSAgICAgICAgIG01LCBtMCAgICAgICAgICAgOyBWK2JbMC4uM10KKyAgICBtb3ZhICAgICAgICAgbTYsIG0yICAgICAgICAgICA7IFYrYls0Li43XQorICAgIHBhZGR3ICAgICAgICBtMCwgbTEKKyAgICBwYWRkdyAgICAgICAgbTIsIG0xCisgICAgcHNyYXcgICAgICAgIG01LCA1CisgICAgcHNyYXcgICAgICAgIG02LCA1CisgICAgcGFja3Vzd2IgICAgIG0zLCBtNAorICAgIHBhY2t1c3diICAgICBtNSwgbTYKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0zCisgICAgbW92YSAgICBbcjArcjJdLCBtNQorJWVuZGlmCisKKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMioyXQorICAgIGRlYyAgICAgICAgICByNAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teAorSDI2NF9QUkVEOHg4X1BMQU5FCitJTklUX01NWCBtbXhleHQKK0gyNjRfUFJFRDh4OF9QTEFORQorSU5JVF9YTU0gc3NlMgorSDI2NF9QUkVEOHg4X1BMQU5FCitJTklUX1hNTSBzc3NlMworSDI2NF9QUkVEOHg4X1BMQU5FCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhfdmVydGljYWxfOCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5JVF9NTVggbW14CitjZ2xvYmFsIHByZWQ4eDhfdmVydGljYWxfOCwgMiwyCisgICAgc3ViICAgIHIwLCByMQorICAgIG1vdnEgIG1tMCwgW3IwXQorJXJlcCAzCisgICAgbW92cSBbcjArcjEqMV0sIG1tMAorICAgIG1vdnEgW3IwK3IxKjJdLCBtbTAKKyAgICBsZWEgICAgcjAsIFtyMCtyMSoyXQorJWVuZHJlcAorICAgIG1vdnEgW3IwK3IxKjFdLCBtbTAKKyAgICBtb3ZxIFtyMCtyMSoyXSwgbW0wCisgICAgUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhfaG9yaXpvbnRhbF84KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gUFJFRDh4OF9IIDAKK2NnbG9iYWwgcHJlZDh4OF9ob3Jpem9udGFsXzgsIDIsMworICAgIG1vdiAgICAgICByMiwgNAorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92YSAgICAgIG0yLCBbcGJfM10KKyVlbmRpZgorLmxvb3A6CisgICAgU1BMQVRCX0xPQUQgbTAsIHIwK3IxKjAtMSwgbTIKKyAgICBTUExBVEJfTE9BRCBtMSwgcjArcjEqMS0xLCBtMgorICAgIG1vdmEgW3IwK3IxKjBdLCBtMAorICAgIG1vdmEgW3IwK3IxKjFdLCBtMQorICAgIGxlYSAgICAgICByMCwgW3IwK3IxKjJdCisgICAgZGVjICAgICAgIHIyCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CitQUkVEOHg4X0gKK0lOSVRfTU1YIG1teGV4dAorUFJFRDh4OF9ICitJTklUX01NWCBzc3NlMworUFJFRDh4OF9ICisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhfdG9wX2RjXzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIHByZWQ4eDhfdG9wX2RjXzgsIDIsNQorICAgIHN1YiAgICAgICAgIHIwLCByMQorICAgIG1vdnEgICAgICAgbW0wLCBbcjBdCisgICAgcHhvciAgICAgICBtbTEsIG1tMQorICAgIHB4b3IgICAgICAgbW0yLCBtbTIKKyAgICBsZWEgICAgICAgICByMiwgW3IwK3IxKjJdCisgICAgcHVucGNraGJ3ICBtbTEsIG1tMAorICAgIHB1bnBja2xidyAgbW0wLCBtbTIKKyAgICBwc2FkYncgICAgIG1tMSwgbW0yICAgICAgICA7IHMxCisgICAgbGVhICAgICAgICAgcjMsIFtyMityMSoyXQorICAgIHBzYWRidyAgICAgbW0wLCBtbTIgICAgICAgIDsgczAKKyAgICBwc3JsdyAgICAgIG1tMSwgMQorICAgIHBzcmx3ICAgICAgbW0wLCAxCisgICAgcGF2Z3cgICAgICBtbTEsIG1tMgorICAgIGxlYSAgICAgICAgIHI0LCBbcjMrcjEqMl0KKyAgICBwYXZndyAgICAgIG1tMCwgbW0yCisgICAgcHNodWZ3ICAgICBtbTEsIG1tMSwgMAorICAgIHBzaHVmdyAgICAgbW0wLCBtbTAsIDAgICAgIDsgZGMwICh3KQorICAgIHBhY2t1c3diICAgbW0wLCBtbTEgICAgICAgIDsgZGMwLGRjMSAoYikKKyAgICBtb3ZxIFtyMCtyMSoxXSwgbW0wCisgICAgbW92cSBbcjArcjEqMl0sIG1tMAorICAgIGxlYSAgICAgICAgIHIwLCBbcjMrcjEqMl0KKyAgICBtb3ZxIFtyMityMSoxXSwgbW0wCisgICAgbW92cSBbcjIrcjEqMl0sIG1tMAorICAgIG1vdnEgW3IzK3IxKjFdLCBtbTAKKyAgICBtb3ZxIFtyMytyMSoyXSwgbW0wCisgICAgbW92cSBbcjArcjEqMV0sIG1tMAorICAgIG1vdnEgW3IwK3IxKjJdLCBtbTAKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDh4OF9kY184X21teGV4dCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIHByZWQ4eDhfZGNfOCwgMiw1CisgICAgc3ViICAgICAgIHIwLCByMQorICAgIHB4b3IgICAgICBtNywgbTcKKyAgICBtb3ZkICAgICAgbTAsIFtyMCswXQorICAgIG1vdmQgICAgICBtMSwgW3IwKzRdCisgICAgcHNhZGJ3ICAgIG0wLCBtNyAgICAgICAgICAgIDsgczAKKyAgICBtb3YgICAgICAgcjQsIHIwCisgICAgcHNhZGJ3ICAgIG0xLCBtNyAgICAgICAgICAgIDsgczEKKworICAgIG1vdnp4ICAgIHIyZCwgYnl0ZSBbcjArcjEqMS0xXQorICAgIG1vdnp4ICAgIHIzZCwgYnl0ZSBbcjArcjEqMi0xXQorICAgIGxlYSAgICAgICByMCwgW3IwK3IxKjJdCisgICAgYWRkICAgICAgcjJkLCByM2QKKyAgICBtb3Z6eCAgICByM2QsIGJ5dGUgW3IwK3IxKjEtMV0KKyAgICBhZGQgICAgICByMmQsIHIzZAorICAgIG1vdnp4ICAgIHIzZCwgYnl0ZSBbcjArcjEqMi0xXQorICAgIGFkZCAgICAgIHIyZCwgcjNkCisgICAgbGVhICAgICAgIHIwLCBbcjArcjEqMl0KKyAgICBtb3ZkICAgICAgbTIsIHIyZCAgICAgICAgICAgIDsgczIKKyAgICBtb3Z6eCAgICByMmQsIGJ5dGUgW3IwK3IxKjEtMV0KKyAgICBtb3Z6eCAgICByM2QsIGJ5dGUgW3IwK3IxKjItMV0KKyAgICBsZWEgICAgICAgcjAsIFtyMCtyMSoyXQorICAgIGFkZCAgICAgIHIyZCwgcjNkCisgICAgbW92enggICAgcjNkLCBieXRlIFtyMCtyMSoxLTFdCisgICAgYWRkICAgICAgcjJkLCByM2QKKyAgICBtb3Z6eCAgICByM2QsIGJ5dGUgW3IwK3IxKjItMV0KKyAgICBhZGQgICAgICByMmQsIHIzZAorICAgIG1vdmQgICAgICBtMywgcjJkICAgICAgICAgICAgOyBzMworCisgICAgcHVucGNrbHdkIG0wLCBtMQorICAgIG1vdiAgICAgICByMCwgcjQKKyAgICBwdW5wY2tsd2QgbTIsIG0zCisgICAgcHVucGNrbGRxIG0wLCBtMiAgICAgICAgICAgIDsgczAsIHMxLCBzMiwgczMKKyAgICBwc2h1ZncgICAgbTMsIG0wLCAxMTExMDExMGIgOyBzMiwgczEsIHMzLCBzMworICAgIGxlYSAgICAgICByMiwgW3IwK3IxKjJdCisgICAgcHNodWZ3ICAgIG0wLCBtMCwgMDExMTAxMDBiIDsgczAsIHMxLCBzMywgczEKKyAgICBwYWRkdyAgICAgbTAsIG0zCisgICAgbGVhICAgICAgIHIzLCBbcjIrcjEqMl0KKyAgICBwc3JsdyAgICAgbTAsIDIKKyAgICBwYXZndyAgICAgbTAsIG03ICAgICAgICAgICAgOyBzMCtzMiwgczEsIHMzLCBzMStzMworICAgIGxlYSAgICAgICByNCwgW3IzK3IxKjJdCisgICAgcGFja3Vzd2IgIG0wLCBtMAorICAgIHB1bnBja2xidyBtMCwgbTAKKyAgICBtb3ZxICAgICAgbTEsIG0wCisgICAgcHVucGNrbGJ3IG0wLCBtMAorICAgIHB1bnBja2hidyBtMSwgbTEKKyAgICBtb3ZxIFtyMCtyMSoxXSwgbTAKKyAgICBtb3ZxIFtyMCtyMSoyXSwgbTAKKyAgICBtb3ZxIFtyMityMSoxXSwgbTAKKyAgICBtb3ZxIFtyMityMSoyXSwgbTAKKyAgICBtb3ZxIFtyMytyMSoxXSwgbTEKKyAgICBtb3ZxIFtyMytyMSoyXSwgbTEKKyAgICBtb3ZxIFtyNCtyMSoxXSwgbTEKKyAgICBtb3ZxIFtyNCtyMSoyXSwgbTEKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDh4OF9kY19ydjQwXzgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCBwcmVkOHg4X2RjX3J2NDBfOCwgMiw3CisgICAgbW92ICAgICAgIHI0LCByMAorICAgIHN1YiAgICAgICByMCwgcjEKKyAgICBweG9yICAgICAgbW0wLCBtbTAKKyAgICBwc2FkYncgICAgbW0wLCBbcjBdCisgICAgZGVjICAgICAgICByMAorICAgIG1vdnp4ICAgICByNWQsIGJ5dGUgW3IwK3IxKjFdCisgICAgbW92ZCAgICAgIHI2ZCwgbW0wCisgICAgbGVhICAgICAgICByMCwgW3IwK3IxKjJdCislcmVwIDMKKyAgICBtb3Z6eCAgICAgcjJkLCBieXRlIFtyMCtyMSowXQorICAgIG1vdnp4ICAgICByM2QsIGJ5dGUgW3IwK3IxKjFdCisgICAgYWRkICAgICAgIHI1ZCwgcjJkCisgICAgYWRkICAgICAgIHI2ZCwgcjNkCisgICAgbGVhICAgICAgICByMCwgW3IwK3IxKjJdCislZW5kcmVwCisgICAgbW92enggICAgIHIyZCwgYnl0ZSBbcjArcjEqMF0KKyAgICBhZGQgICAgICAgcjVkLCByNmQKKyAgICBsZWEgICAgICAgcjJkLCBbcjIrcjUrOF0KKyAgICBzaHIgICAgICAgcjJkLCA0CisgICAgbW92ZCAgICAgIG1tMCwgcjJkCisgICAgcHVucGNrbGJ3IG1tMCwgbW0wCisgICAgcHNodWZ3ICAgIG1tMCwgbW0wLCAwCisgICAgbW92ICAgICAgIHIzZCwgNAorLmxvb3A6CisgICAgbW92cSBbcjQrcjEqMF0sIG1tMAorICAgIG1vdnEgW3I0K3IxKjFdLCBtbTAKKyAgICBsZWEgICByNCwgW3I0K3IxKjJdCisgICAgZGVjICAgcjNkCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhfdG1fdnA4XzgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBQUkVEOHg4X1RNIDAKK2NnbG9iYWwgcHJlZDh4OF90bV92cDhfOCwgMiw2CisgICAgc3ViICAgICAgICByMCwgcjEKKyAgICBweG9yICAgICAgbW03LCBtbTcKKyAgICBtb3ZxICAgICAgbW0wLCBbcjBdCisgICAgbW92cSAgICAgIG1tMSwgbW0wCisgICAgcHVucGNrbGJ3IG1tMCwgbW03CisgICAgcHVucGNraGJ3IG1tMSwgbW03CisgICAgbW92enggICAgIHI0ZCwgYnl0ZSBbcjAtMV0KKyAgICBtb3YgICAgICAgcjVkLCA0CisubG9vcDoKKyAgICBtb3Z6eCAgICAgcjJkLCBieXRlIFtyMCtyMSoxLTFdCisgICAgbW92enggICAgIHIzZCwgYnl0ZSBbcjArcjEqMi0xXQorICAgIHN1YiAgICAgICByMmQsIHI0ZAorICAgIHN1YiAgICAgICByM2QsIHI0ZAorICAgIG1vdmQgICAgICBtbTIsIHIyZAorICAgIG1vdmQgICAgICBtbTQsIHIzZAorICAgIFNQTEFUVyAgICBtbTIsIG1tMiwgMAorICAgIFNQTEFUVyAgICBtbTQsIG1tNCwgMAorICAgIG1vdnEgICAgICBtbTMsIG1tMgorICAgIG1vdnEgICAgICBtbTUsIG1tNAorICAgIHBhZGR3ICAgICBtbTIsIG1tMAorICAgIHBhZGR3ICAgICBtbTMsIG1tMQorICAgIHBhZGR3ICAgICBtbTQsIG1tMAorICAgIHBhZGR3ICAgICBtbTUsIG1tMQorICAgIHBhY2t1c3diICBtbTIsIG1tMworICAgIHBhY2t1c3diICBtbTQsIG1tNQorICAgIG1vdnEgW3IwK3IxKjFdLCBtbTIKKyAgICBtb3ZxIFtyMCtyMSoyXSwgbW00CisgICAgbGVhICAgICAgICByMCwgW3IwK3IxKjJdCisgICAgZGVjICAgICAgIHI1ZAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teAorUFJFRDh4OF9UTQorSU5JVF9NTVggbW14ZXh0CitQUkVEOHg4X1RNCisKK0lOSVRfWE1NIHNzZTIKK2NnbG9iYWwgcHJlZDh4OF90bV92cDhfOCwgMiw2LDQKKyAgICBzdWIgICAgICAgICAgcjAsIHIxCisgICAgcHhvciAgICAgICB4bW0xLCB4bW0xCisgICAgbW92cSAgICAgICB4bW0wLCBbcjBdCisgICAgcHVucGNrbGJ3ICB4bW0wLCB4bW0xCisgICAgbW92enggICAgICAgcjRkLCBieXRlIFtyMC0xXQorICAgIG1vdiAgICAgICAgIHI1ZCwgNAorLmxvb3A6CisgICAgbW92enggICAgICAgcjJkLCBieXRlIFtyMCtyMSoxLTFdCisgICAgbW92enggICAgICAgcjNkLCBieXRlIFtyMCtyMSoyLTFdCisgICAgc3ViICAgICAgICAgcjJkLCByNGQKKyAgICBzdWIgICAgICAgICByM2QsIHI0ZAorICAgIG1vdmQgICAgICAgeG1tMiwgcjJkCisgICAgbW92ZCAgICAgICB4bW0zLCByM2QKKyAgICBwc2h1Zmx3ICAgIHhtbTIsIHhtbTIsIDAKKyAgICBwc2h1Zmx3ICAgIHhtbTMsIHhtbTMsIDAKKyAgICBwdW5wY2tscWRxIHhtbTIsIHhtbTIKKyAgICBwdW5wY2tscWRxIHhtbTMsIHhtbTMKKyAgICBwYWRkdyAgICAgIHhtbTIsIHhtbTAKKyAgICBwYWRkdyAgICAgIHhtbTMsIHhtbTAKKyAgICBwYWNrdXN3YiAgIHhtbTIsIHhtbTMKKyAgICBtb3ZxICAgW3IwK3IxKjFdLCB4bW0yCisgICAgbW92aHBzIFtyMCtyMSoyXSwgeG1tMgorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IxKjJdCisgICAgZGVjICAgICAgICAgcjVkCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCisKK0lOSVRfWE1NIHNzc2UzCitjZ2xvYmFsIHByZWQ4eDhfdG1fdnA4XzgsIDIsMyw2CisgICAgc3ViICAgICAgICAgIHIwLCByMQorICAgIG1vdmRxYSAgICAgeG1tNCwgW3RtX3NodWZdCisgICAgcHhvciAgICAgICB4bW0xLCB4bW0xCisgICAgbW92cSAgICAgICB4bW0wLCBbcjBdCisgICAgcHVucGNrbGJ3ICB4bW0wLCB4bW0xCisgICAgbW92ZCAgICAgICB4bW01LCBbcjAtNF0KKyAgICBwc2h1ZmIgICAgIHhtbTUsIHhtbTQKKyAgICBtb3YgICAgICAgICByMmQsIDQKKy5sb29wOgorICAgIG1vdmQgICAgICAgeG1tMiwgW3IwK3IxKjEtNF0KKyAgICBtb3ZkICAgICAgIHhtbTMsIFtyMCtyMSoyLTRdCisgICAgcHNodWZiICAgICB4bW0yLCB4bW00CisgICAgcHNodWZiICAgICB4bW0zLCB4bW00CisgICAgcHN1YncgICAgICB4bW0yLCB4bW01CisgICAgcHN1YncgICAgICB4bW0zLCB4bW01CisgICAgcGFkZHcgICAgICB4bW0yLCB4bW0wCisgICAgcGFkZHcgICAgICB4bW0zLCB4bW0wCisgICAgcGFja3Vzd2IgICB4bW0yLCB4bW0zCisgICAgbW92cSAgIFtyMCtyMSoxXSwgeG1tMgorICAgIG1vdmhwcyBbcjArcjEqMl0sIHhtbTIKKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMSoyXQorICAgIGRlYyAgICAgICAgIHIyZAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorCis7IGRlc3QsIGxlZnQsIHJpZ2h0LCBzcmMsIHRtcAorOyBvdXRwdXQ6ICUxID0gKHRbbi0xXSArIHRbbl0qMiArIHRbbisxXSArIDIpID4+IDIKKyVtYWNybyBQUkVENHg0X0xPV1BBU1MgNQorICAgIG1vdmEgICAgJTUsICUyCisgICAgcGF2Z2IgICAlMiwgJTMKKyAgICBweG9yICAgICUzLCAlNQorICAgIG1vdmEgICAgJTEsICU0CisgICAgcGFuZCAgICAlMywgW3BiXzFdCisgICAgcHN1YnVzYiAlMiwgJTMKKyAgICBwYXZnYiAgICUxLCAlMgorJWVuZG1hY3JvCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhsX3RvcF9kY184KHVpbnQ4X3QgKnNyYywgaW50IGhhc190b3BsZWZ0LCBpbnQgaGFzX3RvcHJpZ2h0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBQUkVEOHg4TF9UT1BfREMgMAorY2dsb2JhbCBwcmVkOHg4bF90b3BfZGNfOCwgNCw0CisgICAgc3ViICAgICAgICAgIHIwLCByMworICAgIHB4b3IgICAgICAgIG1tNywgbW03CisgICAgbW92cSAgICAgICAgbW0wLCBbcjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTMsIFtyMF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyMCs4XQorICAgIG1vdnEgICAgICAgIG1tMiwgbW0zCisgICAgbW92cSAgICAgICAgbW00LCBtbTMKKyAgICBQQUxJR05SICAgICBtbTIsIG1tMCwgNywgbW0wCisgICAgUEFMSUdOUiAgICAgbW0xLCBtbTQsIDEsIG1tNAorICAgIHRlc3QgICAgICAgIHIxZCwgcjFkIDsgdG9wX2xlZnQKKyAgICBqeiAuZml4X2x0XzIKKyAgICB0ZXN0ICAgICAgICByMmQsIHIyZCA7IHRvcF9yaWdodAorICAgIGp6IC5maXhfdHJfMQorICAgIGptcCAuYm9keQorLmZpeF9sdF8yOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTIKKyAgICBwc2xscSAgICAgICBtbTUsIDU2CisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHB4b3IgICAgICAgIG1tMiwgbW01CisgICAgdGVzdCAgICAgICAgcjJkLCByMmQgOyB0b3BfcmlnaHQKKyAgICBqbnogLmJvZHkKKy5maXhfdHJfMToKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMworICAgIHB4b3IgICAgICAgIG1tNSwgbW0xCisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHBzbGxxICAgICAgIG1tNSwgNTYKKyAgICBweG9yICAgICAgICBtbTEsIG1tNQorLmJvZHk6CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMCwgbW0yLCBtbTEsIG1tMywgbW01CisgICAgcHNhZGJ3ICAgbW03LCBtbTAKKyAgICBwYWRkdyAgICBtbTcsIFtwd180XQorICAgIHBzcmx3ICAgIG1tNywgMworICAgIHBzaHVmdyAgIG1tNywgbW03LCAwCisgICAgcGFja3Vzd2IgbW03LCBtbTcKKyVyZXAgMworICAgIG1vdnEgW3IwK3IzKjFdLCBtbTcKKyAgICBtb3ZxIFtyMCtyMyoyXSwgbW03CisgICAgbGVhICAgIHIwLCBbcjArcjMqMl0KKyVlbmRyZXAKKyAgICBtb3ZxIFtyMCtyMyoxXSwgbW03CisgICAgbW92cSBbcjArcjMqMl0sIG1tNworICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUFJFRDh4OExfVE9QX0RDCitJTklUX01NWCBzc3NlMworUFJFRDh4OExfVE9QX0RDCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhsX2RjXzgodWludDhfdCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsIGludCBoYXNfdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBQUkVEOHg4TF9EQyAwCitjZ2xvYmFsIHByZWQ4eDhsX2RjXzgsIDQsNQorICAgIHN1YiAgICAgICAgICByMCwgcjMKKyAgICBsZWEgICAgICAgICAgcjQsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgIG1tMCwgW3IwK3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTAsIFtyMCtyMyowLThdCisgICAgbW92cSAgICAgICAgbW0xLCBbcjQrcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMSwgW3IwK3IzKjItOF0KKyAgICBtb3YgICAgICAgICAgcjQsIHIwCisgICAgcHVucGNraHdkICAgbW0xLCBtbTAKKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMyo0XQorICAgIG1vdnEgICAgICAgIG1tMiwgW3IwK3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTIsIFtyMCtyMyowLThdCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjMqMl0KKyAgICBtb3ZxICAgICAgICBtbTMsIFtyMCtyMyoxLThdCisgICAgcHVucGNraGJ3ICAgbW0zLCBbcjArcjMqMC04XQorICAgIHB1bnBja2h3ZCAgIG1tMywgbW0yCisgICAgcHVucGNraGRxICAgbW0zLCBtbTEKKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgIG1tMCwgW3IwK3IzKjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyNF0KKyAgICBtb3YgICAgICAgICAgcjAsIHI0CisgICAgbW92cSAgICAgICAgbW00LCBtbTMKKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMworICAgIFBBTElHTlIgICAgIG1tNCwgbW0wLCA3LCBtbTAKKyAgICBQQUxJR05SICAgICBtbTEsIG1tMiwgMSwgbW0yCisgICAgdGVzdCAgICAgICAgcjFkLCByMWQKKyAgICBqbnogLmRvX2xlZnQKKy5maXhfbHRfMToKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMworICAgIHB4b3IgICAgICAgIG1tNSwgbW00CisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHBzbGxxICAgICAgIG1tNSwgNDgKKyAgICBweG9yICAgICAgICBtbTEsIG1tNQorICAgIGptcCAuZG9fbGVmdAorLmZpeF9sdF8yOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTIKKyAgICBwc2xscSAgICAgICBtbTUsIDU2CisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHB4b3IgICAgICAgIG1tMiwgbW01CisgICAgdGVzdCAgICAgICAgcjJkLCByMmQKKyAgICBqbnogLmJvZHkKKy5maXhfdHJfMToKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMworICAgIHB4b3IgICAgICAgIG1tNSwgbW0xCisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHBzbGxxICAgICAgIG1tNSwgNTYKKyAgICBweG9yICAgICAgICBtbTEsIG1tNQorICAgIGptcCAuYm9keQorLmRvX2xlZnQ6CisgICAgbW92cSAgICAgICAgbW0wLCBtbTQKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0yLCBtbTEsIG1tNCwgbW0zLCBtbTUKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMAorICAgIG1vdnEgICAgICAgIG1tNywgbW0yCisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMSwgbW0zLCBtbTAsIG1tNCwgbW01CisgICAgcHNsbHEgICAgICAgbW0xLCA1NgorICAgIFBBTElHTlIgICAgIG1tNywgbW0xLCA3LCBtbTMKKyAgICBtb3ZxICAgICAgICBtbTAsIFtyMC04XQorICAgIG1vdnEgICAgICAgIG1tMywgW3IwXQorICAgIG1vdnEgICAgICAgIG1tMSwgW3IwKzhdCisgICAgbW92cSAgICAgICAgbW0yLCBtbTMKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMworICAgIFBBTElHTlIgICAgIG1tMiwgbW0wLCA3LCBtbTAKKyAgICBQQUxJR05SICAgICBtbTEsIG1tNCwgMSwgbW00CisgICAgdGVzdCAgICAgICAgcjFkLCByMWQKKyAgICBqeiAuZml4X2x0XzIKKyAgICB0ZXN0ICAgICAgICByMmQsIHIyZAorICAgIGp6IC5maXhfdHJfMQorLmJvZHk6CisgICAgbGVhICAgICAgICAgIHIxLCBbcjArcjMqMl0KKyAgICBQUkVENHg0X0xPV1BBU1MgbW02LCBtbTIsIG1tMSwgbW0zLCBtbTUKKyAgICBweG9yICAgICAgICBtbTAsIG1tMAorICAgIHB4b3IgICAgICAgIG1tMSwgbW0xCisgICAgbGVhICAgICAgICAgIHIyLCBbcjErcjMqMl0KKyAgICBwc2FkYncgICAgICBtbTAsIG1tNworICAgIHBzYWRidyAgICAgIG1tMSwgbW02CisgICAgcGFkZHcgICAgICAgbW0wLCBbcHdfOF0KKyAgICBwYWRkdyAgICAgICBtbTAsIG1tMQorICAgIGxlYSAgICAgICAgICByNCwgW3IyK3IzKjJdCisgICAgcHNybHcgICAgICAgbW0wLCA0CisgICAgcHNodWZ3ICAgICAgbW0wLCBtbTAsIDAKKyAgICBwYWNrdXN3YiAgICBtbTAsIG1tMAorICAgIG1vdnEgW3IwK3IzKjFdLCBtbTAKKyAgICBtb3ZxIFtyMCtyMyoyXSwgbW0wCisgICAgbW92cSBbcjErcjMqMV0sIG1tMAorICAgIG1vdnEgW3IxK3IzKjJdLCBtbTAKKyAgICBtb3ZxIFtyMityMyoxXSwgbW0wCisgICAgbW92cSBbcjIrcjMqMl0sIG1tMAorICAgIG1vdnEgW3I0K3IzKjFdLCBtbTAKKyAgICBtb3ZxIFtyNCtyMyoyXSwgbW0wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitQUkVEOHg4TF9EQworSU5JVF9NTVggc3NzZTMKK1BSRUQ4eDhMX0RDCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhsX2hvcml6b250YWxfOCh1aW50OF90ICpzcmMsIGludCBoYXNfdG9wbGVmdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gUFJFRDh4OExfSE9SSVpPTlRBTCAwCitjZ2xvYmFsIHByZWQ4eDhsX2hvcml6b250YWxfOCwgNCw0CisgICAgc3ViICAgICAgICAgIHIwLCByMworICAgIGxlYSAgICAgICAgICByMiwgW3IwK3IzKjJdCisgICAgbW92cSAgICAgICAgbW0wLCBbcjArcjMqMS04XQorICAgIHRlc3QgICAgICAgIHIxZCwgcjFkCisgICAgbGVhICAgICAgICAgIHIxLCBbcjArcjNdCisgICAgY21vdm56ICAgICAgIHIxLCByMAorICAgIHB1bnBja2hidyAgIG1tMCwgW3IxK3IzKjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyMityMyoxLThdCisgICAgcHVucGNraGJ3ICAgbW0xLCBbcjArcjMqMi04XQorICAgIG1vdiAgICAgICAgICByMiwgcjAKKyAgICBwdW5wY2tod2QgICBtbTEsIG1tMAorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IzKjRdCisgICAgbW92cSAgICAgICAgbW0yLCBbcjArcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMiwgW3IwK3IzKjAtOF0KKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgIG1tMywgW3IwK3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTMsIFtyMCtyMyowLThdCisgICAgcHVucGNraHdkICAgbW0zLCBtbTIKKyAgICBwdW5wY2toZHEgICBtbTMsIG1tMQorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IzKjJdCisgICAgbW92cSAgICAgICAgbW0wLCBbcjArcjMqMC04XQorICAgIG1vdnEgICAgICAgIG1tMSwgW3IxK3IzKjAtOF0KKyAgICBtb3YgICAgICAgICAgcjAsIHIyCisgICAgbW92cSAgICAgICAgbW00LCBtbTMKKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMworICAgIFBBTElHTlIgICAgIG1tNCwgbW0wLCA3LCBtbTAKKyAgICBQQUxJR05SICAgICBtbTEsIG1tMiwgMSwgbW0yCisgICAgbW92cSAgICAgICAgbW0wLCBtbTQKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0yLCBtbTEsIG1tNCwgbW0zLCBtbTUKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMAorICAgIG1vdnEgICAgICAgIG1tNywgbW0yCisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMSwgbW0zLCBtbTAsIG1tNCwgbW01CisgICAgcHNsbHEgICAgICAgbW0xLCA1NgorICAgIFBBTElHTlIgICAgIG1tNywgbW0xLCA3LCBtbTMKKyAgICBtb3ZxICAgICAgICBtbTMsIG1tNworICAgIGxlYSAgICAgICAgIHIxLCBbcjArcjMqMl0KKyAgICBtb3ZxICAgICAgIG1tNywgbW0zCisgICAgcHVucGNraGJ3ICBtbTMsIG1tMworICAgIHB1bnBja2xidyAgbW03LCBtbTcKKyAgICBwc2h1ZncgICAgIG1tMCwgbW0zLCAweGZmCisgICAgcHNodWZ3ICAgICBtbTEsIG1tMywgMHhhYQorICAgIGxlYSAgICAgICAgIHIyLCBbcjErcjMqMl0KKyAgICBwc2h1ZncgICAgIG1tMiwgbW0zLCAweDU1CisgICAgcHNodWZ3ICAgICBtbTMsIG1tMywgMHgwMAorICAgIHBzaHVmdyAgICAgbW00LCBtbTcsIDB4ZmYKKyAgICBwc2h1ZncgICAgIG1tNSwgbW03LCAweGFhCisgICAgcHNodWZ3ICAgICBtbTYsIG1tNywgMHg1NQorICAgIHBzaHVmdyAgICAgbW03LCBtbTcsIDB4MDAKKyAgICBtb3ZxIFtyMCtyMyoxXSwgbW0wCisgICAgbW92cSBbcjArcjMqMl0sIG1tMQorICAgIG1vdnEgW3IxK3IzKjFdLCBtbTIKKyAgICBtb3ZxIFtyMStyMyoyXSwgbW0zCisgICAgbW92cSBbcjIrcjMqMV0sIG1tNAorICAgIG1vdnEgW3IyK3IzKjJdLCBtbTUKKyAgICBsZWEgICAgICAgICByMCwgW3IyK3IzKjJdCisgICAgbW92cSBbcjArcjMqMV0sIG1tNgorICAgIG1vdnEgW3IwK3IzKjJdLCBtbTcKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BSRUQ4eDhMX0hPUklaT05UQUwKK0lOSVRfTU1YIHNzc2UzCitQUkVEOHg4TF9IT1JJWk9OVEFMCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhsX3ZlcnRpY2FsXzgodWludDhfdCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsIGludCBoYXNfdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBQUkVEOHg4TF9WRVJUSUNBTCAwCitjZ2xvYmFsIHByZWQ4eDhsX3ZlcnRpY2FsXzgsIDQsNAorICAgIHN1YiAgICAgICAgICByMCwgcjMKKyAgICBtb3ZxICAgICAgICBtbTAsIFtyMC04XQorICAgIG1vdnEgICAgICAgIG1tMywgW3IwXQorICAgIG1vdnEgICAgICAgIG1tMSwgW3IwKzhdCisgICAgbW92cSAgICAgICAgbW0yLCBtbTMKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMworICAgIFBBTElHTlIgICAgIG1tMiwgbW0wLCA3LCBtbTAKKyAgICBQQUxJR05SICAgICBtbTEsIG1tNCwgMSwgbW00CisgICAgdGVzdCAgICAgICAgcjFkLCByMWQgOyB0b3BfbGVmdAorICAgIGp6IC5maXhfbHRfMgorICAgIHRlc3QgICAgICAgIHIyZCwgcjJkIDsgdG9wX3JpZ2h0CisgICAganogLmZpeF90cl8xCisgICAgam1wIC5ib2R5CisuZml4X2x0XzI6CisgICAgbW92cSAgICAgICAgbW01LCBtbTMKKyAgICBweG9yICAgICAgICBtbTUsIG1tMgorICAgIHBzbGxxICAgICAgIG1tNSwgNTYKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgcHhvciAgICAgICAgbW0yLCBtbTUKKyAgICB0ZXN0ICAgICAgICByMmQsIHIyZCA7IHRvcF9yaWdodAorICAgIGpueiAuYm9keQorLmZpeF90cl8xOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTEKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgcHNsbHEgICAgICAgbW01LCA1NgorICAgIHB4b3IgICAgICAgIG1tMSwgbW01CisuYm9keToKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0wLCBtbTIsIG1tMSwgbW0zLCBtbTUKKyVyZXAgMworICAgIG1vdnEgW3IwK3IzKjFdLCBtbTAKKyAgICBtb3ZxIFtyMCtyMyoyXSwgbW0wCisgICAgbGVhICAgIHIwLCBbcjArcjMqMl0KKyVlbmRyZXAKKyAgICBtb3ZxIFtyMCtyMyoxXSwgbW0wCisgICAgbW92cSBbcjArcjMqMl0sIG1tMAorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUFJFRDh4OExfVkVSVElDQUwKK0lOSVRfTU1YIHNzc2UzCitQUkVEOHg4TF9WRVJUSUNBTAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkOHg4bF9kb3duX2xlZnRfOCh1aW50OF90ICpzcmMsIGludCBoYXNfdG9wbGVmdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCBwcmVkOHg4bF9kb3duX2xlZnRfOCwgNCw1CisgICAgc3ViICAgICAgICAgIHIwLCByMworICAgIG1vdnEgICAgICAgIG1tMCwgW3IwLThdCisgICAgbW92cSAgICAgICAgbW0zLCBbcjBdCisgICAgbW92cSAgICAgICAgbW0xLCBbcjArOF0KKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMworICAgIG1vdnEgICAgICAgIG1tNCwgbW0zCisgICAgUEFMSUdOUiAgICAgbW0yLCBtbTAsIDcsIG1tMAorICAgIFBBTElHTlIgICAgIG1tMSwgbW00LCAxLCBtbTQKKyAgICB0ZXN0ICAgICAgICByMWQsIHIxZAorICAgIGp6IC5maXhfbHRfMgorICAgIHRlc3QgICAgICAgIHIyZCwgcjJkCisgICAganogLmZpeF90cl8xCisgICAgam1wIC5kb190b3AKKy5maXhfbHRfMjoKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMworICAgIHB4b3IgICAgICAgIG1tNSwgbW0yCisgICAgcHNsbHEgICAgICAgbW01LCA1NgorICAgIHBzcmxxICAgICAgIG1tNSwgNTYKKyAgICBweG9yICAgICAgICBtbTIsIG1tNQorICAgIHRlc3QgICAgICAgIHIyZCwgcjJkCisgICAgam56IC5kb190b3AKKy5maXhfdHJfMToKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMworICAgIHB4b3IgICAgICAgIG1tNSwgbW0xCisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHBzbGxxICAgICAgIG1tNSwgNTYKKyAgICBweG9yICAgICAgICBtbTEsIG1tNQorICAgIGptcCAuZG9fdG9wCisuZml4X3RyXzI6CisgICAgcHVucGNraGJ3ICAgbW0zLCBtbTMKKyAgICBwc2h1ZncgICAgICBtbTEsIG1tMywgMHhGRgorICAgIGptcCAuZG9fdG9wcmlnaHQKKy5kb190b3A6CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tNCwgbW0yLCBtbTEsIG1tMywgbW01CisgICAgbW92cSAgICAgICAgbW03LCBtbTQKKyAgICB0ZXN0ICAgICAgICByMmQsIHIyZAorICAgIGp6IC5maXhfdHJfMgorICAgIG1vdnEgICAgICAgIG1tMCwgW3IwKzhdCisgICAgbW92cSAgICAgICAgbW01LCBtbTAKKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMAorICAgIG1vdnEgICAgICAgIG1tNCwgbW0wCisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIFBBTElHTlIgICAgIG1tMiwgbW0zLCA3LCBtbTMKKyAgICBQQUxJR05SICAgICBtbTUsIG1tNCwgMSwgbW00CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMSwgbW0yLCBtbTUsIG1tMCwgbW00CisuZG9fdG9wcmlnaHQ6CisgICAgbGVhICAgICAgICAgIHIxLCBbcjArcjMqMl0KKyAgICBtb3ZxICAgICAgICBtbTYsIG1tMQorICAgIHBzcmxxICAgICAgIG1tMSwgNTYKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMQorICAgIGxlYSAgICAgICAgICByMiwgW3IxK3IzKjJdCisgICAgbW92cSAgICAgICAgbW0yLCBtbTYKKyAgICBQQUxJR05SICAgICBtbTIsIG1tNywgMSwgbW0wCisgICAgbW92cSAgICAgICAgbW0zLCBtbTYKKyAgICBQQUxJR05SICAgICBtbTMsIG1tNywgNywgbW0wCisgICAgUEFMSUdOUiAgICAgbW00LCBtbTYsIDEsIG1tMAorICAgIG1vdnEgICAgICAgIG1tNSwgbW03CisgICAgbW92cSAgICAgICAgbW0xLCBtbTcKKyAgICBtb3ZxICAgICAgICBtbTcsIG1tNgorICAgIGxlYSAgICAgICAgICByNCwgW3IyK3IzKjJdCisgICAgcHNsbHEgICAgICAgbW0xLCA4CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMCwgbW0xLCBtbTIsIG1tNSwgbW02CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMSwgbW0zLCBtbTQsIG1tNywgbW02CisgICAgbW92cSAgW3I0K3IzKjJdLCBtbTEKKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMAorICAgIHBzbGxxICAgICAgIG1tMSwgOAorICAgIHBzcmxxICAgICAgIG1tMiwgNTYKKyAgICBwc2xscSAgICAgICBtbTAsIDgKKyAgICBwb3IgICAgICAgICBtbTEsIG1tMgorICAgIG1vdnEgIFtyNCtyMyoxXSwgbW0xCisgICAgbW92cSAgICAgICAgbW0yLCBtbTAKKyAgICBwc2xscSAgICAgICBtbTEsIDgKKyAgICBwc3JscSAgICAgICBtbTIsIDU2CisgICAgcHNsbHEgICAgICAgbW0wLCA4CisgICAgcG9yICAgICAgICAgbW0xLCBtbTIKKyAgICBtb3ZxICBbcjIrcjMqMl0sIG1tMQorICAgIG1vdnEgICAgICAgIG1tMiwgbW0wCisgICAgcHNsbHEgICAgICAgbW0xLCA4CisgICAgcHNybHEgICAgICAgbW0yLCA1NgorICAgIHBzbGxxICAgICAgIG1tMCwgOAorICAgIHBvciAgICAgICAgIG1tMSwgbW0yCisgICAgbW92cSAgW3IyK3IzKjFdLCBtbTEKKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMAorICAgIHBzbGxxICAgICAgIG1tMSwgOAorICAgIHBzcmxxICAgICAgIG1tMiwgNTYKKyAgICBwc2xscSAgICAgICBtbTAsIDgKKyAgICBwb3IgICAgICAgICBtbTEsIG1tMgorICAgIG1vdnEgIFtyMStyMyoyXSwgbW0xCisgICAgbW92cSAgICAgICAgbW0yLCBtbTAKKyAgICBwc2xscSAgICAgICBtbTEsIDgKKyAgICBwc3JscSAgICAgICBtbTIsIDU2CisgICAgcHNsbHEgICAgICAgbW0wLCA4CisgICAgcG9yICAgICAgICAgbW0xLCBtbTIKKyAgICBtb3ZxICBbcjErcjMqMV0sIG1tMQorICAgIG1vdnEgICAgICAgIG1tMiwgbW0wCisgICAgcHNsbHEgICAgICAgbW0xLCA4CisgICAgcHNybHEgICAgICAgbW0yLCA1NgorICAgIHBzbGxxICAgICAgIG1tMCwgOAorICAgIHBvciAgICAgICAgIG1tMSwgbW0yCisgICAgbW92cSAgW3IwK3IzKjJdLCBtbTEKKyAgICBwc2xscSAgICAgICBtbTEsIDgKKyAgICBwc3JscSAgICAgICBtbTAsIDU2CisgICAgcG9yICAgICAgICAgbW0xLCBtbTAKKyAgICBtb3ZxICBbcjArcjMqMV0sIG1tMQorICAgIFJFVAorCislbWFjcm8gUFJFRDh4OExfRE9XTl9MRUZUIDAKK2NnbG9iYWwgcHJlZDh4OGxfZG93bl9sZWZ0XzgsIDQsNAorICAgIHN1YiAgICAgICAgICByMCwgcjMKKyAgICBtb3ZxICAgICAgICBtbTAsIFtyMC04XQorICAgIG1vdnEgICAgICAgIG1tMywgW3IwXQorICAgIG1vdnEgICAgICAgIG1tMSwgW3IwKzhdCisgICAgbW92cSAgICAgICAgbW0yLCBtbTMKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMworICAgIFBBTElHTlIgICAgIG1tMiwgbW0wLCA3LCBtbTAKKyAgICBQQUxJR05SICAgICBtbTEsIG1tNCwgMSwgbW00CisgICAgdGVzdCAgICAgICAgcjFkLCByMWQgOyB0b3BfbGVmdAorICAgIGp6IC5maXhfbHRfMgorICAgIHRlc3QgICAgICAgIHIyZCwgcjJkIDsgdG9wX3JpZ2h0CisgICAganogLmZpeF90cl8xCisgICAgam1wIC5kb190b3AKKy5maXhfbHRfMjoKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMworICAgIHB4b3IgICAgICAgIG1tNSwgbW0yCisgICAgcHNsbHEgICAgICAgbW01LCA1NgorICAgIHBzcmxxICAgICAgIG1tNSwgNTYKKyAgICBweG9yICAgICAgICBtbTIsIG1tNQorICAgIHRlc3QgICAgICAgIHIyZCwgcjJkIDsgdG9wX3JpZ2h0CisgICAgam56IC5kb190b3AKKy5maXhfdHJfMToKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMworICAgIHB4b3IgICAgICAgIG1tNSwgbW0xCisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHBzbGxxICAgICAgIG1tNSwgNTYKKyAgICBweG9yICAgICAgICBtbTEsIG1tNQorICAgIGptcCAuZG9fdG9wCisuZml4X3RyXzI6CisgICAgcHVucGNraGJ3ICAgbW0zLCBtbTMKKyAgICBwc2h1ZncgICAgICBtbTEsIG1tMywgMHhGRgorICAgIGptcCAuZG9fdG9wcmlnaHQKKy5kb190b3A6CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tNCwgbW0yLCBtbTEsIG1tMywgbW01CisgICAgbW92cTJkcSAgICB4bW0zLCBtbTQKKyAgICB0ZXN0ICAgICAgICByMmQsIHIyZCA7IHRvcF9yaWdodAorICAgIGp6IC5maXhfdHJfMgorICAgIG1vdnEgICAgICAgIG1tMCwgW3IwKzhdCisgICAgbW92cSAgICAgICAgbW01LCBtbTAKKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMAorICAgIG1vdnEgICAgICAgIG1tNCwgbW0wCisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIFBBTElHTlIgICAgIG1tMiwgbW0zLCA3LCBtbTMKKyAgICBQQUxJR05SICAgICBtbTUsIG1tNCwgMSwgbW00CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMSwgbW0yLCBtbTUsIG1tMCwgbW00CisuZG9fdG9wcmlnaHQ6CisgICAgbW92cTJkcSAgICB4bW00LCBtbTEKKyAgICBwc3JscSAgICAgICBtbTEsIDU2CisgICAgbW92cTJkcSAgICB4bW01LCBtbTEKKyAgICBsZWEgICAgICAgICByMSwgW3IwK3IzKjJdCisgICAgcHNsbGRxICAgIHhtbTQsIDgKKyAgICBwb3IgICAgICAgeG1tMywgeG1tNAorICAgIG1vdmRxYSAgICB4bW0yLCB4bW0zCisgICAgcHNybGRxICAgIHhtbTIsIDEKKyAgICBwc2xsZHEgICAgeG1tNSwgMTUKKyAgICBwb3IgICAgICAgeG1tMiwgeG1tNQorICAgIGxlYSAgICAgICAgIHIyLCBbcjErcjMqMl0KKyAgICBtb3ZkcWEgICAgeG1tMSwgeG1tMworICAgIHBzbGxkcSAgICB4bW0xLCAxCitJTklUX1hNTSBjcHVuYW1lCisgICAgUFJFRDR4NF9MT1dQQVNTIHhtbTAsIHhtbTEsIHhtbTIsIHhtbTMsIHhtbTQKKyAgICBwc3JsZHEgICAgeG1tMCwgMQorICAgIG1vdnEgW3IwK3IzKjFdLCB4bW0wCisgICAgcHNybGRxICAgIHhtbTAsIDEKKyAgICBtb3ZxIFtyMCtyMyoyXSwgeG1tMAorICAgIHBzcmxkcSAgICB4bW0wLCAxCisgICAgbGVhICAgICAgICAgcjAsIFtyMityMyoyXQorICAgIG1vdnEgW3IxK3IzKjFdLCB4bW0wCisgICAgcHNybGRxICAgIHhtbTAsIDEKKyAgICBtb3ZxIFtyMStyMyoyXSwgeG1tMAorICAgIHBzcmxkcSAgICB4bW0wLCAxCisgICAgbW92cSBbcjIrcjMqMV0sIHhtbTAKKyAgICBwc3JsZHEgICAgeG1tMCwgMQorICAgIG1vdnEgW3IyK3IzKjJdLCB4bW0wCisgICAgcHNybGRxICAgIHhtbTAsIDEKKyAgICBtb3ZxIFtyMCtyMyoxXSwgeG1tMAorICAgIHBzcmxkcSAgICB4bW0wLCAxCisgICAgbW92cSBbcjArcjMqMl0sIHhtbTAKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBzc2UyCitQUkVEOHg4TF9ET1dOX0xFRlQKK0lOSVRfTU1YIHNzc2UzCitQUkVEOHg4TF9ET1dOX0xFRlQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDh4OGxfZG93bl9yaWdodF84X21teGV4dCh1aW50OF90ICpzcmMsIGludCBoYXNfdG9wbGVmdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIHByZWQ4eDhsX2Rvd25fcmlnaHRfOCwgNCw1CisgICAgc3ViICAgICAgICAgIHIwLCByMworICAgIGxlYSAgICAgICAgICByNCwgW3IwK3IzKjJdCisgICAgbW92cSAgICAgICAgbW0wLCBbcjArcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMCwgW3IwK3IzKjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyNCtyMyoxLThdCisgICAgcHVucGNraGJ3ICAgbW0xLCBbcjArcjMqMi04XQorICAgIG1vdiAgICAgICAgICByNCwgcjAKKyAgICBwdW5wY2tod2QgICBtbTEsIG1tMAorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IzKjRdCisgICAgbW92cSAgICAgICAgbW0yLCBbcjArcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMiwgW3IwK3IzKjAtOF0KKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgIG1tMywgW3IwK3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTMsIFtyMCtyMyowLThdCisgICAgcHVucGNraHdkICAgbW0zLCBtbTIKKyAgICBwdW5wY2toZHEgICBtbTMsIG1tMQorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IzKjJdCisgICAgbW92cSAgICAgICAgbW0wLCBbcjArcjMqMC04XQorICAgIG1vdnEgICAgICAgIG1tMSwgW3I0XQorICAgIG1vdiAgICAgICAgICByMCwgcjQKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMworICAgIG1vdnEgICAgICAgIG1tMiwgbW0zCisgICAgUEFMSUdOUiAgICAgbW00LCBtbTAsIDcsIG1tMAorICAgIFBBTElHTlIgICAgIG1tMSwgbW0yLCAxLCBtbTIKKyAgICB0ZXN0ICAgICAgICByMWQsIHIxZCA7IHRvcF9sZWZ0CisgICAganogLmZpeF9sdF8xCisuZG9fbGVmdDoKKyAgICBtb3ZxICAgICAgICBtbTAsIG1tNAorICAgIFBSRUQ0eDRfTE9XUEFTUyBtbTIsIG1tMSwgbW00LCBtbTMsIG1tNQorICAgIG1vdnEgICAgICAgIG1tNCwgbW0wCisgICAgbW92cSAgICAgICAgbW03LCBtbTIKKyAgICBtb3ZxICAgICAgICBtbTYsIG1tMgorICAgIFBSRUQ0eDRfTE9XUEFTUyBtbTEsIG1tMywgbW0wLCBtbTQsIG1tNQorICAgIHBzbGxxICAgICAgIG1tMSwgNTYKKyAgICBQQUxJR05SICAgICBtbTcsIG1tMSwgNywgbW0zCisgICAgbW92cSAgICAgICAgbW0wLCBbcjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTMsIFtyMF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyMCs4XQorICAgIG1vdnEgICAgICAgIG1tMiwgbW0zCisgICAgbW92cSAgICAgICAgbW00LCBtbTMKKyAgICBQQUxJR05SICAgICBtbTIsIG1tMCwgNywgbW0wCisgICAgUEFMSUdOUiAgICAgbW0xLCBtbTQsIDEsIG1tNAorICAgIHRlc3QgICAgICAgIHIxZCwgcjFkIDsgdG9wX2xlZnQKKyAgICBqeiAuZml4X2x0XzIKKyAgICB0ZXN0ICAgICAgICByMmQsIHIyZCA7IHRvcF9yaWdodAorICAgIGp6IC5maXhfdHJfMQorLmRvX3RvcDoKKyAgICBQUkVENHg0X0xPV1BBU1MgbW00LCBtbTIsIG1tMSwgbW0zLCBtbTUKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tNAorICAgIGptcCAuYm9keQorLmZpeF9sdF8xOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTQKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgcHNsbHEgICAgICAgbW01LCA0OAorICAgIHB4b3IgICAgICAgIG1tMSwgbW01CisgICAgam1wIC5kb19sZWZ0CisuZml4X2x0XzI6CisgICAgbW92cSAgICAgICAgbW01LCBtbTMKKyAgICBweG9yICAgICAgICBtbTUsIG1tMgorICAgIHBzbGxxICAgICAgIG1tNSwgNTYKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgcHhvciAgICAgICAgbW0yLCBtbTUKKyAgICB0ZXN0ICAgICAgICByMmQsIHIyZCA7IHRvcF9yaWdodAorICAgIGpueiAuZG9fdG9wCisuZml4X3RyXzE6CisgICAgbW92cSAgICAgICAgbW01LCBtbTMKKyAgICBweG9yICAgICAgICBtbTUsIG1tMQorICAgIHBzcmxxICAgICAgIG1tNSwgNTYKKyAgICBwc2xscSAgICAgICBtbTUsIDU2CisgICAgcHhvciAgICAgICAgbW0xLCBtbTUKKyAgICBqbXAgLmRvX3RvcAorLmJvZHk6CisgICAgbGVhICAgICAgICAgcjEsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgbW0xLCBtbTcKKyAgICBtb3ZxICAgICAgIG1tNywgbW01CisgICAgbW92cSAgICAgICBtbTUsIG1tNgorICAgIG1vdnEgICAgICAgbW0yLCBtbTcKKyAgICBsZWEgICAgICAgICByMiwgW3IxK3IzKjJdCisgICAgUEFMSUdOUiAgICBtbTIsIG1tNiwgMSwgbW0wCisgICAgbW92cSAgICAgICBtbTMsIG1tNworICAgIFBBTElHTlIgICAgbW0zLCBtbTYsIDcsIG1tMAorICAgIG1vdnEgICAgICAgbW00LCBtbTcKKyAgICBsZWEgICAgICAgICByNCwgW3IyK3IzKjJdCisgICAgcHNybHEgICAgICBtbTQsIDgKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0wLCBtbTEsIG1tMiwgbW01LCBtbTYKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0xLCBtbTMsIG1tNCwgbW03LCBtbTYKKyAgICBtb3ZxIFtyNCtyMyoyXSwgbW0wCisgICAgbW92cSAgICAgICBtbTIsIG1tMQorICAgIHBzcmxxICAgICAgbW0wLCA4CisgICAgcHNsbHEgICAgICBtbTIsIDU2CisgICAgcHNybHEgICAgICBtbTEsIDgKKyAgICBwb3IgICAgICAgIG1tMCwgbW0yCisgICAgbW92cSBbcjQrcjMqMV0sIG1tMAorICAgIG1vdnEgICAgICAgbW0yLCBtbTEKKyAgICBwc3JscSAgICAgIG1tMCwgOAorICAgIHBzbGxxICAgICAgbW0yLCA1NgorICAgIHBzcmxxICAgICAgbW0xLCA4CisgICAgcG9yICAgICAgICBtbTAsIG1tMgorICAgIG1vdnEgW3IyK3IzKjJdLCBtbTAKKyAgICBtb3ZxICAgICAgIG1tMiwgbW0xCisgICAgcHNybHEgICAgICBtbTAsIDgKKyAgICBwc2xscSAgICAgIG1tMiwgNTYKKyAgICBwc3JscSAgICAgIG1tMSwgOAorICAgIHBvciAgICAgICAgbW0wLCBtbTIKKyAgICBtb3ZxIFtyMityMyoxXSwgbW0wCisgICAgbW92cSAgICAgICBtbTIsIG1tMQorICAgIHBzcmxxICAgICAgbW0wLCA4CisgICAgcHNsbHEgICAgICBtbTIsIDU2CisgICAgcHNybHEgICAgICBtbTEsIDgKKyAgICBwb3IgICAgICAgIG1tMCwgbW0yCisgICAgbW92cSBbcjErcjMqMl0sIG1tMAorICAgIG1vdnEgICAgICAgbW0yLCBtbTEKKyAgICBwc3JscSAgICAgIG1tMCwgOAorICAgIHBzbGxxICAgICAgbW0yLCA1NgorICAgIHBzcmxxICAgICAgbW0xLCA4CisgICAgcG9yICAgICAgICBtbTAsIG1tMgorICAgIG1vdnEgW3IxK3IzKjFdLCBtbTAKKyAgICBtb3ZxICAgICAgIG1tMiwgbW0xCisgICAgcHNybHEgICAgICBtbTAsIDgKKyAgICBwc2xscSAgICAgIG1tMiwgNTYKKyAgICBwc3JscSAgICAgIG1tMSwgOAorICAgIHBvciAgICAgICAgbW0wLCBtbTIKKyAgICBtb3ZxIFtyMCtyMyoyXSwgbW0wCisgICAgcHNybHEgICAgICBtbTAsIDgKKyAgICBwc2xscSAgICAgIG1tMSwgNTYKKyAgICBwb3IgICAgICAgIG1tMCwgbW0xCisgICAgbW92cSBbcjArcjMqMV0sIG1tMAorICAgIFJFVAorCislbWFjcm8gUFJFRDh4OExfRE9XTl9SSUdIVCAwCitjZ2xvYmFsIHByZWQ4eDhsX2Rvd25fcmlnaHRfOCwgNCw1CisgICAgc3ViICAgICAgICAgIHIwLCByMworICAgIGxlYSAgICAgICAgICByNCwgW3IwK3IzKjJdCisgICAgbW92cSAgICAgICAgbW0wLCBbcjArcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMCwgW3IwK3IzKjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyNCtyMyoxLThdCisgICAgcHVucGNraGJ3ICAgbW0xLCBbcjArcjMqMi04XQorICAgIG1vdiAgICAgICAgICByNCwgcjAKKyAgICBwdW5wY2tod2QgICBtbTEsIG1tMAorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IzKjRdCisgICAgbW92cSAgICAgICAgbW0yLCBbcjArcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMiwgW3IwK3IzKjAtOF0KKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgIG1tMywgW3IwK3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTMsIFtyMCtyMyowLThdCisgICAgcHVucGNraHdkICAgbW0zLCBtbTIKKyAgICBwdW5wY2toZHEgICBtbTMsIG1tMQorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IzKjJdCisgICAgbW92cSAgICAgICAgbW0wLCBbcjArcjMqMC04XQorICAgIG1vdnEgICAgICAgIG1tMSwgW3I0XQorICAgIG1vdiAgICAgICAgICByMCwgcjQKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMworICAgIG1vdnEgICAgICAgIG1tMiwgbW0zCisgICAgUEFMSUdOUiAgICAgbW00LCBtbTAsIDcsIG1tMAorICAgIFBBTElHTlIgICAgIG1tMSwgbW0yLCAxLCBtbTIKKyAgICB0ZXN0ICAgICAgICByMWQsIHIxZAorICAgIGp6IC5maXhfbHRfMQorICAgIGptcCAuZG9fbGVmdAorLmZpeF9sdF8xOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTQKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgcHNsbHEgICAgICAgbW01LCA0OAorICAgIHB4b3IgICAgICAgIG1tMSwgbW01CisgICAgam1wIC5kb19sZWZ0CisuZml4X2x0XzI6CisgICAgbW92cSAgICAgICAgbW01LCBtbTMKKyAgICBweG9yICAgICAgICBtbTUsIG1tMgorICAgIHBzbGxxICAgICAgIG1tNSwgNTYKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgcHhvciAgICAgICAgbW0yLCBtbTUKKyAgICB0ZXN0ICAgICAgICByMmQsIHIyZAorICAgIGpueiAuZG9fdG9wCisuZml4X3RyXzE6CisgICAgbW92cSAgICAgICAgbW01LCBtbTMKKyAgICBweG9yICAgICAgICBtbTUsIG1tMQorICAgIHBzcmxxICAgICAgIG1tNSwgNTYKKyAgICBwc2xscSAgICAgICBtbTUsIDU2CisgICAgcHhvciAgICAgICAgbW0xLCBtbTUKKyAgICBqbXAgLmRvX3RvcAorLmRvX2xlZnQ6CisgICAgbW92cSAgICAgICAgbW0wLCBtbTQKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0yLCBtbTEsIG1tNCwgbW0zLCBtbTUKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMAorICAgIG1vdnEgICAgICAgIG1tNywgbW0yCisgICAgbW92cTJkcSAgICB4bW0zLCBtbTIKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0xLCBtbTMsIG1tMCwgbW00LCBtbTUKKyAgICBwc2xscSAgICAgICBtbTEsIDU2CisgICAgUEFMSUdOUiAgICAgbW03LCBtbTEsIDcsIG1tMworICAgIG1vdnEyZHEgICAgeG1tMSwgbW03CisgICAgbW92cSAgICAgICAgbW0wLCBbcjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTMsIFtyMF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyMCs4XQorICAgIG1vdnEgICAgICAgIG1tMiwgbW0zCisgICAgbW92cSAgICAgICAgbW00LCBtbTMKKyAgICBQQUxJR05SICAgICBtbTIsIG1tMCwgNywgbW0wCisgICAgUEFMSUdOUiAgICAgbW0xLCBtbTQsIDEsIG1tNAorICAgIHRlc3QgICAgICAgIHIxZCwgcjFkCisgICAganogLmZpeF9sdF8yCisgICAgdGVzdCAgICAgICAgcjJkLCByMmQKKyAgICBqeiAuZml4X3RyXzEKKy5kb190b3A6CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tNCwgbW0yLCBtbTEsIG1tMywgbW01CisgICAgbW92cTJkcSAgIHhtbTQsIG1tNAorICAgIGxlYSAgICAgICAgIHIxLCBbcjArcjMqMl0KKyAgICBtb3ZkcWEgICAgeG1tMCwgeG1tMworICAgIHBzbGxkcSAgICB4bW00LCA4CisgICAgcG9yICAgICAgIHhtbTMsIHhtbTQKKyAgICBsZWEgICAgICAgICByMiwgW3IxK3IzKjJdCisgICAgcHNsbGRxICAgIHhtbTQsIDEKKyAgICBwb3IgICAgICAgeG1tMSwgeG1tNAorICAgIHBzcmxkcSAgICB4bW0wLCA3CisgICAgcHNsbGRxICAgIHhtbTAsIDE1CisgICAgcHNybGRxICAgIHhtbTAsIDcKKyAgICBwb3IgICAgICAgeG1tMSwgeG1tMAorICAgIGxlYSAgICAgICAgIHIwLCBbcjIrcjMqMl0KKyAgICBtb3ZkcWEgICAgeG1tMiwgeG1tMworICAgIHBzcmxkcSAgICB4bW0yLCAxCitJTklUX1hNTSBjcHVuYW1lCisgICAgUFJFRDR4NF9MT1dQQVNTIHhtbTAsIHhtbTEsIHhtbTIsIHhtbTMsIHhtbTQKKyAgICBtb3ZkcWEgICAgeG1tMSwgeG1tMAorICAgIHBzcmxkcSAgICB4bW0xLCAxCisgICAgbW92cSBbcjArcjMqMl0sIHhtbTAKKyAgICBtb3ZxIFtyMCtyMyoxXSwgeG1tMQorICAgIHBzcmxkcSAgICB4bW0wLCAyCisgICAgcHNybGRxICAgIHhtbTEsIDIKKyAgICBtb3ZxIFtyMityMyoyXSwgeG1tMAorICAgIG1vdnEgW3IyK3IzKjFdLCB4bW0xCisgICAgcHNybGRxICAgIHhtbTAsIDIKKyAgICBwc3JsZHEgICAgeG1tMSwgMgorICAgIG1vdnEgW3IxK3IzKjJdLCB4bW0wCisgICAgbW92cSBbcjErcjMqMV0sIHhtbTEKKyAgICBwc3JsZHEgICAgeG1tMCwgMgorICAgIHBzcmxkcSAgICB4bW0xLCAyCisgICAgbW92cSBbcjQrcjMqMl0sIHhtbTAKKyAgICBtb3ZxIFtyNCtyMyoxXSwgeG1tMQorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIHNzZTIKK1BSRUQ4eDhMX0RPV05fUklHSFQKK0lOSVRfTU1YIHNzc2UzCitQUkVEOHg4TF9ET1dOX1JJR0hUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhsX3ZlcnRpY2FsX3JpZ2h0XzgodWludDhfdCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCBwcmVkOHg4bF92ZXJ0aWNhbF9yaWdodF84LCA0LDUKKyAgICBzdWIgICAgICAgICAgcjAsIHIzCisgICAgbGVhICAgICAgICAgIHI0LCBbcjArcjMqMl0KKyAgICBtb3ZxICAgICAgICBtbTAsIFtyMCtyMyoxLThdCisgICAgcHVucGNraGJ3ICAgbW0wLCBbcjArcjMqMC04XQorICAgIG1vdnEgICAgICAgIG1tMSwgW3I0K3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTEsIFtyMCtyMyoyLThdCisgICAgbW92ICAgICAgICAgIHI0LCByMAorICAgIHB1bnBja2h3ZCAgIG1tMSwgbW0wCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjMqNF0KKyAgICBtb3ZxICAgICAgICBtbTIsIFtyMCtyMyoxLThdCisgICAgcHVucGNraGJ3ICAgbW0yLCBbcjArcjMqMC04XQorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IzKjJdCisgICAgbW92cSAgICAgICAgbW0zLCBbcjArcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMywgW3IwK3IzKjAtOF0KKyAgICBwdW5wY2tod2QgICBtbTMsIG1tMgorICAgIHB1bnBja2hkcSAgIG1tMywgbW0xCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjMqMl0KKyAgICBtb3ZxICAgICAgICBtbTAsIFtyMCtyMyowLThdCisgICAgbW92cSAgICAgICAgbW0xLCBbcjRdCisgICAgbW92ICAgICAgICAgIHIwLCByNAorICAgIG1vdnEgICAgICAgIG1tNCwgbW0zCisgICAgbW92cSAgICAgICAgbW0yLCBtbTMKKyAgICBQQUxJR05SICAgICBtbTQsIG1tMCwgNywgbW0wCisgICAgUEFMSUdOUiAgICAgbW0xLCBtbTIsIDEsIG1tMgorICAgIHRlc3QgICAgICAgIHIxZCwgcjFkCisgICAganogLmZpeF9sdF8xCisgICAgam1wIC5kb19sZWZ0CisuZml4X2x0XzE6CisgICAgbW92cSAgICAgICAgbW01LCBtbTMKKyAgICBweG9yICAgICAgICBtbTUsIG1tNAorICAgIHBzcmxxICAgICAgIG1tNSwgNTYKKyAgICBwc2xscSAgICAgICBtbTUsIDQ4CisgICAgcHhvciAgICAgICAgbW0xLCBtbTUKKyAgICBqbXAgLmRvX2xlZnQKKy5maXhfbHRfMjoKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMworICAgIHB4b3IgICAgICAgIG1tNSwgbW0yCisgICAgcHNsbHEgICAgICAgbW01LCA1NgorICAgIHBzcmxxICAgICAgIG1tNSwgNTYKKyAgICBweG9yICAgICAgICBtbTIsIG1tNQorICAgIHRlc3QgICAgICAgIHIyZCwgcjJkCisgICAgam56IC5kb190b3AKKy5maXhfdHJfMToKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMworICAgIHB4b3IgICAgICAgIG1tNSwgbW0xCisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHBzbGxxICAgICAgIG1tNSwgNTYKKyAgICBweG9yICAgICAgICBtbTEsIG1tNQorICAgIGptcCAuZG9fdG9wCisuZG9fbGVmdDoKKyAgICBtb3ZxICAgICAgICBtbTAsIG1tNAorICAgIFBSRUQ0eDRfTE9XUEFTUyBtbTIsIG1tMSwgbW00LCBtbTMsIG1tNQorICAgIG1vdnEgICAgICAgIG1tNywgbW0yCisgICAgbW92cSAgICAgICAgbW0wLCBbcjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTMsIFtyMF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyMCs4XQorICAgIG1vdnEgICAgICAgIG1tMiwgbW0zCisgICAgbW92cSAgICAgICAgbW00LCBtbTMKKyAgICBQQUxJR05SICAgICBtbTIsIG1tMCwgNywgbW0wCisgICAgUEFMSUdOUiAgICAgbW0xLCBtbTQsIDEsIG1tNAorICAgIHRlc3QgICAgICAgIHIxZCwgcjFkCisgICAganogLmZpeF9sdF8yCisgICAgdGVzdCAgICAgICAgcjJkLCByMmQKKyAgICBqeiAuZml4X3RyXzEKKy5kb190b3A6CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tNiwgbW0yLCBtbTEsIG1tMywgbW01CisgICAgbGVhICAgICAgICAgcjEsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgbW0yLCBtbTYKKyAgICBtb3ZxICAgICAgIG1tMywgbW02CisgICAgUEFMSUdOUiAgICBtbTMsIG1tNywgNywgbW0wCisgICAgUEFMSUdOUiAgICBtbTYsIG1tNywgNiwgbW0xCisgICAgbW92cSAgICAgICBtbTQsIG1tMworICAgIHBhdmdiICAgICAgbW0zLCBtbTIKKyAgICBsZWEgICAgICAgICByMiwgW3IxK3IzKjJdCisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMCwgbW02LCBtbTIsIG1tNCwgbW01CisgICAgbW92cSBbcjArcjMqMV0sIG1tMworICAgIG1vdnEgW3IwK3IzKjJdLCBtbTAKKyAgICBtb3ZxICAgICAgIG1tNSwgbW0wCisgICAgbW92cSAgICAgICBtbTYsIG1tMworICAgIG1vdnEgICAgICAgbW0xLCBtbTcKKyAgICBtb3ZxICAgICAgIG1tMiwgbW0xCisgICAgcHNsbHEgICAgICBtbTIsIDgKKyAgICBtb3ZxICAgICAgIG1tMywgbW0xCisgICAgcHNsbHEgICAgICBtbTMsIDE2CisgICAgbGVhICAgICAgICAgcjQsIFtyMityMyoyXQorICAgIFBSRUQ0eDRfTE9XUEFTUyBtbTAsIG1tMSwgbW0zLCBtbTIsIG1tNAorICAgIFBBTElHTlIgICAgbW02LCBtbTAsIDcsIG1tMgorICAgIG1vdnEgW3IxK3IzKjFdLCBtbTYKKyAgICBwc2xscSAgICAgIG1tMCwgOAorICAgIFBBTElHTlIgICAgbW01LCBtbTAsIDcsIG1tMQorICAgIG1vdnEgW3IxK3IzKjJdLCBtbTUKKyAgICBwc2xscSAgICAgIG1tMCwgOAorICAgIFBBTElHTlIgICAgbW02LCBtbTAsIDcsIG1tMgorICAgIG1vdnEgW3IyK3IzKjFdLCBtbTYKKyAgICBwc2xscSAgICAgIG1tMCwgOAorICAgIFBBTElHTlIgICAgbW01LCBtbTAsIDcsIG1tMQorICAgIG1vdnEgW3IyK3IzKjJdLCBtbTUKKyAgICBwc2xscSAgICAgIG1tMCwgOAorICAgIFBBTElHTlIgICAgbW02LCBtbTAsIDcsIG1tMgorICAgIG1vdnEgW3I0K3IzKjFdLCBtbTYKKyAgICBwc2xscSAgICAgIG1tMCwgOAorICAgIFBBTElHTlIgICAgbW01LCBtbTAsIDcsIG1tMQorICAgIG1vdnEgW3I0K3IzKjJdLCBtbTUKKyAgICBSRVQKKworJW1hY3JvIFBSRUQ4eDhMX1ZFUlRJQ0FMX1JJR0hUIDAKK2NnbG9iYWwgcHJlZDh4OGxfdmVydGljYWxfcmlnaHRfOCwgNCw1LDcKKyAgICA7IG1hbnVhbGx5IHNwaWxsIFhNTSByZWdpc3RlcnMgZm9yIFdpbjY0IGJlY2F1c2UKKyAgICA7IHRoZSBjb2RlIGhlcmUgaXMgaW5pdGlhbGl6ZWQgd2l0aCBJTklUX01NWAorICAgIFdJTjY0X1NQSUxMX1hNTSA3CisgICAgc3ViICAgICAgICAgIHIwLCByMworICAgIGxlYSAgICAgICAgICByNCwgW3IwK3IzKjJdCisgICAgbW92cSAgICAgICAgbW0wLCBbcjArcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMCwgW3IwK3IzKjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyNCtyMyoxLThdCisgICAgcHVucGNraGJ3ICAgbW0xLCBbcjArcjMqMi04XQorICAgIG1vdiAgICAgICAgICByNCwgcjAKKyAgICBwdW5wY2tod2QgICBtbTEsIG1tMAorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IzKjRdCisgICAgbW92cSAgICAgICAgbW0yLCBbcjArcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMiwgW3IwK3IzKjAtOF0KKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgIG1tMywgW3IwK3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTMsIFtyMCtyMyowLThdCisgICAgcHVucGNraHdkICAgbW0zLCBtbTIKKyAgICBwdW5wY2toZHEgICBtbTMsIG1tMQorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IzKjJdCisgICAgbW92cSAgICAgICAgbW0wLCBbcjArcjMqMC04XQorICAgIG1vdnEgICAgICAgIG1tMSwgW3I0XQorICAgIG1vdiAgICAgICAgICByMCwgcjQKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMworICAgIG1vdnEgICAgICAgIG1tMiwgbW0zCisgICAgUEFMSUdOUiAgICAgbW00LCBtbTAsIDcsIG1tMAorICAgIFBBTElHTlIgICAgIG1tMSwgbW0yLCAxLCBtbTIKKyAgICB0ZXN0ICAgICAgICByMWQsIHIxZAorICAgIGpueiAuZG9fbGVmdAorLmZpeF9sdF8xOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTQKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgcHNsbHEgICAgICAgbW01LCA0OAorICAgIHB4b3IgICAgICAgIG1tMSwgbW01CisgICAgam1wIC5kb19sZWZ0CisuZml4X2x0XzI6CisgICAgbW92cSAgICAgICAgbW01LCBtbTMKKyAgICBweG9yICAgICAgICBtbTUsIG1tMgorICAgIHBzbGxxICAgICAgIG1tNSwgNTYKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgcHhvciAgICAgICAgbW0yLCBtbTUKKyAgICB0ZXN0ICAgICAgICByMmQsIHIyZAorICAgIGpueiAuZG9fdG9wCisuZml4X3RyXzE6CisgICAgbW92cSAgICAgICAgbW01LCBtbTMKKyAgICBweG9yICAgICAgICBtbTUsIG1tMQorICAgIHBzcmxxICAgICAgIG1tNSwgNTYKKyAgICBwc2xscSAgICAgICBtbTUsIDU2CisgICAgcHhvciAgICAgICAgbW0xLCBtbTUKKyAgICBqbXAgLmRvX3RvcAorLmRvX2xlZnQ6CisgICAgbW92cSAgICAgICAgbW0wLCBtbTQKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0yLCBtbTEsIG1tNCwgbW0zLCBtbTUKKyAgICBtb3ZxMmRxICAgIHhtbTAsIG1tMgorICAgIG1vdnEgICAgICAgIG1tMCwgW3IwLThdCisgICAgbW92cSAgICAgICAgbW0zLCBbcjBdCisgICAgbW92cSAgICAgICAgbW0xLCBbcjArOF0KKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMworICAgIG1vdnEgICAgICAgIG1tNCwgbW0zCisgICAgUEFMSUdOUiAgICAgbW0yLCBtbTAsIDcsIG1tMAorICAgIFBBTElHTlIgICAgIG1tMSwgbW00LCAxLCBtbTQKKyAgICB0ZXN0ICAgICAgICByMWQsIHIxZAorICAgIGp6IC5maXhfbHRfMgorICAgIHRlc3QgICAgICAgIHIyZCwgcjJkCisgICAganogLmZpeF90cl8xCisuZG9fdG9wOgorICAgIFBSRUQ0eDRfTE9XUEFTUyBtbTYsIG1tMiwgbW0xLCBtbTMsIG1tNQorICAgIGxlYSAgICAgICAgICAgcjEsIFtyMCtyMyoyXQorICAgIG1vdnEyZHEgICAgIHhtbTQsIG1tNgorICAgIHBzbGxkcSAgICAgIHhtbTQsIDgKKyAgICBwb3IgICAgICAgICB4bW0wLCB4bW00CisgICAgbW92ZHFhICAgICAgeG1tNiwgW3B3X2ZmMDBdCisgICAgbW92ZHFhICAgICAgeG1tMSwgeG1tMAorICAgIGxlYSAgICAgICAgICAgcjIsIFtyMStyMyoyXQorICAgIG1vdmRxYSAgICAgIHhtbTIsIHhtbTAKKyAgICBtb3ZkcWEgICAgICB4bW0zLCB4bW0wCisgICAgcHNsbGRxICAgICAgeG1tMCwgMQorICAgIHBzbGxkcSAgICAgIHhtbTEsIDIKKyAgICBwYXZnYiAgICAgICB4bW0yLCB4bW0wCitJTklUX1hNTSBjcHVuYW1lCisgICAgUFJFRDR4NF9MT1dQQVNTIHhtbTQsIHhtbTMsIHhtbTEsIHhtbTAsIHhtbTUKKyAgICBwYW5kbiAgICAgICB4bW02LCB4bW00CisgICAgbW92ZHFhICAgICAgeG1tNSwgeG1tNAorICAgIHBzcmx3ICAgICAgIHhtbTQsIDgKKyAgICBwYWNrdXN3YiAgICB4bW02LCB4bW00CisgICAgbW92aGxwcyAgICAgeG1tNCwgeG1tNgorICAgIG1vdmhwcyBbcjArcjMqMl0sIHhtbTUKKyAgICBtb3ZocHMgW3IwK3IzKjFdLCB4bW0yCisgICAgcHNybGRxICAgICAgeG1tNSwgNAorICAgIG1vdnNzICAgICAgIHhtbTUsIHhtbTYKKyAgICBwc3JsZHEgICAgICB4bW0yLCA0CisgICAgbW92c3MgICAgICAgeG1tMiwgeG1tNAorICAgIGxlYSAgICAgICAgICAgcjAsIFtyMityMyoyXQorICAgIHBzcmxkcSAgICAgIHhtbTUsIDEKKyAgICBwc3JsZHEgICAgICB4bW0yLCAxCisgICAgbW92cSAgICAgICAgW3IwK3IzKjJdLCB4bW01CisgICAgbW92cSAgICAgICAgW3IwK3IzKjFdLCB4bW0yCisgICAgcHNybGRxICAgICAgeG1tNSwgMQorICAgIHBzcmxkcSAgICAgIHhtbTIsIDEKKyAgICBtb3ZxICAgICAgICBbcjIrcjMqMl0sIHhtbTUKKyAgICBtb3ZxICAgICAgICBbcjIrcjMqMV0sIHhtbTIKKyAgICBwc3JsZHEgICAgICB4bW01LCAxCisgICAgcHNybGRxICAgICAgeG1tMiwgMQorICAgIG1vdnEgICAgICAgIFtyMStyMyoyXSwgeG1tNQorICAgIG1vdnEgICAgICAgIFtyMStyMyoxXSwgeG1tMgorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIHNzZTIKK1BSRUQ4eDhMX1ZFUlRJQ0FMX1JJR0hUCitJTklUX01NWCBzc3NlMworUFJFRDh4OExfVkVSVElDQUxfUklHSFQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDh4OGxfdmVydGljYWxfbGVmdF84KHVpbnQ4X3QgKnNyYywgaW50IGhhc190b3BsZWZ0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBQUkVEOHg4TF9WRVJUSUNBTF9MRUZUIDAKK2NnbG9iYWwgcHJlZDh4OGxfdmVydGljYWxfbGVmdF84LCA0LDQKKyAgICBzdWIgICAgICAgICAgcjAsIHIzCisgICAgbW92cSAgICAgICAgbW0wLCBbcjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTMsIFtyMF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyMCs4XQorICAgIG1vdnEgICAgICAgIG1tMiwgbW0zCisgICAgbW92cSAgICAgICAgbW00LCBtbTMKKyAgICBQQUxJR05SICAgICBtbTIsIG1tMCwgNywgbW0wCisgICAgUEFMSUdOUiAgICAgbW0xLCBtbTQsIDEsIG1tNAorICAgIHRlc3QgICAgICAgIHIxZCwgcjFkCisgICAganogLmZpeF9sdF8yCisgICAgdGVzdCAgICAgICAgcjJkLCByMmQKKyAgICBqeiAuZml4X3RyXzEKKyAgICBqbXAgLmRvX3RvcAorLmZpeF9sdF8yOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTIKKyAgICBwc2xscSAgICAgICBtbTUsIDU2CisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHB4b3IgICAgICAgIG1tMiwgbW01CisgICAgdGVzdCAgICAgICAgcjJkLCByMmQKKyAgICBqbnogLmRvX3RvcAorLmZpeF90cl8xOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTEKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgcHNsbHEgICAgICAgbW01LCA1NgorICAgIHB4b3IgICAgICAgIG1tMSwgbW01CisgICAgam1wIC5kb190b3AKKy5maXhfdHJfMjoKKyAgICBwdW5wY2toYncgICBtbTMsIG1tMworICAgIHBzaHVmdyAgICAgIG1tMSwgbW0zLCAweEZGCisgICAgam1wIC5kb190b3ByaWdodAorLmRvX3RvcDoKKyAgICBQUkVENHg0X0xPV1BBU1MgbW00LCBtbTIsIG1tMSwgbW0zLCBtbTUKKyAgICBtb3ZxMmRxICAgIHhtbTQsIG1tNAorICAgIHRlc3QgICAgICAgIHIyZCwgcjJkCisgICAganogLmZpeF90cl8yCisgICAgbW92cSAgICAgICAgbW0wLCBbcjArOF0KKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMAorICAgIG1vdnEgICAgICAgIG1tMiwgbW0wCisgICAgbW92cSAgICAgICAgbW00LCBtbTAKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgUEFMSUdOUiAgICAgbW0yLCBtbTMsIDcsIG1tMworICAgIFBBTElHTlIgICAgIG1tNSwgbW00LCAxLCBtbTQKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0xLCBtbTIsIG1tNSwgbW0wLCBtbTQKKy5kb190b3ByaWdodDoKKyAgICBtb3ZxMmRxICAgeG1tMywgbW0xCisgICAgbGVhICAgICAgICAgcjEsIFtyMCtyMyoyXQorICAgIHBzbGxkcSAgICB4bW0zLCA4CisgICAgcG9yICAgICAgIHhtbTQsIHhtbTMKKyAgICBtb3ZkcWEgICAgeG1tMiwgeG1tNAorICAgIG1vdmRxYSAgICB4bW0xLCB4bW00CisgICAgbW92ZHFhICAgIHhtbTMsIHhtbTQKKyAgICBwc3JsZHEgICAgeG1tMiwgMQorICAgIHBzbGxkcSAgICB4bW0xLCAxCisgICAgcGF2Z2IgICAgIHhtbTMsIHhtbTIKKyAgICBsZWEgICAgICAgICByMiwgW3IxK3IzKjJdCitJTklUX1hNTSBjcHVuYW1lCisgICAgUFJFRDR4NF9MT1dQQVNTIHhtbTAsIHhtbTEsIHhtbTIsIHhtbTQsIHhtbTUKKyAgICBwc3JsZHEgICAgeG1tMCwgMQorICAgIG1vdnEgW3IwK3IzKjFdLCB4bW0zCisgICAgbW92cSBbcjArcjMqMl0sIHhtbTAKKyAgICBsZWEgICAgICAgICByMCwgW3IyK3IzKjJdCisgICAgcHNybGRxICAgIHhtbTMsIDEKKyAgICBwc3JsZHEgICAgeG1tMCwgMQorICAgIG1vdnEgW3IxK3IzKjFdLCB4bW0zCisgICAgbW92cSBbcjErcjMqMl0sIHhtbTAKKyAgICBwc3JsZHEgICAgeG1tMywgMQorICAgIHBzcmxkcSAgICB4bW0wLCAxCisgICAgbW92cSBbcjIrcjMqMV0sIHhtbTMKKyAgICBtb3ZxIFtyMityMyoyXSwgeG1tMAorICAgIHBzcmxkcSAgICB4bW0zLCAxCisgICAgcHNybGRxICAgIHhtbTAsIDEKKyAgICBtb3ZxIFtyMCtyMyoxXSwgeG1tMworICAgIG1vdnEgW3IwK3IzKjJdLCB4bW0wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggc3NlMgorUFJFRDh4OExfVkVSVElDQUxfTEVGVAorSU5JVF9NTVggc3NzZTMKK1BSRUQ4eDhMX1ZFUlRJQ0FMX0xFRlQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDh4OGxfaG9yaXpvbnRhbF91cF84KHVpbnQ4X3QgKnNyYywgaW50IGhhc190b3BsZWZ0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBQUkVEOHg4TF9IT1JJWk9OVEFMX1VQIDAKK2NnbG9iYWwgcHJlZDh4OGxfaG9yaXpvbnRhbF91cF84LCA0LDQKKyAgICBzdWIgICAgICAgICAgcjAsIHIzCisgICAgbGVhICAgICAgICAgIHIyLCBbcjArcjMqMl0KKyAgICBtb3ZxICAgICAgICBtbTAsIFtyMCtyMyoxLThdCisgICAgdGVzdCAgICAgICAgcjFkLCByMWQKKyAgICBsZWEgICAgICAgICAgcjEsIFtyMCtyM10KKyAgICBjbW92bnogICAgICAgcjEsIHIwCisgICAgcHVucGNraGJ3ICAgbW0wLCBbcjErcjMqMC04XQorICAgIG1vdnEgICAgICAgIG1tMSwgW3IyK3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTEsIFtyMCtyMyoyLThdCisgICAgbW92ICAgICAgICAgIHIyLCByMAorICAgIHB1bnBja2h3ZCAgIG1tMSwgbW0wCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjMqNF0KKyAgICBtb3ZxICAgICAgICBtbTIsIFtyMCtyMyoxLThdCisgICAgcHVucGNraGJ3ICAgbW0yLCBbcjArcjMqMC04XQorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IzKjJdCisgICAgbW92cSAgICAgICAgbW0zLCBbcjArcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMywgW3IwK3IzKjAtOF0KKyAgICBwdW5wY2tod2QgICBtbTMsIG1tMgorICAgIHB1bnBja2hkcSAgIG1tMywgbW0xCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjMqMl0KKyAgICBtb3ZxICAgICAgICBtbTAsIFtyMCtyMyowLThdCisgICAgbW92cSAgICAgICAgbW0xLCBbcjErcjMqMC04XQorICAgIG1vdiAgICAgICAgICByMCwgcjIKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMworICAgIG1vdnEgICAgICAgIG1tMiwgbW0zCisgICAgUEFMSUdOUiAgICAgbW00LCBtbTAsIDcsIG1tMAorICAgIFBBTElHTlIgICAgIG1tMSwgbW0yLCAxLCBtbTIKKyAgICBtb3ZxICAgICAgIG1tMCwgbW00CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMiwgbW0xLCBtbTQsIG1tMywgbW01CisgICAgbW92cSAgICAgICBtbTQsIG1tMAorICAgIG1vdnEgICAgICAgbW03LCBtbTIKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0xLCBtbTMsIG1tMCwgbW00LCBtbTUKKyAgICBwc2xscSAgICAgIG1tMSwgNTYKKyAgICBQQUxJR05SICAgIG1tNywgbW0xLCA3LCBtbTMKKyAgICBsZWEgICAgICAgICByMSwgW3IwK3IzKjJdCisgICAgcHNodWZ3ICAgICBtbTAsIG1tNywgMDAwMTEwMTFiIDsgbDYgbDcgbDQgbDUgbDIgbDMgbDAgbDEKKyAgICBwc2xscSAgICAgIG1tNywgNTYgICAgICAgICAgICAgOyBsNyAuLiAuLiAuLiAuLiAuLiAuLiAuLgorICAgIG1vdnEgICAgICAgbW0yLCBtbTAKKyAgICBwc2xsdyAgICAgIG1tMCwgOAorICAgIHBzcmx3ICAgICAgbW0yLCA4CisgICAgcG9yICAgICAgICBtbTIsIG1tMCAgICAgICAgICAgIDsgbDcgbDYgbDUgbDQgbDMgbDIgbDEgbDAKKyAgICBtb3ZxICAgICAgIG1tMywgbW0yCisgICAgbW92cSAgICAgICBtbTQsIG1tMgorICAgIG1vdnEgICAgICAgbW01LCBtbTIKKyAgICBwc3JscSAgICAgIG1tMiwgOAorICAgIHBzcmxxICAgICAgbW0zLCAxNgorICAgIGxlYSAgICAgICAgIHIyLCBbcjErcjMqMl0KKyAgICBwb3IgICAgICAgIG1tMiwgbW03ICAgICAgICAgICAgOyBsNyBsNyBsNiBsNSBsNCBsMyBsMiBsMQorICAgIHB1bnBja2hidyAgbW03LCBtbTcKKyAgICBwb3IgICAgICAgIG1tMywgbW03ICAgICAgICAgICAgOyBsNyBsNyBsNyBsNiBsNSBsNCBsMyBsMgorICAgIHBhdmdiICAgICAgbW00LCBtbTIKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0xLCBtbTMsIG1tNSwgbW0yLCBtbTYKKyAgICBtb3ZxICAgICAgIG1tNSwgbW00CisgICAgcHVucGNrbGJ3ICBtbTQsIG1tMSAgICAgICAgICAgIDsgcDQgcDMgcDIgcDEKKyAgICBwdW5wY2toYncgIG1tNSwgbW0xICAgICAgICAgICAgOyBwOCBwNyBwNiBwNQorICAgIG1vdnEgICAgICAgbW02LCBtbTUKKyAgICBtb3ZxICAgICAgIG1tNywgbW01CisgICAgbW92cSAgICAgICBtbTAsIG1tNQorICAgIFBBTElHTlIgICAgbW01LCBtbTQsIDIsIG1tMQorICAgIHBzaHVmdyAgICAgbW0xLCBtbTYsIDExMTExMDAxYgorICAgIFBBTElHTlIgICAgbW02LCBtbTQsIDQsIG1tMgorICAgIHBzaHVmdyAgICAgbW0yLCBtbTcsIDExMTExMTEwYgorICAgIFBBTElHTlIgICAgbW03LCBtbTQsIDYsIG1tMworICAgIHBzaHVmdyAgICAgbW0zLCBtbTAsIDExMTExMTExYgorICAgIG1vdnEgW3IwK3IzKjFdLCBtbTQKKyAgICBtb3ZxIFtyMCtyMyoyXSwgbW01CisgICAgbGVhICAgICAgICAgcjAsIFtyMityMyoyXQorICAgIG1vdnEgW3IxK3IzKjFdLCBtbTYKKyAgICBtb3ZxIFtyMStyMyoyXSwgbW03CisgICAgbW92cSBbcjIrcjMqMV0sIG1tMAorICAgIG1vdnEgW3IyK3IzKjJdLCBtbTEKKyAgICBtb3ZxIFtyMCtyMyoxXSwgbW0yCisgICAgbW92cSBbcjArcjMqMl0sIG1tMworICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUFJFRDh4OExfSE9SSVpPTlRBTF9VUAorSU5JVF9NTVggc3NzZTMKK1BSRUQ4eDhMX0hPUklaT05UQUxfVVAKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDh4OGxfaG9yaXpvbnRhbF9kb3duXzgodWludDhfdCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgcHJlZDh4OGxfaG9yaXpvbnRhbF9kb3duXzgsIDQsNQorICAgIHN1YiAgICAgICAgICByMCwgcjMKKyAgICBsZWEgICAgICAgICAgcjQsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgIG1tMCwgW3IwK3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTAsIFtyMCtyMyowLThdCisgICAgbW92cSAgICAgICAgbW0xLCBbcjQrcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMSwgW3IwK3IzKjItOF0KKyAgICBtb3YgICAgICAgICAgcjQsIHIwCisgICAgcHVucGNraHdkICAgbW0xLCBtbTAKKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMyo0XQorICAgIG1vdnEgICAgICAgIG1tMiwgW3IwK3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTIsIFtyMCtyMyowLThdCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjMqMl0KKyAgICBtb3ZxICAgICAgICBtbTMsIFtyMCtyMyoxLThdCisgICAgcHVucGNraGJ3ICAgbW0zLCBbcjArcjMqMC04XQorICAgIHB1bnBja2h3ZCAgIG1tMywgbW0yCisgICAgcHVucGNraGRxICAgbW0zLCBtbTEKKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgIG1tMCwgW3IwK3IzKjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyNF0KKyAgICBtb3YgICAgICAgICAgcjAsIHI0CisgICAgbW92cSAgICAgICAgbW00LCBtbTMKKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMworICAgIFBBTElHTlIgICAgIG1tNCwgbW0wLCA3LCBtbTAKKyAgICBQQUxJR05SICAgICBtbTEsIG1tMiwgMSwgbW0yCisgICAgdGVzdCAgICAgICAgcjFkLCByMWQKKyAgICBqbnogLmRvX2xlZnQKKy5maXhfbHRfMToKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMworICAgIHB4b3IgICAgICAgIG1tNSwgbW00CisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHBzbGxxICAgICAgIG1tNSwgNDgKKyAgICBweG9yICAgICAgICBtbTEsIG1tNQorICAgIGptcCAuZG9fbGVmdAorLmZpeF9sdF8yOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTIKKyAgICBwc2xscSAgICAgICBtbTUsIDU2CisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHB4b3IgICAgICAgIG1tMiwgbW01CisgICAgdGVzdCAgICAgICAgcjJkLCByMmQKKyAgICBqbnogLmRvX3RvcAorLmZpeF90cl8xOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTEKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgcHNsbHEgICAgICAgbW01LCA1NgorICAgIHB4b3IgICAgICAgIG1tMSwgbW01CisgICAgam1wIC5kb190b3AKKy5kb19sZWZ0OgorICAgIG1vdnEgICAgICAgIG1tMCwgbW00CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMiwgbW0xLCBtbTQsIG1tMywgbW01CisgICAgbW92cSAgICAgICAgbW00LCBtbTAKKyAgICBtb3ZxICAgICAgICBtbTcsIG1tMgorICAgIG1vdnEgICAgICAgIG1tNiwgbW0yCisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMSwgbW0zLCBtbTAsIG1tNCwgbW01CisgICAgcHNsbHEgICAgICAgbW0xLCA1NgorICAgIFBBTElHTlIgICAgIG1tNywgbW0xLCA3LCBtbTMKKyAgICBtb3ZxICAgICAgICBtbTAsIFtyMC04XQorICAgIG1vdnEgICAgICAgIG1tMywgW3IwXQorICAgIG1vdnEgICAgICAgIG1tMSwgW3IwKzhdCisgICAgbW92cSAgICAgICAgbW0yLCBtbTMKKyAgICBtb3ZxICAgICAgICBtbTQsIG1tMworICAgIFBBTElHTlIgICAgIG1tMiwgbW0wLCA3LCBtbTAKKyAgICBQQUxJR05SICAgICBtbTEsIG1tNCwgMSwgbW00CisgICAgdGVzdCAgICAgICAgcjFkLCByMWQKKyAgICBqeiAuZml4X2x0XzIKKyAgICB0ZXN0ICAgICAgICByMmQsIHIyZAorICAgIGp6IC5maXhfdHJfMQorLmRvX3RvcDoKKyAgICBQUkVENHg0X0xPV1BBU1MgbW00LCBtbTIsIG1tMSwgbW0zLCBtbTUKKyAgICBtb3ZxICAgICAgIG1tNSwgbW00CisgICAgbGVhICAgICAgICAgcjEsIFtyMCtyMyoyXQorICAgIHBzbGxxICAgICAgbW03LCA1NgorICAgIG1vdnEgICAgICAgbW0yLCBtbTUKKyAgICBtb3ZxICAgICAgIG1tMywgbW02CisgICAgbW92cSAgICAgICBtbTQsIG1tMgorICAgIFBBTElHTlIgICAgbW0yLCBtbTYsIDcsIG1tNQorICAgIFBBTElHTlIgICAgbW02LCBtbTcsIDcsIG1tMAorICAgIGxlYSAgICAgICAgIHIyLCBbcjErcjMqMl0KKyAgICBQQUxJR05SICAgIG1tNCwgbW0zLCAxLCBtbTcKKyAgICBtb3ZxICAgICAgIG1tNSwgbW0zCisgICAgcGF2Z2IgICAgICBtbTMsIG1tNgorICAgIFBSRUQ0eDRfTE9XUEFTUyBtbTAsIG1tNCwgbW02LCBtbTUsIG1tNworICAgIG1vdnEgICAgICAgbW00LCBtbTIKKyAgICBtb3ZxICAgICAgIG1tMSwgbW0yCisgICAgbGVhICAgICAgICAgcjQsIFtyMityMyoyXQorICAgIHBzcmxxICAgICAgbW00LCAxNgorICAgIHBzcmxxICAgICAgbW0xLCA4CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tNiwgbW00LCBtbTIsIG1tMSwgbW01CisgICAgbW92cSAgICAgICBtbTcsIG1tMworICAgIHB1bnBja2xidyAgbW0zLCBtbTAKKyAgICBwdW5wY2toYncgIG1tNywgbW0wCisgICAgbW92cSAgICAgICBtbTEsIG1tNworICAgIG1vdnEgICAgICAgbW0wLCBtbTcKKyAgICBtb3ZxICAgICAgIG1tNCwgbW03CisgICAgbW92cSBbcjQrcjMqMl0sIG1tMworICAgIFBBTElHTlIgICAgbW03LCBtbTMsIDIsIG1tNQorICAgIG1vdnEgW3I0K3IzKjFdLCBtbTcKKyAgICBQQUxJR05SICAgIG1tMSwgbW0zLCA0LCBtbTUKKyAgICBtb3ZxIFtyMityMyoyXSwgbW0xCisgICAgUEFMSUdOUiAgICBtbTAsIG1tMywgNiwgbW0zCisgICAgbW92cSBbcjIrcjMqMV0sIG1tMAorICAgIG1vdnEgICAgICAgbW0yLCBtbTYKKyAgICBtb3ZxICAgICAgIG1tMywgbW02CisgICAgbW92cSBbcjErcjMqMl0sIG1tNAorICAgIFBBTElHTlIgICAgbW02LCBtbTQsIDIsIG1tNQorICAgIG1vdnEgW3IxK3IzKjFdLCBtbTYKKyAgICBQQUxJR05SICAgIG1tMiwgbW00LCA0LCBtbTUKKyAgICBtb3ZxIFtyMCtyMyoyXSwgbW0yCisgICAgUEFMSUdOUiAgICBtbTMsIG1tNCwgNiwgbW00CisgICAgbW92cSBbcjArcjMqMV0sIG1tMworICAgIFJFVAorCislbWFjcm8gUFJFRDh4OExfSE9SSVpPTlRBTF9ET1dOIDAKK2NnbG9iYWwgcHJlZDh4OGxfaG9yaXpvbnRhbF9kb3duXzgsIDQsNQorICAgIHN1YiAgICAgICAgICByMCwgcjMKKyAgICBsZWEgICAgICAgICAgcjQsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgIG1tMCwgW3IwK3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTAsIFtyMCtyMyowLThdCisgICAgbW92cSAgICAgICAgbW0xLCBbcjQrcjMqMS04XQorICAgIHB1bnBja2hidyAgIG1tMSwgW3IwK3IzKjItOF0KKyAgICBtb3YgICAgICAgICAgcjQsIHIwCisgICAgcHVucGNraHdkICAgbW0xLCBtbTAKKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMyo0XQorICAgIG1vdnEgICAgICAgIG1tMiwgW3IwK3IzKjEtOF0KKyAgICBwdW5wY2toYncgICBtbTIsIFtyMCtyMyowLThdCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjMqMl0KKyAgICBtb3ZxICAgICAgICBtbTMsIFtyMCtyMyoxLThdCisgICAgcHVucGNraGJ3ICAgbW0zLCBbcjArcjMqMC04XQorICAgIHB1bnBja2h3ZCAgIG1tMywgbW0yCisgICAgcHVucGNraGRxICAgbW0zLCBtbTEKKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMyoyXQorICAgIG1vdnEgICAgICAgIG1tMCwgW3IwK3IzKjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyNF0KKyAgICBtb3YgICAgICAgICAgcjAsIHI0CisgICAgbW92cSAgICAgICAgbW00LCBtbTMKKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMworICAgIFBBTElHTlIgICAgIG1tNCwgbW0wLCA3LCBtbTAKKyAgICBQQUxJR05SICAgICBtbTEsIG1tMiwgMSwgbW0yCisgICAgdGVzdCAgICAgICAgcjFkLCByMWQKKyAgICBqbnogLmRvX2xlZnQKKy5maXhfbHRfMToKKyAgICBtb3ZxICAgICAgICBtbTUsIG1tMworICAgIHB4b3IgICAgICAgIG1tNSwgbW00CisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHBzbGxxICAgICAgIG1tNSwgNDgKKyAgICBweG9yICAgICAgICBtbTEsIG1tNQorICAgIGptcCAuZG9fbGVmdAorLmZpeF9sdF8yOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTIKKyAgICBwc2xscSAgICAgICBtbTUsIDU2CisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIHB4b3IgICAgICAgIG1tMiwgbW01CisgICAgdGVzdCAgICAgICAgcjJkLCByMmQKKyAgICBqbnogLmRvX3RvcAorLmZpeF90cl8xOgorICAgIG1vdnEgICAgICAgIG1tNSwgbW0zCisgICAgcHhvciAgICAgICAgbW01LCBtbTEKKyAgICBwc3JscSAgICAgICBtbTUsIDU2CisgICAgcHNsbHEgICAgICAgbW01LCA1NgorICAgIHB4b3IgICAgICAgIG1tMSwgbW01CisgICAgam1wIC5kb190b3AKKy5maXhfdHJfMjoKKyAgICBwdW5wY2toYncgICBtbTMsIG1tMworICAgIHBzaHVmdyAgICAgIG1tMSwgbW0zLCAweEZGCisgICAgam1wIC5kb190b3ByaWdodAorLmRvX2xlZnQ6CisgICAgbW92cSAgICAgICAgbW0wLCBtbTQKKyAgICBQUkVENHg0X0xPV1BBU1MgbW0yLCBtbTEsIG1tNCwgbW0zLCBtbTUKKyAgICBtb3ZxMmRxICAgIHhtbTAsIG1tMgorICAgIHBzbGxkcSAgICAgeG1tMCwgOAorICAgIG1vdnEgICAgICAgIG1tNCwgbW0wCisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMSwgbW0zLCBtbTAsIG1tNCwgbW01CisgICAgbW92cTJkcSAgICB4bW0yLCBtbTEKKyAgICBwc2xsZHEgICAgIHhtbTIsIDE1CisgICAgcHNybGRxICAgICB4bW0yLCA4CisgICAgcG9yICAgICAgICB4bW0wLCB4bW0yCisgICAgbW92cSAgICAgICAgbW0wLCBbcjAtOF0KKyAgICBtb3ZxICAgICAgICBtbTMsIFtyMF0KKyAgICBtb3ZxICAgICAgICBtbTEsIFtyMCs4XQorICAgIG1vdnEgICAgICAgIG1tMiwgbW0zCisgICAgbW92cSAgICAgICAgbW00LCBtbTMKKyAgICBQQUxJR05SICAgICBtbTIsIG1tMCwgNywgbW0wCisgICAgUEFMSUdOUiAgICAgbW0xLCBtbTQsIDEsIG1tNAorICAgIHRlc3QgICAgICAgIHIxZCwgcjFkCisgICAganogLmZpeF9sdF8yCisgICAgdGVzdCAgICAgICAgcjJkLCByMmQKKyAgICBqeiAuZml4X3RyXzEKKy5kb190b3A6CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tNCwgbW0yLCBtbTEsIG1tMywgbW01CisgICAgbW92cTJkcSAgICB4bW0xLCBtbTQKKyAgICB0ZXN0ICAgICAgICByMmQsIHIyZAorICAgIGp6IC5maXhfdHJfMgorICAgIG1vdnEgICAgICAgIG1tMCwgW3IwKzhdCisgICAgbW92cSAgICAgICAgbW01LCBtbTAKKyAgICBtb3ZxICAgICAgICBtbTIsIG1tMAorICAgIG1vdnEgICAgICAgIG1tNCwgbW0wCisgICAgcHNybHEgICAgICAgbW01LCA1NgorICAgIFBBTElHTlIgICAgIG1tMiwgbW0zLCA3LCBtbTMKKyAgICBQQUxJR05SICAgICBtbTUsIG1tNCwgMSwgbW00CisgICAgUFJFRDR4NF9MT1dQQVNTIG1tMSwgbW0yLCBtbTUsIG1tMCwgbW00CisuZG9fdG9wcmlnaHQ6CisgICAgbW92cTJkcSAgICB4bW01LCBtbTEKKyAgICBwc2xsZHEgICAgIHhtbTUsIDgKKyAgICBwb3IgICAgICAgIHhtbTEsIHhtbTUKK0lOSVRfWE1NIGNwdW5hbWUKKyAgICBsZWEgICAgICAgICByMiwgW3I0K3IzKjJdCisgICAgbW92ZHFhICAgIHhtbTIsIHhtbTEKKyAgICBtb3ZkcWEgICAgeG1tMywgeG1tMQorICAgIFBBTElHTlIgICB4bW0xLCB4bW0wLCA3LCB4bW00CisgICAgUEFMSUdOUiAgIHhtbTIsIHhtbTAsIDksIHhtbTUKKyAgICBsZWEgICAgICAgICByMSwgW3IyK3IzKjJdCisgICAgUEFMSUdOUiAgIHhtbTMsIHhtbTAsIDgsIHhtbTAKKyAgICBtb3ZkcWEgICAgeG1tNCwgeG1tMQorICAgIHBhdmdiICAgICB4bW00LCB4bW0zCisgICAgbGVhICAgICAgICAgcjAsIFtyMStyMyoyXQorICAgIFBSRUQ0eDRfTE9XUEFTUyB4bW0wLCB4bW0xLCB4bW0yLCB4bW0zLCB4bW01CisgICAgcHVucGNrbGJ3IHhtbTQsIHhtbTAKKyAgICBtb3ZobHBzICAgeG1tMCwgeG1tNAorICAgIG1vdnEgICBbcjArcjMqMl0sIHhtbTQKKyAgICBtb3ZxICAgW3IyK3IzKjJdLCB4bW0wCisgICAgcHNybGRxIHhtbTQsIDIKKyAgICBwc3JsZHEgeG1tMCwgMgorICAgIG1vdnEgICBbcjArcjMqMV0sIHhtbTQKKyAgICBtb3ZxICAgW3IyK3IzKjFdLCB4bW0wCisgICAgcHNybGRxIHhtbTQsIDIKKyAgICBwc3JsZHEgeG1tMCwgMgorICAgIG1vdnEgICBbcjErcjMqMl0sIHhtbTQKKyAgICBtb3ZxICAgW3I0K3IzKjJdLCB4bW0wCisgICAgcHNybGRxIHhtbTQsIDIKKyAgICBwc3JsZHEgeG1tMCwgMgorICAgIG1vdnEgICBbcjErcjMqMV0sIHhtbTQKKyAgICBtb3ZxICAgW3I0K3IzKjFdLCB4bW0wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggc3NlMgorUFJFRDh4OExfSE9SSVpPTlRBTF9ET1dOCitJTklUX01NWCBzc3NlMworUFJFRDh4OExfSE9SSVpPTlRBTF9ET1dOCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDR4NF9kY184X21teGV4dCh1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIHByZWQ0eDRfZGNfOCwgMyw1CisgICAgcHhvciAgIG1tNywgbW03CisgICAgbW92ICAgICByNCwgcjAKKyAgICBzdWIgICAgIHIwLCByMgorICAgIG1vdmQgICBtbTAsIFtyMF0KKyAgICBwc2FkYncgbW0wLCBtbTcKKyAgICBtb3Z6eCAgcjFkLCBieXRlIFtyMCtyMioxLTFdCisgICAgbW92ZCAgIHIzZCwgbW0wCisgICAgYWRkICAgIHIzZCwgcjFkCisgICAgbW92enggIHIxZCwgYnl0ZSBbcjArcjIqMi0xXQorICAgIGxlYSAgICAgcjAsIFtyMCtyMioyXQorICAgIGFkZCAgICByM2QsIHIxZAorICAgIG1vdnp4ICByMWQsIGJ5dGUgW3IwK3IyKjEtMV0KKyAgICBhZGQgICAgcjNkLCByMWQKKyAgICBtb3Z6eCAgcjFkLCBieXRlIFtyMCtyMioyLTFdCisgICAgYWRkICAgIHIzZCwgcjFkCisgICAgYWRkICAgIHIzZCwgNAorICAgIHNociAgICByM2QsIDMKKyAgICBpbXVsICAgcjNkLCAweDAxMDEwMTAxCisgICAgbW92ICAgW3I0K3IyKjBdLCByM2QKKyAgICBtb3YgICBbcjArcjIqMF0sIHIzZAorICAgIG1vdiAgIFtyMCtyMioxXSwgcjNkCisgICAgbW92ICAgW3IwK3IyKjJdLCByM2QKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDR4NF90bV92cDhfOF9tbXhleHQodWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp0b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBQUkVENHg0X1RNIDAKK2NnbG9iYWwgcHJlZDR4NF90bV92cDhfOCwgMyw2CisgICAgc3ViICAgICAgICByMCwgcjIKKyAgICBweG9yICAgICAgbW03LCBtbTcKKyAgICBtb3ZkICAgICAgbW0wLCBbcjBdCisgICAgcHVucGNrbGJ3IG1tMCwgbW03CisgICAgbW92enggICAgIHI0ZCwgYnl0ZSBbcjAtMV0KKyAgICBtb3YgICAgICAgcjVkLCAyCisubG9vcDoKKyAgICBtb3Z6eCAgICAgcjFkLCBieXRlIFtyMCtyMioxLTFdCisgICAgbW92enggICAgIHIzZCwgYnl0ZSBbcjArcjIqMi0xXQorICAgIHN1YiAgICAgICByMWQsIHI0ZAorICAgIHN1YiAgICAgICByM2QsIHI0ZAorICAgIG1vdmQgICAgICBtbTIsIHIxZAorICAgIG1vdmQgICAgICBtbTQsIHIzZAorJWlmIGNwdWZsYWcobW14ZXh0KQorICAgIHBzaHVmdyAgICBtbTIsIG1tMiwgMAorICAgIHBzaHVmdyAgICBtbTQsIG1tNCwgMAorJWVsc2UKKyAgICBwdW5wY2tsd2QgbW0yLCBtbTIKKyAgICBwdW5wY2tsd2QgbW00LCBtbTQKKyAgICBwdW5wY2tsZHEgbW0yLCBtbTIKKyAgICBwdW5wY2tsZHEgbW00LCBtbTQKKyVlbmRpZgorICAgIHBhZGR3ICAgICBtbTIsIG1tMAorICAgIHBhZGR3ICAgICBtbTQsIG1tMAorICAgIHBhY2t1c3diICBtbTIsIG1tMgorICAgIHBhY2t1c3diICBtbTQsIG1tNAorICAgIG1vdmQgW3IwK3IyKjFdLCBtbTIKKyAgICBtb3ZkIFtyMCtyMioyXSwgbW00CisgICAgbGVhICAgICAgICByMCwgW3IwK3IyKjJdCisgICAgZGVjICAgICAgIHI1ZAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teAorUFJFRDR4NF9UTQorSU5JVF9NTVggbW14ZXh0CitQUkVENHg0X1RNCisKK0lOSVRfWE1NIHNzc2UzCitjZ2xvYmFsIHByZWQ0eDRfdG1fdnA4XzgsIDMsMworICAgIHN1YiAgICAgICAgIHIwLCByMgorICAgIG1vdnEgICAgICAgbW02LCBbdG1fc2h1Zl0KKyAgICBweG9yICAgICAgIG1tMSwgbW0xCisgICAgbW92ZCAgICAgICBtbTAsIFtyMF0KKyAgICBwdW5wY2tsYncgIG1tMCwgbW0xCisgICAgbW92ZCAgICAgICBtbTcsIFtyMC00XQorICAgIHBzaHVmYiAgICAgbW03LCBtbTYKKyAgICBsZWEgICAgICAgICByMSwgW3IwK3IyKjJdCisgICAgbW92ZCAgICAgICBtbTIsIFtyMCtyMioxLTRdCisgICAgbW92ZCAgICAgICBtbTMsIFtyMCtyMioyLTRdCisgICAgbW92ZCAgICAgICBtbTQsIFtyMStyMioxLTRdCisgICAgbW92ZCAgICAgICBtbTUsIFtyMStyMioyLTRdCisgICAgcHNodWZiICAgICBtbTIsIG1tNgorICAgIHBzaHVmYiAgICAgbW0zLCBtbTYKKyAgICBwc2h1ZmIgICAgIG1tNCwgbW02CisgICAgcHNodWZiICAgICBtbTUsIG1tNgorICAgIHBzdWJ3ICAgICAgbW0wLCBtbTcKKyAgICBwYWRkdyAgICAgIG1tMiwgbW0wCisgICAgcGFkZHcgICAgICBtbTMsIG1tMAorICAgIHBhZGR3ICAgICAgbW00LCBtbTAKKyAgICBwYWRkdyAgICAgIG1tNSwgbW0wCisgICAgcGFja3Vzd2IgICBtbTIsIG1tMgorICAgIHBhY2t1c3diICAgbW0zLCBtbTMKKyAgICBwYWNrdXN3YiAgIG1tNCwgbW00CisgICAgcGFja3Vzd2IgICBtbTUsIG1tNQorICAgIG1vdmQgW3IwK3IyKjFdLCBtbTIKKyAgICBtb3ZkIFtyMCtyMioyXSwgbW0zCisgICAgbW92ZCBbcjErcjIqMV0sIG1tNAorICAgIG1vdmQgW3IxK3IyKjJdLCBtbTUKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDR4NF92ZXJ0aWNhbF92cDhfOF9tbXhleHQodWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp0b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCBwcmVkNHg0X3ZlcnRpY2FsX3ZwOF84LCAzLDMKKyAgICBzdWIgICAgICAgcjAsIHIyCisgICAgbW92ZCAgICAgIG0xLCBbcjAtMV0KKyAgICBtb3ZkICAgICAgbTAsIFtyMF0KKyAgICBtb3ZhICAgICAgbTIsIG0wICAgO3QwIHQxIHQyIHQzCisgICAgcHVucGNrbGRxIG0wLCBbcjFdIDt0MCB0MSB0MiB0MyB0NCB0NSB0NiB0NworICAgIGxlYSAgICAgICByMSwgW3IwK3IyKjJdCisgICAgcHNybHEgICAgIG0wLCA4ICAgIDt0MSB0MiB0MyB0NAorICAgIFBSRUQ0eDRfTE9XUEFTUyBtMywgbTEsIG0wLCBtMiwgbTQKKyAgICBtb3ZkIFtyMCtyMioxXSwgbTMKKyAgICBtb3ZkIFtyMCtyMioyXSwgbTMKKyAgICBtb3ZkIFtyMStyMioxXSwgbTMKKyAgICBtb3ZkIFtyMStyMioyXSwgbTMKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDR4NF9kb3duX2xlZnRfOF9tbXhleHQodWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp0b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgcHJlZDR4NF9kb3duX2xlZnRfOCwgMywzCisgICAgc3ViICAgICAgIHIwLCByMgorICAgIG1vdnEgICAgICBtMSwgW3IwXQorICAgIHB1bnBja2xkcSBtMSwgW3IxXQorICAgIG1vdnEgICAgICBtMiwgbTEKKyAgICBtb3ZxICAgICAgbTMsIG0xCisgICAgcHNsbHEgICAgIG0xLCA4CisgICAgcHhvciAgICAgIG0yLCBtMQorICAgIHBzcmxxICAgICBtMiwgOAorICAgIHB4b3IgICAgICBtMiwgbTMKKyAgICBQUkVENHg0X0xPV1BBU1MgbTAsIG0xLCBtMiwgbTMsIG00CisgICAgbGVhICAgICAgIHIxLCBbcjArcjIqMl0KKyAgICBwc3JscSAgICAgbTAsIDgKKyAgICBtb3ZkICAgICAgW3IwK3IyKjFdLCBtMAorICAgIHBzcmxxICAgICBtMCwgOAorICAgIG1vdmQgICAgICBbcjArcjIqMl0sIG0wCisgICAgcHNybHEgICAgIG0wLCA4CisgICAgbW92ZCAgICAgIFtyMStyMioxXSwgbTAKKyAgICBwc3JscSAgICAgbTAsIDgKKyAgICBtb3ZkICAgICAgW3IxK3IyKjJdLCBtMAorICAgIFJFVAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDR4NF92ZXJ0aWNhbF9sZWZ0XzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCBwcmVkNHg0X3ZlcnRpY2FsX2xlZnRfOCwgMywzCisgICAgc3ViICAgICAgIHIwLCByMgorICAgIG1vdnEgICAgICBtMSwgW3IwXQorICAgIHB1bnBja2xkcSBtMSwgW3IxXQorICAgIG1vdnEgICAgICBtMywgbTEKKyAgICBtb3ZxICAgICAgbTIsIG0xCisgICAgcHNybHEgICAgIG0zLCA4CisgICAgcHNybHEgICAgIG0yLCAxNgorICAgIG1vdnEgICAgICBtNCwgbTMKKyAgICBwYXZnYiAgICAgbTQsIG0xCisgICAgUFJFRDR4NF9MT1dQQVNTIG0wLCBtMSwgbTIsIG0zLCBtNQorICAgIGxlYSAgICAgICByMSwgW3IwK3IyKjJdCisgICAgbW92aCAgICAgIFtyMCtyMioxXSwgbTQKKyAgICBtb3ZoICAgICAgW3IwK3IyKjJdLCBtMAorICAgIHBzcmxxICAgICBtNCwgOAorICAgIHBzcmxxICAgICBtMCwgOAorICAgIG1vdmggICAgICBbcjErcjIqMV0sIG00CisgICAgbW92aCAgICAgIFtyMStyMioyXSwgbTAKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ0eDRfaG9yaXpvbnRhbF91cF84X21teGV4dCh1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgcHJlZDR4NF9ob3Jpem9udGFsX3VwXzgsIDMsMworICAgIHN1YiAgICAgICByMCwgcjIKKyAgICBsZWEgICAgICAgcjEsIFtyMCtyMioyXQorICAgIG1vdmQgICAgICBtMCwgW3IwK3IyKjEtNF0KKyAgICBwdW5wY2tsYncgbTAsIFtyMCtyMioyLTRdCisgICAgbW92ZCAgICAgIG0xLCBbcjErcjIqMS00XQorICAgIHB1bnBja2xidyBtMSwgW3IxK3IyKjItNF0KKyAgICBwdW5wY2tod2QgbTAsIG0xCisgICAgbW92cSAgICAgIG0xLCBtMAorICAgIHB1bnBja2hidyBtMSwgbTEKKyAgICBwc2h1ZncgICAgbTEsIG0xLCAweEZGCisgICAgcHVucGNraGRxIG0wLCBtMQorICAgIG1vdnEgICAgICBtMiwgbTAKKyAgICBtb3ZxICAgICAgbTMsIG0wCisgICAgbW92cSAgICAgIG03LCBtMAorICAgIHBzcmxxICAgICBtMiwgMTYKKyAgICBwc3JscSAgICAgbTMsIDgKKyAgICBwYXZnYiAgICAgbTcsIG0zCisgICAgUFJFRDR4NF9MT1dQQVNTIG00LCBtMCwgbTIsIG0zLCBtNQorICAgIHB1bnBja2xidyBtNywgbTQKKyAgICBtb3ZkICAgIFtyMCtyMioxXSwgbTcKKyAgICBwc3JscSAgICBtNywgMTYKKyAgICBtb3ZkICAgIFtyMCtyMioyXSwgbTcKKyAgICBwc3JscSAgICBtNywgMTYKKyAgICBtb3ZkICAgIFtyMStyMioxXSwgbTcKKyAgICBtb3ZkICAgIFtyMStyMioyXSwgbTEKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ0eDRfaG9yaXpvbnRhbF9kb3duXzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0b3ByaWdodCwgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIHByZWQ0eDRfaG9yaXpvbnRhbF9kb3duXzgsIDMsMworICAgIHN1YiAgICAgICByMCwgcjIKKyAgICBsZWEgICAgICAgcjEsIFtyMCtyMioyXQorICAgIG1vdmggICAgICBtMCwgW3IwLTRdICAgICAgOyBsdCAuLgorICAgIHB1bnBja2xkcSBtMCwgW3IwXSAgICAgICAgOyB0MyB0MiB0MSB0MCBsdCAuLiAuLiAuLgorICAgIHBzbGxxICAgICBtMCwgOCAgICAgICAgICAgOyB0MiB0MSB0MCBsdCAuLiAuLiAuLiAuLgorICAgIG1vdmQgICAgICBtMSwgW3IxK3IyKjItNF0gOyBsMworICAgIHB1bnBja2xidyBtMSwgW3IxK3IyKjEtNF0gOyBsMiBsMworICAgIG1vdmQgICAgICBtMiwgW3IwK3IyKjItNF0gOyBsMQorICAgIHB1bnBja2xidyBtMiwgW3IwK3IyKjEtNF0gOyBsMCBsMQorICAgIHB1bnBja2h3ZCBtMSwgbTIgICAgICAgICAgOyBsMCBsMSBsMiBsMworICAgIHB1bnBja2hkcSBtMSwgbTAgICAgICAgICAgOyB0MiB0MSB0MCBsdCBsMCBsMSBsMiBsMworICAgIG1vdnEgICAgICBtMCwgbTEKKyAgICBtb3ZxICAgICAgbTIsIG0xCisgICAgbW92cSAgICAgIG01LCBtMQorICAgIHBzcmxxICAgICBtMCwgMTYgICAgICAgICAgOyAuLiAuLiB0MiB0MSB0MCBsdCBsMCBsMQorICAgIHBzcmxxICAgICBtMiwgOCAgICAgICAgICAgOyAuLiB0MiB0MSB0MCBsdCBsMCBsMSBsMgorICAgIHBhdmdiICAgICBtNSwgbTIKKyAgICBQUkVENHg0X0xPV1BBU1MgbTMsIG0xLCBtMCwgbTIsIG00CisgICAgcHVucGNrbGJ3IG01LCBtMworICAgIHBzcmxxICAgICBtMywgMzIKKyAgICBQQUxJR05SICAgbTMsIG01LCA2LCBtNAorICAgIG1vdmggICAgICBbcjErcjIqMl0sIG01CisgICAgcHNybHEgICAgIG01LCAxNgorICAgIG1vdmggICAgICBbcjErcjIqMV0sIG01CisgICAgcHNybHEgICAgIG01LCAxNgorICAgIG1vdmggICAgICBbcjArcjIqMl0sIG01CisgICAgbW92aCAgICAgIFtyMCtyMioxXSwgbTMKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDR4NF92ZXJ0aWNhbF9yaWdodF84X21teGV4dCh1aW50OF90ICpzcmMsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0b3ByaWdodCwgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgcHJlZDR4NF92ZXJ0aWNhbF9yaWdodF84LCAzLDMKKyAgICBzdWIgICAgIHIwLCByMgorICAgIGxlYSAgICAgcjEsIFtyMCtyMioyXQorICAgIG1vdmggICAgbTAsIFtyMF0gICAgICAgICAgICAgICAgICAgIDsgLi4uLi4uLi50M3QydDF0MAorICAgIG1vdnEgICAgbTUsIG0wCisgICAgUEFMSUdOUiBtMCwgW3IwLThdLCA3LCBtMSAgICAgICAgICAgOyAuLi4uLi50M3QydDF0MGx0CisgICAgcGF2Z2IgICBtNSwgbTAKKyAgICBQQUxJR05SIG0wLCBbcjArcjIqMS04XSwgNywgbTEgICAgICA7IC4uLi50M3QydDF0MGx0bDAKKyAgICBtb3ZxICAgIG0xLCBtMAorICAgIFBBTElHTlIgbTAsIFtyMCtyMioyLThdLCA3LCBtMiAgICAgIDsgLi50M3QydDF0MGx0bDBsMQorICAgIG1vdnEgICAgbTIsIG0wCisgICAgUEFMSUdOUiBtMCwgW3IxK3IyKjEtOF0sIDcsIG0zICAgICAgOyB0M3QydDF0MGx0bDBsMWwyCisgICAgUFJFRDR4NF9MT1dQQVNTIG0zLCBtMSwgbTAsIG0yLCBtNAorICAgIG1vdnEgICAgbTEsIG0zCisgICAgcHNybHEgICBtMywgMTYKKyAgICBwc2xscSAgIG0xLCA0OAorICAgIG1vdmggICAgW3IwK3IyKjFdLCBtNQorICAgIG1vdmggICAgW3IwK3IyKjJdLCBtMworICAgIFBBTElHTlIgbTUsIG0xLCA3LCBtMgorICAgIHBzbGxxICAgbTEsIDgKKyAgICBtb3ZoICAgIFtyMStyMioxXSwgbTUKKyAgICBQQUxJR05SIG0zLCBtMSwgNywgbTEKKyAgICBtb3ZoICAgIFtyMStyMioyXSwgbTMKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDR4NF9kb3duX3JpZ2h0XzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIHByZWQ0eDRfZG93bl9yaWdodF84LCAzLDMKKyAgICBzdWIgICAgICAgcjAsIHIyCisgICAgbGVhICAgICAgIHIxLCBbcjArcjIqMl0KKyAgICBtb3ZxICAgICAgbTEsIFtyMS04XQorICAgIG1vdnEgICAgICBtMiwgW3IwK3IyKjEtOF0KKyAgICBwdW5wY2toYncgbTIsIFtyMC04XQorICAgIG1vdmggICAgICBtMywgW3IwXQorICAgIHB1bnBja2h3ZCBtMSwgbTIKKyAgICBQQUxJR05SICAgbTMsIG0xLCA1LCBtMQorICAgIG1vdnEgICAgICBtMSwgbTMKKyAgICBQQUxJR05SICAgbTMsIFtyMStyMioxLThdLCA3LCBtNAorICAgIG1vdnEgICAgICBtMiwgbTMKKyAgICBQQUxJR05SICAgbTMsIFtyMStyMioyLThdLCA3LCBtNAorICAgIFBSRUQ0eDRfTE9XUEFTUyBtMCwgbTMsIG0xLCBtMiwgbTQKKyAgICBtb3ZoICAgICAgW3IxK3IyKjJdLCBtMAorICAgIHBzcmxxICAgICBtMCwgOAorICAgIG1vdmggICAgICBbcjErcjIqMV0sIG0wCisgICAgcHNybHEgICAgIG0wLCA4CisgICAgbW92aCAgICAgIFtyMCtyMioyXSwgbTAKKyAgICBwc3JscSAgICAgbTAsIDgKKyAgICBtb3ZoICAgICAgW3IwK3IyKjFdLCBtMAorICAgIFJFVApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfaW50cmFwcmVkXzEwYml0LmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZF8xMGJpdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwYTIxMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZF8xMGJpdC5hc20KQEAgLTAsMCArMSwxMTkxIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIE1NWC9TU0UyL0FWWC1vcHRpbWl6ZWQgMTAtYml0IEguMjY0IGludHJhIHByZWRpY3Rpb24gY29kZQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMSB4MjY0IHByb2plY3QKKzsqCis7KiBBdXRob3JzOiBEYW5pZWwgS2FuZyA8ZGFuaWVsLmQua2FuZ0BnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworY2V4dGVybiBwd181MTIKK2NleHRlcm4gcHdfMTYKK2NleHRlcm4gcHdfOAorY2V4dGVybiBwd180CitjZXh0ZXJuIHB3XzIKK2NleHRlcm4gcHdfMQorCitwd19tMzIxMDEyMzQ6IGR3IC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQKK3B3X20zOiAgICAgICAgdGltZXMgOCBkdyAtMworcHdfcGl4ZWxfbWF4OiB0aW1lcyA4IGR3ICgoMSA8PCAxMCktMSkKK3BkXzE3OiAgICAgICAgdGltZXMgNCBkZCAxNworcGRfMTY6ICAgICAgICB0aW1lcyA0IGRkIDE2CisKK1NFQ1RJT04gLnRleHQKKworOyBkZXN0LCBsZWZ0LCByaWdodCwgc3JjCis7IG91dHB1dDogJTEgPSAodFtuLTFdICsgdFtuXSoyICsgdFtuKzFdICsgMikgPj4gMgorJW1hY3JvIFBSRUQ0eDRfTE9XUEFTUyA0CisgICAgcGFkZHcgICAgICAgJTIsICUzCisgICAgcHNybHcgICAgICAgJTIsIDEKKyAgICBwYXZndyAgICAgICAlMSwgJTQsICUyCislZW5kbWFjcm8KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDR4NF9kb3duX3JpZ2h0KHBpeGVsICpzcmMsIGNvbnN0IHBpeGVsICp0b3ByaWdodCwgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIFBSRUQ0eDRfRFIgMAorY2dsb2JhbCBwcmVkNHg0X2Rvd25fcmlnaHRfMTAsIDMsIDMKKyAgICBzdWIgICAgICAgcjAsIHIyCisgICAgbGVhICAgICAgIHIxLCBbcjArcjIqMl0KKyAgICBtb3ZocHMgICAgbTEsIFtyMS04XQorICAgIG1vdmhwcyAgICBtMiwgW3IwK3IyKjEtOF0KKyAgICBtb3ZocHMgICAgbTQsIFtyMC04XQorICAgIHB1bnBja2h3ZCBtMiwgbTQKKyAgICBtb3ZxICAgICAgbTMsIFtyMF0KKyAgICBwdW5wY2toZHEgbTEsIG0yCisgICAgUEFMSUdOUiAgIG0zLCBtMSwgMTAsIG0xCisgICAgbW92aHBzICAgIG00LCBbcjErcjIqMS04XQorICAgIFBBTElHTlIgICBtMCwgbTMsIG00LCAxNCwgbTQKKyAgICBtb3ZocHMgICAgbTQsIFtyMStyMioyLThdCisgICAgUEFMSUdOUiAgIG0yLCBtMCwgbTQsIDE0LCBtNAorICAgIFBSRUQ0eDRfTE9XUEFTUyBtMCwgbTIsIG0zLCBtMAorICAgIG1vdnEgICAgICBbcjErcjIqMl0sIG0wCisgICAgcHNybGRxICAgIG0wLCAyCisgICAgbW92cSAgICAgIFtyMStyMioxXSwgbTAKKyAgICBwc3JsZHEgICAgbTAsIDIKKyAgICBtb3ZxICAgICAgW3IwK3IyKjJdLCBtMAorICAgIHBzcmxkcSAgICBtMCwgMgorICAgIG1vdnEgICAgICBbcjArcjIqMV0sIG0wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUFJFRDR4NF9EUgorSU5JVF9YTU0gc3NzZTMKK1BSRUQ0eDRfRFIKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitQUkVENHg0X0RSCislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ0eDRfdmVydGljYWxfcmlnaHQocGl4ZWwgKnNyYywgY29uc3QgcGl4ZWwgKnRvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIFBSRUQ0eDRfVlIgMAorY2dsb2JhbCBwcmVkNHg0X3ZlcnRpY2FsX3JpZ2h0XzEwLCAzLCAzLCA2CisgICAgc3ViICAgICByMCwgcjIKKyAgICBsZWEgICAgIHIxLCBbcjArcjIqMl0KKyAgICBtb3ZxICAgIG01LCBbcjBdICAgICAgICAgICAgOyAuLi4uLi4uLnQzdDJ0MXQwCisgICAgbW92aHBzICBtMSwgW3IwLThdCisgICAgUEFMSUdOUiBtMCwgbTUsIG0xLCAxNCwgbTEgIDsgLi4uLi4udDN0MnQxdDBsdAorICAgIHBhdmd3ICAgbTUsIG0wCisgICAgbW92aHBzICBtMSwgW3IwK3IyKjEtOF0KKyAgICBQQUxJR05SIG0wLCBtMSwgMTQsIG0xICAgICAgOyAuLi4udDN0MnQxdDBsdGwwCisgICAgbW92aHBzICBtMiwgW3IwK3IyKjItOF0KKyAgICBQQUxJR05SIG0xLCBtMCwgbTIsIDE0LCBtMiAgOyAuLnQzdDJ0MXQwbHRsMGwxCisgICAgbW92aHBzICBtMywgW3IxK3IyKjEtOF0KKyAgICBQQUxJR05SIG0yLCBtMSwgbTMsIDE0LCBtMyAgOyB0M3QydDF0MGx0bDBsMWwyCisgICAgUFJFRDR4NF9MT1dQQVNTIG0xLCBtMCwgbTIsIG0xCisgICAgcHNsbGRxICBtMCwgbTEsIDEyCisgICAgcHNybGRxICBtMSwgNAorICAgIG1vdnEgICAgW3IwK3IyKjFdLCBtNQorICAgIG1vdnEgICAgW3IwK3IyKjJdLCBtMQorICAgIFBBTElHTlIgbTUsIG0wLCAxNCwgbTIKKyAgICBwc2xsZHEgIG0wLCAyCisgICAgbW92cSAgICBbcjErcjIqMV0sIG01CisgICAgUEFMSUdOUiBtMSwgbTAsIDE0LCBtMAorICAgIG1vdnEgICAgW3IxK3IyKjJdLCBtMQorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK1BSRUQ0eDRfVlIKK0lOSVRfWE1NIHNzc2UzCitQUkVENHg0X1ZSCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorUFJFRDR4NF9WUgorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDR4NF9ob3Jpem9udGFsX2Rvd24ocGl4ZWwgKnNyYywgY29uc3QgcGl4ZWwgKnRvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBQUkVENHg0X0hEIDAKK2NnbG9iYWwgcHJlZDR4NF9ob3Jpem9udGFsX2Rvd25fMTAsIDMsIDMKKyAgICBzdWIgICAgICAgIHIwLCByMgorICAgIGxlYSAgICAgICAgcjEsIFtyMCtyMioyXQorICAgIG1vdnEgICAgICAgbTAsIFtyMC04XSAgICAgIDsgbHQgLi4KKyAgICBtb3ZocHMgICAgIG0wLCBbcjBdCisgICAgcHNsbGRxICAgICBtMCwgMiAgICAgICAgICAgOyB0MiB0MSB0MCBsdCAuLiAuLiAuLiAuLgorICAgIG1vdnEgICAgICAgbTEsIFtyMStyMioyLThdIDsgbDMKKyAgICBtb3ZxICAgICAgIG0zLCBbcjErcjIqMS04XQorICAgIHB1bnBja2x3ZCAgbTEsIG0zICAgICAgICAgIDsgbDIgbDMKKyAgICBtb3ZxICAgICAgIG0yLCBbcjArcjIqMi04XSA7IGwxCisgICAgbW92cSAgICAgICBtMywgW3IwK3IyKjEtOF0KKyAgICBwdW5wY2tsd2QgIG0yLCBtMyAgICAgICAgICA7IGwwIGwxCisgICAgcHVucGNraGRxICBtMSwgbTIgICAgICAgICAgOyBsMCBsMSBsMiBsMworICAgIHB1bnBja2hxZHEgbTEsIG0wICAgICAgICAgIDsgdDIgdDEgdDAgbHQgbDAgbDEgbDIgbDMKKyAgICBwc3JsZHEgICAgIG0wLCBtMSwgNCAgICAgICA7IC4uIC4uIHQyIHQxIHQwIGx0IGwwIGwxCisgICAgcHNybGRxICAgICBtMywgbTEsIDIgICAgICAgOyAuLiB0MiB0MSB0MCBsdCBsMCBsMSBsMgorICAgIHBhdmd3ICAgICAgbTUsIG0xLCBtMworICAgIFBSRUQ0eDRfTE9XUEFTUyBtMywgbTEsIG0wLCBtMworICAgIHB1bnBja2x3ZCAgbTUsIG0zCisgICAgcHNybGRxICAgICBtMywgOAorICAgIFBBTElHTlIgICAgbTMsIG01LCAxMiwgbTQKKyAgICBtb3ZxICAgICAgIFtyMStyMioyXSwgbTUKKyAgICBtb3ZocHMgICAgIFtyMCtyMioyXSwgbTUKKyAgICBwc3JsZHEgICAgIG01LCA0CisgICAgbW92cSAgICAgICBbcjErcjIqMV0sIG01CisgICAgbW92cSAgICAgICBbcjArcjIqMV0sIG0zCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUFJFRDR4NF9IRAorSU5JVF9YTU0gc3NzZTMKK1BSRUQ0eDRfSEQKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitQUkVENHg0X0hECislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDR4NF9kYyhwaXhlbCAqc3JjLCBjb25zdCBwaXhlbCAqdG9wcmlnaHQsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIHByZWQ0eDRfZGNfMTAsIDMsIDMKKyAgICBzdWIgICAgcjAsIHIyCisgICAgbGVhICAgIHIxLCBbcjArcjIqMl0KKyAgICBtb3ZxICAgbTIsIFtyMCtyMioxLThdCisgICAgcGFkZHcgIG0yLCBbcjArcjIqMi04XQorICAgIHBhZGR3ICBtMiwgW3IxK3IyKjEtOF0KKyAgICBwYWRkdyAgbTIsIFtyMStyMioyLThdCisgICAgcHNybHEgIG0yLCA0OAorICAgIG1vdnEgICBtMCwgW3IwXQorICAgIEhBRERXICBtMCwgbTEKKyAgICBwYWRkdyAgbTAsIFtwd180XQorICAgIHBhZGR3ICBtMCwgbTIKKyAgICBwc3JsdyAgbTAsIDMKKyAgICBTUExBVFcgbTAsIG0wLCAwCisgICAgbW92cSAgIFtyMCtyMioxXSwgbTAKKyAgICBtb3ZxICAgW3IwK3IyKjJdLCBtMAorICAgIG1vdnEgICBbcjErcjIqMV0sIG0wCisgICAgbW92cSAgIFtyMStyMioyXSwgbTAKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDR4NF9kb3duX2xlZnQocGl4ZWwgKnNyYywgY29uc3QgcGl4ZWwgKnRvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gUFJFRDR4NF9ETCAwCitjZ2xvYmFsIHByZWQ0eDRfZG93bl9sZWZ0XzEwLCAzLCAzCisgICAgc3ViICAgICAgICByMCwgcjIKKyAgICBtb3ZxICAgICAgIG0wLCBbcjBdCisgICAgbW92aHBzICAgICBtMCwgW3IxXQorICAgIHBzcmxkcSAgICAgbTIsIG0wLCAyCisgICAgcHNsbGRxICAgICBtMywgbTAsIDIKKyAgICBwc2h1Zmh3ICAgIG0yLCBtMiwgMTAxMDAxMDBiCisgICAgUFJFRDR4NF9MT1dQQVNTIG0wLCBtMywgbTIsIG0wCisgICAgbGVhICAgICAgICByMSwgW3IwK3IyKjJdCisgICAgbW92aHBzICAgICBbcjErcjIqMl0sIG0wCisgICAgcHNybGRxICAgICBtMCwgMgorICAgIG1vdnEgICAgICAgW3IwK3IyKjFdLCBtMAorICAgIHBzcmxkcSAgICAgbTAsIDIKKyAgICBtb3ZxICAgICAgIFtyMCtyMioyXSwgbTAKKyAgICBwc3JsZHEgICAgIG0wLCAyCisgICAgbW92cSAgICAgICBbcjErcjIqMV0sIG0wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUFJFRDR4NF9ETAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK1BSRUQ0eDRfREwKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkNHg0X3ZlcnRpY2FsX2xlZnQocGl4ZWwgKnNyYywgY29uc3QgcGl4ZWwgKnRvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gUFJFRDR4NF9WTCAwCitjZ2xvYmFsIHByZWQ0eDRfdmVydGljYWxfbGVmdF8xMCwgMywgMworICAgIHN1YiAgICAgICAgcjAsIHIyCisgICAgbW92dSAgICAgICBtMSwgW3IwXQorICAgIG1vdmhwcyAgICAgbTEsIFtyMV0KKyAgICBwc3JsZHEgICAgIG0wLCBtMSwgMgorICAgIHBzcmxkcSAgICAgbTIsIG0xLCA0CisgICAgcGF2Z3cgICAgICBtNCwgbTAsIG0xCisgICAgUFJFRDR4NF9MT1dQQVNTIG0wLCBtMSwgbTIsIG0wCisgICAgbGVhICAgICAgICByMSwgW3IwK3IyKjJdCisgICAgbW92cSAgICAgICBbcjArcjIqMV0sIG00CisgICAgbW92cSAgICAgICBbcjArcjIqMl0sIG0wCisgICAgcHNybGRxICAgICBtNCwgMgorICAgIHBzcmxkcSAgICAgbTAsIDIKKyAgICBtb3ZxICAgICAgIFtyMStyMioxXSwgbTQKKyAgICBtb3ZxICAgICAgIFtyMStyMioyXSwgbTAKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitQUkVENHg0X1ZMCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorUFJFRDR4NF9WTAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ0eDRfaG9yaXpvbnRhbF91cChwaXhlbCAqc3JjLCBjb25zdCBwaXhlbCAqdG9wcmlnaHQsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCBwcmVkNHg0X2hvcml6b250YWxfdXBfMTAsIDMsIDMKKyAgICBzdWIgICAgICAgcjAsIHIyCisgICAgbGVhICAgICAgIHIxLCBbcjArcjIqMl0KKyAgICBtb3ZxICAgICAgbTAsIFtyMCtyMioxLThdCisgICAgcHVucGNraHdkIG0wLCBbcjArcjIqMi04XQorICAgIG1vdnEgICAgICBtMSwgW3IxK3IyKjEtOF0KKyAgICBwdW5wY2tod2QgbTEsIFtyMStyMioyLThdCisgICAgcHVucGNraGRxIG0wLCBtMQorICAgIHBzaHVmdyAgICBtMSwgbTEsIDB4RkYKKyAgICBtb3ZxICAgICAgW3IxK3IyKjJdLCBtMQorICAgIG1vdmQgICAgICBbcjErcjIqMSs0XSwgbTEKKyAgICBwc2h1ZncgICAgbTIsIG0wLCAxMTExMTAwMWIKKyAgICBtb3ZxICAgICAgbTEsIG0yCisgICAgcGF2Z3cgICAgIG0yLCBtMAorCisgICAgcHNodWZ3ICAgIG01LCBtMCwgMTExMTExMTBiCisgICAgUFJFRDR4NF9MT1dQQVNTIG0xLCBtMCwgbTUsIG0xCisgICAgbW92cSAgICAgIG02LCBtMgorICAgIHB1bnBja2x3ZCBtNiwgbTEKKyAgICBtb3ZxICAgICAgW3IwK3IyKjFdLCBtNgorICAgIHBzcmxxICAgICBtMiwgMTYKKyAgICBwc3JscSAgICAgbTEsIDE2CisgICAgcHVucGNrbHdkIG0yLCBtMQorICAgIG1vdnEgICAgICBbcjArcjIqMl0sIG0yCisgICAgcHNybHEgICAgIG0yLCAzMgorICAgIG1vdmQgICAgICBbcjErcjIqMV0sIG0yCisgICAgUkVUCisKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkOHg4X3ZlcnRpY2FsKHBpeGVsICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lOSVRfWE1NIHNzZTIKK2NnbG9iYWwgcHJlZDh4OF92ZXJ0aWNhbF8xMCwgMiwgMgorICAgIHN1YiAgcjAsIHIxCisgICAgbW92YSBtMCwgW3IwXQorJXJlcCAzCisgICAgbW92YSBbcjArcjEqMV0sIG0wCisgICAgbW92YSBbcjArcjEqMl0sIG0wCisgICAgbGVhICByMCwgW3IwK3IxKjJdCislZW5kcmVwCisgICAgbW92YSBbcjArcjEqMV0sIG0wCisgICAgbW92YSBbcjArcjEqMl0sIG0wCisgICAgUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhfaG9yaXpvbnRhbChwaXhlbCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJTklUX1hNTSBzc2UyCitjZ2xvYmFsIHByZWQ4eDhfaG9yaXpvbnRhbF8xMCwgMiwgMworICAgIG1vdiAgICAgICAgIHIyZCwgNAorLmxvb3A6CisgICAgbW92cSAgICAgICAgIG0wLCBbcjArcjEqMC04XQorICAgIG1vdnEgICAgICAgICBtMSwgW3IwK3IxKjEtOF0KKyAgICBwc2h1Zmx3ICAgICAgbTAsIG0wLCAweGZmCisgICAgcHNodWZsdyAgICAgIG0xLCBtMSwgMHhmZgorICAgIHB1bnBja2xxZHEgICBtMCwgbTAKKyAgICBwdW5wY2tscWRxICAgbTEsIG0xCisgICAgbW92YSAgW3IwK3IxKjBdLCBtMAorICAgIG1vdmEgIFtyMCtyMSoxXSwgbTEKKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMSoyXQorICAgIGRlYyAgICAgICAgICByMmQKKyAgICBqZyAubG9vcAorICAgIFJFUF9SRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZGljdF84eDhfZGMocGl4ZWwgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIE1PVjggMi0zCis7IHNvcnQgb2YgYSBoYWNrLCBidXQgaXQgd29ya3MKKyVpZiBtbXNpemU9PTgKKyAgICBtb3ZxICAgIFslMSswXSwgJTIKKyAgICBtb3ZxICAgIFslMSs4XSwgJTMKKyVlbHNlCisgICAgbW92ZHFhICAgIFslMV0sICUyCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gUFJFRDh4OF9EQyAxCitjZ2xvYmFsIHByZWQ4eDhfZGNfMTAsIDIsIDYKKyAgICBzdWIgICAgICAgICByMCwgcjEKKyAgICBweG9yICAgICAgICBtNCwgbTQKKyAgICBtb3ZxICAgICAgICBtMCwgW3IwKzBdCisgICAgbW92cSAgICAgICAgbTEsIFtyMCs4XQorJWlmIG1tc2l6ZT09MTYKKyAgICBwdW5wY2tsd2QgICBtMCwgbTEKKyAgICBtb3ZobHBzICAgICBtMSwgbTAKKyAgICBwYWRkdyAgICAgICBtMCwgbTEKKyVlbHNlCisgICAgcHNodWZ3ICAgICAgbTIsIG0wLCAwMDAwMTExMGIKKyAgICBwc2h1ZncgICAgICBtMywgbTEsIDAwMDAxMTEwYgorICAgIHBhZGR3ICAgICAgIG0wLCBtMgorICAgIHBhZGR3ICAgICAgIG0xLCBtMworICAgIHB1bnBja2x3ZCAgIG0wLCBtMQorJWVuZGlmCisgICAgJTEgICAgICAgICAgbTIsIG0wLCAwMDAwMTExMGIKKyAgICBwYWRkdyAgICAgICBtMCwgbTIKKworICAgIGxlYSAgICAgICAgIHI1LCBbcjEqM10KKyAgICBsZWEgICAgICAgICByNCwgW3IwK3IxKjRdCisgICAgbW92enggICAgICByMmQsIHdvcmQgW3IwK3IxKjEtMl0KKyAgICBtb3Z6eCAgICAgIHIzZCwgd29yZCBbcjArcjEqMi0yXQorICAgIGFkZCAgICAgICAgcjJkLCByM2QKKyAgICBtb3Z6eCAgICAgIHIzZCwgd29yZCBbcjArcjUqMS0yXQorICAgIGFkZCAgICAgICAgcjJkLCByM2QKKyAgICBtb3Z6eCAgICAgIHIzZCwgd29yZCBbcjQtMl0KKyAgICBhZGQgICAgICAgIHIyZCwgcjNkCisgICAgbW92ZCAgICAgICAgbTIsIHIyZCAgICAgICAgICAgIDsgczIKKworICAgIG1vdnp4ICAgICAgcjJkLCB3b3JkIFtyNCtyMSoxLTJdCisgICAgbW92enggICAgICByM2QsIHdvcmQgW3I0K3IxKjItMl0KKyAgICBhZGQgICAgICAgIHIyZCwgcjNkCisgICAgbW92enggICAgICByM2QsIHdvcmQgW3I0K3I1KjEtMl0KKyAgICBhZGQgICAgICAgIHIyZCwgcjNkCisgICAgbW92enggICAgICByM2QsIHdvcmQgW3I0K3IxKjQtMl0KKyAgICBhZGQgICAgICAgIHIyZCwgcjNkCisgICAgbW92ZCAgICAgICAgbTMsIHIyZCAgICAgICAgICAgIDsgczMKKworICAgIHB1bnBja2x3ZCAgIG0yLCBtMworICAgIHB1bnBja2xkcSAgIG0wLCBtMiAgICAgICAgICAgIDsgczAsIHMxLCBzMiwgczMKKyAgICAlMSAgICAgICAgICBtMywgbTAsIDExMTEwMTEwYiA7IHMyLCBzMSwgczMsIHMzCisgICAgJTEgICAgICAgICAgbTAsIG0wLCAwMTExMDEwMGIgOyBzMCwgczEsIHMzLCBzMQorICAgIHBhZGR3ICAgICAgIG0wLCBtMworICAgIHBzcmx3ICAgICAgIG0wLCAyCisgICAgcGF2Z3cgICAgICAgbTAsIG00ICAgICAgICAgICAgOyBzMCtzMiwgczEsIHMzLCBzMStzMworJWlmIG1tc2l6ZT09MTYKKyAgICBwdW5wY2tsd2QgICBtMCwgbTAKKyAgICBwc2h1ZmQgICAgICBtMywgbTAsIDExMTExMDEwYgorICAgIHB1bnBja2xkcSAgIG0wLCBtMAorICAgIFNXQVAgICAgICAgICAwLDEKKyVlbHNlCisgICAgcHNodWZ3ICAgICAgbTEsIG0wLCAweDAwCisgICAgcHNodWZ3ICAgICAgbTIsIG0wLCAweDU1CisgICAgcHNodWZ3ICAgICAgbTMsIG0wLCAweGFhCisgICAgcHNodWZ3ICAgICAgbTQsIG0wLCAweGZmCislZW5kaWYKKyAgICBNT1Y4ICAgcjArcjEqMSwgbTEsIG0yCisgICAgTU9WOCAgIHIwK3IxKjIsIG0xLCBtMgorICAgIE1PVjggICByMCtyNSoxLCBtMSwgbTIKKyAgICBNT1Y4ICAgcjArcjEqNCwgbTEsIG0yCisgICAgTU9WOCAgIHI0K3IxKjEsIG0zLCBtNAorICAgIE1PVjggICByNCtyMSoyLCBtMywgbTQKKyAgICBNT1Y4ICAgcjQrcjUqMSwgbTMsIG00CisgICAgTU9WOCAgIHI0K3IxKjQsIG0zLCBtNAorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUFJFRDh4OF9EQyBwc2h1ZncKK0lOSVRfWE1NIHNzZTIKK1BSRUQ4eDhfREMgcHNodWZsdworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkOHg4X3RvcF9kYyhwaXhlbCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJTklUX1hNTSBzc2UyCitjZ2xvYmFsIHByZWQ4eDhfdG9wX2RjXzEwLCAyLCA0CisgICAgc3ViICAgICAgICAgcjAsIHIxCisgICAgbW92YSAgICAgICAgbTAsIFtyMF0KKyAgICBwc2h1Zmx3ICAgICBtMSwgbTAsIDB4NGUKKyAgICBwc2h1Zmh3ICAgICBtMSwgbTEsIDB4NGUKKyAgICBwYWRkdyAgICAgICBtMCwgbTEKKyAgICBwc2h1Zmx3ICAgICBtMSwgbTAsIDB4YjEKKyAgICBwc2h1Zmh3ICAgICBtMSwgbTEsIDB4YjEKKyAgICBwYWRkdyAgICAgICBtMCwgbTEKKyAgICBsZWEgICAgICAgICByMiwgW3IxKjNdCisgICAgbGVhICAgICAgICAgcjMsIFtyMCtyMSo0XQorICAgIHBhZGR3ICAgICAgIG0wLCBbcHdfMl0KKyAgICBwc3JsdyAgICAgICBtMCwgMgorICAgIG1vdmEgW3IwK3IxKjFdLCBtMAorICAgIG1vdmEgW3IwK3IxKjJdLCBtMAorICAgIG1vdmEgW3IwK3IyKjFdLCBtMAorICAgIG1vdmEgW3IwK3IxKjRdLCBtMAorICAgIG1vdmEgW3IzK3IxKjFdLCBtMAorICAgIG1vdmEgW3IzK3IxKjJdLCBtMAorICAgIG1vdmEgW3IzK3IyKjFdLCBtMAorICAgIG1vdmEgW3IzK3IxKjRdLCBtMAorICAgIFJFVAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkOHg4X3BsYW5lKHBpeGVsICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lOSVRfWE1NIHNzZTIKK2NnbG9iYWwgcHJlZDh4OF9wbGFuZV8xMCwgMiwgNywgNworICAgIHN1YiAgICAgICByMCwgcjEKKyAgICBsZWEgICAgICAgcjIsIFtyMSozXQorICAgIGxlYSAgICAgICByMywgW3IwK3IxKjRdCisgICAgbW92YSAgICAgIG0yLCBbcjBdCisgICAgcG1hZGR3ZCAgIG0yLCBbcHdfbTMyMTAxMjM0XQorICAgIEhBREREICAgICBtMiwgbTEKKyAgICBtb3ZkICAgICAgbTAsIFtyMC00XQorICAgIHBzcmxkICAgICBtMCwgMTQKKyAgICBwc3VidyAgICAgbTIsIG0wICAgICAgICAgICAgICAgOyBICisgICAgbW92ZCAgICAgIG0wLCBbcjMrcjEqNC00XQorICAgIG1vdmQgICAgICBtMSwgW3IwKzEyXQorICAgIHBhZGR3ICAgICBtMCwgbTEKKyAgICBwc2xsdyAgICAgbTAsIDQgICAgICAgICAgICAgICAgOyAxNiooc3JjWzcqc3RyaWRlLTFdICsgc3JjWy1zdHJpZGUrN10pCisgICAgbW92enggICAgcjRkLCB3b3JkIFtyMytyMSoxLTJdIDsgc3JjWzQqc3RyaWRlLTFdCisgICAgbW92enggICAgcjVkLCB3b3JkIFtyMCtyMioxLTJdIDsgc3JjWzIqc3RyaWRlLTFdCisgICAgc3ViICAgICAgcjRkLCByNWQKKyAgICBtb3Z6eCAgICByNmQsIHdvcmQgW3IzK3IxKjItMl0gOyBzcmNbNSpzdHJpZGUtMV0KKyAgICBtb3Z6eCAgICByNWQsIHdvcmQgW3IwK3IxKjItMl0gOyBzcmNbMSpzdHJpZGUtMV0KKyAgICBzdWIgICAgICByNmQsIHI1ZAorICAgIGxlYSAgICAgIHI0ZCwgW3I0K3I2KjJdCisgICAgbW92enggICAgcjVkLCB3b3JkIFtyMytyMioxLTJdIDsgc3JjWzYqc3RyaWRlLTFdCisgICAgbW92enggICAgcjZkLCB3b3JkIFtyMCtyMSoxLTJdIDsgc3JjWzAqc3RyaWRlLTFdCisgICAgc3ViICAgICAgcjVkLCByNmQKKyAgICBsZWEgICAgICByNWQsIFtyNSozXQorICAgIGFkZCAgICAgIHI0ZCwgcjVkCisgICAgbW92enggICAgcjZkLCB3b3JkIFtyMytyMSo0LTJdIDsgc3JjWzcqc3RyaWRlLTFdCisgICAgbW92enggICAgcjVkLCB3b3JkIFtyMCtyMSowLTJdIDsgc3JjWyAtc3RyaWRlLTFdCisgICAgc3ViICAgICAgcjZkLCByNWQKKyAgICBsZWEgICAgICByNGQsIFtyNCtyNio0XQorICAgIG1vdmQgICAgICBtMywgcjRkICAgICAgICAgICAgICA7IFYKKyAgICBwdW5wY2tsZHEgbTIsIG0zCisgICAgcG1hZGR3ZCAgIG0yLCBbcGRfMTddCisgICAgcGFkZGQgICAgIG0yLCBbcGRfMTZdCisgICAgcHNyYWQgICAgIG0yLCA1ICAgICAgICAgICAgICAgIDsgYiwgYworCisgICAgbW92YSAgICAgIG0zLCBbcHdfcGl4ZWxfbWF4XQorICAgIHB4b3IgICAgICBtMSwgbTEKKyAgICBTUExBVFcgICAgbTAsIG0wLCAxCisgICAgU1BMQVRXICAgIG00LCBtMiwgMgorICAgIFNQTEFUVyAgICBtMiwgbTIsIDAKKyAgICBwbXVsbHcgICAgbTIsIFtwd19tMzIxMDEyMzRdICAgOyBiCisgICAgcG11bGx3ICAgIG01LCBtNCwgW3B3X20zXSAgICAgIDsgYworICAgIHBhZGR3ICAgICBtNSwgW3B3XzE2XQorICAgIG1vdiAgICAgIHIyZCwgOAorICAgIGFkZCAgICAgICByMCwgcjEKKy5sb29wOgorICAgIHBhZGRzdyAgICBtNiwgbTIsIG01CisgICAgcGFkZHN3ICAgIG02LCBtMAorICAgIHBzcmF3ICAgICBtNiwgNQorICAgIENMSVBXICAgICBtNiwgbTEsIG0zCisgICAgbW92YSAgICBbcjBdLCBtNgorICAgIHBhZGR3ICAgICBtNSwgbTQKKyAgICBhZGQgICAgICAgcjAsIHIxCisgICAgZGVjIHIyZAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhsXzEyOF9kYyhwaXhlbCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsIGludCBoYXNfdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBQUkVEOHg4TF8xMjhfREMgMAorY2dsb2JhbCBwcmVkOHg4bF8xMjhfZGNfMTAsIDQsIDQKKyAgICBtb3ZhICAgICAgbTAsIFtwd181MTJdIDsgKDE8PChCSVRfREVQVEgtMSkpCisgICAgbGVhICAgICAgIHIxLCBbcjMqM10KKyAgICBsZWEgICAgICAgcjIsIFtyMCtyMyo0XQorICAgIE1PVjggcjArcjMqMCwgbTAsIG0wCisgICAgTU9WOCByMCtyMyoxLCBtMCwgbTAKKyAgICBNT1Y4IHIwK3IzKjIsIG0wLCBtMAorICAgIE1PVjggcjArcjEqMSwgbTAsIG0wCisgICAgTU9WOCByMityMyowLCBtMCwgbTAKKyAgICBNT1Y4IHIyK3IzKjEsIG0wLCBtMAorICAgIE1PVjggcjIrcjMqMiwgbTAsIG0wCisgICAgTU9WOCByMityMSoxLCBtMCwgbTAKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BSRUQ4eDhMXzEyOF9EQworSU5JVF9YTU0gc3NlMgorUFJFRDh4OExfMTI4X0RDCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhsX3RvcF9kYyhwaXhlbCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsIGludCBoYXNfdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBQUkVEOHg4TF9UT1BfREMgMAorY2dsb2JhbCBwcmVkOHg4bF90b3BfZGNfMTAsIDQsIDQsIDYKKyAgICBzdWIgICAgICAgICByMCwgcjMKKyAgICBtb3ZhICAgICAgICBtMCwgW3IwXQorICAgIHNociAgICAgICAgcjFkLCAxNAorICAgIHNociAgICAgICAgcjJkLCAxMworICAgIG5lZyAgICAgICAgIHIxCisgICAgcHNsbGRxICAgICAgbTEsIG0wLCAyCisgICAgcHNybGRxICAgICAgbTIsIG0wLCAyCisgICAgcGluc3J3ICAgICAgbTEsIFtyMCtyMV0sIDAKKyAgICBwaW5zcncgICAgICBtMiwgW3IwK3IyKzE0XSwgNworICAgIGxlYSAgICAgICAgIHIxLCBbcjMqM10KKyAgICBsZWEgICAgICAgICByMiwgW3IwK3IzKjRdCisgICAgUFJFRDR4NF9MT1dQQVNTIG0wLCBtMiwgbTEsIG0wCisgICAgSEFERFcgICAgICAgbTAsIG0xCisgICAgcGFkZHcgICAgICAgbTAsIFtwd180XQorICAgIHBzcmx3ICAgICAgIG0wLCAzCisgICAgU1BMQVRXICAgICAgbTAsIG0wLCAwCisgICAgbW92YSBbcjArcjMqMV0sIG0wCisgICAgbW92YSBbcjArcjMqMl0sIG0wCisgICAgbW92YSBbcjArcjEqMV0sIG0wCisgICAgbW92YSBbcjArcjMqNF0sIG0wCisgICAgbW92YSBbcjIrcjMqMV0sIG0wCisgICAgbW92YSBbcjIrcjMqMl0sIG0wCisgICAgbW92YSBbcjIrcjEqMV0sIG0wCisgICAgbW92YSBbcjIrcjMqNF0sIG0wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUFJFRDh4OExfVE9QX0RDCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorUFJFRDh4OExfVE9QX0RDCislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkOHg4bF9kYyhwaXhlbCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsIGludCBoYXNfdG9wcmlnaHQsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorO1RPRE86IHNlZSBpZiBzY2FsYXIgaXMgZmFzdGVyCislbWFjcm8gUFJFRDh4OExfREMgMAorY2dsb2JhbCBwcmVkOHg4bF9kY18xMCwgNCwgNiwgNgorICAgIHN1YiAgICAgICAgIHIwLCByMworICAgIGxlYSAgICAgICAgIHI0LCBbcjArcjMqNF0KKyAgICBsZWEgICAgICAgICByNSwgW3IzKjNdCisgICAgbW92YSAgICAgICAgbTAsIFtyMCtyMyoyLTE2XQorICAgIHB1bnBja2h3ZCAgIG0wLCBbcjArcjMqMS0xNl0KKyAgICBtb3ZhICAgICAgICBtMSwgW3I0K3IzKjAtMTZdCisgICAgcHVucGNraHdkICAgbTEsIFtyMCtyNSoxLTE2XQorICAgIHB1bnBja2hkcSAgIG0xLCBtMAorICAgIG1vdmEgICAgICAgIG0yLCBbcjQrcjMqMi0xNl0KKyAgICBwdW5wY2tod2QgICBtMiwgW3I0K3IzKjEtMTZdCisgICAgbW92YSAgICAgICAgbTMsIFtyNCtyMyo0LTE2XQorICAgIHB1bnBja2h3ZCAgIG0zLCBbcjQrcjUqMS0xNl0KKyAgICBwdW5wY2toZHEgICBtMywgbTIKKyAgICBwdW5wY2tocWRxICBtMywgbTEKKyAgICBtb3ZhICAgICAgICBtMCwgW3IwXQorICAgIHNociAgICAgICAgcjFkLCAxNAorICAgIHNociAgICAgICAgcjJkLCAxMworICAgIG5lZyAgICAgICAgIHIxCisgICAgcHNsbGRxICAgICAgbTEsIG0wLCAyCisgICAgcHNybGRxICAgICAgbTIsIG0wLCAyCisgICAgcGluc3J3ICAgICAgbTEsIFtyMCtyMV0sIDAKKyAgICBwaW5zcncgICAgICBtMiwgW3IwK3IyKzE0XSwgNworICAgIG5vdCAgICAgICAgIHIxCisgICAgYW5kICAgICAgICAgcjEsIHIzCisgICAgcHNsbGRxICAgICAgbTQsIG0zLCAyCisgICAgcHNybGRxICAgICAgbTUsIG0zLCAyCisgICAgcHNodWZsdyAgICAgbTQsIG00LCAxMTEwMDEwMWIKKyAgICBwaW5zcncgICAgICBtNSwgW3IwK3IxLTJdLCA3CisgICAgUFJFRDR4NF9MT1dQQVNTIG0zLCBtNCwgbTUsIG0zCisgICAgUFJFRDR4NF9MT1dQQVNTIG0wLCBtMiwgbTEsIG0wCisgICAgcGFkZHcgICAgICAgbTAsIG0zCisgICAgSEFERFcgICAgICAgbTAsIG0xCisgICAgcGFkZHcgICAgICAgbTAsIFtwd184XQorICAgIHBzcmx3ICAgICAgIG0wLCA0CisgICAgU1BMQVRXICAgICAgbTAsIG0wCisgICAgbW92YSBbcjArcjMqMV0sIG0wCisgICAgbW92YSBbcjArcjMqMl0sIG0wCisgICAgbW92YSBbcjArcjUqMV0sIG0wCisgICAgbW92YSBbcjArcjMqNF0sIG0wCisgICAgbW92YSBbcjQrcjMqMV0sIG0wCisgICAgbW92YSBbcjQrcjMqMl0sIG0wCisgICAgbW92YSBbcjQrcjUqMV0sIG0wCisgICAgbW92YSBbcjQrcjMqNF0sIG0wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUFJFRDh4OExfREMKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitQUkVEOHg4TF9EQworJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQ4eDhsX3ZlcnRpY2FsKHBpeGVsICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gUFJFRDh4OExfVkVSVElDQUwgMAorY2dsb2JhbCBwcmVkOHg4bF92ZXJ0aWNhbF8xMCwgNCwgNCwgNgorICAgIHN1YiAgICAgICAgIHIwLCByMworICAgIG1vdmEgICAgICAgIG0wLCBbcjBdCisgICAgc2hyICAgICAgICByMWQsIDE0CisgICAgc2hyICAgICAgICByMmQsIDEzCisgICAgbmVnICAgICAgICAgcjEKKyAgICBwc2xsZHEgICAgICBtMSwgbTAsIDIKKyAgICBwc3JsZHEgICAgICBtMiwgbTAsIDIKKyAgICBwaW5zcncgICAgICBtMSwgW3IwK3IxXSwgMAorICAgIHBpbnNydyAgICAgIG0yLCBbcjArcjIrMTRdLCA3CisgICAgbGVhICAgICAgICAgcjEsIFtyMyozXQorICAgIGxlYSAgICAgICAgIHIyLCBbcjArcjMqNF0KKyAgICBQUkVENHg0X0xPV1BBU1MgbTAsIG0yLCBtMSwgbTAKKyAgICBtb3ZhIFtyMCtyMyoxXSwgbTAKKyAgICBtb3ZhIFtyMCtyMyoyXSwgbTAKKyAgICBtb3ZhIFtyMCtyMSoxXSwgbTAKKyAgICBtb3ZhIFtyMCtyMyo0XSwgbTAKKyAgICBtb3ZhIFtyMityMyoxXSwgbTAKKyAgICBtb3ZhIFtyMityMyoyXSwgbTAKKyAgICBtb3ZhIFtyMityMSoxXSwgbTAKKyAgICBtb3ZhIFtyMityMyo0XSwgbTAKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitQUkVEOHg4TF9WRVJUSUNBTAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK1BSRUQ4eDhMX1ZFUlRJQ0FMCislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDh4OGxfaG9yaXpvbnRhbCh1aW50OF90ICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBQUkVEOHg4TF9IT1JJWk9OVEFMIDAKK2NnbG9iYWwgcHJlZDh4OGxfaG9yaXpvbnRhbF8xMCwgNCwgNCwgNQorICAgIG1vdmEgICAgICAgIG0wLCBbcjAtMTZdCisgICAgc2hyICAgICAgICByMWQsIDE0CisgICAgZGVjICAgICAgICAgcjEKKyAgICBhbmQgICAgICAgICByMSwgcjMKKyAgICBzdWIgICAgICAgICByMSwgcjMKKyAgICBwdW5wY2tod2QgICBtMCwgW3IwK3IxLTE2XQorICAgIG1vdmEgICAgICAgIG0xLCBbcjArcjMqMi0xNl0KKyAgICBwdW5wY2tod2QgICBtMSwgW3IwK3IzKjEtMTZdCisgICAgbGVhICAgICAgICAgcjIsIFtyMCtyMyo0XQorICAgIGxlYSAgICAgICAgIHIxLCBbcjMqM10KKyAgICBwdW5wY2toZHEgICBtMSwgbTAKKyAgICBtb3ZhICAgICAgICBtMiwgW3IyK3IzKjAtMTZdCisgICAgcHVucGNraHdkICAgbTIsIFtyMCtyMS0xNl0KKyAgICBtb3ZhICAgICAgICBtMywgW3IyK3IzKjItMTZdCisgICAgcHVucGNraHdkICAgbTMsIFtyMityMyoxLTE2XQorICAgIHB1bnBja2hkcSAgIG0zLCBtMgorICAgIHB1bnBja2hxZHEgIG0zLCBtMQorICAgIFBBTElHTlIgICAgIG00LCBtMywgW3IyK3IxLTE2XSwgMTQsIG0wCisgICAgcHNsbGRxICAgICAgbTAsIG00LCAyCisgICAgcHNodWZsdyAgICAgbTAsIG0wLCAxMTEwMDEwMWIKKyAgICBQUkVENHg0X0xPV1BBU1MgbTQsIG0zLCBtMCwgbTQKKyAgICBwdW5wY2tod2QgICBtMywgbTQsIG00CisgICAgcHVucGNrbHdkICAgbTQsIG00CisgICAgcHNodWZkICAgICAgbTAsIG0zLCAweGZmCisgICAgcHNodWZkICAgICAgbTEsIG0zLCAweGFhCisgICAgcHNodWZkICAgICAgbTIsIG0zLCAweDU1CisgICAgcHNodWZkICAgICAgbTMsIG0zLCAweDAwCisgICAgbW92YSBbcjArcjMqMF0sIG0wCisgICAgbW92YSBbcjArcjMqMV0sIG0xCisgICAgbW92YSBbcjArcjMqMl0sIG0yCisgICAgbW92YSBbcjArcjEqMV0sIG0zCisgICAgcHNodWZkICAgICAgbTAsIG00LCAweGZmCisgICAgcHNodWZkICAgICAgbTEsIG00LCAweGFhCisgICAgcHNodWZkICAgICAgbTIsIG00LCAweDU1CisgICAgcHNodWZkICAgICAgbTMsIG00LCAweDAwCisgICAgbW92YSBbcjIrcjMqMF0sIG0wCisgICAgbW92YSBbcjIrcjMqMV0sIG0xCisgICAgbW92YSBbcjIrcjMqMl0sIG0yCisgICAgbW92YSBbcjIrcjEqMV0sIG0zCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUFJFRDh4OExfSE9SSVpPTlRBTAorSU5JVF9YTU0gc3NzZTMKK1BSRUQ4eDhMX0hPUklaT05UQUwKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitQUkVEOHg4TF9IT1JJWk9OVEFMCislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDh4OGxfZG93bl9sZWZ0KHBpeGVsICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIFBSRUQ4eDhMX0RPV05fTEVGVCAwCitjZ2xvYmFsIHByZWQ4eDhsX2Rvd25fbGVmdF8xMCwgNCwgNCwgNworICAgIHN1YiAgICAgICAgIHIwLCByMworICAgIG1vdmEgICAgICAgIG0zLCBbcjBdCisgICAgc2hyICAgICAgICByMWQsIDE0CisgICAgbmVnICAgICAgICAgcjEKKyAgICBzaHIgICAgICAgIHIyZCwgMTMKKyAgICBwc2xsZHEgICAgICBtMSwgbTMsIDIKKyAgICBwc3JsZHEgICAgICBtMiwgbTMsIDIKKyAgICBwaW5zcncgICAgICBtMSwgW3IwK3IxXSwgMAorICAgIHBpbnNydyAgICAgIG0yLCBbcjArcjIrMTRdLCA3CisgICAgUFJFRDR4NF9MT1dQQVNTIG02LCBtMiwgbTEsIG0zCisgICAganogLmZpeF90ciA7IGZsYWdzIGZyb20gc2hyIHIyZAorICAgIG1vdmEgICAgICAgIG0xLCBbcjArMTZdCisgICAgcHNybGRxICAgICAgbTUsIG0xLCAyCisgICAgUEFMSUdOUiAgICAgbTIsIG0xLCBtMywgMTQsIG0zCisgICAgcHNodWZodyAgICAgbTUsIG01LCAxMDEwMDEwMGIKKyAgICBQUkVENHg0X0xPV1BBU1MgbTEsIG0yLCBtNSwgbTEKKy5kb190b3ByaWdodDoKKyAgICBsZWEgICAgICAgICByMSwgW3IzKjNdCisgICAgcHNybGRxICAgICAgbTUsIG0xLCAxNAorICAgIGxlYSAgICAgICAgIHIyLCBbcjArcjMqNF0KKyAgICBQQUxJR05SICAgICBtMiwgbTEsIG02LCAgMiwgbTAKKyAgICBQQUxJR05SICAgICBtMywgbTEsIG02LCAxNCwgbTAKKyAgICBQQUxJR05SICAgICBtNSwgbTEsICAyLCBtMAorICAgIHBzbGxkcSAgICAgIG00LCBtNiwgMgorICAgIFBSRUQ0eDRfTE9XUEFTUyBtNiwgbTQsIG0yLCBtNgorICAgIFBSRUQ0eDRfTE9XUEFTUyBtMSwgbTMsIG01LCBtMQorICAgIG1vdmEgW3IyK3IzKjRdLCBtMQorICAgIFBBTElHTlIgICAgIG0xLCBtNiwgMTQsIG0yCisgICAgcHNsbGRxICAgICAgbTYsIDIKKyAgICBtb3ZhIFtyMityMSoxXSwgbTEKKyAgICBQQUxJR05SICAgICBtMSwgbTYsIDE0LCBtMgorICAgIHBzbGxkcSAgICAgIG02LCAyCisgICAgbW92YSBbcjIrcjMqMl0sIG0xCisgICAgUEFMSUdOUiAgICAgbTEsIG02LCAxNCwgbTIKKyAgICBwc2xsZHEgICAgICBtNiwgMgorICAgIG1vdmEgW3IyK3IzKjFdLCBtMQorICAgIFBBTElHTlIgICAgIG0xLCBtNiwgMTQsIG0yCisgICAgcHNsbGRxICAgICAgbTYsIDIKKyAgICBtb3ZhIFtyMCtyMyo0XSwgbTEKKyAgICBQQUxJR05SICAgICBtMSwgbTYsIDE0LCBtMgorICAgIHBzbGxkcSAgICAgIG02LCAyCisgICAgbW92YSBbcjArcjEqMV0sIG0xCisgICAgUEFMSUdOUiAgICAgbTEsIG02LCAxNCwgbTIKKyAgICBwc2xsZHEgICAgICBtNiwgMgorICAgIG1vdmEgW3IwK3IzKjJdLCBtMQorICAgIFBBTElHTlIgICAgIG0xLCBtNiwgMTQsIG02CisgICAgbW92YSBbcjArcjMqMV0sIG0xCisgICAgUkVUCisuZml4X3RyOgorICAgIHB1bnBja2h3ZCAgIG0zLCBtMworICAgIHBzaHVmZCAgICAgIG0xLCBtMywgMHhGRgorICAgIGptcCAuZG9fdG9wcmlnaHQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitQUkVEOHg4TF9ET1dOX0xFRlQKK0lOSVRfWE1NIHNzc2UzCitQUkVEOHg4TF9ET1dOX0xFRlQKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitQUkVEOHg4TF9ET1dOX0xFRlQKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkOHg4bF9kb3duX3JpZ2h0KHBpeGVsICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBQUkVEOHg4TF9ET1dOX1JJR0hUIDAKKzsgc3RhbmRhcmQgZm9yYmlkcyB0aGlzIHdoZW4gaGFzX3RvcGxlZnQgaXMgZmFsc2UKKzsgbm8gbmVlZCB0byBjaGVjaworY2dsb2JhbCBwcmVkOHg4bF9kb3duX3JpZ2h0XzEwLCA0LCA1LCA4CisgICAgc3ViICAgICAgICAgcjAsIHIzCisgICAgbGVhICAgICAgICAgcjQsIFtyMCtyMyo0XQorICAgIGxlYSAgICAgICAgIHIxLCBbcjMqM10KKyAgICBtb3ZhICAgICAgICBtMCwgW3IwK3IzKjEtMTZdCisgICAgcHVucGNraHdkICAgbTAsIFtyMCtyMyowLTE2XQorICAgIG1vdmEgICAgICAgIG0xLCBbcjArcjEqMS0xNl0KKyAgICBwdW5wY2tod2QgICBtMSwgW3IwK3IzKjItMTZdCisgICAgcHVucGNraGRxICAgbTEsIG0wCisgICAgbW92YSAgICAgICAgbTIsIFtyNCtyMyoxLTE2XQorICAgIHB1bnBja2h3ZCAgIG0yLCBbcjQrcjMqMC0xNl0KKyAgICBtb3ZhICAgICAgICBtMywgW3I0K3IxKjEtMTZdCisgICAgcHVucGNraHdkICAgbTMsIFtyNCtyMyoyLTE2XQorICAgIHB1bnBja2hkcSAgIG0zLCBtMgorICAgIHB1bnBja2hxZHEgIG0zLCBtMQorICAgIG1vdmEgICAgICAgIG0wLCBbcjQrcjMqNC0xNl0KKyAgICBtb3ZhICAgICAgICBtMSwgW3IwXQorICAgIFBBTElHTlIgICAgIG00LCBtMywgbTAsIDE0LCBtMAorICAgIFBBTElHTlIgICAgIG0xLCBtMywgIDIsIG0yCisgICAgcHNsbGRxICAgICAgbTAsIG00LCAyCisgICAgcHNodWZsdyAgICAgbTAsIG0wLCAxMTEwMDEwMWIKKyAgICBQUkVENHg0X0xPV1BBU1MgbTYsIG0xLCBtNCwgbTMKKyAgICBQUkVENHg0X0xPV1BBU1MgbTQsIG0zLCBtMCwgbTQKKyAgICBtb3ZhICAgICAgICBtMywgW3IwXQorICAgIHNociAgICAgICAgcjJkLCAxMworICAgIHBzbGxkcSAgICAgIG0xLCBtMywgMgorICAgIHBzcmxkcSAgICAgIG0yLCBtMywgMgorICAgIHBpbnNydyAgICAgIG0xLCBbcjAtMl0sIDAKKyAgICBwaW5zcncgICAgICBtMiwgW3IwK3IyKzE0XSwgNworICAgIFBSRUQ0eDRfTE9XUEFTUyBtMywgbTIsIG0xLCBtMworICAgIFBBTElHTlIgICAgIG0yLCBtMywgbTYsICAyLCBtMAorICAgIFBBTElHTlIgICAgIG01LCBtMywgbTYsIDE0LCBtMAorICAgIHBzcmxkcSAgICAgIG03LCBtMywgMgorICAgIFBSRUQ0eDRfTE9XUEFTUyBtNiwgbTQsIG0yLCBtNgorICAgIFBSRUQ0eDRfTE9XUEFTUyBtMywgbTUsIG03LCBtMworICAgIG1vdmEgW3I0K3IzKjRdLCBtNgorICAgIFBBTElHTlIgICAgIG0zLCBtNiwgMTQsIG0yCisgICAgcHNsbGRxICAgICAgbTYsIDIKKyAgICBtb3ZhIFtyMCtyMyoxXSwgbTMKKyAgICBQQUxJR05SICAgICBtMywgbTYsIDE0LCBtMgorICAgIHBzbGxkcSAgICAgIG02LCAyCisgICAgbW92YSBbcjArcjMqMl0sIG0zCisgICAgUEFMSUdOUiAgICAgbTMsIG02LCAxNCwgbTIKKyAgICBwc2xsZHEgICAgICBtNiwgMgorICAgIG1vdmEgW3IwK3IxKjFdLCBtMworICAgIFBBTElHTlIgICAgIG0zLCBtNiwgMTQsIG0yCisgICAgcHNsbGRxICAgICAgbTYsIDIKKyAgICBtb3ZhIFtyMCtyMyo0XSwgbTMKKyAgICBQQUxJR05SICAgICBtMywgbTYsIDE0LCBtMgorICAgIHBzbGxkcSAgICAgIG02LCAyCisgICAgbW92YSBbcjQrcjMqMV0sIG0zCisgICAgUEFMSUdOUiAgICAgbTMsIG02LCAxNCwgbTIKKyAgICBwc2xsZHEgICAgICBtNiwgMgorICAgIG1vdmEgW3I0K3IzKjJdLCBtMworICAgIFBBTElHTlIgICAgIG0zLCBtNiwgMTQsIG02CisgICAgbW92YSBbcjQrcjEqMV0sIG0zCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUFJFRDh4OExfRE9XTl9SSUdIVAorSU5JVF9YTU0gc3NzZTMKK1BSRUQ4eDhMX0RPV05fUklHSFQKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitQUkVEOHg4TF9ET1dOX1JJR0hUCislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDh4OGxfdmVydGljYWxfcmlnaHQocGl4ZWwgKnNyYywgaW50IGhhc190b3BsZWZ0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBQUkVEOHg4TF9WRVJUSUNBTF9SSUdIVCAwCis7IGxpa2V3aXNlIHdpdGggOHg4bF9kb3duX3JpZ2h0CitjZ2xvYmFsIHByZWQ4eDhsX3ZlcnRpY2FsX3JpZ2h0XzEwLCA0LCA1LCA3CisgICAgc3ViICAgICAgICAgcjAsIHIzCisgICAgbGVhICAgICAgICAgcjQsIFtyMCtyMyo0XQorICAgIGxlYSAgICAgICAgIHIxLCBbcjMqM10KKyAgICBtb3ZhICAgICAgICBtMCwgW3IwK3IzKjEtMTZdCisgICAgcHVucGNraHdkICAgbTAsIFtyMCtyMyowLTE2XQorICAgIG1vdmEgICAgICAgIG0xLCBbcjArcjEqMS0xNl0KKyAgICBwdW5wY2tod2QgICBtMSwgW3IwK3IzKjItMTZdCisgICAgcHVucGNraGRxICAgbTEsIG0wCisgICAgbW92YSAgICAgICAgbTIsIFtyNCtyMyoxLTE2XQorICAgIHB1bnBja2h3ZCAgIG0yLCBbcjQrcjMqMC0xNl0KKyAgICBtb3ZhICAgICAgICBtMywgW3I0K3IxKjEtMTZdCisgICAgcHVucGNraHdkICAgbTMsIFtyNCtyMyoyLTE2XQorICAgIHB1bnBja2hkcSAgIG0zLCBtMgorICAgIHB1bnBja2hxZHEgIG0zLCBtMQorICAgIG1vdmEgICAgICAgIG0wLCBbcjQrcjMqNC0xNl0KKyAgICBtb3ZhICAgICAgICBtMSwgW3IwXQorICAgIFBBTElHTlIgICAgIG00LCBtMywgbTAsIDE0LCBtMAorICAgIFBBTElHTlIgICAgIG0xLCBtMywgIDIsIG0yCisgICAgUFJFRDR4NF9MT1dQQVNTIG0zLCBtMSwgbTQsIG0zCisgICAgbW92YSAgICAgICAgbTIsIFtyMF0KKyAgICBzaHIgICAgICAgIHIyZCwgMTMKKyAgICBwc2xsZHEgICAgICBtMSwgbTIsIDIKKyAgICBwc3JsZHEgICAgICBtNSwgbTIsIDIKKyAgICBwaW5zcncgICAgICBtMSwgW3IwLTJdLCAwCisgICAgcGluc3J3ICAgICAgbTUsIFtyMCtyMisxNF0sIDcKKyAgICBQUkVENHg0X0xPV1BBU1MgbTIsIG01LCBtMSwgbTIKKyAgICBQQUxJR05SICAgICBtNiwgbTIsIG0zLCAxMiwgbTEKKyAgICBQQUxJR05SICAgICBtNSwgbTIsIG0zLCAxNCwgbTAKKyAgICBQUkVENHg0X0xPV1BBU1MgbTAsIG02LCBtMiwgbTUKKyAgICBwYXZndyAgICAgICBtMiwgbTUKKyAgICBtb3ZhIFtyMCtyMyoyXSwgbTAKKyAgICBtb3ZhIFtyMCtyMyoxXSwgbTIKKyAgICBwc2xsZHEgICAgICBtNiwgbTMsIDQKKyAgICBwc2xsZHEgICAgICBtMSwgbTMsIDIKKyAgICBQUkVENHg0X0xPV1BBU1MgbTEsIG0zLCBtNiwgbTEKKyAgICBQQUxJR05SICAgICBtMiwgbTEsIDE0LCBtNAorICAgIG1vdmEgW3IwK3IxKjFdLCBtMgorICAgIHBzbGxkcSAgICAgIG0xLCAyCisgICAgUEFMSUdOUiAgICAgbTAsIG0xLCAxNCwgbTMKKyAgICBtb3ZhIFtyMCtyMyo0XSwgbTAKKyAgICBwc2xsZHEgICAgICBtMSwgMgorICAgIFBBTElHTlIgICAgIG0yLCBtMSwgMTQsIG00CisgICAgbW92YSBbcjQrcjMqMV0sIG0yCisgICAgcHNsbGRxICAgICAgbTEsIDIKKyAgICBQQUxJR05SICAgICBtMCwgbTEsIDE0LCBtMworICAgIG1vdmEgW3I0K3IzKjJdLCBtMAorICAgIHBzbGxkcSAgICAgIG0xLCAyCisgICAgUEFMSUdOUiAgICAgbTIsIG0xLCAxNCwgbTQKKyAgICBtb3ZhIFtyNCtyMSoxXSwgbTIKKyAgICBwc2xsZHEgICAgICBtMSwgMgorICAgIFBBTElHTlIgICAgIG0wLCBtMSwgMTQsIG0xCisgICAgbW92YSBbcjQrcjMqNF0sIG0wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUFJFRDh4OExfVkVSVElDQUxfUklHSFQKK0lOSVRfWE1NIHNzc2UzCitQUkVEOHg4TF9WRVJUSUNBTF9SSUdIVAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK1BSRUQ4eDhMX1ZFUlRJQ0FMX1JJR0hUCislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcHJlZDh4OGxfaG9yaXpvbnRhbF91cChwaXhlbCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gUFJFRDh4OExfSE9SSVpPTlRBTF9VUCAwCitjZ2xvYmFsIHByZWQ4eDhsX2hvcml6b250YWxfdXBfMTAsIDQsIDQsIDYKKyAgICBtb3ZhICAgICAgICBtMCwgW3IwK3IzKjAtMTZdCisgICAgcHVucGNraHdkICAgbTAsIFtyMCtyMyoxLTE2XQorICAgIHNociAgICAgICAgcjFkLCAxNAorICAgIGRlYyAgICAgICAgIHIxCisgICAgYW5kICAgICAgICAgcjEsIHIzCisgICAgc3ViICAgICAgICAgcjEsIHIzCisgICAgbW92YSAgICAgICAgbTQsIFtyMCtyMSoxLTE2XQorICAgIGxlYSAgICAgICAgIHIxLCBbcjMqM10KKyAgICBsZWEgICAgICAgICByMiwgW3IwK3IzKjRdCisgICAgbW92YSAgICAgICAgbTEsIFtyMCtyMyoyLTE2XQorICAgIHB1bnBja2h3ZCAgIG0xLCBbcjArcjEqMS0xNl0KKyAgICBwdW5wY2toZHEgICBtMCwgbTEKKyAgICBtb3ZhICAgICAgICBtMiwgW3IyK3IzKjAtMTZdCisgICAgcHVucGNraHdkICAgbTIsIFtyMityMyoxLTE2XQorICAgIG1vdmEgICAgICAgIG0zLCBbcjIrcjMqMi0xNl0KKyAgICBwdW5wY2tod2QgICBtMywgW3IyK3IxKjEtMTZdCisgICAgcHVucGNraGRxICAgbTIsIG0zCisgICAgcHVucGNraHFkcSAgbTAsIG0yCisgICAgUEFMSUdOUiAgICAgbTEsIG0wLCBtNCwgMTQsIG00CisgICAgcHNybGRxICAgICAgbTIsIG0wLCAyCisgICAgcHNodWZodyAgICAgbTIsIG0yLCAxMDEwMDEwMGIKKyAgICBQUkVENHg0X0xPV1BBU1MgbTAsIG0xLCBtMiwgbTAKKyAgICBwc3JsZHEgICAgICBtMSwgbTAsIDIKKyAgICBwc3JsZHEgICAgICBtMiwgbTAsIDQKKyAgICBwc2h1Zmh3ICAgICBtMSwgbTEsIDEwMTAwMTAwYgorICAgIHBzaHVmaHcgICAgIG0yLCBtMiwgMDEwMTAxMDBiCisgICAgcGF2Z3cgICAgICAgbTQsIG0wLCBtMQorICAgIFBSRUQ0eDRfTE9XUEFTUyBtMSwgbTIsIG0wLCBtMQorICAgIHB1bnBja2h3ZCAgIG01LCBtNCwgbTEKKyAgICBwdW5wY2tsd2QgICBtNCwgbTEKKyAgICBtb3ZhIFtyMityMyowXSwgbTUKKyAgICBtb3ZhIFtyMCtyMyowXSwgbTQKKyAgICBwc2h1ZmQgICAgICBtMCwgbTUsIDExMTExMDAxYgorICAgIHBzaHVmZCAgICAgIG0xLCBtNSwgMTExMTExMTBiCisgICAgcHNodWZkICAgICAgbTIsIG01LCAxMTExMTExMWIKKyAgICBtb3ZhIFtyMityMyoxXSwgbTAKKyAgICBtb3ZhIFtyMityMyoyXSwgbTEKKyAgICBtb3ZhIFtyMityMSoxXSwgbTIKKyAgICBQQUxJR05SICAgICBtMiwgbTUsIG00LCA0LCBtMAorICAgIFBBTElHTlIgICAgIG0zLCBtNSwgbTQsIDgsIG0xCisgICAgUEFMSUdOUiAgICAgbTUsIG01LCBtNCwgMTIsIG00CisgICAgbW92YSBbcjArcjMqMV0sIG0yCisgICAgbW92YSBbcjArcjMqMl0sIG0zCisgICAgbW92YSBbcjArcjEqMV0sIG01CisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUFJFRDh4OExfSE9SSVpPTlRBTF9VUAorSU5JVF9YTU0gc3NzZTMKK1BSRUQ4eDhMX0hPUklaT05UQUxfVVAKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitQUkVEOHg4TF9IT1JJWk9OVEFMX1VQCislZW5kaWYKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkMTZ4MTZfdmVydGljYWwocGl4ZWwgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIE1PVjE2IDMtNQorICAgIG1vdmEgWyUxKyAgICAgMF0sICUyCisgICAgbW92YSBbJTErbW1zaXplXSwgJTMKKyVpZiBtbXNpemU9PTgKKyAgICBtb3ZhIFslMSsgICAgMTZdLCAlNAorICAgIG1vdmEgWyUxKyAgICAyNF0sICU1CislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gUFJFRDE2eDE2X1ZFUlRJQ0FMIDAKK2NnbG9iYWwgcHJlZDE2eDE2X3ZlcnRpY2FsXzEwLCAyLCAzCisgICAgc3ViICAgcjAsIHIxCisgICAgbW92ICByMmQsIDgKKyAgICBtb3ZhICBtMCwgW3IwKyAwXQorICAgIG1vdmEgIG0xLCBbcjArbW1zaXplXQorJWlmIG1tc2l6ZT09OAorICAgIG1vdmEgIG0yLCBbcjArMTZdCisgICAgbW92YSAgbTMsIFtyMCsyNF0KKyVlbmRpZgorLmxvb3A6CisgICAgTU9WMTYgcjArcjEqMSwgbTAsIG0xLCBtMiwgbTMKKyAgICBNT1YxNiByMCtyMSoyLCBtMCwgbTEsIG0yLCBtMworICAgIGxlYSAgIHIwLCBbcjArcjEqMl0KKyAgICBkZWMgICByMmQKKyAgICBqZyAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BSRUQxNngxNl9WRVJUSUNBTAorSU5JVF9YTU0gc3NlMgorUFJFRDE2eDE2X1ZFUlRJQ0FMCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQxNngxNl9ob3Jpem9udGFsKHBpeGVsICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBQUkVEMTZ4MTZfSE9SSVpPTlRBTCAwCitjZ2xvYmFsIHByZWQxNngxNl9ob3Jpem9udGFsXzEwLCAyLCAzCisgICAgbW92ICAgcjJkLCA4Cisudmxvb3A6CisgICAgbW92ZCAgIG0wLCBbcjArcjEqMC00XQorICAgIG1vdmQgICBtMSwgW3IwK3IxKjEtNF0KKyAgICBTUExBVFcgbTAsIG0wLCAxCisgICAgU1BMQVRXIG0xLCBtMSwgMQorICAgIE1PVjE2ICByMCtyMSowLCBtMCwgbTAsIG0wLCBtMAorICAgIE1PVjE2ICByMCtyMSoxLCBtMSwgbTEsIG0xLCBtMQorICAgIGxlYSAgICByMCwgW3IwK3IxKjJdCisgICAgZGVjICAgIHIyZAorICAgIGpnIC52bG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BSRUQxNngxNl9IT1JJWk9OVEFMCitJTklUX1hNTSBzc2UyCitQUkVEMTZ4MTZfSE9SSVpPTlRBTAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkMTZ4MTZfZGMocGl4ZWwgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIFBSRUQxNngxNl9EQyAwCitjZ2xvYmFsIHByZWQxNngxNl9kY18xMCwgMiwgNgorICAgIG1vdiAgICAgICAgcjUsIHIwCisgICAgc3ViICAgICAgICByMCwgcjEKKyAgICBtb3ZhICAgICAgIG0wLCBbcjArMF0KKyAgICBwYWRkdyAgICAgIG0wLCBbcjArbW1zaXplXQorJWlmIG1tc2l6ZT09OAorICAgIHBhZGR3ICAgICAgbTAsIFtyMCsxNl0KKyAgICBwYWRkdyAgICAgIG0wLCBbcjArMjRdCislZW5kaWYKKyAgICBIQUREVyAgICAgIG0wLCBtMgorCisgICAgbGVhICAgICAgICByMCwgW3IwK3IxLTJdCisgICAgbW92enggICAgIHIzZCwgd29yZCBbcjBdCisgICAgbW92enggICAgIHI0ZCwgd29yZCBbcjArcjFdCislcmVwIDcKKyAgICBsZWEgICAgICAgIHIwLCBbcjArcjEqMl0KKyAgICBtb3Z6eCAgICAgcjJkLCB3b3JkIFtyMF0KKyAgICBhZGQgICAgICAgcjNkLCByMmQKKyAgICBtb3Z6eCAgICAgcjJkLCB3b3JkIFtyMCtyMV0KKyAgICBhZGQgICAgICAgcjRkLCByMmQKKyVlbmRyZXAKKyAgICBsZWEgICAgICAgcjNkLCBbcjMrcjQrMTZdCisKKyAgICBtb3ZkICAgICAgIG0xLCByM2QKKyAgICBwYWRkdyAgICAgIG0wLCBtMQorICAgIHBzcmx3ICAgICAgbTAsIDUKKyAgICBTUExBVFcgICAgIG0wLCBtMAorICAgIG1vdiAgICAgICByM2QsIDgKKy5sb29wOgorICAgIE1PVjE2IHI1K3IxKjAsIG0wLCBtMCwgbTAsIG0wCisgICAgTU9WMTYgcjUrcjEqMSwgbTAsIG0wLCBtMCwgbTAKKyAgICBsZWEgICAgICAgIHI1LCBbcjUrcjEqMl0KKyAgICBkZWMgICAgICAgcjNkCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitQUkVEMTZ4MTZfREMKK0lOSVRfWE1NIHNzZTIKK1BSRUQxNngxNl9EQworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkMTZ4MTZfdG9wX2RjKHBpeGVsICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBQUkVEMTZ4MTZfVE9QX0RDIDAKK2NnbG9iYWwgcHJlZDE2eDE2X3RvcF9kY18xMCwgMiwgMworICAgIHN1YiAgICAgICAgcjAsIHIxCisgICAgbW92YSAgICAgICBtMCwgW3IwKzBdCisgICAgcGFkZHcgICAgICBtMCwgW3IwK21tc2l6ZV0KKyVpZiBtbXNpemU9PTgKKyAgICBwYWRkdyAgICAgIG0wLCBbcjArMTZdCisgICAgcGFkZHcgICAgICBtMCwgW3IwKzI0XQorJWVuZGlmCisgICAgSEFERFcgICAgICBtMCwgbTIKKworICAgIFNQTEFUVyAgICAgbTAsIG0wCisgICAgcGFkZHcgICAgICBtMCwgW3B3XzhdCisgICAgcHNybHcgICAgICBtMCwgNAorICAgIG1vdiAgICAgICByMmQsIDgKKy5sb29wOgorICAgIE1PVjE2IHIwK3IxKjEsIG0wLCBtMCwgbTAsIG0wCisgICAgTU9WMTYgcjArcjEqMiwgbTAsIG0wLCBtMCwgbTAKKyAgICBsZWEgICAgICAgIHIwLCBbcjArcjEqMl0KKyAgICBkZWMgICAgICAgcjJkCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitQUkVEMTZ4MTZfVE9QX0RDCitJTklUX1hNTSBzc2UyCitQUkVEMTZ4MTZfVE9QX0RDCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ByZWQxNngxNl9sZWZ0X2RjKHBpeGVsICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBQUkVEMTZ4MTZfTEVGVF9EQyAwCitjZ2xvYmFsIHByZWQxNngxNl9sZWZ0X2RjXzEwLCAyLCA2CisgICAgbW92ICAgICAgICByNSwgcjAKKworICAgIHN1YiAgICAgICAgcjAsIDIKKyAgICBtb3Z6eCAgICAgcjNkLCB3b3JkIFtyMF0KKyAgICBtb3Z6eCAgICAgcjRkLCB3b3JkIFtyMCtyMV0KKyVyZXAgNworICAgIGxlYSAgICAgICAgcjAsIFtyMCtyMSoyXQorICAgIG1vdnp4ICAgICByMmQsIHdvcmQgW3IwXQorICAgIGFkZCAgICAgICByM2QsIHIyZAorICAgIG1vdnp4ICAgICByMmQsIHdvcmQgW3IwK3IxXQorICAgIGFkZCAgICAgICByNGQsIHIyZAorJWVuZHJlcAorICAgIGxlYSAgICAgICByM2QsIFtyMytyNCs4XQorICAgIHNociAgICAgICByM2QsIDQKKworICAgIG1vdmQgICAgICAgbTAsIHIzZAorICAgIFNQTEFUVyAgICAgbTAsIG0wCisgICAgbW92ICAgICAgIHIzZCwgOAorLmxvb3A6CisgICAgTU9WMTYgcjUrcjEqMCwgbTAsIG0wLCBtMCwgbTAKKyAgICBNT1YxNiByNStyMSoxLCBtMCwgbTAsIG0wLCBtMAorICAgIGxlYSAgICAgICAgcjUsIFtyNStyMSoyXQorICAgIGRlYyAgICAgICByM2QKKyAgICBqZyAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BSRUQxNngxNl9MRUZUX0RDCitJTklUX1hNTSBzc2UyCitQUkVEMTZ4MTZfTEVGVF9EQworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkMTZ4MTZfMTI4X2RjKHBpeGVsICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBQUkVEMTZ4MTZfMTI4X0RDIDAKK2NnbG9iYWwgcHJlZDE2eDE2XzEyOF9kY18xMCwgMiwzCisgICAgbW92YSAgICAgICBtMCwgW3B3XzUxMl0KKyAgICBtb3YgICAgICAgcjJkLCA4CisubG9vcDoKKyAgICBNT1YxNiByMCtyMSowLCBtMCwgbTAsIG0wLCBtMAorICAgIE1PVjE2IHIwK3IxKjEsIG0wLCBtMCwgbTAsIG0wCisgICAgbGVhICAgICAgICByMCwgW3IwK3IxKjJdCisgICAgZGVjICAgICAgIHIyZAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUFJFRDE2eDE2XzEyOF9EQworSU5JVF9YTU0gc3NlMgorUFJFRDE2eDE2XzEyOF9EQwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfaW50cmFwcmVkX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4YjkyZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZF9pbml0LmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgRmlvbmEgR2xhc2VyIDxmaW9uYUB4MjY0LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9oMjY0cHJlZC5oIgorCisjZGVmaW5lIFBSRUQ0eDQoVFlQRSwgREVQVEgsIE9QVCkgXAordm9pZCBmZl9wcmVkNHg0XyAjIyBUWVBFICMjIF8gIyMgREVQVEggIyMgXyAjIyBPUFQgKHVpbnQ4X3QgKnNyYywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7CisKK1BSRUQ0eDQoZGMsIDEwLCBtbXhleHQpCitQUkVENHg0KGRvd25fbGVmdCwgMTAsIHNzZTIpCitQUkVENHg0KGRvd25fbGVmdCwgMTAsIGF2eCkKK1BSRUQ0eDQoZG93bl9yaWdodCwgMTAsIHNzZTIpCitQUkVENHg0KGRvd25fcmlnaHQsIDEwLCBzc3NlMykKK1BSRUQ0eDQoZG93bl9yaWdodCwgMTAsIGF2eCkKK1BSRUQ0eDQodmVydGljYWxfbGVmdCwgMTAsIHNzZTIpCitQUkVENHg0KHZlcnRpY2FsX2xlZnQsIDEwLCBhdngpCitQUkVENHg0KHZlcnRpY2FsX3JpZ2h0LCAxMCwgc3NlMikKK1BSRUQ0eDQodmVydGljYWxfcmlnaHQsIDEwLCBzc3NlMykKK1BSRUQ0eDQodmVydGljYWxfcmlnaHQsIDEwLCBhdngpCitQUkVENHg0KGhvcml6b250YWxfdXAsIDEwLCBtbXhleHQpCitQUkVENHg0KGhvcml6b250YWxfZG93biwgMTAsIHNzZTIpCitQUkVENHg0KGhvcml6b250YWxfZG93biwgMTAsIHNzc2UzKQorUFJFRDR4NChob3Jpem9udGFsX2Rvd24sIDEwLCBhdngpCisKKyNkZWZpbmUgUFJFRDh4OChUWVBFLCBERVBUSCwgT1BUKSBcCit2b2lkIGZmX3ByZWQ4eDhfICMjIFRZUEUgIyMgXyAjIyBERVBUSCAjIyBfICMjIE9QVCAodWludDhfdCAqc3JjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7CisKK1BSRUQ4eDgoZGMsIDEwLCBtbXhleHQpCitQUkVEOHg4KGRjLCAxMCwgc3NlMikKK1BSRUQ4eDgodG9wX2RjLCAxMCwgc3NlMikKK1BSRUQ4eDgocGxhbmUsIDEwLCBzc2UyKQorUFJFRDh4OCh2ZXJ0aWNhbCwgMTAsIHNzZTIpCitQUkVEOHg4KGhvcml6b250YWwsIDEwLCBzc2UyKQorCisjZGVmaW5lIFBSRUQ4eDhMKFRZUEUsIERFUFRILCBPUFQpXAordm9pZCBmZl9wcmVkOHg4bF8gIyMgVFlQRSAjIyBfICMjIERFUFRIICMjIF8gIyMgT1BUICh1aW50OF90ICpzcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3BsZWZ0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7CisKK1BSRUQ4eDhMKGRjLCAxMCwgc3NlMikKK1BSRUQ4eDhMKGRjLCAxMCwgYXZ4KQorUFJFRDh4OEwoMTI4X2RjLCAxMCwgbW14ZXh0KQorUFJFRDh4OEwoMTI4X2RjLCAxMCwgc3NlMikKK1BSRUQ4eDhMKHRvcF9kYywgMTAsIHNzZTIpCitQUkVEOHg4TCh0b3BfZGMsIDEwLCBhdngpCitQUkVEOHg4TCh2ZXJ0aWNhbCwgMTAsIHNzZTIpCitQUkVEOHg4TCh2ZXJ0aWNhbCwgMTAsIGF2eCkKK1BSRUQ4eDhMKGhvcml6b250YWwsIDEwLCBzc2UyKQorUFJFRDh4OEwoaG9yaXpvbnRhbCwgMTAsIHNzc2UzKQorUFJFRDh4OEwoaG9yaXpvbnRhbCwgMTAsIGF2eCkKK1BSRUQ4eDhMKGRvd25fbGVmdCwgMTAsIHNzZTIpCitQUkVEOHg4TChkb3duX2xlZnQsIDEwLCBzc3NlMykKK1BSRUQ4eDhMKGRvd25fbGVmdCwgMTAsIGF2eCkKK1BSRUQ4eDhMKGRvd25fcmlnaHQsIDEwLCBzc2UyKQorUFJFRDh4OEwoZG93bl9yaWdodCwgMTAsIHNzc2UzKQorUFJFRDh4OEwoZG93bl9yaWdodCwgMTAsIGF2eCkKK1BSRUQ4eDhMKHZlcnRpY2FsX3JpZ2h0LCAxMCwgc3NlMikKK1BSRUQ4eDhMKHZlcnRpY2FsX3JpZ2h0LCAxMCwgc3NzZTMpCitQUkVEOHg4TCh2ZXJ0aWNhbF9yaWdodCwgMTAsIGF2eCkKK1BSRUQ4eDhMKGhvcml6b250YWxfdXAsIDEwLCBzc2UyKQorUFJFRDh4OEwoaG9yaXpvbnRhbF91cCwgMTAsIHNzc2UzKQorUFJFRDh4OEwoaG9yaXpvbnRhbF91cCwgMTAsIGF2eCkKKworI2RlZmluZSBQUkVEMTZ4MTYoVFlQRSwgREVQVEgsIE9QVClcCit2b2lkIGZmX3ByZWQxNngxNl8gIyMgVFlQRSAjIyBfICMjIERFUFRIICMjIF8gIyMgT1BUICh1aW50OF90ICpzcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOworCitQUkVEMTZ4MTYoZGMsIDEwLCBtbXhleHQpCitQUkVEMTZ4MTYoZGMsIDEwLCBzc2UyKQorUFJFRDE2eDE2KHRvcF9kYywgMTAsIG1teGV4dCkKK1BSRUQxNngxNih0b3BfZGMsIDEwLCBzc2UyKQorUFJFRDE2eDE2KDEyOF9kYywgMTAsIG1teGV4dCkKK1BSRUQxNngxNigxMjhfZGMsIDEwLCBzc2UyKQorUFJFRDE2eDE2KGxlZnRfZGMsIDEwLCBtbXhleHQpCitQUkVEMTZ4MTYobGVmdF9kYywgMTAsIHNzZTIpCitQUkVEMTZ4MTYodmVydGljYWwsIDEwLCBtbXhleHQpCitQUkVEMTZ4MTYodmVydGljYWwsIDEwLCBzc2UyKQorUFJFRDE2eDE2KGhvcml6b250YWwsIDEwLCBtbXhleHQpCitQUkVEMTZ4MTYoaG9yaXpvbnRhbCwgMTAsIHNzZTIpCisKKy8qIDgtYml0IHZlcnNpb25zICovCitQUkVEMTZ4MTYodmVydGljYWwsIDgsIG1teCkKK1BSRUQxNngxNih2ZXJ0aWNhbCwgOCwgc3NlKQorUFJFRDE2eDE2KGhvcml6b250YWwsIDgsIG1teCkKK1BSRUQxNngxNihob3Jpem9udGFsLCA4LCBtbXhleHQpCitQUkVEMTZ4MTYoaG9yaXpvbnRhbCwgOCwgc3NzZTMpCitQUkVEMTZ4MTYoZGMsIDgsIG1teGV4dCkKK1BSRUQxNngxNihkYywgOCwgc3NlMikKK1BSRUQxNngxNihkYywgOCwgc3NzZTMpCitQUkVEMTZ4MTYocGxhbmVfaDI2NCwgOCwgbW14KQorUFJFRDE2eDE2KHBsYW5lX2gyNjQsIDgsIG1teGV4dCkKK1BSRUQxNngxNihwbGFuZV9oMjY0LCA4LCBzc2UyKQorUFJFRDE2eDE2KHBsYW5lX2gyNjQsIDgsIHNzc2UzKQorUFJFRDE2eDE2KHBsYW5lX3J2NDAsIDgsIG1teCkKK1BSRUQxNngxNihwbGFuZV9ydjQwLCA4LCBtbXhleHQpCitQUkVEMTZ4MTYocGxhbmVfcnY0MCwgOCwgc3NlMikKK1BSRUQxNngxNihwbGFuZV9ydjQwLCA4LCBzc3NlMykKK1BSRUQxNngxNihwbGFuZV9zdnEzLCA4LCBtbXgpCitQUkVEMTZ4MTYocGxhbmVfc3ZxMywgOCwgbW14ZXh0KQorUFJFRDE2eDE2KHBsYW5lX3N2cTMsIDgsIHNzZTIpCitQUkVEMTZ4MTYocGxhbmVfc3ZxMywgOCwgc3NzZTMpCitQUkVEMTZ4MTYodG1fdnA4LCA4LCBtbXgpCitQUkVEMTZ4MTYodG1fdnA4LCA4LCBtbXhleHQpCitQUkVEMTZ4MTYodG1fdnA4LCA4LCBzc2UyKQorCitQUkVEOHg4KHRvcF9kYywgOCwgbW14ZXh0KQorUFJFRDh4OChkY19ydjQwLCA4LCBtbXhleHQpCitQUkVEOHg4KGRjLCA4LCBtbXhleHQpCitQUkVEOHg4KHZlcnRpY2FsLCA4LCBtbXgpCitQUkVEOHg4KGhvcml6b250YWwsIDgsIG1teCkKK1BSRUQ4eDgoaG9yaXpvbnRhbCwgOCwgbW14ZXh0KQorUFJFRDh4OChob3Jpem9udGFsLCA4LCBzc3NlMykKK1BSRUQ4eDgocGxhbmUsIDgsIG1teCkKK1BSRUQ4eDgocGxhbmUsIDgsIG1teGV4dCkKK1BSRUQ4eDgocGxhbmUsIDgsIHNzZTIpCitQUkVEOHg4KHBsYW5lLCA4LCBzc3NlMykKK1BSRUQ4eDgodG1fdnA4LCA4LCBtbXgpCitQUkVEOHg4KHRtX3ZwOCwgOCwgbW14ZXh0KQorUFJFRDh4OCh0bV92cDgsIDgsIHNzZTIpCitQUkVEOHg4KHRtX3ZwOCwgOCwgc3NzZTMpCisKK1BSRUQ4eDhMKHRvcF9kYywgOCwgbW14ZXh0KQorUFJFRDh4OEwodG9wX2RjLCA4LCBzc3NlMykKK1BSRUQ4eDhMKGRjLCA4LCBtbXhleHQpCitQUkVEOHg4TChkYywgOCwgc3NzZTMpCitQUkVEOHg4TChob3Jpem9udGFsLCA4LCBtbXhleHQpCitQUkVEOHg4TChob3Jpem9udGFsLCA4LCBzc3NlMykKK1BSRUQ4eDhMKHZlcnRpY2FsLCA4LCBtbXhleHQpCitQUkVEOHg4TCh2ZXJ0aWNhbCwgOCwgc3NzZTMpCitQUkVEOHg4TChkb3duX2xlZnQsIDgsIG1teGV4dCkKK1BSRUQ4eDhMKGRvd25fbGVmdCwgOCwgc3NlMikKK1BSRUQ4eDhMKGRvd25fbGVmdCwgOCwgc3NzZTMpCitQUkVEOHg4TChkb3duX3JpZ2h0LCA4LCBtbXhleHQpCitQUkVEOHg4TChkb3duX3JpZ2h0LCA4LCBzc2UyKQorUFJFRDh4OEwoZG93bl9yaWdodCwgOCwgc3NzZTMpCitQUkVEOHg4TCh2ZXJ0aWNhbF9yaWdodCwgOCwgbW14ZXh0KQorUFJFRDh4OEwodmVydGljYWxfcmlnaHQsIDgsIHNzZTIpCitQUkVEOHg4TCh2ZXJ0aWNhbF9yaWdodCwgOCwgc3NzZTMpCitQUkVEOHg4TCh2ZXJ0aWNhbF9sZWZ0LCA4LCBzc2UyKQorUFJFRDh4OEwodmVydGljYWxfbGVmdCwgOCwgc3NzZTMpCitQUkVEOHg4TChob3Jpem9udGFsX3VwLCA4LCBtbXhleHQpCitQUkVEOHg4TChob3Jpem9udGFsX3VwLCA4LCBzc3NlMykKK1BSRUQ4eDhMKGhvcml6b250YWxfZG93biwgOCwgbW14ZXh0KQorUFJFRDh4OEwoaG9yaXpvbnRhbF9kb3duLCA4LCBzc2UyKQorUFJFRDh4OEwoaG9yaXpvbnRhbF9kb3duLCA4LCBzc3NlMykKKworUFJFRDR4NChkYywgOCwgbW14ZXh0KQorUFJFRDR4NChkb3duX2xlZnQsIDgsIG1teGV4dCkKK1BSRUQ0eDQoZG93bl9yaWdodCwgOCwgbW14ZXh0KQorUFJFRDR4NCh2ZXJ0aWNhbF9sZWZ0LCA4LCBtbXhleHQpCitQUkVENHg0KHZlcnRpY2FsX3JpZ2h0LCA4LCBtbXhleHQpCitQUkVENHg0KGhvcml6b250YWxfdXAsIDgsIG1teGV4dCkKK1BSRUQ0eDQoaG9yaXpvbnRhbF9kb3duLCA4LCBtbXhleHQpCitQUkVENHg0KHRtX3ZwOCwgOCwgbW14KQorUFJFRDR4NCh0bV92cDgsIDgsIG1teGV4dCkKK1BSRUQ0eDQodG1fdnA4LCA4LCBzc3NlMykKK1BSRUQ0eDQodmVydGljYWxfdnA4LCA4LCBtbXhleHQpCisKK2F2X2NvbGQgdm9pZCBmZl9oMjY0X3ByZWRfaW5pdF94ODYoSDI2NFByZWRDb250ZXh0ICpoLCBpbnQgY29kZWNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaHJvbWFfZm9ybWF0X2lkYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGJpdF9kZXB0aCA9PSA4KSB7CisgICAgICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgaC0+cHJlZDE2eDE2W1ZFUlRfUFJFRDh4OCAgICAgICAgIF0gPSBmZl9wcmVkMTZ4MTZfdmVydGljYWxfOF9tbXg7CisgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbSE9SX1BSRUQ4eDggICAgICAgICAgXSA9IGZmX3ByZWQxNngxNl9ob3Jpem9udGFsXzhfbW14OworICAgICAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpIHsKKyAgICAgICAgICAgICAgICBoLT5wcmVkOHg4ICBbVkVSVF9QUkVEOHg4ICAgICBdID0gZmZfcHJlZDh4OF92ZXJ0aWNhbF84X21teDsKKyAgICAgICAgICAgICAgICBoLT5wcmVkOHg4ICBbSE9SX1BSRUQ4eDggICAgICBdID0gZmZfcHJlZDh4OF9ob3Jpem9udGFsXzhfbW14OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNyB8fCBjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDgpIHsKKyAgICAgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbUExBTkVfUFJFRDh4OCAgICBdID0gZmZfcHJlZDE2eDE2X3RtX3ZwOF84X21teDsKKyAgICAgICAgICAgICAgICBoLT5wcmVkOHg4ICBbUExBTkVfUFJFRDh4OCAgICBdID0gZmZfcHJlZDh4OF90bV92cDhfOF9tbXg7CisgICAgICAgICAgICAgICAgaC0+cHJlZDR4NCAgW1RNX1ZQOF9QUkVEICAgICAgXSA9IGZmX3ByZWQ0eDRfdG1fdnA4XzhfbW14OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgaC0+cHJlZDh4OCAgW1BMQU5FX1BSRUQ4eDhdID0gZmZfcHJlZDh4OF9wbGFuZV84X21teDsKKyAgICAgICAgICAgICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1ZRMykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfQ01PVikKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPnByZWQxNngxNltQTEFORV9QUkVEOHg4XSA9IGZmX3ByZWQxNngxNl9wbGFuZV9zdnEzXzhfbW14OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlY0MCkgeworICAgICAgICAgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbUExBTkVfUFJFRDh4OF0gPSBmZl9wcmVkMTZ4MTZfcGxhbmVfcnY0MF84X21teDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbUExBTkVfUFJFRDh4OF0gPSBmZl9wcmVkMTZ4MTZfcGxhbmVfaDI2NF84X21teDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGgtPnByZWQxNngxNltIT1JfUFJFRDh4OCAgICAgICAgICAgIF0gPSBmZl9wcmVkMTZ4MTZfaG9yaXpvbnRhbF84X21teGV4dDsKKyAgICAgICAgICAgIGgtPnByZWQxNngxNltEQ19QUkVEOHg4ICAgICAgICAgICAgIF0gPSBmZl9wcmVkMTZ4MTZfZGNfOF9tbXhleHQ7CisgICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkKKyAgICAgICAgICAgICAgICBoLT5wcmVkOHg4W0hPUl9QUkVEOHg4ICAgICAgICAgIF0gPSBmZl9wcmVkOHg4X2hvcml6b250YWxfOF9tbXhleHQ7CisgICAgICAgICAgICBoLT5wcmVkOHg4bCBbVE9QX0RDX1BSRUQgICAgICAgICAgICBdID0gZmZfcHJlZDh4OGxfdG9wX2RjXzhfbW14ZXh0OworICAgICAgICAgICAgaC0+cHJlZDh4OGwgW0RDX1BSRUQgICAgICAgICAgICAgICAgXSA9IGZmX3ByZWQ4eDhsX2RjXzhfbW14ZXh0OworICAgICAgICAgICAgaC0+cHJlZDh4OGwgW0hPUl9QUkVEICAgICAgICAgICAgICAgXSA9IGZmX3ByZWQ4eDhsX2hvcml6b250YWxfOF9tbXhleHQ7CisgICAgICAgICAgICBoLT5wcmVkOHg4bCBbVkVSVF9QUkVEICAgICAgICAgICAgICBdID0gZmZfcHJlZDh4OGxfdmVydGljYWxfOF9tbXhleHQ7CisgICAgICAgICAgICBoLT5wcmVkOHg4bCBbRElBR19ET1dOX1JJR0hUX1BSRUQgICBdID0gZmZfcHJlZDh4OGxfZG93bl9yaWdodF84X21teGV4dDsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsIFtWRVJUX1JJR0hUX1BSRUQgICAgICAgIF0gPSBmZl9wcmVkOHg4bF92ZXJ0aWNhbF9yaWdodF84X21teGV4dDsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsIFtIT1JfVVBfUFJFRCAgICAgICAgICAgIF0gPSBmZl9wcmVkOHg4bF9ob3Jpem9udGFsX3VwXzhfbW14ZXh0OworICAgICAgICAgICAgaC0+cHJlZDh4OGwgW0RJQUdfRE9XTl9MRUZUX1BSRUQgICAgXSA9IGZmX3ByZWQ4eDhsX2Rvd25fbGVmdF84X21teGV4dDsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsIFtIT1JfRE9XTl9QUkVEICAgICAgICAgIF0gPSBmZl9wcmVkOHg4bF9ob3Jpem9udGFsX2Rvd25fOF9tbXhleHQ7CisgICAgICAgICAgICBoLT5wcmVkNHg0ICBbRElBR19ET1dOX1JJR0hUX1BSRUQgICBdID0gZmZfcHJlZDR4NF9kb3duX3JpZ2h0XzhfbW14ZXh0OworICAgICAgICAgICAgaC0+cHJlZDR4NCAgW1ZFUlRfUklHSFRfUFJFRCAgICAgICAgXSA9IGZmX3ByZWQ0eDRfdmVydGljYWxfcmlnaHRfOF9tbXhleHQ7CisgICAgICAgICAgICBoLT5wcmVkNHg0ICBbSE9SX0RPV05fUFJFRCAgICAgICAgICBdID0gZmZfcHJlZDR4NF9ob3Jpem9udGFsX2Rvd25fOF9tbXhleHQ7CisgICAgICAgICAgICBoLT5wcmVkNHg0ICBbRENfUFJFRCAgICAgICAgICAgICAgICBdID0gZmZfcHJlZDR4NF9kY184X21teGV4dDsKKyAgICAgICAgICAgIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDcgfHwgY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4IHx8CisgICAgICAgICAgICAgICAgY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgeworICAgICAgICAgICAgICAgIGgtPnByZWQ0eDQgIFtESUFHX0RPV05fTEVGVF9QUkVEXSA9IGZmX3ByZWQ0eDRfZG93bl9sZWZ0XzhfbW14ZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NWUTMgfHwgY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgeworICAgICAgICAgICAgICAgIGgtPnByZWQ0eDQgIFtWRVJUX0xFRlRfUFJFRCAgICAgXSA9IGZmX3ByZWQ0eDRfdmVydGljYWxfbGVmdF84X21teGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9SVjQwKSB7CisgICAgICAgICAgICAgICAgaC0+cHJlZDR4NCAgW0hPUl9VUF9QUkVEICAgICAgICBdID0gZmZfcHJlZDR4NF9ob3Jpem9udGFsX3VwXzhfbW14ZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NWUTMgfHwgY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgeworICAgICAgICAgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA8PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGgtPnByZWQ4eDhbVE9QX0RDX1BSRUQ4eDggICBdID0gZmZfcHJlZDh4OF90b3BfZGNfOF9tbXhleHQ7CisgICAgICAgICAgICAgICAgICAgIGgtPnByZWQ4eDhbRENfUFJFRDh4OCAgICAgICBdID0gZmZfcHJlZDh4OF9kY184X21teGV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA3IHx8IGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOCkgeworICAgICAgICAgICAgICAgIGgtPnByZWQxNngxNltQTEFORV9QUkVEOHg4ICAgICAgXSA9IGZmX3ByZWQxNngxNl90bV92cDhfOF9tbXhleHQ7CisgICAgICAgICAgICAgICAgaC0+cHJlZDh4OCAgW0RDX1BSRUQ4eDggICAgICAgICBdID0gZmZfcHJlZDh4OF9kY19ydjQwXzhfbW14ZXh0OworICAgICAgICAgICAgICAgIGgtPnByZWQ4eDggIFtQTEFORV9QUkVEOHg4ICAgICAgXSA9IGZmX3ByZWQ4eDhfdG1fdnA4XzhfbW14ZXh0OworICAgICAgICAgICAgICAgIGgtPnByZWQ0eDQgIFtUTV9WUDhfUFJFRCAgICAgICAgXSA9IGZmX3ByZWQ0eDRfdG1fdnA4XzhfbW14ZXh0OworICAgICAgICAgICAgICAgIGgtPnByZWQ0eDQgIFtWRVJUX1BSRUQgICAgICAgICAgXSA9IGZmX3ByZWQ0eDRfdmVydGljYWxfdnA4XzhfbW14ZXh0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgaC0+cHJlZDh4OCAgW1BMQU5FX1BSRUQ4eDhdID0gZmZfcHJlZDh4OF9wbGFuZV84X21teGV4dDsKKyAgICAgICAgICAgICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1ZRMykgeworICAgICAgICAgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbUExBTkVfUFJFRDh4OCAgXSA9IGZmX3ByZWQxNngxNl9wbGFuZV9zdnEzXzhfbW14ZXh0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlY0MCkgeworICAgICAgICAgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbUExBTkVfUFJFRDh4OCAgXSA9IGZmX3ByZWQxNngxNl9wbGFuZV9ydjQwXzhfbW14ZXh0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGgtPnByZWQxNngxNltQTEFORV9QUkVEOHg4ICBdID0gZmZfcHJlZDE2eDE2X3BsYW5lX2gyNjRfOF9tbXhleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRShjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbVkVSVF9QUkVEOHg4XSA9IGZmX3ByZWQxNngxNl92ZXJ0aWNhbF84X3NzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGgtPnByZWQxNngxNltEQ19QUkVEOHg4ICAgICAgICAgICBdID0gZmZfcHJlZDE2eDE2X2RjXzhfc3NlMjsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsIFtESUFHX0RPV05fTEVGVF9QUkVEICBdID0gZmZfcHJlZDh4OGxfZG93bl9sZWZ0Xzhfc3NlMjsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsIFtESUFHX0RPV05fUklHSFRfUFJFRCBdID0gZmZfcHJlZDh4OGxfZG93bl9yaWdodF84X3NzZTI7CisgICAgICAgICAgICBoLT5wcmVkOHg4bCBbVkVSVF9SSUdIVF9QUkVEICAgICAgXSA9IGZmX3ByZWQ4eDhsX3ZlcnRpY2FsX3JpZ2h0Xzhfc3NlMjsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsIFtWRVJUX0xFRlRfUFJFRCAgICAgICBdID0gZmZfcHJlZDh4OGxfdmVydGljYWxfbGVmdF84X3NzZTI7CisgICAgICAgICAgICBoLT5wcmVkOHg4bCBbSE9SX0RPV05fUFJFRCAgICAgICAgXSA9IGZmX3ByZWQ4eDhsX2hvcml6b250YWxfZG93bl84X3NzZTI7CisgICAgICAgICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA3IHx8IGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOCkgeworICAgICAgICAgICAgICAgIGgtPnByZWQxNngxNltQTEFORV9QUkVEOHg4ICAgIF0gPSBmZl9wcmVkMTZ4MTZfdG1fdnA4Xzhfc3NlMjsKKyAgICAgICAgICAgICAgICBoLT5wcmVkOHg4ICBbUExBTkVfUFJFRDh4OCAgICBdID0gZmZfcHJlZDh4OF90bV92cDhfOF9zc2UyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgaC0+cHJlZDh4OCAgW1BMQU5FX1BSRUQ4eDhdID0gZmZfcHJlZDh4OF9wbGFuZV84X3NzZTI7CisgICAgICAgICAgICAgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NWUTMpIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+cHJlZDE2eDE2W1BMQU5FX1BSRUQ4eDhdID0gZmZfcHJlZDE2eDE2X3BsYW5lX3N2cTNfOF9zc2UyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlY0MCkgeworICAgICAgICAgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbUExBTkVfUFJFRDh4OF0gPSBmZl9wcmVkMTZ4MTZfcGxhbmVfcnY0MF84X3NzZTI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+cHJlZDE2eDE2W1BMQU5FX1BSRUQ4eDhdID0gZmZfcHJlZDE2eDE2X3BsYW5lX2gyNjRfOF9zc2UyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbSE9SX1BSRUQ4eDggICAgICAgICAgXSA9IGZmX3ByZWQxNngxNl9ob3Jpem9udGFsXzhfc3NzZTM7CisgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbRENfUFJFRDh4OCAgICAgICAgICAgXSA9IGZmX3ByZWQxNngxNl9kY184X3Nzc2UzOworICAgICAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpCisgICAgICAgICAgICAgICAgaC0+cHJlZDh4OCAgW0hPUl9QUkVEOHg4ICAgICAgXSA9IGZmX3ByZWQ4eDhfaG9yaXpvbnRhbF84X3Nzc2UzOworICAgICAgICAgICAgaC0+cHJlZDh4OGwgW1RPUF9EQ19QUkVEICAgICAgICAgIF0gPSBmZl9wcmVkOHg4bF90b3BfZGNfOF9zc3NlMzsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsIFtEQ19QUkVEICAgICAgICAgICAgICBdID0gZmZfcHJlZDh4OGxfZGNfOF9zc3NlMzsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsIFtIT1JfUFJFRCAgICAgICAgICAgICBdID0gZmZfcHJlZDh4OGxfaG9yaXpvbnRhbF84X3Nzc2UzOworICAgICAgICAgICAgaC0+cHJlZDh4OGwgW1ZFUlRfUFJFRCAgICAgICAgICAgIF0gPSBmZl9wcmVkOHg4bF92ZXJ0aWNhbF84X3Nzc2UzOworICAgICAgICAgICAgaC0+cHJlZDh4OGwgW0RJQUdfRE9XTl9MRUZUX1BSRUQgIF0gPSBmZl9wcmVkOHg4bF9kb3duX2xlZnRfOF9zc3NlMzsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsIFtESUFHX0RPV05fUklHSFRfUFJFRCBdID0gZmZfcHJlZDh4OGxfZG93bl9yaWdodF84X3Nzc2UzOworICAgICAgICAgICAgaC0+cHJlZDh4OGwgW1ZFUlRfUklHSFRfUFJFRCAgICAgIF0gPSBmZl9wcmVkOHg4bF92ZXJ0aWNhbF9yaWdodF84X3Nzc2UzOworICAgICAgICAgICAgaC0+cHJlZDh4OGwgW1ZFUlRfTEVGVF9QUkVEICAgICAgIF0gPSBmZl9wcmVkOHg4bF92ZXJ0aWNhbF9sZWZ0Xzhfc3NzZTM7CisgICAgICAgICAgICBoLT5wcmVkOHg4bCBbSE9SX1VQX1BSRUQgICAgICAgICAgXSA9IGZmX3ByZWQ4eDhsX2hvcml6b250YWxfdXBfOF9zc3NlMzsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsIFtIT1JfRE9XTl9QUkVEICAgICAgICBdID0gZmZfcHJlZDh4OGxfaG9yaXpvbnRhbF9kb3duXzhfc3NzZTM7CisgICAgICAgICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA3IHx8IGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOCkgeworICAgICAgICAgICAgICAgIGgtPnByZWQ4eDggIFtQTEFORV9QUkVEOHg4ICAgIF0gPSBmZl9wcmVkOHg4X3RtX3ZwOF84X3Nzc2UzOworICAgICAgICAgICAgICAgIGgtPnByZWQ0eDQgIFtUTV9WUDhfUFJFRCAgICAgIF0gPSBmZl9wcmVkNHg0X3RtX3ZwOF84X3Nzc2UzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgaC0+cHJlZDh4OCAgW1BMQU5FX1BSRUQ4eDhdID0gZmZfcHJlZDh4OF9wbGFuZV84X3Nzc2UzOworICAgICAgICAgICAgICAgIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TVlEzKSB7CisgICAgICAgICAgICAgICAgICAgIGgtPnByZWQxNngxNltQTEFORV9QUkVEOHg4XSA9IGZmX3ByZWQxNngxNl9wbGFuZV9zdnEzXzhfc3NzZTM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjQwKSB7CisgICAgICAgICAgICAgICAgICAgIGgtPnByZWQxNngxNltQTEFORV9QUkVEOHg4XSA9IGZmX3ByZWQxNngxNl9wbGFuZV9ydjQwXzhfc3NzZTM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaC0+cHJlZDE2eDE2W1BMQU5FX1BSRUQ4eDhdID0gZmZfcHJlZDE2eDE2X3BsYW5lX2gyNjRfOF9zc3NlMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJpdF9kZXB0aCA9PSAxMCkgeworICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGgtPnByZWQ0eDRbRENfUFJFRCAgICAgICAgICAgICBdID0gZmZfcHJlZDR4NF9kY18xMF9tbXhleHQ7CisgICAgICAgICAgICBoLT5wcmVkNHg0W0hPUl9VUF9QUkVEICAgICAgICAgXSA9IGZmX3ByZWQ0eDRfaG9yaXpvbnRhbF91cF8xMF9tbXhleHQ7CisKKyAgICAgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA8PSAxKQorICAgICAgICAgICAgICAgIGgtPnByZWQ4eDhbRENfUFJFRDh4OCAgICAgIF0gPSBmZl9wcmVkOHg4X2RjXzEwX21teGV4dDsKKworICAgICAgICAgICAgaC0+cHJlZDh4OGxbRENfMTI4X1BSRUQgICAgICAgIF0gPSBmZl9wcmVkOHg4bF8xMjhfZGNfMTBfbW14ZXh0OworCisgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbRENfUFJFRDh4OCAgICAgICAgXSA9IGZmX3ByZWQxNngxNl9kY18xMF9tbXhleHQ7CisgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbVE9QX0RDX1BSRUQ4eDggICAgXSA9IGZmX3ByZWQxNngxNl90b3BfZGNfMTBfbW14ZXh0OworICAgICAgICAgICAgaC0+cHJlZDE2eDE2W0RDXzEyOF9QUkVEOHg4ICAgIF0gPSBmZl9wcmVkMTZ4MTZfMTI4X2RjXzEwX21teGV4dDsKKyAgICAgICAgICAgIGgtPnByZWQxNngxNltMRUZUX0RDX1BSRUQ4eDggICBdID0gZmZfcHJlZDE2eDE2X2xlZnRfZGNfMTBfbW14ZXh0OworICAgICAgICAgICAgaC0+cHJlZDE2eDE2W1ZFUlRfUFJFRDh4OCAgICAgIF0gPSBmZl9wcmVkMTZ4MTZfdmVydGljYWxfMTBfbW14ZXh0OworICAgICAgICAgICAgaC0+cHJlZDE2eDE2W0hPUl9QUkVEOHg4ICAgICAgIF0gPSBmZl9wcmVkMTZ4MTZfaG9yaXpvbnRhbF8xMF9tbXhleHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgaC0+cHJlZDR4NFtESUFHX0RPV05fTEVGVF9QUkVEIF0gPSBmZl9wcmVkNHg0X2Rvd25fbGVmdF8xMF9zc2UyOworICAgICAgICAgICAgaC0+cHJlZDR4NFtESUFHX0RPV05fUklHSFRfUFJFRF0gPSBmZl9wcmVkNHg0X2Rvd25fcmlnaHRfMTBfc3NlMjsKKyAgICAgICAgICAgIGgtPnByZWQ0eDRbVkVSVF9MRUZUX1BSRUQgICAgICBdID0gZmZfcHJlZDR4NF92ZXJ0aWNhbF9sZWZ0XzEwX3NzZTI7CisgICAgICAgICAgICBoLT5wcmVkNHg0W1ZFUlRfUklHSFRfUFJFRCAgICAgXSA9IGZmX3ByZWQ0eDRfdmVydGljYWxfcmlnaHRfMTBfc3NlMjsKKyAgICAgICAgICAgIGgtPnByZWQ0eDRbSE9SX0RPV05fUFJFRCAgICAgICBdID0gZmZfcHJlZDR4NF9ob3Jpem9udGFsX2Rvd25fMTBfc3NlMjsKKworICAgICAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpIHsKKyAgICAgICAgICAgICAgICBoLT5wcmVkOHg4W0RDX1BSRUQ4eDggICAgICBdID0gZmZfcHJlZDh4OF9kY18xMF9zc2UyOworICAgICAgICAgICAgICAgIGgtPnByZWQ4eDhbVE9QX0RDX1BSRUQ4eDggIF0gPSBmZl9wcmVkOHg4X3RvcF9kY18xMF9zc2UyOworICAgICAgICAgICAgICAgIGgtPnByZWQ4eDhbUExBTkVfUFJFRDh4OCAgIF0gPSBmZl9wcmVkOHg4X3BsYW5lXzEwX3NzZTI7CisgICAgICAgICAgICAgICAgaC0+cHJlZDh4OFtWRVJUX1BSRUQ4eDggICAgXSA9IGZmX3ByZWQ4eDhfdmVydGljYWxfMTBfc3NlMjsKKyAgICAgICAgICAgICAgICBoLT5wcmVkOHg4W0hPUl9QUkVEOHg4ICAgICBdID0gZmZfcHJlZDh4OF9ob3Jpem9udGFsXzEwX3NzZTI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsW1ZFUlRfUFJFRCAgICAgICAgICAgXSA9IGZmX3ByZWQ4eDhsX3ZlcnRpY2FsXzEwX3NzZTI7CisgICAgICAgICAgICBoLT5wcmVkOHg4bFtIT1JfUFJFRCAgICAgICAgICAgIF0gPSBmZl9wcmVkOHg4bF9ob3Jpem9udGFsXzEwX3NzZTI7CisgICAgICAgICAgICBoLT5wcmVkOHg4bFtEQ19QUkVEICAgICAgICAgICAgIF0gPSBmZl9wcmVkOHg4bF9kY18xMF9zc2UyOworICAgICAgICAgICAgaC0+cHJlZDh4OGxbRENfMTI4X1BSRUQgICAgICAgICBdID0gZmZfcHJlZDh4OGxfMTI4X2RjXzEwX3NzZTI7CisgICAgICAgICAgICBoLT5wcmVkOHg4bFtUT1BfRENfUFJFRCAgICAgICAgIF0gPSBmZl9wcmVkOHg4bF90b3BfZGNfMTBfc3NlMjsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsW0RJQUdfRE9XTl9MRUZUX1BSRUQgXSA9IGZmX3ByZWQ4eDhsX2Rvd25fbGVmdF8xMF9zc2UyOworICAgICAgICAgICAgaC0+cHJlZDh4OGxbRElBR19ET1dOX1JJR0hUX1BSRURdID0gZmZfcHJlZDh4OGxfZG93bl9yaWdodF8xMF9zc2UyOworICAgICAgICAgICAgaC0+cHJlZDh4OGxbVkVSVF9SSUdIVF9QUkVEICAgICBdID0gZmZfcHJlZDh4OGxfdmVydGljYWxfcmlnaHRfMTBfc3NlMjsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsW0hPUl9VUF9QUkVEICAgICAgICAgXSA9IGZmX3ByZWQ4eDhsX2hvcml6b250YWxfdXBfMTBfc3NlMjsKKworICAgICAgICAgICAgaC0+cHJlZDE2eDE2W0RDX1BSRUQ4eDggICAgICAgIF0gPSBmZl9wcmVkMTZ4MTZfZGNfMTBfc3NlMjsKKyAgICAgICAgICAgIGgtPnByZWQxNngxNltUT1BfRENfUFJFRDh4OCAgICBdID0gZmZfcHJlZDE2eDE2X3RvcF9kY18xMF9zc2UyOworICAgICAgICAgICAgaC0+cHJlZDE2eDE2W0RDXzEyOF9QUkVEOHg4ICAgIF0gPSBmZl9wcmVkMTZ4MTZfMTI4X2RjXzEwX3NzZTI7CisgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbTEVGVF9EQ19QUkVEOHg4ICAgXSA9IGZmX3ByZWQxNngxNl9sZWZ0X2RjXzEwX3NzZTI7CisgICAgICAgICAgICBoLT5wcmVkMTZ4MTZbVkVSVF9QUkVEOHg4ICAgICAgXSA9IGZmX3ByZWQxNngxNl92ZXJ0aWNhbF8xMF9zc2UyOworICAgICAgICAgICAgaC0+cHJlZDE2eDE2W0hPUl9QUkVEOHg4ICAgICAgIF0gPSBmZl9wcmVkMTZ4MTZfaG9yaXpvbnRhbF8xMF9zc2UyOworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICBoLT5wcmVkNHg0W0RJQUdfRE9XTl9SSUdIVF9QUkVEXSA9IGZmX3ByZWQ0eDRfZG93bl9yaWdodF8xMF9zc3NlMzsKKyAgICAgICAgICAgIGgtPnByZWQ0eDRbVkVSVF9SSUdIVF9QUkVEICAgICBdID0gZmZfcHJlZDR4NF92ZXJ0aWNhbF9yaWdodF8xMF9zc3NlMzsKKyAgICAgICAgICAgIGgtPnByZWQ0eDRbSE9SX0RPV05fUFJFRCAgICAgICBdID0gZmZfcHJlZDR4NF9ob3Jpem9udGFsX2Rvd25fMTBfc3NzZTM7CisKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsW0hPUl9QUkVEICAgICAgICAgICAgXSA9IGZmX3ByZWQ4eDhsX2hvcml6b250YWxfMTBfc3NzZTM7CisgICAgICAgICAgICBoLT5wcmVkOHg4bFtESUFHX0RPV05fTEVGVF9QUkVEIF0gPSBmZl9wcmVkOHg4bF9kb3duX2xlZnRfMTBfc3NzZTM7CisgICAgICAgICAgICBoLT5wcmVkOHg4bFtESUFHX0RPV05fUklHSFRfUFJFRF0gPSBmZl9wcmVkOHg4bF9kb3duX3JpZ2h0XzEwX3Nzc2UzOworICAgICAgICAgICAgaC0+cHJlZDh4OGxbVkVSVF9SSUdIVF9QUkVEICAgICBdID0gZmZfcHJlZDh4OGxfdmVydGljYWxfcmlnaHRfMTBfc3NzZTM7CisgICAgICAgICAgICBoLT5wcmVkOHg4bFtIT1JfVVBfUFJFRCAgICAgICAgIF0gPSBmZl9wcmVkOHg4bF9ob3Jpem9udGFsX3VwXzEwX3Nzc2UzOworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgaC0+cHJlZDR4NFtESUFHX0RPV05fTEVGVF9QUkVEIF0gPSBmZl9wcmVkNHg0X2Rvd25fbGVmdF8xMF9hdng7CisgICAgICAgICAgICBoLT5wcmVkNHg0W0RJQUdfRE9XTl9SSUdIVF9QUkVEXSA9IGZmX3ByZWQ0eDRfZG93bl9yaWdodF8xMF9hdng7CisgICAgICAgICAgICBoLT5wcmVkNHg0W1ZFUlRfTEVGVF9QUkVEICAgICAgXSA9IGZmX3ByZWQ0eDRfdmVydGljYWxfbGVmdF8xMF9hdng7CisgICAgICAgICAgICBoLT5wcmVkNHg0W1ZFUlRfUklHSFRfUFJFRCAgICAgXSA9IGZmX3ByZWQ0eDRfdmVydGljYWxfcmlnaHRfMTBfYXZ4OworICAgICAgICAgICAgaC0+cHJlZDR4NFtIT1JfRE9XTl9QUkVEICAgICAgIF0gPSBmZl9wcmVkNHg0X2hvcml6b250YWxfZG93bl8xMF9hdng7CisKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsW1ZFUlRfUFJFRCAgICAgICAgICAgXSA9IGZmX3ByZWQ4eDhsX3ZlcnRpY2FsXzEwX2F2eDsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsW0hPUl9QUkVEICAgICAgICAgICAgXSA9IGZmX3ByZWQ4eDhsX2hvcml6b250YWxfMTBfYXZ4OworICAgICAgICAgICAgaC0+cHJlZDh4OGxbRENfUFJFRCAgICAgICAgICAgICBdID0gZmZfcHJlZDh4OGxfZGNfMTBfYXZ4OworICAgICAgICAgICAgaC0+cHJlZDh4OGxbVE9QX0RDX1BSRUQgICAgICAgICBdID0gZmZfcHJlZDh4OGxfdG9wX2RjXzEwX2F2eDsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsW0RJQUdfRE9XTl9SSUdIVF9QUkVEXSA9IGZmX3ByZWQ4eDhsX2Rvd25fcmlnaHRfMTBfYXZ4OworICAgICAgICAgICAgaC0+cHJlZDh4OGxbRElBR19ET1dOX0xFRlRfUFJFRCBdID0gZmZfcHJlZDh4OGxfZG93bl9sZWZ0XzEwX2F2eDsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsW1ZFUlRfUklHSFRfUFJFRCAgICAgXSA9IGZmX3ByZWQ4eDhsX3ZlcnRpY2FsX3JpZ2h0XzEwX2F2eDsKKyAgICAgICAgICAgIGgtPnByZWQ4eDhsW0hPUl9VUF9QUkVEICAgICAgICAgXSA9IGZmX3ByZWQ4eDhsX2hvcml6b250YWxfdXBfMTBfYXZ4OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfcXBlbC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfcXBlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Y2I5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NF9xcGVsLmMKQEAgLTAsMCArMSw2MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBNaWNoYWVsIE5pZWRlcm1heWVyLCBMb3JlbiBNZXJyaXR0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgRGFuaWVsIEthbmcKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjRxcGVsLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW8uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3BpeGVscy5oIgorI2luY2x1ZGUgImZwZWwuaCIKKworI2lmIEhBVkVfWUFTTQordm9pZCBmZl9wdXRfcGl4ZWxzNF9tbXgodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczRfbW14ZXh0KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHM0X2wyX21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjMVN0cmlkZSwgaW50IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzNF9sMl9tbXhleHQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyYzFTdHJpZGUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfbDJfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmMxU3RyaWRlLCBpbnQgaCk7Cit2b2lkIGZmX2F2Z19waXhlbHM4X2wyX21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjMVN0cmlkZSwgaW50IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzMTZfbDJfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjMVN0cmlkZSwgaW50IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfbDJfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjMVN0cmlkZSwgaW50IGgpOworI2RlZmluZSBmZl9wdXRfcGl4ZWxzOF9sMl9zc2UyICBmZl9wdXRfcGl4ZWxzOF9sMl9tbXhleHQKKyNkZWZpbmUgZmZfYXZnX3BpeGVsczhfbDJfc3NlMiAgZmZfYXZnX3BpeGVsczhfbDJfbW14ZXh0CisjZGVmaW5lIGZmX3B1dF9waXhlbHMxNl9sMl9zc2UyIGZmX3B1dF9waXhlbHMxNl9sMl9tbXhleHQKKyNkZWZpbmUgZmZfYXZnX3BpeGVsczE2X2wyX3NzZTIgZmZfYXZnX3BpeGVsczE2X2wyX21teGV4dAorI2RlZmluZSBmZl9wdXRfcGl4ZWxzMTZfbW14ZXh0ICBmZl9wdXRfcGl4ZWxzMTZfbW14CisjZGVmaW5lIGZmX3B1dF9waXhlbHM4X21teGV4dCAgIGZmX3B1dF9waXhlbHM4X21teAorI2RlZmluZSBmZl9wdXRfcGl4ZWxzNF9tbXhleHQgICBmZl9wdXRfcGl4ZWxzNF9tbXgKKworI2RlZmluZSBERUZfUVBFTChPUE5BTUUpXAordm9pZCBmZl8gIyMgT1BOQU1FICMjIF9oMjY0X3FwZWw0X2hfbG93cGFzc19tbXhleHQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpO1wKK3ZvaWQgZmZfICMjIE9QTkFNRSAjIyBfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKTtcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgX2gyNjRfcXBlbDhfaF9sb3dwYXNzX3Nzc2UzKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKTtcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgX2gyNjRfcXBlbDRfaF9sb3dwYXNzX2wyX21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdFN0cmlkZSwgaW50IHNyYzJTdHJpZGUpO1wKK3ZvaWQgZmZfICMjIE9QTkFNRSAjIyBfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjMlN0cmlkZSk7XAordm9pZCBmZl8gIyMgT1BOQU1FICMjIF9oMjY0X3FwZWw4X2hfbG93cGFzc19sMl9zc3NlMyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdFN0cmlkZSwgaW50IHNyYzJTdHJpZGUpO1wKK3ZvaWQgZmZfICMjIE9QTkFNRSAjIyBfaDI2NF9xcGVsNF92X2xvd3Bhc3NfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKTtcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgX2gyNjRfcXBlbDhvcjE2X3ZfbG93cGFzc19vcF9tbXhleHQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKTtcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgX2gyNjRfcXBlbDhvcjE2X3ZfbG93cGFzc19zc2UyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgaCk7XAordm9pZCBmZl8gIyMgT1BOQU1FICMjIF9oMjY0X3FwZWw0X2h2X2xvd3Bhc3Nfdl9tbXhleHQoY29uc3QgdWludDhfdCAqc3JjLCBpbnQxNl90ICp0bXAsIGludCBzcmNTdHJpZGUpO1wKK3ZvaWQgZmZfICMjIE9QTkFNRSAjIyBfaDI2NF9xcGVsNF9odl9sb3dwYXNzX2hfbW14ZXh0KGludDE2X3QgKnRtcCwgdWludDhfdCAqZHN0LCBpbnQgZHN0U3RyaWRlKTtcCit2b2lkIGZmXyAjIyBPUE5BTUUgIyMgX2gyNjRfcXBlbDhvcjE2X2h2MV9sb3dwYXNzX29wX21teGV4dChjb25zdCB1aW50OF90ICpzcmMsIGludDE2X3QgKnRtcCwgaW50IHNyY1N0cmlkZSwgaW50IHNpemUpO1wKK3ZvaWQgZmZfICMjIE9QTkFNRSAjIyBfaDI2NF9xcGVsOG9yMTZfaHYxX2xvd3Bhc3Nfb3Bfc3NlMihjb25zdCB1aW50OF90ICpzcmMsIGludDE2X3QgKnRtcCwgaW50IHNyY1N0cmlkZSwgaW50IHNpemUpO1wKK3ZvaWQgZmZfICMjIE9QTkFNRSAjIyBfaDI2NF9xcGVsOG9yMTZfaHYyX2xvd3Bhc3Nfb3BfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqdG1wLCBpbnQgZHN0U3RyaWRlLCBpbnQgdW51c2VkLCBpbnQgaCk7XAordm9pZCBmZl8gIyMgT1BOQU1FICMjIF9oMjY0X3FwZWw4b3IxNl9odjJfbG93cGFzc19zc3NlMyh1aW50OF90ICpkc3QsIGludDE2X3QgKnRtcCwgaW50IGRzdFN0cmlkZSwgaW50IHRtcFN0cmlkZSwgaW50IHNpemUpO1wKK3ZvaWQgZmZfICMjIE9QTkFNRSAjIyBfcGl4ZWxzNF9sMl9zaGlmdDVfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgaW50MTZfdCAqc3JjMTYsIGNvbnN0IHVpbnQ4X3QgKnNyYzgsIGludCBkc3RTdHJpZGUsIGludCBzcmM4U3RyaWRlLCBpbnQgaCk7XAordm9pZCBmZl8gIyMgT1BOQU1FICMjIF9waXhlbHM4X2wyX3NoaWZ0NV9tbXhleHQodWludDhfdCAqZHN0LCBjb25zdCBpbnQxNl90ICpzcmMxNiwgY29uc3QgdWludDhfdCAqc3JjOCwgaW50IGRzdFN0cmlkZSwgaW50IHNyYzhTdHJpZGUsIGludCBoKTsKKworREVGX1FQRUwoYXZnKQorREVGX1FQRUwocHV0KQorCisjZGVmaW5lIFFQRUxfSDI2NChPUE5BTUUsIE9QLCBNTVgpXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbDRfaHZfbG93cGFzc18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqdG1wLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCB0bXBTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKKyAgICBpbnQgdz0zO1wKKyAgICBzcmMgLT0gMipzcmNTdHJpZGUrMjtcCisgICAgd2hpbGUody0tKXtcCisgICAgICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsNF9odl9sb3dwYXNzX3ZfbW14ZXh0KHNyYywgdG1wLCBzcmNTdHJpZGUpO1wKKyAgICAgICAgdG1wICs9IDQ7XAorICAgICAgICBzcmMgKz0gNDtcCisgICAgfVwKKyAgICB0bXAgLT0gMyo0O1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbDRfaHZfbG93cGFzc19oX21teGV4dCh0bXAsIGRzdCwgZHN0U3RyaWRlKTtcCit9XAorXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbDhvcjE2X3ZfbG93cGFzc18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgaCl7XAorICAgIHNyYyAtPSAyKnNyY1N0cmlkZTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl92X2xvd3Bhc3Nfb3BfbW14ZXh0KGRzdCwgc3JjLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgaCk7XAorICAgIHNyYyArPSA0O1wKKyAgICBkc3QgKz0gNDtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl92X2xvd3Bhc3Nfb3BfbW14ZXh0KGRzdCwgc3JjLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgaCk7XAorfVwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl9odjFfbG93cGFzc18gIyMgTU1YKGludDE2X3QgKnRtcCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgdG1wU3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgc2l6ZSl7XAorICAgIGludCB3ID0gKHNpemUrOCk+PjI7XAorICAgIHNyYyAtPSAyKnNyY1N0cmlkZSsyO1wKKyAgICB3aGlsZSh3LS0pe1wKKyAgICAgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl9odjFfbG93cGFzc19vcF9tbXhleHQoc3JjLCB0bXAsIHNyY1N0cmlkZSwgc2l6ZSk7XAorICAgICAgICB0bXAgKz0gNDtcCisgICAgICAgIHNyYyArPSA0O1wKKyAgICB9XAorfVwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl9odjJfbG93cGFzc18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqdG1wLCBpbnQgZHN0U3RyaWRlLCBpbnQgdG1wU3RyaWRlLCBpbnQgc2l6ZSl7XAorICAgIGludCB3ID0gc2l6ZT4+NDtcCisgICAgZG97XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOG9yMTZfaHYyX2xvd3Bhc3Nfb3BfbW14ZXh0KGRzdCwgdG1wLCBkc3RTdHJpZGUsIDAsIHNpemUpO1wKKyAgICB0bXAgKz0gODtcCisgICAgZHN0ICs9IDg7XAorICAgIH13aGlsZSh3LS0pO1wKK31cCitcCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOF92X2xvd3Bhc3NfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOG9yMTZfdl9sb3dwYXNzXyAjIyBNTVgoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgOCk7XAorfVwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOG9yMTZfdl9sb3dwYXNzXyAjIyBNTVgoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgMTYpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbDhvcjE2X3ZfbG93cGFzc18gIyMgTU1YKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIDE2KTtcCit9XAorXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbDE2X2hfbG93cGFzc18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbDhfaF9sb3dwYXNzXyAjIyBNTVgoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIHNyYyArPSA4KnNyY1N0cmlkZTtcCisgICAgZHN0ICs9IDgqZHN0U3RyaWRlO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbDhfaF9sb3dwYXNzXyAjIyBNTVgoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOF9oX2xvd3Bhc3NfICMjIE1NWChkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTtcCit9XAorXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbDE2X2hfbG93cGFzc19sMl8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjMlN0cmlkZSl7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfICMjIE1NWChkc3QgICwgc3JjICAsIHNyYzIgICwgZHN0U3RyaWRlLCBzcmMyU3RyaWRlKTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4X2hfbG93cGFzc19sMl8gIyMgTU1YKGRzdCs4LCBzcmMrOCwgc3JjMis4LCBkc3RTdHJpZGUsIHNyYzJTdHJpZGUpO1wKKyAgICBzcmMgKz0gOCpkc3RTdHJpZGU7XAorICAgIGRzdCArPSA4KmRzdFN0cmlkZTtcCisgICAgc3JjMiArPSA4KnNyYzJTdHJpZGU7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfICMjIE1NWChkc3QgICwgc3JjICAsIHNyYzIgICwgZHN0U3RyaWRlLCBzcmMyU3RyaWRlKTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4X2hfbG93cGFzc19sMl8gIyMgTU1YKGRzdCs4LCBzcmMrOCwgc3JjMis4LCBkc3RTdHJpZGUsIHNyYzJTdHJpZGUpO1wKK31cCitcCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOG9yMTZfaHZfbG93cGFzc18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqdG1wLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCB0bXBTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBzaXplKXtcCisgICAgZmZfcHV0X2gyNjRfcXBlbDhvcjE2X2h2MV9sb3dwYXNzXyAjIyBNTVgodG1wLCBzcmMsIHRtcFN0cmlkZSwgc3JjU3RyaWRlLCBzaXplKTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl9odjJfbG93cGFzc18gIyMgTU1YKGRzdCwgdG1wLCBkc3RTdHJpZGUsIHRtcFN0cmlkZSwgc2l6ZSk7XAorfVwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4X2h2X2xvd3Bhc3NfICMjIE1NWCh1aW50OF90ICpkc3QsIGludDE2X3QgKnRtcCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgdG1wU3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl9odl9sb3dwYXNzXyAjIyBNTVgoZHN0ICAsIHRtcCAgLCBzcmMgICwgZHN0U3RyaWRlLCB0bXBTdHJpZGUsIHNyY1N0cmlkZSwgOCk7XAorfVwKK1wKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWwxNl9odl9sb3dwYXNzXyAjIyBNTVgodWludDhfdCAqZHN0LCBpbnQxNl90ICp0bXAsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHRtcFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOG9yMTZfaHZfbG93cGFzc18gIyMgTU1YKGRzdCAgLCB0bXAgICwgc3JjICAsIGRzdFN0cmlkZSwgdG1wU3RyaWRlLCBzcmNTdHJpZGUsIDE2KTtcCit9XAorXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2X2wyX3NoaWZ0NV8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgaW50MTZfdCAqc3JjMTYsIGNvbnN0IHVpbnQ4X3QgKnNyYzgsIGludCBkc3RTdHJpZGUsIGludCBzcmM4U3RyaWRlLCBpbnQgaClcCit7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgcGl4ZWxzOF9sMl9zaGlmdDVfICMjIE1NWChkc3QgICwgc3JjMTYgICwgc3JjOCAgLCBkc3RTdHJpZGUsIHNyYzhTdHJpZGUsIGgpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfbDJfc2hpZnQ1XyAjIyBNTVgoZHN0KzgsIHNyYzE2KzgsIHNyYzgrOCwgZHN0U3RyaWRlLCBzcmM4U3RyaWRlLCBoKTtcCit9XAorCisKKyNpZiBBUkNIX1g4Nl82NAorI2RlZmluZSBRUEVMX0gyNjRfSDE2X1hNTShPUE5BTUUsIE9QLCBNTVgpXAorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbDJfc3NzZTModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCBkc3RTdHJpZGUsIGludCBzcmMyU3RyaWRlKTsKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X2hfbG93cGFzc19sMl9zc3NlMyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdFN0cmlkZSwgaW50IHNyYzJTdHJpZGUpOworCisjZWxzZSAvLyBBUkNIX1g4Nl82NAorI2RlZmluZSBRUEVMX0gyNjRfSDE2X1hNTShPUE5BTUUsIE9QLCBNTVgpXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbDE2X2hfbG93cGFzc19sMl8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjMlN0cmlkZSl7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfICMjIE1NWChkc3QgICwgc3JjICAsIHNyYzIgICwgZHN0U3RyaWRlLCBzcmMyU3RyaWRlKTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4X2hfbG93cGFzc19sMl8gIyMgTU1YKGRzdCs4LCBzcmMrOCwgc3JjMis4LCBkc3RTdHJpZGUsIHNyYzJTdHJpZGUpO1wKKyAgICBzcmMgKz0gOCpkc3RTdHJpZGU7XAorICAgIGRzdCArPSA4KmRzdFN0cmlkZTtcCisgICAgc3JjMiArPSA4KnNyYzJTdHJpZGU7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfICMjIE1NWChkc3QgICwgc3JjICAsIHNyYzIgICwgZHN0U3RyaWRlLCBzcmMyU3RyaWRlKTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4X2hfbG93cGFzc19sMl8gIyMgTU1YKGRzdCs4LCBzcmMrOCwgc3JjMis4LCBkc3RTdHJpZGUsIHNyYzJTdHJpZGUpO1wKK30KKyNlbmRpZiAvLyBBUkNIX1g4Nl82NAorCisjZGVmaW5lIFFQRUxfSDI2NF9IX1hNTShPUE5BTUUsIE9QLCBNTVgpXAorUVBFTF9IMjY0X0gxNl9YTU0oT1BOQU1FLCBPUCwgTU1YKVwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOF9oX2xvd3Bhc3NfICMjIE1NWChkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBzcmMgKz0gOCpzcmNTdHJpZGU7XAorICAgIGRzdCArPSA4KmRzdFN0cmlkZTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbDhfaF9sb3dwYXNzXyAjIyBNTVgoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAorfVwKKworI2RlZmluZSBRUEVMX0gyNjRfVl9YTU0oT1BOQU1FLCBPUCwgTU1YKVwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl92X2xvd3Bhc3NfICMjIE1NWChkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCA4KTtcCit9XAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbDE2X3ZfbG93cGFzc18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl92X2xvd3Bhc3NfICMjIE1NWChkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCAxNik7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOG9yMTZfdl9sb3dwYXNzXyAjIyBNTVgoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgMTYpO1wKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBwdXRfaDI2NF9xcGVsOG9yMTZfaHYxX2xvd3Bhc3Nfc3NlMihpbnQxNl90ICp0bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRtcFN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCit7CisgICAgaW50IHcgPSAoc2l6ZSs4KT4+MzsKKyAgICBzcmMgLT0gMipzcmNTdHJpZGUrMjsKKyAgICB3aGlsZSh3LS0peworICAgICAgICBmZl9wdXRfaDI2NF9xcGVsOG9yMTZfaHYxX2xvd3Bhc3Nfb3Bfc3NlMihzcmMsIHRtcCwgc3JjU3RyaWRlLCBzaXplKTsKKyAgICAgICAgdG1wICs9IDg7CisgICAgICAgIHNyYyArPSA4OworICAgIH0KK30KKworI2RlZmluZSBRUEVMX0gyNjRfSFZfWE1NKE9QTkFNRSwgT1AsIE1NWClcCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOG9yMTZfaHZfbG93cGFzc18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqdG1wLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCB0bXBTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBzaXplKXtcCisgICAgcHV0X2gyNjRfcXBlbDhvcjE2X2h2MV9sb3dwYXNzX3NzZTIodG1wLCBzcmMsIHRtcFN0cmlkZSwgc3JjU3RyaWRlLCBzaXplKTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl9odjJfbG93cGFzc18gIyMgTU1YKGRzdCwgdG1wLCBkc3RTdHJpZGUsIHRtcFN0cmlkZSwgc2l6ZSk7XAorfVwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4X2h2X2xvd3Bhc3NfICMjIE1NWCh1aW50OF90ICpkc3QsIGludDE2X3QgKnRtcCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgdG1wU3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl9odl9sb3dwYXNzXyAjIyBNTVgoZHN0LCB0bXAsIHNyYywgZHN0U3RyaWRlLCB0bXBTdHJpZGUsIHNyY1N0cmlkZSwgOCk7XAorfVwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWwxNl9odl9sb3dwYXNzXyAjIyBNTVgodWludDhfdCAqZHN0LCBpbnQxNl90ICp0bXAsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHRtcFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsOG9yMTZfaHZfbG93cGFzc18gIyMgTU1YKGRzdCwgdG1wLCBzcmMsIGRzdFN0cmlkZSwgdG1wU3RyaWRlLCBzcmNTdHJpZGUsIDE2KTtcCit9XAorCisjZGVmaW5lIGZmX3B1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19sMl9zc2UyICBmZl9wdXRfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfbW14ZXh0CisjZGVmaW5lIGZmX2F2Z19oMjY0X3FwZWw4X2hfbG93cGFzc19sMl9zc2UyICBmZl9hdmdfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfbW14ZXh0CisjZGVmaW5lIGZmX3B1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbDJfc3NlMiBmZl9wdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX2wyX21teGV4dAorI2RlZmluZSBmZl9hdmdfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX2wyX3NzZTIgZmZfYXZnX2gyNjRfcXBlbDE2X2hfbG93cGFzc19sMl9tbXhleHQKKworI2RlZmluZSBmZl9wdXRfaDI2NF9xcGVsOF92X2xvd3Bhc3Nfc3NzZTMgIGZmX3B1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19zc2UyCisjZGVmaW5lIGZmX2F2Z19oMjY0X3FwZWw4X3ZfbG93cGFzc19zc3NlMyAgZmZfYXZnX2gyNjRfcXBlbDhfdl9sb3dwYXNzX3NzZTIKKyNkZWZpbmUgZmZfcHV0X2gyNjRfcXBlbDE2X3ZfbG93cGFzc19zc3NlMyBmZl9wdXRfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX3NzZTIKKyNkZWZpbmUgZmZfYXZnX2gyNjRfcXBlbDE2X3ZfbG93cGFzc19zc3NlMyBmZl9hdmdfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX3NzZTIKKworI2RlZmluZSBmZl9wdXRfaDI2NF9xcGVsOG9yMTZfaHYyX2xvd3Bhc3Nfc3NlMiBmZl9wdXRfaDI2NF9xcGVsOG9yMTZfaHYyX2xvd3Bhc3NfbW14ZXh0CisjZGVmaW5lIGZmX2F2Z19oMjY0X3FwZWw4b3IxNl9odjJfbG93cGFzc19zc2UyIGZmX2F2Z19oMjY0X3FwZWw4b3IxNl9odjJfbG93cGFzc19tbXhleHQKKworI2RlZmluZSBIMjY0X01DKE9QTkFNRSwgU0laRSwgTU1YLCBBTElHTikgXAorSDI2NF9NQ19DKE9QTkFNRSwgU0laRSwgTU1YLCBBTElHTilcCitIMjY0X01DX1YoT1BOQU1FLCBTSVpFLCBNTVgsIEFMSUdOKVwKK0gyNjRfTUNfSChPUE5BTUUsIFNJWkUsIE1NWCwgQUxJR04pXAorSDI2NF9NQ19IVihPUE5BTUUsIFNJWkUsIE1NWCwgQUxJR04pXAorCitzdGF0aWMgdm9pZCBwdXRfaDI2NF9xcGVsMTZfbWMwMF9zc2UyICh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgZmZfcHV0X3BpeGVsczE2X3NzZTIoZHN0LCBzcmMsIHN0cmlkZSwgMTYpOworfQorc3RhdGljIHZvaWQgYXZnX2gyNjRfcXBlbDE2X21jMDBfc3NlMiAodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGZmX2F2Z19waXhlbHMxNl9zc2UyKGRzdCwgc3JjLCBzdHJpZGUsIDE2KTsKK30KKyNkZWZpbmUgcHV0X2gyNjRfcXBlbDhfbWMwMF9zc2UyIHB1dF9oMjY0X3FwZWw4X21jMDBfbW14ZXh0CisjZGVmaW5lIGF2Z19oMjY0X3FwZWw4X21jMDBfc3NlMiBhdmdfaDI2NF9xcGVsOF9tYzAwX21teGV4dAorCisjZGVmaW5lIEgyNjRfTUNfQyhPUE5BTUUsIFNJWkUsIE1NWCwgQUxJR04pIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMwMF8gIyMgTU1YICh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgcGl4ZWxzICMjIFNJWkUgIyMgXyAjIyBNTVgoZHN0LCBzcmMsIHN0cmlkZSwgU0laRSk7XAorfVwKKworI2RlZmluZSBIMjY0X01DX0goT1BOQU1FLCBTSVpFLCBNTVgsIEFMSUdOKSBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMTBfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX2hfbG93cGFzc19sMl8gIyMgTU1YKGRzdCwgc3JjLCBzcmMsIHN0cmlkZSwgc3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzIwXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3NfICMjIE1NWChkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMzBfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX2hfbG93cGFzc19sMl8gIyMgTU1YKGRzdCwgc3JjLCBzcmMrMSwgc3RyaWRlLCBzdHJpZGUpO1wKK31cCisKKyNkZWZpbmUgSDI2NF9NQ19WKE9QTkFNRSwgU0laRSwgTU1YLCBBTElHTikgXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzAxXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBERUNMQVJFX0FMSUdORUQoQUxJR04sIHVpbnQ4X3QsIHRlbXApW1NJWkUqU0laRV07XAorICAgIGZmX3B1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzXyAjIyBNTVgodGVtcCwgc3JjLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVscyAjIyBTSVpFICMjIF9sMl8gIyMgTU1YKGRzdCwgc3JjLCB0ZW1wLCBzdHJpZGUsIHN0cmlkZSwgU0laRSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMwMl8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzXyAjIyBNTVgoZHN0LCBzcmMsIHN0cmlkZSwgc3RyaWRlKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzAzXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBERUNMQVJFX0FMSUdORUQoQUxJR04sIHVpbnQ4X3QsIHRlbXApW1NJWkUqU0laRV07XAorICAgIGZmX3B1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzXyAjIyBNTVgodGVtcCwgc3JjLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVscyAjIyBTSVpFICMjIF9sMl8gIyMgTU1YKGRzdCwgc3JjK3N0cmlkZSwgdGVtcCwgc3RyaWRlLCBzdHJpZGUsIFNJWkUpO1wKK31cCisKKyNkZWZpbmUgSDI2NF9NQ19IVihPUE5BTUUsIFNJWkUsIE1NWCwgQUxJR04pIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMxMV8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgREVDTEFSRV9BTElHTkVEKEFMSUdOLCB1aW50OF90LCB0ZW1wKVtTSVpFKlNJWkVdO1wKKyAgICBmZl9wdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzc18gIyMgTU1YKHRlbXAsIHNyYywgU0laRSwgc3RyaWRlKTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfaF9sb3dwYXNzX2wyXyAjIyBNTVgoZHN0LCBzcmMsIHRlbXAsIHN0cmlkZSwgU0laRSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMzMV8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgREVDTEFSRV9BTElHTkVEKEFMSUdOLCB1aW50OF90LCB0ZW1wKVtTSVpFKlNJWkVdO1wKKyAgICBmZl9wdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzc18gIyMgTU1YKHRlbXAsIHNyYysxLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3NfbDJfICMjIE1NWChkc3QsIHNyYywgdGVtcCwgc3RyaWRlLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzEzXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBERUNMQVJFX0FMSUdORUQoQUxJR04sIHVpbnQ4X3QsIHRlbXApW1NJWkUqU0laRV07XAorICAgIGZmX3B1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfdl9sb3dwYXNzXyAjIyBNTVgodGVtcCwgc3JjLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3NfbDJfICMjIE1NWChkc3QsIHNyYytzdHJpZGUsIHRlbXAsIHN0cmlkZSwgU0laRSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMzM18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgREVDTEFSRV9BTElHTkVEKEFMSUdOLCB1aW50OF90LCB0ZW1wKVtTSVpFKlNJWkVdO1wKKyAgICBmZl9wdXRfaDI2NF9xcGVsICMjIFNJWkUgIyMgX3ZfbG93cGFzc18gIyMgTU1YKHRlbXAsIHNyYysxLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3NfbDJfICMjIE1NWChkc3QsIHNyYytzdHJpZGUsIHRlbXAsIHN0cmlkZSwgU0laRSk7XAorfVwKK1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBoMjY0X3FwZWwgIyMgU0laRSAjIyBfbWMyMl8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKVwKK3tcCisgICAgREVDTEFSRV9BTElHTkVEKEFMSUdOLCB1aW50MTZfdCwgdGVtcClbU0laRSooU0laRTw4PzEyOjI0KV07XAorICAgIGZmXyAjIyBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX2h2X2xvd3Bhc3NfICMjIE1NWChkc3QsIHRlbXAsIHNyYywgc3RyaWRlLCBTSVpFLCBzdHJpZGUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMjFfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIERFQ0xBUkVfQUxJR05FRChBTElHTiwgdWludDhfdCwgdGVtcClbU0laRSooU0laRTw4PzEyOjI0KSoyICsgU0laRSpTSVpFXTtcCisgICAgdWludDhfdCAqIGNvbnN0IGhhbGZIVj0gdGVtcDtcCisgICAgaW50MTZfdCAqIGNvbnN0IGhhbGZWPSAoaW50MTZfdCopKHRlbXAgKyBTSVpFKlNJWkUpO1wKKyAgICBhdl9hc3NlcnQyKCgoaW50KXRlbXAgJiA3KSA9PSAwKTtcCisgICAgZmZfcHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF9odl9sb3dwYXNzXyAjIyBNTVgoaGFsZkhWLCBoYWxmViwgc3JjLCBTSVpFLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3NfbDJfICMjIE1NWChkc3QsIHNyYywgaGFsZkhWLCBzdHJpZGUsIFNJWkUpO1wKK31cCitcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgaDI2NF9xcGVsICMjIFNJWkUgIyMgX21jMjNfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSlcCit7XAorICAgIERFQ0xBUkVfQUxJR05FRChBTElHTiwgdWludDhfdCwgdGVtcClbU0laRSooU0laRTw4PzEyOjI0KSoyICsgU0laRSpTSVpFXTtcCisgICAgdWludDhfdCAqIGNvbnN0IGhhbGZIVj0gdGVtcDtcCisgICAgaW50MTZfdCAqIGNvbnN0IGhhbGZWPSAoaW50MTZfdCopKHRlbXAgKyBTSVpFKlNJWkUpO1wKKyAgICBhdl9hc3NlcnQyKCgoaW50KXRlbXAgJiA3KSA9PSAwKTtcCisgICAgZmZfcHV0X2gyNjRfcXBlbCAjIyBTSVpFICMjIF9odl9sb3dwYXNzXyAjIyBNTVgoaGFsZkhWLCBoYWxmViwgc3JjLCBTSVpFLCBTSVpFLCBzdHJpZGUpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9oX2xvd3Bhc3NfbDJfICMjIE1NWChkc3QsIHNyYytzdHJpZGUsIGhhbGZIViwgc3RyaWRlLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzEyXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBERUNMQVJFX0FMSUdORUQoQUxJR04sIHVpbnQ4X3QsIHRlbXApW1NJWkUqKFNJWkU8OD8xMjoyNCkqMiArIFNJWkUqU0laRV07XAorICAgIHVpbnQ4X3QgKiBjb25zdCBoYWxmSFY9IHRlbXA7XAorICAgIGludDE2X3QgKiBjb25zdCBoYWxmVj0gKGludDE2X3QqKSh0ZW1wICsgU0laRSpTSVpFKTtcCisgICAgYXZfYXNzZXJ0MigoKGludCl0ZW1wICYgNykgPT0gMCk7XAorICAgIGZmX3B1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfaHZfbG93cGFzc18gIyMgTU1YKGhhbGZIViwgaGFsZlYsIHNyYywgU0laRSwgU0laRSwgc3RyaWRlKTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDJfc2hpZnQ1X21teGV4dChkc3QsIGhhbGZWKzIsIGhhbGZIViwgc3RyaWRlLCBTSVpFLCBTSVpFKTtcCit9XAorXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGgyNjRfcXBlbCAjIyBTSVpFICMjIF9tYzMyXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpXAore1wKKyAgICBERUNMQVJFX0FMSUdORUQoQUxJR04sIHVpbnQ4X3QsIHRlbXApW1NJWkUqKFNJWkU8OD8xMjoyNCkqMiArIFNJWkUqU0laRV07XAorICAgIHVpbnQ4X3QgKiBjb25zdCBoYWxmSFY9IHRlbXA7XAorICAgIGludDE2X3QgKiBjb25zdCBoYWxmVj0gKGludDE2X3QqKSh0ZW1wICsgU0laRSpTSVpFKTtcCisgICAgYXZfYXNzZXJ0MigoKGludCl0ZW1wICYgNykgPT0gMCk7XAorICAgIGZmX3B1dF9oMjY0X3FwZWwgIyMgU0laRSAjIyBfaHZfbG93cGFzc18gIyMgTU1YKGhhbGZIViwgaGFsZlYsIHNyYywgU0laRSwgU0laRSwgc3RyaWRlKTtcCisgICAgZmZfICMjIE9QTkFNRSAjIyBwaXhlbHMgIyMgU0laRSAjIyBfbDJfc2hpZnQ1X21teGV4dChkc3QsIGhhbGZWKzMsIGhhbGZIViwgc3RyaWRlLCBTSVpFLCBTSVpFKTtcCit9XAorCisjZGVmaW5lIEgyNjRfTUNfNDgxNihNTVgpXAorSDI2NF9NQyhwdXRfLCA0LCBNTVgsIDgpXAorSDI2NF9NQyhwdXRfLCA4LCBNTVgsIDgpXAorSDI2NF9NQyhwdXRfLCAxNixNTVgsIDgpXAorSDI2NF9NQyhhdmdfLCA0LCBNTVgsIDgpXAorSDI2NF9NQyhhdmdfLCA4LCBNTVgsIDgpXAorSDI2NF9NQyhhdmdfLCAxNixNTVgsIDgpXAorCisjZGVmaW5lIEgyNjRfTUNfODE2KFFQRUwsIFhNTSlcCitRUEVMKHB1dF8sIDgsIFhNTSwgMTYpXAorUVBFTChwdXRfLCAxNixYTU0sIDE2KVwKK1FQRUwoYXZnXywgOCwgWE1NLCAxNilcCitRUEVMKGF2Z18sIDE2LFhNTSwgMTYpXAorCitRUEVMX0gyNjQocHV0XywgICAgICAgIFBVVF9PUCwgbW14ZXh0KQorUVBFTF9IMjY0KGF2Z18sIEFWR19NTVhFWFRfT1AsIG1teGV4dCkKK1FQRUxfSDI2NF9WX1hNTShwdXRfLCAgICAgICBQVVRfT1AsIHNzZTIpCitRUEVMX0gyNjRfVl9YTU0oYXZnXyxBVkdfTU1YRVhUX09QLCBzc2UyKQorUVBFTF9IMjY0X0hWX1hNTShwdXRfLCAgICAgICBQVVRfT1AsIHNzZTIpCitRUEVMX0gyNjRfSFZfWE1NKGF2Z18sQVZHX01NWEVYVF9PUCwgc3NlMikKK1FQRUxfSDI2NF9IX1hNTShwdXRfLCAgICAgICBQVVRfT1AsIHNzc2UzKQorUVBFTF9IMjY0X0hfWE1NKGF2Z18sQVZHX01NWEVYVF9PUCwgc3NzZTMpCitRUEVMX0gyNjRfSFZfWE1NKHB1dF8sICAgICAgIFBVVF9PUCwgc3NzZTMpCitRUEVMX0gyNjRfSFZfWE1NKGF2Z18sQVZHX01NWEVYVF9PUCwgc3NzZTMpCisKK0gyNjRfTUNfNDgxNihtbXhleHQpCitIMjY0X01DXzgxNihIMjY0X01DX1YsIHNzZTIpCitIMjY0X01DXzgxNihIMjY0X01DX0hWLCBzc2UyKQorSDI2NF9NQ184MTYoSDI2NF9NQ19ILCBzc3NlMykKK0gyNjRfTUNfODE2KEgyNjRfTUNfSFYsIHNzc2UzKQorCisKKy8vMTBiaXQKKyNkZWZpbmUgTFVNQV9NQ19PUChPUCwgTlVNLCBERVBUSCwgVFlQRSwgT1BUKSBcCit2b2lkIGZmXyAjIyBPUCAjIyBfaDI2NF9xcGVsICMjIE5VTSAjIyBfICMjIFRZUEUgIyMgXyAjIyBERVBUSCAjIyBfICMjIE9QVCBcCisgICAgKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKworI2RlZmluZSBMVU1BX01DX0FMTChERVBUSCwgVFlQRSwgT1BUKSBcCisgICAgTFVNQV9NQ19PUChwdXQsICA0LCBERVBUSCwgVFlQRSwgT1BUKSBcCisgICAgTFVNQV9NQ19PUChhdmcsICA0LCBERVBUSCwgVFlQRSwgT1BUKSBcCisgICAgTFVNQV9NQ19PUChwdXQsICA4LCBERVBUSCwgVFlQRSwgT1BUKSBcCisgICAgTFVNQV9NQ19PUChhdmcsICA4LCBERVBUSCwgVFlQRSwgT1BUKSBcCisgICAgTFVNQV9NQ19PUChwdXQsIDE2LCBERVBUSCwgVFlQRSwgT1BUKSBcCisgICAgTFVNQV9NQ19PUChhdmcsIDE2LCBERVBUSCwgVFlQRSwgT1BUKQorCisjZGVmaW5lIExVTUFfTUNfODE2KERFUFRILCBUWVBFLCBPUFQpIFwKKyAgICBMVU1BX01DX09QKHB1dCwgIDgsIERFUFRILCBUWVBFLCBPUFQpIFwKKyAgICBMVU1BX01DX09QKGF2ZywgIDgsIERFUFRILCBUWVBFLCBPUFQpIFwKKyAgICBMVU1BX01DX09QKHB1dCwgMTYsIERFUFRILCBUWVBFLCBPUFQpIFwKKyAgICBMVU1BX01DX09QKGF2ZywgMTYsIERFUFRILCBUWVBFLCBPUFQpCisKK0xVTUFfTUNfQUxMKDEwLCBtYzAwLCBtbXhleHQpCitMVU1BX01DX0FMTCgxMCwgbWMxMCwgbW14ZXh0KQorTFVNQV9NQ19BTEwoMTAsIG1jMjAsIG1teGV4dCkKK0xVTUFfTUNfQUxMKDEwLCBtYzMwLCBtbXhleHQpCitMVU1BX01DX0FMTCgxMCwgbWMwMSwgbW14ZXh0KQorTFVNQV9NQ19BTEwoMTAsIG1jMTEsIG1teGV4dCkKK0xVTUFfTUNfQUxMKDEwLCBtYzIxLCBtbXhleHQpCitMVU1BX01DX0FMTCgxMCwgbWMzMSwgbW14ZXh0KQorTFVNQV9NQ19BTEwoMTAsIG1jMDIsIG1teGV4dCkKK0xVTUFfTUNfQUxMKDEwLCBtYzEyLCBtbXhleHQpCitMVU1BX01DX0FMTCgxMCwgbWMyMiwgbW14ZXh0KQorTFVNQV9NQ19BTEwoMTAsIG1jMzIsIG1teGV4dCkKK0xVTUFfTUNfQUxMKDEwLCBtYzAzLCBtbXhleHQpCitMVU1BX01DX0FMTCgxMCwgbWMxMywgbW14ZXh0KQorTFVNQV9NQ19BTEwoMTAsIG1jMjMsIG1teGV4dCkKK0xVTUFfTUNfQUxMKDEwLCBtYzMzLCBtbXhleHQpCisKK0xVTUFfTUNfODE2KDEwLCBtYzAwLCBzc2UyKQorTFVNQV9NQ184MTYoMTAsIG1jMTAsIHNzZTIpCitMVU1BX01DXzgxNigxMCwgbWMxMCwgc3NlMl9jYWNoZTY0KQorTFVNQV9NQ184MTYoMTAsIG1jMTAsIHNzc2UzX2NhY2hlNjQpCitMVU1BX01DXzgxNigxMCwgbWMyMCwgc3NlMikKK0xVTUFfTUNfODE2KDEwLCBtYzIwLCBzc2UyX2NhY2hlNjQpCitMVU1BX01DXzgxNigxMCwgbWMyMCwgc3NzZTNfY2FjaGU2NCkKK0xVTUFfTUNfODE2KDEwLCBtYzMwLCBzc2UyKQorTFVNQV9NQ184MTYoMTAsIG1jMzAsIHNzZTJfY2FjaGU2NCkKK0xVTUFfTUNfODE2KDEwLCBtYzMwLCBzc3NlM19jYWNoZTY0KQorTFVNQV9NQ184MTYoMTAsIG1jMDEsIHNzZTIpCitMVU1BX01DXzgxNigxMCwgbWMxMSwgc3NlMikKK0xVTUFfTUNfODE2KDEwLCBtYzIxLCBzc2UyKQorTFVNQV9NQ184MTYoMTAsIG1jMzEsIHNzZTIpCitMVU1BX01DXzgxNigxMCwgbWMwMiwgc3NlMikKK0xVTUFfTUNfODE2KDEwLCBtYzEyLCBzc2UyKQorTFVNQV9NQ184MTYoMTAsIG1jMjIsIHNzZTIpCitMVU1BX01DXzgxNigxMCwgbWMzMiwgc3NlMikKK0xVTUFfTUNfODE2KDEwLCBtYzAzLCBzc2UyKQorTFVNQV9NQ184MTYoMTAsIG1jMTMsIHNzZTIpCitMVU1BX01DXzgxNigxMCwgbWMyMywgc3NlMikKK0xVTUFfTUNfODE2KDEwLCBtYzMzLCBzc2UyKQorCisjZGVmaW5lIFFQRUwxNl9PUE1DKE9QLCBNQywgTU1YKVwKK3ZvaWQgZmZfICMjIE9QICMjIF9oMjY0X3FwZWwxNl8gIyMgTUMgIyMgXzEwXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpe1wKKyAgICBmZl8gIyMgT1AgIyMgX2gyNjRfcXBlbDhfICMjIE1DICMjIF8xMF8gIyMgTU1YKGRzdCAgICwgc3JjICAgLCBzdHJpZGUpO1wKKyAgICBmZl8gIyMgT1AgIyMgX2gyNjRfcXBlbDhfICMjIE1DICMjIF8xMF8gIyMgTU1YKGRzdCsxNiwgc3JjKzE2LCBzdHJpZGUpO1wKKyAgICBzcmMgKz0gOCpzdHJpZGU7XAorICAgIGRzdCArPSA4KnN0cmlkZTtcCisgICAgZmZfICMjIE9QICMjIF9oMjY0X3FwZWw4XyAjIyBNQyAjIyBfMTBfICMjIE1NWChkc3QgICAsIHNyYyAgICwgc3RyaWRlKTtcCisgICAgZmZfICMjIE9QICMjIF9oMjY0X3FwZWw4XyAjIyBNQyAjIyBfMTBfICMjIE1NWChkc3QrMTYsIHNyYysxNiwgc3RyaWRlKTtcCit9CisKKyNkZWZpbmUgUVBFTDE2X09QKE1DLCBNTVgpXAorUVBFTDE2X09QTUMocHV0LCBNQywgTU1YKVwKK1FQRUwxNl9PUE1DKGF2ZywgTUMsIE1NWCkKKworI2RlZmluZSBRUEVMMTYoTU1YKVwKK1FQRUwxNl9PUChtYzAwLCBNTVgpXAorUVBFTDE2X09QKG1jMDEsIE1NWClcCitRUEVMMTZfT1AobWMwMiwgTU1YKVwKK1FQRUwxNl9PUChtYzAzLCBNTVgpXAorUVBFTDE2X09QKG1jMTAsIE1NWClcCitRUEVMMTZfT1AobWMxMSwgTU1YKVwKK1FQRUwxNl9PUChtYzEyLCBNTVgpXAorUVBFTDE2X09QKG1jMTMsIE1NWClcCitRUEVMMTZfT1AobWMyMCwgTU1YKVwKK1FQRUwxNl9PUChtYzIxLCBNTVgpXAorUVBFTDE2X09QKG1jMjIsIE1NWClcCitRUEVMMTZfT1AobWMyMywgTU1YKVwKK1FQRUwxNl9PUChtYzMwLCBNTVgpXAorUVBFTDE2X09QKG1jMzEsIE1NWClcCitRUEVMMTZfT1AobWMzMiwgTU1YKVwKK1FQRUwxNl9PUChtYzMzLCBNTVgpCisKKyNpZiBBUkNIX1g4Nl8zMiAvLyBBUkNIX1g4Nl82NCBpbXBsaWVzIFNTRTIrCitRUEVMMTYobW14ZXh0KQorI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKworI2RlZmluZSBTRVRfUVBFTF9GVU5DUyhQRlgsIElEWCwgU0laRSwgQ1BVLCBQUkVGSVgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgMF0gPSBQUkVGSVggIyMgUEZYICMjIFNJWkUgIyMgX21jMDBfICMjIENQVTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyAxXSA9IFBSRUZJWCAjIyBQRlggIyMgU0laRSAjIyBfbWMxMF8gIyMgQ1BVOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bIDJdID0gUFJFRklYICMjIFBGWCAjIyBTSVpFICMjIF9tYzIwXyAjIyBDUFU7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgM10gPSBQUkVGSVggIyMgUEZYICMjIFNJWkUgIyMgX21jMzBfICMjIENQVTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA0XSA9IFBSRUZJWCAjIyBQRlggIyMgU0laRSAjIyBfbWMwMV8gIyMgQ1BVOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bIDVdID0gUFJFRklYICMjIFBGWCAjIyBTSVpFICMjIF9tYzExXyAjIyBDUFU7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgNl0gPSBQUkVGSVggIyMgUEZYICMjIFNJWkUgIyMgX21jMjFfICMjIENQVTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA3XSA9IFBSRUZJWCAjIyBQRlggIyMgU0laRSAjIyBfbWMzMV8gIyMgQ1BVOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bIDhdID0gUFJFRklYICMjIFBGWCAjIyBTSVpFICMjIF9tYzAyXyAjIyBDUFU7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgOV0gPSBQUkVGSVggIyMgUEZYICMjIFNJWkUgIyMgX21jMTJfICMjIENQVTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzEwXSA9IFBSRUZJWCAjIyBQRlggIyMgU0laRSAjIyBfbWMyMl8gIyMgQ1BVOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTFdID0gUFJFRklYICMjIFBGWCAjIyBTSVpFICMjIF9tYzMyXyAjIyBDUFU7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxMl0gPSBQUkVGSVggIyMgUEZYICMjIFNJWkUgIyMgX21jMDNfICMjIENQVTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzEzXSA9IFBSRUZJWCAjIyBQRlggIyMgU0laRSAjIyBfbWMxM18gIyMgQ1BVOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTRdID0gUFJFRklYICMjIFBGWCAjIyBTSVpFICMjIF9tYzIzXyAjIyBDUFU7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxNV0gPSBQUkVGSVggIyMgUEZYICMjIFNJWkUgIyMgX21jMzNfICMjIENQVTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgSDI2NF9RUEVMX0ZVTkNTKHgsIHksIENQVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjLT5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1beCArIHkgKiA0XSA9IHB1dF9oMjY0X3FwZWwxNl9tYyAjIyB4ICMjIHkgIyMgXyAjIyBDUFU7IFwKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdW3ggKyB5ICogNF0gPSBwdXRfaDI2NF9xcGVsOF9tYyAgIyMgeCAjIyB5ICMjIF8gIyMgQ1BVOyBcCisgICAgICAgIGMtPmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYlswXVt4ICsgeSAqIDRdID0gYXZnX2gyNjRfcXBlbDE2X21jICMjIHggIyMgeSAjIyBfICMjIENQVTsgXAorICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMV1beCArIHkgKiA0XSA9IGF2Z19oMjY0X3FwZWw4X21jICAjIyB4ICMjIHkgIyMgXyAjIyBDUFU7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEgyNjRfUVBFTF9GVU5DU18xMCh4LCB5LCBDUFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYy0+cHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiWzBdW3ggKyB5ICogNF0gPSBmZl9wdXRfaDI2NF9xcGVsMTZfbWMgIyMgeCAjIyB5ICMjIF8xMF8gIyMgQ1BVOyBcCisgICAgICAgIGMtPnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYlsxXVt4ICsgeSAqIDRdID0gZmZfcHV0X2gyNjRfcXBlbDhfbWMgICMjIHggIyMgeSAjIyBfMTBfICMjIENQVTsgXAorICAgICAgICBjLT5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWJbMF1beCArIHkgKiA0XSA9IGZmX2F2Z19oMjY0X3FwZWwxNl9tYyAjIyB4ICMjIHkgIyMgXzEwXyAjIyBDUFU7IFwKKyAgICAgICAgYy0+YXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiWzFdW3ggKyB5ICogNF0gPSBmZl9hdmdfaDI2NF9xcGVsOF9tYyAgIyMgeCAjIyB5ICMjIF8xMF8gIyMgQ1BVOyBcCisgICAgfSB3aGlsZSAoMCkKKworYXZfY29sZCB2b2lkIGZmX2gyNjRxcGVsX2luaXRfeDg2KEgyNjRRcGVsQ29udGV4dCAqYywgaW50IGJpdF9kZXB0aCkKK3sKKyNpZiBIQVZFX1lBU00KKyAgICBpbnQgaGlnaF9iaXRfZGVwdGggPSBiaXRfZGVwdGggPiA4OworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgaWYgKCFoaWdoX2JpdF9kZXB0aCkgeworICAgICAgICAgICAgU0VUX1FQRUxfRlVOQ1MocHV0X2gyNjRfcXBlbCwgMCwgMTYsIG1teGV4dCwgKTsKKyAgICAgICAgICAgIFNFVF9RUEVMX0ZVTkNTKHB1dF9oMjY0X3FwZWwsIDEsICA4LCBtbXhleHQsICk7CisgICAgICAgICAgICBTRVRfUVBFTF9GVU5DUyhwdXRfaDI2NF9xcGVsLCAyLCAgNCwgbW14ZXh0LCApOworICAgICAgICAgICAgU0VUX1FQRUxfRlVOQ1MoYXZnX2gyNjRfcXBlbCwgMCwgMTYsIG1teGV4dCwgKTsKKyAgICAgICAgICAgIFNFVF9RUEVMX0ZVTkNTKGF2Z19oMjY0X3FwZWwsIDEsICA4LCBtbXhleHQsICk7CisgICAgICAgICAgICBTRVRfUVBFTF9GVU5DUyhhdmdfaDI2NF9xcGVsLCAyLCAgNCwgbW14ZXh0LCApOworICAgICAgICB9IGVsc2UgaWYgKGJpdF9kZXB0aCA9PSAxMCkgeworI2lmIEFSQ0hfWDg2XzMyCisgICAgICAgICAgICBTRVRfUVBFTF9GVU5DUyhhdmdfaDI2NF9xcGVsLCAwLCAxNiwgMTBfbW14ZXh0LCBmZl8pOworICAgICAgICAgICAgU0VUX1FQRUxfRlVOQ1MocHV0X2gyNjRfcXBlbCwgMCwgMTYsIDEwX21teGV4dCwgZmZfKTsKKyAgICAgICAgICAgIFNFVF9RUEVMX0ZVTkNTKHB1dF9oMjY0X3FwZWwsIDEsICA4LCAxMF9tbXhleHQsIGZmXyk7CisgICAgICAgICAgICBTRVRfUVBFTF9GVU5DUyhhdmdfaDI2NF9xcGVsLCAxLCAgOCwgMTBfbW14ZXh0LCBmZl8pOworI2VuZGlmCisgICAgICAgICAgICBTRVRfUVBFTF9GVU5DUyhwdXRfaDI2NF9xcGVsLCAyLCA0LCAgMTBfbW14ZXh0LCBmZl8pOworICAgICAgICAgICAgU0VUX1FQRUxfRlVOQ1MoYXZnX2gyNjRfcXBlbCwgMiwgNCwgIDEwX21teGV4dCwgZmZfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgaWYgKCEoY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfU1NFMlNMT1cpICYmICFoaWdoX2JpdF9kZXB0aCkgeworICAgICAgICAgICAgLy8gdGhlc2UgZnVuY3Rpb25zIGFyZSBzbG93ZXIgdGhhbiBtbXggb24gQU1ELCBidXQgZmFzdGVyIG9uIEludGVsCisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMCwgMCwgc3NlMik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWhpZ2hfYml0X2RlcHRoKSB7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMCwgMSwgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMCwgMiwgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMCwgMywgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMSwgMSwgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMSwgMiwgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMSwgMywgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMiwgMSwgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMiwgMiwgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMiwgMywgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMywgMSwgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMywgMiwgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMywgMywgc3NlMik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYml0X2RlcHRoID09IDEwKSB7CisgICAgICAgICAgICBTRVRfUVBFTF9GVU5DUyhwdXRfaDI2NF9xcGVsLCAwLCAxNiwgMTBfc3NlMiwgZmZfKTsKKyAgICAgICAgICAgIFNFVF9RUEVMX0ZVTkNTKHB1dF9oMjY0X3FwZWwsIDEsICA4LCAxMF9zc2UyLCBmZl8pOworICAgICAgICAgICAgU0VUX1FQRUxfRlVOQ1MoYXZnX2gyNjRfcXBlbCwgMCwgMTYsIDEwX3NzZTIsIGZmXyk7CisgICAgICAgICAgICBTRVRfUVBFTF9GVU5DUyhhdmdfaDI2NF9xcGVsLCAxLCAgOCwgMTBfc3NlMiwgZmZfKTsKKyAgICAgICAgICAgIEgyNjRfUVBFTF9GVU5DU18xMCgxLCAwLCBzc2UyX2NhY2hlNjQpOworICAgICAgICAgICAgSDI2NF9RUEVMX0ZVTkNTXzEwKDIsIDAsIHNzZTJfY2FjaGU2NCk7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1NfMTAoMywgMCwgc3NlMl9jYWNoZTY0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlmICghaGlnaF9iaXRfZGVwdGgpIHsKKyAgICAgICAgICAgIEgyNjRfUVBFTF9GVU5DUygxLCAwLCBzc3NlMyk7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMSwgMSwgc3NzZTMpOworICAgICAgICAgICAgSDI2NF9RUEVMX0ZVTkNTKDEsIDIsIHNzc2UzKTsKKyAgICAgICAgICAgIEgyNjRfUVBFTF9GVU5DUygxLCAzLCBzc3NlMyk7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMiwgMCwgc3NzZTMpOworICAgICAgICAgICAgSDI2NF9RUEVMX0ZVTkNTKDIsIDEsIHNzc2UzKTsKKyAgICAgICAgICAgIEgyNjRfUVBFTF9GVU5DUygyLCAyLCBzc3NlMyk7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMiwgMywgc3NzZTMpOworICAgICAgICAgICAgSDI2NF9RUEVMX0ZVTkNTKDMsIDAsIHNzc2UzKTsKKyAgICAgICAgICAgIEgyNjRfUVBFTF9GVU5DUygzLCAxLCBzc3NlMyk7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1MoMywgMiwgc3NzZTMpOworICAgICAgICAgICAgSDI2NF9RUEVMX0ZVTkNTKDMsIDMsIHNzc2UzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiaXRfZGVwdGggPT0gMTApIHsKKyAgICAgICAgICAgIEgyNjRfUVBFTF9GVU5DU18xMCgxLCAwLCBzc3NlM19jYWNoZTY0KTsKKyAgICAgICAgICAgIEgyNjRfUVBFTF9GVU5DU18xMCgyLCAwLCBzc3NlM19jYWNoZTY0KTsKKyAgICAgICAgICAgIEgyNjRfUVBFTF9GVU5DU18xMCgzLCAwLCBzc3NlM19jYWNoZTY0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkgeworICAgICAgICAvKiBBVlggaW1wbGllcyA2NCBieXRlIGNhY2hlIGxpbmVzIHdpdGhvdXQgdGhlIG5lZWQgdG8gYXZvaWQgdW5hbGlnbmVkCisgICAgICAgICAqIG1lbW9yeSBhY2Nlc3NlcyB0aGF0IGNyb3NzIHRoZSBib3VuZGFyeSBiZXR3ZWVuIHR3byBjYWNoZSBsaW5lcy4KKyAgICAgICAgICogVE9ETzogUG9ydCBYMjY0X0NQVV9DQUNIRUxJTkVfMzIvNjQgZGV0ZWN0aW9uIGZyb20geDI2NCB0byBhdm9pZAorICAgICAgICAgKiBoYXZpbmcgdG8gdHJlYXQgU1NFMiBmdW5jdGlvbnMgd2l0aCBzdWNoIHByb3BlcnRpZXMgYXMgQVZYLiAqLworICAgICAgICBpZiAoYml0X2RlcHRoID09IDEwKSB7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1NfMTAoMSwgMCwgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1NfMTAoMiwgMCwgc3NlMik7CisgICAgICAgICAgICBIMjY0X1FQRUxfRlVOQ1NfMTAoMywgMCwgc3NlMik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X3FwZWxfMTBiaXQuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfcXBlbF8xMGJpdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1NjYwZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X3FwZWxfMTBiaXQuYXNtCkBAIC0wLDAgKzEsODg0IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIE1NWC9TU0UyL0FWWC1vcHRpbWl6ZWQgMTAtYml0IEguMjY0IHFwZWwgY29kZQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBDb3B5cmlnaHQgKEMpIDIwMTEgeDI2NCBwcm9qZWN0Cis7KgorOyogQXV0aG9yczogRGFuaWVsIEthbmcgPGRhbmllbC5kLmthbmdAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBIDMyCisKK2NleHRlcm4gcHdfMTYKK2NleHRlcm4gcHdfMQorcGJfMDogdGltZXMgMzIgZGIgMCA7IHdlIGRvIG5vdCB1c2UgY2V4dGVybiBoZXJlIGFzIG9sZCBsbHZtLWdjYyBmYWlscyB0byBhbGlnbiBpdCBjb3JyZWN0bHkKKworcHdfcGl4ZWxfbWF4OiB0aW1lcyA4IGR3ICgoMSA8PCAxMCktMSkKKworcGFkMTA6IHRpbWVzIDggZHcgMTAqMTAyMworcGFkMjA6IHRpbWVzIDggZHcgMjAqMTAyMworcGFkMzA6IHRpbWVzIDggZHcgMzAqMTAyMworZGVwYWQ6IHRpbWVzIDQgZGQgMzIqMjAqMTAyMyArIDUxMgorZGVwYWQyOiB0aW1lcyA4IGR3IDIwKjEwMjMgKyAxNioxMDIyICsgMTYKK3VucGFkOiB0aW1lcyA4IGR3IDE2KjEwMjIvMzIgOyBuZWVkcyB0byBiZSBtb2QgMTYKKwordGFwMTogdGltZXMgNCBkdyAgMSwgLTUKK3RhcDI6IHRpbWVzIDQgZHcgMjAsIDIwCit0YXAzOiB0aW1lcyA0IGR3IC01LCAgMQorcGRfMGY6IHRpbWVzIDQgZGQgMHhmZmZmCisKK1NFQ1RJT04gLnRleHQKKworCislbWFjcm8gQVZHX01PViAyCisgICAgcGF2Z3cgJTIsICUxCisgICAgbW92YSAgJTEsICUyCislZW5kbWFjcm8KKworJW1hY3JvIEFERFcgMworJWlmIG1tc2l6ZSA9PSA4CisgICAgcGFkZHcgJTEsICUyCislZWxzZQorICAgIG1vdnUgICUzLCAlMgorICAgIHBhZGR3ICUxLCAlMworJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEZJTFRfSCA0CisgICAgcGFkZHcgICUxLCAlNAorICAgIHBzdWJ3ICAlMSwgJTIgIDsgYS1iCisgICAgcHNyYXcgICUxLCAyICAgOyAoYS1iKS80CisgICAgcHN1YncgICUxLCAlMiAgOyAoYS1iKS80LWIKKyAgICBwYWRkdyAgJTEsICUzICA7IChhLWIpLzQtYitjCisgICAgcHNyYXcgICUxLCAyICAgOyAoKGEtYikvNC1iK2MpLzQKKyAgICBwYWRkdyAgJTEsICUzICA7ICgoYS1iKS80LWIrYykvNCtjID0gKGEtNSpiKzIwKmMpLzE2CislZW5kbWFjcm8KKworJW1hY3JvIFBSRUxPQURfViAwCisgICAgbGVhICAgICAgcjMsIFtyMiozXQorICAgIHN1YiAgICAgIHIxLCByMworICAgIG1vdnUgICAgIG0wLCBbcjErcjJdCisgICAgbW92dSAgICAgbTEsIFtyMStyMioyXQorICAgIGFkZCAgICAgIHIxLCByMworICAgIG1vdnUgICAgIG0yLCBbcjFdCisgICAgbW92dSAgICAgbTMsIFtyMStyMl0KKyAgICBtb3Z1ICAgICBtNCwgW3IxK3IyKjJdCisgICAgYWRkICAgICAgcjEsIHIzCislZW5kbWFjcm8KKworJW1hY3JvIEZJTFRfViA4CisgICAgbW92dSAgICAgJTYsIFtyMV0KKyAgICBwYWRkdyAgICAlMSwgJTYKKyAgICBtb3ZhICAgICAlNywgJTIKKyAgICBwYWRkdyAgICAlNywgJTUKKyAgICBtb3ZhICAgICAlOCwgJTMKKyAgICBwYWRkdyAgICAlOCwgJTQKKyAgICBGSUxUX0ggICAlMSwgJTcsICU4LCBbcHdfMTZdCisgICAgcHNyYXcgICAgJTEsIDEKKyAgICBDTElQVyAgICAlMSwgW3BiXzBdLCBbcHdfcGl4ZWxfbWF4XQorJWVuZG1hY3JvCisKKyVtYWNybyBNQyAxCislZGVmaW5lIE9QX01PViBtb3ZhCitJTklUX01NWCBtbXhleHQKKyUxIHB1dCwgNAorSU5JVF9YTU0gc3NlMgorJTEgcHV0LCA4CisKKyVkZWZpbmUgT1BfTU9WIEFWR19NT1YKK0lOSVRfTU1YIG1teGV4dAorJTEgYXZnLCA0CitJTklUX1hNTSBzc2UyCislMSBhdmcsIDgKKyVlbmRtYWNybworCislbWFjcm8gTUNBeEFfT1AgNworJWlmIEFSQ0hfWDg2XzMyCitjZ2xvYmFsICUxX2gyNjRfcXBlbCU0XyUyXzEwLCAlNSwlNiwlNworICAgIGNhbGwgc3R1Yl8lMV9oMjY0X3FwZWwlM18lMl8xMCAlKyBTVUZGSVgKKyAgICBtb3YgIHIwLCByMG0KKyAgICBtb3YgIHIxLCByMW0KKyAgICBhZGQgIHIwLCAlMyoyCisgICAgYWRkICByMSwgJTMqMgorICAgIGNhbGwgc3R1Yl8lMV9oMjY0X3FwZWwlM18lMl8xMCAlKyBTVUZGSVgKKyAgICBtb3YgIHIwLCByMG0KKyAgICBtb3YgIHIxLCByMW0KKyAgICBsZWEgIHIwLCBbcjArcjIqJTNdCisgICAgbGVhICByMSwgW3IxK3IyKiUzXQorICAgIGNhbGwgc3R1Yl8lMV9oMjY0X3FwZWwlM18lMl8xMCAlKyBTVUZGSVgKKyAgICBtb3YgIHIwLCByMG0KKyAgICBtb3YgIHIxLCByMW0KKyAgICBsZWEgIHIwLCBbcjArcjIqJTMrJTMqMl0KKyAgICBsZWEgIHIxLCBbcjErcjIqJTMrJTMqMl0KKyAgICBjYWxsIHN0dWJfJTFfaDI2NF9xcGVsJTNfJTJfMTAgJSsgU1VGRklYCisgICAgUkVUCislZWxzZSA7IEFSQ0hfWDg2XzY0CitjZ2xvYmFsICUxX2gyNjRfcXBlbCU0XyUyXzEwLCAlNSwlNiArIDIsJTcKKyAgICBtb3YgciU2LCByMAorJWFzc2lnbiBwMSAlNisxCisgICAgbW92IHIgJSsgcDEsIHIxCisgICAgY2FsbCBzdHViXyUxX2gyNjRfcXBlbCUzXyUyXzEwICUrIFNVRkZJWAorICAgIGxlYSAgcjAsIFtyJTYrJTMqMl0KKyAgICBsZWEgIHIxLCBbciAlKyBwMSslMyoyXQorICAgIGNhbGwgc3R1Yl8lMV9oMjY0X3FwZWwlM18lMl8xMCAlKyBTVUZGSVgKKyAgICBsZWEgIHIwLCBbciU2K3IyKiUzXQorICAgIGxlYSAgcjEsIFtyICUrIHAxK3IyKiUzXQorICAgIGNhbGwgc3R1Yl8lMV9oMjY0X3FwZWwlM18lMl8xMCAlKyBTVUZGSVgKKyAgICBsZWEgIHIwLCBbciU2K3IyKiUzKyUzKjJdCisgICAgbGVhICByMSwgW3IgJSsgcDErcjIqJTMrJTMqMl0KKyVpZiBVTklYNjQgPT0gMCA7IGZhbGwgdGhyb3VnaCB0byBmdW5jdGlvbgorICAgIGNhbGwgc3R1Yl8lMV9oMjY0X3FwZWwlM18lMl8xMCAlKyBTVUZGSVgKKyAgICBSRVQKKyVlbmRpZgorJWVuZGlmCislZW5kbWFjcm8KKworO2NwdSwgcHV0L2F2ZywgbWMsIDQvOCwgLi4uCislbWFjcm8gY2dsb2JhbF9tYyA2CislYXNzaWduIGkgJTMqMgorJWlmIEFSQ0hfWDg2XzMyIHx8IGNwdWZsYWcoc3NlMikKK01DQXhBX09QICUxLCAlMiwgJTMsIGksICU0LCU1LCU2CislZW5kaWYKKworY2dsb2JhbCAlMV9oMjY0X3FwZWwlM18lMl8xMCwgJTQsJTUsJTYKKyVpZiBVTklYNjQgPT0gMCA7IG5vIHByb2xvZ3VlIG9yIGVwaWxvZ3VlIGZvciBVTklYNjQKKyAgICBjYWxsIHN0dWJfJTFfaDI2NF9xcGVsJTNfJTJfMTAgJSsgU1VGRklYCisgICAgUkVUCislZW5kaWYKKworc3R1Yl8lMV9oMjY0X3FwZWwlM18lMl8xMCAlKyBTVUZGSVg6CislZW5kbWFjcm8KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaDI2NF9xcGVsX21jMDAodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBDT1BZNCAwCisgICAgbW92dSAgICAgICAgICBtMCwgW3IxICAgICBdCisgICAgT1BfTU9WIFtyMCAgICAgXSwgbTAKKyAgICBtb3Z1ICAgICAgICAgIG0wLCBbcjErcjIgIF0KKyAgICBPUF9NT1YgW3IwK3IyICBdLCBtMAorICAgIG1vdnUgICAgICAgICAgbTAsIFtyMStyMioyXQorICAgIE9QX01PViBbcjArcjIqMl0sIG0wCisgICAgbW92dSAgICAgICAgICBtMCwgW3IxK3IzICBdCisgICAgT1BfTU9WIFtyMCtyMyAgXSwgbTAKKyVlbmRtYWNybworCislbWFjcm8gTUMwMCAxCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWxfbWMgJTEsIG1jMDAsIDQsIDMsNCwwCisgICAgbGVhICAgICAgICAgICByMywgW3IyKjNdCisgICAgQ09QWTQKKyAgICByZXQKKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCAlMV9oMjY0X3FwZWw4X21jMDBfMTAsIDMsNAorICAgIGxlYSAgcjMsIFtyMiozXQorICAgIENPUFk0CisgICAgbGVhICByMCwgW3IwK3IyKjRdCisgICAgbGVhICByMSwgW3IxK3IyKjRdCisgICAgQ09QWTQKKyAgICBSRVQKKworY2dsb2JhbCAlMV9oMjY0X3FwZWwxNl9tYzAwXzEwLCAzLDQKKyAgICBtb3YgcjNkLCA4CisubG9vcDoKKyAgICBtb3Z1ICAgICAgICAgICBtMCwgW3IxICAgICAgXQorICAgIG1vdnUgICAgICAgICAgIG0xLCBbcjEgICArMTZdCisgICAgT1BfTU9WIFtyMCAgICAgIF0sIG0wCisgICAgT1BfTU9WIFtyMCAgICsxNl0sIG0xCisgICAgbW92dSAgICAgICAgICAgbTAsIFtyMStyMiAgIF0KKyAgICBtb3Z1ICAgICAgICAgICBtMSwgW3IxK3IyKzE2XQorICAgIE9QX01PViBbcjArcjIgICBdLCBtMAorICAgIE9QX01PViBbcjArcjIrMTZdLCBtMQorICAgIGxlYSAgICAgICAgICAgIHIwLCBbcjArcjIqMl0KKyAgICBsZWEgICAgICAgICAgICByMSwgW3IxK3IyKjJdCisgICAgZGVjIHIzZAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKKyVkZWZpbmUgT1BfTU9WIG1vdmEKK01DMDAgcHV0CisKKyVkZWZpbmUgT1BfTU9WIEFWR19NT1YKK01DMDAgYXZnCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2gyNjRfcXBlbF9tYzIwKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gTUNfQ0FDSEUgMQorJWRlZmluZSBPUF9NT1YgbW92YQorSU5JVF9NTVggbW14ZXh0CislMSBwdXQsIDQKK0lOSVRfWE1NIHNzZTIsIGNhY2hlNjQKKyUxIHB1dCwgOAorSU5JVF9YTU0gc3NzZTMsIGNhY2hlNjQKKyUxIHB1dCwgOAorSU5JVF9YTU0gc3NlMgorJTEgcHV0LCA4CisKKyVkZWZpbmUgT1BfTU9WIEFWR19NT1YKK0lOSVRfTU1YIG1teGV4dAorJTEgYXZnLCA0CitJTklUX1hNTSBzc2UyLCBjYWNoZTY0CislMSBhdmcsIDgKK0lOSVRfWE1NIHNzc2UzLCBjYWNoZTY0CislMSBhdmcsIDgKK0lOSVRfWE1NIHNzZTIKKyUxIGF2ZywgOAorJWVuZG1hY3JvCisKKyVtYWNybyBNQzIwIDIKK2NnbG9iYWxfbWMgJTEsIG1jMjAsICUyLCAzLDQsOQorICAgIG1vdiAgICAgcjNkLCAlMgorICAgIG1vdmEgICAgIG0xLCBbcHdfcGl4ZWxfbWF4XQorJWlmIG51bV9tbXJlZ3MgPiA4CisgICAgbW92YSAgICAgbTgsIFtwd18xNl0KKyAgICAlZGVmaW5lIHAxNiBtOAorJWVsc2UKKyAgICAlZGVmaW5lIHAxNiBbcHdfMTZdCislZW5kaWYKKy5uZXh0cm93OgorJWlmICUwID09IDQKKyAgICBtb3Z1ICAgICBtMiwgW3IxLTRdCisgICAgbW92dSAgICAgbTMsIFtyMS0yXQorICAgIG1vdnUgICAgIG00LCBbcjErMF0KKyAgICBBRERXICAgICBtMiwgW3IxKzZdLCBtNQorICAgIEFERFcgICAgIG0zLCBbcjErNF0sIG01CisgICAgQUREVyAgICAgbTQsIFtyMSsyXSwgbTUKKyVlbHNlIDsgbW92dSBpcyBzbG93IG9uIHRoZXNlIHByb2Nlc3NvcnMKKyVpZiBtbXNpemU9PTE2CisgICAgbW92dSAgICAgbTIsIFtyMS00XQorICAgIG1vdnUgICAgIG0wLCBbcjErNl0KKyAgICBtb3ZhICAgICBtNiwgbTAKKyAgICBwc3JsZHEgICBtMCwgNgorCisgICAgcGFkZHcgICAgbTYsIG0yCisgICAgUEFMSUdOUiAgbTMsIG0wLCBtMiwgMiwgbTUKKyAgICBQQUxJR05SICBtNywgbTAsIG0yLCA4LCBtNQorICAgIHBhZGR3ICAgIG0zLCBtNworICAgIFBBTElHTlIgIG00LCBtMCwgbTIsIDQsIG01CisgICAgUEFMSUdOUiAgbTcsIG0wLCBtMiwgNiwgbTUKKyAgICBwYWRkdyAgICBtNCwgbTcKKyAgICBTV0FQICAgICAgMiwgNgorJWVsc2UKKyAgICBtb3Z1ICAgICBtMiwgW3IxLTRdCisgICAgbW92dSAgICAgbTYsIFtyMSs0XQorICAgIFBBTElHTlIgIG0zLCBtNiwgbTIsIDIsIG01CisgICAgcGFkZHcgICAgbTMsIG02CisgICAgUEFMSUdOUiAgbTQsIG02LCBtMiwgNCwgbTUKKyAgICBQQUxJR05SICBtNywgbTYsIG0yLCA2LCBtNQorICAgIHBhZGR3ICAgIG00LCBtNworICAgIHBhZGR3ICAgIG0yLCBbcjErNl0KKyVlbmRpZgorJWVuZGlmCisKKyAgICBGSUxUX0ggICBtMiwgbTMsIG00LCBwMTYKKyAgICBwc3JhdyAgICBtMiwgMQorICAgIHB4b3IgICAgIG0wLCBtMAorICAgIENMSVBXICAgIG0yLCBtMCwgbTEKKyAgICBPUF9NT1YgW3IwXSwgbTIKKyAgICBhZGQgICAgICByMCwgcjIKKyAgICBhZGQgICAgICByMSwgcjIKKyAgICBkZWMgICAgIHIzZAorICAgIGpnIC5uZXh0cm93CisgICAgcmVwIHJldAorJWVuZG1hY3JvCisKK01DX0NBQ0hFIE1DMjAKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaDI2NF9xcGVsX21jMzAodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBNQzMwIDIKK2NnbG9iYWxfbWMgJTEsIG1jMzAsICUyLCAzLDUsOQorICAgIGxlYSByNCwgW3IxKzJdCisgICAgam1wIHN0dWJfJTFfaDI2NF9xcGVsJTJfbWMxMF8xMCAlKyBTVUZGSVggJSsgLmJvZHkKKyVlbmRtYWNybworCitNQ19DQUNIRSBNQzMwCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2gyNjRfcXBlbF9tYzEwKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gTUMxMCAyCitjZ2xvYmFsX21jICUxLCBtYzEwLCAlMiwgMyw1LDkKKyAgICBtb3YgICAgICByNCwgcjEKKy5ib2R5OgorICAgIG1vdiAgICAgcjNkLCAlMgorICAgIG1vdmEgICAgIG0xLCBbcHdfcGl4ZWxfbWF4XQorJWlmIG51bV9tbXJlZ3MgPiA4CisgICAgbW92YSAgICAgbTgsIFtwd18xNl0KKyAgICAlZGVmaW5lIHAxNiBtOAorJWVsc2UKKyAgICAlZGVmaW5lIHAxNiBbcHdfMTZdCislZW5kaWYKKy5uZXh0cm93OgorJWlmICUwID09IDQKKyAgICBtb3Z1ICAgICBtMiwgW3IxLTRdCisgICAgbW92dSAgICAgbTMsIFtyMS0yXQorICAgIG1vdnUgICAgIG00LCBbcjErMF0KKyAgICBBRERXICAgICBtMiwgW3IxKzZdLCBtNQorICAgIEFERFcgICAgIG0zLCBbcjErNF0sIG01CisgICAgQUREVyAgICAgbTQsIFtyMSsyXSwgbTUKKyVlbHNlIDsgbW92dSBpcyBzbG93IG9uIHRoZXNlIHByb2Nlc3NvcnMKKyVpZiBtbXNpemU9PTE2CisgICAgbW92dSAgICAgbTIsIFtyMS00XQorICAgIG1vdnUgICAgIG0wLCBbcjErNl0KKyAgICBtb3ZhICAgICBtNiwgbTAKKyAgICBwc3JsZHEgICBtMCwgNgorCisgICAgcGFkZHcgICAgbTYsIG0yCisgICAgUEFMSUdOUiAgbTMsIG0wLCBtMiwgMiwgbTUKKyAgICBQQUxJR05SICBtNywgbTAsIG0yLCA4LCBtNQorICAgIHBhZGR3ICAgIG0zLCBtNworICAgIFBBTElHTlIgIG00LCBtMCwgbTIsIDQsIG01CisgICAgUEFMSUdOUiAgbTcsIG0wLCBtMiwgNiwgbTUKKyAgICBwYWRkdyAgICBtNCwgbTcKKyAgICBTV0FQICAgICAgMiwgNgorJWVsc2UKKyAgICBtb3Z1ICAgICBtMiwgW3IxLTRdCisgICAgbW92dSAgICAgbTYsIFtyMSs0XQorICAgIFBBTElHTlIgIG0zLCBtNiwgbTIsIDIsIG01CisgICAgcGFkZHcgICAgbTMsIG02CisgICAgUEFMSUdOUiAgbTQsIG02LCBtMiwgNCwgbTUKKyAgICBQQUxJR05SICBtNywgbTYsIG0yLCA2LCBtNQorICAgIHBhZGR3ICAgIG00LCBtNworICAgIHBhZGR3ICAgIG0yLCBbcjErNl0KKyVlbmRpZgorJWVuZGlmCisKKyAgICBGSUxUX0ggICBtMiwgbTMsIG00LCBwMTYKKyAgICBwc3JhdyAgICBtMiwgMQorICAgIHB4b3IgICAgIG0wLCBtMAorICAgIENMSVBXICAgIG0yLCBtMCwgbTEKKyAgICBtb3Z1ICAgICBtMywgW3I0XQorICAgIHBhdmd3ICAgIG0yLCBtMworICAgIE9QX01PViBbcjBdLCBtMgorICAgIGFkZCAgICAgIHIwLCByMgorICAgIGFkZCAgICAgIHIxLCByMgorICAgIGFkZCAgICAgIHI0LCByMgorICAgIGRlYyAgICAgcjNkCisgICAgamcgLm5leHRyb3cKKyAgICByZXAgcmV0CislZW5kbWFjcm8KKworTUNfQ0FDSEUgTUMxMAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9oMjY0X3FwZWxfbWMwMih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIFZfRklMVCAxMAordl9maWx0JTlfJTEwXzEwCisgICAgYWRkICAgIHI0LCByMgorLm5vX2FkZHI0OgorICAgIEZJTFRfViBtMCwgbTEsIG0yLCBtMywgbTQsIG01LCBtNiwgbTcKKyAgICBhZGQgICAgcjEsIHIyCisgICAgYWRkICAgIHIwLCByMgorICAgIHJldAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUkVTRVRfTU1fUEVSTVVUQVRJT04KKyVhc3NpZ24gaSAwCislcmVwIDQKK1ZfRklMVCBtMCwgbTEsIG0yLCBtMywgbTQsIG01LCBtNiwgbTcsIDQsIGkKK1NXQVAgMCwxLDIsMyw0LDUKKyVhc3NpZ24gaSBpKzEKKyVlbmRyZXAKKworSU5JVF9YTU0gc3NlMgorUkVTRVRfTU1fUEVSTVVUQVRJT04KKyVhc3NpZ24gaSAwCislcmVwIDYKK1ZfRklMVCBtMCwgbTEsIG0yLCBtMywgbTQsIG01LCBtNiwgbTcsIDgsIGkKK1NXQVAgMCwxLDIsMyw0LDUKKyVhc3NpZ24gaSBpKzEKKyVlbmRyZXAKKworJW1hY3JvIE1DMDIgMgorY2dsb2JhbF9tYyAlMSwgbWMwMiwgJTIsIDMsNCw4CisgICAgUFJFTE9BRF9WCisKKyAgICBzdWIgICAgICByMCwgcjIKKyVhc3NpZ24gaiAwCislcmVwICUyCisgICAgJWFzc2lnbiBpIChqICUgNikKKyAgICBjYWxsIHZfZmlsdCUyXyAlKyBpICUrIF8xMC5ub19hZGRyNAorICAgIE9QX01PViBbcjBdLCBtMAorICAgIFNXQVAgMCwxLDIsMyw0LDUKKyAgICAlYXNzaWduIGogaisxCislZW5kcmVwCisgICAgcmV0CislZW5kbWFjcm8KKworTUMgTUMwMgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9oMjY0X3FwZWxfbWMwMSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIE1DMDEgMgorY2dsb2JhbF9tYyAlMSwgbWMwMSwgJTIsIDMsNSw4CisgICAgbW92ICAgICAgcjQsIHIxCisuYm9keToKKyAgICBQUkVMT0FEX1YKKworICAgIHN1YiAgICAgIHI0LCByMgorICAgIHN1YiAgICAgIHIwLCByMgorJWFzc2lnbiBqIDAKKyVyZXAgJTIKKyAgICAlYXNzaWduIGkgKGogJSA2KQorICAgIGNhbGwgdl9maWx0JTJfICUrIGkgJSsgXzEwCisgICAgbW92dSAgICAgbTcsIFtyNF0KKyAgICBwYXZndyAgICBtMCwgbTcKKyAgICBPUF9NT1YgW3IwXSwgbTAKKyAgICBTV0FQIDAsMSwyLDMsNCw1CisgICAgJWFzc2lnbiBqIGorMQorJWVuZHJlcAorICAgIHJldAorJWVuZG1hY3JvCisKK01DIE1DMDEKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaDI2NF9xcGVsX21jMDModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBNQzAzIDIKK2NnbG9iYWxfbWMgJTEsIG1jMDMsICUyLCAzLDUsOAorICAgIGxlYSByNCwgW3IxK3IyXQorICAgIGptcCBzdHViXyUxX2gyNjRfcXBlbCUyX21jMDFfMTAgJSsgU1VGRklYICUrIC5ib2R5CislZW5kbWFjcm8KKworTUMgTUMwMworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9oMjY0X3FwZWxfbWMxMSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIEhfRklMVF9BVkcgMi0zCitoX2ZpbHQlMV8lMl8xMDoKKztGSUxUX0ggd2l0aCBmZXdlciByZWdpc3RlcnMgYW5kIGF2ZXJhZ2VkIHdpdGggdGhlIEZJTFRfViByZXN1bHQKKzttNixtNyBhcmUgdG1wIHJlZ2lzdGVycywgbTAgaXMgdGhlIEZJTFRfViByZXN1bHQsIHRoZSByZXN0IGFyZSB0byBiZSB1c2VkIG5leHQgaW4gdGhlIG5leHQgaXRlcmF0aW9uCis7dW5mb3J0dW5hdGVseSBJIG5lZWQgdGhyZWUgcmVnaXN0ZXJzLCBzbyBtNSB3aWxsIGhhdmUgdG8gYmUgcmUtcmVhZCBmcm9tIG1lbW9yeQorICAgIG1vdnUgICAgIG01LCBbcjQtNF0KKyAgICBBRERXICAgICBtNSwgW3I0KzZdLCBtNworICAgIG1vdnUgICAgIG02LCBbcjQtMl0KKyAgICBBRERXICAgICBtNiwgW3I0KzRdLCBtNworICAgIHBhZGR3ICAgIG01LCBbcHdfMTZdCisgICAgcHN1YncgICAgbTUsIG02ICA7IGEtYgorICAgIHBzcmF3ICAgIG01LCAyICAgOyAoYS1iKS80CisgICAgcHN1YncgICAgbTUsIG02ICA7IChhLWIpLzQtYgorICAgIG1vdnUgICAgIG02LCBbcjQrMF0KKyAgICBBRERXICAgICBtNiwgW3I0KzJdLCBtNworICAgIHBhZGR3ICAgIG01LCBtNiAgOyAoYS1iKS80LWIrYworICAgIHBzcmF3ICAgIG01LCAyICAgOyAoKGEtYikvNC1iK2MpLzQKKyAgICBwYWRkdyAgICBtNSwgbTYgIDsgKChhLWIpLzQtYitjKS80K2MgPSAoYS01KmIrMjAqYykvMTYKKyAgICBwc3JhdyAgICBtNSwgMQorICAgIENMSVBXICAgIG01LCBbcGJfMF0sIFtwd19waXhlbF9tYXhdCis7YXZnIEZJTFRfViwgRklMVF9ICisgICAgcGF2Z3cgICAgbTAsIG01CislaWYgJTAhPTQKKyAgICBtb3Z1ICAgICBtNSwgW3IxK3I1XQorJWVuZGlmCisgICAgcmV0CislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitSRVNFVF9NTV9QRVJNVVRBVElPTgorJWFzc2lnbiBpIDAKKyVyZXAgMworSF9GSUxUX0FWRyA0LCBpCitTV0FQIDAsMSwyLDMsNCw1CislYXNzaWduIGkgaSsxCislZW5kcmVwCitIX0ZJTFRfQVZHIDQsIGksIDAKKworSU5JVF9YTU0gc3NlMgorUkVTRVRfTU1fUEVSTVVUQVRJT04KKyVhc3NpZ24gaSAwCislcmVwIDYKKyVpZiBpPT0xCitIX0ZJTFRfQVZHIDgsIGksIDAKKyVlbHNlCitIX0ZJTFRfQVZHIDgsIGkKKyVlbmRpZgorU1dBUCAwLDEsMiwzLDQsNQorJWFzc2lnbiBpIGkrMQorJWVuZHJlcAorCislbWFjcm8gTUMxMSAyCis7IHRoaXMgUkVBTExZIG5lZWRzIHg4Nl82NAorY2dsb2JhbF9tYyAlMSwgbWMxMSwgJTIsIDMsNiw4CisgICAgbW92ICAgICAgcjQsIHIxCisuYm9keToKKyAgICBQUkVMT0FEX1YKKworICAgIHN1YiAgICAgIHIwLCByMgorICAgIHN1YiAgICAgIHI0LCByMgorICAgIG1vdiAgICAgIHI1LCByMgorICAgIG5lZyAgICAgIHI1CislYXNzaWduIGogMAorJXJlcCAlMgorICAgICVhc3NpZ24gaSAoaiAlIDYpCisgICAgY2FsbCB2X2ZpbHQlMl8gJSsgaSAlKyBfMTAKKyAgICBjYWxsIGhfZmlsdCUyXyAlKyBpICUrIF8xMAorJWlmICUyPT04ICYmIGk9PTEKKyAgICBtb3Z1ICAgICBtNSwgW3IxK3I1XQorJWVuZGlmCisgICAgT1BfTU9WIFtyMF0sIG0wCisgICAgU1dBUCAwLDEsMiwzLDQsNQorICAgICVhc3NpZ24gaiBqKzEKKyVlbmRyZXAKKyAgICByZXQKKyVlbmRtYWNybworCitNQyBNQzExCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2gyNjRfcXBlbF9tYzMxKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gTUMzMSAyCitjZ2xvYmFsX21jICUxLCBtYzMxLCAlMiwgMyw2LDgKKyAgICBtb3YgcjQsIHIxCisgICAgYWRkIHIxLCAyCisgICAgam1wIHN0dWJfJTFfaDI2NF9xcGVsJTJfbWMxMV8xMCAlKyBTVUZGSVggJSsgLmJvZHkKKyVlbmRtYWNybworCitNQyBNQzMxCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2gyNjRfcXBlbF9tYzEzKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gTUMxMyAyCitjZ2xvYmFsX21jICUxLCBtYzEzLCAlMiwgMyw3LDEyCisgICAgbGVhIHI0LCBbcjErcjJdCisgICAgam1wIHN0dWJfJTFfaDI2NF9xcGVsJTJfbWMxMV8xMCAlKyBTVUZGSVggJSsgLmJvZHkKKyVlbmRtYWNybworCitNQyBNQzEzCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2gyNjRfcXBlbF9tYzMzKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gTUMzMyAyCitjZ2xvYmFsX21jICUxLCBtYzMzLCAlMiwgMyw2LDgKKyAgICBsZWEgcjQsIFtyMStyMl0KKyAgICBhZGQgcjEsIDIKKyAgICBqbXAgc3R1Yl8lMV9oMjY0X3FwZWwlMl9tYzExXzEwICUrIFNVRkZJWCAlKyAuYm9keQorJWVuZG1hY3JvCisKK01DIE1DMzMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaDI2NF9xcGVsX21jMjIodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBGSUxUX0gyIDMKKyAgICBwc3VidyAgJTEsICUyICA7IGEtYgorICAgIHBzdWJ3ICAlMiwgJTMgIDsgYi1jCisgICAgcHNsbHcgICUyLCAyCisgICAgcHN1YncgICUxLCAlMiAgOyBhLTUqYis0KmMKKyAgICBwc2xsdyAgJTMsIDQKKyAgICBwYWRkdyAgJTEsICUzICA7IGEtNSpiKzIwKmMKKyVlbmRtYWNybworCislbWFjcm8gRklMVF9WTlJEIDgKKyAgICBtb3Z1ICAgICAlNiwgW3IxXQorICAgIHBhZGR3ICAgICUxLCAlNgorICAgIG1vdmEgICAgICU3LCAlMgorICAgIHBhZGR3ICAgICU3LCAlNQorICAgIG1vdmEgICAgICU4LCAlMworICAgIHBhZGR3ICAgICU4LCAlNAorICAgIEZJTFRfSDIgICUxLCAlNywgJTgKKyVlbmRtYWNybworCislbWFjcm8gSFYgMQorJWlmIG1tc2l6ZT09MTYKKyVkZWZpbmUgUEFEIDEyCislZGVmaW5lIENPVU5UIDIKKyVlbHNlCislZGVmaW5lIFBBRCA0CislZGVmaW5lIENPVU5UIDMKKyVlbmRpZgorcHV0X2h2JTFfMTA6CisgICAgbmVnICAgICAgcjIgICAgICAgICAgIDsgVGhpcyBhY3R1YWxseSBzYXZlcyBpbnN0cnVjdGlvbnMKKyAgICBsZWEgICAgICByMSwgW3IxK3IyKjItbW1zaXplK1BBRF0KKyAgICBsZWEgICAgICByNCwgW3JzcCtQQUQrZ3Byc2l6ZV0KKyAgICBtb3YgICAgIHIzZCwgQ09VTlQKKy52X2xvb3A6CisgICAgbW92dSAgICAgbTAsIFtyMV0KKyAgICBzdWIgICAgICByMSwgcjIKKyAgICBtb3Z1ICAgICBtMSwgW3IxXQorICAgIHN1YiAgICAgIHIxLCByMgorICAgIG1vdnUgICAgIG0yLCBbcjFdCisgICAgc3ViICAgICAgcjEsIHIyCisgICAgbW92dSAgICAgbTMsIFtyMV0KKyAgICBzdWIgICAgICByMSwgcjIKKyAgICBtb3Z1ICAgICBtNCwgW3IxXQorICAgIHN1YiAgICAgIHIxLCByMgorJWFzc2lnbiBpIDAKKyVyZXAgJTEtMQorICAgIEZJTFRfVk5SRCBtMCwgbTEsIG0yLCBtMywgbTQsIG01LCBtNiwgbTcKKyAgICBwc3VidyAgICBtMCwgW3BhZDIwXQorICAgIG1vdnUgICAgIFtyNCtpKm1tc2l6ZSozXSwgbTAKKyAgICBzdWIgICAgICByMSwgcjIKKyAgICBTV0FQIDAsMSwyLDMsNCw1CislYXNzaWduIGkgaSsxCislZW5kcmVwCisgICAgRklMVF9WTlJEIG0wLCBtMSwgbTIsIG0zLCBtNCwgbTUsIG02LCBtNworICAgIHBzdWJ3ICAgIG0wLCBbcGFkMjBdCisgICAgbW92dSAgICAgW3I0K2kqbW1zaXplKjNdLCBtMAorICAgIGFkZCAgICAgIHI0LCBtbXNpemUKKyAgICBsZWEgICAgICByMSwgW3IxK3IyKjgrbW1zaXplXQorJWlmICUxPT04CisgICAgbGVhICAgICAgcjEsIFtyMStyMio0XQorJWVuZGlmCisgICAgZGVjICAgICAgcjNkCisgICAgamcgLnZfbG9vcAorICAgIG5lZyAgICAgIHIyCisgICAgcmV0CislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitIViA0CitJTklUX1hNTSBzc2UyCitIViA4CisKKyVtYWNybyBIX0xPT1AgMQorJWlmIG51bV9tbXJlZ3MgPiA4CisgICAgJWRlZmluZSBzMSBtOAorICAgICVkZWZpbmUgczIgbTkKKyAgICAlZGVmaW5lIHMzIG0xMAorICAgICVkZWZpbmUgZDEgbTExCislZWxzZQorICAgICVkZWZpbmUgczEgW3RhcDFdCisgICAgJWRlZmluZSBzMiBbdGFwMl0KKyAgICAlZGVmaW5lIHMzIFt0YXAzXQorICAgICVkZWZpbmUgZDEgW2RlcGFkXQorJWVuZGlmCitoJTFfbG9vcF9vcDoKKyAgICBtb3Z1ICAgICAgIG0xLCBbcjErbW1zaXplLTRdCisgICAgbW92dSAgICAgICBtMiwgW3IxK21tc2l6ZS0yXQorICAgIG1vdmEgICAgICAgbTMsIFtyMSttbXNpemUrMF0KKyAgICBtb3Z1ICAgICAgIG00LCBbcjErbW1zaXplKzJdCisgICAgbW92dSAgICAgICBtNSwgW3IxK21tc2l6ZSs0XQorICAgIG1vdnUgICAgICAgbTYsIFtyMSttbXNpemUrNl0KKyVpZiBudW1fbW1yZWdzID4gOAorICAgIHBtYWRkd2QgICAgbTEsIHMxCisgICAgcG1hZGR3ZCAgICBtMiwgczEKKyAgICBwbWFkZHdkICAgIG0zLCBzMgorICAgIHBtYWRkd2QgICAgbTQsIHMyCisgICAgcG1hZGR3ZCAgICBtNSwgczMKKyAgICBwbWFkZHdkICAgIG02LCBzMworICAgIHBhZGRkICAgICAgbTEsIGQxCisgICAgcGFkZGQgICAgICBtMiwgZDEKKyVlbHNlCisgICAgbW92YSAgICAgICBtMCwgczEKKyAgICBwbWFkZHdkICAgIG0xLCBtMAorICAgIHBtYWRkd2QgICAgbTIsIG0wCisgICAgbW92YSAgICAgICBtMCwgczIKKyAgICBwbWFkZHdkICAgIG0zLCBtMAorICAgIHBtYWRkd2QgICAgbTQsIG0wCisgICAgbW92YSAgICAgICBtMCwgczMKKyAgICBwbWFkZHdkICAgIG01LCBtMAorICAgIHBtYWRkd2QgICAgbTYsIG0wCisgICAgbW92YSAgICAgICBtMCwgZDEKKyAgICBwYWRkZCAgICAgIG0xLCBtMAorICAgIHBhZGRkICAgICAgbTIsIG0wCislZW5kaWYKKyAgICBwYWRkZCAgICAgIG0zLCBtNQorICAgIHBhZGRkICAgICAgbTQsIG02CisgICAgcGFkZGQgICAgICBtMSwgbTMKKyAgICBwYWRkZCAgICAgIG0yLCBtNAorICAgIHBzcmFkICAgICAgbTEsIDEwCisgICAgcHNyYWQgICAgICBtMiwgMTAKKyAgICBwc2xsZCAgICAgIG0yLCAxNgorICAgIHBhbmQgICAgICAgbTEsIFtwZF8wZl0KKyAgICBwb3IgICAgICAgIG0xLCBtMgorJWlmIG51bV9tbXJlZ3MgPD0gOAorICAgIHB4b3IgICAgICAgbTAsIG0wCislZW5kaWYKKyAgICBDTElQVyAgICAgIG0xLCBtMCwgbTcKKyAgICBhZGQgICAgICAgIHIxLCBtbXNpemUqMworICAgIHJldAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorSF9MT09QIDQKK0lOSVRfWE1NIHNzZTIKK0hfTE9PUCA4CisKKyVtYWNybyBNQzIyIDIKK2NnbG9iYWxfbWMgJTEsIG1jMjIsICUyLCAzLDcsMTIKKyVkZWZpbmUgUEFEIG1tc2l6ZSo4KjQqMiAgICAgIDsgU0laRSoxNio0KnNpemVvZihwaXhlbCkKKyAgICBtb3YgICAgICByNiwgcnNwICAgICAgICAgIDsgYmFja3VwIHN0YWNrIHBvaW50ZXIKKyAgICBhbmQgICAgIHJzcCwgfihtbXNpemUtMSkgIDsgYWxpZ24gc3RhY2sKKyAgICBzdWIgICAgIHJzcCwgUEFECisKKyAgICBjYWxsIHB1dF9odiUyXzEwCisKKyAgICBtb3YgICAgICAgcjNkLCAlMgorICAgIG1vdmEgICAgICAgbTcsIFtwd19waXhlbF9tYXhdCislaWYgbnVtX21tcmVncyA+IDgKKyAgICBweG9yICAgICAgIG0wLCBtMAorICAgIG1vdmEgICAgICAgbTgsIFt0YXAxXQorICAgIG1vdmEgICAgICAgbTksIFt0YXAyXQorICAgIG1vdmEgICAgICBtMTAsIFt0YXAzXQorICAgIG1vdmEgICAgICBtMTEsIFtkZXBhZF0KKyVlbmRpZgorICAgIG1vdiAgICAgICAgcjEsIHJzcAorLmhfbG9vcDoKKyAgICBjYWxsIGglMl9sb29wX29wCisKKyAgICBPUF9NT1YgICBbcjBdLCBtMQorICAgIGFkZCAgICAgICAgcjAsIHIyCisgICAgZGVjICAgICAgIHIzZAorICAgIGpnIC5oX2xvb3AKKworICAgIG1vdiAgICAgcnNwLCByNiAgICAgICAgICA7IHJlc3RvcmUgc3RhY2sgcG9pbnRlcgorICAgIHJldAorJWVuZG1hY3JvCisKK01DIE1DMjIKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaDI2NF9xcGVsX21jMTIodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBNQzEyIDIKK2NnbG9iYWxfbWMgJTEsIG1jMTIsICUyLCAzLDcsMTIKKyVkZWZpbmUgUEFEIG1tc2l6ZSo4KjQqMiAgICAgICAgOyBTSVpFKjE2KjQqc2l6ZW9mKHBpeGVsKQorICAgIG1vdiAgICAgICAgcjYsIHJzcCAgICAgICAgICA7IGJhY2t1cCBzdGFjayBwb2ludGVyCisgICAgYW5kICAgICAgIHJzcCwgfihtbXNpemUtMSkgIDsgYWxpZ24gc3RhY2sKKyAgICBzdWIgICAgICAgcnNwLCBQQUQKKworICAgIGNhbGwgcHV0X2h2JTJfMTAKKworICAgIHhvciAgICAgICByNGQsIHI0ZAorLmJvZHk6CisgICAgbW92ICAgICAgIHIzZCwgJTIKKyAgICBweG9yICAgICAgIG0wLCBtMAorICAgIG1vdmEgICAgICAgbTcsIFtwd19waXhlbF9tYXhdCislaWYgbnVtX21tcmVncyA+IDgKKyAgICBtb3ZhICAgICAgIG04LCBbdGFwMV0KKyAgICBtb3ZhICAgICAgIG05LCBbdGFwMl0KKyAgICBtb3ZhICAgICAgbTEwLCBbdGFwM10KKyAgICBtb3ZhICAgICAgbTExLCBbZGVwYWRdCislZW5kaWYKKyAgICBtb3YgICAgICAgIHIxLCByc3AKKy5oX2xvb3A6CisgICAgY2FsbCBoJTJfbG9vcF9vcAorCisgICAgbW92dSAgICAgICBtMywgW3IxK3I0LTIqbW1zaXplXSA7IG1vdnUgbmVlZGVkIGZvciBtYzMyLCBldGMKKyAgICBwYWRkdyAgICAgIG0zLCBbZGVwYWQyXQorICAgIHBzcmx3ICAgICAgbTMsIDUKKyAgICBwc3VidyAgICAgIG0zLCBbdW5wYWRdCisgICAgQ0xJUFcgICAgICBtMywgbTAsIG03CisgICAgcGF2Z3cgICAgICBtMSwgbTMKKworICAgIE9QX01PViAgIFtyMF0sIG0xCisgICAgYWRkICAgICAgICByMCwgcjIKKyAgICBkZWMgICAgICAgcjNkCisgICAgamcgLmhfbG9vcAorCisgICAgbW92ICAgICByc3AsIHI2ICAgICAgICAgIDsgcmVzdG9yZSBzdGFjayBwb2ludGVyCisgICAgcmV0CislZW5kbWFjcm8KKworTUMgTUMxMgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9oMjY0X3FwZWxfbWMzMih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIE1DMzIgMgorY2dsb2JhbF9tYyAlMSwgbWMzMiwgJTIsIDMsNywxMgorJWRlZmluZSBQQUQgbW1zaXplKjgqMyoyICA7IFNJWkUqMTYqNCpzaXplb2YocGl4ZWwpCisgICAgbW92ICByNiwgcnNwICAgICAgICAgIDsgYmFja3VwIHN0YWNrIHBvaW50ZXIKKyAgICBhbmQgcnNwLCB+KG1tc2l6ZS0xKSAgOyBhbGlnbiBzdGFjaworICAgIHN1YiByc3AsIFBBRAorCisgICAgY2FsbCBwdXRfaHYlMl8xMAorCisgICAgbW92IHI0ZCwgMiAgICAgICAgICAgIDsgc2l6ZW9mKHBpeGVsKQorICAgIGptcCBzdHViXyUxX2gyNjRfcXBlbCUyX21jMTJfMTAgJSsgU1VGRklYICUrIC5ib2R5CislZW5kbWFjcm8KKworTUMgTUMzMgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9oMjY0X3FwZWxfbWMyMSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIEhfTlJEIDEKK3B1dF9oJTFfMTA6CisgICAgYWRkICAgICAgIHJzcCwgZ3Byc2l6ZQorICAgIG1vdiAgICAgICByM2QsICUxCisgICAgeG9yICAgICAgIHI0ZCwgcjRkCisgICAgbW92YSAgICAgICBtNiwgW3BhZDIwXQorLm5leHRyb3c6CisgICAgbW92dSAgICAgICBtMiwgW3I1LTRdCisgICAgbW92dSAgICAgICBtMywgW3I1LTJdCisgICAgbW92dSAgICAgICBtNCwgW3I1KzBdCisgICAgQUREVyAgICAgICBtMiwgW3I1KzZdLCBtNQorICAgIEFERFcgICAgICAgbTMsIFtyNSs0XSwgbTUKKyAgICBBRERXICAgICAgIG00LCBbcjUrMl0sIG01CisKKyAgICBGSUxUX0gyICAgIG0yLCBtMywgbTQKKyAgICBwc3VidyAgICAgIG0yLCBtNgorICAgIG1vdmEgW3JzcCtyNF0sIG0yCisgICAgYWRkICAgICAgIHI0ZCwgbW1zaXplKjMKKyAgICBhZGQgICAgICAgIHI1LCByMgorICAgIGRlYyAgICAgICByM2QKKyAgICBqZyAubmV4dHJvdworICAgIHN1YiAgICAgICByc3AsIGdwcnNpemUKKyAgICByZXQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK0hfTlJEIDQKK0lOSVRfWE1NIHNzZTIKK0hfTlJEIDgKKworJW1hY3JvIE1DMjEgMgorY2dsb2JhbF9tYyAlMSwgbWMyMSwgJTIsIDMsNywxMgorICAgIG1vdiAgIHI1LCByMQorLmJvZHk6CislZGVmaW5lIFBBRCBtbXNpemUqOCozKjIgICA7IFNJWkUqMTYqNCpzaXplb2YocGl4ZWwpCisgICAgbW92ICAgcjYsIHJzcCAgICAgICAgICA7IGJhY2t1cCBzdGFjayBwb2ludGVyCisgICAgYW5kICByc3AsIH4obW1zaXplLTEpICA7IGFsaWduIHN0YWNrCisKKyAgICBzdWIgIHJzcCwgUEFECisgICAgY2FsbCBwdXRfaCUyXzEwCisKKyAgICBzdWIgIHJzcCwgUEFECisgICAgY2FsbCBwdXRfaHYlMl8xMAorCisgICAgbW92IHI0ZCwgUEFELW1tc2l6ZSAgICA7IEggYnVmZmVyCisgICAgam1wIHN0dWJfJTFfaDI2NF9xcGVsJTJfbWMxMl8xMCAlKyBTVUZGSVggJSsgLmJvZHkKKyVlbmRtYWNybworCitNQyBNQzIxCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2gyNjRfcXBlbF9tYzIzKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gTUMyMyAyCitjZ2xvYmFsX21jICUxLCBtYzIzLCAlMiwgMyw3LDEyCisgICAgbGVhICAgcjUsIFtyMStyMl0KKyAgICBqbXAgc3R1Yl8lMV9oMjY0X3FwZWwlMl9tYzIxXzEwICUrIFNVRkZJWCAlKyAuYm9keQorJWVuZG1hY3JvCisKK01DIE1DMjMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X3FwZWxfOGJpdC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NF9xcGVsXzhiaXQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjg3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NF9xcGVsXzhiaXQuYXNtCkBAIC0wLDAgKzEsODYyIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIE1NWC9TU0UyL1NTU0UzLW9wdGltaXplZCBILjI2NCBRUEVMIGNvZGUKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgTWljaGFlbCBOaWVkZXJtYXllciwgTG9yZW4gTWVycml0dAorOyogQ29weXJpZ2h0IChDKSAyMDEyIERhbmllbCBLYW5nCis7KgorOyogQXV0aG9yczogRGFuaWVsIEthbmcgPGRhbmllbC5kLmthbmdAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBIDMyCisKK2NleHRlcm4gcHdfMTYKK2NleHRlcm4gcHdfNQorY2V4dGVybiBwYl8wCisKK1NFQ1RJT04gLnRleHQKKworCislbWFjcm8gb3BfYXZnaCAzCisgICAgbW92aCAgICUzLCAlMgorICAgIHBhdmdiICAlMSwgJTMKKyAgICBtb3ZoICAgJTIsICUxCislZW5kbWFjcm8KKworJW1hY3JvIG9wX2F2ZyAyLTMKKyAgICBwYXZnYiAgJTEsICUyCisgICAgbW92YSAgICUyLCAlMQorJWVuZG1hY3JvCisKKyVtYWNybyBvcF9wdXRoIDItMworICAgIG1vdmggICAlMiwgJTEKKyVlbmRtYWNybworCislbWFjcm8gb3BfcHV0IDItMworICAgIG1vdmEgICAlMiwgJTEKKyVlbmRtYWNybworCislbWFjcm8gUVBFTDRfSF9MT1dQQVNTX09QIDEKK2NnbG9iYWwgJTFfaDI2NF9xcGVsNF9oX2xvd3Bhc3MsIDQsNSA7IGRzdCwgc3JjLCBkc3RTdHJpZGUsIHNyY1N0cmlkZQorICAgIG1vdnN4ZGlmbmlkbiAgcjIsIHIyZAorICAgIG1vdnN4ZGlmbmlkbiAgcjMsIHIzZAorICAgIHB4b3IgICAgICAgICAgbTcsIG03CisgICAgbW92YSAgICAgICAgICBtNCwgW3B3XzVdCisgICAgbW92YSAgICAgICAgICBtNSwgW3B3XzE2XQorICAgIG1vdiAgICAgICAgICByNGQsIDQKKy5sb29wOgorICAgIG1vdmggICAgICAgICAgbTEsIFtyMS0xXQorICAgIG1vdmggICAgICAgICAgbTIsIFtyMSswXQorICAgIG1vdmggICAgICAgICAgbTMsIFtyMSsxXQorICAgIG1vdmggICAgICAgICAgbTAsIFtyMSsyXQorICAgIHB1bnBja2xidyAgICAgbTEsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMiwgbTcKKyAgICBwdW5wY2tsYncgICAgIG0zLCBtNworICAgIHB1bnBja2xidyAgICAgbTAsIG03CisgICAgcGFkZHcgICAgICAgICBtMSwgbTAKKyAgICBwYWRkdyAgICAgICAgIG0yLCBtMworICAgIG1vdmggICAgICAgICAgbTAsIFtyMS0yXQorICAgIG1vdmggICAgICAgICAgbTMsIFtyMSszXQorICAgIHB1bnBja2xidyAgICAgbTAsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMywgbTcKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtMworICAgIHBzbGx3ICAgICAgICAgbTIsIDIKKyAgICBwc3VidyAgICAgICAgIG0yLCBtMQorICAgIHBtdWxsdyAgICAgICAgbTIsIG00CisgICAgcGFkZHcgICAgICAgICBtMCwgbTUKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtMgorICAgIHBzcmF3ICAgICAgICAgbTAsIDUKKyAgICBwYWNrdXN3YiAgICAgIG0wLCBtMAorICAgIG9wXyUxaCAgICAgICAgbTAsIFtyMF0sIG02CisgICAgYWRkICAgICAgICAgICByMCwgcjIKKyAgICBhZGQgICAgICAgICAgIHIxLCByMworICAgIGRlYyAgICAgICAgICByNGQKKyAgICBqZyAgICAgICAgIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUVBFTDRfSF9MT1dQQVNTX09QIHB1dAorUVBFTDRfSF9MT1dQQVNTX09QIGF2ZworCislbWFjcm8gUVBFTDhfSF9MT1dQQVNTX09QIDEKK2NnbG9iYWwgJTFfaDI2NF9xcGVsOF9oX2xvd3Bhc3MsIDQsNSA7IGRzdCwgc3JjLCBkc3RTdHJpZGUsIHNyY1N0cmlkZQorICAgIG1vdnN4ZGlmbmlkbiAgcjIsIHIyZAorICAgIG1vdnN4ZGlmbmlkbiAgcjMsIHIzZAorICAgIG1vdiAgICAgICAgICByNGQsIDgKKyAgICBweG9yICAgICAgICAgIG03LCBtNworICAgIG1vdmEgICAgICAgICAgbTYsIFtwd181XQorLmxvb3A6CisgICAgbW92YSAgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICAgbTIsIFtyMSsxXQorICAgIG1vdmEgICAgICAgICAgbTEsIG0wCisgICAgbW92YSAgICAgICAgICBtMywgbTIKKyAgICBwdW5wY2tsYncgICAgIG0wLCBtNworICAgIHB1bnBja2hidyAgICAgbTEsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMiwgbTcKKyAgICBwdW5wY2toYncgICAgIG0zLCBtNworICAgIHBhZGR3ICAgICAgICAgbTAsIG0yCisgICAgcGFkZHcgICAgICAgICBtMSwgbTMKKyAgICBwc2xsdyAgICAgICAgIG0wLCAyCisgICAgcHNsbHcgICAgICAgICBtMSwgMgorICAgIG1vdmEgICAgICAgICAgbTIsIFtyMS0xXQorICAgIG1vdmEgICAgICAgICAgbTQsIFtyMSsyXQorICAgIG1vdmEgICAgICAgICAgbTMsIG0yCisgICAgbW92YSAgICAgICAgICBtNSwgbTQKKyAgICBwdW5wY2tsYncgICAgIG0yLCBtNworICAgIHB1bnBja2hidyAgICAgbTMsIG03CisgICAgcHVucGNrbGJ3ICAgICBtNCwgbTcKKyAgICBwdW5wY2toYncgICAgIG01LCBtNworICAgIHBhZGR3ICAgICAgICAgbTIsIG00CisgICAgcGFkZHcgICAgICAgICBtNSwgbTMKKyAgICBwc3VidyAgICAgICAgIG0wLCBtMgorICAgIHBzdWJ3ICAgICAgICAgbTEsIG01CisgICAgcG11bGx3ICAgICAgICBtMCwgbTYKKyAgICBwbXVsbHcgICAgICAgIG0xLCBtNgorICAgIG1vdmQgICAgICAgICAgbTIsIFtyMS0yXQorICAgIG1vdmQgICAgICAgICAgbTUsIFtyMSs3XQorICAgIHB1bnBja2xidyAgICAgbTIsIG03CisgICAgcHVucGNrbGJ3ICAgICBtNSwgbTcKKyAgICBwYWRkdyAgICAgICAgIG0yLCBtMworICAgIHBhZGR3ICAgICAgICAgbTQsIG01CisgICAgbW92YSAgICAgICAgICBtNSwgW3B3XzE2XQorICAgIHBhZGR3ICAgICAgICAgbTIsIG01CisgICAgcGFkZHcgICAgICAgICBtNCwgbTUKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtMgorICAgIHBhZGR3ICAgICAgICAgbTEsIG00CisgICAgcHNyYXcgICAgICAgICBtMCwgNQorICAgIHBzcmF3ICAgICAgICAgbTEsIDUKKyAgICBwYWNrdXN3YiAgICAgIG0wLCBtMQorICAgIG9wXyUxICAgICAgICAgbTAsIFtyMF0sIG00CisgICAgYWRkICAgICAgICAgICByMCwgcjIKKyAgICBhZGQgICAgICAgICAgIHIxLCByMworICAgIGRlYyAgICAgICAgICByNGQKKyAgICBqZyAgICAgICAgIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUVBFTDhfSF9MT1dQQVNTX09QIHB1dAorUVBFTDhfSF9MT1dQQVNTX09QIGF2ZworCislbWFjcm8gUVBFTDhfSF9MT1dQQVNTX09QX1hNTSAxCitjZ2xvYmFsICUxX2gyNjRfcXBlbDhfaF9sb3dwYXNzLCA0LDUsOCA7IGRzdCwgc3JjLCBkc3RTdHJpZGUsIHNyY1N0cmlkZQorICAgIG1vdnN4ZGlmbmlkbiAgcjIsIHIyZAorICAgIG1vdnN4ZGlmbmlkbiAgcjMsIHIzZAorICAgIG1vdiAgICAgICAgICByNGQsIDgKKyAgICBweG9yICAgICAgICAgIG03LCBtNworICAgIG1vdmEgICAgICAgICAgbTYsIFtwd181XQorLmxvb3A6CisgICAgbW92dSAgICAgICAgICBtMSwgW3IxLTJdCisgICAgbW92YSAgICAgICAgICBtMCwgbTEKKyAgICBwdW5wY2toYncgICAgIG0xLCBtNworICAgIHB1bnBja2xidyAgICAgbTAsIG03CisgICAgbW92YSAgICAgICAgICBtMiwgbTEKKyAgICBtb3ZhICAgICAgICAgIG0zLCBtMQorICAgIG1vdmEgICAgICAgICAgbTQsIG0xCisgICAgbW92YSAgICAgICAgICBtNSwgbTEKKyAgICBwYWxpZ25yICAgICAgIG00LCBtMCwgMgorICAgIHBhbGlnbnIgICAgICAgbTMsIG0wLCA0CisgICAgcGFsaWduciAgICAgICBtMiwgbTAsIDYKKyAgICBwYWxpZ25yICAgICAgIG0xLCBtMCwgOAorICAgIHBhbGlnbnIgICAgICAgbTUsIG0wLCAxMAorICAgIHBhZGR3ICAgICAgICAgbTAsIG01CisgICAgcGFkZHcgICAgICAgICBtMiwgbTMKKyAgICBwYWRkdyAgICAgICAgIG0xLCBtNAorICAgIHBzbGx3ICAgICAgICAgbTIsIDIKKyAgICBwc3VidyAgICAgICAgIG0yLCBtMQorICAgIHBhZGR3ICAgICAgICAgbTAsIFtwd18xNl0KKyAgICBwbXVsbHcgICAgICAgIG0yLCBtNgorICAgIHBhZGR3ICAgICAgICAgbTIsIG0wCisgICAgcHNyYXcgICAgICAgICBtMiwgNQorICAgIHBhY2t1c3diICAgICAgbTIsIG0yCisgICAgb3BfJTFoICAgICAgICBtMiwgW3IwXSwgbTQKKyAgICBhZGQgICAgICAgICAgIHIxLCByMworICAgIGFkZCAgICAgICAgICAgcjAsIHIyCisgICAgZGVjICAgICAgICAgIHI0ZAorICAgIGpuZSAgICAgICAgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NzZTMKK1FQRUw4X0hfTE9XUEFTU19PUF9YTU0gcHV0CitRUEVMOF9IX0xPV1BBU1NfT1BfWE1NIGF2ZworCisKKyVtYWNybyBRUEVMNF9IX0xPV1BBU1NfTDJfT1AgMQorY2dsb2JhbCAlMV9oMjY0X3FwZWw0X2hfbG93cGFzc19sMiwgNSw2IDsgZHN0LCBzcmMsIHNyYzIsIGRzdFN0cmlkZSwgc3JjU3RyaWRlCisgICAgbW92c3hkaWZuaWRuICByMywgcjNkCisgICAgbW92c3hkaWZuaWRuICByNCwgcjRkCisgICAgcHhvciAgICAgICAgICBtNywgbTcKKyAgICBtb3ZhICAgICAgICAgIG00LCBbcHdfNV0KKyAgICBtb3ZhICAgICAgICAgIG01LCBbcHdfMTZdCisgICAgbW92ICAgICAgICAgIHI1ZCwgNAorLmxvb3A6CisgICAgbW92aCAgICAgICAgICBtMSwgW3IxLTFdCisgICAgbW92aCAgICAgICAgICBtMiwgW3IxKzBdCisgICAgbW92aCAgICAgICAgICBtMywgW3IxKzFdCisgICAgbW92aCAgICAgICAgICBtMCwgW3IxKzJdCisgICAgcHVucGNrbGJ3ICAgICBtMSwgbTcKKyAgICBwdW5wY2tsYncgICAgIG0yLCBtNworICAgIHB1bnBja2xidyAgICAgbTMsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMCwgbTcKKyAgICBwYWRkdyAgICAgICAgIG0xLCBtMAorICAgIHBhZGR3ICAgICAgICAgbTIsIG0zCisgICAgbW92aCAgICAgICAgICBtMCwgW3IxLTJdCisgICAgbW92aCAgICAgICAgICBtMywgW3IxKzNdCisgICAgcHVucGNrbGJ3ICAgICBtMCwgbTcKKyAgICBwdW5wY2tsYncgICAgIG0zLCBtNworICAgIHBhZGR3ICAgICAgICAgbTAsIG0zCisgICAgcHNsbHcgICAgICAgICBtMiwgMgorICAgIHBzdWJ3ICAgICAgICAgbTIsIG0xCisgICAgcG11bGx3ICAgICAgICBtMiwgbTQKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtNQorICAgIHBhZGR3ICAgICAgICAgbTAsIG0yCisgICAgbW92aCAgICAgICAgICBtMywgW3IyXQorICAgIHBzcmF3ICAgICAgICAgbTAsIDUKKyAgICBwYWNrdXN3YiAgICAgIG0wLCBtMAorICAgIHBhdmdiICAgICAgICAgbTAsIG0zCisgICAgb3BfJTFoICAgICAgICBtMCwgW3IwXSwgbTYKKyAgICBhZGQgICAgICAgICAgIHIwLCByMworICAgIGFkZCAgICAgICAgICAgcjEsIHIzCisgICAgYWRkICAgICAgICAgICByMiwgcjQKKyAgICBkZWMgICAgICAgICAgcjVkCisgICAgamcgICAgICAgICAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1FQRUw0X0hfTE9XUEFTU19MMl9PUCBwdXQKK1FQRUw0X0hfTE9XUEFTU19MMl9PUCBhdmcKKworCislbWFjcm8gUVBFTDhfSF9MT1dQQVNTX0wyX09QIDEKK2NnbG9iYWwgJTFfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDIsIDUsNiA7IGRzdCwgc3JjLCBzcmMyLCBkc3RTdHJpZGUsIHNyY1N0cmlkZQorICAgIG1vdnN4ZGlmbmlkbiAgcjMsIHIzZAorICAgIG1vdnN4ZGlmbmlkbiAgcjQsIHI0ZAorICAgIG1vdiAgICAgICAgICByNWQsIDgKKyAgICBweG9yICAgICAgICAgIG03LCBtNworICAgIG1vdmEgICAgICAgICAgbTYsIFtwd181XQorLmxvb3A6CisgICAgbW92YSAgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICAgbTIsIFtyMSsxXQorICAgIG1vdmEgICAgICAgICAgbTEsIG0wCisgICAgbW92YSAgICAgICAgICBtMywgbTIKKyAgICBwdW5wY2tsYncgICAgIG0wLCBtNworICAgIHB1bnBja2hidyAgICAgbTEsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMiwgbTcKKyAgICBwdW5wY2toYncgICAgIG0zLCBtNworICAgIHBhZGR3ICAgICAgICAgbTAsIG0yCisgICAgcGFkZHcgICAgICAgICBtMSwgbTMKKyAgICBwc2xsdyAgICAgICAgIG0wLCAyCisgICAgcHNsbHcgICAgICAgICBtMSwgMgorICAgIG1vdmEgICAgICAgICAgbTIsIFtyMS0xXQorICAgIG1vdmEgICAgICAgICAgbTQsIFtyMSsyXQorICAgIG1vdmEgICAgICAgICAgbTMsIG0yCisgICAgbW92YSAgICAgICAgICBtNSwgbTQKKyAgICBwdW5wY2tsYncgICAgIG0yLCBtNworICAgIHB1bnBja2hidyAgICAgbTMsIG03CisgICAgcHVucGNrbGJ3ICAgICBtNCwgbTcKKyAgICBwdW5wY2toYncgICAgIG01LCBtNworICAgIHBhZGR3ICAgICAgICAgbTIsIG00CisgICAgcGFkZHcgICAgICAgICBtNSwgbTMKKyAgICBwc3VidyAgICAgICAgIG0wLCBtMgorICAgIHBzdWJ3ICAgICAgICAgbTEsIG01CisgICAgcG11bGx3ICAgICAgICBtMCwgbTYKKyAgICBwbXVsbHcgICAgICAgIG0xLCBtNgorICAgIG1vdmQgICAgICAgICAgbTIsIFtyMS0yXQorICAgIG1vdmQgICAgICAgICAgbTUsIFtyMSs3XQorICAgIHB1bnBja2xidyAgICAgbTIsIG03CisgICAgcHVucGNrbGJ3ICAgICBtNSwgbTcKKyAgICBwYWRkdyAgICAgICAgIG0yLCBtMworICAgIHBhZGR3ICAgICAgICAgbTQsIG01CisgICAgbW92YSAgICAgICAgICBtNSwgW3B3XzE2XQorICAgIHBhZGR3ICAgICAgICAgbTIsIG01CisgICAgcGFkZHcgICAgICAgICBtNCwgbTUKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtMgorICAgIHBhZGR3ICAgICAgICAgbTEsIG00CisgICAgcHNyYXcgICAgICAgICBtMCwgNQorICAgIHBzcmF3ICAgICAgICAgbTEsIDUKKyAgICBtb3ZhICAgICAgICAgIG00LCBbcjJdCisgICAgcGFja3Vzd2IgICAgICBtMCwgbTEKKyAgICBwYXZnYiAgICAgICAgIG0wLCBtNAorICAgIG9wXyUxICAgICAgICAgbTAsIFtyMF0sIG00CisgICAgYWRkICAgICAgICAgICByMCwgcjMKKyAgICBhZGQgICAgICAgICAgIHIxLCByMworICAgIGFkZCAgICAgICAgICAgcjIsIHI0CisgICAgZGVjICAgICAgICAgIHI1ZAorICAgIGpnICAgICAgICAgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitRUEVMOF9IX0xPV1BBU1NfTDJfT1AgcHV0CitRUEVMOF9IX0xPV1BBU1NfTDJfT1AgYXZnCisKKworJW1hY3JvIFFQRUw4X0hfTE9XUEFTU19MMl9PUF9YTU0gMQorY2dsb2JhbCAlMV9oMjY0X3FwZWw4X2hfbG93cGFzc19sMiwgNSw2LDggOyBkc3QsIHNyYywgc3JjMiwgZHN0U3RyaWRlLCBzcmMyU3RyaWRlCisgICAgbW92c3hkaWZuaWRuICByMywgcjNkCisgICAgbW92c3hkaWZuaWRuICByNCwgcjRkCisgICAgbW92ICAgICAgICAgIHI1ZCwgOAorICAgIHB4b3IgICAgICAgICAgbTcsIG03CisgICAgbW92YSAgICAgICAgICBtNiwgW3B3XzVdCisubG9vcDoKKyAgICBsZGRxdSAgICAgICAgIG0xLCBbcjEtMl0KKyAgICBtb3ZhICAgICAgICAgIG0wLCBtMQorICAgIHB1bnBja2hidyAgICAgbTEsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMCwgbTcKKyAgICBtb3ZhICAgICAgICAgIG0yLCBtMQorICAgIG1vdmEgICAgICAgICAgbTMsIG0xCisgICAgbW92YSAgICAgICAgICBtNCwgbTEKKyAgICBtb3ZhICAgICAgICAgIG01LCBtMQorICAgIHBhbGlnbnIgICAgICAgbTQsIG0wLCAyCisgICAgcGFsaWduciAgICAgICBtMywgbTAsIDQKKyAgICBwYWxpZ25yICAgICAgIG0yLCBtMCwgNgorICAgIHBhbGlnbnIgICAgICAgbTEsIG0wLCA4CisgICAgcGFsaWduciAgICAgICBtNSwgbTAsIDEwCisgICAgcGFkZHcgICAgICAgICBtMCwgbTUKKyAgICBwYWRkdyAgICAgICAgIG0yLCBtMworICAgIHBhZGR3ICAgICAgICAgbTEsIG00CisgICAgcHNsbHcgICAgICAgICBtMiwgMgorICAgIG1vdmggICAgICAgICAgbTMsIFtyMl0KKyAgICBwc3VidyAgICAgICAgIG0yLCBtMQorICAgIHBhZGR3ICAgICAgICAgbTAsIFtwd18xNl0KKyAgICBwbXVsbHcgICAgICAgIG0yLCBtNgorICAgIHBhZGR3ICAgICAgICAgbTIsIG0wCisgICAgcHNyYXcgICAgICAgICBtMiwgNQorICAgIHBhY2t1c3diICAgICAgbTIsIG0yCisgICAgcGF2Z2IgICAgICAgICBtMiwgbTMKKyAgICBvcF8lMWggICAgICAgIG0yLCBbcjBdLCBtNAorICAgIGFkZCAgICAgICAgICAgcjEsIHIzCisgICAgYWRkICAgICAgICAgICByMCwgcjMKKyAgICBhZGQgICAgICAgICAgIHIyLCByNAorICAgIGRlYyAgICAgICAgICByNWQKKyAgICBqZyAgICAgICAgIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzc2UzCitRUEVMOF9IX0xPV1BBU1NfTDJfT1BfWE1NIHB1dAorUVBFTDhfSF9MT1dQQVNTX0wyX09QX1hNTSBhdmcKKworCis7IEFsbCBmdW5jdGlvbnMgdGhhdCBjYWxsIHRoaXMgYXJlIHJlcXVpcmVkIHRvIGhhdmUgZnVuY3Rpb24gYXJndW1lbnRzIG9mCis7IGRzdCwgc3JjLCBkc3RTdHJpZGUsIHNyY1N0cmlkZQorJW1hY3JvIEZJTFRfViAxCisgICAgbW92YSAgICAgIG02LCBtMgorICAgIG1vdmggICAgICBtNSwgW3IxXQorICAgIHBhZGR3ICAgICBtNiwgbTMKKyAgICBwc2xsdyAgICAgbTYsIDIKKyAgICBwc3VidyAgICAgbTYsIG0xCisgICAgcHN1YncgICAgIG02LCBtNAorICAgIHB1bnBja2xidyBtNSwgbTcKKyAgICBwbXVsbHcgICAgbTYsIFtwd181XQorICAgIHBhZGR3ICAgICBtMCwgW3B3XzE2XQorICAgIGFkZCAgICAgICByMSwgcjMKKyAgICBwYWRkdyAgICAgbTAsIG01CisgICAgcGFkZHcgICAgIG02LCBtMAorICAgIHBzcmF3ICAgICBtNiwgNQorICAgIHBhY2t1c3diICBtNiwgbTYKKyAgICBvcF8lMWggICAgbTYsIFtyMF0sIG0wIDsgMQorICAgIGFkZCAgICAgICByMCwgcjIKKyAgICBTV0FQICAgICAgIDAsIDEsIDIsIDMsIDQsIDUKKyVlbmRtYWNybworCislbWFjcm8gUVBFTDRfVl9MT1dQQVNTX09QIDEKK2NnbG9iYWwgJTFfaDI2NF9xcGVsNF92X2xvd3Bhc3MsIDQsNCA7IGRzdCwgc3JjLCBkc3RTdHJpZGUsIHNyY1N0cmlkZQorICAgIG1vdnN4ZGlmbmlkbiAgcjIsIHIyZAorICAgIG1vdnN4ZGlmbmlkbiAgcjMsIHIzZAorICAgIHN1YiAgICAgICAgICAgcjEsIHIzCisgICAgc3ViICAgICAgICAgICByMSwgcjMKKyAgICBweG9yICAgICAgICAgIG03LCBtNworICAgIG1vdmggICAgICAgICAgbTAsIFtyMV0KKyAgICBtb3ZoICAgICAgICAgIG0xLCBbcjErcjNdCisgICAgbGVhICAgICAgICAgICByMSwgW3IxKzIqcjNdCisgICAgbW92aCAgICAgICAgICBtMiwgW3IxXQorICAgIG1vdmggICAgICAgICAgbTMsIFtyMStyM10KKyAgICBsZWEgICAgICAgICAgIHIxLCBbcjErMipyM10KKyAgICBtb3ZoICAgICAgICAgIG00LCBbcjFdCisgICAgYWRkICAgICAgICAgICByMSwgcjMKKyAgICBwdW5wY2tsYncgICAgIG0wLCBtNworICAgIHB1bnBja2xidyAgICAgbTEsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMiwgbTcKKyAgICBwdW5wY2tsYncgICAgIG0zLCBtNworICAgIHB1bnBja2xidyAgICAgbTQsIG03CisgICAgRklMVF9WICAgICAgICAlMQorICAgIEZJTFRfViAgICAgICAgJTEKKyAgICBGSUxUX1YgICAgICAgICUxCisgICAgRklMVF9WICAgICAgICAlMQorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUVBFTDRfVl9MT1dQQVNTX09QIHB1dAorUVBFTDRfVl9MT1dQQVNTX09QIGF2ZworCisKKworJW1hY3JvIFFQRUw4T1IxNl9WX0xPV1BBU1NfT1AgMQorJWlmIGNwdWZsYWcoc3NlMikKK2NnbG9iYWwgJTFfaDI2NF9xcGVsOG9yMTZfdl9sb3dwYXNzLCA1LDUsOCA7IGRzdCwgc3JjLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgaAorICAgIG1vdnN4ZGlmbmlkbiAgcjIsIHIyZAorICAgIG1vdnN4ZGlmbmlkbiAgcjMsIHIzZAorICAgIHN1YiAgICAgICAgICAgcjEsIHIzCisgICAgc3ViICAgICAgICAgICByMSwgcjMKKyVlbHNlCitjZ2xvYmFsICUxX2gyNjRfcXBlbDhvcjE2X3ZfbG93cGFzc19vcCwgNSw1LDggOyBkc3QsIHNyYywgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIGgKKyAgICBtb3ZzeGRpZm5pZG4gIHIyLCByMmQKKyAgICBtb3ZzeGRpZm5pZG4gIHIzLCByM2QKKyVlbmRpZgorICAgIHB4b3IgICAgICAgICAgbTcsIG03CisgICAgbW92aCAgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmggICAgICAgICAgbTEsIFtyMStyM10KKyAgICBsZWEgICAgICAgICAgIHIxLCBbcjErMipyM10KKyAgICBtb3ZoICAgICAgICAgIG0yLCBbcjFdCisgICAgbW92aCAgICAgICAgICBtMywgW3IxK3IzXQorICAgIGxlYSAgICAgICAgICAgcjEsIFtyMSsyKnIzXQorICAgIG1vdmggICAgICAgICAgbTQsIFtyMV0KKyAgICBhZGQgICAgICAgICAgIHIxLCByMworICAgIHB1bnBja2xidyAgICAgbTAsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMSwgbTcKKyAgICBwdW5wY2tsYncgICAgIG0yLCBtNworICAgIHB1bnBja2xidyAgICAgbTMsIG03CisgICAgcHVucGNrbGJ3ICAgICBtNCwgbTcKKyAgICBGSUxUX1YgICAgICAgICUxCisgICAgRklMVF9WICAgICAgICAlMQorICAgIEZJTFRfViAgICAgICAgJTEKKyAgICBGSUxUX1YgICAgICAgICUxCisgICAgRklMVF9WICAgICAgICAlMQorICAgIEZJTFRfViAgICAgICAgJTEKKyAgICBGSUxUX1YgICAgICAgICUxCisgICAgRklMVF9WICAgICAgICAlMQorICAgIGNtcCAgICAgICAgICByNGQsIDE2CisgICAgam5lICAgICAgICAgLmVuZAorICAgIEZJTFRfViAgICAgICAgJTEKKyAgICBGSUxUX1YgICAgICAgICUxCisgICAgRklMVF9WICAgICAgICAlMQorICAgIEZJTFRfViAgICAgICAgJTEKKyAgICBGSUxUX1YgICAgICAgICUxCisgICAgRklMVF9WICAgICAgICAlMQorICAgIEZJTFRfViAgICAgICAgJTEKKyAgICBGSUxUX1YgICAgICAgICUxCisuZW5kOgorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1FQRUw4T1IxNl9WX0xPV1BBU1NfT1AgcHV0CitRUEVMOE9SMTZfVl9MT1dQQVNTX09QIGF2ZworCitJTklUX1hNTSBzc2UyCitRUEVMOE9SMTZfVl9MT1dQQVNTX09QIHB1dAorUVBFTDhPUjE2X1ZfTE9XUEFTU19PUCBhdmcKKworCis7IEFsbCBmdW5jdGlvbnMgdGhhdCB1c2UgdGhpcyBhcmUgcmVxdWlyZWQgdG8gaGF2ZSBhcmdzOgorOyBzcmMsIHRtcCwgc3JjU2l6ZQorJW1hY3JvIEZJTFRfSFYgMSA7IG9mZnNldAorICAgIG1vdmEgICAgICAgICAgIG02LCBtMgorICAgIG1vdmggICAgICAgICAgIG01LCBbcjBdCisgICAgcGFkZHcgICAgICAgICAgbTYsIG0zCisgICAgcHNsbHcgICAgICAgICAgbTYsIDIKKyAgICBwYWRkdyAgICAgICAgICBtMCwgW3B3XzE2XQorICAgIHBzdWJ3ICAgICAgICAgIG02LCBtMQorICAgIHBzdWJ3ICAgICAgICAgIG02LCBtNAorICAgIHB1bnBja2xidyAgICAgIG01LCBtNworICAgIHBtdWxsdyAgICAgICAgIG02LCBbcHdfNV0KKyAgICBwYWRkdyAgICAgICAgICBtMCwgbTUKKyAgICBhZGQgICAgICAgICAgICByMCwgcjIKKyAgICBwYWRkdyAgICAgICAgICBtNiwgbTAKKyAgICBtb3ZhICAgICAgW3IxKyUxXSwgbTYKKyAgICBTV0FQICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNQorJWVuZG1hY3JvCisKKyVtYWNybyBRUEVMNF9IVjFfTE9XUEFTU19PUCAxCitjZ2xvYmFsICUxX2gyNjRfcXBlbDRfaHZfbG93cGFzc192LCAzLDMgOyBzcmMsIHRtcCwgc3JjU3RyaWRlCisgICAgbW92c3hkaWZuaWRuICByMiwgcjJkCisgICAgcHhvciAgICAgICAgICBtNywgbTcKKyAgICBtb3ZoICAgICAgICAgIG0wLCBbcjBdCisgICAgbW92aCAgICAgICAgICBtMSwgW3IwK3IyXQorICAgIGxlYSAgICAgICAgICAgcjAsIFtyMCsyKnIyXQorICAgIG1vdmggICAgICAgICAgbTIsIFtyMF0KKyAgICBtb3ZoICAgICAgICAgIG0zLCBbcjArcjJdCisgICAgbGVhICAgICAgICAgICByMCwgW3IwKzIqcjJdCisgICAgbW92aCAgICAgICAgICBtNCwgW3IwXQorICAgIGFkZCAgICAgICAgICAgcjAsIHIyCisgICAgcHVucGNrbGJ3ICAgICBtMCwgbTcKKyAgICBwdW5wY2tsYncgICAgIG0xLCBtNworICAgIHB1bnBja2xidyAgICAgbTIsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMywgbTcKKyAgICBwdW5wY2tsYncgICAgIG00LCBtNworICAgIEZJTFRfSFYgICAgICAgMCoyNAorICAgIEZJTFRfSFYgICAgICAgMSoyNAorICAgIEZJTFRfSFYgICAgICAgMioyNAorICAgIEZJTFRfSFYgICAgICAgMyoyNAorICAgIFJFVAorCitjZ2xvYmFsICUxX2gyNjRfcXBlbDRfaHZfbG93cGFzc19oLCAzLDQgOyB0bXAsIGRzdCwgZHN0U3RyaWRlCisgICAgbW92c3hkaWZuaWRuICByMiwgcjJkCisgICAgbW92ICAgICAgICAgIHIzZCwgNAorLmxvb3A6CisgICAgbW92YSAgICAgICAgICBtMCwgW3IwXQorICAgIHBhZGR3ICAgICAgICAgbTAsIFtyMCsxMF0KKyAgICBtb3ZhICAgICAgICAgIG0xLCBbcjArMl0KKyAgICBwYWRkdyAgICAgICAgIG0xLCBbcjArOF0KKyAgICBtb3ZhICAgICAgICAgIG0yLCBbcjArNF0KKyAgICBwYWRkdyAgICAgICAgIG0yLCBbcjArNl0KKyAgICBwc3VidyAgICAgICAgIG0wLCBtMQorICAgIHBzcmF3ICAgICAgICAgbTAsIDIKKyAgICBwc3VidyAgICAgICAgIG0wLCBtMQorICAgIHBhZGRzdyAgICAgICAgbTAsIG0yCisgICAgcHNyYXcgICAgICAgICBtMCwgMgorICAgIHBhZGR3ICAgICAgICAgbTAsIG0yCisgICAgcHNyYXcgICAgICAgICBtMCwgNgorICAgIHBhY2t1c3diICAgICAgbTAsIG0wCisgICAgb3BfJTFoICAgICAgICBtMCwgW3IxXSwgbTcKKyAgICBhZGQgICAgICAgICAgIHIwLCAyNAorICAgIGFkZCAgICAgICAgICAgcjEsIHIyCisgICAgZGVjICAgICAgICAgIHIzZAorICAgIGpueiAgICAgICAgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitRUEVMNF9IVjFfTE9XUEFTU19PUCBwdXQKK1FQRUw0X0hWMV9MT1dQQVNTX09QIGF2ZworCislbWFjcm8gUVBFTDhPUjE2X0hWMV9MT1dQQVNTX09QIDEKK2NnbG9iYWwgJTFfaDI2NF9xcGVsOG9yMTZfaHYxX2xvd3Bhc3Nfb3AsIDQsNCw4IDsgc3JjLCB0bXAsIHNyY1N0cmlkZSwgc2l6ZQorICAgIG1vdnN4ZGlmbmlkbiAgcjIsIHIyZAorICAgIHB4b3IgICAgICAgICAgbTcsIG03CisgICAgbW92aCAgICAgICAgICBtMCwgW3IwXQorICAgIG1vdmggICAgICAgICAgbTEsIFtyMCtyMl0KKyAgICBsZWEgICAgICAgICAgIHIwLCBbcjArMipyMl0KKyAgICBtb3ZoICAgICAgICAgIG0yLCBbcjBdCisgICAgbW92aCAgICAgICAgICBtMywgW3IwK3IyXQorICAgIGxlYSAgICAgICAgICAgcjAsIFtyMCsyKnIyXQorICAgIG1vdmggICAgICAgICAgbTQsIFtyMF0KKyAgICBhZGQgICAgICAgICAgIHIwLCByMgorICAgIHB1bnBja2xidyAgICAgbTAsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMSwgbTcKKyAgICBwdW5wY2tsYncgICAgIG0yLCBtNworICAgIHB1bnBja2xidyAgICAgbTMsIG03CisgICAgcHVucGNrbGJ3ICAgICBtNCwgbTcKKyAgICBGSUxUX0hWICAgICAwKjQ4CisgICAgRklMVF9IViAgICAgMSo0OAorICAgIEZJTFRfSFYgICAgIDIqNDgKKyAgICBGSUxUX0hWICAgICAzKjQ4CisgICAgRklMVF9IViAgICAgNCo0OAorICAgIEZJTFRfSFYgICAgIDUqNDgKKyAgICBGSUxUX0hWICAgICA2KjQ4CisgICAgRklMVF9IViAgICAgNyo0OAorICAgIGNtcCAgICAgICAgICByM2QsIDE2CisgICAgam5lICAgICAgICAgLmVuZAorICAgIEZJTFRfSFYgICAgIDgqNDgKKyAgICBGSUxUX0hWICAgICA5KjQ4CisgICAgRklMVF9IViAgICAxMCo0OAorICAgIEZJTFRfSFYgICAgMTEqNDgKKyAgICBGSUxUX0hWICAgIDEyKjQ4CisgICAgRklMVF9IViAgICAxMyo0OAorICAgIEZJTFRfSFYgICAgMTQqNDgKKyAgICBGSUxUX0hWICAgIDE1KjQ4CisuZW5kOgorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1FQRUw4T1IxNl9IVjFfTE9XUEFTU19PUCBwdXQKK1FQRUw4T1IxNl9IVjFfTE9XUEFTU19PUCBhdmcKKworSU5JVF9YTU0gc3NlMgorUVBFTDhPUjE2X0hWMV9MT1dQQVNTX09QIHB1dAorCisKKworJW1hY3JvIFFQRUw4T1IxNl9IVjJfTE9XUEFTU19PUCAxCis7IHVudXNlZCBpcyB0byBtYXRjaCBzc3NlMyBhbmQgbW14ZXh0IGFyZ3MKK2NnbG9iYWwgJTFfaDI2NF9xcGVsOG9yMTZfaHYyX2xvd3Bhc3Nfb3AsIDUsNSA7IGRzdCwgdG1wLCBkc3RTdHJpZGUsIHVudXNlZCwgaAorICAgIG1vdnN4ZGlmbmlkbiAgcjIsIHIyZAorLmxvb3A6CisgICAgbW92YSAgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICAgbTMsIFtyMSs4XQorICAgIG1vdmEgICAgICAgICAgbTEsIFtyMSsyXQorICAgIG1vdmEgICAgICAgICAgbTQsIFtyMSsxMF0KKyAgICBwYWRkdyAgICAgICAgIG0wLCBtNAorICAgIHBhZGR3ICAgICAgICAgbTEsIG0zCisgICAgcGFkZHcgICAgICAgICBtMywgW3IxKzE4XQorICAgIHBhZGR3ICAgICAgICAgbTQsIFtyMSsxNl0KKyAgICBtb3ZhICAgICAgICAgIG0yLCBbcjErNF0KKyAgICBtb3ZhICAgICAgICAgIG01LCBbcjErMTJdCisgICAgcGFkZHcgICAgICAgICBtMiwgW3IxKzZdCisgICAgcGFkZHcgICAgICAgICBtNSwgW3IxKzE0XQorICAgIHBzdWJ3ICAgICAgICAgbTAsIG0xCisgICAgcHN1YncgICAgICAgICBtMywgbTQKKyAgICBwc3JhdyAgICAgICAgIG0wLCAyCisgICAgcHNyYXcgICAgICAgICBtMywgMgorICAgIHBzdWJ3ICAgICAgICAgbTAsIG0xCisgICAgcHN1YncgICAgICAgICBtMywgbTQKKyAgICBwYWRkc3cgICAgICAgIG0wLCBtMgorICAgIHBhZGRzdyAgICAgICAgbTMsIG01CisgICAgcHNyYXcgICAgICAgICBtMCwgMgorICAgIHBzcmF3ICAgICAgICAgbTMsIDIKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtMgorICAgIHBhZGR3ICAgICAgICAgbTMsIG01CisgICAgcHNyYXcgICAgICAgICBtMCwgNgorICAgIHBzcmF3ICAgICAgICAgbTMsIDYKKyAgICBwYWNrdXN3YiAgICAgIG0wLCBtMworICAgIG9wXyUxICAgICAgICAgbTAsIFtyMF0sIG03CisgICAgYWRkICAgICAgICAgICByMSwgNDgKKyAgICBhZGQgICAgICAgICAgIHIwLCByMgorICAgIGRlYyAgICAgICAgICByNGQKKyAgICBqbmUgICAgICAgIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUVBFTDhPUjE2X0hWMl9MT1dQQVNTX09QIHB1dAorUVBFTDhPUjE2X0hWMl9MT1dQQVNTX09QIGF2ZworCislbWFjcm8gUVBFTDhPUjE2X0hWMl9MT1dQQVNTX09QX1hNTSAxCitjZ2xvYmFsICUxX2gyNjRfcXBlbDhvcjE2X2h2Ml9sb3dwYXNzLCA1LDUsOCA7IGRzdCwgdG1wLCBkc3RTdHJpZGUsIHRtcFN0cmlkZSwgc2l6ZQorICAgIG1vdnN4ZGlmbmlkbiAgcjIsIHIyZAorICAgIG1vdnN4ZGlmbmlkbiAgcjMsIHIzZAorICAgIGNtcCAgICAgICAgICByNGQsIDE2CisgICAgamUgICAgICAgICAub3AxNgorLmxvb3A4OgorICAgIG1vdmEgICAgICAgICAgbTEsIFtyMSsxNl0KKyAgICBtb3ZhICAgICAgICAgIG0wLCBbcjFdCisgICAgbW92YSAgICAgICAgICBtMiwgbTEKKyAgICBtb3ZhICAgICAgICAgIG0zLCBtMQorICAgIG1vdmEgICAgICAgICAgbTQsIG0xCisgICAgbW92YSAgICAgICAgICBtNSwgbTEKKyAgICBwYWxpZ25yICAgICAgIG01LCBtMCwgMTAKKyAgICBwYWxpZ25yICAgICAgIG00LCBtMCwgOAorICAgIHBhbGlnbnIgICAgICAgbTMsIG0wLCA2CisgICAgcGFsaWduciAgICAgICBtMiwgbTAsIDQKKyAgICBwYWxpZ25yICAgICAgIG0xLCBtMCwgMgorICAgIHBhZGR3ICAgICAgICAgbTAsIG01CisgICAgcGFkZHcgICAgICAgICBtMSwgbTQKKyAgICBwYWRkdyAgICAgICAgIG0yLCBtMworICAgIHBzdWJ3ICAgICAgICAgbTAsIG0xCisgICAgcHNyYXcgICAgICAgICBtMCwgMgorICAgIHBzdWJ3ICAgICAgICAgbTAsIG0xCisgICAgcGFkZHcgICAgICAgICBtMCwgbTIKKyAgICBwc3JhdyAgICAgICAgIG0wLCAyCisgICAgcGFkZHcgICAgICAgICBtMCwgbTIKKyAgICBwc3JhdyAgICAgICAgIG0wLCA2CisgICAgcGFja3Vzd2IgICAgICBtMCwgbTAKKyAgICBvcF8lMWggICAgICAgIG0wLCBbcjBdLCBtNworICAgIGFkZCAgICAgICAgICAgcjEsIDQ4CisgICAgYWRkICAgICAgICAgICByMCwgcjIKKyAgICBkZWMgICAgICAgICAgcjRkCisgICAgam5lICAgICAgIC5sb29wOAorICAgIGptcCAgICAgICAgLmRvbmUKKy5vcDE2OgorICAgIG1vdmEgICAgICAgICAgbTQsIFtyMSszMl0KKyAgICBtb3ZhICAgICAgICAgIG01LCBbcjErMTZdCisgICAgbW92YSAgICAgICAgICBtNywgW3IxXQorICAgIG1vdmEgICAgICAgICAgbTMsIG00CisgICAgbW92YSAgICAgICAgICBtMiwgbTQKKyAgICBtb3ZhICAgICAgICAgIG0xLCBtNAorICAgIG1vdmEgICAgICAgICAgbTAsIG00CisgICAgcGFsaWduciAgICAgICBtMCwgbTUsIDEwCisgICAgcGFsaWduciAgICAgICBtMSwgbTUsIDgKKyAgICBwYWxpZ25yICAgICAgIG0yLCBtNSwgNgorICAgIHBhbGlnbnIgICAgICAgbTMsIG01LCA0CisgICAgcGFsaWduciAgICAgICBtNCwgbTUsIDIKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtNQorICAgIHBhZGR3ICAgICAgICAgbTEsIG00CisgICAgcGFkZHcgICAgICAgICBtMiwgbTMKKyAgICBtb3ZhICAgICAgICAgIG02LCBtNQorICAgIG1vdmEgICAgICAgICAgbTQsIG01CisgICAgbW92YSAgICAgICAgICBtMywgbTUKKyAgICBwYWxpZ25yICAgICAgIG00LCBtNywgOAorICAgIHBhbGlnbnIgICAgICAgbTYsIG03LCAyCisgICAgcGFsaWduciAgICAgICBtMywgbTcsIDEwCisgICAgcGFkZHcgICAgICAgICBtNCwgbTYKKyAgICBtb3ZhICAgICAgICAgIG02LCBtNQorICAgIHBhbGlnbnIgICAgICAgbTUsIG03LCA2CisgICAgcGFsaWduciAgICAgICBtNiwgbTcsIDQKKyAgICBwYWRkdyAgICAgICAgIG0zLCBtNworICAgIHBhZGR3ICAgICAgICAgbTUsIG02CisgICAgcHN1YncgICAgICAgICBtMCwgbTEKKyAgICBwc3VidyAgICAgICAgIG0zLCBtNAorICAgIHBzcmF3ICAgICAgICAgbTAsIDIKKyAgICBwc3JhdyAgICAgICAgIG0zLCAyCisgICAgcHN1YncgICAgICAgICBtMCwgbTEKKyAgICBwc3VidyAgICAgICAgIG0zLCBtNAorICAgIHBhZGR3ICAgICAgICAgbTAsIG0yCisgICAgcGFkZHcgICAgICAgICBtMywgbTUKKyAgICBwc3JhdyAgICAgICAgIG0wLCAyCisgICAgcHNyYXcgICAgICAgICBtMywgMgorICAgIHBhZGR3ICAgICAgICAgbTAsIG0yCisgICAgcGFkZHcgICAgICAgICBtMywgbTUKKyAgICBwc3JhdyAgICAgICAgIG0wLCA2CisgICAgcHNyYXcgICAgICAgICBtMywgNgorICAgIHBhY2t1c3diICAgICAgbTMsIG0wCisgICAgb3BfJTEgICAgICAgICBtMywgW3IwXSwgbTcKKyAgICBhZGQgICAgICAgICAgIHIxLCA0OAorICAgIGFkZCAgICAgICAgICAgcjAsIHIyCisgICAgZGVjICAgICAgICAgIHI0ZAorICAgIGpuZSAgICAgICAgLm9wMTYKKy5kb25lOgorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc3NlMworUVBFTDhPUjE2X0hWMl9MT1dQQVNTX09QX1hNTSBwdXQKK1FQRUw4T1IxNl9IVjJfTE9XUEFTU19PUF9YTU0gYXZnCisKKworJW1hY3JvIFBJWEVMUzRfTDJfU0hJRlQ1IDEKK2NnbG9iYWwgJTFfcGl4ZWxzNF9sMl9zaGlmdDUsNiw2IDsgZHN0LCBzcmMxNiwgc3JjOCwgZHN0U3RyaWRlLCBzcmM4U3RyaWRlLCBoCisgICAgbW92c3hkaWZuaWRuICByMywgcjNkCisgICAgbW92c3hkaWZuaWRuICByNCwgcjRkCisgICAgbW92YSAgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICAgbTEsIFtyMSsyNF0KKyAgICBwc3JhdyAgICAgICAgIG0wLCA1CisgICAgcHNyYXcgICAgICAgICBtMSwgNQorICAgIHBhY2t1c3diICAgICAgbTAsIG0wCisgICAgcGFja3Vzd2IgICAgICBtMSwgbTEKKyAgICBwYXZnYiAgICAgICAgIG0wLCBbcjJdCisgICAgcGF2Z2IgICAgICAgICBtMSwgW3IyK3I0XQorICAgIG9wXyUxaCAgICAgICAgbTAsIFtyMF0sIG00CisgICAgb3BfJTFoICAgICAgICBtMSwgW3IwK3IzXSwgbTUKKyAgICBsZWEgICAgICAgICAgIHIyLCBbcjIrcjQqMl0KKyAgICBsZWEgICAgICAgICAgIHIwLCBbcjArcjMqMl0KKyAgICBtb3ZhICAgICAgICAgIG0wLCBbcjErNDhdCisgICAgbW92YSAgICAgICAgICBtMSwgW3IxKzcyXQorICAgIHBzcmF3ICAgICAgICAgbTAsIDUKKyAgICBwc3JhdyAgICAgICAgIG0xLCA1CisgICAgcGFja3Vzd2IgICAgICBtMCwgbTAKKyAgICBwYWNrdXN3YiAgICAgIG0xLCBtMQorICAgIHBhdmdiICAgICAgICAgbTAsIFtyMl0KKyAgICBwYXZnYiAgICAgICAgIG0xLCBbcjIrcjRdCisgICAgb3BfJTFoICAgICAgICBtMCwgW3IwXSwgbTQKKyAgICBvcF8lMWggICAgICAgIG0xLCBbcjArcjNdLCBtNQorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUElYRUxTNF9MMl9TSElGVDUgcHV0CitQSVhFTFM0X0wyX1NISUZUNSBhdmcKKworCislbWFjcm8gUElYRUxTOF9MMl9TSElGVDUgMQorY2dsb2JhbCAlMV9waXhlbHM4X2wyX3NoaWZ0NSwgNiwgNiA7IGRzdCwgc3JjMTYsIHNyYzgsIGRzdFN0cmlkZSwgc3JjOFN0cmlkZSwgaAorICAgIG1vdnN4ZGlmbmlkbiAgcjMsIHIzZAorICAgIG1vdnN4ZGlmbmlkbiAgcjQsIHI0ZAorLmxvb3A6CisgICAgbW92YSAgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICAgbTEsIFtyMSs4XQorICAgIG1vdmEgICAgICAgICAgbTIsIFtyMSs0OF0KKyAgICBtb3ZhICAgICAgICAgIG0zLCBbcjErNDgrOF0KKyAgICBwc3JhdyAgICAgICAgIG0wLCA1CisgICAgcHNyYXcgICAgICAgICBtMSwgNQorICAgIHBzcmF3ICAgICAgICAgbTIsIDUKKyAgICBwc3JhdyAgICAgICAgIG0zLCA1CisgICAgcGFja3Vzd2IgICAgICBtMCwgbTEKKyAgICBwYWNrdXN3YiAgICAgIG0yLCBtMworICAgIHBhdmdiICAgICAgICAgbTAsIFtyMl0KKyAgICBwYXZnYiAgICAgICAgIG0yLCBbcjIrcjRdCisgICAgb3BfJTEgICAgICAgICBtMCwgW3IwXSwgbTQKKyAgICBvcF8lMSAgICAgICAgIG0yLCBbcjArcjNdLCBtNQorICAgIGxlYSAgICAgICAgICAgcjIsIFtyMisyKnI0XQorICAgIGFkZCAgICAgICAgICAgcjEsIDQ4KjIKKyAgICBsZWEgICAgICAgICAgIHIwLCBbcjArMipyM10KKyAgICBzdWIgICAgICAgICAgcjVkLCAyCisgICAgam5lICAgICAgICAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BJWEVMUzhfTDJfU0hJRlQ1IHB1dAorUElYRUxTOF9MMl9TSElGVDUgYXZnCisKKworJWlmIEFSQ0hfWDg2XzY0CislbWFjcm8gUVBFTDE2X0hfTE9XUEFTU19MMl9PUCAxCitjZ2xvYmFsICUxX2gyNjRfcXBlbDE2X2hfbG93cGFzc19sMiwgNSwgNiwgMTYgOyBkc3QsIHNyYywgc3JjMiwgZHN0U3RyaWRlLCBzcmMyU3RyaWRlCisgICAgbW92c3hkaWZuaWRuICByMywgcjNkCisgICAgbW92c3hkaWZuaWRuICByNCwgcjRkCisgICAgbW92ICAgICAgICAgIHI1ZCwgMTYKKyAgICBweG9yICAgICAgICAgbTE1LCBtMTUKKyAgICBtb3ZhICAgICAgICAgbTE0LCBbcHdfNV0KKyAgICBtb3ZhICAgICAgICAgbTEzLCBbcHdfMTZdCisubG9vcDoKKyAgICBsZGRxdSAgICAgICAgIG0xLCBbcjErNl0KKyAgICBsZGRxdSAgICAgICAgIG03LCBbcjEtMl0KKyAgICBtb3ZhICAgICAgICAgIG0wLCBtMQorICAgIHB1bnBja2hidyAgICAgbTEsIG0xNQorICAgIHB1bnBja2xidyAgICAgbTAsIG0xNQorICAgIHB1bnBja2xidyAgICAgbTcsIG0xNQorICAgIG1vdmEgICAgICAgICAgbTIsIG0xCisgICAgbW92YSAgICAgICAgICBtNiwgbTAKKyAgICBtb3ZhICAgICAgICAgIG0zLCBtMQorICAgIG1vdmEgICAgICAgICAgbTgsIG0wCisgICAgbW92YSAgICAgICAgICBtNCwgbTEKKyAgICBtb3ZhICAgICAgICAgIG05LCBtMAorICAgIG1vdmEgICAgICAgICBtMTIsIG0wCisgICAgbW92YSAgICAgICAgIG0xMSwgbTEKKyAgICBwYWxpZ25yICAgICAgbTExLCBtMCwgMTAKKyAgICBwYWxpZ25yICAgICAgbTEyLCBtNywgMTAKKyAgICBwYWxpZ25yICAgICAgIG00LCBtMCwgMgorICAgIHBhbGlnbnIgICAgICAgbTksIG03LCAyCisgICAgcGFsaWduciAgICAgICBtMywgbTAsIDQKKyAgICBwYWxpZ25yICAgICAgIG04LCBtNywgNAorICAgIHBhbGlnbnIgICAgICAgbTIsIG0wLCA2CisgICAgcGFsaWduciAgICAgICBtNiwgbTcsIDYKKyAgICBwYWRkdyAgICAgICAgbTExLCBtMAorICAgIHBhbGlnbnIgICAgICAgbTEsIG0wLCA4CisgICAgcGFsaWduciAgICAgICBtMCwgbTcsIDgKKyAgICBwYWRkdyAgICAgICAgIG03LCBtMTIKKyAgICBwYWRkdyAgICAgICAgIG0yLCBtMworICAgIHBhZGR3ICAgICAgICAgbTYsIG04CisgICAgcGFkZHcgICAgICAgICBtMSwgbTQKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtOQorICAgIHBzbGx3ICAgICAgICAgbTIsIDIKKyAgICBwc2xsdyAgICAgICAgIG02LCAyCisgICAgcHN1YncgICAgICAgICBtMiwgbTEKKyAgICBwc3VidyAgICAgICAgIG02LCBtMAorICAgIHBhZGR3ICAgICAgICBtMTEsIG0xMworICAgIHBhZGR3ICAgICAgICAgbTcsIG0xMworICAgIHBtdWxsdyAgICAgICAgbTIsIG0xNAorICAgIHBtdWxsdyAgICAgICAgbTYsIG0xNAorICAgIGxkZHF1ICAgICAgICAgbTMsIFtyMl0KKyAgICBwYWRkdyAgICAgICAgIG0yLCBtMTEKKyAgICBwYWRkdyAgICAgICAgIG02LCBtNworICAgIHBzcmF3ICAgICAgICAgbTIsIDUKKyAgICBwc3JhdyAgICAgICAgIG02LCA1CisgICAgcGFja3Vzd2IgICAgICBtNiwgbTIKKyAgICBwYXZnYiAgICAgICAgIG02LCBtMworICAgIG9wXyUxICAgICAgICAgbTYsIFtyMF0sIG0xMQorICAgIGFkZCAgICAgICAgICAgcjEsIHIzCisgICAgYWRkICAgICAgICAgICByMCwgcjMKKyAgICBhZGQgICAgICAgICAgIHIyLCByNAorICAgIGRlYyAgICAgICAgICByNWQKKyAgICBqZyAgICAgICAgIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzc2UzCitRUEVMMTZfSF9MT1dQQVNTX0wyX09QIHB1dAorUVBFTDE2X0hfTE9XUEFTU19MMl9PUCBhdmcKKyVlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRfd2VpZ2h0LmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X3dlaWdodC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmYjlkYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X3dlaWdodC5hc20KQEAgLTAsMCArMSwzMTcgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogU1NFMi1vcHRpbWl6ZWQgd2VpZ2h0ZWQgcHJlZGljdGlvbiBjb2RlCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IE1pY2hhZWwgTmllZGVybWF5ZXIsIExvcmVuIE1lcnJpdHQKKzsqIENvcHlyaWdodCAoQykgMjAxMCBFbGkgRnJpZWRtYW4gPGVsaS5mcmllZG1hbkBnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTiAudGV4dAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgYml3ZWlnaHQgcHJlZDoKKzsKKzsgdm9pZCBmZl9oMjY0X2Jpd2VpZ2h0XzE2X3NzZTIodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0ZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodHMsIGludCBvZmZzZXQpOworOyBhbmQKKzsgdm9pZCBmZl9oMjY0X3dlaWdodF8xNl9zc2UyKHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0LCBpbnQgb2Zmc2V0KTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gV0VJR0hUX1NFVFVQIDAKKyAgICBhZGQgICAgICAgIHI1LCByNQorICAgIGluYyAgICAgICAgcjUKKyAgICBtb3ZkICAgICAgIG0zLCByNGQKKyAgICBtb3ZkICAgICAgIG01LCByNWQKKyAgICBtb3ZkICAgICAgIG02LCByM2QKKyAgICBwc2xsZCAgICAgIG01LCBtNgorICAgIHBzcmxkICAgICAgbTUsIDEKKyVpZiBtbXNpemUgPT0gMTYKKyAgICBwc2h1Zmx3ICAgIG0zLCBtMywgMAorICAgIHBzaHVmbHcgICAgbTUsIG01LCAwCisgICAgcHVucGNrbHFkcSBtMywgbTMKKyAgICBwdW5wY2tscWRxIG01LCBtNQorJWVsc2UKKyAgICBwc2h1ZncgICAgIG0zLCBtMywgMAorICAgIHBzaHVmdyAgICAgbTUsIG01LCAwCislZW5kaWYKKyAgICBweG9yICAgICAgIG03LCBtNworJWVuZG1hY3JvCisKKyVtYWNybyBXRUlHSFRfT1AgMgorICAgIG1vdmggICAgICAgICAgbTAsIFtyMCslMV0KKyAgICBtb3ZoICAgICAgICAgIG0xLCBbcjArJTJdCisgICAgcHVucGNrbGJ3ICAgICBtMCwgbTcKKyAgICBwdW5wY2tsYncgICAgIG0xLCBtNworICAgIHBtdWxsdyAgICAgICAgbTAsIG0zCisgICAgcG11bGx3ICAgICAgICBtMSwgbTMKKyAgICBwYWRkc3cgICAgICAgIG0wLCBtNQorICAgIHBhZGRzdyAgICAgICAgbTEsIG01CisgICAgcHNyYXcgICAgICAgICBtMCwgbTYKKyAgICBwc3JhdyAgICAgICAgIG0xLCBtNgorICAgIHBhY2t1c3diICAgICAgbTAsIG0xCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIGgyNjRfd2VpZ2h0XzE2LCA2LCA2LCAwCisgICAgV0VJR0hUX1NFVFVQCisubmV4dHJvdzoKKyAgICBXRUlHSFRfT1AgMCwgIDQKKyAgICBtb3ZhICAgICBbcjAgIF0sIG0wCisgICAgV0VJR0hUX09QIDgsIDEyCisgICAgbW92YSAgICAgW3IwKzhdLCBtMAorICAgIGFkZCAgICAgICAgcjAsIHIxCisgICAgZGVjICAgICAgICByMmQKKyAgICBqbnogLm5leHRyb3cKKyAgICBSRVBfUkVUCisKKyVtYWNybyBXRUlHSFRfRlVOQ19NTSAyCitjZ2xvYmFsIGgyNjRfd2VpZ2h0XyUxLCA2LCA2LCAlMgorICAgIFdFSUdIVF9TRVRVUAorLm5leHRyb3c6CisgICAgV0VJR0hUX09QIDAsIG1tc2l6ZS8yCisgICAgbW92YSAgICAgW3IwXSwgbTAKKyAgICBhZGQgICAgICAgIHIwLCByMQorICAgIGRlYyAgICAgICAgcjJkCisgICAgam56IC5uZXh0cm93CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorV0VJR0hUX0ZVTkNfTU0gIDgsIDAKK0lOSVRfWE1NIHNzZTIKK1dFSUdIVF9GVU5DX01NIDE2LCA4CisKKyVtYWNybyBXRUlHSFRfRlVOQ19IQUxGX01NIDIKK2NnbG9iYWwgaDI2NF93ZWlnaHRfJTEsIDYsIDYsICUyCisgICAgV0VJR0hUX1NFVFVQCisgICAgc2FyICAgICAgIHIyZCwgMQorICAgIGxlYSAgICAgICAgcjMsIFtyMSoyXQorLm5leHRyb3c6CisgICAgV0VJR0hUX09QIDAsIHIxCisgICAgbW92aCAgICAgW3IwXSwgbTAKKyVpZiBtbXNpemUgPT0gMTYKKyAgICBtb3ZocHMgICBbcjArcjFdLCBtMAorJWVsc2UKKyAgICBwc3JscSAgICAgIG0wLCAzMgorICAgIG1vdmggICAgIFtyMCtyMV0sIG0wCislZW5kaWYKKyAgICBhZGQgICAgICAgIHIwLCByMworICAgIGRlYyAgICAgICAgcjJkCisgICAgam56IC5uZXh0cm93CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorV0VJR0hUX0ZVTkNfSEFMRl9NTSA0LCAwCitJTklUX1hNTSBzc2UyCitXRUlHSFRfRlVOQ19IQUxGX01NIDgsIDgKKworJW1hY3JvIEJJV0VJR0hUX1NFVFVQIDAKKyVpZiBBUkNIX1g4Nl82NAorJWRlZmluZSBvZmZfcmVnZCByN2QKKyVlbHNlCislZGVmaW5lIG9mZl9yZWdkIHIzZAorJWVuZGlmCisgICAgbW92ICBvZmZfcmVnZCwgcjdtCisgICAgYWRkICBvZmZfcmVnZCwgMQorICAgIG9yICAgb2ZmX3JlZ2QsIDEKKyAgICBhZGQgICAgICAgIHI0LCAxCisgICAgY21wICAgICAgICByNSwgMTI4CisgICAgIGpuZSAubm9ybWFsCisgICAgc2FyICAgICAgICByNSwgMQorICAgIHNhciAgICAgICAgcjYsIDEKKyAgICBzYXIgIG9mZl9yZWdkLCAxCisgICAgc3ViICAgICAgICByNCwgMQorLm5vcm1hbAorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92ZCAgICAgICBtNCwgcjVkCisgICAgbW92ZCAgICAgICBtMCwgcjZkCislZWxzZQorICAgIG1vdmQgICAgICAgbTMsIHI1ZAorICAgIG1vdmQgICAgICAgbTQsIHI2ZAorJWVuZGlmCisgICAgbW92ZCAgICAgICBtNSwgb2ZmX3JlZ2QKKyAgICBtb3ZkICAgICAgIG02LCByNGQKKyAgICBwc2xsZCAgICAgIG01LCBtNgorICAgIHBzcmxkICAgICAgbTUsIDEKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHB1bnBja2xidyAgbTQsIG0wCisgICAgcHNodWZsdyAgICBtNCwgbTQsIDAKKyAgICBwc2h1Zmx3ICAgIG01LCBtNSwgMAorICAgIHB1bnBja2xxZHEgbTQsIG00CisgICAgcHVucGNrbHFkcSBtNSwgbTUKKworJWVsc2UKKyVpZiBtbXNpemUgPT0gMTYKKyAgICBwc2h1Zmx3ICAgIG0zLCBtMywgMAorICAgIHBzaHVmbHcgICAgbTQsIG00LCAwCisgICAgcHNodWZsdyAgICBtNSwgbTUsIDAKKyAgICBwdW5wY2tscWRxIG0zLCBtMworICAgIHB1bnBja2xxZHEgbTQsIG00CisgICAgcHVucGNrbHFkcSBtNSwgbTUKKyVlbHNlCisgICAgcHNodWZ3ICAgICBtMywgbTMsIDAKKyAgICBwc2h1ZncgICAgIG00LCBtNCwgMAorICAgIHBzaHVmdyAgICAgbTUsIG01LCAwCislZW5kaWYKKyAgICBweG9yICAgICAgIG03LCBtNworJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEJJV0VJR0hUX1NURVBBIDMKKyAgICBtb3ZoICAgICAgIG0lMSwgW3IwKyUzXQorICAgIG1vdmggICAgICAgbSUyLCBbcjErJTNdCisgICAgcHVucGNrbGJ3ICBtJTEsIG03CisgICAgcHVucGNrbGJ3ICBtJTIsIG03CisgICAgcG11bGx3ICAgICBtJTEsIG0zCisgICAgcG11bGx3ICAgICBtJTIsIG00CisgICAgcGFkZHN3ICAgICBtJTEsIG0lMgorJWVuZG1hY3JvCisKKyVtYWNybyBCSVdFSUdIVF9TVEVQQiAwCisgICAgcGFkZHN3ICAgICBtMCwgbTUKKyAgICBwYWRkc3cgICAgIG0xLCBtNQorICAgIHBzcmF3ICAgICAgbTAsIG02CisgICAgcHNyYXcgICAgICBtMSwgbTYKKyAgICBwYWNrdXN3YiAgIG0wLCBtMQorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCBoMjY0X2Jpd2VpZ2h0XzE2LCA3LCA4LCAwCisgICAgQklXRUlHSFRfU0VUVVAKKyAgICBtb3ZpZm5pZG4gcjNkLCByM20KKy5uZXh0cm93OgorICAgIEJJV0VJR0hUX1NURVBBIDAsIDEsIDAKKyAgICBCSVdFSUdIVF9TVEVQQSAxLCAyLCA0CisgICAgQklXRUlHSFRfU1RFUEIKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0wCisgICAgQklXRUlHSFRfU1RFUEEgMCwgMSwgOAorICAgIEJJV0VJR0hUX1NURVBBIDEsIDIsIDEyCisgICAgQklXRUlHSFRfU1RFUEIKKyAgICBtb3ZhICAgICBbcjArOF0sIG0wCisgICAgYWRkICAgICAgICByMCwgcjIKKyAgICBhZGQgICAgICAgIHIxLCByMgorICAgIGRlYyAgICAgICAgcjNkCisgICAgam56IC5uZXh0cm93CisgICAgUkVQX1JFVAorCislbWFjcm8gQklXRUlHSFRfRlVOQ19NTSAyCitjZ2xvYmFsIGgyNjRfYml3ZWlnaHRfJTEsIDcsIDgsICUyCisgICAgQklXRUlHSFRfU0VUVVAKKyAgICBtb3ZpZm5pZG4gcjNkLCByM20KKy5uZXh0cm93OgorICAgIEJJV0VJR0hUX1NURVBBIDAsIDEsIDAKKyAgICBCSVdFSUdIVF9TVEVQQSAxLCAyLCBtbXNpemUvMgorICAgIEJJV0VJR0hUX1NURVBCCisgICAgbW92YSAgICAgICBbcjBdLCBtMAorICAgIGFkZCAgICAgICAgcjAsIHIyCisgICAgYWRkICAgICAgICByMSwgcjIKKyAgICBkZWMgICAgICAgIHIzZAorICAgIGpueiAubmV4dHJvdworICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK0JJV0VJR0hUX0ZVTkNfTU0gIDgsIDAKK0lOSVRfWE1NIHNzZTIKK0JJV0VJR0hUX0ZVTkNfTU0gMTYsIDgKKworJW1hY3JvIEJJV0VJR0hUX0ZVTkNfSEFMRl9NTSAyCitjZ2xvYmFsIGgyNjRfYml3ZWlnaHRfJTEsIDcsIDgsICUyCisgICAgQklXRUlHSFRfU0VUVVAKKyAgICBtb3ZpZm5pZG4gcjNkLCByM20KKyAgICBzYXIgICAgICAgIHIzLCAxCisgICAgbGVhICAgICAgICByNCwgW3IyKjJdCisubmV4dHJvdzoKKyAgICBCSVdFSUdIVF9TVEVQQSAwLCAxLCAwCisgICAgQklXRUlHSFRfU1RFUEEgMSwgMiwgcjIKKyAgICBCSVdFSUdIVF9TVEVQQgorICAgIG1vdmggICAgICAgW3IwXSwgbTAKKyVpZiBtbXNpemUgPT0gMTYKKyAgICBtb3ZocHMgICAgIFtyMCtyMl0sIG0wCislZWxzZQorICAgIHBzcmxxICAgICAgbTAsIDMyCisgICAgbW92aCAgICAgICBbcjArcjJdLCBtMAorJWVuZGlmCisgICAgYWRkICAgICAgICByMCwgcjQKKyAgICBhZGQgICAgICAgIHIxLCByNAorICAgIGRlYyAgICAgICAgcjNkCisgICAgam56IC5uZXh0cm93CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorQklXRUlHSFRfRlVOQ19IQUxGX01NIDQsIDAKK0lOSVRfWE1NIHNzZTIKK0JJV0VJR0hUX0ZVTkNfSEFMRl9NTSA4LCA4CisKKyVtYWNybyBCSVdFSUdIVF9TU1NFM19PUCAwCisgICAgcG1hZGR1YnN3ICBtMCwgbTQKKyAgICBwbWFkZHVic3cgIG0yLCBtNAorICAgIHBhZGRzdyAgICAgbTAsIG01CisgICAgcGFkZHN3ICAgICBtMiwgbTUKKyAgICBwc3JhdyAgICAgIG0wLCBtNgorICAgIHBzcmF3ICAgICAgbTIsIG02CisgICAgcGFja3Vzd2IgICBtMCwgbTIKKyVlbmRtYWNybworCitJTklUX1hNTSBzc3NlMworY2dsb2JhbCBoMjY0X2Jpd2VpZ2h0XzE2LCA3LCA4LCA4CisgICAgQklXRUlHSFRfU0VUVVAKKyAgICBtb3ZpZm5pZG4gcjNkLCByM20KKworLm5leHRyb3c6CisgICAgbW92aCAgICAgICBtMCwgW3IwXQorICAgIG1vdmggICAgICAgbTIsIFtyMCs4XQorICAgIG1vdmggICAgICAgbTMsIFtyMSs4XQorICAgIHB1bnBja2xidyAgbTAsIFtyMV0KKyAgICBwdW5wY2tsYncgIG0yLCBtMworICAgIEJJV0VJR0hUX1NTU0UzX09QCisgICAgbW92YSAgICAgICBbcjBdLCBtMAorICAgIGFkZCAgICAgICAgcjAsIHIyCisgICAgYWRkICAgICAgICByMSwgcjIKKyAgICBkZWMgICAgICAgIHIzZAorICAgIGpueiAubmV4dHJvdworICAgIFJFUF9SRVQKKworSU5JVF9YTU0gc3NzZTMKK2NnbG9iYWwgaDI2NF9iaXdlaWdodF84LCA3LCA4LCA4CisgICAgQklXRUlHSFRfU0VUVVAKKyAgICBtb3ZpZm5pZG4gcjNkLCByM20KKyAgICBzYXIgICAgICAgIHIzLCAxCisgICAgbGVhICAgICAgICByNCwgW3IyKjJdCisKKy5uZXh0cm93OgorICAgIG1vdmggICAgICAgbTAsIFtyMF0KKyAgICBtb3ZoICAgICAgIG0xLCBbcjFdCisgICAgbW92aCAgICAgICBtMiwgW3IwK3IyXQorICAgIG1vdmggICAgICAgbTMsIFtyMStyMl0KKyAgICBwdW5wY2tsYncgIG0wLCBtMQorICAgIHB1bnBja2xidyAgbTIsIG0zCisgICAgQklXRUlHSFRfU1NTRTNfT1AKKyAgICBtb3ZoICAgICAgIFtyMF0sIG0wCisgICAgbW92aHBzICAgICBbcjArcjJdLCBtMAorICAgIGFkZCAgICAgICAgcjAsIHI0CisgICAgYWRkICAgICAgICByMSwgcjQKKyAgICBkZWMgICAgICAgIHIzZAorICAgIGpueiAubmV4dHJvdworICAgIFJFUF9SRVQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0X3dlaWdodF8xMGJpdC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NF93ZWlnaHRfMTBiaXQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOTQ5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NF93ZWlnaHRfMTBiaXQuYXNtCkBAIC0wLDAgKzEsMjgzIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIE1NWC9TU0UyL0FWWC1vcHRpbWl6ZWQgMTAtYml0IEguMjY0IHdlaWdodGVkIHByZWRpY3Rpb24gY29kZQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMSB4MjY0IHByb2plY3QKKzsqCis7KiBBdXRob3JzOiBEYW5pZWwgS2FuZyA8ZGFuaWVsLmQua2FuZ0BnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEgMzIKKworcHdfcGl4ZWxfbWF4OiB0aW1lcyA4IGR3ICgoMSA8PCAxMCktMSkKK3NxXzE6IGRxIDEKKyAgICAgIGRxIDAKKworY2V4dGVybiBwd18xCisKK1NFQ1RJT04gLnRleHQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaDI2NF93ZWlnaHRfMTZfMTAodWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0LCBpbnQgb2Zmc2V0KTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIFdFSUdIVF9QUk9MT0dVRSAwCisucHJvbG9ndWU6CisgICAgUFJPTE9HVUUgMCw2LDgKKyAgICBtb3ZpZm5pZG4gIHIwLCByMG1wCisgICAgbW92aWZuaWRuIHIxZCwgcjFtCisgICAgbW92aWZuaWRuIHIyZCwgcjJtCisgICAgbW92aWZuaWRuIHI0ZCwgcjRtCisgICAgbW92aWZuaWRuIHI1ZCwgcjVtCislZW5kbWFjcm8KKworJW1hY3JvIFdFSUdIVF9TRVRVUCAwCisgICAgbW92YSAgICAgICBtMCwgW3B3XzFdCisgICAgbW92ZCAgICAgICBtMiwgcjNtCisgICAgcHNsbGQgICAgICBtMCwgbTIgICAgICAgOyAxPDxsb2cyX2Rlbm9tCisgICAgU1BMQVRXICAgICBtMCwgbTAKKyAgICBzaGwgICAgICAgIHI1LCAxOSAgICAgICA7ICo4LCBtb3ZlIHRvIHVwcGVyIGhhbGYgb2YgZHdvcmQKKyAgICBsZWEgICAgICAgIHI1LCBbcjUrcjQqMisweDEwMDAwXQorICAgIG1vdmQgICAgICAgbTMsIHI1ZCAgICAgIDsgd2VpZ2h0PDwxIHwgMSsob2Zmc2V0PDwoMykpCisgICAgcHNodWZkICAgICBtMywgbTMsIDAKKyAgICBtb3ZhICAgICAgIG00LCBbcHdfcGl4ZWxfbWF4XQorICAgIHBhZGR3ICAgICAgbTIsIFtzcV8xXSAgIDsgbG9nMl9kZW5vbSsxCislaWYgbm90Y3B1ZmxhZyhzc2U0KQorICAgIHB4b3IgICAgICAgbTcsIG03CislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gV0VJR0hUX09QIDEtMgorJWlmICUwPT0xCisgICAgbW92YSAgICAgICAgbTUsIFtyMCslMV0KKyAgICBwdW5wY2tod2QgICBtNiwgbTUsIG0wCisgICAgcHVucGNrbHdkICAgbTUsIG0wCislZWxzZQorICAgIG1vdnEgICAgICAgIG01LCBbcjArJTFdCisgICAgbW92cSAgICAgICAgbTYsIFtyMCslMl0KKyAgICBwdW5wY2tsd2QgICBtNSwgbTAKKyAgICBwdW5wY2tsd2QgICBtNiwgbTAKKyVlbmRpZgorICAgIHBtYWRkd2QgICAgIG01LCBtMworICAgIHBtYWRkd2QgICAgIG02LCBtMworICAgIHBzcmFkICAgICAgIG01LCBtMgorICAgIHBzcmFkICAgICAgIG02LCBtMgorJWlmIGNwdWZsYWcoc3NlNCkKKyAgICBwYWNrdXNkdyAgICBtNSwgbTYKKyAgICBwbWluc3cgICAgICBtNSwgbTQKKyVlbHNlCisgICAgcGFja3NzZHcgICAgbTUsIG02CisgICAgQ0xJUFcgICAgICAgbTUsIG03LCBtNAorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFdFSUdIVF9GVU5DX0RCTCAwCitjZ2xvYmFsIGgyNjRfd2VpZ2h0XzE2XzEwCisgICAgV0VJR0hUX1BST0xPR1VFCisgICAgV0VJR0hUX1NFVFVQCisubmV4dHJvdzoKKyAgICBXRUlHSFRfT1AgIDAKKyAgICBtb3ZhIFtyMCAgIF0sIG01CisgICAgV0VJR0hUX09QIDE2CisgICAgbW92YSBbcjArMTZdLCBtNQorICAgIGFkZCAgICAgICByMCwgcjEKKyAgICBkZWMgICAgICAgcjJkCisgICAgam56IC5uZXh0cm93CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK1dFSUdIVF9GVU5DX0RCTAorSU5JVF9YTU0gc3NlNAorV0VJR0hUX0ZVTkNfREJMCisKKworJW1hY3JvIFdFSUdIVF9GVU5DX01NIDAKK2NnbG9iYWwgaDI2NF93ZWlnaHRfOF8xMAorICAgIFdFSUdIVF9QUk9MT0dVRQorICAgIFdFSUdIVF9TRVRVUAorLm5leHRyb3c6CisgICAgV0VJR0hUX09QICAgMAorICAgIG1vdmEgICAgIFtyMF0sIG01CisgICAgYWRkICAgICAgICByMCwgcjEKKyAgICBkZWMgICAgICAgIHIyZAorICAgIGpueiAubmV4dHJvdworICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitXRUlHSFRfRlVOQ19NTQorSU5JVF9YTU0gc3NlNAorV0VJR0hUX0ZVTkNfTU0KKworCislbWFjcm8gV0VJR0hUX0ZVTkNfSEFMRl9NTSAwCitjZ2xvYmFsIGgyNjRfd2VpZ2h0XzRfMTAKKyAgICBXRUlHSFRfUFJPTE9HVUUKKyAgICBzYXIgICAgICAgICByMmQsIDEKKyAgICBXRUlHSFRfU0VUVVAKKyAgICBsZWEgICAgICAgICByMywgW3IxKjJdCisubmV4dHJvdzoKKyAgICBXRUlHSFRfT1AgICAgMCwgcjEKKyAgICBtb3ZoICAgICAgW3IwXSwgbTUKKyAgICBtb3ZocHMgW3IwK3IxXSwgbTUKKyAgICBhZGQgICAgICAgICByMCwgcjMKKyAgICBkZWMgICAgICAgICByMmQKKyAgICBqbnogLm5leHRyb3cKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorV0VJR0hUX0ZVTkNfSEFMRl9NTQorSU5JVF9YTU0gc3NlNAorV0VJR0hUX0ZVTkNfSEFMRl9NTQorCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2gyNjRfYml3ZWlnaHRfMTZfMTAodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodGQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0cywgaW50IG9mZnNldCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVpZiBBUkNIX1g4Nl8zMgorREVDTEFSRV9SRUdfVE1QIDMKKyVlbHNlCitERUNMQVJFX1JFR19UTVAgNworJWVuZGlmCisKKyVtYWNybyBCSVdFSUdIVF9QUk9MT0dVRSAwCisucHJvbG9ndWU6CisgICAgUFJPTE9HVUUgMCw4LDgKKyAgICBtb3ZpZm5pZG4gIHIwLCByMG1wCisgICAgbW92aWZuaWRuICByMSwgcjFtcAorICAgIG1vdmlmbmlkbiByMmQsIHIybQorICAgIG1vdmlmbmlkbiByNWQsIHI1bQorICAgIG1vdmlmbmlkbiByNmQsIHI2bQorICAgIG1vdmlmbmlkbiB0MGQsIHI3bQorJWVuZG1hY3JvCisKKyVtYWNybyBCSVdFSUdIVF9TRVRVUCAwCisgICAgbGVhICAgICAgICB0MCwgW3QwKjQrMV0gOyAob2Zmc2V0PDwyKSsxCisgICAgb3IgICAgICAgICB0MCwgMQorICAgIHNobCAgICAgICAgcjYsIDE2CisgICAgb3IgICAgICAgICByNSwgcjYKKyAgICBtb3ZkICAgICAgIG00LCByNWQgICAgICA7IHdlaWdodGQgfCB3ZWlnaHRzCisgICAgbW92ZCAgICAgICBtNSwgdDBkICAgICAgOyAob2Zmc2V0KzEpfDEKKyAgICBtb3ZkICAgICAgIG02LCByNG0gICAgICA7IGxvZzJfZGVub20KKyAgICBwc2xsZCAgICAgIG01LCBtNiAgICAgICA7ICgoKG9mZnNldDw8MikrMSl8MSk8PGxvZzJfZGVub20KKyAgICBwYWRkZCAgICAgIG02LCBbc3FfMV0KKyAgICBwc2h1ZmQgICAgIG00LCBtNCwgMAorICAgIHBzaHVmZCAgICAgbTUsIG01LCAwCisgICAgbW92YSAgICAgICBtMywgW3B3X3BpeGVsX21heF0KKyAgICBtb3ZpZm5pZG4gcjNkLCByM20KKyVpZiBub3RjcHVmbGFnKHNzZTQpCisgICAgcHhvciAgICAgICBtNywgbTcKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBCSVdFSUdIVCAxLTIKKyVpZiAlMD09MQorICAgIG1vdmEgICAgICAgbTAsIFtyMCslMV0KKyAgICBtb3ZhICAgICAgIG0xLCBbcjErJTFdCisgICAgcHVucGNraHdkICBtMiwgbTAsIG0xCisgICAgcHVucGNrbHdkICBtMCwgbTEKKyVlbHNlCisgICAgbW92cSAgICAgICBtMCwgW3IwKyUxXQorICAgIG1vdnEgICAgICAgbTEsIFtyMSslMV0KKyAgICBwdW5wY2tsd2QgIG0wLCBtMQorICAgIG1vdnEgICAgICAgbTIsIFtyMCslMl0KKyAgICBtb3ZxICAgICAgIG0xLCBbcjErJTJdCisgICAgcHVucGNrbHdkICBtMiwgbTEKKyVlbmRpZgorICAgIHBtYWRkd2QgICAgbTAsIG00CisgICAgcG1hZGR3ZCAgICBtMiwgbTQKKyAgICBwYWRkZCAgICAgIG0wLCBtNQorICAgIHBhZGRkICAgICAgbTIsIG01CisgICAgcHNyYWQgICAgICBtMCwgbTYKKyAgICBwc3JhZCAgICAgIG0yLCBtNgorJWlmIGNwdWZsYWcoc3NlNCkKKyAgICBwYWNrdXNkdyAgIG0wLCBtMgorICAgIHBtaW5zdyAgICAgbTAsIG0zCislZWxzZQorICAgIHBhY2tzc2R3ICAgbTAsIG0yCisgICAgQ0xJUFcgICAgICBtMCwgbTcsIG0zCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gQklXRUlHSFRfRlVOQ19EQkwgMAorY2dsb2JhbCBoMjY0X2Jpd2VpZ2h0XzE2XzEwCisgICAgQklXRUlHSFRfUFJPTE9HVUUKKyAgICBCSVdFSUdIVF9TRVRVUAorLm5leHRyb3c6CisgICAgQklXRUlHSFQgICAwCisgICAgbW92YSBbcjAgICBdLCBtMAorICAgIEJJV0VJR0hUICAxNgorICAgIG1vdmEgW3IwKzE2XSwgbTAKKyAgICBhZGQgICAgICAgcjAsIHIyCisgICAgYWRkICAgICAgIHIxLCByMgorICAgIGRlYyAgICAgICByM2QKKyAgICBqbnogLm5leHRyb3cKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorQklXRUlHSFRfRlVOQ19EQkwKK0lOSVRfWE1NIHNzZTQKK0JJV0VJR0hUX0ZVTkNfREJMCisKKyVtYWNybyBCSVdFSUdIVF9GVU5DIDAKK2NnbG9iYWwgaDI2NF9iaXdlaWdodF84XzEwCisgICAgQklXRUlHSFRfUFJPTE9HVUUKKyAgICBCSVdFSUdIVF9TRVRVUAorLm5leHRyb3c6CisgICAgQklXRUlHSFQgIDAKKyAgICBtb3ZhICAgW3IwXSwgbTAKKyAgICBhZGQgICAgICByMCwgcjIKKyAgICBhZGQgICAgICByMSwgcjIKKyAgICBkZWMgICAgICByM2QKKyAgICBqbnogLm5leHRyb3cKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorQklXRUlHSFRfRlVOQworSU5JVF9YTU0gc3NlNAorQklXRUlHSFRfRlVOQworCislbWFjcm8gQklXRUlHSFRfRlVOQ19IQUxGIDAKK2NnbG9iYWwgaDI2NF9iaXdlaWdodF80XzEwCisgICAgQklXRUlHSFRfUFJPTE9HVUUKKyAgICBCSVdFSUdIVF9TRVRVUAorICAgIHNhciAgICAgICAgcjNkLCAxCisgICAgbGVhICAgICAgICByNCwgW3IyKjJdCisubmV4dHJvdzoKKyAgICBCSVdFSUdIVCAgICAgMCwgcjIKKyAgICBtb3ZoICAgW3IwICAgXSwgbTAKKyAgICBtb3ZocHMgW3IwK3IyXSwgbTAKKyAgICBhZGQgICAgICAgICByMCwgcjQKKyAgICBhZGQgICAgICAgICByMSwgcjQKKyAgICBkZWMgICAgICAgICByM2QKKyAgICBqbnogLm5leHRyb3cKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorQklXRUlHSFRfRlVOQ19IQUxGCitJTklUX1hNTSBzc2U0CitCSVdFSUdIVF9GVU5DX0hBTEYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0Y2hyb21hX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oMjY0Y2hyb21hX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDhhZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRjaHJvbWFfaW5pdC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9oMjY0Y2hyb21hLmgiCisKK3ZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jOF9ybmRfbW14ICAodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM4X3JuZF9tbXhleHQodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jOF9ybmRfM2Rub3codWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOworCit2b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzRfbW14ICAgICAgKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jNF9tbXhleHQgICAodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM0XzNkbm93ICAgICh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisKK3ZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jMl9tbXhleHQgICAodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWMyX21teGV4dCAgICh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisKK3ZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jOF9ybmRfc3NzZTModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM0X3Nzc2UzICAgICh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisKK3ZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jOF9ybmRfc3NzZTModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM0X3Nzc2UzICAgICh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisKKyNkZWZpbmUgQ0hST01BX01DKE9QLCBOVU0sIERFUFRILCBPUFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfICMjIE9QICMjIF9oMjY0X2Nocm9tYV9tYyAjIyBOVU0gIyMgXyAjIyBERVBUSCAjIyBfICMjIE9QVCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOworCitDSFJPTUFfTUMocHV0LCAyLCAxMCwgbW14ZXh0KQorQ0hST01BX01DKGF2ZywgMiwgMTAsIG1teGV4dCkKK0NIUk9NQV9NQyhwdXQsIDQsIDEwLCBtbXhleHQpCitDSFJPTUFfTUMoYXZnLCA0LCAxMCwgbW14ZXh0KQorQ0hST01BX01DKHB1dCwgOCwgMTAsIHNzZTIpCitDSFJPTUFfTUMoYXZnLCA4LCAxMCwgc3NlMikKK0NIUk9NQV9NQyhwdXQsIDgsIDEwLCBhdngpCitDSFJPTUFfTUMoYXZnLCA4LCAxMCwgYXZ4KQorCithdl9jb2xkIHZvaWQgZmZfaDI2NGNocm9tYV9pbml0X3g4NihIMjY0Q2hyb21hQ29udGV4dCAqYywgaW50IGJpdF9kZXB0aCkKK3sKKyAgICBpbnQgaGlnaF9iaXRfZGVwdGggPSBiaXRfZGVwdGggPiA4OworICAgIGludCBjcHVfZmxhZ3MgICAgICA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSAmJiAhaGlnaF9iaXRfZGVwdGgpIHsKKyAgICAgICAgYy0+cHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWJbMF0gPSBmZl9wdXRfaDI2NF9jaHJvbWFfbWM4X3JuZF9tbXg7CisgICAgICAgIGMtPnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdID0gZmZfcHV0X2gyNjRfY2hyb21hX21jNF9tbXg7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX0FNRDNETk9XKGNwdV9mbGFncykgJiYgIWhpZ2hfYml0X2RlcHRoKSB7CisgICAgICAgIGMtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfYXZnX2gyNjRfY2hyb21hX21jOF9ybmRfM2Rub3c7CisgICAgICAgIGMtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdID0gZmZfYXZnX2gyNjRfY2hyb21hX21jNF8zZG5vdzsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykgJiYgIWhpZ2hfYml0X2RlcHRoKSB7CisgICAgICAgIGMtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfYXZnX2gyNjRfY2hyb21hX21jOF9ybmRfbW14ZXh0OworICAgICAgICBjLT5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsxXSA9IGZmX2F2Z19oMjY0X2Nocm9tYV9tYzRfbW14ZXh0OworICAgICAgICBjLT5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsyXSA9IGZmX2F2Z19oMjY0X2Nocm9tYV9tYzJfbW14ZXh0OworICAgICAgICBjLT5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsyXSA9IGZmX3B1dF9oMjY0X2Nocm9tYV9tYzJfbW14ZXh0OworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSAmJiBiaXRfZGVwdGggPiA4ICYmIGJpdF9kZXB0aCA8PSAxMCkgeworICAgICAgICBjLT5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsyXSA9IGZmX3B1dF9oMjY0X2Nocm9tYV9tYzJfMTBfbW14ZXh0OworICAgICAgICBjLT5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsyXSA9IGZmX2F2Z19oMjY0X2Nocm9tYV9tYzJfMTBfbW14ZXh0OworICAgICAgICBjLT5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsxXSA9IGZmX3B1dF9oMjY0X2Nocm9tYV9tYzRfMTBfbW14ZXh0OworICAgICAgICBjLT5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsxXSA9IGZmX2F2Z19oMjY0X2Nocm9tYV9tYzRfMTBfbW14ZXh0OworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykgJiYgYml0X2RlcHRoID4gOCAmJiBiaXRfZGVwdGggPD0gMTApIHsKKyAgICAgICAgYy0+cHV0X2gyNjRfY2hyb21hX3BpeGVsc190YWJbMF0gPSBmZl9wdXRfaDI2NF9jaHJvbWFfbWM4XzEwX3NzZTI7CisgICAgICAgIGMtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfYXZnX2gyNjRfY2hyb21hX21jOF8xMF9zc2UyOworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpICYmICFoaWdoX2JpdF9kZXB0aCkgeworICAgICAgICBjLT5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGZmX3B1dF9oMjY0X2Nocm9tYV9tYzhfcm5kX3Nzc2UzOworICAgICAgICBjLT5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGZmX2F2Z19oMjY0X2Nocm9tYV9tYzhfcm5kX3Nzc2UzOworICAgICAgICBjLT5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlsxXSA9IGZmX3B1dF9oMjY0X2Nocm9tYV9tYzRfc3NzZTM7CisgICAgICAgIGMtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzFdID0gZmZfYXZnX2gyNjRfY2hyb21hX21jNF9zc3NlMzsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykgJiYgYml0X2RlcHRoID4gOCAmJiBiaXRfZGVwdGggPD0gMTApIHsKKyAgICAgICAgLy8gQVZYIGltcGxpZXMgIWNhY2hlNjQuCisgICAgICAgIC8vIFRPRE86IFBvcnQgY2FjaGUoMzJ8NjQpIGRldGVjdGlvbiBmcm9tIHgyNjQuCisgICAgICAgIGMtPnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfcHV0X2gyNjRfY2hyb21hX21jOF8xMF9hdng7CisgICAgICAgIGMtPmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfYXZnX2gyNjRfY2hyb21hX21jOF8xMF9hdng7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRkc3BfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2gyNjRkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZGIyMDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaDI2NGRzcF9pbml0LmMKQEAgLTAsMCArMSwzNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBNaWNoYWVsIE5pZWRlcm1heWVyLCBMb3JlbiBNZXJyaXR0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9oMjY0ZHNwLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIElEQ1QgKi8KKyNkZWZpbmUgSURDVF9BRERfRlVOQyhOVU0sIERFUFRILCBPUFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfaDI2NF9pZGN0ICMjIE5VTSAjIyBfYWRkXyAjIyBERVBUSCAjIyBfICMjIE9QVCh1aW50OF90ICpkc3QsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKTsKKworSURDVF9BRERfRlVOQygsIDgsIG1teCkKK0lEQ1RfQUREX0ZVTkMoLCAxMCwgc3NlMikKK0lEQ1RfQUREX0ZVTkMoX2RjLCA4LCBtbXhleHQpCitJRENUX0FERF9GVU5DKF9kYywgMTAsIG1teGV4dCkKK0lEQ1RfQUREX0ZVTkMoOF9kYywgOCwgbW14ZXh0KQorSURDVF9BRERfRlVOQyg4X2RjLCAxMCwgc3NlMikKK0lEQ1RfQUREX0ZVTkMoOCwgOCwgbW14KQorSURDVF9BRERfRlVOQyg4LCA4LCBzc2UyKQorSURDVF9BRERfRlVOQyg4LCAxMCwgc3NlMikKK0lEQ1RfQUREX0ZVTkMoLCAxMCwgYXZ4KQorSURDVF9BRERfRlVOQyg4X2RjLCAxMCwgYXZ4KQorSURDVF9BRERfRlVOQyg4LCAxMCwgYXZ4KQorCisKKyNkZWZpbmUgSURDVF9BRERfUkVQX0ZVTkMoTlVNLCBSRVAsIERFUFRILCBPUFQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfaDI2NF9pZGN0ICMjIE5VTSAjIyBfYWRkICMjIFJFUCAjIyBfICMjIERFUFRIICMjIF8gIyMgT1BUICAgICAgIFwKKyAgICAodWludDhfdCAqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2ICogOF0pOworCitJRENUX0FERF9SRVBfRlVOQyg4LCA0LCA4LCBtbXgpCitJRENUX0FERF9SRVBfRlVOQyg4LCA0LCA4LCBtbXhleHQpCitJRENUX0FERF9SRVBfRlVOQyg4LCA0LCA4LCBzc2UyKQorSURDVF9BRERfUkVQX0ZVTkMoOCwgNCwgMTAsIHNzZTIpCitJRENUX0FERF9SRVBfRlVOQyg4LCA0LCAxMCwgYXZ4KQorSURDVF9BRERfUkVQX0ZVTkMoLCAxNiwgOCwgbW14KQorSURDVF9BRERfUkVQX0ZVTkMoLCAxNiwgOCwgbW14ZXh0KQorSURDVF9BRERfUkVQX0ZVTkMoLCAxNiwgOCwgc3NlMikKK0lEQ1RfQUREX1JFUF9GVU5DKCwgMTYsIDEwLCBzc2UyKQorSURDVF9BRERfUkVQX0ZVTkMoLCAxNmludHJhLCA4LCBtbXgpCitJRENUX0FERF9SRVBfRlVOQygsIDE2aW50cmEsIDgsIG1teGV4dCkKK0lEQ1RfQUREX1JFUF9GVU5DKCwgMTZpbnRyYSwgOCwgc3NlMikKK0lEQ1RfQUREX1JFUF9GVU5DKCwgMTZpbnRyYSwgMTAsIHNzZTIpCitJRENUX0FERF9SRVBfRlVOQygsIDE2LCAxMCwgYXZ4KQorSURDVF9BRERfUkVQX0ZVTkMoLCAxNmludHJhLCAxMCwgYXZ4KQorCisKKyNkZWZpbmUgSURDVF9BRERfUkVQX0ZVTkMyKE5VTSwgUkVQLCBERVBUSCwgT1BUKSAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX2gyNjRfaWRjdCAjIyBOVU0gIyMgX2FkZCAjIyBSRVAgIyMgXyAjIyBERVBUSCAjIyBfICMjIE9QVCAgICAgXAorICAgICh1aW50OF90ICoqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2ICogOF0pOworCitJRENUX0FERF9SRVBfRlVOQzIoLCA4LCA4LCBtbXgpCitJRENUX0FERF9SRVBfRlVOQzIoLCA4LCA4LCBtbXhleHQpCitJRENUX0FERF9SRVBfRlVOQzIoLCA4LCA4LCBzc2UyKQorSURDVF9BRERfUkVQX0ZVTkMyKCwgOCwgMTAsIHNzZTIpCitJRENUX0FERF9SRVBfRlVOQzIoLCA4LCAxMCwgYXZ4KQorCit2b2lkIGZmX2gyNjRfbHVtYV9kY19kZXF1YW50X2lkY3RfbW14KGludDE2X3QgKm91dHB1dCwgaW50MTZfdCAqaW5wdXQsIGludCBxbXVsKTsKK3ZvaWQgZmZfaDI2NF9sdW1hX2RjX2RlcXVhbnRfaWRjdF9zc2UyKGludDE2X3QgKm91dHB1dCwgaW50MTZfdCAqaW5wdXQsIGludCBxbXVsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGVibG9ja2luZyAqLworCit2b2lkIGZmX2gyNjRfbG9vcF9maWx0ZXJfc3RyZW5ndGhfbW14ZXh0KGludDE2X3QgYlNbMl1bNF1bNF0sIHVpbnQ4X3Qgbm56WzQwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IHJlZlsyXVs0MF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgbXZbMl1bNDBdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaXIsIGludCBlZGdlcywgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX212MCwgaW50IG1hc2tfbXYxLCBpbnQgZmllbGQpOworCisjZGVmaW5lIExGX0ZVTkMoRElSLCBUWVBFLCBERVBUSCwgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX2RlYmxvY2tfICMjIERJUiAjIyBfICMjIFRZUEUgIyMgXyAjIyBERVBUSCAjIyBfICMjIE9QVCh1aW50OF90ICpwaXgsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmV0YSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnRjMCk7CisjZGVmaW5lIExGX0lGVU5DKERJUiwgVFlQRSwgREVQVEgsIE9QVCkgXAordm9pZCBmZl9kZWJsb2NrXyAjIyBESVIgIyMgXyAjIyBUWVBFICMjIF8gIyMgREVQVEggIyMgXyAjIyBPUFQodWludDhfdCAqcGl4LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJldGEpOworCisjZGVmaW5lIExGX0ZVTkNTKHR5cGUsIGRlcHRoKSAgICAgICAgICAgICAgICAgICBcCitMRl9GVU5DKGgsICBjaHJvbWEsICAgICAgIGRlcHRoLCBtbXhleHQpICAgICAgICBcCitMRl9JRlVOQyhoLCBjaHJvbWFfaW50cmEsIGRlcHRoLCBtbXhleHQpICAgICAgICBcCitMRl9GVU5DKHYsICBjaHJvbWEsICAgICAgIGRlcHRoLCBtbXhleHQpICAgICAgICBcCitMRl9JRlVOQyh2LCBjaHJvbWFfaW50cmEsIGRlcHRoLCBtbXhleHQpICAgICAgICBcCitMRl9GVU5DKGgsICBsdW1hLCAgICAgICAgIGRlcHRoLCBtbXhleHQpICAgICAgICBcCitMRl9JRlVOQyhoLCBsdW1hX2ludHJhLCAgIGRlcHRoLCBtbXhleHQpICAgICAgICBcCitMRl9GVU5DKGgsICBsdW1hLCAgICAgICAgIGRlcHRoLCBzc2UyKSAgICAgICAgICBcCitMRl9JRlVOQyhoLCBsdW1hX2ludHJhLCAgIGRlcHRoLCBzc2UyKSAgICAgICAgICBcCitMRl9GVU5DKHYsICBsdW1hLCAgICAgICAgIGRlcHRoLCBzc2UyKSAgICAgICAgICBcCitMRl9JRlVOQyh2LCBsdW1hX2ludHJhLCAgIGRlcHRoLCBzc2UyKSAgICAgICAgICBcCitMRl9GVU5DKGgsICBjaHJvbWEsICAgICAgIGRlcHRoLCBzc2UyKSAgICAgICAgICBcCitMRl9JRlVOQyhoLCBjaHJvbWFfaW50cmEsIGRlcHRoLCBzc2UyKSAgICAgICAgICBcCitMRl9GVU5DKHYsICBjaHJvbWEsICAgICAgIGRlcHRoLCBzc2UyKSAgICAgICAgICBcCitMRl9JRlVOQyh2LCBjaHJvbWFfaW50cmEsIGRlcHRoLCBzc2UyKSAgICAgICAgICBcCitMRl9GVU5DKGgsICBsdW1hLCAgICAgICAgIGRlcHRoLCBhdngpICAgICAgICAgICBcCitMRl9JRlVOQyhoLCBsdW1hX2ludHJhLCAgIGRlcHRoLCBhdngpICAgICAgICAgICBcCitMRl9GVU5DKHYsICBsdW1hLCAgICAgICAgIGRlcHRoLCBhdngpICAgICAgICAgICBcCitMRl9JRlVOQyh2LCBsdW1hX2ludHJhLCAgIGRlcHRoLCBhdngpICAgICAgICAgICBcCitMRl9GVU5DKGgsICBjaHJvbWEsICAgICAgIGRlcHRoLCBhdngpICAgICAgICAgICBcCitMRl9JRlVOQyhoLCBjaHJvbWFfaW50cmEsIGRlcHRoLCBhdngpICAgICAgICAgICBcCitMRl9GVU5DKHYsICBjaHJvbWEsICAgICAgIGRlcHRoLCBhdngpICAgICAgICAgICBcCitMRl9JRlVOQyh2LCBjaHJvbWFfaW50cmEsIGRlcHRoLCBhdngpCisKK0xGX0ZVTkNTKHVpbnQ4X3QsICAgOCkKK0xGX0ZVTkNTKHVpbnQxNl90LCAxMCkKKworI2lmIEFSQ0hfWDg2XzMyICYmIEhBVkVfTU1YRVhUX0VYVEVSTkFMCitMRl9GVU5DKHY4LCBsdW1hLCA4LCBtbXhleHQpCitzdGF0aWMgdm9pZCBkZWJsb2NrX3ZfbHVtYV84X21teGV4dCh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXRhLCBpbnQ4X3QgKnRjMCkKK3sKKyAgICBpZiAoKHRjMFswXSAmIHRjMFsxXSkgPj0gMCkKKyAgICAgICAgZmZfZGVibG9ja192OF9sdW1hXzhfbW14ZXh0KHBpeCArIDAsIHN0cmlkZSwgYWxwaGEsIGJldGEsIHRjMCk7CisgICAgaWYgKCh0YzBbMl0gJiB0YzBbM10pID49IDApCisgICAgICAgIGZmX2RlYmxvY2tfdjhfbHVtYV84X21teGV4dChwaXggKyA4LCBzdHJpZGUsIGFscGhhLCBiZXRhLCB0YzAgKyAyKTsKK30KK0xGX0lGVU5DKHY4LCBsdW1hX2ludHJhLCA4LCBtbXhleHQpCitzdGF0aWMgdm9pZCBkZWJsb2NrX3ZfbHVtYV9pbnRyYV84X21teGV4dCh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsIGludCBiZXRhKQoreworICAgIGZmX2RlYmxvY2tfdjhfbHVtYV9pbnRyYV84X21teGV4dChwaXggKyAwLCBzdHJpZGUsIGFscGhhLCBiZXRhKTsKKyAgICBmZl9kZWJsb2NrX3Y4X2x1bWFfaW50cmFfOF9tbXhleHQocGl4ICsgOCwgc3RyaWRlLCBhbHBoYSwgYmV0YSk7Cit9CisjZW5kaWYgLyogQVJDSF9YODZfMzIgJiYgSEFWRV9NTVhFWFRfRVhURVJOQUwgKi8KKworTEZfRlVOQyh2LCAgbHVtYSwgICAgICAgMTAsIG1teGV4dCkKK0xGX0lGVU5DKHYsIGx1bWFfaW50cmEsIDEwLCBtbXhleHQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHdlaWdodGVkIHByZWRpY3Rpb24gKi8KKworI2RlZmluZSBIMjY0X1dFSUdIVChXLCBPUFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9oMjY0X3dlaWdodF8gIyMgVyAjIyBfICMjIE9QVCh1aW50OF90ICpkc3QsIGludCBzdHJpZGUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9kZW5vbSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBpbnQgb2Zmc2V0KTsKKworI2RlZmluZSBIMjY0X0JJV0VJR0hUKFcsIE9QVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9oMjY0X2Jpd2VpZ2h0XyAjIyBXICMjIF8gIyMgT1BUKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoZWlnaHQsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0ZCwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHRzLCBpbnQgb2Zmc2V0KTsKKworI2RlZmluZSBIMjY0X0JJV0VJR0hUX01NWChXKSAgICAgICAgICAgICAgICAgICAgXAorICAgIEgyNjRfV0VJR0hUKFcsIG1teGV4dCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEgyNjRfQklXRUlHSFQoVywgbW14ZXh0KQorCisjZGVmaW5lIEgyNjRfQklXRUlHSFRfTU1YX1NTRShXKSAgICAgICAgICAgICAgICBcCisgICAgSDI2NF9CSVdFSUdIVF9NTVgoVykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSDI2NF9XRUlHSFQoVywgc3NlMikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSDI2NF9CSVdFSUdIVChXLCBzc2UyKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSDI2NF9CSVdFSUdIVChXLCBzc3NlMykKKworSDI2NF9CSVdFSUdIVF9NTVhfU1NFKDE2KQorSDI2NF9CSVdFSUdIVF9NTVhfU1NFKDgpCitIMjY0X0JJV0VJR0hUX01NWCg0KQorCisjZGVmaW5lIEgyNjRfV0VJR0hUXzEwKFcsIERFUFRILCBPUFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX2gyNjRfd2VpZ2h0XyAjIyBXICMjIF8gIyMgREVQVEggIyMgXyAjIyBPUFQodWludDhfdCAqZHN0LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfZGVub20sICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCk7CisKKyNkZWZpbmUgSDI2NF9CSVdFSUdIVF8xMChXLCBERVBUSCwgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfaDI2NF9iaXdlaWdodF8gIyMgVyAjIyBfICMjIERFUFRIICMjIF8gIyMgT1BUKHVpbnQ4X3QgKmRzdCwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHRkLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHRzLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQpOworCisjZGVmaW5lIEgyNjRfQklXRUlHSFRfMTBfU1NFKFcsIERFUFRIKSAgICAgICAgICBcCisgICAgSDI2NF9XRUlHSFRfMTAoVywgREVQVEgsIHNzZTIpICAgICAgICAgICAgICBcCisgICAgSDI2NF9XRUlHSFRfMTAoVywgREVQVEgsIHNzZTQpICAgICAgICAgICAgICBcCisgICAgSDI2NF9CSVdFSUdIVF8xMChXLCBERVBUSCwgc3NlMikgICAgICAgICAgICBcCisgICAgSDI2NF9CSVdFSUdIVF8xMChXLCBERVBUSCwgc3NlNCkKKworSDI2NF9CSVdFSUdIVF8xMF9TU0UoMTYsIDEwKQorSDI2NF9CSVdFSUdIVF8xMF9TU0UoOCwgIDEwKQorSDI2NF9CSVdFSUdIVF8xMF9TU0UoNCwgIDEwKQorCithdl9jb2xkIHZvaWQgZmZfaDI2NGRzcF9pbml0X3g4NihIMjY0RFNQQ29udGV4dCAqYywgY29uc3QgaW50IGJpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaHJvbWFfZm9ybWF0X2lkYykKK3sKKyNpZiBIQVZFX1lBU00KKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpICYmIGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpCisgICAgICAgIGMtPmgyNjRfbG9vcF9maWx0ZXJfc3RyZW5ndGggPSBmZl9oMjY0X2xvb3BfZmlsdGVyX3N0cmVuZ3RoX21teGV4dDsKKworICAgIGlmIChiaXRfZGVwdGggPT0gOCkgeworICAgICAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9kY19hZGQgICA9CisgICAgICAgICAgICBjLT5oMjY0X2lkY3RfYWRkICAgICAgPSBmZl9oMjY0X2lkY3RfYWRkXzhfbW14OworICAgICAgICAgICAgYy0+aDI2NF9pZGN0OF9kY19hZGQgID0KKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdDhfYWRkICAgICA9IGZmX2gyNjRfaWRjdDhfYWRkXzhfbW14OworCisgICAgICAgICAgICBjLT5oMjY0X2lkY3RfYWRkMTYgPSBmZl9oMjY0X2lkY3RfYWRkMTZfOF9tbXg7CisgICAgICAgICAgICBjLT5oMjY0X2lkY3Q4X2FkZDQgPSBmZl9oMjY0X2lkY3Q4X2FkZDRfOF9tbXg7CisgICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkKKyAgICAgICAgICAgICAgICBjLT5oMjY0X2lkY3RfYWRkOCA9IGZmX2gyNjRfaWRjdF9hZGQ4XzhfbW14OworICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2FkZDE2aW50cmEgPSBmZl9oMjY0X2lkY3RfYWRkMTZpbnRyYV84X21teDsKKyAgICAgICAgICAgIGlmIChjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19DTU9WKQorICAgICAgICAgICAgICAgIGMtPmgyNjRfbHVtYV9kY19kZXF1YW50X2lkY3QgPSBmZl9oMjY0X2x1bWFfZGNfZGVxdWFudF9pZGN0X21teDsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9kY19hZGQgID0gZmZfaDI2NF9pZGN0X2RjX2FkZF84X21teGV4dDsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdDhfZGNfYWRkID0gZmZfaDI2NF9pZGN0OF9kY19hZGRfOF9tbXhleHQ7CisgICAgICAgICAgICBjLT5oMjY0X2lkY3RfYWRkMTYgICA9IGZmX2gyNjRfaWRjdF9hZGQxNl84X21teGV4dDsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdDhfYWRkNCAgID0gZmZfaDI2NF9pZGN0OF9hZGQ0XzhfbW14ZXh0OworICAgICAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpCisgICAgICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2FkZDggPSBmZl9oMjY0X2lkY3RfYWRkOF84X21teGV4dDsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQxNmludHJhID0gZmZfaDI2NF9pZGN0X2FkZDE2aW50cmFfOF9tbXhleHQ7CisKKyAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWEgICAgICAgPSBmZl9kZWJsb2NrX3ZfY2hyb21hXzhfbW14ZXh0OworICAgICAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSA9IGZmX2RlYmxvY2tfdl9jaHJvbWFfaW50cmFfOF9tbXhleHQ7CisgICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkgeworICAgICAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWEgICAgICAgPSBmZl9kZWJsb2NrX2hfY2hyb21hXzhfbW14ZXh0OworICAgICAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmEgPSBmZl9kZWJsb2NrX2hfY2hyb21hX2ludHJhXzhfbW14ZXh0OworICAgICAgICAgICAgfQorI2lmIEFSQ0hfWDg2XzMyICYmIEhBVkVfTU1YRVhUX0VYVEVSTkFMCisgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYSAgICAgICA9IGRlYmxvY2tfdl9sdW1hXzhfbW14ZXh0OworICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2x1bWEgICAgICAgPSBmZl9kZWJsb2NrX2hfbHVtYV84X21teGV4dDsKKyAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hX2ludHJhID0gZGVibG9ja192X2x1bWFfaW50cmFfOF9tbXhleHQ7CisgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9pbnRyYSA9IGZmX2RlYmxvY2tfaF9sdW1hX2ludHJhXzhfbW14ZXh0OworI2VuZGlmIC8qIEFSQ0hfWDg2XzMyICYmIEhBVkVfTU1YRVhUX0VYVEVSTkFMICovCisgICAgICAgICAgICBjLT53ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzBdID0gZmZfaDI2NF93ZWlnaHRfMTZfbW14ZXh0OworICAgICAgICAgICAgYy0+d2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlsxXSA9IGZmX2gyNjRfd2VpZ2h0XzhfbW14ZXh0OworICAgICAgICAgICAgYy0+d2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlsyXSA9IGZmX2gyNjRfd2VpZ2h0XzRfbW14ZXh0OworCisgICAgICAgICAgICBjLT5iaXdlaWdodF9oMjY0X3BpeGVsc190YWJbMF0gPSBmZl9oMjY0X2Jpd2VpZ2h0XzE2X21teGV4dDsKKyAgICAgICAgICAgIGMtPmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlsxXSA9IGZmX2gyNjRfYml3ZWlnaHRfOF9tbXhleHQ7CisgICAgICAgICAgICBjLT5iaXdlaWdodF9oMjY0X3BpeGVsc190YWJbMl0gPSBmZl9oMjY0X2Jpd2VpZ2h0XzRfbW14ZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdDhfYWRkICA9IGZmX2gyNjRfaWRjdDhfYWRkXzhfc3NlMjsKKworICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2FkZDE2ID0gZmZfaDI2NF9pZGN0X2FkZDE2Xzhfc3NlMjsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdDhfYWRkNCA9IGZmX2gyNjRfaWRjdDhfYWRkNF84X3NzZTI7CisgICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkKKyAgICAgICAgICAgICAgICBjLT5oMjY0X2lkY3RfYWRkOCA9IGZmX2gyNjRfaWRjdF9hZGQ4Xzhfc3NlMjsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQxNmludHJhICAgICAgPSBmZl9oMjY0X2lkY3RfYWRkMTZpbnRyYV84X3NzZTI7CisgICAgICAgICAgICBjLT5oMjY0X2x1bWFfZGNfZGVxdWFudF9pZGN0ID0gZmZfaDI2NF9sdW1hX2RjX2RlcXVhbnRfaWRjdF9zc2UyOworCisgICAgICAgICAgICBjLT53ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzBdID0gZmZfaDI2NF93ZWlnaHRfMTZfc3NlMjsKKyAgICAgICAgICAgIGMtPndlaWdodF9oMjY0X3BpeGVsc190YWJbMV0gPSBmZl9oMjY0X3dlaWdodF84X3NzZTI7CisKKyAgICAgICAgICAgIGMtPmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlswXSA9IGZmX2gyNjRfYml3ZWlnaHRfMTZfc3NlMjsKKyAgICAgICAgICAgIGMtPmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlsxXSA9IGZmX2gyNjRfYml3ZWlnaHRfOF9zc2UyOworCisgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYSAgICAgICA9IGZmX2RlYmxvY2tfdl9sdW1hXzhfc3NlMjsKKyAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hICAgICAgID0gZmZfZGVibG9ja19oX2x1bWFfOF9zc2UyOworICAgICAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2x1bWFfaW50cmEgPSBmZl9kZWJsb2NrX3ZfbHVtYV9pbnRyYV84X3NzZTI7CisgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9pbnRyYSA9IGZmX2RlYmxvY2tfaF9sdW1hX2ludHJhXzhfc3NlMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfU1NTRTMoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgYy0+Yml3ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzBdID0gZmZfaDI2NF9iaXdlaWdodF8xNl9zc3NlMzsKKyAgICAgICAgICAgIGMtPmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlsxXSA9IGZmX2gyNjRfYml3ZWlnaHRfOF9zc3NlMzsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hICAgICAgID0gZmZfZGVibG9ja192X2x1bWFfOF9hdng7CisgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYSAgICAgICA9IGZmX2RlYmxvY2tfaF9sdW1hXzhfYXZ4OworICAgICAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2x1bWFfaW50cmEgPSBmZl9kZWJsb2NrX3ZfbHVtYV9pbnRyYV84X2F2eDsKKyAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX2ludHJhID0gZmZfZGVibG9ja19oX2x1bWFfaW50cmFfOF9hdng7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJpdF9kZXB0aCA9PSAxMCkgeworICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKKyNpZiBBUkNIX1g4Nl8zMgorICAgICAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2Nocm9tYSAgICAgICA9IGZmX2RlYmxvY2tfdl9jaHJvbWFfMTBfbW14ZXh0OworICAgICAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSA9IGZmX2RlYmxvY2tfdl9jaHJvbWFfaW50cmFfMTBfbW14ZXh0OworICAgICAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2x1bWEgICAgICAgICA9IGZmX2RlYmxvY2tfdl9sdW1hXzEwX21teGV4dDsKKyAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hICAgICAgICAgPSBmZl9kZWJsb2NrX2hfbHVtYV8xMF9tbXhleHQ7CisgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYV9pbnRyYSAgID0gZmZfZGVibG9ja192X2x1bWFfaW50cmFfMTBfbW14ZXh0OworICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2x1bWFfaW50cmEgICA9IGZmX2RlYmxvY2tfaF9sdW1hX2ludHJhXzEwX21teGV4dDsKKyNlbmRpZiAvKiBBUkNIX1g4Nl8zMiAqLworICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2RjX2FkZCA9IGZmX2gyNjRfaWRjdF9kY19hZGRfMTBfbW14ZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQgICAgID0gZmZfaDI2NF9pZGN0X2FkZF8xMF9zc2UyOworICAgICAgICAgICAgYy0+aDI2NF9pZGN0OF9kY19hZGQgPSBmZl9oMjY0X2lkY3Q4X2RjX2FkZF8xMF9zc2UyOworCisgICAgICAgICAgICBjLT5oMjY0X2lkY3RfYWRkMTYgPSBmZl9oMjY0X2lkY3RfYWRkMTZfMTBfc3NlMjsKKyAgICAgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA8PSAxKQorICAgICAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQ4ID0gZmZfaDI2NF9pZGN0X2FkZDhfMTBfc3NlMjsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQxNmludHJhID0gZmZfaDI2NF9pZGN0X2FkZDE2aW50cmFfMTBfc3NlMjsKKyNpZiBIQVZFX0FMSUdORURfU1RBQ0sKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdDhfYWRkICA9IGZmX2gyNjRfaWRjdDhfYWRkXzEwX3NzZTI7CisgICAgICAgICAgICBjLT5oMjY0X2lkY3Q4X2FkZDQgPSBmZl9oMjY0X2lkY3Q4X2FkZDRfMTBfc3NlMjsKKyNlbmRpZiAvKiBIQVZFX0FMSUdORURfU1RBQ0sgKi8KKworICAgICAgICAgICAgYy0+d2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlswXSA9IGZmX2gyNjRfd2VpZ2h0XzE2XzEwX3NzZTI7CisgICAgICAgICAgICBjLT53ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzFdID0gZmZfaDI2NF93ZWlnaHRfOF8xMF9zc2UyOworICAgICAgICAgICAgYy0+d2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlsyXSA9IGZmX2gyNjRfd2VpZ2h0XzRfMTBfc3NlMjsKKworICAgICAgICAgICAgYy0+Yml3ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzBdID0gZmZfaDI2NF9iaXdlaWdodF8xNl8xMF9zc2UyOworICAgICAgICAgICAgYy0+Yml3ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzFdID0gZmZfaDI2NF9iaXdlaWdodF84XzEwX3NzZTI7CisgICAgICAgICAgICBjLT5iaXdlaWdodF9oMjY0X3BpeGVsc190YWJbMl0gPSBmZl9oMjY0X2Jpd2VpZ2h0XzRfMTBfc3NlMjsKKworICAgICAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2Nocm9tYSAgICAgICA9IGZmX2RlYmxvY2tfdl9jaHJvbWFfMTBfc3NlMjsKKyAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmEgPSBmZl9kZWJsb2NrX3ZfY2hyb21hX2ludHJhXzEwX3NzZTI7CisjaWYgSEFWRV9BTElHTkVEX1NUQUNLCisgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYSAgICAgICA9IGZmX2RlYmxvY2tfdl9sdW1hXzEwX3NzZTI7CisgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYSAgICAgICA9IGZmX2RlYmxvY2tfaF9sdW1hXzEwX3NzZTI7CisgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYV9pbnRyYSA9IGZmX2RlYmxvY2tfdl9sdW1hX2ludHJhXzEwX3NzZTI7CisgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9pbnRyYSA9IGZmX2RlYmxvY2tfaF9sdW1hX2ludHJhXzEwX3NzZTI7CisjZW5kaWYgLyogSEFWRV9BTElHTkVEX1NUQUNLICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgYy0+d2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlswXSA9IGZmX2gyNjRfd2VpZ2h0XzE2XzEwX3NzZTQ7CisgICAgICAgICAgICBjLT53ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzFdID0gZmZfaDI2NF93ZWlnaHRfOF8xMF9zc2U0OworICAgICAgICAgICAgYy0+d2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlsyXSA9IGZmX2gyNjRfd2VpZ2h0XzRfMTBfc3NlNDsKKworICAgICAgICAgICAgYy0+Yml3ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzBdID0gZmZfaDI2NF9iaXdlaWdodF8xNl8xMF9zc2U0OworICAgICAgICAgICAgYy0+Yml3ZWlnaHRfaDI2NF9waXhlbHNfdGFiWzFdID0gZmZfaDI2NF9iaXdlaWdodF84XzEwX3NzZTQ7CisgICAgICAgICAgICBjLT5iaXdlaWdodF9oMjY0X3BpeGVsc190YWJbMl0gPSBmZl9oMjY0X2Jpd2VpZ2h0XzRfMTBfc3NlNDsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9kY19hZGQgID0KKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQgICAgID0gZmZfaDI2NF9pZGN0X2FkZF8xMF9hdng7CisgICAgICAgICAgICBjLT5oMjY0X2lkY3Q4X2RjX2FkZCA9IGZmX2gyNjRfaWRjdDhfZGNfYWRkXzEwX2F2eDsKKworICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2FkZDE2ID0gZmZfaDI2NF9pZGN0X2FkZDE2XzEwX2F2eDsKKyAgICAgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA8PSAxKQorICAgICAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQ4ID0gZmZfaDI2NF9pZGN0X2FkZDhfMTBfYXZ4OworICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2FkZDE2aW50cmEgPSBmZl9oMjY0X2lkY3RfYWRkMTZpbnRyYV8xMF9hdng7CisjaWYgSEFWRV9BTElHTkVEX1NUQUNLCisgICAgICAgICAgICBjLT5oMjY0X2lkY3Q4X2FkZCAgPSBmZl9oMjY0X2lkY3Q4X2FkZF8xMF9hdng7CisgICAgICAgICAgICBjLT5oMjY0X2lkY3Q4X2FkZDQgPSBmZl9oMjY0X2lkY3Q4X2FkZDRfMTBfYXZ4OworI2VuZGlmIC8qIEhBVkVfQUxJR05FRF9TVEFDSyAqLworCisgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfY2hyb21hICAgICAgID0gZmZfZGVibG9ja192X2Nocm9tYV8xMF9hdng7CisgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfY2hyb21hX2ludHJhID0gZmZfZGVibG9ja192X2Nocm9tYV9pbnRyYV8xMF9hdng7CisjaWYgSEFWRV9BTElHTkVEX1NUQUNLCisgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYSAgICAgICAgID0gZmZfZGVibG9ja192X2x1bWFfMTBfYXZ4OworICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2x1bWEgICAgICAgICA9IGZmX2RlYmxvY2tfaF9sdW1hXzEwX2F2eDsKKyAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hX2ludHJhICAgPSBmZl9kZWJsb2NrX3ZfbHVtYV9pbnRyYV8xMF9hdng7CisgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9pbnRyYSAgID0gZmZfZGVibG9ja19oX2x1bWFfaW50cmFfMTBfYXZ4OworI2VuZGlmIC8qIEhBVkVfQUxJR05FRF9TVEFDSyAqLworICAgICAgICB9CisgICAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvaGV2Y19kZWJsb2NrLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oZXZjX2RlYmxvY2suYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MmNiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaGV2Y19kZWJsb2NrLmFzbQpAQCAtMCwwICsxLDg3NSBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBTU0UyLW9wdGltaXplZCBIRVZDIGRlYmxvY2tpbmcgY29kZQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBDb3B5cmlnaHQgKEMpIDIwMTMgVlRUCis7KgorOyogQXV0aG9yczogU2VwcG8gVG9tcGVyaSA8c2VwcG8udG9tcGVyaUB2dHQuZmk+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworcHdfcGl4ZWxfbWF4XzEyOiB0aW1lcyA4IGR3ICgoMSA8PCAxMiktMSkKK3B3X3BpeGVsX21heF8xMDogdGltZXMgOCBkdyAoKDEgPDwgMTApLTEpCitwd19tMjogICAgICAgICAgIHRpbWVzIDggZHcgLTIKK3BkXzEgOiAgICAgICAgICAgdGltZXMgNCBkZCAgMQorCitjZXh0ZXJuIHB3XzQKK2NleHRlcm4gcHdfOAorY2V4dGVybiBwd19tMQorCitTRUNUSU9OIC50ZXh0CitJTklUX1hNTSBzc2UyCisKKzsgZXhwYW5kcyB0byBbYmFzZV0sLi4uLFtiYXNlKzcqc3RyaWRlXQorJWRlZmluZSBQQVNTOFJPV1MoYmFzZSwgYmFzZTMsIHN0cmlkZSwgc3RyaWRlMykgXAorICAgIFtiYXNlXSwgW2Jhc2Urc3RyaWRlXSwgW2Jhc2Urc3RyaWRlKjJdLCBbYmFzZTNdLCBcCisgICAgW2Jhc2UzK3N0cmlkZV0sIFtiYXNlMytzdHJpZGUqMl0sIFtiYXNlMytzdHJpZGUzXSwgW2Jhc2UzK3N0cmlkZSo0XQorCis7IGluOiA4IHJvd3Mgb2YgNCBieXRlcyBpbiAlNC4uJTExCis7IG91dDogNCByb3dzIG9mIDggd29yZHMgaW4gbTAuLm0zCislbWFjcm8gVFJBTlNQT1NFNHg4Ql9MT0FEIDgKKyAgICBtb3ZkICAgICAgICAgICAgIG0wLCAlMQorICAgIG1vdmQgICAgICAgICAgICAgbTIsICUyCisgICAgbW92ZCAgICAgICAgICAgICBtMSwgJTMKKyAgICBtb3ZkICAgICAgICAgICAgIG0zLCAlNAorCisgICAgcHVucGNrbGJ3ICAgICAgICBtMCwgbTIKKyAgICBwdW5wY2tsYncgICAgICAgIG0xLCBtMworICAgIHB1bnBja2x3ZCAgICAgICAgbTAsIG0xCisKKyAgICBtb3ZkICAgICAgICAgICAgIG00LCAlNQorICAgIG1vdmQgICAgICAgICAgICAgbTYsICU2CisgICAgbW92ZCAgICAgICAgICAgICBtNSwgJTcKKyAgICBtb3ZkICAgICAgICAgICAgIG0zLCAlOAorCisgICAgcHVucGNrbGJ3ICAgICAgICBtNCwgbTYKKyAgICBwdW5wY2tsYncgICAgICAgIG01LCBtMworICAgIHB1bnBja2x3ZCAgICAgICAgbTQsIG01CisKKyAgICBwdW5wY2toZHEgICAgICAgIG0yLCBtMCwgbTQKKyAgICBwdW5wY2tsZHEgICAgICAgIG0wLCBtNAorCisgICAgcHhvciAgICAgICAgICAgICBtNSwgbTUKKyAgICBwdW5wY2toYncgICAgICAgIG0xLCBtMCwgbTUKKyAgICBwdW5wY2tsYncgICAgICAgIG0wLCBtNQorICAgIHB1bnBja2hidyAgICAgICAgbTMsIG0yLCBtNQorICAgIHB1bnBja2xidyAgICAgICAgbTIsIG01CislZW5kbWFjcm8KKworOyBpbjogNCByb3dzIG9mIDggd29yZHMgaW4gbTAuLm0zCis7IG91dDogOCByb3dzIG9mIDQgYnl0ZXMgaW4gJTEuLiU4CislbWFjcm8gVFJBTlNQT1NFOHg0Ql9TVE9SRSA4CisgICAgcGFja3Vzd2IgICAgICAgICBtMCwgbTIKKyAgICBwYWNrdXN3YiAgICAgICAgIG0xLCBtMworICAgIFNCVVRURVJGTFkgYncsIDAsIDEsIDIKKyAgICBTQlVUVEVSRkxZIHdkLCAwLCAxLCAyCisKKyAgICBtb3ZkICAgICAgICAgICAgICUxLCBtMAorICAgIHBzaHVmZCAgICAgICAgICAgbTAsIG0wLCAweDM5CisgICAgbW92ZCAgICAgICAgICAgICAlMiwgbTAKKyAgICBwc2h1ZmQgICAgICAgICAgIG0wLCBtMCwgMHgzOQorICAgIG1vdmQgICAgICAgICAgICAgJTMsIG0wCisgICAgcHNodWZkICAgICAgICAgICBtMCwgbTAsIDB4MzkKKyAgICBtb3ZkICAgICAgICAgICAgICU0LCBtMAorCisgICAgbW92ZCAgICAgICAgICAgICAlNSwgbTEKKyAgICBwc2h1ZmQgICAgICAgICAgIG0xLCBtMSwgMHgzOQorICAgIG1vdmQgICAgICAgICAgICAgJTYsIG0xCisgICAgcHNodWZkICAgICAgICAgICBtMSwgbTEsIDB4MzkKKyAgICBtb3ZkICAgICAgICAgICAgICU3LCBtMQorICAgIHBzaHVmZCAgICAgICAgICAgbTEsIG0xLCAweDM5CisgICAgbW92ZCAgICAgICAgICAgICAlOCwgbTEKKyVlbmRtYWNybworCis7IGluOiA4IHJvd3Mgb2YgNCB3b3JkcyBpbiAlNC4uJTExCis7IG91dDogNCByb3dzIG9mIDggd29yZHMgaW4gbTAuLm0zCislbWFjcm8gVFJBTlNQT1NFNHg4V19MT0FEIDgKKyAgICBtb3ZxICAgICAgICAgICAgIG0wLCAlMQorICAgIG1vdnEgICAgICAgICAgICAgbTIsICUyCisgICAgbW92cSAgICAgICAgICAgICBtMSwgJTMKKyAgICBtb3ZxICAgICAgICAgICAgIG0zLCAlNAorCisgICAgcHVucGNrbHdkICAgICAgICBtMCwgbTIKKyAgICBwdW5wY2tsd2QgICAgICAgIG0xLCBtMworICAgIHB1bnBja2hkcSAgICAgICAgbTIsIG0wLCBtMQorICAgIHB1bnBja2xkcSAgICAgICAgbTAsIG0xCisKKyAgICBtb3ZxICAgICAgICAgICAgIG00LCAlNQorICAgIG1vdnEgICAgICAgICAgICAgbTYsICU2CisgICAgbW92cSAgICAgICAgICAgICBtNSwgJTcKKyAgICBtb3ZxICAgICAgICAgICAgIG0zLCAlOAorCisgICAgcHVucGNrbHdkICAgICAgICBtNCwgbTYKKyAgICBwdW5wY2tsd2QgICAgICAgIG01LCBtMworICAgIHB1bnBja2hkcSAgICAgICAgbTYsIG00LCBtNQorICAgIHB1bnBja2xkcSAgICAgICAgbTQsIG01CisKKyAgICBwdW5wY2tocWRxICAgICAgIG0xLCBtMCwgbTQKKyAgICBwdW5wY2tscWRxICAgICAgIG0wLCBtNAorICAgIHB1bnBja2hxZHEgICAgICAgbTMsIG0yLCBtNgorICAgIHB1bnBja2xxZHEgICAgICAgbTIsIG02CisKKyVlbmRtYWNybworCis7IGluOiA0IHJvd3Mgb2YgOCB3b3JkcyBpbiBtMC4ubTMKKzsgb3V0OiA4IHJvd3Mgb2YgNCB3b3JkcyBpbiAlMS4uJTgKKyVtYWNybyBUUkFOU1BPU0U4eDRXX1NUT1JFIDkKKyAgICBUUkFOU1BPU0U0eDRXICAgICAwLCAxLCAyLCAzLCA0CisKKyAgICBweG9yICAgICAgICAgICAgIG01LCBtNTsgemVyb3MgcmVnCisgICAgQ0xJUFcgICAgICAgICAgICBtMCwgbTUsICU5CisgICAgQ0xJUFcgICAgICAgICAgICBtMSwgbTUsICU5CisgICAgQ0xJUFcgICAgICAgICAgICBtMiwgbTUsICU5CisgICAgQ0xJUFcgICAgICAgICAgICBtMywgbTUsICU5CisKKyAgICBtb3ZxICAgICAgICAgICAgICUxLCBtMAorICAgIG1vdmhwcyAgICAgICAgICAgJTIsIG0wCisgICAgbW92cSAgICAgICAgICAgICAlMywgbTEKKyAgICBtb3ZocHMgICAgICAgICAgICU0LCBtMQorICAgIG1vdnEgICAgICAgICAgICAgJTUsIG0yCisgICAgbW92aHBzICAgICAgICAgICAlNiwgbTIKKyAgICBtb3ZxICAgICAgICAgICAgICU3LCBtMworICAgIG1vdmhwcyAgICAgICAgICAgJTgsIG0zCislZW5kbWFjcm8KKworOyBpbjogOCByb3dzIG9mIDggYnl0ZXMgaW4gJTEuLiU4Cis7IG91dDogOCByb3dzIG9mIDggd29yZHMgaW4gbTAuLm03CislbWFjcm8gVFJBTlNQT1NFOHg4Ql9MT0FEIDgKKyAgICBtb3ZxICAgICAgICAgICAgIG03LCAlMQorICAgIG1vdnEgICAgICAgICAgICAgbTIsICUyCisgICAgbW92cSAgICAgICAgICAgICBtMSwgJTMKKyAgICBtb3ZxICAgICAgICAgICAgIG0zLCAlNAorCisgICAgcHVucGNrbGJ3ICAgICAgICBtNywgbTIKKyAgICBwdW5wY2tsYncgICAgICAgIG0xLCBtMworICAgIHB1bnBja2x3ZCAgICAgICAgbTMsIG03LCBtMQorICAgIHB1bnBja2h3ZCAgICAgICAgbTcsIG0xCisKKyAgICBtb3ZxICAgICAgICAgICAgIG00LCAlNQorICAgIG1vdnEgICAgICAgICAgICAgbTYsICU2CisgICAgbW92cSAgICAgICAgICAgICBtNSwgJTcKKyAgICBtb3ZxICAgICAgICAgICAgbTE1LCAlOAorCisgICAgcHVucGNrbGJ3ICAgICAgICBtNCwgbTYKKyAgICBwdW5wY2tsYncgICAgICAgIG01LCBtMTUKKyAgICBwdW5wY2tsd2QgICAgICAgIG05LCBtNCwgbTUKKyAgICBwdW5wY2tod2QgICAgICAgIG00LCBtNQorCisgICAgcHVucGNrbGRxICAgICAgICBtMSwgbTMsIG05OyAgMCwgMQorICAgIHB1bnBja2hkcSAgICAgICAgbTMsIG05OyAgMiwgMworCisgICAgcHVucGNrbGRxICAgICAgICBtNSwgbTcsIG00OyAgNCwgNQorICAgIHB1bnBja2hkcSAgICAgICAgbTcsIG00OyAgNiwgNworCisgICAgcHhvciAgICAgICAgICAgIG0xMywgbTEzCisKKyAgICBwdW5wY2tsYncgICAgICAgIG0wLCBtMSwgbTEzOyAwIGluIDE2IGJpdAorICAgIHB1bnBja2hidyAgICAgICAgbTEsIG0xMzsgMSBpbiAxNiBiaXQKKworICAgIHB1bnBja2xidyAgICAgICAgbTIsIG0zLCBtMTM7IDIKKyAgICBwdW5wY2toYncgICAgICAgIG0zLCBtMTM7IDMKKworICAgIHB1bnBja2xidyAgICAgICAgbTQsIG01LCBtMTM7IDQKKyAgICBwdW5wY2toYncgICAgICAgIG01LCBtMTM7IDUKKworICAgIHB1bnBja2xidyAgICAgICAgbTYsIG03LCBtMTM7IDYKKyAgICBwdW5wY2toYncgICAgICAgIG03LCBtMTM7IDcKKyVlbmRtYWNybworCisKKzsgaW46IDggcm93cyBvZiA4IHdvcmRzIGluIG0wLi5tOAorOyBvdXQ6IDggcm93cyBvZiA4IGJ5dGVzIGluICUxLi4lOAorJW1hY3JvIFRSQU5TUE9TRTh4OEJfU1RPUkUgOAorICAgIHBhY2t1c3diICAgICAgICAgbTAsIG00CisgICAgcGFja3Vzd2IgICAgICAgICBtMSwgbTUKKyAgICBwYWNrdXN3YiAgICAgICAgIG0yLCBtNgorICAgIHBhY2t1c3diICAgICAgICAgbTMsIG03CisgICAgVFJBTlNQT1NFMng0eDRCICAgMCwgMSwgMiwgMywgNAorCisgICAgbW92cSAgICAgICAgICAgICAlMSwgbTAKKyAgICBtb3ZocHMgICAgICAgICAgICUyLCBtMAorICAgIG1vdnEgICAgICAgICAgICAgJTMsIG0xCisgICAgbW92aHBzICAgICAgICAgICAlNCwgbTEKKyAgICBtb3ZxICAgICAgICAgICAgICU1LCBtMgorICAgIG1vdmhwcyAgICAgICAgICAgJTYsIG0yCisgICAgbW92cSAgICAgICAgICAgICAlNywgbTMKKyAgICBtb3ZocHMgICAgICAgICAgICU4LCBtMworJWVuZG1hY3JvCisKKzsgaW46IDggcm93cyBvZiA4IHdvcmRzIGluICUxLi4lOAorOyBvdXQ6IDggcm93cyBvZiA4IHdvcmRzIGluIG0wLi5tNworJW1hY3JvIFRSQU5TUE9TRTh4OFdfTE9BRCA4CisgICAgbW92ZHF1ICAgICAgICAgICBtMCwgJTEKKyAgICBtb3ZkcXUgICAgICAgICAgIG0xLCAlMgorICAgIG1vdmRxdSAgICAgICAgICAgbTIsICUzCisgICAgbW92ZHF1ICAgICAgICAgICBtMywgJTQKKyAgICBtb3ZkcXUgICAgICAgICAgIG00LCAlNQorICAgIG1vdmRxdSAgICAgICAgICAgbTUsICU2CisgICAgbW92ZHF1ICAgICAgICAgICBtNiwgJTcKKyAgICBtb3ZkcXUgICAgICAgICAgIG03LCAlOAorICAgIFRSQU5TUE9TRTh4OFcgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgKKyVlbmRtYWNybworCis7IGluOiA4IHJvd3Mgb2YgOCB3b3JkcyBpbiBtMC4ubTgKKzsgb3V0OiA4IHJvd3Mgb2YgOCB3b3JkcyBpbiAlMS4uJTgKKyVtYWNybyBUUkFOU1BPU0U4eDhXX1NUT1JFIDkKKyAgICBUUkFOU1BPU0U4eDhXICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4CisKKyAgICBweG9yICAgICAgICAgICAgIG04LCBtOAorICAgIENMSVBXICAgICAgICAgICAgbTAsIG04LCAlOQorICAgIENMSVBXICAgICAgICAgICAgbTEsIG04LCAlOQorICAgIENMSVBXICAgICAgICAgICAgbTIsIG04LCAlOQorICAgIENMSVBXICAgICAgICAgICAgbTMsIG04LCAlOQorICAgIENMSVBXICAgICAgICAgICAgbTQsIG04LCAlOQorICAgIENMSVBXICAgICAgICAgICAgbTUsIG04LCAlOQorICAgIENMSVBXICAgICAgICAgICAgbTYsIG04LCAlOQorICAgIENMSVBXICAgICAgICAgICAgbTcsIG04LCAlOQorCisgICAgbW92ZHF1ICAgICAgICAgICAlMSwgbTAKKyAgICBtb3ZkcXUgICAgICAgICAgICUyLCBtMQorICAgIG1vdmRxdSAgICAgICAgICAgJTMsIG0yCisgICAgbW92ZHF1ICAgICAgICAgICAlNCwgbTMKKyAgICBtb3ZkcXUgICAgICAgICAgICU1LCBtNAorICAgIG1vdmRxdSAgICAgICAgICAgJTYsIG01CisgICAgbW92ZHF1ICAgICAgICAgICAlNywgbTYKKyAgICBtb3ZkcXUgICAgICAgICAgICU4LCBtNworJWVuZG1hY3JvCisKKworOyBpbjogJTIgY2xvYmJlcmVkCis7IG91dDogJTEKKzsgbWFzayBpbiBtMTEKKzsgY2xvYmJlcnMgbTEwCislbWFjcm8gTUFTS0VEX0NPUFkgMgorICAgIHBhbmQgICAgICAgICAgICAgJTIsIG0xMSA7IGFuZCBtYXNrCisgICAgcGFuZG4gICAgICAgICAgIG0xMCwgbTExLCAlMTsgYW5kIC1tYXNrCisgICAgcG9yICAgICAgICAgICAgICAlMiwgbTEwCisgICAgbW92YSAgICAgICAgICAgICAlMSwgJTIKKyVlbmRtYWNybworCis7IGluOiAlMiBjbG9iYmVyZWQKKzsgb3V0OiAlMQorOyBtYXNrIGluICUzLCB3aWxsIGJlIGNsb2JiZXJlZAorJW1hY3JvIE1BU0tFRF9DT1BZMiAzCisgICAgcGFuZCAgICAgICAgICAgICAlMiwgJTMgOyBhbmQgbWFzaworICAgIHBhbmRuICAgICAgICAgICAgJTMsICUxOyBhbmQgLW1hc2sKKyAgICBwb3IgICAgICAgICAgICAgICUyLCAlMworICAgIG1vdmEgICAgICAgICAgICAgJTEsICUyCislZW5kbWFjcm8KKworQUxJR04gMTYKKzsgaW5wdXQgaW4gbTAgLi4uIG0zIGFuZCB0Y3MgaW4gcjIuIE91dHB1dCBpbiBtMSBhbmQgbTIKKyVtYWNybyBDSFJPTUFfREVCTE9DS19CT0RZIDEKKyAgICBwc3VidyAgICAgICAgICAgIG00LCBtMiwgbTE7IHEwIC0gcDAKKyAgICBwc3VidyAgICAgICAgICAgIG01LCBtMCwgbTM7IHAxIC0gcTEKKyAgICBwc2xsdyAgICAgICAgICAgIG00LCAyOyA8PCAyCisgICAgcGFkZHcgICAgICAgICAgICBtNSwgbTQ7CisKKyAgICA7dGMgY2FsY3VsYXRpb25zCisgICAgbW92cSAgICAgICAgICAgICBtNiwgW3RjcV07IHRjMAorICAgIHB1bnBja2x3ZCAgICAgICAgbTYsIG02CisgICAgcHNodWZkICAgICAgICAgICBtNiwgbTYsIDB4QTA7IHRjMCwgdGMxCislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICBwc2lnbncgICAgICAgICAgIG00LCBtNiwgW3B3X20xXTsgLXRjMCwgLXRjMQorJWVsc2UKKyAgICBwbXVsbHcgICAgICAgICAgIG00LCBtNiwgW3B3X20xXTsgLXRjMCwgLXRjMQorJWVuZGlmCisgICAgO2VuZCB0YyBjYWxjdWxhdGlvbnMKKworICAgIHBhZGR3ICAgICAgICAgICAgbTUsIFtwd180XTsgKzQKKyAgICBwc3JhdyAgICAgICAgICAgIG01LCAzOyA+PiAzCisKKyVpZiAlMSA+IDgKKyAgICBwc2xsdyAgICAgICAgICAgIG00LCAlMS04OyA8PCAoQklUX0RFUFRIIC0gOCkKKyAgICBwc2xsdyAgICAgICAgICAgIG02LCAlMS04OyA8PCAoQklUX0RFUFRIIC0gOCkKKyVlbmRpZgorICAgIHBtYXhzdyAgICAgICAgICAgbTUsIG00CisgICAgcG1pbnN3ICAgICAgICAgICBtNSwgbTYKKyAgICBwYWRkdyAgICAgICAgICAgIG0xLCBtNTsgcDAgKyBkZWx0YTAKKyAgICBwc3VidyAgICAgICAgICAgIG0yLCBtNTsgcTAgLSBkZWx0YTAKKyVlbmRtYWNybworCis7IGlucHV0IGluIG0wIC4uLiBtNywgYmV0YSBpbiByMiB0Y3MgaW4gcjMuIE91dHB1dCBpbiBtMS4uLm02CislbWFjcm8gTFVNQV9ERUJMT0NLX0JPRFkgMgorICAgIHBzbGx3ICAgICAgICAgICAgbTksIG0yLCAxOyAqMgorICAgIHBzdWJ3ICAgICAgICAgICBtMTAsIG0xLCBtOQorICAgIHBhZGR3ICAgICAgICAgICBtMTAsIG0zCisgICAgQUJTMSAgICAgICAgICAgIG0xMCwgbTExIDsgMGRwMCwgMGRwMyAsIDFkcDAsIDFkcDMKKworICAgIHBzbGx3ICAgICAgICAgICAgbTksIG01LCAxOyAqMgorICAgIHBzdWJ3ICAgICAgICAgICBtMTEsIG02LCBtOQorICAgIHBhZGR3ICAgICAgICAgICBtMTEsIG00CisgICAgQUJTMSAgICAgICAgICAgIG0xMSwgbTEzIDsgMGRxMCwgMGRxMyAsIDFkcTAsIDFkcTMKKworICAgIDtiZXRhIGNhbGN1bGF0aW9ucworJWlmICUxID4gOAorICAgIHNobCAgICAgICAgICAgICBiZXRhcSwgJTEgLSA4CislZW5kaWYKKyAgICBtb3ZkICAgICAgICAgICAgbTEzLCBiZXRhZAorICAgIFNQTEFUVyAgICAgICAgICBtMTMsIG0xMywgMAorICAgIDtlbmQgYmV0YSBjYWxjdWxhdGlvbnMKKworICAgIHBhZGR3ICAgICAgICAgICAgbTksIG0xMCwgbTExOyAgIDBkMCwgMGQzICAsICAxZDAsIDFkMworCisgICAgcHNodWZodyAgICAgICAgIG0xNCwgbTksIDB4MGYgOzBiMDAwMDExMTE7ICAwZDMgMGQzIDBkMCAwZDAgaW4gaGlnaAorICAgIHBzaHVmbHcgICAgICAgICBtMTQsIG0xNCwgMHgwZiA7MGIwMDAwMTExMTsgIDFkMyAxZDMgMWQwIDFkMCBpbiBsb3cKKworICAgIHBzaHVmaHcgICAgICAgICAgbTksIG05LCAweGYwIDswYjExMTEwMDAwOyAwZDAgMGQwIDBkMyAwZDMKKyAgICBwc2h1Zmx3ICAgICAgICAgIG05LCBtOSwgMHhmMCA7MGIxMTExMDAwMDsgMWQwIDFkMCAxZDMgMWQzCisKKyAgICBwYWRkdyAgICAgICAgICAgbTE0LCBtOTsgMGQwKzBkMywgMWQwKzFkMworCisgICAgO2NvbXBhcmUKKyAgICBwY21wZ3R3ICAgICAgICAgbTE1LCBtMTMsIG0xNAorICAgIG1vdm1za3BzICAgICAgICByMTMsIG0xNSA7ZmlsdGVyaW5nIG1hc2sgMGQwICsgMGQzIDwgYmV0YTAgKGJpdCAyIG9yIDMpICwgMWQwICsgMWQzIDwgYmV0YTEgKGJpdCAwIG9yIDEpCisgICAgdGVzdCAgICAgICAgICAgIHIxMywgcjEzCisgICAgamUgICAgICAgICAgICAgIC5ieXBhc3NsdW1hCisKKyAgICA7d2VhayAvIHN0cm9uZyBkZWNpc2lvbiBjb21wYXJlIHRvIGJldGFfMgorICAgIHBzcmF3ICAgICAgICAgICBtMTUsIG0xMywgMjsgICBiZXRhID4+IDIKKyAgICBwc2xsdyAgICAgICAgICAgIG04LCBtOSwgMTsKKyAgICBwY21wZ3R3ICAgICAgICAgbTE1LCBtODsgKGQwIDw8IDEpIDwgYmV0YV8yLCAoZDMgPDwgMSkgPCBiZXRhXzIKKyAgICBtb3Ztc2twcyAgICAgICAgcjYsIG0xNTsKKyAgICA7ZW5kIHdlYWsgLyBzdHJvbmcgZGVjaXNpb24KKworICAgIDsgd2VhayBmaWx0ZXIgbmRfcC9xIGNhbGN1bGF0aW9uCisgICAgcHNodWZkICAgICAgICAgICBtOCwgbTEwLCAweDMxCisgICAgcHNybGQgICAgICAgICAgICBtOCwgMTYKKyAgICBwYWRkdyAgICAgICAgICAgIG04LCBtMTAKKyAgICBtb3ZkICAgICAgICAgICAgcjdkLCBtOAorICAgIHBzaHVmZCAgICAgICAgICAgbTgsIG04LCAweDRFCisgICAgbW92ZCAgICAgICAgICAgIHI4ZCwgbTgKKworICAgIHBzaHVmZCAgICAgICAgICAgbTgsIG0xMSwgMHgzMQorICAgIHBzcmxkICAgICAgICAgICAgbTgsIDE2CisgICAgcGFkZHcgICAgICAgICAgICBtOCwgbTExCisgICAgbW92ZCAgICAgICAgICAgIHI5ZCwgbTgKKyAgICBwc2h1ZmQgICAgICAgICAgIG04LCBtOCwgMHg0RQorICAgIG1vdmQgICAgICAgICAgIHIxMGQsIG04CisgICAgOyBlbmQgY2FsYyBmb3Igd2VhayBmaWx0ZXIKKworICAgIDsgZmlsdGVyaW5nIG1hc2sKKyAgICBtb3YgICAgICAgICAgICAgcjExLCByMTMKKyAgICBzaHIgICAgICAgICAgICAgcjExLCAzCisgICAgbW92ZCAgICAgICAgICAgIG0xNSwgcjExZAorICAgIGFuZCAgICAgICAgICAgICByMTMsIDEKKyAgICBtb3ZkICAgICAgICAgICAgbTExLCByMTNkCisgICAgc2h1ZnBzICAgICAgICAgIG0xMSwgbTE1LCAwCisgICAgc2hsICAgICAgICAgICAgIHIxMSwgMQorICAgIG9yICAgICAgICAgICAgICByMTMsIHIxMQorCisgICAgcGNtcGVxZCAgICAgICAgIG0xMSwgW3BkXzFdOyBmaWx0ZXJpbmcgbWFzaworCisgICAgO2RlY2lkZSBiZXR3ZWVuIHN0cm9uZyBhbmQgd2VhayBmaWx0ZXJpbmcKKyAgICA7dGMyNSBjYWxjdWxhdGlvbnMKKyAgICBtb3YgICAgICAgICAgICByMTFkLCBbdGNxXTsKKyVpZiAlMSA+IDgKKyAgICBzaGwgICAgICAgICAgICAgcjExLCAlMSAtIDgKKyVlbmRpZgorICAgIG1vdmQgICAgICAgICAgICAgbTgsIHIxMWQ7IHRjMAorICAgIG1vdiAgICAgICAgICAgICByM2QsIFt0Y3ErNF07CislaWYgJTEgPiA4CisgICAgc2hsICAgICAgICAgICAgICByMywgJTEgLSA4CislZW5kaWYKKyAgICBhZGQgICAgICAgICAgICByMTFkLCByM2Q7IHRjMCArIHRjMQorICAgIGp6ICAgICAgICAgICAgIC5ieXBhc3NsdW1hCisgICAgbW92ZCAgICAgICAgICAgICBtOSwgcjNkOyB0YzEKKyAgICBwdW5wY2tsd2QgICAgICAgIG04LCBtOAorICAgIHB1bnBja2x3ZCAgICAgICAgbTksIG05CisgICAgc2h1ZnBzICAgICAgICAgICBtOCwgbTksIDA7IHRjMCwgdGMxCisgICAgbW92YSAgICAgICAgICAgICBtOSwgbTgKKyAgICBwc2xsdyAgICAgICAgICAgIG04LCAyOyB0YyA8PCAyCisgICAgcGF2Z3cgICAgICAgICAgICBtOCwgbTk7IHRjMjUgPSAoKHRjICogNSArIDEpID4+IDEpCisgICAgO2VuZCB0YzI1IGNhbGN1bGF0aW9ucworCisgICAgOy0tLS1iZXRhXzMgY29tcGFyaXNvbi0tLS0tCisgICAgcHN1YncgICAgICAgICAgIG0xMiwgbTAsIG0zOyAgICAgIHAzIC0gcDAKKyAgICBBQlMxICAgICAgICAgICAgbTEyLCBtMTQ7IGFicyhwMyAtIHAwKQorCisgICAgcHN1YncgICAgICAgICAgIG0xNSwgbTcsIG00OyAgICAgIHEzIC0gcTAKKyAgICBBQlMxICAgICAgICAgICAgbTE1LCBtMTQ7IGFicyhxMyAtIHEwKQorCisgICAgcGFkZHcgICAgICAgICAgIG0xMiwgbTE1OyBhYnMocDMgLSBwMCkgKyBhYnMocTMgLSBxMCkKKworICAgIHBzaHVmaHcgICAgICAgICBtMTIsIG0xMiwgMHhmMCA7MGIxMTExMDAwMDsKKyAgICBwc2h1Zmx3ICAgICAgICAgbTEyLCBtMTIsIDB4ZjAgOzBiMTExMTAwMDA7CisKKyAgICBwc3JhdyAgICAgICAgICAgbTEzLCAzOyBiZXRhID4+IDMKKyAgICBwY21wZ3R3ICAgICAgICAgbTEzLCBtMTI7CisgICAgbW92bXNrcHMgICAgICAgIHIxMSwgbTEzOworICAgIGFuZCAgICAgICAgICAgICByNiwgcjExOyBzdHJvbmcgbWFzayAsIGJldGFfMiBhbmQgYmV0YV8zIGNvbXBhcmlzb25zCisgICAgOy0tLS1iZXRhXzMgY29tcGFyaXNvbiBlbmQtLS0tLQorICAgIDstLS0tdGMyNSBjb21wYXJpc29uLS0tCisgICAgcHN1YncgICAgICAgICAgIG0xMiwgbTMsIG00OyAgICAgIHAwIC0gcTAKKyAgICBBQlMxICAgICAgICAgICAgbTEyLCBtMTQ7IGFicyhwMCAtIHEwKQorCisgICAgcHNodWZodyAgICAgICAgIG0xMiwgbTEyLCAweGYwIDswYjExMTEwMDAwOworICAgIHBzaHVmbHcgICAgICAgICBtMTIsIG0xMiwgMHhmMCA7MGIxMTExMDAwMDsKKworICAgIHBjbXBndHcgICAgICAgICAgbTgsIG0xMjsgdGMyNSBjb21wYXJpc29ucworICAgIG1vdm1za3BzICAgICAgICByMTEsIG04OworICAgIGFuZCAgICAgICAgICAgICByNiwgcjExOyBzdHJvbmcgbWFzaywgYmV0YV8yLCBiZXRhXzMgYW5kIHRjMjUgY29tcGFyaXNvbnMKKyAgICA7LS0tLXRjMjUgY29tcGFyaXNvbiBlbmQtLS0KKyAgICBtb3YgICAgICAgICAgICAgcjExLCByNjsKKyAgICBzaHIgICAgICAgICAgICAgcjExLCAxOworICAgIGFuZCAgICAgICAgICAgICByNiwgcjExOyBzdHJvbmcgbWFzaywgYml0cyAyIGFuZCAwCisKKyAgICBwbXVsbHcgICAgICAgICAgbTE0LCBtOSwgW3B3X20yXTsgLXRjICogMgorICAgIHBhZGR3ICAgICAgICAgICAgbTksIG05CisKKyAgICBhbmQgICAgICAgICAgICAgcjYsIDU7IDBiMTAxCisgICAgbW92ICAgICAgICAgICAgIHIxMSwgcjY7IHN0cm9uZyBtYXNrCisgICAgc2hyICAgICAgICAgICAgIHI2LCAyOworICAgIG1vdmQgICAgICAgICAgICBtMTIsIHI2ZDsgc3RvcmUgdG8geG1tIGZvciBtYXNrIGdlbmVyYXRpb24KKyAgICBzaGwgICAgICAgICAgICAgcjYsIDEKKyAgICBhbmQgICAgICAgICAgICAgcjExLCAxCisgICAgbW92ZCAgICAgICAgICAgIG0xMCwgcjExZDsgc3RvcmUgdG8geG1tIGZvciBtYXNrIGdlbmVyYXRpb24KKyAgICBvciAgICAgICAgICAgICAgcjYsIHIxMTsgZmluYWwgc3Ryb25nIG1hc2ssIGJpdHMgMSBhbmQgMAorICAgIGp6ICAgICAgLndlYWtmaWx0ZXIKKworICAgIHNodWZwcyAgICAgICAgICBtMTAsIG0xMiwgMAorICAgIHBjbXBlcWQgICAgICAgICBtMTAsIFtwZF8xXTsgc3Ryb25nIG1hc2sKKworICAgIG1vdmEgICAgICAgICAgICBtMTMsIFtwd180XTsgNCBpbiBldmVyeSBjZWxsCisgICAgcGFuZCAgICAgICAgICAgIG0xMSwgbTEwOyBjb21iaW5lIGZpbHRlcmluZyBtYXNrIGFuZCBzdHJvbmcgbWFzaworICAgIHBhZGR3ICAgICAgICAgICBtMTIsIG0yLCBtMzsgICAgICAgICAgcDEgKyAgIHAwCisgICAgcGFkZHcgICAgICAgICAgIG0xMiwgbTQ7ICAgICAgICAgIHAxICsgICBwMCArICAgcTAKKyAgICBtb3ZhICAgICAgICAgICAgbTEwLCBtMTI7IGNvcHkKKyAgICBwYWRkdyAgICAgICAgICAgbTEyLCBtMTI7ICAgICAgIDIqcDEgKyAyKnAwICsgMipxMAorICAgIHBhZGR3ICAgICAgICAgICBtMTIsIG0xOyAgIHAyICsgMipwMSArIDIqcDAgKyAyKnEwCisgICAgcGFkZHcgICAgICAgICAgIG0xMiwgbTU7ICAgcDIgKyAyKnAxICsgMipwMCArIDIqcTAgKyBxMQorICAgIHBhZGR3ICAgICAgICAgICBtMTIsIG0xMzsgIHAyICsgMipwMSArIDIqcDAgKyAyKnEwICsgcTEgKyA0CisgICAgcHNyYXcgICAgICAgICAgIG0xMiwgMzsgICgocDIgKyAyKnAxICsgMipwMCArIDIqcTAgKyBxMSArIDQpID4+IDMpCisgICAgcHN1YncgICAgICAgICAgIG0xMiwgbTM7ICgocDIgKyAyKnAxICsgMipwMCArIDIqcTAgKyBxMSArIDQpID4+IDMpIC0gcDAKKyAgICBwbWF4c3cgICAgICAgICAgbTEyLCBtMTQKKyAgICBwbWluc3cgICAgICAgICAgbTEyLCBtOTsgYXZfY2xpcCggLCAtMiAqIHRjLCAyICogdGMpCisgICAgcGFkZHcgICAgICAgICAgIG0xMiwgbTM7IHAwJworCisgICAgcGFkZHcgICAgICAgICAgIG0xNSwgbTEsIG0xMDsgcDIgKyBwMSArIHAwICsgcTAKKyAgICBwc3JsdyAgICAgICAgICAgbTEzLCAxOyAyIGluIGV2ZXJ5IGNlbGwKKyAgICBwYWRkdyAgICAgICAgICAgbTE1LCBtMTM7IHAyICsgcDEgKyBwMCArIHEwICsgMgorICAgIHBzcmF3ICAgICAgICAgICBtMTUsIDI7ICAocDIgKyBwMSArIHAwICsgcTAgKyAyKSA+PiAyCisgICAgcHN1YncgICAgICAgICAgIG0xNSwgbTI7KChwMiArIHAxICsgcDAgKyBxMCArIDIpID4+IDIpIC0gcDEKKyAgICBwbWF4c3cgICAgICAgICAgbTE1LCBtMTQKKyAgICBwbWluc3cgICAgICAgICAgbTE1LCBtOTsgYXZfY2xpcCggLCAtMiAqIHRjLCAyICogdGMpCisgICAgcGFkZHcgICAgICAgICAgIG0xNSwgbTI7IHAxJworCisgICAgcGFkZHcgICAgICAgICAgICBtOCwgbTEsIG0wOyAgICAgcDMgKyAgIHAyCisgICAgcGFkZHcgICAgICAgICAgICBtOCwgbTg7ICAgMipwMyArIDIqcDIKKyAgICBwYWRkdyAgICAgICAgICAgIG04LCBtMTsgICAyKnAzICsgMypwMgorICAgIHBhZGR3ICAgICAgICAgICAgbTgsIG0xMDsgIDIqcDMgKyAzKnAyICsgcDEgKyBwMCArIHEwCisgICAgcGFkZHcgICAgICAgICAgIG0xMywgbTEzCisgICAgcGFkZHcgICAgICAgICAgICBtOCwgbTEzOyAgMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0CisgICAgcHNyYXcgICAgICAgICAgICBtOCwgMzsgICAoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KSA+PiAzCisgICAgcHN1YncgICAgICAgICAgICBtOCwgbTE7ICgoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KSA+PiAzKSAtIHAyCisgICAgcG1heHN3ICAgICAgICAgICBtOCwgbTE0CisgICAgcG1pbnN3ICAgICAgICAgICBtOCwgbTk7IGF2X2NsaXAoICwgLTIgKiB0YywgMiAqIHRjKQorICAgIHBhZGR3ICAgICAgICAgICAgbTgsIG0xOyBwMicKKyAgICBNQVNLRURfQ09QWSAgICAgIG0xLCBtOAorCisgICAgcGFkZHcgICAgICAgICAgICBtOCwgbTMsIG00OyAgICAgICAgIHAwICsgICBxMAorICAgIHBhZGR3ICAgICAgICAgICAgbTgsIG01OyAgICAgICAgIHAwICsgICBxMCArICAgcTEKKyAgICBwYWRkdyAgICAgICAgICAgIG04LCBtODsgICAgICAgMipwMCArIDIqcTAgKyAyKnExCisgICAgcGFkZHcgICAgICAgICAgICBtOCwgbTI7ICBwMSArIDIqcDAgKyAyKnEwICsgMipxMQorICAgIHBhZGR3ICAgICAgICAgICAgbTgsIG02OyAgcDEgKyAyKnAwICsgMipxMCArIDIqcTEgKyBxMgorICAgIHBhZGR3ICAgICAgICAgICAgbTgsIG0xMzsgcDEgKyAyKnAwICsgMipxMCArIDIqcTEgKyBxMiArIDQKKyAgICBwc3JhdyAgICAgICAgICAgIG04LCAzOyAgKHAxICsgMipwMCArIDIqcTAgKyAyKnExICsgcTIgKyA0KSA+PjMKKyAgICBwc3VidyAgICAgICAgICAgIG04LCBtNDsKKyAgICBwbWF4c3cgICAgICAgICAgIG04LCBtMTQKKyAgICBwbWluc3cgICAgICAgICAgIG04LCBtOTsgYXZfY2xpcCggLCAtMiAqIHRjLCAyICogdGMpCisgICAgcGFkZHcgICAgICAgICAgICBtOCwgbTQ7IHEwJworICAgIE1BU0tFRF9DT1BZICAgICAgbTIsIG0xNQorCisgICAgcGFkZHcgICAgICAgICAgIG0xNSwgbTMsIG00OyAgIHAwICsgcTAKKyAgICBwYWRkdyAgICAgICAgICAgbTE1LCBtNTsgICBwMCArIHEwICsgcTEKKyAgICBtb3ZhICAgICAgICAgICAgbTEwLCBtMTU7CisgICAgcGFkZHcgICAgICAgICAgIG0xNSwgbTY7ICAgcDAgKyBxMCArIHExICsgcTIKKyAgICBwc3JsdyAgICAgICAgICAgbTEzLCAxOyAyIGluIGV2ZXJ5IGNlbGwKKyAgICBwYWRkdyAgICAgICAgICAgbTE1LCBtMTM7ICBwMCArIHEwICsgcTEgKyBxMiArIDIKKyAgICBwc3JhdyAgICAgICAgICAgbTE1LCAyOyAgIChwMCArIHEwICsgcTEgKyBxMiArIDIpID4+IDIKKyAgICBwc3VidyAgICAgICAgICAgbTE1LCBtNTsgKChwMCArIHEwICsgcTEgKyBxMiArIDIpID4+IDIpIC0gcTEKKyAgICBwbWF4c3cgICAgICAgICAgbTE1LCBtMTQKKyAgICBwbWluc3cgICAgICAgICAgbTE1LCBtOTsgYXZfY2xpcCggLCAtMiAqIHRjLCAyICogdGMpCisgICAgcGFkZHcgICAgICAgICAgIG0xNSwgbTU7IHExJworCisgICAgcGFkZHcgICAgICAgICAgIG0xMywgbTc7ICAgICAgcTMgKyAyCisgICAgcGFkZHcgICAgICAgICAgIG0xMywgbTY7ICAgICAgcTMgKyAgcTIgKyAyCisgICAgcGFkZHcgICAgICAgICAgIG0xMywgbTEzOyAgIDIqcTMgKyAyKnEyICsgNAorICAgIHBhZGR3ICAgICAgICAgICBtMTMsIG02OyAgICAyKnEzICsgMypxMiArIDQKKyAgICBwYWRkdyAgICAgICAgICAgbTEzLCBtMTA7ICAgMipxMyArIDMqcTIgKyBxMSArIHEwICsgcDAgKyA0CisgICAgcHNyYXcgICAgICAgICAgIG0xMywgMzsgICAgKDIqcTMgKyAzKnEyICsgcTEgKyBxMCArIHAwICsgNCkgPj4gMworICAgIHBzdWJ3ICAgICAgICAgICBtMTMsIG02OyAgKCgyKnEzICsgMypxMiArIHExICsgcTAgKyBwMCArIDQpID4+IDMpIC0gcTIKKyAgICBwbWF4c3cgICAgICAgICAgbTEzLCBtMTQKKyAgICBwbWluc3cgICAgICAgICAgbTEzLCBtOTsgYXZfY2xpcCggLCAtMiAqIHRjLCAyICogdGMpCisgICAgcGFkZHcgICAgICAgICAgIG0xMywgbTY7IHEyJworCisgICAgTUFTS0VEX0NPUFkgICAgICBtNiwgbTEzCisgICAgTUFTS0VEX0NPUFkgICAgICBtNSwgbTE1CisgICAgTUFTS0VEX0NPUFkgICAgICBtNCwgbTgKKyAgICBNQVNLRURfQ09QWSAgICAgIG0zLCBtMTIKKworLndlYWtmaWx0ZXI6CisgICAgbm90ICAgICAgICAgICAgIHI2OyBzdHJvbmcgbWFzayAtPiB3ZWFrIG1hc2sKKyAgICBhbmQgICAgICAgICAgICAgcjYsIHIxMzsgZmluYWwgd2VhayBmaWx0ZXJpbmcgbWFzaywgYml0cyAwIGFuZCAxCisgICAganogICAgICAgICAgICAgLnN0b3JlCisKKyAgICA7IHdlYWsgZmlsdGVyaW5nIG1hc2sKKyAgICBtb3YgICAgICAgICAgICAgcjExLCByNgorICAgIHNociAgICAgICAgICAgICByMTEsIDEKKyAgICBtb3ZkICAgICAgICAgICAgbTEyLCByMTFkCisgICAgYW5kICAgICAgICAgICAgIHI2LCAxCisgICAgbW92ZCAgICAgICAgICAgIG0xMSwgcjZkCisgICAgc2h1ZnBzICAgICAgICAgIG0xMSwgbTEyLCAwCisgICAgcGNtcGVxZCAgICAgICAgIG0xMSwgW3BkXzFdOyBmaWx0ZXJpbmcgbWFzaworCisgICAgbW92ICAgICAgICAgICAgIHIxMywgYmV0YXEKKyAgICBzaHIgICAgICAgICAgICAgcjEzLCAxOworICAgIGFkZCAgICAgICAgICAgICBiZXRhcSwgcjEzCisgICAgc2hyICAgICAgICAgICAgIGJldGFxLCAzOyAoKGJldGEgKyAoYmV0YSA+PiAxKSkgPj4gMykpCisKKyAgICBtb3ZhICAgICAgICAgICAgbTEzLCBbcHdfOF0KKyAgICBwc3VidyAgICAgICAgICAgbTEyLCBtNCwgbTMgOyBxMCAtIHAwCisgICAgcHNsbHcgICAgICAgICAgIG0xMCwgbTEyLCAzOyA4ICogKHEwIC0gcDApCisgICAgcGFkZHcgICAgICAgICAgIG0xMiwgbTEwIDsgOSAqIChxMCAtIHAwKQorCisgICAgcHN1YncgICAgICAgICAgIG0xMCwgbTUsIG0yIDsgcTEgLSBwMQorICAgIHBzbGx3ICAgICAgICAgICAgbTgsIG0xMCwgMTsgMiAqICggcTEgLSBwMSApCisgICAgcGFkZHcgICAgICAgICAgIG0xMCwgbTg7IDMgKiAoIHExIC0gcDEgKQorICAgIHBzdWJ3ICAgICAgICAgICBtMTIsIG0xMDsgOSAqIChxMCAtIHAwKSAtIDMgKiAoIHExIC0gcDEgKQorICAgIHBhZGR3ICAgICAgICAgICBtMTIsIG0xMzsgKyA4CisgICAgcHNyYXcgICAgICAgICAgIG0xMiwgNDsgPj4gNCAsIGRlbHRhMAorICAgIFBBQlNXICAgICAgICAgICBtMTMsIG0xMjsgYWJzKGRlbHRhMCkKKworCisgICAgcHNsbHcgICAgICAgICAgIG0xMCwgbTksIDI7IDggKiB0YworICAgIHBhZGR3ICAgICAgICAgICBtMTAsIG05OyAxMCAqIHRjCisgICAgcGNtcGd0dyAgICAgICAgIG0xMCwgbTEzCisgICAgcGFuZCAgICAgICAgICAgIG0xMSwgbTEwCisKKyAgICBwc3JhdyAgICAgICAgICAgIG05LCAxOyAgIHRjICogMiAtPiB0YworICAgIHBzcmF3ICAgICAgICAgICBtMTQsIDE7IC10YyAqIDIgLT4gLXRjCisKKyAgICBwbWF4c3cgICAgICAgICAgbTEyLCBtMTQKKyAgICBwbWluc3cgICAgICAgICAgbTEyLCBtOTsgIGF2X2NsaXAoZGVsdGEwLCAtdGMsIHRjKQorCisgICAgcHNyYXcgICAgICAgICAgICBtOSwgMTsgICB0YyAtPiB0YyAvIDIKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHBzaWdudyAgICAgICAgICBtMTQsIG05LCBbcHdfbTFdOyAtdGMgLyAyCislZWxzZQorICAgIHBtdWxsdyAgICAgICAgICBtMTQsIG05LCBbcHdfbTFdOyAtdGMgLyAyCislZW5kaWYKKworICAgIHBhdmd3ICAgICAgICAgICBtMTUsIG0xLCBtMzsgICAocDIgKyBwMCArIDEpID4+IDEKKyAgICBwc3VidyAgICAgICAgICAgbTE1LCBtMjsgICgocDIgKyBwMCArIDEpID4+IDEpIC0gcDEKKyAgICBwYWRkdyAgICAgICAgICAgbTE1LCBtMTI7ICgocDIgKyBwMCArIDEpID4+IDEpIC0gcDEgKyBkZWx0YTAKKyAgICBwc3JhdyAgICAgICAgICAgbTE1LCAxOyAgICgoKHAyICsgcDAgKyAxKSA+PiAxKSAtIHAxICsgZGVsdGEwKSA+PiAxCisgICAgcG1heHN3ICAgICAgICAgIG0xNSwgbTE0CisgICAgcG1pbnN3ICAgICAgICAgIG0xNSwgbTk7IGF2X2NsaXAoZGVsdGFwMSwgLXRjLzIsIHRjLzIpCisgICAgcGFkZHcgICAgICAgICAgIG0xNSwgbTI7IHAxJworCisgICAgO2JldGEgY2FsY3VsYXRpb25zCisgICAgbW92ZCAgICAgICAgICAgIG0xMCwgYmV0YWQKKyAgICBTUExBVFcgICAgICAgICAgbTEwLCBtMTAsIDAKKworICAgIG1vdmQgICAgICAgICAgICBtMTMsIHI3ZDsgMWRwMCArIDFkcDMKKyAgICBtb3ZkICAgICAgICAgICAgIG04LCByOGQ7IDBkcDAgKyAwZHAzCisgICAgcHVucGNrbHdkICAgICAgICBtOCwgbTgKKyAgICBwdW5wY2tsd2QgICAgICAgbTEzLCBtMTMKKyAgICBzaHVmcHMgICAgICAgICAgbTEzLCBtOCwgMDsKKyAgICBwY21wZ3R3ICAgICAgICAgIG04LCBtMTAsIG0xMworICAgIHBhbmQgICAgICAgICAgICAgbTgsIG0xMQorICAgIDtlbmQgYmV0YSBjYWxjdWxhdGlvbnMKKyAgICBNQVNLRURfQ09QWTIgICAgIG0yLCBtMTUsIG04OyB3cml0ZSBwMScKKworICAgIHBhdmd3ICAgICAgICAgICAgbTgsIG02LCBtNDsgICAocTIgKyBxMCArIDEpID4+IDEKKyAgICBwc3VidyAgICAgICAgICAgIG04LCBtNTsgICgocTIgKyBxMCArIDEpID4+IDEpIC0gcTEKKyAgICBwc3VidyAgICAgICAgICAgIG04LCBtMTI7ICgocTIgKyBxMCArIDEpID4+IDEpIC0gcTEgLSBkZWx0YTApCisgICAgcHNyYXcgICAgICAgICAgICBtOCwgMTsgICAoKHEyICsgcTAgKyAxKSA+PiAxKSAtIHExIC0gZGVsdGEwKSA+PiAxCisgICAgcG1heHN3ICAgICAgICAgICBtOCwgbTE0CisgICAgcG1pbnN3ICAgICAgICAgICBtOCwgbTk7IGF2X2NsaXAoZGVsdGFxMSwgLXRjLzIsIHRjLzIpCisgICAgcGFkZHcgICAgICAgICAgICBtOCwgbTU7IHExJworCisgICAgbW92ZCAgICAgICAgICAgIG0xMywgcjlkOworICAgIG1vdmQgICAgICAgICAgICBtMTUsIHIxMGQ7CisgICAgcHVucGNrbHdkICAgICAgIG0xNSwgbTE1CisgICAgcHVucGNrbHdkICAgICAgIG0xMywgbTEzCisgICAgc2h1ZnBzICAgICAgICAgIG0xMywgbTE1LCAwOyBkcTAgKyBkcTMKKworICAgIHBjbXBndHcgICAgICAgICBtMTAsIG0xMzsgY29tcGFyZSB0byAoKGJldGErKGJldGE+PjEpKT4+MykKKyAgICBwYW5kICAgICAgICAgICAgbTEwLCBtMTEKKyAgICBNQVNLRURfQ09QWTIgICAgIG01LCBtOCwgbTEwOyB3cml0ZSBxMScKKworICAgIHBhZGR3ICAgICAgICAgICBtMTUsIG0zLCBtMTIgOyBwMCArIGRlbHRhMAorICAgIE1BU0tFRF9DT1BZICAgICAgbTMsIG0xNQorCisgICAgcHN1YncgICAgICAgICAgICBtOCwgbTQsIG0xMiA7IHEwIC0gZGVsdGEwCisgICAgTUFTS0VEX0NPUFkgICAgICBtNCwgbTgKKyVlbmRtYWNybworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9oZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hKHVpbnQ4X3QgKl9waXgsIHB0cmRpZmZfdCBfc3RyaWRlLCBpbnQzMl90ICp0YywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9ub19wLCB1aW50OF90ICpfbm9fcSk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBMT09QX0ZJTFRFUl9DSFJPTUEgMAorY2dsb2JhbCBoZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hXzgsIDMsIDUsIDcsIHBpeCwgc3RyaWRlLCB0YywgcGl4MCwgcjNzdHJpZGUKKyAgICBzdWIgICAgICAgICAgICBwaXhxLCAyCisgICAgbGVhICAgICAgIHIzc3RyaWRlcSwgWzMqc3RyaWRlcV0KKyAgICBtb3YgICAgICAgICAgIHBpeDBxLCBwaXhxCisgICAgYWRkICAgICAgICAgICAgcGl4cSwgcjNzdHJpZGVxCisgICAgVFJBTlNQT1NFNHg4Ql9MT0FEICBQQVNTOFJPV1MocGl4MHEsIHBpeHEsIHN0cmlkZXEsIHIzc3RyaWRlcSkKKyAgICBDSFJPTUFfREVCTE9DS19CT0RZIDgKKyAgICBUUkFOU1BPU0U4eDRCX1NUT1JFIFBBU1M4Uk9XUyhwaXgwcSwgcGl4cSwgc3RyaWRlcSwgcjNzdHJpZGVxKQorICAgIFJFVAorCitjZ2xvYmFsIGhldmNfdl9sb29wX2ZpbHRlcl9jaHJvbWFfMTAsIDMsIDUsIDcsIHBpeCwgc3RyaWRlLCB0YywgcGl4MCwgcjNzdHJpZGUKKyAgICBzdWIgICAgICAgICAgICBwaXhxLCA0CisgICAgbGVhICAgICAgIHIzc3RyaWRlcSwgWzMqc3RyaWRlcV0KKyAgICBtb3YgICAgICAgICAgIHBpeDBxLCBwaXhxCisgICAgYWRkICAgICAgICAgICAgcGl4cSwgcjNzdHJpZGVxCisgICAgVFJBTlNQT1NFNHg4V19MT0FEICBQQVNTOFJPV1MocGl4MHEsIHBpeHEsIHN0cmlkZXEsIHIzc3RyaWRlcSkKKyAgICBDSFJPTUFfREVCTE9DS19CT0RZIDEwCisgICAgVFJBTlNQT1NFOHg0V19TVE9SRSBQQVNTOFJPV1MocGl4MHEsIHBpeHEsIHN0cmlkZXEsIHIzc3RyaWRlcSksIFtwd19waXhlbF9tYXhfMTBdCisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y192X2xvb3BfZmlsdGVyX2Nocm9tYV8xMiwgMywgNSwgNywgcGl4LCBzdHJpZGUsIHRjLCBwaXgwLCByM3N0cmlkZQorICAgIHN1YiAgICAgICAgICAgIHBpeHEsIDQKKyAgICBsZWEgICAgICAgcjNzdHJpZGVxLCBbMypzdHJpZGVxXQorICAgIG1vdiAgICAgICAgICAgcGl4MHEsIHBpeHEKKyAgICBhZGQgICAgICAgICAgICBwaXhxLCByM3N0cmlkZXEKKyAgICBUUkFOU1BPU0U0eDhXX0xPQUQgIFBBU1M4Uk9XUyhwaXgwcSwgcGl4cSwgc3RyaWRlcSwgcjNzdHJpZGVxKQorICAgIENIUk9NQV9ERUJMT0NLX0JPRFkgMTIKKyAgICBUUkFOU1BPU0U4eDRXX1NUT1JFIFBBU1M4Uk9XUyhwaXgwcSwgcGl4cSwgc3RyaWRlcSwgcjNzdHJpZGVxKSwgW3B3X3BpeGVsX21heF8xMl0KKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2Nocm9tYSh1aW50OF90ICpfcGl4LCBwdHJkaWZmX3QgX3N0cmlkZSwgaW50MzJfdCAqdGMsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpfbm9fcCwgdWludDhfdCAqX25vX3EpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjZ2xvYmFsIGhldmNfaF9sb29wX2ZpbHRlcl9jaHJvbWFfOCwgMywgNCwgNywgcGl4LCBzdHJpZGUsIHRjLCBwaXgwCisgICAgbW92ICAgICAgICAgICBwaXgwcSwgcGl4cQorICAgIHN1YiAgICAgICAgICAgcGl4MHEsIHN0cmlkZXEKKyAgICBzdWIgICAgICAgICAgIHBpeDBxLCBzdHJpZGVxCisgICAgbW92cSAgICAgICAgICAgICBtMCwgW3BpeDBxXTsgICAgcDEKKyAgICBtb3ZxICAgICAgICAgICAgIG0xLCBbcGl4MHErc3RyaWRlcV07IHAwCisgICAgbW92cSAgICAgICAgICAgICBtMiwgW3BpeHFdOyAgICBxMAorICAgIG1vdnEgICAgICAgICAgICAgbTMsIFtwaXhxK3N0cmlkZXFdOyBxMQorICAgIHB4b3IgICAgICAgICAgICAgbTUsIG01OyB6ZXJvcyByZWcKKyAgICBwdW5wY2tsYncgICAgICAgIG0wLCBtNQorICAgIHB1bnBja2xidyAgICAgICAgbTEsIG01CisgICAgcHVucGNrbGJ3ICAgICAgICBtMiwgbTUKKyAgICBwdW5wY2tsYncgICAgICAgIG0zLCBtNQorICAgIENIUk9NQV9ERUJMT0NLX0JPRFkgIDgKKyAgICBwYWNrdXN3YiAgICAgICAgIG0xLCBtMgorICAgIG1vdmhbcGl4MHErc3RyaWRlcV0sIG0xCisgICAgbW92aHBzICAgICAgIFtwaXhxXSwgbTEKKyAgICBSRVQKKworY2dsb2JhbCBoZXZjX2hfbG9vcF9maWx0ZXJfY2hyb21hXzEwLCAzLCA0LCA3LCBwaXgsIHN0cmlkZSwgdGMsIHBpeDAKKyAgICBtb3YgICAgICAgICAgcGl4MHEsIHBpeHEKKyAgICBzdWIgICAgICAgICAgcGl4MHEsIHN0cmlkZXEKKyAgICBzdWIgICAgICAgICAgcGl4MHEsIHN0cmlkZXEKKyAgICBtb3Z1ICAgICAgICAgICAgbTAsIFtwaXgwcV07ICAgIHAxCisgICAgbW92dSAgICAgICAgICAgIG0xLCBbcGl4MHErc3RyaWRlcV07IHAwCisgICAgbW92dSAgICAgICAgICAgIG0yLCBbcGl4cV07ICAgIHEwCisgICAgbW92dSAgICAgICAgICAgIG0zLCBbcGl4cStzdHJpZGVxXTsgcTEKKyAgICBDSFJPTUFfREVCTE9DS19CT0RZIDEwCisgICAgcHhvciAgICAgICAgICAgIG01LCBtNTsgemVyb3MgcmVnCisgICAgQ0xJUFcgICAgICAgICAgIG0xLCBtNSwgW3B3X3BpeGVsX21heF8xMF0KKyAgICBDTElQVyAgICAgICAgICAgbTIsIG01LCBbcHdfcGl4ZWxfbWF4XzEwXQorICAgIG1vdnUgW3BpeDBxK3N0cmlkZXFdLCBtMQorICAgIG1vdnUgICAgICAgIFtwaXhxXSwgbTIKKyAgICBSRVQKKworY2dsb2JhbCBoZXZjX2hfbG9vcF9maWx0ZXJfY2hyb21hXzEyLCAzLCA0LCA3LCBwaXgsIHN0cmlkZSwgdGMsIHBpeDAKKyAgICBtb3YgICAgICAgICAgcGl4MHEsIHBpeHEKKyAgICBzdWIgICAgICAgICAgcGl4MHEsIHN0cmlkZXEKKyAgICBzdWIgICAgICAgICAgcGl4MHEsIHN0cmlkZXEKKyAgICBtb3Z1ICAgICAgICAgICAgbTAsIFtwaXgwcV07ICAgIHAxCisgICAgbW92dSAgICAgICAgICAgIG0xLCBbcGl4MHErc3RyaWRlcV07IHAwCisgICAgbW92dSAgICAgICAgICAgIG0yLCBbcGl4cV07ICAgIHEwCisgICAgbW92dSAgICAgICAgICAgIG0zLCBbcGl4cStzdHJpZGVxXTsgcTEKKyAgICBDSFJPTUFfREVCTE9DS19CT0RZIDEyCisgICAgcHhvciAgICAgICAgICAgIG01LCBtNTsgemVyb3MgcmVnCisgICAgQ0xJUFcgICAgICAgICAgIG0xLCBtNSwgW3B3X3BpeGVsX21heF8xMl0KKyAgICBDTElQVyAgICAgICAgICAgbTIsIG01LCBbcHdfcGl4ZWxfbWF4XzEyXQorICAgIG1vdnUgW3BpeDBxK3N0cmlkZXFdLCBtMQorICAgIG1vdnUgICAgICAgIFtwaXhxXSwgbTIKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitMT09QX0ZJTFRFUl9DSFJPTUEKK0lOSVRfWE1NIGF2eAorTE9PUF9GSUxURVJfQ0hST01BCisKKyVpZiBBUkNIX1g4Nl82NAorJW1hY3JvIExPT1BfRklMVEVSX0xVTUEgMAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaGV2Y192X2xvb3BfZmlsdGVyX2x1bWEodWludDhfdCAqX3BpeCwgcHRyZGlmZl90IF9zdHJpZGUsIGludCBiZXRhLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnRjLCB1aW50OF90ICpfbm9fcCwgdWludDhfdCAqX25vX3EpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjZ2xvYmFsIGhldmNfdl9sb29wX2ZpbHRlcl9sdW1hXzgsIDQsIDE0LCAxNiwgcGl4LCBzdHJpZGUsIGJldGEsIHRjLCBwaXgwLCBzcmMzc3RyaWRlCisgICAgc3ViICAgICAgICAgICAgcGl4cSwgNAorICAgIGxlYSAgICAgICAgICAgcGl4MHEsIFszICogcjFdCisgICAgbW92ICAgICBzcmMzc3RyaWRlcSwgcGl4cQorICAgIGFkZCAgICAgICAgICAgIHBpeHEsIHBpeDBxCisgICAgVFJBTlNQT1NFOHg4Ql9MT0FEICBQQVNTOFJPV1Moc3JjM3N0cmlkZXEsIHBpeHEsIHIxLCBwaXgwcSkKKyAgICBMVU1BX0RFQkxPQ0tfQk9EWSA4LCB2Cisuc3RvcmU6CisgICAgVFJBTlNQT1NFOHg4Ql9TVE9SRSBQQVNTOFJPV1Moc3JjM3N0cmlkZXEsIHBpeHEsIHIxLCBwaXgwcSkKKy5ieXBhc3NsdW1hOgorICAgIFJFVAorCitjZ2xvYmFsIGhldmNfdl9sb29wX2ZpbHRlcl9sdW1hXzEwLCA0LCAxNCwgMTYsIHBpeCwgc3RyaWRlLCBiZXRhLCB0YywgcGl4MCwgc3JjM3N0cmlkZQorICAgIHN1YiAgICAgICAgICAgIHBpeHEsIDgKKyAgICBsZWEgICAgICAgICAgIHBpeDBxLCBbMyAqIHN0cmlkZXFdCisgICAgbW92ICAgICBzcmMzc3RyaWRlcSwgcGl4cQorICAgIGFkZCAgICAgICAgICAgIHBpeHEsIHBpeDBxCisgICAgVFJBTlNQT1NFOHg4V19MT0FEICBQQVNTOFJPV1Moc3JjM3N0cmlkZXEsIHBpeHEsIHN0cmlkZXEsIHBpeDBxKQorICAgIExVTUFfREVCTE9DS19CT0RZIDEwLCB2Cisuc3RvcmU6CisgICAgVFJBTlNQT1NFOHg4V19TVE9SRSBQQVNTOFJPV1Moc3JjM3N0cmlkZXEsIHBpeHEsIHIxLCBwaXgwcSksIFtwd19waXhlbF9tYXhfMTBdCisuYnlwYXNzbHVtYToKKyAgICBSRVQKKworY2dsb2JhbCBoZXZjX3ZfbG9vcF9maWx0ZXJfbHVtYV8xMiwgNCwgMTQsIDE2LCBwaXgsIHN0cmlkZSwgYmV0YSwgdGMsIHBpeDAsIHNyYzNzdHJpZGUKKyAgICBzdWIgICAgICAgICAgICBwaXhxLCA4CisgICAgbGVhICAgICAgICAgICBwaXgwcSwgWzMgKiBzdHJpZGVxXQorICAgIG1vdiAgICAgc3JjM3N0cmlkZXEsIHBpeHEKKyAgICBhZGQgICAgICAgICAgICBwaXhxLCBwaXgwcQorICAgIFRSQU5TUE9TRTh4OFdfTE9BRCAgUEFTUzhST1dTKHNyYzNzdHJpZGVxLCBwaXhxLCBzdHJpZGVxLCBwaXgwcSkKKyAgICBMVU1BX0RFQkxPQ0tfQk9EWSAxMiwgdgorLnN0b3JlOgorICAgIFRSQU5TUE9TRTh4OFdfU1RPUkUgUEFTUzhST1dTKHNyYzNzdHJpZGVxLCBwaXhxLCByMSwgcGl4MHEpLCBbcHdfcGl4ZWxfbWF4XzEyXQorLmJ5cGFzc2x1bWE6CisgICAgUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2hldmNfaF9sb29wX2ZpbHRlcl9sdW1hKHVpbnQ4X3QgKl9waXgsIHB0cmRpZmZfdCBfc3RyaWRlLCBpbnQgYmV0YSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICp0YywgdWludDhfdCAqX25vX3AsIHVpbnQ4X3QgKl9ub19xKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2dsb2JhbCBoZXZjX2hfbG9vcF9maWx0ZXJfbHVtYV84LCA0LCAxNCwgMTYsIHBpeCwgc3RyaWRlLCBiZXRhLCB0YywgcGl4MCwgc3JjM3N0cmlkZQorICAgIGxlYSAgICAgc3JjM3N0cmlkZXEsIFszICogc3RyaWRlcV0KKyAgICBtb3YgICAgICAgICAgIHBpeDBxLCBwaXhxCisgICAgc3ViICAgICAgICAgICBwaXgwcSwgc3JjM3N0cmlkZXEKKyAgICBzdWIgICAgICAgICAgIHBpeDBxLCBzdHJpZGVxCisgICAgbW92cSAgICAgICAgICAgICBtMCwgW3BpeDBxXTsgICAgICAgICAgICAgICBwMworICAgIG1vdnEgICAgICAgICAgICAgbTEsIFtwaXgwcSArICAgICBzdHJpZGVxXTsgcDIKKyAgICBtb3ZxICAgICAgICAgICAgIG0yLCBbcGl4MHEgKyAyICogc3RyaWRlcV07IHAxCisgICAgbW92cSAgICAgICAgICAgICBtMywgW3BpeDBxICsgc3JjM3N0cmlkZXFdOyBwMAorICAgIG1vdnEgICAgICAgICAgICAgbTQsIFtwaXhxXTsgICAgICAgICAgICAgICAgcTAKKyAgICBtb3ZxICAgICAgICAgICAgIG01LCBbcGl4cSArICAgICBzdHJpZGVxXTsgIHExCisgICAgbW92cSAgICAgICAgICAgICBtNiwgW3BpeHEgKyAyICogc3RyaWRlcV07ICBxMgorICAgIG1vdnEgICAgICAgICAgICAgbTcsIFtwaXhxICsgc3JjM3N0cmlkZXFdOyAgcTMKKyAgICBweG9yICAgICAgICAgICAgIG04LCBtOAorICAgIHB1bnBja2xidyAgICAgICAgbTAsIG04CisgICAgcHVucGNrbGJ3ICAgICAgICBtMSwgbTgKKyAgICBwdW5wY2tsYncgICAgICAgIG0yLCBtOAorICAgIHB1bnBja2xidyAgICAgICAgbTMsIG04CisgICAgcHVucGNrbGJ3ICAgICAgICBtNCwgbTgKKyAgICBwdW5wY2tsYncgICAgICAgIG01LCBtOAorICAgIHB1bnBja2xidyAgICAgICAgbTYsIG04CisgICAgcHVucGNrbGJ3ICAgICAgICBtNywgbTgKKyAgICBMVU1BX0RFQkxPQ0tfQk9EWSA4LCBoCisuc3RvcmU6CisgICAgcGFja3Vzd2IgICAgICAgICAgbTEsIG0yCisgICAgcGFja3Vzd2IgICAgICAgICAgbTMsIG00CisgICAgcGFja3Vzd2IgICAgICAgICAgbTUsIG02CisgICAgbW92aCAgIFtwaXgwcSArICAgICBzdHJpZGVxXSwgbTEKKyAgICBtb3ZocHMgW3BpeDBxICsgMiAqIHN0cmlkZXFdLCBtMQorICAgIG1vdmggICBbcGl4MHEgKyBzcmMzc3RyaWRlcV0sIG0zCisgICAgbW92aHBzIFtwaXhxICAgICAgICAgICAgICAgXSwgbTMKKyAgICBtb3ZoICAgW3BpeHEgICsgICAgIHN0cmlkZXFdLCBtNQorICAgIG1vdmhwcyBbcGl4cSAgKyAyICogc3RyaWRlcV0sIG01CisuYnlwYXNzbHVtYToKKyAgICBSRVQKKworY2dsb2JhbCBoZXZjX2hfbG9vcF9maWx0ZXJfbHVtYV8xMCwgNCwgMTQsIDE2LCBwaXgsIHN0cmlkZSwgYmV0YSwgdGMsIHBpeDAsIHNyYzNzdHJpZGUKKyAgICBsZWEgICAgICAgICAgICAgICAgICBzcmMzc3RyaWRlcSwgWzMgKiBzdHJpZGVxXQorICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgIHBpeDBxLCBwaXhxCisgICAgc3ViICAgICAgICAgICAgICAgICAgICAgICAgcGl4MHEsIHNyYzNzdHJpZGVxCisgICAgc3ViICAgICAgICAgICAgICAgICAgICAgICAgcGl4MHEsIHN0cmlkZXEKKyAgICBtb3ZkcXUgICAgICAgICAgICAgICAgICAgICAgICBtMCwgW3BpeDBxXTsgICAgICAgICAgICAgICBwMworICAgIG1vdmRxdSAgICAgICAgICAgICAgICAgICAgICAgIG0xLCBbcGl4MHEgKyAgICAgc3RyaWRlcV07IHAyCisgICAgbW92ZHF1ICAgICAgICAgICAgICAgICAgICAgICAgbTIsIFtwaXgwcSArIDIgKiBzdHJpZGVxXTsgcDEKKyAgICBtb3ZkcXUgICAgICAgICAgICAgICAgICAgICAgICBtMywgW3BpeDBxICsgc3JjM3N0cmlkZXFdOyBwMAorICAgIG1vdmRxdSAgICAgICAgICAgICAgICAgICAgICAgIG00LCBbcGl4cV07ICAgICAgICAgICAgICAgIHEwCisgICAgbW92ZHF1ICAgICAgICAgICAgICAgICAgICAgICAgbTUsIFtwaXhxICArICAgICBzdHJpZGVxXTsgcTEKKyAgICBtb3ZkcXUgICAgICAgICAgICAgICAgICAgICAgICBtNiwgW3BpeHEgICsgMiAqIHN0cmlkZXFdOyBxMgorICAgIG1vdmRxdSAgICAgICAgICAgICAgICAgICAgICAgIG03LCBbcGl4cSAgKyBzcmMzc3RyaWRlcV07IHEzCisgICAgTFVNQV9ERUJMT0NLX0JPRFkgICAgICAgICAgICAgMTAsIGgKKy5zdG9yZToKKyAgICBweG9yICAgICAgICAgICAgICAgICAgICAgICAgICBtOCwgbTg7IHplcm9zIHJlZworICAgIENMSVBXICAgICAgICAgICAgICAgICAgICAgICAgIG0xLCBtOCwgW3B3X3BpeGVsX21heF8xMF0KKyAgICBDTElQVyAgICAgICAgICAgICAgICAgICAgICAgICBtMiwgbTgsIFtwd19waXhlbF9tYXhfMTBdCisgICAgQ0xJUFcgICAgICAgICAgICAgICAgICAgICAgICAgbTMsIG04LCBbcHdfcGl4ZWxfbWF4XzEwXQorICAgIENMSVBXICAgICAgICAgICAgICAgICAgICAgICAgIG00LCBtOCwgW3B3X3BpeGVsX21heF8xMF0KKyAgICBDTElQVyAgICAgICAgICAgICAgICAgICAgICAgICBtNSwgbTgsIFtwd19waXhlbF9tYXhfMTBdCisgICAgQ0xJUFcgICAgICAgICAgICAgICAgICAgICAgICAgbTYsIG04LCBbcHdfcGl4ZWxfbWF4XzEwXQorICAgIG1vdmRxdSAgICAgW3BpeDBxICsgICAgIHN0cmlkZXFdLCBtMTsgIHAyCisgICAgbW92ZHF1ICAgICBbcGl4MHEgKyAyICogc3RyaWRlcV0sIG0yOyAgcDEKKyAgICBtb3ZkcXUgICAgIFtwaXgwcSArIHNyYzNzdHJpZGVxXSwgbTM7ICBwMAorICAgIG1vdmRxdSAgICAgW3BpeHEgICAgICAgICAgICAgICBdLCBtNDsgIHEwCisgICAgbW92ZHF1ICAgICBbcGl4cSAgKyAgICAgc3RyaWRlcV0sIG01OyAgcTEKKyAgICBtb3ZkcXUgICAgIFtwaXhxICArIDIgKiBzdHJpZGVxXSwgbTY7ICBxMgorLmJ5cGFzc2x1bWE6CisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y19oX2xvb3BfZmlsdGVyX2x1bWFfMTIsIDQsIDE0LCAxNiwgcGl4LCBzdHJpZGUsIGJldGEsIHRjLCBwaXgwLCBzcmMzc3RyaWRlCisgICAgbGVhICAgICAgICAgICAgICAgICAgc3JjM3N0cmlkZXEsIFszICogc3RyaWRlcV0KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICBwaXgwcSwgcGl4cQorICAgIHN1YiAgICAgICAgICAgICAgICAgICAgICAgIHBpeDBxLCBzcmMzc3RyaWRlcQorICAgIHN1YiAgICAgICAgICAgICAgICAgICAgICAgIHBpeDBxLCBzdHJpZGVxCisgICAgbW92ZHF1ICAgICAgICAgICAgICAgICAgICAgICAgbTAsIFtwaXgwcV07ICAgICAgICAgICAgICAgcDMKKyAgICBtb3ZkcXUgICAgICAgICAgICAgICAgICAgICAgICBtMSwgW3BpeDBxICsgICAgIHN0cmlkZXFdOyBwMgorICAgIG1vdmRxdSAgICAgICAgICAgICAgICAgICAgICAgIG0yLCBbcGl4MHEgKyAyICogc3RyaWRlcV07IHAxCisgICAgbW92ZHF1ICAgICAgICAgICAgICAgICAgICAgICAgbTMsIFtwaXgwcSArIHNyYzNzdHJpZGVxXTsgcDAKKyAgICBtb3ZkcXUgICAgICAgICAgICAgICAgICAgICAgICBtNCwgW3BpeHFdOyAgICAgICAgICAgICAgICBxMAorICAgIG1vdmRxdSAgICAgICAgICAgICAgICAgICAgICAgIG01LCBbcGl4cSAgKyAgICAgc3RyaWRlcV07IHExCisgICAgbW92ZHF1ICAgICAgICAgICAgICAgICAgICAgICAgbTYsIFtwaXhxICArIDIgKiBzdHJpZGVxXTsgcTIKKyAgICBtb3ZkcXUgICAgICAgICAgICAgICAgICAgICAgICBtNywgW3BpeHEgICsgc3JjM3N0cmlkZXFdOyBxMworICAgIExVTUFfREVCTE9DS19CT0RZICAgICAgICAgICAgIDEyLCBoCisuc3RvcmU6CisgICAgcHhvciAgICAgICAgICAgICAgICAgICAgICAgICAgbTgsIG04OyB6ZXJvcyByZWcKKyAgICBDTElQVyAgICAgICAgICAgICAgICAgICAgICAgICBtMSwgbTgsIFtwd19waXhlbF9tYXhfMTJdCisgICAgQ0xJUFcgICAgICAgICAgICAgICAgICAgICAgICAgbTIsIG04LCBbcHdfcGl4ZWxfbWF4XzEyXQorICAgIENMSVBXICAgICAgICAgICAgICAgICAgICAgICAgIG0zLCBtOCwgW3B3X3BpeGVsX21heF8xMl0KKyAgICBDTElQVyAgICAgICAgICAgICAgICAgICAgICAgICBtNCwgbTgsIFtwd19waXhlbF9tYXhfMTJdCisgICAgQ0xJUFcgICAgICAgICAgICAgICAgICAgICAgICAgbTUsIG04LCBbcHdfcGl4ZWxfbWF4XzEyXQorICAgIENMSVBXICAgICAgICAgICAgICAgICAgICAgICAgIG02LCBtOCwgW3B3X3BpeGVsX21heF8xMl0KKyAgICBtb3ZkcXUgICAgIFtwaXgwcSArICAgICBzdHJpZGVxXSwgbTE7ICBwMgorICAgIG1vdmRxdSAgICAgW3BpeDBxICsgMiAqIHN0cmlkZXFdLCBtMjsgIHAxCisgICAgbW92ZHF1ICAgICBbcGl4MHEgKyBzcmMzc3RyaWRlcV0sIG0zOyAgcDAKKyAgICBtb3ZkcXUgICAgIFtwaXhxICAgICAgICAgICAgICAgXSwgbTQ7ICBxMAorICAgIG1vdmRxdSAgICAgW3BpeHEgICsgICAgIHN0cmlkZXFdLCBtNTsgIHExCisgICAgbW92ZHF1ICAgICBbcGl4cSAgKyAyICogc3RyaWRlcV0sIG02OyAgcTIKKy5ieXBhc3NsdW1hOgorICAgIFJFVAorCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorTE9PUF9GSUxURVJfTFVNQQorSU5JVF9YTU0gc3NzZTMKK0xPT1BfRklMVEVSX0xVTUEKK0lOSVRfWE1NIGF2eAorTE9PUF9GSUxURVJfTFVNQQorJWVuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvaGV2Y19pZGN0LmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oZXZjX2lkY3QuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MTcyNmQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaGV2Y19pZGN0LmFzbQpAQCAtMCwwICsxLDEyMiBAQAorOyAvKgorOyAqIFNJTUQgb3B0aW1pemVkIGlkY3QgZnVuY3Rpb25zIGZvciBIRVZDIGRlY29kaW5nCis7ICogQ29weXJpZ2h0IChjKSAyMDE0IFBpZXJyZS1FZG91YXJkIExFUEVSRQorOyAqIENvcHlyaWdodCAoYykgMjAxNCBKYW1lcyBBbG1lcgorOyAqCis7ICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyAqCis7ICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsgKgorOyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyAqCis7ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7ICovCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9URVhUIDMyCisKKzsgdm9pZCBmZl9oZXZjX2lkY3RIeFdfZGNfezgsMTB9XzxvcHQ+KGludDE2X3QgKmNvZWZmcykKKzsgJTEgPSBIeFcKKzsgJTIgPSBudW1iZXIgb2YgbG9vcHMKKzsgJTMgPSBiaXRkZXB0aAorJW1hY3JvIElEQ1RfREMgMworY2dsb2JhbCBoZXZjX2lkY3QlMXglMV9kY18lMywgMSwgMiwgMSwgY29lZmYsIHRtcAorICAgIG1vdnN4ICAgICAgICAgICAgIHRtcHEsIHdvcmQgW2NvZWZmcV0KKyAgICBhZGQgICAgICAgICAgICAgICB0bXB3LCAoKDEgPDwgMTQtJTMpICsgMSkKKyAgICBzYXIgICAgICAgICAgICAgICB0bXB3LCAoMTUtJTMpCisgICAgbW92ZCAgICAgICAgICAgICAgIHhtMCwgdG1wZAorICAgIFNQTEFUVyAgICAgICAgICAgICAgbTAsIHhtMAorICAgIERFRklORV9BUkdTIGNvZWZmLCBjbnQKKyAgICBtb3YgICAgICAgICAgICAgICBjbnRkLCAlMgorLmxvb3A6CisgICAgbW92YSBbY29lZmZxK21tc2l6ZSowXSwgbTAKKyAgICBtb3ZhIFtjb2VmZnErbW1zaXplKjFdLCBtMAorICAgIG1vdmEgW2NvZWZmcSttbXNpemUqMl0sIG0wCisgICAgbW92YSBbY29lZmZxK21tc2l6ZSozXSwgbTAKKyAgICBtb3ZhIFtjb2VmZnErbW1zaXplKjRdLCBtMAorICAgIG1vdmEgW2NvZWZmcSttbXNpemUqNV0sIG0wCisgICAgbW92YSBbY29lZmZxK21tc2l6ZSo2XSwgbTAKKyAgICBtb3ZhIFtjb2VmZnErbW1zaXplKjddLCBtMAorICAgIGFkZCAgY29lZmZxLCBtbXNpemUqOAorICAgIGRlYyAgY250ZAorICAgIGpnICAubG9vcAorICAgIFJFVAorJWVuZG1hY3JvCisKKzsgJTEgPSBIeFcKKzsgJTIgPSBiaXRkZXB0aAorJW1hY3JvIElEQ1RfRENfTkwgMiA7IE5vIGxvb3AKK2NnbG9iYWwgaGV2Y19pZGN0JTF4JTFfZGNfJTIsIDEsIDIsIDEsIGNvZWZmLCB0bXAKKyAgICBtb3ZzeCAgICAgICAgICAgICB0bXBxLCB3b3JkIFtjb2VmZnFdCisgICAgYWRkICAgICAgICAgICAgICAgdG1wdywgKCgxIDw8IDE0LSUyKSArIDEpCisgICAgc2FyICAgICAgICAgICAgICAgdG1wdywgKDE1LSUyKQorICAgIG1vdmQgICAgICAgICAgICAgICAgbTAsIHRtcGQKKyAgICBTUExBVFcgICAgICAgICAgICAgIG0wLCB4bTAKKyAgICBtb3ZhIFtjb2VmZnErbW1zaXplKjBdLCBtMAorICAgIG1vdmEgW2NvZWZmcSttbXNpemUqMV0sIG0wCisgICAgbW92YSBbY29lZmZxK21tc2l6ZSoyXSwgbTAKKyAgICBtb3ZhIFtjb2VmZnErbW1zaXplKjNdLCBtMAorJWlmIG1tc2l6ZSA9PSAxNgorICAgIG1vdmEgW2NvZWZmcSttbXNpemUqNF0sIG0wCisgICAgbW92YSBbY29lZmZxK21tc2l6ZSo1XSwgbTAKKyAgICBtb3ZhIFtjb2VmZnErbW1zaXplKjZdLCBtMAorICAgIG1vdmEgW2NvZWZmcSttbXNpemUqN10sIG0wCislZW5kaWYKKyAgICBSRVQKKyVlbmRtYWNybworCis7IDgtYml0CitJTklUX01NWCBtbXhleHQKK0lEQ1RfRENfTkwgIDQsICAgICAgOAorSURDVF9EQyAgICAgOCwgIDIsICA4CisKK0lOSVRfWE1NIHNzZTIKK0lEQ1RfRENfTkwgIDgsICAgICAgOAorSURDVF9EQyAgICAxNiwgIDQsICA4CitJRENUX0RDICAgIDMyLCAxNiwgIDgKKworJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4MgorSURDVF9EQyAgICAxNiwgIDIsICA4CitJRENUX0RDICAgIDMyLCAgOCwgIDgKKyVlbmRpZiA7SEFWRV9BVlgyX0VYVEVSTkFMCisKKzsgMTAtYml0CitJTklUX01NWCBtbXhleHQKK0lEQ1RfRENfTkwgIDQsICAgICAxMAorSURDVF9EQyAgICAgOCwgIDIsIDEwCisKK0lOSVRfWE1NIHNzZTIKK0lEQ1RfRENfTkwgIDgsICAgICAxMAorSURDVF9EQyAgICAxNiwgIDQsIDEwCitJRENUX0RDICAgIDMyLCAxNiwgMTAKKworJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4MgorSURDVF9EQyAgICAxNiwgIDIsIDEwCitJRENUX0RDICAgIDMyLCAgOCwgMTAKKyVlbmRpZiA7SEFWRV9BVlgyX0VYVEVSTkFMCisKKzsgMTItYml0CitJTklUX01NWCBtbXhleHQKK0lEQ1RfRENfTkwgIDQsICAgICAxMgorSURDVF9EQyAgICAgOCwgIDIsIDEyCisKK0lOSVRfWE1NIHNzZTIKK0lEQ1RfRENfTkwgIDgsICAgICAxMgorSURDVF9EQyAgICAxNiwgIDQsIDEyCitJRENUX0RDICAgIDMyLCAxNiwgMTIKKworJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4MgorSURDVF9EQyAgICAxNiwgIDIsIDEyCitJRENUX0RDICAgIDMyLCAgOCwgMTIKKyVlbmRpZiA7SEFWRV9BVlgyX0VYVEVSTkFMCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvaGV2Y19tYy5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaGV2Y19tYy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhMDcwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oZXZjX21jLmFzbQpAQCAtMCwwICsxLDEzODUgQEAKKzsgLyoKKzsgKiBQcm92aWRlIFNTRSBsdW1hIGFuZCBjaHJvbWEgbWMgZnVuY3Rpb25zIGZvciBIRVZDIGRlY29kaW5nCis7ICogQ29weXJpZ2h0IChjKSAyMDEzIFBpZXJyZS1FZG91YXJkIExFUEVSRQorOyAqCis7ICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyAqCis7ICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsgKgorOyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyAqCis7ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7ICovCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKK3B3Xzg6ICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgKDEgPDwgOSkKK3B3XzEwOiAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgKDEgPDwgMTEpCitwd18xMjogICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3ICgxIDw8IDEzKQorcHdfYmlfODogICAgICAgICAgICAgICAgdGltZXMgOCBkdyAoMSA8PCA4KQorcHdfYmlfMTA6ICAgICAgICAgICAgICAgdGltZXMgOCBkdyAoMSA8PCAxMCkKK3B3X2JpXzEyOiAgICAgICAgICAgICAgIHRpbWVzIDggZHcgKDEgPDwgMTIpCittYXhfcGl4ZWxzXzEwOiAgICAgICAgICB0aW1lcyA4ICBkdyAoKDEgPDwgMTApLTEpCittYXhfcGl4ZWxzXzEyOiAgICAgICAgICB0aW1lcyA4ICBkdyAoKDEgPDwgMTIpLTEpCit6ZXJvOiAgICAgICAgICAgICAgICAgICB0aW1lcyA0ICBkZCAwCitvbmVfcGVyXzMyOiAgICAgICAgICAgICB0aW1lcyA0ICBkZCAxCisKK1NFQ1RJT04gLnRleHQKKyVtYWNybyBFUEVMX1RBQkxFIDQKK2hldmNfZXBlbF9maWx0ZXJzXyU0XyUxIHRpbWVzICUyIGQlMyAtMiwgNTgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAxMCwgLTIKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAtNCwgNTQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAxNiwgLTIKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAtNiwgNDYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAyOCwgLTQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAtNCwgMzYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAzNiwgLTQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAtNCwgMjgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyA0NiwgLTYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAtMiwgMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyA1NCwgLTQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAtMiwgMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyA1OCwgLTIKKyVlbmRtYWNybworCisKKworRVBFTF9UQUJMRSAgOCwgOCwgYiwgc3NlNAorRVBFTF9UQUJMRSAxMCwgNCwgdywgc3NlNAorRVBFTF9UQUJMRSAxMiwgNCwgdywgc3NlNAorCislbWFjcm8gUVBFTF9UQUJMRSA0CitoZXZjX3FwZWxfZmlsdGVyc18lNF8lMSB0aW1lcyAlMiBkJTMgIC0xLCAgNAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgJTIgZCUzIC0xMCwgNTgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAgMTcsIC01CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcyAlMiBkJTMgICAxLCAgMAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgJTIgZCUzICAtMSwgIDQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAtMTEsIDQwCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcyAlMiBkJTMgIDQwLC0xMQorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgJTIgZCUzICAgNCwgLTEKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAgIDAsICAxCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcyAlMiBkJTMgIC01LCAxNworICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgJTIgZCUzICA1OCwtMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzICUyIGQlMyAgIDQsIC0xCislZW5kbWFjcm8KKworUVBFTF9UQUJMRSAgOCwgOCwgYiwgc3NlNAorUVBFTF9UQUJMRSAxMCwgNCwgdywgc3NlNAorUVBFTF9UQUJMRSAxMiwgNCwgdywgc3NlNAorCislZGVmaW5lIE1BWF9QQl9TSVpFICA2NAorCislZGVmaW5lIGhldmNfcXBlbF9maWx0ZXJzX3NzZTRfMTQgaGV2Y19xcGVsX2ZpbHRlcnNfc3NlNF8xMAorCislaWYgQVJDSF9YODZfNjQKKworJW1hY3JvIFNJTVBMRV9CSUxPQUQgNCAgIDt3aWR0aCwgdGFiLCByMSwgcjIKKyVpZiAlMSA8PSA0CisgICAgbW92cSAgICAgICAgICAgICAgJTMsIFslMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEgZnJvbSBzb3VyY2UyCislZWxpZiAlMSA8PSA4CisgICAgbW92ZHFhICAgICAgICAgICAgJTMsIFslMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEgZnJvbSBzb3VyY2UyCislZWxpZiAlMSA8PSAxMgorICAgIG1vdmRxYSAgICAgICAgICAgICUzLCBbJTJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCBkYXRhIGZyb20gc291cmNlMgorICAgIG1vdnEgICAgICAgICAgICAgICU0LCBbJTIrMTZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCBkYXRhIGZyb20gc291cmNlMgorJWVsc2UKKyAgICBtb3ZkcWEgICAgICAgICAgICAlMywgWyUyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YSBmcm9tIHNvdXJjZTIKKyAgICBtb3ZkcWEgICAgICAgICAgICAlNCwgWyUyKzE2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YSBmcm9tIHNvdXJjZTIKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBTSU1QTEVfTE9BRCA0ICAgIDt3aWR0aCwgYml0ZCwgdGFiLCByMQorJWlmICUxID09IDIgfHwgKCUyID09IDggJiYgJTEgPD0gNCkKKyAgICBtb3ZkICAgICAgICAgICAgICAlNCwgWyUzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEgZnJvbSBzb3VyY2UKKyVlbGlmICUxID09IDQgfHwgKCUyID09IDggJiYgJTEgPD0gOCkKKyAgICBtb3ZxICAgICAgICAgICAgICAlNCwgWyUzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEgZnJvbSBzb3VyY2UKKyVlbHNlCisgICAgbW92ZHF1ICAgICAgICAgICAgJTQsIFslM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCBkYXRhIGZyb20gc291cmNlCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gU0lNUExFXzhMT0FEIDUgICAgO3dpZHRoLCBiaXRkLCB0YWIsIHIxLCByMgorJWlmICUxID09IDIgfHwgKCUyID09IDggJiYgJTEgPD0gNCkKKyAgICBtb3ZxICAgICAgICAgICAgICAlNCwgWyUzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YSBmcm9tIHNvdXJjZTIKKyVlbGlmICUxID09IDQgfHwgKCUyID09IDggJiYgJTEgPD0gOCkKKyAgICBtb3ZkcWEgICAgICAgICAgICAlNCwgWyUzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGF0YSBmcm9tIHNvdXJjZTIKKyVlbGlmICUxIDw9IDEyCisgICAgbW92ZHFhICAgICAgICAgICAgJTQsIFslM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEgZnJvbSBzb3VyY2UyCisgICAgbW92cSAgICAgICAgICAgICAgJTUsIFslMysxNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBsb2FkIGRhdGEgZnJvbSBzb3VyY2UyCislZWxzZQorICAgIG1vdmRxYSAgICAgICAgICAgICU0LCBbJTNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCBkYXRhIGZyb20gc291cmNlMgorICAgIG1vdmRxYSAgICAgICAgICAgICU1LCBbJTMrMTZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCBkYXRhIGZyb20gc291cmNlMgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEVQRUxfRklMVEVSIDItNCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGJpdCBkZXB0aCwgZmlsdGVyIGluZGV4CislaWZkZWYgUElDCisgICAgbGVhICAgICAgICAgcmZpbHRlcnEsIFtoZXZjX2VwZWxfZmlsdGVyc19zc2U0XyUxXQorJWVsc2UKKyAgICAlZGVmaW5lIHJmaWx0ZXJxIGhldmNfZXBlbF9maWx0ZXJzX3NzZTRfJTEKKyVlbmRpZgorICAgIHN1YiAgICAgICAgICAgICAgJTJxLCAxCisgICAgc2hsICAgICAgICAgICAgICAlMnEsIDUgICAgICAgICAgICAgICAgICAgICAgOyBtdWx0aXBseSBieSAzMgorJWlmICUwID09IDIKKyAgICBtb3ZkcWEgICAgICAgICAgIG0xNCwgW3JmaWx0ZXJxICsgJTJxXSAgICAgICAgOyBnZXQgMiBmaXJzdCB2YWx1ZXMgb2YgZmlsdGVycworICAgIG1vdmRxYSAgICAgICAgICAgbTE1LCBbcmZpbHRlcnEgKyAlMnErMTZdICAgICA7IGdldCAyIGxhc3QgdmFsdWVzIG9mIGZpbHRlcnMKKyVlbHNlCisgICAgbW92ZHFhICAgICAgICAgICAlMywgW3JmaWx0ZXJxICsgJTJxXSAgICAgICAgOyBnZXQgMiBmaXJzdCB2YWx1ZXMgb2YgZmlsdGVycworICAgIG1vdmRxYSAgICAgICAgICAgJTQsIFtyZmlsdGVycSArICUycSsxNl0gICAgIDsgZ2V0IDIgbGFzdCB2YWx1ZXMgb2YgZmlsdGVycworJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEVQRUxfSFZfRklMVEVSIDEKKyVpZmRlZiBQSUMKKyAgICBsZWEgICAgICAgICByZmlsdGVycSwgW2hldmNfZXBlbF9maWx0ZXJzX3NzZTRfJTFdCislZWxzZQorICAgICVkZWZpbmUgcmZpbHRlcnEgaGV2Y19lcGVsX2ZpbHRlcnNfc3NlNF8lMQorJWVuZGlmCisgICAgc3ViICAgICAgICAgICAgICBteHEsIDEKKyAgICBzdWIgICAgICAgICAgICAgIG15cSwgMQorICAgIHNobCAgICAgICAgICAgICAgbXhxLCA1ICAgICAgICAgICAgICAgICAgICAgIDsgbXVsdGlwbHkgYnkgMzIKKyAgICBzaGwgICAgICAgICAgICAgIG15cSwgNSAgICAgICAgICAgICAgICAgICAgICA7IG11bHRpcGx5IGJ5IDMyCisgICAgbW92ZHFhICAgICAgICAgICBtMTQsIFtyZmlsdGVycSArIG14cV0gICAgICAgIDsgZ2V0IDIgZmlyc3QgdmFsdWVzIG9mIGZpbHRlcnMKKyAgICBtb3ZkcWEgICAgICAgICAgIG0xNSwgW3JmaWx0ZXJxICsgbXhxKzE2XSAgICAgOyBnZXQgMiBsYXN0IHZhbHVlcyBvZiBmaWx0ZXJzCisgICAgbGVhICAgICAgICAgICByM3NyY3EsIFtzcmNzdHJpZGVxKjNdCisKKyVpZmRlZiBQSUMKKyAgICBsZWEgICAgICAgICByZmlsdGVycSwgW2hldmNfZXBlbF9maWx0ZXJzX3NzZTRfMTBdCislZWxzZQorICAgICVkZWZpbmUgcmZpbHRlcnEgaGV2Y19lcGVsX2ZpbHRlcnNfc3NlNF8xMAorJWVuZGlmCisgICAgbW92ZHFhICAgICAgICAgICBtMTIsIFtyZmlsdGVycSArIG15cV0gICAgICAgIDsgZ2V0IDIgZmlyc3QgdmFsdWVzIG9mIGZpbHRlcnMKKyAgICBtb3ZkcWEgICAgICAgICAgIG0xMywgW3JmaWx0ZXJxICsgbXlxKzE2XSAgICAgOyBnZXQgMiBsYXN0IHZhbHVlcyBvZiBmaWx0ZXJzCislZW5kbWFjcm8KKworJW1hY3JvIFFQRUxfRklMVEVSIDIKKyVpZmRlZiBQSUMKKyAgICBsZWEgICAgICAgICByZmlsdGVycSwgW2hldmNfcXBlbF9maWx0ZXJzX3NzZTRfJTFdCislZWxzZQorICAgICVkZWZpbmUgcmZpbHRlcnEgaGV2Y19xcGVsX2ZpbHRlcnNfc3NlNF8lMQorJWVuZGlmCisgICAgbGVhICAgICAgICAgICAgICAlMnEsIFslMnEqOC04XQorICAgIG1vdmRxYSAgICAgICAgICAgbTEyLCBbcmZpbHRlcnEgKyAlMnEqOF0gICAgICAgOyBnZXQgNCBmaXJzdCB2YWx1ZXMgb2YgZmlsdGVycworICAgIG1vdmRxYSAgICAgICAgICAgbTEzLCBbcmZpbHRlcnEgKyAlMnEqOCArIDE2XSAgOyBnZXQgNCBmaXJzdCB2YWx1ZXMgb2YgZmlsdGVycworICAgIG1vdmRxYSAgICAgICAgICAgbTE0LCBbcmZpbHRlcnEgKyAlMnEqOCArIDMyXSAgOyBnZXQgNCBmaXJzdCB2YWx1ZXMgb2YgZmlsdGVycworICAgIG1vdmRxYSAgICAgICAgICAgbTE1LCBbcmZpbHRlcnEgKyAlMnEqOCArIDQ4XSAgOyBnZXQgNCBmaXJzdCB2YWx1ZXMgb2YgZmlsdGVycworJWVuZG1hY3JvCisKKyVtYWNybyBFUEVMX0xPQUQgNAorJWlmZGVmIFBJQworICAgIGxlYSByZmlsdGVycSwgWyUyXQorJWVsc2UKKyAgICAlZGVmaW5lIHJmaWx0ZXJxICUyCislZW5kaWYKKyVpZiAoJTEgPT0gOCAmJiAlNCA8PSA0KQorJWRlZmluZSAlJWxvYWQgbW92ZAorJWVsaWYgKCUxID09IDggJiYgJTQgPD0gOCkgfHwgKCUxID4gOCAmJiAlNCA8PSA0KQorJWRlZmluZSAlJWxvYWQgbW92cQorJWVsc2UKKyVkZWZpbmUgJSVsb2FkIG1vdmRxdQorJWVuZGlmCisKKyAgICAlJWxvYWQgICAgICAgICAgICBtMCwgW3JmaWx0ZXJxIF0KKyVpZm51bSAlMworICAgICUlbG9hZCAgICAgICAgICAgIG0xLCBbcmZpbHRlcnErICAlM10KKyAgICAlJWxvYWQgICAgICAgICAgICBtMiwgW3JmaWx0ZXJxKzIqJTNdCisgICAgJSVsb2FkICAgICAgICAgICAgbTMsIFtyZmlsdGVycSszKiUzXQorJWVsc2UKKyAgICAlJWxvYWQgICAgICAgICAgICBtMSwgW3JmaWx0ZXJxKyAgJTNxXQorICAgICUlbG9hZCAgICAgICAgICAgIG0yLCBbcmZpbHRlcnErMiolM3FdCisgICAgJSVsb2FkICAgICAgICAgICAgbTMsIFtyZmlsdGVycStyM3NyY3FdCislZW5kaWYKKworJWlmICUxID09IDgKKyVpZiAlNCA+IDgKKyAgICBTQlVUVEVSRkxZICAgICAgICBidywgMCwgMSwgMTAKKyAgICBTQlVUVEVSRkxZICAgICAgICBidywgMiwgMywgMTAKKyVlbHNlCisgICAgcHVucGNrbGJ3ICAgICAgICAgbTAsIG0xCisgICAgcHVucGNrbGJ3ICAgICAgICAgbTIsIG0zCislZW5kaWYKKyVlbHNlCislaWYgJTQgPiA0CisgICAgU0JVVFRFUkZMWSAgICAgICAgd2QsIDAsIDEsIDEwCisgICAgU0JVVFRFUkZMWSAgICAgICAgd2QsIDIsIDMsIDEwCislZWxzZQorICAgIHB1bnBja2x3ZCAgICAgICAgIG0wLCBtMQorICAgIHB1bnBja2x3ZCAgICAgICAgIG0yLCBtMworJWVuZGlmCislZW5kaWYKKyVlbmRtYWNybworCisKKyVtYWNybyBRUEVMX0hfTE9BRCA0CislYXNzaWduICUlc3RyaWRlICglMSs3KS84CislaWYgJTEgPT0gOAorJWlmICUzIDw9IDQKKyVkZWZpbmUgJSVsb2FkIG1vdmQKKyVlbGlmICUzID09IDgKKyVkZWZpbmUgJSVsb2FkIG1vdnEKKyVlbHNlCislZGVmaW5lICUlbG9hZCBtb3ZkcXUKKyVlbmRpZgorJWVsc2UKKyVpZiAlMyA9PSAyCislZGVmaW5lICUlbG9hZCBtb3ZkCislZWxpZiAlMyA9PSA0CislZGVmaW5lICUlbG9hZCBtb3ZxCislZWxzZQorJWRlZmluZSAlJWxvYWQgbW92ZHF1CislZW5kaWYKKyVlbmRpZgorICAgICUlbG9hZCAgICAgICAgICAgIG0wLCBbJTItMyolJXN0cmlkZV0gICAgICAgIDtsb2FkIGRhdGEgZnJvbSBzb3VyY2UKKyAgICAlJWxvYWQgICAgICAgICAgICBtMSwgWyUyLTIqJSVzdHJpZGVdCisgICAgJSVsb2FkICAgICAgICAgICAgbTIsIFslMi0lJXN0cmlkZSAgXQorICAgICUlbG9hZCAgICAgICAgICAgIG0zLCBbJTIgICAgICAgICAgIF0KKyAgICAlJWxvYWQgICAgICAgICAgICBtNCwgWyUyKyUlc3RyaWRlICBdCisgICAgJSVsb2FkICAgICAgICAgICAgbTUsIFslMisyKiUlc3RyaWRlXQorICAgICUlbG9hZCAgICAgICAgICAgIG02LCBbJTIrMyolJXN0cmlkZV0KKyAgICAlJWxvYWQgICAgICAgICAgICBtNywgWyUyKzQqJSVzdHJpZGVdCisKKyVpZiAlMSA9PSA4CislaWYgJTMgPiA4CisgICAgU0JVVFRFUkZMWSAgICAgICAgd2QsIDAsIDEsICU0CisgICAgU0JVVFRFUkZMWSAgICAgICAgd2QsIDIsIDMsICU0CisgICAgU0JVVFRFUkZMWSAgICAgICAgd2QsIDQsIDUsICU0CisgICAgU0JVVFRFUkZMWSAgICAgICAgd2QsIDYsIDcsICU0CislZWxzZQorICAgIHB1bnBja2x3ZCAgICAgICAgIG0wLCBtMQorICAgIHB1bnBja2x3ZCAgICAgICAgIG0yLCBtMworICAgIHB1bnBja2x3ZCAgICAgICAgIG00LCBtNQorICAgIHB1bnBja2x3ZCAgICAgICAgIG02LCBtNworJWVuZGlmCislZWxzZQorJWlmICUzID4gNAorICAgIFNCVVRURVJGTFkgICAgICAgIGRxLCAwLCAxLCAlNAorICAgIFNCVVRURVJGTFkgICAgICAgIGRxLCAyLCAzLCAlNAorICAgIFNCVVRURVJGTFkgICAgICAgIGRxLCA0LCA1LCAlNAorICAgIFNCVVRURVJGTFkgICAgICAgIGRxLCA2LCA3LCAlNAorJWVsc2UKKyAgICBwdW5wY2tsZHEgICAgICAgICBtMCwgbTEKKyAgICBwdW5wY2tsZHEgICAgICAgICBtMiwgbTMKKyAgICBwdW5wY2tsZHEgICAgICAgICBtNCwgbTUKKyAgICBwdW5wY2tsZHEgICAgICAgICBtNiwgbTcKKyVlbmRpZgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFFQRUxfVl9MT0FEIDUKKyAgICBsZWEgICAgICAgICAgICAgICU1cSwgWyUyXQorICAgIHN1YiAgICAgICAgICAgICAgJTVxLCByM3NyY3EKKyAgICBtb3ZkcXUgICAgICAgICAgICBtMCwgWyU1cSAgICAgICAgICAgIF0gICAgICA7bG9hZCB4LSAzKnNyY3N0cmlkZQorICAgIG1vdmRxdSAgICAgICAgICAgIG0xLCBbJTVxKyAgICUzcSAgICAgXSAgICAgIDtsb2FkIHgtIDIqc3Jjc3RyaWRlCisgICAgbW92ZHF1ICAgICAgICAgICAgbTIsIFslNXErIDIqJTNxICAgICBdICAgICAgO2xvYWQgeC1zcmNzdHJpZGUKKyAgICBtb3ZkcXUgICAgICAgICAgICBtMywgWyUyICAgICAgIF0gICAgICA7bG9hZCB4CisgICAgbW92ZHF1ICAgICAgICAgICAgbTQsIFslMisgICAlM3FdICAgICAgO2xvYWQgeCtzdHJpZGUKKyAgICBtb3ZkcXUgICAgICAgICAgICBtNSwgWyUyKyAyKiUzcV0gICAgICA7bG9hZCB4KzIqc3RyaWRlCisgICAgbW92ZHF1ICAgICAgICAgICAgbTYsIFslMityM3NyY3FdICAgICAgO2xvYWQgeCszKnN0cmlkZQorICAgIG1vdmRxdSAgICAgICAgICAgIG03LCBbJTIrIDQqJTNxXSAgICAgIDtsb2FkIHgrNCpzdHJpZGUKKyVpZiAlMSA9PSA4CislaWYgJTQgPiA4CisgICAgU0JVVFRFUkZMWSAgICAgICAgYncsIDAsIDEsIDgKKyAgICBTQlVUVEVSRkxZICAgICAgICBidywgMiwgMywgOAorICAgIFNCVVRURVJGTFkgICAgICAgIGJ3LCA0LCA1LCA4CisgICAgU0JVVFRFUkZMWSAgICAgICAgYncsIDYsIDcsIDgKKyVlbHNlCisgICAgcHVucGNrbGJ3ICAgICAgICAgbTAsIG0xCisgICAgcHVucGNrbGJ3ICAgICAgICAgbTIsIG0zCisgICAgcHVucGNrbGJ3ICAgICAgICAgbTQsIG01CisgICAgcHVucGNrbGJ3ICAgICAgICAgbTYsIG03CislZW5kaWYKKyVlbHNlCislaWYgJTQgPiA0CisgICAgU0JVVFRFUkZMWSAgICAgICAgd2QsIDAsIDEsIDgKKyAgICBTQlVUVEVSRkxZICAgICAgICB3ZCwgMiwgMywgOAorICAgIFNCVVRURVJGTFkgICAgICAgIHdkLCA0LCA1LCA4CisgICAgU0JVVFRFUkZMWSAgICAgICAgd2QsIDYsIDcsIDgKKyVlbHNlCisgICAgcHVucGNrbHdkICAgICAgICAgbTAsIG0xCisgICAgcHVucGNrbHdkICAgICAgICAgbTIsIG0zCisgICAgcHVucGNrbHdkICAgICAgICAgbTQsIG01CisgICAgcHVucGNrbHdkICAgICAgICAgbTYsIG03CislZW5kaWYKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBQRUxfMTJTVE9SRTIgMworICAgIG1vdmQgICAgICAgICAgIFslMV0sICUyCislZW5kbWFjcm8KKyVtYWNybyBQRUxfMTJTVE9SRTQgMworICAgIG1vdnEgICAgICAgICAgIFslMV0sICUyCislZW5kbWFjcm8KKyVtYWNybyBQRUxfMTJTVE9SRTYgMworICAgIG1vdnEgICAgICAgICAgIFslMV0sICUyCisgICAgcHNybGRxICAgICAgICAgICAgJTIsIDgKKyAgICBtb3ZkICAgICAgICAgWyUxKzhdLCAlMgorJWVuZG1hY3JvCislbWFjcm8gUEVMXzEyU1RPUkU4IDMKKyAgICBtb3ZkcWEgICAgICAgICBbJTFdLCAlMgorJWVuZG1hY3JvCislbWFjcm8gUEVMXzEyU1RPUkUxMiAzCisgICAgbW92ZHFhICAgICAgICAgWyUxXSwgJTIKKyAgICBtb3ZxICAgICAgICBbJTErMTZdLCAlMworJWVuZG1hY3JvCislbWFjcm8gUEVMXzEyU1RPUkUxNiAzCisgICAgUEVMXzEyU1RPUkU4ICAgICAgJTEsICUyLCAlMworICAgIG1vdmRxYSAgICAgICBbJTErMTZdLCAlMworJWVuZG1hY3JvCisKKyVtYWNybyBQRUxfMTBTVE9SRTIgMworICAgIG1vdmQgICAgICAgICAgIFslMV0sICUyCislZW5kbWFjcm8KKyVtYWNybyBQRUxfMTBTVE9SRTQgMworICAgIG1vdnEgICAgICAgICAgIFslMV0sICUyCislZW5kbWFjcm8KKyVtYWNybyBQRUxfMTBTVE9SRTYgMworICAgIG1vdnEgICAgICAgICAgIFslMV0sICUyCisgICAgcHNybGRxICAgICAgICAgICAgJTIsIDgKKyAgICBtb3ZkICAgICAgICAgWyUxKzhdLCAlMgorJWVuZG1hY3JvCislbWFjcm8gUEVMXzEwU1RPUkU4IDMKKyAgICBtb3ZkcWEgICAgICAgICBbJTFdLCAlMgorJWVuZG1hY3JvCislbWFjcm8gUEVMXzEwU1RPUkUxMiAzCisgICAgbW92ZHFhICAgICAgICAgWyUxXSwgJTIKKyAgICBtb3ZxICAgICAgICBbJTErMTZdLCAlMworJWVuZG1hY3JvCislbWFjcm8gUEVMXzEwU1RPUkUxNiAzCisgICAgUEVMXzEwU1RPUkU4ICAgICAgJTEsICUyLCAlMworICAgIG1vdmRxYSAgICAgICBbJTErMTZdLCAlMworJWVuZG1hY3JvCisKKyVtYWNybyBQRUxfOFNUT1JFMiAzCisgICAgcGV4dHJ3ICAgICAgICAgIFslMV0sICUyLCAwCislZW5kbWFjcm8KKyVtYWNybyBQRUxfOFNUT1JFNCAzCisgICAgbW92ZCAgICAgICAgICAgIFslMV0sICUyCislZW5kbWFjcm8KKyVtYWNybyBQRUxfOFNUT1JFNiAzCisgICAgbW92ZCAgICAgICAgICAgIFslMV0sICUyCisgICAgcGV4dHJ3ICAgICAgICBbJTErNF0sICUyLCAyCislZW5kbWFjcm8KKyVtYWNybyBQRUxfOFNUT1JFOCAzCisgICAgbW92cSAgICAgICAgICAgWyUxXSwgJTIKKyVlbmRtYWNybworJW1hY3JvIFBFTF84U1RPUkUxMiAzCisgICAgbW92cSAgICAgICAgICAgIFslMV0sICUyCisgICAgcHNybGRxICAgICAgICAgICAgJTIsIDgKKyAgICBtb3ZkICAgICAgICAgIFslMSs4XSwgJTIKKyVlbmRtYWNybworJW1hY3JvIFBFTF84U1RPUkUxNiAzCisgICAgbW92ZHFhICAgICAgICAgIFslMV0sICUyCislZW5kbWFjcm8KKworJW1hY3JvIExPT1BfRU5EIDMKKyAgICBhZGQgICAgICAgICAgICAgICUxcSwgMipNQVhfUEJfU0laRSAgICAgICAgICA7IGRzdCArPSBkc3RzdHJpZGUKKyAgICBhZGQgICAgICAgICAgICAgICUycSwgJTNxICAgICAgICAgICAgICAgICAgICA7IHNyYyArPSBzcmNzdHJpZGUKKyAgICBkZWMgICAgICAgICAgaGVpZ2h0ZCAgICAgICAgICAgICAgICAgICAgICAgICA7IGNtcCBoZWlnaHQKKyAgICBqbnogICAgICAgICAgICAgICAubG9vcCAgICAgICAgICAgICAgICAgICAgICA7IGhlaWdodCBsb29wCislZW5kbWFjcm8KKworCislbWFjcm8gTUNfUElYRUxfQ09NUFVURSAyIDt3aWR0aCwgYml0ZGVwdGgKKyVpZiAlMiA9PSA4CislaWYgJTEgPiA4CisgICAgcHVucGNraGJ3ICAgICAgICAgbTEsIG0wLCBtMgorICAgIHBzbGx3ICAgICAgICAgICAgIG0xLCAxNC0lMgorJWVuZGlmCisgICAgcHVucGNrbGJ3ICAgICAgICAgbTAsIG0yCislZW5kaWYKKyAgICBwc2xsdyAgICAgICAgICAgICBtMCwgMTQtJTIKKyVlbmRtYWNybworCisKKyVtYWNybyBFUEVMX0NPTVBVVEUgNCA7IGJpdGRlcHRoLCB3aWR0aCwgZmlsdGVyMSwgZmlsdGVyMgorJWlmICUxID09IDgKKyAgICBwbWFkZHVic3cgICAgICAgICBtMCwgJTMgICA7eDEqYzEreDIqYzIKKyAgICBwbWFkZHVic3cgICAgICAgICBtMiwgJTQgICA7eDMqYzMreDQqYzQKKyAgICBwYWRkdyAgICAgICAgICAgICBtMCwgbTIKKyVpZiAlMiA+IDgKKyAgICBwbWFkZHVic3cgICAgICAgICBtMSwgJTMKKyAgICBwbWFkZHVic3cgICAgICAgICBtMywgJTQKKyAgICBwYWRkdyAgICAgICAgICAgICBtMSwgbTMKKyVlbmRpZgorJWVsc2UKKyAgICBwbWFkZHdkICAgICAgICAgICBtMCwgJTMKKyAgICBwbWFkZHdkICAgICAgICAgICBtMiwgJTQKKyAgICBwYWRkZCAgICAgICAgICAgICBtMCwgbTIKKyVpZiAlMiA+IDQKKyAgICBwbWFkZHdkICAgICAgICAgICBtMSwgJTMKKyAgICBwbWFkZHdkICAgICAgICAgICBtMywgJTQKKyAgICBwYWRkZCAgICAgICAgICAgICBtMSwgbTMKKyVlbmRpZgorJWlmICUxICE9IDgKKyAgICBwc3JhZCAgICAgICAgICAgICBtMCwgJTEtOAorICAgIHBzcmFkICAgICAgICAgICAgIG0xLCAlMS04CislZW5kaWYKKyAgICBwYWNrc3NkdyAgICAgICAgICBtMCwgbTEKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBRUEVMX0hWX0NPTVBVVEUgNCAgICAgOyB3aWR0aCwgYml0ZGVwdGgsIGZpbHRlciBpZHgKKyVpZmRlZiBQSUMKKyAgICBsZWEgICAgICAgICByZmlsdGVycSwgW2hldmNfcXBlbF9maWx0ZXJzX3NzZTRfJTJdCislZWxzZQorICAgICVkZWZpbmUgcmZpbHRlcnEgaGV2Y19xcGVsX2ZpbHRlcnNfc3NlNF8lMgorJWVuZGlmCisKKyVpZiAlMiA9PSA4CisgICAgcG1hZGR1YnN3ICAgICAgICAgbTAsIFtyZmlsdGVycSArICUzcSo4ICAgXSAgIDt4MSpjMSt4MipjMgorICAgIHBtYWRkdWJzdyAgICAgICAgIG0yLCBbcmZpbHRlcnEgKyAlM3EqOCsxNl0gICA7eDMqYzMreDQqYzQKKyAgICBwbWFkZHVic3cgICAgICAgICBtNCwgW3JmaWx0ZXJxICsgJTNxKjgrMzJdICAgO3g1KmM1K3g2KmM2CisgICAgcG1hZGR1YnN3ICAgICAgICAgbTYsIFtyZmlsdGVycSArICUzcSo4KzQ4XSAgIDt4NypjNyt4OCpjOAorICAgIHBhZGR3ICAgICAgICAgICAgIG0wLCBtMgorICAgIHBhZGR3ICAgICAgICAgICAgIG00LCBtNgorICAgIHBhZGR3ICAgICAgICAgICAgIG0wLCBtNAorJWVsc2UKKyAgICBwbWFkZHdkICAgICAgICAgICBtMCwgW3JmaWx0ZXJxICsgJTNxKjggICBdCisgICAgcG1hZGR3ZCAgICAgICAgICAgbTIsIFtyZmlsdGVycSArICUzcSo4KzE2XQorICAgIHBtYWRkd2QgICAgICAgICAgIG00LCBbcmZpbHRlcnEgKyAlM3EqOCszMl0KKyAgICBwbWFkZHdkICAgICAgICAgICBtNiwgW3JmaWx0ZXJxICsgJTNxKjgrNDhdCisgICAgcGFkZGQgICAgICAgICAgICAgbTAsIG0yCisgICAgcGFkZGQgICAgICAgICAgICAgbTQsIG02CisgICAgcGFkZGQgICAgICAgICAgICAgbTAsIG00CislaWYgJTIgIT0gOAorICAgIHBzcmFkICAgICAgICAgICAgIG0wLCAlMi04CislZW5kaWYKKyVpZiAlMSA+IDQKKyAgICBwbWFkZHdkICAgICAgICAgICBtMSwgW3JmaWx0ZXJxICsgJTNxKjggICBdCisgICAgcG1hZGR3ZCAgICAgICAgICAgbTMsIFtyZmlsdGVycSArICUzcSo4KzE2XQorICAgIHBtYWRkd2QgICAgICAgICAgIG01LCBbcmZpbHRlcnEgKyAlM3EqOCszMl0KKyAgICBwbWFkZHdkICAgICAgICAgICBtNywgW3JmaWx0ZXJxICsgJTNxKjgrNDhdCisgICAgcGFkZGQgICAgICAgICAgICAgbTEsIG0zCisgICAgcGFkZGQgICAgICAgICAgICAgbTUsIG03CisgICAgcGFkZGQgICAgICAgICAgICAgbTEsIG01CislaWYgJTIgIT0gOAorICAgIHBzcmFkICAgICAgICAgICAgIG0xLCAlMi04CislZW5kaWYKKyVlbmRpZgorICAgIHAlNCAgICAgICAgICAgICAgIG0wLCBtMQorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFFQRUxfQ09NUFVURSAyICAgICA7IHdpZHRoLCBiaXRkZXB0aAorJWlmICUyID09IDgKKyAgICBwbWFkZHVic3cgICAgICAgICBtMCwgbTEyICAgO3gxKmMxK3gyKmMyCisgICAgcG1hZGR1YnN3ICAgICAgICAgbTIsIG0xMyAgIDt4MypjMyt4NCpjNAorICAgIHBtYWRkdWJzdyAgICAgICAgIG00LCBtMTQgICA7eDUqYzUreDYqYzYKKyAgICBwbWFkZHVic3cgICAgICAgICBtNiwgbTE1ICAgO3g3KmM3K3g4KmM4CisgICAgcGFkZHcgICAgICAgICAgICAgbTAsIG0yCisgICAgcGFkZHcgICAgICAgICAgICAgbTQsIG02CisgICAgcGFkZHcgICAgICAgICAgICAgbTAsIG00CislaWYgJTEgPiA4CisgICAgcG1hZGR1YnN3ICAgICAgICAgbTEsIG0xMgorICAgIHBtYWRkdWJzdyAgICAgICAgIG0zLCBtMTMKKyAgICBwbWFkZHVic3cgICAgICAgICBtNSwgbTE0CisgICAgcG1hZGR1YnN3ICAgICAgICAgbTcsIG0xNQorICAgIHBhZGR3ICAgICAgICAgICAgIG0xLCBtMworICAgIHBhZGR3ICAgICAgICAgICAgIG01LCBtNworICAgIHBhZGR3ICAgICAgICAgICAgIG0xLCBtNQorJWVuZGlmCislZWxzZQorICAgIHBtYWRkd2QgICAgICAgICAgIG0wLCBtMTIKKyAgICBwbWFkZHdkICAgICAgICAgICBtMiwgbTEzCisgICAgcG1hZGR3ZCAgICAgICAgICAgbTQsIG0xNAorICAgIHBtYWRkd2QgICAgICAgICAgIG02LCBtMTUKKyAgICBwYWRkZCAgICAgICAgICAgICBtMCwgbTIKKyAgICBwYWRkZCAgICAgICAgICAgICBtNCwgbTYKKyAgICBwYWRkZCAgICAgICAgICAgICBtMCwgbTQKKyVpZiAlMiAhPSA4CisgICAgcHNyYWQgICAgICAgICAgICAgbTAsICUyLTgKKyVlbmRpZgorJWlmICUxID4gNAorICAgIHBtYWRkd2QgICAgICAgICAgIG0xLCBtMTIKKyAgICBwbWFkZHdkICAgICAgICAgICBtMywgbTEzCisgICAgcG1hZGR3ZCAgICAgICAgICAgbTUsIG0xNAorICAgIHBtYWRkd2QgICAgICAgICAgIG03LCBtMTUKKyAgICBwYWRkZCAgICAgICAgICAgICBtMSwgbTMKKyAgICBwYWRkZCAgICAgICAgICAgICBtNSwgbTcKKyAgICBwYWRkZCAgICAgICAgICAgICBtMSwgbTUKKyVpZiAlMiAhPSA4CisgICAgcHNyYWQgICAgICAgICAgICAgbTEsICUyLTgKKyVlbmRpZgorJWVuZGlmCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gQklfQ09NUFVURSA3ICAgICA7IHdpZHRoLCBiaXRkLCBzcmMxbCwgc3JjMWgsIHNjcjJsLCBzY3IyaCwgcHcKKyAgICBwYWRkc3cgICAgICAgICAgICAlMywgJTUKKyVpZiAlMSA+IDgKKyAgICBwYWRkc3cgICAgICAgICAgICAlNCwgJTYKKyVlbmRpZgorICAgIFVOSV9DT01QVVRFICAgICAgICUxLCAlMiwgJTMsICU0LCAlNworJWVuZG1hY3JvCisKKyVtYWNybyBVTklfQ09NUFVURSA1CisgICAgcG11bGhyc3cgICAgICAgICAgJTMsICU1CislaWYgJTEgPiA4IHx8ICglMiA+IDggJiYgJTEgPiA0KQorICAgIHBtdWxocnN3ICAgICAgICAgICU0LCAlNQorJWVuZGlmCislaWYgJTIgPT0gOAorICAgIHBhY2t1c3diICAgICAgICAgICUzLCAlNAorJWVsc2UKKyAgICBwbWluc3cgICAgICAgICAgICAlMywgW21heF9waXhlbHNfJTJdCisgICAgcG1heHN3ICAgICAgICAgICAgJTMsIFt6ZXJvXQorJWlmICUxID4gOAorICAgIHBtaW5zdyAgICAgICAgICAgICU0LCBbbWF4X3BpeGVsc18lMl0KKyAgICBwbWF4c3cgICAgICAgICAgICAlNCwgW3plcm9dCislZW5kaWYKKyVlbmRpZgorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFkZHMgZmZfIGFuZCBfc3NlNCB0byBmdW5jdGlvbiBuYW1lCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyB2b2lkIHB1dF9oZXZjX21jX3BpeGVscyhpbnQxNl90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSkKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVtYWNybyBIRVZDX1BVVF9IRVZDX1BFTF9QSVhFTFMgMgorY2dsb2JhbCBoZXZjX3B1dF9oZXZjX3BlbF9waXhlbHMlMV8lMiwgNCwgNCwgMywgZHN0LCBzcmMsIHNyY3N0cmlkZSxoZWlnaHQKKyAgICBweG9yICAgICAgICAgICAgICAgbTIsIG0yCisubG9vcAorICAgIFNJTVBMRV9MT0FEICAgICAgICUxLCAlMiwgc3JjcSwgbTAKKyAgICBNQ19QSVhFTF9DT01QVVRFICAlMSwgJTIKKyAgICBQRUxfMTBTVE9SRSUxICAgICBkc3RxLCBtMCwgbTEKKyAgICBMT09QX0VORCAgICAgICAgIGRzdCwgc3JjLCBzcmNzdHJpZGUKKyAgICBSRVQKKworY2dsb2JhbCBoZXZjX3B1dF9oZXZjX3VuaV9wZWxfcGl4ZWxzJTFfJTIsIDUsIDUsIDIsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSxoZWlnaHQKKy5sb29wCisgICAgU0lNUExFX0xPQUQgICAgICAgJTEsICUyLCBzcmNxLCBtMAorICAgIFBFTF8lMlNUT1JFJTEgICBkc3RxLCBtMCwgbTEKKyAgICBhZGQgICAgICAgICAgICAgZHN0cSwgZHN0c3RyaWRlcSAgICAgICAgICAgICA7IGRzdCArPSBkc3RzdHJpZGUKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcSAgICAgICAgICAgICA7IHNyYyArPSBzcmNzdHJpZGUKKyAgICBkZWMgICAgICAgICAgaGVpZ2h0ZCAgICAgICAgICAgICAgICAgICAgICAgICA7IGNtcCBoZWlnaHQKKyAgICBqbnogICAgICAgICAgICAgICAubG9vcCAgICAgICAgICAgICAgICAgICAgICA7IGhlaWdodCBsb29wCisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y19wdXRfaGV2Y19iaV9wZWxfcGl4ZWxzJTFfJTIsIDYsIDYsIDYsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgc3JjMiwgaGVpZ2h0CisgICAgcHhvciAgICAgICAgICAgICAgbTIsIG0yCisgICAgbW92ZHFhICAgICAgICAgICAgbTUsIFtwd19iaV8lMl0KKy5sb29wCisgICAgU0lNUExFX0xPQUQgICAgICAgJTEsICUyLCBzcmNxLCBtMAorICAgIFNJTVBMRV9CSUxPQUQgICAgICUxLCBzcmMycSwgbTMsIG00CisgICAgTUNfUElYRUxfQ09NUFVURSAgJTEsICUyCisgICAgQklfQ09NUFVURSAgICAgICAgJTEsICUyLCBtMCwgbTEsIG0zLCBtNCwgbTUKKyAgICBQRUxfJTJTVE9SRSUxICAgZHN0cSwgbTAsIG0xCisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIGRzdHN0cmlkZXEgICAgICAgICAgICAgOyBkc3QgKz0gZHN0c3RyaWRlCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEgICAgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgYWRkICAgICAgICAgICAgc3JjMnEsIDIqTUFYX1BCX1NJWkUgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgZGVjICAgICAgICAgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbXAgaGVpZ2h0CisgICAgam56ICAgICAgICAgICAgICAgLmxvb3AgICAgICAgICAgICAgICAgICAgICAgOyBoZWlnaHQgbG9vcAorICAgIFJFVAorCislZW5kbWFjcm8KKworCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyB2b2lkIHB1dF9oZXZjX2VwZWxfaFgoaW50MTZfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBteCwgaW50IG15LAorOyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogbWNidWZmZXIpCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKyVtYWNybyBIRVZDX1BVVF9IRVZDX0VQRUwgMgorY2dsb2JhbCBoZXZjX3B1dF9oZXZjX2VwZWxfaCUxXyUyLCA1LCA2LCA2LCBkc3QsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCByZmlsdGVyCislYXNzaWduICUlc3RyaWRlICgoJTIgKyA3KS84KQorICAgIEVQRUxfRklMVEVSICAgICAgICUyLCBteCwgbTQsIG01CisubG9vcAorICAgIEVQRUxfTE9BRCAgICAgICAgICUyLCBzcmNxLSUlc3RyaWRlLCAlJXN0cmlkZSwgJTEKKyAgICBFUEVMX0NPTVBVVEUgICAgICAlMiwgJTEsIG00LCBtNQorICAgIFBFTF8xMFNUT1JFJTEgICAgICBkc3RxLCBtMCwgbTEKKyAgICBMT09QX0VORCAgICAgICAgIGRzdCwgc3JjLCBzcmNzdHJpZGUKKyAgICBSRVQKKworY2dsb2JhbCBoZXZjX3B1dF9oZXZjX3VuaV9lcGVsX2glMV8lMiwgNiwgNywgNywgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCByZmlsdGVyCislYXNzaWduICUlc3RyaWRlICgoJTIgKyA3KS84KQorICAgIG1vdmRxYSAgICAgICAgICAgIG02LCBbcHdfJTJdCisgICAgRVBFTF9GSUxURVIgICAgICAgJTIsIG14LCBtNCwgbTUKKy5sb29wCisgICAgRVBFTF9MT0FEICAgICAgICAgJTIsIHNyY3EtJSVzdHJpZGUsICUlc3RyaWRlLCAlMQorICAgIEVQRUxfQ09NUFVURSAgICAgICUyLCAlMSwgbTQsIG01CisgICAgVU5JX0NPTVBVVEUgICAgICAgJTEsICUyLCBtMCwgbTEsIG02CisgICAgUEVMXyUyU1RPUkUlMSAgIGRzdHEsIG0wLCBtMQorICAgIGFkZCAgICAgICAgICAgICBkc3RxLCBkc3RzdHJpZGVxICAgICAgICAgICAgIDsgZHN0ICs9IGRzdHN0cmlkZQorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxICAgICAgICAgICAgIDsgc3JjICs9IHNyY3N0cmlkZQorICAgIGRlYyAgICAgICAgICBoZWlnaHRkICAgICAgICAgICAgICAgICAgICAgICAgIDsgY21wIGhlaWdodAorICAgIGpueiAgICAgICAgICAgICAgIC5sb29wICAgICAgICAgICAgICAgICAgICAgIDsgaGVpZ2h0IGxvb3AKKyAgICBSRVQKKworY2dsb2JhbCBoZXZjX3B1dF9oZXZjX2JpX2VwZWxfaCUxXyUyLCA3LCA4LCA3LCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIHNyYzIsIGhlaWdodCwgbXgsIHJmaWx0ZXIKKyAgICBtb3ZkcWEgICAgICAgICAgICBtNiwgW3B3X2JpXyUyXQorICAgIEVQRUxfRklMVEVSICAgICAgICUyLCBteCwgbTQsIG01CisubG9vcAorICAgIEVQRUxfTE9BRCAgICAgICAgICUyLCBzcmNxLSUlc3RyaWRlLCAlJXN0cmlkZSwgJTEKKyAgICBFUEVMX0NPTVBVVEUgICAgICAlMiwgJTEsIG00LCBtNQorICAgIFNJTVBMRV9CSUxPQUQgICAgICUxLCBzcmMycSwgbTIsIG0zCisgICAgQklfQ09NUFVURSAgICAgICAgJTEsICUyLCBtMCwgbTEsIG0yLCBtMywgbTYKKyAgICBQRUxfJTJTVE9SRSUxICAgZHN0cSwgbTAsIG0xCisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIGRzdHN0cmlkZXEgICAgICAgICAgICAgOyBkc3QgKz0gZHN0c3RyaWRlCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEgICAgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgYWRkICAgICAgICAgICAgc3JjMnEsIDIqTUFYX1BCX1NJWkUgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgZGVjICAgICAgICAgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbXAgaGVpZ2h0CisgICAgam56ICAgICAgICAgICAgICAgLmxvb3AgICAgICAgICAgICAgICAgICAgICAgOyBoZWlnaHQgbG9vcAorICAgIFJFVAorCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyB2b2lkIHB1dF9oZXZjX2VwZWxfdihpbnQxNl90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBteCwgaW50IG15LAorOyAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBtY2J1ZmZlcikKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK2NnbG9iYWwgaGV2Y19wdXRfaGV2Y19lcGVsX3YlMV8lMiwgNiwgNywgNiwgZHN0LCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCByM3NyYywgbXksIHJmaWx0ZXIKKyAgICBsZWEgICAgICAgICAgIHIzc3JjcSwgW3NyY3N0cmlkZXEqM10KKyAgICBzdWIgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIEVQRUxfRklMVEVSICAgICAgICUyLCBteSwgbTQsIG01CisubG9vcAorICAgIEVQRUxfTE9BRCAgICAgICAgICUyLCBzcmNxLCBzcmNzdHJpZGUsICUxCisgICAgRVBFTF9DT01QVVRFICAgICAgJTIsICUxLCBtNCwgbTUKKyAgICBQRUxfMTBTVE9SRSUxICAgICBkc3RxLCBtMCwgbTEKKyAgICBMT09QX0VORCAgICAgICAgICBkc3QsIHNyYywgc3Jjc3RyaWRlCisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y19wdXRfaGV2Y191bmlfZXBlbF92JTFfJTIsIDcsIDgsIDcsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCByM3NyYywgbXksIHJmaWx0ZXIKKyAgICBsZWEgICAgICAgICAgIHIzc3JjcSwgW3NyY3N0cmlkZXEqM10KKyAgICBtb3ZkcWEgICAgICAgICAgICBtNiwgW3B3XyUyXQorICAgIHN1YiAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgRVBFTF9GSUxURVIgICAgICAgJTIsIG15LCBtNCwgbTUKKy5sb29wCisgICAgRVBFTF9MT0FEICAgICAgICAgJTIsIHNyY3EsIHNyY3N0cmlkZSwgJTEKKyAgICBFUEVMX0NPTVBVVEUgICAgICAlMiwgJTEsIG00LCBtNQorICAgIFVOSV9DT01QVVRFICAgICAgICUxLCAlMiwgbTAsIG0xLCBtNgorICAgIFBFTF8lMlNUT1JFJTEgICBkc3RxLCBtMCwgbTEKKyAgICBhZGQgICAgICAgICAgICAgZHN0cSwgZHN0c3RyaWRlcSAgICAgICAgICAgICA7IGRzdCArPSBkc3RzdHJpZGUKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcSAgICAgICAgICAgICA7IHNyYyArPSBzcmNzdHJpZGUKKyAgICBkZWMgICAgICAgICAgaGVpZ2h0ZCAgICAgICAgICAgICAgICAgICAgICAgICA7IGNtcCBoZWlnaHQKKyAgICBqbnogICAgICAgICAgICAgICAubG9vcCAgICAgICAgICAgICAgICAgICAgICA7IGhlaWdodCBsb29wCisgICAgUkVUCisKKworY2dsb2JhbCBoZXZjX3B1dF9oZXZjX2JpX2VwZWxfdiUxXyUyLCA4LCA5LCA3LCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIHNyYzIsIGhlaWdodCwgcjNzcmMsIG15LCByZmlsdGVyCisgICAgbGVhICAgICAgICAgICByM3NyY3EsIFtzcmNzdHJpZGVxKjNdCisgICAgbW92ZHFhICAgICAgICAgICAgbTYsIFtwd19iaV8lMl0KKyAgICBzdWIgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIEVQRUxfRklMVEVSICAgICAgICUyLCBteSwgbTQsIG01CisubG9vcAorICAgIEVQRUxfTE9BRCAgICAgICAgICUyLCBzcmNxLCBzcmNzdHJpZGUsICUxCisgICAgRVBFTF9DT01QVVRFICAgICAgJTIsICUxLCBtNCwgbTUKKyAgICBTSU1QTEVfQklMT0FEICAgICAlMSwgc3JjMnEsIG0yLCBtMworICAgIEJJX0NPTVBVVEUgICAgICAgICUxLCAlMiwgbTAsIG0xLCBtMiwgbTMsIG02CisgICAgUEVMXyUyU1RPUkUlMSAgIGRzdHEsIG0wLCBtMQorICAgIGFkZCAgICAgICAgICAgICBkc3RxLCBkc3RzdHJpZGVxICAgICAgICAgICAgIDsgZHN0ICs9IGRzdHN0cmlkZQorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxICAgICAgICAgICAgIDsgc3JjICs9IHNyY3N0cmlkZQorICAgIGFkZCAgICAgICAgICAgIHNyYzJxLCAyKk1BWF9QQl9TSVpFICAgICAgICAgIDsgc3JjICs9IHNyY3N0cmlkZQorICAgIGRlYyAgICAgICAgICBoZWlnaHRkICAgICAgICAgICAgICAgICAgICAgICAgIDsgY21wIGhlaWdodAorICAgIGpueiAgICAgICAgICAgICAgIC5sb29wICAgICAgICAgICAgICAgICAgICAgIDsgaGVpZ2h0IGxvb3AKKyAgICBSRVQKKyVlbmRtYWNybworCisKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IHZvaWQgcHV0X2hldmNfZXBlbF9odihpbnQxNl90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwKKzsgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG14LCBpbnQgbXkpCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislbWFjcm8gSEVWQ19QVVRfSEVWQ19FUEVMX0hWIDIKK2NnbG9iYWwgaGV2Y19wdXRfaGV2Y19lcGVsX2h2JTFfJTIsIDYsIDgsIDEyICwgZHN0LCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCBteCwgbXksIHIzc3JjLCByZmlsdGVyCislYXNzaWduICUlc3RyaWRlICgoJTIgKyA3KS84KQorICAgIHN1YiAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgRVBFTF9IVl9GSUxURVIgICAgJTIKKyAgICBFUEVMX0xPQUQgICAgICAgICAlMiwgc3JjcS0lJXN0cmlkZSwgJSVzdHJpZGUsICUxCisgICAgRVBFTF9DT01QVVRFICAgICAgJTIsICUxLCBtMTQsIG0xNQorICAgIFNXQVAgICAgICAgICAgICAgIG00LCBtMAorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgRVBFTF9MT0FEICAgICAgICAgJTIsIHNyY3EtJSVzdHJpZGUsICUlc3RyaWRlLCAlMQorICAgIEVQRUxfQ09NUFVURSAgICAgICUyLCAlMSwgbTE0LCBtMTUKKyAgICBTV0FQICAgICAgICAgICAgICBtNSwgbTAKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIEVQRUxfTE9BRCAgICAgICAgICUyLCBzcmNxLSUlc3RyaWRlLCAlJXN0cmlkZSwgJTEKKyAgICBFUEVMX0NPTVBVVEUgICAgICAlMiwgJTEsIG0xNCwgbTE1CisgICAgU1dBUCAgICAgICAgICAgICAgbTYsIG0wCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEKKy5sb29wCisgICAgRVBFTF9MT0FEICAgICAgICAgJTIsIHNyY3EtJSVzdHJpZGUsICUlc3RyaWRlLCAlMQorICAgIEVQRUxfQ09NUFVURSAgICAgICUyLCAlMSwgbTE0LCBtMTUKKyAgICBTV0FQICAgICAgICAgICAgICBtNywgbTAKKyAgICBwdW5wY2tsd2QgICAgICAgICBtMCwgbTQsIG01CisgICAgcHVucGNrbHdkICAgICAgICAgbTIsIG02LCBtNworJWlmICUxID4gNAorICAgIHB1bnBja2h3ZCAgICAgICAgIG0xLCBtNCwgbTUKKyAgICBwdW5wY2tod2QgICAgICAgICBtMywgbTYsIG03CislZW5kaWYKKyAgICBFUEVMX0NPTVBVVEUgICAgICAxNCwgJTEsIG0xMiwgbTEzCisgICAgUEVMXzEwU1RPUkUlMSAgICAgZHN0cSwgbTAsIG0xCisgICAgbW92ZHFhICAgICAgICAgICAgbTQsIG01CisgICAgbW92ZHFhICAgICAgICAgICAgbTUsIG02CisgICAgbW92ZHFhICAgICAgICAgICAgbTYsIG03CisgICAgTE9PUF9FTkQgICAgICAgICBkc3QsIHNyYywgc3Jjc3RyaWRlCisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y19wdXRfaGV2Y191bmlfZXBlbF9odiUxXyUyLCA3LCA5LCAxMiAsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCBteCwgbXksIHIzc3JjLCByZmlsdGVyCislYXNzaWduICUlc3RyaWRlICgoJTIgKyA3KS84KQorICAgIHN1YiAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgRVBFTF9IVl9GSUxURVIgICAgJTIKKyAgICBFUEVMX0xPQUQgICAgICAgICAlMiwgc3JjcS0lJXN0cmlkZSwgJSVzdHJpZGUsICUxCisgICAgRVBFTF9DT01QVVRFICAgICAgJTIsICUxLCBtMTQsIG0xNQorICAgIFNXQVAgICAgICAgICAgICAgIG00LCBtMAorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgRVBFTF9MT0FEICAgICAgICAgJTIsIHNyY3EtJSVzdHJpZGUsICUlc3RyaWRlLCAlMQorICAgIEVQRUxfQ09NUFVURSAgICAgICUyLCAlMSwgbTE0LCBtMTUKKyAgICBTV0FQICAgICAgICAgICAgICBtNSwgbTAKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIEVQRUxfTE9BRCAgICAgICAgICUyLCBzcmNxLSUlc3RyaWRlLCAlJXN0cmlkZSwgJTEKKyAgICBFUEVMX0NPTVBVVEUgICAgICAlMiwgJTEsIG0xNCwgbTE1CisgICAgU1dBUCAgICAgICAgICAgICAgbTYsIG0wCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEKKy5sb29wCisgICAgRVBFTF9MT0FEICAgICAgICAgJTIsIHNyY3EtJSVzdHJpZGUsICUlc3RyaWRlLCAlMQorICAgIEVQRUxfQ09NUFVURSAgICAgICUyLCAlMSwgbTE0LCBtMTUKKyAgICBTV0FQICAgICAgICAgICAgICBtNywgbTAKKyAgICBwdW5wY2tsd2QgICAgICAgICBtMCwgbTQsIG01CisgICAgcHVucGNrbHdkICAgICAgICAgbTIsIG02LCBtNworJWlmICUxID4gNAorICAgIHB1bnBja2h3ZCAgICAgICAgIG0xLCBtNCwgbTUKKyAgICBwdW5wY2tod2QgICAgICAgICBtMywgbTYsIG03CislZW5kaWYKKyAgICBFUEVMX0NPTVBVVEUgICAgICAxNCwgJTEsIG0xMiwgbTEzCisgICAgVU5JX0NPTVBVVEUgICAgICAgJTEsICUyLCBtMCwgbTEsIFtwd18lMl0KKyAgICBQRUxfJTJTVE9SRSUxICAgZHN0cSwgbTAsIG0xCisgICAgbW92ZHFhICAgICAgICAgICAgbTQsIG01CisgICAgbW92ZHFhICAgICAgICAgICAgbTUsIG02CisgICAgbW92ZHFhICAgICAgICAgICAgbTYsIG03CisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIGRzdHN0cmlkZXEgICAgICAgICAgICAgOyBkc3QgKz0gZHN0c3RyaWRlCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEgICAgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgZGVjICAgICAgICAgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbXAgaGVpZ2h0CisgICAgam56ICAgICAgICAgICAgICAgLmxvb3AgICAgICAgICAgICAgICAgICAgICAgOyBoZWlnaHQgbG9vcAorICAgIFJFVAorCisKK2NnbG9iYWwgaGV2Y19wdXRfaGV2Y19iaV9lcGVsX2h2JTFfJTIsIDgsIDEwLCAxNiwgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBzcmMyLCBoZWlnaHQsIG14LCBteSwgcjNzcmMsIHJmaWx0ZXIKKyVhc3NpZ24gJSVzdHJpZGUgKCglMiArIDcpLzgpCisgICAgc3ViICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBFUEVMX0hWX0ZJTFRFUiAgICAlMgorICAgIEVQRUxfTE9BRCAgICAgICAgICUyLCBzcmNxLSUlc3RyaWRlLCAlJXN0cmlkZSwgJTEKKyAgICBFUEVMX0NPTVBVVEUgICAgICAlMiwgJTEsIG0xNCwgbTE1CisgICAgU1dBUCAgICAgICAgICAgICAgbTQsIG0wCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBFUEVMX0xPQUQgICAgICAgICAlMiwgc3JjcS0lJXN0cmlkZSwgJSVzdHJpZGUsICUxCisgICAgRVBFTF9DT01QVVRFICAgICAgJTIsICUxLCBtMTQsIG0xNQorICAgIFNXQVAgICAgICAgICAgICAgIG01LCBtMAorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgRVBFTF9MT0FEICAgICAgICAgJTIsIHNyY3EtJSVzdHJpZGUsICUlc3RyaWRlLCAlMQorICAgIEVQRUxfQ09NUFVURSAgICAgICUyLCAlMSwgbTE0LCBtMTUKKyAgICBTV0FQICAgICAgICAgICAgICBtNiwgbTAKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorLmxvb3AKKyAgICBFUEVMX0xPQUQgICAgICAgICAlMiwgc3JjcS0lJXN0cmlkZSwgJSVzdHJpZGUsICUxCisgICAgRVBFTF9DT01QVVRFICAgICAgJTIsICUxLCBtMTQsIG0xNQorICAgIFNXQVAgICAgICAgICAgICAgIG03LCBtMAorICAgIHB1bnBja2x3ZCAgICAgICAgIG0wLCBtNCwgbTUKKyAgICBwdW5wY2tsd2QgICAgICAgICBtMiwgbTYsIG03CislaWYgJTEgPiA0CisgICAgcHVucGNraHdkICAgICAgICAgbTEsIG00LCBtNQorICAgIHB1bnBja2h3ZCAgICAgICAgIG0zLCBtNiwgbTcKKyVlbmRpZgorICAgIEVQRUxfQ09NUFVURSAgICAgIDE0LCAlMSwgbTEyLCBtMTMKKyAgICBTSU1QTEVfQklMT0FEICAgICAlMSwgc3JjMnEsIG04LCBtOQorICAgIEJJX0NPTVBVVEUgICAgICAgICUxLCAlMiwgbTAsIG0xLCBtOCwgbTksIFtwd19iaV8lMl0KKyAgICBQRUxfJTJTVE9SRSUxICAgZHN0cSwgbTAsIG0xCisgICAgbW92ZHFhICAgICAgICAgICAgbTQsIG01CisgICAgbW92ZHFhICAgICAgICAgICAgbTUsIG02CisgICAgbW92ZHFhICAgICAgICAgICAgbTYsIG03CisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIGRzdHN0cmlkZXEgICAgICAgICAgICAgOyBkc3QgKz0gZHN0c3RyaWRlCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEgICAgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgYWRkICAgICAgICAgICAgc3JjMnEsIDIqTUFYX1BCX1NJWkUgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgZGVjICAgICAgICAgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbXAgaGVpZ2h0CisgICAgam56ICAgICAgICAgICAgICAgLmxvb3AgICAgICAgICAgICAgICAgICAgICAgOyBoZWlnaHQgbG9vcAorICAgIFJFVAorJWVuZG1hY3JvCisKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IHZvaWQgcHV0X2hldmNfcXBlbF9oWF9YX1goaW50MTZfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBteCwgaW50IG15KQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJW1hY3JvIEhFVkNfUFVUX0hFVkNfUVBFTCAyCitjZ2xvYmFsIGhldmNfcHV0X2hldmNfcXBlbF9oJTFfJTIsIDUsIDYsIDE1LCBkc3QsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCByZmlsdGVyCisgICAgUVBFTF9GSUxURVIgICAgICAgJTIsIG14CisubG9vcAorICAgIFFQRUxfSF9MT0FEICAgICAgICUyLCBzcmNxLCAlMSwgMTAKKyAgICBRUEVMX0NPTVBVVEUgICAgICAlMSwgJTIKKyVpZiAlMiA+IDgKKyAgICBwYWNrc3NkdyAgICAgICAgICBtMCwgbTEKKyVlbmRpZgorICAgIFBFTF8xMFNUT1JFJTEgICAgIGRzdHEsIG0wLCBtMQorICAgIExPT1BfRU5EICAgICAgICAgIGRzdCwgc3JjLCBzcmNzdHJpZGUKKyAgICBSRVQKKworY2dsb2JhbCBoZXZjX3B1dF9oZXZjX3VuaV9xcGVsX2glMV8lMiwgNiwgNywgMTUgLCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgbXgsIHJmaWx0ZXIKKyAgICBtb3ZkcWEgICAgICAgICAgICBtOSwgW3B3XyUyXQorICAgIFFQRUxfRklMVEVSICAgICAgICUyLCBteAorLmxvb3AKKyAgICBRUEVMX0hfTE9BRCAgICAgICAlMiwgc3JjcSwgJTEsIDEwCisgICAgUVBFTF9DT01QVVRFICAgICAgJTEsICUyCislaWYgJTIgPiA4CisgICAgcGFja3NzZHcgICAgICAgICAgbTAsIG0xCislZW5kaWYKKyAgICBVTklfQ09NUFVURSAgICAgICAlMSwgJTIsIG0wLCBtMSwgbTkKKyAgICBQRUxfJTJTVE9SRSUxICAgZHN0cSwgbTAsIG0xCisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIGRzdHN0cmlkZXEgICAgICAgICAgICAgOyBkc3QgKz0gZHN0c3RyaWRlCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEgICAgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgZGVjICAgICAgICAgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbXAgaGVpZ2h0CisgICAgam56ICAgICAgICAgICAgICAgLmxvb3AgICAgICAgICAgICAgICAgICAgICAgOyBoZWlnaHQgbG9vcAorICAgIFJFVAorCitjZ2xvYmFsIGhldmNfcHV0X2hldmNfYmlfcXBlbF9oJTFfJTIsIDcsIDgsIDE2ICwgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBzcmMyLCBoZWlnaHQsIG14LCByZmlsdGVyCisgICAgbW92ZHFhICAgICAgICAgICAgbTksIFtwd19iaV8lMl0KKyAgICBRUEVMX0ZJTFRFUiAgICAgICAlMiwgbXgKKy5sb29wCisgICAgUVBFTF9IX0xPQUQgICAgICAgJTIsIHNyY3EsICUxLCAxMAorICAgIFFQRUxfQ09NUFVURSAgICAgICUxLCAlMgorJWlmICUyID4gOAorICAgIHBhY2tzc2R3ICAgICAgICAgIG0wLCBtMQorJWVuZGlmCisgICAgU0lNUExFX0JJTE9BRCAgICAgJTEsIHNyYzJxLCBtMTAsIG0xMQorICAgIEJJX0NPTVBVVEUgICAgICAgICUxLCAlMiwgbTAsIG0xLCBtMTAsIG0xMSwgbTkKKyAgICBQRUxfJTJTVE9SRSUxICAgZHN0cSwgbTAsIG0xCisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIGRzdHN0cmlkZXEgICAgICAgICAgICAgOyBkc3QgKz0gZHN0c3RyaWRlCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEgICAgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgYWRkICAgICAgICAgICAgc3JjMnEsIDIqTUFYX1BCX1NJWkUgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgZGVjICAgICAgICAgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbXAgaGVpZ2h0CisgICAgam56ICAgICAgICAgICAgICAgLmxvb3AgICAgICAgICAgICAgICAgICAgICAgOyBoZWlnaHQgbG9vcAorICAgIFJFVAorCisKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IHZvaWQgcHV0X2hldmNfcXBlbF92WF9YX1goaW50MTZfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBteCwgaW50IG15KQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworY2dsb2JhbCBoZXZjX3B1dF9oZXZjX3FwZWxfdiUxXyUyLCA2LCA4LCAxNSwgZHN0LCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCByM3NyYywgbXksIHJmaWx0ZXIKKyAgICBsZWEgICAgICAgICAgIHIzc3JjcSwgW3NyY3N0cmlkZXEqM10KKyAgICBRUEVMX0ZJTFRFUiAgICAgICAlMiwgbXkKKy5sb29wCisgICAgUVBFTF9WX0xPQUQgICAgICAgJTIsIHNyY3EsIHNyY3N0cmlkZSwgJTEsIHI3CisgICAgUVBFTF9DT01QVVRFICAgICAgJTEsICUyCislaWYgJTIgPiA4CisgICAgcGFja3NzZHcgICAgICAgICAgbTAsIG0xCislZW5kaWYKKyAgICBQRUxfMTBTVE9SRSUxICAgICBkc3RxLCBtMCwgbTEKKyAgICBMT09QX0VORCAgICAgICAgIGRzdCwgc3JjLCBzcmNzdHJpZGUKKyAgICBSRVQKKworY2dsb2JhbCBoZXZjX3B1dF9oZXZjX3VuaV9xcGVsX3YlMV8lMiwgNywgOSwgMTUsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCByM3NyYywgbXksIHJmaWx0ZXIKKyAgICBtb3ZkcWEgICAgICAgICAgICBtOSwgW3B3XyUyXQorICAgIGxlYSAgICAgICAgICAgcjNzcmNxLCBbc3Jjc3RyaWRlcSozXQorICAgIFFQRUxfRklMVEVSICAgICAgICUyLCBteQorLmxvb3AKKyAgICBRUEVMX1ZfTE9BRCAgICAgICAlMiwgc3JjcSwgc3Jjc3RyaWRlLCAlMSwgcjgKKyAgICBRUEVMX0NPTVBVVEUgICAgICAlMSwgJTIKKyVpZiAlMiA+IDgKKyAgICBwYWNrc3NkdyAgICAgICAgICBtMCwgbTEKKyVlbmRpZgorICAgIFVOSV9DT01QVVRFICAgICAgICUxLCAlMiwgbTAsIG0xLCBtOQorICAgIFBFTF8lMlNUT1JFJTEgICBkc3RxLCBtMCwgbTEKKyAgICBhZGQgICAgICAgICAgICAgZHN0cSwgZHN0c3RyaWRlcSAgICAgICAgICAgICA7IGRzdCArPSBkc3RzdHJpZGUKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcSAgICAgICAgICAgICA7IHNyYyArPSBzcmNzdHJpZGUKKyAgICBkZWMgICAgICAgICAgaGVpZ2h0ZCAgICAgICAgICAgICAgICAgICAgICAgICA7IGNtcCBoZWlnaHQKKyAgICBqbnogICAgICAgICAgICAgICAubG9vcCAgICAgICAgICAgICAgICAgICAgICA7IGhlaWdodCBsb29wCisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y19wdXRfaGV2Y19iaV9xcGVsX3YlMV8lMiwgOCwgMTAsIDE2LCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIHNyYzIsIGhlaWdodCwgcjNzcmMsIG15LCByZmlsdGVyCisgICAgbW92ZHFhICAgICAgICAgICAgbTksIFtwd19iaV8lMl0KKyAgICBsZWEgICAgICAgICAgIHIzc3JjcSwgW3NyY3N0cmlkZXEqM10KKyAgICBRUEVMX0ZJTFRFUiAgICAgICAlMiwgbXkKKy5sb29wCisgICAgU0lNUExFX0JJTE9BRCAgICAgJTEsIHNyYzJxLCBtMTAsIG0xMQorICAgIFFQRUxfVl9MT0FEICAgICAgICUyLCBzcmNxLCBzcmNzdHJpZGUsICUxLCByOQorICAgIFFQRUxfQ09NUFVURSAgICAgICUxLCAlMgorJWlmICUyID4gOAorICAgIHBhY2tzc2R3ICAgICAgICAgIG0wLCBtMQorJWVuZGlmCisgICAgQklfQ09NUFVURSAgICAgICAgJTEsICUyLCBtMCwgbTEsIG0xMCwgbTExLCBtOQorICAgIFBFTF8lMlNUT1JFJTEgICBkc3RxLCBtMCwgbTEKKyAgICBhZGQgICAgICAgICAgICAgZHN0cSwgZHN0c3RyaWRlcSAgICAgICAgICAgICA7IGRzdCArPSBkc3RzdHJpZGUKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcSAgICAgICAgICAgICA7IHNyYyArPSBzcmNzdHJpZGUKKyAgICBhZGQgICAgICAgICAgICBzcmMycSwgMipNQVhfUEJfU0laRSAgICAgICAgICA7IHNyYyArPSBzcmNzdHJpZGUKKyAgICBkZWMgICAgICAgICAgaGVpZ2h0ZCAgICAgICAgICAgICAgICAgICAgICAgICA7IGNtcCBoZWlnaHQKKyAgICBqbnogICAgICAgICAgICAgICAubG9vcCAgICAgICAgICAgICAgICAgICAgICA7IGhlaWdodCBsb29wCisgICAgUkVUCislZW5kbWFjcm8KKworCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyB2b2lkIHB1dF9oZXZjX3FwZWxfaHZYX1goaW50MTZfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSkKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCislbWFjcm8gSEVWQ19QVVRfSEVWQ19RUEVMX0hWIDIKK2NnbG9iYWwgaGV2Y19wdXRfaGV2Y19xcGVsX2h2JTFfJTIsIDYsIDgsIDEyLCBkc3QsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCBteSwgcjNzcmMsIHJmaWx0ZXIKKyAgICBsZWEgICAgICAgICAgICAgIG14cSwgW214cSo4LThdCisgICAgbGVhICAgICAgICAgICAgICBteXEsIFtteXEqOC04XQorICAgIGxlYSAgICAgICAgICAgcjNzcmNxLCBbc3Jjc3RyaWRlcSozXQorICAgIHN1YiAgICAgICAgICAgICBzcmNxLCByM3NyY3EKKyAgICBRUEVMX0hfTE9BRCAgICAgICAlMiwgc3JjcSwgJTEsIDE1CisgICAgUVBFTF9IVl9DT01QVVRFICAgJTEsICUyLCBteCwgYWNrc3NkdworICAgIFNXQVAgICAgICAgICAgICAgIG04LCBtMAorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgUVBFTF9IX0xPQUQgICAgICAgJTIsIHNyY3EsICUxLCAxNQorICAgIFFQRUxfSFZfQ09NUFVURSAgICUxLCAlMiwgbXgsIGFja3NzZHcKKyAgICBTV0FQICAgICAgICAgICAgICBtOSwgbTAKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIFFQRUxfSF9MT0FEICAgICAgICUyLCBzcmNxLCAlMSwgMTUKKyAgICBRUEVMX0hWX0NPTVBVVEUgICAlMSwgJTIsIG14LCBhY2tzc2R3CisgICAgU1dBUCAgICAgICAgICAgICBtMTAsIG0wCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBRUEVMX0hfTE9BRCAgICAgICAlMiwgc3JjcSwgJTEsIDE1CisgICAgUVBFTF9IVl9DT01QVVRFICAgJTEsICUyLCBteCwgYWNrc3NkdworICAgIFNXQVAgICAgICAgICAgICAgbTExLCBtMAorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgUVBFTF9IX0xPQUQgICAgICAgJTIsIHNyY3EsICUxLCAxNQorICAgIFFQRUxfSFZfQ09NUFVURSAgICUxLCAlMiwgbXgsIGFja3NzZHcKKyAgICBTV0FQICAgICAgICAgICAgIG0xMiwgbTAKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIFFQRUxfSF9MT0FEICAgICAgICUyLCBzcmNxLCAlMSwgMTUKKyAgICBRUEVMX0hWX0NPTVBVVEUgICAlMSwgJTIsIG14LCBhY2tzc2R3CisgICAgU1dBUCAgICAgICAgICAgICBtMTMsIG0wCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBRUEVMX0hfTE9BRCAgICAgICAlMiwgc3JjcSwgJTEsIDE1CisgICAgUVBFTF9IVl9DT01QVVRFICAgJTEsICUyLCBteCwgYWNrc3NkdworICAgIFNXQVAgICAgICAgICAgICAgbTE0LCBtMAorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisubG9vcAorICAgIFFQRUxfSF9MT0FEICAgICAgICUyLCBzcmNxLCAlMSwgMTUKKyAgICBRUEVMX0hWX0NPTVBVVEUgICAlMSwgJTIsIG14LCBhY2tzc2R3CisgICAgU1dBUCAgICAgICAgICAgICBtMTUsIG0wCisgICAgcHVucGNrbHdkICAgICAgICAgbTAsIG04LCBtOQorICAgIHB1bnBja2x3ZCAgICAgICAgIG0yLCBtMTAsIG0xMQorICAgIHB1bnBja2x3ZCAgICAgICAgIG00LCBtMTIsIG0xMworICAgIHB1bnBja2x3ZCAgICAgICAgIG02LCBtMTQsIG0xNQorJWlmICUxID4gNAorICAgIHB1bnBja2h3ZCAgICAgICAgIG0xLCBtOCwgbTkKKyAgICBwdW5wY2tod2QgICAgICAgICBtMywgbTEwLCBtMTEKKyAgICBwdW5wY2tod2QgICAgICAgICBtNSwgbTEyLCBtMTMKKyAgICBwdW5wY2tod2QgICAgICAgICBtNywgbTE0LCBtMTUKKyVlbmRpZgorICAgIFFQRUxfSFZfQ09NUFVURSAgICUxLCAxNCwgbXksIGFja3NzZHcKKyAgICBQRUxfMTBTVE9SRSUxICAgICBkc3RxLCBtMCwgbTEKKyVpZiAlMSA8PSA0CisgICAgbW92cSAgICAgICAgICAgICAgbTgsIG05CisgICAgbW92cSAgICAgICAgICAgICAgbTksIG0xMAorICAgIG1vdnEgICAgICAgICAgICAgbTEwLCBtMTEKKyAgICBtb3ZxICAgICAgICAgICAgIG0xMSwgbTEyCisgICAgbW92cSAgICAgICAgICAgICBtMTIsIG0xMworICAgIG1vdnEgICAgICAgICAgICAgbTEzLCBtMTQKKyAgICBtb3ZxICAgICAgICAgICAgIG0xNCwgbTE1CislZWxzZQorICAgIG1vdmRxYSAgICAgICAgICAgIG04LCBtOQorICAgIG1vdmRxYSAgICAgICAgICAgIG05LCBtMTAKKyAgICBtb3ZkcWEgICAgICAgICAgIG0xMCwgbTExCisgICAgbW92ZHFhICAgICAgICAgICBtMTEsIG0xMgorICAgIG1vdmRxYSAgICAgICAgICAgbTEyLCBtMTMKKyAgICBtb3ZkcWEgICAgICAgICAgIG0xMywgbTE0CisgICAgbW92ZHFhICAgICAgICAgICBtMTQsIG0xNQorJWVuZGlmCisgICAgTE9PUF9FTkQgICAgICAgICBkc3QsIHNyYywgc3Jjc3RyaWRlCisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y19wdXRfaGV2Y191bmlfcXBlbF9odiUxXyUyLCA3LCA5LCAxMiAsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCBteCwgbXksIHIzc3JjLCByZmlsdGVyCisgICAgbGVhICAgICAgICAgICAgICBteHEsIFtteHEqOC04XQorICAgIGxlYSAgICAgICAgICAgICAgbXlxLCBbbXlxKjgtOF0KKyAgICBsZWEgICAgICAgICAgIHIzc3JjcSwgW3NyY3N0cmlkZXEqM10KKyAgICBzdWIgICAgICAgICAgICAgc3JjcSwgcjNzcmNxCisgICAgUVBFTF9IX0xPQUQgICAgICAgJTIsIHNyY3EsICUxLCAxNQorICAgIFFQRUxfSFZfQ09NUFVURSAgICUxLCAlMiwgbXgsIGFja3NzZHcKKyAgICBTV0FQICAgICAgICAgICAgICBtOCwgbTAKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIFFQRUxfSF9MT0FEICAgICAgICUyLCBzcmNxLCAlMSwgMTUKKyAgICBRUEVMX0hWX0NPTVBVVEUgICAlMSwgJTIsIG14LCBhY2tzc2R3CisgICAgU1dBUCAgICAgICAgICAgICAgbTksIG0wCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBRUEVMX0hfTE9BRCAgICAgICAlMiwgc3JjcSwgJTEsIDE1CisgICAgUVBFTF9IVl9DT01QVVRFICAgJTEsICUyLCBteCwgYWNrc3NkdworICAgIFNXQVAgICAgICAgICAgICAgbTEwLCBtMAorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgUVBFTF9IX0xPQUQgICAgICAgJTIsIHNyY3EsICUxLCAxNQorICAgIFFQRUxfSFZfQ09NUFVURSAgICUxLCAlMiwgbXgsIGFja3NzZHcKKyAgICBTV0FQICAgICAgICAgICAgIG0xMSwgbTAKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIFFQRUxfSF9MT0FEICAgICAgICUyLCBzcmNxLCAlMSwgMTUKKyAgICBRUEVMX0hWX0NPTVBVVEUgICAlMSwgJTIsIG14LCBhY2tzc2R3CisgICAgU1dBUCAgICAgICAgICAgICBtMTIsIG0wCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBRUEVMX0hfTE9BRCAgICAgICAlMiwgc3JjcSwgJTEsIDE1CisgICAgUVBFTF9IVl9DT01QVVRFICAgJTEsICUyLCBteCwgYWNrc3NkdworICAgIFNXQVAgICAgICAgICAgICAgbTEzLCBtMAorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgUVBFTF9IX0xPQUQgICAgICAgJTIsIHNyY3EsICUxLCAxNQorICAgIFFQRUxfSFZfQ09NUFVURSAgICUxLCAlMiwgbXgsIGFja3NzZHcKKyAgICBTV0FQICAgICAgICAgICAgIG0xNCwgbTAKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorLmxvb3AKKyAgICBRUEVMX0hfTE9BRCAgICAgICAlMiwgc3JjcSwgJTEsIDE1CisgICAgUVBFTF9IVl9DT01QVVRFICAgJTEsICUyLCBteCwgYWNrc3NkdworICAgIFNXQVAgICAgICAgICAgICAgbTE1LCBtMAorICAgIHB1bnBja2x3ZCAgICAgICAgIG0wLCBtOCwgbTkKKyAgICBwdW5wY2tsd2QgICAgICAgICBtMiwgbTEwLCBtMTEKKyAgICBwdW5wY2tsd2QgICAgICAgICBtNCwgbTEyLCBtMTMKKyAgICBwdW5wY2tsd2QgICAgICAgICBtNiwgbTE0LCBtMTUKKyVpZiAlMSA+IDQKKyAgICBwdW5wY2tod2QgICAgICAgICBtMSwgbTgsIG05CisgICAgcHVucGNraHdkICAgICAgICAgbTMsIG0xMCwgbTExCisgICAgcHVucGNraHdkICAgICAgICAgbTUsIG0xMiwgbTEzCisgICAgcHVucGNraHdkICAgICAgICAgbTcsIG0xNCwgbTE1CislZW5kaWYKKyAgICBRUEVMX0hWX0NPTVBVVEUgICAlMSwgMTQsIG15LCBhY2t1c2R3CisgICAgVU5JX0NPTVBVVEUgICAgICAgJTEsICUyLCBtMCwgbTEsIFtwd18lMl0KKyAgICBQRUxfJTJTVE9SRSUxICAgZHN0cSwgbTAsIG0xCisKKyVpZiAlMSA8PSA0CisgICAgbW92cSAgICAgICAgICAgICAgbTgsIG05CisgICAgbW92cSAgICAgICAgICAgICAgbTksIG0xMAorICAgIG1vdnEgICAgICAgICAgICAgbTEwLCBtMTEKKyAgICBtb3ZxICAgICAgICAgICAgIG0xMSwgbTEyCisgICAgbW92cSAgICAgICAgICAgICBtMTIsIG0xMworICAgIG1vdnEgICAgICAgICAgICAgbTEzLCBtMTQKKyAgICBtb3ZxICAgICAgICAgICAgIG0xNCwgbTE1CislZWxzZQorICAgIG1vdmRxYSAgICAgICAgICAgIG04LCBtOQorICAgIG1vdmRxYSAgICAgICAgICAgIG05LCBtMTAKKyAgICBtb3ZkcWEgICAgICAgICAgIG0xMCwgbTExCisgICAgbW92ZHFhICAgICAgICAgICBtMTEsIG0xMgorICAgIG1vdmRxYSAgICAgICAgICAgbTEyLCBtMTMKKyAgICBtb3ZkcWEgICAgICAgICAgIG0xMywgbTE0CisgICAgbW92ZHFhICAgICAgICAgICBtMTQsIG0xNQorJWVuZGlmCisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIGRzdHN0cmlkZXEgICAgICAgICAgICAgOyBkc3QgKz0gZHN0c3RyaWRlCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEgICAgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgZGVjICAgICAgICAgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbXAgaGVpZ2h0CisgICAgam56ICAgICAgICAgICAgICAgLmxvb3AgICAgICAgICAgICAgICAgICAgICAgOyBoZWlnaHQgbG9vcAorICAgIFJFVAorCitjZ2xvYmFsIGhldmNfcHV0X2hldmNfYmlfcXBlbF9odiUxXyUyLCA4LCAxMCwgMTYsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgc3JjMiwgaGVpZ2h0LCBteCwgbXksIHIzc3JjLCByZmlsdGVyCisgICAgbGVhICAgICAgICAgICAgICBteHEsIFtteHEqOC04XQorICAgIGxlYSAgICAgICAgICAgICAgbXlxLCBbbXlxKjgtOF0KKyAgICBsZWEgICAgICAgICAgIHIzc3JjcSwgW3NyY3N0cmlkZXEqM10KKyAgICBzdWIgICAgICAgICAgICAgc3JjcSwgcjNzcmNxCisgICAgUVBFTF9IX0xPQUQgICAgICAgJTIsIHNyY3EsICUxLCAxNQorICAgIFFQRUxfSFZfQ09NUFVURSAgICUxLCAlMiwgbXgsIGFja3NzZHcKKyAgICBTV0FQICAgICAgICAgICAgICBtOCwgbTAKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIFFQRUxfSF9MT0FEICAgICAgICUyLCBzcmNxLCAlMSwgMTUKKyAgICBRUEVMX0hWX0NPTVBVVEUgICAlMSwgJTIsIG14LCBhY2tzc2R3CisgICAgU1dBUCAgICAgICAgICAgICAgbTksIG0wCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBRUEVMX0hfTE9BRCAgICAgICAlMiwgc3JjcSwgJTEsIDE1CisgICAgUVBFTF9IVl9DT01QVVRFICAgJTEsICUyLCBteCwgYWNrc3NkdworICAgIFNXQVAgICAgICAgICAgICAgbTEwLCBtMAorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgUVBFTF9IX0xPQUQgICAgICAgJTIsIHNyY3EsICUxLCAxNQorICAgIFFQRUxfSFZfQ09NUFVURSAgICUxLCAlMiwgbXgsIGFja3NzZHcKKyAgICBTV0FQICAgICAgICAgICAgIG0xMSwgbTAKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIFFQRUxfSF9MT0FEICAgICAgICUyLCBzcmNxLCAlMSwgMTUKKyAgICBRUEVMX0hWX0NPTVBVVEUgICAlMSwgJTIsIG14LCBhY2tzc2R3CisgICAgU1dBUCAgICAgICAgICAgICBtMTIsIG0wCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBRUEVMX0hfTE9BRCAgICAgICAlMiwgc3JjcSwgJTEsIDE1CisgICAgUVBFTF9IVl9DT01QVVRFICAgJTEsICUyLCBteCwgYWNrc3NkdworICAgIFNXQVAgICAgICAgICAgICAgbTEzLCBtMAorICAgIGFkZCAgICAgICAgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgUVBFTF9IX0xPQUQgICAgICAgJTIsIHNyY3EsICUxLCAxNQorICAgIFFQRUxfSFZfQ09NUFVURSAgICUxLCAlMiwgbXgsIGFja3NzZHcKKyAgICBTV0FQICAgICAgICAgICAgIG0xNCwgbTAKKyAgICBhZGQgICAgICAgICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorLmxvb3AKKyAgICBRUEVMX0hfTE9BRCAgICAgICAlMiwgc3JjcSwgJTEsIDE1CisgICAgUVBFTF9IVl9DT01QVVRFICAgJTEsICUyLCBteCwgYWNrc3NkdworICAgIFNXQVAgICAgICAgICAgICAgbTE1LCBtMAorICAgIHB1bnBja2x3ZCAgICAgICAgIG0wLCBtOCwgbTkKKyAgICBwdW5wY2tsd2QgICAgICAgICBtMiwgbTEwLCBtMTEKKyAgICBwdW5wY2tsd2QgICAgICAgICBtNCwgbTEyLCBtMTMKKyAgICBwdW5wY2tsd2QgICAgICAgICBtNiwgbTE0LCBtMTUKKyVpZiAlMSA+IDQKKyAgICBwdW5wY2tod2QgICAgICAgICBtMSwgbTgsIG05CisgICAgcHVucGNraHdkICAgICAgICAgbTMsIG0xMCwgbTExCisgICAgcHVucGNraHdkICAgICAgICAgbTUsIG0xMiwgbTEzCisgICAgcHVucGNraHdkICAgICAgICAgbTcsIG0xNCwgbTE1CislZW5kaWYKKyAgICBRUEVMX0hWX0NPTVBVVEUgICAlMSwgMTQsIG15LCBhY2tzc2R3CisgICAgU0lNUExFX0JJTE9BRCAgICAgJTEsIHNyYzJxLCBtOCwgbTkgO205IG5vdCB1c2VkIGluIHRoaXMgY2FzZQorICAgIEJJX0NPTVBVVEUgICAgICAgICUxLCAlMiwgbTAsIG0xLCBtOCwgbTksIFtwd19iaV8lMl0KKyAgICBQRUxfJTJTVE9SRSUxICAgZHN0cSwgbTAsIG0xCisKKyVpZiAlMSA8PSA0CisgICAgbW92cSAgICAgICAgICAgICAgbTgsIG05CisgICAgbW92cSAgICAgICAgICAgICAgbTksIG0xMAorICAgIG1vdnEgICAgICAgICAgICAgbTEwLCBtMTEKKyAgICBtb3ZxICAgICAgICAgICAgIG0xMSwgbTEyCisgICAgbW92cSAgICAgICAgICAgICBtMTIsIG0xMworICAgIG1vdnEgICAgICAgICAgICAgbTEzLCBtMTQKKyAgICBtb3ZxICAgICAgICAgICAgIG0xNCwgbTE1CislZWxzZQorICAgIG1vdmRxYSAgICAgICAgICAgIG04LCBtOQorICAgIG1vdmRxYSAgICAgICAgICAgIG05LCBtMTAKKyAgICBtb3ZkcWEgICAgICAgICAgIG0xMCwgbTExCisgICAgbW92ZHFhICAgICAgICAgICBtMTEsIG0xMgorICAgIG1vdmRxYSAgICAgICAgICAgbTEyLCBtMTMKKyAgICBtb3ZkcWEgICAgICAgICAgIG0xMywgbTE0CisgICAgbW92ZHFhICAgICAgICAgICBtMTQsIG0xNQorJWVuZGlmCisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIGRzdHN0cmlkZXEgICAgICAgICAgICAgOyBkc3QgKz0gZHN0c3RyaWRlCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIHNyY3N0cmlkZXEgICAgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgYWRkICAgICAgICAgICAgc3JjMnEsIDIqTUFYX1BCX1NJWkUgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgZGVjICAgICAgICAgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbXAgaGVpZ2h0CisgICAgam56ICAgICAgICAgICAgICAgLmxvb3AgICAgICAgICAgICAgICAgICAgICAgOyBoZWlnaHQgbG9vcAorICAgIFJFVAorJWVuZG1hY3JvCisKKyVtYWNybyBXRUlHSFRJTkdfRlVOQ1MgMgorJWlmIFdJTjY0IHx8IEFSQ0hfWDg2XzMyCitjZ2xvYmFsIGhldmNfcHV0X2hldmNfdW5pX3clMV8lMiwgNCwgNSwgNywgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQsIGRlbm9tLCB3eCwgb3gKKyAgICBtb3YgICAgICAgICAgICAgcjRkLCBkZW5vbW0KKyVkZWZpbmUgU0hJRlQgIHI0ZAorJWVsc2UKK2NnbG9iYWwgaGV2Y19wdXRfaGV2Y191bmlfdyUxXyUyLCA2LCA2LCA3LCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgZGVub20sIHd4LCBveAorJWRlZmluZSBTSElGVCAgZGVub21kCislZW5kaWYKKyAgICBsZWEgICAgICAgICAgIFNISUZULCBbU0hJRlQrMTQtJTJdICAgICAgICAgIDsgc2hpZnQgPSAxNCAtIGJpdGQgKyBkZW5vbQorJWlmICUxIDw9IDQKKyAgICBweG9yICAgICAgICAgICAgIG0xLCBtMQorJWVuZGlmCisgICAgbW92ZCAgICAgICAgICAgICBtMiwgd3htICAgICAgICA7IFdYCisgICAgbW92ZCAgICAgICAgICAgICBtNCwgU0hJRlQgICAgICA7IHNoaWZ0CislaWYgJTEgPD0gNAorICAgIHB1bnBja2x3ZCAgICAgICAgbTIsIG0xCislZWxzZQorICAgIHB1bnBja2x3ZCAgICAgICAgbTIsIG0yCislZW5kaWYKKyAgICBkZWMgICAgICAgICAgIFNISUZUCisgICAgbW92ZHF1ICAgICAgICAgICBtNSwgW29uZV9wZXJfMzJdCisgICAgbW92ZCAgICAgICAgICAgICBtNiwgU0hJRlQKKyAgICBwc2h1ZmQgICAgICAgICAgIG0yLCBtMiwgMAorICAgIG1vdiAgICAgICAgICAgU0hJRlQsIG94bQorICAgIHBzbGxkICAgICAgICAgICAgbTUsIG02CislaWYgJTIgIT0gOAorICAgIHNobCAgICAgICAgICAgU0hJRlQsICUyLTggICAgICAgOyBveCA8PCAoYml0ZCAtIDgpCislZW5kaWYKKyAgICBtb3ZkICAgICAgICAgICAgIG0zLCBTSElGVCAgICAgIDsgT1gKKyAgICBwc2h1ZmQgICAgICAgICAgIG0zLCBtMywgMAorJWlmIFdJTjY0IHx8IEFSQ0hfWDg2XzMyCisgICAgbW92ICAgICAgICAgICBTSElGVCwgaGVpZ2h0bQorJWVuZGlmCisubG9vcAorICAgU0lNUExFX0xPQUQgICAgICAgICUxLCAxMCwgc3JjcSwgbTAKKyVpZiAlMSA8PSA0CisgICAgcHVucGNrbHdkICAgICAgICAgbTAsIG0xCisgICAgcG1hZGR3ZCAgICAgICAgICAgbTAsIG0yCisgICAgcGFkZGQgICAgICAgICAgICAgbTAsIG01CisgICAgcHNyYWQgICAgICAgICAgICAgbTAsIG00CisgICAgcGFkZGQgICAgICAgICAgICAgbTAsIG0zCislZWxzZQorICAgIHBtdWxodyAgICAgICAgICAgIG02LCBtMCwgbTIKKyAgICBwbXVsbHcgICAgICAgICAgICBtMCwgbTIKKyAgICBwdW5wY2tod2QgICAgICAgICBtMSwgbTAsIG02CisgICAgcHVucGNrbHdkICAgICAgICAgbTAsIG02CisgICAgcGFkZGQgICAgICAgICAgICAgbTAsIG01CisgICAgcGFkZGQgICAgICAgICAgICAgbTEsIG01CisgICAgcHNyYWQgICAgICAgICAgICAgbTAsIG00CisgICAgcHNyYWQgICAgICAgICAgICAgbTEsIG00CisgICAgcGFkZGQgICAgICAgICAgICAgbTAsIG0zCisgICAgcGFkZGQgICAgICAgICAgICAgbTEsIG0zCislZW5kaWYKKyAgICBwYWNrc3NkdyAgICAgICAgICBtMCwgbTEKKyVpZiAlMiA9PSA4CisgICAgcGFja3Vzd2IgICAgICAgICAgbTAsIG0wCislZWxzZQorICAgIHBtaW5zdyAgICAgICAgICAgIG0wLCBbbWF4X3BpeGVsc18lMl0KKyAgICBwbWF4c3cgICAgICAgICAgICBtMCwgW3plcm9dCislZW5kaWYKKyAgICBQRUxfJTJTVE9SRSUxICAgZHN0cSwgbTAsIG0xCisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIGRzdHN0cmlkZXEgICAgICAgICAgICAgOyBkc3QgKz0gZHN0c3RyaWRlCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIDIqTUFYX1BCX1NJWkUgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgZGVjICAgICAgICAgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbXAgaGVpZ2h0CisgICAgam56ICAgICAgICAgICAgICAgLmxvb3AgICAgICAgICAgICAgICAgICAgICAgOyBoZWlnaHQgbG9vcAorICAgIFJFVAorCitjZ2xvYmFsIGhldmNfcHV0X2hldmNfYmlfdyUxXyUyLCA1LCA3LCAxMCwgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBzcmMyLCBoZWlnaHQsIGRlbm9tLCB3eDAsIHd4MSwgb3gwLCBveDEKKyAgICBtb3YgICAgICAgICAgICAgIHI2ZCwgZGVub21tCislaWYgJTEgPD0gNAorICAgIHB4b3IgICAgICAgICAgICAgIG0xLCBtMQorJWVuZGlmCisgICAgbW92ZCAgICAgICAgICAgICAgbTIsIHd4MG0gICAgICAgICA7IFdYMAorICAgIGxlYSAgICAgICAgICAgICAgcjZkLCBbcjZkKzE0LSUyXSAgOyBzaGlmdCA9IDE0IC0gYml0ZCArIGRlbm9tCisgICAgbW92ZCAgICAgICAgICAgICAgbTMsIHd4MW0gICAgICAgICA7IFdYMQorICAgIG1vdmQgICAgICAgICAgICAgIG0wLCByNmQgICAgICAgICAgOyBzaGlmdAorJWlmICUxIDw9IDQKKyAgICBwdW5wY2tsd2QgICAgICAgICBtMiwgbTEKKyAgICBwdW5wY2tsd2QgICAgICAgICBtMywgbTEKKyVlbHNlCisgICAgcHVucGNrbHdkICAgICAgICAgbTIsIG0yCisgICAgcHVucGNrbHdkICAgICAgICAgbTMsIG0zCislZW5kaWYKKyAgICBpbmMgICAgICAgICAgICAgIHI2ZAorICAgIG1vdmQgICAgICAgICAgICAgIG01LCByNmQgICAgICAgICAgOyBzaGlmdCsxCisgICAgcHNodWZkICAgICAgICAgICAgbTIsIG0yLCAwCisgICAgbW92ICAgICAgICAgICAgICByNmQsIG94MG0KKyAgICBwc2h1ZmQgICAgICAgICAgICBtMywgbTMsIDAKKyAgICBhZGQgICAgICAgICAgICAgIHI2ZCwgb3gxbQorJWlmICUyICE9IDgKKyAgICBzaGwgICAgICAgICAgICAgIHI2ZCwgJTItOCAgICAgICAgIDsgb3ggPDwgKGJpdGQgLSA4KQorJWVuZGlmCisgICAgaW5jICAgICAgICAgICAgICByNmQKKyAgICBtb3ZkICAgICAgICAgICAgICBtNCwgcjZkICAgICAgICAgIDsgb2Zmc2V0CisgICAgcHNodWZkICAgICAgICAgICAgbTQsIG00LCAwCisgICAgbW92ICAgICAgICAgICAgICByNmQsIGhlaWdodG0KKyAgICBwc2xsZCAgICAgICAgICAgICBtNCwgbTAKKworLmxvb3AKKyAgIFNJTVBMRV9MT0FEICAgICAgICAlMSwgMTAsIHNyY3EsICBtMAorICAgU0lNUExFX0xPQUQgICAgICAgICUxLCAxMCwgc3JjMnEsIG04CislaWYgJTEgPD0gNAorICAgIHB1bnBja2x3ZCAgICAgICAgIG0wLCBtMQorICAgIHB1bnBja2x3ZCAgICAgICAgIG04LCBtMQorICAgIHBtYWRkd2QgICAgICAgICAgIG0wLCBtMworICAgIHBtYWRkd2QgICAgICAgICAgIG04LCBtMgorICAgIHBhZGRkICAgICAgICAgICAgIG0wLCBtNAorICAgIHBhZGRkICAgICAgICAgICAgIG0wLCBtOAorICAgIHBzcmFkICAgICAgICAgICAgIG0wLCBtNQorJWVsc2UKKyAgICBwbXVsaHcgICAgICAgICAgICBtNiwgbTAsIG0zCisgICAgcG11bGx3ICAgICAgICAgICAgbTAsIG0zCisgICAgcG11bGh3ICAgICAgICAgICAgbTcsIG04LCBtMgorICAgIHBtdWxsdyAgICAgICAgICAgIG04LCBtMgorICAgIHB1bnBja2h3ZCAgICAgICAgIG0xLCBtMCwgbTYKKyAgICBwdW5wY2tsd2QgICAgICAgICBtMCwgbTYKKyAgICBwdW5wY2tod2QgICAgICAgICBtOSwgbTgsIG03CisgICAgcHVucGNrbHdkICAgICAgICAgbTgsIG03CisgICAgcGFkZGQgICAgICAgICAgICAgbTAsIG04CisgICAgcGFkZGQgICAgICAgICAgICAgbTEsIG05CisgICAgcGFkZGQgICAgICAgICAgICAgbTAsIG00CisgICAgcGFkZGQgICAgICAgICAgICAgbTEsIG00CisgICAgcHNyYWQgICAgICAgICAgICAgbTAsIG01CisgICAgcHNyYWQgICAgICAgICAgICAgbTEsIG01CislZW5kaWYKKyAgICBwYWNrc3NkdyAgICAgICAgICBtMCwgbTEKKyVpZiAlMiA9PSA4CisgICAgcGFja3Vzd2IgICAgICAgICAgbTAsIG0wCislZWxzZQorICAgIHBtaW5zdyAgICAgICAgICAgIG0wLCBbbWF4X3BpeGVsc18lMl0KKyAgICBwbWF4c3cgICAgICAgICAgICBtMCwgW3plcm9dCislZW5kaWYKKyAgICBQRUxfJTJTVE9SRSUxICAgZHN0cSwgbTAsIG0xCisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIGRzdHN0cmlkZXEgICAgICAgICAgICAgOyBkc3QgKz0gZHN0c3RyaWRlCisgICAgYWRkICAgICAgICAgICAgIHNyY3EsIDIqTUFYX1BCX1NJWkUgICAgICAgICAgOyBzcmMgKz0gc3Jjc3RyaWRlCisgICAgYWRkICAgICAgICAgICAgc3JjMnEsIDIqTUFYX1BCX1NJWkUgICAgICAgICAgOyBzcmMyICs9IHNyY3N0cmlkZQorICAgIGRlYyAgICAgICAgICAgICAgcjZkICAgICAgICAgICAgICAgICAgICAgICAgIDsgY21wIGhlaWdodAorICAgIGpueiAgICAgICAgICAgICAgIC5sb29wICAgICAgICAgICAgICAgICAgICAgIDsgaGVpZ2h0IGxvb3AKKyAgICBSRVQKKyVlbmRtYWNybworCitXRUlHSFRJTkdfRlVOQ1MgMiwgOAorV0VJR0hUSU5HX0ZVTkNTIDQsIDgKK1dFSUdIVElOR19GVU5DUyA2LCA4CitXRUlHSFRJTkdfRlVOQ1MgOCwgOAorCitXRUlHSFRJTkdfRlVOQ1MgMiwgMTAKK1dFSUdIVElOR19GVU5DUyA0LCAxMAorV0VJR0hUSU5HX0ZVTkNTIDYsIDEwCitXRUlHSFRJTkdfRlVOQ1MgOCwgMTAKKworV0VJR0hUSU5HX0ZVTkNTIDIsIDEyCitXRUlHSFRJTkdfRlVOQ1MgNCwgMTIKK1dFSUdIVElOR19GVU5DUyA2LCAxMgorV0VJR0hUSU5HX0ZVTkNTIDgsIDEyCisKK0hFVkNfUFVUX0hFVkNfUEVMX1BJWEVMUyAgMiwgOAorSEVWQ19QVVRfSEVWQ19QRUxfUElYRUxTICA0LCA4CitIRVZDX1BVVF9IRVZDX1BFTF9QSVhFTFMgIDYsIDgKK0hFVkNfUFVUX0hFVkNfUEVMX1BJWEVMUyAgOCwgOAorSEVWQ19QVVRfSEVWQ19QRUxfUElYRUxTIDEyLCA4CitIRVZDX1BVVF9IRVZDX1BFTF9QSVhFTFMgMTYsIDgKKworSEVWQ19QVVRfSEVWQ19QRUxfUElYRUxTIDIsIDEwCitIRVZDX1BVVF9IRVZDX1BFTF9QSVhFTFMgNCwgMTAKK0hFVkNfUFVUX0hFVkNfUEVMX1BJWEVMUyA2LCAxMAorSEVWQ19QVVRfSEVWQ19QRUxfUElYRUxTIDgsIDEwCisKK0hFVkNfUFVUX0hFVkNfUEVMX1BJWEVMUyAyLCAxMgorSEVWQ19QVVRfSEVWQ19QRUxfUElYRUxTIDQsIDEyCitIRVZDX1BVVF9IRVZDX1BFTF9QSVhFTFMgNiwgMTIKK0hFVkNfUFVUX0hFVkNfUEVMX1BJWEVMUyA4LCAxMgorCitIRVZDX1BVVF9IRVZDX0VQRUwgMiwgIDgKK0hFVkNfUFVUX0hFVkNfRVBFTCA0LCAgOAorSEVWQ19QVVRfSEVWQ19FUEVMIDYsICA4CitIRVZDX1BVVF9IRVZDX0VQRUwgOCwgIDgKK0hFVkNfUFVUX0hFVkNfRVBFTCAxMiwgOAorSEVWQ19QVVRfSEVWQ19FUEVMIDE2LCA4CisKKworSEVWQ19QVVRfSEVWQ19FUEVMIDIsIDEwCitIRVZDX1BVVF9IRVZDX0VQRUwgNCwgMTAKK0hFVkNfUFVUX0hFVkNfRVBFTCA2LCAxMAorSEVWQ19QVVRfSEVWQ19FUEVMIDgsIDEwCisKK0hFVkNfUFVUX0hFVkNfRVBFTCAyLCAxMgorSEVWQ19QVVRfSEVWQ19FUEVMIDQsIDEyCitIRVZDX1BVVF9IRVZDX0VQRUwgNiwgMTIKK0hFVkNfUFVUX0hFVkNfRVBFTCA4LCAxMgorCitIRVZDX1BVVF9IRVZDX0VQRUxfSFYgMiwgIDgKK0hFVkNfUFVUX0hFVkNfRVBFTF9IViA0LCAgOAorSEVWQ19QVVRfSEVWQ19FUEVMX0hWIDYsICA4CitIRVZDX1BVVF9IRVZDX0VQRUxfSFYgOCwgIDgKKworSEVWQ19QVVRfSEVWQ19FUEVMX0hWIDIsIDEwCitIRVZDX1BVVF9IRVZDX0VQRUxfSFYgNCwgMTAKK0hFVkNfUFVUX0hFVkNfRVBFTF9IViA2LCAxMAorSEVWQ19QVVRfSEVWQ19FUEVMX0hWIDgsIDEwCisKK0hFVkNfUFVUX0hFVkNfRVBFTF9IViAyLCAxMgorSEVWQ19QVVRfSEVWQ19FUEVMX0hWIDQsIDEyCitIRVZDX1BVVF9IRVZDX0VQRUxfSFYgNiwgMTIKK0hFVkNfUFVUX0hFVkNfRVBFTF9IViA4LCAxMgorCitIRVZDX1BVVF9IRVZDX1FQRUwgNCwgIDgKK0hFVkNfUFVUX0hFVkNfUVBFTCA4LCAgOAorSEVWQ19QVVRfSEVWQ19RUEVMIDEyLCA4CitIRVZDX1BVVF9IRVZDX1FQRUwgMTYsIDgKKworSEVWQ19QVVRfSEVWQ19RUEVMIDQsIDEwCitIRVZDX1BVVF9IRVZDX1FQRUwgOCwgMTAKKworSEVWQ19QVVRfSEVWQ19RUEVMIDQsIDEyCitIRVZDX1BVVF9IRVZDX1FQRUwgOCwgMTIKKworSEVWQ19QVVRfSEVWQ19RUEVMX0hWIDIsIDgKK0hFVkNfUFVUX0hFVkNfUVBFTF9IViA0LCA4CitIRVZDX1BVVF9IRVZDX1FQRUxfSFYgNiwgOAorSEVWQ19QVVRfSEVWQ19RUEVMX0hWIDgsIDgKKworSEVWQ19QVVRfSEVWQ19RUEVMX0hWIDIsIDEwCitIRVZDX1BVVF9IRVZDX1FQRUxfSFYgNCwgMTAKK0hFVkNfUFVUX0hFVkNfUVBFTF9IViA2LCAxMAorSEVWQ19QVVRfSEVWQ19RUEVMX0hWIDgsIDEwCisKK0hFVkNfUFVUX0hFVkNfUVBFTF9IViAyLCAxMgorSEVWQ19QVVRfSEVWQ19RUEVMX0hWIDQsIDEyCitIRVZDX1BVVF9IRVZDX1FQRUxfSFYgNiwgMTIKK0hFVkNfUFVUX0hFVkNfUVBFTF9IViA4LCAxMgorCislZW5kaWYgOyBBUkNIX1g4Nl82NApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2hldmNfcmVzX2FkZC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaGV2Y19yZXNfYWRkLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGI4OGVlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2hldmNfcmVzX2FkZC5hc20KQEAgLTAsMCArMSwzODggQEAKKzsgLyoKKzsgKiBQcm92aWRlIFNJTUQgb3B0aW1pemF0aW9ucyBmb3IgdHJhbnNmb3JtX2FkZCBmdW5jdGlvbnMgZm9yIEhFVkMgZGVjb2RpbmcKKzsgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUGllcnJlLUVkb3VhcmQgTEVQRVJFCis7ICoKKzsgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7ICoKKzsgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyAqCis7ICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7ICoKKzsgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7ICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsgKi8KKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQSAzMgorbWF4X3BpeGVsc18xMDogICAgICAgICAgdGltZXMgMTYgIGR3ICgoMSA8PCAxMCktMSkKKworCitTRUNUSU9OIC50ZXh0CisKKzt0aGUgdHJfYWRkIG1hY3JvcyBhbmQgZnVuY3Rpb25zIHdlcmUgbGFyZ2VseSBpbnNwaXJlZCBieSB4MjY0IHByb2plY3QncyBjb2RlIGluIHRoZSBoMjY0X2lkY3QuYXNtIGZpbGUKKyVtYWNybyBUUl9BRERfTU1YXzRfOCAwCisgICAgbW92YSAgICAgICAgICAgICAgbTIsIFtyMV0KKyAgICBtb3ZhICAgICAgICAgICAgICBtNCwgW3IxKzhdCisgICAgcHhvciAgICAgICAgICAgICAgbTMsIG0zCisgICAgcHN1YncgICAgICAgICAgICAgbTMsIG0yCisgICAgcGFja3Vzd2IgICAgICAgICAgbTIsIG0yCisgICAgcGFja3Vzd2IgICAgICAgICAgbTMsIG0zCisgICAgcHhvciAgICAgICAgICAgICAgbTUsIG01CisgICAgcHN1YncgICAgICAgICAgICAgbTUsIG00CisgICAgcGFja3Vzd2IgICAgICAgICAgbTQsIG00CisgICAgcGFja3Vzd2IgICAgICAgICAgbTUsIG01CisKKyAgICBtb3ZoICAgICAgICAgICAgICBtMCwgW3IwICAgICBdCisgICAgbW92aCAgICAgICAgICAgICAgbTEsIFtyMCtyMiAgXQorICAgIHBhZGR1c2IgICAgICAgICAgIG0wLCBtMgorICAgIHBhZGR1c2IgICAgICAgICAgIG0xLCBtNAorICAgIHBzdWJ1c2IgICAgICAgICAgIG0wLCBtMworICAgIHBzdWJ1c2IgICAgICAgICAgIG0xLCBtNQorICAgIG1vdmggICAgICAgW3IwICAgICBdLCBtMAorICAgIG1vdmggICAgICAgW3IwK3IyICBdLCBtMQorJWVuZG1hY3JvCisKKworSU5JVF9NTVggbW14ZXh0Cis7IHZvaWQgZmZfaGV2Y190cmFuZm9ybV9hZGRfOF9tbXhleHQodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpCitjZ2xvYmFsIGhldmNfdHJhbnNmb3JtX2FkZDRfOCwgMywgNCwgNgorICAgIFRSX0FERF9NTVhfNF84CisgICAgYWRkICAgICAgICAgICAgICAgcjEsIDE2CisgICAgbGVhICAgICAgICAgICAgICAgcjAsIFtyMCtyMioyXQorICAgIFRSX0FERF9NTVhfNF84CisgICAgUkVUCisKKyVtYWNybyBUUl9BRERfU1NFXzhfOCAwCisgICAgcHhvciAgICAgICAgICAgICAgbTMsIG0zCisgICAgbW92YSAgICAgICAgICAgICAgbTQsIFtyMV0KKyAgICBtb3ZhICAgICAgICAgICAgICBtNiwgW3IxKzE2XQorICAgIG1vdmEgICAgICAgICAgICAgIG0wLCBbcjErMzJdCisgICAgbW92YSAgICAgICAgICAgICAgbTIsIFtyMSs0OF0KKyAgICBwc3VidyAgICAgICAgICAgICBtNSwgbTMsIG00CisgICAgcHN1YncgICAgICAgICAgICAgbTcsIG0zLCBtNgorICAgIHBzdWJ3ICAgICAgICAgICAgIG0xLCBtMywgbTAKKyAgICBwYWNrdXN3YiAgICAgICAgICBtNCwgbTAKKyAgICBwYWNrdXN3YiAgICAgICAgICBtNSwgbTEKKyAgICBwc3VidyAgICAgICAgICAgICBtMywgbTIKKyAgICBwYWNrdXN3YiAgICAgICAgICBtNiwgbTIKKyAgICBwYWNrdXN3YiAgICAgICAgICBtNywgbTMKKworICAgIG1vdnEgICAgICAgICAgICAgICAgbTAsIFtyMCAgICAgXQorICAgIG1vdnEgICAgICAgICAgICAgICAgbTEsIFtyMCtyMiAgXQorICAgIG1vdmhwcyAgICAgICAgICAgICAgbTAsIFtyMCtyMioyXQorICAgIG1vdmhwcyAgICAgICAgICAgICAgbTEsIFtyMCtyMyAgXQorICAgIHBhZGR1c2IgICAgICAgICAgICAgbTAsIG00CisgICAgcGFkZHVzYiAgICAgICAgICAgICBtMSwgbTYKKyAgICBwc3VidXNiICAgICAgICAgICAgIG0wLCBtNQorICAgIHBzdWJ1c2IgICAgICAgICAgICAgbTEsIG03CisgICAgbW92cSAgICAgICAgIFtyMCAgICAgXSwgbTAKKyAgICBtb3ZxICAgICAgICAgW3IwK3IyICBdLCBtMQorICAgIG1vdmhwcyAgICAgICBbcjArMipyMl0sIG0wCisgICAgbW92aHBzICAgICAgIFtyMCtyMyAgXSwgbTEKKyVlbmRtYWNybworCislbWFjcm8gVFJfQUREX1NTRV8xNl8zMl84IDMKKyAgICBtb3ZhICAgICAgICAgICAgIHhtMiwgW3IxKyUxICAgXQorICAgIG1vdmEgICAgICAgICAgICAgeG02LCBbcjErJTErMTZdCislaWYgY3B1ZmxhZyhhdngyKQorICAgIHZpbnNlcnRpMTI4ICAgICAgIG0yLCBtMiwgW3IxKyUxKzMyXSwgMQorICAgIHZpbnNlcnRpMTI4ICAgICAgIG02LCBtNiwgW3IxKyUxKzQ4XSwgMQorJWVuZGlmCislaWYgY3B1ZmxhZyhhdngpCisgICAgcHN1YncgICAgICAgICAgICAgbTEsIG0wLCBtMgorICAgIHBzdWJ3ICAgICAgICAgICAgIG01LCBtMCwgbTYKKyVlbHNlCisgICAgbW92YSAgICAgICAgICAgICAgbTEsIG0wCisgICAgbW92YSAgICAgICAgICAgICAgbTUsIG0wCisgICAgcHN1YncgICAgICAgICAgICAgbTEsIG0yCisgICAgcHN1YncgICAgICAgICAgICAgbTUsIG02CislZW5kaWYKKyAgICBwYWNrdXN3YiAgICAgICAgICBtMiwgbTYKKyAgICBwYWNrdXN3YiAgICAgICAgICBtMSwgbTUKKworICAgIG1vdmEgICAgICAgICAgICAgeG00LCBbcjErJTErbW1zaXplKjIgICBdCisgICAgbW92YSAgICAgICAgICAgICB4bTYsIFtyMSslMSttbXNpemUqMisxNl0KKyVpZiBjcHVmbGFnKGF2eDIpCisgICAgdmluc2VydGkxMjggICAgICAgbTQsIG00LCBbcjErJTErOTYgXSwgMQorICAgIHZpbnNlcnRpMTI4ICAgICAgIG02LCBtNiwgW3IxKyUxKzExMl0sIDEKKyVlbmRpZgorJWlmIGNwdWZsYWcoYXZ4KQorICAgIHBzdWJ3ICAgICAgICAgICAgIG0zLCBtMCwgbTQKKyAgICBwc3VidyAgICAgICAgICAgICBtNSwgbTAsIG02CislZWxzZQorICAgIG1vdmEgICAgICAgICAgICAgIG0zLCBtMAorICAgIG1vdmEgICAgICAgICAgICAgIG01LCBtMAorICAgIHBzdWJ3ICAgICAgICAgICAgIG0zLCBtNAorICAgIHBzdWJ3ICAgICAgICAgICAgIG01LCBtNgorJWVuZGlmCisgICAgcGFja3Vzd2IgICAgICAgICAgbTQsIG02CisgICAgcGFja3Vzd2IgICAgICAgICAgbTMsIG01CisKKyAgICBwYWRkdXNiICAgICAgICAgICBtMiwgWyUyXQorICAgIHBhZGR1c2IgICAgICAgICAgIG00LCBbJTNdCisgICAgcHN1YnVzYiAgICAgICAgICAgbTIsIG0xCisgICAgcHN1YnVzYiAgICAgICAgICAgbTQsIG0zCisgICAgbW92YSAgICAgICAgICAgIFslMl0sIG0yCisgICAgbW92YSAgICAgICAgICAgIFslM10sIG00CislZW5kbWFjcm8KKworCislbWFjcm8gVFJBTlNGT1JNX0FERF84IDAKKzsgdm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQ4XzhfPG9wdD4odWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpCitjZ2xvYmFsIGhldmNfdHJhbnNmb3JtX2FkZDhfOCwgMywgNCwgOAorICAgIGxlYSAgICAgICAgICAgICAgIHIzLCBbcjIqM10KKyAgICBUUl9BRERfU1NFXzhfOAorICAgIGFkZCAgICAgICAgICAgICAgIHIxLCA2NAorICAgIGxlYSAgICAgICAgICAgICAgIHIwLCBbcjArcjIqNF0KKyAgICBUUl9BRERfU1NFXzhfOAorICAgIFJFVAorCis7IHZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkMTZfOF88b3B0Pih1aW50OF90ICpkc3QsIGludDE2X3QgKmNvZWZmcywgcHRyZGlmZl90IHN0cmlkZSkKK2NnbG9iYWwgaGV2Y190cmFuc2Zvcm1fYWRkMTZfOCwgMywgNCwgNworICAgIHB4b3IgICAgICAgICAgICAgIG0wLCBtMAorICAgIGxlYSAgICAgICAgICAgICAgIHIzLCBbcjIqM10KKyAgICBUUl9BRERfU1NFXzE2XzMyXzggIDAsIHIwLCAgICAgIHIwK3IyCisgICAgVFJfQUREX1NTRV8xNl8zMl84IDY0LCByMCtyMioyLCByMCtyMworJXJlcCAzCisgICAgYWRkICAgICAgICAgICAgICAgIHIxLCAxMjgKKyAgICBsZWEgICAgICAgICAgICAgICAgcjAsIFtyMCtyMio0XQorICAgIFRSX0FERF9TU0VfMTZfMzJfOCAgMCwgcjAsICAgICAgcjArcjIKKyAgICBUUl9BRERfU1NFXzE2XzMyXzggNjQsIHIwK3IyKjIsIHIwK3IzCislZW5kcmVwCisgICAgUkVUCisKKzsgdm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQzMl84XzxvcHQ+KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKQorY2dsb2JhbCBoZXZjX3RyYW5zZm9ybV9hZGQzMl84LCAzLCA0LCA3CisgICAgcHhvciAgICAgICAgICAgICAgIG0wLCBtMAorICAgIFRSX0FERF9TU0VfMTZfMzJfOCAgMCwgcjAsICAgIHIwKzE2CisgICAgVFJfQUREX1NTRV8xNl8zMl84IDY0LCByMCtyMiwgcjArcjIrMTYKKyVyZXAgMTUKKyAgICBhZGQgICAgICAgICAgICAgICAgcjEsIDEyOAorICAgIGxlYSAgICAgICAgICAgICAgICByMCwgW3IwK3IyKjJdCisgICAgVFJfQUREX1NTRV8xNl8zMl84ICAwLCByMCwgICAgcjArMTYKKyAgICBUUl9BRERfU1NFXzE2XzMyXzggNjQsIHIwK3IyLCByMCtyMisxNgorJWVuZHJlcAorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK1RSQU5TRk9STV9BRERfOAorSU5JVF9YTU0gYXZ4CitUUkFOU0ZPUk1fQUREXzgKKworJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4MgorOyB2b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDMyXzhfYXZ4Mih1aW50OF90ICpkc3QsIGludDE2X3QgKmNvZWZmcywgcHRyZGlmZl90IHN0cmlkZSkKK2NnbG9iYWwgaGV2Y190cmFuc2Zvcm1fYWRkMzJfOCwgMywgNCwgNworICAgIHB4b3IgICAgICAgICAgICAgIG0wLCBtMAorICAgIGxlYSAgICAgICAgICAgICAgIHIzLCBbcjIqM10KKyAgICBUUl9BRERfU1NFXzE2XzMyXzggICAwLCByMCwgICAgICByMCtyMgorICAgIFRSX0FERF9TU0VfMTZfMzJfOCAxMjgsIHIwK3IyKjIsIHIwK3IzCislcmVwIDcKKyAgICBhZGQgICAgICAgICAgICAgICAgcjEsIDI1NgorICAgIGxlYSAgICAgICAgICAgICAgICByMCwgW3IwK3IyKjRdCisgICAgVFJfQUREX1NTRV8xNl8zMl84ICAgMCwgcjAsICAgICAgcjArcjIKKyAgICBUUl9BRERfU1NFXzE2XzMyXzggMTI4LCByMCtyMioyLCByMCtyMworJWVuZHJlcAorICAgIFJFVAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZF8xMChwaXhlbCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIFRSX0FERF9TU0VfOF8xMCA0CisgICAgbW92YSAgICAgICAgICAgICAgbTAsIFslNF0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMSwgWyU0KzE2XQorICAgIG1vdmEgICAgICAgICAgICAgIG0yLCBbJTQrMzJdCisgICAgbW92YSAgICAgICAgICAgICAgbTMsIFslNCs0OF0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMCwgWyUxKzAgICBdCisgICAgcGFkZHcgICAgICAgICAgICAgbTEsIFslMSslMiAgXQorICAgIHBhZGR3ICAgICAgICAgICAgIG0yLCBbJTErJTIqMl0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMywgWyUxKyUzICBdCisgICAgQ0xJUFcgICAgICAgICAgICAgbTAsIG00LCBtNQorICAgIENMSVBXICAgICAgICAgICAgIG0xLCBtNCwgbTUKKyAgICBDTElQVyAgICAgICAgICAgICBtMiwgbTQsIG01CisgICAgQ0xJUFcgICAgICAgICAgICAgbTMsIG00LCBtNQorICAgIG1vdmEgICAgICAgWyUxKzAgICBdLCBtMAorICAgIG1vdmEgICAgICAgWyUxKyUyICBdLCBtMQorICAgIG1vdmEgICAgICAgWyUxKyUyKjJdLCBtMgorICAgIG1vdmEgICAgICAgWyUxKyUzICBdLCBtMworJWVuZG1hY3JvCisKKyVtYWNybyBUUl9BRERfTU1YNF8xMCAzCisgICAgbW92YSAgICAgICAgICAgICAgbTAsIFslMSswICAgXQorICAgIG1vdmEgICAgICAgICAgICAgIG0xLCBbJTErJTIgIF0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMCwgWyUzXQorICAgIHBhZGR3ICAgICAgICAgICAgIG0xLCBbJTMrOF0KKyAgICBDTElQVyAgICAgICAgICAgICBtMCwgbTIsIG0zCisgICAgQ0xJUFcgICAgICAgICAgICAgbTEsIG0yLCBtMworICAgIG1vdmEgICAgICAgWyUxKzAgICBdLCBtMAorICAgIG1vdmEgICAgICAgWyUxKyUyICBdLCBtMQorJWVuZG1hY3JvCisKKyVtYWNybyBUUkFOU19BRERfU1NFXzE2XzEwIDMKKyAgICBtb3ZhICAgICAgICAgICAgICBtMCwgWyUzXQorICAgIG1vdmEgICAgICAgICAgICAgIG0xLCBbJTMrMTZdCisgICAgbW92YSAgICAgICAgICAgICAgbTIsIFslMyszMl0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMywgWyUzKzQ4XQorICAgIHBhZGR3ICAgICAgICAgICAgIG0wLCBbJTEgICAgICBdCisgICAgcGFkZHcgICAgICAgICAgICAgbTEsIFslMSsxNiAgIF0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMiwgWyUxKyUyICAgXQorICAgIHBhZGR3ICAgICAgICAgICAgIG0zLCBbJTErJTIrMTZdCisgICAgQ0xJUFcgICAgICAgICAgICAgbTAsIG00LCBtNQorICAgIENMSVBXICAgICAgICAgICAgIG0xLCBtNCwgbTUKKyAgICBDTElQVyAgICAgICAgICAgICBtMiwgbTQsIG01CisgICAgQ0xJUFcgICAgICAgICAgICAgbTMsIG00LCBtNQorICAgIG1vdmEgICAgICBbJTEgICAgICBdLCBtMAorICAgIG1vdmEgICAgICBbJTErMTYgICBdLCBtMQorICAgIG1vdmEgICAgICBbJTErJTIgICBdLCBtMgorICAgIG1vdmEgICAgICBbJTErJTIrMTZdLCBtMworJWVuZG1hY3JvCisKKyVtYWNybyBUUkFOU19BRERfU1NFXzMyXzEwIDIKKyAgICBtb3ZhICAgICAgICAgICAgICBtMCwgWyUyXQorICAgIG1vdmEgICAgICAgICAgICAgIG0xLCBbJTIrMTZdCisgICAgbW92YSAgICAgICAgICAgICAgbTIsIFslMiszMl0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMywgWyUyKzQ4XQorCisgICAgcGFkZHcgICAgICAgICAgICAgbTAsIFslMSAgIF0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMSwgWyUxKzE2XQorICAgIHBhZGR3ICAgICAgICAgICAgIG0yLCBbJTErMzJdCisgICAgcGFkZHcgICAgICAgICAgICAgbTMsIFslMSs0OF0KKyAgICBDTElQVyAgICAgICAgICAgICBtMCwgbTQsIG01CisgICAgQ0xJUFcgICAgICAgICAgICAgbTEsIG00LCBtNQorICAgIENMSVBXICAgICAgICAgICAgIG0yLCBtNCwgbTUKKyAgICBDTElQVyAgICAgICAgICAgICBtMywgbTQsIG01CisgICAgbW92YSAgICAgICAgIFslMSAgIF0sIG0wCisgICAgbW92YSAgICAgICAgIFslMSsxNl0sIG0xCisgICAgbW92YSAgICAgICAgIFslMSszMl0sIG0yCisgICAgbW92YSAgICAgICAgIFslMSs0OF0sIG0zCislZW5kbWFjcm8KKworJW1hY3JvIFRSQU5TX0FERDE2X0FWWDIgNAorICAgIG1vdmEgICAgICAgICAgICAgIG0wLCBbJTRdCisgICAgbW92YSAgICAgICAgICAgICAgbTEsIFslNCszMl0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMiwgWyU0KzY0XQorICAgIG1vdmEgICAgICAgICAgICAgIG0zLCBbJTQrOTZdCisKKyAgICBwYWRkdyAgICAgICAgICAgICBtMCwgWyUxKzAgICBdCisgICAgcGFkZHcgICAgICAgICAgICAgbTEsIFslMSslMiAgXQorICAgIHBhZGR3ICAgICAgICAgICAgIG0yLCBbJTErJTIqMl0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMywgWyUxKyUzICBdCisKKyAgICBDTElQVyAgICAgICAgICAgICBtMCwgbTQsIG01CisgICAgQ0xJUFcgICAgICAgICAgICAgbTEsIG00LCBtNQorICAgIENMSVBXICAgICAgICAgICAgIG0yLCBtNCwgbTUKKyAgICBDTElQVyAgICAgICAgICAgICBtMywgbTQsIG01CisgICAgbW92YSAgICAgICBbJTErMCAgIF0sIG0wCisgICAgbW92YSAgICAgICBbJTErJTIgIF0sIG0xCisgICAgbW92YSAgICAgICBbJTErJTIqMl0sIG0yCisgICAgbW92YSAgICAgICBbJTErJTMgIF0sIG0zCislZW5kbWFjcm8KKworJW1hY3JvIFRSQU5TX0FERDMyX0FWWDIgMworICAgIG1vdmEgICAgICAgICAgICAgIG0wLCBbJTNdCisgICAgbW92YSAgICAgICAgICAgICAgbTEsIFslMyszMl0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMiwgWyUzKzY0XQorICAgIG1vdmEgICAgICAgICAgICAgIG0zLCBbJTMrOTZdCisKKyAgICBwYWRkdyAgICAgICAgICAgICBtMCwgWyUxICAgICAgXQorICAgIHBhZGR3ICAgICAgICAgICAgIG0xLCBbJTErMzIgICBdCisgICAgcGFkZHcgICAgICAgICAgICAgbTIsIFslMSslMiAgIF0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMywgWyUxKyUyKzMyXQorCisgICAgQ0xJUFcgICAgICAgICAgICAgbTAsIG00LCBtNQorICAgIENMSVBXICAgICAgICAgICAgIG0xLCBtNCwgbTUKKyAgICBDTElQVyAgICAgICAgICAgICBtMiwgbTQsIG01CisgICAgQ0xJUFcgICAgICAgICAgICAgbTMsIG00LCBtNQorICAgIG1vdmEgICAgICBbJTEgICAgICBdLCBtMAorICAgIG1vdmEgICAgICBbJTErMzIgICBdLCBtMQorICAgIG1vdmEgICAgICBbJTErJTIgICBdLCBtMgorICAgIG1vdmEgICAgICBbJTErJTIrMzJdLCBtMworJWVuZG1hY3JvCisKKworSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIGhldmNfdHJhbnNmb3JtX2FkZDRfMTAsMyw0LCA2CisgICAgcHhvciAgICAgICAgICAgICAgbTIsIG0yCisgICAgbW92YSAgICAgICAgICAgICAgbTMsIFttYXhfcGl4ZWxzXzEwXQorICAgIFRSX0FERF9NTVg0XzEwICAgICByMCwgcjIsIHIxCisgICAgYWRkICAgICAgICAgICAgICAgcjEsIDE2CisgICAgbGVhICAgICAgICAgICAgICAgcjAsIFtyMCsyKnIyXQorICAgIFRSX0FERF9NTVg0XzEwICAgICByMCwgcjIsIHIxCisgICAgUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZF8xMChwaXhlbCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBoZXZjX3RyYW5zZm9ybV9hZGQ4XzEwLDMsNCw2CisgICAgcHhvciAgICAgICAgICAgICAgbTQsIG00CisgICAgbW92YSAgICAgICAgICAgICAgbTUsIFttYXhfcGl4ZWxzXzEwXQorICAgIGxlYSAgICAgICAgICAgICAgIHIzLCBbcjIqM10KKworICAgIFRSX0FERF9TU0VfOF8xMCAgICAgIHIwLCByMiwgcjMsIHIxCisgICAgbGVhICAgICAgICAgICAgICAgcjAsIFtyMCtyMio0XQorICAgIGFkZCAgICAgICAgICAgICAgIHIxLCA2NAorICAgIFRSX0FERF9TU0VfOF8xMCAgICAgIHIwLCByMiwgcjMsIHIxCisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y190cmFuc2Zvcm1fYWRkMTZfMTAsMyw0LDYKKyAgICBweG9yICAgICAgICAgICAgICBtNCwgbTQKKyAgICBtb3ZhICAgICAgICAgICAgICBtNSwgW21heF9waXhlbHNfMTBdCisKKyAgICBUUkFOU19BRERfU1NFXzE2XzEwIHIwLCByMiwgcjEKKyVyZXAgNworICAgIGxlYSAgICAgICAgICAgICAgICAgcjAsIFtyMCtyMioyXQorICAgIGFkZCAgICAgICAgICAgICAgICAgcjEsIDY0CisgICAgVFJBTlNfQUREX1NTRV8xNl8xMCByMCwgcjIsIHIxCislZW5kcmVwCisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y190cmFuc2Zvcm1fYWRkMzJfMTAsMyw0LDYKKyAgICBweG9yICAgICAgICAgICAgICBtNCwgbTQKKyAgICBtb3ZhICAgICAgICAgICAgICBtNSwgW21heF9waXhlbHNfMTBdCisKKyAgICBUUkFOU19BRERfU1NFXzMyXzEwIHIwLCByMQorJXJlcCAzMQorICAgIGxlYSAgICAgICAgICAgICAgICAgcjAsIFtyMCtyMl0KKyAgICBhZGQgICAgICAgICAgICAgICAgIHIxLCA2NAorICAgIFRSQU5TX0FERF9TU0VfMzJfMTAgcjAsIHIxCislZW5kcmVwCisgICAgUkVUCisKKyVpZiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKKworY2dsb2JhbCBoZXZjX3RyYW5zZm9ybV9hZGQxNl8xMCwzLDQsNgorICAgIHB4b3IgICAgICAgICAgICAgIG00LCBtNAorICAgIG1vdmEgICAgICAgICAgICAgIG01LCBbbWF4X3BpeGVsc18xMF0KKyAgICBsZWEgICAgICAgICAgICAgICByMywgW3IyKjNdCisKKyAgICBUUkFOU19BREQxNl9BVlgyICByMCwgcjIsIHIzLCByMQorJXJlcCAzCisgICAgbGVhICAgICAgICAgICAgICAgcjAsIFtyMCtyMio0XQorICAgIGFkZCAgICAgICAgICAgICAgIHIxLCAxMjgKKyAgICBUUkFOU19BREQxNl9BVlgyICByMCwgcjIsIHIzLCByMQorJWVuZHJlcAorICAgIFJFVAorCitjZ2xvYmFsIGhldmNfdHJhbnNmb3JtX2FkZDMyXzEwLDMsNCw2CisgICAgcHhvciAgICAgICAgICAgICAgbTQsIG00CisgICAgbW92YSAgICAgICAgICAgICAgbTUsIFttYXhfcGl4ZWxzXzEwXQorCisgICAgVFJBTlNfQUREMzJfQVZYMiAgcjAsIHIyLCByMQorJXJlcCAxNQorICAgIGxlYSAgICAgICAgICAgICAgIHIwLCBbcjArcjIqMl0KKyAgICBhZGQgICAgICAgICAgICAgICByMSwgMTI4CisgICAgVFJBTlNfQUREMzJfQVZYMiAgcjAsIHIyLCByMQorJWVuZHJlcAorICAgIFJFVAorJWVuZGlmIDtIQVZFX0FWWF9FWFRFUk5BTApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2hldmNkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oZXZjZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlYTE0MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9oZXZjZHNwLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBIRVZDIHZpZGVvIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIEd1aWxsYXVtZSBNYXJ0cmVzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgLSAyMDE0IFBpZXJyZS1FZG91YXJkIExlcGVyZQorICoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1g4Nl9IRVZDRFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19YODZfSEVWQ0RTUF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisjZGVmaW5lIGlkY3RfZGNfcHJvdG8oc2l6ZSwgYml0ZCwgb3B0KSBcCisgICAgICAgICAgICAgICAgdm9pZCBmZl9oZXZjX2lkY3QjI3NpemUjI19kY19hZGRfIyNiaXRkIyNfIyNvcHQodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpCisKKyNkZWZpbmUgUEVMX0xJTksoZHN0LCBpZHgxLCBpZHgyLCBpZHgzLCBuYW1lLCBELCBvcHQpIFwKK2RzdFtpZHgxXVtpZHgyXVtpZHgzXSA9IGZmX2hldmNfcHV0X2hldmNfICMjIG5hbWUgIyMgXyAjIyBEICMjIF8jI29wdDsgXAorZHN0ICMjIF9iaVtpZHgxXVtpZHgyXVtpZHgzXSA9IGZmX2hldmNfcHV0X2hldmNfYmlfICMjIG5hbWUgIyMgXyAjIyBEICMjIF8jI29wdDsgXAorZHN0ICMjIF91bmlbaWR4MV1baWR4Ml1baWR4M10gPSBmZl9oZXZjX3B1dF9oZXZjX3VuaV8gIyMgbmFtZSAjIyBfICMjIEQgIyMgXyMjb3B0OyBcCitkc3QgIyMgX3VuaV93W2lkeDFdW2lkeDJdW2lkeDNdID0gZmZfaGV2Y19wdXRfaGV2Y191bmlfd18gIyMgbmFtZSAjIyBfICMjIEQgIyMgXyMjb3B0OyBcCitkc3QgIyMgX2JpX3dbaWR4MV1baWR4Ml1baWR4M10gPSBmZl9oZXZjX3B1dF9oZXZjX2JpX3dfICMjIG5hbWUgIyMgXyAjIyBEICMjIF8jI29wdAorCisKKyNkZWZpbmUgUEVMX1BST1RPVFlQRShuYW1lLCBELCBvcHQpIFwKK3ZvaWQgZmZfaGV2Y19wdXRfaGV2Y18gIyMgbmFtZSAjIyBfICMjIEQgIyMgXyMjb3B0KGludDE2X3QgKmRzdCwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsIGludCBoZWlnaHQsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSxpbnQgd2lkdGgpOyBcCit2b2lkIGZmX2hldmNfcHV0X2hldmNfYmlfICMjIG5hbWUgIyMgXyAjIyBEICMjIF8jI29wdCh1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgX2RzdHN0cmlkZSwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsIGludDE2X3QgKnNyYzIsIGludCBoZWlnaHQsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKTsgXAordm9pZCBmZl9oZXZjX3B1dF9oZXZjX3VuaV8gIyMgbmFtZSAjIyBfICMjIEQgIyMgXyMjb3B0KHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpOyBcCit2b2lkIGZmX2hldmNfcHV0X2hldmNfdW5pX3dfICMjIG5hbWUgIyMgXyAjIyBEICMjIF8jI29wdCh1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgX2RzdHN0cmlkZSwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsIGludCBoZWlnaHQsIGludCBkZW5vbSwgaW50IHd4LCBpbnQgb3gsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKTsgXAordm9pZCBmZl9oZXZjX3B1dF9oZXZjX2JpX3dfICMjIG5hbWUgIyMgXyAjIyBEICMjIF8jI29wdCh1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgX2RzdHN0cmlkZSwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsIGludDE2X3QgKnNyYzIsIGludCBoZWlnaHQsIGludCBkZW5vbSwgaW50IHd4MCwgaW50IHd4MSwgaW50IG94MCwgaW50IG94MSwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTUMgZnVuY3Rpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgRVBFTF9QUk9UT1RZUEVTKGZuYW1lLCBiaXRkLCBvcHQpIFwKKyAgICAgICAgUEVMX1BST1RPVFlQRShmbmFtZSMjNCwgIGJpdGQsIG9wdCk7IFwKKyAgICAgICAgUEVMX1BST1RPVFlQRShmbmFtZSMjNiwgIGJpdGQsIG9wdCk7IFwKKyAgICAgICAgUEVMX1BST1RPVFlQRShmbmFtZSMjOCwgIGJpdGQsIG9wdCk7IFwKKyAgICAgICAgUEVMX1BST1RPVFlQRShmbmFtZSMjMTIsIGJpdGQsIG9wdCk7IFwKKyAgICAgICAgUEVMX1BST1RPVFlQRShmbmFtZSMjMTYsIGJpdGQsIG9wdCk7IFwKKyAgICAgICAgUEVMX1BST1RPVFlQRShmbmFtZSMjMjQsIGJpdGQsIG9wdCk7IFwKKyAgICAgICAgUEVMX1BST1RPVFlQRShmbmFtZSMjMzIsIGJpdGQsIG9wdCk7IFwKKyAgICAgICAgUEVMX1BST1RPVFlQRShmbmFtZSMjNDgsIGJpdGQsIG9wdCk7IFwKKyAgICAgICAgUEVMX1BST1RPVFlQRShmbmFtZSMjNjQsIGJpdGQsIG9wdCkKKworI2RlZmluZSBRUEVMX1BST1RPVFlQRVMoZm5hbWUsIGJpdGQsIG9wdCkgXAorICAgICAgICBQRUxfUFJPVE9UWVBFKGZuYW1lIyM0LCAgYml0ZCwgb3B0KTsgXAorICAgICAgICBQRUxfUFJPVE9UWVBFKGZuYW1lIyM4LCAgYml0ZCwgb3B0KTsgXAorICAgICAgICBQRUxfUFJPVE9UWVBFKGZuYW1lIyMxMiwgYml0ZCwgb3B0KTsgXAorICAgICAgICBQRUxfUFJPVE9UWVBFKGZuYW1lIyMxNiwgYml0ZCwgb3B0KTsgXAorICAgICAgICBQRUxfUFJPVE9UWVBFKGZuYW1lIyMyNCwgYml0ZCwgb3B0KTsgXAorICAgICAgICBQRUxfUFJPVE9UWVBFKGZuYW1lIyMzMiwgYml0ZCwgb3B0KTsgXAorICAgICAgICBQRUxfUFJPVE9UWVBFKGZuYW1lIyM0OCwgYml0ZCwgb3B0KTsgXAorICAgICAgICBQRUxfUFJPVE9UWVBFKGZuYW1lIyM2NCwgYml0ZCwgb3B0KQorCisjZGVmaW5lIFdFSUdIVElOR19QUk9UT1RZUEUod2lkdGgsIGJpdGQsIG9wdCkgXAordm9pZCBmZl9oZXZjX3B1dF9oZXZjX3VuaV93IyN3aWR0aCMjXyMjYml0ZCMjXyMjb3B0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgaW50MTZfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsIGludCBoZWlnaHQsIGludCBkZW5vbSwgIGludCBfd3gsIGludCBfb3gpOyBcCit2b2lkIGZmX2hldmNfcHV0X2hldmNfYmlfdyMjd2lkdGgjI18jI2JpdGQjI18jI29wdCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIGludDE2X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLCBpbnQxNl90ICpfc3JjMiwgaW50IGhlaWdodCwgaW50IGRlbm9tLCAgaW50IF93eDAsICBpbnQgX3d4MSwgaW50IF9veDAsIGludCBfb3gxKQorCisjZGVmaW5lIFdFSUdIVElOR19QUk9UT1RZUEVTKGJpdGQsIG9wdCkgXAorICAgICAgICBXRUlHSFRJTkdfUFJPVE9UWVBFKDIsIGJpdGQsIG9wdCk7IFwKKyAgICAgICAgV0VJR0hUSU5HX1BST1RPVFlQRSg0LCBiaXRkLCBvcHQpOyBcCisgICAgICAgIFdFSUdIVElOR19QUk9UT1RZUEUoNiwgYml0ZCwgb3B0KTsgXAorICAgICAgICBXRUlHSFRJTkdfUFJPVE9UWVBFKDgsIGJpdGQsIG9wdCk7IFwKKyAgICAgICAgV0VJR0hUSU5HX1BST1RPVFlQRSgxMiwgYml0ZCwgb3B0KTsgXAorICAgICAgICBXRUlHSFRJTkdfUFJPVE9UWVBFKDE2LCBiaXRkLCBvcHQpOyBcCisgICAgICAgIFdFSUdIVElOR19QUk9UT1RZUEUoMjQsIGJpdGQsIG9wdCk7IFwKKyAgICAgICAgV0VJR0hUSU5HX1BST1RPVFlQRSgzMiwgYml0ZCwgb3B0KTsgXAorICAgICAgICBXRUlHSFRJTkdfUFJPVE9UWVBFKDQ4LCBiaXRkLCBvcHQpOyBcCisgICAgICAgIFdFSUdIVElOR19QUk9UT1RZUEUoNjQsIGJpdGQsIG9wdCkKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBRUEVMX1BJWEVMUyBFUEVMX1BJWEVMUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworRVBFTF9QUk9UT1RZUEVTKHBlbF9waXhlbHMgLCAgOCwgc3NlNCk7CitFUEVMX1BST1RPVFlQRVMocGVsX3BpeGVscyAsIDEwLCBzc2U0KTsKK0VQRUxfUFJPVE9UWVBFUyhwZWxfcGl4ZWxzICwgMTIsIHNzZTQpOworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRVBFTAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworRVBFTF9QUk9UT1RZUEVTKGVwZWxfaCAsICA4LCBzc2U0KTsKK0VQRUxfUFJPVE9UWVBFUyhlcGVsX2ggLCAxMCwgc3NlNCk7CitFUEVMX1BST1RPVFlQRVMoZXBlbF9oICwgMTIsIHNzZTQpOworCitFUEVMX1BST1RPVFlQRVMoZXBlbF92ICwgIDgsIHNzZTQpOworRVBFTF9QUk9UT1RZUEVTKGVwZWxfdiAsIDEwLCBzc2U0KTsKK0VQRUxfUFJPVE9UWVBFUyhlcGVsX3YgLCAxMiwgc3NlNCk7CisKK0VQRUxfUFJPVE9UWVBFUyhlcGVsX2h2ICwgIDgsIHNzZTQpOworRVBFTF9QUk9UT1RZUEVTKGVwZWxfaHYgLCAxMCwgc3NlNCk7CitFUEVMX1BST1RPVFlQRVMoZXBlbF9odiAsIDEyLCBzc2U0KTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUVBFTAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUVBFTF9QUk9UT1RZUEVTKHFwZWxfaCAsICA4LCBzc2U0KTsKK1FQRUxfUFJPVE9UWVBFUyhxcGVsX2ggLCAxMCwgc3NlNCk7CitRUEVMX1BST1RPVFlQRVMocXBlbF9oICwgMTIsIHNzZTQpOworCitRUEVMX1BST1RPVFlQRVMocXBlbF92LCAgOCwgc3NlNCk7CitRUEVMX1BST1RPVFlQRVMocXBlbF92LCAxMCwgc3NlNCk7CitRUEVMX1BST1RPVFlQRVMocXBlbF92LCAxMiwgc3NlNCk7CisKK1FQRUxfUFJPVE9UWVBFUyhxcGVsX2h2LCAgOCwgc3NlNCk7CitRUEVMX1BST1RPVFlQRVMocXBlbF9odiwgMTAsIHNzZTQpOworUVBFTF9QUk9UT1RZUEVTKHFwZWxfaHYsIDEyLCBzc2U0KTsKKworCitXRUlHSFRJTkdfUFJPVE9UWVBFUyg4LCBzc2U0KTsKK1dFSUdIVElOR19QUk9UT1RZUEVTKDEwLCBzc2U0KTsKK1dFSUdIVElOR19QUk9UT1RZUEVTKDEyLCBzc2U0KTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFJBTlNGT1JNX0FERAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwordm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQ0XzhfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkOF84X3NzZTIodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQxNl84X3NzZTIodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQzMl84X3NzZTIodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpOworCit2b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDhfOF9hdngodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQxNl84X2F2eCh1aW50OF90ICpkc3QsIGludDE2X3QgKmNvZWZmcywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDMyXzhfYXZ4KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKwordm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQzMl84X2F2eDIodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpOworCit2b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDRfMTBfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkOF8xMF9zc2UyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkMTZfMTBfc3NlMih1aW50OF90ICpkc3QsIGludDE2X3QgKmNvZWZmcywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDMyXzEwX3NzZTIodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpOworCit2b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDE2XzEwX2F2eDIodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQzMl8xMF9hdngyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKworI2VuZGlmIC8vIEFWQ09ERUNfWDg2X0hFVkNEU1BfSApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2hldmNkc3BfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2hldmNkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYTk3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaGV2Y2RzcF9pbml0LmMKQEAgLTAsMCArMSw2NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgU2VwcG8gVG9tcGVyaQorICogQ29weXJpZ2h0IChjKSAyMDEzIC0gMjAxNCBQaWVycmUtRWRvdWFyZCBMZXBlcmUKKyAqCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIgLyogcmVxdWlyZWQgZm9yIGhldmNkc3AuaCBHZXRCaXRDb250ZXh0ICovCisjaW5jbHVkZSAibGliYXZjb2RlYy9oZXZjZHNwLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy94ODYvaGV2Y2RzcC5oIgorCisjZGVmaW5lIExGQ19GVU5DKERJUiwgREVQVEgsIE9QVCkgXAordm9pZCBmZl9oZXZjXyAjIyBESVIgIyMgX2xvb3BfZmlsdGVyX2Nocm9tYV8gIyMgREVQVEggIyMgXyAjIyBPUFQodWludDhfdCAqcGl4LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgKnRjLCB1aW50OF90ICpub19wLCB1aW50OF90ICpub19xKTsKKworI2RlZmluZSBMRkxfRlVOQyhESVIsIERFUFRILCBPUFQpIFwKK3ZvaWQgZmZfaGV2Y18gIyMgRElSICMjIF9sb29wX2ZpbHRlcl9sdW1hXyAjIyBERVBUSCAjIyBfICMjIE9QVCh1aW50OF90ICpwaXgsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBiZXRhLCBpbnQgKnRjLCB1aW50OF90ICpub19wLCB1aW50OF90ICpub19xKTsKKworI2RlZmluZSBMRkNfRlVOQ1ModHlwZSwgZGVwdGgsIG9wdCkgXAorICAgIExGQ19GVU5DKGgsIGRlcHRoLCBvcHQpICBcCisgICAgTEZDX0ZVTkModiwgZGVwdGgsIG9wdCkKKworI2RlZmluZSBMRkxfRlVOQ1ModHlwZSwgZGVwdGgsIG9wdCkgXAorICAgIExGTF9GVU5DKGgsIGRlcHRoLCBvcHQpICBcCisgICAgTEZMX0ZVTkModiwgZGVwdGgsIG9wdCkKKworTEZDX0ZVTkNTKHVpbnQ4X3QsICAgOCwgc3NlMikKK0xGQ19GVU5DUyh1aW50OF90LCAgMTAsIHNzZTIpCitMRkNfRlVOQ1ModWludDhfdCwgIDEyLCBzc2UyKQorTEZDX0ZVTkNTKHVpbnQ4X3QsICAgOCwgYXZ4KQorTEZDX0ZVTkNTKHVpbnQ4X3QsICAxMCwgYXZ4KQorTEZDX0ZVTkNTKHVpbnQ4X3QsICAxMiwgYXZ4KQorTEZMX0ZVTkNTKHVpbnQ4X3QsICAgOCwgc3NlMikKK0xGTF9GVU5DUyh1aW50OF90LCAgMTAsIHNzZTIpCitMRkxfRlVOQ1ModWludDhfdCwgIDEyLCBzc2UyKQorTEZMX0ZVTkNTKHVpbnQ4X3QsICAgOCwgc3NzZTMpCitMRkxfRlVOQ1ModWludDhfdCwgIDEwLCBzc3NlMykKK0xGTF9GVU5DUyh1aW50OF90LCAgMTIsIHNzc2UzKQorTEZMX0ZVTkNTKHVpbnQ4X3QsICAgOCwgYXZ4KQorTEZMX0ZVTkNTKHVpbnQ4X3QsICAxMCwgYXZ4KQorTEZMX0ZVTkNTKHVpbnQ4X3QsICAxMiwgYXZ4KQorCisjZGVmaW5lIElEQ1RfRlVOQ1MoVywgb3B0KSBcCit2b2lkIGZmX2hldmNfaWRjdCMjVyMjX2RjXzhfIyNvcHQoaW50MTZfdCAqY29lZmZzKTsgXAordm9pZCBmZl9oZXZjX2lkY3QjI1cjI19kY18xMF8jI29wdChpbnQxNl90ICpjb2VmZnMpOyBcCit2b2lkIGZmX2hldmNfaWRjdCMjVyMjX2RjXzEyXyMjb3B0KGludDE2X3QgKmNvZWZmcykKKworSURDVF9GVU5DUyg0eDQsICAgbW14ZXh0KTsKK0lEQ1RfRlVOQ1MoOHg4LCAgIG1teGV4dCk7CitJRENUX0ZVTkNTKDh4OCwgICBzc2UyKTsKK0lEQ1RfRlVOQ1MoMTZ4MTYsIHNzZTIpOworSURDVF9GVU5DUygzMngzMiwgc3NlMik7CitJRENUX0ZVTkNTKDE2eDE2LCBhdngyKTsKK0lEQ1RfRlVOQ1MoMzJ4MzIsIGF2eDIpOworCisjZGVmaW5lIG1jX3JlcF9mdW5jKG5hbWUsIGJpdGQsIHN0ZXAsIFcsIG9wdCkgXAordm9pZCBmZl9oZXZjX3B1dF9oZXZjXyMjbmFtZSMjVyMjXyMjYml0ZCMjXyMjb3B0KGludDE2X3QgKl9kc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLCBpbnQgaGVpZ2h0LCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCAqc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDE2X3QgKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgVzsgaSArPSBzdGVwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNyYyAgPSBfc3JjICsgKGkgKiAoKGJpdGQgKyA3KSAvIDgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3QgPSBfZHN0ICsgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmZfaGV2Y19wdXRfaGV2Y18jI25hbWUjI3N0ZXAjI18jI2JpdGQjI18jI29wdChkc3QsIHNyYywgX3NyY3N0cmlkZSwgaGVpZ2h0LCBteCwgbXksIHdpZHRoKTsgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBtY19yZXBfdW5pX2Z1bmMobmFtZSwgYml0ZCwgc3RlcCwgVywgb3B0KSBcCit2b2lkIGZmX2hldmNfcHV0X2hldmNfdW5pXyMjbmFtZSMjVyMjXyMjYml0ZCMjXyMjb3B0KHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLCBpbnQgaGVpZ2h0LCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCAqZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBXOyBpICs9IHN0ZXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjID0gX3NyYyArIChpICogKChiaXRkICsgNykgLyA4KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdCA9IF9kc3QgKyAoaSAqICgoYml0ZCArIDcpIC8gOCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmZl9oZXZjX3B1dF9oZXZjX3VuaV8jI25hbWUjI3N0ZXAjI18jI2JpdGQjI18jI29wdChkc3QsIGRzdHN0cmlkZSwgc3JjLCBfc3Jjc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIG14LCBteSwgd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBtY19yZXBfYmlfZnVuYyhuYW1lLCBiaXRkLCBzdGVwLCBXLCBvcHQpIFwKK3ZvaWQgZmZfaGV2Y19wdXRfaGV2Y19iaV8jI25hbWUjI1cjI18jI2JpdGQjI18jI29wdCh1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpfc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgX3NyY3N0cmlkZSwgaW50MTZfdCogX3NyYzIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50cHRyX3QgbXgsIGludHB0cl90IG15LCBpbnQgd2lkdGgpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgICpzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICAqZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MTZfdCAgKnNyYzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBXIDsgaSArPSBzdGVwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjICA9IF9zcmMgKyAoaSAqICgoYml0ZCArIDcpIC8gOCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdCAgPSBfZHN0ICsgKGkgKiAoKGJpdGQgKyA3KSAvIDgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmMyID0gX3NyYzIgKyBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmZfaGV2Y19wdXRfaGV2Y19iaV8jI25hbWUjI3N0ZXAjI18jI2JpdGQjI18jI29wdChkc3QsIGRzdHN0cmlkZSwgc3JjLCBfc3Jjc3RyaWRlLCBzcmMyLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBteCwgbXksIHdpZHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBtY19yZXBfZnVuY3MobmFtZSwgYml0ZCwgc3RlcCwgVywgb3B0KSAgICAgICAgXAorICAgIG1jX3JlcF9mdW5jKG5hbWUsIGJpdGQsIHN0ZXAsIFcsIG9wdCk7ICAgICAgICAgICAgXAorICAgIG1jX3JlcF91bmlfZnVuYyhuYW1lLCBiaXRkLCBzdGVwLCBXLCBvcHQpOyAgICAgICAgXAorICAgIG1jX3JlcF9iaV9mdW5jKG5hbWUsIGJpdGQsIHN0ZXAsIFcsIG9wdCkKKworI2RlZmluZSBtY19yZXBfZnVuYzIobmFtZSwgYml0ZCwgc3RlcDEsIHN0ZXAyLCBXLCBvcHQpIFwKK3ZvaWQgZmZfaGV2Y19wdXRfaGV2Y18jI25hbWUjI1cjI18jI2JpdGQjI18jI29wdChpbnQxNl90ICpkc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgX3NyY3N0cmlkZSwgaW50IGhlaWdodCwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmZfaGV2Y19wdXRfaGV2Y18jI25hbWUjI3N0ZXAxIyNfIyNiaXRkIyNfIyNvcHQoZHN0LCBzcmMsIF9zcmNzdHJpZGUsIGhlaWdodCwgbXgsIG15LCB3aWR0aCk7ICAgICAgICAgICAgICAgXAorICAgIGZmX2hldmNfcHV0X2hldmNfIyNuYW1lIyNzdGVwMiMjXyMjYml0ZCMjXyMjb3B0KGRzdCArIHN0ZXAxLCBzcmMgKyAoc3RlcDEgKiAoKGJpdGQgKyA3KSAvIDgpKSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCBteSwgd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIG1jX3JlcF91bmlfZnVuYzIobmFtZSwgYml0ZCwgc3RlcDEsIHN0ZXAyLCBXLCBvcHQpIFwKK3ZvaWQgZmZfaGV2Y19wdXRfaGV2Y191bmlfIyNuYW1lIyNXIyNfIyNiaXRkIyNfIyNvcHQodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsIGludCBoZWlnaHQsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmZfaGV2Y19wdXRfaGV2Y191bmlfIyNuYW1lIyNzdGVwMSMjXyMjYml0ZCMjXyMjb3B0KGRzdCwgZHN0c3RyaWRlLCBzcmMsIF9zcmNzdHJpZGUsIGhlaWdodCwgbXgsIG15LCB3aWR0aCk7XAorICAgIGZmX2hldmNfcHV0X2hldmNfdW5pXyMjbmFtZSMjc3RlcDIjI18jI2JpdGQjI18jI29wdChkc3QgKyAoc3RlcDEgKiAoKGJpdGQgKyA3KSAvIDgpKSwgZHN0c3RyaWRlLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgKHN0ZXAxICogKChiaXRkICsgNykgLyA4KSksIF9zcmNzdHJpZGUsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgbXgsIG15LCB3aWR0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBtY19yZXBfYmlfZnVuYzIobmFtZSwgYml0ZCwgc3RlcDEsIHN0ZXAyLCBXLCBvcHQpIFwKK3ZvaWQgZmZfaGV2Y19wdXRfaGV2Y19iaV8jI25hbWUjI1cjI18jI2JpdGQjI18jI29wdCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IF9zcmNzdHJpZGUsIGludDE2X3QqIHNyYzIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmZfaGV2Y19wdXRfaGV2Y19iaV8jI25hbWUjI3N0ZXAxIyNfIyNiaXRkIyNfIyNvcHQoZHN0LCBkc3RzdHJpZGUsIHNyYywgX3NyY3N0cmlkZSwgc3JjMiwgaGVpZ2h0LCBteCwgbXksIHdpZHRoKTtcCisgICAgZmZfaGV2Y19wdXRfaGV2Y19iaV8jI25hbWUjI3N0ZXAyIyNfIyNiaXRkIyNfIyNvcHQoZHN0ICsgKHN0ZXAxICogKChiaXRkICsgNykgLyA4KSksIGRzdHN0cmlkZSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyArIChzdGVwMSAqICgoYml0ZCArIDcpIC8gOCkpLCBfc3Jjc3RyaWRlLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyICsgc3RlcDEsIGhlaWdodCwgbXgsIG15LCB3aWR0aCk7ICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgbWNfcmVwX2Z1bmNzKG5hbWUsIGJpdGQsIHN0ZXAsIFcsIG9wdCkgICAgICAgIFwKKyAgICBtY19yZXBfZnVuYyhuYW1lLCBiaXRkLCBzdGVwLCBXLCBvcHQpOyAgICAgICAgICAgIFwKKyAgICBtY19yZXBfdW5pX2Z1bmMobmFtZSwgYml0ZCwgc3RlcCwgVywgb3B0KTsgICAgICAgIFwKKyAgICBtY19yZXBfYmlfZnVuYyhuYW1lLCBiaXRkLCBzdGVwLCBXLCBvcHQpCisKKyNkZWZpbmUgbWNfcmVwX2Z1bmNzMihuYW1lLCBiaXRkLCBzdGVwMSwgc3RlcDIsIFcsIG9wdCkgXAorICAgIG1jX3JlcF9mdW5jMihuYW1lLCBiaXRkLCBzdGVwMSwgc3RlcDIsIFcsIG9wdCk7ICAgICBcCisgICAgbWNfcmVwX3VuaV9mdW5jMihuYW1lLCBiaXRkLCBzdGVwMSwgc3RlcDIsIFcsIG9wdCk7IFwKKyAgICBtY19yZXBfYmlfZnVuYzIobmFtZSwgYml0ZCwgc3RlcDEsIHN0ZXAyLCBXLCBvcHQpCisKKyNpZiBBUkNIX1g4Nl82NCAmJiBIQVZFX1NTRTRfRVhURVJOQUwKKworbWNfcmVwX2Z1bmNzKHBlbF9waXhlbHMsIDgsIDE2LCA2NCwgc3NlNCk7CittY19yZXBfZnVuY3MocGVsX3BpeGVscywgOCwgMTYsIDQ4LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhwZWxfcGl4ZWxzLCA4LCAxNiwgMzIsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHBlbF9waXhlbHMsIDgsICA4LCAyNCwgc3NlNCk7CittY19yZXBfZnVuY3MocGVsX3BpeGVscywxMCwgIDgsIDY0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhwZWxfcGl4ZWxzLDEwLCAgOCwgNDgsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHBlbF9waXhlbHMsMTAsICA4LCAzMiwgc3NlNCk7CittY19yZXBfZnVuY3MocGVsX3BpeGVscywxMCwgIDgsIDI0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhwZWxfcGl4ZWxzLDEwLCAgOCwgMTYsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHBlbF9waXhlbHMsMTAsICA0LCAxMiwgc3NlNCk7CittY19yZXBfZnVuY3MocGVsX3BpeGVscywxMiwgIDgsIDY0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhwZWxfcGl4ZWxzLDEyLCAgOCwgNDgsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHBlbF9waXhlbHMsMTIsICA4LCAzMiwgc3NlNCk7CittY19yZXBfZnVuY3MocGVsX3BpeGVscywxMiwgIDgsIDI0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhwZWxfcGl4ZWxzLDEyLCAgOCwgMTYsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHBlbF9waXhlbHMsMTIsICA0LCAxMiwgc3NlNCk7CisKK21jX3JlcF9mdW5jcyhlcGVsX2gsIDgsIDE2LCA2NCwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF9oLCA4LCAxNiwgNDgsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfaCwgOCwgMTYsIDMyLCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX2gsIDgsICA4LCAyNCwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF9oLDEwLCAgOCwgNjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfaCwxMCwgIDgsIDQ4LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX2gsMTAsICA4LCAzMiwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF9oLDEwLCAgOCwgMjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfaCwxMCwgIDgsIDE2LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX2gsMTAsICA0LCAxMiwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF9oLDEyLCAgOCwgNjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfaCwxMiwgIDgsIDQ4LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX2gsMTIsICA4LCAzMiwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF9oLDEyLCAgOCwgMjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfaCwxMiwgIDgsIDE2LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX2gsMTIsICA0LCAxMiwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF92LCA4LCAxNiwgNjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfdiwgOCwgMTYsIDQ4LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX3YsIDgsIDE2LCAzMiwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF92LCA4LCAgOCwgMjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfdiwxMCwgIDgsIDY0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX3YsMTAsICA4LCA0OCwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF92LDEwLCAgOCwgMzIsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfdiwxMCwgIDgsIDI0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX3YsMTAsICA4LCAxNiwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF92LDEwLCAgNCwgMTIsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfdiwxMiwgIDgsIDY0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX3YsMTIsICA4LCA0OCwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF92LDEyLCAgOCwgMzIsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfdiwxMiwgIDgsIDI0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX3YsMTIsICA4LCAxNiwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF92LDEyLCAgNCwgMTIsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfaHYsIDgsICA4LCA2NCwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF9odiwgOCwgIDgsIDQ4LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX2h2LCA4LCAgOCwgMzIsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfaHYsIDgsICA4LCAyNCwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF9odiwgOCwgIDgsIDE2LCBzc2U0KTsKK21jX3JlcF9mdW5jczIoZXBlbF9odiw4LCAgOCwgIDQsIDEyLCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX2h2LDEwLCAgOCwgNjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfaHYsMTAsICA4LCA0OCwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF9odiwxMCwgIDgsIDMyLCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX2h2LDEwLCAgOCwgMjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfaHYsMTAsICA4LCAxNiwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF9odiwxMCwgIDQsIDEyLCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX2h2LDEyLCAgOCwgNjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfaHYsMTIsICA4LCA0OCwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF9odiwxMiwgIDgsIDMyLCBzc2U0KTsKK21jX3JlcF9mdW5jcyhlcGVsX2h2LDEyLCAgOCwgMjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKGVwZWxfaHYsMTIsICA4LCAxNiwgc3NlNCk7CittY19yZXBfZnVuY3MoZXBlbF9odiwxMiwgIDQsIDEyLCBzc2U0KTsKKworbWNfcmVwX2Z1bmNzKHFwZWxfaCwgOCwgMTYsIDY0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX2gsIDgsIDE2LCA0OCwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF9oLCA4LCAxNiwgMzIsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfaCwgOCwgIDgsIDI0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX2gsMTAsICA4LCA2NCwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF9oLDEwLCAgOCwgNDgsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfaCwxMCwgIDgsIDMyLCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX2gsMTAsICA4LCAyNCwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF9oLDEwLCAgOCwgMTYsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfaCwxMCwgIDQsIDEyLCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX2gsMTIsICA4LCA2NCwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF9oLDEyLCAgOCwgNDgsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfaCwxMiwgIDgsIDMyLCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX2gsMTIsICA4LCAyNCwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF9oLDEyLCAgOCwgMTYsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfaCwxMiwgIDQsIDEyLCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX3YsIDgsIDE2LCA2NCwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF92LCA4LCAxNiwgNDgsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfdiwgOCwgMTYsIDMyLCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX3YsIDgsICA4LCAyNCwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF92LDEwLCAgOCwgNjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfdiwxMCwgIDgsIDQ4LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX3YsMTAsICA4LCAzMiwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF92LDEwLCAgOCwgMjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfdiwxMCwgIDgsIDE2LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX3YsMTAsICA0LCAxMiwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF92LDEyLCAgOCwgNjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfdiwxMiwgIDgsIDQ4LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX3YsMTIsICA4LCAzMiwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF92LDEyLCAgOCwgMjQsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfdiwxMiwgIDgsIDE2LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX3YsMTIsICA0LCAxMiwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF9odiwgOCwgIDgsIDY0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX2h2LCA4LCAgOCwgNDgsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfaHYsIDgsICA4LCAzMiwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF9odiwgOCwgIDgsIDI0LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX2h2LCA4LCAgOCwgMTYsIHNzZTQpOworbWNfcmVwX2Z1bmNzMihxcGVsX2h2LDgsICA4LCAgNCwgMTIsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfaHYsMTAsICA4LCA2NCwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF9odiwxMCwgIDgsIDQ4LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX2h2LDEwLCAgOCwgMzIsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfaHYsMTAsICA4LCAyNCwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF9odiwxMCwgIDgsIDE2LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX2h2LDEwLCAgNCwgMTIsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfaHYsMTIsICA4LCA2NCwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF9odiwxMiwgIDgsIDQ4LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX2h2LDEyLCAgOCwgMzIsIHNzZTQpOworbWNfcmVwX2Z1bmNzKHFwZWxfaHYsMTIsICA4LCAyNCwgc3NlNCk7CittY19yZXBfZnVuY3MocXBlbF9odiwxMiwgIDgsIDE2LCBzc2U0KTsKK21jX3JlcF9mdW5jcyhxcGVsX2h2LDEyLCAgNCwgMTIsIHNzZTQpOworCisjZGVmaW5lIG1jX3JlcF91bmlfdyhiaXRkLCBzdGVwLCBXLCBvcHQpIFwKK3ZvaWQgZmZfaGV2Y19wdXRfaGV2Y191bmlfdyMjVyMjXyMjYml0ZCMjXyMjb3B0KHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIGludDE2X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGRlbm9tLCAgaW50IF93eCwgaW50IF9veCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQxNl90ICpzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgVzsgaSArPSBzdGVwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjPSBfc3JjICsgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0PSBfZHN0ICsgKGkgKiAoKGJpdGQgKyA3KSAvIDgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmZfaGV2Y19wdXRfaGV2Y191bmlfdyMjc3RlcCMjXyMjYml0ZCMjXyMjb3B0KGRzdCwgZHN0c3RyaWRlLCBzcmMsIF9zcmNzdHJpZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBkZW5vbSwgX3d4LCBfb3gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworbWNfcmVwX3VuaV93KDgsIDYsIDEyLCBzc2U0KTsKK21jX3JlcF91bmlfdyg4LCA4LCAxNiwgc3NlNCk7CittY19yZXBfdW5pX3coOCwgOCwgMjQsIHNzZTQpOworbWNfcmVwX3VuaV93KDgsIDgsIDMyLCBzc2U0KTsKK21jX3JlcF91bmlfdyg4LCA4LCA0OCwgc3NlNCk7CittY19yZXBfdW5pX3coOCwgOCwgNjQsIHNzZTQpOworCittY19yZXBfdW5pX3coMTAsIDYsIDEyLCBzc2U0KTsKK21jX3JlcF91bmlfdygxMCwgOCwgMTYsIHNzZTQpOworbWNfcmVwX3VuaV93KDEwLCA4LCAyNCwgc3NlNCk7CittY19yZXBfdW5pX3coMTAsIDgsIDMyLCBzc2U0KTsKK21jX3JlcF91bmlfdygxMCwgOCwgNDgsIHNzZTQpOworbWNfcmVwX3VuaV93KDEwLCA4LCA2NCwgc3NlNCk7CisKK21jX3JlcF91bmlfdygxMiwgNiwgMTIsIHNzZTQpOworbWNfcmVwX3VuaV93KDEyLCA4LCAxNiwgc3NlNCk7CittY19yZXBfdW5pX3coMTIsIDgsIDI0LCBzc2U0KTsKK21jX3JlcF91bmlfdygxMiwgOCwgMzIsIHNzZTQpOworbWNfcmVwX3VuaV93KDEyLCA4LCA0OCwgc3NlNCk7CittY19yZXBfdW5pX3coMTIsIDgsIDY0LCBzc2U0KTsKKworI2RlZmluZSBtY19yZXBfYmlfdyhiaXRkLCBzdGVwLCBXLCBvcHQpIFwKK3ZvaWQgZmZfaGV2Y19wdXRfaGV2Y19iaV93IyNXIyNfIyNiaXRkIyNfIyNvcHQodWludDhfdCAqX2RzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgaW50MTZfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpfc3JjMiwgaW50IGhlaWdodCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVub20sICBpbnQgX3d4MCwgIGludCBfd3gxLCBpbnQgX294MCwgaW50IF9veDEpICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQxNl90ICpzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQxNl90ICpzcmMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgVzsgaSArPSBzdGVwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjICA9IF9zcmMgICsgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjMiA9IF9zcmMyICsgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0ICA9IF9kc3QgICsgKGkgKiAoKGJpdGQgKyA3KSAvIDgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmZfaGV2Y19wdXRfaGV2Y19iaV93IyNzdGVwIyNfIyNiaXRkIyNfIyNvcHQoZHN0LCBkc3RzdHJpZGUsIHNyYywgX3NyY3N0cmlkZSwgc3JjMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIGRlbm9tLCBfd3gwLCBfd3gxLCBfb3gwLCBfb3gxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworbWNfcmVwX2JpX3coOCwgNiwgMTIsIHNzZTQpOworbWNfcmVwX2JpX3coOCwgOCwgMTYsIHNzZTQpOworbWNfcmVwX2JpX3coOCwgOCwgMjQsIHNzZTQpOworbWNfcmVwX2JpX3coOCwgOCwgMzIsIHNzZTQpOworbWNfcmVwX2JpX3coOCwgOCwgNDgsIHNzZTQpOworbWNfcmVwX2JpX3coOCwgOCwgNjQsIHNzZTQpOworCittY19yZXBfYmlfdygxMCwgNiwgMTIsIHNzZTQpOworbWNfcmVwX2JpX3coMTAsIDgsIDE2LCBzc2U0KTsKK21jX3JlcF9iaV93KDEwLCA4LCAyNCwgc3NlNCk7CittY19yZXBfYmlfdygxMCwgOCwgMzIsIHNzZTQpOworbWNfcmVwX2JpX3coMTAsIDgsIDQ4LCBzc2U0KTsKK21jX3JlcF9iaV93KDEwLCA4LCA2NCwgc3NlNCk7CisKK21jX3JlcF9iaV93KDEyLCA2LCAxMiwgc3NlNCk7CittY19yZXBfYmlfdygxMiwgOCwgMTYsIHNzZTQpOworbWNfcmVwX2JpX3coMTIsIDgsIDI0LCBzc2U0KTsKK21jX3JlcF9iaV93KDEyLCA4LCAzMiwgc3NlNCk7CittY19yZXBfYmlfdygxMiwgOCwgNDgsIHNzZTQpOworbWNfcmVwX2JpX3coMTIsIDgsIDY0LCBzc2U0KTsKKworI2RlZmluZSBtY191bmlfd19mdW5jKG5hbWUsIGJpdGQsIFcsIG9wdCkgXAordm9pZCBmZl9oZXZjX3B1dF9oZXZjX3VuaV93XyMjbmFtZSMjVyMjXyMjYml0ZCMjXyMjb3B0KHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBfZHN0c3RyaWRlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBfc3Jjc3RyaWRlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgZGVub20sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF93eCwgaW50IF9veCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG14LCBpbnRwdHJfdCBteSwgaW50IHdpZHRoKSAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgdGVtcCwgWzcxICogTUFYX1BCX1NJWkVdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9oZXZjX3B1dF9oZXZjXyMjbmFtZSMjVyMjXyMjYml0ZCMjXyMjb3B0KHRlbXAsIF9zcmMsIF9zcmNzdHJpZGUsIGhlaWdodCwgbXgsIG15LCB3aWR0aCk7ICAgICBcCisgICAgZmZfaGV2Y19wdXRfaGV2Y191bmlfdyMjVyMjXyMjYml0ZCMjXyMjb3B0KF9kc3QsIF9kc3RzdHJpZGUsIHRlbXAsIE1BWF9QQl9TSVpFLCBoZWlnaHQsIGRlbm9tLCBfd3gsIF9veCk7XAorfQorCisjZGVmaW5lIG1jX3VuaV93X2Z1bmNzKG5hbWUsIGJpdGQsIG9wdCkgICAgICAgXAorICAgICAgICBtY191bmlfd19mdW5jKG5hbWUsIGJpdGQsIDQsIG9wdCk7ICAgIFwKKyAgICAgICAgbWNfdW5pX3dfZnVuYyhuYW1lLCBiaXRkLCA4LCBvcHQpOyAgICBcCisgICAgICAgIG1jX3VuaV93X2Z1bmMobmFtZSwgYml0ZCwgMTIsIG9wdCk7ICAgXAorICAgICAgICBtY191bmlfd19mdW5jKG5hbWUsIGJpdGQsIDE2LCBvcHQpOyAgIFwKKyAgICAgICAgbWNfdW5pX3dfZnVuYyhuYW1lLCBiaXRkLCAyNCwgb3B0KTsgICBcCisgICAgICAgIG1jX3VuaV93X2Z1bmMobmFtZSwgYml0ZCwgMzIsIG9wdCk7ICAgXAorICAgICAgICBtY191bmlfd19mdW5jKG5hbWUsIGJpdGQsIDQ4LCBvcHQpOyAgIFwKKyAgICAgICAgbWNfdW5pX3dfZnVuYyhuYW1lLCBiaXRkLCA2NCwgb3B0KQorCittY191bmlfd19mdW5jcyhwZWxfcGl4ZWxzLCA4LCBzc2U0KTsKK21jX3VuaV93X2Z1bmMocGVsX3BpeGVscywgOCwgNiwgc3NlNCk7CittY191bmlfd19mdW5jcyhlcGVsX2gsIDgsIHNzZTQpOworbWNfdW5pX3dfZnVuYyhlcGVsX2gsIDgsIDYsIHNzZTQpOworbWNfdW5pX3dfZnVuY3MoZXBlbF92LCA4LCBzc2U0KTsKK21jX3VuaV93X2Z1bmMoZXBlbF92LCA4LCA2LCBzc2U0KTsKK21jX3VuaV93X2Z1bmNzKGVwZWxfaHYsIDgsIHNzZTQpOworbWNfdW5pX3dfZnVuYyhlcGVsX2h2LCA4LCA2LCBzc2U0KTsKK21jX3VuaV93X2Z1bmNzKHFwZWxfaCwgOCwgc3NlNCk7CittY191bmlfd19mdW5jcyhxcGVsX3YsIDgsIHNzZTQpOworbWNfdW5pX3dfZnVuY3MocXBlbF9odiwgOCwgc3NlNCk7CisKK21jX3VuaV93X2Z1bmNzKHBlbF9waXhlbHMsIDEwLCBzc2U0KTsKK21jX3VuaV93X2Z1bmMocGVsX3BpeGVscywgMTAsIDYsIHNzZTQpOworbWNfdW5pX3dfZnVuY3MoZXBlbF9oLCAxMCwgc3NlNCk7CittY191bmlfd19mdW5jKGVwZWxfaCwgMTAsIDYsIHNzZTQpOworbWNfdW5pX3dfZnVuY3MoZXBlbF92LCAxMCwgc3NlNCk7CittY191bmlfd19mdW5jKGVwZWxfdiwgMTAsIDYsIHNzZTQpOworbWNfdW5pX3dfZnVuY3MoZXBlbF9odiwgMTAsIHNzZTQpOworbWNfdW5pX3dfZnVuYyhlcGVsX2h2LCAxMCwgNiwgc3NlNCk7CittY191bmlfd19mdW5jcyhxcGVsX2gsIDEwLCBzc2U0KTsKK21jX3VuaV93X2Z1bmNzKHFwZWxfdiwgMTAsIHNzZTQpOworbWNfdW5pX3dfZnVuY3MocXBlbF9odiwgMTAsIHNzZTQpOworCittY191bmlfd19mdW5jcyhwZWxfcGl4ZWxzLCAxMiwgc3NlNCk7CittY191bmlfd19mdW5jKHBlbF9waXhlbHMsIDEyLCA2LCBzc2U0KTsKK21jX3VuaV93X2Z1bmNzKGVwZWxfaCwgMTIsIHNzZTQpOworbWNfdW5pX3dfZnVuYyhlcGVsX2gsIDEyLCA2LCBzc2U0KTsKK21jX3VuaV93X2Z1bmNzKGVwZWxfdiwgMTIsIHNzZTQpOworbWNfdW5pX3dfZnVuYyhlcGVsX3YsIDEyLCA2LCBzc2U0KTsKK21jX3VuaV93X2Z1bmNzKGVwZWxfaHYsIDEyLCBzc2U0KTsKK21jX3VuaV93X2Z1bmMoZXBlbF9odiwgMTIsIDYsIHNzZTQpOworbWNfdW5pX3dfZnVuY3MocXBlbF9oLCAxMiwgc3NlNCk7CittY191bmlfd19mdW5jcyhxcGVsX3YsIDEyLCBzc2U0KTsKK21jX3VuaV93X2Z1bmNzKHFwZWxfaHYsIDEyLCBzc2U0KTsKKworI2RlZmluZSBtY19iaV93X2Z1bmMobmFtZSwgYml0ZCwgVywgb3B0KSBcCit2b2lkIGZmX2hldmNfcHV0X2hldmNfYmlfd18jI25hbWUjI1cjI18jI2JpdGQjI18jI29wdCh1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgX2RzdHN0cmlkZSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IF9zcmNzdHJpZGUsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpfc3JjMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBkZW5vbSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF93eDAsIGludCBfd3gxLCBpbnQgX294MCwgaW50IF9veDEsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIHRlbXAsIFs3MSAqIE1BWF9QQl9TSVpFXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZmX2hldmNfcHV0X2hldmNfIyNuYW1lIyNXIyNfIyNiaXRkIyNfIyNvcHQodGVtcCwgX3NyYywgX3NyY3N0cmlkZSwgaGVpZ2h0LCBteCwgbXksIHdpZHRoKTsgICAgICBcCisgICAgZmZfaGV2Y19wdXRfaGV2Y19iaV93IyNXIyNfIyNiaXRkIyNfIyNvcHQoX2RzdCwgX2RzdHN0cmlkZSwgdGVtcCwgTUFYX1BCX1NJWkUsIF9zcmMyLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgZGVub20sIF93eDAsIF93eDEsIF9veDAsIF9veDEpOyAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIG1jX2JpX3dfZnVuY3MobmFtZSwgYml0ZCwgb3B0KSAgICAgICBcCisgICAgICAgIG1jX2JpX3dfZnVuYyhuYW1lLCBiaXRkLCA0LCBvcHQpOyAgICBcCisgICAgICAgIG1jX2JpX3dfZnVuYyhuYW1lLCBiaXRkLCA4LCBvcHQpOyAgICBcCisgICAgICAgIG1jX2JpX3dfZnVuYyhuYW1lLCBiaXRkLCAxMiwgb3B0KTsgICBcCisgICAgICAgIG1jX2JpX3dfZnVuYyhuYW1lLCBiaXRkLCAxNiwgb3B0KTsgICBcCisgICAgICAgIG1jX2JpX3dfZnVuYyhuYW1lLCBiaXRkLCAyNCwgb3B0KTsgICBcCisgICAgICAgIG1jX2JpX3dfZnVuYyhuYW1lLCBiaXRkLCAzMiwgb3B0KTsgICBcCisgICAgICAgIG1jX2JpX3dfZnVuYyhuYW1lLCBiaXRkLCA0OCwgb3B0KTsgICBcCisgICAgICAgIG1jX2JpX3dfZnVuYyhuYW1lLCBiaXRkLCA2NCwgb3B0KQorCittY19iaV93X2Z1bmNzKHBlbF9waXhlbHMsIDgsIHNzZTQpOworbWNfYmlfd19mdW5jKHBlbF9waXhlbHMsIDgsIDYsIHNzZTQpOworbWNfYmlfd19mdW5jcyhlcGVsX2gsIDgsIHNzZTQpOworbWNfYmlfd19mdW5jKGVwZWxfaCwgOCwgNiwgc3NlNCk7CittY19iaV93X2Z1bmNzKGVwZWxfdiwgOCwgc3NlNCk7CittY19iaV93X2Z1bmMoZXBlbF92LCA4LCA2LCBzc2U0KTsKK21jX2JpX3dfZnVuY3MoZXBlbF9odiwgOCwgc3NlNCk7CittY19iaV93X2Z1bmMoZXBlbF9odiwgOCwgNiwgc3NlNCk7CittY19iaV93X2Z1bmNzKHFwZWxfaCwgOCwgc3NlNCk7CittY19iaV93X2Z1bmNzKHFwZWxfdiwgOCwgc3NlNCk7CittY19iaV93X2Z1bmNzKHFwZWxfaHYsIDgsIHNzZTQpOworCittY19iaV93X2Z1bmNzKHBlbF9waXhlbHMsIDEwLCBzc2U0KTsKK21jX2JpX3dfZnVuYyhwZWxfcGl4ZWxzLCAxMCwgNiwgc3NlNCk7CittY19iaV93X2Z1bmNzKGVwZWxfaCwgMTAsIHNzZTQpOworbWNfYmlfd19mdW5jKGVwZWxfaCwgMTAsIDYsIHNzZTQpOworbWNfYmlfd19mdW5jcyhlcGVsX3YsIDEwLCBzc2U0KTsKK21jX2JpX3dfZnVuYyhlcGVsX3YsIDEwLCA2LCBzc2U0KTsKK21jX2JpX3dfZnVuY3MoZXBlbF9odiwgMTAsIHNzZTQpOworbWNfYmlfd19mdW5jKGVwZWxfaHYsIDEwLCA2LCBzc2U0KTsKK21jX2JpX3dfZnVuY3MocXBlbF9oLCAxMCwgc3NlNCk7CittY19iaV93X2Z1bmNzKHFwZWxfdiwgMTAsIHNzZTQpOworbWNfYmlfd19mdW5jcyhxcGVsX2h2LCAxMCwgc3NlNCk7CisKK21jX2JpX3dfZnVuY3MocGVsX3BpeGVscywgMTIsIHNzZTQpOworbWNfYmlfd19mdW5jKHBlbF9waXhlbHMsIDEyLCA2LCBzc2U0KTsKK21jX2JpX3dfZnVuY3MoZXBlbF9oLCAxMiwgc3NlNCk7CittY19iaV93X2Z1bmMoZXBlbF9oLCAxMiwgNiwgc3NlNCk7CittY19iaV93X2Z1bmNzKGVwZWxfdiwgMTIsIHNzZTQpOworbWNfYmlfd19mdW5jKGVwZWxfdiwgMTIsIDYsIHNzZTQpOworbWNfYmlfd19mdW5jcyhlcGVsX2h2LCAxMiwgc3NlNCk7CittY19iaV93X2Z1bmMoZXBlbF9odiwgMTIsIDYsIHNzZTQpOworbWNfYmlfd19mdW5jcyhxcGVsX2gsIDEyLCBzc2U0KTsKK21jX2JpX3dfZnVuY3MocXBlbF92LCAxMiwgc3NlNCk7CittY19iaV93X2Z1bmNzKHFwZWxfaHYsIDEyLCBzc2U0KTsKKyNlbmRpZiAvL0FSQ0hfWDg2XzY0ICYmIEhBVkVfU1NFNF9FWFRFUk5BTAorCisKKyNkZWZpbmUgRVBFTF9MSU5LUyhwb2ludGVyLCBteSwgbXgsIGZuYW1lLCBiaXRkLCBvcHQgKSAgICAgICAgICAgXAorICAgICAgICBQRUxfTElOSyhwb2ludGVyLCAxLCBteSAsIG14ICwgZm5hbWUjIzQgLCAgYml0ZCwgb3B0ICk7IFwKKyAgICAgICAgUEVMX0xJTksocG9pbnRlciwgMiwgbXkgLCBteCAsIGZuYW1lIyM2ICwgIGJpdGQsIG9wdCApOyBcCisgICAgICAgIFBFTF9MSU5LKHBvaW50ZXIsIDMsIG15ICwgbXggLCBmbmFtZSMjOCAsICBiaXRkLCBvcHQgKTsgXAorICAgICAgICBQRUxfTElOSyhwb2ludGVyLCA0LCBteSAsIG14ICwgZm5hbWUjIzEyLCAgYml0ZCwgb3B0ICk7IFwKKyAgICAgICAgUEVMX0xJTksocG9pbnRlciwgNSwgbXkgLCBteCAsIGZuYW1lIyMxNiwgIGJpdGQsIG9wdCApOyBcCisgICAgICAgIFBFTF9MSU5LKHBvaW50ZXIsIDYsIG15ICwgbXggLCBmbmFtZSMjMjQsICBiaXRkLCBvcHQgKTsgXAorICAgICAgICBQRUxfTElOSyhwb2ludGVyLCA3LCBteSAsIG14ICwgZm5hbWUjIzMyLCAgYml0ZCwgb3B0ICk7IFwKKyAgICAgICAgUEVMX0xJTksocG9pbnRlciwgOCwgbXkgLCBteCAsIGZuYW1lIyM0OCwgIGJpdGQsIG9wdCApOyBcCisgICAgICAgIFBFTF9MSU5LKHBvaW50ZXIsIDksIG15ICwgbXggLCBmbmFtZSMjNjQsICBiaXRkLCBvcHQgKQorI2RlZmluZSBRUEVMX0xJTktTKHBvaW50ZXIsIG15LCBteCwgZm5hbWUsIGJpdGQsIG9wdCkgICAgICAgICAgIFwKKyAgICAgICAgUEVMX0xJTksocG9pbnRlciwgMSwgbXkgLCBteCAsIGZuYW1lIyM0ICwgIGJpdGQsIG9wdCApOyBcCisgICAgICAgIFBFTF9MSU5LKHBvaW50ZXIsIDMsIG15ICwgbXggLCBmbmFtZSMjOCAsICBiaXRkLCBvcHQgKTsgXAorICAgICAgICBQRUxfTElOSyhwb2ludGVyLCA0LCBteSAsIG14ICwgZm5hbWUjIzEyLCAgYml0ZCwgb3B0ICk7IFwKKyAgICAgICAgUEVMX0xJTksocG9pbnRlciwgNSwgbXkgLCBteCAsIGZuYW1lIyMxNiwgIGJpdGQsIG9wdCApOyBcCisgICAgICAgIFBFTF9MSU5LKHBvaW50ZXIsIDYsIG15ICwgbXggLCBmbmFtZSMjMjQsICBiaXRkLCBvcHQgKTsgXAorICAgICAgICBQRUxfTElOSyhwb2ludGVyLCA3LCBteSAsIG14ICwgZm5hbWUjIzMyLCAgYml0ZCwgb3B0ICk7IFwKKyAgICAgICAgUEVMX0xJTksocG9pbnRlciwgOCwgbXkgLCBteCAsIGZuYW1lIyM0OCwgIGJpdGQsIG9wdCApOyBcCisgICAgICAgIFBFTF9MSU5LKHBvaW50ZXIsIDksIG15ICwgbXggLCBmbmFtZSMjNjQsICBiaXRkLCBvcHQgKQorCisKK3ZvaWQgZmZfaGV2Y19kc3BfaW5pdF94ODYoSEVWQ0RTUENvbnRleHQgKmMsIGNvbnN0IGludCBiaXRfZGVwdGgpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChiaXRfZGVwdGggPT0gOCkgeworICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmlkY3RfZGNbMF0gPSBmZl9oZXZjX2lkY3Q0eDRfZGNfOF9tbXhleHQ7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzFdID0gZmZfaGV2Y19pZGN0OHg4X2RjXzhfbW14ZXh0OworICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFswXSAgICA9ICBmZl9oZXZjX3RyYW5zZm9ybV9hZGQ0XzhfbW14ZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9jaHJvbWEgPSBmZl9oZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hXzhfc3NlMjsKKyAgICAgICAgICAgIGMtPmhldmNfaF9sb29wX2ZpbHRlcl9jaHJvbWEgPSBmZl9oZXZjX2hfbG9vcF9maWx0ZXJfY2hyb21hXzhfc3NlMjsKKyAgICAgICAgICAgIGlmIChBUkNIX1g4Nl82NCkgeworICAgICAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2x1bWFfOF9zc2UyOworICAgICAgICAgICAgICAgIGMtPmhldmNfaF9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2x1bWFfOF9zc2UyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+aWRjdF9kY1sxXSA9IGZmX2hldmNfaWRjdDh4OF9kY184X3NzZTI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzJdID0gZmZfaGV2Y19pZGN0MTZ4MTZfZGNfOF9zc2UyOworICAgICAgICAgICAgYy0+aWRjdF9kY1szXSA9IGZmX2hldmNfaWRjdDMyeDMyX2RjXzhfc3NlMjsKKworICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFsxXSAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZDhfOF9zc2UyOworICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFsyXSAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZDE2Xzhfc3NlMjsKKyAgICAgICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbM10gICAgPSBmZl9oZXZjX3RyYW5zZm9ybV9hZGQzMl84X3NzZTI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykgJiYgQVJDSF9YODZfNjQpIHsKKyAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2x1bWFfOF9zc3NlMzsKKyAgICAgICAgICAgIGMtPmhldmNfaF9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2x1bWFfOF9zc3NlMzsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfU1NFNChjcHVfZmxhZ3MpICYmIEFSQ0hfWDg2XzY0KSB7CisKKyAgICAgICAgICAgIEVQRUxfTElOS1MoYy0+cHV0X2hldmNfZXBlbCwgMCwgMCwgcGVsX3BpeGVscywgIDgsIHNzZTQpOworICAgICAgICAgICAgRVBFTF9MSU5LUyhjLT5wdXRfaGV2Y19lcGVsLCAwLCAxLCBlcGVsX2gsICAgICAgOCwgc3NlNCk7CisgICAgICAgICAgICBFUEVMX0xJTktTKGMtPnB1dF9oZXZjX2VwZWwsIDEsIDAsIGVwZWxfdiwgICAgICA4LCBzc2U0KTsKKyAgICAgICAgICAgIEVQRUxfTElOS1MoYy0+cHV0X2hldmNfZXBlbCwgMSwgMSwgZXBlbF9odiwgICAgIDgsIHNzZTQpOworCisgICAgICAgICAgICBRUEVMX0xJTktTKGMtPnB1dF9oZXZjX3FwZWwsIDAsIDAsIHBlbF9waXhlbHMsIDgsIHNzZTQpOworICAgICAgICAgICAgUVBFTF9MSU5LUyhjLT5wdXRfaGV2Y19xcGVsLCAwLCAxLCBxcGVsX2gsICAgICA4LCBzc2U0KTsKKyAgICAgICAgICAgIFFQRUxfTElOS1MoYy0+cHV0X2hldmNfcXBlbCwgMSwgMCwgcXBlbF92LCAgICAgOCwgc3NlNCk7CisgICAgICAgICAgICBRUEVMX0xJTktTKGMtPnB1dF9oZXZjX3FwZWwsIDEsIDEsIHFwZWxfaHYsICAgIDgsIHNzZTQpOworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgYy0+aGV2Y192X2xvb3BfZmlsdGVyX2Nocm9tYSA9IGZmX2hldmNfdl9sb29wX2ZpbHRlcl9jaHJvbWFfOF9hdng7CisgICAgICAgICAgICBjLT5oZXZjX2hfbG9vcF9maWx0ZXJfY2hyb21hID0gZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2Nocm9tYV84X2F2eDsKKyAgICAgICAgICAgIGlmIChBUkNIX1g4Nl82NCkgeworICAgICAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2x1bWFfOF9hdng7CisgICAgICAgICAgICAgICAgYy0+aGV2Y19oX2xvb3BfZmlsdGVyX2x1bWEgPSBmZl9oZXZjX2hfbG9vcF9maWx0ZXJfbHVtYV84X2F2eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbMV0gICAgPSBmZl9oZXZjX3RyYW5zZm9ybV9hZGQ4XzhfYXZ4OworICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFsyXSAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZDE2XzhfYXZ4OworICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFszXSAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZDMyXzhfYXZ4OworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgyKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmlkY3RfZGNbMl0gPSBmZl9oZXZjX2lkY3QxNngxNl9kY184X2F2eDI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0MzJ4MzJfZGNfOF9hdngyOworCisgICAgICAgICAgICBjLT50cmFuc2Zvcm1fYWRkWzNdICAgID0gZmZfaGV2Y190cmFuc2Zvcm1fYWRkMzJfOF9hdngyOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChiaXRfZGVwdGggPT0gMTApIHsKKyAgICAgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICBjLT50cmFuc2Zvcm1fYWRkWzBdID0gZmZfaGV2Y190cmFuc2Zvcm1fYWRkNF8xMF9tbXhleHQ7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzBdID0gZmZfaGV2Y19pZGN0NHg0X2RjXzEwX21teGV4dDsKKyAgICAgICAgICAgIGMtPmlkY3RfZGNbMV0gPSBmZl9oZXZjX2lkY3Q4eDhfZGNfMTBfbW14ZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9jaHJvbWEgPSBmZl9oZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hXzEwX3NzZTI7CisgICAgICAgICAgICBjLT5oZXZjX2hfbG9vcF9maWx0ZXJfY2hyb21hID0gZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2Nocm9tYV8xMF9zc2UyOworICAgICAgICAgICAgaWYgKEFSQ0hfWDg2XzY0KSB7CisgICAgICAgICAgICAgICAgYy0+aGV2Y192X2xvb3BfZmlsdGVyX2x1bWEgPSBmZl9oZXZjX3ZfbG9vcF9maWx0ZXJfbHVtYV8xMF9zc2UyOworICAgICAgICAgICAgICAgIGMtPmhldmNfaF9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2x1bWFfMTBfc3NlMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYy0+aWRjdF9kY1sxXSA9IGZmX2hldmNfaWRjdDh4OF9kY18xMF9zc2UyOworICAgICAgICAgICAgYy0+aWRjdF9kY1syXSA9IGZmX2hldmNfaWRjdDE2eDE2X2RjXzEwX3NzZTI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0MzJ4MzJfZGNfMTBfc3NlMjsKKworICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFsxXSAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZDhfMTBfc3NlMjsKKyAgICAgICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbMl0gICAgPSBmZl9oZXZjX3RyYW5zZm9ybV9hZGQxNl8xMF9zc2UyOworICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFszXSAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZDMyXzEwX3NzZTI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykgJiYgQVJDSF9YODZfNjQpIHsKKyAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2x1bWFfMTBfc3NzZTM7CisgICAgICAgICAgICBjLT5oZXZjX2hfbG9vcF9maWx0ZXJfbHVtYSA9IGZmX2hldmNfaF9sb29wX2ZpbHRlcl9sdW1hXzEwX3Nzc2UzOworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0U0KGNwdV9mbGFncykgJiYgQVJDSF9YODZfNjQpIHsKKyAgICAgICAgICAgIEVQRUxfTElOS1MoYy0+cHV0X2hldmNfZXBlbCwgMCwgMCwgcGVsX3BpeGVscywgMTAsIHNzZTQpOworICAgICAgICAgICAgRVBFTF9MSU5LUyhjLT5wdXRfaGV2Y19lcGVsLCAwLCAxLCBlcGVsX2gsICAgICAxMCwgc3NlNCk7CisgICAgICAgICAgICBFUEVMX0xJTktTKGMtPnB1dF9oZXZjX2VwZWwsIDEsIDAsIGVwZWxfdiwgICAgIDEwLCBzc2U0KTsKKyAgICAgICAgICAgIEVQRUxfTElOS1MoYy0+cHV0X2hldmNfZXBlbCwgMSwgMSwgZXBlbF9odiwgICAgMTAsIHNzZTQpOworCisgICAgICAgICAgICBRUEVMX0xJTktTKGMtPnB1dF9oZXZjX3FwZWwsIDAsIDAsIHBlbF9waXhlbHMsIDEwLCBzc2U0KTsKKyAgICAgICAgICAgIFFQRUxfTElOS1MoYy0+cHV0X2hldmNfcXBlbCwgMCwgMSwgcXBlbF9oLCAgICAgMTAsIHNzZTQpOworICAgICAgICAgICAgUVBFTF9MSU5LUyhjLT5wdXRfaGV2Y19xcGVsLCAxLCAwLCBxcGVsX3YsICAgICAxMCwgc3NlNCk7CisgICAgICAgICAgICBRUEVMX0xJTktTKGMtPnB1dF9oZXZjX3FwZWwsIDEsIDEsIHFwZWxfaHYsICAgIDEwLCBzc2U0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9jaHJvbWEgPSBmZl9oZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hXzEwX2F2eDsKKyAgICAgICAgICAgIGMtPmhldmNfaF9sb29wX2ZpbHRlcl9jaHJvbWEgPSBmZl9oZXZjX2hfbG9vcF9maWx0ZXJfY2hyb21hXzEwX2F2eDsKKyAgICAgICAgICAgIGlmIChBUkNIX1g4Nl82NCkgeworICAgICAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2x1bWFfMTBfYXZ4OworICAgICAgICAgICAgICAgIGMtPmhldmNfaF9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2x1bWFfMTBfYXZ4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgyKGNwdV9mbGFncykpIHsKKworICAgICAgICAgICAgYy0+aWRjdF9kY1syXSA9IGZmX2hldmNfaWRjdDE2eDE2X2RjXzEwX2F2eDI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0MzJ4MzJfZGNfMTBfYXZ4MjsKKworICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFsyXSA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZDE2XzEwX2F2eDI7CisgICAgICAgICAgICBjLT50cmFuc2Zvcm1fYWRkWzNdID0gZmZfaGV2Y190cmFuc2Zvcm1fYWRkMzJfMTBfYXZ4MjsKKworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChiaXRfZGVwdGggPT0gMTIpIHsKKyAgICAgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzBdID0gZmZfaGV2Y19pZGN0NHg0X2RjXzEyX21teGV4dDsKKyAgICAgICAgICAgIGMtPmlkY3RfZGNbMV0gPSBmZl9oZXZjX2lkY3Q4eDhfZGNfMTJfbW14ZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9jaHJvbWEgPSBmZl9oZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hXzEyX3NzZTI7CisgICAgICAgICAgICBjLT5oZXZjX2hfbG9vcF9maWx0ZXJfY2hyb21hID0gZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2Nocm9tYV8xMl9zc2UyOworICAgICAgICAgICAgaWYgKEFSQ0hfWDg2XzY0KSB7CisgICAgICAgICAgICAgICAgYy0+aGV2Y192X2xvb3BfZmlsdGVyX2x1bWEgPSBmZl9oZXZjX3ZfbG9vcF9maWx0ZXJfbHVtYV8xMl9zc2UyOworICAgICAgICAgICAgICAgIGMtPmhldmNfaF9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2x1bWFfMTJfc3NlMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYy0+aWRjdF9kY1sxXSA9IGZmX2hldmNfaWRjdDh4OF9kY18xMl9zc2UyOworICAgICAgICAgICAgYy0+aWRjdF9kY1syXSA9IGZmX2hldmNfaWRjdDE2eDE2X2RjXzEyX3NzZTI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0MzJ4MzJfZGNfMTJfc3NlMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfU1NTRTMoY3B1X2ZsYWdzKSAmJiBBUkNIX1g4Nl82NCkgeworICAgICAgICAgICAgYy0+aGV2Y192X2xvb3BfZmlsdGVyX2x1bWEgPSBmZl9oZXZjX3ZfbG9vcF9maWx0ZXJfbHVtYV8xMl9zc3NlMzsKKyAgICAgICAgICAgIGMtPmhldmNfaF9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2x1bWFfMTJfc3NzZTM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSAmJiBBUkNIX1g4Nl82NCkgeworICAgICAgICAgICAgRVBFTF9MSU5LUyhjLT5wdXRfaGV2Y19lcGVsLCAwLCAwLCBwZWxfcGl4ZWxzLCAxMiwgc3NlNCk7CisgICAgICAgICAgICBFUEVMX0xJTktTKGMtPnB1dF9oZXZjX2VwZWwsIDAsIDEsIGVwZWxfaCwgICAgIDEyLCBzc2U0KTsKKyAgICAgICAgICAgIEVQRUxfTElOS1MoYy0+cHV0X2hldmNfZXBlbCwgMSwgMCwgZXBlbF92LCAgICAgMTIsIHNzZTQpOworICAgICAgICAgICAgRVBFTF9MSU5LUyhjLT5wdXRfaGV2Y19lcGVsLCAxLCAxLCBlcGVsX2h2LCAgICAxMiwgc3NlNCk7CisKKyAgICAgICAgICAgIFFQRUxfTElOS1MoYy0+cHV0X2hldmNfcXBlbCwgMCwgMCwgcGVsX3BpeGVscywgMTIsIHNzZTQpOworICAgICAgICAgICAgUVBFTF9MSU5LUyhjLT5wdXRfaGV2Y19xcGVsLCAwLCAxLCBxcGVsX2gsICAgICAxMiwgc3NlNCk7CisgICAgICAgICAgICBRUEVMX0xJTktTKGMtPnB1dF9oZXZjX3FwZWwsIDEsIDAsIHFwZWxfdiwgICAgIDEyLCBzc2U0KTsKKyAgICAgICAgICAgIFFQRUxfTElOS1MoYy0+cHV0X2hldmNfcXBlbCwgMSwgMSwgcXBlbF9odiwgICAgMTIsIHNzZTQpOworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgYy0+aGV2Y192X2xvb3BfZmlsdGVyX2Nocm9tYSA9IGZmX2hldmNfdl9sb29wX2ZpbHRlcl9jaHJvbWFfMTJfYXZ4OworICAgICAgICAgICAgYy0+aGV2Y19oX2xvb3BfZmlsdGVyX2Nocm9tYSA9IGZmX2hldmNfaF9sb29wX2ZpbHRlcl9jaHJvbWFfMTJfYXZ4OworICAgICAgICAgICAgaWYgKEFSQ0hfWDg2XzY0KSB7CisgICAgICAgICAgICAgICAgYy0+aGV2Y192X2xvb3BfZmlsdGVyX2x1bWEgPSBmZl9oZXZjX3ZfbG9vcF9maWx0ZXJfbHVtYV8xMl9hdng7CisgICAgICAgICAgICAgICAgYy0+aGV2Y19oX2xvb3BfZmlsdGVyX2x1bWEgPSBmZl9oZXZjX2hfbG9vcF9maWx0ZXJfbHVtYV8xMl9hdng7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX0FWWDIoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgYy0+aWRjdF9kY1syXSA9IGZmX2hldmNfaWRjdDE2eDE2X2RjXzEyX2F2eDI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0MzJ4MzJfZGNfMTJfYXZ4MjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2VmOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2hwZWxkc3AuYXNtCkBAIC0wLDAgKzEsNjgwIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KgorOyogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgRmFicmljZSBCZWxsYXJkIDxmYWJyaWNlQGJlbGxhcmQub3JnPgorOyogQ29weXJpZ2h0IChjKSAgICAgIE5pY2sgS3Vyc2hldiA8bmlja29sc19rQG1haWwucnU+Cis7KiBDb3B5cmlnaHQgKGMpIDIwMDIgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKzsqIENvcHlyaWdodCAoYykgMjAwMiBaZGVuZWsgS2FiZWxhYyA8a2FiaUBpbmZvcm1hdGljcy5tdW5pLmN6PgorOyogQ29weXJpZ2h0IChjKSAyMDEzIERhbmllbCBLYW5nCis7KgorOyogU0lNRC1vcHRpbWl6ZWQgaGFsZnBlbCBmdW5jdGlvbnMKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorY2V4dGVybiBwYl8xCitjZXh0ZXJuIHB3XzIKK3BiX2ludGVybGVhdmUxNjogZGIgMCwgOCwgMSwgOSwgMiwgMTAsIDMsIDExLCA0LCAxMiwgNSwgMTMsIDYsIDE0LCA3LCAxNQorcGJfaW50ZXJsZWF2ZTg6ICBkYiAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3CisKK2NleHRlcm4gcHdfODE5MgorCitTRUNUSU9OX1RFWFQKKworOyB2b2lkIGZmX3B1dF9waXhlbHM4X3gyKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQorJW1hY3JvIFBVVF9QSVhFTFM4X1gyIDAKKyVpZiBjcHVmbGFnKHNzZTIpCitjZ2xvYmFsIHB1dF9waXhlbHMxNl94MiwgNCw1LDQKKyVlbHNlCitjZ2xvYmFsIHB1dF9waXhlbHM4X3gyLCA0LDUKKyVlbmRpZgorICAgIGxlYSAgICAgICAgICByNCwgW3IyKjJdCisubG9vcDoKKyAgICBtb3Z1ICAgICAgICAgbTAsIFtyMSsxXQorICAgIG1vdnUgICAgICAgICBtMSwgW3IxK3IyKzFdCislaWYgY3B1ZmxhZyhzc2UyKQorICAgIG1vdnUgICAgICAgICBtMiwgW3IxXQorICAgIG1vdnUgICAgICAgICBtMywgW3IxK3IyXQorICAgIHBhdmdiICAgICAgICBtMCwgbTIKKyAgICBwYXZnYiAgICAgICAgbTEsIG0zCislZWxzZQorICAgIFBBVkdCICAgICAgICBtMCwgW3IxXQorICAgIFBBVkdCICAgICAgICBtMSwgW3IxK3IyXQorJWVuZGlmCisgICAgbW92YSAgICAgICBbcjBdLCBtMAorICAgIG1vdmEgICAgW3IwK3IyXSwgbTEKKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgYWRkICAgICAgICAgIHIwLCByNAorICAgIG1vdnUgICAgICAgICBtMCwgW3IxKzFdCisgICAgbW92dSAgICAgICAgIG0xLCBbcjErcjIrMV0KKyVpZiBjcHVmbGFnKHNzZTIpCisgICAgbW92dSAgICAgICAgIG0yLCBbcjFdCisgICAgbW92dSAgICAgICAgIG0zLCBbcjErcjJdCisgICAgcGF2Z2IgICAgICAgIG0wLCBtMgorICAgIHBhdmdiICAgICAgICBtMSwgbTMKKyVlbHNlCisgICAgUEFWR0IgICAgICAgIG0wLCBbcjFdCisgICAgUEFWR0IgICAgICAgIG0xLCBbcjErcjJdCislZW5kaWYKKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgbW92YSAgICAgICBbcjBdLCBtMAorICAgIG1vdmEgICAgW3IwK3IyXSwgbTEKKyAgICBhZGQgICAgICAgICAgcjAsIHI0CisgICAgc3ViICAgICAgICAgcjNkLCA0CisgICAgam5lIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUFVUX1BJWEVMUzhfWDIKK0lOSVRfTU1YIDNkbm93CitQVVRfUElYRUxTOF9YMgorCisKKzsgdm9pZCBmZl9wdXRfcGl4ZWxzMTZfeDIodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCislbWFjcm8gUFVUX1BJWEVMU18xNiAwCitjZ2xvYmFsIHB1dF9waXhlbHMxNl94MiwgNCw1CisgICAgbGVhICAgICAgICAgIHI0LCBbcjIqMl0KKy5sb29wOgorICAgIG1vdmEgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICBtMSwgW3IxK3IyXQorICAgIG1vdmEgICAgICAgICBtMiwgW3IxKzhdCisgICAgbW92YSAgICAgICAgIG0zLCBbcjErcjIrOF0KKyAgICBQQVZHQiAgICAgICAgbTAsIFtyMSsxXQorICAgIFBBVkdCICAgICAgICBtMSwgW3IxK3IyKzFdCisgICAgUEFWR0IgICAgICAgIG0yLCBbcjErOV0KKyAgICBQQVZHQiAgICAgICAgbTMsIFtyMStyMis5XQorICAgIG1vdmEgICAgICAgW3IwXSwgbTAKKyAgICBtb3ZhICAgIFtyMCtyMl0sIG0xCisgICAgbW92YSAgICAgW3IwKzhdLCBtMgorICAgIG1vdmEgIFtyMCtyMis4XSwgbTMKKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgYWRkICAgICAgICAgIHIwLCByNAorICAgIG1vdmEgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICBtMSwgW3IxK3IyXQorICAgIG1vdmEgICAgICAgICBtMiwgW3IxKzhdCisgICAgbW92YSAgICAgICAgIG0zLCBbcjErcjIrOF0KKyAgICBQQVZHQiAgICAgICAgbTAsIFtyMSsxXQorICAgIFBBVkdCICAgICAgICBtMSwgW3IxK3IyKzFdCisgICAgUEFWR0IgICAgICAgIG0yLCBbcjErOV0KKyAgICBQQVZHQiAgICAgICAgbTMsIFtyMStyMis5XQorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0wCisgICAgbW92YSAgICBbcjArcjJdLCBtMQorICAgIG1vdmEgICAgIFtyMCs4XSwgbTIKKyAgICBtb3ZhICBbcjArcjIrOF0sIG0zCisgICAgYWRkICAgICAgICAgIHIwLCByNAorICAgIHN1YiAgICAgICAgIHIzZCwgNAorICAgIGpuZSAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BVVF9QSVhFTFNfMTYKK0lOSVRfTU1YIDNkbm93CitQVVRfUElYRUxTXzE2Cis7IFRoZSA4X1gyIG1hY3JvIGNhbiBlYXNpbHkgYmUgdXNlZCBoZXJlCitJTklUX1hNTSBzc2UyCitQVVRfUElYRUxTOF9YMgorCisKKzsgdm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeDIodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCislbWFjcm8gUFVUX05PX1JORF9QSVhFTFM4X1gyIDAKK2NnbG9iYWwgcHV0X25vX3JuZF9waXhlbHM4X3gyLCA0LDUKKyAgICBtb3ZhICAgICAgICAgbTYsIFtwYl8xXQorICAgIGxlYSAgICAgICAgICByNCwgW3IyKjJdCisubG9vcDoKKyAgICBtb3ZhICAgICAgICAgbTAsIFtyMV0KKyAgICBtb3ZhICAgICAgICAgbTIsIFtyMStyMl0KKyAgICBtb3ZhICAgICAgICAgbTEsIFtyMSsxXQorICAgIG1vdmEgICAgICAgICBtMywgW3IxK3IyKzFdCisgICAgYWRkICAgICAgICAgIHIxLCByNAorICAgIHBzdWJ1c2IgICAgICBtMCwgbTYKKyAgICBwc3VidXNiICAgICAgbTIsIG02CisgICAgUEFWR0IgICAgICAgIG0wLCBtMQorICAgIFBBVkdCICAgICAgICBtMiwgbTMKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0wCisgICAgbW92YSAgICBbcjArcjJdLCBtMgorICAgIG1vdmEgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICBtMSwgW3IxKzFdCisgICAgbW92YSAgICAgICAgIG0yLCBbcjErcjJdCisgICAgbW92YSAgICAgICAgIG0zLCBbcjErcjIrMV0KKyAgICBhZGQgICAgICAgICAgcjAsIHI0CisgICAgYWRkICAgICAgICAgIHIxLCByNAorICAgIHBzdWJ1c2IgICAgICBtMCwgbTYKKyAgICBwc3VidXNiICAgICAgbTIsIG02CisgICAgUEFWR0IgICAgICAgIG0wLCBtMQorICAgIFBBVkdCICAgICAgICBtMiwgbTMKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0wCisgICAgbW92YSAgICBbcjArcjJdLCBtMgorICAgIGFkZCAgICAgICAgICByMCwgcjQKKyAgICBzdWIgICAgICAgICByM2QsIDQKKyAgICBqbmUgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitQVVRfTk9fUk5EX1BJWEVMUzhfWDIKK0lOSVRfTU1YIDNkbm93CitQVVRfTk9fUk5EX1BJWEVMUzhfWDIKKworCis7IHZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX2V4YWN0KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQorJW1hY3JvIFBVVF9OT19STkRfUElYRUxTOF9YMl9FWEFDVCAwCitjZ2xvYmFsIHB1dF9ub19ybmRfcGl4ZWxzOF94Ml9leGFjdCwgNCw1CisgICAgbGVhICAgICAgICAgIHI0LCBbcjIqM10KKyAgICBwY21wZXFiICAgICAgbTYsIG02CisubG9vcDoKKyAgICBtb3ZhICAgICAgICAgbTAsIFtyMV0KKyAgICBtb3ZhICAgICAgICAgbTIsIFtyMStyMl0KKyAgICBtb3ZhICAgICAgICAgbTEsIFtyMSsxXQorICAgIG1vdmEgICAgICAgICBtMywgW3IxK3IyKzFdCisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIHB4b3IgICAgICAgICBtMiwgbTYKKyAgICBweG9yICAgICAgICAgbTEsIG02CisgICAgcHhvciAgICAgICAgIG0zLCBtNgorICAgIFBBVkdCICAgICAgICBtMCwgbTEKKyAgICBQQVZHQiAgICAgICAgbTIsIG0zCisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIHB4b3IgICAgICAgICBtMiwgbTYKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0wCisgICAgbW92YSAgICBbcjArcjJdLCBtMgorICAgIG1vdmEgICAgICAgICBtMCwgW3IxK3IyKjJdCisgICAgbW92YSAgICAgICAgIG0xLCBbcjErcjIqMisxXQorICAgIG1vdmEgICAgICAgICBtMiwgW3IxK3I0XQorICAgIG1vdmEgICAgICAgICBtMywgW3IxK3I0KzFdCisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIHB4b3IgICAgICAgICBtMSwgbTYKKyAgICBweG9yICAgICAgICAgbTIsIG02CisgICAgcHhvciAgICAgICAgIG0zLCBtNgorICAgIFBBVkdCICAgICAgICBtMCwgbTEKKyAgICBQQVZHQiAgICAgICAgbTIsIG0zCisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIHB4b3IgICAgICAgICBtMiwgbTYKKyAgICBtb3ZhICBbcjArcjIqMl0sIG0wCisgICAgbW92YSAgICBbcjArcjRdLCBtMgorICAgIGxlYSAgICAgICAgICByMSwgW3IxK3IyKjRdCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjIqNF0KKyAgICBzdWIgICAgICAgICByM2QsIDQKKyAgICBqZyAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BVVF9OT19STkRfUElYRUxTOF9YMl9FWEFDVAorSU5JVF9NTVggM2Rub3cKK1BVVF9OT19STkRfUElYRUxTOF9YMl9FWEFDVAorCisKKzsgdm9pZCBmZl9wdXRfcGl4ZWxzOF95Mih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKKyVtYWNybyBQVVRfUElYRUxTOF9ZMiAwCislaWYgY3B1ZmxhZyhzc2UyKQorY2dsb2JhbCBwdXRfcGl4ZWxzMTZfeTIsIDQsNSwzCislZWxzZQorY2dsb2JhbCBwdXRfcGl4ZWxzOF95MiwgNCw1CislZW5kaWYKKyAgICBsZWEgICAgICAgICAgcjQsIFtyMioyXQorICAgIG1vdnUgICAgICAgICBtMCwgW3IxXQorICAgIHN1YiAgICAgICAgICByMCwgcjIKKy5sb29wOgorICAgIG1vdnUgICAgICAgICBtMSwgW3IxK3IyXQorICAgIG1vdnUgICAgICAgICBtMiwgW3IxK3I0XQorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBQQVZHQiAgICAgICAgbTAsIG0xCisgICAgUEFWR0IgICAgICAgIG0xLCBtMgorICAgIG1vdmEgICAgW3IwK3IyXSwgbTAKKyAgICBtb3ZhICAgIFtyMCtyNF0sIG0xCisgICAgbW92dSAgICAgICAgIG0xLCBbcjErcjJdCisgICAgbW92dSAgICAgICAgIG0wLCBbcjErcjRdCisgICAgYWRkICAgICAgICAgIHIwLCByNAorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBQQVZHQiAgICAgICAgbTIsIG0xCisgICAgUEFWR0IgICAgICAgIG0xLCBtMAorICAgIG1vdmEgICAgW3IwK3IyXSwgbTIKKyAgICBtb3ZhICAgIFtyMCtyNF0sIG0xCisgICAgYWRkICAgICAgICAgIHIwLCByNAorICAgIHN1YiAgICAgICAgIHIzZCwgNAorICAgIGpuZSAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BVVF9QSVhFTFM4X1kyCitJTklUX01NWCAzZG5vdworUFVUX1BJWEVMUzhfWTIKKzsgYWN0dWFsbHksIHB1dF9waXhlbHMxNl95Ml9zc2UyCitJTklUX1hNTSBzc2UyCitQVVRfUElYRUxTOF9ZMgorCisKKzsgdm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeTIodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCislbWFjcm8gUFVUX05PX1JORF9QSVhFTFM4X1kyIDAKK2NnbG9iYWwgcHV0X25vX3JuZF9waXhlbHM4X3kyLCA0LDUKKyAgICBtb3ZhICAgICAgICAgbTYsIFtwYl8xXQorICAgIGxlYSAgICAgICAgICByNCwgW3IyK3IyXQorICAgIG1vdmEgICAgICAgICBtMCwgW3IxXQorICAgIHN1YiAgICAgICAgICByMCwgcjIKKy5sb29wOgorICAgIG1vdmEgICAgICAgICBtMSwgW3IxK3IyXQorICAgIG1vdmEgICAgICAgICBtMiwgW3IxK3I0XQorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBwc3VidXNiICAgICAgbTEsIG02CisgICAgUEFWR0IgICAgICAgIG0wLCBtMQorICAgIFBBVkdCICAgICAgICBtMSwgbTIKKyAgICBtb3ZhICAgIFtyMCtyMl0sIG0wCisgICAgbW92YSAgICBbcjArcjRdLCBtMQorICAgIG1vdmEgICAgICAgICBtMSwgW3IxK3IyXQorICAgIG1vdmEgICAgICAgICBtMCwgW3IxK3I0XQorICAgIGFkZCAgICAgICAgICByMCwgcjQKKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgcHN1YnVzYiAgICAgIG0xLCBtNgorICAgIFBBVkdCICAgICAgICBtMiwgbTEKKyAgICBQQVZHQiAgICAgICAgbTEsIG0wCisgICAgbW92YSAgICBbcjArcjJdLCBtMgorICAgIG1vdmEgICAgW3IwK3I0XSwgbTEKKyAgICBhZGQgICAgICAgICAgcjAsIHI0CisgICAgc3ViICAgICAgICAgcjNkLCA0CisgICAgam5lIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUFVUX05PX1JORF9QSVhFTFM4X1kyCitJTklUX01NWCAzZG5vdworUFVUX05PX1JORF9QSVhFTFM4X1kyCisKKworOyB2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF95Ml9leGFjdCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKKyVtYWNybyBQVVRfTk9fUk5EX1BJWEVMUzhfWTJfRVhBQ1QgMAorY2dsb2JhbCBwdXRfbm9fcm5kX3BpeGVsczhfeTJfZXhhY3QsIDQsNQorICAgIGxlYSAgICAgICAgICByNCwgW3IyKjNdCisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgcGNtcGVxYiAgICAgIG02LCBtNgorICAgIGFkZCAgICAgICAgICByMSwgcjIKKyAgICBweG9yICAgICAgICAgbTAsIG02CisubG9vcDoKKyAgICBtb3ZhICAgICAgICAgbTEsIFtyMV0KKyAgICBtb3ZhICAgICAgICAgbTIsIFtyMStyMl0KKyAgICBweG9yICAgICAgICAgbTEsIG02CisgICAgcHhvciAgICAgICAgIG0yLCBtNgorICAgIFBBVkdCICAgICAgICBtMCwgbTEKKyAgICBQQVZHQiAgICAgICAgbTEsIG0yCisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIHB4b3IgICAgICAgICBtMSwgbTYKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0wCisgICAgbW92YSAgICBbcjArcjJdLCBtMQorICAgIG1vdmEgICAgICAgICBtMSwgW3IxK3IyKjJdCisgICAgbW92YSAgICAgICAgIG0wLCBbcjErcjRdCisgICAgcHhvciAgICAgICAgIG0xLCBtNgorICAgIHB4b3IgICAgICAgICBtMCwgbTYKKyAgICBQQVZHQiAgICAgICAgbTIsIG0xCisgICAgUEFWR0IgICAgICAgIG0xLCBtMAorICAgIHB4b3IgICAgICAgICBtMiwgbTYKKyAgICBweG9yICAgICAgICAgbTEsIG02CisgICAgbW92YSAgW3IwK3IyKjJdLCBtMgorICAgIG1vdmEgICAgW3IwK3I0XSwgbTEKKyAgICBsZWEgICAgICAgICAgcjEsIFtyMStyMio0XQorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IyKjRdCisgICAgc3ViICAgICAgICAgcjNkLCA0CisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitQVVRfTk9fUk5EX1BJWEVMUzhfWTJfRVhBQ1QKK0lOSVRfTU1YIDNkbm93CitQVVRfTk9fUk5EX1BJWEVMUzhfWTJfRVhBQ1QKKworCis7IHZvaWQgZmZfYXZnX3BpeGVsczgodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCislbWFjcm8gQVZHX1BJWEVMUzggMAorY2dsb2JhbCBhdmdfcGl4ZWxzOCwgNCw1CisgICAgbGVhICAgICAgICAgIHI0LCBbcjIqMl0KKy5sb29wOgorICAgIG1vdmEgICAgICAgICBtMCwgW3IwXQorICAgIG1vdmEgICAgICAgICBtMSwgW3IwK3IyXQorICAgIFBBVkdCICAgICAgICBtMCwgW3IxXQorICAgIFBBVkdCICAgICAgICBtMSwgW3IxK3IyXQorICAgIG1vdmEgICAgICAgW3IwXSwgbTAKKyAgICBtb3ZhICAgIFtyMCtyMl0sIG0xCisgICAgYWRkICAgICAgICAgIHIxLCByNAorICAgIGFkZCAgICAgICAgICByMCwgcjQKKyAgICBtb3ZhICAgICAgICAgbTAsIFtyMF0KKyAgICBtb3ZhICAgICAgICAgbTEsIFtyMCtyMl0KKyAgICBQQVZHQiAgICAgICAgbTAsIFtyMV0KKyAgICBQQVZHQiAgICAgICAgbTEsIFtyMStyMl0KKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgbW92YSAgICAgICBbcjBdLCBtMAorICAgIG1vdmEgICAgW3IwK3IyXSwgbTEKKyAgICBhZGQgICAgICAgICAgcjAsIHI0CisgICAgc3ViICAgICAgICAgcjNkLCA0CisgICAgam5lIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIDNkbm93CitBVkdfUElYRUxTOAorCisKKzsgdm9pZCBmZl9hdmdfcGl4ZWxzOF94Mih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKKyVtYWNybyBBVkdfUElYRUxTOF9YMiAwCislaWYgY3B1ZmxhZyhzc2UyKQorY2dsb2JhbCBhdmdfcGl4ZWxzMTZfeDIsIDQsNSw0CislZWxzZQorY2dsb2JhbCBhdmdfcGl4ZWxzOF94MiwgNCw1CislZW5kaWYKKyAgICBsZWEgICAgICAgICAgcjQsIFtyMioyXQorJWlmIG5vdGNwdWZsYWcobW14ZXh0KQorICAgIHBjbXBlcWQgICAgICBtNSwgbTUKKyAgICBwYWRkYiAgICAgICAgbTUsIG01CislZW5kaWYKKy5sb29wOgorICAgIG1vdnUgICAgICAgICBtMCwgW3IxXQorICAgIG1vdnUgICAgICAgICBtMiwgW3IxK3IyXQorJWlmIGNwdWZsYWcoc3NlMikKKyAgICBtb3Z1ICAgICAgICAgbTEsIFtyMSsxXQorICAgIG1vdnUgICAgICAgICBtMywgW3IxK3IyKzFdCisgICAgcGF2Z2IgICAgICAgIG0wLCBtMQorICAgIHBhdmdiICAgICAgICBtMiwgbTMKKyVlbHNlCisgICAgUEFWR0IgICAgICAgIG0wLCBbcjErMV0sIG0zLCBtNQorICAgIFBBVkdCICAgICAgICBtMiwgW3IxK3IyKzFdLCBtNCwgbTUKKyVlbmRpZgorICAgIFBBVkdCICAgICAgICBtMCwgW3IwXSwgbTMsIG01CisgICAgUEFWR0IgICAgICAgIG0yLCBbcjArcjJdLCBtNCwgbTUKKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgbW92YSAgICAgICBbcjBdLCBtMAorICAgIG1vdmEgICAgW3IwK3IyXSwgbTIKKyAgICBtb3Z1ICAgICAgICAgbTAsIFtyMV0KKyAgICBtb3Z1ICAgICAgICAgbTIsIFtyMStyMl0KKyVpZiBjcHVmbGFnKHNzZTIpCisgICAgbW92dSAgICAgICAgIG0xLCBbcjErMV0KKyAgICBtb3Z1ICAgICAgICAgbTMsIFtyMStyMisxXQorICAgIHBhdmdiICAgICAgICBtMCwgbTEKKyAgICBwYXZnYiAgICAgICAgbTIsIG0zCislZWxzZQorICAgIFBBVkdCICAgICAgICBtMCwgW3IxKzFdLCBtMywgbTUKKyAgICBQQVZHQiAgICAgICAgbTIsIFtyMStyMisxXSwgbTQsIG01CislZW5kaWYKKyAgICBhZGQgICAgICAgICAgcjAsIHI0CisgICAgYWRkICAgICAgICAgIHIxLCByNAorICAgIFBBVkdCICAgICAgICBtMCwgW3IwXSwgbTMsIG01CisgICAgUEFWR0IgICAgICAgIG0yLCBbcjArcjJdLCBtNCwgbTUKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0wCisgICAgbW92YSAgICBbcjArcjJdLCBtMgorICAgIGFkZCAgICAgICAgICByMCwgcjQKKyAgICBzdWIgICAgICAgICByM2QsIDQKKyAgICBqbmUgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CitBVkdfUElYRUxTOF9YMgorSU5JVF9NTVggbW14ZXh0CitBVkdfUElYRUxTOF9YMgorSU5JVF9NTVggM2Rub3cKK0FWR19QSVhFTFM4X1gyCis7IGFjdHVhbGx5IGF2Z19waXhlbHMxNl94MgorSU5JVF9YTU0gc3NlMgorQVZHX1BJWEVMUzhfWDIKKworCis7IHZvaWQgZmZfYXZnX3BpeGVsczhfeTIodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCislbWFjcm8gQVZHX1BJWEVMUzhfWTIgMAorJWlmIGNwdWZsYWcoc3NlMikKK2NnbG9iYWwgYXZnX3BpeGVsczE2X3kyLCA0LDUsMworJWVsc2UKK2NnbG9iYWwgYXZnX3BpeGVsczhfeTIsIDQsNQorJWVuZGlmCisgICAgbGVhICAgICAgICAgIHI0LCBbcjIqMl0KKyAgICBtb3Z1ICAgICAgICAgbTAsIFtyMV0KKyAgICBzdWIgICAgICAgICAgcjAsIHIyCisubG9vcDoKKyAgICBtb3Z1ICAgICAgICAgbTEsIFtyMStyMl0KKyAgICBtb3Z1ICAgICAgICAgbTIsIFtyMStyNF0KKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgUEFWR0IgICAgICAgIG0wLCBtMQorICAgIFBBVkdCICAgICAgICBtMSwgbTIKKyAgICBQQVZHQiAgICAgICAgbTAsIFtyMCtyMl0KKyAgICBQQVZHQiAgICAgICAgbTEsIFtyMCtyNF0KKyAgICBtb3ZhICAgIFtyMCtyMl0sIG0wCisgICAgbW92YSAgICBbcjArcjRdLCBtMQorICAgIG1vdnUgICAgICAgICBtMSwgW3IxK3IyXQorICAgIG1vdnUgICAgICAgICBtMCwgW3IxK3I0XQorICAgIFBBVkdCICAgICAgICBtMiwgbTEKKyAgICBQQVZHQiAgICAgICAgbTEsIG0wCisgICAgYWRkICAgICAgICAgIHIwLCByNAorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBQQVZHQiAgICAgICAgbTIsIFtyMCtyMl0KKyAgICBQQVZHQiAgICAgICAgbTEsIFtyMCtyNF0KKyAgICBtb3ZhICAgIFtyMCtyMl0sIG0yCisgICAgbW92YSAgICBbcjArcjRdLCBtMQorICAgIGFkZCAgICAgICAgICByMCwgcjQKKyAgICBzdWIgICAgICAgICByM2QsIDQKKyAgICBqbmUgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitBVkdfUElYRUxTOF9ZMgorSU5JVF9NTVggM2Rub3cKK0FWR19QSVhFTFM4X1kyCis7IGFjdHVhbGx5IGF2Z19waXhlbHMxNl95MgorSU5JVF9YTU0gc3NlMgorQVZHX1BJWEVMUzhfWTIKKworCis7IHZvaWQgZmZfYXZnX3BpeGVsczhfeHkyKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQorOyBOb3RlIHRoaXMgaXMgbm90IGNvcnJlY3RseSByb3VuZGVkLCBhbmQgaXMgdGhlcmVmb3JlIHVzZWQgZm9yCis7IG5vdC1iaXRleGFjdCBvdXRwdXQKKyVtYWNybyBBVkdfQVBQUk9YX1BJWEVMUzhfWFkyIDAKK2NnbG9iYWwgYXZnX2FwcHJveF9waXhlbHM4X3h5MiwgNCw1CisgICAgbW92YSAgICAgICAgIG02LCBbcGJfMV0KKyAgICBsZWEgICAgICAgICAgcjQsIFtyMioyXQorICAgIG1vdmEgICAgICAgICBtMCwgW3IxXQorICAgIFBBVkdCICAgICAgICBtMCwgW3IxKzFdCisubG9vcDoKKyAgICBtb3ZhICAgICAgICAgbTIsIFtyMStyNF0KKyAgICBtb3ZhICAgICAgICAgbTEsIFtyMStyMl0KKyAgICBwc3VidXNiICAgICAgbTIsIG02CisgICAgUEFWR0IgICAgICAgIG0xLCBbcjErcjIrMV0KKyAgICBQQVZHQiAgICAgICAgbTIsIFtyMStyNCsxXQorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBQQVZHQiAgICAgICAgbTAsIG0xCisgICAgUEFWR0IgICAgICAgIG0xLCBtMgorICAgIFBBVkdCICAgICAgICBtMCwgW3IwXQorICAgIFBBVkdCICAgICAgICBtMSwgW3IwK3IyXQorICAgIG1vdmEgICAgICAgW3IwXSwgbTAKKyAgICBtb3ZhICAgIFtyMCtyMl0sIG0xCisgICAgbW92YSAgICAgICAgIG0xLCBbcjErcjJdCisgICAgbW92YSAgICAgICAgIG0wLCBbcjErcjRdCisgICAgUEFWR0IgICAgICAgIG0xLCBbcjErcjIrMV0KKyAgICBQQVZHQiAgICAgICAgbTAsIFtyMStyNCsxXQorICAgIGFkZCAgICAgICAgICByMCwgcjQKKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgUEFWR0IgICAgICAgIG0yLCBtMQorICAgIFBBVkdCICAgICAgICBtMSwgbTAKKyAgICBQQVZHQiAgICAgICAgbTIsIFtyMF0KKyAgICBQQVZHQiAgICAgICAgbTEsIFtyMCtyMl0KKyAgICBtb3ZhICAgICAgIFtyMF0sIG0yCisgICAgbW92YSAgICBbcjArcjJdLCBtMQorICAgIGFkZCAgICAgICAgICByMCwgcjQKKyAgICBzdWIgICAgICAgICByM2QsIDQKKyAgICBqbmUgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitBVkdfQVBQUk9YX1BJWEVMUzhfWFkyCitJTklUX01NWCAzZG5vdworQVZHX0FQUFJPWF9QSVhFTFM4X1hZMgorCisKKzsgdm9pZCBmZl9hdmdfcGl4ZWxzMTZfeHkyKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQorJW1hY3JvIFNFVF9QSVhFTFNfWFkyIDEKKyVpZiBjcHVmbGFnKHNzZTIpCitjZ2xvYmFsICUxX3BpeGVsczE2X3h5MiwgNCw1LDgKKyVlbHNlCitjZ2xvYmFsICUxX3BpeGVsczhfeHkyLCA0LDUKKyVlbmRpZgorICAgIHB4b3IgICAgICAgIG03LCBtNworICAgIG1vdmEgICAgICAgIG02LCBbcHdfMl0KKyAgICBtb3Z1ICAgICAgICBtMCwgW3IxXQorICAgIG1vdnUgICAgICAgIG00LCBbcjErMV0KKyAgICBtb3ZhICAgICAgICBtMSwgbTAKKyAgICBtb3ZhICAgICAgICBtNSwgbTQKKyAgICBwdW5wY2tsYncgICBtMCwgbTcKKyAgICBwdW5wY2tsYncgICBtNCwgbTcKKyAgICBwdW5wY2toYncgICBtMSwgbTcKKyAgICBwdW5wY2toYncgICBtNSwgbTcKKyAgICBwYWRkdXN3ICAgICBtNCwgbTAKKyAgICBwYWRkdXN3ICAgICBtNSwgbTEKKyAgICB4b3IgICAgICAgICByNCwgcjQKKyAgICBhZGQgICAgICAgICByMSwgcjIKKy5sb29wOgorICAgIG1vdnUgICAgICAgIG0wLCBbcjErcjRdCisgICAgbW92dSAgICAgICAgbTIsIFtyMStyNCsxXQorICAgIG1vdmEgICAgICAgIG0xLCBtMAorICAgIG1vdmEgICAgICAgIG0zLCBtMgorICAgIHB1bnBja2xidyAgIG0wLCBtNworICAgIHB1bnBja2xidyAgIG0yLCBtNworICAgIHB1bnBja2hidyAgIG0xLCBtNworICAgIHB1bnBja2hidyAgIG0zLCBtNworICAgIHBhZGR1c3cgICAgIG0wLCBtMgorICAgIHBhZGR1c3cgICAgIG0xLCBtMworICAgIHBhZGR1c3cgICAgIG00LCBtNgorICAgIHBhZGR1c3cgICAgIG01LCBtNgorICAgIHBhZGR1c3cgICAgIG00LCBtMAorICAgIHBhZGR1c3cgICAgIG01LCBtMQorICAgIHBzcmx3ICAgICAgIG00LCAyCisgICAgcHNybHcgICAgICAgbTUsIDIKKyVpZmlkbiAlMSwgYXZnCisgICAgbW92YSAgICAgICAgbTMsIFtyMCtyNF0KKyAgICBwYWNrdXN3YiAgICBtNCwgbTUKKyAgICBQQVZHQiAgICAgICBtNCwgbTMKKyVlbHNlCisgICAgcGFja3Vzd2IgICAgbTQsIG01CislZW5kaWYKKyAgICBtb3ZhICAgW3IwK3I0XSwgbTQKKyAgICBhZGQgICAgICAgICByNCwgcjIKKworICAgIG1vdnUgICAgICAgIG0yLCBbcjErcjRdCisgICAgbW92dSAgICAgICAgbTQsIFtyMStyNCsxXQorICAgIG1vdmEgICAgICAgIG0zLCBtMgorICAgIG1vdmEgICAgICAgIG01LCBtNAorICAgIHB1bnBja2xidyAgIG0yLCBtNworICAgIHB1bnBja2xidyAgIG00LCBtNworICAgIHB1bnBja2hidyAgIG0zLCBtNworICAgIHB1bnBja2hidyAgIG01LCBtNworICAgIHBhZGR1c3cgICAgIG00LCBtMgorICAgIHBhZGR1c3cgICAgIG01LCBtMworICAgIHBhZGR1c3cgICAgIG0wLCBtNgorICAgIHBhZGR1c3cgICAgIG0xLCBtNgorICAgIHBhZGR1c3cgICAgIG0wLCBtNAorICAgIHBhZGR1c3cgICAgIG0xLCBtNQorICAgIHBzcmx3ICAgICAgIG0wLCAyCisgICAgcHNybHcgICAgICAgbTEsIDIKKyVpZmlkbiAlMSwgYXZnCisgICAgbW92YSAgICAgICAgbTMsIFtyMCtyNF0KKyAgICBwYWNrdXN3YiAgICBtMCwgbTEKKyAgICBQQVZHQiAgICAgICBtMCwgbTMKKyVlbHNlCisgICAgcGFja3Vzd2IgICAgbTAsIG0xCislZW5kaWYKKyAgICBtb3ZhICAgW3IwK3I0XSwgbTAKKyAgICBhZGQgICAgICAgICByNCwgcjIKKyAgICBzdWIgICAgICAgIHIzZCwgMgorICAgIGpueiAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1NFVF9QSVhFTFNfWFkyIGF2ZworSU5JVF9NTVggM2Rub3cKK1NFVF9QSVhFTFNfWFkyIGF2ZworSU5JVF9YTU0gc3NlMgorU0VUX1BJWEVMU19YWTIgcHV0CitTRVRfUElYRUxTX1hZMiBhdmcKKworJW1hY3JvIFNTU0UzX1BJWEVMU19YWTIgMS0yCislaWYgJTAgPT0gMiA7IHNzZTIKK2NnbG9iYWwgJTFfcGl4ZWxzMTZfeHkyLCA0LDUsJTIKKyAgICBtb3ZhICAgICAgICBtNCwgW3BiX2ludGVybGVhdmUxNl0KKyVlbHNlCitjZ2xvYmFsICUxX3BpeGVsczhfeHkyLCA0LDUKKyAgICBtb3ZhICAgICAgICBtNCwgW3BiX2ludGVybGVhdmU4XQorJWVuZGlmCisgICAgbW92YSAgICAgICAgbTUsIFtwYl8xXQorICAgIG1vdnUgICAgICAgIG0wLCBbcjFdCisgICAgbW92dSAgICAgICAgbTEsIFtyMSsxXQorICAgIHBtYWRkdWJzdyAgIG0wLCBtNQorICAgIHBtYWRkdWJzdyAgIG0xLCBtNQorICAgIHhvciAgICAgICAgIHI0LCByNAorICAgIGFkZCAgICAgICAgIHIxLCByMgorLmxvb3A6CisgICAgbW92dSAgICAgICAgbTIsIFtyMStyNF0KKyAgICBtb3Z1ICAgICAgICBtMywgW3IxK3I0KzFdCisgICAgcG1hZGR1YnN3ICAgbTIsIG01CisgICAgcG1hZGR1YnN3ICAgbTMsIG01CisgICAgcGFkZHVzdyAgICAgbTAsIG0yCisgICAgcGFkZHVzdyAgICAgbTEsIG0zCisgICAgcG11bGhyc3cgICAgbTAsIFtwd184MTkyXQorICAgIHBtdWxocnN3ICAgIG0xLCBbcHdfODE5Ml0KKyVpZmlkbiAlMSwgYXZnCisgICAgbW92YSAgICAgICAgbTYsIFtyMCtyNF0KKyAgICBwYWNrdXN3YiAgICBtMCwgbTEKKyAgICBwc2h1ZmIgICAgICBtMCwgbTQKKyAgICBwYXZnYiAgICAgICBtMCwgbTYKKyVlbHNlCisgICAgcGFja3Vzd2IgICAgbTAsIG0xCisgICAgcHNodWZiICAgICAgbTAsIG00CislZW5kaWYKKyAgICBtb3ZhICAgW3IwK3I0XSwgbTAKKyAgICBhZGQgICAgICAgICByNCwgcjIKKworICAgIG1vdnUgICAgICAgIG0wLCBbcjErcjRdCisgICAgbW92dSAgICAgICAgbTEsIFtyMStyNCsxXQorICAgIHBtYWRkdWJzdyAgIG0wLCBtNQorICAgIHBtYWRkdWJzdyAgIG0xLCBtNQorICAgIHBhZGR1c3cgICAgIG0yLCBtMAorICAgIHBhZGR1c3cgICAgIG0zLCBtMQorICAgIHBtdWxocnN3ICAgIG0yLCBbcHdfODE5Ml0KKyAgICBwbXVsaHJzdyAgICBtMywgW3B3XzgxOTJdCislaWZpZG4gJTEsIGF2ZworICAgIG1vdmEgICAgICAgIG02LCBbcjArcjRdCisgICAgcGFja3Vzd2IgICAgbTIsIG0zCisgICAgcHNodWZiICAgICAgbTIsIG00CisgICAgcGF2Z2IgICAgICAgbTIsIG02CislZWxzZQorICAgIHBhY2t1c3diICAgIG0yLCBtMworICAgIHBzaHVmYiAgICAgIG0yLCBtNAorJWVuZGlmCisgICAgbW92YSAgIFtyMCtyNF0sIG0yCisgICAgYWRkICAgICAgICAgcjQsIHIyCisgICAgc3ViICAgICAgICByM2QsIDIKKyAgICBqbnogLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggc3NzZTMKK1NTU0UzX1BJWEVMU19YWTIgcHV0CitTU1NFM19QSVhFTFNfWFkyIGF2ZworSU5JVF9YTU0gc3NzZTMKK1NTU0UzX1BJWEVMU19YWTIgcHV0LCA2CitTU1NFM19QSVhFTFNfWFkyIGF2ZywgNwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2hwZWxkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhZTk5MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfWDg2X0hQRUxEU1BfSAorI2RlZmluZSBBVkNPREVDX1g4Nl9IUEVMRFNQX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIGZmX2F2Z19waXhlbHM4X3gyX21teCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOworCit2b2lkIGZmX2F2Z19waXhlbHM4X3h5Ml9tbXgodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX2F2Z19waXhlbHM4X3h5Ml9tbXhleHQodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX2F2Z19waXhlbHM4X3h5Ml9zc3NlMyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKKwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfeHkyX21teCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX2F2Z19waXhlbHMxNl94eTJfc3NlMih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfeHkyX3Nzc2UzKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOworCit2b2lkIGZmX3B1dF9waXhlbHM4X3h5Ml9tbXgodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHM4X3h5Ml9zc3NlMyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzMTZfeHkyX21teCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHMxNl94eTJfc3NlMih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzMTZfeHkyX3Nzc2UzKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOworCisjZW5kaWYgLyogQVZDT0RFQ19YODZfSFBFTERTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvaHBlbGRzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaHBlbGRzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhZTIyZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwX2luaXQuYwpAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIFNJTUQtb3B0aW1pemVkIGhhbGZwZWwgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBNTVggb3B0aW1pemF0aW9uIGJ5IE5pY2sgS3Vyc2hldiA8bmlja29sc19rQG1haWwucnU+CisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2hwZWxkc3AuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3BpeGVscy5oIgorI2luY2x1ZGUgImZwZWwuaCIKKyNpbmNsdWRlICJocGVsZHNwLmgiCisKK3ZvaWQgZmZfcHV0X3BpeGVsczhfeDJfbW14ZXh0KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHM4X3gyXzNkbm93KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczE2X3gyX21teGV4dCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczE2X3gyXzNkbm93KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHMxNl94Ml9zc2UyKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X3gyX3NzZTIodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzMTZfeTJfc3NlMih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX2F2Z19waXhlbHMxNl95Ml9zc2UyKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX21teGV4dCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyXzNkbm93KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94Ml9leGFjdF9tbXhleHQodWludDhfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX2V4YWN0XzNkbm93KHVpbnQ4X3QgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzOF95Ml9tbXhleHQodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfeTJfM2Rub3codWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeTJfbW14ZXh0KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeTJfM2Rub3codWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyX2V4YWN0X21teGV4dCh1aW50OF90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeTJfZXhhY3RfM2Rub3codWludDhfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX2F2Z19waXhlbHM4XzNkbm93KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczhfeDJfbW14ZXh0KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX2F2Z19waXhlbHM4X3gyXzNkbm93KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczhfeTJfbW14ZXh0KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX2F2Z19waXhlbHM4X3kyXzNkbm93KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczhfeHkyXzNkbm93KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX2F2Z19hcHByb3hfcGl4ZWxzOF94eTJfbW14ZXh0KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX2FwcHJveF9waXhlbHM4X3h5Ml8zZG5vdyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKKworI2RlZmluZSBhdmdfcGl4ZWxzOF9tbXggICAgICAgICBmZl9hdmdfcGl4ZWxzOF9tbXgKKyNkZWZpbmUgYXZnX3BpeGVsczhfeDJfbW14ICAgICAgZmZfYXZnX3BpeGVsczhfeDJfbW14CisjZGVmaW5lIGF2Z19waXhlbHMxNl9tbXggICAgICAgIGZmX2F2Z19waXhlbHMxNl9tbXgKKyNkZWZpbmUgYXZnX3BpeGVsczhfeHkyX21teCAgICAgZmZfYXZnX3BpeGVsczhfeHkyX21teAorI2RlZmluZSBhdmdfcGl4ZWxzMTZfeHkyX21teCAgICBmZl9hdmdfcGl4ZWxzMTZfeHkyX21teAorI2RlZmluZSBwdXRfcGl4ZWxzOF9tbXggICAgICAgICBmZl9wdXRfcGl4ZWxzOF9tbXgKKyNkZWZpbmUgcHV0X3BpeGVsczE2X21teCAgICAgICAgZmZfcHV0X3BpeGVsczE2X21teAorI2RlZmluZSBwdXRfcGl4ZWxzOF94eTJfbW14ICAgICBmZl9wdXRfcGl4ZWxzOF94eTJfbW14CisjZGVmaW5lIHB1dF9waXhlbHMxNl94eTJfbW14ICAgIGZmX3B1dF9waXhlbHMxNl94eTJfbW14CisjZGVmaW5lIGF2Z19ub19ybmRfcGl4ZWxzMTZfbW14IGZmX2F2Z19waXhlbHMxNl9tbXgKKyNkZWZpbmUgcHV0X25vX3JuZF9waXhlbHM4X21teCAgZmZfcHV0X3BpeGVsczhfbW14CisjZGVmaW5lIHB1dF9ub19ybmRfcGl4ZWxzMTZfbW14IGZmX3B1dF9waXhlbHMxNl9tbXgKKworI2lmIEhBVkVfSU5MSU5FX0FTTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNTVggbm8gcm91bmRpbmcgKi8KKyNkZWZpbmUgREVGKHgsIHkpIHggIyMgX25vX3JuZF8gIyMgeSAjIyBfbW14CisjZGVmaW5lIFNFVF9STkQgIE1PVlFfV09ORQorI2RlZmluZSBQQVZHQlAoYSwgYiwgYywgZCwgZSwgZikgICAgICAgIFBBVkdCUF9NTVhfTk9fUk5EKGEsIGIsIGMsIGQsIGUsIGYpCisjZGVmaW5lIFBBVkdCKGEsIGIsIGMsIGUpICAgICAgICAgICAgICAgUEFWR0JfTU1YX05PX1JORChhLCBiLCBjLCBlKQorI2RlZmluZSBTVEFUSUMgc3RhdGljCisKKyNpbmNsdWRlICJybmRfdGVtcGxhdGUuYyIKKyNpbmNsdWRlICJocGVsZHNwX3JuZF90ZW1wbGF0ZS5jIgorCisjdW5kZWYgREVGCisjdW5kZWYgU0VUX1JORAorI3VuZGVmIFBBVkdCUAorI3VuZGVmIFBBVkdCCisjdW5kZWYgU1RBVElDCisKK0NBTExfMlhfUElYRUxTKGF2Z19ub19ybmRfcGl4ZWxzMTZfeTJfbW14LCBhdmdfbm9fcm5kX3BpeGVsczhfeTJfbW14LCA4KQorQ0FMTF8yWF9QSVhFTFMocHV0X25vX3JuZF9waXhlbHMxNl95Ml9tbXgsIHB1dF9ub19ybmRfcGl4ZWxzOF95Ml9tbXgsIDgpCisKK0NBTExfMlhfUElYRUxTKGF2Z19ub19ybmRfcGl4ZWxzMTZfeHkyX21teCwgYXZnX25vX3JuZF9waXhlbHM4X3h5Ml9tbXgsIDgpCitDQUxMXzJYX1BJWEVMUyhwdXRfbm9fcm5kX3BpeGVsczE2X3h5Ml9tbXgsIHB1dF9ub19ybmRfcGl4ZWxzOF94eTJfbW14LCA4KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNTVggcm91bmRpbmcgKi8KKworI2RlZmluZSBERUYoeCwgeSkgeCAjIyBfICMjIHkgIyMgX21teAorI2RlZmluZSBTRVRfUk5EICBNT1ZRX1dUV08KKyNkZWZpbmUgUEFWR0JQKGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICBQQVZHQlBfTU1YKGEsIGIsIGMsIGQsIGUsIGYpCisjZGVmaW5lIFBBVkdCKGEsIGIsIGMsIGUpICAgICAgICAgICAgICAgUEFWR0JfTU1YKGEsIGIsIGMsIGUpCisKKyNpbmNsdWRlICJocGVsZHNwX3JuZF90ZW1wbGF0ZS5jIgorCisjdW5kZWYgREVGCisjZGVmaW5lIERFRih4LCB5KSBmZl8gIyMgeCAjIyBfICMjIHkgIyMgX21teAorI2RlZmluZSBTVEFUSUMKKworI2luY2x1ZGUgInJuZF90ZW1wbGF0ZS5jIgorCisjdW5kZWYgREVGCisjdW5kZWYgU0VUX1JORAorI3VuZGVmIFBBVkdCUAorI3VuZGVmIFBBVkdCCisKK0NBTExfMlhfUElYRUxTKGF2Z19waXhlbHMxNl95Ml9tbXgsIGF2Z19waXhlbHM4X3kyX21teCwgOCkKK0NBTExfMlhfUElYRUxTKHB1dF9waXhlbHMxNl95Ml9tbXgsIHB1dF9waXhlbHM4X3kyX21teCwgOCkKKworQ0FMTF8yWF9QSVhFTFNfRVhQT1JUKGZmX2F2Z19waXhlbHMxNl94eTJfbW14LCBmZl9hdmdfcGl4ZWxzOF94eTJfbW14LCA4KQorQ0FMTF8yWF9QSVhFTFNfRVhQT1JUKGZmX3B1dF9waXhlbHMxNl94eTJfbW14LCBmZl9wdXRfcGl4ZWxzOF94eTJfbW14LCA4KQorCisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCisKKworI2lmIEhBVkVfWUFTTQorCisjZGVmaW5lIEhQRUxEU1BfQVZHX1BJWEVMUzE2KENQVUVYVCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENBTExfMlhfUElYRUxTKHB1dF9ub19ybmRfcGl4ZWxzMTZfeDIgIyMgQ1BVRVhULCBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeDIgIyMgQ1BVRVhULCA4KSBcCisgICAgQ0FMTF8yWF9QSVhFTFMocHV0X3BpeGVsczE2X3kyICAgICAgICAjIyBDUFVFWFQsIGZmX3B1dF9waXhlbHM4X3kyICAgICAgICAjIyBDUFVFWFQsIDgpIFwKKyAgICBDQUxMXzJYX1BJWEVMUyhwdXRfbm9fcm5kX3BpeGVsczE2X3kyICMjIENQVUVYVCwgZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyICMjIENQVUVYVCwgOCkgXAorICAgIENBTExfMlhfUElYRUxTKGF2Z19waXhlbHMxNiAgICAgICAgICAgIyMgQ1BVRVhULCBmZl9hdmdfcGl4ZWxzOCAgICAgICAgICAgIyMgQ1BVRVhULCA4KSBcCisgICAgQ0FMTF8yWF9QSVhFTFMoYXZnX3BpeGVsczE2X3gyICAgICAgICAjIyBDUFVFWFQsIGZmX2F2Z19waXhlbHM4X3gyICAgICAgICAjIyBDUFVFWFQsIDgpIFwKKyAgICBDQUxMXzJYX1BJWEVMUyhhdmdfcGl4ZWxzMTZfeTIgICAgICAgICMjIENQVUVYVCwgZmZfYXZnX3BpeGVsczhfeTIgICAgICAgICMjIENQVUVYVCwgOCkgXAorICAgIENBTExfMlhfUElYRUxTKGF2Z19waXhlbHMxNl94eTIgICAgICAgIyMgQ1BVRVhULCBmZl9hdmdfcGl4ZWxzOF94eTIgICAgICAgIyMgQ1BVRVhULCA4KSBcCisgICAgQ0FMTF8yWF9QSVhFTFMoYXZnX2FwcHJveF9waXhlbHMxNl94eTIjIyBDUFVFWFQsIGZmX2F2Z19hcHByb3hfcGl4ZWxzOF94eTIjIyBDUFVFWFQsIDgpCisKK0hQRUxEU1BfQVZHX1BJWEVMUzE2KF8zZG5vdykKK0hQRUxEU1BfQVZHX1BJWEVMUzE2KF9tbXhleHQpCisKKyNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKworI2RlZmluZSBTRVRfSFBFTF9GVU5DU19FWFQoUEZYLCBJRFgsIFNJWkUsIENQVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoSEFWRV9NTVhfRVhURVJOQUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiIElEWCBbMF0gPSBQRlggIyMgX3BpeGVscyAjIyBTSVpFICMjIF8gICAgICMjIENQVTsKKworI2lmIEhBVkVfTU1YX0lOTElORQorI2RlZmluZSBTRVRfSFBFTF9GVU5DUyhQRlgsIElEWCwgU0laRSwgQ1BVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0VUX0hQRUxfRlVOQ1NfRVhUKFBGWCwgSURYLCBTSVpFLCBDUFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjLT5QRlggIyMgX3BpeGVsc190YWIgSURYIFsxXSA9IFBGWCAjIyBfcGl4ZWxzICMjIFNJWkUgIyMgX3gyXyAgIyMgQ1BVOyBcCisgICAgICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYiBJRFggWzJdID0gUEZYICMjIF9waXhlbHMgIyMgU0laRSAjIyBfeTJfICAjIyBDUFU7IFwKKyAgICAgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiIElEWCBbM10gPSBQRlggIyMgX3BpeGVscyAjIyBTSVpFICMjIF94eTJfICMjIENQVTsgXAorICAgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBTRVRfSFBFTF9GVU5DUyhQRlgsIElEWCwgU0laRSwgQ1BVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0VUX0hQRUxfRlVOQ1NfRVhUKFBGWCwgSURYLCBTSVpFLCBDUFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgaHBlbGRzcF9pbml0X21teChIcGVsRFNQQ29udGV4dCAqYywgaW50IGZsYWdzLCBpbnQgY3B1X2ZsYWdzKQoreworICAgIFNFVF9IUEVMX0ZVTkNTKHB1dCwgICAgICAgIFswXSwgMTYsIG1teCk7CisgICAgU0VUX0hQRUxfRlVOQ1MocHV0X25vX3JuZCwgWzBdLCAxNiwgbW14KTsKKyAgICBTRVRfSFBFTF9GVU5DUyhhdmcsICAgICAgICBbMF0sIDE2LCBtbXgpOworICAgIFNFVF9IUEVMX0ZVTkNTKGF2Z19ub19ybmQsICAgICwgMTYsIG1teCk7CisgICAgU0VUX0hQRUxfRlVOQ1MocHV0LCAgICAgICAgWzFdLCAgOCwgbW14KTsKKyAgICBTRVRfSFBFTF9GVU5DUyhwdXRfbm9fcm5kLCBbMV0sICA4LCBtbXgpOworICAgIGlmIChIQVZFX01NWF9FWFRFUk5BTCkgeworICAgICAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVswXSA9IGZmX2F2Z19waXhlbHM4X21teDsKKyAgICAgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMV0gPSBmZl9hdmdfcGl4ZWxzOF94Ml9tbXg7CisgICAgfQorI2lmIEhBVkVfTU1YX0lOTElORQorICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzJdID0gYXZnX3BpeGVsczhfeTJfbW14OworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzNdID0gZmZfYXZnX3BpeGVsczhfeHkyX21teDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBocGVsZHNwX2luaXRfbW14ZXh0KEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MsIGludCBjcHVfZmxhZ3MpCit7CisjaWYgSEFWRV9NTVhFWFRfRVhURVJOQUwKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsxXSA9IGZmX3B1dF9waXhlbHMxNl94Ml9tbXhleHQ7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMl0gPSBwdXRfcGl4ZWxzMTZfeTJfbW14ZXh0OworCisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMF0gPSBhdmdfcGl4ZWxzMTZfbW14ZXh0OworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzFdID0gYXZnX3BpeGVsczE2X3gyX21teGV4dDsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsyXSA9IGF2Z19waXhlbHMxNl95Ml9tbXhleHQ7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bM10gPSBhdmdfcGl4ZWxzMTZfeHkyX21teGV4dDsKKworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzFdID0gZmZfcHV0X3BpeGVsczhfeDJfbW14ZXh0OworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzJdID0gZmZfcHV0X3BpeGVsczhfeTJfbW14ZXh0OworCisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMF0gPSBmZl9hdmdfcGl4ZWxzOF9tbXhleHQ7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMV0gPSBmZl9hdmdfcGl4ZWxzOF94Ml9tbXhleHQ7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMl0gPSBmZl9hdmdfcGl4ZWxzOF95Ml9tbXhleHQ7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bM10gPSBmZl9hdmdfcGl4ZWxzOF94eTJfbW14ZXh0OworCisgICAgaWYgKCEoZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKSkgeworICAgICAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMF1bMV0gPSBwdXRfbm9fcm5kX3BpeGVsczE2X3gyX21teGV4dDsKKyAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzJdID0gcHV0X25vX3JuZF9waXhlbHMxNl95Ml9tbXhleHQ7CisgICAgICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVsxXSA9IGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94Ml9tbXhleHQ7CisgICAgICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVsyXSA9IGZmX3B1dF9ub19ybmRfcGl4ZWxzOF95Ml9tbXhleHQ7CisKKyAgICAgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bM10gPSBhdmdfYXBwcm94X3BpeGVsczE2X3h5Ml9tbXhleHQ7CisgICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzNdID0gZmZfYXZnX2FwcHJveF9waXhlbHM4X3h5Ml9tbXhleHQ7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgQ09ERUNfRkxBR19CSVRFWEFDVCAmJiBDT05GSUdfVlAzX0RFQ09ERVIpIHsKKyAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzFdID0gZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX2V4YWN0X21teGV4dDsKKyAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzJdID0gZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyX2V4YWN0X21teGV4dDsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9NTVhFWFRfRVhURVJOQUwgKi8KK30KKworc3RhdGljIHZvaWQgaHBlbGRzcF9pbml0XzNkbm93KEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MsIGludCBjcHVfZmxhZ3MpCit7CisjaWYgSEFWRV9BTUQzRE5PV19FWFRFUk5BTAorICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzFdID0gZmZfcHV0X3BpeGVsczE2X3gyXzNkbm93OworICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzJdID0gcHV0X3BpeGVsczE2X3kyXzNkbm93OworCisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMF0gPSBhdmdfcGl4ZWxzMTZfM2Rub3c7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMV0gPSBhdmdfcGl4ZWxzMTZfeDJfM2Rub3c7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMl0gPSBhdmdfcGl4ZWxzMTZfeTJfM2Rub3c7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bM10gPSBhdmdfcGl4ZWxzMTZfeHkyXzNkbm93OworCisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bMV0gPSBmZl9wdXRfcGl4ZWxzOF94Ml8zZG5vdzsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsyXSA9IGZmX3B1dF9waXhlbHM4X3kyXzNkbm93OworCisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMF0gPSBmZl9hdmdfcGl4ZWxzOF8zZG5vdzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsxXSA9IGZmX2F2Z19waXhlbHM4X3gyXzNkbm93OworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzJdID0gZmZfYXZnX3BpeGVsczhfeTJfM2Rub3c7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bM10gPSBmZl9hdmdfcGl4ZWxzOF94eTJfM2Rub3c7CisKKyAgICBpZiAoIShmbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKXsKKyAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzFdID0gcHV0X25vX3JuZF9waXhlbHMxNl94Ml8zZG5vdzsKKyAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzJdID0gcHV0X25vX3JuZF9waXhlbHMxNl95Ml8zZG5vdzsKKyAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzFdID0gZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyXzNkbm93OworICAgICAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bMl0gPSBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeTJfM2Rub3c7CisKKyAgICAgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bM10gPSBhdmdfYXBwcm94X3BpeGVsczE2X3h5Ml8zZG5vdzsKKyAgICAgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bM10gPSBmZl9hdmdfYXBwcm94X3BpeGVsczhfeHkyXzNkbm93OworICAgIH0KKworICAgIGlmIChmbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QgJiYgQ09ORklHX1ZQM19ERUNPREVSKSB7CisgICAgICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVsxXSA9IGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94Ml9leGFjdF8zZG5vdzsKKyAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzJdID0gZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyX2V4YWN0XzNkbm93OworICAgIH0KKyNlbmRpZiAvKiBIQVZFX0FNRDNETk9XX0VYVEVSTkFMICovCit9CisKK3N0YXRpYyB2b2lkIGhwZWxkc3BfaW5pdF9zc2UyKEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MsIGludCBjcHVfZmxhZ3MpCit7CisjaWYgSEFWRV9TU0UyX0VYVEVSTkFMCisgICAgaWYgKCEoY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfU1NFMlNMT1cpKSB7CisgICAgICAgIC8vIHRoZXNlIGZ1bmN0aW9ucyBhcmUgc2xvd2VyIHRoYW4gbW14IG9uIEFNRCwgYnV0IGZhc3RlciBvbiBJbnRlbAorICAgICAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVswXSAgICAgICAgPSBmZl9wdXRfcGl4ZWxzMTZfc3NlMjsKKyAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzBdID0gZmZfcHV0X3BpeGVsczE2X3NzZTI7CisgICAgICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzFdICAgICAgICA9IGZmX3B1dF9waXhlbHMxNl94Ml9zc2UyOworICAgICAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVsyXSAgICAgICAgPSBmZl9wdXRfcGl4ZWxzMTZfeTJfc3NlMjsKKyAgICAgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bM10gICAgICAgID0gZmZfcHV0X3BpeGVsczE2X3h5Ml9zc2UyOworICAgICAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVswXSAgICAgICAgPSBmZl9hdmdfcGl4ZWxzMTZfc3NlMjsKKyAgICAgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMV0gICAgICAgID0gZmZfYXZnX3BpeGVsczE2X3gyX3NzZTI7CisgICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzJdICAgICAgICA9IGZmX2F2Z19waXhlbHMxNl95Ml9zc2UyOworICAgICAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVszXSAgICAgICAgPSBmZl9hdmdfcGl4ZWxzMTZfeHkyX3NzZTI7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfU1NFMl9FWFRFUk5BTCAqLworfQorCitzdGF0aWMgdm9pZCBocGVsZHNwX2luaXRfc3NzZTMoSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncywgaW50IGNwdV9mbGFncykKK3sKKyNpZiBIQVZFX1NTU0UzX0VYVEVSTkFMCisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bM10gICAgICAgICAgICA9IGZmX3B1dF9waXhlbHMxNl94eTJfc3NzZTM7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bM10gICAgICAgICAgICA9IGZmX2F2Z19waXhlbHMxNl94eTJfc3NzZTM7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bM10gICAgICAgICAgICA9IGZmX3B1dF9waXhlbHM4X3h5Ml9zc3NlMzsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVszXSAgICAgICAgICAgID0gZmZfYXZnX3BpeGVsczhfeHkyX3Nzc2UzOworI2VuZGlmCit9CisKK2F2X2NvbGQgdm9pZCBmZl9ocGVsZHNwX2luaXRfeDg2KEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChJTkxJTkVfTU1YKGNwdV9mbGFncykpCisgICAgICAgIGhwZWxkc3BfaW5pdF9tbXgoYywgZmxhZ3MsIGNwdV9mbGFncyk7CisKKyAgICBpZiAoRVhURVJOQUxfQU1EM0ROT1coY3B1X2ZsYWdzKSkKKyAgICAgICAgaHBlbGRzcF9pbml0XzNkbm93KGMsIGZsYWdzLCBjcHVfZmxhZ3MpOworCisgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKQorICAgICAgICBocGVsZHNwX2luaXRfbW14ZXh0KGMsIGZsYWdzLCBjcHVfZmxhZ3MpOworCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgaHBlbGRzcF9pbml0X3NzZTIoYywgZmxhZ3MsIGNwdV9mbGFncyk7CisKKyAgICBpZiAoRVhURVJOQUxfU1NTRTMoY3B1X2ZsYWdzKSkKKyAgICAgICAgaHBlbGRzcF9pbml0X3Nzc2UzKGMsIGZsYWdzLCBjcHVfZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2hwZWxkc3Bfcm5kX3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaHBlbGRzcF9ybmRfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2JjNDEyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2hwZWxkc3Bfcm5kX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBTSU1ELW9wdGltaXplZCBoYWxmcGVsIGZ1bmN0aW9ucyBhcmUgY29tcGlsZWQgdHdpY2UgZm9yIHJuZC9ub19ybmQKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogTU1YIG9wdGltaXphdGlvbiBieSBOaWNrIEt1cnNoZXYgPG5pY2tvbHNfa0BtYWlsLnJ1PgorICogbW9zdGx5IHJld3JpdHRlbiBieSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogYW5kIGltcHJvdmVkIGJ5IFpkZW5layBLYWJlbGFjIDxrYWJpQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBwdXRfcGl4ZWxzCitzdGF0aWMgdm9pZCBERUYocHV0LCBwaXhlbHM4X3gyKSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBNT1ZRX0JGRShtbTYpOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJsZWEgICAgKCUzLCAlMyksICUlIlJFR19hIiAgICAgXG5cdCIKKyAgICAgICAgIi5wMmFsaWduIDMgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgKCUxKSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAxKCUxKSwgJSVtbTEgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMSwgJTMpLCAlJW1tMiAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgMSglMSwgJTMpLCAlJW1tMyAgICAgICAgXG5cdCIKKyAgICAgICAgUEFWR0JQKCUlbW0wLCAlJW1tMSwgJSVtbTQsICAgJSVtbTIsICUlbW0zLCAlJW1tNSkKKyAgICAgICAgIm1vdnEgICAlJW1tNCwgKCUyKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICUlbW01LCAoJTIsICUzKSAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlJSJSRUdfYSIsICUyICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMSksICUlbW0wICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgMSglMSksICUlbW0xICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAoJTEsICUzKSwgJSVtbTIgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgIDEoJTEsICUzKSwgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgIFBBVkdCUCglJW1tMCwgJSVtbTEsICUlbW00LCAgICUlbW0yLCAlJW1tMywgJSVtbTUpCisgICAgICAgICJtb3ZxICAgJSVtbTQsICglMikgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAlJW1tNSwgKCUyLCAlMykgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICUlIlJFR19hIiwgJTEgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YmwgICAkNCwgJTAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiam56ICAgIDFiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDoiK2ciKGgpLCAiK1MiKHBpeGVscyksICIrRCIoYmxvY2spCisgICAgICAgIDoiciIoKHg4Nl9yZWcpbGluZV9zaXplKQorICAgICAgICA6UkVHX2EsICJtZW1vcnkiKTsKK30KKworc3RhdGljIHZvaWQgREVGKHB1dCwgcGl4ZWxzMTZfeDIpKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIE1PVlFfQkZFKG1tNik7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAgICAgICAgKCUzLCAlMyksICUlIlJFR19hIiBcblx0IgorICAgICAgICAiLnAyYWxpZ24gMyAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAoJTEpLCAlJW1tMCAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgIDEoJTEpLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgKCUxLCAlMyksICUlbW0yICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAxKCUxLCAlMyksICUlbW0zICAgICAgICBcblx0IgorICAgICAgICBQQVZHQlAoJSVtbTAsICUlbW0xLCAlJW1tNCwgICAlJW1tMiwgJSVtbTMsICUlbW01KQorICAgICAgICAibW92cSAgICUlbW00LCAoJTIpICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTUsICglMiwgJTMpICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICA4KCUxKSwgJSVtbTAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgIDkoJTEpLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgOCglMSwgJTMpLCAlJW1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICA5KCUxLCAlMyksICUlbW0zICAgICAgICBcblx0IgorICAgICAgICBQQVZHQlAoJSVtbTAsICUlbW0xLCAlJW1tNCwgICAlJW1tMiwgJSVtbTMsICUlbW01KQorICAgICAgICAibW92cSAgICUlbW00LCA4KCUyKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTUsIDgoJTIsICUzKSAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlJSJSRUdfYSIsICUxICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICUlIlJFR19hIiwgJTIgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgKCUxKSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAxKCUxKSwgJSVtbTEgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMSwgJTMpLCAlJW1tMiAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgMSglMSwgJTMpLCAlJW1tMyAgICAgICAgXG5cdCIKKyAgICAgICAgUEFWR0JQKCUlbW0wLCAlJW1tMSwgJSVtbTQsICAgJSVtbTIsICUlbW0zLCAlJW1tNSkKKyAgICAgICAgIm1vdnEgICAlJW1tNCwgKCUyKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICUlbW01LCAoJTIsICUzKSAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgOCglMSksICUlbW0wICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICA5KCUxKSwgJSVtbTEgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgIDgoJTEsICUzKSwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgOSglMSwgJTMpLCAlJW1tMyAgICAgICAgXG5cdCIKKyAgICAgICAgUEFWR0JQKCUlbW0wLCAlJW1tMSwgJSVtbTQsICAgJSVtbTIsICUlbW0zLCAlJW1tNSkKKyAgICAgICAgIm1vdnEgICAlJW1tNCwgOCglMikgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICUlbW01LCA4KCUyLCAlMykgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlJSJSRUdfYSIsICUyICAgICAgICAgICBcblx0IgorICAgICAgICAic3VibCAgICQ0LCAlMCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJqbnogICAgMWIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiIrZyIoaCksICIrUyIocGl4ZWxzKSwgIitEIihibG9jaykKKyAgICAgICAgOiJyIigoeDg2X3JlZylsaW5lX3NpemUpCisgICAgICAgIDpSRUdfYSwgIm1lbW9yeSIpOworfQorCitzdGF0aWMgdm9pZCBERUYocHV0LCBwaXhlbHM4X3kyKSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBNT1ZRX0JGRShtbTYpOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJsZWEgKCUzLCAlMyksICUlIlJFR19hIiAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUxKSwgJSVtbTAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiLnAyYWxpZ24gMyAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAoJTEsICUzKSwgJSVtbTEgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMSwgJSUiUkVHX2EiKSwlJW1tMiAgIFxuXHQiCisgICAgICAgIFBBVkdCUCglJW1tMSwgJSVtbTAsICUlbW00LCAgICUlbW0yLCAlJW1tMSwgJSVtbTUpCisgICAgICAgICJtb3ZxICAgJSVtbTQsICglMikgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAlJW1tNSwgKCUyLCAlMykgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICUlIlJFR19hIiwgJTEgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAoJTEsICUzKSwgJSVtbTEgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMSwgJSUiUkVHX2EiKSwlJW1tMCAgIFxuXHQiCisgICAgICAgIFBBVkdCUCglJW1tMSwgJSVtbTIsICUlbW00LCAgICUlbW0wLCAlJW1tMSwgJSVtbTUpCisgICAgICAgICJtb3ZxICAgJSVtbTQsICglMikgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAlJW1tNSwgKCUyLCAlMykgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICUlIlJFR19hIiwgJTEgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YmwgICAkNCwgJTAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiam56ICAgIDFiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDoiK2ciKGgpLCAiK1MiKHBpeGVscyksICIrRCIoYmxvY2spCisgICAgICAgIDoiciIoKHg4Nl9yZWcpbGluZV9zaXplKQorICAgICAgICA6UkVHX2EsICJtZW1vcnkiKTsKK30KKworc3RhdGljIHZvaWQgREVGKGF2ZywgcGl4ZWxzMTZfeDIpKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIE1PVlFfQkZFKG1tNik7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAiLnAyYWxpZ24gMyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICglMSksICUlbW0wICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgMSglMSksICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAoJTIpLCAlJW1tMyAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IoJSVtbTAsICUlbW0xLCAlJW1tMiwgJSVtbTYpCisgICAgICAgICAgICBQQVZHQl9NTVgoJSVtbTMsICUlbW0yLCAlJW1tMCwgJSVtbTYpCisgICAgICAgICAgICAibW92cSAgJSVtbTAsICglMikgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICA4KCUxKSwgJSVtbTAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgIDkoJTEpLCAlJW1tMSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgOCglMiksICUlbW0zICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tMSwgJSVtbTIsICUlbW02KQorICAgICAgICAgICAgUEFWR0JfTU1YKCUlbW0zLCAlJW1tMiwgJSVtbTAsICUlbW02KQorICAgICAgICAgICAgIm1vdnEgICUlbW0wLCA4KCUyKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICUzLCAlMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgICAgJTMsICUyICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN1YmwgICAkMSwgJTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiam56ICAgIDFiICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDoiK2ciKGgpLCAiK1MiKHBpeGVscyksICIrRCIoYmxvY2spCisgICAgICAgICAgICA6InIiKCh4ODZfcmVnKWxpbmVfc2l6ZSkKKyAgICAgICAgICAgIDoibWVtb3J5Iik7Cit9CisKK3N0YXRpYyB2b2lkIERFRihhdmcsIHBpeGVsczhfeTIpKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIE1PVlFfQkZFKG1tNik7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAgICAoJTMsICUzKSwgJSUiUkVHX2EiICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMSksICUlbW0wICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIucDJhbGlnbiAzICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMSwgJTMpLCAlJW1tMSAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMiAgXG5cdCIKKyAgICAgICAgUEFWR0JQKCUlbW0xLCAlJW1tMCwgJSVtbTQsICAgJSVtbTIsICUlbW0xLCAlJW1tNSkKKyAgICAgICAgIm1vdnEgICAoJTIpLCAlJW1tMyAgICAgICAgICAgICBcblx0IgorICAgICAgICBQQVZHQl9NTVgoJSVtbTMsICUlbW00LCAlJW1tMCwgJSVtbTYpCisgICAgICAgICJtb3ZxICAgKCUyLCAlMyksICUlbW0zICAgICAgICAgXG5cdCIKKyAgICAgICAgUEFWR0JfTU1YKCUlbW0zLCAlJW1tNSwgJSVtbTEsICUlbW02KQorICAgICAgICAibW92cSAgICUlbW0wLCAoJTIpICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTEsICglMiwgJTMpICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlJSJSRUdfYSIsICUxICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICUlIlJFR19hIiwgJTIgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgICAoJTEsICUzKSwgJSVtbTEgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMSwgJSUiUkVHX2EiKSwgJSVtbTAgIFxuXHQiCisgICAgICAgIFBBVkdCUCglJW1tMSwgJSVtbTIsICUlbW00LCAgICUlbW0wLCAlJW1tMSwgJSVtbTUpCisgICAgICAgICJtb3ZxICAgKCUyKSwgJSVtbTMgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUEFWR0JfTU1YKCUlbW0zLCAlJW1tNCwgJSVtbTIsICUlbW02KQorICAgICAgICAibW92cSAgICglMiwgJTMpLCAlJW1tMyAgICAgICAgIFxuXHQiCisgICAgICAgIFBBVkdCX01NWCglJW1tMywgJSVtbTUsICUlbW0xLCAlJW1tNikKKyAgICAgICAgIm1vdnEgICAlJW1tMiwgKCUyKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICUlbW0xLCAoJTIsICUzKSAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlJSJSRUdfYSIsICUyICAgICAgICAgICBcblx0IgorCisgICAgICAgICJzdWJsICAgJDQsICUwICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImpueiAgICAxYiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IitnIihoKSwgIitTIihwaXhlbHMpLCAiK0QiKGJsb2NrKQorICAgICAgICA6InIiKCh4ODZfcmVnKWxpbmVfc2l6ZSkKKyAgICAgICAgOlJFR19hLCAibWVtb3J5Iik7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvaHVmZnl1dmRzcC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaHVmZnl1dmRzcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0ODU1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZHNwLmFzbQpAQCAtMCwwICsxLDI1MyBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogU0lNRC1vcHRpbWl6ZWQgSHVmZllVViBmdW5jdGlvbnMKKzsqIENvcHlyaWdodCAoYykgMjAwOCBMb3JlbiBNZXJyaXR0Cis7KiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXN0b3BoZSBHaXNxdWV0Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKK3BiX2Y6IHRpbWVzIDE2IGRiIDE1CitwYl96enp6enp6ejc3Nzc3Nzc3OiB0aW1lcyA4IGRiIC0xCitwYl83OiB0aW1lcyA4IGRiIDcKK3BiX3p6enozMzMzenp6emJiYmI6IGRiIC0xLC0xLC0xLC0xLDMsMywzLDMsLTEsLTEsLTEsLTEsMTEsMTEsMTEsMTEKK3BiX3p6MTF6ejU1eno5OXp6ZGQ6IGRiIC0xLC0xLDEsMSwtMSwtMSw1LDUsLTEsLTEsOSw5LC0xLC0xLDEzLDEzCisKK1NFQ1RJT05fVEVYVAorCis7IHZvaWQgZmZfYWRkX2hmeXVfbWVkaWFuX3ByZWRfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqdG9wLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaWZmLCBpbnQgdywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKQorJW1hY3JvIEhGWVVfTUVESUFOIDAKK2NnbG9iYWwgYWRkX2hmeXVfbWVkaWFuX3ByZWQsIDYsNiw4LCBkc3QsIHRvcCwgZGlmZiwgdywgbGVmdCwgbGVmdF90b3AKKyAgICBtb3Z1ICAgIG0wLCBbdG9wcV0KKyAgICBtb3ZhICAgIG0yLCBtMAorICAgIG1vdmQgICAgbTQsIFtsZWZ0X3RvcHFdCisgICAgTFNISUZUICBtMiwgMQorICAgIG1vdmEgICAgbTEsIG0wCisgICAgcG9yICAgICBtNCwgbTIKKyAgICBtb3ZkICAgIG0zLCBbbGVmdHFdCisgICAgcHN1YmIgICBtMCwgbTQgOyB0LXRsCisgICAgYWRkICAgIGRzdHEsIHdxCisgICAgYWRkICAgIHRvcHEsIHdxCisgICAgYWRkICAgZGlmZnEsIHdxCisgICAgbmVnICAgICAgd3EKKyAgICBqbXAgLnNraXAKKy5sb29wOgorICAgIG1vdnUgICAgbTQsIFt0b3BxK3dxXQorICAgIG1vdmEgICAgbTAsIG00CisgICAgTFNISUZUICBtNCwgMQorICAgIHBvciAgICAgbTQsIG0xCisgICAgbW92YSAgICBtMSwgbTAgOyB0CisgICAgcHN1YmIgICBtMCwgbTQgOyB0LXRsCisuc2tpcDoKKyAgICBtb3Z1ICAgIG0yLCBbZGlmZnErd3FdCislYXNzaWduIGkgMAorJXJlcCBtbXNpemUKKyAgICBtb3ZhICAgIG00LCBtMAorICAgIHBhZGRiICAgbTQsIG0zIDsgdC10bCtsCisgICAgbW92YSAgICBtNSwgbTMKKyAgICBwbWF4dWIgIG0zLCBtMQorICAgIHBtaW51YiAgbTUsIG0xCisgICAgcG1pbnViICBtMywgbTQKKyAgICBwbWF4dWIgIG0zLCBtNSA7IG1lZGlhbgorICAgIHBhZGRiICAgbTMsIG0yIDsgK3Jlc2lkdWFsCislaWYgaT09MAorICAgIG1vdmEgICAgbTcsIG0zCisgICAgTFNISUZUICBtNywgbW1zaXplLTEKKyVlbHNlCisgICAgbW92YSAgICBtNiwgbTMKKyAgICBSU0hJRlQgIG03LCAxCisgICAgTFNISUZUICBtNiwgbW1zaXplLTEKKyAgICBwb3IgICAgIG03LCBtNgorJWVuZGlmCislaWYgaTxtbXNpemUtMQorICAgIFJTSElGVCAgbTAsIDEKKyAgICBSU0hJRlQgIG0xLCAxCisgICAgUlNISUZUICBtMiwgMQorJWVuZGlmCislYXNzaWduIGkgaSsxCislZW5kcmVwCisgICAgbW92dSBbZHN0cSt3cV0sIG03CisgICAgYWRkICAgICAgd3EsIG1tc2l6ZQorICAgIGpsIC5sb29wCisgICAgbW92enggICByMmQsIGJ5dGUgW2RzdHEtMV0KKyAgICBtb3YgW2xlZnRxXSwgcjJkCisgICAgbW92enggICByMmQsIGJ5dGUgW3RvcHEtMV0KKyAgICBtb3YgW2xlZnRfdG9wcV0sIHIyZAorICAgIFJFVAorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggbW14ZXh0CitIRllVX01FRElBTgorJWVuZGlmCitJTklUX1hNTSBzc2UyCitIRllVX01FRElBTgorCisKKyVtYWNybyBBRERfSEZZVV9MRUZUX0xPT1AgMiA7ICUxID0gZHN0X2lzX2FsaWduZWQsICUyID0gc3JjX2lzX2FsaWduZWQKKyAgICBhZGQgICAgIHNyY3EsIHdxCisgICAgYWRkICAgICBkc3RxLCB3cQorICAgIG5lZyAgICAgd3EKKyUlLmxvb3A6CislaWYgJTIKKyAgICBtb3ZhICAgIG0xLCBbc3JjcSt3cV0KKyVlbHNlCisgICAgbW92dSAgICBtMSwgW3NyY3Erd3FdCislZW5kaWYKKyAgICBtb3ZhICAgIG0yLCBtMQorICAgIHBzbGx3ICAgbTEsIDgKKyAgICBwYWRkYiAgIG0xLCBtMgorICAgIG1vdmEgICAgbTIsIG0xCisgICAgcHNodWZiICBtMSwgbTMKKyAgICBwYWRkYiAgIG0xLCBtMgorICAgIHBzaHVmYiAgbTAsIG01CisgICAgbW92YSAgICBtMiwgbTEKKyAgICBwc2h1ZmIgIG0xLCBtNAorICAgIHBhZGRiICAgbTEsIG0yCislaWYgbW1zaXplID09IDE2CisgICAgbW92YSAgICBtMiwgbTEKKyAgICBwc2h1ZmIgIG0xLCBtNgorICAgIHBhZGRiICAgbTEsIG0yCislZW5kaWYKKyAgICBwYWRkYiAgIG0wLCBtMQorJWlmICUxCisgICAgbW92YSAgICBbZHN0cSt3cV0sIG0wCislZWxzZQorICAgIG1vdnEgICAgW2RzdHErd3FdLCBtMAorICAgIG1vdmhwcyAgW2RzdHErd3ErOF0sIG0wCislZW5kaWYKKyAgICBhZGQgICAgIHdxLCBtbXNpemUKKyAgICBqbCAlJS5sb29wCisgICAgbW92ICAgICBlYXgsIG1tc2l6ZS0xCisgICAgc3ViICAgICBlYXgsIHdkCisgICAgbW92ZCAgICBtMSwgZWF4CisgICAgcHNodWZiICBtMCwgbTEKKyAgICBtb3ZkICAgIGVheCwgbTAKKyAgICBSRVQKKyVlbmRtYWNybworCis7IGludCBmZl9hZGRfaGZ5dV9sZWZ0X3ByZWQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCB3LCBpbnQgbGVmdCkKK0lOSVRfTU1YIHNzc2UzCitjZ2xvYmFsIGFkZF9oZnl1X2xlZnRfcHJlZCwgMywzLDcsIGRzdCwgc3JjLCB3LCBsZWZ0Cisuc2tpcF9wcm9sb2d1ZToKKyAgICBtb3ZhICAgIG01LCBbcGJfN10KKyAgICBtb3ZhICAgIG00LCBbcGJfenp6ejMzMzN6enp6YmJiYl0KKyAgICBtb3ZhICAgIG0zLCBbcGJfenoxMXp6NTV6ejk5enpkZF0KKyAgICBtb3ZkICAgIG0wLCBsZWZ0bQorICAgIHBzbGxxICAgbTAsIDU2CisgICAgQUREX0hGWVVfTEVGVF9MT09QIDEsIDEKKworSU5JVF9YTU0gc3NlNAorY2dsb2JhbCBhZGRfaGZ5dV9sZWZ0X3ByZWQsIDMsMyw3LCBkc3QsIHNyYywgdywgbGVmdAorICAgIG1vdmEgICAgbTUsIFtwYl9mXQorICAgIG1vdmEgICAgbTYsIFtwYl96enp6enp6ejc3Nzc3Nzc3XQorICAgIG1vdmEgICAgbTQsIFtwYl96enp6MzMzM3p6enpiYmJiXQorICAgIG1vdmEgICAgbTMsIFtwYl96ejExeno1NXp6OTl6emRkXQorICAgIG1vdmQgICAgbTAsIGxlZnRtCisgICAgcHNsbGRxICBtMCwgMTUKKyAgICB0ZXN0ICAgIHNyY3EsIDE1CisgICAgam56IC5zcmNfdW5hbGlnbmVkCisgICAgdGVzdCAgICBkc3RxLCAxNQorICAgIGpueiAuZHN0X3VuYWxpZ25lZAorICAgIEFERF9IRllVX0xFRlRfTE9PUCAxLCAxCisuZHN0X3VuYWxpZ25lZDoKKyAgICBBRERfSEZZVV9MRUZUX0xPT1AgMCwgMQorLnNyY191bmFsaWduZWQ6CisgICAgQUREX0hGWVVfTEVGVF9MT09QIDAsIDAKKworJW1hY3JvIEFERF9CWVRFUyAwCitjZ2xvYmFsIGFkZF9ieXRlcywgMyw0LDIsIGRzdCwgc3JjLCB3LCBzaXplCisgICAgbW92ICBzaXplcSwgd3EKKyAgICBhbmQgIHNpemVxLCAtMiptbXNpemUKKyAgICBqeiAgLjIKKyAgICBhZGQgICBkc3RxLCBzaXplcQorICAgIGFkZCAgIHNyY3EsIHNpemVxCisgICAgbmVnICBzaXplcQorLjE6CisgICAgbW92YSAgICBtMCwgW3NyY3EgKyBzaXplcV0KKyAgICBtb3ZhICAgIG0xLCBbc3JjcSArIHNpemVxICsgbW1zaXplXQorICAgIHBhZGRiICAgbTAsIFtkc3RxICsgc2l6ZXFdCisgICAgcGFkZGIgICBtMSwgW2RzdHEgKyBzaXplcSArIG1tc2l6ZV0KKyAgICBtb3ZhICAgW2RzdHEgKyBzaXplcV0sIG0wCisgICAgbW92YSAgIFtkc3RxICsgc2l6ZXEgKyBtbXNpemVdLCBtMQorICAgIGFkZCAgc2l6ZXEsIDIqbW1zaXplCisgICAgamwgLjEKKy4yOgorICAgIGFuZCAgICAgd3EsIDIqbW1zaXplLTEKKyAgICBqeiAgICAuZW5kCisgICAgYWRkICAgZHN0cSwgd3EKKyAgICBhZGQgICBzcmNxLCB3cQorICAgIG5lZyAgICAgd3EKKy4zCisgICAgbW92ICBzaXplYiwgW3NyY3EgKyB3cV0KKyAgICBhZGQgW2RzdHEgKyB3cV0sIHNpemViCisgICAgaW5jICAgICB3cQorICAgIGpsIC4zCisuZW5kOgorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIG1teAorQUREX0JZVEVTCislZW5kaWYKK0lOSVRfWE1NIHNzZTIKK0FERF9CWVRFUworCis7IHZvaWQgYWRkX2hmeXVfbGVmdF9wcmVkX2JncjMyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3LCB1aW50OF90ICpsZWZ0KQorJW1hY3JvIExFRlRfQkdSMzIgMAorY2dsb2JhbCBhZGRfaGZ5dV9sZWZ0X3ByZWRfYmdyMzIsIDQsNCwzLCBkc3QsIHNyYywgdywgbGVmdAorICAgIHNobCAgICAgICAgICAgd3EsIDIKKyAgICBtb3ZkICAgICAgICAgIG0wLCBbbGVmdHFdCisgICAgbGVhICAgICAgICAgZHN0cSwgW2RzdHEgKyB3cV0KKyAgICBsZWEgICAgICAgICBzcmNxLCBbc3JjcSArIHdxXQorICAgIExTSElGVCAgICAgICAgbTAsIG1tc2l6ZS00CisgICAgbmVnICAgICAgICAgICB3cQorLmxvb3A6CisgICAgbW92dSAgICAgICAgICBtMSwgW3NyY3Erd3FdCisgICAgbW92YSAgICAgICAgICBtMiwgbTEKKyVpZiBtbXNpemUgPT0gOAorICAgIHB1bnBja2hkcSAgICAgbTAsIG0wCislZW5kaWYKKyAgICBMU0hJRlQgICAgICAgIG0xLCA0CisgICAgcGFkZGIgICAgICAgICBtMSwgbTIKKyVpZiBtbXNpemUgPT0gMTYKKyAgICBwc2h1ZmQgICAgICAgIG0wLCBtMCwgcTMzMzMKKyAgICBtb3ZhICAgICAgICAgIG0yLCBtMQorICAgIExTSElGVCAgICAgICAgbTEsIDgKKyAgICBwYWRkYiAgICAgICAgIG0xLCBtMgorJWVuZGlmCisgICAgcGFkZGIgICAgICAgICBtMCwgbTEKKyAgICBtb3Z1ICAgW2RzdHErd3FdLCBtMAorICAgIGFkZCAgICAgICAgICAgd3EsIG1tc2l6ZQorICAgIGpsICAgICAgICAgLmxvb3AKKyAgICBtb3ZkICAgICAgICAgIG0wLCBbZHN0cS00XQorICAgIG1vdmQgICAgIFtsZWZ0cV0sIG0wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggbW14CitMRUZUX0JHUjMyCislZW5kaWYKK0lOSVRfWE1NIHNzZTIKK0xFRlRfQkdSMzIKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2VkM2MwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2h1ZmZ5dXZkc3BfaW5pdC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IExvcmVuIE1lcnJpdHQgPGxvcmVubUB1Lndhc2hpbmd0b24uZWR1PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaHVmZnl1dmRzcC5oIgorCit2b2lkIGZmX2FkZF9ieXRlc19tbXgodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludHB0cl90IHcpOwordm9pZCBmZl9hZGRfYnl0ZXNfc3NlMih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50cHRyX3Qgdyk7CisKK3ZvaWQgZmZfYWRkX2hmeXVfbWVkaWFuX3ByZWRfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGlmZiwgaW50cHRyX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCk7Cit2b2lkIGZmX2FkZF9oZnl1X21lZGlhbl9wcmVkX3NzZTIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICp0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGlmZiwgaW50cHRyX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApOworCitpbnQgIGZmX2FkZF9oZnl1X2xlZnRfcHJlZF9zc3NlMyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcsIGludCBsZWZ0KTsKK2ludCAgZmZfYWRkX2hmeXVfbGVmdF9wcmVkX3NzZTQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcsIGludCBsZWZ0KTsKKwordm9pZCBmZl9hZGRfaGZ5dV9sZWZ0X3ByZWRfYmdyMzJfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcsIHVpbnQ4X3QgKmxlZnQpOwordm9pZCBmZl9hZGRfaGZ5dV9sZWZ0X3ByZWRfYmdyMzJfc3NlMih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgdywgdWludDhfdCAqbGVmdCk7CisKKyNpZiBIQVZFX0lOTElORV9BU00gJiYgSEFWRV83UkVHUyAmJiBBUkNIX1g4Nl8zMgorc3RhdGljIHZvaWQgYWRkX2hmeXVfbWVkaWFuX3ByZWRfY21vdih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGlmZiwgaW50cHRyX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKQoreworICAgIHg4Nl9yZWcgdzIgPSAtdzsKKyAgICB4ODZfcmVnIHg7CisgICAgaW50IGwgID0gKmxlZnQgICAgICYgMHhmZjsKKyAgICBpbnQgdGwgPSAqbGVmdF90b3AgJiAweGZmOworICAgIGludCB0OworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibW92ICAgICAgICAgICU3LCAlMyAgICAgICAgICAgIFxuIgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAibW92emJsICglMywgJTQpLCAlMiAgICAgICAgICAgIFxuIgorICAgICAgICAibW92ICAgICAgICAgICUyLCAlazMgICAgICAgICAgIFxuIgorICAgICAgICAic3ViICAgICAgICAgJWIxLCAlYjMgICAgICAgICAgIFxuIgorICAgICAgICAiYWRkICAgICAgICAgJWIwLCAlYjMgICAgICAgICAgIFxuIgorICAgICAgICAibW92ICAgICAgICAgICUyLCAlMSAgICAgICAgICAgIFxuIgorICAgICAgICAiY21wICAgICAgICAgICUwLCAlMiAgICAgICAgICAgIFxuIgorICAgICAgICAiY21vdmcgICAgICAgICUwLCAlMiAgICAgICAgICAgIFxuIgorICAgICAgICAiY21vdmcgICAgICAgICUxLCAlMCAgICAgICAgICAgIFxuIgorICAgICAgICAiY21wICAgICAgICAgJWszLCAlMCAgICAgICAgICAgIFxuIgorICAgICAgICAiY21vdmcgICAgICAgJWszLCAlMCAgICAgICAgICAgIFxuIgorICAgICAgICAibW92ICAgICAgICAgICU3LCAlMyAgICAgICAgICAgIFxuIgorICAgICAgICAiY21wICAgICAgICAgICUyLCAlMCAgICAgICAgICAgIFxuIgorICAgICAgICAiY21vdmwgICAgICAgICUyLCAlMCAgICAgICAgICAgIFxuIgorICAgICAgICAiYWRkICAgICglNiwgJTQpLCAlYjAgICAgICAgICAgIFxuIgorICAgICAgICAibW92ICAgICAgICAgJWIwLCAoJTUsICU0KSAgICAgIFxuIgorICAgICAgICAiaW5jICAgICAgICAgICU0ICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAiamwgICAgICAgICAgIDFiICAgICAgICAgICAgICAgIFxuIgorICAgICAgICA6ICIrJnEiKGwpLCAiKyZxIih0bCksICI9JnIiKHQpLCAiPSZxIih4KSwgIismciIodzIpCisgICAgICAgIDogInIiKGRzdCArIHcpLCAiciIoZGlmZiArIHcpLCAicm0iKHRvcCArIHcpCisgICAgKTsKKyAgICAqbGVmdCAgICAgPSBsOworICAgICpsZWZ0X3RvcCA9IHRsOworfQorI2VuZGlmCisKK2F2X2NvbGQgdm9pZCBmZl9odWZmeXV2ZHNwX2luaXRfeDg2KEh1ZmZZVVZEU1BDb250ZXh0ICpjKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyNpZiBIQVZFX0lOTElORV9BU00gJiYgSEFWRV83UkVHUyAmJiBBUkNIX1g4Nl8zMgorICAgIGlmIChjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19DTU9WKQorICAgICAgICBjLT5hZGRfaGZ5dV9tZWRpYW5fcHJlZCA9IGFkZF9oZnl1X21lZGlhbl9wcmVkX2Ntb3Y7CisjZW5kaWYKKworICAgIGlmIChBUkNIX1g4Nl8zMiAmJiBFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5hZGRfYnl0ZXMgPSBmZl9hZGRfYnl0ZXNfbW14OworICAgICAgICBjLT5hZGRfaGZ5dV9sZWZ0X3ByZWRfYmdyMzIgPSBmZl9hZGRfaGZ5dV9sZWZ0X3ByZWRfYmdyMzJfbW14OworICAgIH0KKworICAgIGlmIChBUkNIX1g4Nl8zMiAmJiBFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSkgeworICAgICAgICAvKiBzbG93ZXIgdGhhbiBjbW92IHZlcnNpb24gb24gQU1EICovCisgICAgICAgIGlmICghKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHXzNETk9XKSkKKyAgICAgICAgICAgIGMtPmFkZF9oZnl1X21lZGlhbl9wcmVkID0gZmZfYWRkX2hmeXVfbWVkaWFuX3ByZWRfbW14ZXh0OworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YWRkX2J5dGVzICAgICAgICAgICAgPSBmZl9hZGRfYnl0ZXNfc3NlMjsKKyAgICAgICAgYy0+YWRkX2hmeXVfbWVkaWFuX3ByZWQgPSBmZl9hZGRfaGZ5dV9tZWRpYW5fcHJlZF9zc2UyOworICAgICAgICBjLT5hZGRfaGZ5dV9sZWZ0X3ByZWRfYmdyMzIgPSBmZl9hZGRfaGZ5dV9sZWZ0X3ByZWRfYmdyMzJfc3NlMjsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NTRTMoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5hZGRfaGZ5dV9sZWZ0X3ByZWQgPSBmZl9hZGRfaGZ5dV9sZWZ0X3ByZWRfc3NzZTM7CisgICAgICAgIGlmIChjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19TU0U0KSAvLyBub3QgcmVhbGx5IFNTRTQsIGp1c3Qgc2xvdyBvbiBDb25yb2UKKyAgICAgICAgICAgIGMtPmFkZF9oZnl1X2xlZnRfcHJlZCA9IGZmX2FkZF9oZnl1X2xlZnRfcHJlZF9zc2U0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZW5jZHNwX21teC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2h1ZmZ5dXZlbmNkc3BfbW14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkOGUzYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZW5jZHNwX21teC5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogU0lNRC1vcHRpbWl6ZWQgSHVmZllVViBlbmNvZGluZyBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogTU1YIG9wdGltaXphdGlvbiBieSBOaWNrIEt1cnNoZXYgPG5pY2tvbHNfa0BtYWlsLnJ1PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaHVmZnl1dmVuY2RzcC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWF0aG9wcy5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKK3N0YXRpYyB2b2lkIGRpZmZfYnl0ZXNfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IHcpCit7CisgICAgeDg2X3JlZyBpID0gMDsKKworICAgIGlmICh3ID49IDE2KQorICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAoJTIsICUwKSwgJSVtbTAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICglMSwgJTApLCAlJW1tMSAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmIgJSVtbTAsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0xLCAoJTMsICUwKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgOCglMiwgJTApLCAlJW1tMCAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSA4KCUxLCAlMCksICUlbW0xICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViYiAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTEsIDgoJTMsICUwKSAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICQxNiwgJTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjbXAgJTQsICUwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIiBqYiAxYiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6ICIrciIgKGkpCisgICAgICAgIDogInIiIChzcmMxKSwgInIiIChzcmMyKSwgInIiIChkc3QpLCAiciIgKCh4ODZfcmVnKSB3IC0gMTUpKTsKKworICAgIGZvciAoOyBpIDwgdzsgaSsrKQorICAgICAgICBkc3RbaSArIDBdID0gc3JjMVtpICsgMF0gLSBzcmMyW2kgKyAwXTsKK30KKworc3RhdGljIHZvaWQgc3ViX2hmeXVfbWVkaWFuX3ByZWRfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApCit7CisgICAgeDg2X3JlZyBpID0gMDsKKyAgICB1aW50OF90IGwsIGx0OworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJtb3ZxICAoJTEsICUwKSwgJSVtbTAgICAgICAgICAgXG5cdCIgLy8gTFQKKyAgICAgICAgInBzbGxxICQ4LCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAoJTEsICUwKSwgJSVtbTEgICAgICAgICAgXG5cdCIgLy8gVAorICAgICAgICAibW92cSAgLTEoJTIsICUwKSwgJSVtbTIgICAgICAgIFxuXHQiIC8vIEwKKyAgICAgICAgIm1vdnEgICglMiwgJTApLCAlJW1tMyAgICAgICAgICBcblx0IiAvLyBYCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIgLy8gTAorICAgICAgICAicHN1YmIgJSVtbTAsICUlbW0yICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLy8gTCArIFQgLSBMVAorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8vIEwKKyAgICAgICAgInBtYXh1YiAlJW1tMSwgJSVtbTQgICAgICAgICAgICBcblx0IiAvLyBtYXgoVCwgTCkKKyAgICAgICAgInBtaW51YiAlJW1tNSwgJSVtbTEgICAgICAgICAgICBcblx0IiAvLyBtaW4oVCwgTCkKKyAgICAgICAgInBtaW51YiAlJW1tMiwgJSVtbTQgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1heHViICUlbW0xLCAlJW1tNCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViYiAlJW1tNCwgJSVtbTMgICAgICAgICAgICAgXG5cdCIgLy8gZHN0IC0gcHJlZAorICAgICAgICAibW92cSAlJW1tMywgKCUzLCAlMCkgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJDgsICUwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgLTEoJTEsICUwKSwgJSVtbTAgICAgICAgICBcblx0IiAvLyBMVAorICAgICAgICAiY21wICU0LCAlMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIgamIgMWIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiAiK3IiIChpKQorICAgICAgICA6ICJyIiAoc3JjMSksICJyIiAoc3JjMiksICJyIiAoZHN0KSwgInIiICgoeDg2X3JlZykgdykpOworCisgICAgbCAgPSAqbGVmdDsKKyAgICBsdCA9ICpsZWZ0X3RvcDsKKworICAgIGRzdFswXSA9IHNyYzJbMF0gLSBtaWRfcHJlZChsLCBzcmMxWzBdLCAobCArIHNyYzFbMF0gLSBsdCkgJiAweEZGKTsKKworICAgICpsZWZ0X3RvcCA9IHNyYzFbdyAtIDFdOworICAgICpsZWZ0ICAgICA9IHNyYzJbdyAtIDFdOworfQorCisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCisKK2F2X2NvbGQgdm9pZCBmZl9odWZmeXV2ZW5jZHNwX2luaXRfeDg2KEh1ZmZZVVZFbmNEU1BDb250ZXh0ICpjKQoreworI2lmIEhBVkVfSU5MSU5FX0FTTQorICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoSU5MSU5FX01NWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmRpZmZfYnl0ZXMgPSBkaWZmX2J5dGVzX21teDsKKyAgICB9CisKKyAgICBpZiAoSU5MSU5FX01NWEVYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnN1Yl9oZnl1X21lZGlhbl9wcmVkID0gc3ViX2hmeXVfbWVkaWFuX3ByZWRfbW14ZXh0OworICAgIH0KKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9pZGN0ZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9pZGN0ZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE3MzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2lkY3Rkc3AuYXNtCkBAIC0wLDAgKzEsMTgzIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBTSU1ELW9wdGltaXplZCBJRENULXJlbGF0ZWQgcm91dGluZXMKKzsqIENvcHlyaWdodCAoYykgMjAwOCBMb3JlbiBNZXJyaXR0Cis7KiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMyBNaWNoYWVsIE5pZWRlcm1heWVyCis7KiBDb3B5cmlnaHQgKGMpIDIwMTMgRGFuaWVsIEthbmcKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorCitjZXh0ZXJuIHBiXzgwCisKK1NFQ1RJT05fVEVYVAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzt2b2lkIGZmX3B1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gUFVUX1NJR05FRF9QSVhFTFNfQ0xBTVBFRF9IQUxGIDEKKyAgICBtb3ZhICAgICBtMSwgW2Jsb2NrcSttbXNpemUqMCslMV0KKyAgICBtb3ZhICAgICBtMiwgW2Jsb2NrcSttbXNpemUqMislMV0KKyVpZiBtbXNpemUgPT0gOAorICAgIG1vdmEgICAgIG0zLCBbYmxvY2txK21tc2l6ZSo0KyUxXQorICAgIG1vdmEgICAgIG00LCBbYmxvY2txK21tc2l6ZSo2KyUxXQorJWVuZGlmCisgICAgcGFja3Nzd2IgbTEsIFtibG9ja3ErbW1zaXplKjErJTFdCisgICAgcGFja3Nzd2IgbTIsIFtibG9ja3ErbW1zaXplKjMrJTFdCislaWYgbW1zaXplID09IDgKKyAgICBwYWNrc3N3YiBtMywgW2Jsb2NrcSttbXNpemUqNSslMV0KKyAgICBwYWNrc3N3YiBtNCwgW2Jsb2NrcSttbXNpemUqNyslMV0KKyVlbmRpZgorICAgIHBhZGRiICAgIG0xLCBtMAorICAgIHBhZGRiICAgIG0yLCBtMAorJWlmIG1tc2l6ZSA9PSA4CisgICAgcGFkZGIgICAgbTMsIG0wCisgICAgcGFkZGIgICAgbTQsIG0wCisgICAgbW92cSAgICAgW3BpeGVsc3ErbHNpemVxKjBdLCBtMQorICAgIG1vdnEgICAgIFtwaXhlbHNxK2xzaXplcSoxXSwgbTIKKyAgICBtb3ZxICAgICBbcGl4ZWxzcStsc2l6ZXEqMl0sIG0zCisgICAgbW92cSAgICAgW3BpeGVsc3ErbHNpemUzcSBdLCBtNAorJWVsc2UKKyAgICBtb3ZxICAgICBbcGl4ZWxzcStsc2l6ZXEqMF0sIG0xCisgICAgbW92aHBzICAgW3BpeGVsc3ErbHNpemVxKjFdLCBtMQorICAgIG1vdnEgICAgIFtwaXhlbHNxK2xzaXplcSoyXSwgbTIKKyAgICBtb3ZocHMgICBbcGl4ZWxzcStsc2l6ZTNxIF0sIG0yCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gUFVUX1NJR05FRF9QSVhFTFNfQ0xBTVBFRCAxCitjZ2xvYmFsIHB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQsIDMsIDQsICUxLCBibG9jaywgcGl4ZWxzLCBsc2l6ZSwgbHNpemUzCisgICAgbW92YSAgICAgbTAsIFtwYl84MF0KKyAgICBsZWEgICAgICBsc2l6ZTNxLCBbbHNpemVxKjNdCisgICAgUFVUX1NJR05FRF9QSVhFTFNfQ0xBTVBFRF9IQUxGIDAKKyAgICBsZWEgICAgICBwaXhlbHNxLCBbcGl4ZWxzcStsc2l6ZXEqNF0KKyAgICBQVVRfU0lHTkVEX1BJWEVMU19DTEFNUEVEX0hBTEYgNjQKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK1BVVF9TSUdORURfUElYRUxTX0NMQU1QRUQgMAorSU5JVF9YTU0gc3NlMgorUFVUX1NJR05FRF9QSVhFTFNfQ0xBTVBFRCAzCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3B1dF9waXhlbHNfY2xhbXBlZChjb25zdCBpbnQxNl90ICpibG9jaywgdWludDhfdCAqcGl4ZWxzLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAlMSA9IGJsb2NrIG9mZnNldAorJW1hY3JvIFBVVF9QSVhFTFNfQ0xBTVBFRF9IQUxGIDEKKyAgICBtb3ZhICAgICBtMCwgW2Jsb2NrcSttbXNpemUqMCslMV0KKyAgICBtb3ZhICAgICBtMSwgW2Jsb2NrcSttbXNpemUqMislMV0KKyVpZiBtbXNpemUgPT0gOAorICAgIG1vdmEgICAgIG0yLCBbYmxvY2txK21tc2l6ZSo0KyUxXQorICAgIG1vdmEgICAgIG0zLCBbYmxvY2txK21tc2l6ZSo2KyUxXQorJWVuZGlmCisgICAgcGFja3Vzd2IgbTAsIFtibG9ja3ErbW1zaXplKjErJTFdCisgICAgcGFja3Vzd2IgbTEsIFtibG9ja3ErbW1zaXplKjMrJTFdCislaWYgbW1zaXplID09IDgKKyAgICBwYWNrdXN3YiBtMiwgW2Jsb2NrcSttbXNpemUqNSslMV0KKyAgICBwYWNrdXN3YiBtMywgW2Jsb2NrcSttbXNpemUqNyslMV0KKyAgICBtb3ZxICAgICAgICAgICBbcGl4ZWxzcV0sIG0wCisgICAgbW92cSAgICBbbHNpemVxK3BpeGVsc3FdLCBtMQorICAgIG1vdnEgIFsyKmxzaXplcStwaXhlbHNxXSwgbTIKKyAgICBtb3ZxICAgW2xzaXplM3ErcGl4ZWxzcV0sIG0zCislZWxzZQorICAgIG1vdnEgICAgICAgICAgIFtwaXhlbHNxXSwgbTAKKyAgICBtb3ZocHMgIFtsc2l6ZXErcGl4ZWxzcV0sIG0wCisgICAgbW92cSAgWzIqbHNpemVxK3BpeGVsc3FdLCBtMQorICAgIG1vdmhwcyBbbHNpemUzcStwaXhlbHNxXSwgbTEKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBQVVRfUElYRUxTX0NMQU1QRUQgMAorY2dsb2JhbCBwdXRfcGl4ZWxzX2NsYW1wZWQsIDMsIDQsIDIsIGJsb2NrLCBwaXhlbHMsIGxzaXplLCBsc2l6ZTMKKyAgICBsZWEgbHNpemUzcSwgW2xzaXplcSozXQorICAgIFBVVF9QSVhFTFNfQ0xBTVBFRF9IQUxGIDAKKyAgICBsZWEgcGl4ZWxzcSwgW3BpeGVsc3ErbHNpemVxKjRdCisgICAgUFVUX1BJWEVMU19DTEFNUEVEX0hBTEYgNjQKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK1BVVF9QSVhFTFNfQ0xBTVBFRAorSU5JVF9YTU0gc3NlMgorUFVUX1BJWEVMU19DTEFNUEVECisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2FkZF9waXhlbHNfY2xhbXBlZChjb25zdCBpbnQxNl90ICpibG9jaywgdWludDhfdCAqcGl4ZWxzLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAlMSA9IGJsb2NrIG9mZnNldAorJW1hY3JvIEFERF9QSVhFTFNfQ0xBTVBFRCAxCisgICAgbW92YSAgICAgICBtMCwgW2Jsb2NrcSttbXNpemUqMCslMV0KKyAgICBtb3ZhICAgICAgIG0xLCBbYmxvY2txK21tc2l6ZSoxKyUxXQorJWlmIG1tc2l6ZSA9PSA4CisgICAgbW92YSAgICAgICBtNSwgW2Jsb2NrcSttbXNpemUqMislMV0KKyAgICBtb3ZhICAgICAgIG02LCBbYmxvY2txK21tc2l6ZSozKyUxXQorJWVuZGlmCisgICAgbW92cSAgICAgICBtMiwgW3BpeGVsc3FdCisgICAgbW92cSAgICAgICBtMywgW3BpeGVsc3ErbHNpemVxXQorJWlmIG1tc2l6ZSA9PSA4CisgICAgbW92YSAgICAgICBtNywgbTIKKyAgICBwdW5wY2tsYncgIG0yLCBtNAorICAgIHB1bnBja2hidyAgbTcsIG00CisgICAgcGFkZHN3ICAgICBtMCwgbTIKKyAgICBwYWRkc3cgICAgIG0xLCBtNworICAgIG1vdmEgICAgICAgbTcsIG0zCisgICAgcHVucGNrbGJ3ICBtMywgbTQKKyAgICBwdW5wY2toYncgIG03LCBtNAorICAgIHBhZGRzdyAgICAgbTUsIG0zCisgICAgcGFkZHN3ICAgICBtNiwgbTcKKyVlbHNlCisgICAgcHVucGNrbGJ3ICBtMiwgbTQKKyAgICBwdW5wY2tsYncgIG0zLCBtNAorICAgIHBhZGRzdyAgICAgbTAsIG0yCisgICAgcGFkZHN3ICAgICBtMSwgbTMKKyVlbmRpZgorICAgIHBhY2t1c3diICAgbTAsIG0xCislaWYgbW1zaXplID09IDgKKyAgICBwYWNrdXN3YiAgIG01LCBtNgorICAgIG1vdnEgICAgICAgW3BpeGVsc3FdLCBtMAorICAgIG1vdnEgICAgICAgW3BpeGVsc3ErbHNpemVxXSwgbTUKKyVlbHNlCisgICAgbW92cSAgICAgICBbcGl4ZWxzcV0sIG0wCisgICAgbW92aHBzICAgICBbcGl4ZWxzcStsc2l6ZXFdLCBtMAorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEFERF9QSVhFTFNfQ0xBTVBFRCAwCitjZ2xvYmFsIGFkZF9waXhlbHNfY2xhbXBlZCwgMywgMywgNSwgYmxvY2ssIHBpeGVscywgbHNpemUKKyAgICBweG9yICAgICAgIG00LCBtNAorICAgIEFERF9QSVhFTFNfQ0xBTVBFRCAwCisgICAgbGVhICAgICAgICBwaXhlbHNxLCBbcGl4ZWxzcStsc2l6ZXEqMl0KKyAgICBBRERfUElYRUxTX0NMQU1QRUQgMzIKKyAgICBsZWEgICAgICAgIHBpeGVsc3EsIFtwaXhlbHNxK2xzaXplcSoyXQorICAgIEFERF9QSVhFTFNfQ0xBTVBFRCA2NAorICAgIGxlYSAgICAgICAgcGl4ZWxzcSwgW3BpeGVsc3ErbHNpemVxKjJdCisgICAgQUREX1BJWEVMU19DTEFNUEVEIDk2CisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CitBRERfUElYRUxTX0NMQU1QRUQKK0lOSVRfWE1NIHNzZTIKK0FERF9QSVhFTFNfQ0xBTVBFRApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2lkY3Rkc3AuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9pZGN0ZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFhNGU3OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9pZGN0ZHNwLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfWDg2X0lEQ1REU1BfSAorI2RlZmluZSBBVkNPREVDX1g4Nl9JRENURFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCit2b2lkIGZmX2FkZF9waXhlbHNfY2xhbXBlZF9tbXgoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKK3ZvaWQgZmZfYWRkX3BpeGVsc19jbGFtcGVkX3NzZTIoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSk7Cit2b2lkIGZmX3B1dF9waXhlbHNfY2xhbXBlZF9tbXgoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKK3ZvaWQgZmZfcHV0X3BpeGVsc19jbGFtcGVkX3NzZTIoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSk7Cit2b2lkIGZmX3B1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWRfbW14KGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpOwordm9pZCBmZl9wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkX3NzZTIoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpOworCisjZW5kaWYgLyogQVZDT0RFQ19YODZfSURDVERTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvaWRjdGRzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvaWRjdGRzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyNmE5OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9pZGN0ZHNwX2luaXQuYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaWRjdGRzcC5oIgorI2luY2x1ZGUgImlkY3Rkc3AuaCIKKyNpbmNsdWRlICJzaW1wbGVfaWRjdC5oIgorCisvKiBJbnB1dCBwZXJtdXRhdGlvbiBmb3IgdGhlIHNpbXBsZV9pZGN0X21teCAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2ltcGxlX21teF9wZXJtdXRhdGlvbls2NF0gPSB7CisgICAgMHgwMCwgMHgwOCwgMHgwNCwgMHgwOSwgMHgwMSwgMHgwQywgMHgwNSwgMHgwRCwKKyAgICAweDEwLCAweDE4LCAweDE0LCAweDE5LCAweDExLCAweDFDLCAweDE1LCAweDFELAorICAgIDB4MjAsIDB4MjgsIDB4MjQsIDB4MjksIDB4MjEsIDB4MkMsIDB4MjUsIDB4MkQsCisgICAgMHgxMiwgMHgxQSwgMHgxNiwgMHgxQiwgMHgxMywgMHgxRSwgMHgxNywgMHgxRiwKKyAgICAweDAyLCAweDBBLCAweDA2LCAweDBCLCAweDAzLCAweDBFLCAweDA3LCAweDBGLAorICAgIDB4MzAsIDB4MzgsIDB4MzQsIDB4MzksIDB4MzEsIDB4M0MsIDB4MzUsIDB4M0QsCisgICAgMHgyMiwgMHgyQSwgMHgyNiwgMHgyQiwgMHgyMywgMHgyRSwgMHgyNywgMHgyRiwKKyAgICAweDMyLCAweDNBLCAweDM2LCAweDNCLCAweDMzLCAweDNFLCAweDM3LCAweDNGLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaWRjdF9zc2UyX3Jvd19wZXJtWzhdID0geyAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IH07CisKK2F2X2NvbGQgaW50IGZmX2luaXRfc2NhbnRhYmxlX3Blcm11dGF0aW9uX3g4Nih1aW50OF90ICppZGN0X3Blcm11dGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaWRjdF9wZXJtdXRhdGlvbl90eXBlIHBlcm1fdHlwZSkKK3sKKyAgICBpbnQgaTsKKworICAgIHN3aXRjaCAocGVybV90eXBlKSB7CisgICAgY2FzZSBGRl9JRENUX1BFUk1fU0lNUExFOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGlkY3RfcGVybXV0YXRpb25baV0gPSBzaW1wbGVfbW14X3Blcm11dGF0aW9uW2ldOworICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEZGX0lEQ1RfUEVSTV9TU0UyOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGlkY3RfcGVybXV0YXRpb25baV0gPSAoaSAmIDB4MzgpIHwgaWRjdF9zc2UyX3Jvd19wZXJtW2kgJiA3XTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9pZGN0ZHNwX2luaXRfeDg2KElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoaWdoX2JpdF9kZXB0aCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKElOTElORV9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoIWhpZ2hfYml0X2RlcHRoICYmCisgICAgICAgICAgICBhdmN0eC0+bG93cmVzID09IDAgJiYKKyAgICAgICAgICAgIChhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfQVVUTyB8fAorICAgICAgICAgICAgIGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9TSU1QTEVBVVRPIHx8CisgICAgICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX1NJTVBMRU1NWCkpIHsKKyAgICAgICAgICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl9zaW1wbGVfaWRjdF9wdXRfbW14OworICAgICAgICAgICAgICAgIGMtPmlkY3RfYWRkICA9IGZmX3NpbXBsZV9pZGN0X2FkZF9tbXg7CisgICAgICAgICAgICAgICAgYy0+aWRjdCAgICAgID0gZmZfc2ltcGxlX2lkY3RfbW14OworICAgICAgICAgICAgICAgIGMtPnBlcm1fdHlwZSA9IEZGX0lEQ1RfUEVSTV9TSU1QTEU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQgPSBmZl9wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkX21teDsKKyAgICAgICAgYy0+cHV0X3BpeGVsc19jbGFtcGVkICAgICAgICA9IGZmX3B1dF9waXhlbHNfY2xhbXBlZF9tbXg7CisgICAgICAgIGMtPmFkZF9waXhlbHNfY2xhbXBlZCAgICAgICAgPSBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfbW14OworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQgPSBmZl9wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkX3NzZTI7CisgICAgICAgIGMtPnB1dF9waXhlbHNfY2xhbXBlZCAgICAgICAgPSBmZl9wdXRfcGl4ZWxzX2NsYW1wZWRfc3NlMjsKKyAgICAgICAgYy0+YWRkX3BpeGVsc19jbGFtcGVkICAgICAgICA9IGZmX2FkZF9waXhlbHNfY2xhbXBlZF9zc2UyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9pbWRjdDM2LmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9pbWRjdDM2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTMwYjQyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2ltZGN0MzYuYXNtCkBAIC0wLDAgKzEsNzM1IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiAzNiBwb2ludCBTU0Utb3B0aW1pemVkIElNRENUIHRyYW5zZm9ybQorOyogQ29weXJpZ2h0IChjKSAyMDExIFZpdG9yIFNlc3NhaworOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK2FsaWduIDE2Citwc19tYXNrOiAgZGQgMCwgfjAsIH4wLCB+MAorcHNfbWFzazI6IGRkIDAsIH4wLCAgMCwgfjAKK3BzX21hc2szOiBkZCAwLCAgMCwgIDAsIH4wCitwc19tYXNrNDogZGQgMCwgfjAsICAwLCAgMAorCitwc192YWwxOiAgZGQgICAgICAgICAgLTAuNSwgICAgICAgICAgLTAuNSwgLTAuODY2MDI1NDAzOCwgLTAuODY2MDI1NDAzOAorcHNfdmFsMjogIGRkICAgICAgICAgICAxLjAsICAgICAgICAgICAxLjAsICAwLjg2NjAyNTQwMzgsICAwLjg2NjAyNTQwMzgKK3BzX3ZhbDM6ICBkZCAgMC4xNzM2NDgxNzc3LCAgMC4xNzM2NDgxNzc3LCAgMC4zNDIwMjAxNDMzLCAgMC4zNDIwMjAxNDMzCitwc192YWw0OiAgZGQgLTAuNzY2MDQ0NDQzMSwgLTAuNzY2MDQ0NDQzMSwgIDAuODY2MDI1NDAzOCwgIDAuODY2MDI1NDAzOAorcHNfdmFsNTogIGRkIC0wLjkzOTY5MjYyMDgsIC0wLjkzOTY5MjYyMDgsIC0wLjk4NDgwNzc1MzAsIC0wLjk4NDgwNzc1MzAKK3BzX3ZhbDY6ICBkZCAgICAgICAgICAgMC41LCAgICAgICAgICAgMC41LCAtMC42NDI3ODc2MDk3LCAtMC42NDI3ODc2MDk3Citwc192YWw3OiAgZGQgICAgICAgICAgIDEuMCwgICAgICAgICAgIDEuMCwgLTAuNjQyNzg3NjA5NywgLTAuNjQyNzg3NjA5NworCitwc19wMXAxbTFtMTogZGQgMCwgICAgICAgICAgMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMAorcHNfcDFtMXAxbTE6IGRkIDAsIDB4ODAwMDAwMDAsICAgICAgICAgIDAsIDB4ODAwMDAwMDAKKworcHNfY29zaDogICAgICAgZGQgMS4wLCAwLjUwMTkwOTkxODc3MTY3MzY5NDc5LCAgMS4wLCAgNS43MzY4NTY2MjI4MzQ5Mjc1NjQ2MQorICAgICAgICAgICAgICAgZGQgMS4wLCAwLjUxNzYzODA5MDIwNTA0MTUyNDY5LCAgMS4wLCAgMS45MzE4NTE2NTI1NzgxMzY1NzM0OQorICAgICAgICAgICAgICAgZGQgMS4wLCAwLjU1MTY4ODk1OTQ4MTI0NTg3ODI0LCAtMS4wLCAtMS4xODMxMDA3OTE1NzYyNDkyNTg5NgorICAgICAgICAgICAgICAgZGQgMS4wLCAwLjYxMDM4NzI5NDM4MDcyODAzNDE2LCAtMS4wLCAtMC44NzE3MjMzOTc4MTA1NDkwMDk5MQorICAgICAgICAgICAgICAgZGQgMS4wLCAwLjcwNzEwNjc4MTE4NjU0NzUyNDM5LCAgMC4wLCAgMC4wCisKK3BzX2Nvc2hfc3NlMzogIGRkIDEuMCwgLTAuNTAxOTA5OTE4NzcxNjczNjk0NzksICAxLjAsIC01LjczNjg1NjYyMjgzNDkyNzU2NDYxCisgICAgICAgICAgICAgICBkZCAxLjAsIC0wLjUxNzYzODA5MDIwNTA0MTUyNDY5LCAgMS4wLCAtMS45MzE4NTE2NTI1NzgxMzY1NzM0OQorICAgICAgICAgICAgICAgZGQgMS4wLCAtMC41NTE2ODg5NTk0ODEyNDU4NzgyNCwgLTEuMCwgIDEuMTgzMTAwNzkxNTc2MjQ5MjU4OTYKKyAgICAgICAgICAgICAgIGRkIDEuMCwgLTAuNjEwMzg3Mjk0MzgwNzI4MDM0MTYsIC0xLjAsICAwLjg3MTcyMzM5NzgxMDU0OTAwOTkxCisgICAgICAgICAgICAgICBkZCAxLjAsIC0wLjcwNzEwNjc4MTE4NjU0NzUyNDM5LCAgMC4wLCAgMC4wCisKK2Nvc3RhYnM6ICB0aW1lcyA0IGRkICAwLjk4NDgwNzczCisgICAgICAgICAgdGltZXMgNCBkZCAgMC45Mzk2OTI2MgorICAgICAgICAgIHRpbWVzIDQgZGQgIDAuODY2MDI1MzkKKyAgICAgICAgICB0aW1lcyA0IGRkIC0wLjc2NjA0NDQ0CisgICAgICAgICAgdGltZXMgNCBkZCAtMC42NDI3ODc2NAorICAgICAgICAgIHRpbWVzIDQgZGQgIDAuNTAwMDAwMDAKKyAgICAgICAgICB0aW1lcyA0IGRkIC0wLjUwMDAwMDAwCisgICAgICAgICAgdGltZXMgNCBkZCAtMC4zNDIwMjAxNQorICAgICAgICAgIHRpbWVzIDQgZGQgLTAuMTczNjQ4MTgKKyAgICAgICAgICB0aW1lcyA0IGRkICAwLjUwMTkwOTkyCisgICAgICAgICAgdGltZXMgNCBkZCAgMC41MTc2MzgwOAorICAgICAgICAgIHRpbWVzIDQgZGQgIDAuNTUxNjg4OTYKKyAgICAgICAgICB0aW1lcyA0IGRkICAwLjYxMDM4NzI2CisgICAgICAgICAgdGltZXMgNCBkZCAgMC43MDcxMDY3NworICAgICAgICAgIHRpbWVzIDQgZGQgIDAuODcxNzIzNDEKKyAgICAgICAgICB0aW1lcyA0IGRkICAxLjE4MzEwMDgyCisgICAgICAgICAgdGltZXMgNCBkZCAgMS45MzE4NTE2MworICAgICAgICAgIHRpbWVzIDQgZGQgIDUuNzM2ODU2NDYKKworJWRlZmluZSBTQkxJTUlUIDMyCitTRUNUSU9OX1RFWFQKKworJW1hY3JvIFBTSFVGRCAzCislaWYgY3B1ZmxhZyhzc2UyKSAmJiBub3RjcHVmbGFnKGF2eCkKKyAgICBwc2h1ZmQgJTEsICUyLCAlMworJWVsc2UKKyAgICBzaHVmcHMgJTEsICUyLCAlMiwgJTMKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgaW5wdXQgICUyPXt4MSx4Mix4Myx4NH0sICUzPXt5MSx5Mix5Myx5NH0KKzsgb3V0cHV0ICUxPXt4Myx4NCx5MSx5Mn0KKyVtYWNybyBCVUlMRElOVkhJR0hMT1cgMworJWlmIGNwdWZsYWcoYXZ4KQorICAgIHNodWZwcyAlMSwgJTIsICUzLCAweDRlCislZWxzZQorICAgIG1vdmxocHMgJTEsICUzCisgICAgbW92aGxwcyAlMSwgJTIKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgaW5wdXQgICUyPXt4MSx4Mix4Myx4NH0sICUzPXt5MSx5Mix5Myx5NH0KKzsgb3V0cHV0ICUxPXt4NCx5MSx5Mix5M30KKyVtYWNybyBST1RMRUZUIDMKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHBhbGlnbnIgICUxLCAlMywgJTIsIDEyCislZWxzZQorICAgIEJVSUxESU5WSElHSExPVyAlMSwgJTIsICUzCisgICAgc2h1ZnBzICAlMSwgJTEsICUzLCAweDk5CislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gSU5WRVJUSEwgMgorJWlmIGNwdWZsYWcoc3NlMikKKyAgICBQU0hVRkQgICUxLCAlMiwgMHg0ZQorJWVsc2UKKyAgICBtb3ZobHBzICUxLCAlMgorICAgIG1vdmxocHMgJTEsICUyCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gQlVUVEVSRiAzCisgICAgSU5WRVJUSEwgJTIsICUxCisgICAgeG9ycHMgICAgJTEsIFtwc19wMXAxbTFtMV0KKyAgICBhZGRwcyAgICAlMSwgJTIKKyVpZiBjcHVmbGFnKHNzZTMpCisgICAgbXVscHMgICAgJTEsICUxLCBbcHNfY29zaF9zc2UzICsgJTNdCisgICAgUFNIVUZEICAgJTIsICUxLCAweGIxCisgICAgYWRkc3VicHMgJTEsICUxLCAlMgorJWVsc2UKKyAgICBtdWxwcyAgICAlMSwgW3BzX2Nvc2ggKyAlM10KKyAgICBQU0hVRkQgICAlMiwgJTEsIDB4YjEKKyAgICB4b3JwcyAgICAlMSwgW3BzX3AxbTFwMW0xXQorICAgIGFkZHBzICAgICUxLCAlMgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEJVVFRFUkYyIDMKKyVpZiBjcHVmbGFnKHNzZTMpCisgICAgbXVscHMgICAgJTEsICUxLCBbcHNfY29zaF9zc2UzICsgJTNdCisgICAgUFNIVUZEICAgJTIsICUxLCAweGUxCisgICAgYWRkc3VicHMgJTEsICUxLCAlMgorJWVsc2UKKyAgICBtdWxwcyAgICAlMSwgW3BzX2Nvc2ggKyAlM10KKyAgICBQU0hVRkQgICAlMiwgJTEsIDB4ZTEKKyAgICB4b3JwcyAgICAlMSwgW3BzX3AxbTFwMW0xXQorICAgIGFkZHBzICAgICUxLCAlMgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFNUT1JFIDQKKyAgICBtb3ZobHBzICUyLCAlMQorICAgIG1vdnNzICAgWyUzICAgICAgIF0sICUxCisgICAgbW92c3MgICBbJTMgKyAyKiU0XSwgJTIKKyAgICBzaHVmcHMgICUxLCAlMSwgMHhiMQorICAgIG1vdnNzICAgWyUzICsgICAlNF0sICUxCisgICAgbW92aGxwcyAlMiwgJTEKKyAgICBtb3ZzcyAgIFslMyArIDMqJTRdLCAlMgorJWVuZG1hY3JvCisKKyVtYWNybyBMT0FEIDQKKyAgICBtb3ZscHMgICUxLCBbJTMgICAgICAgXQorICAgIG1vdmhwcyAgJTEsIFslMyArICAgJTRdCisgICAgbW92bHBzICAlMiwgWyUzICsgMiolNF0KKyAgICBtb3ZocHMgICUyLCBbJTMgKyAzKiU0XQorICAgIHNodWZwcyAgJTEsICUyLCAweDg4CislZW5kbWFjcm8KKworJW1hY3JvIExPQURBNjQgMgorJWlmIGNwdWZsYWcoYXZ4KQorICAgbW92dSAgICAgJTEsIFslMl0KKyVlbHNlCisgICBtb3ZscHMgICAlMSwgWyUyXQorICAgbW92aHBzICAgJTEsIFslMiArIDhdCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gREVGSU5FX0lNRENUIDAKK2NnbG9iYWwgaW1kY3QzNl9mbG9hdCwgNCw0LDksIG91dCwgYnVmLCBpbiwgd2luCisKKyAgICA7IGZvcihpPTE3O2k+PTE7aS0tKSBpbltpXSArPSBpbltpLTFdOworICAgIExPQURBNjQgbTAsIGlucQorICAgIExPQURBNjQgbTEsIGlucSArIDE2CisKKyAgICBST1RMRUZUIG01LCBtMCwgbTEKKworICAgIFBTSFVGRCAgbTYsIG0wLCAweDkzCisgICAgYW5kcHMgICBtNiwgbTYsIFtwc19tYXNrXQorICAgIGFkZHBzICAgbTAsIG0wLCBtNgorCisgICAgTE9BREE2NCBtMiwgaW5xICsgMzIKKworICAgIFJPVExFRlQgbTcsIG0xLCBtMgorCisgICAgYWRkcHMgICBtMSwgbTEsIG01CisgICAgTE9BREE2NCBtMywgaW5xICsgNDgKKworICAgIFJPVExFRlQgbTUsIG0yLCBtMworCisgICAgeG9ycHMgICBtNCwgbTQsIG00CisgICAgbW92bHBzICBtNCwgW2lucSs2NF0KKyAgICBCVUlMRElOVkhJR0hMT1cgbTYsIG0zLCBtNAorICAgIHNodWZwcyAgbTYsIG02LCBtNCwgMHhhOQorCisgICAgYWRkcHMgICBtNCwgbTQsIG02CisgICAgYWRkcHMgICBtMiwgbTIsIG03CisgICAgYWRkcHMgICBtMywgbTMsIG01CisKKyAgICA7IGZvcihpPTE3O2k+PTM7aS09MikgaW5baV0gKz0gaW5baS0yXTsKKyAgICBtb3ZsaHBzIG01LCBtNSwgbTAKKyAgICBhbmRwcyAgIG01LCBtNSwgW3BzX21hc2szXQorCisgICAgQlVJTERJTlZISUdITE9XIG03LCBtMCwgbTEKKyAgICBhbmRwcyAgIG03LCBtNywgW3BzX21hc2syXQorCisgICAgYWRkcHMgICBtMCwgbTAsIG01CisKKyAgICBCVUlMRElOVkhJR0hMT1cgbTYsIG0xLCBtMgorICAgIGFuZHBzICAgbTYsIG02LCBbcHNfbWFzazJdCisKKyAgICBhZGRwcyAgbTEsIG0xLCBtNworCisgICAgQlVJTERJTlZISUdITE9XIG03LCBtMiwgbTMKKyAgICBhbmRwcyAgIG03LCBtNywgW3BzX21hc2syXQorCisgICAgYWRkcHMgICBtMiwgbTIsIG02CisKKyAgICBtb3ZobHBzIG02LCBtNiwgbTMKKyAgICBhbmRwcyAgIG02LCBtNiwgW3BzX21hc2s0XQorCisgICAgYWRkcHMgIG0zLCBtMywgbTcKKyAgICBhZGRwcyAgbTQsIG00LCBtNgorCisgICAgOyBQb3B1bGF0ZSB0bXBbXQorICAgIG1vdmxocHMgbTYsIG0xLCBtNSAgICA7IHplcm8gb3V0IGhpZ2ggdmFsdWVzCisgICAgc3VicHMgICBtNiwgbTYsIG00CisKKyAgICBzdWJwcyAgbTUsIG0wLCBtMworCislaWYgQVJDSF9YODZfNjQKKyAgICBTV0FQICAgbTUsIG04CislZW5kaWYKKworICAgIG11bHBzICBtNywgbTIsIFtwc192YWwxXQorCislaWYgQVJDSF9YODZfNjQKKyAgICBtdWxwcyAgbTUsIG04LCBbcHNfdmFsMl0KKyVlbHNlCisgICAgbXVscHMgIG01LCBtNSwgW3BzX3ZhbDJdCislZW5kaWYKKyAgICBhZGRwcyAgbTcsIG03LCBtNQorCisgICAgbXVscHMgIG01LCBtNiwgW3BzX3ZhbDFdCisgICAgc3VicHMgIG03LCBtNywgbTUKKworJWlmIEFSQ0hfWDg2XzY0CisgICAgU1dBUCAgIG01LCBtOAorJWVsc2UKKyAgICBzdWJwcyAgbTUsIG0wLCBtMworJWVuZGlmCisKKyAgICBzdWJwcyAgbTUsIG01LCBtNgorICAgIGFkZHBzICBtNSwgbTUsIG0yCisKKyAgICBzaHVmcHMgbTYsIG00LCBtMywgMHhlNAorICAgIHN1YnBzICBtNiwgbTYsIG0yCisgICAgbXVscHMgIG02LCBtNiwgW3BzX3ZhbDNdCisKKyAgICBhZGRwcyAgbTQsIG00LCBtMQorICAgIG11bHBzICBtNCwgbTQsIFtwc192YWw0XQorCisgICAgc2h1ZnBzIG0xLCBtMSwgbTAsIDB4ZTQKKyAgICBhZGRwcyAgbTEsIG0xLCBtMgorICAgIG11bHBzICBtMSwgbTEsIFtwc192YWw1XQorCisgICAgbXVscHMgIG0zLCBtMywgW3BzX3ZhbDZdCisgICAgbXVscHMgIG0wLCBtMCwgW3BzX3ZhbDddCisgICAgYWRkcHMgIG0wLCBtMCwgbTMKKworICAgIHhvcnBzICBtMiwgbTEsIFtwc19wMXAxbTFtMV0KKyAgICBzdWJwcyAgbTIsIG0yLCBtNAorICAgIGFkZHBzICBtMiwgbTIsIG0wCisKKyAgICBhZGRwcyAgbTMsIG00LCBtMAorICAgIHN1YnBzICBtMywgbTMsIG02CisgICAgeG9ycHMgIG0zLCBtMywgW3BzX3AxcDFtMW0xXQorCisgICAgc2h1ZnBzIG0wLCBtMCwgbTQsIDB4ZTQKKyAgICBzdWJwcyAgbTAsIG0wLCBtMQorICAgIGFkZHBzICBtMCwgbTAsIG02CisKKyAgICBCVUlMRElOVkhJR0hMT1cgbTQsIG0yLCBtMworICAgIHNodWZwcyAgbTMsIG0zLCBtMiwgMHg0ZQorCisgICAgOyB3ZSBoYXZlIHRtcCA9IHtTd0FQTEgobTApLCBTd0FQTEgobTcpLCBtMywgbTQsIG01fQorCisgICAgQlVUVEVSRiAgbTAsIG0xLCAwCisgICAgQlVUVEVSRiAgbTcsIG0yLCAxNgorICAgIEJVVFRFUkYgIG0zLCBtNiwgMzIKKyAgICBCVVRURVJGICBtNCwgbTEsIDQ4CisgICAgQlVUVEVSRjIgbTUsIG0xLCA2NAorCisgICAgOyBwZXJtdXRhdGVzOgorICAgIDsgbTAgICAgMCAgMSAgMiAgMyAgICAgPT4gICAgIDIgIDYgMTAgMTQgICBtMQorICAgIDsgbTcgICAgNCAgNSAgNiAgNyAgICAgPT4gICAgIDMgIDcgMTEgMTUgICBtMgorICAgIDsgbTMgICAgOCAgOSAxMCAxMSAgICAgPT4gICAgMTcgMTMgIDkgIDUgICBtMworICAgIDsgbTQgICAxMiAxMyAxNCAxNSAgICAgPT4gICAgMTYgMTIgIDggIDQgICBtNQorICAgIDsgbTUgICAxNiAxNyB4eCB4eCAgICAgPT4gICAgIDAgIDEgeHggeHggICBtMAorCisgICAgdW5wY2tocHMgbTEsIG0wLCBtNworICAgIHVucGNraHBzIG02LCBtMywgbTQKKyAgICBtb3ZobHBzICBtMiwgbTYsIG0xCisgICAgbW92bGhwcyAgbTEsIG0xLCBtNgorCisgICAgdW5wY2tscHMgbTUsIG01LCBtNAorICAgIHVucGNrbHBzIG0zLCBtMywgbTcKKyAgICBtb3ZobHBzICBtNCwgbTMsIG01CisgICAgbW92bGhwcyAgbTUsIG01LCBtMworICAgIFNXQVAgbTQsIG0zCisgICAgOyBwZXJtdXRhdGlvbiBkb25lCisKKyAgICBQU0hVRkQgIG02LCBtMiwgMHhiMQorICAgIG1vdnNzICAgbTQsIFtidWZxICsgNCo2OF0KKyAgICBtb3ZzcyAgIG03LCBbYnVmcSArIDQqNjRdCisgICAgdW5wY2tscHMgIG03LCBtNywgbTQKKyAgICBtdWxwcyAgIG02LCBtNiwgW3dpbnEgKyAxNio0XQorICAgIGFkZHBzICAgbTYsIG02LCBtNworICAgIG1vdnNzICAgW291dHEgKyA2NCpTQkxJTUlUXSwgbTYKKyAgICBzaHVmcHMgIG02LCBtNiwgbTYsIDB4YjEKKyAgICBtb3ZzcyAgIFtvdXRxICsgNjgqU0JMSU1JVF0sIG02CisKKyAgICBtdWxwcyAgIG02LCBtMywgW3dpbnEgKyA0KjRdCisgICAgTE9BRCAgICBtNCwgbTcsIGJ1ZnEgKyA0KjE2LCAxNgorICAgIGFkZHBzICAgbTYsIG02LCBtNAorICAgIFNUT1JFICAgbTYsIG03LCBvdXRxICsgMTYqU0JMSU1JVCwgNCpTQkxJTUlUCisKKyAgICBzaHVmcHMgIG00LCBtMCwgbTMsIDB4YjUKKyAgICBtdWxwcyAgIG00LCBtNCwgW3dpbnEgKyA4KjRdCisgICAgTE9BRCAgICBtNywgbTYsIGJ1ZnEgKyA0KjMyLCAxNgorICAgIGFkZHBzICAgbTQsIG00LCBtNworICAgIFNUT1JFICAgbTQsIG02LCBvdXRxICsgMzIqU0JMSU1JVCwgNCpTQkxJTUlUCisKKyAgICBzaHVmcHMgIG0zLCBtMywgbTIsIDB4YjEKKyAgICBtdWxwcyAgIG0zLCBtMywgW3dpbnEgKyAxMio0XQorICAgIExPQUQgICAgbTcsIG02LCBidWZxICsgNCo0OCwgMTYKKyAgICBhZGRwcyAgIG0zLCBtMywgbTcKKyAgICBTVE9SRSAgIG0zLCBtNywgb3V0cSArIDQ4KlNCTElNSVQsIDQqU0JMSU1JVAorCisgICAgbXVscHMgICBtMiwgbTIsIFt3aW5xXQorICAgIExPQUQgICAgbTYsIG03LCBidWZxLCAxNgorICAgIGFkZHBzICAgbTIsIG0yLCBtNgorICAgIFNUT1JFICAgbTIsIG03LCBvdXRxLCA0KlNCTElNSVQKKworICAgIG11bHBzICAgIG00LCBtMSwgW3dpbnEgKyAyMCo0XQorICAgIFNUT1JFICAgIG00LCBtNywgYnVmcSwgMTYKKworICAgIG11bHBzICAgIG0zLCBtNSwgW3dpbnEgKyAyNCo0XQorICAgIFNUT1JFICAgIG0zLCBtNywgYnVmcSArIDQqMTYsIDE2CisKKyAgICBzaHVmcHMgICBtMCwgbTAsIG01LCAweGIwCisgICAgbXVscHMgICAgbTAsIG0wLCBbd2lucSArIDI4KjRdCisgICAgU1RPUkUgICAgbTAsIG03LCBidWZxICsgNCozMiwgMTYKKworICAgIHNodWZwcyAgIG01LCBtNSwgbTEsIDB4YjEKKyAgICBtdWxwcyAgICBtNSwgbTUsIFt3aW5xICsgMzIqNF0KKyAgICBTVE9SRSAgICBtNSwgbTcsIGJ1ZnEgKyA0KjQ4LCAxNgorCisgICAgc2h1ZnBzICAgbTEsIG0xLCBtMSwgMHhiMQorICAgIG11bHBzICAgIG0xLCBtMSwgW3dpbnEgKyAzNio0XQorICAgIG1vdnNzICAgIFtidWZxICsgNCo2NF0sIG0xCisgICAgc2h1ZnBzICAgbTEsIG0xLCAweGIxCisgICAgbW92c3MgICAgW2J1ZnEgKyA0KjY4XSwgbTEKKyAgICBSRVQKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfWE1NIHNzZQorREVGSU5FX0lNRENUCislZW5kaWYKKworSU5JVF9YTU0gc3NlMgorREVGSU5FX0lNRENUCisKK0lOSVRfWE1NIHNzZTMKK0RFRklORV9JTURDVAorCitJTklUX1hNTSBzc3NlMworREVGSU5FX0lNRENUCisKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitERUZJTkVfSU1EQ1QKKyVlbmRpZgorCitJTklUX1hNTSBzc2UKKworJWlmIEFSQ0hfWDg2XzY0CislZGVmaW5lIFNQSUxMIFNXQVAKKyVkZWZpbmUgVU5TUElMTCBTV0FQCislZGVmaW5lIFNQSUxMRUQoeCkgbSAlKyB4CislZWxzZQorJWRlZmluZSBTUElMTEVEKHgpIFt0bXBxKyh4LTgpKjE2ICsgMzIqNF0KKyVtYWNybyBTUElMTCAyIDsgeG1tIywgbWVtcG9zCisgICAgbW92YXBzIFNQSUxMRUQoJTIpLCBtJTEKKyVlbmRtYWNybworJW1hY3JvIFVOU1BJTEwgMgorICAgIG1vdmFwcyBtJTEsIFNQSUxMRUQoJTIpCislZW5kbWFjcm8KKyVlbmRpZgorCislbWFjcm8gREVGSU5FX0ZPVVJfSU1EQ1QgMAorY2dsb2JhbCBmb3VyX2ltZGN0MzZfZmxvYXQsIDUsNSwxNiwgb3V0LCBidWYsIGluLCB3aW4sIHRtcAorICAgIG1vdmxwcyAgbTAsIFtpbnErNjRdCisgICAgbW92aHBzICBtMCwgW2lucSs2NCArICAgNzJdCisgICAgbW92bHBzICBtMywgW2lucSs2NCArIDIqNzJdCisgICAgbW92aHBzICBtMywgW2lucSs2NCArIDMqNzJdCisKKyAgICBzaHVmcHMgIG01LCBtMCwgbTMsIDB4ZGQKKyAgICBzaHVmcHMgIG0wLCBtMCwgbTMsIDB4ODgKKworICAgIG1vdmEgICAgIG0xLCBbaW5xKzQ4XQorICAgIG1vdnUgICAgIG02LCBbaW5xKzQ4ICsgICA3Ml0KKyAgICBtb3ZhICAgICBtNywgW2lucSs0OCArIDIqNzJdCisgICAgbW92dSAgICAgbTMsIFtpbnErNDggKyAzKjcyXQorCisgICAgVFJBTlNQT1NFNHg0UFMgMSwgNiwgNywgMywgNAorCisgICAgYWRkcHMgICBtNCwgbTYsIG03CisgICAgbW92YSAgICBbdG1wcSs0KjI4XSwgbTQKKworICAgIGFkZHBzICAgIG03LCBtMworICAgIGFkZHBzICAgIG02LCBtMQorICAgIGFkZHBzICAgIG0zLCBtMAorICAgIGFkZHBzICAgIG0wLCBtNQorICAgIGFkZHBzICAgIG0wLCBtNworICAgIGFkZHBzICAgIG03LCBtNgorICAgIG1vdmEgICAgW3RtcHErNCoxMl0sIG03CisgICAgU1BJTEwgICAzLCAxMgorCisgICAgbW92YSAgICAgbTQsIFtpbnErMzJdCisgICAgbW92dSAgICAgbTUsIFtpbnErMzIgKyAgIDcyXQorICAgIG1vdmEgICAgIG0yLCBbaW5xKzMyICsgMio3Ml0KKyAgICBtb3Z1ICAgICBtNywgW2lucSszMiArIDMqNzJdCisKKyAgICBUUkFOU1BPU0U0eDRQUyA0LCA1LCAyLCA3LCAzCisKKyAgICBhZGRwcyAgIG0xLCBtNworICAgIFNQSUxMICAgMSwgMTEKKworICAgIGFkZHBzICAgbTMsIG01LCBtMgorICAgIFNQSUxMICAgMywgMTMKKworICAgIGFkZHBzICAgIG03LCBtMgorICAgIGFkZHBzICAgIG01LCBtNAorICAgIGFkZHBzICAgIG02LCBtNworICAgIG1vdmEgICAgW3RtcHFdLCBtNgorICAgIGFkZHBzICAgbTcsIG01CisgICAgbW92YSAgICBbdG1wcSs0KjE2XSwgbTcKKworICAgIG1vdmEgICAgbTIsIFtpbnErMTZdCisgICAgbW92dSAgICBtNywgW2lucSsxNiArICAgNzJdCisgICAgbW92YSAgICBtMSwgW2lucSsxNiArIDIqNzJdCisgICAgbW92dSAgICBtNiwgW2lucSsxNiArIDMqNzJdCisKKyAgICBUUkFOU1BPU0U0eDRQUyAyLCA3LCAxLCA2LCAzCisKKyAgICBhZGRwcyAgIG00LCBtNgorICAgIGFkZHBzICAgbTYsIG0xCisgICAgYWRkcHMgICBtMSwgbTcKKyAgICBhZGRwcyAgIG03LCBtMgorICAgIGFkZHBzICAgbTUsIG02CisgICAgU1BJTEwgICA1LCAxNQorICAgIGFkZHBzICAgbTYsIG03CisgICAgbXVscHMgICBtNiwgW2Nvc3RhYnMgKyAxNioyXQorICAgIG1vdmEgICAgW3RtcHErNCo4XSwgbTYKKyAgICBTUElMTCAgIDEsIDEwCisgICAgU1BJTEwgICAwLCAxNAorCisgICAgbW92YSAgICBtMSwgW2lucV0KKyAgICBtb3Z1ICAgIG02LCBbaW5xICsgICA3Ml0KKyAgICBtb3ZhICAgIG0zLCBbaW5xICsgMio3Ml0KKyAgICBtb3Z1ICAgIG01LCBbaW5xICsgMyo3Ml0KKworICAgIFRSQU5TUE9TRTR4NFBTIDEsIDYsIDMsIDUsIDAKKworICAgIGFkZHBzICAgIG0yLCBtNQorICAgIGFkZHBzICAgIG01LCBtMworICAgIGFkZHBzICAgIG03LCBtNQorICAgIGFkZHBzICAgIG0zLCBtNgorICAgIGFkZHBzICAgIG02LCBtMQorICAgIFNQSUxMICAgIDcsIDgKKyAgICBhZGRwcyAgICBtNSwgbTYKKyAgICBTUElMTCAgICA2LCA5CisgICAgYWRkcHMgICAgbTYsIG00LCBTUElMTEVEKDEyKQorICAgIHN1YnBzICAgIG02LCBtMgorICAgIFVOU1BJTEwgIDcsIDExCisgICAgU1BJTEwgICAgNSwgMTEKKyAgICBzdWJwcyAgICBtNSwgbTEsIG03CisgICAgbXVscHMgICAgbTcsIFtjb3N0YWJzICsgMTYqNV0KKyAgICBhZGRwcyAgICBtNywgbTEKKyAgICBtdWxwcyAgICBtMCwgbTYsIFtjb3N0YWJzICsgMTYqNl0KKyAgICBhZGRwcyAgICBtMCwgbTUKKyAgICBtb3ZhICAgICBbdG1wcSs0KjI0XSwgbTAKKyAgICBhZGRwcyAgICBtNiwgbTUKKyAgICBtb3ZhICAgICBbdG1wcSs0KjRdLCBtNgorICAgIGFkZHBzICAgIG02LCBtNCwgbTIKKyAgICBtdWxwcyAgICBtNiwgW2Nvc3RhYnMgKyAxNioxXQorICAgIHN1YnBzICAgIG00LCBTUElMTEVEKDEyKQorICAgIG11bHBzICAgIG00LCBbY29zdGFicyArIDE2KjhdCisgICAgYWRkcHMgICAgbTIsIFNQSUxMRUQoMTIpCisgICAgbXVscHMgICAgbTIsIFtjb3N0YWJzICsgMTYqM10KKyAgICBzdWJwcyAgICBtNSwgbTcsIG02CisgICAgc3VicHMgICAgbTUsIG0yCisgICAgYWRkcHMgICAgbTYsIG03CisgICAgYWRkcHMgICAgbTYsIG00CisgICAgYWRkcHMgICAgbTcsIG0yCisgICAgc3VicHMgICAgbTcsIG00CisgICAgbW92YSAgICAgW3RtcHErNCoyMF0sIG03CisgICAgbW92YSAgICAgbTIsIFt0bXBxKzQqMjhdCisgICAgbW92YSAgICAgW3RtcHErNCoyOF0sIG01CisgICAgVU5TUElMTCAgNywgMTMKKyAgICBzdWJwcyAgICBtNSwgbTcsIG0yCisgICAgbXVscHMgICAgbTUsIFtjb3N0YWJzICsgMTYqN10KKyAgICBVTlNQSUxMICAxLCAxMAorICAgIG11bHBzICAgIG0xLCBbY29zdGFicyArIDE2KjJdCisgICAgYWRkcHMgICAgbTQsIG0zLCBtMgorICAgIG11bHBzICAgIG00LCBbY29zdGFicyArIDE2KjRdCisgICAgYWRkcHMgICAgbTIsIG03CisgICAgYWRkcHMgICAgbTcsIG0zCisgICAgbXVscHMgICAgbTcsIFtjb3N0YWJzXQorICAgIHN1YnBzICAgIG0zLCBtMgorICAgIG11bHBzICAgIG0zLCBbY29zdGFicyArIDE2KjJdCisgICAgYWRkcHMgICAgbTIsIG03LCBtNQorICAgIGFkZHBzICAgIG0yLCBtMQorICAgIFNQSUxMICAgIDIsIDEwCisgICAgYWRkcHMgICAgbTcsIG00CisgICAgc3VicHMgICAgbTcsIG0xCisgICAgU1BJTEwgICAgNywgMTIKKyAgICBzdWJwcyAgICBtNSwgbTQKKyAgICBzdWJwcyAgICBtNSwgbTEKKyAgICBVTlNQSUxMICAwLCAxNAorICAgIFNQSUxMICAgIDUsIDEzCisgICAgYWRkcHMgICAgbTEsIG0wLCBTUElMTEVEKDE1KQorICAgIHN1YnBzICAgIG0xLCBTUElMTEVEKDgpCisgICAgbW92YSAgICAgbTQsIFtjb3N0YWJzICsgMTYqNV0KKyAgICBtdWxwcyAgICBtNCwgW3RtcHFdCisgICAgVU5TUElMTCAgMiwgOQorICAgIGFkZHBzICAgIG00LCBtMgorICAgIHN1YnBzICAgIG0yLCBbdG1wcV0KKyAgICBtdWxwcyAgICBtNSwgbTEsIFtjb3N0YWJzICsgMTYqNl0KKyAgICBhZGRwcyAgICBtNSwgbTIKKyAgICBTUElMTCAgICA1LCA5CisgICAgYWRkcHMgICAgbTIsIG0xCisgICAgU1BJTEwgICAgMiwgMTQKKyAgICBVTlNQSUxMICA1LCAxNQorICAgIHN1YnBzICAgIG03LCBtNSwgbTAKKyAgICBhZGRwcyAgICBtNSwgU1BJTExFRCg4KQorICAgIG11bHBzICAgIG01LCBbY29zdGFicyArIDE2KjFdCisgICAgbXVscHMgICAgbTcsIFtjb3N0YWJzICsgMTYqOF0KKyAgICBhZGRwcyAgICBtMCwgU1BJTExFRCg4KQorICAgIG11bHBzICAgIG0wLCBbY29zdGFicyArIDE2KjNdCisgICAgc3VicHMgICAgbTIsIG00LCBtNQorICAgIHN1YnBzICAgIG0yLCBtMAorICAgIFNQSUxMICAgIDIsIDE1CisgICAgYWRkcHMgICAgbTUsIG00CisgICAgYWRkcHMgICAgbTUsIG03CisgICAgYWRkcHMgICAgbTQsIG0wCisgICAgc3VicHMgICAgbTQsIG03CisgICAgU1BJTEwgICAgNCwgOAorICAgIG1vdmEgICAgIG03LCBbdG1wcSs0KjE2XQorICAgIG1vdmEgICAgIG0yLCBbdG1wcSs0KjEyXQorICAgIGFkZHBzICAgIG0wLCBtNywgbTIKKyAgICBzdWJwcyAgICBtMCwgU1BJTExFRCgxMSkKKyAgICBtdWxwcyAgICBtMCwgW2Nvc3RhYnMgKyAxNioyXQorICAgIGFkZHBzICAgIG00LCBtNywgU1BJTExFRCgxMSkKKyAgICBtdWxwcyAgICBtNCwgW2Nvc3RhYnNdCisgICAgc3VicHMgICAgbTcsIG0yCisgICAgbXVscHMgICAgbTcsIFtjb3N0YWJzICsgMTYqN10KKyAgICBhZGRwcyAgICBtMiwgU1BJTExFRCgxMSkKKyAgICBtdWxwcyAgICBtMiwgW2Nvc3RhYnMgKyAxNio0XQorICAgIGFkZHBzICAgIG0xLCBtNywgW3RtcHErNCo4XQorICAgIGFkZHBzICAgIG0xLCBtNAorICAgIGFkZHBzICAgIG00LCBtMgorICAgIHN1YnBzICAgIG00LCBbdG1wcSs0KjhdCisgICAgU1BJTEwgICAgNCwgMTEKKyAgICBzdWJwcyAgICBtNywgbTIKKyAgICBzdWJwcyAgICBtNywgW3RtcHErNCo4XQorICAgIGFkZHBzICAgIG00LCBtNiwgU1BJTExFRCgxMCkKKyAgICBzdWJwcyAgICBtNiwgU1BJTExFRCgxMCkKKyAgICBhZGRwcyAgICBtMiwgbTUsIG0xCisgICAgbXVscHMgICAgbTIsIFtjb3N0YWJzICsgMTYqOV0KKyAgICBzdWJwcyAgICBtNSwgbTEKKyAgICBtdWxwcyAgICBtNSwgW2Nvc3RhYnMgKyAxNioxN10KKyAgICBzdWJwcyAgICBtMSwgbTQsIG0yCisgICAgYWRkcHMgICAgbTQsIG0yCisgICAgbXVscHMgICAgbTIsIG0xLCBbd2lucSs0KjM2XQorICAgIGFkZHBzICAgIG0yLCBbYnVmcSs0KjM2XQorICAgIG1vdmEgICAgIFtvdXRxKzExNTJdLCBtMgorICAgIG11bHBzICAgIG0xLCBbd2lucSs0KjMyXQorICAgIGFkZHBzICAgIG0xLCBbYnVmcSs0KjMyXQorICAgIG1vdmEgICAgIFtvdXRxKzEwMjRdLCBtMQorICAgIG11bHBzICAgIG0xLCBtNCwgW3dpbnErNCoxMTZdCisgICAgbW92YSAgICAgW2J1ZnErNCozNl0sIG0xCisgICAgbXVscHMgICAgbTQsIFt3aW5xKzQqMTEyXQorICAgIG1vdmEgICAgIFtidWZxKzQqMzJdLCBtNAorICAgIGFkZHBzICAgIG0yLCBtNiwgbTUKKyAgICBzdWJwcyAgICBtNiwgbTUKKyAgICBtdWxwcyAgICBtMSwgbTYsIFt3aW5xKzQqNjhdCisgICAgYWRkcHMgICAgbTEsIFtidWZxKzQqNjhdCisgICAgbW92YSAgICAgW291dHErMjE3Nl0sIG0xCisgICAgbXVscHMgICAgbTYsIFt3aW5xXQorICAgIGFkZHBzICAgIG02LCBbYnVmcV0KKyAgICBtb3ZhICAgICBbb3V0cV0sIG02CisgICAgbXVscHMgICAgbTEsIG0yLCBbd2lucSs0KjE0OF0KKyAgICBtb3ZhICAgICBbYnVmcSs0KjY4XSwgbTEKKyAgICBtdWxwcyAgICBtMiwgW3dpbnErNCo4MF0KKyAgICBtb3ZhICAgICBbYnVmcV0sIG0yCisgICAgYWRkcHMgICAgbTUsIG0zLCBbdG1wcSs0KjI0XQorICAgIG1vdmEgICAgIG0yLCBbdG1wcSs0KjI0XQorICAgIHN1YnBzICAgIG0yLCBtMworICAgIG1vdmEgICAgIG0xLCBTUElMTEVEKDkpCisgICAgc3VicHMgICAgbTEsIG0wCisgICAgbXVscHMgICAgbTEsIFtjb3N0YWJzICsgMTYqMTBdCisgICAgYWRkcHMgICAgbTAsIFNQSUxMRUQoOSkKKyAgICBtdWxwcyAgICBtMCwgW2Nvc3RhYnMgKyAxNioxNl0KKyAgICBhZGRwcyAgICBtNiwgbTUsIG0xCisgICAgc3VicHMgICAgbTUsIG0xCisgICAgbXVscHMgICAgbTMsIG01LCBbd2lucSs0KjQwXQorICAgIGFkZHBzICAgIG0zLCBbYnVmcSs0KjQwXQorICAgIG1vdmEgICAgIFtvdXRxKzEyODBdLCBtMworICAgIG11bHBzICAgIG01LCBbd2lucSs0KjI4XQorICAgIGFkZHBzICAgIG01LCBbYnVmcSs0KjI4XQorICAgIG1vdmEgICAgIFtvdXRxKzg5Nl0sIG01CisgICAgbXVscHMgICAgbTEsIG02LCBbd2lucSs0KjEyMF0KKyAgICBtb3ZhICAgICBbYnVmcSs0KjQwXSwgbTEKKyAgICBtdWxwcyAgICBtNiwgW3dpbnErNCoxMDhdCisgICAgbW92YSAgICAgW2J1ZnErNCoyOF0sIG02CisgICAgYWRkcHMgICAgbTEsIG0yLCBtMAorICAgIHN1YnBzICAgIG0yLCBtMAorICAgIG11bHBzICAgIG01LCBtMiwgW3dpbnErNCo2NF0KKyAgICBhZGRwcyAgICBtNSwgW2J1ZnErNCo2NF0KKyAgICBtb3ZhICAgICBbb3V0cSsyMDQ4XSwgbTUKKyAgICBtdWxwcyAgICBtMiwgW3dpbnErNCo0XQorICAgIGFkZHBzICAgIG0yLCBbYnVmcSs0KjRdCisgICAgbW92YSAgICAgW291dHErMTI4XSwgbTIKKyAgICBtdWxwcyAgICBtMCwgbTEsIFt3aW5xKzQqMTQ0XQorICAgIG1vdmEgICAgIFtidWZxKzQqNjRdLCBtMAorICAgIG11bHBzICAgIG0xLCBbd2lucSs0Kjg0XQorICAgIG1vdmEgICAgIFtidWZxKzQqNF0sIG0xCisgICAgbW92YSAgICAgbTEsIFt0bXBxKzQqMjhdCisgICAgbW92YSAgICAgbTUsIG0xCisgICAgYWRkcHMgICAgbTEsIFNQSUxMRUQoMTMpCisgICAgc3VicHMgICAgbTUsIFNQSUxMRUQoMTMpCisgICAgVU5TUElMTCAgMywgMTUKKyAgICBhZGRwcyAgICBtMiwgbTcsIG0zCisgICAgbXVscHMgICAgbTIsIFtjb3N0YWJzICsgMTYqMTFdCisgICAgc3VicHMgICAgbTMsIG03CisgICAgbXVscHMgICAgbTMsIFtjb3N0YWJzICsgMTYqMTVdCisgICAgYWRkcHMgICAgbTAsIG0yLCBtMQorICAgIHN1YnBzICAgIG0xLCBtMgorICAgIFNXQVAgICAgIG0wLCBtMgorICAgIG11bHBzICAgIG02LCBtMSwgW3dpbnErNCo0NF0KKyAgICBhZGRwcyAgICBtNiwgW2J1ZnErNCo0NF0KKyAgICBtb3ZhICAgICBbb3V0cSsxNDA4XSwgbTYKKyAgICBtdWxwcyAgICBtMSwgW3dpbnErNCoyNF0KKyAgICBhZGRwcyAgICBtMSwgW2J1ZnErNCoyNF0KKyAgICBtb3ZhICAgICBbb3V0cSs3NjhdLCBtMQorICAgIG11bHBzICAgIG0wLCBtMiwgW3dpbnErNCoxMjRdCisgICAgbW92YSAgICAgW2J1ZnErNCo0NF0sIG0wCisgICAgbXVscHMgICAgbTIsIFt3aW5xKzQqMTA0XQorICAgIG1vdmEgICAgIFtidWZxKzQqMjRdLCBtMgorICAgIGFkZHBzICAgIG0wLCBtNSwgbTMKKyAgICBzdWJwcyAgICBtNSwgbTMKKyAgICBtdWxwcyAgICBtMSwgbTUsIFt3aW5xKzQqNjBdCisgICAgYWRkcHMgICAgbTEsIFtidWZxKzQqNjBdCisgICAgbW92YSAgICAgW291dHErMTkyMF0sIG0xCisgICAgbXVscHMgICAgbTUsIFt3aW5xKzQqOF0KKyAgICBhZGRwcyAgICBtNSwgW2J1ZnErNCo4XQorICAgIG1vdmEgICAgIFtvdXRxKzI1Nl0sIG01CisgICAgbXVscHMgICAgbTEsIG0wLCBbd2lucSs0KjE0MF0KKyAgICBtb3ZhICAgICBbYnVmcSs0KjYwXSwgbTEKKyAgICBtdWxwcyAgICBtMCwgW3dpbnErNCo4OF0KKyAgICBtb3ZhICAgICBbYnVmcSs0KjhdLCBtMAorICAgIG1vdmEgICAgIG0xLCBbdG1wcSs0KjIwXQorICAgIGFkZHBzICAgIG0xLCBTUElMTEVEKDEyKQorICAgIG1vdmEgICAgIG0yLCBbdG1wcSs0KjIwXQorICAgIHN1YnBzICAgIG0yLCBTUElMTEVEKDEyKQorICAgIFVOU1BJTEwgIDcsIDgKKyAgICBzdWJwcyAgICBtMCwgbTcsIFNQSUxMRUQoMTEpCisgICAgYWRkcHMgICAgbTcsIFNQSUxMRUQoMTEpCisgICAgbXVscHMgICAgbTQsIG03LCBbY29zdGFicyArIDE2KjEyXQorICAgIG11bHBzICAgIG0wLCBbY29zdGFicyArIDE2KjE0XQorICAgIGFkZHBzICAgIG01LCBtMSwgbTQKKyAgICBzdWJwcyAgICBtMSwgbTQKKyAgICBtdWxwcyAgICBtNywgbTEsIFt3aW5xKzQqNDhdCisgICAgYWRkcHMgICAgbTcsIFtidWZxKzQqNDhdCisgICAgbW92YSAgICAgW291dHErMTUzNl0sIG03CisgICAgbXVscHMgICAgbTEsIFt3aW5xKzQqMjBdCisgICAgYWRkcHMgICAgbTEsIFtidWZxKzQqMjBdCisgICAgbW92YSAgICAgW291dHErNjQwXSwgbTEKKyAgICBtdWxwcyAgICBtMSwgbTUsIFt3aW5xKzQqMTI4XQorICAgIG1vdmEgICAgIFtidWZxKzQqNDhdLCBtMQorICAgIG11bHBzICAgIG01LCBbd2lucSs0KjEwMF0KKyAgICBtb3ZhICAgICBbYnVmcSs0KjIwXSwgbTUKKyAgICBhZGRwcyAgICBtNiwgbTIsIG0wCisgICAgc3VicHMgICAgbTIsIG0wCisgICAgbXVscHMgICAgbTEsIG0yLCBbd2lucSs0KjU2XQorICAgIGFkZHBzICAgIG0xLCBbYnVmcSs0KjU2XQorICAgIG1vdmEgICAgIFtvdXRxKzE3OTJdLCBtMQorICAgIG11bHBzICAgIG0yLCBbd2lucSs0KjEyXQorICAgIGFkZHBzICAgIG0yLCBbYnVmcSs0KjEyXQorICAgIG1vdmEgICAgIFtvdXRxKzM4NF0sIG0yCisgICAgbXVscHMgICAgbTAsIG02LCBbd2lucSs0KjEzNl0KKyAgICBtb3ZhICAgIFtidWZxKzQqNTZdLCBtMAorICAgIG11bHBzICAgIG02LCBbd2lucSs0KjkyXQorICAgIG1vdmEgICAgIFtidWZxKzQqMTJdLCBtNgorICAgIFVOU1BJTEwgIDAsIDE0CisgICAgbXVscHMgICAgbTAsIFtjb3N0YWJzICsgMTYqMTNdCisgICAgbW92YSAgICAgbTMsIFt0bXBxKzQqNF0KKyAgICBhZGRwcyAgICBtMiwgbTAsIG0zCisgICAgc3VicHMgICAgbTMsIG0wCisgICAgbXVscHMgICAgbTAsIG0zLCBbd2lucSs0KjUyXQorICAgIGFkZHBzICAgIG0wLCBbYnVmcSs0KjUyXQorICAgIG1vdmEgICAgIFtvdXRxKzE2NjRdLCBtMAorICAgIG11bHBzICAgIG0zLCBbd2lucSs0KjE2XQorICAgIGFkZHBzICAgIG0zLCBbYnVmcSs0KjE2XQorICAgIG1vdmEgICAgIFtvdXRxKzUxMl0sIG0zCisgICAgbXVscHMgICAgbTAsIG0yLCBbd2lucSs0KjEzMl0KKyAgICBtb3ZhICAgICBbYnVmcSs0KjUyXSwgbTAKKyAgICBtdWxwcyAgICBtMiwgW3dpbnErNCo5Nl0KKyAgICBtb3ZhICAgICBbYnVmcSs0KjE2XSwgbTIKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UKK0RFRklORV9GT1VSX0lNRENUCisKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitERUZJTkVfRk9VUl9JTURDVAorJWVuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvaW5saW5lX2FzbS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2lubGluZV9hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTY1YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2lubGluZV9hc20uaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIGlubGluZSBhc3NlbWJseSBoZWxwZXIgbWFjcm9zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19YODZfSU5MSU5FX0FTTV9ICisjZGVmaW5lIEFWQ09ERUNfWDg2X0lOTElORV9BU01fSAorCisjaW5jbHVkZSAiY29uc3RhbnRzLmgiCisKKyNkZWZpbmUgTU9WUV9XT05FKHJlZ2QpIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggXAorICAgICJwY21wZXFkICUlIiAjcmVnZCAiLCAlJSIgI3JlZ2QgIiBcblx0IiBcCisgICAgInBzcmx3ICQxNSwgJSUiICNyZWdkIDo6KQorCisjZGVmaW5lIEpVTVBBTElHTigpICAgICBfX2FzbV9fIHZvbGF0aWxlICgiLnAyYWxpZ24gMyI6OikKKyNkZWZpbmUgTU9WUV9aRVJPKHJlZ2QpIF9fYXNtX18gdm9sYXRpbGUgKCJweG9yICUlIiNyZWdkIiwgJSUiI3JlZ2QgOjopCisKKyNkZWZpbmUgTU9WUV9CRkUocmVnZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwY21wZXFkICUlIiNyZWdkIiwgJSUiI3JlZ2QiICAgXG5cdCIgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRiICAgJSUiI3JlZ2QiLCAlJSIjcmVnZCIgICBcblx0IiA6OikKKworI2lmbmRlZiBQSUMKKyNkZWZpbmUgTU9WUV9XVFdPKHJlZ2QpIF9fYXNtX18gdm9sYXRpbGUgKCJtb3ZxICUwLCAlJSIjcmVnZCIgXG5cdCIgOjogIm0iKGZmX3B3XzIpKQorI2Vsc2UKKy8vIGZvciBzaGFyZWQgbGlicmFyeSBpdCdzIGJldHRlciB0byB1c2UgdGhpcyB3YXkgZm9yIGFjY2Vzc2luZyBjb25zdGFudHMKKy8vIHBjbXBlcWQgLT4gLTEKKyNkZWZpbmUgTU9WUV9XVFdPKHJlZ2QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwY21wZXFkICUlIiNyZWdkIiwgJSUiI3JlZ2QiICAgXG5cdCIgICAgICAgICAgIFwKKyAgICAgICAgInBzcmx3ICAgICAgICAgJDE1LCAlJSIjcmVnZCIgICBcblx0IiAgICAgICAgICAgXAorICAgICAgICAicHNsbHcgICAgICAgICAgJDEsICUlIiNyZWdkIiAgIFxuXHQiOjopCisKKyNlbmRpZgorCisvLyB1c2luZyByZWdyIGFzIHRlbXBvcmFyeSBhbmQgZm9yIHRoZSBvdXRwdXQgcmVzdWx0CisvLyBmaXJzdCBhcmd1bWVudCBpcyB1bm1vZGlmZWQgYW5kIHNlY29uZCBpcyB0cmFzaGVkCisvLyByZWdmZSBpcyBzdXBwb3NlZCB0byBjb250YWluIDB4ZmVmZWZlZmVmZWZlZmVmZQorI2RlZmluZSBQQVZHQl9NTVhfTk9fUk5EKHJlZ2EsIHJlZ2IsIHJlZ3IsIHJlZ2ZlKSAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAiI3JlZ2EiLCAiI3JlZ3IiICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgICIjcmVnYiIsICIjcmVnciIgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJweG9yICAgIiNyZWdhIiwgIiNyZWdiIiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhbmQgICIjcmVnZmUiLCAiI3JlZ2IiICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNybHEgICAgICAgJDEsICIjcmVnYiIgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkYiAgIiNyZWdiIiwgIiNyZWdyIiAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgUEFWR0JfTU1YKHJlZ2EsIHJlZ2IsIHJlZ3IsIHJlZ2ZlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgIiNyZWdhIiwgIiNyZWdyIiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvciAgICAiI3JlZ2IiLCAiI3JlZ3IiICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAgICIjcmVnYSIsICIjcmVnYiIgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYW5kICAiI3JlZ2ZlIiwgIiNyZWdiIiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzcmxxICAgICAgICQxLCAiI3JlZ2IiICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YmIgICIjcmVnYiIsICIjcmVnciIgICAgICAgICAgICBcblx0IgorCisvLyBtbTYgaXMgc3VwcG9zZWQgdG8gY29udGFpbiAweGZlZmVmZWZlZmVmZWZlZmUKKyNkZWZpbmUgUEFWR0JQX01NWF9OT19STkQocmVnYSwgcmVnYiwgcmVnciwgIHJlZ2MsIHJlZ2QsIHJlZ3ApICAgXAorICAgICJtb3ZxICAiI3JlZ2EiLCAiI3JlZ3IiICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICIjcmVnYyIsICIjcmVncCIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgIiNyZWdiIiwgIiNyZWdyIiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYW5kICAiI3JlZ2QiLCAiI3JlZ3AiICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInB4b3IgICIjcmVnYSIsICIjcmVnYiIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAgIiNyZWdjIiwgIiNyZWdkIiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYW5kICAgICUlbW02LCAiI3JlZ2IiICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhbmQgICAgJSVtbTYsICIjcmVnZCIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNybHEgICAgICAkMSwgIiNyZWdiIiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3JscSAgICAgICQxLCAiI3JlZ2QiICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhZGRiICIjcmVnYiIsICIjcmVnciIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZGIgIiNyZWdkIiwgIiNyZWdwIiAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIFBBVkdCUF9NTVgocmVnYSwgcmVnYiwgcmVnciwgcmVnYywgcmVnZCwgcmVncCkgICAgICAgICAgIFwKKyAgICAibW92cSAgIiNyZWdhIiwgIiNyZWdyIiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAiI3JlZ2MiLCAiI3JlZ3AiICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvciAgICIjcmVnYiIsICIjcmVnciIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9yICAgIiNyZWdkIiwgIiNyZWdwIiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJweG9yICAiI3JlZ2EiLCAiI3JlZ2IiICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInB4b3IgICIjcmVnYyIsICIjcmVnZCIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgICAlJW1tNiwgIiNyZWdiIiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYW5kICAgICUlbW02LCAiI3JlZ2QiICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzcmxxICAgICAgJDEsICIjcmVnZCIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNybHEgICAgICAkMSwgIiNyZWdiIiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3ViYiAiI3JlZ2IiLCAiI3JlZ3IiICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJiICIjcmVnZCIsICIjcmVncCIgICAgICAgICAgICAgXG5cdCIKKworI2VuZGlmIC8qIEFWQ09ERUNfWDg2X0lOTElORV9BU01fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2xvc3NsZXNzX2F1ZGlvZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc19hdWRpb2RzcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzOTVmZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc19hdWRpb2RzcC5hc20KQEAgLTAsMCArMSwxNjUgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIENvcHlyaWdodCAoYykgMjAwOCBMb3JlbiBNZXJyaXR0Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9URVhUCisKKyVtYWNybyBTQ0FMQVJQUk9EVUNUIDAKKzsgaW50IGZmX3NjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MTYoaW50MTZfdCAqdjEsIGludDE2X3QgKnYyLCBpbnQxNl90ICp2MywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yZGVyLCBpbnQgbXVsKQorY2dsb2JhbCBzY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2LCA0LDQsOCwgdjEsIHYyLCB2Mywgb3JkZXIsIG11bAorJWlmIG1tc2l6ZSA9PSAxNgorICAgIHRlc3Qgb3JkZXJxLCA4CisgICAgICAgIGpueiBzY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2X2ZhbGxiYWNrCislZWxzZQorICAgIHNjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MTZfZmFsbGJhY2sKKyVlbmRpZgorICAgIHNobCBvcmRlcnEsIDEKKyAgICBtb3ZkICAgIG03LCBtdWxtCislaWYgbW1zaXplID09IDE2CisgICAgcHNodWZsdyBtNywgbTcsIDAKKyAgICBwdW5wY2tscWRxIG03LCBtNworJWVsc2UKKyAgICBwc2h1ZncgIG03LCBtNywgMAorJWVuZGlmCisgICAgcHhvciAgICBtNiwgbTYKKyAgICBhZGQgdjFxLCBvcmRlcnEKKyAgICBhZGQgdjJxLCBvcmRlcnEKKyAgICBhZGQgdjNxLCBvcmRlcnEKKyAgICBuZWcgb3JkZXJxCisubG9vcDoKKyAgICBtb3Z1ICAgIG0wLCBbdjJxICsgb3JkZXJxXQorICAgIG1vdnUgICAgbTEsIFt2MnEgKyBvcmRlcnEgKyBtbXNpemVdCisgICAgbW92YSAgICBtNCwgW3YxcSArIG9yZGVycV0KKyAgICBtb3ZhICAgIG01LCBbdjFxICsgb3JkZXJxICsgbW1zaXplXQorICAgIG1vdnUgICAgbTIsIFt2M3EgKyBvcmRlcnFdCisgICAgbW92dSAgICBtMywgW3YzcSArIG9yZGVycSArIG1tc2l6ZV0KKyAgICBwbWFkZHdkIG0wLCBtNAorICAgIHBtYWRkd2QgbTEsIG01CisgICAgcG11bGx3ICBtMiwgbTcKKyAgICBwbXVsbHcgIG0zLCBtNworICAgIHBhZGRkICAgbTYsIG0wCisgICAgcGFkZGQgICBtNiwgbTEKKyAgICBwYWRkdyAgIG0yLCBtNAorICAgIHBhZGR3ICAgbTMsIG01CisgICAgbW92YSAgICBbdjFxICsgb3JkZXJxXSwgbTIKKyAgICBtb3ZhICAgIFt2MXEgKyBvcmRlcnEgKyBtbXNpemVdLCBtMworICAgIGFkZCAgICAgb3JkZXJxLCBtbXNpemUqMgorICAgIGpsIC5sb29wCisgICAgSEFEREQgICBtNiwgbTAKKyAgICBtb3ZkICAgZWF4LCBtNgorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorU0NBTEFSUFJPRFVDVAorSU5JVF9YTU0gc3NlMgorU0NBTEFSUFJPRFVDVAorCislbWFjcm8gU0NBTEFSUFJPRFVDVF9MT09QIDEKK2FsaWduIDE2CisubG9vcCUxOgorICAgIHN1YiAgICAgb3JkZXJxLCBtbXNpemUqMgorJWlmICUxCisgICAgbW92YSAgICBtMSwgbTQKKyAgICBtb3ZhICAgIG00LCBbdjJxICsgb3JkZXJxXQorICAgIG1vdmEgICAgbTAsIFt2MnEgKyBvcmRlcnEgKyBtbXNpemVdCisgICAgcGFsaWduciBtMSwgbTAsICUxCisgICAgcGFsaWduciBtMCwgbTQsICUxCisgICAgbW92YSAgICBtMywgbTUKKyAgICBtb3ZhICAgIG01LCBbdjNxICsgb3JkZXJxXQorICAgIG1vdmEgICAgbTIsIFt2M3EgKyBvcmRlcnEgKyBtbXNpemVdCisgICAgcGFsaWduciBtMywgbTIsICUxCisgICAgcGFsaWduciBtMiwgbTUsICUxCislZWxzZQorICAgIG1vdmEgICAgbTAsIFt2MnEgKyBvcmRlcnFdCisgICAgbW92YSAgICBtMSwgW3YycSArIG9yZGVycSArIG1tc2l6ZV0KKyAgICBtb3ZhICAgIG0yLCBbdjNxICsgb3JkZXJxXQorICAgIG1vdmEgICAgbTMsIFt2M3EgKyBvcmRlcnEgKyBtbXNpemVdCislZW5kaWYKKyAgICAlZGVmaW5lIHQwICBbdjFxICsgb3JkZXJxXQorICAgICVkZWZpbmUgdDEgIFt2MXEgKyBvcmRlcnEgKyBtbXNpemVdCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZhICAgIG04LCB0MAorICAgIG1vdmEgICAgbTksIHQxCisgICAgJWRlZmluZSB0MCAgbTgKKyAgICAlZGVmaW5lIHQxICBtOQorJWVuZGlmCisgICAgcG1hZGR3ZCBtMCwgdDAKKyAgICBwbWFkZHdkIG0xLCB0MQorICAgIHBtdWxsdyAgbTIsIG03CisgICAgcG11bGx3ICBtMywgbTcKKyAgICBwYWRkdyAgIG0yLCB0MAorICAgIHBhZGR3ICAgbTMsIHQxCisgICAgcGFkZGQgICBtNiwgbTAKKyAgICBwYWRkZCAgIG02LCBtMQorICAgIG1vdmEgICAgW3YxcSArIG9yZGVycV0sIG0yCisgICAgbW92YSAgICBbdjFxICsgb3JkZXJxICsgbW1zaXplXSwgbTMKKyAgICBqZyAubG9vcCUxCislaWYgJTEKKyAgICBqbXAgLmVuZAorJWVuZGlmCislZW5kbWFjcm8KKworOyBpbnQgZmZfc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNihpbnQxNl90ICp2MSwgaW50MTZfdCAqdjIsIGludDE2X3QgKnYzLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIsIGludCBtdWwpCitJTklUX1hNTSBzc3NlMworY2dsb2JhbCBzY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2LCA0LDUsMTAsIHYxLCB2MiwgdjMsIG9yZGVyLCBtdWwKKyAgICB0ZXN0IG9yZGVycSwgOAorICAgICAgICBqbnogc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNl9mYWxsYmFjaworICAgIHNobCBvcmRlcnEsIDEKKyAgICBtb3ZkICAgIG03LCBtdWxtCisgICAgcHNodWZsdyBtNywgbTcsIDAKKyAgICBwdW5wY2tscWRxIG03LCBtNworICAgIHB4b3IgICAgbTYsIG02CisgICAgbW92ICAgIHI0ZCwgdjJkCisgICAgYW5kICAgIHI0ZCwgMTUKKyAgICBhbmQgICAgdjJxLCB+MTUKKyAgICBhbmQgICAgdjNxLCB+MTUKKyAgICBtb3ZhICAgIG00LCBbdjJxICsgb3JkZXJxXQorICAgIG1vdmEgICAgbTUsIFt2M3EgKyBvcmRlcnFdCisgICAgOyBsaW5lYXIgaXMgZmFzdGVyIHRoYW4gYnJhbmNoIHRyZWUgb3IganVtcCB0YWJsZSwgYmVjYXVzZSB0aGUgYnJhbmNoZXMgdGFrZW4gYXJlIGN5Y2xpYyAoaS5lLiBwcmVkaWN0YWJsZSkKKyAgICBjbXAgICAgcjRkLCAwCisgICAgamUgLmxvb3AwCisgICAgY21wICAgIHI0ZCwgMgorICAgIGplIC5sb29wMgorICAgIGNtcCAgICByNGQsIDQKKyAgICBqZSAubG9vcDQKKyAgICBjbXAgICAgcjRkLCA2CisgICAgamUgLmxvb3A2CisgICAgY21wICAgIHI0ZCwgOAorICAgIGplIC5sb29wOAorICAgIGNtcCAgICByNGQsIDEwCisgICAgamUgLmxvb3AxMAorICAgIGNtcCAgICByNGQsIDEyCisgICAgamUgLmxvb3AxMgorU0NBTEFSUFJPRFVDVF9MT09QIDE0CitTQ0FMQVJQUk9EVUNUX0xPT1AgMTIKK1NDQUxBUlBST0RVQ1RfTE9PUCAxMAorU0NBTEFSUFJPRFVDVF9MT09QIDgKK1NDQUxBUlBST0RVQ1RfTE9PUCA2CitTQ0FMQVJQUk9EVUNUX0xPT1AgNAorU0NBTEFSUFJPRFVDVF9MT09QIDIKK1NDQUxBUlBST0RVQ1RfTE9PUCAwCisuZW5kOgorICAgIEhBREREICAgbTYsIG0wCisgICAgbW92ZCAgIGVheCwgbTYKKyAgICBSRVQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc19hdWRpb2RzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbG9zc2xlc3NfYXVkaW9kc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzlkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbG9zc2xlc3NfYXVkaW9kc3BfaW5pdC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9sb3NzbGVzc19hdWRpb2RzcC5oIgorCitpbnQzMl90IGZmX3NjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MTZfbW14ZXh0KGludDE2X3QgKnYxLCBjb25zdCBpbnQxNl90ICp2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRlciwgaW50IG11bCk7CitpbnQzMl90IGZmX3NjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MTZfc3NlMihpbnQxNl90ICp2MSwgY29uc3QgaW50MTZfdCAqdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRlciwgaW50IG11bCk7CitpbnQzMl90IGZmX3NjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MTZfc3NzZTMoaW50MTZfdCAqdjEsIGNvbnN0IGludDE2X3QgKnYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRlciwgaW50IG11bCk7CisKK2F2X2NvbGQgdm9pZCBmZl9sbGF1ZGRzcF9pbml0X3g4NihMTEF1ZERTUENvbnRleHQgKmMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSkKKyAgICAgICAgYy0+c2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNiA9IGZmX3NjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MTZfbW14ZXh0OworCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgYy0+c2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNiA9IGZmX3NjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MTZfc3NlMjsKKworICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpICYmCisgICAgICAgICEoY3B1X2ZsYWdzICYgKEFWX0NQVV9GTEFHX1NTRTQyIHwgQVZfQ1BVX0ZMQUdfM0ROT1cpKSkgLy8gY2FjaGVzcGxpdAorICAgICAgICBjLT5zY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2ID0gZmZfc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNl9zc3NlMzsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc192aWRlb2RzcC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbG9zc2xlc3NfdmlkZW9kc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YzIzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbG9zc2xlc3NfdmlkZW9kc3AuYXNtCkBAIC0wLDAgKzEsMjk0IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBTSU1EIGxvc3NsZXNzIHZpZGVvIERTUCB1dGlscworOyogQ29weXJpZ2h0IChjKSAyMDA4IExvcmVuIE1lcnJpdHQKKzsqIENvcHlyaWdodCAoYykgMjAxNCBNaWNoYWVsIE5pZWRlcm1heWVyCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworcGJfZWY6IHRpbWVzIDggZGIgMTQsMTUKK3BiXzY3OiB0aW1lcyA4IGRiICA2LCA3CitwYl96enp6MjMyM3p6enphYmFiOiBkYiAtMSwtMSwtMSwtMSwgMiwgMywgMiwgMywtMSwtMSwtMSwtMSwxMCwxMSwxMCwxMQorcGJfenp6enp6eno2NzY3Njc2NzogZGIgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIDYsIDcsIDYsIDcsIDYsIDcsIDYsIDcKKworU0VDVElPTl9URVhUCisKKyVtYWNybyBJTlQxNl9MT09QIDIgOyAlMSA9IGEvdSAoYWxpZ25lZC91bmFsaWduZWQpLCAlMiA9IGFkZC9zdWIKKyAgICBtb3ZkICAgIG00LCBtYXNrZAorICAgIFNQTEFUVyAgbTQsIG00CisgICAgYWRkICAgICB3ZCwgd2QKKyAgICB0ZXN0ICAgIHdxLCAyKm1tc2l6ZSAtIDEKKyAgICBqeiAlJS50b21haW5sb29wCisgICAgcHVzaCAgdG1wcQorJSUud29yZGxvb3A6CisgICAgc3ViICAgICB3cSwgMgorJWlmaWRuICUyLCBhZGQKKyAgICBtb3YgICB0bXB3LCBbc3JjcSt3cV0KKyAgICBhZGQgICB0bXB3LCBbZHN0cSt3cV0KKyVlbHNlCisgICAgbW92ICAgdG1wdywgW3NyYzFxK3dxXQorICAgIHN1YiAgIHRtcHcsIFtzcmMycSt3cV0KKyVlbmRpZgorICAgIGFuZCAgIHRtcHcsIG1hc2t3CisgICAgbW92ICAgICBbZHN0cSt3cV0sIHRtcHcKKyAgICB0ZXN0ICAgIHdxLCAyKm1tc2l6ZSAtIDEKKyAgICBqbnogJSUud29yZGxvb3AKKyAgICBwb3AgICB0bXBxCislJS50b21haW5sb29wOgorJWlmaWRuICUyLCBhZGQKKyAgICBhZGQgICAgIHNyY3EsIHdxCislZWxzZQorICAgIGFkZCAgICAgc3JjMXEsIHdxCisgICAgYWRkICAgICBzcmMycSwgd3EKKyVlbmRpZgorICAgIGFkZCAgICAgZHN0cSwgd3EKKyAgICBuZWcgICAgIHdxCisgICAganogICAgICAlJS5lbmQKKyUlLmxvb3A6CislaWZpZG4gJTIsIGFkZAorICAgIG1vdiUxICAgbTAsIFtzcmNxK3dxXQorICAgIG1vdiUxICAgbTEsIFtkc3RxK3dxXQorICAgIG1vdiUxICAgbTIsIFtzcmNxK3dxK21tc2l6ZV0KKyAgICBtb3YlMSAgIG0zLCBbZHN0cSt3cSttbXNpemVdCislZWxzZQorICAgIG1vdiUxICAgbTAsIFtzcmMxcSt3cV0KKyAgICBtb3YlMSAgIG0xLCBbc3JjMnErd3FdCisgICAgbW92JTEgICBtMiwgW3NyYzFxK3dxK21tc2l6ZV0KKyAgICBtb3YlMSAgIG0zLCBbc3JjMnErd3ErbW1zaXplXQorJWVuZGlmCisgICAgcCUydyAgICBtMCwgbTEKKyAgICBwJTJ3ICAgIG0yLCBtMworICAgIHBhbmQgICAgbTAsIG00CisgICAgcGFuZCAgICBtMiwgbTQKKyAgICBtb3YlMSAgIFtkc3RxK3dxXSAgICAgICAsIG0wCisgICAgbW92JTEgICBbZHN0cSt3cSttbXNpemVdLCBtMgorICAgIGFkZCAgICAgd3EsIDIqbW1zaXplCisgICAgamwgJSUubG9vcAorJSUuZW5kOgorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teAorY2dsb2JhbCBhZGRfaW50MTYsIDQsNCw1LCBkc3QsIHNyYywgbWFzaywgdywgdG1wCisgICAgSU5UMTZfTE9PUCBhLCBhZGQKKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBhZGRfaW50MTYsIDQsNCw1LCBkc3QsIHNyYywgbWFzaywgdywgdG1wCisgICAgdGVzdCBzcmNxLCBtbXNpemUtMQorICAgIGpueiAudW5hbGlnbmVkCisgICAgdGVzdCBkc3RxLCBtbXNpemUtMQorICAgIGpueiAudW5hbGlnbmVkCisgICAgSU5UMTZfTE9PUCBhLCBhZGQKKy51bmFsaWduZWQ6CisgICAgSU5UMTZfTE9PUCB1LCBhZGQKKworSU5JVF9NTVggbW14CitjZ2xvYmFsIGRpZmZfaW50MTYsIDUsNSw1LCBkc3QsIHNyYzEsIHNyYzIsIG1hc2ssIHcsIHRtcAorICAgIElOVDE2X0xPT1AgYSwgc3ViCisKK0lOSVRfWE1NIHNzZTIKK2NnbG9iYWwgZGlmZl9pbnQxNiwgNSw1LDUsIGRzdCwgc3JjMSwgc3JjMiwgbWFzaywgdywgdG1wCisgICAgdGVzdCBzcmMxcSwgbW1zaXplLTEKKyAgICBqbnogLnVuYWxpZ25lZAorICAgIHRlc3Qgc3JjMnEsIG1tc2l6ZS0xCisgICAgam56IC51bmFsaWduZWQKKyAgICB0ZXN0IGRzdHEsIG1tc2l6ZS0xCisgICAgam56IC51bmFsaWduZWQKKyAgICBJTlQxNl9MT09QIGEsIHN1YgorLnVuYWxpZ25lZDoKKyAgICBJTlQxNl9MT09QIHUsIHN1YgorCisKKyVtYWNybyBBRERfSEZZVV9MRUZUX0xPT1BfSU5UMTYgMiA7ICUxID0gZHN0IGFsaWdubWVudCAoYS91KSwgJTIgPSBzcmMgYWxpZ25tZW50IChhL3UpCisgICAgYWRkICAgICB3ZCwgd2QKKyAgICBhZGQgICAgIHNyY3EsIHdxCisgICAgYWRkICAgICBkc3RxLCB3cQorICAgIG5lZyAgICAgd3EKKyUlLmxvb3A6CisgICAgbW92JTIgICBtMSwgW3NyY3Erd3FdCisgICAgbW92YSAgICBtMiwgbTEKKyAgICBwc2xsZCAgIG0xLCAxNgorICAgIHBhZGR3ICAgbTEsIG0yCisgICAgbW92YSAgICBtMiwgbTEKKworICAgIHBzaHVmYiAgbTEsIG0zCisgICAgcGFkZHcgICBtMSwgbTIKKyAgICBwc2h1ZmIgIG0wLCBtNQorJWlmIG1tc2l6ZSA9PSAxNgorICAgIG1vdmEgICAgbTIsIG0xCisgICAgcHNodWZiICBtMSwgbTQKKyAgICBwYWRkdyAgIG0xLCBtMgorJWVuZGlmCisgICAgcGFkZHcgICBtMCwgbTEKKyAgICBwYW5kICAgIG0wLCBtNworJWlmaWRuICUxLCBhCisgICAgbW92YSAgICBbZHN0cSt3cV0sIG0wCislZWxzZQorICAgIG1vdnEgICAgW2RzdHErd3FdLCBtMAorICAgIG1vdmhwcyAgW2RzdHErd3ErOF0sIG0wCislZW5kaWYKKyAgICBhZGQgICAgIHdxLCBtbXNpemUKKyAgICBqbCAlJS5sb29wCisgICAgbW92ICAgICBlYXgsIG1tc2l6ZS0xCisgICAgc3ViICAgICBlYXgsIHdkCisgICAgbW92ICAgICB3ZCwgZWF4CisgICAgc2hsICAgICB3ZCwgOAorICAgIGxlYSAgICAgZWF4LCBbd2QrZWF4LTFdCisgICAgbW92ZCAgICBtMSwgZWF4CisgICAgcHNodWZiICBtMCwgbTEKKyAgICBtb3ZkICAgIGVheCwgbTAKKyAgICBSRVQKKyVlbmRtYWNybworCis7IGludCBhZGRfaGZ5dV9sZWZ0X3ByZWRfaW50MTYodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgdW5zaWduZWQgbWFzaywgaW50IHcsIGludCBsZWZ0KQorSU5JVF9NTVggc3NzZTMKK2NnbG9iYWwgYWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2LCA0LDQsOCwgZHN0LCBzcmMsIG1hc2ssIHcsIGxlZnQKKy5za2lwX3Byb2xvZ3VlOgorICAgIG1vdmEgICAgbTUsIFtwYl82N10KKyAgICBtb3ZhICAgIG0zLCBbcGJfenp6ejIzMjN6enp6YWJhYl0KKyAgICBtb3ZkICAgIG0wLCBsZWZ0bQorICAgIHBzbGxxICAgbTAsIDQ4CisgICAgbW92ZCAgICBtNywgbWFza20KKyAgICBTUExBVFcgIG03ICxtNworICAgIEFERF9IRllVX0xFRlRfTE9PUF9JTlQxNiBhLCBhCisKK0lOSVRfWE1NIHNzZTQKK2NnbG9iYWwgYWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2LCA0LDQsOCwgZHN0LCBzcmMsIG1hc2ssIHcsIGxlZnQKKyAgICBtb3ZhICAgIG01LCBbcGJfZWZdCisgICAgbW92YSAgICBtNCwgW3BiX3p6enp6enp6Njc2NzY3NjddCisgICAgbW92YSAgICBtMywgW3BiX3p6enoyMzIzenp6emFiYWJdCisgICAgbW92ZCAgICBtMCwgbGVmdG0KKyAgICBwc2xsZHEgIG0wLCAxNAorICAgIG1vdmQgICAgbTcsIG1hc2ttCisgICAgU1BMQVRXICBtNyAsbTcKKyAgICB0ZXN0ICAgIHNyY3EsIDE1CisgICAgam56IC5zcmNfdW5hbGlnbmVkCisgICAgdGVzdCAgICBkc3RxLCAxNQorICAgIGpueiAuZHN0X3VuYWxpZ25lZAorICAgIEFERF9IRllVX0xFRlRfTE9PUF9JTlQxNiBhLCBhCisuZHN0X3VuYWxpZ25lZDoKKyAgICBBRERfSEZZVV9MRUZUX0xPT1BfSU5UMTYgdSwgYQorLnNyY191bmFsaWduZWQ6CisgICAgQUREX0hGWVVfTEVGVF9MT09QX0lOVDE2IHUsIHUKKworOyB2b2lkIGFkZF9oZnl1X21lZGlhbl9wcmVkaWN0aW9uX21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnRvcCwgY29uc3QgdWludDhfdCAqZGlmZiwgaW50IG1hc2ssIGludCB3LCBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgYWRkX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYsIDcsNywwLCBkc3QsIHRvcCwgZGlmZiwgbWFzaywgdywgbGVmdCwgbGVmdF90b3AKKyAgICBhZGQgICAgICB3ZCwgd2QKKyAgICBtb3ZkICAgIG1tNiwgbWFza2QKKyAgICBTUExBVFcgIG1tNiwgbW02CisgICAgbW92cSAgICBtbTAsIFt0b3BxXQorICAgIG1vdnEgICAgbW0yLCBtbTAKKyAgICBtb3ZkICAgIG1tNCwgW2xlZnRfdG9wcV0KKyAgICBwc2xscSAgIG1tMiwgMTYKKyAgICBtb3ZxICAgIG1tMSwgbW0wCisgICAgcG9yICAgICBtbTQsIG1tMgorICAgIG1vdmQgICAgbW0zLCBbbGVmdHFdCisgICAgcHN1YncgICBtbTAsIG1tNCA7IHQtdGwKKyAgICBhZGQgICAgZHN0cSwgd3EKKyAgICBhZGQgICAgdG9wcSwgd3EKKyAgICBhZGQgICBkaWZmcSwgd3EKKyAgICBuZWcgICAgICB3cQorICAgIGptcCAuc2tpcAorLmxvb3A6CisgICAgbW92cSAgICBtbTQsIFt0b3BxK3dxXQorICAgIG1vdnEgICAgbW0wLCBtbTQKKyAgICBwc2xscSAgIG1tNCwgMTYKKyAgICBwb3IgICAgIG1tNCwgbW0xCisgICAgbW92cSAgICBtbTEsIG1tMCA7IHQKKyAgICBwc3VidyAgIG1tMCwgbW00IDsgdC10bAorLnNraXA6CisgICAgbW92cSAgICBtbTIsIFtkaWZmcSt3cV0KKyVhc3NpZ24gaSAwCislcmVwIDQKKyAgICBtb3ZxICAgIG1tNCwgbW0wCisgICAgcGFkZHcgICBtbTQsIG1tMyA7IHQtdGwrbAorICAgIHBhbmQgICAgbW00LCBtbTYKKyAgICBtb3ZxICAgIG1tNSwgbW0zCisgICAgcG1heHN3ICBtbTMsIG1tMQorICAgIHBtaW5zdyAgbW01LCBtbTEKKyAgICBwbWluc3cgIG1tMywgbW00CisgICAgcG1heHN3ICBtbTMsIG1tNSA7IG1lZGlhbgorICAgIHBhZGR3ICAgbW0zLCBtbTIgOyArcmVzaWR1YWwKKyAgICBwYW5kICAgIG1tMywgbW02CislaWYgaT09MAorICAgIG1vdnEgICAgbW03LCBtbTMKKyAgICBwc2xscSAgIG1tNywgNDgKKyVlbHNlCisgICAgbW92cSAgICBtbTQsIG1tMworICAgIHBzcmxxICAgbW03LCAxNgorICAgIHBzbGxxICAgbW00LCA0OAorICAgIHBvciAgICAgbW03LCBtbTQKKyVlbmRpZgorJWlmIGk8MworICAgIHBzcmxxICAgbW0wLCAxNgorICAgIHBzcmxxICAgbW0xLCAxNgorICAgIHBzcmxxICAgbW0yLCAxNgorJWVuZGlmCislYXNzaWduIGkgaSsxCislZW5kcmVwCisgICAgbW92cSBbZHN0cSt3cV0sIG1tNworICAgIGFkZCAgICAgIHdxLCA4CisgICAgamwgLmxvb3AKKyAgICBtb3Z6eCAgIHIyZCwgd29yZCBbZHN0cS0yXQorICAgIG1vdiBbbGVmdHFdLCByMmQKKyAgICBtb3Z6eCAgIHIyZCwgd29yZCBbdG9wcS0yXQorICAgIG1vdiBbbGVmdF90b3BxXSwgcjJkCisgICAgUkVUCisKK2NnbG9iYWwgc3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYsIDcsNywwLCBkc3QsIHNyYzEsIHNyYzIsIG1hc2ssIHcsIGxlZnQsIGxlZnRfdG9wCisgICAgYWRkICAgICAgd2QsIHdkCisgICAgbW92ZCAgICBtbTcsIG1hc2tkCisgICAgU1BMQVRXICBtbTcsIG1tNworICAgIG1vdnEgICAgbW0wLCBbc3JjMXFdCisgICAgbW92cSAgICBtbTIsIFtzcmMycV0KKyAgICBwc2xscSAgIG1tMCwgMTYKKyAgICBwc2xscSAgIG1tMiwgMTYKKyAgICBtb3ZkICAgIG1tNiwgW2xlZnRfdG9wcV0KKyAgICBwb3IgICAgIG1tMCwgbW02CisgICAgbW92ZCAgICBtbTYsIFtsZWZ0cV0KKyAgICBwb3IgICAgIG1tMiwgbW02CisgICAgeG9yICAgICBtYXNrcSwgbWFza3EKKy5sb29wOgorICAgIG1vdnEgICAgbW0xLCBbc3JjMXEgKyBtYXNrcV0KKyAgICBtb3ZxICAgIG1tMywgW3NyYzJxICsgbWFza3FdCisgICAgbW92cSAgICBtbTQsIG1tMgorICAgIHBzdWJ3ICAgbW0yLCBtbTAKKyAgICBwYWRkdyAgIG1tMiwgbW0xCisgICAgcGFuZCAgICBtbTIsIG1tNworICAgIG1vdnEgICAgbW01LCBtbTQKKyAgICBwbWF4c3cgIG1tNCwgbW0xCisgICAgcG1pbnN3ICBtbTEsIG1tNQorICAgIHBtaW5zdyAgbW00LCBtbTIKKyAgICBwbWF4c3cgIG1tNCwgbW0xCisgICAgcHN1YncgICBtbTMsIG1tNAorICAgIHBhbmQgICAgbW0zLCBtbTcKKyAgICBtb3ZxICAgIFtkc3RxICsgbWFza3FdLCBtbTMKKyAgICBhZGQgICAgIG1hc2txLCA4CisgICAgbW92cSAgICBtbTAsIFtzcmMxcSArIG1hc2txIC0gMl0KKyAgICBtb3ZxICAgIG1tMiwgW3NyYzJxICsgbWFza3EgLSAyXQorICAgIGNtcCAgICAgbWFza3EsIHdxCisgICAgICAgIGpiIC5sb29wCisgICAgbW92enggbWFza2QsIHdvcmQgW3NyYzFxICsgd3EgLSAyXQorICAgIG1vdiBbbGVmdF90b3BxXSwgbWFza2QKKyAgICBtb3Z6eCBtYXNrZCwgd29yZCBbc3JjMnEgKyB3cSAtIDJdCisgICAgbW92IFtsZWZ0cV0sIG1hc2tkCisgICAgUkVUCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvbG9zc2xlc3NfdmlkZW9kc3BfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2xvc3NsZXNzX3ZpZGVvZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTg5MDI0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2xvc3NsZXNzX3ZpZGVvZHNwX2luaXQuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogTG9zc2xlc3MgdmlkZW8gRFNQIHV0aWxzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICIuLi9sb3NzbGVzc192aWRlb2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKwordm9pZCBmZl9hZGRfaW50MTZfbW14KHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMsIHVuc2lnbmVkIG1hc2ssIGludCB3KTsKK3ZvaWQgZmZfYWRkX2ludDE2X3NzZTIodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgdW5zaWduZWQgbWFzaywgaW50IHcpOwordm9pZCBmZl9kaWZmX2ludDE2X21teCAodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYzEsIGNvbnN0IHVpbnQxNl90ICpzcmMyLCB1bnNpZ25lZCBtYXNrLCBpbnQgdyk7Cit2b2lkIGZmX2RpZmZfaW50MTZfc3NlMih1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsIHVuc2lnbmVkIG1hc2ssIGludCB3KTsKK2ludCBmZl9hZGRfaGZ5dV9sZWZ0X3ByZWRfaW50MTZfc3NzZTModWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgdW5zaWduZWQgbWFzaywgaW50IHcsIHVuc2lnbmVkIGFjYyk7CitpbnQgZmZfYWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2X3NzZTQodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgdW5zaWduZWQgbWFzaywgaW50IHcsIHVuc2lnbmVkIGFjYyk7Cit2b2lkIGZmX2FkZF9oZnl1X21lZGlhbl9wcmVkX2ludDE2X21teGV4dCh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqdG9wLCBjb25zdCB1aW50MTZfdCAqZGlmZiwgdW5zaWduZWQgbWFzaywgaW50IHcsIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCk7Cit2b2lkIGZmX3N1Yl9oZnl1X21lZGlhbl9wcmVkX2ludDE2X21teGV4dCh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsIHVuc2lnbmVkIG1hc2ssIGludCB3LCBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApOworCisKK3ZvaWQgZmZfbGx2aWRkc3BfaW5pdF94ODYoTExWaWREU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCk7CisKKyAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YWRkX2ludDE2ID0gZmZfYWRkX2ludDE2X21teDsKKyAgICAgICAgYy0+ZGlmZl9pbnQxNiA9IGZmX2RpZmZfaW50MTZfbW14OworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSAmJiBwaXhfZGVzYy0+Y29tcFswXS5kZXB0aF9taW51czE8MTUpIHsKKyAgICAgICAgYy0+YWRkX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYgPSBmZl9hZGRfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNl9tbXhleHQ7CisgICAgICAgIGMtPnN1Yl9oZnl1X21lZGlhbl9wcmVkX2ludDE2ID0gZmZfc3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTZfbW14ZXh0OworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YWRkX2ludDE2ID0gZmZfYWRkX2ludDE2X3NzZTI7CisgICAgICAgIGMtPmRpZmZfaW50MTYgPSBmZl9kaWZmX2ludDE2X3NzZTI7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2ID0gZmZfYWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2X3Nzc2UzOworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU0U0KGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2ID0gZmZfYWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2X3NzZTQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2xwYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L2xwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTQ5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbHBjLmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBTSU1ELW9wdGltaXplZCBMUEMgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTG9yZW4gTWVycml0dAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2xwYy5oIgorCitERUNMQVJFX0FTTV9DT05TVCgxNiwgZG91YmxlLCBwZF8xKVsyXSA9IHsgMS4wLCAxLjAgfTsKK0RFQ0xBUkVfQVNNX0NPTlNUKDE2LCBkb3VibGUsIHBkXzIpWzJdID0geyAyLjAsIDIuMCB9OworCisjaWYgSEFWRV9TU0UyX0lOTElORQorCitzdGF0aWMgdm9pZCBscGNfYXBwbHlfd2VsY2hfd2luZG93X3NzZTIoY29uc3QgaW50MzJfdCAqZGF0YSwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKndfZGF0YSkKK3sKKyAgICBkb3VibGUgYyA9IDIuMCAvIChsZW4tMS4wKTsKKyAgICBpbnQgbjIgPSBsZW4+PjE7CisgICAgeDg2X3JlZyBpID0gLW4yKnNpemVvZihpbnQzMl90KTsKKyAgICB4ODZfcmVnIGogPSAgbjIqc2l6ZW9mKGludDMyX3QpOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZzZCAgICU0LCAgICAgJSV4bW03ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZhcGQgICJNQU5HTEUocGRfMSkiLCAlJXhtbTYgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZhcGQgICJNQU5HTEUocGRfMikiLCAlJXhtbTUgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZsaHBzICUleG1tNywgJSV4bW03ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWJwZCAgICUleG1tNSwgJSV4bW03ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRzZCAgICUleG1tNiwgJSV4bW03ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ0ZXN0ICAgICQxLCAgICAgJTUgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJqeiAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZGVmaW5lIFdFTENIKE1PVlBELCBvZmZzZXQpXAorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmFwZCAgICUleG1tNywgICUleG1tMSAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtdWxwZCAgICAlJXhtbTEsICAlJXhtbTEgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92YXBkICAgJSV4bW02LCAgJSV4bW0wICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInN1YnBkICAgICUleG1tMSwgICUleG1tMCAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc2h1ZmQgICAkMHg0ZSwgICAlJXhtbTAsICUleG1tMSAgICAgIFxuXHQiXAorICAgICAgICAiY3Z0cGkycGQgKCUzLCUwKSwgJSV4bW0yICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImN2dHBpMnBkICIjb2Zmc2V0Iio0KCUzLCUxKSwgJSV4bW0zICAgXG5cdCJcCisgICAgICAgICJtdWxwZCAgICAlJXhtbTAsICAlJXhtbTIgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibXVscGQgICAgJSV4bW0xLCAgJSV4bW0zICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmFwZCAgICUleG1tMiwgKCUyLCUwLDIpICAgICAgICAgICAgXG5cdCJcCisgICAgICAgIE1PVlBEIiAgICAlJXhtbTMsICIjb2Zmc2V0Iio4KCUyLCUxLDIpIFxuXHQiXAorICAgICAgICAic3VicGQgICAgJSV4bW01LCAgJSV4bW03ICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInN1YiAgICAgICQ4LCAgICAgICUxICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJhZGQgICAgICAkOCwgICAgICAlMCAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiamwgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKworICAgICAgICBXRUxDSCgibW92dXBkIiwgLTEpCisgICAgICAgICJqbXAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFdFTENIKCJtb3ZhcGQiLCAtMikKKyAgICAgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiIrJnIiKGkpLCAiKyZyIihqKQorICAgICAgICA6InIiKHdfZGF0YStuMiksICJyIihkYXRhK24yKSwgIm0iKGMpLCAiciIobGVuKQorICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQVJSQVlfQUREKHBkXzEscGRfMikKKyAgICAgICAgIFhNTV9DTE9CQkVSU19PTkxZKCIleG1tMCIsICIleG1tMSIsICIleG1tMiIsICIleG1tMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXhtbTUiLCAiJXhtbTYiLCAiJXhtbTciKQorICAgICk7CisjdW5kZWYgV0VMQ0gKK30KKworc3RhdGljIHZvaWQgbHBjX2NvbXB1dGVfYXV0b2NvcnJfc3NlMihjb25zdCBkb3VibGUgKmRhdGEsIGludCBsZW4sIGludCBsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqYXV0b2MpCit7CisgICAgaW50IGo7CisKKyAgICBpZigoeDg2X3JlZylkYXRhICYgMTUpCisgICAgICAgIGRhdGErKzsKKworICAgIGZvcihqPTA7IGo8bGFnOyBqKz0yKXsKKyAgICAgICAgeDg2X3JlZyBpID0gLWxlbipzaXplb2YoZG91YmxlKTsKKyAgICAgICAgaWYoaiA9PSBsYWctMikgeworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibW92c2QgICAgIk1BTkdMRShwZF8xKSIsICUleG1tMCAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZzZCAgICAiTUFOR0xFKHBkXzEpIiwgJSV4bW0xICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnNkICAgICJNQU5HTEUocGRfMSkiLCAlJXhtbTIgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZhcGQgICAoJTIsJTApLCAlJXhtbTMgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnVwZCAtOCglMywlMCksICUleG1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92YXBkICAgKCUzLCUwKSwgJSV4bW01ICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtdWxwZCAgICAgJSV4bW0zLCAlJXhtbTQgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bHBkICAgICAlJXhtbTMsICUleG1tNSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVscGQgLTE2KCUzLCUwKSwgJSV4bW0zICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRwZCAgICAgJSV4bW00LCAlJXhtbTEgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHBkICAgICAlJXhtbTUsICUleG1tMCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkcGQgICAgICUleG1tMywgJSV4bW0yICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQgICAgICAgJDE2LCAgICAlMCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImpsIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92aGxwcyAgICUleG1tMCwgJSV4bW0zICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZobHBzICAgJSV4bW0xLCAlJXhtbTQgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmhscHMgICAlJXhtbTIsICUleG1tNSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkc2QgICAgICUleG1tMywgJSV4bW0wICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRzZCAgICAgJSV4bW00LCAlJXhtbTEgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHNkICAgICAlJXhtbTUsICUleG1tMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92c2QgICAgICUleG1tMCwgICAoJTEpICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZzZCAgICAgJSV4bW0xLCAgOCglMSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnNkICAgICAlJXhtbTIsIDE2KCUxKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6IismciIoaSkKKyAgICAgICAgICAgICAgICA6InIiKGF1dG9jK2opLCAiciIoZGF0YStsZW4pLCAiciIoZGF0YStsZW4taikKKyAgICAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQVJSQVlfQUREKHBkXzEpCisgICAgICAgICAgICAgICAgOiJtZW1vcnkiCisgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibW92c2QgICAgIk1BTkdMRShwZF8xKSIsICUleG1tMCAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZzZCAgICAiTUFOR0xFKHBkXzEpIiwgJSV4bW0xICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92YXBkICAgKCUzLCUwKSwgJSV4bW0zICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3Z1cGQgLTgoJTQsJTApLCAlJXhtbTQgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm11bHBkICAgICAlJXhtbTMsICUleG1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibXVscGQgICAgKCU0LCUwKSwgJSV4bW0zICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRwZCAgICAgJSV4bW00LCAlJXhtbTEgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHBkICAgICAlJXhtbTMsICUleG1tMCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkICAgICAgICQxNiwgICAgJTAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJqbCAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmhscHMgICAlJXhtbTAsICUleG1tMyAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92aGxwcyAgICUleG1tMSwgJSV4bW00ICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGRzZCAgICAgJSV4bW0zLCAlJXhtbTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZHNkICAgICAlJXhtbTQsICUleG1tMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92c2QgICAgICUleG1tMCwgJTEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZzZCAgICAgJSV4bW0xLCAlMiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOiIrJnIiKGkpLCAiPW0iKGF1dG9jW2pdKSwgIj1tIihhdXRvY1tqKzFdKQorICAgICAgICAgICAgICAgIDoiciIoZGF0YStsZW4pLCAiciIoZGF0YStsZW4taikKKyAgICAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQVJSQVlfQUREKHBkXzEpCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYgLyogSEFWRV9TU0UyX0lOTElORSAqLworCithdl9jb2xkIHZvaWQgZmZfbHBjX2luaXRfeDg2KExQQ0NvbnRleHQgKmMpCit7CisjaWYgSEFWRV9TU0UyX0lOTElORQorICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoSEFWRV9TU0UyX0lOTElORSAmJiBjcHVfZmxhZ3MgJiAoQVZfQ1BVX0ZMQUdfU1NFMiB8IEFWX0NQVV9GTEFHX1NTRTJTTE9XKSkgeworICAgICAgICBjLT5scGNfYXBwbHlfd2VsY2hfd2luZG93ID0gbHBjX2FwcGx5X3dlbGNoX3dpbmRvd19zc2UyOworICAgICAgICBjLT5scGNfY29tcHV0ZV9hdXRvY29yciAgID0gbHBjX2NvbXB1dGVfYXV0b2NvcnJfc3NlMjsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9TU0UyX0lOTElORSAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21hdGhvcHMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tYXRob3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjYTA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tYXRob3BzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBzaW1wbGUgbWF0aCBvcGVyYXRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4gZXQgYWwKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1g4Nl9NQVRIT1BTX0gKKyNkZWZpbmUgQVZDT0RFQ19YODZfTUFUSE9QU19ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKworI2lmIEhBVkVfSU5MSU5FX0FTTQorCisjaWYgQVJDSF9YODZfMzIKKworI2RlZmluZSBNVUxMIE1VTEwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IGludCBNVUxMKGludCBhLCBpbnQgYiwgdW5zaWduZWQgc2hpZnQpCit7CisgICAgaW50IHJ0LCBkdW1teTsKKyAgICBfX2FzbV9fICgKKyAgICAgICAgImltdWxsICUzICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmRsICU0LCAlJWVkeCwgJSVlYXggXG5cdCIKKyAgICAgICAgOiI9YSIocnQpLCAiPWQiKGR1bW15KQorICAgICAgICA6ImEiKGEpLCAicm0iKGIpLCAiY2kiKCh1aW50OF90KXNoaWZ0KQorICAgICk7CisgICAgcmV0dXJuIHJ0OworfQorCisjZGVmaW5lIE1VTEggTVVMSAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IE1VTEgoaW50IGEsIGludCBiKQoreworICAgIGludCBydCwgZHVtbXk7CisgICAgX19hc21fXyAoCisgICAgICAgICJpbXVsbCAlMyIKKyAgICAgICAgOiI9ZCIocnQpLCAiPWEiKGR1bW15KQorICAgICAgICA6ImEiKGEpLCAicm0iKGIpCisgICAgKTsKKyAgICByZXR1cm4gcnQ7Cit9CisKKyNkZWZpbmUgTVVMNjQgTVVMNjQKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IGludDY0X3QgTVVMNjQoaW50IGEsIGludCBiKQoreworICAgIGludDY0X3QgcnQ7CisgICAgX19hc21fXyAoCisgICAgICAgICJpbXVsbCAlMiIKKyAgICAgICAgOiI9QSIocnQpCisgICAgICAgIDoiYSIoYSksICJybSIoYikKKyAgICApOworICAgIHJldHVybiBydDsKK30KKworI2VuZGlmIC8qIEFSQ0hfWDg2XzMyICovCisKKyNpZiBIQVZFX0k2ODYKKy8qIG1lZGlhbiBvZiAzICovCisjZGVmaW5lIG1pZF9wcmVkIG1pZF9wcmVkCitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IGludCBtaWRfcHJlZChpbnQgYSwgaW50IGIsIGludCBjKQoreworICAgIGludCBpPWI7CisgICAgX19hc21fXyAoCisgICAgICAgICJjbXAgICAgJTIsICUxIFxuXHQiCisgICAgICAgICJjbW92ZyAgJTEsICUwIFxuXHQiCisgICAgICAgICJjbW92ZyAgJTIsICUxIFxuXHQiCisgICAgICAgICJjbXAgICAgJTMsICUxIFxuXHQiCisgICAgICAgICJjbW92bCAgJTMsICUxIFxuXHQiCisgICAgICAgICJjbXAgICAgJTEsICUwIFxuXHQiCisgICAgICAgICJjbW92ZyAgJTEsICUwIFxuXHQiCisgICAgICAgIDoiKyZyIihpKSwgIismciIoYSkKKyAgICAgICAgOiJyIihiKSwgInIiKGMpCisgICAgKTsKKyAgICByZXR1cm4gaTsKK30KKworI2lmIEhBVkVfNlJFR1MKKyNkZWZpbmUgQ09QWTNfSUZfTFQoeCwgeSwgYSwgYiwgYywgZClcCitfX2FzbV9fIHZvbGF0aWxlKFwKKyAgICAiY21wbCAgJTAsICUzICAgICAgIFxuXHQiXAorICAgICJjbW92bCAlMywgJTAgICAgICAgXG5cdCJcCisgICAgImNtb3ZsICU0LCAlMSAgICAgICBcblx0IlwKKyAgICAiY21vdmwgJTUsICUyICAgICAgIFxuXHQiXAorICAgIDogIismciIgKHgpLCAiKyZyIiAoYSksICIrciIgKGMpXAorICAgIDogInIiICh5KSwgInIiIChiKSwgInIiIChkKVwKKyk7CisjZW5kaWYgLyogSEFWRV82UkVHUyAqLworI2VuZGlmIC8qIEhBVkVfSTY4NiAqLworCisjZGVmaW5lIE1BU0tfQUJTKG1hc2ssIGxldmVsKSAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyAoImNkcSAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgICAgICAgICAgInhvcmwgJTEsICUwICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgICAgICAgICAgInN1YmwgJTEsICUwICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgICAgICAgICAgOiAiK2EiKGxldmVsKSwgIj0mZCIobWFzaykpCisKKy8vIGF2b2lkICszMiBmb3Igc2hpZnQgb3B0aW1pemF0aW9uIChnY2Mgc2hvdWxkIGRvIHRoYXQgLi4uKQorI2RlZmluZSBORUdfU1NSMzIgTkVHX1NTUjMyCitzdGF0aWMgaW5saW5lICBpbnQzMl90IE5FR19TU1IzMiggaW50MzJfdCBhLCBpbnQ4X3Qgcyl7CisgICAgX19hc21fXyAoInNhcmwgJTEsICUwXG5cdCIKKyAgICAgICAgIDogIityIiAoYSkKKyAgICAgICAgIDogImljIiAoKHVpbnQ4X3QpKC1zKSkKKyAgICApOworICAgIHJldHVybiBhOworfQorCisjZGVmaW5lIE5FR19VU1IzMiBORUdfVVNSMzIKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTkVHX1VTUjMyKHVpbnQzMl90IGEsIGludDhfdCBzKXsKKyAgICBfX2FzbV9fICgic2hybCAlMSwgJTBcblx0IgorICAgICAgICAgOiAiK3IiIChhKQorICAgICAgICAgOiAiaWMiICgodWludDhfdCkoLXMpKQorICAgICk7CisgICAgcmV0dXJuIGE7Cit9CisKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKyNlbmRpZiAvKiBBVkNPREVDX1g4Nl9NQVRIT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tZV9jbXAuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21lX2NtcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2MGRjMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tZV9jbXAuYXNtCkBAIC0wLDAgKzEsOTM0IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIFNJTUQtb3B0aW1pemVkIG1vdGlvbiBjb21wZW5zYXRpb24gZXN0aW1hdGlvbgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCis7KiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworY2V4dGVybiBwYl8xCitjZXh0ZXJuIHBiXzgwCisKK1NFQ1RJT04gLnRleHQKKworJW1hY3JvIERJRkZfUElYRUxTXzEgNAorICAgIG1vdmggICAgICAgICAgICAlMSwgJTMKKyAgICBtb3ZoICAgICAgICAgICAgJTIsICU0CisgICAgcHVucGNrbGJ3ICAgICAgICUyLCAlMQorICAgIHB1bnBja2xidyAgICAgICAlMSwgJTEKKyAgICBwc3VidyAgICAgICAgICAgJTEsICUyCislZW5kbWFjcm8KKworOyAlMT11aW50OF90ICpwaXgxLCAlMj11aW50OF90ICpwaXgyLCAlMz1zdGF0aWMgb2Zmc2V0LCAlND1zdHJpZGUsICU1PXN0cmlkZSozCis7ICU2PXRlbXBvcmFyeSBzdG9yYWdlIGxvY2F0aW9uCis7IHRoaXMgbWFjcm8gcmVxdWlyZXMgJG1tc2l6ZSBzdGFjayBzcGFjZSAoYWxpZ25lZCkgb24gJTYgKGV4Y2VwdCBvbiBTU0UreDg2LTY0KQorJW1hY3JvIERJRkZfUElYRUxTXzggNgorICAgIERJRkZfUElYRUxTXzEgICBtMCwgbTcsIFslMSAgICAgKyUzXSwgWyUyICAgICArJTNdCisgICAgRElGRl9QSVhFTFNfMSAgIG0xLCBtNywgWyUxKyU0ICArJTNdLCBbJTIrJTQgICslM10KKyAgICBESUZGX1BJWEVMU18xICAgbTIsIG03LCBbJTErJTQqMislM10sIFslMislNCoyKyUzXQorICAgIGFkZCAgICAgICAgICAgICAlMSwgJTUKKyAgICBhZGQgICAgICAgICAgICAgJTIsICU1CisgICAgRElGRl9QSVhFTFNfMSAgIG0zLCBtNywgWyUxICAgICArJTNdLCBbJTIgICAgICslM10KKyAgICBESUZGX1BJWEVMU18xICAgbTQsIG03LCBbJTErJTQgICslM10sIFslMislNCAgKyUzXQorICAgIERJRkZfUElYRUxTXzEgICBtNSwgbTcsIFslMSslNCoyKyUzXSwgWyUyKyU0KjIrJTNdCisgICAgRElGRl9QSVhFTFNfMSAgIG02LCBtNywgWyUxKyU1ICArJTNdLCBbJTIrJTUgICslM10KKyVpZmRlZiBtOAorICAgIERJRkZfUElYRUxTXzEgICBtNywgbTgsIFslMSslNCo0KyUzXSwgWyUyKyU0KjQrJTNdCislZWxzZQorICAgIG1vdmEgICAgICAgICAgWyU2XSwgbTAKKyAgICBESUZGX1BJWEVMU18xICAgbTcsIG0wLCBbJTErJTQqNCslM10sIFslMislNCo0KyUzXQorICAgIG1vdmEgICAgICAgICAgICBtMCwgWyU2XQorJWVuZGlmCisgICAgc3ViICAgICAgICAgICAgICUxLCAlNQorICAgIHN1YiAgICAgICAgICAgICAlMiwgJTUKKyVlbmRtYWNybworCislbWFjcm8gSEFEQU1BUkQ4IDAKKyAgICBTVU1TVUJfQkFEQyAgICAgICB3LCAwLCAxLCAyLCAzCisgICAgU1VNU1VCX0JBREMgICAgICAgdywgNCwgNSwgNiwgNworICAgIFNVTVNVQl9CQURDICAgICAgIHcsIDAsIDIsIDEsIDMKKyAgICBTVU1TVUJfQkFEQyAgICAgICB3LCA0LCA2LCA1LCA3CisgICAgU1VNU1VCX0JBREMgICAgICAgdywgMCwgNCwgMSwgNQorICAgIFNVTVNVQl9CQURDICAgICAgIHcsIDIsIDYsIDMsIDcKKyVlbmRtYWNybworCislbWFjcm8gQUJTMV9TVU0gMworICAgIEFCUzEgICAgICAgICAgICAlMSwgJTIKKyAgICBwYWRkdXN3ICAgICAgICAgJTMsICUxCislZW5kbWFjcm8KKworJW1hY3JvIEFCUzJfU1VNIDYKKyAgICBBQlMyICAgICAgICAgICAgJTEsICUyLCAlMywgJTQKKyAgICBwYWRkdXN3ICAgICAgICAgJTUsICUxCisgICAgcGFkZHVzdyAgICAgICAgICU2LCAlMgorJWVuZG1hY3JvCisKKyVtYWNybyBBQlNfU1VNXzh4OF82NCAxCisgICAgQUJTMiAgICAgICAgICAgIG0wLCBtMSwgbTgsIG05CisgICAgQUJTMl9TVU0gICAgICAgIG0yLCBtMywgbTgsIG05LCBtMCwgbTEKKyAgICBBQlMyX1NVTSAgICAgICAgbTQsIG01LCBtOCwgbTksIG0wLCBtMQorICAgIEFCUzJfU1VNICAgICAgICBtNiwgbTcsIG04LCBtOSwgbTAsIG0xCisgICAgcGFkZHVzdyAgICAgICAgIG0wLCBtMQorJWVuZG1hY3JvCisKKyVtYWNybyBBQlNfU1VNXzh4OF8zMiAxCisgICAgbW92YSAgICAgICAgICBbJTFdLCBtNworICAgIEFCUzEgICAgICAgICAgICBtMCwgbTcKKyAgICBBQlMxICAgICAgICAgICAgbTEsIG03CisgICAgQUJTMV9TVU0gICAgICAgIG0yLCBtNywgbTAKKyAgICBBQlMxX1NVTSAgICAgICAgbTMsIG03LCBtMQorICAgIEFCUzFfU1VNICAgICAgICBtNCwgbTcsIG0wCisgICAgQUJTMV9TVU0gICAgICAgIG01LCBtNywgbTEKKyAgICBBQlMxX1NVTSAgICAgICAgbTYsIG03LCBtMAorICAgIG1vdmEgICAgICAgICAgICBtMiwgWyUxXQorICAgIEFCUzFfU1VNICAgICAgICBtMiwgbTcsIG0xCisgICAgcGFkZHVzdyAgICAgICAgIG0wLCBtMQorJWVuZG1hY3JvCisKKzsgRklYTUU6IEhTVU0gc2F0dXJhdGVzIGF0IDY0aywgd2hpbGUgYW4gOHg4IGhhZGFtYXJkIG9yIGRjdCBibG9jayBjYW4gZ2V0IHVwIHRvCis7IGFib3V0IDEwMGsgb24gZXh0cmVtZSBpbnB1dHMuIEJ1dCB0aGF0J3MgdmVyeSB1bmxpa2VseSB0byBvY2N1ciBpbiBuYXR1cmFsIHZpZGVvLAorOyBhbmQgaXQncyBldmVuIG1vcmUgdW5saWtlbHkgdG8gbm90IGhhdmUgYW55IGFsdGVybmF0aXZlIG12cy9tb2RlcyB3aXRoIGxvd2VyIGNvc3QuCislbWFjcm8gSFNVTSAzCislaWYgY3B1ZmxhZyhzc2UyKQorICAgIG1vdmhscHMgICAgICAgICAlMiwgJTEKKyAgICBwYWRkdXN3ICAgICAgICAgJTEsICUyCisgICAgcHNodWZsdyAgICAgICAgICUyLCAlMSwgMHhFCisgICAgcGFkZHVzdyAgICAgICAgICUxLCAlMgorICAgIHBzaHVmbHcgICAgICAgICAlMiwgJTEsIDB4MQorICAgIHBhZGR1c3cgICAgICAgICAlMSwgJTIKKyAgICBtb3ZkICAgICAgICAgICAgJTMsICUxCislZWxpZiBjcHVmbGFnKG1teGV4dCkKKyAgICBwc2h1ZncgICAgICAgICAgJTIsICUxLCAweEUKKyAgICBwYWRkdXN3ICAgICAgICAgJTEsICUyCisgICAgcHNodWZ3ICAgICAgICAgICUyLCAlMSwgMHgxCisgICAgcGFkZHVzdyAgICAgICAgICUxLCAlMgorICAgIG1vdmQgICAgICAgICAgICAlMywgJTEKKyVlbGlmIGNwdWZsYWcobW14KQorICAgIG1vdmEgICAgICAgICAgICAlMiwgJTEKKyAgICBwc3JscSAgICAgICAgICAgJTEsIDMyCisgICAgcGFkZHVzdyAgICAgICAgICUxLCAlMgorICAgIG1vdmEgICAgICAgICAgICAlMiwgJTEKKyAgICBwc3JscSAgICAgICAgICAgJTEsIDE2CisgICAgcGFkZHVzdyAgICAgICAgICUxLCAlMgorICAgIG1vdmQgICAgICAgICAgICAlMywgJTEKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBTVE9SRTQgNQorICAgIG1vdmEgWyUxK21tc2l6ZSowXSwgJTIKKyAgICBtb3ZhIFslMSttbXNpemUqMV0sICUzCisgICAgbW92YSBbJTErbW1zaXplKjJdLCAlNAorICAgIG1vdmEgWyUxK21tc2l6ZSozXSwgJTUKKyVlbmRtYWNybworCislbWFjcm8gTE9BRDQgNQorICAgIG1vdmEgICAgICAgICAgICAlMiwgWyUxK21tc2l6ZSowXQorICAgIG1vdmEgICAgICAgICAgICAlMywgWyUxK21tc2l6ZSoxXQorICAgIG1vdmEgICAgICAgICAgICAlNCwgWyUxK21tc2l6ZSoyXQorICAgIG1vdmEgICAgICAgICAgICAlNSwgWyUxK21tc2l6ZSozXQorJWVuZG1hY3JvCisKKyVtYWNybyBoYWRhbWFyZDhfMTZfd3JhcHBlciAyCitjZ2xvYmFsIGhhZGFtYXJkOF9kaWZmLCA0LCA0LCAlMQorJWlmbmRlZiBtOAorICAgICVhc3NpZ24gcGFkICUyKm1tc2l6ZS0oNCtzdGFja19vZmZzZXQmKG1tc2l6ZS0xKSkKKyAgICBTVUIgICAgICAgICAgICByc3AsIHBhZAorJWVuZGlmCisgICAgY2FsbCBoYWRhbWFyZDh4OF9kaWZmICUrIFNVRkZJWAorJWlmbmRlZiBtOAorICAgIEFERCAgICAgICAgICAgIHJzcCwgcGFkCislZW5kaWYKKyAgICBSRVQKKworY2dsb2JhbCBoYWRhbWFyZDhfZGlmZjE2LCA1LCA2LCAlMQorJWlmbmRlZiBtOAorICAgICVhc3NpZ24gcGFkICUyKm1tc2l6ZS0oNCtzdGFja19vZmZzZXQmKG1tc2l6ZS0xKSkKKyAgICBTVUIgICAgICAgICAgICByc3AsIHBhZAorJWVuZGlmCisKKyAgICBjYWxsIGhhZGFtYXJkOHg4X2RpZmYgJSsgU1VGRklYCisgICAgbW92ICAgICAgICAgICAgcjVkLCBlYXgKKworICAgIGFkZCAgICAgICAgICAgICByMSwgOAorICAgIGFkZCAgICAgICAgICAgICByMiwgOAorICAgIGNhbGwgaGFkYW1hcmQ4eDhfZGlmZiAlKyBTVUZGSVgKKyAgICBhZGQgICAgICAgICAgICByNWQsIGVheAorCisgICAgY21wICAgICAgICAgICAgcjRkLCAxNgorICAgIGpuZSAuZG9uZQorCisgICAgbGVhICAgICAgICAgICAgIHIxLCBbcjErcjMqOC04XQorICAgIGxlYSAgICAgICAgICAgICByMiwgW3IyK3IzKjgtOF0KKyAgICBjYWxsIGhhZGFtYXJkOHg4X2RpZmYgJSsgU1VGRklYCisgICAgYWRkICAgICAgICAgICAgcjVkLCBlYXgKKworICAgIGFkZCAgICAgICAgICAgICByMSwgOAorICAgIGFkZCAgICAgICAgICAgICByMiwgOAorICAgIGNhbGwgaGFkYW1hcmQ4eDhfZGlmZiAlKyBTVUZGSVgKKyAgICBhZGQgICAgICAgICAgICByNWQsIGVheAorCisuZG9uZToKKyAgICBtb3YgICAgICAgICAgICBlYXgsIHI1ZAorJWlmbmRlZiBtOAorICAgIEFERCAgICAgICAgICAgIHJzcCwgcGFkCislZW5kaWYKKyAgICBSRVQKKyVlbmRtYWNybworCislbWFjcm8gSEFEQU1BUkQ4X0RJRkYgMC0xCislaWYgY3B1ZmxhZyhzc2UyKQoraGFkYW1hcmQ4eDhfZGlmZiAlKyBTVUZGSVg6CisgICAgbGVhICAgICAgICAgICAgICAgICAgICAgICAgICByMCwgW3IzKjNdCisgICAgRElGRl9QSVhFTFNfOCAgICAgICAgICAgICAgICByMSwgcjIsICAwLCByMywgcjAsIHJzcCtncHJzaXplCisgICAgSEFEQU1BUkQ4CislaWYgQVJDSF9YODZfNjQKKyAgICBUUkFOU1BPU0U4eDhXICAgICAgICAgICAgICAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgKKyVlbHNlCisgICAgVFJBTlNQT1NFOHg4VyAgICAgICAgICAgICAgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsIFtyc3ArZ3Byc2l6ZV0sIFtyc3ArbW1zaXplK2dwcnNpemVdCislZW5kaWYKKyAgICBIQURBTUFSRDgKKyAgICBBQlNfU1VNXzh4OCAgICAgICAgIHJzcCtncHJzaXplCisgICAgSFNVTSAgICAgICAgICAgICAgICAgICAgICAgIG0wLCBtMSwgZWF4CisgICAgYW5kICAgICAgICAgICAgICAgICAgICAgICAgIGVheCwgMHhGRkZGCisgICAgcmV0CisKK2hhZGFtYXJkOF8xNl93cmFwcGVyICUxLCAzCislZWxpZiBjcHVmbGFnKG1teCkKK0FMSUdOIDE2Cis7IGludCBmZl9oYWRhbWFyZDhfZGlmZl8gIyMgY3B1KE1wZWdFbmNDb250ZXh0ICpzLCB1aW50OF90ICpzcmMxLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKKzsgcjAgPSB2b2lkICpzID0gdW51c2VkLCBpbnQgaCA9IHVudXNlZCAoYWx3YXlzIDgpCis7IG5vdGUgaG93IHIxLCByMiBhbmQgcjMgYXJlIG5vdCBjbG9iYmVyZWQgaW4gdGhpcyBmdW5jdGlvbiwgc28gMTZ4MTYKKzsgY2FuIHNpbXBseSBjYWxsIHRoaXMgMngyeCAoYW5kIHRoYXQncyB3aHkgd2UgYWNjZXNzIHJzcCtncHJzaXplCis7IGV2ZXJ5d2hlcmUsIHdoaWNoIGlzIHJzcCBvZiBjYWxsaW5nIGZ1bmMKK2hhZGFtYXJkOHg4X2RpZmYgJSsgU1VGRklYOgorICAgIGxlYSAgICAgICAgICAgICAgICAgICAgICAgICAgcjAsIFtyMyozXQorCisgICAgOyBmaXJzdCA0eDggcGl4ZWxzCisgICAgRElGRl9QSVhFTFNfOCAgICAgICAgICAgICAgICByMSwgcjIsICAwLCByMywgcjAsIHJzcCtncHJzaXplKzB4NjAKKyAgICBIQURBTUFSRDgKKyAgICBtb3ZhICAgICAgICAgW3JzcCtncHJzaXplKzB4NjBdLCBtNworICAgIFRSQU5TUE9TRTR4NFcgICAgICAgICAgICAgICAgIDAsICAxLCAgMiwgIDMsICA3CisgICAgU1RPUkU0ICAgICAgICAgICAgICByc3ArZ3Byc2l6ZSwgbTAsIG0xLCBtMiwgbTMKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICAgICAgIG03LCBbcnNwK2dwcnNpemUrMHg2MF0KKyAgICBUUkFOU1BPU0U0eDRXICAgICAgICAgICAgICAgICA0LCAgNSwgIDYsICA3LCAgMAorICAgIFNUT1JFNCAgICAgICAgIHJzcCtncHJzaXplKzB4NDAsIG00LCBtNSwgbTYsIG03CisKKyAgICA7IHNlY29uZCA0eDggcGl4ZWxzCisgICAgRElGRl9QSVhFTFNfOCAgICAgICAgICAgICAgICByMSwgcjIsICA0LCByMywgcjAsIHJzcCtncHJzaXplKzB4NjAKKyAgICBIQURBTUFSRDgKKyAgICBtb3ZhICAgICAgICAgW3JzcCtncHJzaXplKzB4NjBdLCBtNworICAgIFRSQU5TUE9TRTR4NFcgICAgICAgICAgICAgICAgIDAsICAxLCAgMiwgIDMsICA3CisgICAgU1RPUkU0ICAgICAgICAgcnNwK2dwcnNpemUrMHgyMCwgbTAsIG0xLCBtMiwgbTMKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICAgICAgIG03LCBbcnNwK2dwcnNpemUrMHg2MF0KKyAgICBUUkFOU1BPU0U0eDRXICAgICAgICAgICAgICAgICA0LCAgNSwgIDYsICA3LCAgMAorCisgICAgTE9BRDQgICAgICAgICAgcnNwK2dwcnNpemUrMHg0MCwgbTAsIG0xLCBtMiwgbTMKKyAgICBIQURBTUFSRDgKKyAgICBBQlNfU1VNXzh4OF8zMiByc3ArZ3Byc2l6ZSsweDYwCisgICAgbW92YSAgICAgICAgIFtyc3ArZ3Byc2l6ZSsweDYwXSwgbTAKKworICAgIExPQUQ0ICAgICAgICAgIHJzcCtncHJzaXplICAgICAsIG0wLCBtMSwgbTIsIG0zCisgICAgTE9BRDQgICAgICAgICAgcnNwK2dwcnNpemUrMHgyMCwgbTQsIG01LCBtNiwgbTcKKyAgICBIQURBTUFSRDgKKyAgICBBQlNfU1VNXzh4OF8zMiByc3ArZ3Byc2l6ZQorICAgIHBhZGR1c3cgICAgICAgICAgICAgICAgICAgICAgbTAsIFtyc3ArZ3Byc2l6ZSsweDYwXQorCisgICAgSFNVTSAgICAgICAgICAgICAgICAgICAgICAgICBtMCwgbTEsIGVheAorICAgIGFuZCAgICAgICAgICAgICAgICAgICAgICAgICByYXgsIDB4RkZGRgorICAgIHJldAorCitoYWRhbWFyZDhfMTZfd3JhcHBlciAwLCAxNAorJWVuZGlmCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CitIQURBTUFSRDhfRElGRgorCitJTklUX01NWCBtbXhleHQKK0hBREFNQVJEOF9ESUZGCisKK0lOSVRfWE1NIHNzZTIKKyVpZiBBUkNIX1g4Nl82NAorJWRlZmluZSBBQlNfU1VNXzh4OCBBQlNfU1VNXzh4OF82NAorJWVsc2UKKyVkZWZpbmUgQUJTX1NVTV84eDggQUJTX1NVTV84eDhfMzIKKyVlbmRpZgorSEFEQU1BUkQ4X0RJRkYgMTAKKworSU5JVF9YTU0gc3NzZTMKKyVkZWZpbmUgQUJTX1NVTV84eDggQUJTX1NVTV84eDhfNjQKK0hBREFNQVJEOF9ESUZGIDkKKworOyBpbnQgZmZfc3NlKl8qKE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorOyAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQorCislbWFjcm8gU1VNX1NRVUFSRURfRVJST1JTIDEKK2NnbG9iYWwgc3NlJTEsIDUsNSw4LCB2LCBwaXgxLCBwaXgyLCBsc2l6ZSwgaAorJWlmICUxID09IG1tc2l6ZQorICAgIHNociAgICAgICBoZCwgMQorJWVuZGlmCisgICAgcHhvciAgICAgIG0wLCBtMCAgICAgICAgIDsgbW0wID0gMAorICAgIHB4b3IgICAgICBtNywgbTcgICAgICAgICA7IG1tNyBob2xkcyB0aGUgc3VtCisKKy5uZXh0MmxpbmVzOiA7IEZJWE1FIHdoeSBhcmUgdGhlc2UgdW5hbGlnbmVkIG1vdnM/IHBpeDFbXSBpcyBhbGlnbmVkCisgICAgbW92dSAgICAgIG0xLCBbcGl4MXFdICAgIDsgbTEgPSBwaXgxWzBdWzAtMTVdLCBbMC03XSBmb3IgbW14CisgICAgbW92dSAgICAgIG0yLCBbcGl4MnFdICAgIDsgbTIgPSBwaXgyWzBdWzAtMTVdLCBbMC03XSBmb3IgbW14CislaWYgJTEgPT0gbW1zaXplCisgICAgbW92dSAgICAgIG0zLCBbcGl4MXErbHNpemVxXSA7IG0zID0gcGl4MVsxXVswLTE1XSwgWzAtN10gZm9yIG1teAorICAgIG1vdnUgICAgICBtNCwgW3BpeDJxK2xzaXplcV0gOyBtNCA9IHBpeDJbMV1bMC0xNV0sIFswLTddIGZvciBtbXgKKyVlbHNlICA7ICUxIC8gMiA9PSBtbXNpemU7IG1teCBvbmx5CisgICAgbW92YSAgICAgIG0zLCBbcGl4MXErOF0gIDsgbTMgPSBwaXgxWzBdWzgtMTVdCisgICAgbW92YSAgICAgIG00LCBbcGl4MnErOF0gIDsgbTQgPSBwaXgyWzBdWzgtMTVdCislZW5kaWYKKworICAgIDsgdG9kbzogbW0xLW1tMiwgbW0zLW1tNAorICAgIDsgYWxnbzogc3VidHJhY3QgbW0xIGZyb20gbW0yIHdpdGggc2F0dXJhdGlvbiBhbmQgdmljZSB2ZXJzYQorICAgIDsgICAgICAgT1IgdGhlIHJlc3VsdCB0byBnZXQgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UKKyAgICBtb3ZhICAgICAgbTUsIG0xCisgICAgbW92YSAgICAgIG02LCBtMworICAgIHBzdWJ1c2IgICBtMSwgbTIKKyAgICBwc3VidXNiICAgbTMsIG00CisgICAgcHN1YnVzYiAgIG0yLCBtNQorICAgIHBzdWJ1c2IgICBtNCwgbTYKKworICAgIHBvciAgICAgICBtMiwgbTEKKyAgICBwb3IgICAgICAgbTQsIG0zCisKKyAgICA7IG5vdyBjb252ZXJ0IHRvIDE2LWJpdCB2ZWN0b3JzIHNvIHdlIGNhbiBzcXVhcmUgdGhlbQorICAgIG1vdmEgICAgICBtMSwgbTIKKyAgICBtb3ZhICAgICAgbTMsIG00CisKKyAgICBwdW5wY2toYncgbTIsIG0wCisgICAgcHVucGNraGJ3IG00LCBtMAorICAgIHB1bnBja2xidyBtMSwgbTAgICAgICAgICA7IG1tMSBub3Qgc3ByZWFkIG92ZXIgKG1tMSxtbTIpCisgICAgcHVucGNrbGJ3IG0zLCBtMCAgICAgICAgIDsgbW00IG5vdCBzcHJlYWQgb3ZlciAobW0zLG1tNCkKKworICAgIHBtYWRkd2QgICBtMiwgbTIKKyAgICBwbWFkZHdkICAgbTQsIG00CisgICAgcG1hZGR3ZCAgIG0xLCBtMQorICAgIHBtYWRkd2QgICBtMywgbTMKKworICAgIHBhZGRkICAgICBtMSwgbTIKKyAgICBwYWRkZCAgICAgbTMsIG00CisgICAgcGFkZGQgICAgIG03LCBtMQorICAgIHBhZGRkICAgICBtNywgbTMKKworJWlmICUxID09IG1tc2l6ZQorICAgIGxlYSAgICBwaXgxcSwgW3BpeDFxICsgMipsc2l6ZXFdCisgICAgbGVhICAgIHBpeDJxLCBbcGl4MnEgKyAyKmxzaXplcV0KKyVlbHNlCisgICAgYWRkICAgIHBpeDFxLCBsc2l6ZXEKKyAgICBhZGQgICAgcGl4MnEsIGxzaXplcQorJWVuZGlmCisgICAgZGVjICAgICAgIGhkCisgICAgam56IC5uZXh0MmxpbmVzCisKKyAgICBIQURERCAgICAgbTcsIG0xCisgICAgbW92ZCAgICAgZWF4LCBtNyAgICAgICAgIDsgcmV0dXJuIHZhbHVlCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CitTVU1fU1FVQVJFRF9FUlJPUlMgOAorCitJTklUX01NWCBtbXgKK1NVTV9TUVVBUkVEX0VSUk9SUyAxNgorCitJTklUX1hNTSBzc2UyCitTVU1fU1FVQVJFRF9FUlJPUlMgMTYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7aW50IGZmX3N1bV9hYnNfZGN0ZWxlbShpbnQxNl90ICpibG9jaykKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAlMSA9IG51bWJlciBvZiB4bW0gcmVnaXN0ZXJzIHVzZWQKKzsgJTIgPSBudW1iZXIgb2YgaW5saW5lIGxvb3BzCisKKyVtYWNybyBTVU1fQUJTX0RDVEVMRU0gMgorY2dsb2JhbCBzdW1fYWJzX2RjdGVsZW0sIDEsIDEsICUxLCBibG9jaworICAgIHB4b3IgICAgbTAsIG0wCisgICAgcHhvciAgICBtMSwgbTEKKyVhc3NpZ24gJSVpIDAKKyVyZXAgJTIKKyAgICBtb3ZhICAgICAgbTIsIFtibG9ja3ErbW1zaXplKigwKyUlaSldCisgICAgbW92YSAgICAgIG0zLCBbYmxvY2txK21tc2l6ZSooMSslJWkpXQorICAgIG1vdmEgICAgICBtNCwgW2Jsb2NrcSttbXNpemUqKDIrJSVpKV0KKyAgICBtb3ZhICAgICAgbTUsIFtibG9ja3ErbW1zaXplKigzKyUlaSldCisgICAgQUJTMV9TVU0gIG0yLCBtNiwgbTAKKyAgICBBQlMxX1NVTSAgbTMsIG02LCBtMQorICAgIEFCUzFfU1VNICBtNCwgbTYsIG0wCisgICAgQUJTMV9TVU0gIG01LCBtNiwgbTEKKyVhc3NpZ24gJSVpICUlaSs0CislZW5kcmVwCisgICAgcGFkZHVzdyBtMCwgbTEKKyAgICBIU1VNICAgIG0wLCBtMSwgZWF4CisgICAgYW5kICAgICBlYXgsIDB4RkZGRgorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teAorU1VNX0FCU19EQ1RFTEVNIDAsIDQKK0lOSVRfTU1YIG1teGV4dAorU1VNX0FCU19EQ1RFTEVNIDAsIDQKK0lOSVRfWE1NIHNzZTIKK1NVTV9BQlNfRENURUxFTSA3LCAyCitJTklUX1hNTSBzc3NlMworU1VNX0FCU19EQ1RFTEVNIDYsIDIKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBpbnQgZmZfaGZfbm9pc2UqX21teCh1aW50OF90ICpwaXgxLCBwdHJkaWZmX3QgbHNpemUsIGludCBoKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAlMSA9IDgvMTYuICUyLTU9bSMKKyVtYWNybyBIRl9OT0lTRV9QQVJUMSA1CisgICAgbW92YSAgICAgIG0lMiwgW3BpeDFxXQorJWlmICUxID09IDgKKyAgICBtb3ZhICAgICAgbSUzLCBtJTIKKyAgICBwc2xscSAgICAgbSUyLCA4CisgICAgcHNybHEgICAgIG0lMywgOAorICAgIHBzcmxxICAgICBtJTIsIDgKKyVlbHNlCisgICAgbW92YSAgICAgIG0lMywgW3BpeDFxKzFdCislZW5kaWYKKyAgICBtb3ZhICAgICAgbSU0LCBtJTIKKyAgICBtb3ZhICAgICAgbSU1LCBtJTMKKyAgICBwdW5wY2tsYncgbSUyLCBtNworICAgIHB1bnBja2xidyBtJTMsIG03CisgICAgcHVucGNraGJ3IG0lNCwgbTcKKyAgICBwdW5wY2toYncgbSU1LCBtNworICAgIHBzdWJ3ICAgICBtJTIsIG0lMworICAgIHBzdWJ3ICAgICBtJTQsIG0lNQorJWVuZG1hY3JvCisKKzsgJTEtMiA9IG0jCislbWFjcm8gSEZfTk9JU0VfUEFSVDIgNAorICAgIHBzdWJ3ICAgICBtJTEsIG0lMworICAgIHBzdWJ3ICAgICBtJTIsIG0lNAorICAgIHB4b3IgICAgICAgbTMsIG0zCisgICAgcHhvciAgICAgICBtMSwgbTEKKyAgICBwY21wZ3R3ICAgIG0zLCBtJTEKKyAgICBwY21wZ3R3ICAgIG0xLCBtJTIKKyAgICBweG9yICAgICAgbSUxLCBtMworICAgIHB4b3IgICAgICBtJTIsIG0xCisgICAgcHN1YncgICAgIG0lMSwgbTMKKyAgICBwc3VidyAgICAgbSUyLCBtMQorICAgIHBhZGR3ICAgICBtJTIsIG0lMQorICAgIHBhZGR3ICAgICAgbTYsIG0lMgorJWVuZG1hY3JvCisKKzsgJTEgPSA4LzE2CislbWFjcm8gSEZfTk9JU0UgMQorY2dsb2JhbCBoZl9ub2lzZSUxLCAzLDMsMCwgcGl4MSwgbHNpemUsIGgKKyAgICBzdWIgICAgICAgIGhkLCAyCisgICAgcHhvciAgICAgICBtNywgbTcKKyAgICBweG9yICAgICAgIG02LCBtNgorICAgIEhGX05PSVNFX1BBUlQxICUxLCAwLCAxLCAyLCAzCisgICAgYWRkICAgICBwaXgxcSwgbHNpemVxCisgICAgSEZfTk9JU0VfUEFSVDEgJTEsIDQsIDEsIDUsIDMKKyAgICBIRl9OT0lTRV9QQVJUMiAgICAgMCwgMiwgNCwgNQorICAgIGFkZCAgICAgcGl4MXEsIGxzaXplcQorLmxvb3A6CisgICAgSEZfTk9JU0VfUEFSVDEgJTEsIDAsIDEsIDIsIDMKKyAgICBIRl9OT0lTRV9QQVJUMiAgICAgNCwgNSwgMCwgMgorICAgIGFkZCAgICAgcGl4MXEsIGxzaXplcQorICAgIEhGX05PSVNFX1BBUlQxICUxLCA0LCAxLCA1LCAzCisgICAgSEZfTk9JU0VfUEFSVDIgICAgIDAsIDIsIDQsIDUKKyAgICBhZGQgICAgIHBpeDFxLCBsc2l6ZXEKKyAgICBzdWIgICAgICAgIGhkLCAyCisgICAgICAgIGpuZSAubG9vcAorCisgICAgbW92YSAgICAgICBtMCwgbTYKKyAgICBwdW5wY2tsd2QgIG0wLCBtNworICAgIHB1bnBja2h3ZCAgbTYsIG03CisgICAgcGFkZGQgICAgICBtNiwgbTAKKyAgICBtb3ZhICAgICAgIG0wLCBtNgorICAgIHBzcmxxICAgICAgbTYsIDMyCisgICAgcGFkZGQgICAgICBtMCwgbTYKKyAgICBtb3ZkICAgICAgZWF4LCBtMCAgIDsgZWF4ID0gcmVzdWx0IG9mIGhmX25vaXNlODsKKyAgICBSRVBfUkVUICAgICAgICAgICAgICAgICA7IHJldHVybiBlYXg7CislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CitIRl9OT0lTRSA4CitIRl9OT0lTRSAxNgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7aW50IGZmX3NhZF88b3B0PihNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyUxID0gOC8xNgorJW1hY3JvIFNBRCAxCitjZ2xvYmFsIHNhZCUxLCA1LCA1LCAzLCB2LCBwaXgxLCBwaXgyLCBzdHJpZGUsIGgKKyAgICBtb3Z1ICAgICAgbTIsIFtwaXgycV0KKyAgICBtb3Z1ICAgICAgbTEsIFtwaXgycStzdHJpZGVxXQorICAgIHBzYWRidyAgICBtMiwgW3BpeDFxXQorICAgIHBzYWRidyAgICBtMSwgW3BpeDFxK3N0cmlkZXFdCisgICAgcGFkZHcgICAgIG0yLCBtMQorJWlmICUxICE9IG1tc2l6ZQorICAgIG1vdnUgICAgICBtMCwgW3BpeDJxKzhdCisgICAgbW92dSAgICAgIG0xLCBbcGl4MnErc3RyaWRlcSs4XQorICAgIHBzYWRidyAgICBtMCwgW3BpeDFxKzhdCisgICAgcHNhZGJ3ICAgIG0xLCBbcGl4MXErc3RyaWRlcSs4XQorICAgIHBhZGR3ICAgICBtMiwgbTAKKyAgICBwYWRkdyAgICAgbTIsIG0xCislZW5kaWYKKyAgICBzdWIgICAgICAgaGQsIDIKKworYWxpZ24gMTYKKy5sb29wOgorICAgIGxlYSAgICBwaXgxcSwgW3BpeDFxK3N0cmlkZXEqMl0KKyAgICBsZWEgICAgcGl4MnEsIFtwaXgycStzdHJpZGVxKjJdCisgICAgbW92dSAgICAgIG0wLCBbcGl4MnFdCisgICAgbW92dSAgICAgIG0xLCBbcGl4MnErc3RyaWRlcV0KKyAgICBwc2FkYncgICAgbTAsIFtwaXgxcV0KKyAgICBwc2FkYncgICAgbTEsIFtwaXgxcStzdHJpZGVxXQorICAgIHBhZGR3ICAgICBtMiwgbTAKKyAgICBwYWRkdyAgICAgbTIsIG0xCislaWYgJTEgIT0gbW1zaXplCisgICAgbW92dSAgICAgIG0wLCBbcGl4MnErOF0KKyAgICBtb3Z1ICAgICAgbTEsIFtwaXgycStzdHJpZGVxKzhdCisgICAgcHNhZGJ3ICAgIG0wLCBbcGl4MXErOF0KKyAgICBwc2FkYncgICAgbTEsIFtwaXgxcStzdHJpZGVxKzhdCisgICAgcGFkZHcgICAgIG0yLCBtMAorICAgIHBhZGR3ICAgICBtMiwgbTEKKyVlbmRpZgorICAgIHN1YiAgICAgICBoZCwgMgorICAgIGpnIC5sb29wCislaWYgbW1zaXplID09IDE2CisgICAgbW92aGxwcyAgIG0wLCBtMgorICAgIHBhZGR3ICAgICBtMiwgbTAKKyVlbmRpZgorICAgIG1vdmQgICAgIGVheCwgbTIKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1NBRCA4CitTQUQgMTYKK0lOSVRfWE1NIHNzZTIKK1NBRCAxNgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7aW50IGZmX3NhZF94Ml88b3B0PihNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyUxID0gOC8xNgorJW1hY3JvIFNBRF9YMiAxCitjZ2xvYmFsIHNhZCUxX3gyLCA1LCA1LCA1LCB2LCBwaXgxLCBwaXgyLCBzdHJpZGUsIGgKKyAgICBtb3Z1ICAgICAgbTAsIFtwaXgycV0KKyAgICBtb3Z1ICAgICAgbTIsIFtwaXgycStzdHJpZGVxXQorJWlmIG1tc2l6ZSA9PSAxNgorICAgIG1vdnUgICAgICBtMywgW3BpeDJxKzFdCisgICAgbW92dSAgICAgIG00LCBbcGl4MnErc3RyaWRlcSsxXQorICAgIHBhdmdiICAgICBtMCwgbTMKKyAgICBwYXZnYiAgICAgbTIsIG00CislZWxzZQorICAgIHBhdmdiICAgICBtMCwgW3BpeDJxKzFdCisgICAgcGF2Z2IgICAgIG0yLCBbcGl4MnErc3RyaWRlcSsxXQorJWVuZGlmCisgICAgcHNhZGJ3ICAgIG0wLCBbcGl4MXFdCisgICAgcHNhZGJ3ICAgIG0yLCBbcGl4MXErc3RyaWRlcV0KKyAgICBwYWRkdyAgICAgbTAsIG0yCislaWYgJTEgIT0gbW1zaXplCisgICAgbW92dSAgICAgIG0xLCBbcGl4MnErOF0KKyAgICBtb3Z1ICAgICAgbTIsIFtwaXgycStzdHJpZGVxKzhdCisgICAgcGF2Z2IgICAgIG0xLCBbcGl4MnErOV0KKyAgICBwYXZnYiAgICAgbTIsIFtwaXgycStzdHJpZGVxKzldCisgICAgcHNhZGJ3ICAgIG0xLCBbcGl4MXErOF0KKyAgICBwc2FkYncgICAgbTIsIFtwaXgxcStzdHJpZGVxKzhdCisgICAgcGFkZHcgICAgIG0wLCBtMQorICAgIHBhZGR3ICAgICBtMCwgbTIKKyVlbmRpZgorICAgIHN1YiAgICAgICBoZCwgMgorCithbGlnbiAxNgorLmxvb3A6CisgICAgbGVhICAgIHBpeDFxLCBbcGl4MXErMipzdHJpZGVxXQorICAgIGxlYSAgICBwaXgycSwgW3BpeDJxKzIqc3RyaWRlcV0KKyAgICBtb3Z1ICAgICAgbTEsIFtwaXgycV0KKyAgICBtb3Z1ICAgICAgbTIsIFtwaXgycStzdHJpZGVxXQorJWlmIG1tc2l6ZSA9PSAxNgorICAgIG1vdnUgICAgICBtMywgW3BpeDJxKzFdCisgICAgbW92dSAgICAgIG00LCBbcGl4MnErc3RyaWRlcSsxXQorICAgIHBhdmdiICAgICBtMSwgbTMKKyAgICBwYXZnYiAgICAgbTIsIG00CislZWxzZQorICAgIHBhdmdiICAgICBtMSwgW3BpeDJxKzFdCisgICAgcGF2Z2IgICAgIG0yLCBbcGl4MnErc3RyaWRlcSsxXQorJWVuZGlmCisgICAgcHNhZGJ3ICAgIG0xLCBbcGl4MXFdCisgICAgcHNhZGJ3ICAgIG0yLCBbcGl4MXErc3RyaWRlcV0KKyAgICBwYWRkdyAgICAgbTAsIG0xCisgICAgcGFkZHcgICAgIG0wLCBtMgorJWlmICUxICE9IG1tc2l6ZQorICAgIG1vdnUgICAgICBtMSwgW3BpeDJxKzhdCisgICAgbW92dSAgICAgIG0yLCBbcGl4MnErc3RyaWRlcSs4XQorICAgIHBhdmdiICAgICBtMSwgW3BpeDJxKzldCisgICAgcGF2Z2IgICAgIG0yLCBbcGl4MnErc3RyaWRlcSs5XQorICAgIHBzYWRidyAgICBtMSwgW3BpeDFxKzhdCisgICAgcHNhZGJ3ICAgIG0yLCBbcGl4MXErc3RyaWRlcSs4XQorICAgIHBhZGR3ICAgICBtMCwgbTEKKyAgICBwYWRkdyAgICAgbTAsIG0yCislZW5kaWYKKyAgICBzdWIgICAgICAgaGQsIDIKKyAgICBqZyAubG9vcAorJWlmIG1tc2l6ZSA9PSAxNgorICAgIG1vdmhscHMgICBtMSwgbTAKKyAgICBwYWRkdyAgICAgbTAsIG0xCislZW5kaWYKKyAgICBtb3ZkICAgICBlYXgsIG0wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitTQURfWDIgOAorU0FEX1gyIDE2CitJTklUX1hNTSBzc2UyCitTQURfWDIgMTYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorO2ludCBmZl9zYWRfeTJfPG9wdD4oTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzslMSA9IDgvMTYKKyVtYWNybyBTQURfWTIgMQorY2dsb2JhbCBzYWQlMV95MiwgNSwgNSwgNCwgdiwgcGl4MSwgcGl4Miwgc3RyaWRlLCBoCisgICAgbW92dSAgICAgIG0xLCBbcGl4MnFdCisgICAgbW92dSAgICAgIG0wLCBbcGl4MnErc3RyaWRlcV0KKyAgICBtb3Z1ICAgICAgbTMsIFtwaXgycSsyKnN0cmlkZXFdCisgICAgcGF2Z2IgICAgIG0xLCBtMAorICAgIHBhdmdiICAgICBtMCwgbTMKKyAgICBwc2FkYncgICAgbTEsIFtwaXgxcV0KKyAgICBwc2FkYncgICAgbTAsIFtwaXgxcStzdHJpZGVxXQorICAgIHBhZGR3ICAgICBtMCwgbTEKKyAgICBtb3ZhICAgICAgbTEsIG0zCislaWYgJTEgIT0gbW1zaXplCisgICAgbW92dSAgICAgIG00LCBbcGl4MnErOF0KKyAgICBtb3Z1ICAgICAgbTUsIFtwaXgycStzdHJpZGVxKzhdCisgICAgbW92dSAgICAgIG02LCBbcGl4MnErMipzdHJpZGVxKzhdCisgICAgcGF2Z2IgICAgIG00LCBtNQorICAgIHBhdmdiICAgICBtNSwgbTYKKyAgICBwc2FkYncgICAgbTQsIFtwaXgxcSs4XQorICAgIHBzYWRidyAgICBtNSwgW3BpeDFxK3N0cmlkZXErOF0KKyAgICBwYWRkdyAgICAgbTAsIG00CisgICAgcGFkZHcgICAgIG0wLCBtNQorICAgIG1vdmEgICAgICBtNCwgbTYKKyVlbmRpZgorICAgIGFkZCAgICBwaXgycSwgc3RyaWRlcQorICAgIHN1YiAgICAgICBoZCwgMgorCithbGlnbiAxNgorLmxvb3A6CisgICAgbGVhICAgIHBpeDFxLCBbcGl4MXErMipzdHJpZGVxXQorICAgIGxlYSAgICBwaXgycSwgW3BpeDJxKzIqc3RyaWRlcV0KKyAgICBtb3Z1ICAgICAgbTIsIFtwaXgycV0KKyAgICBtb3Z1ICAgICAgbTMsIFtwaXgycStzdHJpZGVxXQorICAgIHBhdmdiICAgICBtMSwgbTIKKyAgICBwYXZnYiAgICAgbTIsIG0zCisgICAgcHNhZGJ3ICAgIG0xLCBbcGl4MXFdCisgICAgcHNhZGJ3ICAgIG0yLCBbcGl4MXErc3RyaWRlcV0KKyAgICBwYWRkdyAgICAgbTAsIG0xCisgICAgcGFkZHcgICAgIG0wLCBtMgorICAgIG1vdmEgICAgICBtMSwgbTMKKyVpZiAlMSAhPSBtbXNpemUKKyAgICBtb3Z1ICAgICAgbTUsIFtwaXgycSs4XQorICAgIG1vdnUgICAgICBtNiwgW3BpeDJxK3N0cmlkZXErOF0KKyAgICBwYXZnYiAgICAgbTQsIG01CisgICAgcGF2Z2IgICAgIG01LCBtNgorICAgIHBzYWRidyAgICBtNCwgW3BpeDFxKzhdCisgICAgcHNhZGJ3ICAgIG01LCBbcGl4MXErc3RyaWRlcSs4XQorICAgIHBhZGR3ICAgICBtMCwgbTQKKyAgICBwYWRkdyAgICAgbTAsIG01CisgICAgbW92YSAgICAgIG00LCBtNgorJWVuZGlmCisgICAgc3ViICAgICAgIGhkLCAyCisgICAgamcgLmxvb3AKKyVpZiBtbXNpemUgPT0gMTYKKyAgICBtb3ZobHBzICAgbTEsIG0wCisgICAgcGFkZHcgICAgIG0wLCBtMQorJWVuZGlmCisgICAgbW92ZCAgICAgZWF4LCBtMAorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorU0FEX1kyIDgKK1NBRF9ZMiAxNgorSU5JVF9YTU0gc3NlMgorU0FEX1kyIDE2CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7aW50IGZmX3NhZF9hcHByb3hfeHkyXzxvcHQ+KE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyUxID0gOC8xNgorJW1hY3JvIFNBRF9BUFBST1hfWFkyIDEKK2NnbG9iYWwgc2FkJTFfYXBwcm94X3h5MiwgNSwgNSwgNywgdiwgcGl4MSwgcGl4Miwgc3RyaWRlLCBoCisgICAgbW92YSAgICAgIG00LCBbcGJfMV0KKyAgICBtb3Z1ICAgICAgbTEsIFtwaXgycV0KKyAgICBtb3Z1ICAgICAgbTAsIFtwaXgycStzdHJpZGVxXQorICAgIG1vdnUgICAgICBtMywgW3BpeDJxKzIqc3RyaWRlcV0KKyVpZiBtbXNpemUgPT0gMTYKKyAgICBtb3Z1ICAgICAgbTUsIFtwaXgycSsxXQorICAgIG1vdnUgICAgICBtNiwgW3BpeDJxK3N0cmlkZXErMV0KKyAgICBtb3Z1ICAgICAgbTIsIFtwaXgycSsyKnN0cmlkZXErMV0KKyAgICBwYXZnYiAgICAgbTEsIG01CisgICAgcGF2Z2IgICAgIG0wLCBtNgorICAgIHBhdmdiICAgICBtMywgbTIKKyVlbHNlCisgICAgcGF2Z2IgICAgIG0xLCBbcGl4MnErMV0KKyAgICBwYXZnYiAgICAgbTAsIFtwaXgycStzdHJpZGVxKzFdCisgICAgcGF2Z2IgICAgIG0zLCBbcGl4MnErMipzdHJpZGVxKzFdCislZW5kaWYKKyAgICBwc3VidXNiICAgbTAsIG00CisgICAgcGF2Z2IgICAgIG0xLCBtMAorICAgIHBhdmdiICAgICBtMCwgbTMKKyAgICBwc2FkYncgICAgbTEsIFtwaXgxcV0KKyAgICBwc2FkYncgICAgbTAsIFtwaXgxcStzdHJpZGVxXQorICAgIHBhZGR3ICAgICBtMCwgbTEKKyAgICBtb3ZhICAgICAgbTEsIG0zCislaWYgJTEgIT0gbW1zaXplCisgICAgbW92dSAgICAgIG01LCBbcGl4MnErOF0KKyAgICBtb3Z1ICAgICAgbTYsIFtwaXgycStzdHJpZGVxKzhdCisgICAgbW92dSAgICAgIG03LCBbcGl4MnErMipzdHJpZGVxKzhdCisgICAgcGF2Z2IgICAgIG01LCBbcGl4MnErMSs4XQorICAgIHBhdmdiICAgICBtNiwgW3BpeDJxK3N0cmlkZXErMSs4XQorICAgIHBhdmdiICAgICBtNywgW3BpeDJxKzIqc3RyaWRlcSsxKzhdCisgICAgcHN1YnVzYiAgIG02LCBtNAorICAgIHBhdmdiICAgICBtNSwgbTYKKyAgICBwYXZnYiAgICAgbTYsIG03CisgICAgcHNhZGJ3ICAgIG01LCBbcGl4MXErOF0KKyAgICBwc2FkYncgICAgbTYsIFtwaXgxcStzdHJpZGVxKzhdCisgICAgcGFkZHcgICAgIG0wLCBtNQorICAgIHBhZGR3ICAgICBtMCwgbTYKKyAgICBtb3ZhICAgICAgbTUsIG03CislZW5kaWYKKyAgICBhZGQgICAgcGl4MnEsIHN0cmlkZXEKKyAgICBzdWIgICAgICAgaGQsIDIKKworYWxpZ24gMTYKKy5sb29wOgorICAgIGxlYSAgICBwaXgxcSwgW3BpeDFxKzIqc3RyaWRlcV0KKyAgICBsZWEgICAgcGl4MnEsIFtwaXgycSsyKnN0cmlkZXFdCisgICAgbW92dSAgICAgIG0yLCBbcGl4MnFdCisgICAgbW92dSAgICAgIG0zLCBbcGl4MnErc3RyaWRlcV0KKyVpZiBtbXNpemUgPT0gMTYKKyAgICBtb3Z1ICAgICAgbTUsIFtwaXgycSsxXQorICAgIG1vdnUgICAgICBtNiwgW3BpeDJxK3N0cmlkZXErMV0KKyAgICBwYXZnYiAgICAgbTIsIG01CisgICAgcGF2Z2IgICAgIG0zLCBtNgorJWVsc2UKKyAgICBwYXZnYiAgICAgbTIsIFtwaXgycSsxXQorICAgIHBhdmdiICAgICBtMywgW3BpeDJxK3N0cmlkZXErMV0KKyVlbmRpZgorICAgIHBzdWJ1c2IgICBtMiwgbTQKKyAgICBwYXZnYiAgICAgbTEsIG0yCisgICAgcGF2Z2IgICAgIG0yLCBtMworICAgIHBzYWRidyAgICBtMSwgW3BpeDFxXQorICAgIHBzYWRidyAgICBtMiwgW3BpeDFxK3N0cmlkZXFdCisgICAgcGFkZHcgICAgIG0wLCBtMQorICAgIHBhZGR3ICAgICBtMCwgbTIKKyAgICBtb3ZhICAgICAgbTEsIG0zCislaWYgJTEgIT0gbW1zaXplCisgICAgbW92dSAgICAgIG02LCBbcGl4MnErOF0KKyAgICBtb3Z1ICAgICAgbTcsIFtwaXgycStzdHJpZGVxKzhdCisgICAgcGF2Z2IgICAgIG02LCBbcGl4MnErOCsxXQorICAgIHBhdmdiICAgICBtNywgW3BpeDJxK3N0cmlkZXErOCsxXQorICAgIHBzdWJ1c2IgICBtNiwgbTQKKyAgICBwYXZnYiAgICAgbTUsIG02CisgICAgcGF2Z2IgICAgIG02LCBtNworICAgIHBzYWRidyAgICBtNSwgW3BpeDFxKzhdCisgICAgcHNhZGJ3ICAgIG02LCBbcGl4MXErc3RyaWRlcSs4XQorICAgIHBhZGR3ICAgICBtMCwgbTUKKyAgICBwYWRkdyAgICAgbTAsIG02CisgICAgbW92YSAgICAgIG01LCBtNworJWVuZGlmCisgICAgc3ViICAgICAgIGhkLCAyCisgICAgamcgLmxvb3AKKyVpZiBtbXNpemUgPT0gMTYKKyAgICBtb3ZobHBzICAgbTEsIG0wCisgICAgcGFkZHcgICAgIG0wLCBtMQorJWVuZGlmCisgICAgbW92ZCAgICAgZWF4LCBtMAorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorU0FEX0FQUFJPWF9YWTIgOAorU0FEX0FQUFJPWF9YWTIgMTYKK0lOSVRfWE1NIHNzZTIKK1NBRF9BUFBST1hfWFkyIDE2CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorO2ludCBmZl92c2FkX2ludHJhKE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorOyAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAlMSA9IDgvMTYKKyVtYWNybyBWU0FEX0lOVFJBIDEKK2NnbG9iYWwgdnNhZF9pbnRyYSUxLCA1LCA1LCAzLCB2LCBwaXgxLCBwaXgyLCBsc2l6ZSwgaAorICAgIG1vdmEgICAgICBtMCwgW3BpeDFxXQorJWlmICUxID09IG1tc2l6ZQorICAgIG1vdmEgICAgICBtMiwgW3BpeDFxK2xzaXplcV0KKyAgICBwc2FkYncgICAgbTAsIG0yCislZWxzZQorICAgIG1vdmEgICAgICBtMiwgW3BpeDFxK2xzaXplcV0KKyAgICBtb3ZhICAgICAgbTMsIFtwaXgxcSs4XQorICAgIG1vdmEgICAgICBtNCwgW3BpeDFxK2xzaXplcSs4XQorICAgIHBzYWRidyAgICBtMCwgbTIKKyAgICBwc2FkYncgICAgbTMsIG00CisgICAgcGFkZHcgICAgIG0wLCBtMworJWVuZGlmCisgICAgc3ViICAgICAgIGhkLCAyCisKKy5sb29wCisgICAgbGVhICAgIHBpeDFxLCBbcGl4MXEgKyAyKmxzaXplcV0KKyVpZiAlMSA9PSBtbXNpemUKKyAgICBtb3ZhICAgICAgbTEsIFtwaXgxcV0KKyAgICBwc2FkYncgICAgbTIsIG0xCisgICAgcGFkZHcgICAgIG0wLCBtMgorICAgIG1vdmEgICAgICBtMiwgW3BpeDFxK2xzaXplcV0KKyAgICBwc2FkYncgICAgbTEsIG0yCisgICAgcGFkZHcgICAgIG0wLCBtMQorJWVsc2UKKyAgICBtb3ZhICAgICAgbTEsIFtwaXgxcV0KKyAgICBtb3ZhICAgICAgbTMsIFtwaXgxcSs4XQorICAgIHBzYWRidyAgICBtMiwgbTEKKyAgICBwc2FkYncgICAgbTQsIG0zCisgICAgcGFkZHcgICAgIG0wLCBtMgorICAgIHBhZGR3ICAgICBtMCwgbTQKKyAgICBtb3ZhICAgICAgbTIsIFtwaXgxcStsc2l6ZXFdCisgICAgbW92YSAgICAgIG00LCBbcGl4MXErbHNpemVxKzhdCisgICAgcHNhZGJ3ICAgIG0xLCBtMgorICAgIHBzYWRidyAgICBtMywgbTQKKyAgICBwYWRkdyAgICAgbTAsIG0xCisgICAgcGFkZHcgICAgIG0wLCBtMworJWVuZGlmCisgICAgc3ViICAgICAgIGhkLCAyCisgICAgamcgICAgIC5sb29wCisKKyVpZiBtbXNpemUgPT0gMTYKKyAgICBwc2h1ZmQgbTEsIG0wLCAweGUKKyAgICBwYWRkZCAgbTAsIG0xCislZW5kaWYKKyAgICBtb3ZkIGVheCwgbTAKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1ZTQURfSU5UUkEgOAorVlNBRF9JTlRSQSAxNgorSU5JVF9YTU0gc3NlMgorVlNBRF9JTlRSQSAxNgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7aW50IGZmX3ZzYWRfYXBwcm94KE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorOyAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7ICUxID0gOC8xNgorJW1hY3JvIFZTQURfQVBQUk9YIDEKK2NnbG9iYWwgdnNhZCUxX2FwcHJveCwgNSwgNSwgNSwgdiwgcGl4MSwgcGl4MiwgbHNpemUsIGgKKyAgICBtb3ZhICAgbTEsIFtwYl84MF0KKyAgICBtb3ZhICAgbTAsIFtwaXgxcV0KKyVpZiAlMSA9PSBtbXNpemUgOyB2c2FkOF9tbXhleHQsIHZzYWQxNl9zc2UyCisgICAgbW92YSAgIG00LCBbcGl4MXErbHNpemVxXQorJWlmIG1tc2l6ZSA9PSAxNgorICAgIG1vdnUgICBtMywgW3BpeDJxXQorICAgIG1vdnUgICBtMiwgW3BpeDJxK2xzaXplcV0KKyAgICBwc3ViYiAgbTAsIG0zCisgICAgcHN1YmIgIG00LCBtMgorJWVsc2UKKyAgICBwc3ViYiAgbTAsIFtwaXgycV0KKyAgICBwc3ViYiAgbTQsIFtwaXgycStsc2l6ZXFdCislZW5kaWYKKyAgICBweG9yICAgbTAsIG0xCisgICAgcHhvciAgIG00LCBtMQorICAgIHBzYWRidyBtMCwgbTQKKyVlbHNlIDsgdnNhZDE2X21teGV4dAorICAgIG1vdmEgICBtMywgW3BpeDFxKzhdCisgICAgcHN1YmIgIG0wLCBbcGl4MnFdCisgICAgcHN1YmIgIG0zLCBbcGl4MnErOF0KKyAgICBweG9yICAgbTAsIG0xCisgICAgcHhvciAgIG0zLCBtMQorICAgIG1vdmEgICBtNCwgW3BpeDFxK2xzaXplcV0KKyAgICBtb3ZhICAgbTUsIFtwaXgxcStsc2l6ZXErOF0KKyAgICBwc3ViYiAgbTQsIFtwaXgycStsc2l6ZXFdCisgICAgcHN1YmIgIG01LCBbcGl4MnErbHNpemVxKzhdCisgICAgcHhvciAgIG00LCBtMQorICAgIHB4b3IgICBtNSwgbTEKKyAgICBwc2FkYncgbTAsIG00CisgICAgcHNhZGJ3IG0zLCBtNQorICAgIHBhZGR3ICBtMCwgbTMKKyVlbmRpZgorICAgIHN1YiAgICBoZCwgMgorCisubG9vcAorICAgIGxlYSBwaXgxcSwgW3BpeDFxICsgMipsc2l6ZXFdCisgICAgbGVhIHBpeDJxLCBbcGl4MnEgKyAyKmxzaXplcV0KKyAgICBtb3ZhICAgbTIsIFtwaXgxcV0KKyVpZiAlMSA9PSBtbXNpemUgOyB2c2FkOF9tbXhleHQsIHZzYWQxNl9zc2UyCislaWYgbW1zaXplID09IDE2CisgICAgbW92dSAgIG0zLCBbcGl4MnFdCisgICAgcHN1YmIgIG0yLCBtMworJWVsc2UKKyAgICBwc3ViYiAgbTIsIFtwaXgycV0KKyVlbmRpZgorICAgIHB4b3IgICBtMiwgbTEKKyAgICBwc2FkYncgbTQsIG0yCisgICAgcGFkZHcgIG0wLCBtNAorICAgIG1vdmEgICBtNCwgW3BpeDFxK2xzaXplcV0KKyAgICBtb3Z1ICAgbTMsIFtwaXgycStsc2l6ZXFdCisgICAgcHN1YmIgIG00LCBtMworICAgIHB4b3IgICBtNCwgbTEKKyAgICBwc2FkYncgbTIsIG00CisgICAgcGFkZHcgIG0wLCBtMgorJWVsc2UgOyB2c2FkMTZfbW14ZXh0CisgICAgbW92YSAgIG0zLCBbcGl4MXErOF0KKyAgICBwc3ViYiAgbTIsIFtwaXgycV0KKyAgICBwc3ViYiAgbTMsIFtwaXgycSs4XQorICAgIHB4b3IgICBtMiwgbTEKKyAgICBweG9yICAgbTMsIG0xCisgICAgcHNhZGJ3IG00LCBtMgorICAgIHBzYWRidyBtNSwgbTMKKyAgICBwYWRkdyAgbTAsIG00CisgICAgcGFkZHcgIG0wLCBtNQorICAgIG1vdmEgICBtNCwgW3BpeDFxK2xzaXplcV0KKyAgICBtb3ZhICAgbTUsIFtwaXgxcStsc2l6ZXErOF0KKyAgICBwc3ViYiAgbTQsIFtwaXgycStsc2l6ZXFdCisgICAgcHN1YmIgIG01LCBbcGl4MnErbHNpemVxKzhdCisgICAgcHhvciAgIG00LCBtMQorICAgIHB4b3IgICBtNSwgbTEKKyAgICBwc2FkYncgbTIsIG00CisgICAgcHNhZGJ3IG0zLCBtNQorICAgIHBhZGR3ICBtMCwgbTIKKyAgICBwYWRkdyAgbTAsIG0zCislZW5kaWYKKyAgICBzdWIgICAgaGQsIDIKKyAgICBqZyAgLmxvb3AKKworJWlmIG1tc2l6ZSA9PSAxNgorICAgIHBzaHVmZCBtMSwgbTAsIDB4ZQorICAgIHBhZGRkICBtMCwgbTEKKyVlbmRpZgorICAgIG1vdmQgIGVheCwgbTAKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1ZTQURfQVBQUk9YIDgKK1ZTQURfQVBQUk9YIDE2CitJTklUX1hNTSBzc2UyCitWU0FEX0FQUFJPWCAxNgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21lX2NtcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbWVfY21wX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTVkZjUwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21lX2NtcF9pbml0LmMKQEAgLTAsMCArMSw2NTEgQEAKKy8qCisgKiBTSU1ELW9wdGltaXplZCBtb3Rpb24gZXN0aW1hdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBNTVggb3B0aW1pemF0aW9uIGJ5IE5pY2sgS3Vyc2hldiA8bmlja29sc19rQG1haWwucnU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tZV9jbXAuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWd2aWRlby5oIgorCitpbnQgZmZfc3VtX2Fic19kY3RlbGVtX21teChpbnQxNl90ICpibG9jayk7CitpbnQgZmZfc3VtX2Fic19kY3RlbGVtX21teGV4dChpbnQxNl90ICpibG9jayk7CitpbnQgZmZfc3VtX2Fic19kY3RlbGVtX3NzZTIoaW50MTZfdCAqYmxvY2spOworaW50IGZmX3N1bV9hYnNfZGN0ZWxlbV9zc3NlMyhpbnQxNl90ICpibG9jayk7CitpbnQgZmZfc3NlOF9tbXgoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3NzZTE2X21teChNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3NzZTE2X3NzZTIoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCk7CitpbnQgZmZfaGZfbm9pc2U4X21teCh1aW50OF90ICpwaXgxLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCk7CitpbnQgZmZfaGZfbm9pc2UxNl9tbXgodWludDhfdCAqcGl4MSwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3NhZDhfbW14ZXh0KE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKTsKK2ludCBmZl9zYWQxNl9tbXhleHQoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKTsKK2ludCBmZl9zYWQxNl9zc2UyKE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3NhZDhfeDJfbW14ZXh0KE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKTsKK2ludCBmZl9zYWQxNl94Ml9tbXhleHQoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKTsKK2ludCBmZl9zYWQxNl94Ml9zc2UyKE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3NhZDhfeTJfbW14ZXh0KE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKTsKK2ludCBmZl9zYWQxNl95Ml9tbXhleHQoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKTsKK2ludCBmZl9zYWQxNl95Ml9zc2UyKE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3NhZDhfYXBwcm94X3h5Ml9tbXhleHQoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCk7CitpbnQgZmZfc2FkMTZfYXBwcm94X3h5Ml9tbXhleHQoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3NhZDE2X2FwcHJveF94eTJfc3NlMihNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3ZzYWRfaW50cmE4X21teGV4dChNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3ZzYWRfaW50cmExNl9tbXhleHQoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCk7CitpbnQgZmZfdnNhZF9pbnRyYTE2X3NzZTIoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworaW50IGZmX3ZzYWQ4X2FwcHJveF9tbXhleHQoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKTsKK2ludCBmZl92c2FkMTZfYXBwcm94X21teGV4dChNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKTsKK2ludCBmZl92c2FkMTZfYXBwcm94X3NzZTIoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOworCisjZGVmaW5lIGhhZGFtYXJkX2Z1bmMoY3B1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGZmX2hhZGFtYXJkOF9kaWZmXyAjIyBjcHUoTXBlZ0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKnNyYzEsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjMiwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOyAgICBcCisgICAgaW50IGZmX2hhZGFtYXJkOF9kaWZmMTZfICMjIGNwdShNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqc3JjMSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCk7CisKK2hhZGFtYXJkX2Z1bmMobW14KQoraGFkYW1hcmRfZnVuYyhtbXhleHQpCitoYWRhbWFyZF9mdW5jKHNzZTIpCitoYWRhbWFyZF9mdW5jKHNzc2UzKQorCisjaWYgSEFWRV9ZQVNNCitzdGF0aWMgaW50IG5zc2UxNl9tbXgoTXBlZ0VuY0NvbnRleHQgKmMsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IHNjb3JlMSwgc2NvcmUyOworCisgICAgaWYgKGMpCisgICAgICAgIHNjb3JlMSA9IGMtPm1lY2Muc3NlWzBdKGMsIHBpeDEsIHBpeDIsIHN0cmlkZSwgaCk7CisgICAgZWxzZQorICAgICAgICBzY29yZTEgPSBmZl9zc2UxNl9tbXgoYywgcGl4MSwgcGl4Miwgc3RyaWRlLCBoKTsKKyAgICBzY29yZTIgPSBmZl9oZl9ub2lzZTE2X21teChwaXgxLCBzdHJpZGUsIGgpICsgZmZfaGZfbm9pc2U4X21teChwaXgxKzgsIHN0cmlkZSwgaCkKKyAgICAgICAgICAgLSBmZl9oZl9ub2lzZTE2X21teChwaXgyLCBzdHJpZGUsIGgpIC0gZmZfaGZfbm9pc2U4X21teChwaXgyKzgsIHN0cmlkZSwgaCk7CisKKyAgICBpZiAoYykKKyAgICAgICAgcmV0dXJuIHNjb3JlMSArIEZGQUJTKHNjb3JlMikgKiBjLT5hdmN0eC0+bnNzZV93ZWlnaHQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gc2NvcmUxICsgRkZBQlMoc2NvcmUyKSAqIDg7Cit9CisKK3N0YXRpYyBpbnQgbnNzZThfbW14KE1wZWdFbmNDb250ZXh0ICpjLCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAorICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IHNjb3JlMSA9IGZmX3NzZThfbW14KGMsIHBpeDEsIHBpeDIsIHN0cmlkZSwgaCk7CisgICAgaW50IHNjb3JlMiA9IGZmX2hmX25vaXNlOF9tbXgocGl4MSwgc3RyaWRlLCBoKSAtCisgICAgICAgICAgICAgICAgIGZmX2hmX25vaXNlOF9tbXgocGl4Miwgc3RyaWRlLCBoKTsKKworICAgIGlmIChjKQorICAgICAgICByZXR1cm4gc2NvcmUxICsgRkZBQlMoc2NvcmUyKSAqIGMtPmF2Y3R4LT5uc3NlX3dlaWdodDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBzY29yZTEgKyBGRkFCUyhzY29yZTIpICogODsKK30KKworI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKK3N0YXRpYyBpbnQgdnNhZF9pbnRyYTE2X21teChNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4LCB1aW50OF90ICpkdW1teSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgdG1wOworCisgICAgYXZfYXNzZXJ0MigoKChpbnQpIHBpeCkgJiA3KSA9PSAwKTsKKyAgICBhdl9hc3NlcnQyKChzdHJpZGUgJiA3KSA9PSAwKTsKKworI2RlZmluZSBTVU0oaW4wLCBpbjEsIG91dDAsIG91dDEpICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICglMCksICUlbW0yXG4iICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxIDgoJTApLCAlJW1tM1xuIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhZGQgJTIsJTBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICUlbW0yLCAiICNvdXQwICJcbiIgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICUlbW0zLCAiICNvdXQxICJcbiIgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXNiICIgI2luMCAiLCAlJW1tMlxuIiAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXNiICIgI2luMSAiLCAlJW1tM1xuIiAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXNiICIgI291dDAgIiwgIiAjaW4wICJcbiIgICAgICAgICAgICAgXAorICAgICJwc3VidXNiICIgI291dDEgIiwgIiAjaW4xICJcbiIgICAgICAgICAgICAgXAorICAgICJwb3IgJSVtbTIsICIgI2luMCAiXG4iICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3IgJSVtbTMsICIgI2luMSAiXG4iICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICIgI2luMCAiLCAlJW1tMlxuIiAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICIgI2luMSAiLCAlJW1tM1xuIiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tsYncgJSVtbTcsICIgI2luMCAiXG4iICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tsYncgJSVtbTcsICIgI2luMSAiXG4iICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0yXG4iICAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0zXG4iICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdyAiICNpbjEgIiwgIiAjaW4wICJcbiIgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdyAlJW1tMywgJSVtbTJcbiIgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdyAlJW1tMiwgIiAjaW4wICJcbiIgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdyAiICNpbjAgIiwgJSVtbTZcbiIKKworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJtb3ZsICAgICUzLCAlJWVjeFxuIgorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTZcbiIKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03XG4iCisgICAgICAgICJtb3ZxICAoJTApLCAlJW1tMFxuIgorICAgICAgICAibW92cSA4KCUwKSwgJSVtbTFcbiIKKyAgICAgICAgImFkZCAlMiwgJTBcbiIKKyAgICAgICAgImptcCAyZlxuIgorICAgICAgICAiMTpcbiIKKworICAgICAgICBTVU0oJSVtbTQsICUlbW01LCAlJW1tMCwgJSVtbTEpCisgICAgICAgICIyOlxuIgorICAgICAgICBTVU0oJSVtbTAsICUlbW0xLCAlJW1tNCwgJSVtbTUpCisKKyAgICAgICAgInN1YmwgJDIsICUlZWN4XG4iCisgICAgICAgICJqbnogMWJcbiIKKworICAgICAgICAibW92cSAgJSVtbTYsICUlbW0wXG4iCisgICAgICAgICJwc3JscSAkMzIsICAgJSVtbTZcbiIKKyAgICAgICAgInBhZGR3ICUlbW02LCAlJW1tMFxuIgorICAgICAgICAibW92cSAgJSVtbTAsICUlbW02XG4iCisgICAgICAgICJwc3JscSAkMTYsICAgJSVtbTBcbiIKKyAgICAgICAgInBhZGR3ICUlbW02LCAlJW1tMFxuIgorICAgICAgICAibW92ZCAgJSVtbTAsICUxXG4iCisgICAgICAgIDogIityIiAocGl4KSwgIj1yIiAodG1wKQorICAgICAgICA6ICJyIiAoc3RyaWRlKSwgIm0iIChoKQorICAgICAgICA6ICIlZWN4Iik7CisKKyAgICByZXR1cm4gdG1wICYgMHhGRkZGOworfQorI3VuZGVmIFNVTQorCitzdGF0aWMgaW50IHZzYWQxNl9tbXgoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IHRtcDsKKworICAgIGF2X2Fzc2VydDIoKCgoaW50KSBwaXgxKSAmIDcpID09IDApOworICAgIGF2X2Fzc2VydDIoKCgoaW50KSBwaXgyKSAmIDcpID09IDApOworICAgIGF2X2Fzc2VydDIoKHN0cmlkZSAmIDcpID09IDApOworCisjZGVmaW5lIFNVTShpbjAsIGluMSwgb3V0MCwgb3V0MSkgICAgICAgXAorICAgICJtb3ZxICglMCksICUlbW0yXG4iICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAoJTEpLCAiICNvdXQwICJcbiIgICAgICAgICAgICBcCisgICAgIm1vdnEgOCglMCksICUlbW0zXG4iICAgICAgICAgICAgICAgXAorICAgICJtb3ZxIDgoJTEpLCAiICNvdXQxICJcbiIgICAgICAgICAgIFwKKyAgICAiYWRkICUzLCAlMFxuIiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFkZCAlMywgJTFcbiIgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3ViYiAiICNvdXQwICIsICUlbW0yXG4iICAgICAgICAgIFwKKyAgICAicHN1YmIgIiAjb3V0MSAiLCAlJW1tM1xuIiAgICAgICAgICBcCisgICAgInB4b3IgJSVtbTcsICUlbW0yXG4iICAgICAgICAgICAgICAgXAorICAgICJweG9yICUlbW03LCAlJW1tM1xuIiAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAlJW1tMiwgIiAjb3V0MCAiXG4iICAgICAgICAgICBcCisgICAgIm1vdnEgJSVtbTMsICIgI291dDEgIlxuIiAgICAgICAgICAgXAorICAgICJwc3VidXNiICIgI2luMCAiLCAlJW1tMlxuIiAgICAgICAgIFwKKyAgICAicHN1YnVzYiAiICNpbjEgIiwgJSVtbTNcbiIgICAgICAgICBcCisgICAgInBzdWJ1c2IgIiAjb3V0MCAiLCAiICNpbjAgIlxuIiAgICAgXAorICAgICJwc3VidXNiICIgI291dDEgIiwgIiAjaW4xICJcbiIgICAgIFwKKyAgICAicG9yICUlbW0yLCAiICNpbjAgIlxuIiAgICAgICAgICAgICBcCisgICAgInBvciAlJW1tMywgIiAjaW4xICJcbiIgICAgICAgICAgICAgXAorICAgICJtb3ZxICIgI2luMCAiLCAlJW1tMlxuIiAgICAgICAgICAgIFwKKyAgICAibW92cSAiICNpbjEgIiwgJSVtbTNcbiIgICAgICAgICAgICBcCisgICAgInB1bnBja2xidyAlJW1tNywgIiAjaW4wICJcbiIgICAgICAgXAorICAgICJwdW5wY2tsYncgJSVtbTcsICIgI2luMSAiXG4iICAgICAgIFwKKyAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMlxuIiAgICAgICAgICBcCisgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTNcbiIgICAgICAgICAgXAorICAgICJwYWRkdyAiICNpbjEgIiwgIiAjaW4wICJcbiIgICAgICAgIFwKKyAgICAicGFkZHcgJSVtbTMsICUlbW0yXG4iICAgICAgICAgICAgICBcCisgICAgInBhZGR3ICUlbW0yLCAiICNpbjAgIlxuIiAgICAgICAgICAgXAorICAgICJwYWRkdyAiICNpbjAgIiwgJSVtbTZcbiIKKworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJtb3ZsICU0LCAlJWVjeFxuIgorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTZcbiIKKyAgICAgICAgInBjbXBlcXcgJSVtbTcsICUlbW03XG4iCisgICAgICAgICJwc2xsdyAkMTUsICUlbW03XG4iCisgICAgICAgICJwYWNrc3N3YiAlJW1tNywgJSVtbTdcbiIKKyAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTBcbiIKKyAgICAgICAgIm1vdnEgKCUxKSwgJSVtbTJcbiIKKyAgICAgICAgIm1vdnEgOCglMCksICUlbW0xXG4iCisgICAgICAgICJtb3ZxIDgoJTEpLCAlJW1tM1xuIgorICAgICAgICAiYWRkICUzLCAlMFxuIgorICAgICAgICAiYWRkICUzLCAlMVxuIgorICAgICAgICAicHN1YmIgJSVtbTIsICUlbW0wXG4iCisgICAgICAgICJwc3ViYiAlJW1tMywgJSVtbTFcbiIKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW0wXG4iCisgICAgICAgICJweG9yICUlbW03LCAlJW1tMVxuIgorICAgICAgICAiam1wIDJmXG4iCisgICAgICAgICIxOlxuIgorCisgICAgICAgIFNVTSglJW1tNCwgJSVtbTUsICUlbW0wLCAlJW1tMSkKKyAgICAgICAgIjI6XG4iCisgICAgICAgIFNVTSglJW1tMCwgJSVtbTEsICUlbW00LCAlJW1tNSkKKworICAgICAgICAic3VibCAkMiwgJSVlY3hcbiIKKyAgICAgICAgImpueiAxYlxuIgorCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tMFxuIgorICAgICAgICAicHNybHEgJDMyLCAlJW1tNlxuIgorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW0wXG4iCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNlxuIgorICAgICAgICAicHNybHEgJDE2LCAlJW1tMFxuIgorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW0wXG4iCisgICAgICAgICJtb3ZkICUlbW0wLCAlMlxuIgorICAgICAgICA6ICIrciIgKHBpeDEpLCAiK3IiIChwaXgyKSwgIj1yIiAodG1wKQorICAgICAgICA6ICJyIiAoc3RyaWRlKSwgIm0iIChoKQorICAgICAgICA6ICIlZWN4Iik7CisKKyAgICByZXR1cm4gdG1wICYgMHg3RkZGOworfQorI3VuZGVmIFNVTQorCitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgcm91bmRfdGFiKVszXSA9IHsKKyAgICAweDAwMDAwMDAwMDAwMDAwMDBVTEwsCisgICAgMHgwMDAxMDAwMTAwMDEwMDAxVUxMLAorICAgIDB4MDAwMjAwMDIwMDAyMDAwMlVMTCwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYWQ4XzFfbW14KHVpbnQ4X3QgKmJsazEsIHVpbnQ4X3QgKmJsazIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICB4ODZfcmVnIGxlbiA9IC1zdHJpZGUgKiBoOworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMCAgICBcblx0IgorICAgICAgICAibW92cSAoJTIsICUlIlJFR19hIiksICUlbW0yICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglMiwgJSUiUkVHX2EiKSwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgImFkZCAlMywgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAlJW1tMCwgJSVtbTIgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICUlbW00LCAlJW1tMCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMSAgICBcblx0IgorICAgICAgICAibW92cSAoJTIsICUlIlJFR19hIiksICUlbW0zICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglMiwgJSUiUkVHX2EiKSwgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgJSVtbTEsICUlbW0zICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAlJW1tNSwgJSVtbTEgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBvciAlJW1tMSwgJSVtbTMgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0zLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMSAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0zICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTIgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTAsICUlbW02ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJTMsICUlIlJFR19hIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIiBqcyAxYiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6ICIrYSIgKGxlbikKKyAgICAgICAgOiAiciIgKGJsazEgLSBsZW4pLCAiciIgKGJsazIgLSBsZW4pLCAiciIgKHN0cmlkZSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2FkOF8yX21teCh1aW50OF90ICpibGsxYSwgdWludDhfdCAqYmxrMWIsIHVpbnQ4X3QgKmJsazIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICB4ODZfcmVnIGxlbiA9IC1zdHJpZGUgKiBoOworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMCAgICBcblx0IgorICAgICAgICAibW92cSAoJTIsICUlIlJFR19hIiksICUlbW0xICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglMSwgJSUiUkVHX2EiKSwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUyLCAlJSJSRUdfYSIpLCAlJW1tMyAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMCAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTIgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMyAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMyAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJTMsICUlIlJFR19hIiksICUlbW00ICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglMywgJSUiUkVHX2EiKSwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW0zICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsdyAkMSwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmx3ICQxLCAlJW1tMyAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3Vzd2IgJSVtbTMsICUlbW0xICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICUlbW0xLCAlJW1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgJSVtbTIsICUlbW0xICAgICAgICAgICBcblx0IgorICAgICAgICAicG9yICUlbW00LCAlJW1tMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMSAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tNiAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICU0LCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIganMgMWIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiAiK2EiIChsZW4pCisgICAgICAgIDogInIiIChibGsxYSAtIGxlbiksICJyIiAoYmxrMWIgLSBsZW4pLCAiciIgKGJsazIgLSBsZW4pLAorICAgICAgICAgICJyIiAoc3RyaWRlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYWQ4XzRfbW14KHVpbnQ4X3QgKmJsazEsIHVpbnQ4X3QgKmJsazIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICB4ODZfcmVnIGxlbiA9IC1zdHJpZGUgKiBoOworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibW92cSAgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMCAgIFxuXHQiCisgICAgICAgICJtb3ZxIDEoJTEsICUlIlJFR19hIiksICUlbW0yICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0wICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTEgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0zICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIucDJhbGlnbiA0ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgKCUyLCAlJSJSRUdfYSIpLCAlJW1tMiAgIFxuXHQiCisgICAgICAgICJtb3ZxIDEoJTIsICUlIlJFR19hIiksICUlbW00ICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNCAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW01ICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW00LCAlJW1tMiAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW0zICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICU1LCAlJW1tNSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJTMsICUlIlJFR19hIiksICUlbW00ICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglMywgJSUiUkVHX2EiKSwgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgInBzcmx3ICQyLCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHcgJDIsICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXN3YiAlJW1tMSwgJSVtbTAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgJSVtbTAsICUlbW00ICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgJSVtbTQsICUlbW0wICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW00ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMCAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW00ICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tNiAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTQsICUlbW02ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICUlbW0zLCAlJW1tMSAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICU0LCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIganMgMWIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiAiK2EiIChsZW4pCisgICAgICAgIDogInIiIChibGsxIC0gbGVuKSwgInIiIChibGsxIC0gbGVuICsgc3RyaWRlKSwgInIiIChibGsyIC0gbGVuKSwKKyAgICAgICAgICAiciIgKHN0cmlkZSksICJtIiAocm91bmRfdGFiWzJdKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN1bV9tbXgodm9pZCkKK3sKKyAgICBpbnQgcmV0OworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JscSAkMzIsICUlbW02ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tNiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JscSAkMTYsICUlbW02ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tNiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tNiwgJTAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogIj1yIiAocmV0KSk7CisgICAgcmV0dXJuIHJldCAmIDB4RkZGRjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhZDhfeDJhX21teCh1aW50OF90ICpibGsxLCB1aW50OF90ICpibGsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBzYWQ4XzJfbW14KGJsazEsIGJsazEgKyAxLCBibGsyLCBzdHJpZGUsIGgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2FkOF95MmFfbW14KHVpbnQ4X3QgKmJsazEsIHVpbnQ4X3QgKmJsazIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQoreworICAgIHNhZDhfMl9tbXgoYmxrMSwgYmxrMSArIHN0cmlkZSwgYmxrMiwgc3RyaWRlLCBoKTsKK30KKworI2RlZmluZSBQSVhfU0FEKHN1ZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCBzYWQ4XyAjIyBzdWYoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKmJsazIsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYmxrMSwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2Fzc2VydDIoaCA9PSA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW02ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYWQ4XzFfICMjIHN1ZihibGsxLCBibGsyLCBzdHJpZGUsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3VtXyAjIyBzdWYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbnQgc2FkOF94Ml8gIyMgc3VmKE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpibGsyLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJsazEsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdl9hc3NlcnQyKGggPT0gOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJweG9yICUlbW03LCAlJW1tNyAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJweG9yICUlbW02LCAlJW1tNiAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJtb3ZxICUwLCAlJW1tNSAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDo6ICJtIiAocm91bmRfdGFiWzFdKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2FkOF94MmFfICMjIHN1ZihibGsxLCBibGsyLCBzdHJpZGUsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHN1bV8gIyMgc3VmKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IHNhZDhfeTJfICMjIHN1ZihNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqYmxrMiwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpibGsxLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZfYXNzZXJ0MihoID09IDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHhvciAlJW1tNywgJSVtbTcgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTYgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92cSAlMCwgJSVtbTUgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6OiAibSIgKHJvdW5kX3RhYlsxXSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNhZDhfeTJhXyAjIyBzdWYoYmxrMSwgYmxrMiwgc3RyaWRlLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzdW1fICMjIHN1ZigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCBzYWQ4X3h5Ml8gIyMgc3VmKE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpibGsyLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJsazEsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2Fzc2VydDIoaCA9PSA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW02ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOjopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYWQ4XzRfICMjIHN1ZihibGsxLCBibGsyLCBzdHJpZGUsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3VtXyAjIyBzdWYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbnQgc2FkMTZfICMjIHN1ZihNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqYmxrMiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpibGsxLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW02ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYWQ4XzFfICMjIHN1ZihibGsxLCAgICAgYmxrMiwgICAgIHN0cmlkZSwgaCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYWQ4XzFfICMjIHN1ZihibGsxICsgOCwgYmxrMiArIDgsIHN0cmlkZSwgaCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3VtXyAjIyBzdWYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbnQgc2FkMTZfeDJfICMjIHN1ZihNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqYmxrMiwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpibGsxLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW02ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgJTAsICUlbW01ICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOjogIm0iIChyb3VuZF90YWJbMV0pKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYWQ4X3gyYV8gIyMgc3VmKGJsazEsICAgICBibGsyLCAgICAgc3RyaWRlLCBoKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYWQ4X3gyYV8gIyMgc3VmKGJsazEgKyA4LCBibGsyICsgOCwgc3RyaWRlLCBoKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3VtXyAjIyBzdWYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbnQgc2FkMTZfeTJfICMjIHN1ZihNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqYmxrMiwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpibGsxLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW02ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgJTAsICUlbW01ICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOjogIm0iIChyb3VuZF90YWJbMV0pKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYWQ4X3kyYV8gIyMgc3VmKGJsazEsICAgICBibGsyLCAgICAgc3RyaWRlLCBoKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYWQ4X3kyYV8gIyMgc3VmKGJsazEgKyA4LCBibGsyICsgOCwgc3RyaWRlLCBoKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3VtXyAjIyBzdWYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbnQgc2FkMTZfeHkyXyAjIyBzdWYoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKmJsazIsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYmxrMSwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW02ICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOjopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYWQ4XzRfICMjIHN1ZihibGsxLCAgICAgYmxrMiwgICAgIHN0cmlkZSwgaCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYWQ4XzRfICMjIHN1ZihibGsxICsgOCwgYmxrMiArIDgsIHN0cmlkZSwgaCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3VtXyAjIyBzdWYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworUElYX1NBRChtbXgpCisKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworYXZfY29sZCB2b2lkIGZmX21lX2NtcF9pbml0X3g4NihNRUNtcENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisjaWYgSEFWRV9JTkxJTkVfQVNNCisgICAgaWYgKElOTElORV9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5waXhfYWJzWzBdWzBdID0gc2FkMTZfbW14OworICAgICAgICBjLT5waXhfYWJzWzBdWzFdID0gc2FkMTZfeDJfbW14OworICAgICAgICBjLT5waXhfYWJzWzBdWzJdID0gc2FkMTZfeTJfbW14OworICAgICAgICBjLT5waXhfYWJzWzBdWzNdID0gc2FkMTZfeHkyX21teDsKKyAgICAgICAgYy0+cGl4X2Fic1sxXVswXSA9IHNhZDhfbW14OworICAgICAgICBjLT5waXhfYWJzWzFdWzFdID0gc2FkOF94Ml9tbXg7CisgICAgICAgIGMtPnBpeF9hYnNbMV1bMl0gPSBzYWQ4X3kyX21teDsKKyAgICAgICAgYy0+cGl4X2Fic1sxXVszXSA9IHNhZDhfeHkyX21teDsKKworICAgICAgICBjLT5zYWRbMF0gPSBzYWQxNl9tbXg7CisgICAgICAgIGMtPnNhZFsxXSA9IHNhZDhfbW14OworCisgICAgICAgIGMtPnZzYWRbNF0gPSB2c2FkX2ludHJhMTZfbW14OworCisgICAgICAgIGlmICghKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKSB7CisgICAgICAgICAgICBjLT52c2FkWzBdID0gdnNhZDE2X21teDsKKyAgICAgICAgfQorICAgIH0KKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCisgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmhhZGFtYXJkOF9kaWZmWzBdID0gZmZfaGFkYW1hcmQ4X2RpZmYxNl9tbXg7CisgICAgICAgIGMtPmhhZGFtYXJkOF9kaWZmWzFdID0gZmZfaGFkYW1hcmQ4X2RpZmZfbW14OworICAgICAgICBjLT5zdW1fYWJzX2RjdGVsZW0gICA9IGZmX3N1bV9hYnNfZGN0ZWxlbV9tbXg7CisgICAgICAgIGMtPnNzZVswXSAgICAgICAgICAgID0gZmZfc3NlMTZfbW14OworICAgICAgICBjLT5zc2VbMV0gICAgICAgICAgICA9IGZmX3NzZThfbW14OworI2lmIEhBVkVfWUFTTQorICAgICAgICBjLT5uc3NlWzBdICAgICAgICAgICA9IG5zc2UxNl9tbXg7CisgICAgICAgIGMtPm5zc2VbMV0gICAgICAgICAgID0gbnNzZThfbW14OworI2VuZGlmCisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmhhZGFtYXJkOF9kaWZmWzBdID0gZmZfaGFkYW1hcmQ4X2RpZmYxNl9tbXhleHQ7CisgICAgICAgIGMtPmhhZGFtYXJkOF9kaWZmWzFdID0gZmZfaGFkYW1hcmQ4X2RpZmZfbW14ZXh0OworICAgICAgICBjLT5zdW1fYWJzX2RjdGVsZW0gICA9IGZmX3N1bV9hYnNfZGN0ZWxlbV9tbXhleHQ7CisKKyAgICAgICAgYy0+c2FkWzBdID0gZmZfc2FkMTZfbW14ZXh0OworICAgICAgICBjLT5zYWRbMV0gPSBmZl9zYWQ4X21teGV4dDsKKworICAgICAgICBjLT5waXhfYWJzWzBdWzBdID0gZmZfc2FkMTZfbW14ZXh0OworICAgICAgICBjLT5waXhfYWJzWzBdWzFdID0gZmZfc2FkMTZfeDJfbW14ZXh0OworICAgICAgICBjLT5waXhfYWJzWzBdWzJdID0gZmZfc2FkMTZfeTJfbW14ZXh0OworICAgICAgICBjLT5waXhfYWJzWzFdWzBdID0gZmZfc2FkOF9tbXhleHQ7CisgICAgICAgIGMtPnBpeF9hYnNbMV1bMV0gPSBmZl9zYWQ4X3gyX21teGV4dDsKKyAgICAgICAgYy0+cGl4X2Fic1sxXVsyXSA9IGZmX3NhZDhfeTJfbW14ZXh0OworCisgICAgICAgIGMtPnZzYWRbNF0gPSBmZl92c2FkX2ludHJhMTZfbW14ZXh0OworICAgICAgICBjLT52c2FkWzVdID0gZmZfdnNhZF9pbnRyYThfbW14ZXh0OworCisgICAgICAgIGlmICghKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKSB7CisgICAgICAgICAgICBjLT5waXhfYWJzWzBdWzNdID0gZmZfc2FkMTZfYXBwcm94X3h5Ml9tbXhleHQ7CisgICAgICAgICAgICBjLT5waXhfYWJzWzFdWzNdID0gZmZfc2FkOF9hcHByb3hfeHkyX21teGV4dDsKKworICAgICAgICAgICAgYy0+dnNhZFswXSA9IGZmX3ZzYWQxNl9hcHByb3hfbW14ZXh0OworICAgICAgICAgICAgYy0+dnNhZFsxXSA9IGZmX3ZzYWQ4X2FwcHJveF9tbXhleHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnNzZVswXSA9IGZmX3NzZTE2X3NzZTI7CisgICAgICAgIGMtPnN1bV9hYnNfZGN0ZWxlbSAgID0gZmZfc3VtX2Fic19kY3RlbGVtX3NzZTI7CisKKyNpZiBIQVZFX0FMSUdORURfU1RBQ0sKKyAgICAgICAgYy0+aGFkYW1hcmQ4X2RpZmZbMF0gPSBmZl9oYWRhbWFyZDhfZGlmZjE2X3NzZTI7CisgICAgICAgIGMtPmhhZGFtYXJkOF9kaWZmWzFdID0gZmZfaGFkYW1hcmQ4X2RpZmZfc3NlMjsKKyNlbmRpZgorICAgICAgICBpZiAoIShjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19TU0UyU0xPVykgJiYgYXZjdHgtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1NOT1cpIHsKKyAgICAgICAgICAgIGMtPnNhZFswXSAgICAgICAgPSBmZl9zYWQxNl9zc2UyOworICAgICAgICAgICAgYy0+cGl4X2Fic1swXVswXSA9IGZmX3NhZDE2X3NzZTI7CisgICAgICAgICAgICBjLT5waXhfYWJzWzBdWzFdID0gZmZfc2FkMTZfeDJfc3NlMjsKKyAgICAgICAgICAgIGMtPnBpeF9hYnNbMF1bMl0gPSBmZl9zYWQxNl95Ml9zc2UyOworCisgICAgICAgICAgICBjLT52c2FkWzRdICAgICAgID0gZmZfdnNhZF9pbnRyYTE2X3NzZTI7CisgICAgICAgICAgICBpZiAoIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKSkgeworICAgICAgICAgICAgICAgIGMtPnBpeF9hYnNbMF1bM10gPSBmZl9zYWQxNl9hcHByb3hfeHkyX3NzZTI7CisgICAgICAgICAgICAgICAgYy0+dnNhZFswXSAgICAgICA9IGZmX3ZzYWQxNl9hcHByb3hfc3NlMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnN1bV9hYnNfZGN0ZWxlbSAgID0gZmZfc3VtX2Fic19kY3RlbGVtX3Nzc2UzOworI2lmIEhBVkVfQUxJR05FRF9TVEFDSworICAgICAgICBjLT5oYWRhbWFyZDhfZGlmZlswXSA9IGZmX2hhZGFtYXJkOF9kaWZmMTZfc3NzZTM7CisgICAgICAgIGMtPmhhZGFtYXJkOF9kaWZmWzFdID0gZmZfaGFkYW1hcmQ4X2RpZmZfc3NzZTM7CisjZW5kaWYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvbWxwZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tbHBkc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNjU2YWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbWxwZHNwLmFzbQpAQCAtMCwwICsxLDE5NiBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogU0lNRC1vcHRpbWl6ZWQgTUxQIERTUCBmdW5jdGlvbnMKKzsqIENvcHlyaWdodCAoYykgMjAxNCBKYW1lcyBBbG1lciA8amFtcmlhbEBnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9URVhUCisKKyVpZiBBUkNIX1g4Nl82NAorCislbWFjcm8gU0hMWCAyCislaWYgY3B1ZmxhZyhibWkyKQorICAgc2hseCAlMSwgJTEsICUycQorJWVsc2UKKyAgIHNobCAgJTEsICUyYgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFJFTUFUUklYIDAKKyAgICBtb3ZkcWEgICAgICAgIG0wLCBbc2FtcGxlc3FdCisgICAgbW92ZHFhICAgICAgICBtMSwgW2NvZWZmc3EgXQorICAgIHBzaHVmZCAgICAgICAgbTIsIG0wLCBxMjMwMQorICAgIHBzaHVmZCAgICAgICAgbTMsIG0xLCBxMjMwMQorICAgIHBtdWxkcSAgICAgICAgbTAsIG0xCisgICAgcG11bGRxICAgICAgICBtMywgbTIKKyAgICBwYWRkcSAgICAgICAgIG0wLCBtMworJWlmIG5vdGNwdWZsYWcoYXZ4MikKKyAgICBtb3ZkcWEgICAgICAgIG0xLCBbc2FtcGxlc3EgKyAxNl0KKyAgICBtb3ZkcWEgICAgICAgIG0yLCBbY29lZmZzcSAgKyAxNl0KKyAgICBwc2h1ZmQgICAgICAgIG0zLCBtMSwgcTIzMDEKKyAgICBwc2h1ZmQgICAgICAgIG00LCBtMiwgcTIzMDEKKyAgICBwbXVsZHEgICAgICAgIG0xLCBtMgorICAgIHBtdWxkcSAgICAgICAgbTQsIG0zCisgICAgcGFkZHEgICAgICAgICBtMCwgbTEKKyAgICBwYWRkcSAgICAgICAgIG0wLCBtNAorJWVsc2UKKyAgICB2ZXh0cmFjdGkxMjggeG0xLCBtMCwgMQorICAgIHBhZGRxICAgICAgICB4bTAsIHhtMQorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIExPT1BfRU5EIDAKKyAgICBwc2h1ZmQgICAgICAgeG0xLCB4bTAsIHEwMDMyCisgICAgcGFkZHEgICAgICAgIHhtMCwgeG0xCisgICAgbW92cSAgICAgIGFjY3VtcSwgeG0wCisgICAgbW92enggICAgIGJsc2JzZCwgYnl0ZSBbYmxzYnNfcHRycV0gICAgICAgICAgICAgOyBsb2FkICpieXBhc3NlZF9sc2JzCisgICAgc2FyICAgICAgIGFjY3VtcSwgMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhY2N1bSA+Pj0gMTQKKyAgICBhbmQgICAgICAgYWNjdW1kLCBtYXNrZCAgICAgICAgICAgICAgICAgICAgICAgICA7IGFjY3VtICY9IG1hc2sKKyAgICBhZGQgICAgICAgYWNjdW1kLCBibHNic2QgICAgICAgICAgICAgICAgICAgICAgICA7IGFjY3VtICs9ICpieXBhc3NlZF9sc2JzCisgICAgbW92ICAgW3NhbXBsZXNxICsgZGVzdF9jaHFdLCBhY2N1bWQgICAgICAgICAgICAgOyBzYW1wbGVzW2Rlc3RfY2hdID0gYWNjdW0KKyAgICBhZGQgICBibHNic19wdHJxLCA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGJ5cGFzc2VkX2xzYnMgKz0gTUFYX0NIQU5ORUxTOworICAgIGFkZCAgICAgc2FtcGxlc3EsIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2FtcGxlcyArPSBNQVhfQ0hBTk5FTFM7CisgICAgY21wICAgYmxzYnNfcHRycSwgY250cQorJWVuZG1hY3JvCisKKyVtYWNybyBMT09QX1NISUZUX0VORCAwCisgICAgcHNodWZkICAgICAgIHhtMSwgeG0wLCBxMDAzMgorICAgIHBhZGRxICAgICAgICB4bTAsIHhtMQorICAgIG1vdnEgICAgICBhY2N1bXEsIHhtMAorICAgIGFuZCAgICAgICBpbmRleGQsIGF1c3BkICAgICAgICAgICAgICAgICAgICAgICAgIDsgaW5kZXggJj0gYWNjZXNzX3VuaXRfc2l6ZV9wb3cyOworICAgIG1vdnN4ICAgICBub2lzZXEsIGJ5dGUgW25vaXNlX2J1ZmZlcnEgKyBpbmRleHFdIDsgbG9hZCBub2lzZV9idWZmZXJbaW5kZXhdCisgICAgYWRkICAgICAgIGluZGV4ZCwgaW5kZXgyZCAgICAgICAgICAgICAgICAgICAgICAgOyBpbmRleCArPSBpbmRleDIKKyAgICBTSExYICAgICAgbm9pc2VxLCBtbnMgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG5vaXNlX2J1ZmZlcltpbmRleF0gPDw9IG1hdHJpeF9ub2lzZV9zaGlmdAorICAgIGFkZCAgICAgICBhY2N1bXEsIG5vaXNlcSAgICAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW0gKz0gbm9pc2VfYnVmZmVyW2luZGV4XQorICAgIG1vdnp4ICAgICBub2lzZWQsIGJ5dGUgW2Jsc2JzX3B0cnFdICAgICAgICAgICAgIDsgbG9hZCAqYnlwYXNzZWRfbHNicyAocmV1c2UgdG1wIG5vaXNlIHJlZ2lzdGVyKQorICAgIHNhciAgICAgICBhY2N1bXEsIDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWNjdW0gPj49IDE0CisgICAgYW5kICAgICAgIGFjY3VtZCwgbWFza2QgICAgICAgICAgICAgICAgICAgICAgICAgOyBhY2N1bSAmPSBtYXNrCisgICAgYWRkICAgICAgIGFjY3VtZCwgbm9pc2VkICAgICAgICAgICAgICAgICAgICAgICAgOyBhY2N1bSArPSAqYnlwYXNzZWRfbHNicworICAgIG1vdiAgIFtzYW1wbGVzcSArIGRlc3RfY2hxXSwgYWNjdW1kICAgICAgICAgICAgIDsgc2FtcGxlc1tkZXN0X2NoXSA9IGFjY3VtCisgICAgYWRkICAgYmxzYnNfcHRycSwgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBieXBhc3NlZF9sc2JzICs9IE1BWF9DSEFOTkVMUzsKKyAgICBhZGQgICAgIHNhbXBsZXNxLCAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHNhbXBsZXMgKz0gTUFYX0NIQU5ORUxTOworICAgIGNtcCAgIGJsc2JzX3B0cnEsIGNudHEKKyVlbmRtYWNybworCis7dm9pZCBmZl9tbHBfcmVtYXRyaXhfY2hhbm5lbChpbnQzMl90ICpzYW1wbGVzLCBjb25zdCBpbnQzMl90ICpjb2VmZnMsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpieXBhc3NlZF9sc2JzLCBjb25zdCBpbnQ4X3QgKm5vaXNlX2J1ZmZlciwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgdW5zaWduZWQgaW50IGRlc3RfY2gsIHVpbnQxNl90IGJsb2NrcG9zLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heGNoYW4sIGludCBtYXRyaXhfbm9pc2Vfc2hpZnQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNjZXNzX3VuaXRfc2l6ZV9wb3cyLCBpbnQzMl90IG1hc2spCislbWFjcm8gTUxQX1JFTUFUUklYX0NIQU5ORUwgMAorY2dsb2JhbCBtbHBfcmVtYXRyaXhfY2hhbm5lbCwgMCwgMTMsIDUsIHNhbXBsZXMsIGNvZWZmcywgYmxzYnNfcHRyLCBibHNicywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBkZXN0X2NoLCBibG9ja3BvcywgbWF4Y2hhbiwgbW5zLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW0sIG1hc2ssIGNudAorICAgIG1vdiAgICAgICAgIG1uc2QsIG1uc20gICAgICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCBtYXRyaXhfbm9pc2Vfc2hpZnQKKyAgICBtb3Z6eCAgYmxvY2twb3NxLCB3b3JkIGJsb2NrcG9zbSAgICAgICAgICAgICAgICA7IGxvYWQgYW5kIHplcm8gZXh0ZW5kIGJsb2NrcG9zICgxNmJpdCkKKyAgICBtb3YgICAgIG1heGNoYW5kLCBtYXhjaGFubSAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgbWF4Y2hhbgorICAgIG1vdiAgICAgICAgbWFza2QsIG1hc2ttICAgICAgICAgICAgICAgICAgICAgICAgIDsgbG9hZCBtYXNrCislaWYgV0lONjQKKyAgICBtb3YgICAgIGRlc3RfY2hkLCBkZXN0X2NobSAgICAgICAgICAgICAgICAgICAgICA7IGxvYWQgZGVzdF9jaGQgKG5vdCBuZWVkZWQgb24gVU5JWDY0KQorJWVuZGlmCisgICAgc2hsICAgICBkZXN0X2NoZCwgMgorICAgIGxlYSAgICAgICAgIGNudHEsIFtibHNic19wdHJxICsgYmxvY2twb3NxKjhdCisgICAgdGVzdCAgICAgICAgbW5zZCwgbW5zZCAgICAgICAgICAgICAgICAgICAgICAgICAgOyBpcyBtYXRyaXhfbm9pc2Vfc2hpZnQgIT0gMD8KKyAgICBqbmUgLnNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGp1bXAgaWYgdHJ1ZQorICAgIGNtcCAgICAgbWF4Y2hhbmQsIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgaXMgbWF4Y2hhbiA8IDQ/CisgICAgamwgLmxvb3A0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBqdW1wIGlmIHRydWUKKworYWxpZ24gMTYKKy5sb29wODoKKyAgICA7IFByb2Nlc3MgNSBvciBtb3JlIGNoYW5uZWxzCisgICAgUkVNQVRSSVgKKyAgICBMT09QX0VORAorICAgIGpuZSAubG9vcDgKKyAgICBSRVQKKworYWxpZ24gMTYKKy5sb29wNDoKKyAgICA7IFByb2Nlc3MgdXAgdG8gNCBjaGFubmVscworICAgIG1vdmRxYSAgICAgICB4bTAsIFtzYW1wbGVzcV0KKyAgICBtb3ZkcWEgICAgICAgeG0xLCBbY29lZmZzcSBdCisgICAgcHNodWZkICAgICAgIHhtMiwgeG0wLCBxMjMwMQorICAgIHBzaHVmZCAgICAgICB4bTMsIHhtMSwgcTIzMDEKKyAgICBwbXVsZHEgICAgICAgeG0wLCB4bTEKKyAgICBwbXVsZHEgICAgICAgeG0zLCB4bTIKKyAgICBwYWRkcSAgICAgICAgeG0wLCB4bTMKKyAgICBMT09QX0VORAorICAgIGpuZSAubG9vcDQKKyAgICBSRVQKKworLnNoaWZ0OgorJWlmIFdJTjY0CisgICAgbW92ICAgICAgIGluZGV4ZCwgaW5kZXhtICAgICAgICAgOyBsb2FkIGluZGV4IChub3QgbmVlZGVkIG9uIFVOSVg2NCkKKyVlbmRpZgorICAgIG1vdiAgICAgICAgICByOWQsIHI5bSAgICAgICAgICAgIDsgbG9hZCBhY2Nlc3NfdW5pdF9zaXplX3BvdzIKKyVpZiBjcHVmbGFnKGJtaTIpCisgICAgOyBibWkyIGhhcyBzaGlmdCBmdW5jdGlvbnMgdGhhdCBhY2NlcHQgYW55IGdwciwgbm90IGp1c3QgY2wsIHNvIGtlZXAgdGhpbmdzIGluIHBsYWNlLgorICAgIERFRklORV9BUkdTIHNhbXBsZXMsIGNvZWZmcywgYmxzYnNfcHRyLCBub2lzZV9idWZmZXIsIFwKKyAgICAgICAgICAgICAgICBpbmRleCwgZGVzdF9jaCwgYWNjdW0sIGluZGV4MiwgbW5zLCBcCisgICAgICAgICAgICAgICAgYXVzcCwgbWFzaywgY250LCBub2lzZQorICAgIGFkZCAgICAgICAgIG1uc2QsIDcgICAgICAgICAgICAgIDsgbWF0cml4X25vaXNlX3NoaWZ0ICs9IDcKKyVlbHNlIDsgc3NlNAorICAgIG1vdiAgICAgICAgICAgcjYsIHJjeCAgICAgICAgICAgIDsgbW92ZSByY3ggZWxzZXdoZXJlIHNvIHdlIGNhbiB1c2UgY2wgZm9yIG1hdHJpeF9ub2lzZV9zaGlmdAorJWlmIFdJTjY0CisgICAgOyByMCA9IHJjeAorICAgIERFRklORV9BUkdTIG1ucywgY29lZmZzLCBibHNic19wdHIsIG5vaXNlX2J1ZmZlciwgaW5kZXgsIGRlc3RfY2gsIHNhbXBsZXMsIFwKKyAgICAgICAgICAgICAgICBpbmRleDIsIGFjY3VtLCBhdXNwLCBtYXNrLCBjbnQsIG5vaXNlCislZWxzZSA7IFVOSVg2NAorICAgIDsgcjMgPSByY3gKKyAgICBERUZJTkVfQVJHUyBzYW1wbGVzLCBjb2VmZnMsIGJsc2JzX3B0ciwgbW5zLCBpbmRleCwgZGVzdF9jaCwgbm9pc2VfYnVmZmVyLCBcCisgICAgICAgICAgICAgICAgaW5kZXgyLCBhY2N1bSwgYXVzcCwgbWFzaywgY250LCBub2lzZQorJWVuZGlmCisgICAgbGVhICAgICAgICAgbW5zZCwgW3I4ICsgN10gICAgICAgOyByY3ggPSBtYXRyaXhfbm9pc2Vfc2hpZnQgKyA3CislZW5kaWYgOyBjcHVmbGFnCisgICAgc3ViICAgICAgICBhdXNwZCwgMSAgICAgICAgICAgICAgOyBhY2Nlc3NfdW5pdF9zaXplX3BvdzIgLT0gMQorICAgIGNtcCAgICAgICAgICByN2QsIDQgICAgICAgICAgICAgIDsgaXMgbWF4Y2hhbiA8IDQ/CisgICAgbGVhICAgICAgaW5kZXgycSwgW2luZGV4cSoyICsgMV0gOyBpbmRleDIgPSAyICogaW5kZXggKyAxOworICAgIGpsIC5sb29wNF9zaGlmdCAgICAgICAgICAgICAgICAgIDsganVtcCBpZiBtYXhjaGFuIDwgNAorCithbGlnbiAxNgorLmxvb3A4X3NoaWZ0OgorICAgIDsgUHJvY2VzcyA1IG9yIG1vcmUgY2hhbm5lbHMKKyAgICBSRU1BVFJJWAorICAgIExPT1BfU0hJRlRfRU5ECisgICAgam5lIC5sb29wOF9zaGlmdAorICAgIFJFVAorCithbGlnbiAxNgorLmxvb3A0X3NoaWZ0OgorICAgIDsgUHJvY2VzcyB1cCB0byA0IGNoYW5uZWxzCisgICAgbW92ZHFhICAgICAgIHhtMCwgW3NhbXBsZXNxXQorICAgIG1vdmRxYSAgICAgICB4bTEsIFtjb2VmZnNxIF0KKyAgICBwc2h1ZmQgICAgICAgeG0yLCB4bTAsIHEyMzAxCisgICAgcHNodWZkICAgICAgIHhtMywgeG0xLCBxMjMwMQorICAgIHBtdWxkcSAgICAgICB4bTAsIHhtMQorICAgIHBtdWxkcSAgICAgICB4bTMsIHhtMgorICAgIHBhZGRxICAgICAgICB4bTAsIHhtMworICAgIExPT1BfU0hJRlRfRU5ECisgICAgam5lIC5sb29wNF9zaGlmdAorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTQKK01MUF9SRU1BVFJJWF9DSEFOTkVMCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyLCBibWkyCitNTFBfUkVNQVRSSVhfQ0hBTk5FTAorJWVuZGlmCisKKyVlbmRpZiA7IEFSQ0hfWDg2XzY0CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvbWxwZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tbHBkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMGJjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbWxwZHNwX2luaXQuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIE1MUCBEU1AgZnVuY3Rpb25zIHg4Ni1vcHRpbWl6ZWQKKyAqIENvcHlyaWdodCAoYykgMjAwOSBSYW1pcm8gUG9sbGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21scGRzcC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWxwLmgiCisKKyNkZWZpbmUgUkVNQVRSSVhfQ0hBTk5FTF9GVU5DKG9wdCkgXAordm9pZCBmZl9tbHBfcmVtYXRyaXhfY2hhbm5lbF8jI29wdChpbnQzMl90ICpzYW1wbGVzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmNvZWZmcywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpieXBhc3NlZF9sc2JzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqbm9pc2VfYnVmZmVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9jaCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBibG9ja3BvcywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF4Y2hhbiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF0cml4X25vaXNlX3NoaWZ0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2Nlc3NfdW5pdF9zaXplX3BvdzIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXNrKTsKKworUkVNQVRSSVhfQ0hBTk5FTF9GVU5DKHNzZTQpCitSRU1BVFJJWF9DSEFOTkVMX0ZVTkMoYXZ4Ml9ibWkyKQorCisjaWYgSEFWRV83UkVHUyAmJiBIQVZFX0lOTElORV9BU00gJiYgSEFWRV9JTkxJTkVfQVNNX05PTkxPQ0FMX0xBQkVMUworCitleHRlcm4gY2hhciBmZl9tbHBfZmlyb3JkZXJfODsKK2V4dGVybiBjaGFyIGZmX21scF9maXJvcmRlcl83OworZXh0ZXJuIGNoYXIgZmZfbWxwX2Zpcm9yZGVyXzY7CitleHRlcm4gY2hhciBmZl9tbHBfZmlyb3JkZXJfNTsKK2V4dGVybiBjaGFyIGZmX21scF9maXJvcmRlcl80OworZXh0ZXJuIGNoYXIgZmZfbWxwX2Zpcm9yZGVyXzM7CitleHRlcm4gY2hhciBmZl9tbHBfZmlyb3JkZXJfMjsKK2V4dGVybiBjaGFyIGZmX21scF9maXJvcmRlcl8xOworZXh0ZXJuIGNoYXIgZmZfbWxwX2Zpcm9yZGVyXzA7CisKK2V4dGVybiBjaGFyIGZmX21scF9paXJvcmRlcl80OworZXh0ZXJuIGNoYXIgZmZfbWxwX2lpcm9yZGVyXzM7CitleHRlcm4gY2hhciBmZl9tbHBfaWlyb3JkZXJfMjsKK2V4dGVybiBjaGFyIGZmX21scF9paXJvcmRlcl8xOworZXh0ZXJuIGNoYXIgZmZfbWxwX2lpcm9yZGVyXzA7CisKK3N0YXRpYyBjb25zdCB2b2lkICogY29uc3QgZmlydGFibGVbOV0gPSB7ICZmZl9tbHBfZmlyb3JkZXJfMCwgJmZmX21scF9maXJvcmRlcl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmZfbWxwX2Zpcm9yZGVyXzIsICZmZl9tbHBfZmlyb3JkZXJfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21scF9maXJvcmRlcl80LCAmZmZfbWxwX2Zpcm9yZGVyXzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZl9tbHBfZmlyb3JkZXJfNiwgJmZmX21scF9maXJvcmRlcl83LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmZfbWxwX2Zpcm9yZGVyXzggfTsKK3N0YXRpYyBjb25zdCB2b2lkICogY29uc3QgaWlydGFibGVbNV0gPSB7ICZmZl9tbHBfaWlyb3JkZXJfMCwgJmZmX21scF9paXJvcmRlcl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmZfbWxwX2lpcm9yZGVyXzIsICZmZl9tbHBfaWlyb3JkZXJfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21scF9paXJvcmRlcl80IH07CisKKyNpZiBBUkNIX1g4Nl82NAorCisjZGVmaW5lIE1MUE1VTChsYWJlbCwgb2Zmc2V0LCBvZmZzLCBvZmZjKSAgIFwKKyAgICBMQUJFTF9NQU5HTEUobGFiZWwpIjogICAgICAgICAgICAgXG5cdCIgXAorICAgICJtb3ZzbHEgIm9mZnNldCIrIm9mZnMiKCUwKSwgJSVyYXhcblx0IiBcCisgICAgIm1vdnNscSAib2Zmc2V0Iisib2ZmYyIoJTEpLCAlJXJkeFxuXHQiIFwKKyAgICAiaW11bCAgICAgICAgICAgICAgICAgJSVyZHgsICUlcmF4XG5cdCIgXAorICAgICJhZGQgICAgICAgICAgICAgICAgICAlJXJheCwgJSVyc2lcblx0IgorCisjZGVmaW5lIEZJUk1VTFJFRyhsYWJlbCwgb2Zmc2V0LCBmaXJjKVwKKyAgICBMQUJFTF9NQU5HTEUobGFiZWwpIjogICAgICAgXG5cdCIgXAorICAgICJtb3ZzbHEgIiNvZmZzZXQiKCUwKSwgJSVyYXhcblx0IiBcCisgICAgImltdWwgICAgICAgICUiI2ZpcmMiLCAlJXJheFxuXHQiIFwKKyAgICAiYWRkICAgICAgICAgICAgJSVyYXgsICUlcnNpXG5cdCIKKworI2RlZmluZSBDTEVBUl9BQ0NVTSAgICAgICAgICAgICAgICAgICBcCisgICAgInhvciAgICAgICAgICAgICUlcnNpLCAlJXJzaVxuXHQiCisKKyNkZWZpbmUgU0hJRlRfQUNDVU0gICAgICAgICAgICAgICAgICAgXAorICAgICJzaHIgICAgICUlY2wsICAgICAgICAgJSVyc2lcblx0IgorCisjZGVmaW5lIEFDQ1VNICAgICIlJXJkeCIKKyNkZWZpbmUgUkVTVUxUICAgIiUlcnNpIgorI2RlZmluZSBSRVNVTFQzMiAiJSVlc2kiCisKKyNlbHNlIC8qIGlmIEFSQ0hfWDg2XzMyICovCisKKyNkZWZpbmUgTUxQTVVMKGxhYmVsLCBvZmZzZXQsIG9mZnMsIG9mZmMpICBcCisgICAgTEFCRUxfTUFOR0xFKGxhYmVsKSI6ICAgICAgICAgICAgXG5cdCIgXAorICAgICJtb3YgICAib2Zmc2V0Iisib2ZmcyIoJTApLCAlJWVheFxuXHQiIFwKKyAgICAiaW11bGwgIm9mZnNldCIrIm9mZmMiKCUxKSAgICAgICBcblx0IiBcCisgICAgImFkZCAgICAgICAgICAgICAgICAlJWVheCAsICUlZXNpXG5cdCIgXAorICAgICJhZGMgICAgICAgICAgICAgICAgJSVlZHggLCAlJWVjeFxuXHQiCisKKyNkZWZpbmUgRklSTVVMUkVHKGxhYmVsLCBvZmZzZXQsIGZpcmMpICBcCisgICAgTUxQTVVMKGxhYmVsLCAjb2Zmc2V0LCAiMCIsICIwIikKKworI2RlZmluZSBDTEVBUl9BQ0NVTSAgICAgICAgICAgICAgICAgIFwKKyAgICAieG9yICAgICAgICAgICAlJWVzaSwgJSVlc2lcblx0IiBcCisgICAgInhvciAgICAgICAgICAgJSVlY3gsICUlZWN4XG5cdCIKKworI2RlZmluZSBTSElGVF9BQ0NVTSAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgICAgICAgICAlJWVjeCwgJSVlZHhcblx0IiBcCisgICAgIm1vdiAgICAgICAgICAgJSVlc2ksICUlZWF4XG5cdCIgXAorICAgICJtb3Z6YmwgICAgICAgICU3ICAgLCAlJWVjeFxuXHQiIFwKKyAgICAic2hyZCAgICAlJWNsLCAlJWVkeCwgJSVlYXhcblx0IiBcCisKKyNkZWZpbmUgQUNDVU0gICAgIiUlZWR4IgorI2RlZmluZSBSRVNVTFQgICAiJSVlYXgiCisjZGVmaW5lIFJFU1VMVDMyICIlJWVheCIKKworI2VuZGlmIC8qICFBUkNIX1g4Nl82NCAqLworCisjZGVmaW5lIEJJTkMgIEFWX1NUUklOR0lGWSg0KiBNQVhfQ0hBTk5FTFMpCisjZGVmaW5lIElPRkZTIEFWX1NUUklOR0lGWSg0KihNQVhfRklSX09SREVSICsgTUFYX0JMT0NLU0laRSkpCisjZGVmaW5lIElPRkZDIEFWX1NUUklOR0lGWSg0KiBNQVhfRklSX09SREVSKQorCisjZGVmaW5lIEZJUk1VTChsYWJlbCwgb2Zmc2V0KSBNTFBNVUwobGFiZWwsICNvZmZzZXQsICAgIjAiLCAgICIwIikKKyNkZWZpbmUgSUlSTVVMKGxhYmVsLCBvZmZzZXQpIE1MUE1VTChsYWJlbCwgI29mZnNldCwgSU9GRlMsIElPRkZDKQorCitzdGF0aWMgdm9pZCBtbHBfZmlsdGVyX2NoYW5uZWxfeDg2KGludDMyX3QgKnN0YXRlLCBjb25zdCBpbnQzMl90ICpjb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcm9yZGVyLCBpbnQgaWlyb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmaWx0ZXJfc2hpZnQsIGludDMyX3QgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2Nrc2l6ZSwgaW50MzJfdCAqc2FtcGxlX2J1ZmZlcikKK3sKKyAgICBjb25zdCB2b2lkICpmaXJqdW1wID0gZmlydGFibGVbZmlyb3JkZXJdOworICAgIGNvbnN0IHZvaWQgKmlpcmp1bXAgPSBpaXJ0YWJsZVtpaXJvcmRlcl07CisKKyAgICBibG9ja3NpemUgPSAtYmxvY2tzaXplOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgQ0xFQVJfQUNDVU0KKyAgICAgICAgImptcCAgKiU1ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgRklSTVVMICAgKGZmX21scF9maXJvcmRlcl84LCAweDFjICAgKQorICAgICAgICBGSVJNVUwgICAoZmZfbWxwX2Zpcm9yZGVyXzcsIDB4MTggICApCisgICAgICAgIEZJUk1VTCAgIChmZl9tbHBfZmlyb3JkZXJfNiwgMHgxNCAgICkKKyAgICAgICAgRklSTVVMICAgKGZmX21scF9maXJvcmRlcl81LCAweDEwICAgKQorICAgICAgICBGSVJNVUwgICAoZmZfbWxwX2Zpcm9yZGVyXzQsIDB4MGMgICApCisgICAgICAgIEZJUk1VTFJFRyhmZl9tbHBfZmlyb3JkZXJfMywgMHgwOCwxMCkKKyAgICAgICAgRklSTVVMUkVHKGZmX21scF9maXJvcmRlcl8yLCAweDA0LCA5KQorICAgICAgICBGSVJNVUxSRUcoZmZfbWxwX2Zpcm9yZGVyXzEsIDB4MDAsIDgpCisgICAgICAgIExBQkVMX01BTkdMRShmZl9tbHBfZmlyb3JkZXJfMCkiOlxuXHQiCisgICAgICAgICJqbXAgIColNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIElJUk1VTCAgIChmZl9tbHBfaWlyb3JkZXJfNCwgMHgwYyAgICkKKyAgICAgICAgSUlSTVVMICAgKGZmX21scF9paXJvcmRlcl8zLCAweDA4ICAgKQorICAgICAgICBJSVJNVUwgICAoZmZfbWxwX2lpcm9yZGVyXzIsIDB4MDQgICApCisgICAgICAgIElJUk1VTCAgIChmZl9tbHBfaWlyb3JkZXJfMSwgMHgwMCAgICkKKyAgICAgICAgTEFCRUxfTUFOR0xFKGZmX21scF9paXJvcmRlcl8wKSI6XG5cdCIKKyAgICAgICAgU0hJRlRfQUNDVU0KKyAgICAgICAgIm1vdiAgIlJFU1VMVCIgICwiQUNDVU0iICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgKCUyKSAgICAgICwiUkVTVUxUIiAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICU0ICAgICAgICwiUkVTVUxUIiAgICAgXG5cdCIKKyAgICAgICAgInN1YiAgICQ0ICAgICAgICwgICUwICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgIlJFU1VMVDMyIiwgKCUwKSAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgIlJFU1VMVDMyIiwgKCUyKSAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAkIkJJTkMiICAgICwgICUyICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YiAgIkFDQ1VNIiAgICwiUkVTVUxUIiAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgIlJFU1VMVDMyIiwiSU9GRlMiKCUwKSAgXG5cdCIKKyAgICAgICAgImluY2wgICAgICAgICAgICAgICUzICAgICAgICAgXG5cdCIKKyAgICAgICAgImpzIDFiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiAvKiAwKi8iK3IiKHN0YXRlKSwKKyAgICAgICAgICAvKiAxKi8iK3IiKGNvZWZmKSwKKyAgICAgICAgICAvKiAyKi8iK3IiKHNhbXBsZV9idWZmZXIpLAorI2lmIEFSQ0hfWDg2XzY0CisgICAgICAgICAgLyogMyovIityIihibG9ja3NpemUpCisgICAgICAgIDogLyogNCovInIiKCh4ODZfcmVnKW1hc2spLCAvKiA1Ki8iciIoZmlyanVtcCksCisgICAgICAgICAgLyogNiovInIiKGlpcmp1bXApICAgICAgLCAvKiA3Ki8iYyIoZmlsdGVyX3NoaWZ0KQorICAgICAgICAsIC8qIDgqLyJyIigoaW50NjRfdCljb2VmZlswXSkKKyAgICAgICAgLCAvKiA5Ki8iciIoKGludDY0X3QpY29lZmZbMV0pCisgICAgICAgICwgLyoxMCovInIiKChpbnQ2NF90KWNvZWZmWzJdKQorICAgICAgICA6ICJyYXgiLCAicmR4IiwgInJzaSIKKyNlbHNlIC8qIEFSQ0hfWDg2XzMyICovCisgICAgICAgICAgLyogMyovIittIihibG9ja3NpemUpCisgICAgICAgIDogLyogNCovIm0iKCAgICAgICAgIG1hc2spLCAvKiA1Ki8ibSIoZmlyanVtcCksCisgICAgICAgICAgLyogNiovIm0iKGlpcmp1bXApICAgICAgLCAvKiA3Ki8ibSIoZmlsdGVyX3NoaWZ0KQorICAgICAgICA6ICJlYXgiLCAiZWR4IiwgImVzaSIsICJlY3giCisjZW5kaWYgLyogIUFSQ0hfWDg2XzY0ICovCisgICAgKTsKK30KKworI2VuZGlmIC8qIEhBVkVfN1JFR1MgJiYgSEFWRV9JTkxJTkVfQVNNICovCisKK2F2X2NvbGQgdm9pZCBmZl9tbHBkc3BfaW5pdF94ODYoTUxQRFNQQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworI2lmIEhBVkVfN1JFR1MgJiYgSEFWRV9JTkxJTkVfQVNNICYmIEhBVkVfSU5MSU5FX0FTTV9OT05MT0NBTF9MQUJFTFMKKyAgICBpZiAoSU5MSU5FX01NWChjcHVfZmxhZ3MpKQorICAgICAgICBjLT5tbHBfZmlsdGVyX2NoYW5uZWwgPSBtbHBfZmlsdGVyX2NoYW5uZWxfeDg2OworI2VuZGlmCisgICAgaWYgKEFSQ0hfWDg2XzY0ICYmIEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkKKyAgICAgICAgYy0+bWxwX3JlbWF0cml4X2NoYW5uZWwgPSBmZl9tbHBfcmVtYXRyaXhfY2hhbm5lbF9zc2U0OworICAgIGlmIChBUkNIX1g4Nl82NCAmJiBFWFRFUk5BTF9BVlgyKGNwdV9mbGFncykgJiYgY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfQk1JMikKKyAgICAgICAgYy0+bWxwX3JlbWF0cml4X2NoYW5uZWwgPSBmZl9tbHBfcmVtYXRyaXhfY2hhbm5lbF9hdngyX2JtaTI7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvbXBlZ2F1ZGlvZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbXBlZ2F1ZGlvZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyMzE2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tcGVnYXVkaW9kc3AuYwpAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIFNJTUQtb3B0aW1pemVkIE1QMyBkZWNvZGluZyBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAxMCBWaXRvciBTZXNzYWsKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWdhdWRpb2RzcC5oIgorCisjZGVmaW5lIERFQ0woQ1BVKVwKK3N0YXRpYyB2b2lkIGltZGN0MzZfYmxvY2tzXyAjIyBDUFUoZmxvYXQgKm91dCwgZmxvYXQgKmJ1ZiwgZmxvYXQgKmluLCBpbnQgY291bnQsIGludCBzd2l0Y2hfcG9pbnQsIGludCBibG9ja190eXBlKTtcCit2b2lkIGZmX2ltZGN0MzZfZmxvYXRfICMjIENQVShmbG9hdCAqb3V0LCBmbG9hdCAqYnVmLCBmbG9hdCAqaW4sIGZsb2F0ICp3aW4pOworCisjaWYgQVJDSF9YODZfMzIKK0RFQ0woc3NlKQorI2VuZGlmCitERUNMKHNzZTIpCitERUNMKHNzZTMpCitERUNMKHNzc2UzKQorREVDTChhdngpCisKK3ZvaWQgZmZfZm91cl9pbWRjdDM2X2Zsb2F0X3NzZShmbG9hdCAqb3V0LCBmbG9hdCAqYnVmLCBmbG9hdCAqaW4sIGZsb2F0ICp3aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnRtcGJ1Zik7Cit2b2lkIGZmX2ZvdXJfaW1kY3QzNl9mbG9hdF9hdngoZmxvYXQgKm91dCwgZmxvYXQgKmJ1ZiwgZmxvYXQgKmluLCBmbG9hdCAqd2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICp0bXBidWYpOworCitERUNMQVJFX0FMSUdORUQoMTYsIHN0YXRpYyBmbG9hdCwgbWRjdF93aW5fc3NlKVsyXVs0XVs0KjQwXTsKKworI2lmIEhBVkVfNlJFR1MgJiYgSEFWRV9TU0VfSU5MSU5FCisKKyNkZWZpbmUgTUFDUyhydCwgcmEsIHJiKSBydCs9KHJhKSoocmIpCisjZGVmaW5lIE1MU1MocnQsIHJhLCByYikgcnQtPShyYSkqKHJiKQorCisjZGVmaW5lIFNVTTgob3AsIHN1bSwgdywgcCkgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3Aoc3VtLCAodylbMCAqIDY0XSwgKHApWzAgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbMSAqIDY0XSwgKHApWzEgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbMiAqIDY0XSwgKHApWzIgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbMyAqIDY0XSwgKHApWzMgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNCAqIDY0XSwgKHApWzQgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNSAqIDY0XSwgKHApWzUgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNiAqIDY0XSwgKHApWzYgKiA2NF0pOyAgICBcCisgICAgb3Aoc3VtLCAodylbNyAqIDY0XSwgKHApWzcgKiA2NF0pOyAgICBcCit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X3dpbmRvdyhjb25zdCBmbG9hdCAqYnVmLCBjb25zdCBmbG9hdCAqd2luMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqd2luMiwgZmxvYXQgKnN1bTEsIGZsb2F0ICpzdW0yLCBpbnQgbGVuKQoreworICAgIHg4Nl9yZWcgY291bnQgPSAtIDQqbGVuOworICAgIGNvbnN0IGZsb2F0ICp3aW4xYSA9IHdpbjErbGVuOworICAgIGNvbnN0IGZsb2F0ICp3aW4yYSA9IHdpbjIrbGVuOworICAgIGNvbnN0IGZsb2F0ICpidWZhICA9IGJ1ZitsZW47CisgICAgZmxvYXQgKnN1bTFhID0gc3VtMStsZW47CisgICAgZmxvYXQgKnN1bTJhID0gc3VtMitsZW47CisKKworI2RlZmluZSBNVUxUKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZhcHMgIiAjYSAiKCUxLCUwKSwgJSV4bW0xICAgICAgICAgICBcblx0IiAgXAorICAgICJtb3ZhcHMgIiAjYSAiKCUzLCUwKSwgJSV4bW0yICAgICAgICAgICBcblx0IiAgXAorICAgICJtdWxwcyAgICAgICAgICUleG1tMiwgJSV4bW0xICAgICAgICAgICBcblx0IiAgXAorICAgICJzdWJwcyAgICAgICAgICUleG1tMSwgJSV4bW0wICAgICAgICAgICBcblx0IiAgXAorICAgICJtdWxwcyAgIiAjYiAiKCUyLCUwKSwgJSV4bW0yICAgICAgICAgICBcblx0IiAgXAorICAgICJzdWJwcyAgICAgICAgICUleG1tMiwgJSV4bW00ICAgICAgICAgICBcblx0IiAgXAorCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJ4b3JwcyAgICAgICAlJXhtbTAsICUleG1tMCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJ4b3JwcyAgICAgICAlJXhtbTQsICUleG1tNCAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgTVVMVCggICAwLCAgIDApCisgICAgICAgICAgICBNVUxUKCAyNTYsICA2NCkKKyAgICAgICAgICAgIE1VTFQoIDUxMiwgMTI4KQorICAgICAgICAgICAgTVVMVCggNzY4LCAxOTIpCisgICAgICAgICAgICBNVUxUKDEwMjQsIDI1NikKKyAgICAgICAgICAgIE1VTFQoMTI4MCwgMzIwKQorICAgICAgICAgICAgTVVMVCgxNTM2LCAzODQpCisgICAgICAgICAgICBNVUxUKDE3OTIsIDQ0OCkKKworICAgICAgICAgICAgIm1vdmFwcyAgICAgICUleG1tMCwgKCU0LCUwKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmFwcyAgICAgICUleG1tNCwgKCU1LCUwKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZCAgICAgICAgICAgICQxNiwgICUwICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImpsICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgOiIrJnIiKGNvdW50KQorICAgICAgICAgICAgOiJyIih3aW4xYSksICJyIih3aW4yYSksICJyIihidWZhKSwgInIiKHN1bTFhKSwgInIiKHN1bTJhKQorICAgICAgICAgICAgKTsKKworI3VuZGVmIE1VTFQKK30KKworc3RhdGljIHZvaWQgYXBwbHlfd2luZG93X21wMyhmbG9hdCAqaW4sIGZsb2F0ICp3aW4sIGludCAqdW51c2VkLCBmbG9hdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5jcikKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCBzdW1hLCBbMTddKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCBzdW1iLCBbMTddKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCBzdW1jLCBbMTddKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCBzdW1kLCBbMTddKTsKKworICAgIGZsb2F0IHN1bTsKKworICAgIC8qIGNvcHkgdG8gYXZvaWQgd3JhcCAqLworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibW92YXBzICAgIDAoJTApLCAlJXhtbTAgICBcblx0IiBcCisgICAgICAgICAgICAibW92YXBzICAgMTYoJTApLCAlJXhtbTEgICBcblx0IiBcCisgICAgICAgICAgICAibW92YXBzICAgMzIoJTApLCAlJXhtbTIgICBcblx0IiBcCisgICAgICAgICAgICAibW92YXBzICAgNDgoJTApLCAlJXhtbTMgICBcblx0IiBcCisgICAgICAgICAgICAibW92YXBzICAgJSV4bW0wLCAgIDAoJTEpIFxuXHQiIFwKKyAgICAgICAgICAgICJtb3ZhcHMgICAlJXhtbTEsICAxNiglMSkgXG5cdCIgXAorICAgICAgICAgICAgIm1vdmFwcyAgICUleG1tMiwgIDMyKCUxKSBcblx0IiBcCisgICAgICAgICAgICAibW92YXBzICAgJSV4bW0zLCAgNDgoJTEpIFxuXHQiIFwKKyAgICAgICAgICAgICJtb3ZhcHMgICA2NCglMCksICUleG1tMCAgIFxuXHQiIFwKKyAgICAgICAgICAgICJtb3ZhcHMgICA4MCglMCksICUleG1tMSAgIFxuXHQiIFwKKyAgICAgICAgICAgICJtb3ZhcHMgICA5NiglMCksICUleG1tMiAgIFxuXHQiIFwKKyAgICAgICAgICAgICJtb3ZhcHMgIDExMiglMCksICUleG1tMyAgIFxuXHQiIFwKKyAgICAgICAgICAgICJtb3ZhcHMgICAlJXhtbTAsICA2NCglMSkgXG5cdCIgXAorICAgICAgICAgICAgIm1vdmFwcyAgICUleG1tMSwgIDgwKCUxKSBcblx0IiBcCisgICAgICAgICAgICAibW92YXBzICAgJSV4bW0yLCAgOTYoJTEpIFxuXHQiIFwKKyAgICAgICAgICAgICJtb3ZhcHMgICAlJXhtbTMsIDExMiglMSkgXG5cdCIKKyAgICAgICAgICAgIDo6InIiKGluKSwgInIiKGluKzUxMikKKyAgICAgICAgICAgIDoibWVtb3J5IgorICAgICAgICAgICAgKTsKKworICAgIGFwcGx5X3dpbmRvdyhpbiArIDE2LCB3aW4gICAgICwgd2luICsgNTEyLCBzdW1hLCBzdW1jLCAxNik7CisgICAgYXBwbHlfd2luZG93KGluICsgMzIsIHdpbiArIDQ4LCB3aW4gKyA2NDAsIHN1bWIsIHN1bWQsIDE2KTsKKworICAgIFNVTTgoTUFDUywgc3VtYVswXSwgd2luICsgMzIsIGluICsgNDgpOworCisgICAgc3VtY1sgMF0gPSAwOworICAgIHN1bWJbMTZdID0gMDsKKyAgICBzdW1kWzE2XSA9IDA7CisKKyNkZWZpbmUgU1VNUyhzdW1hLCBzdW1iLCBzdW1jLCBzdW1kLCBvdXQxLCBvdXQyKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJtb3Z1cHMgIiAjc3VtZCAiKCU0KSwgICAgICAgJSV4bW0wICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgICAgICJzaHVmcHMgICAgICAgICAkMHgxYiwgICAgICAgJSV4bW0wLCAlJXhtbTAgIFxuXHQiIFwKKyAgICAgICAgICAgICJzdWJwcyAgIiAjc3VtYSAiKCUxKSwgICAgICAgJSV4bW0wICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgICAgICJtb3ZhcHMgICAgICAgICUleG1tMCwiICNvdXQxICIoJTApICAgICAgICAgIFxuXHQiIFwKK1wKKyAgICAgICAgICAgICJtb3Z1cHMgIiAjc3VtYyAiKCUzKSwgICAgICAgJSV4bW0wICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgICAgICJzaHVmcHMgICAgICAgICAkMHgxYiwgICAgICAgJSV4bW0wLCAlJXhtbTAgIFxuXHQiIFwKKyAgICAgICAgICAgICJhZGRwcyAgIiAjc3VtYiAiKCUyKSwgICAgICAgJSV4bW0wICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgICAgICJtb3ZhcHMgICAgICAgICUleG1tMCwiICNvdXQyICIoJTApICAgICAgICAgIFxuXHQiCisKKyAgICBpZiAoaW5jciA9PSAxKSB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICBTVU1TKCAwLCA0OCwgIDQsIDUyLCAgMCwgMTEyKQorICAgICAgICAgICAgU1VNUygxNiwgMzIsIDIwLCAzNiwgMTYsICA5NikKKyAgICAgICAgICAgIFNVTVMoMzIsIDE2LCAzNiwgMjAsIDMyLCAgODApCisgICAgICAgICAgICBTVU1TKDQ4LCAgMCwgNTIsICA0LCA0OCwgIDY0KQorCisgICAgICAgICAgICA6IismciIob3V0KQorICAgICAgICAgICAgOiJyIigmc3VtYVswXSksICJyIigmc3VtYlswXSksICJyIigmc3VtY1swXSksICJyIigmc3VtZFswXSkKKyAgICAgICAgICAgIDoibWVtb3J5IgorICAgICAgICAgICAgKTsKKyAgICAgICAgb3V0ICs9IDE2KmluY3I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZsb2F0ICpvdXQyID0gb3V0ICsgMzIgKiBpbmNyOworICAgICAgICBvdXRbMCAgXSAgPSAtc3VtYVsgICAwXTsKKyAgICAgICAgb3V0ICs9IGluY3I7CisgICAgICAgIG91dDIgLT0gaW5jcjsKKyAgICAgICAgZm9yKGo9MTtqPDE2O2orKykgeworICAgICAgICAgICAgKm91dCAgPSAtc3VtYVsgICBqXSArIHN1bWRbMTYtal07CisgICAgICAgICAgICAqb3V0MiA9ICBzdW1iWzE2LWpdICsgc3VtY1sgICBqXTsKKyAgICAgICAgICAgIG91dCAgKz0gaW5jcjsKKyAgICAgICAgICAgIG91dDIgLT0gaW5jcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN1bSA9IDA7CisgICAgU1VNOChNTFNTLCBzdW0sIHdpbiArIDE2ICsgMzIsIGluICsgMzIpOworICAgICpvdXQgPSBzdW07Cit9CisKKyNlbmRpZiAvKiBIQVZFXzZSRUdTICYmIEhBVkVfU1NFX0lOTElORSAqLworCisjaWYgSEFWRV9ZQVNNCisjZGVmaW5lIERFQ0xfSU1EQ1RfQkxPQ0tTKENQVTEsIENQVTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgaW1kY3QzNl9ibG9ja3NfICMjIENQVTEoZmxvYXQgKm91dCwgZmxvYXQgKmJ1ZiwgZmxvYXQgKmluLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCBzd2l0Y2hfcG9pbnQsIGludCBibG9ja190eXBlKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBhbGlnbl9lbmQgPSBjb3VudCAtIChjb3VudCAmIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaiA9IDA7IGogPCBhbGlnbl9lbmQ7IGorPSA0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCB0bXBidWYsIFsxMDI0XSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmbG9hdCAqd2luID0gbWRjdF93aW5fc3NlW3N3aXRjaF9wb2ludCAmJiBqIDwgNF1bYmxvY2tfdHlwZV07ICAgXAorICAgICAgICAvKiBhcHBseSB3aW5kb3cgJiBvdmVybGFwIHdpdGggcHJldmlvdXMgYnVmZmVyICovICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBzZWxlY3Qgd2luZG93ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmZl9mb3VyX2ltZGN0MzZfZmxvYXRfICMjIENQVTIob3V0LCBidWYsIGluLCB3aW4sIHRtcGJ1Zik7ICAgICAgXAorICAgICAgICBpbiAgICAgICs9IDQqMTg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBidWYgICAgICs9IDQqMTg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvdXQgICAgICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoOyBqIDwgY291bnQ7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBhcHBseSB3aW5kb3cgJiBvdmVybGFwIHdpdGggcHJldmlvdXMgYnVmZmVyICovICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBzZWxlY3Qgd2luZG93ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgd2luX2lkeCA9IChzd2l0Y2hfcG9pbnQgJiYgaiA8IDIpID8gMCA6IGJsb2NrX3R5cGU7ICAgICAgICAgXAorICAgICAgICBmbG9hdCAqd2luID0gZmZfbWRjdF93aW5fZmxvYXRbd2luX2lkeCArICg0ICYgLShqICYgMSkpXTsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmZl9pbWRjdDM2X2Zsb2F0XyAjIyBDUFUxKG91dCwgYnVmLCBpbiwgd2luKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbiAgKz0gMTg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBidWYrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvdXQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWYgSEFWRV9TU0UKKyNpZiBBUkNIX1g4Nl8zMgorREVDTF9JTURDVF9CTE9DS1Moc3NlLHNzZSkKKyNlbmRpZgorREVDTF9JTURDVF9CTE9DS1Moc3NlMixzc2UpCitERUNMX0lNRENUX0JMT0NLUyhzc2UzLHNzZSkKK0RFQ0xfSU1EQ1RfQkxPQ0tTKHNzc2UzLHNzZSkKKyNlbmRpZgorI2lmIEhBVkVfQVZYX0VYVEVSTkFMCitERUNMX0lNRENUX0JMT0NLUyhhdngsYXZ4KQorI2VuZGlmCisjZW5kaWYgLyogSEFWRV9ZQVNNICovCisKK2F2X2NvbGQgdm9pZCBmZl9tcGFkc3BfaW5pdF94ODYoTVBBRFNQQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaW50IGksIGo7CisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDA7IGkgKyspIHsKKyAgICAgICAgICAgIG1kY3Rfd2luX3NzZVswXVtqXVs0KmkgICAgXSA9IGZmX21kY3Rfd2luX2Zsb2F0W2ogICAgXVtpXTsKKyAgICAgICAgICAgIG1kY3Rfd2luX3NzZVswXVtqXVs0KmkgKyAxXSA9IGZmX21kY3Rfd2luX2Zsb2F0W2ogKyA0XVtpXTsKKyAgICAgICAgICAgIG1kY3Rfd2luX3NzZVswXVtqXVs0KmkgKyAyXSA9IGZmX21kY3Rfd2luX2Zsb2F0W2ogICAgXVtpXTsKKyAgICAgICAgICAgIG1kY3Rfd2luX3NzZVswXVtqXVs0KmkgKyAzXSA9IGZmX21kY3Rfd2luX2Zsb2F0W2ogKyA0XVtpXTsKKyAgICAgICAgICAgIG1kY3Rfd2luX3NzZVsxXVtqXVs0KmkgICAgXSA9IGZmX21kY3Rfd2luX2Zsb2F0WzAgICAgXVtpXTsKKyAgICAgICAgICAgIG1kY3Rfd2luX3NzZVsxXVtqXVs0KmkgKyAxXSA9IGZmX21kY3Rfd2luX2Zsb2F0WzQgICAgXVtpXTsKKyAgICAgICAgICAgIG1kY3Rfd2luX3NzZVsxXVtqXVs0KmkgKyAyXSA9IGZmX21kY3Rfd2luX2Zsb2F0W2ogICAgXVtpXTsKKyAgICAgICAgICAgIG1kY3Rfd2luX3NzZVsxXVtqXVs0KmkgKyAzXSA9IGZmX21kY3Rfd2luX2Zsb2F0W2ogKyA0XVtpXTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIEhBVkVfNlJFR1MgJiYgSEFWRV9TU0VfSU5MSU5FCisgICAgaWYgKElOTElORV9TU0UoY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5hcHBseV93aW5kb3dfZmxvYXQgPSBhcHBseV93aW5kb3dfbXAzOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX1NTRV9JTkxJTkUgKi8KKworI2lmIEhBVkVfWUFTTQorI2lmIEhBVkVfU1NFCisjaWYgQVJDSF9YODZfMzIKKyAgICBpZiAoRVhURVJOQUxfU1NFKGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+aW1kY3QzNl9ibG9ja3NfZmxvYXQgPSBpbWRjdDM2X2Jsb2Nrc19zc2U7CisgICAgfQorI2VuZGlmCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5pbWRjdDM2X2Jsb2Nrc19mbG9hdCA9IGltZGN0MzZfYmxvY2tzX3NzZTI7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU0UzKGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+aW1kY3QzNl9ibG9ja3NfZmxvYXQgPSBpbWRjdDM2X2Jsb2Nrc19zc2UzOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfU1NTRTMoY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5pbWRjdDM2X2Jsb2Nrc19mbG9hdCA9IGltZGN0MzZfYmxvY2tzX3Nzc2UzOworICAgIH0KKyNlbmRpZgorI2lmIEhBVkVfQVZYX0VYVEVSTkFMCisgICAgaWYgKEVYVEVSTkFMX0FWWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPmltZGN0MzZfYmxvY2tzX2Zsb2F0ID0gaW1kY3QzNl9ibG9ja3NfYXZ4OworICAgIH0KKyNlbmRpZgorI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlby5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDI4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvLmMKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiBPcHRpbWl6ZWQgZm9yIGlhMzIgQ1BVcyBieSBOaWNrIEt1cnNoZXYgPG5pY2tvbHNfa0BtYWlsLnJ1PgorICogaDI2MywgbXBlZzEsIG1wZWcyIGRlcXVhbnRpemVyICYgZHJhd19lZGdlcyBieSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZ3ZpZGVvLmgiCisKKyNpZiBIQVZFX01NWF9JTkxJTkUKKworc3RhdGljIHZvaWQgZGN0X3VucXVhbnRpemVfaDI2M19pbnRyYV9tbXgoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuLCBpbnQgcXNjYWxlKQoreworICAgIHg4Nl9yZWcgbGV2ZWwsIHFtdWwsIHFhZGQsIG5Db2VmZnM7CisKKyAgICBxbXVsID0gcXNjYWxlIDw8IDE7CisKKyAgICBhdl9hc3NlcnQyKHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0+PTAgfHwgcy0+aDI2M19haWMpOworCisgICAgaWYgKCFzLT5oMjYzX2FpYykgeworICAgICAgICBpZiAobiA8IDQpCisgICAgICAgICAgICBsZXZlbCA9IGJsb2NrWzBdICogcy0+eV9kY19zY2FsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGV2ZWwgPSBibG9ja1swXSAqIHMtPmNfZGNfc2NhbGU7CisgICAgICAgIHFhZGQgPSAocXNjYWxlIC0gMSkgfCAxOworICAgIH1lbHNleworICAgICAgICBxYWRkID0gMDsKKyAgICAgICAgbGV2ZWw9IGJsb2NrWzBdOworICAgIH0KKyAgICBpZihzLT5hY19wcmVkKQorICAgICAgICBuQ29lZmZzPTYzOworICAgIGVsc2UKKyAgICAgICAgbkNvZWZmcz0gcy0+aW50ZXJfc2NhbnRhYmxlLnJhc3Rlcl9lbmRbIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gXTsKKworX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibW92ZCAlMSwgJSVtbTYgICAgICAgICAgICAgICAgIFxuXHQiIC8vcW11bAorICAgICAgICAgICAgICAgICJwYWNrc3NkdyAlJW1tNiwgJSVtbTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgJTIsICUlbW01ICAgICAgICAgICAgICAgICBcblx0IiAvL3FhZGQKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tNywgJSVtbTcgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhY2tzc2R3ICUlbW01LCAlJW1tNSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWNrc3NkdyAlJW1tNSwgJSVtbTUgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgJSVtbTUsICUlbW03ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTQsICUlbW00ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICIucDJhbGlnbiA0ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgKCUwLCAlMyksICUlbW0wICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxIDgoJTAsICUzKSwgJSVtbTEgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTYsICUlbW0wICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicG11bGx3ICUlbW02LCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibW92cSAoJTAsICUzKSwgJSVtbTIgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgOCglMCwgJTMpLCAlJW1tMyAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgInBjbXBndHcgJSVtbTQsICUlbW0yICAgICAgICAgICBcblx0IiAvLyBibG9ja1tpXSA8IDAgPyAtMSA6IDAKKyAgICAgICAgICAgICAgICAicGNtcGd0dyAlJW1tNCwgJSVtbTMgICAgICAgICAgIFxuXHQiIC8vIGJsb2NrW2ldIDwgMCA/IC0xIDogMAorCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJweG9yICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgJSVtbTcsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTEsICUlbW0zICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgInBjbXBlcXcgJSVtbTcsICUlbW0wICAgICAgICAgICBcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInBjbXBlcXcgJSVtbTcsICUlbW0xICAgICAgICAgICBcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCisKKyAgICAgICAgICAgICAgICAicGFuZG4gJSVtbTIsICUlbW0wICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhbmRuICUlbW0zLCAlJW1tMSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgIm1vdnEgJSVtbTAsICglMCwgJTMpICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICUlbW0xLCA4KCUwLCAlMykgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhZGQgJDE2LCAlMyAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiam5nIDFiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOjoiciIgKGJsb2NrK25Db2VmZnMpLCAicm0iKHFtdWwpLCAicm0iIChxYWRkKSwgInIiICgyKigtbkNvZWZmcykpCisgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgICAgICBibG9ja1swXT0gbGV2ZWw7Cit9CisKKworc3RhdGljIHZvaWQgZGN0X3VucXVhbnRpemVfaDI2M19pbnRlcl9tbXgoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuLCBpbnQgcXNjYWxlKQoreworICAgIHg4Nl9yZWcgcW11bCwgcWFkZCwgbkNvZWZmczsKKworICAgIHFtdWwgPSBxc2NhbGUgPDwgMTsKKyAgICBxYWRkID0gKHFzY2FsZSAtIDEpIHwgMTsKKworICAgIGF2X2Fzc2VydDIocy0+YmxvY2tfbGFzdF9pbmRleFtuXT49MCB8fCBzLT5oMjYzX2FpYyk7CisKKyAgICBuQ29lZmZzPSBzLT5pbnRlcl9zY2FudGFibGUucmFzdGVyX2VuZFsgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSBdOworCitfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgICAgICJtb3ZkICUxLCAlJW1tNiAgICAgICAgICAgICAgICAgXG5cdCIgLy9xbXVsCisgICAgICAgICAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tNiAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWNrc3NkdyAlJW1tNiwgJSVtbTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZCAlMiwgJSVtbTUgICAgICAgICAgICAgICAgIFxuXHQiIC8vcWFkZAorICAgICAgICAgICAgICAgICJweG9yICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFja3NzZHcgJSVtbTUsICUlbW01ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhY2tzc2R3ICUlbW01LCAlJW1tNSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3VidyAlJW1tNSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tNCwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIi5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAoJTAsICUzKSwgJSVtbTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgOCglMCwgJTMpLCAlJW1tMSAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgInBtdWxsdyAlJW1tNiwgJSVtbTAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTYsICUlbW0xICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJtb3ZxICglMCwgJTMpLCAlJW1tMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSA4KCUwLCAlMyksICUlbW0zICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAicGNtcGd0dyAlJW1tNCwgJSVtbTIgICAgICAgICAgIFxuXHQiIC8vIGJsb2NrW2ldIDwgMCA/IC0xIDogMAorICAgICAgICAgICAgICAgICJwY21wZ3R3ICUlbW00LCAlJW1tMyAgICAgICAgICAgXG5cdCIgLy8gYmxvY2tbaV0gPCAwID8gLTEgOiAwCisKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTMsICUlbW0xICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgInBhZGR3ICUlbW03LCAlJW1tMCAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTEgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJweG9yICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tMSwgJSVtbTMgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAicGNtcGVxdyAlJW1tNywgJSVtbTAgICAgICAgICAgIFxuXHQiIC8vIGJsb2NrW2ldID09IDAgPyAtMSA6IDAKKyAgICAgICAgICAgICAgICAicGNtcGVxdyAlJW1tNywgJSVtbTEgICAgICAgICAgIFxuXHQiIC8vIGJsb2NrW2ldID09IDAgPyAtMSA6IDAKKworICAgICAgICAgICAgICAgICJwYW5kbiAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFuZG4gJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAibW92cSAlJW1tMCwgKCUwLCAlMykgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgJSVtbTEsIDgoJTAsICUzKSAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFkZCAkMTYsICUzICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJqbmcgMWIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6OiJyIiAoYmxvY2srbkNvZWZmcyksICJybSIocW11bCksICJybSIgKHFhZGQpLCAiciIgKDIqKC1uQ29lZmZzKSkKKyAgICAgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7Cit9CisKK3N0YXRpYyB2b2lkIGRjdF91bnF1YW50aXplX21wZWcxX2ludHJhX21teChNcGVnRW5jQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IG4sIGludCBxc2NhbGUpCit7CisgICAgeDg2X3JlZyBuQ29lZmZzOworICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXg7CisgICAgaW50IGJsb2NrMDsKKworICAgIGF2X2Fzc2VydDIocy0+YmxvY2tfbGFzdF9pbmRleFtuXT49MCk7CisKKyAgICBuQ29lZmZzPSBzLT5pbnRyYV9zY2FudGFibGUucmFzdGVyX2VuZFsgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSBdKzE7CisKKyAgICBpZiAobiA8IDQpCisgICAgICAgIGJsb2NrMCA9IGJsb2NrWzBdICogcy0+eV9kY19zY2FsZTsKKyAgICBlbHNlCisgICAgICAgIGJsb2NrMCA9IGJsb2NrWzBdICogcy0+Y19kY19zY2FsZTsKKyAgICAvKiBYWFg6IG9ubHkgbXBlZzEgKi8KKyAgICBxdWFudF9tYXRyaXggPSBzLT5pbnRyYV9tYXRyaXg7CitfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgICAgICJwY21wZXF3ICUlbW03LCAlJW1tNyAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNybHcgJDE1LCAlJW1tNyAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgJTIsICUlbW02ICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWNrc3NkdyAlJW1tNiwgJSVtbTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAlMywgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICIucDJhbGlnbiA0ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIpLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxIDgoJTAsICUlIlJFR19hIiksICUlbW0xICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAoJTEsICUlIlJFR19hIiksICUlbW00ICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgOCglMSwgJSUiUkVHX2EiKSwgJSVtbTUgICBcblx0IgorICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTYsICUlbW00ICAgICAgICAgICAgXG5cdCIgLy8gcT1xc2NhbGUqcXVhbnRfbWF0cml4W2ldCisgICAgICAgICAgICAgICAgInBtdWxsdyAlJW1tNiwgJSVtbTUgICAgICAgICAgICBcblx0IiAvLyBxPXFzY2FsZSpxdWFudF9tYXRyaXhbaV0KKyAgICAgICAgICAgICAgICAicHhvciAlJW1tMiwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTMsICUlbW0zICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwY21wZ3R3ICUlbW0wLCAlJW1tMiAgICAgICAgICAgXG5cdCIgLy8gYmxvY2tbaV0gPCAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInBjbXBndHcgJSVtbTEsICUlbW0zICAgICAgICAgICBcblx0IiAvLyBibG9ja1tpXSA8IDAgPyAtMSA6IDAKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTMsICUlbW0xICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLy8gYWJzKGJsb2NrW2ldKQorICAgICAgICAgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLy8gYWJzKGJsb2NrW2ldKQorICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTQsICUlbW0wICAgICAgICAgICAgXG5cdCIgLy8gYWJzKGJsb2NrW2ldKSpxCisgICAgICAgICAgICAgICAgInBtdWxsdyAlJW1tNSwgJSVtbTEgICAgICAgICAgICBcblx0IiAvLyBhYnMoYmxvY2tbaV0pKnEKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tNCwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTUsICUlbW01ICAgICAgICAgICAgICBcblx0IiAvLyBGSVhNRSBzbG93CisgICAgICAgICAgICAgICAgInBjbXBlcXcgKCUwLCAlJSJSRUdfYSIpLCAlJW1tNCBcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInBjbXBlcXcgOCglMCwgJSUiUkVHX2EiKSwgJSVtbTVcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInBzcmF3ICQzLCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3JhdyAkMywgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgJSVtbTcsICUlbW0wICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzdWJ3ICUlbW03LCAlJW1tMSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwb3IgJSVtbTcsICUlbW0wICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicG9yICUlbW03LCAlJW1tMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJweG9yICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYW5kbiAlJW1tMCwgJSVtbTQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFuZG4gJSVtbTEsICUlbW01ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgJSVtbTQsICglMCwgJSUiUkVHX2EiKSAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICUlbW01LCA4KCUwLCAlJSJSRUdfYSIpICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhZGQgJDE2LCAlJSJSRUdfYSIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAianMgMWIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOjoiciIgKGJsb2NrK25Db2VmZnMpLCAiciIocXVhbnRfbWF0cml4K25Db2VmZnMpLCAicm0iIChxc2NhbGUpLCAiZyIgKC0yKm5Db2VmZnMpCisgICAgICAgICAgICAgICAgOiAiJSJSRUdfYSwgIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICBibG9ja1swXT0gYmxvY2swOworfQorCitzdGF0aWMgdm9pZCBkY3RfdW5xdWFudGl6ZV9tcGVnMV9pbnRlcl9tbXgoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuLCBpbnQgcXNjYWxlKQoreworICAgIHg4Nl9yZWcgbkNvZWZmczsKKyAgICBjb25zdCB1aW50MTZfdCAqcXVhbnRfbWF0cml4OworCisgICAgYXZfYXNzZXJ0MihzLT5ibG9ja19sYXN0X2luZGV4W25dPj0wKTsKKworICAgIG5Db2VmZnM9IHMtPmludHJhX3NjYW50YWJsZS5yYXN0ZXJfZW5kWyBzLT5ibG9ja19sYXN0X2luZGV4W25dIF0rMTsKKworICAgICAgICBxdWFudF9tYXRyaXggPSBzLT5pbnRlcl9tYXRyaXg7CitfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgICAgICJwY21wZXF3ICUlbW03LCAlJW1tNyAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNybHcgJDE1LCAlJW1tNyAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgJTIsICUlbW02ICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWNrc3NkdyAlJW1tNiwgJSVtbTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAlMywgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICIucDJhbGlnbiA0ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIpLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxIDgoJTAsICUlIlJFR19hIiksICUlbW0xICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAoJTEsICUlIlJFR19hIiksICUlbW00ICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgOCglMSwgJSUiUkVHX2EiKSwgJSVtbTUgICBcblx0IgorICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTYsICUlbW00ICAgICAgICAgICAgXG5cdCIgLy8gcT1xc2NhbGUqcXVhbnRfbWF0cml4W2ldCisgICAgICAgICAgICAgICAgInBtdWxsdyAlJW1tNiwgJSVtbTUgICAgICAgICAgICBcblx0IiAvLyBxPXFzY2FsZSpxdWFudF9tYXRyaXhbaV0KKyAgICAgICAgICAgICAgICAicHhvciAlJW1tMiwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTMsICUlbW0zICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwY21wZ3R3ICUlbW0wLCAlJW1tMiAgICAgICAgICAgXG5cdCIgLy8gYmxvY2tbaV0gPCAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInBjbXBndHcgJSVtbTEsICUlbW0zICAgICAgICAgICBcblx0IiAvLyBibG9ja1tpXSA8IDAgPyAtMSA6IDAKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTMsICUlbW0xICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLy8gYWJzKGJsb2NrW2ldKQorICAgICAgICAgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLy8gYWJzKGJsb2NrW2ldKQorICAgICAgICAgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLy8gYWJzKGJsb2NrW2ldKSoyCisgICAgICAgICAgICAgICAgInBhZGR3ICUlbW0xLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvLyBhYnMoYmxvY2tbaV0pKjIKKyAgICAgICAgICAgICAgICAicGFkZHcgJSVtbTcsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8vIGFicyhibG9ja1tpXSkqMiArIDEKKyAgICAgICAgICAgICAgICAicGFkZHcgJSVtbTcsICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8vIGFicyhibG9ja1tpXSkqMiArIDEKKyAgICAgICAgICAgICAgICAicG11bGx3ICUlbW00LCAlJW1tMCAgICAgICAgICAgIFxuXHQiIC8vIChhYnMoYmxvY2tbaV0pKjIgKyAxKSpxCisgICAgICAgICAgICAgICAgInBtdWxsdyAlJW1tNSwgJSVtbTEgICAgICAgICAgICBcblx0IiAvLyAoYWJzKGJsb2NrW2ldKSoyICsgMSkqcQorICAgICAgICAgICAgICAgICJweG9yICUlbW00LCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tNSwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8vIEZJWE1FIHNsb3cKKyAgICAgICAgICAgICAgICAicGNtcGVxdyAoJTAsICUlIlJFR19hIiksICUlbW00IFxuXHQiIC8vIGJsb2NrW2ldID09IDAgPyAtMSA6IDAKKyAgICAgICAgICAgICAgICAicGNtcGVxdyA4KCUwLCAlJSJSRUdfYSIpLCAlJW1tNVxuXHQiIC8vIGJsb2NrW2ldID09IDAgPyAtMSA6IDAKKyAgICAgICAgICAgICAgICAicHNyYXcgJDQsICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzcmF3ICQ0LCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3VidyAlJW1tNywgJSVtbTAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgJSVtbTcsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBvciAlJW1tNywgJSVtbTAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwb3IgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTMsICUlbW0xICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhbmRuICUlbW0wLCAlJW1tNCAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYW5kbiAlJW1tMSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAlJW1tNCwgKCUwLCAlJSJSRUdfYSIpICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgJSVtbTUsIDgoJTAsICUlIlJFR19hIikgICBcblx0IgorCisgICAgICAgICAgICAgICAgImFkZCAkMTYsICUlIlJFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJqcyAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6OiJyIiAoYmxvY2srbkNvZWZmcyksICJyIihxdWFudF9tYXRyaXgrbkNvZWZmcyksICJybSIgKHFzY2FsZSksICJnIiAoLTIqbkNvZWZmcykKKyAgICAgICAgICAgICAgICA6ICIlIlJFR19hLCAibWVtb3J5IgorICAgICAgICApOworfQorCitzdGF0aWMgdm9pZCBkY3RfdW5xdWFudGl6ZV9tcGVnMl9pbnRyYV9tbXgoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuLCBpbnQgcXNjYWxlKQoreworICAgIHg4Nl9yZWcgbkNvZWZmczsKKyAgICBjb25zdCB1aW50MTZfdCAqcXVhbnRfbWF0cml4OworICAgIGludCBibG9jazA7CisKKyAgICBhdl9hc3NlcnQyKHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0+PTApOworCisgICAgaWYocy0+YWx0ZXJuYXRlX3NjYW4pIG5Db2VmZnM9IDYzOyAvL0ZJWE1FCisgICAgZWxzZSBuQ29lZmZzPSBzLT5pbnRyYV9zY2FudGFibGUucmFzdGVyX2VuZFsgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSBdOworCisgICAgaWYgKG4gPCA0KQorICAgICAgICBibG9jazAgPSBibG9ja1swXSAqIHMtPnlfZGNfc2NhbGU7CisgICAgZWxzZQorICAgICAgICBibG9jazAgPSBibG9ja1swXSAqIHMtPmNfZGNfc2NhbGU7CisgICAgcXVhbnRfbWF0cml4ID0gcy0+aW50cmFfbWF0cml4OworX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAicGNtcGVxdyAlJW1tNywgJSVtbTcgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzcmx3ICQxNSwgJSVtbTcgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkICUyLCAlJW1tNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tNiAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3YgJTMsICUlIlJFR19hIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2EiKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSA4KCUwLCAlJSJSRUdfYSIpLCAlJW1tMSAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxIDgoJTEsICUlIlJFR19hIiksICUlbW01ICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicG11bGx3ICUlbW02LCAlJW1tNCAgICAgICAgICAgIFxuXHQiIC8vIHE9cXNjYWxlKnF1YW50X21hdHJpeFtpXQorICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTYsICUlbW01ICAgICAgICAgICAgXG5cdCIgLy8gcT1xc2NhbGUqcXVhbnRfbWF0cml4W2ldCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0yICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJweG9yICUlbW0zLCAlJW1tMyAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGNtcGd0dyAlJW1tMCwgJSVtbTIgICAgICAgICAgIFxuXHQiIC8vIGJsb2NrW2ldIDwgMCA/IC0xIDogMAorICAgICAgICAgICAgICAgICJwY21wZ3R3ICUlbW0xLCAlJW1tMyAgICAgICAgICAgXG5cdCIgLy8gYmxvY2tbaV0gPCAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJweG9yICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8vIGFicyhibG9ja1tpXSkKKyAgICAgICAgICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8vIGFicyhibG9ja1tpXSkKKyAgICAgICAgICAgICAgICAicG11bGx3ICUlbW00LCAlJW1tMCAgICAgICAgICAgIFxuXHQiIC8vIGFicyhibG9ja1tpXSkqcQorICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTUsICUlbW0xICAgICAgICAgICAgXG5cdCIgLy8gYWJzKGJsb2NrW2ldKSpxCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTQsICUlbW00ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJweG9yICUlbW01LCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIgLy8gRklYTUUgc2xvdworICAgICAgICAgICAgICAgICJwY21wZXF3ICglMCwgJSUiUkVHX2EiKSwgJSVtbTQgXG5cdCIgLy8gYmxvY2tbaV0gPT0gMCA/IC0xIDogMAorICAgICAgICAgICAgICAgICJwY21wZXF3IDgoJTAsICUlIlJFR19hIiksICUlbW01XG5cdCIgLy8gYmxvY2tbaV0gPT0gMCA/IC0xIDogMAorICAgICAgICAgICAgICAgICJwc3JhdyAkMywgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNyYXcgJDMsICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJweG9yICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYW5kbiAlJW1tMCwgJSVtbTQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFuZG4gJSVtbTEsICUlbW01ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgJSVtbTQsICglMCwgJSUiUkVHX2EiKSAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICUlbW01LCA4KCUwLCAlJSJSRUdfYSIpICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhZGQgJDE2LCAlJSJSRUdfYSIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiam5nIDFiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOjoiciIgKGJsb2NrK25Db2VmZnMpLCAiciIocXVhbnRfbWF0cml4K25Db2VmZnMpLCAicm0iIChxc2NhbGUpLCAiZyIgKC0yKm5Db2VmZnMpCisgICAgICAgICAgICAgICAgOiAiJSJSRUdfYSwgIm1lbW9yeSIKKyAgICAgICAgKTsKKyAgICBibG9ja1swXT0gYmxvY2swOworICAgICAgICAvL05vdGUsIHdlIGRvIG5vdCBkbyBtaXNtYXRjaCBjb250cm9sIGZvciBpbnRyYSBhcyBlcnJvcnMgY2Fubm90IGFjY3VtdWxhdGUKK30KKworc3RhdGljIHZvaWQgZGN0X3VucXVhbnRpemVfbXBlZzJfaW50ZXJfbW14KE1wZWdFbmNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgbiwgaW50IHFzY2FsZSkKK3sKKyAgICB4ODZfcmVnIG5Db2VmZnM7CisgICAgY29uc3QgdWludDE2X3QgKnF1YW50X21hdHJpeDsKKworICAgIGF2X2Fzc2VydDIocy0+YmxvY2tfbGFzdF9pbmRleFtuXT49MCk7CisKKyAgICBpZihzLT5hbHRlcm5hdGVfc2NhbikgbkNvZWZmcz0gNjM7IC8vRklYTUUKKyAgICBlbHNlIG5Db2VmZnM9IHMtPmludHJhX3NjYW50YWJsZS5yYXN0ZXJfZW5kWyBzLT5ibG9ja19sYXN0X2luZGV4W25dIF07CisKKyAgICAgICAgcXVhbnRfbWF0cml4ID0gcy0+aW50ZXJfbWF0cml4OworX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAicGNtcGVxdyAlJW1tNywgJSVtbTcgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzcmxxICQ0OCwgJSVtbTcgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkICUyLCAlJW1tNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tNiAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3YgJTMsICUlIlJFR19hIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2EiKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSA4KCUwLCAlJSJSRUdfYSIpLCAlJW1tMSAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxIDgoJTEsICUlIlJFR19hIiksICUlbW01ICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicG11bGx3ICUlbW02LCAlJW1tNCAgICAgICAgICAgIFxuXHQiIC8vIHE9cXNjYWxlKnF1YW50X21hdHJpeFtpXQorICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTYsICUlbW01ICAgICAgICAgICAgXG5cdCIgLy8gcT1xc2NhbGUqcXVhbnRfbWF0cml4W2ldCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0yICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJweG9yICUlbW0zLCAlJW1tMyAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGNtcGd0dyAlJW1tMCwgJSVtbTIgICAgICAgICAgIFxuXHQiIC8vIGJsb2NrW2ldIDwgMCA/IC0xIDogMAorICAgICAgICAgICAgICAgICJwY21wZ3R3ICUlbW0xLCAlJW1tMyAgICAgICAgICAgXG5cdCIgLy8gYmxvY2tbaV0gPCAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJweG9yICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8vIGFicyhibG9ja1tpXSkKKyAgICAgICAgICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8vIGFicyhibG9ja1tpXSkKKyAgICAgICAgICAgICAgICAicGFkZHcgJSVtbTAsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8vIGFicyhibG9ja1tpXSkqMgorICAgICAgICAgICAgICAgICJwYWRkdyAlJW1tMSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLy8gYWJzKGJsb2NrW2ldKSoyCisgICAgICAgICAgICAgICAgInBtdWxsdyAlJW1tNCwgJSVtbTAgICAgICAgICAgICBcblx0IiAvLyBhYnMoYmxvY2tbaV0pKjIqcQorICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTUsICUlbW0xICAgICAgICAgICAgXG5cdCIgLy8gYWJzKGJsb2NrW2ldKSoyKnEKKyAgICAgICAgICAgICAgICAicGFkZHcgJSVtbTQsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8vIChhYnMoYmxvY2tbaV0pKjIgKyAxKSpxCisgICAgICAgICAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvLyAoYWJzKGJsb2NrW2ldKSoyICsgMSkqcQorICAgICAgICAgICAgICAgICJweG9yICUlbW00LCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tNSwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8vIEZJWE1FIHNsb3cKKyAgICAgICAgICAgICAgICAicGNtcGVxdyAoJTAsICUlIlJFR19hIiksICUlbW00IFxuXHQiIC8vIGJsb2NrW2ldID09IDAgPyAtMSA6IDAKKyAgICAgICAgICAgICAgICAicGNtcGVxdyA4KCUwLCAlJSJSRUdfYSIpLCAlJW1tNVxuXHQiIC8vIGJsb2NrW2ldID09IDAgPyAtMSA6IDAKKyAgICAgICAgICAgICAgICAicHNybHcgJDQsICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzcmx3ICQ0LCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJweG9yICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tMywgJSVtbTEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFuZG4gJSVtbTAsICUlbW00ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhbmRuICUlbW0xLCAlJW1tNSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJweG9yICUlbW00LCAlJW1tNyAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHhvciAlJW1tNSwgJSVtbTcgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgJSVtbTQsICglMCwgJSUiUkVHX2EiKSAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICUlbW01LCA4KCUwLCAlJSJSRUdfYSIpICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJhZGQgJDE2LCAlJSJSRUdfYSIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiam5nIDFiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgMTI0KCUwLCAlMyksICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNybHEgJDMyLCAlJW1tNyAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTYsICUlbW03ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNybHEgJDE2LCAlJW1tNyAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTYsICUlbW03ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc2xsZCAkMzEsICUlbW03ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNybHEgJDE1LCAlJW1tNyAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB4b3IgJSVtbTcsICUlbW0wICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkICUlbW0wLCAxMjQoJTAsICUzKSAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgIDo6InIiIChibG9jaytuQ29lZmZzKSwgInIiKHF1YW50X21hdHJpeCtuQ29lZmZzKSwgInJtIiAocXNjYWxlKSwgInIiICgtMipuQ29lZmZzKQorICAgICAgICAgICAgICAgIDogIiUiUkVHX2EsICJtZW1vcnkiCisgICAgICAgICk7Cit9CisKKyNlbmRpZiAvKiBIQVZFX01NWF9JTkxJTkUgKi8KKworYXZfY29sZCB2b2lkIGZmX21wdl9jb21tb25faW5pdF94ODYoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisjaWYgSEFWRV9NTVhfSU5MSU5FCisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChJTkxJTkVfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+ZGN0X3VucXVhbnRpemVfaDI2M19pbnRyYSA9IGRjdF91bnF1YW50aXplX2gyNjNfaW50cmFfbW14OworICAgICAgICBzLT5kY3RfdW5xdWFudGl6ZV9oMjYzX2ludGVyID0gZGN0X3VucXVhbnRpemVfaDI2M19pbnRlcl9tbXg7CisgICAgICAgIHMtPmRjdF91bnF1YW50aXplX21wZWcxX2ludHJhID0gZGN0X3VucXVhbnRpemVfbXBlZzFfaW50cmFfbW14OworICAgICAgICBzLT5kY3RfdW5xdWFudGl6ZV9tcGVnMV9pbnRlciA9IGRjdF91bnF1YW50aXplX21wZWcxX2ludGVyX21teDsKKyAgICAgICAgaWYoIShzLT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKQorICAgICAgICAgICAgcy0+ZGN0X3VucXVhbnRpemVfbXBlZzJfaW50cmEgPSBkY3RfdW5xdWFudGl6ZV9tcGVnMl9pbnRyYV9tbXg7CisgICAgICAgIHMtPmRjdF91bnF1YW50aXplX21wZWcyX2ludGVyID0gZGN0X3VucXVhbnRpemVfbXBlZzJfaW50ZXJfbW14OworICAgIH0KKyNlbmRpZiAvKiBIQVZFX01NWF9JTkxJTkUgKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tcGVndmlkZW9kc3AuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tcGVndmlkZW9kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDFhOGUyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlb2RzcC5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW9kc3AuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZpZGVvZHNwLmgiCisKKyNpZiBIQVZFX0lOTElORV9BU00KKworc3RhdGljIHZvaWQgZ21jX21teCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCBveCwgaW50IG95LAorICAgICAgICAgICAgICAgICAgICBpbnQgZHh4LCBpbnQgZHh5LCBpbnQgZHl4LCBpbnQgZHl5LAorICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQsIGludCByLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgY29uc3QgaW50IHcgICAgPSA4OworICAgIGNvbnN0IGludCBpeCAgID0gb3ggID4+ICgxNiArIHNoaWZ0KTsKKyAgICBjb25zdCBpbnQgaXkgICA9IG95ICA+PiAoMTYgKyBzaGlmdCk7CisgICAgY29uc3QgaW50IG94cyAgPSBveCAgPj4gNDsKKyAgICBjb25zdCBpbnQgb3lzICA9IG95ICA+PiA0OworICAgIGNvbnN0IGludCBkeHhzID0gZHh4ID4+IDQ7CisgICAgY29uc3QgaW50IGR4eXMgPSBkeHkgPj4gNDsKKyAgICBjb25zdCBpbnQgZHl4cyA9IGR5eCA+PiA0OworICAgIGNvbnN0IGludCBkeXlzID0gZHl5ID4+IDQ7CisgICAgY29uc3QgdWludDE2X3QgcjRbNF0gICA9IHsgciwgciwgciwgciB9OworICAgIGNvbnN0IHVpbnQxNl90IGR4eTRbNF0gPSB7IGR4eXMsIGR4eXMsIGR4eXMsIGR4eXMgfTsKKyAgICBjb25zdCB1aW50MTZfdCBkeXk0WzRdID0geyBkeXlzLCBkeXlzLCBkeXlzLCBkeXlzIH07CisgICAgY29uc3QgdWludDY0X3Qgc2hpZnQyICA9IDIgKiBzaGlmdDsKKyNkZWZpbmUgTUFYX1NUUklERSA0MDk2VQorI2RlZmluZSBNQVhfSCA4VQorICAgIHVpbnQ4X3QgZWRnZV9idWZbKE1BWF9IICsgMSkgKiBNQVhfU1RSSURFXTsKKyAgICBpbnQgeCwgeTsKKworICAgIGNvbnN0IGludCBkeHcgPSAoZHh4IC0gKDEgPDwgKDE2ICsgc2hpZnQpKSkgKiAodyAtIDEpOworICAgIGNvbnN0IGludCBkeWggPSAoZHl5IC0gKDEgPDwgKDE2ICsgc2hpZnQpKSkgKiAoaCAtIDEpOworICAgIGNvbnN0IGludCBkeGggPSBkeHkgKiAoaCAtIDEpOworICAgIGNvbnN0IGludCBkeXcgPSBkeXggKiAodyAtIDEpOworICAgIGludCBuZWVkX2VtdSAgPSAgKHVuc2lnbmVkKSBpeCA+PSB3aWR0aCAgLSB3IHx8CisgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpIGl5ID49IGhlaWdodCAtIGg7CisKKyAgICBpZiAoIC8vIG5vbi1jb25zdGFudCBmdWxscGVsIG9mZnNldCAoMyUgb2YgYmxvY2tzKQorICAgICAgICAoKG94IF4gKG94ICsgZHh3KSkgfCAob3ggXiAob3ggKyBkeGgpKSB8IChveCBeIChveCArIGR4dyArIGR4aCkpIHwKKyAgICAgICAgIChveSBeIChveSArIGR5dykpIHwgKG95IF4gKG95ICsgZHloKSkgfCAob3kgXiAob3kgKyBkeXcgKyBkeWgpKSkgPj4gKDE2ICsgc2hpZnQpIHx8CisgICAgICAgIC8vIHVzZXMgbW9yZSB0aGFuIDE2IGJpdHMgb2Ygc3VicGVsIG12IChvbmx5IGF0IGh1Z2UgcmVzb2x1dGlvbikKKyAgICAgICAgKGR4eCB8IGR4eSB8IGR5eCB8IGR5eSkgJiAxNSB8fAorICAgICAgICAobmVlZF9lbXUgJiYgKGggPiBNQVhfSCB8fCBzdHJpZGUgPiBNQVhfU1RSSURFKSkpIHsKKyAgICAgICAgLy8gRklYTUUgY291bGQgc3RpbGwgdXNlIG1teCBmb3Igc29tZSBvZiB0aGUgcm93cworICAgICAgICBmZl9nbWNfYyhkc3QsIHNyYywgc3RyaWRlLCBoLCBveCwgb3ksIGR4eCwgZHh5LCBkeXgsIGR5eSwKKyAgICAgICAgICAgICAgICAgc2hpZnQsIHIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3JjICs9IGl4ICsgaXkgKiBzdHJpZGU7CisgICAgaWYgKG5lZWRfZW11KSB7CisgICAgICAgIGZmX2VtdWxhdGVkX2VkZ2VfbWNfOChlZGdlX2J1Ziwgc3JjLCBzdHJpZGUsIHN0cmlkZSwgdyArIDEsIGggKyAxLCBpeCwgaXksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBzcmMgPSBlZGdlX2J1ZjsKKyAgICB9CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgIm1vdmQgICAgICAgICAlMCwgJSVtbTYgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAgICAgICUlbW03LCAlJW1tNyAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgJSVtbTYsICUlbW02ICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tNiwgJSVtbTYgICAgICAgICBcblx0IgorICAgICAgICA6OiAiciIgKDEgPDwgc2hpZnQpKTsKKworICAgIGZvciAoeCA9IDA7IHggPCB3OyB4ICs9IDQpIHsKKyAgICAgICAgdWludDE2X3QgZHg0WzRdID0geyBveHMgLSBkeHlzICsgZHh4cyAqICh4ICsgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3hzIC0gZHh5cyArIGR4eHMgKiAoeCArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG94cyAtIGR4eXMgKyBkeHhzICogKHggKyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBveHMgLSBkeHlzICsgZHh4cyAqICh4ICsgMykgfTsKKyAgICAgICAgdWludDE2X3QgZHk0WzRdID0geyBveXMgLSBkeXlzICsgZHl4cyAqICh4ICsgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3lzIC0gZHl5cyArIGR5eHMgKiAoeCArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG95cyAtIGR5eXMgKyBkeXhzICogKHggKyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBveXMgLSBkeXlzICsgZHl4cyAqICh4ICsgMykgfTsKKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICAgICAibW92cSAgICAgICUwLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgJTEsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAgICAlMiwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICAgICUzLCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgJSVtbTQsICUwICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAlJW1tNSwgJTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNybHcgICAgJDEyLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3JsdyAgICAkMTIsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOiAiK20iICgqZHg0KSwgIittIiAoKmR5NCkKKyAgICAgICAgICAgICAgICA6ICJtIiAoKmR4eTQpLCAibSIgKCpkeXk0KSk7CisKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgJSVtbTYsICUlbW0yIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICAlJW1tNiwgJSVtbTEgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgICAgICUlbW00LCAlJW1tMiBcblx0IgorICAgICAgICAgICAgICAgICJwc3VidyAgICAgJSVtbTUsICUlbW0xIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICAlJW1tMiwgJSVtbTAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAgICUlbW00LCAlJW1tMyBcblx0IgorICAgICAgICAgICAgICAgICJwbXVsbHcgICAgJSVtbTEsICUlbW0wIFxuXHQiIC8vIChzIC0gZHgpICogKHMgLSBkeSkKKyAgICAgICAgICAgICAgICAicG11bGx3ICAgICUlbW01LCAlJW1tMyBcblx0IiAvLyBkeCAqIGR5CisgICAgICAgICAgICAgICAgInBtdWxsdyAgICAlJW1tNSwgJSVtbTIgXG5cdCIgLy8gKHMgLSBkeCkgKiBkeQorICAgICAgICAgICAgICAgICJwbXVsbHcgICAgJSVtbTQsICUlbW0xIFxuXHQiIC8vIGR4ICogKHMgLSBkeSkKKworICAgICAgICAgICAgICAgICJtb3ZkICAgICAgICAgJTQsICUlbW01IFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgICAgICAgICAlMywgJSVtbTQgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNSBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW00IFxuXHQiCisgICAgICAgICAgICAgICAgInBtdWxsdyAgICAlJW1tNSwgJSVtbTMgXG5cdCIgLy8gc3JjWzEsIDFdICogZHggKiBkeQorICAgICAgICAgICAgICAgICJwbXVsbHcgICAgJSVtbTQsICUlbW0yIFxuXHQiIC8vIHNyY1swLCAxXSAqIChzIC0gZHgpICogZHkKKworICAgICAgICAgICAgICAgICJtb3ZkICAgICAgICAgJTIsICUlbW01IFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgICAgICAgICAlMSwgJSVtbTQgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNSBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW00IFxuXHQiCisgICAgICAgICAgICAgICAgInBtdWxsdyAgICAlJW1tNSwgJSVtbTEgXG5cdCIgLy8gc3JjWzEsIDBdICogZHggKiAocyAtIGR5KQorICAgICAgICAgICAgICAgICJwbXVsbHcgICAgJSVtbTQsICUlbW0wIFxuXHQiIC8vIHNyY1swLCAwXSAqIChzIC0gZHgpICogKHMgLSBkeSkKKyAgICAgICAgICAgICAgICAicGFkZHcgICAgICAgICU1LCAlJW1tMSBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgICAgJSVtbTMsICUlbW0yIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAgICAlJW1tMSwgJSVtbTAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICAgICUlbW0yLCAlJW1tMCBcblx0IgorCisgICAgICAgICAgICAgICAgInBzcmx3ICAgICAgICAlNiwgJSVtbTAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFja3Vzd2IgICUlbW0wLCAlJW1tMCBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkICAgICAgJSVtbTAsICUwICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6ICI9bSIgKGRzdFt4ICsgeSAqIHN0cmlkZV0pCisgICAgICAgICAgICAgICAgOiAibSIgKHNyY1swXSksICJtIiAoc3JjWzFdKSwKKyAgICAgICAgICAgICAgICAgICJtIiAoc3JjW3N0cmlkZV0pLCAibSIgKHNyY1tzdHJpZGUgKyAxXSksCisgICAgICAgICAgICAgICAgICAibSIgKCpyNCksICJtIiAoc2hpZnQyKSk7CisgICAgICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgICAgIHNyYyArPSA0IC0gaCAqIHN0cmlkZTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworYXZfY29sZCB2b2lkIGZmX21wZWd2aWRlb2RzcF9pbml0X3g4NihNcGVnVmlkZW9EU1BDb250ZXh0ICpjKQoreworI2lmIEhBVkVfSU5MSU5FX0FTTQorICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoSU5MSU5FX01NWChjcHVfZmxhZ3MpKQorICAgICAgICBjLT5nbWMgPSBnbWNfbW14OworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlb2VuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlb2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTA1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvZW5jLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBUaGUgc2ltcGxlc3QgbXBlZyBlbmNvZGVyICh3ZWxsLCBpdCB3YXMgdGhlIHNpbXBsZXN0ISkKKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZGN0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW8uaCIKKworLyogbm90IHBlcm11dGF0ZWQgaW52ZXJzZSB6aWd6YWdfZGlyZWN0ICsgMSBmb3IgTU1YIHF1YW50aXplciAqLworREVDTEFSRV9BTElHTkVEKDE2LCBzdGF0aWMgdWludDE2X3QsIGludl96aWd6YWdfZGlyZWN0MTYpWzY0XTsKKworI2lmIEhBVkVfNlJFR1MKKworI2lmIEhBVkVfTU1YX0lOTElORQorI2RlZmluZSBDT01QSUxFX1RFTVBMQVRFX01NWEVYVCAwCisjZGVmaW5lIENPTVBJTEVfVEVNUExBVEVfU1NFMiAgIDAKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9TU1NFMyAgMAorI2RlZmluZSBSRU5BTUUoYSkgICAgICBhICMjIF9tbXgKKyNkZWZpbmUgUkVOQU1FX0ZEQ1QoYSkgYSAjIyBfbW14CisjaW5jbHVkZSAibXBlZ3ZpZGVvZW5jX3RlbXBsYXRlLmMiCisjZW5kaWYgLyogSEFWRV9NTVhfSU5MSU5FICovCisKKyNpZiBIQVZFX01NWEVYVF9JTkxJTkUKKyN1bmRlZiBDT01QSUxFX1RFTVBMQVRFX1NTU0UzCisjdW5kZWYgQ09NUElMRV9URU1QTEFURV9TU0UyCisjdW5kZWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgMQorI2RlZmluZSBDT01QSUxFX1RFTVBMQVRFX1NTRTIgICAwCisjZGVmaW5lIENPTVBJTEVfVEVNUExBVEVfU1NTRTMgIDAKKyN1bmRlZiBSRU5BTUUKKyN1bmRlZiBSRU5BTUVfRkRDVAorI2RlZmluZSBSRU5BTUUoYSkgICAgICBhICMjIF9tbXhleHQKKyNkZWZpbmUgUkVOQU1FX0ZEQ1QoYSkgYSAjIyBfbW14ZXh0CisjaW5jbHVkZSAibXBlZ3ZpZGVvZW5jX3RlbXBsYXRlLmMiCisjZW5kaWYgLyogSEFWRV9NTVhFWFRfSU5MSU5FICovCisKKyNpZiBIQVZFX1NTRTJfSU5MSU5FCisjdW5kZWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQKKyN1bmRlZiBDT01QSUxFX1RFTVBMQVRFX1NTRTIKKyN1bmRlZiBDT01QSUxFX1RFTVBMQVRFX1NTU0UzCisjZGVmaW5lIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUIDAKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9TU0UyICAgMQorI2RlZmluZSBDT01QSUxFX1RFTVBMQVRFX1NTU0UzICAwCisjdW5kZWYgUkVOQU1FCisjdW5kZWYgUkVOQU1FX0ZEQ1QKKyNkZWZpbmUgUkVOQU1FKGEpICAgICAgYSAjIyBfc3NlMgorI2RlZmluZSBSRU5BTUVfRkRDVChhKSBhICMjIF9zc2UyCisjaW5jbHVkZSAibXBlZ3ZpZGVvZW5jX3RlbXBsYXRlLmMiCisjZW5kaWYgLyogSEFWRV9TU0UyX0lOTElORSAqLworCisjaWYgSEFWRV9TU1NFM19JTkxJTkUKKyN1bmRlZiBDT01QSUxFX1RFTVBMQVRFX01NWEVYVAorI3VuZGVmIENPTVBJTEVfVEVNUExBVEVfU1NFMgorI3VuZGVmIENPTVBJTEVfVEVNUExBVEVfU1NTRTMKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgMAorI2RlZmluZSBDT01QSUxFX1RFTVBMQVRFX1NTRTIgICAxCisjZGVmaW5lIENPTVBJTEVfVEVNUExBVEVfU1NTRTMgIDEKKyN1bmRlZiBSRU5BTUUKKyN1bmRlZiBSRU5BTUVfRkRDVAorI2RlZmluZSBSRU5BTUUoYSkgICAgICBhICMjIF9zc3NlMworI2RlZmluZSBSRU5BTUVfRkRDVChhKSBhICMjIF9zc2UyCisjaW5jbHVkZSAibXBlZ3ZpZGVvZW5jX3RlbXBsYXRlLmMiCisjZW5kaWYgLyogSEFWRV9TU1NFM19JTkxJTkUgKi8KKworI2VuZGlmIC8qIEhBVkVfNlJFR1MgKi8KKworI2lmIEhBVkVfSU5MSU5FX0FTTQorc3RhdGljIHZvaWQgIGRlbm9pc2VfZGN0X21teChNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2speworICAgIGNvbnN0IGludCBpbnRyYT0gcy0+bWJfaW50cmE7CisgICAgaW50ICpzdW09IHMtPmRjdF9lcnJvcl9zdW1baW50cmFdOworICAgIHVpbnQxNl90ICpvZmZzZXQ9IHMtPmRjdF9vZmZzZXRbaW50cmFdOworCisgICAgcy0+ZGN0X2NvdW50W2ludHJhXSsrOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tMCwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTEsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglMCksICUlbW0yICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSA4KCUwKSwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndHcgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3R3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTEsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTEsICUlbW0zICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0zLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzdyAoJTIpLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c3cgOCglMiksICUlbW0zICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJweG9yICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tMSwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMSwgJSVtbTMgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgKCUwKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTMsIDgoJTApICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW00LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNSwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tNywgJSVtbTQgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICUlbW03LCAlJW1tNSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAlJW1tNywgJSVtbTMgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkZCAoJTEpLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGQgOCglMSksICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRkIDE2KCUxKSwgJSVtbTUgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkZCAyNCglMSksICUlbW0zICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNCwgKCUxKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsIDgoJTEpICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW01LCAxNiglMSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMywgMjQoJTEpICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAkMTYsICUwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJDMyLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICQxNiwgJTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImNtcCAlMywgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiIGpiIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6ICIrciIgKGJsb2NrKSwgIityIiAoc3VtKSwgIityIiAob2Zmc2V0KQorICAgICAgICA6ICJyIihibG9jays2NCkKKyAgICApOworfQorCitzdGF0aWMgdm9pZCAgZGVub2lzZV9kY3Rfc3NlMihNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2speworICAgIGNvbnN0IGludCBpbnRyYT0gcy0+bWJfaW50cmE7CisgICAgaW50ICpzdW09IHMtPmRjdF9lcnJvcl9zdW1baW50cmFdOworICAgIHVpbnQxNl90ICpvZmZzZXQ9IHMtPmRjdF9vZmZzZXRbaW50cmFdOworCisgICAgcy0+ZGN0X2NvdW50W2ludHJhXSsrOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgInB4b3IgJSV4bW03LCAlJXhtbTcgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJXhtbTAsICUleG1tMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSV4bW0xLCAlJXhtbTEgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkcWEgKCUwKSwgJSV4bW0yICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZHFhIDE2KCUwKSwgJSV4bW0zICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndHcgJSV4bW0yLCAlJXhtbTAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3R3ICUleG1tMywgJSV4bW0xICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJXhtbTAsICUleG1tMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSV4bW0xLCAlJXhtbTMgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJXhtbTAsICUleG1tMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSV4bW0xLCAlJXhtbTMgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmRxYSAlJXhtbTIsICUleG1tNCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkcWEgJSV4bW0zLCAlJXhtbTUgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzdyAoJTIpLCAlJXhtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c3cgMTYoJTIpLCAlJXhtbTMgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJweG9yICUleG1tMCwgJSV4bW0yICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJXhtbTEsICUleG1tMyAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUleG1tMCwgJSV4bW0yICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJXhtbTEsICUleG1tMyAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZHFhICUleG1tMiwgKCUwKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmRxYSAlJXhtbTMsIDE2KCUwKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkcWEgJSV4bW00LCAlJXhtbTYgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZHFhICUleG1tNSwgJSV4bW0wICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJXhtbTcsICUleG1tNCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgJSV4bW03LCAlJXhtbTYgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICUleG1tNywgJSV4bW01ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAlJXhtbTcsICUleG1tMCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkZCAoJTEpLCAlJXhtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGQgMTYoJTEpLCAlJXhtbTYgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRkIDMyKCUxKSwgJSV4bW01ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkZCA0OCglMSksICUleG1tMCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZHFhICUleG1tNCwgKCUxKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmRxYSAlJXhtbTYsIDE2KCUxKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkcWEgJSV4bW01LCAzMiglMSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZHFhICUleG1tMCwgNDgoJTEpICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAkMzIsICUwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJDY0LCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICQzMiwgJTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImNtcCAlMywgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiIGpiIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6ICIrciIgKGJsb2NrKSwgIityIiAoc3VtKSwgIityIiAob2Zmc2V0KQorICAgICAgICA6ICJyIihibG9jays2NCkKKyAgICAgICAgICBYTU1fQ0xPQkJFUlNfT05MWSgiJXhtbTAiLCAiJXhtbTEiLCAiJXhtbTIiLCAiJXhtbTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIleG1tNCIsICIleG1tNSIsICIleG1tNiIsICIleG1tNyIpCisgICAgKTsKK30KKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworYXZfY29sZCB2b2lkIGZmX2RjdF9lbmNvZGVfaW5pdF94ODYoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgY29uc3QgaW50IGRjdF9hbGdvID0gcy0+YXZjdHgtPmRjdF9hbGdvOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgIGludl96aWd6YWdfZGlyZWN0MTZbZmZfemlnemFnX2RpcmVjdFtpXV0gPSBpICsgMTsKKworICAgIGlmIChkY3RfYWxnbyA9PSBGRl9EQ1RfQVVUTyB8fCBkY3RfYWxnbyA9PSBGRl9EQ1RfTU1YKSB7CisjaWYgSEFWRV9NTVhfSU5MSU5FCisgICAgICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisgICAgICAgIGlmIChJTkxJTkVfTU1YKGNwdV9mbGFncykpIHsKKyNpZiBIQVZFXzZSRUdTCisgICAgICAgICAgICBzLT5kY3RfcXVhbnRpemUgPSBkY3RfcXVhbnRpemVfbW14OworI2VuZGlmCisgICAgICAgICAgICBzLT5kZW5vaXNlX2RjdCAgPSBkZW5vaXNlX2RjdF9tbXg7CisgICAgICAgIH0KKyNlbmRpZgorI2lmIEhBVkVfNlJFR1MgJiYgSEFWRV9NTVhFWFRfSU5MSU5FCisgICAgICAgIGlmIChJTkxJTkVfTU1YRVhUKGNwdV9mbGFncykpCisgICAgICAgICAgICBzLT5kY3RfcXVhbnRpemUgPSBkY3RfcXVhbnRpemVfbW14ZXh0OworI2VuZGlmCisjaWYgSEFWRV9TU0UyX0lOTElORQorICAgICAgICBpZiAoSU5MSU5FX1NTRTIoY3B1X2ZsYWdzKSkgeworI2lmIEhBVkVfNlJFR1MKKyAgICAgICAgICAgIHMtPmRjdF9xdWFudGl6ZSA9IGRjdF9xdWFudGl6ZV9zc2UyOworI2VuZGlmCisgICAgICAgICAgICBzLT5kZW5vaXNlX2RjdCAgPSBkZW5vaXNlX2RjdF9zc2UyOworICAgICAgICB9CisjZW5kaWYKKyNpZiBIQVZFXzZSRUdTICYmIEhBVkVfU1NTRTNfSU5MSU5FCisgICAgICAgIGlmIChJTkxJTkVfU1NTRTMoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIHMtPmRjdF9xdWFudGl6ZSA9IGRjdF9xdWFudGl6ZV9zc3NlMzsKKyNlbmRpZgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tcGVndmlkZW9lbmNfcW5zX3RlbXBsYXRlLmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvZW5jX3Fuc190ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmQ0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvZW5jX3Fuc190ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogUU5TIGZ1bmN0aW9ucyBhcmUgY29tcGlsZWQgMyB0aW1lcyBmb3IgTU1YLzNETk9XL1NTU0UzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIE1NWCBvcHRpbWl6YXRpb24gYnkgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIDNETm93ISBhbmQgU1NTRTMgb3B0aW1pemF0aW9uIGJ5IFp1eHkgTWVuZyA8enV4eS5tZW5nQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisKKyNpbmNsdWRlICJpbmxpbmVfYXNtLmgiCisKKyNkZWZpbmUgTUFYX0FCUyAoNTEyID4+IChTQ0FMRV9PRkZTRVQ+MCA/IFNDQUxFX09GRlNFVCA6IDApKQorCitzdGF0aWMgaW50IERFRih0cnlfOHg4YmFzaXMpKGludDE2X3QgcmVtWzY0XSwgaW50MTZfdCB3ZWlnaHRbNjRdLCBpbnQxNl90IGJhc2lzWzY0XSwgaW50IHNjYWxlKQoreworICAgIHg4Nl9yZWcgaT0wOworCisgICAgYXZfYXNzZXJ0MihGRkFCUyhzY2FsZSkgPCBNQVhfQUJTKTsKKyAgICBzY2FsZTw8PSAxNiArIFNDQUxFX09GRlNFVCAtIEJBU0lTX1NISUZUICsgUkVDT05fU0hJRlQ7CisKKyAgICBTRVRfUk5EKG1tNik7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAgJTQsICUlbW01ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgJSVtbTUsICUlbW01ICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tNSwgJSVtbTUgICAgICAgICBcblx0IgorICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICglMSwgJTApLCAlJW1tMCAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgOCglMSwgJTApLCAlJW1tMSAgICAgICAgIFxuXHQiCisgICAgICAgIFBNVUxIUlcoJSVtbTAsICUlbW0xLCAlJW1tNSwgJSVtbTYpCisgICAgICAgICJwYWRkdyAoJTIsICUwKSwgJSVtbTAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3IDgoJTIsICUwKSwgJSVtbTEgICAgICAgICBcblx0IgorICAgICAgICAicHNyYXcgJDYsICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhdyAkNiwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsdyAoJTMsICUwKSwgJSVtbTAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGx3IDgoJTMsICUwKSwgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICJwbWFkZHdkICUlbW0wLCAlJW1tMCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW0xICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsZCAkNCwgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tNyAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICQxNiwgJTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjbXAgJDEyOCwgJTAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy9GSVhNRSBvcHRpbWl6ZSAmIGJlbmNoCisgICAgICAgICIgamIgMWIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUEhBREREKCUlbW03LCAlJW1tNikKKyAgICAgICAgInBzcmxkICQyLCAlJW1tNyAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tNywgJTAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiAiK3IiIChpKQorICAgICAgICA6ICJyIihiYXNpcyksICJyIihyZW0pLCAiciIod2VpZ2h0KSwgImciKHNjYWxlKQorICAgICk7CisgICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIERFRihhZGRfOHg4YmFzaXMpKGludDE2X3QgcmVtWzY0XSwgaW50MTZfdCBiYXNpc1s2NF0sIGludCBzY2FsZSkKK3sKKyAgICB4ODZfcmVnIGk9MDsKKworICAgIGlmKEZGQUJTKHNjYWxlKSA8IE1BWF9BQlMpeworICAgICAgICBzY2FsZTw8PSAxNiArIFNDQUxFX09GRlNFVCAtIEJBU0lTX1NISUZUICsgUkVDT05fU0hJRlQ7CisgICAgICAgIFNFVF9STkQobW02KTsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibW92ZCAgJTMsICUlbW01ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsd2QgJSVtbTUsICUlbW01IFxuXHQiCisgICAgICAgICAgICAgICAgInB1bnBja2x3ZCAlJW1tNSwgJSVtbTUgXG5cdCIKKyAgICAgICAgICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICglMSwgJTApLCAlJW1tMCAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgOCglMSwgJTApLCAlJW1tMSBcblx0IgorICAgICAgICAgICAgICAgIFBNVUxIUlcoJSVtbTAsICUlbW0xLCAlJW1tNSwgJSVtbTYpCisgICAgICAgICAgICAgICAgInBhZGR3ICglMiwgJTApLCAlJW1tMCAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgOCglMiwgJTApLCAlJW1tMSBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICUlbW0wLCAoJTIsICUwKSAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgJSVtbTEsIDgoJTIsICUwKSAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkICQxNiwgJTAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJjbXAgJDEyOCwgJTAgICAgICAgICAgIFxuXHQiIC8vIEZJWE1FIG9wdGltaXplICYgYmVuY2gKKyAgICAgICAgICAgICAgICAiIGpiIDFiICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgICAgOiAiK3IiIChpKQorICAgICAgICAgICAgICAgIDogInIiKGJhc2lzKSwgInIiKHJlbSksICJnIihzY2FsZSkKKyAgICAgICAgKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgZm9yKGk9MDsgaTw4Kjg7IGkrKyl7CisgICAgICAgICAgICByZW1baV0gKz0gKGJhc2lzW2ldKnNjYWxlICsgKDE8PChCQVNJU19TSElGVCAtIFJFQ09OX1NISUZULTEpKSk+PihCQVNJU19TSElGVCAtIFJFQ09OX1NISUZUKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tcGVndmlkZW9lbmNfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tcGVndmlkZW9lbmNfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODk5YmEyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlb2VuY190ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMzcxIEBACisvKgorICogTVBFRyB2aWRlbyBNTVggdGVtcGxhdGVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW8uaCIKKyNpbmNsdWRlICJmZGN0LmgiCisKKyN1bmRlZiBNTVJFR19XSURUSAorI3VuZGVmIE1NCisjdW5kZWYgTU9WUQorI3VuZGVmIFNQUkVBRFcKKyN1bmRlZiBQTUFYVworI3VuZGVmIFBNQVgKKyN1bmRlZiBTQVZFX1NJR04KKyN1bmRlZiBSRVNUT1JFX1NJR04KKworI2lmIENPTVBJTEVfVEVNUExBVEVfU1NFMgorI2RlZmluZSBNTVJFR19XSURUSCAiMTYiCisjZGVmaW5lIE1NICIlJXhtbSIKKyNkZWZpbmUgTU9WUSAibW92ZHFhIgorI2RlZmluZSBTUFJFQURXKGEpIFwKKyAgICAgICAgICAgICJwc2h1Zmx3ICQwLCAiYSIsICJhIiAgICAgICBcblx0IlwKKyAgICAgICAgICAgICJwdW5wY2tsd2QgImEiLCAiYSIgICAgICAgICBcblx0IgorI2RlZmluZSBQTUFYVyhhLGIpICJwbWF4c3cgImEiLCAiYiIgICAgIFxuXHQiCisjZGVmaW5lIFBNQVgoYSxiKSBcCisgICAgICAgICAgICAibW92aGxwcyAiYSIsICJiIiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICBQTUFYVyhiLCBhKVwKKyAgICAgICAgICAgICJwc2h1Zmx3ICQweDBFLCAiYSIsICJiIiAgICBcblx0IlwKKyAgICAgICAgICAgIFBNQVhXKGIsIGEpXAorICAgICAgICAgICAgInBzaHVmbHcgJDB4MDEsICJhIiwgImIiICAgIFxuXHQiXAorICAgICAgICAgICAgUE1BWFcoYiwgYSkKKyNlbHNlCisjZGVmaW5lIE1NUkVHX1dJRFRIICI4IgorI2RlZmluZSBNTSAiJSVtbSIKKyNkZWZpbmUgTU9WUSAibW92cSIKKyNpZiBDT01QSUxFX1RFTVBMQVRFX01NWEVYVAorI2RlZmluZSBTUFJFQURXKGEpICJwc2h1ZncgJDAsICJhIiwgImEiIFxuXHQiCisjZGVmaW5lIFBNQVhXKGEsYikgInBtYXhzdyAiYSIsICJiIiAgICAgXG5cdCIKKyNkZWZpbmUgUE1BWChhLGIpIFwKKyAgICAgICAgICAgICJwc2h1ZncgJDB4MEUsICJhIiwgImIiICAgICBcblx0IlwKKyAgICAgICAgICAgIFBNQVhXKGIsIGEpXAorICAgICAgICAgICAgInBzaHVmdyAkMHgwMSwgImEiLCAiYiIgICAgIFxuXHQiXAorICAgICAgICAgICAgUE1BWFcoYiwgYSkKKyNlbHNlCisjZGVmaW5lIFNQUkVBRFcoYSkgXAorICAgICAgICAgICAgInB1bnBja2x3ZCAiYSIsICJhIiAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgInB1bnBja2x3ZCAiYSIsICJhIiAgICAgICAgIFxuXHQiCisjZGVmaW5lIFBNQVhXKGEsYikgXAorICAgICAgICAgICAgInBzdWJ1c3cgImEiLCAiYiIgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgInBhZGR3ICJhIiwgImIiICAgICAgICAgICAgIFxuXHQiCisjZGVmaW5lIFBNQVgoYSxiKSAgXAorICAgICAgICAgICAgIm1vdnEgImEiLCAiYiIgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgInBzcmxxICQzMiwgImEiICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgUE1BWFcoYiwgYSlcCisgICAgICAgICAgICAibW92cSAiYSIsICJiIiAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAicHNybHEgJDE2LCAiYSIgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICBQTUFYVyhiLCBhKQorCisjZW5kaWYKKyNlbmRpZgorCisjaWYgQ09NUElMRV9URU1QTEFURV9TU1NFMworI2RlZmluZSBTQVZFX1NJR04oYSxiKSBcCisgICAgICAgICAgICAibW92ZHFhICJiIiwgImEiICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAicGFic3cgICJiIiwgImIiICAgICAgICAgICAgXG5cdCIKKyNkZWZpbmUgUkVTVE9SRV9TSUdOKGEsYikgXAorICAgICAgICAgICAgInBzaWdudyAiYSIsICJiIiAgICAgICAgICAgIFxuXHQiCisjZWxzZQorI2RlZmluZSBTQVZFX1NJR04oYSxiKSBcCisgICAgICAgICAgICAicHhvciAiYSIsICJhIiAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAicGNtcGd0dyAiYiIsICJhIiAgICAgICAgICAgXG5cdCIgLyogYmxvY2tbaV0gPD0gMCA/IDB4RkYgOiAweDAwICovXAorICAgICAgICAgICAgInB4b3IgImEiLCAiYiIgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgInBzdWJ3ICJhIiwgImIiICAgICAgICAgICAgIFxuXHQiIC8qIEFCUyhibG9ja1tpXSkgKi8KKyNkZWZpbmUgUkVTVE9SRV9TSUdOKGEsYikgXAorICAgICAgICAgICAgInB4b3IgImEiLCAiYiIgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgInBzdWJ3ICJhIiwgImIiICAgICAgICAgICAgIFxuXHQiIC8vIG91dD0oKEFCUyhibG9ja1tpXSkqcW1hdFswXSAtIGJpYXNbMF0qcW1hdFswXSk+PjE2KSpzaWduKGJsb2NrW2ldKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgUkVOQU1FKGRjdF9xdWFudGl6ZSkoTXBlZ0VuY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxc2NhbGUsIGludCAqb3ZlcmZsb3cpCit7CisgICAgeDg2X3JlZyBsYXN0X25vbl96ZXJvX3AxOworICAgIGludCBsZXZlbD0wLCBxOyAvLz0wIGlzIGJlY2F1c2UgZ2NjIHNheXMgdW5pbml0aWFsaXplZCAuLi4KKyAgICBjb25zdCB1aW50MTZfdCAqcW1hdCwgKmJpYXM7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCB0ZW1wX2Jsb2NrLCBbNjRdKTsKKworICAgIGF2X2Fzc2VydDIoKDcmKGludCkoJnRlbXBfYmxvY2tbMF0pKSA9PSAwKTsgLy9kaWQgZ2NjIGFsaWduIGl0IGNvcnJlY3RseT8KKworICAgIC8vcy0+ZmRjdCAoYmxvY2spOworICAgIFJFTkFNRV9GRENUKGZmX2ZkY3QpKGJsb2NrKTsgLy8gY2Fubm90IGJlIGFueXRoaW5nIGVsc2UgLi4uCisKKyAgICBpZihzLT5kY3RfZXJyb3Jfc3VtKQorICAgICAgICBzLT5kZW5vaXNlX2RjdChzLCBibG9jayk7CisKKyAgICBpZiAocy0+bWJfaW50cmEpIHsKKyAgICAgICAgaW50IGR1bW15OworICAgICAgICBpZiAobiA8IDQpeworICAgICAgICAgICAgcSA9IHMtPnlfZGNfc2NhbGU7CisgICAgICAgICAgICBiaWFzID0gcy0+cV9pbnRyYV9tYXRyaXgxNltxc2NhbGVdWzFdOworICAgICAgICAgICAgcW1hdCA9IHMtPnFfaW50cmFfbWF0cml4MTZbcXNjYWxlXVswXTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBxID0gcy0+Y19kY19zY2FsZTsKKyAgICAgICAgICAgIGJpYXMgPSBzLT5xX2Nocm9tYV9pbnRyYV9tYXRyaXgxNltxc2NhbGVdWzFdOworICAgICAgICAgICAgcW1hdCA9IHMtPnFfY2hyb21hX2ludHJhX21hdHJpeDE2W3FzY2FsZV1bMF07CisgICAgICAgIH0KKyAgICAgICAgLyogbm90ZTogYmxvY2tbMF0gaXMgYXNzdW1lZCB0byBiZSBwb3NpdGl2ZSAqLworICAgICAgICBpZiAoIXMtPmgyNjNfYWljKSB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgICAgICJtdWwgJSVlY3ggICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6ICI9ZCIgKGxldmVsKSwgIj1hIihkdW1teSkKKyAgICAgICAgICAgICAgICA6ICJhIiAoKGJsb2NrWzBdPj4yKSArIHEpLCAiYyIgKGZmX2ludmVyc2VbcTw8MV0pCisgICAgICAgICk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgLyogRm9yIEFJQyB3ZSBza2lwIHF1YW50L2RlcXVhbnQgb2YgSU5UUkFEQyAqLworICAgICAgICAgICAgbGV2ZWwgPSAoYmxvY2tbMF0gKyA0KT4+MzsKKworICAgICAgICBibG9ja1swXT0wOyAvL2F2b2lkIGZha2Ugb3ZlcmZsb3cKKy8vICAgICAgICB0ZW1wX2Jsb2NrWzBdID0gKGJsb2NrWzBdICsgKHEgPj4gMSkpIC8gcTsKKyAgICAgICAgbGFzdF9ub25femVyb19wMSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGFzdF9ub25femVyb19wMSA9IDA7CisgICAgICAgIGJpYXMgPSBzLT5xX2ludGVyX21hdHJpeDE2W3FzY2FsZV1bMV07CisgICAgICAgIHFtYXQgPSBzLT5xX2ludGVyX21hdHJpeDE2W3FzY2FsZV1bMF07CisgICAgfQorCisgICAgaWYoKHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjMgfHwgcy0+b3V0X2Zvcm1hdCA9PSBGTVRfSDI2MSkgJiYgcy0+bXBlZ19xdWFudD09MCl7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJtb3ZkICUlIlJFR19hIiwgIk1NIjMgICAgICAgICAgICAgIFxuXHQiIC8vIGxhc3Rfbm9uX3plcm9fcDEKKyAgICAgICAgICAgIFNQUkVBRFcoTU0iMyIpCisgICAgICAgICAgICAicHhvciAiTU0iNywgIk1NIjcgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICAgICAicHhvciAiTU0iNCwgIk1NIjQgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICAgICBNT1ZRIiAoJTIpLCAiTU0iNSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBxbWF0WzBdCisgICAgICAgICAgICAicHhvciAiTU0iNiwgIk1NIjYgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJ3ICglMyksICJNTSI2ICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gLWJpYXNbMF0KKyAgICAgICAgICAgICJtb3YgJC0xMjgsICUlIlJFR19hIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1PVlEiICglMSwgJSUiUkVHX2EiKSwgIk1NIjAgICAgICAgIFxuXHQiIC8vIGJsb2NrW2ldCisgICAgICAgICAgICBTQVZFX1NJR04oTU0iMSIsIE1NIjAiKSAgICAgICAgICAgICAgICAgICAvLyBBQlMoYmxvY2tbaV0pCisgICAgICAgICAgICAicHN1YnVzdyAiTU0iNiwgIk1NIjAgICAgICAgICAgICAgICBcblx0IiAvLyBBQlMoYmxvY2tbaV0pICsgYmlhc1swXQorICAgICAgICAgICAgInBtdWxodyAiTU0iNSwgIk1NIjAgICAgICAgICAgICAgICAgXG5cdCIgLy8gKEFCUyhibG9ja1tpXSkqcW1hdFswXSAtIGJpYXNbMF0qcW1hdFswXSk+PjE2CisgICAgICAgICAgICAicG9yICJNTSIwLCAiTU0iNCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUkVTVE9SRV9TSUdOKE1NIjEiLCBNTSIwIikgICAgICAgICAgICAgICAgLy8gb3V0PSgoQUJTKGJsb2NrW2ldKSpxbWF0WzBdIC0gYmlhc1swXSpxbWF0WzBdKT4+MTYpKnNpZ24oYmxvY2tbaV0pCisgICAgICAgICAgICBNT1ZRIiAiTU0iMCwgKCU1LCAlJSJSRUdfYSIpICAgICAgICBcblx0IgorICAgICAgICAgICAgInBjbXBlcXcgIk1NIjcsICJNTSIwICAgICAgICAgICAgICAgXG5cdCIgLy8gb3V0PT0wID8gMHhGRiA6IDB4MDAKKyAgICAgICAgICAgIE1PVlEiICglNCwgJSUiUkVHX2EiKSwgIk1NIjEgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZRIiAiTU0iNywgKCUxLCAlJSJSRUdfYSIpICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICAgICAicGFuZG4gIk1NIjEsICJNTSIwICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUE1BWFcoTU0iMCIsIE1NIjMiKQorICAgICAgICAgICAgImFkZCAkIk1NUkVHX1dJRFRIIiwgJSUiUkVHX2EiICAgICAgXG5cdCIKKyAgICAgICAgICAgICIganMgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQTUFYKE1NIjMiLCBNTSIwIikKKyAgICAgICAgICAgICJtb3ZkICJNTSIzLCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92emJsICUlYWwsICUlZWF4ICAgICAgICAgICAgICAgICBcblx0IiAvLyBsYXN0X25vbl96ZXJvX3AxCisgICAgICAgICAgICA6ICIrYSIgKGxhc3Rfbm9uX3plcm9fcDEpCisgICAgICAgICAgICA6ICJyIiAoYmxvY2srNjQpLCAiciIgKHFtYXQpLCAiciIgKGJpYXMpLAorICAgICAgICAgICAgICAiciIgKGludl96aWd6YWdfZGlyZWN0MTYgKyA2NCksICJyIiAodGVtcF9ibG9jayArIDY0KQorICAgICAgICAgICAgICBYTU1fQ0xPQkJFUlNfT05MWSgiJXhtbTAiLCAiJXhtbTEiLCAiJXhtbTIiLCAiJXhtbTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXhtbTQiLCAiJXhtbTUiLCAiJXhtbTYiLCAiJXhtbTciKQorICAgICAgICApOworICAgIH1lbHNleyAvLyBGTVRfSDI2MworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgIm1vdmQgJSUiUkVHX2EiLCAiTU0iMyAgICAgICAgICAgICAgXG5cdCIgLy8gbGFzdF9ub25femVyb19wMQorICAgICAgICAgICAgU1BSRUFEVyhNTSIzIikKKyAgICAgICAgICAgICJweG9yICJNTSI3LCAiTU0iNyAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDAKKyAgICAgICAgICAgICJweG9yICJNTSI0LCAiTU0iNCAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDAKKyAgICAgICAgICAgICJtb3YgJC0xMjgsICUlIlJFR19hIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1PVlEiICglMSwgJSUiUkVHX2EiKSwgIk1NIjAgICAgICAgIFxuXHQiIC8vIGJsb2NrW2ldCisgICAgICAgICAgICBTQVZFX1NJR04oTU0iMSIsIE1NIjAiKSAgICAgICAgICAgICAgICAgICAvLyBBQlMoYmxvY2tbaV0pCisgICAgICAgICAgICBNT1ZRIiAoJTMsICUlIlJFR19hIiksICJNTSI2ICAgICAgICBcblx0IiAvLyBiaWFzWzBdCisgICAgICAgICAgICAicGFkZHVzdyAiTU0iNiwgIk1NIjAgICAgICAgICAgICAgICBcblx0IiAvLyBBQlMoYmxvY2tbaV0pICsgYmlhc1swXQorICAgICAgICAgICAgTU9WUSIgKCUyLCAlJSJSRUdfYSIpLCAiTU0iNSAgICAgICAgXG5cdCIgLy8gcW1hdFtpXQorICAgICAgICAgICAgInBtdWxodyAiTU0iNSwgIk1NIjAgICAgICAgICAgICAgICAgXG5cdCIgLy8gKEFCUyhibG9ja1tpXSkqcW1hdFswXSArIGJpYXNbMF0qcW1hdFswXSk+PjE2CisgICAgICAgICAgICAicG9yICJNTSIwLCAiTU0iNCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUkVTVE9SRV9TSUdOKE1NIjEiLCBNTSIwIikgICAgICAgICAgICAgICAgLy8gb3V0PSgoQUJTKGJsb2NrW2ldKSpxbWF0WzBdIC0gYmlhc1swXSpxbWF0WzBdKT4+MTYpKnNpZ24oYmxvY2tbaV0pCisgICAgICAgICAgICBNT1ZRIiAiTU0iMCwgKCU1LCAlJSJSRUdfYSIpICAgICAgICBcblx0IgorICAgICAgICAgICAgInBjbXBlcXcgIk1NIjcsICJNTSIwICAgICAgICAgICAgICAgXG5cdCIgLy8gb3V0PT0wID8gMHhGRiA6IDB4MDAKKyAgICAgICAgICAgIE1PVlEiICglNCwgJSUiUkVHX2EiKSwgIk1NIjEgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZRIiAiTU0iNywgKCUxLCAlJSJSRUdfYSIpICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICAgICAicGFuZG4gIk1NIjEsICJNTSIwICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUE1BWFcoTU0iMCIsIE1NIjMiKQorICAgICAgICAgICAgImFkZCAkIk1NUkVHX1dJRFRIIiwgJSUiUkVHX2EiICAgICAgXG5cdCIKKyAgICAgICAgICAgICIganMgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQTUFYKE1NIjMiLCBNTSIwIikKKyAgICAgICAgICAgICJtb3ZkICJNTSIzLCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92emJsICUlYWwsICUlZWF4ICAgICAgICAgICAgICAgICBcblx0IiAvLyBsYXN0X25vbl96ZXJvX3AxCisgICAgICAgICAgICA6ICIrYSIgKGxhc3Rfbm9uX3plcm9fcDEpCisgICAgICAgICAgICA6ICJyIiAoYmxvY2srNjQpLCAiciIgKHFtYXQrNjQpLCAiciIgKGJpYXMrNjQpLAorICAgICAgICAgICAgICAiciIgKGludl96aWd6YWdfZGlyZWN0MTYgKyA2NCksICJyIiAodGVtcF9ibG9jayArIDY0KQorICAgICAgICAgICAgICBYTU1fQ0xPQkJFUlNfT05MWSgiJXhtbTAiLCAiJXhtbTEiLCAiJXhtbTIiLCAiJXhtbTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXhtbTQiLCAiJXhtbTUiLCAiJXhtbTYiLCAiJXhtbTciKQorICAgICAgICApOworICAgIH0KKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92ZCAlMSwgIk1NIjEgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBtYXhfcWNvZWZmCisgICAgICAgIFNQUkVBRFcoTU0iMSIpCisgICAgICAgICJwc3VidXN3ICJNTSIxLCAiTU0iNCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXN3YiAiTU0iNCwgIk1NIjQgICAgICAgICAgICAgIFxuXHQiCisjaWYgQ09NUElMRV9URU1QTEFURV9TU0UyCisgICAgICAgICJwYWNrc3N3YiAiTU0iNCwgIk1NIjQgICAgICAgICAgICAgIFxuXHQiCisjZW5kaWYKKyAgICAgICAgIm1vdmQgIk1NIjQsICUwICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gKm92ZXJmbG93CisgICAgICAgIDogIj1nIiAoKm92ZXJmbG93KQorICAgICAgICA6ICJnIiAocy0+bWF4X3Fjb2VmZikKKyAgICApOworCisgICAgaWYocy0+bWJfaW50cmEpIGJsb2NrWzBdPSBsZXZlbDsKKyAgICBlbHNlICAgICAgICAgICAgYmxvY2tbMF09IHRlbXBfYmxvY2tbMF07CisKKyAgICBpZiAocy0+aWRzcC5wZXJtX3R5cGUgPT0gRkZfSURDVF9QRVJNX1NJTVBMRSkgeworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDEpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDA4XSA9IHRlbXBfYmxvY2tbMHgwMV07IGJsb2NrWzB4MTBdID0gdGVtcF9ibG9ja1sweDA4XTsKKyAgICAgICAgYmxvY2tbMHgyMF0gPSB0ZW1wX2Jsb2NrWzB4MTBdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDQpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDE4XSA9IHRlbXBfYmxvY2tbMHgwOV07IGJsb2NrWzB4MDRdID0gdGVtcF9ibG9ja1sweDAyXTsKKyAgICAgICAgYmxvY2tbMHgwOV0gPSB0ZW1wX2Jsb2NrWzB4MDNdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDcpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDE0XSA9IHRlbXBfYmxvY2tbMHgwQV07IGJsb2NrWzB4MjhdID0gdGVtcF9ibG9ja1sweDExXTsKKyAgICAgICAgYmxvY2tbMHgxMl0gPSB0ZW1wX2Jsb2NrWzB4MThdOyBibG9ja1sweDAyXSA9IHRlbXBfYmxvY2tbMHgyMF07CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gMTEpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDFBXSA9IHRlbXBfYmxvY2tbMHgxOV07IGJsb2NrWzB4MjRdID0gdGVtcF9ibG9ja1sweDEyXTsKKyAgICAgICAgYmxvY2tbMHgxOV0gPSB0ZW1wX2Jsb2NrWzB4MEJdOyBibG9ja1sweDAxXSA9IHRlbXBfYmxvY2tbMHgwNF07CisgICAgICAgIGJsb2NrWzB4MENdID0gdGVtcF9ibG9ja1sweDA1XTsKKyAgICAgICAgaWYobGFzdF9ub25femVyb19wMSA8PSAxNikgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MTFdID0gdGVtcF9ibG9ja1sweDBDXTsgYmxvY2tbMHgyOV0gPSB0ZW1wX2Jsb2NrWzB4MTNdOworICAgICAgICBibG9ja1sweDE2XSA9IHRlbXBfYmxvY2tbMHgxQV07IGJsb2NrWzB4MEFdID0gdGVtcF9ibG9ja1sweDIxXTsKKyAgICAgICAgYmxvY2tbMHgzMF0gPSB0ZW1wX2Jsb2NrWzB4MjhdOyBibG9ja1sweDIyXSA9IHRlbXBfYmxvY2tbMHgzMF07CisgICAgICAgIGJsb2NrWzB4MzhdID0gdGVtcF9ibG9ja1sweDI5XTsgYmxvY2tbMHgwNl0gPSB0ZW1wX2Jsb2NrWzB4MjJdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDI0KSBnb3RvIGVuZDsKKyAgICAgICAgYmxvY2tbMHgxQl0gPSB0ZW1wX2Jsb2NrWzB4MUJdOyBibG9ja1sweDIxXSA9IHRlbXBfYmxvY2tbMHgxNF07CisgICAgICAgIGJsb2NrWzB4MUNdID0gdGVtcF9ibG9ja1sweDBEXTsgYmxvY2tbMHgwNV0gPSB0ZW1wX2Jsb2NrWzB4MDZdOworICAgICAgICBibG9ja1sweDBEXSA9IHRlbXBfYmxvY2tbMHgwN107IGJsb2NrWzB4MTVdID0gdGVtcF9ibG9ja1sweDBFXTsKKyAgICAgICAgYmxvY2tbMHgyQ10gPSB0ZW1wX2Jsb2NrWzB4MTVdOyBibG9ja1sweDEzXSA9IHRlbXBfYmxvY2tbMHgxQ107CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gMzIpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDBCXSA9IHRlbXBfYmxvY2tbMHgyM107IGJsb2NrWzB4MzRdID0gdGVtcF9ibG9ja1sweDJBXTsKKyAgICAgICAgYmxvY2tbMHgyQV0gPSB0ZW1wX2Jsb2NrWzB4MzFdOyBibG9ja1sweDMyXSA9IHRlbXBfYmxvY2tbMHgzOF07CisgICAgICAgIGJsb2NrWzB4M0FdID0gdGVtcF9ibG9ja1sweDM5XTsgYmxvY2tbMHgyNl0gPSB0ZW1wX2Jsb2NrWzB4MzJdOworICAgICAgICBibG9ja1sweDM5XSA9IHRlbXBfYmxvY2tbMHgyQl07IGJsb2NrWzB4MDNdID0gdGVtcF9ibG9ja1sweDI0XTsKKyAgICAgICAgaWYobGFzdF9ub25femVyb19wMSA8PSA0MCkgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MUVdID0gdGVtcF9ibG9ja1sweDFEXTsgYmxvY2tbMHgyNV0gPSB0ZW1wX2Jsb2NrWzB4MTZdOworICAgICAgICBibG9ja1sweDFEXSA9IHRlbXBfYmxvY2tbMHgwRl07IGJsb2NrWzB4MkRdID0gdGVtcF9ibG9ja1sweDE3XTsKKyAgICAgICAgYmxvY2tbMHgxN10gPSB0ZW1wX2Jsb2NrWzB4MUVdOyBibG9ja1sweDBFXSA9IHRlbXBfYmxvY2tbMHgyNV07CisgICAgICAgIGJsb2NrWzB4MzFdID0gdGVtcF9ibG9ja1sweDJDXTsgYmxvY2tbMHgyQl0gPSB0ZW1wX2Jsb2NrWzB4MzNdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDQ4KSBnb3RvIGVuZDsKKyAgICAgICAgYmxvY2tbMHgzNl0gPSB0ZW1wX2Jsb2NrWzB4M0FdOyBibG9ja1sweDNCXSA9IHRlbXBfYmxvY2tbMHgzQl07CisgICAgICAgIGJsb2NrWzB4MjNdID0gdGVtcF9ibG9ja1sweDM0XTsgYmxvY2tbMHgzQ10gPSB0ZW1wX2Jsb2NrWzB4MkRdOworICAgICAgICBibG9ja1sweDA3XSA9IHRlbXBfYmxvY2tbMHgyNl07IGJsb2NrWzB4MUZdID0gdGVtcF9ibG9ja1sweDFGXTsKKyAgICAgICAgYmxvY2tbMHgwRl0gPSB0ZW1wX2Jsb2NrWzB4MjddOyBibG9ja1sweDM1XSA9IHRlbXBfYmxvY2tbMHgyRV07CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gNTYpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDJFXSA9IHRlbXBfYmxvY2tbMHgzNV07IGJsb2NrWzB4MzNdID0gdGVtcF9ibG9ja1sweDNDXTsKKyAgICAgICAgYmxvY2tbMHgzRV0gPSB0ZW1wX2Jsb2NrWzB4M0RdOyBibG9ja1sweDI3XSA9IHRlbXBfYmxvY2tbMHgzNl07CisgICAgICAgIGJsb2NrWzB4M0RdID0gdGVtcF9ibG9ja1sweDJGXTsgYmxvY2tbMHgyRl0gPSB0ZW1wX2Jsb2NrWzB4MzddOworICAgICAgICBibG9ja1sweDM3XSA9IHRlbXBfYmxvY2tbMHgzRV07IGJsb2NrWzB4M0ZdID0gdGVtcF9ibG9ja1sweDNGXTsKKyAgICB9ZWxzZSBpZihzLT5pZHNwLnBlcm1fdHlwZSA9PSBGRl9JRENUX1BFUk1fTElCTVBFRzIpeworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDEpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDA0XSA9IHRlbXBfYmxvY2tbMHgwMV07CisgICAgICAgIGJsb2NrWzB4MDhdID0gdGVtcF9ibG9ja1sweDA4XTsgYmxvY2tbMHgxMF0gPSB0ZW1wX2Jsb2NrWzB4MTBdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDQpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDBDXSA9IHRlbXBfYmxvY2tbMHgwOV07IGJsb2NrWzB4MDFdID0gdGVtcF9ibG9ja1sweDAyXTsKKyAgICAgICAgYmxvY2tbMHgwNV0gPSB0ZW1wX2Jsb2NrWzB4MDNdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDcpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDA5XSA9IHRlbXBfYmxvY2tbMHgwQV07IGJsb2NrWzB4MTRdID0gdGVtcF9ibG9ja1sweDExXTsKKyAgICAgICAgYmxvY2tbMHgxOF0gPSB0ZW1wX2Jsb2NrWzB4MThdOyBibG9ja1sweDIwXSA9IHRlbXBfYmxvY2tbMHgyMF07CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gMTEpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDFDXSA9IHRlbXBfYmxvY2tbMHgxOV07CisgICAgICAgIGJsb2NrWzB4MTFdID0gdGVtcF9ibG9ja1sweDEyXTsgYmxvY2tbMHgwRF0gPSB0ZW1wX2Jsb2NrWzB4MEJdOworICAgICAgICBibG9ja1sweDAyXSA9IHRlbXBfYmxvY2tbMHgwNF07IGJsb2NrWzB4MDZdID0gdGVtcF9ibG9ja1sweDA1XTsKKyAgICAgICAgaWYobGFzdF9ub25femVyb19wMSA8PSAxNikgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MEFdID0gdGVtcF9ibG9ja1sweDBDXTsgYmxvY2tbMHgxNV0gPSB0ZW1wX2Jsb2NrWzB4MTNdOworICAgICAgICBibG9ja1sweDE5XSA9IHRlbXBfYmxvY2tbMHgxQV07IGJsb2NrWzB4MjRdID0gdGVtcF9ibG9ja1sweDIxXTsKKyAgICAgICAgYmxvY2tbMHgyOF0gPSB0ZW1wX2Jsb2NrWzB4MjhdOyBibG9ja1sweDMwXSA9IHRlbXBfYmxvY2tbMHgzMF07CisgICAgICAgIGJsb2NrWzB4MkNdID0gdGVtcF9ibG9ja1sweDI5XTsgYmxvY2tbMHgyMV0gPSB0ZW1wX2Jsb2NrWzB4MjJdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDI0KSBnb3RvIGVuZDsKKyAgICAgICAgYmxvY2tbMHgxRF0gPSB0ZW1wX2Jsb2NrWzB4MUJdOyBibG9ja1sweDEyXSA9IHRlbXBfYmxvY2tbMHgxNF07CisgICAgICAgIGJsb2NrWzB4MEVdID0gdGVtcF9ibG9ja1sweDBEXTsgYmxvY2tbMHgwM10gPSB0ZW1wX2Jsb2NrWzB4MDZdOworICAgICAgICBibG9ja1sweDA3XSA9IHRlbXBfYmxvY2tbMHgwN107IGJsb2NrWzB4MEJdID0gdGVtcF9ibG9ja1sweDBFXTsKKyAgICAgICAgYmxvY2tbMHgxNl0gPSB0ZW1wX2Jsb2NrWzB4MTVdOyBibG9ja1sweDFBXSA9IHRlbXBfYmxvY2tbMHgxQ107CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gMzIpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDI1XSA9IHRlbXBfYmxvY2tbMHgyM107IGJsb2NrWzB4MjldID0gdGVtcF9ibG9ja1sweDJBXTsKKyAgICAgICAgYmxvY2tbMHgzNF0gPSB0ZW1wX2Jsb2NrWzB4MzFdOyBibG9ja1sweDM4XSA9IHRlbXBfYmxvY2tbMHgzOF07CisgICAgICAgIGJsb2NrWzB4M0NdID0gdGVtcF9ibG9ja1sweDM5XTsgYmxvY2tbMHgzMV0gPSB0ZW1wX2Jsb2NrWzB4MzJdOworICAgICAgICBibG9ja1sweDJEXSA9IHRlbXBfYmxvY2tbMHgyQl07IGJsb2NrWzB4MjJdID0gdGVtcF9ibG9ja1sweDI0XTsKKyAgICAgICAgaWYobGFzdF9ub25femVyb19wMSA8PSA0MCkgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MUVdID0gdGVtcF9ibG9ja1sweDFEXTsgYmxvY2tbMHgxM10gPSB0ZW1wX2Jsb2NrWzB4MTZdOworICAgICAgICBibG9ja1sweDBGXSA9IHRlbXBfYmxvY2tbMHgwRl07IGJsb2NrWzB4MTddID0gdGVtcF9ibG9ja1sweDE3XTsKKyAgICAgICAgYmxvY2tbMHgxQl0gPSB0ZW1wX2Jsb2NrWzB4MUVdOyBibG9ja1sweDI2XSA9IHRlbXBfYmxvY2tbMHgyNV07CisgICAgICAgIGJsb2NrWzB4MkFdID0gdGVtcF9ibG9ja1sweDJDXTsgYmxvY2tbMHgzNV0gPSB0ZW1wX2Jsb2NrWzB4MzNdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDQ4KSBnb3RvIGVuZDsKKyAgICAgICAgYmxvY2tbMHgzOV0gPSB0ZW1wX2Jsb2NrWzB4M0FdOyBibG9ja1sweDNEXSA9IHRlbXBfYmxvY2tbMHgzQl07CisgICAgICAgIGJsb2NrWzB4MzJdID0gdGVtcF9ibG9ja1sweDM0XTsgYmxvY2tbMHgyRV0gPSB0ZW1wX2Jsb2NrWzB4MkRdOworICAgICAgICAgICAgYmxvY2tbMHgyM10gPSB0ZW1wX2Jsb2NrWzB4MjZdOyBibG9ja1sweDFGXSA9IHRlbXBfYmxvY2tbMHgxRl07CisgICAgICAgIGJsb2NrWzB4MjddID0gdGVtcF9ibG9ja1sweDI3XTsgYmxvY2tbMHgyQl0gPSB0ZW1wX2Jsb2NrWzB4MkVdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDU2KSBnb3RvIGVuZDsKKyAgICAgICAgYmxvY2tbMHgzNl0gPSB0ZW1wX2Jsb2NrWzB4MzVdOyBibG9ja1sweDNBXSA9IHRlbXBfYmxvY2tbMHgzQ107CisgICAgICAgIGJsb2NrWzB4M0VdID0gdGVtcF9ibG9ja1sweDNEXTsgYmxvY2tbMHgzM10gPSB0ZW1wX2Jsb2NrWzB4MzZdOworICAgICAgICBibG9ja1sweDJGXSA9IHRlbXBfYmxvY2tbMHgyRl07IGJsb2NrWzB4MzddID0gdGVtcF9ibG9ja1sweDM3XTsKKyAgICAgICAgYmxvY2tbMHgzQl0gPSB0ZW1wX2Jsb2NrWzB4M0VdOyBibG9ja1sweDNGXSA9IHRlbXBfYmxvY2tbMHgzRl07CisgICAgfWVsc2V7CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gMSkgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MDFdID0gdGVtcF9ibG9ja1sweDAxXTsKKyAgICAgICAgYmxvY2tbMHgwOF0gPSB0ZW1wX2Jsb2NrWzB4MDhdOyBibG9ja1sweDEwXSA9IHRlbXBfYmxvY2tbMHgxMF07CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gNCkgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MDldID0gdGVtcF9ibG9ja1sweDA5XTsgYmxvY2tbMHgwMl0gPSB0ZW1wX2Jsb2NrWzB4MDJdOworICAgICAgICBibG9ja1sweDAzXSA9IHRlbXBfYmxvY2tbMHgwM107CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gNykgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MEFdID0gdGVtcF9ibG9ja1sweDBBXTsgYmxvY2tbMHgxMV0gPSB0ZW1wX2Jsb2NrWzB4MTFdOworICAgICAgICBibG9ja1sweDE4XSA9IHRlbXBfYmxvY2tbMHgxOF07IGJsb2NrWzB4MjBdID0gdGVtcF9ibG9ja1sweDIwXTsKKyAgICAgICAgaWYobGFzdF9ub25femVyb19wMSA8PSAxMSkgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MTldID0gdGVtcF9ibG9ja1sweDE5XTsKKyAgICAgICAgYmxvY2tbMHgxMl0gPSB0ZW1wX2Jsb2NrWzB4MTJdOyBibG9ja1sweDBCXSA9IHRlbXBfYmxvY2tbMHgwQl07CisgICAgICAgIGJsb2NrWzB4MDRdID0gdGVtcF9ibG9ja1sweDA0XTsgYmxvY2tbMHgwNV0gPSB0ZW1wX2Jsb2NrWzB4MDVdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDE2KSBnb3RvIGVuZDsKKyAgICAgICAgYmxvY2tbMHgwQ10gPSB0ZW1wX2Jsb2NrWzB4MENdOyBibG9ja1sweDEzXSA9IHRlbXBfYmxvY2tbMHgxM107CisgICAgICAgIGJsb2NrWzB4MUFdID0gdGVtcF9ibG9ja1sweDFBXTsgYmxvY2tbMHgyMV0gPSB0ZW1wX2Jsb2NrWzB4MjFdOworICAgICAgICBibG9ja1sweDI4XSA9IHRlbXBfYmxvY2tbMHgyOF07IGJsb2NrWzB4MzBdID0gdGVtcF9ibG9ja1sweDMwXTsKKyAgICAgICAgYmxvY2tbMHgyOV0gPSB0ZW1wX2Jsb2NrWzB4MjldOyBibG9ja1sweDIyXSA9IHRlbXBfYmxvY2tbMHgyMl07CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gMjQpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDFCXSA9IHRlbXBfYmxvY2tbMHgxQl07IGJsb2NrWzB4MTRdID0gdGVtcF9ibG9ja1sweDE0XTsKKyAgICAgICAgYmxvY2tbMHgwRF0gPSB0ZW1wX2Jsb2NrWzB4MERdOyBibG9ja1sweDA2XSA9IHRlbXBfYmxvY2tbMHgwNl07CisgICAgICAgIGJsb2NrWzB4MDddID0gdGVtcF9ibG9ja1sweDA3XTsgYmxvY2tbMHgwRV0gPSB0ZW1wX2Jsb2NrWzB4MEVdOworICAgICAgICBibG9ja1sweDE1XSA9IHRlbXBfYmxvY2tbMHgxNV07IGJsb2NrWzB4MUNdID0gdGVtcF9ibG9ja1sweDFDXTsKKyAgICAgICAgaWYobGFzdF9ub25femVyb19wMSA8PSAzMikgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MjNdID0gdGVtcF9ibG9ja1sweDIzXTsgYmxvY2tbMHgyQV0gPSB0ZW1wX2Jsb2NrWzB4MkFdOworICAgICAgICBibG9ja1sweDMxXSA9IHRlbXBfYmxvY2tbMHgzMV07IGJsb2NrWzB4MzhdID0gdGVtcF9ibG9ja1sweDM4XTsKKyAgICAgICAgYmxvY2tbMHgzOV0gPSB0ZW1wX2Jsb2NrWzB4MzldOyBibG9ja1sweDMyXSA9IHRlbXBfYmxvY2tbMHgzMl07CisgICAgICAgIGJsb2NrWzB4MkJdID0gdGVtcF9ibG9ja1sweDJCXTsgYmxvY2tbMHgyNF0gPSB0ZW1wX2Jsb2NrWzB4MjRdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDQwKSBnb3RvIGVuZDsKKyAgICAgICAgYmxvY2tbMHgxRF0gPSB0ZW1wX2Jsb2NrWzB4MURdOyBibG9ja1sweDE2XSA9IHRlbXBfYmxvY2tbMHgxNl07CisgICAgICAgIGJsb2NrWzB4MEZdID0gdGVtcF9ibG9ja1sweDBGXTsgYmxvY2tbMHgxN10gPSB0ZW1wX2Jsb2NrWzB4MTddOworICAgICAgICBibG9ja1sweDFFXSA9IHRlbXBfYmxvY2tbMHgxRV07IGJsb2NrWzB4MjVdID0gdGVtcF9ibG9ja1sweDI1XTsKKyAgICAgICAgYmxvY2tbMHgyQ10gPSB0ZW1wX2Jsb2NrWzB4MkNdOyBibG9ja1sweDMzXSA9IHRlbXBfYmxvY2tbMHgzM107CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gNDgpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDNBXSA9IHRlbXBfYmxvY2tbMHgzQV07IGJsb2NrWzB4M0JdID0gdGVtcF9ibG9ja1sweDNCXTsKKyAgICAgICAgYmxvY2tbMHgzNF0gPSB0ZW1wX2Jsb2NrWzB4MzRdOyBibG9ja1sweDJEXSA9IHRlbXBfYmxvY2tbMHgyRF07CisgICAgICAgIGJsb2NrWzB4MjZdID0gdGVtcF9ibG9ja1sweDI2XTsgYmxvY2tbMHgxRl0gPSB0ZW1wX2Jsb2NrWzB4MUZdOworICAgICAgICBibG9ja1sweDI3XSA9IHRlbXBfYmxvY2tbMHgyN107IGJsb2NrWzB4MkVdID0gdGVtcF9ibG9ja1sweDJFXTsKKyAgICAgICAgaWYobGFzdF9ub25femVyb19wMSA8PSA1NikgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MzVdID0gdGVtcF9ibG9ja1sweDM1XTsgYmxvY2tbMHgzQ10gPSB0ZW1wX2Jsb2NrWzB4M0NdOworICAgICAgICBibG9ja1sweDNEXSA9IHRlbXBfYmxvY2tbMHgzRF07IGJsb2NrWzB4MzZdID0gdGVtcF9ibG9ja1sweDM2XTsKKyAgICAgICAgYmxvY2tbMHgyRl0gPSB0ZW1wX2Jsb2NrWzB4MkZdOyBibG9ja1sweDM3XSA9IHRlbXBfYmxvY2tbMHgzN107CisgICAgICAgIGJsb2NrWzB4M0VdID0gdGVtcF9ibG9ja1sweDNFXTsgYmxvY2tbMHgzRl0gPSB0ZW1wX2Jsb2NrWzB4M0ZdOworICAgIH0KKyAgICBlbmQ6CisgICAgcmV0dXJuIGxhc3Rfbm9uX3plcm9fcDEgLSAxOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlb2VuY2RzcC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvZW5jZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWM3M2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlb2VuY2RzcC5hc20KQEAgLTAsMCArMSwxNTQgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogU0lNRC1vcHRpbWl6ZWQgTVBFRyBlbmNvZGluZyBmdW5jdGlvbnMKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorOyogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK2NleHRlcm4gcHdfMQorCitTRUNUSU9OIC50ZXh0Cis7IGludCBmZl9waXhfc3VtMTZfbW14KHVpbnQ4X3QgKnBpeCwgaW50IGxpbmVfc2l6ZSkKKzsgJTEgPSBudW1iZXIgb2YgbG9vcHMKKzsgJTIgPSBudW1iZXIgb2YgR1BScyB1c2VkCislbWFjcm8gUElYX1NVTTE2IDMKK2NnbG9iYWwgcGl4X3N1bTE2LCAyLCAlMiwgNgorICAgIG1vdnN4ZGlmbmlkbiByMSwgcjFkCisgICAgbW92ICAgICAgICAgIHIyLCAlMQorJWlmIG1tc2l6ZSA9PSAxNgorICAgIGxlYSAgICAgICAgICByMywgW3IxKjNdCislZW5kaWYKKyVpZiBub3RjcHVmbGFnKHhvcCkKKyAgICBweG9yICAgICAgICAgbTUsIG01CislZW5kaWYKKyAgICBweG9yICAgICAgICAgbTQsIG00CisubG9vcDoKKyVpZiBjcHVmbGFnKHhvcCkKKyAgICB2cGhhZGR1YnEgICAgbTAsIFtyMF0KKyAgICB2cGhhZGR1YnEgICAgbTEsIFtyMCtyMV0KKyAgICB2cGhhZGR1YnEgICAgbTIsIFtyMCtyMSoyXQorICAgIHZwaGFkZHVicSAgICBtMywgW3IwK3IzXQorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgbTAsIFtyMF0KKyVpZiBtbXNpemUgPT0gOAorICAgIG1vdmEgICAgICAgICBtMSwgW3IwKzhdCislaWYgY3B1ZmxhZyhtbXhleHQpCisgICAgbW92YSAgICAgICAgIG0yLCBbcjArcjFdCisgICAgbW92YSAgICAgICAgIG0zLCBbcjArcjErOF0KKyVlbmRpZgorJWVsc2UgOyBzc2UyCisgICAgbW92YSAgICAgICAgIG0xLCBbcjArcjFdCisgICAgbW92YSAgICAgICAgIG0yLCBbcjArcjEqMl0KKyAgICBtb3ZhICAgICAgICAgbTMsIFtyMCtyM10KKyVlbmRpZgorJWlmIGNwdWZsYWcobW14ZXh0KQorICAgIHBzYWRidyAgICAgICBtMCwgbTUKKyAgICBwc2FkYncgICAgICAgbTEsIG01CisgICAgcHNhZGJ3ICAgICAgIG0yLCBtNQorICAgIHBzYWRidyAgICAgICBtMywgbTUKKyVlbHNlIDsgbW14CisgICAgcHVucGNraGJ3ICAgIG0yLCBtMCwgbTUKKyAgICBwdW5wY2tsYncgICAgbTAsIG01CisgICAgcHVucGNraGJ3ICAgIG0zLCBtMSwgbTUKKyAgICBwdW5wY2tsYncgICAgbTEsIG01CislZW5kaWYgOyBjcHVmbGFnKG1teGV4dCkKKyVlbmRpZiA7IGNwdWZsYWcoeG9wKQorICAgIHBhZGR3ICAgICAgICBtMSwgbTAKKyAgICBwYWRkdyAgICAgICAgbTMsIG0yCisgICAgcGFkZHcgICAgICAgIG0zLCBtMQorICAgIHBhZGR3ICAgICAgICBtNCwgbTMKKyVpZiBjcHVmbGFnKG1teGV4dCkKKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCtyMSolM10KKyVlbHNlCisgICAgYWRkICAgICAgICAgIHIwLCByMQorJWVuZGlmCisgICAgZGVjIHIyCisgICAgam5lIC5sb29wCislaWYgbW1zaXplID09IDE2CisgICAgcHNodWZkICAgICAgIG0wLCBtNCwgcTAwMzIKKyAgICBwYWRkZCAgICAgICAgbTQsIG0wCislZWxpZiBub3RjcHVmbGFnKG1teGV4dCkKKyAgICBIQUREVyAgICAgICAgbTQsIG01CislZW5kaWYKKyAgICBtb3ZkICAgICAgICBlYXgsIG00CisgICAgUkVUCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzMyCitJTklUX01NWCBtbXgKK1BJWF9TVU0xNiAxNiwgMywgMAorSU5JVF9NTVggbW14ZXh0CitQSVhfU1VNMTYgIDgsIDQsIDIKKyVlbmRpZgorSU5JVF9YTU0gc3NlMgorUElYX1NVTTE2ICA0LCA0LCA0CislaWYgSEFWRV9YT1BfRVhURVJOQUwKK0lOSVRfWE1NIHhvcAorUElYX1NVTTE2ICA0LCA0LCA0CislZW5kaWYKKworOyBpbnQgZmZfcGl4X25vcm0xX21teCh1aW50OF90ICpwaXgsIGludCBsaW5lX3NpemUpCis7ICUxID0gbnVtYmVyIG9mIHhtbSByZWdpc3RlcnMgdXNlZAorOyAlMiA9IG51bWJlciBvZiBsb29wcworJW1hY3JvIFBJWF9OT1JNMSAyCitjZ2xvYmFsIHBpeF9ub3JtMSwgMiwgMywgJTEKKyAgICBtb3ZzeGRpZm5pZG4gcjEsIHIxZAorICAgIG1vdiAgICAgICAgICByMiwgJTIKKyAgICBweG9yICAgICAgICAgbTAsIG0wCisgICAgcHhvciAgICAgICAgIG01LCBtNQorLmxvb3A6CisgICAgbW92YSAgICAgICAgIG0yLCBbcjArMF0KKyVpZiBtbXNpemUgPT0gOAorICAgIG1vdmEgICAgICAgICBtMywgW3IwKzhdCislZWxzZQorICAgIG1vdmEgICAgICAgICBtMywgW3IwK3IxXQorJWVuZGlmCisgICAgcHVucGNraGJ3ICAgIG0xLCBtMiwgbTAKKyAgICBwdW5wY2tsYncgICAgbTIsIG0wCisgICAgcHVucGNraGJ3ICAgIG00LCBtMywgbTAKKyAgICBwdW5wY2tsYncgICAgbTMsIG0wCisgICAgcG1hZGR3ZCAgICAgIG0xLCBtMQorICAgIHBtYWRkd2QgICAgICBtMiwgbTIKKyAgICBwbWFkZHdkICAgICAgbTMsIG0zCisgICAgcG1hZGR3ZCAgICAgIG00LCBtNAorICAgIHBhZGRkICAgICAgICBtMiwgbTEKKyAgICBwYWRkZCAgICAgICAgbTQsIG0zCisgICAgcGFkZGQgICAgICAgIG01LCBtMgorICAgIHBhZGRkICAgICAgICBtNSwgbTQKKyVpZiBtbXNpemUgPT0gOAorICAgIGFkZCAgICAgICAgICByMCwgcjEKKyVlbHNlCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjEqMl0KKyVlbmRpZgorICAgIGRlYyByMgorICAgIGpuZSAubG9vcAorICAgIEhBREREICAgICAgICBtNSwgbTEKKyAgICBtb3ZkICAgICAgICBlYXgsIG01CisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14CitQSVhfTk9STTEgMCwgMTYKK0lOSVRfWE1NIHNzZTIKK1BJWF9OT1JNMSA2LCA4CisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tcGVndmlkZW9lbmNkc3BfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlb2VuY2RzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0ZGI2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9tcGVndmlkZW9lbmNkc3BfaW5pdC5jCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZ3ZpZGVvZW5jZHNwLmgiCisKK2ludCBmZl9waXhfc3VtMTZfbW14KHVpbnQ4X3QgKnBpeCwgaW50IGxpbmVfc2l6ZSk7CitpbnQgZmZfcGl4X3N1bTE2X21teGV4dCh1aW50OF90ICpwaXgsIGludCBsaW5lX3NpemUpOworaW50IGZmX3BpeF9zdW0xNl9zc2UyKHVpbnQ4X3QgKnBpeCwgaW50IGxpbmVfc2l6ZSk7CitpbnQgZmZfcGl4X3N1bTE2X3hvcCh1aW50OF90ICpwaXgsIGludCBsaW5lX3NpemUpOworaW50IGZmX3BpeF9ub3JtMV9tbXgodWludDhfdCAqcGl4LCBpbnQgbGluZV9zaXplKTsKK2ludCBmZl9waXhfbm9ybTFfc3NlMih1aW50OF90ICpwaXgsIGludCBsaW5lX3NpemUpOworCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKKyNkZWZpbmUgUEhBREREKGEsIHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgIiAjYSAiLCAiICN0ICIgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAicHNybHEgICAgJDMyLCAiICNhICIgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAicGFkZGQgIiAjdCAiLCAiICNhICIgICAgICAgICAgICAgICBcblx0IgorCisvKgorICogcG11bGh3OiAgIGRzdFswIC0gMTVdID0gKHNyY1swIC0gMTVdICogZHN0WzAgLSAxNV0pWzE2IC0gMzFdCisgKiBwbXVsaHJ3OiAgZHN0WzAgLSAxNV0gPSAoc3JjWzAgLSAxNV0gKiBkc3RbMCAtIDE1XSArIDB4ODAwMClbMTYgLSAzMV0KKyAqIHBtdWxocnN3OiBkc3RbMCAtIDE1XSA9IChzcmNbMCAtIDE1XSAqIGRzdFswIC0gMTVdICsgMHg0MDAwKVsxNSAtIDMwXQorICovCisjZGVmaW5lIFBNVUxIUlcoeCwgeSwgcywgbykgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBtdWxodyAiICNzICIsICIgI3ggIiAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgInBtdWxodyAiICNzICIsICIgI3kgIiAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgInBhZGR3ICAiICNvICIsICIgI3ggIiAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgInBhZGR3ICAiICNvICIsICIgI3kgIiAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgInBzcmF3ICAgICAgJDEsICIgI3ggIiAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgInBzcmF3ICAgICAgJDEsICIgI3kgIiAgICAgICAgICAgICAgXG5cdCIKKyNkZWZpbmUgREVGKHgpIHggIyMgX21teAorI2RlZmluZSBTRVRfUk5EIE1PVlFfV09ORQorI2RlZmluZSBTQ0FMRV9PRkZTRVQgMQorCisjaW5jbHVkZSAibXBlZ3ZpZGVvZW5jX3Fuc190ZW1wbGF0ZS5jIgorCisjdW5kZWYgREVGCisjdW5kZWYgU0VUX1JORAorI3VuZGVmIFNDQUxFX09GRlNFVAorI3VuZGVmIFBNVUxIUlcKKworI2RlZmluZSBERUYoeCkgeCAjIyBfM2Rub3cKKyNkZWZpbmUgU0VUX1JORCh4KQorI2RlZmluZSBTQ0FMRV9PRkZTRVQgMAorI2RlZmluZSBQTVVMSFJXKHgsIHksIHMsIG8pICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwbXVsaHJ3ICIgI3MgIiwgIiAjeCAiICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICJwbXVsaHJ3ICIgI3MgIiwgIiAjeSAiICAgICAgICAgICAgIFxuXHQiCisKKyNpbmNsdWRlICJtcGVndmlkZW9lbmNfcW5zX3RlbXBsYXRlLmMiCisKKyN1bmRlZiBERUYKKyN1bmRlZiBTRVRfUk5ECisjdW5kZWYgU0NBTEVfT0ZGU0VUCisjdW5kZWYgUE1VTEhSVworCisjaWYgSEFWRV9TU1NFM19JTkxJTkUKKyN1bmRlZiBQSEFEREQKKyNkZWZpbmUgREVGKHgpIHggIyMgX3Nzc2UzCisjZGVmaW5lIFNFVF9STkQoeCkKKyNkZWZpbmUgU0NBTEVfT0ZGU0VUIC0xCisKKyNkZWZpbmUgUEhBREREKGEsIHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNodWZ3ICQweDBFLCAiICNhICIsICIgI3QgIiAgICAgICBcblx0IiAgIFwKKyAgICAvKiBmYXN0ZXIgdGhhbiBwaGFkZGQgb24gY29yZTIgKi8gICAgICAgICAgIFwKKyAgICAicGFkZGQgIiAjdCAiLCAiICNhICIgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIFBNVUxIUlcoeCwgeSwgcywgbykgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBtdWxocnN3ICIgI3MgIiwgIiAjeCAiICAgICAgICAgICAgXG5cdCIgICBcCisgICAgInBtdWxocnN3ICIgI3MgIiwgIiAjeSAiICAgICAgICAgICAgXG5cdCIKKworI2luY2x1ZGUgIm1wZWd2aWRlb2VuY19xbnNfdGVtcGxhdGUuYyIKKworI3VuZGVmIERFRgorI3VuZGVmIFNFVF9STkQKKyN1bmRlZiBTQ0FMRV9PRkZTRVQKKyN1bmRlZiBQTVVMSFJXCisjdW5kZWYgUEhBRERECisjZW5kaWYgLyogSEFWRV9TU1NFM19JTkxJTkUgKi8KKworLyogRHJhdyB0aGUgZWRnZXMgb2Ygd2lkdGggJ3cnIG9mIGFuIGltYWdlIG9mIHNpemUgd2lkdGgsIGhlaWdodAorICogdGhpcyBNTVggdmVyc2lvbiBjYW4gb25seSBoYW5kbGUgdyA9PSA4IHx8IHcgPT0gMTYuICovCitzdGF0aWMgdm9pZCBkcmF3X2VkZ2VzX21teCh1aW50OF90ICpidWYsIGludCB3cmFwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzaWRlcykKK3sKKyAgICB1aW50OF90ICpwdHIsICpsYXN0X2xpbmU7CisgICAgaW50IGk7CisKKyAgICBsYXN0X2xpbmUgPSBidWYgKyAoaGVpZ2h0IC0gMSkgKiB3cmFwOworICAgIC8qIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgcHRyID0gYnVmOworICAgIGlmICh3ID09IDgpIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgICAgICAgICglMCksICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgJSVtbTAsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbHdkICAgICAgJSVtbTAsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGRxICAgICAgJSVtbTAsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgJSVtbTAsIC04KCUwKSAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgIC04KCUwLCAlMiksICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgJSVtbTEsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraHdkICAgICAgJSVtbTEsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGRxICAgICAgJSVtbTEsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgJSVtbTEsICglMCwgJTIpIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgJTEsICUwICAgICAgIFxuXHQiCisgICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgJTMsICUwICAgICAgIFxuXHQiCisgICAgICAgICAgICAiamIgICAgICAgICAgICAgICAgMWIgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6ICIrciIgKHB0cikKKyAgICAgICAgICAgIDogInIiICgoeDg2X3JlZykgd3JhcCksICJyIiAoKHg4Nl9yZWcpIHdpZHRoKSwKKyAgICAgICAgICAgICAgInIiIChwdHIgKyB3cmFwICogaGVpZ2h0KSk7CisgICAgfSBlbHNlIGlmICh3ID09IDE2KSB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAgICAgKCUwKSwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgJSVtbTAsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2x3ZCAgICAgICUlbW0wLCAlJW1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsZHEgICAgICAlJW1tMCwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgJSVtbTAsIC04KCUwKSAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICUlbW0wLCAtMTYoJTApICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgLTgoJTAsICUyKSwgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgJSVtbTEsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2h3ZCAgICAgICUlbW0xLCAlJW1tMSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toZHEgICAgICAlJW1tMSwgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgJSVtbTEsICAoJTAsICUyKSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICUlbW0xLCA4KCUwLCAlMikgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAlMSwgJTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgJTMsICUwICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImpiICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDogIityIihwdHIpCisgICAgICAgICAgICA6ICJyIigoeDg2X3JlZyl3cmFwKSwgInIiKCh4ODZfcmVnKXdpZHRoKSwgInIiKHB0ciArIHdyYXAgKiBoZWlnaHQpCisgICAgICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2Fzc2VydDEodyA9PSA0KTsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgICAgICAgICglMCksICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgJSVtbTAsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbHdkICAgICAgJSVtbTAsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgICAgICAgJSVtbTAsIC00KCUwKSAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgIC00KCUwLCAlMiksICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgJSVtbTEsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraHdkICAgICAgJSVtbTEsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGRxICAgICAgJSVtbTEsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgICAgICAgJSVtbTEsICglMCwgJTIpIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgJTEsICUwICAgICAgIFxuXHQiCisgICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgJTMsICUwICAgICAgIFxuXHQiCisgICAgICAgICAgICAiamIgICAgICAgICAgICAgICAgMWIgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6ICIrciIgKHB0cikKKyAgICAgICAgICAgIDogInIiICgoeDg2X3JlZykgd3JhcCksICJyIiAoKHg4Nl9yZWcpIHdpZHRoKSwKKyAgICAgICAgICAgICAgInIiIChwdHIgKyB3cmFwICogaGVpZ2h0KSk7CisgICAgfQorCisgICAgLyogdG9wIGFuZCBib3R0b20gKGFuZCBob3BlZnVsbHkgYWxzbyB0aGUgY29ybmVycykgKi8KKyAgICBpZiAoc2lkZXMgJiBFREdFX1RPUCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSArPSA0KSB7CisgICAgICAgICAgICBwdHIgPSBidWYgLSAoaSArIDEpICogd3JhcCAtIHc7CisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgKCUxLCAlMCksICUlbW0wICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICUlbW0wLCAoJTApICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAlJW1tMCwgKCUwLCAlMikgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgJSVtbTAsICglMCwgJTIsIDIpICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICUlbW0wLCAoJTAsICUzKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkICAgICAgICAkOCwgJTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImNtcCAgICAgICAgJTQsICUwICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJqYiAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6ICIrciIgKHB0cikKKyAgICAgICAgICAgICAgICA6ICJyIiAoKHg4Nl9yZWcpIGJ1ZiAtICh4ODZfcmVnKSBwdHIgLSB3KSwKKyAgICAgICAgICAgICAgICAgICJyIiAoKHg4Nl9yZWcpIC0gd3JhcCksICJyIiAoKHg4Nl9yZWcpIC0gd3JhcCAqIDMpLAorICAgICAgICAgICAgICAgICAgInIiIChwdHIgKyB3aWR0aCArIDIgKiB3KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2lkZXMgJiBFREdFX0JPVFRPTSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSArPSA0KSB7CisgICAgICAgICAgICBwdHIgPSBsYXN0X2xpbmUgKyAoaSArIDEpICogd3JhcCAtIHc7CisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgKCUxLCAlMCksICUlbW0wICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICUlbW0wLCAoJTApICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAlJW1tMCwgKCUwLCAlMikgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgJSVtbTAsICglMCwgJTIsIDIpICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICUlbW0wLCAoJTAsICUzKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkICAgICAgICAkOCwgJTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImNtcCAgICAgICAgJTQsICUwICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJqYiAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6ICIrciIgKHB0cikKKyAgICAgICAgICAgICAgICA6ICJyIiAoKHg4Nl9yZWcpIGxhc3RfbGluZSAtICh4ODZfcmVnKSBwdHIgLSB3KSwKKyAgICAgICAgICAgICAgICAgICJyIiAoKHg4Nl9yZWcpIHdyYXApLCAiciIgKCh4ODZfcmVnKSB3cmFwICogMyksCisgICAgICAgICAgICAgICAgICAiciIgKHB0ciArIHdpZHRoICsgMiAqIHcpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCithdl9jb2xkIHZvaWQgZmZfbXBlZ3ZpZGVvZW5jZHNwX2luaXRfeDg2KE1wZWd2aWRlb0VuY0RTUENvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisjaWYgQVJDSF9YODZfMzIKKyAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+cGl4X3N1bSAgID0gZmZfcGl4X3N1bTE2X21teDsKKyAgICAgICAgYy0+cGl4X25vcm0xID0gZmZfcGl4X25vcm0xX21teDsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+cGl4X3N1bSAgICAgPSBmZl9waXhfc3VtMTZfbW14ZXh0OworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5waXhfc3VtICAgICA9IGZmX3BpeF9zdW0xNl9zc2UyOworICAgICAgICBjLT5waXhfbm9ybTEgICA9IGZmX3BpeF9ub3JtMV9zc2UyOworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9YT1AoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5waXhfc3VtICAgICA9IGZmX3BpeF9zdW0xNl94b3A7CisgICAgfQorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKKyAgICBpZiAoSU5MSU5FX01NWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlmICghKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKSB7CisgICAgICAgICAgICBjLT50cnlfOHg4YmFzaXMgPSB0cnlfOHg4YmFzaXNfbW14OworICAgICAgICB9CisgICAgICAgIGMtPmFkZF84eDhiYXNpcyA9IGFkZF84eDhiYXNpc19tbXg7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlIDw9IDgpIHsKKyAgICAgICAgICAgIGMtPmRyYXdfZWRnZXMgPSBkcmF3X2VkZ2VzX21teDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChJTkxJTkVfQU1EM0ROT1coY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKSkgeworICAgICAgICAgICAgYy0+dHJ5Xzh4OGJhc2lzID0gdHJ5Xzh4OGJhc2lzXzNkbm93OworICAgICAgICB9CisgICAgICAgIGMtPmFkZF84eDhiYXNpcyA9IGFkZF84eDhiYXNpc18zZG5vdzsKKyAgICB9CisKKyNpZiBIQVZFX1NTU0UzX0lOTElORQorICAgIGlmIChJTkxJTkVfU1NTRTMoY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoIShhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX0JJVEVYQUNUKSkgeworICAgICAgICAgICAgYy0+dHJ5Xzh4OGJhc2lzID0gdHJ5Xzh4OGJhc2lzX3Nzc2UzOworICAgICAgICB9CisgICAgICAgIGMtPmFkZF84eDhiYXNpcyA9IGFkZF84eDhiYXNpc19zc3NlMzsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9TU1NFM19JTkxJTkUgKi8KKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3BpeGJsb2NrZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9waXhibG9ja2RzcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1Mzc3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9waXhibG9ja2RzcC5hc20KQEAgLTAsMCArMSwxMzMgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogU0lNRC1vcHRpbWl6ZWQgcGl4ZWwgb3BlcmF0aW9ucworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCis7KiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTiAudGV4dAorCitJTklUX01NWCBtbXgKKzsgdm9pZCBmZl9nZXRfcGl4ZWxzX21teChpbnQxNl90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplKQorY2dsb2JhbCBnZXRfcGl4ZWxzLCAzLDQKKyAgICBhZGQgICAgICAgICAgcjAsIDEyOAorICAgIG1vdiAgICAgICAgICByMywgLTEyOAorICAgIHB4b3IgICAgICAgICBtNywgbTcKKy5sb29wOgorICAgIG1vdmEgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICBtMiwgW3IxK3IyXQorICAgIG1vdmEgICAgICAgICBtMSwgbTAKKyAgICBtb3ZhICAgICAgICAgbTMsIG0yCisgICAgcHVucGNrbGJ3ICAgIG0wLCBtNworICAgIHB1bnBja2hidyAgICBtMSwgbTcKKyAgICBwdW5wY2tsYncgICAgbTIsIG03CisgICAgcHVucGNraGJ3ICAgIG0zLCBtNworICAgIG1vdmEgW3IwK3IzKyAwXSwgbTAKKyAgICBtb3ZhIFtyMCtyMysgOF0sIG0xCisgICAgbW92YSBbcjArcjMrMTZdLCBtMgorICAgIG1vdmEgW3IwK3IzKzI0XSwgbTMKKyAgICBsZWEgICAgICAgICAgcjEsIFtyMStyMioyXQorICAgIGFkZCAgICAgICAgICByMywgMzIKKyAgICBqcyAubG9vcAorICAgIFJFUF9SRVQKKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBnZXRfcGl4ZWxzLCAzLCA0LCA1CisgICAgbGVhICAgICAgICAgIHIzLCBbcjIqM10KKyAgICBweG9yICAgICAgICAgbTQsIG00CisgICAgbW92aCAgICAgICAgIG0wLCBbcjFdCisgICAgbW92aCAgICAgICAgIG0xLCBbcjErcjJdCisgICAgbW92aCAgICAgICAgIG0yLCBbcjErcjIqMl0KKyAgICBtb3ZoICAgICAgICAgbTMsIFtyMStyM10KKyAgICBsZWEgICAgICAgICAgcjEsIFtyMStyMio0XQorICAgIHB1bnBja2xidyAgICBtMCwgbTQKKyAgICBwdW5wY2tsYncgICAgbTEsIG00CisgICAgcHVucGNrbGJ3ICAgIG0yLCBtNAorICAgIHB1bnBja2xidyAgICBtMywgbTQKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0wCisgICAgbW92YSAgW3IwKzB4MTBdLCBtMQorICAgIG1vdmEgIFtyMCsweDIwXSwgbTIKKyAgICBtb3ZhICBbcjArMHgzMF0sIG0zCisgICAgbW92aCAgICAgICAgIG0wLCBbcjFdCisgICAgbW92aCAgICAgICAgIG0xLCBbcjErcjIqMV0KKyAgICBtb3ZoICAgICAgICAgbTIsIFtyMStyMioyXQorICAgIG1vdmggICAgICAgICBtMywgW3IxK3IzXQorICAgIHB1bnBja2xidyAgICBtMCwgbTQKKyAgICBwdW5wY2tsYncgICAgbTEsIG00CisgICAgcHVucGNrbGJ3ICAgIG0yLCBtNAorICAgIHB1bnBja2xidyAgICBtMywgbTQKKyAgICBtb3ZhICBbcjArMHg0MF0sIG0wCisgICAgbW92YSAgW3IwKzB4NTBdLCBtMQorICAgIG1vdmEgIFtyMCsweDYwXSwgbTIKKyAgICBtb3ZhICBbcjArMHg3MF0sIG0zCisgICAgUkVUCisKK0lOSVRfTU1YIG1teAorOyB2b2lkIGZmX2RpZmZfcGl4ZWxzX21teChpbnQxNl90ICpibG9jaywgY29uc3QgdWludDhfdCAqczEsIGNvbnN0IHVpbnQ4X3QgKnMyLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKTsKK2NnbG9iYWwgZGlmZl9waXhlbHMsIDQsNQorICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCisgICAgcHhvciAgICAgICAgIG03LCBtNworICAgIGFkZCAgICAgICAgICByMCwgIDEyOAorICAgIG1vdiAgICAgICAgICByNCwgLTEyOAorLmxvb3A6CisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgbW92YSAgICAgICAgIG0yLCBbcjJdCisgICAgbW92YSAgICAgICAgIG0xLCBtMAorICAgIG1vdmEgICAgICAgICBtMywgbTIKKyAgICBwdW5wY2tsYncgICAgbTAsIG03CisgICAgcHVucGNraGJ3ICAgIG0xLCBtNworICAgIHB1bnBja2xidyAgICBtMiwgbTcKKyAgICBwdW5wY2toYncgICAgbTMsIG03CisgICAgcHN1YncgICAgICAgIG0wLCBtMgorICAgIHBzdWJ3ICAgICAgICBtMSwgbTMKKyAgICBtb3ZhICBbcjArcjQrMF0sIG0wCisgICAgbW92YSAgW3IwK3I0KzhdLCBtMQorICAgIGFkZCAgICAgICAgICByMSwgcjMKKyAgICBhZGQgICAgICAgICAgcjIsIHIzCisgICAgYWRkICAgICAgICAgIHI0LCAxNgorICAgIGpuZSAubG9vcAorICAgIFJFUF9SRVQKKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBkaWZmX3BpeGVscywgNCwgNSwgNQorICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCisgICAgcHhvciAgICAgICAgIG00LCBtNAorICAgIGFkZCAgICAgICAgICByMCwgIDEyOAorICAgIG1vdiAgICAgICAgICByNCwgLTEyOAorLmxvb3A6CisgICAgbW92aCAgICAgICAgIG0wLCBbcjFdCisgICAgbW92aCAgICAgICAgIG0yLCBbcjJdCisgICAgbW92aCAgICAgICAgIG0xLCBbcjErcjNdCisgICAgbW92aCAgICAgICAgIG0zLCBbcjIrcjNdCisgICAgcHVucGNrbGJ3ICAgIG0wLCBtNAorICAgIHB1bnBja2xidyAgICBtMSwgbTQKKyAgICBwdW5wY2tsYncgICAgbTIsIG00CisgICAgcHVucGNrbGJ3ICAgIG0zLCBtNAorICAgIHBzdWJ3ICAgICAgICBtMCwgbTIKKyAgICBwc3VidyAgICAgICAgbTEsIG0zCisgICAgbW92YSBbcjArcjQrMCBdLCBtMAorICAgIG1vdmEgW3IwK3I0KzE2XSwgbTEKKyAgICBsZWEgICAgICAgICAgcjEsIFtyMStyMyoyXQorICAgIGxlYSAgICAgICAgICByMiwgW3IyK3IzKjJdCisgICAgYWRkICAgICAgICAgIHI0LCAzMgorICAgIGpuZSAubG9vcAorICAgIFJFVApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3BpeGJsb2NrZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9waXhibG9ja2RzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwNmE0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9waXhibG9ja2RzcF9pbml0LmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIFNJTUQtb3B0aW1pemVkIHBpeGVsIG9wZXJhdGlvbnMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9waXhibG9ja2RzcC5oIgorCit2b2lkIGZmX2dldF9waXhlbHNfbW14KGludDE2X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUpOwordm9pZCBmZl9nZXRfcGl4ZWxzX3NzZTIoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSk7Cit2b2lkIGZmX2RpZmZfcGl4ZWxzX21teChpbnQxNl90ICpibG9jaywgY29uc3QgdWludDhfdCAqczEsIGNvbnN0IHVpbnQ4X3QgKnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSk7Cit2b2lkIGZmX2RpZmZfcGl4ZWxzX3NzZTIoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnMxLCBjb25zdCB1aW50OF90ICpzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKTsKKworYXZfY29sZCB2b2lkIGZmX3BpeGJsb2NrZHNwX2luaXRfeDg2KFBpeGJsb2NrRFNQQ29udGV4dCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoIWhpZ2hfYml0X2RlcHRoKQorICAgICAgICAgICAgYy0+Z2V0X3BpeGVscyA9IGZmX2dldF9waXhlbHNfbW14OworICAgICAgICBjLT5kaWZmX3BpeGVscyA9IGZmX2RpZmZfcGl4ZWxzX21teDsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlmICghaGlnaF9iaXRfZGVwdGgpCisgICAgICAgICAgICBjLT5nZXRfcGl4ZWxzID0gZmZfZ2V0X3BpeGVsc19zc2UyOworICAgICAgICBjLT5kaWZmX3BpeGVscyA9IGZmX2RpZmZfcGl4ZWxzX3NzZTI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3BuZ2RzcC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvcG5nZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzhhMDMyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3BuZ2RzcC5hc20KQEAgLTAsMCArMSwxNzMgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIHg4NiBvcHRpbWl6YXRpb25zIGZvciBQTkcgZGVjb2RpbmcKKzsqCis7KiBDb3B5cmlnaHQgKGMpIDIwMDggTG9yZW4gTWVycml0dCA8bG9yZW5tQHUud2FzaGluZ3Rvbi5lZHU+Cis7KiBDb3B5cmlnaHQgKGMpIDIwMTIgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amVAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIDUxLCBJbmMuLCBGb3VuZGF0aW9uIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK2NleHRlcm4gcHdfMjU1CisKK1NFQ1RJT05fVEVYVAorCis7ICUxID0gbnIuIG9mIHhtbSByZWdpc3RlcnMgdXNlZAorJW1hY3JvIEFERF9CWVRFU19GTiAxCitjZ2xvYmFsIGFkZF9ieXRlc19sMiwgNCwgNiwgJTEsIGRzdCwgc3JjMSwgc3JjMiwgd2EsIHcsIGkKKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdnN4ZCAgICAgICAgICAgICB3YXEsIHdhZAorJWVuZGlmCisgICAgeG9yICAgICAgICAgICAgICAgICBpcSwgaXEKKworICAgIDsgdmVjdG9yIGxvb3AKKyAgICBtb3YgICAgICAgICAgICAgICAgIHdxLCB3YXEKKyAgICBhbmQgICAgICAgICAgICAgICAgd2FxLCB+KG1tc2l6ZSoyLTEpCisgICAgam1wIC5lbmRfdgorLmxvb3BfdjoKKyAgICBtb3Z1ICAgICAgICAgICAgICAgIG0wLCBbc3JjMnEraXFdCisgICAgbW92dSAgICAgICAgICAgICAgICBtMSwgW3NyYzJxK2lxK21tc2l6ZV0KKyAgICBwYWRkYiAgICAgICAgICAgICAgIG0wLCBbc3JjMXEraXFdCisgICAgcGFkZGIgICAgICAgICAgICAgICBtMSwgW3NyYzFxK2lxK21tc2l6ZV0KKyAgICBtb3Z1ICBbZHN0cStpcSAgICAgICBdLCBtMAorICAgIG1vdnUgIFtkc3RxK2lxK21tc2l6ZV0sIG0xCisgICAgYWRkICAgICAgICAgICAgICAgICBpcSwgbW1zaXplKjIKKy5lbmRfdjoKKyAgICBjbXAgICAgICAgICAgICAgICAgIGlxLCB3YXEKKyAgICBqbCAubG9vcF92CisKKyVpZiBtbXNpemUgPT0gMTYKKyAgICA7IHZlY3RvciBsb29wCisgICAgbW92ICAgICAgICAgICAgICAgIHdhcSwgd3EKKyAgICBhbmQgICAgICAgICAgICAgICAgd2FxLCB+NworICAgIGptcCAuZW5kX2wKKy5sb29wX2w6CisgICAgbW92cSAgICAgICAgICAgICAgIG1tMCwgW3NyYzFxK2lxXQorICAgIHBhZGRiICAgICAgICAgICAgICBtbTAsIFtzcmMycStpcV0KKyAgICBtb3ZxICBbZHN0cStpcSAgICAgICBdLCBtbTAKKyAgICBhZGQgICAgICAgICAgICAgICAgIGlxLCA4CisuZW5kX2w6CisgICAgY21wICAgICAgICAgICAgICAgICBpcSwgd2FxCisgICAgamwgLmxvb3BfbAorJWVuZGlmCisKKyAgICA7IHNjYWxhciBsb29wIGZvciBsZWZ0b3ZlcgorICAgIGptcCAuZW5kX3MKKy5sb29wX3M6CisgICAgbW92ICAgICAgICAgICAgICAgIHdhYiwgW3NyYzFxK2lxXQorICAgIGFkZCAgICAgICAgICAgICAgICB3YWIsIFtzcmMycStpcV0KKyAgICBtb3YgICAgICAgICAgW2RzdHEraXFdLCB3YWIKKyAgICBpbmMgICAgICAgICAgICAgICAgIGlxCisuZW5kX3M6CisgICAgY21wICAgICAgICAgICAgICAgICBpcSwgd3EKKyAgICBqbCAubG9vcF9zCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggbW14CitBRERfQllURVNfRk4gMAorJWVuZGlmCisKK0lOSVRfWE1NIHNzZTIKK0FERF9CWVRFU19GTiAyCisKKyVtYWNybyBBRERfUEFFVEhfUFJFRF9GTiAxCitjZ2xvYmFsIGFkZF9wbmdfcGFldGhfcHJlZGljdGlvbiwgNSwgNywgJTEsIGRzdCwgc3JjLCB0b3AsIHcsIGJwcCwgZW5kLCBjbnRyCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgICAgICBicHBxLCBicHBkCisgICAgbW92c3hkICAgICAgICAgICAgICB3cSwgd2QKKyVlbmRpZgorICAgIGxlYSAgICAgICAgICAgICAgIGVuZHEsIFtkc3RxK3dxLShtbXNpemUvMi0xKV0KKyAgICBzdWIgICAgICAgICAgICAgICB0b3BxLCBkc3RxCisgICAgc3ViICAgICAgICAgICAgICAgc3JjcSwgZHN0cQorICAgIHN1YiAgICAgICAgICAgICAgIGRzdHEsIGJwcHEKKyAgICBweG9yICAgICAgICAgICAgICAgIG03LCBtNworCisgICAgUFVTSCAgICAgICAgICAgICAgZHN0cQorICAgIGxlYSAgICAgICAgICAgICAgY250cnEsIFticHBxLTFdCisgICAgc2hyICAgICAgICAgICAgICBjbnRycSwgMiArIG1tc2l6ZS8xNgorLmJwcF9sb29wOgorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK2NudHJxKihtbXNpemUvMildCisgICAgbW92aCAgICAgICAgICAgICAgICBtMCwgW2RzdHFdCisgICAgbW92aCAgICAgICAgICAgICAgICBtMSwgW3RvcHErZHN0cV0KKyAgICBwdW5wY2tsYncgICAgICAgICAgIG0wLCBtNworICAgIHB1bnBja2xidyAgICAgICAgICAgbTEsIG03CisgICAgYWRkICAgICAgICAgICAgICAgZHN0cSwgYnBwcQorLmxvb3A6CisgICAgbW92YSAgICAgICAgICAgICAgICBtMiwgbTEKKyAgICBtb3ZoICAgICAgICAgICAgICAgIG0xLCBbdG9wcStkc3RxXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTMsIG0yCisgICAgcHVucGNrbGJ3ICAgICAgICAgICBtMSwgbTcKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG00LCBtMgorICAgIHBzdWJ3ICAgICAgICAgICAgICAgbTMsIG0xCisgICAgcHN1YncgICAgICAgICAgICAgICBtNCwgbTAKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG01LCBtMworICAgIHBhZGR3ICAgICAgICAgICAgICAgbTUsIG00CislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICBwYWJzdyAgICAgICAgICAgICAgIG0zLCBtMworICAgIHBhYnN3ICAgICAgICAgICAgICAgbTQsIG00CisgICAgcGFic3cgICAgICAgICAgICAgICBtNSwgbTUKKyVlbHNlIDsgIWNwdWZsYWcoc3NzZTMpCisgICAgcHN1YncgICAgICAgICAgICAgICBtNywgbTUKKyAgICBwbWF4c3cgICAgICAgICAgICAgIG01LCBtNworICAgIHB4b3IgICAgICAgICAgICAgICAgbTYsIG02CisgICAgcHhvciAgICAgICAgICAgICAgICBtNywgbTcKKyAgICBwc3VidyAgICAgICAgICAgICAgIG02LCBtMworICAgIHBzdWJ3ICAgICAgICAgICAgICAgbTcsIG00CisgICAgcG1heHN3ICAgICAgICAgICAgICBtMywgbTYKKyAgICBwbWF4c3cgICAgICAgICAgICAgIG00LCBtNworICAgIHB4b3IgICAgICAgICAgICAgICAgbTcsIG03CislZW5kaWYgOyBjcHVmbGFnKHNzc2UzKQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTYsIG00CisgICAgcG1pbnN3ICAgICAgICAgICAgICBtNiwgbTUKKyAgICBwY21wZ3R3ICAgICAgICAgICAgIG0zLCBtNgorICAgIHBjbXBndHcgICAgICAgICAgICAgbTQsIG01CisgICAgbW92YSAgICAgICAgICAgICAgICBtNiwgbTQKKyAgICBwYW5kICAgICAgICAgICAgICAgIG00LCBtMworICAgIHBhbmRuICAgICAgICAgICAgICAgbTYsIG0zCisgICAgcGFuZG4gICAgICAgICAgICAgICBtMywgbTAKKyAgICBtb3ZoICAgICAgICAgICAgICAgIG0wLCBbc3JjcStkc3RxXQorICAgIHBhbmQgICAgICAgICAgICAgICAgbTYsIG0xCisgICAgcGFuZCAgICAgICAgICAgICAgICBtMiwgbTQKKyAgICBwdW5wY2tsYncgICAgICAgICAgIG0wLCBtNworICAgIHBhZGR3ICAgICAgICAgICAgICAgbTAsIG02CisgICAgcGFkZHcgICAgICAgICAgICAgICBtMywgbTIKKyAgICBwYWRkdyAgICAgICAgICAgICAgIG0wLCBtMworICAgIHBhbmQgICAgICAgICAgICAgICAgbTAsIFtwd18yNTVdCisgICAgbW92YSAgICAgICAgICAgICAgICBtMywgbTAKKyAgICBwYWNrdXN3YiAgICAgICAgICAgIG0zLCBtMworICAgIG1vdmggICAgICAgICAgICBbZHN0cV0sIG0zCisgICAgYWRkICAgICAgICAgICAgICAgZHN0cSwgYnBwcQorICAgIGNtcCAgICAgICAgICAgICAgIGRzdHEsIGVuZHEKKyAgICBqbGUgLmxvb3AKKworICAgIG1vdiAgICAgICAgICAgICAgIGRzdHEsIFtyc3BdCisgICAgZGVjICAgICAgICAgICAgICBjbnRycQorICAgIGpnZSAuYnBwX2xvb3AKKyAgICBQT1AgICAgICAgICAgICAgICBkc3RxCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitBRERfUEFFVEhfUFJFRF9GTiAwCisKK0lOSVRfTU1YIHNzc2UzCitBRERfUEFFVEhfUFJFRF9GTiAwCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvcG5nZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9wbmdkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkY2E2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvcG5nZHNwX2luaXQuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogeDg2IFBORyBvcHRpbWl6YXRpb25zLgorICogQ29weXJpZ2h0IChjKSAyMDA4IExvcmVuIE1lcnJpdCA8bG9yZW5tQHUud2FzaGluZ3Rvbi5lZHU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvcG5nZHNwLmgiCisKK3ZvaWQgZmZfYWRkX3BuZ19wYWV0aF9wcmVkaWN0aW9uX21teGV4dCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp0b3AsIGludCB3LCBpbnQgYnBwKTsKK3ZvaWQgZmZfYWRkX3BuZ19wYWV0aF9wcmVkaWN0aW9uX3Nzc2UzKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdG9wLCBpbnQgdywgaW50IGJwcCk7Cit2b2lkIGZmX2FkZF9ieXRlc19sMl9tbXggKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjMiwgaW50IHcpOwordm9pZCBmZl9hZGRfYnl0ZXNfbDJfc3NlMih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYzIsIGludCB3KTsKKworYXZfY29sZCB2b2lkIGZmX3BuZ2RzcF9pbml0X3g4NihQTkdEU1BDb250ZXh0ICpkc3ApCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworI2lmIEFSQ0hfWDg2XzMyCisgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKQorICAgICAgICBkc3AtPmFkZF9ieXRlc19sMiAgICAgICAgID0gZmZfYWRkX2J5dGVzX2wyX21teDsKKyNlbmRpZgorICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSkKKyAgICAgICAgZHNwLT5hZGRfcGFldGhfcHJlZGljdGlvbiA9IGZmX2FkZF9wbmdfcGFldGhfcHJlZGljdGlvbl9tbXhleHQ7CisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgZHNwLT5hZGRfYnl0ZXNfbDIgICAgICAgICA9IGZmX2FkZF9ieXRlc19sMl9zc2UyOworICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKQorICAgICAgICBkc3AtPmFkZF9wYWV0aF9wcmVkaWN0aW9uID0gZmZfYWRkX3BuZ19wYWV0aF9wcmVkaWN0aW9uX3Nzc2UzOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3Byb3Jlc2RzcC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvcHJvcmVzZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTVlYjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3Byb3Jlc2RzcC5hc20KQEAgLTAsMCArMSwzMjYgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIHg4Ni1TSU1ELW9wdGltaXplZCBJRENUIGZvciBwcm9yZXMKKzsqIHRoaXMgaXMgaWRlbnRpY2FsIHRvICJzaW1wbGUiIElEQ1Qgd3JpdHRlbiBieSBNaWNoYWVsIE5pZWRlcm1heWVyCis7KiBleGNlcHQgZm9yIHRoZSBjbGlwIHJhbmdlCis7KgorOyogQ29weXJpZ2h0IChjKSAyMDExIFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiA1MSwgSW5jLiwgRm91bmRhdGlvbiBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCislZGVmaW5lIFcxc2gyIDIyNzI1IDsgVzEgPSA5MDkwMSA9IDIyNzI1PDwyICsgMQorJWRlZmluZSBXMnNoMiAyMTQwNyA7IFcyID0gODU2MjcgPSAyMTQwNzw8MiAtIDEKKyVkZWZpbmUgVzNzaDIgMTkyNjUgOyBXMyA9IDc3MDYyID0gMTkyNjU8PDIgKyAyCislZGVmaW5lIFc0c2gyIDE2Mzg0IDsgVzQgPSA2NTUzNSA9IDE2Mzg0PDwyIC0gMQorJWRlZmluZSBXNXNoMiAxMjg3MyA7IFc1ID0gNTE0OTEgPSAxMjg3Mzw8MiAtIDEKKyVkZWZpbmUgVzZzaDIgIDg4NjcgOyBXNiA9IDM1NDY4ID0gIDg4Njc8PDIKKyVkZWZpbmUgVzdzaDIgIDQ1MjAgOyBXNyA9IDE4MDgxID0gIDQ1MjA8PDIgKyAxCisKKyVpZiBBUkNIX1g4Nl82NAorCitTRUNUSU9OX1JPREFUQQorCit3NF9wbHVzX3cyOiB0aW1lcyA0IGR3IFc0c2gyLCArVzJzaDIKK3c0X21pbl93MjogIHRpbWVzIDQgZHcgVzRzaDIsIC1XMnNoMgordzRfcGx1c193NjogdGltZXMgNCBkdyBXNHNoMiwgK1c2c2gyCit3NF9taW5fdzY6ICB0aW1lcyA0IGR3IFc0c2gyLCAtVzZzaDIKK3cxX3BsdXNfdzM6IHRpbWVzIDQgZHcgVzFzaDIsICtXM3NoMgordzNfbWluX3cxOiAgdGltZXMgNCBkdyBXM3NoMiwgLVcxc2gyCit3N19wbHVzX3czOiB0aW1lcyA0IGR3IFc3c2gyLCArVzNzaDIKK3czX21pbl93NzogIHRpbWVzIDQgZHcgVzNzaDIsIC1XN3NoMgordzFfcGx1c193NTogdGltZXMgNCBkdyBXMXNoMiwgK1c1c2gyCit3NV9taW5fdzE6ICB0aW1lcyA0IGR3IFc1c2gyLCAtVzFzaDIKK3c1X3BsdXNfdzc6IHRpbWVzIDQgZHcgVzVzaDIsICtXN3NoMgordzdfbWluX3c1OiAgdGltZXMgNCBkdyBXN3NoMiwgLVc1c2gyCitwd184ODogICAgICB0aW1lcyA4IGR3IDB4MjAwOAorCitjZXh0ZXJuIHB3XzEKK2NleHRlcm4gcHdfNAorY2V4dGVybiBwd181MTIKK2NleHRlcm4gcHdfMTAxOQorCitzZWN0aW9uIC50ZXh0IGFsaWduPTE2CisKKzsgaW50ZXJsZWF2ZSBkYXRhIHdoaWxlIG1haW50YWluaW5nIHNvdXJjZQorOyAlMT10eXBlLCAlMj1kc3RsbywgJTM9ZHN0aGksICU0PXNyYywgJTU9aW50ZXJsZWF2ZQorJW1hY3JvIFNCVVRURVJGTFkzIDUKKyAgICBwdW5wY2tsJTEgICBtJTIsIG0lNCwgbSU1CisgICAgcHVucGNraCUxICAgbSUzLCBtJTQsIG0lNQorJWVuZG1hY3JvCisKKzsgJTEvJTI9c3JjMS9kc3QxLCAlMy8lND1kc3QyLCAlNS8lNj1zcmMyLCAlNz1zaGlmdAorOyBhY3Rpb246ICUzLyU0ID0gJTEvJTIgLSAlNS8lNjsgJTEvJTIgKz0gJTUvJTYKKzsgICAgICAgICAlMS8lMi8lMy8lNCA+Pj0gJTc7IGR3b3JkIC0+IHdvcmQgKGluICUxLyUzKQorJW1hY3JvIFNVTVNVQl9TSFBLIDcKKyAgICBwc3ViZCAgICAgICAlMywgICUxLCAgJTUgICAgICAgOyB7IGEwIC0gYjAgfVswLTNdCisgICAgcHN1YmQgICAgICAgJTQsICAlMiwgICU2ICAgICAgIDsgeyBhMCAtIGIwIH1bNC03XQorICAgIHBhZGRkICAgICAgICUxLCAgJTUgICAgICAgICAgICA7IHsgYTAgKyBiMCB9WzAtM10KKyAgICBwYWRkZCAgICAgICAlMiwgICU2ICAgICAgICAgICAgOyB7IGEwICsgYjAgfVs0LTddCisgICAgcHNyYWQgICAgICAgJTEsICAlNworICAgIHBzcmFkICAgICAgICUyLCAgJTcKKyAgICBwc3JhZCAgICAgICAlMywgICU3CisgICAgcHNyYWQgICAgICAgJTQsICAlNworICAgIHBhY2tzc2R3ICAgICUxLCAgJTIgICAgICAgICAgICA7IHJvd1swXQorICAgIHBhY2tzc2R3ICAgICUzLCAgJTQgICAgICAgICAgICA7IHJvd1s3XQorJWVuZG1hY3JvCisKKzsgJTEgPSByb3cgb3IgY29sIChmb3Igcm91bmRpbmcgdmFyaWFibGUpCis7ICUyID0gbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgYXQgdGhlIGVuZAorJW1hY3JvIElEQ1RfMUQgMgorICAgIDsgYTAgPSAoVzQgKiByb3dbMF0pICsgKDEgPDwgKDE1IC0gMSkpOworICAgIDsgYTEgPSBhMDsKKyAgICA7IGEyID0gYTA7CisgICAgOyBhMyA9IGEwOworICAgIDsgYTAgKz0gVzIgKiByb3dbMl07CisgICAgOyBhMSArPSBXNiAqIHJvd1syXTsKKyAgICA7IGEyIC09IFc2ICogcm93WzJdOworICAgIDsgYTMgLT0gVzIgKiByb3dbMl07CislaWZpZG4gJTEsIGNvbAorICAgIHBhZGR3ICAgICAgIG0xMCxbcHdfODhdCislZW5kaWYKKyVpZmlkbiAlMSwgcm93CisgICAgcGFkZHcgICAgICAgbTEwLFtwd18xXQorJWVuZGlmCisgICAgU0JVVFRFUkZMWTMgd2QsICAwLCAgMSwgMTAsICA4IDsgeyByb3dbMF0sIHJvd1syXSB9WzAtM10vWzQtN10KKyAgICBwbWFkZHdkICAgICBtMiwgIG0wLCBbdzRfcGx1c193Nl0KKyAgICBwbWFkZHdkICAgICBtMywgIG0xLCBbdzRfcGx1c193Nl0KKyAgICBwbWFkZHdkICAgICBtNCwgIG0wLCBbdzRfbWluX3c2XQorICAgIHBtYWRkd2QgICAgIG01LCAgbTEsIFt3NF9taW5fdzZdCisgICAgcG1hZGR3ZCAgICAgbTYsICBtMCwgW3c0X21pbl93Ml0KKyAgICBwbWFkZHdkICAgICBtNywgIG0xLCBbdzRfbWluX3cyXQorICAgIHBtYWRkd2QgICAgIG0wLCBbdzRfcGx1c193Ml0KKyAgICBwbWFkZHdkICAgICBtMSwgW3c0X3BsdXNfdzJdCisKKyAgICA7IGEwOiAtMSpyb3dbMF0tMSpyb3dbMl0KKyAgICA7IGExOiAtMSpyb3dbMF0KKyAgICA7IGEyOiAtMSpyb3dbMF0KKyAgICA7IGEzOiAtMSpyb3dbMF0rMSpyb3dbMl0KKworICAgIDsgYTAgKz0gICBXNCpyb3dbNF0gKyBXNipyb3dbNl07IGkuZS4gLTEqcm93WzRdCisgICAgOyBhMSAtPSAgIFc0KnJvd1s0XSArIFcyKnJvd1s2XTsgaS5lLiAtMSpyb3dbNF0tMSpyb3dbNl0KKyAgICA7IGEyIC09ICAgVzQqcm93WzRdIC0gVzIqcm93WzZdOyBpLmUuIC0xKnJvd1s0XSsxKnJvd1s2XQorICAgIDsgYTMgKz0gICBXNCpyb3dbNF0gLSBXNipyb3dbNl07IGkuZS4gLTEqcm93WzRdCisgICAgU0JVVFRFUkZMWTMgd2QsICA4LCAgOSwgMTMsIDEyIDsgeyByb3dbNF0sIHJvd1s2XSB9WzAtM10vWzQtN10KKyAgICBwbWFkZHdkICAgICBtMTAsIG04LCBbdzRfcGx1c193Nl0KKyAgICBwbWFkZHdkICAgICBtMTEsIG05LCBbdzRfcGx1c193Nl0KKyAgICBwYWRkZCAgICAgICBtMCwgIG0xMCAgICAgICAgICAgIDsgYTBbMC0zXQorICAgIHBhZGRkICAgICAgIG0xLCAgbTExICAgICAgICAgICAgOyBhMFs0LTddCisgICAgcG1hZGR3ZCAgICAgbTEwLCBtOCwgW3c0X21pbl93Nl0KKyAgICBwbWFkZHdkICAgICBtMTEsIG05LCBbdzRfbWluX3c2XQorICAgIHBhZGRkICAgICAgIG02LCAgbTEwICAgICAgICAgICA7IGEzWzAtM10KKyAgICBwYWRkZCAgICAgICBtNywgIG0xMSAgICAgICAgICAgOyBhM1s0LTddCisgICAgcG1hZGR3ZCAgICAgbTEwLCBtOCwgW3c0X21pbl93Ml0KKyAgICBwbWFkZHdkICAgICBtMTEsIG05LCBbdzRfbWluX3cyXQorICAgIHBtYWRkd2QgICAgIG04LCBbdzRfcGx1c193Ml0KKyAgICBwbWFkZHdkICAgICBtOSwgW3c0X3BsdXNfdzJdCisgICAgcHN1YmQgICAgICAgbTQsICBtMTAgICAgICAgICAgIDsgYTJbMC0zXSBpbnRlcm1lZGlhdGUKKyAgICBwc3ViZCAgICAgICBtNSwgIG0xMSAgICAgICAgICAgOyBhMls0LTddIGludGVybWVkaWF0ZQorICAgIHBzdWJkICAgICAgIG0yLCAgbTggICAgICAgICAgICA7IGExWzAtM10gaW50ZXJtZWRpYXRlCisgICAgcHN1YmQgICAgICAgbTMsICBtOSAgICAgICAgICAgIDsgYTFbNC03XSBpbnRlcm1lZGlhdGUKKworICAgIDsgbG9hZC9zdG9yZQorICAgIG1vdmEgICBbcjIrICAwXSwgbTAKKyAgICBtb3ZhICAgW3IyKyAzMl0sIG0yCisgICAgbW92YSAgIFtyMisgNjRdLCBtNAorICAgIG1vdmEgICBbcjIrIDk2XSwgbTYKKyAgICBtb3ZhICAgICAgICBtMTAsW3IyKyAxNl0gICAgICAgOyB7IHJvd1sxXSB9WzAtN10KKyAgICBtb3ZhICAgICAgICBtOCwgW3IyKyA0OF0gICAgICAgOyB7IHJvd1szXSB9WzAtN10KKyAgICBtb3ZhICAgICAgICBtMTMsW3IyKyA4MF0gICAgICAgOyB7IHJvd1s1XSB9WzAtN10KKyAgICBtb3ZhICAgICAgICBtMTQsW3IyKzExMl0gICAgICAgOyB7IHJvd1s3XSB9WzAtN10KKyAgICBtb3ZhICAgW3IyKyAxNl0sIG0xCisgICAgbW92YSAgIFtyMisgNDhdLCBtMworICAgIG1vdmEgICBbcjIrIDgwXSwgbTUKKyAgICBtb3ZhICAgW3IyKzExMl0sIG03CislaWZpZG4gJTEsIHJvdworICAgIHBtdWxsdyAgICAgIG0xMCxbcjMrIDE2XQorICAgIHBtdWxsdyAgICAgIG04LCBbcjMrIDQ4XQorICAgIHBtdWxsdyAgICAgIG0xMyxbcjMrIDgwXQorICAgIHBtdWxsdyAgICAgIG0xNCxbcjMrMTEyXQorJWVuZGlmCisKKyAgICA7IGIwID0gTVVMKFcxLCByb3dbMV0pOworICAgIDsgTUFDKGIwLCBXMywgcm93WzNdKTsKKyAgICA7IGIxID0gTVVMKFczLCByb3dbMV0pOworICAgIDsgTUFDKGIxLCAtVzcsIHJvd1szXSk7CisgICAgOyBiMiA9IE1VTChXNSwgcm93WzFdKTsKKyAgICA7IE1BQyhiMiwgLVcxLCByb3dbM10pOworICAgIDsgYjMgPSBNVUwoVzcsIHJvd1sxXSk7CisgICAgOyBNQUMoYjMsIC1XNSwgcm93WzNdKTsKKyAgICBTQlVUVEVSRkxZMyB3ZCwgIDAsICAxLCAxMCwgOCAgOyB7IHJvd1sxXSwgcm93WzNdIH1bMC0zXS9bNC03XQorICAgIHBtYWRkd2QgICAgIG0yLCAgbTAsIFt3M19taW5fdzddCisgICAgcG1hZGR3ZCAgICAgbTMsICBtMSwgW3czX21pbl93N10KKyAgICBwbWFkZHdkICAgICBtNCwgIG0wLCBbdzVfbWluX3cxXQorICAgIHBtYWRkd2QgICAgIG01LCAgbTEsIFt3NV9taW5fdzFdCisgICAgcG1hZGR3ZCAgICAgbTYsICBtMCwgW3c3X21pbl93NV0KKyAgICBwbWFkZHdkICAgICBtNywgIG0xLCBbdzdfbWluX3c1XQorICAgIHBtYWRkd2QgICAgIG0wLCBbdzFfcGx1c193M10KKyAgICBwbWFkZHdkICAgICBtMSwgW3cxX3BsdXNfdzNdCisKKyAgICA7IGIwOiArMSpyb3dbMV0rMipyb3dbM10KKyAgICA7IGIxOiArMipyb3dbMV0tMSpyb3dbM10KKyAgICA7IGIyOiAtMSpyb3dbMV0tMSpyb3dbM10KKyAgICA7IGIzOiArMSpyb3dbMV0rMSpyb3dbM10KKworICAgIDsgTUFDKGIwLCAgVzUsIHJvd1s1XSk7CisgICAgOyBNQUMoYjAsICBXNywgcm93WzddKTsKKyAgICA7IE1BQyhiMSwgLVcxLCByb3dbNV0pOworICAgIDsgTUFDKGIxLCAtVzUsIHJvd1s3XSk7CisgICAgOyBNQUMoYjIsICBXNywgcm93WzVdKTsKKyAgICA7IE1BQyhiMiwgIFczLCByb3dbN10pOworICAgIDsgTUFDKGIzLCAgVzMsIHJvd1s1XSk7CisgICAgOyBNQUMoYjMsIC1XMSwgcm93WzddKTsKKyAgICBTQlVUVEVSRkxZMyB3ZCwgIDgsICA5LCAxMywgMTQgOyB7IHJvd1s1XSwgcm93WzddIH1bMC0zXS9bNC03XQorCisgICAgOyBiMDogLTEqcm93WzVdKzEqcm93WzddCisgICAgOyBiMTogLTEqcm93WzVdKzEqcm93WzddCisgICAgOyBiMjogKzEqcm93WzVdKzIqcm93WzddCisgICAgOyBiMzogKzIqcm93WzVdLTEqcm93WzddCisKKyAgICBwbWFkZHdkICAgICBtMTAsIG04LCBbdzFfcGx1c193NV0KKyAgICBwbWFkZHdkICAgICBtMTEsIG05LCBbdzFfcGx1c193NV0KKyAgICBwbWFkZHdkICAgICBtMTIsIG04LCBbdzVfcGx1c193N10KKyAgICBwbWFkZHdkICAgICBtMTMsIG05LCBbdzVfcGx1c193N10KKyAgICBwc3ViZCAgICAgICBtMiwgIG0xMCAgICAgICAgICAgOyBiMVswLTNdCisgICAgcHN1YmQgICAgICAgbTMsICBtMTEgICAgICAgICAgIDsgYjFbNC03XQorICAgIHBhZGRkICAgICAgIG0wLCAgbTEyICAgICAgICAgICAgOyBiMFswLTNdCisgICAgcGFkZGQgICAgICAgbTEsICBtMTMgICAgICAgICAgICA7IGIwWzQtN10KKyAgICBwbWFkZHdkICAgICBtMTIsIG04LCBbdzdfcGx1c193M10KKyAgICBwbWFkZHdkICAgICBtMTMsIG05LCBbdzdfcGx1c193M10KKyAgICBwbWFkZHdkICAgICBtOCwgW3czX21pbl93MV0KKyAgICBwbWFkZHdkICAgICBtOSwgW3czX21pbl93MV0KKyAgICBwYWRkZCAgICAgICBtNCwgIG0xMiAgICAgICAgICAgOyBiMlswLTNdCisgICAgcGFkZGQgICAgICAgbTUsICBtMTMgICAgICAgICAgIDsgYjJbNC03XQorICAgIHBhZGRkICAgICAgIG02LCAgbTggICAgICAgICAgICA7IGIzWzAtM10KKyAgICBwYWRkZCAgICAgICBtNywgIG05ICAgICAgICAgICAgOyBiM1s0LTddCisKKyAgICA7IHJvd1swXSA9IChhMCArIGIwKSA+PiAxNTsKKyAgICA7IHJvd1s3XSA9IChhMCAtIGIwKSA+PiAxNTsKKyAgICA7IHJvd1sxXSA9IChhMSArIGIxKSA+PiAxNTsKKyAgICA7IHJvd1s2XSA9IChhMSAtIGIxKSA+PiAxNTsKKyAgICA7IHJvd1syXSA9IChhMiArIGIyKSA+PiAxNTsKKyAgICA7IHJvd1s1XSA9IChhMiAtIGIyKSA+PiAxNTsKKyAgICA7IHJvd1szXSA9IChhMyArIGIzKSA+PiAxNTsKKyAgICA7IHJvd1s0XSA9IChhMyAtIGIzKSA+PiAxNTsKKyAgICBtb3ZhICAgICAgICBtOCwgW3IyKyAwXSAgICAgICAgOyBhMFswLTNdCisgICAgbW92YSAgICAgICAgbTksIFtyMisxNl0gICAgICAgIDsgYTBbNC03XQorICAgIFNVTVNVQl9TSFBLIG04LCAgbTksICBtMTAsIG0xMSwgbTAsICBtMSwgICUyCisgICAgbW92YSAgICAgICAgbTAsIFtyMiszMl0gICAgICAgIDsgYTFbMC0zXQorICAgIG1vdmEgICAgICAgIG0xLCBbcjIrNDhdICAgICAgICA7IGExWzQtN10KKyAgICBTVU1TVUJfU0hQSyBtMCwgIG0xLCAgbTksICBtMTEsIG0yLCAgbTMsICAlMgorICAgIG1vdmEgICAgICAgIG0xLCBbcjIrNjRdICAgICAgICA7IGEyWzAtM10KKyAgICBtb3ZhICAgICAgICBtMiwgW3IyKzgwXSAgICAgICAgOyBhMls0LTddCisgICAgU1VNU1VCX1NIUEsgbTEsICBtMiwgIG0xMSwgbTMsICBtNCwgIG01LCAgJTIKKyAgICBtb3ZhICAgICAgICBtMiwgW3IyKzk2XSAgICAgICAgOyBhM1swLTNdCisgICAgbW92YSAgICAgICAgbTMsIFtyMisxMTJdICAgICAgIDsgYTNbNC03XQorICAgIFNVTVNVQl9TSFBLIG0yLCAgbTMsICBtNCwgIG01LCAgbTYsICBtNywgICUyCislZW5kbWFjcm8KKworOyB2b2lkIGZmX3Byb3Jlc19pZGN0X3B1dF8xMF88b3B0Pih1aW50OF90ICpwaXhlbHMsIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBjb25zdCBpbnQxNl90ICpxbWF0KTsKKyVtYWNybyBpZGN0X3B1dF9mbiAxCitjZ2xvYmFsIHByb3Jlc19pZGN0X3B1dF8xMCwgNCwgNCwgJTEKKyAgICBtb3ZzeGQgICAgICByMSwgIHIxZAorICAgIHB4b3IgICAgICAgIG0xNSwgbTE1ICAgICAgICAgICA7IHplcm8KKworICAgIDsgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICA7ICAgICBpZGN0Um93Q29uZERDKGJsb2NrICsgaSo4KTsKKyAgICBtb3ZhICAgICAgICBtMTAsW3IyKyAwXSAgICAgICAgOyB7IHJvd1swXSB9WzAtN10KKyAgICBtb3ZhICAgICAgICBtOCwgW3IyKzMyXSAgICAgICAgOyB7IHJvd1syXSB9WzAtN10KKyAgICBtb3ZhICAgICAgICBtMTMsW3IyKzY0XSAgICAgICAgOyB7IHJvd1s0XSB9WzAtN10KKyAgICBtb3ZhICAgICAgICBtMTIsW3IyKzk2XSAgICAgICAgOyB7IHJvd1s2XSB9WzAtN10KKworICAgIHBtdWxsdyAgICAgIG0xMCxbcjMrIDBdCisgICAgcG11bGx3ICAgICAgbTgsIFtyMyszMl0KKyAgICBwbXVsbHcgICAgICBtMTMsW3IzKzY0XQorICAgIHBtdWxsdyAgICAgIG0xMixbcjMrOTZdCisKKyAgICBJRENUXzFEICAgICByb3csIDE1CisKKyAgICA7IHRyYW5zcG9zZSBmb3Igc2Vjb25kIHBhcnQgb2YgSURDVAorICAgIFRSQU5TUE9TRTh4OFcgOCwgMCwgMSwgMiwgNCwgMTEsIDksIDEwLCAzCisgICAgbW92YSAgIFtyMisgMTZdLCBtMAorICAgIG1vdmEgICBbcjIrIDQ4XSwgbTIKKyAgICBtb3ZhICAgW3IyKyA4MF0sIG0xMQorICAgIG1vdmEgICBbcjIrMTEyXSwgbTEwCisgICAgU1dBUCAgICAgICAgIDgsICAxMAorICAgIFNXQVAgICAgICAgICAxLCAgIDgKKyAgICBTV0FQICAgICAgICAgNCwgIDEzCisgICAgU1dBUCAgICAgICAgIDksICAxMgorCisgICAgOyBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgIDsgICAgIGlkY3RTcGFyc2VDb2xBZGQoZGVzdCArIGksIGxpbmVfc2l6ZSwgYmxvY2sgKyBpKTsKKyAgICBJRENUXzFEICAgICBjb2wsIDE4CisKKyAgICA7IGNsaXAvc3RvcmUKKyAgICBtb3ZhICAgICAgICBtMywgW3B3XzRdCisgICAgbW92YSAgICAgICAgbTUsIFtwd18xMDE5XQorICAgIHBtYXhzdyAgICAgIG04LCAgbTMKKyAgICBwbWF4c3cgICAgICBtMCwgIG0zCisgICAgcG1heHN3ICAgICAgbTEsICBtMworICAgIHBtYXhzdyAgICAgIG0yLCAgbTMKKyAgICBwbWF4c3cgICAgICBtNCwgIG0zCisgICAgcG1heHN3ICAgICAgbTExLCBtMworICAgIHBtYXhzdyAgICAgIG05LCAgbTMKKyAgICBwbWF4c3cgICAgICBtMTAsIG0zCisgICAgcG1pbnN3ICAgICAgbTgsICBtNQorICAgIHBtaW5zdyAgICAgIG0wLCAgbTUKKyAgICBwbWluc3cgICAgICBtMSwgIG01CisgICAgcG1pbnN3ICAgICAgbTIsICBtNQorICAgIHBtaW5zdyAgICAgIG00LCAgbTUKKyAgICBwbWluc3cgICAgICBtMTEsIG01CisgICAgcG1pbnN3ICAgICAgbTksICBtNQorICAgIHBtaW5zdyAgICAgIG0xMCwgbTUKKworICAgIGxlYSAgICAgICAgIHIyLCBbcjEqM10KKyAgICBtb3ZhICBbcjAgICAgIF0sIG04CisgICAgbW92YSAgW3IwK3IxICBdLCBtMAorICAgIG1vdmEgIFtyMCtyMSoyXSwgbTEKKyAgICBtb3ZhICBbcjArcjIgIF0sIG0yCisgICAgbGVhICAgICAgICAgcjAsIFtyMCtyMSo0XQorICAgIG1vdmEgIFtyMCAgICAgXSwgbTQKKyAgICBtb3ZhICBbcjArcjEgIF0sIG0xMQorICAgIG1vdmEgIFtyMCtyMSoyXSwgbTkKKyAgICBtb3ZhICBbcjArcjIgIF0sIG0xMAorICAgIFJFVAorJWVuZG1hY3JvCisKKyVtYWNybyBTSUdORVhURU5EIDItMworJWlmIGNwdWZsYWcoc3NlNCkgOyBkc3Rsb3csIGRzdGhpZ2gKKyAgICBtb3ZobHBzICAgICAlMiwgICUxCisgICAgcG1vdnN4d2QgICAgJTEsICAlMQorICAgIHBtb3ZzeHdkICAgICUyLCAgJTIKKyVlbGlmIGNwdWZsYWcoc3NlMikgOyBkc3Rsb3csIGRzdGhpZ2gsIHRtcAorICAgIHB4b3IgICAgICAgICUzLCAgJTMKKyAgICBwY21wZ3R3ICAgICAlMywgICUxCisgICAgbW92YSAgICAgICAgJTIsICAlMQorICAgIHB1bnBja2x3ZCAgICUxLCAgJTMKKyAgICBwdW5wY2tod2QgICAlMiwgICUzCislZW5kaWYKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitpZGN0X3B1dF9mbiAxNgorSU5JVF9YTU0gc3NlNAoraWRjdF9wdXRfZm4gMTYKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitpZGN0X3B1dF9mbiAxNgorJWVuZGlmCisKKyVlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3Byb3Jlc2RzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvcHJvcmVzZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ3Nzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3Byb3Jlc2RzcF9pbml0LmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIEFwcGxlIFByb1JlcyBjb21wYXRpYmxlIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBNYXhpbSBQb2xpYWtvdnNraQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaWRjdGRzcC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvcHJvcmVzZHNwLmgiCisKK3ZvaWQgZmZfcHJvcmVzX2lkY3RfcHV0XzEwX3NzZTIodWludDE2X3QgKmRzdCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgY29uc3QgaW50MTZfdCAqcW1hdCk7Cit2b2lkIGZmX3Byb3Jlc19pZGN0X3B1dF8xMF9zc2U0KHVpbnQxNl90ICpkc3QsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGNvbnN0IGludDE2X3QgKnFtYXQpOwordm9pZCBmZl9wcm9yZXNfaWRjdF9wdXRfMTBfYXZ4ICh1aW50MTZfdCAqZHN0LCBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBjb25zdCBpbnQxNl90ICpxbWF0KTsKKworYXZfY29sZCB2b2lkIGZmX3Byb3Jlc2RzcF9pbml0X3g4NihQcm9yZXNEU1BDb250ZXh0ICpkc3AsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyNpZiBBUkNIX1g4Nl82NAorICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGRzcC0+aWRjdF9wZXJtdXRhdGlvbl90eXBlID0gRkZfSURDVF9QRVJNX1RSQU5TUE9TRTsKKyAgICAgICAgZHNwLT5pZGN0X3B1dCA9IGZmX3Byb3Jlc19pZGN0X3B1dF8xMF9zc2UyOworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU0U0KGNwdV9mbGFncykpIHsKKyAgICAgICAgZHNwLT5pZGN0X3Blcm11dGF0aW9uX3R5cGUgPSBGRl9JRENUX1BFUk1fVFJBTlNQT1NFOworICAgICAgICBkc3AtPmlkY3RfcHV0ID0gZmZfcHJvcmVzX2lkY3RfcHV0XzEwX3NzZTQ7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX0FWWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGRzcC0+aWRjdF9wZXJtdXRhdGlvbl90eXBlID0gRkZfSURDVF9QRVJNX1RSQU5TUE9TRTsKKyAgICAgICAgZHNwLT5pZGN0X3B1dCA9IGZmX3Byb3Jlc19pZGN0X3B1dF8xMF9hdng7CisgICAgfQorI2VuZGlmIC8qIEFSQ0hfWDg2XzY0ICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvcXBlbC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvcXBlbC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3MmQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9xcGVsLmFzbQpAQCAtMCwwICsxLDE3OSBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogU0lNRC1vcHRpbWl6ZWQgcXVhcnRlcnBlbCBmdW5jdGlvbnMKKzsqIENvcHlyaWdodCAoYykgMjAwOCBMb3JlbiBNZXJyaXR0Cis7KiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMyBNaWNoYWVsIE5pZWRlcm1heWVyCis7KiBDb3B5cmlnaHQgKGMpIDIwMTMgRGFuaWVsIEthbmcKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OIC50ZXh0CisKKyVtYWNybyBvcF9hdmdoIDMKKyAgICBtb3ZoICAgJTMsICUyCisgICAgcGF2Z2IgICUxLCAlMworICAgIG1vdmggICAlMiwgJTEKKyVlbmRtYWNybworCislbWFjcm8gb3BfYXZnIDIKKyAgICBwYXZnYiAgJTEsICUyCisgICAgbW92YSAgICUyLCAlMQorJWVuZG1hY3JvCisKKyVtYWNybyBvcF9wdXRoIDItMworICAgIG1vdmggICAlMiwgJTEKKyVlbmRtYWNybworCislbWFjcm8gb3BfcHV0IDIKKyAgICBtb3ZhICAgJTIsICUxCislZW5kbWFjcm8KKworOyB2b2lkIGZmX3B1dC9hdmdfcGl4ZWxzNF9sMl9tbXhleHQodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMxLCB1aW50OF90ICpzcmMyLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyYzFTdHJpZGUsIGludCBoKQorJW1hY3JvIFBJWEVMUzRfTDIgMQorJWRlZmluZSBPUCBvcF8lMWgKK2NnbG9iYWwgJTFfcGl4ZWxzNF9sMiwgNiw2CisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKKyAgICBtb3ZzeGRpZm5pZG4gcjQsIHI0ZAorICAgIHRlc3QgICAgICAgIHI1ZCwgMQorICAgIGplICAgICAgICAubG9vcAorICAgIG1vdmQgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmQgICAgICAgICBtMSwgW3IyXQorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBhZGQgICAgICAgICAgcjIsIDQKKyAgICBwYXZnYiAgICAgICAgbTAsIG0xCisgICAgT1AgICAgICAgICAgIG0wLCBbcjBdLCBtMworICAgIGFkZCAgICAgICAgICByMCwgcjMKKyAgICBkZWMgICAgICAgICByNWQKKy5sb29wOgorICAgIG1vdmEgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICBtMSwgW3IxK3I0XQorICAgIGxlYSAgICAgICAgICByMSwgW3IxKzIqcjRdCisgICAgcGF2Z2IgICAgICAgIG0wLCBbcjJdCisgICAgcGF2Z2IgICAgICAgIG0xLCBbcjIrNF0KKyAgICBPUCAgICAgICAgICAgbTAsIFtyMF0sIG0zCisgICAgT1AgICAgICAgICAgIG0xLCBbcjArcjNdLCBtMworICAgIGxlYSAgICAgICAgICByMCwgW3IwKzIqcjNdCisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgbW92YSAgICAgICAgIG0xLCBbcjErcjRdCisgICAgbGVhICAgICAgICAgIHIxLCBbcjErMipyNF0KKyAgICBwYXZnYiAgICAgICAgbTAsIFtyMis4XQorICAgIHBhdmdiICAgICAgICBtMSwgW3IyKzEyXQorICAgIE9QICAgICAgICAgICBtMCwgW3IwXSwgbTMKKyAgICBPUCAgICAgICAgICAgbTEsIFtyMCtyM10sIG0zCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArMipyM10KKyAgICBhZGQgICAgICAgICAgcjIsIDE2CisgICAgc3ViICAgICAgICAgcjVkLCA0CisgICAgam5lICAgICAgIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUElYRUxTNF9MMiBwdXQKK1BJWEVMUzRfTDIgYXZnCisKKzsgdm9pZCBmZl9wdXQvYXZnX3BpeGVsczhfbDJfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjMSwgdWludDhfdCAqc3JjMiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmMxU3RyaWRlLCBpbnQgaCkKKyVtYWNybyBQSVhFTFM4X0wyIDEKKyVkZWZpbmUgT1Agb3BfJTEKK2NnbG9iYWwgJTFfcGl4ZWxzOF9sMiwgNiw2CisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKKyAgICBtb3ZzeGRpZm5pZG4gcjQsIHI0ZAorICAgIHRlc3QgICAgICAgIHI1ZCwgMQorICAgIGplICAgICAgICAubG9vcAorICAgIG1vdmEgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICBtMSwgW3IyXQorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBhZGQgICAgICAgICAgcjIsIDgKKyAgICBwYXZnYiAgICAgICAgbTAsIG0xCisgICAgT1AgICAgICAgICAgIG0wLCBbcjBdCisgICAgYWRkICAgICAgICAgIHIwLCByMworICAgIGRlYyAgICAgICAgIHI1ZAorLmxvb3A6CisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgbW92YSAgICAgICAgIG0xLCBbcjErcjRdCisgICAgbGVhICAgICAgICAgIHIxLCBbcjErMipyNF0KKyAgICBwYXZnYiAgICAgICAgbTAsIFtyMl0KKyAgICBwYXZnYiAgICAgICAgbTEsIFtyMis4XQorICAgIE9QICAgICAgICAgICBtMCwgW3IwXQorICAgIE9QICAgICAgICAgICBtMSwgW3IwK3IzXQorICAgIGxlYSAgICAgICAgICByMCwgW3IwKzIqcjNdCisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgbW92YSAgICAgICAgIG0xLCBbcjErcjRdCisgICAgbGVhICAgICAgICAgIHIxLCBbcjErMipyNF0KKyAgICBwYXZnYiAgICAgICAgbTAsIFtyMisxNl0KKyAgICBwYXZnYiAgICAgICAgbTEsIFtyMisyNF0KKyAgICBPUCAgICAgICAgICAgbTAsIFtyMF0KKyAgICBPUCAgICAgICAgICAgbTEsIFtyMCtyM10KKyAgICBsZWEgICAgICAgICAgcjAsIFtyMCsyKnIzXQorICAgIGFkZCAgICAgICAgICByMiwgMzIKKyAgICBzdWIgICAgICAgICByNWQsIDQKKyAgICBqbmUgICAgICAgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitQSVhFTFM4X0wyIHB1dAorUElYRUxTOF9MMiBhdmcKKworOyB2b2lkIGZmX3B1dC9hdmdfcGl4ZWxzMTZfbDJfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjMSwgdWludDhfdCAqc3JjMiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjMVN0cmlkZSwgaW50IGgpCislbWFjcm8gUElYRUxTMTZfTDIgMQorJWRlZmluZSBPUCBvcF8lMQorY2dsb2JhbCAlMV9waXhlbHMxNl9sMiwgNiw2CisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKKyAgICBtb3ZzeGRpZm5pZG4gcjQsIHI0ZAorICAgIHRlc3QgICAgICAgIHI1ZCwgMQorICAgIGplICAgICAgICAubG9vcAorICAgIG1vdmEgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICBtMSwgW3IxKzhdCisgICAgcGF2Z2IgICAgICAgIG0wLCBbcjJdCisgICAgcGF2Z2IgICAgICAgIG0xLCBbcjIrOF0KKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgYWRkICAgICAgICAgIHIyLCAxNgorICAgIE9QICAgICAgICAgICBtMCwgW3IwXQorICAgIE9QICAgICAgICAgICBtMSwgW3IwKzhdCisgICAgYWRkICAgICAgICAgIHIwLCByMworICAgIGRlYyAgICAgICAgIHI1ZAorLmxvb3A6CisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgbW92YSAgICAgICAgIG0xLCBbcjErOF0KKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgcGF2Z2IgICAgICAgIG0wLCBbcjJdCisgICAgcGF2Z2IgICAgICAgIG0xLCBbcjIrOF0KKyAgICBPUCAgICAgICAgICAgbTAsIFtyMF0KKyAgICBPUCAgICAgICAgICAgbTEsIFtyMCs4XQorICAgIGFkZCAgICAgICAgICByMCwgcjMKKyAgICBtb3ZhICAgICAgICAgbTAsIFtyMV0KKyAgICBtb3ZhICAgICAgICAgbTEsIFtyMSs4XQorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBwYXZnYiAgICAgICAgbTAsIFtyMisxNl0KKyAgICBwYXZnYiAgICAgICAgbTEsIFtyMisyNF0KKyAgICBPUCAgICAgICAgICAgbTAsIFtyMF0KKyAgICBPUCAgICAgICAgICAgbTEsIFtyMCs4XQorICAgIGFkZCAgICAgICAgICByMCwgcjMKKyAgICBhZGQgICAgICAgICAgcjIsIDMyCisgICAgc3ViICAgICAgICAgcjVkLCAyCisgICAgam5lICAgICAgIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUElYRUxTMTZfTDIgcHV0CitQSVhFTFMxNl9MMiBhdmcKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9xcGVsZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9xcGVsZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzBmOTAwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3FwZWxkc3AuYXNtCkBAIC0wLDAgKzEsNTYwIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBtcGVnNCBxcGVsCis7KiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKzsqIENvcHlyaWdodCAoYykgMjAwOCBMb3JlbiBNZXJyaXR0Cis7KiBDb3B5cmlnaHQgKGMpIDIwMTMgRGFuaWVsIEthbmcKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorY2V4dGVybiBwYl8xCitjZXh0ZXJuIHB3XzMKK2NleHRlcm4gcHdfMTUKK2NleHRlcm4gcHdfMTYKK2NleHRlcm4gcHdfMjAKKworCitTRUNUSU9OX1RFWFQKKworOyB2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF9sMih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYzEsIHVpbnQ4X3QgKnNyYzIsIGludCBkc3RTdHJpZGUsIGludCBzcmMxU3RyaWRlLCBpbnQgaCkKKyVtYWNybyBQVVRfTk9fUk5EX1BJWEVMUzhfTDIgMAorY2dsb2JhbCBwdXRfbm9fcm5kX3BpeGVsczhfbDIsIDYsNgorICAgIG1vdnN4ZGlmbmlkbiByNCwgcjRkCisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKKyAgICBwY21wZXFiICAgICAgbTYsIG02CisgICAgdGVzdCAgICAgICAgcjVkLCAxCisgICAgamUgLmxvb3AKKyAgICBtb3ZhICAgICAgICAgbTAsIFtyMV0KKyAgICBtb3ZhICAgICAgICAgbTEsIFtyMl0KKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgYWRkICAgICAgICAgIHIyLCA4CisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIHB4b3IgICAgICAgICBtMSwgbTYKKyAgICBQQVZHQiAgICAgICAgbTAsIG0xCisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIG1vdmEgICAgICAgW3IwXSwgbTAKKyAgICBhZGQgICAgICAgICAgcjAsIHIzCisgICAgZGVjIHI1ZAorLmxvb3A6CisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgYWRkICAgICAgICAgIHIxLCByNAorICAgIG1vdmEgICAgICAgICBtMSwgW3IxXQorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBtb3ZhICAgICAgICAgbTIsIFtyMl0KKyAgICBtb3ZhICAgICAgICAgbTMsIFtyMis4XQorICAgIHB4b3IgICAgICAgICBtMCwgbTYKKyAgICBweG9yICAgICAgICAgbTEsIG02CisgICAgcHhvciAgICAgICAgIG0yLCBtNgorICAgIHB4b3IgICAgICAgICBtMywgbTYKKyAgICBQQVZHQiAgICAgICAgbTAsIG0yCisgICAgUEFWR0IgICAgICAgIG0xLCBtMworICAgIHB4b3IgICAgICAgICBtMCwgbTYKKyAgICBweG9yICAgICAgICAgbTEsIG02CisgICAgbW92YSAgICAgICBbcjBdLCBtMAorICAgIGFkZCAgICAgICAgICByMCwgcjMKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0xCisgICAgYWRkICAgICAgICAgIHIwLCByMworICAgIG1vdmEgICAgICAgICBtMCwgW3IxXQorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBtb3ZhICAgICAgICAgbTEsIFtyMV0KKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgbW92YSAgICAgICAgIG0yLCBbcjIrMTZdCisgICAgbW92YSAgICAgICAgIG0zLCBbcjIrMjRdCisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIHB4b3IgICAgICAgICBtMSwgbTYKKyAgICBweG9yICAgICAgICAgbTIsIG02CisgICAgcHhvciAgICAgICAgIG0zLCBtNgorICAgIFBBVkdCICAgICAgICBtMCwgbTIKKyAgICBQQVZHQiAgICAgICAgbTEsIG0zCisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIHB4b3IgICAgICAgICBtMSwgbTYKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0wCisgICAgYWRkICAgICAgICAgIHIwLCByMworICAgIG1vdmEgICAgICAgW3IwXSwgbTEKKyAgICBhZGQgICAgICAgICAgcjAsIHIzCisgICAgYWRkICAgICAgICAgIHIyLCAzMgorICAgIHN1YiAgICAgICAgIHI1ZCwgNAorICAgIGpuZSAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BVVF9OT19STkRfUElYRUxTOF9MMgorCisKKzsgdm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczE2X2wyKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjMSwgdWludDhfdCAqc3JjMiwgaW50IGRzdFN0cmlkZSwgaW50IHNyYzFTdHJpZGUsIGludCBoKQorJW1hY3JvIFBVVF9OT19STkRfUElYRUxTMTZfbDIgMAorY2dsb2JhbCBwdXRfbm9fcm5kX3BpeGVsczE2X2wyLCA2LDYKKyAgICBtb3ZzeGRpZm5pZG4gcjMsIHIzZAorICAgIG1vdnN4ZGlmbmlkbiByNCwgcjRkCisgICAgcGNtcGVxYiAgICAgIG02LCBtNgorICAgIHRlc3QgICAgICAgIHI1ZCwgMQorICAgIGplIC5sb29wCisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgbW92YSAgICAgICAgIG0xLCBbcjErOF0KKyAgICBtb3ZhICAgICAgICAgbTIsIFtyMl0KKyAgICBtb3ZhICAgICAgICAgbTMsIFtyMis4XQorICAgIHB4b3IgICAgICAgICBtMCwgbTYKKyAgICBweG9yICAgICAgICAgbTEsIG02CisgICAgcHhvciAgICAgICAgIG0yLCBtNgorICAgIHB4b3IgICAgICAgICBtMywgbTYKKyAgICBQQVZHQiAgICAgICAgbTAsIG0yCisgICAgUEFWR0IgICAgICAgIG0xLCBtMworICAgIHB4b3IgICAgICAgICBtMCwgbTYKKyAgICBweG9yICAgICAgICAgbTEsIG02CisgICAgYWRkICAgICAgICAgIHIxLCByNAorICAgIGFkZCAgICAgICAgICByMiwgMTYKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0wCisgICAgbW92YSAgICAgW3IwKzhdLCBtMQorICAgIGFkZCAgICAgICAgICByMCwgcjMKKyAgICBkZWMgcjVkCisubG9vcDoKKyAgICBtb3ZhICAgICAgICAgbTAsIFtyMV0KKyAgICBtb3ZhICAgICAgICAgbTEsIFtyMSs4XQorICAgIGFkZCAgICAgICAgICByMSwgcjQKKyAgICBtb3ZhICAgICAgICAgbTIsIFtyMl0KKyAgICBtb3ZhICAgICAgICAgbTMsIFtyMis4XQorICAgIHB4b3IgICAgICAgICBtMCwgbTYKKyAgICBweG9yICAgICAgICAgbTEsIG02CisgICAgcHhvciAgICAgICAgIG0yLCBtNgorICAgIHB4b3IgICAgICAgICBtMywgbTYKKyAgICBQQVZHQiAgICAgICAgbTAsIG0yCisgICAgUEFWR0IgICAgICAgIG0xLCBtMworICAgIHB4b3IgICAgICAgICBtMCwgbTYKKyAgICBweG9yICAgICAgICAgbTEsIG02CisgICAgbW92YSAgICAgICBbcjBdLCBtMAorICAgIG1vdmEgICAgIFtyMCs4XSwgbTEKKyAgICBhZGQgICAgICAgICAgcjAsIHIzCisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgbW92YSAgICAgICAgIG0xLCBbcjErOF0KKyAgICBhZGQgICAgICAgICAgcjEsIHI0CisgICAgbW92YSAgICAgICAgIG0yLCBbcjIrMTZdCisgICAgbW92YSAgICAgICAgIG0zLCBbcjIrMjRdCisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIHB4b3IgICAgICAgICBtMSwgbTYKKyAgICBweG9yICAgICAgICAgbTIsIG02CisgICAgcHhvciAgICAgICAgIG0zLCBtNgorICAgIFBBVkdCICAgICAgICBtMCwgbTIKKyAgICBQQVZHQiAgICAgICAgbTEsIG0zCisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIHB4b3IgICAgICAgICBtMSwgbTYKKyAgICBtb3ZhICAgICAgIFtyMF0sIG0wCisgICAgbW92YSAgICAgW3IwKzhdLCBtMQorICAgIGFkZCAgICAgICAgICByMCwgcjMKKyAgICBhZGQgICAgICAgICAgcjIsIDMyCisgICAgc3ViICAgICAgICAgcjVkLCAyCisgICAgam5lIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorUFVUX05PX1JORF9QSVhFTFMxNl9sMgorSU5JVF9NTVggM2Rub3cKK1BVVF9OT19STkRfUElYRUxTMTZfbDIKKworJW1hY3JvIE1QRUc0X1FQRUwxNl9IX0xPV1BBU1MgMQorY2dsb2JhbCAlMV9tcGVnNF9xcGVsMTZfaF9sb3dwYXNzLCA1LCA1LCAwLCAxNgorICAgIG1vdnN4ZGlmbmlkbiByMiwgcjJkCisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKKyAgICBweG9yICAgICAgICAgbTcsIG03CisubG9vcDoKKyAgICBtb3ZhICAgICAgICAgbTAsIFtyMV0KKyAgICBtb3ZhICAgICAgICAgbTEsIG0wCisgICAgbW92YSAgICAgICAgIG0yLCBtMAorICAgIHB1bnBja2xidyAgICBtMCwgbTcKKyAgICBwdW5wY2toYncgICAgbTEsIG03CisgICAgcHNodWZ3ICAgICAgIG01LCBtMCwgMHg5MAorICAgIHBzaHVmdyAgICAgICBtNiwgbTAsIDB4NDEKKyAgICBtb3ZhICAgICAgICAgbTMsIG0yCisgICAgbW92YSAgICAgICAgIG00LCBtMgorICAgIHBzbGxxICAgICAgICBtMiwgOAorICAgIHBzbGxxICAgICAgICBtMywgMTYKKyAgICBwc2xscSAgICAgICAgbTQsIDI0CisgICAgcHVucGNraGJ3ICAgIG0yLCBtNworICAgIHB1bnBja2hidyAgICBtMywgbTcKKyAgICBwdW5wY2toYncgICAgbTQsIG03CisgICAgcGFkZHcgICAgICAgIG01LCBtMworICAgIHBhZGR3ICAgICAgICBtNiwgbTIKKyAgICBwYWRkdyAgICAgICAgbTUsIG01CisgICAgcHN1YncgICAgICAgIG02LCBtNQorICAgIHBzaHVmdyAgICAgICBtNSwgbTAsIDYKKyAgICBwbXVsbHcgICAgICAgbTYsIFtwd18zXQorICAgIHBhZGR3ICAgICAgICBtMCwgbTQKKyAgICBwYWRkdyAgICAgICAgbTUsIG0xCisgICAgcG11bGx3ICAgICAgIG0wLCBbcHdfMjBdCisgICAgcHN1YncgICAgICAgIG0wLCBtNQorICAgIHBhZGR3ICAgICAgICBtNiwgW1BXX1JPVU5EXQorICAgIHBhZGR3ICAgICAgICBtMCwgbTYKKyAgICBwc3JhdyAgICAgICAgbTAsIDUKKyAgICBtb3ZhICAgIFtyc3ArOF0sIG0wCisgICAgbW92YSAgICAgICAgIG0wLCBbcjErNV0KKyAgICBtb3ZhICAgICAgICAgbTUsIG0wCisgICAgbW92YSAgICAgICAgIG02LCBtMAorICAgIHBzcmxxICAgICAgICBtMCwgOAorICAgIHBzcmxxICAgICAgICBtNSwgMTYKKyAgICBwdW5wY2tsYncgICAgbTAsIG03CisgICAgcHVucGNrbGJ3ICAgIG01LCBtNworICAgIHBhZGR3ICAgICAgICBtMiwgbTAKKyAgICBwYWRkdyAgICAgICAgbTMsIG01CisgICAgcGFkZHcgICAgICAgIG0yLCBtMgorICAgIHBzdWJ3ICAgICAgICBtMywgbTIKKyAgICBtb3ZhICAgICAgICAgbTIsIG02CisgICAgcHNybHEgICAgICAgIG02LCAyNAorICAgIHB1bnBja2xidyAgICBtMiwgbTcKKyAgICBwdW5wY2tsYncgICAgbTYsIG03CisgICAgcG11bGx3ICAgICAgIG0zLCBbcHdfM10KKyAgICBwYWRkdyAgICAgICAgbTEsIG0yCisgICAgcGFkZHcgICAgICAgIG00LCBtNgorICAgIHBtdWxsdyAgICAgICBtMSwgW3B3XzIwXQorICAgIHBzdWJ3ICAgICAgICBtMywgbTQKKyAgICBwYWRkdyAgICAgICAgbTEsIFtQV19ST1VORF0KKyAgICBwYWRkdyAgICAgICAgbTMsIG0xCisgICAgcHNyYXcgICAgICAgIG0zLCA1CisgICAgbW92YSAgICAgICAgIG0xLCBbcnNwKzhdCisgICAgcGFja3Vzd2IgICAgIG0xLCBtMworICAgIE9QX01PViAgICAgW3IwXSwgbTEsIG00CisgICAgbW92YSAgICAgICAgIG0xLCBbcjErOV0KKyAgICBtb3ZhICAgICAgICAgbTQsIG0xCisgICAgbW92YSAgICAgICAgIG0zLCBtMQorICAgIHBzcmxxICAgICAgICBtMSwgOAorICAgIHBzcmxxICAgICAgICBtNCwgMTYKKyAgICBwdW5wY2tsYncgICAgbTEsIG03CisgICAgcHVucGNrbGJ3ICAgIG00LCBtNworICAgIHBhZGR3ICAgICAgICBtNSwgbTEKKyAgICBwYWRkdyAgICAgICAgbTAsIG00CisgICAgcGFkZHcgICAgICAgIG01LCBtNQorICAgIHBzdWJ3ICAgICAgICBtMCwgbTUKKyAgICBtb3ZhICAgICAgICAgbTUsIG0zCisgICAgcHNybHEgICAgICAgIG0zLCAyNAorICAgIHBtdWxsdyAgICAgICBtMCwgW3B3XzNdCisgICAgcHVucGNrbGJ3ICAgIG0zLCBtNworICAgIHBhZGR3ICAgICAgICBtMiwgbTMKKyAgICBwc3VidyAgICAgICAgbTAsIG0yCisgICAgbW92YSAgICAgICAgIG0yLCBtNQorICAgIHB1bnBja2xidyAgICBtMiwgbTcKKyAgICBwdW5wY2toYncgICAgbTUsIG03CisgICAgcGFkZHcgICAgICAgIG02LCBtMgorICAgIHBtdWxsdyAgICAgICBtNiwgW3B3XzIwXQorICAgIHBhZGR3ICAgICAgICBtMCwgW1BXX1JPVU5EXQorICAgIHBhZGR3ICAgICAgICBtMCwgbTYKKyAgICBwc3JhdyAgICAgICAgbTAsIDUKKyAgICBwYWRkdyAgICAgICAgbTMsIG01CisgICAgcHNodWZ3ICAgICAgIG02LCBtNSwgMHhmOQorICAgIHBhZGR3ICAgICAgICBtNiwgbTQKKyAgICBwc2h1ZncgICAgICAgbTQsIG01LCAweGJlCisgICAgcHNodWZ3ICAgICAgIG01LCBtNSwgMHg2ZgorICAgIHBhZGR3ICAgICAgICBtNCwgbTEKKyAgICBwYWRkdyAgICAgICAgbTUsIG0yCisgICAgcGFkZHcgICAgICAgIG02LCBtNgorICAgIHBzdWJ3ICAgICAgICBtNCwgbTYKKyAgICBwbXVsbHcgICAgICAgbTMsIFtwd18yMF0KKyAgICBwbXVsbHcgICAgICAgbTQsIFtwd18zXQorICAgIHBzdWJ3ICAgICAgICBtMywgbTUKKyAgICBwYWRkdyAgICAgICAgbTQsIFtQV19ST1VORF0KKyAgICBwYWRkdyAgICAgICAgbTQsIG0zCisgICAgcHNyYXcgICAgICAgIG00LCA1CisgICAgcGFja3Vzd2IgICAgIG0wLCBtNAorICAgIE9QX01PViAgIFtyMCs4XSwgbTAsIG00CisgICAgYWRkICAgICAgICAgIHIxLCByMworICAgIGFkZCAgICAgICAgICByMCwgcjIKKyAgICBkZWMgcjRkCisgICAgam5lIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKKyVtYWNybyBQVVRfT1AgMi0zCisgICAgbW92YSAlMSwgJTIKKyVlbmRtYWNybworCislbWFjcm8gQVZHX09QIDItMworICAgIG1vdmEgICUzLCAlMQorICAgIHBhdmdiICUyLCAlMworICAgIG1vdmEgICUxLCAlMgorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorJWRlZmluZSBQV19ST1VORCBwd18xNgorJWRlZmluZSBPUF9NT1YgUFVUX09QCitNUEVHNF9RUEVMMTZfSF9MT1dQQVNTIHB1dAorJWRlZmluZSBQV19ST1VORCBwd18xNgorJWRlZmluZSBPUF9NT1YgQVZHX09QCitNUEVHNF9RUEVMMTZfSF9MT1dQQVNTIGF2ZworJWRlZmluZSBQV19ST1VORCBwd18xNQorJWRlZmluZSBPUF9NT1YgUFVUX09QCitNUEVHNF9RUEVMMTZfSF9MT1dQQVNTIHB1dF9ub19ybmQKKworCisKKyVtYWNybyBNUEVHNF9RUEVMOF9IX0xPV1BBU1MgMQorY2dsb2JhbCAlMV9tcGVnNF9xcGVsOF9oX2xvd3Bhc3MsIDUsIDUsIDAsIDgKKyAgICBtb3ZzeGRpZm5pZG4gcjIsIHIyZAorICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCisgICAgcHhvciAgICAgICAgIG03LCBtNworLmxvb3A6CisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgbW92YSAgICAgICAgIG0xLCBtMAorICAgIG1vdmEgICAgICAgICBtMiwgbTAKKyAgICBwdW5wY2tsYncgICAgbTAsIG03CisgICAgcHVucGNraGJ3ICAgIG0xLCBtNworICAgIHBzaHVmdyAgICAgICBtNSwgbTAsIDB4OTAKKyAgICBwc2h1ZncgICAgICAgbTYsIG0wLCAweDQxCisgICAgbW92YSAgICAgICAgIG0zLCBtMgorICAgIG1vdmEgICAgICAgICBtNCwgbTIKKyAgICBwc2xscSAgICAgICAgbTIsIDgKKyAgICBwc2xscSAgICAgICAgbTMsIDE2CisgICAgcHNsbHEgICAgICAgIG00LCAyNAorICAgIHB1bnBja2hidyAgICBtMiwgbTcKKyAgICBwdW5wY2toYncgICAgbTMsIG03CisgICAgcHVucGNraGJ3ICAgIG00LCBtNworICAgIHBhZGR3ICAgICAgICBtNSwgbTMKKyAgICBwYWRkdyAgICAgICAgbTYsIG0yCisgICAgcGFkZHcgICAgICAgIG01LCBtNQorICAgIHBzdWJ3ICAgICAgICBtNiwgbTUKKyAgICBwc2h1ZncgICAgICAgbTUsIG0wLCAweDYKKyAgICBwbXVsbHcgICAgICAgbTYsIFtwd18zXQorICAgIHBhZGR3ICAgICAgICBtMCwgbTQKKyAgICBwYWRkdyAgICAgICAgbTUsIG0xCisgICAgcG11bGx3ICAgICAgIG0wLCBbcHdfMjBdCisgICAgcHN1YncgICAgICAgIG0wLCBtNQorICAgIHBhZGR3ICAgICAgICBtNiwgW1BXX1JPVU5EXQorICAgIHBhZGR3ICAgICAgICBtMCwgbTYKKyAgICBwc3JhdyAgICAgICAgbTAsIDUKKyAgICBtb3ZoICAgICAgICAgbTUsIFtyMSs1XQorICAgIHB1bnBja2xidyAgICBtNSwgbTcKKyAgICBwc2h1ZncgICAgICAgbTYsIG01LCAweGY5CisgICAgcGFkZHcgICAgICAgIG0xLCBtNQorICAgIHBhZGR3ICAgICAgICBtMiwgbTYKKyAgICBwc2h1ZncgICAgICAgbTYsIG01LCAweGJlCisgICAgcHNodWZ3ICAgICAgIG01LCBtNSwgMHg2ZgorICAgIHBhZGR3ICAgICAgICBtMywgbTYKKyAgICBwYWRkdyAgICAgICAgbTQsIG01CisgICAgcGFkZHcgICAgICAgIG0yLCBtMgorICAgIHBzdWJ3ICAgICAgICBtMywgbTIKKyAgICBwbXVsbHcgICAgICAgbTEsIFtwd18yMF0KKyAgICBwbXVsbHcgICAgICAgbTMsIFtwd18zXQorICAgIHBzdWJ3ICAgICAgICBtMywgbTQKKyAgICBwYWRkdyAgICAgICAgbTEsIFtQV19ST1VORF0KKyAgICBwYWRkdyAgICAgICAgbTMsIG0xCisgICAgcHNyYXcgICAgICAgIG0zLCA1CisgICAgcGFja3Vzd2IgICAgIG0wLCBtMworICAgIE9QX01PViAgICAgW3IwXSwgbTAsIG00CisgICAgYWRkICAgICAgICAgIHIxLCByMworICAgIGFkZCAgICAgICAgICByMCwgcjIKKyAgICBkZWMgcjRkCisgICAgam5lIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorJWRlZmluZSBQV19ST1VORCBwd18xNgorJWRlZmluZSBPUF9NT1YgUFVUX09QCitNUEVHNF9RUEVMOF9IX0xPV1BBU1MgcHV0CislZGVmaW5lIFBXX1JPVU5EIHB3XzE2CislZGVmaW5lIE9QX01PViBBVkdfT1AKK01QRUc0X1FQRUw4X0hfTE9XUEFTUyBhdmcKKyVkZWZpbmUgUFdfUk9VTkQgcHdfMTUKKyVkZWZpbmUgT1BfTU9WIFBVVF9PUAorTVBFRzRfUVBFTDhfSF9MT1dQQVNTIHB1dF9ub19ybmQKKworCisKKyVtYWNybyBRUEVMX1ZfTE9XIDUKKyAgICBwYWRkdyAgICAgIG0wLCBtMQorICAgIG1vdmEgICAgICAgbTQsIFtwd18yMF0KKyAgICBwbXVsbHcgICAgIG00LCBtMAorICAgIG1vdmEgICAgICAgbTAsICU0CisgICAgbW92YSAgICAgICBtNSwgJTEKKyAgICBwYWRkdyAgICAgIG01LCBtMAorICAgIHBzdWJ3ICAgICAgbTQsIG01CisgICAgbW92YSAgICAgICBtNSwgJTIKKyAgICBtb3ZhICAgICAgIG02LCAlMworICAgIHBhZGR3ICAgICAgbTUsIG0zCisgICAgcGFkZHcgICAgICBtNiwgbTIKKyAgICBwYWRkdyAgICAgIG02LCBtNgorICAgIHBzdWJ3ICAgICAgbTUsIG02CisgICAgcG11bGx3ICAgICBtNSwgW3B3XzNdCisgICAgcGFkZHcgICAgICBtNCwgW1BXX1JPVU5EXQorICAgIHBhZGR3ICAgICAgbTUsIG00CisgICAgcHNyYXcgICAgICBtNSwgNQorICAgIHBhY2t1c3diICAgbTUsIG01CisgICAgT1BfTU9WICAgICAlNSwgbTUsIG03CisgICAgU1dBUCAwLDEsMiwzCislZW5kbWFjcm8KKworJW1hY3JvIE1QRUc0X1FQRUwxNl9WX0xPV1BBU1MgMQorY2dsb2JhbCAlMV9tcGVnNF9xcGVsMTZfdl9sb3dwYXNzLCA0LCA2LCAwLCA1NDQKKyAgICBtb3ZzeGRpZm5pZG4gcjIsIHIyZAorICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCisKKyAgICBtb3YgICAgICAgICByNGQsIDE3CisgICAgbW92ICAgICAgICAgIHI1LCByc3AKKyAgICBweG9yICAgICAgICAgbTcsIG03CisubG9vcGg6CisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgbW92YSAgICAgICAgIG0xLCBbcjFdCisgICAgbW92YSAgICAgICAgIG0yLCBbcjErOF0KKyAgICBtb3ZhICAgICAgICAgbTMsIFtyMSs4XQorICAgIHB1bnBja2xidyAgICBtMCwgbTcKKyAgICBwdW5wY2toYncgICAgbTEsIG03CisgICAgcHVucGNrbGJ3ICAgIG0yLCBtNworICAgIHB1bnBja2hidyAgICBtMywgbTcKKyAgICBtb3ZhICAgICAgIFtyNV0sIG0wCisgICAgbW92YSAgW3I1KzB4ODhdLCBtMQorICAgIG1vdmEgW3I1KzB4MTEwXSwgbTIKKyAgICBtb3ZhIFtyNSsweDE5OF0sIG0zCisgICAgYWRkICAgICAgICAgIHI1LCA4CisgICAgYWRkICAgICAgICAgIHIxLCByMworICAgIGRlYyByNGQKKyAgICBqbmUgLmxvb3BoCisKKworICAgIDsgTk9URTogcjEgQ0hBTkdFUyBWQUxVRVM6IHIxIC0+IDQgLSAxNCpkc3RTdHJpZGUKKyAgICBtb3YgICAgICAgICByNGQsIDQKKyAgICBtb3YgICAgICAgICAgcjEsIDQKKyAgICBuZWcgICAgICAgICAgcjIKKyAgICBsZWEgICAgICAgICAgcjEsIFtyMStyMio4XQorICAgIGxlYSAgICAgICAgICByMSwgW3IxK3IyKjRdCisgICAgbGVhICAgICAgICAgIHIxLCBbcjErcjIqMl0KKyAgICBuZWcgICAgICAgICAgcjIKKyAgICBtb3YgICAgICAgICAgcjUsIHJzcAorLmxvb3B2OgorICAgIHB4b3IgICAgICAgICBtNywgbTcKKyAgICBtb3ZhICAgICAgICAgbTAsIFtyNSsgMHgwXQorICAgIG1vdmEgICAgICAgICBtMSwgW3I1KyAweDhdCisgICAgbW92YSAgICAgICAgIG0yLCBbcjUrMHgxMF0KKyAgICBtb3ZhICAgICAgICAgbTMsIFtyNSsweDE4XQorICAgIFFQRUxfVl9MT1cgW3I1KzB4MTBdLCBbcjUrIDB4OF0sIFtyNSsgMHgwXSwgW3I1KzB4MjBdLCBbcjBdCisgICAgUVBFTF9WX0xPVyBbcjUrIDB4OF0sIFtyNSsgMHgwXSwgW3I1KyAweDBdLCBbcjUrMHgyOF0sIFtyMCtyMl0KKyAgICBsZWEgICAgcjAsIFtyMCtyMioyXQorICAgIFFQRUxfVl9MT1cgW3I1KyAweDBdLCBbcjUrIDB4MF0sIFtyNSsgMHg4XSwgW3I1KzB4MzBdLCBbcjBdCisgICAgUVBFTF9WX0xPVyBbcjUrIDB4MF0sIFtyNSsgMHg4XSwgW3I1KzB4MTBdLCBbcjUrMHgzOF0sIFtyMCtyMl0KKyAgICBsZWEgICAgcjAsIFtyMCtyMioyXQorICAgIFFQRUxfVl9MT1cgW3I1KyAweDhdLCBbcjUrMHgxMF0sIFtyNSsweDE4XSwgW3I1KzB4NDBdLCBbcjBdCisgICAgUVBFTF9WX0xPVyBbcjUrMHgxMF0sIFtyNSsweDE4XSwgW3I1KzB4MjBdLCBbcjUrMHg0OF0sIFtyMCtyMl0KKyAgICBsZWEgICAgcjAsIFtyMCtyMioyXQorICAgIFFQRUxfVl9MT1cgW3I1KzB4MThdLCBbcjUrMHgyMF0sIFtyNSsweDI4XSwgW3I1KzB4NTBdLCBbcjBdCisgICAgUVBFTF9WX0xPVyBbcjUrMHgyMF0sIFtyNSsweDI4XSwgW3I1KzB4MzBdLCBbcjUrMHg1OF0sIFtyMCtyMl0KKyAgICBsZWEgICAgcjAsIFtyMCtyMioyXQorICAgIFFQRUxfVl9MT1cgW3I1KzB4MjhdLCBbcjUrMHgzMF0sIFtyNSsweDM4XSwgW3I1KzB4NjBdLCBbcjBdCisgICAgUVBFTF9WX0xPVyBbcjUrMHgzMF0sIFtyNSsweDM4XSwgW3I1KzB4NDBdLCBbcjUrMHg2OF0sIFtyMCtyMl0KKyAgICBsZWEgICAgcjAsIFtyMCtyMioyXQorICAgIFFQRUxfVl9MT1cgW3I1KzB4MzhdLCBbcjUrMHg0MF0sIFtyNSsweDQ4XSwgW3I1KzB4NzBdLCBbcjBdCisgICAgUVBFTF9WX0xPVyBbcjUrMHg0MF0sIFtyNSsweDQ4XSwgW3I1KzB4NTBdLCBbcjUrMHg3OF0sIFtyMCtyMl0KKyAgICBsZWEgICAgcjAsIFtyMCtyMioyXQorICAgIFFQRUxfVl9MT1cgW3I1KzB4NDhdLCBbcjUrMHg1MF0sIFtyNSsweDU4XSwgW3I1KzB4ODBdLCBbcjBdCisgICAgUVBFTF9WX0xPVyBbcjUrMHg1MF0sIFtyNSsweDU4XSwgW3I1KzB4NjBdLCBbcjUrMHg4MF0sIFtyMCtyMl0KKyAgICBsZWEgICAgcjAsIFtyMCtyMioyXQorICAgIFFQRUxfVl9MT1cgW3I1KzB4NThdLCBbcjUrMHg2MF0sIFtyNSsweDY4XSwgW3I1KzB4NzhdLCBbcjBdCisgICAgUVBFTF9WX0xPVyBbcjUrMHg2MF0sIFtyNSsweDY4XSwgW3I1KzB4NzBdLCBbcjUrMHg3MF0sIFtyMCtyMl0KKworICAgIGFkZCAgICByNSwgMHg4OAorICAgIGFkZCAgICByMCwgcjEKKyAgICBkZWMgcjRkCisgICAgam5lIC5sb29wdgorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCislbWFjcm8gUFVUX09QSCAyLTMKKyAgICBtb3ZoICUxLCAlMgorJWVuZG1hY3JvCisKKyVtYWNybyBBVkdfT1BIIDItMworICAgIG1vdmggICUzLCAlMQorICAgIHBhdmdiICUyLCAlMworICAgIG1vdmggICUxLCAlMgorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorJWRlZmluZSBQV19ST1VORCBwd18xNgorJWRlZmluZSBPUF9NT1YgUFVUX09QSAorTVBFRzRfUVBFTDE2X1ZfTE9XUEFTUyBwdXQKKyVkZWZpbmUgUFdfUk9VTkQgcHdfMTYKKyVkZWZpbmUgT1BfTU9WIEFWR19PUEgKK01QRUc0X1FQRUwxNl9WX0xPV1BBU1MgYXZnCislZGVmaW5lIFBXX1JPVU5EIHB3XzE1CislZGVmaW5lIE9QX01PViBQVVRfT1BICitNUEVHNF9RUEVMMTZfVl9MT1dQQVNTIHB1dF9ub19ybmQKKworCisKKyVtYWNybyBNUEVHNF9RUEVMOF9WX0xPV1BBU1MgMQorY2dsb2JhbCAlMV9tcGVnNF9xcGVsOF92X2xvd3Bhc3MsIDQsIDYsIDAsIDI4OAorICAgIG1vdnN4ZGlmbmlkbiByMiwgcjJkCisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKKworICAgIG1vdiAgICAgICAgIHI0ZCwgOQorICAgIG1vdiAgICAgICAgICByNSwgcnNwCisgICAgcHhvciAgICAgICAgIG03LCBtNworLmxvb3BoOgorICAgIG1vdmEgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICBtMSwgW3IxXQorICAgIHB1bnBja2xidyAgICBtMCwgbTcKKyAgICBwdW5wY2toYncgICAgbTEsIG03CisgICAgbW92YSAgICAgICBbcjVdLCBtMAorICAgIG1vdmEgIFtyNSsweDQ4XSwgbTEKKyAgICBhZGQgICAgICAgICAgcjUsIDgKKyAgICBhZGQgICAgICAgICAgcjEsIHIzCisgICAgZGVjIHI0ZAorICAgIGpuZSAubG9vcGgKKworCisgICAgOyBOT1RFOiByMSBDSEFOR0VTIFZBTFVFUzogcjEgLT4gNCAtIDYqZHN0U3RyaWRlCisgICAgbW92ICAgICAgICAgcjRkLCAyCisgICAgbW92ICAgICAgICAgIHIxLCA0CisgICAgbmVnICAgICAgICAgIHIyCisgICAgbGVhICAgICAgICAgIHIxLCBbcjErcjIqNF0KKyAgICBsZWEgICAgICAgICAgcjEsIFtyMStyMioyXQorICAgIG5lZyAgICAgICAgICByMgorICAgIG1vdiAgICAgICAgICByNSwgcnNwCisubG9vcHY6CisgICAgcHhvciAgICAgICAgIG03LCBtNworICAgIG1vdmEgICAgICAgICBtMCwgW3I1KyAweDBdCisgICAgbW92YSAgICAgICAgIG0xLCBbcjUrIDB4OF0KKyAgICBtb3ZhICAgICAgICAgbTIsIFtyNSsweDEwXQorICAgIG1vdmEgICAgICAgICBtMywgW3I1KzB4MThdCisgICAgUVBFTF9WX0xPVyBbcjUrMHgxMF0sIFtyNSsgMHg4XSwgW3I1KyAweDBdLCBbcjUrMHgyMF0sIFtyMF0KKyAgICBRUEVMX1ZfTE9XIFtyNSsgMHg4XSwgW3I1KyAweDBdLCBbcjUrIDB4MF0sIFtyNSsweDI4XSwgW3IwK3IyXQorICAgIGxlYSAgICByMCwgW3IwK3IyKjJdCisgICAgUVBFTF9WX0xPVyBbcjUrIDB4MF0sIFtyNSsgMHgwXSwgW3I1KyAweDhdLCBbcjUrMHgzMF0sIFtyMF0KKyAgICBRUEVMX1ZfTE9XIFtyNSsgMHgwXSwgW3I1KyAweDhdLCBbcjUrMHgxMF0sIFtyNSsweDM4XSwgW3IwK3IyXQorICAgIGxlYSAgICByMCwgW3IwK3IyKjJdCisgICAgUVBFTF9WX0xPVyBbcjUrIDB4OF0sIFtyNSsweDEwXSwgW3I1KzB4MThdLCBbcjUrMHg0MF0sIFtyMF0KKyAgICBRUEVMX1ZfTE9XIFtyNSsweDEwXSwgW3I1KzB4MThdLCBbcjUrMHgyMF0sIFtyNSsweDQwXSwgW3IwK3IyXQorICAgIGxlYSAgICByMCwgW3IwK3IyKjJdCisgICAgUVBFTF9WX0xPVyBbcjUrMHgxOF0sIFtyNSsweDIwXSwgW3I1KzB4MjhdLCBbcjUrMHgzOF0sIFtyMF0KKyAgICBRUEVMX1ZfTE9XIFtyNSsweDIwXSwgW3I1KzB4MjhdLCBbcjUrMHgzMF0sIFtyNSsweDMwXSwgW3IwK3IyXQorCisgICAgYWRkICAgIHI1LCAweDQ4CisgICAgYWRkICAgIHIwLCByMQorICAgIGRlYyByNGQKKyAgICBqbmUgLmxvb3B2CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorJWRlZmluZSBQV19ST1VORCBwd18xNgorJWRlZmluZSBPUF9NT1YgUFVUX09QSAorTVBFRzRfUVBFTDhfVl9MT1dQQVNTIHB1dAorJWRlZmluZSBQV19ST1VORCBwd18xNgorJWRlZmluZSBPUF9NT1YgQVZHX09QSAorTVBFRzRfUVBFTDhfVl9MT1dQQVNTIGF2ZworJWRlZmluZSBQV19ST1VORCBwd18xNQorJWRlZmluZSBPUF9NT1YgUFVUX09QSAorTVBFRzRfUVBFTDhfVl9MT1dQQVNTIHB1dF9ub19ybmQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9xcGVsZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9xcGVsZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjY4ZDkwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3FwZWxkc3BfaW5pdC5jCkBAIC0wLDAgKzEsNTQ0IEBACisvKgorICogcXVhcnRlcnBlbCBEU1AgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvcGl4ZWxzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9xcGVsZHNwLmgiCisjaW5jbHVkZSAiZnBlbC5oIgorCit2b2lkIGZmX3B1dF9waXhlbHM4X2wyX21teGV4dCh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyYzFTdHJpZGUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X2wyX21teGV4dCh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjMVN0cmlkZSwgaW50IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzOF9sMl9tbXhleHQodWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmMxU3RyaWRlLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHMxNl9sMl9tbXhleHQodWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyYzFTdHJpZGUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X2wyX21teGV4dCh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjMVN0cmlkZSwgaW50IGgpOwordm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczE2X2wyX21teGV4dCh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmMxU3RyaWRlLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9tcGVnNF9xcGVsMTZfaF9sb3dwYXNzX21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKTsKK3ZvaWQgZmZfYXZnX21wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50IGgpOwordm9pZCBmZl9wdXRfbm9fcm5kX21wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfbW14ZXh0KHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCk7Cit2b2lkIGZmX3B1dF9tcGVnNF9xcGVsOF9oX2xvd3Bhc3NfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgaCk7Cit2b2lkIGZmX2F2Z19tcGVnNF9xcGVsOF9oX2xvd3Bhc3NfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9ub19ybmRfbXBlZzRfcXBlbDhfaF9sb3dwYXNzX21teGV4dCh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpOwordm9pZCBmZl9wdXRfbXBlZzRfcXBlbDE2X3ZfbG93cGFzc19tbXhleHQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKTsKK3ZvaWQgZmZfYXZnX21wZWc0X3FwZWwxNl92X2xvd3Bhc3NfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSk7Cit2b2lkIGZmX3B1dF9ub19ybmRfbXBlZzRfcXBlbDE2X3ZfbG93cGFzc19tbXhleHQodWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKTsKK3ZvaWQgZmZfcHV0X21wZWc0X3FwZWw4X3ZfbG93cGFzc19tbXhleHQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpOwordm9pZCBmZl9hdmdfbXBlZzRfcXBlbDhfdl9sb3dwYXNzX21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSk7Cit2b2lkIGZmX3B1dF9ub19ybmRfbXBlZzRfcXBlbDhfdl9sb3dwYXNzX21teGV4dCh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKTsKKyNkZWZpbmUgZmZfcHV0X25vX3JuZF9waXhlbHMxNl9tbXhleHQgZmZfcHV0X3BpeGVsczE2X21teAorI2RlZmluZSBmZl9wdXRfbm9fcm5kX3BpeGVsczhfbW14ZXh0IGZmX3B1dF9waXhlbHM4X21teAorCisjaWYgSEFWRV9ZQVNNCisKKyNkZWZpbmUgZmZfcHV0X3BpeGVsczE2X21teGV4dCBmZl9wdXRfcGl4ZWxzMTZfbW14CisjZGVmaW5lIGZmX3B1dF9waXhlbHM4X21teGV4dCAgZmZfcHV0X3BpeGVsczhfbW14CisKKyNkZWZpbmUgUVBFTF9PUChPUE5BTUUsIFJORCwgTU1YKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzAwXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfICMjIE1NWChkc3QsIHNyYywgc3RyaWRlLCA4KTsgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzEwXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmID0gKHVpbnQ4X3QgKikgdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGhhbGYsIHNyYywgOCwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOCk7ICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfbDJfICMjIE1NWChkc3QsIHNyYywgaGFsZiwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHN0cmlkZSwgOCk7ICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzIwXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGRzdCwgc3JjLCBzdHJpZGUsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOCk7ICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzMwXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmID0gKHVpbnQ4X3QgKikgdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGhhbGYsIHNyYywgOCwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOCk7ICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfbDJfICMjIE1NWChkc3QsIHNyYyArIDEsIGhhbGYsIHN0cmlkZSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDgpOyAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzAxXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmID0gKHVpbnQ4X3QgKikgdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGhhbGYsIHNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIHN0cmlkZSk7ICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfbDJfICMjIE1NWChkc3QsIHNyYywgaGFsZiwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHN0cmlkZSwgOCk7ICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzAyXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGRzdCwgc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgc3RyaWRlKTsgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzAzXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmID0gKHVpbnQ4X3QgKikgdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGhhbGYsIHNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIHN0cmlkZSk7ICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfbDJfICMjIE1NWChkc3QsIHNyYyArIHN0cmlkZSwgaGFsZiwgc3RyaWRlLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDgpOyAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzExXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzggKyA5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgNjQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGhhbGZILCBzcmMsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOSk7ICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczhfbDJfICMjIE1NWChoYWxmSCwgc3JjLCBoYWxmSCwgOCwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGhhbGZIViwgaGFsZkgsIDgsIDgpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfbDJfICMjIE1NWChkc3QsIGhhbGZILCBoYWxmSFYsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDgsIDgpOyAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzMxXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzggKyA5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgNjQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGhhbGZILCBzcmMsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOSk7ICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczhfbDJfICMjIE1NWChoYWxmSCwgc3JjICsgMSwgaGFsZkgsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGhhbGZIViwgaGFsZkgsIDgsIDgpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfbDJfICMjIE1NWChkc3QsIGhhbGZILCBoYWxmSFYsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDgsIDgpOyAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzEzXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzggKyA5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgNjQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGhhbGZILCBzcmMsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOSk7ICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczhfbDJfICMjIE1NWChoYWxmSCwgc3JjLCBoYWxmSCwgOCwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGhhbGZIViwgaGFsZkgsIDgsIDgpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfbDJfICMjIE1NWChkc3QsIGhhbGZIICsgOCwgaGFsZkhWLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDgsIDgpOyAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzMzXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzggKyA5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgNjQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGhhbGZILCBzcmMsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOSk7ICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczhfbDJfICMjIE1NWChoYWxmSCwgc3JjICsgMSwgaGFsZkgsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGhhbGZIViwgaGFsZkgsIDgsIDgpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfbDJfICMjIE1NWChkc3QsIGhhbGZIICsgOCwgaGFsZkhWLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDgsIDgpOyAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzIxXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzggKyA5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgNjQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGhhbGZILCBzcmMsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOSk7ICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGhhbGZIViwgaGFsZkgsIDgsIDgpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfbDJfICMjIE1NWChkc3QsIGhhbGZILCBoYWxmSFYsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDgsIDgpOyAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzIzXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzggKyA5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgNjQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGhhbGZILCBzcmMsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOSk7ICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGhhbGZIViwgaGFsZkgsIDgsIDgpO1wKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczhfbDJfICMjIE1NWChkc3QsIGhhbGZIICsgOCwgaGFsZkhWLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDgsIDgpOyAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzEyXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzggKyA5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCA9ICh1aW50OF90ICopIGhhbGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGhhbGZILCBzcmMsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOSk7ICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczhfbDJfICMjIE1NWChoYWxmSCwgc3JjLCBoYWxmSCwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCBzdHJpZGUsIDkpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGRzdCwgaGFsZkgsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOCk7ICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzMyXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzggKyA5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCA9ICh1aW50OF90ICopIGhhbGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGhhbGZILCBzcmMsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOSk7ICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczhfbDJfICMjIE1NWChoYWxmSCwgc3JjICsgMSwgaGFsZkgsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGRzdCwgaGFsZkgsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOCk7ICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsOF9tYzIyXyAjIyBNTVgodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCA9ICh1aW50OF90ICopIGhhbGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWw4X2hfbG93cGFzc18gIyMgTU1YKGhhbGZILCBzcmMsIDgsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOSk7ICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIG1wZWc0X3FwZWw4X3ZfbG93cGFzc18gIyMgTU1YKGRzdCwgaGFsZkgsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgOCk7ICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMwMF8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2XyAjIyBNTVgoZHN0LCBzcmMsIHN0cmlkZSwgMTYpOyAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMxMF8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wWzMyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmID0gKHVpbnQ4X3QgKikgdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChoYWxmLCBzcmMsIDE2LCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE2KTsgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoZHN0LCBzcmMsIGhhbGYsIHN0cmlkZSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNik7ICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMyMF8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChkc3QsIHNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHN0cmlkZSwgMTYpO1wKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMzMF8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wWzMyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmID0gKHVpbnQ4X3QqKSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChoYWxmLCBzcmMsIDE2LCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE2KTsgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoZHN0LCBzcmMgKyAxLCBoYWxmLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBzdHJpZGUsIDE2KTsgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMwMV8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wWzMyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmID0gKHVpbnQ4X3QgKikgdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChoYWxmLCBzcmMsIDE2LCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOyAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoZHN0LCBzcmMsIGhhbGYsIHN0cmlkZSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNik7ICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMwMl8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChkc3QsIHNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHN0cmlkZSk7ICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMwM18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wWzMyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmID0gKHVpbnQ4X3QgKikgdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChoYWxmLCBzcmMsIDE2LCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOyAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoZHN0LCBzcmMrc3RyaWRlLCBoYWxmLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBzdHJpZGUsIDE2KTsgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMxMV8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzE2ICogMiArIDE3ICogMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgMjU2OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChoYWxmSCwgc3JjLCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE3KTsgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoaGFsZkgsIHNyYywgaGFsZkgsIDE2LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChoYWxmSFYsIGhhbGZILCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTYpOyAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoZHN0LCBoYWxmSCwgaGFsZkhWLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNiwgMTYpOyAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMzMV8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzE2ICogMiArIDE3ICogMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgMjU2OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChoYWxmSCwgc3JjLCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE3KTsgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoaGFsZkgsIHNyYyArIDEsIGhhbGZILCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChoYWxmSFYsIGhhbGZILCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTYpOyAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoZHN0LCBoYWxmSCwgaGFsZkhWLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNiwgMTYpOyAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMxM18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzE2ICogMiArIDE3ICogMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgMjU2OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChoYWxmSCwgc3JjLCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE3KTsgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoaGFsZkgsIHNyYywgaGFsZkgsIDE2LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChoYWxmSFYsIGhhbGZILCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTYpOyAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoZHN0LCBoYWxmSCArIDE2LCBoYWxmSFYsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNiwgMTYpOyAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMzM18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzE2ICogMiArIDE3ICogMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgMjU2OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChoYWxmSCwgc3JjLCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE3KTsgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoaGFsZkgsIHNyYyArIDEsIGhhbGZILCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChoYWxmSFYsIGhhbGZILCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTYpOyAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoZHN0LCBoYWxmSCArIDE2LCBoYWxmSFYsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNiwgMTYpOyAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMyMV8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzE2ICogMiArIDE3ICogMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgMjU2OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChoYWxmSCwgc3JjLCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE3KTsgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChoYWxmSFYsIGhhbGZILCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTYpOyAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoZHN0LCBoYWxmSCwgaGFsZkhWLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNiwgMTYpOyAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMyM18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzE2ICogMiArIDE3ICogMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCAgPSAodWludDhfdCAqKSBoYWxmICsgMjU2OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSAodWludDhfdCAqKSBoYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChoYWxmSCwgc3JjLCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE3KTsgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChoYWxmSFYsIGhhbGZILCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTYpOyAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoZHN0LCBoYWxmSCArIDE2LCBoYWxmSFYsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNiwgMTYpOyAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMxMl8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzE3ICogMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCA9ICh1aW50OF90ICopIGhhbGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChoYWxmSCwgc3JjLCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE3KTsgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoaGFsZkgsIHNyYywgaGFsZkgsIDE2LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChkc3QsIGhhbGZILCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE2KTsgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMzMl8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzE3ICogMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCA9ICh1aW50OF90ICopIGhhbGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChoYWxmSCwgc3JjLCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE3KTsgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIHBpeGVsczE2X2wyXyAjIyBNTVgoaGFsZkgsIHNyYyArIDEsIGhhbGZILCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAxNyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChkc3QsIGhhbGZILCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE2KTsgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBxcGVsMTZfbWMyMl8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBoYWxmWzE3ICogMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSCA9ICh1aW50OF90ICopIGhhbGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9wdXQgIyMgUk5EICMjIG1wZWc0X3FwZWwxNl9oX2xvd3Bhc3NfICMjIE1NWChoYWxmSCwgc3JjLCAxNiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE3KTsgICAgICAgIFwKKyAgICBmZl8gIyMgT1BOQU1FICMjIG1wZWc0X3FwZWwxNl92X2xvd3Bhc3NfICMjIE1NWChkc3QsIGhhbGZILCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIDE2KTsgICAgICAgIFwKK30KKworUVBFTF9PUChwdXRfLCAgICAgICAgXywgICAgICAgIG1teGV4dCkKK1FQRUxfT1AoYXZnXywgICAgICAgIF8sICAgICAgICBtbXhleHQpCitRUEVMX09QKHB1dF9ub19ybmRfLCBfbm9fcm5kXywgbW14ZXh0KQorCisjZW5kaWYgLyogSEFWRV9ZQVNNICovCisKKyNkZWZpbmUgU0VUX1FQRUxfRlVOQ1MoUEZYLCBJRFgsIFNJWkUsIENQVSwgUFJFRklYKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bIDBdID0gUFJFRklYICMjIFBGWCAjIyBTSVpFICMjIF9tYzAwXyAjIyBDUFU7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgMV0gPSBQUkVGSVggIyMgUEZYICMjIFNJWkUgIyMgX21jMTBfICMjIENQVTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyAyXSA9IFBSRUZJWCAjIyBQRlggIyMgU0laRSAjIyBfbWMyMF8gIyMgQ1BVOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bIDNdID0gUFJFRklYICMjIFBGWCAjIyBTSVpFICMjIF9tYzMwXyAjIyBDUFU7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgNF0gPSBQUkVGSVggIyMgUEZYICMjIFNJWkUgIyMgX21jMDFfICMjIENQVTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA1XSA9IFBSRUZJWCAjIyBQRlggIyMgU0laRSAjIyBfbWMxMV8gIyMgQ1BVOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bIDZdID0gUFJFRklYICMjIFBGWCAjIyBTSVpFICMjIF9tYzIxXyAjIyBDUFU7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsgN10gPSBQUkVGSVggIyMgUEZYICMjIFNJWkUgIyMgX21jMzFfICMjIENQVTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWyA4XSA9IFBSRUZJWCAjIyBQRlggIyMgU0laRSAjIyBfbWMwMl8gIyMgQ1BVOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bIDldID0gUFJFRklYICMjIFBGWCAjIyBTSVpFICMjIF9tYzEyXyAjIyBDUFU7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxMF0gPSBQUkVGSVggIyMgUEZYICMjIFNJWkUgIyMgX21jMjJfICMjIENQVTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzExXSA9IFBSRUZJWCAjIyBQRlggIyMgU0laRSAjIyBfbWMzMl8gIyMgQ1BVOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTJdID0gUFJFRklYICMjIFBGWCAjIyBTSVpFICMjIF9tYzAzXyAjIyBDUFU7IFwKKyAgICBjLT5QRlggIyMgX3BpeGVsc190YWJbSURYXVsxM10gPSBQUkVGSVggIyMgUEZYICMjIFNJWkUgIyMgX21jMTNfICMjIENQVTsgXAorICAgIGMtPlBGWCAjIyBfcGl4ZWxzX3RhYltJRFhdWzE0XSA9IFBSRUZJWCAjIyBQRlggIyMgU0laRSAjIyBfbWMyM18gIyMgQ1BVOyBcCisgICAgYy0+UEZYICMjIF9waXhlbHNfdGFiW0lEWF1bMTVdID0gUFJFRklYICMjIFBGWCAjIyBTSVpFICMjIF9tYzMzXyAjIyBDUFU7IFwKK30gd2hpbGUgKDApCisKK2F2X2NvbGQgdm9pZCBmZl9xcGVsZHNwX2luaXRfeDg2KFFwZWxEU1BDb250ZXh0ICpjKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoWDg2X01NWEVYVChjcHVfZmxhZ3MpKSB7CisjaWYgSEFWRV9NTVhFWFRfRVhURVJOQUwKKyAgICAgICAgU0VUX1FQRUxfRlVOQ1MoYXZnX3FwZWwsICAgICAgICAwLCAxNiwgbW14ZXh0LCApOworICAgICAgICBTRVRfUVBFTF9GVU5DUyhhdmdfcXBlbCwgICAgICAgIDEsICA4LCBtbXhleHQsICk7CisKKyAgICAgICAgU0VUX1FQRUxfRlVOQ1MocHV0X3FwZWwsICAgICAgICAwLCAxNiwgbW14ZXh0LCApOworICAgICAgICBTRVRfUVBFTF9GVU5DUyhwdXRfcXBlbCwgICAgICAgIDEsICA4LCBtbXhleHQsICk7CisgICAgICAgIFNFVF9RUEVMX0ZVTkNTKHB1dF9ub19ybmRfcXBlbCwgMCwgMTYsIG1teGV4dCwgKTsKKyAgICAgICAgU0VUX1FQRUxfRlVOQ1MocHV0X25vX3JuZF9xcGVsLCAxLCAgOCwgbW14ZXh0LCApOworI2VuZGlmIC8qIEhBVkVfTU1YRVhUX0VYVEVSTkFMICovCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3JuZF90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3JuZF90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZmQ3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvcm5kX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBTSU1ELW9wdGltaXplZCBoYWxmcGVsIGZ1bmN0aW9ucyBhcmUgY29tcGlsZWQgdHdpY2UgZm9yIHJuZC9ub19ybmQKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogTU1YIG9wdGltaXphdGlvbiBieSBOaWNrIEt1cnNoZXYgPG5pY2tvbHNfa0BtYWlsLnJ1PgorICogbW9zdGx5IHJld3JpdHRlbiBieSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogYW5kIGltcHJvdmVkIGJ5IFpkZW5layBLYWJlbGFjIDxrYWJpQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiaW5saW5lX2FzbS5oIgorCisvLyBwdXRfcGl4ZWxzCitTVEFUSUMgdm9pZCBERUYocHV0LCBwaXhlbHM4X3h5MikodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBNT1ZRX1pFUk8obW03KTsKKyAgICBTRVRfUk5EKG1tNik7IC8vID0yIGZvciBybmQgIGFuZCAgPTEgZm9yIG5vX3JuZCB2ZXJzaW9uCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdnEgICAoJTEpLCAlJW1tMCAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgIDEoJTEpLCAlJW1tNCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTAsICUlbW0xICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAlJW1tNCwgJSVtbTUgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMCAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW00ICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTEgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tNSAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICUlIlJFR19hIiwgJSUiUkVHX2EiICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJTMsICUxICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIi5wMmFsaWduIDMgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMCAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAxKCUxLCAlJSJSRUdfYSIpLCAlJW1tMiBcblx0IgorICAgICAgICAibW92cSAgICUlbW0wLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTIsICUlbW0zICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzdyAlJW1tMiwgJSVtbTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTYsICUlbW00ICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzdyAlJW1tNiwgJSVtbTUgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHcgICQyLCAlJW1tNCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsdyAgJDIsICUlbW01ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c3diICAlJW1tNSwgJSVtbTQgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICUlbW00LCAoJTIsICUlIlJFR19hIikgIFxuXHQiCisgICAgICAgICJhZGQgICAgJTMsICUlIlJFR19hIiAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAgICglMSwgJSUiUkVHX2EiKSwgJSVtbTIgIFxuXHQiIC8vIDAgPC0+IDIgICAxIDwtPiAzCisgICAgICAgICJtb3ZxICAgMSglMSwgJSUiUkVHX2EiKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgIm1vdnEgICAlJW1tMiwgJSVtbTMgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICUlbW00LCAlJW1tNSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTQgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMyAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW01ICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTIsICUlbW00ICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzdyAlJW1tMywgJSVtbTUgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW02LCAlJW1tMCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzdyAlJW1tNCwgJSVtbTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW01LCAlJW1tMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmx3ICAkMiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHcgICQyLCAlJW1tMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXN3YiAgJSVtbTEsICUlbW0wICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAlJW1tMCwgKCUyLCAlJSJSRUdfYSIpICBcblx0IgorICAgICAgICAiYWRkICAgICUzLCAlJSJSRUdfYSIgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInN1YmwgICAkMiwgJTAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiam56ICAgIDFiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDoiK2ciKGgpLCAiK1MiKHBpeGVscykKKyAgICAgICAgOiJEIihibG9jayksICJyIigoeDg2X3JlZylsaW5lX3NpemUpCisgICAgICAgIDpSRUdfYSwgIm1lbW9yeSIpOworfQorCisvLyBhdmdfcGl4ZWxzCisvLyB0aGlzIHJvdXRpbmUgaXMgJ3NsaWdodGx5JyBzdWJvcHRpbWFsIGJ1dCBtb3N0bHkgdW51c2VkCitTVEFUSUMgdm9pZCBERUYoYXZnLCBwaXhlbHM4X3h5MikodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBNT1ZRX1pFUk8obW03KTsKKyAgICBTRVRfUk5EKG1tNik7IC8vID0yIGZvciBybmQgIGFuZCAgPTEgZm9yIG5vX3JuZCB2ZXJzaW9uCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdnEgICAoJTEpLCAlJW1tMCAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgIDEoJTEpLCAlJW1tNCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTAsICUlbW0xICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAlJW1tNCwgJSVtbTUgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMCAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW00ICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTEgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tNSAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICUlIlJFR19hIiwgJSUiUkVHX2EiICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJTMsICUxICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIi5wMmFsaWduIDMgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMCAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAxKCUxLCAlJSJSRUdfYSIpLCAlJW1tMiBcblx0IgorICAgICAgICAibW92cSAgICUlbW0wLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTIsICUlbW0zICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzdyAlJW1tMiwgJSVtbTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTYsICUlbW00ICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzdyAlJW1tNiwgJSVtbTUgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHcgICQyLCAlJW1tNCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsdyAgJDIsICUlbW01ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICglMiwgJSUiUkVHX2EiKSwgJSVtbTMgIFxuXHQiCisgICAgICAgICJwYWNrdXN3YiAgJSVtbTUsICUlbW00ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGNtcGVxZCAlJW1tMiwgJSVtbTIgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkYiAlJW1tMiwgJSVtbTIgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgUEFWR0JfTU1YKCUlbW0zLCAlJW1tNCwgJSVtbTUsICUlbW0yKQorICAgICAgICAgICAgICAgICJtb3ZxICAgJSVtbTUsICglMiwgJSUiUkVHX2EiKSAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlMywgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgICAoJTEsICUlIlJFR19hIiksICUlbW0yICBcblx0IiAvLyAwIDwtPiAyICAgMSA8LT4gMworICAgICAgICAibW92cSAgIDEoJTEsICUlIlJFR19hIiksICUlbW00IFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTIsICUlbW0zICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAlJW1tNCwgJSVtbTUgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW00ICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tNSAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW0yLCAlJW1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzdyAlJW1tNiwgJSVtbTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW02LCAlJW1tMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTQsICUlbW0wICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzdyAlJW1tNSwgJSVtbTEgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsdyAgJDIsICUlbW0wICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmx3ICAkMiwgJSVtbTEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgKCUyLCAlJSJSRUdfYSIpLCAlJW1tMyAgXG5cdCIKKyAgICAgICAgInBhY2t1c3diICAlJW1tMSwgJSVtbTAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwY21wZXFkICUlbW0yLCAlJW1tMiAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGRiICUlbW0yLCAlJW1tMiAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICBQQVZHQl9NTVgoJSVtbTMsICUlbW0wLCAlJW1tMSwgJSVtbTIpCisgICAgICAgICAgICAgICAgIm1vdnEgICAlJW1tMSwgKCUyLCAlJSJSRUdfYSIpICBcblx0IgorICAgICAgICAiYWRkICAgICUzLCAlJSJSRUdfYSIgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInN1YmwgICAkMiwgJTAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiam56ICAgIDFiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDoiK2ciKGgpLCAiK1MiKHBpeGVscykKKyAgICAgICAgOiJEIihibG9jayksICJyIigoeDg2X3JlZylsaW5lX3NpemUpCisgICAgICAgIDpSRUdfYSwgIm1lbW9yeSIpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3J2MzRkc3AuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3J2MzRkc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MzJkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvcnYzNGRzcC5hc20KQEAgLTAsMCArMSwxOTYgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIE1NWC9TU0UyLW9wdGltaXplZCBmdW5jdGlvbnMgZm9yIHRoZSBSVjMwIGFuZCBSVjQwIGRlY29kZXJzCis7KiBDb3B5cmlnaHQgKEMpIDIwMTIgQ2hyaXN0b3BoZSBHaXNxdWV0IDxjaHJpc3RvcGhlLmdpc3F1ZXRAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCitwd19yb3dfY29lZmZzOiAgdGltZXMgNCBkdyAxMworICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgMTcKKyAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICA3CitwZF81MTI6IHRpbWVzIDIgZGQgMHgyMDAKK3B3X2NvbF9jb2VmZnM6ICBkdyAxMywgIDEzLCAgMTMsIC0xMworICAgICAgICAgICAgICAgIGR3IDE3LCAgIDcsICAgNywgLTE3CisgICAgICAgICAgICAgICAgZHcgMTMsIC0xMywgIDEzLCAgMTMKKyAgICAgICAgICAgICAgICBkdyAtNywgIDE3LCAtMTcsICAtNworCitTRUNUSU9OIC50ZXh0CisKKyVtYWNybyBJRENUX0RDX05PUk9VTkQgMQorICAgIGltdWwgICAlMSwgMTMqMTMqMworICAgIHNhciAgICAlMSwgMTEKKyVlbmRtYWNybworCislbWFjcm8gSURDVF9EQ19ST1VORCAxCisgICAgaW11bCAgICUxLCAxMyoxMworICAgIGFkZCAgICAlMSwgMHgyMDAKKyAgICBzYXIgICAgJTEsIDEwCislZW5kbWFjcm8KKworJW1hY3JvIHJ2MzRfaWRjdCAxCitjZ2xvYmFsIHJ2MzRfaWRjdF8lMSwgMSwgMiwgMAorICAgIG1vdnN4ICAgcjEsIHdvcmQgW3IwXQorICAgIElEQ1RfREMgcjEKKyAgICBtb3ZkICAgIG0wLCByMWQKKyAgICBwc2h1ZncgIG0wLCBtMCwgMAorICAgIG1vdnEgICAgW3IwKyAwXSwgbTAKKyAgICBtb3ZxICAgIFtyMCsgOF0sIG0wCisgICAgbW92cSAgICBbcjArMTZdLCBtMAorICAgIG1vdnEgICAgW3IwKzI0XSwgbTAKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CislZGVmaW5lIElEQ1RfREMgSURDVF9EQ19ST1VORAorcnYzNF9pZGN0IGRjCislZGVmaW5lIElEQ1RfREMgSURDVF9EQ19OT1JPVU5ECitydjM0X2lkY3QgZGNfbm9yb3VuZAorCis7IGZmX3J2MzRfaWRjdF9kY19hZGRfbW14KHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGRjKTsKK0lOSVRfTU1YIG1teAorY2dsb2JhbCBydjM0X2lkY3RfZGNfYWRkLCAzLCAzCisgICAgOyBjYWxjdWxhdGUgREMKKyAgICBJRENUX0RDX1JPVU5EIHIyCisgICAgcHhvciAgICAgICBtMSwgbTEKKyAgICBtb3ZkICAgICAgIG0wLCByMmQKKyAgICBwc3VidyAgICAgIG0xLCBtMAorICAgIHBhY2t1c3diICAgbTAsIG0wCisgICAgcGFja3Vzd2IgICBtMSwgbTEKKyAgICBwdW5wY2tsYncgIG0wLCBtMAorICAgIHB1bnBja2xidyAgbTEsIG0xCisgICAgcHVucGNrbHdkICBtMCwgbTAKKyAgICBwdW5wY2tsd2QgIG0xLCBtMQorCisgICAgOyBhZGQgREMKKyAgICBsZWEgICAgICAgIHIyLCBbcjArcjEqMl0KKyAgICBtb3ZoICAgICAgIG0yLCBbcjBdCisgICAgbW92aCAgICAgICBtMywgW3IwK3IxXQorICAgIG1vdmggICAgICAgbTQsIFtyMl0KKyAgICBtb3ZoICAgICAgIG01LCBbcjIrcjFdCisgICAgcGFkZHVzYiAgICBtMiwgbTAKKyAgICBwYWRkdXNiICAgIG0zLCBtMAorICAgIHBhZGR1c2IgICAgbTQsIG0wCisgICAgcGFkZHVzYiAgICBtNSwgbTAKKyAgICBwc3VidXNiICAgIG0yLCBtMQorICAgIHBzdWJ1c2IgICAgbTMsIG0xCisgICAgcHN1YnVzYiAgICBtNCwgbTEKKyAgICBwc3VidXNiICAgIG01LCBtMQorICAgIG1vdmggICAgICAgW3IwXSwgbTIKKyAgICBtb3ZoICAgICAgIFtyMCtyMV0sIG0zCisgICAgbW92aCAgICAgICBbcjJdLCBtNAorICAgIG1vdmggICAgICAgW3IyK3IxXSwgbTUKKyAgICBSRVQKKworOyBMb2FkIGNvZWZmcyBhbmQgcGVyZm9ybSByb3cgdHJhbnNmb3JtCis7IE91dHB1dDogY29lZmZzIGluIG1tWzA0NjddLCByb3VuZGVyIGluIG1tNQorJW1hY3JvIFJPV19UUkFOU0ZPUk0gIDEKKyAgICBweG9yICAgICAgICBtbTcsIG1tNworICAgIG1vdmEgICAgICAgIG1tMCwgWyUxKyAwKjhdCisgICAgbW92YSAgICAgICAgbW0xLCBbJTErIDEqOF0KKyAgICBtb3ZhICAgICAgICBtbTIsIFslMSsgMio4XQorICAgIG1vdmEgICAgICAgIG1tMywgWyUxKyAzKjhdCisgICAgbW92YSAgWyUxKyAwKjhdLCBtbTcKKyAgICBtb3ZhICBbJTErIDEqOF0sIG1tNworICAgIG1vdmEgIFslMSsgMio4XSwgbW03CisgICAgbW92YSAgWyUxKyAzKjhdLCBtbTcKKyAgICBtb3ZhICAgICAgICBtbTQsIG1tMAorICAgIG1vdmEgICAgICAgIG1tNiwgW3B3X3Jvd19jb2VmZnMrIDBdCisgICAgcGFkZHN3ICAgICAgbW0wLCBtbTIgICAgICAgICAgICAgICAgOyBiMCArIGIyCisgICAgcHN1YnN3ICAgICAgbW00LCBtbTIgICAgICAgICAgICAgICAgOyBiMCAtIGIyCisgICAgcG11bGx3ICAgICAgbW0wLCBtbTYgICAgICAgICAgICAgICAgOyAqMTMgPSB6MAorICAgIHBtdWxsdyAgICAgIG1tNCwgbW02ICAgICAgICAgICAgICAgIDsgKjEzID0gejEKKyAgICBtb3ZhICAgICAgICBtbTUsIG1tMQorICAgIHBtdWxsdyAgICAgIG1tMSwgW3B3X3Jvd19jb2VmZnMrIDhdIDsgYjEqMTcKKyAgICBwbXVsbHcgICAgICBtbTUsIFtwd19yb3dfY29lZmZzKzE2XSA7IGIxKiA3CisgICAgbW92YSAgICAgICAgbW03LCBtbTMKKyAgICBwbXVsbHcgICAgICBtbTMsIFtwd19yb3dfY29lZmZzKyA4XSA7IGIzKjE3CisgICAgcG11bGx3ICAgICAgbW03LCBbcHdfcm93X2NvZWZmcysxNl0gOyBiMyogNworICAgIHBhZGRzdyAgICAgIG1tMSwgbW03ICAgICAgICAgICAgICAgIDsgejMgPSBiMSoxNyArIGIzKiA3CisgICAgcHN1YnN3ICAgICAgbW01LCBtbTMgICAgICAgICAgICAgICAgOyB6MiA9IGIxKiA3IC0gYjMqMTcKKyAgICBtb3ZhICAgICAgICBtbTcsIG1tMAorICAgIG1vdmEgICAgICAgIG1tNiwgbW00CisgICAgcGFkZHN3ICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgOyB6MCArIHozCisgICAgcHN1YnN3ICAgICAgbW03LCBtbTEgICAgICAgICAgICAgICAgOyB6MCAtIHozCisgICAgcGFkZHN3ICAgICAgbW00LCBtbTUgICAgICAgICAgICAgICAgOyB6MSArIHoyCisgICAgcHN1YnN3ICAgICAgbW02LCBtbTUgICAgICAgICAgICAgICAgOyB6MSAtIHoyCisgICAgbW92YSAgICAgICAgbW01LCBbcGRfNTEyXSAgICAgICAgICAgOyAweDIwMAorJWVuZG1hY3JvCisKKzsgZmZfcnYzNF9pZGN0X2FkZF9tbXhleHQodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jayk7CislbWFjcm8gQ09MX1RSQU5TRk9STSAgNAorICAgIHBzaHVmdyAgICAgIG1tMywgJTIsIDB4REQgICAgICAgIDsgY29sLiAxLDMsMSwzCisgICAgcHNodWZ3ICAgICAgICUyLCAlMiwgMHg4OCAgICAgICAgOyBjb2wuIDAsMiwwLDIKKyAgICBwbWFkZHdkICAgICAgJTIsICUzICAgICAgICAgICAgICA7IDEzKmMwKzEzKmMyIHwgMTMqYzAtMTMqYzIgPSB6MCB8IHoxCisgICAgcG1hZGR3ZCAgICAgbW0zLCAlNCAgICAgICAgICAgICAgOyAxNypjMSsgNypjMyB8ICA3KmMxLTE3KmMzID0gejMgfCB6MgorICAgIHBhZGRkICAgICAgICAlMiwgbW01CisgICAgcHNodWZ3ICAgICAgbW0xLCAgJTIsIDAxMDAxMTEwYiAgOyAgICB6MSB8IHowCisgICAgcHNodWZ3ICAgICAgbW0yLCBtbTMsIDAxMDAxMTEwYiAgOyAgICB6MiB8IHozCisgICAgcGFkZGQgICAgICAgICUyLCBtbTMgICAgICAgICAgICAgOyB6MCt6MyB8IHoxK3oyCisgICAgcHN1YmQgICAgICAgbW0xLCBtbTIgICAgICAgICAgICAgOyB6MS16MiB8IHowLXozCisgICAgbW92ZCAgICAgICAgbW0zLCAlMQorICAgIHBzcmFkICAgICAgICAlMiwgMTAKKyAgICBweG9yICAgICAgICBtbTIsIG1tMgorICAgIHBzcmFkICAgICAgIG1tMSwgMTAKKyAgICBwdW5wY2tsYncgICBtbTMsIG1tMgorICAgIHBhY2tzc2R3ICAgICAlMiwgbW0xCisgICAgcGFkZHcgICAgICAgICUyLCBtbTMKKyAgICBwYWNrdXN3YiAgICAgJTIsICUyCisgICAgbW92ZCAgICAgICAgICUxLCAlMgorJWVuZG1hY3JvCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgcnYzNF9pZGN0X2FkZCwgMywzLDAsIGQsIHMsIGIKKyAgICBST1dfVFJBTlNGT1JNICAgICAgIGJxCisgICAgQ09MX1RSQU5TRk9STSAgICAgW2RxXSwgbW0wLCBbcHdfY29sX2NvZWZmcysgMF0sIFtwd19jb2xfY29lZmZzKyA4XQorICAgIG1vdmEgICAgICAgICAgICAgICBtbTAsIFtwd19jb2xfY29lZmZzKyAwXQorICAgIENPTF9UUkFOU0ZPUk0gIFtkcStzcV0sIG1tNCwgbW0wLCBbcHdfY29sX2NvZWZmcysgOF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgbW00LCBbcHdfY29sX2NvZWZmcysgOF0KKyAgICBsZWEgICAgICAgICAgICAgICAgIGRxLCBbZHEgKyAyKnNxXQorICAgIENPTF9UUkFOU0ZPUk0gICAgIFtkcV0sIG1tNiwgbW0wLCBtbTQKKyAgICBDT0xfVFJBTlNGT1JNICBbZHErc3FdLCBtbTcsIG1tMCwgbW00CisgICAgcmV0CisKKzsgZmZfcnYzNF9pZGN0X2RjX2FkZF9zc2U0KHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGRjKTsKK0lOSVRfWE1NIHNzZTQKK2NnbG9iYWwgcnYzNF9pZGN0X2RjX2FkZCwgMywgMywgNgorICAgIDsgbG9hZCBkYXRhCisgICAgSURDVF9EQ19ST1VORCByMgorICAgIHB4b3IgICAgICAgbTEsIG0xCisKKyAgICA7IGNhbGN1bGF0ZSBEQworICAgIG1vdmQgICAgICAgbTAsIHIyZAorICAgIGxlYSAgICAgICAgcjIsIFtyMCtyMSoyXQorICAgIG1vdmQgICAgICAgbTIsIFtyMF0KKyAgICBtb3ZkICAgICAgIG0zLCBbcjArcjFdCisgICAgcHNodWZsdyAgICBtMCwgbTAsIDAKKyAgICBtb3ZkICAgICAgIG00LCBbcjJdCisgICAgbW92ZCAgICAgICBtNSwgW3IyK3IxXQorICAgIHB1bnBja2xxZHEgbTAsIG0wCisgICAgcHVucGNrbGRxICBtMiwgbTMKKyAgICBwdW5wY2tsZHEgIG00LCBtNQorICAgIHB1bnBja2xidyAgbTIsIG0xCisgICAgcHVucGNrbGJ3ICBtNCwgbTEKKyAgICBwYWRkdyAgICAgIG0yLCBtMAorICAgIHBhZGR3ICAgICAgbTQsIG0wCisgICAgcGFja3Vzd2IgICBtMiwgbTQKKyAgICBtb3ZkICAgICAgW3IwXSwgbTIKKyAgICBwZXh0cmQgW3IwK3IxXSwgbTIsIDEKKyAgICBwZXh0cmQgICAgW3IyXSwgbTIsIDIKKyAgICBwZXh0cmQgW3IyK3IxXSwgbTIsIDMKKyAgICBSRVQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ydjM0ZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ydjM0ZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWM1NmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3J2MzRkc3BfaW5pdC5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBSVjMwLzQwIE1NWC9TU0UyIG9wdGltaXphdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMjAxMiBDaHJpc3RvcGhlIEdpc3F1ZXQgPGNocmlzdG9waGUuZ2lzcXVldEBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9ydjM0ZHNwLmgiCisKK3ZvaWQgZmZfcnYzNF9pZGN0X2RjX21teGV4dChpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3J2MzRfaWRjdF9kY19ub3JvdW5kX21teGV4dChpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3J2MzRfaWRjdF9kY19hZGRfbW14KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGRjKTsKK3ZvaWQgZmZfcnYzNF9pZGN0X2RjX2FkZF9zc2U0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGRjKTsKK3ZvaWQgZmZfcnYzNF9pZGN0X2FkZF9tbXhleHQodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jayk7CisKK2F2X2NvbGQgdm9pZCBmZl9ydjM0ZHNwX2luaXRfeDg2KFJWMzREU1BDb250ZXh0KiBjKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpCisgICAgICAgIGMtPnJ2MzRfaWRjdF9kY19hZGQgPSBmZl9ydjM0X2lkY3RfZGNfYWRkX21teDsKKyAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+cnYzNF9pbnZfdHJhbnNmb3JtX2RjID0gZmZfcnYzNF9pZGN0X2RjX25vcm91bmRfbW14ZXh0OworICAgICAgICBjLT5ydjM0X2lkY3RfYWRkICAgICAgICAgPSBmZl9ydjM0X2lkY3RfYWRkX21teGV4dDsKKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkKKyAgICAgICAgYy0+cnYzNF9pZGN0X2RjX2FkZCA9IGZmX3J2MzRfaWRjdF9kY19hZGRfc3NlNDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ydjQwZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9ydjQwZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGQ4MWEwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3J2NDBkc3AuYXNtCkBAIC0wLDAgKzEsNTAxIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBNTVgvU1NFMi1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciB0aGUgUlY0MCBkZWNvZGVyCis7KiBDb3B5cmlnaHQgKGMpIDIwMTAgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amVAZ21haWwuY29tPgorOyogQ29weXJpZ2h0IChjKSAyMDEwIEZpb25hIEdsYXNlciA8ZmlvbmFAeDI2NC5jb20+Cis7KiBDb3B5cmlnaHQgKEMpIDIwMTIgQ2hyaXN0b3BoZSBHaXNxdWV0IDxjaHJpc3RvcGhlLmdpc3F1ZXRAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK2FsaWduIDE2Citwd18xMDI0OiAgIHRpbWVzIDggZHcgMSA8PCAoMTYgLSA2KSA7IHB3XzEwMjQKKworc2l4dGFwX2ZpbHRlcl9oYl9tOiAgdGltZXMgOCBkYiAgIDEsIC01CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGRiICA1MiwgMjAKKyAgICAgICAgICAgICAgICAgICAgIDsgbXVsdGlwbGllZCBieSAyIHRvIGhhdmUgdGhlIHNhbWUgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZGIgICAyLCAtMTAKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZGIgIDQwLCAgNDAKKyAgICAgICAgICAgICAgICAgICAgIDsgYmFjayB0byBub3JtYWwKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZGIgICAxLCAtNQorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiAgMjAsIDUyCisKK3NpeHRhcF9maWx0ZXJfdl9tOiAgIHRpbWVzIDggZHcgICAxCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3ICAtNQorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgNTIKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgIDIwCisgICAgICAgICAgICAgICAgICAgICA7IG11bHRpcGxpZWQgYnkgMiB0byBoYXZlIHRoZSBzYW1lIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3ICAgMgorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAtMTAKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgIDQwCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3ICA0MAorICAgICAgICAgICAgICAgICAgICAgOyBiYWNrIHRvIG5vcm1hbAorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgIDEKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgIC01CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3ICAyMAorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgNTIKKworJWlmZGVmIFBJQworJWRlZmluZSBzaXh0YXBfZmlsdGVyX2h3ICAgcGljcmVncQorJWRlZmluZSBzaXh0YXBfZmlsdGVyX2hiICAgcGljcmVncQorJWRlZmluZSBzaXh0YXBfZmlsdGVyX3YgICAgcGljcmVncQorJWRlZmluZSBucGljcmVncyAxCislZWxzZQorJWRlZmluZSBzaXh0YXBfZmlsdGVyX2h3ICAgc2l4dGFwX2ZpbHRlcl9od19tCislZGVmaW5lIHNpeHRhcF9maWx0ZXJfaGIgICBzaXh0YXBfZmlsdGVyX2hiX20KKyVkZWZpbmUgc2l4dGFwX2ZpbHRlcl92ICAgIHNpeHRhcF9maWx0ZXJfdl9tCislZGVmaW5lIG5waWNyZWdzIDAKKyVlbmRpZgorCitmaWx0ZXJfaDZfc2h1ZjE6IGRiIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsICA1LCA2LCAgNiwgIDcsICA3LCAgOAorZmlsdGVyX2g2X3NodWYyOiBkYiAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCAgNywgOCwgIDgsICA5LCAgOSwgMTAKK2ZpbHRlcl9oNl9zaHVmMzogZGIgNSwgNCwgNiwgNSwgNywgNiwgOCwgNywgOSwgOCwgMTAsIDksIDExLCAxMCwgMTIsIDExCisKK2NleHRlcm4gIHB3XzMyCitjZXh0ZXJuICBwd18xNgorY2V4dGVybiAgcHdfNTEyCisKK1NFQ1RJT04gLnRleHQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHN1YnBlbCBNQyBmdW5jdGlvbnM6Cis7Cis7IHZvaWQgZmZfW3B1dHxydjQwXV9ydjQwX3FwZWxfW2h8dl1fPG9wdD4odWludDhfdCAqZHN0LCBpbnQgZGVzdHN0cmlkZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIGludCBzcmNzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IG0pOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBMT0FEICAyCislaWYgV0lONjQKKyAgIG1vdnN4ZCAgICUxcSwgJTFkCislZW5kaWYKKyVpZmRlZiBQSUMKKyAgIGFkZCAgICAgICUxcSwgcGljcmVncQorJWVsc2UKKyAgIGFkZCAgICAgICUxcSwgJTIKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBTVE9SRSAzCislaWZpZG4gJTMsIGF2ZworICAgIG1vdmggICAgICAlMiwgW2RzdHFdCislZW5kaWYKKyAgICBwYWNrdXN3YiAgJTEsICUxCislaWZpZG4gJTMsIGF2ZworICAgIFBBVkdCICAgICAlMSwgJTIKKyVlbmRpZgorICAgIG1vdmggIFtkc3RxXSwgJTEKKyVlbmRtYWNybworCislbWFjcm8gRklMVEVSX1YgMQorY2dsb2JhbCAlMV9ydjQwX3FwZWxfdiwgNiw2K25waWNyZWdzLDEyLCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgbXksIHBpY3JlZworJWlmZGVmIFBJQworICAgIGxlYSAgcGljcmVncSwgW3NpeHRhcF9maWx0ZXJfdl9tXQorJWVuZGlmCisgICAgcHhvciAgICAgIG03LCBtNworICAgIExPQUQgICAgICBteSwgc2l4dGFwX2ZpbHRlcl92CisKKyAgICA7IHJlYWQgNSBsaW5lcworICAgIHN1YiAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIHN1YiAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIG1vdmggICAgICBtMCwgW3NyY3FdCisgICAgbW92aCAgICAgIG0xLCBbc3JjcStzcmNzdHJpZGVxXQorICAgIG1vdmggICAgICBtMiwgW3NyY3Erc3Jjc3RyaWRlcSoyXQorICAgIGxlYSAgICAgc3JjcSwgW3NyY3Erc3Jjc3RyaWRlcSoyXQorICAgIGFkZCAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIG1vdmggICAgICBtMywgW3NyY3FdCisgICAgbW92aCAgICAgIG00LCBbc3JjcStzcmNzdHJpZGVxXQorICAgIHB1bnBja2xidyBtMCwgbTcKKyAgICBwdW5wY2tsYncgbTEsIG03CisgICAgcHVucGNrbGJ3IG0yLCBtNworICAgIHB1bnBja2xidyBtMywgbTcKKyAgICBwdW5wY2tsYncgbTQsIG03CisKKyVpZmRlZiBtOAorICAgIG1vdmEgICAgICBtOCwgW215cSsgMF0KKyAgICBtb3ZhICAgICAgbTksIFtteXErMTZdCisgICAgbW92YSAgICAgbTEwLCBbbXlxKzMyXQorICAgIG1vdmEgICAgIG0xMSwgW215cSs0OF0KKyVkZWZpbmUgQ09FRkYwNSAgbTgKKyVkZWZpbmUgQ09FRkYxNCAgbTkKKyVkZWZpbmUgQ09FRkYyICAgbTEwCislZGVmaW5lIENPRUZGMyAgIG0xMQorJWVsc2UKKyVkZWZpbmUgQ09FRkYwNSAgW215cSsgMF0KKyVkZWZpbmUgQ09FRkYxNCAgW215cSsxNl0KKyVkZWZpbmUgQ09FRkYyICAgW215cSszMl0KKyVkZWZpbmUgQ09FRkYzICAgW215cSs0OF0KKyVlbmRpZgorLm5leHRyb3c6CisgICAgbW92YSAgICAgIG02LCBtMQorICAgIG1vdmggICAgICBtNSwgW3NyY3ErMipzcmNzdHJpZGVxXSAgICAgIDsgcmVhZCBuZXcgcm93CisgICAgcGFkZHcgICAgIG02LCBtNAorICAgIHB1bnBja2xidyBtNSwgbTcKKyAgICBwbXVsbHcgICAgbTYsIENPRUZGMTQKKyAgICBwYWRkdyAgICAgbTAsIG01CisgICAgcG11bGx3ICAgIG0wLCBDT0VGRjA1CisgICAgcGFkZHcgICAgIG02LCBtMAorICAgIG1vdmEgICAgICBtMCwgbTEKKyAgICBwYWRkdyAgICAgbTYsIFtwd18zMl0KKyAgICBtb3ZhICAgICAgbTEsIG0yCisgICAgcG11bGx3ICAgIG0yLCBDT0VGRjIKKyAgICBwYWRkdyAgICAgbTYsIG0yCisgICAgbW92YSAgICAgIG0yLCBtMworICAgIHBtdWxsdyAgICBtMywgQ09FRkYzCisgICAgcGFkZHcgICAgIG02LCBtMworCisgICAgOyByb3VuZC9jbGlwL3N0b3JlCisgICAgbW92YSAgICAgIG0zLCBtNAorICAgIHBzcmF3ICAgICBtNiwgNgorICAgIG1vdmEgICAgICBtNCwgbTUKKyAgICBTVE9SRSAgICAgbTYsIG01LCAlMQorCisgICAgOyBnbyB0byBuZXh0IGxpbmUKKyAgICBhZGQgICAgIGRzdHEsIGRzdHN0cmlkZXEKKyAgICBhZGQgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBkZWMgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG5leHQgcm93CisgICAgamcgLm5leHRyb3cKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworJW1hY3JvIEZJTFRFUl9IICAxCitjZ2xvYmFsICUxX3J2NDBfcXBlbF9oLCA2LCA2K25waWNyZWdzLCAxMiwgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCBwaWNyZWcKKyVpZmRlZiBQSUMKKyAgICBsZWEgIHBpY3JlZ3EsIFtzaXh0YXBfZmlsdGVyX3ZfbV0KKyVlbmRpZgorICAgIHB4b3IgICAgICBtNywgbTcKKyAgICBMT0FEICAgICAgbXgsIHNpeHRhcF9maWx0ZXJfdgorICAgIG1vdmEgICAgICBtNiwgW3B3XzMyXQorJWlmZGVmIG04CisgICAgbW92YSAgICAgIG04LCBbbXhxKyAwXQorICAgIG1vdmEgICAgICBtOSwgW214cSsxNl0KKyAgICBtb3ZhICAgICBtMTAsIFtteHErMzJdCisgICAgbW92YSAgICAgbTExLCBbbXhxKzQ4XQorJWRlZmluZSBDT0VGRjA1ICBtOAorJWRlZmluZSBDT0VGRjE0ICBtOQorJWRlZmluZSBDT0VGRjIgICBtMTAKKyVkZWZpbmUgQ09FRkYzICAgbTExCislZWxzZQorJWRlZmluZSBDT0VGRjA1ICBbbXhxKyAwXQorJWRlZmluZSBDT0VGRjE0ICBbbXhxKzE2XQorJWRlZmluZSBDT0VGRjIgICBbbXhxKzMyXQorJWRlZmluZSBDT0VGRjMgICBbbXhxKzQ4XQorJWVuZGlmCisubmV4dHJvdzoKKyAgICBtb3ZxICAgICAgbTAsIFtzcmNxLTJdCisgICAgbW92cSAgICAgIG01LCBbc3JjcSszXQorICAgIG1vdnEgICAgICBtMSwgW3NyY3EtMV0KKyAgICBtb3ZxICAgICAgbTQsIFtzcmNxKzJdCisgICAgcHVucGNrbGJ3IG0wLCBtNworICAgIHB1bnBja2xidyBtNSwgbTcKKyAgICBwdW5wY2tsYncgbTEsIG03CisgICAgcHVucGNrbGJ3IG00LCBtNworICAgIG1vdnEgICAgICBtMiwgW3NyY3EtMF0KKyAgICBtb3ZxICAgICAgbTMsIFtzcmNxKzFdCisgICAgcGFkZHcgICAgIG0wLCBtNQorICAgIHBhZGR3ICAgICBtMSwgbTQKKyAgICBwdW5wY2tsYncgbTIsIG03CisgICAgcHVucGNrbGJ3IG0zLCBtNworICAgIHBtdWxsdyAgICBtMCwgQ09FRkYwNQorICAgIHBtdWxsdyAgICBtMSwgQ09FRkYxNAorICAgIHBtdWxsdyAgICBtMiwgQ09FRkYyCisgICAgcG11bGx3ICAgIG0zLCBDT0VGRjMKKyAgICBwYWRkdyAgICAgbTAsIG02CisgICAgcGFkZHcgICAgIG0xLCBtMgorICAgIHBhZGR3ICAgICBtMCwgbTMKKyAgICBwYWRkdyAgICAgbTAsIG0xCisgICAgcHNyYXcgICAgIG0wLCA2CisgICAgU1RPUkUgICAgIG0wLCBtMSwgJTEKKworICAgIDsgZ28gdG8gbmV4dCBsaW5lCisgICAgYWRkICAgICBkc3RxLCBkc3RzdHJpZGVxCisgICAgYWRkICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgZGVjICBoZWlnaHRkICAgICAgICAgICAgOyBuZXh0IHJvdworICAgIGpnIC5uZXh0cm93CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggIG1teAorRklMVEVSX1YgIHB1dAorRklMVEVSX0ggIHB1dAorCitJTklUX01NWCAgbW14ZXh0CitGSUxURVJfViAgYXZnCitGSUxURVJfSCAgYXZnCisKK0lOSVRfTU1YICAzZG5vdworRklMVEVSX1YgIGF2ZworRklMVEVSX0ggIGF2ZworJWVuZGlmCisKK0lOSVRfWE1NICBzc2UyCitGSUxURVJfSCAgcHV0CitGSUxURVJfSCAgYXZnCitGSUxURVJfViAgcHV0CitGSUxURVJfViAgYXZnCisKKyVtYWNybyBGSUxURVJfU1NTRTMgMQorY2dsb2JhbCAlMV9ydjQwX3FwZWxfdiwgNiw2K25waWNyZWdzLDgsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCBteSwgcGljcmVnCislaWZkZWYgUElDCisgICAgbGVhICBwaWNyZWdxLCBbc2l4dGFwX2ZpbHRlcl9oYl9tXQorJWVuZGlmCisKKyAgICA7IHJlYWQgNSBsaW5lcworICAgIHN1YiAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIExPQUQgICAgICBteSwgc2l4dGFwX2ZpbHRlcl9oYgorICAgIHN1YiAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIG1vdmggICAgICBtMCwgW3NyY3FdCisgICAgbW92aCAgICAgIG0xLCBbc3JjcStzcmNzdHJpZGVxXQorICAgIG1vdmggICAgICBtMiwgW3NyY3Erc3Jjc3RyaWRlcSoyXQorICAgIGxlYSAgICAgc3JjcSwgW3NyY3Erc3Jjc3RyaWRlcSoyXQorICAgIGFkZCAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIG1vdmEgICAgICBtNSwgW215cV0KKyAgICBtb3ZoICAgICAgbTMsIFtzcmNxXQorICAgIG1vdmggICAgICBtNCwgW3NyY3Erc3Jjc3RyaWRlcV0KKyAgICBsZWEgICAgIHNyY3EsIFtzcmNxKzIqc3Jjc3RyaWRlcV0KKworLm5leHRyb3c6CisgICAgbW92YSAgICAgIG02LCBtMgorICAgIHB1bnBja2xidyBtMCwgbTEKKyAgICBwdW5wY2tsYncgbTYsIG0zCisgICAgcG1hZGR1YnN3IG0wLCBtNQorICAgIHBtYWRkdWJzdyBtNiwgW215cSsxNl0KKyAgICBtb3ZoICAgICAgbTcsIFtzcmNxXSAgICAgIDsgcmVhZCBuZXcgcm93CisgICAgcGFkZHcgICAgIG02LCBtMAorICAgIG1vdmEgICAgICBtMCwgbTEKKyAgICBtb3ZhICAgICAgbTEsIG0yCisgICAgbW92YSAgICAgIG0yLCBtMworICAgIG1vdmEgICAgICBtMywgbTQKKyAgICBtb3ZhICAgICAgbTQsIG03CisgICAgcHVucGNrbGJ3IG03LCBtMworICAgIHBtYWRkdWJzdyBtNywgbTUKKyAgICBwYWRkdyAgICAgbTYsIG03CisgICAgcG11bGhyc3cgIG02LCBbcHdfNTEyXQorICAgIFNUT1JFICAgICBtNiwgbTcsICUxCisKKyAgICA7IGdvIHRvIG5leHQgbGluZQorICAgIGFkZCAgICAgZHN0cSwgZHN0c3RyaWRlcQorICAgIGFkZCAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIGRlYyAgICAgICBoZWlnaHRkICAgICAgICAgICAgICAgICAgICAgICAgICA7IG5leHQgcm93CisgICAgamcgICAgICAgLm5leHRyb3cKKyAgICBSRVBfUkVUCisKK2NnbG9iYWwgJTFfcnY0MF9xcGVsX2gsIDYsNitucGljcmVncyw4LCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgbXgsIHBpY3JlZworJWlmZGVmIFBJQworICAgIGxlYSAgcGljcmVncSwgW3NpeHRhcF9maWx0ZXJfaGJfbV0KKyVlbmRpZgorICAgIG1vdmEgICAgICBtMywgW2ZpbHRlcl9oNl9zaHVmMl0KKyAgICBtb3ZhICAgICAgbTQsIFtmaWx0ZXJfaDZfc2h1ZjNdCisgICAgTE9BRCAgICAgIG14LCBzaXh0YXBfZmlsdGVyX2hiCisgICAgbW92YSAgICAgIG01LCBbbXhxXSA7IHNldCB1cCA2dGFwIGZpbHRlciBpbiBieXRlcworICAgIG1vdmEgICAgICBtNiwgW214cSsxNl0KKyAgICBtb3ZhICAgICAgbTcsIFtmaWx0ZXJfaDZfc2h1ZjFdCisKKy5uZXh0cm93OgorICAgIG1vdnUgICAgICBtMCwgW3NyY3EtMl0KKyAgICBtb3ZhICAgICAgbTEsIG0wCisgICAgbW92YSAgICAgIG0yLCBtMAorICAgIHBzaHVmYiAgICBtMCwgbTcKKyAgICBwc2h1ZmIgICAgbTEsIG0zCisgICAgcHNodWZiICAgIG0yLCBtNAorICAgIHBtYWRkdWJzdyBtMCwgbTUKKyAgICBwbWFkZHVic3cgbTEsIG02CisgICAgcG1hZGR1YnN3IG0yLCBtNQorICAgIHBhZGR3ICAgICBtMCwgbTEKKyAgICBwYWRkdyAgICAgbTAsIG0yCisgICAgcG11bGhyc3cgIG0wLCBbcHdfNTEyXQorICAgIFNUT1JFICAgICBtMCwgbTEsICUxCisKKyAgICA7IGdvIHRvIG5leHQgbGluZQorICAgIGFkZCAgICAgZHN0cSwgZHN0c3RyaWRlcQorICAgIGFkZCAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIGRlYyAgaGVpZ2h0ZCAgICAgICAgICAgIDsgbmV4dCByb3cKKyAgICBqZyAubmV4dHJvdworICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc3NlMworRklMVEVSX1NTU0UzICBwdXQKK0ZJTFRFUl9TU1NFMyAgYXZnCisKKzsgJTE9NWJpdHMgd2VpZ2h0cz8sICUyPWRzdCAlMz1zcmMxICU0PXNyYzMgJTU9c3RyaWRlIGlmIHNzZTIKKyVtYWNybyBSVjQwX1dDT1JFICA0LTUKKyAgICBtb3ZoICAgICAgIG00LCBbJTMgKyByNiArIDBdCisgICAgbW92aCAgICAgICBtNSwgWyU0ICsgcjYgKyAwXQorJWlmICUwID09IDQKKyVkZWZpbmUgT0ZGU0VUIHI2ICsgbW1zaXplIC8gMgorJWVsc2UKKyAgICA7IDh4OCBibG9jayBhbmQgc3NlMiwgc3RyaWRlIHdhcyBwcm92aWRlZAorJWRlZmluZSBPRkZTRVQgcjYKKyAgICBhZGQgICAgICAgIHI2LCByNQorJWVuZGlmCisgICAgbW92aCAgICAgICBtNiwgWyUzICsgT0ZGU0VUXQorICAgIG1vdmggICAgICAgbTcsIFslNCArIE9GRlNFVF0KKworJWlmICUxID09IDAKKyAgICA7IDE0Yml0cyB3ZWlnaHRzCisgICAgcHVucGNrbGJ3ICBtNCwgbTAKKyAgICBwdW5wY2tsYncgIG01LCBtMAorICAgIHB1bnBja2xidyAgbTYsIG0wCisgICAgcHVucGNrbGJ3ICBtNywgbTAKKworICAgIHBzbGx3ICAgICAgbTQsIDcKKyAgICBwc2xsdyAgICAgIG01LCA3CisgICAgcHNsbHcgICAgICBtNiwgNworICAgIHBzbGx3ICAgICAgbTcsIDcKKyAgICBwbXVsaHcgICAgIG00LCBtMworICAgIHBtdWxodyAgICAgbTUsIG0yCisgICAgcG11bGh3ICAgICBtNiwgbTMKKyAgICBwbXVsaHcgICAgIG03LCBtMgorCisgICAgcGFkZHcgICAgICBtNCwgbTUKKyAgICBwYWRkdyAgICAgIG02LCBtNworJWVsc2UKKyAgICA7IDViaXRzIHdlaWdodHMKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHB1bnBja2xidyAgbTQsIG01CisgICAgcHVucGNrbGJ3ICBtNiwgbTcKKworICAgIHBtYWRkdWJzdyAgbTQsIG0zCisgICAgcG1hZGR1YnN3ICBtNiwgbTMKKyVlbHNlCisgICAgcHVucGNrbGJ3ICBtNCwgbTAKKyAgICBwdW5wY2tsYncgIG01LCBtMAorICAgIHB1bnBja2xidyAgbTYsIG0wCisgICAgcHVucGNrbGJ3ICBtNywgbTAKKworICAgIHBtdWxsdyAgICAgbTQsIG0zCisgICAgcG11bGx3ICAgICBtNSwgbTIKKyAgICBwbXVsbHcgICAgIG02LCBtMworICAgIHBtdWxsdyAgICAgbTcsIG0yCisgICAgcGFkZHcgICAgICBtNCwgbTUKKyAgICBwYWRkdyAgICAgIG02LCBtNworJWVuZGlmCisKKyVlbmRpZgorCisgICAgOyBiaWFzIGFuZCBzaGlmdCBkb3duCislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICBwbXVsaHJzdyAgIG00LCBtMQorICAgIHBtdWxocnN3ICAgbTYsIG0xCislZWxzZQorICAgIHBhZGR3ICAgICAgbTQsIG0xCisgICAgcGFkZHcgICAgICBtNiwgbTEKKyAgICBwc3JsdyAgICAgIG00LCA1CisgICAgcHNybHcgICAgICBtNiwgNQorJWVuZGlmCisKKyAgICBwYWNrdXN3YiAgIG00LCBtNgorJWlmICUwID09IDUKKyAgICA7IE9ubHkgY2FsbGVkIGZvciA4eDggYmxvY2tzIGFuZCBzc2UyCisgICAgc3ViICAgICAgICByNiwgcjUKKyAgICBtb3ZoICAgICAgIFslMiArIHI2XSwgbTQKKyAgICBhZGQgICAgICAgIHI2LCByNQorICAgIG1vdmhwcyAgICAgWyUyICsgcjZdLCBtNAorJWVsc2UKKyAgICBtb3ZhICAgICAgIFslMiArIHI2XSwgbTQKKyVlbmRpZgorJWVuZG1hY3JvCisKKworJW1hY3JvIE1BSU5fTE9PUCAgIDIKKyVpZiBtbXNpemUgPT0gOAorICAgIFJWNDBfV0NPUkUgJTIsIHIwLCByMSwgcjIKKyVpZiAlMSA9PSAxNgorICAgIFJWNDBfV0NPUkUgJTIsIHIwICsgOCwgcjEgKyA4LCByMiArIDgKKyVlbmRpZgorCisgICAgOyBQcmVwYXJlIGZvciBuZXh0IGxvb3AKKyAgICBhZGQgICAgICAgIHI2LCByNQorJWVsc2UKKyVpZmlkbiAlMSwgOAorICAgIFJWNDBfV0NPUkUgJTIsIHIwLCByMSwgcjIsIHI1CisgICAgOyBQcmVwYXJlIDIgbmV4dCBsaW5lcworICAgIGFkZCAgICAgICAgcjYsIHI1CislZWxzZQorICAgIFJWNDBfV0NPUkUgJTIsIHIwLCByMSwgcjIKKyAgICA7IFByZXBhcmUgc2luZ2xlIG5leHQgbGluZQorICAgIGFkZCAgICAgICAgcjYsIHI1CislZW5kaWYKKyVlbmRpZgorCislZW5kbWFjcm8KKworOyB2b2lkIGZmX3J2NDBfd2VpZ2h0X2Z1bmNfJTEodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMxLCB1aW50OF90ICpzcmMyLCBpbnQgdzEsIGludCB3MiwgaW50IHN0cmlkZSkKKzsgJTE9c2l6ZSAgJTI9bnVtIG9mIHhtbSByZWdzCis7IFRoZSB3ZWlnaHRzIGFyZSBGUDAuMTQgbm90YXRpb24gb2YgZnJhY3Rpb25zIGRlcGVuZGluZyBvbiBwdHMuCis7IEZvciB0aW1lYmFzZXMgd2l0aG91dCByb3VuZGluZyBlcnJvciAoaS5lLiBQQUwpLCB0aGUgZnJhY3Rpb25zCis7IGNhbiBiZSBzaW1wbGlmaWVkLCBhbmQgc2V2ZXJhbCBvcGVyYXRpb25zIGNhbiBiZSBhdm9pZGVkLgorOyBUaGVyZWZvcmUsIHdlIGNoZWNrIGhlcmUgd2hldGhlciB0aGV5IGFyZSBtdWx0aXBsZXMgb2YgMl45IGZvcgorOyB0aG9zZSBzaW1wbGlmaWNhdGlvbnMgdG8gb2NjdXIuCislbWFjcm8gUlY0MF9XRUlHSFQgIDMKK2NnbG9iYWwgcnY0MF93ZWlnaHRfZnVuY18lMV8lMiwgNiwgNywgOAorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92YSAgICAgICBtMSwgW3B3XzEwMjRdCislZWxzZQorICAgIG1vdmEgICAgICAgbTEsIFtwd18xNl0KKyVlbmRpZgorICAgIHB4b3IgICAgICAgbTAsIG0wCisgICAgOyBTZXQgbG9vcCBjb3VudGVyIGFuZCBpbmNyZW1lbnRzCisgICAgbW92ICAgICAgICByNiwgcjUKKyAgICBzaGwgICAgICAgIHI2LCAlMworICAgIGFkZCAgICAgICAgcjAsIHI2CisgICAgYWRkICAgICAgICByMSwgcjYKKyAgICBhZGQgICAgICAgIHIyLCByNgorICAgIG5lZyAgICAgICAgcjYKKworICAgIG1vdmQgICAgICAgbTIsIHIzZAorICAgIG1vdmQgICAgICAgbTMsIHI0ZAorJWlmaWRuICUxLHJuZAorJWRlZmluZSAgUk5EICAgMAorICAgIFNQTEFUVyAgICAgbTIsIG0yCislZWxzZQorJWRlZmluZSAgUk5EICAgMQorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgcHVucGNrbGJ3ICBtMywgbTIKKyVlbHNlCisgICAgU1BMQVRXICAgICBtMiwgbTIKKyVlbmRpZgorJWVuZGlmCisgICAgU1BMQVRXICAgICBtMywgbTMKKworLmxvb3A6CisgICAgTUFJTl9MT09QICAlMiwgUk5ECisgICAgam56ICAgICAgICAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1JWNDBfV0VJR0hUICAgcm5kLCAgICA4LCAzCitSVjQwX1dFSUdIVCAgIHJuZCwgICAxNiwgNAorUlY0MF9XRUlHSFQgICBub3JuZCwgIDgsIDMKK1JWNDBfV0VJR0hUICAgbm9ybmQsIDE2LCA0CisKK0lOSVRfWE1NIHNzZTIKK1JWNDBfV0VJR0hUICAgcm5kLCAgICA4LCAzCitSVjQwX1dFSUdIVCAgIHJuZCwgICAxNiwgNAorUlY0MF9XRUlHSFQgICBub3JuZCwgIDgsIDMKK1JWNDBfV0VJR0hUICAgbm9ybmQsIDE2LCA0CisKK0lOSVRfWE1NIHNzc2UzCitSVjQwX1dFSUdIVCAgIHJuZCwgICAgOCwgMworUlY0MF9XRUlHSFQgICBybmQsICAgMTYsIDQKK1JWNDBfV0VJR0hUICAgbm9ybmQsICA4LCAzCitSVjQwX1dFSUdIVCAgIG5vcm5kLCAxNiwgNApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3J2NDBkc3BfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3J2NDBkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDBlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvcnY0MGRzcF9pbml0LmMKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBSVjQwIGRlY29kZXIgbW90aW9uIGNvbXBlbnNhdGlvbiBmdW5jdGlvbnMgeDg2LW9wdGltaXNlZAorICogQ29weXJpZ2h0IChjKSAyMDA4IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUlY0MCBkZWNvZGVyIG1vdGlvbiBjb21wZW5zYXRpb24gZnVuY3Rpb25zIHg4Ni1vcHRpbWlzZWQKKyAqIDIsMCBhbmQgMCwyIGhhdmUgaDI2NCBlcXVpdmFsZW50cy4KKyAqIDMsMyBpcyBidWdnZWQgaW4gdGhlIHJ2NDAgZm9ybWF0IGFuZCBtYXBzIHRvIF94eTIgdmVyc2lvbgorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3J2MzRkc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImhwZWxkc3AuaCIKKworI2RlZmluZSBERUZJTkVfRk4ob3AsIHNpemUsIGluc24pIFwKK3N0YXRpYyB2b2lkIG9wIyNfcnY0MF9xcGVsIyNzaXplIyNfbWMzM18jI2luc24odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkgXAoreyBcCisgICAgZmZfIyNvcCMjX3BpeGVscyMjc2l6ZSMjX3h5Ml8jI2luc24oZHN0LCBzcmMsIHN0cmlkZSwgc2l6ZSk7IFwKK30KKworI2lmIEhBVkVfWUFTTQordm9pZCBmZl9wdXRfcnY0MF9jaHJvbWFfbWM4X21teCAgKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfcnY0MF9jaHJvbWFfbWM4X21teGV4dCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7Cit2b2lkIGZmX2F2Z19ydjQwX2Nocm9tYV9tYzhfM2Rub3codWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisKK3ZvaWQgZmZfcHV0X3J2NDBfY2hyb21hX21jNF9tbXggICh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX3J2NDBfY2hyb21hX21jNF9tbXhleHQodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfcnY0MF9jaHJvbWFfbWM0XzNkbm93KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOworCisjZGVmaW5lIERFQ0xBUkVfV0VJR0hUKG9wdCkgXAordm9pZCBmZl9ydjQwX3dlaWdodF9mdW5jX3JuZF8xNl8jI29wdCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYzEsIHVpbnQ4X3QgKnNyYzIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcxLCBpbnQgdzIsIHB0cmRpZmZfdCBzdHJpZGUpOyBcCit2b2lkIGZmX3J2NDBfd2VpZ2h0X2Z1bmNfcm5kXzhfIyNvcHQgKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjMSwgdWludDhfdCAqc3JjMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdzEsIGludCB3MiwgcHRyZGlmZl90IHN0cmlkZSk7IFwKK3ZvaWQgZmZfcnY0MF93ZWlnaHRfZnVuY19ub3JuZF8xNl8jI29wdCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYzEsIHVpbnQ4X3QgKnNyYzIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdzEsIGludCB3MiwgcHRyZGlmZl90IHN0cmlkZSk7IFwKK3ZvaWQgZmZfcnY0MF93ZWlnaHRfZnVuY19ub3JuZF84XyMjb3B0ICh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYzEsIHVpbnQ4X3QgKnNyYzIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdzEsIGludCB3MiwgcHRyZGlmZl90IHN0cmlkZSk7CitERUNMQVJFX1dFSUdIVChtbXhleHQpCitERUNMQVJFX1dFSUdIVChzc2UyKQorREVDTEFSRV9XRUlHSFQoc3NzZTMpCisKKy8qKiBAeyAqLworLyoqCisgKiBEZWZpbmUgb25lIHFwZWwgZnVuY3Rpb24uCisgKiBMT09QU0laRSBtdXN0IGJlIGFscmVhZHkgc2V0IHRvIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHByb2Nlc3NlZCBwZXIKKyAqIGl0ZXJhdGlvbiBpbiB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgY2FsbGVkIGZ1bmN0aW9ucy4KKyAqIENPRkYoeCkgbXVzdCBiZSBhbHJlYWR5IGRlZmluZWQgc28gYXMgdG8gcHJvdmlkZSB0aGUgb2Zmc2V0IGludG8gYW55CisgKiBhcnJheSBvZiBjb2VmZnMgdXNlZCBieSB0aGUgY2FsbGVkIGZ1bmN0aW9uIGZvciB0aGUgcXBlbCBwb3NpdGlvbiB4LgorICovCisjZGVmaW5lIFFQRUxfRlVOQ19ERUNMKE9QLCBTSVpFLCBQSCwgUFYsIE9QVCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUCAjIyBydjQwX3FwZWwgIyNTSVpFICMjX21jICMjUEggIyNQViAjI09QVCh1aW50OF90ICpkc3QsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFBIICYmIFBWKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgdG1wKVtTSVpFICogKFNJWkUgKyA1KV07ICAgICAgICAgICBcCisgICAgICAgIHVpbnQ4X3QgKnRtcHB0ciA9IHRtcCArIFNJWkUgKiAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNyYyAtPSBzdHJpZGUgKiAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyBpICs9IExPT1BTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmZl9wdXRfcnY0MF9xcGVsX2ggIyNPUFQodG1wICsgaSwgU0laRSwgc3JjICsgaSwgc3RyaWRlLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSArIDUsIEhDT0ZGKFBIKSk7ICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyBpICs9IExPT1BTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmZl8gIyNPUCAjI3J2NDBfcXBlbF92ICMjT1BUKGRzdCArIGksIHN0cmlkZSwgdG1wcHRyICsgaSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkUsIFNJWkUsIFZDT0ZGKFBWKSk7ICAgICAgICBcCisgICAgfSBlbHNlIGlmIChQVikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyBpICs9IExPT1BTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmZl8gIyNPUCAjI3J2NDBfcXBlbF92ICMjIE9QVChkc3QgKyBpLCBzdHJpZGUsIHNyYyArIGksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIFNJWkUsIFZDT0ZGKFBWKSk7ICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyBpICs9IExPT1BTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmZl8gIyNPUCAjI3J2NDBfcXBlbF9oICMjIE9QVChkc3QgKyBpLCBzdHJpZGUsIHNyYyArIGksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIFNJWkUsIEhDT0ZGKFBIKSk7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9OworCisvKiogRGVjbGFyZSBmdW5jdGlvbnMgZm9yIHNpemVzIDggYW5kIDE2IGFuZCBnaXZlbiBvcGVyYXRpb25zCisgKiAgYW5kIHFwZWwgcG9zaXRpb24uICovCisjZGVmaW5lIFFQRUxfRlVOQ1NfREVDTChPUCwgUEgsIFBWLCBPUFQpIFwKKyAgICBRUEVMX0ZVTkNfREVDTChPUCwgIDgsIFBILCBQViwgT1BUKSAgXAorICAgIFFQRUxfRlVOQ19ERUNMKE9QLCAxNiwgUEgsIFBWLCBPUFQpCisKKy8qKiBEZWNsYXJlIGFsbCBmdW5jdGlvbnMgZm9yIGFsbCBzaXplcyBhbmQgcXBlbCBwb3NpdGlvbnMgKi8KKyNkZWZpbmUgUVBFTF9NQ19ERUNMKE9QLCBPUFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfICMjT1AgIyNydjQwX3FwZWxfaCAjI09QVCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RTdHJpZGUsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3JjU3RyaWRlLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgbSk7ICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfICMjT1AgIyNydjQwX3FwZWxfdiAjI09QVCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RTdHJpZGUsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3JjU3RyaWRlLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgbSk7ICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMCwgMSwgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMCwgMywgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMSwgMCwgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMSwgMSwgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMSwgMiwgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMSwgMywgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMiwgMSwgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMiwgMiwgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMiwgMywgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMywgMCwgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMywgMSwgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1FQRUxfRlVOQ1NfREVDTChPUCwgMywgMiwgT1BUKQorLyoqIEB9ICovCisKKyNkZWZpbmUgTE9PUFNJWkUgIDgKKyNkZWZpbmUgSENPRkYoeCkgICgzMiAqICgoeCkgLSAxKSkKKyNkZWZpbmUgVkNPRkYoeCkgICgzMiAqICgoeCkgLSAxKSkKK1FQRUxfTUNfREVDTChwdXRfLCBfc3NzZTMpCitRUEVMX01DX0RFQ0woYXZnXywgX3Nzc2UzKQorCisjdW5kZWYgTE9PUFNJWkUKKyN1bmRlZiBIQ09GRgorI3VuZGVmIFZDT0ZGCisjZGVmaW5lIExPT1BTSVpFICA4CisjZGVmaW5lIEhDT0ZGKHgpICAoNjQgKiAoKHgpIC0gMSkpCisjZGVmaW5lIFZDT0ZGKHgpICAoNjQgKiAoKHgpIC0gMSkpCitRUEVMX01DX0RFQ0wocHV0XywgX3NzZTIpCitRUEVMX01DX0RFQ0woYXZnXywgX3NzZTIpCisKKyNpZiBBUkNIX1g4Nl8zMgorI3VuZGVmIExPT1BTSVpFCisjdW5kZWYgSENPRkYKKyN1bmRlZiBWQ09GRgorI2RlZmluZSBMT09QU0laRSAgNAorI2RlZmluZSBIQ09GRih4KSAgKDY0ICogKCh4KSAtIDEpKQorI2RlZmluZSBWQ09GRih4KSAgKDY0ICogKCh4KSAtIDEpKQorCitRUEVMX01DX0RFQ0wocHV0XywgX21teCkKKworI2RlZmluZSBmZl9wdXRfcnY0MF9xcGVsX2hfbW14ZXh0ICBmZl9wdXRfcnY0MF9xcGVsX2hfbW14CisjZGVmaW5lIGZmX3B1dF9ydjQwX3FwZWxfdl9tbXhleHQgIGZmX3B1dF9ydjQwX3FwZWxfdl9tbXgKK1FQRUxfTUNfREVDTChhdmdfLCBfbW14ZXh0KQorCisjZGVmaW5lIGZmX3B1dF9ydjQwX3FwZWxfaF8zZG5vdyAgZmZfcHV0X3J2NDBfcXBlbF9oX21teAorI2RlZmluZSBmZl9wdXRfcnY0MF9xcGVsX3ZfM2Rub3cgIGZmX3B1dF9ydjQwX3FwZWxfdl9tbXgKK1FQRUxfTUNfREVDTChhdmdfLCBfM2Rub3cpCisjZW5kaWYKKworLyoqIEB7ICovCisvKiogU2V0IG9uZSBmdW5jdGlvbiAqLworI2RlZmluZSBRUEVMX0ZVTkNfU0VUKE9QLCBTSVpFLCBQSCwgUFYsIE9QVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGMtPiBPUCAjIyBwaXhlbHNfdGFiWzIgLSBTSVpFIC8gOF1bNCAqIFBWICsgUEhdID0gT1AgIyMgcnY0MF9xcGVsICMjU0laRSAjIyBfbWMgIyNQSCAjI1BWICMjT1BUOworCisvKiogU2V0IGZ1bmN0aW9ucyBwdXQgYW5kIGF2ZyBmb3Igc2l6ZXMgOCBhbmQgMTYgYW5kIGEgZ2l2ZW4gcXBlbCBwb3NpdGlvbiAqLworI2RlZmluZSBRUEVMX0ZVTkNTX1NFVChPUCwgUEgsIFBWLCBPUFQpICAgICAgICAgXAorICAgIFFQRUxfRlVOQ19TRVQoT1AsICA4LCBQSCwgUFYsIE9QVCkgICAgICAgICAgXAorICAgIFFQRUxfRlVOQ19TRVQoT1AsIDE2LCBQSCwgUFYsIE9QVCkKKworLyoqIFNldCBhbGwgZnVuY3Rpb25zIGZvciBhbGwgc2l6ZXMgYW5kIHFwZWwgcG9zaXRpb25zICovCisjZGVmaW5lIFFQRUxfTUNfU0VUKE9QLCBPUFQpICAgXAorUVBFTF9GVU5DU19TRVQgKE9QLCAwLCAxLCBPUFQpIFwKK1FQRUxfRlVOQ1NfU0VUIChPUCwgMCwgMywgT1BUKSBcCitRUEVMX0ZVTkNTX1NFVCAoT1AsIDEsIDAsIE9QVCkgXAorUVBFTF9GVU5DU19TRVQgKE9QLCAxLCAxLCBPUFQpIFwKK1FQRUxfRlVOQ1NfU0VUIChPUCwgMSwgMiwgT1BUKSBcCitRUEVMX0ZVTkNTX1NFVCAoT1AsIDEsIDMsIE9QVCkgXAorUVBFTF9GVU5DU19TRVQgKE9QLCAyLCAxLCBPUFQpIFwKK1FQRUxfRlVOQ1NfU0VUIChPUCwgMiwgMiwgT1BUKSBcCitRUEVMX0ZVTkNTX1NFVCAoT1AsIDIsIDMsIE9QVCkgXAorUVBFTF9GVU5DU19TRVQgKE9QLCAzLCAwLCBPUFQpIFwKK1FQRUxfRlVOQ1NfU0VUIChPUCwgMywgMSwgT1BUKSBcCitRUEVMX0ZVTkNTX1NFVCAoT1AsIDMsIDIsIE9QVCkKKy8qKiBAfSAqLworCitERUZJTkVfRk4ocHV0LCA4LCBzc3NlMykKKworREVGSU5FX0ZOKHB1dCwgMTYsIHNzZTIpCitERUZJTkVfRk4ocHV0LCAxNiwgc3NzZTMpCisKK0RFRklORV9GTihhdmcsIDgsIG1teGV4dCkKK0RFRklORV9GTihhdmcsIDgsIHNzc2UzKQorCitERUZJTkVfRk4oYXZnLCAxNiwgc3NlMikKK0RFRklORV9GTihhdmcsIDE2LCBzc3NlMykKKyNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKworI2lmIEhBVkVfTU1YX0lOTElORQorREVGSU5FX0ZOKHB1dCwgOCwgbW14KQorREVGSU5FX0ZOKGF2ZywgOCwgbW14KQorREVGSU5FX0ZOKHB1dCwgMTYsIG1teCkKK0RFRklORV9GTihhdmcsIDE2LCBtbXgpCisjZW5kaWYKKworYXZfY29sZCB2b2lkIGZmX3J2NDBkc3BfaW5pdF94ODYoUlYzNERTUENvbnRleHQgKmMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworI2lmIEhBVkVfTU1YX0lOTElORQorICAgIGlmIChJTkxJTkVfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMTVdID0gcHV0X3J2NDBfcXBlbDE2X21jMzNfbW14OworICAgICAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsxNV0gPSBwdXRfcnY0MF9xcGVsOF9tYzMzX21teDsKKyAgICAgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMTVdID0gYXZnX3J2NDBfcXBlbDE2X21jMzNfbW14OworICAgICAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVsxNV0gPSBhdmdfcnY0MF9xcGVsOF9tYzMzX21teDsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9NTVhfSU5MSU5FICovCisKKyNpZiBIQVZFX1lBU00KKyAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+cHV0X2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfcHV0X3J2NDBfY2hyb21hX21jOF9tbXg7CisgICAgICAgIGMtPnB1dF9jaHJvbWFfcGl4ZWxzX3RhYlsxXSA9IGZmX3B1dF9ydjQwX2Nocm9tYV9tYzRfbW14OworI2lmIEFSQ0hfWDg2XzMyCisgICAgICAgIFFQRUxfTUNfU0VUKHB1dF8sIF9tbXgpCisjZW5kaWYKKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX0FNRDNETk9XKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YXZnX2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfYXZnX3J2NDBfY2hyb21hX21jOF8zZG5vdzsKKyAgICAgICAgYy0+YXZnX2Nocm9tYV9waXhlbHNfdGFiWzFdID0gZmZfYXZnX3J2NDBfY2hyb21hX21jNF8zZG5vdzsKKyNpZiBBUkNIX1g4Nl8zMgorICAgICAgICBRUEVMX01DX1NFVChhdmdfLCBfM2Rub3cpCisjZW5kaWYKKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzE1XSAgICAgICAgPSBhdmdfcnY0MF9xcGVsOF9tYzMzX21teGV4dDsKKyAgICAgICAgYy0+YXZnX2Nocm9tYV9waXhlbHNfdGFiWzBdICAgICA9IGZmX2F2Z19ydjQwX2Nocm9tYV9tYzhfbW14ZXh0OworICAgICAgICBjLT5hdmdfY2hyb21hX3BpeGVsc190YWJbMV0gICAgID0gZmZfYXZnX3J2NDBfY2hyb21hX21jNF9tbXhleHQ7CisgICAgICAgIGMtPnJ2NDBfd2VpZ2h0X3BpeGVsc190YWJbMF1bMF0gPSBmZl9ydjQwX3dlaWdodF9mdW5jX3JuZF8xNl9tbXhleHQ7CisgICAgICAgIGMtPnJ2NDBfd2VpZ2h0X3BpeGVsc190YWJbMF1bMV0gPSBmZl9ydjQwX3dlaWdodF9mdW5jX3JuZF84X21teGV4dDsKKyAgICAgICAgYy0+cnY0MF93ZWlnaHRfcGl4ZWxzX3RhYlsxXVswXSA9IGZmX3J2NDBfd2VpZ2h0X2Z1bmNfbm9ybmRfMTZfbW14ZXh0OworICAgICAgICBjLT5ydjQwX3dlaWdodF9waXhlbHNfdGFiWzFdWzFdID0gZmZfcnY0MF93ZWlnaHRfZnVuY19ub3JuZF84X21teGV4dDsKKyNpZiBBUkNIX1g4Nl8zMgorICAgICAgICBRUEVMX01DX1NFVChhdmdfLCBfbW14ZXh0KQorI2VuZGlmCisgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMTVdICAgICAgICA9IHB1dF9ydjQwX3FwZWwxNl9tYzMzX3NzZTI7CisgICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzE1XSAgICAgICAgPSBhdmdfcnY0MF9xcGVsMTZfbWMzM19zc2UyOworICAgICAgICBjLT5ydjQwX3dlaWdodF9waXhlbHNfdGFiWzBdWzBdID0gZmZfcnY0MF93ZWlnaHRfZnVuY19ybmRfMTZfc3NlMjsKKyAgICAgICAgYy0+cnY0MF93ZWlnaHRfcGl4ZWxzX3RhYlswXVsxXSA9IGZmX3J2NDBfd2VpZ2h0X2Z1bmNfcm5kXzhfc3NlMjsKKyAgICAgICAgYy0+cnY0MF93ZWlnaHRfcGl4ZWxzX3RhYlsxXVswXSA9IGZmX3J2NDBfd2VpZ2h0X2Z1bmNfbm9ybmRfMTZfc3NlMjsKKyAgICAgICAgYy0+cnY0MF93ZWlnaHRfcGl4ZWxzX3RhYlsxXVsxXSA9IGZmX3J2NDBfd2VpZ2h0X2Z1bmNfbm9ybmRfOF9zc2UyOworICAgICAgICBRUEVMX01DX1NFVChwdXRfLCBfc3NlMikKKyAgICAgICAgUVBFTF9NQ19TRVQoYXZnXywgX3NzZTIpCisgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzE1XSAgICAgICAgPSBwdXRfcnY0MF9xcGVsMTZfbWMzM19zc3NlMzsKKyAgICAgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bMTVdICAgICAgICA9IHB1dF9ydjQwX3FwZWw4X21jMzNfc3NzZTM7CisgICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzE1XSAgICAgICAgPSBhdmdfcnY0MF9xcGVsMTZfbWMzM19zc3NlMzsKKyAgICAgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMTVdICAgICAgICA9IGF2Z19ydjQwX3FwZWw4X21jMzNfc3NzZTM7CisgICAgICAgIGMtPnJ2NDBfd2VpZ2h0X3BpeGVsc190YWJbMF1bMF0gPSBmZl9ydjQwX3dlaWdodF9mdW5jX3JuZF8xNl9zc3NlMzsKKyAgICAgICAgYy0+cnY0MF93ZWlnaHRfcGl4ZWxzX3RhYlswXVsxXSA9IGZmX3J2NDBfd2VpZ2h0X2Z1bmNfcm5kXzhfc3NzZTM7CisgICAgICAgIGMtPnJ2NDBfd2VpZ2h0X3BpeGVsc190YWJbMV1bMF0gPSBmZl9ydjQwX3dlaWdodF9mdW5jX25vcm5kXzE2X3Nzc2UzOworICAgICAgICBjLT5ydjQwX3dlaWdodF9waXhlbHNfdGFiWzFdWzFdID0gZmZfcnY0MF93ZWlnaHRfZnVuY19ub3JuZF84X3Nzc2UzOworICAgICAgICBRUEVMX01DX1NFVChwdXRfLCBfc3NzZTMpCisgICAgICAgIFFQRUxfTUNfU0VUKGF2Z18sIF9zc3NlMykKKyAgICB9CisjZW5kaWYgLyogSEFWRV9ZQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvc2JyZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9zYnJkc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMmU0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvc2JyZHNwLmFzbQpAQCAtMCwwICsxLDQ0NyBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogQUFDIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24gZGVjb2RpbmcgZnVuY3Rpb25zCis7KiBDb3B5cmlnaHQgKEMpIDIwMTIgQ2hyaXN0b3BoZSBHaXNxdWV0IDxjaHJpc3RvcGhlLmdpc3F1ZXRAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCis7IG1hc2sgZXF1aXZhbGVudCBmb3IgbXVsdGlwbHkgYnkgLTEuMCAxLjAKK3BzX21hc2sgICAgICAgICB0aW1lcyAyIGRkIDE8PDMxLCAwCitwc19tYXNrMiAgICAgICAgdGltZXMgMiBkZCAwLCAxPDwzMQorcHNfbm9pc2UwICAgICAgIHRpbWVzIDIgZGQgIDEuMCwgIDAuMCwKK3BzX25vaXNlMiAgICAgICB0aW1lcyAyIGRkIC0xLjAsICAwLjAKK3BzX25vaXNlMTMgICAgICBkZCAgMC4wLCAgMS4wLCAwLjAsIC0xLjAKKyAgICAgICAgICAgICAgICBkZCAgMC4wLCAtMS4wLCAwLjAsICAxLjAKKyAgICAgICAgICAgICAgICBkZCAgMC4wLCAgMS4wLCAwLjAsIC0xLjAKK2NleHRlcm4gICAgICAgICBzYnJfbm9pc2VfdGFibGUKK2NleHRlcm4gICAgICAgICBwc19uZWcKKworU0VDVElPTl9URVhUCisKK0lOSVRfWE1NIHNzZQorY2dsb2JhbCBzYnJfc3VtX3NxdWFyZSwgMiwgMywgNgorICAgIG1vdiAgICAgICAgIHIyLCByMQorICAgIHhvcnBzICAgICAgIG0wLCBtMAorICAgIHhvcnBzICAgICAgIG0xLCBtMQorICAgIHNhciAgICAgICAgIHIyLCAzCisgICAganogICAgICAgICAgLnByZXBhcmUKKy5sb29wOgorICAgIG1vdnUgICAgICAgIG0yLCBbcjAgKyAgMF0KKyAgICBtb3Z1ICAgICAgICBtMywgW3IwICsgMTZdCisgICAgbW92dSAgICAgICAgbTQsIFtyMCArIDMyXQorICAgIG1vdnUgICAgICAgIG01LCBbcjAgKyA0OF0KKyAgICBtdWxwcyAgICAgICBtMiwgbTIKKyAgICBtdWxwcyAgICAgICBtMywgbTMKKyAgICBtdWxwcyAgICAgICBtNCwgbTQKKyAgICBtdWxwcyAgICAgICBtNSwgbTUKKyAgICBhZGRwcyAgICAgICBtMCwgbTIKKyAgICBhZGRwcyAgICAgICBtMSwgbTMKKyAgICBhZGRwcyAgICAgICBtMCwgbTQKKyAgICBhZGRwcyAgICAgICBtMSwgbTUKKyAgICBhZGQgICAgICAgICByMCwgNjQKKyAgICBkZWMgICAgICAgICByMgorICAgIGpueiAgICAgICAgIC5sb29wCisucHJlcGFyZToKKyAgICBhbmQgICAgICAgICByMSwgNworICAgIHNhciAgICAgICAgIHIxLCAxCisgICAganogICAgICAgICAgLmVuZAorOyBsZW4gaXMgYSBtdWx0aXBsZSBvZiAyLCB0aHVzIHRoZXJlIGFyZSBhdCBsZWFzdCA0IGVsZW1lbnRzIHRvIHByb2Nlc3MKKy5lbmRsb29wOgorICAgIG1vdnUgICAgICAgIG0yLCBbcjBdCisgICAgYWRkICAgICAgICAgcjAsIDE2CisgICAgbXVscHMgICAgICAgbTIsIG0yCisgICAgZGVjICAgICAgICAgcjEKKyAgICBhZGRwcyAgICAgICBtMCwgbTIKKyAgICBqbnogICAgICAgICAuZW5kbG9vcAorLmVuZDoKKyAgICBhZGRwcyAgICAgICBtMCwgbTEKKyAgICBtb3ZobHBzICAgICBtMiwgbTAKKyAgICBhZGRwcyAgICAgICBtMCwgbTIKKyAgICBtb3ZzcyAgICAgICBtMSwgbTAKKyAgICBzaHVmcHMgICAgICBtMCwgbTAsIDEKKyAgICBhZGRzcyAgICAgICBtMCwgbTEKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCisgICAgbW92c3MgICAgICAgcjBtLCAgbTAKKyAgICBmbGQgICAgICAgICBkd29yZCByMG0KKyVlbmRpZgorICAgIFJFVAorCislZGVmaW5lIFNURVAgIDQwKjQqMgorY2dsb2JhbCBzYnJfaGZfZ19maWx0LCA1LCA2LCA1CisgICAgbGVhICAgICAgICAgcjEsIFtyMSArIDgqcjRdIDsgb2Zmc2V0IGJ5IGl4aCBlbGVtZW50cyBpbnRvIFhfaGlnaAorICAgIG1vdiAgICAgICAgIHI1LCByMworICAgIGFuZCAgICAgICAgIHIzLCAweEZDCisgICAgbGVhICAgICAgICAgcjIsIFtyMiArIHIzKjRdCisgICAgbGVhICAgICAgICAgcjAsIFtyMCArIHIzKjhdCisgICAgbmVnICAgICAgICAgcjMKKyAgICBqeiAgICAgICAgICAubG9vcDEKKy5sb29wNDoKKyAgICBtb3ZscHMgICAgICBtMCwgW3IyICsgNCpyMyArIDBdCisgICAgbW92bHBzICAgICAgbTEsIFtyMiArIDQqcjMgKyA4XQorICAgIG1vdmxwcyAgICAgIG0yLCBbcjEgKyAwKlNURVBdCisgICAgbW92bHBzICAgICAgbTMsIFtyMSArIDIqU1RFUF0KKyAgICBtb3ZocHMgICAgICBtMiwgW3IxICsgMSpTVEVQXQorICAgIG1vdmhwcyAgICAgIG0zLCBbcjEgKyAzKlNURVBdCisgICAgdW5wY2tscHMgICAgbTAsIG0wCisgICAgdW5wY2tscHMgICAgbTEsIG0xCisgICAgbXVscHMgICAgICAgbTAsIG0yCisgICAgbXVscHMgICAgICAgbTEsIG0zCisgICAgbW92dSAgICAgICAgW3IwICsgOCpyMyArICAwXSwgbTAKKyAgICBtb3Z1ICAgICAgICBbcjAgKyA4KnIzICsgMTZdLCBtMQorICAgIGFkZCAgICAgICAgIHIxLCA0KlNURVAKKyAgICBhZGQgICAgICAgICByMywgNAorICAgIGpueiAgICAgICAgIC5sb29wNAorICAgIGFuZCAgICAgICAgIHI1LCAzIDsgbnVtYmVyIG9mIHNpbmdsZSBlbGVtZW50IGxvb3BzCisgICAganogICAgICAgICAgLmVuZAorLmxvb3AxOiA7IGVsZW1lbnQgMCBhbmQgMSBjYW4gYmUgY29tcHV0ZWQgYXQgdGhlIHNhbWUgdGltZQorICAgIG1vdnNzICAgICAgIG0wLCBbcjJdCisgICAgbW92bHBzICAgICAgbTIsIFtyMV0KKyAgICB1bnBja2xwcyAgICBtMCwgbTAKKyAgICBtdWxwcyAgICAgICBtMiwgbTAKKyAgICBtb3ZscHMgICAgW3IwXSwgbTIKKyAgICBhZGQgICAgICAgICByMCwgOAorICAgIGFkZCAgICAgICAgIHIyLCA0CisgICAgYWRkICAgICAgICAgcjEsIFNURVAKKyAgICBkZWMgICAgICAgICByNQorICAgIGpueiAgICAgICAgIC5sb29wMQorLmVuZDoKKyAgICBSRVQKKworOyB2b2lkIGZmX3Nicl9oZl9nZW5fc3NlKGZsb2F0ICgqWF9oaWdoKVsyXSwgY29uc3QgZmxvYXQgKCpYX2xvdylbMl0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgYWxwaGEwWzJdLCBjb25zdCBmbG9hdCBhbHBoYTFbMl0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYncsIGludCBzdGFydCwgaW50IGVuZCkKKzsKK2NnbG9iYWwgc2JyX2hmX2dlbiwgNCw0LDgsIFhfaGlnaCwgWF9sb3csIGFscGhhMCwgYWxwaGExLCBCVywgUywgRQorICAgIDsgbG9hZCBhbHBoYSBmYWN0b3JzCislZGVmaW5lIGJ3IG0wCislaWYgQVJDSF9YODZfNjQgPT0gMCB8fCBXSU42NAorICAgIG1vdnNzICAgICAgYncsIEJXbQorJWVuZGlmCisgICAgbW92bHBzICAgICBtMiwgW2FscGhhMXFdCisgICAgbW92bHBzICAgICBtMSwgW2FscGhhMHFdCisgICAgc2h1ZnBzICAgICBidywgYncsIDAKKyAgICBtdWxwcyAgICAgIG0yLCBidyAgICAgICAgICAgICA7IChhMVswXSBhMVsxXSkqYncKKyAgICBtdWxwcyAgICAgIG0xLCBidyAgICAgICAgICAgICA7IChhMFswXSBhMFsxXSkqYncgICAgPSAoYTIgYTMpCisgICAgbXVscHMgICAgICBtMiwgYncgICAgICAgICAgICAgOyAoYTFbMF0gYTFbMV0pKmJ3KmJ3ID0gKGEwIGExKQorICAgIG1vdmEgICAgICAgbTMsIG0xCisgICAgbW92YSAgICAgICBtNCwgbTIKKworICAgIDsgU2V0IHBvaW50ZXJzCislaWYgQVJDSF9YODZfNjQgPT0gMCB8fCBXSU42NAorICAgIDsgc3RhcnQgYW5kIGVuZCA2dGggYW5kIDd0aCBhcmdzIG9uIHN0YWNrCisgICAgbW92ICAgICAgICByMmQsIFNtCisgICAgbW92ICAgICAgICByM2QsIEVtCislZGVmaW5lICBzdGFydCByMnEKKyVkZWZpbmUgIGVuZCAgIHIzcQorJWVsc2UKKzsgQlcgZG9lcyBub3QgYWN0dWFsbHkgb2NjdXB5IGEgcmVnaXN0ZXIsIHNvIHNoaWZ0IGJ5IDEKKyVkZWZpbmUgIHN0YXJ0IEJXcQorJWRlZmluZSAgZW5kICAgU3EKKyVlbmRpZgorICAgIHN1YiAgICAgIHN0YXJ0LCBlbmQgICAgICAgICAgOyBuZWcgbnVtIG9mIGxvb3BzCisgICAgbGVhICAgIFhfaGlnaHEsIFtYX2hpZ2hxICsgZW5kKjIqNF0KKyAgICBsZWEgICAgIFhfbG93cSwgW1hfbG93cSAgKyBlbmQqMio0IC0gMioyKjRdCisgICAgc2hsICAgICAgc3RhcnQsIDMgICAgICAgICAgICA7IG9mZnNldCBmcm9tIG51bSBsb29wcworCisgICAgbW92YSAgICAgICAgbTAsIFtYX2xvd3EgKyBzdGFydF0KKyAgICBzaHVmcHMgICAgICBtMywgbTMsIHExMTExCisgICAgc2h1ZnBzICAgICAgbTQsIG00LCBxMTExMQorICAgIHhvcnBzICAgICAgIG0zLCBbcHNfbWFza10KKyAgICBzaHVmcHMgICAgICBtMSwgbTEsIHEwMDAwCisgICAgc2h1ZnBzICAgICAgbTIsIG0yLCBxMDAwMAorICAgIHhvcnBzICAgICAgIG00LCBbcHNfbWFza10KKy5sb29wMjoKKyAgICBtb3Z1ICAgICAgICBtNywgW1hfbG93cSArIHN0YXJ0ICsgOF0gICAgICAgIDsgQmJDYworICAgIG1vdmEgICAgICAgIG02LCBtMAorICAgIG1vdmEgICAgICAgIG01LCBtNworICAgIHNodWZwcyAgICAgIG0wLCBtMCwgcTIzMDEgICAgICAgICAgICAgICAgICAgOyBhQWJCCisgICAgc2h1ZnBzICAgICAgbTcsIG03LCBxMjMwMSAgICAgICAgICAgICAgICAgICA7IGJCY0MKKyAgICBtdWxwcyAgICAgICBtMCwgbTQKKyAgICBtdWxwcyAgICAgICBtNywgbTMKKyAgICBtdWxwcyAgICAgICBtNiwgbTIKKyAgICBtdWxwcyAgICAgICBtNSwgbTEKKyAgICBhZGRwcyAgICAgICBtNywgbTAKKyAgICBtb3ZhICAgICAgICBtMCwgW1hfbG93cSArIHN0YXJ0ICsxNl0gICAgICAgIDsgQ2NEZAorICAgIGFkZHBzICAgICAgIG03LCBtMAorICAgIGFkZHBzICAgICAgIG02LCBtNQorICAgIGFkZHBzICAgICAgIG03LCBtNgorICAgIG1vdmEgIFtYX2hpZ2hxICsgc3RhcnRdLCBtNworICAgIGFkZCAgICAgc3RhcnQsIDE2CisgICAgam56ICAgICAgICAgLmxvb3AyCisgICAgUkVUCisKK2NnbG9iYWwgc2JyX3N1bTY0eDUsIDEsMiw0LHoKKyAgICBsZWEgICAgcjFxLCBbenErIDI1Nl0KKy5sb29wOgorICAgIG1vdmEgICAgbTAsIFt6cSsgICAwXQorICAgIG1vdmEgICAgbTIsIFt6cSsgIDE2XQorICAgIG1vdmEgICAgbTEsIFt6cSsgMjU2XQorICAgIG1vdmEgICAgbTMsIFt6cSsgMjcyXQorICAgIGFkZHBzICAgbTAsIFt6cSsgNTEyXQorICAgIGFkZHBzICAgbTIsIFt6cSsgNTI4XQorICAgIGFkZHBzICAgbTEsIFt6cSsgNzY4XQorICAgIGFkZHBzICAgbTMsIFt6cSsgNzg0XQorICAgIGFkZHBzICAgbTAsIFt6cSsxMDI0XQorICAgIGFkZHBzICAgbTIsIFt6cSsxMDQwXQorICAgIGFkZHBzICAgbTAsIG0xCisgICAgYWRkcHMgICBtMiwgbTMKKyAgICBtb3ZhICBbenFdLCBtMAorICAgIG1vdmEgIFt6cSsxNl0sIG0yCisgICAgYWRkICAgICB6cSwgMzIKKyAgICBjbXAgICAgIHpxLCByMXEKKyAgICBqbmUgIC5sb29wCisgICAgUkVQX1JFVAorCitJTklUX1hNTSBzc2UKK2NnbG9iYWwgc2JyX3FtZl9wb3N0X3NodWZmbGUsIDIsMyw0LFcsegorICAgIGxlYSAgICAgICAgICAgICAgcjJxLCBbenEgKyAoNjQtNCkqNF0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMywgW3BzX25lZ10KKy5sb29wOgorICAgIG1vdmEgICAgICAgICAgICAgIG0xLCBbenFdCisgICAgeG9ycHMgICAgICAgICAgICAgbTAsIG0zLCBbcjJxXQorICAgIHNodWZwcyAgICAgICAgICAgIG0wLCBtMCwgbTAsIHEwMTIzCisgICAgdW5wY2tscHMgICAgICAgICAgbTIsIG0wLCBtMQorICAgIHVucGNraHBzICAgICAgICAgIG0wLCBtMCwgbTEKKyAgICBtb3ZhICAgICAgIFtXcSArICAwXSwgbTIKKyAgICBtb3ZhICAgICAgIFtXcSArIDE2XSwgbTAKKyAgICBhZGQgICAgICAgICAgICAgICBXcSwgMzIKKyAgICBzdWIgICAgICAgICAgICAgIHIycSwgMTYKKyAgICBhZGQgICAgICAgICAgICAgICB6cSwgMTYKKyAgICBjbXAgICAgICAgICAgICAgICB6cSwgcjJxCisgICAgamwgICAgICAgICAgICAgLmxvb3AKKyAgICBSRVBfUkVUCisKK0lOSVRfWE1NIHNzZQorY2dsb2JhbCBzYnJfbmVnX29kZF82NCwgMSwyLDQsegorICAgIGxlYSAgICAgICAgcjFxLCBbenErMjU2XQorLmxvb3A6CisgICAgbW92YSAgICAgICAgbTAsIFt6cSsgMF0KKyAgICBtb3ZhICAgICAgICBtMSwgW3pxKzE2XQorICAgIG1vdmEgICAgICAgIG0yLCBbenErMzJdCisgICAgbW92YSAgICAgICAgbTMsIFt6cSs0OF0KKyAgICB4b3JwcyAgICAgICBtMCwgW3BzX21hc2syXQorICAgIHhvcnBzICAgICAgIG0xLCBbcHNfbWFzazJdCisgICAgeG9ycHMgICAgICAgbTIsIFtwc19tYXNrMl0KKyAgICB4b3JwcyAgICAgICBtMywgW3BzX21hc2syXQorICAgIG1vdmEgICBbenErIDBdLCBtMAorICAgIG1vdmEgICBbenErMTZdLCBtMQorICAgIG1vdmEgICBbenErMzJdLCBtMgorICAgIG1vdmEgICBbenErNDhdLCBtMworICAgIGFkZCAgICAgICAgIHpxLCA2NAorICAgIGNtcCAgICAgICAgIHpxLCByMXEKKyAgICBqbmUgICAgICAubG9vcAorICAgIFJFUF9SRVQKKworOyB2b2lkIGZmX3Nicl9xbWZfZGVpbnRfYmZseV9zc2UyKGZsb2F0ICp2LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEpCislbWFjcm8gU0JSX1FNRl9ERUlOVF9CRkxZICAwCitjZ2xvYmFsIHNicl9xbWZfZGVpbnRfYmZseSwgMyw1LDgsIHYsc3JjMCxzcmMxLHZyZXYsYworICAgIG1vdiAgICAgICAgICAgICAgIGNxLCA2NCo0LTIqbW1zaXplCisgICAgbGVhICAgICAgICAgICAgdnJldnEsIFt2cSArIDY0KjRdCisubG9vcDoKKyAgICBtb3ZhICAgICAgICAgICAgICBtMCwgW3NyYzBxK2NxXQorICAgIG1vdmEgICAgICAgICAgICAgIG0xLCBbc3JjMXFdCisgICAgbW92YSAgICAgICAgICAgICAgbTQsIFtzcmMwcStjcSttbXNpemVdCisgICAgbW92YSAgICAgICAgICAgICAgbTUsIFtzcmMxcSttbXNpemVdCislaWYgY3B1ZmxhZyhzc2UyKQorICAgIHBzaHVmZCAgICAgICAgICAgIG0yLCBtMCwgcTAxMjMKKyAgICBwc2h1ZmQgICAgICAgICAgICBtMywgbTEsIHEwMTIzCisgICAgcHNodWZkICAgICAgICAgICAgbTYsIG00LCBxMDEyMworICAgIHBzaHVmZCAgICAgICAgICAgIG03LCBtNSwgcTAxMjMKKyVlbHNlCisgICAgc2h1ZnBzICAgICAgICAgICAgbTIsIG0wLCBtMCwgcTAxMjMKKyAgICBzaHVmcHMgICAgICAgICAgICBtMywgbTEsIG0xLCBxMDEyMworICAgIHNodWZwcyAgICAgICAgICAgIG02LCBtNCwgbTQsIHEwMTIzCisgICAgc2h1ZnBzICAgICAgICAgICAgbTcsIG01LCBtNSwgcTAxMjMKKyVlbmRpZgorICAgIGFkZHBzICAgICAgICAgICAgIG01LCBtMgorICAgIHN1YnBzICAgICAgICAgICAgIG0wLCBtNworICAgIGFkZHBzICAgICAgICAgICAgIG0xLCBtNgorICAgIHN1YnBzICAgICAgICAgICAgIG00LCBtMworICAgIG1vdmEgICAgICAgICBbdnJldnFdLCBtMQorICAgIG1vdmEgIFt2cmV2cSttbXNpemVdLCBtNQorICAgIG1vdmEgICAgICAgICBbdnErY3FdLCBtMAorICAgIG1vdmEgIFt2cStjcSttbXNpemVdLCBtNAorICAgIGFkZCAgICAgICAgICAgIHNyYzFxLCAyKm1tc2l6ZQorICAgIGFkZCAgICAgICAgICAgIHZyZXZxLCAyKm1tc2l6ZQorICAgIHN1YiAgICAgICAgICAgICAgIGNxLCAyKm1tc2l6ZQorICAgIGpnZSAgICAgICAgICAgIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZQorU0JSX1FNRl9ERUlOVF9CRkxZCisKK0lOSVRfWE1NIHNzZTIKK1NCUl9RTUZfREVJTlRfQkZMWQorCitJTklUX1hNTSBzc2UyCitjZ2xvYmFsIHNicl9xbWZfcHJlX3NodWZmbGUsIDEsNCw2LHoKKyVkZWZpbmUgT0ZGU0VUICAoMzIqNC0yKm1tc2l6ZSkKKyAgICBtb3YgICAgICAgcjNxLCBPRkZTRVQKKyAgICBsZWEgICAgICAgcjFxLCBbenEgKyAoMzIrMSkqNF0KKyAgICBsZWEgICAgICAgcjJxLCBbenEgKyA2NCo0XQorICAgIG1vdmEgICAgICAgbTUsIFtwc19uZWddCisubG9vcDoKKyAgICBtb3Z1ICAgICAgIG0wLCBbcjFxXQorICAgIG1vdnUgICAgICAgbTIsIFtyMXEgKyBtbXNpemVdCisgICAgbW92dSAgICAgICBtMSwgW3pxICsgcjNxICsgNCArIG1tc2l6ZV0KKyAgICBtb3Z1ICAgICAgIG0zLCBbenEgKyByM3EgKyA0XQorCisgICAgcHhvciAgICAgICBtMiwgbTUKKyAgICBweG9yICAgICAgIG0wLCBtNQorICAgIHBzaHVmZCAgICAgbTIsIG0yLCBxMDEyMworICAgIHBzaHVmZCAgICAgbTAsIG0wLCBxMDEyMworICAgIFNCVVRURVJGTFkgZHEsIDIsIDMsIDQKKyAgICBTQlVUVEVSRkxZIGRxLCAwLCAxLCA0CisgICAgbW92YSAgW3IycSArIDIqcjNxICsgMCptbXNpemVdLCBtMgorICAgIG1vdmEgIFtyMnEgKyAyKnIzcSArIDEqbW1zaXplXSwgbTMKKyAgICBtb3ZhICBbcjJxICsgMipyM3EgKyAyKm1tc2l6ZV0sIG0wCisgICAgbW92YSAgW3IycSArIDIqcjNxICsgMyptbXNpemVdLCBtMQorICAgIGFkZCAgICAgICByMXEsIDIqbW1zaXplCisgICAgc3ViICAgICAgIHIzcSwgMiptbXNpemUKKyAgICBqZ2UgICAgICAubG9vcAorICAgIG1vdnEgICAgICAgbTIsIFt6cV0KKyAgICBtb3ZxICAgIFtyMnFdLCBtMgorICAgIFJFUF9SRVQKKworJWlmZGVmIFBJQworJWRlZmluZSBOUkVHUyAxCislaWYgVU5JWDY0CislZGVmaW5lIE5PSVNFX1RBQkxFIHI2cSA7IHI1cSBpcyBtX21heAorJWVsc2UKKyVkZWZpbmUgTk9JU0VfVEFCTEUgcjVxCislZW5kaWYKKyVlbHNlCislZGVmaW5lIE5SRUdTIDAKKyVkZWZpbmUgTk9JU0VfVEFCTEUgc2JyX25vaXNlX3RhYmxlCislZW5kaWYKKworJW1hY3JvIExPQURfTlNUICAxCislaWZkZWYgUElDCisgICAgbGVhICBOT0lTRV9UQUJMRSwgWyUxXQorICAgIG1vdmEgICAgICAgICAgbTAsIFtreHEgKyBOT0lTRV9UQUJMRV0KKyVlbHNlCisgICAgbW92YSAgICAgICAgICBtMCwgW2t4cSArICUxXQorJWVuZGlmCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorOyBzYnJfaGZfYXBwbHlfbm9pc2VfMChmbG9hdCAoKlkpWzJdLCBjb25zdCBmbG9hdCAqc19tLAorOyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqcV9maWx0LCBpbnQgbm9pc2UsCis7ICAgICAgICAgICAgICAgICAgICAgIGludCBreCwgaW50IG1fbWF4KQorY2dsb2JhbCBzYnJfaGZfYXBwbHlfbm9pc2VfMCwgNSw1K05SRUdTK1VOSVg2NCw4LCBZLHNfbSxxX2ZpbHQsbm9pc2Usa3gsbV9tYXgKKyAgICBtb3ZhICAgICAgIG0wLCBbcHNfbm9pc2UwXQorICAgIGptcCBhcHBseV9ub2lzZV9tYWluCisKKzsgc2JyX2hmX2FwcGx5X25vaXNlXzEoZmxvYXQgKCpZKVsyXSwgY29uc3QgZmxvYXQgKnNfbSwKKzsgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdCwgaW50IG5vaXNlLAorOyAgICAgICAgICAgICAgICAgICAgICBpbnQga3gsIGludCBtX21heCkKK2NnbG9iYWwgc2JyX2hmX2FwcGx5X25vaXNlXzEsIDUsNStOUkVHUytVTklYNjQsOCwgWSxzX20scV9maWx0LG5vaXNlLGt4LG1fbWF4CisgICAgYW5kICAgICAgIGt4cSwgMQorICAgIHNobCAgICAgICBreHEsIDQKKyAgICBMT0FEX05TVCAgcHNfbm9pc2UxMworICAgIGptcCBhcHBseV9ub2lzZV9tYWluCisKKzsgc2JyX2hmX2FwcGx5X25vaXNlXzIoZmxvYXQgKCpZKVsyXSwgY29uc3QgZmxvYXQgKnNfbSwKKzsgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdCwgaW50IG5vaXNlLAorOyAgICAgICAgICAgICAgICAgICAgICBpbnQga3gsIGludCBtX21heCkKK2NnbG9iYWwgc2JyX2hmX2FwcGx5X25vaXNlXzIsIDUsNStOUkVHUytVTklYNjQsOCwgWSxzX20scV9maWx0LG5vaXNlLGt4LG1fbWF4CisgICAgbW92YSAgICAgICBtMCwgW3BzX25vaXNlMl0KKyAgICBqbXAgYXBwbHlfbm9pc2VfbWFpbgorCis7IHNicl9oZl9hcHBseV9ub2lzZV8zKGZsb2F0ICgqWSlbMl0sIGNvbnN0IGZsb2F0ICpzX20sCis7ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpxX2ZpbHQsIGludCBub2lzZSwKKzsgICAgICAgICAgICAgICAgICAgICAgaW50IGt4LCBpbnQgbV9tYXgpCitjZ2xvYmFsIHNicl9oZl9hcHBseV9ub2lzZV8zLCA1LDUrTlJFR1MrVU5JWDY0LDgsIFksc19tLHFfZmlsdCxub2lzZSxreCxtX21heAorICAgIGFuZCAgICAgICBreHEsIDEKKyAgICBzaGwgICAgICAga3hxLCA0CisgICAgTE9BRF9OU1QgIHBzX25vaXNlMTMrMTYKKworYXBwbHlfbm9pc2VfbWFpbjoKKyVpZiBBUkNIX1g4Nl82NCA9PSAwIHx8IFdJTjY0CisgICAgbW92ICAgICAgIGt4ZCwgbV9tYXhtCislZGVmaW5lIGNvdW50IGt4cQorJWVsc2UKKyVkZWZpbmUgY291bnQgbV9tYXhxCislZW5kaWYKKyAgICBkZWMgICAgbm9pc2VxCisgICAgc2hsICAgIGNvdW50LCAyCislaWZkZWYgUElDCisgICAgbGVhIE5PSVNFX1RBQkxFLCBbc2JyX25vaXNlX3RhYmxlXQorJWVuZGlmCisgICAgbGVhICAgICAgICBZcSwgW1lxICsgMipjb3VudF0KKyAgICBhZGQgICAgICBzX21xLCBjb3VudAorICAgIGFkZCAgIHFfZmlsdHEsIGNvdW50CisgICAgc2hsICAgIG5vaXNlcSwgMworICAgIHB4b3IgICAgICAgbTUsIG01CisgICAgbmVnICAgIGNvdW50CisubG9vcDoKKyAgICBtb3ZhICAgICAgIG0xLCBbcV9maWx0cSArIGNvdW50XQorICAgIG1vdnUgICAgICAgbTMsIFtub2lzZXEgKyBOT0lTRV9UQUJMRSArIDEqbW1zaXplXQorICAgIG1vdnUgICAgICAgbTQsIFtub2lzZXEgKyBOT0lTRV9UQUJMRSArIDIqbW1zaXplXQorICAgIGFkZCAgICBub2lzZXEsIDIqbW1zaXplCisgICAgYW5kICAgIG5vaXNlcSwgMHgxZmY8PDMKKyAgICBwdW5wY2toZHEgIG0yLCBtMSwgbTEKKyAgICBwdW5wY2tsZHEgIG0xLCBtMQorICAgIG11bHBzICAgICAgbTEsIG0zIDsgbTIgPSBxX2ZpbHRbbV0gKiBmZl9zYnJfbm9pc2VfdGFibGVbbm9pc2VdCisgICAgbXVscHMgICAgICBtMiwgbTQgOyBtMiA9IHFfZmlsdFttXSAqIGZmX3Nicl9ub2lzZV90YWJsZVtub2lzZV0KKyAgICBtb3ZhICAgICAgIG0zLCBbc19tcSArIGNvdW50XQorICAgIDsgVE9ETzogcmVwbGFjZSBieSBhIHZwZXJtZCBpbiBBVlgyCisgICAgcHVucGNraGRxICBtNCwgbTMsIG0zCisgICAgcHVucGNrbGRxICBtMywgbTMKKyAgICBwY21wZXFkICAgIG02LCBtMywgbTUgOyBtNiA9PSAwCisgICAgcGNtcGVxZCAgICBtNywgbTQsIG01IDsgbTcgPT0gMAorICAgIG11bHBzICAgICAgbTMsIG0wIDsgc19tW21dICogcGhpX3NpZ24KKyAgICBtdWxwcyAgICAgIG00LCBtMCA7IHNfbVttXSAqIHBoaV9zaWduCisgICAgcGFuZCAgICAgICBtMSwgbTYKKyAgICBwYW5kICAgICAgIG0yLCBtNworICAgIG1vdnUgICAgICAgbTYsIFtZcSArIDIqY291bnRdCisgICAgbW92dSAgICAgICBtNywgW1lxICsgMipjb3VudCArIG1tc2l6ZV0KKyAgICBhZGRwcyAgICAgIG0zLCBtMQorICAgIGFkZHBzICAgICAgbTQsIG0yCisgICAgYWRkcHMgICAgICBtNiwgbTMKKyAgICBhZGRwcyAgICAgIG03LCBtNAorICAgIG1vdnUgICAgW1lxICsgMipjb3VudF0sIG02CisgICAgbW92dSAgICBbWXEgKyAyKmNvdW50ICsgbW1zaXplXSwgbTcKKyAgICBhZGQgICAgY291bnQsIG1tc2l6ZQorICAgIGpsICAgICAgLmxvb3AKKyAgICBSRVQKKworSU5JVF9YTU0gc3NlCitjZ2xvYmFsIHNicl9xbWZfZGVpbnRfbmVnLCAyLDQsNCx2LHNyYyx2cmV2LGMKKyVkZWZpbmUgQ09VTlQgIDMyKjQKKyVkZWZpbmUgT0ZGU0VUIDMyKjQKKyAgICBtb3YgICAgICAgIGNxLCAtQ09VTlQKKyAgICBsZWEgICAgIHZyZXZxLCBbdnEgKyBPRkZTRVQgKyBDT1VOVF0KKyAgICBhZGQgICAgICAgIHZxLCBPRkZTRVQtbW1zaXplCisgICAgYWRkICAgICAgc3JjcSwgMipDT1VOVAorICAgIG1vdmEgICAgICAgbTMsIFtwc19uZWddCisubG9vcDoKKyAgICBtb3ZhICAgICAgIG0wLCBbc3JjcSArIDIqY3EgKyAwKm1tc2l6ZV0KKyAgICBtb3ZhICAgICAgIG0xLCBbc3JjcSArIDIqY3EgKyAxKm1tc2l6ZV0KKyAgICBzaHVmcHMgICAgIG0yLCBtMCwgbTEsIHEyMDIwCisgICAgc2h1ZnBzICAgICBtMSwgbTAsIHExMzEzCisgICAgeG9ycHMgICAgICBtMiwgbTMKKyAgICBtb3ZhICAgICBbdnFdLCBtMQorICAgIG1vdmEgIFt2cmV2cSArIGNxXSwgbTIKKyAgICBzdWIgICAgICAgIHZxLCBtbXNpemUKKyAgICBhZGQgICAgICAgIGNxLCBtbXNpemUKKyAgICBqbCAgICAgIC5sb29wCisgICAgUkVQX1JFVApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3NicmRzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvc2JyZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmFjYTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3NicmRzcF9pbml0LmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIEFBQyBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIGRlY29kaW5nIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDEyIENocmlzdG9waGUgR2lzcXVldCA8Y2hyaXN0b3BoZS5naXNxdWV0QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9zYnJkc3AuaCIKKworZmxvYXQgZmZfc2JyX3N1bV9zcXVhcmVfc3NlKGZsb2F0ICgqeClbMl0sIGludCBuKTsKK3ZvaWQgZmZfc2JyX3N1bTY0eDVfc3NlKGZsb2F0ICp6KTsKK3ZvaWQgZmZfc2JyX2hmX2dfZmlsdF9zc2UoZmxvYXQgKCpZKVsyXSwgY29uc3QgZmxvYXQgKCpYX2hpZ2gpWzQwXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmdfZmlsdCwgaW50IG1fbWF4LCBpbnRwdHJfdCBpeGgpOwordm9pZCBmZl9zYnJfaGZfZ2VuX3NzZShmbG9hdCAoKlhfaGlnaClbMl0sIGNvbnN0IGZsb2F0ICgqWF9sb3cpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBhbHBoYTBbMl0sIGNvbnN0IGZsb2F0IGFscGhhMVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYncsIGludCBzdGFydCwgaW50IGVuZCk7Cit2b2lkIGZmX3Nicl9uZWdfb2RkXzY0X3NzZShmbG9hdCAqeik7Cit2b2lkIGZmX3Nicl9xbWZfcG9zdF9zaHVmZmxlX3NzZShmbG9hdCBXWzMyXVsyXSwgY29uc3QgZmxvYXQgKnopOwordm9pZCBmZl9zYnJfcW1mX2RlaW50X2JmbHlfc3NlKGZsb2F0ICp2LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEpOwordm9pZCBmZl9zYnJfcW1mX2RlaW50X2JmbHlfc3NlMihmbG9hdCAqdiwgY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxKTsKK3ZvaWQgZmZfc2JyX3FtZl9wcmVfc2h1ZmZsZV9zc2UyKGZsb2F0ICp6KTsKKwordm9pZCBmZl9zYnJfaGZfYXBwbHlfbm9pc2VfMF9zc2UyKGZsb2F0ICgqWSlbMl0sIGNvbnN0IGZsb2F0ICpzX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdCwgaW50IG5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBreCwgaW50IG1fbWF4KTsKK3ZvaWQgZmZfc2JyX2hmX2FwcGx5X25vaXNlXzFfc3NlMihmbG9hdCAoKlkpWzJdLCBjb25zdCBmbG9hdCAqc19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpxX2ZpbHQsIGludCBub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga3gsIGludCBtX21heCk7Cit2b2lkIGZmX3Nicl9oZl9hcHBseV9ub2lzZV8yX3NzZTIoZmxvYXQgKCpZKVsyXSwgY29uc3QgZmxvYXQgKnNfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqcV9maWx0LCBpbnQgbm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGt4LCBpbnQgbV9tYXgpOwordm9pZCBmZl9zYnJfaGZfYXBwbHlfbm9pc2VfM19zc2UyKGZsb2F0ICgqWSlbMl0sIGNvbnN0IGZsb2F0ICpzX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdCwgaW50IG5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBreCwgaW50IG1fbWF4KTsKKwordm9pZCBmZl9zYnJfcW1mX2RlaW50X25lZ19zc2UoZmxvYXQgKnYsIGNvbnN0IGZsb2F0ICpzcmMpOworCithdl9jb2xkIHZvaWQgZmZfc2JyZHNwX2luaXRfeDg2KFNCUkRTUENvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9TU0UoY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5uZWdfb2RkXzY0ID0gZmZfc2JyX25lZ19vZGRfNjRfc3NlOworICAgICAgICBzLT5zdW1fc3F1YXJlID0gZmZfc2JyX3N1bV9zcXVhcmVfc3NlOworICAgICAgICBzLT5zdW02NHg1ICAgID0gZmZfc2JyX3N1bTY0eDVfc3NlOworICAgICAgICBzLT5oZl9nX2ZpbHQgID0gZmZfc2JyX2hmX2dfZmlsdF9zc2U7CisgICAgICAgIHMtPmhmX2dlbiAgICAgPSBmZl9zYnJfaGZfZ2VuX3NzZTsKKyAgICAgICAgcy0+cW1mX3Bvc3Rfc2h1ZmZsZSA9IGZmX3Nicl9xbWZfcG9zdF9zaHVmZmxlX3NzZTsKKyAgICAgICAgcy0+cW1mX2RlaW50X2JmbHkgICA9IGZmX3Nicl9xbWZfZGVpbnRfYmZseV9zc2U7CisgICAgICAgIHMtPnFtZl9kZWludF9uZWcgICAgPSBmZl9zYnJfcW1mX2RlaW50X25lZ19zc2U7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5xbWZfZGVpbnRfYmZseSAgID0gZmZfc2JyX3FtZl9kZWludF9iZmx5X3NzZTI7CisgICAgICAgIHMtPnFtZl9wcmVfc2h1ZmZsZSAgPSBmZl9zYnJfcW1mX3ByZV9zaHVmZmxlX3NzZTI7CisgICAgICAgIHMtPmhmX2FwcGx5X25vaXNlWzBdID0gZmZfc2JyX2hmX2FwcGx5X25vaXNlXzBfc3NlMjsKKyAgICAgICAgcy0+aGZfYXBwbHlfbm9pc2VbMV0gPSBmZl9zYnJfaGZfYXBwbHlfbm9pc2VfMV9zc2UyOworICAgICAgICBzLT5oZl9hcHBseV9ub2lzZVsyXSA9IGZmX3Nicl9oZl9hcHBseV9ub2lzZV8yX3NzZTI7CisgICAgICAgIHMtPmhmX2FwcGx5X25vaXNlWzNdID0gZmZfc2JyX2hmX2FwcGx5X25vaXNlXzNfc3NlMjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvc2ltcGxlX2lkY3QuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9zaW1wbGVfaWRjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNDYyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvc2ltcGxlX2lkY3QuYwpAQCAtMCwwICsxLDExNzMgQEAKKy8qCisgKiBTaW1wbGUgSURDVCBNTVgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9pZGN0ZHNwLmgiCisKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAic2ltcGxlX2lkY3QuaCIKKworI2lmIEhBVkVfSU5MSU5FX0FTTQorCisvKgorMjMxNzAuNDc1MDA2CisyMjcyNS4yNjA4MjYKKzIxNDA2LjcyNzYxNworMTkyNjUuNTQ1ODcwCisxNjM4NC4wMDAwMDAKKzEyODcyLjgyNjE5OAorODg2Ni45NTY5MDUKKzQ1MjAuMzM1NDMwCisqLworI2RlZmluZSBDMCAyMzE3MCAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBDMSAyMjcyNSAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBDMiAyMTQwNyAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBDMyAxOTI2NiAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBDNCAxNjM4MyAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSAtIDAuNQorI2RlZmluZSBDNSAxMjg3MyAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBDNiA4ODY3ICAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBDNyA0NTIwICAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorCisjZGVmaW5lIFJPV19TSElGVCAxMQorI2RlZmluZSBDT0xfU0hJRlQgMjAgLy8gNgorCitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgd20xMDEwKT0gMHhGRkZGMDAwMEZGRkYwMDAwVUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIGQ0MDAwMCk9IDB4MDAwMDAwMDAwMDA0MDAwMFVMTDsKKworREVDTEFSRV9BTElHTkVEKDgsIHN0YXRpYyBjb25zdCBpbnQxNl90LCBjb2VmZnMpW109IHsKKyAgICAgICAgMTw8KFJPV19TSElGVC0xKSwgMCwgMTw8KFJPV19TSElGVC0xKSwgMCwKKy8vICAgICAgICAxPDwoQ09MX1NISUZULTEpLCAwLCAxPDwoQ09MX1NISUZULTEpLCAwLAorLy8gICAgICAgIDAsIDE8PChDT0xfU0hJRlQtMS0xNiksIDAsIDE8PChDT0xfU0hJRlQtMS0xNiksCisgICAgICAgIDE8PChST1dfU0hJRlQtMSksIDEsIDE8PChST1dfU0hJRlQtMSksIDAsCisgICAgICAgIC8vIHRoZSAxID0gKCgxPDwoQ09MX1NISUZULTEpKS9DNCk8PFJPV19TSElGVCA6KQorLy8gICAgICAgIDAsIDAsIDAsIDAsCisvLyAgICAgICAgMCwgMCwgMCwgMCwKKworIEM0LCAgQzQsICBDNCwgIEM0LAorIEM0LCAtQzQsICBDNCwgLUM0LAorCisgQzIsICBDNiwgIEMyLCAgQzYsCisgQzYsIC1DMiwgIEM2LCAtQzIsCisKKyBDMSwgIEMzLCAgQzEsICBDMywKKyBDNSwgIEM3LCAgQzUsICBDNywKKworIEMzLCAtQzcsICBDMywgLUM3LAorLUMxLCAtQzUsIC1DMSwgLUM1LAorCisgQzUsIC1DMSwgIEM1LCAtQzEsCisgQzcsICBDMywgIEM3LCAgQzMsCisKKyBDNywgLUM1LCAgQzcsIC1DNSwKKyBDMywgLUMxLCAgQzMsIC1DMQorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGlkY3QoaW50MTZfdCAqYmxvY2spCit7CisgICAgICAgIExPQ0FMX0FMSUdORURfOChpbnQ2NF90LCBhbGlnbl90bXAsIFsxNl0pOworICAgICAgICBpbnQxNl90ICogY29uc3QgdGVtcD0gKGludDE2X3QqKWFsaWduX3RtcDsKKworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorI2lmIDAgLy9BbHRlcm5hdGl2ZSwgc2ltcGxlciB2YXJpYW50CisKKyNkZWZpbmUgUk9XX0lEQ1Qoc3JjMCwgc3JjNCwgc3JjMSwgc3JjNSwgZHN0LCByb3VuZGVyLCBzaGlmdCkgXAorICAgICAgICAibW92cSAiICNzcmMwICIsICUlbW0wICAgICAgICAgIFxuXHQiIC8qIFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAgKi9cCisgICAgICAgICJtb3ZxICIgI3NyYzQgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjYgICAgIFIyICAgICAgcjYgICAgICByMiAqL1wKKyAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBSMyAgICAgUjEgICAgICByMyAgICAgIHIxICovXAorICAgICAgICAibW92cSAiICNzcmM1ICIsICUlbW0zICAgICAgICAgIFxuXHQiIC8qIFI3ICAgICBSNSAgICAgIHI3ICAgICAgcjUgKi9cCisgICAgICAgICJtb3ZxIDE2KCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQzQgICAgIEM0ICAgICAgQzQgICAgICBDNCAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTAsICUlbW00ICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDI0KCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogLUM0ICAgIEM0ICAgICAgLUM0ICAgICBDNCAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTUsICUlbW0wICAgICAgICAgICBcblx0IiAvKiAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwICovXAorICAgICAgICAibW92cSAzMiglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIEM2ICAgICBDMiAgICAgIEM2ICAgICAgQzIgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0xLCAlJW1tNSAgICAgICAgICAgXG5cdCIgLyogQzZSNitDMlIyICAgICAgQzZyNitDMnIyICovXAorICAgICAgICAibW92cSA0MCglMiksICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIC1DMiAgICBDNiAgICAgIC1DMiAgICAgQzYgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW02LCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogLUMyUjYrQzZSMiAgICAgLUMycjYrQzZyMiAqL1wKKyAgICAgICAgIm1vdnEgNDgoJTIpLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBDMyAgICAgQzEgICAgICBDMyAgICAgIEMxICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMiwgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjMrQzFSMSAgICAgIEMzcjMrQzFyMSAqL1wKKyAgICAgICAgI3JvdW5kZXIgIiwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW02ICAgICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQTAgICAgICAgICAgICAgYTAgKi9cCisgICAgICAgICJwc3ViZCAlJW1tNSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCisgICAgICAgICJtb3ZxIDU2KCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzcgICAgIEM1ICAgICAgQzcgICAgICBDNSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDN1I3K0M1UjUgICAgICBDN3I3K0M1cjUgKi9cCisgICAgICAgICNyb3VuZGVyICIsICUlbW0wICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWRkZCAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQTEgICAgICAgICAgICAgYTEgKi9cCisgICAgICAgICJwYWRkZCAlJW1tMCwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAicHN1YmQgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAorICAgICAgICAicG1hZGR3ZCA2NCglMiksICUlbW0yICAgICAgICAgIFxuXHQiIC8qIC1DN1IzK0MzUjEgICAgIC1DN3IzK0MzcjEgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQjAgICAgICAgICAgICAgYjAgKi9cCisgICAgICAgICJtb3ZxIDcyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogLUM1ICAgIC1DMSAgICAgLUM1ICAgICAtQzEgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0zLCAlJW1tNSAgICAgICAgICAgXG5cdCIgLyogLUM1UjctQzFSNSAgICAgLUM1cjctQzFyNSAqL1wKKyAgICAgICAgInBhZGRkICUlbW00LCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgICAgICAgICBhMCtiMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW00LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAyQTAgICAgICAgICAgICAyYTAgKi9cCisgICAgICAgICJwc3ViZCAlJW1tNywgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQTAtQjAgICAgICAgICAgYTAtYjAgKi9cCisgICAgICAgICJwYWRkZCAlJW1tMiwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQjEgICAgICAgICAgICAgYjEgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTcgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIgLyogQTEgICAgICAgICAgICAgYTEgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQTErQjEgICAgICAgICAgYTErYjEgKi9cCisgICAgICAgICJwc3ViZCAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLyogQTEtQjEgICAgICAgICAgYTEtYjEgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTEgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTIgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMSwgJSVtbTcgICAgICAgICAgXG5cdCIgLyogQTErQjEgIGExK2IxICAgQTArQjAgICBhMCtiMCAqL1wKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgYTAtYjAgICBBMS1CMSAgIGExLWIxICovXAorICAgICAgICAibW92cSAlJW1tNywgIiAjZHN0ICIgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0xICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCisgICAgICAgICJtb3ZxIDgwKCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogLUMxICAgIEM1ICAgICAgLUMxICAgICBDNSAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTIsIDI0KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW00ICAgICAgICAgICBcblx0IiAvKiAtQzFSMytDNVIxICAgICAtQzFyMytDNXIxICovXAorICAgICAgICAibW92cSA4OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDNyAgICAgIEMzICAgICAgQzcgKi9cCisgICAgICAgICJwbWFkZHdkIDk2KCUyKSwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogLUM1UjMrQzdSMSAgICAgLUM1cjMrQzdyMSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW03ICAgICAgICAgICBcblx0IiAvKiBDM1I3K0M3UjUgICAgICBDM3I3K0M3cjUgKi9cCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCisgICAgICAgICJwbWFkZHdkIDEwNCglMiksICUlbW0zICAgICAgICAgXG5cdCIgLyogLUMxUjcrQzNSNSAgICAgLUMxcjcrQzNyNSAqL1wKKyAgICAgICAgInBhZGRkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBCMiAgICAgICAgICAgICBiMiAqL1wKKyAgICAgICAgInBhZGRkICUlbW00LCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMitCMiAgICAgICAgICBhMitiMiAqL1wKKyAgICAgICAgInBzdWJkICUlbW00LCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBhMi1CMiAgICAgICAgICBhMi1iMiAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTYsICUlbW00ICAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKKyAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMyAgICAgICAgICAgICBcblx0IiAvKiBCMyAgICAgICAgICAgICBiMyAqL1wKKyAgICAgICAgInBhZGRkICUlbW0zLCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMytCMyAgICAgICAgICBhMytiMyAqL1wKKyAgICAgICAgInBzdWJkICUlbW0zLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBhMy1CMyAgICAgICAgICBhMy1iMyAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNiAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBBMytCMyAgYTMrYjMgICBBMitCMiAgIGEyK2IyICovXAorICAgICAgICAibW92cSAlJW1tMiwgOCsiICNkc3QgIiAgICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTAsICUlbW00ICAgICAgICAgIFxuXHQiIC8qIEEyLUIyICBhMi1iMiAgIEEzLUIzICAgYTMtYjMgKi9cCisgICAgICAgICJtb3ZxICUlbW00LCAxNisiICNkc3QgIiAgICAgICAgXG5cdCJcCisKKyNkZWZpbmUgQ09MX0lEQ1Qoc3JjMCwgc3JjNCwgc3JjMSwgc3JjNSwgZHN0LCBzaGlmdCkgXAorICAgICAgICAibW92cSAiICNzcmMwICIsICUlbW0wICAgICAgICAgIFxuXHQiIC8qIFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAgKi9cCisgICAgICAgICJtb3ZxICIgI3NyYzQgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjYgICAgIFIyICAgICAgcjYgICAgICByMiAqL1wKKyAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBSMyAgICAgUjEgICAgICByMyAgICAgIHIxICovXAorICAgICAgICAibW92cSAiICNzcmM1ICIsICUlbW0zICAgICAgICAgIFxuXHQiIC8qIFI3ICAgICBSNSAgICAgIHI3ICAgICAgcjUgKi9cCisgICAgICAgICJtb3ZxIDE2KCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQzQgICAgIEM0ICAgICAgQzQgICAgICBDNCAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTAsICUlbW00ICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDI0KCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogLUM0ICAgIEM0ICAgICAgLUM0ICAgICBDNCAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTUsICUlbW0wICAgICAgICAgICBcblx0IiAvKiAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwICovXAorICAgICAgICAibW92cSAzMiglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIEM2ICAgICBDMiAgICAgIEM2ICAgICAgQzIgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0xLCAlJW1tNSAgICAgICAgICAgXG5cdCIgLyogQzZSNitDMlIyICAgICAgQzZyNitDMnIyICovXAorICAgICAgICAibW92cSA0MCglMiksICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIC1DMiAgICBDNiAgICAgIC1DMiAgICAgQzYgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW02LCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogLUMyUjYrQzZSMiAgICAgLUMycjYrQzZyMiAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW02ICAgICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDQ4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEMxICAgICAgQzMgICAgICBDMSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW03ICAgICAgICAgICBcblx0IiAvKiBDM1IzK0MxUjEgICAgICBDM3IzK0MxcjEgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQTAgICAgICAgICAgICAgYTAgKi9cCisgICAgICAgICJwc3ViZCAlJW1tNSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBzdWJkICUlbW0xLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKKyAgICAgICAgIm1vdnEgNTYoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTEgICAgICAgICAgIFxuXHQiIC8qIEM3UjcrQzVSNSAgICAgIEM3cjcrQzVyNSAqL1wKKyAgICAgICAgInBtYWRkd2QgNjQoJTIpLCAlJW1tMiAgICAgICAgICBcblx0IiAvKiAtQzdSMytDM1IxICAgICAtQzdyMytDM3IxICovXAorICAgICAgICAicGFkZGQgJSVtbTEsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEIwICAgICAgICAgICAgIGIwICovXAorICAgICAgICAibW92cSA3MiglMiksICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIC1DNSAgICAtQzEgICAgIC1DNSAgICAgLUMxICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTEgICAgICAgICAgIFxuXHQiIC8qIC1DNVI3LUMxUjUgICAgIC1DNXI3LUMxcjUgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQTArQjAgICAgICAgICAgYTArYjAgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogMkEwICAgICAgICAgICAgMmEwICovXAorICAgICAgICAicHN1YmQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICAgICAgICAgIGEwLWIwICovXAorICAgICAgICAicGFkZGQgJSVtbTIsICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIEIxICAgICAgICAgICAgIGIxICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW03ICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8qIEExICAgICAgICAgICAgIGExICovXAorICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIEExK0IxICAgICAgICAgIGExK2IxICovXAorICAgICAgICAicHN1YmQgJSVtbTEsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEExLUIxICAgICAgICAgIGExLWIxICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTcsICUlbW03ICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICBhMCtiMCAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTcsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0wLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgKi9cCisgICAgICAgICJtb3ZkICUlbW0wLCAxNisiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMiwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogQTEtQjEgIGExLWIxICovXAorICAgICAgICAibW92ZCAlJW1tMiwgOTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW00ICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTQsIDExMisiICNkc3QgIiAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBSMyAgICAgUjEgICAgICByMyAgICAgIHIxICovXAorICAgICAgICAibW92cSA4MCglMiksICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIC1DMSAgICBDNSAgICAgIC1DMSAgICAgQzUgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIgLyogLUMxUjMrQzVSMSAgICAgLUMxcjMrQzVyMSAqL1wKKyAgICAgICAgIm1vdnEgODgoJTIpLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBDMyAgICAgQzcgICAgICBDMyAgICAgIEM3ICovXAorICAgICAgICAicG1hZGR3ZCA5NiglMiksICUlbW0wICAgICAgICAgIFxuXHQiIC8qIC1DNVIzK0M3UjEgICAgIC1DNXIzK0M3cjEgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0zLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSNytDN1I1ICAgICAgQzNyNytDN3I1ICovXAorICAgICAgICAibW92cSAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAorICAgICAgICAicG1hZGR3ZCAxMDQoJTIpLCAlJW1tMyAgICAgICAgIFxuXHQiIC8qIC1DMVI3K0MzUjUgICAgIC1DMXI3K0MzcjUgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNywgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQjIgICAgICAgICAgICAgYjIgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLyogQTIrQjIgICAgICAgICAgYTIrYjIgKi9cCisgICAgICAgICJwc3ViZCAlJW1tNCwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogYTItQjIgICAgICAgICAgYTItYjIgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTIgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTUgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCisgICAgICAgICJwYWRkZCAlJW1tMCwgJSVtbTMgICAgICAgICAgICAgXG5cdCIgLyogQjMgICAgICAgICAgICAgYjMgKi9cCisgICAgICAgICJwYWRkZCAlJW1tMywgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMrQjMgICAgICAgICAgYTMrYjMgKi9cCisgICAgICAgICJwc3ViZCAlJW1tMywgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogYTMtQjMgICAgICAgICAgYTMtYjMgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTYgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMiwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogQTIrQjIgIGEyK2IyICovXAorICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTIsIDMyKyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMy1CMyAgYTMtYjMgKi9cCisgICAgICAgICJwYWNrc3NkdyAlJW1tNSwgJSVtbTUgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICovXAorICAgICAgICAibW92ZCAlJW1tNiwgNDgrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ZCAlJW1tNCwgNjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ZCAlJW1tNSwgODArIiAjZHN0ICIgICAgICAgIFxuXHQiXAorCisKKyNkZWZpbmUgRENfQ09ORF9ST1dfSURDVChzcmMwLCBzcmM0LCBzcmMxLCBzcmM1LCBkc3QsIHJvdW5kZXIsIHNoaWZ0KSBcCisgICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKKyAgICAgICAgIm1vdnEgIiAjc3JjNCAiLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBSNiAgICAgUjIgICAgICByNiAgICAgIHIyICovXAorICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCisgICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKKyAgICAgICAgIm1vdnEgIk1BTkdMRSh3bTEwMTApIiwgJSVtbTQgICBcblx0IlwKKyAgICAgICAgInBhbmQgJSVtbTAsICUlbW00ICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBvciAlJW1tMSwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBvciAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBvciAlJW1tMywgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCUlbW00ICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgJSVtbTQsICUlZWF4ICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm9ybCAlJWVheCwgJSVlYXggICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImp6IDFmICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCisgICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAorICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAorICAgICAgICAjcm91bmRlciAiLCAlJW1tNCAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKKyAgICAgICAgIm1vdnEgNTYoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTUgICAgICAgICAgIFxuXHQiIC8qIEM3UjcrQzVSNSAgICAgIEM3cjcrQzVyNSAqL1wKKyAgICAgICAgI3JvdW5kZXIgIiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMCAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCisgICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKKyAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKKyAgICAgICAgInBzdWJkICUlbW01LCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMSAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0xLCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgICBBMCtCMCAgIGEwK2IwICovXAorICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAgIEExLUIxICAgYTEtYjEgKi9cCisgICAgICAgICJtb3ZxICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKKyAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAorICAgICAgICAibW92cSAlJW1tMiwgMjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicG1hZGR3ZCAlJW1tMSwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCisgICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKKyAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKKyAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAorICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAorICAgICAgICAicHN1YmQgJSVtbTQsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAorICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAorICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAorICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAgIEEyK0IyICAgYTIrYjIgKi9cCisgICAgICAgICJtb3ZxICUlbW0yLCA4KyIgI2RzdCAiICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICAgQTMtQjMgICBhMy1iMyAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTQsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgImptcCAyZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzbGxkICQxNiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIiNwYWRkZCAiTUFOR0xFKGQ0MDAwMCkiLCAlJW1tMCBcblx0IlwKKyAgICAgICAgInBzcmFkICQxMywgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0wLCAlJW1tMCAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsIDgrIiAjZHN0ICIgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsIDI0KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisKKy8vSURDVCggICAgICBzcmMwLCAgIHNyYzQsICAgc3JjMSwgICBzcmM1LCAgICBkc3QsICAgIHJvdW5kZXIsIHNoaWZ0KQorUk9XX0lEQ1QoICAgICglMCksICA4KCUwKSwgMTYoJTApLCAyNCglMCksICAwKCUxKSxwYWRkZCA4KCUyKSwgMTEpCisvKlJPV19JRENUKCAgMzIoJTApLCA0MCglMCksIDQ4KCUwKSwgNTYoJTApLCAzMiglMSksIHBhZGRkICglMiksIDExKQorUk9XX0lEQ1QoICA2NCglMCksIDcyKCUwKSwgODAoJTApLCA4OCglMCksIDY0KCUxKSwgcGFkZGQgKCUyKSwgMTEpCitST1dfSURDVCggIDk2KCUwKSwxMDQoJTApLDExMiglMCksMTIwKCUwKSwgOTYoJTEpLCBwYWRkZCAoJTIpLCAxMSkqLworCitEQ19DT05EX1JPV19JRENUKCAgMzIoJTApLCA0MCglMCksIDQ4KCUwKSwgNTYoJTApLCAzMiglMSkscGFkZGQgKCUyKSwgMTEpCitEQ19DT05EX1JPV19JRENUKCAgNjQoJTApLCA3MiglMCksIDgwKCUwKSwgODgoJTApLCA2NCglMSkscGFkZGQgKCUyKSwgMTEpCitEQ19DT05EX1JPV19JRENUKCAgOTYoJTApLDEwNCglMCksMTEyKCUwKSwxMjAoJTApLCA5NiglMSkscGFkZGQgKCUyKSwgMTEpCisKKworLy9JRENUKCAgICAgIHNyYzAsICAgc3JjNCwgICBzcmMxLCAgICBzcmM1LCAgICBkc3QsIHNoaWZ0KQorQ09MX0lEQ1QoICAgICglMSksIDY0KCUxKSwgMzIoJTEpLCAgOTYoJTEpLCAgMCglMCksIDIwKQorQ09MX0lEQ1QoICAgOCglMSksIDcyKCUxKSwgNDAoJTEpLCAxMDQoJTEpLCAgNCglMCksIDIwKQorQ09MX0lEQ1QoICAxNiglMSksIDgwKCUxKSwgNDgoJTEpLCAxMTIoJTEpLCAgOCglMCksIDIwKQorQ09MX0lEQ1QoICAyNCglMSksIDg4KCUxKSwgNTYoJTEpLCAxMjAoJTEpLCAxMiglMCksIDIwKQorCisjZWxzZQorCisjZGVmaW5lIERDX0NPTkRfSURDVChzcmMwLCBzcmM0LCBzcmMxLCBzcmM1LCBkc3QsIHJvdW5kZXIsIHNoaWZ0KSBcCisgICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKKyAgICAgICAgIm1vdnEgIiAjc3JjNCAiLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBSNiAgICAgUjIgICAgICByNiAgICAgIHIyICovXAorICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCisgICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKKyAgICAgICAgIm1vdnEgIk1BTkdMRSh3bTEwMTApIiwgJSVtbTQgICBcblx0IlwKKyAgICAgICAgInBhbmQgJSVtbTAsICUlbW00ICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBvciAlJW1tMSwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBvciAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBvciAlJW1tMywgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCUlbW00ICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgJSVtbTQsICUlZWF4ICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm9ybCAlJWVheCwgJSVlYXggICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImp6IDFmICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCisgICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAorICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAorICAgICAgICAjcm91bmRlciAiLCAlJW1tNCAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKKyAgICAgICAgIm1vdnEgNTYoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTUgICAgICAgICAgIFxuXHQiIC8qIEM3UjcrQzVSNSAgICAgIEM3cjcrQzVyNSAqL1wKKyAgICAgICAgI3JvdW5kZXIgIiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMCAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCisgICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKKyAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKKyAgICAgICAgInBzdWJkICUlbW01LCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMSAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0xLCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgICBBMCtCMCAgIGEwK2IwICovXAorICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAgIEExLUIxICAgYTEtYjEgKi9cCisgICAgICAgICJtb3ZxICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKKyAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAorICAgICAgICAibW92cSAlJW1tMiwgMjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicG1hZGR3ZCAlJW1tMSwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCisgICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKKyAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKKyAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAorICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAorICAgICAgICAicHN1YmQgJSVtbTQsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAorICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAorICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAorICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAgIEEyK0IyICAgYTIrYjIgKi9cCisgICAgICAgICJtb3ZxICUlbW0yLCA4KyIgI2RzdCAiICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICAgQTMtQjMgICBhMy1iMyAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTQsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgImptcCAyZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzbGxkICQxNiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGRkICJNQU5HTEUoZDQwMDAwKSIsICUlbW0wICBcblx0IlwKKyAgICAgICAgInBzcmFkICQxMywgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0wLCAlJW1tMCAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsIDgrIiAjZHN0ICIgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsIDI0KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIFpfQ09ORF9JRENUKHNyYzAsIHNyYzQsIHNyYzEsIHNyYzUsIGRzdCwgcm91bmRlciwgc2hpZnQsIGJ0KSBcCisgICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKKyAgICAgICAgIm1vdnEgIiAjc3JjNCAiLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBSNiAgICAgUjIgICAgICByNiAgICAgIHIyICovXAorICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCisgICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW00ICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBvciAlJW1tMSwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBvciAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBvciAlJW1tMywgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCUlbW00ICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgJSVtbTQsICUlZWF4ICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm9ybCAlJWVheCwgJSVlYXggICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImp6ICIgI2J0ICIgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCisgICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAorICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAorICAgICAgICAjcm91bmRlciAiLCAlJW1tNCAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKKyAgICAgICAgIm1vdnEgNTYoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTUgICAgICAgICAgIFxuXHQiIC8qIEM3UjcrQzVSNSAgICAgIEM3cjcrQzVyNSAqL1wKKyAgICAgICAgI3JvdW5kZXIgIiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMCAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCisgICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKKyAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKKyAgICAgICAgInBzdWJkICUlbW01LCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMSAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0xLCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgICBBMCtCMCAgIGEwK2IwICovXAorICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAgIEExLUIxICAgYTEtYjEgKi9cCisgICAgICAgICJtb3ZxICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKKyAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAorICAgICAgICAibW92cSAlJW1tMiwgMjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicG1hZGR3ZCAlJW1tMSwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCisgICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKKyAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKKyAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAorICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAorICAgICAgICAicHN1YmQgJSVtbTQsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAorICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAorICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAorICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAgIEEyK0IyICAgYTIrYjIgKi9cCisgICAgICAgICJtb3ZxICUlbW0yLCA4KyIgI2RzdCAiICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICAgQTMtQjMgICBhMy1iMyAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTQsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKKworI2RlZmluZSBST1dfSURDVChzcmMwLCBzcmM0LCBzcmMxLCBzcmM1LCBkc3QsIHJvdW5kZXIsIHNoaWZ0KSBcCisgICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKKyAgICAgICAgIm1vdnEgIiAjc3JjNCAiLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBSNiAgICAgUjIgICAgICByNiAgICAgIHIyICovXAorICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCisgICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKKyAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCisgICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAorICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAorICAgICAgICAjcm91bmRlciAiLCAlJW1tNCAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKKyAgICAgICAgIm1vdnEgNTYoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTUgICAgICAgICAgIFxuXHQiIC8qIEM3UjcrQzVSNSAgICAgIEM3cjcrQzVyNSAqL1wKKyAgICAgICAgI3JvdW5kZXIgIiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMCAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCisgICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKKyAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKKyAgICAgICAgInBzdWJkICUlbW01LCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMSAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0xLCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgICBBMCtCMCAgIGEwK2IwICovXAorICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAgIEExLUIxICAgYTEtYjEgKi9cCisgICAgICAgICJtb3ZxICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKKyAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAorICAgICAgICAibW92cSAlJW1tMiwgMjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicG1hZGR3ZCAlJW1tMSwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCisgICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKKyAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKKyAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAorICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAorICAgICAgICAicHN1YmQgJSVtbTQsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAorICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAorICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAorICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAgIEEyK0IyICAgYTIrYjIgKi9cCisgICAgICAgICJtb3ZxICUlbW0yLCA4KyIgI2RzdCAiICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICAgQTMtQjMgICBhMy1iMyAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTQsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKKworLy9JRENUKCAgICAgICAgIHNyYzAsICAgc3JjNCwgICBzcmMxLCAgIHNyYzUsICAgIGRzdCwgICByb3VuZGVyLCBzaGlmdCkKK0RDX0NPTkRfSURDVCggIDAoJTApLCAgOCglMCksIDE2KCUwKSwgMjQoJTApLCAgMCglMSkscGFkZGQgOCglMiksIDExKQorWl9DT05EX0lEQ1QoICAzMiglMCksIDQwKCUwKSwgNDgoJTApLCA1NiglMCksIDMyKCUxKSxwYWRkZCAoJTIpLCAxMSwgNGYpCitaX0NPTkRfSURDVCggIDY0KCUwKSwgNzIoJTApLCA4MCglMCksIDg4KCUwKSwgNjQoJTEpLHBhZGRkICglMiksIDExLCAyZikKK1pfQ09ORF9JRENUKCAgOTYoJTApLDEwNCglMCksMTEyKCUwKSwxMjAoJTApLCA5NiglMSkscGFkZGQgKCUyKSwgMTEsIDFmKQorCisjdW5kZWYgSURDVAorI2RlZmluZSBJRENUKHNyYzAsIHNyYzQsIHNyYzEsIHNyYzUsIGRzdCwgc2hpZnQpIFwKKyAgICAgICAgIm1vdnEgIiAjc3JjMCAiLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBSNCAgICAgUjAgICAgICByNCAgICAgIHIwICovXAorICAgICAgICAibW92cSAiICNzcmM0ICIsICUlbW0xICAgICAgICAgIFxuXHQiIC8qIFI2ICAgICBSMiAgICAgIHI2ICAgICAgcjIgKi9cCisgICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKKyAgICAgICAgIm1vdnEgIiAjc3JjNSAiLCAlJW1tMyAgICAgICAgICBcblx0IiAvKiBSNyAgICAgUjUgICAgICByNyAgICAgIHI1ICovXAorICAgICAgICAibW92cSAxNiglMiksICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEM0ICAgICBDNCAgICAgIEM0ICAgICAgQzQgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAorICAgICAgICAibW92cSAyNCglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW01LCAlJW1tMCAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgMzIoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBDNiAgICAgQzIgICAgICBDNiAgICAgIEMyICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMSwgJSVtbTUgICAgICAgICAgIFxuXHQiIC8qIEM2UjYrQzJSMiAgICAgIEM2cjYrQzJyMiAqL1wKKyAgICAgICAgIm1vdnEgNDAoJTIpLCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiAtQzIgICAgQzYgICAgICAtQzIgICAgIEM2ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tNiwgJSVtbTEgICAgICAgICAgIFxuXHQiIC8qIC1DMlI2K0M2UjIgICAgIC1DMnI2K0M2cjIgKi9cCisgICAgICAgICJtb3ZxICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAorICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAorICAgICAgICAicGFkZGQgJSVtbTUsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEEwICAgICAgICAgICAgIGEwICovXAorICAgICAgICAicHN1YmQgJSVtbTUsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJwYWRkZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTEgICAgICAgICAgICAgYTEgKi9cCisgICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCisgICAgICAgICJtb3ZxIDU2KCUyKSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQzcgICAgIEM1ICAgICAgQzcgICAgICBDNSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW0xICAgICAgICAgICBcblx0IiAvKiBDN1I3K0M1UjUgICAgICBDN3I3K0M1cjUgKi9cCisgICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKKyAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKKyAgICAgICAgInBzdWJkICUlbW0xLCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW03LCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgYTArYjAgKi9cCisgICAgICAgICJtb3ZkICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogQTErQjEgIGExK2IxICovXAorICAgICAgICAibW92ZCAlJW1tMCwgMTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEExLUIxICBhMS1iMSAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTIsIDk2KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgYTAtYjAgKi9cCisgICAgICAgICJtb3ZkICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKKyAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCisgICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKKyAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKKyAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAorICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAorICAgICAgICAicHN1YmQgJSVtbTQsICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW01ICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAorICAgICAgICAicGFkZGQgJSVtbTAsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAorICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAorICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICBhMitiMiAqL1wKKyAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tNiAgICAgICAgICBcblx0IiAvKiBBMytCMyAgYTMrYjMgKi9cCisgICAgICAgICJtb3ZkICUlbW0yLCAzMisiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tNCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTMtQjMgIGEzLWIzICovXAorICAgICAgICAicGFja3NzZHcgJSVtbTUsICUlbW01ICAgICAgICAgIFxuXHQiIC8qIEEyLUIyICBhMi1iMiAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTYsIDQ4KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgJSVtbTQsIDY0KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgJSVtbTUsIDgwKyIgI2RzdCAiICAgICAgICBcblx0IgorCisKKy8vSURDVCggIHNyYzAsICAgc3JjNCwgICBzcmMxLCAgICBzcmM1LCAgICBkc3QsIHNoaWZ0KQorSURDVCggICAgKCUxKSwgNjQoJTEpLCAzMiglMSksICA5NiglMSksICAwKCUwKSwgMjApCitJRENUKCAgIDgoJTEpLCA3MiglMSksIDQwKCUxKSwgMTA0KCUxKSwgIDQoJTApLCAyMCkKK0lEQ1QoICAxNiglMSksIDgwKCUxKSwgNDgoJTEpLCAxMTIoJTEpLCAgOCglMCksIDIwKQorSURDVCggIDI0KCUxKSwgODgoJTEpLCA1NiglMSksIDEyMCglMSksIDEyKCUwKSwgMjApCisgICAgICAgICJqbXAgOWYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiIyAucDJhbGlnbiA0ICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCitaX0NPTkRfSURDVCggIDY0KCUwKSwgNzIoJTApLCA4MCglMCksIDg4KCUwKSwgNjQoJTEpLHBhZGRkICglMiksIDExLCA2ZikKK1pfQ09ORF9JRENUKCAgOTYoJTApLDEwNCglMCksMTEyKCUwKSwxMjAoJTApLCA5NiglMSkscGFkZGQgKCUyKSwgMTEsIDVmKQorCisjdW5kZWYgSURDVAorI2RlZmluZSBJRENUKHNyYzAsIHNyYzQsIHNyYzEsIHNyYzUsIGRzdCwgc2hpZnQpIFwKKyAgICAgICAgIm1vdnEgIiAjc3JjMCAiLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBSNCAgICAgUjAgICAgICByNCAgICAgIHIwICovXAorICAgICAgICAibW92cSAiICNzcmM0ICIsICUlbW0xICAgICAgICAgIFxuXHQiIC8qIFI2ICAgICBSMiAgICAgIHI2ICAgICAgcjIgKi9cCisgICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKKyAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCisgICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW01ICAgICAgICAgICAgICBcblx0IiAvKiAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwICovXAorICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIEExICAgICAgICAgICAgIGExICovXAorICAgICAgICAicHN1YmQgJSVtbTEsICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAorICAgICAgICAibW92cSA1NiglMiksICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIEM3ICAgICBDNSAgICAgIEM3ICAgICAgQzUgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0zLCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogQzdSNytDNVI1ICAgICAgQzdyNytDNXI1ICovXAorICAgICAgICAibW92cSA3MiglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIC1DNSAgICAtQzEgICAgIC1DNSAgICAgLUMxICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIC1DNVI3LUMxUjUgICAgIC1DNXI3LUMxcjUgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQTArQjAgICAgICAgICAgYTArYjAgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogMkEwICAgICAgICAgICAgMmEwICovXAorICAgICAgICAicHN1YmQgJSVtbTEsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICAgICAgICAgIGEwLWIwICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0xICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8qIEExICAgICAgICAgICAgIGExICovXAorICAgICAgICAicGFkZGQgJSVtbTcsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIEExK0IxICAgICAgICAgIGExK2IxICovXAorICAgICAgICAicHN1YmQgJSVtbTcsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEExLUIxICAgICAgICAgIGExLWIxICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTEsICUlbW0xICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICBhMCtiMCAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTEsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0wLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgKi9cCisgICAgICAgICJtb3ZkICUlbW0wLCAxNisiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMiwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogQTEtQjEgIGExLWIxICovXAorICAgICAgICAibW92ZCAlJW1tMiwgOTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW00ICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTQsIDExMisiICNkc3QgIiAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgODgoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBDMyAgICAgQzcgICAgICBDMyAgICAgIEM3ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTEgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKKyAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAorICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAorICAgICAgICAicHN1YmQgJSVtbTEsICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW01ICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAorICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAorICAgICAgICAicHN1YmQgJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0xICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICBhMitiMiAqL1wKKyAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tNiAgICAgICAgICBcblx0IiAvKiBBMytCMyAgYTMrYjMgKi9cCisgICAgICAgICJtb3ZkICUlbW0yLCAzMisiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMSwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogQTMtQjMgIGEzLWIzICovXAorICAgICAgICAicGFja3NzZHcgJSVtbTUsICUlbW01ICAgICAgICAgIFxuXHQiIC8qIEEyLUIyICBhMi1iMiAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTYsIDQ4KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgJSVtbTEsIDY0KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgJSVtbTUsIDgwKyIgI2RzdCAiICAgICAgICBcblx0IgorCisvL0lEQ1QoICBzcmMwLCAgIHNyYzQsICAgc3JjMSwgICAgc3JjNSwgICAgZHN0LCBzaGlmdCkKK0lEQ1QoICAgICglMSksIDY0KCUxKSwgMzIoJTEpLCAgOTYoJTEpLCAgMCglMCksIDIwKQorSURDVCggICA4KCUxKSwgNzIoJTEpLCA0MCglMSksIDEwNCglMSksICA0KCUwKSwgMjApCitJRENUKCAgMTYoJTEpLCA4MCglMSksIDQ4KCUxKSwgMTEyKCUxKSwgIDgoJTApLCAyMCkKK0lEQ1QoICAyNCglMSksIDg4KCUxKSwgNTYoJTEpLCAxMjAoJTEpLCAxMiglMCksIDIwKQorICAgICAgICAiam1wIDlmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIiMgLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIjY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorWl9DT05EX0lEQ1QoICA5NiglMCksMTA0KCUwKSwxMTIoJTApLDEyMCglMCksIDk2KCUxKSxwYWRkZCAoJTIpLCAxMSwgN2YpCisKKyN1bmRlZiBJRENUCisjZGVmaW5lIElEQ1Qoc3JjMCwgc3JjNCwgc3JjMSwgc3JjNSwgZHN0LCBzaGlmdCkgXAorICAgICAgICAibW92cSAiICNzcmMwICIsICUlbW0wICAgICAgICAgIFxuXHQiIC8qIFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAgKi9cCisgICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKKyAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDU2KCUyKSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQzcgICAgIEM1ICAgICAgQzcgICAgICBDNSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW0xICAgICAgICAgICBcblx0IiAvKiBDN1I3K0M1UjUgICAgICBDN3I3K0M1cjUgKi9cCisgICAgICAgICJtb3ZxIDcyKCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogLUM1ICAgIC1DMSAgICAgLUM1ICAgICAtQzEgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0zLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogLUM1UjctQzFSNSAgICAgLUM1cjctQzFyNSAqL1wKKyAgICAgICAgInBhZGRkICUlbW00LCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgICAgICAgICBhMCtiMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW00LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAyQTAgICAgICAgICAgICAyYTAgKi9cCisgICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQTAtQjAgICAgICAgICAgYTAtYjAgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTEgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIgLyogQTEgICAgICAgICAgICAgYTEgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNywgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTErQjEgICAgICAgICAgYTErYjEgKi9cCisgICAgICAgICJwc3ViZCAlJW1tNywgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLyogQTEtQjEgICAgICAgICAgYTEtYjEgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTIgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMSwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogQTArQjAgIGEwK2IwICovXAorICAgICAgICAibW92ZCAlJW1tMSwgIiAjZHN0ICIgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTAsICUlbW0wICAgICAgICAgIFxuXHQiIC8qIEExK0IxICBhMStiMSAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTAsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0yLCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgYTEtYjEgKi9cCisgICAgICAgICJtb3ZkICUlbW0yLCA5NisiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tNCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTAtQjAgIGEwLWIwICovXAorICAgICAgICAibW92ZCAlJW1tNCwgMTEyKyIgI2RzdCAiICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSA4OCglMiksICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDNyAgICAgIEMzICAgICAgQzcgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0zLCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogQzNSNytDN1I1ICAgICAgQzNyNytDN3I1ICovXAorICAgICAgICAibW92cSAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAorICAgICAgICAicG1hZGR3ZCAxMDQoJTIpLCAlJW1tMyAgICAgICAgIFxuXHQiIC8qIC1DMVI3K0MzUjUgICAgIC1DMXI3K0MzcjUgKi9cCisgICAgICAgICJwYWRkZCAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLyogQTIrQjIgICAgICAgICAgYTIrYjIgKi9cCisgICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogYTItQjIgICAgICAgICAgYTItYjIgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTIgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTUgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCisgICAgICAgICJwYWRkZCAlJW1tMywgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMrQjMgICAgICAgICAgYTMrYjMgKi9cCisgICAgICAgICJwc3ViZCAlJW1tMywgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogYTMtQjMgICAgICAgICAgYTMtYjMgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTYgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTEgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMiwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogQTIrQjIgIGEyK2IyICovXAorICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTIsIDMyKyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0xLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBBMy1CMyAgYTMtYjMgKi9cCisgICAgICAgICJwYWNrc3NkdyAlJW1tNSwgJSVtbTUgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICovXAorICAgICAgICAibW92ZCAlJW1tNiwgNDgrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ZCAlJW1tMSwgNjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ZCAlJW1tNSwgODArIiAjZHN0ICIgICAgICAgIFxuXHQiCisKKworLy9JRENUKCAgc3JjMCwgICBzcmM0LCAgIHNyYzEsICAgIHNyYzUsICAgIGRzdCwgc2hpZnQpCitJRENUKCAgICAoJTEpLCA2NCglMSksIDMyKCUxKSwgIDk2KCUxKSwgIDAoJTApLCAyMCkKK0lEQ1QoICAgOCglMSksIDcyKCUxKSwgNDAoJTEpLCAxMDQoJTEpLCAgNCglMCksIDIwKQorSURDVCggIDE2KCUxKSwgODAoJTEpLCA0OCglMSksIDExMiglMSksICA4KCUwKSwgMjApCitJRENUKCAgMjQoJTEpLCA4OCglMSksIDU2KCUxKSwgMTIwKCUxKSwgMTIoJTApLCAyMCkKKyAgICAgICAgImptcCA5ZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIjIC5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKK1pfQ09ORF9JRENUKCAgOTYoJTApLDEwNCglMCksMTEyKCUwKSwxMjAoJTApLCA5NiglMSkscGFkZGQgKCUyKSwgMTEsIDNmKQorCisjdW5kZWYgSURDVAorI2RlZmluZSBJRENUKHNyYzAsIHNyYzQsIHNyYzEsIHNyYzUsIGRzdCwgc2hpZnQpIFwKKyAgICAgICAgIm1vdnEgIiAjc3JjMCAiLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBSNCAgICAgUjAgICAgICByNCAgICAgIHIwICovXAorICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCisgICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKKyAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAorICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDU2KCUyKSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQzcgICAgIEM1ICAgICAgQzcgICAgICBDNSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW0xICAgICAgICAgICBcblx0IiAvKiBDN1I3K0M1UjUgICAgICBDN3I3K0M1cjUgKi9cCisgICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKKyAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKKyAgICAgICAgInBzdWJkICUlbW0xLCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW03LCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgYTArYjAgKi9cCisgICAgICAgICJtb3ZkICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogQTErQjEgIGExK2IxICovXAorICAgICAgICAibW92ZCAlJW1tMCwgMTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEExLUIxICBhMS1iMSAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTIsIDk2KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgYTAtYjAgKi9cCisgICAgICAgICJtb3ZkICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKKyAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCisgICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKKyAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKKyAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAorICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAorICAgICAgICAicHN1YmQgJSVtbTQsICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW01ICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAorICAgICAgICAicGFkZGQgJSVtbTAsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAorICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAorICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICBhMitiMiAqL1wKKyAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tNiAgICAgICAgICBcblx0IiAvKiBBMytCMyAgYTMrYjMgKi9cCisgICAgICAgICJtb3ZkICUlbW0yLCAzMisiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tNCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTMtQjMgIGEzLWIzICovXAorICAgICAgICAicGFja3NzZHcgJSVtbTUsICUlbW01ICAgICAgICAgIFxuXHQiIC8qIEEyLUIyICBhMi1iMiAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTYsIDQ4KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgJSVtbTQsIDY0KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgJSVtbTUsIDgwKyIgI2RzdCAiICAgICAgICBcblx0IgorCisvL0lEQ1QoICBzcmMwLCAgIHNyYzQsICAgc3JjMSwgICAgc3JjNSwgICAgZHN0LCBzaGlmdCkKK0lEQ1QoICAgICglMSksIDY0KCUxKSwgMzIoJTEpLCAgOTYoJTEpLCAgMCglMCksIDIwKQorSURDVCggICA4KCUxKSwgNzIoJTEpLCA0MCglMSksIDEwNCglMSksICA0KCUwKSwgMjApCitJRENUKCAgMTYoJTEpLCA4MCglMSksIDQ4KCUxKSwgMTEyKCUxKSwgIDgoJTApLCAyMCkKK0lEQ1QoICAyNCglMSksIDg4KCUxKSwgNTYoJTEpLCAxMjAoJTEpLCAxMiglMCksIDIwKQorICAgICAgICAiam1wIDlmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIiMgLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorI3VuZGVmIElEQ1QKKyNkZWZpbmUgSURDVChzcmMwLCBzcmM0LCBzcmMxLCBzcmM1LCBkc3QsIHNoaWZ0KSBcCisgICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKKyAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBSMyAgICAgUjEgICAgICByMyAgICAgIHIxICovXAorICAgICAgICAibW92cSAxNiglMiksICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEM0ICAgICBDNCAgICAgIEM0ICAgICAgQzQgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAorICAgICAgICAibW92cSAyNCglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW01LCAlJW1tMCAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW02ICAgICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDQ4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEMxICAgICAgQzMgICAgICBDMSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW03ICAgICAgICAgICBcblx0IiAvKiBDM1IzK0MxUjEgICAgICBDM3IzK0MxcjEgKi9cCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgNjQoJTIpLCAlJW1tMyAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW0zICAgICAgICAgICBcblx0IiAvKiAtQzdSMytDM1IxICAgICAtQzdyMytDM3IxICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW0zLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKKyAgICAgICAgInBzdWJkICUlbW0zLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMSAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW03LCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgYTArYjAgKi9cCisgICAgICAgICJtb3ZkICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogQTErQjEgIGExK2IxICovXAorICAgICAgICAibW92ZCAlJW1tMCwgMTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTEsICUlbW0xICAgICAgICAgIFxuXHQiIC8qIEExLUIxICBhMS1iMSAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTEsIDk2KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgYTAtYjAgKi9cCisgICAgICAgICJtb3ZkICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxIDgwKCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogLUMxICAgIEM1ICAgICAgLUMxICAgICBDNSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW00ICAgICAgICAgICBcblx0IiAvKiAtQzFSMytDNVIxICAgICAtQzFyMytDNXIxICovXAorICAgICAgICAicG1hZGR3ZCA5NiglMiksICUlbW0yICAgICAgICAgIFxuXHQiIC8qIC1DNVIzK0M3UjEgICAgIC1DNXIzK0M3cjEgKi9cCisgICAgICAgICJtb3ZxICUlbW01LCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQTIrQjIgICAgICAgICAgYTIrYjIgKi9cCisgICAgICAgICJwc3ViZCAlJW1tNCwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogYTItQjIgICAgICAgICAgYTItYjIgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTEgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTUgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCisgICAgICAgICJwYWRkZCAlJW1tMiwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMrQjMgICAgICAgICAgYTMrYjMgKi9cCisgICAgICAgICJwc3ViZCAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogYTMtQjMgICAgICAgICAgYTMtYjMgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTYgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMSwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogQTIrQjIgIGEyK2IyICovXAorICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTEsIDMyKyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMy1CMyAgYTMtYjMgKi9cCisgICAgICAgICJwYWNrc3NkdyAlJW1tNSwgJSVtbTUgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICovXAorICAgICAgICAibW92ZCAlJW1tNiwgNDgrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ZCAlJW1tNCwgNjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ZCAlJW1tNSwgODArIiAjZHN0ICIgICAgICAgIFxuXHQiCisKKworLy9JRENUKCAgc3JjMCwgICBzcmM0LCAgIHNyYzEsICAgIHNyYzUsICAgIGRzdCwgc2hpZnQpCitJRENUKCAgICAoJTEpLCA2NCglMSksIDMyKCUxKSwgIDk2KCUxKSwgIDAoJTApLCAyMCkKK0lEQ1QoICAgOCglMSksIDcyKCUxKSwgNDAoJTEpLCAxMDQoJTEpLCAgNCglMCksIDIwKQorSURDVCggIDE2KCUxKSwgODAoJTEpLCA0OCglMSksIDExMiglMSksICA4KCUwKSwgMjApCitJRENUKCAgMjQoJTEpLCA4OCglMSksIDU2KCUxKSwgMTIwKCUxKSwgMTIoJTApLCAyMCkKKyAgICAgICAgImptcCA5ZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIjIC5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICI1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyN1bmRlZiBJRENUCisjZGVmaW5lIElEQ1Qoc3JjMCwgc3JjNCwgc3JjMSwgc3JjNSwgZHN0LCBzaGlmdCkgXAorICAgICAgICAibW92cSAiICNzcmMwICIsICUlbW0wICAgICAgICAgIFxuXHQiIC8qIFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAgKi9cCisgICAgICAgICJtb3ZxICIgI3NyYzQgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjYgICAgIFIyICAgICAgcjYgICAgICByMiAqL1wKKyAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCisgICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW01ICAgICAgICAgICAgICBcblx0IiAvKiAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwICovXAorICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIEExICAgICAgICAgICAgIGExICovXAorICAgICAgICAicHN1YmQgJSVtbTEsICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAorICAgICAgICAibW92cSA4KyIgI3NyYzAgIiwgJSVtbTIgICAgICAgIFxuXHQiIC8qIFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAgKi9cCisgICAgICAgICJtb3ZxIDgrIiAjc3JjNCAiLCAlJW1tMyAgICAgICAgXG5cdCIgLyogUjYgICAgIFIyICAgICAgcjYgICAgICByMiAqL1wKKyAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tMiwgJSVtbTEgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAorICAgICAgICAicG1hZGR3ZCAlJW1tNywgJSVtbTIgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW03ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCisgICAgICAgICJwbWFkZHdkIDQwKCUyKSwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogLUMyUjYrQzZSMiAgICAgLUMycjYrQzZyMiAqL1wKKyAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiAyQzAgICAgICAgICAgICAyYzAgKi9cCisgICAgICAgICJwc3ViZCAlJW1tNywgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCisgICAgICAgICJwYWRkZCAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgXG5cdCIgLyogQTEgICAgICAgICAgICAgYTEgKi9cCisgICAgICAgICJwYWRkZCAlJW1tMiwgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLyogMkMxICAgICAgICAgICAgMmMxICovXAorICAgICAgICAicHN1YmQgJSVtbTMsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW03ICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0zICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTcsICUlbW00ICAgICAgICAgIFxuXHQiIC8qIEEwICAgICBhMCAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTQsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0zLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBBMSAgICAgYTEgKi9cCisgICAgICAgICJtb3ZxICUlbW0wLCAxNisiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0wLCA5NisiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTUgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTYgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTIgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMiwgJSVtbTUgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICovXAorICAgICAgICAibW92cSAlJW1tNSwgMzIrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0xICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTEsICUlbW02ICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTYsIDQ4KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTYsIDY0KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTUsIDgwKyIgI2RzdCAiICAgICAgICBcblx0IgorCisKKy8vSURDVCggIHNyYzAsICAgc3JjNCwgICBzcmMxLCAgICBzcmM1LCAgICBkc3QsIHNoaWZ0KQorSURDVCggICAgMCglMSksIDY0KCUxKSwgMzIoJTEpLCAgOTYoJTEpLCAgMCglMCksIDIwKQorLy9JRENUKCAgIDgoJTEpLCA3MiglMSksIDQwKCUxKSwgMTA0KCUxKSwgIDQoJTApLCAyMCkKK0lEQ1QoICAxNiglMSksIDgwKCUxKSwgNDgoJTEpLCAxMTIoJTEpLCAgOCglMCksIDIwKQorLy9JRENUKCAgMjQoJTEpLCA4OCglMSksIDU2KCUxKSwgMTIwKCUxKSwgMTIoJTApLCAyMCkKKyAgICAgICAgImptcCA5ZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisKKyAgICAgICAgIiMgLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorI3VuZGVmIElEQ1QKKyNkZWZpbmUgSURDVChzcmMwLCBzcmM0LCBzcmMxLCBzcmM1LCBkc3QsIHNoaWZ0KSBcCisgICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKKyAgICAgICAgIm1vdnEgIiAjc3JjNCAiLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBSNiAgICAgUjIgICAgICByNiAgICAgIHIyICovXAorICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCisgICAgICAgICJtb3ZxIDE2KCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQzQgICAgIEM0ICAgICAgQzQgICAgICBDNCAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTAsICUlbW00ICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDI0KCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogLUM0ICAgIEM0ICAgICAgLUM0ICAgICBDNCAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTUsICUlbW0wICAgICAgICAgICBcblx0IiAvKiAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwICovXAorICAgICAgICAibW92cSAzMiglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIEM2ICAgICBDMiAgICAgIEM2ICAgICAgQzIgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0xLCAlJW1tNSAgICAgICAgICAgXG5cdCIgLyogQzZSNitDMlIyICAgICAgQzZyNitDMnIyICovXAorICAgICAgICAibW92cSA0MCglMiksICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIC1DMiAgICBDNiAgICAgIC1DMiAgICAgQzYgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW02LCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogLUMyUjYrQzZSMiAgICAgLUMycjYrQzZyMiAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW02ICAgICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCisgICAgICAgICJtb3ZxIDQ4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEMxICAgICAgQzMgICAgICBDMSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW03ICAgICAgICAgICBcblx0IiAvKiBDM1IzK0MxUjEgICAgICBDM3IzK0MxcjEgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQTAgICAgICAgICAgICAgYTAgKi9cCisgICAgICAgICJwc3ViZCAlJW1tNSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKKyAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBzdWJkICUlbW0xLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKKyAgICAgICAgIm1vdnEgNjQoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzdSMytDM1IxICAgICAtQzdyMytDM3IxICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAorICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKKyAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0zICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKKyAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKKyAgICAgICAgInBzdWJkICUlbW0xLCAlJW1tMyAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMyAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW03LCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgYTArYjAgKi9cCisgICAgICAgICJtb3ZkICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogQTErQjEgIGExK2IxICovXAorICAgICAgICAibW92ZCAlJW1tMCwgMTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTMsICUlbW0zICAgICAgICAgIFxuXHQiIC8qIEExLUIxICBhMS1iMSAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTMsIDk2KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgYTAtYjAgKi9cCisgICAgICAgICJtb3ZkICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxIDgwKCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogLUMxICAgIEM1ICAgICAgLUMxICAgICBDNSAqL1wKKyAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW00ICAgICAgICAgICBcblx0IiAvKiAtQzFSMytDNVIxICAgICAtQzFyMytDNXIxICovXAorICAgICAgICAicG1hZGR3ZCA5NiglMiksICUlbW0yICAgICAgICAgIFxuXHQiIC8qIC1DNVIzK0M3UjEgICAgIC1DNXIzK0M3cjEgKi9cCisgICAgICAgICJtb3ZxICUlbW01LCAlJW1tMyAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCisgICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTMgICAgICAgICAgICAgXG5cdCIgLyogQTIrQjIgICAgICAgICAgYTIrYjIgKi9cCisgICAgICAgICJwc3ViZCAlJW1tNCwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogYTItQjIgICAgICAgICAgYTItYjIgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTMgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTUgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCisgICAgICAgICJwYWRkZCAlJW1tMiwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMrQjMgICAgICAgICAgYTMrYjMgKi9cCisgICAgICAgICJwc3ViZCAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogYTMtQjMgICAgICAgICAgYTMtYjMgKi9cCisgICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTYgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAlJW1tMywgJSVtbTMgICAgICAgICAgXG5cdCIgLyogQTIrQjIgIGEyK2IyICovXAorICAgICAgICAibW92ZCAlJW1tMywgMzIrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAqL1wKKyAgICAgICAgIm1vdmQgJSVtbTYsIDQ4KyIgI2RzdCAiICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMy1CMyAgYTMtYjMgKi9cCisgICAgICAgICJwYWNrc3NkdyAlJW1tNSwgJSVtbTUgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICovXAorICAgICAgICAibW92ZCAlJW1tNCwgNjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ZCAlJW1tNSwgODArIiAjZHN0ICIgICAgICAgIFxuXHQiCisKKworLy9JRENUKCAgc3JjMCwgICBzcmM0LCAgIHNyYzEsICAgIHNyYzUsICAgIGRzdCwgc2hpZnQpCitJRENUKCAgICAoJTEpLCA2NCglMSksIDMyKCUxKSwgIDk2KCUxKSwgIDAoJTApLCAyMCkKK0lEQ1QoICAgOCglMSksIDcyKCUxKSwgNDAoJTEpLCAxMDQoJTEpLCAgNCglMCksIDIwKQorSURDVCggIDE2KCUxKSwgODAoJTEpLCA0OCglMSksIDExMiglMSksICA4KCUwKSwgMjApCitJRENUKCAgMjQoJTEpLCA4OCglMSksIDU2KCUxKSwgMTIwKCUxKSwgMTIoJTApLCAyMCkKKyAgICAgICAgImptcCA5ZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisKKyAgICAgICAgIiMgLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiNzogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjdW5kZWYgSURDVAorI2RlZmluZSBJRENUKHNyYzAsIHNyYzQsIHNyYzEsIHNyYzUsIGRzdCwgc2hpZnQpIFwKKyAgICAgICAgIm1vdnEgIiAjc3JjMCAiLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBSNCAgICAgUjAgICAgICByNCAgICAgIHIwICovXAorICAgICAgICAibW92cSAxNiglMiksICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEM0ICAgICBDNCAgICAgIEM0ICAgICAgQzQgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAorICAgICAgICAibW92cSAyNCglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW01LCAlJW1tMCAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgOCsiICNzcmMwICIsICUlbW0yICAgICAgICBcblx0IiAvKiBSNCAgICAgUjAgICAgICByNCAgICAgIHIwICovXAorICAgICAgICAibW92cSAxNiglMiksICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIEM0ICAgICBDNCAgICAgIEM0ICAgICAgQzQgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAorICAgICAgICAibW92cSAyNCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQgKi9cCisgICAgICAgICJwbWFkZHdkICUlbW03LCAlJW1tMiAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKKyAgICAgICAgIm1vdnEgMzIoJTIpLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBDNiAgICAgQzIgICAgICBDNiAgICAgIEMyICovXAorICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0xICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3NzZHcgJSVtbTEsICUlbW00ICAgICAgICAgIFxuXHQiIC8qIEEwICAgICBhMCAqL1wKKyAgICAgICAgIm1vdnEgJSVtbTQsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICUlbW0yLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBBMSAgICAgYTEgKi9cCisgICAgICAgICJtb3ZxICUlbW0wLCAxNisiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0wLCA5NisiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0wLCAzMisiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW00LCA0OCsiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW00LCA2NCsiICNkc3QgIiAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0wLCA4MCsiICNkc3QgIiAgICAgICAgXG5cdCIKKworLy9JRENUKCAgc3JjMCwgICBzcmM0LCAgIHNyYzEsICAgIHNyYzUsICAgIGRzdCwgc2hpZnQpCitJRENUKCAgIDAoJTEpLCA2NCglMSksIDMyKCUxKSwgIDk2KCUxKSwgIDAoJTApLCAyMCkKKy8vSURDVCggICA4KCUxKSwgNzIoJTEpLCA0MCglMSksIDEwNCglMSksICA0KCUwKSwgMjApCitJRENUKCAgMTYoJTEpLCA4MCglMSksIDQ4KCUxKSwgMTEyKCUxKSwgIDgoJTApLCAyMCkKKy8vSURDVCggIDI0KCUxKSwgODgoJTEpLCA1NiglMSksIDEyMCglMSksIDEyKCUwKSwgMjApCisKKworI2VuZGlmCisKKy8qCitJbnB1dAorIDAwIDQwIDA0IDQ0IDIwIDYwIDI0IDY0CisgMTAgMzAgMTQgMzQgNTAgNzAgNTQgNzQKKyAwMSA0MSAwMyA0MyAyMSA2MSAyMyA2MworIDExIDMxIDEzIDMzIDUxIDcxIDUzIDczCisgMDIgNDIgMDYgNDYgMjIgNjIgMjYgNjYKKyAxMiAzMiAxNiAzNiA1MiA3MiA1NiA3NgorIDA1IDQ1IDA3IDQ3IDI1IDY1IDI3IDY3CisgMTUgMzUgMTcgMzcgNTUgNzUgNTcgNzcKKworVGVtcAorIDAwIDA0IDEwIDE0IDIwIDI0IDMwIDM0CisgNDAgNDQgNTAgNTQgNjAgNjQgNzAgNzQKKyAwMSAwMyAxMSAxMyAyMSAyMyAzMSAzMworIDQxIDQzIDUxIDUzIDYxIDYzIDcxIDczCisgMDIgMDYgMTIgMTYgMjIgMjYgMzIgMzYKKyA0MiA0NiA1MiA1NiA2MiA2NiA3MiA3NgorIDA1IDA3IDE1IDE3IDI1IDI3IDM1IDM3CisgNDUgNDcgNTUgNTcgNjUgNjcgNzUgNzcKKyovCisKKyI5OiBcblx0IgorICAgICAgICAgICAgICAgIDo6ICJyIiAoYmxvY2spLCAiciIgKHRlbXApLCAiciIgKGNvZWZmcykKKyAgICAgICAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQod20xMDEwLGQ0MDAwMCkKKyAgICAgICAgICAgICAgICA6ICIlZWF4IgorICAgICAgICApOworfQorCit2b2lkIGZmX3NpbXBsZV9pZGN0X21teChpbnQxNl90ICpibG9jaykKK3sKKyAgICBpZGN0KGJsb2NrKTsKK30KKworLy9GSVhNRSBtZXJnZSBhZGQvcHV0IGludG8gdGhlIGlkY3QKKwordm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfbW14KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGlkY3QoYmxvY2spOworICAgIGZmX3B1dF9waXhlbHNfY2xhbXBlZChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKK30KK3ZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX21teCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpZGN0KGJsb2NrKTsKKyAgICBmZl9hZGRfcGl4ZWxzX2NsYW1wZWQoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7Cit9CisKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9zaW1wbGVfaWRjdC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3NpbXBsZV9pZGN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5ODczMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9zaW1wbGVfaWRjdC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1g4Nl9TSU1QTEVfSURDVF9ICisjZGVmaW5lIEFWQ09ERUNfWDg2X1NJTVBMRV9JRENUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIGZmX3NpbXBsZV9pZGN0X21teChpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF9tbXgodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfbW14KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfWDg2X1NJTVBMRV9JRENUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9zbm93ZHNwLmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvc25vd2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Nzg0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvc25vd2RzcC5jCkBAIC0wLDAgKzEsOTA4IEBACisvKgorICogTU1YIGFuZCBTU0UyIG9wdGltaXplZCBzbm93IERTUCB1dGlscworICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgUm9iZXJ0IEVkZWxlIDx5YXJ0cmVib0BlYXJ0aGxpbmsubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9zbm93LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9zbm93X2R3dC5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKK3N0YXRpYyB2b2lkIGZmX3Nub3dfaG9yaXpvbnRhbF9jb21wb3NlOTdpX3NzZTIoSURXVEVMRU0gKmIsIElEV1RFTEVNICp0ZW1wLCBpbnQgd2lkdGgpeworICAgIGNvbnN0IGludCB3Mj0gKHdpZHRoKzEpPj4xOworICAgIGNvbnN0IGludCB3X2w9ICh3aWR0aD4+MSk7CisgICAgY29uc3QgaW50IHdfcj0gdzIgLSAxOworICAgIGludCBpOworCisgICAgeyAvLyBMaWZ0IDAKKyAgICAgICAgSURXVEVMRU0gKiBjb25zdCByZWYgPSBiICsgdzIgLSAxOworICAgICAgICBJRFdURUxFTSBiXzAgPSBiWzBdOyAvL0J5IGFsbG93aW5nIHRoZSBmaXJzdCBlbnRyeSBpbiBiWzBdIHRvIGJlIGNhbGN1bGF0ZWQgdHdpY2UKKyAgICAgICAgLy8gKHRoZSBmaXJzdCB0aW1lIGVycm9uZW91c2x5KSwgd2UgYWxsb3cgdGhlIFNTRTIgY29kZSB0byBydW4gYW4gZXh0cmEgcGFzcy4KKyAgICAgICAgLy8gVGhlIHNhdmluZ3MgaW4gY29kZSBhbmQgdGltZSBhcmUgd2VsbCB3b3J0aCBoYXZpbmcgdG8gc3RvcmUgdGhpcyB2YWx1ZSBhbmQKKyAgICAgICAgLy8gY2FsY3VsYXRlIGJbMF0gY29ycmVjdGx5IGFmdGVyd2FyZHMuCisKKyAgICAgICAgaSA9IDA7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAicGNtcGVxZCAgICUleG1tNywgJSV4bW03ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwY21wZXFkICAgJSV4bW0zLCAlJXhtbTMgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGx3ICAgICAgICAgJDEsICUleG1tMyAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHcgICAgICUleG1tNywgJSV4bW0zICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsdyAgICAgICAgJDEzLCAlJXhtbTMgICAgICAgICBcblx0IgorICAgICAgICA6Oik7CisgICAgICAgIGZvcig7IGk8d19sLTE1OyBpKz0xNil7CisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgICAgICJtb3ZkcXUgICAoJTEpLCAlJXhtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxdSAxNiglMSksICUleG1tNSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHF1ICAyKCUxKSwgJSV4bW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcXUgMTgoJTEpLCAlJXhtbTYgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAlJXhtbTEsICUleG1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICUleG1tNSwgJSV4bW02ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgJSV4bW03LCAlJXhtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAlJXhtbTcsICUleG1tNiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicG11bGh3ICUleG1tMywgJSV4bW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwbXVsaHcgJSV4bW0zLCAlJXhtbTYgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAgICglMCksICUleG1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgIDE2KCUwKSwgJSV4bW02ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcWEgJSV4bW0yLCAoJTApICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxYSAlJXhtbTYsIDE2KCUwKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6OiAiciIoJmJbaV0pLCAiciIoJnJlZltpXSkKKyAgICAgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIHNub3dfaG9yaXpvbnRhbF9jb21wb3NlX2xpZnRfbGVhZF9vdXQoaSwgYiwgYiwgcmVmLCB3aWR0aCwgd19sLCAwLCBXX0RNLCBXX0RPLCBXX0RTKTsKKyAgICAgICAgYlswXSA9IGJfMCAtICgoV19ETSAqIDIgKiByZWZbMV0rV19ETyk+PldfRFMpOworICAgIH0KKworICAgIHsgLy8gTGlmdCAxCisgICAgICAgIElEV1RFTEVNICogY29uc3QgZHN0ID0gYit3MjsKKworICAgICAgICBpID0gMDsKKyAgICAgICAgZm9yKDsgKCgoeDg2X3JlZykmZHN0W2ldKSAmIDB4MUYpICYmIGk8d19yOyBpKyspeworICAgICAgICAgICAgZHN0W2ldID0gZHN0W2ldIC0gKGJbaV0gKyBiW2kgKyAxXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yKDsgaTx3X3ItMTU7IGkrPTE2KXsKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAgICAgIm1vdmRxdSAgICglMSksICUleG1tMSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHF1IDE2KCUxKSwgJSV4bW01ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcXUgIDIoJTEpLCAlJXhtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxdSAxOCglMSksICUleG1tNiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICUleG1tMSwgJSV4bW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgJSV4bW01LCAlJXhtbTYgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxYSAgICglMCksICUleG1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHFhIDE2KCUwKSwgJSV4bW00ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3VidyAgJSV4bW0yLCAlJXhtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzdWJ3ICAlJXhtbTYsICUleG1tNCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHFhICUleG1tMCwgKCUwKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcWEgJSV4bW00LCAxNiglMCkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOjogInIiKCZkc3RbaV0pLCAiciIoJmJbaV0pCisgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBzbm93X2hvcml6b250YWxfY29tcG9zZV9saWZ0X2xlYWRfb3V0KGksIGRzdCwgZHN0LCBiLCB3aWR0aCwgd19yLCAxLCBXX0NNLCBXX0NPLCBXX0NTKTsKKyAgICB9CisKKyAgICB7IC8vIExpZnQgMgorICAgICAgICBJRFdURUxFTSAqIGNvbnN0IHJlZiA9IGIrdzIgLSAxOworICAgICAgICBJRFdURUxFTSBiXzAgPSBiWzBdOworCisgICAgICAgIGkgPSAwOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgInBzbGx3ICAgICAgICAgJDE1LCAlJXhtbTcgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGNtcGVxdyAgICAlJXhtbTYsICUleG1tNiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICQxMywgJSV4bW02ICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR3ICAgICAgJSV4bW03LCAlJXhtbTYgICAgICAgIFxuXHQiCisgICAgICAgIDo6KTsKKyAgICAgICAgZm9yKDsgaTx3X2wtMTU7IGkrPTE2KXsKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAgICAgIm1vdmRxdSAgICglMSksICUleG1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHF1IDE2KCUxKSwgJSV4bW00ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcXUgIDIoJTEpLCAlJXhtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxdSAxOCglMSksICUleG1tNSAgICAgICAgXG5cdCIgLy9GSVhNRSB0cnkgYWxpZ25lZCByZWFkcyBhbmQgc2hpZnRzCisgICAgICAgICAgICAgICAgInBhZGR3ICAlJXhtbTYsICUleG1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICUleG1tNiwgJSV4bW00ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgJSV4bW03LCAlJXhtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAlJXhtbTcsICUleG1tNSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGF2Z3cgICUleG1tMSwgJSV4bW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYXZndyAgJSV4bW01LCAlJXhtbTQgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzdWJ3ICAlJXhtbTcsICUleG1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgICUleG1tNywgJSV4bW00ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3JhdyAgICAgICQxLCAlJXhtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzcmF3ICAgICAgJDEsICUleG1tNCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHFhICAgKCUwKSwgJSV4bW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcWEgMTYoJTApLCAlJXhtbTUgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAlJXhtbTEsICUleG1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICUleG1tNSwgJSV4bW00ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3JhdyAgICAgICQyLCAlJXhtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzcmF3ICAgICAgJDIsICUleG1tNCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICUleG1tMSwgJSV4bW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgJSV4bW01LCAlJXhtbTQgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxYSAlJXhtbTAsICglMCkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHFhICUleG1tNCwgMTYoJTApICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIDo6ICJyIigmYltpXSksICJyIigmcmVmW2ldKQorICAgICAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgc25vd19ob3Jpem9udGFsX2NvbXBvc2VfbGlmdFNfbGVhZF9vdXQoaSwgYiwgYiwgcmVmLCB3aWR0aCwgd19sKTsKKyAgICAgICAgYlswXSA9IGJfMCArICgoMiAqIHJlZlsxXSArIFdfQk8tMSArIDQgKiBiXzApID4+IFdfQlMpOworICAgIH0KKworICAgIHsgLy8gTGlmdCAzCisgICAgICAgIElEV1RFTEVNICogY29uc3Qgc3JjID0gYit3MjsKKworICAgICAgICBpID0gMDsKKyAgICAgICAgZm9yKDsgKCgoeDg2X3JlZykmdGVtcFtpXSkgJiAweDFGKSAmJiBpPHdfcjsgaSsrKXsKKyAgICAgICAgICAgIHRlbXBbaV0gPSBzcmNbaV0gLSAoKC1XX0FNKihiW2ldICsgYltpKzFdKSk+PldfQVMpOworICAgICAgICB9CisgICAgICAgIGZvcig7IGk8d19yLTc7IGkrPTgpeworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibW92ZHF1ICAyKCUxKSwgJSV4bW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcXUgMTgoJTEpLCAlJXhtbTYgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAgICglMSksICUleG1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgIDE2KCUxKSwgJSV4bW02ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcXUgICAoJTApLCAlJXhtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxdSAxNiglMCksICUleG1tNCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICUleG1tMiwgJSV4bW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgJSV4bW02LCAlJXhtbTQgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzcmF3ICAgICAgJDEsICUleG1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNyYXcgICAgICAkMSwgJSV4bW02ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgJSV4bW0wLCAlJXhtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAlJXhtbTQsICUleG1tNiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHFhICUleG1tMiwgKCUyKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcWEgJSV4bW02LCAxNiglMikgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOjogInIiKCZzcmNbaV0pLCAiciIoJmJbaV0pLCAiciIoJnRlbXBbaV0pCisgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgc25vd19ob3Jpem9udGFsX2NvbXBvc2VfbGlmdF9sZWFkX291dChpLCB0ZW1wLCBzcmMsIGIsIHdpZHRoLCB3X3IsIDEsIC1XX0FNLCBXX0FPKzEsIFdfQVMpOworICAgIH0KKworICAgIHsKKyAgICAgICAgc25vd19pbnRlcmxlYXZlX2xpbmVfaGVhZGVyKCZpLCB3aWR0aCwgYiwgdGVtcCk7CisKKyAgICAgICAgZm9yICg7IChpICYgMHgzRSkgIT0gMHgzRTsgaS09Mil7CisgICAgICAgICAgICBiW2krMV0gPSB0ZW1wW2k+PjFdOworICAgICAgICAgICAgYltpXSA9IGJbaT4+MV07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpLT02MjsgaT49MDsgaS09NjQpeworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibW92ZHFhICAgICAgKCUxKSwgJSV4bW0wICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxYSAgICAxNiglMSksICUleG1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcWEgICAgMzIoJTEpLCAlJXhtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHFhICAgIDQ4KCUxKSwgJSV4bW02ICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxYSAgICAgICglMSksICUleG1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcWEgICAgMTYoJTEpLCAlJXhtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHFhICAgIDMyKCUxKSwgJSV4bW01ICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxYSAgICA0OCglMSksICUleG1tNyAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsd2QgICAoJTIpLCAlJXhtbTAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNrbHdkIDE2KCUyKSwgJSV4bW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB1bnBja2x3ZCAzMiglMiksICUleG1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsd2QgNDgoJTIpLCAlJXhtbTYgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHFhICAgICUleG1tMCwgKCUwKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxYSAgICAlJXhtbTIsIDMyKCUwKSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcWEgICAgJSV4bW00LCA2NCglMCkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHFhICAgICUleG1tNiwgOTYoJTApICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB1bnBja2h3ZCAgICglMiksICUleG1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tod2QgMTYoJTIpLCAlJXhtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNraHdkIDMyKCUyKSwgJSV4bW01ICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB1bnBja2h3ZCA0OCglMiksICUleG1tNyAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcWEgICAgJSV4bW0xLCAxNiglMCkgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZHFhICAgICUleG1tMywgNDgoJTApICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmRxYSAgICAlJXhtbTUsIDgwKCUwKSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkcWEgICAgJSV4bW03LCAxMTIoJTApICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6OiAiciIoJihiKVtpXSksICJyIigmKGIpW2k+PjFdKSwgInIiKCYodGVtcClbaT4+MV0pCisgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZmX3Nub3dfaG9yaXpvbnRhbF9jb21wb3NlOTdpX21teChJRFdURUxFTSAqYiwgSURXVEVMRU0gKnRlbXAsIGludCB3aWR0aCl7CisgICAgY29uc3QgaW50IHcyPSAod2lkdGgrMSk+PjE7CisgICAgY29uc3QgaW50IHdfbD0gKHdpZHRoPj4xKTsKKyAgICBjb25zdCBpbnQgd19yPSB3MiAtIDE7CisgICAgaW50IGk7CisKKyAgICB7IC8vIExpZnQgMAorICAgICAgICBJRFdURUxFTSAqIGNvbnN0IHJlZiA9IGIgKyB3MiAtIDE7CisKKyAgICAgICAgaSA9IDE7CisgICAgICAgIGJbMF0gPSBiWzBdIC0gKChXX0RNICogMiAqIHJlZlsxXStXX0RPKT4+V19EUyk7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAicGNtcGVxdyAgICAlJW1tNywgJSVtbTcgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBjbXBlcXcgICAgJSVtbTMsICUlbW0zICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsdyAgICAgICAgICQxLCAlJW1tMyAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHcgICAgICAlJW1tNywgJSVtbTMgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGx3ICAgICAgICAkMTMsICUlbW0zICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgOjopOworICAgICAgICBmb3IoOyBpPHdfbC03OyBpKz04KXsKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICglMSksICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgIDgoJTEpLCAlJW1tNiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICAyKCUxKSwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAxMCglMSksICUlbW02ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgICUlbW03LCAlJW1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICAlJW1tNywgJSVtbTYgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBtdWxodyAgJSVtbTMsICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwbXVsaHcgICUlbW0zLCAlJW1tNiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICAgKCUwKSwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAgOCglMCksICUlbW02ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICUlbW0yLCAoJTApICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAlJW1tNiwgOCglMCkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOjogInIiKCZiW2ldKSwgInIiKCZyZWZbaV0pCisgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgc25vd19ob3Jpem9udGFsX2NvbXBvc2VfbGlmdF9sZWFkX291dChpLCBiLCBiLCByZWYsIHdpZHRoLCB3X2wsIDAsIFdfRE0sIFdfRE8sIFdfRFMpOworICAgIH0KKworICAgIHsgLy8gTGlmdCAxCisgICAgICAgIElEV1RFTEVNICogY29uc3QgZHN0ID0gYit3MjsKKworICAgICAgICBpID0gMDsKKyAgICAgICAgZm9yKDsgaTx3X3ItNzsgaSs9OCl7CisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgICAgICJtb3ZxICAgICAoJTEpLCAlJW1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICA4KCUxKSwgJSVtbTYgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAgMiglMSksICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgMTAoJTEpLCAlJW1tNiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAgKCUwKSwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgOCglMCksICUlbW00ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3VidyAgICUlbW0yLCAlJW1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgICAlJW1tNiwgJSVtbTQgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgJSVtbTAsICglMCkgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICUlbW00LCA4KCUwKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6OiAiciIoJmRzdFtpXSksICJyIigmYltpXSkKKyAgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBzbm93X2hvcml6b250YWxfY29tcG9zZV9saWZ0X2xlYWRfb3V0KGksIGRzdCwgZHN0LCBiLCB3aWR0aCwgd19yLCAxLCBXX0NNLCBXX0NPLCBXX0NTKTsKKyAgICB9CisKKyAgICB7IC8vIExpZnQgMgorICAgICAgICBJRFdURUxFTSAqIGNvbnN0IHJlZiA9IGIrdzIgLSAxOworCisgICAgICAgIGkgPSAxOworICAgICAgICBiWzBdID0gYlswXSArICgoKDIgKiByZWZbMV0gKyBXX0JPKSArIDQgKiBiWzBdKSA+PiBXX0JTKTsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJwc2xsdyAgICAgICAgICQxNSwgJSVtbTcgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGNtcGVxdyAgICAgJSVtbTYsICUlbW02ICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgJDEzLCAlJW1tNiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAgICAgICAlJW1tNywgJSVtbTYgICAgICAgIFxuXHQiCisgICAgICAgICAgIDo6KTsKKyAgICAgICAgZm9yKDsgaTx3X2wtNzsgaSs9OCl7CisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgICAgICJtb3ZxICAgICAoJTEpLCAlJW1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICA4KCUxKSwgJSVtbTQgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgMiglMSksICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgMTAoJTEpLCAlJW1tNSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICAlJW1tNiwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAgJSVtbTYsICUlbW00ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgICUlbW03LCAlJW1tMSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICAlJW1tNywgJSVtbTUgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhdmd3ICAgJSVtbTEsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYXZndyAgICUlbW01LCAlJW1tNCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHN1YncgICAlJW1tNywgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzdWJ3ICAgJSVtbTcsICUlbW00ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3JhdyAgICAgICQxLCAlJW1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNyYXcgICAgICAkMSwgJSVtbTQgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICglMCksICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgIDgoJTApLCAlJW1tNSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICAlJW1tMSwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAgJSVtbTUsICUlbW00ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3JhdyAgICAgICQyLCAlJW1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNyYXcgICAgICAkMiwgJSVtbTQgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAgJSVtbTEsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgICUlbW01LCAlJW1tNCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAlJW1tMCwgKCUwKSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgJSVtbTQsIDgoJTApICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIDo6ICJyIigmYltpXSksICJyIigmcmVmW2ldKQorICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIHNub3dfaG9yaXpvbnRhbF9jb21wb3NlX2xpZnRTX2xlYWRfb3V0KGksIGIsIGIsIHJlZiwgd2lkdGgsIHdfbCk7CisgICAgfQorCisgICAgeyAvLyBMaWZ0IDMKKyAgICAgICAgSURXVEVMRU0gKiBjb25zdCBzcmMgPSBiK3cyOworICAgICAgICBpID0gMDsKKworICAgICAgICBmb3IoOyBpPHdfci03OyBpKz04KXsKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAgICAgIm1vdnEgICAgMiglMSksICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgMTAoJTEpLCAlJW1tNiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICAgKCUxKSwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAgOCglMSksICUlbW02ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAoJTApLCAlJW1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICA4KCUwKSwgJSVtbTQgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR3ICAgJSVtbTIsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgICUlbW02LCAlJW1tNCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNyYXcgICAgICAkMSwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzcmF3ICAgICAgJDEsICUlbW02ICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWRkdyAgICUlbW0wLCAlJW1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFkZHcgICAlJW1tNCwgJSVtbTYgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgJSVtbTIsICglMikgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICUlbW02LCA4KCUyKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6OiAiciIoJnNyY1tpXSksICJyIigmYltpXSksICJyIigmdGVtcFtpXSkKKyAgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBzbm93X2hvcml6b250YWxfY29tcG9zZV9saWZ0X2xlYWRfb3V0KGksIHRlbXAsIHNyYywgYiwgd2lkdGgsIHdfciwgMSwgLVdfQU0sIFdfQU8rMSwgV19BUyk7CisgICAgfQorCisgICAgeworICAgICAgICBzbm93X2ludGVybGVhdmVfbGluZV9oZWFkZXIoJmksIHdpZHRoLCBiLCB0ZW1wKTsKKworICAgICAgICBmb3IgKDsgKGkgJiAweDFFKSAhPSAweDFFOyBpLT0yKXsKKyAgICAgICAgICAgIGJbaSsxXSA9IHRlbXBbaT4+MV07CisgICAgICAgICAgICBiW2ldID0gYltpPj4xXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGktPTMwOyBpPj0wOyBpLT0zMil7CisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICAoJTEpLCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgIDgoJTEpLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgMTYoJTEpLCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgMjQoJTEpLCAlJW1tNiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICAoJTEpLCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgIDgoJTEpLCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgMTYoJTEpLCAlJW1tNSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgMjQoJTEpLCAlJW1tNyAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsd2QgICAoJTIpLCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsd2QgIDgoJTIpLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsd2QgMTYoJTIpLCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsd2QgMjQoJTIpLCAlJW1tNiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0wLCAoJTApICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0yLCAxNiglMCkgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW00LCAzMiglMCkgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW02LCA0OCglMCkgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tod2QgICAoJTIpLCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tod2QgIDgoJTIpLCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tod2QgMTYoJTIpLCAlJW1tNSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tod2QgMjQoJTIpLCAlJW1tNyAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0xLCA4KCUwKSAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0zLCAyNCglMCkgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW01LCA0MCglMCkgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW03LCA1NiglMCkgICAgICBcblx0IgorICAgICAgICAgICAgICAgIDo6ICJyIigmYltpXSksICJyIigmYltpPj4xXSksICJyIigmdGVtcFtpPj4xXSkKKyAgICAgICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2lmIEhBVkVfN1JFR1MKKyNkZWZpbmUgc25vd192ZXJ0aWNhbF9jb21wb3NlX3NzZTJfbG9hZF9hZGQob3Ascix0MCx0MSx0Mix0MylcCisgICAgICAgICIib3AiICgiciIsJSUiUkVHX2QiKSwgJSUidDAiICAgICAgXG5cdCJcCisgICAgICAgICIib3AiIDE2KCJyIiwlJSJSRUdfZCIpLCAlJSJ0MSIgICAgXG5cdCJcCisgICAgICAgICIib3AiIDMyKCJyIiwlJSJSRUdfZCIpLCAlJSJ0MiIgICAgXG5cdCJcCisgICAgICAgICIib3AiIDQ4KCJyIiwlJSJSRUdfZCIpLCAlJSJ0MyIgICAgXG5cdCIKKworI2RlZmluZSBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9sb2FkKHIsdDAsdDEsdDIsdDMpXAorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9sb2FkX2FkZCgibW92ZHFhIixyLHQwLHQxLHQyLHQzKQorCisjZGVmaW5lIHNub3dfdmVydGljYWxfY29tcG9zZV9zc2UyX2FkZChyLHQwLHQxLHQyLHQzKVwKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX3NzZTJfbG9hZF9hZGQoInBhZGR3IixyLHQwLHQxLHQyLHQzKQorCisjZGVmaW5lIHNub3dfdmVydGljYWxfY29tcG9zZV9yMnJfc3ViKHMwLHMxLHMyLHMzLHQwLHQxLHQyLHQzKVwKKyAgICAgICAgInBzdWJ3ICUlInMwIiwgJSUidDAiIFxuXHQiXAorICAgICAgICAicHN1YncgJSUiczEiLCAlJSJ0MSIgXG5cdCJcCisgICAgICAgICJwc3VidyAlJSJzMiIsICUlInQyIiBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlInMzIiwgJSUidDMiIFxuXHQiCisKKyNkZWZpbmUgc25vd192ZXJ0aWNhbF9jb21wb3NlX3NzZTJfc3RvcmUodyxzMCxzMSxzMixzMylcCisgICAgICAgICJtb3ZkcWEgJSUiczAiLCAoInciLCUlIlJFR19kIikgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmRxYSAlJSJzMSIsIDE2KCJ3IiwlJSJSRUdfZCIpICAgIFxuXHQiXAorICAgICAgICAibW92ZHFhICUlInMyIiwgMzIoInciLCUlIlJFR19kIikgICAgXG5cdCJcCisgICAgICAgICJtb3ZkcWEgJSUiczMiLCA0OCgidyIsJSUiUkVHX2QiKSAgICBcblx0IgorCisjZGVmaW5lIHNub3dfdmVydGljYWxfY29tcG9zZV9zcmEobix0MCx0MSx0Mix0MylcCisgICAgICAgICJwc3JhdyAkIm4iLCAlJSJ0MCIgXG5cdCJcCisgICAgICAgICJwc3JhdyAkIm4iLCAlJSJ0MSIgXG5cdCJcCisgICAgICAgICJwc3JhdyAkIm4iLCAlJSJ0MiIgXG5cdCJcCisgICAgICAgICJwc3JhdyAkIm4iLCAlJSJ0MyIgXG5cdCIKKworI2RlZmluZSBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfcjJyX2FkZChzMCxzMSxzMixzMyx0MCx0MSx0Mix0MylcCisgICAgICAgICJwYWRkdyAlJSJzMCIsICUlInQwIiBcblx0IlwKKyAgICAgICAgInBhZGR3ICUlInMxIiwgJSUidDEiIFxuXHQiXAorICAgICAgICAicGFkZHcgJSUiczIiLCAlJSJ0MiIgXG5cdCJcCisgICAgICAgICJwYWRkdyAlJSJzMyIsICUlInQzIiBcblx0IgorCisjZGVmaW5lIHNub3dfdmVydGljYWxfY29tcG9zZV9yMnJfcG11bGh3KHMwLHMxLHMyLHMzLHQwLHQxLHQyLHQzKVwKKyAgICAgICAgInBtdWxodyAlJSJzMCIsICUlInQwIiBcblx0IlwKKyAgICAgICAgInBtdWxodyAlJSJzMSIsICUlInQxIiBcblx0IlwKKyAgICAgICAgInBtdWxodyAlJSJzMiIsICUlInQyIiBcblx0IlwKKyAgICAgICAgInBtdWxodyAlJSJzMyIsICUlInQzIiBcblx0IgorCisjZGVmaW5lIHNub3dfdmVydGljYWxfY29tcG9zZV9zc2UyX21vdmUoczAsczEsczIsczMsdDAsdDEsdDIsdDMpXAorICAgICAgICAibW92ZHFhICUlInMwIiwgJSUidDAiIFxuXHQiXAorICAgICAgICAibW92ZHFhICUlInMxIiwgJSUidDEiIFxuXHQiXAorICAgICAgICAibW92ZHFhICUlInMyIiwgJSUidDIiIFxuXHQiXAorICAgICAgICAibW92ZHFhICUlInMzIiwgJSUidDMiIFxuXHQiCisKK3N0YXRpYyB2b2lkIGZmX3Nub3dfdmVydGljYWxfY29tcG9zZTk3aV9zc2UyKElEV1RFTEVNICpiMCwgSURXVEVMRU0gKmIxLCBJRFdURUxFTSAqYjIsIElEV1RFTEVNICpiMywgSURXVEVMRU0gKmI0LCBJRFdURUxFTSAqYjUsIGludCB3aWR0aCl7CisgICAgeDg2X3JlZyBpID0gd2lkdGg7CisKKyAgICB3aGlsZShpICYgMHgxRikKKyAgICB7CisgICAgICAgIGktLTsKKyAgICAgICAgYjRbaV0gLT0gKFdfRE0qKGIzW2ldICsgYjVbaV0pK1dfRE8pPj5XX0RTOworICAgICAgICBiM1tpXSAtPSAoV19DTSooYjJbaV0gKyBiNFtpXSkrV19DTyk+PldfQ1M7CisgICAgICAgIGIyW2ldICs9IChXX0JNKihiMVtpXSArIGIzW2ldKSs0KmIyW2ldK1dfQk8pPj5XX0JTOworICAgICAgICBiMVtpXSArPSAoV19BTSooYjBbaV0gKyBiMltpXSkrV19BTyk+PldfQVM7CisgICAgfQorICAgIGkrPWk7CisKKyAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAiam1wIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9sb2FkKCIlNCIsInhtbTAiLCJ4bW0yIiwieG1tNCIsInhtbTYiKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9hZGQoIiU2IiwieG1tMCIsInhtbTIiLCJ4bW00IiwieG1tNiIpCisKKworICAgICAgICAicGNtcGVxdyAgICAlJXhtbTAsICUleG1tMCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGVxdyAgICAlJXhtbTIsICUleG1tMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgICAgICAlJXhtbTIsICUleG1tMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgICAgICAlJXhtbTAsICUleG1tMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNsbHcgICAgICAgICAkMTMsICUleG1tMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfcjJyX2FkZCgieG1tMCIsInhtbTAiLCJ4bW0wIiwieG1tMCIsInhtbTEiLCJ4bW0zIiwieG1tNSIsInhtbTciKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfcjJyX3BtdWxodygieG1tMiIsInhtbTIiLCJ4bW0yIiwieG1tMiIsInhtbTEiLCJ4bW0zIiwieG1tNSIsInhtbTciKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9hZGQoIiU1IiwieG1tMSIsInhtbTMiLCJ4bW01IiwieG1tNyIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9zc2UyX3N0b3JlKCIlNSIsInhtbTEiLCJ4bW0zIiwieG1tNSIsInhtbTciKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9sb2FkKCIlNCIsInhtbTAiLCJ4bW0yIiwieG1tNCIsInhtbTYiKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9hZGQoIiUzIiwieG1tMSIsInhtbTMiLCJ4bW01IiwieG1tNyIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9yMnJfc3ViKCJ4bW0xIiwieG1tMyIsInhtbTUiLCJ4bW03IiwieG1tMCIsInhtbTIiLCJ4bW00IiwieG1tNiIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9zc2UyX3N0b3JlKCIlNCIsInhtbTAiLCJ4bW0yIiwieG1tNCIsInhtbTYiKQorCisgICAgICAgICJwY21wZXF3ICUleG1tNywgJSV4bW03ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXF3ICUleG1tNSwgJSV4bW01ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2xsdyAkMTUsICUleG1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsdyAkMTMsICUleG1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJXhtbTcsICUleG1tNSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9yMnJfYWRkKCJ4bW01IiwieG1tNSIsInhtbTUiLCJ4bW01IiwieG1tMCIsInhtbTIiLCJ4bW00IiwieG1tNiIpCisgICAgICAgICJtb3ZxICAgKCUyLCUlIlJFR19kIiksICUleG1tMSAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgIDgoJTIsJSUiUkVHX2QiKSwgJSV4bW0zICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSV4bW03LCAlJXhtbTEgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSV4bW03LCAlJXhtbTMgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z3cgJSV4bW0xLCAlJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z3cgJSV4bW0zLCAlJXhtbTIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAxNiglMiwlJSJSRUdfZCIpLCAlJXhtbTEgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxIDI0KCUyLCUlIlJFR19kIiksICUleG1tMyAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUleG1tNywgJSV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUleG1tNywgJSV4bW0zICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmd3ICUleG1tMSwgJSV4bW00ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmd3ICUleG1tMywgJSV4bW02ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX3Iycl9zdWIoInhtbTciLCJ4bW03IiwieG1tNyIsInhtbTciLCJ4bW0wIiwieG1tMiIsInhtbTQiLCJ4bW02IikKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX3NyYSgiMSIsInhtbTAiLCJ4bW0yIiwieG1tNCIsInhtbTYiKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9hZGQoIiUzIiwieG1tMCIsInhtbTIiLCJ4bW00IiwieG1tNiIpCisKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX3NyYSgiMiIsInhtbTAiLCJ4bW0yIiwieG1tNCIsInhtbTYiKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9hZGQoIiUzIiwieG1tMCIsInhtbTIiLCJ4bW00IiwieG1tNiIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9zc2UyX3N0b3JlKCIlMyIsInhtbTAiLCJ4bW0yIiwieG1tNCIsInhtbTYiKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9hZGQoIiUxIiwieG1tMCIsInhtbTIiLCJ4bW00IiwieG1tNiIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9zc2UyX21vdmUoInhtbTAiLCJ4bW0yIiwieG1tNCIsInhtbTYiLCJ4bW0xIiwieG1tMyIsInhtbTUiLCJ4bW03IikKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX3NyYSgiMSIsInhtbTAiLCJ4bW0yIiwieG1tNCIsInhtbTYiKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfcjJyX2FkZCgieG1tMSIsInhtbTMiLCJ4bW01IiwieG1tNyIsInhtbTAiLCJ4bW0yIiwieG1tNCIsInhtbTYiKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9hZGQoIiUyIiwieG1tMCIsInhtbTIiLCJ4bW00IiwieG1tNiIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9zc2UyX3N0b3JlKCIlMiIsInhtbTAiLCJ4bW0yIiwieG1tNCIsInhtbTYiKQorCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgJDY0LCAlJSJSRUdfZCIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJqZ2UgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDoiK2QiKGkpCisgICAgICAgIDoiciIoYjApLCJyIihiMSksInIiKGIyKSwiciIoYjMpLCJyIihiNCksInIiKGI1KSk7Cit9CisKKyNkZWZpbmUgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9sb2FkX2FkZChvcCxyLHQwLHQxLHQyLHQzKVwKKyAgICAgICAgIiJvcCIgKCJyIiwlJSJSRUdfZCIpLCAlJSJ0MCIgICBcblx0IlwKKyAgICAgICAgIiJvcCIgOCgiciIsJSUiUkVHX2QiKSwgJSUidDEiICBcblx0IlwKKyAgICAgICAgIiJvcCIgMTYoInIiLCUlIlJFR19kIiksICUlInQyIiBcblx0IlwKKyAgICAgICAgIiJvcCIgMjQoInIiLCUlIlJFR19kIiksICUlInQzIiBcblx0IgorCisjZGVmaW5lIHNub3dfdmVydGljYWxfY29tcG9zZV9tbXhfbG9hZChyLHQwLHQxLHQyLHQzKVwKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9sb2FkX2FkZCgibW92cSIscix0MCx0MSx0Mix0MykKKworI2RlZmluZSBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfbW14X2FkZChyLHQwLHQxLHQyLHQzKVwKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9sb2FkX2FkZCgicGFkZHciLHIsdDAsdDEsdDIsdDMpCisKKyNkZWZpbmUgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9zdG9yZSh3LHMwLHMxLHMyLHMzKVwKKyAgICAgICAgIm1vdnEgJSUiczAiLCAoInciLCUlIlJFR19kIikgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSUiczEiLCA4KCJ3IiwlJSJSRUdfZCIpICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSUiczIiLCAxNigidyIsJSUiUkVHX2QiKSBcblx0IlwKKyAgICAgICAgIm1vdnEgJSUiczMiLCAyNCgidyIsJSUiUkVHX2QiKSBcblx0IgorCisjZGVmaW5lIHNub3dfdmVydGljYWxfY29tcG9zZV9tbXhfbW92ZShzMCxzMSxzMixzMyx0MCx0MSx0Mix0MylcCisgICAgICAgICJtb3ZxICUlInMwIiwgJSUidDAiIFxuXHQiXAorICAgICAgICAibW92cSAlJSJzMSIsICUlInQxIiBcblx0IlwKKyAgICAgICAgIm1vdnEgJSUiczIiLCAlJSJ0MiIgXG5cdCJcCisgICAgICAgICJtb3ZxICUlInMzIiwgJSUidDMiIFxuXHQiCisKKworc3RhdGljIHZvaWQgZmZfc25vd192ZXJ0aWNhbF9jb21wb3NlOTdpX21teChJRFdURUxFTSAqYjAsIElEV1RFTEVNICpiMSwgSURXVEVMRU0gKmIyLCBJRFdURUxFTSAqYjMsIElEV1RFTEVNICpiNCwgSURXVEVMRU0gKmI1LCBpbnQgd2lkdGgpeworICAgIHg4Nl9yZWcgaSA9IHdpZHRoOworICAgIHdoaWxlKGkgJiAxNSkKKyAgICB7CisgICAgICAgIGktLTsKKyAgICAgICAgYjRbaV0gLT0gKFdfRE0qKGIzW2ldICsgYjVbaV0pK1dfRE8pPj5XX0RTOworICAgICAgICBiM1tpXSAtPSAoV19DTSooYjJbaV0gKyBiNFtpXSkrV19DTyk+PldfQ1M7CisgICAgICAgIGIyW2ldICs9IChXX0JNKihiMVtpXSArIGIzW2ldKSs0KmIyW2ldK1dfQk8pPj5XX0JTOworICAgICAgICBiMVtpXSArPSAoV19BTSooYjBbaV0gKyBiMltpXSkrV19BTyk+PldfQVM7CisgICAgfQorICAgIGkrPWk7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImptcCAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfbW14X2xvYWQoIiU0IiwibW0xIiwibW0zIiwibW01IiwibW03IikKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9hZGQoIiU2IiwibW0xIiwibW0zIiwibW01IiwibW03IikKKyAgICAgICAgInBjbXBlcXcgICAgJSVtbTAsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcXcgICAgJSVtbTIsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICAgICAgJSVtbTIsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICAgICAgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzbGx3ICAgICAgICAkMTMsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX3Iycl9hZGQoIm1tMCIsIm1tMCIsIm1tMCIsIm1tMCIsIm1tMSIsIm1tMyIsIm1tNSIsIm1tNyIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9yMnJfcG11bGh3KCJtbTIiLCJtbTIiLCJtbTIiLCJtbTIiLCJtbTEiLCJtbTMiLCJtbTUiLCJtbTciKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfbW14X2FkZCgiJTUiLCJtbTEiLCJtbTMiLCJtbTUiLCJtbTciKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfbW14X3N0b3JlKCIlNSIsIm1tMSIsIm1tMyIsIm1tNSIsIm1tNyIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9tbXhfbG9hZCgiJTQiLCJtbTAiLCJtbTIiLCJtbTQiLCJtbTYiKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfbW14X2FkZCgiJTMiLCJtbTEiLCJtbTMiLCJtbTUiLCJtbTciKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfcjJyX3N1YigibW0xIiwibW0zIiwibW01IiwibW03IiwibW0wIiwibW0yIiwibW00IiwibW02IikKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9zdG9yZSgiJTQiLCJtbTAiLCJtbTIiLCJtbTQiLCJtbTYiKQorICAgICAgICAicGNtcGVxdyAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGVxdyAlJW1tNSwgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNsbHcgJDE1LCAlJW1tNyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHcgJDEzLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTcsICUlbW01ICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfcjJyX2FkZCgibW01IiwibW01IiwibW01IiwibW01IiwibW0wIiwibW0yIiwibW00IiwibW02IikKKyAgICAgICAgIm1vdnEgICAoJTIsJSUiUkVHX2QiKSwgJSVtbTEgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgOCglMiwlJSJSRUdfZCIpLCAlJW1tMyAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZndyAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZndyAlJW1tMywgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxIDE2KCUyLCUlIlJFR19kIiksICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgMjQoJTIsJSUiUkVHX2QiKSwgJSVtbTMgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTcsICUlbW0zICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z3cgJSVtbTEsICUlbW00ICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z3cgJSVtbTMsICUlbW02ICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfcjJyX3N1YigibW03IiwibW03IiwibW03IiwibW03IiwibW0wIiwibW0yIiwibW00IiwibW02IikKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX3NyYSgiMSIsIm1tMCIsIm1tMiIsIm1tNCIsIm1tNiIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9tbXhfYWRkKCIlMyIsIm1tMCIsIm1tMiIsIm1tNCIsIm1tNiIpCisKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX3NyYSgiMiIsIm1tMCIsIm1tMiIsIm1tNCIsIm1tNiIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9tbXhfYWRkKCIlMyIsIm1tMCIsIm1tMiIsIm1tNCIsIm1tNiIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9tbXhfc3RvcmUoIiUzIiwibW0wIiwibW0yIiwibW00IiwibW02IikKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9hZGQoIiUxIiwibW0wIiwibW0yIiwibW00IiwibW02IikKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9tb3ZlKCJtbTAiLCJtbTIiLCJtbTQiLCJtbTYiLCJtbTEiLCJtbTMiLCJtbTUiLCJtbTciKQorICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3JhKCIxIiwibW0wIiwibW0yIiwibW00IiwibW02IikKKyAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX3Iycl9hZGQoIm1tMSIsIm1tMyIsIm1tNSIsIm1tNyIsIm1tMCIsIm1tMiIsIm1tNCIsIm1tNiIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9tbXhfYWRkKCIlMiIsIm1tMCIsIm1tMiIsIm1tNCIsIm1tNiIpCisgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9tbXhfc3RvcmUoIiUyIiwibW0wIiwibW0yIiwibW00IiwibW02IikKKworICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICQzMiwgJSUiUkVHX2QiICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiamdlIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IitkIihpKQorICAgICAgICA6InIiKGIwKSwiciIoYjEpLCJyIihiMiksInIiKGIzKSwiciIoYjQpLCJyIihiNSkpOworfQorI2VuZGlmIC8vSEFWRV83UkVHUworCisjaWYgSEFWRV82UkVHUworI2RlZmluZSBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9oZWFkZXIgXAorICAgIElEV1RFTEVNICogKiBkc3RfYXJyYXkgPSBzYi0+bGluZSArIHNyY195O1wKKyAgICB4ODZfcmVnIHRtcDtcCisgICAgX19hc21fXyB2b2xhdGlsZShcCisgICAgICAgICAgICAgIm1vdiAgJTcsICUlIlJFR19jIiAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAibW92ICAlNiwgJTIgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJtb3YgICU0LCAlJSJSRUdfUyIgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgInB4b3IgJSV4bW03LCAlJXhtbTcgICAgICAgICAgICBcblx0IiAvKiAwICovXAorICAgICAgICAgICAgICJwY21wZXFkICUleG1tMywgJSV4bW0zICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgInBzbGx3ICQxNSwgJSV4bW0zICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAicHNybHcgJDEyLCAlJXhtbTMgICAgICAgICAgICAgIFxuXHQiIC8qIEZSQUNfQklUUyA+PiAxICovXAorICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdiAlMSwgJSUiUkVHX0QiICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAibW92ICglJSJSRUdfRCIpLCAlJSJSRUdfRCIgICAgIFxuXHQiXAorICAgICAgICAgICAgICJhZGQgJTMsICUlIlJFR19EIiAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9zdGFydF84KG91dF9yZWcxLCBvdXRfcmVnMiwgcHRyX29mZnNldCwgc19vZmZzZXQpXAorICAgICAgICAgICAgICJtb3YgIlBUUl9TSVpFIioicHRyX29mZnNldCIoJSUiUkVHX2EiKSwgJSUiUkVHX2QiOyBcblx0IlwKKyAgICAgICAgICAgICAibW92cSAoJSUiUkVHX2QiKSwgJSUib3V0X3JlZzEiIFxuXHQiXAorICAgICAgICAgICAgICJtb3ZxICglJSJSRUdfZCIsICUlIlJFR19jIiksICUlIm91dF9yZWcyIiBcblx0IlwKKyAgICAgICAgICAgICAicHVucGNrbGJ3ICUleG1tNywgJSUib3V0X3JlZzEiIFxuXHQiXAorICAgICAgICAgICAgICJwdW5wY2tsYncgJSV4bW03LCAlJSJvdXRfcmVnMiIgXG5cdCJcCisgICAgICAgICAgICAgIm1vdnEgInNfb2Zmc2V0IiglJSJSRUdfUyIpLCAlJXhtbTAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdnEgInNfb2Zmc2V0IisxNiglJSJSRUdfUyIpLCAlJXhtbTQgXG5cdCJcCisgICAgICAgICAgICAgInB1bnBja2xidyAlJXhtbTcsICUleG1tMCAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAicHVucGNrbGJ3ICUleG1tNywgJSV4bW00ICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJwbXVsbHcgJSV4bW0wLCAlJSJvdXRfcmVnMSIgICAgXG5cdCJcCisgICAgICAgICAgICAgInBtdWxsdyAlJXhtbTQsICUlIm91dF9yZWcyIiAgICBcblx0IgorCisjZGVmaW5lIHNub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX3N0YXJ0XzE2KG91dF9yZWcxLCBvdXRfcmVnMiwgcHRyX29mZnNldCwgc19vZmZzZXQpXAorICAgICAgICAgICAgICJtb3YgIlBUUl9TSVpFIioicHRyX29mZnNldCIoJSUiUkVHX2EiKSwgJSUiUkVHX2QiOyBcblx0IlwKKyAgICAgICAgICAgICAibW92cSAoJSUiUkVHX2QiKSwgJSUib3V0X3JlZzEiIFxuXHQiXAorICAgICAgICAgICAgICJtb3ZxIDgoJSUiUkVHX2QiKSwgJSUib3V0X3JlZzIiIFxuXHQiXAorICAgICAgICAgICAgICJwdW5wY2tsYncgJSV4bW03LCAlJSJvdXRfcmVnMSIgXG5cdCJcCisgICAgICAgICAgICAgInB1bnBja2xidyAlJXhtbTcsICUlIm91dF9yZWcyIiBcblx0IlwKKyAgICAgICAgICAgICAibW92cSAic19vZmZzZXQiKCUlIlJFR19TIiksICUleG1tMCBcblx0IlwKKyAgICAgICAgICAgICAibW92cSAic19vZmZzZXQiKzgoJSUiUkVHX1MiKSwgJSV4bW00IFxuXHQiXAorICAgICAgICAgICAgICJwdW5wY2tsYncgJSV4bW03LCAlJXhtbTAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgInB1bnBja2xidyAlJXhtbTcsICUleG1tNCAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAicG11bGx3ICUleG1tMCwgJSUib3V0X3JlZzEiICAgIFxuXHQiXAorICAgICAgICAgICAgICJwbXVsbHcgJSV4bW00LCAlJSJvdXRfcmVnMiIgICAgXG5cdCIKKworI2RlZmluZSBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9hY2N1bV84KHB0cl9vZmZzZXQsIHNfb2Zmc2V0KSBcCisgICAgICAgICAgICAgc25vd19pbm5lcl9hZGRfeWJsb2NrX3NzZTJfc3RhcnRfOCgieG1tMiIsICJ4bW02IiwgcHRyX29mZnNldCwgc19vZmZzZXQpXAorICAgICAgICAgICAgICJwYWRkdXN3ICUleG1tMiwgJSV4bW0xICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgInBhZGR1c3cgJSV4bW02LCAlJXhtbTUgICAgICAgICBcblx0IgorCisjZGVmaW5lIHNub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX2FjY3VtXzE2KHB0cl9vZmZzZXQsIHNfb2Zmc2V0KSBcCisgICAgICAgICAgICAgc25vd19pbm5lcl9hZGRfeWJsb2NrX3NzZTJfc3RhcnRfMTYoInhtbTIiLCAieG1tNiIsIHB0cl9vZmZzZXQsIHNfb2Zmc2V0KVwKKyAgICAgICAgICAgICAicGFkZHVzdyAlJXhtbTIsICUleG1tMSAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJwYWRkdXN3ICUleG1tNiwgJSV4bW01ICAgICAgICAgXG5cdCIKKworI2RlZmluZSBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9lbmRfY29tbW9uMVwKKyAgICAgICAgICAgICAiYWRkICQzMiwgJSUiUkVHX1MiICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJhZGQgJSUiUkVHX2MiLCAlMCAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgImFkZCAlJSJSRUdfYyIsICJQVFJfU0laRSIqMyglJSJSRUdfYSIpO1xuXHQiXAorICAgICAgICAgICAgICJhZGQgJSUiUkVHX2MiLCAiUFRSX1NJWkUiKjIoJSUiUkVHX2EiKTtcblx0IlwKKyAgICAgICAgICAgICAiYWRkICUlIlJFR19jIiwgIlBUUl9TSVpFIioxKCUlIlJFR19hIik7XG5cdCJcCisgICAgICAgICAgICAgImFkZCAlJSJSRUdfYyIsICglJSJSRUdfYSIpICAgICBcblx0IgorCisjZGVmaW5lIHNub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX2VuZF9jb21tb24yXAorICAgICAgICAgICAgICJqbnogMWIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgOiIrbSIoZHN0OCksIittIihkc3RfYXJyYXkpLCI9JnIiKHRtcClcCisgICAgICAgICAgICAgOlwKKyAgICAgICAgICAgICAicm0iKCh4ODZfcmVnKShzcmNfeDw8MSkpLCJtIihvYm1jKSwiYSIoYmxvY2spLCJtIihiX2gpLCJtIihzcmNfc3RyaWRlKTpcCisgICAgICAgICAgICAgWE1NX0NMT0JCRVJTKCIleG1tMCIsICIleG1tMSIsICIleG1tMiIsICIleG1tMyIsICIleG1tNCIsICIleG1tNSIsICIleG1tNiIsICIleG1tNyIsIClcCisgICAgICAgICAgICAgIiUiUkVHX2MiIiwiJSJSRUdfUyIiLCIlIlJFR19EIiIsIiUiUkVHX2QiIik7CisKKyNkZWZpbmUgc25vd19pbm5lcl9hZGRfeWJsb2NrX3NzZTJfZW5kXzhcCisgICAgICAgICAgICAgInNhbCAkMSwgJSUiUkVHX2MiICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAiYWRkIk9QU0laRSIgJCJQVFJfU0laRSIqMiwgJTEgIFxuXHQiXAorICAgICAgICAgICAgIHNub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX2VuZF9jb21tb24xXAorICAgICAgICAgICAgICJzYXIgJDEsICUlIlJFR19jIiAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgInN1YiAkMiwgJTIgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9lbmRfY29tbW9uMgorCisjZGVmaW5lIHNub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX2VuZF8xNlwKKyAgICAgICAgICAgICAiYWRkIk9QU0laRSIgJCJQVFJfU0laRSIqMSwgJTEgIFxuXHQiXAorICAgICAgICAgICAgIHNub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX2VuZF9jb21tb24xXAorICAgICAgICAgICAgICJkZWMgJTIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgc25vd19pbm5lcl9hZGRfeWJsb2NrX3NzZTJfZW5kX2NvbW1vbjIKKworc3RhdGljIHZvaWQgaW5uZXJfYWRkX3libG9ja19id184X29ibWNfMTZfYmhfZXZlbl9zc2UyKGNvbnN0IHVpbnQ4X3QgKm9ibWMsIGNvbnN0IHg4Nl9yZWcgb2JtY19zdHJpZGUsIHVpbnQ4X3QgKiAqIGJsb2NrLCBpbnQgYl93LCB4ODZfcmVnIGJfaCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgeDg2X3JlZyBzcmNfc3RyaWRlLCBzbGljZV9idWZmZXIgKiBzYiwgaW50IGFkZCwgdWludDhfdCAqIGRzdDgpeworc25vd19pbm5lcl9hZGRfeWJsb2NrX3NzZTJfaGVhZGVyCitzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9zdGFydF84KCJ4bW0xIiwgInhtbTUiLCAiMyIsICIwIikKK3Nub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX2FjY3VtXzgoIjIiLCAiOCIpCitzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9hY2N1bV84KCIxIiwgIjEyOCIpCitzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9hY2N1bV84KCIwIiwgIjEzNiIpCisKKyAgICAgICAgICAgICAibW92ICUwLCAlJSJSRUdfZCIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1vdmRxYSAoJSUiUkVHX0QiKSwgJSV4bW0wICAgICBcblx0IgorICAgICAgICAgICAgICJtb3ZkcWEgJSV4bW0xLCAlJXhtbTIgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICJwdW5wY2tod2QgJSV4bW03LCAlJXhtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAicHVucGNrbHdkICUleG1tNywgJSV4bW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInBhZGRkICUleG1tMiwgJSV4bW0wICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtb3ZkcWEgMTYoJSUiUkVHX0QiKSwgJSV4bW0yICAgXG5cdCIKKyAgICAgICAgICAgICAicGFkZGQgJSV4bW0xLCAlJXhtbTIgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInBhZGRkICUleG1tMywgJSV4bW0wICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJwYWRkZCAlJXhtbTMsICUleG1tMiAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICJtb3YgJTEsICUlIlJFR19EIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibW92ICJQVFJfU0laRSIoJSUiUkVHX0QiKSwgJSUiUkVHX0QiO1xuXHQiCisgICAgICAgICAgICAgImFkZCAlMywgJSUiUkVHX0QiICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAgIm1vdmRxYSAoJSUiUkVHX0QiKSwgJSV4bW00ICAgICBcblx0IgorICAgICAgICAgICAgICJtb3ZkcWEgJSV4bW01LCAlJXhtbTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAicHVucGNraHdkICUleG1tNywgJSV4bW01ICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInB1bnBja2x3ZCAlJXhtbTcsICUleG1tNiAgICAgICBcblx0IgorICAgICAgICAgICAgICJwYWRkZCAlJXhtbTYsICUleG1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibW92ZHFhIDE2KCUlIlJFR19EIiksICUleG1tNiAgIFxuXHQiCisgICAgICAgICAgICAgInBhZGRkICUleG1tNSwgJSV4bW02ICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJwYWRkZCAlJXhtbTMsICUleG1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAicGFkZGQgJSV4bW0zLCAlJXhtbTYgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAicHNyYWQgJDgsICUleG1tMCAgICAgICAgICAgICAgIFxuXHQiIC8qIEZSQUNfQklUUy4gKi8KKyAgICAgICAgICAgICAicHNyYWQgJDgsICUleG1tMiAgICAgICAgICAgICAgIFxuXHQiIC8qIEZSQUNfQklUUy4gKi8KKyAgICAgICAgICAgICAicGFja3NzZHcgJSV4bW0yLCAlJXhtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInBhY2t1c3diICUleG1tNywgJSV4bW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtb3ZxICUleG1tMCwgKCUlIlJFR19kIikgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICJwc3JhZCAkOCwgJSV4bW00ICAgICAgICAgICAgICAgXG5cdCIgLyogRlJBQ19CSVRTLiAqLworICAgICAgICAgICAgICJwc3JhZCAkOCwgJSV4bW02ICAgICAgICAgICAgICAgXG5cdCIgLyogRlJBQ19CSVRTLiAqLworICAgICAgICAgICAgICJwYWNrc3NkdyAlJXhtbTYsICUleG1tNCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAicGFja3Vzd2IgJSV4bW03LCAlJXhtbTQgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1vdnEgJSV4bW00LCAoJSUiUkVHX2QiLCUlIlJFR19jIik7XG5cdCIKK3Nub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX2VuZF84Cit9CisKK3N0YXRpYyB2b2lkIGlubmVyX2FkZF95YmxvY2tfYndfMTZfb2JtY18zMl9zc2UyKGNvbnN0IHVpbnQ4X3QgKm9ibWMsIGNvbnN0IHg4Nl9yZWcgb2JtY19zdHJpZGUsIHVpbnQ4X3QgKiAqIGJsb2NrLCBpbnQgYl93LCB4ODZfcmVnIGJfaCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgeDg2X3JlZyBzcmNfc3RyaWRlLCBzbGljZV9idWZmZXIgKiBzYiwgaW50IGFkZCwgdWludDhfdCAqIGRzdDgpeworc25vd19pbm5lcl9hZGRfeWJsb2NrX3NzZTJfaGVhZGVyCitzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9zdGFydF8xNigieG1tMSIsICJ4bW01IiwgIjMiLCAiMCIpCitzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9hY2N1bV8xNigiMiIsICIxNiIpCitzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9hY2N1bV8xNigiMSIsICI1MTIiKQorc25vd19pbm5lcl9hZGRfeWJsb2NrX3NzZTJfYWNjdW1fMTYoIjAiLCAiNTI4IikKKworICAgICAgICAgICAgICJtb3YgJTAsICUlIlJFR19kIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAicHNybHcgJDQsICUleG1tMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInBzcmx3ICQ0LCAlJXhtbTUgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJwYWRkdyAgICglJSJSRUdfRCIpLCAlJXhtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICAicGFkZHcgMTYoJSUiUkVHX0QiKSwgJSV4bW01ICAgIFxuXHQiCisgICAgICAgICAgICAgInBhZGR3ICUleG1tMywgJSV4bW0xICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJwYWRkdyAlJXhtbTMsICUleG1tNSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAicHNyYXcgJDQsICUleG1tMSAgICAgICAgICAgICAgIFxuXHQiIC8qIEZSQUNfQklUUy4gKi8KKyAgICAgICAgICAgICAicHNyYXcgJDQsICUleG1tNSAgICAgICAgICAgICAgIFxuXHQiIC8qIEZSQUNfQklUUy4gKi8KKyAgICAgICAgICAgICAicGFja3Vzd2IgJSV4bW01LCAlJXhtbTEgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAibW92ZHF1ICUleG1tMSwgKCUlIlJFR19kIikgICAgICAgXG5cdCIKKworc25vd19pbm5lcl9hZGRfeWJsb2NrX3NzZTJfZW5kXzE2Cit9CisKKyNkZWZpbmUgc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9oZWFkZXIgXAorICAgIElEV1RFTEVNICogKiBkc3RfYXJyYXkgPSBzYi0+bGluZSArIHNyY195O1wKKyAgICB4ODZfcmVnIHRtcDtcCisgICAgX19hc21fXyB2b2xhdGlsZShcCisgICAgICAgICAgICAgIm1vdiAgJTcsICUlIlJFR19jIiAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAibW92ICAlNiwgJTIgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJtb3YgICU0LCAlJSJSRUdfUyIgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICBcblx0IiAvKiAwICovXAorICAgICAgICAgICAgICJwY21wZXFkICUlbW0zLCAlJW1tMyAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgInBzbGx3ICQxNSwgJSVtbTMgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAicHNybHcgJDEyLCAlJW1tMyAgICAgICAgICAgICAgIFxuXHQiIC8qIEZSQUNfQklUUyA+PiAxICovXAorICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdiAlMSwgJSUiUkVHX0QiICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAibW92ICglJSJSRUdfRCIpLCAlJSJSRUdfRCIgICAgIFxuXHQiXAorICAgICAgICAgICAgICJhZGQgJTMsICUlIlJFR19EIiAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBzbm93X2lubmVyX2FkZF95YmxvY2tfbW14X3N0YXJ0KG91dF9yZWcxLCBvdXRfcmVnMiwgcHRyX29mZnNldCwgc19vZmZzZXQsIGRfb2Zmc2V0KVwKKyAgICAgICAgICAgICAibW92ICJQVFJfU0laRSIqInB0cl9vZmZzZXQiKCUlIlJFR19hIiksICUlIlJFR19kIjsgXG5cdCJcCisgICAgICAgICAgICAgIm1vdmQgImRfb2Zmc2V0IiglJSJSRUdfZCIpLCAlJSJvdXRfcmVnMSIgXG5cdCJcCisgICAgICAgICAgICAgIm1vdmQgImRfb2Zmc2V0Iis0KCUlIlJFR19kIiksICUlIm91dF9yZWcyIiBcblx0IlwKKyAgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJSJvdXRfcmVnMSIgXG5cdCJcCisgICAgICAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSUib3V0X3JlZzIiIFxuXHQiXAorICAgICAgICAgICAgICJtb3ZkICJzX29mZnNldCIoJSUiUkVHX1MiKSwgJSVtbTAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdmQgInNfb2Zmc2V0Iis0KCUlIlJFR19TIiksICUlbW00IFxuXHQiXAorICAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0wICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW00ICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJwbXVsbHcgJSVtbTAsICUlIm91dF9yZWcxIiAgICBcblx0IlwKKyAgICAgICAgICAgICAicG11bGx3ICUlbW00LCAlJSJvdXRfcmVnMiIgICAgXG5cdCIKKworI2RlZmluZSBzbm93X2lubmVyX2FkZF95YmxvY2tfbW14X2FjY3VtKHB0cl9vZmZzZXQsIHNfb2Zmc2V0LCBkX29mZnNldCkgXAorICAgICAgICAgICAgIHNub3dfaW5uZXJfYWRkX3libG9ja19tbXhfc3RhcnQoIm1tMiIsICJtbTYiLCBwdHJfb2Zmc2V0LCBzX29mZnNldCwgZF9vZmZzZXQpXAorICAgICAgICAgICAgICJwYWRkdXN3ICUlbW0yLCAlJW1tMSAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJwYWRkdXN3ICUlbW02LCAlJW1tNSAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9taXgocmVhZF9vZmZzZXQsIHdyaXRlX29mZnNldClcCisgICAgICAgICAgICAgIm1vdiAlMCwgJSUiUkVHX2QiICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAicHNybHcgJDQsICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJwc3JsdyAkNCwgJSVtbTUgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgInBhZGR3ICJyZWFkX29mZnNldCIoJSUiUkVHX0QiKSwgJSVtbTEgXG5cdCJcCisgICAgICAgICAgICAgInBhZGR3ICJyZWFkX29mZnNldCIrOCglJSJSRUdfRCIpLCAlJW1tNSBcblx0IlwKKyAgICAgICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTUgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgInBzcmF3ICQ0LCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAicHNyYXcgJDQsICUlbW01ICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJwYWNrdXN3YiAlJW1tNSwgJSVtbTEgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdnEgJSVtbTEsICJ3cml0ZV9vZmZzZXQiKCUlIlJFR19kIikgXG5cdCIKKworI2RlZmluZSBzbm93X2lubmVyX2FkZF95YmxvY2tfbW14X2VuZChzX3N0ZXApXAorICAgICAgICAgICAgICJhZGQgJCJzX3N0ZXAiLCAlJSJSRUdfUyIgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgImFkZCAlJSJSRUdfYyIsICJQVFJfU0laRSIqMyglJSJSRUdfYSIpO1xuXHQiXAorICAgICAgICAgICAgICJhZGQgJSUiUkVHX2MiLCAiUFRSX1NJWkUiKjIoJSUiUkVHX2EiKTtcblx0IlwKKyAgICAgICAgICAgICAiYWRkICUlIlJFR19jIiwgIlBUUl9TSVpFIioxKCUlIlJFR19hIik7XG5cdCJcCisgICAgICAgICAgICAgImFkZCAlJSJSRUdfYyIsICglJSJSRUdfYSIpICAgICBcblx0IlwKKyAgICAgICAgICAgICAiYWRkIk9QU0laRSAiICQiUFRSX1NJWkUiKjEsICUxIFxuXHQiXAorICAgICAgICAgICAgICJhZGQgJSUiUkVHX2MiLCAlMCAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgImRlYyAlMiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAiam56IDFiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgIDoiK20iKGRzdDgpLCIrbSIoZHN0X2FycmF5KSwiPSZyIih0bXApXAorICAgICAgICAgICAgIDpcCisgICAgICAgICAgICAgInJtIigoeDg2X3JlZykoc3JjX3g8PDEpKSwibSIob2JtYyksImEiKGJsb2NrKSwibSIoYl9oKSwibSIoc3JjX3N0cmlkZSk6XAorICAgICAgICAgICAgICIlIlJFR19jIiIsIiUiUkVHX1MiIiwiJSJSRUdfRCIiLCIlIlJFR19kIiIpOworCitzdGF0aWMgdm9pZCBpbm5lcl9hZGRfeWJsb2NrX2J3Xzhfb2JtY18xNl9tbXgoY29uc3QgdWludDhfdCAqb2JtYywgY29uc3QgeDg2X3JlZyBvYm1jX3N0cmlkZSwgdWludDhfdCAqICogYmxvY2ssIGludCBiX3csIHg4Nl9yZWcgYl9oLAorICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfeCwgaW50IHNyY195LCB4ODZfcmVnIHNyY19zdHJpZGUsIHNsaWNlX2J1ZmZlciAqIHNiLCBpbnQgYWRkLCB1aW50OF90ICogZHN0OCl7Citzbm93X2lubmVyX2FkZF95YmxvY2tfbW14X2hlYWRlcgorc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9zdGFydCgibW0xIiwgIm1tNSIsICIzIiwgIjAiLCAiMCIpCitzbm93X2lubmVyX2FkZF95YmxvY2tfbW14X2FjY3VtKCIyIiwgIjgiLCAiMCIpCitzbm93X2lubmVyX2FkZF95YmxvY2tfbW14X2FjY3VtKCIxIiwgIjEyOCIsICIwIikKK3Nub3dfaW5uZXJfYWRkX3libG9ja19tbXhfYWNjdW0oIjAiLCAiMTM2IiwgIjAiKQorc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9taXgoIjAiLCAiMCIpCitzbm93X2lubmVyX2FkZF95YmxvY2tfbW14X2VuZCgiMTYiKQorfQorCitzdGF0aWMgdm9pZCBpbm5lcl9hZGRfeWJsb2NrX2J3XzE2X29ibWNfMzJfbW14KGNvbnN0IHVpbnQ4X3QgKm9ibWMsIGNvbnN0IHg4Nl9yZWcgb2JtY19zdHJpZGUsIHVpbnQ4X3QgKiAqIGJsb2NrLCBpbnQgYl93LCB4ODZfcmVnIGJfaCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgeDg2X3JlZyBzcmNfc3RyaWRlLCBzbGljZV9idWZmZXIgKiBzYiwgaW50IGFkZCwgdWludDhfdCAqIGRzdDgpeworc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9oZWFkZXIKK3Nub3dfaW5uZXJfYWRkX3libG9ja19tbXhfc3RhcnQoIm1tMSIsICJtbTUiLCAiMyIsICIwIiwgIjAiKQorc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9hY2N1bSgiMiIsICIxNiIsICIwIikKK3Nub3dfaW5uZXJfYWRkX3libG9ja19tbXhfYWNjdW0oIjEiLCAiNTEyIiwgIjAiKQorc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9hY2N1bSgiMCIsICI1MjgiLCAiMCIpCitzbm93X2lubmVyX2FkZF95YmxvY2tfbW14X21peCgiMCIsICIwIikKKworc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9zdGFydCgibW0xIiwgIm1tNSIsICIzIiwgIjgiLCAiOCIpCitzbm93X2lubmVyX2FkZF95YmxvY2tfbW14X2FjY3VtKCIyIiwgIjI0IiwgIjgiKQorc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9hY2N1bSgiMSIsICI1MjAiLCAiOCIpCitzbm93X2lubmVyX2FkZF95YmxvY2tfbW14X2FjY3VtKCIwIiwgIjUzNiIsICI4IikKK3Nub3dfaW5uZXJfYWRkX3libG9ja19tbXhfbWl4KCIxNiIsICI4IikKK3Nub3dfaW5uZXJfYWRkX3libG9ja19tbXhfZW5kKCIzMiIpCit9CisKK3N0YXRpYyB2b2lkIGZmX3Nub3dfaW5uZXJfYWRkX3libG9ja19zc2UyKGNvbnN0IHVpbnQ4X3QgKm9ibWMsIGNvbnN0IGludCBvYm1jX3N0cmlkZSwgdWludDhfdCAqICogYmxvY2ssIGludCBiX3csIGludCBiX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IHNyY19zdHJpZGUsIHNsaWNlX2J1ZmZlciAqIHNiLCBpbnQgYWRkLCB1aW50OF90ICogZHN0OCl7CisKKyAgICBpZiAoYl93ID09IDE2KQorICAgICAgICBpbm5lcl9hZGRfeWJsb2NrX2J3XzE2X29ibWNfMzJfc3NlMihvYm1jLCBvYm1jX3N0cmlkZSwgYmxvY2ssIGJfdywgYl9oLCBzcmNfeCxzcmNfeSwgc3JjX3N0cmlkZSwgc2IsIGFkZCwgZHN0OCk7CisgICAgZWxzZSBpZiAoYl93ID09IDggJiYgb2JtY19zdHJpZGUgPT0gMTYpIHsKKyAgICAgICAgaWYgKCEoYl9oICYgMSkpCisgICAgICAgICAgICBpbm5lcl9hZGRfeWJsb2NrX2J3Xzhfb2JtY18xNl9iaF9ldmVuX3NzZTIob2JtYywgb2JtY19zdHJpZGUsIGJsb2NrLCBiX3csIGJfaCwgc3JjX3gsc3JjX3ksIHNyY19zdHJpZGUsIHNiLCBhZGQsIGRzdDgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbm5lcl9hZGRfeWJsb2NrX2J3Xzhfb2JtY18xNl9tbXgob2JtYywgb2JtY19zdHJpZGUsIGJsb2NrLCBiX3csIGJfaCwgc3JjX3gsc3JjX3ksIHNyY19zdHJpZGUsIHNiLCBhZGQsIGRzdDgpOworICAgIH0gZWxzZQorICAgICAgICAgZmZfc25vd19pbm5lcl9hZGRfeWJsb2NrKG9ibWMsIG9ibWNfc3RyaWRlLCBibG9jaywgYl93LCBiX2gsIHNyY194LHNyY195LCBzcmNfc3RyaWRlLCBzYiwgYWRkLCBkc3Q4KTsKK30KKworc3RhdGljIHZvaWQgZmZfc25vd19pbm5lcl9hZGRfeWJsb2NrX21teChjb25zdCB1aW50OF90ICpvYm1jLCBjb25zdCBpbnQgb2JtY19zdHJpZGUsIHVpbnQ4X3QgKiAqIGJsb2NrLCBpbnQgYl93LCBpbnQgYl9oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IHNyY19zdHJpZGUsIHNsaWNlX2J1ZmZlciAqIHNiLCBpbnQgYWRkLCB1aW50OF90ICogZHN0OCl7CisgICAgaWYgKGJfdyA9PSAxNikKKyAgICAgICAgaW5uZXJfYWRkX3libG9ja19id18xNl9vYm1jXzMyX21teChvYm1jLCBvYm1jX3N0cmlkZSwgYmxvY2ssIGJfdywgYl9oLCBzcmNfeCxzcmNfeSwgc3JjX3N0cmlkZSwgc2IsIGFkZCwgZHN0OCk7CisgICAgZWxzZSBpZiAoYl93ID09IDggJiYgb2JtY19zdHJpZGUgPT0gMTYpCisgICAgICAgIGlubmVyX2FkZF95YmxvY2tfYndfOF9vYm1jXzE2X21teChvYm1jLCBvYm1jX3N0cmlkZSwgYmxvY2ssIGJfdywgYl9oLCBzcmNfeCxzcmNfeSwgc3JjX3N0cmlkZSwgc2IsIGFkZCwgZHN0OCk7CisgICAgZWxzZQorICAgICAgICBmZl9zbm93X2lubmVyX2FkZF95YmxvY2sob2JtYywgb2JtY19zdHJpZGUsIGJsb2NrLCBiX3csIGJfaCwgc3JjX3gsc3JjX3ksIHNyY19zdHJpZGUsIHNiLCBhZGQsIGRzdDgpOworfQorI2VuZGlmIC8qIEhBVkVfNlJFR1MgKi8KKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCit2b2lkIGZmX2R3dF9pbml0X3g4NihTbm93RFdUQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFX0lOTElORV9BU00KKyAgICBpbnQgbW1fZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAobW1fZmxhZ3MgJiBBVl9DUFVfRkxBR19NTVgpIHsKKyAgICAgICAgaWYobW1fZmxhZ3MgJiBBVl9DUFVfRkxBR19TU0UyICYgMCl7CisgICAgICAgICAgICBjLT5ob3Jpem9udGFsX2NvbXBvc2U5N2kgPSBmZl9zbm93X2hvcml6b250YWxfY29tcG9zZTk3aV9zc2UyOworI2lmIEhBVkVfN1JFR1MKKyAgICAgICAgICAgIGMtPnZlcnRpY2FsX2NvbXBvc2U5N2kgPSBmZl9zbm93X3ZlcnRpY2FsX2NvbXBvc2U5N2lfc3NlMjsKKyNlbmRpZgorI2lmIEhBVkVfNlJFR1MKKyAgICAgICAgICAgIGMtPmlubmVyX2FkZF95YmxvY2sgPSBmZl9zbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMjsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICBpZiAobW1fZmxhZ3MgJiBBVl9DUFVfRkxBR19NTVhFWFQpIHsKKyAgICAgICAgICAgIGMtPmhvcml6b250YWxfY29tcG9zZTk3aSA9IGZmX3Nub3dfaG9yaXpvbnRhbF9jb21wb3NlOTdpX21teDsKKyNpZiBIQVZFXzdSRUdTCisgICAgICAgICAgICBjLT52ZXJ0aWNhbF9jb21wb3NlOTdpID0gZmZfc25vd192ZXJ0aWNhbF9jb21wb3NlOTdpX21teDsKKyNlbmRpZgorICAgICAgICAgICAgfQorI2lmIEhBVkVfNlJFR1MKKyAgICAgICAgICAgIGMtPmlubmVyX2FkZF95YmxvY2sgPSBmZl9zbm93X2lubmVyX2FkZF95YmxvY2tfbW14OworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvc3ZxMWVuYy5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvc3ZxMWVuYy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlZTcwZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni9zdnExZW5jLmFzbQpAQCAtMCwwICsxLDYxIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBTSU1ELW9wdGltaXplZCBTVlExIGVuY29kZXIgZnVuY3Rpb25zCis7KiBDb3B5cmlnaHQgKGMpIDIwMDcgTG9yZW4gTWVycml0dAorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fVEVYVAorCislbWFjcm8gU1NEX0lOVDhfVlNfSU5UMTYgMAorY2dsb2JhbCBzc2RfaW50OF92c19pbnQxNiwgMywgMywgMywgcGl4MSwgcGl4Miwgc2l6ZQorICAgIHB4b3IgbTAsIG0wCisubG9vcAorICAgIHN1YiAgICAgICBzaXplcSwgOAorICAgIG1vdnEgICAgICBtMSwgW3BpeDFxICsgc2l6ZXFdCisgICAgbW92YSAgICAgIG0yLCBbcGl4MnEgKyBzaXplcSoyXQorJWlmIG1tc2l6ZSA9PSA4CisgICAgbW92cSAgICAgIG0zLCBbcGl4MnEgKyBzaXplcSoyICsgbW1zaXplXQorICAgIHB1bnBja2hidyBtNCwgbTEKKyAgICBwdW5wY2tsYncgbTEsIG0xCisgICAgcHNyYXcgICAgIG00LCA4CisgICAgcHNyYXcgICAgIG0xLCA4CisgICAgcHN1YncgICAgIG0zLCBtNAorICAgIHBzdWJ3ICAgICBtMiwgbTEKKyAgICBwbWFkZHdkICAgbTMsIG0zCisgICAgcG1hZGR3ZCAgIG0yLCBtMgorICAgIHBhZGRkICAgICBtMCwgbTMKKyAgICBwYWRkZCAgICAgbTAsIG0yCislZWxzZQorICAgIHB1bnBja2xidyBtMSwgbTEKKyAgICBwc3JhdyAgICAgbTEsIDgKKyAgICBwc3VidyAgICAgbTIsIG0xCisgICAgcG1hZGR3ZCAgIG0yLCBtMgorICAgIHBhZGRkICAgICBtMCwgbTIKKyVlbmRpZgorICAgIGpnIC5sb29wCisgICAgSEFEREQgICAgIG0wLCBtMQorICAgIG1vdmQgICAgIGVheCwgbTAKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK1NTRF9JTlQ4X1ZTX0lOVDE2CitJTklUX1hNTSBzc2UyCitTU0RfSU5UOF9WU19JTlQxNgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3N2cTFlbmNfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3N2cTFlbmNfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYjRiMGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvc3ZxMWVuY19pbml0LmMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBMb3JlbiBNZXJyaXR0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvc3ZxMWVuYy5oIgorCitpbnQgZmZfc3NkX2ludDhfdnNfaW50MTZfbW14KGNvbnN0IGludDhfdCAqcGl4MSwgY29uc3QgaW50MTZfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgc2l6ZSk7CitpbnQgZmZfc3NkX2ludDhfdnNfaW50MTZfc3NlMihjb25zdCBpbnQ4X3QgKnBpeDEsIGNvbnN0IGludDE2X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBzaXplKTsKKworYXZfY29sZCB2b2lkIGZmX3N2cTFlbmNfaW5pdF94ODYoU1ZRMUVuY0NvbnRleHQgKmMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5zc2RfaW50OF92c19pbnQxNiA9IGZmX3NzZF9pbnQ4X3ZzX2ludDE2X21teDsKKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5zc2RfaW50OF92c19pbnQxNiA9IGZmX3NzZF9pbnQ4X3ZzX2ludDE2X3NzZTI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3R0YWRzcC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdHRhZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQ4OTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3R0YWRzcC5hc20KQEAgLTAsMCArMSwxMTkgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIFRUQSBEU1AgU0lNRCBvcHRpbWl6YXRpb25zCis7KgorOyogQ29weXJpZ2h0IChDKSAyMDE0IEphbWVzIEFsbWVyCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworcGRfbjAxMTM6IGRkIH4wLCB+MSwgfjEsIH4zCitwZF8xMjI0OiAgZGQgMSwgMiwgMiwgNAorCitTRUNUSU9OIC50ZXh0CisKKyVtYWNybyBUVEFfRklMVEVSIDIKK0lOSVRfWE1NICUxCitjZ2xvYmFsIHR0YWZpbHRlcl9wcm9jZXNzX2RlYywgNSw1LCUyLCBxbSwgZHgsIGRsLCBlcnJvciwgaW4sIHNoaWZ0LCByb3VuZAorICAgIG1vdmEgICAgICAgbTIsIFtxbXEgICAgICAgXQorICAgIG1vdmEgICAgICAgbTMsIFtxbXEgKyAweDEwXQorICAgIG1vdmEgICAgICAgbTQsIFtkeHEgICAgICAgXQorICAgIG1vdmEgICAgICAgbTUsIFtkeHEgKyAweDEwXQorCisgICAgbW92ZCAgICAgICBtNiwgW2Vycm9ycV0gICAgICAgICA7IGlmIChmaWx0ZXItPmVycm9yIDwgMCkgeworICAgIFNQTEFURCAgICAgbTYgICAgICAgICAgICAgICAgICAgOyAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspCisgICAgcHNpZ25kICAgICBtMCwgbTQsIG02ICAgICAgICAgICA7ICAgICAgICAgZmlsdGVyLT5xbVtpXSAtPSBmaWx0ZXItPmR4W2ldOworICAgIHBzaWduZCAgICAgbTEsIG01LCBtNiAgICAgICAgICAgOyB9IGVsc2UgaWYgKGZpbHRlci0+ZXJyb3IgPiAwKSB7CisgICAgcGFkZGQgICAgICBtMiwgbTAgICAgICAgICAgICAgICA7ICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykKKyAgICBwYWRkZCAgICAgIG0zLCBtMSAgICAgICAgICAgICAgIDsgICAgICAgICBmaWx0ZXItPnFtW2ldICs9IGZpbHRlci0+ZHhbaV07CisgICAgbW92YSAgICAgICBbcW1xICAgICAgIF0sIG0yICAgICA7IH0KKyAgICBtb3ZhICAgICAgIFtxbXEgKyAweDEwXSwgbTMgICAgIDsKKworICAgIG1vdmEgICAgICAgbTAsIFtkbHEgICAgICAgXQorICAgIG1vdmEgICAgICAgbTEsIFtkbHEgKyAweDEwXQorCislaWYgY3B1ZmxhZyhzc2U0KQorICAgIHBtdWxsZCAgICAgbTIsIG0wCisgICAgcG11bGxkICAgICBtMywgbTEKKyVlbHNlCisgICAgcHNodWZkICAgICBtNiwgbTAsIDB4YjEKKyAgICBwc2h1ZmQgICAgIG03LCBtMiwgMHhiMQorICAgIHBtdWx1ZHEgICAgbTYsIG03CisgICAgcHNodWZkICAgICBtNiwgbTYsIDB4ZDgKKyAgICBwbXVsdWRxICAgIG0yLCBtMAorICAgIHBzaHVmZCAgICAgbTIsIG0yLCAweGQ4CisgICAgcHVucGNrbGRxICBtMiwgbTYKKworICAgIHBzaHVmZCAgICAgbTYsIG0xLCAweGIxCisgICAgcHNodWZkICAgICBtNywgbTMsIDB4YjEKKyAgICBwbXVsdWRxICAgIG02LCBtNworICAgIHBzaHVmZCAgICAgbTYsIG02LCAweGQ4CisgICAgcG11bHVkcSAgICBtMywgbTEKKyAgICBwc2h1ZmQgICAgIG0zLCBtMywgMHhkOAorICAgIHB1bnBja2xkcSAgbTMsIG02CislZW5kaWYKKyAgICA7IFVzaW5nIGhvcml6b250YWwgYWRkIChwaGFkZGQpIHNlZW1zIHRvIGJlIHNsb3dlciB0aGFuIHNodWZmbGluZyBzdHVmZiBhcm91bmQKKyAgICBwYWRkZCAgICAgIG0yLCBtMyAgICAgICAgICAgICAgIDsgaW50IHN1bSA9IGZpbHRlci0+cm91bmQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgZmlsdGVyLT5kbFswXSAqIGZpbHRlci0+cW1bMF0gKworICAgIHBzaHVmZCAgICAgbTMsIG0yLCAweGUgICAgICAgICAgOyAgICAgICAgICAgZmlsdGVyLT5kbFsxXSAqIGZpbHRlci0+cW1bMV0gKworICAgIHBhZGRkICAgICAgbTIsIG0zICAgICAgICAgICAgICAgOyAgICAgICAgICAgZmlsdGVyLT5kbFsyXSAqIGZpbHRlci0+cW1bMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgZmlsdGVyLT5kbFszXSAqIGZpbHRlci0+cW1bM10gKworICAgIG1vdmQgICAgICAgbTYsIHJvdW5kbSAgICAgICAgICAgOyAgICAgICAgICAgZmlsdGVyLT5kbFs0XSAqIGZpbHRlci0+cW1bNF0gKworICAgIHBhZGRkICAgICAgbTYsIG0yICAgICAgICAgICAgICAgOyAgICAgICAgICAgZmlsdGVyLT5kbFs1XSAqIGZpbHRlci0+cW1bNV0gKworICAgIHBzaHVmZCAgICAgbTIsIG0yLCAweDEgICAgICAgICAgOyAgICAgICAgICAgZmlsdGVyLT5kbFs2XSAqIGZpbHRlci0+cW1bNl0gKworICAgIHBhZGRkICAgICAgbTYsIG0yICAgICAgICAgICAgICAgOyAgICAgICAgICAgZmlsdGVyLT5kbFs3XSAqIGZpbHRlci0+cW1bN107CisKKyAgICBwYWxpZ25yICAgIG01LCBtNCwgNCAgICAgICAgICAgIDsgZmlsdGVyLT5keFswXSA9IGZpbHRlci0+ZHhbMV07IGZpbHRlci0+ZHhbMV0gPSBmaWx0ZXItPmR4WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBmaWx0ZXItPmR4WzJdID0gZmlsdGVyLT5keFszXTsgZmlsdGVyLT5keFszXSA9IGZpbHRlci0+ZHhbNF07CisKKyAgICBwYWxpZ25yICAgIG0yLCBtMSwgbTAsIDQgICAgICAgIDsgZmlsdGVyLT5kbFswXSA9IGZpbHRlci0+ZGxbMV07IGZpbHRlci0+ZGxbMV0gPSBmaWx0ZXItPmRsWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBmaWx0ZXItPmRsWzJdID0gZmlsdGVyLT5kbFszXTsgZmlsdGVyLT5kbFszXSA9IGZpbHRlci0+ZGxbNF07CisKKyAgICBwc3JhZCAgICAgIG00LCBtMSwgMzAgICAgICAgICAgIDsgZmlsdGVyLT5keFs0XSA9ICgoZmlsdGVyLT5kbFs0XSA+PiAzMCkgfCAxKTsKKyAgICBwb3IgICAgICAgIG00LCBbcGRfMTIyNCBdICAgICAgIDsgZmlsdGVyLT5keFs1XSA9ICgoZmlsdGVyLT5kbFs1XSA+PiAzMCkgfCAyKSAmIH4xOworICAgIHBhbmQgICAgICAgbTQsIFtwZF9uMDExM10gICAgICAgOyBmaWx0ZXItPmR4WzZdID0gKChmaWx0ZXItPmRsWzZdID4+IDMwKSB8IDIpICYgfjE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGZpbHRlci0+ZHhbN10gPSAoKGZpbHRlci0+ZGxbN10gPj4gMzApIHwgNCkgJiB+MzsKKworICAgIG1vdmEgICAgICAgW2RscSAgICAgICBdLCBtMgorICAgIG1vdmEgICAgICAgW2R4cSAgICAgICBdLCBtNQorICAgIG1vdmEgICAgICAgW2R4cSArIDB4MTBdLCBtNAorICAgIG1vdmQgICAgICAgbTAsIFtpbnFdICAgICAgICAgICAgOyBmaWx0ZXItPmVycm9yID0gKmluOworICAgIG1vdmQgICAgICAgW2Vycm9ycV0sIG0wICAgICAgICAgOworCisgICAgbW92ZCAgICAgICBtMiwgc2hpZnRtICAgICAgICAgICA7ICppbiArPSAoc3VtID4+IGZpbHRlci0+c2hpZnQpOworICAgIHBzcmFkICAgICAgbTYsIG0yICAgICAgICAgICAgICAgOworICAgIHBhZGRkICAgICAgbTAsIG02ICAgICAgICAgICAgICAgOworICAgIG1vdmQgICAgICAgW2lucV0sIG0wICAgICAgICAgICAgOworCisgICAgcHNybGRxICAgICBtMSwgNCAgICAgICAgICAgICAgICA7CisgICAgcHNsbGRxICAgICBtMCwgMTIgICAgICAgICAgICAgICA7IGZpbHRlci0+ZGxbNF0gPSAtZmlsdGVyLT5kbFs1XTsKKyAgICBwc2h1ZmQgICAgIG0wLCBtMCwgMHhmMCAgICAgICAgIDsgZmlsdGVyLT5kbFs1XSA9IC1maWx0ZXItPmRsWzZdOworICAgIHBzdWJkICAgICAgbTAsIG0xICAgICAgICAgICAgICAgOyBmaWx0ZXItPmRsWzZdID0gKmluIC0gZmlsdGVyLT5kbFs3XTsKKyAgICBwc3JsZHEgICAgIG0xLCBtMCwgNCAgICAgICAgICAgIDsgZmlsdGVyLT5kbFs3XSA9ICppbjsKKyAgICBwc2h1ZmQgICAgIG0xLCBtMSwgMHhmNCAgICAgICAgIDsgZmlsdGVyLT5kbFs1XSArPSBmaWx0ZXItPmRsWzZdOworICAgIHBhZGRkICAgICAgbTAsIG0xICAgICAgICAgICAgICAgOyBmaWx0ZXItPmRsWzRdICs9IGZpbHRlci0+ZGxbNV07CisgICAgcHNybGRxICAgICBtMSwgNCAgICAgICAgICAgICAgICA7CisgICAgcGFkZGQgICAgICBtMCwgbTEgICAgICAgICAgICAgICA7CisgICAgbW92YSAgICAgICBbZGxxICsgMHgxMF0sIG0wICAgICA7CisgICAgUkVUCislZW5kbWFjcm8KKworVFRBX0ZJTFRFUiBzc3NlMywgOAorVFRBX0ZJTFRFUiBzc2U0LCAgNwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3R0YWRzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdHRhZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2RjODdmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3R0YWRzcF9pbml0LmMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBKYW1lcyBBbG1lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy90dGFkc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCit2b2lkIGZmX3R0YWZpbHRlcl9wcm9jZXNzX2RlY19zc3NlMyhpbnQzMl90ICpxbSwgaW50MzJfdCAqZHgsIGludDMyX3QgKmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqZXJyb3IsIGludDMyX3QgKmluLCBpbnQzMl90IHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3VuZCk7Cit2b2lkIGZmX3R0YWZpbHRlcl9wcm9jZXNzX2RlY19zc2U0KGludDMyX3QgKnFtLCBpbnQzMl90ICpkeCwgaW50MzJfdCAqZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmVycm9yLCBpbnQzMl90ICppbiwgaW50MzJfdCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3VuZCk7CisKK2F2X2NvbGQgdm9pZCBmZl90dGFkc3BfaW5pdF94ODYoVFRBRFNQQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFX1lBU00KKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpCisgICAgICAgIGMtPnR0YWZpbHRlcl9wcm9jZXNzX2RlYyA9IGZmX3R0YWZpbHRlcl9wcm9jZXNzX2RlY19zc3NlMzsKKyAgICBpZiAoRVhURVJOQUxfU1NFNChjcHVfZmxhZ3MpKQorICAgICAgICBjLT50dGFmaWx0ZXJfcHJvY2Vzc19kZWMgPSBmZl90dGFmaWx0ZXJfcHJvY2Vzc19kZWNfc3NlNDsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3YyMTAtaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3YyMTAtaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzVlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdjIxMC1pbml0LmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdjIxMGRlYy5oIgorCitleHRlcm4gdm9pZCBmZl92MjEwX3BsYW5hcl91bnBhY2tfdW5hbGlnbmVkX3Nzc2UzKGNvbnN0IHVpbnQzMl90ICpzcmMsIHVpbnQxNl90ICp5LCB1aW50MTZfdCAqdSwgdWludDE2X3QgKnYsIGludCB3aWR0aCk7CitleHRlcm4gdm9pZCBmZl92MjEwX3BsYW5hcl91bnBhY2tfdW5hbGlnbmVkX2F2eChjb25zdCB1aW50MzJfdCAqc3JjLCB1aW50MTZfdCAqeSwgdWludDE2X3QgKnUsIHVpbnQxNl90ICp2LCBpbnQgd2lkdGgpOworCitleHRlcm4gdm9pZCBmZl92MjEwX3BsYW5hcl91bnBhY2tfYWxpZ25lZF9zc3NlMyhjb25zdCB1aW50MzJfdCAqc3JjLCB1aW50MTZfdCAqeSwgdWludDE2X3QgKnUsIHVpbnQxNl90ICp2LCBpbnQgd2lkdGgpOworZXh0ZXJuIHZvaWQgZmZfdjIxMF9wbGFuYXJfdW5wYWNrX2FsaWduZWRfYXZ4KGNvbnN0IHVpbnQzMl90ICpzcmMsIHVpbnQxNl90ICp5LCB1aW50MTZfdCAqdSwgdWludDE2X3QgKnYsIGludCB3aWR0aCk7CisKK2F2X2NvbGQgdm9pZCB2MjEwX3g4Nl9pbml0KFYyMTBEZWNDb250ZXh0ICpzKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyNpZiBIQVZFX1lBU00KKyAgICBpZiAocy0+YWxpZ25lZF9pbnB1dCkgeworICAgICAgICBpZiAoY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfU1NTRTMpCisgICAgICAgICAgICBzLT51bnBhY2tfZnJhbWUgPSBmZl92MjEwX3BsYW5hcl91bnBhY2tfYWxpZ25lZF9zc3NlMzsKKworICAgICAgICBpZiAoSEFWRV9BVlhfRVhURVJOQUwgJiYgY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfQVZYKQorICAgICAgICAgICAgcy0+dW5wYWNrX2ZyYW1lID0gZmZfdjIxMF9wbGFuYXJfdW5wYWNrX2FsaWduZWRfYXZ4OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX1NTU0UzKQorICAgICAgICAgICAgcy0+dW5wYWNrX2ZyYW1lID0gZmZfdjIxMF9wbGFuYXJfdW5wYWNrX3VuYWxpZ25lZF9zc3NlMzsKKworICAgICAgICBpZiAoSEFWRV9BVlhfRVhURVJOQUwgJiYgY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfQVZYKQorICAgICAgICAgICAgcy0+dW5wYWNrX2ZyYW1lID0gZmZfdjIxMF9wbGFuYXJfdW5wYWNrX3VuYWxpZ25lZF9hdng7CisgICAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvdjIxMC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdjIxMC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYTFmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92MjEwLmFzbQpAQCAtMCwwICsxLDkwIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBWMjEwIFNJTUQgdW5wYWNrCis7KiBDb3B5cmlnaHQgKGMpIDIwMTEgTG9yZW4gTWVycml0dCA8bG9yZW5tQHUud2FzaGluZ3Rvbi5lZHU+Cis7KiBDb3B5cmlnaHQgKGMpIDIwMTEgS2llcmFuIEt1bmh5YSA8a2llcmFuQGt1bmh5YS5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKwordjIxMF9tYXNrOiB0aW1lcyA0IGRkIDB4M2ZmCit2MjEwX211bHQ6IGR3IDY0LDQsNjQsNCw2NCw0LDY0LDQKK3YyMTBfbHVtYV9zaHVmOiBkYiA4LDksMCwxLDIsMywxMiwxMyw0LDUsNiw3LC0xLC0xLC0xLC0xCit2MjEwX2Nocm9tYV9zaHVmOiBkYiAwLDEsOCw5LDYsNywtMSwtMSwyLDMsNCw1LDEyLDEzLC0xLC0xCisKK1NFQ1RJT04gLnRleHQKKworJW1hY3JvIHYyMTBfcGxhbmFyX3VucGFjayAxCisKKzsgdjIxMF9wbGFuYXJfdW5wYWNrKGNvbnN0IHVpbnQzMl90ICpzcmMsIHVpbnQxNl90ICp5LCB1aW50MTZfdCAqdSwgdWludDE2X3QgKnYsIGludCB3aWR0aCkKK2NnbG9iYWwgdjIxMF9wbGFuYXJfdW5wYWNrXyUxLCA1LCA1LCA3CisgICAgbW92c3hkaWZuaWRuIHI0LCByNGQKKyAgICBsZWEgICAgcjEsIFtyMSsyKnI0XQorICAgIGFkZCAgICByMiwgcjQKKyAgICBhZGQgICAgcjMsIHI0CisgICAgbmVnICAgIHI0CisKKyAgICBtb3ZhICAgbTMsIFt2MjEwX211bHRdCisgICAgbW92YSAgIG00LCBbdjIxMF9tYXNrXQorICAgIG1vdmEgICBtNSwgW3YyMTBfbHVtYV9zaHVmXQorICAgIG1vdmEgICBtNiwgW3YyMTBfY2hyb21hX3NodWZdCisubG9vcAorJWlmaWRuICUxLCB1bmFsaWduZWQKKyAgICBtb3Z1ICAgbTAsIFtyMF0KKyVlbHNlCisgICAgbW92YSAgIG0wLCBbcjBdCislZW5kaWYKKworICAgIHBtdWxsdyBtMSwgbTAsIG0zCisgICAgcHNybGQgIG0wLCAxMAorICAgIHBzcmx3ICBtMSwgNiAgOyB1MCB2MCB5MSB5MiB2MSB1MiB5NCB5NQorICAgIHBhbmQgICBtMCwgbTQgOyB5MCBfXyB1MSBfXyB5MyBfXyB2MiBfXworCisgICAgc2h1ZnBzIG0yLCBtMSwgbTAsIDB4OGQgOyB5MSB5MiB5NCB5NSB5MCBfXyB5MyBfXworICAgIHBzaHVmYiBtMiwgbTUgOyB5MCB5MSB5MiB5MyB5NCB5NSBfXyBfXworICAgIG1vdnUgICBbcjErMipyNF0sIG0yCisKKyAgICBzaHVmcHMgbTEsIG0wLCAweGQ4IDsgdTAgdjAgdjEgdTIgdTEgX18gdjIgX18KKyAgICBwc2h1ZmIgbTEsIG02IDsgdTAgdTEgdTIgX18gdjAgdjEgdjIgX18KKyAgICBtb3ZxICAgW3IyK3I0XSwgbTEKKyAgICBtb3ZocHMgW3IzK3I0XSwgbTEKKworICAgIGFkZCByMCwgbW1zaXplCisgICAgYWRkIHI0LCA2CisgICAgamwgIC5sb29wCisKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NzZTMKK3YyMTBfcGxhbmFyX3VucGFjayB1bmFsaWduZWQKKworJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK3YyMTBfcGxhbmFyX3VucGFjayB1bmFsaWduZWQKKyVlbmRpZgorCitJTklUX1hNTSBzc3NlMwordjIxMF9wbGFuYXJfdW5wYWNrIGFsaWduZWQKKworJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK3YyMTBfcGxhbmFyX3VucGFjayBhbGlnbmVkCislZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92MjEwZW5jLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92MjEwZW5jLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQ1ZGUzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3YyMTBlbmMuYXNtCkBAIC0wLDAgKzEsMTQ1IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBWMjEwIFNJTUQgcGFjaworOyogQ29weXJpZ2h0IChjKSAyMDE0IEtpZXJhbiBLdW5oeWEgPGtpZXJhbmtAb2JlLnR2PgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK3YyMTBfZW5jX21pbl8xMDogdGltZXMgOCBkdyAweDQKK3YyMTBfZW5jX21heF8xMDogdGltZXMgOCBkdyAweDNmYgorCit2MjEwX2VuY19sdW1hX211bHRfMTA6IGR3IDQsMSwxNiw0LDEsMTYsMCwwCit2MjEwX2VuY19sdW1hX3NodWZfMTA6IGRiIC0xLDAsMSwtMSwyLDMsNCw1LC0xLDYsNywtMSw4LDksMTAsMTEKKwordjIxMF9lbmNfY2hyb21hX211bHRfMTA6IGR3IDEsNCwxNiwwLDE2LDEsNCwwCit2MjEwX2VuY19jaHJvbWFfc2h1Zl8xMDogZGIgMCwxLDgsOSwtMSwyLDMsLTEsMTAsMTEsNCw1LC0xLDEyLDEzLC0xCisKK3YyMTBfZW5jX21pbl84OiB0aW1lcyAxNiBkYiAweDEKK3YyMTBfZW5jX21heF84OiB0aW1lcyAxNiBkYiAweGZlCisKK3YyMTBfZW5jX2x1bWFfc2h1Zl84OiBkYiA2LC0xLDcsLTEsOCwtMSw5LC0xLDEwLC0xLDExLC0xLC0xLC0xLC0xLC0xCit2MjEwX2VuY19sdW1hX211bHRfODogZHcgMTYsNCw2NCwxNiw0LDY0LDAsMAorCit2MjEwX2VuY19jaHJvbWFfc2h1ZjFfODogZGIgMCwtMSwxLC0xLDIsLTEsMywtMSw4LC0xLDksLTEsMTAsLTEsMTEsLTEKK3YyMTBfZW5jX2Nocm9tYV9zaHVmMl84OiBkYiAzLC0xLDQsLTEsNSwtMSw3LC0xLDExLC0xLDEyLC0xLDEzLC0xLDE1LC0xCisKK3YyMTBfZW5jX2Nocm9tYV9tdWx0Xzg6IGR3IDQsMTYsNjQsMCw2NCw0LDE2LDAKKworU0VDVElPTiAudGV4dAorCislbWFjcm8gdjIxMF9wbGFuYXJfcGFja18xMCAwCisKKzsgdjIxMF9wbGFuYXJfcGFja18xMChjb25zdCB1aW50MTZfdCAqeSwgY29uc3QgdWludDE2X3QgKnUsIGNvbnN0IHVpbnQxNl90ICp2LCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCB3aWR0aCkKK2NnbG9iYWwgdjIxMF9wbGFuYXJfcGFja18xMCwgNSwgNSwgNCwgeSwgdSwgdiwgZHN0LCB3aWR0aAorICAgIGxlYSAgICAgcjAsIFt5cSsyKndpZHRocV0KKyAgICBhZGQgICAgIHVxLCB3aWR0aHEKKyAgICBhZGQgICAgIHZxLCB3aWR0aHEKKyAgICBuZWcgICAgIHdpZHRocQorCisgICAgbW92YSAgICBtMiwgW3YyMTBfZW5jX21pbl8xMF0KKyAgICBtb3ZhICAgIG0zLCBbdjIxMF9lbmNfbWF4XzEwXQorCisubG9vcAorICAgIG1vdnUgICAgbTAsIFt5cSsyKndpZHRocV0KKyAgICBDTElQVyAgIG0wLCBtMiwgbTMKKworICAgIG1vdnEgICAgbTEsIFt1cSt3aWR0aHFdCisgICAgbW92aHBzICBtMSwgW3ZxK3dpZHRocV0KKyAgICBDTElQVyAgIG0xLCBtMiwgbTMKKworICAgIHBtdWxsdyAgbTAsIFt2MjEwX2VuY19sdW1hX211bHRfMTBdCisgICAgcHNodWZiICBtMCwgW3YyMTBfZW5jX2x1bWFfc2h1Zl8xMF0KKworICAgIHBtdWxsdyAgbTEsIFt2MjEwX2VuY19jaHJvbWFfbXVsdF8xMF0KKyAgICBwc2h1ZmIgIG0xLCBbdjIxMF9lbmNfY2hyb21hX3NodWZfMTBdCisKKyAgICBwb3IgICAgIG0wLCBtMQorCisgICAgbW92dSAgICBbZHN0cV0sIG0wCisKKyAgICBhZGQgICAgIGRzdHEsIG1tc2l6ZQorICAgIGFkZCAgICAgd2lkdGhxLCA2CisgICAgamwgLmxvb3AKKworICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzc2UzCit2MjEwX3BsYW5hcl9wYWNrXzEwCisKKyVtYWNybyB2MjEwX3BsYW5hcl9wYWNrXzggMAorCis7IHYyMTBfcGxhbmFyX3BhY2tfOChjb25zdCB1aW50OF90ICp5LCBjb25zdCB1aW50OF90ICp1LCBjb25zdCB1aW50OF90ICp2LCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCB3aWR0aCkKK2NnbG9iYWwgdjIxMF9wbGFuYXJfcGFja184LCA1LCA1LCA3LCB5LCB1LCB2LCBkc3QsIHdpZHRoCisgICAgYWRkICAgICB5cSwgd2lkdGhxCisgICAgc2hyICAgICB3aWR0aHEsIDEKKyAgICBhZGQgICAgIHVxLCB3aWR0aHEKKyAgICBhZGQgICAgIHZxLCB3aWR0aHEKKyAgICBuZWcgICAgIHdpZHRocQorCisgICAgbW92YSAgICBtNCwgW3YyMTBfZW5jX21pbl84XQorICAgIG1vdmEgICAgbTUsIFt2MjEwX2VuY19tYXhfOF0KKyAgICBweG9yICAgIG02LCBtNgorCisubG9vcAorICAgIG1vdnUgICAgbTEsIFt5cSsyKndpZHRocV0KKyAgICBDTElQVUIgIG0xLCBtNCwgbTUKKworICAgIHB1bnBja2xidyBtMCwgbTEsIG02CisgICAgOyBjYW4ndCB1bnBhY2sgaGlnaCBieXRlcyBpbiB0aGUgc2FtZSB3YXkgYmVjYXVzZSB3ZSBwcm9jZXNzCisgICAgOyBvbmx5IHNpeCBieXRlcyBhdCBhIHRpbWUKKyAgICBwc2h1ZmIgIG0xLCBbdjIxMF9lbmNfbHVtYV9zaHVmXzhdCisKKyAgICBwbXVsbHcgIG0wLCBbdjIxMF9lbmNfbHVtYV9tdWx0XzhdCisgICAgcG11bGx3ICBtMSwgW3YyMTBfZW5jX2x1bWFfbXVsdF84XQorICAgIHBzaHVmYiAgbTAsIFt2MjEwX2VuY19sdW1hX3NodWZfMTBdCisgICAgcHNodWZiICBtMSwgW3YyMTBfZW5jX2x1bWFfc2h1Zl8xMF0KKworICAgIG1vdnEgICAgbTMsIFt1cSt3aWR0aHFdCisgICAgbW92aHBzICBtMywgW3ZxK3dpZHRocV0KKyAgICBDTElQVUIgIG0zLCBtNCwgbTUKKworICAgIDsgc2h1ZmZsZSBhbmQgbXVsdGlwbHkgdG8gZ2V0IHRoZSBzYW1lIHBhY2tpbmcgYXMgaW4gMTAtYml0CisgICAgcHNodWZiICBtMiwgbTMsIFt2MjEwX2VuY19jaHJvbWFfc2h1ZjFfOF0KKyAgICBwc2h1ZmIgIG0zLCBbdjIxMF9lbmNfY2hyb21hX3NodWYyXzhdCisKKyAgICBwbXVsbHcgIG0yLCBbdjIxMF9lbmNfY2hyb21hX211bHRfOF0KKyAgICBwbXVsbHcgIG0zLCBbdjIxMF9lbmNfY2hyb21hX211bHRfOF0KKyAgICBwc2h1ZmIgIG0yLCBbdjIxMF9lbmNfY2hyb21hX3NodWZfMTBdCisgICAgcHNodWZiICBtMywgW3YyMTBfZW5jX2Nocm9tYV9zaHVmXzEwXQorCisgICAgcG9yICAgICBtMCwgbTIKKyAgICBwb3IgICAgIG0xLCBtMworCisgICAgbW92dSAgICBbZHN0cV0sIG0wCisgICAgbW92dSAgICBbZHN0cSttbXNpemVdLCBtMQorCisgICAgYWRkICAgICBkc3RxLCAyKm1tc2l6ZQorICAgIGFkZCAgICAgd2lkdGhxLCA2CisgICAgamwgLmxvb3AKKworICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzc2UzCit2MjEwX3BsYW5hcl9wYWNrXzgKK0lOSVRfWE1NIGF2eAordjIxMF9wbGFuYXJfcGFja184CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvdjIxMGVuY19pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdjIxMGVuY19pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjNDk4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92MjEwZW5jX2luaXQuYwpAQCAtMCwwICsxLDM3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdjIxMGVuYy5oIgorCit2b2lkIGZmX3YyMTBfcGxhbmFyX3BhY2tfOF9zc3NlMyhjb25zdCB1aW50OF90ICp5LCBjb25zdCB1aW50OF90ICp1LCBjb25zdCB1aW50OF90ICp2LCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCB3aWR0aCk7Cit2b2lkIGZmX3YyMTBfcGxhbmFyX3BhY2tfOF9hdngoY29uc3QgdWludDhfdCAqeSwgY29uc3QgdWludDhfdCAqdSwgY29uc3QgdWludDhfdCAqdiwgdWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgd2lkdGgpOwordm9pZCBmZl92MjEwX3BsYW5hcl9wYWNrXzEwX3Nzc2UzKGNvbnN0IHVpbnQxNl90ICp5LCBjb25zdCB1aW50MTZfdCAqdSwgY29uc3QgdWludDE2X3QgKnYsIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHdpZHRoKTsKKworYXZfY29sZCB2b2lkIGZmX3YyMTBlbmNfaW5pdF94ODYoVjIxMEVuY0NvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmKCBFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpICkgeworICAgICAgICBzLT5wYWNrX2xpbmVfOCA9IGZmX3YyMTBfcGxhbmFyX3BhY2tfOF9zc3NlMzsKKyAgICAgICAgcy0+cGFja19saW5lXzEwID0gZmZfdjIxMF9wbGFuYXJfcGFja18xMF9zc3NlMzsKKyAgICB9CisKKyAgICBpZiggRVhURVJOQUxfQVZYKGNwdV9mbGFncykgKQorICAgICAgICBzLT5wYWNrX2xpbmVfOCA9IGZmX3YyMTBfcGxhbmFyX3BhY2tfOF9hdng7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvdmMxZHNwLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92YzFkc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjY4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdmMxZHNwLmFzbQpAQCAtMCwwICsxLDMxNyBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogVkMxIGRlYmxvY2tpbmcgb3B0aW1pemF0aW9ucworOyogQ29weXJpZ2h0IChjKSAyMDA5IERhdmlkIENvbnJhZAorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK2NleHRlcm4gcHdfNAorY2V4dGVybiBwd181CisKK3NlY3Rpb24gLnRleHQKKworOyBkc3RfbG93LCBkc3RfaGlnaCAoc3JjKSwgemVybworOyB6ZXJvLWV4dGVuZHMgb25lIHZlY3RvciBmcm9tIDggdG8gMTYgYml0cworJW1hY3JvIFVOUEFDS184VE8xNiA0CisgICAgbW92YSAgICAgIG0lMiwgbSUzCisgICAgcHVucGNraCUxIG0lMywgbSU0CisgICAgcHVucGNrbCUxIG0lMiwgbSU0CislZW5kbWFjcm8KKworJW1hY3JvIFNUT1JFXzRfV09SRFMgNgorJWlmIGNwdWZsYWcoc3NlNCkKKyAgICBwZXh0cncgJTEsICU1LCAlNiswCisgICAgcGV4dHJ3ICUyLCAlNSwgJTYrMQorICAgIHBleHRydyAlMywgJTUsICU2KzIKKyAgICBwZXh0cncgJTQsICU1LCAlNiszCislZWxzZQorICAgIG1vdmQgICU2ZCwgJTUKKyVpZiBtbXNpemU9PTE2CisgICAgcHNybGRxICU1LCA0CislZWxzZQorICAgIHBzcmxxICAlNSwgMzIKKyVlbmRpZgorICAgIG1vdiAgICAlMSwgJTZ3CisgICAgc2hyICAgICU2LCAxNgorICAgIG1vdiAgICAlMiwgJTZ3CisgICAgbW92ZCAgJTZkLCAlNQorICAgIG1vdiAgICAlMywgJTZ3CisgICAgc2hyICAgICU2LCAxNgorICAgIG1vdiAgICAlNCwgJTZ3CislZW5kaWYKKyVlbmRtYWNybworCis7IGluOiAgcDEgcDAgcTAgcTEsIGNsb2JiZXJzIHAwCis7IG91dDogcDEgPSAoMioocDEgLSBxMSkgLSA1KihwMCAtIHEwKSArIDQpID4+IDMKKyVtYWNybyBWQzFfTE9PUF9GSUxURVJfQTAgNAorICAgIHBzdWJ3ICAlMSwgJTQKKyAgICBwc3VidyAgJTIsICUzCisgICAgcGFkZHcgICUxLCAlMQorICAgIHBtdWxsdyAlMiwgW3B3XzVdCisgICAgcHN1YncgICUxLCAlMgorICAgIHBhZGR3ICAlMSwgW3B3XzRdCisgICAgcHNyYXcgICUxLCAzCislZW5kbWFjcm8KKworOyBpbjogcDAgcTAgYTAgYTEgYTIKKzsgICAgIG0wIG0xIG03IG02IG01Cis7ICUxOiBzaXplCis7IG91dDogbTA9cDAnIG0xPXEwJworJW1hY3JvIFZDMV9GSUxURVIgMQorICAgIFBBQlNXICAgbTQsIG03CisgICAgUEFCU1cgICBtMywgbTYKKyAgICBQQUJTVyAgIG0yLCBtNQorICAgIG1vdmEgICAgbTYsIG00CisgICAgcG1pbnN3ICBtMywgbTIKKyAgICBwY21wZ3R3IG02LCBtMyAgOyBpZiAoYTIgPCBhMCB8fCBhMSA8IGEwKQorICAgIHBzdWJ3ICAgbTMsIG00CisgICAgcG11bGx3ICBtMywgW3B3XzVdICAgOyA1KihhMyAtIGEwKQorICAgIFBBQlNXICAgbTIsIG0zCisgICAgcHNyYXcgICBtMiwgMyAgIDsgYWJzKGQvOCkKKyAgICBweG9yICAgIG03LCBtMyAgOyBkX3NpZ24gXj0gYTBfc2lnbgorCisgICAgcHhvciAgICBtNSwgbTUKKyAgICBtb3ZkICAgIG0zLCByMmQKKyVpZiAlMSA+IDQKKyAgICBwdW5wY2tsYncgbTMsIG0zCislZW5kaWYKKyAgICBwdW5wY2tsYncgbTMsIG01CisgICAgcGNtcGd0dyBtMywgbTQgIDsgaWYgKGEwIDwgcHEpCisgICAgcGFuZCAgICBtNiwgbTMKKworICAgIG1vdmEgICAgbTMsIG0wCisgICAgcHN1YncgICBtMywgbTEKKyAgICBQQUJTVyAgIG00LCBtMworICAgIHBzcmF3ICAgbTQsIDEKKyAgICBweG9yICAgIG0zLCBtNyAgOyBkX3NpZ24gXiBjbGlwX3NpZ24KKyAgICBwc3JhdyAgIG0zLCAxNQorICAgIHBtaW5zdyAgbTIsIG00ICA7IG1pbihkLCBjbGlwKQorICAgIHBjbXBndHcgbTQsIG01CisgICAgcGFuZCAgICBtNiwgbTQgIDsgZmlsdDMgKEMgcmV0dXJuIHZhbHVlKQorCis7IGVhY2ggc2V0IG9mIDQgcGl4ZWxzIGlzIG5vdCBmaWx0ZXJlZCBpZiB0aGUgM3JkIGlzIG5vdAorJWlmIG1tc2l6ZT09MTYKKyAgICBwc2h1Zmx3IG00LCBtNiwgMHhhYQorJWlmICUxID4gNAorICAgIHBzaHVmaHcgbTQsIG00LCAweGFhCislZW5kaWYKKyVlbHNlCisgICAgcHNodWZ3ICBtNCwgbTYsIDB4YWEKKyVlbmRpZgorICAgIHBhbmRuICAgbTMsIG00CisgICAgcGFuZCAgICBtMiwgbTYKKyAgICBwYW5kICAgIG0zLCBtMiAgOyBkIGZpbmFsCisKKyAgICBwc3JhdyAgIG03LCAxNQorICAgIHB4b3IgICAgbTMsIG03CisgICAgcHN1YncgICBtMywgbTcKKyAgICBwc3VidyAgIG0wLCBtMworICAgIHBhZGR3ICAgbTEsIG0zCisgICAgcGFja3Vzd2IgbTAsIG0wCisgICAgcGFja3Vzd2IgbTEsIG0xCislZW5kbWFjcm8KKworOyAxc3QgcGFyYW06IHNpemUgb2YgZmlsdGVyCis7IDJuZCBwYXJhbTogbW92IHN1ZmZpeCBlcXVpdmFsZW50IHRvIHRoZSBmaWx0ZXIgc2l6ZQorJW1hY3JvIFZDMV9WX0xPT1BfRklMVEVSIDIKKyAgICBweG9yICAgICAgbTUsIG01CisgICAgbW92JTIgICAgIG02LCBbcjRdCisgICAgbW92JTIgICAgIG00LCBbcjQrcjFdCisgICAgbW92JTIgICAgIG03LCBbcjQrMipyMV0KKyAgICBtb3YlMiAgICAgbTAsIFtyNCtyM10KKyAgICBwdW5wY2tsYncgbTYsIG01CisgICAgcHVucGNrbGJ3IG00LCBtNQorICAgIHB1bnBja2xidyBtNywgbTUKKyAgICBwdW5wY2tsYncgbTAsIG01CisKKyAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTYsIG00LCBtNywgbTAKKyAgICBtb3YlMiAgICAgbTEsIFtyMF0KKyAgICBtb3YlMiAgICAgbTIsIFtyMCtyMV0KKyAgICBwdW5wY2tsYncgbTEsIG01CisgICAgcHVucGNrbGJ3IG0yLCBtNQorICAgIG1vdmEgICAgICBtNCwgbTAKKyAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTcsIG00LCBtMSwgbTIKKyAgICBtb3YlMiAgICAgbTMsIFtyMCsyKnIxXQorICAgIG1vdiUyICAgICBtNCwgW3IwK3IzXQorICAgIHB1bnBja2xidyBtMywgbTUKKyAgICBwdW5wY2tsYncgbTQsIG01CisgICAgbW92YSAgICAgIG01LCBtMQorICAgIFZDMV9MT09QX0ZJTFRFUl9BMCBtNSwgbTIsIG0zLCBtNAorCisgICAgVkMxX0ZJTFRFUiAlMQorICAgIG1vdiUyIFtyNCtyM10sIG0wCisgICAgbW92JTIgW3IwXSwgICAgbTEKKyVlbmRtYWNybworCis7IDFzdCBwYXJhbTogc2l6ZSBvZiBmaWx0ZXIKKzsgICAgIE5PVEU6IFVOUEFDS184VE8xNiB0aGlzIG51bWJlciBvZiA4IGJpdCBudW1iZXJzIGFyZSBpbiBoYWxmIGEgcmVnaXN0ZXIKKzsgMm5kIChvcHRpb25hbCkgcGFyYW06IHRlbXAgcmVnaXN0ZXIgdG8gdXNlIGZvciBzdG9yaW5nIHdvcmRzCislbWFjcm8gVkMxX0hfTE9PUF9GSUxURVIgMS0yCislaWYgJTEgPT0gNAorICAgIG1vdnEgICAgICBtMCwgW3IwICAgICAtNF0KKyAgICBtb3ZxICAgICAgbTEsIFtyMCsgIHIxLTRdCisgICAgbW92cSAgICAgIG0yLCBbcjArMipyMS00XQorICAgIG1vdnEgICAgICBtMywgW3IwKyAgcjMtNF0KKyAgICBUUkFOU1BPU0U0eDRCIDAsIDEsIDIsIDMsIDQKKyVlbHNlCisgICAgbW92cSAgICAgIG0wLCBbcjAgICAgIC00XQorICAgIG1vdnEgICAgICBtNCwgW3IwKyAgcjEtNF0KKyAgICBtb3ZxICAgICAgbTEsIFtyMCsyKnIxLTRdCisgICAgbW92cSAgICAgIG01LCBbcjArICByMy00XQorICAgIG1vdnEgICAgICBtMiwgW3I0ICAgICAtNF0KKyAgICBtb3ZxICAgICAgbTYsIFtyNCsgIHIxLTRdCisgICAgbW92cSAgICAgIG0zLCBbcjQrMipyMS00XQorICAgIG1vdnEgICAgICBtNywgW3I0KyAgcjMtNF0KKyAgICBwdW5wY2tsYncgbTAsIG00CisgICAgcHVucGNrbGJ3IG0xLCBtNQorICAgIHB1bnBja2xidyBtMiwgbTYKKyAgICBwdW5wY2tsYncgbTMsIG03CisgICAgVFJBTlNQT1NFNHg0VyAwLCAxLCAyLCAzLCA0CislZW5kaWYKKyAgICBweG9yICAgICAgbTUsIG01CisKKyAgICBVTlBBQ0tfOFRPMTYgYncsIDYsIDAsIDUKKyAgICBVTlBBQ0tfOFRPMTYgYncsIDcsIDEsIDUKKyAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTYsIG0wLCBtNywgbTEKKyAgICBVTlBBQ0tfOFRPMTYgYncsIDQsIDIsIDUKKyAgICBtb3ZhICAgIG0wLCBtMSAgICAgICAgICAgICAgICAgICAgICA7IG0wID0gcDAKKyAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTcsIG0xLCBtNCwgbTIKKyAgICBVTlBBQ0tfOFRPMTYgYncsIDEsIDMsIDUKKyAgICBtb3ZhICAgIG01LCBtNAorICAgIFZDMV9MT09QX0ZJTFRFUl9BMCBtNSwgbTIsIG0xLCBtMworICAgIFNXQVAgMSwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTEgPSBxMAorCisgICAgVkMxX0ZJTFRFUiAlMQorICAgIHB1bnBja2xidyBtMCwgbTEKKyVpZiAlMCA+IDEKKyAgICBTVE9SRV80X1dPUkRTIFtyMC0xXSwgW3IwK3IxLTFdLCBbcjArMipyMS0xXSwgW3IwK3IzLTFdLCBtMCwgJTIKKyVpZiAlMSA+IDQKKyAgICBwc3JsZHEgbTAsIDQKKyAgICBTVE9SRV80X1dPUkRTIFtyNC0xXSwgW3I0K3IxLTFdLCBbcjQrMipyMS0xXSwgW3I0K3IzLTFdLCBtMCwgJTIKKyVlbmRpZgorJWVsc2UKKyAgICBTVE9SRV80X1dPUkRTIFtyMC0xXSwgW3IwK3IxLTFdLCBbcjArMipyMS0xXSwgW3IwK3IzLTFdLCBtMCwgMAorICAgIFNUT1JFXzRfV09SRFMgW3I0LTFdLCBbcjQrcjEtMV0sIFtyNCsyKnIxLTFdLCBbcjQrcjMtMV0sIG0wLCA0CislZW5kaWYKKyVlbmRtYWNybworCisKKyVtYWNybyBTVEFSVF9WX0ZJTFRFUiAwCisgICAgbW92ICByNCwgcjAKKyAgICBsZWEgIHIzLCBbNCpyMV0KKyAgICBzdWIgIHI0LCByMworICAgIGxlYSAgcjMsIFtyMSsyKnIxXQorICAgIGltdWwgcjIsIDB4MDEwMTAxMDEKKyVlbmRtYWNybworCislbWFjcm8gU1RBUlRfSF9GSUxURVIgMQorICAgIGxlYSAgcjMsIFtyMSsyKnIxXQorJWlmICUxID4gNAorICAgIGxlYSAgcjQsIFtyMCs0KnIxXQorJWVuZGlmCisgICAgaW11bCByMiwgMHgwMTAxMDEwMQorJWVuZG1hY3JvCisKKyVtYWNybyBWQzFfTEYgMAorY2dsb2JhbCB2YzFfdl9sb29wX2ZpbHRlcl9pbnRlcm5hbAorICAgIFZDMV9WX0xPT1BfRklMVEVSIDQsIGQKKyAgICByZXQKKworY2dsb2JhbCB2YzFfaF9sb29wX2ZpbHRlcl9pbnRlcm5hbAorICAgIFZDMV9IX0xPT1BfRklMVEVSIDQsIHI0CisgICAgcmV0CisKKzsgdm9pZCBmZl92YzFfdl9sb29wX2ZpbHRlcjRfbW14ZXh0KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQorY2dsb2JhbCB2YzFfdl9sb29wX2ZpbHRlcjQsIDMsNSwwCisgICAgU1RBUlRfVl9GSUxURVIKKyAgICBjYWxsIHZjMV92X2xvb3BfZmlsdGVyX2ludGVybmFsCisgICAgUkVUCisKKzsgdm9pZCBmZl92YzFfaF9sb29wX2ZpbHRlcjRfbW14ZXh0KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQorY2dsb2JhbCB2YzFfaF9sb29wX2ZpbHRlcjQsIDMsNSwwCisgICAgU1RBUlRfSF9GSUxURVIgNAorICAgIGNhbGwgdmMxX2hfbG9vcF9maWx0ZXJfaW50ZXJuYWwKKyAgICBSRVQKKworOyB2b2lkIGZmX3ZjMV92X2xvb3BfZmlsdGVyOF9tbXhleHQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV92X2xvb3BfZmlsdGVyOCwgMyw1LDAKKyAgICBTVEFSVF9WX0ZJTFRFUgorICAgIGNhbGwgdmMxX3ZfbG9vcF9maWx0ZXJfaW50ZXJuYWwKKyAgICBhZGQgIHI0LCA0CisgICAgYWRkICByMCwgNAorICAgIGNhbGwgdmMxX3ZfbG9vcF9maWx0ZXJfaW50ZXJuYWwKKyAgICBSRVQKKworOyB2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9tbXhleHQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV9oX2xvb3BfZmlsdGVyOCwgMyw1LDAKKyAgICBTVEFSVF9IX0ZJTFRFUiA0CisgICAgY2FsbCB2YzFfaF9sb29wX2ZpbHRlcl9pbnRlcm5hbAorICAgIGxlYSAgcjAsIFtyMCs0KnIxXQorICAgIGNhbGwgdmMxX2hfbG9vcF9maWx0ZXJfaW50ZXJuYWwKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1ZDMV9MRgorCitJTklUX1hNTSBzc2UyCis7IHZvaWQgZmZfdmMxX3ZfbG9vcF9maWx0ZXI4X3NzZTIodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV92X2xvb3BfZmlsdGVyOCwgMyw1LDgKKyAgICBTVEFSVF9WX0ZJTFRFUgorICAgIFZDMV9WX0xPT1BfRklMVEVSIDgsIHEKKyAgICBSRVQKKworOyB2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9zc2UyKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQorY2dsb2JhbCB2YzFfaF9sb29wX2ZpbHRlcjgsIDMsNiw4CisgICAgU1RBUlRfSF9GSUxURVIgOAorICAgIFZDMV9IX0xPT1BfRklMVEVSIDgsIHI1CisgICAgUkVUCisKK0lOSVRfTU1YIHNzc2UzCis7IHZvaWQgZmZfdmMxX3ZfbG9vcF9maWx0ZXI0X3Nzc2UzKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQorY2dsb2JhbCB2YzFfdl9sb29wX2ZpbHRlcjQsIDMsNSwwCisgICAgU1RBUlRfVl9GSUxURVIKKyAgICBWQzFfVl9MT09QX0ZJTFRFUiA0LCBkCisgICAgUkVUCisKKzsgdm9pZCBmZl92YzFfaF9sb29wX2ZpbHRlcjRfc3NzZTModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV9oX2xvb3BfZmlsdGVyNCwgMyw1LDAKKyAgICBTVEFSVF9IX0ZJTFRFUiA0CisgICAgVkMxX0hfTE9PUF9GSUxURVIgNCwgcjQKKyAgICBSRVQKKworSU5JVF9YTU0gc3NzZTMKKzsgdm9pZCBmZl92YzFfdl9sb29wX2ZpbHRlcjhfc3NzZTModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV92X2xvb3BfZmlsdGVyOCwgMyw1LDgKKyAgICBTVEFSVF9WX0ZJTFRFUgorICAgIFZDMV9WX0xPT1BfRklMVEVSIDgsIHEKKyAgICBSRVQKKworOyB2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9zc3NlMyh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSkKK2NnbG9iYWwgdmMxX2hfbG9vcF9maWx0ZXI4LCAzLDYsOAorICAgIFNUQVJUX0hfRklMVEVSIDgKKyAgICBWQzFfSF9MT09QX0ZJTFRFUiA4LCByNQorICAgIFJFVAorCitJTklUX1hNTSBzc2U0Cis7IHZvaWQgZmZfdmMxX2hfbG9vcF9maWx0ZXI4X3NzZTQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV9oX2xvb3BfZmlsdGVyOCwgMyw1LDgKKyAgICBTVEFSVF9IX0ZJTFRFUiA4CisgICAgVkMxX0hfTE9PUF9GSUxURVIgOAorICAgIFJFVApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZjMWRzcC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZjMWRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZDRkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdmMxZHNwLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIFZDLTEgYW5kIFdNVjMgZGVjb2RlciAtIFg4NiBEU1AgaW5pdCBmdW5jdGlvbnMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1g4Nl9WQzFEU1BfSAorI2RlZmluZSBBVkNPREVDX1g4Nl9WQzFEU1BfSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy92YzFkc3AuaCIKKwordm9pZCBmZl92YzFkc3BfaW5pdF9tbXgoVkMxRFNQQ29udGV4dCAqZHNwKTsKK3ZvaWQgZmZfdmMxZHNwX2luaXRfbW14ZXh0KFZDMURTUENvbnRleHQgKmRzcCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1g4Nl9WQzFEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZjMWRzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdmMxZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmVmNWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZjMWRzcF9pbml0LmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBWQy0xIGFuZCBXTVYzIC0gRFNQIGZ1bmN0aW9ucyBNTVgtb3B0aW1pemVkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hyaXN0b3BoZSBHSVNRVUVUIDxjaHJpc3RvcGhlLmdpc3F1ZXRAZnJlZS5mcj4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZjMWRzcC5oIgorI2luY2x1ZGUgImZwZWwuaCIKKyNpbmNsdWRlICJ2YzFkc3AuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2RlZmluZSBMT09QX0ZJTFRFUihFWFQpIFwKK3ZvaWQgZmZfdmMxX3ZfbG9vcF9maWx0ZXI0XyAjIyBFWFQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpOyBcCit2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyNF8gIyMgRVhUKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKTsgXAordm9pZCBmZl92YzFfdl9sb29wX2ZpbHRlcjhfICMjIEVYVCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSk7IFwKK3ZvaWQgZmZfdmMxX2hfbG9vcF9maWx0ZXI4XyAjIyBFWFQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpOyBcCitcCitzdGF0aWMgdm9pZCB2YzFfdl9sb29wX2ZpbHRlcjE2XyAjIyBFWFQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpIFwKK3sgXAorICAgIGZmX3ZjMV92X2xvb3BfZmlsdGVyOF8gIyMgRVhUKHNyYywgICBzdHJpZGUsIHBxKTsgXAorICAgIGZmX3ZjMV92X2xvb3BfZmlsdGVyOF8gIyMgRVhUKHNyYys4LCBzdHJpZGUsIHBxKTsgXAorfSBcCitcCitzdGF0aWMgdm9pZCB2YzFfaF9sb29wX2ZpbHRlcjE2XyAjIyBFWFQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpIFwKK3sgXAorICAgIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF8gIyMgRVhUKHNyYywgICAgICAgICAgc3RyaWRlLCBwcSk7IFwKKyAgICBmZl92YzFfaF9sb29wX2ZpbHRlcjhfICMjIEVYVChzcmMrOCpzdHJpZGUsIHN0cmlkZSwgcHEpOyBcCit9CisKKyNpZiBIQVZFX1lBU00KK0xPT1BfRklMVEVSKG1teGV4dCkKK0xPT1BfRklMVEVSKHNzZTIpCitMT09QX0ZJTFRFUihzc3NlMykKKwordm9pZCBmZl92YzFfaF9sb29wX2ZpbHRlcjhfc3NlNCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSk7CisKK3N0YXRpYyB2b2lkIHZjMV9oX2xvb3BfZmlsdGVyMTZfc3NlNCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSkKK3sKKyAgICBmZl92YzFfaF9sb29wX2ZpbHRlcjhfc3NlNChzcmMsICAgICAgICAgIHN0cmlkZSwgcHEpOworICAgIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9zc2U0KHNyYys4KnN0cmlkZSwgc3RyaWRlLCBwcSk7Cit9CitzdGF0aWMgdm9pZCBhdmdfdmMxX21zcGVsX21jMDBfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKQoreworICAgIGZmX2F2Z19waXhlbHM4X21teGV4dChkc3QsIHNyYywgc3RyaWRlLCA4KTsKK30KK3N0YXRpYyB2b2lkIGF2Z192YzFfbXNwZWxfbWMwMF8xNl9zc2UyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IHJuZCkKK3sKKyAgICBmZl9hdmdfcGl4ZWxzMTZfc3NlMihkc3QsIHNyYywgc3RyaWRlLCAxNik7Cit9CisKKyNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKwordm9pZCBmZl9wdXRfdmMxX2Nocm9tYV9tYzhfbm9ybmRfbW14ICAodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX3ZjMV9jaHJvbWFfbWM4X25vcm5kX21teGV4dCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX3ZjMV9jaHJvbWFfbWM4X25vcm5kXzNkbm93KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7Cit2b2lkIGZmX3B1dF92YzFfY2hyb21hX21jOF9ub3JuZF9zc3NlMyh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfdmMxX2Nocm9tYV9tYzhfbm9ybmRfc3NzZTModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKworCithdl9jb2xkIHZvaWQgZmZfdmMxZHNwX2luaXRfeDg2KFZDMURTUENvbnRleHQgKmRzcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEhBVkVfNlJFR1MgJiYgSU5MSU5FX01NWChjcHVfZmxhZ3MpKQorICAgICAgICBmZl92YzFkc3BfaW5pdF9tbXgoZHNwKTsKKworICAgIGlmIChIQVZFXzZSRUdTICYmIElOTElORV9NTVhFWFQoY3B1X2ZsYWdzKSkKKyAgICAgICAgZmZfdmMxZHNwX2luaXRfbW14ZXh0KGRzcCk7CisKKyNkZWZpbmUgQVNTSUdOX0xGKEVYVCkgXAorICAgICAgICBkc3AtPnZjMV92X2xvb3BfZmlsdGVyNCAgPSBmZl92YzFfdl9sb29wX2ZpbHRlcjRfICMjIEVYVDsgXAorICAgICAgICBkc3AtPnZjMV9oX2xvb3BfZmlsdGVyNCAgPSBmZl92YzFfaF9sb29wX2ZpbHRlcjRfICMjIEVYVDsgXAorICAgICAgICBkc3AtPnZjMV92X2xvb3BfZmlsdGVyOCAgPSBmZl92YzFfdl9sb29wX2ZpbHRlcjhfICMjIEVYVDsgXAorICAgICAgICBkc3AtPnZjMV9oX2xvb3BfZmlsdGVyOCAgPSBmZl92YzFfaF9sb29wX2ZpbHRlcjhfICMjIEVYVDsgXAorICAgICAgICBkc3AtPnZjMV92X2xvb3BfZmlsdGVyMTYgPSB2YzFfdl9sb29wX2ZpbHRlcjE2XyAjIyBFWFQ7IFwKKyAgICAgICAgZHNwLT52YzFfaF9sb29wX2ZpbHRlcjE2ID0gdmMxX2hfbG9vcF9maWx0ZXIxNl8gIyMgRVhUCisKKyNpZiBIQVZFX1lBU00KKyAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgZHNwLT5wdXRfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGZmX3B1dF92YzFfY2hyb21hX21jOF9ub3JuZF9tbXg7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9BTUQzRE5PVyhjcHVfZmxhZ3MpKSB7CisgICAgICAgIGRzcC0+YXZnX25vX3JuZF92YzFfY2hyb21hX3BpeGVsc190YWJbMF0gPSBmZl9hdmdfdmMxX2Nocm9tYV9tYzhfbm9ybmRfM2Rub3c7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSkgeworICAgICAgICBBU1NJR05fTEYobW14ZXh0KTsKKyAgICAgICAgZHNwLT5hdmdfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGZmX2F2Z192YzFfY2hyb21hX21jOF9ub3JuZF9tbXhleHQ7CisKKyAgICAgICAgZHNwLT5hdmdfdmMxX21zcGVsX3BpeGVsc190YWJbMV1bMF0gICAgICA9IGF2Z192YzFfbXNwZWxfbWMwMF9tbXhleHQ7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgZHNwLT52YzFfdl9sb29wX2ZpbHRlcjggID0gZmZfdmMxX3ZfbG9vcF9maWx0ZXI4X3NzZTI7CisgICAgICAgIGRzcC0+dmMxX2hfbG9vcF9maWx0ZXI4ICA9IGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9zc2UyOworICAgICAgICBkc3AtPnZjMV92X2xvb3BfZmlsdGVyMTYgPSB2YzFfdl9sb29wX2ZpbHRlcjE2X3NzZTI7CisgICAgICAgIGRzcC0+dmMxX2hfbG9vcF9maWx0ZXIxNiA9IHZjMV9oX2xvb3BfZmlsdGVyMTZfc3NlMjsKKyAgICAgICAgZHNwLT5hdmdfdmMxX21zcGVsX3BpeGVsc190YWJbMF1bMF0gICAgICA9IGF2Z192YzFfbXNwZWxfbWMwMF8xNl9zc2UyOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfU1NTRTMoY3B1X2ZsYWdzKSkgeworICAgICAgICBBU1NJR05fTEYoc3NzZTMpOworICAgICAgICBkc3AtPnB1dF9ub19ybmRfdmMxX2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfcHV0X3ZjMV9jaHJvbWFfbWM4X25vcm5kX3Nzc2UzOworICAgICAgICBkc3AtPmF2Z19ub19ybmRfdmMxX2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfYXZnX3ZjMV9jaHJvbWFfbWM4X25vcm5kX3Nzc2UzOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfU1NFNChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGRzcC0+dmMxX2hfbG9vcF9maWx0ZXI4ICA9IGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9zc2U0OworICAgICAgICBkc3AtPnZjMV9oX2xvb3BfZmlsdGVyMTYgPSB2YzFfaF9sb29wX2ZpbHRlcjE2X3NzZTQ7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZjMWRzcF9tbXguYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92YzFkc3BfbW14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhOGUzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92YzFkc3BfbW14LmMKQEAgLTAsMCArMSw4MTAgQEAKKy8qCisgKiBWQy0xIGFuZCBXTVYzIC0gRFNQIGZ1bmN0aW9ucyBNTVgtb3B0aW1pemVkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hyaXN0b3BoZSBHSVNRVUVUIDxjaHJpc3RvcGhlLmdpc3F1ZXRAZnJlZS5mcj4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdmMxZHNwLmgiCisjaW5jbHVkZSAiY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiZnBlbC5oIgorI2luY2x1ZGUgInZjMWRzcC5oIgorCisjaWYgSEFWRV82UkVHUyAmJiBIQVZFX0lOTElORV9BU00KKworI2RlZmluZSBPUF9QVVQoUyxEKQorI2RlZmluZSBPUF9BVkcoUyxEKSAicGF2Z2IgIiAjUyAiLCAiICNEICIgXG5cdCIKKworLyoqIEFkZCByb3VuZGVyIGZyb20gbW03IHRvIG1tMyBhbmQgcGFjayByZXN1bHQgYXQgZGVzdGluYXRpb24gKi8KKyNkZWZpbmUgTk9STUFMSVpFX01NWChTSElGVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICJwYWRkdyAgICAgJSVtbTcsICUlbW0zICAgICAgICAgICBcblx0IiAvKiArYmlhcy1yICovICAgICAgXAorICAgICAicGFkZHcgICAgICUlbW03LCAlJW1tNCAgICAgICAgICAgXG5cdCIgLyogK2JpYXMtciAqLyAgICAgIFwKKyAgICAgInBzcmF3ICAgICAiU0hJRlQiLCAlJW1tMyAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgICJwc3JhdyAgICAgIlNISUZUIiwgJSVtbTQgICAgICAgICBcblx0IgorCisjZGVmaW5lIFRSQU5TRkVSX0RPX1BBQ0soT1ApICAgICAgICAgICAgICAgICAgICBcCisgICAgICJwYWNrdXN3YiAgJSVtbTQsICUlbW0zICAgICAgICAgICBcblx0IiAgICBcCisgICAgIE9QKCglMiksICUlbW0zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICJtb3ZxICAgICAgJSVtbTMsICglMikgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIFRSQU5TRkVSX0RPTlRfUEFDSyhPUCkgICAgICAgICAgICAgICAgICBcCisgICAgIE9QKDAoJTIpLCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIE9QKDgoJTIpLCAlJW1tNCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICJtb3ZxICAgICAgJSVtbTMsIDAoJTIpICAgICAgICAgICBcblx0IiAgICBcCisgICAgICJtb3ZxICAgICAgJSVtbTQsIDgoJTIpICAgICAgICAgICBcblx0IgorCisvKiogQHNlZSBNU1BFTF9GSUxURVIxM19DT1JFIGZvciB1c2UgYXMgVU5QQUNLIG1hY3JvICovCisjZGVmaW5lIERPX1VOUEFDSyhyZWcpICAicHVucGNrbGJ3ICUlbW0wLCAiIHJlZyAiXG5cdCIKKyNkZWZpbmUgRE9OVF9VTlBBQ0socmVnKQorCisvKiogQ29tcHV0ZSB0aGUgcm91bmRlciAzMi1yIG9yIDgtciBhbmQgdW5wYWNrcyBpdCB0byBtbTcgKi8KKyNkZWZpbmUgTE9BRF9ST1VOREVSX01NWChST1VORCkgICAgICAgICAgICAgICAgIFwKKyAgICAgIm1vdmQgICAgICAiUk9VTkQiLCAlJW1tNyAgICAgICAgIFxuXHQiICAgIFwKKyAgICAgInB1bnBja2x3ZCAlJW1tNywgJSVtbTcgICAgICAgICAgIFxuXHQiICAgIFwKKyAgICAgInB1bnBja2xkcSAlJW1tNywgJSVtbTcgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgU0hJRlQyX0xJTkUoT0ZGLCBSMCxSMSxSMixSMykgICAgICAgICAgIFwKKyAgICAicGFkZHcgICAgICUlbW0iI1IyIiwgJSVtbSIjUjEiICAgIFxuXHQiICAgIFwKKyAgICAibW92ZCAgICAgICglMCwlMyksICUlbW0iI1IwIiAgICAgIFxuXHQiICAgIFwKKyAgICAicG11bGx3ICAgICUlbW02LCAlJW1tIiNSMSIgICAgICAgIFxuXHQiICAgIFwKKyAgICAicHVucGNrbGJ3ICUlbW0wLCAlJW1tIiNSMCIgICAgICAgIFxuXHQiICAgIFwKKyAgICAibW92ZCAgICAgICglMCwlMiksICUlbW0iI1IzIiAgICAgIFxuXHQiICAgIFwKKyAgICAicHN1YncgICAgICUlbW0iI1IwIiwgJSVtbSIjUjEiICAgIFxuXHQiICAgIFwKKyAgICAicHVucGNrbGJ3ICUlbW0wLCAlJW1tIiNSMyIgICAgICAgIFxuXHQiICAgIFwKKyAgICAicGFkZHcgICAgICUlbW03LCAlJW1tIiNSMSIgICAgICAgIFxuXHQiICAgIFwKKyAgICAicHN1YncgICAgICUlbW0iI1IzIiwgJSVtbSIjUjEiICAgIFxuXHQiICAgIFwKKyAgICAicHNyYXcgICAgICU0LCAlJW1tIiNSMSIgICAgICAgICAgIFxuXHQiICAgIFwKKyAgICAibW92cSAgICAgICUlbW0iI1IxIiwgIiNPRkYiKCUxKSAgIFxuXHQiICAgIFwKKyAgICAiYWRkICAgICAgICUyLCAlMCAgICAgICAgICAgICAgICAgIFxuXHQiCisKKy8qKiBTYWNyaWZ5aW5nIG1tNiBhbGxvd3MgdG8gcGlwZWxpbmUgbG9hZHMgZnJvbSBzcmMgKi8KK3N0YXRpYyB2b2lkIHZjMV9wdXRfdmVyXzE2Yl9zaGlmdDJfbW14KGludDE2X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgeDg2X3JlZyBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm5kLCBpbnQ2NF90IHNoaWZ0KQoreworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3YgICAgICAgJDMsICUlIlJFR19jIiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTE9BRF9ST1VOREVSX01NWCgiJTUiKQorICAgICAgICAibW92cSAgICAgICJNQU5HTEUoZmZfcHdfOSkiLCAlJW1tNiBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICAgICAgKCUwKSwgJSVtbTIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAgICAlMiwgJTAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAgICAgICglMCksICUlbW0zICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTAsICUlbW0yICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTMgICAgICAgICAgICBcblx0IgorICAgICAgICBTSElGVDJfTElORSggIDAsIDEsIDIsIDMsIDQpCisgICAgICAgIFNISUZUMl9MSU5FKCAyNCwgMiwgMywgNCwgMSkKKyAgICAgICAgU0hJRlQyX0xJTkUoIDQ4LCAzLCA0LCAxLCAyKQorICAgICAgICBTSElGVDJfTElORSggNzIsIDQsIDEsIDIsIDMpCisgICAgICAgIFNISUZUMl9MSU5FKCA5NiwgMSwgMiwgMywgNCkKKyAgICAgICAgU0hJRlQyX0xJTkUoMTIwLCAyLCAzLCA0LCAxKQorICAgICAgICBTSElGVDJfTElORSgxNDQsIDMsIDQsIDEsIDIpCisgICAgICAgIFNISUZUMl9MSU5FKDE2OCwgNCwgMSwgMiwgMykKKyAgICAgICAgInN1YiAgICAgICAlNiwgJTAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICAgICQ4LCAlMSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkZWMgICAgICAgJSUiUkVHX2MiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImpueiAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6ICIrciIoc3JjKSwgIityIihkc3QpCisgICAgICAgIDogInIiKHN0cmlkZSksICJyIigtMipzdHJpZGUpLAorICAgICAgICAgICJtIihzaGlmdCksICJtIihybmQpLCAiciIoOSpzdHJpZGUtNCkKKyAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfcHdfOSkKKyAgICAgICAgOiAiJSJSRUdfYywgIm1lbW9yeSIKKyAgICApOworfQorCisvKioKKyAqIERhdGEgaXMgYWxyZWFkeSB1bnBhY2tlZCwgc28gc29tZSBvcGVyYXRpb25zIGNhbiBkaXJlY3RseSBiZSBtYWRlIGZyb20KKyAqIG1lbW9yeS4KKyAqLworI2RlZmluZSBWQzFfSE9SXzE2Yl9TSElGVDIoT1AsIE9QTkFNRSlcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgdmMxX2hvcl8xNmJfc2hpZnQyX21teCh1aW50OF90ICpkc3QsIHg4Nl9yZWcgc3RyaWRlLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnNyYywgaW50IHJuZClcCit7XAorICAgIGludCBoID0gODtcCitcCisgICAgc3JjIC09IDE7XAorICAgIHJuZCAtPSAoLTErOSs5LTEpKjEwMjQ7IC8qIEFkZCAtMTAyNCBiaWFzICovXAorICAgIF9fYXNtX18gdm9sYXRpbGUoXAorICAgICAgICBMT0FEX1JPVU5ERVJfTU1YKCIlNCIpXAorICAgICAgICAibW92cSAgICAgICJNQU5HTEUoZmZfcHdfMTI4KSIsICUlbW02XG5cdCJcCisgICAgICAgICJtb3ZxICAgICAgIk1BTkdMRShmZl9wd185KSIsICUlbW01IFxuXHQiXAorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgIDIqMCswKCUxKSwgJSVtbTEgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgIDIqMCs4KCUxKSwgJSVtbTIgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgIDIqMSswKCUxKSwgJSVtbTMgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgIDIqMSs4KCUxKSwgJSVtbTQgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgICAgIDIqMyswKCUxKSwgJSVtbTEgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgICAgIDIqMys4KCUxKSwgJSVtbTIgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgICAgIDIqMiswKCUxKSwgJSVtbTMgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgICAgIDIqMis4KCUxKSwgJSVtbTQgICAgICAgIFxuXHQiXAorICAgICAgICAicG11bGx3ICAgICUlbW01LCAlJW1tMyAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicG11bGx3ICAgICUlbW01LCAlJW1tNCAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YncgICAgICUlbW0xLCAlJW1tMyAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YncgICAgICUlbW0yLCAlJW1tNCAgICAgICAgICAgIFxuXHQiXAorICAgICAgICBOT1JNQUxJWkVfTU1YKCIkNyIpXAorICAgICAgICAvKiBSZW1vdmUgYmlhcyAqL1wKKyAgICAgICAgInBhZGR3ICAgICAlJW1tNiwgJSVtbTMgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICAgICAlJW1tNiwgJSVtbTQgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgVFJBTlNGRVJfRE9fUEFDSyhPUClcCisgICAgICAgICJhZGQgICAgICAgJDI0LCAlMSAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJhZGQgICAgICAgJTMsICUyICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJkZWNsICAgICAgJTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJqbnogMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgIDogIityIihoKSwgIityIiAoc3JjKSwgICIrciIgKGRzdClcCisgICAgICAgIDogInIiKHN0cmlkZSksICJtIihybmQpXAorICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChmZl9wd18xMjgsZmZfcHdfOSlcCisgICAgICAgIDogIm1lbW9yeSJcCisgICAgKTtcCit9CisKK1ZDMV9IT1JfMTZiX1NISUZUMihPUF9QVVQsIHB1dF8pCitWQzFfSE9SXzE2Yl9TSElGVDIoT1BfQVZHLCBhdmdfKQorCisKKy8qKgorICogUHVyZWx5IHZlcnRpY2FsIG9yIGhvcml6b250YWwgMS8yIHNoaWZ0IGludGVycG9sYXRpb24uCisgKiBTYWNyaWZ5IG1tNiBmb3IgKjkgZmFjdG9yLgorICovCisjZGVmaW5lIFZDMV9TSElGVDIoT1AsIE9QTkFNRSlcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgdmMxX3NoaWZ0Ml9tbXgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Nl9yZWcgc3RyaWRlLCBpbnQgcm5kLCB4ODZfcmVnIG9mZnNldClcCit7XAorICAgIHJuZCA9IDgtcm5kO1wKKyAgICBfX2FzbV9fIHZvbGF0aWxlKFwKKyAgICAgICAgIm1vdiAgICAgICAkOCwgJSUiUkVHX2MiICAgICAgICAgICBcblx0IlwKKyAgICAgICAgTE9BRF9ST1VOREVSX01NWCgiJTUiKVwKKyAgICAgICAgIm1vdnEgICAgICAiTUFOR0xFKGZmX3B3XzkpIiwgJSVtbTZcblx0IlwKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgICAgICAwKCUwICAgKSwgJSVtbTMgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgICAgICA0KCUwICAgKSwgJSVtbTQgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgICAgICAwKCUwLCUyKSwgJSVtbTEgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgICAgICA0KCUwLCUyKSwgJSVtbTIgICAgICAgICBcblx0IlwKKyAgICAgICAgImFkZCAgICAgICAlMiwgJTAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTMgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTQgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTEgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTIgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICAgICAlJW1tMSwgJSVtbTMgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICAgICAlJW1tMiwgJSVtbTQgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgICAgICAwKCUwLCUzKSwgJSVtbTEgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgICAgICA0KCUwLCUzKSwgJSVtbTIgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxsdyAgICAlJW1tNiwgJSVtbTMgICAgICAgICAgICBcblx0IiAvKiAwLDksOSwwKi9cCisgICAgICAgICJwbXVsbHcgICAgJSVtbTYsICUlbW00ICAgICAgICAgICAgXG5cdCIgLyogMCw5LDksMCovXAorICAgICAgICAicHVucGNrbGJ3ICUlbW0wLCAlJW1tMSAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHVucGNrbGJ3ICUlbW0wLCAlJW1tMiAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YncgICAgICUlbW0xLCAlJW1tMyAgICAgICAgICAgIFxuXHQiIC8qLTEsOSw5LDAqL1wKKyAgICAgICAgInBzdWJ3ICAgICAlJW1tMiwgJSVtbTQgICAgICAgICAgICBcblx0IiAvKi0xLDksOSwwKi9cCisgICAgICAgICJtb3ZkICAgICAgMCglMCwlMiksICUlbW0xICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZkICAgICAgNCglMCwlMiksICUlbW0yICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSVtbTAsICUlbW0xICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSVtbTAsICUlbW0yICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3VidyAgICAgJSVtbTEsICUlbW0zICAgICAgICAgICAgXG5cdCIgLyotMSw5LDksLTEqL1wKKyAgICAgICAgInBzdWJ3ICAgICAlJW1tMiwgJSVtbTQgICAgICAgICAgICBcblx0IiAvKi0xLDksOSwtMSovXAorICAgICAgICBOT1JNQUxJWkVfTU1YKCIkNCIpXAorICAgICAgICAicGFja3Vzd2IgICUlbW00LCAlJW1tMyAgICAgICAgICAgIFxuXHQiXAorICAgICAgICBPUCgoJTEpLCAlJW1tMylcCisgICAgICAgICJtb3ZxICAgICAgJSVtbTMsICglMSkgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJhZGQgICAgICAgJTYsICUwICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJhZGQgICAgICAgJTQsICUxICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJkZWMgICAgICAgJSUiUkVHX2MiICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJqbnogMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgIDogIityIihzcmMpLCAgIityIihkc3QpXAorICAgICAgICA6ICJyIihvZmZzZXQpLCAiciIoLTIqb2Zmc2V0KSwgImciKHN0cmlkZSksICJtIihybmQpLFwKKyAgICAgICAgICAiZyIoc3RyaWRlLW9mZnNldClcCisgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGZmX3B3XzkpXAorICAgICAgICA6ICIlIlJFR19jLCAibWVtb3J5IlwKKyAgICApO1wKK30KKworVkMxX1NISUZUMihPUF9QVVQsIHB1dF8pCitWQzFfU0hJRlQyKE9QX0FWRywgYXZnXykKKworLyoqCisgKiBDb3JlIG9mIHRoZSAxLzQgYW5kIDMvNCBzaGlmdCBiaWN1YmljIGludGVycG9sYXRpb24uCisgKgorICogQHBhcmFtIFVOUEFDSyAgTWFjcm8gdW5wYWNraW5nIGFyZ3VtZW50cyBmcm9tIDggdG8gMTZiaXRzIChjYW4gYmUgZW1wdHkpLgorICogQHBhcmFtIE1PVlEgICAgIm1vdmQgMSIgb3IgIm1vdnEgMiIsIGlmIGRhdGEgcmVhZCBpcyBhbHJlYWR5IHVucGFja2VkLgorICogQHBhcmFtIEExICAgICAgQWRkcmVzcyBvZiAxc3QgdGFwIChiZXdhcmUgb2YgdW5wYWNrZWQvcGFja2VkKS4KKyAqIEBwYXJhbSBBMiAgICAgIEFkZHJlc3Mgb2YgMm5kIHRhcAorICogQHBhcmFtIEEzICAgICAgQWRkcmVzcyBvZiAzcmQgdGFwCisgKiBAcGFyYW0gQTQgICAgICBBZGRyZXNzIG9mIDR0aCB0YXAKKyAqLworI2RlZmluZSBNU1BFTF9GSUxURVIxM19DT1JFKFVOUEFDSywgTU9WUSwgQTEsIEEyLCBBMywgQTQpICAgICAgIFwKKyAgICAgTU9WUSAiKjArIkExIiwgJSVtbTEgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIE1PVlEgIio0KyJBMSIsICUlbW0yICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBVTlBBQ0soIiUlbW0xIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgVU5QQUNLKCIlJW1tMiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICJwbXVsbHcgICAgIk1BTkdMRShmZl9wd18zKSIsICUlbW0xXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAicG11bGx3ICAgICJNQU5HTEUoZmZfcHdfMykiLCAlJW1tMlxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgTU9WUSAiKjArIkEyIiwgJSVtbTMgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIE1PVlEgIio0KyJBMiIsICUlbW00ICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBVTlBBQ0soIiUlbW0zIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgVU5QQUNLKCIlJW1tNCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICJwbXVsbHcgICAgJSVtbTYsICUlbW0zICAgIFxuXHQiIC8qICoxOCAqLyAgICAgICAgICAgICAgICAgXAorICAgICAicG11bGx3ICAgICUlbW02LCAlJW1tNCAgICBcblx0IiAvKiAqMTggKi8gICAgICAgICAgICAgICAgIFwKKyAgICAgInBzdWJ3ICAgICAlJW1tMSwgJSVtbTMgICAgXG5cdCIgLyogMTgsLTMgKi8gICAgICAgICAgICAgICBcCisgICAgICJwc3VidyAgICAgJSVtbTIsICUlbW00ICAgIFxuXHQiIC8qIDE4LC0zICovICAgICAgICAgICAgICAgXAorICAgICBNT1ZRICIqMCsiQTQiLCAlJW1tMSAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgTU9WUSAiKjQrIkE0IiwgJSVtbTIgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIFVOUEFDSygiJSVtbTEiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBVTlBBQ0soIiUlbW0yIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgInBzbGx3ICAgICAkMiwgJSVtbTEgICAgICAgXG5cdCIgLyogNCogKi8gICAgICAgICAgICAgICAgICBcCisgICAgICJwc2xsdyAgICAgJDIsICUlbW0yICAgICAgIFxuXHQiIC8qIDQqICovICAgICAgICAgICAgICAgICAgXAorICAgICAicHN1YncgICAgICUlbW0xLCAlJW1tMyAgICBcblx0IiAvKiAtNCwxOCwtMyAqLyAgICAgICAgICAgIFwKKyAgICAgInBzdWJ3ICAgICAlJW1tMiwgJSVtbTQgICAgXG5cdCIgLyogLTQsMTgsLTMgKi8gICAgICAgICAgICBcCisgICAgIE1PVlEgIiowKyJBMyIsICUlbW0xICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBNT1ZRICIqNCsiQTMiLCAlJW1tMiAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgVU5QQUNLKCIlJW1tMSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIFVOUEFDSygiJSVtbTIiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAicG11bGx3ICAgICUlbW01LCAlJW1tMSAgICBcblx0IiAvKiAqNTMgKi8gICAgICAgICAgICAgICAgIFwKKyAgICAgInBtdWxsdyAgICAlJW1tNSwgJSVtbTIgICAgXG5cdCIgLyogKjUzICovICAgICAgICAgICAgICAgICBcCisgICAgICJwYWRkdyAgICAgJSVtbTEsICUlbW0zICAgIFxuXHQiIC8qIDQsNTMsMTgsLTMgKi8gICAgICAgICAgXAorICAgICAicGFkZHcgICAgICUlbW0yLCAlJW1tNCAgICBcblx0IiAvKiA0LDUzLDE4LC0zICovCisKKy8qKgorICogTWFjcm8gdG8gYnVpbGQgdGhlIHZlcnRpY2FsIDE2Yml0cyB2ZXJzaW9uIG9mIHZjMV9wdXRfc2hpZnRbMTNdLgorICogSGVyZSwgb2Zmc2V0PXNyY19zdHJpZGUuIFBhcmFtZXRlcnMgcGFzc2VkIEExIHRvIEE0IG11c3QgdXNlCisgKiAlMyAoc3JjX3N0cmlkZSkgYW5kICU0ICgzKnNyY19zdHJpZGUpLgorICoKKyAqIEBwYXJhbSAgTkFNRSAgIEVpdGhlciAxIG9yIDMKKyAqIEBzZWUgTVNQRUxfRklMVEVSMTNfQ09SRSBmb3IgaW5mb3JtYXRpb24gb24gQTEtPkE0CisgKi8KKyNkZWZpbmUgTVNQRUxfRklMVEVSMTNfVkVSXzE2QihOQU1FLCBBMSwgQTIsIEEzLCBBNCkgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZjMV9wdXRfdmVyXzE2Yl8gIyMgTkFNRSAjIyBfbW14KGludDE2X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Nl9yZWcgc3JjX3N0cmlkZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJuZCwgaW50NjRfdCBzaGlmdCkgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBoID0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyAtPSBzcmNfc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9BRF9ST1VOREVSX01NWCgiJTUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgICAgICAiTUFOR0xFKGZmX3B3XzUzKSIsICUlbW01XG5cdCIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgICAgICAiTUFOR0xFKGZmX3B3XzE4KSIsICUlbW02XG5cdCIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIi5wMmFsaWduIDMgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTVNQRUxfRklMVEVSMTNfQ09SRShET19VTlBBQ0ssICJtb3ZkICAxIiwgQTEsIEEyLCBBMywgQTQpICAgICAgIFwKKyAgICAgICAgTk9STUFMSVpFX01NWCgiJTYiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFJBTlNGRVJfRE9OVF9QQUNLKE9QX1BVVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogTGFzdCAzIChpbiBmYWN0IDQpIGJ5dGVzIG9uIHRoZSBsaW5lICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdmQgICAgICA4KyJBMSIsICUlbW0xICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRE9fVU5QQUNLKCIlJW1tMSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgICAgICAlJW1tMSwgJSVtbTMgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGR3ICAgICAlJW1tMSwgJSVtbTEgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGR3ICAgICAlJW1tMywgJSVtbTEgICAgXG5cdCIgLyogMyogKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdmQgICAgICA4KyJBMiIsICUlbW0zICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRE9fVU5QQUNLKCIlJW1tMyIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBtdWxsdyAgICAlJW1tNiwgJSVtbTMgICAgXG5cdCIgLyogKjE4ICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBzdWJ3ICAgICAlJW1tMSwgJSVtbTMgICAgXG5cdCIgLyoxOCwtMyAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdmQgICAgICA4KyJBMyIsICUlbW0xICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRE9fVU5QQUNLKCIlJW1tMSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBtdWxsdyAgICAlJW1tNSwgJSVtbTEgICAgXG5cdCIgLyogKjUzICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGR3ICAgICAlJW1tMSwgJSVtbTMgICAgXG5cdCIgLyo1MywxOCwtMyAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdmQgICAgICA4KyJBNCIsICUlbW0xICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRE9fVU5QQUNLKCIlJW1tMSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBzbGx3ICAgICAkMiwgJSVtbTEgICAgICAgXG5cdCIgLyogNCogKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBzdWJ3ICAgICAlJW1tMSwgJSVtbTMgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGR3ICAgICAlJW1tNywgJSVtbTMgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBzcmF3ICAgICAlNiwgJSVtbTMgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgICAgICAlJW1tMywgMTYoJTIpICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZCAgICAgICAlMywgJTEgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZCAgICAgICAkMjQsICUyICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImRlY2wgICAgICAlMCAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImpueiAxYiAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiK3IiKGgpLCAiK3IiIChzcmMpLCAgIityIiAoZHN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiciIoc3JjX3N0cmlkZSksICJyIigzKnNyY19zdHJpZGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAibSIocm5kKSwgIm0iKHNoaWZ0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfcHdfMyxmZl9wd181MyxmZl9wd18xOCkgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLyoqCisgKiBNYWNybyB0byBidWlsZCB0aGUgaG9yaXpvbnRhbCAxNmJpdHMgdmVyc2lvbiBvZiB2YzFfcHV0X3NoaWZ0WzEzXS4KKyAqIEhlcmUsIG9mZnNldD0xNmJpdHMsIHNvIHBhcmFtZXRlcnMgcGFzc2VkIEExIHRvIEE0IHNob3VsZCBiZSBzaW1wbGUuCisgKgorICogQHBhcmFtICBOQU1FICAgRWl0aGVyIDEgb3IgMworICogQHNlZSBNU1BFTF9GSUxURVIxM19DT1JFIGZvciBpbmZvcm1hdGlvbiBvbiBBMS0+QTQKKyAqLworI2RlZmluZSBNU1BFTF9GSUxURVIxM19IT1JfMTZCKE5BTUUsIEExLCBBMiwgQTMsIEE0LCBPUCwgT1BOQU1FKSAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorT1BOQU1FICMjIHZjMV9ob3JfMTZiXyAjIyBOQU1FICMjIF9tbXgodWludDhfdCAqZHN0LCB4ODZfcmVnIHN0cmlkZSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgcm5kKSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBoID0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyAtPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJuZCAtPSAoLTQrNTgrMTMtMykqMjU2OyAvKiBBZGQgLTI1NiBiaWFzICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9BRF9ST1VOREVSX01NWCgiJTQiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgICAgICAiTUFOR0xFKGZmX3B3XzE4KSIsICUlbW02ICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgICAgICAiTUFOR0xFKGZmX3B3XzUzKSIsICUlbW01ICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIi5wMmFsaWduIDMgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTVNQRUxfRklMVEVSMTNfQ09SRShET05UX1VOUEFDSywgIm1vdnEgMiIsIEExLCBBMiwgQTMsIEE0KSAgICAgIFwKKyAgICAgICAgTk9STUFMSVpFX01NWCgiJDciKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogUmVtb3ZlIGJpYXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGR3ICAgICAiTUFOR0xFKGZmX3B3XzEyOCkiLCAlJW1tMyAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGR3ICAgICAiTUFOR0xFKGZmX3B3XzEyOCkiLCAlJW1tNCAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFJBTlNGRVJfRE9fUEFDSyhPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZCAgICAgICAkMjQsICUxICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZCAgICAgICAlMywgJTIgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImRlY2wgICAgICAlMCAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImpueiAxYiAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiK3IiKGgpLCAiK3IiIChzcmMpLCAgIityIiAoZHN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiciIoc3RyaWRlKSwgIm0iKHJuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfcHdfMyxmZl9wd18xOCxmZl9wd181MyxmZl9wd18xMjgpICAgIFwKKyAgICAgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLyoqCisgKiBNYWNybyB0byBidWlsZCB0aGUgOGJpdHMsIGFueSBkaXJlY3Rpb24sIHZlcnNpb24gb2YgdmMxX3B1dF9zaGlmdFsxM10uCisgKiBIZXJlLCBvZmZzZXQ9c3JjX3N0cmlkZS4gUGFyYW1ldGVycyBwYXNzZWQgQTEgdG8gQTQgbXVzdCB1c2UKKyAqICUzIChvZmZzZXQpIGFuZCAlNCAoMypvZmZzZXQpLgorICoKKyAqIEBwYXJhbSAgTkFNRSAgIEVpdGhlciAxIG9yIDMKKyAqIEBzZWUgTVNQRUxfRklMVEVSMTNfQ09SRSBmb3IgaW5mb3JtYXRpb24gb24gQTEtPkE0CisgKi8KKyNkZWZpbmUgTVNQRUxfRklMVEVSMTNfOEIoTkFNRSwgQTEsIEEyLCBBMywgQTQsIE9QLCBPUE5BTUUpICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK09QTkFNRSAjIyB2YzFfIyMgTkFNRSAjIyBfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHg4Nl9yZWcgc3RyaWRlLCBpbnQgcm5kLCB4ODZfcmVnIG9mZnNldCkgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGggPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3JjIC09IG9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcm5kID0gMzItcm5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMT0FEX1JPVU5ERVJfTU1YKCIlNiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92cSAgICAgICJNQU5HTEUoZmZfcHdfNTMpIiwgJSVtbTUgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92cSAgICAgICJNQU5HTEUoZmZfcHdfMTgpIiwgJSVtbTYgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAgICAgICAiLnAyYWxpZ24gMyAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNU1BFTF9GSUxURVIxM19DT1JFKERPX1VOUEFDSywgIm1vdmQgICAxIiwgQTEsIEEyLCBBMywgQTQpICAgICAgXAorICAgICAgICBOT1JNQUxJWkVfTU1YKCIkNiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUUkFOU0ZFUl9ET19QQUNLKE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiYWRkICAgICAgICU1LCAlMSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiYWRkICAgICAgICU1LCAlMiAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZGVjbCAgICAgICUwICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiam56IDFiICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICIrciIoaCksICIrciIgKHNyYyksICAiK3IiIChkc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICJyIihvZmZzZXQpLCAiciIoMypvZmZzZXQpLCAiZyIoc3RyaWRlKSwgIm0iKHJuZCkgICAgICAgICAgICAgXAorICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChmZl9wd181MyxmZl9wd18xOCxmZl9wd18zKSAgICAgICAgICAgICAgXAorICAgICAgICA6ICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvKiogMS80IHNoaWZ0IGJpY3ViaWMgaW50ZXJwb2xhdGlvbiAqLworTVNQRUxfRklMVEVSMTNfOEIgICAgIChzaGlmdDEsICIwKCUxLCU0ICApIiwgIjAoJTEsJTMsMikiLCAiMCglMSwlMyAgKSIsICIwKCUxICAgICApIiwgT1BfUFVULCBwdXRfKQorTVNQRUxfRklMVEVSMTNfOEIgICAgIChzaGlmdDEsICIwKCUxLCU0ICApIiwgIjAoJTEsJTMsMikiLCAiMCglMSwlMyAgKSIsICIwKCUxICAgICApIiwgT1BfQVZHLCBhdmdfKQorTVNQRUxfRklMVEVSMTNfVkVSXzE2QihzaGlmdDEsICIwKCUxLCU0ICApIiwgIjAoJTEsJTMsMikiLCAiMCglMSwlMyAgKSIsICIwKCUxICAgICApIikKK01TUEVMX0ZJTFRFUjEzX0hPUl8xNkIoc2hpZnQxLCAiMiozKCUxKSIsICIyKjIoJTEpIiwgIjIqMSglMSkiLCAiMiowKCUxKSIsIE9QX1BVVCwgcHV0XykKK01TUEVMX0ZJTFRFUjEzX0hPUl8xNkIoc2hpZnQxLCAiMiozKCUxKSIsICIyKjIoJTEpIiwgIjIqMSglMSkiLCAiMiowKCUxKSIsIE9QX0FWRywgYXZnXykKKworLyoqIDMvNCBzaGlmdCBiaWN1YmljIGludGVycG9sYXRpb24gKi8KK01TUEVMX0ZJTFRFUjEzXzhCICAgICAoc2hpZnQzLCAiMCglMSAgICAgKSIsICIwKCUxLCUzICApIiwgIjAoJTEsJTMsMikiLCAiMCglMSwlNCAgKSIsIE9QX1BVVCwgcHV0XykKK01TUEVMX0ZJTFRFUjEzXzhCICAgICAoc2hpZnQzLCAiMCglMSAgICAgKSIsICIwKCUxLCUzICApIiwgIjAoJTEsJTMsMikiLCAiMCglMSwlNCAgKSIsIE9QX0FWRywgYXZnXykKK01TUEVMX0ZJTFRFUjEzX1ZFUl8xNkIoc2hpZnQzLCAiMCglMSAgICAgKSIsICIwKCUxLCUzICApIiwgIjAoJTEsJTMsMikiLCAiMCglMSwlNCAgKSIpCitNU1BFTF9GSUxURVIxM19IT1JfMTZCKHNoaWZ0MywgIjIqMCglMSkiLCAiMioxKCUxKSIsICIyKjIoJTEpIiwgIjIqMyglMSkiLCBPUF9QVVQsIHB1dF8pCitNU1BFTF9GSUxURVIxM19IT1JfMTZCKHNoaWZ0MywgIjIqMCglMSkiLCAiMioxKCUxKSIsICIyKjIoJTEpIiwgIjIqMyglMSkiLCBPUF9BVkcsIGF2Z18pCisKK3R5cGVkZWYgdm9pZCAoKnZjMV9tc3BlbF9tY19maWx0ZXJfdmVyXzE2Yml0cykoaW50MTZfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHg4Nl9yZWcgc3JjX3N0cmlkZSwgaW50IHJuZCwgaW50NjRfdCBzaGlmdCk7Cit0eXBlZGVmIHZvaWQgKCp2YzFfbXNwZWxfbWNfZmlsdGVyX2hvcl8xNmJpdHMpKHVpbnQ4X3QgKmRzdCwgeDg2X3JlZyBkc3Rfc3RyaWRlLCBjb25zdCBpbnQxNl90ICpzcmMsIGludCBybmQpOwordHlwZWRlZiB2b2lkICgqdmMxX21zcGVsX21jX2ZpbHRlcl84Yml0cykodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHg4Nl9yZWcgc3RyaWRlLCBpbnQgcm5kLCB4ODZfcmVnIG9mZnNldCk7CisKKy8qKgorICogSW50ZXJwb2xhdGUgZnJhY3Rpb25hbCBwZWwgdmFsdWVzIGJ5IGFwcGx5aW5nIHByb3BlciB2ZXJ0aWNhbCB0aGVuCisgKiBob3Jpem9udGFsIGZpbHRlci4KKyAqCisgKiBAcGFyYW0gIGRzdCAgICAgRGVzdGluYXRpb24gYnVmZmVyIGZvciBpbnRlcnBvbGF0ZWQgcGVscy4KKyAqIEBwYXJhbSAgc3JjICAgICBTb3VyY2UgYnVmZmVyLgorICogQHBhcmFtICBzdHJpZGUgIFN0cmlkZSBmb3IgYm90aCBzcmMgYW5kIGRzdCBidWZmZXJzLgorICogQHBhcmFtICBobW9kZSAgIEhvcml6b250YWwgZmlsdGVyIChleHByZXNzZWQgaW4gcXVhcnRlciBwaXhlbHMgc2hpZnQpLgorICogQHBhcmFtICBobW9kZSAgIFZlcnRpY2FsIGZpbHRlci4KKyAqIEBwYXJhbSAgcm5kICAgICBSb3VuZGluZyBiaWFzLgorICovCisjZGVmaW5lIFZDMV9NU1BFTF9NQyhPUClcCitzdGF0aWMgdm9pZCBPUCAjIyB2YzFfbXNwZWxfbWModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBobW9kZSwgaW50IHZtb2RlLCBpbnQgcm5kKVwKK3tcCisgICAgc3RhdGljIGNvbnN0IHZjMV9tc3BlbF9tY19maWx0ZXJfdmVyXzE2Yml0cyB2YzFfcHV0X3NoaWZ0X3Zlcl8xNmJpdHNbXSA9XAorICAgICAgICAgeyBOVUxMLCB2YzFfcHV0X3Zlcl8xNmJfc2hpZnQxX21teCwgdmMxX3B1dF92ZXJfMTZiX3NoaWZ0Ml9tbXgsIHZjMV9wdXRfdmVyXzE2Yl9zaGlmdDNfbW14IH07XAorICAgIHN0YXRpYyBjb25zdCB2YzFfbXNwZWxfbWNfZmlsdGVyX2hvcl8xNmJpdHMgdmMxX3B1dF9zaGlmdF9ob3JfMTZiaXRzW10gPVwKKyAgICAgICAgIHsgTlVMTCwgT1AgIyMgdmMxX2hvcl8xNmJfc2hpZnQxX21teCwgT1AgIyMgdmMxX2hvcl8xNmJfc2hpZnQyX21teCwgT1AgIyMgdmMxX2hvcl8xNmJfc2hpZnQzX21teCB9O1wKKyAgICBzdGF0aWMgY29uc3QgdmMxX21zcGVsX21jX2ZpbHRlcl84Yml0cyB2YzFfcHV0X3NoaWZ0XzhiaXRzW10gPVwKKyAgICAgICAgIHsgTlVMTCwgT1AgIyMgdmMxX3NoaWZ0MV9tbXgsIE9QICMjIHZjMV9zaGlmdDJfbW14LCBPUCAjIyB2YzFfc2hpZnQzX21teCB9O1wKK1wKKyAgICBfX2FzbV9fIHZvbGF0aWxlKFwKKyAgICAgICAgInB4b3IgJSVtbTAsICUlbW0wICAgICAgICAgXG5cdCJcCisgICAgICAgIDo6OiAibWVtb3J5IlwKKyAgICApO1wKK1wKKyAgICBpZiAodm1vZGUpIHsgLyogVmVydGljYWwgZmlsdGVyIHRvIGFwcGx5ICovXAorICAgICAgICBpZiAoaG1vZGUpIHsgLyogSG9yaXpvbnRhbCBmaWx0ZXIgdG8gYXBwbHksIG91dHB1dCB0byB0bXAgKi9cCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IHNoaWZ0X3ZhbHVlW10gPSB7IDAsIDUsIDEsIDUgfTtcCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHNoaWZ0ID0gKHNoaWZ0X3ZhbHVlW2htb2RlXStzaGlmdF92YWx1ZVt2bW9kZV0pPj4xO1wKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgcjtcCisgICAgICAgICAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIHRtcClbMTIqOF07XAorXAorICAgICAgICAgICAgciA9ICgxPDwoc2hpZnQtMSkpICsgcm5kLTE7XAorICAgICAgICAgICAgdmMxX3B1dF9zaGlmdF92ZXJfMTZiaXRzW3Ztb2RlXSh0bXAsIHNyYy0xLCBzdHJpZGUsIHIsIHNoaWZ0KTtcCitcCisgICAgICAgICAgICB2YzFfcHV0X3NoaWZ0X2hvcl8xNmJpdHNbaG1vZGVdKGRzdCwgc3RyaWRlLCB0bXArMSwgNjQtcm5kKTtcCisgICAgICAgICAgICByZXR1cm47XAorICAgICAgICB9XAorICAgICAgICBlbHNlIHsgLyogTm8gaG9yaXpvbnRhbCBmaWx0ZXIsIG91dHB1dCA4IGxpbmVzIHRvIGRzdCAqL1wKKyAgICAgICAgICAgIHZjMV9wdXRfc2hpZnRfOGJpdHNbdm1vZGVdKGRzdCwgc3JjLCBzdHJpZGUsIDEtcm5kLCBzdHJpZGUpO1wKKyAgICAgICAgICAgIHJldHVybjtcCisgICAgICAgIH1cCisgICAgfVwKK1wKKyAgICAvKiBIb3Jpem9udGFsIG1vZGUgd2l0aCBubyB2ZXJ0aWNhbCBtb2RlICovXAorICAgIHZjMV9wdXRfc2hpZnRfOGJpdHNbaG1vZGVdKGRzdCwgc3JjLCBzdHJpZGUsIHJuZCwgMSk7XAorfSBcCitzdGF0aWMgdm9pZCBPUCAjIyB2YzFfbXNwZWxfbWNfMTYodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaG1vZGUsIGludCB2bW9kZSwgaW50IHJuZClcCit7IFwKKyAgICBPUCAjIyB2YzFfbXNwZWxfbWMoZHN0ICsgMCwgc3JjICsgMCwgc3RyaWRlLCBobW9kZSwgdm1vZGUsIHJuZCk7IFwKKyAgICBPUCAjIyB2YzFfbXNwZWxfbWMoZHN0ICsgOCwgc3JjICsgOCwgc3RyaWRlLCBobW9kZSwgdm1vZGUsIHJuZCk7IFwKKyAgICBkc3QgKz0gOCpzdHJpZGU7IHNyYyArPSA4KnN0cmlkZTsgXAorICAgIE9QICMjIHZjMV9tc3BlbF9tYyhkc3QgKyAwLCBzcmMgKyAwLCBzdHJpZGUsIGhtb2RlLCB2bW9kZSwgcm5kKTsgXAorICAgIE9QICMjIHZjMV9tc3BlbF9tYyhkc3QgKyA4LCBzcmMgKyA4LCBzdHJpZGUsIGhtb2RlLCB2bW9kZSwgcm5kKTsgXAorfQorCitWQzFfTVNQRUxfTUMocHV0XykKK1ZDMV9NU1BFTF9NQyhhdmdfKQorCisvKiogTWFjcm8gdG8gZWFzZSBiaWN1YmljIGZpbHRlciBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgKi8KKyNkZWZpbmUgREVDTEFSRV9GVU5DVElPTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHB1dF92YzFfbXNwZWxfbWMgIyMgYSAjIyBiICMjIF9tbXgodWludDhfdCAqZHN0LCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJuZCkgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgcHV0X3ZjMV9tc3BlbF9tYyhkc3QsIHNyYywgc3RyaWRlLCBhLCBiLCBybmQpOyAgICAgICAgICAgICAgICAgICAgIFwKK31cCitzdGF0aWMgdm9pZCBhdmdfdmMxX21zcGVsX21jICMjIGEgIyMgYiAjIyBfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBybmQpICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGF2Z192YzFfbXNwZWxfbWMoZHN0LCBzcmMsIHN0cmlkZSwgYSwgYiwgcm5kKTsgICAgICAgICAgICAgICAgICAgICBcCit9XAorc3RhdGljIHZvaWQgcHV0X3ZjMV9tc3BlbF9tYyAjIyBhICMjIGIgIyMgXzE2X21teCh1aW50OF90ICpkc3QsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm5kKSAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBwdXRfdmMxX21zcGVsX21jXzE2KGRzdCwgc3JjLCBzdHJpZGUsIGEsIGIsIHJuZCk7ICAgICAgICAgICAgICAgICAgXAorfVwKK3N0YXRpYyB2b2lkIGF2Z192YzFfbXNwZWxfbWMgIyMgYSAjIyBiICMjIF8xNl9tbXhleHQodWludDhfdCAqZHN0LCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJuZCkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgYXZnX3ZjMV9tc3BlbF9tY18xNihkc3QsIHNyYywgc3RyaWRlLCBhLCBiLCBybmQpOyAgICAgICAgICAgICAgICAgIFwKK30KKworREVDTEFSRV9GVU5DVElPTigwLCAxKQorREVDTEFSRV9GVU5DVElPTigwLCAyKQorREVDTEFSRV9GVU5DVElPTigwLCAzKQorCitERUNMQVJFX0ZVTkNUSU9OKDEsIDApCitERUNMQVJFX0ZVTkNUSU9OKDEsIDEpCitERUNMQVJFX0ZVTkNUSU9OKDEsIDIpCitERUNMQVJFX0ZVTkNUSU9OKDEsIDMpCisKK0RFQ0xBUkVfRlVOQ1RJT04oMiwgMCkKK0RFQ0xBUkVfRlVOQ1RJT04oMiwgMSkKK0RFQ0xBUkVfRlVOQ1RJT04oMiwgMikKK0RFQ0xBUkVfRlVOQ1RJT04oMiwgMykKKworREVDTEFSRV9GVU5DVElPTigzLCAwKQorREVDTEFSRV9GVU5DVElPTigzLCAxKQorREVDTEFSRV9GVU5DVElPTigzLCAyKQorREVDTEFSRV9GVU5DVElPTigzLCAzKQorCitzdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzR4NF9kY19tbXhleHQodWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBkYyA9IGJsb2NrWzBdOworICAgIGRjID0gKDE3ICogZGMgKyAgNCkgPj4gMzsKKyAgICBkYyA9ICgxNyAqIGRjICsgNjQpID4+IDc7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdmQgICAgICAgICAgJTAsICUlbW0wIFxuXHQiCisgICAgICAgICJwc2h1ZncgJDAsICUlbW0wLCAlJW1tMCBcblx0IgorICAgICAgICAicHhvciAgICAgICAlJW1tMSwgJSVtbTEgXG5cdCIKKyAgICAgICAgInBzdWJ3ICAgICAgJSVtbTAsICUlbW0xIFxuXHQiCisgICAgICAgICJwYWNrdXN3YiAgICUlbW0wLCAlJW1tMCBcblx0IgorICAgICAgICAicGFja3Vzd2IgICAlJW1tMSwgJSVtbTEgXG5cdCIKKyAgICAgICAgOjoiciIoZGMpCisgICAgKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92ZCAgICAgICAgICAlMCwgJSVtbTIgXG5cdCIKKyAgICAgICAgIm1vdmQgICAgICAgICAgJTEsICUlbW0zIFxuXHQiCisgICAgICAgICJtb3ZkICAgICAgICAgICUyLCAlJW1tNCBcblx0IgorICAgICAgICAibW92ZCAgICAgICAgICAlMywgJSVtbTUgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJSVtbTAsICUlbW0yIFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICUlbW0wLCAlJW1tMyBcblx0IgorICAgICAgICAicGFkZHVzYiAgICAlJW1tMCwgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJSVtbTAsICUlbW01IFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICUlbW0xLCAlJW1tMiBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlJW1tMSwgJSVtbTMgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJSVtbTEsICUlbW00IFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICUlbW0xLCAlJW1tNSBcblx0IgorICAgICAgICAibW92ZCAgICAgICAlJW1tMiwgJTAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgICAgICAgJSVtbTMsICUxICAgIFxuXHQiCisgICAgICAgICJtb3ZkICAgICAgICUlbW00LCAlMiAgICBcblx0IgorICAgICAgICAibW92ZCAgICAgICAlJW1tNSwgJTMgICAgXG5cdCIKKyAgICAgICAgOiIrbSIoKih1aW50MzJfdCopKGRlc3QrMCpsaW5lc2l6ZSkpLAorICAgICAgICAgIittIigqKHVpbnQzMl90KikoZGVzdCsxKmxpbmVzaXplKSksCisgICAgICAgICAiK20iKCoodWludDMyX3QqKShkZXN0KzIqbGluZXNpemUpKSwKKyAgICAgICAgICIrbSIoKih1aW50MzJfdCopKGRlc3QrMypsaW5lc2l6ZSkpCisgICAgKTsKK30KKworc3RhdGljIHZvaWQgdmMxX2ludl90cmFuc180eDhfZGNfbW14ZXh0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgZGMgPSBibG9ja1swXTsKKyAgICBkYyA9ICgxNyAqIGRjICsgIDQpID4+IDM7CisgICAgZGMgPSAoMTIgKiBkYyArIDY0KSA+PiA3OworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZkICAgICAgICAgICUwLCAlJW1tMCBcblx0IgorICAgICAgICAicHNodWZ3ICQwLCAlJW1tMCwgJSVtbTAgXG5cdCIKKyAgICAgICAgInB4b3IgICAgICAgJSVtbTEsICUlbW0xIFxuXHQiCisgICAgICAgICJwc3VidyAgICAgICUlbW0wLCAlJW1tMSBcblx0IgorICAgICAgICAicGFja3Vzd2IgICAlJW1tMCwgJSVtbTAgXG5cdCIKKyAgICAgICAgInBhY2t1c3diICAgJSVtbTEsICUlbW0xIFxuXHQiCisgICAgICAgIDo6InIiKGRjKQorICAgICk7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdmQgICAgICAgICAgJTAsICUlbW0yIFxuXHQiCisgICAgICAgICJtb3ZkICAgICAgICAgICUxLCAlJW1tMyBcblx0IgorICAgICAgICAibW92ZCAgICAgICAgICAlMiwgJSVtbTQgXG5cdCIKKyAgICAgICAgIm1vdmQgICAgICAgICAgJTMsICUlbW01IFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICUlbW0wLCAlJW1tMiBcblx0IgorICAgICAgICAicGFkZHVzYiAgICAlJW1tMCwgJSVtbTMgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJSVtbTAsICUlbW00IFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICUlbW0wLCAlJW1tNSBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlJW1tMSwgJSVtbTIgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJSVtbTEsICUlbW0zIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICUlbW0xLCAlJW1tNCBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlJW1tMSwgJSVtbTUgXG5cdCIKKyAgICAgICAgIm1vdmQgICAgICAgJSVtbTIsICUwICAgIFxuXHQiCisgICAgICAgICJtb3ZkICAgICAgICUlbW0zLCAlMSAgICBcblx0IgorICAgICAgICAibW92ZCAgICAgICAlJW1tNCwgJTIgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgICAgICAgJSVtbTUsICUzICAgIFxuXHQiCisgICAgICAgIDoiK20iKCoodWludDMyX3QqKShkZXN0KzAqbGluZXNpemUpKSwKKyAgICAgICAgICIrbSIoKih1aW50MzJfdCopKGRlc3QrMSpsaW5lc2l6ZSkpLAorICAgICAgICAgIittIigqKHVpbnQzMl90KikoZGVzdCsyKmxpbmVzaXplKSksCisgICAgICAgICAiK20iKCoodWludDMyX3QqKShkZXN0KzMqbGluZXNpemUpKQorICAgICk7CisgICAgZGVzdCArPSA0KmxpbmVzaXplOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZkICAgICAgICAgICUwLCAlJW1tMiBcblx0IgorICAgICAgICAibW92ZCAgICAgICAgICAlMSwgJSVtbTMgXG5cdCIKKyAgICAgICAgIm1vdmQgICAgICAgICAgJTIsICUlbW00IFxuXHQiCisgICAgICAgICJtb3ZkICAgICAgICAgICUzLCAlJW1tNSBcblx0IgorICAgICAgICAicGFkZHVzYiAgICAlJW1tMCwgJSVtbTIgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJSVtbTAsICUlbW0zIFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICUlbW0wLCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHVzYiAgICAlJW1tMCwgJSVtbTUgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJSVtbTEsICUlbW0yIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICUlbW0xLCAlJW1tMyBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlJW1tMSwgJSVtbTQgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJSVtbTEsICUlbW01IFxuXHQiCisgICAgICAgICJtb3ZkICAgICAgICUlbW0yLCAlMCAgICBcblx0IgorICAgICAgICAibW92ZCAgICAgICAlJW1tMywgJTEgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgICAgICAgJSVtbTQsICUyICAgIFxuXHQiCisgICAgICAgICJtb3ZkICAgICAgICUlbW01LCAlMyAgICBcblx0IgorICAgICAgICA6IittIigqKHVpbnQzMl90KikoZGVzdCswKmxpbmVzaXplKSksCisgICAgICAgICAiK20iKCoodWludDMyX3QqKShkZXN0KzEqbGluZXNpemUpKSwKKyAgICAgICAgICIrbSIoKih1aW50MzJfdCopKGRlc3QrMipsaW5lc2l6ZSkpLAorICAgICAgICAgIittIigqKHVpbnQzMl90KikoZGVzdCszKmxpbmVzaXplKSkKKyAgICApOworfQorCitzdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzh4NF9kY19tbXhleHQodWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBkYyA9IGJsb2NrWzBdOworICAgIGRjID0gKCAzICogZGMgKyAgMSkgPj4gMTsKKyAgICBkYyA9ICgxNyAqIGRjICsgNjQpID4+IDc7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdmQgICAgICAgICAgJTAsICUlbW0wIFxuXHQiCisgICAgICAgICJwc2h1ZncgJDAsICUlbW0wLCAlJW1tMCBcblx0IgorICAgICAgICAicHhvciAgICAgICAlJW1tMSwgJSVtbTEgXG5cdCIKKyAgICAgICAgInBzdWJ3ICAgICAgJSVtbTAsICUlbW0xIFxuXHQiCisgICAgICAgICJwYWNrdXN3YiAgICUlbW0wLCAlJW1tMCBcblx0IgorICAgICAgICAicGFja3Vzd2IgICAlJW1tMSwgJSVtbTEgXG5cdCIKKyAgICAgICAgOjoiciIoZGMpCisgICAgKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92cSAgICAgICAgICAlMCwgJSVtbTIgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgICAgJTEsICUlbW0zIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICAgICUyLCAlJW1tNCBcblx0IgorICAgICAgICAibW92cSAgICAgICAgICAlMywgJSVtbTUgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJSVtbTAsICUlbW0yIFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICUlbW0wLCAlJW1tMyBcblx0IgorICAgICAgICAicGFkZHVzYiAgICAlJW1tMCwgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJSVtbTAsICUlbW01IFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICUlbW0xLCAlJW1tMiBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlJW1tMSwgJSVtbTMgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJSVtbTEsICUlbW00IFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICUlbW0xLCAlJW1tNSBcblx0IgorICAgICAgICAibW92cSAgICAgICAlJW1tMiwgJTAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgJSVtbTMsICUxICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICUlbW00LCAlMiAgICBcblx0IgorICAgICAgICAibW92cSAgICAgICAlJW1tNSwgJTMgICAgXG5cdCIKKyAgICAgICAgOiIrbSIoKih1aW50MzJfdCopKGRlc3QrMCpsaW5lc2l6ZSkpLAorICAgICAgICAgIittIigqKHVpbnQzMl90KikoZGVzdCsxKmxpbmVzaXplKSksCisgICAgICAgICAiK20iKCoodWludDMyX3QqKShkZXN0KzIqbGluZXNpemUpKSwKKyAgICAgICAgICIrbSIoKih1aW50MzJfdCopKGRlc3QrMypsaW5lc2l6ZSkpCisgICAgKTsKK30KKworc3RhdGljIHZvaWQgdmMxX2ludl90cmFuc184eDhfZGNfbW14ZXh0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgZGMgPSBibG9ja1swXTsKKyAgICBkYyA9ICgzICogZGMgKyAgMSkgPj4gMTsKKyAgICBkYyA9ICgzICogZGMgKyAxNikgPj4gNTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92ZCAgICAgICAgICAlMCwgJSVtbTAgXG5cdCIKKyAgICAgICAgInBzaHVmdyAkMCwgJSVtbTAsICUlbW0wIFxuXHQiCisgICAgICAgICJweG9yICAgICAgICUlbW0xLCAlJW1tMSBcblx0IgorICAgICAgICAicHN1YncgICAgICAlJW1tMCwgJSVtbTEgXG5cdCIKKyAgICAgICAgInBhY2t1c3diICAgJSVtbTAsICUlbW0wIFxuXHQiCisgICAgICAgICJwYWNrdXN3YiAgICUlbW0xLCAlJW1tMSBcblx0IgorICAgICAgICA6OiJyIihkYykKKyAgICApOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZxICAgICAgICAgICUwLCAlJW1tMiBcblx0IgorICAgICAgICAibW92cSAgICAgICAgICAlMSwgJSVtbTMgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgICAgJTIsICUlbW00IFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICAgICUzLCAlJW1tNSBcblx0IgorICAgICAgICAicGFkZHVzYiAgICAlJW1tMCwgJSVtbTIgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJSVtbTAsICUlbW0zIFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICUlbW0wLCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHVzYiAgICAlJW1tMCwgJSVtbTUgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJSVtbTEsICUlbW0yIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICUlbW0xLCAlJW1tMyBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlJW1tMSwgJSVtbTQgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJSVtbTEsICUlbW01IFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICUlbW0yLCAlMCAgICBcblx0IgorICAgICAgICAibW92cSAgICAgICAlJW1tMywgJTEgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgJSVtbTQsICUyICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICUlbW01LCAlMyAgICBcblx0IgorICAgICAgICA6IittIigqKHVpbnQzMl90KikoZGVzdCswKmxpbmVzaXplKSksCisgICAgICAgICAiK20iKCoodWludDMyX3QqKShkZXN0KzEqbGluZXNpemUpKSwKKyAgICAgICAgICIrbSIoKih1aW50MzJfdCopKGRlc3QrMipsaW5lc2l6ZSkpLAorICAgICAgICAgIittIigqKHVpbnQzMl90KikoZGVzdCszKmxpbmVzaXplKSkKKyAgICApOworICAgIGRlc3QgKz0gNCpsaW5lc2l6ZTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92cSAgICAgICAgICAlMCwgJSVtbTIgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgICAgJTEsICUlbW0zIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICAgICUyLCAlJW1tNCBcblx0IgorICAgICAgICAibW92cSAgICAgICAgICAlMywgJSVtbTUgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJSVtbTAsICUlbW0yIFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICUlbW0wLCAlJW1tMyBcblx0IgorICAgICAgICAicGFkZHVzYiAgICAlJW1tMCwgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJSVtbTAsICUlbW01IFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICUlbW0xLCAlJW1tMiBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlJW1tMSwgJSVtbTMgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJSVtbTEsICUlbW00IFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICUlbW0xLCAlJW1tNSBcblx0IgorICAgICAgICAibW92cSAgICAgICAlJW1tMiwgJTAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgJSVtbTMsICUxICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICUlbW00LCAlMiAgICBcblx0IgorICAgICAgICAibW92cSAgICAgICAlJW1tNSwgJTMgICAgXG5cdCIKKyAgICAgICAgOiIrbSIoKih1aW50MzJfdCopKGRlc3QrMCpsaW5lc2l6ZSkpLAorICAgICAgICAgIittIigqKHVpbnQzMl90KikoZGVzdCsxKmxpbmVzaXplKSksCisgICAgICAgICAiK20iKCoodWludDMyX3QqKShkZXN0KzIqbGluZXNpemUpKSwKKyAgICAgICAgICIrbSIoKih1aW50MzJfdCopKGRlc3QrMypsaW5lc2l6ZSkpCisgICAgKTsKK30KKworI2lmIEhBVkVfTU1YX0VYVEVSTkFMCitzdGF0aWMgdm9pZCBwdXRfdmMxX21zcGVsX21jMDBfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKQoreworICAgIGZmX3B1dF9waXhlbHM4X21teChkc3QsIHNyYywgc3RyaWRlLCA4KTsKK30KK3N0YXRpYyB2b2lkIHB1dF92YzFfbXNwZWxfbWMwMF8xNl9tbXgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpCit7CisgICAgZmZfcHV0X3BpeGVsczE2X21teChkc3QsIHNyYywgc3RyaWRlLCAxNik7Cit9CitzdGF0aWMgdm9pZCBhdmdfdmMxX21zcGVsX21jMDBfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKQoreworICAgIGZmX2F2Z19waXhlbHM4X21teChkc3QsIHNyYywgc3RyaWRlLCA4KTsKK30KK3N0YXRpYyB2b2lkIGF2Z192YzFfbXNwZWxfbWMwMF8xNl9tbXgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpCit7CisgICAgZmZfYXZnX3BpeGVsczE2X21teChkc3QsIHNyYywgc3RyaWRlLCAxNik7Cit9CisjZW5kaWYKKworI2RlZmluZSBGTl9BU1NJR04oT1AsIFgsIFksIElOU04pIFwKKyAgICBkc3AtPk9QIyN2YzFfbXNwZWxfcGl4ZWxzX3RhYlsxXVtYKzQqWV0gPSBPUCMjdmMxX21zcGVsX21jIyNYIyNZIyNJTlNOOyBcCisgICAgZHNwLT5PUCMjdmMxX21zcGVsX3BpeGVsc190YWJbMF1bWCs0KlldID0gT1AjI3ZjMV9tc3BlbF9tYyMjWCMjWSMjXzE2IyNJTlNOCisKK2F2X2NvbGQgdm9pZCBmZl92YzFkc3BfaW5pdF9tbXgoVkMxRFNQQ29udGV4dCAqZHNwKQoreworI2lmIEhBVkVfTU1YX0VYVEVSTkFMCisgICAgRk5fQVNTSUdOKHB1dF8sIDAsIDAsIF9tbXgpOworICAgIEZOX0FTU0lHTihhdmdfLCAwLCAwLCBfbW14KTsKKyNlbmRpZgorICAgIEZOX0FTU0lHTihwdXRfLCAwLCAxLCBfbW14KTsKKyAgICBGTl9BU1NJR04ocHV0XywgMCwgMiwgX21teCk7CisgICAgRk5fQVNTSUdOKHB1dF8sIDAsIDMsIF9tbXgpOworCisgICAgRk5fQVNTSUdOKHB1dF8sIDEsIDAsIF9tbXgpOworICAgIEZOX0FTU0lHTihwdXRfLCAxLCAxLCBfbW14KTsKKyAgICBGTl9BU1NJR04ocHV0XywgMSwgMiwgX21teCk7CisgICAgRk5fQVNTSUdOKHB1dF8sIDEsIDMsIF9tbXgpOworCisgICAgRk5fQVNTSUdOKHB1dF8sIDIsIDAsIF9tbXgpOworICAgIEZOX0FTU0lHTihwdXRfLCAyLCAxLCBfbW14KTsKKyAgICBGTl9BU1NJR04ocHV0XywgMiwgMiwgX21teCk7CisgICAgRk5fQVNTSUdOKHB1dF8sIDIsIDMsIF9tbXgpOworCisgICAgRk5fQVNTSUdOKHB1dF8sIDMsIDAsIF9tbXgpOworICAgIEZOX0FTU0lHTihwdXRfLCAzLCAxLCBfbW14KTsKKyAgICBGTl9BU1NJR04ocHV0XywgMywgMiwgX21teCk7CisgICAgRk5fQVNTSUdOKHB1dF8sIDMsIDMsIF9tbXgpOworfQorCithdl9jb2xkIHZvaWQgZmZfdmMxZHNwX2luaXRfbW14ZXh0KFZDMURTUENvbnRleHQgKmRzcCkKK3sKKyAgICBGTl9BU1NJR04oYXZnXywgMCwgMSwgX21teGV4dCk7CisgICAgRk5fQVNTSUdOKGF2Z18sIDAsIDIsIF9tbXhleHQpOworICAgIEZOX0FTU0lHTihhdmdfLCAwLCAzLCBfbW14ZXh0KTsKKworICAgIEZOX0FTU0lHTihhdmdfLCAxLCAwLCBfbW14ZXh0KTsKKyAgICBGTl9BU1NJR04oYXZnXywgMSwgMSwgX21teGV4dCk7CisgICAgRk5fQVNTSUdOKGF2Z18sIDEsIDIsIF9tbXhleHQpOworICAgIEZOX0FTU0lHTihhdmdfLCAxLCAzLCBfbW14ZXh0KTsKKworICAgIEZOX0FTU0lHTihhdmdfLCAyLCAwLCBfbW14ZXh0KTsKKyAgICBGTl9BU1NJR04oYXZnXywgMiwgMSwgX21teGV4dCk7CisgICAgRk5fQVNTSUdOKGF2Z18sIDIsIDIsIF9tbXhleHQpOworICAgIEZOX0FTU0lHTihhdmdfLCAyLCAzLCBfbW14ZXh0KTsKKworICAgIEZOX0FTU0lHTihhdmdfLCAzLCAwLCBfbW14ZXh0KTsKKyAgICBGTl9BU1NJR04oYXZnXywgMywgMSwgX21teGV4dCk7CisgICAgRk5fQVNTSUdOKGF2Z18sIDMsIDIsIF9tbXhleHQpOworICAgIEZOX0FTU0lHTihhdmdfLCAzLCAzLCBfbW14ZXh0KTsKKworICAgIGRzcC0+dmMxX2ludl90cmFuc184eDhfZGMgPSB2YzFfaW52X3RyYW5zXzh4OF9kY19tbXhleHQ7CisgICAgZHNwLT52YzFfaW52X3RyYW5zXzR4OF9kYyA9IHZjMV9pbnZfdHJhbnNfNHg4X2RjX21teGV4dDsKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfOHg0X2RjID0gdmMxX2ludl90cmFuc184eDRfZGNfbW14ZXh0OworICAgIGRzcC0+dmMxX2ludl90cmFuc180eDRfZGMgPSB2YzFfaW52X3RyYW5zXzR4NF9kY19tbXhleHQ7Cit9CisjZW5kaWYgLyogSEFWRV82UkVHUyAmJiBIQVZFX0lOTElORV9BU00gKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92aWRlb2RzcC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdmlkZW9kc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDQzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdmlkZW9kc3AuYXNtCkBAIC0wLDAgKzEsNDcwIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBDb3JlIHZpZGVvIERTUCBmdW5jdGlvbnMKKzsqIENvcHlyaWdodCAoYykgMjAxMiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTiAudGV4dAorCis7IHNsb3cgdmVydGljYWwgZXh0ZW5zaW9uIGxvb3AgZnVuY3Rpb24uIFdvcmtzIHdpdGggdmFyaWFibGUtd2lkdGgsIGFuZAorOyBkb2VzIHBlci1saW5lIHJlYWRpbmcvd3JpdGluZyBvZiBzb3VyY2UgZGF0YQorCislbWFjcm8gVl9DT1BZX1JPVyAyIDsgdHlwZSAodG9wL2JvZHkvYm90dG9tKSwgaAorLiUxX3lfbG9vcDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBkbyB7CisgICAgbW92ICAgICAgICAgICAgICB3cSwgcjdtcCAgICAgICAgICAgICAgICAgICA7ICAgaW5pdGlhbGl6ZSB3IChyN21wID0gd21wKQorLiUxX3hfbG9vcDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIGRvIHsKKyAgICBtb3Z1ICAgICAgICAgICAgIG0wLCBbc3JjcSt3cV0gICAgICAgICAgICAgIDsgICAgIG0wID0gcmVhZCgkbW1zaXplKQorICAgIG1vdnUgICAgICBbZHN0cSt3cV0sIG0wICAgICAgICAgICAgICAgICAgICAgOyAgICAgd3JpdGUobTAsICRtbXNpemUpCisgICAgYWRkICAgICAgICAgICAgICB3cSwgbW1zaXplICAgICAgICAgICAgICAgICA7ICAgICB3IC09ICRtbXNpemUKKyAgICBjbXAgICAgICAgICAgICAgIHdxLCAtbW1zaXplICAgICAgICAgICAgICAgIDsgICB9IHdoaWxlICh3ID4gJG1tc2l6ZSk7CisgICAgamwgLiUxX3hfbG9vcAorICAgIG1vdnUgICAgICAgICAgICAgbTAsIFtzcmNxLW1tc2l6ZV0gICAgICAgICAgOyAgICAgbTAgPSByZWFkKCRtbXNpemUpCisgICAgbW92dSAgW2RzdHEtbW1zaXplXSwgbTAgICAgICAgICAgICAgICAgICAgICA7ICAgICB3cml0ZShtMCwgJG1tc2l6ZSkKKyVpZmlkbiAlMSwgYm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgICBpZiAoJHR5cGUgPT0gYm9keSkgeworICAgIGFkZCAgICAgICAgICAgIHNyY3EsIHNyY19zdHJpZGVxICAgICAgICAgICAgOyAgICAgc3JjICs9IHNyY19zdHJpZGUKKyVlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgICB9CisgICAgYWRkICAgICAgICAgICAgZHN0cSwgZHN0X3N0cmlkZXEgICAgICAgICAgICA7ICAgZHN0ICs9IGRzdF9zdHJpZGUKKyAgICBkZWMgICAgICAgICAgICAgICUyICAgICAgICAgICAgICAgICAgICAgICAgIDsgfSB3aGlsZSAoLS0kaCk7CisgICAgam56IC4lMV95X2xvb3AKKyVlbmRtYWNybworCislbWFjcm8gdnZhcl9mbiAwCis7IC4tLS0tLiA8LSB6ZXJvCis7IHwgICAgfCAgICA8LSB0b3AgaXMgY29waWVkIGZyb20gZmlyc3QgbGluZSBpbiBib2R5IG9mIHNvdXJjZQorOyB8LS0tLXwgPC0gc3RhcnRfeQorOyB8ICAgIHwgICAgPC0gYm9keSBpcyBjb3BpZWQgdmVyYmF0aW0gKGxpbmUtYnktbGluZSkgZnJvbSBzb3VyY2UKKzsgfC0tLS18IDwtIGVuZF95Cis7IHwgICAgfCAgICA8LSBib3R0b20gaXMgY29waWVkIGZyb20gbGFzdCBsaW5lIGluIGJvZHkgb2Ygc291cmNlCis7ICctLS0tJyA8LSBiaAorJWlmIEFSQ0hfWDg2XzY0CitjZ2xvYmFsIGVtdV9lZGdlX3Z2YXIsIDcsIDgsIDEsIGRzdCwgZHN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3ksIGVuZF95LCBiaCwgdworJWVsc2UgOyB4ODYtMzIKK2NnbG9iYWwgZW11X2VkZ2VfdnZhciwgMSwgNiwgMSwgZHN0LCBzcmMsIHN0YXJ0X3ksIGVuZF95LCBiaCwgdworJWRlZmluZSBzcmNfc3RyaWRlcSByM21wCislZGVmaW5lIGRzdF9zdHJpZGVxIHIxbXAKKyAgICBtb3YgICAgICAgICAgICBzcmNxLCByMm1wCisgICAgbW92ICAgICAgICBzdGFydF95cSwgcjRtcAorICAgIG1vdiAgICAgICAgICBlbmRfeXEsIHI1bXAKKyAgICBtb3YgICAgICAgICAgICAgYmhxLCByNm1wCislZW5kaWYKKyAgICBzdWIgICAgICAgICAgICAgYmhxLCBlbmRfeXEgICAgICAgICAgICAgICAgIDsgYmggICAgLT0gZW5kX3EKKyAgICBzdWIgICAgICAgICAgZW5kX3lxLCBzdGFydF95cSAgICAgICAgICAgICAgIDsgZW5kX3EgLT0gc3RhcnRfcQorICAgIGFkZCAgICAgICAgICAgIHNyY3EsIHI3bXAgICAgICAgICAgICAgICAgICAgOyAocjdtcCA9IHdtcCkKKyAgICBhZGQgICAgICAgICAgICBkc3RxLCByN21wICAgICAgICAgICAgICAgICAgIDsgKHI3bXAgPSB3bXApCisgICAgbmVnICAgICAgICAgICAgcjdtcCAgICAgICAgICAgICAgICAgICAgICAgICA7IChyN21wID0gd21wKQorICAgIHRlc3QgICAgICAgc3RhcnRfeXEsIHN0YXJ0X3lxICAgICAgICAgICAgICAgOyBpZiAoc3RhcnRfcSkgeworICAgIGp6IC5ib2R5CisgICAgVl9DT1BZX1JPVyAgICAgIHRvcCwgc3RhcnRfeXEgICAgICAgICAgICAgICA7ICAgdl9jb3B5X3Jvdyh0b3AsIHN0YXJ0X3lxKQorLmJvZHk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB9CisgICAgVl9DT1BZX1JPVyAgICAgYm9keSwgZW5kX3lxICAgICAgICAgICAgICAgICA7IHZfY29weV9yb3coYm9keSwgZW5kX3lxKQorICAgIHRlc3QgICAgICAgICAgICBiaHEsIGJocSAgICAgICAgICAgICAgICAgICAgOyBpZiAoYmgpIHsKKyAgICBqeiAuZW5kCisgICAgc3ViICAgICAgICAgICAgc3JjcSwgc3JjX3N0cmlkZXEgICAgICAgICAgICA7ICAgc3JjIC09IHNyY19zdHJpZGUKKyAgICBWX0NPUFlfUk9XICAgYm90dG9tLCBiaHEgICAgICAgICAgICAgICAgICAgIDsgICB2X2NvcHlfcm93KGJvdHRvbSwgYmgpCisuZW5kOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IH0KKyAgICBSRVQKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIG1teAordnZhcl9mbgorJWVuZGlmCisKK0lOSVRfWE1NIHNzZQordnZhcl9mbgorCislbWFjcm8gaHZhcl9mbiAwCitjZ2xvYmFsIGVtdV9lZGdlX2h2YXIsIDUsIDYsIDEsIGRzdCwgZHN0X3N0cmlkZSwgc3RhcnRfeCwgbl93b3JkcywgaCwgdworICAgIGxlYSAgICAgICAgICAgIGRzdHEsIFtkc3RxK25fd29yZHNxKjJdCisgICAgbmVnICAgICAgICBuX3dvcmRzcQorICAgIGxlYSAgICAgICAgc3RhcnRfeHEsIFtzdGFydF94cStuX3dvcmRzcSoyXQorLnlfbG9vcDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBkbyB7CislaWYgY3B1ZmxhZyhhdngyKQorICAgIHZwYnJvYWRjYXN0YiAgICAgbTAsIFtkc3RxK3N0YXJ0X3hxXQorICAgIG1vdiAgICAgICAgICAgICAgd3EsIG5fd29yZHNxICAgICAgICAgICAgICAgOyAgIGluaXRpYWxpemUgdworJWVsc2UKKyAgICBtb3Z6eCAgICAgICAgICAgIHdkLCBieXRlIFtkc3RxK3N0YXJ0X3hxXSAgIDsgICB3ID0gcmVhZCgxKQorICAgIGltdWwgICAgICAgICAgICAgd2QsIDB4MDEwMTAxMDEgICAgICAgICAgICAgOyAgIHcgKj0gMHgwMTAxMDEwMQorICAgIG1vdmQgICAgICAgICAgICAgbTAsIHdkCisgICAgbW92ICAgICAgICAgICAgICB3cSwgbl93b3Jkc3EgICAgICAgICAgICAgICA7ICAgaW5pdGlhbGl6ZSB3CislaWYgY3B1ZmxhZyhzc2UyKQorICAgIHBzaHVmZCAgICAgICAgICAgbTAsIG0wLCBxMDAwMCAgICAgICAgICAgICAgOyAgIHNwbGF0CislZWxzZSA7IG1teAorICAgIHB1bnBja2xkcSAgICAgICAgbTAsIG0wICAgICAgICAgICAgICAgICAgICAgOyAgIHNwbGF0CislZW5kaWYgOyBtbXgvc3NlCislZW5kaWYgOyBhdngyCisueF9sb29wOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAgZG8geworICAgIG1vdnUgICAgW2RzdHErd3EqMl0sIG0wICAgICAgICAgICAgICAgICAgICAgOyAgICAgd3JpdGUoJHJlZywgJG1tc2l6ZSkKKyAgICBhZGQgICAgICAgICAgICAgIHdxLCBtbXNpemUvMiAgICAgICAgICAgICAgIDsgICAgIHcgLT0gJG1tc2l6ZS8yCisgICAgY21wICAgICAgICAgICAgICB3cSwgLW1tc2l6ZS8yICAgICAgICAgICAgICA7ICAgfSB3aGlsZSAodyA+ICRtbXNpemUvMikKKyAgICBqbCAueF9sb29wCisgICAgbW92dSAgW2RzdHEtbW1zaXplXSwgbTAgICAgICAgICAgICAgICAgICAgICA7ICAgd3JpdGUoJHJlZywgJG1tc2l6ZSkKKyAgICBhZGQgICAgICAgICAgICBkc3RxLCBkc3Rfc3RyaWRlcSAgICAgICAgICAgIDsgICBkc3QgKz0gZHN0X3N0cmlkZQorICAgIGRlYyAgICAgICAgICAgICAgaHEgICAgICAgICAgICAgICAgICAgICAgICAgOyB9IHdoaWxlIChoLS0pCisgICAgam56IC55X2xvb3AKKyAgICBSRVQKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIG1teAoraHZhcl9mbgorJWVuZGlmCisKK0lOSVRfWE1NIHNzZTIKK2h2YXJfZm4KKworJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4MgoraHZhcl9mbgorJWVuZGlmCisKKzsgbWFjcm8gdG8gcmVhZC93cml0ZSBhIGhvcml6b250YWwgbnVtYmVyIG9mIHBpeGVscyAoJTIpIHRvL2Zyb20gcmVnaXN0ZXJzCis7IG9uIHNzZSwgLSBmaWxscyB4bW0wLTE1IGZvciBjb25zZWN1dGl2ZSBzZXRzIG9mIDE2IHBpeGVscworOyAgICAgICAgIC0gaWYgKCUyICYgOCkgIGZpbGxzIDggYnl0ZXMgaW50byB4bW0kbmV4dAorOyAgICAgICAgIC0gaWYgKCUyICYgNCkgIGZpbGxzIDQgYnl0ZXMgaW50byB4bW0kbmV4dAorOyAgICAgICAgIC0gaWYgKCUyICYgMykgIGZpbGxzIDEsIDIgb3IgNCBieXRlcyBpbiBlYXgKKzsgb24gbW14LCAtIGZpbGxzIG1tMC03IGZvciBjb25zZWN1dGl2ZSBzZXRzIG9mIDggcGl4ZWxzCis7ICAgICAgICAgLSBpZiAoJTIgJiA0KSAgZmlsbHMgNCBieXRlcyBpbnRvIG1tJG5leHQKKzsgICAgICAgICAtIGlmICglMiAmIDMpICBmaWxscyAxLCAyIG9yIDQgYnl0ZXMgaW4gZWF4Cis7IHdyaXRpbmcgZGF0YSBvdXQgaXMgaW4gdGhlIHNhbWUgd2F5CislbWFjcm8gUkVBRF9OVU1fQllURVMgMgorJWFzc2lnbiAlJW9mZiAwICAgICA7IG9mZnNldCBpbiBzb3VyY2UgYnVmZmVyCislYXNzaWduICUlbW14X2lkeCAwIDsgbW14IHJlZ2lzdGVyIGluZGV4CislYXNzaWduICUleG1tX2lkeCAwIDsgeG1tIHJlZ2lzdGVyIGluZGV4CisKKyVyZXAgJTIvbW1zaXplCislaWYgbW1zaXplID09IDE2CisgICAgbW92dSAgIHhtbSAlKyAlJXhtbV9pZHgsIFtzcmNxKyUlb2ZmXQorJWFzc2lnbiAlJXhtbV9pZHggJSV4bW1faWR4KzEKKyVlbHNlIDsgbW14CisgICAgbW92dSAgICBtbSAlKyAlJW1teF9pZHgsIFtzcmNxKyUlb2ZmXQorJWFzc2lnbiAlJW1teF9pZHggJSVtbXhfaWR4KzEKKyVlbmRpZgorJWFzc2lnbiAlJW9mZiAlJW9mZittbXNpemUKKyVlbmRyZXAgOyAlMi9tbXNpemUKKworJWlmIG1tc2l6ZSA9PSAxNgorJWlmICglMi0lJW9mZikgPj0gOAorJWlmICUyID4gMTYgJiYgKCUyLSUlb2ZmKSA+IDgKKyAgICBtb3Z1ICAgeG1tICUrICUleG1tX2lkeCwgW3NyY3ErJTItMTZdCislYXNzaWduICUleG1tX2lkeCAlJXhtbV9pZHgrMQorJWFzc2lnbiAlJW9mZiAlMgorJWVsc2UKKyAgICBtb3ZxICAgIG1tICUrICUlbW14X2lkeCwgW3NyY3ErJSVvZmZdCislYXNzaWduICUlbW14X2lkeCAlJW1teF9pZHgrMQorJWFzc2lnbiAlJW9mZiAlJW9mZis4CislZW5kaWYKKyVlbmRpZiA7ICglMi0lJW9mZikgPj0gOAorJWVuZGlmCisKKyVpZiAoJTItJSVvZmYpID49IDQKKyVpZiAlMiA+IDggJiYgKCUyLSUlb2ZmKSA+IDQKKyAgICBtb3ZxICAgIG1tICUrICUlbW14X2lkeCwgW3NyY3ErJTItOF0KKyVhc3NpZ24gJSVvZmYgJTIKKyVlbHNlCisgICAgbW92ZCAgICBtbSAlKyAlJW1teF9pZHgsIFtzcmNxKyUlb2ZmXQorJWFzc2lnbiAlJW9mZiAlJW9mZis0CislZW5kaWYKKyVhc3NpZ24gJSVtbXhfaWR4ICUlbW14X2lkeCsxCislZW5kaWYgOyAoJTItJSVvZmYpID49IDQKKworJWlmICglMi0lJW9mZikgPj0gMQorJWlmICUyID49IDQKKyAgICBtb3ZkIG1tICUrICUlbW14X2lkeCwgW3NyY3ErJTItNF0KKyVlbGlmICglMi0lJW9mZikgPT0gMQorICAgIG1vdiAgICAgICAgICAgIHZhbGIsIFtzcmNxKyUyLTFdCislZWxpZiAoJTItJSVvZmYpID09IDIKKyAgICBtb3YgICAgICAgICAgICB2YWx3LCBbc3JjcSslMi0yXQorJWVsaWZpZG4gJTEsIGJvZHkKKyAgICBtb3YgICAgICAgICAgICB2YWxkLCBbc3JjcSslMi0zXQorJWVsc2UKKyAgICBtb3ZkIG1tICUrICUlbW14X2lkeCwgW3NyY3ErJTItM10KKyVlbmRpZgorJWVuZGlmIDsgKCUyLSUlb2ZmKSA+PSAxCislZW5kbWFjcm8gOyBSRUFEX05VTV9CWVRFUworCislbWFjcm8gV1JJVEVfTlVNX0JZVEVTIDIKKyVhc3NpZ24gJSVvZmYgMCAgICAgOyBvZmZzZXQgaW4gZGVzdGluYXRpb24gYnVmZmVyCislYXNzaWduICUlbW14X2lkeCAwIDsgbW14IHJlZ2lzdGVyIGluZGV4CislYXNzaWduICUleG1tX2lkeCAwIDsgeG1tIHJlZ2lzdGVyIGluZGV4CisKKyVyZXAgJTIvbW1zaXplCislaWYgbW1zaXplID09IDE2CisgICAgbW92dSAgIFtkc3RxKyUlb2ZmXSwgeG1tICUrICUleG1tX2lkeAorJWFzc2lnbiAlJXhtbV9pZHggJSV4bW1faWR4KzEKKyVlbHNlIDsgbW14CisgICAgbW92dSAgIFtkc3RxKyUlb2ZmXSwgbW0gJSsgJSVtbXhfaWR4CislYXNzaWduICUlbW14X2lkeCAlJW1teF9pZHgrMQorJWVuZGlmCislYXNzaWduICUlb2ZmICUlb2ZmK21tc2l6ZQorJWVuZHJlcCA7ICUyL21tc2l6ZQorCislaWYgbW1zaXplID09IDE2CislaWYgKCUyLSUlb2ZmKSA+PSA4CislaWYgJTIgPiAxNiAmJiAoJTItJSVvZmYpID4gOAorICAgIG1vdnUgICBbZHN0cSslMi0xNl0sIHhtbSAlKyAlJXhtbV9pZHgKKyVhc3NpZ24gJSV4bW1faWR4ICUleG1tX2lkeCsxCislYXNzaWduICUlb2ZmICUyCislZWxzZQorICAgIG1vdnEgICBbZHN0cSslJW9mZl0sIG1tICUrICUlbW14X2lkeAorJWFzc2lnbiAlJW1teF9pZHggJSVtbXhfaWR4KzEKKyVhc3NpZ24gJSVvZmYgJSVvZmYrOAorJWVuZGlmCislZW5kaWYgOyAoJTItJSVvZmYpID49IDgKKyVlbmRpZgorCislaWYgKCUyLSUlb2ZmKSA+PSA0CislaWYgJTIgPiA4ICYmICglMi0lJW9mZikgPiA0CisgICAgbW92cSAgICBbZHN0cSslMi04XSwgbW0gJSsgJSVtbXhfaWR4CislYXNzaWduICUlb2ZmICUyCislZWxzZQorICAgIG1vdmQgICBbZHN0cSslJW9mZl0sIG1tICUrICUlbW14X2lkeAorJWFzc2lnbiAlJW9mZiAlJW9mZis0CislZW5kaWYKKyVhc3NpZ24gJSVtbXhfaWR4ICUlbW14X2lkeCsxCislZW5kaWYgOyAoJTItJSVvZmYpID49IDQKKworJWlmICglMi0lJW9mZikgPj0gMQorJWlmICUyID49IDQKKyAgICBtb3ZkICAgIFtkc3RxKyUyLTRdLCBtbSAlKyAlJW1teF9pZHgKKyVlbGlmICglMi0lJW9mZikgPT0gMQorICAgIG1vdiAgICAgW2RzdHErJTItMV0sIHZhbGIKKyVlbGlmICglMi0lJW9mZikgPT0gMgorICAgIG1vdiAgICAgW2RzdHErJTItMl0sIHZhbHcKKyVlbGlmaWRuICUxLCBib2R5CisgICAgbW92ICAgICBbZHN0cSslMi0zXSwgdmFsdworICAgIHNociAgICAgICAgICAgIHZhbGQsIDE2CisgICAgbW92ICAgICBbZHN0cSslMi0xXSwgdmFsYgorJWVsc2UKKyAgICBtb3ZkICAgICAgICAgICB2YWxkLCBtbSAlKyAlJW1teF9pZHgKKyAgICBtb3YgICAgIFtkc3RxKyUyLTNdLCB2YWx3CisgICAgc2hyICAgICAgICAgICAgdmFsZCwgMTYKKyAgICBtb3YgICAgIFtkc3RxKyUyLTFdLCB2YWxiCislZW5kaWYKKyVlbmRpZiA7ICglMi0lJW9mZikgPj0gMQorJWVuZG1hY3JvIDsgV1JJVEVfTlVNX0JZVEVTCisKKzsgdmVydGljYWwgdG9wL2JvdHRvbSBleHRlbmQgYW5kIGJvZHkgY29weSBmYXN0IGxvb3BzCis7IHRoZXNlIGFyZSBmdW5jdGlvbiBwb2ludGVycyB0byBzZXQtd2lkdGggbGluZSBjb3B5IGZ1bmN0aW9ucywgaS5lLgorOyB0aGV5IHJlYWQgYSBmaXhlZCBudW1iZXIgb2YgcGl4ZWxzIGludG8gc2V0IHJlZ2lzdGVycywgYW5kIHdyaXRlCis7IHRob3NlIG91dCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyVtYWNybyBWRVJUSUNBTF9FWFRFTkQgMgorJWFzc2lnbiAlJW4gJTEKKyVyZXAgMSslMi0lMQorJWlmICUlbiA8PSAzCislaWYgQVJDSF9YODZfNjQKK2NnbG9iYWwgZW11X2VkZ2VfdmZpeCAlKyAlJW4sIDYsIDgsIDAsIGRzdCwgZHN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF95LCBlbmRfeSwgdmFsLCBiaAorICAgIG1vdiAgICAgICAgICAgICBiaHEsIHI2bXAgICAgICAgICAgICAgICAgICAgOyByNm1wID0gYmhtcAorJWVsc2UgOyB4ODYtMzIKK2NnbG9iYWwgZW11X2VkZ2VfdmZpeCAlKyAlJW4sIDAsIDYsIDAsIHZhbCwgZHN0LCBzcmMsIHN0YXJ0X3ksIGVuZF95LCBiaAorICAgIG1vdiAgICAgICAgICAgIGRzdHEsIHIwbXAKKyAgICBtb3YgICAgICAgICAgICBzcmNxLCByMm1wCisgICAgbW92ICAgICAgICBzdGFydF95cSwgcjRtcAorICAgIG1vdiAgICAgICAgICBlbmRfeXEsIHI1bXAKKyAgICBtb3YgICAgICAgICAgICAgYmhxLCByNm1wCislZGVmaW5lIGRzdF9zdHJpZGVxIHIxbXAKKyVkZWZpbmUgc3JjX3N0cmlkZXEgcjNtcAorJWVuZGlmIDsgeDg2LTY0LzMyCislZWxzZQorJWlmIEFSQ0hfWDg2XzY0CitjZ2xvYmFsIGVtdV9lZGdlX3ZmaXggJSsgJSVuLCA3LCA3LCAxLCBkc3QsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfeSwgZW5kX3ksIGJoCislZWxzZSA7IHg4Ni0zMgorY2dsb2JhbCBlbXVfZWRnZV92Zml4ICUrICUlbiwgMSwgNSwgMSwgZHN0LCBzcmMsIHN0YXJ0X3ksIGVuZF95LCBiaAorICAgIG1vdiAgICAgICAgICAgIHNyY3EsIHIybXAKKyAgICBtb3YgICAgICAgIHN0YXJ0X3lxLCByNG1wCisgICAgbW92ICAgICAgICAgIGVuZF95cSwgcjVtcAorICAgIG1vdiAgICAgICAgICAgICBiaHEsIHI2bXAKKyVkZWZpbmUgZHN0X3N0cmlkZXEgcjFtcAorJWRlZmluZSBzcmNfc3RyaWRlcSByM21wCislZW5kaWYgOyB4ODYtNjQvMzIKKyVlbmRpZgorICAgIDsgRklYTUUgbW92ZSB0aGlzIHRvIGMgd3JhcHBlcj8KKyAgICBzdWIgICAgICAgICAgICAgYmhxLCBlbmRfeXEgICAgICAgICAgICAgICAgIDsgYmggICAgLT0gZW5kX3kKKyAgICBzdWIgICAgICAgICAgZW5kX3lxLCBzdGFydF95cSAgICAgICAgICAgICAgIDsgZW5kX3kgLT0gc3RhcnRfeQorCisgICAgOyBleHRlbmQgcGl4ZWxzIGFib3ZlIGJvZHkKKyAgICB0ZXN0ICAgICAgIHN0YXJ0X3lxLCBzdGFydF95cSAgICAgICAgICAgICAgIDsgaWYgKHN0YXJ0X3kpIHsKKyAgICBqeiAuYm9keV9sb29wCisgICAgUkVBRF9OVU1fQllURVMgIHRvcCwgJSVuICAgICAgICAgICAgICAgICAgICA7ICAgJHZhcmlhYmxlX3JlZ3MgPSByZWFkKCRuKQorLnRvcF9sb29wOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIGRvIHsKKyAgICBXUklURV9OVU1fQllURVMgdG9wLCAlJW4gICAgICAgICAgICAgICAgICAgIDsgICAgIHdyaXRlKCR2YXJpYWJsZV9yZWdzLCAkbikKKyAgICBhZGQgICAgICAgICAgICBkc3RxLCBkc3Rfc3RyaWRlcSAgICAgICAgICAgIDsgICAgIGRzdCArPSBsaW5lc2l6ZQorICAgIGRlYyAgICAgICAgc3RhcnRfeXEgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIH0gd2hpbGUgKC0tc3RhcnRfeSkKKyAgICBqbnogLnRvcF9sb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgfQorCisgICAgOyBjb3B5IGJvZHkgcGl4ZWxzCisuYm9keV9sb29wOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGRvIHsKKyAgICBSRUFEX05VTV9CWVRFUyAgYm9keSwgJSVuICAgICAgICAgICAgICAgICAgIDsgICAkdmFyaWFibGVfcmVncyA9IHJlYWQoJG4pCisgICAgV1JJVEVfTlVNX0JZVEVTIGJvZHksICUlbiAgICAgICAgICAgICAgICAgICA7ICAgd3JpdGUoJHZhcmlhYmxlX3JlZ3MsICRuKQorICAgIGFkZCAgICAgICAgICAgIGRzdHEsIGRzdF9zdHJpZGVxICAgICAgICAgICAgOyAgIGRzdCArPSBkc3Rfc3RyaWRlCisgICAgYWRkICAgICAgICAgICAgc3JjcSwgc3JjX3N0cmlkZXEgICAgICAgICAgICA7ICAgc3JjICs9IHNyY19zdHJpZGUKKyAgICBkZWMgICAgICAgICAgZW5kX3lxICAgICAgICAgICAgICAgICAgICAgICAgIDsgfSB3aGlsZSAoLS1lbmRfeSkKKyAgICBqbnogLmJvZHlfbG9vcAorCisgICAgOyBjb3B5IGJvdHRvbSBwaXhlbHMKKyAgICB0ZXN0ICAgICAgICAgICAgYmhxLCBiaHEgICAgICAgICAgICAgICAgICAgIDsgaWYgKGJsb2NrX2gpIHsKKyAgICBqeiAuZW5kCisgICAgc3ViICAgICAgICAgICAgc3JjcSwgc3JjX3N0cmlkZXEgICAgICAgICAgICA7ICAgc3JjIC09IGxpbmVzaXplCisgICAgUkVBRF9OVU1fQllURVMgIGJvdHRvbSwgJSVuICAgICAgICAgICAgICAgICA7ICAgJHZhcmlhYmxlX3JlZ3MgPSByZWFkKCRuKQorLmJvdHRvbV9sb29wOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIGRvIHsKKyAgICBXUklURV9OVU1fQllURVMgYm90dG9tLCAlJW4gICAgICAgICAgICAgICAgIDsgICAgIHdyaXRlKCR2YXJpYWJsZV9yZWdzLCAkbikKKyAgICBhZGQgICAgICAgICAgICBkc3RxLCBkc3Rfc3RyaWRlcSAgICAgICAgICAgIDsgICAgIGRzdCArPSBsaW5lc2l6ZQorICAgIGRlYyAgICAgICAgICAgICBiaHEgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIH0gd2hpbGUgKC0tYmgpCisgICAgam56IC5ib3R0b21fbG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IH0KKworLmVuZDoKKyAgICBSRVQKKyVhc3NpZ24gJSVuICUlbisxCislZW5kcmVwIDsgMSslMi0lMQorJWVuZG1hY3JvIDsgVkVSVElDQUxfRVhURU5ECisKK0lOSVRfTU1YIG1teAorVkVSVElDQUxfRVhURU5EIDEsIDE1CislaWYgQVJDSF9YODZfMzIKK1ZFUlRJQ0FMX0VYVEVORCAxNiwgMjIKKyVlbmRpZgorCitJTklUX1hNTSBzc2UKK1ZFUlRJQ0FMX0VYVEVORCAxNiwgMjIKKworOyBsZWZ0L3JpZ2h0IChob3Jpem9udGFsKSBmYXN0IGV4dGVuZCBmdW5jdGlvbnMKKzsgdGhlc2UgYXJlIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byB0aGUgdmVydGljYWwgZXh0ZW5kIG9uZXMgYWJvdmUsCis7IGp1c3QgbGVmdC9yaWdodCBzZXBhcmF0ZWQgYmVjYXVzZSBudW1iZXIgb2YgcGl4ZWxzIHRvIGV4dGVuZCBpcworOyBvYnZpb3VzbHkgbm90IHRoZSBzYW1lIG9uIGJvdGggc2lkZXMuCisKKyVtYWNybyBSRUFEX1ZfUElYRUwgMgorJWlmIGNwdWZsYWcoYXZ4MikKKyAgICB2cGJyb2FkY2FzdGIgICAgIG0wLCAlMgorJWVsc2UKKyAgICBtb3Z6eCAgICAgICAgICB2YWxkLCBieXRlICUyCisgICAgaW11bCAgICAgICAgICAgdmFsZCwgMHgwMTAxMDEwMQorJWlmICUxID49IDgKKyAgICBtb3ZkICAgICAgICAgICAgIG0wLCB2YWxkCislaWYgbW1zaXplID09IDE2CisgICAgcHNodWZkICAgICAgICAgICBtMCwgbTAsIHEwMDAwCislZWxzZQorICAgIHB1bnBja2xkcSAgICAgICAgbTAsIG0wCislZW5kaWYgOyBtbXNpemUgPT0gMTYKKyVlbmRpZiA7ICUxID4gMTYKKyVlbmRpZiA7IGF2eDIKKyVlbmRtYWNybyA7IFJFQURfVl9QSVhFTAorCislbWFjcm8gV1JJVEVfVl9QSVhFTCAyCislYXNzaWduICUlb2ZmIDAKKworJWlmICUxID49IDgKKworJXJlcCAlMS9tbXNpemUKKyAgICBtb3Z1ICAgICBbJTIrJSVvZmZdLCBtMAorJWFzc2lnbiAlJW9mZiAlJW9mZittbXNpemUKKyVlbmRyZXAgOyAlMS9tbXNpemUKKworJWlmIG1tc2l6ZSA9PSAxNgorJWlmICUxLSUlb2ZmID49IDgKKyVpZiAlMSA+IDE2ICYmICUxLSUlb2ZmID4gOAorICAgIG1vdnUgICAgIFslMislMS0xNl0sIG0wCislYXNzaWduICUlb2ZmICUxCislZWxzZQorICAgIG1vdnEgICAgIFslMislJW9mZl0sIG0wCislYXNzaWduICUlb2ZmICUlb2ZmKzgKKyVlbmRpZgorJWVuZGlmIDsgJTEtJSVvZmYgPj0gOAorJWVuZGlmIDsgbW1zaXplID09IDE2CisKKyVpZiAlMS0lJW9mZiA+PSA0CislaWYgJTEgPiA4ICYmICUxLSUlb2ZmID4gNAorICAgIG1vdnEgICAgICBbJTIrJTEtOF0sIG0wCislYXNzaWduICUlb2ZmICUxCislZWxzZQorICAgIG1vdmQgICAgIFslMislJW9mZl0sIG0wCislYXNzaWduICUlb2ZmICUlb2ZmKzQKKyVlbmRpZgorJWVuZGlmIDsgJTEtJSVvZmYgPj0gNAorCislZWxzZSA7ICUxIDwgOAorCislcmVwICUxLzQKKyAgICBtb3YgICAgICBbJTIrJSVvZmZdLCB2YWxkCislYXNzaWduICUlb2ZmICUlb2ZmKzQKKyVlbmRyZXAgOyAlMS80CisKKyVlbmRpZiA7ICUxID49LzwgOAorCislaWYgJTEtJSVvZmYgPT0gMgorJWlmIGNwdWZsYWcoYXZ4MikKKyAgICBtb3ZkICAgICBbJTIrJSVvZmYtMl0sIG0wCislZWxzZQorICAgIG1vdiAgICAgIFslMislJW9mZl0sIHZhbHcKKyVlbmRpZiA7IGF2eDIKKyVlbmRpZiA7ICglMS0lJW9mZikvMgorJWVuZG1hY3JvIDsgV1JJVEVfVl9QSVhFTAorCislbWFjcm8gSF9FWFRFTkQgMgorJWFzc2lnbiAlJW4gJTEKKyVyZXAgMSsoJTItJTEpLzIKKyVpZiBjcHVmbGFnKGF2eDIpCitjZ2xvYmFsIGVtdV9lZGdlX2hmaXggJSsgJSVuLCA0LCA0LCAxLCBkc3QsIGRzdF9zdHJpZGUsIHN0YXJ0X3gsIGJoCislZWxzZQorY2dsb2JhbCBlbXVfZWRnZV9oZml4ICUrICUlbiwgNCwgNSwgMSwgZHN0LCBkc3Rfc3RyaWRlLCBzdGFydF94LCBiaCwgdmFsCislZW5kaWYKKy5sb29wX3k6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZG8geworICAgIFJFQURfVl9QSVhFTCAgICAlJW4sIFtkc3RxK3N0YXJ0X3hxXSAgICAgICAgOyAgICR2YXJpYWJsZV9yZWdzID0gcmVhZCgkbikKKyAgICBXUklURV9WX1BJWEVMICAgJSVuLCBkc3RxICAgICAgICAgICAgICAgICAgIDsgICB3cml0ZSgkdmFyaWFibGVfcmVncywgJG4pCisgICAgYWRkICAgICAgICAgICAgZHN0cSwgZHN0X3N0cmlkZXEgICAgICAgICAgICA7ICAgZHN0ICs9IGRzdF9zdHJpZGUKKyAgICBkZWMgICAgICAgICAgICAgYmhxICAgICAgICAgICAgICAgICAgICAgICAgIDsgfSB3aGlsZSAoLS1iaCkKKyAgICBqbnogLmxvb3BfeQorICAgIFJFVAorJWFzc2lnbiAlJW4gJSVuKzIKKyVlbmRyZXAgOyAxKyglMi0lMSkvMgorJWVuZG1hY3JvIDsgSF9FWFRFTkQKKworSU5JVF9NTVggbW14CitIX0VYVEVORCAyLCAxNAorJWlmIEFSQ0hfWDg2XzMyCitIX0VYVEVORCAxNiwgMjIKKyVlbmRpZgorCitJTklUX1hNTSBzc2UyCitIX0VYVEVORCAxNiwgMjIKKworJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4MgorSF9FWFRFTkQgOCwgMjIKKyVlbmRpZgorCislbWFjcm8gUFJFRkVUQ0hfRk4gMQorY2dsb2JhbCBwcmVmZXRjaCwgMywgMywgMCwgYnVmLCBzdHJpZGUsIGgKKy5sb29wOgorICAgICUxICAgICAgW2J1ZnFdCisgICAgYWRkICAgICAgYnVmcSwgc3RyaWRlcQorICAgIGRlYyAgICAgICAgaGQKKyAgICBqZyAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BSRUZFVENIX0ZOIHByZWZldGNodDAKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggM2Rub3cKK1BSRUZFVENIX0ZOIHByZWZldGNoCislZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92aWRlb2RzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdmlkZW9kc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NWNkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdmlkZW9kc3BfaW5pdC5jCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMTIgTWljaGFlbCBOaWVkZXJtYXllcgorICogQ29weXJpZ2h0IChDKSAyMDEyIFJvbmFsZCBTLiBCdWx0amUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdmlkZW9kc3AuaCIKKworI2lmIEhBVkVfWUFTTQordHlwZWRlZiB2b2lkIGVtdV9lZGdlX3ZmaXhfZnVuYyh1aW50OF90ICpkc3QsIHg4Nl9yZWcgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCB4ODZfcmVnIHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Nl9yZWcgc3RhcnRfeSwgeDg2X3JlZyBlbmRfeSwgeDg2X3JlZyBiaCk7Cit0eXBlZGVmIHZvaWQgZW11X2VkZ2VfdnZhcl9mdW5jKHVpbnQ4X3QgKmRzdCwgeDg2X3JlZyBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHg4Nl9yZWcgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2X3JlZyBzdGFydF95LCB4ODZfcmVnIGVuZF95LCB4ODZfcmVnIGJoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODZfcmVnIHcpOworCitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgxX21teDsKK2V4dGVybiBlbXVfZWRnZV92Zml4X2Z1bmMgZmZfZW11X2VkZ2VfdmZpeDJfbW14OworZXh0ZXJuIGVtdV9lZGdlX3ZmaXhfZnVuYyBmZl9lbXVfZWRnZV92Zml4M19tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXg0X21teDsKK2V4dGVybiBlbXVfZWRnZV92Zml4X2Z1bmMgZmZfZW11X2VkZ2VfdmZpeDVfbW14OworZXh0ZXJuIGVtdV9lZGdlX3ZmaXhfZnVuYyBmZl9lbXVfZWRnZV92Zml4Nl9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXg3X21teDsKK2V4dGVybiBlbXVfZWRnZV92Zml4X2Z1bmMgZmZfZW11X2VkZ2VfdmZpeDhfbW14OworZXh0ZXJuIGVtdV9lZGdlX3ZmaXhfZnVuYyBmZl9lbXVfZWRnZV92Zml4OV9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgxMF9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgxMV9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgxMl9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgxM19tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgxNF9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgxNV9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgxNl9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgxN19tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgxOF9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgxOV9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgyMF9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgyMV9tbXg7CitleHRlcm4gZW11X2VkZ2VfdmZpeF9mdW5jIGZmX2VtdV9lZGdlX3ZmaXgyMl9tbXg7CisjaWYgQVJDSF9YODZfMzIKK3N0YXRpYyBlbXVfZWRnZV92Zml4X2Z1bmMgKiBjb25zdCB2Zml4dGJsX21teFsyMl0gPSB7CisgICAgJmZmX2VtdV9lZGdlX3ZmaXgxX21teCwgICZmZl9lbXVfZWRnZV92Zml4Ml9tbXgsICAmZmZfZW11X2VkZ2VfdmZpeDNfbW14LAorICAgICZmZl9lbXVfZWRnZV92Zml4NF9tbXgsICAmZmZfZW11X2VkZ2VfdmZpeDVfbW14LCAgJmZmX2VtdV9lZGdlX3ZmaXg2X21teCwKKyAgICAmZmZfZW11X2VkZ2VfdmZpeDdfbW14LCAgJmZmX2VtdV9lZGdlX3ZmaXg4X21teCwgICZmZl9lbXVfZWRnZV92Zml4OV9tbXgsCisgICAgJmZmX2VtdV9lZGdlX3ZmaXgxMF9tbXgsICZmZl9lbXVfZWRnZV92Zml4MTFfbW14LCAmZmZfZW11X2VkZ2VfdmZpeDEyX21teCwKKyAgICAmZmZfZW11X2VkZ2VfdmZpeDEzX21teCwgJmZmX2VtdV9lZGdlX3ZmaXgxNF9tbXgsICZmZl9lbXVfZWRnZV92Zml4MTVfbW14LAorICAgICZmZl9lbXVfZWRnZV92Zml4MTZfbW14LCAmZmZfZW11X2VkZ2VfdmZpeDE3X21teCwgJmZmX2VtdV9lZGdlX3ZmaXgxOF9tbXgsCisgICAgJmZmX2VtdV9lZGdlX3ZmaXgxOV9tbXgsICZmZl9lbXVfZWRnZV92Zml4MjBfbW14LCAmZmZfZW11X2VkZ2VfdmZpeDIxX21teCwKKyAgICAmZmZfZW11X2VkZ2VfdmZpeDIyX21teAorfTsKKyNlbmRpZgorZXh0ZXJuIGVtdV9lZGdlX3Z2YXJfZnVuYyBmZl9lbXVfZWRnZV92dmFyX21teDsKK2V4dGVybiBlbXVfZWRnZV92Zml4X2Z1bmMgZmZfZW11X2VkZ2VfdmZpeDE2X3NzZTsKK2V4dGVybiBlbXVfZWRnZV92Zml4X2Z1bmMgZmZfZW11X2VkZ2VfdmZpeDE3X3NzZTsKK2V4dGVybiBlbXVfZWRnZV92Zml4X2Z1bmMgZmZfZW11X2VkZ2VfdmZpeDE4X3NzZTsKK2V4dGVybiBlbXVfZWRnZV92Zml4X2Z1bmMgZmZfZW11X2VkZ2VfdmZpeDE5X3NzZTsKK2V4dGVybiBlbXVfZWRnZV92Zml4X2Z1bmMgZmZfZW11X2VkZ2VfdmZpeDIwX3NzZTsKK2V4dGVybiBlbXVfZWRnZV92Zml4X2Z1bmMgZmZfZW11X2VkZ2VfdmZpeDIxX3NzZTsKK2V4dGVybiBlbXVfZWRnZV92Zml4X2Z1bmMgZmZfZW11X2VkZ2VfdmZpeDIyX3NzZTsKK3N0YXRpYyBlbXVfZWRnZV92Zml4X2Z1bmMgKiBjb25zdCB2Zml4dGJsX3NzZVsyMl0gPSB7CisgICAgZmZfZW11X2VkZ2VfdmZpeDFfbW14LCAgZmZfZW11X2VkZ2VfdmZpeDJfbW14LCAgZmZfZW11X2VkZ2VfdmZpeDNfbW14LAorICAgIGZmX2VtdV9lZGdlX3ZmaXg0X21teCwgIGZmX2VtdV9lZGdlX3ZmaXg1X21teCwgIGZmX2VtdV9lZGdlX3ZmaXg2X21teCwKKyAgICBmZl9lbXVfZWRnZV92Zml4N19tbXgsICBmZl9lbXVfZWRnZV92Zml4OF9tbXgsICBmZl9lbXVfZWRnZV92Zml4OV9tbXgsCisgICAgZmZfZW11X2VkZ2VfdmZpeDEwX21teCwgZmZfZW11X2VkZ2VfdmZpeDExX21teCwgZmZfZW11X2VkZ2VfdmZpeDEyX21teCwKKyAgICBmZl9lbXVfZWRnZV92Zml4MTNfbW14LCBmZl9lbXVfZWRnZV92Zml4MTRfbW14LCBmZl9lbXVfZWRnZV92Zml4MTVfbW14LAorICAgIGZmX2VtdV9lZGdlX3ZmaXgxNl9zc2UsIGZmX2VtdV9lZGdlX3ZmaXgxN19zc2UsIGZmX2VtdV9lZGdlX3ZmaXgxOF9zc2UsCisgICAgZmZfZW11X2VkZ2VfdmZpeDE5X3NzZSwgZmZfZW11X2VkZ2VfdmZpeDIwX3NzZSwgZmZfZW11X2VkZ2VfdmZpeDIxX3NzZSwKKyAgICBmZl9lbXVfZWRnZV92Zml4MjJfc3NlCit9OworZXh0ZXJuIGVtdV9lZGdlX3Z2YXJfZnVuYyBmZl9lbXVfZWRnZV92dmFyX3NzZTsKKwordHlwZWRlZiB2b2lkIGVtdV9lZGdlX2hmaXhfZnVuYyh1aW50OF90ICpkc3QsIHg4Nl9yZWcgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2X3JlZyBzdGFydF94LCB4ODZfcmVnIGJoKTsKK3R5cGVkZWYgdm9pZCBlbXVfZWRnZV9odmFyX2Z1bmModWludDhfdCAqZHN0LCB4ODZfcmVnIGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Nl9yZWcgc3RhcnRfeCwgeDg2X3JlZyBuX3dvcmRzLCB4ODZfcmVnIGJoKTsKKworZXh0ZXJuIGVtdV9lZGdlX2hmaXhfZnVuYyBmZl9lbXVfZWRnZV9oZml4Ml9tbXg7CitleHRlcm4gZW11X2VkZ2VfaGZpeF9mdW5jIGZmX2VtdV9lZGdlX2hmaXg0X21teDsKK2V4dGVybiBlbXVfZWRnZV9oZml4X2Z1bmMgZmZfZW11X2VkZ2VfaGZpeDZfbW14OworZXh0ZXJuIGVtdV9lZGdlX2hmaXhfZnVuYyBmZl9lbXVfZWRnZV9oZml4OF9tbXg7CitleHRlcm4gZW11X2VkZ2VfaGZpeF9mdW5jIGZmX2VtdV9lZGdlX2hmaXgxMF9tbXg7CitleHRlcm4gZW11X2VkZ2VfaGZpeF9mdW5jIGZmX2VtdV9lZGdlX2hmaXgxMl9tbXg7CitleHRlcm4gZW11X2VkZ2VfaGZpeF9mdW5jIGZmX2VtdV9lZGdlX2hmaXgxNF9tbXg7CitleHRlcm4gZW11X2VkZ2VfaGZpeF9mdW5jIGZmX2VtdV9lZGdlX2hmaXgxNl9tbXg7CitleHRlcm4gZW11X2VkZ2VfaGZpeF9mdW5jIGZmX2VtdV9lZGdlX2hmaXgxOF9tbXg7CitleHRlcm4gZW11X2VkZ2VfaGZpeF9mdW5jIGZmX2VtdV9lZGdlX2hmaXgyMF9tbXg7CitleHRlcm4gZW11X2VkZ2VfaGZpeF9mdW5jIGZmX2VtdV9lZGdlX2hmaXgyMl9tbXg7CisjaWYgQVJDSF9YODZfMzIKK3N0YXRpYyBlbXVfZWRnZV9oZml4X2Z1bmMgKiBjb25zdCBoZml4dGJsX21teFsxMV0gPSB7CisgICAgZmZfZW11X2VkZ2VfaGZpeDJfbW14LCAgZmZfZW11X2VkZ2VfaGZpeDRfbW14LCAgZmZfZW11X2VkZ2VfaGZpeDZfbW14LAorICAgIGZmX2VtdV9lZGdlX2hmaXg4X21teCwgIGZmX2VtdV9lZGdlX2hmaXgxMF9tbXgsIGZmX2VtdV9lZGdlX2hmaXgxMl9tbXgsCisgICAgZmZfZW11X2VkZ2VfaGZpeDE0X21teCwgZmZfZW11X2VkZ2VfaGZpeDE2X21teCwgZmZfZW11X2VkZ2VfaGZpeDE4X21teCwKKyAgICBmZl9lbXVfZWRnZV9oZml4MjBfbW14LCBmZl9lbXVfZWRnZV9oZml4MjJfbW14Cit9OworI2VuZGlmCitleHRlcm4gZW11X2VkZ2VfaHZhcl9mdW5jIGZmX2VtdV9lZGdlX2h2YXJfbW14OworZXh0ZXJuIGVtdV9lZGdlX2hmaXhfZnVuYyBmZl9lbXVfZWRnZV9oZml4MTZfc3NlMjsKK2V4dGVybiBlbXVfZWRnZV9oZml4X2Z1bmMgZmZfZW11X2VkZ2VfaGZpeDE4X3NzZTI7CitleHRlcm4gZW11X2VkZ2VfaGZpeF9mdW5jIGZmX2VtdV9lZGdlX2hmaXgyMF9zc2UyOworZXh0ZXJuIGVtdV9lZGdlX2hmaXhfZnVuYyBmZl9lbXVfZWRnZV9oZml4MjJfc3NlMjsKK3N0YXRpYyBlbXVfZWRnZV9oZml4X2Z1bmMgKiBjb25zdCBoZml4dGJsX3NzZTJbMTFdID0geworICAgIGZmX2VtdV9lZGdlX2hmaXgyX21teCwgIGZmX2VtdV9lZGdlX2hmaXg0X21teCwgIGZmX2VtdV9lZGdlX2hmaXg2X21teCwKKyAgICBmZl9lbXVfZWRnZV9oZml4OF9tbXgsICBmZl9lbXVfZWRnZV9oZml4MTBfbW14LCBmZl9lbXVfZWRnZV9oZml4MTJfbW14LAorICAgIGZmX2VtdV9lZGdlX2hmaXgxNF9tbXgsIGZmX2VtdV9lZGdlX2hmaXgxNl9zc2UyLCBmZl9lbXVfZWRnZV9oZml4MThfc3NlMiwKKyAgICBmZl9lbXVfZWRnZV9oZml4MjBfc3NlMiwgZmZfZW11X2VkZ2VfaGZpeDIyX3NzZTIKK307CitleHRlcm4gZW11X2VkZ2VfaHZhcl9mdW5jIGZmX2VtdV9lZGdlX2h2YXJfc3NlMjsKKyNpZiBIQVZFX0FWWDJfRVhURVJOQUwKK2V4dGVybiBlbXVfZWRnZV9oZml4X2Z1bmMgZmZfZW11X2VkZ2VfaGZpeDhfYXZ4MjsKK2V4dGVybiBlbXVfZWRnZV9oZml4X2Z1bmMgZmZfZW11X2VkZ2VfaGZpeDEwX2F2eDI7CitleHRlcm4gZW11X2VkZ2VfaGZpeF9mdW5jIGZmX2VtdV9lZGdlX2hmaXgxMl9hdngyOworZXh0ZXJuIGVtdV9lZGdlX2hmaXhfZnVuYyBmZl9lbXVfZWRnZV9oZml4MTRfYXZ4MjsKK2V4dGVybiBlbXVfZWRnZV9oZml4X2Z1bmMgZmZfZW11X2VkZ2VfaGZpeDE2X2F2eDI7CitleHRlcm4gZW11X2VkZ2VfaGZpeF9mdW5jIGZmX2VtdV9lZGdlX2hmaXgxOF9hdngyOworZXh0ZXJuIGVtdV9lZGdlX2hmaXhfZnVuYyBmZl9lbXVfZWRnZV9oZml4MjBfYXZ4MjsKK2V4dGVybiBlbXVfZWRnZV9oZml4X2Z1bmMgZmZfZW11X2VkZ2VfaGZpeDIyX2F2eDI7CitzdGF0aWMgZW11X2VkZ2VfaGZpeF9mdW5jICogY29uc3QgaGZpeHRibF9hdngyWzExXSA9IHsKKyAgICBmZl9lbXVfZWRnZV9oZml4Ml9tbXgsICBmZl9lbXVfZWRnZV9oZml4NF9tbXgsICBmZl9lbXVfZWRnZV9oZml4Nl9tbXgsCisgICAgZmZfZW11X2VkZ2VfaGZpeDhfYXZ4MiwgIGZmX2VtdV9lZGdlX2hmaXgxMF9hdngyLCBmZl9lbXVfZWRnZV9oZml4MTJfYXZ4MiwKKyAgICBmZl9lbXVfZWRnZV9oZml4MTRfYXZ4MiwgZmZfZW11X2VkZ2VfaGZpeDE2X2F2eDIsIGZmX2VtdV9lZGdlX2hmaXgxOF9hdngyLAorICAgIGZmX2VtdV9lZGdlX2hmaXgyMF9hdngyLCBmZl9lbXVfZWRnZV9oZml4MjJfYXZ4MgorfTsKK2V4dGVybiBlbXVfZWRnZV9odmFyX2Z1bmMgZmZfZW11X2VkZ2VfaHZhcl9hdngyOworI2VuZGlmCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZW11bGF0ZWRfZWRnZV9tYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODZfcmVnIGJsb2NrX3csIHg4Nl9yZWcgYmxvY2tfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODZfcmVnIHNyY194LCB4ODZfcmVnIHNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Nl9yZWcgdywgeDg2X3JlZyBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtdV9lZGdlX3ZmaXhfZnVuYyAqIGNvbnN0ICp2Zml4X3RibCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXVfZWRnZV92dmFyX2Z1bmMgKnZfZXh0ZW5kX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXVfZWRnZV9oZml4X2Z1bmMgKiBjb25zdCAqaGZpeF90YmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW11X2VkZ2VfaHZhcl9mdW5jICpoX2V4dGVuZF92YXIpCit7CisgICAgeDg2X3JlZyBzdGFydF95LCBzdGFydF94LCBlbmRfeSwgZW5kX3gsIHNyY195X2FkZCA9IDAsIHA7CisKKyAgICBpZiAoIXcgfHwgIWgpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChzcmNfeSA+PSBoKSB7CisgICAgICAgIHNyYyAtPSBzcmNfeSpzcmNfc3RyaWRlOworICAgICAgICBzcmNfeV9hZGQgPSBoIC0gMTsKKyAgICAgICAgc3JjX3kgICAgID0gaCAtIDE7CisgICAgfSBlbHNlIGlmIChzcmNfeSA8PSAtYmxvY2tfaCkgeworICAgICAgICBzcmMgLT0gc3JjX3kqc3JjX3N0cmlkZTsKKyAgICAgICAgc3JjX3lfYWRkID0gMSAtIGJsb2NrX2g7CisgICAgICAgIHNyY195ICAgICA9IDEgLSBibG9ja19oOworICAgIH0KKyAgICBpZiAoc3JjX3ggPj0gdykgeworICAgICAgICBzcmMgICArPSB3IC0gMSAtIHNyY194OworICAgICAgICBzcmNfeCAgPSB3IC0gMTsKKyAgICB9IGVsc2UgaWYgKHNyY194IDw9IC1ibG9ja193KSB7CisgICAgICAgIHNyYyAgICs9IDEgLSBibG9ja193IC0gc3JjX3g7CisgICAgICAgIHNyY194ICA9IDEgLSBibG9ja193OworICAgIH0KKworICAgIHN0YXJ0X3kgPSBGRk1BWCgwLCAtc3JjX3kpOworICAgIHN0YXJ0X3ggPSBGRk1BWCgwLCAtc3JjX3gpOworICAgIGVuZF95ICAgPSBGRk1JTihibG9ja19oLCBoLXNyY195KTsKKyAgICBlbmRfeCAgID0gRkZNSU4oYmxvY2tfdywgdy1zcmNfeCk7CisgICAgYXZfYXNzZXJ0MihzdGFydF94IDwgZW5kX3ggJiYgYmxvY2tfdyA+IDApOworICAgIGF2X2Fzc2VydDIoc3RhcnRfeSA8IGVuZF95ICYmIGJsb2NrX2ggPiAwKTsKKworICAgIC8vIGZpbGwgaW4gdGhlIHRvLWJlLWNvcGllZCBwYXJ0IHBsdXMgYWxsIGFib3ZlL2JlbG93CisgICAgc3JjICs9IChzcmNfeV9hZGQgKyBzdGFydF95KSAqIHNyY19zdHJpZGUgKyBzdGFydF94OworICAgIHcgPSBlbmRfeCAtIHN0YXJ0X3g7CisgICAgaWYgKHcgPD0gMjIpIHsKKyAgICAgICAgdmZpeF90YmxbdyAtIDFdKGRzdCArIHN0YXJ0X3gsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3ksIGVuZF95LCBibG9ja19oKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2X2V4dGVuZF92YXIoZHN0ICsgc3RhcnRfeCwgZHN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgc3RhcnRfeSwgZW5kX3ksIGJsb2NrX2gsIHcpOworICAgIH0KKworICAgIC8vIGZpbGwgbGVmdAorICAgIGlmIChzdGFydF94KSB7CisgICAgICAgIGlmIChzdGFydF94IDw9IDIyKSB7CisgICAgICAgICAgICBoZml4X3RibFsoc3RhcnRfeCAtIDEpID4+IDFdKGRzdCwgZHN0X3N0cmlkZSwgc3RhcnRfeCwgYmxvY2tfaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoX2V4dGVuZF92YXIoZHN0LCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3gsIChzdGFydF94ICsgMSkgPj4gMSwgYmxvY2tfaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBmaWxsIHJpZ2h0CisgICAgcCA9IGJsb2NrX3cgLSBlbmRfeDsKKyAgICBpZiAocCkgeworICAgICAgICBpZiAocCA8PSAyMikgeworICAgICAgICAgICAgaGZpeF90YmxbKHAgLSAxKSA+PiAxXShkc3QgKyBlbmRfeCAtIChwICYgMSksIGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0hKHAgJiAxKSwgYmxvY2tfaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoX2V4dGVuZF92YXIoZHN0ICsgZW5kX3ggLSAocCAmIDEpLCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIC0hKHAgJiAxKSwgKHAgKyAxKSA+PiAxLCBibG9ja19oKTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2lmIEFSQ0hfWDg2XzMyCitzdGF0aWMgYXZfbm9pbmxpbmUgdm9pZCBlbXVsYXRlZF9lZGdlX21jX21teCh1aW50OF90ICpidWYsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBidWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfdywgaW50IGJsb2NrX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IHcsIGludCBoKQoreworICAgIGVtdWxhdGVkX2VkZ2VfbWMoYnVmLCBzcmMsIGJ1Zl9zdHJpZGUsIHNyY19zdHJpZGUsIGJsb2NrX3csIGJsb2NrX2gsCisgICAgICAgICAgICAgICAgICAgICBzcmNfeCwgc3JjX3ksIHcsIGgsIHZmaXh0YmxfbW14LCAmZmZfZW11X2VkZ2VfdnZhcl9tbXgsCisgICAgICAgICAgICAgICAgICAgICBoZml4dGJsX21teCwgJmZmX2VtdV9lZGdlX2h2YXJfbW14KTsKK30KKworc3RhdGljIGF2X25vaW5saW5lIHZvaWQgZW11bGF0ZWRfZWRnZV9tY19zc2UodWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgYnVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3csIGludCBibG9ja19oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY194LCBpbnQgc3JjX3ksIGludCB3LCBpbnQgaCkKK3sKKyAgICBlbXVsYXRlZF9lZGdlX21jKGJ1Ziwgc3JjLCBidWZfc3RyaWRlLCBzcmNfc3RyaWRlLCBibG9ja193LCBibG9ja19oLAorICAgICAgICAgICAgICAgICAgICAgc3JjX3gsIHNyY195LCB3LCBoLCB2Zml4dGJsX3NzZSwgJmZmX2VtdV9lZGdlX3Z2YXJfc3NlLAorICAgICAgICAgICAgICAgICAgICAgaGZpeHRibF9tbXgsICZmZl9lbXVfZWRnZV9odmFyX21teCk7Cit9CisjZW5kaWYKKworc3RhdGljIGF2X25vaW5saW5lIHZvaWQgZW11bGF0ZWRfZWRnZV9tY19zc2UyKHVpbnQ4X3QgKmJ1ZiwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBidWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja193LCBpbnQgYmxvY2tfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpCit7CisgICAgZW11bGF0ZWRfZWRnZV9tYyhidWYsIHNyYywgYnVmX3N0cmlkZSwgc3JjX3N0cmlkZSwgYmxvY2tfdywgYmxvY2tfaCwKKyAgICAgICAgICAgICAgICAgICAgIHNyY194LCBzcmNfeSwgdywgaCwgdmZpeHRibF9zc2UsICZmZl9lbXVfZWRnZV92dmFyX3NzZSwKKyAgICAgICAgICAgICAgICAgICAgIGhmaXh0Ymxfc3NlMiwgJmZmX2VtdV9lZGdlX2h2YXJfc3NlMik7Cit9CisKKyNpZiBIQVZFX0FWWDJfRVhURVJOQUwKK3N0YXRpYyBhdl9ub2lubGluZSB2b2lkIGVtdWxhdGVkX2VkZ2VfbWNfYXZ4Mih1aW50OF90ICpidWYsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgYnVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfdywgaW50IGJsb2NrX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY194LCBpbnQgc3JjX3ksIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKQoreworICAgIGVtdWxhdGVkX2VkZ2VfbWMoYnVmLCBzcmMsIGJ1Zl9zdHJpZGUsIHNyY19zdHJpZGUsIGJsb2NrX3csIGJsb2NrX2gsCisgICAgICAgICAgICAgICAgICAgICBzcmNfeCwgc3JjX3ksIHcsIGgsIHZmaXh0Ymxfc3NlLCAmZmZfZW11X2VkZ2VfdnZhcl9zc2UsCisgICAgICAgICAgICAgICAgICAgICBoZml4dGJsX2F2eDIsICZmZl9lbXVfZWRnZV9odmFyX2F2eDIpOworfQorI2VuZGlmIC8qIEhBVkVfQVZYMl9FWFRFUk5BTCAqLworI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworCit2b2lkIGZmX3ByZWZldGNoX21teGV4dCh1aW50OF90ICpidWYsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKTsKK3ZvaWQgZmZfcHJlZmV0Y2hfM2Rub3codWludDhfdCAqYnVmLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCk7CisKK2F2X2NvbGQgdm9pZCBmZl92aWRlb2RzcF9pbml0X3g4NihWaWRlb0RTUENvbnRleHQgKmN0eCwgaW50IGJwYykKK3sKKyNpZiBIQVZFX1lBU00KKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisjaWYgQVJDSF9YODZfMzIKKyAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykgJiYgYnBjIDw9IDgpIHsKKyAgICAgICAgY3R4LT5lbXVsYXRlZF9lZGdlX21jID0gZW11bGF0ZWRfZWRnZV9tY19tbXg7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9BTUQzRE5PVyhjcHVfZmxhZ3MpKSB7CisgICAgICAgIGN0eC0+cHJlZmV0Y2ggPSBmZl9wcmVmZXRjaF8zZG5vdzsKKyAgICB9CisjZW5kaWYgLyogQVJDSF9YODZfMzIgKi8KKyAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgY3R4LT5wcmVmZXRjaCA9IGZmX3ByZWZldGNoX21teGV4dDsKKyAgICB9CisjaWYgQVJDSF9YODZfMzIKKyAgICBpZiAoRVhURVJOQUxfU1NFKGNwdV9mbGFncykgJiYgYnBjIDw9IDgpIHsKKyAgICAgICAgY3R4LT5lbXVsYXRlZF9lZGdlX21jID0gZW11bGF0ZWRfZWRnZV9tY19zc2U7CisgICAgfQorI2VuZGlmIC8qIEFSQ0hfWDg2XzMyICovCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSAmJiBicGMgPD0gOCkgeworICAgICAgICBjdHgtPmVtdWxhdGVkX2VkZ2VfbWMgPSBlbXVsYXRlZF9lZGdlX21jX3NzZTI7CisgICAgfQorI2lmIEhBVkVfQVZYMl9FWFRFUk5BTAorICAgIGlmIChFWFRFUk5BTF9BVlgyKGNwdV9mbGFncykgJiYgYnBjIDw9IDgpIHsKKyAgICAgICAgY3R4LT5lbXVsYXRlZF9lZGdlX21jID0gZW11bGF0ZWRfZWRnZV9tY19hdngyOworICAgIH0KKyNlbmRpZgorI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZvcmJpc2RzcC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdm9yYmlzZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjVkODM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZvcmJpc2RzcC5hc20KQEAgLTAsMCArMSw4MyBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogVm9yYmlzIHg4NiBvcHRpbWl6YXRpb25zCis7KiBDb3B5cmlnaHQgKEMpIDIwMDYgTG9yZW4gTWVycml0dCA8bG9yZW5tQHUud2FzaGluZ3Rvbi5lZHU+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworcGR3XzgwMDAwMDAwOiB0aW1lcyA0IGRkIDB4ODAwMDAwMDAKKworU0VDVElPTiAudGV4dAorCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIDNkbm93CitjZ2xvYmFsIHZvcmJpc19pbnZlcnNlX2NvdXBsaW5nLCAzLCAzLCA2LCBtYWcsIGFuZywgYmxvY2tfc2l6ZQorICAgIHB4b3IgICAgICAgICAgICAgICAgICAgICBtNywgbTcKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgIG1hZ3EsIFttYWdxK2Jsb2NrX3NpemVxKjRdCisgICAgbGVhICAgICAgICAgICAgICAgICAgICBhbmdxLCBbYW5ncStibG9ja19zaXplcSo0XQorICAgIG5lZyAgICAgICAgICAgICBibG9ja19zaXplcQorLmxvb3A6CisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgIG0wLCBbbWFncStibG9ja19zaXplcSo0XQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgICBtMSwgW2FuZ3ErYmxvY2tfc2l6ZXEqNF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICAgbTIsIG0wCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgIG0zLCBtMQorICAgIHBmY21wZ2UgICAgICAgICAgICAgICAgICBtMiwgbTcgICAgIDsgbSA8PSAwLjAKKyAgICBwZmNtcGdlICAgICAgICAgICAgICAgICAgbTMsIG03ICAgICA7IGEgPD0gMC4wCisgICAgcHNsbGQgICAgICAgICAgICAgICAgICAgIG0yLCAzMSAgICAgOyBrZWVwIG9ubHkgdGhlIHNpZ24gYml0CisgICAgcHhvciAgICAgICAgICAgICAgICAgICAgIG0xLCBtMgorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgICBtNCwgbTMKKyAgICBwYW5kICAgICAgICAgICAgICAgICAgICAgbTMsIG0xCisgICAgcGFuZG4gICAgICAgICAgICAgICAgICAgIG00LCBtMQorICAgIHBmYWRkICAgICAgICAgICAgICAgICAgICBtMywgbTAgICAgIDsgYSA9IG0gKyAoKGEgPCAwKSAmIChhIF4gc2lnbihtKSkpCisgICAgcGZzdWIgICAgICAgICAgICAgICAgICAgIG0wLCBtNCAgICAgOyBtID0gbSArICgoYSA+IDApICYgKGEgXiBzaWduKG0pKSkKKyAgICBtb3ZhICAgW2FuZ3ErYmxvY2tfc2l6ZXEqNF0sIG0zCisgICAgbW92YSAgIFttYWdxK2Jsb2NrX3NpemVxKjRdLCBtMAorICAgIGFkZCAgICAgICAgICAgICBibG9ja19zaXplcSwgMgorICAgIGpsIC5sb29wCisgICAgZmVtbXMKKyAgICBSRVQKKyVlbmRpZgorCitJTklUX1hNTSBzc2UKK2NnbG9iYWwgdm9yYmlzX2ludmVyc2VfY291cGxpbmcsIDMsIDQsIDYsIG1hZywgYW5nLCBibG9ja19zaXplLCBjbnRyCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgIG01LCBbcGR3XzgwMDAwMDAwXQorICAgIHhvciAgICAgICAgICAgICAgICAgICBjbnRycSwgY250cnEKK2FsaWduIDE2CisubG9vcDoKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICAgbTAsIFttYWdxK2NudHJxKjRdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgIG0xLCBbYW5ncStjbnRycSo0XQorICAgIHhvcnBzICAgICAgICAgICAgICAgICAgICBtMiwgbTIKKyAgICB4b3JwcyAgICAgICAgICAgICAgICAgICAgbTMsIG0zCisgICAgY21wbGVwcyAgICAgICAgICAgICAgICAgIG0yLCBtMCAgICAgOyBtIDw9IDAuMAorICAgIGNtcGxlcHMgICAgICAgICAgICAgICAgICBtMywgbTEgICAgIDsgYSA8PSAwLjAKKyAgICBhbmRwcyAgICAgICAgICAgICAgICAgICAgbTIsIG01ICAgICA7IGtlZXAgb25seSB0aGUgc2lnbiBiaXQKKyAgICB4b3JwcyAgICAgICAgICAgICAgICAgICAgbTEsIG0yCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgIG00LCBtMworICAgIGFuZHBzICAgICAgICAgICAgICAgICAgICBtMywgbTEKKyAgICBhbmRucHMgICAgICAgICAgICAgICAgICAgbTQsIG0xCisgICAgYWRkcHMgICAgICAgICAgICAgICAgICAgIG0zLCBtMCAgICAgOyBhID0gbSArICgoYSA8IDApICYgKGEgXiBzaWduKG0pKSkKKyAgICBzdWJwcyAgICAgICAgICAgICAgICAgICAgbTAsIG00ICAgICA7IG0gPSBtICsgKChhID4gMCkgJiAoYSBeIHNpZ24obSkpKQorICAgIG1vdmEgICAgICAgICBbYW5ncStjbnRycSo0XSwgbTMKKyAgICBtb3ZhICAgICAgICAgW21hZ3ErY250cnEqNF0sIG0wCisgICAgYWRkICAgICAgICAgICAgICAgICAgIGNudHJxLCA0CisgICAgY21wICAgICAgICAgICAgICAgICAgIGNudHJxLCBibG9ja19zaXplcQorICAgIGpsIC5sb29wCisgICAgUkVUCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvdm9yYmlzZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92b3JiaXNkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMWNjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdm9yYmlzZHNwX2luaXQuYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IExvcmVuIE1lcnJpdHQgPGxvcmVubUB1Lndhc2hpbmd0b24uZWR1PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZvcmJpc2RzcC5oIgorCit2b2lkIGZmX3ZvcmJpc19pbnZlcnNlX2NvdXBsaW5nXzNkbm93KGZsb2F0ICptYWcsIGZsb2F0ICphbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGJsb2Nrc2l6ZSk7Cit2b2lkIGZmX3ZvcmJpc19pbnZlcnNlX2NvdXBsaW5nX3NzZShmbG9hdCAqbWFnLCBmbG9hdCAqYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgYmxvY2tzaXplKTsKKworYXZfY29sZCB2b2lkIGZmX3ZvcmJpc2RzcF9pbml0X3g4NihWb3JiaXNEU1BDb250ZXh0ICpkc3ApCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworI2lmIEFSQ0hfWDg2XzMyCisgICAgaWYgKEVYVEVSTkFMX0FNRDNETk9XKGNwdV9mbGFncykpCisgICAgICAgIGRzcC0+dm9yYmlzX2ludmVyc2VfY291cGxpbmcgPSBmZl92b3JiaXNfaW52ZXJzZV9jb3VwbGluZ18zZG5vdzsKKyNlbmRpZiAvKiBBUkNIX1g4Nl8zMiAqLworICAgIGlmIChFWFRFUk5BTF9TU0UoY3B1X2ZsYWdzKSkKKyAgICAgICAgZHNwLT52b3JiaXNfaW52ZXJzZV9jb3VwbGluZyA9IGZmX3ZvcmJpc19pbnZlcnNlX2NvdXBsaW5nX3NzZTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92cDNkc3AuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwM2RzcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0OTZhZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92cDNkc3AuYXNtCkBAIC0wLDAgKzEsNzA5IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBNTVgvU1NFMi1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciB0aGUgVlAzIGRlY29kZXIKKzsqIENvcHlyaWdodCAoYykgMjAwNyBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworOyBNTVgtb3B0aW1pemVkIGZ1bmN0aW9ucyBjcmliYmVkIGZyb20gdGhlIG9yaWdpbmFsIFZQMyBzb3VyY2UgY29kZS4KKworU0VDVElPTl9ST0RBVEEKKwordnAzX2lkY3RfZGF0YTogdGltZXMgOCBkdyA2NDI3NworICAgICAgICAgICAgICAgdGltZXMgOCBkdyA2MDU0NworICAgICAgICAgICAgICAgdGltZXMgOCBkdyA1NDQ5MQorICAgICAgICAgICAgICAgdGltZXMgOCBkdyA0NjM0MQorICAgICAgICAgICAgICAgdGltZXMgOCBkdyAzNjQxMAorICAgICAgICAgICAgICAgdGltZXMgOCBkdyAyNTA4MAorICAgICAgICAgICAgICAgdGltZXMgOCBkdyAxMjc4NQorCitwYl83OiAgdGltZXMgOCBkYiAweDA3CitwYl8xRjogdGltZXMgOCBkYiAweDFmCitwYl84MTogdGltZXMgOCBkYiAweDgxCisKK2NleHRlcm4gcGJfMQorY2V4dGVybiBwYl8zCitjZXh0ZXJuIHBiXzgwCisKK2NleHRlcm4gcHdfOAorCitTRUNUSU9OIC50ZXh0CisKKzsgdGhpcyBpcyBvZmYgYnkgb25lIG9yIHR3byBmb3Igc29tZSBjYXNlcyB3aGVuIGZpbHRlcl9saW1pdCBpcyBncmVhdGVyIHRoYW4gNjMKKzsgaW46ICBwMCBpbiBtbTYsIHAxIGluIG1tNCwgcDIgaW4gbW0yLCBwMyBpbiBtbTEKKzsgb3V0OiBwMSBpbiBtbTQsIHAyIGluIG1tMworJW1hY3JvIFZQM19MT09QX0ZJTFRFUiAwCisgICAgbW92cSAgICAgICAgICBtNywgbTYKKyAgICBwYW5kICAgICAgICAgIG02LCBbcGJfN10gICAgOyBwMCY3CisgICAgcHNybHcgICAgICAgICBtNywgMworICAgIHBhbmQgICAgICAgICAgbTcsIFtwYl8xRl0gICA7IHAwPj4zCisgICAgbW92cSAgICAgICAgICBtMywgbTIgICAgICAgIDsgcDIKKyAgICBweG9yICAgICAgICAgIG0yLCBtNAorICAgIHBhbmQgICAgICAgICAgbTIsIFtwYl8xXSAgICA7IChwMl5wMSkmMQorICAgIG1vdnEgICAgICAgICAgbTUsIG0yCisgICAgcGFkZGIgICAgICAgICBtMiwgbTIKKyAgICBwYWRkYiAgICAgICAgIG0yLCBtNSAgICAgICAgOyAzKihwMl5wMSkmMQorICAgIHBhZGRiICAgICAgICAgbTIsIG02ICAgICAgICA7IGV4dHJhIGJpdHMgbG9zdCBpbiBzaGlmdHMKKyAgICBwY21wZXFiICAgICAgIG0wLCBtMAorICAgIHB4b3IgICAgICAgICAgbTEsIG0wICAgICAgICA7IDI1NSAtIHAzCisgICAgcGF2Z2IgICAgICAgICBtMSwgbTIgICAgICAgIDsgKDI1NiAtIHAzICsgZXh0cmFiaXRzKSA+PiAxCisgICAgcHhvciAgICAgICAgICBtMCwgbTQgICAgICAgIDsgMjU1IC0gcDEKKyAgICBwYXZnYiAgICAgICAgIG0wLCBtMyAgICAgICAgOyAoMjU2ICsgcDItcDEpID4+IDEKKyAgICBwYWRkYiAgICAgICAgIG0xLCBbcGJfM10KKyAgICBwYXZnYiAgICAgICAgIG0xLCBtMCAgICAgICAgOyAxMjgrMisoICAgcDItcDEgIC0gcDMpID4+IDIKKyAgICBwYXZnYiAgICAgICAgIG0xLCBtMCAgICAgICAgOyAxMjgrMSsoMyoocDItcDEpIC0gcDMpID4+IDMKKyAgICBwYWRkdXNiICAgICAgIG03LCBtMSAgICAgICAgOyBkKzEyOCsxCisgICAgbW92cSAgICAgICAgICBtNiwgW3BiXzgxXQorICAgIHBzdWJ1c2IgICAgICAgbTYsIG03CisgICAgcHN1YnVzYiAgICAgICBtNywgW3BiXzgxXQorCisgICAgbW92cSAgICAgICAgICBtNSwgW3IyKzUxNl0gIDsgZmxpbQorICAgIHBtaW51YiAgICAgICAgbTYsIG01CisgICAgcG1pbnViICAgICAgICBtNywgbTUKKyAgICBtb3ZxICAgICAgICAgIG0wLCBtNgorICAgIG1vdnEgICAgICAgICAgbTEsIG03CisgICAgcGFkZGIgICAgICAgICBtNiwgbTYKKyAgICBwYWRkYiAgICAgICAgIG03LCBtNworICAgIHBtaW51YiAgICAgICAgbTYsIG01CisgICAgcG1pbnViICAgICAgICBtNywgbTUKKyAgICBwc3ViYiAgICAgICAgIG02LCBtMAorICAgIHBzdWJiICAgICAgICAgbTcsIG0xCisgICAgcGFkZHVzYiAgICAgICBtNCwgbTcKKyAgICBwc3VidXNiICAgICAgIG00LCBtNgorICAgIHBzdWJ1c2IgICAgICAgbTMsIG03CisgICAgcGFkZHVzYiAgICAgICBtMywgbTYKKyVlbmRtYWNybworCislbWFjcm8gU1RPUkVfNF9XT1JEUyAxCisgICAgbW92ZCAgICAgICAgIHIyZCwgJTEKKyAgICBtb3YgIFtyMCAgICAgLTFdLCByMncKKyAgICBwc3JscSAgICAgICAgICUxLCAzMgorICAgIHNociAgICAgICAgICAgcjIsIDE2CisgICAgbW92ICBbcjArcjEgIC0xXSwgcjJ3CisgICAgbW92ZCAgICAgICAgIHIyZCwgJTEKKyAgICBtb3YgIFtyMCtyMSoyLTFdLCByMncKKyAgICBzaHIgICAgICAgICAgIHIyLCAxNgorICAgIG1vdiAgW3IwK3IzICAtMV0sIHIydworJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCB2cDNfdl9sb29wX2ZpbHRlciwgMywgNAorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92c3hkICAgICAgICByMSwgcjFkCislZW5kaWYKKyAgICBtb3YgICAgICAgICAgIHIzLCByMQorICAgIG5lZyAgICAgICAgICAgcjEKKyAgICBtb3ZxICAgICAgICAgIG02LCBbcjArcjEqMl0KKyAgICBtb3ZxICAgICAgICAgIG00LCBbcjArcjEgIF0KKyAgICBtb3ZxICAgICAgICAgIG0yLCBbcjAgICAgIF0KKyAgICBtb3ZxICAgICAgICAgIG0xLCBbcjArcjMgIF0KKworICAgIFZQM19MT09QX0ZJTFRFUgorCisgICAgbW92cSAgICAgW3IwK3IxXSwgbTQKKyAgICBtb3ZxICAgICBbcjAgICBdLCBtMworICAgIFJFVAorCitjZ2xvYmFsIHZwM19oX2xvb3BfZmlsdGVyLCAzLCA0CislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgIHIxLCByMWQKKyVlbmRpZgorICAgIGxlYSAgICAgICAgICAgcjMsIFtyMSozXQorCisgICAgbW92ZCAgICAgICAgICBtNiwgW3IwICAgICAtMl0KKyAgICBtb3ZkICAgICAgICAgIG00LCBbcjArcjEgIC0yXQorICAgIG1vdmQgICAgICAgICAgbTIsIFtyMCtyMSoyLTJdCisgICAgbW92ZCAgICAgICAgICBtMSwgW3IwK3IzICAtMl0KKyAgICBsZWEgICAgICAgICAgIHIwLCBbcjArcjEqNCAgXQorICAgIHB1bnBja2xidyAgICAgbTYsIFtyMCAgICAgLTJdCisgICAgcHVucGNrbGJ3ICAgICBtNCwgW3IwK3IxICAtMl0KKyAgICBwdW5wY2tsYncgICAgIG0yLCBbcjArcjEqMi0yXQorICAgIHB1bnBja2xidyAgICAgbTEsIFtyMCtyMyAgLTJdCisgICAgc3ViICAgICAgICAgICByMCwgcjMKKyAgICBzdWIgICAgICAgICAgIHIwLCByMQorCisgICAgVFJBTlNQT1NFNHg0QiAgNiwgNCwgMiwgMSwgMAorICAgIFZQM19MT09QX0ZJTFRFUgorICAgIFNCVVRURVJGTFkgICAgYncsIDQsIDMsIDUKKworICAgIFNUT1JFXzRfV09SRFMgbTQKKyAgICBsZWEgICAgICAgICAgIHIwLCBbcjArcjEqNCAgXQorICAgIFNUT1JFXzRfV09SRFMgbTMKKyAgICBSRVQKKworOyBmcm9tIG9yaWdpbmFsIGNvbW1lbnRzOiBUaGUgTWFjcm8gZG9lcyBJRGN0IG9uIDQgMS1EIERjdHMKKyVtYWNybyBCZWdpbklEQ1QgMAorICAgIG1vdnEgICAgICAgICAgbTIsIEkoMykKKyAgICBtb3ZxICAgICAgICAgIG02LCBDKDMpCisgICAgbW92cSAgICAgICAgICBtNCwgbTIKKyAgICBtb3ZxICAgICAgICAgIG03LCBKKDUpCisgICAgcG11bGh3ICAgICAgICBtNCwgbTYgICAgICAgIDsgcjQgPSBjMyppMyAtIGkzCisgICAgbW92cSAgICAgICAgICBtMSwgQyg1KQorICAgIHBtdWxodyAgICAgICAgbTYsIG03ICAgICAgICA7IHI2ID0gYzMqaTUgLSBpNQorICAgIG1vdnEgICAgICAgICAgbTUsIG0xCisgICAgcG11bGh3ICAgICAgICBtMSwgbTIgICAgICAgIDsgcjEgPSBjNSppMyAtIGkzCisgICAgbW92cSAgICAgICAgICBtMywgSSgxKQorICAgIHBtdWxodyAgICAgICAgbTUsIG03ICAgICAgICA7IHI1ID0gYzUqaTUgLSBpNQorICAgIG1vdnEgICAgICAgICAgbTAsIEMoMSkKKyAgICBwYWRkdyAgICAgICAgIG00LCBtMiAgICAgICAgOyByNCA9IGMzKmkzCisgICAgcGFkZHcgICAgICAgICBtNiwgbTcgICAgICAgIDsgcjYgPSBjMyppNQorICAgIHBhZGR3ICAgICAgICAgbTIsIG0xICAgICAgICA7IHIyID0gYzUqaTMKKyAgICBtb3ZxICAgICAgICAgIG0xLCBKKDcpCisgICAgcGFkZHcgICAgICAgICBtNywgbTUgICAgICAgIDsgcjcgPSBjNSppNQorICAgIG1vdnEgICAgICAgICAgbTUsIG0wICAgICAgICA7IHI1ID0gYzEKKyAgICBwbXVsaHcgICAgICAgIG0wLCBtMyAgICAgICAgOyByMCA9IGMxKmkxIC0gaTEKKyAgICBwYWRkc3cgICAgICAgIG00LCBtNyAgICAgICAgOyByNCA9IEMgPSBjMyppMyArIGM1Kmk1CisgICAgcG11bGh3ICAgICAgICBtNSwgbTEgICAgICAgIDsgcjUgPSBjMSppNyAtIGk3CisgICAgbW92cSAgICAgICAgICBtNywgQyg3KQorICAgIHBzdWJzdyAgICAgICAgbTYsIG0yICAgICAgICA7IHI2ID0gRCA9IGMzKmk1IC0gYzUqaTMKKyAgICBwYWRkdyAgICAgICAgIG0wLCBtMyAgICAgICAgOyByMCA9IGMxKmkxCisgICAgcG11bGh3ICAgICAgICBtMywgbTcgICAgICAgIDsgcjMgPSBjNyppMQorICAgIG1vdnEgICAgICAgICAgbTIsIEkoMikKKyAgICBwbXVsaHcgICAgICAgIG03LCBtMSAgICAgICAgOyByNyA9IGM3Kmk3CisgICAgcGFkZHcgICAgICAgICBtNSwgbTEgICAgICAgIDsgcjUgPSBjMSppNworICAgIG1vdnEgICAgICAgICAgbTEsIG0yICAgICAgICA7IHIxID0gaTIKKyAgICBwbXVsaHcgICAgICAgIG0yLCBDKDIpICAgICAgOyByMiA9IGMyKmkyIC0gaTIKKyAgICBwc3Vic3cgICAgICAgIG0zLCBtNSAgICAgICAgOyByMyA9IEIgPSBjNyppMSAtIGMxKmk3CisgICAgbW92cSAgICAgICAgICBtNSwgSig2KQorICAgIHBhZGRzdyAgICAgICAgbTAsIG03ICAgICAgICA7IHIwID0gQSA9IGMxKmkxICsgYzcqaTcKKyAgICBtb3ZxICAgICAgICAgIG03LCBtNSAgICAgICAgOyByNyA9IGk2CisgICAgcHN1YnN3ICAgICAgICBtMCwgbTQgICAgICAgIDsgcjAgPSBBIC0gQworICAgIHBtdWxodyAgICAgICAgbTUsIEMoMikgICAgICA7IHI1ID0gYzIqaTYgLSBpNgorICAgIHBhZGR3ICAgICAgICAgbTIsIG0xICAgICAgICA7IHIyID0gYzIqaTIKKyAgICBwbXVsaHcgICAgICAgIG0xLCBDKDYpICAgICAgOyByMSA9IGM2KmkyCisgICAgcGFkZHN3ICAgICAgICBtNCwgbTQgICAgICAgIDsgcjQgPSBDICsgQworICAgIHBhZGRzdyAgICAgICAgbTQsIG0wICAgICAgICA7IHI0ID0gQy4gPSBBICsgQworICAgIHBzdWJzdyAgICAgICAgbTMsIG02ICAgICAgICA7IHIzID0gQiAtIEQKKyAgICBwYWRkdyAgICAgICAgIG01LCBtNyAgICAgICAgOyByNSA9IGMyKmk2CisgICAgcGFkZHN3ICAgICAgICBtNiwgbTYgICAgICAgIDsgcjYgPSBEICsgRAorICAgIHBtdWxodyAgICAgICAgbTcsIEMoNikgICAgICA7IHI3ID0gYzYqaTYKKyAgICBwYWRkc3cgICAgICAgIG02LCBtMyAgICAgICAgOyByNiA9IEQuID0gQiArIEQKKyAgICBtb3ZxICAgICAgICBJKDEpLCBtNCAgICAgICAgOyBzYXZlIEMuIGF0IEkoMSkKKyAgICBwc3Vic3cgICAgICAgIG0xLCBtNSAgICAgICAgOyByMSA9IEggPSBjNippMiAtIGMyKmk2CisgICAgbW92cSAgICAgICAgICBtNCwgQyg0KQorICAgIG1vdnEgICAgICAgICAgbTUsIG0zICAgICAgICA7IHI1ID0gQiAtIEQKKyAgICBwbXVsaHcgICAgICAgIG0zLCBtNCAgICAgICAgOyByMyA9IChjNCAtIDEpICogKEIgLSBEKQorICAgIHBhZGRzdyAgICAgICAgbTcsIG0yICAgICAgICA7IHIzID0gKGM0IC0gMSkgKiAoQiAtIEQpCisgICAgbW92cSAgICAgICAgSSgyKSwgbTYgICAgICAgIDsgc2F2ZSBELiBhdCBJKDIpCisgICAgbW92cSAgICAgICAgICBtMiwgbTAgICAgICAgIDsgcjIgPSBBIC0gQworICAgIG1vdnEgICAgICAgICAgbTYsIEkoMCkKKyAgICBwbXVsaHcgICAgICAgIG0wLCBtNCAgICAgICAgOyByMCA9IChjNCAtIDEpICogKEEgLSBDKQorICAgIHBhZGR3ICAgICAgICAgbTUsIG0zICAgICAgICA7IHI1ID0gQi4gPSBjNCAqIChCIC0gRCkKKyAgICBtb3ZxICAgICAgICAgIG0zLCBKKDQpCisgICAgcHN1YnN3ICAgICAgICBtNSwgbTEgICAgICAgIDsgcjUgPSBCLi4gPSBCLiAtIEgKKyAgICBwYWRkdyAgICAgICAgIG0yLCBtMCAgICAgICAgOyByMCA9IEEuID0gYzQgKiAoQSAtIEMpCisgICAgcHN1YnN3ICAgICAgICBtNiwgbTMgICAgICAgIDsgcjYgPSBpMCAtIGk0CisgICAgbW92cSAgICAgICAgICBtMCwgbTYKKyAgICBwbXVsaHcgICAgICAgIG02LCBtNCAgICAgICAgOyByNiA9IChjNCAtIDEpICogKGkwIC0gaTQpCisgICAgcGFkZHN3ICAgICAgICBtMywgbTMgICAgICAgIDsgcjMgPSBpNCArIGk0CisgICAgcGFkZHN3ICAgICAgICBtMSwgbTEgICAgICAgIDsgcjEgPSBIICsgSAorICAgIHBhZGRzdyAgICAgICAgbTMsIG0wICAgICAgICA7IHIzID0gaTAgKyBpNAorICAgIHBhZGRzdyAgICAgICAgbTEsIG01ICAgICAgICA7IHIxID0gSC4gPSBCICsgSAorICAgIHBtdWxodyAgICAgICAgbTQsIG0zICAgICAgICA7IHI0ID0gKGM0IC0gMSkgKiAoaTAgKyBpNCkKKyAgICBwYWRkc3cgICAgICAgIG02LCBtMCAgICAgICAgOyByNiA9IEYgPSBjNCAqIChpMCAtIGk0KQorICAgIHBzdWJzdyAgICAgICAgbTYsIG0yICAgICAgICA7IHI2ID0gRi4gPSBGIC0gQS4KKyAgICBwYWRkc3cgICAgICAgIG0yLCBtMiAgICAgICAgOyByMiA9IEEuICsgQS4KKyAgICBtb3ZxICAgICAgICAgIG0wLCBJKDEpICAgICAgOyByMCA9IEMuCisgICAgcGFkZHN3ICAgICAgICBtMiwgbTYgICAgICAgIDsgcjIgPSBBLi4gPSBGICsgQS4KKyAgICBwYWRkdyAgICAgICAgIG00LCBtMyAgICAgICAgOyByNCA9IEUgPSBjNCAqIChpMCArIGk0KQorICAgIHBzdWJzdyAgICAgICAgbTIsIG0xICAgICAgICA7IHIyID0gUjIgPSBBLi4gLSBILgorJWVuZG1hY3JvCisKKzsgUm93SURDVCBnZXRzIHJlYWR5IHRvIHRyYW5zcG9zZQorJW1hY3JvIFJvd0lEQ1QgMAorICAgIEJlZ2luSURDVAorICAgIG1vdnEgICAgICAgICAgbTMsIEkoMikgICAgICA7IHIzID0gRC4KKyAgICBwc3Vic3cgICAgICAgIG00LCBtNyAgICAgICAgOyByNCA9IEUuID0gRSAtIEcKKyAgICBwYWRkc3cgICAgICAgIG0xLCBtMSAgICAgICAgOyByMSA9IEguICsgSC4KKyAgICBwYWRkc3cgICAgICAgIG03LCBtNyAgICAgICAgOyByNyA9IEcgKyBHCisgICAgcGFkZHN3ICAgICAgICBtMSwgbTIgICAgICAgIDsgcjEgPSBSMSA9IEEuLiArIEguCisgICAgcGFkZHN3ICAgICAgICBtNywgbTQgICAgICAgIDsgcjEgPSBSMSA9IEEuLiArIEguCisgICAgcHN1YnN3ICAgICAgICBtNCwgbTMgICAgICAgIDsgcjQgPSBSNCA9IEUuIC0gRC4KKyAgICBwYWRkc3cgICAgICAgIG0zLCBtMworICAgIHBzdWJzdyAgICAgICAgbTYsIG01ICAgICAgICA7IHI2ID0gUjYgPSBGLiAtIEIuLgorICAgIHBhZGRzdyAgICAgICAgbTUsIG01CisgICAgcGFkZHN3ICAgICAgICBtMywgbTQgICAgICAgIDsgcjMgPSBSMyA9IEUuICsgRC4KKyAgICBwYWRkc3cgICAgICAgIG01LCBtNiAgICAgICAgOyByNSA9IFI1ID0gRi4gKyBCLi4KKyAgICBwc3Vic3cgICAgICAgIG03LCBtMCAgICAgICAgOyByNyA9IFI3ID0gRy4gLSBDLgorICAgIHBhZGRzdyAgICAgICAgbTAsIG0wCisgICAgbW92cSAgICAgICAgSSgxKSwgbTEgICAgICAgIDsgc2F2ZSBSMQorICAgIHBhZGRzdyAgICAgICAgbTAsIG03ICAgICAgICA7IHIwID0gUjAgPSBHLiArIEMuCislZW5kbWFjcm8KKworOyBDb2x1bW4gSURDVCBub3JtYWxpemVzIGFuZCBzdG9yZXMgZmluYWwgcmVzdWx0cworJW1hY3JvIENvbHVtbklEQ1QgMAorICAgIEJlZ2luSURDVAorICAgIHBhZGRzdyAgICAgICAgbTIsIE9DXzggICAgICA7IGFkanVzdCBSMiAoYW5kIFIxKSBmb3Igc2hpZnQKKyAgICBwYWRkc3cgICAgICAgIG0xLCBtMSAgICAgICAgOyByMSA9IEguICsgSC4KKyAgICBwYWRkc3cgICAgICAgIG0xLCBtMiAgICAgICAgOyByMSA9IFIxID0gQS4uICsgSC4KKyAgICBwc3JhdyAgICAgICAgIG0yLCA0ICAgICAgICAgOyByMiA9IE5SMgorICAgIHBzdWJzdyAgICAgICAgbTQsIG03ICAgICAgICA7IHI0ID0gRS4gPSBFIC0gRworICAgIHBzcmF3ICAgICAgICAgbTEsIDQgICAgICAgICA7IHIxID0gTlIyCisgICAgbW92cSAgICAgICAgICBtMywgSSgyKSAgICAgIDsgcjMgPSBELgorICAgIHBhZGRzdyAgICAgICAgbTcsIG03ICAgICAgICA7IHI3ID0gRyArIEcKKyAgICBtb3ZxICAgICAgICBJKDIpLCBtMiAgICAgICAgOyBzdG9yZSBOUjIgYXQgSTIKKyAgICBwYWRkc3cgICAgICAgIG03LCBtNCAgICAgICAgOyByNyA9IEcuID0gRSArIEcKKyAgICBtb3ZxICAgICAgICBJKDEpLCBtMSAgICAgICAgOyBzdG9yZSBOUjEgYXQgSTEKKyAgICBwc3Vic3cgICAgICAgIG00LCBtMyAgICAgICAgOyByNCA9IFI0ID0gRS4gLSBELgorICAgIHBhZGRzdyAgICAgICAgbTQsIE9DXzggICAgICA7IGFkanVzdCBSNCAoYW5kIFIzKSBmb3Igc2hpZnQKKyAgICBwYWRkc3cgICAgICAgIG0zLCBtMyAgICAgICAgOyByMyA9IEQuICsgRC4KKyAgICBwYWRkc3cgICAgICAgIG0zLCBtNCAgICAgICAgOyByMyA9IFIzID0gRS4gKyBELgorICAgIHBzcmF3ICAgICAgICAgbTQsIDQgICAgICAgICA7IHI0ID0gTlI0CisgICAgcHN1YnN3ICAgICAgICBtNiwgbTUgICAgICAgIDsgcjYgPSBSNiA9IEYuIC0gQi4uCisgICAgcHNyYXcgICAgICAgICBtMywgNCAgICAgICAgIDsgcjMgPSBOUjMKKyAgICBwYWRkc3cgICAgICAgIG02LCBPQ184ICAgICAgOyBhZGp1c3QgUjYgKGFuZCBSNSkgZm9yIHNoaWZ0CisgICAgcGFkZHN3ICAgICAgICBtNSwgbTUgICAgICAgIDsgcjUgPSBCLi4gKyBCLi4KKyAgICBwYWRkc3cgICAgICAgIG01LCBtNiAgICAgICAgOyByNSA9IFI1ID0gRi4gKyBCLi4KKyAgICBwc3JhdyAgICAgICAgIG02LCA0ICAgICAgICAgOyByNiA9IE5SNgorICAgIG1vdnEgICAgICAgIEooNCksIG00ICAgICAgICA7IHN0b3JlIE5SNCBhdCBKNAorICAgIHBzcmF3ICAgICAgICAgbTUsIDQgICAgICAgICA7IHI1ID0gTlI1CisgICAgbW92cSAgICAgICAgSSgzKSwgbTMgICAgICAgIDsgc3RvcmUgTlIzIGF0IEkzCisgICAgcHN1YnN3ICAgICAgICBtNywgbTAgICAgICAgIDsgcjcgPSBSNyA9IEcuIC0gQy4KKyAgICBwYWRkc3cgICAgICAgIG03LCBPQ184ICAgICAgOyBhZGp1c3QgUjcgKGFuZCBSMCkgZm9yIHNoaWZ0CisgICAgcGFkZHN3ICAgICAgICBtMCwgbTAgICAgICAgIDsgcjAgPSBDLiArIEMuCisgICAgcGFkZHN3ICAgICAgICBtMCwgbTcgICAgICAgIDsgcjAgPSBSMCA9IEcuICsgQy4KKyAgICBwc3JhdyAgICAgICAgIG03LCA0ICAgICAgICAgOyByNyA9IE5SNworICAgIG1vdnEgICAgICAgIEooNiksIG02ICAgICAgICA7IHN0b3JlIE5SNiBhdCBKNgorICAgIHBzcmF3ICAgICAgICAgbTAsIDQgICAgICAgICA7IHIwID0gTlIwCisgICAgbW92cSAgICAgICAgSig1KSwgbTUgICAgICAgIDsgc3RvcmUgTlI1IGF0IEo1CisgICAgbW92cSAgICAgICAgSig3KSwgbTcgICAgICAgIDsgc3RvcmUgTlI3IGF0IEo3CisgICAgbW92cSAgICAgICAgSSgwKSwgbTAgICAgICAgIDsgc3RvcmUgTlIwIGF0IEkwCislZW5kbWFjcm8KKworOyBGb2xsb3dpbmcgbWFjcm8gZG9lcyB0d28gNHg0IHRyYW5zcG9zZXMgaW4gcGxhY2UuCis7Cis7IEF0IGVudHJ5ICh3ZSBhc3N1bWUpOgorOworOyAgIHIwID0gYTMgYTIgYTEgYTAKKzsgICBJKDEpID0gYjMgYjIgYjEgYjAKKzsgICByMiA9IGMzIGMyIGMxIGMwCis7ICAgcjMgPSBkMyBkMiBkMSBkMAorOworOyAgIHI0ID0gZTMgZTIgZTEgZTAKKzsgICByNSA9IGYzIGYyIGYxIGYwCis7ICAgcjYgPSBnMyBnMiBnMSBnMAorOyAgIHI3ID0gaDMgaDIgaDEgaDAKKzsKKzsgQXQgZXhpdCwgd2UgaGF2ZToKKzsKKzsgICBJKDApID0gZDAgYzAgYjAgYTAKKzsgICBJKDEpID0gZDEgYzEgYjEgYTEKKzsgICBJKDIpID0gZDIgYzIgYjIgYTIKKzsgICBJKDMpID0gZDMgYzMgYjMgYTMKKzsKKzsgICBKKDQpID0gaDAgZzAgZjAgZTAKKzsgICBKKDUpID0gaDEgZzEgZjEgZTEKKzsgICBKKDYpID0gaDIgZzIgZjIgZTIKKzsgICBKKDcpID0gaDMgZzMgZjMgZTMKKzsKKzsgIEkoMCkgSSgxKSBJKDIpIEkoMykgIGlzIHRoZSB0cmFuc3Bvc2Ugb2YgcjAgSSgxKSByMiByMy4KKzsgIEooNCkgSig1KSBKKDYpIEooNykgIGlzIHRoZSB0cmFuc3Bvc2Ugb2YgcjQgcjUgcjYgcjcuCis7Cis7ICBTaW5jZSByMSBpcyBmcmVlIGF0IGVudHJ5LCB3ZSBjYWxjdWxhdGUgdGhlIEpzIGZpcnN0LgorJW1hY3JvIFRyYW5zcG9zZSAwCisgICAgbW92cSAgICAgICAgICBtMSwgbTQgICAgICAgIDsgcjEgPSBlMyBlMiBlMSBlMAorICAgIHB1bnBja2x3ZCAgICAgbTQsIG01ICAgICAgICA7IHI0ID0gZjEgZTEgZjAgZTAKKyAgICBtb3ZxICAgICAgICBJKDApLCBtMCAgICAgICAgOyBzYXZlIGEzIGEyIGExIGEwCisgICAgcHVucGNraHdkICAgICBtMSwgbTUgICAgICAgIDsgcjEgPSBmMyBlMyBmMiBlMgorICAgIG1vdnEgICAgICAgICAgbTAsIG02ICAgICAgICA7IHIwID0gZzMgZzIgZzEgZzAKKyAgICBwdW5wY2tsd2QgICAgIG02LCBtNyAgICAgICAgOyByNiA9IGgxIGcxIGgwIGcwCisgICAgbW92cSAgICAgICAgICBtNSwgbTQgICAgICAgIDsgcjUgPSBmMSBlMSBmMCBlMAorICAgIHB1bnBja2xkcSAgICAgbTQsIG02ICAgICAgICA7IHI0ID0gaDAgZzAgZjAgZTAgPSBSNAorICAgIHB1bnBja2hkcSAgICAgbTUsIG02ICAgICAgICA7IHI1ID0gaDEgZzEgZjEgZTEgPSBSNQorICAgIG1vdnEgICAgICAgICAgbTYsIG0xICAgICAgICA7IHI2ID0gZjMgZTMgZjIgZTIKKyAgICBtb3ZxICAgICAgICBKKDQpLCBtNAorICAgIHB1bnBja2h3ZCAgICAgbTAsIG03ICAgICAgICA7IHIwID0gaDMgZzMgaDIgZzIKKyAgICBtb3ZxICAgICAgICBKKDUpLCBtNQorICAgIHB1bnBja2hkcSAgICAgbTYsIG0wICAgICAgICA7IHI2ID0gaDMgZzMgZjMgZTMgPSBSNworICAgIG1vdnEgICAgICAgICAgbTQsIEkoMCkgICAgICA7IHI0ID0gYTMgYTIgYTEgYTAKKyAgICBwdW5wY2tsZHEgICAgIG0xLCBtMCAgICAgICAgOyByMSA9IGgyIGcyIGYyIGUyID0gUjYKKyAgICBtb3ZxICAgICAgICAgIG01LCBJKDEpICAgICAgOyByNSA9IGIzIGIyIGIxIGIwCisgICAgbW92cSAgICAgICAgICBtMCwgbTQgICAgICAgIDsgcjAgPSBhMyBhMiBhMSBhMAorICAgIG1vdnEgICAgICAgIEooNyksIG02CisgICAgcHVucGNrbHdkICAgICBtMCwgbTUgICAgICAgIDsgcjAgPSBiMSBhMSBiMCBhMAorICAgIG1vdnEgICAgICAgIEooNiksIG0xCisgICAgcHVucGNraHdkICAgICBtNCwgbTUgICAgICAgIDsgcjQgPSBiMyBhMyBiMiBhMgorICAgIG1vdnEgICAgICAgICAgbTUsIG0yICAgICAgICA7IHI1ID0gYzMgYzIgYzEgYzAKKyAgICBwdW5wY2tsd2QgICAgIG0yLCBtMyAgICAgICAgOyByMiA9IGQxIGMxIGQwIGMwCisgICAgbW92cSAgICAgICAgICBtMSwgbTAgICAgICAgIDsgcjEgPSBiMSBhMSBiMCBhMAorICAgIHB1bnBja2xkcSAgICAgbTAsIG0yICAgICAgICA7IHIwID0gZDAgYzAgYjAgYTAgPSBSMAorICAgIHB1bnBja2hkcSAgICAgbTEsIG0yICAgICAgICA7IHIxID0gZDEgYzEgYjEgYTEgPSBSMQorICAgIG1vdnEgICAgICAgICAgbTIsIG00ICAgICAgICA7IHIyID0gYjMgYTMgYjIgYTIKKyAgICBtb3ZxICAgICAgICBJKDApLCBtMAorICAgIHB1bnBja2h3ZCAgICAgbTUsIG0zICAgICAgICA7IHI1ID0gZDMgYzMgZDIgYzIKKyAgICBtb3ZxICAgICAgICBJKDEpLCBtMQorICAgIHB1bnBja2hkcSAgICAgbTQsIG01ICAgICAgICA7IHI0ID0gZDMgYzMgYjMgYTMgPSBSMworICAgIHB1bnBja2xkcSAgICAgbTIsIG01ICAgICAgICA7IHIyID0gZDIgYzIgYjIgYTIgPSBSMgorICAgIG1vdnEgICAgICAgIEkoMyksIG00CisgICAgbW92cSAgICAgICAgSSgyKSwgbTIKKyVlbmRtYWNybworCislbWFjcm8gVlAzXzFEX0lEQ1RfU1NFMiAwCisgICAgbW92ZHFhICAgICAgICBtMiwgSSgzKSAgICAgIDsgeG1tMiA9IGkzCisgICAgbW92ZHFhICAgICAgICBtNiwgQygzKSAgICAgIDsgeG1tNiA9IGMzCisgICAgbW92ZHFhICAgICAgICBtNCwgbTIgICAgICAgIDsgeG1tNCA9IGkzCisgICAgbW92ZHFhICAgICAgICBtNywgSSg1KSAgICAgIDsgeG1tNyA9IGk1CisgICAgcG11bGh3ICAgICAgICBtNCwgbTYgICAgICAgIDsgeG1tNCA9IGMzICogaTMgLSBpMworICAgIG1vdmRxYSAgICAgICAgbTEsIEMoNSkgICAgICA7IHhtbTEgPSBjNQorICAgIHBtdWxodyAgICAgICAgbTYsIG03ICAgICAgICA7IHhtbTYgPSBjMyAqIGk1IC0gaTUKKyAgICBtb3ZkcWEgICAgICAgIG01LCBtMSAgICAgICAgOyB4bW01ID0gYzUKKyAgICBwbXVsaHcgICAgICAgIG0xLCBtMiAgICAgICAgOyB4bW0xID0gYzUgKiBpMyAtIGkzCisgICAgbW92ZHFhICAgICAgICBtMywgSSgxKSAgICAgIDsgeG1tMyA9IGkxCisgICAgcG11bGh3ICAgICAgICBtNSwgbTcgICAgICAgIDsgeG1tNSA9IGM1ICogaTUgLSBpNQorICAgIG1vdmRxYSAgICAgICAgbTAsIEMoMSkgICAgICA7IHhtbTAgPSBjMQorICAgIHBhZGR3ICAgICAgICAgbTQsIG0yICAgICAgICA7IHhtbTQgPSBjMyAqIGkzCisgICAgcGFkZHcgICAgICAgICBtNiwgbTcgICAgICAgIDsgeG1tNiA9IGMzICogaTUKKyAgICBwYWRkdyAgICAgICAgIG0yLCBtMSAgICAgICAgOyB4bW0yID0gYzUgKiBpMworICAgIG1vdmRxYSAgICAgICAgbTEsIEkoNykgICAgICA7IHhtbTEgPSBpNworICAgIHBhZGR3ICAgICAgICAgbTcsIG01ICAgICAgICA7IHhtbTcgPSBjNSAqIGk1CisgICAgbW92ZHFhICAgICAgICBtNSwgbTAgICAgICAgIDsgeG1tNSA9IGMxCisgICAgcG11bGh3ICAgICAgICBtMCwgbTMgICAgICAgIDsgeG1tMCA9IGMxICogaTEgLSBpMQorICAgIHBhZGRzdyAgICAgICAgbTQsIG03ICAgICAgICA7IHhtbTQgPSBjMyAqIGkzICsgYzUgKiBpNSA9IEMKKyAgICBwbXVsaHcgICAgICAgIG01LCBtMSAgICAgICAgOyB4bW01ID0gYzEgKiBpNyAtIGk3CisgICAgbW92ZHFhICAgICAgICBtNywgQyg3KSAgICAgIDsgeG1tNyA9IGM3CisgICAgcHN1YnN3ICAgICAgICBtNiwgbTIgICAgICAgIDsgeG1tNiA9IGMzICogaTUgLSBjNSAqIGkzID0gRAorICAgIHBhZGR3ICAgICAgICAgbTAsIG0zICAgICAgICA7IHhtbTAgPSBjMSAqIGkxCisgICAgcG11bGh3ICAgICAgICBtMywgbTcgICAgICAgIDsgeG1tMyA9IGM3ICogaTEKKyAgICBtb3ZkcWEgICAgICAgIG0yLCBJKDIpICAgICAgOyB4bW0yID0gaTIKKyAgICBwbXVsaHcgICAgICAgIG03LCBtMSAgICAgICAgOyB4bW03ID0gYzcgKiBpNworICAgIHBhZGR3ICAgICAgICAgbTUsIG0xICAgICAgICA7IHhtbTUgPSBjMSAqIGk3CisgICAgbW92ZHFhICAgICAgICBtMSwgbTIgICAgICAgIDsgeG1tMSA9IGkyCisgICAgcG11bGh3ICAgICAgICBtMiwgQygyKSAgICAgIDsgeG1tMiA9IGkyICogYzIgLWkyCisgICAgcHN1YnN3ICAgICAgICBtMywgbTUgICAgICAgIDsgeG1tMyA9IGM3ICogaTEgLSBjMSAqIGk3ID0gQgorICAgIG1vdmRxYSAgICAgICAgbTUsIEkoNikgICAgICA7IHhtbTUgPSBpNgorICAgIHBhZGRzdyAgICAgICAgbTAsIG03ICAgICAgICA7IHhtbTAgPSBjMSAqIGkxICsgYzcgKiBpNyA9IEEKKyAgICBtb3ZkcWEgICAgICAgIG03LCBtNSAgICAgICAgOyB4bW03ID0gaTYKKyAgICBwc3Vic3cgICAgICAgIG0wLCBtNCAgICAgICAgOyB4bW0wID0gQSAtIEMKKyAgICBwbXVsaHcgICAgICAgIG01LCBDKDIpICAgICAgOyB4bW01ID0gYzIgKiBpNiAtIGk2CisgICAgcGFkZHcgICAgICAgICBtMiwgbTEgICAgICAgIDsgeG1tMiA9IGkyICogYzIKKyAgICBwbXVsaHcgICAgICAgIG0xLCBDKDYpICAgICAgOyB4bW0xID0gYzYgKiBpMgorICAgIHBhZGRzdyAgICAgICAgbTQsIG00ICAgICAgICA7IHhtbTQgPSBDICsgQworICAgIHBhZGRzdyAgICAgICAgbTQsIG0wICAgICAgICA7IHhtbTQgPSBBICsgQyA9IEMuCisgICAgcHN1YnN3ICAgICAgICBtMywgbTYgICAgICAgIDsgeG1tMyA9IEIgLSBECisgICAgcGFkZHcgICAgICAgICBtNSwgbTcgICAgICAgIDsgeG1tNSA9IGMyICogaTYKKyAgICBwYWRkc3cgICAgICAgIG02LCBtNiAgICAgICAgOyB4bW02ID0gRCArIEQKKyAgICBwbXVsaHcgICAgICAgIG03LCBDKDYpICAgICAgOyB4bW03ID0gYzYgKiBpNgorICAgIHBhZGRzdyAgICAgICAgbTYsIG0zICAgICAgICA7IHhtbTYgPSBCICsgRCA9IEQuCisgICAgbW92ZHFhICAgICAgSSgxKSwgbTQgICAgICAgIDsgU2F2ZSBDLiBhdCBJKDEpCisgICAgcHN1YnN3ICAgICAgICBtMSwgbTUgICAgICAgIDsgeG1tMSA9IGM2ICogaTIgLSBjMiAqIGk2ID0gSAorICAgIG1vdmRxYSAgICAgICAgbTQsIEMoNCkgICAgICA7IHhtbTQgPSBDNAorICAgIG1vdmRxYSAgICAgICAgbTUsIG0zICAgICAgICA7IHhtbTUgPSBCIC0gRAorICAgIHBtdWxodyAgICAgICAgbTMsIG00ICAgICAgICA7IHhtbTMgPSAoIGM0IC0xICkgKiAoIEIgLSBEICkKKyAgICBwYWRkc3cgICAgICAgIG03LCBtMiAgICAgICAgOyB4bW03ID0gYzIgKiBpMiArIGM2ICogaTYgPSBHCisgICAgbW92ZHFhICAgICAgSSgyKSwgbTYgICAgICAgIDsgc2F2ZSBELiBhdCBJKDIpCisgICAgbW92ZHFhICAgICAgICBtMiwgbTAgICAgICAgIDsgeG1tMiA9IEEgLSBDCisgICAgbW92ZHFhICAgICAgICBtNiwgSSgwKSAgICAgIDsgeG1tNiA9IGkwCisgICAgcG11bGh3ICAgICAgICBtMCwgbTQgICAgICAgIDsgeG1tMCA9ICggYzQgLSAxICkgKiAoIEEgLSBDICkgPSBBLgorICAgIHBhZGR3ICAgICAgICAgbTUsIG0zICAgICAgICA7IHhtbTUgPSBjNCAqICggQiAtIEQgKSA9IEIuCisgICAgbW92ZHFhICAgICAgICBtMywgSSg0KSAgICAgIDsgeG1tMyA9IGk0CisgICAgcHN1YnN3ICAgICAgICBtNSwgbTEgICAgICAgIDsgeG1tNSA9IEIuIC0gSCA9IEIuLgorICAgIHBhZGR3ICAgICAgICAgbTIsIG0wICAgICAgICA7IHhtbTIgPSBjNCAqICggQSAtIEMpID0gQS4KKyAgICBwc3Vic3cgICAgICAgIG02LCBtMyAgICAgICAgOyB4bW02ID0gaTAgLSBpNAorICAgIG1vdmRxYSAgICAgICAgbTAsIG02ICAgICAgICA7IHhtbTAgPSBpMCAtIGk0CisgICAgcG11bGh3ICAgICAgICBtNiwgbTQgICAgICAgIDsgeG1tNiA9IChjNCAtIDEpICogKGkwIC0gaTQpID0gRgorICAgIHBhZGRzdyAgICAgICAgbTMsIG0zICAgICAgICA7IHhtbTMgPSBpNCArIGk0CisgICAgcGFkZHN3ICAgICAgICBtMSwgbTEgICAgICAgIDsgeG1tMSA9IEggKyBICisgICAgcGFkZHN3ICAgICAgICBtMywgbTAgICAgICAgIDsgeG1tMyA9IGkwICsgaTQKKyAgICBwYWRkc3cgICAgICAgIG0xLCBtNSAgICAgICAgOyB4bW0xID0gQi4gKyBIID0gSC4KKyAgICBwbXVsaHcgICAgICAgIG00LCBtMyAgICAgICAgOyB4bW00ID0gKCBjNCAtIDEgKSAqICggaTAgKyBpNCApCisgICAgcGFkZHcgICAgICAgICBtNiwgbTAgICAgICAgIDsgeG1tNiA9IGM0ICogKCBpMCAtIGk0ICkKKyAgICBwc3Vic3cgICAgICAgIG02LCBtMiAgICAgICAgOyB4bW02ID0gRiAtIEEuID0gRi4KKyAgICBwYWRkc3cgICAgICAgIG0yLCBtMiAgICAgICAgOyB4bW0yID0gQS4gKyBBLgorICAgIG1vdmRxYSAgICAgICAgbTAsIEkoMSkgICAgICA7IExvYWQgICAgICAgIEMuIGZyb20gSSgxKQorICAgIHBhZGRzdyAgICAgICAgbTIsIG02ICAgICAgICA7IHhtbTIgPSBGICsgQS4gPSBBLi4KKyAgICBwYWRkdyAgICAgICAgIG00LCBtMyAgICAgICAgOyB4bW00ID0gYzQgKiAoIGkwICsgaTQgKSA9IDMKKyAgICBwc3Vic3cgICAgICAgIG0yLCBtMSAgICAgICAgOyB4bW0yID0gQS4uIC0gSC4gPSBSMgorICAgIEFERChtMikgICAgICAgICAgICAgICAgICAgICA7IEFkanVzdCBSMiBhbmQgUjEgYmVmb3JlIHNoaWZ0aW5nCisgICAgcGFkZHN3ICAgICAgICBtMSwgbTEgICAgICAgIDsgeG1tMSA9IEguICsgSC4KKyAgICBwYWRkc3cgICAgICAgIG0xLCBtMiAgICAgICAgOyB4bW0xID0gQS4uICsgSC4gPSBSMQorICAgIFNISUZUKG0yKSAgICAgICAgICAgICAgICAgICA7IHhtbTIgPSBvcDIKKyAgICBwc3Vic3cgICAgICAgIG00LCBtNyAgICAgICAgOyB4bW00ID0gRSAtIEcgPSBFLgorICAgIFNISUZUKG0xKSAgICAgICAgICAgICAgICAgICA7IHhtbTEgPSBvcDEKKyAgICBtb3ZkcWEgICAgICAgIG0zLCBJKDIpICAgICAgOyBMb2FkIEQuIGZyb20gSSgyKQorICAgIHBhZGRzdyAgICAgICAgbTcsIG03ICAgICAgICA7IHhtbTcgPSBHICsgRworICAgIHBhZGRzdyAgICAgICAgbTcsIG00ICAgICAgICA7IHhtbTcgPSBFICsgRyA9IEcuCisgICAgcHN1YnN3ICAgICAgICBtNCwgbTMgICAgICAgIDsgeG1tNCA9IEUuIC0gRC4gPSBSNAorICAgIEFERChtNCkgICAgICAgICAgICAgICAgICAgICA7IEFkanVzdCBSNCBhbmQgUjMgYmVmb3JlIHNoaWZ0aW5nCisgICAgcGFkZHN3ICAgICAgICBtMywgbTMgICAgICAgIDsgeG1tMyA9IEQuICsgRC4KKyAgICBwYWRkc3cgICAgICAgIG0zLCBtNCAgICAgICAgOyB4bW0zID0gRS4gKyBELiA9IFIzCisgICAgU0hJRlQobTQpICAgICAgICAgICAgICAgICAgIDsgeG1tNCA9IG9wNAorICAgIHBzdWJzdyAgICAgICAgbTYsIG01ICAgICAgICA7IHhtbTYgPSBGLiAtIEIuLj0gUjYKKyAgICBTSElGVChtMykgICAgICAgICAgICAgICAgICAgOyB4bW0zID0gb3AzCisgICAgQUREKG02KSAgICAgICAgICAgICAgICAgICAgIDsgQWRqdXN0IFI2IGFuZCBSNSBiZWZvcmUgc2hpZnRpbmcKKyAgICBwYWRkc3cgICAgICAgIG01LCBtNSAgICAgICAgOyB4bW01ID0gQi4uICsgQi4uCisgICAgcGFkZHN3ICAgICAgICBtNSwgbTYgICAgICAgIDsgeG1tNSA9IEYuICsgQi4uID0gUjUKKyAgICBTSElGVChtNikgICAgICAgICAgICAgICAgICAgOyB4bW02ID0gb3A2CisgICAgU0hJRlQobTUpICAgICAgICAgICAgICAgICAgIDsgeG1tNSA9IG9wNQorICAgIHBzdWJzdyAgICAgICAgbTcsIG0wICAgICAgICA7IHhtbTcgPSBHLiAtIEMuID0gUjcKKyAgICBBREQobTcpICAgICAgICAgICAgICAgICAgICAgOyBBZGp1c3QgUjcgYW5kIFIwIGJlZm9yZSBzaGlmdGluZworICAgIHBhZGRzdyAgICAgICAgbTAsIG0wICAgICAgICA7IHhtbTAgPSBDLiArIEMuCisgICAgcGFkZHN3ICAgICAgICBtMCwgbTcgICAgICAgIDsgeG1tMCA9IEcuICsgQy4KKyAgICBTSElGVChtNykgICAgICAgICAgICAgICAgICAgOyB4bW03ID0gb3A3CisgICAgU0hJRlQobTApICAgICAgICAgICAgICAgICAgIDsgeG1tMCA9IG9wMAorJWVuZG1hY3JvCisKKyVtYWNybyBQVVRfQkxPQ0sgOAorICAgIG1vdmRxYSAgICAgIE8oMCksIG0lMQorICAgIG1vdmRxYSAgICAgIE8oMSksIG0lMgorICAgIG1vdmRxYSAgICAgIE8oMiksIG0lMworICAgIG1vdmRxYSAgICAgIE8oMyksIG0lNAorICAgIG1vdmRxYSAgICAgIE8oNCksIG0lNQorICAgIG1vdmRxYSAgICAgIE8oNSksIG0lNgorICAgIG1vdmRxYSAgICAgIE8oNiksIG0lNworICAgIG1vdmRxYSAgICAgIE8oNyksIG0lOAorJWVuZG1hY3JvCisKKyVtYWNybyBWUDNfSURDVCAxCislaWYgbW1zaXplID09IDE2CislZGVmaW5lIEkoeCkgWyUxKzE2KnhdCislZGVmaW5lIE8oeCkgWyUxKzE2KnhdCislZGVmaW5lIEMoeCkgW3ZwM19pZGN0X2RhdGErMTYqKHgtMSldCislZGVmaW5lIFNISUZUKHgpCislZGVmaW5lIEFERCh4KQorICAgICAgICBWUDNfMURfSURDVF9TU0UyCislaWYgQVJDSF9YODZfNjQKKyAgICAgICAgVFJBTlNQT1NFOHg4VyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4CislZWxzZQorICAgICAgICBUUkFOU1BPU0U4eDhXIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIFslMV0sIFslMSsxNl0KKyVlbmRpZgorICAgICAgICBQVVRfQkxPQ0sgMCwgMSwgMiwgMywgNCwgNSwgNiwgNworCislZGVmaW5lIFNISUZUKHgpIHBzcmF3ICB4LCA0CislZGVmaW5lIEFERCh4KSAgIHBhZGRzdyB4LCBbcHdfOF0KKyAgICAgICAgVlAzXzFEX0lEQ1RfU1NFMgorICAgICAgICBQVVRfQkxPQ0sgMCwgMSwgMiwgMywgNCwgNSwgNiwgNworJWVsc2UgOyBtbXNpemUgPT0gOAorICAgIDsgZWF4ID0gcXVhbnRpemVkIGlucHV0CisgICAgOyBlYnggPSBkZXF1YW50aXplciBtYXRyaXgKKyAgICA7IGVjeCA9IElEQ1QgY29uc3RhbnRzCisgICAgOyAgTShJKSA9IGVjeCArIE1hc2tPZmZzZXQoMCkgKyBJICogOAorICAgIDsgIEMoSSkgPSBlY3ggKyBDb3NpbmVPZmZzZXQoMzIpICsgKEktMSkgKiA4CisgICAgOyBlZHggPSBvdXRwdXQKKyAgICA7IHIwLi5yNyA9IG1tMC4ubW03CislZGVmaW5lIE9DXzggW3B3XzhdCislZGVmaW5lIEMoeCkgW3ZwM19pZGN0X2RhdGErMTYqKHgtMSldCisKKyAgICA7IGF0IHRoaXMgcG9pbnQsIGZ1bmN0aW9uIGhhcyBjb21wbGV0ZWQgZGVxdWFudGl6YXRpb24gKyBkZXppZ3phZyArCisgICAgOyBwYXJ0aWFsIHRyYW5zcG9zaXRpb247IG5vdyBkbyB0aGUgaWRjdCBpdHNlbGYKKyVkZWZpbmUgSSh4KSBbJTErMTYqeF0KKyVkZWZpbmUgSih4KSBbJTErMTYqeF0KKyAgICBSb3dJRENUCisgICAgVHJhbnNwb3NlCisKKyVkZWZpbmUgSSh4KSBbJTErMTYqeCs4XQorJWRlZmluZSBKKHgpIFslMSsxNip4KzhdCisgICAgUm93SURDVAorICAgIFRyYW5zcG9zZQorCislZGVmaW5lIEkoeCkgWyUxKzE2KiB4XQorJWRlZmluZSBKKHgpIFslMSsxNiooeC00KSs4XQorICAgIENvbHVtbklEQ1QKKworJWRlZmluZSBJKHgpIFslMSsxNiogeCAgICs2NF0KKyVkZWZpbmUgSih4KSBbJTErMTYqKHgtNCkrNzJdCisgICAgQ29sdW1uSURDVAorJWVuZGlmIDsgbW1zaXplID09IDE2LzgKKyVlbmRtYWNybworCislbWFjcm8gdnAzX2lkY3RfZnVuY3MgMAorY2dsb2JhbCB2cDNfaWRjdF9wdXQsIDMsIDQsIDkKKyAgICBWUDNfSURDVCAgICAgIHIyCisKKyAgICBtb3ZzeGRpZm5pZG4gIHIxLCByMWQKKyAgICBtb3ZhICAgICAgICAgIG00LCBbcGJfODBdCisgICAgbGVhICAgICAgICAgICByMywgW3IxKjNdCislYXNzaWduICUlaSAwCislcmVwIDE2L21tc2l6ZQorICAgIG1vdmEgICAgICAgICAgbTAsIFtyMittbXNpemUqMCslJWldCisgICAgbW92YSAgICAgICAgICBtMSwgW3IyK21tc2l6ZSoyKyUlaV0KKyAgICBtb3ZhICAgICAgICAgIG0yLCBbcjIrbW1zaXplKjQrJSVpXQorICAgIG1vdmEgICAgICAgICAgbTMsIFtyMittbXNpemUqNislJWldCislaWYgbW1zaXplID09IDgKKyAgICBwYWNrc3N3YiAgICAgIG0wLCBbcjIrbW1zaXplKjgrJSVpXQorICAgIHBhY2tzc3diICAgICAgbTEsIFtyMittbXNpemUqMTArJSVpXQorICAgIHBhY2tzc3diICAgICAgbTIsIFtyMittbXNpemUqMTIrJSVpXQorICAgIHBhY2tzc3diICAgICAgbTMsIFtyMittbXNpemUqMTQrJSVpXQorJWVsc2UKKyAgICBwYWNrc3N3YiAgICAgIG0wLCBbcjIrbW1zaXplKjErJSVpXQorICAgIHBhY2tzc3diICAgICAgbTEsIFtyMittbXNpemUqMyslJWldCisgICAgcGFja3Nzd2IgICAgICBtMiwgW3IyK21tc2l6ZSo1KyUlaV0KKyAgICBwYWNrc3N3YiAgICAgIG0zLCBbcjIrbW1zaXplKjcrJSVpXQorJWVuZGlmCisgICAgcGFkZGIgICAgICAgICBtMCwgbTQKKyAgICBwYWRkYiAgICAgICAgIG0xLCBtNAorICAgIHBhZGRiICAgICAgICAgbTIsIG00CisgICAgcGFkZGIgICAgICAgICBtMywgbTQKKyAgICBtb3ZxICAgW3IwICAgICBdLCBtMAorJWlmIG1tc2l6ZSA9PSA4CisgICAgbW92cSAgIFtyMCtyMSAgXSwgbTEKKyAgICBtb3ZxICAgW3IwK3IxKjJdLCBtMgorICAgIG1vdnEgICBbcjArcjMgIF0sIG0zCislZWxzZQorICAgIG1vdmhwcyBbcjArcjEgIF0sIG0wCisgICAgbW92cSAgIFtyMCtyMSoyXSwgbTEKKyAgICBtb3ZocHMgW3IwK3IzICBdLCBtMQorJWVuZGlmCislaWYgJSVpID09IDAKKyAgICBsZWEgICAgICAgICAgIHIwLCBbcjArcjEqNF0KKyVlbmRpZgorJWlmIG1tc2l6ZSA9PSAxNgorICAgIG1vdnEgICBbcjAgICAgIF0sIG0yCisgICAgbW92aHBzIFtyMCtyMSAgXSwgbTIKKyAgICBtb3ZxICAgW3IwK3IxKjJdLCBtMworICAgIG1vdmhwcyBbcjArcjMgIF0sIG0zCislZW5kaWYKKyVhc3NpZ24gJSVpICUlaSs4CislZW5kcmVwCisKKyAgICBweG9yICAgICAgICAgIG0wLCBtMAorJWFzc2lnbiAlJW9mZnNldCAwCislcmVwIDEyOC9tbXNpemUKKyAgICBtb3ZhIFtyMislJW9mZnNldF0sIG0wCislYXNzaWduICUlb2Zmc2V0ICUlb2Zmc2V0K21tc2l6ZQorJWVuZHJlcAorICAgIFJFVAorCitjZ2xvYmFsIHZwM19pZGN0X2FkZCwgMywgNCwgOQorICAgIFZQM19JRENUICAgICAgcjIKKworICAgIG1vdnN4ZGlmbmlkbiAgcjEsIHIxZAorICAgIGxlYSAgICAgICAgICAgcjMsIFtyMSozXQorICAgIHB4b3IgICAgICAgICAgbTQsIG00CislaWYgbW1zaXplID09IDE2CislYXNzaWduICUlaSAwCislcmVwIDIKKyAgICBtb3ZxICAgICAgICAgIG0wLCBbcjBdCisgICAgbW92cSAgICAgICAgICBtMSwgW3IwK3IxXQorICAgIG1vdnEgICAgICAgICAgbTIsIFtyMCtyMSoyXQorICAgIG1vdnEgICAgICAgICAgbTMsIFtyMCtyM10KKyAgICBwdW5wY2tsYncgICAgIG0wLCBtNAorICAgIHB1bnBja2xidyAgICAgbTEsIG00CisgICAgcHVucGNrbGJ3ICAgICBtMiwgbTQKKyAgICBwdW5wY2tsYncgICAgIG0zLCBtNAorICAgIHBhZGRzdyAgICAgICAgbTAsIFtyMisgMCslJWldCisgICAgcGFkZHN3ICAgICAgICBtMSwgW3IyKzE2KyUlaV0KKyAgICBwYWRkc3cgICAgICAgIG0yLCBbcjIrMzIrJSVpXQorICAgIHBhZGRzdyAgICAgICAgbTMsIFtyMis0OCslJWldCisgICAgcGFja3Vzd2IgICAgICBtMCwgbTEKKyAgICBwYWNrdXN3YiAgICAgIG0yLCBtMworICAgIG1vdnEgICBbcjAgICAgIF0sIG0wCisgICAgbW92aHBzIFtyMCtyMSAgXSwgbTAKKyAgICBtb3ZxICAgW3IwK3IxKjJdLCBtMgorICAgIG1vdmhwcyBbcjArcjMgIF0sIG0yCislaWYgJSVpID09IDAKKyAgICBsZWEgICAgICAgICAgIHIwLCBbcjArcjEqNF0KKyVlbmRpZgorJWFzc2lnbiAlJWkgJSVpKzY0CislZW5kcmVwCislZWxzZQorJWFzc2lnbiAlJWkgMAorJXJlcCAyCisgICAgbW92cSAgICAgICAgICBtMCwgW3IwXQorICAgIG1vdnEgICAgICAgICAgbTEsIFtyMCtyMV0KKyAgICBtb3ZxICAgICAgICAgIG0yLCBbcjArcjEqMl0KKyAgICBtb3ZxICAgICAgICAgIG0zLCBbcjArcjNdCisgICAgbW92cSAgICAgICAgICBtNSwgbTAKKyAgICBtb3ZxICAgICAgICAgIG02LCBtMQorICAgIG1vdnEgICAgICAgICAgbTcsIG0yCisgICAgcHVucGNrbGJ3ICAgICBtMCwgbTQKKyAgICBwdW5wY2tsYncgICAgIG0xLCBtNAorICAgIHB1bnBja2xidyAgICAgbTIsIG00CisgICAgcHVucGNraGJ3ICAgICBtNSwgbTQKKyAgICBwdW5wY2toYncgICAgIG02LCBtNAorICAgIHB1bnBja2hidyAgICAgbTcsIG00CisgICAgcGFkZHN3ICAgICAgICBtMCwgW3IyKyAwKyUlaV0KKyAgICBwYWRkc3cgICAgICAgIG0xLCBbcjIrMTYrJSVpXQorICAgIHBhZGRzdyAgICAgICAgbTIsIFtyMiszMislJWldCisgICAgcGFkZHN3ICAgICAgICBtNSwgW3IyKzY0KyUlaV0KKyAgICBwYWRkc3cgICAgICAgIG02LCBbcjIrODArJSVpXQorICAgIHBhZGRzdyAgICAgICAgbTcsIFtyMis5NislJWldCisgICAgcGFja3Vzd2IgICAgICBtMCwgbTUKKyAgICBtb3ZxICAgICAgICAgIG01LCBtMworICAgIHB1bnBja2xidyAgICAgbTMsIG00CisgICAgcHVucGNraGJ3ICAgICBtNSwgbTQKKyAgICBwYWNrdXN3YiAgICAgIG0xLCBtNgorICAgIHBhZGRzdyAgICAgICAgbTMsIFtyMis0OCslJWldCisgICAgcGFkZHN3ICAgICAgICBtNSwgW3IyKzExMislJWldCisgICAgcGFja3Vzd2IgICAgICBtMiwgbTcKKyAgICBwYWNrdXN3YiAgICAgIG0zLCBtNQorICAgIG1vdnEgICBbcjAgICAgIF0sIG0wCisgICAgbW92cSAgIFtyMCtyMSAgXSwgbTEKKyAgICBtb3ZxICAgW3IwK3IxKjJdLCBtMgorICAgIG1vdnEgICBbcjArcjMgIF0sIG0zCislaWYgJSVpID09IDAKKyAgICBsZWEgICAgICAgICAgIHIwLCBbcjArcjEqNF0KKyVlbmRpZgorJWFzc2lnbiAlJWkgJSVpKzgKKyVlbmRyZXAKKyVlbmRpZgorJWFzc2lnbiAlJWkgMAorJXJlcCAxMjgvbW1zaXplCisgICAgbW92YSAgICBbcjIrJSVpXSwgbTQKKyVhc3NpZ24gJSVpICUlaSttbXNpemUKKyVlbmRyZXAKKyAgICBSRVQKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIG1teAordnAzX2lkY3RfZnVuY3MKKyVlbmRpZgorCitJTklUX1hNTSBzc2UyCit2cDNfaWRjdF9mdW5jcworCislbWFjcm8gRENfQUREIDAKKyAgICBtb3ZxICAgICAgICAgIG0yLCBbcjAgICAgIF0KKyAgICBtb3ZxICAgICAgICAgIG0zLCBbcjArcjEgIF0KKyAgICBwYWRkdXNiICAgICAgIG0yLCBtMAorICAgIG1vdnEgICAgICAgICAgbTQsIFtyMCtyMSoyXQorICAgIHBhZGR1c2IgICAgICAgbTMsIG0wCisgICAgbW92cSAgICAgICAgICBtNSwgW3IwK3IyICBdCisgICAgcGFkZHVzYiAgICAgICBtNCwgbTAKKyAgICBwYWRkdXNiICAgICAgIG01LCBtMAorICAgIHBzdWJ1c2IgICAgICAgbTIsIG0xCisgICAgcHN1YnVzYiAgICAgICBtMywgbTEKKyAgICBtb3ZxICAgW3IwICAgICBdLCBtMgorICAgIHBzdWJ1c2IgICAgICAgbTQsIG0xCisgICAgbW92cSAgIFtyMCtyMSAgXSwgbTMKKyAgICBwc3VidXNiICAgICAgIG01LCBtMQorICAgIG1vdnEgICBbcjArcjEqMl0sIG00CisgICAgbW92cSAgIFtyMCtyMiAgXSwgbTUKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgdnAzX2lkY3RfZGNfYWRkLCAzLCA0CislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgIHIxLCByMWQKKyVlbmRpZgorICAgIG1vdnN4ICAgICAgICAgcjMsIHdvcmQgW3IyXQorICAgIG1vdiAgICB3b3JkIFtyMl0sIDAKKyAgICBsZWEgICAgICAgICAgIHIyLCBbcjEqM10KKyAgICBhZGQgICAgICAgICAgIHIzLCAxNQorICAgIHNhciAgICAgICAgICAgcjMsIDUKKyAgICBtb3ZkICAgICAgICAgIG0wLCByM2QKKyAgICBwc2h1ZncgICAgICAgIG0wLCBtMCwgMHgwCisgICAgcHhvciAgICAgICAgICBtMSwgbTEKKyAgICBwc3VidyAgICAgICAgIG0xLCBtMAorICAgIHBhY2t1c3diICAgICAgbTAsIG0wCisgICAgcGFja3Vzd2IgICAgICBtMSwgbTEKKyAgICBEQ19BREQKKyAgICBsZWEgICAgICAgICAgIHIwLCBbcjArcjEqNF0KKyAgICBEQ19BREQKKyAgICBSRVQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92cDNkc3BfaW5pdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwM2RzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzZWJhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92cDNkc3BfaW5pdC5jCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IERhdmlkIENvbnJhZCA8bGVzc2VuNDJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92cDNkc3AuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKwordm9pZCBmZl92cDNfaWRjdF9wdXRfbW14KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfdnAzX2lkY3RfYWRkX21teCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CisKK3ZvaWQgZmZfdnAzX2lkY3RfcHV0X3NzZTIodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl92cDNfaWRjdF9hZGRfc3NlMih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CisKK3ZvaWQgZmZfdnAzX2lkY3RfZGNfYWRkX21teGV4dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrKTsKKwordm9pZCBmZl92cDNfdl9sb29wX2ZpbHRlcl9tbXhleHQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpib3VuZGluZ192YWx1ZXMpOwordm9pZCBmZl92cDNfaF9sb29wX2ZpbHRlcl9tbXhleHQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpib3VuZGluZ192YWx1ZXMpOworCisjaWYgSEFWRV9NTVhfSU5MSU5FCisKKyNkZWZpbmUgTU9WUV9CRkUocmVnZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwY21wZXFkICUlIiNyZWdkIiwgJSUiI3JlZ2QiICAgXG5cdCIgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRiICAgJSUiI3JlZ2QiLCAlJSIjcmVnZCIgICBcblx0IiA6OikKKworI2RlZmluZSBQQVZHQlBfTU1YX05PX1JORChyZWdhLCByZWdiLCByZWdyLCAgcmVnYywgcmVnZCwgcmVncCkgICBcCisgICAgIm1vdnEgICIjcmVnYSIsICIjcmVnciIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgIiNyZWdjIiwgIiNyZWdwIiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYW5kICAiI3JlZ2IiLCAiI3JlZ3IiICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhbmQgICIjcmVnZCIsICIjcmVncCIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAgIiNyZWdhIiwgIiNyZWdiIiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJweG9yICAiI3JlZ2MiLCAiI3JlZ2QiICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhbmQgICAgJSVtbTYsICIjcmVnYiIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgICAlJW1tNiwgIiNyZWdkIiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3JscSAgICAgICQxLCAiI3JlZ2IiICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzcmxxICAgICAgJDEsICIjcmVnZCIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZGIgIiNyZWdiIiwgIiNyZWdyIiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkYiAiI3JlZ2QiLCAiI3JlZ3AiICAgICAgICAgICAgIFxuXHQiCisKKyNpZiBIQVZFXzZSRUdTCitzdGF0aWMgdm9pZCBwdXRfdnBfbm9fcm5kX3BpeGVsczhfbDJfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqYSwgY29uc3QgdWludDhfdCAqYiwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisvLyAgICBTVEFSVF9USU1FUgorICAgIE1PVlFfQkZFKG1tNik7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMSksICUlbW0wICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgKCUyKSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAoJTEsJTQpLCAlJW1tMiAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMiwlNCksICUlbW0zICAgICAgICAgIFxuXHQiCisgICAgICAgIFBBVkdCUF9NTVhfTk9fUk5EKCUlbW0wLCAlJW1tMSwgJSVtbTQsICAgJSVtbTIsICUlbW0zLCAlJW1tNSkKKyAgICAgICAgIm1vdnEgICAlJW1tNCwgKCUzKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICUlbW01LCAoJTMsJTQpICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgICAoJTEsJTQsMiksICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMiwlNCwyKSwgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgKCUxLCU1KSwgJSVtbTIgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAoJTIsJTUpLCAlJW1tMyAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICAgICglMSwlNCw0KSwgJTEgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgICAgKCUyLCU0LDQpLCAlMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUEFWR0JQX01NWF9OT19STkQoJSVtbTAsICUlbW0xLCAlJW1tNCwgICAlJW1tMiwgJSVtbTMsICUlbW01KQorICAgICAgICAibW92cSAgICUlbW00LCAoJTMsJTQsMikgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTUsICglMywlNSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAgICAoJTMsJTQsNCksICUzICAgICAgICAgICBcblx0IgorICAgICAgICAic3VibCAgICQ0LCAlMCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJqbnogICAgMWIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiIrciIoaCksICIrciIoYSksICIrciIoYiksICIrciIoZHN0KQorICAgICAgICA6InIiKCh4ODZfcmVnKXN0cmlkZSksICJyIigoeDg2X3JlZykzTCpzdHJpZGUpCisgICAgICAgIDoibWVtb3J5Iik7CisvLyAgICBTVE9QX1RJTUVSKCJwdXRfdnBfbm9fcm5kX3BpeGVsczhfbDJfbW14IikKK30KKyNlbmRpZiAvKkhBVkVfNlJFR1MgKi8KKyNlbmRpZiAvKiBIQVZFX01NWF9JTkxJTkUgKi8KKworYXZfY29sZCB2b2lkIGZmX3ZwM2RzcF9pbml0X3g4NihWUDNEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworI2lmIEhBVkVfNlJFR1MgJiYgSEFWRV9NTVhfSU5MSU5FCisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfbDIgPSBwdXRfdnBfbm9fcm5kX3BpeGVsczhfbDJfbW14OworI2VuZGlmIC8qIEhBVkVfNlJFR1MgJiYgSEFWRV9NTVhfSU5MSU5FICovCisKKyNpZiBBUkNIX1g4Nl8zMgorICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl92cDNfaWRjdF9wdXRfbW14OworICAgICAgICBjLT5pZGN0X2FkZCAgPSBmZl92cDNfaWRjdF9hZGRfbW14OworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmlkY3RfZGNfYWRkID0gZmZfdnAzX2lkY3RfZGNfYWRkX21teGV4dDsKKworICAgICAgICBpZiAoIShmbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpKSB7CisgICAgICAgICAgICBjLT52X2xvb3BfZmlsdGVyID0gZmZfdnAzX3ZfbG9vcF9maWx0ZXJfbW14ZXh0OworICAgICAgICAgICAgYy0+aF9sb29wX2ZpbHRlciA9IGZmX3ZwM19oX2xvb3BfZmlsdGVyX21teGV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+aWRjdF9wdXQgID0gZmZfdnAzX2lkY3RfcHV0X3NzZTI7CisgICAgICAgIGMtPmlkY3RfYWRkICA9IGZmX3ZwM19pZGN0X2FkZF9zc2UyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92cDU2X2FyaXRoLmggYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA1Nl9hcml0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMGNjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA1Nl9hcml0aC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qKgorICogVlA1IGFuZCBWUDYgY29tcGF0aWJsZSB2aWRlbyBkZWNvZGVyIChhcml0aCBkZWNvZGVyKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwICBFbGkgRnJpZWRtYW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1g4Nl9WUDU2X0FSSVRIX0gKKyNkZWZpbmUgQVZDT0RFQ19YODZfVlA1Nl9BUklUSF9ICisKKyNpZiBIQVZFX0lOTElORV9BU00gJiYgSEFWRV9GQVNUX0NNT1YgJiYgSEFWRV82UkVHUworI2RlZmluZSB2cDU2X3JhY19nZXRfcHJvYiB2cDU2X3JhY19nZXRfcHJvYgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHZwNTZfcmFjX2dldF9wcm9iKFZQNTZSYW5nZUNvZGVyICpjLCB1aW50OF90IHByb2IpCit7CisgICAgdW5zaWduZWQgaW50IGNvZGVfd29yZCA9IHZwNTZfcmFjX3Jlbm9ybShjKTsKKyAgICB1bnNpZ25lZCBpbnQgbG93ID0gMSArICgoKGMtPmhpZ2ggLSAxKSAqIHByb2IpID4+IDgpOworICAgIHVuc2lnbmVkIGludCBsb3dfc2hpZnQgPSBsb3cgPDwgMTY7CisgICAgaW50IGJpdCA9IDA7CisgICAgYy0+Y29kZV93b3JkID0gY29kZV93b3JkOworCisgICAgX19hc21fXygKKyAgICAgICAgInN1YmwgICU0LCAlMSAgICAgIFxuXHQiCisgICAgICAgICJzdWJsICAlMywgJTIgICAgICBcblx0IgorICAgICAgICAic2V0YWUgJWIwICAgICAgICAgXG5cdCIKKyAgICAgICAgImNtb3ZiICU0LCAlMSAgICAgIFxuXHQiCisgICAgICAgICJjbW92YiAlNSwgJTIgICAgICBcblx0IgorICAgICAgICA6ICIrcSIoYml0KSwgIismciIoYy0+aGlnaCksICIrJnIiKGMtPmNvZGVfd29yZCkKKyAgICAgICAgOiAiciIobG93X3NoaWZ0KSwgInIiKGxvdyksICJyIihjb2RlX3dvcmQpCisgICAgKTsKKworICAgIHJldHVybiBiaXQ7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFWQ09ERUNfWDg2X1ZQNTZfQVJJVEhfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwNmRzcC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA2ZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDg3NGVhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwNmRzcC5hc20KQEAgLTAsMCArMSwxNzAgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIE1NWC9TU0UyLW9wdGltaXplZCBmdW5jdGlvbnMgZm9yIHRoZSBWUDYgZGVjb2RlcgorOyogQ29weXJpZ2h0IChDKSAyMDA5ICBTZWJhc3RpZW4gTHVjYXMgPHNlYmFzdGllbi5sdWNhc0BnbWFpbC5jb20+Cis7KiBDb3B5cmlnaHQgKEMpIDIwMDkgIFp1eHkgTWVuZyA8enV4eS5tZW5nQGdtYWlsLmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitjZXh0ZXJuIHB3XzY0CisKK1NFQ1RJT04gLnRleHQKKworJW1hY3JvIERJQUc0IDYKKyVpZiBtbXNpemUgPT0gOAorICAgIG1vdnEgICAgICAgICAgbTAsIFslMSslMl0KKyAgICBtb3ZxICAgICAgICAgIG0xLCBbJTErJTNdCisgICAgbW92cSAgICAgICAgICBtMywgbTAKKyAgICBtb3ZxICAgICAgICAgIG00LCBtMQorICAgIHB1bnBja2xidyAgICAgbTAsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMSwgbTcKKyAgICBwdW5wY2toYncgICAgIG0zLCBtNworICAgIHB1bnBja2hidyAgICAgbTQsIG03CisgICAgcG11bGx3ICAgICAgICBtMCwgW3JzcCs4KjExXSA7IHNyY1t4LTggXSAqIGJpd2VpZ2h0IFswXQorICAgIHBtdWxsdyAgICAgICAgbTEsIFtyc3ArOCoxMl0gOyBzcmNbeCAgIF0gKiBiaXdlaWdodCBbMV0KKyAgICBwbXVsbHcgICAgICAgIG0zLCBbcnNwKzgqMTFdIDsgc3JjW3gtOCBdICogYml3ZWlnaHQgWzBdCisgICAgcG11bGx3ICAgICAgICBtNCwgW3JzcCs4KjEyXSA7IHNyY1t4ICAgXSAqIGJpd2VpZ2h0IFsxXQorICAgIHBhZGR3ICAgICAgICAgbTAsIG0xCisgICAgcGFkZHcgICAgICAgICBtMywgbTQKKyAgICBtb3ZxICAgICAgICAgIG0xLCBbJTErJTRdCisgICAgbW92cSAgICAgICAgICBtMiwgWyUxKyU1XQorICAgIG1vdnEgICAgICAgICAgbTQsIG0xCisgICAgbW92cSAgICAgICAgICBtNSwgbTIKKyAgICBwdW5wY2tsYncgICAgIG0xLCBtNworICAgIHB1bnBja2xidyAgICAgbTIsIG03CisgICAgcHVucGNraGJ3ICAgICBtNCwgbTcKKyAgICBwdW5wY2toYncgICAgIG01LCBtNworICAgIHBtdWxsdyAgICAgICAgbTEsIFtyc3ArOCoxM10gOyBzcmNbeCs4IF0gKiBiaXdlaWdodCBbMl0KKyAgICBwbXVsbHcgICAgICAgIG0yLCBbcnNwKzgqMTRdIDsgc3JjW3grMTZdICogYml3ZWlnaHQgWzNdCisgICAgcG11bGx3ICAgICAgICBtNCwgW3JzcCs4KjEzXSA7IHNyY1t4KzggXSAqIGJpd2VpZ2h0IFsyXQorICAgIHBtdWxsdyAgICAgICAgbTUsIFtyc3ArOCoxNF0gOyBzcmNbeCsxNl0gKiBiaXdlaWdodCBbM10KKyAgICBwYWRkdyAgICAgICAgIG0xLCBtMgorICAgIHBhZGR3ICAgICAgICAgbTQsIG01CisgICAgcGFkZHN3ICAgICAgICBtMCwgbTEKKyAgICBwYWRkc3cgICAgICAgIG0zLCBtNAorICAgIHBhZGRzdyAgICAgICAgbTAsIG02ICAgICAgICAgOyBBZGQgNjQKKyAgICBwYWRkc3cgICAgICAgIG0zLCBtNiAgICAgICAgIDsgQWRkIDY0CisgICAgcHNyYXcgICAgICAgICBtMCwgNworICAgIHBzcmF3ICAgICAgICAgbTMsIDcKKyAgICBwYWNrdXN3YiAgICAgIG0wLCBtMworICAgIG1vdnEgICAgICAgIFslNl0sIG0wCislZWxzZSA7IG1tc2l6ZSA9PSAxNgorICAgIG1vdnEgICAgICAgICAgbTAsIFslMSslMl0KKyAgICBtb3ZxICAgICAgICAgIG0xLCBbJTErJTNdCisgICAgcHVucGNrbGJ3ICAgICBtMCwgbTcKKyAgICBwdW5wY2tsYncgICAgIG0xLCBtNworICAgIHBtdWxsdyAgICAgICAgbTAsIG00ICAgICAgICAgOyBzcmNbeC04IF0gKiBiaXdlaWdodCBbMF0KKyAgICBwbXVsbHcgICAgICAgIG0xLCBtNSAgICAgICAgIDsgc3JjW3ggICBdICogYml3ZWlnaHQgWzFdCisgICAgcGFkZHcgICAgICAgICBtMCwgbTEKKyAgICBtb3ZxICAgICAgICAgIG0xLCBbJTErJTRdCisgICAgbW92cSAgICAgICAgICBtMiwgWyUxKyU1XQorICAgIHB1bnBja2xidyAgICAgbTEsIG03CisgICAgcHVucGNrbGJ3ICAgICBtMiwgbTcKKyAgICBwbXVsbHcgICAgICAgIG0xLCBtNiAgICAgICAgIDsgc3JjW3grOCBdICogYml3ZWlnaHQgWzJdCisgICAgcG11bGx3ICAgICAgICBtMiwgbTMgICAgICAgICA7IHNyY1t4KzE2XSAqIGJpd2VpZ2h0IFszXQorICAgIHBhZGR3ICAgICAgICAgbTEsIG0yCisgICAgcGFkZHN3ICAgICAgICBtMCwgbTEKKyAgICBwYWRkc3cgICAgICAgIG0wLCBbcHdfNjRdICAgIDsgQWRkIDY0CisgICAgcHNyYXcgICAgICAgICBtMCwgNworICAgIHBhY2t1c3diICAgICAgbTAsIG0wCisgICAgbW92cSAgICAgICAgWyU2XSwgbTAKKyVlbmRpZiA7IG1tc2l6ZSA9PSA4LzE2CislZW5kbWFjcm8KKworJW1hY3JvIFNQTEFUNFJFR1MgMAorJWlmIG1tc2l6ZSA9PSA4CisgICAgbW92cSAgICAgICAgIG01LCBtMworICAgIHB1bnBja2x3ZCAgICBtMywgbTMKKyAgICBtb3ZxICAgICAgICAgbTQsIG0zCisgICAgcHVucGNrbGRxICAgIG0zLCBtMworICAgIHB1bnBja2hkcSAgICBtNCwgbTQKKyAgICBwdW5wY2tod2QgICAgbTUsIG01CisgICAgbW92cSAgICAgICAgIG0yLCBtNQorICAgIHB1bnBja2hkcSAgICBtMiwgbTIKKyAgICBwdW5wY2tsZHEgICAgbTUsIG01CisgICAgbW92cSBbcnNwKzgqMTFdLCBtMworICAgIG1vdnEgW3JzcCs4KjEyXSwgbTQKKyAgICBtb3ZxIFtyc3ArOCoxM10sIG01CisgICAgbW92cSBbcnNwKzgqMTRdLCBtMgorJWVsc2UgOyBtbXNpemUgPT0gMTYKKyAgICBwc2h1Zmx3ICAgICAgbTQsIG0zLCAweDAKKyAgICBwc2h1Zmx3ICAgICAgbTUsIG0zLCAweDU1CisgICAgcHNodWZsdyAgICAgIG02LCBtMywgMHhBQQorICAgIHBzaHVmbHcgICAgICBtMywgbTMsIDB4RkYKKyAgICBwdW5wY2tscWRxICAgbTQsIG00CisgICAgcHVucGNrbHFkcSAgIG01LCBtNQorICAgIHB1bnBja2xxZHEgICBtNiwgbTYKKyAgICBwdW5wY2tscWRxICAgbTMsIG0zCislZW5kaWYgOyBtbXNpemUgPT0gOC8xNgorJWVuZG1hY3JvCisKKyVtYWNybyB2cDZfZmlsdGVyX2RpYWc0IDAKKzsgdm9pZCBmZl92cDZfZmlsdGVyX2RpYWc0XzxvcHQ+KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBoX3dlaWdodFs0XSwgY29uc3QgaW50MTZfdCB2X3dlaWdodHNbNF0pCitjZ2xvYmFsIHZwNl9maWx0ZXJfZGlhZzQsIDUsIDcsIDgKKyAgICBtb3YgICAgICAgICAgcjUsIHJzcCAgICAgICAgIDsgYmFja3VwIHN0YWNrIHBvaW50ZXIKKyAgICBhbmQgICAgICAgICByc3AsIH4obW1zaXplLTEpIDsgYWxpZ24gc3RhY2sKKyVpZiBtbXNpemUgPT0gMTYKKyAgICBzdWIgICAgICAgICByc3AsIDgqMTEKKyVlbHNlCisgICAgc3ViICAgICAgICAgcnNwLCA4KjE1CisgICAgbW92cSAgICAgICAgIG02LCBbcHdfNjRdCislZW5kaWYKKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdnN4ZCAgICAgICByMiwgcjJkCislZW5kaWYKKworICAgIHN1YiAgICAgICAgICByMSwgcjIKKworICAgIHB4b3IgICAgICAgICBtNywgbTcKKyAgICBtb3ZxICAgICAgICAgbTMsIFtyM10KKyAgICBTUExBVDRSRUdTCisKKyAgICBtb3YgICAgICAgICAgcjMsIHJzcAorICAgIG1vdiAgICAgICAgICByNiwgMTEKKy5uZXh0cm93OgorICAgIERJQUc0ICAgICAgICByMSwgLTEsIDAsIDEsIDIsIHIzCisgICAgYWRkICAgICAgICAgIHIzLCA4CisgICAgYWRkICAgICAgICAgIHIxLCByMgorICAgIGRlYyAgICAgICAgICByNgorICAgIGpueiAubmV4dHJvdworCisgICAgbW92cSAgICAgICAgIG0zLCBbcjRdCisgICAgU1BMQVQ0UkVHUworCisgICAgbGVhICAgICAgICAgIHIzLCBbcnNwKzhdCisgICAgbW92ICAgICAgICAgIHI2LCA4CisubmV4dGNvbDoKKyAgICBESUFHNCAgICAgICAgcjMsIC04LCAwLCA4LCAxNiwgcjAKKyAgICBhZGQgICAgICAgICAgcjMsIDgKKyAgICBhZGQgICAgICAgICAgcjAsIHIyCisgICAgZGVjICAgICAgICAgIHI2CisgICAgam56IC5uZXh0Y29sCisKKyAgICBtb3YgICAgICAgICByc3AsIHI1ICAgICAgICAgIDsgcmVzdG9yZSBzdGFjayBwb2ludGVyCisgICAgUkVUCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzMyCitJTklUX01NWCBtbXgKK3ZwNl9maWx0ZXJfZGlhZzQKKyVlbmRpZgorCitJTklUX1hNTSBzc2UyCit2cDZfZmlsdGVyX2RpYWc0CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA2ZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92cDZkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmFlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA2ZHNwX2luaXQuYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogVlA2IE1NWC9TU0UyIG9wdGltaXphdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU2ViYXN0aWVuIEx1Y2FzIDxzZWJhc3RpZW4ubHVjYXNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBadXh5IE1lbmcgPHp1eHkubWVuZ0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92cDU2ZHNwLmgiCisKK3ZvaWQgZmZfdnA2X2ZpbHRlcl9kaWFnNF9tbXgodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmhfd2VpZ2h0cyxjb25zdCBpbnQxNl90ICp2X3dlaWdodHMpOwordm9pZCBmZl92cDZfZmlsdGVyX2RpYWc0X3NzZTIodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpoX3dlaWdodHMsY29uc3QgaW50MTZfdCAqdl93ZWlnaHRzKTsKKworYXZfY29sZCB2b2lkIGZmX3ZwNmRzcF9pbml0X3g4NihWUDU2RFNQQ29udGV4dCogYywgZW51bSBBVkNvZGVjSUQgY29kZWMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworI2lmIEFSQ0hfWDg2XzMyCisgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnZwNl9maWx0ZXJfZGlhZzQgPSBmZl92cDZfZmlsdGVyX2RpYWc0X21teDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnZwNl9maWx0ZXJfZGlhZzQgPSBmZl92cDZfZmlsdGVyX2RpYWc0X3NzZTI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwOGRzcC5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA4ZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzhiM2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwOGRzcC5hc20KQEAgLTAsMCArMSwxMjI1IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBWUDggTU1YRVhUIG9wdGltaXphdGlvbnMKKzsqIENvcHlyaWdodCAoYykgMjAxMCBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+Cis7KiBDb3B5cmlnaHQgKGMpIDIwMTAgRmlvbmEgR2xhc2VyIDxmaW9uYUB4MjY0LmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorCitmb3VydGFwX2ZpbHRlcl9od19tOiB0aW1lcyA0IGR3ICAtNiwgMTIzCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICAxMiwgIC0xCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICAtOSwgIDkzCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICA1MCwgIC02CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICAtNiwgIDUwCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICA5MywgIC05CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3ICAtMSwgIDEyCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA0IGR3IDEyMywgIC02CisKK3NpeHRhcF9maWx0ZXJfaHdfbTogIHRpbWVzIDQgZHcgICAyLCAtMTEKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgMTA4LCAgMzYKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgIC04LCAgIDEKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgICAzLCAtMTYKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgIDc3LCAgNzcKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgLTE2LCAgIDMKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgICAxLCAgLTgKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgIDM2LCAxMDgKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDQgZHcgLTExLCAgIDIKKworZm91cnRhcF9maWx0ZXJfaGJfbTogdGltZXMgOCBkYiAgLTYsIDEyMworICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiAgMTIsICAtMQorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiAgLTksICA5MworICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiAgNTAsICAtNgorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiAgLTYsICA1MAorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiAgOTMsICAtOQorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiAgLTEsICAxMgorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiAxMjMsICAtNgorCitzaXh0YXBfZmlsdGVyX2hiX206ICB0aW1lcyA4IGRiICAgMiwgICAxCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGRiIC0xMSwgMTA4CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGRiICAzNiwgIC04CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGRiICAgMywgICAzCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGRiIC0xNiwgIDc3CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGRiICA3NywgLTE2CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGRiICAgMSwgICAyCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGRiICAtOCwgIDM2CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGRiIDEwOCwgLTExCisKK2ZvdXJ0YXBfZmlsdGVyX3ZfbTogIHRpbWVzIDggZHcgIC02CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3IDEyMworICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgMTIKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgIC0xCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3ICAtOQorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgOTMKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgIDUwCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3ICAtNgorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgLTYKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgIDUwCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3ICA5MworICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgLTkKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgIC0xCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3ICAxMgorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAxMjMKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgIC02CisKK3NpeHRhcF9maWx0ZXJfdl9tOiAgIHRpbWVzIDggZHcgICAyCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3IC0xMQorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAxMDgKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgIDM2CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3ICAtOAorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgIDEKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgICAzCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3IC0xNgorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgNzcKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgIDc3CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3IC0xNgorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgIDMKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgICAxCisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3ICAtOAorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgMzYKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgMTA4CisgICAgICAgICAgICAgICAgICAgICB0aW1lcyA4IGR3IC0xMQorICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkdyAgIDIKKworYmlsaW5lYXJfZmlsdGVyX3Z3X206IHRpbWVzIDggZHcgMQorICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgMgorICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgMworICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgNAorICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgNQorICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgNgorICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIDggZHcgNworCitiaWxpbmVhcl9maWx0ZXJfdmJfbTogdGltZXMgOCBkYiA3LCAxCisgICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiA2LCAyCisgICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiA1LCAzCisgICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiA0LCA0CisgICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiAzLCA1CisgICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiAyLCA2CisgICAgICAgICAgICAgICAgICAgICAgdGltZXMgOCBkYiAxLCA3CisKKyVpZmRlZiBQSUMKKyVkZWZpbmUgZm91cnRhcF9maWx0ZXJfaHcgIHBpY3JlZ3EKKyVkZWZpbmUgc2l4dGFwX2ZpbHRlcl9odyAgIHBpY3JlZ3EKKyVkZWZpbmUgZm91cnRhcF9maWx0ZXJfaGIgIHBpY3JlZ3EKKyVkZWZpbmUgc2l4dGFwX2ZpbHRlcl9oYiAgIHBpY3JlZ3EKKyVkZWZpbmUgZm91cnRhcF9maWx0ZXJfdiAgIHBpY3JlZ3EKKyVkZWZpbmUgc2l4dGFwX2ZpbHRlcl92ICAgIHBpY3JlZ3EKKyVkZWZpbmUgYmlsaW5lYXJfZmlsdGVyX3Z3IHBpY3JlZ3EKKyVkZWZpbmUgYmlsaW5lYXJfZmlsdGVyX3ZiIHBpY3JlZ3EKKyVkZWZpbmUgbnBpY3JlZ3MgMQorJWVsc2UKKyVkZWZpbmUgZm91cnRhcF9maWx0ZXJfaHcgIGZvdXJ0YXBfZmlsdGVyX2h3X20KKyVkZWZpbmUgc2l4dGFwX2ZpbHRlcl9odyAgIHNpeHRhcF9maWx0ZXJfaHdfbQorJWRlZmluZSBmb3VydGFwX2ZpbHRlcl9oYiAgZm91cnRhcF9maWx0ZXJfaGJfbQorJWRlZmluZSBzaXh0YXBfZmlsdGVyX2hiICAgc2l4dGFwX2ZpbHRlcl9oYl9tCislZGVmaW5lIGZvdXJ0YXBfZmlsdGVyX3YgICBmb3VydGFwX2ZpbHRlcl92X20KKyVkZWZpbmUgc2l4dGFwX2ZpbHRlcl92ICAgIHNpeHRhcF9maWx0ZXJfdl9tCislZGVmaW5lIGJpbGluZWFyX2ZpbHRlcl92dyBiaWxpbmVhcl9maWx0ZXJfdndfbQorJWRlZmluZSBiaWxpbmVhcl9maWx0ZXJfdmIgYmlsaW5lYXJfZmlsdGVyX3ZiX20KKyVkZWZpbmUgbnBpY3JlZ3MgMAorJWVuZGlmCisKK2ZpbHRlcl9oMl9zaHVmOiAgZGIgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgIDYsIDYsICA3LCAgNywgIDgKK2ZpbHRlcl9oNF9zaHVmOiAgZGIgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgIDgsIDgsICA5LCAgOSwgMTAKKworZmlsdGVyX2g2X3NodWYxOiBkYiAwLCA1LCAxLCA2LCAyLCA3LCAzLCA4LCA0LCA5LCA1LCAxMCwgNiwgMTEsICA3LCAxMgorZmlsdGVyX2g2X3NodWYyOiBkYiAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCAgNywgNywgIDgsICA4LCAgOQorZmlsdGVyX2g2X3NodWYzOiBkYiAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4LCA4LCAgOSwgOSwgMTAsIDEwLCAxMQorCitwd18yMDA5MTogdGltZXMgNCBkdyAyMDA5MQorcHdfMTc3MzQ6IHRpbWVzIDQgZHcgMTc3MzQKKworY2V4dGVybiBwd18zCitjZXh0ZXJuIHB3XzQKK2NleHRlcm4gcHdfNjQKK2NleHRlcm4gcHdfMjU2CisKK1NFQ1RJT04gLnRleHQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgc3VicGVsIE1DIGZ1bmN0aW9uczoKKzsKKzsgdm9pZCBmZl9wdXRfdnA4X2VwZWw8c2l6ZT5faDxodGFwPnY8dnRhcD5fPG9wdD4odWludDhfdCAqZHN0LCBpbnQgZGVzdHN0cmlkZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBpbnQgc3Jjc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCAgIGludCBteCwgaW50IG15KTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBGSUxURVJfU1NTRTMgMQorY2dsb2JhbCBwdXRfdnA4X2VwZWwlMV9oNiwgNiwgNiArIG5waWNyZWdzLCA4LCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgbXgsIHBpY3JlZworICAgIGxlYSAgICAgIG14ZCwgW214cSozXQorICAgIG1vdmEgICAgICBtMywgW2ZpbHRlcl9oNl9zaHVmMl0KKyAgICBtb3ZhICAgICAgbTQsIFtmaWx0ZXJfaDZfc2h1ZjNdCislaWZkZWYgUElDCisgICAgbGVhICBwaWNyZWdxLCBbc2l4dGFwX2ZpbHRlcl9oYl9tXQorJWVuZGlmCisgICAgbW92YSAgICAgIG01LCBbc2l4dGFwX2ZpbHRlcl9oYitteHEqOC00OF0gOyBzZXQgdXAgNnRhcCBmaWx0ZXIgaW4gYnl0ZXMKKyAgICBtb3ZhICAgICAgbTYsIFtzaXh0YXBfZmlsdGVyX2hiK214cSo4LTMyXQorICAgIG1vdmEgICAgICBtNywgW3NpeHRhcF9maWx0ZXJfaGIrbXhxKjgtMTZdCisKKy5uZXh0cm93OgorICAgIG1vdnUgICAgICBtMCwgW3NyY3EtMl0KKyAgICBtb3ZhICAgICAgbTEsIG0wCisgICAgbW92YSAgICAgIG0yLCBtMAorJWlmIG1tc2l6ZSA9PSA4Cis7IEZvciBlcGVsNCwgd2UgbmVlZCA5IGJ5dGVzLCBidXQgb25seSA4IGdldCBsb2FkZWQ7IHRvIGNvbXBlbnNhdGUsIGRvIHRoZQorOyBzaHVmZmxlIHdpdGggYSBtZW1vcnkgb3BlcmFuZAorICAgIHB1bnBja2xidyBtMCwgW3NyY3ErM10KKyVlbHNlCisgICAgcHNodWZiICAgIG0wLCBbZmlsdGVyX2g2X3NodWYxXQorJWVuZGlmCisgICAgcHNodWZiICAgIG0xLCBtMworICAgIHBzaHVmYiAgICBtMiwgbTQKKyAgICBwbWFkZHVic3cgbTAsIG01CisgICAgcG1hZGR1YnN3IG0xLCBtNgorICAgIHBtYWRkdWJzdyBtMiwgbTcKKyAgICBwYWRkc3cgICAgbTAsIG0xCisgICAgcGFkZHN3ICAgIG0wLCBtMgorICAgIHBtdWxocnN3ICBtMCwgW3B3XzI1Nl0KKyAgICBwYWNrdXN3YiAgbTAsIG0wCisgICAgbW92aCAgW2RzdHFdLCBtMCAgICAgICAgOyBzdG9yZQorCisgICAgOyBnbyB0byBuZXh0IGxpbmUKKyAgICBhZGQgICAgIGRzdHEsIGRzdHN0cmlkZXEKKyAgICBhZGQgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBkZWMgIGhlaWdodGQgICAgICAgICAgICA7IG5leHQgcm93CisgICAgamcgLm5leHRyb3cKKyAgICBSRVBfUkVUCisKK2NnbG9iYWwgcHV0X3ZwOF9lcGVsJTFfaDQsIDYsIDYgKyBucGljcmVncywgNywgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCBwaWNyZWcKKyAgICBzaGwgICAgICBteGQsIDQKKyAgICBtb3ZhICAgICAgbTIsIFtwd18yNTZdCisgICAgbW92YSAgICAgIG0zLCBbZmlsdGVyX2gyX3NodWZdCisgICAgbW92YSAgICAgIG00LCBbZmlsdGVyX2g0X3NodWZdCislaWZkZWYgUElDCisgICAgbGVhICBwaWNyZWdxLCBbZm91cnRhcF9maWx0ZXJfaGJfbV0KKyVlbmRpZgorICAgIG1vdmEgICAgICBtNSwgW2ZvdXJ0YXBfZmlsdGVyX2hiK214cS0xNl0gOyBzZXQgdXAgNHRhcCBmaWx0ZXIgaW4gYnl0ZXMKKyAgICBtb3ZhICAgICAgbTYsIFtmb3VydGFwX2ZpbHRlcl9oYitteHFdCisKKy5uZXh0cm93OgorICAgIG1vdnUgICAgICBtMCwgW3NyY3EtMV0KKyAgICBtb3ZhICAgICAgbTEsIG0wCisgICAgcHNodWZiICAgIG0wLCBtMworICAgIHBzaHVmYiAgICBtMSwgbTQKKyAgICBwbWFkZHVic3cgbTAsIG01CisgICAgcG1hZGR1YnN3IG0xLCBtNgorICAgIHBhZGRzdyAgICBtMCwgbTEKKyAgICBwbXVsaHJzdyAgbTAsIG0yCisgICAgcGFja3Vzd2IgIG0wLCBtMAorICAgIG1vdmggIFtkc3RxXSwgbTAgICAgICAgIDsgc3RvcmUKKworICAgIDsgZ28gdG8gbmV4dCBsaW5lCisgICAgYWRkICAgICBkc3RxLCBkc3RzdHJpZGVxCisgICAgYWRkICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgZGVjICBoZWlnaHRkICAgICAgICAgICAgOyBuZXh0IHJvdworICAgIGpnIC5uZXh0cm93CisgICAgUkVQX1JFVAorCitjZ2xvYmFsIHB1dF92cDhfZXBlbCUxX3Y0LCA3LCA3LCA4LCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgcGljcmVnLCBteQorICAgIHNobCAgICAgIG15ZCwgNAorJWlmZGVmIFBJQworICAgIGxlYSAgcGljcmVncSwgW2ZvdXJ0YXBfZmlsdGVyX2hiX21dCislZW5kaWYKKyAgICBtb3ZhICAgICAgbTUsIFtmb3VydGFwX2ZpbHRlcl9oYitteXEtMTZdCisgICAgbW92YSAgICAgIG02LCBbZm91cnRhcF9maWx0ZXJfaGIrbXlxXQorICAgIG1vdmEgICAgICBtNywgW3B3XzI1Nl0KKworICAgIDsgcmVhZCAzIGxpbmVzCisgICAgc3ViICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgbW92aCAgICAgIG0wLCBbc3JjcV0KKyAgICBtb3ZoICAgICAgbTEsIFtzcmNxKyAgc3Jjc3RyaWRlcV0KKyAgICBtb3ZoICAgICAgbTIsIFtzcmNxKzIqc3Jjc3RyaWRlcV0KKyAgICBhZGQgICAgIHNyY3EsIHNyY3N0cmlkZXEKKworLm5leHRyb3c6CisgICAgbW92aCAgICAgIG0zLCBbc3JjcSsyKnNyY3N0cmlkZXFdICAgICAgOyByZWFkIG5ldyByb3cKKyAgICBtb3ZhICAgICAgbTQsIG0wCisgICAgbW92YSAgICAgIG0wLCBtMQorICAgIHB1bnBja2xidyBtNCwgbTEKKyAgICBtb3ZhICAgICAgbTEsIG0yCisgICAgcHVucGNrbGJ3IG0yLCBtMworICAgIHBtYWRkdWJzdyBtNCwgbTUKKyAgICBwbWFkZHVic3cgbTIsIG02CisgICAgcGFkZHN3ICAgIG00LCBtMgorICAgIG1vdmEgICAgICBtMiwgbTMKKyAgICBwbXVsaHJzdyAgbTQsIG03CisgICAgcGFja3Vzd2IgIG00LCBtNAorICAgIG1vdmggIFtkc3RxXSwgbTQKKworICAgIDsgZ28gdG8gbmV4dCBsaW5lCisgICAgYWRkICAgICAgZHN0cSwgZHN0c3RyaWRlcQorICAgIGFkZCAgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBkZWMgICBoZWlnaHRkICAgICAgICAgICAgICAgICAgICAgICAgICA7IG5leHQgcm93CisgICAgamcgLm5leHRyb3cKKyAgICBSRVBfUkVUCisKK2NnbG9iYWwgcHV0X3ZwOF9lcGVsJTFfdjYsIDcsIDcsIDgsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCBwaWNyZWcsIG15CisgICAgbGVhICAgICAgbXlkLCBbbXlxKjNdCislaWZkZWYgUElDCisgICAgbGVhICBwaWNyZWdxLCBbc2l4dGFwX2ZpbHRlcl9oYl9tXQorJWVuZGlmCisgICAgbGVhICAgICAgbXlxLCBbc2l4dGFwX2ZpbHRlcl9oYitteXEqOF0KKworICAgIDsgcmVhZCA1IGxpbmVzCisgICAgc3ViICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgc3ViICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgbW92aCAgICAgIG0wLCBbc3JjcV0KKyAgICBtb3ZoICAgICAgbTEsIFtzcmNxK3NyY3N0cmlkZXFdCisgICAgbW92aCAgICAgIG0yLCBbc3JjcStzcmNzdHJpZGVxKjJdCisgICAgbGVhICAgICBzcmNxLCBbc3JjcStzcmNzdHJpZGVxKjJdCisgICAgYWRkICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgbW92aCAgICAgIG0zLCBbc3JjcV0KKyAgICBtb3ZoICAgICAgbTQsIFtzcmNxK3NyY3N0cmlkZXFdCisKKy5uZXh0cm93OgorICAgIG1vdmggICAgICBtNSwgW3NyY3ErMipzcmNzdHJpZGVxXSAgICAgIDsgcmVhZCBuZXcgcm93CisgICAgbW92YSAgICAgIG02LCBtMAorICAgIHB1bnBja2xidyBtNiwgbTUKKyAgICBtb3ZhICAgICAgbTAsIG0xCisgICAgcHVucGNrbGJ3IG0xLCBtMgorICAgIG1vdmEgICAgICBtNywgbTMKKyAgICBwdW5wY2tsYncgbTcsIG00CisgICAgcG1hZGR1YnN3IG02LCBbbXlxLTQ4XQorICAgIHBtYWRkdWJzdyBtMSwgW215cS0zMl0KKyAgICBwbWFkZHVic3cgbTcsIFtteXEtMTZdCisgICAgcGFkZHN3ICAgIG02LCBtMQorICAgIHBhZGRzdyAgICBtNiwgbTcKKyAgICBtb3ZhICAgICAgbTEsIG0yCisgICAgbW92YSAgICAgIG0yLCBtMworICAgIHBtdWxocnN3ICBtNiwgW3B3XzI1Nl0KKyAgICBtb3ZhICAgICAgbTMsIG00CisgICAgcGFja3Vzd2IgIG02LCBtNgorICAgIG1vdmEgICAgICBtNCwgbTUKKyAgICBtb3ZoICBbZHN0cV0sIG02CisKKyAgICA7IGdvIHRvIG5leHQgbGluZQorICAgIGFkZCAgICAgIGRzdHEsIGRzdHN0cmlkZXEKKyAgICBhZGQgICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgZGVjICAgaGVpZ2h0ZCAgICAgICAgICAgICAgICAgICAgICAgICAgOyBuZXh0IHJvdworICAgIGpnIC5uZXh0cm93CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIHNzc2UzCitGSUxURVJfU1NTRTMgNAorSU5JVF9YTU0gc3NzZTMKK0ZJTFRFUl9TU1NFMyA4CisKKzsgNHg0IGJsb2NrLCBILW9ubHkgNC10YXAgZmlsdGVyCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgcHV0X3ZwOF9lcGVsNF9oNCwgNiwgNiArIG5waWNyZWdzLCAwLCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgbXgsIHBpY3JlZworICAgIHNobCAgICAgICBteGQsIDQKKyVpZmRlZiBQSUMKKyAgICBsZWEgICBwaWNyZWdxLCBbZm91cnRhcF9maWx0ZXJfaHdfbV0KKyVlbmRpZgorICAgIG1vdnEgICAgICBtbTQsIFtmb3VydGFwX2ZpbHRlcl9odytteHEtMTZdIDsgc2V0IHVwIDR0YXAgZmlsdGVyIGluIHdvcmRzCisgICAgbW92cSAgICAgIG1tNSwgW2ZvdXJ0YXBfZmlsdGVyX2h3K214cV0KKyAgICBtb3ZxICAgICAgbW03LCBbcHdfNjRdCisgICAgcHhvciAgICAgIG1tNiwgbW02CisKKy5uZXh0cm93OgorICAgIG1vdnEgICAgICBtbTEsIFtzcmNxLTFdICAgICAgICAgICAgICAgIDsgKEFCQ0RFRkdIKSBsb2FkIDggaG9yaXpvbnRhbCBwaXhlbHMKKworICAgIDsgZmlyc3Qgc2V0IG9mIDIgcGl4ZWxzCisgICAgbW92cSAgICAgIG1tMiwgbW0xICAgICAgICAgICAgICAgICAgICAgOyBieXRlIEFCQ0QuLgorICAgIHB1bnBja2xidyBtbTEsIG1tNiAgICAgICAgICAgICAgICAgICAgIDsgYnl0ZS0+d29yZCBBQkNECisgICAgcHNodWZ3ICAgIG1tMCwgbW0yLCA5ICAgICAgICAgICAgICAgICAgOyBieXRlIENERUYuLgorICAgIHB1bnBja2xidyBtbTAsIG1tNiAgICAgICAgICAgICAgICAgICAgIDsgYnl0ZS0+d29yZCBDREVGCisgICAgcHNodWZ3ICAgIG1tMywgbW0xLCAweDk0ICAgICAgICAgICAgICAgOyB3b3JkIEFCQkMKKyAgICBwc2h1ZncgICAgbW0xLCBtbTAsIDB4OTQgICAgICAgICAgICAgICA7IHdvcmQgQ0RERQorICAgIHBtYWRkd2QgICBtbTMsIG1tNCAgICAgICAgICAgICAgICAgICAgIDsgbXVsdGlwbHkgMnB4IHdpdGggRjAvRjEKKyAgICBtb3ZxICAgICAgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgICA7IGJhY2t1cCBmb3Igc2Vjb25kIHNldCBvZiBwaXhlbHMKKyAgICBwbWFkZHdkICAgbW0xLCBtbTUgICAgICAgICAgICAgICAgICAgICA7IG11bHRpcGx5IDJweCB3aXRoIEYyL0YzCisgICAgcGFkZGQgICAgIG1tMywgbW0xICAgICAgICAgICAgICAgICAgICAgOyBmaW5pc2ggMXN0IDJweAorCisgICAgOyBzZWNvbmQgc2V0IG9mIDIgcGl4ZWxzLCB1c2UgYmFja3VwIG9mIGFib3ZlCisgICAgcHVucGNraGJ3IG1tMiwgbW02ICAgICAgICAgICAgICAgICAgICAgOyBieXRlLT53b3JkIEVGR0gKKyAgICBwbWFkZHdkICAgbW0wLCBtbTQgICAgICAgICAgICAgICAgICAgICA7IG11bHRpcGx5IGJhY2tlZCB1cCAycHggd2l0aCBGMC9GMQorICAgIHBzaHVmdyAgICBtbTEsIG1tMiwgMHg5NCAgICAgICAgICAgICAgIDsgd29yZCBFRkZHCisgICAgcG1hZGR3ZCAgIG1tMSwgbW01ICAgICAgICAgICAgICAgICAgICAgOyBtdWx0aXBseSAycHggd2l0aCBGMi9GMworICAgIHBhZGRkICAgICBtbTAsIG1tMSAgICAgICAgICAgICAgICAgICAgIDsgZmluaXNoIDJuZCAycHgKKworICAgIDsgbWVyZ2UgdHdvIHNldHMgb2YgMiBwaXhlbHMgaW50byBvbmUgc2V0IG9mIDQsIHJvdW5kL2NsaXAvc3RvcmUKKyAgICBwYWNrc3NkdyAgbW0zLCBtbTAgICAgICAgICAgICAgICAgICAgICA7IG1lcmdlIGR3b3JkLT53b3JkICg0cHgpCisgICAgcGFkZHN3ICAgIG1tMywgbW03ICAgICAgICAgICAgICAgICAgICAgOyByb3VuZGluZworICAgIHBzcmF3ICAgICBtbTMsIDcKKyAgICBwYWNrdXN3YiAgbW0zLCBtbTYgICAgICAgICAgICAgICAgICAgICA7IGNsaXAgYW5kIHdvcmQtPmJ5dGVzCisgICAgbW92ZCAgIFtkc3RxXSwgbW0zICAgICAgICAgICAgICAgICAgICAgOyBzdG9yZQorCisgICAgOyBnbyB0byBuZXh0IGxpbmUKKyAgICBhZGQgICAgICBkc3RxLCBkc3RzdHJpZGVxCisgICAgYWRkICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIGRlYyAgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbmV4dCByb3cKKyAgICBqZyAubmV4dHJvdworICAgIFJFUF9SRVQKKworOyA0eDQgYmxvY2ssIEgtb25seSA2LXRhcCBmaWx0ZXIKK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCBwdXRfdnA4X2VwZWw0X2g2LCA2LCA2ICsgbnBpY3JlZ3MsIDAsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCBteCwgcGljcmVnCisgICAgbGVhICAgICAgIG14ZCwgW214cSozXQorJWlmZGVmIFBJQworICAgIGxlYSAgIHBpY3JlZ3EsIFtzaXh0YXBfZmlsdGVyX2h3X21dCislZW5kaWYKKyAgICBtb3ZxICAgICAgbW00LCBbc2l4dGFwX2ZpbHRlcl9odytteHEqOC00OF0gOyBzZXQgdXAgNHRhcCBmaWx0ZXIgaW4gd29yZHMKKyAgICBtb3ZxICAgICAgbW01LCBbc2l4dGFwX2ZpbHRlcl9odytteHEqOC0zMl0KKyAgICBtb3ZxICAgICAgbW02LCBbc2l4dGFwX2ZpbHRlcl9odytteHEqOC0xNl0KKyAgICBtb3ZxICAgICAgbW03LCBbcHdfNjRdCisgICAgcHhvciAgICAgIG1tMywgbW0zCisKKy5uZXh0cm93OgorICAgIG1vdnEgICAgICBtbTEsIFtzcmNxLTJdICAgICAgICAgICAgICAgIDsgKEFCQ0RFRkdIKSBsb2FkIDggaG9yaXpvbnRhbCBwaXhlbHMKKworICAgIDsgZmlyc3Qgc2V0IG9mIDIgcGl4ZWxzCisgICAgbW92cSAgICAgIG1tMiwgbW0xICAgICAgICAgICAgICAgICAgICAgOyBieXRlIEFCQ0QuLgorICAgIHB1bnBja2xidyBtbTEsIG1tMyAgICAgICAgICAgICAgICAgICAgIDsgYnl0ZS0+d29yZCBBQkNECisgICAgcHNodWZ3ICAgIG1tMCwgbW0yLCAweDkgICAgICAgICAgICAgICAgOyBieXRlIENERUYuLgorICAgIHB1bnBja2hidyBtbTIsIG1tMyAgICAgICAgICAgICAgICAgICAgIDsgYnl0ZS0+d29yZCBFRkdICisgICAgcHVucGNrbGJ3IG1tMCwgbW0zICAgICAgICAgICAgICAgICAgICAgOyBieXRlLT53b3JkIENERUYKKyAgICBwc2h1ZncgICAgbW0xLCBtbTEsIDB4OTQgICAgICAgICAgICAgICA7IHdvcmQgQUJCQworICAgIHBzaHVmdyAgICBtbTIsIG1tMiwgMHg5NCAgICAgICAgICAgICAgIDsgd29yZCBFRkZHCisgICAgcG1hZGR3ZCAgIG1tMSwgbW00ICAgICAgICAgICAgICAgICAgICAgOyBtdWx0aXBseSAycHggd2l0aCBGMC9GMQorICAgIHBzaHVmdyAgICBtbTMsIG1tMCwgMHg5NCAgICAgICAgICAgICAgIDsgd29yZCBDRERFCisgICAgbW92cSAgICAgIG1tMCwgbW0zICAgICAgICAgICAgICAgICAgICAgOyBiYWNrdXAgZm9yIHNlY29uZCBzZXQgb2YgcGl4ZWxzCisgICAgcG1hZGR3ZCAgIG1tMywgbW01ICAgICAgICAgICAgICAgICAgICAgOyBtdWx0aXBseSAycHggd2l0aCBGMi9GMworICAgIHBhZGRkICAgICBtbTEsIG1tMyAgICAgICAgICAgICAgICAgICAgIDsgYWRkIHRvIDFzdCAycHggY2FjaGUKKyAgICBtb3ZxICAgICAgbW0zLCBtbTIgICAgICAgICAgICAgICAgICAgICA7IGJhY2t1cCBmb3Igc2Vjb25kIHNldCBvZiBwaXhlbHMKKyAgICBwbWFkZHdkICAgbW0yLCBtbTYgICAgICAgICAgICAgICAgICAgICA7IG11bHRpcGx5IDJweCB3aXRoIEY0L0Y1CisgICAgcGFkZGQgICAgIG1tMSwgbW0yICAgICAgICAgICAgICAgICAgICAgOyBmaW5pc2ggMXN0IDJweAorCisgICAgOyBzZWNvbmQgc2V0IG9mIDIgcGl4ZWxzLCB1c2UgYmFja3VwIG9mIGFib3ZlCisgICAgbW92ZCAgICAgIG1tMiwgW3NyY3ErM10gICAgICAgICAgICAgICAgOyBieXRlIEZHSEkgKHByZXZlbnQgb3ZlcnJlYWRzKQorICAgIHBtYWRkd2QgICBtbTAsIG1tNCAgICAgICAgICAgICAgICAgICAgIDsgbXVsdGlwbHkgMXN0IGJhY2tlZCB1cCAycHggd2l0aCBGMC9GMQorICAgIHBtYWRkd2QgICBtbTMsIG1tNSAgICAgICAgICAgICAgICAgICAgIDsgbXVsdGlwbHkgMm5kIGJhY2tlZCB1cCAycHggd2l0aCBGMi9GMworICAgIHBhZGRkICAgICBtbTAsIG1tMyAgICAgICAgICAgICAgICAgICAgIDsgYWRkIHRvIDJuZCAycHggY2FjaGUKKyAgICBweG9yICAgICAgbW0zLCBtbTMKKyAgICBwdW5wY2tsYncgbW0yLCBtbTMgICAgICAgICAgICAgICAgICAgICA7IGJ5dGUtPndvcmQgRkdISQorICAgIHBzaHVmdyAgICBtbTIsIG1tMiwgMHhFOSAgICAgICAgICAgICAgIDsgd29yZCBHSEhJCisgICAgcG1hZGR3ZCAgIG1tMiwgbW02ICAgICAgICAgICAgICAgICAgICAgOyBtdWx0aXBseSAycHggd2l0aCBGNC9GNQorICAgIHBhZGRkICAgICBtbTAsIG1tMiAgICAgICAgICAgICAgICAgICAgIDsgZmluaXNoIDJuZCAycHgKKworICAgIDsgbWVyZ2UgdHdvIHNldHMgb2YgMiBwaXhlbHMgaW50byBvbmUgc2V0IG9mIDQsIHJvdW5kL2NsaXAvc3RvcmUKKyAgICBwYWNrc3NkdyAgbW0xLCBtbTAgICAgICAgICAgICAgICAgICAgICA7IG1lcmdlIGR3b3JkLT53b3JkICg0cHgpCisgICAgcGFkZHN3ICAgIG1tMSwgbW03ICAgICAgICAgICAgICAgICAgICAgOyByb3VuZGluZworICAgIHBzcmF3ICAgICBtbTEsIDcKKyAgICBwYWNrdXN3YiAgbW0xLCBtbTMgICAgICAgICAgICAgICAgICAgICA7IGNsaXAgYW5kIHdvcmQtPmJ5dGVzCisgICAgbW92ZCAgIFtkc3RxXSwgbW0xICAgICAgICAgICAgICAgICAgICAgOyBzdG9yZQorCisgICAgOyBnbyB0byBuZXh0IGxpbmUKKyAgICBhZGQgICAgICBkc3RxLCBkc3RzdHJpZGVxCisgICAgYWRkICAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIGRlYyAgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbmV4dCByb3cKKyAgICBqZyAubmV4dHJvdworICAgIFJFUF9SRVQKKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBwdXRfdnA4X2VwZWw4X2g0LCA2LCA2ICsgbnBpY3JlZ3MsIDEwLCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgbXgsIHBpY3JlZworICAgIHNobCAgICAgIG14ZCwgNQorJWlmZGVmIFBJQworICAgIGxlYSAgcGljcmVncSwgW2ZvdXJ0YXBfZmlsdGVyX3ZfbV0KKyVlbmRpZgorICAgIGxlYSAgICAgIG14cSwgW2ZvdXJ0YXBfZmlsdGVyX3YrbXhxLTMyXQorICAgIHB4b3IgICAgICBtNywgbTcKKyAgICBtb3ZhICAgICAgbTQsIFtwd182NF0KKyAgICBtb3ZhICAgICAgbTUsIFtteHErIDBdCisgICAgbW92YSAgICAgIG02LCBbbXhxKzE2XQorJWlmZGVmIG04CisgICAgbW92YSAgICAgIG04LCBbbXhxKzMyXQorICAgIG1vdmEgICAgICBtOSwgW214cSs0OF0KKyVlbmRpZgorLm5leHRyb3c6CisgICAgbW92cSAgICAgIG0wLCBbc3JjcS0xXQorICAgIG1vdnEgICAgICBtMSwgW3NyY3EtMF0KKyAgICBtb3ZxICAgICAgbTIsIFtzcmNxKzFdCisgICAgbW92cSAgICAgIG0zLCBbc3JjcSsyXQorICAgIHB1bnBja2xidyBtMCwgbTcKKyAgICBwdW5wY2tsYncgbTEsIG03CisgICAgcHVucGNrbGJ3IG0yLCBtNworICAgIHB1bnBja2xidyBtMywgbTcKKyAgICBwbXVsbHcgICAgbTAsIG01CisgICAgcG11bGx3ICAgIG0xLCBtNgorJWlmZGVmIG04CisgICAgcG11bGx3ICAgIG0yLCBtOAorICAgIHBtdWxsdyAgICBtMywgbTkKKyVlbHNlCisgICAgcG11bGx3ICAgIG0yLCBbbXhxKzMyXQorICAgIHBtdWxsdyAgICBtMywgW214cSs0OF0KKyVlbmRpZgorICAgIHBhZGRzdyAgICBtMCwgbTEKKyAgICBwYWRkc3cgICAgbTIsIG0zCisgICAgcGFkZHN3ICAgIG0wLCBtMgorICAgIHBhZGRzdyAgICBtMCwgbTQKKyAgICBwc3JhdyAgICAgbTAsIDcKKyAgICBwYWNrdXN3YiAgbTAsIG03CisgICAgbW92aCAgW2RzdHFdLCBtMCAgICAgICAgOyBzdG9yZQorCisgICAgOyBnbyB0byBuZXh0IGxpbmUKKyAgICBhZGQgICAgIGRzdHEsIGRzdHN0cmlkZXEKKyAgICBhZGQgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBkZWMgIGhlaWdodGQgICAgICAgICAgICA7IG5leHQgcm93CisgICAgamcgLm5leHRyb3cKKyAgICBSRVBfUkVUCisKK0lOSVRfWE1NIHNzZTIKK2NnbG9iYWwgcHV0X3ZwOF9lcGVsOF9oNiwgNiwgNiArIG5waWNyZWdzLCAxNCwgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCBwaWNyZWcKKyAgICBsZWEgICAgICBteGQsIFtteHEqM10KKyAgICBzaGwgICAgICBteGQsIDQKKyVpZmRlZiBQSUMKKyAgICBsZWEgIHBpY3JlZ3EsIFtzaXh0YXBfZmlsdGVyX3ZfbV0KKyVlbmRpZgorICAgIGxlYSAgICAgIG14cSwgW3NpeHRhcF9maWx0ZXJfditteHEtOTZdCisgICAgcHhvciAgICAgIG03LCBtNworICAgIG1vdmEgICAgICBtNiwgW3B3XzY0XQorJWlmZGVmIG04CisgICAgbW92YSAgICAgIG04LCBbbXhxKyAwXQorICAgIG1vdmEgICAgICBtOSwgW214cSsxNl0KKyAgICBtb3ZhICAgICBtMTAsIFtteHErMzJdCisgICAgbW92YSAgICAgbTExLCBbbXhxKzQ4XQorICAgIG1vdmEgICAgIG0xMiwgW214cSs2NF0KKyAgICBtb3ZhICAgICBtMTMsIFtteHErODBdCislZW5kaWYKKy5uZXh0cm93OgorICAgIG1vdnEgICAgICBtMCwgW3NyY3EtMl0KKyAgICBtb3ZxICAgICAgbTEsIFtzcmNxLTFdCisgICAgbW92cSAgICAgIG0yLCBbc3JjcS0wXQorICAgIG1vdnEgICAgICBtMywgW3NyY3ErMV0KKyAgICBtb3ZxICAgICAgbTQsIFtzcmNxKzJdCisgICAgbW92cSAgICAgIG01LCBbc3JjcSszXQorICAgIHB1bnBja2xidyBtMCwgbTcKKyAgICBwdW5wY2tsYncgbTEsIG03CisgICAgcHVucGNrbGJ3IG0yLCBtNworICAgIHB1bnBja2xidyBtMywgbTcKKyAgICBwdW5wY2tsYncgbTQsIG03CisgICAgcHVucGNrbGJ3IG01LCBtNworJWlmZGVmIG04CisgICAgcG11bGx3ICAgIG0wLCBtOAorICAgIHBtdWxsdyAgICBtMSwgbTkKKyAgICBwbXVsbHcgICAgbTIsIG0xMAorICAgIHBtdWxsdyAgICBtMywgbTExCisgICAgcG11bGx3ICAgIG00LCBtMTIKKyAgICBwbXVsbHcgICAgbTUsIG0xMworJWVsc2UKKyAgICBwbXVsbHcgICAgbTAsIFtteHErIDBdCisgICAgcG11bGx3ICAgIG0xLCBbbXhxKzE2XQorICAgIHBtdWxsdyAgICBtMiwgW214cSszMl0KKyAgICBwbXVsbHcgICAgbTMsIFtteHErNDhdCisgICAgcG11bGx3ICAgIG00LCBbbXhxKzY0XQorICAgIHBtdWxsdyAgICBtNSwgW214cSs4MF0KKyVlbmRpZgorICAgIHBhZGRzdyAgICBtMSwgbTQKKyAgICBwYWRkc3cgICAgbTAsIG01CisgICAgcGFkZHN3ICAgIG0xLCBtMgorICAgIHBhZGRzdyAgICBtMCwgbTMKKyAgICBwYWRkc3cgICAgbTAsIG0xCisgICAgcGFkZHN3ICAgIG0wLCBtNgorICAgIHBzcmF3ICAgICBtMCwgNworICAgIHBhY2t1c3diICBtMCwgbTcKKyAgICBtb3ZoICBbZHN0cV0sIG0wICAgICAgICA7IHN0b3JlCisKKyAgICA7IGdvIHRvIG5leHQgbGluZQorICAgIGFkZCAgICAgZHN0cSwgZHN0c3RyaWRlcQorICAgIGFkZCAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIGRlYyAgaGVpZ2h0ZCAgICAgICAgICAgIDsgbmV4dCByb3cKKyAgICBqZyAubmV4dHJvdworICAgIFJFUF9SRVQKKworJW1hY3JvIEZJTFRFUl9WIDEKKzsgNHg0IGJsb2NrLCBWLW9ubHkgNC10YXAgZmlsdGVyCitjZ2xvYmFsIHB1dF92cDhfZXBlbCUxX3Y0LCA3LCA3LCA4LCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgcGljcmVnLCBteQorICAgIHNobCAgICAgIG15ZCwgNQorJWlmZGVmIFBJQworICAgIGxlYSAgcGljcmVncSwgW2ZvdXJ0YXBfZmlsdGVyX3ZfbV0KKyVlbmRpZgorICAgIGxlYSAgICAgIG15cSwgW2ZvdXJ0YXBfZmlsdGVyX3YrbXlxLTMyXQorICAgIG1vdmEgICAgICBtNiwgW3B3XzY0XQorICAgIHB4b3IgICAgICBtNywgbTcKKyAgICBtb3ZhICAgICAgbTUsIFtteXErNDhdCisKKyAgICA7IHJlYWQgMyBsaW5lcworICAgIHN1YiAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIG1vdmggICAgICBtMCwgW3NyY3FdCisgICAgbW92aCAgICAgIG0xLCBbc3JjcSsgIHNyY3N0cmlkZXFdCisgICAgbW92aCAgICAgIG0yLCBbc3JjcSsyKnNyY3N0cmlkZXFdCisgICAgYWRkICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgcHVucGNrbGJ3IG0wLCBtNworICAgIHB1bnBja2xidyBtMSwgbTcKKyAgICBwdW5wY2tsYncgbTIsIG03CisKKy5uZXh0cm93OgorICAgIDsgZmlyc3QgY2FsY3VsYXRlIG5lZ2F0aXZlIHRhcHMgKHRvIHByZXZlbnQgbG9zaW5nIHBvc2l0aXZlIG92ZXJmbG93cykKKyAgICBtb3ZoICAgICAgbTQsIFtzcmNxKzIqc3Jjc3RyaWRlcV0gICAgICA7IHJlYWQgbmV3IHJvdworICAgIHB1bnBja2xidyBtNCwgbTcKKyAgICBtb3ZhICAgICAgbTMsIG00CisgICAgcG11bGx3ICAgIG0wLCBbbXlxKzBdCisgICAgcG11bGx3ICAgIG00LCBtNQorICAgIHBhZGRzdyAgICBtNCwgbTAKKworICAgIDsgdGhlbiBjYWxjdWxhdGUgcG9zaXRpdmUgdGFwcworICAgIG1vdmEgICAgICBtMCwgbTEKKyAgICBwbXVsbHcgICAgbTEsIFtteXErMTZdCisgICAgcGFkZHN3ICAgIG00LCBtMQorICAgIG1vdmEgICAgICBtMSwgbTIKKyAgICBwbXVsbHcgICAgbTIsIFtteXErMzJdCisgICAgcGFkZHN3ICAgIG00LCBtMgorICAgIG1vdmEgICAgICBtMiwgbTMKKworICAgIDsgcm91bmQvY2xpcC9zdG9yZQorICAgIHBhZGRzdyAgICBtNCwgbTYKKyAgICBwc3JhdyAgICAgbTQsIDcKKyAgICBwYWNrdXN3YiAgbTQsIG03CisgICAgbW92aCAgW2RzdHFdLCBtNAorCisgICAgOyBnbyB0byBuZXh0IGxpbmUKKyAgICBhZGQgICAgIGRzdHEsIGRzdHN0cmlkZXEKKyAgICBhZGQgICAgIHNyY3EsIHNyY3N0cmlkZXEKKyAgICBkZWMgIGhlaWdodGQgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG5leHQgcm93CisgICAgamcgLm5leHRyb3cKKyAgICBSRVBfUkVUCisKKworOyA0eDQgYmxvY2ssIFYtb25seSA2LXRhcCBmaWx0ZXIKK2NnbG9iYWwgcHV0X3ZwOF9lcGVsJTFfdjYsIDcsIDcsIDgsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCBwaWNyZWcsIG15CisgICAgc2hsICAgICAgbXlkLCA0CisgICAgbGVhICAgICAgbXlxLCBbbXlxKjNdCislaWZkZWYgUElDCisgICAgbGVhICBwaWNyZWdxLCBbc2l4dGFwX2ZpbHRlcl92X21dCislZW5kaWYKKyAgICBsZWEgICAgICBteXEsIFtzaXh0YXBfZmlsdGVyX3YrbXlxLTk2XQorICAgIHB4b3IgICAgICBtNywgbTcKKworICAgIDsgcmVhZCA1IGxpbmVzCisgICAgc3ViICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgc3ViICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgbW92aCAgICAgIG0wLCBbc3JjcV0KKyAgICBtb3ZoICAgICAgbTEsIFtzcmNxK3NyY3N0cmlkZXFdCisgICAgbW92aCAgICAgIG0yLCBbc3JjcStzcmNzdHJpZGVxKjJdCisgICAgbGVhICAgICBzcmNxLCBbc3JjcStzcmNzdHJpZGVxKjJdCisgICAgYWRkICAgICBzcmNxLCBzcmNzdHJpZGVxCisgICAgbW92aCAgICAgIG0zLCBbc3JjcV0KKyAgICBtb3ZoICAgICAgbTQsIFtzcmNxK3NyY3N0cmlkZXFdCisgICAgcHVucGNrbGJ3IG0wLCBtNworICAgIHB1bnBja2xidyBtMSwgbTcKKyAgICBwdW5wY2tsYncgbTIsIG03CisgICAgcHVucGNrbGJ3IG0zLCBtNworICAgIHB1bnBja2xidyBtNCwgbTcKKworLm5leHRyb3c6CisgICAgOyBmaXJzdCBjYWxjdWxhdGUgbmVnYXRpdmUgdGFwcyAodG8gcHJldmVudCBsb3NpbmcgcG9zaXRpdmUgb3ZlcmZsb3dzKQorICAgIG1vdmEgICAgICBtNSwgbTEKKyAgICBwbXVsbHcgICAgbTUsIFtteXErMTZdCisgICAgbW92YSAgICAgIG02LCBtNAorICAgIHBtdWxsdyAgICBtNiwgW215cSs2NF0KKyAgICBwYWRkc3cgICAgbTYsIG01CisKKyAgICA7IHRoZW4gY2FsY3VsYXRlIHBvc2l0aXZlIHRhcHMKKyAgICBtb3ZoICAgICAgbTUsIFtzcmNxKzIqc3Jjc3RyaWRlcV0gICAgICA7IHJlYWQgbmV3IHJvdworICAgIHB1bnBja2xidyBtNSwgbTcKKyAgICBwbXVsbHcgICAgbTAsIFtteXErMF0KKyAgICBwYWRkc3cgICAgbTYsIG0wCisgICAgbW92YSAgICAgIG0wLCBtMQorICAgIG1vdmEgICAgICBtMSwgbTIKKyAgICBwbXVsbHcgICAgbTIsIFtteXErMzJdCisgICAgcGFkZHN3ICAgIG02LCBtMgorICAgIG1vdmEgICAgICBtMiwgbTMKKyAgICBwbXVsbHcgICAgbTMsIFtteXErNDhdCisgICAgcGFkZHN3ICAgIG02LCBtMworICAgIG1vdmEgICAgICBtMywgbTQKKyAgICBtb3ZhICAgICAgbTQsIG01CisgICAgcG11bGx3ICAgIG01LCBbbXlxKzgwXQorICAgIHBhZGRzdyAgICBtNiwgbTUKKworICAgIDsgcm91bmQvY2xpcC9zdG9yZQorICAgIHBhZGRzdyAgICBtNiwgW3B3XzY0XQorICAgIHBzcmF3ICAgICBtNiwgNworICAgIHBhY2t1c3diICBtNiwgbTcKKyAgICBtb3ZoICBbZHN0cV0sIG02CisKKyAgICA7IGdvIHRvIG5leHQgbGluZQorICAgIGFkZCAgICAgZHN0cSwgZHN0c3RyaWRlcQorICAgIGFkZCAgICAgc3JjcSwgc3Jjc3RyaWRlcQorICAgIGRlYyAgaGVpZ2h0ZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbmV4dCByb3cKKyAgICBqZyAubmV4dHJvdworICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK0ZJTFRFUl9WIDQKK0lOSVRfWE1NIHNzZTIKK0ZJTFRFUl9WIDgKKworJW1hY3JvIEZJTFRFUl9CSUxJTkVBUiAxCitjZ2xvYmFsIHB1dF92cDhfYmlsaW5lYXIlMV92LCA3LCA3LCA3LCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgcGljcmVnLCBteQorICAgIHNobCAgICAgIG15ZCwgNAorJWlmZGVmIFBJQworICAgIGxlYSAgcGljcmVncSwgW2JpbGluZWFyX2ZpbHRlcl92d19tXQorJWVuZGlmCisgICAgcHhvciAgICAgIG02LCBtNgorICAgIG1vdmEgICAgICBtNSwgW2JpbGluZWFyX2ZpbHRlcl92dytteXEtMSoxNl0KKyAgICBuZWcgICAgICBteXEKKyAgICBtb3ZhICAgICAgbTQsIFtiaWxpbmVhcl9maWx0ZXJfdncrbXlxKzcqMTZdCisubmV4dHJvdzoKKyAgICBtb3ZoICAgICAgbTAsIFtzcmNxK3NyY3N0cmlkZXEqMF0KKyAgICBtb3ZoICAgICAgbTEsIFtzcmNxK3NyY3N0cmlkZXEqMV0KKyAgICBtb3ZoICAgICAgbTMsIFtzcmNxK3NyY3N0cmlkZXEqMl0KKyAgICBwdW5wY2tsYncgbTAsIG02CisgICAgcHVucGNrbGJ3IG0xLCBtNgorICAgIHB1bnBja2xidyBtMywgbTYKKyAgICBtb3ZhICAgICAgbTIsIG0xCisgICAgcG11bGx3ICAgIG0wLCBtNAorICAgIHBtdWxsdyAgICBtMSwgbTUKKyAgICBwbXVsbHcgICAgbTIsIG00CisgICAgcG11bGx3ICAgIG0zLCBtNQorICAgIHBhZGRzdyAgICBtMCwgbTEKKyAgICBwYWRkc3cgICAgbTIsIG0zCisgICAgcHNyYXcgICAgIG0wLCAyCisgICAgcHNyYXcgICAgIG0yLCAyCisgICAgcGF2Z3cgICAgIG0wLCBtNgorICAgIHBhdmd3ICAgICBtMiwgbTYKKyVpZiBtbXNpemUgPT0gOAorICAgIHBhY2t1c3diICBtMCwgbTAKKyAgICBwYWNrdXN3YiAgbTIsIG0yCisgICAgbW92aCAgIFtkc3RxK2RzdHN0cmlkZXEqMF0sIG0wCisgICAgbW92aCAgIFtkc3RxK2RzdHN0cmlkZXEqMV0sIG0yCislZWxzZQorICAgIHBhY2t1c3diICBtMCwgbTIKKyAgICBtb3ZoICAgW2RzdHErZHN0c3RyaWRlcSowXSwgbTAKKyAgICBtb3ZocHMgW2RzdHErZHN0c3RyaWRlcSoxXSwgbTAKKyVlbmRpZgorCisgICAgbGVhICAgICBkc3RxLCBbZHN0cStkc3RzdHJpZGVxKjJdCisgICAgbGVhICAgICBzcmNxLCBbc3JjcStzcmNzdHJpZGVxKjJdCisgICAgc3ViICBoZWlnaHRkLCAyCisgICAgamcgLm5leHRyb3cKKyAgICBSRVBfUkVUCisKK2NnbG9iYWwgcHV0X3ZwOF9iaWxpbmVhciUxX2gsIDYsIDYgKyBucGljcmVncywgNywgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCBwaWNyZWcKKyAgICBzaGwgICAgICBteGQsIDQKKyVpZmRlZiBQSUMKKyAgICBsZWEgIHBpY3JlZ3EsIFtiaWxpbmVhcl9maWx0ZXJfdndfbV0KKyVlbmRpZgorICAgIHB4b3IgICAgICBtNiwgbTYKKyAgICBtb3ZhICAgICAgbTUsIFtiaWxpbmVhcl9maWx0ZXJfdncrbXhxLTEqMTZdCisgICAgbmVnICAgICAgbXhxCisgICAgbW92YSAgICAgIG00LCBbYmlsaW5lYXJfZmlsdGVyX3Z3K214cSs3KjE2XQorLm5leHRyb3c6CisgICAgbW92aCAgICAgIG0wLCBbc3JjcStzcmNzdHJpZGVxKjArMF0KKyAgICBtb3ZoICAgICAgbTEsIFtzcmNxK3NyY3N0cmlkZXEqMCsxXQorICAgIG1vdmggICAgICBtMiwgW3NyY3Erc3Jjc3RyaWRlcSoxKzBdCisgICAgbW92aCAgICAgIG0zLCBbc3JjcStzcmNzdHJpZGVxKjErMV0KKyAgICBwdW5wY2tsYncgbTAsIG02CisgICAgcHVucGNrbGJ3IG0xLCBtNgorICAgIHB1bnBja2xidyBtMiwgbTYKKyAgICBwdW5wY2tsYncgbTMsIG02CisgICAgcG11bGx3ICAgIG0wLCBtNAorICAgIHBtdWxsdyAgICBtMSwgbTUKKyAgICBwbXVsbHcgICAgbTIsIG00CisgICAgcG11bGx3ICAgIG0zLCBtNQorICAgIHBhZGRzdyAgICBtMCwgbTEKKyAgICBwYWRkc3cgICAgbTIsIG0zCisgICAgcHNyYXcgICAgIG0wLCAyCisgICAgcHNyYXcgICAgIG0yLCAyCisgICAgcGF2Z3cgICAgIG0wLCBtNgorICAgIHBhdmd3ICAgICBtMiwgbTYKKyVpZiBtbXNpemUgPT0gOAorICAgIHBhY2t1c3diICBtMCwgbTAKKyAgICBwYWNrdXN3YiAgbTIsIG0yCisgICAgbW92aCAgIFtkc3RxK2RzdHN0cmlkZXEqMF0sIG0wCisgICAgbW92aCAgIFtkc3RxK2RzdHN0cmlkZXEqMV0sIG0yCislZWxzZQorICAgIHBhY2t1c3diICBtMCwgbTIKKyAgICBtb3ZoICAgW2RzdHErZHN0c3RyaWRlcSowXSwgbTAKKyAgICBtb3ZocHMgW2RzdHErZHN0c3RyaWRlcSoxXSwgbTAKKyVlbmRpZgorCisgICAgbGVhICAgICBkc3RxLCBbZHN0cStkc3RzdHJpZGVxKjJdCisgICAgbGVhICAgICBzcmNxLCBbc3JjcStzcmNzdHJpZGVxKjJdCisgICAgc3ViICBoZWlnaHRkLCAyCisgICAgamcgLm5leHRyb3cKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitGSUxURVJfQklMSU5FQVIgNAorSU5JVF9YTU0gc3NlMgorRklMVEVSX0JJTElORUFSIDgKKworJW1hY3JvIEZJTFRFUl9CSUxJTkVBUl9TU1NFMyAxCitjZ2xvYmFsIHB1dF92cDhfYmlsaW5lYXIlMV92LCA3LCA3LCA1LCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgcGljcmVnLCBteQorICAgIHNobCAgICAgIG15ZCwgNAorJWlmZGVmIFBJQworICAgIGxlYSAgcGljcmVncSwgW2JpbGluZWFyX2ZpbHRlcl92Yl9tXQorJWVuZGlmCisgICAgcHhvciAgICAgIG00LCBtNAorICAgIG1vdmEgICAgICBtMywgW2JpbGluZWFyX2ZpbHRlcl92YitteXEtMTZdCisubmV4dHJvdzoKKyAgICBtb3ZoICAgICAgbTAsIFtzcmNxK3NyY3N0cmlkZXEqMF0KKyAgICBtb3ZoICAgICAgbTEsIFtzcmNxK3NyY3N0cmlkZXEqMV0KKyAgICBtb3ZoICAgICAgbTIsIFtzcmNxK3NyY3N0cmlkZXEqMl0KKyAgICBwdW5wY2tsYncgbTAsIG0xCisgICAgcHVucGNrbGJ3IG0xLCBtMgorICAgIHBtYWRkdWJzdyBtMCwgbTMKKyAgICBwbWFkZHVic3cgbTEsIG0zCisgICAgcHNyYXcgICAgIG0wLCAyCisgICAgcHNyYXcgICAgIG0xLCAyCisgICAgcGF2Z3cgICAgIG0wLCBtNAorICAgIHBhdmd3ICAgICBtMSwgbTQKKyVpZiBtbXNpemU9PTgKKyAgICBwYWNrdXN3YiAgbTAsIG0wCisgICAgcGFja3Vzd2IgIG0xLCBtMQorICAgIG1vdmggICBbZHN0cStkc3RzdHJpZGVxKjBdLCBtMAorICAgIG1vdmggICBbZHN0cStkc3RzdHJpZGVxKjFdLCBtMQorJWVsc2UKKyAgICBwYWNrdXN3YiAgbTAsIG0xCisgICAgbW92aCAgIFtkc3RxK2RzdHN0cmlkZXEqMF0sIG0wCisgICAgbW92aHBzIFtkc3RxK2RzdHN0cmlkZXEqMV0sIG0wCislZW5kaWYKKworICAgIGxlYSAgICAgZHN0cSwgW2RzdHErZHN0c3RyaWRlcSoyXQorICAgIGxlYSAgICAgc3JjcSwgW3NyY3Erc3Jjc3RyaWRlcSoyXQorICAgIHN1YiAgaGVpZ2h0ZCwgMgorICAgIGpnIC5uZXh0cm93CisgICAgUkVQX1JFVAorCitjZ2xvYmFsIHB1dF92cDhfYmlsaW5lYXIlMV9oLCA2LCA2ICsgbnBpY3JlZ3MsIDUsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCBteCwgcGljcmVnCisgICAgc2hsICAgICAgbXhkLCA0CislaWZkZWYgUElDCisgICAgbGVhICBwaWNyZWdxLCBbYmlsaW5lYXJfZmlsdGVyX3ZiX21dCislZW5kaWYKKyAgICBweG9yICAgICAgbTQsIG00CisgICAgbW92YSAgICAgIG0yLCBbZmlsdGVyX2gyX3NodWZdCisgICAgbW92YSAgICAgIG0zLCBbYmlsaW5lYXJfZmlsdGVyX3ZiK214cS0xNl0KKy5uZXh0cm93OgorICAgIG1vdnUgICAgICBtMCwgW3NyY3Erc3Jjc3RyaWRlcSowXQorICAgIG1vdnUgICAgICBtMSwgW3NyY3Erc3Jjc3RyaWRlcSoxXQorICAgIHBzaHVmYiAgICBtMCwgbTIKKyAgICBwc2h1ZmIgICAgbTEsIG0yCisgICAgcG1hZGR1YnN3IG0wLCBtMworICAgIHBtYWRkdWJzdyBtMSwgbTMKKyAgICBwc3JhdyAgICAgbTAsIDIKKyAgICBwc3JhdyAgICAgbTEsIDIKKyAgICBwYXZndyAgICAgbTAsIG00CisgICAgcGF2Z3cgICAgIG0xLCBtNAorJWlmIG1tc2l6ZT09OAorICAgIHBhY2t1c3diICBtMCwgbTAKKyAgICBwYWNrdXN3YiAgbTEsIG0xCisgICAgbW92aCAgIFtkc3RxK2RzdHN0cmlkZXEqMF0sIG0wCisgICAgbW92aCAgIFtkc3RxK2RzdHN0cmlkZXEqMV0sIG0xCislZWxzZQorICAgIHBhY2t1c3diICBtMCwgbTEKKyAgICBtb3ZoICAgW2RzdHErZHN0c3RyaWRlcSowXSwgbTAKKyAgICBtb3ZocHMgW2RzdHErZHN0c3RyaWRlcSoxXSwgbTAKKyVlbmRpZgorCisgICAgbGVhICAgICBkc3RxLCBbZHN0cStkc3RzdHJpZGVxKjJdCisgICAgbGVhICAgICBzcmNxLCBbc3JjcStzcmNzdHJpZGVxKjJdCisgICAgc3ViICBoZWlnaHRkLCAyCisgICAgamcgLm5leHRyb3cKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggc3NzZTMKK0ZJTFRFUl9CSUxJTkVBUl9TU1NFMyA0CitJTklUX1hNTSBzc3NlMworRklMVEVSX0JJTElORUFSX1NTU0UzIDgKKworSU5JVF9NTVggbW14CitjZ2xvYmFsIHB1dF92cDhfcGl4ZWxzOCwgNSwgNSwgMCwgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQKKy5uZXh0cm93OgorICAgIG1vdnEgICAgbW0wLCBbc3JjcStzcmNzdHJpZGVxKjBdCisgICAgbW92cSAgICBtbTEsIFtzcmNxK3NyY3N0cmlkZXEqMV0KKyAgICBsZWEgICAgc3JjcSwgW3NyY3Erc3Jjc3RyaWRlcSoyXQorICAgIG1vdnEgW2RzdHErZHN0c3RyaWRlcSowXSwgbW0wCisgICAgbW92cSBbZHN0cStkc3RzdHJpZGVxKjFdLCBtbTEKKyAgICBsZWEgICAgZHN0cSwgW2RzdHErZHN0c3RyaWRlcSoyXQorICAgIHN1YiBoZWlnaHRkLCAyCisgICAgamcgLm5leHRyb3cKKyAgICBSRVBfUkVUCisKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggbW14CitjZ2xvYmFsIHB1dF92cDhfcGl4ZWxzMTYsIDUsIDUsIDAsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0CisubmV4dHJvdzoKKyAgICBtb3ZxICAgIG1tMCwgW3NyY3Erc3Jjc3RyaWRlcSowKzBdCisgICAgbW92cSAgICBtbTEsIFtzcmNxK3NyY3N0cmlkZXEqMCs4XQorICAgIG1vdnEgICAgbW0yLCBbc3JjcStzcmNzdHJpZGVxKjErMF0KKyAgICBtb3ZxICAgIG1tMywgW3NyY3Erc3Jjc3RyaWRlcSoxKzhdCisgICAgbGVhICAgIHNyY3EsIFtzcmNxK3NyY3N0cmlkZXEqMl0KKyAgICBtb3ZxIFtkc3RxK2RzdHN0cmlkZXEqMCswXSwgbW0wCisgICAgbW92cSBbZHN0cStkc3RzdHJpZGVxKjArOF0sIG1tMQorICAgIG1vdnEgW2RzdHErZHN0c3RyaWRlcSoxKzBdLCBtbTIKKyAgICBtb3ZxIFtkc3RxK2RzdHN0cmlkZXEqMSs4XSwgbW0zCisgICAgbGVhICAgIGRzdHEsIFtkc3RxK2RzdHN0cmlkZXEqMl0KKyAgICBzdWIgaGVpZ2h0ZCwgMgorICAgIGpnIC5uZXh0cm93CisgICAgUkVQX1JFVAorJWVuZGlmCisKK0lOSVRfWE1NIHNzZQorY2dsb2JhbCBwdXRfdnA4X3BpeGVsczE2LCA1LCA1LCAyLCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodAorLm5leHRyb3c6CisgICAgbW92dXBzIHhtbTAsIFtzcmNxK3NyY3N0cmlkZXEqMF0KKyAgICBtb3Z1cHMgeG1tMSwgW3NyY3Erc3Jjc3RyaWRlcSoxXQorICAgIGxlYSAgICBzcmNxLCBbc3JjcStzcmNzdHJpZGVxKjJdCisgICAgbW92YXBzIFtkc3RxK2RzdHN0cmlkZXEqMF0sIHhtbTAKKyAgICBtb3ZhcHMgW2RzdHErZHN0c3RyaWRlcSoxXSwgeG1tMQorICAgIGxlYSAgICBkc3RxLCBbZHN0cStkc3RzdHJpZGVxKjJdCisgICAgc3ViIGhlaWdodGQsIDIKKyAgICBqZyAubmV4dHJvdworICAgIFJFUF9SRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkXzxvcHQ+KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIGludCBzdHJpZGUpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBBRERfREMgNAorICAgICU0ICAgICAgICBtMiwgW2RzdDFxKyUzXQorICAgICU0ICAgICAgICBtMywgW2RzdDFxK3N0cmlkZXErJTNdCisgICAgJTQgICAgICAgIG00LCBbZHN0MnErJTNdCisgICAgJTQgICAgICAgIG01LCBbZHN0MnErc3RyaWRlcSslM10KKyAgICBwYWRkdXNiICAgbTIsICUxCisgICAgcGFkZHVzYiAgIG0zLCAlMQorICAgIHBhZGR1c2IgICBtNCwgJTEKKyAgICBwYWRkdXNiICAgbTUsICUxCisgICAgcHN1YnVzYiAgIG0yLCAlMgorICAgIHBzdWJ1c2IgICBtMywgJTIKKyAgICBwc3VidXNiICAgbTQsICUyCisgICAgcHN1YnVzYiAgIG01LCAlMgorICAgICU0IFtkc3QxcSslM10sIG0yCisgICAgJTQgW2RzdDFxK3N0cmlkZXErJTNdLCBtMworICAgICU0IFtkc3QycSslM10sIG00CisgICAgJTQgW2RzdDJxK3N0cmlkZXErJTNdLCBtNQorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teAorY2dsb2JhbCB2cDhfaWRjdF9kY19hZGQsIDMsIDMsIDAsIGRzdCwgYmxvY2ssIHN0cmlkZQorICAgIDsgbG9hZCBkYXRhCisgICAgbW92ZCAgICAgICBtMCwgW2Jsb2NrcV0KKworICAgIDsgY2FsY3VsYXRlIERDCisgICAgcGFkZHcgICAgICBtMCwgW3B3XzRdCisgICAgcHhvciAgICAgICBtMSwgbTEKKyAgICBwc3JhdyAgICAgIG0wLCAzCisgICAgbW92ZCBbYmxvY2txXSwgbTEKKyAgICBwc3VidyAgICAgIG0xLCBtMAorICAgIHBhY2t1c3diICAgbTAsIG0wCisgICAgcGFja3Vzd2IgICBtMSwgbTEKKyAgICBwdW5wY2tsYncgIG0wLCBtMAorICAgIHB1bnBja2xidyAgbTEsIG0xCisgICAgcHVucGNrbHdkICBtMCwgbTAKKyAgICBwdW5wY2tsd2QgIG0xLCBtMQorCisgICAgOyBhZGQgREMKKyAgICBERUZJTkVfQVJHUyBkc3QxLCBkc3QyLCBzdHJpZGUKKyAgICBsZWEgICAgIGRzdDJxLCBbZHN0MXErc3RyaWRlcSoyXQorICAgIEFERF9EQyAgICAgbTAsIG0xLCAwLCBtb3ZoCisgICAgUkVUCisKK0lOSVRfWE1NIHNzZTQKK2NnbG9iYWwgdnA4X2lkY3RfZGNfYWRkLCAzLCAzLCA2LCBkc3QsIGJsb2NrLCBzdHJpZGUKKyAgICA7IGxvYWQgZGF0YQorICAgIG1vdmQgICAgICAgbTAsIFtibG9ja3FdCisgICAgcHhvciAgICAgICBtMSwgbTEKKworICAgIDsgY2FsY3VsYXRlIERDCisgICAgcGFkZHcgICAgICBtMCwgW3B3XzRdCisgICAgbW92ZCBbYmxvY2txXSwgbTEKKyAgICBERUZJTkVfQVJHUyBkc3QxLCBkc3QyLCBzdHJpZGUKKyAgICBsZWEgICAgIGRzdDJxLCBbZHN0MXErc3RyaWRlcSoyXQorICAgIG1vdmQgICAgICAgbTIsIFtkc3QxcV0KKyAgICBtb3ZkICAgICAgIG0zLCBbZHN0MXErc3RyaWRlcV0KKyAgICBtb3ZkICAgICAgIG00LCBbZHN0MnFdCisgICAgbW92ZCAgICAgICBtNSwgW2RzdDJxK3N0cmlkZXFdCisgICAgcHNyYXcgICAgICBtMCwgMworICAgIHBzaHVmbHcgICAgbTAsIG0wLCAwCisgICAgcHVucGNrbHFkcSBtMCwgbTAKKyAgICBwdW5wY2tsZHEgIG0yLCBtMworICAgIHB1bnBja2xkcSAgbTQsIG01CisgICAgcHVucGNrbGJ3ICBtMiwgbTEKKyAgICBwdW5wY2tsYncgIG00LCBtMQorICAgIHBhZGR3ICAgICAgbTIsIG0wCisgICAgcGFkZHcgICAgICBtNCwgbTAKKyAgICBwYWNrdXN3YiAgIG0yLCBtNAorICAgIG1vdmQgICBbZHN0MXFdLCBtMgorICAgIHBleHRyZCBbZHN0MXErc3RyaWRlcV0sIG0yLCAxCisgICAgcGV4dHJkIFtkc3QycV0sIG0yLCAyCisgICAgcGV4dHJkIFtkc3QycStzdHJpZGVxXSwgbTIsIDMKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkNHlfPG9wdD4odWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzRdWzE2XSwgaW50IHN0cmlkZSk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJWlmIEFSQ0hfWDg2XzMyCitJTklUX01NWCBtbXgKK2NnbG9iYWwgdnA4X2lkY3RfZGNfYWRkNHksIDMsIDMsIDAsIGRzdCwgYmxvY2ssIHN0cmlkZQorICAgIDsgbG9hZCBkYXRhCisgICAgbW92ZCAgICAgIG0wLCBbYmxvY2txKzMyKjBdIDsgQQorICAgIG1vdmQgICAgICBtMSwgW2Jsb2NrcSszMioyXSA7IEMKKyAgICBwdW5wY2tsd2QgbTAsIFtibG9ja3ErMzIqMV0gOyBBIEIKKyAgICBwdW5wY2tsd2QgbTEsIFtibG9ja3ErMzIqM10gOyBDIEQKKyAgICBwdW5wY2tsZHEgbTAsIG0xICAgICAgICA7IEEgQiBDIEQKKyAgICBweG9yICAgICAgbTYsIG02CisKKyAgICA7IGNhbGN1bGF0ZSBEQworICAgIHBhZGR3ICAgICBtMCwgW3B3XzRdCisgICAgbW92ZCBbYmxvY2txKzMyKjBdLCBtNgorICAgIG1vdmQgW2Jsb2NrcSszMioxXSwgbTYKKyAgICBtb3ZkIFtibG9ja3ErMzIqMl0sIG02CisgICAgbW92ZCBbYmxvY2txKzMyKjNdLCBtNgorICAgIHBzcmF3ICAgICBtMCwgMworICAgIHBzdWJ3ICAgICBtNiwgbTAKKyAgICBwYWNrdXN3YiAgbTAsIG0wCisgICAgcGFja3Vzd2IgIG02LCBtNgorICAgIHB1bnBja2xidyBtMCwgbTAgOyBBQUJCQ0NERAorICAgIHB1bnBja2xidyBtNiwgbTYgOyBBQUJCQ0NERAorICAgIG1vdnEgICAgICBtMSwgbTAKKyAgICBtb3ZxICAgICAgbTcsIG02CisgICAgcHVucGNrbGJ3IG0wLCBtMCA7IEFBQUFCQkJCCisgICAgcHVucGNraGJ3IG0xLCBtMSA7IENDQ0NERERECisgICAgcHVucGNrbGJ3IG02LCBtNiA7IEFBQUFCQkJCCisgICAgcHVucGNraGJ3IG03LCBtNyA7IENDQ0NERERECisKKyAgICA7IGFkZCBEQworICAgIERFRklORV9BUkdTIGRzdDEsIGRzdDIsIHN0cmlkZQorICAgIGxlYSAgICBkc3QycSwgW2RzdDFxK3N0cmlkZXEqMl0KKyAgICBBRERfREMgICAgbTAsIG02LCAwLCBtb3ZhCisgICAgQUREX0RDICAgIG0xLCBtNywgOCwgbW92YQorICAgIFJFVAorJWVuZGlmCisKK0lOSVRfWE1NIHNzZTIKK2NnbG9iYWwgdnA4X2lkY3RfZGNfYWRkNHksIDMsIDMsIDYsIGRzdCwgYmxvY2ssIHN0cmlkZQorICAgIDsgbG9hZCBkYXRhCisgICAgbW92ZCAgICAgIG0wLCBbYmxvY2txKzMyKjBdIDsgQQorICAgIG1vdmQgICAgICBtMSwgW2Jsb2NrcSszMioyXSA7IEMKKyAgICBwdW5wY2tsd2QgbTAsIFtibG9ja3ErMzIqMV0gOyBBIEIKKyAgICBwdW5wY2tsd2QgbTEsIFtibG9ja3ErMzIqM10gOyBDIEQKKyAgICBwdW5wY2tsZHEgbTAsIG0xICAgICAgICA7IEEgQiBDIEQKKyAgICBweG9yICAgICAgbTEsIG0xCisKKyAgICA7IGNhbGN1bGF0ZSBEQworICAgIHBhZGR3ICAgICBtMCwgW3B3XzRdCisgICAgbW92ZCBbYmxvY2txKzMyKjBdLCBtMQorICAgIG1vdmQgW2Jsb2NrcSszMioxXSwgbTEKKyAgICBtb3ZkIFtibG9ja3ErMzIqMl0sIG0xCisgICAgbW92ZCBbYmxvY2txKzMyKjNdLCBtMQorICAgIHBzcmF3ICAgICBtMCwgMworICAgIHBzdWJ3ICAgICBtMSwgbTAKKyAgICBwYWNrdXN3YiAgbTAsIG0wCisgICAgcGFja3Vzd2IgIG0xLCBtMQorICAgIHB1bnBja2xidyBtMCwgbTAKKyAgICBwdW5wY2tsYncgbTEsIG0xCisgICAgcHVucGNrbGJ3IG0wLCBtMAorICAgIHB1bnBja2xidyBtMSwgbTEKKworICAgIDsgYWRkIERDCisgICAgREVGSU5FX0FSR1MgZHN0MSwgZHN0Miwgc3RyaWRlCisgICAgbGVhICAgIGRzdDJxLCBbZHN0MXErc3RyaWRlcSoyXQorICAgIEFERF9EQyAgICBtMCwgbTEsIDAsIG1vdmEKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkNHV2XzxvcHQ+KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1s0XVsxNl0sIGludCBzdHJpZGUpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOSVRfTU1YIG1teAorY2dsb2JhbCB2cDhfaWRjdF9kY19hZGQ0dXYsIDMsIDMsIDAsIGRzdCwgYmxvY2ssIHN0cmlkZQorICAgIDsgbG9hZCBkYXRhCisgICAgbW92ZCAgICAgIG0wLCBbYmxvY2txKzMyKjBdIDsgQQorICAgIG1vdmQgICAgICBtMSwgW2Jsb2NrcSszMioyXSA7IEMKKyAgICBwdW5wY2tsd2QgbTAsIFtibG9ja3ErMzIqMV0gOyBBIEIKKyAgICBwdW5wY2tsd2QgbTEsIFtibG9ja3ErMzIqM10gOyBDIEQKKyAgICBwdW5wY2tsZHEgbTAsIG0xICAgICAgICA7IEEgQiBDIEQKKyAgICBweG9yICAgICAgbTYsIG02CisKKyAgICA7IGNhbGN1bGF0ZSBEQworICAgIHBhZGR3ICAgICBtMCwgW3B3XzRdCisgICAgbW92ZCBbYmxvY2txKzMyKjBdLCBtNgorICAgIG1vdmQgW2Jsb2NrcSszMioxXSwgbTYKKyAgICBtb3ZkIFtibG9ja3ErMzIqMl0sIG02CisgICAgbW92ZCBbYmxvY2txKzMyKjNdLCBtNgorICAgIHBzcmF3ICAgICBtMCwgMworICAgIHBzdWJ3ICAgICBtNiwgbTAKKyAgICBwYWNrdXN3YiAgbTAsIG0wCisgICAgcGFja3Vzd2IgIG02LCBtNgorICAgIHB1bnBja2xidyBtMCwgbTAgOyBBQUJCQ0NERAorICAgIHB1bnBja2xidyBtNiwgbTYgOyBBQUJCQ0NERAorICAgIG1vdnEgICAgICBtMSwgbTAKKyAgICBtb3ZxICAgICAgbTcsIG02CisgICAgcHVucGNrbGJ3IG0wLCBtMCA7IEFBQUFCQkJCCisgICAgcHVucGNraGJ3IG0xLCBtMSA7IENDQ0NERERECisgICAgcHVucGNrbGJ3IG02LCBtNiA7IEFBQUFCQkJCCisgICAgcHVucGNraGJ3IG03LCBtNyA7IENDQ0NERERECisKKyAgICA7IGFkZCBEQworICAgIERFRklORV9BUkdTIGRzdDEsIGRzdDIsIHN0cmlkZQorICAgIGxlYSAgICBkc3QycSwgW2RzdDFxK3N0cmlkZXEqMl0KKyAgICBBRERfREMgICAgbTAsIG02LCAwLCBtb3ZhCisgICAgbGVhICAgIGRzdDFxLCBbZHN0MXErc3RyaWRlcSo0XQorICAgIGxlYSAgICBkc3QycSwgW2RzdDJxK3N0cmlkZXEqNF0KKyAgICBBRERfREMgICAgbTEsIG03LCAwLCBtb3ZhCisgICAgUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ZwOF9pZGN0X2FkZF88b3B0Pih1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbMTZdLCBpbnQgc3RyaWRlKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7IGNhbGN1bGF0ZSAlMT1tdWxfMzU0NjgoJTEpLW11bF8yMDA5MSglMik7ICUyPW11bF8yMDA5MSglMSkrbXVsXzM1NDY4KCUyKQorOyAgICAgICAgICAgdGhpcyBtYWNybyBhc3N1bWVzIHRoYXQgbTYvbTcgaGF2ZSB3b3JkcyBmb3IgMjAwOTEvMTc3MzQgbG9hZGVkCislbWFjcm8gVlA4X01VTFRJUExZX1NVTVNVQiA0CisgICAgbW92YSAgICAgICUzLCAlMQorICAgIG1vdmEgICAgICAlNCwgJTIKKyAgICBwbXVsaHcgICAgJTMsIG02IDsyMDA5MSgxKQorICAgIHBtdWxodyAgICAlNCwgbTYgOzIwMDkxKDIpCisgICAgcGFkZHcgICAgICUzLCAlMQorICAgIHBhZGR3ICAgICAlNCwgJTIKKyAgICBwYWRkdyAgICAgJTEsICUxCisgICAgcGFkZHcgICAgICUyLCAlMgorICAgIHBtdWxodyAgICAlMSwgbTcgOzM1NDY4KDEpCisgICAgcG11bGh3ICAgICUyLCBtNyA7MzU0NjgoMikKKyAgICBwc3VidyAgICAgJTEsICU0CisgICAgcGFkZHcgICAgICUyLCAlMworJWVuZG1hY3JvCisKKzsgY2FsY3VsYXRlIHgwPSUxKyUzOyB4MT0lMS0lMworOyAgICAgICAgICAgeDI9bXVsXzM1NDY4KCUyKS1tdWxfMjAwOTEoJTQpOyB4Mz1tdWxfMjAwOTEoJTIpK211bF8zNTQ2OCglNCkKKzsgICAgICAgICAgICUxPXgwK3gzICh0bXAwKTsgJTI9eDEreDIgKHRtcDEpOyAlMz14MS14MiAodG1wMik7ICU0PXgwLXgzICh0bXAzKQorOyAgICAgICAgICAgJTUvJTYgYXJlIHRlbXBvcmFyeSByZWdpc3RlcnMKKzsgICAgICAgICAgIHdlIGFzc3VtZSBtNi9tNyBoYXZlIGNvbnN0YW50IHdvcmRzIDIwMDkxLzE3NzM0IGxvYWRlZCBpbiB0aGVtCislbWFjcm8gVlA4X0lEQ1RfVFJBTlNGT1JNNHg0XzFEIDYKKyAgICBTVU1TVUJfQkEgICAgICAgICB3LCAlMywgICUxLCAgJTUgICAgIDt0MCwgdDEKKyAgICBWUDhfTVVMVElQTFlfU1VNU1VCIG0lMiwgbSU0LCBtJTUsbSU2IDt0MiwgdDMKKyAgICBTVU1TVUJfQkEgICAgICAgICB3LCAlNCwgICUzLCAgJTUgICAgIDt0bXAwLCB0bXAzCisgICAgU1VNU1VCX0JBICAgICAgICAgdywgJTIsICAlMSwgICU1ICAgICA7dG1wMSwgdG1wMgorICAgIFNXQVAgICAgICAgICAgICAgICAgICU0LCAgJTEKKyAgICBTV0FQICAgICAgICAgICAgICAgICAlNCwgICUzCislZW5kbWFjcm8KKworJW1hY3JvIFZQOF9JRENUX0FERCAwCitjZ2xvYmFsIHZwOF9pZGN0X2FkZCwgMywgMywgMCwgZHN0LCBibG9jaywgc3RyaWRlCisgICAgOyBsb2FkIGJsb2NrIGRhdGEKKyAgICBtb3ZxICAgICAgICAgbTAsIFtibG9ja3ErIDBdCisgICAgbW92cSAgICAgICAgIG0xLCBbYmxvY2txKyA4XQorICAgIG1vdnEgICAgICAgICBtMiwgW2Jsb2NrcSsxNl0KKyAgICBtb3ZxICAgICAgICAgbTMsIFtibG9ja3ErMjRdCisgICAgbW92cSAgICAgICAgIG02LCBbcHdfMjAwOTFdCisgICAgbW92cSAgICAgICAgIG03LCBbcHdfMTc3MzRdCislaWYgY3B1ZmxhZyhzc2UpCisgICAgeG9ycHMgICAgICB4bW0wLCB4bW0wCisgICAgbW92YXBzIFtibG9ja3ErIDBdLCB4bW0wCisgICAgbW92YXBzIFtibG9ja3ErMTZdLCB4bW0wCislZWxzZQorICAgIHB4b3IgICAgICAgICBtNCwgbTQKKyAgICBtb3ZxIFtibG9ja3ErIDBdLCBtNAorICAgIG1vdnEgW2Jsb2NrcSsgOF0sIG00CisgICAgbW92cSBbYmxvY2txKzE2XSwgbTQKKyAgICBtb3ZxIFtibG9ja3ErMjRdLCBtNAorJWVuZGlmCisKKyAgICA7IGFjdHVhbCBJRENUCisgICAgVlA4X0lEQ1RfVFJBTlNGT1JNNHg0XzFEIDAsIDEsIDIsIDMsIDQsIDUKKyAgICBUUkFOU1BPU0U0eDRXICAgICAgICAgICAgMCwgMSwgMiwgMywgNAorICAgIHBhZGR3ICAgICAgICBtMCwgW3B3XzRdCisgICAgVlA4X0lEQ1RfVFJBTlNGT1JNNHg0XzFEIDAsIDEsIDIsIDMsIDQsIDUKKyAgICBUUkFOU1BPU0U0eDRXICAgICAgICAgICAgMCwgMSwgMiwgMywgNAorCisgICAgOyBzdG9yZQorICAgIHB4b3IgICAgICAgICBtNCwgbTQKKyAgICBERUZJTkVfQVJHUyBkc3QxLCBkc3QyLCBzdHJpZGUKKyAgICBsZWEgICAgICAgZHN0MnEsIFtkc3QxcSsyKnN0cmlkZXFdCisgICAgU1RPUkVfRElGRngyIG0wLCBtMSwgbTYsIG03LCBtNCwgMywgZHN0MXEsIHN0cmlkZXEKKyAgICBTVE9SRV9ESUZGeDIgbTIsIG0zLCBtNiwgbTcsIG00LCAzLCBkc3QycSwgc3RyaWRlcQorCisgICAgUkVUCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzMyCitJTklUX01NWCBtbXgKK1ZQOF9JRENUX0FERAorJWVuZGlmCitJTklUX01NWCBzc2UKK1ZQOF9JRENUX0FERAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl92cDhfbHVtYV9kY193aHQoaW50MTZfdCBibG9ja1s0XVs0XVsxNl0sIGludDE2X3QgZGNbMTZdKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBTQ0FUVEVSX1dIVCAzCisgICAgbW92ZCBkYzFkLCBtJTEKKyAgICBtb3ZkIGRjMmQsIG0lMgorICAgIG1vdiBbYmxvY2txKzIqMTYqKDArJTMpXSwgZGMxdworICAgIG1vdiBbYmxvY2txKzIqMTYqKDErJTMpXSwgZGMydworICAgIHNociAgZGMxZCwgMTYKKyAgICBzaHIgIGRjMmQsIDE2CisgICAgcHNybHEgbSUxLCAzMgorICAgIHBzcmxxIG0lMiwgMzIKKyAgICBtb3YgW2Jsb2NrcSsyKjE2Kig0KyUzKV0sIGRjMXcKKyAgICBtb3YgW2Jsb2NrcSsyKjE2Kig1KyUzKV0sIGRjMncKKyAgICBtb3ZkIGRjMWQsIG0lMQorICAgIG1vdmQgZGMyZCwgbSUyCisgICAgbW92IFtibG9ja3ErMioxNiooOCslMyldLCBkYzF3CisgICAgbW92IFtibG9ja3ErMioxNiooOSslMyldLCBkYzJ3CisgICAgc2hyICBkYzFkLCAxNgorICAgIHNociAgZGMyZCwgMTYKKyAgICBtb3YgW2Jsb2NrcSsyKjE2KigxMislMyldLCBkYzF3CisgICAgbW92IFtibG9ja3ErMioxNiooMTMrJTMpXSwgZGMydworJWVuZG1hY3JvCisKKyVtYWNybyBIQURBTUFSRDRfMUQgNAorICAgIFNVTVNVQl9CQURDIHcsICUyLCAlMSwgJTQsICUzCisgICAgU1VNU1VCX0JBREMgdywgJTQsICUyLCAlMywgJTEKKyAgICBTV0FQICUxLCAlNCwgJTMKKyVlbmRtYWNybworCislbWFjcm8gVlA4X0RDX1dIVCAwCitjZ2xvYmFsIHZwOF9sdW1hX2RjX3dodCwgMiwgMywgMCwgYmxvY2ssIGRjMSwgZGMyCisgICAgbW92cSAgICAgICAgICBtMCwgW2RjMXFdCisgICAgbW92cSAgICAgICAgICBtMSwgW2RjMXErOF0KKyAgICBtb3ZxICAgICAgICAgIG0yLCBbZGMxcSsxNl0KKyAgICBtb3ZxICAgICAgICAgIG0zLCBbZGMxcSsyNF0KKyVpZiBjcHVmbGFnKHNzZSkKKyAgICB4b3JwcyAgICAgIHhtbTAsIHhtbTAKKyAgICBtb3ZhcHMgW2RjMXErIDBdLCB4bW0wCisgICAgbW92YXBzIFtkYzFxKzE2XSwgeG1tMAorJWVsc2UKKyAgICBweG9yICAgICAgICAgbTQsIG00CisgICAgbW92cSAgW2RjMXErIDBdLCBtNAorICAgIG1vdnEgIFtkYzFxKyA4XSwgbTQKKyAgICBtb3ZxICBbZGMxcSsxNl0sIG00CisgICAgbW92cSAgW2RjMXErMjRdLCBtNAorJWVuZGlmCisgICAgSEFEQU1BUkQ0XzFEICAwLCAxLCAyLCAzCisgICAgVFJBTlNQT1NFNHg0VyAwLCAxLCAyLCAzLCA0CisgICAgcGFkZHcgICAgICAgICBtMCwgW3B3XzNdCisgICAgSEFEQU1BUkQ0XzFEICAwLCAxLCAyLCAzCisgICAgcHNyYXcgICAgICAgICBtMCwgMworICAgIHBzcmF3ICAgICAgICAgbTEsIDMKKyAgICBwc3JhdyAgICAgICAgIG0yLCAzCisgICAgcHNyYXcgICAgICAgICBtMywgMworICAgIFNDQVRURVJfV0hUICAgMCwgMSwgMAorICAgIFNDQVRURVJfV0hUICAgMiwgMywgMgorICAgIFJFVAorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggbW14CitWUDhfRENfV0hUCislZW5kaWYKK0lOSVRfTU1YIHNzZQorVlA4X0RDX1dIVApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwOGRzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA4ZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjY4ZjkxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwOGRzcF9pbml0LmMKQEAgLTAsMCArMSw0NjUgQEAKKy8qCisgKiBWUDggRFNQIGZ1bmN0aW9ucyB4ODYtb3B0aW1pemVkCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amVAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDEwIEZpb25hIEdsYXNlciA8ZmlvbmFAeDI2NC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdnA4ZHNwLmgiCisKKyNpZiBIQVZFX1lBU00KKworLyoKKyAqIE1DIGZ1bmN0aW9ucworICovCit2b2lkIGZmX3B1dF92cDhfZXBlbDRfaDRfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfZXBlbDRfaDZfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfZXBlbDRfdjRfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfZXBlbDRfdjZfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSk7CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF9oNF9zc2UyICAodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF9oNl9zc2UyICAodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF92NF9zc2UyICAodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF92Nl9zc2UyICAodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBteCwgaW50IG15KTsKKwordm9pZCBmZl9wdXRfdnA4X2VwZWw0X2g0X3Nzc2UzICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWw0X2g2X3Nzc2UzICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWw0X3Y0X3Nzc2UzICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWw0X3Y2X3Nzc2UzICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWw4X2g0X3Nzc2UzICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWw4X2g2X3Nzc2UzICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWw4X3Y0X3Nzc2UzICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWw4X3Y2X3Nzc2UzICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IG14LCBpbnQgbXkpOworCit2b2lkIGZmX3B1dF92cDhfYmlsaW5lYXI0X2hfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfYmlsaW5lYXI4X2hfc3NlMiAgKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfYmlsaW5lYXI0X2hfc3NzZTMgKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfYmlsaW5lYXI4X2hfc3NzZTMgKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSk7CisKK3ZvaWQgZmZfcHV0X3ZwOF9iaWxpbmVhcjRfdl9tbXhleHQodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9iaWxpbmVhcjhfdl9zc2UyICAodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9iaWxpbmVhcjRfdl9zc3NlMyAodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9iaWxpbmVhcjhfdl9zc3NlMyAodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBteCwgaW50IG15KTsKKworCit2b2lkIGZmX3B1dF92cDhfcGl4ZWxzOF9tbXggKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfcGl4ZWxzMTZfbW14KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfcGl4ZWxzMTZfc3NlKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSk7CisKKyNkZWZpbmUgVEFQX1cxNihPUFQsIEZJTFRFUlRZUEUsIFRBUFRZUEUpIFwKK3N0YXRpYyB2b2lkIGZmX3B1dF92cDhfICMjIEZJTFRFUlRZUEUgIyMgMTZfICMjIFRBUFRZUEUgIyMgXyAjIyBPUFQoIFwKKyAgICB1aW50OF90ICpkc3QsICBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsIFwKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSkgXAoreyBcCisgICAgZmZfcHV0X3ZwOF8gIyMgRklMVEVSVFlQRSAjIyA4XyAjIyBUQVBUWVBFICMjIF8gIyMgT1BUKCBcCisgICAgICAgIGRzdCwgICAgIGRzdHN0cmlkZSwgc3JjLCAgICAgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCBteSk7IFwKKyAgICBmZl9wdXRfdnA4XyAjIyBGSUxURVJUWVBFICMjIDhfICMjIFRBUFRZUEUgIyMgXyAjIyBPUFQoIFwKKyAgICAgICAgZHN0ICsgOCwgZHN0c3RyaWRlLCBzcmMgKyA4LCBzcmNzdHJpZGUsIGhlaWdodCwgbXgsIG15KTsgXAorfQorI2RlZmluZSBUQVBfVzgoT1BULCBGSUxURVJUWVBFLCBUQVBUWVBFKSBcCitzdGF0aWMgdm9pZCBmZl9wdXRfdnA4XyAjIyBGSUxURVJUWVBFICMjIDhfICMjIFRBUFRZUEUgIyMgXyAjIyBPUFQoIFwKKyAgICB1aW50OF90ICpkc3QsICBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsIFwKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgbXgsIGludCBteSkgXAoreyBcCisgICAgZmZfcHV0X3ZwOF8gIyMgRklMVEVSVFlQRSAjIyA0XyAjIyBUQVBUWVBFICMjIF8gIyMgT1BUKCBcCisgICAgICAgIGRzdCwgICAgIGRzdHN0cmlkZSwgc3JjLCAgICAgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCBteSk7IFwKKyAgICBmZl9wdXRfdnA4XyAjIyBGSUxURVJUWVBFICMjIDRfICMjIFRBUFRZUEUgIyMgXyAjIyBPUFQoIFwKKyAgICAgICAgZHN0ICsgNCwgZHN0c3RyaWRlLCBzcmMgKyA0LCBzcmNzdHJpZGUsIGhlaWdodCwgbXgsIG15KTsgXAorfQorCisjaWYgQVJDSF9YODZfMzIKK1RBUF9XOCAobW14ZXh0LCBlcGVsLCBoNCkKK1RBUF9XOCAobW14ZXh0LCBlcGVsLCBoNikKK1RBUF9XMTYobW14ZXh0LCBlcGVsLCBoNikKK1RBUF9XOCAobW14ZXh0LCBlcGVsLCB2NCkKK1RBUF9XOCAobW14ZXh0LCBlcGVsLCB2NikKK1RBUF9XMTYobW14ZXh0LCBlcGVsLCB2NikKK1RBUF9XOCAobW14ZXh0LCBiaWxpbmVhciwgaCkKK1RBUF9XMTYobW14ZXh0LCBiaWxpbmVhciwgaCkKK1RBUF9XOCAobW14ZXh0LCBiaWxpbmVhciwgdikKK1RBUF9XMTYobW14ZXh0LCBiaWxpbmVhciwgdikKKyNlbmRpZgorCitUQVBfVzE2KHNzZTIsICBlcGVsLCBoNikKK1RBUF9XMTYoc3NlMiwgIGVwZWwsIHY2KQorVEFQX1cxNihzc2UyLCAgYmlsaW5lYXIsIGgpCitUQVBfVzE2KHNzZTIsICBiaWxpbmVhciwgdikKKworVEFQX1cxNihzc3NlMywgZXBlbCwgaDYpCitUQVBfVzE2KHNzc2UzLCBlcGVsLCB2NikKK1RBUF9XMTYoc3NzZTMsIGJpbGluZWFyLCBoKQorVEFQX1cxNihzc3NlMywgYmlsaW5lYXIsIHYpCisKKyNkZWZpbmUgSFZUQVAoT1BULCBBTElHTiwgVEFQTlVNWCwgVEFQTlVNWSwgU0laRSwgTUFYSEVJR0hUKSBcCitzdGF0aWMgdm9pZCBmZl9wdXRfdnA4X2VwZWwgIyMgU0laRSAjIyBfaCAjIyBUQVBOVU1YICMjIHYgIyMgVEFQTlVNWSAjIyBfICMjIE9QVCggXAorICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLCBcCisgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGhlaWdodCwgaW50IG14LCBpbnQgbXkpIFwKK3sgXAorICAgIERFQ0xBUkVfQUxJR05FRChBTElHTiwgdWludDhfdCwgdG1wKVtTSVpFICogKE1BWEhFSUdIVCArIFRBUE5VTVkgLSAxKV07IFwKKyAgICB1aW50OF90ICp0bXBwdHIgPSB0bXAgKyBTSVpFICogKFRBUE5VTVkgLyAyIC0gMSk7IFwKKyAgICBzcmMgLT0gc3Jjc3RyaWRlICogKFRBUE5VTVkgLyAyIC0gMSk7IFwKKyAgICBmZl9wdXRfdnA4X2VwZWwgIyMgU0laRSAjIyBfaCAjIyBUQVBOVU1YICMjIF8gIyMgT1BUKCBcCisgICAgICAgIHRtcCwgU0laRSwgICAgICBzcmMsICAgIHNyY3N0cmlkZSwgaGVpZ2h0ICsgVEFQTlVNWSAtIDEsIG14LCBteSk7IFwKKyAgICBmZl9wdXRfdnA4X2VwZWwgIyMgU0laRSAjIyBfdiAjIyBUQVBOVU1ZICMjIF8gIyMgT1BUKCBcCisgICAgICAgIGRzdCwgZHN0c3RyaWRlLCB0bXBwdHIsIFNJWkUsICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgIG14LCBteSk7IFwKK30KKworI2lmIEFSQ0hfWDg2XzMyCisjZGVmaW5lIEhWVEFQTU1YKHgsIHkpIFwKK0hWVEFQKG1teGV4dCwgOCwgeCwgeSwgIDQsICA4KSBcCitIVlRBUChtbXhleHQsIDgsIHgsIHksICA4LCAxNikKKworSFZUQVAobW14ZXh0LCA4LCA2LCA2LCAxNiwgMTYpCisjZWxzZQorI2RlZmluZSBIVlRBUE1NWCh4LCB5KSBcCitIVlRBUChtbXhleHQsIDgsIHgsIHksICA0LCAgOCkKKyNlbmRpZgorCitIVlRBUE1NWCg0LCA0KQorSFZUQVBNTVgoNCwgNikKK0hWVEFQTU1YKDYsIDQpCitIVlRBUE1NWCg2LCA2KQorCisjZGVmaW5lIEhWVEFQU1NFMih4LCB5LCB3KSBcCitIVlRBUChzc2UyLCAgMTYsIHgsIHksIHcsIDE2KSBcCitIVlRBUChzc3NlMywgMTYsIHgsIHksIHcsIDE2KQorCitIVlRBUFNTRTIoNCwgNCwgOCkKK0hWVEFQU1NFMig0LCA2LCA4KQorSFZUQVBTU0UyKDYsIDQsIDgpCitIVlRBUFNTRTIoNiwgNiwgOCkKK0hWVEFQU1NFMig2LCA2LCAxNikKKworSFZUQVAoc3NzZTMsIDE2LCA0LCA0LCA0LCA4KQorSFZUQVAoc3NzZTMsIDE2LCA0LCA2LCA0LCA4KQorSFZUQVAoc3NzZTMsIDE2LCA2LCA0LCA0LCA4KQorSFZUQVAoc3NzZTMsIDE2LCA2LCA2LCA0LCA4KQorCisjZGVmaW5lIEhWQklMSU4oT1BULCBBTElHTiwgU0laRSwgTUFYSEVJR0hUKSBcCitzdGF0aWMgdm9pZCBmZl9wdXRfdnA4X2JpbGluZWFyICMjIFNJWkUgIyMgX2h2XyAjIyBPUFQoIFwKKyAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywgXAorICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoZWlnaHQsIGludCBteCwgaW50IG15KSBcCit7IFwKKyAgICBERUNMQVJFX0FMSUdORUQoQUxJR04sIHVpbnQ4X3QsIHRtcClbU0laRSAqIChNQVhIRUlHSFQgKyAyKV07IFwKKyAgICBmZl9wdXRfdnA4X2JpbGluZWFyICMjIFNJWkUgIyMgX2hfICMjIE9QVCggXAorICAgICAgICB0bXAsIFNJWkUsICAgICAgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCArIDEsIG14LCBteSk7IFwKKyAgICBmZl9wdXRfdnA4X2JpbGluZWFyICMjIFNJWkUgIyMgX3ZfICMjIE9QVCggXAorICAgICAgICBkc3QsIGRzdHN0cmlkZSwgdG1wLCBTSVpFLCAgICAgIGhlaWdodCwgICAgIG14LCBteSk7IFwKK30KKworSFZCSUxJTihtbXhleHQsICA4LCAgNCwgIDgpCisjaWYgQVJDSF9YODZfMzIKK0hWQklMSU4obW14ZXh0LCAgOCwgIDgsIDE2KQorSFZCSUxJTihtbXhleHQsICA4LCAxNiwgMTYpCisjZW5kaWYKK0hWQklMSU4oc3NlMiwgIDgsICA4LCAxNikKK0hWQklMSU4oc3NlMiwgIDgsIDE2LCAxNikKK0hWQklMSU4oc3NzZTMsIDgsICA0LCAgOCkKK0hWQklMSU4oc3NzZTMsIDgsICA4LCAxNikKK0hWQklMSU4oc3NzZTMsIDgsIDE2LCAxNikKKwordm9pZCBmZl92cDhfaWRjdF9kY19hZGRfbW14KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3ZwOF9pZGN0X2RjX2FkZF9zc2U0KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl92cDhfaWRjdF9kY19hZGQ0eV9tbXgodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzRdWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkNHlfc3NlMih1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbNF1bMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl92cDhfaWRjdF9kY19hZGQ0dXZfbW14KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1syXVsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3ZwOF9sdW1hX2RjX3dodF9tbXgoaW50MTZfdCBibG9ja1s0XVs0XVsxNl0sIGludDE2X3QgZGNbMTZdKTsKK3ZvaWQgZmZfdnA4X2x1bWFfZGNfd2h0X3NzZShpbnQxNl90IGJsb2NrWzRdWzRdWzE2XSwgaW50MTZfdCBkY1sxNl0pOwordm9pZCBmZl92cDhfaWRjdF9hZGRfbW14KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl92cDhfaWRjdF9hZGRfc3NlKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIHB0cmRpZmZfdCBzdHJpZGUpOworCisjZGVmaW5lIERFQ0xBUkVfTE9PUF9GSUxURVIoTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3ZwOF92X2xvb3BfZmlsdGVyX3NpbXBsZV8gIyMgTkFNRSh1aW50OF90ICpkc3QsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxpbSk7ICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3ZwOF9oX2xvb3BfZmlsdGVyX3NpbXBsZV8gIyMgTkFNRSh1aW50OF90ICpkc3QsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxpbSk7ICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3ZwOF92X2xvb3BfZmlsdGVyMTZ5X2lubmVyXyAjIyBOQU1FICh1aW50OF90ICpkc3QsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZSwgaW50IGksIGludCBodnQpOyAgICBcCit2b2lkIGZmX3ZwOF9oX2xvb3BfZmlsdGVyMTZ5X2lubmVyXyAjIyBOQU1FICh1aW50OF90ICpkc3QsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZSwgaW50IGksIGludCBodnQpOyAgICBcCit2b2lkIGZmX3ZwOF92X2xvb3BfZmlsdGVyOHV2X2lubmVyXyAjIyBOQU1FICh1aW50OF90ICpkc3RVLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RWLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcywgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZSwgaW50IGksIGludCBodnQpOyAgICBcCit2b2lkIGZmX3ZwOF9oX2xvb3BfZmlsdGVyOHV2X2lubmVyXyAjIyBOQU1FICh1aW50OF90ICpkc3RVLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RWLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcywgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZSwgaW50IGksIGludCBodnQpOyAgICBcCit2b2lkIGZmX3ZwOF92X2xvb3BfZmlsdGVyMTZ5X21iZWRnZV8gIyMgTkFNRSh1aW50OF90ICpkc3QsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZSwgaW50IGksIGludCBodnQpOyAgICBcCit2b2lkIGZmX3ZwOF9oX2xvb3BfZmlsdGVyMTZ5X21iZWRnZV8gIyMgTkFNRSh1aW50OF90ICpkc3QsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZSwgaW50IGksIGludCBodnQpOyAgICBcCit2b2lkIGZmX3ZwOF92X2xvb3BfZmlsdGVyOHV2X21iZWRnZV8gIyMgTkFNRSh1aW50OF90ICpkc3RVLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RWLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcywgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZSwgaW50IGksIGludCBodnQpOyAgICBcCit2b2lkIGZmX3ZwOF9oX2xvb3BfZmlsdGVyOHV2X21iZWRnZV8gIyMgTkFNRSh1aW50OF90ICpkc3RVLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RWLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcywgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZSwgaW50IGksIGludCBodnQpOworCitERUNMQVJFX0xPT1BfRklMVEVSKG1teCkKK0RFQ0xBUkVfTE9PUF9GSUxURVIobW14ZXh0KQorREVDTEFSRV9MT09QX0ZJTFRFUihzc2UyKQorREVDTEFSRV9MT09QX0ZJTFRFUihzc3NlMykKK0RFQ0xBUkVfTE9PUF9GSUxURVIoc3NlNCkKKworI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworCisjZGVmaW5lIFZQOF9MVU1BX01DX0ZVTkMoSURYLCBTSVpFLCBPUFQpIFwKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYltJRFhdWzBdWzJdID0gZmZfcHV0X3ZwOF9lcGVsICMjIFNJWkUgIyMgX2g2XyAjIyBPUFQ7IFwKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYltJRFhdWzJdWzBdID0gZmZfcHV0X3ZwOF9lcGVsICMjIFNJWkUgIyMgX3Y2XyAjIyBPUFQ7IFwKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYltJRFhdWzJdWzJdID0gZmZfcHV0X3ZwOF9lcGVsICMjIFNJWkUgIyMgX2g2djZfICMjIE9QVAorCisjZGVmaW5lIFZQOF9NQ19GVU5DKElEWCwgU0laRSwgT1BUKSBcCisgICAgYy0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbSURYXVswXVsxXSA9IGZmX3B1dF92cDhfZXBlbCAjIyBTSVpFICMjIF9oNF8gIyMgT1BUOyBcCisgICAgYy0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbSURYXVsxXVswXSA9IGZmX3B1dF92cDhfZXBlbCAjIyBTSVpFICMjIF92NF8gIyMgT1BUOyBcCisgICAgYy0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbSURYXVsxXVsxXSA9IGZmX3B1dF92cDhfZXBlbCAjIyBTSVpFICMjIF9oNHY0XyAjIyBPUFQ7IFwKKyAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYltJRFhdWzFdWzJdID0gZmZfcHV0X3ZwOF9lcGVsICMjIFNJWkUgIyMgX2g2djRfICMjIE9QVDsgXAorICAgIGMtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiW0lEWF1bMl1bMV0gPSBmZl9wdXRfdnA4X2VwZWwgIyMgU0laRSAjIyBfaDR2Nl8gIyMgT1BUOyBcCisgICAgVlA4X0xVTUFfTUNfRlVOQyhJRFgsIFNJWkUsIE9QVCkKKworI2RlZmluZSBWUDhfQklMSU5FQVJfTUNfRlVOQyhJRFgsIFNJWkUsIE9QVCkgXAorICAgIGMtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYltJRFhdWzBdWzFdID0gZmZfcHV0X3ZwOF9iaWxpbmVhciAjIyBTSVpFICMjIF9oXyAjIyBPUFQ7IFwKKyAgICBjLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbSURYXVswXVsyXSA9IGZmX3B1dF92cDhfYmlsaW5lYXIgIyMgU0laRSAjIyBfaF8gIyMgT1BUOyBcCisgICAgYy0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiW0lEWF1bMV1bMF0gPSBmZl9wdXRfdnA4X2JpbGluZWFyICMjIFNJWkUgIyMgX3ZfICMjIE9QVDsgXAorICAgIGMtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYltJRFhdWzFdWzFdID0gZmZfcHV0X3ZwOF9iaWxpbmVhciAjIyBTSVpFICMjIF9odl8gIyMgT1BUOyBcCisgICAgYy0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiW0lEWF1bMV1bMl0gPSBmZl9wdXRfdnA4X2JpbGluZWFyICMjIFNJWkUgIyMgX2h2XyAjIyBPUFQ7IFwKKyAgICBjLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbSURYXVsyXVswXSA9IGZmX3B1dF92cDhfYmlsaW5lYXIgIyMgU0laRSAjIyBfdl8gIyMgT1BUOyBcCisgICAgYy0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiW0lEWF1bMl1bMV0gPSBmZl9wdXRfdnA4X2JpbGluZWFyICMjIFNJWkUgIyMgX2h2XyAjIyBPUFQ7IFwKKyAgICBjLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbSURYXVsyXVsyXSA9IGZmX3B1dF92cDhfYmlsaW5lYXIgIyMgU0laRSAjIyBfaHZfICMjIE9QVAorCisKK2F2X2NvbGQgdm9pZCBmZl92cDc4ZHNwX2luaXRfeDg2KFZQOERTUENvbnRleHQgKmMpCit7CisjaWYgSEFWRV9ZQVNNCisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgeworI2lmIEFSQ0hfWDg2XzMyCisgICAgICAgIGMtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzBdWzBdWzBdICAgICA9CisgICAgICAgIGMtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVswXVswXSA9IGZmX3B1dF92cDhfcGl4ZWxzMTZfbW14OworI2VuZGlmCisgICAgICAgIGMtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzFdWzBdWzBdICAgICA9CisgICAgICAgIGMtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsxXVswXVswXSA9IGZmX3B1dF92cDhfcGl4ZWxzOF9tbXg7CisgICAgfQorCisgICAgLyogbm90ZSB0aGF0IDQtdGFwIHdpZHRoPTE2IGZ1bmN0aW9ucyBhcmUgbWlzc2luZyBiZWNhdXNlIHc9MTYKKyAgICAgKiBpcyBvbmx5IHVzZWQgZm9yIGx1bWEsIGFuZCBsdW1hIGlzIGFsd2F5cyBhIGNvcHkgb3Igc2l4dGFwLiAqLworICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSkgeworICAgICAgICBWUDhfTUNfRlVOQygyLCA0LCBtbXhleHQpOworICAgICAgICBWUDhfQklMSU5FQVJfTUNfRlVOQygyLCA0LCBtbXhleHQpOworI2lmIEFSQ0hfWDg2XzMyCisgICAgICAgIFZQOF9MVU1BX01DX0ZVTkMoMCwgMTYsIG1teGV4dCk7CisgICAgICAgIFZQOF9NQ19GVU5DKDEsIDgsIG1teGV4dCk7CisgICAgICAgIFZQOF9CSUxJTkVBUl9NQ19GVU5DKDAsIDE2LCBtbXhleHQpOworICAgICAgICBWUDhfQklMSU5FQVJfTUNfRlVOQygxLCAgOCwgbW14ZXh0KTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU0UoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlswXVswXVswXSAgICAgPQorICAgICAgICBjLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMF1bMF1bMF0gPSBmZl9wdXRfdnA4X3BpeGVsczE2X3NzZTsKKyAgICB9CisKKyAgICBpZiAoSEFWRV9TU0UyX0VYVEVSTkFMICYmIGNwdV9mbGFncyAmIChBVl9DUFVfRkxBR19TU0UyIHwgQVZfQ1BVX0ZMQUdfU1NFMlNMT1cpKSB7CisgICAgICAgIFZQOF9MVU1BX01DX0ZVTkMoMCwgMTYsIHNzZTIpOworICAgICAgICBWUDhfTUNfRlVOQygxLCA4LCBzc2UyKTsKKyAgICAgICAgVlA4X0JJTElORUFSX01DX0ZVTkMoMCwgMTYsIHNzZTIpOworICAgICAgICBWUDhfQklMSU5FQVJfTUNfRlVOQygxLCA4LCBzc2UyKTsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NTRTMoY3B1X2ZsYWdzKSkgeworICAgICAgICBWUDhfTFVNQV9NQ19GVU5DKDAsIDE2LCBzc3NlMyk7CisgICAgICAgIFZQOF9NQ19GVU5DKDEsIDgsIHNzc2UzKTsKKyAgICAgICAgVlA4X01DX0ZVTkMoMiwgNCwgc3NzZTMpOworICAgICAgICBWUDhfQklMSU5FQVJfTUNfRlVOQygwLCAxNiwgc3NzZTMpOworICAgICAgICBWUDhfQklMSU5FQVJfTUNfRlVOQygxLCA4LCBzc3NlMyk7CisgICAgICAgIFZQOF9CSUxJTkVBUl9NQ19GVU5DKDIsIDQsIHNzc2UzKTsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9ZQVNNICovCit9CisKK2F2X2NvbGQgdm9pZCBmZl92cDhkc3BfaW5pdF94ODYoVlA4RFNQQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFX1lBU00KKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnZwOF9pZGN0X2RjX2FkZCAgICA9IGZmX3ZwOF9pZGN0X2RjX2FkZF9tbXg7CisgICAgICAgIGMtPnZwOF9pZGN0X2RjX2FkZDR1diA9IGZmX3ZwOF9pZGN0X2RjX2FkZDR1dl9tbXg7CisjaWYgQVJDSF9YODZfMzIKKyAgICAgICAgYy0+dnA4X2lkY3RfZGNfYWRkNHkgID0gZmZfdnA4X2lkY3RfZGNfYWRkNHlfbW14OworICAgICAgICBjLT52cDhfaWRjdF9hZGQgICAgICAgPSBmZl92cDhfaWRjdF9hZGRfbW14OworICAgICAgICBjLT52cDhfbHVtYV9kY193aHQgICAgPSBmZl92cDhfbHVtYV9kY193aHRfbW14OworCisgICAgICAgIGMtPnZwOF92X2xvb3BfZmlsdGVyX3NpbXBsZSA9IGZmX3ZwOF92X2xvb3BfZmlsdGVyX3NpbXBsZV9tbXg7CisgICAgICAgIGMtPnZwOF9oX2xvb3BfZmlsdGVyX3NpbXBsZSA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyX3NpbXBsZV9tbXg7CisKKyAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXIxNnlfaW5uZXIgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjE2eV9pbm5lcl9tbXg7CisgICAgICAgIGMtPnZwOF9oX2xvb3BfZmlsdGVyMTZ5X2lubmVyID0gZmZfdnA4X2hfbG9vcF9maWx0ZXIxNnlfaW5uZXJfbW14OworICAgICAgICBjLT52cDhfdl9sb29wX2ZpbHRlcjh1dl9pbm5lciA9IGZmX3ZwOF92X2xvb3BfZmlsdGVyOHV2X2lubmVyX21teDsKKyAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXI4dXZfaW5uZXIgPSBmZl92cDhfaF9sb29wX2ZpbHRlcjh1dl9pbm5lcl9tbXg7CisKKyAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXIxNnkgICAgICAgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjE2eV9tYmVkZ2VfbW14OworICAgICAgICBjLT52cDhfaF9sb29wX2ZpbHRlcjE2eSAgICAgICA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyMTZ5X21iZWRnZV9tbXg7CisgICAgICAgIGMtPnZwOF92X2xvb3BfZmlsdGVyOHV2ICAgICAgID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXI4dXZfbWJlZGdlX21teDsKKyAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXI4dXYgICAgICAgPSBmZl92cDhfaF9sb29wX2ZpbHRlcjh1dl9tYmVkZ2VfbW14OworI2VuZGlmCisgICAgfQorCisgICAgLyogbm90ZSB0aGF0IDQtdGFwIHdpZHRoPTE2IGZ1bmN0aW9ucyBhcmUgbWlzc2luZyBiZWNhdXNlIHc9MTYKKyAgICAgKiBpcyBvbmx5IHVzZWQgZm9yIGx1bWEsIGFuZCBsdW1hIGlzIGFsd2F5cyBhIGNvcHkgb3Igc2l4dGFwLiAqLworICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSkgeworI2lmIEFSQ0hfWDg2XzMyCisgICAgICAgIGMtPnZwOF92X2xvb3BfZmlsdGVyX3NpbXBsZSAgID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlX21teGV4dDsKKyAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXJfc2ltcGxlICAgPSBmZl92cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGVfbW14ZXh0OworCisgICAgICAgIGMtPnZwOF92X2xvb3BfZmlsdGVyMTZ5X2lubmVyID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXIxNnlfaW5uZXJfbW14ZXh0OworICAgICAgICBjLT52cDhfaF9sb29wX2ZpbHRlcjE2eV9pbm5lciA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyMTZ5X2lubmVyX21teGV4dDsKKyAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXI4dXZfaW5uZXIgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjh1dl9pbm5lcl9tbXhleHQ7CisgICAgICAgIGMtPnZwOF9oX2xvb3BfZmlsdGVyOHV2X2lubmVyID0gZmZfdnA4X2hfbG9vcF9maWx0ZXI4dXZfaW5uZXJfbW14ZXh0OworCisgICAgICAgIGMtPnZwOF92X2xvb3BfZmlsdGVyMTZ5ICAgICAgID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXIxNnlfbWJlZGdlX21teGV4dDsKKyAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXIxNnkgICAgICAgPSBmZl92cDhfaF9sb29wX2ZpbHRlcjE2eV9tYmVkZ2VfbW14ZXh0OworICAgICAgICBjLT52cDhfdl9sb29wX2ZpbHRlcjh1diAgICAgICA9IGZmX3ZwOF92X2xvb3BfZmlsdGVyOHV2X21iZWRnZV9tbXhleHQ7CisgICAgICAgIGMtPnZwOF9oX2xvb3BfZmlsdGVyOHV2ICAgICAgID0gZmZfdnA4X2hfbG9vcF9maWx0ZXI4dXZfbWJlZGdlX21teGV4dDsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9TU0UoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT52cDhfaWRjdF9hZGQgICAgICAgICAgICAgICAgICAgICAgICAgPSBmZl92cDhfaWRjdF9hZGRfc3NlOworICAgICAgICBjLT52cDhfbHVtYV9kY193aHQgICAgICAgICAgICAgICAgICAgICAgPSBmZl92cDhfbHVtYV9kY193aHRfc3NlOworICAgIH0KKworICAgIGlmIChIQVZFX1NTRTJfRVhURVJOQUwgJiYgY3B1X2ZsYWdzICYgKEFWX0NQVV9GTEFHX1NTRTIgfCBBVl9DUFVfRkxBR19TU0UyU0xPVykpIHsKKyAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlX3NzZTI7CisKKyAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXIxNnlfaW5uZXIgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjE2eV9pbm5lcl9zc2UyOworICAgICAgICBjLT52cDhfdl9sb29wX2ZpbHRlcjh1dl9pbm5lciA9IGZmX3ZwOF92X2xvb3BfZmlsdGVyOHV2X2lubmVyX3NzZTI7CisKKyAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXIxNnkgICAgICAgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjE2eV9tYmVkZ2Vfc3NlMjsKKyAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXI4dXYgICAgICAgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjh1dl9tYmVkZ2Vfc3NlMjsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnZwOF9pZGN0X2RjX2FkZDR5ICAgICAgICAgID0gZmZfdnA4X2lkY3RfZGNfYWRkNHlfc3NlMjsKKworICAgICAgICBjLT52cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGUgICA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyX3NpbXBsZV9zc2UyOworCisgICAgICAgIGMtPnZwOF9oX2xvb3BfZmlsdGVyMTZ5X2lubmVyID0gZmZfdnA4X2hfbG9vcF9maWx0ZXIxNnlfaW5uZXJfc3NlMjsKKyAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXI4dXZfaW5uZXIgPSBmZl92cDhfaF9sb29wX2ZpbHRlcjh1dl9pbm5lcl9zc2UyOworCisgICAgICAgIGMtPnZwOF9oX2xvb3BfZmlsdGVyMTZ5ICAgICAgID0gZmZfdnA4X2hfbG9vcF9maWx0ZXIxNnlfbWJlZGdlX3NzZTI7CisgICAgICAgIGMtPnZwOF9oX2xvb3BfZmlsdGVyOHV2ICAgICAgID0gZmZfdnA4X2hfbG9vcF9maWx0ZXI4dXZfbWJlZGdlX3NzZTI7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlX3Nzc2UzOworICAgICAgICBjLT52cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGUgPSBmZl92cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGVfc3NzZTM7CisKKyAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXIxNnlfaW5uZXIgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjE2eV9pbm5lcl9zc3NlMzsKKyAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXIxNnlfaW5uZXIgPSBmZl92cDhfaF9sb29wX2ZpbHRlcjE2eV9pbm5lcl9zc3NlMzsKKyAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXI4dXZfaW5uZXIgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjh1dl9pbm5lcl9zc3NlMzsKKyAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXI4dXZfaW5uZXIgPSBmZl92cDhfaF9sb29wX2ZpbHRlcjh1dl9pbm5lcl9zc3NlMzsKKworICAgICAgICBjLT52cDhfdl9sb29wX2ZpbHRlcjE2eSAgICAgICA9IGZmX3ZwOF92X2xvb3BfZmlsdGVyMTZ5X21iZWRnZV9zc3NlMzsKKyAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXIxNnkgICAgICAgPSBmZl92cDhfaF9sb29wX2ZpbHRlcjE2eV9tYmVkZ2Vfc3NzZTM7CisgICAgICAgIGMtPnZwOF92X2xvb3BfZmlsdGVyOHV2ICAgICAgID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXI4dXZfbWJlZGdlX3Nzc2UzOworICAgICAgICBjLT52cDhfaF9sb29wX2ZpbHRlcjh1diAgICAgICA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyOHV2X21iZWRnZV9zc3NlMzsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NFNChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPnZwOF9pZGN0X2RjX2FkZCAgICAgICAgICAgID0gZmZfdnA4X2lkY3RfZGNfYWRkX3NzZTQ7CisKKyAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXJfc2ltcGxlICAgPSBmZl92cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGVfc3NlNDsKKyAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXIxNnkgICAgICAgPSBmZl92cDhfaF9sb29wX2ZpbHRlcjE2eV9tYmVkZ2Vfc3NlNDsKKyAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXI4dXYgICAgICAgPSBmZl92cDhfaF9sb29wX2ZpbHRlcjh1dl9tYmVkZ2Vfc3NlNDsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9ZQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA4ZHNwX2xvb3BmaWx0ZXIuYXNtIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwOGRzcF9sb29wZmlsdGVyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGJiNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwOGRzcF9sb29wZmlsdGVyLmFzbQpAQCAtMCwwICsxLDE1ODQgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIFZQOCBNTVhFWFQgb3B0aW1pemF0aW9ucworOyogQ29weXJpZ2h0IChjKSAyMDEwIFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKzsqIENvcHlyaWdodCAoYykgMjAxMCBGaW9uYSBHbGFzZXIgPGZpb25hQHgyNjQuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK3B3XzI3OiAgICB0aW1lcyA4IGR3IDI3Citwd182MzogICAgdGltZXMgOCBkdyA2MworCitwYl80OiAgICAgdGltZXMgMTYgZGIgNAorcGJfRjg6ICAgIHRpbWVzIDE2IGRiIDB4RjgKK3BiX0ZFOiAgICB0aW1lcyAxNiBkYiAweEZFCitwYl8yN182MzogdGltZXMgOCBkYiAyNywgNjMKK3BiXzE4XzYzOiB0aW1lcyA4IGRiIDE4LCA2MworcGJfOV82MzogIHRpbWVzIDggZGIgIDksIDYzCisKK2NleHRlcm4gcGJfMQorY2V4dGVybiBwYl8zCitjZXh0ZXJuIHB3XzkKK2NleHRlcm4gcHdfMTgKK2NleHRlcm4gcGJfODAKKworU0VDVElPTiAudGV4dAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl92cDhfaC92X2xvb3BfZmlsdGVyX3NpbXBsZV88b3B0Pih1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludCBmbGltKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7IG1hY3JvIGNhbGxlZCB3aXRoIDcgbW0gcmVnaXN0ZXIgaW5kZXhlcyBhcyBhcmd1bWVudCwgYW5kIDQgcmVndWxhciByZWdpc3RlcnMKKzsKKzsgZmlyc3QgNCBtbSByZWdpc3RlcnMgd2lsbCBjYXJyeSB0aGUgdHJhbnNwb3NlZCBwaXhlbCBkYXRhCis7IHRoZSBvdGhlciB0aHJlZSBhcmUgc2NyYXRjaHNwYWNlIChvbmUgd291bGQgYmUgc3VmZmljaWVudCwgYnV0IHRoaXMgYWxsb3dzCis7IGZvciBtb3JlIHNwcmVhZGluZy9waXBlbGluaW5nIGFuZCB0aHVzIGZhc3RlciBleGVjdXRpb24gb24gT09FIENQVXMpCis7Cis7IGZpcnN0IHR3byByZWd1bGFyIHJlZ2lzdGVycyBhcmUgYnVmKzQqc3RyaWRlIGFuZCBidWYrNSpzdHJpZGUKKzsgdGhpcmQgaXMgLXN0cmlkZSwgZm91cnRoIGlzICtzdHJpZGUKKyVtYWNybyBSRUFEXzh4NF9JTlRFUkxFQVZFRCAxMQorICAgIDsgaW50ZXJsZWF2ZSA4IChBLUgpIHJvd3Mgb2YgNCBwaXhlbHMgZWFjaAorICAgIG1vdmQgICAgICAgICAgbSUxLCBbJTgrJTEwKjRdICAgOyBBMC0zCisgICAgbW92ZCAgICAgICAgICBtJTUsIFslOSslMTAqNF0gICA7IEIwLTMKKyAgICBtb3ZkICAgICAgICAgIG0lMiwgWyU4KyUxMCoyXSAgIDsgQzAtMworICAgIG1vdmQgICAgICAgICAgbSU2LCBbJTgrJTEwXSAgICAgOyBEMC0zCisgICAgbW92ZCAgICAgICAgICBtJTMsIFslOF0gICAgICAgICA7IEUwLTMKKyAgICBtb3ZkICAgICAgICAgIG0lNywgWyU5XSAgICAgICAgIDsgRjAtMworICAgIG1vdmQgICAgICAgICAgbSU0LCBbJTkrJTExXSAgICAgOyBHMC0zCisgICAgcHVucGNrbGJ3ICAgICBtJTEsIG0lNSAgICAgICAgICA7IEEvQiBpbnRlcmxlYXZlZAorICAgIG1vdmQgICAgICAgICAgbSU1LCBbJTkrJTExKjJdICAgOyBIMC0zCisgICAgcHVucGNrbGJ3ICAgICBtJTIsIG0lNiAgICAgICAgICA7IEMvRCBpbnRlcmxlYXZlZAorICAgIHB1bnBja2xidyAgICAgbSUzLCBtJTcgICAgICAgICAgOyBFL0YgaW50ZXJsZWF2ZWQKKyAgICBwdW5wY2tsYncgICAgIG0lNCwgbSU1ICAgICAgICAgIDsgRy9IIGludGVybGVhdmVkCislZW5kbWFjcm8KKworOyBtYWNybyBjYWxsZWQgd2l0aCA3IG1tIHJlZ2lzdGVyIGluZGV4ZXMgYXMgYXJndW1lbnQsIGFuZCA1IHJlZ3VsYXIgcmVnaXN0ZXJzCis7IGZpcnN0IDExIG1lYW4gdGhlIHNhbWUgYXMgUkVBRF84eDRfVFJBTlNQT1NFRCBhYm92ZQorOyBmaWZ0aCByZWd1bGFyIHJlZ2lzdGVyIGlzIHNjcmF0Y2hzcGFjZSB0byByZWFjaCB0aGUgYm90dG9tIDggcm93cywgaXQKKzsgd2lsbCBiZSBzZXQgdG8gc2Vjb25kIHJlZ3VsYXIgcmVnaXN0ZXIgKyA4KnN0cmlkZSBhdCB0aGUgZW5kCislbWFjcm8gUkVBRF8xNng0X0lOVEVSTEVBVkVEIDEyCisgICAgOyB0cmFuc3Bvc2UgMTYgKEEtUCkgcm93cyBvZiA0IHBpeGVscyBlYWNoCisgICAgbGVhICAgICAgICAgICAlMTIsIFtyMCs4KnIyXQorCisgICAgOyByZWFkIChhbmQgaW50ZXJsZWF2ZSkgdGhvc2UgYWRkcmVzc2FibGUgYnkgJTggKD1yMCksIEEvQy9EL0UvSS9LL0wvTQorICAgIG1vdmQgICAgICAgICAgbSUxLCBbJTgrJTEwKjRdICAgOyBBMC0zCisgICAgbW92ZCAgICAgICAgICBtJTMsIFslMTIrJTEwKjRdICA7IEkwLTMKKyAgICBtb3ZkICAgICAgICAgIG0lMiwgWyU4KyUxMCoyXSAgIDsgQzAtMworICAgIG1vdmQgICAgICAgICAgbSU0LCBbJTEyKyUxMCoyXSAgOyBLMC0zCisgICAgbW92ZCAgICAgICAgICBtJTYsIFslOCslMTBdICAgICA7IEQwLTMKKyAgICBtb3ZkICAgICAgICAgIG0lNSwgWyUxMislMTBdICAgIDsgTDAtMworICAgIG1vdmQgICAgICAgICAgbSU3LCBbJTEyXSAgICAgICAgOyBNMC0zCisgICAgYWRkICAgICAgICAgICAlMTIsICUxMQorICAgIHB1bnBja2xidyAgICAgbSUxLCBtJTMgICAgICAgICAgOyBBL0kKKyAgICBtb3ZkICAgICAgICAgIG0lMywgWyU4XSAgICAgICAgIDsgRTAtMworICAgIHB1bnBja2xidyAgICAgbSUyLCBtJTQgICAgICAgICAgOyBDL0sKKyAgICBwdW5wY2tsYncgICAgIG0lNiwgbSU1ICAgICAgICAgIDsgRC9MCisgICAgcHVucGNrbGJ3ICAgICBtJTMsIG0lNyAgICAgICAgICA7IEUvTQorICAgIHB1bnBja2xidyAgICAgbSUyLCBtJTYgICAgICAgICAgOyBDL0QvSy9MIGludGVybGVhdmVkCisKKyAgICA7IHJlYWQgKGFuZCBpbnRlcmxlYXZlKSB0aG9zZSBhZGRyZXNzYWJsZSBieSAlOSAoPXI0KSwgQi9GL0cvSC9KL04vTy9QCisgICAgbW92ZCAgICAgICAgIG0lNSwgWyU5KyUxMCo0XSAgIDsgQjAtMworICAgIG1vdmQgICAgICAgICBtJTQsIFslMTIrJTEwKjRdICA7IEowLTMKKyAgICBtb3ZkICAgICAgICAgbSU3LCBbJTldICAgICAgICAgOyBGMC0zCisgICAgbW92ZCAgICAgICAgIG0lNiwgWyUxMl0gICAgICAgIDsgTjAtMworICAgIHB1bnBja2xidyAgICBtJTUsIG0lNCAgICAgICAgICA7IEIvSgorICAgIHB1bnBja2xidyAgICBtJTcsIG0lNiAgICAgICAgICA7IEYvTgorICAgIHB1bnBja2xidyAgICBtJTEsIG0lNSAgICAgICAgICA7IEEvQi9JL0ogaW50ZXJsZWF2ZWQKKyAgICBwdW5wY2tsYncgICAgbSUzLCBtJTcgICAgICAgICAgOyBFL0YvTS9OIGludGVybGVhdmVkCisgICAgbW92ZCAgICAgICAgIG0lNCwgWyU5KyUxMV0gICAgIDsgRzAtMworICAgIG1vdmQgICAgICAgICBtJTYsIFslMTIrJTExXSAgICA7IE8wLTMKKyAgICBtb3ZkICAgICAgICAgbSU1LCBbJTkrJTExKjJdICAgOyBIMC0zCisgICAgbW92ZCAgICAgICAgIG0lNywgWyUxMislMTEqMl0gIDsgUDAtMworICAgIHB1bnBja2xidyAgICBtJTQsIG0lNiAgICAgICAgICA7IEcvTworICAgIHB1bnBja2xidyAgICBtJTUsIG0lNyAgICAgICAgICA7IEgvUAorICAgIHB1bnBja2xidyAgICBtJTQsIG0lNSAgICAgICAgICA7IEcvSC9PL1AgaW50ZXJsZWF2ZWQKKyVlbmRtYWNybworCis7IHdyaXRlIDQgbW0gcmVnaXN0ZXJzIG9mIDIgZHdvcmRzIGVhY2gKKzsgZmlyc3QgZm91ciBhcmd1bWVudHMgYXJlIG1tIHJlZ2lzdGVyIGluZGV4ZXMgY29udGFpbmluZyBzb3VyY2UgZGF0YQorOyBsYXN0IGZvdXIgYXJlIHJlZ2lzdGVycyBjb250YWluaW5nIGJ1Zis0KnN0cmlkZSwgYnVmKzUqc3RyaWRlLAorOyAtc3RyaWRlIGFuZCArc3RyaWRlCislbWFjcm8gV1JJVEVfNHgyRCA4CisgICAgOyB3cml0ZSBvdXQgKDIgZHdvcmRzIHBlciByZWdpc3RlcikKKyAgICBtb3ZkICAgIFslNSslNyo0XSwgbSUxCisgICAgbW92ZCAgICBbJTUrJTcqMl0sIG0lMgorICAgIG1vdmQgICAgICAgICBbJTVdLCBtJTMKKyAgICBtb3ZkICAgICAgWyU2KyU4XSwgbSU0CisgICAgcHVucGNraGRxICAgICBtJTEsIG0lMQorICAgIHB1bnBja2hkcSAgICAgbSUyLCBtJTIKKyAgICBwdW5wY2toZHEgICAgIG0lMywgbSUzCisgICAgcHVucGNraGRxICAgICBtJTQsIG0lNAorICAgIG1vdmQgICAgWyU2KyU3KjRdLCBtJTEKKyAgICBtb3ZkICAgICAgWyU1KyU3XSwgbSUyCisgICAgbW92ZCAgICAgICAgIFslNl0sIG0lMworICAgIG1vdmQgICAgWyU2KyU4KjJdLCBtJTQKKyVlbmRtYWNybworCis7IHdyaXRlIDQgeG1tIHJlZ2lzdGVycyBvZiA0IGR3b3JkcyBlYWNoCis7IGFyZ3VtZW50cyBzYW1lIGFzIFdSSVRFXzJ4NEQsIGJ1dCB3aXRoIGFuIGV4dHJhIHJlZ2lzdGVyLCBzbyB0aGF0IHRoZSA1IHJlZ3VsYXIKKzsgcmVnaXN0ZXJzIGNvbnRhaW4gYnVmKzQqc3RyaWRlLCBidWYrNSpzdHJpZGUsIGJ1ZisxMipzdHJpZGUsIC1zdHJpZGUgYW5kICtzdHJpZGUKKzsgd2UgYWRkIDEqc3RyaWRlIHRvIHRoZSB0aGlyZCByZWd1bGFyIHJlZ2lzdHJ5IGluIHRoZSBwcm9jZXNzCis7IHRoZSAxMHRoIGFyZ3VtZW50IGlzIDE2IGlmIGl0J3MgYSBZIGZpbHRlciAoaS5lLiBhbGwgcmVndWxhciByZWdpc3RlcnMgY292ZXIgdGhlCis7IHNhbWUgbWVtb3J5IHJlZ2lvbiksIG9yIDggaWYgdGhleSBjb3ZlciB0d28gc2VwYXJhdGUgYnVmZmVycyAodGhpcmQgb25lIHBvaW50cyB0bworOyBhIGRpZmZlcmVudCBtZW1vcnkgcmVnaW9uIHRoYW4gdGhlIGZpcnN0IHR3byksIGFsbG93aW5nIGZvciBtb3JlIG9wdGltYWwgY29kZSBmb3IKKzsgdGhlIDE2LXdpZHRoIGNhc2UKKyVtYWNybyBXUklURV80eDREIDEwCisgICAgOyB3cml0ZSBvdXQgKDQgZHdvcmRzIHBlciByZWdpc3RlciksIHN0YXJ0IHdpdGggZHdvcmRzIHplcm8KKyAgICBtb3ZkICAgIFslNSslOCo0XSwgbSUxCisgICAgbW92ZCAgICAgICAgIFslNV0sIG0lMgorICAgIG1vdmQgICAgWyU3KyU4KjRdLCBtJTMKKyAgICBtb3ZkICAgICAgICAgWyU3XSwgbSU0CisKKyAgICA7IHN0b3JlIGR3b3JkcyAxCisgICAgcHNybGRxICAgICAgICBtJTEsIDQKKyAgICBwc3JsZHEgICAgICAgIG0lMiwgNAorICAgIHBzcmxkcSAgICAgICAgbSUzLCA0CisgICAgcHNybGRxICAgICAgICBtJTQsIDQKKyAgICBtb3ZkICAgIFslNislOCo0XSwgbSUxCisgICAgbW92ZCAgICAgICAgIFslNl0sIG0lMgorJWlmICUxMCA9PSAxNgorICAgIG1vdmQgICAgWyU2KyU5KjRdLCBtJTMKKyVlbmRpZgorICAgIG1vdmQgICAgICBbJTcrJTldLCBtJTQKKworICAgIDsgd3JpdGUgZHdvcmRzIDIKKyAgICBwc3JsZHEgICAgICAgIG0lMSwgNAorICAgIHBzcmxkcSAgICAgICAgbSUyLCA0CislaWYgJTEwID09IDgKKyAgICBtb3ZkICAgIFslNSslOCoyXSwgbSUxCisgICAgbW92ZCAgICAgICAgICAlNWQsIG0lMworJWVuZGlmCisgICAgcHNybGRxICAgICAgICBtJTMsIDQKKyAgICBwc3JsZHEgICAgICAgIG0lNCwgNAorJWlmICUxMCA9PSAxNgorICAgIG1vdmQgICAgWyU1KyU4KjJdLCBtJTEKKyVlbmRpZgorICAgIG1vdmQgICAgICBbJTYrJTldLCBtJTIKKyAgICBtb3ZkICAgIFslNyslOCoyXSwgbSUzCisgICAgbW92ZCAgICBbJTcrJTkqMl0sIG0lNAorICAgIGFkZCAgICAgICAgICAgICU3LCAlOQorCisgICAgOyBzdG9yZSBkd29yZHMgMworICAgIHBzcmxkcSAgICAgICAgbSUxLCA0CisgICAgcHNybGRxICAgICAgICBtJTIsIDQKKyAgICBwc3JsZHEgICAgICAgIG0lMywgNAorICAgIHBzcmxkcSAgICAgICAgbSU0LCA0CislaWYgJTEwID09IDgKKyAgICBtb3YgICAgIFslNyslOCo0XSwgJTVkCisgICAgbW92ZCAgICBbJTYrJTgqMl0sIG0lMQorJWVsc2UKKyAgICBtb3ZkICAgICAgWyU1KyU4XSwgbSUxCislZW5kaWYKKyAgICBtb3ZkICAgIFslNislOSoyXSwgbSUyCisgICAgbW92ZCAgICBbJTcrJTgqMl0sIG0lMworICAgIG1vdmQgICAgWyU3KyU5KjJdLCBtJTQKKyVlbmRtYWNybworCis7IHdyaXRlIDQgb3IgOCB3b3JkcyBpbiB0aGUgbW14L3htbSByZWdpc3RlcnMgYXMgOCBsaW5lcworOyAxIGFuZCAyIGFyZSB0aGUgcmVnaXN0ZXJzIHRvIHdyaXRlLCB0aGlzIGNhbiBiZSB0aGUgc2FtZSAoZm9yIFNTRTIpCis7IGZvciBwcmUtU1NFNDoKKzsgMyBpcyBhIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciB0aGF0IHdlIHdpbGwgY2xvYmJlcgorOyBmb3IgU1NFNDoKKzsgMyBpcyBhIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uJ3MgNXRoIGxpbmUKKzsgNCBpcyBhIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uJ3MgNHRoIGxpbmUKKzsgNS82IGlzIC1zdHJpZGUgYW5kICtzdHJpZGUKKyVtYWNybyBXUklURV8yeDRXIDYKKyAgICBtb3ZkICAgICAgICAgICAgJTNkLCAlMQorICAgIHB1bnBja2hkcSAgICAgICAgJTEsICUxCisgICAgbW92ICAgICAgIFslNCslNSo0XSwgJTN3CisgICAgc2hyICAgICAgICAgICAgICAlMywgMTYKKyAgICBhZGQgICAgICAgICAgICAgICU0LCAlNgorICAgIG1vdiAgICAgICBbJTQrJTUqNF0sICUzdworCisgICAgbW92ZCAgICAgICAgICAgICUzZCwgJTEKKyAgICBhZGQgICAgICAgICAgICAgICU0LCAlNQorICAgIG1vdiAgICAgICBbJTQrJTUqMl0sICUzdworICAgIHNociAgICAgICAgICAgICAgJTMsIDE2CisgICAgbW92ICAgICAgIFslNCslNSAgXSwgJTN3CisKKyAgICBtb3ZkICAgICAgICAgICAgJTNkLCAlMgorICAgIHB1bnBja2hkcSAgICAgICAgJTIsICUyCisgICAgbW92ICAgICAgIFslNCAgICAgXSwgJTN3CisgICAgc2hyICAgICAgICAgICAgICAlMywgMTYKKyAgICBtb3YgICAgICAgWyU0KyU2ICBdLCAlM3cKKworICAgIG1vdmQgICAgICAgICAgICAlM2QsICUyCisgICAgYWRkICAgICAgICAgICAgICAlNCwgJTYKKyAgICBtb3YgICAgICAgWyU0KyU2ICBdLCAlM3cKKyAgICBzaHIgICAgICAgICAgICAgICUzLCAxNgorICAgIG1vdiAgICAgICBbJTQrJTYqMl0sICUzdworICAgIGFkZCAgICAgICAgICAgICAgJTQsICU1CislZW5kbWFjcm8KKworJW1hY3JvIFdSSVRFXzhXIDUKKyVpZiBjcHVmbGFnKHNzZTQpCisgICAgcGV4dHJ3ICAgIFslMyslNCo0XSwgJTEsIDAKKyAgICBwZXh0cncgICAgWyUyKyU0KjRdLCAlMSwgMQorICAgIHBleHRydyAgICBbJTMrJTQqMl0sICUxLCAyCisgICAgcGV4dHJ3ICAgIFslMyslNCAgXSwgJTEsIDMKKyAgICBwZXh0cncgICAgWyUzICAgICBdLCAlMSwgNAorICAgIHBleHRydyAgICBbJTIgICAgIF0sICUxLCA1CisgICAgcGV4dHJ3ICAgIFslMislNSAgXSwgJTEsIDYKKyAgICBwZXh0cncgICAgWyUyKyU1KjJdLCAlMSwgNworJWVsc2UKKyAgICBtb3ZkICAgICAgICAgICAgJTJkLCAlMQorICAgIHBzcmxkcSAgICAgICAgICAgJTEsIDQKKyAgICBtb3YgICAgICAgWyUzKyU0KjRdLCAlMncKKyAgICBzaHIgICAgICAgICAgICAgICUyLCAxNgorICAgIGFkZCAgICAgICAgICAgICAgJTMsICU1CisgICAgbW92ICAgICAgIFslMyslNCo0XSwgJTJ3CisKKyAgICBtb3ZkICAgICAgICAgICAgJTJkLCAlMQorICAgIHBzcmxkcSAgICAgICAgICAgJTEsIDQKKyAgICBhZGQgICAgICAgICAgICAgICUzLCAlNAorICAgIG1vdiAgICAgICBbJTMrJTQqMl0sICUydworICAgIHNociAgICAgICAgICAgICAgJTIsIDE2CisgICAgbW92ICAgICAgIFslMyslNCAgXSwgJTJ3CisKKyAgICBtb3ZkICAgICAgICAgICAgJTJkLCAlMQorICAgIHBzcmxkcSAgICAgICAgICAgJTEsIDQKKyAgICBtb3YgICAgICAgWyUzICAgICBdLCAlMncKKyAgICBzaHIgICAgICAgICAgICAgICUyLCAxNgorICAgIG1vdiAgICAgICBbJTMrJTUgIF0sICUydworCisgICAgbW92ZCAgICAgICAgICAgICUyZCwgJTEKKyAgICBhZGQgICAgICAgICAgICAgICUzLCAlNQorICAgIG1vdiAgICAgICBbJTMrJTUgIF0sICUydworICAgIHNociAgICAgICAgICAgICAgJTIsIDE2CisgICAgbW92ICAgICAgIFslMyslNSoyXSwgJTJ3CislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gU0lNUExFX0xPT1BGSUxURVIgMgorY2dsb2JhbCB2cDhfJTFfbG9vcF9maWx0ZXJfc2ltcGxlLCAzLCAlMiwgOCwgZHN0LCBzdHJpZGUsIGZsaW0sIGNudHIKKyVpZiBtbXNpemUgPT0gOCA7IG1teC9tbXhleHQKKyAgICBtb3YgICAgICAgICBjbnRycSwgMgorJWVuZGlmCislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICBweG9yICAgICAgICAgICBtMCwgbTAKKyVlbmRpZgorICAgIFNQTEFUQl9SRUcgICAgIG03LCBmbGltLCBtMCAgICAgOyBzcGxhdCAiZmxpbSIgaW50byByZWdpc3RlcgorCisgICAgOyBzZXQgdXAgaW5kZXhlcyB0byBhZGRyZXNzIDQgcm93cworJWlmIG1tc2l6ZSA9PSA4CisgICAgREVGSU5FX0FSR1MgZHN0MSwgbXN0cmlkZSwgc3RyaWRlLCBjbnRyLCBkc3QyCislZWxzZQorICAgIERFRklORV9BUkdTIGRzdDEsIG1zdHJpZGUsIHN0cmlkZSwgZHN0MywgZHN0MgorJWVuZGlmCisgICAgbW92ICAgICAgIHN0cmlkZXEsIG1zdHJpZGVxCisgICAgbmVnICAgICAgbXN0cmlkZXEKKyVpZmlkbiAlMSwgaAorICAgIGxlYSAgICAgICAgIGRzdDFxLCBbZHN0MXErNCpzdHJpZGVxLTJdCislZW5kaWYKKworJWlmIG1tc2l6ZSA9PSA4IDsgbW14IC8gbW14ZXh0CisubmV4dDhweDoKKyVlbmRpZgorJWlmaWRuICUxLCB2CisgICAgOyByZWFkIDQgaGFsZi9mdWxsIHJvd3Mgb2YgcGl4ZWxzCisgICAgbW92YSAgICAgICAgICAgbTAsIFtkc3QxcSttc3RyaWRlcSoyXSAgICA7IHAxCisgICAgbW92YSAgICAgICAgICAgbTEsIFtkc3QxcSttc3RyaWRlcV0gICAgICA7IHAwCisgICAgbW92YSAgICAgICAgICAgbTIsIFtkc3QxcV0gICAgICAgICAgICAgICA7IHEwCisgICAgbW92YSAgICAgICAgICAgbTMsIFtkc3QxcSsgc3RyaWRlcV0gICAgICA7IHExCislZWxzZSA7IGgKKyAgICBsZWEgICAgICAgICBkc3QycSwgW2RzdDFxKyBzdHJpZGVxXQorCislaWYgbW1zaXplID09IDggOyBtbXgvbW14ZXh0CisgICAgUkVBRF84eDRfSU5URVJMRUFWRUQgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIGRzdDFxLCBkc3QycSwgbXN0cmlkZXEsIHN0cmlkZXEKKyVlbHNlIDsgc3NlMgorICAgIFJFQURfMTZ4NF9JTlRFUkxFQVZFRCAwLCAxLCAyLCAzLCA0LCA1LCA2LCBkc3QxcSwgZHN0MnEsIG1zdHJpZGVxLCBzdHJpZGVxLCBkc3QzcQorJWVuZGlmCisgICAgVFJBTlNQT1NFNHg0VyAgICAgICAgIDAsIDEsIDIsIDMsIDQKKyVlbmRpZgorCisgICAgOyBzaW1wbGVfbGltaXQKKyAgICBtb3ZhICAgICAgICAgICBtNSwgbTIgICAgICAgICAgIDsgbTU9YmFja3VwIG9mIHEwCisgICAgbW92YSAgICAgICAgICAgbTYsIG0xICAgICAgICAgICA7IG02PWJhY2t1cCBvZiBwMAorICAgIHBzdWJ1c2IgICAgICAgIG0xLCBtMiAgICAgICAgICAgOyBwMC1xMAorICAgIHBzdWJ1c2IgICAgICAgIG0yLCBtNiAgICAgICAgICAgOyBxMC1wMAorICAgIHBvciAgICAgICAgICAgIG0xLCBtMiAgICAgICAgICAgOyBGRkFCUyhwMC1xMCkKKyAgICBwYWRkdXNiICAgICAgICBtMSwgbTEgICAgICAgICAgIDsgbTE9RkZBQlMocDAtcTApKjIKKworICAgIG1vdmEgICAgICAgICAgIG00LCBtMworICAgIG1vdmEgICAgICAgICAgIG0yLCBtMAorICAgIHBzdWJ1c2IgICAgICAgIG0zLCBtMCAgICAgICAgICAgOyBxMS1wMQorICAgIHBzdWJ1c2IgICAgICAgIG0wLCBtNCAgICAgICAgICAgOyBwMS1xMQorICAgIHBvciAgICAgICAgICAgIG0zLCBtMCAgICAgICAgICAgOyBGRkFCUyhwMS1xMSkKKyAgICBtb3ZhICAgICAgICAgICBtMCwgW3BiXzgwXQorICAgIHB4b3IgICAgICAgICAgIG0yLCBtMAorICAgIHB4b3IgICAgICAgICAgIG00LCBtMAorICAgIHBzdWJzYiAgICAgICAgIG0yLCBtNCAgICAgICAgICAgOyBtMj1wMS1xMSAoc2lnbmVkKSBiYWNrdXAgZm9yIGJlbG93CisgICAgcGFuZCAgICAgICAgICAgbTMsIFtwYl9GRV0KKyAgICBwc3JscSAgICAgICAgICBtMywgMSAgICAgICAgICAgIDsgbTM9RkZBQlMocDEtcTEpLzIsIHRoaXMgY2FuIGJlIHVzZWQgc2lnbmVkCisgICAgcGFkZHVzYiAgICAgICAgbTMsIG0xCisgICAgcHN1YnVzYiAgICAgICAgbTMsIG03CisgICAgcHhvciAgICAgICAgICAgbTEsIG0xCisgICAgcGNtcGVxYiAgICAgICAgbTMsIG0xICAgICAgICAgICA7IGFicyhwMC1xMCkqMithYnMocDEtcTEpLzI8PWZsaW0gbWFzaygweGZmLzB4MCkKKworICAgIDsgZmlsdGVyX2NvbW1vbiAodXNlIG0yL3AxLXExLCBtND1xMCwgbTY9cDAsIG01L3EwLXAwIGFuZCBtMy9tYXNrKQorICAgIG1vdmEgICAgICAgICAgIG00LCBtNQorICAgIHB4b3IgICAgICAgICAgIG01LCBtMAorICAgIHB4b3IgICAgICAgICAgIG0wLCBtNgorICAgIHBzdWJzYiAgICAgICAgIG01LCBtMCAgICAgICAgICAgOyBxMC1wMCAoc2lnbmVkKQorICAgIHBhZGRzYiAgICAgICAgIG0yLCBtNQorICAgIHBhZGRzYiAgICAgICAgIG0yLCBtNQorICAgIHBhZGRzYiAgICAgICAgIG0yLCBtNSAgICAgICAgICAgOyBhPShwMS1xMSkgKyAzKihxMC1wMCkKKyAgICBwYW5kICAgICAgICAgICBtMiwgbTMgICAgICAgICAgIDsgYXBwbHkgZmlsdGVyIG1hc2sgKG0zKQorCisgICAgbW92YSAgICAgICAgICAgbTMsIFtwYl9GOF0KKyAgICBtb3ZhICAgICAgICAgICBtMSwgbTIKKyAgICBwYWRkc2IgICAgICAgICBtMiwgW3BiXzRdICAgICAgIDsgZjE8PDM9YSs0CisgICAgcGFkZHNiICAgICAgICAgbTEsIFtwYl8zXSAgICAgICA7IGYyPDwzPWErMworICAgIHBhbmQgICAgICAgICAgIG0yLCBtMworICAgIHBhbmQgICAgICAgICAgIG0xLCBtMyAgICAgICAgICAgOyBjYWNoZSBmMjw8MworCisgICAgcHhvciAgICAgICAgICAgbTAsIG0wCisgICAgcHhvciAgICAgICAgICAgbTMsIG0zCisgICAgcGNtcGd0YiAgICAgICAgbTAsIG0yICAgICAgICAgICA7IHdoaWNoIHZhbHVlcyBhcmUgPDA/CisgICAgcHN1YmIgICAgICAgICAgbTMsIG0yICAgICAgICAgICA7IC1mMTw8MworICAgIHBzcmxxICAgICAgICAgIG0yLCAzICAgICAgICAgICAgOyArZjEKKyAgICBwc3JscSAgICAgICAgICBtMywgMyAgICAgICAgICAgIDsgLWYxCisgICAgcGFuZCAgICAgICAgICAgbTMsIG0wCisgICAgcGFuZG4gICAgICAgICAgbTAsIG0yCisgICAgcHN1YnVzYiAgICAgICAgbTQsIG0wCisgICAgcGFkZHVzYiAgICAgICAgbTQsIG0zICAgICAgICAgICA7IHEwLWYxCisKKyAgICBweG9yICAgICAgICAgICBtMCwgbTAKKyAgICBweG9yICAgICAgICAgICBtMywgbTMKKyAgICBwY21wZ3RiICAgICAgICBtMCwgbTEgICAgICAgICAgIDsgd2hpY2ggdmFsdWVzIGFyZSA8MD8KKyAgICBwc3ViYiAgICAgICAgICBtMywgbTEgICAgICAgICAgIDsgLWYyPDwzCisgICAgcHNybHEgICAgICAgICAgbTEsIDMgICAgICAgICAgICA7ICtmMgorICAgIHBzcmxxICAgICAgICAgIG0zLCAzICAgICAgICAgICAgOyAtZjIKKyAgICBwYW5kICAgICAgICAgICBtMywgbTAKKyAgICBwYW5kbiAgICAgICAgICBtMCwgbTEKKyAgICBwYWRkdXNiICAgICAgICBtNiwgbTAKKyAgICBwc3VidXNiICAgICAgICBtNiwgbTMgICAgICAgICAgIDsgcDArZjIKKworICAgIDsgc3RvcmUKKyVpZmlkbiAlMSwgdgorICAgIG1vdmEgICAgICBbZHN0MXFdLCBtNAorICAgIG1vdmEgW2RzdDFxK21zdHJpZGVxXSwgbTYKKyVlbHNlIDsgaAorICAgIGluYyAgICAgICAgZHN0MXEKKyAgICBTQlVUVEVSRkxZICAgIGJ3LCA2LCA0LCAwCisKKyVpZiBtbXNpemUgPT0gMTYgOyBzc2UyCislaWYgY3B1ZmxhZyhzc2U0KQorICAgIGluYyAgICAgICAgIGRzdDJxCislZW5kaWYKKyAgICBXUklURV84VyAgICAgICBtNiwgZHN0MnEsIGRzdDFxLCBtc3RyaWRlcSwgc3RyaWRlcQorICAgIGxlYSAgICAgICAgIGRzdDJxLCBbZHN0M3ErbXN0cmlkZXErMV0KKyVpZiBjcHVmbGFnKHNzZTQpCisgICAgaW5jICAgICAgICAgZHN0M3EKKyVlbmRpZgorICAgIFdSSVRFXzhXICAgICAgIG00LCBkc3QzcSwgZHN0MnEsIG1zdHJpZGVxLCBzdHJpZGVxCislZWxzZSA7IG1teC9tbXhleHQKKyAgICBXUklURV8yeDRXICAgICBtNiwgbTQsIGRzdDJxLCBkc3QxcSwgbXN0cmlkZXEsIHN0cmlkZXEKKyVlbmRpZgorJWVuZGlmCisKKyVpZiBtbXNpemUgPT0gOCA7IG1teC9tbXhleHQKKyAgICA7IG5leHQgOCBwaXhlbHMKKyVpZmlkbiAlMSwgdgorICAgIGFkZCAgICAgICAgIGRzdDFxLCA4ICAgICAgICAgICAgOyBhZHZhbmNlIDggY29scyA9IHBpeGVscworJWVsc2UgOyBoCisgICAgbGVhICAgICAgICAgZHN0MXEsIFtkc3QxcStzdHJpZGVxKjgtMV0gIDsgYWR2YW5jZSA4IHJvd3MgPSBsaW5lcworJWVuZGlmCisgICAgZGVjICAgICAgICAgY250cnEKKyAgICBqZyAubmV4dDhweAorICAgIFJFUF9SRVQKKyVlbHNlIDsgc3NlMgorICAgIFJFVAorJWVuZGlmCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzMyCitJTklUX01NWCBtbXgKK1NJTVBMRV9MT09QRklMVEVSIHYsIDQKK1NJTVBMRV9MT09QRklMVEVSIGgsIDUKK0lOSVRfTU1YIG1teGV4dAorU0lNUExFX0xPT1BGSUxURVIgdiwgNAorU0lNUExFX0xPT1BGSUxURVIgaCwgNQorJWVuZGlmCisKK0lOSVRfWE1NIHNzZTIKK1NJTVBMRV9MT09QRklMVEVSIHYsIDMKK1NJTVBMRV9MT09QRklMVEVSIGgsIDUKK0lOSVRfWE1NIHNzc2UzCitTSU1QTEVfTE9PUEZJTFRFUiB2LCAzCitTSU1QTEVfTE9PUEZJTFRFUiBoLCA1CitJTklUX1hNTSBzc2U0CitTSU1QTEVfTE9PUEZJTFRFUiBoLCA1CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ZwOF9oL3ZfbG9vcF9maWx0ZXI8c2l6ZT5faW5uZXJfPG9wdD4odWludDhfdCAqZHN0LCBbdWludDhfdCAqdixdIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxpbUUsIGludCBmbGltSSwgaW50IGhldl90aHIpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBJTk5FUl9MT09QRklMVEVSIDIKKyVkZWZpbmUgc3RhY2tfc2l6ZSAwCislaWZuZGVmIG04ICAgOyBzdGFjayBsYXlvdXQ6IFswXT1FLCBbMV09SSwgWzJdPWhldl90aHIKKyVpZmlkbiAlMSwgdiA7ICAgICAgICAgICAgICAgWzNdPWhldigpIHJlc3VsdAorJWRlZmluZSBzdGFja19zaXplIG1tc2l6ZSAqIC00CislZWxzZSA7IGggICAgOyBleHRyYSBzdG9yYWdlIHNwYWNlIGZvciB0cmFuc3Bvc2VzCislZGVmaW5lIHN0YWNrX3NpemUgbW1zaXplICogLTUKKyVlbmRpZgorJWVuZGlmCisKKyVpZiAlMiA9PSA4IDsgY2hyb21hCitjZ2xvYmFsIHZwOF8lMV9sb29wX2ZpbHRlcjh1dl9pbm5lciwgNiwgNiwgMTMsIHN0YWNrX3NpemUsIGRzdCwgZHN0OCwgc3RyaWRlLCBmbGltRSwgZmxpbUksIGhldnRocgorJWVsc2UgOyBsdW1hCitjZ2xvYmFsIHZwOF8lMV9sb29wX2ZpbHRlcjE2eV9pbm5lciwgNSwgNSwgMTMsIHN0YWNrX3NpemUsIGRzdCwgc3RyaWRlLCBmbGltRSwgZmxpbUksIGhldnRocgorJWVuZGlmCisKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHB4b3IgICAgICAgICAgICAgbTcsIG03CislZW5kaWYKKworJWlmbmRlZiBtOAorICAgIDsgc3BsYXQgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgU1BMQVRCX1JFRyAgICAgICBtMCwgZmxpbUVxLCBtNyAgIDsgRQorICAgIFNQTEFUQl9SRUcgICAgICAgbTEsIGZsaW1JcSwgbTcgICA7IEkKKyAgICBTUExBVEJfUkVHICAgICAgIG0yLCBoZXZ0aHJxLCBtNyAgOyBoZXZfdGhyZXNoCisKKyVkZWZpbmUgbV9mbGltRSAgICBbcnNwXQorJWRlZmluZSBtX2ZsaW1JICAgIFtyc3ArbW1zaXplXQorJWRlZmluZSBtX2hldnRociAgIFtyc3ArbW1zaXplKjJdCislZGVmaW5lIG1fbWFza3JlcyAgW3JzcCttbXNpemUqM10KKyVkZWZpbmUgbV9wMGJhY2t1cCBbcnNwK21tc2l6ZSozXQorJWRlZmluZSBtX3EwYmFja3VwIFtyc3ArbW1zaXplKjRdCisKKyAgICBtb3ZhICAgICAgICBtX2ZsaW1FLCBtMAorICAgIG1vdmEgICAgICAgIG1fZmxpbUksIG0xCisgICAgbW92YSAgICAgICBtX2hldnRociwgbTIKKyVlbHNlCislZGVmaW5lIG1fZmxpbUUgICAgbTkKKyVkZWZpbmUgbV9mbGltSSAgICBtMTAKKyVkZWZpbmUgbV9oZXZ0aHIgICBtMTEKKyVkZWZpbmUgbV9tYXNrcmVzICBtMTIKKyVkZWZpbmUgbV9wMGJhY2t1cCBtMTIKKyVkZWZpbmUgbV9xMGJhY2t1cCBtOAorCisgICAgOyBzcGxhdCBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBTUExBVEJfUkVHICBtX2ZsaW1FLCBmbGltRXEsIG03ICAgOyBFCisgICAgU1BMQVRCX1JFRyAgbV9mbGltSSwgZmxpbUlxLCBtNyAgIDsgSQorICAgIFNQTEFUQl9SRUcgbV9oZXZ0aHIsIGhldnRocnEsIG03ICA7IGhldl90aHJlc2gKKyVlbmRpZgorCislaWYgJTIgPT0gOCA7IGNocm9tYQorICAgIERFRklORV9BUkdTIGRzdDEsIGRzdDgsIG1zdHJpZGUsIHN0cmlkZSwgZHN0MgorJWVsaWYgbW1zaXplID09IDgKKyAgICBERUZJTkVfQVJHUyBkc3QxLCBtc3RyaWRlLCBzdHJpZGUsIGRzdDIsIGNudHIKKyAgICBtb3YgICAgICAgICAgIGNudHJxLCAyCislZWxzZQorICAgIERFRklORV9BUkdTIGRzdDEsIG1zdHJpZGUsIHN0cmlkZSwgZHN0MiwgZHN0OAorJWVuZGlmCisgICAgbW92ICAgICAgICAgc3RyaWRlcSwgbXN0cmlkZXEKKyAgICBuZWcgICAgICAgIG1zdHJpZGVxCislaWZpZG4gJTEsIGgKKyAgICBsZWEgICAgICAgICAgIGRzdDFxLCBbZHN0MXErc3RyaWRlcSo0LTRdCislaWYgJTIgPT0gOCA7IGNocm9tYQorICAgIGxlYSAgICAgICAgICAgZHN0OHEsIFtkc3Q4cStzdHJpZGVxKjQtNF0KKyVlbmRpZgorJWVuZGlmCisKKyVpZiBtbXNpemUgPT0gOAorLm5leHQ4cHg6CislZW5kaWYKKyAgICA7IHJlYWQKKyAgICBsZWEgICAgICAgICAgIGRzdDJxLCBbZHN0MXErc3RyaWRlcV0KKyVpZmlkbiAlMSwgdgorJWlmICUyID09IDggJiYgbW1zaXplID09IDE2CislZGVmaW5lIG1vdnJvdyBtb3ZoCislZWxzZQorJWRlZmluZSBtb3Zyb3cgbW92YQorJWVuZGlmCisgICAgbW92cm93ICAgICAgICAgICBtMCwgW2RzdDFxK21zdHJpZGVxKjRdIDsgcDMKKyAgICBtb3Zyb3cgICAgICAgICAgIG0xLCBbZHN0MnErbXN0cmlkZXEqNF0gOyBwMgorICAgIG1vdnJvdyAgICAgICAgICAgbTIsIFtkc3QxcSttc3RyaWRlcSoyXSA7IHAxCisgICAgbW92cm93ICAgICAgICAgICBtNSwgW2RzdDJxXSAgICAgICAgICAgIDsgcTEKKyAgICBtb3Zyb3cgICAgICAgICAgIG02LCBbZHN0MnErIHN0cmlkZXEqMV0gOyBxMgorICAgIG1vdnJvdyAgICAgICAgICAgbTcsIFtkc3QycSsgc3RyaWRlcSoyXSA7IHEzCislaWYgbW1zaXplID09IDE2ICYmICUyID09IDgKKyAgICBtb3ZocHMgICAgICAgICAgIG0wLCBbZHN0OHErbXN0cmlkZXEqNF0KKyAgICBtb3ZocHMgICAgICAgICAgIG0yLCBbZHN0OHErbXN0cmlkZXEqMl0KKyAgICBhZGQgICAgICAgICAgIGRzdDhxLCBzdHJpZGVxCisgICAgbW92aHBzICAgICAgICAgICBtMSwgW2RzdDhxK21zdHJpZGVxKjRdCisgICAgbW92aHBzICAgICAgICAgICBtNSwgW2RzdDhxXQorICAgIG1vdmhwcyAgICAgICAgICAgbTYsIFtkc3Q4cSsgc3RyaWRlcSAgXQorICAgIG1vdmhwcyAgICAgICAgICAgbTcsIFtkc3Q4cSsgc3RyaWRlcSoyXQorICAgIGFkZCAgICAgICAgICAgZHN0OHEsIG1zdHJpZGVxCislZW5kaWYKKyVlbGlmIG1tc2l6ZSA9PSA4IDsgbW14L21teGV4dCAoaCkKKyAgICA7IHJlYWQgOCByb3dzIG9mIDhweCBlYWNoCisgICAgbW92dSAgICAgICAgICAgICBtMCwgW2RzdDFxK21zdHJpZGVxKjRdCisgICAgbW92dSAgICAgICAgICAgICBtMSwgW2RzdDJxK21zdHJpZGVxKjRdCisgICAgbW92dSAgICAgICAgICAgICBtMiwgW2RzdDFxK21zdHJpZGVxKjJdCisgICAgbW92dSAgICAgICAgICAgICBtMywgW2RzdDFxK21zdHJpZGVxICBdCisgICAgbW92dSAgICAgICAgICAgICBtNCwgW2RzdDFxXQorICAgIG1vdnUgICAgICAgICAgICAgbTUsIFtkc3QycV0KKyAgICBtb3Z1ICAgICAgICAgICAgIG02LCBbZHN0MnErIHN0cmlkZXEgIF0KKworICAgIDsgOHg4IHRyYW5zcG9zZQorICAgIFRSQU5TUE9TRTR4NEIgICAgIDAsIDEsIDIsIDMsIDcKKyAgICBtb3ZhICAgICBtX3EwYmFja3VwLCBtMQorICAgIG1vdnUgICAgICAgICAgICAgbTcsIFtkc3QycSsgc3RyaWRlcSoyXQorICAgIFRSQU5TUE9TRTR4NEIgICAgIDQsIDUsIDYsIDcsIDEKKyAgICBTQlVUVEVSRkxZICAgICAgIGRxLCAwLCA0LCAxICAgICA7IHAzL3AyCisgICAgU0JVVFRFUkZMWSAgICAgICBkcSwgMiwgNiwgMSAgICAgOyBxMC9xMQorICAgIFNCVVRURVJGTFkgICAgICAgZHEsIDMsIDcsIDEgICAgIDsgcTIvcTMKKyAgICBtb3ZhICAgICAgICAgICAgIG0xLCBtX3EwYmFja3VwCisgICAgbW92YSAgICAgbV9xMGJhY2t1cCwgbTIgICAgICAgICAgOyBzdG9yZSBxMAorICAgIFNCVVRURVJGTFkgICAgICAgZHEsIDEsIDUsIDIgICAgIDsgcDEvcDAKKyAgICBtb3ZhICAgICBtX3AwYmFja3VwLCBtNSAgICAgICAgICA7IHN0b3JlIHAwCisgICAgU1dBUCAgICAgICAgICAgICAgMSwgNAorICAgIFNXQVAgICAgICAgICAgICAgIDIsIDQKKyAgICBTV0FQICAgICAgICAgICAgICA2LCAzCisgICAgU1dBUCAgICAgICAgICAgICAgNSwgMworJWVsc2UgOyBzc2UyIChoKQorJWlmICUyID09IDE2CisgICAgbGVhICAgICAgICAgICBkc3Q4cSwgW2RzdDFxKyBzdHJpZGVxKjhdCislZW5kaWYKKworICAgIDsgcmVhZCAxNiByb3dzIG9mIDhweCBlYWNoLCBpbnRlcmxlYXZlCisgICAgbW92aCAgICAgICAgICAgICBtMCwgW2RzdDFxK21zdHJpZGVxKjRdCisgICAgbW92aCAgICAgICAgICAgICBtMSwgW2RzdDhxK21zdHJpZGVxKjRdCisgICAgbW92aCAgICAgICAgICAgICBtMiwgW2RzdDFxK21zdHJpZGVxKjJdCisgICAgbW92aCAgICAgICAgICAgICBtNSwgW2RzdDhxK21zdHJpZGVxKjJdCisgICAgbW92aCAgICAgICAgICAgICBtMywgW2RzdDFxK21zdHJpZGVxICBdCisgICAgbW92aCAgICAgICAgICAgICBtNiwgW2RzdDhxK21zdHJpZGVxICBdCisgICAgbW92aCAgICAgICAgICAgICBtNCwgW2RzdDFxXQorICAgIG1vdmggICAgICAgICAgICAgbTcsIFtkc3Q4cV0KKyAgICBwdW5wY2tsYncgICAgICAgIG0wLCBtMSAgICAgICAgICA7IEEvSQorICAgIHB1bnBja2xidyAgICAgICAgbTIsIG01ICAgICAgICAgIDsgQy9LCisgICAgcHVucGNrbGJ3ICAgICAgICBtMywgbTYgICAgICAgICAgOyBEL0wKKyAgICBwdW5wY2tsYncgICAgICAgIG00LCBtNyAgICAgICAgICA7IEUvTQorCisgICAgYWRkICAgICAgICAgICBkc3Q4cSwgc3RyaWRlcQorICAgIG1vdmggICAgICAgICAgICAgbTEsIFtkc3QycSttc3RyaWRlcSo0XQorICAgIG1vdmggICAgICAgICAgICAgbTYsIFtkc3Q4cSttc3RyaWRlcSo0XQorICAgIG1vdmggICAgICAgICAgICAgbTUsIFtkc3QycV0KKyAgICBtb3ZoICAgICAgICAgICAgIG03LCBbZHN0OHFdCisgICAgcHVucGNrbGJ3ICAgICAgICBtMSwgbTYgICAgICAgICAgOyBCL0oKKyAgICBwdW5wY2tsYncgICAgICAgIG01LCBtNyAgICAgICAgICA7IEYvTgorICAgIG1vdmggICAgICAgICAgICAgbTYsIFtkc3QycSsgc3RyaWRlcSAgXQorICAgIG1vdmggICAgICAgICAgICAgbTcsIFtkc3Q4cSsgc3RyaWRlcSAgXQorICAgIHB1bnBja2xidyAgICAgICAgbTYsIG03ICAgICAgICAgIDsgRy9PCisKKyAgICA7IDh4MTYgdHJhbnNwb3NlCisgICAgVFJBTlNQT1NFNHg0QiAgICAgMCwgMSwgMiwgMywgNworJWlmZGVmIG04CisgICAgU1dBUCAgICAgICAgICAgICAgMSwgOAorJWVsc2UKKyAgICBtb3ZhICAgICBtX3EwYmFja3VwLCBtMQorJWVuZGlmCisgICAgbW92aCAgICAgICAgICAgICBtNywgW2RzdDJxKyBzdHJpZGVxKjJdCisgICAgbW92aCAgICAgICAgICAgICBtMSwgW2RzdDhxKyBzdHJpZGVxKjJdCisgICAgcHVucGNrbGJ3ICAgICAgICBtNywgbTEgICAgICAgICAgOyBIL1AKKyAgICBUUkFOU1BPU0U0eDRCICAgICA0LCA1LCA2LCA3LCAxCisgICAgU0JVVFRFUkZMWSAgICAgICBkcSwgMCwgNCwgMSAgICAgOyBwMy9wMgorICAgIFNCVVRURVJGTFkgICAgICAgZHEsIDIsIDYsIDEgICAgIDsgcTAvcTEKKyAgICBTQlVUVEVSRkxZICAgICAgIGRxLCAzLCA3LCAxICAgICA7IHEyL3EzCislaWZkZWYgbTgKKyAgICBTV0FQICAgICAgICAgICAgICAxLCA4CisgICAgU1dBUCAgICAgICAgICAgICAgMiwgOAorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAgIG0xLCBtX3EwYmFja3VwCisgICAgbW92YSAgICAgbV9xMGJhY2t1cCwgbTIgICAgICAgICAgOyBzdG9yZSBxMAorJWVuZGlmCisgICAgU0JVVFRFUkZMWSAgICAgICBkcSwgMSwgNSwgMiAgICAgOyBwMS9wMAorJWlmZGVmIG0xMgorICAgIFNXQVAgICAgICAgICAgICAgIDUsIDEyCislZWxzZQorICAgIG1vdmEgICAgIG1fcDBiYWNrdXAsIG01ICAgICAgICAgIDsgc3RvcmUgcDAKKyVlbmRpZgorICAgIFNXQVAgICAgICAgICAgICAgIDEsIDQKKyAgICBTV0FQICAgICAgICAgICAgICAyLCA0CisgICAgU1dBUCAgICAgICAgICAgICAgNiwgMworICAgIFNXQVAgICAgICAgICAgICAgIDUsIDMKKyVlbmRpZgorCisgICAgOyBub3JtYWxfbGltaXQgZm9yIHAzLXAyLCBwMi1wMSwgcTMtcTIgYW5kIHEyLXExCisgICAgbW92YSAgICAgICAgICAgICBtNCwgbTEKKyAgICBTV0FQICAgICAgICAgICAgICA0LCAxCisgICAgcHN1YnVzYiAgICAgICAgICBtNCwgbTAgICAgICAgICAgOyBwMi1wMworICAgIHBzdWJ1c2IgICAgICAgICAgbTAsIG0xICAgICAgICAgIDsgcDMtcDIKKyAgICBwb3IgICAgICAgICAgICAgIG0wLCBtNCAgICAgICAgICA7IGFicyhwMy1wMikKKworICAgIG1vdmEgICAgICAgICAgICAgbTQsIG0yCisgICAgU1dBUCAgICAgICAgICAgICAgNCwgMgorICAgIHBzdWJ1c2IgICAgICAgICAgbTQsIG0xICAgICAgICAgIDsgcDEtcDIKKyAgICBwc3VidXNiICAgICAgICAgIG0xLCBtMiAgICAgICAgICA7IHAyLXAxCisgICAgcG9yICAgICAgICAgICAgICBtMSwgbTQgICAgICAgICAgOyBhYnMocDItcDEpCisKKyAgICBtb3ZhICAgICAgICAgICAgIG00LCBtNgorICAgIFNXQVAgICAgICAgICAgICAgIDQsIDYKKyAgICBwc3VidXNiICAgICAgICAgIG00LCBtNyAgICAgICAgICA7IHEyLXEzCisgICAgcHN1YnVzYiAgICAgICAgICBtNywgbTYgICAgICAgICAgOyBxMy1xMgorICAgIHBvciAgICAgICAgICAgICAgbTcsIG00ICAgICAgICAgIDsgYWJzKHEzLXEyKQorCisgICAgbW92YSAgICAgICAgICAgICBtNCwgbTUKKyAgICBTV0FQICAgICAgICAgICAgICA0LCA1CisgICAgcHN1YnVzYiAgICAgICAgICBtNCwgbTYgICAgICAgICAgOyBxMS1xMgorICAgIHBzdWJ1c2IgICAgICAgICAgbTYsIG01ICAgICAgICAgIDsgcTItcTEKKyAgICBwb3IgICAgICAgICAgICAgIG02LCBtNCAgICAgICAgICA7IGFicyhxMi1xMSkKKworJWlmIG5vdGNwdWZsYWcobW14ZXh0KQorICAgIG1vdmEgICAgICAgICAgICAgbTQsIG1fZmxpbUkKKyAgICBweG9yICAgICAgICAgICAgIG0zLCBtMworICAgIHBzdWJ1c2IgICAgICAgICAgbTAsIG00CisgICAgcHN1YnVzYiAgICAgICAgICBtMSwgbTQKKyAgICBwc3VidXNiICAgICAgICAgIG03LCBtNAorICAgIHBzdWJ1c2IgICAgICAgICAgbTYsIG00CisgICAgcGNtcGVxYiAgICAgICAgICBtMCwgbTMgICAgICAgICAgOyBhYnMocDMtcDIpIDw9IEkKKyAgICBwY21wZXFiICAgICAgICAgIG0xLCBtMyAgICAgICAgICA7IGFicyhwMi1wMSkgPD0gSQorICAgIHBjbXBlcWIgICAgICAgICAgbTcsIG0zICAgICAgICAgIDsgYWJzKHEzLXEyKSA8PSBJCisgICAgcGNtcGVxYiAgICAgICAgICBtNiwgbTMgICAgICAgICAgOyBhYnMocTItcTEpIDw9IEkKKyAgICBwYW5kICAgICAgICAgICAgIG0wLCBtMQorICAgIHBhbmQgICAgICAgICAgICAgbTcsIG02CisgICAgcGFuZCAgICAgICAgICAgICBtMCwgbTcKKyVlbHNlIDsgbW14ZXh0L3NzZTIKKyAgICBwbWF4dWIgICAgICAgICAgIG0wLCBtMQorICAgIHBtYXh1YiAgICAgICAgICAgbTYsIG03CisgICAgcG1heHViICAgICAgICAgICBtMCwgbTYKKyVlbmRpZgorCisgICAgOyBub3JtYWxfbGltaXQgYW5kIGhpZ2hfZWRnZV92YXJpYW5jZSBmb3IgcDEtcDAsIHExLXEwCisgICAgU1dBUCAgICAgICAgICAgICAgNywgMyAgICAgICAgICAgOyBub3cgbTcgaXMgemVybworJWlmaWRuICUxLCB2CisgICAgbW92cm93ICAgICAgICAgICBtMywgW2RzdDFxK21zdHJpZGVxICBdIDsgcDAKKyVpZiBtbXNpemUgPT0gMTYgJiYgJTIgPT0gOAorICAgIG1vdmhwcyAgICAgICAgICAgbTMsIFtkc3Q4cSttc3RyaWRlcSAgXQorJWVuZGlmCislZWxpZmRlZiBtMTIKKyAgICBTV0FQICAgICAgICAgICAgICAzLCAxMgorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAgIG0zLCBtX3AwYmFja3VwCislZW5kaWYKKworICAgIG1vdmEgICAgICAgICAgICAgbTEsIG0yCisgICAgU1dBUCAgICAgICAgICAgICAgMSwgMgorICAgIG1vdmEgICAgICAgICAgICAgbTYsIG0zCisgICAgU1dBUCAgICAgICAgICAgICAgMywgNgorICAgIHBzdWJ1c2IgICAgICAgICAgbTEsIG0zICAgICAgICAgIDsgcDEtcDAKKyAgICBwc3VidXNiICAgICAgICAgIG02LCBtMiAgICAgICAgICA7IHAwLXAxCisgICAgcG9yICAgICAgICAgICAgICBtMSwgbTYgICAgICAgICAgOyBhYnMocDEtcDApCislaWYgbm90Y3B1ZmxhZyhtbXhleHQpCisgICAgbW92YSAgICAgICAgICAgICBtNiwgbTEKKyAgICBwc3VidXNiICAgICAgICAgIG0xLCBtNAorICAgIHBzdWJ1c2IgICAgICAgICAgbTYsIG1faGV2dGhyCisgICAgcGNtcGVxYiAgICAgICAgICBtMSwgbTcgICAgICAgICAgOyBhYnMocDEtcDApIDw9IEkKKyAgICBwY21wZXFiICAgICAgICAgIG02LCBtNyAgICAgICAgICA7IGFicyhwMS1wMCkgPD0gaGV2X3RocmVzaAorICAgIHBhbmQgICAgICAgICAgICAgbTAsIG0xCisgICAgbW92YSAgICAgIG1fbWFza3JlcywgbTYKKyVlbHNlIDsgbW14ZXh0L3NzZTIKKyAgICBwbWF4dWIgICAgICAgICAgIG0wLCBtMSAgICAgICAgICA7IG1heF9JCisgICAgU1dBUCAgICAgICAgICAgICAgMSwgNCAgICAgICAgICAgOyBtYXhfaGV2X3RocmVzaAorJWVuZGlmCisKKyAgICBTV0FQICAgICAgICAgICAgICA2LCA0ICAgICAgICAgICA7IG5vdyBtNiBpcyBJCislaWZpZG4gJTEsIHYKKyAgICBtb3Zyb3cgICAgICAgICAgIG00LCBbZHN0MXFdICAgICA7IHEwCislaWYgbW1zaXplID09IDE2ICYmICUyID09IDgKKyAgICBtb3ZocHMgICAgICAgICAgIG00LCBbZHN0OHFdCislZW5kaWYKKyVlbGlmZGVmIG04CisgICAgU1dBUCAgICAgICAgICAgICAgNCwgOAorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAgIG00LCBtX3EwYmFja3VwCislZW5kaWYKKyAgICBtb3ZhICAgICAgICAgICAgIG0xLCBtNAorICAgIFNXQVAgICAgICAgICAgICAgIDEsIDQKKyAgICBtb3ZhICAgICAgICAgICAgIG03LCBtNQorICAgIFNXQVAgICAgICAgICAgICAgIDcsIDUKKyAgICBwc3VidXNiICAgICAgICAgIG0xLCBtNSAgICAgICAgICA7IHEwLXExCisgICAgcHN1YnVzYiAgICAgICAgICBtNywgbTQgICAgICAgICAgOyBxMS1xMAorICAgIHBvciAgICAgICAgICAgICAgbTEsIG03ICAgICAgICAgIDsgYWJzKHExLXEwKQorJWlmIG5vdGNwdWZsYWcobW14ZXh0KQorICAgIG1vdmEgICAgICAgICAgICAgbTcsIG0xCisgICAgcHN1YnVzYiAgICAgICAgICBtMSwgbTYKKyAgICBwc3VidXNiICAgICAgICAgIG03LCBtX2hldnRocgorICAgIHB4b3IgICAgICAgICAgICAgbTYsIG02CisgICAgcGNtcGVxYiAgICAgICAgICBtMSwgbTYgICAgICAgICAgOyBhYnMocTEtcTApIDw9IEkKKyAgICBwY21wZXFiICAgICAgICAgIG03LCBtNiAgICAgICAgICA7IGFicyhxMS1xMCkgPD0gaGV2X3RocmVzaAorICAgIG1vdmEgICAgICAgICAgICAgbTYsIG1fbWFza3JlcworICAgIHBhbmQgICAgICAgICAgICAgbTAsIG0xICAgICAgICAgIDsgYWJzKFtwcV1bMzIxXS1bcHFdWzIxMF0pIDw9IEkKKyAgICBwYW5kICAgICAgICAgICAgIG02LCBtNworJWVsc2UgOyBtbXhleHQvc3NlMgorICAgIHB4b3IgICAgICAgICAgICAgbTcsIG03CisgICAgcG1heHViICAgICAgICAgICBtMCwgbTEKKyAgICBwbWF4dWIgICAgICAgICAgIG02LCBtMQorICAgIHBzdWJ1c2IgICAgICAgICAgbTAsIG1fZmxpbUkKKyAgICBwc3VidXNiICAgICAgICAgIG02LCBtX2hldnRocgorICAgIHBjbXBlcWIgICAgICAgICAgbTAsIG03ICAgICAgICAgIDsgbWF4KGFicyguLikpIDw9IEkKKyAgICBwY21wZXFiICAgICAgICAgIG02LCBtNyAgICAgICAgICA7ICEobWF4KGFicy4uKSA+IHRocmVzaCkKKyVlbmRpZgorJWlmZGVmIG0xMgorICAgIFNXQVAgICAgICAgICAgICAgIDYsIDEyCislZWxzZQorICAgIG1vdmEgICAgICBtX21hc2tyZXMsIG02ICAgICAgICAgIDsgIShhYnMocDEtcDApID4gaGV2X3QgfHwgYWJzKHExLXEwKSA+IGhldl90KQorJWVuZGlmCisKKyAgICA7IHNpbXBsZV9saW1pdAorICAgIG1vdmEgICAgICAgICAgICAgbTEsIG0zCisgICAgU1dBUCAgICAgICAgICAgICAgMSwgMworICAgIG1vdmEgICAgICAgICAgICAgbTYsIG00ICAgICAgICAgIDsga2VlcCBjb3BpZXMgb2YgcDAvcTAgYXJvdW5kIGZvciBsYXRlciB1c2UKKyAgICBTV0FQICAgICAgICAgICAgICA2LCA0CisgICAgcHN1YnVzYiAgICAgICAgICBtMSwgbTQgICAgICAgICAgOyBwMC1xMAorICAgIHBzdWJ1c2IgICAgICAgICAgbTYsIG0zICAgICAgICAgIDsgcTAtcDAKKyAgICBwb3IgICAgICAgICAgICAgIG0xLCBtNiAgICAgICAgICA7IGFicyhxMC1wMCkKKyAgICBwYWRkdXNiICAgICAgICAgIG0xLCBtMSAgICAgICAgICA7IG0xPTIqYWJzKHEwLXAwKQorCisgICAgbW92YSAgICAgICAgICAgICBtNywgbTIKKyAgICBTV0FQICAgICAgICAgICAgICA3LCAyCisgICAgbW92YSAgICAgICAgICAgICBtNiwgbTUKKyAgICBTV0FQICAgICAgICAgICAgICA2LCA1CisgICAgcHN1YnVzYiAgICAgICAgICBtNywgbTUgICAgICAgICAgOyBwMS1xMQorICAgIHBzdWJ1c2IgICAgICAgICAgbTYsIG0yICAgICAgICAgIDsgcTEtcDEKKyAgICBwb3IgICAgICAgICAgICAgIG03LCBtNiAgICAgICAgICA7IGFicyhxMS1wMSkKKyAgICBweG9yICAgICAgICAgICAgIG02LCBtNgorICAgIHBhbmQgICAgICAgICAgICAgbTcsIFtwYl9GRV0KKyAgICBwc3JscSAgICAgICAgICAgIG03LCAxICAgICAgICAgICA7IGFicyhxMS1wMSkvMgorICAgIHBhZGR1c2IgICAgICAgICAgbTcsIG0xICAgICAgICAgIDsgYWJzKHEwLXAwKSoyK2FicyhxMS1wMSkvMgorICAgIHBzdWJ1c2IgICAgICAgICAgbTcsIG1fZmxpbUUKKyAgICBwY21wZXFiICAgICAgICAgIG03LCBtNiAgICAgICAgICA7IGFicyhxMC1wMCkqMithYnMocTEtcDEpLzIgPD0gRQorICAgIHBhbmQgICAgICAgICAgICAgbTAsIG03ICAgICAgICAgIDsgbm9ybWFsX2xpbWl0IHJlc3VsdAorCisgICAgOyBmaWx0ZXJfY29tbW9uOyBhdCB0aGlzIHBvaW50LCBtMi1tNT1wMS1xMSBhbmQgbTAgaXMgZmlsdGVyX21hc2sKKyVpZmRlZiBtOCA7IHg4Ni02NCAmJiBzc2UyCisgICAgbW92YSAgICAgICAgICAgICBtOCwgW3BiXzgwXQorJWRlZmluZSBtX3BiXzgwIG04CislZWxzZSA7IHg4Ni0zMiBvciBtbXgvbW14ZXh0CislZGVmaW5lIG1fcGJfODAgW3BiXzgwXQorJWVuZGlmCisgICAgbW92YSAgICAgICAgICAgICBtMSwgbTQKKyAgICBtb3ZhICAgICAgICAgICAgIG03LCBtMworICAgIHB4b3IgICAgICAgICAgICAgbTEsIG1fcGJfODAKKyAgICBweG9yICAgICAgICAgICAgIG03LCBtX3BiXzgwCisgICAgcHN1YnNiICAgICAgICAgICBtMSwgbTcgICAgICAgICAgOyAoc2lnbmVkKSBxMC1wMAorICAgIG1vdmEgICAgICAgICAgICAgbTYsIG0yCisgICAgbW92YSAgICAgICAgICAgICBtNywgbTUKKyAgICBweG9yICAgICAgICAgICAgIG02LCBtX3BiXzgwCisgICAgcHhvciAgICAgICAgICAgICBtNywgbV9wYl84MAorICAgIHBzdWJzYiAgICAgICAgICAgbTYsIG03ICAgICAgICAgIDsgKHNpZ25lZCkgcDEtcTEKKyAgICBtb3ZhICAgICAgICAgICAgIG03LCBtX21hc2tyZXMKKyAgICBwYW5kbiAgICAgICAgICAgIG03LCBtNgorICAgIHBhZGRzYiAgICAgICAgICAgbTcsIG0xCisgICAgcGFkZHNiICAgICAgICAgICBtNywgbTEKKyAgICBwYWRkc2IgICAgICAgICAgIG03LCBtMSAgICAgICAgICA7IDMqKHEwLXAwKStpczR0YXA/KHAxLXExKQorCisgICAgcGFuZCAgICAgICAgICAgICBtNywgbTAKKyAgICBtb3ZhICAgICAgICAgICAgIG0xLCBbcGJfRjhdCisgICAgbW92YSAgICAgICAgICAgICBtNiwgbTcKKyAgICBwYWRkc2IgICAgICAgICAgIG03LCBbcGJfM10KKyAgICBwYWRkc2IgICAgICAgICAgIG02LCBbcGJfNF0KKyAgICBwYW5kICAgICAgICAgICAgIG03LCBtMQorICAgIHBhbmQgICAgICAgICAgICAgbTYsIG0xCisKKyAgICBweG9yICAgICAgICAgICAgIG0xLCBtMQorICAgIHB4b3IgICAgICAgICAgICAgbTAsIG0wCisgICAgcGNtcGd0YiAgICAgICAgICBtMSwgbTcKKyAgICBwc3ViYiAgICAgICAgICAgIG0wLCBtNworICAgIHBzcmxxICAgICAgICAgICAgbTcsIDMgICAgICAgICAgIDsgK2YyCisgICAgcHNybHEgICAgICAgICAgICBtMCwgMyAgICAgICAgICAgOyAtZjIKKyAgICBwYW5kICAgICAgICAgICAgIG0wLCBtMQorICAgIHBhbmRuICAgICAgICAgICAgbTEsIG03CisgICAgcHN1YnVzYiAgICAgICAgICBtMywgbTAKKyAgICBwYWRkdXNiICAgICAgICAgIG0zLCBtMSAgICAgICAgICA7IHAwK2YyCisKKyAgICBweG9yICAgICAgICAgICAgIG0xLCBtMQorICAgIHB4b3IgICAgICAgICAgICAgbTAsIG0wCisgICAgcGNtcGd0YiAgICAgICAgICBtMCwgbTYKKyAgICBwc3ViYiAgICAgICAgICAgIG0xLCBtNgorICAgIHBzcmxxICAgICAgICAgICAgbTYsIDMgICAgICAgICAgIDsgK2YxCisgICAgcHNybHEgICAgICAgICAgICBtMSwgMyAgICAgICAgICAgOyAtZjEKKyAgICBwYW5kICAgICAgICAgICAgIG0xLCBtMAorICAgIHBhbmRuICAgICAgICAgICAgbTAsIG02CisgICAgcHN1YnVzYiAgICAgICAgICBtNCwgbTAKKyAgICBwYWRkdXNiICAgICAgICAgIG00LCBtMSAgICAgICAgICA7IHEwLWYxCisKKyVpZmRlZiBtMTIKKyAgICBTV0FQICAgICAgICAgICAgICA2LCAxMgorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAgIG02LCBtX21hc2tyZXMKKyVlbmRpZgorJWlmIG5vdGNwdWZsYWcobW14ZXh0KQorICAgIG1vdmEgICAgICAgICAgICAgbTcsIFtwYl8xXQorJWVsc2UgOyBtbXhleHQvc3NlMgorICAgIHB4b3IgICAgICAgICAgICAgbTcsIG03CislZW5kaWYKKyAgICBwYW5kICAgICAgICAgICAgIG0wLCBtNgorICAgIHBhbmQgICAgICAgICAgICAgbTEsIG02CislaWYgbm90Y3B1ZmxhZyhtbXhleHQpCisgICAgcGFkZHVzYiAgICAgICAgICBtMCwgbTcKKyAgICBwYW5kICAgICAgICAgICAgIG0xLCBbcGJfRkVdCisgICAgcGFuZG4gICAgICAgICAgICBtNywgbTAKKyAgICBwc3JscSAgICAgICAgICAgIG0xLCAxCisgICAgcHNybHEgICAgICAgICAgICBtNywgMQorICAgIFNXQVAgICAgICAgICAgICAgIDAsIDcKKyVlbHNlIDsgbW14ZXh0L3NzZTIKKyAgICBwc3VidXNiICAgICAgICAgIG0xLCBbcGJfMV0KKyAgICBwYXZnYiAgICAgICAgICAgIG0wLCBtNyAgICAgICAgICA7IGEKKyAgICBwYXZnYiAgICAgICAgICAgIG0xLCBtNyAgICAgICAgICA7IC1hCislZW5kaWYKKyAgICBwc3VidXNiICAgICAgICAgIG01LCBtMAorICAgIHBzdWJ1c2IgICAgICAgICAgbTIsIG0xCisgICAgcGFkZHVzYiAgICAgICAgICBtNSwgbTEgICAgICAgICAgOyBxMS1hCisgICAgcGFkZHVzYiAgICAgICAgICBtMiwgbTAgICAgICAgICAgOyBwMSthCisKKyAgICA7IHN0b3JlCislaWZpZG4gJTEsIHYKKyAgICBtb3Zyb3cgW2RzdDFxK21zdHJpZGVxKjJdLCBtMgorICAgIG1vdnJvdyBbZHN0MXErbXN0cmlkZXEgIF0sIG0zCisgICAgbW92cm93ICAgICAgW2RzdDFxXSwgbTQKKyAgICBtb3Zyb3cgW2RzdDFxKyBzdHJpZGVxICBdLCBtNQorJWlmIG1tc2l6ZSA9PSAxNiAmJiAlMiA9PSA4CisgICAgbW92aHBzIFtkc3Q4cSttc3RyaWRlcSoyXSwgbTIKKyAgICBtb3ZocHMgW2RzdDhxK21zdHJpZGVxICBdLCBtMworICAgIG1vdmhwcyAgICAgIFtkc3Q4cV0sIG00CisgICAgbW92aHBzIFtkc3Q4cSsgc3RyaWRlcSAgXSwgbTUKKyVlbmRpZgorJWVsc2UgOyBoCisgICAgYWRkICAgICAgICAgICBkc3QxcSwgMgorICAgIGFkZCAgICAgICAgICAgZHN0MnEsIDIKKworICAgIDsgNHg4LzE2IHRyYW5zcG9zZQorICAgIFRSQU5TUE9TRTR4NEIgICAgIDIsIDMsIDQsIDUsIDYKKworJWlmIG1tc2l6ZSA9PSA4IDsgbW14L21teGV4dCAoaCkKKyAgICBXUklURV80eDJEICAgICAgICAyLCAzLCA0LCA1LCBkc3QxcSwgZHN0MnEsIG1zdHJpZGVxLCBzdHJpZGVxCislZWxzZSA7IHNzZTIgKGgpCisgICAgbGVhICAgICAgICAgICBkc3Q4cSwgW2RzdDhxK21zdHJpZGVxICArMl0KKyAgICBXUklURV80eDREICAgICAgICAyLCAzLCA0LCA1LCBkc3QxcSwgZHN0MnEsIGRzdDhxLCBtc3RyaWRlcSwgc3RyaWRlcSwgJTIKKyVlbmRpZgorJWVuZGlmCisKKyVpZiBtbXNpemUgPT0gOAorJWlmICUyID09IDggOyBjaHJvbWEKKyVpZmlkbiAlMSwgaAorICAgIHN1YiAgICAgICAgICAgZHN0MXEsIDIKKyVlbmRpZgorICAgIGNtcCAgICAgICAgICAgZHN0MXEsIGRzdDhxCisgICAgbW92ICAgICAgICAgICBkc3QxcSwgZHN0OHEKKyAgICBqbnogLm5leHQ4cHgKKyVlbHNlCislaWZpZG4gJTEsIGgKKyAgICBsZWEgICAgICAgICAgIGRzdDFxLCBbZHN0MXErIHN0cmlkZXEqOC0yXQorJWVsc2UgOyB2CisgICAgYWRkICAgICAgICAgICBkc3QxcSwgOAorJWVuZGlmCisgICAgZGVjICAgICAgICAgICBjbnRycQorICAgIGpnIC5uZXh0OHB4CislZW5kaWYKKyAgICBSRVBfUkVUCislZWxzZSA7IG1tc2l6ZSA9PSAxNgorICAgIFJFVAorJWVuZGlmCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzMyCitJTklUX01NWCBtbXgKK0lOTkVSX0xPT1BGSUxURVIgdiwgMTYKK0lOTkVSX0xPT1BGSUxURVIgaCwgMTYKK0lOTkVSX0xPT1BGSUxURVIgdiwgIDgKK0lOTkVSX0xPT1BGSUxURVIgaCwgIDgKKworSU5JVF9NTVggbW14ZXh0CitJTk5FUl9MT09QRklMVEVSIHYsIDE2CitJTk5FUl9MT09QRklMVEVSIGgsIDE2CitJTk5FUl9MT09QRklMVEVSIHYsICA4CitJTk5FUl9MT09QRklMVEVSIGgsICA4CislZW5kaWYKKworSU5JVF9YTU0gc3NlMgorSU5ORVJfTE9PUEZJTFRFUiB2LCAxNgorSU5ORVJfTE9PUEZJTFRFUiBoLCAxNgorSU5ORVJfTE9PUEZJTFRFUiB2LCAgOAorSU5ORVJfTE9PUEZJTFRFUiBoLCAgOAorCitJTklUX1hNTSBzc3NlMworSU5ORVJfTE9PUEZJTFRFUiB2LCAxNgorSU5ORVJfTE9PUEZJTFRFUiBoLCAxNgorSU5ORVJfTE9PUEZJTFRFUiB2LCAgOAorSU5ORVJfTE9PUEZJTFRFUiBoLCAgOAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl92cDhfaC92X2xvb3BfZmlsdGVyPHNpemU+X21iZWRnZV88b3B0Pih1aW50OF90ICpkc3QsIFt1aW50OF90ICp2LF0gaW50IHN0cmlkZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxpbUUsIGludCBmbGltSSwgaW50IGhldl90aHIpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBNQkVER0VfTE9PUEZJTFRFUiAyCislZGVmaW5lIHN0YWNrX3NpemUgMAorJWlmbmRlZiBtOCAgICAgICA7IHN0YWNrIGxheW91dDogWzBdPUUsIFsxXT1JLCBbMl09aGV2X3RocgorJWlmIG1tc2l6ZSA9PSAxNiA7ICAgICAgICAgICAgICAgWzNdPWhldigpIHJlc3VsdAorICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgWzRdPWZpbHRlciB0bXAgcmVzdWx0CisgICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICBbNV0vWzZdID0gcDIvcTIgYmFja3VwCisgICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICBbN109bGltX3JlcyBzaWduIHJlc3VsdAorJWRlZmluZSBzdGFja19zaXplIG1tc2l6ZSAqIC03CislZWxzZSA7IDggICAgICAgIDsgZXh0cmEgc3RvcmFnZSBzcGFjZSBmb3IgdHJhbnNwb3NlcworJWRlZmluZSBzdGFja19zaXplIG1tc2l6ZSAqIC04CislZW5kaWYKKyVlbmRpZgorCislaWYgJTIgPT0gOCA7IGNocm9tYQorY2dsb2JhbCB2cDhfJTFfbG9vcF9maWx0ZXI4dXZfbWJlZGdlLCA2LCA2LCAxNSwgc3RhY2tfc2l6ZSwgZHN0MSwgZHN0OCwgc3RyaWRlLCBmbGltRSwgZmxpbUksIGhldnRocgorJWVsc2UgOyBsdW1hCitjZ2xvYmFsIHZwOF8lMV9sb29wX2ZpbHRlcjE2eV9tYmVkZ2UsIDUsIDUsIDE1LCBzdGFja19zaXplLCBkc3QxLCBzdHJpZGUsIGZsaW1FLCBmbGltSSwgaGV2dGhyCislZW5kaWYKKworJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgcHhvciAgICAgICAgICAgICBtNywgbTcKKyVlbmRpZgorCislaWZuZGVmIG04CisgICAgOyBzcGxhdCBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBTUExBVEJfUkVHICAgICAgIG0wLCBmbGltRXEsIG03ICAgOyBFCisgICAgU1BMQVRCX1JFRyAgICAgICBtMSwgZmxpbUlxLCBtNyAgIDsgSQorICAgIFNQTEFUQl9SRUcgICAgICAgbTIsIGhldnRocnEsIG03ICA7IGhldl90aHJlc2gKKworJWRlZmluZSBtX2ZsaW1FICAgIFtyc3BdCislZGVmaW5lIG1fZmxpbUkgICAgW3JzcCttbXNpemVdCislZGVmaW5lIG1faGV2dGhyICAgW3JzcCttbXNpemUqMl0KKyVkZWZpbmUgbV9tYXNrcmVzICBbcnNwK21tc2l6ZSozXQorJWRlZmluZSBtX2xpbXJlcyAgIFtyc3ArbW1zaXplKjRdCislZGVmaW5lIG1fcDBiYWNrdXAgW3JzcCttbXNpemUqM10KKyVkZWZpbmUgbV9xMGJhY2t1cCBbcnNwK21tc2l6ZSo0XQorJWRlZmluZSBtX3AyYmFja3VwIFtyc3ArbW1zaXplKjVdCislZGVmaW5lIG1fcTJiYWNrdXAgW3JzcCttbXNpemUqNl0KKyVpZiBtbXNpemUgPT0gMTYKKyVkZWZpbmUgbV9saW1zaWduICBbcnNwXQorJWVsc2UKKyVkZWZpbmUgbV9saW1zaWduICBbcnNwK21tc2l6ZSo3XQorJWVuZGlmCisKKyAgICBtb3ZhICAgICAgICBtX2ZsaW1FLCBtMAorICAgIG1vdmEgICAgICAgIG1fZmxpbUksIG0xCisgICAgbW92YSAgICAgICBtX2hldnRociwgbTIKKyVlbHNlIDsgc3NlMiBvbiB4ODYtNjQKKyVkZWZpbmUgbV9mbGltRSAgICBtOQorJWRlZmluZSBtX2ZsaW1JICAgIG0xMAorJWRlZmluZSBtX2hldnRociAgIG0xMQorJWRlZmluZSBtX21hc2tyZXMgIG0xMgorJWRlZmluZSBtX2xpbXJlcyAgIG04CislZGVmaW5lIG1fcDBiYWNrdXAgbTEyCislZGVmaW5lIG1fcTBiYWNrdXAgbTgKKyVkZWZpbmUgbV9wMmJhY2t1cCBtMTMKKyVkZWZpbmUgbV9xMmJhY2t1cCBtMTQKKyVkZWZpbmUgbV9saW1zaWduICBtOQorCisgICAgOyBzcGxhdCBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBTUExBVEJfUkVHICBtX2ZsaW1FLCBmbGltRXEsIG03ICAgOyBFCisgICAgU1BMQVRCX1JFRyAgbV9mbGltSSwgZmxpbUlxLCBtNyAgIDsgSQorICAgIFNQTEFUQl9SRUcgbV9oZXZ0aHIsIGhldnRocnEsIG03ICA7IGhldl90aHJlc2gKKyVlbmRpZgorCislaWYgJTIgPT0gOCA7IGNocm9tYQorICAgIERFRklORV9BUkdTIGRzdDEsIGRzdDgsIG1zdHJpZGUsIHN0cmlkZSwgZHN0MgorJWVsaWYgbW1zaXplID09IDgKKyAgICBERUZJTkVfQVJHUyBkc3QxLCBtc3RyaWRlLCBzdHJpZGUsIGRzdDIsIGNudHIKKyAgICBtb3YgICAgICAgICAgIGNudHJxLCAyCislZWxzZQorICAgIERFRklORV9BUkdTIGRzdDEsIG1zdHJpZGUsIHN0cmlkZSwgZHN0MiwgZHN0OAorJWVuZGlmCisgICAgbW92ICAgICAgICAgc3RyaWRlcSwgbXN0cmlkZXEKKyAgICBuZWcgICAgICAgIG1zdHJpZGVxCislaWZpZG4gJTEsIGgKKyAgICBsZWEgICAgICAgICAgIGRzdDFxLCBbZHN0MXErc3RyaWRlcSo0LTRdCislaWYgJTIgPT0gOCA7IGNocm9tYQorICAgIGxlYSAgICAgICAgICAgZHN0OHEsIFtkc3Q4cStzdHJpZGVxKjQtNF0KKyVlbmRpZgorJWVuZGlmCisKKyVpZiBtbXNpemUgPT0gOAorLm5leHQ4cHg6CislZW5kaWYKKyAgICA7IHJlYWQKKyAgICBsZWEgICAgICAgICAgIGRzdDJxLCBbZHN0MXErIHN0cmlkZXEgIF0KKyVpZmlkbiAlMSwgdgorJWlmICUyID09IDggJiYgbW1zaXplID09IDE2CislZGVmaW5lIG1vdnJvdyBtb3ZoCislZWxzZQorJWRlZmluZSBtb3Zyb3cgbW92YQorJWVuZGlmCisgICAgbW92cm93ICAgICAgICAgICBtMCwgW2RzdDFxK21zdHJpZGVxKjRdIDsgcDMKKyAgICBtb3Zyb3cgICAgICAgICAgIG0xLCBbZHN0MnErbXN0cmlkZXEqNF0gOyBwMgorICAgIG1vdnJvdyAgICAgICAgICAgbTIsIFtkc3QxcSttc3RyaWRlcSoyXSA7IHAxCisgICAgbW92cm93ICAgICAgICAgICBtNSwgW2RzdDJxXSAgICAgICAgICAgIDsgcTEKKyAgICBtb3Zyb3cgICAgICAgICAgIG02LCBbZHN0MnErIHN0cmlkZXEgIF0gOyBxMgorICAgIG1vdnJvdyAgICAgICAgICAgbTcsIFtkc3QycSsgc3RyaWRlcSoyXSA7IHEzCislaWYgbW1zaXplID09IDE2ICYmICUyID09IDgKKyAgICBtb3ZocHMgICAgICAgICAgIG0wLCBbZHN0OHErbXN0cmlkZXEqNF0KKyAgICBtb3ZocHMgICAgICAgICAgIG0yLCBbZHN0OHErbXN0cmlkZXEqMl0KKyAgICBhZGQgICAgICAgICAgIGRzdDhxLCBzdHJpZGVxCisgICAgbW92aHBzICAgICAgICAgICBtMSwgW2RzdDhxK21zdHJpZGVxKjRdCisgICAgbW92aHBzICAgICAgICAgICBtNSwgW2RzdDhxXQorICAgIG1vdmhwcyAgICAgICAgICAgbTYsIFtkc3Q4cSsgc3RyaWRlcSAgXQorICAgIG1vdmhwcyAgICAgICAgICAgbTcsIFtkc3Q4cSsgc3RyaWRlcSoyXQorICAgIGFkZCAgICAgICAgICAgZHN0OHEsIG1zdHJpZGVxCislZW5kaWYKKyVlbGlmIG1tc2l6ZSA9PSA4IDsgbW14L21teGV4dCAoaCkKKyAgICA7IHJlYWQgOCByb3dzIG9mIDhweCBlYWNoCisgICAgbW92dSAgICAgICAgICAgICBtMCwgW2RzdDFxK21zdHJpZGVxKjRdCisgICAgbW92dSAgICAgICAgICAgICBtMSwgW2RzdDJxK21zdHJpZGVxKjRdCisgICAgbW92dSAgICAgICAgICAgICBtMiwgW2RzdDFxK21zdHJpZGVxKjJdCisgICAgbW92dSAgICAgICAgICAgICBtMywgW2RzdDFxK21zdHJpZGVxICBdCisgICAgbW92dSAgICAgICAgICAgICBtNCwgW2RzdDFxXQorICAgIG1vdnUgICAgICAgICAgICAgbTUsIFtkc3QycV0KKyAgICBtb3Z1ICAgICAgICAgICAgIG02LCBbZHN0MnErIHN0cmlkZXEgIF0KKworICAgIDsgOHg4IHRyYW5zcG9zZQorICAgIFRSQU5TUE9TRTR4NEIgICAgIDAsIDEsIDIsIDMsIDcKKyAgICBtb3ZhICAgICBtX3EwYmFja3VwLCBtMQorICAgIG1vdnUgICAgICAgICAgICAgbTcsIFtkc3QycSsgc3RyaWRlcSoyXQorICAgIFRSQU5TUE9TRTR4NEIgICAgIDQsIDUsIDYsIDcsIDEKKyAgICBTQlVUVEVSRkxZICAgICAgIGRxLCAwLCA0LCAxICAgICA7IHAzL3AyCisgICAgU0JVVFRFUkZMWSAgICAgICBkcSwgMiwgNiwgMSAgICAgOyBxMC9xMQorICAgIFNCVVRURVJGTFkgICAgICAgZHEsIDMsIDcsIDEgICAgIDsgcTIvcTMKKyAgICBtb3ZhICAgICAgICAgICAgIG0xLCBtX3EwYmFja3VwCisgICAgbW92YSAgICAgbV9xMGJhY2t1cCwgbTIgICAgICAgICAgOyBzdG9yZSBxMAorICAgIFNCVVRURVJGTFkgICAgICAgZHEsIDEsIDUsIDIgICAgIDsgcDEvcDAKKyAgICBtb3ZhICAgICBtX3AwYmFja3VwLCBtNSAgICAgICAgICA7IHN0b3JlIHAwCisgICAgU1dBUCAgICAgICAgICAgICAgMSwgNAorICAgIFNXQVAgICAgICAgICAgICAgIDIsIDQKKyAgICBTV0FQICAgICAgICAgICAgICA2LCAzCisgICAgU1dBUCAgICAgICAgICAgICAgNSwgMworJWVsc2UgOyBzc2UyIChoKQorJWlmICUyID09IDE2CisgICAgbGVhICAgICAgICAgICBkc3Q4cSwgW2RzdDFxKyBzdHJpZGVxKjggIF0KKyVlbmRpZgorCisgICAgOyByZWFkIDE2IHJvd3Mgb2YgOHB4IGVhY2gsIGludGVybGVhdmUKKyAgICBtb3ZoICAgICAgICAgICAgIG0wLCBbZHN0MXErbXN0cmlkZXEqNF0KKyAgICBtb3ZoICAgICAgICAgICAgIG0xLCBbZHN0OHErbXN0cmlkZXEqNF0KKyAgICBtb3ZoICAgICAgICAgICAgIG0yLCBbZHN0MXErbXN0cmlkZXEqMl0KKyAgICBtb3ZoICAgICAgICAgICAgIG01LCBbZHN0OHErbXN0cmlkZXEqMl0KKyAgICBtb3ZoICAgICAgICAgICAgIG0zLCBbZHN0MXErbXN0cmlkZXEgIF0KKyAgICBtb3ZoICAgICAgICAgICAgIG02LCBbZHN0OHErbXN0cmlkZXEgIF0KKyAgICBtb3ZoICAgICAgICAgICAgIG00LCBbZHN0MXFdCisgICAgbW92aCAgICAgICAgICAgICBtNywgW2RzdDhxXQorICAgIHB1bnBja2xidyAgICAgICAgbTAsIG0xICAgICAgICAgIDsgQS9JCisgICAgcHVucGNrbGJ3ICAgICAgICBtMiwgbTUgICAgICAgICAgOyBDL0sKKyAgICBwdW5wY2tsYncgICAgICAgIG0zLCBtNiAgICAgICAgICA7IEQvTAorICAgIHB1bnBja2xidyAgICAgICAgbTQsIG03ICAgICAgICAgIDsgRS9NCisKKyAgICBhZGQgICAgICAgICAgIGRzdDhxLCBzdHJpZGVxCisgICAgbW92aCAgICAgICAgICAgICBtMSwgW2RzdDJxK21zdHJpZGVxKjRdCisgICAgbW92aCAgICAgICAgICAgICBtNiwgW2RzdDhxK21zdHJpZGVxKjRdCisgICAgbW92aCAgICAgICAgICAgICBtNSwgW2RzdDJxXQorICAgIG1vdmggICAgICAgICAgICAgbTcsIFtkc3Q4cV0KKyAgICBwdW5wY2tsYncgICAgICAgIG0xLCBtNiAgICAgICAgICA7IEIvSgorICAgIHB1bnBja2xidyAgICAgICAgbTUsIG03ICAgICAgICAgIDsgRi9OCisgICAgbW92aCAgICAgICAgICAgICBtNiwgW2RzdDJxKyBzdHJpZGVxICBdCisgICAgbW92aCAgICAgICAgICAgICBtNywgW2RzdDhxKyBzdHJpZGVxICBdCisgICAgcHVucGNrbGJ3ICAgICAgICBtNiwgbTcgICAgICAgICAgOyBHL08KKworICAgIDsgOHgxNiB0cmFuc3Bvc2UKKyAgICBUUkFOU1BPU0U0eDRCICAgICAwLCAxLCAyLCAzLCA3CislaWZkZWYgbTgKKyAgICBTV0FQICAgICAgICAgICAgICAxLCA4CislZWxzZQorICAgIG1vdmEgICAgIG1fcTBiYWNrdXAsIG0xCislZW5kaWYKKyAgICBtb3ZoICAgICAgICAgICAgIG03LCBbZHN0MnErIHN0cmlkZXEqMl0KKyAgICBtb3ZoICAgICAgICAgICAgIG0xLCBbZHN0OHErIHN0cmlkZXEqMl0KKyAgICBwdW5wY2tsYncgICAgICAgIG03LCBtMSAgICAgICAgICA7IEgvUAorICAgIFRSQU5TUE9TRTR4NEIgICAgIDQsIDUsIDYsIDcsIDEKKyAgICBTQlVUVEVSRkxZICAgICAgIGRxLCAwLCA0LCAxICAgICA7IHAzL3AyCisgICAgU0JVVFRFUkZMWSAgICAgICBkcSwgMiwgNiwgMSAgICAgOyBxMC9xMQorICAgIFNCVVRURVJGTFkgICAgICAgZHEsIDMsIDcsIDEgICAgIDsgcTIvcTMKKyVpZmRlZiBtOAorICAgIFNXQVAgICAgICAgICAgICAgIDEsIDgKKyAgICBTV0FQICAgICAgICAgICAgICAyLCA4CislZWxzZQorICAgIG1vdmEgICAgICAgICAgICAgbTEsIG1fcTBiYWNrdXAKKyAgICBtb3ZhICAgICBtX3EwYmFja3VwLCBtMiAgICAgICAgICA7IHN0b3JlIHEwCislZW5kaWYKKyAgICBTQlVUVEVSRkxZICAgICAgIGRxLCAxLCA1LCAyICAgICA7IHAxL3AwCislaWZkZWYgbTEyCisgICAgU1dBUCAgICAgICAgICAgICAgNSwgMTIKKyVlbHNlCisgICAgbW92YSAgICAgbV9wMGJhY2t1cCwgbTUgICAgICAgICAgOyBzdG9yZSBwMAorJWVuZGlmCisgICAgU1dBUCAgICAgICAgICAgICAgMSwgNAorICAgIFNXQVAgICAgICAgICAgICAgIDIsIDQKKyAgICBTV0FQICAgICAgICAgICAgICA2LCAzCisgICAgU1dBUCAgICAgICAgICAgICAgNSwgMworJWVuZGlmCisKKyAgICA7IG5vcm1hbF9saW1pdCBmb3IgcDMtcDIsIHAyLXAxLCBxMy1xMiBhbmQgcTItcTEKKyAgICBtb3ZhICAgICAgICAgICAgIG00LCBtMQorICAgIFNXQVAgICAgICAgICAgICAgIDQsIDEKKyAgICBwc3VidXNiICAgICAgICAgIG00LCBtMCAgICAgICAgICA7IHAyLXAzCisgICAgcHN1YnVzYiAgICAgICAgICBtMCwgbTEgICAgICAgICAgOyBwMy1wMgorICAgIHBvciAgICAgICAgICAgICAgbTAsIG00ICAgICAgICAgIDsgYWJzKHAzLXAyKQorCisgICAgbW92YSAgICAgICAgICAgICBtNCwgbTIKKyAgICBTV0FQICAgICAgICAgICAgICA0LCAyCisgICAgcHN1YnVzYiAgICAgICAgICBtNCwgbTEgICAgICAgICAgOyBwMS1wMgorICAgIG1vdmEgICAgIG1fcDJiYWNrdXAsIG0xCisgICAgcHN1YnVzYiAgICAgICAgICBtMSwgbTIgICAgICAgICAgOyBwMi1wMQorICAgIHBvciAgICAgICAgICAgICAgbTEsIG00ICAgICAgICAgIDsgYWJzKHAyLXAxKQorCisgICAgbW92YSAgICAgICAgICAgICBtNCwgbTYKKyAgICBTV0FQICAgICAgICAgICAgICA0LCA2CisgICAgcHN1YnVzYiAgICAgICAgICBtNCwgbTcgICAgICAgICAgOyBxMi1xMworICAgIHBzdWJ1c2IgICAgICAgICAgbTcsIG02ICAgICAgICAgIDsgcTMtcTIKKyAgICBwb3IgICAgICAgICAgICAgIG03LCBtNCAgICAgICAgICA7IGFicyhxMy1xMikKKworICAgIG1vdmEgICAgICAgICAgICAgbTQsIG01CisgICAgU1dBUCAgICAgICAgICAgICAgNCwgNQorICAgIHBzdWJ1c2IgICAgICAgICAgbTQsIG02ICAgICAgICAgIDsgcTEtcTIKKyAgICBtb3ZhICAgICBtX3EyYmFja3VwLCBtNgorICAgIHBzdWJ1c2IgICAgICAgICAgbTYsIG01ICAgICAgICAgIDsgcTItcTEKKyAgICBwb3IgICAgICAgICAgICAgIG02LCBtNCAgICAgICAgICA7IGFicyhxMi1xMSkKKworJWlmIG5vdGNwdWZsYWcobW14ZXh0KQorICAgIG1vdmEgICAgICAgICAgICAgbTQsIG1fZmxpbUkKKyAgICBweG9yICAgICAgICAgICAgIG0zLCBtMworICAgIHBzdWJ1c2IgICAgICAgICAgbTAsIG00CisgICAgcHN1YnVzYiAgICAgICAgICBtMSwgbTQKKyAgICBwc3VidXNiICAgICAgICAgIG03LCBtNAorICAgIHBzdWJ1c2IgICAgICAgICAgbTYsIG00CisgICAgcGNtcGVxYiAgICAgICAgICBtMCwgbTMgICAgICAgICAgOyBhYnMocDMtcDIpIDw9IEkKKyAgICBwY21wZXFiICAgICAgICAgIG0xLCBtMyAgICAgICAgICA7IGFicyhwMi1wMSkgPD0gSQorICAgIHBjbXBlcWIgICAgICAgICAgbTcsIG0zICAgICAgICAgIDsgYWJzKHEzLXEyKSA8PSBJCisgICAgcGNtcGVxYiAgICAgICAgICBtNiwgbTMgICAgICAgICAgOyBhYnMocTItcTEpIDw9IEkKKyAgICBwYW5kICAgICAgICAgICAgIG0wLCBtMQorICAgIHBhbmQgICAgICAgICAgICAgbTcsIG02CisgICAgcGFuZCAgICAgICAgICAgICBtMCwgbTcKKyVlbHNlIDsgbW14ZXh0L3NzZTIKKyAgICBwbWF4dWIgICAgICAgICAgIG0wLCBtMQorICAgIHBtYXh1YiAgICAgICAgICAgbTYsIG03CisgICAgcG1heHViICAgICAgICAgICBtMCwgbTYKKyVlbmRpZgorCisgICAgOyBub3JtYWxfbGltaXQgYW5kIGhpZ2hfZWRnZV92YXJpYW5jZSBmb3IgcDEtcDAsIHExLXEwCisgICAgU1dBUCAgICAgICAgICAgICAgNywgMyAgICAgICAgICAgOyBub3cgbTcgaXMgemVybworJWlmaWRuICUxLCB2CisgICAgbW92cm93ICAgICAgICAgICBtMywgW2RzdDFxK21zdHJpZGVxICBdIDsgcDAKKyVpZiBtbXNpemUgPT0gMTYgJiYgJTIgPT0gOAorICAgIG1vdmhwcyAgICAgICAgICAgbTMsIFtkc3Q4cSttc3RyaWRlcSAgXQorJWVuZGlmCislZWxpZmRlZiBtMTIKKyAgICBTV0FQICAgICAgICAgICAgICAzLCAxMgorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAgIG0zLCBtX3AwYmFja3VwCislZW5kaWYKKworICAgIG1vdmEgICAgICAgICAgICAgbTEsIG0yCisgICAgU1dBUCAgICAgICAgICAgICAgMSwgMgorICAgIG1vdmEgICAgICAgICAgICAgbTYsIG0zCisgICAgU1dBUCAgICAgICAgICAgICAgMywgNgorICAgIHBzdWJ1c2IgICAgICAgICAgbTEsIG0zICAgICAgICAgIDsgcDEtcDAKKyAgICBwc3VidXNiICAgICAgICAgIG02LCBtMiAgICAgICAgICA7IHAwLXAxCisgICAgcG9yICAgICAgICAgICAgICBtMSwgbTYgICAgICAgICAgOyBhYnMocDEtcDApCislaWYgbm90Y3B1ZmxhZyhtbXhleHQpCisgICAgbW92YSAgICAgICAgICAgICBtNiwgbTEKKyAgICBwc3VidXNiICAgICAgICAgIG0xLCBtNAorICAgIHBzdWJ1c2IgICAgICAgICAgbTYsIG1faGV2dGhyCisgICAgcGNtcGVxYiAgICAgICAgICBtMSwgbTcgICAgICAgICAgOyBhYnMocDEtcDApIDw9IEkKKyAgICBwY21wZXFiICAgICAgICAgIG02LCBtNyAgICAgICAgICA7IGFicyhwMS1wMCkgPD0gaGV2X3RocmVzaAorICAgIHBhbmQgICAgICAgICAgICAgbTAsIG0xCisgICAgbW92YSAgICAgIG1fbWFza3JlcywgbTYKKyVlbHNlIDsgbW14ZXh0L3NzZTIKKyAgICBwbWF4dWIgICAgICAgICAgIG0wLCBtMSAgICAgICAgICA7IG1heF9JCisgICAgU1dBUCAgICAgICAgICAgICAgMSwgNCAgICAgICAgICAgOyBtYXhfaGV2X3RocmVzaAorJWVuZGlmCisKKyAgICBTV0FQICAgICAgICAgICAgICA2LCA0ICAgICAgICAgICA7IG5vdyBtNiBpcyBJCislaWZpZG4gJTEsIHYKKyAgICBtb3Zyb3cgICAgICAgICAgIG00LCBbZHN0MXFdICAgICA7IHEwCislaWYgbW1zaXplID09IDE2ICYmICUyID09IDgKKyAgICBtb3ZocHMgICAgICAgICAgIG00LCBbZHN0OHFdCislZW5kaWYKKyVlbGlmZGVmIG04CisgICAgU1dBUCAgICAgICAgICAgICAgNCwgOAorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAgIG00LCBtX3EwYmFja3VwCislZW5kaWYKKyAgICBtb3ZhICAgICAgICAgICAgIG0xLCBtNAorICAgIFNXQVAgICAgICAgICAgICAgIDEsIDQKKyAgICBtb3ZhICAgICAgICAgICAgIG03LCBtNQorICAgIFNXQVAgICAgICAgICAgICAgIDcsIDUKKyAgICBwc3VidXNiICAgICAgICAgIG0xLCBtNSAgICAgICAgICA7IHEwLXExCisgICAgcHN1YnVzYiAgICAgICAgICBtNywgbTQgICAgICAgICAgOyBxMS1xMAorICAgIHBvciAgICAgICAgICAgICAgbTEsIG03ICAgICAgICAgIDsgYWJzKHExLXEwKQorJWlmIG5vdGNwdWZsYWcobW14ZXh0KQorICAgIG1vdmEgICAgICAgICAgICAgbTcsIG0xCisgICAgcHN1YnVzYiAgICAgICAgICBtMSwgbTYKKyAgICBwc3VidXNiICAgICAgICAgIG03LCBtX2hldnRocgorICAgIHB4b3IgICAgICAgICAgICAgbTYsIG02CisgICAgcGNtcGVxYiAgICAgICAgICBtMSwgbTYgICAgICAgICAgOyBhYnMocTEtcTApIDw9IEkKKyAgICBwY21wZXFiICAgICAgICAgIG03LCBtNiAgICAgICAgICA7IGFicyhxMS1xMCkgPD0gaGV2X3RocmVzaAorICAgIG1vdmEgICAgICAgICAgICAgbTYsIG1fbWFza3JlcworICAgIHBhbmQgICAgICAgICAgICAgbTAsIG0xICAgICAgICAgIDsgYWJzKFtwcV1bMzIxXS1bcHFdWzIxMF0pIDw9IEkKKyAgICBwYW5kICAgICAgICAgICAgIG02LCBtNworJWVsc2UgOyBtbXhleHQvc3NlMgorICAgIHB4b3IgICAgICAgICAgICAgbTcsIG03CisgICAgcG1heHViICAgICAgICAgICBtMCwgbTEKKyAgICBwbWF4dWIgICAgICAgICAgIG02LCBtMQorICAgIHBzdWJ1c2IgICAgICAgICAgbTAsIG1fZmxpbUkKKyAgICBwc3VidXNiICAgICAgICAgIG02LCBtX2hldnRocgorICAgIHBjbXBlcWIgICAgICAgICAgbTAsIG03ICAgICAgICAgIDsgbWF4KGFicyguLikpIDw9IEkKKyAgICBwY21wZXFiICAgICAgICAgIG02LCBtNyAgICAgICAgICA7ICEobWF4KGFicy4uKSA+IHRocmVzaCkKKyVlbmRpZgorJWlmZGVmIG0xMgorICAgIFNXQVAgICAgICAgICAgICAgIDYsIDEyCislZWxzZQorICAgIG1vdmEgICAgICBtX21hc2tyZXMsIG02ICAgICAgICAgIDsgIShhYnMocDEtcDApID4gaGV2X3QgfHwgYWJzKHExLXEwKSA+IGhldl90KQorJWVuZGlmCisKKyAgICA7IHNpbXBsZV9saW1pdAorICAgIG1vdmEgICAgICAgICAgICAgbTEsIG0zCisgICAgU1dBUCAgICAgICAgICAgICAgMSwgMworICAgIG1vdmEgICAgICAgICAgICAgbTYsIG00ICAgICAgICAgIDsga2VlcCBjb3BpZXMgb2YgcDAvcTAgYXJvdW5kIGZvciBsYXRlciB1c2UKKyAgICBTV0FQICAgICAgICAgICAgICA2LCA0CisgICAgcHN1YnVzYiAgICAgICAgICBtMSwgbTQgICAgICAgICAgOyBwMC1xMAorICAgIHBzdWJ1c2IgICAgICAgICAgbTYsIG0zICAgICAgICAgIDsgcTAtcDAKKyAgICBwb3IgICAgICAgICAgICAgIG0xLCBtNiAgICAgICAgICA7IGFicyhxMC1wMCkKKyAgICBwYWRkdXNiICAgICAgICAgIG0xLCBtMSAgICAgICAgICA7IG0xPTIqYWJzKHEwLXAwKQorCisgICAgbW92YSAgICAgICAgICAgICBtNywgbTIKKyAgICBTV0FQICAgICAgICAgICAgICA3LCAyCisgICAgbW92YSAgICAgICAgICAgICBtNiwgbTUKKyAgICBTV0FQICAgICAgICAgICAgICA2LCA1CisgICAgcHN1YnVzYiAgICAgICAgICBtNywgbTUgICAgICAgICAgOyBwMS1xMQorICAgIHBzdWJ1c2IgICAgICAgICAgbTYsIG0yICAgICAgICAgIDsgcTEtcDEKKyAgICBwb3IgICAgICAgICAgICAgIG03LCBtNiAgICAgICAgICA7IGFicyhxMS1wMSkKKyAgICBweG9yICAgICAgICAgICAgIG02LCBtNgorICAgIHBhbmQgICAgICAgICAgICAgbTcsIFtwYl9GRV0KKyAgICBwc3JscSAgICAgICAgICAgIG03LCAxICAgICAgICAgICA7IGFicyhxMS1wMSkvMgorICAgIHBhZGR1c2IgICAgICAgICAgbTcsIG0xICAgICAgICAgIDsgYWJzKHEwLXAwKSoyK2FicyhxMS1wMSkvMgorICAgIHBzdWJ1c2IgICAgICAgICAgbTcsIG1fZmxpbUUKKyAgICBwY21wZXFiICAgICAgICAgIG03LCBtNiAgICAgICAgICA7IGFicyhxMC1wMCkqMithYnMocTEtcDEpLzIgPD0gRQorICAgIHBhbmQgICAgICAgICAgICAgbTAsIG03ICAgICAgICAgIDsgbm9ybWFsX2xpbWl0IHJlc3VsdAorCisgICAgOyBmaWx0ZXJfY29tbW9uOyBhdCB0aGlzIHBvaW50LCBtMi1tNT1wMS1xMSBhbmQgbTAgaXMgZmlsdGVyX21hc2sKKyVpZmRlZiBtOCA7IHg4Ni02NCAmJiBzc2UyCisgICAgbW92YSAgICAgICAgICAgICBtOCwgW3BiXzgwXQorJWRlZmluZSBtX3BiXzgwIG04CislZWxzZSA7IHg4Ni0zMiBvciBtbXgvbW14ZXh0CislZGVmaW5lIG1fcGJfODAgW3BiXzgwXQorJWVuZGlmCisgICAgbW92YSAgICAgICAgICAgICBtMSwgbTQKKyAgICBtb3ZhICAgICAgICAgICAgIG03LCBtMworICAgIHB4b3IgICAgICAgICAgICAgbTEsIG1fcGJfODAKKyAgICBweG9yICAgICAgICAgICAgIG03LCBtX3BiXzgwCisgICAgcHN1YnNiICAgICAgICAgICBtMSwgbTcgICAgICAgICAgOyAoc2lnbmVkKSBxMC1wMAorICAgIG1vdmEgICAgICAgICAgICAgbTYsIG0yCisgICAgbW92YSAgICAgICAgICAgICBtNywgbTUKKyAgICBweG9yICAgICAgICAgICAgIG02LCBtX3BiXzgwCisgICAgcHhvciAgICAgICAgICAgICBtNywgbV9wYl84MAorICAgIHBzdWJzYiAgICAgICAgICAgbTYsIG03ICAgICAgICAgIDsgKHNpZ25lZCkgcDEtcTEKKyAgICBtb3ZhICAgICAgICAgICAgIG03LCBtX21hc2tyZXMKKyAgICBwYWRkc2IgICAgICAgICAgIG02LCBtMQorICAgIHBhZGRzYiAgICAgICAgICAgbTYsIG0xCisgICAgcGFkZHNiICAgICAgICAgICBtNiwgbTEKKyAgICBwYW5kICAgICAgICAgICAgIG02LCBtMAorJWlmZGVmIG04CisgICAgbW92YSAgICAgICBtX2xpbXJlcywgbTYgICAgICAgICAgOyAzKihxcC1wMCkrKHAxLXExKSBtYXNrZWQgZm9yIGZpbHRlcl9tYmVkZ2UKKyAgICBwYW5kICAgICAgIG1fbGltcmVzLCBtNworJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAgIG0wLCBtNgorICAgIHBhbmQgICAgICAgICAgICAgbTAsIG03CisgICAgbW92YSAgICAgICBtX2xpbXJlcywgbTAKKyVlbmRpZgorICAgIHBhbmRuICAgICAgICAgICAgbTcsIG02ICAgICAgICAgIDsgMyoocTAtcDApKyhwMS1xMSkgbWFza2VkIGZvciBmaWx0ZXJfY29tbW9uCisKKyAgICBtb3ZhICAgICAgICAgICAgIG0xLCBbcGJfRjhdCisgICAgbW92YSAgICAgICAgICAgICBtNiwgbTcKKyAgICBwYWRkc2IgICAgICAgICAgIG03LCBbcGJfM10KKyAgICBwYWRkc2IgICAgICAgICAgIG02LCBbcGJfNF0KKyAgICBwYW5kICAgICAgICAgICAgIG03LCBtMQorICAgIHBhbmQgICAgICAgICAgICAgbTYsIG0xCisKKyAgICBweG9yICAgICAgICAgICAgIG0xLCBtMQorICAgIHB4b3IgICAgICAgICAgICAgbTAsIG0wCisgICAgcGNtcGd0YiAgICAgICAgICBtMSwgbTcKKyAgICBwc3ViYiAgICAgICAgICAgIG0wLCBtNworICAgIHBzcmxxICAgICAgICAgICAgbTcsIDMgICAgICAgICAgIDsgK2YyCisgICAgcHNybHEgICAgICAgICAgICBtMCwgMyAgICAgICAgICAgOyAtZjIKKyAgICBwYW5kICAgICAgICAgICAgIG0wLCBtMQorICAgIHBhbmRuICAgICAgICAgICAgbTEsIG03CisgICAgcHN1YnVzYiAgICAgICAgICBtMywgbTAKKyAgICBwYWRkdXNiICAgICAgICAgIG0zLCBtMSAgICAgICAgICA7IHAwK2YyCisKKyAgICBweG9yICAgICAgICAgICAgIG0xLCBtMQorICAgIHB4b3IgICAgICAgICAgICAgbTAsIG0wCisgICAgcGNtcGd0YiAgICAgICAgICBtMCwgbTYKKyAgICBwc3ViYiAgICAgICAgICAgIG0xLCBtNgorICAgIHBzcmxxICAgICAgICAgICAgbTYsIDMgICAgICAgICAgIDsgK2YxCisgICAgcHNybHEgICAgICAgICAgICBtMSwgMyAgICAgICAgICAgOyAtZjEKKyAgICBwYW5kICAgICAgICAgICAgIG0xLCBtMAorICAgIHBhbmRuICAgICAgICAgICAgbTAsIG02CisgICAgcHN1YnVzYiAgICAgICAgICBtNCwgbTAKKyAgICBwYWRkdXNiICAgICAgICAgIG00LCBtMSAgICAgICAgICA7IHEwLWYxCisKKyAgICA7IGZpbHRlcl9tYmVkZ2UgKG0yLW01ID0gcDEtcTE7IGxpbV9yZXMgY2FycmllcyB3KQorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92YSAgICAgICAgICAgICBtNywgW3BiXzFdCislZWxzZQorICAgIG1vdmEgICAgICAgICAgICAgbTcsIFtwd182M10KKyVlbmRpZgorJWlmZGVmIG04CisgICAgU1dBUCAgICAgICAgICAgICAgMSwgOAorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAgIG0xLCBtX2xpbXJlcworJWVuZGlmCisgICAgcHhvciAgICAgICAgICAgICBtMCwgbTAKKyAgICBtb3ZhICAgICAgICAgICAgIG02LCBtMQorICAgIHBjbXBndGIgICAgICAgICAgbTAsIG0xICAgICAgICAgOyB3aGljaCBhcmUgbmVnYXRpdmUKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHB1bnBja2xidyAgICAgICAgbTYsIG03ICAgICAgICAgOyBpbnRlcmxlYXZlIHdpdGggIjEiIGZvciByb3VuZGluZworICAgIHB1bnBja2hidyAgICAgICAgbTEsIG03CislZWxzZQorICAgIHB1bnBja2xidyAgICAgICAgbTYsIG0wICAgICAgICAgOyBzaWduZWQgYnl0ZS0+d29yZAorICAgIHB1bnBja2hidyAgICAgICAgbTEsIG0wCislZW5kaWYKKyAgICBtb3ZhICAgICAgbV9saW1zaWduLCBtMAorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92YSAgICAgICAgICAgICBtNywgW3BiXzI3XzYzXQorJWlmbmRlZiBtOAorICAgIG1vdmEgICAgICAgbV9saW1yZXMsIG0xCislZW5kaWYKKyVpZmRlZiBtMTAKKyAgICBTV0FQICAgICAgICAgICAgICAwLCAxMCAgICAgICAgIDsgZG9uJ3QgbG9zZSBsaW1fc2lnbiBjb3B5CislZW5kaWYKKyAgICBtb3ZhICAgICAgICAgICAgIG0wLCBtNworICAgIHBtYWRkdWJzdyAgICAgICAgbTcsIG02CisgICAgU1dBUCAgICAgICAgICAgICAgNiwgNworICAgIHBtYWRkdWJzdyAgICAgICAgbTAsIG0xCisgICAgU1dBUCAgICAgICAgICAgICAgMSwgMAorJWlmZGVmIG0xMAorICAgIFNXQVAgICAgICAgICAgICAgIDAsIDEwCislZWxzZQorICAgIG1vdmEgICAgICAgICAgICAgbTAsIG1fbGltc2lnbgorJWVuZGlmCislZWxzZQorICAgIG1vdmEgICAgICBtX21hc2tyZXMsIG02ICAgICAgICAgOyBiYWNrdXAgZm9yIGxhdGVyIGluIGZpbHRlcgorICAgIG1vdmEgICAgICAgbV9saW1yZXMsIG0xCisgICAgcG11bGx3ICAgICAgICAgIG02LCBbcHdfMjddCisgICAgcG11bGx3ICAgICAgICAgIG0xLCBbcHdfMjddCisgICAgcGFkZHcgICAgICAgICAgIG02LCBtNworICAgIHBhZGR3ICAgICAgICAgICBtMSwgbTcKKyVlbmRpZgorICAgIHBzcmF3ICAgICAgICAgICBtNiwgNworICAgIHBzcmF3ICAgICAgICAgICBtMSwgNworICAgIHBhY2tzc3diICAgICAgICBtNiwgbTEgICAgICAgICAgOyBhMAorICAgIHB4b3IgICAgICAgICAgICBtMSwgbTEKKyAgICBwc3ViYiAgICAgICAgICAgbTEsIG02CisgICAgcGFuZCAgICAgICAgICAgIG0xLCBtMCAgICAgICAgICA7IC1hMAorICAgIHBhbmRuICAgICAgICAgICBtMCwgbTYgICAgICAgICAgOyArYTAKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIG1vdmEgICAgICAgICAgICBtNiwgW3BiXzE4XzYzXSAgOyBwaXBlbGluaW5nCislZW5kaWYKKyAgICBwc3VidXNiICAgICAgICAgbTMsIG0xCisgICAgcGFkZHVzYiAgICAgICAgIG00LCBtMQorICAgIHBhZGR1c2IgICAgICAgICBtMywgbTAgICAgICAgICAgOyBwMCthMAorICAgIHBzdWJ1c2IgICAgICAgICBtNCwgbTAgICAgICAgICAgOyBxMC1hMAorCislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICBTV0FQICAgICAgICAgICAgIDYsIDcKKyVpZmRlZiBtMTAKKyAgICBTV0FQICAgICAgICAgICAgIDEsIDEwCislZWxzZQorICAgIG1vdmEgICAgICAgICAgICBtMSwgbV9saW1yZXMKKyVlbmRpZgorICAgIG1vdmEgICAgICAgICAgICBtMCwgbTcKKyAgICBwbWFkZHVic3cgICAgICAgbTcsIG02CisgICAgU1dBUCAgICAgICAgICAgICA2LCA3CisgICAgcG1hZGR1YnN3ICAgICAgIG0wLCBtMQorICAgIFNXQVAgICAgICAgICAgICAgMSwgMAorJWlmZGVmIG0xMAorICAgIFNXQVAgICAgICAgICAgICAgMCwgMTAKKyVlbmRpZgorICAgIG1vdmEgICAgICAgICAgICBtMCwgbV9saW1zaWduCislZWxzZQorICAgIG1vdmEgICAgICAgICAgICBtNiwgbV9tYXNrcmVzCisgICAgbW92YSAgICAgICAgICAgIG0xLCBtX2xpbXJlcworICAgIHBtdWxsdyAgICAgICAgICBtNiwgW3B3XzE4XQorICAgIHBtdWxsdyAgICAgICAgICBtMSwgW3B3XzE4XQorICAgIHBhZGR3ICAgICAgICAgICBtNiwgbTcKKyAgICBwYWRkdyAgICAgICAgICAgbTEsIG03CislZW5kaWYKKyAgICBtb3ZhICAgICAgICAgICAgbTAsIG1fbGltc2lnbgorICAgIHBzcmF3ICAgICAgICAgICBtNiwgNworICAgIHBzcmF3ICAgICAgICAgICBtMSwgNworICAgIHBhY2tzc3diICAgICAgICBtNiwgbTEgICAgICAgICAgOyBhMQorICAgIHB4b3IgICAgICAgICAgICBtMSwgbTEKKyAgICBwc3ViYiAgICAgICAgICAgbTEsIG02CisgICAgcGFuZCAgICAgICAgICAgIG0xLCBtMCAgICAgICAgICA7IC1hMQorICAgIHBhbmRuICAgICAgICAgICBtMCwgbTYgICAgICAgICAgOyArYTEKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIG1vdmEgICAgICAgICAgICBtNiwgW3BiXzlfNjNdCislZW5kaWYKKyAgICBwc3VidXNiICAgICAgICAgbTIsIG0xCisgICAgcGFkZHVzYiAgICAgICAgIG01LCBtMQorICAgIHBhZGR1c2IgICAgICAgICBtMiwgbTAgICAgICAgICAgOyBwMSthMQorICAgIHBzdWJ1c2IgICAgICAgICBtNSwgbTAgICAgICAgICAgOyBxMS1hMQorCislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICBTV0FQICAgICAgICAgICAgIDYsIDcKKyVpZmRlZiBtMTAKKyAgICBTV0FQICAgICAgICAgICAgIDEsIDEwCislZWxzZQorICAgIG1vdmEgICAgICAgICAgICBtMSwgbV9saW1yZXMKKyVlbmRpZgorICAgIG1vdmEgICAgICAgICAgICBtMCwgbTcKKyAgICBwbWFkZHVic3cgICAgICAgbTcsIG02CisgICAgU1dBUCAgICAgICAgICAgICA2LCA3CisgICAgcG1hZGR1YnN3ICAgICAgIG0wLCBtMQorICAgIFNXQVAgICAgICAgICAgICAgMSwgMAorJWVsc2UKKyVpZmRlZiBtOAorICAgIFNXQVAgICAgICAgICAgICAgNiwgMTIKKyAgICBTV0FQICAgICAgICAgICAgIDEsIDgKKyVlbHNlCisgICAgbW92YSAgICAgICAgICAgIG02LCBtX21hc2tyZXMKKyAgICBtb3ZhICAgICAgICAgICAgbTEsIG1fbGltcmVzCislZW5kaWYKKyAgICBwbXVsbHcgICAgICAgICAgbTYsIFtwd185XQorICAgIHBtdWxsdyAgICAgICAgICBtMSwgW3B3XzldCisgICAgcGFkZHcgICAgICAgICAgIG02LCBtNworICAgIHBhZGR3ICAgICAgICAgICBtMSwgbTcKKyVlbmRpZgorJWlmZGVmIG05CisgICAgU1dBUCAgICAgICAgICAgICA3LCA5CislZWxzZQorICAgIG1vdmEgICAgICAgICAgICBtNywgbV9saW1zaWduCislZW5kaWYKKyAgICBwc3JhdyAgICAgICAgICAgbTYsIDcKKyAgICBwc3JhdyAgICAgICAgICAgbTEsIDcKKyAgICBwYWNrc3N3YiAgICAgICAgbTYsIG0xICAgICAgICAgIDsgYTEKKyAgICBweG9yICAgICAgICAgICAgbTAsIG0wCisgICAgcHN1YmIgICAgICAgICAgIG0wLCBtNgorICAgIHBhbmQgICAgICAgICAgICBtMCwgbTcgICAgICAgICAgOyAtYTEKKyAgICBwYW5kbiAgICAgICAgICAgbTcsIG02ICAgICAgICAgIDsgK2ExCislaWZkZWYgbTgKKyAgICBTV0FQICAgICAgICAgICAgIDEsIDEzCisgICAgU1dBUCAgICAgICAgICAgICA2LCAxNAorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAgbTEsIG1fcDJiYWNrdXAKKyAgICBtb3ZhICAgICAgICAgICAgbTYsIG1fcTJiYWNrdXAKKyVlbmRpZgorICAgIHBzdWJ1c2IgICAgICAgICBtMSwgbTAKKyAgICBwYWRkdXNiICAgICAgICAgbTYsIG0wCisgICAgcGFkZHVzYiAgICAgICAgIG0xLCBtNyAgICAgICAgICA7IHAxK2ExCisgICAgcHN1YnVzYiAgICAgICAgIG02LCBtNyAgICAgICAgICA7IHExLWExCisKKyAgICA7IHN0b3JlCislaWZpZG4gJTEsIHYKKyAgICBtb3Zyb3cgW2RzdDJxK21zdHJpZGVxKjRdLCBtMQorICAgIG1vdnJvdyBbZHN0MXErbXN0cmlkZXEqMl0sIG0yCisgICAgbW92cm93IFtkc3QxcSttc3RyaWRlcSAgXSwgbTMKKyAgICBtb3Zyb3cgICAgIFtkc3QxcV0sIG00CisgICAgbW92cm93ICAgICBbZHN0MnFdLCBtNQorICAgIG1vdnJvdyBbZHN0MnErIHN0cmlkZXEgIF0sIG02CislaWYgbW1zaXplID09IDE2ICYmICUyID09IDgKKyAgICBhZGQgICAgICAgICAgIGRzdDhxLCBtc3RyaWRlcQorICAgIG1vdmhwcyBbZHN0OHErbXN0cmlkZXEqMl0sIG0xCisgICAgbW92aHBzIFtkc3Q4cSttc3RyaWRlcSAgXSwgbTIKKyAgICBtb3ZocHMgICAgIFtkc3Q4cV0sIG0zCisgICAgYWRkICAgICAgICAgIGRzdDhxLCBzdHJpZGVxCisgICAgbW92aHBzICAgICBbZHN0OHFdLCBtNAorICAgIG1vdmhwcyBbZHN0OHErIHN0cmlkZXEgIF0sIG01CisgICAgbW92aHBzIFtkc3Q4cSsgc3RyaWRlcSoyXSwgbTYKKyVlbmRpZgorJWVsc2UgOyBoCisgICAgaW5jICAgICAgICAgIGRzdDFxCisgICAgaW5jICAgICAgICAgIGRzdDJxCisKKyAgICA7IDR4OC8xNiB0cmFuc3Bvc2UKKyAgICBUUkFOU1BPU0U0eDRCICAgIDEsIDIsIDMsIDQsIDAKKyAgICBTQlVUVEVSRkxZICAgICAgYncsIDUsIDYsIDAKKworJWlmIG1tc2l6ZSA9PSA4IDsgbW14L21teGV4dCAoaCkKKyAgICBXUklURV80eDJEICAgICAgIDEsIDIsIDMsIDQsIGRzdDFxLCBkc3QycSwgbXN0cmlkZXEsIHN0cmlkZXEKKyAgICBhZGQgICAgICAgICAgZHN0MXEsIDQKKyAgICBXUklURV8yeDRXICAgICAgbTUsIG02LCBkc3QycSwgZHN0MXEsIG1zdHJpZGVxLCBzdHJpZGVxCislZWxzZSA7IHNzZTIgKGgpCisgICAgbGVhICAgICAgICAgIGRzdDhxLCBbZHN0OHErbXN0cmlkZXErMV0KKyAgICBXUklURV80eDREICAgICAgIDEsIDIsIDMsIDQsIGRzdDFxLCBkc3QycSwgZHN0OHEsIG1zdHJpZGVxLCBzdHJpZGVxLCAlMgorICAgIGxlYSAgICAgICAgICBkc3QxcSwgW2RzdDJxK21zdHJpZGVxKzRdCisgICAgbGVhICAgICAgICAgIGRzdDhxLCBbZHN0OHErbXN0cmlkZXErNF0KKyVpZiBjcHVmbGFnKHNzZTQpCisgICAgYWRkICAgICAgICAgIGRzdDJxLCA0CislZW5kaWYKKyAgICBXUklURV84VyAgICAgICAgbTUsIGRzdDJxLCBkc3QxcSwgIG1zdHJpZGVxLCBzdHJpZGVxCislaWYgY3B1ZmxhZyhzc2U0KQorICAgIGxlYSAgICAgICAgICBkc3QycSwgW2RzdDhxKyBzdHJpZGVxICBdCislZW5kaWYKKyAgICBXUklURV84VyAgICAgICAgbTYsIGRzdDJxLCBkc3Q4cSwgbXN0cmlkZXEsIHN0cmlkZXEKKyVlbmRpZgorJWVuZGlmCisKKyVpZiBtbXNpemUgPT0gOAorJWlmICUyID09IDggOyBjaHJvbWEKKyVpZmlkbiAlMSwgaAorICAgIHN1YiAgICAgICAgICBkc3QxcSwgNQorJWVuZGlmCisgICAgY21wICAgICAgICAgIGRzdDFxLCBkc3Q4cQorICAgIG1vdiAgICAgICAgICBkc3QxcSwgZHN0OHEKKyAgICBqbnogLm5leHQ4cHgKKyVlbHNlCislaWZpZG4gJTEsIGgKKyAgICBsZWEgICAgICAgICAgZHN0MXEsIFtkc3QxcSsgc3RyaWRlcSo4LTVdCislZWxzZSA7IHYKKyAgICBhZGQgICAgICAgICAgZHN0MXEsIDgKKyVlbmRpZgorICAgIGRlYyAgICAgICAgICBjbnRycQorICAgIGpnIC5uZXh0OHB4CislZW5kaWYKKyAgICBSRVBfUkVUCislZWxzZSA7IG1tc2l6ZSA9PSAxNgorICAgIFJFVAorJWVuZGlmCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzMyCitJTklUX01NWCBtbXgKK01CRURHRV9MT09QRklMVEVSIHYsIDE2CitNQkVER0VfTE9PUEZJTFRFUiBoLCAxNgorTUJFREdFX0xPT1BGSUxURVIgdiwgIDgKK01CRURHRV9MT09QRklMVEVSIGgsICA4CisKK0lOSVRfTU1YIG1teGV4dAorTUJFREdFX0xPT1BGSUxURVIgdiwgMTYKK01CRURHRV9MT09QRklMVEVSIGgsIDE2CitNQkVER0VfTE9PUEZJTFRFUiB2LCAgOAorTUJFREdFX0xPT1BGSUxURVIgaCwgIDgKKyVlbmRpZgorCitJTklUX1hNTSBzc2UyCitNQkVER0VfTE9PUEZJTFRFUiB2LCAxNgorTUJFREdFX0xPT1BGSUxURVIgaCwgMTYKK01CRURHRV9MT09QRklMVEVSIHYsICA4CitNQkVER0VfTE9PUEZJTFRFUiBoLCAgOAorCitJTklUX1hNTSBzc3NlMworTUJFREdFX0xPT1BGSUxURVIgdiwgMTYKK01CRURHRV9MT09QRklMVEVSIGgsIDE2CitNQkVER0VfTE9PUEZJTFRFUiB2LCAgOAorTUJFREdFX0xPT1BGSUxURVIgaCwgIDgKKworSU5JVF9YTU0gc3NlNAorTUJFREdFX0xPT1BGSUxURVIgaCwgMTYKK01CRURHRV9MT09QRklMVEVSIGgsICA4CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA5ZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92cDlkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OTAwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA5ZHNwX2luaXQuYwpAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIFZQOSBTSU1EIG9wdGltaXphdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amUgZ21haWwgY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZwOWRzcC5oIgorCisjaWYgSEFWRV9ZQVNNCisKKyNkZWZpbmUgZnBlbF9mdW5jKGF2Zywgc3osIG9wdCkgXAordm9pZCBmZl92cDlfIyNhdmcjI3N6IyNfIyNvcHQodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgaW50IG15KQorZnBlbF9mdW5jKHB1dCwgIDQsIG1teCk7CitmcGVsX2Z1bmMocHV0LCAgOCwgbW14KTsKK2ZwZWxfZnVuYyhwdXQsIDE2LCBzc2UpOworZnBlbF9mdW5jKHB1dCwgMzIsIHNzZSk7CitmcGVsX2Z1bmMocHV0LCA2NCwgc3NlKTsKK2ZwZWxfZnVuYyhhdmcsICA0LCBtbXhleHQpOworZnBlbF9mdW5jKGF2ZywgIDgsIG1teGV4dCk7CitmcGVsX2Z1bmMoYXZnLCAxNiwgc3NlMik7CitmcGVsX2Z1bmMoYXZnLCAzMiwgc3NlMik7CitmcGVsX2Z1bmMoYXZnLCA2NCwgc3NlMik7CitmcGVsX2Z1bmMocHV0LCAzMiwgYXZ4KTsKK2ZwZWxfZnVuYyhwdXQsIDY0LCBhdngpOworZnBlbF9mdW5jKGF2ZywgMzIsIGF2eDIpOworZnBlbF9mdW5jKGF2ZywgNjQsIGF2eDIpOworI3VuZGVmIGZwZWxfZnVuYworCisjZGVmaW5lIG1jX2Z1bmMoYXZnLCBzeiwgZGlyLCBvcHQpIFwKK3ZvaWQgZmZfdnA5XyMjYXZnIyNfOHRhcF8xZF8jI2RpciMjXyMjc3ojI18jI29wdCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBjb25zdCBpbnQ4X3QgKCpmaWx0ZXIpWzMyXSkKKyNkZWZpbmUgbWNfZnVuY3Moc3osIG9wdCkgXAorbWNfZnVuYyhwdXQsIHN6LCBoLCBvcHQpOyBcCittY19mdW5jKGF2Zywgc3osIGgsIG9wdCk7IFwKK21jX2Z1bmMocHV0LCBzeiwgdiwgb3B0KTsgXAorbWNfZnVuYyhhdmcsIHN6LCB2LCBvcHQpCisKK21jX2Z1bmNzKDQsIHNzc2UzKTsKK21jX2Z1bmNzKDgsIHNzc2UzKTsKKyNpZiBBUkNIX1g4Nl82NAorbWNfZnVuY3MoMTYsIHNzc2UzKTsKK21jX2Z1bmNzKDMyLCBhdngyKTsKKyNlbmRpZgorCisjdW5kZWYgbWNfZnVuY3MKKyN1bmRlZiBtY19mdW5jCisKKyNkZWZpbmUgbWNfcmVwX2Z1bmMoYXZnLCBzeiwgaHN6LCBkaXIsIG9wdCkgXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBcCitmZl92cDlfIyNhdmcjI184dGFwXzFkXyMjZGlyIyNfIyNzeiMjXyMjb3B0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgY29uc3QgaW50OF90ICgqZmlsdGVyKVszMl0pIFwKK3sgXAorICAgIGZmX3ZwOV8jI2F2ZyMjXzh0YXBfMWRfIyNkaXIjI18jI2hzeiMjXyMjb3B0KGRzdCwgICAgICAgZHN0X3N0cmlkZSwgc3JjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZSwgaCwgZmlsdGVyKTsgXAorICAgIGZmX3ZwOV8jI2F2ZyMjXzh0YXBfMWRfIyNkaXIjI18jI2hzeiMjXyMjb3B0KGRzdCArIGhzeiwgZHN0X3N0cmlkZSwgc3JjICsgaHN6LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZSwgaCwgZmlsdGVyKTsgXAorfQorCisjZGVmaW5lIG1jX3JlcF9mdW5jcyhzeiwgaHN6LCBvcHQpIFwKK21jX3JlcF9mdW5jKHB1dCwgc3osIGhzeiwgaCwgb3B0KTsgXAorbWNfcmVwX2Z1bmMoYXZnLCBzeiwgaHN6LCBoLCBvcHQpOyBcCittY19yZXBfZnVuYyhwdXQsIHN6LCBoc3osIHYsIG9wdCk7IFwKK21jX3JlcF9mdW5jKGF2Zywgc3osIGhzeiwgdiwgb3B0KQorCisjaWYgQVJDSF9YODZfMzIKK21jX3JlcF9mdW5jcygxNiwgOCwgc3NzZTMpOworI2VuZGlmCittY19yZXBfZnVuY3MoMzIsIDE2LCBzc3NlMyk7CittY19yZXBfZnVuY3MoNjQsIDMyLCBzc3NlMyk7CisjaWYgQVJDSF9YODZfNjQgJiYgSEFWRV9BVlgyX0VYVEVSTkFMCittY19yZXBfZnVuY3MoNjQsIDMyLCBhdngyKTsKKyNlbmRpZgorCisjdW5kZWYgbWNfcmVwX2Z1bmNzCisjdW5kZWYgbWNfcmVwX2Z1bmMKKworZXh0ZXJuIGNvbnN0IGludDhfdCBmZl9maWx0ZXJzX3Nzc2UzWzNdWzE1XVs0XVszMl07CisKKyNkZWZpbmUgZmlsdGVyXzh0YXBfMmRfZm4ob3AsIHN6LCBmLCBmbmFtZSwgYWxpZ24sIG9wdCkgXAorc3RhdGljIHZvaWQgb3AjI184dGFwXyMjZm5hbWUjI18jI3N6IyNodl8jI29wdCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgaW50IG15KSBcCit7IFwKKyAgICBMT0NBTF9BTElHTkVEXyMjYWxpZ24odWludDhfdCwgdGVtcCwgWzcxICogNjRdKTsgXAorICAgIGZmX3ZwOV9wdXRfOHRhcF8xZF9oXyMjc3ojI18jI29wdCh0ZW1wLCA2NCwgc3JjIC0gMyAqIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArIDcsIGZmX2ZpbHRlcnNfc3NzZTNbZl1bbXggLSAxXSk7IFwKKyAgICBmZl92cDlfIyNvcCMjXzh0YXBfMWRfdl8jI3N6IyNfIyNvcHQoZHN0LCBkc3Rfc3RyaWRlLCB0ZW1wICsgMyAqIDY0LCA2NCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLCBmZl9maWx0ZXJzX3Nzc2UzW2ZdW215IC0gMV0pOyBcCit9CisKKyNkZWZpbmUgZmlsdGVyc184dGFwXzJkX2ZuKG9wLCBzeiwgYWxpZ24sIG9wdCkgXAorZmlsdGVyXzh0YXBfMmRfZm4ob3AsIHN6LCBGSUxURVJfOFRBUF9SRUdVTEFSLCByZWd1bGFyLCBhbGlnbiwgb3B0KSBcCitmaWx0ZXJfOHRhcF8yZF9mbihvcCwgc3osIEZJTFRFUl84VEFQX1NIQVJQLCAgIHNoYXJwLCBhbGlnbiwgb3B0KSBcCitmaWx0ZXJfOHRhcF8yZF9mbihvcCwgc3osIEZJTFRFUl84VEFQX1NNT09USCwgIHNtb290aCwgYWxpZ24sIG9wdCkKKworI2RlZmluZSBmaWx0ZXJzXzh0YXBfMmRfZm4yKG9wLCBhbGlnbiwgb3B0KSBcCitmaWx0ZXJzXzh0YXBfMmRfZm4ob3AsIDY0LCBhbGlnbiwgb3B0KSBcCitmaWx0ZXJzXzh0YXBfMmRfZm4ob3AsIDMyLCBhbGlnbiwgb3B0KSBcCitmaWx0ZXJzXzh0YXBfMmRfZm4ob3AsIDE2LCBhbGlnbiwgb3B0KSBcCitmaWx0ZXJzXzh0YXBfMmRfZm4ob3AsIDgsIGFsaWduLCBvcHQpIFwKK2ZpbHRlcnNfOHRhcF8yZF9mbihvcCwgNCwgYWxpZ24sIG9wdCkKKworZmlsdGVyc184dGFwXzJkX2ZuMihwdXQsIDE2LCBzc3NlMykKK2ZpbHRlcnNfOHRhcF8yZF9mbjIoYXZnLCAxNiwgc3NzZTMpCisjaWYgQVJDSF9YODZfNjQgJiYgSEFWRV9BVlgyX0VYVEVSTkFMCitmaWx0ZXJzXzh0YXBfMmRfZm4ocHV0LCA2NCwgMzIsIGF2eDIpCitmaWx0ZXJzXzh0YXBfMmRfZm4ocHV0LCAzMiwgMzIsIGF2eDIpCitmaWx0ZXJzXzh0YXBfMmRfZm4oYXZnLCA2NCwgMzIsIGF2eDIpCitmaWx0ZXJzXzh0YXBfMmRfZm4oYXZnLCAzMiwgMzIsIGF2eDIpCisjZW5kaWYKKworI3VuZGVmIGZpbHRlcnNfOHRhcF8yZF9mbjIKKyN1bmRlZiBmaWx0ZXJzXzh0YXBfMmRfZm4KKyN1bmRlZiBmaWx0ZXJfOHRhcF8yZF9mbgorCisjZGVmaW5lIGZpbHRlcl84dGFwXzFkX2ZuKG9wLCBzeiwgZiwgZm5hbWUsIGRpciwgZHZhciwgb3B0KSBcCitzdGF0aWMgdm9pZCBvcCMjXzh0YXBfIyNmbmFtZSMjXyMjc3ojI2RpciMjXyMjb3B0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpIFwKK3sgXAorICAgIGZmX3ZwOV8jI29wIyNfOHRhcF8xZF8jI2RpciMjXyMjc3ojI18jI29wdChkc3QsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLCBmZl9maWx0ZXJzX3Nzc2UzW2ZdW2R2YXIgLSAxXSk7IFwKK30KKworI2RlZmluZSBmaWx0ZXJzXzh0YXBfMWRfZm4ob3AsIHN6LCBkaXIsIGR2YXIsIG9wdCkgXAorZmlsdGVyXzh0YXBfMWRfZm4ob3AsIHN6LCBGSUxURVJfOFRBUF9SRUdVTEFSLCByZWd1bGFyLCBkaXIsIGR2YXIsIG9wdCkgXAorZmlsdGVyXzh0YXBfMWRfZm4ob3AsIHN6LCBGSUxURVJfOFRBUF9TSEFSUCwgICBzaGFycCwgICBkaXIsIGR2YXIsIG9wdCkgXAorZmlsdGVyXzh0YXBfMWRfZm4ob3AsIHN6LCBGSUxURVJfOFRBUF9TTU9PVEgsICBzbW9vdGgsICBkaXIsIGR2YXIsIG9wdCkKKworI2RlZmluZSBmaWx0ZXJzXzh0YXBfMWRfZm4yKG9wLCBzeiwgb3B0KSBcCitmaWx0ZXJzXzh0YXBfMWRfZm4ob3AsIHN6LCBoLCBteCwgb3B0KSBcCitmaWx0ZXJzXzh0YXBfMWRfZm4ob3AsIHN6LCB2LCBteSwgb3B0KQorCisjZGVmaW5lIGZpbHRlcnNfOHRhcF8xZF9mbjMob3AsIG9wdCkgXAorZmlsdGVyc184dGFwXzFkX2ZuMihvcCwgNjQsIG9wdCkgXAorZmlsdGVyc184dGFwXzFkX2ZuMihvcCwgMzIsIG9wdCkgXAorZmlsdGVyc184dGFwXzFkX2ZuMihvcCwgMTYsIG9wdCkgXAorZmlsdGVyc184dGFwXzFkX2ZuMihvcCwgOCwgb3B0KSBcCitmaWx0ZXJzXzh0YXBfMWRfZm4yKG9wLCA0LCBvcHQpCisKK2ZpbHRlcnNfOHRhcF8xZF9mbjMocHV0LCBzc3NlMykKK2ZpbHRlcnNfOHRhcF8xZF9mbjMoYXZnLCBzc3NlMykKKyNpZiBBUkNIX1g4Nl82NCAmJiBIQVZFX0FWWDJfRVhURVJOQUwKK2ZpbHRlcnNfOHRhcF8xZF9mbjIocHV0LCA2NCwgYXZ4MikKK2ZpbHRlcnNfOHRhcF8xZF9mbjIocHV0LCAzMiwgYXZ4MikKK2ZpbHRlcnNfOHRhcF8xZF9mbjIoYXZnLCA2NCwgYXZ4MikKK2ZpbHRlcnNfOHRhcF8xZF9mbjIoYXZnLCAzMiwgYXZ4MikKKyNlbmRpZgorCisjdW5kZWYgZmlsdGVyc184dGFwXzFkX2ZuCisjdW5kZWYgZmlsdGVyc184dGFwXzFkX2ZuMgorI3VuZGVmIGZpbHRlcnNfOHRhcF8xZF9mbjMKKyN1bmRlZiBmaWx0ZXJfOHRhcF8xZF9mbgorCisjZGVmaW5lIGl0eGZtX2Z1bmModHlwZWEsIHR5cGViLCBzaXplLCBvcHQpIFwKK3ZvaWQgZmZfdnA5XyMjdHlwZWEjI18jI3R5cGViIyNfIyNzaXplIyN4IyNzaXplIyNfYWRkXyMjb3B0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBlb2IpCisjZGVmaW5lIGl0eGZtX2Z1bmNzKHNpemUsIG9wdCkgXAoraXR4Zm1fZnVuYyhpZGN0LCAgaWRjdCwgIHNpemUsIG9wdCk7IFwKK2l0eGZtX2Z1bmMoaWFkc3QsIGlkY3QsICBzaXplLCBvcHQpOyBcCitpdHhmbV9mdW5jKGlkY3QsICBpYWRzdCwgc2l6ZSwgb3B0KTsgXAoraXR4Zm1fZnVuYyhpYWRzdCwgaWFkc3QsIHNpemUsIG9wdCkKKworaXR4Zm1fZnVuY3MoNCwgc3NzZTMpOworaXR4Zm1fZnVuY3MoOCwgc3NzZTMpOworaXR4Zm1fZnVuY3MoOCwgYXZ4KTsKK2l0eGZtX2Z1bmNzKDE2LCBzc3NlMyk7CitpdHhmbV9mdW5jcygxNiwgYXZ4KTsKK2l0eGZtX2Z1bmMoaWRjdCwgaWRjdCwgMzIsIHNzc2UzKTsKK2l0eGZtX2Z1bmMoaWRjdCwgaWRjdCwgMzIsIGF2eCk7CitpdHhmbV9mdW5jKGl3aHQsIGl3aHQsIDQsIG1teCk7CisKKyN1bmRlZiBpdHhmbV9mdW5jCisjdW5kZWYgaXR4Zm1fZnVuY3MKKworI2RlZmluZSBscGZfZnVuY3Moc2l6ZTEsIHNpemUyLCBvcHQpIFwKK3ZvaWQgZmZfdnA5X2xvb3BfZmlsdGVyX3ZfIyNzaXplMSMjXyMjc2l6ZTIjI18jI29wdCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRSwgaW50IEksIGludCBIKTsgXAordm9pZCBmZl92cDlfbG9vcF9maWx0ZXJfaF8jI3NpemUxIyNfIyNzaXplMiMjXyMjb3B0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBFLCBpbnQgSSwgaW50IEgpCisKK2xwZl9mdW5jcygxNiwgMTYsIHNzZTIpOworbHBmX2Z1bmNzKDE2LCAxNiwgc3NzZTMpOworbHBmX2Z1bmNzKDE2LCAxNiwgYXZ4KTsKK2xwZl9mdW5jcyg0NCwgMTYsIHNzZTIpOworbHBmX2Z1bmNzKDQ0LCAxNiwgc3NzZTMpOworbHBmX2Z1bmNzKDQ0LCAxNiwgYXZ4KTsKK2xwZl9mdW5jcyg4NCwgMTYsIHNzZTIpOworbHBmX2Z1bmNzKDg0LCAxNiwgc3NzZTMpOworbHBmX2Z1bmNzKDg0LCAxNiwgYXZ4KTsKK2xwZl9mdW5jcyg0OCwgMTYsIHNzZTIpOworbHBmX2Z1bmNzKDQ4LCAxNiwgc3NzZTMpOworbHBmX2Z1bmNzKDQ4LCAxNiwgYXZ4KTsKK2xwZl9mdW5jcyg4OCwgMTYsIHNzZTIpOworbHBmX2Z1bmNzKDg4LCAxNiwgc3NzZTMpOworbHBmX2Z1bmNzKDg4LCAxNiwgYXZ4KTsKKworI3VuZGVmIGxwZl9mdW5jcworCisjZGVmaW5lIGlwcmVkX2Z1bmMoc2l6ZSwgdHlwZSwgb3B0KSBcCit2b2lkIGZmX3ZwOV9pcHJlZF8jI3R5cGUjI18jI3NpemUjI3gjI3NpemUjI18jI29wdCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmwsIGNvbnN0IHVpbnQ4X3QgKmEpCisKKyNkZWZpbmUgaXByZWRfZnVuY3ModHlwZSwgb3B0KSBcCitpcHJlZF9mdW5jKDQsIHR5cGUsIG9wdCk7IFwKK2lwcmVkX2Z1bmMoOCwgdHlwZSwgb3B0KTsgXAoraXByZWRfZnVuYygxNiwgdHlwZSwgb3B0KTsgXAoraXByZWRfZnVuYygzMiwgdHlwZSwgb3B0KQorCitpcHJlZF9mdW5jcyhkYywgc3NzZTMpOworaXByZWRfZnVuY3MoZGNfbGVmdCwgc3NzZTMpOworaXByZWRfZnVuY3MoZGNfdG9wLCBzc3NlMyk7CisKKyN1bmRlZiBpcHJlZF9mdW5jcworCitpcHJlZF9mdW5jKDgsIHYsIG1teCk7CitpcHJlZF9mdW5jKDE2LCB2LCBzc2UyKTsKK2lwcmVkX2Z1bmMoMzIsIHYsIHNzZTIpOworCisjZGVmaW5lIGlwcmVkX2Z1bmNfc2V0KHNpemUsIHR5cGUsIG9wdDEsIG9wdDIpIFwKK2lwcmVkX2Z1bmMoc2l6ZSwgdHlwZSwgb3B0MSk7IFwKK2lwcmVkX2Z1bmMoc2l6ZSwgdHlwZSwgb3B0MikKKworI2RlZmluZSBpcHJlZF9mdW5jcyh0eXBlLCBvcHQxLCBvcHQyKSBcCitpcHJlZF9mdW5jKDQsIHR5cGUsIG9wdDEpOyBcCitpcHJlZF9mdW5jX3NldCg4LCB0eXBlLCBvcHQxLCBvcHQyKTsgXAoraXByZWRfZnVuY19zZXQoMTYsIHR5cGUsIG9wdDEsIG9wdDIpOyBcCitpcHJlZF9mdW5jX3NldCgzMiwgdHlwZSwgb3B0MSwgb3B0MikKKworaXByZWRfZnVuY3MoaCwgc3NzZTMsIGF2eCk7CitpcHJlZF9mdW5jcyh0bSwgc3NzZTMsIGF2eCk7CitpcHJlZF9mdW5jcyhkbCwgc3NzZTMsIGF2eCk7CitpcHJlZF9mdW5jcyhkciwgc3NzZTMsIGF2eCk7CitpcHJlZF9mdW5jcyhodSwgc3NzZTMsIGF2eCk7CitpcHJlZF9mdW5jcyhoZCwgc3NzZTMsIGF2eCk7CitpcHJlZF9mdW5jcyh2bCwgc3NzZTMsIGF2eCk7CitpcHJlZF9mdW5jcyh2ciwgc3NzZTMsIGF2eCk7CisKK2lwcmVkX2Z1bmMoMzIsIGRjLCBhdngyKTsKK2lwcmVkX2Z1bmMoMzIsIGRjX2xlZnQsIGF2eDIpOworaXByZWRfZnVuYygzMiwgZGNfdG9wLCBhdngyKTsKK2lwcmVkX2Z1bmMoMzIsIHYsIGF2eDIpOworaXByZWRfZnVuYygzMiwgaCwgYXZ4Mik7CitpcHJlZF9mdW5jKDMyLCB0bSwgYXZ4Mik7CisKKyN1bmRlZiBpcHJlZF9mdW5jcworI3VuZGVmIGlwcmVkX2Z1bmNfc2V0CisjdW5kZWYgaXByZWRfZnVuYworCisjZW5kaWYgLyogSEFWRV9ZQVNNICovCisKK2F2X2NvbGQgdm9pZCBmZl92cDlkc3BfaW5pdF94ODYoVlA5RFNQQ29udGV4dCAqZHNwKQoreworI2lmIEhBVkVfWUFTTQorICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyNkZWZpbmUgaW5pdF9mcGVsKGlkeDEsIGlkeDIsIHN6LCB0eXBlLCBvcHQpIFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl84VEFQX1NNT09USCBdW2lkeDJdWzBdWzBdID0gXAorICAgIGRzcC0+bWNbaWR4MV1bRklMVEVSXzhUQVBfUkVHVUxBUl1baWR4Ml1bMF1bMF0gPSBcCisgICAgZHNwLT5tY1tpZHgxXVtGSUxURVJfOFRBUF9TSEFSUCAgXVtpZHgyXVswXVswXSA9IFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl9CSUxJTkVBUiAgICBdW2lkeDJdWzBdWzBdID0gZmZfdnA5XyMjdHlwZSMjc3ojI18jI29wdAorCisjZGVmaW5lIGluaXRfc3VicGVsMShpZHgxLCBpZHgyLCBpZHhoLCBpZHh2LCBzeiwgZGlyLCB0eXBlLCBvcHQpIFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl84VEFQX1NNT09USCBdW2lkeDJdW2lkeGhdW2lkeHZdID0gdHlwZSMjXzh0YXBfc21vb3RoXyMjc3ojI2RpciMjXyMjb3B0OyBcCisgICAgZHNwLT5tY1tpZHgxXVtGSUxURVJfOFRBUF9SRUdVTEFSXVtpZHgyXVtpZHhoXVtpZHh2XSA9IHR5cGUjI184dGFwX3JlZ3VsYXJfIyNzeiMjZGlyIyNfIyNvcHQ7IFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl84VEFQX1NIQVJQICBdW2lkeDJdW2lkeGhdW2lkeHZdID0gdHlwZSMjXzh0YXBfc2hhcnBfIyNzeiMjZGlyIyNfIyNvcHQKKworI2RlZmluZSBpbml0X3N1YnBlbDJfMzJfNjQoaWR4LCBpZHhoLCBpZHh2LCBkaXIsIHR5cGUsIG9wdCkgXAorICAgIGluaXRfc3VicGVsMSgwLCBpZHgsIGlkeGgsIGlkeHYsIDY0LCBkaXIsIHR5cGUsIG9wdCk7IFwKKyAgICBpbml0X3N1YnBlbDEoMSwgaWR4LCBpZHhoLCBpZHh2LCAzMiwgZGlyLCB0eXBlLCBvcHQpCisKKyNkZWZpbmUgaW5pdF9zdWJwZWwyKGlkeCwgaWR4aCwgaWR4diwgZGlyLCB0eXBlLCBvcHQpIFwKKyAgICBpbml0X3N1YnBlbDJfMzJfNjQoaWR4LCBpZHhoLCBpZHh2LCBkaXIsIHR5cGUsIG9wdCk7IFwKKyAgICBpbml0X3N1YnBlbDEoMiwgaWR4LCBpZHhoLCBpZHh2LCAxNiwgZGlyLCB0eXBlLCBvcHQpOyBcCisgICAgaW5pdF9zdWJwZWwxKDMsIGlkeCwgaWR4aCwgaWR4diwgIDgsIGRpciwgdHlwZSwgb3B0KTsgXAorICAgIGluaXRfc3VicGVsMSg0LCBpZHgsIGlkeGgsIGlkeHYsICA0LCBkaXIsIHR5cGUsIG9wdCkKKworI2RlZmluZSBpbml0X3N1YnBlbDMoaWR4LCB0eXBlLCBvcHQpIFwKKyAgICBpbml0X3N1YnBlbDIoaWR4LCAxLCAxLCBodiwgdHlwZSwgb3B0KTsgXAorICAgIGluaXRfc3VicGVsMihpZHgsIDAsIDEsIHYsIHR5cGUsIG9wdCk7IFwKKyAgICBpbml0X3N1YnBlbDIoaWR4LCAxLCAwLCBoLCB0eXBlLCBvcHQpCisKKyNkZWZpbmUgaW5pdF9scGYob3B0KSBkbyB7IFwKKyAgICBpZiAoQVJDSF9YODZfNjQpIHsgXAorICAgICAgICBkc3AtPmxvb3BfZmlsdGVyXzE2WzBdID0gZmZfdnA5X2xvb3BfZmlsdGVyX2hfMTZfMTZfIyNvcHQ7IFwKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl8xNlsxXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl92XzE2XzE2XyMjb3B0OyBcCisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlswXVswXVswXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzQ0XzE2XyMjb3B0OyBcCisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlswXVswXVsxXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl92XzQ0XzE2XyMjb3B0OyBcCisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlswXVsxXVswXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzQ4XzE2XyMjb3B0OyBcCisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlswXVsxXVsxXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl92XzQ4XzE2XyMjb3B0OyBcCisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlsxXVswXVswXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzg0XzE2XyMjb3B0OyBcCisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlsxXVswXVsxXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl92Xzg0XzE2XyMjb3B0OyBcCisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlsxXVsxXVswXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzg4XzE2XyMjb3B0OyBcCisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlsxXVsxXVsxXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl92Xzg4XzE2XyMjb3B0OyBcCisgICAgfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGluaXRfaXByZWQodHgsIHN6LCBvcHQpIGRvIHsgXAorICAgIGRzcC0+aW50cmFfcHJlZFt0eF1bSE9SX1BSRURdICAgICAgICAgICAgID0gZmZfdnA5X2lwcmVkX2hfIyNzeiMjeCMjc3ojI18jI29wdDsgXAorICAgIGRzcC0+aW50cmFfcHJlZFt0eF1bRElBR19ET1dOX0xFRlRfUFJFRF0gID0gZmZfdnA5X2lwcmVkX2RsXyMjc3ojI3gjI3N6IyNfIyNvcHQ7IFwKKyAgICBkc3AtPmludHJhX3ByZWRbdHhdW0RJQUdfRE9XTl9SSUdIVF9QUkVEXSA9IGZmX3ZwOV9pcHJlZF9kcl8jI3N6IyN4IyNzeiMjXyMjb3B0OyBcCisgICAgZHNwLT5pbnRyYV9wcmVkW3R4XVtIT1JfRE9XTl9QUkVEXSAgICAgICAgPSBmZl92cDlfaXByZWRfaGRfIyNzeiMjeCMjc3ojI18jI29wdDsgXAorICAgIGRzcC0+aW50cmFfcHJlZFt0eF1bVkVSVF9MRUZUX1BSRURdICAgICAgID0gZmZfdnA5X2lwcmVkX3ZsXyMjc3ojI3gjI3N6IyNfIyNvcHQ7IFwKKyAgICBkc3AtPmludHJhX3ByZWRbdHhdW0hPUl9VUF9QUkVEXSAgICAgICAgICA9IGZmX3ZwOV9pcHJlZF9odV8jI3N6IyN4IyNzeiMjXyMjb3B0OyBcCisgICAgaWYgKEFSQ0hfWDg2XzY0IHx8IHR4ICE9IFRYXzMyWDMyKSB7IFwKKyAgICAgICAgZHNwLT5pbnRyYV9wcmVkW3R4XVtWRVJUX1JJR0hUX1BSRURdICAgICAgPSBmZl92cDlfaXByZWRfdnJfIyNzeiMjeCMjc3ojI18jI29wdDsgXAorICAgICAgICBkc3AtPmludHJhX3ByZWRbdHhdW1RNX1ZQOF9QUkVEXSAgICAgICAgICA9IGZmX3ZwOV9pcHJlZF90bV8jI3N6IyN4IyNzeiMjXyMjb3B0OyBcCisgICAgfSBcCit9IHdoaWxlICgwKQorI2RlZmluZSBpbml0X2RjX2lwcmVkKHR4LCBzeiwgb3B0KSBkbyB7IFwKKyAgICBpbml0X2lwcmVkKHR4LCBzeiwgb3B0KTsgXAorICAgIGRzcC0+aW50cmFfcHJlZFt0eF1bRENfUFJFRF0gICAgICAgICAgICAgID0gZmZfdnA5X2lwcmVkX2RjXyMjc3ojI3gjI3N6IyNfIyNvcHQ7IFwKKyAgICBkc3AtPmludHJhX3ByZWRbdHhdW0xFRlRfRENfUFJFRF0gICAgICAgICA9IGZmX3ZwOV9pcHJlZF9kY19sZWZ0XyMjc3ojI3gjI3N6IyNfIyNvcHQ7IFwKKyAgICBkc3AtPmludHJhX3ByZWRbdHhdW1RPUF9EQ19QUkVEXSAgICAgICAgICA9IGZmX3ZwOV9pcHJlZF9kY190b3BfIyNzeiMjeCMjc3ojI18jI29wdDsgXAorfSB3aGlsZSAoMCkKKworICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBpbml0X2ZwZWwoNCwgMCwgIDQsIHB1dCwgbW14KTsKKyAgICAgICAgaW5pdF9mcGVsKDMsIDAsICA4LCBwdXQsIG1teCk7CisgICAgICAgIGRzcC0+aXR4Zm1fYWRkWzQgLyogbG9zc2xlc3MgKi9dW0RDVF9EQ1RdID0KKyAgICAgICAgZHNwLT5pdHhmbV9hZGRbNCAvKiBsb3NzbGVzcyAqL11bQURTVF9EQ1RdID0KKyAgICAgICAgZHNwLT5pdHhmbV9hZGRbNCAvKiBsb3NzbGVzcyAqL11bRENUX0FEU1RdID0KKyAgICAgICAgZHNwLT5pdHhmbV9hZGRbNCAvKiBsb3NzbGVzcyAqL11bQURTVF9BRFNUXSA9IGZmX3ZwOV9pd2h0X2l3aHRfNHg0X2FkZF9tbXg7CisgICAgICAgIGRzcC0+aW50cmFfcHJlZFtUWF84WDhdW1ZFUlRfUFJFRF0gPSBmZl92cDlfaXByZWRfdl84eDhfbW14OworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSkgeworICAgICAgICBpbml0X2ZwZWwoNCwgMSwgIDQsIGF2ZywgbW14ZXh0KTsKKyAgICAgICAgaW5pdF9mcGVsKDMsIDEsICA4LCBhdmcsIG1teGV4dCk7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX1NTRShjcHVfZmxhZ3MpKSB7CisgICAgICAgIGluaXRfZnBlbCgyLCAwLCAxNiwgcHV0LCBzc2UpOworICAgICAgICBpbml0X2ZwZWwoMSwgMCwgMzIsIHB1dCwgc3NlKTsKKyAgICAgICAgaW5pdF9mcGVsKDAsIDAsIDY0LCBwdXQsIHNzZSk7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICBpbml0X2ZwZWwoMiwgMSwgMTYsIGF2Zywgc3NlMik7CisgICAgICAgIGluaXRfZnBlbCgxLCAxLCAzMiwgYXZnLCBzc2UyKTsKKyAgICAgICAgaW5pdF9mcGVsKDAsIDEsIDY0LCBhdmcsIHNzZTIpOworICAgICAgICBpbml0X2xwZihzc2UyKTsKKyAgICAgICAgZHNwLT5pbnRyYV9wcmVkW1RYXzE2WDE2XVtWRVJUX1BSRURdID0gZmZfdnA5X2lwcmVkX3ZfMTZ4MTZfc3NlMjsKKyAgICAgICAgZHNwLT5pbnRyYV9wcmVkW1RYXzMyWDMyXVtWRVJUX1BSRURdID0gZmZfdnA5X2lwcmVkX3ZfMzJ4MzJfc3NlMjsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NTRTMoY3B1X2ZsYWdzKSkgeworICAgICAgICBpbml0X3N1YnBlbDMoMCwgcHV0LCBzc3NlMyk7CisgICAgICAgIGluaXRfc3VicGVsMygxLCBhdmcsIHNzc2UzKTsKKyAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfNFg0XVtEQ1RfRENUXSA9IGZmX3ZwOV9pZGN0X2lkY3RfNHg0X2FkZF9zc3NlMzsKKyAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfNFg0XVtBRFNUX0RDVF0gID0gZmZfdnA5X2lkY3RfaWFkc3RfNHg0X2FkZF9zc3NlMzsKKyAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfNFg0XVtEQ1RfQURTVF0gID0gZmZfdnA5X2lhZHN0X2lkY3RfNHg0X2FkZF9zc3NlMzsKKyAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfNFg0XVtBRFNUX0FEU1RdID0gZmZfdnA5X2lhZHN0X2lhZHN0XzR4NF9hZGRfc3NzZTM7CisgICAgICAgIGlmIChBUkNIX1g4Nl82NCkgeworICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfOFg4XVtEQ1RfRENUXSA9IGZmX3ZwOV9pZGN0X2lkY3RfOHg4X2FkZF9zc3NlMzsKKyAgICAgICAgICAgIGRzcC0+aXR4Zm1fYWRkW1RYXzhYOF1bQURTVF9EQ1RdICA9IGZmX3ZwOV9pZGN0X2lhZHN0Xzh4OF9hZGRfc3NzZTM7CisgICAgICAgICAgICBkc3AtPml0eGZtX2FkZFtUWF84WDhdW0RDVF9BRFNUXSAgPSBmZl92cDlfaWFkc3RfaWRjdF84eDhfYWRkX3Nzc2UzOworICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfOFg4XVtBRFNUX0FEU1RdID0gZmZfdnA5X2lhZHN0X2lhZHN0Xzh4OF9hZGRfc3NzZTM7CisgICAgICAgICAgICBkc3AtPml0eGZtX2FkZFtUWF8xNlgxNl1bRENUX0RDVF0gICA9IGZmX3ZwOV9pZGN0X2lkY3RfMTZ4MTZfYWRkX3Nzc2UzOworICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfMTZYMTZdW0FEU1RfRENUXSAgPSBmZl92cDlfaWRjdF9pYWRzdF8xNngxNl9hZGRfc3NzZTM7CisgICAgICAgICAgICBkc3AtPml0eGZtX2FkZFtUWF8xNlgxNl1bRENUX0FEU1RdICA9IGZmX3ZwOV9pYWRzdF9pZGN0XzE2eDE2X2FkZF9zc3NlMzsKKyAgICAgICAgICAgIGRzcC0+aXR4Zm1fYWRkW1RYXzE2WDE2XVtBRFNUX0FEU1RdID0gZmZfdnA5X2lhZHN0X2lhZHN0XzE2eDE2X2FkZF9zc3NlMzsKKyAgICAgICAgICAgIGRzcC0+aXR4Zm1fYWRkW1RYXzMyWDMyXVtBRFNUX0FEU1RdID0KKyAgICAgICAgICAgIGRzcC0+aXR4Zm1fYWRkW1RYXzMyWDMyXVtBRFNUX0RDVF0gPQorICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfMzJYMzJdW0RDVF9BRFNUXSA9CisgICAgICAgICAgICBkc3AtPml0eGZtX2FkZFtUWF8zMlgzMl1bRENUX0RDVF0gPSBmZl92cDlfaWRjdF9pZGN0XzMyeDMyX2FkZF9zc3NlMzsKKyAgICAgICAgfQorICAgICAgICBpbml0X2xwZihzc3NlMyk7CisgICAgICAgIGluaXRfZGNfaXByZWQoVFhfNFg0LCAgICA0LCBzc3NlMyk7CisgICAgICAgIGluaXRfZGNfaXByZWQoVFhfOFg4LCAgICA4LCBzc3NlMyk7CisgICAgICAgIGluaXRfZGNfaXByZWQoVFhfMTZYMTYsIDE2LCBzc3NlMyk7CisgICAgICAgIGluaXRfZGNfaXByZWQoVFhfMzJYMzIsIDMyLCBzc3NlMyk7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX0FWWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlmIChBUkNIX1g4Nl82NCkgeworICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfOFg4XVtEQ1RfRENUXSA9IGZmX3ZwOV9pZGN0X2lkY3RfOHg4X2FkZF9hdng7CisgICAgICAgICAgICBkc3AtPml0eGZtX2FkZFtUWF84WDhdW0FEU1RfRENUXSAgPSBmZl92cDlfaWRjdF9pYWRzdF84eDhfYWRkX2F2eDsKKyAgICAgICAgICAgIGRzcC0+aXR4Zm1fYWRkW1RYXzhYOF1bRENUX0FEU1RdICA9IGZmX3ZwOV9pYWRzdF9pZGN0Xzh4OF9hZGRfYXZ4OworICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfOFg4XVtBRFNUX0FEU1RdID0gZmZfdnA5X2lhZHN0X2lhZHN0Xzh4OF9hZGRfYXZ4OworICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfMTZYMTZdW0RDVF9EQ1RdID0gZmZfdnA5X2lkY3RfaWRjdF8xNngxNl9hZGRfYXZ4OworICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfMTZYMTZdW0FEU1RfRENUXSAgPSBmZl92cDlfaWRjdF9pYWRzdF8xNngxNl9hZGRfYXZ4OworICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfMTZYMTZdW0RDVF9BRFNUXSAgPSBmZl92cDlfaWFkc3RfaWRjdF8xNngxNl9hZGRfYXZ4OworICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfMTZYMTZdW0FEU1RfQURTVF0gPSBmZl92cDlfaWFkc3RfaWFkc3RfMTZ4MTZfYWRkX2F2eDsKKyAgICAgICAgICAgIGRzcC0+aXR4Zm1fYWRkW1RYXzMyWDMyXVtBRFNUX0FEU1RdID0KKyAgICAgICAgICAgIGRzcC0+aXR4Zm1fYWRkW1RYXzMyWDMyXVtBRFNUX0RDVF0gPQorICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfMzJYMzJdW0RDVF9BRFNUXSA9CisgICAgICAgICAgICBkc3AtPml0eGZtX2FkZFtUWF8zMlgzMl1bRENUX0RDVF0gPSBmZl92cDlfaWRjdF9pZGN0XzMyeDMyX2FkZF9hdng7CisgICAgICAgIH0KKyAgICAgICAgaW5pdF9mcGVsKDEsIDAsIDMyLCBwdXQsIGF2eCk7CisgICAgICAgIGluaXRfZnBlbCgwLCAwLCA2NCwgcHV0LCBhdngpOworICAgICAgICBpbml0X2xwZihhdngpOworICAgICAgICBpbml0X2lwcmVkKFRYXzhYOCwgICAgOCwgYXZ4KTsKKyAgICAgICAgaW5pdF9pcHJlZChUWF8xNlgxNiwgMTYsIGF2eCk7CisgICAgICAgIGluaXRfaXByZWQoVFhfMzJYMzIsIDMyLCBhdngpOworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9BVlgyKGNwdV9mbGFncykpIHsKKyAgICAgICAgaW5pdF9mcGVsKDEsIDEsIDMyLCBhdmcsIGF2eDIpOworICAgICAgICBpbml0X2ZwZWwoMCwgMSwgNjQsIGF2ZywgYXZ4Mik7CisgICAgICAgIGlmIChBUkNIX1g4Nl82NCkgeworI2lmIEFSQ0hfWDg2XzY0ICYmIEhBVkVfQVZYMl9FWFRFUk5BTAorICAgICAgICAgICAgaW5pdF9zdWJwZWwyXzMyXzY0KDAsIDEsIDEsIGh2LCBwdXQsIGF2eDIpOworICAgICAgICAgICAgaW5pdF9zdWJwZWwyXzMyXzY0KDAsIDAsIDEsIHYsICBwdXQsIGF2eDIpOworICAgICAgICAgICAgaW5pdF9zdWJwZWwyXzMyXzY0KDAsIDEsIDAsIGgsICBwdXQsIGF2eDIpOworICAgICAgICAgICAgaW5pdF9zdWJwZWwyXzMyXzY0KDEsIDEsIDEsIGh2LCBhdmcsIGF2eDIpOworICAgICAgICAgICAgaW5pdF9zdWJwZWwyXzMyXzY0KDEsIDAsIDEsIHYsICBhdmcsIGF2eDIpOworICAgICAgICAgICAgaW5pdF9zdWJwZWwyXzMyXzY0KDEsIDEsIDAsIGgsICBhdmcsIGF2eDIpOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZHNwLT5pbnRyYV9wcmVkW1RYXzMyWDMyXVtEQ19QUkVEXSA9IGZmX3ZwOV9pcHJlZF9kY18zMngzMl9hdngyOworICAgICAgICBkc3AtPmludHJhX3ByZWRbVFhfMzJYMzJdW0xFRlRfRENfUFJFRF0gPSBmZl92cDlfaXByZWRfZGNfbGVmdF8zMngzMl9hdngyOworICAgICAgICBkc3AtPmludHJhX3ByZWRbVFhfMzJYMzJdW1RPUF9EQ19QUkVEXSA9IGZmX3ZwOV9pcHJlZF9kY190b3BfMzJ4MzJfYXZ4MjsKKyAgICAgICAgZHNwLT5pbnRyYV9wcmVkW1RYXzMyWDMyXVtWRVJUX1BSRURdID0gZmZfdnA5X2lwcmVkX3ZfMzJ4MzJfYXZ4MjsKKyAgICAgICAgZHNwLT5pbnRyYV9wcmVkW1RYXzMyWDMyXVtIT1JfUFJFRF0gPSBmZl92cDlfaXByZWRfaF8zMngzMl9hdngyOworICAgICAgICBkc3AtPmludHJhX3ByZWRbVFhfMzJYMzJdW1RNX1ZQOF9QUkVEXSA9IGZmX3ZwOV9pcHJlZF90bV8zMngzMl9hdngyOworICAgIH0KKworI3VuZGVmIGluaXRfZnBlbAorI3VuZGVmIGluaXRfc3VicGVsMQorI3VuZGVmIGluaXRfc3VicGVsMgorI3VuZGVmIGluaXRfc3VicGVsMworCisjZW5kaWYgLyogSEFWRV9ZQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA5aW50cmFwcmVkLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92cDlpbnRyYXByZWQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTA3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA5aW50cmFwcmVkLmFzbQpAQCAtMCwwICsxLDE1NTQgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIFZQOSBJbnRyYSBwcmVkaWN0aW9uIFNJTUQgb3B0aW1pemF0aW9ucworOyoKKzsqIENvcHlyaWdodCAoYykgMjAxMyBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZSBnbWFpbCBjb20+Cis7KgorOyogUGFydHMgYmFzZWQgb246Cis7KiBILjI2NCBpbnRyYSBwcmVkaWN0aW9uIGFzbSBvcHRpbWl6YXRpb25zCis7KiBDb3B5cmlnaHQgKGMpIDIwMTAgRmlvbmEgR2xhc2VyCis7KiBDb3B5cmlnaHQgKGMpIDIwMTAgSG9sZ2VyIEx1Yml0egorOyogQ29weXJpZ2h0IChjKSAyMDEwIExvcmVuIE1lcnJpdHQKKzsqIENvcHlyaWdodCAoYykgMjAxMCBSb25hbGQgUy4gQnVsdGplCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEgMzIKKworcHdfbTI1NjogdGltZXMgMTYgZHcgLTI1NgorcHdfbTI1NTogdGltZXMgMTYgZHcgLTI1NQorcHdfNDA5NjogdGltZXMgOCBkdyA0MDk2CisKK3BiXzR4M180eDJfNHgxXzR4MDogdGltZXMgNCBkYiAzCisgICAgICAgICAgICAgICAgICAgIHRpbWVzIDQgZGIgMgorICAgICAgICAgICAgICAgICAgICB0aW1lcyA0IGRiIDEKKyAgICAgICAgICAgICAgICAgICAgdGltZXMgNCBkYiAwCitwYl84eDFfOHgwOiAgIHRpbWVzIDggZGIgMQorICAgICAgICAgICAgICB0aW1lcyA4IGRiIDAKK3BiXzh4M184eDI6ICAgdGltZXMgOCBkYiAzCisgICAgICAgICAgICAgIHRpbWVzIDggZGIgMgorcGJfMHRvNV8yeDc6ICBkYiAwLCAxLCAyLCAzLCA0LCA1LCA3LCA3CisgICAgICAgICAgICAgIHRpbWVzIDggZGIgLTEKK3BiXzB0bzZfOXg3OiAgZGIgMCwgMSwgMiwgMywgNCwgNSwgNgorICAgICAgICAgICAgICB0aW1lcyA5IGRiIDcKK3BiXzF0bzZfMTB4NzogZGIgMSwgMiwgMywgNCwgNSwgNgorICAgICAgICAgICAgICB0aW1lcyAxMCBkYiA3CitwYl8ydG82XzN4NzoKK3BiXzJ0bzZfMTF4NzogZGIgMiwgMywgNCwgNSwgNgorICAgICAgICAgICAgICB0aW1lcyAxMSBkYiA3CitwYl8xdG9FXzJ4RjogIGRiIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE1CitwYl8ydG9FXzN4RjogIGRiIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE1LCAxNQorcGJfMTM0NTZfM3htMTogZGIgMSwgMywgNCwgNSwgNgorICAgICAgICAgICAgICAgdGltZXMgMyBkYiAtMQorcGJfNjAxMl80eG0xOiBkYiA2LCAwLCAxLCAyCisgICAgICAgICAgICAgIHRpbWVzIDQgZGIgLTEKK3BiXzZ4bTFfMjQ2Xzh0b0U6IHRpbWVzIDYgZGIgLTEKKyAgICAgICAgICAgICAgICAgIGRiIDIsIDQsIDYsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNAorcGJfNnhtMV9CREZfMHRvNjogdGltZXMgNiBkYiAtMQorICAgICAgICAgICAgICAgICAgZGIgMTEsIDEzLCAxNSwgMCwgMSwgMiwgMywgNCwgNSwgNgorcGJfMDI0NjhBQ0VfMTM1NzlCREY6IGRiIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUKK3BiXzd0bzFfOXgwOiAgZGIgNywgNiwgNSwgNAorcGJfM3RvMV81eDA6ICBkYiAzLCAyLCAxCisgICAgICAgICAgICAgIHRpbWVzIDkgZGIgMAorcGJfRnRvMDogICAgICBkYiAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwCisKK3BiXzI6ICB0aW1lcyAzMiBkYiAyCitwYl8xNTogdGltZXMgMTYgZGIgMTUKKworY2V4dGVybiBwYl8xCitjZXh0ZXJuIHBiXzMKK2NleHRlcm4gcHdfNTEyCitjZXh0ZXJuIHB3XzEwMjQKK2NleHRlcm4gcHdfMjA0OAorY2V4dGVybiBwd184MTkyCisKK1NFQ1RJT04gLnRleHQKKworOyBkY19OeE4odWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpsLCBjb25zdCB1aW50OF90ICphKQorCitJTklUX01NWCBzc3NlMworY2dsb2JhbCB2cDlfaXByZWRfZGNfNHg0LCA0LCA0LCAwLCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmQgICAgICAgICAgICAgICAgICAgIG0wLCBbbHFdCisgICAgcHVucGNrbGRxICAgICAgICAgICAgICAgbTAsIFthcV0KKyAgICBweG9yICAgICAgICAgICAgICAgICAgICBtMSwgbTEKKyAgICBwc2FkYncgICAgICAgICAgICAgICAgICBtMCwgbTEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgICBtMCwgW3B3XzQwOTZdCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTAsIG0xCisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0wCisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0wCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqMl0KKyAgICBtb3ZkICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTAKKyAgICBtb3ZkICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTAKKyAgICBSRVQKKworSU5JVF9NTVggc3NzZTMKK2NnbG9iYWwgdnA5X2lwcmVkX2RjXzh4OCwgNCwgNCwgMCwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBtb3ZxICAgICAgICAgICAgICAgICAgICBtMCwgW2xxXQorICAgIG1vdnEgICAgICAgICAgICAgICAgICAgIG0xLCBbYXFdCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIHN0cmlkZTMKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBweG9yICAgICAgICAgICAgICAgICAgICBtMiwgbTIKKyAgICBwc2FkYncgICAgICAgICAgICAgICAgICBtMCwgbTIKKyAgICBwc2FkYncgICAgICAgICAgICAgICAgICBtMSwgbTIKKyAgICBwYWRkdyAgICAgICAgICAgICAgICAgICBtMCwgbTEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgICBtMCwgW3B3XzIwNDhdCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTAsIG0yCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0wCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0wCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0wCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZTNxIF0sIG0wCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTAKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTAKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSoyXSwgbTAKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlM3EgXSwgbTAKKyAgICBSRVQKKworSU5JVF9YTU0gc3NzZTMKK2NnbG9iYWwgdnA5X2lwcmVkX2RjXzE2eDE2LCA0LCA0LCAzLCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbbHFdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTEsIFthcV0KKyAgICBERUZJTkVfQVJHUyBkc3QsIHN0cmlkZSwgc3RyaWRlMywgY250CisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisgICAgcHhvciAgICAgICAgICAgICAgICAgICAgbTIsIG0yCisgICAgcHNhZGJ3ICAgICAgICAgICAgICAgICAgbTAsIG0yCisgICAgcHNhZGJ3ICAgICAgICAgICAgICAgICAgbTEsIG0yCisgICAgcGFkZHcgICAgICAgICAgICAgICAgICAgbTAsIG0xCisgICAgbW92aGxwcyAgICAgICAgICAgICAgICAgbTEsIG0wCisgICAgcGFkZHcgICAgICAgICAgICAgICAgICAgbTAsIG0xCisgICAgcG11bGhyc3cgICAgICAgICAgICAgICAgbTAsIFtwd18xMDI0XQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0wLCBtMgorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRkLCA0CisubG9vcDoKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTAKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTAKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoyXSwgbTAKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlM3EgXSwgbTAKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSo0XQorICAgIGRlYyAgICAgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AKKyAgICBSRVQKKworSU5JVF9YTU0gc3NzZTMKK2NnbG9iYWwgdnA5X2lwcmVkX2RjXzMyeDMyLCA0LCA0LCA1LCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbbHFdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTEsIFtscSsxNl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMiwgW2FxXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0zLCBbYXErMTZdCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIHN0cmlkZTMsIGNudAorICAgIGxlYSAgICAgICAgICAgICAgIHN0cmlkZTNxLCBbc3RyaWRlcSozXQorICAgIHB4b3IgICAgICAgICAgICAgICAgICAgIG00LCBtNAorICAgIHBzYWRidyAgICAgICAgICAgICAgICAgIG0wLCBtNAorICAgIHBzYWRidyAgICAgICAgICAgICAgICAgIG0xLCBtNAorICAgIHBzYWRidyAgICAgICAgICAgICAgICAgIG0yLCBtNAorICAgIHBzYWRidyAgICAgICAgICAgICAgICAgIG0zLCBtNAorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG0wLCBtMQorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG0yLCBtMworICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG0wLCBtMgorICAgIG1vdmhscHMgICAgICAgICAgICAgICAgIG0xLCBtMAorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG0wLCBtMQorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgIG0wLCBbcHdfNTEyXQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0wLCBtNAorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRkLCA4CisubG9vcDoKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSowKyAwXSwgbTAKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSowKzE2XSwgbTAKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSoxKyAwXSwgbTAKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSoxKzE2XSwgbTAKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSoyKyAwXSwgbTAKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSoyKzE2XSwgbTAKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlM3EgKyAwXSwgbTAKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlM3EgKzE2XSwgbTAKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSo0XQorICAgIGRlYyAgICAgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AKKyAgICBSRVQKKworJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4MgorY2dsb2JhbCB2cDlfaXByZWRfZGNfMzJ4MzIsIDQsIDQsIDMsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIFtscV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMSwgW2FxXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzLCBjbnQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBweG9yICAgICAgICAgICAgICAgICAgICBtMiwgbTIKKyAgICBwc2FkYncgICAgICAgICAgICAgICAgICBtMCwgbTIKKyAgICBwc2FkYncgICAgICAgICAgICAgICAgICBtMSwgbTIKKyAgICBwYWRkdyAgICAgICAgICAgICAgICAgICBtMCwgbTEKKyAgICB2ZXh0cmFjdGkxMjggICAgICAgICAgIHhtMSwgbTAsIDEKKyAgICBwYWRkdyAgICAgICAgICAgICAgICAgIHhtMCwgeG0xCisgICAgbW92aGxwcyAgICAgICAgICAgICAgICB4bTEsIHhtMAorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgeG0wLCB4bTEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgIHhtMCwgW3B3XzUxMl0KKyAgICB2cGJyb2FkY2FzdGIgICAgICAgICAgICBtMCwgeG0wCisgICAgbW92ICAgICAgICAgICAgICAgICAgIGNudGQsIDQKKy5sb29wOgorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjJdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGUzcSBdLCBtMAorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjRdCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0wCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0wCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0wCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZTNxIF0sIG0wCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBkZWMgICAgICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wCisgICAgUkVUCislZW5kaWYKKworOyBkY190b3AvbGVmdF9OeE4odWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpsLCBjb25zdCB1aW50OF90ICphKQorCislbWFjcm8gRENfMURfRlVOQ1MgMiA7IGRpciAodG9wIG9yIGxlZnQpLCBhcmcgKGEgb3IgbCkKK0lOSVRfTU1YIHNzc2UzCitjZ2xvYmFsIHZwOV9pcHJlZF9kY18lMV80eDQsIDQsIDQsIDAsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgbTAsIFslMnFdCisgICAgcHhvciAgICAgICAgICAgICAgICAgICAgbTEsIG0xCisgICAgcHNhZGJ3ICAgICAgICAgICAgICAgICAgbTAsIG0xCisgICAgcG11bGhyc3cgICAgICAgICAgICAgICAgbTAsIFtwd184MTkyXQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0wLCBtMQorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMAorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjJdCisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0wCisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0wCisgICAgUkVUCisKK0lOSVRfTU1YIHNzc2UzCitjZ2xvYmFsIHZwOV9pcHJlZF9kY18lMV84eDgsIDQsIDQsIDAsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92cSAgICAgICAgICAgICAgICAgICAgbTAsIFslMnFdCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIHN0cmlkZTMKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBweG9yICAgICAgICAgICAgICAgICAgICBtMSwgbTEKKyAgICBwc2FkYncgICAgICAgICAgICAgICAgICBtMCwgbTEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgICBtMCwgW3B3XzQwOTZdCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTAsIG0xCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0wCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0wCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0wCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZTNxIF0sIG0wCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTAKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTAKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSoyXSwgbTAKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlM3EgXSwgbTAKKyAgICBSRVQKKworSU5JVF9YTU0gc3NzZTMKK2NnbG9iYWwgdnA5X2lwcmVkX2RjXyUxXzE2eDE2LCA0LCA0LCAzLCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbJTJxXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzLCBjbnQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBweG9yICAgICAgICAgICAgICAgICAgICBtMiwgbTIKKyAgICBwc2FkYncgICAgICAgICAgICAgICAgICBtMCwgbTIKKyAgICBtb3ZobHBzICAgICAgICAgICAgICAgICBtMSwgbTAKKyAgICBwYWRkdyAgICAgICAgICAgICAgICAgICBtMCwgbTEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgICBtMCwgW3B3XzIwNDhdCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTAsIG0yCisgICAgbW92ICAgICAgICAgICAgICAgICAgIGNudGQsIDQKKy5sb29wOgorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjJdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGUzcSBdLCBtMAorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjRdCisgICAgZGVjICAgICAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcAorICAgIFJFVAorCitJTklUX1hNTSBzc3NlMworY2dsb2JhbCB2cDlfaXByZWRfZGNfJTFfMzJ4MzIsIDQsIDQsIDMsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIFslMnFdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTEsIFslMnErMTZdCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIHN0cmlkZTMsIGNudAorICAgIGxlYSAgICAgICAgICAgICAgIHN0cmlkZTNxLCBbc3RyaWRlcSozXQorICAgIHB4b3IgICAgICAgICAgICAgICAgICAgIG0yLCBtMgorICAgIHBzYWRidyAgICAgICAgICAgICAgICAgIG0wLCBtMgorICAgIHBzYWRidyAgICAgICAgICAgICAgICAgIG0xLCBtMgorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG0wLCBtMQorICAgIG1vdmhscHMgICAgICAgICAgICAgICAgIG0xLCBtMAorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG0wLCBtMQorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgIG0wLCBbcHdfMTAyNF0KKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMCwgbTIKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250ZCwgOAorLmxvb3A6CisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMCsgMF0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMCsxNl0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMSsgMF0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMSsxNl0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMisgMF0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMisxNl0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZTNxICsgMF0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZTNxICsxNl0sIG0wCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBkZWMgICAgICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wCisgICAgUkVUCisKKyVpZiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK2NnbG9iYWwgdnA5X2lwcmVkX2RjXyUxXzMyeDMyLCA0LCA0LCAzLCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbJTJxXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzLCBjbnQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBweG9yICAgICAgICAgICAgICAgICAgICBtMiwgbTIKKyAgICBwc2FkYncgICAgICAgICAgICAgICAgICBtMCwgbTIKKyAgICB2ZXh0cmFjdGkxMjggICAgICAgICAgIHhtMSwgbTAsIDEKKyAgICBwYWRkdyAgICAgICAgICAgICAgICAgIHhtMCwgeG0xCisgICAgbW92aGxwcyAgICAgICAgICAgICAgICB4bTEsIHhtMAorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgeG0wLCB4bTEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgIHhtMCwgW3B3XzEwMjRdCisgICAgdnBicm9hZGNhc3RiICAgICAgICAgICAgbTAsIHhtMAorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRkLCA0CisubG9vcDoKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTAKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTAKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoyXSwgbTAKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlM3EgXSwgbTAKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSo0XQorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjJdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGUzcSBdLCBtMAorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjRdCisgICAgZGVjICAgICAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcAorICAgIFJFVAorJWVuZGlmCislZW5kbWFjcm8KKworRENfMURfRlVOQ1MgdG9wLCAgYQorRENfMURfRlVOQ1MgbGVmdCwgbAorCis7IHYKKworSU5JVF9NTVggbW14CitjZ2xvYmFsIHZwOV9pcHJlZF92Xzh4OCwgNCwgNCwgMCwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBtb3ZxICAgICAgICAgICAgICAgICAgICBtMCwgW2FxXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzCisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0wCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0wCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0wCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZTNxIF0sIG0wCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTAKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTAKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSoyXSwgbTAKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlM3EgXSwgbTAKKyAgICBSRVQKKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCB2cDlfaXByZWRfdl8xNngxNiwgNCwgNCwgMSwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgW2FxXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzLCBjbnQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250ZCwgNAorLmxvb3A6CisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0wCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0wCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0wCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZTNxIF0sIG0wCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBkZWMgICAgICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wCisgICAgUkVUCisKK0lOSVRfWE1NIHNzZTIKK2NnbG9iYWwgdnA5X2lwcmVkX3ZfMzJ4MzIsIDQsIDQsIDIsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIFthcV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMSwgW2FxKzE2XQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzLCBjbnQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250ZCwgOAorLmxvb3A6CisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMCsgMF0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMCsxNl0sIG0xCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMSsgMF0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMSsxNl0sIG0xCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMisgMF0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMisxNl0sIG0xCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZTNxICsgMF0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZTNxICsxNl0sIG0xCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBkZWMgICAgICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wCisgICAgUkVUCisKKyVpZiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK2NnbG9iYWwgdnA5X2lwcmVkX3ZfMzJ4MzIsIDQsIDQsIDEsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIFthcV0KKyAgICBERUZJTkVfQVJHUyBkc3QsIHN0cmlkZSwgc3RyaWRlMywgY250CisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisgICAgbW92ICAgICAgICAgICAgICAgICAgIGNudGQsIDQKKy5sb29wOgorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjJdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGUzcSBdLCBtMAorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjRdCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0wCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0wCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0wCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZTNxIF0sIG0wCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBkZWMgICAgICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wCisgICAgUkVUCislZW5kaWYKKworOyBoCisKK0lOSVRfWE1NIHNzc2UzCitjZ2xvYmFsIHZwOV9pcHJlZF9oXzR4NCwgMywgNCwgMSwgZHN0LCBzdHJpZGUsIGwsIHN0cmlkZTMKKyAgICBtb3ZkICAgICAgICAgICAgICAgICAgICBtMCwgW2xxXQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0wLCBbcGJfNHgzXzR4Ml80eDFfNHgwXQorICAgIGxlYSAgICAgICAgICAgICAgIHN0cmlkZTNxLCBbc3RyaWRlcSozXQorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIHBzcmxkcSAgICAgICAgICAgICAgICAgIG0wLCA0CisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0wCisgICAgcHNybGRxICAgICAgICAgICAgICAgICAgbTAsIDQKKyAgICBtb3ZkICAgICAgW2RzdHErc3RyaWRlcSoyXSwgbTAKKyAgICBwc3JsZHEgICAgICAgICAgICAgICAgICBtMCwgNAorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGUzcSBdLCBtMAorICAgIFJFVAorCislbWFjcm8gSF9YTU1fRlVOQ1MgMQorSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX2hfOHg4LCAzLCA1LCA0LCBkc3QsIHN0cmlkZSwgbCwgc3RyaWRlMywgY250CisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTIsIFtwYl84eDFfOHgwXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0zLCBbcGJfOHgzXzh4Ml0KKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250cSwgMQorLmxvb3A6CisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgbTAsIFtscStjbnRxKjRdCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTEsIG0wLCBtMworICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0wLCBtMgorICAgIG1vdnEgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMQorICAgIG1vdmhwcyAgICBbZHN0cStzdHJpZGVxKjFdLCBtMQorICAgIG1vdnEgICAgICBbZHN0cStzdHJpZGVxKjJdLCBtMAorICAgIG1vdmhwcyAgICBbZHN0cStzdHJpZGUzcSBdLCBtMAorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjRdCisgICAgZGVjICAgICAgICAgICAgICAgICAgIGNudHEKKyAgICBqZ2UgLmxvb3AKKyAgICBSRVQKKworSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX2hfMTZ4MTYsIDMsIDUsIDgsIGRzdCwgc3RyaWRlLCBsLCBzdHJpZGUzLCBjbnQKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNSwgW3BiXzFdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTYsIFtwYl8yXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG03LCBbcGJfM10KKyAgICBweG9yICAgICAgICAgICAgICAgICAgICBtNCwgbTQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250cSwgMworLmxvb3A6CisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgbTMsIFtscStjbnRxKjRdCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTAsIG0zLCBtNworICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0xLCBtMywgbTYKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTAKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTEKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMiwgbTMsIG01CisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTMsIG00CisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0yCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZTNxIF0sIG0zCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBkZWMgICAgICAgICAgICAgICAgICAgY250cQorICAgIGpnZSAubG9vcAorICAgIFJFVAorCitJTklUX1hNTSAlMQorY2dsb2JhbCB2cDlfaXByZWRfaF8zMngzMiwgMywgNSwgOCwgZHN0LCBzdHJpZGUsIGwsIHN0cmlkZTMsIGNudAorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG01LCBbcGJfMV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNiwgW3BiXzJdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTcsIFtwYl8zXQorICAgIHB4b3IgICAgICAgICAgICAgICAgICAgIG00LCBtNAorICAgIGxlYSAgICAgICAgICAgICAgIHN0cmlkZTNxLCBbc3RyaWRlcSozXQorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRxLCA3CisubG9vcDoKKyAgICBtb3ZkICAgICAgICAgICAgICAgICAgICBtMywgW2xxK2NudHEqNF0KKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMCwgbTMsIG03CisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTEsIG0zLCBtNgorICAgIG1vdmEgICBbZHN0cStzdHJpZGVxKjArIDBdLCBtMAorICAgIG1vdmEgICBbZHN0cStzdHJpZGVxKjArMTZdLCBtMAorICAgIG1vdmEgICBbZHN0cStzdHJpZGVxKjErIDBdLCBtMQorICAgIG1vdmEgICBbZHN0cStzdHJpZGVxKjErMTZdLCBtMQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0yLCBtMywgbTUKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMywgbTQKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSoyKyAwXSwgbTIKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSoyKzE2XSwgbTIKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlM3EgKyAwXSwgbTMKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlM3EgKzE2XSwgbTMKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSo0XQorICAgIGRlYyAgICAgICAgICAgICAgICAgICBjbnRxCisgICAgamdlIC5sb29wCisgICAgUkVUCislZW5kbWFjcm8KKworSF9YTU1fRlVOQ1Mgc3NzZTMKK0hfWE1NX0ZVTkNTIGF2eAorCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitjZ2xvYmFsIHZwOV9pcHJlZF9oXzMyeDMyLCAzLCA1LCA4LCBkc3QsIHN0cmlkZSwgbCwgc3RyaWRlMywgY250CisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTUsIFtwYl8xXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG02LCBbcGJfMl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNywgW3BiXzNdCisgICAgcHhvciAgICAgICAgICAgICAgICAgICAgbTQsIG00CisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisgICAgbW92ICAgICAgICAgICAgICAgICAgIGNudHEsIDcKKy5sb29wOgorICAgIG1vdmQgICAgICAgICAgICAgICAgICAgeG0zLCBbbHErY250cSo0XQorICAgIHZpbnNlcnRpMTI4ICAgICAgICAgICAgIG0zLCBtMywgeG0zLCAxCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTAsIG0zLCBtNworICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0xLCBtMywgbTYKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTAKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTEKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMiwgbTMsIG01CisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTMsIG00CisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0yCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZTNxIF0sIG0zCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBkZWMgICAgICAgICAgICAgICAgICAgY250cQorICAgIGpnZSAubG9vcAorICAgIFJFVAorJWVuZGlmCisKKzsgdG0KKworSU5JVF9NTVggc3NzZTMKK2NnbG9iYWwgdnA5X2lwcmVkX3RtXzR4NCwgNCwgNCwgMCwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBweG9yICAgICAgICAgICAgICAgICAgICBtMSwgbTEKKyAgICBwaW5zcncgICAgICAgICAgICAgICAgICBtMiwgW2FxLTFdLCAwCisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgbTAsIFthcV0KKyAgICBERUZJTkVfQVJHUyBkc3QsIHN0cmlkZSwgbCwgY250CisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTMsIFtwd19tMjU2XQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG00LCBbcHdfbTI1NV0KKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMiwgbTMKKyAgICBwdW5wY2tsYncgICAgICAgICAgICAgICBtMCwgbTEKKyAgICBwc3VidyAgICAgICAgICAgICAgICAgICBtMCwgbTIKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250cSwgMQorLmxvb3A6CisgICAgcGluc3J3ICAgICAgICAgICAgICAgICAgbTIsIFtscStjbnRxKjJdLCAwCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTEsIG0yLCBtNAorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0yLCBtMworICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG0xLCBtMAorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG0yLCBtMAorICAgIHBhY2t1c3diICAgICAgICAgICAgICAgIG0xLCBtMQorICAgIHBhY2t1c3diICAgICAgICAgICAgICAgIG0yLCBtMgorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMQorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMgorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjJdCisgICAgZGVjICAgICAgICAgICAgICAgICAgIGNudHEKKyAgICBqZ2UgLmxvb3AKKyAgICBSRVQKKworJW1hY3JvIFRNX1hNTV9GVU5DUyAxCitJTklUX1hNTSAlMQorY2dsb2JhbCB2cDlfaXByZWRfdG1fOHg4LCA0LCA0LCA1LCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIHB4b3IgICAgICAgICAgICAgICAgICAgIG0xLCBtMQorICAgIHBpbnNydyAgICAgICAgICAgICAgICAgIG0yLCBbYXEtMV0sIDAKKyAgICBtb3ZoICAgICAgICAgICAgICAgICAgICBtMCwgW2FxXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBsLCBjbnQKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMywgW3B3X20yNTZdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTQsIFtwd19tMjU1XQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0yLCBtMworICAgIHB1bnBja2xidyAgICAgICAgICAgICAgIG0wLCBtMQorICAgIHBzdWJ3ICAgICAgICAgICAgICAgICAgIG0wLCBtMgorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRxLCAzCisubG9vcDoKKyAgICBwaW5zcncgICAgICAgICAgICAgICAgICBtMiwgW2xxK2NudHEqMl0sIDAKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMSwgbTIsIG00CisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTIsIG0zCisgICAgcGFkZHcgICAgICAgICAgICAgICAgICAgbTEsIG0wCisgICAgcGFkZHcgICAgICAgICAgICAgICAgICAgbTIsIG0wCisgICAgcGFja3Vzd2IgICAgICAgICAgICAgICAgbTEsIG0yCisgICAgbW92aCAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0xCisgICAgbW92aHBzICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0xCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqMl0KKyAgICBkZWMgICAgICAgICAgICAgICAgICAgY250cQorICAgIGpnZSAubG9vcAorICAgIFJFVAorCitJTklUX1hNTSAlMQorY2dsb2JhbCB2cDlfaXByZWRfdG1fMTZ4MTYsIDQsIDQsIDgsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgcHhvciAgICAgICAgICAgICAgICAgICAgbTMsIG0zCisgICAgcGluc3J3ICAgICAgICAgICAgICAgICAgbTIsIFthcS0xXSwgMAorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbYXFdCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIGwsIGNudAorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG00LCBbcHdfbTI1Nl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNSwgW3B3X20yNTVdCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTIsIG00CisgICAgcHVucGNraGJ3ICAgICAgICAgICAgICAgbTEsIG0wLCBtMworICAgIHB1bnBja2xidyAgICAgICAgICAgICAgIG0wLCBtMworICAgIHBzdWJ3ICAgICAgICAgICAgICAgICAgIG0xLCBtMgorICAgIHBzdWJ3ICAgICAgICAgICAgICAgICAgIG0wLCBtMgorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRxLCA3CisubG9vcDoKKyAgICBwaW5zcncgICAgICAgICAgICAgICAgICBtNywgW2xxK2NudHEqMl0sIDAKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMywgbTcsIG01CisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTcsIG00CisgICAgcGFkZHcgICAgICAgICAgICAgICAgICAgbTIsIG0zLCBtMAorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG0zLCBtMQorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG02LCBtNywgbTAKKyAgICBwYWRkdyAgICAgICAgICAgICAgICAgICBtNywgbTEKKyAgICBwYWNrdXN3YiAgICAgICAgICAgICAgICBtMiwgbTMKKyAgICBwYWNrdXN3YiAgICAgICAgICAgICAgICBtNiwgbTcKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTIKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTYKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSoyXQorICAgIGRlYyAgICAgICAgICAgICAgICAgICBjbnRxCisgICAgamdlIC5sb29wCisgICAgUkVUCisKKyVpZiBBUkNIX1g4Nl82NAorSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX3RtXzMyeDMyLCA0LCA0LCAxNCwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBweG9yICAgICAgICAgICAgICAgICAgICBtNSwgbTUKKyAgICBwaW5zcncgICAgICAgICAgICAgICAgICBtNCwgW2FxLTFdLCAwCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIFthcV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMiwgW2FxKzE2XQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBsLCBjbnQKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtOCwgW3B3X20yNTZdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTksIFtwd19tMjU1XQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG00LCBtOAorICAgIHB1bnBja2hidyAgICAgICAgICAgICAgIG0xLCBtMCwgIG01CisgICAgcHVucGNraGJ3ICAgICAgICAgICAgICAgbTMsIG0yLCAgbTUKKyAgICBwdW5wY2tsYncgICAgICAgICAgICAgICBtMCwgbTUKKyAgICBwdW5wY2tsYncgICAgICAgICAgICAgICBtMiwgbTUKKyAgICBwc3VidyAgICAgICAgICAgICAgICAgICBtMSwgbTQKKyAgICBwc3VidyAgICAgICAgICAgICAgICAgICBtMCwgbTQKKyAgICBwc3VidyAgICAgICAgICAgICAgICAgICBtMywgbTQKKyAgICBwc3VidyAgICAgICAgICAgICAgICAgICBtMiwgbTQKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250cSwgMTUKKy5sb29wOgorICAgIHBpbnNydyAgICAgICAgICAgICAgICAgbTEzLCBbbHErY250cSoyXSwgMAorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG03LCBtMTMsIG05CisgICAgcHNodWZiICAgICAgICAgICAgICAgICBtMTMsIG04CisgICAgcGFkZHcgICAgICAgICAgICAgICAgICAgbTQsIG03LCAgbTAKKyAgICBwYWRkdyAgICAgICAgICAgICAgICAgICBtNSwgbTcsICBtMQorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG02LCBtNywgIG0yCisgICAgcGFkZHcgICAgICAgICAgICAgICAgICAgbTcsIG0zCisgICAgcGFkZHcgICAgICAgICAgICAgICAgICBtMTAsIG0xMywgbTAKKyAgICBwYWRkdyAgICAgICAgICAgICAgICAgIG0xMSwgbTEzLCBtMQorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgbTEyLCBtMTMsIG0yCisgICAgcGFkZHcgICAgICAgICAgICAgICAgICBtMTMsIG0zCisgICAgcGFja3Vzd2IgICAgICAgICAgICAgICAgbTQsIG01CisgICAgcGFja3Vzd2IgICAgICAgICAgICAgICAgbTYsIG03CisgICAgcGFja3Vzd2IgICAgICAgICAgICAgICBtMTAsIG0xMQorICAgIHBhY2t1c3diICAgICAgICAgICAgICAgbTEyLCBtMTMKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSowKyAwXSwgbTQKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSowKzE2XSwgbTYKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSoxKyAwXSwgbTEwCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMSsxNl0sIG0xMgorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjJdCisgICAgZGVjICAgICAgICAgICAgICAgICAgIGNudHEKKyAgICBqZ2UgLmxvb3AKKyAgICBSRVQKKyVlbmRpZgorJWVuZG1hY3JvCisKK1RNX1hNTV9GVU5DUyBzc3NlMworVE1fWE1NX0ZVTkNTIGF2eAorCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitjZ2xvYmFsIHZwOV9pcHJlZF90bV8zMngzMiwgNCwgNCwgOCwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBweG9yICAgICAgICAgICAgICAgICAgICBtMywgbTMKKyAgICBwaW5zcncgICAgICAgICAgICAgICAgIHhtMiwgW2FxLTFdLCAwCisgICAgdmluc2VydGkxMjggICAgICAgICAgICAgbTIsIG0yLCB4bTIsIDEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgW2FxXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBsLCBjbnQKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNCwgW3B3X20yNTZdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTUsIFtwd19tMjU1XQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0yLCBtNAorICAgIHB1bnBja2hidyAgICAgICAgICAgICAgIG0xLCBtMCwgbTMKKyAgICBwdW5wY2tsYncgICAgICAgICAgICAgICBtMCwgbTMKKyAgICBwc3VidyAgICAgICAgICAgICAgICAgICBtMSwgbTIKKyAgICBwc3VidyAgICAgICAgICAgICAgICAgICBtMCwgbTIKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250cSwgMTUKKy5sb29wOgorICAgIHBpbnNydyAgICAgICAgICAgICAgICAgeG03LCBbbHErY250cSoyXSwgMAorICAgIHZpbnNlcnRpMTI4ICAgICAgICAgICAgIG03LCBtNywgeG03LCAxCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTMsIG03LCBtNQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG03LCBtNAorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgIG0yLCBtMywgbTAKKyAgICBwYWRkdyAgICAgICAgICAgICAgICAgICBtMywgbTEKKyAgICBwYWRkdyAgICAgICAgICAgICAgICAgICBtNiwgbTcsIG0wCisgICAgcGFkZHcgICAgICAgICAgICAgICAgICAgbTcsIG0xCisgICAgcGFja3Vzd2IgICAgICAgICAgICAgICAgbTIsIG0zCisgICAgcGFja3Vzd2IgICAgICAgICAgICAgICAgbTYsIG03CisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0yCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG02CisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqMl0KKyAgICBkZWMgICAgICAgICAgICAgICAgICAgY250cQorICAgIGpnZSAubG9vcAorICAgIFJFVAorJWVuZGlmCisKKzsgZGwKKworJW1hY3JvIExPV1BBU1MgNCA7IGxlZnQgW2RzdF0sIGNlbnRlciwgcmlnaHQsIHRtcAorICAgIHB4b3IgICAgICAgICAgICAgICAgICAgbSU0LCBtJTEsIG0lMworICAgIHBhbmQgICAgICAgICAgICAgICAgICAgbSU0LCBbcGJfMV0KKyAgICBwYXZnYiAgICAgICAgICAgICAgICAgIG0lMSwgbSUzCisgICAgcHN1YnVzYiAgICAgICAgICAgICAgICBtJTEsIG0lNAorICAgIHBhdmdiICAgICAgICAgICAgICAgICAgbSUxLCBtJTIKKyVlbmRtYWNybworCitJTklUX01NWCBzc3NlMworY2dsb2JhbCB2cDlfaXByZWRfZGxfNHg0LCA0LCA0LCAwLCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdnEgICAgICAgICAgICAgICAgICAgIG0xLCBbYXFdCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTAsIG0xLCBbcGJfMHRvNV8yeDddCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTIsIG0xLCBbcGJfMnRvNl8zeDddCisgICAgcHNybHEgICAgICAgICAgICAgICAgICAgbTEsIDgKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMworCisgICAgcHNodWZ3ICAgICAgICAgICAgICAgICAgbTEsIG0wLCBxMzMyMQorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjJdLCBtMQorICAgIHBzcmxxICAgICAgICAgICAgICAgICAgIG0wLCA4CisgICAgcHNybHEgICAgICAgICAgICAgICAgICAgbTEsIDgKKyAgICBhZGQgICAgICAgICAgICAgICAgICAgZHN0cSwgc3RyaWRlcQorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjJdLCBtMQorICAgIFJFVAorCislbWFjcm8gRExfWE1NX0ZVTkNTIDEKK0lOSVRfWE1NICUxCitjZ2xvYmFsIHZwOV9pcHJlZF9kbF84eDgsIDQsIDQsIDQsIGRzdCwgc3RyaWRlLCBzdHJpZGU1LCBhCisgICAgbW92cSAgICAgICAgICAgICAgICAgICAgbTAsIFthcV0KKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGU1cSwgW3N0cmlkZXEqNV0KKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMSwgbTAsIFtwYl8xdG82XzEweDddCisgICAgcHNybGRxICAgICAgICAgICAgICAgICAgbTIsIG0xLCAxCisgICAgc2h1ZnBzICAgICAgICAgICAgICAgICAgbTAsIG0xLCBxMzIxMAorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAwLCAxLCAyLCAzCisKKyAgICBwc2h1ZmQgICAgICAgICAgICAgICAgICBtMSwgbTAsIHEzMzIxCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0wCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqNF0sIG0xCisgICAgcHNybGRxICAgICAgICAgICAgICAgICAgbTAsIDEKKyAgICBwc3JsZHEgICAgICAgICAgICAgICAgICBtMSwgMQorICAgIG1vdnEgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMAorICAgIG1vdnEgICAgICBbZHN0cStzdHJpZGU1cSBdLCBtMQorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjJdCisgICAgcHNybGRxICAgICAgICAgICAgICAgICAgbTAsIDEKKyAgICBwc3JsZHEgICAgICAgICAgICAgICAgICBtMSwgMQorICAgIG1vdnEgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIG1vdnEgICAgICBbZHN0cStzdHJpZGVxKjRdLCBtMQorICAgIHBzcmxkcSAgICAgICAgICAgICAgICAgIG0wLCAxCisgICAgcHNybGRxICAgICAgICAgICAgICAgICAgbTEsIDEKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTAKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlNXEgXSwgbTEKKyAgICBSRVQKKworSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX2RsXzE2eDE2LCA0LCA0LCA2LCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG01LCBbcGJfMXRvRV8yeEZdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIFthcV0KKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMSwgbTAsIG01CisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTIsIG0xLCBtNQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG00LCBtMCwgW3BiXzE1XQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAwLCAxLCAyLCAzCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIGNudCwgc3RyaWRlOQorICAgIGxlYSAgICAgICAgICAgICAgIHN0cmlkZTlxLCBbc3RyaWRlcSozXQorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRkLCA0CisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlOXEsIFtzdHJpZGU5cSozXQorCisubG9vcDoKKyAgICBtb3ZobHBzICAgICAgICAgICAgICAgICBtNCwgbTAKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTAKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMCwgbTUKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSo4XSwgbTQKKyAgICBtb3ZobHBzICAgICAgICAgICAgICAgICBtNCwgbTAKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTAKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMCwgbTUKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlOXEgXSwgbTQKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSoyXQorICAgIGRlYyAgICAgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AKKyAgICBSRVQKKworSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX2RsXzMyeDMyLCA0LCA1LCA4LCBkc3QsIHN0cmlkZSwgY250LCBhLCBkc3QxNgorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG01LCBbcGJfMXRvRV8yeEZdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIFthcV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMSwgW2FxKzE2XQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0yLCBtMSwgbTAsIDEKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTEsIG0wLCAyCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDAsIDIsIDMsIDQKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMiwgbTEsIG01CisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTMsIG0yLCBtNQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG02LCBtMSwgW3BiXzE1XQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAxLCAyLCAzLCA0CisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTcsIG02CisgICAgbGVhICAgICAgICAgICAgICAgICBkc3QxNnEsIFtkc3RxICArc3RyaWRlcSo4XQorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRkLCA4CisgICAgbGVhICAgICAgICAgICAgICAgICBkc3QxNnEsIFtkc3QxNnErc3RyaWRlcSo4XQorLmxvb3A6CisgICAgbW92aGxwcyAgICAgICAgICAgICAgICAgbTcsIG0xCisgICAgbW92YSBbZHN0cSAgK3N0cmlkZXEqMCsgMF0sIG0wCisgICAgbW92YSBbZHN0cSAgK3N0cmlkZXEqMCsxNl0sIG0xCisgICAgbW92aHBzIFtkc3RxK3N0cmlkZXEqOCsgMF0sIG0wCisgICAgbW92cSBbZHN0cSAgK3N0cmlkZXEqOCsgOF0sIG0xCisgICAgbW92YSBbZHN0cSAgK3N0cmlkZXEqOCsxNl0sIG03CisgICAgbW92YSBbZHN0MTZxK3N0cmlkZXEqMCsgMF0sIG0xCisgICAgbW92YSBbZHN0MTZxK3N0cmlkZXEqMCsxNl0sIG02CisgICAgbW92YSBbZHN0MTZxK3N0cmlkZXEqOCsgMF0sIG03CisgICAgbW92YSBbZHN0MTZxK3N0cmlkZXEqOCsxNl0sIG02CislaWYgY3B1ZmxhZyhhdngpCisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTAsIG0xLCBtMCwgMQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0xLCBtNQorJWVsc2UKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMiwgbTEsIG0wLCAxCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTEsIG01CisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIG0yCislZW5kaWYKKyAgICBhZGQgICAgICAgICAgICAgICAgICAgZHN0cSwgc3RyaWRlcQorICAgIGFkZCAgICAgICAgICAgICAgICAgZHN0MTZxLCBzdHJpZGVxCisgICAgZGVjICAgICAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcAorICAgIFJFVAorJWVuZG1hY3JvCisKK0RMX1hNTV9GVU5DUyBzc3NlMworRExfWE1NX0ZVTkNTIGF2eAorCis7IGRyCisKK0lOSVRfTU1YIHNzc2UzCitjZ2xvYmFsIHZwOV9pcHJlZF9kcl80eDQsIDQsIDQsIDAsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgbTAsIFtscV0KKyAgICBwdW5wY2tsZHEgICAgICAgICAgICAgICBtMCwgW2FxLTFdCisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgbTEsIFthcSszXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzCisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTEsIG0wLCAxCisgICAgcHNybHEgICAgICAgICAgICAgICAgICAgbTIsIG0xLCA4CisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMKKworICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGUzcSBdLCBtMAorICAgIHBzcmxxICAgICAgICAgICAgICAgICAgIG0wLCA4CisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0wCisgICAgcHNybHEgICAgICAgICAgICAgICAgICAgbTAsIDgKKyAgICBtb3ZkICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTAKKyAgICBwc3JscSAgICAgICAgICAgICAgICAgICBtMCwgOAorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIFJFVAorCislbWFjcm8gRFJfWE1NX0ZVTkNTIDEKK0lOSVRfWE1NICUxCitjZ2xvYmFsIHZwOV9pcHJlZF9kcl84eDgsIDQsIDQsIDQsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92cSAgICAgICAgICAgICAgICAgICAgbTEsIFtscV0KKyAgICBtb3ZocHMgICAgICAgICAgICAgICAgICBtMSwgW2FxLTFdCisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgbTIsIFthcSs3XQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzCisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisgICAgcHNsbGRxICAgICAgICAgICAgICAgICAgbTAsIG0xLCAxCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTIsIG0xLCAxCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMKKworICAgIG1vdmhwcyAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIHBzbGxkcSAgICAgICAgICAgICAgICAgIG0wLCAxCisgICAgbW92aHBzICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0wCisgICAgcHNsbGRxICAgICAgICAgICAgICAgICAgbTAsIDEKKyAgICBtb3ZocHMgICAgW2RzdHErc3RyaWRlcSoyXSwgbTAKKyAgICBwc2xsZHEgICAgICAgICAgICAgICAgICBtMCwgMQorICAgIG1vdmhwcyAgICBbZHN0cStzdHJpZGUzcSBdLCBtMAorICAgIHBzbGxkcSAgICAgICAgICAgICAgICAgIG0wLCAxCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBtb3ZocHMgICAgW2RzdHErc3RyaWRlcSowXSwgbTAKKyAgICBwc2xsZHEgICAgICAgICAgICAgICAgICBtMCwgMQorICAgIG1vdmhwcyAgICBbZHN0cStzdHJpZGVxKjFdLCBtMAorICAgIHBzbGxkcSAgICAgICAgICAgICAgICAgIG0wLCAxCisgICAgbW92aHBzICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0wCisgICAgcHNsbGRxICAgICAgICAgICAgICAgICAgbTAsIDEKKyAgICBtb3ZocHMgICAgW2RzdHErc3RyaWRlM3EgXSwgbTAKKyAgICBSRVQKKworSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX2RyXzE2eDE2LCA0LCA0LCA2LCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0xLCBbbHFdCisgICAgbW92dSAgICAgICAgICAgICAgICAgICAgbTIsIFthcS0xXQorICAgIG1vdmQgICAgICAgICAgICAgICAgICAgIG00LCBbYXErMTVdCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIHN0cmlkZTksIGNudAorICAgIGxlYSAgICAgICAgICAgICAgIHN0cmlkZTlxLCBbc3RyaWRlcSAqM10KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250ZCwgNAorICAgIGxlYSAgICAgICAgICAgICAgIHN0cmlkZTlxLCBbc3RyaWRlOXEqM10KKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtNCwgbTIsIDEKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTIsIG0xLCAxNQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAzLCAgMiwgNCwgNQorICAgIHBzbGxkcSAgICAgICAgICAgICAgICAgIG0wLCBtMSwgMQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0yLCBtMSwgMQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAwLCAgMSwgMiwgNAorCisubG9vcDoKKyAgICBtb3ZhICAgIFtkc3RxK3N0cmlkZXEqMCAgXSwgbTMKKyAgICBtb3ZocHMgIFtkc3RxK3N0cmlkZXEqOCswXSwgbTAKKyAgICBtb3ZxICAgIFtkc3RxK3N0cmlkZXEqOCs4XSwgbTMKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTAsIDE1CisgICAgcHNsbGRxICAgICAgICAgICAgICAgICAgbTAsIDEKKyAgICBtb3ZhICAgIFtkc3RxK3N0cmlkZXEqMSAgXSwgbTMKKyAgICBtb3ZocHMgIFtkc3RxK3N0cmlkZTlxICswXSwgbTAKKyAgICBtb3ZxICAgIFtkc3RxK3N0cmlkZTlxICs4XSwgbTMKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTAsIDE1CisgICAgcHNsbGRxICAgICAgICAgICAgICAgICAgbTAsIDEKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSoyXQorICAgIGRlYyAgICAgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AKKyAgICBSRVQKKworSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX2RyXzMyeDMyLCA0LCA0LCA4LCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0xLCBbbHFdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTIsIFtscSsxNl0KKyAgICBtb3Z1ICAgICAgICAgICAgICAgICAgICBtMywgW2FxLTFdCisgICAgbW92dSAgICAgICAgICAgICAgICAgICAgbTQsIFthcSsxNV0KKyAgICBtb3ZkICAgICAgICAgICAgICAgICAgICBtNSwgW2FxKzMxXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGU4LCBjbnQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGU4cSwgW3N0cmlkZXEqOF0KKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtNSwgbTQsIDEKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtNiwgbTQsIG0zLCAxNQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICA1LCAgNCwgIDYsICA3CisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTQsIG0zLCAxCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTYsIG0zLCBtMiwgMTUKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgNCwgIDMsICA2LCAgNworICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0zLCBtMiwgMQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG02LCBtMiwgbTEsIDE1CisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDMsICAyLCAgNiwgIDcKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMiwgbTEsIDEKKyAgICBwc2xsZHEgICAgICAgICAgICAgICAgICBtMCwgbTEsIDEKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgMiwgIDEsICAwLCAgNgorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRkLCAxNgorCisgICAgOyBvdXQ9bTIvbTMvbTQvbTUKKy5sb29wOgorICAgIG1vdmEgIFtkc3RxK3N0cmlkZThxKjArIDBdLCBtNAorICAgIG1vdmEgIFtkc3RxK3N0cmlkZThxKjArMTZdLCBtNQorICAgIG1vdmEgIFtkc3RxK3N0cmlkZThxKjIrIDBdLCBtMworICAgIG1vdmEgIFtkc3RxK3N0cmlkZThxKjIrMTZdLCBtNAorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG01LCBtNCwgMTUKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtNCwgbTMsIDE1CisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTMsIG0yLCAxNQorICAgIHBzbGxkcSAgICAgICAgICAgICAgICAgIG0yLCAxCisgICAgYWRkICAgICAgICAgICAgICAgICAgIGRzdHEsIHN0cmlkZXEKKyAgICBkZWMgICAgICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wCisgICAgUkVUCislZW5kbWFjcm8KKworRFJfWE1NX0ZVTkNTIHNzc2UzCitEUl9YTU1fRlVOQ1MgYXZ4CisKKzsgdmwKKworSU5JVF9NTVggc3NzZTMKK2NnbG9iYWwgdnA5X2lwcmVkX3ZsXzR4NCwgNCwgNCwgMCwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBtb3ZxICAgICAgICAgICAgICAgICAgICBtMCwgW2FxXQorICAgIHBzcmxxICAgICAgICAgICAgICAgICAgIG0xLCBtMCwgOAorICAgIHBzcmxxICAgICAgICAgICAgICAgICAgIG0yLCBtMSwgOAorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAyLCAgMSwgMCwgMworICAgIHBhdmdiICAgICAgICAgICAgICAgICAgIG0xLCBtMAorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMQorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMgorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjJdCisgICAgcHNybHEgICAgICAgICAgICAgICAgICAgbTEsIDgKKyAgICBwc3JscSAgICAgICAgICAgICAgICAgICBtMiwgOAorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMQorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMgorICAgIFJFVAorCislbWFjcm8gVkxfWE1NX0ZVTkNTIDEKK0lOSVRfWE1NICUxCitjZ2xvYmFsIHZwOV9pcHJlZF92bF84eDgsIDQsIDQsIDQsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92cSAgICAgICAgICAgICAgICAgICAgbTAsIFthcV0KKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMCwgW3BiXzB0bzZfOXg3XQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzCisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisgICAgcHNybGRxICAgICAgICAgICAgICAgICAgbTEsIG0wLCAxCisgICAgcHNybGRxICAgICAgICAgICAgICAgICAgbTIsIG0wLCAyCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDIsICAxLCAgMCwgIDMKKyAgICBwYXZnYiAgICAgICAgICAgICAgICAgICBtMSwgbTAKKworICAgIG1vdnEgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMQorICAgIG1vdnEgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMgorICAgIHBzcmxkcSAgICAgICAgICAgICAgICAgIG0xLCAxCisgICAgcHNybGRxICAgICAgICAgICAgICAgICAgbTIsIDEKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSoyXSwgbTEKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlM3EgXSwgbTIKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSo0XQorICAgIHBzcmxkcSAgICAgICAgICAgICAgICAgIG0xLCAxCisgICAgcHNybGRxICAgICAgICAgICAgICAgICAgbTIsIDEKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTEKKyAgICBtb3ZxICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTIKKyAgICBwc3JsZHEgICAgICAgICAgICAgICAgICBtMSwgMQorICAgIHBzcmxkcSAgICAgICAgICAgICAgICAgIG0yLCAxCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0xCisgICAgbW92cSAgICAgIFtkc3RxK3N0cmlkZTNxIF0sIG0yCisgICAgUkVUCisKK0lOSVRfWE1NICUxCitjZ2xvYmFsIHZwOV9pcHJlZF92bF8xNngxNiwgNCwgNCwgNSwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgW2FxXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG00LCBbcGJfMXRvRV8yeEZdCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIHN0cmlkZTMsIGNudAorICAgIGxlYSAgICAgICAgICAgICAgIHN0cmlkZTNxLCBbc3RyaWRlcSozXQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0xLCBtMCwgbTQKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMiwgbTEsIG00CisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDIsICAxLCAgMCwgMworICAgIHBhdmdiICAgICAgICAgICAgICAgICAgIG0xLCBtMAorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRkLCA0CisubG9vcDoKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSowXSwgbTEKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTIKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMSwgbTQKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMiwgbTQKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoyXSwgbTEKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlM3EgXSwgbTIKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMSwgbTQKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMiwgbTQKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSo0XQorICAgIGRlYyAgICAgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AKKyAgICBSRVQKKworSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX3ZsXzMyeDMyLCA0LCA0LCA3LCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbYXFdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTUsIFthcSsxNl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNCwgW3BiXzF0b0VfMnhGXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBkc3QxNiwgY250CisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTIsIG01LCBtMCwgMQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0zLCBtNSwgbTAsIDIKKyAgICBsZWEgICAgICAgICAgICAgICAgIGRzdDE2cSwgW2RzdHEgICtzdHJpZGVxKjhdCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDMsICAyLCAgMCwgNgorICAgIHBhdmdiICAgICAgICAgICAgICAgICAgIG0yLCBtMAorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0wLCBtNSwgbTQKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMSwgbTAsIG00CisgICAgbGVhICAgICAgICAgICAgICAgICBkc3QxNnEsIFtkc3QxNnErc3RyaWRlcSo4XQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAxLCAgMCwgIDUsIDYKKyAgICBwYXZnYiAgICAgICAgICAgICAgICAgICBtMCwgbTUKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtNSwgW3BiXzE1XQorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRkLCA4CisKKy5sb29wOgorJW1hY3JvICUld3JpdGUgMworICAgIG1vdmEgICAgW2RzdHErc3RyaWRlJTErIDBdLCAlMgorICAgIG1vdmEgICAgW2RzdHErc3RyaWRlJTErMTZdLCAlMworICAgIG1vdmhwcyAgW2RzdDE2cStzdHJpZGUlMSBdLCAlMgorICAgIG1vdnUgIFtkc3QxNnErc3RyaWRlJTErIDhdLCAlMworICAgIG1vdnEgIFtkc3QxNnErc3RyaWRlJTErMjRdLCBtNQorJWlmIGNwdWZsYWcoYXZ4KQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgICUyLCAlMywgJTIsIDEKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICAlMywgbTQKKyVlbHNlCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTYsICUzLCAlMiwgMQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgICUzLCBtNAorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgICUyLCBtNgorJWVuZGlmCislZW5kbWFjcm8KKworICAgICUld3JpdGUgICAgICAgICAgICAgICAgcSowLCBtMiwgbTAKKyAgICAlJXdyaXRlICAgICAgICAgICAgICAgIHEqMSwgbTMsIG0xCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxICArc3RyaWRlcSoyXQorICAgIGxlYSAgICAgICAgICAgICAgICAgZHN0MTZxLCBbZHN0MTZxK3N0cmlkZXEqMl0KKyAgICBkZWMgICAgICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wCisgICAgUkVUCislZW5kbWFjcm8KKworVkxfWE1NX0ZVTkNTIHNzc2UzCitWTF9YTU1fRlVOQ1MgYXZ4CisKKzsgdnIKKworSU5JVF9NTVggc3NzZTMKK2NnbG9iYWwgdnA5X2lwcmVkX3ZyXzR4NCwgNCwgNCwgMCwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBtb3ZxICAgICAgICAgICAgICAgICAgICBtMSwgW2FxLTFdCisgICAgcHVucGNrbGRxICAgICAgICAgICAgICAgbTIsIFtscV0KKyAgICBtb3ZkICAgICAgICAgICAgICAgICAgICBtMCwgW2FxXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzCisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisgICAgcGF2Z2IgICAgICAgICAgICAgICAgICAgbTAsIG0xCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTEsIG0yLCA1CisgICAgcHNybHEgICAgICAgICAgICAgICAgICAgbTIsIG0xLCA4CisgICAgcHNsbHEgICAgICAgICAgICAgICAgICAgbTMsIG0xLCA4CisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDIsICAxLCAzLCA0CisKKyAgICA7IEFCQ0QgPC0gZm9yIHRoZSBmb2xsb3dpbmcgcHJlZGljdG9yOgorICAgIDsgRUZHSAorICAgIDsgSUFCQyAgfCBtMCBjb250YWlucyBBQkNEeHh4eAorICAgIDsgSkVGRyAgfCBtMiBjb250YWlucyB4SklFRkdIeAorCisgICAgcHVucGNrbGRxICAgICAgICAgICAgICAgbTAsIG0yCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTIsIFtwYl8xMzQ1Nl8zeG0xXQorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0wLCBbcGJfNjAxMl80eG0xXQorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGUzcSBdLCBtMgorICAgIHBzcmxxICAgICAgICAgICAgICAgICAgIG0yLCA4CisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0wCisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0yCisgICAgUkVUCisKKyVtYWNybyBWUl9YTU1fRlVOQ1MgMQorSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX3ZyXzh4OCwgNCwgNCwgNSwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBtb3Z1ICAgICAgICAgICAgICAgICAgICBtMSwgW2FxLTFdCisgICAgbW92aHBzICAgICAgICAgICAgICAgICAgbTIsIFtscV0KKyAgICBtb3ZxICAgICAgICAgICAgICAgICAgICBtMCwgW2FxXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzCisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisgICAgcGF2Z2IgICAgICAgICAgICAgICAgICAgbTAsIG0xCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTEsIG0yLCA5CisgICAgcHNsbGRxICAgICAgICAgICAgICAgICAgbTIsIG0xLCAxCisgICAgcHNsbGRxICAgICAgICAgICAgICAgICAgbTMsIG0xLCAyCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDEsICAyLCAzLCA0CisKKyAgICA7IEFCQ0RFRkdIIDwtIGZvciB0aGUgZm9sbG93aW5nIHByZWRpY3RvcjoKKyAgICA7IElKS0xNTk9QCisgICAgOyBRQUJDREVGRyAgfCBtMCBjb250YWlucyBBQkNERUZHSHh4eHh4eHh4CisgICAgOyBSSUpLTE1OTyAgfCBtMSBjb250YWlucyB4eFZVVFNSUUlKS0xNTk9QCisgICAgOyBTUUFCQ0RFRgorICAgIDsgVFJJSktMTU4KKyAgICA7IFVTUUFCQ0RFCisgICAgOyBWVFJJSktMTQorCisgICAgcHVucGNrbHFkcSAgICAgICAgICAgICAgbTAsIG0xIDsgQUJDREVGR0h4eFZVVFNSUQorICAgIG1vdnEgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0wLCBbcGJfNnhtMV9CREZfMHRvNl0gOyB4eHh4eHhVU1FBQkNERUZHCisgICAgbW92aHBzICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0xCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTEsIFtwYl82eG0xXzI0Nl84dG9FXSA7IHh4eHh4eFZUUklKS0xNTk8KKyAgICBtb3ZocHMgICAgW2RzdHErc3RyaWRlcSoyXSwgbTAKKyAgICBwc2xsZHEgICAgICAgICAgICAgICAgICBtMCwgMQorICAgIG1vdmhwcyAgICBbZHN0cStzdHJpZGUzcSBdLCBtMQorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjRdCisgICAgcHNsbGRxICAgICAgICAgICAgICAgICAgbTEsIDEKKyAgICBtb3ZocHMgICAgW2RzdHErc3RyaWRlcSowXSwgbTAKKyAgICBwc2xsZHEgICAgICAgICAgICAgICAgICBtMCwgMQorICAgIG1vdmhwcyAgICBbZHN0cStzdHJpZGVxKjFdLCBtMQorICAgIHBzbGxkcSAgICAgICAgICAgICAgICAgIG0xLCAxCisgICAgbW92aHBzICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0wCisgICAgbW92aHBzICAgIFtkc3RxK3N0cmlkZTNxIF0sIG0xCisgICAgUkVUCisKK0lOSVRfWE1NICUxCitjZ2xvYmFsIHZwOV9pcHJlZF92cl8xNngxNiwgNCwgNCwgNiwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgW2FxXQorICAgIG1vdnUgICAgICAgICAgICAgICAgICAgIG0xLCBbYXEtMV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMiwgW2xxXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzLCBjbnQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTEsIG0yLCAxNQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAzLCAgMSwgIDAsICA0CisgICAgcGF2Z2IgICAgICAgICAgICAgICAgICAgbTAsIG0xCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTEsIG0yLCAgMQorICAgIHBzbGxkcSAgICAgICAgICAgICAgICAgIG00LCBtMiwgIDEKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgMSwgIDIsICA0LCAgNQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0xLCBbcGJfMDI0NjhBQ0VfMTM1NzlCREZdCisgICAgbW92ICAgICAgICAgICAgICAgICAgIGNudGQsIDQKKworLmxvb3A6CisgICAgbW92bGhwcyAgICAgICAgICAgICAgICAgbTIsIG0xCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0wCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0zCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTQsIG0wLCBtMSwgMTUKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtNSwgbTMsIG0yLCAxNQorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjJdLCBtNAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGUzcSBdLCBtNQorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjRdCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTAsIG0xLCAxNAorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0zLCBtMiwgMTQKKyAgICBwc2xsZHEgICAgICAgICAgICAgICAgICBtMSwgMgorICAgIGRlYyAgICAgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AKKyAgICBSRVQKKworJWlmIEFSQ0hfWDg2XzY0CitJTklUX1hNTSAlMQorY2dsb2JhbCB2cDlfaXByZWRfdnJfMzJ4MzIsIDQsIDQsIDksIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIFthcV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMiwgW2FxKzE2XQorICAgIG1vdnUgICAgICAgICAgICAgICAgICAgIG0xLCBbYXEtMV0KKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTIsIG0wLCAxNQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG00LCBtMiwgbTAsIDE0CisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDQsICAzLCAgMiwgIDUKKyAgICBwYXZnYiAgICAgICAgICAgICAgICAgICBtMywgbTIKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMiwgW2xxKzE2XQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG01LCBtMSwgbTIsIDE1CisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDUsICAxLCAgMCwgIDYKKyAgICBwYXZnYiAgICAgICAgICAgICAgICAgICBtMCwgbTEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNiwgW2xxXQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0xLCBtMiwgIDEKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtNywgbTIsIG02LCAxNQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAxLCAgMiwgIDcsICA4CisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTIsIG02LCAgMQorICAgIHBzbGxkcSAgICAgICAgICAgICAgICAgIG03LCBtNiwgIDEKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgMiwgIDYsICA3LCAgOAorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0xLCBbcGJfMDI0NjhBQ0VfMTM1NzlCREZdCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTIsIFtwYl8wMjQ2OEFDRV8xMzU3OUJERl0KKyAgICBERUZJTkVfQVJHUyBkc3QsIHN0cmlkZSwgZHN0MTYsIGNudAorICAgIGxlYSAgICAgICAgICAgICAgICAgZHN0MTZxLCBbZHN0cSAgK3N0cmlkZXEqOF0KKyAgICBsZWEgICAgICAgICAgICAgICAgIGRzdDE2cSwgW2RzdDE2cStzdHJpZGVxKjhdCisgICAgU0JVVFRFUkZMWSAgICAgICAgICAgICBxZHEsICAyLCAgMSwgIDYKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250ZCwgOAorCisubG9vcDoKKyAgICA7IGV2ZW4gbGluZXMgKDAsIDIsIDQsIC4uLik6IG0xIHwgbTAsIG0zCisgICAgOyAgb2RkIGxpbmVzICgxLCAzLCA1LCAuLi4pOiBtMiB8IG01LCBtNAorJW1hY3JvICUld3JpdGUgNAorICAgIG1vdmEgICAgW2RzdHErc3RyaWRlJTErIDBdLCAlMworICAgIG1vdmEgICAgW2RzdHErc3RyaWRlJTErMTZdLCAlNAorICAgIG1vdmhwcyAgW2RzdDE2cStzdHJpZGUlMSBdLCAlMgorICAgIG1vdnUgIFtkc3QxNnErc3RyaWRlJTErIDhdLCAlMworICAgIG1vdnEgIFtkc3QxNnErc3RyaWRlJTErMjRdLCAlNAorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgICU0LCAlMywgMTUKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICAlMywgJTIsIDE1CisgICAgcHNsbGRxICAgICAgICAgICAgICAgICAgJTIsICAxCislZW5kbWFjcm8KKworICAgICUld3JpdGUgICAgICAgICAgICAgICAgcSowLCBtMSwgbTAsIG0zCisgICAgJSV3cml0ZSAgICAgICAgICAgICAgICBxKjEsIG0yLCBtNSwgbTQKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHEgICtzdHJpZGVxKjJdCisgICAgbGVhICAgICAgICAgICAgICAgICBkc3QxNnEsIFtkc3QxNnErc3RyaWRlcSoyXQorICAgIGRlYyAgICAgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AKKyAgICBSRVQKKyVlbmRpZgorJWVuZG1hY3JvCisKK1ZSX1hNTV9GVU5DUyBzc3NlMworVlJfWE1NX0ZVTkNTIGF2eAorCis7IGhkCisKK0lOSVRfTU1YIHNzc2UzCitjZ2xvYmFsIHZwOV9pcHJlZF9oZF80eDQsIDQsIDQsIDAsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgbTAsIFtscV0KKyAgICBwdW5wY2tsZHEgICAgICAgICAgICAgICBtMCwgW2FxLTFdCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIHN0cmlkZTMKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBwc3JscSAgICAgICAgICAgICAgICAgICBtMSwgbTAsIDgKKyAgICBwc3JscSAgICAgICAgICAgICAgICAgICBtMiwgbTEsIDgKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgMiwgIDEsIDAsICAzCisgICAgcGF2Z2IgICAgICAgICAgICAgICAgICAgbTEsIG0wCisKKyAgICA7IERISUogPC0gZm9yIHRoZSBmb2xsb3dpbmcgcHJlZGljdG9yOgorICAgIDsgQ0dESAorICAgIDsgQkZDRyAgfCBtMSBjb250YWlucyBBQkNEeHh4eAorICAgIDsgQUVCRiAgfCBtMiBjb250YWlucyBFRkdISUp4eAorCisgICAgcHVucGNrbGJ3ICAgICAgICAgICAgICAgbTEsIG0yCisgICAgcHVucGNraGRxICAgICAgICAgICAgICAgbTAsIG0xLCBtMgorCisgICAgOyBtMSBjb250YWlucyBBRUJGQ0dESAorICAgIDsgbTAgY29udGFpbnMgQ0dESElKeHgKKworICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGUzcSBdLCBtMQorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMAorICAgIHBzcmxxICAgICAgICAgICAgICAgICAgIG0xLCAxNgorICAgIHBzcmxxICAgICAgICAgICAgICAgICAgIG0wLCAxNgorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjJdLCBtMQorICAgIG1vdmQgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIFJFVAorCislbWFjcm8gSERfWE1NX0ZVTkNTIDEKK0lOSVRfWE1NICUxCitjZ2xvYmFsIHZwOV9pcHJlZF9oZF84eDgsIDQsIDQsIDQsIGRzdCwgc3RyaWRlLCBsLCBhCisgICAgbW92cSAgICAgICAgICAgICAgICAgICAgbTAsIFtscV0KKyAgICBtb3ZocHMgICAgICAgICAgICAgICAgICBtMCwgW2FxLTFdCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIHN0cmlkZTMsIGRzdDQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBsZWEgICAgICAgICAgICAgICAgICBkc3Q0cSwgW2RzdHErc3RyaWRlcSo0XQorICAgIHBzcmxkcSAgICAgICAgICAgICAgICAgIG0xLCBtMCwgMQorICAgIHBzcmxkcSAgICAgICAgICAgICAgICAgIG0yLCBtMSwgMQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAyLCAgMSwgIDAsICAzCisgICAgcGF2Z2IgICAgICAgICAgICAgICAgICAgbTEsIG0wCisKKyAgICA7IEhQUVJTVFVWIDwtIGZvciB0aGUgZm9sbG93aW5nIHByZWRpY3RvcgorICAgIDsgR09IUFFSU1QKKyAgICA7IEZOR09IUFFSICB8IG0xIGNvbnRhaW5zIEFCQ0RFRkdIeHh4eHh4eHgKKyAgICA7IEVNRk5HT0hQICB8IG0yIGNvbnRhaW5zIElKS0xNTk9QUVJTVFVWeHgKKyAgICA7IERMRU1GTkdPCisgICAgOyBDS0RMRU1GTgorICAgIDsgQkpDS0RMRU0KKyAgICA7IEFJQkpDS0RMCisKKyAgICBwdW5wY2tsYncgICAgICAgICAgICAgICBtMSwgbTIKKyAgICBtb3ZobHBzICAgICAgICAgICAgICAgICBtMiwgbTIKKworICAgIDsgbTEgY29udGFpbnMgQUlCSkNLRExFTUZOR09IUAorICAgIDsgbTIgY29udGFpbnMgUVJTVFVWeHh4eHh4eHh4eAorCisgICAgbW92aHBzICAgW2RzdHEgK3N0cmlkZTNxIF0sIG0xCisgICAgbW92cSAgICAgW2RzdDRxK3N0cmlkZTNxIF0sIG0xCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTMsIG0yLCBtMSwgMgorICAgIG1vdmhwcyAgIFtkc3RxICtzdHJpZGVxKjJdLCBtMworICAgIG1vdnEgICAgIFtkc3Q0cStzdHJpZGVxKjJdLCBtMworICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0zLCBtMiwgbTEsIDQKKyAgICBtb3ZocHMgICBbZHN0cSArc3RyaWRlcSoxXSwgbTMKKyAgICBtb3ZxICAgICBbZHN0NHErc3RyaWRlcSoxXSwgbTMKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMiwgbTEsIDYKKyAgICBtb3ZocHMgICBbZHN0cSArc3RyaWRlcSowXSwgbTIKKyAgICBtb3ZxICAgICBbZHN0NHErc3RyaWRlcSowXSwgbTIKKyAgICBSRVQKKworSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX2hkXzE2eDE2LCA0LCA2LCA3LCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbbHFdCisgICAgbW92dSAgICAgICAgICAgICAgICAgICAgbTMsIFthcS0xXQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGU0LCBkc3Q0LCBkc3Q4LCBkc3QxMgorICAgIGxlYSAgICAgICAgICAgICAgIHN0cmlkZTRxLCBbc3RyaWRlcSo0XQorICAgIGxlYSAgICAgICAgICAgICAgICAgIGRzdDRxLCBbZHN0cSArc3RyaWRlNHFdCisgICAgbGVhICAgICAgICAgICAgICAgICAgZHN0OHEsIFtkc3Q0cStzdHJpZGU0cV0KKyAgICBsZWEgICAgICAgICAgICAgICAgIGRzdDEycSwgW2RzdDhxK3N0cmlkZTRxXQorICAgIHBzcmxkcSAgICAgICAgICAgICAgICAgIG00LCBtMywgIDEKKyAgICBwc3JsZHEgICAgICAgICAgICAgICAgICBtNSwgbTMsICAyCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDUsICA0LCAgMywgIDYKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMSwgbTMsIG0wLCAgMQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0yLCBtMywgbTAsICAyCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDIsICAxLCAgMCwgIDYKKyAgICBwYXZnYiAgICAgICAgICAgICAgICAgICBtMSwgbTAKKyAgICBTQlVUVEVSRkxZICAgICAgICAgICAgICBidywgIDEsICAyLCAgNgorCisgICAgOyBJIFBST0JBQkxZIElOVkVSVEVEIEwwIGFkIEwxNiBoZXJlCisgICAgOyBtMSwgbTIsIG01CisubG9vcDoKKyAgICBzdWIgICAgICAgICAgICAgICBzdHJpZGU0cSwgc3RyaWRlcQorICAgIG1vdmhwcyBbZHN0cSArc3RyaWRlNHEgKzBdLCBtMgorICAgIG1vdnEgICBbZHN0cSArc3RyaWRlNHEgKzhdLCBtNQorICAgIG1vdmEgICBbZHN0NHErc3RyaWRlNHEgICBdLCBtMgorICAgIG1vdmhwcyBbZHN0OHErc3RyaWRlNHEgKzBdLCBtMQorICAgIG1vdnEgICBbZHN0OHErc3RyaWRlNHEgKzhdLCBtMgorICAgIG1vdmEgIFtkc3QxMnErc3RyaWRlNHEgICBdLCBtMQorJWlmIGNwdWZsYWcoYXZ4KQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0xLCBtMiwgbTEsIDIKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMiwgbTUsIG0yLCAyCislZWxzZQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0zLCBtMiwgbTEsIDIKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMCwgbTUsIG0yLCAyCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTEsIG0zCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTIsIG0wCislZW5kaWYKKyAgICBwc3JsZHEgICAgICAgICAgICAgICAgICBtNSwgMgorICAgIGpnIC5sb29wCisgICAgUkVUCisKK0lOSVRfWE1NICUxCitjZ2xvYmFsIHZwOV9pcHJlZF9oZF8zMngzMiwgNCwgNiwgOCwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgW2xxXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0xLCBbbHErMTZdCisgICAgbW92dSAgICAgICAgICAgICAgICAgICAgbTIsIFthcS0xXQorICAgIG1vdnUgICAgICAgICAgICAgICAgICAgIG0zLCBbYXErMTVdCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIHN0cmlkZTgsIGRzdDgsIGRzdDE2LCBkc3QyNAorICAgIGxlYSAgICAgICAgICAgICAgIHN0cmlkZThxLCBbc3RyaWRlcSo4XQorICAgIGxlYSAgICAgICAgICAgICAgICAgIGRzdDhxLCBbZHN0cSAgK3N0cmlkZThxXQorICAgIGxlYSAgICAgICAgICAgICAgICAgZHN0MTZxLCBbZHN0OHEgK3N0cmlkZThxXQorICAgIGxlYSAgICAgICAgICAgICAgICAgZHN0MjRxLCBbZHN0MTZxK3N0cmlkZThxXQorICAgIHBzcmxkcSAgICAgICAgICAgICAgICAgIG00LCBtMywgIDEKKyAgICBwc3JsZHEgICAgICAgICAgICAgICAgICBtNSwgbTMsICAyCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDUsICA0LCAgMywgIDYKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtNCwgbTMsIG0yLCAgMgorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0zLCBtMiwgIDEKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgNCwgIDMsICAyLCAgNgorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0zLCBtMiwgbTEsICAyCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTIsIG0xLCAgMQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAzLCAgMiwgIDEsICA2CisgICAgcGF2Z2IgICAgICAgICAgICAgICAgICAgbTIsIG0xCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTYsIG0xLCBtMCwgIDEKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMSwgbTAsICAyCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDEsICA2LCAgMCwgIDcKKyAgICBwYXZnYiAgICAgICAgICAgICAgICAgICBtMCwgbTYKKyAgICBTQlVUVEVSRkxZICAgICAgICAgICAgICBidywgIDIsICAzLCAgNgorICAgIFNCVVRURVJGTFkgICAgICAgICAgICAgIGJ3LCAgMCwgIDEsICA2CisKKyAgICA7IG0wLCBtMSwgbTIsIG0zLCBtNCwgbTUKKy5sb29wOgorICAgIHN1YiAgICAgICAgICAgICAgIHN0cmlkZThxLCBzdHJpZGVxCisgICAgbW92YSAgW2RzdHEgICtzdHJpZGU4cSsgMF0sIG0zCisgICAgbW92YSAgW2RzdHEgICtzdHJpZGU4cSsxNl0sIG00CisgICAgbW92YSAgW2RzdDhxICtzdHJpZGU4cSsgMF0sIG0yCisgICAgbW92YSAgW2RzdDhxICtzdHJpZGU4cSsxNl0sIG0zCisgICAgbW92YSAgW2RzdDE2cStzdHJpZGU4cSsgMF0sIG0xCisgICAgbW92YSAgW2RzdDE2cStzdHJpZGU4cSsxNl0sIG0yCisgICAgbW92YSAgW2RzdDI0cStzdHJpZGU4cSsgMF0sIG0wCisgICAgbW92YSAgW2RzdDI0cStzdHJpZGU4cSsxNl0sIG0xCislaWYgY3B1ZmxhZyhhdngpCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTAsIG0xLCBtMCwgMgorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0xLCBtMiwgbTEsIDIKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMiwgbTMsIG0yLCAyCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTMsIG00LCBtMywgMgorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG00LCBtNSwgbTQsIDIKKyAgICBwc3JsZHEgICAgICAgICAgICAgICAgICBtNSwgMgorJWVsc2UKKyAgICBwc3JsZHEgICAgICAgICAgICAgICAgICBtNiwgbTUsIDIKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtNSwgbTQsIDIKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtNCwgbTMsIDIKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTIsIDIKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMiwgbTEsIDIKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMSwgbTAsIDIKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgbTEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMSwgbTIKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMiwgbTMKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMywgbTQKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNCwgbTUKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNSwgbTYKKyVlbmRpZgorICAgIGpnIC5sb29wCisgICAgUkVUCislZW5kbWFjcm8KKworSERfWE1NX0ZVTkNTIHNzc2UzCitIRF9YTU1fRlVOQ1MgYXZ4CisKK0lOSVRfTU1YIHNzc2UzCitjZ2xvYmFsIHZwOV9pcHJlZF9odV80eDQsIDMsIDMsIDAsIGRzdCwgc3RyaWRlLCBsCisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgbTAsIFtscV0KKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMCwgW3BiXzN0bzFfNXgwXQorICAgIHBzcmxxICAgICAgICAgICAgICAgICAgIG0xLCBtMCwgOAorICAgIHBzcmxxICAgICAgICAgICAgICAgICAgIG0yLCBtMSwgOAorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAyLCAgMSwgMCwgMworICAgIHBhdmdiICAgICAgICAgICAgICAgICAgIG0xLCBtMAorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzCisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisgICAgU0JVVFRFUkZMWSAgICAgICAgICAgICAgYncsICAxLCAyLCAwCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTIsIG0xLCAyCisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0xCisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0yCisgICAgcHVucGNraGRxICAgICAgICAgICAgICAgbTEsIG0xCisgICAgcHVucGNraGRxICAgICAgICAgICAgICAgbTIsIG0yCisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG0xCisgICAgbW92ZCAgICAgIFtkc3RxK3N0cmlkZTNxIF0sIG0yCisgICAgUkVUCisKKyVtYWNybyBIVV9YTU1fRlVOQ1MgMQorSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX2h1Xzh4OCwgMywgNCwgNCwgZHN0LCBzdHJpZGUsIGwKKyAgICBtb3ZxICAgICAgICAgICAgICAgICAgICBtMCwgW2xxXQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0wLCBbcGJfN3RvMV85eDBdCisgICAgcHNybGRxICAgICAgICAgICAgICAgICAgbTEsIG0wLCAxCisgICAgcHNybGRxICAgICAgICAgICAgICAgICAgbTIsIG0xLCAxCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDIsICAxLCAwLCAzCisgICAgcGF2Z2IgICAgICAgICAgICAgICAgICAgbTEsIG0wCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIHN0cmlkZTMsIGRzdDQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBsZWEgICAgICAgICAgICAgICAgICBkc3Q0cSwgW2RzdHErc3RyaWRlcSo0XQorICAgIFNCVVRURVJGTFkgICAgICAgICAgICAgIGJ3LCAgMSwgMiwgMAorICAgIG1vdnEgICAgIFtkc3RxICtzdHJpZGVxKjBdLCBtMQorICAgIG1vdmhwcyAgIFtkc3Q0cStzdHJpZGVxKjBdLCBtMQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0wLCBtMiwgbTEsIDIKKyAgICBtb3ZxICAgICBbZHN0cSArc3RyaWRlcSoxXSwgbTAKKyAgICBtb3ZocHMgICBbZHN0NHErc3RyaWRlcSoxXSwgbTAKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMCwgbTIsIG0xLCA0CisgICAgbW92cSAgICAgW2RzdHEgK3N0cmlkZXEqMl0sIG0wCisgICAgbW92aHBzICAgW2RzdDRxK3N0cmlkZXEqMl0sIG0wCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTIsIG0xLCA2CisgICAgbW92cSAgICAgW2RzdHEgK3N0cmlkZTNxIF0sIG0yCisgICAgbW92aHBzICAgW2RzdDRxK3N0cmlkZTNxIF0sIG0yCisgICAgUkVUCisKK0lOSVRfWE1NICUxCitjZ2xvYmFsIHZwOV9pcHJlZF9odV8xNngxNiwgMywgNCwgNSwgZHN0LCBzdHJpZGUsIGwKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgW2xxXQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0wLCBbcGJfRnRvMF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMywgW3BiXzJ0b0VfM3hGXQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0xLCBtMCwgW3BiXzF0b0VfMnhGXQorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0yLCBtMCwgbTMKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgMiwgIDEsICAwLCAgNAorICAgIHBhdmdiICAgICAgICAgICAgICAgICAgIG0xLCBtMAorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGU5LCBjbnQKKyAgICBsZWEgICAgICAgICAgICAgICAgc3RyaWRlOXEsIFtzdHJpZGVxICozXQorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRkLCAgNAorICAgIGxlYSAgICAgICAgICAgICAgICBzdHJpZGU5cSwgW3N0cmlkZTlxKjNdCisgICAgU0JVVFRFUkZMWSAgICAgICAgICAgICAgYncsICAxLCAgMiwgIDAKKworLmxvb3A6CisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG0xCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqOF0sIG0yCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTAsIG0yLCBtMSwgMgorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0yLCBtMworICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjFdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGU5cSBdLCBtMgorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0xLCBtMiwgbTAsIDIKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMiwgbTMKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSoyXQorICAgIGRlYyAgICAgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AKKyAgICBSRVQKKworSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lwcmVkX2h1XzMyeDMyLCAzLCA3LCA3LCBkc3QsIHN0cmlkZSwgbAorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbbHFdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTEsIFtscSsxNl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMiwgW3BiX0Z0bzBdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTQsIFtwYl8ydG9FXzN4Rl0KKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMCwgbTIKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMSwgbTIKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMiwgbTAsIG0xLCAgMQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0zLCBtMCwgbTEsICAyCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDMsICAyLCAgMSwgIDUKKyAgICBwYXZnYiAgICAgICAgICAgICAgICAgICBtMiwgbTEKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtMSwgbTAsIG00CisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTUsIG0wLCBbcGJfMXRvRV8yeEZdCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDEsICA1LCAgMCwgIDYKKyAgICBwYXZnYiAgICAgICAgICAgICAgICAgICBtMCwgbTUKKyAgICBERUZJTkVfQVJHUyBkc3QsIHN0cmlkZSwgY250LCBzdHJpZGUwLCBkc3Q4LCBkc3QxNiwgZHN0MjQKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250ZCwgIDgKKyAgICB4b3IgICAgICAgICAgICAgICBzdHJpZGUwcSwgc3RyaWRlMHEKKyAgICBsZWEgICAgICAgICAgICAgICAgICBkc3Q4cSwgW2RzdHEgICtzdHJpZGVxKjhdCisgICAgbGVhICAgICAgICAgICAgICAgICBkc3QxNnEsIFtkc3Q4cSArc3RyaWRlcSo4XQorICAgIGxlYSAgICAgICAgICAgICAgICAgZHN0MjRxLCBbZHN0MTZxK3N0cmlkZXEqOF0KKyAgICBTQlVUVEVSRkxZICAgICAgICAgICAgICBidywgIDAsICAxLCAgNQorICAgIFNCVVRURVJGTFkgICAgICAgICAgICAgIGJ3LCAgMiwgIDMsICA1CisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgbTYsIG0xLCBbcGJfMTVdCisKKy5sb29wOgorICAgIG1vdmEgIFtkc3RxICArc3RyaWRlMHErIDBdLCBtMgorICAgIG1vdmEgIFtkc3RxICArc3RyaWRlMHErMTZdLCBtMworICAgIG1vdmEgIFtkc3Q4cSArc3RyaWRlMHErIDBdLCBtMworICAgIG1vdmEgIFtkc3Q4cSArc3RyaWRlMHErMTZdLCBtMAorICAgIG1vdmEgIFtkc3QxNnErc3RyaWRlMHErIDBdLCBtMAorICAgIG1vdmEgIFtkc3QxNnErc3RyaWRlMHErMTZdLCBtMQorICAgIG1vdmEgIFtkc3QyNHErc3RyaWRlMHErIDBdLCBtMQorICAgIG1vdmEgIFtkc3QyNHErc3RyaWRlMHErMTZdLCBtNgorJWlmIGNwdWZsYWcoYXZ4KQorICAgIHBhbGlnbnIgICAgICAgICAgICAgICAgIG0yLCBtMywgbTIsIDIKKyAgICBwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTAsIG0zLCAyCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTAsIG0xLCBtMCwgMgorICAgIHBzaHVmYiAgICAgICAgICAgICAgICAgIG0xLCBtNAorJWVsc2UKKyAgICBwc2h1ZmIgICAgICAgICAgICAgICAgICBtNSwgbTEsIG00CisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTEsIG0wLCAyCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTAsIG0zLCAyCisgICAgcGFsaWduciAgICAgICAgICAgICAgICAgbTMsIG0yLCAyCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTIsIG0zCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTMsIG0wCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIG0xCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTEsIG01CislZW5kaWYKKyAgICBhZGQgICAgICAgICAgICAgICBzdHJpZGUwcSwgc3RyaWRlcQorICAgIGRlYyAgICAgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AKKyAgICBSRVQKKyVlbmRtYWNybworCitIVV9YTU1fRlVOQ1Mgc3NzZTMKK0hVX1hNTV9GVU5DUyBhdngKKworOyBGSVhNRSAxMjcsIDEyOCwgMTI5ID8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92cDlpdHhmbS5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA5aXR4Zm0uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjY2UwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA5aXR4Zm0uYXNtCkBAIC0wLDAgKzEsMTY3MCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogVlA5IElEQ1QgU0lNRCBvcHRpbWl6YXRpb25zCis7KgorOyogQ29weXJpZ2h0IChDKSAyMDEzIENsw6ltZW50IELFk3NjaCA8dSBwa2ggbWU+Cis7KiBDb3B5cmlnaHQgKEMpIDIwMTMgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amUgZ21haWwgY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK3B3XzExNTg1eDI6ICB0aW1lcyA4IGR3IDIzMTcwCitwd19tMTE1ODV4MjogdGltZXMgOCBkdyAtMjMxNzAKKworJW1hY3JvIFZQOV9JRENUX0NPRUZGUyAyLTMgMAorcHdfJTF4MjogICAgdGltZXMgOCBkdyAgJTEqMgorcHdfbSUxeDI6ICAgdGltZXMgOCBkdyAtJTEqMgorcHdfJTJ4MjogICAgdGltZXMgOCBkdyAgJTIqMgorcHdfbSUyeDI6ICAgdGltZXMgOCBkdyAtJTIqMgorcHdfbSUxXyUyOiAgdGltZXMgNCBkdyAtJTEsICAlMgorcHdfJTJfJTE6ICAgdGltZXMgNCBkdyAgJTIsICAlMQorcHdfbSUyX20lMTogdGltZXMgNCBkdyAtJTIsIC0lMQorJWlmICUzID09IDEKK3B3X20lMl8lMTogIHRpbWVzIDQgZHcgLSUyLCAgJTEKK3B3XyUxXyUyOiAgIHRpbWVzIDQgZHcgICUxLCAgJTIKKyVlbmRpZgorJWVuZG1hY3JvCisKK1ZQOV9JRENUX0NPRUZGUyAxNTEzNywgIDYyNzAsIDEKK1ZQOV9JRENUX0NPRUZGUyAxNjA2OSwgIDMxOTYsIDEKK1ZQOV9JRENUX0NPRUZGUyAgOTEwMiwgMTM2MjMsIDEKK1ZQOV9JRENUX0NPRUZGUyAxNjMwNSwgIDE2MDYKK1ZQOV9JRENUX0NPRUZGUyAxMDM5NCwgMTI2NjUKK1ZQOV9JRENUX0NPRUZGUyAxNDQ0OSwgIDc3MjMKK1ZQOV9JRENUX0NPRUZGUyAgNDc1NiwgMTU2NzkKK1ZQOV9JRENUX0NPRUZGUyAxNjM2NCwgICA4MDQKK1ZQOV9JRENUX0NPRUZGUyAxMTAwMywgMTIxNDAKK1ZQOV9JRENUX0NPRUZGUyAxNDgxMSwgIDcwMDUKK1ZQOV9JRENUX0NPRUZGUyAgNTUyMCwgMTU0MjYKK1ZQOV9JRENUX0NPRUZGUyAxNTg5MywgIDM5ODEKK1ZQOV9JRENUX0NPRUZGUyAgODQyMywgMTQwNTMKK1ZQOV9JRENUX0NPRUZGUyAxMzE2MCwgIDk3NjAKK1ZQOV9JRENUX0NPRUZGUyAgMjQwNCwgMTYyMDcKKworcHdfNTI4M18xMzM3NzogdGltZXMgNCBkdyA1MjgzLCAxMzM3NworcHdfOTkyOV8xMzM3NzogdGltZXMgNCBkdyA5OTI5LCAxMzM3NworcHdfMTUyMTJfbTEzMzc3OiB0aW1lcyA0IGR3IDE1MjEyLCAtMTMzNzcKK3B3XzE1MjEyXzk5Mjk6IHRpbWVzIDQgZHcgMTUyMTIsIDk5MjkKK3B3X201MjgzX20xNTIxMjogdGltZXMgNCBkdyAtNTI4MywgLTE1MjEyCitwd18xMzM3N3gyOiB0aW1lcyA4IGR3IDEzMzc3KjIKKworcGRfODE5MjogdGltZXMgNCBkZCA4MTkyCisKK2NleHRlcm4gcHdfNTEyCitjZXh0ZXJuIHB3XzEwMjQKK2NleHRlcm4gcHdfMjA0OAorY2V4dGVybiBwd19tMQorCitTRUNUSU9OIC50ZXh0CisKKzsgKGEqeCArIGIqeSArIHJvdW5kKSA+PiBzaGlmdAorJW1hY3JvIFZQOV9NVUxTVUJfMldfMlggNSA7IGRzdDEsIGRzdDIvc3JjLCByb3VuZCwgY29lZnMxLCBjb2VmczIKKyAgICBwbWFkZHdkICAgICAgICAgICAgbSUxLCBtJTIsICU0CisgICAgcG1hZGR3ZCAgICAgICAgICAgIG0lMiwgICU1CisgICAgcGFkZGQgICAgICAgICAgICAgIG0lMSwgICUzCisgICAgcGFkZGQgICAgICAgICAgICAgIG0lMiwgICUzCisgICAgcHNyYWQgICAgICAgICAgICAgIG0lMSwgIDE0CisgICAgcHNyYWQgICAgICAgICAgICAgIG0lMiwgIDE0CislZW5kbWFjcm8KKworJW1hY3JvIFZQOV9NVUxTVUJfMldfNFggNyA7IGRzdDEsIGRzdDIsIGNvZWYxLCBjb2VmMiwgcm5kLCB0bXAxL3NyYywgdG1wMgorICAgIFZQOV9NVUxTVUJfMldfMlggICAgJTcsICAlNiwgICU1LCBbcHdfbSUzXyU0XSwgW3B3XyU0XyUzXQorICAgIFZQOV9NVUxTVUJfMldfMlggICAgJTEsICAlMiwgICU1LCBbcHdfbSUzXyU0XSwgW3B3XyU0XyUzXQorICAgIHBhY2tzc2R3ICAgICAgICAgICBtJTEsIG0lNworICAgIHBhY2tzc2R3ICAgICAgICAgICBtJTIsIG0lNgorJWVuZG1hY3JvCisKKyVtYWNybyBWUDlfVU5QQUNLX01VTFNVQl8yV180WCA3LTkgOyBkc3QxLCBkc3QyLCAoc3JjMSwgc3JjMiwpIGNvZWYxLCBjb2VmMiwgcm5kLCB0bXAxLCB0bXAyCislaWYgJTAgPT0gNworICAgIHB1bnBja2h3ZCAgICAgICAgICBtJTYsIG0lMiwgbSUxCisgICAgcHVucGNrbHdkICAgICAgICAgIG0lMiwgbSUxCisgICAgVlA5X01VTFNVQl8yV180WCAgICUxLCAlMiwgJTMsICU0LCAlNSwgJTYsICU3CislZWxzZQorICAgIHB1bnBja2h3ZCAgICAgICAgICBtJTgsIG0lNCwgbSUzCisgICAgcHVucGNrbHdkICAgICAgICAgIG0lMiwgbSU0LCBtJTMKKyAgICBWUDlfTVVMU1VCXzJXXzRYICAgJTEsICUyLCAlNSwgJTYsICU3LCAlOCwgJTkKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCA2IDsgZHN0MSBbc3JjMV0sIGRzdDIgW3NyYzJdLCBkc3QzLCBkc3Q0LCBtdWwxLCBtdWwyCisgICAgcHVucGNraHdkICAgICAgICAgIG0lNCwgbSUyLCBtJTEKKyAgICBwdW5wY2tsd2QgICAgICAgICAgbSUyLCBtJTEKKyAgICBwbWFkZHdkICAgICAgICAgICAgbSUzLCBtJTQsIFtwd19tJTVfJTZdCisgICAgcG1hZGR3ZCAgICAgICAgICAgIG0lNCwgW3B3XyU2XyU1XQorICAgIHBtYWRkd2QgICAgICAgICAgICBtJTEsIG0lMiwgW3B3X20lNV8lNl0KKyAgICBwbWFkZHdkICAgICAgICAgICAgbSUyLCBbcHdfJTZfJTVdCislZW5kbWFjcm8KKworJW1hY3JvIFZQOV9STkRfU0hfU1VNU1VCX0JBIDYgOyBkc3QxIFtzcmMxXSwgZHN0MiBbc3JjMl0sIHNyYzMsIHNyYzQsIHRtcCwgcm91bmQKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICBkLCAlMSwgJTIsICU1CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgZCwgJTMsICU0LCAlNQorICAgIHBhZGRkICAgICAgICAgICAgICBtJTEsICU2CisgICAgcGFkZGQgICAgICAgICAgICAgIG0lMiwgJTYKKyAgICBwYWRkZCAgICAgICAgICAgICAgbSUzLCAlNgorICAgIHBhZGRkICAgICAgICAgICAgICBtJTQsICU2CisgICAgcHNyYWQgICAgICAgICAgICAgIG0lMSwgMTQKKyAgICBwc3JhZCAgICAgICAgICAgICAgbSUyLCAxNAorICAgIHBzcmFkICAgICAgICAgICAgICBtJTMsIDE0CisgICAgcHNyYWQgICAgICAgICAgICAgIG0lNCwgMTQKKyAgICBwYWNrc3NkdyAgICAgICAgICAgbSUxLCBtJTMKKyAgICBwYWNrc3NkdyAgICAgICAgICAgbSUyLCBtJTQKKyVlbmRtYWNybworCislbWFjcm8gVlA5X1NUT1JFXzJYIDUtNiBkc3RxIDsgcmVnMSwgcmVnMiwgdG1wMSwgdG1wMiwgemVybywgZHN0CisgICAgbW92aCAgICAgICAgICAgICAgIG0lMywgWyU2XQorICAgIG1vdmggICAgICAgICAgICAgICBtJTQsIFslNitzdHJpZGVxXQorICAgIHB1bnBja2xidyAgICAgICAgICBtJTMsIG0lNQorICAgIHB1bnBja2xidyAgICAgICAgICBtJTQsIG0lNQorICAgIHBhZGR3ICAgICAgICAgICAgICBtJTMsIG0lMQorICAgIHBhZGR3ICAgICAgICAgICAgICBtJTQsIG0lMgorICAgIHBhY2t1c3diICAgICAgICAgICBtJTMsIG0lNQorICAgIHBhY2t1c3diICAgICAgICAgICBtJTQsIG0lNQorICAgIG1vdmggICAgICAgICAgICAgIFslNl0sIG0lMworICAgIG1vdmggICAgICBbJTYrc3RyaWRlcV0sIG0lNAorJWVuZG1hY3JvCisKKyVtYWNybyBaRVJPX0JMT0NLIDQgOyBtZW0sIHN0cmlkZSwgbm56Y3BsLCB6ZXJvX3JlZworJWFzc2lnbiAlJXkgMAorJXJlcCAlMworJWFzc2lnbiAlJXggMAorJXJlcCAlMyoyL21tc2l6ZQorICAgIG1vdmEgICAgICBbJTErJSV5KyUleF0sICU0CislYXNzaWduICUleCAoJSV4K21tc2l6ZSkKKyVlbmRyZXAKKyVhc3NpZ24gJSV5ICglJXkrJTIpCislZW5kcmVwCislZW5kbWFjcm8KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCB2cDlfaXdodF9pd2h0XzR4NF9hZGRfPG9wdD4odWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jaywgaW50IGVvYik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gVlA5X0lXSFQ0XzFEIDAKKyAgICBTV0FQICAgICAgICAgICAgICAgICAxLCAyLCAzCisgICAgcGFkZHcgICAgICAgICAgICAgICBtMCwgbTIKKyAgICBwc3VidyAgICAgICAgICAgICAgIG0zLCBtMQorICAgIHBzdWJ3ICAgICAgICAgICAgICAgbTQsIG0wLCBtMworICAgIHBzcmF3ICAgICAgICAgICAgICAgbTQsIDEKKyAgICBwc3VidyAgICAgICAgICAgICAgIG01LCBtNCwgbTEKKyAgICBTV0FQICAgICAgICAgICAgICAgICA1LCAxCisgICAgcHN1YncgICAgICAgICAgICAgICBtNCwgbTIKKyAgICBTV0FQICAgICAgICAgICAgICAgICA0LCAyCisgICAgcHN1YncgICAgICAgICAgICAgICBtMCwgbTEKKyAgICBwYWRkdyAgICAgICAgICAgICAgIG0zLCBtMgorICAgIFNXQVAgICAgICAgICAgICAgICAgIDMsIDIsIDEKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK2NnbG9iYWwgdnA5X2l3aHRfaXdodF80eDRfYWRkLCAzLCAzLCAwLCBkc3QsIHN0cmlkZSwgYmxvY2ssIGVvYgorICAgIG1vdmEgICAgICAgICAgICAgICAgbTAsIFtibG9ja3ErMCo4XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEsIFtibG9ja3ErMSo4XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTIsIFtibG9ja3ErMio4XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTMsIFtibG9ja3ErMyo4XQorICAgIHBzcmF3ICAgICAgICAgICAgICAgbTAsIDIKKyAgICBwc3JhdyAgICAgICAgICAgICAgIG0xLCAyCisgICAgcHNyYXcgICAgICAgICAgICAgICBtMiwgMgorICAgIHBzcmF3ICAgICAgICAgICAgICAgbTMsIDIKKworICAgIFZQOV9JV0hUNF8xRAorICAgIFRSQU5TUE9TRTR4NFcgICAgICAgIDAsIDEsIDIsIDMsIDQKKyAgICBWUDlfSVdIVDRfMUQKKworICAgIHB4b3IgICAgICAgICAgICAgICAgbTQsIG00CisgICAgVlA5X1NUT1JFXzJYICAgICAgICAgMCwgMSwgNSwgNiwgNAorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqMl0KKyAgICBWUDlfU1RPUkVfMlggICAgICAgICAyLCAzLCA1LCA2LCA0CisgICAgWkVST19CTE9DSyAgICAgIGJsb2NrcSwgOCwgNCwgbTQKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCB2cDlfaWRjdF9pZGN0XzR4NF9hZGRfPG9wdD4odWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jaywgaW50IGVvYik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gVlA5X0lEQ1Q0XzFEX0ZJTkFMSVpFIDAKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAzLCAyLCA0ICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTM9dDMrdDAsIG0yPS10Myt0MAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsIDEsIDAsIDQgICAgICAgICAgICAgICAgICAgICAgICAgOyBtMT10Mit0MSwgbTA9LXQyK3QxCisgICAgU1dBUCAgICAgICAgICAgICAgICAgMCwgMywgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDMxMDIgLT4gMDEyMworJWVuZG1hY3JvCisKKyVtYWNybyBWUDlfSURDVDRfMUQgMAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsIDIsIDAsIDQgICAgICAgICAgICAgICAgICAgICAgICAgOyBtMj1JTigwKStJTigyKSBtMD1JTigwKS1JTigyKQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTIsIG02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtMj10MAorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTAsIG02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtMD10MQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYIDEsIDMsIDE1MTM3LCA2MjcwLCBtNywgNCwgNSAgICAgOyBtMT10MiwgbTM9dDMKKyAgICBWUDlfSURDVDRfMURfRklOQUxJWkUKKyVlbmRtYWNybworCis7IDJ4MiB0b3AgbGVmdCBjb3JuZXIKKyVtYWNybyBWUDlfSURDVDRfMngyXzFEIDAKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBtNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTA9dDEKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0yLCBtMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTI9dDAKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0zLCBtMQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTEsIG02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtMT10MgorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTMsIG03ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtMz10MworICAgIFZQOV9JRENUNF8xRF9GSU5BTElaRQorJWVuZG1hY3JvCisKKyVtYWNybyBWUDlfSURDVDRfV1JJVEVPVVQgMAorICAgIG1vdmEgICAgICAgICAgICAgICAgbTUsIFtwd18yMDQ4XQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTAsIG01ICAgICAgICAgICAgICA7ICh4KjIwNDggKyAoMTw8MTQpKT4+MTUgPD0+ICh4KzgpPj40CisgICAgcG11bGhyc3cgICAgICAgICAgICBtMSwgbTUKKyAgICBWUDlfU1RPUkVfMlggICAgICAgICAwLCAgMSwgIDYsICA3LCAgNAorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxKzIqc3RyaWRlcV0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0yLCBtNQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTMsIG01CisgICAgVlA5X1NUT1JFXzJYICAgICAgICAgMiwgIDMsICA2LCAgNywgIDQKKyVlbmRtYWNybworCitJTklUX01NWCBzc3NlMworY2dsb2JhbCB2cDlfaWRjdF9pZGN0XzR4NF9hZGQsIDQsNCwwLCBkc3QsIHN0cmlkZSwgYmxvY2ssIGVvYgorCisgICAgY21wIGVvYmQsIDQgOyAyeDIgb3Igc21hbGxlcgorICAgIGpnIC5pZGN0ZnVsbAorCisgICAgY21wIGVvYmQsIDEgOyBmYXN0ZXIgcGF0aCBmb3Igd2hlbiBvbmx5IERDIGlzIHNldAorICAgIGpuZSAuaWRjdDJ4MgorCisgICAgbW92ZCAgICAgICAgICAgICAgICBtMCwgW2Jsb2NrcV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG01LCBbcHdfMTE1ODV4Ml0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBtNQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTAsIG01CisgICAgcHNodWZ3ICAgICAgICAgICAgICBtMCwgbTAsIDAKKyAgICBweG9yICAgICAgICAgICAgICAgIG00LCBtNAorICAgIG1vdmggICAgICAgICAgW2Jsb2NrcV0sIG00CisgICAgcG11bGhyc3cgICAgICAgICAgICBtMCwgW3B3XzIwNDhdICAgICAgIDsgKHgqMjA0OCArICgxPDwxNCkpPj4xNSA8PT4gKHgrOCk+PjQKKyAgICBWUDlfU1RPUkVfMlggICAgICAgICAwLCAgMCwgIDYsICA3LCAgNAorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxKzIqc3RyaWRlcV0KKyAgICBWUDlfU1RPUkVfMlggICAgICAgICAwLCAgMCwgIDYsICA3LCAgNAorICAgIFJFVAorCis7IGZhc3RlciBwYXRoIGZvciB3aGVuIG9ubHkgdG9wIGxlZnQgMngyIGJsb2NrIGlzIHNldAorLmlkY3QyeDI6CisgICAgbW92ZCAgICAgICAgICAgICAgICBtMCwgW2Jsb2NrcSswXQorICAgIG1vdmQgICAgICAgICAgICAgICAgbTEsIFtibG9ja3ErOF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG01LCBbcHdfMTE1ODV4Ml0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG02LCBbcHdfNjI3MHgyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTcsIFtwd18xNTEzN3gyXQorICAgIFZQOV9JRENUNF8yeDJfMUQKKyAgICBUUkFOU1BPU0U0eDRXICAwLCAxLCAyLCAzLCA0CisgICAgVlA5X0lEQ1Q0XzJ4Ml8xRAorICAgIHB4b3IgICAgICAgICAgICAgICAgbTQsIG00ICA7IHVzZWQgZm9yIHRoZSBibG9jayByZXNldCwgYW5kIFZQOV9TVE9SRV8yWAorICAgIG1vdmggICAgICAgW2Jsb2NrcSsgMF0sIG00CisgICAgbW92aCAgICAgICBbYmxvY2txKyA4XSwgbTQKKyAgICBWUDlfSURDVDRfV1JJVEVPVVQKKyAgICBSRVQKKworLmlkY3RmdWxsOiA7IGdlbmVyaWMgZnVsbCA0eDQgaWRjdC9pZGN0CisgICAgbW92YSAgICAgICAgICAgICAgICBtMCwgW2Jsb2NrcSsgMF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xLCBbYmxvY2txKyA4XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTIsIFtibG9ja3ErMTZdCisgICAgbW92YSAgICAgICAgICAgICAgICBtMywgW2Jsb2NrcSsyNF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG02LCBbcHdfMTE1ODV4Ml0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG03LCBbcGRfODE5Ml0gICAgICAgOyByb3VuZGluZworICAgIFZQOV9JRENUNF8xRAorICAgIFRSQU5TUE9TRTR4NFcgIDAsIDEsIDIsIDMsIDQKKyAgICBWUDlfSURDVDRfMUQKKyAgICBweG9yICAgICAgICAgICAgICAgIG00LCBtNCAgOyB1c2VkIGZvciB0aGUgYmxvY2sgcmVzZXQsIGFuZCBWUDlfU1RPUkVfMlgKKyAgICBtb3ZhICAgICAgIFtibG9ja3ErIDBdLCBtNAorICAgIG1vdmEgICAgICAgW2Jsb2NrcSsgOF0sIG00CisgICAgbW92YSAgICAgICBbYmxvY2txKzE2XSwgbTQKKyAgICBtb3ZhICAgICAgIFtibG9ja3ErMjRdLCBtNAorICAgIFZQOV9JRENUNF9XUklURU9VVAorICAgIFJFVAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIHZwOV9pYWRzdF9pYWRzdF80eDRfYWRkXzxvcHQ+KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2ssIGludCBlb2IpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIFZQOV9JQURTVDRfMUQgMAorICAgIG1vdnEyZHEgICAgICAgICAgIHhtbTAsIG0wCisgICAgbW92cTJkcSAgICAgICAgICAgeG1tMSwgbTEKKyAgICBtb3ZxMmRxICAgICAgICAgICB4bW0yLCBtMgorICAgIG1vdnEyZHEgICAgICAgICAgIHhtbTMsIG0zCisgICAgcGFkZHcgICAgICAgICAgICAgICBtMywgbTAKKyAgICBwdW5wY2tsd2QgICAgICAgICB4bW0wLCB4bW0xCisgICAgcHVucGNrbHdkICAgICAgICAgeG1tMiwgeG1tMworICAgIHBtYWRkd2QgICAgICAgICAgIHhtbTEsIHhtbTAsIFtwd181MjgzXzEzMzc3XQorICAgIHBtYWRkd2QgICAgICAgICAgIHhtbTQsIHhtbTAsIFtwd185OTI5XzEzMzc3XQorICAgIHBtYWRkd2QgICAgICAgICAgIHhtbTAsIFtwd18xNTIxMl9tMTMzNzddCisgICAgcG1hZGR3ZCAgICAgICAgICAgeG1tMywgeG1tMiwgW3B3XzE1MjEyXzk5MjldCisgICAgcG1hZGR3ZCAgICAgICAgICAgeG1tMiwgW3B3X201MjgzX20xNTIxMl0KKyAgICBwc3VidyAgICAgICAgICAgICAgIG0zLCBtMgorICAgIHBhZGRkICAgICAgICAgICAgIHhtbTAsIHhtbTIKKyAgICBwYWRkZCAgICAgICAgICAgICB4bW0zLCBbcGRfODE5Ml0KKyAgICBwYWRkZCAgICAgICAgICAgICB4bW0yLCBbcGRfODE5Ml0KKyAgICBwYWRkZCAgICAgICAgICAgICB4bW0xLCB4bW0zCisgICAgcGFkZGQgICAgICAgICAgICAgeG1tMCwgeG1tMworICAgIHBhZGRkICAgICAgICAgICAgIHhtbTQsIHhtbTIKKyAgICBwc3JhZCAgICAgICAgICAgICB4bW0xLCAxNAorICAgIHBzcmFkICAgICAgICAgICAgIHhtbTAsIDE0CisgICAgcHNyYWQgICAgICAgICAgICAgeG1tNCwgMTQKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0zLCBbcHdfMTMzNzd4Ml0gICAgICAgIDsgb3V0MgorICAgIHBhY2tzc2R3ICAgICAgICAgIHhtbTAsIHhtbTAKKyAgICBwYWNrc3NkdyAgICAgICAgICB4bW0xLCB4bW0xCisgICAgcGFja3NzZHcgICAgICAgICAgeG1tNCwgeG1tNAorICAgIG1vdmRxMnEgICAgICAgICAgICAgbTAsIHhtbTAgICAgICAgICAgICAgICAgOyBvdXQzCisgICAgbW92ZHEycSAgICAgICAgICAgICBtMSwgeG1tMSAgICAgICAgICAgICAgICA7IG91dDAKKyAgICBtb3ZkcTJxICAgICAgICAgICAgIG0yLCB4bW00ICAgICAgICAgICAgICAgIDsgb3V0MQorICAgIFNXQVAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMKKyVlbmRtYWNybworCislbWFjcm8gSUFEU1Q0X0ZOIDUKK0lOSVRfTU1YICU1CitjZ2xvYmFsIHZwOV8lMV8lM180eDRfYWRkLCAzLCAzLCA4LCBkc3QsIHN0cmlkZSwgYmxvY2ssIGVvYgorICAgIG1vdmEgICAgICAgICAgICAgICAgbTAsIFtibG9ja3ErIDBdCisgICAgbW92YSAgICAgICAgICAgICAgICBtMSwgW2Jsb2NrcSsgOF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0yLCBbYmxvY2txKzE2XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTMsIFtibG9ja3ErMjRdCisgICAgbW92YSAgICAgICAgICAgICAgICBtNiwgW3B3XzExNTg1eDJdCisgICAgbW92YSAgICAgICAgICAgICAgICBtNywgW3BkXzgxOTJdICAgICAgIDsgcm91bmRpbmcKKyAgICBWUDlfJTJfMUQKKyAgICBUUkFOU1BPU0U0eDRXICAwLCAxLCAyLCAzLCA0CisgICAgVlA5XyU0XzFECisgICAgcHhvciAgICAgICAgICAgICAgICBtNCwgbTQgIDsgdXNlZCBmb3IgdGhlIGJsb2NrIHJlc2V0LCBhbmQgVlA5X1NUT1JFXzJYCisgICAgbW92YSAgICAgICBbYmxvY2txKyAwXSwgbTQKKyAgICBtb3ZhICAgICAgIFtibG9ja3ErIDhdLCBtNAorICAgIG1vdmEgICAgICAgW2Jsb2NrcSsxNl0sIG00CisgICAgbW92YSAgICAgICBbYmxvY2txKzI0XSwgbTQKKyAgICBWUDlfSURDVDRfV1JJVEVPVVQKKyAgICBSRVQKKyVlbmRtYWNybworCitJQURTVDRfRk4gaWRjdCwgIElEQ1Q0LCAgaWFkc3QsIElBRFNUNCwgc3NzZTMKK0lBRFNUNF9GTiBpYWRzdCwgSUFEU1Q0LCBpZGN0LCAgSURDVDQsICBzc3NlMworSUFEU1Q0X0ZOIGlhZHN0LCBJQURTVDQsIGlhZHN0LCBJQURTVDQsIHNzc2UzCisKKyVpZiBBUkNIX1g4Nl82NCA7IFRPRE86IDMyLWJpdD8gKDMyLWJpdCBsaW1pdGVkIHRvIDggeG1tIHJlZywgd2UgdXNlIG1vcmUpCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgdnA5X2lkY3RfaWRjdF84eDhfYWRkXzxvcHQ+KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2ssIGludCBlb2IpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIFZQOV9JRENUOF8xRF9GSU5BTElaRSAwCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDMsIDEwLCA0ICAgICAgICAgICAgICAgICAgICAgICA7ICBtMz10MCt0NywgbTEwPXQwLXQ3CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDEsICAyLCA0ICAgICAgICAgICAgICAgICAgICAgICA7ICBtMT10MSt0NiwgIG0yPXQxLXQ2CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgMTEsICAwLCA0ICAgICAgICAgICAgICAgICAgICAgICA7IG0xMT10Mit0NSwgIG0wPXQyLXQ1CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDksICA4LCA0ICAgICAgICAgICAgICAgICAgICAgICA7ICBtOT10Myt0NCwgIG04PXQzLXQ0CisgICAgU1dBUCAgICAgICAgICAgICAgICAxMSwgMTAsIDIKKyAgICBTV0FQICAgICAgICAgICAgICAgICAzLCAgOSwgMAorJWVuZG1hY3JvCisKKyVtYWNybyBWUDlfSURDVDhfMUQgMAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsIDgsIDAsIDQgICAgICAgICAgICAgICAgICAgICAgICAgOyBtOD1JTigwKStJTig0KSBtMD1JTigwKS1JTig0KQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTgsIG0xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtOD10MGEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBtMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTA9dDFhCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggMiwgMTAsIDE1MTM3LCAgNjI3MCwgbTcsIDQsIDUgICA7IG0yPXQyYSwgbTEwPXQzYQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYIDEsIDExLCAxNjA2OSwgIDMxOTYsIG03LCA0LCA1ICAgOyBtMT10NGEsIG0xMT10N2EKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCA5LCAgMywgIDkxMDIsIDEzNjIzLCBtNywgNCwgNSAgIDsgbTk9dDVhLCAgbTM9dDZhCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgMTAsICA4LCA0ICAgICAgICAgICAgICAgICAgICAgICA7IG0xMD10MGErdDNhICh0MCksICBtOD10MGEtdDNhICh0MykKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgMiwgIDAsIDQgICAgICAgICAgICAgICAgICAgICAgIDsgIG0yPXQxYSt0MmEgKHQxKSwgIG0wPXQxYS10MmEgKHQyKQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICA5LCAgMSwgNCAgICAgICAgICAgICAgICAgICAgICAgOyAgbTk9dDRhK3Q1YSAodDQpLCAgbTE9dDRhLXQ1YSAodDVhKQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAzLCAxMSwgNCAgICAgICAgICAgICAgICAgICAgICAgOyAgbTM9dDdhK3Q2YSAodDcpLCBtMTE9dDdhLXQ2YSAodDZhKQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAxLCAxMSwgNCAgICAgICAgICAgICAgICAgICAgICAgOyAgbTE9dDZhK3Q1YSAodDYpLCBtMTE9dDZhLXQ1YSAodDUpCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMSwgbTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG0xPXQ2CisgICAgcG11bGhyc3cgICAgICAgICAgIG0xMSwgbTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG0xMT10NQorICAgIFZQOV9JRENUOF8xRF9GSU5BTElaRQorJWVuZG1hY3JvCisKKyVtYWNybyBWUDlfSURDVDhfNHg0XzFEIDAKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBtMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTA9dDFhL3QwYQorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTAsIG0yLCBbcHdfMTUxMzd4Ml0gICAgICAgICAgICAgICAgOyBtMTA9dDNhCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMiwgW3B3XzYyNzB4Ml0gICAgICAgICAgICAgICAgICAgICA7IG0yPXQyYQorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTEsIG0xLCBbcHdfMTYwNjl4Ml0gICAgICAgICAgICAgICAgOyBtMTE9dDdhCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMSwgW3B3XzMxOTZ4Ml0gICAgICAgICAgICAgICAgICAgICA7IG0xPXQ0YQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTksIG0zLCBbcHdfOTEwMngyXSAgICAgICAgICAgICAgICAgOyBtOT0tdDVhCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMywgW3B3XzEzNjIzeDJdICAgICAgICAgICAgICAgICAgICA7IG0zPXQ2YQorICAgIHBzdWJ3ICAgICAgICAgICAgICAgbTgsIG0wLCBtMTAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtOD10MGEtdDNhICh0MykKKyAgICBwYWRkdyAgICAgICAgICAgICAgbTEwLCBtMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTEwPXQwYSt0M2EgKHQwKQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAyLCAgMCwgNCAgICAgICAgICAgICAgICAgICAgICAgOyAgbTI9dDFhK3QyYSAodDEpLCAgbTA9dDFhLXQyYSAodDIpCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDksICAxLCA0ICAgICAgICAgICAgICAgICAgICAgICA7ICBtMT10NGErdDVhICh0NCksICBtOT10NGEtdDVhICh0NWEpCisgICAgU1dBUCAgICAgICAgICAgICAgICAgMSwgIDkKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgMywgMTEsIDQgICAgICAgICAgICAgICAgICAgICAgIDsgIG0zPXQ3YSt0NmEgKHQ3KSwgbTExPXQ3YS10NmEgKHQ2YSkKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgMSwgMTEsIDQgICAgICAgICAgICAgICAgICAgICAgIDsgIG0xPXQ2YSt0NWEgKHQ2KSwgbTExPXQ2YS10NWEgKHQ1KQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTEsIG0xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtMT10NgorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTEsIG0xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtMTE9dDUKKyAgICBWUDlfSURDVDhfMURfRklOQUxJWkUKKyVlbmRtYWNybworCis7IFRPRE86IGEgbG90IG9mIHQqIGNvcGllcyBjYW4gcHJvYmFibHkgYmUgcmVtb3ZlZCBhbmQgbWVyZ2VkIHdpdGgKKzsgZm9sbG93aW5nIFNVTVNVQnMgZnJvbSBWUDlfSURDVDhfMURfRklOQUxJWkUgd2l0aCBBVlgKKyVtYWNybyBWUDlfSURDVDhfMngyXzFEIDAKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBtMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIG0wPXQwCisgICAgbW92YSAgICAgICAgICAgICAgICBtMywgbTEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0xLCBtNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIG0xPXQ0CisgICAgcG11bGhyc3cgICAgICAgICAgICBtMywgbTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICBtMz10NworICAgIG1vdmEgICAgICAgICAgICAgICAgbTIsIG0wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgbTI9dDEKKyAgICBtb3ZhICAgICAgICAgICAgICAgbTEwLCBtMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTEwPXQyCisgICAgbW92YSAgICAgICAgICAgICAgICBtOCwgbTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICBtOD10MworICAgIG1vdmEgICAgICAgICAgICAgICBtMTEsIG0zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB0NSA9IHQ3YSAuLi4KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG05LCBtMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgdDYgPSB0N2EgLi4uCisgICAgcHN1YncgICAgICAgICAgICAgIG0xMSwgbTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHQ1ID0gdDdhIC0gdDRhCisgICAgcGFkZHcgICAgICAgICAgICAgICBtOSwgbTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHQ2ID0gdDdhICsgdDRhCisgICAgcG11bGhyc3cgICAgICAgICAgIG0xMSwgbTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG0xMT10NQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTksIG0xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgbTk9dDYKKyAgICBTV0FQICAgICAgICAgICAgICAgICAwLCAxMAorICAgIFNXQVAgICAgICAgICAgICAgICAgIDksICAxCisgICAgVlA5X0lEQ1Q4XzFEX0ZJTkFMSVpFCislZW5kbWFjcm8KKworJW1hY3JvIFZQOV9JRENUOF9XUklURU9VVCAwCisgICAgbW92YSAgICAgICAgICAgICAgICBtNSwgW3B3XzEwMjRdCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMCwgbTUgICAgICAgICAgICAgIDsgKHgqMTAyNCArICgxPDwxNCkpPj4xNSA8PT4gKHgrMTYpPj41CisgICAgcG11bGhyc3cgICAgICAgICAgICBtMSwgbTUKKyAgICBWUDlfU1RPUkVfMlggICAgICAgICAwLCAgMSwgIDYsICA3LCAgNAorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxKzIqc3RyaWRlcV0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0yLCBtNQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTMsIG01CisgICAgVlA5X1NUT1JFXzJYICAgICAgICAgMiwgIDMsICA2LCAgNywgIDQKKyAgICBsZWEgICAgICAgICAgICAgICBkc3RxLCBbZHN0cSsyKnN0cmlkZXFdCisgICAgcG11bGhyc3cgICAgICAgICAgICBtOCwgbTUKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG05LCBtNQorICAgIFZQOV9TVE9SRV8yWCAgICAgICAgIDgsICA5LCAgNiwgIDcsICA0CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErMipzdHJpZGVxXQorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTAsIG01CisgICAgcG11bGhyc3cgICAgICAgICAgIG0xMSwgbTUKKyAgICBWUDlfU1RPUkVfMlggICAgICAgIDEwLCAxMSwgIDYsICA3LCAgNAorJWVuZG1hY3JvCisKKyVtYWNybyBWUDlfSURDVF9JRENUXzh4OF9BRERfWE1NIDEKK0lOSVRfWE1NICUxCitjZ2xvYmFsIHZwOV9pZGN0X2lkY3RfOHg4X2FkZCwgNCw0LDEzLCBkc3QsIHN0cmlkZSwgYmxvY2ssIGVvYgorCisgICAgbW92YSAgICAgICAgICAgICAgIG0xMiwgW3B3XzExNTg1eDJdICAgIDsgb2Z0ZW4gdXNlZAorCisgICAgY21wIGVvYmQsIDEyIDsgdG9wIGxlZnQgaGFsZiBvciBsZXNzCisgICAgamcgLmlkY3RmdWxsCisKKyAgICBjbXAgZW9iZCwgMyAgOyB0b3AgbGVmdCBjb3JuZXIgb3IgbGVzcworICAgIGpnIC5pZGN0aGFsZgorCisgICAgY21wIGVvYmQsIDEgOyBmYXN0ZXIgcGF0aCBmb3Igd2hlbiBvbmx5IERDIGlzIHNldAorICAgIGpuZSAuaWRjdHRvcGxlZnRjb3JuZXIKKworICAgIG1vdmQgICAgICAgICAgICAgICAgbTAsIFtibG9ja3FdCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMCwgbTEyCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMCwgbTEyCisgICAgU1BMQVRXICAgICAgICAgICAgICBtMCwgbTAsIDAKKyAgICBweG9yICAgICAgICAgICAgICAgIG00LCBtNAorICAgIG1vdmQgICAgICAgICAgW2Jsb2NrcV0sIG00CisgICAgbW92YSAgICAgICAgICAgICAgICBtNSwgW3B3XzEwMjRdCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMCwgbTUgICAgICAgICAgICAgIDsgKHgqMTAyNCArICgxPDwxNCkpPj4xNSA8PT4gKHgrMTYpPj41CisgICAgVlA5X1NUT1JFXzJYICAgICAgICAgMCwgIDAsICA2LCAgNywgIDQKKyAgICBsZWEgICAgICAgICAgICAgICBkc3RxLCBbZHN0cSsyKnN0cmlkZXFdCisgICAgVlA5X1NUT1JFXzJYICAgICAgICAgMCwgIDAsICA2LCAgNywgIDQKKyAgICBsZWEgICAgICAgICAgICAgICBkc3RxLCBbZHN0cSsyKnN0cmlkZXFdCisgICAgVlA5X1NUT1JFXzJYICAgICAgICAgMCwgIDAsICA2LCAgNywgIDQKKyAgICBsZWEgICAgICAgICAgICAgICBkc3RxLCBbZHN0cSsyKnN0cmlkZXFdCisgICAgVlA5X1NUT1JFXzJYICAgICAgICAgMCwgIDAsICA2LCAgNywgIDQKKyAgICBSRVQKKworOyBmYXN0ZXIgcGF0aCBmb3Igd2hlbiBvbmx5IGxlZnQgY29ybmVyIGlzIHNldCAoMyBpbnB1dDogREMsIHJpZ2h0IHRvIERDLCBiZWxvdworOyB0byBEQykuIE5vdGU6IGFsc28gd29ya2luZyB3aXRoIGEgMngyIGJsb2NrCisuaWRjdHRvcGxlZnRjb3JuZXI6CisgICAgbW92ZCAgICAgICAgICAgICAgICBtMCwgW2Jsb2NrcSswXQorICAgIG1vdmQgICAgICAgICAgICAgICAgbTEsIFtibG9ja3ErMTZdCisgICAgbW92YSAgICAgICAgICAgICAgICBtNiwgW3B3XzMxOTZ4Ml0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG03LCBbcHdfMTYwNjl4Ml0KKyAgICBWUDlfSURDVDhfMngyXzFECisgICAgVFJBTlNQT1NFOHg4VyAgMCwgMSwgMiwgMywgOCwgOSwgMTAsIDExLCA0CisgICAgVlA5X0lEQ1Q4XzJ4Ml8xRAorICAgIHB4b3IgICAgICAgICAgICAgICAgbTQsIG00ICA7IHVzZWQgZm9yIHRoZSBibG9jayByZXNldCwgYW5kIFZQOV9TVE9SRV8yWAorICAgIG1vdmQgICAgICAgW2Jsb2NrcSsgMF0sIG00CisgICAgbW92ZCAgICAgICBbYmxvY2txKzE2XSwgbTQKKyAgICBWUDlfSURDVDhfV1JJVEVPVVQKKyAgICBSRVQKKworLmlkY3RoYWxmOgorICAgIG1vdmggICAgICAgICAgICAgICAgbTAsIFtibG9ja3EgKyAwXQorICAgIG1vdmggICAgICAgICAgICAgICAgbTEsIFtibG9ja3EgKzE2XQorICAgIG1vdmggICAgICAgICAgICAgICAgbTIsIFtibG9ja3EgKzMyXQorICAgIG1vdmggICAgICAgICAgICAgICAgbTMsIFtibG9ja3EgKzQ4XQorICAgIFZQOV9JRENUOF80eDRfMUQKKyAgICBUUkFOU1BPU0U4eDhXICAwLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEsIDQKKyAgICBWUDlfSURDVDhfNHg0XzFECisgICAgcHhvciAgICAgICAgICAgICAgICBtNCwgbTQKKyAgICBtb3ZoICAgICAgIFtibG9ja3ErIDBdLCBtNAorICAgIG1vdmggICAgICAgW2Jsb2NrcSsxNl0sIG00CisgICAgbW92aCAgICAgICBbYmxvY2txKzMyXSwgbTQKKyAgICBtb3ZoICAgICAgIFtibG9ja3ErNDhdLCBtNAorICAgIFZQOV9JRENUOF9XUklURU9VVAorICAgIFJFVAorCisuaWRjdGZ1bGw6IDsgZ2VuZXJpYyBmdWxsIDh4OCBpZGN0L2lkY3QKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0wLCBbYmxvY2txKyAgMF0gICAgOyBJTigwKQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEsIFtibG9ja3ErIDE2XSAgICA7IElOKDEpCisgICAgbW92YSAgICAgICAgICAgICAgICBtMiwgW2Jsb2NrcSsgMzJdICAgIDsgSU4oMikKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0zLCBbYmxvY2txKyA0OF0gICAgOyBJTigzKQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTgsIFtibG9ja3ErIDY0XSAgICA7IElOKDQpCisgICAgbW92YSAgICAgICAgICAgICAgICBtOSwgW2Jsb2NrcSsgODBdICAgIDsgSU4oNSkKKyAgICBtb3ZhICAgICAgICAgICAgICAgbTEwLCBbYmxvY2txKyA5Nl0gICAgOyBJTig2KQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTEsIFtibG9ja3ErMTEyXSAgICA7IElOKDcpCisgICAgbW92YSAgICAgICAgICAgICAgICBtNywgW3BkXzgxOTJdICAgICAgIDsgcm91bmRpbmcKKyAgICBWUDlfSURDVDhfMUQKKyAgICBUUkFOU1BPU0U4eDhXICAwLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEsIDQKKyAgICBWUDlfSURDVDhfMUQKKworICAgIHB4b3IgICAgICAgICAgICAgICAgbTQsIG00ICA7IHVzZWQgZm9yIHRoZSBibG9jayByZXNldCwgYW5kIFZQOV9TVE9SRV8yWAorICAgIFpFUk9fQkxPQ0sgICAgICBibG9ja3EsIDE2LCA4LCBtNAorICAgIFZQOV9JRENUOF9XUklURU9VVAorICAgIFJFVAorJWVuZG1hY3JvCisKK1ZQOV9JRENUX0lEQ1RfOHg4X0FERF9YTU0gc3NzZTMKK1ZQOV9JRENUX0lEQ1RfOHg4X0FERF9YTU0gYXZ4CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCB2cDlfaWFkc3RfaWFkc3RfOHg4X2FkZF88b3B0Pih1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrLCBpbnQgZW9iKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIFZQOV9JQURTVDhfMUQgMCA7IGlucHV0L291dHB1dD1tMC8xLzIvMy84LzkvMTAvMTEKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAxMSwgIDAsICA0LCAgNSwgMTYzMDUsICAxNjA2ICAgIDsgbTExLzQ9dDFbZF0sIG0wLzU9dDBbZF0KKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAgMywgIDgsICA2LCAxMywgMTAzOTQsIDEyNjY1ICAgIDsgbTMvNj10NVtkXSwgbTgvMTM9dDRbZF0KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAgOCwgIDAsIDEzLCAgNSwgMTQsIG03ICAgICAgICAgIDsgbTg9dDBbd10sIG0wPXQ0W3ddCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgIDMsIDExLCAgNiwgIDQsIDE0LCBtNyAgICAgICAgICA7IG0zPXQxW3ddLCBtMTE9dDVbd10KKworICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYICA5LCAgMiwgIDQsICA1LCAxNDQ0OSwgIDc3MjMgICAgOyBtOS80PXQzW2RdLCBtMi81PXQyW2RdCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMkRfNFggIDEsIDEwLCAgNiwgMTMsICA0NzU2LCAxNTY3OSAgICA7IG0xLzY9dDdbZF0sIG0xMC8xMz10NltkXQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgIDEwLCAgMiwgMTMsICA1LCAxNCwgbTcgICAgICAgICAgOyBtMTA9dDJbd10sIG0yPXQ2W3ddCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgIDEsICA5LCAgNiwgIDQsIDE0LCBtNyAgICAgICAgICA7IG0xPXQzW3ddLCBtOT10N1t3XQorCisgICAgOyBtOD10MCwgbTM9dDEsIG0xMD10MiwgbTE9dDMsIG0wPXQ0LCBtMTE9dDUsIG0yPXQ2LCBtOT10NworCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMkRfNFggIDAsIDExLCAgNCwgIDUsIDE1MTM3LCAgNjI3MCAgICA7IG0wLzQ9dDVbZF0sIG0xMS81PXQ0W2RdCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMkRfNFggIDksICAyLCAgNiwgMTMsICA2MjcwLCAxNTEzNyAgICA7IG05LzY9dDZbZF0sIG0yLzEzPXQ3W2RdCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgIDksIDExLCAgNiwgIDUsIDE0LCBtNworICAgIHBzaWdudyAgICAgICAgICAgICAgICAgIG05LCBbcHdfbTFdICAgICAgICAgICAgICAgICAgICAgOyBtOT1vdXQxW3ddLCBtMTE9dDZbd10KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAgMiwgIDAsIDEzLCAgNCwgMTQsIG03ICAgICAgICAgIDsgbTI9b3V0Nlt3XSwgbTA9dDdbd10KKworICAgIFNVTVNVQl9CQSAgICAgICAgICAgICAgICB3LCAxMCwgIDgsIDE0ICAgICAgICAgICAgICAgICAgOyBtMTA9b3V0MFt3XSwgbTg9dDJbd10KKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgICAgdywgIDEsICAzLCAxNAorICAgIHBzaWdudyAgICAgICAgICAgICAgICAgIG0xLCBbcHdfbTFdICAgICAgICAgICAgICAgICAgICAgOyBtMT1vdXQ3W3ddLCBtMz10M1t3XQorCisgICAgOyBtMTA9b3V0MCwgbTk9b3V0MSwgbTg9dDIsIG0zPXQzLCBtMTE9dDYsIG0wPXQ3LCBtMj1vdXQ2LCBtMT1vdXQ3CisKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgICAgdywgIDMsICA4LCAgNAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICAgICB3LCAgMCwgMTEsICA1CisgICAgcG11bGhyc3cgICAgICAgICAgICAgICAgbTMsIG0xMgorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgbTExLCBtMTIKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgICBtOCwgbTEyICAgICAgICAgICAgICAgICAgICAgICAgIDsgb3V0NAorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgIG0wLCBtMTIgICAgICAgICAgICAgICAgICAgICAgICAgOyBvdXQyCisgICAgcHNpZ253ICAgICAgICAgICAgICAgICAgbTMsIFtwd19tMV0gICAgICAgICAgICAgICAgICAgICA7IG91dDMKKyAgICBwc2lnbncgICAgICAgICAgICAgICAgIG0xMSwgW3B3X20xXSAgICAgICAgICAgICAgICAgICAgIDsgb3V0NQorCisgICAgOyBtMTA9b3V0MCwgbTk9b3V0MSwgbTA9b3V0MiwgbTM9b3V0MywgbTg9b3V0NCwgbTExPW91dDUsIG0yPW91dDYsIG0xPW91dDcKKworICAgIFNXQVAgICAgICAgICAgICAgICAgICAgICAwLCAxMCwgMgorICAgIFNXQVAgICAgICAgICAgICAgICAgICAgIDExLCAgMSwgOQorJWVuZG1hY3JvCisKKyVtYWNybyBJQURTVDhfRk4gNQorSU5JVF9YTU0gJTUKK2NnbG9iYWwgdnA5XyUxXyUzXzh4OF9hZGQsIDMsIDMsIDE1LCBkc3QsIHN0cmlkZSwgYmxvY2ssIGVvYgorICAgIG1vdmEgICAgICAgICAgICAgICAgbTAsIFtibG9ja3ErICAwXSAgICA7IElOKDApCisgICAgbW92YSAgICAgICAgICAgICAgICBtMSwgW2Jsb2NrcSsgMTZdICAgIDsgSU4oMSkKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0yLCBbYmxvY2txKyAzMl0gICAgOyBJTigyKQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTMsIFtibG9ja3ErIDQ4XSAgICA7IElOKDMpCisgICAgbW92YSAgICAgICAgICAgICAgICBtOCwgW2Jsb2NrcSsgNjRdICAgIDsgSU4oNCkKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG05LCBbYmxvY2txKyA4MF0gICAgOyBJTig1KQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTAsIFtibG9ja3ErIDk2XSAgICA7IElOKDYpCisgICAgbW92YSAgICAgICAgICAgICAgIG0xMSwgW2Jsb2NrcSsxMTJdICAgIDsgSU4oNykKKworICAgIG1vdmEgICAgICAgICAgICAgICBtMTIsIFtwd18xMTU4NXgyXSAgICA7IG9mdGVuIHVzZWQKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG03LCBbcGRfODE5Ml0gICAgICAgOyByb3VuZGluZworICAgIFZQOV8lMl8xRAorICAgIFRSQU5TUE9TRTh4OFcgIDAsIDEsIDIsIDMsIDgsIDksIDEwLCAxMSwgNAorICAgIFZQOV8lNF8xRAorCisgICAgcHhvciAgICAgICAgICAgICAgICBtNCwgbTQgIDsgdXNlZCBmb3IgdGhlIGJsb2NrIHJlc2V0LCBhbmQgVlA5X1NUT1JFXzJYCisgICAgWkVST19CTE9DSyAgICAgIGJsb2NrcSwgMTYsIDgsIG00CisgICAgVlA5X0lEQ1Q4X1dSSVRFT1VUCisgICAgUkVUCislZW5kbWFjcm8KKworSUFEU1Q4X0ZOIGlkY3QsICBJRENUOCwgIGlhZHN0LCBJQURTVDgsIHNzc2UzCitJQURTVDhfRk4gaWRjdCwgIElEQ1Q4LCAgaWFkc3QsIElBRFNUOCwgYXZ4CitJQURTVDhfRk4gaWFkc3QsIElBRFNUOCwgaWRjdCwgIElEQ1Q4LCAgc3NzZTMKK0lBRFNUOF9GTiBpYWRzdCwgSUFEU1Q4LCBpZGN0LCAgSURDVDgsICBhdngKK0lBRFNUOF9GTiBpYWRzdCwgSUFEU1Q4LCBpYWRzdCwgSUFEU1Q4LCBzc3NlMworSUFEU1Q4X0ZOIGlhZHN0LCBJQURTVDgsIGlhZHN0LCBJQURTVDgsIGF2eAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgdnA5X2lkY3RfaWRjdF8xNngxNl9hZGRfPG9wdD4odWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jaywgaW50IGVvYik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsgYXQgdGhlIGVuZCBvZiB0aGlzIG1hY3JvLCBtNyBpcyBzdG9yZWQgaW4gc3RhY2tfc2NyYXRjaAorOyBldmVyeXRoaW5nIGVsc2UgKHQwLTYgYW5kIHQ4LTE1KSBpcyBzdG9yZWQgaW4gbTAtNiBhbmQgbTgtMTUKKzsgdGhlIGZvbGxvd2luZyBzdW1zdWJzIGhhdmUgbm90IGJlZW4gZG9uZSB5ZXQ6Cis7ICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICA2LCAgOSwgMTUgICAgICA7IHQ2LCB0OQorOyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgNywgIDgsIDE1ICAgICAgOyB0NywgdDgKKyVtYWNybyBWUDlfSURDVDE2XzFEX1NUQVJUIDQgOyBzcmMsIG5uemMsIHN0cmlkZSwgc3RhY2tfc2NyYXRjaAorJWlmICUyIDw9IDQKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0zLCBbJTErIDEqJTNdICAgICAgOyBJTigxKQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTIsIFslMSsgMiolM10gICAgICA7IElOKDIpCisgICAgbW92YSAgICAgICAgICAgICAgICBtMCwgWyUxKyAzKiUzXSAgICAgIDsgSU4oMykKKworICAgIHBtdWxocnN3ICAgICAgICAgICBtMTUsIG0xMiwgW3B3XzE2MDY5eDJdICAgICAgIDsgdDYtNworICAgIHBtdWxocnN3ICAgICAgICAgICBtMTIsIFtwd18zMTk2eDJdICAgICAgICAgICAgIDsgdDQtNQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTQsIG0zLCAgW3B3XzE2MzA1eDJdICAgICAgIDsgdDE0LTE1CisgICAgcG11bGhyc3cgICAgICAgICAgICBtMywgW3B3XzE2MDZ4Ml0gICAgICAgICAgICAgOyB0OC05CisgICAgcG11bGhyc3cgICAgICAgICAgICBtNywgbTAsICBbcHdfbTQ3NTZ4Ml0gICAgICAgOyB0MTAtMTEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBbcHdfMTU2Nzl4Ml0gICAgICAgICAgICA7IHQxMi0xMworCisgICAgOyBtOD10MCwgbTk9dDEsIG0xMD10MiwgbTExPXQzLCBtMTI9dDQsIG0xND10NSwgbTEzPXQ2LCBtMTU9dDcKKyAgICA7IG0zPXQ4LCBtNT10OSwgbTE9dDEwLCBtNz10MTEsIG0wPXQxMiwgbTY9dDEzLCBtMj10MTQsIG00PXQxNQorCisgICAgcGFkZHcgICAgICAgICAgICAgIG0xNCwgbTE1LCBtMTIKKyAgICBwc3VidyAgICAgICAgICAgICAgbTEzLCBtMTUsIG0xMgorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTMsIFtwd18xMTU4NXgyXSAgICAgICAgICAgIDsgdDUKKyAgICBwbXVsaHJzdyAgICAgICAgICAgbTE0LCBbcHdfMTE1ODV4Ml0gICAgICAgICAgICA7IHQ2CisKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAyLCA1LCA0LCAzLCAxNTEzNywgIDYyNzAsIFtwZF84MTkyXSwgMTAsIDExIDsgdDksICB0MTQKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCA2LCAxLCAwLCA3LCA2MjcwLCBtMTUxMzcsIFtwZF84MTkyXSwgMTAsIDExIDsgdDEwLCB0MTMKKworICAgIDsgbTE1PXQwLCBtMTQ9dDEsIG0xMz10MiwgbTEyPXQzLCBtMTE9dDQsIG0xMD10NSwgbTk9dDYsIG04PXQ3CisgICAgOyBtNz10OCwgbTY9dDksIG0yPXQxMCwgbTM9dDExLCBtND10MTIsIG01PXQxMywgbTE9dDE0LCBtMD10MTUKKyVlbHNlCisgICAgbW92YSAgICAgICAgICAgICAgICBtNSwgWyUxKyAxKiUzXSAgICAgOyBJTigxKQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTQsIFslMSsgMiolM10gICAgIDsgSU4oMikKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG02LCBbJTErIDMqJTNdICAgICA7IElOKDMpCisgICAgbW92YSAgICAgICAgICAgICAgICBtOSwgWyUxKyA0KiUzXSAgICAgOyBJTig0KQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTcsIFslMSsgNSolM10gICAgIDsgSU4oNSkKKyAgICBtb3ZhICAgICAgICAgICAgICAgbTE1LCBbJTErIDYqJTNdICAgICA7IElOKDYpCisgICAgbW92YSAgICAgICAgICAgICAgICBtNCwgWyUxKyA3KiUzXSAgICAgOyBJTig3KQorJWlmICUyIDw9IDgKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG04LCBtOSwgIFtwd18xNTEzN3gyXSAgICAgICA7IHQzCisgICAgcG11bGhyc3cgICAgICAgICAgICBtOSwgW3B3XzYyNzB4Ml0gICAgICAgICAgICAgOyB0MgorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTMsIG0xNCwgW3B3XzE2MDY5eDJdICAgICAgIDsgdDcKKyAgICBwbXVsaHJzdyAgICAgICAgICAgbTE0LCBbcHdfMzE5NngyXSAgICAgICAgICAgICA7IHQ0CisgICAgcG11bGhyc3cgICAgICAgICAgIG0xMiwgbTE1LCBbcHdfbTkxMDJ4Ml0gICAgICAgOyB0NQorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTUsIFtwd18xMzYyM3gyXSAgICAgICAgICAgIDsgdDYKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0yLCBtNSwgIFtwd18xNjMwNXgyXSAgICAgICA7IHQxNQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTUsIFtwd18xNjA2eDJdICAgICAgICAgICAgIDsgdDgKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0zLCBtNCwgIFtwd19tMTAzOTR4Ml0gICAgICA7IHQ5CisgICAgcG11bGhyc3cgICAgICAgICAgICBtNCwgW3B3XzEyNjY1eDJdICAgICAgICAgICAgOyB0MTQKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBtNywgIFtwd18xNDQ0OXgyXSAgICAgICA7IHQxMworICAgIHBtdWxocnN3ICAgICAgICAgICAgbTcsIFtwd183NzIzeDJdICAgICAgICAgICAgIDsgdDEwCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMSwgbTYsICBbcHdfbTQ3NTZ4Ml0gICAgICAgOyB0MTEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG02LCBbcHdfMTU2Nzl4Ml0gICAgICAgICAgICA7IHQxMgorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0zLCBbJTErIDkqJTNdICAgICA7IElOKDkpCisgICAgbW92YSAgICAgICAgICAgICAgIG0xMiwgWyUxKzEwKiUzXSAgICAgOyBJTigxMCkKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0wLCBbJTErMTEqJTNdICAgICA7IElOKDExKQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTgsIFslMSsxMiolM10gICAgIDsgSU4oMTIpCisgICAgbW92YSAgICAgICAgICAgICAgICBtMSwgWyUxKzEzKiUzXSAgICAgOyBJTigxMykKKyAgICBtb3ZhICAgICAgICAgICAgICAgbTEzLCBbJTErMTQqJTNdICAgICA7IElOKDE0KQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTIsIFslMSsxNSolM10gICAgIDsgSU4oMTUpCisKKyAgICA7IG0xMD1pbjAsIG01PWluMSwgbTE0PWluMiwgbTY9aW4zLCBtOT1pbjQsIG03PWluNSwgbTE1PWluNiwgbTQ9aW43CisgICAgOyBtMTE9aW44LCBtMz1pbjksIG0xMj1pbjEwIG0wPWluMTEsIG04PWluMTIsIG0xPWluMTMsIG0xMz1pbjE0LCBtMj1pbjE1CisKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgIDksICAgOCwgMTUxMzcsICA2MjcwLCBbcGRfODE5Ml0sIDEwLCAxMSA7IHQyLCAgdDMKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgMTQsICAxMywgMTYwNjksICAzMTk2LCBbcGRfODE5Ml0sIDEwLCAxMSA7IHQ0LCAgdDcKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgMTIsICAxNSwgIDkxMDIsIDEzNjIzLCBbcGRfODE5Ml0sIDEwLCAxMSA7IHQ1LCAgdDYKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgIDUsICAgMiwgMTYzMDUsICAxNjA2LCBbcGRfODE5Ml0sIDEwLCAxMSA7IHQ4LCAgdDE1CisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggICAzLCAgIDQsIDEwMzk0LCAxMjY2NSwgW3BkXzgxOTJdLCAxMCwgMTEgOyB0OSwgIHQxNAorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICAgNywgICAwLCAxNDQ0OSwgIDc3MjMsIFtwZF84MTkyXSwgMTAsIDExIDsgdDEwLCB0MTMKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgIDEsICAgNiwgIDQ3NTYsIDE1Njc5LCBbcGRfODE5Ml0sIDEwLCAxMSA7IHQxMSwgdDEyCislZW5kaWYKKworICAgIDsgbTExPXQwLCBtMTA9dDEsIG05PXQyLCBtOD10MywgbTE0PXQ0LCBtMTI9dDUsIG0xNT10NiwgbTEzPXQ3CisgICAgOyBtNT10OCwgbTM9dDksIG03PXQxMCwgbTE9dDExLCBtNj10MTIsIG0wPXQxMywgbTQ9dDE0LCBtMj10MTUKKworICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsIDEyLCAxNCwgMTAgICAgICA7IHQ0LCAgdDUKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAxNSwgMTMsIDEwICAgICAgOyB0NywgIHQ2CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDMsICA1LCAxMCAgICAgIDsgdDgsICB0OQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICA3LCAgMSwgMTAgICAgICA7IHQxMSwgdDEwCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDAsICA2LCAxMCAgICAgIDsgdDEyLCB0MTMKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgNCwgIDIsIDEwICAgICAgOyB0MTUsIHQxNAorCisgICAgOyBtOD10MCwgbTk9dDEsIG0xMD10MiwgbTExPXQzLCBtMTI9dDQsIG0xND10NSwgbTEzPXQ2LCBtMTU9dDcKKyAgICA7IG0zPXQ4LCBtNT10OSwgbTE9dDEwLCBtNz10MTEsIG0wPXQxMiwgbTY9dDEzLCBtMj10MTQsIG00PXQxNQorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgMTQsIDEzLCAxMAorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTMsIFtwd18xMTU4NXgyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgdDUKKyAgICBwbXVsaHJzdyAgICAgICAgICAgbTE0LCBbcHdfMTE1ODV4Ml0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHQ2CisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggICAyLCAgIDUsIDE1MTM3LCAgNjI3MCwgW3BkXzgxOTJdLCAxMCwgMTEgOyB0OSwgIHQxNAorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICAgNiwgICAxLCA2MjcwLCBtMTUxMzcsIFtwZF84MTkyXSwgMTAsIDExIDsgdDEwLCB0MTMKKyVlbmRpZgorCisgICAgOyBtOD10MCwgbTk9dDEsIG0xMD10MiwgbTExPXQzLCBtMTI9dDQsIG0xMz10NSwgbTE0PXQ2LCBtMTU9dDcKKyAgICA7IG0zPXQ4LCBtMj10OSwgbTY9dDEwLCBtNz10MTEsIG0wPXQxMiwgbTE9dDEzLCBtNT10MTQsIG00PXQxNQorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDcsICAzLCAxMCAgICAgIDsgdDgsICB0MTEKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgNiwgIDIsIDEwICAgICAgOyB0OSwgIHQxMAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAwLCAgNCwgMTAgICAgICA7IHQxNSwgdDEyCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDEsICA1LCAxMCAgICAgIDsgdDE0LiB0MTMKKworICAgIDsgbTE1PXQwLCBtMTQ9dDEsIG0xMz10MiwgbTEyPXQzLCBtMTE9dDQsIG0xMD10NSwgbTk9dDYsIG04PXQ3CisgICAgOyBtNz10OCwgbTY9dDksIG0yPXQxMCwgbTM9dDExLCBtND10MTIsIG01PXQxMywgbTE9dDE0LCBtMD10MTUKKworICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAyLCAgNSwgMTAKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgMywgIDQsIDEwCisgICAgcG11bGhyc3cgICAgICAgICAgICBtNSwgW3B3XzExNTg1eDJdICAgIDsgdDEwCisgICAgcG11bGhyc3cgICAgICAgICAgICBtNCwgW3B3XzExNTg1eDJdICAgIDsgdDExCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMywgW3B3XzExNTg1eDJdICAgIDsgdDEyCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMiwgW3B3XzExNTg1eDJdICAgIDsgdDEzCisKKyAgICA7IGJhY2t1cCBmaXJzdCByZWdpc3RlcgorICAgIG1vdmEgICAgICAgICAgICAgIFslNF0sIG03CisKKyAgICA7IG0xNT10MCwgbTE0PXQxLCBtMTM9dDIsIG0xMj10MywgbTExPXQ0LCBtMTA9dDUsIG05PXQ2LCBtOD10NworICAgIDsgbTc9dDgsIG02PXQ5LCBtNT10MTAsIG00PXQxMSwgbTM9dDEyLCBtMj10MTMsIG0xPXQxNCwgbTA9dDE1CisKKyAgICA7IGZyb20gbG9hZC9zdGFydAorJWlmICUyIDw9IDQKKyAgICBtb3ZhICAgICAgICAgICAgICAgbTExLCBbJTErIDAqJTNdICAgICAgOyBJTigwKQorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTEsIFtwd18xMTU4NXgyXSAgICA7IHQwLXQzCisKKyAgICBwc3VidyAgICAgICAgICAgICAgIG04LCBtMTEsIG0xNQorICAgIHBhZGR3ICAgICAgICAgICAgICBtMTUsIG0xMQorICAgIHBzdWJ3ICAgICAgICAgICAgICAgbTksIG0xMSwgbTE0CisgICAgcGFkZHcgICAgICAgICAgICAgIG0xNCwgbTExCisgICAgcHN1YncgICAgICAgICAgICAgIG0xMCwgbTExLCBtMTMKKyAgICBwYWRkdyAgICAgICAgICAgICAgbTEzLCBtMTEKKyVlbHNlCisgICAgbW92YSAgICAgICAgICAgICAgIG0xMCwgWyUxKyAwKiUzXSAgICAgIDsgSU4oMCkKKyVpZiAlMiA8PSA4CisgICAgcG11bGhyc3cgICAgICAgICAgIG0xMCwgW3B3XzExNTg1eDJdICAgIDsgdDAgYW5kIHQxCisgICAgcHN1YncgICAgICAgICAgICAgIG0xMSwgbTEwLCBtOAorICAgIHBhZGR3ICAgICAgICAgICAgICAgbTgsIG0xMAorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAgICAgbTExLCBbJTErIDgqJTNdICAgICAgOyBJTig4KQorCisgICAgOyBmcm9tIDMgc3RhZ2VzIGJhY2sKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAxMSwgMTAsIDcKKyAgICBwbXVsaHJzdyAgICAgICAgICAgbTExLCBbcHdfMTE1ODV4Ml0gICAgOyB0MAorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTAsIFtwd18xMTU4NXgyXSAgICA7IHQxCisKKyAgICA7IGZyb20gMiBzdGFnZXMgYmFjaworICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICA4LCAxMSwgNyAgICAgICA7IHQwLCAgdDMKKyVlbmRpZgorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICA5LCAxMCwgNyAgICAgICA7IHQxLCAgdDIKKworICAgIDsgZnJvbSAxIHN0YWdlIGJhY2sKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAxNSwgIDgsIDcgICAgICAgOyB0MCwgIHQ3CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgMTQsICA5LCA3ICAgICAgIDsgdDEsICB0NgorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsIDEzLCAxMCwgNyAgICAgICA7IHQyLCAgdDUKKyVlbmRpZgorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsIDEyLCAxMSwgNyAgICAgICA7IHQzLCAgdDQKKworICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAwLCAxNSwgNyAgICAgICA7IHQwLCB0MTUKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgMSwgMTQsIDcgICAgICAgOyB0MSwgdDE0CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDIsIDEzLCA3ICAgICAgIDsgdDIsIHQxMworICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAzLCAxMiwgNyAgICAgICA7IHQzLCB0MTIKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgNCwgMTEsIDcgICAgICAgOyB0NCwgdDExCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDUsIDEwLCA3ICAgICAgIDsgdDUsIHQxMAorJWVuZG1hY3JvCisKKyVtYWNybyBWUDlfSURDVDE2XzFEIDItMyAxNiA7IHNyYywgcGFzcywgbm56YworICAgIFZQOV9JRENUMTZfMURfU1RBUlQgJTEsICUzLCAzMiwgdG1wcSszMgorCislaWYgJTIgPT0gMQorICAgIDsgYmFja3VwIGEgZGlmZmVyZW50IHJlZ2lzdGVyCisgICAgbW92YSAgICAgICAgIFt0bXBxKzE2XSwgbTE1CisgICAgbW92YSAgICAgICAgICAgICAgICBtNywgW3RtcHErMzJdCisKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgNiwgIDksIDE1ICAgICAgOyB0NiwgdDkKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgNywgIDgsIDE1ICAgICAgOyB0NywgdDgKKworICAgIFRSQU5TUE9TRTh4OFcgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDE1CisgICAgbW92YSAgICAgICAgW3RtcHErICAwXSwgbTAKKyAgICBtb3ZhICAgICAgICBbdG1wcSsgMzJdLCBtMQorICAgIG1vdmEgICAgICAgIFt0bXBxKyA2NF0sIG0yCisgICAgbW92YSAgICAgICAgW3RtcHErIDk2XSwgbTMKKyAgICBtb3ZhICAgICAgICBbdG1wcSsxMjhdLCBtNAorICAgIG1vdmEgICAgICAgIFt0bXBxKzE2MF0sIG01CisgICAgbW92YSAgICAgICAgW3RtcHErMTkyXSwgbTYKKyAgICBtb3ZhICAgICAgICBbdG1wcSsyMjRdLCBtNworCisgICAgbW92YSAgICAgICAgICAgICAgIG0xNSwgW3RtcHErMTZdCisgICAgVFJBTlNQT1NFOHg4VyAgICAgICAgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMAorICAgIG1vdmEgICAgICAgIFt0bXBxKyAxNl0sIG04CisgICAgbW92YSAgICAgICAgW3RtcHErIDQ4XSwgbTkKKyAgICBtb3ZhICAgICAgICBbdG1wcSsgODBdLCBtMTAKKyAgICBtb3ZhICAgICAgICBbdG1wcSsxMTJdLCBtMTEKKyAgICBtb3ZhICAgICAgICBbdG1wcSsxNDRdLCBtMTIKKyAgICBtb3ZhICAgICAgICBbdG1wcSsxNzZdLCBtMTMKKyAgICBtb3ZhICAgICAgICBbdG1wcSsyMDhdLCBtMTQKKyAgICBtb3ZhICAgICAgICBbdG1wcSsyNDBdLCBtMTUKKyVlbHNlIDsgJTIgPT0gMgorICAgIDsgYmFja3VwIG1vcmUgcmVnaXN0ZXJzCisgICAgbW92YSAgICAgICAgIFt0bXBxKzY0XSwgbTgKKyAgICBtb3ZhICAgICAgICAgW3RtcHErOTZdLCBtOQorCisgICAgcHhvciAgICAgICAgICAgICAgICBtNywgbTcKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBbcHdfNTEyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTEsIFtwd181MTJdCisgICAgVlA5X1NUT1JFXzJYICAgICAgICAgMCwgIDEsICA4LCAgOSwgIDcKKyAgICBsZWEgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjJdCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMiwgW3B3XzUxMl0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0zLCBbcHdfNTEyXQorICAgIFZQOV9TVE9SRV8yWCAgICAgICAgIDIsICAzLCAgOCwgIDksICA3CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSoyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTQsIFtwd181MTJdCisgICAgcG11bGhyc3cgICAgICAgICAgICBtNSwgW3B3XzUxMl0KKyAgICBWUDlfU1RPUkVfMlggICAgICAgICA0LCAgNSwgIDgsICA5LCAgNworICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqMl0KKworICAgIDsgcmVzdG9yZSBmcm9tIGNhY2hlCisgICAgU1dBUCAgICAgICAgICAgICAgICAgMCwgNyAgICAgICAgICAgICAgIDsgbW92ZSB6ZXJvIGZyb20gbTcgdG8gbTAKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG03LCBbdG1wcSszMl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG04LCBbdG1wcSs2NF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG05LCBbdG1wcSs5Nl0KKworICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICA2LCAgOSwgMSAgICAgICA7IHQ2LCB0OQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICA3LCAgOCwgMSAgICAgICA7IHQ3LCB0OAorCisgICAgcG11bGhyc3cgICAgICAgICAgICBtNiwgW3B3XzUxMl0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG03LCBbcHdfNTEyXQorICAgIFZQOV9TVE9SRV8yWCAgICAgICAgIDYsICA3LCAgMSwgIDIsICAwCisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSoyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTgsIFtwd181MTJdCisgICAgcG11bGhyc3cgICAgICAgICAgICBtOSwgW3B3XzUxMl0KKyAgICBWUDlfU1RPUkVfMlggICAgICAgICA4LCAgOSwgIDEsICAyLCAgMAorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqMl0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgbTEwLCBbcHdfNTEyXQorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTEsIFtwd181MTJdCisgICAgVlA5X1NUT1JFXzJYICAgICAgICAxMCwgMTEsICAxLCAgMiwgIDAKKyAgICBsZWEgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjJdCisgICAgcG11bGhyc3cgICAgICAgICAgIG0xMiwgW3B3XzUxMl0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgbTEzLCBbcHdfNTEyXQorICAgIFZQOV9TVE9SRV8yWCAgICAgICAgMTIsIDEzLCAgMSwgIDIsICAwCisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSoyXQorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTQsIFtwd181MTJdCisgICAgcG11bGhyc3cgICAgICAgICAgIG0xNSwgW3B3XzUxMl0KKyAgICBWUDlfU1RPUkVfMlggICAgICAgIDE0LCAxNSwgIDEsICAyLCAgMAorJWVuZGlmIDsgJTIgPT0gMS8yCislZW5kbWFjcm8KKworJW1hY3JvIFZQOV9TVE9SRV8yWEZVTEwgNi03IHN0cmlkZXE7IGRjLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB6ZXJvLCBzdHJpZGUKKyAgICBtb3ZhICAgICAgICAgICAgICAgbSUzLCBbZHN0cV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgbSU1LCBbZHN0cSslN10KKyAgICBwdW5wY2tsYncgICAgICAgICAgbSUyLCBtJTMsIG0lNgorICAgIHB1bnBja2hidyAgICAgICAgICBtJTMsIG0lNgorICAgIHB1bnBja2xidyAgICAgICAgICBtJTQsIG0lNSwgbSU2CisgICAgcHVucGNraGJ3ICAgICAgICAgIG0lNSwgbSU2CisgICAgcGFkZHcgICAgICAgICAgICAgIG0lMiwgbSUxCisgICAgcGFkZHcgICAgICAgICAgICAgIG0lMywgbSUxCisgICAgcGFkZHcgICAgICAgICAgICAgIG0lNCwgbSUxCisgICAgcGFkZHcgICAgICAgICAgICAgIG0lNSwgbSUxCisgICAgcGFja3Vzd2IgICAgICAgICAgIG0lMiwgbSUzCisgICAgcGFja3Vzd2IgICAgICAgICAgIG0lNCwgbSU1CisgICAgbW92YSAgICAgICAgICAgIFtkc3RxXSwgbSUyCisgICAgbW92YSAgICAgICAgIFtkc3RxKyU3XSwgbSU0CislZW5kbWFjcm8KKworJW1hY3JvIFZQOV9JRENUX0lEQ1RfMTZ4MTZfQUREX1hNTSAxCitJTklUX1hNTSAlMQorY2dsb2JhbCB2cDlfaWRjdF9pZGN0XzE2eDE2X2FkZCwgNCwgNiwgMTYsIDUxMiwgZHN0LCBzdHJpZGUsIGJsb2NrLCBlb2IKKyAgICA7IDJ4Mj1lb2I9MywgNHg0PWVvYj0xMAorICAgIGNtcCBlb2JkLCAzOAorICAgIGpnIC5pZGN0ZnVsbAorICAgIGNtcCBlb2JkLCAxIDsgZmFzdGVyIHBhdGggZm9yIHdoZW4gb25seSBEQyBpcyBzZXQKKyAgICBqbmUgLmlkY3Q4eDgKKworICAgIDsgZGMtb25seQorICAgIG1vdmQgICAgICAgICAgICAgICAgbTAsIFtibG9ja3FdCisgICAgbW92YSAgICAgICAgICAgICAgICBtMSwgW3B3XzExNTg1eDJdCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMCwgbTEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBtMQorICAgIFNQTEFUVyAgICAgICAgICAgICAgbTAsIG0wLCBxMDAwMAorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTAsIFtwd181MTJdCisgICAgcHhvciAgICAgICAgICAgICAgICBtNSwgbTUKKyAgICBtb3ZkICAgICAgICAgIFtibG9ja3FdLCBtNQorJXJlcCA3CisgICAgVlA5X1NUT1JFXzJYRlVMTCAgICAwLCAxLCAyLCAzLCA0LCA1CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErMipzdHJpZGVxXQorJWVuZHJlcAorICAgIFZQOV9TVE9SRV8yWEZVTEwgICAgMCwgMSwgMiwgMywgNCwgNQorICAgIFJFVAorCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIGJsb2NrLCBjbnQsIGRzdF9iYWssIHRtcAorLmlkY3Q4eDg6CisgICAgbW92ICAgICAgICAgICAgICAgdG1wcSwgcnNwCisgICAgVlA5X0lEQ1QxNl8xRCAgIGJsb2NrcSwgMSwgOAorCisgICAgbW92ICAgICAgICAgICAgICAgY250ZCwgMgorICAgIG1vdiAgICAgICAgICAgZHN0X2Jha3EsIGRzdHEKKy5sb29wMl84eDg6CisgICAgVlA5X0lEQ1QxNl8xRCAgICAgdG1wcSwgMiwgOAorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RfYmFrcSs4XQorICAgIGFkZCAgICAgICAgICAgICAgIHRtcHEsIDE2CisgICAgZGVjICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wMl84eDgKKworICAgIDsgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCwgbTAgc2hvdWxkIHN0aWxsIGJlIHplcm8KKyAgICA7IHVzZSB0aGF0IHRvIHplcm8gb3V0IGJsb2NrIGNvZWZmaWNpZW50cworICAgIFpFUk9fQkxPQ0sgICAgICBibG9ja3EsIDMyLCA4LCBtMAorICAgIFJFVAorCisuaWRjdGZ1bGw6CisgICAgbW92ICAgICAgICAgICAgICAgY250ZCwgMgorICAgIG1vdiAgICAgICAgICAgICAgIHRtcHEsIHJzcAorLmxvb3AxX2Z1bGw6CisgICAgVlA5X0lEQ1QxNl8xRCAgIGJsb2NrcSwgMQorICAgIGFkZCAgICAgICAgICAgICBibG9ja3EsIDE2CisgICAgYWRkICAgICAgICAgICAgICAgdG1wcSwgMjU2CisgICAgZGVjICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wMV9mdWxsCisgICAgc3ViICAgICAgICAgICAgIGJsb2NrcSwgMzIKKworICAgIG1vdiAgICAgICAgICAgICAgIGNudGQsIDIKKyAgICBtb3YgICAgICAgICAgICAgICB0bXBxLCByc3AKKyAgICBtb3YgICAgICAgICAgIGRzdF9iYWtxLCBkc3RxCisubG9vcDJfZnVsbDoKKyAgICBWUDlfSURDVDE2XzFEICAgICB0bXBxLCAyCisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdF9iYWtxKzhdCisgICAgYWRkICAgICAgICAgICAgICAgdG1wcSwgMTYKKyAgICBkZWMgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AyX2Z1bGwKKworICAgIDsgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCwgbTAgc2hvdWxkIHN0aWxsIGJlIHplcm8KKyAgICA7IHVzZSB0aGF0IHRvIHplcm8gb3V0IGJsb2NrIGNvZWZmaWNpZW50cworICAgIFpFUk9fQkxPQ0sgICAgICBibG9ja3EsIDMyLCAxNiwgbTAKKyAgICBSRVQKKyVlbmRtYWNybworCitWUDlfSURDVF9JRENUXzE2eDE2X0FERF9YTU0gc3NzZTMKK1ZQOV9JRENUX0lEQ1RfMTZ4MTZfQUREX1hNTSBhdngKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIHZwOV9pYWRzdF9pYWRzdF8xNngxNl9hZGRfPG9wdD4odWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jaywgaW50IGVvYik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBWUDlfSUFEU1QxNl8xRCAyIDsgc3JjLCBwYXNzCislYXNzaWduICUlc3RyIDE2KiUyCisgICAgbW92YSAgICAgICAgICAgICAgICBtMCwgWyUxKyAwKjMyXSAgOyBpbjAKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xLCBbJTErMTUqMzJdICA7IGluMTUKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG04LCBbJTErIDcqMzJdICA7IGluNworICAgIG1vdmEgICAgICAgICAgICAgICAgbTksIFslMSsgOCozMl0gIDsgaW44CisKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAgMSwgIDAsICAyLCAgMywgMTYzNjQsICAgODA0ICAgIDsgbTEvMj10MVtkXSwgbTAvMz10MFtkXQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYICA4LCAgOSwgMTEsIDEwLCAxMTAwMywgMTIxNDAgICAgOyBtOC8xMT10OVtkXSwgbTkvMTA9dDhbZF0KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAgOSwgIDAsIDEwLCAgMywgIDQsIFtwZF84MTkyXSAgIDsgbTk9dDBbd10sIG0wPXQ4W3ddCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgIDgsICAxLCAxMSwgIDIsICA0LCBbcGRfODE5Ml0gICA7IG04PXQxW3ddLCBtMT10OVt3XQorCisgICAgbW92YSAgICAgICAgICAgICAgIG0xMSwgWyUxKyAyKjMyXSAgOyBpbjIKKyAgICBtb3ZhICAgICAgICAgICAgICAgbTEwLCBbJTErMTMqMzJdICA7IGluMTMKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0zLCBbJTErIDUqMzJdICA7IGluNQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTIsIFslMSsxMCozMl0gIDsgaW4xMAorCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMkRfNFggMTAsIDExLCAgNiwgIDcsIDE1ODkzLCAgMzk4MSAgICA7IG0xMC82PXQzW2RdLCBtMTEvNz10MltkXQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYICAzLCAgMiwgIDQsICA1LCAgODQyMywgMTQwNTMgICAgOyBtMy80PXQxMVtkXSwgbTIvNT10MTBbZF0KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAgMiwgMTEsICA1LCAgNywgMTIsIFtwZF84MTkyXSAgIDsgbTI9dDJbd10sIG0xMT10MTBbd10KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAgMywgMTAsICA0LCAgNiwgMTIsIFtwZF84MTkyXSAgIDsgbTM9dDNbd10sIG0xMD10MTFbd10KKworICAgIG1vdmEgICBbdG1wcSsgMColJXN0cl0sIG05ICAgICAgICAgIDsgbWFrZSBzb21lIHNjcmF0Y2ggc3BhY2UgKHQwOm05LT5yMCkKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG00LCBbJTErIDQqMzJdICA7IGluNAorICAgIG1vdmEgICAgICAgICAgICAgICAgbTUsIFslMSsxMSozMl0gIDsgaW4xMQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTIsIFslMSsgMyozMl0gIDsgaW4zCisgICAgbW92YSAgICAgICAgICAgICAgIG0xMywgWyUxKzEyKjMyXSAgOyBpbjEyCisKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAgNSwgIDQsICA3LCAgNiwgMTQ4MTEsICA3MDA1ICAgIDsgbTUvNz10NVtkXSwgbTQvNj10NFtkXQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYIDEyLCAxMywgMTQsIDE1LCAgNTUyMCwgMTU0MjYgICAgOyBtMTIvMTQ9dDEzW2RdLCBtMTMvMTU9dDEyW2RdCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgMTMsICA0LCAxNSwgIDYsICA5LCBbcGRfODE5Ml0gICA7IG0xMz10NFt3XSwgbTQ9dDEyW3ddCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgMTIsICA1LCAxNCwgIDcsICA5LCBbcGRfODE5Ml0gICA7IG0xMj10NVt3XSwgbTU9dDEzW3ddCisKKyAgICBtb3ZhICAgW3RtcHErIDIqJSVzdHJdLCBtOCAgICAgICAgICA7IHQxOm05LT5yMgorICAgIG1vdmEgICBbdG1wcSsgMyolJXN0cl0sIG0yICAgICAgICAgIDsgdDI6bTItPnIzCisgICAgbW92YSAgIFt0bXBxKyA0KiUlc3RyXSwgbTMgICAgICAgICAgOyB0MzptMy0+cjQKKyAgICBtb3ZhICAgW3RtcHErIDUqJSVzdHJdLCBtMTMgICAgICAgICA7IHQ0Om0xMy0+cjUKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0yLCBbJTErIDYqMzJdICA7IGluNgorICAgIG1vdmEgICAgICAgICAgICAgICAgbTMsIFslMSsgOSozMl0gIDsgaW45CisgICAgbW92YSAgICAgICAgICAgICAgICBtOCwgWyUxKyAxKjMyXSAgOyBpbjEKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG05LCBbJTErMTQqMzJdICA7IGluMTQKKworICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYICAzLCAgMiwgIDcsICA2LCAxMzE2MCwgIDk3NjAgICAgOyBtMy83PXQ3W2RdLCBtMi82PXQ2W2RdCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMkRfNFggIDgsICA5LCAxMywgMTQsICAyNDA0LCAxNjIwNyAgICA7IG04LzEzPXQxNVtkXSwgbTkvMTQ9dDE0W2RdCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgIDksICAyLCAxNCwgIDYsIDE1LCBbcGRfODE5Ml0gICA7IG05PXQ2W3ddLCBtMj10MTRbd10KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAgOCwgIDMsIDEzLCAgNywgMTUsIFtwZF84MTkyXSAgIDsgbTg9dDdbd10sIG0zPXQxNVt3XQorCisgICAgOyByMD10MCwgcjI9dDEsIHIzPXQyLCByND10MywgcjU9dDQsIG0xMj10NSwgbTk9dDYsIG04PXQ3CisgICAgOyBtMD10OCwgbTE9dDksIG0xMT10MTAsIG0xMD10MTEsIG00PXQxMiwgbTU9dDEzLCBtMj10MTQsIG0zPXQxNQorCisgICAgOyBoYW5kbGUgdDgtMTUgZmlyc3QKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAgMCwgIDEsICA2LCAgNywgMTYwNjksICAzMTk2ICAgIDsgbTEvNz10OFtkXSwgbTAvNj10OVtkXQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYICA1LCAgNCwgMTMsIDE0LCAgMzE5NiwgMTYwNjkgICAgOyBtNS8xMz10MTJbZF0sIG00LzE0PXQxM1tkXQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgICA1LCAgMSwgMTMsICA3LCAxNSwgW3BkXzgxOTJdICAgOyBtNT10OFt3XSwgbTE9dDEyW3ddCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgIDQsICAwLCAxNCwgIDYsIDE1LCBbcGRfODE5Ml0gICA7IG00PXQ5W3ddLCBtMD10MTNbd10KKworICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYIDExLCAxMCwgIDYsICA3LCAgOTEwMiwgMTM2MjMgICAgOyBtMTEvNj10MTFbZF0sIG0xMC83PXQxMFtkXQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYICAzLCAgMiwgMTMsIDE0LCAxMzYyMywgIDkxMDIgICAgOyBtMy8xMz10MTRbZF0sIG0yLzE0PXQxNVtkXQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgICAzLCAxMCwgMTMsICA3LCAxNSwgW3BkXzgxOTJdICAgOyBtMz10MTBbd10sIG0xMD10MTRbd10KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAgMiwgMTEsIDE0LCAgNiwgMTUsIFtwZF84MTkyXSAgIDsgbTI9dDExW3ddLCBtMTE9dDE1W3ddCisKKyAgICA7IG01PXQ4LCBtND10OSwgbTM9dDEwLCBtMj10MTEsIG0xPXQxMiwgbTA9dDEzLCBtMTA9dDE0LCBtMTE9dDE1CisKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAgMSwgIDAsICA2LCAgNywgMTUxMzcsICA2MjcwICAgIDsgbTEvNj10MTNbZF0sIG0wLzc9dDEyW2RdCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMkRfNFggMTEsIDEwLCAxMywgMTQsICA2MjcwLCAxNTEzNyAgICA7IG0xMS8xMz10MTRbZF0sIG0xMC8xND10MTVbZF0KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAxMSwgIDAsIDEzLCAgNywgMTUsIFtwZF84MTkyXSAgIDsgbTExPW91dDJbd10sIG0wPXQxNFt3XQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgIDEwLCAgMSwgMTQsICA2LCAxNSwgW3BkXzgxOTJdCisgICAgcHNpZ253ICAgICAgICAgICAgICAgICBtMTAsIFtwd19tMV0gICAgICAgICAgICAgICAgICAgICA7IG0xMD1vdXQxM1t3XSwgbTE9dDE1W3ddCisKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgICAgdywgIDMsICA1LCAxNQorICAgIHBzaWdudyAgICAgICAgICAgICAgICAgIG0zLCBbcHdfbTFdICAgICAgICAgICAgICAgICAgICAgOyBtMz1vdXQxW3ddLCBtNT10MTBbd10KKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgICAgdywgIDIsICA0LCAxNSAgICAgICAgICAgICAgICAgIDsgbTI9b3V0MTRbd10sIG00PXQxMVt3XQorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgICAgIHcsICA1LCAgNCwgMTUKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgICBtNSwgW3B3XzExNTg1eDJdICAgICAgICAgICAgICAgIDsgbTU9b3V0Nlt3XQorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgIG00LCBbcHdfMTE1ODV4Ml0gICAgICAgICAgICAgICAgOyBtND1vdXQ5W3ddCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgICAgIHcsICAxLCAgMCwgMTUKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgICBtMSwgW3B3X20xMTU4NXgyXSAgICAgICAgICAgICAgIDsgbTE9b3V0NVt3XQorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgIG0wLCBbcHdfMTE1ODV4Ml0gICAgICAgICAgICAgICAgOyBtMD1vdXQxMFt3XQorCisgICAgOyBtMz1vdXQxLCBtMTE9b3V0MiwgbTE9b3V0NSwgbTU9b3V0NiwgbTQ9b3V0OSwgbTA9b3V0MTAsIG0xMD1vdXQxMywgbTI9b3V0MTQKKworICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG02LCBbdG1wcSsgMColJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNywgW3RtcHErIDIqJSVzdHJdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICBtMTMsIFt0bXBxKyAzKiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgbTE0LCBbdG1wcSsgNColJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgIG0xNSwgW3RtcHErIDUqJSVzdHJdCisgICAgbW92YSAgICAgICBbdG1wcSsgOColJXN0cl0sIG01CisgICAgbW92YSAgICAgICBbdG1wcSsgOSolJXN0cl0sIG00CisgICAgbW92YSAgICAgICBbdG1wcSsxMColJXN0cl0sIG0wCisgICAgbW92YSAgICAgICBbdG1wcSsxMSolJXN0cl0sIG0xMAorICAgIG1vdmEgICAgICAgW3RtcHErMTIqJSVzdHJdLCBtMgorCisgICAgOyBtNj10MCwgbTc9dDEsIG0xMz10MiwgbTE0PXQzLCBtMTU9dDQsIG0xMj10NSwgbTk9dDYsIG04PXQ3CisgICAgOyBtMz1vdXQxLCBtMTE9b3V0MiwgbTE9b3V0NSwgcjg9b3V0Niwgcjk9b3V0OSwgcjEwPW91dDEwLCByMTE9b3V0MTMsIHIxMj1vdXQxNAorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgICAgIHcsIDE1LCAgNiwgIDAgICAgICAgICAgICAgICAgICA7IG0xNT10MFt3XSwgbTY9dDRbd10KKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgICAgdywgMTIsICA3LCAgMCAgICAgICAgICAgICAgICAgIDsgbTEyPXQxW3ddLCBtNz10NVt3XQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICAgICB3LCAgOSwgMTMsICAwICAgICAgICAgICAgICAgICAgOyBtOT10Mlt3XSwgbTEzPXQ2W3ddCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgICAgIHcsICA4LCAxNCwgIDAgICAgICAgICAgICAgICAgICA7IG04PXQzW3ddLCBtMTQ9dDdbd10KKworICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYICA2LCAgNywgIDAsICAyLCAxNTEzNywgIDYyNzAgICAgOyBtNi8wPXQ1W2RdLCBtNy8yPXQ0W2RdCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMkRfNFggMTQsIDEzLCAgNCwgIDUsICA2MjcwLCAxNTEzNyAgICA7IG0xNC80PXQ2W2RdLCBtMTMvNT10N1tkXQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgIDE0LCAgNywgIDQsICAyLCAxMCwgW3BkXzgxOTJdCisgICAgcHNpZ253ICAgICAgICAgICAgICAgICBtMTQsIFtwd19tMV0gICAgICAgICAgICAgICAgICAgICA7IG0xND1vdXQzW3ddLCBtNz10Nlt3XQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgIDEzLCAgNiwgIDUsICAwLCAxMCwgW3BkXzgxOTJdICAgOyBtMTM9b3V0MTJbd10sIG02PXQ3W3ddCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgICAgIHcsICA5LCAxNSwgMTAgICAgICAgICAgICAgICAgICA7IG05PW91dDBbd10sIG0xNT10Mlt3XQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICAgICB3LCAgOCwgMTIsIDEwCisgICAgcHNpZ253ICAgICAgICAgICAgICAgICAgbTgsIFtwd19tMV0gICAgICAgICAgICAgICAgICAgICA7IG04PW91dDE1W3ddLCBtMTI9dDNbd10KKworICAgIFNVTVNVQl9CQSAgICAgICAgICAgICAgICB3LCAxMiwgMTUsIDEwCisgICAgcG11bGhyc3cgICAgICAgICAgICAgICBtMTIsIFtwd19tMTE1ODV4Ml0gICAgICAgICAgICAgICA7IG0xMj1vdXQ3W3ddCisgICAgcG11bGhyc3cgICAgICAgICAgICAgICBtMTUsIFtwd18xMTU4NXgyXSAgICAgICAgICAgICAgICA7IG0xNT1vdXQ4W3ddCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgICAgIHcsICA3LCAgNiwgMTAKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgICBtNywgW3B3XzExNTg1eDJdICAgICAgICAgICAgICAgIDsgbTc9b3V0NFt3XQorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgIG02LCBbcHdfMTE1ODV4Ml0gICAgICAgICAgICAgICAgOyBtNj1vdXQxMVt3XQorCisgICAgOyBtOT1vdXQwLCBtMTQ9b3V0MywgbTc9b3V0NCwgbTEyPW91dDcsIG0xNT1vdXQ4LCBtNj1vdXQxMSwgbTEzPW91dDEyLCBtOD1vdXQxNQorICAgIDsgbTM9b3V0MSwgbTExPW91dDIsIG0xPW91dDUsIHI4PW91dDYsIHI5PW91dDksIHIxMD1vdXQxMCwgcjExPW91dDEzLCByMTI9b3V0MTQKKworJWlmICUyID09IDEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgW3RtcHErIDgqJSVzdHJdCisgICAgVFJBTlNQT1NFOHg4VyAgICAgICAgICAgIDksIDMsIDExLCAxNCwgNywgMSwgMCwgMTIsIDIKKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKyAwKjE2XSwgbTkKKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKyAyKjE2XSwgbTMKKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKyA0KjE2XSwgbTExCisgICAgbW92YSAgICAgICAgICBbdG1wcSsgNioxNl0sIG0xNAorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG05LCBbdG1wcSsgOSolJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMywgW3RtcHErMTAqJSVzdHJdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICBtMTEsIFt0bXBxKzExKiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgbTE0LCBbdG1wcSsxMiolJXN0cl0KKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKyA4KjE2XSwgbTcKKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKzEwKjE2XSwgbTEKKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKzEyKjE2XSwgbTAKKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKzE0KjE2XSwgbTEyCisKKyAgICBUUkFOU1BPU0U4eDhXICAgICAgICAgICAxNSwgOSwgMywgNiwgMTMsIDExLCAxNCwgOCwgMgorICAgIG1vdmEgICAgICAgICAgW3RtcHErIDEqMTZdLCBtMTUKKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKyAzKjE2XSwgbTkKKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKyA1KjE2XSwgbTMKKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKyA3KjE2XSwgbTYKKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKyA5KjE2XSwgbTEzCisgICAgbW92YSAgICAgICAgICBbdG1wcSsxMSoxNl0sIG0xMQorICAgIG1vdmEgICAgICAgICAgW3RtcHErMTMqMTZdLCBtMTQKKyAgICBtb3ZhICAgICAgICAgIFt0bXBxKzE1KjE2XSwgbTgKKyVlbHNlCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTUsIFt0bXBxKyA4KiUlc3RyXQorICAgIHB4b3IgICAgICAgICAgICAgICAgICAgIG0wLCBtMAorCisgICAgcG11bGhyc3cgICAgICAgICAgICAgICAgbTksIFtwd181MTJdCisgICAgcG11bGhyc3cgICAgICAgICAgICAgICAgbTMsIFtwd181MTJdCisgICAgVlA5X1NUT1JFXzJYICAgICAgICAgICAgIDksICAzLCAyLCA0LCAwCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqMl0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgIG0xMSwgW3B3XzUxMl0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgIG0xNCwgW3B3XzUxMl0KKyAgICBWUDlfU1RPUkVfMlggICAgICAgICAgICAxMSwgMTQsIDIsIDQsIDAKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSoyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgIG03LCBbcHdfNTEyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgIG0xLCBbcHdfNTEyXQorICAgIFZQOV9TVE9SRV8yWCAgICAgICAgICAgICA3LCAgMSwgMiwgNCwgMAorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjJdCisgICAgcG11bGhyc3cgICAgICAgICAgICAgICAgbTUsIFtwd181MTJdCisgICAgcG11bGhyc3cgICAgICAgICAgICAgICBtMTIsIFtwd181MTJdCisgICAgVlA5X1NUT1JFXzJYICAgICAgICAgICAgIDUsIDEyLCAyLCA0LCAwCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqMl0KKworICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG05LCBbdG1wcSsgOSolJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMywgW3RtcHErMTAqJSVzdHJdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICBtMTEsIFt0bXBxKzExKiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgbTE0LCBbdG1wcSsxMiolJXN0cl0KKworICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgbTE1LCBbcHdfNTEyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgIG05LCBbcHdfNTEyXQorICAgIFZQOV9TVE9SRV8yWCAgICAgICAgICAgIDE1LCAgOSwgMiwgNCwgMAorICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjJdCisgICAgcG11bGhyc3cgICAgICAgICAgICAgICAgbTMsIFtwd181MTJdCisgICAgcG11bGhyc3cgICAgICAgICAgICAgICAgbTYsIFtwd181MTJdCisgICAgVlA5X1NUT1JFXzJYICAgICAgICAgICAgIDMsICA2LCAyLCA0LCAwCisgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqMl0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgIG0xMywgW3B3XzUxMl0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgICAgIG0xMSwgW3B3XzUxMl0KKyAgICBWUDlfU1RPUkVfMlggICAgICAgICAgICAxMywgMTEsIDIsIDQsIDAKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSoyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgbTE0LCBbcHdfNTEyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgICAgIG04LCBbcHdfNTEyXQorICAgIFZQOV9TVE9SRV8yWCAgICAgICAgICAgIDE0LCAgOCwgMiwgNCwgMAorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIElBRFNUMTZfRk4gNQorSU5JVF9YTU0gJTUKK2NnbG9iYWwgdnA5XyUxXyUzXzE2eDE2X2FkZCwgMywgNiwgMTYsIDUxMiwgZHN0LCBzdHJpZGUsIGJsb2NrLCBjbnQsIGRzdF9iYWssIHRtcAorICAgIG1vdiAgICAgICAgICAgICAgIGNudGQsIDIKKyAgICBtb3YgICAgICAgICAgICAgICB0bXBxLCByc3AKKy5sb29wMV9mdWxsOgorICAgIFZQOV8lMl8xRCAgICAgICBibG9ja3EsIDEKKyAgICBhZGQgICAgICAgICAgICAgYmxvY2txLCAxNgorICAgIGFkZCAgICAgICAgICAgICAgIHRtcHEsIDI1NgorICAgIGRlYyAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcDFfZnVsbAorICAgIHN1YiAgICAgICAgICAgICBibG9ja3EsIDMyCisKKyAgICBtb3YgICAgICAgICAgICAgICBjbnRkLCAyCisgICAgbW92ICAgICAgICAgICAgICAgdG1wcSwgcnNwCisgICAgbW92ICAgICAgICAgICBkc3RfYmFrcSwgZHN0cQorLmxvb3AyX2Z1bGw6CisgICAgVlA5XyU0XzFEICAgICAgICAgdG1wcSwgMgorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RfYmFrcSs4XQorICAgIGFkZCAgICAgICAgICAgICAgIHRtcHEsIDE2CisgICAgZGVjICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wMl9mdWxsCisKKyAgICA7IGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AsIG0wIHNob3VsZCBzdGlsbCBiZSB6ZXJvCisgICAgOyB1c2UgdGhhdCB0byB6ZXJvIG91dCBibG9jayBjb2VmZmljaWVudHMKKyAgICBaRVJPX0JMT0NLICAgICAgYmxvY2txLCAzMiwgMTYsIG0wCisgICAgUkVUCislZW5kbWFjcm8KKworSUFEU1QxNl9GTiBpZGN0LCAgSURDVDE2LCAgaWFkc3QsIElBRFNUMTYsIHNzc2UzCitJQURTVDE2X0ZOIGlkY3QsICBJRENUMTYsICBpYWRzdCwgSUFEU1QxNiwgYXZ4CitJQURTVDE2X0ZOIGlhZHN0LCBJQURTVDE2LCBpZGN0LCAgSURDVDE2LCAgc3NzZTMKK0lBRFNUMTZfRk4gaWFkc3QsIElBRFNUMTYsIGlkY3QsICBJRENUMTYsICBhdngKK0lBRFNUMTZfRk4gaWFkc3QsIElBRFNUMTYsIGlhZHN0LCBJQURTVDE2LCBzc3NlMworSUFEU1QxNl9GTiBpYWRzdCwgSUFEU1QxNiwgaWFkc3QsIElBRFNUMTYsIGF2eAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgdnA5X2lkY3RfaWRjdF8zMngzMl9hZGRfPG9wdD4odWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jaywgaW50IGVvYik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBWUDlfSURDVDMyXzFEIDItMyAzMiA7IHNyYywgcGFzcywgbm56YworJWFzc2lnbiAlJXN0ciAxNiolMiolMgorICAgIDsgZmlyc3QgZG8gdDAtMTUsIHRoaXMgY2FuIGJlIGRvbmUgaWRlbnRpY2FsIHRvIGlkY3QxNngxNgorICAgIFZQOV9JRENUMTZfMURfU1RBUlQgJTEsICUzLzIsIDY0KjIsIHRtcHErIDQqJSVzdHIKKworICAgIDsgYmFja3VwIGEgZGlmZmVyZW50IHJlZ2lzdGVyCisgICAgbW92YSAgICBbdG1wcSszMColJXN0cl0sIG0xNSAgICA7IHQxNQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTcsIFt0bXBxKyA0KiUlc3RyXQorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDYsICA5LCAxNSAgICAgIDsgdDYsIHQ5CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDcsICA4LCAxNSAgICAgIDsgdDcsIHQ4CisKKyAgICA7IHN0b3JlIGV2ZXJ5dGhpbmcgb24gc3RhY2sgdG8gbWFrZSBzcGFjZSBhdmFpbGFibGUgZm9yIHQxNi0zMQorICAgIDsgd2Ugc3RvcmUgaW50ZXJsZWF2ZWQgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBzZWNvbmQgaGFsZiAodDE2LTMxKQorICAgIDsgc28gd2UgZG9uJ3QgbmVlZCB0byBhbGxvY2F0ZSBleHRyYSBzdGFjayBzcGFjZQorICAgIG1vdmEgICAgW3RtcHErIDAqJSVzdHJdLCBtMCAgICAgOyB0MAorICAgIG1vdmEgICAgW3RtcHErIDQqJSVzdHJdLCBtMSAgICAgOyB0MQorICAgIG1vdmEgICAgW3RtcHErIDgqJSVzdHJdLCBtMiAgICAgOyB0MgorICAgIG1vdmEgICAgW3RtcHErMTIqJSVzdHJdLCBtMyAgICAgOyB0MworICAgIG1vdmEgICAgW3RtcHErMTYqJSVzdHJdLCBtNCAgICAgOyB0NAorICAgIG1vdmEgICAgW3RtcHErMjAqJSVzdHJdLCBtNSAgICAgOyB0NQorICAgIG1vdmEgICAgW3RtcHErMjQqJSVzdHJdLCBtNiAgICAgOyB0NgorICAgIG1vdmEgICAgW3RtcHErMjgqJSVzdHJdLCBtNyAgICAgOyB0NworICAgIG1vdmEgICAgW3RtcHErIDIqJSVzdHJdLCBtOCAgICAgOyB0OAorICAgIG1vdmEgICAgW3RtcHErIDYqJSVzdHJdLCBtOSAgICAgOyB0OQorICAgIG1vdmEgICAgW3RtcHErMTAqJSVzdHJdLCBtMTAgICAgOyB0MTAKKyAgICBtb3ZhICAgIFt0bXBxKzE0KiUlc3RyXSwgbTExICAgIDsgdDExCisgICAgbW92YSAgICBbdG1wcSsxOColJXN0cl0sIG0xMiAgICA7IHQxMgorICAgIG1vdmEgICAgW3RtcHErMjIqJSVzdHJdLCBtMTMgICAgOyB0MTMKKyAgICBtb3ZhICAgIFt0bXBxKzI2KiUlc3RyXSwgbTE0ICAgIDsgdDE0CisKKyAgICA7IHRoZW4sIHNlY29uZGx5LCBkbyB0MTYtMzEKKyVpZiAlMyA8PSA4CisgICAgbW92YSAgICAgICAgICAgICAgICAgbTQsIFslMSsgMSo2NF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtMywgWyUxKyAzKjY0XQorICAgIG1vdmEgICAgICAgICAgICAgICAgIG0wLCBbJTErIDUqNjRdCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTcsIFslMSsgNyo2NF0KKworICAgIHBtdWxocnN3ICAgICAgICAgICAgbTExLCAgbTQsIFtwd18xNjM2NHgyXSA7dDMxCisgICAgcG11bGhyc3cgICAgICAgICAgICAgbTQsIFtwd184MDR4Ml0gO3QxNgorICAgIHBtdWxocnN3ICAgICAgICAgICAgIG04LCAgbTcsIFtwd19tNTUyMHgyXSA7dDE5CisgICAgcG11bGhyc3cgICAgICAgICAgICAgbTcsIFtwd18xNTQyNngyXSA7dDI4CisgICAgcG11bGhyc3cgICAgICAgICAgICBtMTUsICBtMCwgW3B3XzE1ODkzeDJdIDt0MjcKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICBtMCwgW3B3XzM5ODF4Ml0gO3QyMAorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTEyLCAgbTMsIFtwd19tMjQwNHgyXSA7dDIzCisgICAgcG11bGhyc3cgICAgICAgICAgICAgbTMsIFtwd18xNjIwN3gyXSA7dDI0CisKKyAgICA7IG00PXQxNi8xNywgbTg9dDE4LzE5LCBtMD10MjAvMjEsIG0xMj10MjIvMjMsCisgICAgOyBtMz10MjQvMjUsIG0xNT10MjYvMjcsIG03PXQyOC8yOSwgbTExPXQzMC8zMQorCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggICA1LCAxMCwgMTEsICA0LCAxNjA2OSwgIDMxOTYsIFtwZF84MTkyXSwgNiwgIDkgOyB0MTcsIHQzMAorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICAgOSwgIDYsICA3LCAgOCwgMzE5NiwgbTE2MDY5LCBbcGRfODE5Ml0sIDEsIDE0IDsgdDE4LCB0MjkKKyAgICA7IGZyb20gMSBzdGFnZSBmb3J3YXJkCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgICAgICB3LCAgOCwgIDQsICAxCisgICAgOyB0ZW1wb3Jhcnkgc3RvcmFnZQorICAgIG1vdmEgICAgW3RtcHErMTcqJSVzdHJdLCBtOCAgICAgICAgICAgICA7IHQxNgorICAgIG1vdmEgICAgW3RtcHErMjEqJSVzdHJdLCBtNCAgICAgICAgICAgICA7IHQxOQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICAgMSwgMTQsIDE1LCAgMCwgIDkxMDIsIDEzNjIzLCBbcGRfODE5Ml0sIDQsICA4IDsgdDIxLCB0MjYKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgMTMsICAyLCAgMywgMTIsIDEzNjIzLCBtOTEwMiwgW3BkXzgxOTJdLCA0LCAgOCA7IHQyMiwgdDI1CisKKyAgICA7IG00PXQxNiwgbTU9dDE3LCBtOT10MTgsIG04PXQxOSwgbTA9dDIwLCBtMT10MjEsIG0xMz10MjIsIG0xMj10MjMsCisgICAgOyBtMz10MjQsIG0yPXQyNSwgbTE0PXQyNiwgbTE1PXQyNywgbTc9dDI4LCBtNj10MjksIG0xMD10MzAsIG0xMT10MzEKKyVlbHNlCisgICAgbW92YSAgICAgICAgICAgICAgICBtMTAsIFslMSsgMSo2NF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xMywgWyUxKyAzKjY0XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTE0LCBbJTErIDUqNjRdCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTksIFslMSsgNyo2NF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtOCwgWyUxKyA5KjY0XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTE1LCBbJTErMTEqNjRdCisgICAgbW92YSAgICAgICAgICAgICAgICBtMTIsIFslMSsxMyo2NF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xMSwgWyUxKzE1KjY0XQorJWlmICUzIDw9IDE2CisgICAgcG11bGhyc3cgICAgICAgICAgICAgbTUsIG0xMCwgW3B3XzE2MzY0eDJdCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMTAsIFtwd184MDR4Ml0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgICBtNCwgbTExLCBbcHdfbTExMDAzeDJdCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMTEsIFtwd18xMjE0MHgyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgIG03LCAgbTgsIFtwd18xNDgxMXgyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgIG04LCBbcHdfNzAwNXgyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgIG02LCAgbTksIFtwd19tNTUyMHgyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgIG05LCBbcHdfMTU0MjZ4Ml0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgICBtMSwgbTE0LCBbcHdfMTU4OTN4Ml0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0xNCwgW3B3XzM5ODF4Ml0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgICBtMCwgbTE1LCBbcHdfbTg0MjN4Ml0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0xNSwgW3B3XzE0MDUzeDJdCislZWxzZQorICAgIG1vdmEgICAgICAgICAgICAgICAgIG00LCBbJTErMTcqNjRdCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTAsIFslMSsyMSo2NF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtNywgWyUxKzIzKjY0XQorICAgIG1vdmEgICAgICAgICAgICAgICAgIG02LCBbJTErMjUqNjRdCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTEsIFslMSsyNyo2NF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtNSwgWyUxKzMxKjY0XQorCisgICAgOyBtMTA9aW4xLCBtND1pbjE3LCBtOD1pbjksIG02PWluMjUsIG0xND1pbjUsIG0wPWluMjEsIG0xMj1pbjEzLCBtMj1pbjI5LAorICAgIDsgbTEzPWluMywgbTM9aW4xOSwgbTE1PWluMTEsIG0xPWluMjcsIG05PWluNywgbTc9aW4yMywgbTExPWluMTUsIG01PWluMzEKKworICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICAxMCwgIDUsIDE2MzY0LCAgIDgwNCwgW3BkXzgxOTJdLCAyLCAzIDsgdDE2LCB0MzEKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgIDQsIDExLCAxMTAwMywgMTIxNDAsIFtwZF84MTkyXSwgMiwgMyA7IHQxNywgdDMwCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggICA4LCAgNywgMTQ4MTEsICA3MDA1LCBbcGRfODE5Ml0sIDIsIDMgOyB0MTgsIHQyOQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICAgNiwgIDksICA1NTIwLCAxNTQyNiwgW3BkXzgxOTJdLCAyLCAzIDsgdDE5LCB0MjgKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgMTQsICAxLCAxNTg5MywgIDM5ODEsIFtwZF84MTkyXSwgMiwgMyA7IHQyMCwgdDI3CisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggICAwLCAxNSwgIDg0MjMsIDE0MDUzLCBbcGRfODE5Ml0sIDIsIDMgOyB0MjEsIHQyNgorJWVuZGlmCisKKyAgICA7IGZyb20gMSBzdGFnZSBmb3J3YXJkCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICA0LCAxMCwgIDIKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgIDgsICA2LCAgMgorICAgIDsgZnJvbSAyIHN0YWdlcyBmb3J3YXJkCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICA4LCAgNCwgIDIKKyAgICA7IHRlbXBvcmFyeSBzdG9yYWdlCisgICAgbW92YSAgICBbdG1wcSsxNyolJXN0cl0sIG04ICAgICAgICAgICAgIDsgdDE2CisgICAgbW92YSAgICBbdG1wcSsyMSolJXN0cl0sIG00ICAgICAgICAgICAgIDsgdDE5CislaWYgJTMgPD0gMTYKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICBtMywgbTEyLCBbcHdfMTMxNjB4Ml0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0xMiwgW3B3Xzk3NjB4Ml0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgICBtMiwgbTEzLCBbcHdfbTI0MDR4Ml0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0xMywgW3B3XzE2MjA3eDJdCislZWxzZQorICAgIG1vdmEgICAgICAgICAgICAgICAgIG0yLCBbJTErMjkqNjRdCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTMsIFslMSsxOSo2NF0KKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgMTIsICAzLCAxMzE2MCwgIDk3NjAsIFtwZF84MTkyXSwgNCwgOCA7IHQyMiwgdDI1CisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggICAyLCAxMywgIDI0MDQsIDE2MjA3LCBbcGRfODE5Ml0sIDQsIDggOyB0MjMsIHQyNAorJWVuZGlmCisKKyAgICA7IG0xMD10MTYsIG00PXQxNywgbTg9dDE4LCBtNj10MTksIG0xND10MjAsIG0wPXQyMSwgbTEyPXQyMiwgbTI9dDIzLAorICAgIDsgbTEzPXQyNCwgbTM9dDI1LCBtMTU9dDI2LCBtMT10MjcsIG05PXQyOCwgbTc9dDI5LCBtMTE9dDMwLCBtNT10MzEKKworICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgMCwgMTQsICA0CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsIDEyLCAgMiwgIDQKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgIDMsIDEzLCAgNAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAxNSwgIDEsICA0CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICA3LCAgOSwgIDQKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgMTEsICA1LCAgNAorCisgICAgOyBtND10MTYsIG0xMD10MTcsIG02PXQxOCwgbTg9dDE5LCBtMD10MjAsIG0xND10MjEsIG0yPXQyMiwgbTEyPXQyMywKKyAgICA7IG0zPXQyNCwgbTEzPXQyNSwgbTE9dDI2LCBtMTU9dDI3LCBtNz10MjgsIG05PXQyOSwgbTU9dDMwLCBtMTE9dDMxCisKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgIDUsIDEwLCAxNjA2OSwgIDMxOTYsIFtwZF84MTkyXSwgNCwgOCA7IHQxNywgdDMwCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggICA5LCAgNiwgMzE5NiwgbTE2MDY5LCBbcGRfODE5Ml0sIDQsIDggOyB0MTgsIHQyOQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICAgMSwgMTQsICA5MTAyLCAxMzYyMywgW3BkXzgxOTJdLCA0LCA4IDsgdDIxLCB0MjYKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgMTMsICAyLCAxMzYyMywgbTkxMDIsIFtwZF84MTkyXSwgNCwgOCA7IHQyMiwgdDI1CislZW5kaWYKKworICAgIDsgbTQ9dDE2LCBtNT10MTcsIG05PXQxOCwgbTg9dDE5LCBtMD10MjAsIG0xPXQyMSwgbTEzPXQyMiwgbTEyPXQyMywKKyAgICA7IG0zPXQyNCwgbTI9dDI1LCBtMTQ9dDI2LCBtMTU9dDI3LCBtNz10MjgsIG02PXQyOSwgbTEwPXQzMCwgbTExPXQzMQorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICA5LCAgNSwgIDQKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgIDEsIDEzLCAgNAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgMCwgMTIsICA0CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsIDE1LCAgMywgIDQKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgMTQsICAyLCAgNAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgNiwgMTAsICA0CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICA3LCAxMSwgIDQKKworICAgIDsgbThbc109dDE2LCBtOT10MTcsIG01PXQxOCwgbTRbc109dDE5LCBtMTI9dDIwLCBtMTM9dDIxLCBtMT10MjIsIG0wPXQyMywKKyAgICA7IG0xNT10MjQsIG0xND10MjUsIG0yPXQyNiwgbTM9dDI3LCBtMTE9dDI4LCBtMTA9dDI5LCBtNj10MzAsIG03PXQzMQorCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTgsIFt0bXBxKzE3KiUlc3RyXSA7IHQxNgorICAgIDsgZnJvbSAyIHN0YWdlcyBmb3J3YXJkCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICAwLCAgOCwgIDQKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgMTUsICA3LCAgNAorICAgIDsgZnJvbSAzIHN0YWdlcyBmb3J3YXJkCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICA4LCAgNywgIDQKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICBtNywgW3B3XzExNTg1eDJdCisgICAgcG11bGhyc3cgICAgICAgICAgICAgbTgsIFtwd18xMTU4NXgyXQorICAgIDsgc3RvcmUgdDE2L3QyMworICAgIG1vdmEgICAgW3RtcHErIDEqJSVzdHJdLCBtMCAgICAgOyB0MTYKKyAgICBtb3ZhICAgIFt0bXBxKzI5KiUlc3RyXSwgbTcgICAgIDsgdDIzCisKKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtNCwgW3RtcHErMjEqJSVzdHJdIDsgdDE5CisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggIDEwLCAgNSwgMTUxMzcsICA2MjcwLCBbcGRfODE5Ml0sIDAsIDcgOyB0MTgsIHQyOQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICAxMSwgIDQsIDE1MTM3LCAgNjI3MCwgW3BkXzgxOTJdLCAwLCA3IDsgdDE5LCB0MjgKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgIDMsIDEyLCA2MjcwLCBtMTUxMzcsIFtwZF84MTkyXSwgMCwgNyA7IHQyMCwgdDI3CisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggICAyLCAxMywgNjI3MCwgbTE1MTM3LCBbcGRfODE5Ml0sIDAsIDcgOyB0MjEsIHQyNgorCisgICAgOyBtOD10MTYsIG05PXQxNywgbTEwPXQxOCwgbTExPXQxOSwgbTM9dDIwLCBtMj10MjEsIG0xPXQyMiwgbTA9dDIzLAorICAgIDsgbTE1PXQyNCwgbTE0PXQyNSwgbTEzPXQyNiwgbTEyPXQyNywgbTQ9dDI4LCBtNT10MjksIG02PXQzMCwgbTc9dDMxCisKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgIDEsICA5LCAgMAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgMiwgMTAsICAwCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICAzLCAxMSwgIDAKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgMTIsICA0LCAgMAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAxMywgIDUsICAwCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsIDE0LCAgNiwgIDAKKworICAgIDsgbTA9dDE2LCBtMT10MTcsIG0yPXQxOCwgbTM9dDE5LCBtMTE9dDIwLCBtMTA9dDIxLCBtOT10MjIsIG04PXQyMywKKyAgICA7IG03PXQyNCwgbTY9dDI1LCBtNT10MjYsIG00PXQyNywgbTEyPXQyOCwgbTEzPXQyOSwgbTE0PXQzMCwgbTE1PXQzMQorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICA5LCAgNiwgIDAKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgMTAsICA1LCAgMAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAxMSwgIDQsICAwCisKKyAgICBwbXVsaHJzdyAgICAgICAgICAgICBtNiwgW3B3XzExNTg1eDJdCisgICAgcG11bGhyc3cgICAgICAgICAgICAgbTksIFtwd18xMTU4NXgyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgIG01LCBbcHdfMTE1ODV4Ml0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0xMCwgW3B3XzExNTg1eDJdCisgICAgcG11bGhyc3cgICAgICAgICAgICAgbTQsIFtwd18xMTU4NXgyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTExLCBbcHdfMTE1ODV4Ml0KKworICAgIDsgbTA9dDE2LCBtMT10MTcsIG0yPXQxOCwgbTM9dDE5LCBtND10MjAsIG01PXQyMSwgbTY9dDIyLCBtNz10MjMsCisgICAgOyBtOD10MjQsIG05PXQyNSwgbTEwPXQyNiwgbTExPXQyNywgbTEyPXQyOCwgbTEzPXQyOSwgbTE0PXQzMCwgbTE1PXQzMQorCisgICAgOyBzdG9yZSB0MTctMTkgKGFuZCB0MjAtMjIgZm9yIHBhc3MgMSkgLSBrZWVwIHQyNC0zMSBpbiByZWdpc3RlcnMgZm9yCisgICAgOyBmaW5hbCBzdW1zdWIgaW4gcGFzcyAxLCBvciBrZWVwIHQyMC0yMiBhbmQgdDI0LTMxIGluIHJlZ2lzdGVycyBmb3IKKyAgICA7IGZpbmFsIHN1bXN1YiBvZiBwYXNzIDIKKyAgICBtb3ZhICAgIFt0bXBxKyA1KiUlc3RyXSwgbTEgICAgIDsgdDE3CisgICAgbW92YSAgICBbdG1wcSsgOSolJXN0cl0sIG0yICAgICA7IHQxOAorICAgIG1vdmEgICAgW3RtcHErMTMqJSVzdHJdLCBtMyAgICAgOyB0MTkKKworICAgIDsgdGhlbiBkbyBmaW5hbCBwYXNzIHRvIHN1bXN1YitzdG9yZSB0aGUgdHdvIGhhbHZlcworJWlmICUyID09IDEKKyAgICBtb3ZhICAgIFt0bXBxKzE3KiUlc3RyXSwgbTQgICAgIDsgdDIwCisgICAgbW92YSAgICBbdG1wcSsyMSolJXN0cl0sIG01ICAgICA7IHQyMQorICAgIG1vdmEgICAgW3RtcHErMjUqJSVzdHJdLCBtNiAgICAgOyB0MjIKKworICAgIG1vdmEgICAgICAgICAgICAgICAgIG0wLCBbdG1wcSsgMColJXN0cl0gOyB0MAorICAgIG1vdmEgICAgICAgICAgICAgICAgIG0xLCBbdG1wcSsgNColJXN0cl0gOyB0MQorICAgIG1vdmEgICAgICAgICAgICAgICAgIG0yLCBbdG1wcSsgOColJXN0cl0gOyB0MgorICAgIG1vdmEgICAgICAgICAgICAgICAgIG0zLCBbdG1wcSsxMiolJXN0cl0gOyB0MworICAgIG1vdmEgICAgICAgICAgICAgICAgIG00LCBbdG1wcSsxNiolJXN0cl0gOyB0NAorICAgIG1vdmEgICAgICAgICAgICAgICAgIG01LCBbdG1wcSsyMColJXN0cl0gOyB0NQorICAgIG1vdmEgICAgICAgICAgICAgICAgIG02LCBbdG1wcSsyNColJXN0cl0gOyB0NgorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsIDE1LCAgMCwgNworICAgIG1vdmEgICAgW3RtcHErIDMqJSVzdHJdLCBtMCAgICAgICAgICAgICAgOyB0MTUKKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtNywgW3RtcHErMjgqJSVzdHJdIDsgdDcKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgMTQsICAxLCAwCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsIDEzLCAgMiwgMAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAxMiwgIDMsIDAKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgMTEsICA0LCAwCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsIDEwLCAgNSwgMAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgOSwgIDYsIDAKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgIDgsICA3LCAwCisKKyAgICBUUkFOU1BPU0U4eDhXICAgICAgICAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCAwCisgICAgbW92YSAgICBbdG1wcSsgMColJXN0cl0sIG0xNQorICAgIG1vdmEgICAgW3RtcHErIDQqJSVzdHJdLCBtMTQKKyAgICBtb3ZhICAgIFt0bXBxKyA4KiUlc3RyXSwgbTEzCisgICAgbW92YSAgICBbdG1wcSsxMiolJXN0cl0sIG0xMgorICAgIG1vdmEgICAgW3RtcHErMTYqJSVzdHJdLCBtMTEKKyAgICBtb3ZhICAgIFt0bXBxKzIwKiUlc3RyXSwgbTEwCisgICAgbW92YSAgICBbdG1wcSsyNColJXN0cl0sIG05CisgICAgbW92YSAgICBbdG1wcSsyOColJXN0cl0sIG04CisKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgbTAsIFt0bXBxKyAzKiUlc3RyXSA7IHQxNQorICAgIFRSQU5TUE9TRTh4OFcgICAgICAgICAgNywgNiwgNSwgNCwgMywgMiwgMSwgMCwgOAorICAgIG1vdmEgICAgW3RtcHErIDMqJSVzdHJdLCBtNworICAgIG1vdmEgICAgW3RtcHErIDcqJSVzdHJdLCBtNgorICAgIG1vdmEgICAgW3RtcHErMTEqJSVzdHJdLCBtNQorICAgIG1vdmEgICAgW3RtcHErMTUqJSVzdHJdLCBtNAorICAgIG1vdmEgICAgW3RtcHErMTkqJSVzdHJdLCBtMworICAgIG1vdmEgICAgW3RtcHErMjMqJSVzdHJdLCBtMgorICAgIG1vdmEgICAgW3RtcHErMjcqJSVzdHJdLCBtMQorICAgIG1vdmEgICAgW3RtcHErMzEqJSVzdHJdLCBtMAorCisgICAgbW92YSAgICAgICAgICAgICAgICBtMTUsIFt0bXBxKyAyKiUlc3RyXSA7IHQ4CisgICAgbW92YSAgICAgICAgICAgICAgICBtMTQsIFt0bXBxKyA2KiUlc3RyXSA7IHQ5CisgICAgbW92YSAgICAgICAgICAgICAgICBtMTMsIFt0bXBxKzEwKiUlc3RyXSA7IHQxMAorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEyLCBbdG1wcSsxNColJXN0cl0gOyB0MTEKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xMSwgW3RtcHErMTgqJSVzdHJdIDsgdDEyCisgICAgbW92YSAgICAgICAgICAgICAgICBtMTAsIFt0bXBxKzIyKiUlc3RyXSA7IHQxMworICAgIG1vdmEgICAgICAgICAgICAgICAgIG05LCBbdG1wcSsyNiolJXN0cl0gOyB0MTQKKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtOCwgW3RtcHErMzAqJSVzdHJdIDsgdDE1CisgICAgbW92YSAgICAgICAgICAgICAgICAgbTcsIFt0bXBxKyAxKiUlc3RyXSA7IHQxNgorICAgIG1vdmEgICAgICAgICAgICAgICAgIG02LCBbdG1wcSsgNSolJXN0cl0gOyB0MTcKKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtNSwgW3RtcHErIDkqJSVzdHJdIDsgdDE4CisgICAgbW92YSAgICAgICAgICAgICAgICAgbTQsIFt0bXBxKzEzKiUlc3RyXSA7IHQxOQorICAgIG1vdmEgICAgICAgICAgICAgICAgIG0zLCBbdG1wcSsxNyolJXN0cl0gOyB0MjAKKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtMiwgW3RtcHErMjEqJSVzdHJdIDsgdDIxCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTEsIFt0bXBxKzI1KiUlc3RyXSA7IHQyMgorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICA3LCAgOCwgMAorICAgIG1vdmEgICAgW3RtcHErIDIqJSVzdHJdLCBtOAorICAgIG1vdmEgICAgICAgICAgICAgICAgIG0wLCBbdG1wcSsyOSolJXN0cl0gOyB0MjMKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgIDYsICA5LCA4CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICA1LCAxMCwgOAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgNCwgMTEsIDgKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgIDMsIDEyLCA4CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICAyLCAxMywgOAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgMSwgMTQsIDgKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgIDAsIDE1LCA4CisKKyAgICBUUkFOU1BPU0U4eDhXICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOAorICAgIG1vdmEgICAgW3RtcHErIDEqJSVzdHJdLCBtMAorICAgIG1vdmEgICAgW3RtcHErIDUqJSVzdHJdLCBtMQorICAgIG1vdmEgICAgW3RtcHErIDkqJSVzdHJdLCBtMgorICAgIG1vdmEgICAgW3RtcHErMTMqJSVzdHJdLCBtMworICAgIG1vdmEgICAgW3RtcHErMTcqJSVzdHJdLCBtNAorICAgIG1vdmEgICAgW3RtcHErMjEqJSVzdHJdLCBtNQorICAgIG1vdmEgICAgW3RtcHErMjUqJSVzdHJdLCBtNgorICAgIG1vdmEgICAgW3RtcHErMjkqJSVzdHJdLCBtNworCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTgsIFt0bXBxKyAyKiUlc3RyXQorICAgIFRSQU5TUE9TRTh4OFcgICAgICAgICA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAwCisgICAgbW92YSAgICBbdG1wcSsgMiolJXN0cl0sIG04CisgICAgbW92YSAgICBbdG1wcSsgNiolJXN0cl0sIG05CisgICAgbW92YSAgICBbdG1wcSsxMColJXN0cl0sIG0xMAorICAgIG1vdmEgICAgW3RtcHErMTQqJSVzdHJdLCBtMTEKKyAgICBtb3ZhICAgIFt0bXBxKzE4KiUlc3RyXSwgbTEyCisgICAgbW92YSAgICBbdG1wcSsyMiolJXN0cl0sIG0xMworICAgIG1vdmEgICAgW3RtcHErMjYqJSVzdHJdLCBtMTQKKyAgICBtb3ZhICAgIFt0bXBxKzMwKiUlc3RyXSwgbTE1CislZWxzZQorICAgIDsgdDAtNyBpcyBpbiBbdG1wcSt7MCw0LDgsMTIsMTYsMjAsMjQsMjh9KiUlc3RyXQorICAgIDsgdDgtMTUgaXMgaW4gW3RtcHErezIsNiwxMCwxNCwxOCwyMiwyNiwzMH0qJSVzdHJdCisgICAgOyB0MTYtMTkgYW5kIHQyMyBpcyBpbiBbdG1wcSt7MSw1LDksMTMsMjl9KiUlc3RyXQorICAgIDsgdDIwLTIyIGlzIGluIG00LTYKKyAgICA7IHQyNC0zMSBpcyBpbiBtOC0xNQorICAgIHB4b3IgICAgICAgICAgICAgICAgbTcsIG03CisKKyVtYWNybyAlJVNUT1JFXzJYMiA3LTggMSA7IHNyY1sxLTRdLCB0bXBbMS0yXSwgemVybywgaW5jX2RzdF9wdHJzCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgJTQsICUxLCAlNQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICUzLCAlMiwgJTUKKyAgICBwbXVsaHJzdyAgICAgICAgICAgbSU0LCBbcHdfNTEyXQorICAgIHBtdWxocnN3ICAgICAgICAgICBtJTMsIFtwd181MTJdCisgICAgVlA5X1NUT1JFXzJYICAgICAgICAlNCwgJTMsICU1LCAlNiwgJTcKKyVpZiAlOCA9PSAxCisgICAgYWRkICAgICAgICAgICAgICAgZHN0cSwgc3RyaWRlMnEKKyVlbmRpZgorICAgIHBtdWxocnN3ICAgICAgICAgICBtJTIsIFtwd181MTJdCisgICAgcG11bGhyc3cgICAgICAgICAgIG0lMSwgW3B3XzUxMl0KKyAgICBWUDlfU1RPUkVfMlggICAgICAgICUyLCAlMSwgJTUsICU2LCAlNywgZHN0X2VuZHEKKyVpZiAlOCA9PSAxCisgICAgc3ViICAgICAgICAgICBkc3RfZW5kcSwgc3RyaWRlMnEKKyVlbmRpZgorJWVuZG1hY3JvCisKKyAgICA7IHN0b3JlIHQwLTEgYW5kIHQzMC0zMQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTAsIFt0bXBxKyAwKiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEsIFt0bXBxKyA0KiUlc3RyXQorICAgICUlU1RPUkVfMlgyICAgICAgICAgIDAsICAxLCAxNCwgMTUsIDIsIDMsIDcKKworICAgIDsgc3RvcmUgdDItMyBhbmQgdDI4LTI5CisgICAgbW92YSAgICAgICAgICAgICAgICBtMCwgW3RtcHErIDgqJSVzdHJdCisgICAgbW92YSAgICAgICAgICAgICAgICBtMSwgW3RtcHErMTIqJSVzdHJdCisgICAgJSVTVE9SRV8yWDIgICAgICAgICAgMCwgIDEsIDEyLCAxMywgMiwgMywgNworCisgICAgOyBzdG9yZSB0NC01IGFuZCB0MjYtMjcKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0wLCBbdG1wcSsxNiolJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xLCBbdG1wcSsyMColJXN0cl0KKyAgICAlJVNUT1JFXzJYMiAgICAgICAgICAwLCAgMSwgMTAsIDExLCAyLCAzLCA3CisKKyAgICA7IHN0b3JlIHQ2LTcgYW5kIHQyNC0yNQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTAsIFt0bXBxKzI0KiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEsIFt0bXBxKzI4KiUlc3RyXQorICAgICUlU1RPUkVfMlgyICAgICAgICAgIDAsICAxLCAgOCwgIDksIDIsIDMsIDcKKworICAgIDsgc3RvcmUgdDgtOSBhbmQgdDIyLTIzCisgICAgbW92YSAgICAgICAgICAgICAgICBtMCwgW3RtcHErIDIqJSVzdHJdCisgICAgbW92YSAgICAgICAgICAgICAgICBtMSwgW3RtcHErIDYqJSVzdHJdCisgICAgbW92YSAgICAgICAgICAgICAgICBtOCwgW3RtcHErMjkqJSVzdHJdCisgICAgJSVTVE9SRV8yWDIgICAgICAgICAgMCwgIDEsICA2LCAgOCwgMiwgMywgNworCisgICAgOyBzdG9yZSB0MTAtMTEgYW5kIHQyMC0yMQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTAsIFt0bXBxKzEwKiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEsIFt0bXBxKzE0KiUlc3RyXQorICAgICUlU1RPUkVfMlgyICAgICAgICAgIDAsICAxLCAgNCwgIDUsIDIsIDMsIDcKKworICAgIDsgc3RvcmUgdDEyLTEzIGFuZCB0MTgtMTkKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0wLCBbdG1wcSsxOColJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xLCBbdG1wcSsyMiolJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG01LCBbdG1wcSsxMyolJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG00LCBbdG1wcSsgOSolJXN0cl0KKyAgICAlJVNUT1JFXzJYMiAgICAgICAgICAwLCAgMSwgIDQsICA1LCAyLCAzLCA3CisKKyAgICA7IHN0b3JlIHQxNC0xNworICAgIG1vdmEgICAgICAgICAgICAgICAgbTAsIFt0bXBxKzI2KiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEsIFt0bXBxKzMwKiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTUsIFt0bXBxKyA1KiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTQsIFt0bXBxKyAxKiUlc3RyXQorICAgICUlU1RPUkVfMlgyICAgICAgICAgIDAsICAxLCAgNCwgIDUsIDIsIDMsIDcsIDAKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBWUDlfSURDVF9JRENUXzMyeDMyX0FERF9YTU0gMQorSU5JVF9YTU0gJTEKK2NnbG9iYWwgdnA5X2lkY3RfaWRjdF8zMngzMl9hZGQsIDQsIDksIDE2LCAyMDQ4LCBkc3QsIHN0cmlkZSwgYmxvY2ssIGVvYgorICAgIGNtcCBlb2JkLCAxMzUKKyAgICBqZyAuaWRjdGZ1bGwKKyAgICBjbXAgZW9iZCwgMzQKKyAgICBqZyAuaWRjdDE2eDE2CisgICAgY21wIGVvYmQsIDEKKyAgICBqZyAuaWRjdDh4OAorCisgICAgOyBkYy1vbmx5IGNhc2UKKyAgICBtb3ZkICAgICAgICAgICAgICAgIG0wLCBbYmxvY2txXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEsIFtwd18xMTU4NXgyXQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTAsIG0xCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMCwgbTEKKyAgICBTUExBVFcgICAgICAgICAgICAgIG0wLCBtMCwgcTAwMDAKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBbcHdfNTEyXQorICAgIHB4b3IgICAgICAgICAgICAgICAgbTUsIG01CisgICAgbW92ZCAgICAgICAgICBbYmxvY2txXSwgbTUKKyAgICBERUZJTkVfQVJHUyAgICAgICAgZHN0LCBzdHJpZGUsIGJsb2NrLCBjbnQKKyVyZXAgMzEKKyAgICBWUDlfU1RPUkVfMlhGVUxMICAgIDAsIDEsIDIsIDMsIDQsIDUsIG1tc2l6ZQorICAgIGFkZCAgICAgICAgICAgICAgIGRzdHEsIHN0cmlkZXEKKyVlbmRyZXAKKyAgICBWUDlfU1RPUkVfMlhGVUxMICAgIDAsIDEsIDIsIDMsIDQsIDUsIG1tc2l6ZQorICAgIFJFVAorCisgICAgREVGSU5FX0FSR1MgZHN0X2Jhaywgc3RyaWRlLCBibG9jaywgY250LCBkc3QsIHN0cmlkZTMwLCBkc3RfZW5kLCBzdHJpZGUyLCB0bXAKKy5pZGN0OHg4OgorICAgIG1vdiAgICAgICAgICAgICAgIHRtcHEsIHJzcAorICAgIFZQOV9JRENUMzJfMUQgICBibG9ja3EsIDEsIDgKKworICAgIG1vdiAgICAgICAgICBzdHJpZGUzMHEsIHN0cmlkZXEgICAgICAgICA7IHN0cmlkZQorICAgIGxlYSAgICAgICAgICAgc3RyaWRlMnEsIFtzdHJpZGVxKjJdICAgICA7IHN0cmlkZSoyCisgICAgc2hsICAgICAgICAgIHN0cmlkZTMwcSwgNSAgICAgICAgICAgICAgIDsgc3RyaWRlKjMyCisgICAgbW92ICAgICAgICAgICAgICAgY250ZCwgNAorICAgIHN1YiAgICAgICAgICBzdHJpZGUzMHEsIHN0cmlkZTJxICAgICAgICA7IHN0cmlkZSozMAorLmxvb3AyXzh4ODoKKyAgICBtb3YgICAgICAgICAgICAgICBkc3RxLCBkc3RfYmFrcQorICAgIGxlYSAgICAgICAgICAgZHN0X2VuZHEsIFtkc3RfYmFrcStzdHJpZGUzMHFdCisgICAgVlA5X0lEQ1QzMl8xRCAgICAgdG1wcSwgMiwgOAorICAgIGFkZCAgICAgICAgICAgZHN0X2Jha3EsIDgKKyAgICBhZGQgICAgICAgICAgICAgICB0bXBxLCAxNgorICAgIGRlYyAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcDJfOHg4CisKKyAgICA7IGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AsIG03IHNob3VsZCBzdGlsbCBiZSB6ZXJvCisgICAgOyB1c2UgdGhhdCB0byB6ZXJvIG91dCBibG9jayBjb2VmZmljaWVudHMKKyAgICBaRVJPX0JMT0NLICAgICAgYmxvY2txLCA2NCwgIDgsIG03CisgICAgUkVUCisKKy5pZGN0MTZ4MTY6CisgICAgbW92ICAgICAgICAgICAgICAgY250ZCwgMgorICAgIG1vdiAgICAgICAgICAgICAgIHRtcHEsIHJzcAorLmxvb3AxXzE2eDE2OgorICAgIFZQOV9JRENUMzJfMUQgICBibG9ja3EsIDEsIDE2CisgICAgYWRkICAgICAgICAgICAgIGJsb2NrcSwgMTYKKyAgICBhZGQgICAgICAgICAgICAgICB0bXBxLCA1MTIKKyAgICBkZWMgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AxXzE2eDE2CisgICAgc3ViICAgICAgICAgICAgIGJsb2NrcSwgMzIKKworICAgIG1vdiAgICAgICAgICBzdHJpZGUzMHEsIHN0cmlkZXEgICAgICAgICA7IHN0cmlkZQorICAgIGxlYSAgICAgICAgICAgc3RyaWRlMnEsIFtzdHJpZGVxKjJdICAgICA7IHN0cmlkZSoyCisgICAgc2hsICAgICAgICAgIHN0cmlkZTMwcSwgNSAgICAgICAgICAgICAgIDsgc3RyaWRlKjMyCisgICAgbW92ICAgICAgICAgICAgICAgY250ZCwgNAorICAgIG1vdiAgICAgICAgICAgICAgIHRtcHEsIHJzcAorICAgIHN1YiAgICAgICAgICBzdHJpZGUzMHEsIHN0cmlkZTJxICAgICAgICA7IHN0cmlkZSozMAorLmxvb3AyXzE2eDE2OgorICAgIG1vdiAgICAgICAgICAgICAgIGRzdHEsIGRzdF9iYWtxCisgICAgbGVhICAgICAgICAgICBkc3RfZW5kcSwgW2RzdF9iYWtxK3N0cmlkZTMwcV0KKyAgICBWUDlfSURDVDMyXzFEICAgICB0bXBxLCAyLCAxNgorICAgIGFkZCAgICAgICAgICAgZHN0X2Jha3EsIDgKKyAgICBhZGQgICAgICAgICAgICAgICB0bXBxLCAxNgorICAgIGRlYyAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcDJfMTZ4MTYKKworICAgIDsgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCwgbTcgc2hvdWxkIHN0aWxsIGJlIHplcm8KKyAgICA7IHVzZSB0aGF0IHRvIHplcm8gb3V0IGJsb2NrIGNvZWZmaWNpZW50cworICAgIFpFUk9fQkxPQ0sgICAgICBibG9ja3EsIDY0LCAxNiwgbTcKKyAgICBSRVQKKworLmlkY3RmdWxsOgorICAgIG1vdiAgICAgICAgICAgICAgIGNudGQsIDQKKyAgICBtb3YgICAgICAgICAgICAgICB0bXBxLCByc3AKKy5sb29wMV9mdWxsOgorICAgIFZQOV9JRENUMzJfMUQgICBibG9ja3EsIDEKKyAgICBhZGQgICAgICAgICAgICAgYmxvY2txLCAxNgorICAgIGFkZCAgICAgICAgICAgICAgIHRtcHEsIDUxMgorICAgIGRlYyAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcDFfZnVsbAorICAgIHN1YiAgICAgICAgICAgICBibG9ja3EsIDY0CisKKyAgICBtb3YgICAgICAgICAgc3RyaWRlMzBxLCBzdHJpZGVxICAgICAgICAgOyBzdHJpZGUKKyAgICBsZWEgICAgICAgICAgIHN0cmlkZTJxLCBbc3RyaWRlcSoyXSAgICAgOyBzdHJpZGUqMgorICAgIHNobCAgICAgICAgICBzdHJpZGUzMHEsIDUgICAgICAgICAgICAgICA7IHN0cmlkZSozMgorICAgIG1vdiAgICAgICAgICAgICAgIGNudGQsIDQKKyAgICBtb3YgICAgICAgICAgICAgICB0bXBxLCByc3AKKyAgICBzdWIgICAgICAgICAgc3RyaWRlMzBxLCBzdHJpZGUycSAgICAgICAgOyBzdHJpZGUqMzAKKy5sb29wMl9mdWxsOgorICAgIG1vdiAgICAgICAgICAgICAgIGRzdHEsIGRzdF9iYWtxCisgICAgbGVhICAgICAgICAgICBkc3RfZW5kcSwgW2RzdF9iYWtxK3N0cmlkZTMwcV0KKyAgICBWUDlfSURDVDMyXzFEICAgICB0bXBxLCAyCisgICAgYWRkICAgICAgICAgICBkc3RfYmFrcSwgOAorICAgIGFkZCAgICAgICAgICAgICAgIHRtcHEsIDE2CisgICAgZGVjICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wMl9mdWxsCisKKyAgICA7IGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AsIG03IHNob3VsZCBzdGlsbCBiZSB6ZXJvCisgICAgOyB1c2UgdGhhdCB0byB6ZXJvIG91dCBibG9jayBjb2VmZmljaWVudHMKKyAgICBaRVJPX0JMT0NLICAgICAgYmxvY2txLCA2NCwgMzIsIG03CisgICAgUkVUCislZW5kbWFjcm8KKworVlA5X0lEQ1RfSURDVF8zMngzMl9BRERfWE1NIHNzc2UzCitWUDlfSURDVF9JRENUXzMyeDMyX0FERF9YTU0gYXZ4CisKKyVlbmRpZiA7IHg4Ni02NApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwOWxwZi5hc20gYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdnA5bHBmLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTZmMDhmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwOWxwZi5hc20KQEAgLTAsMCArMSw4MTYgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIFZQOSBsb29wIGZpbHRlciBTSU1EIG9wdGltaXphdGlvbnMKKzsqCis7KiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNCBDbMOpbWVudCBCxZNzY2ggPHUgcGtoIG1lPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKKyVpZiBBUkNIX1g4Nl82NAorCitTRUNUSU9OX1JPREFUQQorCitjZXh0ZXJuIHBiXzMKK2NleHRlcm4gcGJfODAKKworcGJfNDogICB0aW1lcyAxNiBkYiAweDA0CitwYl8xMDogIHRpbWVzIDE2IGRiIDB4MTAKK3BiXzQwOiAgdGltZXMgMTYgZGIgMHg0MAorcGJfODE6ICB0aW1lcyAxNiBkYiAweDgxCitwYl9mODogIHRpbWVzIDE2IGRiIDB4ZjgKK3BiX2ZlOiAgdGltZXMgMTYgZGIgMHhmZQorCitjZXh0ZXJuIHB3XzQKK2NleHRlcm4gcHdfOAorCis7IHdpdGggbWl4IGZ1bmN0aW9ucywgdHdvIDgtYml0IHRocmVzaG9sZHMgYXJlIHN0b3JlZCBpbiBhIDE2LWJpdCBzdG9yYWdlLAorOyB0aGUgZm9sbG93aW5nIG1hc2sgaXMgdXNlZCB0byBzcGxhdCBib3RoIGluIHRoZSBzYW1lIHJlZ2lzdGVyCittYXNrX21peDogdGltZXMgOCBkYiAwCisgICAgICAgICAgdGltZXMgOCBkYiAxCisKK21hc2tfbWl4ODQ6IHRpbWVzIDggZGIgMHhmZgorICAgICAgICAgICAgdGltZXMgOCBkYiAweDAwCittYXNrX21peDQ4OiB0aW1lcyA4IGRiIDB4MDAKKyAgICAgICAgICAgIHRpbWVzIDggZGIgMHhmZgorCitTRUNUSU9OIC50ZXh0CisKKzsgJTEgPSBhYnMoJTItJTMpCislbWFjcm8gQUJTU1VCIDQgOyBkc3QsIHNyYzEgKFJPKSwgc3JjMiAoUk8pLCB0bXAKKyAgICBwc3VidXNiICAgICAgICAgICAgICUxLCAlMywgJTIKKyAgICBwc3VidXNiICAgICAgICAgICAgICU0LCAlMiwgJTMKKyAgICBwb3IgICAgICAgICAgICAgICAgICUxLCAlNAorJWVuZG1hY3JvCisKKzsgJTEgPSAlMTw9JTIKKyVtYWNybyBDTVBfTFRFIDMtNCA7IHNyYy9kc3QsIGNtcCwgdG1wLCBwYl84MAorJWlmICUwID09IDQKKyAgICBweG9yICAgICAgICAgICAgICAgICUxLCAlNAorJWVuZGlmCisgICAgcGNtcGd0YiAgICAgICAgICAgICAlMywgJTIsICUxICAgICAgICAgIDsgY21wID4gc3JjPworICAgIHBjbXBlcWIgICAgICAgICAgICAgJTEsICUyICAgICAgICAgICAgICA7IGNtcCA9PSBzcmM/IFhYWDogYXZvaWQgdGhpcyB3aXRoIGEgLTEvKzEgd2VsbCBwbGFjZWQ/CisgICAgcG9yICAgICAgICAgICAgICAgICAlMSwgJTMgICAgICAgICAgICAgIDsgY21wID49IHNyYz8KKyVlbmRtYWNybworCis7ICUxID0gYWJzKCUyLSUzKSA8PSAlNAorJW1hY3JvIEFCU1NVQl9DTVAgNi03IFtwYl84MF07IGRzdCwgc3JjMSwgc3JjMiwgY21wLCB0bXAxLCB0bXAyLCBbcGJfODBdCisgICAgQUJTU1VCICAgICAgICAgICAgICAlMSwgJTIsICUzLCAlNiAgICAgIDsgZHN0ID0gYWJzKHNyYzEtc3JjMikKKyAgICBDTVBfTFRFICAgICAgICAgICAgICUxLCAlNCwgJTYsICU3ICAgICAgOyBkc3QgPD0gY21wCislZW5kbWFjcm8KKworJW1hY3JvIE1BU0tfQVBQTFkgNCA7ICUxPW5ld19kYXRhL2RzdCAlMj1vbGRfZGF0YSAlMz1tYXNrICU0PXRtcAorICAgIHBhbmQgICAgICAgICAgICAgICAgJTEsICUzICAgICAgICAgICAgICA7IG5ldyAmPSBtYXNrCisgICAgcGFuZG4gICAgICAgICAgICAgICAlNCwgJTMsICUyICAgICAgICAgIDsgdG1wID0gfm1hc2sgJiBvbGQKKyAgICBwb3IgICAgICAgICAgICAgICAgICUxLCAlNCAgICAgICAgICAgICAgOyBuZXcmbWFzayB8IG9sZCZ+bWFzaworJWVuZG1hY3JvCisKKyVtYWNybyBGSUxURVJfU1VCeDJfQUREeDIgOCA7ICUxPWRzdCAlMj1oL2wgJTM9Y2FjaGUgJTQ9c3ViMSAlNT1zdWIyICU2PWFkZDEgJTc9YWRkMiAlOD1yc2hpZnQKKyAgICBwdW5wY2slMmJ3ICAgICAgICAgICUzLCAlNCwgbTAKKyAgICBwc3VidyAgICAgICAgICAgICAgICUxLCAlMworICAgIHB1bnBjayUyYncgICAgICAgICAgJTMsICU1LCBtMAorICAgIHBzdWJ3ICAgICAgICAgICAgICAgJTEsICUzCisgICAgcHVucGNrJTJidyAgICAgICAgICAlMywgJTYsIG0wCisgICAgcGFkZHcgICAgICAgICAgICAgICAlMSwgJTMKKyAgICBwdW5wY2slMmJ3ICAgICAgICAgICUzLCAlNywgbTAKKyAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCAlMQorICAgIHBzcmF3ICAgICAgICAgICAgICAgJTEsICUzLCAlOAorJWVuZG1hY3JvCisKKyVtYWNybyBGSUxURVJfSU5JVCA4IDsgdG1wMSwgdG1wMiwgY2FjaGVMLCBjYWNoZUgsIGRzdHAsIGZpbHRlcmlkLCBtYXNrLCBzb3VyY2UKKyAgICBGSUxURVIlNl9JTklUICAgICAgICUxLCBsLCAlMworICAgIEZJTFRFUiU2X0lOSVQgICAgICAgJTIsIGgsICU0CisgICAgcGFja3Vzd2IgICAgICAgICAgICAlMSwgJTIKKyAgICBNQVNLX0FQUExZICAgICAgICAgICUxLCAlOCwgJTcsICUyCisgICAgbW92YSAgICAgICAgICAgICAgICAlNSwgJTEKKyVlbmRtYWNybworCislbWFjcm8gRklMVEVSX1VQREFURSAxMS0xNCA7IHRtcDEsIHRtcDIsIGNhY2hlTCwgY2FjaGVILCBkc3RwLCAtLCAtLCArLCArLCByc2hpZnQsIG1hc2ssIFtzb3VyY2VdLCBbcHJlbG9hZCByZWcgKyB2YWx1ZV0KKyVpZiAlMCA9PSAxMyA7IG5vIHNvdXJjZSArIHByZWxvYWQKKyAgICBtb3ZhICAgICAgICAgICAgICAgICUxMiwgJTEzCislZWxpZiAlMCA9PSAxNCA7IHNvdXJjZSArIHByZWxvYWQKKyAgICBtb3ZhICAgICAgICAgICAgICAgICUxMywgJTE0CislZW5kaWYKKyAgICBGSUxURVJfU1VCeDJfQUREeDIgICUxLCBsLCAlMywgJTYsICU3LCAlOCwgJTksICUxMAorICAgIEZJTFRFUl9TVUJ4Ml9BRER4MiAgJTIsIGgsICU0LCAlNiwgJTcsICU4LCAlOSwgJTEwCisgICAgcGFja3Vzd2IgICAgICAgICAgICAlMSwgJTIKKyVpZiAlMCA9PSAxMiB8fCAlMCA9PSAxNAorICAgIE1BU0tfQVBQTFkgICAgICAgICAgJTEsICUxMiwgJTExLCAlMgorJWVsc2UKKyAgICBNQVNLX0FQUExZICAgICAgICAgICUxLCAlNSwgJTExLCAlMgorJWVuZGlmCisgICAgbW92YSAgICAgICAgICAgICAgICAlNSwgJTEKKyVlbmRtYWNybworCislbWFjcm8gU1JTSElGVDNCXzJYIDQgOyByZWcxLCByZWcyLCBbcGJfMTBdLCB0bXAKKyAgICBtb3ZhICAgICAgICAgICAgICAgICU0LCBbcGJfZjhdCisgICAgcGFuZCAgICAgICAgICAgICAgICAlMSwgJTQKKyAgICBwYW5kICAgICAgICAgICAgICAgICUyLCAlNAorICAgIHBzcmxxICAgICAgICAgICAgICAgJTEsIDMKKyAgICBwc3JscSAgICAgICAgICAgICAgICUyLCAzCisgICAgcHhvciAgICAgICAgICAgICAgICAlMSwgJTMKKyAgICBweG9yICAgICAgICAgICAgICAgICUyLCAlMworICAgIHBzdWJiICAgICAgICAgICAgICAgJTEsICUzCisgICAgcHN1YmIgICAgICAgICAgICAgICAlMiwgJTMKKyVlbmRtYWNybworCislbWFjcm8gRVhUUkFDVF9QT1NfTkVHIDMgOyBpOCwgbmVnLCBwb3MKKyAgICBweG9yICAgICAgICAgICAgICAgICUzLCAlMworICAgIHB4b3IgICAgICAgICAgICAgICAgJTIsICUyCisgICAgcGNtcGd0YiAgICAgICAgICAgICAlMywgJTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgaTggPCAwIG1hc2sKKyAgICBwc3ViYiAgICAgICAgICAgICAgICUyLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBuZWcgdmFsdWVzIChvbmx5IHRoZSBvcmlnaW5hbGx5IC0gd2lsbCBiZSBrZXB0KQorICAgIHBhbmQgICAgICAgICAgICAgICAgJTIsICUzICAgICAgICAgICAgICAgICAgICAgICAgICA7IG5lZ2F0aXZlIHZhbHVlcyBvZiBpOCAoYnV0IHN0b3JlZCBhcyArKQorICAgIHBhbmRuICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHBvc2l0aXZlIHZhbHVlcyBvZiBpOAorJWVuZG1hY3JvCisKKzsgY2xpcF91OCh1OCArIGk4KQorJW1hY3JvIFNJR05fQUREIDUgOyBkc3QsIHU4LCBpOCwgdG1wMSwgdG1wMgorICAgIEVYVFJBQ1RfUE9TX05FRyAgICAgJTMsICU0LCAlNQorICAgIHBzdWJ1c2IgICAgICAgICAgICAgJTEsICUyLCAlNCAgICAgICAgICAgICAgICAgICAgICA7IHN1YiB0aGUgbmVnYXRpdmVzCisgICAgcGFkZHVzYiAgICAgICAgICAgICAlMSwgJTUgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYWRkIHRoZSBwb3NpdGl2ZXMKKyVlbmRtYWNybworCis7IGNsaXBfdTgodTggLSBpOCkKKyVtYWNybyBTSUdOX1NVQiA1IDsgZHN0LCB1OCwgaTgsIHRtcDEsIHRtcDIKKyAgICBFWFRSQUNUX1BPU19ORUcgICAgICUzLCAlNCwgJTUKKyAgICBwc3VidXNiICAgICAgICAgICAgICUxLCAlMiwgJTUgICAgICAgICAgICAgICAgICAgICAgOyBzdWIgdGhlIHBvc2l0aXZlcworICAgIHBhZGR1c2IgICAgICAgICAgICAgJTEsICU0ICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFkZCB0aGUgbmVnYXRpdmVzCislZW5kbWFjcm8KKworJW1hY3JvIEZJTFRFUjZfSU5JVCAzIDsgJTE9ZHN0ICUyPWgvbCAlMz1jYWNoZQorICAgIHB1bnBjayUyYncgICAgICAgICAgJTEsIG0xNCwgbTAgICAgICAgICAgICAgICAgICAgICA7IHAzOiBCLT5XCisgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgJTEsICUxICAgICAgICAgICAgICAgICAgICAgIDsgcDMqMgorICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAzKjMKKyAgICBwdW5wY2slMmJ3ICAgICAgICAgICUxLCBtMTUsIG0wICAgICAgICAgICAgICAgICAgICAgOyBwMjogQi0+VworICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAzKjMgKyBwMgorICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAzKjMgKyBwMioyCisgICAgcHVucGNrJTJidyAgICAgICAgICAlMSwgbTEwLCBtMCAgICAgICAgICAgICAgICAgICAgIDsgcDE6IEItPlcKKyAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMyozICsgcDIqMiArIHAxCisgICAgcHVucGNrJTJidyAgICAgICAgICAlMSwgbTExLCBtMCAgICAgICAgICAgICAgICAgICAgIDsgcDA6IEItPlcKKyAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMyozICsgcDIqMiArIHAxICsgcDAKKyAgICBwdW5wY2slMmJ3ICAgICAgICAgICUxLCBtMTIsIG0wICAgICAgICAgICAgICAgICAgICAgOyBxMDogQi0+VworICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAzKjMgKyBwMioyICsgcDEgKyBwMCArIHEwCisgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgW3B3XzRdICAgICAgICAgICAgICAgICAgICAgIDsgcDMqMyArIHAyKjIgKyBwMSArIHAwICsgcTAgKyA0CisgICAgcHNyYXcgICAgICAgICAgICAgICAlMSwgJTMsIDMgICAgICAgICAgICAgICAgICAgICAgIDsgKHAzKjMgKyBwMioyICsgcDEgKyBwMCArIHEwICsgNCkgPj4gMworJWVuZG1hY3JvCisKKyVtYWNybyBGSUxURVIxNF9JTklUIDMgOyAlMT1kc3QgJTI9aC9sICUzPWNhY2hlCisgICAgcHVucGNrJTJidyAgICAgICAgICAlMSwgbTIsIG0wICAgICAgICAgICAgICAgICAgICAgIDsgcDc6IEItPlcKKyAgICBwc2xsdyAgICAgICAgICAgICAgICUzLCAlMSwgMyAgICAgICAgICAgICAgICAgICAgICAgOyBwNyo4CisgICAgcHN1YncgICAgICAgICAgICAgICAlMywgJTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDcqNworICAgIHB1bnBjayUyYncgICAgICAgICAgJTEsIG0zLCBtMCAgICAgICAgICAgICAgICAgICAgICA7IHA2OiBCLT5XCisgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgJTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDcqNyArIHA2CisgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgJTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDcqNyArIHA2KjIKKyAgICBwdW5wY2slMmJ3ICAgICAgICAgICUxLCBtOCwgbTAgICAgICAgICAgICAgICAgICAgICAgOyBwNTogQi0+VworICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHA3KjcgKyBwNioyICsgcDUKKyAgICBwdW5wY2slMmJ3ICAgICAgICAgICUxLCBtOSwgbTAgICAgICAgICAgICAgICAgICAgICAgOyBwNDogQi0+VworICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHA3KjcgKyBwNioyICsgcDUgKyBwNAorICAgIHB1bnBjayUyYncgICAgICAgICAgJTEsIG0xNCwgbTAgICAgICAgICAgICAgICAgICAgICA7IHAzOiBCLT5XCisgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgJTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDcqNyArIHA2KjIgKyBwNSArIHA0ICsgcDMKKyAgICBwdW5wY2slMmJ3ICAgICAgICAgICUxLCBtMTUsIG0wICAgICAgICAgICAgICAgICAgICAgOyBwMjogQi0+VworICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHA3KjcgKyBwNioyICsgcDUgKyAuLiArIHAyCisgICAgcHVucGNrJTJidyAgICAgICAgICAlMSwgbTEwLCBtMCAgICAgICAgICAgICAgICAgICAgIDsgcDE6IEItPlcKKyAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwNyo3ICsgcDYqMiArIHA1ICsgLi4gKyBwMQorICAgIHB1bnBjayUyYncgICAgICAgICAgJTEsIG0xMSwgbTAgICAgICAgICAgICAgICAgICAgICA7IHAwOiBCLT5XCisgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgJTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDcqNyArIHA2KjIgKyBwNSArIC4uICsgcDAKKyAgICBwdW5wY2slMmJ3ICAgICAgICAgICUxLCBtMTIsIG0wICAgICAgICAgICAgICAgICAgICAgOyBxMDogQi0+VworICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHA3KjcgKyBwNioyICsgcDUgKyAuLiArIHAwICsgcTAKKyAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCBbcHdfOF0gICAgICAgICAgICAgICAgICAgICAgOyBwNyo3ICsgcDYqMiArIHA1ICsgLi4gKyBwMCArIHEwICsgOAorICAgIHBzcmF3ICAgICAgICAgICAgICAgJTEsICUzLCA0ICAgICAgICAgICAgICAgICAgICAgICA7IChwNyo3ICsgcDYqMiArIHA1ICsgLi4gKyBwMCArIHEwICsgOCkgPj4gNAorJWVuZG1hY3JvCisKKyVtYWNybyBUUkFOU1BPU0UxNngxNkIgMTcKKyAgICBtb3ZhICUxNywgbSUxNgorICAgIFNCVVRURVJGTFkgYncsICAlMSwgICUyLCAgJTE2CisgICAgU0JVVFRFUkZMWSBidywgICUzLCAgJTQsICAlMTYKKyAgICBTQlVUVEVSRkxZIGJ3LCAgJTUsICAlNiwgICUxNgorICAgIFNCVVRURVJGTFkgYncsICAlNywgICU4LCAgJTE2CisgICAgU0JVVFRFUkZMWSBidywgICU5LCAgJTEwLCAlMTYKKyAgICBTQlVUVEVSRkxZIGJ3LCAgJTExLCAlMTIsICUxNgorICAgIFNCVVRURVJGTFkgYncsICAlMTMsICUxNCwgJTE2CisgICAgbW92YSBtJTE2LCAgJTE3CisgICAgbW92YSAgJTE3LCBtJTE0CisgICAgU0JVVFRFUkZMWSBidywgICUxNSwgJTE2LCAlMTQKKyAgICBTQlVUVEVSRkxZIHdkLCAgJTEsICAlMywgICUxNAorICAgIFNCVVRURVJGTFkgd2QsICAlMiwgICU0LCAgJTE0CisgICAgU0JVVFRFUkZMWSB3ZCwgICU1LCAgJTcsICAlMTQKKyAgICBTQlVUVEVSRkxZIHdkLCAgJTYsICAlOCwgICUxNAorICAgIFNCVVRURVJGTFkgd2QsICAlOSwgICUxMSwgJTE0CisgICAgU0JVVFRFUkZMWSB3ZCwgICUxMCwgJTEyLCAlMTQKKyAgICBTQlVUVEVSRkxZIHdkLCAgJTEzLCAlMTUsICUxNAorICAgIG1vdmEgbSUxNCwgICUxNworICAgIG1vdmEgICUxNywgbSUxMgorICAgIFNCVVRURVJGTFkgd2QsICAlMTQsICUxNiwgJTEyCisgICAgU0JVVFRFUkZMWSBkcSwgICUxLCAgJTUsICAlMTIKKyAgICBTQlVUVEVSRkxZIGRxLCAgJTIsICAlNiwgICUxMgorICAgIFNCVVRURVJGTFkgZHEsICAlMywgICU3LCAgJTEyCisgICAgU0JVVFRFUkZMWSBkcSwgICU0LCAgJTgsICAlMTIKKyAgICBTQlVUVEVSRkxZIGRxLCAgJTksICAlMTMsICUxMgorICAgIFNCVVRURVJGTFkgZHEsICAlMTAsICUxNCwgJTEyCisgICAgU0JVVFRFUkZMWSBkcSwgICUxMSwgJTE1LCAlMTIKKyAgICBtb3ZhIG0lMTIsICUxNworICAgIG1vdmEgICUxNywgbSU4CisgICAgU0JVVFRFUkZMWSBkcSwgICUxMiwgJTE2LCAlOAorICAgIFNCVVRURVJGTFkgcWRxLCAlMSwgICU5LCAgJTgKKyAgICBTQlVUVEVSRkxZIHFkcSwgJTIsICAlMTAsICU4CisgICAgU0JVVFRFUkZMWSBxZHEsICUzLCAgJTExLCAlOAorICAgIFNCVVRURVJGTFkgcWRxLCAlNCwgICUxMiwgJTgKKyAgICBTQlVUVEVSRkxZIHFkcSwgJTUsICAlMTMsICU4CisgICAgU0JVVFRFUkZMWSBxZHEsICU2LCAgJTE0LCAlOAorICAgIFNCVVRURVJGTFkgcWRxLCAlNywgICUxNSwgJTgKKyAgICBtb3ZhIG0lOCwgJTE3CisgICAgbW92YSAlMTcsIG0lMQorICAgIFNCVVRURVJGTFkgcWRxLCAlOCwgICUxNiwgJTEKKyAgICBtb3ZhIG0lMSwgJTE3CisgICAgU1dBUCAlMiwgICU5CisgICAgU1dBUCAlMywgICU1CisgICAgU1dBUCAlNCwgICUxMworICAgIFNXQVAgJTYsICAlMTEKKyAgICBTV0FQICU4LCAgJTE1CisgICAgU1dBUCAlMTIsICUxNAorJWVuZG1hY3JvCisKKzsgdHJhbnNwb3NlIDE2IGhhbGYgbGluZXMgKGhpZ2ggcGFydCkgdG8gOCBmdWxsIGNlbnRlcmVkIGxpbmVzCislbWFjcm8gVFJBTlNQT1NFMTZ4OEIgMTYKKyAgICBwdW5wY2tsYncgICBtJTEsICBtJTIKKyAgICBwdW5wY2tsYncgICBtJTMsICBtJTQKKyAgICBwdW5wY2tsYncgICBtJTUsICBtJTYKKyAgICBwdW5wY2tsYncgICBtJTcsICBtJTgKKyAgICBwdW5wY2tsYncgICBtJTksICBtJTEwCisgICAgcHVucGNrbGJ3ICAgbSUxMSwgbSUxMgorICAgIHB1bnBja2xidyAgIG0lMTMsIG0lMTQKKyAgICBwdW5wY2tsYncgICBtJTE1LCBtJTE2CisgICAgU0JVVFRFUkZMWSAgd2QsICAlMSwgICUzLCAgJTIKKyAgICBTQlVUVEVSRkxZICB3ZCwgICU1LCAgJTcsICAlMgorICAgIFNCVVRURVJGTFkgIHdkLCAgJTksICAlMTEsICUyCisgICAgU0JVVFRFUkZMWSAgd2QsICAlMTMsICUxNSwgJTIKKyAgICBTQlVUVEVSRkxZICBkcSwgICUxLCAgJTUsICAlMgorICAgIFNCVVRURVJGTFkgIGRxLCAgJTMsICAlNywgICUyCisgICAgU0JVVFRFUkZMWSAgZHEsICAlOSwgICUxMywgJTIKKyAgICBTQlVUVEVSRkxZICBkcSwgICUxMSwgJTE1LCAlMgorICAgIFNCVVRURVJGTFkgIHFkcSwgJTEsICAlOSwgICUyCisgICAgU0JVVFRFUkZMWSAgcWRxLCAlMywgICUxMSwgJTIKKyAgICBTQlVUVEVSRkxZICBxZHEsICU1LCAgJTEzLCAlMgorICAgIFNCVVRURVJGTFkgIHFkcSwgJTcsICAlMTUsICUyCisgICAgU1dBUCAlNSwgJTEKKyAgICBTV0FQICU2LCAlOQorICAgIFNXQVAgJTcsICUxCisgICAgU1dBUCAlOCwgJTEzCisgICAgU1dBUCAlOSwgJTMKKyAgICBTV0FQICUxMCwgJTExCisgICAgU1dBUCAlMTEsICUxCisgICAgU1dBUCAlMTIsICUxNQorJWVuZG1hY3JvCisKKyVtYWNybyBERUZJTkVfUkVBTF9QN19UT19RNyAwLTEgMAorJWRlZmluZSBQNyBkc3QxcSArIDIqbXN0cmlkZXEgICsgJTEKKyVkZWZpbmUgUDYgZHN0MXEgKyAgIG1zdHJpZGVxICArICUxCislZGVmaW5lIFA1IGRzdDFxICAgICAgICAgICAgICAgKyAlMQorJWRlZmluZSBQNCBkc3QxcSArICAgIHN0cmlkZXEgICsgJTEKKyVkZWZpbmUgUDMgZHN0cSAgKyA0Km1zdHJpZGVxICArICUxCislZGVmaW5lIFAyIGRzdHEgICsgICBtc3RyaWRlM3EgKyAlMQorJWRlZmluZSBQMSBkc3RxICArIDIqbXN0cmlkZXEgICsgJTEKKyVkZWZpbmUgUDAgZHN0cSAgKyAgIG1zdHJpZGVxICArICUxCislZGVmaW5lIFEwIGRzdHEgICAgICAgICAgICAgICAgKyAlMQorJWRlZmluZSBRMSBkc3RxICArICAgc3RyaWRlcSAgICsgJTEKKyVkZWZpbmUgUTIgZHN0cSAgKyAyKnN0cmlkZXEgICArICUxCislZGVmaW5lIFEzIGRzdHEgICsgICBzdHJpZGUzcSAgKyAlMQorJWRlZmluZSBRNCBkc3RxICArIDQqc3RyaWRlcSAgICsgJTEKKyVkZWZpbmUgUTUgZHN0MnEgKyBtc3RyaWRlcSAgICArICUxCislZGVmaW5lIFE2IGRzdDJxICAgICAgICAgICAgICAgKyAlMQorJWRlZmluZSBRNyBkc3QycSArICBzdHJpZGVxICAgICsgJTEKKyVlbmRtYWNybworCis7IC4uLi4uLi4uLi4uLi4uQUIgLT4gQUFBQUFBQUFCQkJCQkJCQgorJW1hY3JvIFNQTEFUQl9NSVggMS0yIFttYXNrX21peF0KKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHBzaHVmYiAgICAgJTEsICUyCislZWxzZQorICAgIHB1bnBja2xidyAgJTEsICUxCisgICAgcHVucGNrbHdkICAlMSwgJTEKKyAgICBwdW5wY2tsZHEgICUxLCAlMQorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIExPT1BGSUxURVIgMiA7ICUxPXYvaCAlMj1zaXplMQorICAgIGxlYSBtc3RyaWRlcSwgW3N0cmlkZXFdCisgICAgbmVnIG1zdHJpZGVxCisKKyAgICBsZWEgc3RyaWRlM3EsIFtzdHJpZGVxKzIqc3RyaWRlcV0KKyAgICBtb3YgbXN0cmlkZTNxLCBzdHJpZGUzcQorICAgIG5lZyBtc3RyaWRlM3EKKworJWlmaWRuICUxLCBoCislaWYgJTIgPiAxNgorJWRlZmluZSBtb3Z4IG1vdmgKKyAgICBsZWEgZHN0cSwgW2RzdHEgKyA4KnN0cmlkZXEgLSA0XQorJWVsc2UKKyVkZWZpbmUgbW92eCBtb3Z1CisgICAgbGVhIGRzdHEsIFtkc3RxICsgOCpzdHJpZGVxIC0gOF0gOyBnbyBmcm9tIHRvcCBjZW50ZXIgKGggcG9zKSB0byBjZW50ZXIgbGVmdCAodiBwb3MpCislZW5kaWYKKyVlbmRpZgorCisgICAgbGVhIGRzdDFxLCBbZHN0cSArIDIqbXN0cmlkZTNxXSAgICAgICAgICAgICAgICAgICAgICAgICA7IGRzdDFxID0gJmRzdFtzdHJpZGUgKiAtNl0KKyAgICBsZWEgZHN0MnEsIFtkc3RxICsgMiogc3RyaWRlM3FdICAgICAgICAgICAgICAgICAgICAgICAgIDsgZHN0MnEgPSAmZHN0W3N0cmlkZSAqICs2XQorCisgICAgREVGSU5FX1JFQUxfUDdfVE9fUTcKKworJWlmaWRuICUxLCBoCisgICAgbW92eCAgICAgICAgICAgICAgICAgICAgbTAsIFtQN10KKyAgICBtb3Z4ICAgICAgICAgICAgICAgICAgICBtMSwgW1A2XQorICAgIG1vdnggICAgICAgICAgICAgICAgICAgIG0yLCBbUDVdCisgICAgbW92eCAgICAgICAgICAgICAgICAgICAgbTMsIFtQNF0KKyAgICBtb3Z4ICAgICAgICAgICAgICAgICAgICBtNCwgW1AzXQorICAgIG1vdnggICAgICAgICAgICAgICAgICAgIG01LCBbUDJdCisgICAgbW92eCAgICAgICAgICAgICAgICAgICAgbTYsIFtQMV0KKyAgICBtb3Z4ICAgICAgICAgICAgICAgICAgICBtNywgW1AwXQorICAgIG1vdnggICAgICAgICAgICAgICAgICAgIG04LCBbUTBdCisgICAgbW92eCAgICAgICAgICAgICAgICAgICAgbTksIFtRMV0KKyAgICBtb3Z4ICAgICAgICAgICAgICAgICAgIG0xMCwgW1EyXQorICAgIG1vdnggICAgICAgICAgICAgICAgICAgbTExLCBbUTNdCisgICAgbW92eCAgICAgICAgICAgICAgICAgICBtMTIsIFtRNF0KKyAgICBtb3Z4ICAgICAgICAgICAgICAgICAgIG0xMywgW1E1XQorICAgIG1vdnggICAgICAgICAgICAgICAgICAgbTE0LCBbUTZdCisgICAgbW92eCAgICAgICAgICAgICAgICAgICBtMTUsIFtRN10KKyVkZWZpbmUgUDcgcnNwICsgICAwCislZGVmaW5lIFA2IHJzcCArICAxNgorJWRlZmluZSBQNSByc3AgKyAgMzIKKyVkZWZpbmUgUDQgcnNwICsgIDQ4CislZGVmaW5lIFAzIHJzcCArICA2NAorJWRlZmluZSBQMiByc3AgKyAgODAKKyVkZWZpbmUgUDEgcnNwICsgIDk2CislZGVmaW5lIFAwIHJzcCArIDExMgorJWRlZmluZSBRMCByc3AgKyAxMjgKKyVkZWZpbmUgUTEgcnNwICsgMTQ0CislZGVmaW5lIFEyIHJzcCArIDE2MAorJWRlZmluZSBRMyByc3AgKyAxNzYKKyVkZWZpbmUgUTQgcnNwICsgMTkyCislZGVmaW5lIFE1IHJzcCArIDIwOAorJWRlZmluZSBRNiByc3AgKyAyMjQKKyVkZWZpbmUgUTcgcnNwICsgMjQwCisKKyVpZiAlMiA9PSAxNgorICAgIFRSQU5TUE9TRTE2eDE2QiAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCBbcnNwXQorICAgIG1vdmEgICAgICAgICAgIFtQN10sICBtMAorICAgIG1vdmEgICAgICAgICAgIFtQNl0sICBtMQorICAgIG1vdmEgICAgICAgICAgIFtQNV0sICBtMgorICAgIG1vdmEgICAgICAgICAgIFtQNF0sICBtMworJWVsc2UKKyAgICBUUkFOU1BPU0UxNng4QiAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1CislZW5kaWYKKyAgICBtb3ZhICAgICAgICAgICBbUDNdLCAgbTQKKyAgICBtb3ZhICAgICAgICAgICBbUDJdLCAgbTUKKyAgICBtb3ZhICAgICAgICAgICBbUDFdLCAgbTYKKyAgICBtb3ZhICAgICAgICAgICBbUDBdLCAgbTcKKyAgICBtb3ZhICAgICAgICAgICBbUTBdLCAgbTgKKyAgICBtb3ZhICAgICAgICAgICBbUTFdLCAgbTkKKyAgICBtb3ZhICAgICAgICAgICBbUTJdLCBtMTAKKyAgICBtb3ZhICAgICAgICAgICBbUTNdLCBtMTEKKyVpZiAlMiA9PSAxNgorICAgIG1vdmEgICAgICAgICAgIFtRNF0sIG0xMgorICAgIG1vdmEgICAgICAgICAgIFtRNV0sIG0xMworICAgIG1vdmEgICAgICAgICAgIFtRNl0sIG0xNAorICAgIG1vdmEgICAgICAgICAgIFtRN10sIG0xNQorJWVuZGlmCislZW5kaWYKKworICAgIDsgY2FsYyBmbSBtYXNrCislaWYgJTIgPT0gMTYKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHB4b3IgICAgICAgICAgICAgICAgbTAsIG0wCislZW5kaWYKKyAgICBTUExBVEJfUkVHICAgICAgICAgIG0yLCBJLCBtMCAgICAgICAgICAgICAgICAgICAgICAgOyBJIEkgSSBJIC4uLgorICAgIFNQTEFUQl9SRUcgICAgICAgICAgbTMsIEUsIG0wICAgICAgICAgICAgICAgICAgICAgICA7IEUgRSBFIEUgLi4uCislZWxzZQorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92YSAgICAgICAgICAgICAgICBtMCwgW21hc2tfbWl4XQorJWVuZGlmCisgICAgbW92ZCAgICAgICAgICAgICAgICBtMiwgSWQKKyAgICBtb3ZkICAgICAgICAgICAgICAgIG0zLCBFZAorICAgIFNQTEFUQl9NSVggICAgICAgICAgbTIsIG0wCisgICAgU1BMQVRCX01JWCAgICAgICAgICBtMywgbTAKKyVlbmRpZgorICAgIG1vdmEgICAgICAgICAgICAgICAgbTAsIFtwYl84MF0KKyAgICBweG9yICAgICAgICAgICAgICAgIG0yLCBtMAorICAgIHB4b3IgICAgICAgICAgICAgICAgbTMsIG0wCislaWZpZG4gJTEsIHYKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG04LCBbUDNdCisgICAgbW92YSAgICAgICAgICAgICAgICBtOSwgW1AyXQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTAsIFtQMV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgbTExLCBbUDBdCisgICAgbW92YSAgICAgICAgICAgICAgIG0xMiwgW1EwXQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTMsIFtRMV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgbTE0LCBbUTJdCisgICAgbW92YSAgICAgICAgICAgICAgIG0xNSwgW1EzXQorJWVsc2UKKyAgICA7IEluIGNhc2Ugb2YgaG9yaXpvbnRhbCwgUDMuLlEzIGFyZSBhbHJlYWR5IHByZXNlbnQgaW4gc29tZSByZWdpc3RlcnMgZHVlCisgICAgOyB0byB0aGUgcHJldmlvdXMgdHJhbnNwb3NlLCBzbyB3ZSBqdXN0IHN3YXAgcmVnaXN0ZXJzLgorICAgIFNXQVAgICAgICAgICAgICAgICAgIDgsICA0LCAxMgorICAgIFNXQVAgICAgICAgICAgICAgICAgIDksICA1LCAxMworICAgIFNXQVAgICAgICAgICAgICAgICAgMTAsICA2LCAxNAorICAgIFNXQVAgICAgICAgICAgICAgICAgMTEsICA3LCAxNQorJWVuZGlmCisgICAgQUJTU1VCX0NNUCAgICAgICAgICBtNSwgIG04LCAgbTksIG0yLCBtNiwgbTcsIG0wICAgIDsgbTUgPSBhYnMocDMtcDIpIDw9IEkKKyAgICBBQlNTVUJfQ01QICAgICAgICAgIG0xLCAgbTksIG0xMCwgbTIsIG02LCBtNywgbTAgICAgOyBtMSA9IGFicyhwMi1wMSkgPD0gSQorICAgIHBhbmQgICAgICAgICAgICAgICAgbTUsIG0xCisgICAgQUJTU1VCX0NNUCAgICAgICAgICBtMSwgbTEwLCBtMTEsIG0yLCBtNiwgbTcsIG0wICAgIDsgbTEgPSBhYnMocDEtcDApIDw9IEkKKyAgICBwYW5kICAgICAgICAgICAgICAgIG01LCBtMQorICAgIEFCU1NVQl9DTVAgICAgICAgICAgbTEsIG0xMiwgbTEzLCBtMiwgbTYsIG03LCBtMCAgICA7IG0xID0gYWJzKHExLXEwKSA8PSBJCisgICAgcGFuZCAgICAgICAgICAgICAgICBtNSwgbTEKKyAgICBBQlNTVUJfQ01QICAgICAgICAgIG0xLCBtMTMsIG0xNCwgbTIsIG02LCBtNywgbTAgICAgOyBtMSA9IGFicyhxMi1xMSkgPD0gSQorICAgIHBhbmQgICAgICAgICAgICAgICAgbTUsIG0xCisgICAgQUJTU1VCX0NNUCAgICAgICAgICBtMSwgbTE0LCBtMTUsIG0yLCBtNiwgbTcsIG0wICAgIDsgbTEgPSBhYnMocTMtcTIpIDw9IEkKKyAgICBwYW5kICAgICAgICAgICAgICAgIG01LCBtMQorICAgIEFCU1NVQiAgICAgICAgICAgICAgbTEsIG0xMSwgbTEyLCBtNyAgICAgICAgICAgICAgICA7IGFicyhwMC1xMCkKKyAgICBwYWRkdXNiICAgICAgICAgICAgIG0xLCBtMSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDAtcTApICogMgorICAgIEFCU1NVQiAgICAgICAgICAgICAgbTIsIG0xMCwgbTEzLCBtNyAgICAgICAgICAgICAgICA7IGFicyhwMS1xMSkKKyAgICBwYW5kICAgICAgICAgICAgICAgIG0yLCBbcGJfZmVdICAgICAgICAgICAgICAgICAgICAgOyBkcm9wIGxzYiBzbyBzaGlmdCBjYW4gd29yaworICAgIHBzcmxxICAgICAgICAgICAgICAgbTIsIDEgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMS1xMSkvMgorICAgIHBhZGR1c2IgICAgICAgICAgICAgbTEsIG0yICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFicyhwMC1xMCkqMiArIGFicyhwMS1xMSkvMgorICAgIHB4b3IgICAgICAgICAgICAgICAgbTEsIG0wCisgICAgcGNtcGd0YiAgICAgICAgICAgICBtNCwgbTMsIG0xICAgICAgICAgICAgICAgICAgICAgIDsgRSA+IFg/CisgICAgcGNtcGVxYiAgICAgICAgICAgICBtMywgbTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgRSA9PSBYPworICAgIHBvciAgICAgICAgICAgICAgICAgbTMsIG00ICAgICAgICAgICAgICAgICAgICAgICAgICA7IEUgPj0gWD8KKyAgICBwYW5kICAgICAgICAgICAgICAgIG0zLCBtNSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBmbSBmaW5hbCB2YWx1ZQorCisgICAgOyAobTM6IGZtLCBtOC4uMTU6IHAzIHAyIHAxIHAwIHEwIHExIHEyIHEzKQorICAgIDsgY2FsYyBmbGF0OGluIChpZiBub3QgNDRfMTYpIGFuZCBoZXYgbWFza3MKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG02LCBbcGJfODFdICAgICAgICAgICAgICAgICAgICAgOyBbMSAxIDEgMSAuLi5dIF4gMHg4MAorJWlmICUyICE9IDQ0CisgICAgQUJTU1VCX0NNUCAgICAgICAgICBtMiwgbTgsIG0xMSwgbTYsIG00LCBtNSAgICAgICAgIDsgYWJzKHAzIC0gcDApIDw9IDEKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG04LCBbcGJfODBdCisgICAgQUJTU1VCX0NNUCAgICAgICAgICBtMSwgbTksIG0xMSwgbTYsIG00LCBtNSwgbTggICAgIDsgYWJzKHAyIC0gcDApIDw9IDEKKyAgICBwYW5kICAgICAgICAgICAgICAgIG0yLCBtMQorICAgIEFCU1NVQiAgICAgICAgICAgICAgbTQsIG0xMCwgbTExLCBtNSAgICAgICAgICAgICAgICA7IGFicyhwMSAtIHAwKQorJWlmICUyID09IDE2CislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICBweG9yICAgICAgICAgICAgICAgIG0wLCBtMAorJWVuZGlmCisgICAgU1BMQVRCX1JFRyAgICAgICAgICBtNywgSCwgbTAgICAgICAgICAgICAgICAgICAgICAgIDsgSCBIIEggSCAuLi4KKyVlbHNlCisgICAgbW92ZCAgICAgICAgICAgICAgICBtNywgSGQKKyAgICBTUExBVEJfTUlYICAgICAgICAgIG03CislZW5kaWYKKyAgICBweG9yICAgICAgICAgICAgICAgIG03LCBtOAorICAgIHB4b3IgICAgICAgICAgICAgICAgbTQsIG04CisgICAgcGNtcGd0YiAgICAgICAgICAgICBtMCwgbTQsIG03ICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAxIC0gcDApID4gSCAoMS8yIGhldiBjb25kaXRpb24pCisgICAgQ01QX0xURSAgICAgICAgICAgICBtNCwgbTYsIG01ICAgICAgICAgICAgICAgICAgICAgIDsgYWJzKHAxIC0gcDApIDw9IDEKKyAgICBwYW5kICAgICAgICAgICAgICAgIG0yLCBtNCAgICAgICAgICAgICAgICAgICAgICAgICAgOyAoZmxhdDhpbikKKyAgICBBQlNTVUIgICAgICAgICAgICAgIG00LCBtMTMsIG0xMiwgbTEgICAgICAgICAgICAgICAgOyBhYnMocTEgLSBxMCkKKyAgICBweG9yICAgICAgICAgICAgICAgIG00LCBtOAorICAgIHBjbXBndGIgICAgICAgICAgICAgbTUsIG00LCBtNyAgICAgICAgICAgICAgICAgICAgICA7IGFicyhxMSAtIHEwKSA+IEggKDIvMiBoZXYgY29uZGl0aW9uKQorICAgIHBvciAgICAgICAgICAgICAgICAgbTAsIG01ICAgICAgICAgICAgICAgICAgICAgICAgICA7IGhldiBmaW5hbCB2YWx1ZQorICAgIENNUF9MVEUgICAgICAgICAgICAgbTQsIG02LCBtNSAgICAgICAgICAgICAgICAgICAgICA7IGFicyhxMSAtIHEwKSA8PSAxCisgICAgcGFuZCAgICAgICAgICAgICAgICBtMiwgbTQgICAgICAgICAgICAgICAgICAgICAgICAgIDsgKGZsYXQ4aW4pCisgICAgQUJTU1VCX0NNUCAgICAgICAgICBtMSwgbTE0LCBtMTIsIG02LCBtNCwgbTUsIG04ICAgIDsgYWJzKHEyIC0gcTApIDw9IDEKKyAgICBwYW5kICAgICAgICAgICAgICAgIG0yLCBtMQorICAgIEFCU1NVQl9DTVAgICAgICAgICAgbTEsIG0xNSwgbTEyLCBtNiwgbTQsIG01LCBtOCAgICA7IGFicyhxMyAtIHEwKSA8PSAxCisgICAgcGFuZCAgICAgICAgICAgICAgICBtMiwgbTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZmxhdDhpbiBmaW5hbCB2YWx1ZQorJWlmICUyID09IDg0IHx8ICUyID09IDQ4CisgICAgcGFuZCAgICAgICAgICAgICAgICBtMiwgW21hc2tfbWl4JTJdCislZW5kaWYKKyVlbHNlCisgICAgbW92YSAgICAgICAgICAgICAgICBtNiwgW3BiXzgwXQorICAgIG1vdmQgICAgICAgICAgICAgICAgbTcsIEhkCisgICAgU1BMQVRCX01JWCAgICAgICAgICBtNworICAgIHB4b3IgICAgICAgICAgICAgICAgbTcsIG02CisgICAgQUJTU1VCICAgICAgICAgICAgICBtNCwgbTEwLCBtMTEsIG0xICAgICAgICAgICAgICAgIDsgYWJzKHAxIC0gcDApCisgICAgcHhvciAgICAgICAgICAgICAgICBtNCwgbTYKKyAgICBwY21wZ3RiICAgICAgICAgICAgIG0wLCBtNCwgbTcgICAgICAgICAgICAgICAgICAgICAgOyBhYnMocDEgLSBwMCkgPiBIICgxLzIgaGV2IGNvbmRpdGlvbikKKyAgICBBQlNTVUIgICAgICAgICAgICAgIG00LCBtMTMsIG0xMiwgbTEgICAgICAgICAgICAgICAgOyBhYnMocTEgLSBxMCkKKyAgICBweG9yICAgICAgICAgICAgICAgIG00LCBtNgorICAgIHBjbXBndGIgICAgICAgICAgICAgbTUsIG00LCBtNyAgICAgICAgICAgICAgICAgICAgICA7IGFicyhxMSAtIHEwKSA+IEggKDIvMiBoZXYgY29uZGl0aW9uKQorICAgIHBvciAgICAgICAgICAgICAgICAgbTAsIG01ICAgICAgICAgICAgICAgICAgICAgICAgICA7IGhldiBmaW5hbCB2YWx1ZQorJWVuZGlmCisKKyVpZiAlMiA9PSAxNgorICAgIDsgKG0wOiBoZXYsIG0yOiBmbGF0OGluLCBtMzogZm0sIG02OiBwYl84MSwgbTkuLjE1OiBwMiBwMSBwMCBxMCBxMSBxMiBxMykKKyAgICA7IGNhbGMgZmxhdDhvdXQgbWFzaworICAgIG1vdmEgICAgICAgICAgICAgICAgbTgsIFtQN10KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG05LCBbUDZdCisgICAgQUJTU1VCX0NNUCAgICAgICAgICBtMSwgbTgsIG0xMSwgbTYsIG00LCBtNSAgICAgICAgIDsgYWJzKHA3IC0gcDApIDw9IDEKKyAgICBBQlNTVUJfQ01QICAgICAgICAgIG03LCBtOSwgbTExLCBtNiwgbTQsIG01ICAgICAgICAgOyBhYnMocDYgLSBwMCkgPD0gMQorICAgIHBhbmQgICAgICAgICAgICAgICAgbTEsIG03CisgICAgbW92YSAgICAgICAgICAgICAgICBtOCwgW1A1XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTksIFtQNF0KKyAgICBBQlNTVUJfQ01QICAgICAgICAgIG03LCBtOCwgbTExLCBtNiwgbTQsIG01ICAgICAgICAgOyBhYnMocDUgLSBwMCkgPD0gMQorICAgIHBhbmQgICAgICAgICAgICAgICAgbTEsIG03CisgICAgQUJTU1VCX0NNUCAgICAgICAgICBtNywgbTksIG0xMSwgbTYsIG00LCBtNSAgICAgICAgIDsgYWJzKHA0IC0gcDApIDw9IDEKKyAgICBwYW5kICAgICAgICAgICAgICAgIG0xLCBtNworICAgIG1vdmEgICAgICAgICAgICAgICAgbTE0LCBbUTRdCisgICAgbW92YSAgICAgICAgICAgICAgICBtMTUsIFtRNV0KKyAgICBBQlNTVUJfQ01QICAgICAgICAgIG03LCBtMTQsIG0xMiwgbTYsIG00LCBtNSAgICAgICAgOyBhYnMocTQgLSBxMCkgPD0gMQorICAgIHBhbmQgICAgICAgICAgICAgICAgbTEsIG03CisgICAgQUJTU1VCX0NNUCAgICAgICAgICBtNywgbTE1LCBtMTIsIG02LCBtNCwgbTUgICAgICAgIDsgYWJzKHE1IC0gcTApIDw9IDEKKyAgICBwYW5kICAgICAgICAgICAgICAgIG0xLCBtNworICAgIG1vdmEgICAgICAgICAgICAgICAgbTE0LCBbUTZdCisgICAgbW92YSAgICAgICAgICAgICAgICBtMTUsIFtRN10KKyAgICBBQlNTVUJfQ01QICAgICAgICAgIG03LCBtMTQsIG0xMiwgbTYsIG00LCBtNSAgICAgICAgOyBhYnMocTQgLSBxMCkgPD0gMQorICAgIHBhbmQgICAgICAgICAgICAgICAgbTEsIG03CisgICAgQUJTU1VCX0NNUCAgICAgICAgICBtNywgbTE1LCBtMTIsIG02LCBtNCwgbTUgICAgICAgIDsgYWJzKHE1IC0gcTApIDw9IDEKKyAgICBwYW5kICAgICAgICAgICAgICAgIG0xLCBtNyAgICAgICAgICAgICAgICAgICAgICAgICAgOyBmbGF0OG91dCBmaW5hbCB2YWx1ZQorJWVuZGlmCisKKyAgICA7IGlmIChmbSkgeworICAgIDsgICAgIGlmIChvdXQgJiYgaW4pIGZpbHRlcl8xNCgpCisgICAgOyAgICAgZWxzZSBpZiAoaW4pICAgZmlsdGVyXzYoKQorICAgIDsgICAgIGVsc2UgaWYgKGhldikgIGZpbHRlcl8yKCkKKyAgICA7ICAgICBlbHNlICAgICAgICAgICBmaWx0ZXJfNCgpCisgICAgOyB9CisgICAgOworICAgIDsgZjE0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSAmICBvdXQgJiAgaW4KKyAgICA7IGY2OiAgZm0gJiB+ZjE0ICYgaW4gICAgICAgID0+IGZtICYgfihvdXQgJiBpbikgJiBpbiAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gZm0gJiB+b3V0ICYgIGluCisgICAgOyBmMjogIGZtICYgfmYxNCAmIH5mNiAmIGhldiA9PiBmbSAmIH4ob3V0ICYgaW4pICYgfih+b3V0ICYgaW4pICYgaGV2ICAgICAgICAgID0+IGZtICYgIH5pbiAmICBoZXYKKyAgICA7IGY0OiAgZm0gJiB+ZjE0ICYgfmY2ICYgfmYyID0+IGZtICYgfihvdXQgJiBpbikgJiB+KH5vdXQgJiBpbikgJiB+KH5pbiAmIGhldikgPT4gZm0gJiAgfmluICYgfmhldgorCisgICAgOyAobTA6IGhldiwgW20xOiBmbGF0OG91dF0sIFttMjogZmxhdDhpbl0sIG0zOiBmbSwgbTguLjE1OiBwNSBwNCBwMSBwMCBxMCBxMSBxNiBxNykKKyAgICA7IGZpbHRlcjIoKQorJWlmICUyICE9IDQ0CisgICAgbW92YSAgICAgICAgICAgICAgICBtNiwgW3BiXzgwXSAgICAgICAgICAgICAgICAgICAgIDsgYWxyZWFkeSBpbiBtNiBpZiA0NF8xNgorJWVuZGlmCisgICAgcHhvciAgICAgICAgICAgICAgICBtMTUsIG0xMiwgbTYgICAgICAgICAgICAgICAgICAgIDsgcTAgXiAweDgwCisgICAgcHhvciAgICAgICAgICAgICAgICBtMTQsIG0xMSwgbTYgICAgICAgICAgICAgICAgICAgIDsgcDAgXiAweDgwCisgICAgcHN1YnNiICAgICAgICAgICAgICBtMTUsIG0xNCAgICAgICAgICAgICAgICAgICAgICAgIDsgKHNpZ25lZCkgcTAgLSBwMAorICAgIHB4b3IgICAgICAgICAgICAgICAgbTQsIG0xMCwgbTYgICAgICAgICAgICAgICAgICAgICA7IHAxIF4gMHg4MAorICAgIHB4b3IgICAgICAgICAgICAgICAgbTUsIG0xMywgbTYgICAgICAgICAgICAgICAgICAgICA7IHExIF4gMHg4MAorICAgIHBzdWJzYiAgICAgICAgICAgICAgbTQsIG01ICAgICAgICAgICAgICAgICAgICAgICAgICA7IChzaWduZWQpIHAxIC0gcTEKKyAgICBwYWRkc2IgICAgICAgICAgICAgIG00LCBtMTUgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIChxMCAtIHAwKSArIChwMSAtIHExKQorICAgIHBhZGRzYiAgICAgICAgICAgICAgbTQsIG0xNSAgICAgICAgICAgICAgICAgICAgICAgICA7IDIqKHEwIC0gcDApICsgKHAxIC0gcTEpCisgICAgcGFkZHNiICAgICAgICAgICAgICBtNCwgbTE1ICAgICAgICAgICAgICAgICAgICAgICAgIDsgMyoocTAgLSBwMCkgKyAocDEgLSBxMSkKKyAgICBwYWRkc2IgICAgICAgICAgICAgIG02LCBtNCwgW3BiXzRdICAgICAgICAgICAgICAgICAgOyBtNjogZjEgPSBjbGlwKGYgKyA0LCAxMjcpCisgICAgcGFkZHNiICAgICAgICAgICAgICBtNCwgW3BiXzNdICAgICAgICAgICAgICAgICAgICAgIDsgbTQ6IGYyID0gY2xpcChmICsgMywgMTI3KQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTE0LCBbcGJfMTBdICAgICAgICAgICAgICAgICAgICA7IHdpbGwgYmUgcmV1c2VkIGluIGZpbHRlcjQoKQorICAgIFNSU0hJRlQzQl8yWCAgICAgICAgbTYsIG00LCBtMTQsIG03ICAgICAgICAgICAgICAgICA7IGYxIGFuZCBmMiBzaWduIGJ5dGUgc2hpZnQgYnkgMworICAgIFNJR05fU1VCICAgICAgICAgICAgbTcsIG0xMiwgbTYsIG01LCBtOSAgICAgICAgICAgICA7IG03ID0gcTAgLSBmMQorICAgIFNJR05fQUREICAgICAgICAgICAgbTgsIG0xMSwgbTQsIG01LCBtOSAgICAgICAgICAgICA7IG04ID0gcDAgKyBmMgorJWlmICUyICE9IDQ0CisgICAgcGFuZG4gICAgICAgICAgICAgICBtNiwgbTIsIG0zICAgICAgICAgICAgICAgICAgICAgIDsgIH5tYXNrKGluKSAmIG1hc2soZm0pCisgICAgcGFuZCAgICAgICAgICAgICAgICBtNiwgbTAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgKH5tYXNrKGluKSAmIG1hc2soZm0pKSAmIG1hc2soaGV2KQorJWVsc2UKKyAgICBwYW5kICAgICAgICAgICAgICAgIG02LCBtMywgbTAKKyVlbmRpZgorICAgIE1BU0tfQVBQTFkgICAgICAgICAgbTcsIG0xMiwgbTYsIG01ICAgICAgICAgICAgICAgICA7IG03ID0gZmlsdGVyMihxMCkgJiBtYXNrIC8gd2Ugd3JpdGUgaXQgaW4gZmlsdGVyNCgpCisgICAgTUFTS19BUFBMWSAgICAgICAgICBtOCwgbTExLCBtNiwgbTUgICAgICAgICAgICAgICAgIDsgbTggPSBmaWx0ZXIyKHAwKSAmIG1hc2sgLyB3ZSB3cml0ZSBpdCBpbiBmaWx0ZXI0KCkKKworICAgIDsgKG0wOiBoZXYsIFttMTogZmxhdDhvdXRdLCBbbTI6IGZsYXQ4aW5dLCBtMzogZm0sIG03Li5tODogcTAnIHAwJywgbTEwLi4xMzogcDEgcDAgcTAgcTEsIG0xNDogcGJfMTAsIG0xNTogcTAtcDApCisgICAgOyBmaWx0ZXI0KCkKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG00LCBtMTUKKyAgICBwYWRkc2IgICAgICAgICAgICAgIG0xNSwgbTQgICAgICAgICAgICAgICAgICAgICAgICAgOyAyICogKHEwIC0gcDApCisgICAgcGFkZHNiICAgICAgICAgICAgICBtMTUsIG00ICAgICAgICAgICAgICAgICAgICAgICAgIDsgMyAqIChxMCAtIHAwKQorICAgIHBhZGRzYiAgICAgICAgICAgICAgbTYsIG0xNSwgW3BiXzRdICAgICAgICAgICAgICAgICA7IG02OiAgZjEgPSBjbGlwKGYgKyA0LCAxMjcpCisgICAgcGFkZHNiICAgICAgICAgICAgICBtMTUsIFtwYl8zXSAgICAgICAgICAgICAgICAgICAgIDsgbTE1OiBmMiA9IGNsaXAoZiArIDMsIDEyNykKKyAgICBTUlNISUZUM0JfMlggICAgICAgIG02LCBtMTUsIG0xNCwgbTkgICAgICAgICAgICAgICAgOyBmMSBhbmQgZjIgc2lnbiBieXRlIHNoaWZ0IGJ5IDMKKyVpZiAlMiAhPSA0NAorJWRlZmluZSBwMHRtcCBtNworJWRlZmluZSBxMHRtcCBtOQorICAgIHBhbmRuICAgICAgICAgICAgICAgbTUsIG0yLCBtMyAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgfm1hc2soaW4pICYgbWFzayhmbSkKKyAgICBwYW5kbiAgICAgICAgICAgICAgIG0wLCBtNSAgICAgICAgICAgICAgICAgICAgICAgICAgOyB+bWFzayhoZXYpICYgKH5tYXNrKGluKSAmIG1hc2soZm0pKQorJWVsc2UKKyVkZWZpbmUgcDB0bXAgbTEKKyVkZWZpbmUgcTB0bXAgbTIKKyAgICBwYW5kbiAgICAgICAgICAgICAgIG0wLCBtMworJWVuZGlmCisgICAgU0lHTl9TVUIgICAgICAgICAgICBxMHRtcCwgbTEyLCBtNiwgbTQsIG0xNCAgICAgICAgIDsgcTAgLSBmMQorICAgIE1BU0tfQVBQTFkgICAgICAgICAgcTB0bXAsIG03LCBtMCwgbTUgICAgICAgICAgICAgICA7IGZpbHRlcjQocTApICYgbWFzaworICAgIG1vdmEgICAgICAgICAgICAgICAgW1EwXSwgcTB0bXAKKyAgICBTSUdOX0FERCAgICAgICAgICAgIHAwdG1wLCBtMTEsIG0xNSwgbTQsIG0xNCAgICAgICAgOyBwMCArIGYyCisgICAgTUFTS19BUFBMWSAgICAgICAgICBwMHRtcCwgbTgsIG0wLCBtNSAgICAgICAgICAgICAgIDsgZmlsdGVyNChwMCkgJiBtYXNrCisgICAgbW92YSAgICAgICAgICAgICAgICBbUDBdLCBwMHRtcAorICAgIHBhZGRiICAgICAgICAgICAgICAgbTYsIFtwYl84MF0gICAgICAgICAgICAgICAgICAgICA7CisgICAgcHhvciAgICAgICAgICAgICAgICBtOCwgbTggICAgICAgICAgICAgICAgICAgICAgICAgIDsgICBmPShmMSsxKT4+MQorICAgIHBhdmdiICAgICAgICAgICAgICAgbTYsIG04ICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgcHN1YmIgICAgICAgICAgICAgICBtNiwgW3BiXzQwXSAgICAgICAgICAgICAgICAgICAgIDsKKyAgICBTSUdOX0FERCAgICAgICAgICAgIG03LCBtMTAsIG02LCBtOCwgbTkgICAgICAgICAgICAgOyBwMSArIGYKKyAgICBTSUdOX1NVQiAgICAgICAgICAgIG00LCBtMTMsIG02LCBtOCwgbTkgICAgICAgICAgICAgOyBxMSAtIGYKKyAgICBNQVNLX0FQUExZICAgICAgICAgIG03LCBtMTAsIG0wLCBtMTQgICAgICAgICAgICAgICAgOyBtNyA9IGZpbHRlcjQocDEpCisgICAgTUFTS19BUFBMWSAgICAgICAgICBtNCwgbTEzLCBtMCwgbTE0ICAgICAgICAgICAgICAgIDsgbTQgPSBmaWx0ZXI0KHExKQorICAgIG1vdmEgICAgICAgICAgICAgICAgW1AxXSwgbTcKKyAgICBtb3ZhICAgICAgICAgICAgICAgIFtRMV0sIG00CisKKyAgICA7IChbbTE6IGZsYXQ4b3V0XSwgbTI6IGZsYXQ4aW4sIG0zOiBmbSwgbTEwLi4xMzogcDEgcDAgcTAgcTEpCisgICAgOyBmaWx0ZXI2KCkKKyVpZiAlMiAhPSA0NAorICAgIHB4b3IgICAgICAgICAgICAgICAgbTAsIG0wCislaWYgJTIgPiAxNgorICAgIHBhbmQgICAgICAgICAgICAgICAgbTMsIG0yCislZWxzZQorICAgIHBhbmQgICAgICAgICAgICAgICAgbTIsIG0zICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgbWFzayhmbSkgJiBtYXNrKGluKQorICAgIHBhbmRuICAgICAgICAgICAgICAgbTMsIG0xLCBtMiAgICAgICAgICAgICAgICAgICAgICA7IH5tYXNrKG91dCkgJiAobWFzayhmbSkgJiBtYXNrKGluKSkKKyVlbmRpZgorICAgIG1vdmEgICAgICAgICAgICAgICBtMTQsIFtQM10KKyAgICBtb3ZhICAgICAgICAgICAgICAgbTE1LCBbUDJdCisgICAgbW92YSAgICAgICAgICAgICAgICBtOCwgW1EyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTksIFtRM10KKyAgICBGSUxURVJfSU5JVCAgICAgICAgIG00LCBtNSwgbTYsIG03LCBbUDJdLCA2LCAgICAgICAgICAgICAgICAgICAgIG0zLCBtMTUgICAgOyBbcDJdCisgICAgRklMVEVSX1VQREFURSAgICAgICBtNiwgbTcsIG00LCBtNSwgW1AxXSwgbTE0LCBtMTUsIG0xMCwgbTEzLCAzLCBtMyAgICAgICAgIDsgW3AxXSAtcDMgLXAyICtwMSArcTEKKyAgICBGSUxURVJfVVBEQVRFICAgICAgIG00LCBtNSwgbTYsIG03LCBbUDBdLCBtMTQsIG0xMCwgbTExLCAgbTgsIDMsIG0zICAgICAgICAgOyBbcDBdIC1wMyAtcDEgK3AwICtxMgorICAgIEZJTFRFUl9VUERBVEUgICAgICAgbTYsIG03LCBtNCwgbTUsIFtRMF0sIG0xNCwgbTExLCBtMTIsICBtOSwgMywgbTMgICAgICAgICA7IFtxMF0gLXAzIC1wMCArcTAgK3EzCisgICAgRklMVEVSX1VQREFURSAgICAgICBtNCwgbTUsIG02LCBtNywgW1ExXSwgbTE1LCBtMTIsIG0xMywgIG05LCAzLCBtMyAgICAgICAgIDsgW3ExXSAtcDIgLXEwICtxMSArcTMKKyAgICBGSUxURVJfVVBEQVRFICAgICAgIG02LCBtNywgbTQsIG01LCBbUTJdLCBtMTAsIG0xMywgIG04LCAgbTksIDMsIG0zLCAgbTggICAgOyBbcTJdIC1wMSAtcTEgK3EyICtxMworJWVuZGlmCisKKyAgICA7IChtMDogMCwgW20xOiBmbGF0OG91dF0sIG0yOiBmbSAmIGZsYXQ4aW4sIG04Li4xNTogcTIgcTMgcDEgcDAgcTAgcTEgcDMgcDIpCisgICAgOyBmaWx0ZXIxNCgpCisgICAgOworICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTIgIG0zICBtOCAgbTkgbTE0IG0xNSBtMTAgbTExIG0xMiBtMTMKKyAgICA7CisgICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEyICBxMyAgcDMgIHAyICBwMSAgcDAgIHEwICBxMQorICAgIDsgcDYgIC03ICAgICAgICAgICAgICAgICAgICAgcDcgIHA2ICBwNSAgcDQgICAuICAgLiAgIC4gICAuICAgLgorICAgIDsgcDUgIC02ICAtcDcgLXA2ICtwNSArcTEgICAgIC4gICAuICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICA7IHA0ICAtNSAgLXA3IC1wNSArcDQgK3EyICAgICAuICAgICAgIC4gICAuICAgICAgICAgICAgICAgICAgICAgIHEyCisgICAgOyBwMyAgLTQgIC1wNyAtcDQgK3AzICtxMyAgICAgLiAgICAgICAgICAgLiAgIC4gICAgICAgICAgICAgICAgICBxMworICAgIDsgcDIgIC0zICAtcDcgLXAzICtwMiArcTQgICAgIC4gICAgICAgICAgICAgICAuICAgLiAgICAgICAgICAgICAgcTQKKyAgICA7IHAxICAtMiAgLXA3IC1wMiArcDEgK3E1ICAgICAuICAgICAgICAgICAgICAgICAgIC4gICAuICAgICAgICAgIHE1CisgICAgOyBwMCAgLTEgIC1wNyAtcDEgK3AwICtxNiAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgLiAgIC4gICAgICBxNgorICAgIDsgcTAgICswICAtcDcgLXAwICtxMCArcTcgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgLiAgcTcKKyAgICA7IHExICArMSAgLXA2IC1xMCArcTEgK3E3ICAgIHExICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAuCisgICAgOyBxMiAgKzIgIC1wNSAtcTEgK3EyICtxNyAgICAgLiAgcTIgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgIDsgcTMgICszICAtcDQgLXEyICtxMyArcTcgICAgICAgICAuICBxMyAgIC4gICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICA7IHE0ICArNCAgLXAzIC1xMyArcTQgK3E3ICAgICAgICAgICAgIC4gIHE0ICAgLiAgICAgICAgICAgICAgICAgICAuCisgICAgOyBxNSAgKzUgIC1wMiAtcTQgK3E1ICtxNyAgICAgICAgICAgICAgICAgLiAgcTUgICAuICAgICAgICAgICAgICAgLgorICAgIDsgcTYgICs2ICAtcDEgLXE1ICtxNiArcTcgICAgICAgICAgICAgICAgICAgICAuICBxNiAgIC4gICAgICAgICAgIC4KKworJWlmICUyID09IDE2CisgICAgcGFuZCAgICAgICAgICAgIG0xLCBtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtYXNrKG91dCkgJiAobWFzayhmbSkgJiBtYXNrKGluKSkKKyAgICBtb3ZhICAgICAgICAgICAgbTIsIFtQN10KKyAgICBtb3ZhICAgICAgICAgICAgbTMsIFtQNl0KKyAgICBtb3ZhICAgICAgICAgICAgbTgsIFtQNV0KKyAgICBtb3ZhICAgICAgICAgICAgbTksIFtQNF0KKyAgICBGSUxURVJfSU5JVCAgICAgbTQsIG01LCBtNiwgbTcsIFtQNl0sICAxNCwgICAgICAgICAgICAgICAgICAgbTEsICBtMworICAgIEZJTFRFUl9VUERBVEUgICBtNiwgbTcsIG00LCBtNSwgW1A1XSwgIG0yLCAgbTMsICBtOCwgbTEzLCA0LCBtMSwgIG04ICAgICAgICAgICAgICAgIDsgW3A1XSAtcDcgLXA2ICtwNSArcTEKKyAgICBGSUxURVJfVVBEQVRFICAgbTQsIG01LCBtNiwgbTcsIFtQNF0sICBtMiwgIG04LCAgbTksIG0xMywgNCwgbTEsICBtOSwgbTEzLCBbUTJdICAgICA7IFtwNF0gLXA3IC1wNSArcDQgK3EyCisgICAgRklMVEVSX1VQREFURSAgIG02LCBtNywgbTQsIG01LCBbUDNdLCAgbTIsICBtOSwgbTE0LCBtMTMsIDQsIG0xLCBtMTQsIG0xMywgW1EzXSAgICAgOyBbcDNdIC1wNyAtcDQgK3AzICtxMworICAgIEZJTFRFUl9VUERBVEUgICBtNCwgbTUsIG02LCBtNywgW1AyXSwgIG0yLCBtMTQsIG0xNSwgbTEzLCA0LCBtMSwgICAgICBtMTMsIFtRNF0gICAgIDsgW3AyXSAtcDcgLXAzICtwMiArcTQKKyAgICBGSUxURVJfVVBEQVRFICAgbTYsIG03LCBtNCwgbTUsIFtQMV0sICBtMiwgbTE1LCBtMTAsIG0xMywgNCwgbTEsICAgICAgbTEzLCBbUTVdICAgICA7IFtwMV0gLXA3IC1wMiArcDEgK3E1CisgICAgRklMVEVSX1VQREFURSAgIG00LCBtNSwgbTYsIG03LCBbUDBdLCAgbTIsIG0xMCwgbTExLCBtMTMsIDQsIG0xLCAgICAgIG0xMywgW1E2XSAgICAgOyBbcDBdIC1wNyAtcDEgK3AwICtxNgorICAgIEZJTFRFUl9VUERBVEUgICBtNiwgbTcsIG00LCBtNSwgW1EwXSwgIG0yLCBtMTEsIG0xMiwgbTEzLCA0LCBtMSwgICAgICBtMTMsIFtRN10gICAgIDsgW3EwXSAtcDcgLXAwICtxMCArcTcKKyAgICBGSUxURVJfVVBEQVRFICAgbTQsIG01LCBtNiwgbTcsIFtRMV0sICBtMywgbTEyLCAgbTIsIG0xMywgNCwgbTEsICAgICAgIG0yLCBbUTFdICAgICA7IFtxMV0gLXA2IC1xMCArcTEgK3E3CisgICAgRklMVEVSX1VQREFURSAgIG02LCBtNywgbTQsIG01LCBbUTJdLCAgbTgsICBtMiwgIG0zLCBtMTMsIDQsIG0xLCAgICAgICBtMywgW1EyXSAgICAgOyBbcTJdIC1wNSAtcTEgK3EyICtxNworICAgIEZJTFRFUl9VUERBVEUgICBtNCwgbTUsIG02LCBtNywgW1EzXSwgIG05LCAgbTMsICBtOCwgbTEzLCA0LCBtMSwgIG04LCAgbTgsIFtRM10gICAgIDsgW3EzXSAtcDQgLXEyICtxMyArcTcKKyAgICBGSUxURVJfVVBEQVRFICAgbTYsIG03LCBtNCwgbTUsIFtRNF0sIG0xNCwgIG04LCAgbTksIG0xMywgNCwgbTEsICBtOSwgIG05LCBbUTRdICAgICA7IFtxNF0gLXAzIC1xMyArcTQgK3E3CisgICAgRklMVEVSX1VQREFURSAgIG00LCBtNSwgbTYsIG03LCBbUTVdLCBtMTUsICBtOSwgbTE0LCBtMTMsIDQsIG0xLCBtMTQsIG0xNCwgW1E1XSAgICAgOyBbcTVdIC1wMiAtcTQgK3E1ICtxNworICAgIEZJTFRFUl9VUERBVEUgICBtNiwgbTcsIG00LCBtNSwgW1E2XSwgbTEwLCBtMTQsIG0xNSwgbTEzLCA0LCBtMSwgbTE1LCBtMTUsIFtRNl0gICAgIDsgW3E2XSAtcDEgLXE1ICtxNiArcTcKKyVlbmRpZgorCislaWZpZG4gJTEsIGgKKyVpZiAlMiA9PSAxNgorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbUDddCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTEsIFtQNl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMiwgW1A1XQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0zLCBbUDRdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTQsIFtQM10KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNSwgW1AyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG02LCBbUDFdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTcsIFtQMF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtOCwgW1EwXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG05LCBbUTFdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICBtMTAsIFtRMl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgIG0xMSwgW1EzXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgbTEyLCBbUTRdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICBtMTMsIFtRNV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgIG0xNCwgW1E2XQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgbTE1LCBbUTddCisgICAgVFJBTlNQT1NFMTZ4MTZCIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIFtyc3BdCisgICAgREVGSU5FX1JFQUxfUDdfVE9fUTcKKyAgICBtb3Z1ICBbUDddLCAgbTAKKyAgICBtb3Z1ICBbUDZdLCAgbTEKKyAgICBtb3Z1ICBbUDVdLCAgbTIKKyAgICBtb3Z1ICBbUDRdLCAgbTMKKyAgICBtb3Z1ICBbUDNdLCAgbTQKKyAgICBtb3Z1ICBbUDJdLCAgbTUKKyAgICBtb3Z1ICBbUDFdLCAgbTYKKyAgICBtb3Z1ICBbUDBdLCAgbTcKKyAgICBtb3Z1ICBbUTBdLCAgbTgKKyAgICBtb3Z1ICBbUTFdLCAgbTkKKyAgICBtb3Z1ICBbUTJdLCBtMTAKKyAgICBtb3Z1ICBbUTNdLCBtMTEKKyAgICBtb3Z1ICBbUTRdLCBtMTIKKyAgICBtb3Z1ICBbUTVdLCBtMTMKKyAgICBtb3Z1ICBbUTZdLCBtMTQKKyAgICBtb3Z1ICBbUTddLCBtMTUKKyVlbGlmICUyID09IDQ0CisgICAgU1dBUCAwLCA3ICAgOyBtMCA9IHAxCisgICAgU1dBUCAzLCA0ICAgOyBtMyA9IHExCisgICAgREVGSU5FX1JFQUxfUDdfVE9fUTcgMgorICAgIFNCVVRURVJGTFkgIGJ3LCAwLCAxLCA4CisgICAgU0JVVFRFUkZMWSAgYncsIDIsIDMsIDgKKyAgICBTQlVUVEVSRkxZICB3ZCwgMCwgMiwgOAorICAgIFNCVVRURVJGTFkgIHdkLCAxLCAzLCA4CisgICAgU0JVVFRFUkZMWSAgZHEsIDAsIDQsIDgKKyAgICBTQlVUVEVSRkxZICBkcSwgMSwgNSwgOAorICAgIFNCVVRURVJGTFkgIGRxLCAyLCA2LCA4CisgICAgU0JVVFRFUkZMWSAgZHEsIDMsIDcsIDgKKyAgICBtb3ZkICBbUDddLCBtMAorICAgIHB1bnBja2hxZHEgbTAsIG04CisgICAgbW92ZCAgW1A2XSwgbTAKKyAgICBtb3ZkICBbUTBdLCBtMQorICAgIHB1bnBja2hxZHEgIG0xLCBtOQorICAgIG1vdmQgIFtRMV0sIG0xCisgICAgbW92ZCAgW1AzXSwgbTIKKyAgICBwdW5wY2tocWRxICBtMiwgbTEwCisgICAgbW92ZCAgW1AyXSwgbTIKKyAgICBtb3ZkICBbUTRdLCBtMworICAgIHB1bnBja2hxZHEgbTMsIG0xMQorICAgIG1vdmQgIFtRNV0sIG0zCisgICAgbW92ZCAgW1A1XSwgbTQKKyAgICBwdW5wY2tocWRxIG00LCBtMTIKKyAgICBtb3ZkICBbUDRdLCBtNAorICAgIG1vdmQgIFtRMl0sIG01CisgICAgcHVucGNraHFkcSBtNSwgbTEzCisgICAgbW92ZCAgW1EzXSwgbTUKKyAgICBtb3ZkICBbUDFdLCBtNgorICAgIHB1bnBja2hxZHEgbTYsIG0xNAorICAgIG1vdmQgIFtQMF0sIG02CisgICAgbW92ZCAgW1E2XSwgbTcKKyAgICBwdW5wY2tocWRxIG03LCBtOAorICAgIG1vdmQgIFtRN10sIG03CislZWxzZQorICAgIDsgdGhlIGZvbGxvd2luZyBjb2RlIGRvIGEgdHJhbnNwb3NlIG9mIDggZnVsbCBsaW5lcyB0byAxNiBoYWxmCisgICAgOyBsaW5lcyAoaGlnaCBwYXJ0KS4gSXQgaXMgaW5saW5lZCB0byBhdm9pZCB0aGUgbmVlZCBvZiBhIHN0YWdpbmcgYXJlYQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbUDNdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTEsIFtQMl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMiwgW1AxXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0zLCBbUDBdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTQsIFtRMF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNSwgW1ExXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG02LCBbUTJdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTcsIFtRM10KKyAgICBERUZJTkVfUkVBTF9QN19UT19RNworICAgIFNCVVRURVJGTFkgIGJ3LCAgMCwgIDEsIDgKKyAgICBTQlVUVEVSRkxZICBidywgIDIsICAzLCA4CisgICAgU0JVVFRFUkZMWSAgYncsICA0LCAgNSwgOAorICAgIFNCVVRURVJGTFkgIGJ3LCAgNiwgIDcsIDgKKyAgICBTQlVUVEVSRkxZICB3ZCwgIDAsICAyLCA4CisgICAgU0JVVFRFUkZMWSAgd2QsICAxLCAgMywgOAorICAgIFNCVVRURVJGTFkgIHdkLCAgNCwgIDYsIDgKKyAgICBTQlVUVEVSRkxZICB3ZCwgIDUsICA3LCA4CisgICAgU0JVVFRFUkZMWSAgZHEsICAwLCAgNCwgOAorICAgIFNCVVRURVJGTFkgIGRxLCAgMSwgIDUsIDgKKyAgICBTQlVUVEVSRkxZICBkcSwgIDIsICA2LCA4CisgICAgU0JVVFRFUkZMWSAgZHEsICAzLCAgNywgOAorICAgIG1vdmggIFtQN10sIG0wCisgICAgcHVucGNraHFkcSBtMCwgbTgKKyAgICBtb3ZoICBbUDZdLCBtMAorICAgIG1vdmggIFtRMF0sIG0xCisgICAgcHVucGNraHFkcSAgbTEsIG05CisgICAgbW92aCAgW1ExXSwgbTEKKyAgICBtb3ZoICBbUDNdLCBtMgorICAgIHB1bnBja2hxZHEgIG0yLCBtMTAKKyAgICBtb3ZoICBbUDJdLCBtMgorICAgIG1vdmggIFtRNF0sIG0zCisgICAgcHVucGNraHFkcSBtMywgbTExCisgICAgbW92aCAgW1E1XSwgbTMKKyAgICBtb3ZoICBbUDVdLCBtNAorICAgIHB1bnBja2hxZHEgbTQsIG0xMgorICAgIG1vdmggIFtQNF0sIG00CisgICAgbW92aCAgW1EyXSwgbTUKKyAgICBwdW5wY2tocWRxIG01LCBtMTMKKyAgICBtb3ZoICBbUTNdLCBtNQorICAgIG1vdmggIFtQMV0sIG02CisgICAgcHVucGNraHFkcSBtNiwgbTE0CisgICAgbW92aCAgW1AwXSwgbTYKKyAgICBtb3ZoICBbUTZdLCBtNworICAgIHB1bnBja2hxZHEgbTcsIG04CisgICAgbW92aCAgW1E3XSwgbTcKKyVlbmRpZgorJWVuZGlmCisKKyAgICBSRVQKKyVlbmRtYWNybworCislbWFjcm8gTFBGXzE2X1ZIIDIKK0lOSVRfWE1NICUyCitjZ2xvYmFsIHZwOV9sb29wX2ZpbHRlcl92XyUxXzE2LCA1LDEwLDE2LCAgICAgIGRzdCwgc3RyaWRlLCBFLCBJLCBILCBtc3RyaWRlLCBkc3QxLCBkc3QyLCBzdHJpZGUzLCBtc3RyaWRlMworICAgIExPT1BGSUxURVIgdiwgJTEKK2NnbG9iYWwgdnA5X2xvb3BfZmlsdGVyX2hfJTFfMTYsIDUsMTAsMTYsIDI1NiwgZHN0LCBzdHJpZGUsIEUsIEksIEgsIG1zdHJpZGUsIGRzdDEsIGRzdDIsIHN0cmlkZTMsIG1zdHJpZGUzCisgICAgTE9PUEZJTFRFUiBoLCAlMQorJWVuZG1hY3JvCisKKyVtYWNybyBMUEZfMTZfVkhfQUxMX09QVFMgMQorTFBGXzE2X1ZIICUxLCBzc2UyCitMUEZfMTZfVkggJTEsIHNzc2UzCitMUEZfMTZfVkggJTEsIGF2eAorJWVuZG1hY3JvCisKK0xQRl8xNl9WSF9BTExfT1BUUyAxNgorTFBGXzE2X1ZIX0FMTF9PUFRTIDQ0CitMUEZfMTZfVkhfQUxMX09QVFMgNDgKK0xQRl8xNl9WSF9BTExfT1BUUyA4NAorTFBGXzE2X1ZIX0FMTF9PUFRTIDg4CisKKyVlbmRpZiA7IHg4Ni02NApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3ZwOW1jLmFzbSBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92cDltYy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllNjM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni92cDltYy5hc20KQEAgLTAsMCArMSw0MTkgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIFZQOSBNQyBTSU1EIG9wdGltaXphdGlvbnMKKzsqCis7KiBDb3B5cmlnaHQgKGMpIDIwMTMgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amUgZ21haWwgY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBIDMyCisKK2NleHRlcm4gcHdfMjU2CisKKyVtYWNybyBGOF9UQVBTIDgKK3RpbWVzIDE2IGRiICUxLCAlMgordGltZXMgMTYgZGIgJTMsICU0Cit0aW1lcyAxNiBkYiAlNSwgJTYKK3RpbWVzIDE2IGRiICU3LCAlOAorJWVuZG1hY3JvCis7IGludDhfdCBmZl9maWx0ZXJzX3Nzc2UzWzNdWzE1XVs0XVszMl0KK2NvbnN0IGZpbHRlcnNfc3NzZTMgOyBzbW9vdGgKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtMywgLTEsICAzMiwgIDY0LCAgMzgsICAgMSwgLTMsICAwCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTIsIC0yLCAgMjksICA2MywgIDQxLCAgIDIsIC0zLCAgMAorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTIC0yLCAtMiwgIDI2LCAgNjMsICA0MywgICA0LCAtNCwgIDAKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtMiwgLTMsICAyNCwgIDYyLCAgNDYsICAgNSwgLTQsICAwCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTIsIC0zLCAgMjEsICA2MCwgIDQ5LCAgIDcsIC00LCAgMAorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTIC0xLCAtNCwgIDE4LCAgNTksICA1MSwgICA5LCAtNCwgIDAKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtMSwgLTQsICAxNiwgIDU3LCAgNTMsICAxMiwgLTQsIC0xCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTEsIC00LCAgMTQsICA1NSwgIDU1LCAgMTQsIC00LCAtMQorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTIC0xLCAtNCwgIDEyLCAgNTMsICA1NywgIDE2LCAtNCwgLTEKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAgMCwgLTQsICAgOSwgIDUxLCAgNTksICAxOCwgLTQsIC0xCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgIDAsIC00LCAgIDcsICA0OSwgIDYwLCAgMjEsIC0zLCAtMgorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTICAwLCAtNCwgICA1LCAgNDYsICA2MiwgIDI0LCAtMywgLTIKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAgMCwgLTQsICAgNCwgIDQzLCAgNjMsICAyNiwgLTIsIC0yCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgIDAsIC0zLCAgIDIsICA0MSwgIDYzLCAgMjksIC0yLCAtMgorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTICAwLCAtMywgICAxLCAgMzgsICA2NCwgIDMyLCAtMSwgLTMKKyAgICAgICAgICAgICAgICAgICAgOyByZWd1bGFyCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgIDAsICAxLCAgLTUsIDEyNiwgICA4LCAgLTMsICAxLCAgMAorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTIC0xLCAgMywgLTEwLCAxMjIsICAxOCwgIC02LCAgMiwgIDAKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtMSwgIDQsIC0xMywgMTE4LCAgMjcsICAtOSwgIDMsIC0xCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTEsICA0LCAtMTYsIDExMiwgIDM3LCAtMTEsICA0LCAtMQorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTIC0xLCAgNSwgLTE4LCAxMDUsICA0OCwgLTE0LCAgNCwgLTEKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtMSwgIDUsIC0xOSwgIDk3LCAgNTgsIC0xNiwgIDUsIC0xCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTEsICA2LCAtMTksICA4OCwgIDY4LCAtMTgsICA1LCAtMQorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTIC0xLCAgNiwgLTE5LCAgNzgsICA3OCwgLTE5LCAgNiwgLTEKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtMSwgIDUsIC0xOCwgIDY4LCAgODgsIC0xOSwgIDYsIC0xCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTEsICA1LCAtMTYsICA1OCwgIDk3LCAtMTksICA1LCAtMQorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTIC0xLCAgNCwgLTE0LCAgNDgsIDEwNSwgLTE4LCAgNSwgLTEKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtMSwgIDQsIC0xMSwgIDM3LCAxMTIsIC0xNiwgIDQsIC0xCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTEsICAzLCAgLTksICAyNywgMTE4LCAtMTMsICA0LCAtMQorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTICAwLCAgMiwgIC02LCAgMTgsIDEyMiwgLTEwLCAgMywgLTEKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAgMCwgIDEsICAtMywgICA4LCAxMjYsICAtNSwgIDEsICAwCisgICAgICAgICAgICAgICAgICAgIDsgc2hhcnAKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtMSwgIDMsICAtNywgMTI3LCAgIDgsICAtMywgIDEsICAwCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTIsICA1LCAtMTMsIDEyNSwgIDE3LCAgLTYsICAzLCAtMQorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTIC0zLCAgNywgLTE3LCAxMjEsICAyNywgLTEwLCAgNSwgLTIKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtNCwgIDksIC0yMCwgMTE1LCAgMzcsIC0xMywgIDYsIC0yCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTQsIDEwLCAtMjMsIDEwOCwgIDQ4LCAtMTYsICA4LCAtMworICAgICAgICAgICAgICAgICAgICBGOF9UQVBTIC00LCAxMCwgLTI0LCAxMDAsICA1OSwgLTE5LCAgOSwgLTMKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtNCwgMTEsIC0yNCwgIDkwLCAgNzAsIC0yMSwgMTAsIC00CisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTQsIDExLCAtMjMsICA4MCwgIDgwLCAtMjMsIDExLCAtNAorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTIC00LCAxMCwgLTIxLCAgNzAsICA5MCwgLTI0LCAxMSwgLTQKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtMywgIDksIC0xOSwgIDU5LCAxMDAsIC0yNCwgMTAsIC00CisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTMsICA4LCAtMTYsICA0OCwgMTA4LCAtMjMsIDEwLCAtNAorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTIC0yLCAgNiwgLTEzLCAgMzcsIDExNSwgLTIwLCAgOSwgLTQKKyAgICAgICAgICAgICAgICAgICAgRjhfVEFQUyAtMiwgIDUsIC0xMCwgIDI3LCAxMjEsIC0xNywgIDcsIC0zCisgICAgICAgICAgICAgICAgICAgIEY4X1RBUFMgLTEsICAzLCAgLTYsICAxNywgMTI1LCAtMTMsICA1LCAtMgorICAgICAgICAgICAgICAgICAgICBGOF9UQVBTICAwLCAgMSwgIC0zLCAgIDgsIDEyNywgIC03LCAgMywgLTEKKworU0VDVElPTiAudGV4dAorCislbWFjcm8gZmlsdGVyX2hfZm4gMQorJWFzc2lnbiAlJXB4IG1tc2l6ZS8yCitjZ2xvYmFsIHZwOV8lMV84dGFwXzFkX2hfICUrICUlcHgsIDYsIDYsIDExLCBkc3QsIGRzdHJpZGUsIHNyYywgc3N0cmlkZSwgaCwgZmlsdGVyeQorICAgIG1vdmEgICAgICAgIG02LCBbcHdfMjU2XQorICAgIG1vdmEgICAgICAgIG03LCBbZmlsdGVyeXErIDBdCislaWYgQVJDSF9YODZfNjQgJiYgbW1zaXplID4gOAorICAgIG1vdmEgICAgICAgIG04LCBbZmlsdGVyeXErMzJdCisgICAgbW92YSAgICAgICAgbTksIFtmaWx0ZXJ5cSs2NF0KKyAgICBtb3ZhICAgICAgIG0xMCwgW2ZpbHRlcnlxKzk2XQorJWVuZGlmCisubG9vcDoKKyAgICBtb3ZoICAgICAgICBtMCwgW3NyY3EtM10KKyAgICBtb3ZoICAgICAgICBtMSwgW3NyY3EtMl0KKyAgICBtb3ZoICAgICAgICBtMiwgW3NyY3EtMV0KKyAgICBtb3ZoICAgICAgICBtMywgW3NyY3ErMF0KKyAgICBtb3ZoICAgICAgICBtNCwgW3NyY3ErMV0KKyAgICBtb3ZoICAgICAgICBtNSwgW3NyY3ErMl0KKyAgICBwdW5wY2tsYncgICBtMCwgbTEKKyAgICBwdW5wY2tsYncgICBtMiwgbTMKKyAgICBtb3ZoICAgICAgICBtMSwgW3NyY3ErM10KKyAgICBtb3ZoICAgICAgICBtMywgW3NyY3ErNF0KKyAgICBhZGQgICAgICAgc3JjcSwgc3N0cmlkZXEKKyAgICBwdW5wY2tsYncgICBtNCwgbTUKKyAgICBwdW5wY2tsYncgICBtMSwgbTMKKyAgICBwbWFkZHVic3cgICBtMCwgbTcKKyVpZiBBUkNIX1g4Nl82NCAmJiBtbXNpemUgPiA4CisgICAgcG1hZGR1YnN3ICAgbTIsIG04CisgICAgcG1hZGR1YnN3ICAgbTQsIG05CisgICAgcG1hZGR1YnN3ICAgbTEsIG0xMAorJWVsc2UKKyAgICBwbWFkZHVic3cgICBtMiwgW2ZpbHRlcnlxKzMyXQorICAgIHBtYWRkdWJzdyAgIG00LCBbZmlsdGVyeXErNjRdCisgICAgcG1hZGR1YnN3ICAgbTEsIFtmaWx0ZXJ5cSs5Nl0KKyVlbmRpZgorICAgIHBhZGR3ICAgICAgIG0wLCBtMgorICAgIHBhZGR3ICAgICAgIG00LCBtMQorICAgIHBhZGRzdyAgICAgIG0wLCBtNAorICAgIHBtdWxocnN3ICAgIG0wLCBtNgorJWlmaWRuICUxLCBhdmcKKyAgICBtb3ZoICAgICAgICBtMSwgW2RzdHFdCislZW5kaWYKKyAgICBwYWNrdXN3YiAgICBtMCwgbTAKKyVpZmlkbiAlMSwgYXZnCisgICAgcGF2Z2IgICAgICAgbTAsIG0xCislZW5kaWYKKyAgICBtb3ZoICAgIFtkc3RxXSwgbTAKKyAgICBhZGQgICAgICAgZHN0cSwgZHN0cmlkZXEKKyAgICBkZWMgICAgICAgICBoZAorICAgIGpnIC5sb29wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggc3NzZTMKK2ZpbHRlcl9oX2ZuIHB1dAorZmlsdGVyX2hfZm4gYXZnCisKK0lOSVRfWE1NIHNzc2UzCitmaWx0ZXJfaF9mbiBwdXQKK2ZpbHRlcl9oX2ZuIGF2ZworCislaWYgQVJDSF9YODZfNjQKKyVtYWNybyBmaWx0ZXJfaHgyX2ZuIDEKKyVhc3NpZ24gJSVweCBtbXNpemUKK2NnbG9iYWwgdnA5XyUxXzh0YXBfMWRfaF8gJSsgJSVweCwgNiwgNiwgMTQsIGRzdCwgZHN0cmlkZSwgc3JjLCBzc3RyaWRlLCBoLCBmaWx0ZXJ5CisgICAgbW92YSAgICAgICBtMTMsIFtwd18yNTZdCisgICAgbW92YSAgICAgICAgbTgsIFtmaWx0ZXJ5cSsgMF0KKyAgICBtb3ZhICAgICAgICBtOSwgW2ZpbHRlcnlxKzMyXQorICAgIG1vdmEgICAgICAgbTEwLCBbZmlsdGVyeXErNjRdCisgICAgbW92YSAgICAgICBtMTEsIFtmaWx0ZXJ5cSs5Nl0KKy5sb29wOgorICAgIG1vdnUgICAgICAgIG0wLCBbc3JjcS0zXQorICAgIG1vdnUgICAgICAgIG0xLCBbc3JjcS0yXQorICAgIG1vdnUgICAgICAgIG0yLCBbc3JjcS0xXQorICAgIG1vdnUgICAgICAgIG0zLCBbc3JjcSswXQorICAgIG1vdnUgICAgICAgIG00LCBbc3JjcSsxXQorICAgIG1vdnUgICAgICAgIG01LCBbc3JjcSsyXQorICAgIG1vdnUgICAgICAgIG02LCBbc3JjcSszXQorICAgIG1vdnUgICAgICAgIG03LCBbc3JjcSs0XQorICAgIGFkZCAgICAgICBzcmNxLCBzc3RyaWRlcQorICAgIFNCVVRURVJGTFkgIGJ3LCAwLCAxLCAxMgorICAgIFNCVVRURVJGTFkgIGJ3LCAyLCAzLCAxMgorICAgIFNCVVRURVJGTFkgIGJ3LCA0LCA1LCAxMgorICAgIFNCVVRURVJGTFkgIGJ3LCA2LCA3LCAxMgorICAgIHBtYWRkdWJzdyAgIG0wLCBtOAorICAgIHBtYWRkdWJzdyAgIG0xLCBtOAorICAgIHBtYWRkdWJzdyAgIG0yLCBtOQorICAgIHBtYWRkdWJzdyAgIG0zLCBtOQorICAgIHBtYWRkdWJzdyAgIG00LCBtMTAKKyAgICBwbWFkZHVic3cgICBtNSwgbTEwCisgICAgcG1hZGR1YnN3ICAgbTYsIG0xMQorICAgIHBtYWRkdWJzdyAgIG03LCBtMTEKKyAgICBwYWRkdyAgICAgICBtMCwgbTIKKyAgICBwYWRkdyAgICAgICBtMSwgbTMKKyAgICBwYWRkdyAgICAgICBtNCwgbTYKKyAgICBwYWRkdyAgICAgICBtNSwgbTcKKyAgICBwYWRkc3cgICAgICBtMCwgbTQKKyAgICBwYWRkc3cgICAgICBtMSwgbTUKKyAgICBwbXVsaHJzdyAgICBtMCwgbTEzCisgICAgcG11bGhyc3cgICAgbTEsIG0xMworICAgIHBhY2t1c3diICAgIG0wLCBtMQorJWlmaWRuICUxLCBhdmcKKyAgICBwYXZnYiAgICAgICBtMCwgW2RzdHFdCislZW5kaWYKKyAgICBtb3ZhICAgIFtkc3RxXSwgbTAKKyAgICBhZGQgICAgICAgZHN0cSwgZHN0cmlkZXEKKyAgICBkZWMgICAgICAgICBoZAorICAgIGpnIC5sb29wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NzZTMKK2ZpbHRlcl9oeDJfZm4gcHV0CitmaWx0ZXJfaHgyX2ZuIGF2ZworCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitmaWx0ZXJfaHgyX2ZuIHB1dAorZmlsdGVyX2h4Ml9mbiBhdmcKKyVlbmRpZgorCislZW5kaWYgOyBBUkNIX1g4Nl82NAorCislbWFjcm8gZmlsdGVyX3ZfZm4gMQorJWFzc2lnbiAlJXB4IG1tc2l6ZS8yCislaWYgQVJDSF9YODZfNjQKK2NnbG9iYWwgdnA5XyUxXzh0YXBfMWRfdl8gJSsgJSVweCwgNiwgOCwgMTEsIGRzdCwgZHN0cmlkZSwgc3JjLCBzc3RyaWRlLCBoLCBmaWx0ZXJ5LCBzcmM0LCBzc3RyaWRlMworJWVsc2UKK2NnbG9iYWwgdnA5XyUxXzh0YXBfMWRfdl8gJSsgJSVweCwgNCwgNywgMTEsIGRzdCwgZHN0cmlkZSwgc3JjLCBzc3RyaWRlLCBmaWx0ZXJ5LCBzcmM0LCBzc3RyaWRlMworICAgIG1vdiAgIGZpbHRlcnlxLCByNW1wCislZGVmaW5lIGhkIHI0bXAKKyVlbmRpZgorICAgIG1vdmEgICAgICAgIG02LCBbcHdfMjU2XQorICAgIGxlYSAgc3N0cmlkZTNxLCBbc3N0cmlkZXEqM10KKyAgICBsZWEgICAgICBzcmM0cSwgW3NyY3Erc3N0cmlkZXFdCisgICAgc3ViICAgICAgIHNyY3EsIHNzdHJpZGUzcQorICAgIG1vdmEgICAgICAgIG03LCBbZmlsdGVyeXErIDBdCislaWYgQVJDSF9YODZfNjQgJiYgbW1zaXplID4gOAorICAgIG1vdmEgICAgICAgIG04LCBbZmlsdGVyeXErMzJdCisgICAgbW92YSAgICAgICAgbTksIFtmaWx0ZXJ5cSs2NF0KKyAgICBtb3ZhICAgICAgIG0xMCwgW2ZpbHRlcnlxKzk2XQorJWVuZGlmCisubG9vcDoKKyAgICA7IEZJWE1FIG1heWJlIHJldXNlIGxvYWRzIGZyb20gcHJldmlvdXMgcm93cywgb3IganVzdAorICAgIDsgbW9yZSBnZW5lcmFsbHkgdW5yb2xsIHRoaXMgdG8gcHJldmVudCBtdWx0aXBsZSBsb2FkcyBvZgorICAgIDsgdGhlIHNhbWUgZGF0YT8KKyAgICBtb3ZoICAgICAgICBtMCwgW3NyY3FdCisgICAgbW92aCAgICAgICAgbTEsIFtzcmNxK3NzdHJpZGVxXQorICAgIG1vdmggICAgICAgIG0yLCBbc3JjcStzc3RyaWRlcSoyXQorICAgIG1vdmggICAgICAgIG0zLCBbc3JjcStzc3RyaWRlM3FdCisgICAgbW92aCAgICAgICAgbTQsIFtzcmM0cV0KKyAgICBtb3ZoICAgICAgICBtNSwgW3NyYzRxK3NzdHJpZGVxXQorICAgIHB1bnBja2xidyAgIG0wLCBtMQorICAgIHB1bnBja2xidyAgIG0yLCBtMworICAgIG1vdmggICAgICAgIG0xLCBbc3JjNHErc3N0cmlkZXEqMl0KKyAgICBtb3ZoICAgICAgICBtMywgW3NyYzRxK3NzdHJpZGUzcV0KKyAgICBhZGQgICAgICAgc3JjcSwgc3N0cmlkZXEKKyAgICBhZGQgICAgICBzcmM0cSwgc3N0cmlkZXEKKyAgICBwdW5wY2tsYncgICBtNCwgbTUKKyAgICBwdW5wY2tsYncgICBtMSwgbTMKKyAgICBwbWFkZHVic3cgICBtMCwgbTcKKyVpZiBBUkNIX1g4Nl82NCAmJiBtbXNpemUgPiA4CisgICAgcG1hZGR1YnN3ICAgbTIsIG04CisgICAgcG1hZGR1YnN3ICAgbTQsIG05CisgICAgcG1hZGR1YnN3ICAgbTEsIG0xMAorJWVsc2UKKyAgICBwbWFkZHVic3cgICBtMiwgW2ZpbHRlcnlxKzMyXQorICAgIHBtYWRkdWJzdyAgIG00LCBbZmlsdGVyeXErNjRdCisgICAgcG1hZGR1YnN3ICAgbTEsIFtmaWx0ZXJ5cSs5Nl0KKyVlbmRpZgorICAgIHBhZGR3ICAgICAgIG0wLCBtMgorICAgIHBhZGR3ICAgICAgIG00LCBtMQorICAgIHBhZGRzdyAgICAgIG0wLCBtNAorICAgIHBtdWxocnN3ICAgIG0wLCBtNgorJWlmaWRuICUxLCBhdmcKKyAgICBtb3ZoICAgICAgICBtMSwgW2RzdHFdCislZW5kaWYKKyAgICBwYWNrdXN3YiAgICBtMCwgbTAKKyVpZmlkbiAlMSwgYXZnCisgICAgcGF2Z2IgICAgICAgbTAsIG0xCislZW5kaWYKKyAgICBtb3ZoICAgIFtkc3RxXSwgbTAKKyAgICBhZGQgICAgICAgZHN0cSwgZHN0cmlkZXEKKyAgICBkZWMgICAgICAgICBoZAorICAgIGpnIC5sb29wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggc3NzZTMKK2ZpbHRlcl92X2ZuIHB1dAorZmlsdGVyX3ZfZm4gYXZnCisKK0lOSVRfWE1NIHNzc2UzCitmaWx0ZXJfdl9mbiBwdXQKK2ZpbHRlcl92X2ZuIGF2ZworCislaWYgQVJDSF9YODZfNjQKKworJW1hY3JvIGZpbHRlcl92eDJfZm4gMQorJWFzc2lnbiAlJXB4IG1tc2l6ZQorY2dsb2JhbCB2cDlfJTFfOHRhcF8xZF92XyAlKyAlJXB4LCA2LCA4LCAxNCwgZHN0LCBkc3RyaWRlLCBzcmMsIHNzdHJpZGUsIGgsIGZpbHRlcnksIHNyYzQsIHNzdHJpZGUzCisgICAgbW92YSAgICAgICBtMTMsIFtwd18yNTZdCisgICAgbGVhICBzc3RyaWRlM3EsIFtzc3RyaWRlcSozXQorICAgIGxlYSAgICAgIHNyYzRxLCBbc3JjcStzc3RyaWRlcV0KKyAgICBzdWIgICAgICAgc3JjcSwgc3N0cmlkZTNxCisgICAgbW92YSAgICAgICAgbTgsIFtmaWx0ZXJ5cSsgMF0KKyAgICBtb3ZhICAgICAgICBtOSwgW2ZpbHRlcnlxKzMyXQorICAgIG1vdmEgICAgICAgbTEwLCBbZmlsdGVyeXErNjRdCisgICAgbW92YSAgICAgICBtMTEsIFtmaWx0ZXJ5cSs5Nl0KKy5sb29wOgorICAgIDsgRklYTUUgbWF5YmUgcmV1c2UgbG9hZHMgZnJvbSBwcmV2aW91cyByb3dzLCBvciBqdXN0CisgICAgOyBtb3JlIGdlbmVyYWxseSB1bnJvbGwgdGhpcyB0byBwcmV2ZW50IG11bHRpcGxlIGxvYWRzIG9mCisgICAgOyB0aGUgc2FtZSBkYXRhPworICAgIG1vdnUgICAgICAgIG0wLCBbc3JjcV0KKyAgICBtb3Z1ICAgICAgICBtMSwgW3NyY3Erc3N0cmlkZXFdCisgICAgbW92dSAgICAgICAgbTIsIFtzcmNxK3NzdHJpZGVxKjJdCisgICAgbW92dSAgICAgICAgbTMsIFtzcmNxK3NzdHJpZGUzcV0KKyAgICBtb3Z1ICAgICAgICBtNCwgW3NyYzRxXQorICAgIG1vdnUgICAgICAgIG01LCBbc3JjNHErc3N0cmlkZXFdCisgICAgbW92dSAgICAgICAgbTYsIFtzcmM0cStzc3RyaWRlcSoyXQorICAgIG1vdnUgICAgICAgIG03LCBbc3JjNHErc3N0cmlkZTNxXQorICAgIGFkZCAgICAgICBzcmNxLCBzc3RyaWRlcQorICAgIGFkZCAgICAgIHNyYzRxLCBzc3RyaWRlcQorICAgIFNCVVRURVJGTFkgIGJ3LCAwLCAxLCAxMgorICAgIFNCVVRURVJGTFkgIGJ3LCAyLCAzLCAxMgorICAgIFNCVVRURVJGTFkgIGJ3LCA0LCA1LCAxMgorICAgIFNCVVRURVJGTFkgIGJ3LCA2LCA3LCAxMgorICAgIHBtYWRkdWJzdyAgIG0wLCBtOAorICAgIHBtYWRkdWJzdyAgIG0xLCBtOAorICAgIHBtYWRkdWJzdyAgIG0yLCBtOQorICAgIHBtYWRkdWJzdyAgIG0zLCBtOQorICAgIHBtYWRkdWJzdyAgIG00LCBtMTAKKyAgICBwbWFkZHVic3cgICBtNSwgbTEwCisgICAgcG1hZGR1YnN3ICAgbTYsIG0xMQorICAgIHBtYWRkdWJzdyAgIG03LCBtMTEKKyAgICBwYWRkdyAgICAgICBtMCwgbTIKKyAgICBwYWRkdyAgICAgICBtMSwgbTMKKyAgICBwYWRkdyAgICAgICBtNCwgbTYKKyAgICBwYWRkdyAgICAgICBtNSwgbTcKKyAgICBwYWRkc3cgICAgICBtMCwgbTQKKyAgICBwYWRkc3cgICAgICBtMSwgbTUKKyAgICBwbXVsaHJzdyAgICBtMCwgbTEzCisgICAgcG11bGhyc3cgICAgbTEsIG0xMworICAgIHBhY2t1c3diICAgIG0wLCBtMQorJWlmaWRuICUxLCBhdmcKKyAgICBwYXZnYiAgICAgICBtMCwgW2RzdHFdCislZW5kaWYKKyAgICBtb3ZhICAgIFtkc3RxXSwgbTAKKyAgICBhZGQgICAgICAgZHN0cSwgZHN0cmlkZXEKKyAgICBkZWMgICAgICAgICBoZAorICAgIGpnIC5sb29wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NzZTMKK2ZpbHRlcl92eDJfZm4gcHV0CitmaWx0ZXJfdngyX2ZuIGF2ZworCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitmaWx0ZXJfdngyX2ZuIHB1dAorZmlsdGVyX3Z4Ml9mbiBhdmcKKyVlbmRpZgorCislZW5kaWYgOyBBUkNIX1g4Nl82NAorCislbWFjcm8gZnBlbF9mbiA2CislaWYgJTIgPT0gNAorJWRlZmluZSAlJXNyY2ZuIG1vdmgKKyVkZWZpbmUgJSVkc3RmbiBtb3ZoCislZWxzZQorJWRlZmluZSAlJXNyY2ZuIG1vdnUKKyVkZWZpbmUgJSVkc3RmbiBtb3ZhCislZW5kaWYKKworJWlmICUyIDw9IG1tc2l6ZQorY2dsb2JhbCB2cDlfJTElMiwgNSwgNywgNCwgZHN0LCBkc3RyaWRlLCBzcmMsIHNzdHJpZGUsIGgsIGRzdHJpZGUzLCBzc3RyaWRlMworICAgIGxlYSAgc3N0cmlkZTNxLCBbc3N0cmlkZXEqM10KKyAgICBsZWEgIGRzdHJpZGUzcSwgW2RzdHJpZGVxKjNdCislZWxzZQorY2dsb2JhbCB2cDlfJTElMiwgNSwgNSwgNCwgZHN0LCBkc3RyaWRlLCBzcmMsIHNzdHJpZGUsIGgKKyVlbmRpZgorLmxvb3A6CisgICAgJSVzcmNmbiAgICAgbTAsIFtzcmNxXQorICAgICUlc3JjZm4gICAgIG0xLCBbc3JjcStzJTNdCisgICAgJSVzcmNmbiAgICAgbTIsIFtzcmNxK3MlNF0KKyAgICAlJXNyY2ZuICAgICBtMywgW3NyY3ErcyU1XQorICAgIGxlYSAgICAgICBzcmNxLCBbc3JjcStzc3RyaWRlcSolNl0KKyVpZmlkbiAlMSwgYXZnCisgICAgcGF2Z2IgICAgICAgbTAsIFtkc3RxXQorICAgIHBhdmdiICAgICAgIG0xLCBbZHN0cStkJTNdCisgICAgcGF2Z2IgICAgICAgbTIsIFtkc3RxK2QlNF0KKyAgICBwYXZnYiAgICAgICBtMywgW2RzdHErZCU1XQorJWVuZGlmCisgICAgJSVkc3RmbiBbZHN0cV0sIG0wCisgICAgJSVkc3RmbiBbZHN0cStkJTNdLCBtMQorICAgICUlZHN0Zm4gW2RzdHErZCU0XSwgbTIKKyAgICAlJWRzdGZuIFtkc3RxK2QlNV0sIG0zCisgICAgbGVhICAgICAgIGRzdHEsIFtkc3RxK2RzdHJpZGVxKiU2XQorICAgIHN1YiAgICAgICAgIGhkLCAlNgorICAgIGpueiAubG9vcAorICAgIFJFVAorJWVuZG1hY3JvCisKKyVkZWZpbmUgZDE2IDE2CislZGVmaW5lIHMxNiAxNgorJWRlZmluZSBkMzIgMzIKKyVkZWZpbmUgczMyIDMyCitJTklUX01NWCBtbXgKK2ZwZWxfZm4gcHV0LCA0LCAgc3RyaWRlcSwgc3RyaWRlcSoyLCBzdHJpZGUzcSwgNAorZnBlbF9mbiBwdXQsIDgsICBzdHJpZGVxLCBzdHJpZGVxKjIsIHN0cmlkZTNxLCA0CitJTklUX01NWCBtbXhleHQKK2ZwZWxfZm4gYXZnLCA0LCAgc3RyaWRlcSwgc3RyaWRlcSoyLCBzdHJpZGUzcSwgNAorZnBlbF9mbiBhdmcsIDgsICBzdHJpZGVxLCBzdHJpZGVxKjIsIHN0cmlkZTNxLCA0CitJTklUX1hNTSBzc2UKK2ZwZWxfZm4gcHV0LCAxNiwgc3RyaWRlcSwgc3RyaWRlcSoyLCBzdHJpZGUzcSwgNAorZnBlbF9mbiBwdXQsIDMyLCBtbXNpemUsICBzdHJpZGVxLCAgIHN0cmlkZXErbW1zaXplLCAyCitmcGVsX2ZuIHB1dCwgNjQsIG1tc2l6ZSwgIG1tc2l6ZSoyLCAgbW1zaXplKjMsIDEKK0lOSVRfWE1NIHNzZTIKK2ZwZWxfZm4gYXZnLCAxNiwgc3RyaWRlcSwgc3RyaWRlcSoyLCBzdHJpZGUzcSwgNAorZnBlbF9mbiBhdmcsIDMyLCBtbXNpemUsICBzdHJpZGVxLCAgIHN0cmlkZXErbW1zaXplLCAyCitmcGVsX2ZuIGF2ZywgNjQsIG1tc2l6ZSwgIG1tc2l6ZSoyLCAgbW1zaXplKjMsIDEKK0lOSVRfWU1NIGF2eAorZnBlbF9mbiBwdXQsIDMyLCBzdHJpZGVxLCBzdHJpZGVxKjIsIHN0cmlkZTNxLCA0CitmcGVsX2ZuIHB1dCwgNjQsIG1tc2l6ZSwgIHN0cmlkZXEsICAgc3RyaWRlcSttbXNpemUsIDIKKyVpZiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK2ZwZWxfZm4gYXZnLCAzMiwgc3RyaWRlcSwgc3RyaWRlcSoyLCBzdHJpZGUzcSwgNAorZnBlbF9mbiBhdmcsIDY0LCBtbXNpemUsICBzdHJpZGVxLCAgIHN0cmlkZXErbW1zaXplLCAyCislZW5kaWYKKyV1bmRlZiBzMTYKKyV1bmRlZiBkMTYKKyV1bmRlZiBzMzIKKyV1bmRlZiBkMzIKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni93NjR4bW10ZXN0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdzY0eG1tdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZTgzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYvdzY0eG1tdGVzdC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBjaGVjayBYTU0gcmVnaXN0ZXJzIGZvciBjbG9iYmVycyBvbiBXaW42NAorICogQ29weXJpZ2h0IChjKSAyMDEyIFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvdzY0eG1tdGVzdC5oIgorCit3cmFwKGF2Y29kZWNfb3BlbjIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgIEFWQ29kZWMgKmNvZGVjLAorICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpKQoreworICAgIHRlc3R4bW1jbG9iYmVycyhhdmNvZGVjX29wZW4yLCBhdmN0eCwgY29kZWMsIG9wdGlvbnMpOworfQorCit3cmFwKGF2Y29kZWNfZGVjb2RlX2F1ZGlvNChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkpCit7CisgICAgdGVzdHhtbWNsb2JiZXJzKGF2Y29kZWNfZGVjb2RlX2F1ZGlvNCwgYXZjdHgsIGZyYW1lLAorICAgICAgICAgICAgICAgICAgICBnb3RfZnJhbWVfcHRyLCBhdnBrdCk7Cit9CisKK3dyYXAoYXZjb2RlY19kZWNvZGVfdmlkZW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKnBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9waWN0dXJlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkpCit7CisgICAgdGVzdHhtbWNsb2JiZXJzKGF2Y29kZWNfZGVjb2RlX3ZpZGVvMiwgYXZjdHgsIHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgIGdvdF9waWN0dXJlX3B0ciwgYXZwa3QpOworfQorCit3cmFwKGF2Y29kZWNfZGVjb2RlX3N1YnRpdGxlMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN1YnRpdGxlICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9zdWJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KSkKK3sKKyAgICB0ZXN0eG1tY2xvYmJlcnMoYXZjb2RlY19kZWNvZGVfc3VidGl0bGUyLCBhdmN0eCwgc3ViLAorICAgICAgICAgICAgICAgICAgICBnb3Rfc3ViX3B0ciwgYXZwa3QpOworfQorCit3cmFwKGF2Y29kZWNfZW5jb2RlX2F1ZGlvMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3BhY2tldF9wdHIpKQoreworICAgIHRlc3R4bW1jbG9iYmVycyhhdmNvZGVjX2VuY29kZV9hdWRpbzIsIGF2Y3R4LCBhdnBrdCwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgIGdvdF9wYWNrZXRfcHRyKTsKK30KKword3JhcChhdmNvZGVjX2VuY29kZV92aWRlbyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWN0KSkKK3sKKyAgICB0ZXN0eG1tY2xvYmJlcnMoYXZjb2RlY19lbmNvZGVfdmlkZW8sIGF2Y3R4LCBidWYsIGJ1Zl9zaXplLCBwaWN0KTsKK30KKword3JhcChhdmNvZGVjX2VuY29kZV9zdWJ0aXRsZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlN1YnRpdGxlICpzdWIpKQoreworICAgIHRlc3R4bW1jbG9iYmVycyhhdmNvZGVjX2VuY29kZV9zdWJ0aXRsZSwgYXZjdHgsIGJ1ZiwgYnVmX3NpemUsIHN1Yik7Cit9CisKK3dyYXAoYXZjb2RlY19lbmNvZGVfdmlkZW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpKQoreworICAgIHRlc3R4bW1jbG9iYmVycyhhdmNvZGVjX2VuY29kZV92aWRlbzIsIGF2Y3R4LCBhdnBrdCwgZnJhbWUsIGdvdF9wYWNrZXRfcHRyKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni94dmlkaWRjdC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3h2aWRpZGN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1ODZmZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni94dmlkaWRjdC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBYVklEIE1QRUctNCBWSURFTyBDT0RFQworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBoZWFkZXIgZm9yIFh2aWQgSURDVCBmdW5jdGlvbnMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfWDg2X1hWSURJRENUX0gKKyNkZWZpbmUgQVZDT0RFQ19YODZfWFZJRElEQ1RfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3ZvaWQgZmZfeHZpZF9pZGN0X21teChzaG9ydCAqYmxvY2spOwordm9pZCBmZl94dmlkX2lkY3RfbW14X3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3h2aWRfaWRjdF9tbXhfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKKwordm9pZCBmZl94dmlkX2lkY3RfbW14ZXh0KHNob3J0ICpibG9jayk7Cit2b2lkIGZmX3h2aWRfaWRjdF9tbXhleHRfcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfeHZpZF9pZGN0X21teGV4dF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworCit2b2lkIGZmX3h2aWRfaWRjdF9zc2UyKHNob3J0ICpibG9jayk7Cit2b2lkIGZmX3h2aWRfaWRjdF9zc2UyX3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBzaG9ydCAqYmxvY2spOwordm9pZCBmZl94dmlkX2lkY3Rfc3NlMl9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgc2hvcnQgKmJsb2NrKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfWDg2X1hWSURJRENUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni94dmlkaWRjdF9pbml0LmMgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYveHZpZGlkY3RfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjI3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYveHZpZGlkY3RfaW5pdC5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pZGN0ZHNwLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy94dmlkaWRjdC5oIgorCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgInh2aWRpZGN0LmgiCisKK2F2X2NvbGQgdm9pZCBmZl94dmlkX2lkY3RfaW5pdF94ODYoSURDVERTUENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoaWdoX2JpdF9kZXB0aCB8fAorICAgICAgICAhKGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9BVVRPIHx8CisgICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX1hWSUQpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoSU5MSU5FX01NWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmlkY3RfcHV0ICA9IGZmX3h2aWRfaWRjdF9tbXhfcHV0OworICAgICAgICBjLT5pZGN0X2FkZCAgPSBmZl94dmlkX2lkY3RfbW14X2FkZDsKKyAgICAgICAgYy0+aWRjdCAgICAgID0gZmZfeHZpZF9pZGN0X21teDsKKyAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX05PTkU7CisgICAgfQorCisgICAgaWYgKElOTElORV9NTVhFWFQoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl94dmlkX2lkY3RfbW14ZXh0X3B1dDsKKyAgICAgICAgYy0+aWRjdF9hZGQgID0gZmZfeHZpZF9pZGN0X21teGV4dF9hZGQ7CisgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX3h2aWRfaWRjdF9tbXhleHQ7CisgICAgICAgIGMtPnBlcm1fdHlwZSA9IEZGX0lEQ1RfUEVSTV9OT05FOworICAgIH0KKworICAgIGlmIChJTkxJTkVfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmlkY3RfcHV0ICA9IGZmX3h2aWRfaWRjdF9zc2UyX3B1dDsKKyAgICAgICAgYy0+aWRjdF9hZGQgID0gZmZfeHZpZF9pZGN0X3NzZTJfYWRkOworICAgICAgICBjLT5pZGN0ICAgICAgPSBmZl94dmlkX2lkY3Rfc3NlMjsKKyAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX1NTRTI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3h2aWRpZGN0X21teC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3h2aWRpZGN0X21teC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YWE4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94ODYveHZpZGlkY3RfbW14LmMKQEAgLTAsMCArMSw1NDkgQEAKKy8qCisgKiBYVklEIE1QRUctNCBWSURFTyBDT0RFQworICogLSBNTVggYW5kIFhNTSBmb3J3YXJkIGRpc2NyZXRlIGNvc2luZSB0cmFuc2Zvcm0gLQorICoKKyAqIENvcHlyaWdodChDKSAyMDAxIFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICoKKyAqIE9yaWdpbmFsbHkgcHJvdmlkZWQgYnkgSW50ZWwgYXQgQVAtOTIyCisgKiBodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS92dHVuZS9jYnRzL3N0cm1zaW1kLzkyMmRvd24uaHRtCisgKiAoU2VlIG1vcmUgYXBwIG5vdGVzIGF0IGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL3Z0dW5lL2NidHMvc3RybXNpbWQvYXBwbm90ZXMuaHRtKQorICogYnV0IGluIGEgbGltaXRlZCBlZGl0aW9uLgorICogTmV3IG1hY3JvIGltcGxlbWVudHMgYSBjb2x1bW4gcGFydCBmb3IgcHJlY2lzZSBpRENUCisgKiBUaGUgcm91dGluZSBwcmVjaXNpb24gbm93IHNhdGlzZmllcyBJRUVFIHN0YW5kYXJkIDExODAtMTk5MC4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwMC0yMDAxIFBldGVyIEd1YmFub3YgPHBldGVyQGVsZWNhcmQubmV0LnJ1PgorICogUm91bmRpbmcgdHJpY2sgQ29weXJpZ2h0KEMpIDIwMDAgTWljaGVsIExlc3BpbmFzc2UgPHdhbGtlbkB6b3kub3JnPgorICoKKyAqIGh0dHA6Ly93d3cuZWxlY2FyZC5jb20vcGV0ZXIvaWRjdC5odG1sCisgKiBodHRwOi8vd3d3LmxpbnV4dmlkZW8ub3JnL21wZWcyZGVjLworICoKKyAqIFRoZXNlIGV4YW1wbGVzIGNvbnRhaW4gY29kZSBmcmFnbWVudHMgZm9yIGZpcnN0IHN0YWdlIGlEQ1QgOHg4CisgKiAoZm9yIHJvd3MpIGFuZCBmaXJzdCBzdGFnZSBEQ1QgOHg4IChmb3IgY29sdW1ucykKKyAqCisgKiBjb252ZXJzaW9uIHRvIGdjYyBzeW50YXggYnkgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pZGN0ZHNwLmgiCisKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAieHZpZGlkY3QuaCIKKworI2lmIEhBVkVfTU1YX0lOTElORQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmFyaW91cyBtZW1vcnkgY29uc3RhbnRzICh0cmlnb25vbWV0cmljIHZhbHVlcyBvciByb3VuZGluZyB2YWx1ZXMpCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitERUNMQVJFX0FMSUdORUQoOCwgc3RhdGljIGNvbnN0IGludDE2X3QsIHRnXzFfMTYpWzQgKiA0XSA9IHsKKyAgICAgMTMwMzYsICAxMzAzNiwgIDEzMDM2LCAgMTMwMzYsIC8vIHRnICogKDIgPDwgMTYpICsgMC41CisgICAgIDI3MTQ2LCAgMjcxNDYsICAyNzE0NiwgIDI3MTQ2LCAvLyB0ZyAqICgyIDw8IDE2KSArIDAuNQorICAgIC0yMTc0NiwgLTIxNzQ2LCAtMjE3NDYsIC0yMTc0NiwgLy8gdGcgKiAoMiA8PCAxNikgKyAwLjUKKyAgICAgMjMxNzAsICAyMzE3MCwgIDIzMTcwLCAgMjMxNzAKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcyAqICgyIDw8IDE1KSArIDAuNQorCitERUNMQVJFX0FMSUdORUQoOCwgc3RhdGljIGNvbnN0IGludDMyX3QsIHJvdW5kZXJfMClbMiAqIDhdID0geworICAgIDY1NTM2LCA2NTUzNiwKKyAgICAzNTk3LCAgIDM1OTcsCisgICAgMjI2MCwgICAyMjYwLAorICAgIDEyMDMsICAgMTIwMywKKyAgICAwLCAgICAgICAgIDAsCisgICAgMTIwLCAgICAgMTIwLAorICAgIDUxMiwgICAgIDUxMiwKKyAgICA1MTIsIDUxMgorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGUgZmlyc3Qgc3RhZ2UgaURDVCA4eDggLSBpbnZlcnNlIERDVHMgb2Ygcm93cworLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgOC1wb2ludCBpbnZlcnNlIERDVCBkaXJlY3QgYWxnb3JpdGhtCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHN0YXRpYyBjb25zdCBzaG9ydCB3WzMyXSA9IHsKKy8vICAgICBGSVgoY29zXzRfMTYpLCAgRklYKGNvc18yXzE2KSwgIEZJWChjb3NfNF8xNiksICBGSVgoY29zXzZfMTYpLAorLy8gICAgIEZJWChjb3NfNF8xNiksICBGSVgoY29zXzZfMTYpLCAtRklYKGNvc180XzE2KSwgLUZJWChjb3NfMl8xNiksCisvLyAgICAgRklYKGNvc180XzE2KSwgLUZJWChjb3NfNl8xNiksIC1GSVgoY29zXzRfMTYpLCAgRklYKGNvc18yXzE2KSwKKy8vICAgICBGSVgoY29zXzRfMTYpLCAtRklYKGNvc18yXzE2KSwgIEZJWChjb3NfNF8xNiksIC1GSVgoY29zXzZfMTYpLAorLy8gICAgIEZJWChjb3NfMV8xNiksICBGSVgoY29zXzNfMTYpLCAgRklYKGNvc181XzE2KSwgIEZJWChjb3NfN18xNiksCisvLyAgICAgRklYKGNvc18zXzE2KSwgLUZJWChjb3NfN18xNiksIC1GSVgoY29zXzFfMTYpLCAtRklYKGNvc181XzE2KSwKKy8vICAgICBGSVgoY29zXzVfMTYpLCAtRklYKGNvc18xXzE2KSwgIEZJWChjb3NfN18xNiksICBGSVgoY29zXzNfMTYpLAorLy8gICAgIEZJWChjb3NfN18xNiksIC1GSVgoY29zXzVfMTYpLCAgRklYKGNvc18zXzE2KSwgLUZJWChjb3NfMV8xNikgfTsKKy8vCisvLyAjZGVmaW5lIERDVF84X0lOVl9ST1coeCwgeSkKKy8vIHsKKy8vICAgICBpbnQgYTAsIGExLCBhMiwgYTMsIGIwLCBiMSwgYjIsIGIzOworLy8KKy8vICAgICBhMCA9IHhbMF0gKiB3WzBdICArIHhbMl0gKiB3WzFdICArIHhbNF0gKiB3WzJdICArIHhbNl0gKiB3WzNdOworLy8gICAgIGExID0geFswXSAqIHdbNF0gICsgeFsyXSAqIHdbNV0gICsgeFs0XSAqIHdbNl0gICsgeFs2XSAqIHdbN107CisvLyAgICAgYTIgPSB4WzBdICogd1s4XSAgKyB4WzJdICogd1s5XSAgKyB4WzRdICogd1sxMF0gKyB4WzZdICogd1sxMV07CisvLyAgICAgYTMgPSB4WzBdICogd1sxMl0gKyB4WzJdICogd1sxM10gKyB4WzRdICogd1sxNF0gKyB4WzZdICogd1sxNV07CisvLyAgICAgYjAgPSB4WzFdICogd1sxNl0gKyB4WzNdICogd1sxN10gKyB4WzVdICogd1sxOF0gKyB4WzddICogd1sxOV07CisvLyAgICAgYjEgPSB4WzFdICogd1syMF0gKyB4WzNdICogd1syMV0gKyB4WzVdICogd1syMl0gKyB4WzddICogd1syM107CisvLyAgICAgYjIgPSB4WzFdICogd1syNF0gKyB4WzNdICogd1syNV0gKyB4WzVdICogd1syNl0gKyB4WzddICogd1syN107CisvLyAgICAgYjMgPSB4WzFdICogd1syOF0gKyB4WzNdICogd1syOV0gKyB4WzVdICogd1szMF0gKyB4WzddICogd1szMV07CisvLworLy8gICAgIHlbMF0gPSBTSElGVF9ST1VORChhMCArIGIwKTsKKy8vICAgICB5WzFdID0gU0hJRlRfUk9VTkQoYTEgKyBiMSk7CisvLyAgICAgeVsyXSA9IFNISUZUX1JPVU5EKGEyICsgYjIpOworLy8gICAgIHlbM10gPSBTSElGVF9ST1VORChhMyArIGIzKTsKKy8vICAgICB5WzRdID0gU0hJRlRfUk9VTkQoYTMgLSBiMyk7CisvLyAgICAgeVs1XSA9IFNISUZUX1JPVU5EKGEyIC0gYjIpOworLy8gICAgIHlbNl0gPSBTSElGVF9ST1VORChhMSAtIGIxKTsKKy8vICAgICB5WzddID0gU0hJRlRfUk9VTkQoYTAgLSBiMCk7CisvLyB9CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbiB0aGlzIGltcGxlbWVudGF0aW9uIHRoZSBvdXRwdXRzIG9mIHRoZSBpRENULTFEIGFyZSBtdWx0aXBsaWVkCisvLyAgICAgZm9yIHJvd3MgMCw0IC0gYnkgY29zXzRfMTYsCisvLyAgICAgZm9yIHJvd3MgMSw3IC0gYnkgY29zXzFfMTYsCisvLyAgICAgZm9yIHJvd3MgMiw2IC0gYnkgY29zXzJfMTYsCisvLyAgICAgZm9yIHJvd3MgMyw1IC0gYnkgY29zXzNfMTYKKy8vIGFuZCBhcmUgc2hpZnRlZCB0byB0aGUgbGVmdCBmb3IgYmV0dGVyIGFjY3VyYWN5LgorLy8KKy8vIEZvciB0aGUgY29uc3RhbnRzIHVzZWQsCisvLyAgICAgRklYKGZsb2F0X2NvbnN0KSA9IChzaG9ydCkgKGZsb2F0X2NvbnN0ICogKDEgPDwgMTUpICsgMC41KQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUYWJsZXMgZm9yIG1teCBwcm9jZXNzb3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUYWJsZSBmb3Igcm93cyAwLDQgLSBjb25zdGFudHMgYXJlIG11bHRpcGxpZWQgYnkgY29zXzRfMTYKK0RFQ0xBUkVfQUxJR05FRCg4LCBzdGF0aWMgY29uc3QgaW50MTZfdCwgdGFiX2lfMDRfbW14KVszMiAqIDRdID0geworICAgICAxNjM4NCwgIDE2Mzg0LCAgMTYzODQsIC0xNjM4NCwgLy8gbW92cS0+IHcwNiB3MDQgdzAyIHcwMAorICAgICAyMTQwNywgICA4ODY3LCAgIDg4NjcsIC0yMTQwNywgLy8gdzA3IHcwNSB3MDMgdzAxCisgICAgIDE2Mzg0LCAtMTYzODQsICAxNjM4NCwgIDE2Mzg0LCAvLyB3MTQgdzEyIHcxMCB3MDgKKyAgICAgLTg4NjcsICAyMTQwNywgLTIxNDA3LCAgLTg4NjcsIC8vIHcxNSB3MTMgdzExIHcwOQorICAgICAyMjcyNSwgIDEyODczLCAgMTkyNjYsIC0yMjcyNSwgLy8gdzIyIHcyMCB3MTggdzE2CisgICAgIDE5MjY2LCAgIDQ1MjAsICAtNDUyMCwgLTEyODczLCAvLyB3MjMgdzIxIHcxOSB3MTcKKyAgICAgMTI4NzMsICAgNDUyMCwgICA0NTIwLCAgMTkyNjYsIC8vIHczMCB3MjggdzI2IHcyNAorICAgIC0yMjcyNSwgIDE5MjY2LCAtMTI4NzMsIC0yMjcyNSwgLy8gdzMxIHcyOSB3MjcgdzI1CisvLyBUYWJsZSBmb3Igcm93cyAxLDcgLSBjb25zdGFudHMgYXJlIG11bHRpcGxpZWQgYnkgY29zXzFfMTYKKyAgICAgMjI3MjUsICAyMjcyNSwgIDIyNzI1LCAtMjI3MjUsIC8vIG1vdnEtPiB3MDYgdzA0IHcwMiB3MDAKKyAgICAgMjk2OTIsICAxMjI5OSwgIDEyMjk5LCAtMjk2OTIsIC8vIHcwNyB3MDUgdzAzIHcwMQorICAgICAyMjcyNSwgLTIyNzI1LCAgMjI3MjUsICAyMjcyNSwgLy8gdzE0IHcxMiB3MTAgdzA4CisgICAgLTEyMjk5LCAgMjk2OTIsIC0yOTY5MiwgLTEyMjk5LCAvLyB3MTUgdzEzIHcxMSB3MDkKKyAgICAgMzE1MjEsICAxNzg1NSwgIDI2NzIyLCAtMzE1MjEsIC8vIHcyMiB3MjAgdzE4IHcxNgorICAgICAyNjcyMiwgICA2MjcwLCAgLTYyNzAsIC0xNzg1NSwgLy8gdzIzIHcyMSB3MTkgdzE3CisgICAgIDE3ODU1LCAgIDYyNzAsICAgNjI3MCwgIDI2NzIyLCAvLyB3MzAgdzI4IHcyNiB3MjQKKyAgICAtMzE1MjEsICAyNjcyMiwgLTE3ODU1LCAtMzE1MjEsIC8vIHczMSB3MjkgdzI3IHcyNQorLy8gVGFibGUgZm9yIHJvd3MgMiw2IC0gY29uc3RhbnRzIGFyZSBtdWx0aXBsaWVkIGJ5IGNvc18yXzE2CisgICAgIDIxNDA3LCAgMjE0MDcsICAyMTQwNywgLTIxNDA3LCAvLyBtb3ZxLT4gdzA2IHcwNCB3MDIgdzAwCisgICAgIDI3OTY5LCAgMTE1ODUsICAxMTU4NSwgLTI3OTY5LCAvLyB3MDcgdzA1IHcwMyB3MDEKKyAgICAgMjE0MDcsIC0yMTQwNywgIDIxNDA3LCAgMjE0MDcsIC8vIHcxNCB3MTIgdzEwIHcwOAorICAgIC0xMTU4NSwgIDI3OTY5LCAtMjc5NjksIC0xMTU4NSwgLy8gdzE1IHcxMyB3MTEgdzA5CisgICAgIDI5NjkyLCAgMTY4MTksICAyNTE3MiwgLTI5NjkyLCAvLyB3MjIgdzIwIHcxOCB3MTYKKyAgICAgMjUxNzIsICAgNTkwNiwgIC01OTA2LCAtMTY4MTksIC8vIHcyMyB3MjEgdzE5IHcxNworICAgICAxNjgxOSwgICA1OTA2LCAgIDU5MDYsICAyNTE3MiwgLy8gdzMwIHcyOCB3MjYgdzI0CisgICAgLTI5NjkyLCAgMjUxNzIsIC0xNjgxOSwgLTI5NjkyLCAvLyB3MzEgdzI5IHcyNyB3MjUKKy8vIFRhYmxlIGZvciByb3dzIDMsNSAtIGNvbnN0YW50cyBhcmUgbXVsdGlwbGllZCBieSBjb3NfM18xNgorICAgICAxOTI2NiwgIDE5MjY2LCAgMTkyNjYsIC0xOTI2NiwgLy8gbW92cS0+IHcwNiB3MDQgdzAyIHcwMAorICAgICAyNTE3MiwgIDEwNDI2LCAgMTA0MjYsIC0yNTE3MiwgLy8gdzA3IHcwNSB3MDMgdzAxCisgICAgIDE5MjY2LCAtMTkyNjYsICAxOTI2NiwgIDE5MjY2LCAvLyB3MTQgdzEyIHcxMCB3MDgKKyAgICAtMTA0MjYsICAyNTE3MiwgLTI1MTcyLCAtMTA0MjYsIC8vIHcxNSB3MTMgdzExIHcwOQorICAgICAyNjcyMiwgIDE1MTM3LCAgMjI2NTQsIC0yNjcyMiwgLy8gdzIyIHcyMCB3MTggdzE2CisgICAgIDIyNjU0LCAgIDUzMTUsICAtNTMxNSwgLTE1MTM3LCAvLyB3MjMgdzIxIHcxOSB3MTcKKyAgICAgMTUxMzcsICAgNTMxNSwgICA1MzE1LCAgMjI2NTQsIC8vIHczMCB3MjggdzI2IHcyNAorICAgIC0yNjcyMiwgIDIyNjU0LCAtMTUxMzcsIC0yNjcyMiwgLy8gdzMxIHcyOSB3MjcgdzI1Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRhYmxlcyBmb3IgeG1tIHByb2Nlc3NvcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vICUzIGZvciByb3dzIDAsNCAtIGNvbnN0YW50cyBhcmUgbXVsdGlwbGllZCBieSBjb3NfNF8xNgorREVDTEFSRV9BTElHTkVEKDgsIHN0YXRpYyBjb25zdCBpbnQxNl90LCB0YWJfaV8wNF94bW0pWzMyICogNF0gPSB7CisgICAgIDE2Mzg0LCAgMjE0MDcsICAxNjM4NCwgICA4ODY3LCAvLyBtb3ZxLT4gdzA1IHcwNCB3MDEgdzAwCisgICAgIDE2Mzg0LCAgIDg4NjcsIC0xNjM4NCwgLTIxNDA3LCAvLyB3MDcgdzA2IHcwMyB3MDIKKyAgICAgMTYzODQsICAtODg2NywgIDE2Mzg0LCAtMjE0MDcsIC8vIHcxMyB3MTIgdzA5IHcwOAorICAgIC0xNjM4NCwgIDIxNDA3LCAgMTYzODQsICAtODg2NywgLy8gdzE1IHcxNCB3MTEgdzEwCisgICAgIDIyNzI1LCAgMTkyNjYsICAxOTI2NiwgIC00NTIwLCAvLyB3MjEgdzIwIHcxNyB3MTYKKyAgICAgMTI4NzMsICAgNDUyMCwgLTIyNzI1LCAtMTI4NzMsIC8vIHcyMyB3MjIgdzE5IHcxOAorICAgICAxMjg3MywgLTIyNzI1LCAgIDQ1MjAsIC0xMjg3MywgLy8gdzI5IHcyOCB3MjUgdzI0CisgICAgICA0NTIwLCAgMTkyNjYsICAxOTI2NiwgLTIyNzI1LCAvLyB3MzEgdzMwIHcyNyB3MjYKKy8vICUzIGZvciByb3dzIDEsNyAtIGNvbnN0YW50cyBhcmUgbXVsdGlwbGllZCBieSBjb3NfMV8xNgorICAgICAyMjcyNSwgIDI5NjkyLCAgMjI3MjUsICAxMjI5OSwgLy8gbW92cS0+IHcwNSB3MDQgdzAxIHcwMAorICAgICAyMjcyNSwgIDEyMjk5LCAtMjI3MjUsIC0yOTY5MiwgLy8gdzA3IHcwNiB3MDMgdzAyCisgICAgIDIyNzI1LCAtMTIyOTksICAyMjcyNSwgLTI5NjkyLCAvLyB3MTMgdzEyIHcwOSB3MDgKKyAgICAtMjI3MjUsICAyOTY5MiwgIDIyNzI1LCAtMTIyOTksIC8vIHcxNSB3MTQgdzExIHcxMAorICAgICAzMTUyMSwgIDI2NzIyLCAgMjY3MjIsICAtNjI3MCwgLy8gdzIxIHcyMCB3MTcgdzE2CisgICAgIDE3ODU1LCAgIDYyNzAsIC0zMTUyMSwgLTE3ODU1LCAvLyB3MjMgdzIyIHcxOSB3MTgKKyAgICAgMTc4NTUsIC0zMTUyMSwgICA2MjcwLCAtMTc4NTUsIC8vIHcyOSB3MjggdzI1IHcyNAorICAgICAgNjI3MCwgIDI2NzIyLCAgMjY3MjIsIC0zMTUyMSwgLy8gdzMxIHczMCB3MjcgdzI2CisvLyAlMyBmb3Igcm93cyAyLDYgLSBjb25zdGFudHMgYXJlIG11bHRpcGxpZWQgYnkgY29zXzJfMTYKKyAgICAgMjE0MDcsICAyNzk2OSwgIDIxNDA3LCAgMTE1ODUsIC8vIG1vdnEtPiB3MDUgdzA0IHcwMSB3MDAKKyAgICAgMjE0MDcsICAxMTU4NSwgLTIxNDA3LCAtMjc5NjksIC8vIHcwNyB3MDYgdzAzIHcwMgorICAgICAyMTQwNywgLTExNTg1LCAgMjE0MDcsIC0yNzk2OSwgLy8gdzEzIHcxMiB3MDkgdzA4CisgICAgLTIxNDA3LCAgMjc5NjksICAyMTQwNywgLTExNTg1LCAvLyB3MTUgdzE0IHcxMSB3MTAKKyAgICAgMjk2OTIsICAyNTE3MiwgIDI1MTcyLCAgLTU5MDYsIC8vIHcyMSB3MjAgdzE3IHcxNgorICAgICAxNjgxOSwgICA1OTA2LCAtMjk2OTIsIC0xNjgxOSwgLy8gdzIzIHcyMiB3MTkgdzE4CisgICAgIDE2ODE5LCAtMjk2OTIsICAgNTkwNiwgLTE2ODE5LCAvLyB3MjkgdzI4IHcyNSB3MjQKKyAgICAgIDU5MDYsICAyNTE3MiwgIDI1MTcyLCAtMjk2OTIsIC8vIHczMSB3MzAgdzI3IHcyNgorLy8gJTMgZm9yIHJvd3MgMyw1IC0gY29uc3RhbnRzIGFyZSBtdWx0aXBsaWVkIGJ5IGNvc18zXzE2CisgICAgIDE5MjY2LCAgMjUxNzIsICAxOTI2NiwgIDEwNDI2LCAvLyBtb3ZxLT4gdzA1IHcwNCB3MDEgdzAwCisgICAgIDE5MjY2LCAgMTA0MjYsIC0xOTI2NiwgLTI1MTcyLCAvLyB3MDcgdzA2IHcwMyB3MDIKKyAgICAgMTkyNjYsIC0xMDQyNiwgIDE5MjY2LCAtMjUxNzIsIC8vIHcxMyB3MTIgdzA5IHcwOAorICAgIC0xOTI2NiwgIDI1MTcyLCAgMTkyNjYsIC0xMDQyNiwgLy8gdzE1IHcxNCB3MTEgdzEwCisgICAgIDI2NzIyLCAgMjI2NTQsICAyMjY1NCwgIC01MzE1LCAvLyB3MjEgdzIwIHcxNyB3MTYKKyAgICAgMTUxMzcsICAgNTMxNSwgLTI2NzIyLCAtMTUxMzcsIC8vIHcyMyB3MjIgdzE5IHcxOAorICAgICAxNTEzNywgLTI2NzIyLCAgIDUzMTUsIC0xNTEzNywgLy8gdzI5IHcyOCB3MjUgdzI0CisgICAgICA1MzE1LCAgMjI2NTQsICAyMjY1NCwgLTI2NzIyLCAvLyB3MzEgdzMwIHcyNyB3MjYKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSGVscGVyIG1hY3JvcyBmb3IgdGhlIGNvZGUKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEQ1RfOF9JTlZfUk9XX01NWCggSU5QLCBPVVQsIFRBQkxFLCBST1VOREVSCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIERDVF84X0lOVl9ST1dfTU1YKEExLCBBMiwgQTMsIEE0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICAiI0ExIiwgJSVtbTAgICAgXG5cdCIgLyogMCA7IHgzIHgyIHgxIHgwICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICA4KyIjQTEiLCAlJW1tMSAgICBcblx0IiAvKiAxIDsgeDcgeDYgeDUgeDQgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAgJSVtbTAsICUlbW0yICAgIFxuXHQiIC8qIDIgOyB4MyB4MiB4MSB4MCAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICAiI0EzIiwgJSVtbTMgICAgXG5cdCIgLyogMyA7IHcwNiB3MDQgdzAyIHcwMCAqLyAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tsd2QgICUlbW0xLCAlJW1tMCAgICBcblx0IiAvKiB4NSB4MSB4NCB4MCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAgJSVtbTAsICUlbW01ICAgIFxuXHQiIC8qIDUgOyB4NSB4MSB4NCB4MCAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNrbGRxICAlJW1tMCwgJSVtbTAgICAgXG5cdCIgLyogeDQgeDAgeDQgeDAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICA4KyIjQTMiLCAlJW1tNCAgICBcblx0IiAvKiA0IDsgdzA3IHcwNSB3MDMgdzAxICovICAgICAgICAgICAgICAgICBcCisgICAgInB1bnBja2h3ZCAgJSVtbTEsICUlbW0yICAgIFxuXHQiIC8qIDEgOyB4NyB4MyB4NiB4MiAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG1hZGR3ZCAgICAlJW1tMCwgJSVtbTMgICAgXG5cdCIgLyogeDQqdzA2K3gwKncwNCB4NCp3MDIreDAqdzAwICovICAgICAgICAgXAorICAgICJtb3ZxICAgICAgICUlbW0yLCAlJW1tNiAgICBcblx0IiAvKiA2IDsgeDcgeDMgeDYgeDIgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgMzIrIiNBMyIsICUlbW0xICAgIFxuXHQiIC8qIDEgOyB3MjIgdzIwIHcxOCB3MTYgKi8gICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNrbGRxICAlJW1tMiwgJSVtbTIgICAgXG5cdCIgLyogeDYgeDIgeDYgeDIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwbWFkZHdkICAgICUlbW0yLCAlJW1tNCAgICBcblx0IiAvKiB4Nip3MDcreDIqdzA1IHg2KncwMyt4Mip3MDEgKi8gICAgICAgICBcCisgICAgInB1bnBja2hkcSAgJSVtbTUsICUlbW01ICAgIFxuXHQiIC8qIHg1IHgxIHg1IHgxICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG1hZGR3ZCAxNisiI0EzIiwgJSVtbTAgICAgXG5cdCIgLyogeDQqdzE0K3gwKncxMiB4NCp3MTAreDAqdzA4ICovICAgICAgICAgXAorICAgICJwdW5wY2toZHEgICUlbW02LCAlJW1tNiAgICBcblx0IiAvKiB4NyB4MyB4NyB4MyAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgNDArICAgIiNBMyIsICUlbW03ICAgIFxuXHQiIC8qIDcgOyB3MjMgdzIxIHcxOSB3MTcgKi8gICAgICAgICAgICAgICAgIFwKKyAgICAicG1hZGR3ZCAgICAlJW1tNSwgJSVtbTEgICAgXG5cdCIgLyogeDUqdzIyK3gxKncyMCB4NSp3MTgreDEqdzE2ICovICAgICAgICAgXAorICAgICJwYWRkZCAgICAgICIjQTQiLCAlJW1tMyAgICBcblx0IiAvKiArJTQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBtYWRkd2QgICAgJSVtbTYsICUlbW03ICAgIFxuXHQiIC8qIHg3KncyMyt4Myp3MjEgeDcqdzE5K3gzKncxNyAqLyAgICAgICAgIFwKKyAgICAicG1hZGR3ZCAyNCsiI0EzIiwgJSVtbTIgICAgXG5cdCIgLyogeDYqdzE1K3gyKncxMyB4Nip3MTEreDIqdzA5ICovICAgICAgICAgXAorICAgICJwYWRkZCAgICAgICUlbW00LCAlJW1tMyAgICBcblx0IiAvKiA0IDsgYTE9c3VtKGV2ZW4xKSBhMD1zdW0oZXZlbjApICovICAgICBcCisgICAgInBtYWRkd2QgNDgrIiNBMyIsICUlbW01ICAgIFxuXHQiIC8qIHg1KnczMCt4MSp3MjggeDUqdzI2K3gxKncyNCAqLyAgICAgICAgIFwKKyAgICAibW92cSAgICAgICAlJW1tMywgJSVtbTQgICAgXG5cdCIgLyogNCA7IGExIGEwICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwbWFkZHdkIDU2KyIjQTMiLCAlJW1tNiAgICBcblx0IiAvKiB4Nyp3MzEreDMqdzI5IHg3KncyNyt4Myp3MjUgKi8gICAgICAgICBcCisgICAgInBhZGRkICAgICAgJSVtbTcsICUlbW0xICAgIFxuXHQiIC8qIDcgOyBiMT1zdW0ob2RkMSkgYjA9c3VtKG9kZDApICovICAgICAgIFwKKyAgICAicGFkZGQgICAgICAiI0E0IiwgJSVtbTAgICAgXG5cdCIgLyogKyU0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3ViZCAgICAgICUlbW0xLCAlJW1tMyAgICBcblx0IiAvKiBhMS1iMSBhMC1iMCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzcmFkICAgICAgICAkMTEsICUlbW0zICAgIFxuXHQiIC8qIHk2PWExLWIxIHk3PWEwLWIwICovICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZGQgICAgICAlJW1tNCwgJSVtbTEgICAgXG5cdCIgLyogNCA7IGExK2IxIGEwK2IwICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkZCAgICAgICUlbW0yLCAlJW1tMCAgICBcblx0IiAvKiAyIDsgYTM9c3VtKGV2ZW4zKSBhMj1zdW0oZXZlbjIpICovICAgICBcCisgICAgInBzcmFkICAgICAgICAkMTEsICUlbW0xICAgIFxuXHQiIC8qIHkxPWExK2IxIHkwPWEwK2IwICovICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZGQgICAgICAlJW1tNiwgJSVtbTUgICAgXG5cdCIgLyogNiA7IGIzPXN1bShvZGQzKSBiMj1zdW0ob2RkMikgKi8gICAgICAgXAorICAgICJtb3ZxICAgICAgICUlbW0wLCAlJW1tNCAgICBcblx0IiAvKiA0IDsgYTMgYTIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhZGRkICAgICAgJSVtbTUsICUlbW0wICAgIFxuXHQiIC8qIGEzK2IzIGEyK2IyICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YmQgICAgICAlJW1tNSwgJSVtbTQgICAgXG5cdCIgLyogNSA7IGEzLWIzIGEyLWIyICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3JhZCAgICAgICAgJDExLCAlJW1tMCAgICBcblx0IiAvKiB5Mz1hMytiMyB5Mj1hMitiMiAqLyAgICAgICAgICAgICAgICAgICBcCisgICAgInBzcmFkICAgICAgICAkMTEsICUlbW00ICAgIFxuXHQiIC8qIHk0PWEzLWIzIHk1PWEyLWIyICovICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFja3NzZHcgICAlJW1tMCwgJSVtbTEgICAgXG5cdCIgLyogMCA7IHkzIHkyIHkxIHkwICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWNrc3NkdyAgICUlbW0zLCAlJW1tNCAgICBcblx0IiAvKiAzIDsgeTYgeTcgeTQgeTUgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAgJSVtbTQsICUlbW03ICAgIFxuXHQiIC8qIDcgOyB5NiB5NyB5NCB5NSAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNybGQgICAgICAgICQxNiwgJSVtbTQgICAgXG5cdCIgLyogMCB5NiAwIHk0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc2xsZCAgICAgICAgJDE2LCAlJW1tNyAgICBcblx0IiAvKiB5NyAwIHk1IDAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAgJSVtbTEsICIjQTIiICAgIFxuXHQiIC8qIDEgOyBzYXZlIHkzIHkyIHkxIHkwICovICAgICAgICAgICAgICAgIFwKKyAgICAicG9yICAgICAgICAlJW1tNCwgJSVtbTcgICAgXG5cdCIgLyogNCA7IHk3IHk2IHk1IHk0ICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgICUlbW03LCA4KyIjQTIiICBcblx0IiAvKiA3IDsgc2F2ZSB5NyB5NiB5NSB5NCAqLyAgICAgICAgICAgICAgICBcCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERDVF84X0lOVl9ST1dfWE1NKCBJTlAsIE9VVCwgVEFCTEUsIFJPVU5ERVIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRENUXzhfSU5WX1JPV19YTU0oQTEsIEEyLCBBMywgQTQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgICIjQTEiLCAlJW1tMCAgICAgICAgXG5cdCIgLyogMCA7IHgzIHgyIHgxIHgwICovICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgIDgrIiNBMSIsICUlbW0xICAgICAgICBcblx0IiAvKiAxIDsgeDcgeDYgeDUgeDQgKi8gICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTIgICAgICAgIFxuXHQiIC8qIDIgOyB4MyB4MiB4MSB4MCAqLyAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgICIjQTMiLCAlJW1tMyAgICAgICAgXG5cdCIgLyogMyA7IHcwNSB3MDQgdzAxIHcwMCAqLyAgICAgICAgICAgICBcCisgICAgInBzaHVmdyAgICAgJDB4ODgsICUlbW0wLCAlJW1tMCBcblx0IiAvKiB4MiB4MCB4MiB4MCAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgOCsiI0EzIiwgJSVtbTQgICAgICAgIFxuXHQiIC8qIDQgOyB3MDcgdzA2IHcwMyB3MDIgKi8gICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgICUlbW0xLCAlJW1tNSAgICAgICAgXG5cdCIgLyogNSA7IHg3IHg2IHg1IHg0ICovICAgICAgICAgICAgICAgICBcCisgICAgInBtYWRkd2QgICAgJSVtbTAsICUlbW0zICAgICAgICBcblx0IiAvKiB4Mip3MDUreDAqdzA0IHgyKncwMSt4MCp3MDAgKi8gICAgIFwKKyAgICAibW92cSAgICAzMisiI0EzIiwgJSVtbTYgICAgICAgIFxuXHQiIC8qIDYgOyB3MjEgdzIwIHcxNyB3MTYgKi8gICAgICAgICAgICAgXAorICAgICJwc2h1ZncgICAgICQweDg4LCAlJW1tMSwgJSVtbTEgXG5cdCIgLyogeDYgeDQgeDYgeDQgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgInBtYWRkd2QgICAgJSVtbTEsICUlbW00ICAgICAgICBcblx0IiAvKiB4Nip3MDcreDQqdzA2IHg2KncwMyt4NCp3MDIgKi8gICAgIFwKKyAgICAibW92cSAgICA0MCsiI0EzIiwgJSVtbTcgICAgICAgIFxuXHQiIC8qIDc7IHcyMyB3MjIgdzE5IHcxOCAqLyAgICAgICAgICAgICAgXAorICAgICJwc2h1ZncgICAgICQweGRkLCAlJW1tMiwgJSVtbTIgXG5cdCIgLyogeDMgeDEgeDMgeDEgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgInBtYWRkd2QgICAgJSVtbTIsICUlbW02ICAgICAgICBcblx0IiAvKiB4Myp3MjEreDEqdzIwIHgzKncxNyt4MSp3MTYgKi8gICAgIFwKKyAgICAicHNodWZ3ICAgICAkMHhkZCwgJSVtbTUsICUlbW01IFxuXHQiIC8qIHg3IHg1IHg3IHg1ICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwbWFkZHdkICAgICUlbW01LCAlJW1tNyAgICAgICAgXG5cdCIgLyogeDcqdzIzK3g1KncyMiB4Nyp3MTkreDUqdzE4ICovICAgICBcCisgICAgInBhZGRkICAgICAgIiNBNCIsICUlbW0zICAgICAgICBcblx0IiAvKiArJTQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG1hZGR3ZCAxNisiI0EzIiwgJSVtbTAgICAgICAgIFxuXHQiIC8qIHgyKncxMyt4MCp3MTIgeDIqdzA5K3gwKncwOCAqLyAgICAgXAorICAgICJwYWRkZCAgICAgICUlbW00LCAlJW1tMyAgICAgICAgXG5cdCIgLyogNCA7IGExPXN1bShldmVuMSkgYTA9c3VtKGV2ZW4wKSAqLyBcCisgICAgInBtYWRkd2QgMjQrIiNBMyIsICUlbW0xICAgICAgICBcblx0IiAvKiB4Nip3MTUreDQqdzE0IHg2KncxMSt4NCp3MTAgKi8gICAgIFwKKyAgICAibW92cSAgICAgICAlJW1tMywgJSVtbTQgICAgICAgIFxuXHQiIC8qIDQgOyBhMSBhMCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwbWFkZHdkIDQ4KyIjQTMiLCAlJW1tMiAgICAgICAgXG5cdCIgLyogeDMqdzI5K3gxKncyOCB4Myp3MjUreDEqdzI0ICovICAgICBcCisgICAgInBhZGRkICAgICAgJSVtbTcsICUlbW02ICAgICAgICBcblx0IiAvKiA3IDsgYjE9c3VtKG9kZDEpIGIwPXN1bShvZGQwKSAqLyAgIFwKKyAgICAicG1hZGR3ZCA1NisiI0EzIiwgJSVtbTUgICAgICAgIFxuXHQiIC8qIHg3KnczMSt4NSp3MzAgeDcqdzI3K3g1KncyNiAqLyAgICAgXAorICAgICJwYWRkZCAgICAgICUlbW02LCAlJW1tMyAgICAgICAgXG5cdCIgLyogYTErYjEgYTArYjAgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhZGRkICAgICAgIiNBNCIsICUlbW0wICAgICAgICBcblx0IiAvKiArJTQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNyYWQgICAgICAgICQxMSwgJSVtbTMgICAgICAgIFxuXHQiIC8qIHkxPWExK2IxIHkwPWEwK2IwICovICAgICAgICAgICAgICAgXAorICAgICJwYWRkZCAgICAgICUlbW0xLCAlJW1tMCAgICAgICAgXG5cdCIgLyogMSA7IGEzPXN1bShldmVuMykgYTI9c3VtKGV2ZW4yKSAqLyBcCisgICAgInBzdWJkICAgICAgJSVtbTYsICUlbW00ICAgICAgICBcblx0IiAvKiA2IDsgYTEtYjEgYTAtYjAgKi8gICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTcgICAgICAgIFxuXHQiIC8qIDcgOyBhMyBhMiAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkZCAgICAgICUlbW01LCAlJW1tMiAgICAgICAgXG5cdCIgLyogNSA7IGIzPXN1bShvZGQzKSBiMj1zdW0ob2RkMikgKi8gICBcCisgICAgInBhZGRkICAgICAgJSVtbTIsICUlbW0wICAgICAgICBcblx0IiAvKiBhMytiMyBhMitiMiAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNyYWQgICAgICAgICQxMSwgJSVtbTQgICAgICAgIFxuXHQiIC8qIHk2PWExLWIxIHk3PWEwLWIwICovICAgICAgICAgICAgICAgXAorICAgICJwc3ViZCAgICAgICUlbW0yLCAlJW1tNyAgICAgICAgXG5cdCIgLyogMiA7IGEzLWIzIGEyLWIyICovICAgICAgICAgICAgICAgICBcCisgICAgInBzcmFkICAgICAgICAkMTEsICUlbW0wICAgICAgICBcblx0IiAvKiB5Mz1hMytiMyB5Mj1hMitiMiAqLyAgICAgICAgICAgICAgIFwKKyAgICAicHNyYWQgICAgICAgICQxMSwgJSVtbTcgICAgICAgIFxuXHQiIC8qIHk0PWEzLWIzIHk1PWEyLWIyICovICAgICAgICAgICAgICAgXAorICAgICJwYWNrc3NkdyAgICUlbW0wLCAlJW1tMyAgICAgICAgXG5cdCIgLyogMCA7IHkzIHkyIHkxIHkwICovICAgICAgICAgICAgICAgICBcCisgICAgInBhY2tzc2R3ICAgJSVtbTQsICUlbW03ICAgICAgICBcblx0IiAvKiA0IDsgeTYgeTcgeTQgeTUgKi8gICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICAlJW1tMywgIiNBMiIgICAgICAgIFxuXHQiIC8qIDMgOyBzYXZlIHkzIHkyIHkxIHkwICovICAgICAgICAgICAgXAorICAgICJwc2h1ZncgICAgICQweGIxLCAlJW1tNywgJSVtbTcgXG5cdCIgLyogeTcgeTYgeTUgeTQgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAgJSVtbTcsIDgrIiNBMiIgICAgICBcblx0IiAvKiA3IDsgc2F2ZSB5NyB5NiB5NSB5NCAqLyAgICAgICAgICAgIFwKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoZSBmaXJzdCBzdGFnZSBEQ1QgOHg4IC0gZm9yd2FyZCBEQ1RzIG9mIGNvbHVtbnMKKy8vCisvLyBUaGUgJTJwdXRzIGFyZSBtdWx0aXBsaWVkCisvLyBmb3Igcm93cyAwLDQgLSBvbiBjb3NfNF8xNiwKKy8vIGZvciByb3dzIDEsNyAtIG9uIGNvc18xXzE2LAorLy8gZm9yIHJvd3MgMiw2IC0gb24gY29zXzJfMTYsCisvLyBmb3Igcm93cyAzLDUgLSBvbiBjb3NfM18xNgorLy8gYW5kIGFyZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGZvciByaXNlIG9mIGFjY3VyYWN5CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGUgOC1wb2ludCBzY2FsZWQgZm9yd2FyZCBEQ1QgYWxnb3JpdGhtICgyNmE4bSkKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vI2RlZmluZSBEQ1RfOF9GUldfQ09MKHgsIHkpCisvLyB7CisvLyAgICAgc2hvcnQgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3OworLy8gICAgIHNob3J0IHRwMDMsIHRtMDMsIHRwMTIsIHRtMTIsIHRwNjUsIHRtNjU7CisvLyAgICAgc2hvcnQgdHA0NjUsIHRtNDY1LCB0cDc2NSwgdG03NjU7CisvLworLy8gICAgIHQwID0gTEVGVF9TSElGVCh4WzBdICsgeFs3XSk7CisvLyAgICAgdDEgPSBMRUZUX1NISUZUKHhbMV0gKyB4WzZdKTsKKy8vICAgICB0MiA9IExFRlRfU0hJRlQoeFsyXSArIHhbNV0pOworLy8gICAgIHQzID0gTEVGVF9TSElGVCh4WzNdICsgeFs0XSk7CisvLyAgICAgdDQgPSBMRUZUX1NISUZUKHhbM10gLSB4WzRdKTsKKy8vICAgICB0NSA9IExFRlRfU0hJRlQoeFsyXSAtIHhbNV0pOworLy8gICAgIHQ2ID0gTEVGVF9TSElGVCh4WzFdIC0geFs2XSk7CisvLyAgICAgdDcgPSBMRUZUX1NISUZUKHhbMF0gLSB4WzddKTsKKy8vCisvLyAgICAgdHAwMyA9IHQwICsgdDM7CisvLyAgICAgdG0wMyA9IHQwIC0gdDM7CisvLyAgICAgdHAxMiA9IHQxICsgdDI7CisvLyAgICAgdG0xMiA9IHQxIC0gdDI7CisvLworLy8gICAgIHlbMF0gPSB0cDAzICsgdHAxMjsKKy8vICAgICB5WzRdID0gdHAwMyAtIHRwMTI7CisvLworLy8gICAgIHlbMl0gPSB0bTAzICsgdG0xMiAqIHRnXzJfMTY7CisvLyAgICAgeVs2XSA9IHRtMDMgKiB0Z18yXzE2IC0gdG0xMjsKKy8vCisvLyAgICAgdHA2NSA9ICh0NiArIHQ1KSAqIGNvc180XzE2OworLy8gICAgIHRtNjUgPSAodDYgLSB0NSkgKiBjb3NfNF8xNjsKKy8vCisvLyAgICAgdHA3NjUgPSB0NyArIHRwNjU7CisvLyAgICAgdG03NjUgPSB0NyAtIHRwNjU7CisvLyAgICAgdHA0NjUgPSB0NCArIHRtNjU7CisvLyAgICAgdG00NjUgPSB0NCAtIHRtNjU7CisvLworLy8gICAgIHlbMV0gPSB0cDc2NSArIHRwNDY1ICogdGdfMV8xNjsKKy8vICAgICB5WzddID0gdHA3NjUgKiB0Z18xXzE2IC0gdHA0NjU7CisvLyAgICAgeVs1XSA9IHRtNzY1ICogdGdfM18xNiArIHRtNDY1OworLy8gICAgIHlbM10gPSB0bTc2NSAtIHRtNDY1ICogdGdfM18xNjsKKy8vIH0KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRENUXzhfSU5WX0NPTF80ICBJTlAsT1VUCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIERDVF84X0lOVl9DT0woQTEsIEEyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAyKjgoJTMpLCAlJW1tMCAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxIDE2KjMrIiNBMSIsICUlbW0zICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tMCwgJSVtbTEgICAgICAgICBcblx0IiAvKiB0Z18zXzE2ICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAxNio1KyIjQTEiLCAlJW1tNSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwbXVsaHcgICAgJSVtbTMsICUlbW0wICAgICAgICAgXG5cdCIgLyogeDMqKHRnXzNfMTYtMSkgKi8gICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAgKCUzKSwgJSVtbTQgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG11bGh3ICAgICUlbW01LCAlJW1tMSAgICAgICAgIFxuXHQiIC8qIHg1Kih0Z18zXzE2LTEpICovICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxIDE2KjcrIiNBMSIsICUlbW03ICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tNCwgJSVtbTIgICAgICAgICBcblx0IiAvKiB0Z18xXzE2ICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAxNioxKyIjQTEiLCAlJW1tNiAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwbXVsaHcgICAgJSVtbTcsICUlbW00ICAgICAgICAgXG5cdCIgLyogeDcqdGdfMV8xNiAqLyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhZGRzdyAgICAlJW1tMywgJSVtbTAgICAgICAgICBcblx0IiAvKiB4Myp0Z18zXzE2ICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG11bGh3ICAgICUlbW02LCAlJW1tMiAgICAgICAgIFxuXHQiIC8qIHgxKnRnXzFfMTYgKi8gICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkc3cgICAgJSVtbTMsICUlbW0xICAgICAgICAgXG5cdCIgLyogeDMreDUqKHRnXzNfMTYtMSkgKi8gICAgICAgICAgICAgICBcCisgICAgInBzdWJzdyAgICAlJW1tNSwgJSVtbTAgICAgICAgICBcblx0IiAvKiB4Myp0Z18zXzE2LXg1ID0gdG0zNSAqLyAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAzKjgoJTMpLCAlJW1tMyAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkc3cgICAgJSVtbTUsICUlbW0xICAgICAgICAgXG5cdCIgLyogeDMreDUqdGdfM18xNiA9IHRwMzUgKi8gICAgICAgICAgICBcCisgICAgInBhZGRzdyAgICAlJW1tNiwgJSVtbTQgICAgICAgICBcblx0IiAvKiB4MSt0Z18xXzE2Kng3ID0gdHAxNyAqLyAgICAgICAgICAgIFwKKyAgICAicHN1YnN3ICAgICUlbW03LCAlJW1tMiAgICAgICAgIFxuXHQiIC8qIHgxKnRnXzFfMTYteDcgPSB0bTE3ICovICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgJSVtbTQsICUlbW01ICAgICAgICAgXG5cdCIgLyogdHAxNyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tMiwgJSVtbTYgICAgICAgICBcblx0IiAvKiB0bTE3ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICAgICUlbW0xLCAlJW1tNSAgICAgICAgIFxuXHQiIC8qIHRwMTcrdHAzNSA9IGIwICovICAgICAgICAgICAgICAgICAgXAorICAgICJwc3Vic3cgICAgJSVtbTAsICUlbW02ICAgICAgICAgXG5cdCIgLyogdG0xNy10bTM1ID0gYjMgKi8gICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJzdyAgICAlJW1tMSwgJSVtbTQgICAgICAgICBcblx0IiAvKiB0cDE3LXRwMzUgPSB0MSAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICAgICUlbW0wLCAlJW1tMiAgICAgICAgIFxuXHQiIC8qIHRtMTcrdG0zNSA9IHQyICovICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgIDEqOCglMyksICUlbW03ICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tNCwgJSVtbTEgICAgICAgICBcblx0IiAvKiB0MSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICUlbW01LCAzKjE2KyIjQTIiICAgIFxuXHQiIC8qIHNhdmUgYjAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkc3cgICAgJSVtbTIsICUlbW0xICAgICAgICAgXG5cdCIgLyogdDErdDIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tNiwgNSoxNisiI0EyIiAgICBcblx0IiAvKiBzYXZlIGIzICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YnN3ICAgICUlbW0yLCAlJW1tNCAgICAgICAgIFxuXHQiIC8qIHQxLXQyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxIDIqMTYrIiNBMSIsICUlbW01ICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tNywgJSVtbTAgICAgICAgICBcblx0IiAvKiB0Z18yXzE2ICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSA2KjE2KyIjQTEiLCAlJW1tNiAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwbXVsaHcgICAgJSVtbTUsICUlbW0wICAgICAgICAgXG5cdCIgLyogeDIqdGdfMl8xNiAqLyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBtdWxodyAgICAlJW1tNiwgJSVtbTcgICAgICAgICBcblx0IiAvKiB4Nip0Z18yXzE2ICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG11bGh3ICAgICUlbW0zLCAlJW1tMSAgICAgICAgIFxuXHQiIC8qIG9jb3NfNF8xNioodDErdDIpID0gYjEvMiAqLyAgICAgICAgXAorICAgICJtb3ZxIDAqMTYrIiNBMSIsICUlbW0yICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBtdWxodyAgICAlJW1tMywgJSVtbTQgICAgICAgICBcblx0IiAvKiBvY29zXzRfMTYqKHQxLXQyKSA9IGIyLzIgKi8gICAgICAgIFwKKyAgICAicHN1YnN3ICAgICUlbW02LCAlJW1tMCAgICAgICAgIFxuXHQiIC8qIHQyKnRnXzJfMTYteDYgPSB0bTI2ICovICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgJSVtbTIsICUlbW0zICAgICAgICAgXG5cdCIgLyogeDAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgNCoxNisiI0ExIiwgJSVtbTYgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICAgICUlbW01LCAlJW1tNyAgICAgICAgIFxuXHQiIC8qIHgyK3g2KnRnXzJfMTYgPSB0cDI2ICovICAgICAgICAgICAgXAorICAgICJwYWRkc3cgICAgJSVtbTYsICUlbW0yICAgICAgICAgXG5cdCIgLyogeDAreDQgPSB0cDA0ICovICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJzdyAgICAlJW1tNiwgJSVtbTMgICAgICAgICBcblx0IiAvKiB4MC14NCA9IHRtMDQgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICUlbW0yLCAlJW1tNSAgICAgICAgIFxuXHQiIC8qIHRwMDQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgJSVtbTMsICUlbW02ICAgICAgICAgXG5cdCIgLyogdG0wNCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJzdyAgICAlJW1tNywgJSVtbTIgICAgICAgICBcblx0IiAvKiB0cDA0LXRwMjYgPSBhMyAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICAgICUlbW0wLCAlJW1tMyAgICAgICAgIFxuXHQiIC8qIHRtMDQrdG0yNiA9IGExICovICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkc3cgICAgJSVtbTEsICUlbW0xICAgICAgICAgXG5cdCIgLyogYjEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhZGRzdyAgICAlJW1tNCwgJSVtbTQgICAgICAgICBcblx0IiAvKiBiMiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICAgICUlbW03LCAlJW1tNSAgICAgICAgIFxuXHQiIC8qIHRwMDQrdHAyNiA9IGEwICovICAgICAgICAgICAgICAgICAgXAorICAgICJwc3Vic3cgICAgJSVtbTAsICUlbW02ICAgICAgICAgXG5cdCIgLyogdG0wNC10bTI2ID0gYTIgKi8gICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tMywgJSVtbTcgICAgICAgICBcblx0IiAvKiBhMSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICUlbW02LCAlJW1tMCAgICAgICAgIFxuXHQiIC8qIGEyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkc3cgICAgJSVtbTEsICUlbW0zICAgICAgICAgXG5cdCIgLyogYTErYjEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhZGRzdyAgICAlJW1tNCwgJSVtbTYgICAgICAgICBcblx0IiAvKiBhMitiMiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNyYXcgICAgICAgICQ2LCAlJW1tMyAgICAgICAgIFxuXHQiIC8qIGRzdDEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3Vic3cgICAgJSVtbTEsICUlbW03ICAgICAgICAgXG5cdCIgLyogYTEtYjEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzcmF3ICAgICAgICAkNiwgJSVtbTYgICAgICAgICBcblx0IiAvKiBkc3QyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YnN3ICAgICUlbW00LCAlJW1tMCAgICAgICAgIFxuXHQiIC8qIGEyLWIyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxIDMqMTYrIiNBMiIsICUlbW0xICAgICAgICAgXG5cdCIgLyogbG9hZCBiMCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzcmF3ICAgICAgICAkNiwgJSVtbTcgICAgICAgICBcblx0IiAvKiBkc3Q2ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICUlbW01LCAlJW1tNCAgICAgICAgIFxuXHQiIC8qIGEwICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3JhdyAgICAgICAgJDYsICUlbW0wICAgICAgICAgXG5cdCIgLyogZHN0NSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tMywgMSoxNisiI0EyIiAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICAgICUlbW0xLCAlJW1tNSAgICAgICAgIFxuXHQiIC8qIGEwK2IwICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgJSVtbTYsIDIqMTYrIiNBMiIgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJzdyAgICAlJW1tMSwgJSVtbTQgICAgICAgICBcblx0IiAvKiBhMC1iMCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSA1KjE2KyIjQTIiLCAlJW1tMyAgICAgICAgIFxuXHQiIC8qIGxvYWQgYjMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3JhdyAgICAgICAgJDYsICUlbW01ICAgICAgICAgXG5cdCIgLyogZHN0MCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tMiwgJSVtbTYgICAgICAgICBcblx0IiAvKiBhMyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNyYXcgICAgICAgICQ2LCAlJW1tNCAgICAgICAgIFxuXHQiIC8qIGRzdDcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgJSVtbTAsIDUqMTYrIiNBMiIgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhZGRzdyAgICAlJW1tMywgJSVtbTIgICAgICAgICBcblx0IiAvKiBhMytiMyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICUlbW03LCA2KjE2KyIjQTIiICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3Vic3cgICAgJSVtbTMsICUlbW02ICAgICAgICAgXG5cdCIgLyogYTMtYjMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tNSwgMCoxNisiI0EyIiAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNyYXcgICAgICAgICQ2LCAlJW1tMiAgICAgICAgIFxuXHQiIC8qIGRzdDMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgJSVtbTQsIDcqMTYrIiNBMiIgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzcmF3ICAgICAgICAkNiwgJSVtbTYgICAgICAgICBcblx0IiAvKiBkc3Q0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICUlbW0yLCAzKjE2KyIjQTIiICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgJSVtbTYsIDQqMTYrIiNBMiIgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb2RlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdm9pZCBpZGN0X21teCh1aW50MTZfdCBibG9ja1s2NF0pOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBmZl94dmlkX2lkY3RfbW14KHNob3J0ICpibG9jaykKK3sKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgLy8gIyBQcm9jZXNzIGVhY2ggcm93CisgICAgICAgIERDVF84X0lOVl9ST1dfTU1YKDAgKiAxNiglMCksIDAgKiAxNiglMCksIDY0ICogMCglMiksIDggKiAwKCUxKSkKKyAgICAgICAgRENUXzhfSU5WX1JPV19NTVgoMSAqIDE2KCUwKSwgMSAqIDE2KCUwKSwgNjQgKiAxKCUyKSwgOCAqIDEoJTEpKQorICAgICAgICBEQ1RfOF9JTlZfUk9XX01NWCgyICogMTYoJTApLCAyICogMTYoJTApLCA2NCAqIDIoJTIpLCA4ICogMiglMSkpCisgICAgICAgIERDVF84X0lOVl9ST1dfTU1YKDMgKiAxNiglMCksIDMgKiAxNiglMCksIDY0ICogMyglMiksIDggKiAzKCUxKSkKKyAgICAgICAgRENUXzhfSU5WX1JPV19NTVgoNCAqIDE2KCUwKSwgNCAqIDE2KCUwKSwgNjQgKiAwKCUyKSwgOCAqIDQoJTEpKQorICAgICAgICBEQ1RfOF9JTlZfUk9XX01NWCg1ICogMTYoJTApLCA1ICogMTYoJTApLCA2NCAqIDMoJTIpLCA4ICogNSglMSkpCisgICAgICAgIERDVF84X0lOVl9ST1dfTU1YKDYgKiAxNiglMCksIDYgKiAxNiglMCksIDY0ICogMiglMiksIDggKiA2KCUxKSkKKyAgICAgICAgRENUXzhfSU5WX1JPV19NTVgoNyAqIDE2KCUwKSwgNyAqIDE2KCUwKSwgNjQgKiAxKCUyKSwgOCAqIDcoJTEpKQorCisgICAgICAgIC8vICMgUHJvY2VzcyB0aGUgY29sdW1ucyAoNCBhdCBhIHRpbWUpCisgICAgICAgIERDVF84X0lOVl9DT0woMCglMCksIDAoJTApKQorICAgICAgICBEQ1RfOF9JTlZfQ09MKDgoJTApLCA4KCUwKSkKKyAgICAgICAgOjogInIiIChibG9jayksICJyIiAocm91bmRlcl8wKSwgInIiICh0YWJfaV8wNF9tbXgpLCAiciIgKHRnXzFfMTYpKTsKK30KKwordm9pZCBmZl94dmlkX2lkY3RfbW14X3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBmZl94dmlkX2lkY3RfbW14KGJsb2NrKTsKKyAgICBmZl9wdXRfcGl4ZWxzX2NsYW1wZWQoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7Cit9CisKK3ZvaWQgZmZfeHZpZF9pZGN0X21teF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgZmZfeHZpZF9pZGN0X21teChibG9jayk7CisgICAgZmZfYWRkX3BpeGVsc19jbGFtcGVkKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworfQorCisjZW5kaWYgLyogSEFWRV9NTVhfSU5MSU5FICovCisKKyNpZiBIQVZFX01NWEVYVF9JTkxJTkUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHZvaWQgaWRjdF94bW0odWludDE2X3QgYmxvY2tbNjRdKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZmZfeHZpZF9pZGN0X21teGV4dChzaG9ydCAqYmxvY2spCit7CisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgIC8vICMgUHJvY2VzcyBlYWNoIHJvdworICAgICAgICBEQ1RfOF9JTlZfUk9XX1hNTSgwICogMTYoJTApLCAwICogMTYoJTApLCA2NCAqIDAoJTIpLCA4ICogMCglMSkpCisgICAgICAgIERDVF84X0lOVl9ST1dfWE1NKDEgKiAxNiglMCksIDEgKiAxNiglMCksIDY0ICogMSglMiksIDggKiAxKCUxKSkKKyAgICAgICAgRENUXzhfSU5WX1JPV19YTU0oMiAqIDE2KCUwKSwgMiAqIDE2KCUwKSwgNjQgKiAyKCUyKSwgOCAqIDIoJTEpKQorICAgICAgICBEQ1RfOF9JTlZfUk9XX1hNTSgzICogMTYoJTApLCAzICogMTYoJTApLCA2NCAqIDMoJTIpLCA4ICogMyglMSkpCisgICAgICAgIERDVF84X0lOVl9ST1dfWE1NKDQgKiAxNiglMCksIDQgKiAxNiglMCksIDY0ICogMCglMiksIDggKiA0KCUxKSkKKyAgICAgICAgRENUXzhfSU5WX1JPV19YTU0oNSAqIDE2KCUwKSwgNSAqIDE2KCUwKSwgNjQgKiAzKCUyKSwgOCAqIDUoJTEpKQorICAgICAgICBEQ1RfOF9JTlZfUk9XX1hNTSg2ICogMTYoJTApLCA2ICogMTYoJTApLCA2NCAqIDIoJTIpLCA4ICogNiglMSkpCisgICAgICAgIERDVF84X0lOVl9ST1dfWE1NKDcgKiAxNiglMCksIDcgKiAxNiglMCksIDY0ICogMSglMiksIDggKiA3KCUxKSkKKworICAgICAgICAvLyAjIFByb2Nlc3MgdGhlIGNvbHVtbnMgKDQgYXQgYSB0aW1lKQorICAgICAgICBEQ1RfOF9JTlZfQ09MKDAoJTApLCAwKCUwKSkKKyAgICAgICAgRENUXzhfSU5WX0NPTCg4KCUwKSwgOCglMCkpCisgICAgICAgIDo6ICJyIiAoYmxvY2spLCAiciIgKHJvdW5kZXJfMCksICJyIiAodGFiX2lfMDRfeG1tKSwgInIiICh0Z18xXzE2KSk7Cit9CisKK3ZvaWQgZmZfeHZpZF9pZGN0X21teGV4dF9wdXQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgZmZfeHZpZF9pZGN0X21teGV4dChibG9jayk7CisgICAgZmZfcHV0X3BpeGVsc19jbGFtcGVkKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworfQorCit2b2lkIGZmX3h2aWRfaWRjdF9tbXhleHRfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGZmX3h2aWRfaWRjdF9tbXhleHQoYmxvY2spOworICAgIGZmX2FkZF9waXhlbHNfY2xhbXBlZChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKK30KKworI2VuZGlmIC8qIEhBVkVfTU1YRVhUX0lOTElORSAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveDg2L3h2aWRpZGN0X3NzZTIuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni94dmlkaWRjdF9zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhNWQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3g4Ni94dmlkaWRjdF9zc2UyLmMKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgKiBYVklEIE1QRUctNCBWSURFTyBDT0RFQworICogLSBTU0UyIGludmVyc2UgZGlzY3JldGUgY29zaW5lIHRyYW5zZm9ybSAtCisgKgorICogQ29weXJpZ2h0KEMpIDIwMDMgUGFzY2FsIE1hc3NpbWlubyA8c2thbEBwbGFuZXQtZC5uZXQ+CisgKgorICogQ29udmVyc2lvbiB0byBnY2Mgc3ludGF4IHdpdGggbW9kaWZpY2F0aW9ucworICogYnkgQWxleGFuZGVyIFN0cmFuZ2UgPGFzdHJhbmdlQGl0aGlua3N3LmNvbT4KKyAqCisgKiBPcmlnaW5hbGx5IGZyb20gZGN0L3g4Nl9hc20vZmRjdF9zc2UyX3NrYWwuYXNtIGluIFh2aWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIFZlcnRpY2FsIHBhc3MgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHNjaGVtZToKKyAqICBMb2VmZmxlciBDLiwgTGlndGVuYmVyZyBBLiwgYW5kIE1vc2NoeXR6IEMuUy46CisgKiAgUHJhY3RpY2FsIEZhc3QgMUQgRENUIEFsZ29yaXRobSB3aXRoIEVsZXZlbiBNdWx0aXBsaWNhdGlvbnMsCisgKiAgUHJvYy4gSUNBU1NQIDE5ODksIDk4OC05OTEuCisgKgorICogSG9yaXpvbnRhbCBwYXNzIGlzIGEgZG91YmxlIDR4NCB2ZWN0b3IvbWF0cml4IG11bHRpcGxpY2F0aW9uLAorICogKHNlZSBhbHNvIEludGVsJ3MgQXBwbGljYXRpb24gTm90ZSA5MjI6CisgKiAgaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vdnR1bmUvY2J0cy9zdHJtc2ltZC85MjJkb3duLmh0bQorICogIENvcHlyaWdodCAoQykgMTk5OSBJbnRlbCBDb3Jwb3JhdGlvbikKKyAqCisgKiBNb3JlIGRldGFpbHMgYXQgaHR0cDovL3NrYWwucGxhbmV0LWQubmV0L2NvZGluZy9kY3QuaHRtbAorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvaWRjdGRzcC5oIgorCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgInh2aWRpZGN0LmgiCisKKyNpZiBIQVZFX1NTRTJfSU5MSU5FCisKKy8qKgorICogQGZpbGUKKyAqIEBicmllZiBTU0UyIElEQ1QgY29tcGF0aWJsZSB3aXRoIHRoZSBYdmlkIElEQ1QKKyAqLworCisjZGVmaW5lIFg4KHgpIHgsIHgsIHgsIHgsIHgsIHgsIHgsIHgKKworREVDTEFSRV9BU01fQ09OU1QoMTYsIGludDE2X3QsIHRhbjEpW10gID0geyBYOCgxMzAzNikgfTsgLy8gdGFuKCBwaS8xNikKK0RFQ0xBUkVfQVNNX0NPTlNUKDE2LCBpbnQxNl90LCB0YW4yKVtdICA9IHsgWDgoMjcxNDYpIH07IC8vIHRhbigycGkvMTYpID0gc3FydCgyKS0xCitERUNMQVJFX0FTTV9DT05TVCgxNiwgaW50MTZfdCwgdGFuMylbXSAgPSB7IFg4KDQzNzkwKSB9OyAvLyB0YW4oM3BpLzE2KS0xCitERUNMQVJFX0FTTV9DT05TVCgxNiwgaW50MTZfdCwgc3FydDIpW10gPSB7IFg4KDIzMTcwKSB9OyAvLyAwLjUvc3FydCgyKQorREVDTEFSRV9BU01fQ09OU1QoOCwgIHVpbnQ4X3QsIG0xMjcpW10gID0geyBYOCgxMjcpIH07CisKK0RFQ0xBUkVfQVNNX0NPTlNUKDE2LCBpbnQxNl90LCBpVGFiMSlbXSA9IHsKKyAgICAweDQwMDAsIDB4NTM5ZiwgMHhjMDAwLCAweGFjNjEsIDB4NDAwMCwgMHhkZDVkLCAweDQwMDAsIDB4ZGQ1ZCwKKyAgICAweDQwMDAsIDB4MjJhMywgMHg0MDAwLCAweDIyYTMsIDB4YzAwMCwgMHg1MzlmLCAweDQwMDAsIDB4YWM2MSwKKyAgICAweDMyNDksIDB4MTFhOCwgMHg0YjQyLCAweGVlNTgsIDB4MTFhOCwgMHg0YjQyLCAweDExYTgsIDB4Y2RiNywKKyAgICAweDU4YzUsIDB4NGI0MiwgMHhhNzNiLCAweGNkYjcsIDB4MzI0OSwgMHhhNzNiLCAweDRiNDIsIDB4YTczYgorfTsKKworREVDTEFSRV9BU01fQ09OU1QoMTYsIGludDE2X3QsIGlUYWIyKVtdID0geworICAgIDB4NThjNSwgMHg3M2ZjLCAweGE3M2IsIDB4OGMwNCwgMHg1OGM1LCAweGNmZjUsIDB4NThjNSwgMHhjZmY1LAorICAgIDB4NThjNSwgMHgzMDBiLCAweDU4YzUsIDB4MzAwYiwgMHhhNzNiLCAweDczZmMsIDB4NThjNSwgMHg4YzA0LAorICAgIDB4NDViZiwgMHgxODdlLCAweDY4NjIsIDB4ZTc4MiwgMHgxODdlLCAweDY4NjIsIDB4MTg3ZSwgMHhiYTQxLAorICAgIDB4N2IyMSwgMHg2ODYyLCAweDg0ZGYsIDB4YmE0MSwgMHg0NWJmLCAweDg0ZGYsIDB4Njg2MiwgMHg4NGRmCit9OworCitERUNMQVJFX0FTTV9DT05TVCgxNiwgaW50MTZfdCwgaVRhYjMpW10gPSB7CisgICAgMHg1MzlmLCAweDZkNDEsIDB4YWM2MSwgMHg5MmJmLCAweDUzOWYsIDB4ZDJiZiwgMHg1MzlmLCAweGQyYmYsCisgICAgMHg1MzlmLCAweDJkNDEsIDB4NTM5ZiwgMHgyZDQxLCAweGFjNjEsIDB4NmQ0MSwgMHg1MzlmLCAweDkyYmYsCisgICAgMHg0MWIzLCAweDE3MTIsIDB4NjI1NCwgMHhlOGVlLCAweDE3MTIsIDB4NjI1NCwgMHgxNzEyLCAweGJlNGQsCisgICAgMHg3M2ZjLCAweDYyNTQsIDB4OGMwNCwgMHhiZTRkLCAweDQxYjMsIDB4OGMwNCwgMHg2MjU0LCAweDhjMDQKK307CisKK0RFQ0xBUkVfQVNNX0NPTlNUKDE2LCBpbnQxNl90LCBpVGFiNClbXSA9IHsKKyAgICAweDRiNDIsIDB4NjI1NCwgMHhiNGJlLCAweDlkYWMsIDB4NGI0MiwgMHhkNzQ2LCAweDRiNDIsIDB4ZDc0NiwKKyAgICAweDRiNDIsIDB4MjhiYSwgMHg0YjQyLCAweDI4YmEsIDB4YjRiZSwgMHg2MjU0LCAweDRiNDIsIDB4OWRhYywKKyAgICAweDNiMjEsIDB4MTRjMywgMHg1ODdlLCAweGViM2QsIDB4MTRjMywgMHg1ODdlLCAweDE0YzMsIDB4YzRkZiwKKyAgICAweDY4NjIsIDB4NTg3ZSwgMHg5NzllLCAweGM0ZGYsIDB4M2IyMSwgMHg5NzllLCAweDU4N2UsIDB4OTc5ZQorfTsKKworREVDTEFSRV9BU01fQ09OU1QoMTYsIGludDMyX3QsIHdhbGtlbklkY3RSb3VuZGVycylbXSA9IHsKKyAgICA2NTUzNiwgNjU1MzYsIDY1NTM2LCA2NTUzNiwKKyAgICAgMzU5NywgIDM1OTcsICAzNTk3LCAgMzU5NywKKyAgICAgMjI2MCwgIDIyNjAsICAyMjYwLCAgMjI2MCwKKyAgICAgMTIwMywgIDEyMDMsICAxMjAzLCAgMTIwMywKKyAgICAgIDEyMCwgICAxMjAsICAgMTIwLCAgIDEyMCwKKyAgICAgIDUxMiwgICA1MTIsICAgNTEyLCAgIDUxMgorfTsKKworLy8gVGVtcG9yYXJ5IHN0b3JhZ2UgYmVmb3JlIHRoZSBjb2x1bW4gcGFzcworI2RlZmluZSBST1cxICIlJXhtbTYiCisjZGVmaW5lIFJPVzMgIiUleG1tNCIKKyNkZWZpbmUgUk9XNSAiJSV4bW01IgorI2RlZmluZSBST1c3ICIlJXhtbTciCisKKyNkZWZpbmUgQ0xFQVJfT0REKHIpICJweG9yICAiciIsInIiIFxuXHQiCisjZGVmaW5lIFBVVF9PREQoZHN0KSAicHNodWZodyAgJDB4MUIsICUleG1tMiwgImRzdCIgICBcblx0IgorCisjaWYgQVJDSF9YODZfNjQKKworIyBkZWZpbmUgUk9XMCAiJSV4bW04IgorIyBkZWZpbmUgUkVHMCBST1cwCisjIGRlZmluZSBST1cyICIlJXhtbTkiCisjIGRlZmluZSBSRUcyIFJPVzIKKyMgZGVmaW5lIFJPVzQgIiUleG1tMTAiCisjIGRlZmluZSBSRUc0IFJPVzQKKyMgZGVmaW5lIFJPVzYgIiUleG1tMTEiCisjIGRlZmluZSBSRUc2IFJPVzYKKyMgZGVmaW5lIENMRUFSX0VWRU4ocikgQ0xFQVJfT0REKHIpCisjIGRlZmluZSBQVVRfRVZFTihkc3QpIFBVVF9PREQoZHN0KQorIyBkZWZpbmUgWE1NUyAiJSV4bW0xMiIKKyMgZGVmaW5lIE1PVl8zMl9PTkxZICIjIgorIyBkZWZpbmUgU1JFRzIgUkVHMgorIyBkZWZpbmUgVEFOMyAiJSV4bW0xMyIKKyMgZGVmaW5lIFRBTjEgIiUleG1tMTQiCisKKyNlbHNlCisKKyMgZGVmaW5lIFJPVzAgIiglMCkiCisjIGRlZmluZSBSRUcwICIlJXhtbTQiCisjIGRlZmluZSBST1cyICIyKjE2KCUwKSIKKyMgZGVmaW5lIFJFRzIgIiUleG1tNCIKKyMgZGVmaW5lIFJPVzQgIjQqMTYoJTApIgorIyBkZWZpbmUgUkVHNCAiJSV4bW02IgorIyBkZWZpbmUgUk9XNiAiNioxNiglMCkiCisjIGRlZmluZSBSRUc2ICIlJXhtbTYiCisjIGRlZmluZSBDTEVBUl9FVkVOKHIpCisjIGRlZmluZSBQVVRfRVZFTihkc3QpIFwKKyAgICAicHNodWZodyAgJDB4MUIsICUleG1tMiwgJSV4bW0yICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAgICAgICAgJSV4bW0yLCAiZHN0IiAgICBcblx0IgorIyBkZWZpbmUgWE1NUyAiJSV4bW0yIgorIyBkZWZpbmUgTU9WXzMyX09OTFkgIm1vdmRxYSAiCisjIGRlZmluZSBTUkVHMiAiJSV4bW03IgorIyBkZWZpbmUgVEFOMyAiJSV4bW0wIgorIyBkZWZpbmUgVEFOMSAiJSV4bW0yIgorCisjZW5kaWYKKworI2RlZmluZSBST1VORCh4KSAicGFkZGQgICAieAorCisjZGVmaW5lIEpaKHJlZywgdG8pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidGVzdGwgICAgICJyZWciLCJyZWciICAgICAgICAgICAgXG5cdCIgXAorICAgICJqeiAgICAgICAgInRvIiAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIEpOWihyZWcsIHRvKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidGVzdGwgICAgICJyZWciLCJyZWciICAgICAgICAgICAgXG5cdCIgXAorICAgICJqbnogICAgICAgInRvIiAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIFRFU1RfT05FX1JPVyhzcmMsIHJlZywgY2xlYXIpICAgICAgIFwKKyAgICBjbGVhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAic3JjIiwgJSVtbTEgICAgICAgICAgICBcblx0IiBcCisgICAgInBvciAgICA4KyJzcmMiLCAlJW1tMSAgICAgICAgICAgIFxuXHQiIFwKKyAgICAicGFkZHVzYiAgJSVtbTAsICUlbW0xICAgICAgICAgICAgXG5cdCIgXAorICAgICJwbW92bXNrYiAlJW1tMSwgInJlZyIgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIFRFU1RfVFdPX1JPV1Mocm93MSwgcm93MiwgcmVnMSwgcmVnMiwgY2xlYXIxLCBjbGVhcjIpIFwKKyAgICBjbGVhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsZWFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICJyb3cxIiwgJSVtbTEgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9yICAgIDgrInJvdzEiLCAlJW1tMSAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAicm93MiIsICUlbW0yICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgInBvciAgICA4KyJyb3cyIiwgJSVtbTIgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHVzYiAgICUlbW0wLCAlJW1tMSAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdXNiICAgJSVtbTAsICUlbW0yICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgInBtb3Ztc2tiICAlJW1tMSwgInJlZzEiICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG1vdm1za2IgICUlbW0yLCAicmVnMiIgICAgICAgICAgXG5cdCIKKworLy8vIElEQ1QgcGFzcyBvbiByb3dzLgorI2RlZmluZSBpTVRYX01VTFQoc3JjLCB0YWJsZSwgcm91bmRlciwgcHV0KSAgICAgICAgICAgIFwKKyAgICAibW92ZHFhICAgICAgICAic3JjIiwgJSV4bW0zICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgIm1vdmRxYSAgICAgICAlJXhtbTMsICUleG1tMCAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJwc2h1ZmQgICAkMHgxMSwgJSV4bW0zLCAlJXhtbTEgICBcblx0IiAvKiA0NjAyICovIFwKKyAgICAicHVucGNrbHFkcSAgICUleG1tMCwgJSV4bW0wICAgICAgXG5cdCIgLyogMDI0NiAqLyBcCisgICAgInBtYWRkd2QgICAgICJ0YWJsZSIsICUleG1tMCAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJwbWFkZHdkICAxNisidGFibGUiLCAlJXhtbTEgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAicHNodWZkICAgJDB4QkIsICUleG1tMywgJSV4bW0yICAgXG5cdCIgLyogNTcxMyAqLyBcCisgICAgInB1bnBja2hxZHEgICAlJXhtbTMsICUleG1tMyAgICAgIFxuXHQiIC8qIDEzNTcgKi8gXAorICAgICJwbWFkZHdkICAzMisidGFibGUiLCAlJXhtbTIgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAicG1hZGR3ZCAgNDgrInRhYmxlIiwgJSV4bW0zICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgInBhZGRkICAgICAgICAlJXhtbTEsICUleG1tMCAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJwYWRkZCAgICAgICAgJSV4bW0zLCAlJXhtbTIgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICByb3VuZGVyIiwgICAgICUleG1tMCAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgIm1vdmRxYSAgICAgICAlJXhtbTIsICUleG1tMyAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJwYWRkZCAgICAgICAgJSV4bW0wLCAlJXhtbTIgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAicHN1YmQgICAgICAgICUleG1tMywgJSV4bW0wICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgInBzcmFkICAgICAgICAgICAkMTEsICUleG1tMiAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJwc3JhZCAgICAgICAgICAgJDExLCAlJXhtbTAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAicGFja3NzZHcgICAgICUleG1tMCwgJSV4bW0yICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgcHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIGlMTE1fSEVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ZHFhICAgIk1BTkdMRSh0YW4zKSIsICJUQU4zIiAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAiTUFOR0xFKHRhbjEpIiwgIlRBTjEiICBcblx0IiBcCisKKy8vLyBJRENUIHBhc3Mgb24gY29sdW1ucy4KKyNkZWZpbmUgaUxMTV9QQVNTKGRjdCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZkcWEgICAiVEFOMyIsICUleG1tMSAgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJUQU4xIiwgJSV4bW0zICAgICAgICAgIFxuXHQiIFwKKyAgICAicG11bGh3ICAgJSV4bW00LCAiVEFOMyIgICAgICAgICAgXG5cdCIgXAorICAgICJwbXVsaHcgICAlJXhtbTUsICUleG1tMSAgICAgICAgICBcblx0IiBcCisgICAgInBhZGRzdyAgICUleG1tNCwgIlRBTjMiICAgICAgICAgIFxuXHQiIFwKKyAgICAicGFkZHN3ICAgJSV4bW01LCAlJXhtbTEgICAgICAgICAgXG5cdCIgXAorICAgICJwc3Vic3cgICAlJXhtbTUsICJUQU4zIiAgICAgICAgICBcblx0IiBcCisgICAgInBhZGRzdyAgICUleG1tNCwgJSV4bW0xICAgICAgICAgIFxuXHQiIFwKKyAgICAicG11bGh3ICAgJSV4bW03LCAlJXhtbTMgICAgICAgICAgXG5cdCIgXAorICAgICJwbXVsaHcgICAlJXhtbTYsICJUQU4xIiAgICAgICAgICBcblx0IiBcCisgICAgInBhZGRzdyAgICUleG1tNiwgJSV4bW0zICAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgJSV4bW03LCAiVEFOMSIgICAgICAgICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAlJXhtbTMsICUleG1tNyAgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJUQU4xIiwgJSV4bW02ICAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgJSV4bW0xLCAlJXhtbTMgICAgICAgICAgXG5cdCIgXAorICAgICJwc3Vic3cgICAiVEFOMyIsICJUQU4xIiAgICAgICAgICBcblx0IiBcCisgICAgInBhZGRzdyAgICUleG1tNywgJSV4bW0xICAgICAgICAgIFxuXHQiIFwKKyAgICAicGFkZHN3ICAgJSV4bW02LCAiVEFOMyIgICAgICAgICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAlJXhtbTMsICUleG1tNiAgICAgICAgICBcblx0IiBcCisgICAgInBzdWJzdyAgICJUQU4zIiwgJSV4bW0zICAgICAgICAgIFxuXHQiIFwKKyAgICAicGFkZHN3ICAgJSV4bW02LCAiVEFOMyIgICAgICAgICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAiTUFOR0xFKHNxcnQyKSIsICUleG1tNCBcblx0IiBcCisgICAgInBtdWxodyAgICUleG1tNCwgJSV4bW0zICAgICAgICAgIFxuXHQiIFwKKyAgICAicG11bGh3ICAgJSV4bW00LCAiVEFOMyIgICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAiVEFOMyIsICJUQU4zIiAgICAgICAgICBcblx0IiBcCisgICAgInBhZGRzdyAgICUleG1tMywgJSV4bW0zICAgICAgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgIk1BTkdMRSh0YW4yKSIsICUleG1tNyAgXG5cdCIgXAorICAgIE1PVl8zMl9PTkxZIFJPVzIiLCAiUkVHMiIgICAgICAgICBcblx0IiBcCisgICAgTU9WXzMyX09OTFkgUk9XNiIsICJSRUc2IiAgICAgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgJSV4bW03LCAlJXhtbTUgICAgICAgICAgXG5cdCIgXAorICAgICJwbXVsaHcgICAiUkVHNiIsICUleG1tNyAgICAgICAgICBcblx0IiBcCisgICAgInBtdWxodyAgICJSRUcyIiwgJSV4bW01ICAgICAgICAgIFxuXHQiIFwKKyAgICAicGFkZHN3ICAgIlJFRzIiLCAlJXhtbTcgICAgICAgICAgXG5cdCIgXAorICAgICJwc3Vic3cgICAiUkVHNiIsICUleG1tNSAgICAgICAgICBcblx0IiBcCisgICAgTU9WXzMyX09OTFkgUk9XMCIsICJSRUcwIiAgICAgICAgIFxuXHQiIFwKKyAgICBNT1ZfMzJfT05MWSBST1c0IiwgIlJFRzQiICAgICAgICAgXG5cdCIgXAorICAgIE1PVl8zMl9PTkxZIiAgIlRBTjEiLCAoJTApICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJSRUcwIiwgIlhNTVMiICAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgIlJFRzQiLCAiUkVHMCIgICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAiWE1NUyIsICJSRUc0IiAgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJSRUc0IiwgIlhNTVMiICAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgJSV4bW03LCAiUkVHNCIgICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAiWE1NUyIsICUleG1tNyAgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJSRUcwIiwgIlhNTVMiICAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgJSV4bW01LCAiUkVHMCIgICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAiWE1NUyIsICUleG1tNSAgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICUleG1tNSwgIlhNTVMiICAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgIlRBTjMiLCAlJXhtbTUgICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAiWE1NUyIsICJUQU4zIiAgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJSRUcwIiwgIlhNTVMiICAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgJSV4bW0zLCAiUkVHMCIgICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAiWE1NUyIsICUleG1tMyAgICAgICAgICBcblx0IiBcCisgICAgTU9WXzMyX09OTFkiICAoJTApLCAiVEFOMSIgICAgICAgIFxuXHQiIFwKKyAgICAicHNyYXcgICAgICAgICQ2LCAlJXhtbTUgICAgICAgICAgXG5cdCIgXAorICAgICJwc3JhdyAgICAgICAgJDYsICJSRUcwIiAgICAgICAgICBcblx0IiBcCisgICAgInBzcmF3ICAgICAgICAkNiwgIlRBTjMiICAgICAgICAgIFxuXHQiIFwKKyAgICAicHNyYXcgICAgICAgICQ2LCAlJXhtbTMgICAgICAgICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAiVEFOMyIsIDEqMTYoImRjdCIpICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICUleG1tMywgMioxNigiZGN0IikgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgIlJFRzAiLCA1KjE2KCJkY3QiKSAgICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAlJXhtbTUsIDYqMTYoImRjdCIpICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICUleG1tNywgJSV4bW0wICAgICAgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgIlJFRzQiLCAlJXhtbTQgICAgICAgICAgXG5cdCIgXAorICAgICJwc3Vic3cgICAlJXhtbTEsICUleG1tNyAgICAgICAgICBcblx0IiBcCisgICAgInBzdWJzdyAgICJUQU4xIiwgIlJFRzQiICAgICAgICAgIFxuXHQiIFwKKyAgICAicGFkZHN3ICAgJSV4bW0wLCAlJXhtbTEgICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAlJXhtbTQsICJUQU4xIiAgICAgICAgICBcblx0IiBcCisgICAgInBzcmF3ICAgICAgICAkNiwgJSV4bW0xICAgICAgICAgIFxuXHQiIFwKKyAgICAicHNyYXcgICAgICAgICQ2LCAlJXhtbTcgICAgICAgICAgXG5cdCIgXAorICAgICJwc3JhdyAgICAgICAgJDYsICJUQU4xIiAgICAgICAgICBcblx0IiBcCisgICAgInBzcmF3ICAgICAgICAkNiwgIlJFRzQiICAgICAgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgJSV4bW0xLCAoImRjdCIpICAgICAgICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAiVEFOMSIsIDMqMTYoImRjdCIpICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJSRUc0IiwgNCoxNigiZGN0IikgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgJSV4bW03LCA3KjE2KCJkY3QiKSAgICAgXG5cdCIKKworLy8vIElEQ1QgcGFzcyBvbiBjb2x1bW5zLCBhc3N1bWluZyByb3dzIDQtNyBhcmUgemVyby4KKyNkZWZpbmUgaUxMTV9QQVNTX1NQQVJTRShkY3QpICAgICAgICAgICAgICAgXAorICAgICJwbXVsaHcgICAlJXhtbTQsICJUQU4zIiAgICAgICAgICBcblx0IiBcCisgICAgInBhZGRzdyAgICUleG1tNCwgIlRBTjMiICAgICAgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgJSV4bW02LCAlJXhtbTMgICAgICAgICAgXG5cdCIgXAorICAgICJwbXVsaHcgICAlJXhtbTYsICJUQU4xIiAgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICUleG1tNCwgJSV4bW0xICAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgJSV4bW0xLCAlJXhtbTMgICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAlJXhtbTYsICUleG1tMSAgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJUQU4xIiwgJSV4bW02ICAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgIlRBTjMiLCAiVEFOMSIgICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAlJXhtbTYsICJUQU4zIiAgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICUleG1tMywgJSV4bW02ICAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgIlRBTjMiLCAlJXhtbTMgICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAlJXhtbTYsICJUQU4zIiAgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJNQU5HTEUoc3FydDIpIiwgJSV4bW00IFxuXHQiIFwKKyAgICAicG11bGh3ICAgJSV4bW00LCAlJXhtbTMgICAgICAgICAgXG5cdCIgXAorICAgICJwbXVsaHcgICAlJXhtbTQsICJUQU4zIiAgICAgICAgICBcblx0IiBcCisgICAgInBhZGRzdyAgICJUQU4zIiwgIlRBTjMiICAgICAgICAgIFxuXHQiIFwKKyAgICAicGFkZHN3ICAgJSV4bW0zLCAlJXhtbTMgICAgICAgICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAiTUFOR0xFKHRhbjIpIiwgJSV4bW01ICBcblx0IiBcCisgICAgTU9WXzMyX09OTFkgUk9XMiIsICJTUkVHMiIgICAgICAgIFxuXHQiIFwKKyAgICAicG11bGh3ICAgIlNSRUcyIiwgJSV4bW01ICAgICAgICAgXG5cdCIgXAorICAgIE1PVl8zMl9PTkxZIFJPVzAiLCAiUkVHMCIgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJSRUcwIiwgJSV4bW02ICAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgIlNSRUcyIiwgJSV4bW02ICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAiUkVHMCIsICJTUkVHMiIgICAgICAgICBcblx0IiBcCisgICAgTU9WXzMyX09OTFkiICAiVEFOMSIsICglMCkgICAgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgIlJFRzAiLCAiWE1NUyIgICAgICAgICAgXG5cdCIgXAorICAgICJwc3Vic3cgICAlJXhtbTUsICJSRUcwIiAgICAgICAgICBcblx0IiBcCisgICAgInBhZGRzdyAgICJYTU1TIiwgJSV4bW01ICAgICAgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgJSV4bW01LCAiWE1NUyIgICAgICAgICAgXG5cdCIgXAorICAgICJwc3Vic3cgICAiVEFOMyIsICUleG1tNSAgICAgICAgICBcblx0IiBcCisgICAgInBhZGRzdyAgICJYTU1TIiwgIlRBTjMiICAgICAgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgIlJFRzAiLCAiWE1NUyIgICAgICAgICAgXG5cdCIgXAorICAgICJwc3Vic3cgICAlJXhtbTMsICJSRUcwIiAgICAgICAgICBcblx0IiBcCisgICAgInBhZGRzdyAgICJYTU1TIiwgJSV4bW0zICAgICAgICAgIFxuXHQiIFwKKyAgICBNT1ZfMzJfT05MWSIgICglMCksICJUQU4xIiAgICAgICAgXG5cdCIgXAorICAgICJwc3JhdyAgICAgICAgJDYsICUleG1tNSAgICAgICAgICBcblx0IiBcCisgICAgInBzcmF3ICAgICAgICAkNiwgIlJFRzAiICAgICAgICAgIFxuXHQiIFwKKyAgICAicHNyYXcgICAgICAgICQ2LCAiVEFOMyIgICAgICAgICAgXG5cdCIgXAorICAgICJwc3JhdyAgICAgICAgJDYsICUleG1tMyAgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJUQU4zIiwgMSoxNigiZGN0IikgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgJSV4bW0zLCAyKjE2KCJkY3QiKSAgICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAiUkVHMCIsIDUqMTYoImRjdCIpICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICUleG1tNSwgNioxNigiZGN0IikgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgIlNSRUcyIiwgJSV4bW0wICAgICAgICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAlJXhtbTYsICUleG1tNCAgICAgICAgICBcblx0IiBcCisgICAgInBzdWJzdyAgICUleG1tMSwgIlNSRUcyIiAgICAgICAgIFxuXHQiIFwKKyAgICAicHN1YnN3ICAgIlRBTjEiLCAlJXhtbTYgICAgICAgICAgXG5cdCIgXAorICAgICJwYWRkc3cgICAlJXhtbTAsICUleG1tMSAgICAgICAgICBcblx0IiBcCisgICAgInBhZGRzdyAgICUleG1tNCwgIlRBTjEiICAgICAgICAgIFxuXHQiIFwKKyAgICAicHNyYXcgICAgICAgICQ2LCAlJXhtbTEgICAgICAgICAgXG5cdCIgXAorICAgICJwc3JhdyAgICAgICAgJDYsICJTUkVHMiIgICAgICAgICBcblx0IiBcCisgICAgInBzcmF3ICAgICAgICAkNiwgIlRBTjEiICAgICAgICAgIFxuXHQiIFwKKyAgICAicHNyYXcgICAgICAgICQ2LCAlJXhtbTYgICAgICAgICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAlJXhtbTEsICgiZGN0IikgICAgICAgICBcblx0IiBcCisgICAgIm1vdmRxYSAgICJUQU4xIiwgMyoxNigiZGN0IikgICAgIFxuXHQiIFwKKyAgICAibW92ZHFhICAgJSV4bW02LCA0KjE2KCJkY3QiKSAgICAgXG5cdCIgXAorICAgICJtb3ZkcWEgICAiU1JFRzIiLCA3KjE2KCJkY3QiKSAgICBcblx0IgorCithdl9leHRlcm5faW5saW5lIHZvaWQgZmZfeHZpZF9pZGN0X3NzZTIoc2hvcnQgKmJsb2NrKQoreworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibW92cSAgICAgIk1BTkdMRSAobTEyNykgIiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBpTVRYX01VTFQoIiglMCkiLCAgICAgTUFOR0xFKGlUYWIxKSwgUk9VTkQoTUFOR0xFKHdhbGtlbklkY3RSb3VuZGVycykpLCAgICAgICAgUFVUX0VWRU4oUk9XMCkpCisgICAgICAgIGlNVFhfTVVMVCgiMSoxNiglMCkiLCBNQU5HTEUoaVRhYjIpLCBST1VORCgiMSoxNisiTUFOR0xFKHdhbGtlbklkY3RSb3VuZGVycykpLCBQVVRfT0REKFJPVzEpKQorICAgICAgICBpTVRYX01VTFQoIjIqMTYoJTApIiwgTUFOR0xFKGlUYWIzKSwgUk9VTkQoIjIqMTYrIk1BTkdMRSh3YWxrZW5JZGN0Um91bmRlcnMpKSwgUFVUX0VWRU4oUk9XMikpCisKKyAgICAgICAgVEVTVF9UV09fUk9XUygiMyoxNiglMCkiLCAiNCoxNiglMCkiLCAiJSVlYXgiLCAiJSVlY3giLCBDTEVBUl9PREQoUk9XMyksIENMRUFSX0VWRU4oUk9XNCkpCisgICAgICAgIEpaKCIlJWVheCIsICIxZiIpCisgICAgICAgIGlNVFhfTVVMVCgiMyoxNiglMCkiLCBNQU5HTEUoaVRhYjQpLCBST1VORCgiMyoxNisiTUFOR0xFKHdhbGtlbklkY3RSb3VuZGVycykpLCBQVVRfT0REKFJPVzMpKQorCisgICAgICAgIFRFU1RfVFdPX1JPV1MoIjUqMTYoJTApIiwgIjYqMTYoJTApIiwgIiUlZWF4IiwgIiUlZWR4IiwgQ0xFQVJfT0REKFJPVzUpLCBDTEVBUl9FVkVOKFJPVzYpKQorICAgICAgICBURVNUX09ORV9ST1coIjcqMTYoJTApIiwgIiUlZXNpIiwgQ0xFQVJfT0REKFJPVzcpKQorICAgICAgICBpTExNX0hFQUQKKyAgICAgICAgIi5wMmFsaWduIDQgXG5cdCIKKyAgICAgICAgSk5aKCIlJWVjeCIsICIyZiIpCisgICAgICAgIEpOWigiJSVlYXgiLCAiM2YiKQorICAgICAgICBKTlooIiUlZWR4IiwgIjRmIikKKyAgICAgICAgSk5aKCIlJWVzaSIsICI1ZiIpCisgICAgICAgIGlMTE1fUEFTU19TUEFSU0UoIiUwIikKKyAgICAgICAgImptcCA2ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBpTVRYX01VTFQoIjQqMTYoJTApIiwgTUFOR0xFKGlUYWIxKSwgIiMiLCBQVVRfRVZFTihST1c0KSkKKyAgICAgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIGlNVFhfTVVMVCgiNSoxNiglMCkiLCBNQU5HTEUoaVRhYjQpLCBST1VORCgiNCoxNisiTUFOR0xFKHdhbGtlbklkY3RSb3VuZGVycykpLCBQVVRfT0REKFJPVzUpKQorICAgICAgICBKWigiJSVlZHgiLCAiMWYiKQorICAgICAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgaU1UWF9NVUxUKCI2KjE2KCUwKSIsIE1BTkdMRShpVGFiMyksIFJPVU5EKCI1KjE2KyJNQU5HTEUod2Fsa2VuSWRjdFJvdW5kZXJzKSksIFBVVF9FVkVOKFJPVzYpKQorICAgICAgICBKWigiJSVlc2kiLCAiMWYiKQorICAgICAgICAiNTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgaU1UWF9NVUxUKCI3KjE2KCUwKSIsIE1BTkdMRShpVGFiMiksIFJPVU5EKCI1KjE2KyJNQU5HTEUod2Fsa2VuSWRjdFJvdW5kZXJzKSksIFBVVF9PREQoUk9XNykpCisjaWYgQVJDSF9YODZfMzIKKyAgICAgICAgaUxMTV9IRUFECisjZW5kaWYKKyAgICAgICAgaUxMTV9QQVNTKCIlMCIpCisgICAgICAgICI2OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6ICIrciIgKGJsb2NrKQorICAgICAgICA6IE5BTUVEX0NPTlNUUkFJTlRTX0FSUkFZKG0xMjcsaVRhYjEsd2Fsa2VuSWRjdFJvdW5kZXJzLGlUYWIyLGlUYWIzLGlUYWI0LHRhbjMsdGFuMSx0YW4yLHNxcnQyKQorICAgICAgICA6IFhNTV9DTE9CQkVSUygiJXhtbTAiLCAiJXhtbTEiLCAiJXhtbTIiLCAiJXhtbTMiLAorICAgICAgICAgICAgICAgICAgICAgICAiJXhtbTQiLCAiJXhtbTUiLCAiJXhtbTYiLCAiJXhtbTciLCApCisjaWYgQVJDSF9YODZfNjQKKyAgICAgICAgICBYTU1fQ0xPQkJFUlMoIiV4bW04IiwgIiV4bW05IiwgIiV4bW0xMCIsICIleG1tMTEiLAorICAgICAgICAgICAgICAgICAgICAgICAiJXhtbTEyIiwgIiV4bW0xMyIsICIleG1tMTQiLCApCisjZW5kaWYKKyAgICAgICAgICAiJWVheCIsICIlZWN4IiwgIiVlZHgiLCAiJWVzaSIsICJtZW1vcnkiKTsKK30KKwordm9pZCBmZl94dmlkX2lkY3Rfc3NlMl9wdXQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgc2hvcnQgKmJsb2NrKQoreworICAgIGZmX3h2aWRfaWRjdF9zc2UyKGJsb2NrKTsKKyAgICBmZl9wdXRfcGl4ZWxzX2NsYW1wZWQoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7Cit9CisKK3ZvaWQgZmZfeHZpZF9pZGN0X3NzZTJfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIHNob3J0ICpibG9jaykKK3sKKyAgICBmZl94dmlkX2lkY3Rfc3NlMihibG9jayk7CisgICAgZmZfYWRkX3BpeGVsc19jbGFtcGVkKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworfQorCisjZW5kaWYgLyogSEFWRV9TU0UyX0lOTElORSAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveGFuLmMgYi9mZm1wZWcvbGliYXZjb2RlYy94YW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njg0NjRjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveGFuLmMKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgKiBXaW5nIENvbW1hbmRlci9YYW4gVmlkZW8gRGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBYYW4gdmlkZW8gZGVjb2RlciBmb3IgV2luZyBDb21tYW5kZXIgSUlJIGNvbXB1dGVyIGdhbWUKKyAqIGJ5IE1hcmlvIEJyaXRvIChtYnJpdG9Ac3R1ZGVudC5kZWkudWMucHQpCisgKiBhbmQgTWlrZSBNZWxhbnNvbiAobWVsYW5zb25AcGNpc3lzLm5ldCkKKyAqCisgKiBUaGUgeGFuX3djMyBkZWNvZGVyIG91dHB1dHMgUEFMOCBkYXRhLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFJVTlRJTUVfR0FNTUEgMAorCisjZGVmaW5lIFZHQV9fVEFHIE1LVEFHKCdWJywgJ0cnLCAnQScsICcgJykKKyNkZWZpbmUgUEFMVF9UQUcgTUtUQUcoJ1AnLCAnQScsICdMJywgJ1QnKQorI2RlZmluZSBTSE9UX1RBRyBNS1RBRygnUycsICdIJywgJ08nLCAnVCcpCisjZGVmaW5lIFBBTEVUVEVfQ09VTlQgMjU2CisjZGVmaW5lIFBBTEVUVEVfU0laRSAoUEFMRVRURV9DT1VOVCAqIDMpCisjZGVmaW5lIFBBTEVUVEVTX01BWCAyNTYKKwordHlwZWRlZiBzdHJ1Y3QgWGFuQ29udGV4dCB7CisKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAqbGFzdF9mcmFtZTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKyAgICBpbnQgc2l6ZTsKKworICAgIC8qIHNjcmF0Y2ggc3BhY2UgKi8KKyAgICB1aW50OF90ICpidWZmZXIxOworICAgIGludCBidWZmZXIxX3NpemU7CisgICAgdWludDhfdCAqYnVmZmVyMjsKKyAgICBpbnQgYnVmZmVyMl9zaXplOworCisgICAgdW5zaWduZWQgKnBhbGV0dGVzOworICAgIGludCBwYWxldHRlc19jb3VudDsKKyAgICBpbnQgY3VyX3BhbGV0dGU7CisKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKworfSBYYW5Db250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgeGFuX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFhhbkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9mcmFtZSk7CisKKyAgICBhdl9mcmVlcCgmcy0+YnVmZmVyMSk7CisgICAgYXZfZnJlZXAoJnMtPmJ1ZmZlcjIpOworICAgIGF2X2ZyZWVwKCZzLT5wYWxldHRlcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHhhbl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgWGFuQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIHMtPmZyYW1lX3NpemUgPSAwOworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisKKyAgICBzLT5idWZmZXIxX3NpemUgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0OworICAgIHMtPmJ1ZmZlcjEgPSBhdl9tYWxsb2Mocy0+YnVmZmVyMV9zaXplKTsKKyAgICBpZiAoIXMtPmJ1ZmZlcjEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcy0+YnVmZmVyMl9zaXplID0gYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodDsKKyAgICBzLT5idWZmZXIyID0gYXZfbWFsbG9jKHMtPmJ1ZmZlcjJfc2l6ZSArIDEzMCk7CisgICAgaWYgKCFzLT5idWZmZXIyKSB7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5idWZmZXIxKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBzLT5sYXN0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmxhc3RfZnJhbWUpIHsKKyAgICAgICAgeGFuX2RlY29kZV9lbmQoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhhbl9odWZmbWFuX2RlY29kZSh1aW50OF90ICpkZXN0LCBpbnQgZGVzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGVuKQoreworICAgIHVpbnQ4X3QgYnl0ZSA9ICpzcmMrKzsKKyAgICB1aW50OF90IGl2YWwgPSBieXRlICsgMHgxNjsKKyAgICBjb25zdCB1aW50OF90ICogcHRyID0gc3JjICsgYnl0ZSoyOworICAgIGludCBwdHJfbGVuID0gc3JjX2xlbiAtIDEgLSBieXRlKjI7CisgICAgdWludDhfdCB2YWwgPSBpdmFsOworICAgIHVpbnQ4X3QgKmRlc3RfZW5kID0gZGVzdCArIGRlc3RfbGVuOworICAgIHVpbnQ4X3QgKmRlc3Rfc3RhcnQgPSBkZXN0OworICAgIGludCByZXQ7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBwdHIsIHB0cl9sZW4pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICB3aGlsZSAodmFsICE9IDB4MTYpIHsKKyAgICAgICAgdW5zaWduZWQgaWR4ID0gdmFsIC0gMHgxNyArIGdldF9iaXRzMSgmZ2IpICogYnl0ZTsKKyAgICAgICAgaWYgKGlkeCA+PSAyICogYnl0ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB2YWwgPSBzcmNbaWR4XTsKKworICAgICAgICBpZiAodmFsIDwgMHgxNikgeworICAgICAgICAgICAgaWYgKGRlc3QgPj0gZGVzdF9lbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc3RfbGVuOworICAgICAgICAgICAgKmRlc3QrKyA9IHZhbDsKKyAgICAgICAgICAgIHZhbCA9IGl2YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZGVzdCAtIGRlc3Rfc3RhcnQ7Cit9CisKKy8qKgorICogdW5wYWNrIHNpbXBsZSBjb21wcmVzc2lvbgorICoKKyAqIEBwYXJhbSBkZXN0IGRlc3RpbmF0aW9uIGJ1ZmZlciBvZiBkZXN0X2xlbiwgbXVzdCBiZSBwYWRkZWQgd2l0aCBhdCBsZWFzdCAxMzAgYnl0ZXMKKyAqLworc3RhdGljIHZvaWQgeGFuX3VucGFjayh1aW50OF90ICpkZXN0LCBpbnQgZGVzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19sZW4pCit7CisgICAgdWludDhfdCBvcGNvZGU7CisgICAgaW50IHNpemU7CisgICAgdWludDhfdCAqZGVzdF9vcmcgPSBkZXN0OworICAgIHVpbnQ4X3QgKmRlc3RfZW5kID0gZGVzdCArIGRlc3RfbGVuOworICAgIEdldEJ5dGVDb250ZXh0IGN0eDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmN0eCwgc3JjLCBzcmNfbGVuKTsKKyAgICB3aGlsZSAoZGVzdCA8IGRlc3RfZW5kICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgpKSB7CisgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgpOworCisgICAgICAgIGlmIChvcGNvZGUgPCAweGUwKSB7CisgICAgICAgICAgICBpbnQgc2l6ZTIsIGJhY2s7CisgICAgICAgICAgICBpZiAoKG9wY29kZSAmIDB4ODApID09IDApIHsKKyAgICAgICAgICAgICAgICBzaXplID0gb3Bjb2RlICYgMzsKKworICAgICAgICAgICAgICAgIGJhY2sgID0gKChvcGNvZGUgJiAweDYwKSA8PCAzKSArIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgpICsgMTsKKyAgICAgICAgICAgICAgICBzaXplMiA9ICgob3Bjb2RlICYgMHgxYykgPj4gMikgKyAzOworICAgICAgICAgICAgfSBlbHNlIGlmICgob3Bjb2RlICYgMHg0MCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHNpemUgPSBieXRlc3RyZWFtMl9wZWVrX2J5dGUoJmN0eCkgPj4gNjsKKworICAgICAgICAgICAgICAgIGJhY2sgID0gKGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZjdHgpICYgMHgzZmZmKSArIDE7CisgICAgICAgICAgICAgICAgc2l6ZTIgPSAob3Bjb2RlICYgMHgzZikgKyA0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaXplID0gb3Bjb2RlICYgMzsKKworICAgICAgICAgICAgICAgIGJhY2sgID0gKChvcGNvZGUgJiAweDEwKSA8PCAxMikgKyBieXRlc3RyZWFtMl9nZXRfYmUxNigmY3R4KSArIDE7CisgICAgICAgICAgICAgICAgc2l6ZTIgPSAoKG9wY29kZSAmIDB4MGMpIDw8ICA2KSArIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZjdHgpICsgNTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlc3RfZW5kIC0gZGVzdCA8IHNpemUgKyBzaXplMiB8fAorICAgICAgICAgICAgICAgIGRlc3QgKyBzaXplIC0gZGVzdF9vcmcgPCBiYWNrIHx8CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eCkgPCBzaXplKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmN0eCwgZGVzdCwgc2l6ZSk7CisgICAgICAgICAgICBkZXN0ICs9IHNpemU7CisgICAgICAgICAgICBhdl9tZW1jcHlfYmFja3B0cihkZXN0LCBiYWNrLCBzaXplMik7CisgICAgICAgICAgICBkZXN0ICs9IHNpemUyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGZpbmlzaCA9IG9wY29kZSA+PSAweGZjOworICAgICAgICAgICAgc2l6ZSA9IGZpbmlzaCA/IG9wY29kZSAmIDMgOiAoKG9wY29kZSAmIDB4MWYpIDw8IDIpICsgNDsKKworICAgICAgICAgICAgaWYgKGRlc3RfZW5kIC0gZGVzdCA8IHNpemUgfHwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eCkgPCBzaXplKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmN0eCwgZGVzdCwgc2l6ZSk7CisgICAgICAgICAgICBkZXN0ICs9IHNpemU7CisgICAgICAgICAgICBpZiAoZmluaXNoKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHhhbl93YzNfb3V0cHV0X3BpeGVsX3J1bihYYW5Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwKKyAgICBjb25zdCB1aW50OF90ICpwaXhlbF9idWZmZXIsIGludCB4LCBpbnQgeSwgaW50IHBpeGVsX2NvdW50KQoreworICAgIGludCBzdHJpZGU7CisgICAgaW50IGxpbmVfaW5jOworICAgIGludCBpbmRleDsKKyAgICBpbnQgY3VycmVudF94OworICAgIGludCB3aWR0aCA9IHMtPmF2Y3R4LT53aWR0aDsKKyAgICB1aW50OF90ICpwYWxldHRlX3BsYW5lOworCisgICAgcGFsZXR0ZV9wbGFuZSA9IGZyYW1lLT5kYXRhWzBdOworICAgIHN0cmlkZSA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICBsaW5lX2luYyA9IHN0cmlkZSAtIHdpZHRoOworICAgIGluZGV4ID0geSAqIHN0cmlkZSArIHg7CisgICAgY3VycmVudF94ID0geDsKKyAgICB3aGlsZSAocGl4ZWxfY291bnQgJiYgaW5kZXggPCBzLT5mcmFtZV9zaXplKSB7CisgICAgICAgIGludCBjb3VudCA9IEZGTUlOKHBpeGVsX2NvdW50LCB3aWR0aCAtIGN1cnJlbnRfeCk7CisgICAgICAgIG1lbWNweShwYWxldHRlX3BsYW5lICsgaW5kZXgsIHBpeGVsX2J1ZmZlciwgY291bnQpOworICAgICAgICBwaXhlbF9jb3VudCAgLT0gY291bnQ7CisgICAgICAgIGluZGV4ICAgICAgICArPSBjb3VudDsKKyAgICAgICAgcGl4ZWxfYnVmZmVyICs9IGNvdW50OworICAgICAgICBjdXJyZW50X3ggICAgKz0gY291bnQ7CisKKyAgICAgICAgaWYgKGN1cnJlbnRfeCA+PSB3aWR0aCkgeworICAgICAgICAgICAgaW5kZXggKz0gbGluZV9pbmM7CisgICAgICAgICAgICBjdXJyZW50X3ggPSAwOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeGFuX3djM19jb3B5X3BpeGVsX3J1bihYYW5Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwgaW50IG1vdGlvbl94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl95KQoreworICAgIGludCBzdHJpZGU7CisgICAgaW50IGxpbmVfaW5jOworICAgIGludCBjdXJmcmFtZV9pbmRleCwgcHJldmZyYW1lX2luZGV4OworICAgIGludCBjdXJmcmFtZV94LCBwcmV2ZnJhbWVfeDsKKyAgICBpbnQgd2lkdGggPSBzLT5hdmN0eC0+d2lkdGg7CisgICAgdWludDhfdCAqcGFsZXR0ZV9wbGFuZSwgKnByZXZfcGFsZXR0ZV9wbGFuZTsKKworICAgIGlmICh5ICsgbW90aW9uX3kgPCAwIHx8IHkgKyBtb3Rpb25feSA+PSBzLT5hdmN0eC0+aGVpZ2h0IHx8CisgICAgICAgIHggKyBtb3Rpb25feCA8IDAgfHwgeCArIG1vdGlvbl94ID49IHMtPmF2Y3R4LT53aWR0aCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGFsZXR0ZV9wbGFuZSA9IGZyYW1lLT5kYXRhWzBdOworICAgIHByZXZfcGFsZXR0ZV9wbGFuZSA9IHMtPmxhc3RfZnJhbWUtPmRhdGFbMF07CisgICAgaWYgKCFwcmV2X3BhbGV0dGVfcGxhbmUpCisgICAgICAgIHByZXZfcGFsZXR0ZV9wbGFuZSA9IHBhbGV0dGVfcGxhbmU7CisgICAgc3RyaWRlID0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIGxpbmVfaW5jID0gc3RyaWRlIC0gd2lkdGg7CisgICAgY3VyZnJhbWVfaW5kZXggPSB5ICogc3RyaWRlICsgeDsKKyAgICBjdXJmcmFtZV94ID0geDsKKyAgICBwcmV2ZnJhbWVfaW5kZXggPSAoeSArIG1vdGlvbl95KSAqIHN0cmlkZSArIHggKyBtb3Rpb25feDsKKyAgICBwcmV2ZnJhbWVfeCA9IHggKyBtb3Rpb25feDsKKworICAgIGlmIChwcmV2X3BhbGV0dGVfcGxhbmUgPT0gcGFsZXR0ZV9wbGFuZSAmJiBGRkFCUyhjdXJmcmFtZV9pbmRleCAtIHByZXZmcmFtZV9pbmRleCkgPCBwaXhlbF9jb3VudCkgeworICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiT3ZlcmxhcHBpbmcgY29weVxuIik7CisgICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHdoaWxlIChwaXhlbF9jb3VudCAmJgorICAgICAgICAgICBjdXJmcmFtZV9pbmRleCAgPCBzLT5mcmFtZV9zaXplICYmCisgICAgICAgICAgIHByZXZmcmFtZV9pbmRleCA8IHMtPmZyYW1lX3NpemUpIHsKKyAgICAgICAgaW50IGNvdW50ID0gRkZNSU4zKHBpeGVsX2NvdW50LCB3aWR0aCAtIGN1cmZyYW1lX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAtIHByZXZmcmFtZV94KTsKKworICAgICAgICBtZW1jcHkocGFsZXR0ZV9wbGFuZSArIGN1cmZyYW1lX2luZGV4LAorICAgICAgICAgICAgICAgcHJldl9wYWxldHRlX3BsYW5lICsgcHJldmZyYW1lX2luZGV4LCBjb3VudCk7CisgICAgICAgIHBpeGVsX2NvdW50ICAgICAtPSBjb3VudDsKKyAgICAgICAgY3VyZnJhbWVfaW5kZXggICs9IGNvdW50OworICAgICAgICBwcmV2ZnJhbWVfaW5kZXggKz0gY291bnQ7CisgICAgICAgIGN1cmZyYW1lX3ggICAgICArPSBjb3VudDsKKyAgICAgICAgcHJldmZyYW1lX3ggICAgICs9IGNvdW50OworCisgICAgICAgIGlmIChjdXJmcmFtZV94ID49IHdpZHRoKSB7CisgICAgICAgICAgICBjdXJmcmFtZV9pbmRleCArPSBsaW5lX2luYzsKKyAgICAgICAgICAgIGN1cmZyYW1lX3ggPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByZXZmcmFtZV94ID49IHdpZHRoKSB7CisgICAgICAgICAgICBwcmV2ZnJhbWVfaW5kZXggKz0gbGluZV9pbmM7CisgICAgICAgICAgICBwcmV2ZnJhbWVfeCA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgeGFuX3djM19kZWNvZGVfZnJhbWUoWGFuQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisKKyAgICBpbnQgd2lkdGggID0gcy0+YXZjdHgtPndpZHRoOworICAgIGludCBoZWlnaHQgPSBzLT5hdmN0eC0+aGVpZ2h0OworICAgIGludCB0b3RhbF9waXhlbHMgPSB3aWR0aCAqIGhlaWdodDsKKyAgICB1aW50OF90IG9wY29kZTsKKyAgICB1aW50OF90IGZsYWcgPSAwOworICAgIGludCBzaXplID0gMDsKKyAgICBpbnQgbW90aW9uX3gsIG1vdGlvbl95OworICAgIGludCB4LCB5LCByZXQ7CisKKyAgICB1aW50OF90ICpvcGNvZGVfYnVmZmVyID0gcy0+YnVmZmVyMTsKKyAgICB1aW50OF90ICpvcGNvZGVfYnVmZmVyX2VuZCA9IHMtPmJ1ZmZlcjEgKyBzLT5idWZmZXIxX3NpemU7CisgICAgaW50IG9wY29kZV9idWZmZXJfc2l6ZSA9IHMtPmJ1ZmZlcjFfc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICppbWFnZWRhdGFfYnVmZmVyID0gcy0+YnVmZmVyMjsKKworICAgIC8qIHBvaW50ZXJzIHRvIHNlZ21lbnRzIGluc2lkZSB0aGUgY29tcHJlc3NlZCBjaHVuayAqLworICAgIGNvbnN0IHVpbnQ4X3QgKmh1ZmZtYW5fc2VnbWVudDsKKyAgICBHZXRCeXRlQ29udGV4dCAgICAgICBzaXplX3NlZ21lbnQ7CisgICAgR2V0Qnl0ZUNvbnRleHQgICAgICAgdmVjdG9yX3NlZ21lbnQ7CisgICAgY29uc3QgdWludDhfdCAqaW1hZ2VkYXRhX3NlZ21lbnQ7CisgICAgaW50IGh1ZmZtYW5fb2Zmc2V0LCBzaXplX29mZnNldCwgdmVjdG9yX29mZnNldCwgaW1hZ2VkYXRhX29mZnNldCwKKyAgICAgICAgaW1hZ2VkYXRhX3NpemU7CisKKyAgICBpZiAocy0+c2l6ZSA8IDgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaHVmZm1hbl9vZmZzZXQgICAgPSBBVl9STDE2KCZzLT5idWZbMF0pOworICAgIHNpemVfb2Zmc2V0ICAgICAgID0gQVZfUkwxNigmcy0+YnVmWzJdKTsKKyAgICB2ZWN0b3Jfb2Zmc2V0ICAgICA9IEFWX1JMMTYoJnMtPmJ1Zls0XSk7CisgICAgaW1hZ2VkYXRhX29mZnNldCAgPSBBVl9STDE2KCZzLT5idWZbNl0pOworCisgICAgaWYgKGh1ZmZtYW5fb2Zmc2V0ICAgPj0gcy0+c2l6ZSB8fAorICAgICAgICBzaXplX29mZnNldCAgICAgID49IHMtPnNpemUgfHwKKyAgICAgICAgdmVjdG9yX29mZnNldCAgICA+PSBzLT5zaXplIHx8CisgICAgICAgIGltYWdlZGF0YV9vZmZzZXQgPj0gcy0+c2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBodWZmbWFuX3NlZ21lbnQgICA9IHMtPmJ1ZiArIGh1ZmZtYW5fb2Zmc2V0OworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnNpemVfc2VnbWVudCwgICBzLT5idWYgKyBzaXplX29mZnNldCwgICBzLT5zaXplIC0gc2l6ZV9vZmZzZXQpOworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnZlY3Rvcl9zZWdtZW50LCBzLT5idWYgKyB2ZWN0b3Jfb2Zmc2V0LCBzLT5zaXplIC0gdmVjdG9yX29mZnNldCk7CisgICAgaW1hZ2VkYXRhX3NlZ21lbnQgPSBzLT5idWYgKyBpbWFnZWRhdGFfb2Zmc2V0OworCisgICAgaWYgKChyZXQgPSB4YW5faHVmZm1hbl9kZWNvZGUob3Bjb2RlX2J1ZmZlciwgb3Bjb2RlX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5fc2VnbWVudCwgcy0+c2l6ZSAtIGh1ZmZtYW5fb2Zmc2V0KSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBvcGNvZGVfYnVmZmVyX2VuZCA9IG9wY29kZV9idWZmZXIgKyByZXQ7CisKKyAgICBpZiAoaW1hZ2VkYXRhX3NlZ21lbnRbMF0gPT0gMikgeworICAgICAgICB4YW5fdW5wYWNrKHMtPmJ1ZmZlcjIsIHMtPmJ1ZmZlcjJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAmaW1hZ2VkYXRhX3NlZ21lbnRbMV0sIHMtPnNpemUgLSBpbWFnZWRhdGFfb2Zmc2V0IC0gMSk7CisgICAgICAgIGltYWdlZGF0YV9zaXplID0gcy0+YnVmZmVyMl9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGltYWdlZGF0YV9zaXplID0gcy0+c2l6ZSAtIGltYWdlZGF0YV9vZmZzZXQgLSAxOworICAgICAgICBpbWFnZWRhdGFfYnVmZmVyID0gJmltYWdlZGF0YV9zZWdtZW50WzFdOworICAgIH0KKworICAgIC8qIHVzZSB0aGUgZGVjb2RlZCBkYXRhIHNlZ21lbnRzIHRvIGJ1aWxkIHRoZSBmcmFtZSAqLworICAgIHggPSB5ID0gMDsKKyAgICB3aGlsZSAodG90YWxfcGl4ZWxzICYmIG9wY29kZV9idWZmZXIgPCBvcGNvZGVfYnVmZmVyX2VuZCkgeworCisgICAgICAgIG9wY29kZSA9ICpvcGNvZGVfYnVmZmVyKys7CisgICAgICAgIHNpemUgPSAwOworCisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZmxhZyBePSAxOworICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgY2FzZSA0OgorICAgICAgICBjYXNlIDU6CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgY2FzZSA3OgorICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBzaXplID0gb3Bjb2RlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgIHNpemUgKz0gKG9wY29kZSAtIDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgOToKKyAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmc2l6ZV9zZWdtZW50KSA8IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInNpemVfc2VnbWVudCBvdmVycmVhZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnNpemVfc2VnbWVudCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDEwOgorICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzaXplX3NlZ21lbnQpIDwgMikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic2l6ZV9zZWdtZW50IG92ZXJyZWFkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemUgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmc2l6ZV9zZWdtZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTE6CisgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnNpemVfc2VnbWVudCkgPCAzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzaXplX3NlZ21lbnQgb3ZlcnJlYWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTI0KCZzaXplX3NlZ21lbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2l6ZSA+IHRvdGFsX3BpeGVscykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChvcGNvZGUgPCAxMikgeworICAgICAgICAgICAgZmxhZyBePSAxOworICAgICAgICAgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgICAgICAgICAvKiBydW4gb2YgKHNpemUpIHBpeGVscyBpcyB1bmNoYW5nZWQgZnJvbSBsYXN0IGZyYW1lICovCisgICAgICAgICAgICAgICAgeGFuX3djM19jb3B5X3BpeGVsX3J1bihzLCBmcmFtZSwgeCwgeSwgc2l6ZSwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG91dHB1dCBhIHJ1biBvZiBwaXhlbHMgZnJvbSBpbWFnZWRhdGFfYnVmZmVyICovCisgICAgICAgICAgICAgICAgaWYgKGltYWdlZGF0YV9zaXplIDwgc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgeGFuX3djM19vdXRwdXRfcGl4ZWxfcnVuKHMsIGZyYW1lLCBpbWFnZWRhdGFfYnVmZmVyLCB4LCB5LCBzaXplKTsKKyAgICAgICAgICAgICAgICBpbWFnZWRhdGFfYnVmZmVyICs9IHNpemU7CisgICAgICAgICAgICAgICAgaW1hZ2VkYXRhX3NpemUgLT0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdmVjdG9yOworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZ2ZWN0b3Jfc2VnbWVudCkgPD0gMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidmVjdG9yX3NlZ21lbnQgb3ZlcnJlYWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogcnVuLWJhc2VkIG1vdGlvbiBjb21wZW5zYXRpb24gZnJvbSBsYXN0IGZyYW1lICovCisgICAgICAgICAgICB2ZWN0b3IgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmdmVjdG9yX3NlZ21lbnQpOworICAgICAgICAgICAgbW90aW9uX3ggPSBzaWduX2V4dGVuZCh2ZWN0b3IgPj4gNCwgIDQpOworICAgICAgICAgICAgbW90aW9uX3kgPSBzaWduX2V4dGVuZCh2ZWN0b3IgJiAweEYsIDQpOworCisgICAgICAgICAgICAvKiBjb3B5IGEgcnVuIG9mIHBpeGVscyBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeGFuX3djM19jb3B5X3BpeGVsX3J1bihzLCBmcmFtZSwgeCwgeSwgc2l6ZSwgbW90aW9uX3gsIG1vdGlvbl95KTsKKworICAgICAgICAgICAgZmxhZyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjb29yZGluYXRlIGFjY291bnRpbmcgKi8KKyAgICAgICAgdG90YWxfcGl4ZWxzIC09IHNpemU7CisgICAgICAgIHkgKz0gKHggKyBzaXplKSAvIHdpZHRoOworICAgICAgICB4ICA9ICh4ICsgc2l6ZSkgJSB3aWR0aDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBSVU5USU1FX0dBTU1BCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIG11bCh1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKQoreworICAgIHJldHVybiAoYSAqIGIpID4+IDE2OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHBvdzQodW5zaWduZWQgYSkKK3sKKyAgICB1bnNpZ25lZCBzcXVhcmUgPSBtdWwoYSwgYSk7CisgICAgcmV0dXJuIG11bChzcXVhcmUsIHNxdWFyZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgcG93NSh1bnNpZ25lZCBhKQoreworICAgIHJldHVybiBtdWwocG93NChhKSwgYSk7Cit9CisKK3N0YXRpYyB1aW50OF90IGdhbW1hX2NvcnIodWludDhfdCBpbikgeworICAgIHVuc2lnbmVkIGxvLCBoaSA9IDB4ZmY0MCwgdGFyZ2V0OworICAgIGludCBpID0gMTU7CisgICAgaW4gPSAoaW4gPDwgMikgfCAoaW4gPj4gNik7CisgICAgLyogIGVxdWl2YWxlbnQgZmxvYXQgY29kZToKKyAgICBpZiAoaW4gPj0gMjUyKQorICAgICAgICByZXR1cm4gMjUzOworICAgIHJldHVybiByb3VuZChwb3coaW4gLyAyNTYuMCwgMC44KSAqIDI1Nik7CisgICAgKi8KKyAgICBsbyA9IHRhcmdldCA9IGluIDw8IDg7CisgICAgZG8geworICAgICAgICB1bnNpZ25lZCBtaWQgPSAobG8gKyBoaSkgPj4gMTsKKyAgICAgICAgdW5zaWduZWQgcG93ID0gcG93NShtaWQpOworICAgICAgICBpZiAocG93ID4gdGFyZ2V0KSBoaSA9IG1pZDsKKyAgICAgICAgZWxzZSBsbyA9IG1pZDsKKyAgICB9IHdoaWxlICgtLWkpOworICAgIHJldHVybiAocG93NCgobG8gKyBoaSkgPj4gMSkgKyAweDgwKSA+PiA4OworfQorI2Vsc2UKKy8qKgorICogVGhpcyBpcyBhIGdhbW1hIGNvcnJlY3Rpb24gdGhhdCB4YW4zIGFwcGxpZXMgdG8gYWxsIHBhbGV0dGUgZW50cmllcy4KKyAqCisgKiBUaGVyZSBpcyBhIHBlY3VsaWFyaXR5LCBuYW1lbHkgdGhhdCB0aGUgdmFsdWVzIGFyZSBjbGFtcGVkIHRvIDI1MyAtCisgKiBpdCBzZWVtcyBsaWtlbHkgdGhhdCB0aGlzIHRhYmxlIHdhcyBjYWxjdWxhdGVkIGJ5IGEgYnVnZ3kgZml4ZWQtcG9pbnQKKyAqIGltcGxlbWVudGF0aW9uLCB0aGUgb25lIGFib3ZlIHVuZGVyIFJVTlRJTUVfR0FNTUEgYmVoYXZlcyBsaWtlIHRoaXMgZm9yCisgKiBleGFtcGxlLgorICogVGhlIGV4cG9uZW50IHZhbHVlIG9mIDAuOCBjYW4gYmUgZXhwbGFpbmVkIGJ5IHRoaXMgYXMgd2VsbCwgc2luY2UgMC44ID0gNC81CisgKiBhbmQgdGh1cyBwb3coeCwgMC44KSBpcyBzdGlsbCBlYXN5IHRvIGNhbGN1bGF0ZS4KKyAqIEFsc28sIHRoZSBpbnB1dCB2YWx1ZXMgYXJlIGZpcnN0IHJvdGF0ZWQgdG8gdGhlIGxlZnQgYnkgMi4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ2FtbWFfbG9va3VwWzI1Nl0gPSB7CisgICAgMHgwMCwgMHgwOSwgMHgxMCwgMHgxNiwgMHgxQywgMHgyMSwgMHgyNywgMHgyQywKKyAgICAweDMxLCAweDM1LCAweDNBLCAweDNGLCAweDQzLCAweDQ4LCAweDRDLCAweDUwLAorICAgIDB4NTQsIDB4NTksIDB4NUQsIDB4NjEsIDB4NjUsIDB4NjksIDB4NkQsIDB4NzEsCisgICAgMHg3NSwgMHg3OSwgMHg3RCwgMHg4MCwgMHg4NCwgMHg4OCwgMHg4QywgMHg4RiwKKyAgICAweDkzLCAweDk3LCAweDlBLCAweDlFLCAweEEyLCAweEE1LCAweEE5LCAweEFDLAorICAgIDB4QjAsIDB4QjMsIDB4QjcsIDB4QkEsIDB4QkUsIDB4QzEsIDB4QzUsIDB4QzgsCisgICAgMHhDQiwgMHhDRiwgMHhEMiwgMHhENSwgMHhEOSwgMHhEQywgMHhERiwgMHhFMywKKyAgICAweEU2LCAweEU5LCAweEVELCAweEYwLCAweEYzLCAweEY2LCAweEZBLCAweEZELAorICAgIDB4MDMsIDB4MEIsIDB4MTIsIDB4MTgsIDB4MUQsIDB4MjMsIDB4MjgsIDB4MkQsCisgICAgMHgzMiwgMHgzNiwgMHgzQiwgMHg0MCwgMHg0NCwgMHg0OSwgMHg0RCwgMHg1MSwKKyAgICAweDU2LCAweDVBLCAweDVFLCAweDYyLCAweDY2LCAweDZBLCAweDZFLCAweDcyLAorICAgIDB4NzYsIDB4N0EsIDB4N0QsIDB4ODEsIDB4ODUsIDB4ODksIDB4OEQsIDB4OTAsCisgICAgMHg5NCwgMHg5OCwgMHg5QiwgMHg5RiwgMHhBMiwgMHhBNiwgMHhBQSwgMHhBRCwKKyAgICAweEIxLCAweEI0LCAweEI4LCAweEJCLCAweEJGLCAweEMyLCAweEM1LCAweEM5LAorICAgIDB4Q0MsIDB4RDAsIDB4RDMsIDB4RDYsIDB4REEsIDB4REQsIDB4RTAsIDB4RTQsCisgICAgMHhFNywgMHhFQSwgMHhFRCwgMHhGMSwgMHhGNCwgMHhGNywgMHhGQSwgMHhGRCwKKyAgICAweDA1LCAweDBELCAweDEzLCAweDE5LCAweDFGLCAweDI0LCAweDI5LCAweDJFLAorICAgIDB4MzMsIDB4MzgsIDB4M0MsIDB4NDEsIDB4NDUsIDB4NEEsIDB4NEUsIDB4NTIsCisgICAgMHg1NywgMHg1QiwgMHg1RiwgMHg2MywgMHg2NywgMHg2QiwgMHg2RiwgMHg3MywKKyAgICAweDc3LCAweDdCLCAweDdFLCAweDgyLCAweDg2LCAweDhBLCAweDhELCAweDkxLAorICAgIDB4OTUsIDB4OTksIDB4OUMsIDB4QTAsIDB4QTMsIDB4QTcsIDB4QUEsIDB4QUUsCisgICAgMHhCMiwgMHhCNSwgMHhCOSwgMHhCQywgMHhCRiwgMHhDMywgMHhDNiwgMHhDQSwKKyAgICAweENELCAweEQwLCAweEQ0LCAweEQ3LCAweERBLCAweERFLCAweEUxLCAweEU0LAorICAgIDB4RTgsIDB4RUIsIDB4RUUsIDB4RjEsIDB4RjUsIDB4RjgsIDB4RkIsIDB4RkQsCisgICAgMHgwNywgMHgwRSwgMHgxNSwgMHgxQSwgMHgyMCwgMHgyNSwgMHgyQSwgMHgyRiwKKyAgICAweDM0LCAweDM5LCAweDNELCAweDQyLCAweDQ2LCAweDRCLCAweDRGLCAweDUzLAorICAgIDB4NTgsIDB4NUMsIDB4NjAsIDB4NjQsIDB4NjgsIDB4NkMsIDB4NzAsIDB4NzQsCisgICAgMHg3OCwgMHg3QywgMHg3RiwgMHg4MywgMHg4NywgMHg4QiwgMHg4RSwgMHg5MiwKKyAgICAweDk2LCAweDk5LCAweDlELCAweEExLCAweEE0LCAweEE4LCAweEFCLCAweEFGLAorICAgIDB4QjIsIDB4QjYsIDB4QjksIDB4QkQsIDB4QzAsIDB4QzQsIDB4QzcsIDB4Q0IsCisgICAgMHhDRSwgMHhEMSwgMHhENSwgMHhEOCwgMHhEQiwgMHhERiwgMHhFMiwgMHhFNSwKKyAgICAweEU5LCAweEVDLCAweEVGLCAweEYyLCAweEY2LCAweEY5LCAweEZDLCAweEZECit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgeGFuX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgcmV0LCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIFhhbkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJ5dGVDb250ZXh0IGN0eDsKKyAgICBpbnQgdGFnID0gMDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmN0eCwgYnVmLCBidWZfc2l6ZSk7CisgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgpID4gOCAmJiB0YWcgIT0gVkdBX19UQUcpIHsKKyAgICAgICAgdW5zaWduZWQgKnRtcHB0cjsKKyAgICAgICAgdWludDMyX3QgbmV3X3BhbDsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGludCBpOworICAgICAgICB0YWcgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmN0eCk7CisgICAgICAgIHNpemUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmY3R4KTsKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdGFnIHNpemUgJWRcbiIsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSA9IEZGTUlOKHNpemUsIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgpKTsKKyAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgY2FzZSBQQUxUX1RBRzoKKyAgICAgICAgICAgIGlmIChzaXplIDwgUEFMRVRURV9TSVpFKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaWYgKHMtPnBhbGV0dGVzX2NvdW50ID49IFBBTEVUVEVTX01BWCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHRtcHB0ciA9IGF2X3JlYWxsb2Mocy0+cGFsZXR0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5wYWxldHRlc19jb3VudCArIDEpICogQVZQQUxFVFRFX1NJWkUpOworICAgICAgICAgICAgaWYgKCF0bXBwdHIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIHMtPnBhbGV0dGVzID0gdG1wcHRyOworICAgICAgICAgICAgdG1wcHRyICs9IHMtPnBhbGV0dGVzX2NvdW50ICogQVZQQUxFVFRFX0NPVU5UOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFBBTEVUVEVfQ09VTlQ7IGkrKykgeworI2lmIFJVTlRJTUVfR0FNTUEKKyAgICAgICAgICAgICAgICBpbnQgciA9IGdhbW1hX2NvcnIoYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgpKTsKKyAgICAgICAgICAgICAgICBpbnQgZyA9IGdhbW1hX2NvcnIoYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgpKTsKKyAgICAgICAgICAgICAgICBpbnQgYiA9IGdhbW1hX2NvcnIoYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgpKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgaW50IHIgPSBnYW1tYV9sb29rdXBbYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZjdHgpXTsKKyAgICAgICAgICAgICAgICBpbnQgZyA9IGdhbW1hX2xvb2t1cFtieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmN0eCldOworICAgICAgICAgICAgICAgIGludCBiID0gZ2FtbWFfbG9va3VwW2J5dGVzdHJlYW0yX2dldF9ieXRldSgmY3R4KV07CisjZW5kaWYKKyAgICAgICAgICAgICAgICAqdG1wcHRyKysgPSAoMHhGRlUgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+cGFsZXR0ZXNfY291bnQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNIT1RfVEFHOgorICAgICAgICAgICAgaWYgKHNpemUgPCA0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgbmV3X3BhbCA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZjdHgpOworICAgICAgICAgICAgaWYgKG5ld19wYWwgPCBzLT5wYWxldHRlc19jb3VudCkgeworICAgICAgICAgICAgICAgIHMtPmN1cl9wYWxldHRlID0gbmV3X3BhbDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYWxldHRlIHNlbGVjdGVkXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZHQV9fVEFHOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZjdHgsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgYnVmX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4KTsKKworICAgIGlmIChzLT5wYWxldHRlc19jb3VudCA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gcGFsZXR0ZSBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIXMtPmZyYW1lX3NpemUpCisgICAgICAgIHMtPmZyYW1lX3NpemUgPSBmcmFtZS0+bGluZXNpemVbMF0gKiBzLT5hdmN0eC0+aGVpZ2h0OworCisgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzFdLAorICAgICAgICAgICBzLT5wYWxldHRlcyArIHMtPmN1cl9wYWxldHRlICogQVZQQUxFVFRFX0NPVU5ULCBBVlBBTEVUVEVfU0laRSk7CisKKyAgICBzLT5idWYgPSBjdHguYnVmZmVyOworICAgIHMtPnNpemUgPSBidWZfc2l6ZTsKKworICAgIGlmICh4YW5fd2MzX2RlY29kZV9mcmFtZShzLCBmcmFtZSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2X2ZyYW1lX3VucmVmKHMtPmxhc3RfZnJhbWUpOworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKHMtPmxhc3RfZnJhbWUsIGZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICAvKiBhbHdheXMgcmVwb3J0IHRoYXQgdGhlIGJ1ZmZlciB3YXMgY29tcGxldGVseSBjb25zdW1lZCAqLworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworQVZDb2RlYyBmZl94YW5fd2MzX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInhhbl93YzMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5nIENvbW1hbmRlciBJSUkgLyBYYW4iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfWEFOX1dDMywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoWGFuQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0geGFuX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IHhhbl9kZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IHhhbl9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94Ym1kZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3hibWRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0M2UzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94Ym1kZWMuYwpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIFhCTSBpbWFnZSBmb3JtYXQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKworc3RhdGljIGludCBjb252ZXJ0KHVpbnQ4X3QgeCkKK3sKKyAgICBpZiAoeCA+PSAnYScpCisgICAgICAgIHggLT0gODc7CisgICAgZWxzZSBpZiAoeCA+PSAnQScpCisgICAgICAgIHggLT0gNTU7CisgICAgZWxzZQorICAgICAgICB4IC09ICcwJzsKKyAgICByZXR1cm4geDsKK30KKworc3RhdGljIGludCBwYXJzZV9zdHJfaW50KGNvbnN0IHVpbnQ4X3QgKnAsIGludCBsZW4sIGNvbnN0IHVpbnQ4X3QgKmtleSkKK3sKKyAgICBjb25zdCB1aW50OF90ICplbmQgPSBwICsgbGVuOworCisgICAgZm9yKDsgcDxlbmQgLSBzdHJsZW4oa2V5KTsgcCsrKSB7CisgICAgICAgIGlmICghbWVtY21wKHAsIGtleSwgc3RybGVuKGtleSkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHAgKz0gc3RybGVuKGtleSk7CisgICAgaWYgKHAgPj0gZW5kKQorICAgICAgICByZXR1cm4gSU5UX01JTjsKKworICAgIGZvcig7IHA8ZW5kOyBwKyspIHsKKyAgICAgICAgY2hhciAqZXB0cjsKKyAgICAgICAgaW50NjRfdCByZXQgPSBzdHJ0b2wocCwgJmVwdHIsIDEwKTsKKyAgICAgICAgaWYgKChjb25zdCB1aW50OF90ICopZXB0ciAhPSBwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIElOVF9NSU47Cit9CisKK3N0YXRpYyBpbnQgeGJtX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpwID0gZGF0YTsKKyAgICBpbnQgcmV0LCBsaW5lc2l6ZSwgaSwgajsKKyAgICBpbnQgd2lkdGggID0gMDsKKyAgICBpbnQgaGVpZ2h0ID0gMDsKKyAgICBjb25zdCB1aW50OF90ICplbmQsICpwdHIgPSBhdnBrdC0+ZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpuZXh0OworICAgIHVpbnQ4X3QgKmRzdDsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9NT05PV0hJVEU7CisgICAgZW5kID0gYXZwa3QtPmRhdGEgKyBhdnBrdC0+c2l6ZTsKKworICAgIHdpZHRoICA9IHBhcnNlX3N0cl9pbnQoYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplLCAiX3dpZHRoIik7CisgICAgaGVpZ2h0ID0gcGFyc2Vfc3RyX2ludChhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUsICJfaGVpZ2h0Iik7CisKKyAgICBpZiAoKHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCB3aWR0aCwgaGVpZ2h0KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLy8gZ290byBzdGFydCBvZiBpbWFnZSBkYXRhCisgICAgbmV4dCA9IG1lbWNocihwdHIsICd7JywgYXZwa3QtPnNpemUpOworICAgIGlmICghbmV4dCkKKyAgICAgICAgbmV4dCA9IG1lbWNocihwdHIsICcoJywgYXZwa3QtPnNpemUpOworICAgIGlmICghbmV4dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgcHRyID0gbmV4dCArIDE7CisKKyAgICBsaW5lc2l6ZSA9IChhdmN0eC0+d2lkdGggKyA3KSAvIDg7CisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICBkc3QgPSBwLT5kYXRhWzBdICsgaSAqIHAtPmxpbmVzaXplWzBdOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGluZXNpemU7IGorKykgeworICAgICAgICAgICAgdWludDhfdCB2YWw7CisKKyAgICAgICAgICAgIHdoaWxlIChwdHIgPCBlbmQgJiYgKnB0ciAhPSAneCcgJiYgKnB0ciAhPSAnJCcpCisgICAgICAgICAgICAgICAgcHRyKys7CisKKyAgICAgICAgICAgIHB0ciArKzsKKyAgICAgICAgICAgIGlmIChwdHIgPCBlbmQgJiYgYXZfaXN4ZGlnaXQoKnB0cikpIHsKKyAgICAgICAgICAgICAgICB2YWwgPSBjb252ZXJ0KCpwdHIrKyk7CisgICAgICAgICAgICAgICAgaWYgKGF2X2lzeGRpZ2l0KCpwdHIpKQorICAgICAgICAgICAgICAgICAgICB2YWwgPSAodmFsIDw8IDQpICsgY29udmVydCgqcHRyKyspOworICAgICAgICAgICAgICAgICpkc3QrKyA9IGZmX3JldmVyc2VbdmFsXTsKKyAgICAgICAgICAgICAgICBpZiAoYXZfaXN4ZGlnaXQoKnB0cikgJiYgaisxIDwgbGluZXNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgICAgICB2YWwgPSBjb252ZXJ0KCpwdHIrKyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdl9pc3hkaWdpdCgqcHRyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKyBjb252ZXJ0KCpwdHIrKyk7CisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IGZmX3JldmVyc2VbdmFsXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBkYXRhIGF0ICUuOHMuXG4iLCBwdHIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcC0+a2V5X2ZyYW1lID0gMTsKKyAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgICpnb3RfZnJhbWUgICAgICAgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX3hibV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAieGJtIiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlhCTSAoWCBCaXRNYXApIGltYWdlIiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfWEJNLAorICAgIC5kZWNvZGUgICAgICAgPSB4Ym1fZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3hibWVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveGJtZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1MmJkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3hibWVuYy5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBYQk0gaW1hZ2UgZm9ybWF0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCitzdGF0aWMgaW50IHhibV9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnAsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBpbnQgaSwgaiwgcmV0LCBzaXplLCBsaW5lc2l6ZTsKKyAgICB1aW50OF90ICpwdHIsICpidWY7CisKKyAgICBsaW5lc2l6ZSA9IChhdmN0eC0+d2lkdGggKyA3KSAvIDg7CisgICAgc2l6ZSAgICAgPSBhdmN0eC0+aGVpZ2h0ICogKGxpbmVzaXplICogNyArIDIpICsgMTEwOworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBzaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYnVmID0gcGt0LT5kYXRhOworICAgIHB0ciA9IHAtPmRhdGFbMF07CisKKyAgICBidWYgKz0gc25wcmludGYoYnVmLCAzMiwgIiNkZWZpbmUgaW1hZ2Vfd2lkdGggJXVcbiIsIGF2Y3R4LT53aWR0aCk7CisgICAgYnVmICs9IHNucHJpbnRmKGJ1ZiwgMzMsICIjZGVmaW5lIGltYWdlX2hlaWdodCAldVxuIiwgYXZjdHgtPmhlaWdodCk7CisgICAgYnVmICs9IHNucHJpbnRmKGJ1ZiwgNDAsICJzdGF0aWMgdW5zaWduZWQgY2hhciBpbWFnZV9iaXRzW10gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsaW5lc2l6ZTsgaisrKQorICAgICAgICAgICAgYnVmICs9IHNucHJpbnRmKGJ1ZiwgNywgIiAweCUwMlgsIiwgZmZfcmV2ZXJzZVsqcHRyKytdKTsKKyAgICAgICAgcHRyICs9IHAtPmxpbmVzaXplWzBdIC0gbGluZXNpemU7CisgICAgICAgIGJ1ZiArPSBzbnByaW50ZihidWYsIDIsICJcbiIpOworICAgIH0KKyAgICBidWYgKz0gc25wcmludGYoYnVmLCA1LCAiIH07XG4iKTsKKworICAgIHBrdC0+c2l6ZSAgID0gYnVmIC0gcGt0LT5kYXRhOworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl94Ym1fZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gInhibSIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJYQk0gKFggQml0TWFwKSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX1hCTSwKKyAgICAuZW5jb2RlMiAgICAgID0geGJtX2VuY29kZV9mcmFtZSwKKyAgICAucGl4X2ZtdHMgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfTU9OT1dISVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveGZhY2UuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3hmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViZjJmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3hmYWNlLmMKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAgSmFtZXMgQXNodG9uIC0gU3lkbmV5IFVuaXZlcnNpdHkKKyAqIENvcHlyaWdodCAoYykgMjAxMiBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFgtRmFjZSBjb21tb24gZGF0YSBhbmQgdXRpbGl0aWVzIGRlZmluaXRpb24uCisgKi8KKworI2luY2x1ZGUgInhmYWNlLmgiCisKK3ZvaWQgZmZfYmlnX2FkZChCaWdJbnQgKmIsIHVpbnQ4X3QgYSkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90ICp3OworICAgIHVpbnQxNl90IGM7CisKKyAgICBhICY9IFhGQUNFX1dPUkRNQVNLOworICAgIGlmIChhID09IDApCisgICAgICAgIHJldHVybjsKKyAgICB3ID0gYi0+d29yZHM7CisgICAgYyA9IGE7CisgICAgZm9yIChpID0gMDsgaSA8IGItPm5iX3dvcmRzICYmIGM7IGkrKykgeworICAgICAgICBjICs9ICp3OworICAgICAgICAqdysrID0gYyAmIFhGQUNFX1dPUkRNQVNLOworICAgICAgICBjID4+PSBYRkFDRV9CSVRTUEVSV09SRDsKKyAgICB9CisgICAgaWYgKGkgPT0gYi0+bmJfd29yZHMgJiYgYykgeworICAgICAgICBiLT5uYl93b3JkcysrOworICAgICAgICAqdyA9IGMgJiBYRkFDRV9XT1JETUFTSzsKKyAgICB9Cit9CisKK3ZvaWQgZmZfYmlnX2RpdihCaWdJbnQgKmIsIHVpbnQ4X3QgYSwgdWludDhfdCAqcikKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90ICp3OworICAgIHVpbnQxNl90IGMsIGQ7CisKKyAgICBhICY9IFhGQUNFX1dPUkRNQVNLOworICAgIGlmIChhID09IDEgfHwgYi0+bmJfd29yZHMgPT0gMCkgeworICAgICAgICAqciA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiB0cmVhdCB0aGlzIGFzIGEgPT0gV09SRENBUlJZIGFuZCBqdXN0IHNoaWZ0IGV2ZXJ5dGhpbmcgcmlnaHQgYSBXT1JEICovCisgICAgaWYgKGEgPT0gMCkgeworICAgICAgICBpID0gLS1iLT5uYl93b3JkczsKKyAgICAgICAgdyA9IGItPndvcmRzOworICAgICAgICAqciA9ICp3OworICAgICAgICB3aGlsZSAoaS0tKSB7CisgICAgICAgICAgICAqdyA9ICoodyArIDEpOworICAgICAgICAgICAgdysrOworICAgICAgICB9CisgICAgICAgICp3ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpID0gYi0+bmJfd29yZHM7CisgICAgdyA9IGItPndvcmRzICsgaTsKKyAgICBjID0gMDsKKyAgICB3aGlsZSAoaS0tKSB7CisgICAgICAgIGMgPDw9IFhGQUNFX0JJVFNQRVJXT1JEOworICAgICAgICBjICs9ICotLXc7CisgICAgICAgIGQgPSBjIC8gKHVpbnQxNl90KWE7CisgICAgICAgIGMgPSBjICUgKHVpbnQxNl90KWE7CisgICAgICAgICp3ID0gZCAmIFhGQUNFX1dPUkRNQVNLOworICAgIH0KKyAgICAqciA9IGM7CisgICAgaWYgKGItPndvcmRzW2ItPm5iX3dvcmRzIC0gMV0gPT0gMCkKKyAgICAgICAgYi0+bmJfd29yZHMtLTsKK30KKwordm9pZCBmZl9iaWdfbXVsKEJpZ0ludCAqYiwgdWludDhfdCBhKQoreworICAgIGludCBpOworICAgIHVpbnQ4X3QgKnc7CisgICAgdWludDE2X3QgYzsKKworICAgIGEgJj0gWEZBQ0VfV09SRE1BU0s7CisgICAgaWYgKGEgPT0gMSB8fCBiLT5uYl93b3JkcyA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGEgPT0gMCkgeworICAgICAgICAvKiB0cmVhdCB0aGlzIGFzIGEgPT0gV09SRENBUlJZIGFuZCBqdXN0IHNoaWZ0IGV2ZXJ5dGhpbmcgbGVmdCBhIFdPUkQgKi8KKyAgICAgICAgaSA9IGItPm5iX3dvcmRzKys7CisgICAgICAgIHcgPSBiLT53b3JkcyArIGk7CisgICAgICAgIHdoaWxlIChpLS0pIHsKKyAgICAgICAgICAgICp3ID0gKih3IC0gMSk7CisgICAgICAgICAgICB3LS07CisgICAgICAgIH0KKyAgICAgICAgKncgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGkgPSBiLT5uYl93b3JkczsKKyAgICB3ID0gYi0+d29yZHM7CisgICAgYyA9IDA7CisgICAgd2hpbGUgKGktLSkgeworICAgICAgICBjICs9ICh1aW50MTZfdCkqdyAqICh1aW50MTZfdClhOworICAgICAgICAqKHcrKykgPSBjICYgWEZBQ0VfV09SRE1BU0s7CisgICAgICAgIGMgPj49IFhGQUNFX0JJVFNQRVJXT1JEOworICAgIH0KKyAgICBpZiAoYykgeworICAgICAgICBiLT5uYl93b3JkcysrOworICAgICAgICAqdyA9IGMgJiBYRkFDRV9XT1JETUFTSzsKKyAgICB9Cit9CisKK2NvbnN0IFByb2JSYW5nZSBmZl94ZmFjZV9wcm9icmFuZ2VzX3Blcl9sZXZlbFs0XVszXSA9IHsKKyAgICAvLyAgYmxhY2sgICAgICBncmV5ICAgICAgIHdoaXRlCisgICAgeyB7ICAxLCAyNTV9LCB7MjUxLCAwfSwgeyAgNCwgMjUxfSB9LCAvKiBUb3Agb2YgdHJlZSBhbG1vc3QgYWx3YXlzIGdyZXkgKi8KKyAgICB7IHsgIDEsIDI1NX0sIHsyMDAsIDB9LCB7IDU1LCAyMDB9IH0sCisgICAgeyB7IDMzLCAyMjN9LCB7MTU5LCAwfSwgeyA2NCwgMTU5fSB9LAorICAgIHsgezEzMSwgICAwfSwgeyAgMCwgMH0sIHsxMjUsIDEzMX0gfSwgLyogR3JleSBkaXNhbGxvd2VkIGF0IGJvdHRvbSAqLworfTsKKworY29uc3QgUHJvYlJhbmdlIGZmX3hmYWNlX3Byb2JyYW5nZXNfMngyWzE2XSA9IHsKKyAgICB7IDAsICAgMH0sICB7MzgsICAgMH0sIHszOCwgIDM4fSwgIHsxMywgMTUyfSwKKyAgICB7MzgsICA3Nn0sICB7MTMsIDE2NX0sIHsxMywgMTc4fSwgIHsgNiwgMjMwfSwKKyAgICB7MzgsIDExNH0sICB7MTMsIDE5MX0sIHsxMywgMjA0fSwgIHsgNiwgMjM2fSwKKyAgICB7MTMsIDIxN30sICB7IDYsIDI0Mn0sIHsgNSwgMjQ4fSwgIHsgMywgMjUzfSwKK307CisKKy8qCisgKiBUaGUgImd1ZXNzIHRoZSBuZXh0IHBpeGVsIiB0YWJsZXMgZm9sbG93LiBOb3JtYWxseSB0aGVyZSBhcmUgMTIKKyAqIG5laWdoYm91ciBwaXhlbHMgdXNlZCB0byBnaXZlIDE8PDEyIGNhc2VzIGFzIHdlIGdldCBjbG9zZXIgdG8gdGhlCisgKiB1cHBlciBsZWZ0IGNvcm5lciBsZXNzZXIgbnVtYmVycyBvZiBuZWlnaGJvdXJzIGFyZSBhdmFpbGFibGUuCisgKgorICogRWFjaCBieXRlIGluIHRoZSB0YWJsZXMgcmVwcmVzZW50cyA4IGJvb2xlYW4gdmFsdWVzIHN0YXJ0aW5nIGZyb20KKyAqIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4KKyAqLworCitzdGF0aWMgY29uc3QgdWludDhfdCBnXzAwW10gPSB7CisgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHhlMywgMHhkZiwgMHgwNSwgMHgxNywKKyAgICAweDA1LCAweDBmLCAweDAwLCAweDFiLCAweDBmLCAweGRmLCAweDAwLCAweDA0LCAweDAwLCAweDAwLAorICAgIDB4MGQsIDB4MGYsIDB4MDMsIDB4N2YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MWQsCisgICAgMHg0NSwgMHgyZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwMCwgMHgwYSwgMHhmZiwgMHhmZiwKKyAgICAweDAwLCAweDA0LCAweDAwLCAweDA1LCAweDAxLCAweDNmLCAweGNmLCAweGZmLCAweDEwLCAweDAxLAorICAgIDB4ODAsIDB4YzksIDB4MGYsIDB4MGYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgxYiwgMHgxZiwgMHhmZiwgMHhmZiwgMHg0ZiwgMHg1NCwgMHgwNywgMHgxZiwgMHg1NywgMHg0NywKKyAgICAweGQ3LCAweDNkLCAweGZmLCAweGZmLCAweDVmLCAweDFmLCAweDdmLCAweGZmLCAweDdmLCAweDdmLAorICAgIDB4MDUsIDB4MGYsIDB4MDEsIDB4MGYsIDB4MGYsIDB4NWYsIDB4OWIsIDB4ZGYsIDB4N2YsIDB4ZmYsCisgICAgMHg1ZiwgMHgxZCwgMHg1ZiwgMHhmZiwgMHgwZiwgMHgxZiwgMHgwZiwgMHg1ZiwgMHgwMywgMHgxZiwKKyAgICAweDRmLCAweDVmLCAweGY3LCAweDdmLCAweDdmLCAweGZmLCAweDBkLCAweDBmLCAweGZiLCAweGZmLAorICAgIDB4ZjcsIDB4YmYsIDB4MGYsIDB4NGYsIDB4ZDcsIDB4M2YsIDB4NGYsIDB4N2YsIDB4ZmYsIDB4ZmYsCisgICAgMHg2NywgMHhiZiwgMHg1NiwgMHgyNSwgMHgxZiwgMHg3ZiwgMHg5ZiwgMHhmZiwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDA1LCAweDVmLCAweDdmLCAweDAxLCAweGRmLCAweDE0LCAweDAwLCAweDA1LCAweDBmLAorICAgIDB4MDcsIDB4YTIsIDB4MDksIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4NWYsCisgICAgMHgxOCwgMHhkNywgMHg5NCwgMHg3MSwgMHgwMCwgMHgwNSwgMHgxZiwgMHhiNywgMHgwYywgMHgwNywKKyAgICAweDBmLCAweDBmLCAweDAwLCAweDBmLCAweDBmLCAweDFmLCAweDg0LCAweDhmLCAweDA1LCAweDE1LAorICAgIDB4MDUsIDB4MGYsIDB4NGYsIDB4ZmYsIDB4ODcsIDB4ZGYsIDB4MDUsIDB4MDEsIDB4MTAsIDB4MDAsCisgICAgMHgwZiwgMHgwZiwgMHgwMCwgMHgwOCwgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMSwgMHg0ZiwgMHhmZiwKKyAgICAweDlmLCAweDhmLCAweDRhLCAweDQwLCAweDVmLCAweDVmLCAweGZmLCAweGZlLCAweGRmLCAweGZmLAorICAgIDB4N2YsIDB4ZjcsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4ZmYsIDB4N2IsIDB4ZmYsIDB4MGYsIDB4ZmQsCisgICAgMHhkNywgMHg1ZiwgMHg0ZiwgMHg3ZiwgMHg3ZiwgMHhkZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweDc3LCAweGRmLCAweDdmLCAweDRmLCAweGVmLCAweGZmLCAweGZmLCAweDc3LCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4NmYsIDB4ZmYsIDB4MGYsIDB4NGYsIDB4ZmYsIDB4ZmYsIDB4OWQsIDB4ZmYsCisgICAgMHgwZiwgMHhlZiwgMHhmZiwgMHhkZiwgMHg2ZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg0ZiwgMHhmZiwKKyAgICAweGNkLCAweDBmLCAweDRmLCAweGZmLCAweGZmLCAweGRmLCAweDAwLCAweDAwLCAweDAwLCAweDBiLAorICAgIDB4MDUsIDB4MDIsIDB4MDIsIDB4MGYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDEsIDB4MDYsCisgICAgMHgwMCwgMHgwZiwgMHgyMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwNSwgMHgwZiwgMHg0MCwgMHgwOCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDBjLCAweDBmLCAweDAxLCAweDAwLAorICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDEsIDB4MDUsCisgICAgMHgwMSwgMHgxNSwgMHhhZiwgMHgwZiwgMHgwMCwgMHgwMSwgMHgxMCwgMHgwMCwgMHgwOCwgMHgwMCwKKyAgICAweDQ2LCAweDBjLCAweDIwLCAweDAwLCAweDg4LCAweDAwLCAweDBmLCAweDE1LCAweGZmLCAweGRmLAorICAgIDB4MDIsIDB4MDAsIDB4MDAsIDB4MGYsIDB4N2YsIDB4NWYsIDB4ZGIsIDB4ZmYsIDB4NGYsIDB4M2UsCisgICAgMHgwNSwgMHgwZiwgMHg3ZiwgMHhmNywgMHg5NSwgMHg0ZiwgMHgwZCwgMHgwZiwgMHgwMSwgMHgwZiwKKyAgICAweDRmLCAweDVmLCAweDlmLCAweGRmLCAweDI1LCAweDBlLCAweDBkLCAweDBkLCAweDRmLCAweDdmLAorICAgIDB4OGYsIDB4MGYsIDB4MGYsIDB4ZmEsIDB4MDQsIDB4NGYsIDB4NGYsIDB4ZmYsIDB4ZjcsIDB4NzcsCisgICAgMHg0NywgMHhlZCwgMHgwNSwgMHgwZiwgMHhmZiwgMHhmZiwgMHhkZiwgMHhmZiwgMHg0ZiwgMHg2ZiwKKyAgICAweGQ4LCAweDVmLCAweDBmLCAweDdmLCAweGRmLCAweDVmLCAweDA3LCAweDBmLCAweDk0LCAweDBkLAorICAgIDB4MWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDMsIDB4NDYsIDB4NTcsCisgICAgMHgwMSwgMHgwZCwgMHgwMSwgMHgwOCwgMHgwMSwgMHgwZiwgMHg0NywgMHg2YywgMHgwZCwgMHgwZiwKKyAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDBiLCAweDRmLCAweDAwLCAweDA4LCAweDA1LCAweDAwLAorICAgIDB4OTUsIDB4MDEsIDB4MGYsIDB4N2YsIDB4MGMsIDB4MGYsIDB4MDEsIDB4MGUsIDB4MDAsIDB4MDAsCisgICAgMHgwZiwgMHg0MSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgyNCwgMHgwZCwgMHgwZiwgMHgwZiwgMHg3ZiwKKyAgICAweGNmLCAweGRmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQwLCAweDAwLCAweDAwLAorICAgIDB4MDYsIDB4MjYsIDB4Y2YsIDB4MDUsIDB4Y2YsIDB4N2YsIDB4ZGYsIDB4ZGYsIDB4MDAsIDB4MDAsCisgICAgMHgxNywgMHg1ZiwgMHhmZiwgMHhmZCwgMHhmZiwgMHhmZiwgMHg0NiwgMHgwOSwgMHg0ZiwgMHg1ZiwKKyAgICAweDdmLCAweGZkLCAweGRmLCAweGZmLCAweDBhLCAweDg4LCAweGE3LCAweDdmLCAweDdmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4MGYsIDB4MDQsIDB4ZGYsIDB4N2YsIDB4NGYsIDB4ZmYsIDB4OWYsIDB4ZmYsCisgICAgMHgwZSwgMHhlNiwgMHhkZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwZiwgMHhlYywKKyAgICAweDhmLCAweDRmLCAweDdmLCAweGZmLCAweGRmLCAweGZmLCAweDBmLCAweGNmLCAweGRmLCAweGZmLAorICAgIDB4NmYsIDB4N2YsIDB4ZmYsIDB4ZmYsIDB4MDMsIDB4MGMsIDB4OWQsIDB4MGYsIDB4N2YsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGdfMDFbXSA9IHsKKyAgICAweDM3LCAweDczLCAweDAwLCAweDE5LCAweDU3LCAweDdmLCAweGY1LCAweGZiLCAweDcwLCAweDMzLAorICAgIDB4ZjAsIDB4ZjksIDB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBnXzAyW10gPSB7CisgICAgMHg1MCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGdfMTBbXSA9IHsKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDUwLCAweDAwLCAweGYzLCAweDVmLCAweDg0LCAweDA0LAorICAgIDB4MTcsIDB4OWYsIDB4MDQsIDB4MjMsIDB4MDUsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsCisgICAgMHgwMywgMHgwMywgMHgzMywgMHhkNywgMHgwNSwgMHgwMywgMHg1ZiwgMHgzZiwgMHgxNywgMHgzMywKKyAgICAweGZmLCAweGZmLCAweDAwLCAweDgwLCAweDAyLCAweDA0LCAweDEyLCAweDAwLCAweDExLCAweDU3LAorICAgIDB4MDUsIDB4MjUsIDB4MDUsIDB4MDMsIDB4MzUsIDB4YmYsIDB4OWYsIDB4ZmYsIDB4MDcsIDB4NmYsCisgICAgMHgyMCwgMHg0MCwgMHgxNywgMHgwNiwgMHhmYSwgMHhlOCwgMHgwMSwgMHgwNywgMHgxZiwgMHg5ZiwKKyAgICAweDFmLCAweGZmLCAweGZmLCAweGZmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ18yMFtdID0geworICAgIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDEsIDB4NDMsIDB4MmUsIDB4ZmYsIDB4M2YsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBnXzMwW10gPSB7CisgICAgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHg1MSwgMHgxMSwgMHgxMywgMHgxMSwgMHgxMSwgMHgxMSwKKyAgICAweDEzLCAweDExLCAweDExLCAweDExLCAweDMzLCAweDExLCAweDEzLCAweDExLCAweDEzLCAweDEzLAorICAgIDB4MTMsIDB4MTMsIDB4MzEsIDB4MzEsIDB4MTEsIDB4MDEsIDB4MTEsIDB4MTEsIDB4NzEsIDB4MTEsCisgICAgMHgxMSwgMHg3NSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGdfNDBbXSA9IHsKKyAgICAweDAwLCAweDBmLCAweDAwLCAweDA5LCAweDAwLCAweDBkLCAweDAwLCAweDBkLCAweDAwLCAweDBmLAorICAgIDB4MDAsIDB4NGUsIDB4ZTQsIDB4MGQsIDB4MTAsIDB4MGYsIDB4MDAsIDB4MGYsIDB4NDQsIDB4NGYsCisgICAgMHgwMCwgMHgxZSwgMHgwZiwgMHgwZiwgMHhhZSwgMHhhZiwgMHg0NSwgMHg3ZiwgMHhlZiwgMHhmZiwKKyAgICAweDBmLCAweGZmLCAweDAwLCAweDA5LCAweDAxLCAweDExLCAweDAwLCAweDAxLCAweDFjLCAweGRkLAorICAgIDB4MDAsIDB4MTUsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ZmQsIDB4MDAsIDB4MGYsCisgICAgMHg0ZiwgMHg1ZiwgMHgzZCwgMHhmZiwgMHhmZiwgMHhmZiwgMHg0ZiwgMHhmZiwgMHgxYywgMHhmZiwKKyAgICAweGRmLCAweGZmLCAweDhmLCAweGZmLCAweDAwLCAweDBkLCAweDAwLCAweDAwLCAweDAwLCAweDE1LAorICAgIDB4MDEsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MWYsIDB4MDEsIDB4MTEsIDB4MDUsIDB4N2YsCisgICAgMHgwMCwgMHgxZiwgMHg0MSwgMHg1NywgMHgxZiwgMHhmZiwgMHgwNSwgMHg3NywgMHgwZCwgMHg1ZiwKKyAgICAweDRkLCAweGZmLCAweDRmLCAweGZmLCAweDBmLCAweGZmLCAweDAwLCAweDAwLCAweDAyLCAweDA1LAorICAgIDB4MDAsIDB4MTEsIDB4MDUsIDB4N2QsIDB4MTAsIDB4MTUsIDB4MmYsIDB4ZmYsIDB4NDAsIDB4NTAsCisgICAgMHgwZCwgMHhmZCwgMHgwNCwgMHgwZiwgMHgwNywgMHgxZiwgMHgwNywgMHg3ZiwgMHgwZiwgMHhiZiwKKyAgICAweDBkLCAweDdmLCAweDBmLCAweGZmLCAweDRkLCAweDdkLCAweDBmLCAweGZmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ18xMVtdID0geworICAgIDB4MDEsIDB4MTMsIDB4MDMsIDB4N2YsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBnXzIxW10gPSB7CisgICAgMHgxNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGdfMzFbXSA9IHsKKyAgICAweDU1LCAweDU3LCAweDU3LCAweDdmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ180MVtdID0geworICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MWYsIDB4MDMsIDB4MWYsIDB4M2YsIDB4ZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBnXzEyW10gPSB7CisgICAgMHg0MCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGdfMjJbXSA9IHsKKyAgICAweDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ18zMltdID0geworICAgIDB4MTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBnXzQyW10gPSB7CisgICAgMHgxMCwKK307CisKK3ZvaWQgZmZfeGZhY2VfZ2VuZXJhdGVfZmFjZSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKiBjb25zdCBzcmMpCit7CisgICAgaW50IGgsIGksIGosIGssIGwsIG07CisKKyAgICBmb3IgKGogPSAwOyBqIDwgWEZBQ0VfSEVJR0hUOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFhGQUNFX1dJRFRIOyBpKyspIHsKKyAgICAgICAgICAgIGggPSBpICsgaiAqIFhGQUNFX1dJRFRIOworICAgICAgICAgICAgayA9IDA7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICBDb21wdXRlIGssIGVuY29kaW5nIHRoZSBiaXRzICpiZWZvcmUqIHRoZSBjdXJyZW50IG9uZSwgY29udGFpbmVkIGluIHRoZQorICAgICAgICAgICAgICAgaW1hZ2UgYnVmZmVyLiBUaGF0IGlzLCBnaXZlbiB0aGUgZ3JpZDoKKworICAgICAgICAgICAgICAgIGwgICAgICBpCisgICAgICAgICAgICAgICAgfCAgICAgIHwKKyAgICAgICAgICAgICAgICB2ICAgICAgdgorICAgICAgICAgICAgICAgKy0tKy0tKy0tKy0tKy0tKworICAgICAgICAgIG0gLT4gfCAxfCAyfCAzfCA0fCA1fAorICAgICAgICAgICAgICAgKy0tKy0tKy0tKy0tKy0tKworICAgICAgICAgICAgICAgfCA2fCA3fCA4fCA5fDEwfAorICAgICAgICAgICAgICAgKy0tKy0tKy0tKy0tKy0tKworICAgICAgICAgIGogLT4gfDExfDEyfCAqfCAgfCAgfAorICAgICAgICAgICAgICAgKy0tKy0tKy0tKy0tKy0tKworCisgICAgICAgICAgICAgICB0aGUgdmFsdWUgayBmb3IgdGhlIHBpeGVsIG1hcmtlZCBhcyAiKiIgd2lsbCBjb250YWluIHRoZSBiaXQgZW5jb2Rpbmcgb2YKKyAgICAgICAgICAgICAgIHRoZSB2YWx1ZXMgaW4gdGhlIG1hdHJpeCBtYXJrZWQgZnJvbSAiMSIgdG8gIjEyIi4gSW4gY2FzZSB0aGUgcGl4ZWwgaXMKKyAgICAgICAgICAgICAgIG5lYXIgdGhlIGJvcmRlciBvZiB0aGUgZ3JpZCwgdGhlIG51bWJlciBvZiB2YWx1ZXMgY29udGFpbmVkIHdpdGhpbiB0aGUKKyAgICAgICAgICAgICAgIGdyaWQgd2lsbCBiZSBsZXNzZXIgdGhhbiAxMi4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBmb3IgKGwgPSBpIC0gMjsgbCA8PSBpICsgMjsgbCsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChtID0gaiAtIDI7IG0gPD0gajsgbSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsID49IGkgJiYgbSA9PSBqKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChsID4gMCAmJiBsIDw9IFhGQUNFX1dJRFRIICYmIG0gPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgayA9IDIqayArIHNyY1tsICsgbSAqIFhGQUNFX1dJRFRIXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgIFVzZSB0aGUgZ3Vlc3MgZm9yIHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGsuCisKKyAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpbiBrLCBkZXBlbmRpbmcgb24KKyAgICAgICAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBwaXhlbCwgYW5kIHNob3dzIHRoZSBjb3JyZXNwb25kaW5nIGd1ZXNzIHRhYmxlCisgICAgICAgICAgICAgIHRvIHVzZToKKworICAgICAgICAgICAgICAgICBpPTEgIGk9MiAgaT0zICAgICAgIGk9dy0xIGk9dworICAgICAgICAgICAgICAgKy0tLS0rLS0tLSstLS0tKyAuLi4gKy0tLS0rLS0tLSsKKyAgICAgICAgICAgaj0xIHwgIDAgfCAgMSB8ICAyIHwgICAgIHwgIDIgfCAgMiB8CisgICAgICAgICAgICAgICB8ZzIyIHxnMTIgfGcwMiB8ICAgICB8ZzQyIHxnMzIgfAorICAgICAgICAgICAgICAgKy0tLS0rLS0tLSstLS0tKyAuLi4gKy0tLS0rLS0tLSsKKyAgICAgICAgICAgaj0yIHwgIDMgfCAgNSB8ICA3IHwgICAgIHwgIDYgfCAgNSB8CisgICAgICAgICAgICAgICB8ZzIxIHxnMTEgfGcwMSB8ICAgICB8ZzQxIHxnMzEgfAorICAgICAgICAgICAgICAgKy0tLS0rLS0tLSstLS0tKyAuLi4gKy0tLS0rLS0tLSsKKyAgICAgICAgICAgaj0zIHwgIDUgfCAgOSB8IDEyIHwgICAgIHwgMTAgfCAgOCB8CisgICAgICAgICAgICAgICB8ZzIwIHxnMTAgfGcwMCB8ICAgICB8ZzQwIHxnMzAgfAorICAgICAgICAgICAgICAgKy0tLS0rLS0tLSstLS0tKyAuLi4gKy0tLS0rLS0tLSsKKyAgICAgICAgICAgICovCisKKyNkZWZpbmUgR0VOKHRhYmxlKSBkc3RbaF0gXj0gKHRhYmxlW2s+PjNdPj4oNy0oayY3KSkpJjEKKworICAgICAgICAgICAgc3dpdGNoIChpKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgc3dpdGNoIChqKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAgR0VOKGdfMjIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6ICBHRU4oZ18yMSk7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IEdFTihnXzIwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHN3aXRjaCAoaikgeworICAgICAgICAgICAgICAgIGNhc2UgMTogIEdFTihnXzEyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiAgR0VOKGdfMTEpOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBHRU4oZ18xMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgWEZBQ0VfV0lEVEggLSAxOgorICAgICAgICAgICAgICAgIHN3aXRjaCAoaikgeworICAgICAgICAgICAgICAgIGNhc2UgMTogIEdFTihnXzQyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiAgR0VOKGdfNDEpOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBHRU4oZ180MCk7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgWEZBQ0VfV0lEVEg6CisgICAgICAgICAgICAgICAgc3dpdGNoIChqKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAgR0VOKGdfMzIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6ICBHRU4oZ18zMSk7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IEdFTihnXzMwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGopIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6ICBHRU4oZ18wMik7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogIEdFTihnXzAxKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogR0VOKGdfMDApOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ZmFjZS5oIGIvZmZtcGVnL2xpYmF2Y29kZWMveGZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2RmNWQzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveGZhY2UuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwIEphbWVzIEFzaHRvbiAtIFN5ZG5leSBVbml2ZXJzaXR5CisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBYLUZhY2UgY29tbW9uIGRlZmluaXRpb25zLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogZGVmaW5lIHRoZSBmYWNlIHNpemUgLSA0OHg0OHgxICovCisjZGVmaW5lIFhGQUNFX1dJRFRIICA0OAorI2RlZmluZSBYRkFDRV9IRUlHSFQgNDgKKyNkZWZpbmUgWEZBQ0VfUElYRUxTIChYRkFDRV9XSURUSCAqIFhGQUNFX0hFSUdIVCkKKworLyogY29tcHJlc3NlZCBvdXRwdXQgdXNlcyB0aGUgZnVsbCByYW5nZSBvZiBwcmludGFibGUgY2hhcmFjdGVycy4KKyAqIEluIEFTQ0lJIHRoZXNlIGFyZSBpbiBhIGNvbnRpZ3VvdXMgYmxvY2sgc28gd2UganVzdCBuZWVkIHRvIGtub3cKKyAqIHRoZSBmaXJzdCBhbmQgbGFzdC4gVGhlIHRvdGFsIG51bWJlciBvZiBwcmludGFibGVzIGlzIG5lZWRlZCB0b28uICovCisjZGVmaW5lIFhGQUNFX0ZJUlNUX1BSSU5UICchJworI2RlZmluZSBYRkFDRV9MQVNUX1BSSU5UICd+JworI2RlZmluZSBYRkFDRV9QUklOVFMgKFhGQUNFX0xBU1RfUFJJTlQgLSBYRkFDRV9GSVJTVF9QUklOVCArIDEpCisKKy8qCisgKiBJbWFnZSBpcyBlbmNvZGVkIGFzIGEgYmlnIGludGVnZXIsIHVzaW5nIGNoYXJhY3RlcnMgZnJvbSAnficgdG8KKyAqICchJywgZm9yIGEgdG90YWwgb2YgOTQgc3ltYm9scy4gSW4gb3JkZXIgdG8gZXhwcmVzcworICogNDh4NDgqMj04KlhGQUNFX01BWF9XT1JEUz00NjA4CisgKiBiaXRzLCB3ZSBuZWVkIGEgdG90YWwgb2YgNzA0IGRpZ2l0cywgYXMgZ2l2ZW4gYnk6CisgKiBjZWlsKGxnXzk0KDJeNDYwOCkpID0gNzA0CisgKi8KKyNkZWZpbmUgWEZBQ0VfTUFYX0RJR0lUUyA3MDQKKworI2RlZmluZSBYRkFDRV9CSVRTUEVSV09SRCA4CisjZGVmaW5lIFhGQUNFX1dPUkRDQVJSWSAoMSA8PCBYRkFDRV9CSVRTUEVSV09SRCkKKyNkZWZpbmUgWEZBQ0VfV09SRE1BU0sgKFhGQUNFX1dPUkRDQVJSWSAtIDEpCisKKyNkZWZpbmUgWEZBQ0VfTUFYX1dPUkRTICgoWEZBQ0VfUElYRUxTICogMiArIFhGQUNFX0JJVFNQRVJXT1JEIC0gMSkgLyBYRkFDRV9CSVRTUEVSV09SRCkKKworLyogUG9ydGFibGUsIHZlcnkgbGFyZ2UgdW5zaWduZWQgaW50ZWdlciBhcml0aG1ldGljIGlzIG5lZWRlZC4KKyAqIEltcGxlbWVudGF0aW9uIHVzZXMgYXJyYXlzIG9mIFdPUkRzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBuYl93b3JkczsKKyAgICB1aW50OF90IHdvcmRzW1hGQUNFX01BWF9XT1JEU107Cit9IEJpZ0ludDsKKworLyoqCisgKiBBZGQgYSB0byBiIHN0b3JpbmcgdGhlIHJlc3VsdCBpbiBiLgorICovCit2b2lkIGZmX2JpZ19hZGQoQmlnSW50ICpiLCB1aW50OF90IGEpOworCisvKioKKyAqIERpdmlkZSBiIGJ5IGEgc3RvcmluZyB0aGUgcmVzdWx0IGluIGIgYW5kIHRoZSByZW1haW5kZXIgaW4gdGhlIHdvcmQKKyAqIHBvaW50ZWQgdG8gYnkgci4KKyAqLwordm9pZCBmZl9iaWdfZGl2KEJpZ0ludCAqYiwgdWludDhfdCBhLCB1aW50OF90ICpyKTsKKworLyoqCisgKiBNdWx0aXBseSBhIGJ5IGIgc3RvcmluZyB0aGUgcmVzdWx0IGluIGIuCisgKi8KK3ZvaWQgZmZfYmlnX211bChCaWdJbnQgKmIsIHVpbnQ4X3QgYSk7CisKKy8qIEVhY2ggZmFjZSBpcyBlbmNvZGVkIHVzaW5nIDkgb2N0cmVlcyBvZiAxNngxNiBlYWNoLiBFYWNoIGxldmVsIG9mIHRoZQorICogdHJlZXMgaGFzIHZhcnlpbmcgcHJvYmFiaWxpdGllcyBvZiBiZWluZyB3aGl0ZSwgZ3JleSBvciBibGFjay4KKyAqIFRoZSB0YWJsZSBiZWxvdyBpcyBiYXNlZCBvbiBzYW1wbGluZyBtYW55IGZhY2VzICovCitlbnVtIFhGYWNlQ29sb3IgeyBYRkFDRV9DT0xPUl9CTEFDSyA9IDAsIFhGQUNFX0NPTE9SX0dSRVksIFhGQUNFX0NPTE9SX1dISVRFIH07CisKKy8qIERhdGEgb2YgdmFyeWluZyBwcm9iYWJpbGl0aWVzIGFyZSBlbmNvZGVkIGJ5IGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAgLSAyNTUuCisgKiBUaGUgcHJvYmFiaWxpdHkgb2YgdGhlIGRhdGEgZGV0ZXJtaW5lcyB0aGUgcmFuZ2Ugb2YgcG9zc2libGUgZW5jb2RpbmdzLgorICogT2Zmc2V0IGdpdmVzIHRoZSBmaXJzdCBwb3NzaWJsZSBlbmNvZGluZyBvZiB0aGUgcmFuZ2UuICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCByYW5nZTsKKyAgICB1aW50OF90IG9mZnNldDsKK30gUHJvYlJhbmdlOworCitleHRlcm4gY29uc3QgUHJvYlJhbmdlIGZmX3hmYWNlX3Byb2JyYW5nZXNfcGVyX2xldmVsWzRdWzNdOworCitleHRlcm4gY29uc3QgUHJvYlJhbmdlIGZmX3hmYWNlX3Byb2JyYW5nZXNfMngyWzE2XTsKKwordm9pZCBmZl94ZmFjZV9nZW5lcmF0ZV9mYWNlKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqIGNvbnN0IHNyYyk7CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ZmFjZWRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveGZhY2VkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQ1Y2I2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveGZhY2VkZWMuYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MCBKYW1lcyBBc2h0b24gLSBTeWRuZXkgVW5pdmVyc2l0eQorICogQ29weXJpZ2h0IChjKSAyMDEyIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogWC1GYWNlIGRlY29kZXIsIGJhc2VkIG9uIGxpYmNvbXBmYWNlLCBieSBKYW1lcyBBc2h0b24uCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInhmYWNlLmgiCisKK3N0YXRpYyBpbnQgcG9wX2ludGVnZXIoQmlnSW50ICpiLCBjb25zdCBQcm9iUmFuZ2UgKnByYW5nZXMpCit7CisgICAgdWludDhfdCByOworICAgIGludCBpOworCisgICAgLyogZXh0cmFjdCB0aGUgbGFzdCBieXRlIGludG8gciwgYW5kIHNoaWZ0IHJpZ2h0IGIgYnkgOCBiaXRzICovCisgICAgZmZfYmlnX2RpdihiLCAwLCAmcik7CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAociA8IHByYW5nZXMtPm9mZnNldCB8fCByID49IHByYW5nZXMtPnJhbmdlICsgcHJhbmdlcy0+b2Zmc2V0KSB7CisgICAgICAgIHByYW5nZXMrKzsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICBmZl9iaWdfbXVsKGIsIHByYW5nZXMtPnJhbmdlKTsKKyAgICBmZl9iaWdfYWRkKGIsIHIgLSBwcmFuZ2VzLT5vZmZzZXQpOworICAgIHJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBwb3BfZ3JleXMoQmlnSW50ICpiLCBjaGFyICpiaXRtYXAsIGludCB3LCBpbnQgaCkKK3sKKyAgICBpZiAodyA+IDMpIHsKKyAgICAgICAgdyAvPSAyOworICAgICAgICBoIC89IDI7CisgICAgICAgIHBvcF9ncmV5cyhiLCBiaXRtYXAsICAgICAgICAgICAgICAgICAgICAgICB3LCBoKTsKKyAgICAgICAgcG9wX2dyZXlzKGIsIGJpdG1hcCArIHcsICAgICAgICAgICAgICAgICAgIHcsIGgpOworICAgICAgICBwb3BfZ3JleXMoYiwgYml0bWFwICsgWEZBQ0VfV0lEVEggKiBoLCAgICAgdywgaCk7CisgICAgICAgIHBvcF9ncmV5cyhiLCBiaXRtYXAgKyBYRkFDRV9XSURUSCAqIGggKyB3LCB3LCBoKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3ID0gcG9wX2ludGVnZXIoYiwgZmZfeGZhY2VfcHJvYnJhbmdlc18yeDIpOworICAgICAgICBpZiAodyAmIDEpIGJpdG1hcFswXSAgICAgICAgICAgICAgID0gMTsKKyAgICAgICAgaWYgKHcgJiAyKSBiaXRtYXBbMV0gICAgICAgICAgICAgICA9IDE7CisgICAgICAgIGlmICh3ICYgNCkgYml0bWFwW1hGQUNFX1dJRFRIXSAgICAgPSAxOworICAgICAgICBpZiAodyAmIDgpIGJpdG1hcFtYRkFDRV9XSURUSCArIDFdID0gMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9ibG9jayhCaWdJbnQgKmIsIGNoYXIgKmJpdG1hcCwgaW50IHcsIGludCBoLCBpbnQgbGV2ZWwpCit7CisgICAgc3dpdGNoIChwb3BfaW50ZWdlcihiLCAmZmZfeGZhY2VfcHJvYnJhbmdlc19wZXJfbGV2ZWxbbGV2ZWxdWzBdKSkgeworICAgIGNhc2UgWEZBQ0VfQ09MT1JfV0hJVEU6CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFhGQUNFX0NPTE9SX0JMQUNLOgorICAgICAgICBwb3BfZ3JleXMoYiwgYml0bWFwLCB3LCBoKTsKKyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICAgIHcgLz0gMjsKKyAgICAgICAgaCAvPSAyOworICAgICAgICBsZXZlbCsrOworICAgICAgICBkZWNvZGVfYmxvY2soYiwgYml0bWFwLCAgICAgICAgICAgICAgICAgICAgICAgdywgaCwgbGV2ZWwpOworICAgICAgICBkZWNvZGVfYmxvY2soYiwgYml0bWFwICsgdywgICAgICAgICAgICAgICAgICAgdywgaCwgbGV2ZWwpOworICAgICAgICBkZWNvZGVfYmxvY2soYiwgYml0bWFwICsgaCAqIFhGQUNFX1dJRFRILCAgICAgdywgaCwgbGV2ZWwpOworICAgICAgICBkZWNvZGVfYmxvY2soYiwgYml0bWFwICsgdyArIGggKiBYRkFDRV9XSURUSCwgdywgaCwgbGV2ZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCit0eXBlZGVmIHN0cnVjdCBYRmFjZUNvbnRleHQgeworICAgIHVpbnQ4X3QgYml0bWFwW1hGQUNFX1BJWEVMU107IC8vLzwgaW1hZ2UgdXNlZCBpbnRlcm5hbGx5IGZvciBkZWNvZGluZworfSBYRmFjZUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCB4ZmFjZV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKGF2Y3R4LT53aWR0aCB8fCBhdmN0eC0+aGVpZ2h0KSB7CisgICAgICAgIGlmIChhdmN0eC0+d2lkdGggIT0gWEZBQ0VfV0lEVEggfHwgYXZjdHgtPmhlaWdodCAhPSBYRkFDRV9IRUlHSFQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJTaXplIHZhbHVlICVkeCVkIG5vdCBzdXBwb3J0ZWQsIG9ubHkgYWNjZXB0cyBhIHNpemUgb2YgJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBYRkFDRV9XSURUSCwgWEZBQ0VfSEVJR0hUKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdmN0eC0+d2lkdGggICA9IFhGQUNFX1dJRFRIOworICAgIGF2Y3R4LT5oZWlnaHQgID0gWEZBQ0VfSEVJR0hUOworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9NT05PV0hJVEU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZmFjZV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgWEZhY2VDb250ZXh0ICp4ZmFjZSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldCwgaSwgaiwgazsKKyAgICB1aW50OF90IGJ5dGU7CisgICAgQmlnSW50IGIgPSB7MH07CisgICAgY2hhciAqYnVmOworICAgIGludDY0X3QgYzsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChpID0gMCwgayA9IDA7IGF2cGt0LT5kYXRhW2ldICYmIGkgPCBhdnBrdC0+c2l6ZTsgaSsrKSB7CisgICAgICAgIGMgPSBhdnBrdC0+ZGF0YVtpXTsKKworICAgICAgICAvKiBpZ25vcmUgaW52YWxpZCBkaWdpdHMgKi8KKyAgICAgICAgaWYgKGMgPCBYRkFDRV9GSVJTVF9QUklOVCB8fCBjID4gWEZBQ0VfTEFTVF9QUklOVCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICgrK2sgPiBYRkFDRV9NQVhfRElHSVRTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJCdWZmZXIgaXMgbG9uZ2VyIHRoYW4gZXhwZWN0ZWQsIHRydW5jYXRpbmcgYXQgYnl0ZSAlZFxuIiwgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmZl9iaWdfbXVsKCZiLCBYRkFDRV9QUklOVFMpOworICAgICAgICBmZl9iaWdfYWRkKCZiLCBjIC0gWEZBQ0VfRklSU1RfUFJJTlQpOworICAgIH0KKworICAgIC8qIGRlY29kZSBpbWFnZSBhbmQgcHV0IGl0IGluIGJpdG1hcCAqLworICAgIG1lbXNldCh4ZmFjZS0+Yml0bWFwLCAwLCBYRkFDRV9QSVhFTFMpOworICAgIGJ1ZiA9IHhmYWNlLT5iaXRtYXA7CisgICAgZGVjb2RlX2Jsb2NrKCZiLCBidWYsICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAxNiwgMCk7CisgICAgZGVjb2RlX2Jsb2NrKCZiLCBidWYgKyAxNiwgICAgICAgICAgICAgICAgICAgIDE2LCAxNiwgMCk7CisgICAgZGVjb2RlX2Jsb2NrKCZiLCBidWYgKyAzMiwgICAgICAgICAgICAgICAgICAgIDE2LCAxNiwgMCk7CisgICAgZGVjb2RlX2Jsb2NrKCZiLCBidWYgKyBYRkFDRV9XSURUSCAqIDE2LCAgICAgIDE2LCAxNiwgMCk7CisgICAgZGVjb2RlX2Jsb2NrKCZiLCBidWYgKyBYRkFDRV9XSURUSCAqIDE2ICsgMTYsIDE2LCAxNiwgMCk7CisgICAgZGVjb2RlX2Jsb2NrKCZiLCBidWYgKyBYRkFDRV9XSURUSCAqIDE2ICsgMzIsIDE2LCAxNiwgMCk7CisgICAgZGVjb2RlX2Jsb2NrKCZiLCBidWYgKyBYRkFDRV9XSURUSCAqIDMyICAgICAsIDE2LCAxNiwgMCk7CisgICAgZGVjb2RlX2Jsb2NrKCZiLCBidWYgKyBYRkFDRV9XSURUSCAqIDMyICsgMTYsIDE2LCAxNiwgMCk7CisgICAgZGVjb2RlX2Jsb2NrKCZiLCBidWYgKyBYRkFDRV9XSURUSCAqIDMyICsgMzIsIDE2LCAxNiwgMCk7CisKKyAgICBmZl94ZmFjZV9nZW5lcmF0ZV9mYWNlKHhmYWNlLT5iaXRtYXAsIHhmYWNlLT5iaXRtYXApOworCisgICAgLyogY29udmVydCBpbWFnZSBmcm9tIDE9YmxhY2sgMD13aGl0ZSBiaXRtYXAgdG8gTU9OT1dISVRFICovCisgICAgYnVmID0gZnJhbWUtPmRhdGFbMF07CisgICAgZm9yIChpID0gMCwgaiA9IDAsIGsgPSAwLCBieXRlID0gMDsgaSA8IFhGQUNFX1BJWEVMUzsgaSsrKSB7CisgICAgICAgIGJ5dGUgKz0geGZhY2UtPmJpdG1hcFtpXTsKKyAgICAgICAgaWYgKGsgPT0gNykgeworICAgICAgICAgICAgYnVmW2orK10gPSBieXRlOworICAgICAgICAgICAgYnl0ZSA9IGsgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaysrOworICAgICAgICAgICAgYnl0ZSA8PD0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaiA9PSBYRkFDRV9XSURUSC84KSB7CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgIGJ1ZiArPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl94ZmFjZV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ4ZmFjZSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlgtZmFjZSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9YRkFDRSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoWEZhY2VDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB4ZmFjZV9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSB4ZmFjZV9kZWNvZGVfZnJhbWUsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfTU9OT1dISVRFLCBBVl9QSVhfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94ZmFjZWVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveGZhY2VlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWRlZjFlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveGZhY2VlbmMuYwpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MCBKYW1lcyBBc2h0b24gLSBTeWRuZXkgVW5pdmVyc2l0eQorICogQ29weXJpZ2h0IChjKSAyMDEyIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogWC1GYWNlIGVuY29kZXIsIGJhc2VkIG9uIGxpYmNvbXBmYWNlLCBieSBKYW1lcyBBc2h0b24uCisgKi8KKworI2luY2x1ZGUgInhmYWNlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKK3R5cGVkZWYgc3RydWN0IFhGYWNlQ29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgdWludDhfdCBiaXRtYXBbWEZBQ0VfUElYRUxTXTsgLy8vPCBpbWFnZSB1c2VkIGludGVybmFsbHkgZm9yIGRlY29kaW5nCisgICAgaW50IG1heF9saW5lX2xlbjsgICAgICAgICAgICAgLy8vPCBtYXggbGluZSBsZW5ndGggZm9yIGNvbXByZXNzZWQgZGF0YQorICAgIGludCBzZXRfaGVhZGVyOyAgICAgICAgICAgICAgIC8vLzwgc2V0IFgtRmFjZSBoZWFkZXIgaW4gdGhlIG91dHB1dAorfSBYRmFjZUNvbnRleHQ7CisKK3N0YXRpYyBpbnQgYWxsX3NhbWUoY2hhciAqYml0bWFwLCBpbnQgdywgaW50IGgpCit7CisgICAgY2hhciB2YWwsICpyb3c7CisgICAgaW50IHg7CisKKyAgICB2YWwgPSAqYml0bWFwOworICAgIHdoaWxlIChoLS0pIHsKKyAgICAgICAgcm93ID0gYml0bWFwOworICAgICAgICB4ID0gdzsKKyAgICAgICAgd2hpbGUgKHgtLSkKKyAgICAgICAgICAgIGlmICgqKHJvdysrKSAhPSB2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGJpdG1hcCArPSBYRkFDRV9XSURUSDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYWxsX2JsYWNrKGNoYXIgKmJpdG1hcCwgaW50IHcsIGludCBoKQoreworICAgIGlmICh3ID4gMykgeworICAgICAgICB3IC89IDI7CisgICAgICAgIGggLz0gMjsKKyAgICAgICAgcmV0dXJuIChhbGxfYmxhY2soYml0bWFwLCB3LCBoKSAmJiBhbGxfYmxhY2soYml0bWFwICsgdywgdywgaCkgJiYKKyAgICAgICAgICAgICAgICBhbGxfYmxhY2soYml0bWFwICsgWEZBQ0VfV0lEVEggKiBoLCB3LCBoKSAmJgorICAgICAgICAgICAgICAgIGFsbF9ibGFjayhiaXRtYXAgKyBYRkFDRV9XSURUSCAqIGggKyB3LCB3LCBoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogYXQgbGVhc3Qgb25lIHBpeGVsIGluIHRoZSAyeDIgZ3JpZCBpcyBub24temVybyAqLworICAgICAgICByZXR1cm4gKmJpdG1hcCB8fCAqKGJpdG1hcCArIDEpIHx8CisgICAgICAgICAgICAgICAqKGJpdG1hcCArIFhGQUNFX1dJRFRIKSB8fCAqKGJpdG1hcCArIFhGQUNFX1dJRFRIICsgMSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGFsbF93aGl0ZShjaGFyICpiaXRtYXAsIGludCB3LCBpbnQgaCkKK3sKKyAgICByZXR1cm4gKmJpdG1hcCA9PSAwICYmIGFsbF9zYW1lKGJpdG1hcCwgdywgaCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQcm9iUmFuZ2UgcHJvYl9yYW5nZXNbWEZBQ0VfUElYRUxTKjJdOworICAgIGludCBwcm9iX3Jhbmdlc19pZHg7Cit9IFByb2JSYW5nZXNRdWV1ZTsKKworc3RhdGljIGlubGluZSBpbnQgcHFfcHVzaChQcm9iUmFuZ2VzUXVldWUgKnBxLCBjb25zdCBQcm9iUmFuZ2UgKnApCit7CisgICAgaWYgKHBxLT5wcm9iX3Jhbmdlc19pZHggPj0gWEZBQ0VfUElYRUxTICogMiAtIDEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBwcS0+cHJvYl9yYW5nZXNbcHEtPnByb2JfcmFuZ2VzX2lkeCsrXSA9ICpwOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdXNoX2dyZXlzKFByb2JSYW5nZXNRdWV1ZSAqcHEsIGNoYXIgKmJpdG1hcCwgaW50IHcsIGludCBoKQoreworICAgIGlmICh3ID4gMykgeworICAgICAgICB3IC89IDI7CisgICAgICAgIGggLz0gMjsKKyAgICAgICAgcHVzaF9ncmV5cyhwcSwgYml0bWFwLCAgICAgICAgICAgICAgICAgICAgICAgdywgaCk7CisgICAgICAgIHB1c2hfZ3JleXMocHEsIGJpdG1hcCArIHcsICAgICAgICAgICAgICAgICAgIHcsIGgpOworICAgICAgICBwdXNoX2dyZXlzKHBxLCBiaXRtYXAgKyBYRkFDRV9XSURUSCAqIGgsICAgICB3LCBoKTsKKyAgICAgICAgcHVzaF9ncmV5cyhwcSwgYml0bWFwICsgWEZBQ0VfV0lEVEggKiBoICsgdywgdywgaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgUHJvYlJhbmdlICpwID0gZmZfeGZhY2VfcHJvYnJhbmdlc18yeDIgKworICAgICAgICAgICAgICAgICAqYml0bWFwICsKKyAgICAgICAgICAgIDIgKiAqKGJpdG1hcCArIDEpICsKKyAgICAgICAgICAgIDQgKiAqKGJpdG1hcCArIFhGQUNFX1dJRFRIKSArCisgICAgICAgICAgICA4ICogKihiaXRtYXAgKyBYRkFDRV9XSURUSCArIDEpOworICAgICAgICBwcV9wdXNoKHBxLCBwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9ibG9jayhjaGFyICpiaXRtYXAsIGludCB3LCBpbnQgaCwgaW50IGxldmVsLCBQcm9iUmFuZ2VzUXVldWUgKnBxKQoreworICAgIGlmIChhbGxfd2hpdGUoYml0bWFwLCB3LCBoKSkgeworICAgICAgICBwcV9wdXNoKHBxLCAmZmZfeGZhY2VfcHJvYnJhbmdlc19wZXJfbGV2ZWxbbGV2ZWxdW1hGQUNFX0NPTE9SX1dISVRFXSk7CisgICAgfSBlbHNlIGlmIChhbGxfYmxhY2soYml0bWFwLCB3LCBoKSkgeworICAgICAgICBwcV9wdXNoKHBxLCAmZmZfeGZhY2VfcHJvYnJhbmdlc19wZXJfbGV2ZWxbbGV2ZWxdW1hGQUNFX0NPTE9SX0JMQUNLXSk7CisgICAgICAgIHB1c2hfZ3JleXMocHEsIGJpdG1hcCwgdywgaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHFfcHVzaChwcSwgJmZmX3hmYWNlX3Byb2JyYW5nZXNfcGVyX2xldmVsW2xldmVsXVtYRkFDRV9DT0xPUl9HUkVZXSk7CisgICAgICAgIHcgLz0gMjsKKyAgICAgICAgaCAvPSAyOworICAgICAgICBsZXZlbCsrOworICAgICAgICBlbmNvZGVfYmxvY2soYml0bWFwLCAgICAgICAgICAgICAgICAgICAgICAgdywgaCwgbGV2ZWwsIHBxKTsKKyAgICAgICAgZW5jb2RlX2Jsb2NrKGJpdG1hcCArIHcsICAgICAgICAgICAgICAgICAgIHcsIGgsIGxldmVsLCBwcSk7CisgICAgICAgIGVuY29kZV9ibG9jayhiaXRtYXAgKyBoICogWEZBQ0VfV0lEVEgsICAgICB3LCBoLCBsZXZlbCwgcHEpOworICAgICAgICBlbmNvZGVfYmxvY2soYml0bWFwICsgdyArIGggKiBYRkFDRV9XSURUSCwgdywgaCwgbGV2ZWwsIHBxKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB4ZmFjZV9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWF2Y3R4LT5jb2RlZF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1c2hfaW50ZWdlcihCaWdJbnQgKmIsIGNvbnN0IFByb2JSYW5nZSAqcHJhbmdlKQoreworICAgIHVpbnQ4X3QgcjsKKworICAgIGZmX2JpZ19kaXYoYiwgcHJhbmdlLT5yYW5nZSwgJnIpOworICAgIGZmX2JpZ19tdWwoYiwgMCk7CisgICAgZmZfYmlnX2FkZChiLCByICsgcHJhbmdlLT5vZmZzZXQpOworfQorCitzdGF0aWMgaW50IHhmYWNlX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIFhGYWNlQ29udGV4dCAqeGZhY2UgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFByb2JSYW5nZXNRdWV1ZSBwcSA9IHt7eyAwIH19LCAwfTsKKyAgICB1aW50OF90IGJpdG1hcF9jb3B5W1hGQUNFX1BJWEVMU107CisgICAgQmlnSW50IGIgPSB7MH07CisgICAgaW50IGksIGosIGssIHJldCA9IDA7CisgICAgY29uc3QgdWludDhfdCAqYnVmOworICAgIHVpbnQ4X3QgKnA7CisgICAgY2hhciBpbnRidWZbWEZBQ0VfTUFYX0RJR0lUU107CisKKyAgICBpZiAoYXZjdHgtPndpZHRoIHx8IGF2Y3R4LT5oZWlnaHQpIHsKKyAgICAgICAgaWYgKGF2Y3R4LT53aWR0aCAhPSBYRkFDRV9XSURUSCB8fCBhdmN0eC0+aGVpZ2h0ICE9IFhGQUNFX0hFSUdIVCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlNpemUgdmFsdWUgJWR4JWQgbm90IHN1cHBvcnRlZCwgb25seSBhY2NlcHRzIGEgc2l6ZSBvZiAlZHglZFxuIiwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIFhGQUNFX1dJRFRILCBYRkFDRV9IRUlHSFQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdmN0eC0+d2lkdGggID0gWEZBQ0VfV0lEVEg7CisgICAgYXZjdHgtPmhlaWdodCA9IFhGQUNFX0hFSUdIVDsKKworICAgIC8qIGNvbnZlcnQgaW1hZ2UgZnJvbSBNT05PV0hJVEUgdG8gMT1ibGFjayAwPXdoaXRlIGJpdG1hcCAqLworICAgIGJ1ZiA9IGZyYW1lLT5kYXRhWzBdOworICAgIGkgPSBqID0gMDsKKyAgICBkbyB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICAgICAgICB4ZmFjZS0+Yml0bWFwW2krK10gPSAoYnVmW2pdPj4oNy1rKSkmMTsKKyAgICAgICAgaWYgKCsraiA9PSBYRkFDRV9XSURUSC84KSB7CisgICAgICAgICAgICBidWYgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChpIDwgWEZBQ0VfUElYRUxTKTsKKworICAgIC8qIGNyZWF0ZSBhIGNvcHkgb2YgYml0bWFwICovCisgICAgbWVtY3B5KGJpdG1hcF9jb3B5LCB4ZmFjZS0+Yml0bWFwLCBYRkFDRV9QSVhFTFMpOworICAgIGZmX3hmYWNlX2dlbmVyYXRlX2ZhY2UoeGZhY2UtPmJpdG1hcCwgYml0bWFwX2NvcHkpOworCisgICAgZW5jb2RlX2Jsb2NrKHhmYWNlLT5iaXRtYXAsICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAxNiwgMCwgJnBxKTsKKyAgICBlbmNvZGVfYmxvY2soeGZhY2UtPmJpdG1hcCArIDE2LCAgICAgICAgICAgICAgICAgICAgMTYsIDE2LCAwLCAmcHEpOworICAgIGVuY29kZV9ibG9jayh4ZmFjZS0+Yml0bWFwICsgMzIsICAgICAgICAgICAgICAgICAgICAxNiwgMTYsIDAsICZwcSk7CisgICAgZW5jb2RlX2Jsb2NrKHhmYWNlLT5iaXRtYXAgKyBYRkFDRV9XSURUSCAqIDE2LCAgICAgIDE2LCAxNiwgMCwgJnBxKTsKKyAgICBlbmNvZGVfYmxvY2soeGZhY2UtPmJpdG1hcCArIFhGQUNFX1dJRFRIICogMTYgKyAxNiwgMTYsIDE2LCAwLCAmcHEpOworICAgIGVuY29kZV9ibG9jayh4ZmFjZS0+Yml0bWFwICsgWEZBQ0VfV0lEVEggKiAxNiArIDMyLCAxNiwgMTYsIDAsICZwcSk7CisgICAgZW5jb2RlX2Jsb2NrKHhmYWNlLT5iaXRtYXAgKyBYRkFDRV9XSURUSCAqIDMyLCAgICAgIDE2LCAxNiwgMCwgJnBxKTsKKyAgICBlbmNvZGVfYmxvY2soeGZhY2UtPmJpdG1hcCArIFhGQUNFX1dJRFRIICogMzIgKyAxNiwgMTYsIDE2LCAwLCAmcHEpOworICAgIGVuY29kZV9ibG9jayh4ZmFjZS0+Yml0bWFwICsgWEZBQ0VfV0lEVEggKiAzMiArIDMyLCAxNiwgMTYsIDAsICZwcSk7CisKKyAgICB3aGlsZSAocHEucHJvYl9yYW5nZXNfaWR4ID4gMCkKKyAgICAgICAgcHVzaF9pbnRlZ2VyKCZiLCAmcHEucHJvYl9yYW5nZXNbLS1wcS5wcm9iX3Jhbmdlc19pZHhdKTsKKworICAgIC8qIHdyaXRlIHRoZSBpbnZlcnRlZCBiaWcgaW50ZWdlciBpbiBiIHRvIGludGJ1ZiAqLworICAgIGkgPSAwOworICAgIGF2X2Fzc2VydDAoYi5uYl93b3JkcyA8IFhGQUNFX01BWF9XT1JEUyk7CisgICAgd2hpbGUgKGIubmJfd29yZHMpIHsKKyAgICAgICAgdWludDhfdCByOworICAgICAgICBmZl9iaWdfZGl2KCZiLCBYRkFDRV9QUklOVFMsICZyKTsKKyAgICAgICAgYXZfYXNzZXJ0MChpIDwgc2l6ZW9mKGludGJ1ZikpOworICAgICAgICBpbnRidWZbaSsrXSA9IHIgKyBYRkFDRV9GSVJTVF9QUklOVDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgaSsyKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogcmV2ZXJ0IHRoZSBudW1iZXIsIGFuZCBjbG9zZSB0aGUgYnVmZmVyICovCisgICAgcCA9IHBrdC0+ZGF0YTsKKyAgICB3aGlsZSAoLS1pID49IDApCisgICAgICAgICoocCsrKSA9IGludGJ1ZltpXTsKKyAgICAqKHArKykgPSAnXG4nOworICAgICoocCsrKSA9IDA7CisKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHhmYWNlX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl94ZmFjZV9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ4ZmFjZSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlgtZmFjZSBpbWFnZSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9YRkFDRSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoWEZhY2VDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB4ZmFjZV9lbmNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB4ZmFjZV9lbmNvZGVfY2xvc2UsCisgICAgLmVuY29kZTIgICAgICAgID0geGZhY2VfZW5jb2RlX2ZyYW1lLAorICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIFBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9NT05PV0hJVEUsIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3hpcGguYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3hpcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWI5NzhkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveGlwaC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAieGlwaC5oIgorCitpbnQgYXZwcml2X3NwbGl0X3hpcGhfaGVhZGVycyhjb25zdCB1aW50OF90ICpleHRyYWRhdGEsIGludCBleHRyYWRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0X2hlYWRlcl9zaXplLCB1aW50OF90ICpoZWFkZXJfc3RhcnRbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFkZXJfbGVuWzNdKQoreworICAgIGludCBpOworCisgICAgaWYgKGV4dHJhZGF0YV9zaXplID49IDYgJiYgQVZfUkIxNihleHRyYWRhdGEpID09IGZpcnN0X2hlYWRlcl9zaXplKSB7CisgICAgICAgIGludCBvdmVyYWxsX2xlbiA9IDY7CisgICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgeworICAgICAgICAgICAgaGVhZGVyX2xlbltpXSA9IEFWX1JCMTYoZXh0cmFkYXRhKTsKKyAgICAgICAgICAgIGV4dHJhZGF0YSArPSAyOworICAgICAgICAgICAgaGVhZGVyX3N0YXJ0W2ldID0gZXh0cmFkYXRhOworICAgICAgICAgICAgZXh0cmFkYXRhICs9IGhlYWRlcl9sZW5baV07CisgICAgICAgICAgICBpZiAob3ZlcmFsbF9sZW4gPiBleHRyYWRhdGFfc2l6ZSAtIGhlYWRlcl9sZW5baV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgb3ZlcmFsbF9sZW4gKz0gaGVhZGVyX2xlbltpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXh0cmFkYXRhX3NpemUgPj0gMyAmJiBleHRyYWRhdGFfc2l6ZSA8IElOVF9NQVggLSAweDFmZiAmJiBleHRyYWRhdGFbMF0gPT0gMikgeworICAgICAgICBpbnQgb3ZlcmFsbF9sZW4gPSAzOworICAgICAgICBleHRyYWRhdGErKzsKKyAgICAgICAgZm9yIChpPTA7IGk8MjsgaSsrLCBleHRyYWRhdGErKykgeworICAgICAgICAgICAgaGVhZGVyX2xlbltpXSA9IDA7CisgICAgICAgICAgICBmb3IgKDsgb3ZlcmFsbF9sZW4gPCBleHRyYWRhdGFfc2l6ZSAmJiAqZXh0cmFkYXRhPT0weGZmOyBleHRyYWRhdGErKykgeworICAgICAgICAgICAgICAgIGhlYWRlcl9sZW5baV0gKz0gMHhmZjsKKyAgICAgICAgICAgICAgICBvdmVyYWxsX2xlbiAgICs9IDB4ZmYgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGVhZGVyX2xlbltpXSArPSAqZXh0cmFkYXRhOworICAgICAgICAgICAgb3ZlcmFsbF9sZW4gICArPSAqZXh0cmFkYXRhOworICAgICAgICAgICAgaWYgKG92ZXJhbGxfbGVuID4gZXh0cmFkYXRhX3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGhlYWRlcl9sZW5bMl0gPSBleHRyYWRhdGFfc2l6ZSAtIG92ZXJhbGxfbGVuOworICAgICAgICBoZWFkZXJfc3RhcnRbMF0gPSBleHRyYWRhdGE7CisgICAgICAgIGhlYWRlcl9zdGFydFsxXSA9IGhlYWRlcl9zdGFydFswXSArIGhlYWRlcl9sZW5bMF07CisgICAgICAgIGhlYWRlcl9zdGFydFsyXSA9IGhlYWRlcl9zdGFydFsxXSArIGhlYWRlcl9sZW5bMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3hpcGguaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3hpcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGRkYmJlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveGlwaC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19YSVBIX0gKKyNkZWZpbmUgQVZDT0RFQ19YSVBIX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworLyoqCisgKiBTcGxpdCBhIHNpbmdsZSBleHRyYWRhdGEgYnVmZmVyIGludG8gdGhlIHRocmVlIGhlYWRlcnMgdGhhdCBtb3N0CisgKiBYaXBoIGNvZGVjcyB1c2UuIChlLmcuIFRoZW9yYSBhbmQgVm9yYmlzKQorICogV29ya3MgYm90aCB3aXRoIE1hdHJvc2thJ3MgcGFja2luZyBhbmQgbGF2YydzIHBhY2tpbmcuCisgKgorICogQHBhcmFtW2luXSBleHRyYWRhdGEgVGhlIHNpbmdsZSBjaHVuayB0aGF0IGNvbWJpbmVzIGFsbCB0aHJlZSBoZWFkZXJzCisgKiBAcGFyYW1baW5dIGV4dHJhZGF0YV9zaXplIFRoZSBzaXplIG9mIHRoZSBleHRyYWRhdGEgYnVmZmVyCisgKiBAcGFyYW1baW5dIGZpcnN0X2hlYWRlcl9zaXplIFRoZSBzaXplIG9mIHRoZSBmaXJzdCBoZWFkZXIsIHVzZWQgdG8KKyAqIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgTWF0cm9za2EgcGFja2luZyBhbmQgbGF2YyBwYWNraW5nLgorICogQHBhcmFtW291dF0gaGVhZGVyX3N0YXJ0IFBvaW50ZXJzIHRvIHRoZSBzdGFydCBvZiB0aGUgdGhyZWUgc2VwYXJhdGUgaGVhZGVycy4KKyAqIEBwYXJhbVtvdXRdIGhlYWRlcl9sZW4gVGhlIHNpemVzIG9mIGVhY2ggb2YgdGhlIHRocmVlIGhlYWRlcnMuCisgKiBAcmV0dXJuIE9uIGVycm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQsIG9uIHN1Y2Nlc3MgemVyby4KKyAqLworaW50IGF2cHJpdl9zcGxpdF94aXBoX2hlYWRlcnMoY29uc3QgdWludDhfdCAqZXh0cmFkYXRhLCBpbnQgZXh0cmFkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RfaGVhZGVyX3NpemUsIHVpbnQ4X3QgKmhlYWRlcl9zdGFydFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFkZXJfbGVuWzNdKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfWElQSF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94bC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDFkYTFkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveGwuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIE1pcm8gVmlkZW9YTCBjb2RlYworICogQ29weXJpZ2h0IChjKSAyMDA0IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTWlybyBWaWRlb1hMIGNvZGVjLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgY29uc3QgaW50IHhsX3RhYmxlWzMyXSA9IHsKKyAgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywKKyAgIDgsICAgOSwgIDEyLCAgMTUsICAyMCwgIDI1LCAgMzQsICA0NiwKKyAgNjQsICA4MiwgIDk0LCAxMDMsIDEwOCwgMTEzLCAxMTYsIDExOSwKKyAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNworfTsKKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgQVZGcmFtZSAqY29uc3QgcCAgID0gZGF0YTsKKyAgICB1aW50OF90ICpZLCAqVSwgKlY7CisgICAgaW50IGksIGosIHJldDsKKyAgICBpbnQgc3RyaWRlOworICAgIHVpbnQzMl90IHZhbDsKKyAgICBpbnQgeTAsIHkxLCB5MiwgeTMgPSAwLCBjMCA9IDAsIGMxID0gMDsKKworICAgIGlmIChhdmN0eC0+d2lkdGggJSA0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAid2lkdGggaXMgbm90IGEgbXVsdGlwbGUgb2YgNFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoYnVmX3NpemUgPCBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGlzIHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcCwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwLT5rZXlfZnJhbWUgPSAxOworCisgICAgWSA9IHAtPmRhdGFbMF07CisgICAgVSA9IHAtPmRhdGFbMV07CisgICAgViA9IHAtPmRhdGFbMl07CisKKyAgICBzdHJpZGUgPSBhdmN0eC0+d2lkdGggLSA0OworCisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICAvKiBsaW5lcyBhcmUgc3RvcmVkIGluIHJldmVyc2VkIG9yZGVyICovCisgICAgICAgIGJ1ZiArPSBzdHJpZGU7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aDsgaiArPSA0KSB7CisgICAgICAgICAgICAvKiB2YWx1ZSBpcyBzdG9yZWQgaW4gTEUgZHdvcmQgd2l0aCB3b3JkIHN3YXBwZWQgKi8KKyAgICAgICAgICAgIHZhbCAgPSBBVl9STDMyKGJ1Zik7CisgICAgICAgICAgICBidWYgLT0gNDsKKyAgICAgICAgICAgIHZhbCAgPSAoKHZhbCA+PiAxNikgJiAweEZGRkYpIHwgKCh2YWwgJiAweEZGRkYpIDw8IDE2KTsKKworICAgICAgICAgICAgaWYgKCFqKQorICAgICAgICAgICAgICAgIHkwID0gKHZhbCAmIDB4MUYpIDw8IDI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeTAgPSB5MyArIHhsX3RhYmxlW3ZhbCAmIDB4MUZdOworICAgICAgICAgICAgdmFsID4+PSA1OworICAgICAgICAgICAgeTEgICAgPSB5MCArIHhsX3RhYmxlW3ZhbCAmIDB4MUZdOworICAgICAgICAgICAgdmFsID4+PSA1OworICAgICAgICAgICAgeTIgICAgPSB5MSArIHhsX3RhYmxlW3ZhbCAmIDB4MUZdOworICAgICAgICAgICAgdmFsID4+PSA2OyAvKiBhbGlnbiB0byB3b3JkICovCisgICAgICAgICAgICB5MyAgICA9IHkyICsgeGxfdGFibGVbdmFsICYgMHgxRl07CisgICAgICAgICAgICB2YWwgPj49IDU7CisgICAgICAgICAgICBpZiAoIWopCisgICAgICAgICAgICAgICAgYzAgPSAodmFsICYgMHgxRikgPDwgMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjMCArPSB4bF90YWJsZVt2YWwgJiAweDFGXTsKKyAgICAgICAgICAgIHZhbCA+Pj0gNTsKKyAgICAgICAgICAgIGlmICghaikKKyAgICAgICAgICAgICAgICBjMSA9ICh2YWwgJiAweDFGKSA8PCAyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGMxICs9IHhsX3RhYmxlW3ZhbCAmIDB4MUZdOworCisgICAgICAgICAgICBZW2ogKyAwXSA9IHkwIDw8IDE7CisgICAgICAgICAgICBZW2ogKyAxXSA9IHkxIDw8IDE7CisgICAgICAgICAgICBZW2ogKyAyXSA9IHkyIDw8IDE7CisgICAgICAgICAgICBZW2ogKyAzXSA9IHkzIDw8IDE7CisKKyAgICAgICAgICAgIFVbaiA+PiAyXSA9IGMwIDw8IDE7CisgICAgICAgICAgICBWW2ogPj4gMl0gPSBjMSA8PCAxOworICAgICAgICB9CisKKyAgICAgICAgYnVmICs9IGF2Y3R4LT53aWR0aCArIDQ7CisgICAgICAgIFkgICArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgVSAgICs9IHAtPmxpbmVzaXplWzFdOworICAgICAgICBWICAgKz0gcC0+bGluZXNpemVbMl07CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQxMVA7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl94bF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAieGwiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWlybyBWaWRlb1hMIiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfVklYTCwKKyAgICAuaW5pdCAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94c3ViZGVjLmMgYi9mZm1wZWcvbGliYXZjb2RlYy94c3ViZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0ZDc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3hzdWJkZWMuYwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIFhTVUIgc3VidGl0bGUgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IFJlaW1hciBEw7ZmZmluZ2VyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpIHsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGNfb2Zmc2V0c1s5XSA9IHsgMCwgMSwgMywgNCwgNiwgNywgOSwgMTAsIDExIH07CitzdGF0aWMgY29uc3QgdWludDhfdCB0Y19tdWxzWzldID0geyAxMCwgNiwgMTAsIDYsIDEwLCAxMCwgMTAsIDEwLCAxIH07CisKK3N0YXRpYyBpbnQ2NF90IHBhcnNlX3RpbWVjb2RlKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50NjRfdCBwYWNrZXRfdGltZSkgeworICAgIGludCBpOworICAgIGludDY0X3QgbXMgPSAwOworICAgIGlmIChidWZbMl0gIT0gJzonIHx8IGJ1Zls1XSAhPSAnOicgfHwgYnVmWzhdICE9ICcuJykKKyAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YodGNfb2Zmc2V0cyk7IGkrKykgeworICAgICAgICB1aW50OF90IGMgPSBidWZbdGNfb2Zmc2V0c1tpXV0gLSAnMCc7CisgICAgICAgIGlmIChjID4gOSkgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworICAgICAgICBtcyA9IChtcyArIGMpICogdGNfbXVsc1tpXTsKKyAgICB9CisgICAgcmV0dXJuIG1zIC0gcGFja2V0X3RpbWU7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpIHsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBBVlN1YnRpdGxlICpzdWIgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBidWYgKyBidWZfc2l6ZTsKKyAgICB1aW50OF90ICpiaXRtYXA7CisgICAgaW50IHcsIGgsIHgsIHksIGk7CisgICAgaW50NjRfdCBwYWNrZXRfdGltZSA9IDA7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgaGFzX2FscGhhID0gYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnRCcsJ1gnLCdTJywnQScpOworCisgICAgLy8gY2hlY2sgdGhhdCBhdCBsZWFzdCBoZWFkZXIgZml0cworICAgIGlmIChidWZfc2l6ZSA8IDI3ICsgNyAqIDIgKyA0ICogMykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImNvZGVkIGZyYW1lIHNpemUgJWQgdG9vIHNtYWxsXG4iLCBidWZfc2l6ZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyByZWFkIHN0YXJ0IGFuZCBlbmQgdGltZQorICAgIGlmIChidWZbMF0gIT0gJ1snIHx8IGJ1ZlsxM10gIT0gJy0nIHx8IGJ1ZlsyNl0gIT0gJ10nKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCB0aW1lIGNvZGVcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChhdnBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBwYWNrZXRfdGltZSA9IGF2X3Jlc2NhbGVfcShhdnBrdC0+cHRzLCBBVl9USU1FX0JBU0VfUSwgKEFWUmF0aW9uYWwpezEsIDEwMDB9KTsKKyAgICBzdWItPnN0YXJ0X2Rpc3BsYXlfdGltZSA9IHBhcnNlX3RpbWVjb2RlKGJ1ZiArICAxLCBwYWNrZXRfdGltZSk7CisgICAgc3ViLT5lbmRfZGlzcGxheV90aW1lICAgPSBwYXJzZV90aW1lY29kZShidWYgKyAxNCwgcGFja2V0X3RpbWUpOworICAgIGJ1ZiArPSAyNzsKKworICAgIC8vIHJlYWQgaGVhZGVyCisgICAgdyA9IGJ5dGVzdHJlYW1fZ2V0X2xlMTYoJmJ1Zik7CisgICAgaCA9IGJ5dGVzdHJlYW1fZ2V0X2xlMTYoJmJ1Zik7CisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUodywgaCwgMCwgYXZjdHgpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHggPSBieXRlc3RyZWFtX2dldF9sZTE2KCZidWYpOworICAgIHkgPSBieXRlc3RyZWFtX2dldF9sZTE2KCZidWYpOworICAgIC8vIHNraXAgYm90dG9tIHJpZ2h0IHBvc2l0aW9uLCBpdCBnaXZlcyBubyBuZXcgaW5mb3JtYXRpb24KKyAgICBieXRlc3RyZWFtX2dldF9sZTE2KCZidWYpOworICAgIGJ5dGVzdHJlYW1fZ2V0X2xlMTYoJmJ1Zik7CisgICAgLy8gVGhlIGZvbGxvd2luZyB2YWx1ZSBpcyBzdXBwb3NlZCB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2Zmc2V0CisgICAgLy8gKHJlbGF0aXZlIHRvIHRoZSBwYWxldHRlKSBvZiB0aGUgZGF0YSBmb3IgdGhlIHNlY29uZCBmaWVsZCwKKyAgICAvLyBob3dldmVyIHRoZXJlIGFyZSBmaWxlcyBpbiB3aGljaCBpdCBoYXMgYSBib2d1cyB2YWx1ZSBhbmQgdGh1cworICAgIC8vIHdlIGp1c3QgaWdub3JlIGl0CisgICAgYnl0ZXN0cmVhbV9nZXRfbGUxNigmYnVmKTsKKworICAgIC8vIGFsbG9jYXRlIHN1YiBhbmQgc2V0IHZhbHVlcworICAgIHN1Yi0+cmVjdHMgPSAgYXZfbWFsbG9jeihzaXplb2YoKnN1Yi0+cmVjdHMpKTsKKyAgICBzdWItPnJlY3RzWzBdID0gYXZfbWFsbG9jeihzaXplb2YoKnN1Yi0+cmVjdHNbMF0pKTsKKyAgICBzdWItPm51bV9yZWN0cyA9IDE7CisgICAgc3ViLT5yZWN0c1swXS0+eCA9IHg7IHN1Yi0+cmVjdHNbMF0tPnkgPSB5OworICAgIHN1Yi0+cmVjdHNbMF0tPncgPSB3OyBzdWItPnJlY3RzWzBdLT5oID0gaDsKKyAgICBzdWItPnJlY3RzWzBdLT50eXBlID0gU1VCVElUTEVfQklUTUFQOworICAgIHN1Yi0+cmVjdHNbMF0tPnBpY3QubGluZXNpemVbMF0gPSB3OworICAgIHN1Yi0+cmVjdHNbMF0tPnBpY3QuZGF0YVswXSA9IGF2X21hbGxvYyh3ICogaCk7CisgICAgc3ViLT5yZWN0c1swXS0+bmJfY29sb3JzID0gNDsKKyAgICBzdWItPnJlY3RzWzBdLT5waWN0LmRhdGFbMV0gPSBhdl9tYWxsb2N6KEFWUEFMRVRURV9TSVpFKTsKKworICAgIC8vIHJlYWQgcGFsZXR0ZQorICAgIGZvciAoaSA9IDA7IGkgPCBzdWItPnJlY3RzWzBdLT5uYl9jb2xvcnM7IGkrKykKKyAgICAgICAgKCh1aW50MzJfdCopc3ViLT5yZWN0c1swXS0+cGljdC5kYXRhWzFdKVtpXSA9IGJ5dGVzdHJlYW1fZ2V0X2JlMjQoJmJ1Zik7CisgICAgLy8gbWFrZSBhbGwgZXhjZXB0IGJhY2tncm91bmQgKGZpcnN0IGVudHJ5KSBub24tdHJhbnNwYXJlbnQKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3ViLT5yZWN0c1swXS0+bmJfY29sb3JzOyBpKyspCisgICAgICAgICgodWludDMyX3QqKXN1Yi0+cmVjdHNbMF0tPnBpY3QuZGF0YVsxXSlbaV0gfD0gKGhhc19hbHBoYSA/ICpidWYrKyA6IChpID8gMHhmZiA6IDApKSA8PCAyNDsKKworICAgIC8vIHByb2Nlc3MgUkxFLWNvbXByZXNzZWQgZGF0YQorICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIChidWZfZW5kIC0gYnVmKSAqIDgpOworICAgIGJpdG1hcCA9IHN1Yi0+cmVjdHNbMF0tPnBpY3QuZGF0YVswXTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIC8vIGludGVybGFjZWQ6IGRvIG9kZCBsaW5lcworICAgICAgICBpZiAoeSA9PSAoaCArIDEpIC8gMikgYml0bWFwID0gc3ViLT5yZWN0c1swXS0+cGljdC5kYXRhWzBdICsgdzsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICkgeworICAgICAgICAgICAgaW50IGxvZzIgPSBmZl9sb2cyX3RhYltzaG93X2JpdHMoJmdiLCA4KV07CisgICAgICAgICAgICBpbnQgcnVuID0gZ2V0X2JpdHMoJmdiLCAxNCAtIDQgKiAobG9nMiA+PiAxKSk7CisgICAgICAgICAgICBpbnQgY29sb3IgPSBnZXRfYml0cygmZ2IsIDIpOworICAgICAgICAgICAgcnVuID0gRkZNSU4ocnVuLCB3IC0geCk7CisgICAgICAgICAgICAvLyBydW4gbGVuZ3RoIDAgbWVhbnMgdGlsbCBlbmQgb2Ygcm93CisgICAgICAgICAgICBpZiAoIXJ1bikgcnVuID0gdyAtIHg7CisgICAgICAgICAgICBtZW1zZXQoYml0bWFwLCBjb2xvciwgcnVuKTsKKyAgICAgICAgICAgIGJpdG1hcCArPSBydW47CisgICAgICAgICAgICB4ICs9IHJ1bjsKKyAgICAgICAgfQorICAgICAgICAvLyBpbnRlcmxhY2VkLCBza2lwIGV2ZXJ5IHNlY29uZCBsaW5lCisgICAgICAgIGJpdG1hcCArPSB3OworICAgICAgICBhbGlnbl9nZXRfYml0cygmZ2IpOworICAgIH0KKyAgICAqZGF0YV9zaXplID0gMTsKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK0FWQ29kZWMgZmZfeHN1Yl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgPSAieHN1YiIsCisgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJYU1VCIiksCisgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWFNVQiwKKyAgICAuaW5pdCAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICA9IGRlY29kZV9mcmFtZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94c3ViZW5jLmMgYi9mZm1wZWcvbGliYXZjb2RlYy94c3ViZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3MDg1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3hzdWJlbmMuYwpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIERpdlggKFhTVUIpIHN1YnRpdGxlIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNSBEaXZYLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQmpvcm4gQXhlbHNzb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKworLyoqCisgKiBOdW1iZXIgb2YgcGl4ZWxzIHRvIHBhZCBsZWZ0IGFuZCByaWdodC4KKyAqCisgKiBUaGUgb2ZmaWNpYWwgZW5jb2RlciBwYWRzIHRoZSBzdWJ0aXRsZXMgd2l0aCB0d28gcGl4ZWxzIG9uIGVpdGhlciBzaWRlLAorICogYnV0IHVudGlsIHdlIGZpbmQgb3V0IHdoeSwgd2Ugd29uJ3QgZG8gaXQgKHdlIHdpbGwgcGFkIHRvIGhhdmUgd2lkdGgKKyAqIGRpdmlzaWJsZSBieSAyIHRob3VnaCkuCisgKi8KKyNkZWZpbmUgUEFERElORyAwCisjZGVmaW5lIFBBRERJTkdfQ09MT1IgMAorCisvKioKKyAqIEVuY29kZSBhIHNpbmdsZSBjb2xvciBydW4uIEF0IG1vc3QgMTYgYml0cyB3aWxsIGJlIHVzZWQuCisgKiBAcGFyYW0gbGVuICAgbGVuZ3RoIG9mIHRoZSBydW4sIHZhbHVlcyA+IDI1NSBtZWFuICJ1bnRpbCBlbmQgb2YgbGluZSIsIG1heSBub3QgYmUgPCAwLgorICogQHBhcmFtIGNvbG9yIGNvbG9yIHRvIGVuY29kZSwgb25seSB0aGUgbG93ZXN0IHR3byBiaXRzIGFyZSB1c2VkIGFuZCBhbGwgb3RoZXJzIG11c3QgYmUgMC4KKyAqLworc3RhdGljIHZvaWQgcHV0X3hzdWJfcmxlKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgbGVuLCBpbnQgY29sb3IpCit7CisgICAgaWYgKGxlbiA8PSAyNTUpCisgICAgICAgIHB1dF9iaXRzKHBiLCAyICsgKChmZl9sb2cyX3RhYltsZW5dID4+IDEpIDw8IDIpLCBsZW4pOworICAgIGVsc2UKKyAgICAgICAgcHV0X2JpdHMocGIsIDE0LCAwKTsKKyAgICBwdXRfYml0cyhwYiwgMiwgY29sb3IpOworfQorCisvKioKKyAqIEVuY29kZSBhIDQtY29sb3IgYml0bWFwIHdpdGggWFNVQiBybGUuCisgKgorICogVGhlIGVuY29kZWQgYml0bWFwIG1heSBiZSB3aWRlciB0aGFuIHRoZSBzb3VyY2UgYml0bWFwIGR1ZSB0byBwYWRkaW5nLgorICovCitzdGF0aWMgaW50IHhzdWJfZW5jb2RlX3JsZShQdXRCaXRDb250ZXh0ICpwYiwgY29uc3QgdWludDhfdCAqYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLCBpbnQgdywgaW50IGgpCit7CisgICAgaW50IHgwLCB4MSwgeSwgbGVuLCBjb2xvciA9IFBBRERJTkdfQ09MT1I7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIHgwID0gMDsKKyAgICAgICAgd2hpbGUgKHgwIDwgdykgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHJvb20gZm9yIGF0IGxlYXN0IG9uZSBydW4gYW5kIHBhZGRpbmcKKyAgICAgICAgICAgIGlmIChwYi0+c2l6ZV9pbl9iaXRzIC0gcHV0X2JpdHNfY291bnQocGIpIDwgNyo4KQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgeDEgPSB4MDsKKyAgICAgICAgICAgIGNvbG9yID0gYml0bWFwW3gxKytdICYgMzsKKyAgICAgICAgICAgIHdoaWxlICh4MSA8IHcgJiYgKGJpdG1hcFt4MV0gJiAzKSA9PSBjb2xvcikKKyAgICAgICAgICAgICAgICB4MSsrOworICAgICAgICAgICAgbGVuID0geDEgLSB4MDsKKyAgICAgICAgICAgIGlmIChQQURESU5HICYmIHgwID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoY29sb3IgPT0gUEFERElOR19DT0xPUikgeworICAgICAgICAgICAgICAgICAgICBsZW4gKz0gUEFERElORzsKKyAgICAgICAgICAgICAgICAgICAgeDAgIC09IFBBRERJTkc7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHB1dF94c3ViX3JsZShwYiwgUEFERElORywgUEFERElOR19DT0xPUik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJ1biBjYW4ndCBiZSBsb25nZXIgdGhhbiAyNTUsIHVubGVzcyBpdCBpcyB0aGUgcmVzdCBvZiBhIHJvdworICAgICAgICAgICAgaWYgKHgxID09IHcgJiYgY29sb3IgPT0gUEFERElOR19DT0xPUikgeworICAgICAgICAgICAgICAgIGxlbiArPSBQQURESU5HICsgKHcmMSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBsZW4gPSBGRk1JTihsZW4sIDI1NSk7CisgICAgICAgICAgICBwdXRfeHN1Yl9ybGUocGIsIGxlbiwgY29sb3IpOworCisgICAgICAgICAgICB4MCArPSBsZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbG9yICE9IFBBRERJTkdfQ09MT1IgJiYgKFBBRERJTkcgKyAodyYxKSkpCisgICAgICAgICAgICBwdXRfeHN1Yl9ybGUocGIsIFBBRERJTkcgKyAodyYxKSwgUEFERElOR19DT0xPUik7CisKKyAgICAgICAgYXZwcml2X2FsaWduX3B1dF9iaXRzKHBiKTsKKworICAgICAgICBiaXRtYXAgKz0gbGluZXNpemU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFrZV90Yyh1aW50NjRfdCBtcywgaW50ICp0YykKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IHRjX2RpdnNbM10gPSB7IDEwMDAsIDYwLCA2MCB9OworICAgIGludCBpOworICAgIGZvciAoaT0wOyBpPDM7IGkrKykgeworICAgICAgICB0Y1tpXSA9IG1zICUgdGNfZGl2c1tpXTsKKyAgICAgICAgbXMgLz0gdGNfZGl2c1tpXTsKKyAgICB9CisgICAgdGNbM10gPSBtczsKKyAgICByZXR1cm4gbXMgPiA5OTsKK30KKworc3RhdGljIGludCB4c3ViX2VuY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZnNpemUsIGNvbnN0IEFWU3VidGl0bGUgKmgpCit7CisgICAgdWludDY0X3Qgc3RhcnRUaW1lID0gaC0+cHRzIC8gMTAwMDsgLy8gRklYTUU6IG5lZWQgYmV0dGVyIHNvbHV0aW9uLi4uCisgICAgdWludDY0X3QgZW5kVGltZSA9IHN0YXJ0VGltZSArIGgtPmVuZF9kaXNwbGF5X3RpbWUgLSBoLT5zdGFydF9kaXNwbGF5X3RpbWU7CisgICAgaW50IHN0YXJ0X3RjWzRdLCBlbmRfdGNbNF07CisgICAgdWludDhfdCAqaGRyID0gYnVmICsgMjc7IC8vIFBvaW50IGJlaGluZCB0aGUgdGltZXN0YW1wCisgICAgdWludDhfdCAqcmxlbGVucHRyOworICAgIHVpbnQxNl90IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGk7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKworICAgIGlmIChidWZzaXplIDwgMjcgKyA3KjIgKyA0KjMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCdWZmZXIgdG9vIHNtYWxsIGZvciBYU1VCIGhlYWRlci5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gVE9ETzogc3VwcG9ydCBtdWx0aXBsZSByZWN0cworICAgIGlmIChoLT5udW1fcmVjdHMgIT0gMSkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIk9ubHkgc2luZ2xlIHJlY3RzIHN1cHBvcnRlZCAoJWQgaW4gc3VidGl0bGUuKVxuIiwgaC0+bnVtX3JlY3RzKTsKKworICAgIC8vIFRPRE86IHJlbmRlciB0ZXh0LWJhc2VkIHN1YnRpdGxlcyBpbnRvIGJpdG1hcHMKKyAgICBpZiAoIWgtPnJlY3RzWzBdLT5waWN0LmRhdGFbMF0gfHwgIWgtPnJlY3RzWzBdLT5waWN0LmRhdGFbMV0pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIk5vIHN1YnRpdGxlIGJpdG1hcCBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIFRPRE86IGNvbG9yIHJlZHVjdGlvbiwgc2ltaWxhciB0byBkdmRzdWIgZW5jb2RlcgorICAgIGlmIChoLT5yZWN0c1swXS0+bmJfY29sb3JzID4gNCkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIk5vIG1vcmUgdGhhbiA0IHN1YnRpdGxlIGNvbG9ycyBzdXBwb3J0ZWQgKCVkIGZvdW5kLilcbiIsIGgtPnJlY3RzWzBdLT5uYl9jb2xvcnMpOworCisgICAgLy8gVE9ETzogUGFsZXR0ZSBzd2FwcGluZyBpZiBjb2xvciB6ZXJvIGlzIG5vdCB0cmFuc3BhcmVudAorICAgIGlmICgoKHVpbnQzMl90ICopaC0+cmVjdHNbMF0tPnBpY3QuZGF0YVsxXSlbMF0gJiAweGZmMDAwMDAwKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQ29sb3IgaW5kZXggMCBpcyBub3QgdHJhbnNwYXJlbnQuIFRyYW5zcGFyZW5jeSB3aWxsIGJlIG1lc3NlZCB1cC5cbiIpOworCisgICAgaWYgKG1ha2VfdGMoc3RhcnRUaW1lLCBzdGFydF90YykgfHwgbWFrZV90YyhlbmRUaW1lLCBlbmRfdGMpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaW1lIGNvZGUgPj0gMTAwIGhvdXJzLlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWYsIDI4LAorICAgICAgICAiWyUwMmQ6JTAyZDolMDJkLiUwM2QtJTAyZDolMDJkOiUwMmQuJTAzZF0iLAorICAgICAgICBzdGFydF90Y1szXSwgc3RhcnRfdGNbMl0sIHN0YXJ0X3RjWzFdLCBzdGFydF90Y1swXSwKKyAgICAgICAgZW5kX3RjWzNdLCAgIGVuZF90Y1syXSwgICBlbmRfdGNbMV0sICAgZW5kX3RjWzBdKTsKKworICAgIC8vIFdpZHRoIGFuZCBoZWlnaHQgbXVzdCBwcm9iYWJseSBiZSBtdWx0aXBsZXMgb2YgMi4KKyAgICAvLyAyIHBpeGVscyByZXF1aXJlZCBvbiBlaXRoZXIgc2lkZSBvZiBzdWJ0aXRsZS4KKyAgICAvLyBQb3NzaWJseSBkdWUgdG8gbGltaXRhdGlvbnMgb2YgaGFyZHdhcmUgcmVuZGVyZXJzLgorICAgIC8vIFRPRE86IGNoZWNrIGlmIHRoZSBiaXRtYXAgaXMgYWxyZWFkeSBwYWRkZWQKKyAgICB3aWR0aCAgPSBGRkFMSUdOKGgtPnJlY3RzWzBdLT53LCAyKSArIFBBRERJTkcgKiAyOworICAgIGhlaWdodCA9IEZGQUxJR04oaC0+cmVjdHNbMF0tPmgsIDIpOworCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmaGRyLCB3aWR0aCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmaGRyLCBoZWlnaHQpOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmhkciwgaC0+cmVjdHNbMF0tPngpOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmhkciwgaC0+cmVjdHNbMF0tPnkpOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmhkciwgaC0+cmVjdHNbMF0tPnggKyB3aWR0aCAtMSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmaGRyLCBoLT5yZWN0c1swXS0+eSArIGhlaWdodCAtMSk7CisKKyAgICBybGVsZW5wdHIgPSBoZHI7IC8vIFdpbGwgc3RvcmUgbGVuZ3RoIG9mIGZpcnN0IGZpZWxkIGhlcmUgbGF0ZXIuCisgICAgaGRyKz0yOworCisgICAgLy8gUGFsZXR0ZQorICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUyNCgmaGRyLCAoKHVpbnQzMl90ICopaC0+cmVjdHNbMF0tPnBpY3QuZGF0YVsxXSlbaV0pOworCisgICAgLy8gQml0bWFwCisgICAgLy8gUkxFIGJ1ZmZlci4gUmVzZXJ2ZSAyIGJ5dGVzIGZvciBwb3NzaWJsZSBwYWRkaW5nIGFmdGVyIHRoZSBsYXN0IHJvdy4KKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgaGRyLCBidWZzaXplIC0gKGhkciAtIGJ1ZikgLSAyKTsKKyAgICBpZiAoeHN1Yl9lbmNvZGVfcmxlKCZwYiwgaC0+cmVjdHNbMF0tPnBpY3QuZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPnJlY3RzWzBdLT5waWN0LmxpbmVzaXplWzBdKjIsCisgICAgICAgICAgICAgICAgICAgICAgICBoLT5yZWN0c1swXS0+dywgKGgtPnJlY3RzWzBdLT5oICsgMSkgPj4gMSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZybGVsZW5wdHIsIHB1dF9iaXRzX2NvdW50KCZwYikgPj4gMyk7IC8vIExlbmd0aCBvZiBmaXJzdCBmaWVsZAorCisgICAgaWYgKHhzdWJfZW5jb2RlX3JsZSgmcGIsIGgtPnJlY3RzWzBdLT5waWN0LmRhdGFbMF0gKyBoLT5yZWN0c1swXS0+cGljdC5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGgtPnJlY3RzWzBdLT5waWN0LmxpbmVzaXplWzBdKjIsCisgICAgICAgICAgICAgICAgICAgICAgICBoLT5yZWN0c1swXS0+dywgaC0+cmVjdHNbMF0tPmggPj4gMSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vIEVuZm9yY2UgdG90YWwgaGVpZ2h0IHRvIGJlIGEgbXVsdGlwbGUgb2YgMgorICAgIGlmIChoLT5yZWN0c1swXS0+aCAmIDEpIHsKKyAgICAgICAgcHV0X3hzdWJfcmxlKCZwYiwgaC0+cmVjdHNbMF0tPncsIFBBRERJTkdfQ09MT1IpOworICAgICAgICBhdnByaXZfYWxpZ25fcHV0X2JpdHMoJnBiKTsKKyAgICB9CisKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworCisgICAgcmV0dXJuIGhkciAtIGJ1ZiArIHB1dF9iaXRzX2NvdW50KCZwYikvODsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHhzdWJfZW5jb2Rlcl9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpZiAoIWF2Y3R4LT5jb2RlY190YWcpCisgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnRCcsJ1gnLCdTJywnQicpOworCisgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDQ7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl94c3ViX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgPSAieHN1YiIsCisgICAgLmxvbmdfbmFtZSAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGl2WCBzdWJ0aXRsZXMgKFhTVUIpIiksCisgICAgLnR5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCisgICAgLmlkICAgICAgICAgPSBBVl9DT0RFQ19JRF9YU1VCLAorICAgIC5pbml0ICAgICAgID0geHN1Yl9lbmNvZGVyX2luaXQsCisgICAgLmVuY29kZV9zdWIgPSB4c3ViX2VuY29kZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94dmlkaWRjdC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveHZpZGlkY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWZhYjcwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveHZpZGlkY3QuYwpAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqIFh2aWQgTVBFRy00IElEQ1QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBYdmlkIFNvbHV0aW9ucyBHbWJICisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFdhbGtlbiBJRENUCisgKiBBbHRlcm5hdGl2ZSBJRENUIGltcGxlbWVudGF0aW9uIGZvciBkZWNvZGluZyBjb21wYXRpYmlsaXR5LgorICoKKyAqIEBhdXRob3IgU2thbAorICogQG5vdGUgVGhpcyBDIHZlcnNpb24gaXMgbm90IHRoZSBvcmlnaW5hbCBJRENULCBidXQgYSBtb2RpZmllZCBvbmUgdGhhdAorICogICAgICAgeWllbGRzIHRoZSBzYW1lIGVycm9yIHByb2ZpbGUgYXMgdGhlIE1NWC9NTVhFWFQvU1NFMiB2ZXJzaW9ucy4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorI2luY2x1ZGUgInh2aWRpZGN0LmgiCisKKyNkZWZpbmUgUk9XX1NISUZUIDExCisjZGVmaW5lIENPTF9TSElGVCAgNgorCisvLyAjZGVmaW5lIEZJWCh4KSAgIChpbnQpKCh4KSAqICgxIDw8IFJPV19TSElGVCkpCisjZGVmaW5lIFJORDAgNjU1MzYgLy8gMSA8PCAoQ09MX1NISUZUICsgUk9XX1NISUZUIC0gMSk7CisjZGVmaW5lIFJORDEgMzU5NyAgLy8gRklYICgxLjc1NjgzNDg3MzAzKTsKKyNkZWZpbmUgUk5EMiAyMjYwICAvLyBGSVggKDEuMTAzNTUzMzkwNTkpOworI2RlZmluZSBSTkQzIDEyMDMgIC8vIEZJWCAoMC41ODc3ODgzMjU1ODgpOworI2RlZmluZSBSTkQ0IDAKKyNkZWZpbmUgUk5ENSAxMjAgICAvLyBGSVggKDAuMDU4NjU4MjgzODE3KTsKKyNkZWZpbmUgUk5ENiA1MTIgICAvLyBGSVggKDAuMjUpOworI2RlZmluZSBSTkQ3IDUxMiAgIC8vIEZJWCAoMC4yNSk7CisKK3N0YXRpYyBjb25zdCBpbnQgVEFCMDRbXSA9IHsgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgNDUyMCB9Oworc3RhdGljIGNvbnN0IGludCBUQUIxN1tdID0geyAzMTUyMSwgMjk2OTIsIDI2NzIyLCAyMjcyNSwgMTc4NTUsIDEyMjk5LCA2MjcwIH07CitzdGF0aWMgY29uc3QgaW50IFRBQjI2W10gPSB7IDI5NjkyLCAyNzk2OSwgMjUxNzIsIDIxNDA3LCAxNjgxOSwgMTE1ODUsIDU5MDYgfTsKK3N0YXRpYyBjb25zdCBpbnQgVEFCMzVbXSA9IHsgMjY3MjIsIDI1MTcyLCAyMjY1NCwgMTkyNjYsIDE1MTM3LCAxMDQyNiwgNTMxNSB9OworCitzdGF0aWMgaW50IGlkY3Rfcm93KHNob3J0ICppbiwgY29uc3QgaW50ICpjb25zdCB0YWIsIGludCBybmQpCit7CisgICAgY29uc3QgaW50IGMxID0gdGFiWzBdOworICAgIGNvbnN0IGludCBjMiA9IHRhYlsxXTsKKyAgICBjb25zdCBpbnQgYzMgPSB0YWJbMl07CisgICAgY29uc3QgaW50IGM0ID0gdGFiWzNdOworICAgIGNvbnN0IGludCBjNSA9IHRhYls0XTsKKyAgICBjb25zdCBpbnQgYzYgPSB0YWJbNV07CisgICAgY29uc3QgaW50IGM3ID0gdGFiWzZdOworCisgICAgY29uc3QgaW50IHJpZ2h0ID0gaW5bNV0gfCBpbls2XSB8IGluWzddOworICAgIGNvbnN0IGludCBsZWZ0ICA9IGluWzFdIHwgaW5bMl0gfCBpblszXTsKKyAgICBpZiAoIShyaWdodCB8IGluWzRdKSkgeworICAgICAgICBjb25zdCBpbnQgayA9IGM0ICogaW5bMF0gKyBybmQ7CisgICAgICAgIGlmIChsZWZ0KSB7CisgICAgICAgICAgICBjb25zdCBpbnQgYTAgPSBrICsgYzIgKiBpblsyXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBhMSA9IGsgKyBjNiAqIGluWzJdOworICAgICAgICAgICAgY29uc3QgaW50IGEyID0gayAtIGM2ICogaW5bMl07CisgICAgICAgICAgICBjb25zdCBpbnQgYTMgPSBrIC0gYzIgKiBpblsyXTsKKworICAgICAgICAgICAgY29uc3QgaW50IGIwID0gYzEgKiBpblsxXSArIGMzICogaW5bM107CisgICAgICAgICAgICBjb25zdCBpbnQgYjEgPSBjMyAqIGluWzFdIC0gYzcgKiBpblszXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBiMiA9IGM1ICogaW5bMV0gLSBjMSAqIGluWzNdOworICAgICAgICAgICAgY29uc3QgaW50IGIzID0gYzcgKiBpblsxXSAtIGM1ICogaW5bM107CisKKyAgICAgICAgICAgIGluWzBdID0gKGEwICsgYjApID4+IFJPV19TSElGVDsKKyAgICAgICAgICAgIGluWzFdID0gKGExICsgYjEpID4+IFJPV19TSElGVDsKKyAgICAgICAgICAgIGluWzJdID0gKGEyICsgYjIpID4+IFJPV19TSElGVDsKKyAgICAgICAgICAgIGluWzNdID0gKGEzICsgYjMpID4+IFJPV19TSElGVDsKKyAgICAgICAgICAgIGluWzRdID0gKGEzIC0gYjMpID4+IFJPV19TSElGVDsKKyAgICAgICAgICAgIGluWzVdID0gKGEyIC0gYjIpID4+IFJPV19TSElGVDsKKyAgICAgICAgICAgIGluWzZdID0gKGExIC0gYjEpID4+IFJPV19TSElGVDsKKyAgICAgICAgICAgIGluWzddID0gKGEwIC0gYjApID4+IFJPV19TSElGVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBhMCA9IGsgPj4gUk9XX1NISUZUOworICAgICAgICAgICAgaWYgKGEwKSB7CisgICAgICAgICAgICAgICAgaW5bMF0gPQorICAgICAgICAgICAgICAgIGluWzFdID0KKyAgICAgICAgICAgICAgICBpblsyXSA9CisgICAgICAgICAgICAgICAgaW5bM10gPQorICAgICAgICAgICAgICAgIGluWzRdID0KKyAgICAgICAgICAgICAgICBpbls1XSA9CisgICAgICAgICAgICAgICAgaW5bNl0gPQorICAgICAgICAgICAgICAgIGluWzddID0gYTA7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIShsZWZ0IHwgcmlnaHQpKSB7CisgICAgICAgIGNvbnN0IGludCBhMCA9IChybmQgKyBjNCAqIChpblswXSArIGluWzRdKSkgPj4gUk9XX1NISUZUOworICAgICAgICBjb25zdCBpbnQgYTEgPSAocm5kICsgYzQgKiAoaW5bMF0gLSBpbls0XSkpID4+IFJPV19TSElGVDsKKworICAgICAgICBpblswXSA9IGEwOworICAgICAgICBpblszXSA9IGEwOworICAgICAgICBpbls0XSA9IGEwOworICAgICAgICBpbls3XSA9IGEwOworICAgICAgICBpblsxXSA9IGExOworICAgICAgICBpblsyXSA9IGExOworICAgICAgICBpbls1XSA9IGExOworICAgICAgICBpbls2XSA9IGExOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBrICA9IGM0ICogaW5bMF0gKyBybmQ7CisgICAgICAgIGNvbnN0IGludCBhMCA9IGsgKyBjMiAqIGluWzJdICsgYzQgKiBpbls0XSArIGM2ICogaW5bNl07CisgICAgICAgIGNvbnN0IGludCBhMSA9IGsgKyBjNiAqIGluWzJdIC0gYzQgKiBpbls0XSAtIGMyICogaW5bNl07CisgICAgICAgIGNvbnN0IGludCBhMiA9IGsgLSBjNiAqIGluWzJdIC0gYzQgKiBpbls0XSArIGMyICogaW5bNl07CisgICAgICAgIGNvbnN0IGludCBhMyA9IGsgLSBjMiAqIGluWzJdICsgYzQgKiBpbls0XSAtIGM2ICogaW5bNl07CisKKyAgICAgICAgY29uc3QgaW50IGIwID0gYzEgKiBpblsxXSArIGMzICogaW5bM10gKyBjNSAqIGluWzVdICsgYzcgKiBpbls3XTsKKyAgICAgICAgY29uc3QgaW50IGIxID0gYzMgKiBpblsxXSAtIGM3ICogaW5bM10gLSBjMSAqIGluWzVdIC0gYzUgKiBpbls3XTsKKyAgICAgICAgY29uc3QgaW50IGIyID0gYzUgKiBpblsxXSAtIGMxICogaW5bM10gKyBjNyAqIGluWzVdICsgYzMgKiBpbls3XTsKKyAgICAgICAgY29uc3QgaW50IGIzID0gYzcgKiBpblsxXSAtIGM1ICogaW5bM10gKyBjMyAqIGluWzVdIC0gYzEgKiBpbls3XTsKKworICAgICAgICBpblswXSA9IChhMCArIGIwKSA+PiBST1dfU0hJRlQ7CisgICAgICAgIGluWzFdID0gKGExICsgYjEpID4+IFJPV19TSElGVDsKKyAgICAgICAgaW5bMl0gPSAoYTIgKyBiMikgPj4gUk9XX1NISUZUOworICAgICAgICBpblszXSA9IChhMyArIGIzKSA+PiBST1dfU0hJRlQ7CisgICAgICAgIGluWzRdID0gKGEzIC0gYjMpID4+IFJPV19TSElGVDsKKyAgICAgICAgaW5bNV0gPSAoYTIgLSBiMikgPj4gUk9XX1NISUZUOworICAgICAgICBpbls2XSA9IChhMSAtIGIxKSA+PiBST1dfU0hJRlQ7CisgICAgICAgIGluWzddID0gKGEwIC0gYjApID4+IFJPV19TSElGVDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgVEFOMSAgMHgzMkVDCisjZGVmaW5lIFRBTjIgIDB4NkEwQQorI2RlZmluZSBUQU4zICAweEFCMEUKKyNkZWZpbmUgU1FSVDIgMHg1QTgyCisKKyNkZWZpbmUgTVVMVChjLCB4LCBuKSAgKCgoYykgKiAoeCkpID4+IChuKSkKKy8vIDEyYiB2ZXJzaW9uID0+ICNkZWZpbmUgTVVMVChjLHgsIG4pICAoKCgoYykgPj4gMykgKiAoeCkpID4+ICgobikgLSAzKSkKKy8vIDEyYiB6ZXJvLXRlc3RpbmcgdmVyc2lvbjoKKworI2RlZmluZSBCVVRURVJGTFkoYSwgYiwgdG1wKSAgICAgXAorICAgICh0bXApID0gKGEpICsgKGIpOyAgICAgICAgICAgXAorICAgIChiKSAgID0gKGEpIC0gKGIpOyAgICAgICAgICAgXAorICAgIChhKSAgID0gKHRtcCkKKworI2RlZmluZSBMT0FEX0JVVFRFUkZMWShtMSwgbTIsIGEsIGIsIHRtcCwgcykgICBcCisgICAgKG0xKSA9IChzKVsoYSldICsgKHMpWyhiKV07ICAgICAgICAgICAgICAgIFwKKyAgICAobTIpID0gKHMpWyhhKV0gLSAocylbKGIpXQorCitzdGF0aWMgdm9pZCBpZGN0X2NvbF84KHNob3J0ICpjb25zdCBpbikKK3sKKyAgICBpbnQgbW0wLCBtbTEsIG1tMiwgbW0zLCBtbTQsIG1tNSwgbW02LCBtbTcsIHNwaWxsOworCisgICAgLy8gb2RkCisKKyAgICBtbTQgPSAoaW50KSBpbls3ICogOF07CisgICAgbW01ID0gKGludCkgaW5bNSAqIDhdOworICAgIG1tNiA9IChpbnQpIGluWzMgKiA4XTsKKyAgICBtbTcgPSAoaW50KSBpblsxICogOF07CisKKyAgICBtbTAgPSBNVUxUKFRBTjEsIG1tNCwgMTYpICsgbW03OworICAgIG1tMSA9IE1VTFQoVEFOMSwgbW03LCAxNikgLSBtbTQ7CisgICAgbW0yID0gTVVMVChUQU4zLCBtbTUsIDE2KSArIG1tNjsKKyAgICBtbTMgPSBNVUxUKFRBTjMsIG1tNiwgMTYpIC0gbW01OworCisgICAgbW03ID0gbW0wICsgbW0yOworICAgIG1tNCA9IG1tMSAtIG1tMzsKKyAgICBtbTAgPSBtbTAgLSBtbTI7CisgICAgbW0xID0gbW0xICsgbW0zOworICAgIG1tNiA9IG1tMCArIG1tMTsKKyAgICBtbTUgPSBtbTAgLSBtbTE7CisgICAgbW01ID0gMiAqIE1VTFQoU1FSVDIsIG1tNSwgMTYpOyAvLyAyKnNxcnQyCisgICAgbW02ID0gMiAqIE1VTFQoU1FSVDIsIG1tNiwgMTYpOyAvLyBXYXRjaCBvdXQ6IHByZWNpc2lvbiBsb3NzIGJ1dCBkb25lIHRvIG1hdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG11bGh3IHVzZWQgaW4gTU1YL01NWEVYVC9TU0UyIHZlcnNpb25zCisKKyAgICAvLyBldmVuCisKKyAgICBtbTEgPSAoaW50KSBpblsyICogOF07CisgICAgbW0yID0gKGludCkgaW5bNiAqIDhdOworICAgIG1tMyA9IE1VTFQoVEFOMiwgbW0yLCAxNikgKyBtbTE7CisgICAgbW0yID0gTVVMVChUQU4yLCBtbTEsIDE2KSAtIG1tMjsKKworICAgIExPQURfQlVUVEVSRkxZKG1tMCwgbW0xLCAwICogOCwgNCAqIDgsIHNwaWxsLCBpbik7CisKKyAgICBCVVRURVJGTFkobW0wLCBtbTMsIHNwaWxsKTsKKyAgICBCVVRURVJGTFkobW0wLCBtbTcsIHNwaWxsKTsKKyAgICBpbls4ICogMF0gPSAoaW50MTZfdCkgKG1tMCA+PiBDT0xfU0hJRlQpOworICAgIGluWzggKiA3XSA9IChpbnQxNl90KSAobW03ID4+IENPTF9TSElGVCk7CisgICAgQlVUVEVSRkxZKG1tMywgbW00LCBtbTApOworICAgIGluWzggKiAzXSA9IChpbnQxNl90KSAobW0zID4+IENPTF9TSElGVCk7CisgICAgaW5bOCAqIDRdID0gKGludDE2X3QpIChtbTQgPj4gQ09MX1NISUZUKTsKKworICAgIEJVVFRFUkZMWShtbTEsIG1tMiwgbW0wKTsKKyAgICBCVVRURVJGTFkobW0xLCBtbTYsIG1tMCk7CisgICAgaW5bOCAqIDFdID0gKGludDE2X3QpIChtbTEgPj4gQ09MX1NISUZUKTsKKyAgICBpbls4ICogNl0gPSAoaW50MTZfdCkgKG1tNiA+PiBDT0xfU0hJRlQpOworICAgIEJVVFRFUkZMWShtbTIsIG1tNSwgbW0wKTsKKyAgICBpbls4ICogMl0gPSAoaW50MTZfdCkgKG1tMiA+PiBDT0xfU0hJRlQpOworICAgIGluWzggKiA1XSA9IChpbnQxNl90KSAobW01ID4+IENPTF9TSElGVCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkY3RfY29sXzQoc2hvcnQgKmNvbnN0IGluKQoreworICAgIGludCBtbTAsIG1tMSwgbW0yLCBtbTMsIG1tNCwgbW01LCBtbTYsIG1tNywgc3BpbGw7CisKKyAgICAvLyBvZGQKKworICAgIG1tMCA9IChpbnQpIGluWzEgKiA4XTsKKyAgICBtbTIgPSAoaW50KSBpblszICogOF07CisKKyAgICBtbTEgPSBNVUxUKFRBTjEsIG1tMCwgMTYpOworICAgIG1tMyA9IE1VTFQoVEFOMywgbW0yLCAxNik7CisKKyAgICBtbTcgPSBtbTAgKyBtbTI7CisgICAgbW00ID0gbW0xIC0gbW0zOworICAgIG1tMCA9IG1tMCAtIG1tMjsKKyAgICBtbTEgPSBtbTEgKyBtbTM7CisgICAgbW02ID0gbW0wICsgbW0xOworICAgIG1tNSA9IG1tMCAtIG1tMTsKKyAgICBtbTYgPSAyICogTVVMVChTUVJUMiwgbW02LCAxNik7IC8vIDIqc3FydDIKKyAgICBtbTUgPSAyICogTVVMVChTUVJUMiwgbW01LCAxNik7CisKKyAgICAvLyBldmVuCisKKyAgICBtbTAgPSBtbTEgPSAoaW50KSBpblswICogOF07CisgICAgbW0zID0gKGludCkgaW5bMiAqIDhdOworICAgIG1tMiA9IE1VTFQoVEFOMiwgbW0zLCAxNik7CisKKyAgICBCVVRURVJGTFkobW0wLCBtbTMsIHNwaWxsKTsKKyAgICBCVVRURVJGTFkobW0wLCBtbTcsIHNwaWxsKTsKKyAgICBpbls4ICogMF0gPSAoaW50MTZfdCkgKG1tMCA+PiBDT0xfU0hJRlQpOworICAgIGluWzggKiA3XSA9IChpbnQxNl90KSAobW03ID4+IENPTF9TSElGVCk7CisgICAgQlVUVEVSRkxZKG1tMywgbW00LCBtbTApOworICAgIGluWzggKiAzXSA9IChpbnQxNl90KSAobW0zID4+IENPTF9TSElGVCk7CisgICAgaW5bOCAqIDRdID0gKGludDE2X3QpIChtbTQgPj4gQ09MX1NISUZUKTsKKworICAgIEJVVFRFUkZMWShtbTEsIG1tMiwgbW0wKTsKKyAgICBCVVRURVJGTFkobW0xLCBtbTYsIG1tMCk7CisgICAgaW5bOCAqIDFdID0gKGludDE2X3QpIChtbTEgPj4gQ09MX1NISUZUKTsKKyAgICBpbls4ICogNl0gPSAoaW50MTZfdCkgKG1tNiA+PiBDT0xfU0hJRlQpOworICAgIEJVVFRFUkZMWShtbTIsIG1tNSwgbW0wKTsKKyAgICBpbls4ICogMl0gPSAoaW50MTZfdCkgKG1tMiA+PiBDT0xfU0hJRlQpOworICAgIGluWzggKiA1XSA9IChpbnQxNl90KSAobW01ID4+IENPTF9TSElGVCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkY3RfY29sXzMoc2hvcnQgKmNvbnN0IGluKQoreworICAgIGludCBtbTAsIG1tMSwgbW0yLCBtbTMsIG1tNCwgbW01LCBtbTYsIG1tNywgc3BpbGw7CisKKyAgICAvLyBvZGQKKworICAgIG1tNyA9IChpbnQpIGluWzEgKiA4XTsKKyAgICBtbTQgPSBNVUxUKFRBTjEsIG1tNywgMTYpOworCisgICAgbW02ID0gbW03ICsgbW00OworICAgIG1tNSA9IG1tNyAtIG1tNDsKKyAgICBtbTYgPSAyICogTVVMVChTUVJUMiwgbW02LCAxNik7IC8vIDIqc3FydDIKKyAgICBtbTUgPSAyICogTVVMVChTUVJUMiwgbW01LCAxNik7CisKKyAgICAvLyBldmVuCisKKyAgICBtbTAgPSBtbTEgPSAoaW50KSBpblswICogOF07CisgICAgbW0zID0gKGludCkgaW5bMiAqIDhdOworICAgIG1tMiA9IE1VTFQoVEFOMiwgbW0zLCAxNik7CisKKyAgICBCVVRURVJGTFkobW0wLCBtbTMsIHNwaWxsKTsKKyAgICBCVVRURVJGTFkobW0wLCBtbTcsIHNwaWxsKTsKKyAgICBpbls4ICogMF0gPSAoaW50MTZfdCkgKG1tMCA+PiBDT0xfU0hJRlQpOworICAgIGluWzggKiA3XSA9IChpbnQxNl90KSAobW03ID4+IENPTF9TSElGVCk7CisgICAgQlVUVEVSRkxZKG1tMywgbW00LCBtbTApOworICAgIGluWzggKiAzXSA9IChpbnQxNl90KSAobW0zID4+IENPTF9TSElGVCk7CisgICAgaW5bOCAqIDRdID0gKGludDE2X3QpIChtbTQgPj4gQ09MX1NISUZUKTsKKworICAgIEJVVFRFUkZMWShtbTEsIG1tMiwgbW0wKTsKKyAgICBCVVRURVJGTFkobW0xLCBtbTYsIG1tMCk7CisgICAgaW5bOCAqIDFdID0gKGludDE2X3QpIChtbTEgPj4gQ09MX1NISUZUKTsKKyAgICBpbls4ICogNl0gPSAoaW50MTZfdCkgKG1tNiA+PiBDT0xfU0hJRlQpOworICAgIEJVVFRFUkZMWShtbTIsIG1tNSwgbW0wKTsKKyAgICBpbls4ICogMl0gPSAoaW50MTZfdCkgKG1tMiA+PiBDT0xfU0hJRlQpOworICAgIGluWzggKiA1XSA9IChpbnQxNl90KSAobW01ID4+IENPTF9TSElGVCk7Cit9CisKK3ZvaWQgZmZfeHZpZF9pZGN0KGludDE2X3QgKmNvbnN0IGluKQoreworICAgIGludCBpLCByb3dzID0gMHgwNzsKKworICAgIGlkY3Rfcm93KGluICsgMCAqIDgsIFRBQjA0LCBSTkQwKTsKKyAgICBpZGN0X3JvdyhpbiArIDEgKiA4LCBUQUIxNywgUk5EMSk7CisgICAgaWRjdF9yb3coaW4gKyAyICogOCwgVEFCMjYsIFJORDIpOworICAgIGlmIChpZGN0X3JvdyhpbiArIDMgKiA4LCBUQUIzNSwgUk5EMykpCisgICAgICAgIHJvd3MgfD0gMHgwODsKKyAgICBpZiAoaWRjdF9yb3coaW4gKyA0ICogOCwgVEFCMDQsIFJORDQpKQorICAgICAgICByb3dzIHw9IDB4MTA7CisgICAgaWYgKGlkY3Rfcm93KGluICsgNSAqIDgsIFRBQjM1LCBSTkQ1KSkKKyAgICAgICAgcm93cyB8PSAweDIwOworICAgIGlmIChpZGN0X3JvdyhpbiArIDYgKiA4LCBUQUIyNiwgUk5ENikpCisgICAgICAgIHJvd3MgfD0gMHg0MDsKKyAgICBpZiAoaWRjdF9yb3coaW4gKyA3ICogOCwgVEFCMTcsIFJORDcpKQorICAgICAgICByb3dzIHw9IDB4ODA7CisKKyAgICBpZiAocm93cyAmIDB4RjApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIGlkY3RfY29sXzgoaW4gKyBpKTsKKyAgICB9IGVsc2UgaWYgKHJvd3MgJiAweDA4KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBpZGN0X2NvbF80KGluICsgaSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIGlkY3RfY29sXzMoaW4gKyBpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHh2aWRfaWRjdF9wdXQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgZmZfeHZpZF9pZGN0KGJsb2NrKTsKKyAgICBmZl9wdXRfcGl4ZWxzX2NsYW1wZWQoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHh2aWRfaWRjdF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgZmZfeHZpZF9pZGN0KGJsb2NrKTsKKyAgICBmZl9hZGRfcGl4ZWxzX2NsYW1wZWQoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl94dmlkX2lkY3RfaW5pdChJRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGNvbnN0IHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoID0gYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPiA4OworCisgICAgaWYgKGhpZ2hfYml0X2RlcHRoIHx8IGF2Y3R4LT5sb3dyZXMgfHwKKyAgICAgICAgIShhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfQVVUTyB8fAorICAgICAgICAgIGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9YVklEKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9YVklEKSB7CisgICAgICAgIGMtPmlkY3RfcHV0ICA9IHh2aWRfaWRjdF9wdXQ7CisgICAgICAgIGMtPmlkY3RfYWRkICA9IHh2aWRfaWRjdF9hZGQ7CisgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX3h2aWRfaWRjdDsKKyAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX05PTkU7CisgICAgfQorCisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl94dmlkX2lkY3RfaW5pdF94ODYoYywgYXZjdHgsIGhpZ2hfYml0X2RlcHRoKTsKKworICAgIGZmX2luaXRfc2NhbnRhYmxlX3Blcm11dGF0aW9uKGMtPmlkY3RfcGVybXV0YXRpb24sIGMtPnBlcm1fdHlwZSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94dmlkaWRjdC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMveHZpZGlkY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RmYmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveHZpZGlkY3QuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19YVklESURDVF9ICisjZGVmaW5lIEFWQ09ERUNfWFZJRElEQ1RfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgorCit2b2lkIGZmX3h2aWRfaWRjdChpbnQxNl90ICpjb25zdCBpbik7CisKK3ZvaWQgZmZfeHZpZF9pZGN0X2luaXQoSURDVERTUENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK3ZvaWQgZmZfeHZpZF9pZGN0X2luaXRfeDg2KElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoaWdoX2JpdF9kZXB0aCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1hWSURJRENUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3h2bWMuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3h2bWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmUxODdjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveHZtYy5oCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEl2YW4gS2FsdmFjaGV2CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19YVk1DX0gKKyNkZWZpbmUgQVZDT0RFQ19YVk1DX0gKKworLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbGF2Y19jb2RlY19od2FjY2VsX3h2bWMKKyAqIFB1YmxpYyBsaWJhdmNvZGVjIFh2TUMgaGVhZGVyLgorICovCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9Ydk1DLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKKy8qKgorICogQGRlZmdyb3VwIGxhdmNfY29kZWNfaHdhY2NlbF94dm1jIFh2TUMKKyAqIEBpbmdyb3VwIGxhdmNfY29kZWNfaHdhY2NlbAorICoKKyAqIEB7CisgKi8KKworI2RlZmluZSBBVl9YVk1DX0lEICAgICAgICAgICAgICAgICAgICAweDFEQzcxMUMwICAvKio8IHNwZWNpYWwgdmFsdWUgdG8gZW5zdXJlIHRoYXQgcmVndWxhciBwaXhlbCByb3V0aW5lcyBoYXZlbid0IGNvcnJ1cHRlZCB0aGUgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG51bWJlciBpcyAxMzM3IHNwZWFrIGZvciB0aGUgbGV0dGVycyBJRENUIE1DbyAobW90aW9uIGNvbXBlbnNhdGlvbikgKi8KKworYXR0cmlidXRlX2RlcHJlY2F0ZWQgc3RydWN0IHh2bWNfcGl4X2ZtdCB7CisgICAgLyoqIFRoZSBmaWVsZCBjb250YWlucyB0aGUgc3BlY2lhbCBjb25zdGFudCB2YWx1ZSBBVl9YVk1DX0lELgorICAgICAgICBJdCBpcyB1c2VkIGFzIGEgdGVzdCB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjb3JyZWN0bHkgdXNlcyB0aGUgQVBJLAorICAgICAgICBhbmQgdGhhdCB0aGVyZSBpcyBubyBjb3JydXB0aW9uIGNhdXNlZCBieSBwaXhlbCByb3V0aW5lcy4KKyAgICAgICAgLSBhcHBsaWNhdGlvbiAtIHNldCBkdXJpbmcgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgLSBsaWJhdmNvZGVjICAtIHVuY2hhbmdlZAorICAgICovCisgICAgaW50ICAgICAgICAgICAgIHh2bWNfaWQ7CisKKyAgICAvKiogUG9pbnRlciB0byB0aGUgYmxvY2sgYXJyYXkgYWxsb2NhdGVkIGJ5IFh2TUNDcmVhdGVCbG9ja3MoKS4KKyAgICAgICAgVGhlIGFycmF5IGhhcyB0byBiZSBmcmVlZCBieSBYdk1DRGVzdHJveUJsb2NrcygpLgorICAgICAgICBFYWNoIGdyb3VwIG9mIDY0IHZhbHVlcyByZXByZXNlbnRzIG9uZSBkYXRhIGJsb2NrIG9mIGRpZmZlcmVudGlhbAorICAgICAgICBwaXhlbCBpbmZvcm1hdGlvbiAoaW4gTW9DbyBtb2RlKSBvciBjb2VmZmljaWVudHMgZm9yIElEQ1QuCisgICAgICAgIC0gYXBwbGljYXRpb24gLSBzZXQgdGhlIHBvaW50ZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uCisgICAgICAgIC0gbGliYXZjb2RlYyAgLSBmaWxscyBjb2VmZmljaWVudHMvcGl4ZWwgZGF0YSBpbnRvIHRoZSBhcnJheQorICAgICovCisgICAgc2hvcnQqICAgICAgICAgIGRhdGFfYmxvY2tzOworCisgICAgLyoqIFBvaW50ZXIgdG8gdGhlIG1hY3JvYmxvY2sgZGVzY3JpcHRpb24gYXJyYXkgYWxsb2NhdGVkIGJ5CisgICAgICAgIFh2TUNDcmVhdGVNYWNyb0Jsb2NrcygpIGFuZCBmcmVlZCBieSBYdk1DRGVzdHJveU1hY3JvQmxvY2tzKCkuCisgICAgICAgIC0gYXBwbGljYXRpb24gLSBzZXQgdGhlIHBvaW50ZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uCisgICAgICAgIC0gbGliYXZjb2RlYyAgLSBmaWxscyBkZXNjcmlwdGlvbiBkYXRhIGludG8gdGhlIGFycmF5CisgICAgKi8KKyAgICBYdk1DTWFjcm9CbG9jayogbXZfYmxvY2tzOworCisgICAgLyoqIE51bWJlciBvZiBtYWNyb2Jsb2NrIGRlc2NyaXB0aW9ucyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gdGhlIG12X2Jsb2NrcworICAgICAgICBhcnJheS4KKyAgICAgICAgLSBhcHBsaWNhdGlvbiAtIHNldCBkdXJpbmcgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgLSBsaWJhdmNvZGVjICAtIHVuY2hhbmdlZAorICAgICovCisgICAgaW50ICAgICAgICAgICAgIGFsbG9jYXRlZF9tdl9ibG9ja3M7CisKKyAgICAvKiogTnVtYmVyIG9mIGJsb2NrcyB0aGF0IGNhbiBiZSBzdG9yZWQgYXQgb25jZSBpbiB0aGUgZGF0YV9ibG9ja3MgYXJyYXkuCisgICAgICAgIC0gYXBwbGljYXRpb24gLSBzZXQgZHVyaW5nIGluaXRpYWxpemF0aW9uCisgICAgICAgIC0gbGliYXZjb2RlYyAgLSB1bmNoYW5nZWQKKyAgICAqLworICAgIGludCAgICAgICAgICAgICBhbGxvY2F0ZWRfZGF0YV9ibG9ja3M7CisKKyAgICAvKiogSW5kaWNhdGUgdGhhdCB0aGUgaGFyZHdhcmUgd291bGQgaW50ZXJwcmV0IGRhdGFfYmxvY2tzIGFzIElEQ1QKKyAgICAgICAgY29lZmZpY2llbnRzIGFuZCBwZXJmb3JtIElEQ1Qgb24gdGhlbS4KKyAgICAgICAgLSBhcHBsaWNhdGlvbiAtIHNldCBkdXJpbmcgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgLSBsaWJhdmNvZGVjICAtIHVuY2hhbmdlZAorICAgICovCisgICAgaW50ICAgICAgICAgICAgIGlkY3Q7CisKKyAgICAvKiogSW4gTW9DbyBtb2RlIGl0IGluZGljYXRlcyB0aGF0IGludHJhIG1hY3JvYmxvY2tzIGFyZSBhc3N1bWVkIHRvIGJlIGluCisgICAgICAgIHVuc2lnbmVkIGZvcm1hdDsgc2FtZSBhcyB0aGUgWFZNQ19JTlRSQV9VTlNJR05FRCBmbGFnLgorICAgICAgICAtIGFwcGxpY2F0aW9uIC0gc2V0IGR1cmluZyBpbml0aWFsaXphdGlvbgorICAgICAgICAtIGxpYmF2Y29kZWMgIC0gdW5jaGFuZ2VkCisgICAgKi8KKyAgICBpbnQgICAgICAgICAgICAgdW5zaWduZWRfaW50cmE7CisKKyAgICAvKiogUG9pbnRlciB0byB0aGUgc3VyZmFjZSBhbGxvY2F0ZWQgYnkgWHZNQ0NyZWF0ZVN1cmZhY2UoKS4KKyAgICAgICAgSXQgaGFzIHRvIGJlIGZyZWVkIGJ5IFh2TUNEZXN0cm95U3VyZmFjZSgpIG9uIGFwcGxpY2F0aW9uIGV4aXQuCisgICAgICAgIEl0IGlkZW50aWZpZXMgdGhlIGZyYW1lIGFuZCBpdHMgc3RhdGUgb24gdGhlIHZpZGVvIGhhcmR3YXJlLgorICAgICAgICAtIGFwcGxpY2F0aW9uIC0gc2V0IGR1cmluZyBpbml0aWFsaXphdGlvbgorICAgICAgICAtIGxpYmF2Y29kZWMgIC0gdW5jaGFuZ2VkCisgICAgKi8KKyAgICBYdk1DU3VyZmFjZSogICAgcF9zdXJmYWNlOworCisvKiogU2V0IGJ5IHRoZSBkZWNvZGVyIGJlZm9yZSBjYWxsaW5nIGZmX2RyYXdfaG9yaXpfYmFuZCgpLAorICAgIG5lZWRlZCBieSB0aGUgWHZNQ1JlbmRlclN1cmZhY2UgZnVuY3Rpb24uICovCisvL0B7CisgICAgLyoqIFBvaW50ZXIgdG8gdGhlIHN1cmZhY2UgdXNlZCBhcyBwYXN0IHJlZmVyZW5jZQorICAgICAgICAtIGFwcGxpY2F0aW9uIC0gdW5jaGFuZ2VkCisgICAgICAgIC0gbGliYXZjb2RlYyAgLSBzZXQKKyAgICAqLworICAgIFh2TUNTdXJmYWNlKiAgICBwX3Bhc3Rfc3VyZmFjZTsKKworICAgIC8qKiBQb2ludGVyIHRvIHRoZSBzdXJmYWNlIHVzZWQgYXMgZnV0dXJlIHJlZmVyZW5jZQorICAgICAgICAtIGFwcGxpY2F0aW9uIC0gdW5jaGFuZ2VkCisgICAgICAgIC0gbGliYXZjb2RlYyAgLSBzZXQKKyAgICAqLworICAgIFh2TUNTdXJmYWNlKiAgICBwX2Z1dHVyZV9zdXJmYWNlOworCisgICAgLyoqIHRvcC9ib3R0b20gZmllbGQgb3IgZnJhbWUKKyAgICAgICAgLSBhcHBsaWNhdGlvbiAtIHVuY2hhbmdlZAorICAgICAgICAtIGxpYmF2Y29kZWMgIC0gc2V0CisgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgcGljdHVyZV9zdHJ1Y3R1cmU7CisKKyAgICAvKiogWFZNQ19TRUNPTkRfRklFTEQgLSAxc3Qgb3IgMm5kIGZpZWxkIGluIHRoZSBzZXF1ZW5jZQorICAgICAgICAtIGFwcGxpY2F0aW9uIC0gdW5jaGFuZ2VkCisgICAgICAgIC0gbGliYXZjb2RlYyAgLSBzZXQKKyAgICAqLworICAgIHVuc2lnbmVkIGludCAgICBmbGFnczsKKy8vfUAKKworICAgIC8qKiBOdW1iZXIgb2YgbWFjcm9ibG9jayBkZXNjcmlwdGlvbnMgaW4gdGhlIG12X2Jsb2NrcyBhcnJheQorICAgICAgICB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHBhc3NlZCB0byB0aGUgaGFyZHdhcmUuCisgICAgICAgIC0gYXBwbGljYXRpb24gLSB6ZXJvZXMgaXQgb24gZ2V0X2J1ZmZlcigpLgorICAgICAgICAgICAgICAgICAgICAgICAgQSBzdWNjZXNzZnVsIGZmX2RyYXdfaG9yaXpfYmFuZCgpIG1heSBpbmNyZW1lbnQgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZmlsbGVkX21iX2Jsb2NrX251bSBvciB6ZXJvIGJvdGguCisgICAgICAgIC0gbGliYXZjb2RlYyAgLSB1bmNoYW5nZWQKKyAgICAqLworICAgIGludCAgICAgICAgICAgICBzdGFydF9tdl9ibG9ja3NfbnVtOworCisgICAgLyoqIE51bWJlciBvZiBuZXcgbWFjcm9ibG9jayBkZXNjcmlwdGlvbnMgaW4gdGhlIG12X2Jsb2NrcyBhcnJheSAoYWZ0ZXIKKyAgICAgICAgc3RhcnRfbXZfYmxvY2tzX251bSkgdGhhdCBhcmUgZmlsbGVkIGJ5IGxpYmF2Y29kZWMgYW5kIGhhdmUgdG8gYmUKKyAgICAgICAgcGFzc2VkIHRvIHRoZSBoYXJkd2FyZS4KKyAgICAgICAgLSBhcHBsaWNhdGlvbiAtIHplcm9lcyBpdCBvbiBnZXRfYnVmZmVyKCkgb3IgYWZ0ZXIgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgICAgICAgICAgICAgZmZfZHJhd19ob3Jpel9iYW5kKCkuCisgICAgICAgIC0gbGliYXZjb2RlYyAgLSBpbmNyZW1lbnQgd2l0aCBvbmUgb2YgZWFjaCBzdG9yZWQgTUIKKyAgICAqLworICAgIGludCAgICAgICAgICAgICBmaWxsZWRfbXZfYmxvY2tzX251bTsKKworICAgIC8qKiBOdW1iZXIgb2YgdGhlIG5leHQgZnJlZSBkYXRhIGJsb2NrOyBvbmUgZGF0YSBibG9jayBjb25zaXN0cyBvZgorICAgICAgICA2NCBzaG9ydCB2YWx1ZXMgaW4gdGhlIGRhdGFfYmxvY2tzIGFycmF5LgorICAgICAgICBBbGwgYmxvY2tzIGJlZm9yZSB0aGlzIG9uZSBoYXZlIGFscmVhZHkgYmVlbiBjbGFpbWVkIGJ5IHBsYWNpbmcgdGhlaXIKKyAgICAgICAgcG9zaXRpb24gaW50byB0aGUgY29ycmVzcG9uZGluZyBibG9jayBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZmllbGQsCisgICAgICAgIHRoYXQgYXJlIHBhcnQgb2YgdGhlIG12X2Jsb2NrcyBhcnJheS4KKyAgICAgICAgLSBhcHBsaWNhdGlvbiAtIHplcm9lcyBpdCBvbiBnZXRfYnVmZmVyKCkuCisgICAgICAgICAgICAgICAgICAgICAgICBBIHN1Y2Nlc3NmdWwgZmZfZHJhd19ob3Jpel9iYW5kKCkgbWF5IHplcm8gaXQgdG9nZXRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggc3RhcnRfbWJfYmxvY2tzX251bS4KKyAgICAgICAgLSBsaWJhdmNvZGVjICAtIGVhY2ggZGVjb2RlZCBtYWNyb2Jsb2NrIGluY3JlYXNlcyBpdCBieSB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICBvZiBjb2RlZCBibG9ja3MgaXQgY29udGFpbnMuCisgICAgKi8KKyAgICBpbnQgICAgICAgICAgICAgbmV4dF9mcmVlX2RhdGFfYmxvY2tfbnVtOworfTsKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBVkNPREVDX1hWTUNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveHZtY19pbnRlcm5hbC5oIGIvZmZtcGVnL2xpYmF2Y29kZWMveHZtY19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjVlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94dm1jX2ludGVybmFsLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIFhWaWRlbyBNb3Rpb24gQ29tcGVuc2F0aW9uIGludGVybmFsIGZ1bmN0aW9ucworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfWFZNQ19JTlRFUk5BTF9ICisjZGVmaW5lIEFWQ09ERUNfWFZNQ19JTlRFUk5BTF9ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCit2b2lkIGZmX3h2bWNfaW5pdF9ibG9jayhNcGVnRW5jQ29udGV4dCAqcyk7Cit2b2lkIGZmX3h2bWNfcGFja19wYmxvY2tzKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgY2JwKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfWFZNQ19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94d2QuaCBiL2ZmbXBlZy9saWJhdmNvZGVjL3h3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDYwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94d2QuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogWFdEIGltYWdlIGZvcm1hdAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1hXRF9ICisjZGVmaW5lIEFWQ09ERUNfWFdEX0gKKworI2RlZmluZSBYV0RfVkVSU0lPTiAgICAgICAgIDcKKyNkZWZpbmUgWFdEX0hFQURFUl9TSVpFICAgICAxMDAKKyNkZWZpbmUgWFdEX0NNQVBfU0laRSAgICAgICAxMgorCisjZGVmaW5lIFhXRF9YWV9CSVRNQVAgICAgICAgMAorI2RlZmluZSBYV0RfWFlfUElYTUFQICAgICAgIDEKKyNkZWZpbmUgWFdEX1pfUElYTUFQICAgICAgICAyCisKKyNkZWZpbmUgWFdEX1NUQVRJQ19HUkFZICAgICAwCisjZGVmaW5lIFhXRF9HUkFZX1NDQUxFICAgICAgMQorI2RlZmluZSBYV0RfU1RBVElDX0NPTE9SICAgIDIKKyNkZWZpbmUgWFdEX1BTRVVET19DT0xPUiAgICAzCisjZGVmaW5lIFhXRF9UUlVFX0NPTE9SICAgICAgNAorI2RlZmluZSBYV0RfRElSRUNUX0NPTE9SICAgIDUKKworI2VuZGlmIC8qIEFWQ09ERUNfWFdEX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3h3ZGRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveHdkZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkZmRhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3h3ZGRlYy5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogWFdEIGltYWdlIGZvcm1hdAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAieHdkLmgiCisKK3N0YXRpYyBpbnQgeHdkX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpwID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgaSwgcmV0LCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIHVpbnQzMl90IHZlcnNpb24sIGhlYWRlcl9zaXplLCB2Y2xhc3MsIG5jb2xvcnM7CisgICAgdWludDMyX3QgeG9mZnNldCwgYmUsIGJwcCwgbHNpemUsIHJzaXplOworICAgIHVpbnQzMl90IHBpeGZvcm1hdCwgcGl4ZGVwdGgsIGJ1bml0LCBiaXRvcmRlciwgYnBhZDsKKyAgICB1aW50MzJfdCByZ2JbM107CisgICAgdWludDhfdCAqcHRyOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgaWYgKGJ1Zl9zaXplIDwgWFdEX0hFQURFUl9TSVpFKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBoZWFkZXJfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOworCisgICAgdmVyc2lvbiA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOworICAgIGlmICh2ZXJzaW9uICE9IFhXRF9WRVJTSU9OKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgdmVyc2lvblxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChidWZfc2l6ZSA8IGhlYWRlcl9zaXplIHx8IGhlYWRlcl9zaXplIDwgWFdEX0hFQURFUl9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBoZWFkZXIgc2l6ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHBpeGZvcm1hdCAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiKTsKKyAgICBwaXhkZXB0aCAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7CisgICAgYXZjdHgtPndpZHRoICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOworICAgIGF2Y3R4LT5oZWlnaHQgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiKTsKKyAgICB4b2Zmc2V0ICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7CisgICAgYmUgICAgICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOworICAgIGJ1bml0ICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiKTsKKyAgICBiaXRvcmRlciAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7CisgICAgYnBhZCAgICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOworICAgIGJwcCAgICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiKTsKKyAgICBsc2l6ZSAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7CisgICAgdmNsYXNzICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOworICAgIHJnYlswXSAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiKTsKKyAgICByZ2JbMV0gICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7CisgICAgcmdiWzJdICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOworICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgOCk7CisgICAgbmNvbG9ycyAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOworICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgaGVhZGVyX3NpemUgLSAoWFdEX0hFQURFUl9TSVpFIC0gMjApKTsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAicGl4Zm9ybWF0ICUiUFJJdTMyIiwgcGl4ZGVwdGggJSJQUkl1MzIiLCBidW5pdCAlIlBSSXUzMiIsIGJpdG9yZGVyICUiUFJJdTMyIiwgYnBhZCAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgIHBpeGZvcm1hdCwgcGl4ZGVwdGgsIGJ1bml0LCBiaXRvcmRlciwgYnBhZCk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICJ2Y2xhc3MgJSJQUkl1MzIiLCBuY29sb3JzICUiUFJJdTMyIiwgYnBwICUiUFJJdTMyIiwgYmUgJSJQUkl1MzIiLCBsc2l6ZSAlIlBSSXUzMiIsIHhvZmZzZXQgJSJQUkl1MzIiXG4iLAorICAgICAgICAgICB2Y2xhc3MsIG5jb2xvcnMsIGJwcCwgYmUsIGxzaXplLCB4b2Zmc2V0KTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgInJlZCAlMCJQUkl4MzIiLCBncmVlbiAlMCJQUkl4MzIiLCBibHVlICUwIlBSSXgzMiJcbiIsCisgICAgICAgICAgIHJnYlswXSwgcmdiWzFdLCByZ2JbMl0pOworCisgICAgaWYgKHBpeGZvcm1hdCA+IFhXRF9aX1BJWE1BUCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgcGl4bWFwIGZvcm1hdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChwaXhkZXB0aCA9PSAwIHx8IHBpeGRlcHRoID4gMzIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHBpeG1hcCBkZXB0aFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICh4b2Zmc2V0KSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInhvZmZzZXQgJSJQUkl1MzIiIiwgeG9mZnNldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoYmUgPiAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBieXRlIG9yZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGJpdG9yZGVyID4gMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgYml0bWFwIGJpdCBvcmRlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChidW5pdCAhPSA4ICYmIGJ1bml0ICE9IDE2ICYmIGJ1bml0ICE9IDMyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBiaXRtYXAgdW5pdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChicGFkICE9IDggJiYgYnBhZCAhPSAxNiAmJiBicGFkICE9IDMyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBiaXRtYXAgc2Nhbi1saW5lIHBhZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChicHAgPT0gMCB8fCBicHAgPiAzMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgYml0cyBwZXIgcGl4ZWxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAobmNvbG9ycyA+IDI1NikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbnVtYmVyIG9mIGVudHJpZXMgaW4gY29sb3JtYXBcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCAwLCBOVUxMKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcnNpemUgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCAqIGJwcCwgYnBhZCkgLyA4OworICAgIGlmIChsc2l6ZSA8IHJzaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBieXRlcyBwZXIgc2Nhbi1saW5lXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCBuY29sb3JzICogWFdEX0NNQVBfU0laRSArIGF2Y3R4LT5oZWlnaHQgKiBsc2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImlucHV0IGJ1ZmZlciB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAocGl4Zm9ybWF0ICE9IFhXRF9aX1BJWE1BUCkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIlBpeG1hcCBmb3JtYXQgJSJQUkl1MzIsIHBpeGZvcm1hdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfTk9ORTsKKyAgICBzd2l0Y2ggKHZjbGFzcykgeworICAgIGNhc2UgWFdEX1NUQVRJQ19HUkFZOgorICAgIGNhc2UgWFdEX0dSQVlfU0NBTEU6CisgICAgICAgIGlmIChicHAgIT0gMSAmJiBicHAgIT0gOCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAocGl4ZGVwdGggPT0gMSkgeworICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX01PTk9XSElURTsKKyAgICAgICAgfSBlbHNlIGlmIChwaXhkZXB0aCA9PSA4KSB7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBYV0RfU1RBVElDX0NPTE9SOgorICAgIGNhc2UgWFdEX1BTRVVET19DT0xPUjoKKyAgICAgICAgaWYgKGJwcCA9PSA4KQorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWFdEX1RSVUVfQ09MT1I6CisgICAgY2FzZSBYV0RfRElSRUNUX0NPTE9SOgorICAgICAgICBpZiAoYnBwICE9IDE2ICYmIGJwcCAhPSAyNCAmJiBicHAgIT0gMzIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKGJwcCA9PSAxNiAmJiBwaXhkZXB0aCA9PSAxNSkgeworICAgICAgICAgICAgaWYgKHJnYlswXSA9PSAweDdDMDAgJiYgcmdiWzFdID09IDB4M0UwICYmIHJnYlsyXSA9PSAweDFGKQorICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gYmUgPyBBVl9QSVhfRk1UX1JHQjU1NUJFIDogQVZfUElYX0ZNVF9SR0I1NTVMRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJnYlswXSA9PSAweDFGICYmIHJnYlsxXSA9PSAweDNFMCAmJiByZ2JbMl0gPT0gMHg3QzAwKQorICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gYmUgPyBBVl9QSVhfRk1UX0JHUjU1NUJFIDogQVZfUElYX0ZNVF9CR1I1NTVMRTsKKyAgICAgICAgfSBlbHNlIGlmIChicHAgPT0gMTYgJiYgcGl4ZGVwdGggPT0gMTYpIHsKKyAgICAgICAgICAgIGlmIChyZ2JbMF0gPT0gMHhGODAwICYmIHJnYlsxXSA9PSAweDdFMCAmJiByZ2JbMl0gPT0gMHgxRikKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IGJlID8gQVZfUElYX0ZNVF9SR0I1NjVCRSA6IEFWX1BJWF9GTVRfUkdCNTY1TEU7CisgICAgICAgICAgICBlbHNlIGlmIChyZ2JbMF0gPT0gMHgxRiAmJiByZ2JbMV0gPT0gMHg3RTAgJiYgcmdiWzJdID09IDB4RjgwMCkKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IGJlID8gQVZfUElYX0ZNVF9CR1I1NjVCRSA6IEFWX1BJWF9GTVRfQkdSNTY1TEU7CisgICAgICAgIH0gZWxzZSBpZiAoYnBwID09IDI0KSB7CisgICAgICAgICAgICBpZiAocmdiWzBdID09IDB4RkYwMDAwICYmIHJnYlsxXSA9PSAweEZGMDAgJiYgcmdiWzJdID09IDB4RkYpCisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBiZSA/IEFWX1BJWF9GTVRfUkdCMjQgOiBBVl9QSVhfRk1UX0JHUjI0OworICAgICAgICAgICAgZWxzZSBpZiAocmdiWzBdID09IDB4RkYgJiYgcmdiWzFdID09IDB4RkYwMCAmJiByZ2JbMl0gPT0gMHhGRjAwMDApCisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBiZSA/IEFWX1BJWF9GTVRfQkdSMjQgOiBBVl9QSVhfRk1UX1JHQjI0OworICAgICAgICB9IGVsc2UgaWYgKGJwcCA9PSAzMikgeworICAgICAgICAgICAgaWYgKHJnYlswXSA9PSAweEZGMDAwMCAmJiByZ2JbMV0gPT0gMHhGRjAwICYmIHJnYlsyXSA9PSAweEZGKQorICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gYmUgPyBBVl9QSVhfRk1UX0FSR0IgOiBBVl9QSVhfRk1UX0JHUkE7CisgICAgICAgICAgICBlbHNlIGlmIChyZ2JbMF0gPT0gMHhGRiAmJiByZ2JbMV0gPT0gMHhGRjAwICYmIHJnYlsyXSA9PSAweEZGMDAwMCkKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IGJlID8gQVZfUElYX0ZNVF9BQkdSIDogQVZfUElYX0ZNVF9SR0JBOworICAgICAgICB9CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgbmNvbG9ycyAqIFhXRF9DTUFQX1NJWkUpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdmlzdWFsIGNsYXNzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBmaWxlOiBicHAgJSJQUkl1MzIiLCBwaXhkZXB0aCAlIlBSSXUzMiIsIHZjbGFzcyAlIlBSSXUzMiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBwLCBwaXhkZXB0aCwgdmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcCwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHAtPmtleV9mcmFtZSA9IDE7CisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7CisgICAgICAgIHVpbnQzMl90ICpkc3QgPSAodWludDMyX3QgKilwLT5kYXRhWzFdOworICAgICAgICB1aW50OF90IHJlZCwgZ3JlZW4sIGJsdWU7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5jb2xvcnM7IGkrKykgeworCisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIDQpOyAvLyBza2lwIGNvbG9ybWFwIGVudHJ5IG51bWJlcgorICAgICAgICAgICAgcmVkICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIDEpOworICAgICAgICAgICAgZ3JlZW4gID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIDEpOworICAgICAgICAgICAgYmx1ZSAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYik7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIDMpOyAvLyBza2lwIGJpdG1hc2sgZmxhZyBhbmQgcGFkZGluZworCisgICAgICAgICAgICBkc3RbaV0gPSByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB0ciA9IHAtPmRhdGFbMF07CisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVydSgmZ2IsIHB0ciwgcnNpemUpOworICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIGxzaXplIC0gcnNpemUpOworICAgICAgICBwdHIgKz0gcC0+bGluZXNpemVbMF07CisgICAgfQorCisgICAgKmdvdF9mcmFtZSAgICAgICA9IDE7CisKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK0FWQ29kZWMgZmZfeHdkX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInh3ZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlhXRCAoWCBXaW5kb3cgRHVtcCkgaW1hZ2UiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfWFdELAorICAgIC5kZWNvZGUgICAgICAgICA9IHh3ZF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy94d2RlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3h3ZGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZmE0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy94d2RlbmMuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIFhXRCBpbWFnZSBmb3JtYXQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAieHdkLmgiCisKKyNkZWZpbmUgV0lORE9XX05BTUUgICAgICAgICAibGF2Y3h3ZGVuYyIKKyNkZWZpbmUgV0lORE9XX05BTUVfU0laRSAgICAxMQorCitzdGF0aWMgaW50IHh3ZF9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpY3QsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCA9IGF2Y3R4LT5waXhfZm10OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4X2ZtdCk7CisgICAgdWludDMyX3QgcGl4ZGVwdGgsIGJwcCwgYnBhZCwgbmNvbG9ycyA9IDAsIGxzaXplLCB2Y2xhc3MsIGJlID0gMDsKKyAgICB1aW50MzJfdCByZ2JbM10gPSB7IDAgfSwgYml0b3JkZXIgPSAwOworICAgIHVpbnQzMl90IGhlYWRlcl9zaXplOworICAgIGludCBpLCBvdXRfc2l6ZSwgcmV0OworICAgIHVpbnQ4X3QgKnB0ciwgKmJ1ZjsKKyAgICBBVkZyYW1lICogY29uc3QgcCA9IChBVkZyYW1lICopcGljdDsKKworICAgIHBpeGRlcHRoID0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGRlc2MpOworICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CRSkKKyAgICAgICAgYmUgPSAxOworICAgIHN3aXRjaCAocGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9BUkdCOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBOgorICAgIGNhc2UgQVZfUElYX0ZNVF9BQkdSOgorICAgICAgICBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0FSR0IgfHwKKyAgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9BQkdSKQorICAgICAgICAgICAgYmUgPSAxOworICAgICAgICBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0FCR1IgfHwKKyAgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0JBKSB7CisgICAgICAgICAgICByZ2JbMF0gPSAweEZGOworICAgICAgICAgICAgcmdiWzFdID0gMHhGRjAwOworICAgICAgICAgICAgcmdiWzJdID0gMHhGRjAwMDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZ2JbMF0gPSAweEZGMDAwMDsKKyAgICAgICAgICAgIHJnYlsxXSA9IDB4RkYwMDsKKyAgICAgICAgICAgIHJnYlsyXSA9IDB4RkY7CisgICAgICAgIH0KKyAgICAgICAgYnBwICAgICAgPSAzMjsKKyAgICAgICAgcGl4ZGVwdGggPSAyNDsKKyAgICAgICAgdmNsYXNzICAgPSBYV0RfVFJVRV9DT0xPUjsKKyAgICAgICAgYnBhZCAgICAgPSAzMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgaWYgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkKKyAgICAgICAgICAgIGJlID0gMTsKKyAgICAgICAgYnBwICAgICAgPSAyNDsKKyAgICAgICAgdmNsYXNzICAgPSBYV0RfVFJVRV9DT0xPUjsKKyAgICAgICAgYnBhZCAgICAgPSAzMjsKKyAgICAgICAgcmdiWzBdICAgPSAweEZGMDAwMDsKKyAgICAgICAgcmdiWzFdICAgPSAweEZGMDA7CisgICAgICAgIHJnYlsyXSAgID0gMHhGRjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU2NUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NjVCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNTY1TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjU2NUJFOgorICAgICAgICBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjU2NUxFIHx8CisgICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfQkdSNTY1QkUpIHsKKyAgICAgICAgICAgIHJnYlswXSA9IDB4MUY7CisgICAgICAgICAgICByZ2JbMV0gPSAweDdFMDsKKyAgICAgICAgICAgIHJnYlsyXSA9IDB4RjgwMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJnYlswXSA9IDB4RjgwMDsKKyAgICAgICAgICAgIHJnYlsxXSA9IDB4N0UwOworICAgICAgICAgICAgcmdiWzJdID0gMHgxRjsKKyAgICAgICAgfQorICAgICAgICBicHAgICAgICA9IDE2OworICAgICAgICB2Y2xhc3MgICA9IFhXRF9UUlVFX0NPTE9SOworICAgICAgICBicGFkICAgICA9IDE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTU1TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU1NUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I1NTVMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNTU1QkU6CisgICAgICAgIGlmIChwaXhfZm10ID09IEFWX1BJWF9GTVRfQkdSNTU1TEUgfHwKKyAgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1I1NTVCRSkgeworICAgICAgICAgICAgcmdiWzBdID0gMHgxRjsKKyAgICAgICAgICAgIHJnYlsxXSA9IDB4M0UwOworICAgICAgICAgICAgcmdiWzJdID0gMHg3QzAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmdiWzBdID0gMHg3QzAwOworICAgICAgICAgICAgcmdiWzFdID0gMHgzRTA7CisgICAgICAgICAgICByZ2JbMl0gPSAweDFGOworICAgICAgICB9CisgICAgICAgIGJwcCAgICAgID0gMTY7CisgICAgICAgIHZjbGFzcyAgID0gWFdEX1RSVUVfQ09MT1I7CisgICAgICAgIGJwYWQgICAgID0gMTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0X0JZVEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjRfQllURToKKyAgICBjYXNlIEFWX1BJWF9GTVRfUEFMODoKKyAgICAgICAgYnBwICAgICAgPSA4OworICAgICAgICB2Y2xhc3MgICA9IFhXRF9QU0VVRE9fQ09MT1I7CisgICAgICAgIGJwYWQgICAgID0gODsKKyAgICAgICAgbmNvbG9ycyAgPSAyNTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICAgICAgYnBwICAgICAgPSA4OworICAgICAgICBicGFkICAgICA9IDg7CisgICAgICAgIHZjbGFzcyAgID0gWFdEX1NUQVRJQ19HUkFZOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfTU9OT1dISVRFOgorICAgICAgICBiZSAgICAgICA9IDE7CisgICAgICAgIGJpdG9yZGVyID0gMTsKKyAgICAgICAgYnBwICAgICAgPSAxOworICAgICAgICBicGFkICAgICA9IDg7CisgICAgICAgIHZjbGFzcyAgID0gWFdEX1NUQVRJQ19HUkFZOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgbHNpemUgICAgICAgPSBGRkFMSUdOKGJwcCAqIGF2Y3R4LT53aWR0aCwgYnBhZCkgLyA4OworICAgIGhlYWRlcl9zaXplID0gWFdEX0hFQURFUl9TSVpFICsgV0lORE9XX05BTUVfU0laRTsKKyAgICBvdXRfc2l6ZSAgICA9IGhlYWRlcl9zaXplICsgbmNvbG9ycyAqIFhXRF9DTUFQX1NJWkUgKyBhdmN0eC0+aGVpZ2h0ICogbHNpemU7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgb3V0X3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgYnVmID0gcGt0LT5kYXRhOworCisgICAgcC0+a2V5X2ZyYW1lID0gMTsKKyAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgaGVhZGVyX3NpemUpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgWFdEX1ZFUlNJT04pOyAgIC8vIGZpbGUgdmVyc2lvbgorICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgWFdEX1pfUElYTUFQKTsgIC8vIHBpeG1hcCBmb3JtYXQKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIHBpeGRlcHRoKTsgICAgICAvLyBwaXhtYXAgZGVwdGggaW4gcGl4ZWxzCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCBhdmN0eC0+d2lkdGgpOyAgLy8gcGl4bWFwIHdpZHRoIGluIHBpeGVscworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgYXZjdHgtPmhlaWdodCk7IC8vIHBpeG1hcCBoZWlnaHQgaW4gcGl4ZWxzCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCAwKTsgICAgICAgICAgICAgLy8gYml0bWFwIHggb2Zmc2V0CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCBiZSk7ICAgICAgICAgICAgLy8gYnl0ZSBvcmRlcgorICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgMzIpOyAgICAgICAgICAgIC8vIGJpdG1hcCB1bml0CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCBiaXRvcmRlcik7ICAgICAgLy8gYml0LW9yZGVyIG9mIGltYWdlIGRhdGEKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIGJwYWQpOyAgICAgICAgICAvLyBiaXRtYXAgc2Nhbi1saW5lIHBhZCBpbiBiaXRzCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCBicHApOyAgICAgICAgICAgLy8gYml0cyBwZXIgcGl4ZWwKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIGxzaXplKTsgICAgICAgICAvLyBieXRlcyBwZXIgc2Nhbi1saW5lCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCB2Y2xhc3MpOyAgICAgICAgLy8gdmlzdWFsIGNsYXNzCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCByZ2JbMF0pOyAgICAgICAgLy8gcmVkIG1hc2sKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIHJnYlsxXSk7ICAgICAgICAvLyBncmVlbiBtYXNrCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCByZ2JbMl0pOyAgICAgICAgLy8gYmx1ZSBtYXNrCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCA4KTsgICAgICAgICAgICAgLy8gc2l6ZSBvZiBlYWNoIGJpdG1hc2sgaW4gYml0cworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgbmNvbG9ycyk7ICAgICAgIC8vIG51bWJlciBvZiBjb2xvcnMKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIG5jb2xvcnMpOyAgICAgICAvLyBudW1iZXIgb2YgZW50cmllcyBpbiBjb2xvciBtYXAKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIGF2Y3R4LT53aWR0aCk7ICAvLyB3aW5kb3cgd2lkdGgKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIGF2Y3R4LT5oZWlnaHQpOyAvLyB3aW5kb3cgaGVpZ2h0CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCAwKTsgICAgICAgICAgICAgLy8gd2luZG93IHVwcGVyIGxlZnQgWCBjb29yZGluYXRlCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCAwKTsgICAgICAgICAgICAgLy8gd2luZG93IHVwcGVyIGxlZnQgWSBjb29yZGluYXRlCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCAwKTsgICAgICAgICAgICAgLy8gd2luZG93IGJvcmRlciB3aWR0aAorICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmYnVmLCBXSU5ET1dfTkFNRSwgV0lORE9XX05BTUVfU0laRSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdWludDhfdCByZWQsIGdyZWVuLCBibHVlOworCisgICAgICAgIHZhbCAgID0gQVZfUk4zMkEocC0+ZGF0YVsxXSArIGkgKiA0KTsKKyAgICAgICAgcmVkICAgPSAodmFsID4+IDE2KSAmIDB4RkY7CisgICAgICAgIGdyZWVuID0gKHZhbCA+PiAgOCkgJiAweEZGOworICAgICAgICBibHVlICA9ICB2YWwgICAgICAgICYgMHhGRjsKKworICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZidWYsIGkpOyAgICAgICAgIC8vIGNvbG9ybWFwIGVudHJ5IG51bWJlcgorICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZidWYsIHJlZCAgIDw8IDgpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZidWYsIGdyZWVuIDw8IDgpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZidWYsIGJsdWUgIDw8IDgpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZidWYsIDB4Nyk7ICAgICAgIC8vIGJpdG1hc2sgZmxhZworICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZidWYsIDApOyAgICAgICAgIC8vIHBhZGRpbmcKKyAgICB9CisKKyAgICBwdHIgPSBwLT5kYXRhWzBdOworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZidWYsIHB0ciwgbHNpemUpOworICAgICAgICBwdHIgKz0gcC0+bGluZXNpemVbMF07CisgICAgfQorCisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgKmdvdF9wYWNrZXQgPSAxOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3h3ZF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAieHdkIiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlhXRCAoWCBXaW5kb3cgRHVtcCkgaW1hZ2UiKSwKKyAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9YV0QsCisgICAgLmVuY29kZTIgICAgICA9IHh3ZF9lbmNvZGVfZnJhbWUsCisgICAgLnBpeF9mbXRzICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeyBBVl9QSVhfRk1UX0JHUkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9SR0JBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfQVJHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0FCR1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0JHUjI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfUkdCNTY1QkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9SR0I1NjVMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0JHUjU2NUJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfQkdSNTY1TEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9SR0I1NTVCRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1JHQjU1NUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfQkdSNTU1QkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9CR1I1NTVMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1JHQjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9CR1I4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfUkdCNF9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfQkdSNF9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfUEFMOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTU9OT1dISVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3h4YW4uYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3h4YW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYxY2RmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveHhhbi5jCkBAIC0wLDAgKzEsNDUxIEBACisvKgorICogV2luZyBDb21tYW5kZXIvWGFuIFZpZGVvIERlY29kZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMSBLb25zdGFudGluIFNoaXNoa292CisgKiBiYXNlZCBvbiB3b3JrIGJ5IE1pa2UgTWVsYW5zb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgWGFuQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEFWRnJhbWUgKnBpYzsKKworICAgIHVpbnQ4X3QgKnlfYnVmZmVyOworICAgIHVpbnQ4X3QgKnNjcmF0Y2hfYnVmZmVyOworICAgIGludCAgICAgYnVmZmVyX3NpemU7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7Cit9IFhhbkNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCB4YW5fZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgWGFuQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5waWMpOworCisgICAgYXZfZnJlZXAoJnMtPnlfYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmcy0+c2NyYXRjaF9idWZmZXIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB4YW5fZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFhhbkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworCisgICAgaWYgKGF2Y3R4LT5oZWlnaHQgPCA4KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZSBoZWlnaHQ6ICVkLlxuIiwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmIChhdmN0eC0+d2lkdGggJiAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZSB3aWR0aDogJWQuXG4iLCBhdmN0eC0+d2lkdGgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPmJ1ZmZlcl9zaXplID0gYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodDsKKyAgICBzLT55X2J1ZmZlciA9IGF2X21hbGxvYyhzLT5idWZmZXJfc2l6ZSk7CisgICAgaWYgKCFzLT55X2J1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzLT5zY3JhdGNoX2J1ZmZlciA9IGF2X21hbGxvYyhzLT5idWZmZXJfc2l6ZSArIDEzMCk7CisgICAgaWYgKCFzLT5zY3JhdGNoX2J1ZmZlcikgeworICAgICAgICB4YW5fZGVjb2RlX2VuZChhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcy0+cGljID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPnBpYykgeworICAgICAgICB4YW5fZGVjb2RlX2VuZChhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGFuX3VucGFja19sdW1hKFhhbkNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IGludCBkc3Rfc2l6ZSkKK3sKKyAgICBpbnQgdHJlZV9zaXplLCBlb2Y7CisgICAgaW50IGJpdHMsIG1hc2s7CisgICAgaW50IHRyZWVfcm9vdCwgbm9kZTsKKyAgICBjb25zdCB1aW50OF90ICpkc3RfZW5kID0gZHN0ICsgZHN0X3NpemU7CisgICAgR2V0Qnl0ZUNvbnRleHQgdHJlZSA9IHMtPmdiOworICAgIGludCBzdGFydF9vZmYgPSBieXRlc3RyZWFtMl90ZWxsKCZ0cmVlKTsKKworICAgIHRyZWVfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgZW9mICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICB0cmVlX3Jvb3QgPSBlb2YgKyB0cmVlX3NpemU7CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIHRyZWVfc2l6ZSAqIDIpOworCisgICAgbm9kZSA9IHRyZWVfcm9vdDsKKyAgICBiaXRzID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICBtYXNrID0gMHg4MDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBiaXQgPSAhIShiaXRzICYgbWFzayk7CisgICAgICAgIG1hc2sgPj49IDE7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJnRyZWUsIHN0YXJ0X29mZiArIG5vZGUqMiArIGJpdCAtIGVvZiAqIDIsIFNFRUtfU0VUKTsKKyAgICAgICAgbm9kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZ0cmVlKTsKKyAgICAgICAgaWYgKG5vZGUgPT0gZW9mKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChub2RlIDwgZW9mKSB7CisgICAgICAgICAgICAqZHN0KysgPSBub2RlOworICAgICAgICAgICAgaWYgKGRzdCA+IGRzdF9lbmQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBub2RlID0gdHJlZV9yb290OworICAgICAgICB9CisgICAgICAgIGlmICghbWFzaykgeworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJpdHMgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKTsKKyAgICAgICAgICAgIG1hc2sgPSAweDgwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkc3QgIT0gZHN0X2VuZCA/IEFWRVJST1JfSU5WQUxJRERBVEEgOiAwOworfQorCisvKiBhbG1vc3QgdGhlIHNhbWUgYXMgaW4geGFuX3djMyBkZWNvZGVyICovCitzdGF0aWMgaW50IHhhbl91bnBhY2soWGFuQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0LCBjb25zdCBpbnQgZGVzdF9sZW4pCit7CisgICAgdWludDhfdCBvcGNvZGU7CisgICAgaW50IHNpemU7CisgICAgdWludDhfdCAqb3JpZ19kZXN0ID0gZGVzdDsKKyAgICBjb25zdCB1aW50OF90ICpkZXN0X2VuZCA9IGRlc3QgKyBkZXN0X2xlbjsKKworICAgIHdoaWxlIChkZXN0IDwgZGVzdF9lbmQpIHsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Z2IpOworCisgICAgICAgIGlmIChvcGNvZGUgPCAweGUwKSB7CisgICAgICAgICAgICBpbnQgc2l6ZTIsIGJhY2s7CisgICAgICAgICAgICBpZiAoKG9wY29kZSAmIDB4ODApID09IDApIHsKKyAgICAgICAgICAgICAgICBzaXplICA9IG9wY29kZSAmIDM7CisgICAgICAgICAgICAgICAgYmFjayAgPSAoKG9wY29kZSAmIDB4NjApIDw8IDMpICsgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKSArIDE7CisgICAgICAgICAgICAgICAgc2l6ZTIgPSAoKG9wY29kZSAmIDB4MWMpID4+IDIpICsgMzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKG9wY29kZSAmIDB4NDApID09IDApIHsKKyAgICAgICAgICAgICAgICBzaXplICA9IGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZSgmcy0+Z2IpID4+IDY7CisgICAgICAgICAgICAgICAgYmFjayAgPSAoYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJnMtPmdiKSAmIDB4M2ZmZikgKyAxOworICAgICAgICAgICAgICAgIHNpemUyID0gKG9wY29kZSAmIDB4M2YpICsgNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2l6ZSAgPSBvcGNvZGUgJiAzOworICAgICAgICAgICAgICAgIGJhY2sgID0gKChvcGNvZGUgJiAweDEwKSA8PCAxMikgKyBieXRlc3RyZWFtMl9nZXRfYmUxNigmcy0+Z2IpICsgMTsKKyAgICAgICAgICAgICAgICBzaXplMiA9ICgob3Bjb2RlICYgMHgwYykgPDwgIDYpICsgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKSArIDU7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgKyBzaXplMiA+IGRlc3RfZW5kIC0gZGVzdCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVzdCArIHNpemUgKyBzaXplMiA+IGRlc3RfZW5kIHx8CisgICAgICAgICAgICAgICAgZGVzdCAtIG9yaWdfZGVzdCArIHNpemUgPCBiYWNrKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcy0+Z2IsIGRlc3QsIHNpemUpOworICAgICAgICAgICAgZGVzdCArPSBzaXplOworICAgICAgICAgICAgYXZfbWVtY3B5X2JhY2twdHIoZGVzdCwgYmFjaywgc2l6ZTIpOworICAgICAgICAgICAgZGVzdCArPSBzaXplMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBmaW5pc2ggPSBvcGNvZGUgPj0gMHhmYzsKKworICAgICAgICAgICAgc2l6ZSA9IGZpbmlzaCA/IG9wY29kZSAmIDMgOiAoKG9wY29kZSAmIDB4MWYpIDw8IDIpICsgNDsKKyAgICAgICAgICAgIGlmIChkZXN0X2VuZCAtIGRlc3QgPCBzaXplKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcy0+Z2IsIGRlc3QsIHNpemUpOworICAgICAgICAgICAgZGVzdCArPSBzaXplOworICAgICAgICAgICAgaWYgKGZpbmlzaCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGVzdCAtIG9yaWdfZGVzdDsKK30KKworc3RhdGljIGludCB4YW5fZGVjb2RlX2Nocm9tYShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVuc2lnbmVkIGNocm9tYV9vZmYpCit7CisgICAgWGFuQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqVSwgKlY7CisgICAgaW50IHZhbCwgdXZhbCwgdnZhbDsKKyAgICBpbnQgaSwgajsKKyAgICBjb25zdCB1aW50OF90ICpzcmMsICpzcmNfZW5kOworICAgIGNvbnN0IHVpbnQ4X3QgKnRhYmxlOworICAgIGludCBtb2RlLCBvZmZzZXQsIGRlY19zaXplLCB0YWJsZV9zaXplOworCisgICAgaWYgKCFjaHJvbWFfb2ZmKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoY2hyb21hX29mZiArIDQgPj0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY2hyb21hIGJsb2NrIHBvc2l0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGJ5dGVzdHJlYW0yX3NlZWsoJnMtPmdiLCBjaHJvbWFfb2ZmICsgNCwgU0VFS19TRVQpOworICAgIG1vZGUgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnMtPmdiKTsKKyAgICB0YWJsZSAgICAgICA9IHMtPmdiLmJ1ZmZlcjsKKyAgICB0YWJsZV9zaXplICA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZzLT5nYik7CisgICAgb2Zmc2V0ICAgICAgPSB0YWJsZV9zaXplICogMjsKKyAgICB0YWJsZV9zaXplICs9IDE7CisKKyAgICBpZiAob2Zmc2V0ID49IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNocm9tYSBibG9jayBvZmZzZXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgb2Zmc2V0KTsKKyAgICBtZW1zZXQocy0+c2NyYXRjaF9idWZmZXIsIDAsIHMtPmJ1ZmZlcl9zaXplKTsKKyAgICBkZWNfc2l6ZSA9IHhhbl91bnBhY2socywgcy0+c2NyYXRjaF9idWZmZXIsIHMtPmJ1ZmZlcl9zaXplKTsKKyAgICBpZiAoZGVjX3NpemUgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2hyb21hIHVucGFja2luZyBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gZGVjX3NpemU7CisgICAgfQorCisgICAgVSA9IHMtPnBpYy0+ZGF0YVsxXTsKKyAgICBWID0gcy0+cGljLT5kYXRhWzJdOworICAgIHNyYyAgICAgPSBzLT5zY3JhdGNoX2J1ZmZlcjsKKyAgICBzcmNfZW5kID0gc3JjICsgZGVjX3NpemU7CisgICAgaWYgKG1vZGUpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT5oZWlnaHQgPj4gMTsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPndpZHRoID4+IDE7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzcmNfZW5kIC0gc3JjIDwgMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgdmFsID0gKnNyYysrOworICAgICAgICAgICAgICAgIGlmICh2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA+PSB0YWJsZV9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIHZhbCAgPSBBVl9STDE2KHRhYmxlICsgKHZhbCA8PCAxKSk7CisgICAgICAgICAgICAgICAgICAgIHV2YWwgPSAodmFsID4+IDMpICYgMHhGODsKKyAgICAgICAgICAgICAgICAgICAgdnZhbCA9ICh2YWwgPj4gOCkgJiAweEY4OworICAgICAgICAgICAgICAgICAgICBVW2ldID0gdXZhbCB8ICh1dmFsID4+IDUpOworICAgICAgICAgICAgICAgICAgICBWW2ldID0gdnZhbCB8ICh2dmFsID4+IDUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFUgKz0gcy0+cGljLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgICAgIFYgKz0gcy0+cGljLT5saW5lc2l6ZVsyXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZjdHgtPmhlaWdodCAmIDEpIHsKKyAgICAgICAgICAgIG1lbWNweShVLCBVIC0gcy0+cGljLT5saW5lc2l6ZVsxXSwgYXZjdHgtPndpZHRoID4+IDEpOworICAgICAgICAgICAgbWVtY3B5KFYsIFYgLSBzLT5waWMtPmxpbmVzaXplWzJdLCBhdmN0eC0+d2lkdGggPj4gMSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB1aW50OF90ICpVMiA9IFUgKyBzLT5waWMtPmxpbmVzaXplWzFdOworICAgICAgICB1aW50OF90ICpWMiA9IFYgKyBzLT5waWMtPmxpbmVzaXplWzJdOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBhdmN0eC0+aGVpZ2h0ID4+IDI7IGorKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT53aWR0aCA+PiAxOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2VuZCAtIHNyYyA8IDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIHZhbCA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICBpZiAodmFsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPj0gdGFibGVfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB2YWwgID0gQVZfUkwxNih0YWJsZSArICh2YWwgPDwgMSkpOworICAgICAgICAgICAgICAgICAgICB1dmFsID0gKHZhbCA+PiAzKSAmIDB4Rjg7CisgICAgICAgICAgICAgICAgICAgIHZ2YWwgPSAodmFsID4+IDgpICYgMHhGODsKKyAgICAgICAgICAgICAgICAgICAgVVtpXSA9IFVbaSsxXSA9IFUyW2ldID0gVTJbaSsxXSA9IHV2YWwgfCAodXZhbCA+PiA1KTsKKyAgICAgICAgICAgICAgICAgICAgVltpXSA9IFZbaSsxXSA9IFYyW2ldID0gVjJbaSsxXSA9IHZ2YWwgfCAodnZhbCA+PiA1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVICArPSBzLT5waWMtPmxpbmVzaXplWzFdICogMjsKKyAgICAgICAgICAgIFYgICs9IHMtPnBpYy0+bGluZXNpemVbMl0gKiAyOworICAgICAgICAgICAgVTIgKz0gcy0+cGljLT5saW5lc2l6ZVsxXSAqIDI7CisgICAgICAgICAgICBWMiArPSBzLT5waWMtPmxpbmVzaXplWzJdICogMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZjdHgtPmhlaWdodCAmIDMpIHsKKyAgICAgICAgICAgIGludCBsaW5lcyA9ICgoYXZjdHgtPmhlaWdodCArIDEpID4+IDEpIC0gKGF2Y3R4LT5oZWlnaHQgPj4gMikgKiAyOworCisgICAgICAgICAgICBtZW1jcHkoVSwgVSAtIGxpbmVzICogcy0+cGljLT5saW5lc2l6ZVsxXSwgbGluZXMgKiBzLT5waWMtPmxpbmVzaXplWzFdKTsKKyAgICAgICAgICAgIG1lbWNweShWLCBWIC0gbGluZXMgKiBzLT5waWMtPmxpbmVzaXplWzJdLCBsaW5lcyAqIHMtPnBpYy0+bGluZXNpemVbMl0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGFuX2RlY29kZV9mcmFtZV90eXBlMChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgWGFuQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqeWJ1ZiwgKnByZXZfYnVmLCAqc3JjID0gcy0+c2NyYXRjaF9idWZmZXI7CisgICAgdW5zaWduZWQgIGNocm9tYV9vZmYsIGNvcnJfb2ZmOworICAgIGludCBjdXIsIGxhc3Q7CisgICAgaW50IGksIGo7CisgICAgaW50IHJldDsKKworICAgIGNocm9tYV9vZmYgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+Z2IpOworICAgIGNvcnJfb2ZmICAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+Z2IpOworCisgICAgaWYgKChyZXQgPSB4YW5fZGVjb2RlX2Nocm9tYShhdmN0eCwgY2hyb21hX29mZikpICE9IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoY29ycl9vZmYgPj0gYnl0ZXN0cmVhbTJfc2l6ZSgmcy0+Z2IpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJZ25vcmluZyBpbnZhbGlkIGNvcnJlY3Rpb24gYmxvY2sgcG9zaXRpb25cbiIpOworICAgICAgICBjb3JyX29mZiA9IDA7CisgICAgfQorICAgIGJ5dGVzdHJlYW0yX3NlZWsoJnMtPmdiLCAxMiwgU0VFS19TRVQpOworICAgIHJldCA9IHhhbl91bnBhY2tfbHVtYShzLCBzcmMsIHMtPmJ1ZmZlcl9zaXplID4+IDEpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJMdW1hIGRlY29kaW5nIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgeWJ1ZiA9IHMtPnlfYnVmZmVyOworICAgIGxhc3QgPSAqc3JjKys7CisgICAgeWJ1ZlswXSA9IGxhc3QgPDwgMTsKKyAgICBmb3IgKGogPSAxOyBqIDwgYXZjdHgtPndpZHRoIC0gMTsgaiArPSAyKSB7CisgICAgICAgIGN1ciA9IChsYXN0ICsgKnNyYysrKSAmIDB4MUY7CisgICAgICAgIHlidWZbal0gICA9IGxhc3QgKyBjdXI7CisgICAgICAgIHlidWZbaisxXSA9IGN1ciA8PCAxOworICAgICAgICBsYXN0ID0gY3VyOworICAgIH0KKyAgICB5YnVmW2pdICA9IGxhc3QgPDwgMTsKKyAgICBwcmV2X2J1ZiA9IHlidWY7CisgICAgeWJ1ZiArPSBhdmN0eC0+d2lkdGg7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIGxhc3QgPSAoKHByZXZfYnVmWzBdID4+IDEpICsgKnNyYysrKSAmIDB4MUY7CisgICAgICAgIHlidWZbMF0gPSBsYXN0IDw8IDE7CisgICAgICAgIGZvciAoaiA9IDE7IGogPCBhdmN0eC0+d2lkdGggLSAxOyBqICs9IDIpIHsKKyAgICAgICAgICAgIGN1ciA9ICgocHJldl9idWZbaiArIDFdID4+IDEpICsgKnNyYysrKSAmIDB4MUY7CisgICAgICAgICAgICB5YnVmW2pdICAgPSBsYXN0ICsgY3VyOworICAgICAgICAgICAgeWJ1ZltqKzFdID0gY3VyIDw8IDE7CisgICAgICAgICAgICBsYXN0ID0gY3VyOworICAgICAgICB9CisgICAgICAgIHlidWZbal0gPSBsYXN0IDw8IDE7CisgICAgICAgIHByZXZfYnVmID0geWJ1ZjsKKyAgICAgICAgeWJ1ZiArPSBhdmN0eC0+d2lkdGg7CisgICAgfQorCisgICAgaWYgKGNvcnJfb2ZmKSB7CisgICAgICAgIGludCBkZWNfc2l6ZTsKKworICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nYiwgOCArIGNvcnJfb2ZmLCBTRUVLX1NFVCk7CisgICAgICAgIGRlY19zaXplID0geGFuX3VucGFjayhzLCBzLT5zY3JhdGNoX2J1ZmZlciwgcy0+YnVmZmVyX3NpemUgLyAyKTsKKyAgICAgICAgaWYgKGRlY19zaXplIDwgMCkKKyAgICAgICAgICAgIGRlY19zaXplID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGVjX3NpemUgPSBGRk1JTihkZWNfc2l6ZSwgcy0+YnVmZmVyX3NpemUvMiAtIDEpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWNfc2l6ZTsgaSsrKQorICAgICAgICAgICAgcy0+eV9idWZmZXJbaSoyKzFdID0gKHMtPnlfYnVmZmVyW2kqMisxXSArIChzLT5zY3JhdGNoX2J1ZmZlcltpXSA8PCAxKSkgJiAweDNGOworICAgIH0KKworICAgIHNyYyAgPSBzLT55X2J1ZmZlcjsKKyAgICB5YnVmID0gcy0+cGljLT5kYXRhWzBdOworICAgIGZvciAoaiA9IDA7IGogPCBhdmN0eC0+aGVpZ2h0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT53aWR0aDsgaSsrKQorICAgICAgICAgICAgeWJ1ZltpXSA9IChzcmNbaV0gPDwgMikgfCAoc3JjW2ldID4+IDMpOworICAgICAgICBzcmMgICs9IGF2Y3R4LT53aWR0aDsKKyAgICAgICAgeWJ1ZiArPSBzLT5waWMtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhhbl9kZWNvZGVfZnJhbWVfdHlwZTEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFhhbkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKnlidWYsICpzcmMgPSBzLT5zY3JhdGNoX2J1ZmZlcjsKKyAgICBpbnQgY3VyLCBsYXN0OworICAgIGludCBpLCBqOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IHhhbl9kZWNvZGVfY2hyb21hKGF2Y3R4LCBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+Z2IpKSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGJ5dGVzdHJlYW0yX3NlZWsoJnMtPmdiLCAxNiwgU0VFS19TRVQpOworICAgIHJldCA9IHhhbl91bnBhY2tfbHVtYShzLCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJ1ZmZlcl9zaXplID4+IDEpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJMdW1hIGRlY29kaW5nIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgeWJ1ZiA9IHMtPnlfYnVmZmVyOworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgbGFzdCA9ICh5YnVmWzBdICsgKCpzcmMrKyA8PCAxKSkgJiAweDNGOworICAgICAgICB5YnVmWzBdID0gbGFzdDsKKyAgICAgICAgZm9yIChqID0gMTsgaiA8IGF2Y3R4LT53aWR0aCAtIDE7IGogKz0gMikgeworICAgICAgICAgICAgY3VyID0gKHlidWZbaiArIDFdICsgKCpzcmMrKyA8PCAxKSkgJiAweDNGOworICAgICAgICAgICAgeWJ1ZltqXSAgID0gKGxhc3QgKyBjdXIpID4+IDE7CisgICAgICAgICAgICB5YnVmW2orMV0gPSBjdXI7CisgICAgICAgICAgICBsYXN0ID0gY3VyOworICAgICAgICB9CisgICAgICAgIHlidWZbal0gPSBsYXN0OworICAgICAgICB5YnVmICs9IGF2Y3R4LT53aWR0aDsKKyAgICB9CisKKyAgICBzcmMgPSBzLT55X2J1ZmZlcjsKKyAgICB5YnVmID0gcy0+cGljLT5kYXRhWzBdOworICAgIGZvciAoaiA9IDA7IGogPCBhdmN0eC0+aGVpZ2h0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT53aWR0aDsgaSsrKQorICAgICAgICAgICAgeWJ1ZltpXSA9IChzcmNbaV0gPDwgMikgfCAoc3JjW2ldID4+IDMpOworICAgICAgICBzcmMgICs9IGF2Y3R4LT53aWR0aDsKKyAgICAgICAgeWJ1ZiArPSBzLT5waWMtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhhbl9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBYYW5Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgZnR5cGU7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5waWMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZzLT5nYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICBmdHlwZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZzLT5nYik7CisgICAgc3dpdGNoIChmdHlwZSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgcmV0ID0geGFuX2RlY29kZV9mcmFtZV90eXBlMChhdmN0eCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgcmV0ID0geGFuX2RlY29kZV9mcmFtZV90eXBlMShhdmN0eCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBmcmFtZSB0eXBlICVkXG4iLCBmdHlwZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+cGljKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfeGFuX3djNF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ4YW5fd2M0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2luZyBDb21tYW5kZXIgSVYgLyBYeGFuIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1hBTl9XQzQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFhhbkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHhhbl9kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB4YW5fZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSB4YW5fZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveTQxcGRlYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveTQxcGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWU1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy95NDFwZGVjLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIHk0MXAgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgeTQxcF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPnBpeF9mbXQgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1lVVjQxMVA7CisgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSAxMjsKKworICAgIGlmIChhdmN0eC0+d2lkdGggJiA3KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJ5NDFwIHJlcXVpcmVzIHdpZHRoIHRvIGJlIGRpdmlzaWJsZSBieSA4LlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeTQxcF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWRnJhbWUgKnBpYyA9IGRhdGE7CisgICAgdWludDhfdCAqc3JjID0gYXZwa3QtPmRhdGE7CisgICAgdWludDhfdCAqeSwgKnUsICp2OworICAgIGludCBpLCBqLCByZXQ7CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPCAxLjUgKiBhdmN0eC0+aGVpZ2h0ICogYXZjdHgtPndpZHRoKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGlucHV0IGRhdGEuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpYywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBpYy0+a2V5X2ZyYW1lID0gMTsKKyAgICBwaWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgZm9yIChpID0gYXZjdHgtPmhlaWdodCAtIDE7IGkgPj0gMCA7IGktLSkgeworICAgICAgICB5ID0gJnBpYy0+ZGF0YVswXVtpICogcGljLT5saW5lc2l6ZVswXV07CisgICAgICAgIHUgPSAmcGljLT5kYXRhWzFdW2kgKiBwaWMtPmxpbmVzaXplWzFdXTsKKyAgICAgICAgdiA9ICZwaWMtPmRhdGFbMl1baSAqIHBpYy0+bGluZXNpemVbMl1dOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPndpZHRoOyBqICs9IDgpIHsKKyAgICAgICAgICAgICoodSsrKSA9ICpzcmMrKzsKKyAgICAgICAgICAgICooeSsrKSA9ICpzcmMrKzsKKyAgICAgICAgICAgICoodisrKSA9ICpzcmMrKzsKKyAgICAgICAgICAgICooeSsrKSA9ICpzcmMrKzsKKworICAgICAgICAgICAgKih1KyspID0gKnNyYysrOworICAgICAgICAgICAgKih5KyspID0gKnNyYysrOworICAgICAgICAgICAgKih2KyspID0gKnNyYysrOworICAgICAgICAgICAgKih5KyspID0gKnNyYysrOworCisgICAgICAgICAgICAqKHkrKykgPSAqc3JjKys7CisgICAgICAgICAgICAqKHkrKykgPSAqc3JjKys7CisgICAgICAgICAgICAqKHkrKykgPSAqc3JjKys7CisgICAgICAgICAgICAqKHkrKykgPSAqc3JjKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl95NDFwX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICA9ICJ5NDFwIiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCBZVVYgNDoxOjEgMTItYml0IiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfWTQxUCwKKyAgICAuaW5pdCAgICAgICAgID0geTQxcF9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgID0geTQxcF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveTQxcGVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveTQxcGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjc5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy95NDFwZW5jLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiB5NDFwIGVuY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIGF2X2NvbGQgaW50IHk0MXBfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGlmIChhdmN0eC0+d2lkdGggJiA3KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAieTQxcCByZXF1aXJlcyB3aWR0aCB0byBiZSBkaXZpc2libGUgYnkgOC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxMjsKKworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeTQxcF9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWMsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICB1aW50OF90ICpkc3Q7CisgICAgdWludDhfdCAqeSwgKnUsICp2OworICAgIGludCBpLCBqLCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqIDEuNSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGRzdCA9IHBrdC0+ZGF0YTsKKworICAgIGZvciAoaSA9IGF2Y3R4LT5oZWlnaHQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICB5ID0gJnBpYy0+ZGF0YVswXVtpICogcGljLT5saW5lc2l6ZVswXV07CisgICAgICAgIHUgPSAmcGljLT5kYXRhWzFdW2kgKiBwaWMtPmxpbmVzaXplWzFdXTsKKyAgICAgICAgdiA9ICZwaWMtPmRhdGFbMl1baSAqIHBpYy0+bGluZXNpemVbMl1dOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPndpZHRoOyBqICs9IDgpIHsKKyAgICAgICAgICAgICooZHN0KyspID0gKih1KyspOworICAgICAgICAgICAgKihkc3QrKykgPSAqKHkrKyk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICoodisrKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKih5KyspOworCisgICAgICAgICAgICAqKGRzdCsrKSA9ICoodSsrKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKih5KyspOworICAgICAgICAgICAgKihkc3QrKykgPSAqKHYrKyk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICooeSsrKTsKKworICAgICAgICAgICAgKihkc3QrKykgPSAqKHkrKyk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICooeSsrKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKih5KyspOworICAgICAgICAgICAgKihkc3QrKykgPSAqKHkrKyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB5NDFwX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5jb2RlZF9mcmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl95NDFwX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICA9ICJ5NDFwIiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCBZVVYgNDoxOjEgMTItYml0IiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfWTQxUCwKKyAgICAuaW5pdCAgICAgICAgID0geTQxcF9lbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgID0geTQxcF9lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICA9IHk0MXBfZW5jb2RlX2Nsb3NlLAorICAgIC5waXhfZm10cyAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3lvcC5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveW9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZiMTllYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmNvZGVjL3lvcC5jCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogUHN5Z25vc2lzIFlPUCBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1vaGFtZWQgTmF1ZmFsIEJhc2hlZXIgPG5hdWZhbDExQGdtYWlsLmNvbT4KKyAqIGRlcml2ZWQgZnJvbSB0aGUgY29kZSBieQorICogQ29weXJpZ2h0IChDKSAyMDA5IFRob21hcyBQLiBIaWdkb24gPHRob21hcy5wLmhpZ2RvbkBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBZb3BEZWNDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZGcmFtZSAqZnJhbWU7CisKKyAgICBpbnQgbnVtX3BhbF9jb2xvcnM7CisgICAgaW50IGZpcnN0X2NvbG9yWzJdOworICAgIGludCBmcmFtZV9kYXRhX2xlbmd0aDsKKworICAgIHVpbnQ4X3QgKmxvd19uaWJibGU7CisgICAgdWludDhfdCAqc3JjcHRyOworICAgIHVpbnQ4X3QgKnNyY19lbmQ7CisgICAgdWludDhfdCAqZHN0cHRyOworICAgIHVpbnQ4X3QgKmRzdGJ1ZjsKK30gWW9wRGVjQ29udGV4dDsKKworLy8gVGhlc2UgdGFibGVzIGFyZSB0YWtlbiBkaXJlY3RseSBmcm9tOgorLy8gaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9UHN5Z25vc2lzX1lPUAorCisvKioKKyAqIExvb2t1cCB0YWJsZSBmb3IgcGFpbnRpbmcgbWFjcm9ibG9ja3MuIEJ5dGVzIDAtMiBvZiBlYWNoIGVudHJ5IGNvbnRhaW4KKyAqIHRoZSBtYWNyb2Jsb2NrIHBvc2l0aW9ucyB0byBiZSBwYWludGVkICh0YWtlbiBhcyAoMCwgQjAsIEIxLCBCMikpLgorICogQnl0ZSAzIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgb24gdGhlIGlucHV0LAorICogZXF1YWwgdG8gbWF4KGJ5dGVzIDAtMikgKyAxLgorICovCitzdGF0aWMgY29uc3QgdWludDhfdCBwYWludF9sdXRbMTVdWzRdID0KKyAgICB7ezEsIDIsIDMsIDR9LCB7MSwgMiwgMCwgM30sCisgICAgIHsxLCAyLCAxLCAzfSwgezEsIDIsIDIsIDN9LAorICAgICB7MSwgMCwgMiwgM30sIHsxLCAwLCAwLCAyfSwKKyAgICAgezEsIDAsIDEsIDJ9LCB7MSwgMSwgMiwgM30sCisgICAgIHswLCAxLCAyLCAzfSwgezAsIDEsIDAsIDJ9LAorICAgICB7MSwgMSwgMCwgMn0sIHswLCAxLCAxLCAyfSwKKyAgICAgezAsIDAsIDEsIDJ9LCB7MCwgMCwgMCwgMX0sCisgICAgIHsxLCAxLCAxLCAyfSwKKyAgICB9OworCisvKioKKyAqIExvb2t1cCB0YWJsZSBmb3IgY29weWluZyBtYWNyb2Jsb2Nrcy4gRWFjaCBlbnRyeSBjb250YWlucyB0aGUgcmVzcGVjdGl2ZQorICogeCBhbmQgeSBwaXhlbCBvZmZzZXQgZm9yIHRoZSBjb3B5IHNvdXJjZS4KKyAqLworc3RhdGljIGNvbnN0IGludDhfdCBtb3Rpb25fdmVjdG9yWzE2XVsyXSA9CisgICAge3stNCwgLTR9LCB7LTIsIC00fSwKKyAgICAgeyAwLCAtNH0sIHsgMiwgLTR9LAorICAgICB7LTQsIC0yfSwgey00LCAgMH0sCisgICAgIHstMywgLTN9LCB7LTEsIC0zfSwKKyAgICAgeyAxLCAtM30sIHsgMywgLTN9LAorICAgICB7LTMsIC0xfSwgey0yLCAtMn0sCisgICAgIHsgMCwgLTJ9LCB7IDIsIC0yfSwKKyAgICAgeyA0LCAtMn0sIHstMiwgIDB9LAorICAgIH07CisKK3N0YXRpYyBhdl9jb2xkIGludCB5b3BfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBZb3BEZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgeW9wX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBZb3BEZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworCisgICAgaWYgKGF2Y3R4LT53aWR0aCAmIDEgfHwgYXZjdHgtPmhlaWdodCAmIDEgfHwKKyAgICAgICAgYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIDAsIGF2Y3R4KSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJZT1AgaGFzIGludmFsaWQgZGltZW5zaW9uc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCAzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBvciBpbmNvbXBsZXRlIGV4dHJhZGF0YS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKworICAgIHMtPm51bV9wYWxfY29sb3JzID0gYXZjdHgtPmV4dHJhZGF0YVswXTsKKyAgICBzLT5maXJzdF9jb2xvclswXSA9IGF2Y3R4LT5leHRyYWRhdGFbMV07CisgICAgcy0+Zmlyc3RfY29sb3JbMV0gPSBhdmN0eC0+ZXh0cmFkYXRhWzJdOworCisgICAgaWYgKHMtPm51bV9wYWxfY29sb3JzICsgcy0+Zmlyc3RfY29sb3JbMF0gPiAyNTYgfHwKKyAgICAgICAgcy0+bnVtX3BhbF9jb2xvcnMgKyBzLT5maXJzdF9jb2xvclsxXSA+IDI1NikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJQYWxldHRlIHBhcmFtZXRlcnMgaW52YWxpZCwgaGVhZGVyIHByb2JhYmx5IGNvcnJ1cHRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFBhaW50IGEgbWFjcm9ibG9jayB1c2luZyB0aGUgcGF0dGVybiBpbiBwYWludF9sdXQuCisgKiBAcGFyYW0gcyBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW0gdGFnIHRoZSB0YWcgdGhhdCB3YXMgaW4gdGhlIG5pYmJsZQorICovCitzdGF0aWMgaW50IHlvcF9wYWludF9ibG9jayhZb3BEZWNDb250ZXh0ICpzLCBpbnQgbGluZXNpemUsIGludCB0YWcpCit7CisgICAgaWYgKHMtPnNyY19lbmQgLSBzLT5zcmNwdHIgPCBwYWludF9sdXRbdGFnXVszXSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCB0b28gc21hbGwuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+ZHN0cHRyWzBdICAgICAgICAgICAgPSBzLT5zcmNwdHJbMF07CisgICAgcy0+ZHN0cHRyWzFdICAgICAgICAgICAgPSBzLT5zcmNwdHJbcGFpbnRfbHV0W3RhZ11bMF1dOworICAgIHMtPmRzdHB0cltsaW5lc2l6ZV0gICAgID0gcy0+c3JjcHRyW3BhaW50X2x1dFt0YWddWzFdXTsKKyAgICBzLT5kc3RwdHJbbGluZXNpemUgKyAxXSA9IHMtPnNyY3B0cltwYWludF9sdXRbdGFnXVsyXV07CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIHNyYyBieXRlcyBjb25zdW1lZCBpcyBpbiB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBsdXQgZW50cnkuCisgICAgcy0+c3JjcHRyICs9IHBhaW50X2x1dFt0YWddWzNdOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIENvcHkgYSBwcmV2aW91c2x5IHBhaW50ZWQgbWFjcm9ibG9jayB0byB0aGUgY3VycmVudF9ibG9jay4KKyAqIEBwYXJhbSBjb3B5X3RhZyB0aGUgdGFnIHRoYXQgd2FzIGluIHRoZSBuaWJibGUKKyAqLworc3RhdGljIGludCB5b3BfY29weV9wcmV2aW91c19ibG9jayhZb3BEZWNDb250ZXh0ICpzLCBpbnQgbGluZXNpemUsIGludCBjb3B5X3RhZykKK3sKKyAgICB1aW50OF90ICpidWZwdHI7CisKKyAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gZm9yIHRoZSBjb3B5IHNvdXJjZQorICAgIGJ1ZnB0ciA9IHMtPmRzdHB0ciArIG1vdGlvbl92ZWN0b3JbY29weV90YWddWzBdICsKKyAgICAgICAgICAgICBsaW5lc2l6ZSAqIG1vdGlvbl92ZWN0b3JbY29weV90YWddWzFdOworICAgIGlmIChidWZwdHIgPCBzLT5kc3RidWYpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJGaWxlIHByb2JhYmx5IGNvcnJ1cHRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5kc3RwdHJbMF0gICAgICAgICAgICA9IGJ1ZnB0clswXTsKKyAgICBzLT5kc3RwdHJbMV0gICAgICAgICAgICA9IGJ1ZnB0clsxXTsKKyAgICBzLT5kc3RwdHJbbGluZXNpemVdICAgICA9IGJ1ZnB0cltsaW5lc2l6ZV07CisgICAgcy0+ZHN0cHRyW2xpbmVzaXplICsgMV0gPSBidWZwdHJbbGluZXNpemUgKyAxXTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFJldHVybiB0aGUgbmV4dCBuaWJibGUgaW4gc2VxdWVuY2UsIGNvbnN1bWluZyBhIG5ldyBieXRlIG9uIHRoZSBpbnB1dAorICogb25seSBpZiBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyB1aW50OF90IHlvcF9nZXRfbmV4dF9uaWJibGUoWW9wRGVjQ29udGV4dCAqcykKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHMtPmxvd19uaWJibGUpIHsKKyAgICAgICAgcmV0ICAgICAgICAgICA9ICpzLT5sb3dfbmliYmxlICYgMHhmOworICAgICAgICBzLT5sb3dfbmliYmxlID0gTlVMTDsKKyAgICB9ZWxzZSB7CisgICAgICAgIHMtPmxvd19uaWJibGUgPSBzLT5zcmNwdHIrKzsKKyAgICAgICAgcmV0ICAgICAgICAgICA9ICpzLT5sb3dfbmliYmxlID4+IDQ7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeW9wX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBZb3BEZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSA9IHMtPmZyYW1lOworICAgIGludCB0YWcsIGZpcnN0Y29sb3IsIGlzX29kZF9mcmFtZTsKKyAgICBpbnQgcmV0LCBpLCB4LCB5OworICAgIHVpbnQzMl90ICpwYWxldHRlOworCisgICAgaWYgKGF2cGt0LT5zaXplIDwgNCArIDMgKiBzLT5udW1fcGFsX2NvbG9ycykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCB0b28gc21hbGwuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIGZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCFhdmN0eC0+ZnJhbWVfbnVtYmVyKQorICAgICAgICBtZW1zZXQoZnJhbWUtPmRhdGFbMV0sIDAsIEFWUEFMRVRURV9TSVpFKTsKKworICAgIHMtPmRzdGJ1ZiAgICAgPSBmcmFtZS0+ZGF0YVswXTsKKyAgICBzLT5kc3RwdHIgICAgID0gZnJhbWUtPmRhdGFbMF07CisgICAgcy0+c3JjcHRyICAgICA9IGF2cGt0LT5kYXRhICsgNDsKKyAgICBzLT5zcmNfZW5kICAgID0gYXZwa3QtPmRhdGEgKyBhdnBrdC0+c2l6ZTsKKyAgICBzLT5sb3dfbmliYmxlID0gTlVMTDsKKworICAgIGlzX29kZF9mcmFtZSA9IGF2cGt0LT5kYXRhWzBdOworICAgIGlmKGlzX29kZF9mcmFtZT4xKXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmcmFtZSBpcyB0b28gb2RkICVkXG4iLCBpc19vZGRfZnJhbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZmlyc3Rjb2xvciAgID0gcy0+Zmlyc3RfY29sb3JbaXNfb2RkX2ZyYW1lXTsKKyAgICBwYWxldHRlICAgICAgPSAodWludDMyX3QgKilmcmFtZS0+ZGF0YVsxXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fcGFsX2NvbG9yczsgaSsrLCBzLT5zcmNwdHIgKz0gMykgeworICAgICAgICBwYWxldHRlW2kgKyBmaXJzdGNvbG9yXSA9IChzLT5zcmNwdHJbMF0gPDwgMTgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c3JjcHRyWzFdIDw8IDEwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnNyY3B0clsyXSA8PCAyKTsKKyAgICAgICAgcGFsZXR0ZVtpICsgZmlyc3Rjb2xvcl0gfD0gMHhGRlUgPDwgMjQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFsZXR0ZVtpICsgZmlyc3Rjb2xvcl0gPj4gNikgJiAweDMwMzAzOworICAgIH0KKworICAgIGZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICBpZiAocy0+c3JjcHRyIC0gYXZwa3QtPmRhdGEgPj0gYXZwa3QtPnNpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCB0b28gc21hbGwuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFnID0geW9wX2dldF9uZXh0X25pYmJsZShzKTsKKworICAgICAgICAgICAgaWYgKHRhZyAhPSAweGYpIHsKKyAgICAgICAgICAgICAgICByZXQgPSB5b3BfcGFpbnRfYmxvY2socywgZnJhbWUtPmxpbmVzaXplWzBdLCB0YWcpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0YWcgPSB5b3BfZ2V0X25leHRfbmliYmxlKHMpOworICAgICAgICAgICAgICAgIHJldCA9IHlvcF9jb3B5X3ByZXZpb3VzX2Jsb2NrKHMsIGZyYW1lLT5saW5lc2l6ZVswXSwgdGFnKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmRzdHB0ciArPSAyOworICAgICAgICB9CisgICAgICAgIHMtPmRzdHB0ciArPSAyKmZyYW1lLT5saW5lc2l6ZVswXSAtIHg7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfeW9wX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInlvcCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBzeWdub3NpcyBZT1AgVmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfWU9QLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihZb3BEZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB5b3BfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0geW9wX2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSB5b3BfZGVjb2RlX2ZyYW1lLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3l1djRkZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3l1djRkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGNjZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMveXV2NGRlYy5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBsaWJxdWlja3RpbWUgeXV2NCBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhcmwgRXVnZW4gSG95b3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgeXV2NF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB5dXY0X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqcGljID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSBhdnBrdC0+ZGF0YTsKKyAgICB1aW50OF90ICp5LCAqdSwgKnY7CisgICAgaW50IGksIGosIHJldDsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8IDYgKiAoYXZjdHgtPndpZHRoICsgMSA+PiAxKSAqIChhdmN0eC0+aGVpZ2h0ICsgMSA+PiAxKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluc3VmZmljaWVudCBpbnB1dCBkYXRhLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwaWMsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwaWMtPmtleV9mcmFtZSA9IDE7CisgICAgcGljLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgIHkgPSBwaWMtPmRhdGFbMF07CisgICAgdSA9IHBpYy0+ZGF0YVsxXTsKKyAgICB2ID0gcGljLT5kYXRhWzJdOworCisgICAgZm9yIChpID0gMDsgaSA8IChhdmN0eC0+aGVpZ2h0ICsgMSkgPj4gMTsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAoYXZjdHgtPndpZHRoICsgMSkgPj4gMTsgaisrKSB7CisgICAgICAgICAgICB1W2pdID0gKnNyYysrIF4gMHg4MDsKKyAgICAgICAgICAgIHZbal0gPSAqc3JjKysgXiAweDgwOworICAgICAgICAgICAgeVsgICAgICAgICAgICAgICAgICAgMiAqIGogICAgXSA9ICpzcmMrKzsKKyAgICAgICAgICAgIHlbICAgICAgICAgICAgICAgICAgIDIgKiBqICsgMV0gPSAqc3JjKys7CisgICAgICAgICAgICB5W3BpYy0+bGluZXNpemVbMF0gKyAyICogaiAgICBdID0gKnNyYysrOworICAgICAgICAgICAgeVtwaWMtPmxpbmVzaXplWzBdICsgMiAqIGogKyAxXSA9ICpzcmMrKzsKKyAgICAgICAgfQorCisgICAgICAgIHkgKz0gMiAqIHBpYy0+bGluZXNpemVbMF07CisgICAgICAgIHUgKz0gICAgIHBpYy0+bGluZXNpemVbMV07CisgICAgICAgIHYgKz0gICAgIHBpYy0+bGluZXNpemVbMl07CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfeXV2NF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAieXV2NCIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgcGFja2VkIDQ6MjowIiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfWVVWNCwKKyAgICAuaW5pdCAgICAgICAgID0geXV2NF9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgID0geXV2NF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyA9IENPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Y29kZWMveXV2NGVuYy5jIGIvZmZtcGVnL2xpYmF2Y29kZWMveXV2NGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMGZjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy95dXY0ZW5jLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIGxpYnF1aWNrdGltZSB5dXY0IGVuY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FybCBFdWdlbiBIb3lvcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCB5dXY0X2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworCisgICAgaWYgKCFhdmN0eC0+Y29kZWRfZnJhbWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgYWxsb2NhdGUgZnJhbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB5dXY0X2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpYywgaW50ICpnb3RfcGFja2V0KQoreworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICB1aW50OF90ICp5LCAqdSwgKnY7CisgICAgaW50IGksIGosIHJldDsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCA2ICogKGF2Y3R4LT53aWR0aCArIDEgPj4gMSkgKiAoYXZjdHgtPmhlaWdodCArIDEgPj4gMSkpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZHN0ID0gcGt0LT5kYXRhOworCisgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWUgPSAxOworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICB5ID0gcGljLT5kYXRhWzBdOworICAgIHUgPSBwaWMtPmRhdGFbMV07CisgICAgdiA9IHBpYy0+ZGF0YVsyXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0ICsgMSA+PiAxOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aCArIDEgPj4gMTsgaisrKSB7CisgICAgICAgICAgICAqZHN0KysgPSB1W2pdIF4gMHg4MDsKKyAgICAgICAgICAgICpkc3QrKyA9IHZbal0gXiAweDgwOworICAgICAgICAgICAgKmRzdCsrID0geVsgICAgICAgICAgICAgICAgICAgMiAqIGogICAgXTsKKyAgICAgICAgICAgICpkc3QrKyA9IHlbICAgICAgICAgICAgICAgICAgIDIgKiBqICsgMV07CisgICAgICAgICAgICAqZHN0KysgPSB5W3BpYy0+bGluZXNpemVbMF0gKyAyICogaiAgICBdOworICAgICAgICAgICAgKmRzdCsrID0geVtwaWMtPmxpbmVzaXplWzBdICsgMiAqIGogKyAxXTsKKyAgICAgICAgfQorICAgICAgICB5ICs9IDIgKiBwaWMtPmxpbmVzaXplWzBdOworICAgICAgICB1ICs9ICAgICBwaWMtPmxpbmVzaXplWzFdOworICAgICAgICB2ICs9ICAgICBwaWMtPmxpbmVzaXplWzJdOworICAgIH0KKworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICpnb3RfcGFja2V0ID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHl1djRfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3l1djRfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gInl1djQiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIHBhY2tlZCA0OjI6MCIpLAorICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX1lVVjQsCisgICAgLmluaXQgICAgICAgICA9IHl1djRfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICA9IHl1djRfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgPSB5dXY0X2VuY29kZV9jbG9zZSwKKyAgICAucGl4X2ZtdHMgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZjb2RlYy96ZXJvY29kZWMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3plcm9jb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNmMzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZjb2RlYy96ZXJvY29kZWMuYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIFplcm9Db2RlYyBEZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBEZXJlayBCdWl0ZW5odWlzCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHpsaWIuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWRnJhbWUgICpwcmV2aW91c19mcmFtZTsKKyAgICB6X3N0cmVhbSB6c3RyZWFtOworfSBaZXJvQ29kZWNDb250ZXh0OworCitzdGF0aWMgaW50IHplcm9jb2RlY19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgWmVyb0NvZGVjQ29udGV4dCAqemMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKnBpYyAgICAgICAgID0gZGF0YTsKKyAgICBBVkZyYW1lICpwcmV2X3BpYyAgICA9IHpjLT5wcmV2aW91c19mcmFtZTsKKyAgICB6X3N0cmVhbSAqenN0cmVhbSAgICA9ICZ6Yy0+enN0cmVhbTsKKyAgICB1aW50OF90ICpwcmV2ICAgICAgICA9IHByZXZfcGljLT5kYXRhWzBdOworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBpbnQgaSwgaiwgenJldCwgcmV0OworCisgICAgaWYgKGF2cGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkgeworICAgICAgICBwaWMtPmtleV9mcmFtZSA9IDE7CisgICAgICAgIHBpYy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFwcmV2KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgcmVmZXJlbmNlIGZyYW1lLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIHByZXYgKz0gKGF2Y3R4LT5oZWlnaHQgLSAxKSAqIHByZXZfcGljLT5saW5lc2l6ZVswXTsKKworICAgICAgICBwaWMtPmtleV9mcmFtZSA9IDA7CisgICAgICAgIHBpYy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgfQorCisgICAgenJldCA9IGluZmxhdGVSZXNldCh6c3RyZWFtKTsKKyAgICBpZiAoenJldCAhPSBaX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHJlc2V0IGluZmxhdGU6ICVkLlxuIiwgenJldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgenN0cmVhbS0+bmV4dF9pbiAgPSBhdnBrdC0+ZGF0YTsKKyAgICB6c3RyZWFtLT5hdmFpbF9pbiA9IGF2cGt0LT5zaXplOworCisgICAgZHN0ID0gcGljLT5kYXRhWzBdICsgKGF2Y3R4LT5oZWlnaHQgLSAxKSAqIHBpYy0+bGluZXNpemVbMF07CisKKyAgICAvKioKKyAgICAgKiBaZXJvQ29kZWMgaGFzIHZlcnkgc2ltcGxlIGludGVyZnJhbWUgY29tcHJlc3Npb24uIElmIGEgdmFsdWUKKyAgICAgKiBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgZnJhbWUsIHNldCBpdCB0byAwLgorICAgICAqLworCisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICB6c3RyZWFtLT5uZXh0X291dCAgPSBkc3Q7CisgICAgICAgIHpzdHJlYW0tPmF2YWlsX291dCA9IGF2Y3R4LT53aWR0aCA8PCAxOworCisgICAgICAgIHpyZXQgPSBpbmZsYXRlKHpzdHJlYW0sIFpfU1lOQ19GTFVTSCk7CisgICAgICAgIGlmICh6cmV0ICE9IFpfT0sgJiYgenJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbmZsYXRlIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlOiAlZC5cbiIsIHpyZXQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShhdnBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aCA8PCAxOyBqKyspCisgICAgICAgICAgICAgICAgZHN0W2pdICs9IHByZXZbal0gJiAtIWRzdFtqXTsKKworICAgICAgICBwcmV2IC09IHByZXZfcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgZHN0ICAtPSBwaWMtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIGF2X2ZyYW1lX3VucmVmKHpjLT5wcmV2aW91c19mcmFtZSk7CisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoemMtPnByZXZpb3VzX2ZyYW1lLCBwaWMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHplcm9jb2RlY19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFplcm9Db2RlY0NvbnRleHQgKnpjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnpjLT5wcmV2aW91c19mcmFtZSk7CisKKyAgICBpbmZsYXRlRW5kKCZ6Yy0+enN0cmVhbSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHplcm9jb2RlY19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgWmVyb0NvZGVjQ29udGV4dCAqemMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHpfc3RyZWFtICp6c3RyZWFtICAgID0gJnpjLT56c3RyZWFtOworICAgIGludCB6cmV0OworCisgICAgYXZjdHgtPnBpeF9mbXQgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1VZVlk0MjI7CisgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSA4OworCisgICAgenN0cmVhbS0+emFsbG9jID0gWl9OVUxMOworICAgIHpzdHJlYW0tPnpmcmVlICA9IFpfTlVMTDsKKyAgICB6c3RyZWFtLT5vcGFxdWUgPSBaX05VTEw7CisKKyAgICB6cmV0ID0gaW5mbGF0ZUluaXQoenN0cmVhbSk7CisgICAgaWYgKHpyZXQgIT0gWl9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGluZmxhdGU6ICVkLlxuIiwgenJldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgemMtPnByZXZpb3VzX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXpjLT5wcmV2aW91c19mcmFtZSkgeworICAgICAgICB6ZXJvY29kZWNfZGVjb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl96ZXJvY29kZWNfZGVjb2RlciA9IHsKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLm5hbWUgICAgICAgICAgID0gInplcm9jb2RlYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlplcm9Db2RlYyBMb3NzbGVzcyBWaWRlbyIpLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1pFUk9DT0RFQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoWmVyb0NvZGVjQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gemVyb2NvZGVjX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IHplcm9jb2RlY19kZWNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gemVyb2NvZGVjX2RlY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ptYnYuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ptYnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTZkOTEyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvem1idi5jCkBAIC0wLDAgKzEsNjMzIEBACisvKgorICogWmlwIE1vdGlvbiBCbG9ja3MgVmlkZW8gKFpNQlYpIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFppcCBNb3Rpb24gQmxvY2tzIFZpZGVvIGRlY29kZXIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlIDx6bGliLmg+CisKKyNkZWZpbmUgWk1CVl9LRVlGUkFNRSAxCisjZGVmaW5lIFpNQlZfREVMVEFQQUwgMgorCitlbnVtIFptYnZGb3JtYXQgeworICAgIFpNQlZfRk1UX05PTkUgID0gMCwKKyAgICBaTUJWX0ZNVF8xQlBQICA9IDEsCisgICAgWk1CVl9GTVRfMkJQUCAgPSAyLAorICAgIFpNQlZfRk1UXzRCUFAgID0gMywKKyAgICBaTUJWX0ZNVF84QlBQICA9IDQsCisgICAgWk1CVl9GTVRfMTVCUFAgPSA1LAorICAgIFpNQlZfRk1UXzE2QlBQID0gNiwKKyAgICBaTUJWX0ZNVF8yNEJQUCA9IDcsCisgICAgWk1CVl9GTVRfMzJCUFAgPSA4Cit9OworCisvKgorICogRGVjb2RlciBjb250ZXh0CisgKi8KK3R5cGVkZWYgc3RydWN0IFptYnZDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisKKyAgICBpbnQgYnBwOworICAgIHVuc2lnbmVkIGludCBkZWNvbXBfc2l6ZTsKKyAgICB1aW50OF90KiBkZWNvbXBfYnVmOworICAgIHVpbnQ4X3QgcGFsWzc2OF07CisgICAgdWludDhfdCAqcHJldiwgKmN1cjsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgZm10OworICAgIGludCBjb21wOworICAgIGludCBmbGFnczsKKyAgICBpbnQgc3RyaWRlOworICAgIGludCBidywgYmgsIGJ4LCBieTsKKyAgICBpbnQgZGVjb21wX2xlbjsKKyAgICB6X3N0cmVhbSB6c3RyZWFtOworICAgIGludCAoKmRlY29kZV9pbnRyYSkoc3RydWN0IFptYnZDb250ZXh0ICpjKTsKKyAgICBpbnQgKCpkZWNvZGVfeG9yKShzdHJ1Y3QgWm1idkNvbnRleHQgKmMpOworfSBabWJ2Q29udGV4dDsKKworLyoqCisgKiBEZWNvZGUgWE9SJ2VkIGZyYW1lIC0gOGJwcCB2ZXJzaW9uCisgKi8KKworc3RhdGljIGludCB6bWJ2X2RlY29kZV94b3JfOChabWJ2Q29udGV4dCAqYykKK3sKKyAgICB1aW50OF90ICpzcmMgPSBjLT5kZWNvbXBfYnVmOworICAgIHVpbnQ4X3QgKm91dHB1dCwgKnByZXY7CisgICAgaW50OF90ICptdmVjOworICAgIGludCB4LCB5OworICAgIGludCBkLCBkeCwgZHksIGJ3MiwgYmgyOworICAgIGludCBibG9jazsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgbXgsIG15OworCisgICAgb3V0cHV0ID0gYy0+Y3VyOworICAgIHByZXYgPSBjLT5wcmV2OworCisgICAgaWYgKGMtPmZsYWdzICYgWk1CVl9ERUxUQVBBTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzY4OyBpKyspCisgICAgICAgICAgICBjLT5wYWxbaV0gXj0gKnNyYysrOworICAgIH0KKworICAgIG12ZWMgPSAoaW50OF90KilzcmM7CisgICAgc3JjICs9ICgoYy0+YnggKiBjLT5ieSAqIDIgKyAzKSAmIH4zKTsKKworICAgIGJsb2NrID0gMDsKKyAgICBmb3IgKHkgPSAwOyB5IDwgYy0+aGVpZ2h0OyB5ICs9IGMtPmJoKSB7CisgICAgICAgIGJoMiA9ICgoYy0+aGVpZ2h0IC0geSkgPiBjLT5iaCkgPyBjLT5iaCA6IChjLT5oZWlnaHQgLSB5KTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGMtPndpZHRoOyB4ICs9IGMtPmJ3KSB7CisgICAgICAgICAgICB1aW50OF90ICpvdXQsICp0cHJldjsKKworICAgICAgICAgICAgZCA9IG12ZWNbYmxvY2tdICYgMTsKKyAgICAgICAgICAgIGR4ID0gbXZlY1tibG9ja10gPj4gMTsKKyAgICAgICAgICAgIGR5ID0gbXZlY1tibG9jayArIDFdID4+IDE7CisgICAgICAgICAgICBibG9jayArPSAyOworCisgICAgICAgICAgICBidzIgPSAoKGMtPndpZHRoIC0geCkgPiBjLT5idykgPyBjLT5idyA6IChjLT53aWR0aCAtIHgpOworCisgICAgICAgICAgICAvKiBjb3B5IGJsb2NrIC0gbW90aW9uIHZlY3RvcnMgb3V0IG9mIGJvdW5kcyBhcmUgdXNlZCB0byB6ZXJvIGJsb2NrcyAqLworICAgICAgICAgICAgb3V0ID0gb3V0cHV0ICsgeDsKKyAgICAgICAgICAgIHRwcmV2ID0gcHJldiArIHggKyBkeCArIGR5ICogYy0+d2lkdGg7CisgICAgICAgICAgICBteCA9IHggKyBkeDsKKyAgICAgICAgICAgIG15ID0geSArIGR5OworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJoMjsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKG15ICsgaiA8IDAgfHwgbXkgKyBqID49IGMtPmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQob3V0LCAwLCBidzIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidzI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG14ICsgaSA8IDAgfHwgbXggKyBpID49IGMtPndpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFtpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2ldID0gdHByZXZbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0ICs9IGMtPndpZHRoOworICAgICAgICAgICAgICAgIHRwcmV2ICs9IGMtPndpZHRoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZCkgeyAvKiBhcHBseSBYT1InZWQgZGlmZmVyZW5jZSAqLworICAgICAgICAgICAgICAgIG91dCA9IG91dHB1dCArIHg7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJoMjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidzI7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFtpXSBePSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIG91dCArPSBjLT53aWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0ICs9IGMtPndpZHRoICogYy0+Ymg7CisgICAgICAgIHByZXYgKz0gYy0+d2lkdGggKiBjLT5iaDsKKyAgICB9CisgICAgaWYgKHNyYyAtIGMtPmRlY29tcF9idWYgIT0gYy0+ZGVjb21wX2xlbikKKyAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVc2VkICUiUFRSRElGRl9TUEVDSUZJRVIiIG9mICVpIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgc3JjLWMtPmRlY29tcF9idWYsIGMtPmRlY29tcF9sZW4pOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIERlY29kZSBYT1InZWQgZnJhbWUgLSAxNWJwcCBhbmQgMTZicHAgdmVyc2lvbgorICovCisKK3N0YXRpYyBpbnQgem1idl9kZWNvZGVfeG9yXzE2KFptYnZDb250ZXh0ICpjKQoreworICAgIHVpbnQ4X3QgKnNyYyA9IGMtPmRlY29tcF9idWY7CisgICAgdWludDE2X3QgKm91dHB1dCwgKnByZXY7CisgICAgaW50OF90ICptdmVjOworICAgIGludCB4LCB5OworICAgIGludCBkLCBkeCwgZHksIGJ3MiwgYmgyOworICAgIGludCBibG9jazsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgbXgsIG15OworCisgICAgb3V0cHV0ID0gKHVpbnQxNl90KiljLT5jdXI7CisgICAgcHJldiA9ICh1aW50MTZfdCopYy0+cHJldjsKKworICAgIG12ZWMgPSAoaW50OF90KilzcmM7CisgICAgc3JjICs9ICgoYy0+YnggKiBjLT5ieSAqIDIgKyAzKSAmIH4zKTsKKworICAgIGJsb2NrID0gMDsKKyAgICBmb3IgKHkgPSAwOyB5IDwgYy0+aGVpZ2h0OyB5ICs9IGMtPmJoKSB7CisgICAgICAgIGJoMiA9ICgoYy0+aGVpZ2h0IC0geSkgPiBjLT5iaCkgPyBjLT5iaCA6IChjLT5oZWlnaHQgLSB5KTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGMtPndpZHRoOyB4ICs9IGMtPmJ3KSB7CisgICAgICAgICAgICB1aW50MTZfdCAqb3V0LCAqdHByZXY7CisKKyAgICAgICAgICAgIGQgPSBtdmVjW2Jsb2NrXSAmIDE7CisgICAgICAgICAgICBkeCA9IG12ZWNbYmxvY2tdID4+IDE7CisgICAgICAgICAgICBkeSA9IG12ZWNbYmxvY2sgKyAxXSA+PiAxOworICAgICAgICAgICAgYmxvY2sgKz0gMjsKKworICAgICAgICAgICAgYncyID0gKChjLT53aWR0aCAtIHgpID4gYy0+YncpID8gYy0+YncgOiAoYy0+d2lkdGggLSB4KTsKKworICAgICAgICAgICAgLyogY29weSBibG9jayAtIG1vdGlvbiB2ZWN0b3JzIG91dCBvZiBib3VuZHMgYXJlIHVzZWQgdG8gemVybyBibG9ja3MgKi8KKyAgICAgICAgICAgIG91dCA9IG91dHB1dCArIHg7CisgICAgICAgICAgICB0cHJldiA9IHByZXYgKyB4ICsgZHggKyBkeSAqIGMtPndpZHRoOworICAgICAgICAgICAgbXggPSB4ICsgZHg7CisgICAgICAgICAgICBteSA9IHkgKyBkeTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBiaDI7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChteSArIGogPCAwIHx8IG15ICsgaiA+PSBjLT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG91dCwgMCwgYncyICogMik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ3MjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXggKyBpIDwgMCB8fCBteCArIGkgPj0gYy0+d2lkdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2ldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbaV0gPSB0cHJldltpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgKz0gYy0+d2lkdGg7CisgICAgICAgICAgICAgICAgdHByZXYgKz0gYy0+d2lkdGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkKSB7IC8qIGFwcGx5IFhPUidlZCBkaWZmZXJlbmNlICovCisgICAgICAgICAgICAgICAgb3V0ID0gb3V0cHV0ICsgeDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmgyOyBqKyspeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYncyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFtpXSBePSAqKCh1aW50MTZfdCopc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dCArPSBjLT53aWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0ICs9IGMtPndpZHRoICogYy0+Ymg7CisgICAgICAgIHByZXYgKz0gYy0+d2lkdGggKiBjLT5iaDsKKyAgICB9CisgICAgaWYgKHNyYyAtIGMtPmRlY29tcF9idWYgIT0gYy0+ZGVjb21wX2xlbikKKyAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVc2VkICUiUFRSRElGRl9TUEVDSUZJRVIiIG9mICVpIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgc3JjLWMtPmRlY29tcF9idWYsIGMtPmRlY29tcF9sZW4pOworICAgIHJldHVybiAwOworfQorCisjaWZkZWYgWk1CVl9FTkFCTEVfMjRCUFAKKy8qKgorICogRGVjb2RlIFhPUidlZCBmcmFtZSAtIDI0YnBwIHZlcnNpb24KKyAqLworCitzdGF0aWMgaW50IHptYnZfZGVjb2RlX3hvcl8yNChabWJ2Q29udGV4dCAqYykKK3sKKyAgICB1aW50OF90ICpzcmMgPSBjLT5kZWNvbXBfYnVmOworICAgIHVpbnQ4X3QgKm91dHB1dCwgKnByZXY7CisgICAgaW50OF90ICptdmVjOworICAgIGludCB4LCB5OworICAgIGludCBkLCBkeCwgZHksIGJ3MiwgYmgyOworICAgIGludCBibG9jazsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgbXgsIG15OworICAgIGludCBzdHJpZGU7CisKKyAgICBvdXRwdXQgPSBjLT5jdXI7CisgICAgcHJldiA9IGMtPnByZXY7CisKKyAgICBzdHJpZGUgPSBjLT53aWR0aCAqIDM7CisgICAgbXZlYyA9IChpbnQ4X3QqKXNyYzsKKyAgICBzcmMgKz0gKChjLT5ieCAqIGMtPmJ5ICogMiArIDMpICYgfjMpOworCisgICAgYmxvY2sgPSAwOworICAgIGZvciAoeSA9IDA7IHkgPCBjLT5oZWlnaHQ7IHkgKz0gYy0+YmgpIHsKKyAgICAgICAgYmgyID0gKChjLT5oZWlnaHQgLSB5KSA+IGMtPmJoKSA/IGMtPmJoIDogKGMtPmhlaWdodCAtIHkpOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYy0+d2lkdGg7IHggKz0gYy0+YncpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKm91dCwgKnRwcmV2OworCisgICAgICAgICAgICBkID0gbXZlY1tibG9ja10gJiAxOworICAgICAgICAgICAgZHggPSBtdmVjW2Jsb2NrXSA+PiAxOworICAgICAgICAgICAgZHkgPSBtdmVjW2Jsb2NrICsgMV0gPj4gMTsKKyAgICAgICAgICAgIGJsb2NrICs9IDI7CisKKyAgICAgICAgICAgIGJ3MiA9ICgoYy0+d2lkdGggLSB4KSA+IGMtPmJ3KSA/IGMtPmJ3IDogKGMtPndpZHRoIC0geCk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgYmxvY2sgLSBtb3Rpb24gdmVjdG9ycyBvdXQgb2YgYm91bmRzIGFyZSB1c2VkIHRvIHplcm8gYmxvY2tzICovCisgICAgICAgICAgICBvdXQgPSBvdXRwdXQgKyB4ICogMzsKKyAgICAgICAgICAgIHRwcmV2ID0gcHJldiArICh4ICsgZHgpICogMyArIGR5ICogc3RyaWRlOworICAgICAgICAgICAgbXggPSB4ICsgZHg7CisgICAgICAgICAgICBteSA9IHkgKyBkeTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBiaDI7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChteSArIGogPCAwIHx8IG15ICsgaiA+PSBjLT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG91dCwgMCwgYncyICogMyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ3MjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteCArIGkgPCAwIHx8IG14ICsgaSA+PSBjLT53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFtpICogMyArIDBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbaSAqIDMgKyAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2kgKiAzICsgMl0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbaSAqIDMgKyAwXSA9IHRwcmV2W2kgKiAzICsgMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2kgKiAzICsgMV0gPSB0cHJldltpICogMyArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFtpICogMyArIDJdID0gdHByZXZbaSAqIDMgKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIHRwcmV2ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGQpIHsgLyogYXBwbHkgWE9SJ2VkIGRpZmZlcmVuY2UgKi8KKyAgICAgICAgICAgICAgICBvdXQgPSBvdXRwdXQgKyB4ICogMzsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmgyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ3MjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbaSAqIDMgKyAwXSBePSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbaSAqIDMgKyAxXSBePSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbaSAqIDMgKyAyXSBePSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0ICs9IHN0cmlkZSAqIGMtPmJoOworICAgICAgICBwcmV2ICs9IHN0cmlkZSAqIGMtPmJoOworICAgIH0KKyAgICBpZiAoc3JjIC0gYy0+ZGVjb21wX2J1ZiAhPSBjLT5kZWNvbXBfbGVuKQorICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlVzZWQgJWkgb2YgJWkgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICBzcmMtYy0+ZGVjb21wX2J1ZiwgYy0+ZGVjb21wX2xlbik7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9aTUJWX0VOQUJMRV8yNEJQUAorCisvKioKKyAqIERlY29kZSBYT1InZWQgZnJhbWUgLSAzMmJwcCB2ZXJzaW9uCisgKi8KKworc3RhdGljIGludCB6bWJ2X2RlY29kZV94b3JfMzIoWm1idkNvbnRleHQgKmMpCit7CisgICAgdWludDhfdCAqc3JjID0gYy0+ZGVjb21wX2J1ZjsKKyAgICB1aW50MzJfdCAqb3V0cHV0LCAqcHJldjsKKyAgICBpbnQ4X3QgKm12ZWM7CisgICAgaW50IHgsIHk7CisgICAgaW50IGQsIGR4LCBkeSwgYncyLCBiaDI7CisgICAgaW50IGJsb2NrOworICAgIGludCBpLCBqOworICAgIGludCBteCwgbXk7CisKKyAgICBvdXRwdXQgPSAodWludDMyX3QqKWMtPmN1cjsKKyAgICBwcmV2ID0gKHVpbnQzMl90KiljLT5wcmV2OworCisgICAgbXZlYyA9IChpbnQ4X3QqKXNyYzsKKyAgICBzcmMgKz0gKChjLT5ieCAqIGMtPmJ5ICogMiArIDMpICYgfjMpOworCisgICAgYmxvY2sgPSAwOworICAgIGZvciAoeSA9IDA7IHkgPCBjLT5oZWlnaHQ7IHkgKz0gYy0+YmgpIHsKKyAgICAgICAgYmgyID0gKChjLT5oZWlnaHQgLSB5KSA+IGMtPmJoKSA/IGMtPmJoIDogKGMtPmhlaWdodCAtIHkpOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYy0+d2lkdGg7IHggKz0gYy0+YncpIHsKKyAgICAgICAgICAgIHVpbnQzMl90ICpvdXQsICp0cHJldjsKKworICAgICAgICAgICAgZCA9IG12ZWNbYmxvY2tdICYgMTsKKyAgICAgICAgICAgIGR4ID0gbXZlY1tibG9ja10gPj4gMTsKKyAgICAgICAgICAgIGR5ID0gbXZlY1tibG9jayArIDFdID4+IDE7CisgICAgICAgICAgICBibG9jayArPSAyOworCisgICAgICAgICAgICBidzIgPSAoKGMtPndpZHRoIC0geCkgPiBjLT5idykgPyBjLT5idyA6IChjLT53aWR0aCAtIHgpOworCisgICAgICAgICAgICAvKiBjb3B5IGJsb2NrIC0gbW90aW9uIHZlY3RvcnMgb3V0IG9mIGJvdW5kcyBhcmUgdXNlZCB0byB6ZXJvIGJsb2NrcyAqLworICAgICAgICAgICAgb3V0ID0gb3V0cHV0ICsgeDsKKyAgICAgICAgICAgIHRwcmV2ID0gcHJldiArIHggKyBkeCArIGR5ICogYy0+d2lkdGg7CisgICAgICAgICAgICBteCA9IHggKyBkeDsKKyAgICAgICAgICAgIG15ID0geSArIGR5OworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJoMjsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKG15ICsgaiA8IDAgfHwgbXkgKyBqID49IGMtPmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQob3V0LCAwLCBidzIgKiA0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYncyOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG14ICsgaSA8IDAgfHwgbXggKyBpID49IGMtPndpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFtpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2ldID0gdHByZXZbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0ICs9IGMtPndpZHRoOworICAgICAgICAgICAgICAgIHRwcmV2ICs9IGMtPndpZHRoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZCkgeyAvKiBhcHBseSBYT1InZWQgZGlmZmVyZW5jZSAqLworICAgICAgICAgICAgICAgIG91dCA9IG91dHB1dCArIHg7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJoMjsgaisrKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ3MjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbaV0gXj0gKigodWludDMyX3QgKikgc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYyArPSA0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dCArPSBjLT53aWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0ICs9IGMtPndpZHRoICogYy0+Ymg7CisgICAgICAgIHByZXYgICArPSBjLT53aWR0aCAqIGMtPmJoOworICAgIH0KKyAgICBpZiAoc3JjIC0gYy0+ZGVjb21wX2J1ZiAhPSBjLT5kZWNvbXBfbGVuKQorICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlVzZWQgJSJQVFJESUZGX1NQRUNJRklFUiIgb2YgJWkgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICBzcmMtYy0+ZGVjb21wX2J1ZiwgYy0+ZGVjb21wX2xlbik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVjb2RlIGludHJhZnJhbWUKKyAqLworc3RhdGljIGludCB6bWJ2X2RlY29kZV9pbnRyYShabWJ2Q29udGV4dCAqYykKK3sKKyAgICB1aW50OF90ICpzcmMgPSBjLT5kZWNvbXBfYnVmOworCisgICAgLyogbWFrZSB0aGUgcGFsZXR0ZSBhdmFpbGFibGUgb24gdGhlIHdheSBvdXQgKi8KKyAgICBpZiAoYy0+Zm10ID09IFpNQlZfRk1UXzhCUFApIHsKKyAgICAgICAgbWVtY3B5KGMtPnBhbCwgc3JjLCA3NjgpOworICAgICAgICBzcmMgKz0gNzY4OworICAgIH0KKworICAgIG1lbWNweShjLT5jdXIsIHNyYywgYy0+d2lkdGggKiBjLT5oZWlnaHQgKiAoYy0+YnBwIC8gOCkpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIFptYnZDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHpyZXQgPSBaX09LOyAvLyBabGliIHJldHVybiBjb2RlCisgICAgaW50IGxlbiA9IGJ1Zl9zaXplOworICAgIGludCBoaV92ZXIsIGxvX3ZlciwgcmV0OworCisgICAgLyogcGFyc2UgaGVhZGVyICovCisgICAgYy0+ZmxhZ3MgPSBidWZbMF07CisgICAgYnVmKys7IGxlbi0tOworICAgIGlmIChjLT5mbGFncyAmIFpNQlZfS0VZRlJBTUUpIHsKKyAgICAgICAgdm9pZCAqZGVjb2RlX2ludHJhID0gTlVMTDsKKyAgICAgICAgYy0+ZGVjb2RlX2ludHJhPSBOVUxMOworICAgICAgICBoaV92ZXIgPSBidWZbMF07CisgICAgICAgIGxvX3ZlciA9IGJ1ZlsxXTsKKyAgICAgICAgYy0+Y29tcCA9IGJ1ZlsyXTsKKyAgICAgICAgYy0+Zm10ID0gYnVmWzNdOworICAgICAgICBjLT5idyA9IGJ1Zls0XTsKKyAgICAgICAgYy0+YmggPSBidWZbNV07CisgICAgICAgIGMtPmRlY29kZV9pbnRyYSA9IE5VTEw7CisgICAgICAgIGMtPmRlY29kZV94b3IgPSBOVUxMOworCisgICAgICAgIGJ1ZiArPSA2OworICAgICAgICBsZW4gLT0gNjsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiRmxhZ3M9JVggdmVyPSVpLiVpIGNvbXA9JWkgZm10PSVpIGJsaz0laXglaVxuIiwKKyAgICAgICAgICAgICAgIGMtPmZsYWdzLGhpX3Zlcixsb192ZXIsYy0+Y29tcCxjLT5mbXQsYy0+YncsYy0+YmgpOworICAgICAgICBpZiAoaGlfdmVyICE9IDAgfHwgbG9fdmVyICE9IDEpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIlZlcnNpb24gJWkuJWkiLCBoaV92ZXIsIGxvX3Zlcik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMtPmJ3ID09IDAgfHwgYy0+YmggPT0gMCkgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiQmxvY2sgc2l6ZSAlaXglaSIsIGMtPmJ3LCBjLT5iaCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMtPmNvbXAgIT0gMCAmJiBjLT5jb21wICE9IDEpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkNvbXByZXNzaW9uIHR5cGUgJWkiLCBjLT5jb21wKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYy0+Zm10KSB7CisgICAgICAgIGNhc2UgWk1CVl9GTVRfOEJQUDoKKyAgICAgICAgICAgIGMtPmJwcCA9IDg7CisgICAgICAgICAgICBkZWNvZGVfaW50cmEgPSB6bWJ2X2RlY29kZV9pbnRyYTsKKyAgICAgICAgICAgIGMtPmRlY29kZV94b3IgPSB6bWJ2X2RlY29kZV94b3JfODsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworICAgICAgICAgICAgYy0+c3RyaWRlID0gYy0+d2lkdGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTUJWX0ZNVF8xNUJQUDoKKyAgICAgICAgY2FzZSBaTUJWX0ZNVF8xNkJQUDoKKyAgICAgICAgICAgIGMtPmJwcCA9IDE2OworICAgICAgICAgICAgZGVjb2RlX2ludHJhID0gem1idl9kZWNvZGVfaW50cmE7CisgICAgICAgICAgICBjLT5kZWNvZGVfeG9yID0gem1idl9kZWNvZGVfeG9yXzE2OworICAgICAgICAgICAgaWYgKGMtPmZtdCA9PSBaTUJWX0ZNVF8xNUJQUCkKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNTU1TEU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU2NUxFOworICAgICAgICAgICAgYy0+c3RyaWRlID0gYy0+d2lkdGggKiAyOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgWk1CVl9FTkFCTEVfMjRCUFAKKyAgICAgICAgY2FzZSBaTUJWX0ZNVF8yNEJQUDoKKyAgICAgICAgICAgIGMtPmJwcCA9IDI0OworICAgICAgICAgICAgZGVjb2RlX2ludHJhID0gem1idl9kZWNvZGVfaW50cmE7CisgICAgICAgICAgICBjLT5kZWNvZGVfeG9yID0gem1idl9kZWNvZGVfeG9yXzI0OworICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjI0OworICAgICAgICAgICAgYy0+c3RyaWRlID0gYy0+d2lkdGggKiAzOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy9aTUJWX0VOQUJMRV8yNEJQUAorICAgICAgICBjYXNlIFpNQlZfRk1UXzMyQlBQOgorICAgICAgICAgICAgYy0+YnBwID0gMzI7CisgICAgICAgICAgICBkZWNvZGVfaW50cmEgPSB6bWJ2X2RlY29kZV9pbnRyYTsKKyAgICAgICAgICAgIGMtPmRlY29kZV94b3IgPSB6bWJ2X2RlY29kZV94b3JfMzI7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMDsKKyAgICAgICAgICAgIGMtPnN0cmlkZSA9IGMtPndpZHRoICogNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYy0+ZGVjb2RlX3hvciA9IE5VTEw7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJGb3JtYXQgJWkiLCBjLT5mbXQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisKKyAgICAgICAgenJldCA9IGluZmxhdGVSZXNldCgmYy0+enN0cmVhbSk7CisgICAgICAgIGlmICh6cmV0ICE9IFpfT0spIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5mbGF0ZSByZXNldCBlcnJvcjogJWRcbiIsIHpyZXQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorCisgICAgICAgIGMtPmN1ciAgPSBhdl9yZWFsbG9jX2YoYy0+Y3VyLCBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0LCAgKGMtPmJwcCAvIDgpKTsKKyAgICAgICAgYy0+cHJldiA9IGF2X3JlYWxsb2NfZihjLT5wcmV2LCBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0LCAgKGMtPmJwcCAvIDgpKTsKKyAgICAgICAgYy0+YnggPSAoYy0+d2lkdGggKyBjLT5idyAtIDEpIC8gYy0+Ync7CisgICAgICAgIGMtPmJ5ID0gKGMtPmhlaWdodCsgYy0+YmggLSAxKSAvIGMtPmJoOworICAgICAgICBpZiAoIWMtPmN1ciB8fCAhYy0+cHJldikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbXNldChjLT5jdXIsIDAsIGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiAoYy0+YnBwIC8gOCkpOworICAgICAgICBtZW1zZXQoYy0+cHJldiwgMCwgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqIChjLT5icHAgLyA4KSk7CisgICAgICAgIGMtPmRlY29kZV9pbnRyYT0gZGVjb2RlX2ludHJhOworICAgIH0KKworICAgIGlmICghYy0+ZGVjb2RlX2ludHJhKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IhIEdvdCBubyBmb3JtYXQgb3Igbm8ga2V5ZnJhbWUhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChjLT5jb21wID09IDApIHsgLy9VbmNvbXByZXNzZWQgZGF0YQorICAgICAgICBpZiAoYy0+ZGVjb21wX3NpemUgPCBsZW4pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQnVmZmVyIHRvbyBzbWFsbFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYy0+ZGVjb21wX2J1ZiwgYnVmLCBsZW4pOworICAgIH0gZWxzZSB7IC8vIFpMSUItY29tcHJlc3NlZCBkYXRhCisgICAgICAgIGMtPnpzdHJlYW0udG90YWxfaW4gPSBjLT56c3RyZWFtLnRvdGFsX291dCA9IDA7CisgICAgICAgIGMtPnpzdHJlYW0ubmV4dF9pbiA9ICh1aW50OF90KilidWY7CisgICAgICAgIGMtPnpzdHJlYW0uYXZhaWxfaW4gPSBsZW47CisgICAgICAgIGMtPnpzdHJlYW0ubmV4dF9vdXQgPSBjLT5kZWNvbXBfYnVmOworICAgICAgICBjLT56c3RyZWFtLmF2YWlsX291dCA9IGMtPmRlY29tcF9zaXplOworICAgICAgICB6cmV0ID0gaW5mbGF0ZSgmYy0+enN0cmVhbSwgWl9TWU5DX0ZMVVNIKTsKKyAgICAgICAgaWYgKHpyZXQgIT0gWl9PSyAmJiB6cmV0ICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbmZsYXRlIGVycm9yICVkXG4iLCB6cmV0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGMtPmRlY29tcF9sZW4gPSBjLT56c3RyZWFtLnRvdGFsX291dDsKKyAgICB9CisgICAgaWYgKGMtPmZsYWdzICYgWk1CVl9LRVlGUkFNRSkgeworICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICBjLT5kZWNvZGVfaW50cmEoYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhbWUtPmtleV9mcmFtZSA9IDA7CisgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgaWYgKGMtPmRlY29tcF9sZW4pCisgICAgICAgICAgICBjLT5kZWNvZGVfeG9yKGMpOworICAgIH0KKworICAgIC8qIHVwZGF0ZSBmcmFtZXMgKi8KKyAgICB7CisgICAgICAgIHVpbnQ4X3QgKm91dCwgKnNyYzsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgb3V0ID0gZnJhbWUtPmRhdGFbMF07CisgICAgICAgIHNyYyA9IGMtPmN1cjsKKyAgICAgICAgc3dpdGNoIChjLT5mbXQpIHsKKyAgICAgICAgY2FzZSBaTUJWX0ZNVF84QlBQOgorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQorICAgICAgICAgICAgICAgIEFWX1dOMzIoJmZyYW1lLT5kYXRhWzFdW2ogKiA0XSwgMHhGRlUgPDwgMjQgfCBBVl9SQjI0KCZjLT5wYWxbaiAqIDNdKSk7CisgICAgICAgIGNhc2UgWk1CVl9GTVRfMTVCUFA6CisgICAgICAgIGNhc2UgWk1CVl9GTVRfMTZCUFA6CisjaWZkZWYgWk1CVl9FTkFCTEVfMjRCUFAKKyAgICAgICAgY2FzZSBaTUJWX0ZNVF8yNEJQUDoKKyNlbmRpZgorICAgICAgICBjYXNlIFpNQlZfRk1UXzMyQlBQOgorICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQsIGZyYW1lLT5saW5lc2l6ZVswXSwgc3JjLCBjLT5zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnN0cmlkZSwgYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgaGFuZGxlIGZvcm1hdCAlaVxuIiwgYy0+Zm10KTsKKyAgICAgICAgfQorICAgICAgICBGRlNXQVAodWludDhfdCAqLCBjLT5jdXIsIGMtPnByZXYpOworICAgIH0KKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIC8qIGFsd2F5cyByZXBvcnQgdGhhdCB0aGUgYnVmZmVyIHdhcyBjb21wbGV0ZWx5IGNvbnN1bWVkICovCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFptYnZDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHpyZXQ7IC8vIFpsaWIgcmV0dXJuIGNvZGUKKworICAgIGMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICBjLT53aWR0aCA9IGF2Y3R4LT53aWR0aDsKKyAgICBjLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgYy0+YnBwID0gYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKworICAgIC8vIE5lZWRlZCBpZiB6bGliIHVudXNlZCBvciBpbml0IGFib3J0ZWQgYmVmb3JlIGluZmxhdGVJbml0CisgICAgbWVtc2V0KCZjLT56c3RyZWFtLCAwLCBzaXplb2Yoel9zdHJlYW0pKTsKKworICAgIGMtPmRlY29tcF9zaXplID0gKGF2Y3R4LT53aWR0aCArIDI1NSkgKiA0ICogKGF2Y3R4LT5oZWlnaHQgKyA2NCk7CisKKyAgICAvKiBBbGxvY2F0ZSBkZWNvbXByZXNzaW9uIGJ1ZmZlciAqLworICAgIGlmIChjLT5kZWNvbXBfc2l6ZSkgeworICAgICAgICBpZiAoIShjLT5kZWNvbXBfYnVmID0gYXZfbWFsbG9jeihjLT5kZWNvbXBfc2l6ZSkpKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgYWxsb2NhdGUgZGVjb21wcmVzc2lvbiBidWZmZXIuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjLT56c3RyZWFtLnphbGxvYyA9IFpfTlVMTDsKKyAgICBjLT56c3RyZWFtLnpmcmVlID0gWl9OVUxMOworICAgIGMtPnpzdHJlYW0ub3BhcXVlID0gWl9OVUxMOworICAgIHpyZXQgPSBpbmZsYXRlSW5pdCgmYy0+enN0cmVhbSk7CisgICAgaWYgKHpyZXQgIT0gWl9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluZmxhdGUgaW5pdCBlcnJvcjogJWRcbiIsIHpyZXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgWm1idkNvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZjLT5kZWNvbXBfYnVmKTsKKworICAgIGluZmxhdGVFbmQoJmMtPnpzdHJlYW0pOworICAgIGF2X2ZyZWVwKCZjLT5jdXIpOworICAgIGF2X2ZyZWVwKCZjLT5wcmV2KTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3ptYnZfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiem1idiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlppcCBNb3Rpb24gQmxvY2tzIFZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1pNQlYsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFptYnZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBDT0RFQ19DQVBfRFIxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmNvZGVjL3ptYnZlbmMuYyBiL2ZmbXBlZy9saWJhdmNvZGVjL3ptYnZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDU2YTEzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Y29kZWMvem1idmVuYy5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogWmlwIE1vdGlvbiBCbG9ja3MgVmlkZW8gKFpNQlYpIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFppcCBNb3Rpb24gQmxvY2tzIFZpZGVvIGVuY29kZXIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlIDx6bGliLmg+CisKKyNkZWZpbmUgWk1CVl9LRVlGUkFNRSAxCisjZGVmaW5lIFpNQlZfREVMVEFQQUwgMgorCisjZGVmaW5lIFpNQlZfQkxPQ0sgMTYKKworLyoqCisgKiBFbmNvZGVyIGNvbnRleHQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgWm1idkVuY0NvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKworICAgIGludCByYW5nZTsKKyAgICB1aW50OF90ICpjb21wX2J1ZiwgKndvcmtfYnVmOworICAgIHVpbnQ4X3QgcGFsWzc2OF07CisgICAgdWludDMyX3QgcGFsMlsyNTZdOyAvL2ZvciBxdWljayBjb21wYXJpc29ucworICAgIHVpbnQ4X3QgKnByZXY7CisgICAgaW50IHBzdHJpZGU7CisgICAgaW50IGNvbXBfc2l6ZTsKKyAgICBpbnQga2V5aW50LCBjdXJmcm07CisgICAgel9zdHJlYW0genN0cmVhbTsKK30gWm1idkVuY0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgc2NvcmVfdGFiWzI1Nl07CisKKy8qKiBCbG9jayBjb21wYXJpbmcgZnVuY3Rpb24KKyAqIFhYWCBzaG91bGQgYmUgb3B0aW1pemVkIGFuZCBtb3ZlZCB0byBEU1BDb250ZXh0CisgKiBUT0RPIGhhbmRsZSBvdXQgb2YgZWRnZSBNRQorICovCitzdGF0aWMgaW5saW5lIGludCBibG9ja19jbXAodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCB1aW50OF90ICpzcmMyLCBpbnQgc3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYncsIGludCBiaCwgaW50ICp4b3JlZCkKK3sKKyAgICBpbnQgc3VtID0gMDsKKyAgICBpbnQgaSwgajsKKyAgICB1aW50OF90IGhpc3RvZ3JhbVsyNTZdID0gezB9OworCisgICAgKnhvcmVkID0gMDsKKyAgICBmb3IoaiA9IDA7IGogPCBiaDsgaisrKXsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgYnc7IGkrKyl7CisgICAgICAgICAgICBpbnQgdCA9IHNyY1tpXSBeIHNyYzJbaV07CisgICAgICAgICAgICBoaXN0b2dyYW1bdF0rKzsKKyAgICAgICAgICAgICp4b3JlZCB8PSB0OworICAgICAgICB9CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIHNyYzIgKz0gc3RyaWRlMjsKKyAgICB9CisKKyAgICBmb3IoaSA9IDE7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgc3VtICs9IHNjb3JlX3RhYltoaXN0b2dyYW1baV1dOworCisgICAgcmV0dXJuIHN1bTsKK30KKworLyoqIE1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uCisgKiBUT0RPIG1ha2UgYmV0dGVyIE1FIGRlY2lzaW9ucworICovCitzdGF0aWMgaW50IHptYnZfbWUoWm1idkVuY0NvbnRleHQgKmMsIHVpbnQ4X3QgKnNyYywgaW50IHNzdHJpZGUsIHVpbnQ4X3QgKnByZXYsCisgICAgICAgICAgICAgICAgICAgaW50IHBzdHJpZGUsIGludCB4LCBpbnQgeSwgaW50ICpteCwgaW50ICpteSwgaW50ICp4b3JlZCkKK3sKKyAgICBpbnQgZHgsIGR5LCB0eCwgdHksIHR2LCBidiwgYncsIGJoOworCisgICAgKm14ID0gKm15ID0gMDsKKyAgICBidyA9IEZGTUlOKFpNQlZfQkxPQ0ssIGMtPmF2Y3R4LT53aWR0aCAtIHgpOworICAgIGJoID0gRkZNSU4oWk1CVl9CTE9DSywgYy0+YXZjdHgtPmhlaWdodCAtIHkpOworICAgIGJ2ID0gYmxvY2tfY21wKHNyYywgc3N0cmlkZSwgcHJldiwgcHN0cmlkZSwgYncsIGJoLCB4b3JlZCk7CisgICAgaWYoIWJ2KSByZXR1cm4gMDsKKyAgICBmb3IodHkgPSBGRk1BWCh5IC0gYy0+cmFuZ2UsIDApOyB0eSA8IEZGTUlOKHkgKyBjLT5yYW5nZSwgYy0+YXZjdHgtPmhlaWdodCAtIGJoKTsgdHkrKyl7CisgICAgICAgIGZvcih0eCA9IEZGTUFYKHggLSBjLT5yYW5nZSwgMCk7IHR4IDwgRkZNSU4oeCArIGMtPnJhbmdlLCBjLT5hdmN0eC0+d2lkdGggLSBidyk7IHR4KyspeworICAgICAgICAgICAgaWYodHggPT0geCAmJiB0eSA9PSB5KSBjb250aW51ZTsgLy8gd2UgYWxyZWFkeSB0ZXN0ZWQgdGhpcyBibG9jaworICAgICAgICAgICAgZHggPSB0eCAtIHg7CisgICAgICAgICAgICBkeSA9IHR5IC0geTsKKyAgICAgICAgICAgIHR2ID0gYmxvY2tfY21wKHNyYywgc3N0cmlkZSwgcHJldiArIGR4ICsgZHkqcHN0cmlkZSwgcHN0cmlkZSwgYncsIGJoLCB4b3JlZCk7CisgICAgICAgICAgICBpZih0diA8IGJ2KXsKKyAgICAgICAgICAgICAgICAgYnYgPSB0djsKKyAgICAgICAgICAgICAgICAgKm14ID0gZHg7CisgICAgICAgICAgICAgICAgICpteSA9IGR5OworICAgICAgICAgICAgICAgICBpZighYnYpIHJldHVybiAwOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ2OworfQorCitzdGF0aWMgaW50IGVuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWN0LCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgWm1idkVuY0NvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBBVkZyYW1lICogY29uc3QgcCA9IHBpY3Q7CisgICAgdWludDhfdCAqc3JjLCAqcHJldiwgKmJ1ZjsKKyAgICB1aW50MzJfdCAqcGFscHRyOworICAgIGludCBrZXlmcmFtZSwgY2hwYWw7CisgICAgaW50IGZsOworICAgIGludCB3b3JrX3NpemUgPSAwLCBwa3Rfc2l6ZTsKKyAgICBpbnQgYncsIGJoOworICAgIGludCBpLCBqLCByZXQ7CisKKyAgICBrZXlmcmFtZSA9ICFjLT5jdXJmcm07CisgICAgYy0+Y3VyZnJtKys7CisgICAgaWYoYy0+Y3VyZnJtID09IGMtPmtleWludCkKKyAgICAgICAgYy0+Y3VyZnJtID0gMDsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IGtleWZyYW1lID8gQVZfUElDVFVSRV9UWVBFX0kgOiBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IGtleWZyYW1lOworICAgIGNocGFsID0gIWtleWZyYW1lICYmIG1lbWNtcChwLT5kYXRhWzFdLCBjLT5wYWwyLCAxMDI0KTsKKworICAgIHBhbHB0ciA9ICh1aW50MzJfdCopcC0+ZGF0YVsxXTsKKyAgICBzcmMgPSBwLT5kYXRhWzBdOworICAgIHByZXYgPSBjLT5wcmV2OworICAgIGlmKGNocGFsKXsKKyAgICAgICAgdWludDhfdCB0cGFsWzNdOworICAgICAgICBmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKyl7CisgICAgICAgICAgICBBVl9XQjI0KHRwYWwsIHBhbHB0cltpXSk7CisgICAgICAgICAgICBjLT53b3JrX2J1Zlt3b3JrX3NpemUrK10gPSB0cGFsWzBdIF4gYy0+cGFsW2kgKiAzICsgMF07CisgICAgICAgICAgICBjLT53b3JrX2J1Zlt3b3JrX3NpemUrK10gPSB0cGFsWzFdIF4gYy0+cGFsW2kgKiAzICsgMV07CisgICAgICAgICAgICBjLT53b3JrX2J1Zlt3b3JrX3NpemUrK10gPSB0cGFsWzJdIF4gYy0+cGFsW2kgKiAzICsgMl07CisgICAgICAgICAgICBjLT5wYWxbaSAqIDMgKyAwXSA9IHRwYWxbMF07CisgICAgICAgICAgICBjLT5wYWxbaSAqIDMgKyAxXSA9IHRwYWxbMV07CisgICAgICAgICAgICBjLT5wYWxbaSAqIDMgKyAyXSA9IHRwYWxbMl07CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGMtPnBhbDIsIHAtPmRhdGFbMV0sIDEwMjQpOworICAgIH0KKyAgICBpZihrZXlmcmFtZSl7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDI1NjsgaSsrKXsKKyAgICAgICAgICAgIEFWX1dCMjQoYy0+cGFsKyhpKjMpLCBwYWxwdHJbaV0pOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjLT53b3JrX2J1ZiwgYy0+cGFsLCA3NjgpOworICAgICAgICBtZW1jcHkoYy0+cGFsMiwgcC0+ZGF0YVsxXSwgMTAyNCk7CisgICAgICAgIHdvcmtfc2l6ZSA9IDc2ODsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKXsKKyAgICAgICAgICAgIG1lbWNweShjLT53b3JrX2J1ZiArIHdvcmtfc2l6ZSwgc3JjLCBhdmN0eC0+d2lkdGgpOworICAgICAgICAgICAgc3JjICs9IHAtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgd29ya19zaXplICs9IGF2Y3R4LT53aWR0aDsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBpbnQgeCwgeSwgYmgyLCBidzIsIHhvcmVkOworICAgICAgICB1aW50OF90ICp0c3JjLCAqdHByZXY7CisgICAgICAgIHVpbnQ4X3QgKm12OworICAgICAgICBpbnQgbXgsIG15OworCisgICAgICAgIGJ3ID0gKGF2Y3R4LT53aWR0aCArIFpNQlZfQkxPQ0sgLSAxKSAvIFpNQlZfQkxPQ0s7CisgICAgICAgIGJoID0gKGF2Y3R4LT5oZWlnaHQgKyBaTUJWX0JMT0NLIC0gMSkgLyBaTUJWX0JMT0NLOworICAgICAgICBtdiA9IGMtPndvcmtfYnVmICsgd29ya19zaXplOworICAgICAgICBtZW1zZXQoYy0+d29ya19idWYgKyB3b3JrX3NpemUsIDAsIChidyAqIGJoICogMiArIDMpICYgfjMpOworICAgICAgICB3b3JrX3NpemUgKz0gKGJ3ICogYmggKiAyICsgMykgJiB+MzsKKyAgICAgICAgLyogZm9yIG5vdyBqdXN0IFhPUidpbmcgKi8KKyAgICAgICAgZm9yKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSArPSBaTUJWX0JMT0NLKSB7CisgICAgICAgICAgICBiaDIgPSBGRk1JTihhdmN0eC0+aGVpZ2h0IC0geSwgWk1CVl9CTE9DSyk7CisgICAgICAgICAgICBmb3IoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHggKz0gWk1CVl9CTE9DSywgbXYgKz0gMikgeworICAgICAgICAgICAgICAgIGJ3MiA9IEZGTUlOKGF2Y3R4LT53aWR0aCAtIHgsIFpNQlZfQkxPQ0spOworCisgICAgICAgICAgICAgICAgdHNyYyA9IHNyYyArIHg7CisgICAgICAgICAgICAgICAgdHByZXYgPSBwcmV2ICsgeDsKKworICAgICAgICAgICAgICAgIHptYnZfbWUoYywgdHNyYywgcC0+bGluZXNpemVbMF0sIHRwcmV2LCBjLT5wc3RyaWRlLCB4LCB5LCAmbXgsICZteSwgJnhvcmVkKTsKKyAgICAgICAgICAgICAgICBtdlswXSA9IChteCA8PCAxKSB8ICEheG9yZWQ7CisgICAgICAgICAgICAgICAgbXZbMV0gPSBteSA8PCAxOworICAgICAgICAgICAgICAgIHRwcmV2ICs9IG14ICsgbXkgKiBjLT5wc3RyaWRlOworICAgICAgICAgICAgICAgIGlmKHhvcmVkKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgYmgyOyBqKyspeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgYncyOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+d29ya19idWZbd29ya19zaXplKytdID0gdHNyY1tpXSBeIHRwcmV2W2ldOworICAgICAgICAgICAgICAgICAgICAgICAgdHNyYyArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwcmV2ICs9IGMtPnBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgKz0gcC0+bGluZXNpemVbMF0gKiBaTUJWX0JMT0NLOworICAgICAgICAgICAgcHJldiArPSBjLT5wc3RyaWRlICogWk1CVl9CTE9DSzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBzYXZlIHRoZSBwcmV2aW91cyBmcmFtZSAqLworICAgIHNyYyA9IHAtPmRhdGFbMF07CisgICAgcHJldiA9IGMtPnByZXY7CisgICAgZm9yKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKXsKKyAgICAgICAgbWVtY3B5KHByZXYsIHNyYywgYXZjdHgtPndpZHRoKTsKKyAgICAgICAgcHJldiArPSBjLT5wc3RyaWRlOworICAgICAgICBzcmMgKz0gcC0+bGluZXNpemVbMF07CisgICAgfQorCisgICAgaWYgKGtleWZyYW1lKQorICAgICAgICBkZWZsYXRlUmVzZXQoJmMtPnpzdHJlYW0pOworCisgICAgYy0+enN0cmVhbS5uZXh0X2luID0gYy0+d29ya19idWY7CisgICAgYy0+enN0cmVhbS5hdmFpbF9pbiA9IHdvcmtfc2l6ZTsKKyAgICBjLT56c3RyZWFtLnRvdGFsX2luID0gMDsKKworICAgIGMtPnpzdHJlYW0ubmV4dF9vdXQgPSBjLT5jb21wX2J1ZjsKKyAgICBjLT56c3RyZWFtLmF2YWlsX291dCA9IGMtPmNvbXBfc2l6ZTsKKyAgICBjLT56c3RyZWFtLnRvdGFsX291dCA9IDA7CisgICAgaWYoZGVmbGF0ZSgmYy0+enN0cmVhbSwgWl9TWU5DX0ZMVVNIKSAhPSBaX09LKXsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBjb21wcmVzc2luZyBkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHBrdF9zaXplID0gYy0+enN0cmVhbS50b3RhbF9vdXQgKyAxICsgNiprZXlmcmFtZTsKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgcGt0X3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgYnVmID0gcGt0LT5kYXRhOworCisgICAgZmwgPSAoa2V5ZnJhbWUgPyBaTUJWX0tFWUZSQU1FIDogMCkgfCAoY2hwYWwgPyBaTUJWX0RFTFRBUEFMIDogMCk7CisgICAgKmJ1ZisrID0gZmw7CisgICAgaWYgKGtleWZyYW1lKSB7CisgICAgICAgICpidWYrKyA9IDA7IC8vIGhpIHZlcgorICAgICAgICAqYnVmKysgPSAxOyAvLyBsbyB2ZXIKKyAgICAgICAgKmJ1ZisrID0gMTsgLy8gY29tcAorICAgICAgICAqYnVmKysgPSA0OyAvLyBmb3JtYXQgLSA4YnBwCisgICAgICAgICpidWYrKyA9IFpNQlZfQkxPQ0s7IC8vIGJsb2NrIHdpZHRoCisgICAgICAgICpidWYrKyA9IFpNQlZfQkxPQ0s7IC8vIGJsb2NrIGhlaWdodAorICAgIH0KKyAgICBtZW1jcHkoYnVmLCBjLT5jb21wX2J1ZiwgYy0+enN0cmVhbS50b3RhbF9vdXQpOworCisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVkqa2V5ZnJhbWU7CisgICAgKmdvdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBabWJ2RW5jQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmMtPmNvbXBfYnVmKTsKKyAgICBhdl9mcmVlcCgmYy0+d29ya19idWYpOworCisgICAgZGVmbGF0ZUVuZCgmYy0+enN0cmVhbSk7CisgICAgYXZfZnJlZXAoJmMtPnByZXYpOworCisgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmNvZGVkX2ZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEluaXQgem1idiBlbmNvZGVyCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgWm1idkVuY0NvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgenJldDsgLy8gWmxpYiByZXR1cm4gY29kZQorICAgIGludCBpOworICAgIGludCBsdmwgPSA5OworCisgICAgZm9yKGk9MTsgaTwyNTY7IGkrKykKKyAgICAgICAgc2NvcmVfdGFiW2ldPSAtaSAqIGxvZyhpLyhkb3VibGUpKFpNQlZfQkxPQ0sqWk1CVl9CTE9DSykpICogKDI1Ni9NX0xOMik7CisKKyAgICBjLT5hdmN0eCA9IGF2Y3R4OworCisgICAgYy0+Y3VyZnJtID0gMDsKKyAgICBjLT5rZXlpbnQgPSBhdmN0eC0+a2V5aW50X21pbjsKKyAgICBjLT5yYW5nZSA9IDg7CisgICAgaWYoYXZjdHgtPm1lX3JhbmdlID4gMCkKKyAgICAgICAgYy0+cmFuZ2UgPSBGRk1JTihhdmN0eC0+bWVfcmFuZ2UsIDEyNyk7CisKKyAgICBpZihhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPj0gMCkKKyAgICAgICAgbHZsID0gYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsOworICAgIGlmKGx2bCA8IDAgfHwgbHZsID4gOSl7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29tcHJlc3Npb24gbGV2ZWwgc2hvdWxkIGJlIDAtOSwgbm90ICVpXG4iLCBsdmwpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8vIE5lZWRlZCBpZiB6bGliIHVudXNlZCBvciBpbml0IGFib3J0ZWQgYmVmb3JlIGRlZmxhdGVJbml0CisgICAgbWVtc2V0KCZjLT56c3RyZWFtLCAwLCBzaXplb2Yoel9zdHJlYW0pKTsKKyAgICBjLT5jb21wX3NpemUgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICsgMTAyNCArCisgICAgICAgICgoYXZjdHgtPndpZHRoICsgWk1CVl9CTE9DSyAtIDEpIC8gWk1CVl9CTE9DSykgKiAoKGF2Y3R4LT5oZWlnaHQgKyBaTUJWX0JMT0NLIC0gMSkgLyBaTUJWX0JMT0NLKSAqIDIgKyA0OworICAgIGlmICghKGMtPndvcmtfYnVmID0gYXZfbWFsbG9jKGMtPmNvbXBfc2l6ZSkpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgYWxsb2NhdGUgd29yayBidWZmZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgLyogQ29uc2VydmF0aXZlIHVwcGVyIGJvdW5kIHRha2VuIGZyb20gemxpYiB2MS4yLjEgc291cmNlIHZpYSBsY2wuYyAqLworICAgIGMtPmNvbXBfc2l6ZSA9IGMtPmNvbXBfc2l6ZSArICgoYy0+Y29tcF9zaXplICsgNykgPj4gMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjLT5jb21wX3NpemUgKyA2MykgPj4gNikgKyAxMTsKKworICAgIC8qIEFsbG9jYXRlIGNvbXByZXNzaW9uIGJ1ZmZlciAqLworICAgIGlmICghKGMtPmNvbXBfYnVmID0gYXZfbWFsbG9jKGMtPmNvbXBfc2l6ZSkpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgYWxsb2NhdGUgY29tcHJlc3Npb24gYnVmZmVyLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGMtPnBzdHJpZGUgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgMTYpOworICAgIGlmICghKGMtPnByZXYgPSBhdl9tYWxsb2MoYy0+cHN0cmlkZSAqIGF2Y3R4LT5oZWlnaHQpKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbid0IGFsbG9jYXRlIHBpY3R1cmUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBjLT56c3RyZWFtLnphbGxvYyA9IFpfTlVMTDsKKyAgICBjLT56c3RyZWFtLnpmcmVlID0gWl9OVUxMOworICAgIGMtPnpzdHJlYW0ub3BhcXVlID0gWl9OVUxMOworICAgIHpyZXQgPSBkZWZsYXRlSW5pdCgmYy0+enN0cmVhbSwgbHZsKTsKKyAgICBpZiAoenJldCAhPSBaX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5mbGF0ZSBpbml0IGVycm9yOiAlZFxuIiwgenJldCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmNvZGVkX2ZyYW1lKSB7CisgICAgICAgIGVuY29kZV9lbmQoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3ptYnZfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiem1idiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlppcCBNb3Rpb24gQmxvY2tzIFZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1pNQlYsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFptYnZFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBlbmNvZGVfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBlbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZW5jb2RlX2VuZCwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX1BBTDgsIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9NYWtlZmlsZSBiL2ZmbXBlZy9saWJhdmRldmljZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjhhYjJlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL01ha2VmaWxlCkBAIC0wLDAgKzEsNzMgQEAKK2luY2x1ZGUgJChTVUJESVIpLi4vY29uZmlnLm1haworCitOQU1FICAgID0gYXZkZXZpY2UKKworSEVBREVSUyA9IGF2ZGV2aWNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHZlcnNpb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitPQkpTICAgID0gYWxsZGV2aWNlcy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYXZkZXZpY2UubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyMgaW5wdXQvb3V0cHV0IGRldmljZXMKK09CSlMtJChDT05GSUdfQUxTQV9JTkRFVikgICAgICAgICAgICAgICAgKz0gYWxzYS1hdWRpby1jb21tb24ubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsc2EtYXVkaW8tZGVjLm8gdGltZWZpbHRlci5vCitPQkpTLSQoQ09ORklHX0FMU0FfT1VUREVWKSAgICAgICAgICAgICAgICs9IGFsc2EtYXVkaW8tY29tbW9uLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHNhLWF1ZGlvLWVuYy5vCitPQkpTLSQoQ09ORklHX0FWRk9VTkRBVElPTl9JTkRFVikgICAgICAgICs9IGF2Zm91bmRhdGlvbi5vCitPQkpTLSQoQ09ORklHX0JLVFJfSU5ERVYpICAgICAgICAgICAgICAgICs9IGJrdHIubworT0JKUy0kKENPTkZJR19DQUNBX09VVERFVikgICAgICAgICAgICAgICArPSBjYWNhLm8KK09CSlMtJChDT05GSUdfREVDS0xJTktfT1VUREVWKSAgICAgICAgICAgKz0gZGVja2xpbmtfZW5jLm8gZGVja2xpbmtfZW5jX2MubyBkZWNrbGlua19jb21tb24ubworT0JKUy0kKENPTkZJR19ERUNLTElOS19JTkRFVikgICAgICAgICAgICArPSBkZWNrbGlua19kZWMubyBkZWNrbGlua19kZWNfYy5vIGRlY2tsaW5rX2NvbW1vbi5vCitPQkpTLSQoQ09ORklHX0RTSE9XX0lOREVWKSAgICAgICAgICAgICAgICs9IGRzaG93Lm8gZHNob3dfZW51bW1lZGlhdHlwZXMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzaG93X2VudW1waW5zLm8gZHNob3dfZmlsdGVyLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2hvd19waW4ubyBkc2hvd19jb21tb24ubworT0JKUy0kKENPTkZJR19EVjEzOTRfSU5ERVYpICAgICAgICAgICAgICArPSBkdjEzOTQubworT0JKUy0kKENPTkZJR19GQkRFVl9JTkRFVikgICAgICAgICAgICAgICArPSBmYmRldl9kZWMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiZGV2X2NvbW1vbi5vCitPQkpTLSQoQ09ORklHX0ZCREVWX09VVERFVikgICAgICAgICAgICAgICs9IGZiZGV2X2VuYy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJkZXZfY29tbW9uLm8KK09CSlMtJChDT05GSUdfR0RJR1JBQl9JTkRFVikgICAgICAgICAgICAgKz0gZ2RpZ3JhYi5vCitPQkpTLSQoQ09ORklHX0lFQzYxODgzX0lOREVWKSAgICAgICAgICAgICs9IGllYzYxODgzLm8KK09CSlMtJChDT05GSUdfSkFDS19JTkRFVikgICAgICAgICAgICAgICAgKz0gamFja19hdWRpby5vIHRpbWVmaWx0ZXIubworT0JKUy0kKENPTkZJR19MQVZGSV9JTkRFVikgICAgICAgICAgICAgICArPSBsYXZmaS5vCitPQkpTLSQoQ09ORklHX09QRU5BTF9JTkRFVikgICAgICAgICAgICAgICs9IG9wZW5hbC1kZWMubworT0JKUy0kKENPTkZJR19PUEVOR0xfT1VUREVWKSAgICAgICAgICAgICArPSBvcGVuZ2xfZW5jLm8KK09CSlMtJChDT05GSUdfT1NTX0lOREVWKSAgICAgICAgICAgICAgICAgKz0gb3NzX2F1ZGlvLm8gb3NzX2F1ZGlvX2RlYy5vCitPQkpTLSQoQ09ORklHX09TU19PVVRERVYpICAgICAgICAgICAgICAgICs9IG9zc19hdWRpby5vIG9zc19hdWRpb19lbmMubworT0JKUy0kKENPTkZJR19QVUxTRV9JTkRFVikgICAgICAgICAgICAgICArPSBwdWxzZV9hdWRpb19kZWMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1bHNlX2F1ZGlvX2NvbW1vbi5vIHRpbWVmaWx0ZXIubworT0JKUy0kKENPTkZJR19QVUxTRV9PVVRERVYpICAgICAgICAgICAgICArPSBwdWxzZV9hdWRpb19lbmMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1bHNlX2F1ZGlvX2NvbW1vbi5vCitPQkpTLSQoQ09ORklHX1FUS0lUX0lOREVWKSAgICAgICAgICAgICAgICs9IHF0a2l0Lm8KK09CSlMtJChDT05GSUdfU0RMX09VVERFVikgICAgICAgICAgICAgICAgKz0gc2RsLm8KK09CSlMtJChDT05GSUdfU05ESU9fSU5ERVYpICAgICAgICAgICAgICAgKz0gc25kaW9fY29tbW9uLm8gc25kaW9fZGVjLm8KK09CSlMtJChDT05GSUdfU05ESU9fT1VUREVWKSAgICAgICAgICAgICAgKz0gc25kaW9fY29tbW9uLm8gc25kaW9fZW5jLm8KK09CSlMtJChDT05GSUdfVjRMMl9JTkRFVikgICAgICAgICAgICAgICAgKz0gdjRsMi5vIHY0bDItY29tbW9uLm8gdGltZWZpbHRlci5vCitPQkpTLSQoQ09ORklHX1Y0TDJfT1VUREVWKSAgICAgICAgICAgICAgICs9IHY0bDJlbmMubyB2NGwyLWNvbW1vbi5vCitPQkpTLSQoQ09ORklHX1Y0TF9JTkRFVikgICAgICAgICAgICAgICAgICs9IHY0bC5vCitPQkpTLSQoQ09ORklHX1ZGV0NBUF9JTkRFVikgICAgICAgICAgICAgICs9IHZmd2NhcC5vCitPQkpTLSQoQ09ORklHX1gxMUdSQUJfSU5ERVYpICAgICAgICAgICAgICs9IHgxMWdyYWIubworT0JKUy0kKENPTkZJR19YMTFHUkFCX1hDQl9JTkRFVikgICAgICAgICArPSB4Y2JncmFiLm8KK09CSlMtJChDT05GSUdfWFZfT1VUREVWKSAgICAgICAgICAgICAgICAgKz0geHYubworCisjIGV4dGVybmFsIGxpYnJhcmllcworT0JKUy0kKENPTkZJR19MSUJDRElPX0lOREVWKSAgICAgICAgICAgICArPSBsaWJjZGlvLm8KK09CSlMtJChDT05GSUdfTElCREMxMzk0X0lOREVWKSAgICAgICAgICAgKz0gbGliZGMxMzk0Lm8KKworT0JKUy0kKEhBVkVfTElCQ19NU1ZDUlQpICAgICAgICAgICAgICAgICArPSBmaWxlX29wZW4ubworCisjIFdpbmRvd3MgcmVzb3VyY2UgZmlsZQorU0xJQk9CSlMtJChIQVZFX0dOVV9XSU5EUkVTKSAgICAgICAgICAgICArPSBhdmRldmljZXJlcy5vCisKK1NLSVBIRUFERVJTLSQoQ09ORklHX0RFQ0tMSU5LKSAgICAgICAgICAgKz0gZGVja2xpbmtfZW5jLmggZGVja2xpbmtfZGVjLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNrbGlua19jb21tb24uaCBkZWNrbGlua19jb21tb25fYy5oCitTS0lQSEVBREVSUy0kKENPTkZJR19EU0hPV19JTkRFVikgICAgICAgICs9IGRzaG93X2NhcHR1cmUuaAorU0tJUEhFQURFUlMtJChDT05GSUdfRkJERVZfSU5ERVYpICAgICAgICArPSBmYmRldl9jb21tb24uaAorU0tJUEhFQURFUlMtJChDT05GSUdfRkJERVZfT1VUREVWKSAgICAgICArPSBmYmRldl9jb21tb24uaAorU0tJUEhFQURFUlMtJChDT05GSUdfTElCUFVMU0UpICAgICAgICAgICArPSBwdWxzZV9hdWRpb19jb21tb24uaAorU0tJUEhFQURFUlMtJChDT05GSUdfVjRMMl9JTkRFVikgICAgICAgICArPSB2NGwyLWNvbW1vbi5oCitTS0lQSEVBREVSUy0kKENPTkZJR19WNEwyX09VVERFVikgICAgICAgICs9IHY0bDItY29tbW9uLmgKK1NLSVBIRUFERVJTLSQoSEFWRV9BTFNBX0FTT1VORExJQl9IKSAgICAgKz0gYWxzYS1hdWRpby5oCitTS0lQSEVBREVSUy0kKEhBVkVfU05ESU9fSCkgICAgICAgICAgICAgICs9IHNuZGlvX2NvbW1vbi5oCisKK1RFU1RQUk9HUyA9IHRpbWVmaWx0ZXIKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9hbGxkZXZpY2VzLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvYWxsZGV2aWNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWVjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvYWxsZGV2aWNlcy5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBSZWdpc3RlciBhbGwgdGhlIGdyYWJiaW5nIGRldmljZXMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJhdmRldmljZS5oIgorCisjZGVmaW5lIFJFR0lTVEVSX09VVERFVihYLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGV4dGVybiBBVk91dHB1dEZvcm1hdCBmZl8jI3gjI19tdXhlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChDT05GSUdfIyNYIyNfT1VUREVWKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9yZWdpc3Rlcl9vdXRwdXRfZm9ybWF0KCZmZl8jI3gjI19tdXhlcik7ICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIFJFR0lTVEVSX0lOREVWKFgsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGV4dGVybiBBVklucHV0Rm9ybWF0IGZmXyMjeCMjX2RlbXV4ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChDT05GSUdfIyNYIyNfSU5ERVYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9yZWdpc3Rlcl9pbnB1dF9mb3JtYXQoJmZmXyMjeCMjX2RlbXV4ZXIpOyAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIFJFR0lTVEVSX0lOT1VUREVWKFgsIHgpIFJFR0lTVEVSX09VVERFVihYLCB4KTsgUkVHSVNURVJfSU5ERVYoWCwgeCkKKwordm9pZCBhdmRldmljZV9yZWdpc3Rlcl9hbGwodm9pZCkKK3sKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkOworCisgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisgICAgaW5pdGlhbGl6ZWQgPSAxOworCisgICAgLyogZGV2aWNlcyAqLworICAgIFJFR0lTVEVSX0lOT1VUREVWKEFMU0EsICAgICAgICAgICAgIGFsc2EpOworICAgIFJFR0lTVEVSX0lOREVWICAgKEFWRk9VTkRBVElPTiwgICAgIGF2Zm91bmRhdGlvbik7CisgICAgUkVHSVNURVJfSU5ERVYgICAoQktUUiwgICAgICAgICAgICAgYmt0cik7CisgICAgUkVHSVNURVJfT1VUREVWICAoQ0FDQSwgICAgICAgICAgICAgY2FjYSk7CisgICAgUkVHSVNURVJfSU5PVVRERVYoREVDS0xJTkssICAgICAgICAgZGVja2xpbmspOworICAgIFJFR0lTVEVSX0lOREVWICAgKERTSE9XLCAgICAgICAgICAgIGRzaG93KTsKKyAgICBSRUdJU1RFUl9JTkRFViAgIChEVjEzOTQsICAgICAgICAgICBkdjEzOTQpOworICAgIFJFR0lTVEVSX0lOT1VUREVWKEZCREVWLCAgICAgICAgICAgIGZiZGV2KTsKKyAgICBSRUdJU1RFUl9JTkRFViAgIChHRElHUkFCLCAgICAgICAgICBnZGlncmFiKTsKKyAgICBSRUdJU1RFUl9JTkRFViAgIChJRUM2MTg4MywgICAgICAgICBpZWM2MTg4Myk7CisgICAgUkVHSVNURVJfSU5ERVYgICAoSkFDSywgICAgICAgICAgICAgamFjayk7CisgICAgUkVHSVNURVJfSU5ERVYgICAoTEFWRkksICAgICAgICAgICAgbGF2ZmkpOworICAgIFJFR0lTVEVSX0lOREVWICAgKE9QRU5BTCwgICAgICAgICAgIG9wZW5hbCk7CisgICAgUkVHSVNURVJfT1VUREVWICAoT1BFTkdMLCAgICAgICAgICAgb3BlbmdsKTsKKyAgICBSRUdJU1RFUl9JTk9VVERFVihPU1MsICAgICAgICAgICAgICBvc3MpOworICAgIFJFR0lTVEVSX0lOT1VUREVWKFBVTFNFLCAgICAgICAgICAgIHB1bHNlKTsKKyAgICBSRUdJU1RFUl9JTkRFViAgIChRVEtJVCwgICAgICAgICAgICBxdGtpdCk7CisgICAgUkVHSVNURVJfT1VUREVWICAoU0RMLCAgICAgICAgICAgICAgc2RsKTsKKyAgICBSRUdJU1RFUl9JTk9VVERFVihTTkRJTywgICAgICAgICAgICBzbmRpbyk7CisgICAgUkVHSVNURVJfSU5PVVRERVYoVjRMMiwgICAgICAgICAgICAgdjRsMik7CisvLyAgICBSRUdJU1RFUl9JTkRFViAgIChWNEwsICAgICAgICAgICAgICB2NGwKKyAgICBSRUdJU1RFUl9JTkRFViAgIChWRldDQVAsICAgICAgICAgICB2ZndjYXApOworICAgIFJFR0lTVEVSX0lOREVWICAgKFgxMUdSQUIsICAgICAgICAgIHgxMWdyYWIpOworICAgIFJFR0lTVEVSX0lOREVWICAgKFgxMUdSQUJfWENCLCAgICAgIHgxMWdyYWJfeGNiKTsKKyAgICBSRUdJU1RFUl9PVVRERVYgIChYViwgICAgICAgICAgICAgICB4dik7CisKKyAgICAvKiBleHRlcm5hbCBsaWJyYXJpZXMgKi8KKyAgICBSRUdJU1RFUl9JTkRFViAgIChMSUJDRElPLCAgICAgICAgICBsaWJjZGlvKTsKKyAgICBSRUdJU1RFUl9JTkRFViAgIChMSUJEQzEzOTQsICAgICAgICBsaWJkYzEzOTQpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2Fsc2EtYXVkaW8tY29tbW9uLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvYWxzYS1hdWRpby1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDk4OTdmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2Fsc2EtYXVkaW8tY29tbW9uLmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiBBTFNBIGlucHV0IGFuZCBvdXRwdXQKKyAqIENvcHlyaWdodCAoYykgMjAwNyBMdWNhIEFiZW5pICggbHVjYWJlNzIgZW1haWwgaXQgKQorICogQ29weXJpZ2h0IChjKSAyMDA3IEJlbm9pdCBGb3VldCAoIGJlbm9pdCBmb3VldCBmcmVlIGZyICkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQUxTQSBpbnB1dCBhbmQgb3V0cHV0OiBjb21tb24gY29kZQorICogQGF1dGhvciBMdWNhIEFiZW5pICggbHVjYWJlNzIgZW1haWwgaXQgKQorICogQGF1dGhvciBCZW5vaXQgRm91ZXQgKCBiZW5vaXQgZm91ZXQgZnJlZSBmciApCisgKiBAYXV0aG9yIE5pY29sYXMgR2VvcmdlICggbmljb2xhcyBnZW9yZ2Ugbm9ybWFsZXN1cCBvcmcgKQorICovCisKKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisKKyNpbmNsdWRlICJhbHNhLWF1ZGlvLmgiCisKK3N0YXRpYyBhdl9jb2xkIHNuZF9wY21fZm9ybWF0X3QgY29kZWNfaWRfdG9fcGNtX2Zvcm1hdChpbnQgY29kZWNfaWQpCit7CisgICAgc3dpdGNoKGNvZGVjX2lkKSB7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NExFOiByZXR1cm4gU05EX1BDTV9GT1JNQVRfRkxPQVQ2NF9MRTsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjY0QkU6IHJldHVybiBTTkRfUENNX0ZPUk1BVF9GTE9BVDY0X0JFOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMzJMRTogcmV0dXJuIFNORF9QQ01fRk9STUFUX0ZMT0FUX0xFOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMzJCRTogcmV0dXJuIFNORF9QQ01fRk9STUFUX0ZMT0FUX0JFOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJMRTogcmV0dXJuIFNORF9QQ01fRk9STUFUX1MzMl9MRTsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyQkU6IHJldHVybiBTTkRfUENNX0ZPUk1BVF9TMzJfQkU7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1UzMkxFOiByZXR1cm4gU05EX1BDTV9GT1JNQVRfVTMyX0xFOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMzJCRTogcmV0dXJuIFNORF9QQ01fRk9STUFUX1UzMl9CRTsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzI0TEU6IHJldHVybiBTTkRfUENNX0ZPUk1BVF9TMjRfM0xFOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRCRTogcmV0dXJuIFNORF9QQ01fRk9STUFUX1MyNF8zQkU7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1UyNExFOiByZXR1cm4gU05EX1BDTV9GT1JNQVRfVTI0XzNMRTsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTI0QkU6IHJldHVybiBTTkRfUENNX0ZPUk1BVF9VMjRfM0JFOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRTogcmV0dXJuIFNORF9QQ01fRk9STUFUX1MxNl9MRTsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU6IHJldHVybiBTTkRfUENNX0ZPUk1BVF9TMTZfQkU7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1UxNkxFOiByZXR1cm4gU05EX1BDTV9GT1JNQVRfVTE2X0xFOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMTZCRTogcmV0dXJuIFNORF9QQ01fRk9STUFUX1UxNl9CRTsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzg6ICAgIHJldHVybiBTTkRfUENNX0ZPUk1BVF9TODsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTg6ICAgIHJldHVybiBTTkRfUENNX0ZPUk1BVF9VODsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc6IHJldHVybiBTTkRfUENNX0ZPUk1BVF9NVV9MQVc7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0FMQVc6ICByZXR1cm4gU05EX1BDTV9GT1JNQVRfQV9MQVc7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICByZXR1cm4gU05EX1BDTV9GT1JNQVRfVU5LTk9XTjsKKyAgICB9Cit9CisKKyNkZWZpbmUgTUFLRV9SRU9SREVSX0ZVTkMoTkFNRSwgVFlQRSwgQ0hBTk5FTFMsIExBWU9VVCwgTUFQKSAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBhbHNhX3Jlb3JkZXJfICMjIE5BTUUgIyMgXyAjIyBMQVlPVVQoY29uc3Qgdm9pZCAqaW5fdiwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm91dF92LCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbikgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IFRZUEUgKmluID0gaW5fdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFICAgICAgKm91dCA9IG91dF92OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlIChuLS0gPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGluICArPSBDSEFOTkVMUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvdXQgKz0gQ0hBTk5FTFM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgTUFLRV9SRU9SREVSX0ZVTkNTKENIQU5ORUxTLCBMQVlPVVQsIE1BUCkgXAorICAgIE1BS0VfUkVPUkRFUl9GVU5DKGludDgsICBpbnQ4X3QsICBDSEFOTkVMUywgTEFZT1VULCBNQVApIFwKKyAgICBNQUtFX1JFT1JERVJfRlVOQyhpbnQxNiwgaW50MTZfdCwgQ0hBTk5FTFMsIExBWU9VVCwgTUFQKSBcCisgICAgTUFLRV9SRU9SREVSX0ZVTkMoaW50MzIsIGludDMyX3QsIENIQU5ORUxTLCBMQVlPVVQsIE1BUCkgXAorICAgIE1BS0VfUkVPUkRFUl9GVU5DKGYzMiwgICBmbG9hdCwgICBDSEFOTkVMUywgTEFZT1VULCBNQVApCisKK01BS0VfUkVPUkRFUl9GVU5DUyg1LCBvdXRfNTAsIFwKKyAgICAgICAgb3V0WzBdID0gaW5bMF07IFwKKyAgICAgICAgb3V0WzFdID0gaW5bMV07IFwKKyAgICAgICAgb3V0WzJdID0gaW5bM107IFwKKyAgICAgICAgb3V0WzNdID0gaW5bNF07IFwKKyAgICAgICAgb3V0WzRdID0gaW5bMl07IFwKKyAgICAgICAgKTsKKworTUFLRV9SRU9SREVSX0ZVTkNTKDYsIG91dF81MSwgXAorICAgICAgICBvdXRbMF0gPSBpblswXTsgXAorICAgICAgICBvdXRbMV0gPSBpblsxXTsgXAorICAgICAgICBvdXRbMl0gPSBpbls0XTsgXAorICAgICAgICBvdXRbM10gPSBpbls1XTsgXAorICAgICAgICBvdXRbNF0gPSBpblsyXTsgXAorICAgICAgICBvdXRbNV0gPSBpblszXTsgXAorICAgICAgICApOworCitNQUtFX1JFT1JERVJfRlVOQ1MoOCwgb3V0XzcxLCBcCisgICAgICAgIG91dFswXSA9IGluWzBdOyBcCisgICAgICAgIG91dFsxXSA9IGluWzFdOyBcCisgICAgICAgIG91dFsyXSA9IGluWzRdOyBcCisgICAgICAgIG91dFszXSA9IGluWzVdOyBcCisgICAgICAgIG91dFs0XSA9IGluWzJdOyBcCisgICAgICAgIG91dFs1XSA9IGluWzNdOyBcCisgICAgICAgIG91dFs2XSA9IGluWzZdOyBcCisgICAgICAgIG91dFs3XSA9IGluWzddOyBcCisgICAgICAgICk7CisKKyNkZWZpbmUgRk9STUFUX0k4ICAwCisjZGVmaW5lIEZPUk1BVF9JMTYgMQorI2RlZmluZSBGT1JNQVRfSTMyIDIKKyNkZWZpbmUgRk9STUFUX0YzMiAzCisKKyNkZWZpbmUgUElDS19SRU9SREVSKGxheW91dClcCitzd2l0Y2goZm9ybWF0KSB7XAorICAgIGNhc2UgRk9STUFUX0k4OiAgcy0+cmVvcmRlcl9mdW5jID0gYWxzYV9yZW9yZGVyX2ludDhfb3V0XyAjI2xheW91dDsgIGJyZWFrO1wKKyAgICBjYXNlIEZPUk1BVF9JMTY6IHMtPnJlb3JkZXJfZnVuYyA9IGFsc2FfcmVvcmRlcl9pbnQxNl9vdXRfICMjbGF5b3V0OyBicmVhaztcCisgICAgY2FzZSBGT1JNQVRfSTMyOiBzLT5yZW9yZGVyX2Z1bmMgPSBhbHNhX3Jlb3JkZXJfaW50MzJfb3V0XyAjI2xheW91dDsgYnJlYWs7XAorICAgIGNhc2UgRk9STUFUX0YzMjogcy0+cmVvcmRlcl9mdW5jID0gYWxzYV9yZW9yZGVyX2YzMl9vdXRfICMjbGF5b3V0OyAgIGJyZWFrO1wKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGZpbmRfcmVvcmRlcl9mdW5jKEFsc2FEYXRhICpzLCBpbnQgY29kZWNfaWQsIHVpbnQ2NF90IGxheW91dCwgaW50IG91dCkKK3sKKyAgICBpbnQgZm9ybWF0OworCisgICAgLyogcmVvcmRlcmluZyBpbnB1dCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLworICAgIGlmICghb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworCisgICAgLyogcmVvcmRlcmluZyBpcyBub3QgbmVlZGVkIGZvciBRVUFEIG9yIDJfMiBsYXlvdXQgKi8KKyAgICBpZiAobGF5b3V0ID09IEFWX0NIX0xBWU9VVF9RVUFEIHx8IGxheW91dCA9PSBBVl9DSF9MQVlPVVRfMl8yKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaCAoY29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TODoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VODoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9BTEFXOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX01VTEFXOiBmb3JtYXQgPSBGT1JNQVRfSTg7ICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMTZMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMTZCRTogZm9ybWF0ID0gRk9STUFUX0kxNjsgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyTEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyQkU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTMyTEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTMyQkU6IGZvcm1hdCA9IEZPUk1BVF9JMzI7IGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkxFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkJFOiBmb3JtYXQgPSBGT1JNQVRfRjMyOyBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICBpZiAgICAgIChsYXlvdXQgPT0gQVZfQ0hfTEFZT1VUXzVQT0lOVDBfQkFDSyB8fCBsYXlvdXQgPT0gQVZfQ0hfTEFZT1VUXzVQT0lOVDApCisgICAgICAgIFBJQ0tfUkVPUkRFUig1MCkKKyAgICBlbHNlIGlmIChsYXlvdXQgPT0gQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSyB8fCBsYXlvdXQgPT0gQVZfQ0hfTEFZT1VUXzVQT0lOVDEpCisgICAgICAgIFBJQ0tfUkVPUkRFUig1MSkKKyAgICBlbHNlIGlmIChsYXlvdXQgPT0gQVZfQ0hfTEFZT1VUXzdQT0lOVDEpCisgICAgICAgIFBJQ0tfUkVPUkRFUig3MSkKKworICAgIHJldHVybiBzLT5yZW9yZGVyX2Z1bmMgPyAwIDogQVZFUlJPUihFTk9TWVMpOworfQorCithdl9jb2xkIGludCBmZl9hbHNhX29wZW4oQVZGb3JtYXRDb250ZXh0ICpjdHgsIHNuZF9wY21fc3RyZWFtX3QgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywgZW51bSBBVkNvZGVjSUQgKmNvZGVjX2lkKQoreworICAgIEFsc2FEYXRhICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgY2hhciAqYXVkaW9fZGV2aWNlOworICAgIGludCByZXMsIGZsYWdzID0gMDsKKyAgICBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdDsKKyAgICBzbmRfcGNtX3QgKmg7CisgICAgc25kX3BjbV9od19wYXJhbXNfdCAqaHdfcGFyYW1zOworICAgIHNuZF9wY21fdWZyYW1lc190IGJ1ZmZlcl9zaXplLCBwZXJpb2Rfc2l6ZTsKKyAgICB1aW50NjRfdCBsYXlvdXQgPSBjdHgtPnN0cmVhbXNbMF0tPmNvZGVjLT5jaGFubmVsX2xheW91dDsKKworICAgIGlmIChjdHgtPmZpbGVuYW1lWzBdID09IDApIGF1ZGlvX2RldmljZSA9ICJkZWZhdWx0IjsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2UgPSBjdHgtPmZpbGVuYW1lOworCisgICAgaWYgKCpjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAqY29kZWNfaWQgPSBERUZBVUxUX0NPREVDX0lEOworICAgIGZvcm1hdCA9IGNvZGVjX2lkX3RvX3BjbV9mb3JtYXQoKmNvZGVjX2lkKTsKKyAgICBpZiAoZm9ybWF0ID09IFNORF9QQ01fRk9STUFUX1VOS05PV04pIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAic2FtcGxlIGZvcm1hdCAweCUwNHggaXMgbm90IHN1cHBvcnRlZFxuIiwgKmNvZGVjX2lkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisgICAgcy0+ZnJhbWVfc2l6ZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoKmNvZGVjX2lkKSAvIDggKiBjaGFubmVsczsKKworICAgIGlmIChjdHgtPmZsYWdzICYgQVZGTVRfRkxBR19OT05CTE9DSykgeworICAgICAgICBmbGFncyA9IFNORF9QQ01fTk9OQkxPQ0s7CisgICAgfQorICAgIHJlcyA9IHNuZF9wY21fb3BlbigmaCwgYXVkaW9fZGV2aWNlLCBtb2RlLCBmbGFncyk7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiY2Fubm90IG9wZW4gYXVkaW8gZGV2aWNlICVzICglcylcbiIsCisgICAgICAgICAgICAgICBhdWRpb19kZXZpY2UsIHNuZF9zdHJlcnJvcihyZXMpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICByZXMgPSBzbmRfcGNtX2h3X3BhcmFtc19tYWxsb2MoJmh3X3BhcmFtcyk7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiY2Fubm90IGFsbG9jYXRlIGhhcmR3YXJlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKCVzKVxuIiwKKyAgICAgICAgICAgICAgIHNuZF9zdHJlcnJvcihyZXMpKTsKKyAgICAgICAgZ290byBmYWlsMTsKKyAgICB9CisKKyAgICByZXMgPSBzbmRfcGNtX2h3X3BhcmFtc19hbnkoaCwgaHdfcGFyYW1zKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJjYW5ub3QgaW5pdGlhbGl6ZSBoYXJkd2FyZSBwYXJhbWV0ZXIgc3RydWN0dXJlICglcylcbiIsCisgICAgICAgICAgICAgICBzbmRfc3RyZXJyb3IocmVzKSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXMgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzKGgsIGh3X3BhcmFtcywgU05EX1BDTV9BQ0NFU1NfUldfSU5URVJMRUFWRUQpOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImNhbm5vdCBzZXQgYWNjZXNzIHR5cGUgKCVzKVxuIiwKKyAgICAgICAgICAgICAgIHNuZF9zdHJlcnJvcihyZXMpKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJlcyA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXQoaCwgaHdfcGFyYW1zLCBmb3JtYXQpOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImNhbm5vdCBzZXQgc2FtcGxlIGZvcm1hdCAweCUwNHggJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICpjb2RlY19pZCwgZm9ybWF0LCBzbmRfc3RyZXJyb3IocmVzKSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXMgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyKGgsIGh3X3BhcmFtcywgc2FtcGxlX3JhdGUsIDApOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImNhbm5vdCBzZXQgc2FtcGxlIHJhdGUgKCVzKVxuIiwKKyAgICAgICAgICAgICAgIHNuZF9zdHJlcnJvcihyZXMpKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJlcyA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVscyhoLCBod19wYXJhbXMsIGNoYW5uZWxzKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJjYW5ub3Qgc2V0IGNoYW5uZWwgY291bnQgdG8gJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgIGNoYW5uZWxzLCBzbmRfc3RyZXJyb3IocmVzKSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemVfbWF4KGh3X3BhcmFtcywgJmJ1ZmZlcl9zaXplKTsKKyAgICBidWZmZXJfc2l6ZSA9IEZGTUlOKGJ1ZmZlcl9zaXplLCBBTFNBX0JVRkZFUl9TSVpFX01BWCk7CisgICAgLyogVE9ETzogbWF5YmUgdXNlIGN0eC0+bWF4X3BpY3R1cmVfYnVmZmVyIHNvbWVob3cgKi8KKyAgICByZXMgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbmVhcihoLCBod19wYXJhbXMsICZidWZmZXJfc2l6ZSk7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiY2Fubm90IHNldCBBTFNBIGJ1ZmZlciBzaXplICglcylcbiIsCisgICAgICAgICAgICAgICBzbmRfc3RyZXJyb3IocmVzKSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVfbWluKGh3X3BhcmFtcywgJnBlcmlvZF9zaXplLCBOVUxMKTsKKyAgICBpZiAoIXBlcmlvZF9zaXplKQorICAgICAgICBwZXJpb2Rfc2l6ZSA9IGJ1ZmZlcl9zaXplIC8gNDsKKyAgICByZXMgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbmVhcihoLCBod19wYXJhbXMsICZwZXJpb2Rfc2l6ZSwgTlVMTCk7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiY2Fubm90IHNldCBBTFNBIHBlcmlvZCBzaXplICglcylcbiIsCisgICAgICAgICAgICAgICBzbmRfc3RyZXJyb3IocmVzKSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcy0+cGVyaW9kX3NpemUgPSBwZXJpb2Rfc2l6ZTsKKworICAgIHJlcyA9IHNuZF9wY21faHdfcGFyYW1zKGgsIGh3X3BhcmFtcyk7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiY2Fubm90IHNldCBwYXJhbWV0ZXJzICglcylcbiIsCisgICAgICAgICAgICAgICBzbmRfc3RyZXJyb3IocmVzKSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzbmRfcGNtX2h3X3BhcmFtc19mcmVlKGh3X3BhcmFtcyk7CisKKyAgICBpZiAoY2hhbm5lbHMgPiAyICYmIGxheW91dCkgeworICAgICAgICBpZiAoZmluZF9yZW9yZGVyX2Z1bmMocywgKmNvZGVjX2lkLCBsYXlvdXQsIG1vZGUgPT0gU05EX1BDTV9TVFJFQU1fUExBWUJBQ0spIDwgMCkgeworICAgICAgICAgICAgY2hhciBuYW1lWzEyOF07CisgICAgICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKG5hbWUsIHNpemVvZihuYW1lKSwgY2hhbm5lbHMsIGxheW91dCk7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIkFMU0EgY2hhbm5lbCBsYXlvdXQgdW5rbm93biBvciB1bmltcGxlbWVudGVkIGZvciAlcyAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgbmFtZSwgbW9kZSA9PSBTTkRfUENNX1NUUkVBTV9QTEFZQkFDSyA/ICJwbGF5YmFjayIgOiAiY2FwdHVyZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5yZW9yZGVyX2Z1bmMpIHsKKyAgICAgICAgICAgIHMtPnJlb3JkZXJfYnVmX3NpemUgPSBidWZmZXJfc2l6ZTsKKyAgICAgICAgICAgIHMtPnJlb3JkZXJfYnVmID0gYXZfbWFsbG9jKHMtPnJlb3JkZXJfYnVmX3NpemUgKiBzLT5mcmFtZV9zaXplKTsKKyAgICAgICAgICAgIGlmICghcy0+cmVvcmRlcl9idWYpCisgICAgICAgICAgICAgICAgZ290byBmYWlsMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmggPSBoOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIHNuZF9wY21faHdfcGFyYW1zX2ZyZWUoaHdfcGFyYW1zKTsKK2ZhaWwxOgorICAgIHNuZF9wY21fY2xvc2UoaCk7CisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworYXZfY29sZCBpbnQgZmZfYWxzYV9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMxKQoreworICAgIEFsc2FEYXRhICpzID0gczEtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZzLT5yZW9yZGVyX2J1Zik7CisgICAgaWYgKENPTkZJR19BTFNBX0lOREVWKQorICAgICAgICBmZl90aW1lZmlsdGVyX2Rlc3Ryb3kocy0+dGltZWZpbHRlcik7CisgICAgc25kX3BjbV9jbG9zZShzLT5oKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2Fsc2FfeHJ1bl9yZWNvdmVyKEFWRm9ybWF0Q29udGV4dCAqczEsIGludCBlcnIpCit7CisgICAgQWxzYURhdGEgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIHNuZF9wY21fdCAqaGFuZGxlID0gcy0+aDsKKworICAgIGF2X2xvZyhzMSwgQVZfTE9HX1dBUk5JTkcsICJBTFNBIGJ1ZmZlciB4cnVuLlxuIik7CisgICAgaWYgKGVyciA9PSAtRVBJUEUpIHsKKyAgICAgICAgZXJyID0gc25kX3BjbV9wcmVwYXJlKGhhbmRsZSk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgImNhbm5vdCByZWNvdmVyIGZyb20gdW5kZXJydW4gKHNuZF9wY21fcHJlcGFyZSBmYWlsZWQ6ICVzKVxuIiwgc25kX3N0cmVycm9yKGVycikpOworCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlcnIgPT0gLUVTVFJQSVBFKSB7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiLUVTVFJQSVBFLi4uIFVuc3VwcG9ydGVkIVxuIik7CisKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitpbnQgZmZfYWxzYV9leHRlbmRfcmVvcmRlcl9idWYoQWxzYURhdGEgKnMsIGludCBtaW5fc2l6ZSkKK3sKKyAgICBpbnQgc2l6ZSA9IHMtPnJlb3JkZXJfYnVmX3NpemU7CisgICAgdm9pZCAqcjsKKworICAgIGF2X2Fzc2VydDAoc2l6ZSAhPSAwKTsKKyAgICB3aGlsZSAoc2l6ZSA8IG1pbl9zaXplKQorICAgICAgICBzaXplICo9IDI7CisgICAgciA9IGF2X3JlYWxsb2Mocy0+cmVvcmRlcl9idWYsIHNpemUgKiBzLT5mcmFtZV9zaXplKTsKKyAgICBpZiAoIXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcy0+cmVvcmRlcl9idWYgPSByOworICAgIHMtPnJlb3JkZXJfYnVmX3NpemUgPSBzaXplOworICAgIHJldHVybiAwOworfQorCisvKiBwb3J0ZWQgZnJvbSBhbHNhLXV0aWxzL2FwbGF5LmMgKi8KK2ludCBmZl9hbHNhX2dldF9kZXZpY2VfbGlzdChBVkRldmljZUluZm9MaXN0ICpkZXZpY2VfbGlzdCwgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW1fdHlwZSkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB2b2lkICoqaGludHMsICoqbjsKKyAgICBjaGFyICpuYW1lID0gTlVMTCwgKmRlc2NyID0gTlVMTCwgKmlvID0gTlVMTCwgKnRtcDsKKyAgICBBVkRldmljZUluZm8gKm5ld19kZXZpY2UgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKmZpbHRlciA9IHN0cmVhbV90eXBlID09IFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLID8gIk91dHB1dCIgOiAiSW5wdXQiOworCisgICAgaWYgKHNuZF9kZXZpY2VfbmFtZV9oaW50KC0xLCAicGNtIiwgJmhpbnRzKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIG4gPSBoaW50czsKKyAgICB3aGlsZSAoKm4gJiYgIXJldCkgeworICAgICAgICBuYW1lID0gc25kX2RldmljZV9uYW1lX2dldF9oaW50KCpuLCAiTkFNRSIpOworICAgICAgICBkZXNjciA9IHNuZF9kZXZpY2VfbmFtZV9nZXRfaGludCgqbiwgIkRFU0MiKTsKKyAgICAgICAgaW8gPSBzbmRfZGV2aWNlX25hbWVfZ2V0X2hpbnQoKm4sICJJT0lEIik7CisgICAgICAgIGlmICghaW8gfHwgIXN0cmNtcChpbywgZmlsdGVyKSkgeworICAgICAgICAgICAgbmV3X2RldmljZSA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWRGV2aWNlSW5mbykpOworICAgICAgICAgICAgaWYgKCFuZXdfZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld19kZXZpY2UtPmRldmljZV9uYW1lID0gYXZfc3RyZHVwKG5hbWUpOworICAgICAgICAgICAgaWYgKCh0bXAgPSBzdHJyY2hyKGRlc2NyLCAnXG4nKSkgJiYgdG1wWzFdKQorICAgICAgICAgICAgICAgIG5ld19kZXZpY2UtPmRldmljZV9kZXNjcmlwdGlvbiA9IGF2X3N0cmR1cCgmdG1wWzFdKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuZXdfZGV2aWNlLT5kZXZpY2VfZGVzY3JpcHRpb24gPSBhdl9zdHJkdXAoZGVzY3IpOworICAgICAgICAgICAgaWYgKCFuZXdfZGV2aWNlLT5kZXZpY2VfZGVzY3JpcHRpb24gfHwgIW5ld19kZXZpY2UtPmRldmljZV9uYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZfZHluYXJyYXlfYWRkX25vZnJlZSgmZGV2aWNlX2xpc3QtPmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZV9saXN0LT5uYl9kZXZpY2VzLCBuZXdfZGV2aWNlKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3X2RldmljZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIGZhaWw6CisgICAgICAgIGZyZWUoaW8pOworICAgICAgICBmcmVlKG5hbWUpOworICAgICAgICBmcmVlKGRlc2NyKTsKKyAgICAgICAgbisrOworICAgIH0KKyAgICBpZiAobmV3X2RldmljZSkgeworICAgICAgICBhdl9mcmVlKG5ld19kZXZpY2UtPmRldmljZV9kZXNjcmlwdGlvbik7CisgICAgICAgIGF2X2ZyZWUobmV3X2RldmljZS0+ZGV2aWNlX25hbWUpOworICAgICAgICBhdl9mcmVlKG5ld19kZXZpY2UpOworICAgIH0KKyAgICBzbmRfZGV2aWNlX25hbWVfZnJlZV9oaW50KGhpbnRzKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2Fsc2EtYXVkaW8tZGVjLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvYWxzYS1hdWRpby1kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjhmOGNkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2Fsc2EtYXVkaW8tZGVjLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBBTFNBIGlucHV0IGFuZCBvdXRwdXQKKyAqIENvcHlyaWdodCAoYykgMjAwNyBMdWNhIEFiZW5pICggbHVjYWJlNzIgZW1haWwgaXQgKQorICogQ29weXJpZ2h0IChjKSAyMDA3IEJlbm9pdCBGb3VldCAoIGJlbm9pdCBmb3VldCBmcmVlIGZyICkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQUxTQSBpbnB1dCBhbmQgb3V0cHV0OiBpbnB1dAorICogQGF1dGhvciBMdWNhIEFiZW5pICggbHVjYWJlNzIgZW1haWwgaXQgKQorICogQGF1dGhvciBCZW5vaXQgRm91ZXQgKCBiZW5vaXQgZm91ZXQgZnJlZSBmciApCisgKiBAYXV0aG9yIE5pY29sYXMgR2VvcmdlICggbmljb2xhcyBnZW9yZ2Ugbm9ybWFsZXN1cCBvcmcgKQorICoKKyAqIFRoaXMgYXZkZXZpY2UgZGVjb2RlciBhbGxvd3MgdG8gY2FwdHVyZSBhdWRpbyBmcm9tIGFuIEFMU0EgKEFkdmFuY2VkCisgKiBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUpIGRldmljZS4KKyAqCisgKiBUaGUgZmlsZW5hbWUgcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIGFuIEFMU0EgUENNIGRldmljZSBjYXBhYmxlIG9mCisgKiBjYXB0dXJlLCBmb3IgZXhhbXBsZSAiZGVmYXVsdCIgb3IgInBsdWdodzoxIjsgc2VlIHRoZSBBTFNBIGRvY3VtZW50YXRpb24KKyAqIGZvciBuYW1pbmcgY29udmVudGlvbnMuIFRoZSBlbXB0eSBzdHJpbmcgaXMgZXF1aXZhbGVudCB0byAiZGVmYXVsdCIuCisgKgorICogVGhlIGNhcHR1cmUgcGVyaW9kIGlzIHNldCB0byB0aGUgbG93ZXIgdmFsdWUgYXZhaWxhYmxlIGZvciB0aGUgZGV2aWNlLAorICogd2hpY2ggZ2l2ZXMgYSBsb3cgbGF0ZW5jeSBzdWl0YWJsZSBmb3IgcmVhbC10aW1lIGNhcHR1cmUuCisgKgorICogVGhlIFBUUyBhcmUgYW4gVW5peCB0aW1lIGluIG1pY3Jvc2Vjb25kLgorICoKKyAqIER1ZSB0byBhIGJ1ZyBpbiB0aGUgQUxTQSBsaWJyYXJ5CisgKiAoaHR0cHM6Ly9idWd0cmFjay5hbHNhLXByb2plY3Qub3JnL2Fsc2EtYnVnL3ZpZXcucGhwP2lkPTQzMDgpLCB0aGlzCisgKiBkZWNvZGVyIGRvZXMgbm90IHdvcmsgd2l0aCBjZXJ0YWluIEFMU0EgcGx1Z2lucywgZXNwZWNpYWxseSB0aGUgZHNub29wCisgKiBwbHVnaW4uCisgKi8KKworI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKworI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisjaW5jbHVkZSAiYWxzYS1hdWRpby5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgYXVkaW9fcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzMSkKK3sKKyAgICBBbHNhRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCByZXQ7CisgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQ7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oczEsIE5VTEwpOworICAgIGlmICghc3QpIHsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWRkIHN0cmVhbVxuIik7CisKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgY29kZWNfaWQgICAgPSBzMS0+YXVkaW9fY29kZWNfaWQ7CisKKyAgICByZXQgPSBmZl9hbHNhX29wZW4oczEsIFNORF9QQ01fU1RSRUFNX0NBUFRVUkUsICZzLT5zYW1wbGVfcmF0ZSwgcy0+Y2hhbm5lbHMsCisgICAgICAgICZjb2RlY19pZCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICAvKiB0YWtlIHJlYWwgcGFyYW1ldGVycyAqLworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IGNvZGVjX2lkOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzLT5zYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gcy0+Y2hhbm5lbHM7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOyAgLyogNjQgYml0cyBwdHMgaW4gdXMgKi8KKyAgICAvKiBtaWNyb3NlY29uZHMgaW5zdGVhZCBvZiBzZWNvbmRzLCBNSHogaW5zdGVhZCBvZiBIeiAqLworICAgIHMtPnRpbWVmaWx0ZXIgPSBmZl90aW1lZmlsdGVyX25ldygxMDAwMDAwLjAgLyBzLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVyaW9kX3NpemUsIDEuNUUtNik7CisgICAgaWYgKCFzLT50aW1lZmlsdGVyKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBzbmRfcGNtX2Nsb3NlKHMtPmgpOworICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzMSwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBbHNhRGF0YSAqcyAgPSBzMS0+cHJpdl9kYXRhOworICAgIGludCByZXM7CisgICAgaW50NjRfdCBkdHM7CisgICAgc25kX3BjbV9zZnJhbWVzX3QgZGVsYXkgPSAwOworCisgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBzLT5wZXJpb2Rfc2l6ZSAqIHMtPmZyYW1lX3NpemUpIDwgMCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHdoaWxlICgocmVzID0gc25kX3BjbV9yZWFkaShzLT5oLCBwa3QtPmRhdGEsIHMtPnBlcmlvZF9zaXplKSkgPCAwKSB7CisgICAgICAgIGlmIChyZXMgPT0gLUVBR0FJTikgeworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmZfYWxzYV94cnVuX3JlY292ZXIoczEsIHJlcykgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIkFMU0EgcmVhZCBlcnJvcjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgc25kX3N0cmVycm9yKHJlcykpOworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorICAgICAgICBmZl90aW1lZmlsdGVyX3Jlc2V0KHMtPnRpbWVmaWx0ZXIpOworICAgIH0KKworICAgIGR0cyA9IGF2X2dldHRpbWUoKTsKKyAgICBzbmRfcGNtX2RlbGF5KHMtPmgsICZkZWxheSk7CisgICAgZHRzIC09IGF2X3Jlc2NhbGUoZGVsYXkgKyByZXMsIDEwMDAwMDAsIHMtPnNhbXBsZV9yYXRlKTsKKyAgICBwa3QtPnB0cyA9IGZmX3RpbWVmaWx0ZXJfdXBkYXRlKHMtPnRpbWVmaWx0ZXIsIGR0cywgcy0+bGFzdF9wZXJpb2QpOworICAgIHMtPmxhc3RfcGVyaW9kID0gcmVzOworCisgICAgcGt0LT5zaXplID0gcmVzICogcy0+ZnJhbWVfc2l6ZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1ZGlvX2dldF9kZXZpY2VfbGlzdChBVkZvcm1hdENvbnRleHQgKmgsIEFWRGV2aWNlSW5mb0xpc3QgKmRldmljZV9saXN0KQoreworICAgIHJldHVybiBmZl9hbHNhX2dldF9kZXZpY2VfbGlzdChkZXZpY2VfbGlzdCwgU05EX1BDTV9TVFJFQU1fQ0FQVFVSRSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAic2FtcGxlX3JhdGUiLCAiIiwgb2Zmc2V0b2YoQWxzYURhdGEsIHNhbXBsZV9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDQ4MDAwfSwgMSwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJjaGFubmVscyIsICAgICIiLCBvZmZzZXRvZihBbHNhRGF0YSwgY2hhbm5lbHMpLCAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMn0sICAgICAxLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYWxzYV9kZW11eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICA9ICJBTFNBIGRlbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgICAgICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgICAgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9BVURJT19JTlBVVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfYWxzYV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhbHNhIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQUxTQSBhdWRpbyBpbnB1dCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBbHNhRGF0YSksCisgICAgLnJlYWRfaGVhZGVyICAgID0gYXVkaW9fcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gYXVkaW9fcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gZmZfYWxzYV9jbG9zZSwKKyAgICAuZ2V0X2RldmljZV9saXN0ID0gYXVkaW9fZ2V0X2RldmljZV9saXN0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmYWxzYV9kZW11eGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9hbHNhLWF1ZGlvLWVuYy5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2Fsc2EtYXVkaW8tZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkMDk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9hbHNhLWF1ZGlvLWVuYy5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQUxTQSBpbnB1dCBhbmQgb3V0cHV0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTHVjYSBBYmVuaSAoIGx1Y2FiZTcyIGVtYWlsIGl0ICkKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCZW5vaXQgRm91ZXQgKCBiZW5vaXQgZm91ZXQgZnJlZSBmciApCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFMU0EgaW5wdXQgYW5kIG91dHB1dDogb3V0cHV0CisgKiBAYXV0aG9yIEx1Y2EgQWJlbmkgKCBsdWNhYmU3MiBlbWFpbCBpdCApCisgKiBAYXV0aG9yIEJlbm9pdCBGb3VldCAoIGJlbm9pdCBmb3VldCBmcmVlIGZyICkKKyAqCisgKiBUaGlzIGF2ZGV2aWNlIGVuY29kZXIgYWxsb3dzIHRvIHBsYXkgYXVkaW8gdG8gYW4gQUxTQSAoQWR2YW5jZWQgTGludXgKKyAqIFNvdW5kIEFyY2hpdGVjdHVyZSkgZGV2aWNlLgorICoKKyAqIFRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgYW4gQUxTQSBQQ00gZGV2aWNlIGNhcGFibGUgb2YKKyAqIGNhcHR1cmUsIGZvciBleGFtcGxlICJkZWZhdWx0IiBvciAicGx1Z2h3OjEiOyBzZWUgdGhlIEFMU0EgZG9jdW1lbnRhdGlvbgorICogZm9yIG5hbWluZyBjb252ZW50aW9ucy4gVGhlIGVtcHR5IHN0cmluZyBpcyBlcXVpdmFsZW50IHRvICJkZWZhdWx0Ii4KKyAqCisgKiBUaGUgcGxheWJhY2sgcGVyaW9kIGlzIHNldCB0byB0aGUgbG93ZXIgdmFsdWUgYXZhaWxhYmxlIGZvciB0aGUgZGV2aWNlLAorICogd2hpY2ggZ2l2ZXMgYSBsb3cgbGF0ZW5jeSBzdWl0YWJsZSBmb3IgcmVhbC10aW1lIHBsYXliYWNrLgorICovCisKKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisjaW5jbHVkZSAiYWxzYS1hdWRpby5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgYXVkaW9fd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqczEpCit7CisgICAgQWxzYURhdGEgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IHNhbXBsZV9yYXRlOworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkOworICAgIGludCByZXM7CisKKyAgICBpZiAoczEtPm5iX3N0cmVhbXMgIT0gMSB8fCBzMS0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiT25seSBhIHNpbmdsZSBhdWRpbyBzdHJlYW0gaXMgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHN0ID0gczEtPnN0cmVhbXNbMF07CisKKyAgICBzYW1wbGVfcmF0ZSA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgY29kZWNfaWQgICAgPSBzdC0+Y29kZWMtPmNvZGVjX2lkOworICAgIHJlcyA9IGZmX2Fsc2Ffb3BlbihzMSwgU05EX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzYW1wbGVfcmF0ZSwKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscywgJmNvZGVjX2lkKTsKKyAgICBpZiAoc2FtcGxlX3JhdGUgIT0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSkgeworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJzYW1wbGUgcmF0ZSAlZCBub3QgYXZhaWxhYmxlLCBuZWFyZXN0IGlzICVkXG4iLAorICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSwgc2FtcGxlX3JhdGUpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzYW1wbGVfcmF0ZSk7CisKKyAgICByZXR1cm4gcmVzOworCitmYWlsOgorICAgIHNuZF9wY21fY2xvc2Uocy0+aCk7CisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworc3RhdGljIGludCBhdWRpb193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzMSwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBbHNhRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgaW50IHJlczsKKyAgICBpbnQgc2l6ZSAgICAgPSBwa3QtPnNpemU7CisgICAgdWludDhfdCAqYnVmID0gcGt0LT5kYXRhOworCisgICAgc2l6ZSAvPSBzLT5mcmFtZV9zaXplOworICAgIGlmIChwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcy0+dGltZXN0YW1wID0gcGt0LT5kdHM7CisgICAgcy0+dGltZXN0YW1wICs9IHBrdC0+ZHVyYXRpb24gPyBwa3QtPmR1cmF0aW9uIDogc2l6ZTsKKworICAgIGlmIChzLT5yZW9yZGVyX2Z1bmMpIHsKKyAgICAgICAgaWYgKHNpemUgPiBzLT5yZW9yZGVyX2J1Zl9zaXplKQorICAgICAgICAgICAgaWYgKGZmX2Fsc2FfZXh0ZW5kX3Jlb3JkZXJfYnVmKHMsIHNpemUpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHMtPnJlb3JkZXJfZnVuYyhidWYsIHMtPnJlb3JkZXJfYnVmLCBzaXplKTsKKyAgICAgICAgYnVmID0gcy0+cmVvcmRlcl9idWY7CisgICAgfQorICAgIHdoaWxlICgocmVzID0gc25kX3BjbV93cml0ZWkocy0+aCwgYnVmLCBzaXplKSkgPCAwKSB7CisgICAgICAgIGlmIChyZXMgPT0gLUVBR0FJTikgeworCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZmX2Fsc2FfeHJ1bl9yZWNvdmVyKHMxLCByZXMpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJBTFNBIHdyaXRlIGVycm9yOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBzbmRfc3RyZXJyb3IocmVzKSk7CisKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdWRpb193cml0ZV9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMxLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICoqZnJhbWUsIHVuc2lnbmVkIGZsYWdzKQoreworICAgIEFsc2FEYXRhICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBBVlBhY2tldCBwa3Q7CisKKyAgICAvKiBmZl9hbHNhX29wZW4oKSBzaG91bGQgaGF2ZSBhY2NlcHRlZCBvbmx5IHN1cHBvcnRlZCBmb3JtYXRzICovCisgICAgaWYgKChmbGFncyAmIEFWX1dSSVRFX1VOQ09ERURfRlJBTUVfUVVFUlkpKQorICAgICAgICByZXR1cm4gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoczEtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWMtPnNhbXBsZV9mbXQpID8KKyAgICAgICAgICAgICAgIEFWRVJST1IoRUlOVkFMKSA6IDA7CisgICAgLyogc2V0IG9ubHkgdXNlZCBmaWVsZHMgKi8KKyAgICBwa3QuZGF0YSAgICAgPSAoKmZyYW1lKS0+ZGF0YVswXTsKKyAgICBwa3Quc2l6ZSAgICAgPSAoKmZyYW1lKS0+bmJfc2FtcGxlcyAqIHMtPmZyYW1lX3NpemU7CisgICAgcGt0LmR0cyAgICAgID0gKCpmcmFtZSktPnBrdF9kdHM7CisgICAgcGt0LmR1cmF0aW9uID0gYXZfZnJhbWVfZ2V0X3BrdF9kdXJhdGlvbigqZnJhbWUpOworICAgIHJldHVybiBhdWRpb193cml0ZV9wYWNrZXQoczEsICZwa3QpOworfQorCitzdGF0aWMgdm9pZAorYXVkaW9fZ2V0X291dHB1dF90aW1lc3RhbXAoQVZGb3JtYXRDb250ZXh0ICpzMSwgaW50IHN0cmVhbSwKKyAgICBpbnQ2NF90ICpkdHMsIGludDY0X3QgKndhbGwpCit7CisgICAgQWxzYURhdGEgKnMgID0gczEtPnByaXZfZGF0YTsKKyAgICBzbmRfcGNtX3NmcmFtZXNfdCBkZWxheSA9IDA7CisgICAgKndhbGwgPSBhdl9nZXR0aW1lKCk7CisgICAgc25kX3BjbV9kZWxheShzLT5oLCAmZGVsYXkpOworICAgICpkdHMgPSBzLT50aW1lc3RhbXAgLSBkZWxheTsKK30KKworc3RhdGljIGludCBhdWRpb19nZXRfZGV2aWNlX2xpc3QoQVZGb3JtYXRDb250ZXh0ICpoLCBBVkRldmljZUluZm9MaXN0ICpkZXZpY2VfbGlzdCkKK3sKKyAgICByZXR1cm4gZmZfYWxzYV9nZXRfZGV2aWNlX2xpc3QoZGV2aWNlX2xpc3QsIFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYWxzYV9tdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAiQUxTQSBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLnZlcnNpb24gICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgICAgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9BVURJT19PVVRQVVQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9hbHNhX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhbHNhIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQUxTQSBhdWRpbyBvdXRwdXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQWxzYURhdGEpLAorICAgIC5hdWRpb19jb2RlYyAgICA9IERFRkFVTFRfQ09ERUNfSUQsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgPSBhdWRpb193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gYXVkaW9fd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICA9IGZmX2Fsc2FfY2xvc2UsCisgICAgLndyaXRlX3VuY29kZWRfZnJhbWUgPSBhdWRpb193cml0ZV9mcmFtZSwKKyAgICAuZ2V0X2RldmljZV9saXN0ID0gYXVkaW9fZ2V0X2RldmljZV9saXN0LAorICAgIC5nZXRfb3V0cHV0X3RpbWVzdGFtcCA9IGF1ZGlvX2dldF9vdXRwdXRfdGltZXN0YW1wLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmYWxzYV9tdXhlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvYWxzYS1hdWRpby5oIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2Fsc2EtYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjBlOTQyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2Fsc2EtYXVkaW8uaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIEFMU0EgaW5wdXQgYW5kIG91dHB1dAorICogQ29weXJpZ2h0IChjKSAyMDA3IEx1Y2EgQWJlbmkgKCBsdWNhYmU3MiBlbWFpbCBpdCApCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQmVub2l0IEZvdWV0ICggYmVub2l0IGZvdWV0IGZyZWUgZnIgKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBTFNBIGlucHV0IGFuZCBvdXRwdXQ6IGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzCisgKiBAYXV0aG9yIEx1Y2EgQWJlbmkgKCBsdWNhYmU3MiBlbWFpbCBpdCApCisgKiBAYXV0aG9yIEJlbm9pdCBGb3VldCAoIGJlbm9pdCBmb3VldCBmcmVlIGZyICkKKyAqLworCisjaWZuZGVmIEFWREVWSUNFX0FMU0FfQVVESU9fSAorI2RlZmluZSBBVkRFVklDRV9BTFNBX0FVRElPX0gKKworI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgInRpbWVmaWx0ZXIuaCIKKyNpbmNsdWRlICJhdmRldmljZS5oIgorCisvKiBYWFg6IHdlIG1ha2UgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgc291bmRjYXJkIGFjY2VwdHMgdGhpcyBmb3JtYXQgKi8KKy8qIFhYWDogZmluZCBiZXR0ZXIgc29sdXRpb24gd2l0aCAicHJlaW5pdCIgbWV0aG9kLCBuZWVkZWQgYWxzbyBpbgorICAgICAgICBvdGhlciBmb3JtYXRzICovCisjZGVmaW5lIERFRkFVTFRfQ09ERUNfSUQgQVZfTkUoQVZfQ09ERUNfSURfUENNX1MxNkJFLCBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpCisKK3R5cGVkZWYgdm9pZCAoKmZmX3Jlb3JkZXJfZnVuYykoY29uc3Qgdm9pZCAqLCB2b2lkICosIGludCk7CisKKyNkZWZpbmUgQUxTQV9CVUZGRVJfU0laRV9NQVggNjU1MzYKKwordHlwZWRlZiBzdHJ1Y3QgQWxzYURhdGEgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIHNuZF9wY21fdCAqaDsKKyAgICBpbnQgZnJhbWVfc2l6ZTsgIC8vLzwgYnl0ZXMgcGVyIHNhbXBsZSAqIGNoYW5uZWxzCisgICAgaW50IHBlcmlvZF9zaXplOyAvLy88IHByZWZlcnJlZCBzaXplIGZvciByZWFkcyBhbmQgd3JpdGVzLCBpbiBmcmFtZXMKKyAgICBpbnQgc2FtcGxlX3JhdGU7IC8vLzwgc2FtcGxlIHJhdGUgc2V0IGJ5IHVzZXIKKyAgICBpbnQgY2hhbm5lbHM7ICAgIC8vLzwgbnVtYmVyIG9mIGNoYW5uZWxzIHNldCBieSB1c2VyCisgICAgaW50IGxhc3RfcGVyaW9kOworICAgIFRpbWVGaWx0ZXIgKnRpbWVmaWx0ZXI7CisgICAgdm9pZCAoKnJlb3JkZXJfZnVuYykoY29uc3Qgdm9pZCAqLCB2b2lkICosIGludCk7CisgICAgdm9pZCAqcmVvcmRlcl9idWY7CisgICAgaW50IHJlb3JkZXJfYnVmX3NpemU7IC8vLzwgaW4gZnJhbWVzCisgICAgaW50NjRfdCB0aW1lc3RhbXA7IC8vLzwgY3VycmVudCB0aW1lc3RhbXAsIHdpdGhvdXQgbGF0ZW5jeSBhcHBsaWVkLgorfSBBbHNhRGF0YTsKKworLyoqCisgKiBPcGVuIGFuIEFMU0EgUENNLgorICoKKyAqIEBwYXJhbSBzIG1lZGlhIGZpbGUgaGFuZGxlCisgKiBAcGFyYW0gbW9kZSBlaXRoZXIgU05EX1BDTV9TVFJFQU1fQ0FQVFVSRSBvciBTTkRfUENNX1NUUkVBTV9QTEFZQkFDSworICogQHBhcmFtIHNhbXBsZV9yYXRlIGluOiByZXF1ZXN0ZWQgc2FtcGxlIHJhdGU7CisgKiAgICAgICAgICAgICAgICAgICAgb3V0OiBhY3R1YWxseSBzZWxlY3RlZCBzYW1wbGUgcmF0ZQorICogQHBhcmFtIGNoYW5uZWxzIG51bWJlciBvZiBjaGFubmVscworICogQHBhcmFtIGNvZGVjX2lkIGluOiByZXF1ZXN0ZWQgQVZDb2RlY0lEIG9yIEFWX0NPREVDX0lEX05PTkU7CisgKiAgICAgICAgICAgICAgICAgb3V0OiBhY3R1YWxseSBzZWxlY3RlZCBBVkNvZGVjSUQsIGNoYW5nZWQgb25seSBpZgorICogICAgICAgICAgICAgICAgIEFWX0NPREVDX0lEX05PTkUgd2FzIHJlcXVlc3RlZAorICoKKyAqIEByZXR1cm4gMCBpZiBPSywgQVZFUlJPUl94eHggb24gZXJyb3IKKyAqLworaW50IGZmX2Fsc2Ffb3BlbihBVkZvcm1hdENvbnRleHQgKnMsIHNuZF9wY21fc3RyZWFtX3QgbW9kZSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBlbnVtIEFWQ29kZWNJRCAqY29kZWNfaWQpOworCisvKioKKyAqIENsb3NlIHRoZSBBTFNBIFBDTS4KKyAqCisgKiBAcGFyYW0gczEgbWVkaWEgZmlsZSBoYW5kbGUKKyAqCisgKiBAcmV0dXJuIDAKKyAqLworaW50IGZmX2Fsc2FfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzMSk7CisKKy8qKgorICogVHJ5IHRvIHJlY292ZXIgZnJvbSBBTFNBIGJ1ZmZlciB1bmRlcnJ1bi4KKyAqCisgKiBAcGFyYW0gczEgbWVkaWEgZmlsZSBoYW5kbGUKKyAqIEBwYXJhbSBlcnIgZXJyb3IgY29kZSByZXBvcnRlZCBieSB0aGUgcHJldmlvdXMgQUxTQSBjYWxsCisgKgorICogQHJldHVybiAwIGlmIE9LLCBBVkVSUk9SX3h4eCBvbiBlcnJvcgorICovCitpbnQgZmZfYWxzYV94cnVuX3JlY292ZXIoQVZGb3JtYXRDb250ZXh0ICpzMSwgaW50IGVycik7CisKK2ludCBmZl9hbHNhX2V4dGVuZF9yZW9yZGVyX2J1ZihBbHNhRGF0YSAqcywgaW50IHNpemUpOworCitpbnQgZmZfYWxzYV9nZXRfZGV2aWNlX2xpc3QoQVZEZXZpY2VJbmZvTGlzdCAqZGV2aWNlX2xpc3QsIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtX3R5cGUpOworCisjZW5kaWYgLyogQVZERVZJQ0VfQUxTQV9BVURJT19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvYXZkZXZpY2UuYyBiL2ZmbXBlZy9saWJhdmRldmljZS9hdmRldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NWYyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvYXZkZXZpY2UuYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJhdmRldmljZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KKyNkZWZpbmUgRCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorI2RlZmluZSBBIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNCisjZGVmaW5lIFYgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFWRGV2aWNlQ2FwYWJpbGl0aWVzUXVlcnksIHgpCisKK2NvbnN0IEFWT3B0aW9uIGF2X2RldmljZV9jYXBhYmlsaXRpZXNbXSA9IHsKKyAgICB7ICJjb2RlYyIsICJjb2RlYyIsIE9GRlNFVChjb2RlYyksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgey5pNjQgPSBBVl9DT0RFQ19JRF9OT05FfSwgQVZfQ09ERUNfSURfTk9ORSwgSU5UX01BWCwgRXxEfEF8ViB9LAorICAgIHsgInNhbXBsZV9mb3JtYXQiLCAic2FtcGxlIGZvcm1hdCIsIE9GRlNFVChzYW1wbGVfZm9ybWF0KSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7Lmk2NCA9IEFWX1NBTVBMRV9GTVRfTk9ORX0sIC0xLCBJTlRfTUFYLCBFfER8QSB9LAorICAgIHsgInNhbXBsZV9yYXRlIiwgInNhbXBsZSByYXRlIiwgT0ZGU0VUKHNhbXBsZV9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7Lmk2NCA9IC0xfSwgLTEsIElOVF9NQVgsIEV8RHxBIH0sCisgICAgeyAiY2hhbm5lbHMiLCAiY2hhbm5lbHMiLCBPRkZTRVQoY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsuaTY0ID0gLTF9LCAtMSwgSU5UX01BWCwgRXxEfEEgfSwKKyAgICB7ICJjaGFubmVsX2xheW91dCIsICJjaGFubmVsIGxheW91dCIsIE9GRlNFVChjaGFubmVsX2xheW91dCksIEFWX09QVF9UWVBFX0lOVDY0LAorICAgICAgICB7Lmk2NCA9IC0xfSwgLTEsIElOVF9NQVgsIEV8RHxBIH0sCisgICAgeyAicGl4ZWxfZm9ybWF0IiwgInBpeGVsIGZvcm1hdCIsIE9GRlNFVChwaXhlbF9mb3JtYXQpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsuaTY0ID0gQVZfUElYX0ZNVF9OT05FfSwgLTEsIElOVF9NQVgsIEV8RHxWIH0sCisgICAgeyAid2luZG93X3NpemUiLCAid2luZG93IHNpemUiLCBPRkZTRVQod2luZG93X3dpZHRoKSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwKKyAgICAgICAgey5zdHIgPSBOVUxMfSwgLTEsIElOVF9NQVgsIEV8RHxWIH0sCisgICAgeyAiZnJhbWVfc2l6ZSIsICJmcmFtZSBzaXplIiwgT0ZGU0VUKGZyYW1lX3dpZHRoKSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwKKyAgICAgICAgey5zdHIgPSBOVUxMfSwgLTEsIElOVF9NQVgsIEV8RHxWIH0sCisgICAgeyAiZnBzIiwgImZwcyIsIE9GRlNFVChmcHMpLCBBVl9PUFRfVFlQRV9SQVRJT05BTCwKKyAgICAgICAgey5kYmwgPSAtMX0sIC0xLCBJTlRfTUFYLCBFfER8ViB9LAorICAgIHsgTlVMTCB9Cit9OworCisjdW5kZWYgRQorI3VuZGVmIEQKKyN1bmRlZiBBCisjdW5kZWYgVgorI3VuZGVmIE9GRlNFVAorCit1bnNpZ25lZCBhdmRldmljZV92ZXJzaW9uKHZvaWQpCit7CisgICAgYXZfYXNzZXJ0MChMSUJBVkRFVklDRV9WRVJTSU9OX01JQ1JPID49IDEwMCk7CisgICAgcmV0dXJuIExJQkFWREVWSUNFX1ZFUlNJT05fSU5UOworfQorCitjb25zdCBjaGFyICogYXZkZXZpY2VfY29uZmlndXJhdGlvbih2b2lkKQoreworICAgIHJldHVybiBGRk1QRUdfQ09ORklHVVJBVElPTjsKK30KKworY29uc3QgY2hhciAqIGF2ZGV2aWNlX2xpY2Vuc2Uodm9pZCkKK3sKKyNkZWZpbmUgTElDRU5TRV9QUkVGSVggImxpYmF2ZGV2aWNlIGxpY2Vuc2U6ICIKKyAgICByZXR1cm4gTElDRU5TRV9QUkVGSVggRkZNUEVHX0xJQ0VOU0UgKyBzaXplb2YoTElDRU5TRV9QUkVGSVgpIC0gMTsKK30KKworc3RhdGljIHZvaWQgKmF2X2RldmljZV9uZXh0KHZvaWQgKnByZXYsIGludCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDbGFzc0NhdGVnb3J5IGMxLCBBVkNsYXNzQ2F0ZWdvcnkgYzIpCit7CisgICAgY29uc3QgQVZDbGFzcyAqcGM7CisgICAgQVZDbGFzc0NhdGVnb3J5IGNhdGVnb3J5ID0gQVZfQ0xBU1NfQ0FURUdPUllfTkE7CisgICAgZG8geworICAgICAgICBpZiAob3V0cHV0KSB7CisgICAgICAgICAgICBpZiAoIShwcmV2ID0gYXZfb2Zvcm1hdF9uZXh0KHByZXYpKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHBjID0gKChBVk91dHB1dEZvcm1hdCAqKXByZXYpLT5wcml2X2NsYXNzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEocHJldiA9IGF2X2lmb3JtYXRfbmV4dChwcmV2KSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwYyA9ICgoQVZJbnB1dEZvcm1hdCAqKXByZXYpLT5wcml2X2NsYXNzOworICAgICAgICB9CisgICAgICAgIGlmICghcGMpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2F0ZWdvcnkgPSBwYy0+Y2F0ZWdvcnk7CisgICAgfSB3aGlsZSAoY2F0ZWdvcnkgIT0gYzEgJiYgY2F0ZWdvcnkgIT0gYzIpOworICAgIHJldHVybiBwcmV2OworfQorCitBVklucHV0Rm9ybWF0ICphdl9pbnB1dF9hdWRpb19kZXZpY2VfbmV4dChBVklucHV0Rm9ybWF0ICAqZCkKK3sKKyAgICByZXR1cm4gYXZfZGV2aWNlX25leHQoZCwgMCwgQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX0FVRElPX0lOUFVULAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfSU5QVVQpOworfQorCitBVklucHV0Rm9ybWF0ICphdl9pbnB1dF92aWRlb19kZXZpY2VfbmV4dChBVklucHV0Rm9ybWF0ICAqZCkKK3sKKyAgICByZXR1cm4gYXZfZGV2aWNlX25leHQoZCwgMCwgQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX0lOUFVULAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfSU5QVVQpOworfQorCitBVk91dHB1dEZvcm1hdCAqYXZfb3V0cHV0X2F1ZGlvX2RldmljZV9uZXh0KEFWT3V0cHV0Rm9ybWF0ICpkKQoreworICAgIHJldHVybiBhdl9kZXZpY2VfbmV4dChkLCAxLCBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfQVVESU9fT1VUUFVULAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfT1VUUFVUKTsKK30KKworQVZPdXRwdXRGb3JtYXQgKmF2X291dHB1dF92aWRlb19kZXZpY2VfbmV4dChBVk91dHB1dEZvcm1hdCAqZCkKK3sKKyAgICByZXR1cm4gYXZfZGV2aWNlX25leHQoZCwgMSwgQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX09VVFBVVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX09VVFBVVCk7Cit9CisKK2ludCBhdmRldmljZV9hcHBfdG9fZGV2X2NvbnRyb2xfbWVzc2FnZShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBlbnVtIEFWQXBwVG9EZXZNZXNzYWdlVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpCit7CisgICAgaWYgKCFzLT5vZm9ybWF0IHx8ICFzLT5vZm9ybWF0LT5jb250cm9sX21lc3NhZ2UpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgcmV0dXJuIHMtPm9mb3JtYXQtPmNvbnRyb2xfbWVzc2FnZShzLCB0eXBlLCBkYXRhLCBkYXRhX3NpemUpOworfQorCitpbnQgYXZkZXZpY2VfZGV2X3RvX2FwcF9jb250cm9sX21lc3NhZ2Uoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgZW51bSBBVkRldlRvQXBwTWVzc2FnZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKQoreworICAgIGlmICghcy0+Y29udHJvbF9tZXNzYWdlX2NiKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIHJldHVybiBzLT5jb250cm9sX21lc3NhZ2VfY2IocywgdHlwZSwgZGF0YSwgZGF0YV9zaXplKTsKK30KKworaW50IGF2ZGV2aWNlX2NhcGFiaWxpdGllc19jcmVhdGUoQVZEZXZpY2VDYXBhYmlsaXRpZXNRdWVyeSAqKmNhcHMsIEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqKmRldmljZV9vcHRpb25zKQoreworICAgIGludCByZXQ7CisgICAgYXZfYXNzZXJ0MChzICYmIGNhcHMpOworICAgIGF2X2Fzc2VydDAocy0+aWZvcm1hdCB8fCBzLT5vZm9ybWF0KTsKKyAgICBpZiAoKHMtPm9mb3JtYXQgJiYgIXMtPm9mb3JtYXQtPmNyZWF0ZV9kZXZpY2VfY2FwYWJpbGl0aWVzKSB8fAorICAgICAgICAocy0+aWZvcm1hdCAmJiAhcy0+aWZvcm1hdC0+Y3JlYXRlX2RldmljZV9jYXBhYmlsaXRpZXMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICpjYXBzID0gYXZfbWFsbG9jeihzaXplb2YoKipjYXBzKSk7CisgICAgaWYgKCEoKmNhcHMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICgqY2FwcyktPmRldmljZV9jb250ZXh0ID0gczsKKyAgICBpZiAoKChyZXQgPSBhdl9vcHRfc2V0X2RpY3Qocy0+cHJpdl9kYXRhLCBkZXZpY2Vfb3B0aW9ucykpIDwgMCkpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAocy0+aWZvcm1hdCkgeworICAgICAgICBpZiAoKHJldCA9IHMtPmlmb3JtYXQtPmNyZWF0ZV9kZXZpY2VfY2FwYWJpbGl0aWVzKHMsICpjYXBzKSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgocmV0ID0gcy0+b2Zvcm1hdC0+Y3JlYXRlX2RldmljZV9jYXBhYmlsaXRpZXMocywgKmNhcHMpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGF2X29wdF9zZXRfZGVmYXVsdHMoKmNhcHMpOworICAgIHJldHVybiAwOworICBmYWlsOgorICAgIGF2X2ZyZWVwKGNhcHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXZkZXZpY2VfY2FwYWJpbGl0aWVzX2ZyZWUoQVZEZXZpY2VDYXBhYmlsaXRpZXNRdWVyeSAqKmNhcHMsIEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpZiAoIXMgfHwgIWNhcHMgfHwgISgqY2FwcykpCisgICAgICAgIHJldHVybjsKKyAgICBhdl9hc3NlcnQwKHMtPmlmb3JtYXQgfHwgcy0+b2Zvcm1hdCk7CisgICAgaWYgKHMtPmlmb3JtYXQpIHsKKyAgICAgICAgaWYgKHMtPmlmb3JtYXQtPmZyZWVfZGV2aWNlX2NhcGFiaWxpdGllcykKKyAgICAgICAgICAgIHMtPmlmb3JtYXQtPmZyZWVfZGV2aWNlX2NhcGFiaWxpdGllcyhzLCAqY2Fwcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPm9mb3JtYXQtPmZyZWVfZGV2aWNlX2NhcGFiaWxpdGllcykKKyAgICAgICAgICAgIHMtPm9mb3JtYXQtPmZyZWVfZGV2aWNlX2NhcGFiaWxpdGllcyhzLCAqY2Fwcyk7CisgICAgfQorICAgIGF2X2ZyZWVwKGNhcHMpOworfQorCitpbnQgYXZkZXZpY2VfbGlzdF9kZXZpY2VzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZEZXZpY2VJbmZvTGlzdCAqKmRldmljZV9saXN0KQoreworICAgIGludCByZXQ7CisgICAgYXZfYXNzZXJ0MChzKTsKKyAgICBhdl9hc3NlcnQwKGRldmljZV9saXN0KTsKKyAgICBhdl9hc3NlcnQwKHMtPm9mb3JtYXQgfHwgcy0+aWZvcm1hdCk7CisgICAgaWYgKChzLT5vZm9ybWF0ICYmICFzLT5vZm9ybWF0LT5nZXRfZGV2aWNlX2xpc3QpIHx8CisgICAgICAgIChzLT5pZm9ybWF0ICYmICFzLT5pZm9ybWF0LT5nZXRfZGV2aWNlX2xpc3QpKSB7CisgICAgICAgICpkZXZpY2VfbGlzdCA9IE5VTEw7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorICAgICpkZXZpY2VfbGlzdCA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWRGV2aWNlSW5mb0xpc3QpKTsKKyAgICBpZiAoISgqZGV2aWNlX2xpc3QpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIC8qIG5vIGRlZmF1bHQgZGV2aWNlIGJ5IGRlZmF1bHQgKi8KKyAgICAoKmRldmljZV9saXN0KS0+ZGVmYXVsdF9kZXZpY2UgPSAtMTsKKyAgICBpZiAocy0+b2Zvcm1hdCkKKyAgICAgICAgcmV0ID0gcy0+b2Zvcm1hdC0+Z2V0X2RldmljZV9saXN0KHMsICpkZXZpY2VfbGlzdCk7CisgICAgZWxzZQorICAgICAgICByZXQgPSBzLT5pZm9ybWF0LT5nZXRfZGV2aWNlX2xpc3QocywgKmRldmljZV9saXN0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgYXZkZXZpY2VfZnJlZV9saXN0X2RldmljZXMoZGV2aWNlX2xpc3QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXZkZXZpY2VfZnJlZV9saXN0X2RldmljZXMoQVZEZXZpY2VJbmZvTGlzdCAqKmRldmljZV9saXN0KQoreworICAgIEFWRGV2aWNlSW5mb0xpc3QgKmxpc3Q7CisgICAgQVZEZXZpY2VJbmZvICpkZXY7CisgICAgaW50IGk7CisKKyAgICBhdl9hc3NlcnQwKGRldmljZV9saXN0KTsKKyAgICBsaXN0ID0gKmRldmljZV9saXN0OworICAgIGlmICghbGlzdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChpID0gMDsgaSA8IGxpc3QtPm5iX2RldmljZXM7IGkrKykgeworICAgICAgICBkZXYgPSBsaXN0LT5kZXZpY2VzW2ldOworICAgICAgICBpZiAoZGV2KSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmZGV2LT5kZXZpY2VfbmFtZSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmZGV2LT5kZXZpY2VfZGVzY3JpcHRpb24pOworICAgICAgICAgICAgYXZfZnJlZShkZXYpOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWVwKCZsaXN0LT5kZXZpY2VzKTsKKyAgICBhdl9mcmVlcChkZXZpY2VfbGlzdCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvYXZkZXZpY2UuaCBiL2ZmbXBlZy9saWJhdmRldmljZS9hdmRldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTUyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvYXZkZXZpY2UuaApAQCAtMCwwICsxLDQ4NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWREVWSUNFX0FWREVWSUNFX0gKKyNkZWZpbmUgQVZERVZJQ0VfQVZERVZJQ0VfSAorCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisvKioKKyAqIEBmaWxlCisgKiBAaW5ncm91cCBsYXZkCisgKiBNYWluIGxpYmF2ZGV2aWNlIEFQSSBoZWFkZXIKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBsYXZkIFNwZWNpYWwgZGV2aWNlcyBtdXhpbmcvZGVtdXhpbmcgbGlicmFyeQorICogQHsKKyAqIExpYmF2ZGV2aWNlIGlzIGEgY29tcGxlbWVudGFyeSBsaWJyYXJ5IHRvIEByZWYgbGliYXZmICJsaWJhdmZvcm1hdCIuIEl0CisgKiBwcm92aWRlcyB2YXJpb3VzICJzcGVjaWFsIiBwbGF0Zm9ybS1zcGVjaWZpYyBtdXhlcnMgYW5kIGRlbXV4ZXJzLCBlLmcuIGZvcgorICogZ3JhYmJpbmcgZGV2aWNlcywgYXVkaW8gY2FwdHVyZSBhbmQgcGxheWJhY2sgZXRjLiBBcyBhIGNvbnNlcXVlbmNlLCB0aGUKKyAqIChkZSltdXhlcnMgaW4gbGliYXZkZXZpY2UgYXJlIG9mIHRoZSBBVkZNVF9OT0ZJTEUgdHlwZSAodGhleSB1c2UgdGhlaXIgb3duCisgKiBJL08gZnVuY3Rpb25zKS4gVGhlIGZpbGVuYW1lIHBhc3NlZCB0byBhdmZvcm1hdF9vcGVuX2lucHV0KCkgb2Z0ZW4gZG9lcyBub3QKKyAqIHJlZmVyIHRvIGFuIGFjdHVhbGx5IGV4aXN0aW5nIGZpbGUsIGJ1dCBoYXMgc29tZSBzcGVjaWFsIGRldmljZS1zcGVjaWZpYworICogbWVhbmluZyAtIGUuZy4gZm9yIHgxMWdyYWIgaXQgaXMgdGhlIGRpc3BsYXkgbmFtZS4KKyAqCisgKiBUbyB1c2UgbGliYXZkZXZpY2UsIHNpbXBseSBjYWxsIGF2ZGV2aWNlX3JlZ2lzdGVyX2FsbCgpIHRvIHJlZ2lzdGVyIGFsbAorICogY29tcGlsZWQgbXV4ZXJzIGFuZCBkZW11eGVycy4gVGhleSBhbGwgdXNlIHN0YW5kYXJkIGxpYmF2Zm9ybWF0IEFQSS4KKyAqIEB9CisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorCisvKioKKyAqIFJldHVybiB0aGUgTElCQVZERVZJQ0VfVkVSU0lPTl9JTlQgY29uc3RhbnQuCisgKi8KK3Vuc2lnbmVkIGF2ZGV2aWNlX3ZlcnNpb24odm9pZCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBsaWJhdmRldmljZSBidWlsZC10aW1lIGNvbmZpZ3VyYXRpb24uCisgKi8KK2NvbnN0IGNoYXIgKmF2ZGV2aWNlX2NvbmZpZ3VyYXRpb24odm9pZCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBsaWJhdmRldmljZSBsaWNlbnNlLgorICovCitjb25zdCBjaGFyICphdmRldmljZV9saWNlbnNlKHZvaWQpOworCisvKioKKyAqIEluaXRpYWxpemUgbGliYXZkZXZpY2UgYW5kIHJlZ2lzdGVyIGFsbCB0aGUgaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzLgorICogQHdhcm5pbmcgVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUuCisgKi8KK3ZvaWQgYXZkZXZpY2VfcmVnaXN0ZXJfYWxsKHZvaWQpOworCisvKioKKyAqIEF1ZGlvIGlucHV0IGRldmljZXMgaXRlcmF0b3IuCisgKgorICogSWYgZCBpcyBOVUxMLCByZXR1cm5zIHRoZSBmaXJzdCByZWdpc3RlcmVkIGlucHV0IGF1ZGlvL3ZpZGVvIGRldmljZSwKKyAqIGlmIGQgaXMgbm9uLU5VTEwsIHJldHVybnMgdGhlIG5leHQgcmVnaXN0ZXJlZCBpbnB1dCBhdWRpby92aWRlbyBkZXZpY2UgYWZ0ZXIgZAorICogb3IgTlVMTCBpZiBkIGlzIHRoZSBsYXN0IG9uZS4KKyAqLworQVZJbnB1dEZvcm1hdCAqYXZfaW5wdXRfYXVkaW9fZGV2aWNlX25leHQoQVZJbnB1dEZvcm1hdCAgKmQpOworCisvKioKKyAqIFZpZGVvIGlucHV0IGRldmljZXMgaXRlcmF0b3IuCisgKgorICogSWYgZCBpcyBOVUxMLCByZXR1cm5zIHRoZSBmaXJzdCByZWdpc3RlcmVkIGlucHV0IGF1ZGlvL3ZpZGVvIGRldmljZSwKKyAqIGlmIGQgaXMgbm9uLU5VTEwsIHJldHVybnMgdGhlIG5leHQgcmVnaXN0ZXJlZCBpbnB1dCBhdWRpby92aWRlbyBkZXZpY2UgYWZ0ZXIgZAorICogb3IgTlVMTCBpZiBkIGlzIHRoZSBsYXN0IG9uZS4KKyAqLworQVZJbnB1dEZvcm1hdCAqYXZfaW5wdXRfdmlkZW9fZGV2aWNlX25leHQoQVZJbnB1dEZvcm1hdCAgKmQpOworCisvKioKKyAqIEF1ZGlvIG91dHB1dCBkZXZpY2VzIGl0ZXJhdG9yLgorICoKKyAqIElmIGQgaXMgTlVMTCwgcmV0dXJucyB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBvdXRwdXQgYXVkaW8vdmlkZW8gZGV2aWNlLAorICogaWYgZCBpcyBub24tTlVMTCwgcmV0dXJucyB0aGUgbmV4dCByZWdpc3RlcmVkIG91dHB1dCBhdWRpby92aWRlbyBkZXZpY2UgYWZ0ZXIgZAorICogb3IgTlVMTCBpZiBkIGlzIHRoZSBsYXN0IG9uZS4KKyAqLworQVZPdXRwdXRGb3JtYXQgKmF2X291dHB1dF9hdWRpb19kZXZpY2VfbmV4dChBVk91dHB1dEZvcm1hdCAqZCk7CisKKy8qKgorICogVmlkZW8gb3V0cHV0IGRldmljZXMgaXRlcmF0b3IuCisgKgorICogSWYgZCBpcyBOVUxMLCByZXR1cm5zIHRoZSBmaXJzdCByZWdpc3RlcmVkIG91dHB1dCBhdWRpby92aWRlbyBkZXZpY2UsCisgKiBpZiBkIGlzIG5vbi1OVUxMLCByZXR1cm5zIHRoZSBuZXh0IHJlZ2lzdGVyZWQgb3V0cHV0IGF1ZGlvL3ZpZGVvIGRldmljZSBhZnRlciBkCisgKiBvciBOVUxMIGlmIGQgaXMgdGhlIGxhc3Qgb25lLgorICovCitBVk91dHB1dEZvcm1hdCAqYXZfb3V0cHV0X3ZpZGVvX2RldmljZV9uZXh0KEFWT3V0cHV0Rm9ybWF0ICpkKTsKKwordHlwZWRlZiBzdHJ1Y3QgQVZEZXZpY2VSZWN0IHsKKyAgICBpbnQgeDsgICAgICAvKio8IHggY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgKi8KKyAgICBpbnQgeTsgICAgICAvKio8IHkgY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgKi8KKyAgICBpbnQgd2lkdGg7ICAvKio8IHdpZHRoICovCisgICAgaW50IGhlaWdodDsgLyoqPCBoZWlnaHQgKi8KK30gQVZEZXZpY2VSZWN0OworCisvKioKKyAqIE1lc3NhZ2UgdHlwZXMgdXNlZCBieSBhdmRldmljZV9hcHBfdG9fZGV2X2NvbnRyb2xfbWVzc2FnZSgpLgorICovCitlbnVtIEFWQXBwVG9EZXZNZXNzYWdlVHlwZSB7CisgICAgLyoqCisgICAgICogRHVtbXkgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBBVl9BUFBfVE9fREVWX05PTkUgPSBNS0JFVEFHKCdOJywnTycsJ04nLCdFJyksCisKKyAgICAvKioKKyAgICAgKiBXaW5kb3cgc2l6ZSBjaGFuZ2UgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIE1lc3NhZ2UgaXMgc2VudCB0byB0aGUgZGV2aWNlIGV2ZXJ5IHRpbWUgdGhlIGFwcGxpY2F0aW9uIGNoYW5nZXMgdGhlIHNpemUKKyAgICAgKiBvZiB0aGUgd2luZG93IGRldmljZSByZW5kZXJzIHRvLgorICAgICAqIE1lc3NhZ2Ugc2hvdWxkIGFsc28gYmUgc2VudCByaWdodCBhZnRlciB3aW5kb3cgaXMgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIGRhdGE6IEFWRGV2aWNlUmVjdDogbmV3IHdpbmRvdyBzaXplLgorICAgICAqLworICAgIEFWX0FQUF9UT19ERVZfV0lORE9XX1NJWkUgPSBNS0JFVEFHKCdHJywnRScsJ08nLCdNJyksCisKKyAgICAvKioKKyAgICAgKiBSZXBhaW50IHJlcXVlc3QgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIE1lc3NhZ2UgaXMgc2VudCB0byB0aGUgZGV2aWNlIHdoZW4gd2luZG93IGhhcyB0byBiZSByZXBhaW50ZWQuCisgICAgICoKKyAgICAgKiBkYXRhOiBBVkRldmljZVJlY3Q6IGFyZWEgcmVxdWlyZWQgdG8gYmUgcmVwYWludGVkLgorICAgICAqICAgICAgIE5VTEw6IHdob2xlIGFyZWEgaXMgcmVxdWlyZWQgdG8gYmUgcmVwYWludGVkLgorICAgICAqLworICAgIEFWX0FQUF9UT19ERVZfV0lORE9XX1JFUEFJTlQgPSBNS0JFVEFHKCdSJywnRScsJ1AnLCdBJyksCisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHBhdXNlL3BsYXkuCisgICAgICoKKyAgICAgKiBBcHBsaWNhdGlvbiByZXF1ZXN0cyBwYXVzZS91bnBhdXNlIHBsYXliYWNrLgorICAgICAqIE1vc3RseSB1c2FibGUgd2l0aCBkZXZpY2VzIHRoYXQgaGF2ZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICogQnkgZGVmYXVsdCBkZXZpY2VzIGFyZSBub3QgcGF1c2VkLgorICAgICAqCisgICAgICogZGF0YTogTlVMTAorICAgICAqLworICAgIEFWX0FQUF9UT19ERVZfUEFVU0UgICAgICAgID0gTUtCRVRBRygnUCcsICdBJywgJ1UnLCAnICcpLAorICAgIEFWX0FQUF9UT19ERVZfUExBWSAgICAgICAgID0gTUtCRVRBRygnUCcsICdMJywgJ0EnLCAnWScpLAorICAgIEFWX0FQUF9UT19ERVZfVE9HR0xFX1BBVVNFID0gTUtCRVRBRygnUCcsICdBJywgJ1UnLCAnVCcpLAorCisgICAgLyoqCisgICAgICogVm9sdW1lIGNvbnRyb2wgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIFNldCB2b2x1bWUgbGV2ZWwuIEl0IG1heSBiZSBkZXZpY2UtZGVwZW5kZW50IGlmIHZvbHVtZQorICAgICAqIGlzIGNoYW5nZWQgcGVyIHN0cmVhbSBvciBzeXN0ZW0gd2lkZS4gUGVyIHN0cmVhbSB2b2x1bWUKKyAgICAgKiBjaGFuZ2UgaXMgZXhwZWN0ZWQgd2hlbiBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIGRhdGE6IGRvdWJsZTogbmV3IHZvbHVtZSB3aXRoIHJhbmdlIG9mIDAuMCAtIDEuMC4KKyAgICAgKi8KKyAgICBBVl9BUFBfVE9fREVWX1NFVF9WT0xVTUUgPSBNS0JFVEFHKCdTJywgJ1YnLCAnTycsICdMJyksCisKKyAgICAvKioKKyAgICAgKiBNdXRlIGNvbnRyb2wgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBDaGFuZ2UgbXV0ZSBzdGF0ZS4gSXQgbWF5IGJlIGRldmljZS1kZXBlbmRlbnQgaWYgbXV0ZSBzdGF0dXMKKyAgICAgKiBpcyBjaGFuZ2VkIHBlciBzdHJlYW0gb3Igc3lzdGVtIHdpZGUuIFBlciBzdHJlYW0gbXV0ZSBzdGF0dXMKKyAgICAgKiBjaGFuZ2UgaXMgZXhwZWN0ZWQgd2hlbiBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIGRhdGE6IE5VTEwuCisgICAgICovCisgICAgQVZfQVBQX1RPX0RFVl9NVVRFICAgICAgICA9IE1LQkVUQUcoJyAnLCAnTScsICdVJywgJ1QnKSwKKyAgICBBVl9BUFBfVE9fREVWX1VOTVVURSAgICAgID0gTUtCRVRBRygnVScsICdNJywgJ1UnLCAnVCcpLAorICAgIEFWX0FQUF9UT19ERVZfVE9HR0xFX01VVEUgPSBNS0JFVEFHKCdUJywgJ00nLCAnVScsICdUJyksCisKKyAgICAvKioKKyAgICAgKiBHZXQgdm9sdW1lL211dGUgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBGb3JjZSB0aGUgZGV2aWNlIHRvIHNlbmQgQVZfREVWX1RPX0FQUF9WT0xVTUVfTEVWRUxfQ0hBTkdFRCBvcgorICAgICAqIEFWX0RFVl9UT19BUFBfTVVURV9TVEFURV9DSEFOR0VEIGNvbW1hbmQgcmVzcGVjdGl2ZWx5LgorICAgICAqCisgICAgICogZGF0YTogTlVMTC4KKyAgICAgKi8KKyAgICBBVl9BUFBfVE9fREVWX0dFVF9WT0xVTUUgPSBNS0JFVEFHKCdHJywgJ1YnLCAnTycsICdMJyksCisgICAgQVZfQVBQX1RPX0RFVl9HRVRfTVVURSAgID0gTUtCRVRBRygnRycsICdNJywgJ1UnLCAnVCcpLAorfTsKKworLyoqCisgKiBNZXNzYWdlIHR5cGVzIHVzZWQgYnkgYXZkZXZpY2VfZGV2X3RvX2FwcF9jb250cm9sX21lc3NhZ2UoKS4KKyAqLworZW51bSBBVkRldlRvQXBwTWVzc2FnZVR5cGUgeworICAgIC8qKgorICAgICAqIER1bW15IG1lc3NhZ2UuCisgICAgICovCisgICAgQVZfREVWX1RPX0FQUF9OT05FID0gTUtCRVRBRygnTicsJ08nLCdOJywnRScpLAorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHdpbmRvdyBidWZmZXIgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIERldmljZSByZXF1ZXN0cyB0byBjcmVhdGUgYSB3aW5kb3cgYnVmZmVyLiBFeGFjdCBtZWFuaW5nIGlzIGRldmljZS0KKyAgICAgKiBhbmQgYXBwbGljYXRpb24tZGVwZW5kZW50LiBNZXNzYWdlIGlzIHNlbnQgYmVmb3JlIHJlbmRlcmluZyBmaXJzdAorICAgICAqIGZyYW1lIGFuZCBhbGwgb25lLXNob3QgaW5pdGlhbGl6YXRpb25zIHNob3VsZCBiZSBkb25lIGhlcmUuCisgICAgICogQXBwbGljYXRpb24gaXMgYWxsb3dlZCB0byBpZ25vcmUgcHJlZmVycmVkIHdpbmRvdyBidWZmZXIgc2l6ZS4KKyAgICAgKgorICAgICAqIEBub3RlOiBBcHBsaWNhdGlvbiBpcyBvYmxpZ2F0ZWQgdG8gaW5mb3JtIGFib3V0IHdpbmRvdyBidWZmZXIgc2l6ZQorICAgICAqICAgICAgICB3aXRoIEFWX0FQUF9UT19ERVZfV0lORE9XX1NJWkUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIGRhdGE6IEFWRGV2aWNlUmVjdDogcHJlZmVycmVkIHNpemUgb2YgdGhlIHdpbmRvdyBidWZmZXIuCisgICAgICogICAgICAgTlVMTDogbm8gcHJlZmVycmVkIHNpemUgb2YgdGhlIHdpbmRvdyBidWZmZXIuCisgICAgICovCisgICAgQVZfREVWX1RPX0FQUF9DUkVBVEVfV0lORE9XX0JVRkZFUiA9IE1LQkVUQUcoJ0InLCdDJywnUicsJ0UnKSwKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgd2luZG93IGJ1ZmZlciBtZXNzYWdlLgorICAgICAqCisgICAgICogRGV2aWNlIHJlcXVlc3RzIHRvIHByZXBhcmUgYSB3aW5kb3cgYnVmZmVyIGZvciByZW5kZXJpbmcuCisgICAgICogRXhhY3QgbWVhbmluZyBpcyBkZXZpY2UtIGFuZCBhcHBsaWNhdGlvbi1kZXBlbmRlbnQuCisgICAgICogTWVzc2FnZSBpcyBzZW50IGJlZm9yZSByZW5kZXJpbmcgb2YgZWFjaCBmcmFtZS4KKyAgICAgKgorICAgICAqIGRhdGE6IE5VTEwuCisgICAgICovCisgICAgQVZfREVWX1RPX0FQUF9QUkVQQVJFX1dJTkRPV19CVUZGRVIgPSBNS0JFVEFHKCdCJywnUCcsJ1InLCdFJyksCisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHdpbmRvdyBidWZmZXIgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIERldmljZSByZXF1ZXN0cyB0byBkaXNwbGF5IGEgd2luZG93IGJ1ZmZlci4KKyAgICAgKiBNZXNzYWdlIGlzIHNlbnQgd2hlbiBuZXcgZnJhbWUgaXMgcmVhZHkgdG8gYmUgZGlzcGxheWVkLgorICAgICAqIFVzdWFsbHkgYnVmZmVycyBuZWVkIHRvIGJlIHN3YXBwZWQgaW4gaGFuZGxlciBvZiB0aGlzIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBkYXRhOiBOVUxMLgorICAgICAqLworICAgIEFWX0RFVl9UT19BUFBfRElTUExBWV9XSU5ET1dfQlVGRkVSID0gTUtCRVRBRygnQicsJ0QnLCdJJywnUycpLAorCisgICAgLyoqCisgICAgICogRGVzdHJveSB3aW5kb3cgYnVmZmVyIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBEZXZpY2UgcmVxdWVzdHMgdG8gZGVzdHJveSBhIHdpbmRvdyBidWZmZXIuCisgICAgICogTWVzc2FnZSBpcyBzZW50IHdoZW4gZGV2aWNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZCBhbmQgd2luZG93CisgICAgICogYnVmZmVyIGlzIG5vdCByZXF1aXJlZCBhbnltb3JlLgorICAgICAqCisgICAgICogZGF0YTogTlVMTC4KKyAgICAgKi8KKyAgICBBVl9ERVZfVE9fQVBQX0RFU1RST1lfV0lORE9XX0JVRkZFUiA9IE1LQkVUQUcoJ0InLCdEJywnRScsJ1MnKSwKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmdWxsbmVzcyBzdGF0dXMgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBEZXZpY2Ugc2lnbmFscyBidWZmZXIgb3ZlcmZsb3cvdW5kZXJmbG93LgorICAgICAqCisgICAgICogZGF0YTogTlVMTC4KKyAgICAgKi8KKyAgICBBVl9ERVZfVE9fQVBQX0JVRkZFUl9PVkVSRkxPVyA9IE1LQkVUQUcoJ0InLCdPJywnRicsJ0wnKSwKKyAgICBBVl9ERVZfVE9fQVBQX0JVRkZFUl9VTkRFUkZMT1cgPSBNS0JFVEFHKCdCJywnVScsJ0YnLCdMJyksCisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgcmVhZGFibGUvd3JpdGFibGUuCisgICAgICoKKyAgICAgKiBEZXZpY2UgaW5mb3JtcyB0aGF0IGJ1ZmZlciBpcyByZWFkYWJsZS93cml0YWJsZS4KKyAgICAgKiBXaGVuIHBvc3NpYmxlLCBkZXZpY2UgaW5mb3JtcyBob3cgbWFueSBieXRlcyBjYW4gYmUgcmVhZC93cml0ZS4KKyAgICAgKgorICAgICAqIEB3YXJuaW5nIERldmljZSBtYXkgbm90IGluZm9ybSB3aGVuIG51bWJlciBvZiBieXRlcyB0aGFuIGNhbiBiZSByZWFkL3dyaXRlIGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBkYXRhOiBpbnQ2NF90OiBhbW91bnQgb2YgYnl0ZXMgYXZhaWxhYmxlIHRvIHJlYWQvd3JpdGUuCisgICAgICogICAgICAgTlVMTDogYW1vdW50IG9mIGJ5dGVzIGF2YWlsYWJsZSB0byByZWFkL3dyaXRlIGlzIG5vdCBrbm93bi4KKyAgICAgKi8KKyAgICBBVl9ERVZfVE9fQVBQX0JVRkZFUl9SRUFEQUJMRSA9IE1LQkVUQUcoJ0InLCdSJywnRCcsJyAnKSwKKyAgICBBVl9ERVZfVE9fQVBQX0JVRkZFUl9XUklUQUJMRSA9IE1LQkVUQUcoJ0InLCdXJywnUicsJyAnKSwKKworICAgIC8qKgorICAgICAqIE11dGUgc3RhdGUgY2hhbmdlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBEZXZpY2UgaW5mb3JtcyB0aGF0IG11dGUgc3RhdGUgaGFzIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBkYXRhOiBpbnQ6IDAgZm9yIG5vdCBtdXRlZCBzdGF0ZSwgbm9uLXplcm8gZm9yIG11dGVkIHN0YXRlLgorICAgICAqLworICAgIEFWX0RFVl9UT19BUFBfTVVURV9TVEFURV9DSEFOR0VEID0gTUtCRVRBRygnQycsJ00nLCdVJywnVCcpLAorCisgICAgLyoqCisgICAgICogVm9sdW1lIGxldmVsIGNoYW5nZSBtZXNzYWdlLgorICAgICAqCisgICAgICogRGV2aWNlIGluZm9ybXMgdGhhdCB2b2x1bWUgbGV2ZWwgaGFzIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBkYXRhOiBkb3VibGU6IG5ldyB2b2x1bWUgd2l0aCByYW5nZSBvZiAwLjAgLSAxLjAuCisgICAgICovCisgICAgQVZfREVWX1RPX0FQUF9WT0xVTUVfTEVWRUxfQ0hBTkdFRCA9IE1LQkVUQUcoJ0MnLCdWJywnTycsJ0wnKSwKK307CisKKy8qKgorICogU2VuZCBjb250cm9sIG1lc3NhZ2UgZnJvbSBhcHBsaWNhdGlvbiB0byBkZXZpY2UuCisgKgorICogQHBhcmFtIHMgICAgICAgICBkZXZpY2UgY29udGV4dC4KKyAqIEBwYXJhbSB0eXBlICAgICAgbWVzc2FnZSB0eXBlLgorICogQHBhcmFtIGRhdGEgICAgICBtZXNzYWdlIGRhdGEuIEV4YWN0IHR5cGUgZGVwZW5kcyBvbiBtZXNzYWdlIHR5cGUuCisgKiBAcGFyYW0gZGF0YV9zaXplIHNpemUgb2YgbWVzc2FnZSBkYXRhLgorICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGVycm9yLgorICogICAgICAgICBBVkVSUk9SKEVOT1NZUykgd2hlbiBkZXZpY2UgZG9lc24ndCBpbXBsZW1lbnQgaGFuZGxlciBvZiB0aGUgbWVzc2FnZS4KKyAqLworaW50IGF2ZGV2aWNlX2FwcF90b19kZXZfY29udHJvbF9tZXNzYWdlKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkFwcFRvRGV2TWVzc2FnZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKTsKKworLyoqCisgKiBTZW5kIGNvbnRyb2wgbWVzc2FnZSBmcm9tIGRldmljZSB0byBhcHBsaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gcyAgICAgICAgIGRldmljZSBjb250ZXh0LgorICogQHBhcmFtIHR5cGUgICAgICBtZXNzYWdlIHR5cGUuCisgKiBAcGFyYW0gZGF0YSAgICAgIG1lc3NhZ2UgZGF0YS4gQ2FuIGJlIE5VTEwuCisgKiBAcGFyYW0gZGF0YV9zaXplIHNpemUgb2YgbWVzc2FnZSBkYXRhLgorICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGVycm9yLgorICogICAgICAgICBBVkVSUk9SKEVOT1NZUykgd2hlbiBhcHBsaWNhdGlvbiBkb2Vzbid0IGltcGxlbWVudCBoYW5kbGVyIG9mIHRoZSBtZXNzYWdlLgorICovCitpbnQgYXZkZXZpY2VfZGV2X3RvX2FwcF9jb250cm9sX21lc3NhZ2Uoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWRGV2VG9BcHBNZXNzYWdlVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpOworCisvKioKKyAqIEZvbGxvd2luZyBBUEkgYWxsb3dzIHVzZXIgdG8gcHJvYmUgZGV2aWNlIGNhcGFiaWxpdGllcyAoc3VwcG9ydGVkIGNvZGVjcywKKyAqIHBpeGVsIGZvcm1hdHMsIHNhbXBsZSBmb3JtYXRzLCByZXNvbHV0aW9ucywgY2hhbm5lbCBjb3VudHMsIGV0YykuCisgKiBJdCBpcyBidWlsZCBvbiB0b3Agb3AgQVZPcHRpb24gQVBJLgorICogUXVlcmllZCBjYXBhYmlsaXRpZXMgYWxsb3dzIHRvIHNldCB1cCBjb252ZXJ0ZXJzIG9mIHZpZGVvIG9yIGF1ZGlvCisgKiBwYXJhbWV0ZXJzIHRoYXQgZml0IHRvIHRoZSBkZXZpY2UuCisgKgorICogTGlzdCBvZiBjYXBhYmlsaXRpZXMgdGhhdCBjYW4gYmUgcXVlcmllZDoKKyAqICAtIENhcGFiaWxpdGllcyB2YWxpZCBmb3IgYm90aCBhdWRpbyBhbmQgdmlkZW8gZGV2aWNlczoKKyAqICAgIC0gY29kZWM6ICAgICAgICAgIHN1cHBvcnRlZCBhdWRpby92aWRlbyBjb2RlY3MuCisgKiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBVl9PUFRfVFlQRV9JTlQgKEFWQ29kZWNJRCB2YWx1ZSkKKyAqICAtIENhcGFiaWxpdGllcyB2YWxpZCBmb3IgYXVkaW8gZGV2aWNlczoKKyAqICAgIC0gc2FtcGxlX2Zvcm1hdDogIHN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0cy4KKyAqICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEFWX09QVF9UWVBFX0lOVCAoQVZTYW1wbGVGb3JtYXQgdmFsdWUpCisgKiAgICAtIHNhbXBsZV9yYXRlOiAgICBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzLgorICogICAgICAgICAgICAgICAgICAgICAgdHlwZTogQVZfT1BUX1RZUEVfSU5UCisgKiAgICAtIGNoYW5uZWxzOiAgICAgICBzdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzLgorICogICAgICAgICAgICAgICAgICAgICAgdHlwZTogQVZfT1BUX1RZUEVfSU5UCisgKiAgICAtIGNoYW5uZWxfbGF5b3V0OiBzdXBwb3J0ZWQgY2hhbm5lbCBsYXlvdXRzLgorICogICAgICAgICAgICAgICAgICAgICAgdHlwZTogQVZfT1BUX1RZUEVfSU5UNjQKKyAqICAtIENhcGFiaWxpdGllcyB2YWxpZCBmb3IgdmlkZW8gZGV2aWNlczoKKyAqICAgIC0gcGl4ZWxfZm9ybWF0OiAgIHN1cHBvcnRlZCBwaXhlbCBmb3JtYXRzLgorICogICAgICAgICAgICAgICAgICAgICAgdHlwZTogQVZfT1BUX1RZUEVfSU5UIChBVlBpeGVsRm9ybWF0IHZhbHVlKQorICogICAgLSB3aW5kb3dfc2l6ZTogICAgc3VwcG9ydGVkIHdpbmRvdyBzaXplcyAoZGVzY3JpYmVzIHNpemUgb2YgdGhlIHdpbmRvdyBzaXplIHByZXNlbnRlZCB0byB0aGUgdXNlcikuCisgKiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFCisgKiAgICAtIGZyYW1lX3NpemU6ICAgICBzdXBwb3J0ZWQgZnJhbWUgc2l6ZXMgKGRlc2NyaWJlcyBzaXplIG9mIHByb3ZpZGVkIHZpZGVvIGZyYW1lcykuCisgKiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFCisgKiAgICAtIGZwczogICAgICAgICAgICBzdXBwb3J0ZWQgZnBzIHZhbHVlcworICogICAgICAgICAgICAgICAgICAgICAgdHlwZTogQVZfT1BUX1RZUEVfUkFUSU9OQUwKKyAqCisgKiBWYWx1ZSBvZiB0aGUgY2FwYWJpbGl0eSBtYXkgYmUgc2V0IGJ5IHVzZXIgdXNpbmcgYXZfb3B0X3NldCgpIGZ1bmN0aW9uCisgKiBhbmQgQVZEZXZpY2VDYXBhYmlsaXRpZXNRdWVyeSBvYmplY3QuIEZvbGxvd2luZyBxdWVyaWVzIHdpbGwKKyAqIGxpbWl0IHJlc3VsdHMgdG8gdGhlIHZhbHVlcyBtYXRjaGluZyBhbHJlYWR5IHNldCBjYXBhYmlsaXRpZXMuCisgKiBGb3IgZXhhbXBsZSwgc2V0dGluZyBhIGNvZGVjIG1heSBpbXBhY3QgbnVtYmVyIG9mIGZvcm1hdHMgb3IgZnBzIHZhbHVlcworICogcmV0dXJuZWQgZHVyaW5nIG5leHQgcXVlcnkuIFNldHRpbmcgaW52YWxpZCB2YWx1ZSBtYXkgbGltaXQgcmVzdWx0cyB0byB6ZXJvLgorICoKKyAqIEV4YW1wbGUgb2YgdGhlIHVzYWdlIGJhc2luZyBvbiBvcGVuZ2wgb3V0cHV0IGRldmljZToKKyAqCisgKiBAY29kZQorICogIEFWRm9ybWF0Q29udGV4dCAqb2MgPSBOVUxMOworICogIEFWRGV2aWNlQ2FwYWJpbGl0aWVzUXVlcnkgKmNhcHMgPSBOVUxMOworICogIEFWT3B0aW9uUmFuZ2VzICpyYW5nZXM7CisgKiAgaW50IHJldDsKKyAqCisgKiAgaWYgKChyZXQgPSBhdmZvcm1hdF9hbGxvY19vdXRwdXRfY29udGV4dDIoJm9jLCBOVUxMLCAib3BlbmdsIiwgTlVMTCkpIDwgMCkKKyAqICAgICAgZ290byBmYWlsOworICogIGlmIChhdmRldmljZV9jYXBhYmlsaXRpZXNfY3JlYXRlKCZjYXBzLCBvYywgTlVMTCkgPCAwKQorICogICAgICBnb3RvIGZhaWw7CisgKgorICogIC8vcXVlcnkgY29kZWNzCisgKiAgaWYgKGF2X29wdF9xdWVyeV9yYW5nZXMoJnJhbmdlcywgY2FwcywgImNvZGVjIiwgQVZfT1BUX01VTFRJX0NPTVBPTkVOVF9SQU5HRSkpIDwgMCkKKyAqICAgICAgZ290byBmYWlsOworICogIC8vcGljayBjb2RlYyBoZXJlIGFuZCBzZXQgaXQKKyAqICBhdl9vcHRfc2V0KGNhcHMsICJjb2RlYyIsIEFWX0NPREVDX0lEX1JBV1ZJREVPLCAwKTsKKyAqCisgKiAgLy9xdWVyeSBmb3JtYXQKKyAqICBpZiAoYXZfb3B0X3F1ZXJ5X3JhbmdlcygmcmFuZ2VzLCBjYXBzLCAicGl4ZWxfZm9ybWF0IiwgQVZfT1BUX01VTFRJX0NPTVBPTkVOVF9SQU5HRSkpIDwgMCkKKyAqICAgICAgZ290byBmYWlsOworICogIC8vcGljayBmb3JtYXQgaGVyZSBhbmQgc2V0IGl0CisgKiAgYXZfb3B0X3NldChjYXBzLCAicGl4ZWxfZm9ybWF0IiwgQVZfUElYX0ZNVF9ZVVY0MjBQLCAwKTsKKyAqCisgKiAgLy9xdWVyeSBhbmQgc2V0IG1vcmUgY2FwYWJpbGl0aWVzCisgKgorICogZmFpbDoKKyAqICAvL2NsZWFuIHVwIGNvZGUKKyAqICBhdmRldmljZV9jYXBhYmlsaXRpZXNfZnJlZSgmcXVlcnksIG9jKTsKKyAqICBhdmZvcm1hdF9mcmVlX2NvbnRleHQob2MpOworICogQGVuZGNvZGUKKyAqLworCisvKioKKyAqIFN0cnVjdHVyZSBkZXNjcmliZXMgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqCisgKiBJdCBpcyB1c2VkIGJ5IGRldmljZXMgaW4gY29uanVuY3Rpb24gd2l0aCBhdl9kZXZpY2VfY2FwYWJpbGl0aWVzIEFWT3B0aW9uIHRhYmxlCisgKiB0byBpbXBsZW1lbnQgY2FwYWJpbGl0aWVzIHByb2JpbmcgQVBJIGJhc2VkIG9uIEFWT3B0aW9uIEFQSS4gU2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LgorICovCit0eXBlZGVmIHN0cnVjdCBBVkRldmljZUNhcGFiaWxpdGllc1F1ZXJ5IHsKKyAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKKyAgICBBVkZvcm1hdENvbnRleHQgKmRldmljZV9jb250ZXh0OworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjOworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2Zvcm1hdDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4ZWxfZm9ybWF0OworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50NjRfdCBjaGFubmVsX2xheW91dDsKKyAgICBpbnQgd2luZG93X3dpZHRoOworICAgIGludCB3aW5kb3dfaGVpZ2h0OworICAgIGludCBmcmFtZV93aWR0aDsKKyAgICBpbnQgZnJhbWVfaGVpZ2h0OworICAgIEFWUmF0aW9uYWwgZnBzOworfSBBVkRldmljZUNhcGFiaWxpdGllc1F1ZXJ5OworCisvKioKKyAqIEFWT3B0aW9uIHRhYmxlIHVzZWQgYnkgZGV2aWNlcyB0byBpbXBsZW1lbnQgZGV2aWNlIGNhcGFiaWxpdGllcyBBUEkuIFNob3VsZCBub3QgYmUgdXNlZCBieSBhIHVzZXIuCisgKi8KK2V4dGVybiBjb25zdCBBVk9wdGlvbiBhdl9kZXZpY2VfY2FwYWJpbGl0aWVzW107CisKKy8qKgorICogSW5pdGlhbGl6ZSBjYXBhYmlsaXRpZXMgcHJvYmluZyBBUEkgYmFzZWQgb24gQVZPcHRpb24gQVBJLgorICoKKyAqIGF2ZGV2aWNlX2NhcGFiaWxpdGllc19mcmVlKCkgbXVzdCBiZSBjYWxsZWQgd2hlbiBxdWVyeSBjYXBhYmlsaXRpZXMgQVBJIGlzCisgKiBub3QgdXNlZCBhbnltb3JlLgorICoKKyAqIEBwYXJhbVtvdXRdIGNhcHMgICAgICBEZXZpY2UgY2FwYWJpbGl0aWVzIGRhdGEuIFBvaW50ZXIgdG8gYSBOVUxMIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQuCisgKiBAcGFyYW0gcyAgICAgICAgICAgICAgQ29udGV4dCBvZiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGRldmljZV9vcHRpb25zIEFuIEFWRGljdGlvbmFyeSBmaWxsZWQgd2l0aCBkZXZpY2UtcHJpdmF0ZSBvcHRpb25zLgorICogICAgICAgICAgICAgICAgICAgICAgIE9uIHJldHVybiB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIGRlc3Ryb3llZCBhbmQgcmVwbGFjZWQgd2l0aCBhIGRpY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIG9wdGlvbnMgdGhhdCB3ZXJlIG5vdCBmb3VuZC4gTWF5IGJlIE5VTEwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNhbWUgb3B0aW9ucyBtdXN0IGJlIHBhc3NlZCBsYXRlciB0byBhdmZvcm1hdF93cml0ZV9oZWFkZXIoKSBmb3Igb3V0cHV0CisgKiAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcyBvciBhdmZvcm1hdF9vcGVuX2lucHV0KCkgZm9yIGlucHV0IGRldmljZXMsIG9yIGF0IGFueSBvdGhlciBwbGFjZQorICogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYWZmZWN0cyBkZXZpY2UtcHJpdmF0ZSBvcHRpb25zLgorICoKKyAqIEByZXR1cm4gPj0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvdGhlcndpc2UuCisgKi8KK2ludCBhdmRldmljZV9jYXBhYmlsaXRpZXNfY3JlYXRlKEFWRGV2aWNlQ2FwYWJpbGl0aWVzUXVlcnkgKipjYXBzLCBBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKipkZXZpY2Vfb3B0aW9ucyk7CisKKy8qKgorICogRnJlZSByZXNvdXJjZXMgY3JlYXRlZCBieSBhdmRldmljZV9jYXBhYmlsaXRpZXNfY3JlYXRlKCkKKyAqCisgKiBAcGFyYW0gY2FwcyBEZXZpY2UgY2FwYWJpbGl0aWVzIGRhdGEgdG8gYmUgZnJlZWQuCisgKiBAcGFyYW0gcyAgICBDb250ZXh0IG9mIHRoZSBkZXZpY2UuCisgKi8KK3ZvaWQgYXZkZXZpY2VfY2FwYWJpbGl0aWVzX2ZyZWUoQVZEZXZpY2VDYXBhYmlsaXRpZXNRdWVyeSAqKmNhcHMsIEFWRm9ybWF0Q29udGV4dCAqcyk7CisKKy8qKgorICogU3RydWN0dXJlIGRlc2NyaWJlcyBiYXNpYyBwYXJhbWV0ZXJzIG9mIHRoZSBkZXZpY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWRGV2aWNlSW5mbyB7CisgICAgY2hhciAqZGV2aWNlX25hbWU7ICAgICAgICAgICAgICAgICAgIC8qKjwgZGV2aWNlIG5hbWUsIGZvcm1hdCBkZXBlbmRzIG9uIGRldmljZSAqLworICAgIGNoYXIgKmRldmljZV9kZXNjcmlwdGlvbjsgICAgICAgICAgICAvKio8IGh1bWFuIGZyaWVuZGx5IG5hbWUgKi8KK30gQVZEZXZpY2VJbmZvOworCisvKioKKyAqIExpc3Qgb2YgZGV2aWNlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZEZXZpY2VJbmZvTGlzdCB7CisgICAgQVZEZXZpY2VJbmZvICoqZGV2aWNlczsgICAgICAgICAgICAgIC8qKjwgbGlzdCBvZiBhdXRvZGV0ZWN0ZWQgZGV2aWNlcyAqLworICAgIGludCBuYl9kZXZpY2VzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IG51bWJlciBvZiBhdXRvZGV0ZWN0ZWQgZGV2aWNlcyAqLworICAgIGludCBkZWZhdWx0X2RldmljZTsgICAgICAgICAgICAgICAgICAvKio8IGluZGV4IG9mIGRlZmF1bHQgZGV2aWNlIG9yIC0xIGlmIG5vIGRlZmF1bHQgKi8KK30gQVZEZXZpY2VJbmZvTGlzdDsKKworLyoqCisgKiBMaXN0IGRldmljZXMuCisgKgorICogUmV0dXJucyBhdmFpbGFibGUgZGV2aWNlIG5hbWVzIGFuZCB0aGVpciBwYXJhbWV0ZXJzLgorICoKKyAqIEBub3RlOiBTb21lIGRldmljZXMgbWF5IGFjY2VwdCBzeXN0ZW0tZGVwZW5kZW50IGRldmljZSBuYW1lcyB0aGF0IGNhbm5vdCBiZQorICogICAgICAgIGF1dG9kZXRlY3RlZC4gVGhlIGxpc3QgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgYXNzdW1lZCB0bworICogICAgICAgIGJlIGFsd2F5cyBjb21wbGV0ZWQuCisgKgorICogQHBhcmFtIHMgICAgICAgICAgICAgICAgZGV2aWNlIGNvbnRleHQuCisgKiBAcGFyYW1bb3V0XSBkZXZpY2VfbGlzdCBsaXN0IG9mIGF1dG9kZXRlY3RlZCBkZXZpY2VzLgorICogQHJldHVybiBjb3VudCBvZiBhdXRvZGV0ZWN0ZWQgZGV2aWNlcywgbmVnYXRpdmUgb24gZXJyb3IuCisgKi8KK2ludCBhdmRldmljZV9saXN0X2RldmljZXMoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgQVZEZXZpY2VJbmZvTGlzdCAqKmRldmljZV9saXN0KTsKKworLyoqCisgKiBDb252ZW5pZW50IGZ1bmN0aW9uIHRvIGZyZWUgcmVzdWx0IG9mIGF2ZGV2aWNlX2xpc3RfZGV2aWNlcygpLgorICoKKyAqIEBwYXJhbSBkZXZpY2VzIGRldmljZSBsaXN0IHRvIGJlIGZyZWVkLgorICovCit2b2lkIGF2ZGV2aWNlX2ZyZWVfbGlzdF9kZXZpY2VzKEFWRGV2aWNlSW5mb0xpc3QgKipkZXZpY2VfbGlzdCk7CisKKyNlbmRpZiAvKiBBVkRFVklDRV9BVkRFVklDRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvYXZkZXZpY2VyZXMucmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvYXZkZXZpY2VyZXMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzZTczZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9hdmRldmljZXJlcy5yYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogV2luZG93cyByZXNvdXJjZSBmaWxlIGZvciBsaWJhdmRldmljZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBKYW1lcyBBbG1lcgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRpYW5jaGVuZyAiVGltb3RoeSIgR3UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlICJsaWJhdmRldmljZS92ZXJzaW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZmdmVyc2lvbi5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisxIFZFUlNJT05JTkZPCitGSUxFVkVSU0lPTiAgICAgTElCQVZERVZJQ0VfVkVSU0lPTl9NQUpPUiwgTElCQVZERVZJQ0VfVkVSU0lPTl9NSU5PUiwgTElCQVZERVZJQ0VfVkVSU0lPTl9NSUNSTywgMAorUFJPRFVDVFZFUlNJT04gIExJQkFWREVWSUNFX1ZFUlNJT05fTUFKT1IsIExJQkFWREVWSUNFX1ZFUlNJT05fTUlOT1IsIExJQkFWREVWSUNFX1ZFUlNJT05fTUlDUk8sIDAKK0ZJTEVGTEFHU01BU0sgICBWU19GRklfRklMRUZMQUdTTUFTSworRklMRU9TICAgICAgICAgIFZPU19OVF9XSU5ET1dTMzIKK0ZJTEVUWVBFICAgICAgICBWRlRfRExMCit7CisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIHsKKyAgICAgICAgQkxPQ0sgIjA0MDkwNEIwIgorICAgICAgICB7CisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAgICAgICJGRm1wZWcgUHJvamVjdCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAgIkZGbXBlZyBkZXZpY2UgaGFuZGxpbmcgbGlicmFyeSIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICAgICAgQVZfU1RSSU5HSUZZKExJQkFWREVWSUNFX1ZFUlNJT04pCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgICAgICJsaWJhdmRldmljZSIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICAgIkNvcHlyaWdodCAoQykgMjAwMC0iIEFWX1NUUklOR0lGWShDT05GSUdfVEhJU19ZRUFSKSAiIEZGbXBlZyBQcm9qZWN0IgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAiYXZkZXZpY2UiIEJVSUxEU1VGICItIiBBVl9TVFJJTkdJRlkoTElCQVZERVZJQ0VfVkVSU0lPTl9NQUpPUikgU0xJQlNVRgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgICAgICAiRkZtcGVnIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgICBGRk1QRUdfVkVSU0lPTgorICAgICAgICB9CisgICAgfQorCisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIHsKKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwNDA5LCAweDA0QjAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvYXZmb3VuZGF0aW9uLm0gYi9mZm1wZWcvbGliYXZkZXZpY2UvYXZmb3VuZGF0aW9uLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3ZWI1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9hdmZvdW5kYXRpb24ubQpAQCAtMCwwICsxLDg1NSBAQAorLyoKKyAqIEFWRm91bmRhdGlvbiBpbnB1dCBkZXZpY2UKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaGlsbyBCb3JnbWFubiA8dGhpbG8uYm9yZ21hbm5AbWFpbC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQVZGb3VuZGF0aW9uIGlucHV0IGRldmljZQorICogQGF1dGhvciBUaGlsbyBCb3JnbWFubiA8dGhpbG8uYm9yZ21hbm5AbWFpbC5kZT4KKyAqLworCisjaW1wb3J0IDxBVkZvdW5kYXRpb24vQVZGb3VuZGF0aW9uLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKK3N0YXRpYyBjb25zdCBpbnQgYXZmX3RpbWVfYmFzZSA9IDEwMDAwMDA7CisKK3N0YXRpYyBjb25zdCBBVlJhdGlvbmFsIGF2Zl90aW1lX2Jhc2VfcSA9IHsKKyAgICAubnVtID0gMSwKKyAgICAuZGVuID0gYXZmX3RpbWVfYmFzZQorfTsKKworc3RydWN0IEFWRlBpeGVsRm9ybWF0U3BlYyB7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGZmX2lkOworICAgIE9TVHlwZSBhdmZfaWQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IEFWRlBpeGVsRm9ybWF0U3BlYyBhdmZfcGl4ZWxfZm9ybWF0c1tdID0geworICAgIHsgQVZfUElYX0ZNVF9NT05PQkxBQ0ssICAgIGtDVlBpeGVsRm9ybWF0VHlwZV8xTW9ub2Nocm9tZSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NTVCRSwgICAgIGtDVlBpeGVsRm9ybWF0VHlwZV8xNkJFNTU1IH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjU1NUxFLCAgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzE2TEU1NTUgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCNTY1QkUsICAgICBrQ1ZQaXhlbEZvcm1hdFR5cGVfMTZCRTU2NSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NjVMRSwgICAgIGtDVlBpeGVsRm9ybWF0VHlwZV8xNkxFNTY1IH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjI0LCAgICAgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzI0UkdCIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjI0LCAgICAgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzI0QkdSIH0sCisgICAgeyBBVl9QSVhfRk1UXzBSR0IsICAgICAgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzMyQVJHQiB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1IwLCAgICAgICAgIGtDVlBpeGVsRm9ybWF0VHlwZV8zMkJHUkEgfSwKKyAgICB7IEFWX1BJWF9GTVRfMEJHUiwgICAgICAgICBrQ1ZQaXhlbEZvcm1hdFR5cGVfMzJBQkdSIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjAsICAgICAgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzMyUkdCQSB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1I0OEJFLCAgICAgIGtDVlBpeGVsRm9ybWF0VHlwZV80OFJHQiB9LAorICAgIHsgQVZfUElYX0ZNVF9VWVZZNDIyLCAgICAgIGtDVlBpeGVsRm9ybWF0VHlwZV80MjJZcENiQ3I4IH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0NDRQLCAgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzQ0NDRZcENiQ3JBOFIgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWQTQ0NFAxNkxFLCBrQ1ZQaXhlbEZvcm1hdFR5cGVfNDQ0NEFZcENiQ3IxNiB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0NDRQLCAgICAgIGtDVlBpeGVsRm9ybWF0VHlwZV80NDRZcENiQ3I4IH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxNiwgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzQyMllwQ2JDcjE2IH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzQyMllwQ2JDcjEwIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzQ0NFlwQ2JDcjEwIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAsICAgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzQyMFlwQ2JDcjhQbGFuYXIgfSwKKyAgICB7IEFWX1BJWF9GTVRfTlYxMiwgICAgICAgICBrQ1ZQaXhlbEZvcm1hdFR5cGVfNDIwWXBDYkNyOEJpUGxhbmFyVmlkZW9SYW5nZSB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVlWNDIyLCAgICAgIGtDVlBpeGVsRm9ybWF0VHlwZV80MjJZcENiQ3I4X3l1dnMgfSwKKyNpZiBfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEID49IDEwODAKKyAgICB7IEFWX1BJWF9GTVRfR1JBWTgsICAgICAgICBrQ1ZQaXhlbEZvcm1hdFR5cGVfT25lQ29tcG9uZW50OCB9LAorI2VuZGlmCisgICAgeyBBVl9QSVhfRk1UX05PTkUsIDAgfQorfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBBVkNsYXNzKiAgICAgICAgY2xhc3M7CisKKyAgICBpbnQgICAgICAgICAgICAgZnJhbWVzX2NhcHR1cmVkOworICAgIGludCAgICAgICAgICAgICBhdWRpb19mcmFtZXNfY2FwdHVyZWQ7CisgICAgaW50NjRfdCAgICAgICAgIGZpcnN0X3B0czsKKyAgICBpbnQ2NF90ICAgICAgICAgZmlyc3RfYXVkaW9fcHRzOworICAgIHB0aHJlYWRfbXV0ZXhfdCBmcmFtZV9sb2NrOworICAgIHB0aHJlYWRfY29uZF90ICBmcmFtZV93YWl0X2NvbmQ7CisgICAgaWQgICAgICAgICAgICAgIGF2Zl9kZWxlZ2F0ZTsKKyAgICBpZCAgICAgICAgICAgICAgYXZmX2F1ZGlvX2RlbGVnYXRlOworCisgICAgaW50ICAgICAgICAgICAgIGxpc3RfZGV2aWNlczsKKyAgICBpbnQgICAgICAgICAgICAgdmlkZW9fZGV2aWNlX2luZGV4OworICAgIGludCAgICAgICAgICAgICB2aWRlb19zdHJlYW1faW5kZXg7CisgICAgaW50ICAgICAgICAgICAgIGF1ZGlvX2RldmljZV9pbmRleDsKKyAgICBpbnQgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX2luZGV4OworCisgICAgY2hhciAgICAgICAgICAgICp2aWRlb19maWxlbmFtZTsKKyAgICBjaGFyICAgICAgICAgICAgKmF1ZGlvX2ZpbGVuYW1lOworCisgICAgaW50ICAgICAgICAgICAgIG51bV92aWRlb19kZXZpY2VzOworCisgICAgaW50ICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxzOworICAgIGludCAgICAgICAgICAgICBhdWRpb19iaXRzX3Blcl9zYW1wbGU7CisgICAgaW50ICAgICAgICAgICAgIGF1ZGlvX2Zsb2F0OworICAgIGludCAgICAgICAgICAgICBhdWRpb19iZTsKKyAgICBpbnQgICAgICAgICAgICAgYXVkaW9fc2lnbmVkX2ludGVnZXI7CisgICAgaW50ICAgICAgICAgICAgIGF1ZGlvX3BhY2tlZDsKKyAgICBpbnQgICAgICAgICAgICAgYXVkaW9fbm9uX2ludGVybGVhdmVkOworCisgICAgaW50MzJfdCAgICAgICAgICphdWRpb19idWZmZXI7CisgICAgaW50ICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl9zaXplOworCisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdDsKKworICAgIEFWQ2FwdHVyZVNlc3Npb24gICAgICAgICAqY2FwdHVyZV9zZXNzaW9uOworICAgIEFWQ2FwdHVyZVZpZGVvRGF0YU91dHB1dCAqdmlkZW9fb3V0cHV0OworICAgIEFWQ2FwdHVyZUF1ZGlvRGF0YU91dHB1dCAqYXVkaW9fb3V0cHV0OworICAgIENNU2FtcGxlQnVmZmVyUmVmICAgICAgICAgY3VycmVudF9mcmFtZTsKKyAgICBDTVNhbXBsZUJ1ZmZlclJlZiAgICAgICAgIGN1cnJlbnRfYXVkaW9fZnJhbWU7Cit9IEFWRkNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIGxvY2tfZnJhbWVzKEFWRkNvbnRleHQqIGN0eCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmN0eC0+ZnJhbWVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHVubG9ja19mcmFtZXMoQVZGQ29udGV4dCogY3R4KQoreworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjdHgtPmZyYW1lX2xvY2spOworfQorCisvKiogRnJhbWVSZWNpZXZlciBjbGFzcyAtIGRlbGVnYXRlIGZvciBBVkNhcHR1cmVTZXNzaW9uCisgKi8KK0BpbnRlcmZhY2UgQVZGRnJhbWVSZWNlaXZlciA6IE5TT2JqZWN0Cit7CisgICAgQVZGQ29udGV4dCogX2NvbnRleHQ7Cit9CisKKy0gKGlkKWluaXRXaXRoQ29udGV4dDooQVZGQ29udGV4dCopY29udGV4dDsKKworLSAodm9pZCkgIGNhcHR1cmVPdXRwdXQ6KEFWQ2FwdHVyZU91dHB1dCAqKWNhcHR1cmVPdXRwdXQKKyAgZGlkT3V0cHV0U2FtcGxlQnVmZmVyOihDTVNhbXBsZUJ1ZmZlclJlZil2aWRlb0ZyYW1lCisgICAgICAgICBmcm9tQ29ubmVjdGlvbjooQVZDYXB0dXJlQ29ubmVjdGlvbiAqKWNvbm5lY3Rpb247CisKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEFWRkZyYW1lUmVjZWl2ZXIKKworLSAoaWQpaW5pdFdpdGhDb250ZXh0OihBVkZDb250ZXh0Kiljb250ZXh0Cit7CisgICAgaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKKyAgICAgICAgX2NvbnRleHQgPSBjb250ZXh0OworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgIGNhcHR1cmVPdXRwdXQ6KEFWQ2FwdHVyZU91dHB1dCAqKWNhcHR1cmVPdXRwdXQKKyAgZGlkT3V0cHV0U2FtcGxlQnVmZmVyOihDTVNhbXBsZUJ1ZmZlclJlZil2aWRlb0ZyYW1lCisgICAgICAgICBmcm9tQ29ubmVjdGlvbjooQVZDYXB0dXJlQ29ubmVjdGlvbiAqKWNvbm5lY3Rpb24KK3sKKyAgICBsb2NrX2ZyYW1lcyhfY29udGV4dCk7CisKKyAgICBpZiAoX2NvbnRleHQtPmN1cnJlbnRfZnJhbWUgIT0gbmlsKSB7CisgICAgICAgIENGUmVsZWFzZShfY29udGV4dC0+Y3VycmVudF9mcmFtZSk7CisgICAgfQorCisgICAgX2NvbnRleHQtPmN1cnJlbnRfZnJhbWUgPSAoQ01TYW1wbGVCdWZmZXJSZWYpQ0ZSZXRhaW4odmlkZW9GcmFtZSk7CisKKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZfY29udGV4dC0+ZnJhbWVfd2FpdF9jb25kKTsKKworICAgIHVubG9ja19mcmFtZXMoX2NvbnRleHQpOworCisgICAgKytfY29udGV4dC0+ZnJhbWVzX2NhcHR1cmVkOworfQorCitAZW5kCisKKy8qKiBBdWRpb1JlY2lldmVyIGNsYXNzIC0gZGVsZWdhdGUgZm9yIEFWQ2FwdHVyZVNlc3Npb24KKyAqLworQGludGVyZmFjZSBBVkZBdWRpb1JlY2VpdmVyIDogTlNPYmplY3QKK3sKKyAgICBBVkZDb250ZXh0KiBfY29udGV4dDsKK30KKworLSAoaWQpaW5pdFdpdGhDb250ZXh0OihBVkZDb250ZXh0Kiljb250ZXh0OworCistICh2b2lkKSAgY2FwdHVyZU91dHB1dDooQVZDYXB0dXJlT3V0cHV0ICopY2FwdHVyZU91dHB1dAorICBkaWRPdXRwdXRTYW1wbGVCdWZmZXI6KENNU2FtcGxlQnVmZmVyUmVmKWF1ZGlvRnJhbWUKKyAgICAgICAgIGZyb21Db25uZWN0aW9uOihBVkNhcHR1cmVDb25uZWN0aW9uICopY29ubmVjdGlvbjsKKworQGVuZAorCitAaW1wbGVtZW50YXRpb24gQVZGQXVkaW9SZWNlaXZlcgorCistIChpZClpbml0V2l0aENvbnRleHQ6KEFWRkNvbnRleHQqKWNvbnRleHQKK3sKKyAgICBpZiAoc2VsZiA9IFtzdXBlciBpbml0XSkgeworICAgICAgICBfY29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSAgY2FwdHVyZU91dHB1dDooQVZDYXB0dXJlT3V0cHV0ICopY2FwdHVyZU91dHB1dAorICBkaWRPdXRwdXRTYW1wbGVCdWZmZXI6KENNU2FtcGxlQnVmZmVyUmVmKWF1ZGlvRnJhbWUKKyAgICAgICAgIGZyb21Db25uZWN0aW9uOihBVkNhcHR1cmVDb25uZWN0aW9uICopY29ubmVjdGlvbgoreworICAgIGxvY2tfZnJhbWVzKF9jb250ZXh0KTsKKworICAgIGlmIChfY29udGV4dC0+Y3VycmVudF9hdWRpb19mcmFtZSAhPSBuaWwpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKF9jb250ZXh0LT5jdXJyZW50X2F1ZGlvX2ZyYW1lKTsKKyAgICB9CisKKyAgICBfY29udGV4dC0+Y3VycmVudF9hdWRpb19mcmFtZSA9IChDTVNhbXBsZUJ1ZmZlclJlZilDRlJldGFpbihhdWRpb0ZyYW1lKTsKKworICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJl9jb250ZXh0LT5mcmFtZV93YWl0X2NvbmQpOworCisgICAgdW5sb2NrX2ZyYW1lcyhfY29udGV4dCk7CisKKyAgICArK19jb250ZXh0LT5hdWRpb19mcmFtZXNfY2FwdHVyZWQ7Cit9CisKK0BlbmQKKworc3RhdGljIHZvaWQgZGVzdHJveV9jb250ZXh0KEFWRkNvbnRleHQqIGN0eCkKK3sKKyAgICBbY3R4LT5jYXB0dXJlX3Nlc3Npb24gc3RvcFJ1bm5pbmddOworCisgICAgW2N0eC0+Y2FwdHVyZV9zZXNzaW9uIHJlbGVhc2VdOworICAgIFtjdHgtPnZpZGVvX291dHB1dCAgICByZWxlYXNlXTsKKyAgICBbY3R4LT5hdWRpb19vdXRwdXQgICAgcmVsZWFzZV07CisgICAgW2N0eC0+YXZmX2RlbGVnYXRlICAgIHJlbGVhc2VdOworICAgIFtjdHgtPmF2Zl9hdWRpb19kZWxlZ2F0ZSByZWxlYXNlXTsKKworICAgIGN0eC0+Y2FwdHVyZV9zZXNzaW9uID0gTlVMTDsKKyAgICBjdHgtPnZpZGVvX291dHB1dCAgICA9IE5VTEw7CisgICAgY3R4LT5hdWRpb19vdXRwdXQgICAgPSBOVUxMOworICAgIGN0eC0+YXZmX2RlbGVnYXRlICAgID0gTlVMTDsKKyAgICBjdHgtPmF2Zl9hdWRpb19kZWxlZ2F0ZSA9IE5VTEw7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5hdWRpb19idWZmZXIpOworCisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZjdHgtPmZyYW1lX2xvY2spOworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZjdHgtPmZyYW1lX3dhaXRfY29uZCk7CisKKyAgICBpZiAoY3R4LT5jdXJyZW50X2ZyYW1lKSB7CisgICAgICAgIENGUmVsZWFzZShjdHgtPmN1cnJlbnRfZnJhbWUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcGFyc2VfZGV2aWNlX25hbWUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWRkNvbnRleHQgKmN0eCA9IChBVkZDb250ZXh0KilzLT5wcml2X2RhdGE7CisgICAgY2hhciAqdG1wID0gYXZfc3RyZHVwKHMtPmZpbGVuYW1lKTsKKyAgICBjaGFyICpzYXZlOworCisgICAgaWYgKHRtcFswXSAhPSAnOicpIHsKKyAgICAgICAgY3R4LT52aWRlb19maWxlbmFtZSA9IGF2X3N0cnRvayh0bXAsICAiOiIsICZzYXZlKTsKKyAgICAgICAgY3R4LT5hdWRpb19maWxlbmFtZSA9IGF2X3N0cnRvayhOVUxMLCAiOiIsICZzYXZlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPmF1ZGlvX2ZpbGVuYW1lID0gYXZfc3RydG9rKHRtcCwgICI6IiwgJnNhdmUpOworICAgIH0KK30KKworc3RhdGljIGludCBhZGRfdmlkZW9fZGV2aWNlKEFWRm9ybWF0Q29udGV4dCAqcywgQVZDYXB0dXJlRGV2aWNlICp2aWRlb19kZXZpY2UpCit7CisgICAgQVZGQ29udGV4dCAqY3R4ID0gKEFWRkNvbnRleHQqKXMtPnByaXZfZGF0YTsKKyAgICBOU0Vycm9yICplcnJvciAgPSBuaWw7CisgICAgQVZDYXB0dXJlSW5wdXQqIGNhcHR1cmVfaW5wdXQgPSBuaWw7CisKKyAgICBpZiAoY3R4LT52aWRlb19kZXZpY2VfaW5kZXggPCBjdHgtPm51bV92aWRlb19kZXZpY2VzKSB7CisgICAgICAgIGNhcHR1cmVfaW5wdXQgPSAoQVZDYXB0dXJlSW5wdXQqKSBbW1tBVkNhcHR1cmVEZXZpY2VJbnB1dCBhbGxvY10gaW5pdFdpdGhEZXZpY2U6dmlkZW9fZGV2aWNlIGVycm9yOiZlcnJvcl0gYXV0b3JlbGVhc2VdOworICAgIH0gZWxzZSB7CisgICAgICAgIGNhcHR1cmVfaW5wdXQgPSAoQVZDYXB0dXJlSW5wdXQqKSB2aWRlb19kZXZpY2U7CisgICAgfQorCisgICAgaWYgKCFjYXB0dXJlX2lucHV0KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIEFWIGNhcHR1cmUgaW5wdXQgZGV2aWNlOiAlc1xuIiwKKyAgICAgICAgICAgICAgIFtbZXJyb3IgbG9jYWxpemVkRGVzY3JpcHRpb25dIFVURjhTdHJpbmddKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKFtjdHgtPmNhcHR1cmVfc2Vzc2lvbiBjYW5BZGRJbnB1dDpjYXB0dXJlX2lucHV0XSkgeworICAgICAgICBbY3R4LT5jYXB0dXJlX3Nlc3Npb24gYWRkSW5wdXQ6Y2FwdHVyZV9pbnB1dF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNhbid0IGFkZCB2aWRlbyBpbnB1dCB0byBjYXB0dXJlIHNlc3Npb25cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBBdHRhY2hpbmcgb3V0cHV0CisgICAgY3R4LT52aWRlb19vdXRwdXQgPSBbW0FWQ2FwdHVyZVZpZGVvRGF0YU91dHB1dCBhbGxvY10gaW5pdF07CisKKyAgICBpZiAoIWN0eC0+dmlkZW9fb3V0cHV0KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gaW5pdCBBViB2aWRlbyBvdXRwdXRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBzZWxlY3QgcGl4ZWwgZm9ybWF0CisgICAgc3RydWN0IEFWRlBpeGVsRm9ybWF0U3BlYyBweGxfZm10X3NwZWM7CisgICAgcHhsX2ZtdF9zcGVjLmZmX2lkID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgZm9yIChpbnQgaSA9IDA7IGF2Zl9waXhlbF9mb3JtYXRzW2ldLmZmX2lkICE9IEFWX1BJWF9GTVRfTk9ORTsgaSsrKSB7CisgICAgICAgIGlmIChjdHgtPnBpeGVsX2Zvcm1hdCA9PSBhdmZfcGl4ZWxfZm9ybWF0c1tpXS5mZl9pZCkgeworICAgICAgICAgICAgcHhsX2ZtdF9zcGVjID0gYXZmX3BpeGVsX2Zvcm1hdHNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNoZWNrIGlmIHNlbGVjdGVkIHBpeGVsIGZvcm1hdCBpcyBzdXBwb3J0ZWQgYnkgQVZGb3VuZGF0aW9uCisgICAgaWYgKHB4bF9mbXRfc3BlYy5mZl9pZCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlNlbGVjdGVkIHBpeGVsIGZvcm1hdCAoJXMpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQVZGb3VuZGF0aW9uLlxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUocHhsX2ZtdF9zcGVjLmZmX2lkKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vIGNoZWNrIGlmIHRoZSBwaXhlbCBmb3JtYXQgaXMgYXZhaWxhYmxlIGZvciB0aGlzIGRldmljZQorICAgIGlmIChbW2N0eC0+dmlkZW9fb3V0cHV0IGF2YWlsYWJsZVZpZGVvQ1ZQaXhlbEZvcm1hdFR5cGVzXSBpbmRleE9mT2JqZWN0OltOU051bWJlciBudW1iZXJXaXRoSW50OnB4bF9mbXRfc3BlYy5hdmZfaWRdXSA9PSBOU05vdEZvdW5kKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTZWxlY3RlZCBwaXhlbCBmb3JtYXQgKCVzKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBpbnB1dCBkZXZpY2UuXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShweGxfZm10X3NwZWMuZmZfaWQpKTsKKworICAgICAgICBweGxfZm10X3NwZWMuZmZfaWQgPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlN1cHBvcnRlZCBwaXhlbCBmb3JtYXRzOlxuIik7CisgICAgICAgIGZvciAoTlNOdW1iZXIgKnB4bF9mbXQgaW4gW2N0eC0+dmlkZW9fb3V0cHV0IGF2YWlsYWJsZVZpZGVvQ1ZQaXhlbEZvcm1hdFR5cGVzXSkgeworICAgICAgICAgICAgc3RydWN0IEFWRlBpeGVsRm9ybWF0U3BlYyBweGxfZm10X2R1bW15OworICAgICAgICAgICAgcHhsX2ZtdF9kdW1teS5mZl9pZCA9IEFWX1BJWF9GTVRfTk9ORTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBhdmZfcGl4ZWxfZm9ybWF0c1tpXS5mZl9pZCAhPSBBVl9QSVhfRk1UX05PTkU7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChbcHhsX2ZtdCBpbnRWYWx1ZV0gPT0gYXZmX3BpeGVsX2Zvcm1hdHNbaV0uYXZmX2lkKSB7CisgICAgICAgICAgICAgICAgICAgIHB4bF9mbXRfZHVtbXkgPSBhdmZfcGl4ZWxfZm9ybWF0c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocHhsX2ZtdF9kdW1teS5mZl9pZCAhPSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiICAlc1xuIiwgYXZfZ2V0X3BpeF9mbXRfbmFtZShweGxfZm10X2R1bW15LmZmX2lkKSk7CisKKyAgICAgICAgICAgICAgICAvLyBzZWxlY3QgZmlyc3Qgc3VwcG9ydGVkIHBpeGVsIGZvcm1hdCBpbnN0ZWFkIG9mIHVzZXIgc2VsZWN0ZWQgKG9yIGRlZmF1bHQpIHBpeGVsIGZvcm1hdAorICAgICAgICAgICAgICAgIGlmIChweGxfZm10X3NwZWMuZmZfaWQgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIHB4bF9mbXRfc3BlYyA9IHB4bF9mbXRfZHVtbXk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZmFpbCBpZiB0aGVyZSBpcyBubyBhcHByb3ByaWF0ZSBwaXhlbCBmb3JtYXQgb3IgcHJpbnQgYSB3YXJuaW5nIGFib3V0IG92ZXJyaWRpbmcgdGhlIHBpeGVsIGZvcm1hdAorICAgICAgICBpZiAocHhsX2ZtdF9zcGVjLmZmX2lkID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJPdmVycmlkaW5nIHNlbGVjdGVkIHBpeGVsIGZvcm1hdCB0byB1c2UgJXMgaW5zdGVhZC5cbiIsCisgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShweGxfZm10X3NwZWMuZmZfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN0eC0+cGl4ZWxfZm9ybWF0ICAgICAgICAgID0gcHhsX2ZtdF9zcGVjLmZmX2lkOworICAgIE5TTnVtYmVyICAgICAqcGl4ZWxfZm9ybWF0ID0gW05TTnVtYmVyIG51bWJlcldpdGhVbnNpZ25lZEludDpweGxfZm10X3NwZWMuYXZmX2lkXTsKKyAgICBOU0RpY3Rpb25hcnkgKmNhcHR1cmVfZGljdCA9IFtOU0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhPYmplY3Q6cGl4ZWxfZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooaWQpa0NWUGl4ZWxCdWZmZXJQaXhlbEZvcm1hdFR5cGVLZXldOworCisgICAgW2N0eC0+dmlkZW9fb3V0cHV0IHNldFZpZGVvU2V0dGluZ3M6Y2FwdHVyZV9kaWN0XTsKKyAgICBbY3R4LT52aWRlb19vdXRwdXQgc2V0QWx3YXlzRGlzY2FyZHNMYXRlVmlkZW9GcmFtZXM6WUVTXTsKKworICAgIGN0eC0+YXZmX2RlbGVnYXRlID0gW1tBVkZGcmFtZVJlY2VpdmVyIGFsbG9jXSBpbml0V2l0aENvbnRleHQ6Y3R4XTsKKworICAgIGRpc3BhdGNoX3F1ZXVlX3QgcXVldWUgPSBkaXNwYXRjaF9xdWV1ZV9jcmVhdGUoImF2Zl9xdWV1ZSIsIE5VTEwpOworICAgIFtjdHgtPnZpZGVvX291dHB1dCBzZXRTYW1wbGVCdWZmZXJEZWxlZ2F0ZTpjdHgtPmF2Zl9kZWxlZ2F0ZSBxdWV1ZTpxdWV1ZV07CisgICAgZGlzcGF0Y2hfcmVsZWFzZShxdWV1ZSk7CisKKyAgICBpZiAoW2N0eC0+Y2FwdHVyZV9zZXNzaW9uIGNhbkFkZE91dHB1dDpjdHgtPnZpZGVvX291dHB1dF0pIHsKKyAgICAgICAgW2N0eC0+Y2FwdHVyZV9zZXNzaW9uIGFkZE91dHB1dDpjdHgtPnZpZGVvX291dHB1dF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNhbid0IGFkZCB2aWRlbyBvdXRwdXQgdG8gY2FwdHVyZSBzZXNzaW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2F1ZGlvX2RldmljZShBVkZvcm1hdENvbnRleHQgKnMsIEFWQ2FwdHVyZURldmljZSAqYXVkaW9fZGV2aWNlKQoreworICAgIEFWRkNvbnRleHQgKmN0eCA9IChBVkZDb250ZXh0KilzLT5wcml2X2RhdGE7CisgICAgTlNFcnJvciAqZXJyb3IgID0gbmlsOworICAgIEFWQ2FwdHVyZURldmljZUlucHV0KiBhdWRpb19kZXZfaW5wdXQgPSBbW1tBVkNhcHR1cmVEZXZpY2VJbnB1dCBhbGxvY10gaW5pdFdpdGhEZXZpY2U6YXVkaW9fZGV2aWNlIGVycm9yOiZlcnJvcl0gYXV0b3JlbGVhc2VdOworCisgICAgaWYgKCFhdWRpb19kZXZfaW5wdXQpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgQVYgY2FwdHVyZSBpbnB1dCBkZXZpY2U6ICVzXG4iLAorICAgICAgICAgICAgICAgW1tlcnJvciBsb2NhbGl6ZWREZXNjcmlwdGlvbl0gVVRGOFN0cmluZ10pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoW2N0eC0+Y2FwdHVyZV9zZXNzaW9uIGNhbkFkZElucHV0OmF1ZGlvX2Rldl9pbnB1dF0pIHsKKyAgICAgICAgW2N0eC0+Y2FwdHVyZV9zZXNzaW9uIGFkZElucHV0OmF1ZGlvX2Rldl9pbnB1dF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNhbid0IGFkZCBhdWRpbyBpbnB1dCB0byBjYXB0dXJlIHNlc3Npb25cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBBdHRhY2hpbmcgb3V0cHV0CisgICAgY3R4LT5hdWRpb19vdXRwdXQgPSBbW0FWQ2FwdHVyZUF1ZGlvRGF0YU91dHB1dCBhbGxvY10gaW5pdF07CisKKyAgICBpZiAoIWN0eC0+YXVkaW9fb3V0cHV0KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gaW5pdCBBViBhdWRpbyBvdXRwdXRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBjdHgtPmF2Zl9hdWRpb19kZWxlZ2F0ZSA9IFtbQVZGQXVkaW9SZWNlaXZlciBhbGxvY10gaW5pdFdpdGhDb250ZXh0OmN0eF07CisKKyAgICBkaXNwYXRjaF9xdWV1ZV90IHF1ZXVlID0gZGlzcGF0Y2hfcXVldWVfY3JlYXRlKCJhdmZfYXVkaW9fcXVldWUiLCBOVUxMKTsKKyAgICBbY3R4LT5hdWRpb19vdXRwdXQgc2V0U2FtcGxlQnVmZmVyRGVsZWdhdGU6Y3R4LT5hdmZfYXVkaW9fZGVsZWdhdGUgcXVldWU6cXVldWVdOworICAgIGRpc3BhdGNoX3JlbGVhc2UocXVldWUpOworCisgICAgaWYgKFtjdHgtPmNhcHR1cmVfc2Vzc2lvbiBjYW5BZGRPdXRwdXQ6Y3R4LT5hdWRpb19vdXRwdXRdKSB7CisgICAgICAgIFtjdHgtPmNhcHR1cmVfc2Vzc2lvbiBhZGRPdXRwdXQ6Y3R4LT5hdWRpb19vdXRwdXRdOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJhZGRpbmcgYXVkaW8gb3V0cHV0IHRvIGNhcHR1cmUgc2Vzc2lvbiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfdmlkZW9fY29uZmlnKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVkZDb250ZXh0ICpjdHggPSAoQVZGQ29udGV4dCopcy0+cHJpdl9kYXRhOworCisgICAgLy8gVGFrZSBzdHJlYW0gaW5mbyBmcm9tIHRoZSBmaXJzdCBmcmFtZS4KKyAgICB3aGlsZSAoY3R4LT5mcmFtZXNfY2FwdHVyZWQgPCAxKSB7CisgICAgICAgIENGUnVuTG9vcFJ1bkluTW9kZShrQ0ZSdW5Mb29wRGVmYXVsdE1vZGUsIDAuMSwgWUVTKTsKKyAgICB9CisKKyAgICBsb2NrX2ZyYW1lcyhjdHgpOworCisgICAgQVZTdHJlYW0qIHN0cmVhbSA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisKKyAgICBpZiAoIXN0cmVhbSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBjdHgtPnZpZGVvX3N0cmVhbV9pbmRleCA9IHN0cmVhbS0+aW5kZXg7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0cmVhbSwgNjQsIDEsIGF2Zl90aW1lX2Jhc2UpOworCisgICAgQ1ZJbWFnZUJ1ZmZlclJlZiBpbWFnZV9idWZmZXIgPSBDTVNhbXBsZUJ1ZmZlckdldEltYWdlQnVmZmVyKGN0eC0+Y3VycmVudF9mcmFtZSk7CisgICAgQ0dTaXplIGltYWdlX2J1ZmZlcl9zaXplICAgICAgPSBDVkltYWdlQnVmZmVyR2V0RW5jb2RlZFNpemUoaW1hZ2VfYnVmZmVyKTsKKworICAgIHN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0cmVhbS0+Y29kZWMtPndpZHRoICAgICAgPSAoaW50KWltYWdlX2J1ZmZlcl9zaXplLndpZHRoOworICAgIHN0cmVhbS0+Y29kZWMtPmhlaWdodCAgICAgPSAoaW50KWltYWdlX2J1ZmZlcl9zaXplLmhlaWdodDsKKyAgICBzdHJlYW0tPmNvZGVjLT5waXhfZm10ICAgID0gY3R4LT5waXhlbF9mb3JtYXQ7CisKKyAgICBDRlJlbGVhc2UoY3R4LT5jdXJyZW50X2ZyYW1lKTsKKyAgICBjdHgtPmN1cnJlbnRfZnJhbWUgPSBuaWw7CisKKyAgICB1bmxvY2tfZnJhbWVzKGN0eCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfYXVkaW9fY29uZmlnKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVkZDb250ZXh0ICpjdHggPSAoQVZGQ29udGV4dCopcy0+cHJpdl9kYXRhOworCisgICAgLy8gVGFrZSBzdHJlYW0gaW5mbyBmcm9tIHRoZSBmaXJzdCBmcmFtZS4KKyAgICB3aGlsZSAoY3R4LT5hdWRpb19mcmFtZXNfY2FwdHVyZWQgPCAxKSB7CisgICAgICAgIENGUnVuTG9vcFJ1bkluTW9kZShrQ0ZSdW5Mb29wRGVmYXVsdE1vZGUsIDAuMSwgWUVTKTsKKyAgICB9CisKKyAgICBsb2NrX2ZyYW1lcyhjdHgpOworCisgICAgQVZTdHJlYW0qIHN0cmVhbSA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisKKyAgICBpZiAoIXN0cmVhbSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBjdHgtPmF1ZGlvX3N0cmVhbV9pbmRleCA9IHN0cmVhbS0+aW5kZXg7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0cmVhbSwgNjQsIDEsIGF2Zl90aW1lX2Jhc2UpOworCisgICAgQ01Gb3JtYXREZXNjcmlwdGlvblJlZiBmb3JtYXRfZGVzYyA9IENNU2FtcGxlQnVmZmVyR2V0Rm9ybWF0RGVzY3JpcHRpb24oY3R4LT5jdXJyZW50X2F1ZGlvX2ZyYW1lKTsKKyAgICBjb25zdCBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gKmJhc2ljX2Rlc2MgPSBDTUF1ZGlvRm9ybWF0RGVzY3JpcHRpb25HZXRTdHJlYW1CYXNpY0Rlc2NyaXB0aW9uKGZvcm1hdF9kZXNjKTsKKworICAgIGlmICghYmFzaWNfZGVzYykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiYXVkaW8gZm9ybWF0IG5vdCBhdmFpbGFibGVcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdHJlYW0tPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICA9IGJhc2ljX2Rlc2MtPm1TYW1wbGVSYXRlOworICAgIHN0cmVhbS0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gYmFzaWNfZGVzYy0+bUNoYW5uZWxzUGVyRnJhbWU7CisgICAgc3RyZWFtLT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChzdHJlYW0tPmNvZGVjLT5jaGFubmVscyk7CisKKyAgICBjdHgtPmF1ZGlvX2NoYW5uZWxzICAgICAgICA9IGJhc2ljX2Rlc2MtPm1DaGFubmVsc1BlckZyYW1lOworICAgIGN0eC0+YXVkaW9fYml0c19wZXJfc2FtcGxlID0gYmFzaWNfZGVzYy0+bUJpdHNQZXJDaGFubmVsOworICAgIGN0eC0+YXVkaW9fZmxvYXQgICAgICAgICAgID0gYmFzaWNfZGVzYy0+bUZvcm1hdEZsYWdzICYga0F1ZGlvRm9ybWF0RmxhZ0lzRmxvYXQ7CisgICAgY3R4LT5hdWRpb19iZSAgICAgICAgICAgICAgPSBiYXNpY19kZXNjLT5tRm9ybWF0RmxhZ3MgJiBrQXVkaW9Gb3JtYXRGbGFnSXNCaWdFbmRpYW47CisgICAgY3R4LT5hdWRpb19zaWduZWRfaW50ZWdlciAgPSBiYXNpY19kZXNjLT5tRm9ybWF0RmxhZ3MgJiBrQXVkaW9Gb3JtYXRGbGFnSXNTaWduZWRJbnRlZ2VyOworICAgIGN0eC0+YXVkaW9fcGFja2VkICAgICAgICAgID0gYmFzaWNfZGVzYy0+bUZvcm1hdEZsYWdzICYga0F1ZGlvRm9ybWF0RmxhZ0lzUGFja2VkOworICAgIGN0eC0+YXVkaW9fbm9uX2ludGVybGVhdmVkID0gYmFzaWNfZGVzYy0+bUZvcm1hdEZsYWdzICYga0F1ZGlvRm9ybWF0RmxhZ0lzTm9uSW50ZXJsZWF2ZWQ7CisKKyAgICBpZiAoYmFzaWNfZGVzYy0+bUZvcm1hdElEID09IGtBdWRpb0Zvcm1hdExpbmVhclBDTSAmJgorICAgICAgICBjdHgtPmF1ZGlvX2Zsb2F0ICYmCisgICAgICAgIGN0eC0+YXVkaW9fcGFja2VkKSB7CisgICAgICAgIHN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkID0gY3R4LT5hdWRpb19iZSA/IEFWX0NPREVDX0lEX1BDTV9GMzJCRSA6IEFWX0NPREVDX0lEX1BDTV9GMzJMRTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiYXVkaW8gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5hdWRpb19ub25faW50ZXJsZWF2ZWQpIHsKKyAgICAgICAgQ01CbG9ja0J1ZmZlclJlZiBibG9ja19idWZmZXIgPSBDTVNhbXBsZUJ1ZmZlckdldERhdGFCdWZmZXIoY3R4LT5jdXJyZW50X2F1ZGlvX2ZyYW1lKTsKKyAgICAgICAgY3R4LT5hdWRpb19idWZmZXJfc2l6ZSAgICAgICAgPSBDTUJsb2NrQnVmZmVyR2V0RGF0YUxlbmd0aChibG9ja19idWZmZXIpOworICAgICAgICBjdHgtPmF1ZGlvX2J1ZmZlciAgICAgICAgICAgICA9IGF2X21hbGxvYyhjdHgtPmF1ZGlvX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgaWYgKCFjdHgtPmF1ZGlvX2J1ZmZlcikgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImVycm9yIGFsbG9jYXRpbmcgYXVkaW8gYnVmZmVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgQ0ZSZWxlYXNlKGN0eC0+Y3VycmVudF9hdWRpb19mcmFtZSk7CisgICAgY3R4LT5jdXJyZW50X2F1ZGlvX2ZyYW1lID0gbmlsOworCisgICAgdW5sb2NrX2ZyYW1lcyhjdHgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXZmX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICAgIEFWRkNvbnRleHQgKmN0eCAgICAgICAgID0gKEFWRkNvbnRleHQqKXMtPnByaXZfZGF0YTsKKyAgICBjdHgtPmZpcnN0X3B0cyAgICAgICAgICA9IGF2X2dldHRpbWUoKTsKKyAgICBjdHgtPmZpcnN0X2F1ZGlvX3B0cyAgICA9IGF2X2dldHRpbWUoKTsKKyAgICB1aW50MzJfdCBudW1fc2NyZWVucyAgICA9IDA7CisKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmN0eC0+ZnJhbWVfbG9jaywgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX2luaXQoJmN0eC0+ZnJhbWVfd2FpdF9jb25kLCBOVUxMKTsKKworI2lmIF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPj0gMTA3MAorICAgIENHR2V0QWN0aXZlRGlzcGxheUxpc3QoMCwgTlVMTCwgJm51bV9zY3JlZW5zKTsKKyNlbmRpZgorCisgICAgLy8gTGlzdCBkZXZpY2VzIGlmIHJlcXVlc3RlZAorICAgIGlmIChjdHgtPmxpc3RfZGV2aWNlcykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkFWRm91bmRhdGlvbiB2aWRlbyBkZXZpY2VzOlxuIik7CisgICAgICAgIE5TQXJyYXkgKmRldmljZXMgPSBbQVZDYXB0dXJlRGV2aWNlIGRldmljZXNXaXRoTWVkaWFUeXBlOkFWTWVkaWFUeXBlVmlkZW9dOworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBmb3IgKEFWQ2FwdHVyZURldmljZSAqZGV2aWNlIGluIGRldmljZXMpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBbW2RldmljZSBsb2NhbGl6ZWROYW1lXSBVVEY4U3RyaW5nXTsKKyAgICAgICAgICAgIGluZGV4ICAgICAgICAgICAgPSBbZGV2aWNlcyBpbmRleE9mT2JqZWN0OmRldmljZV07CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlslZF0gJXNcbiIsIGluZGV4LCBuYW1lKTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyNpZiBfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEID49IDEwNzAKKyAgICAgICAgaWYgKG51bV9zY3JlZW5zID4gMCkgeworICAgICAgICAgICAgQ0dEaXJlY3REaXNwbGF5SUQgc2NyZWVuc1tudW1fc2NyZWVuc107CisgICAgICAgICAgICBDR0dldEFjdGl2ZURpc3BsYXlMaXN0KG51bV9zY3JlZW5zLCBzY3JlZW5zLCAmbnVtX3NjcmVlbnMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fc2NyZWVuczsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJbJWRdIENhcHR1cmUgc2NyZWVuICVkXG4iLCBpbmRleCArIGksIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkFWRm91bmRhdGlvbiBhdWRpbyBkZXZpY2VzOlxuIik7CisgICAgICAgIGRldmljZXMgPSBbQVZDYXB0dXJlRGV2aWNlIGRldmljZXNXaXRoTWVkaWFUeXBlOkFWTWVkaWFUeXBlQXVkaW9dOworICAgICAgICBmb3IgKEFWQ2FwdHVyZURldmljZSAqZGV2aWNlIGluIGRldmljZXMpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBbW2RldmljZSBsb2NhbGl6ZWROYW1lXSBVVEY4U3RyaW5nXTsKKyAgICAgICAgICAgIGludCBpbmRleCAgPSBbZGV2aWNlcyBpbmRleE9mT2JqZWN0OmRldmljZV07CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlslZF0gJXNcbiIsIGluZGV4LCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8vIEZpbmQgY2FwdHVyZSBkZXZpY2UKKyAgICBBVkNhcHR1cmVEZXZpY2UgKnZpZGVvX2RldmljZSA9IG5pbDsKKyAgICBBVkNhcHR1cmVEZXZpY2UgKmF1ZGlvX2RldmljZSA9IG5pbDsKKworICAgIE5TQXJyYXkgKnZpZGVvX2RldmljZXMgPSBbQVZDYXB0dXJlRGV2aWNlIGRldmljZXNXaXRoTWVkaWFUeXBlOkFWTWVkaWFUeXBlVmlkZW9dOworICAgIGN0eC0+bnVtX3ZpZGVvX2RldmljZXMgPSBbdmlkZW9fZGV2aWNlcyBjb3VudF07CisKKyAgICAvLyBwYXJzZSBpbnB1dCBmaWxlbmFtZSBmb3IgdmlkZW8gYW5kIGF1ZGlvIGRldmljZQorICAgIHBhcnNlX2RldmljZV9uYW1lKHMpOworCisgICAgLy8gY2hlY2sgZm9yIGRldmljZSBpbmRleCBnaXZlbiBpbiBmaWxlbmFtZQorICAgIGlmIChjdHgtPnZpZGVvX2RldmljZV9pbmRleCA9PSAtMSAmJiBjdHgtPnZpZGVvX2ZpbGVuYW1lKSB7CisgICAgICAgIHNzY2FuZihjdHgtPnZpZGVvX2ZpbGVuYW1lLCAiJWQiLCAmY3R4LT52aWRlb19kZXZpY2VfaW5kZXgpOworICAgIH0KKyAgICBpZiAoY3R4LT5hdWRpb19kZXZpY2VfaW5kZXggPT0gLTEgJiYgY3R4LT5hdWRpb19maWxlbmFtZSkgeworICAgICAgICBzc2NhbmYoY3R4LT5hdWRpb19maWxlbmFtZSwgIiVkIiwgJmN0eC0+YXVkaW9fZGV2aWNlX2luZGV4KTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT52aWRlb19kZXZpY2VfaW5kZXggPj0gMCkgeworICAgICAgICBpZiAoY3R4LT52aWRlb19kZXZpY2VfaW5kZXggPCBjdHgtPm51bV92aWRlb19kZXZpY2VzKSB7CisgICAgICAgICAgICB2aWRlb19kZXZpY2UgPSBbdmlkZW9fZGV2aWNlcyBvYmplY3RBdEluZGV4OmN0eC0+dmlkZW9fZGV2aWNlX2luZGV4XTsKKyAgICAgICAgfSBlbHNlIGlmIChjdHgtPnZpZGVvX2RldmljZV9pbmRleCA8IGN0eC0+bnVtX3ZpZGVvX2RldmljZXMgKyBudW1fc2NyZWVucykgeworI2lmIF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPj0gMTA3MAorICAgICAgICAgICAgQ0dEaXJlY3REaXNwbGF5SUQgc2NyZWVuc1tudW1fc2NyZWVuc107CisgICAgICAgICAgICBDR0dldEFjdGl2ZURpc3BsYXlMaXN0KG51bV9zY3JlZW5zLCBzY3JlZW5zLCAmbnVtX3NjcmVlbnMpOworICAgICAgICAgICAgQVZDYXB0dXJlU2NyZWVuSW5wdXQqIGNhcHR1cmVfc2NyZWVuX2lucHV0ID0gW1tbQVZDYXB0dXJlU2NyZWVuSW5wdXQgYWxsb2NdIGluaXRXaXRoRGlzcGxheUlEOnNjcmVlbnNbY3R4LT52aWRlb19kZXZpY2VfaW5kZXggLSBjdHgtPm51bV92aWRlb19kZXZpY2VzXV0gYXV0b3JlbGVhc2VdOworICAgICAgICAgICAgdmlkZW9fZGV2aWNlID0gKEFWQ2FwdHVyZURldmljZSopIGNhcHR1cmVfc2NyZWVuX2lucHV0OworI2VuZGlmCisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBkZXZpY2UgaW5kZXhcbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjdHgtPnZpZGVvX2ZpbGVuYW1lICYmCisgICAgICAgICAgICAgICBzdHJuY21wKGN0eC0+dmlkZW9fZmlsZW5hbWUsICJub25lIiwgNCkpIHsKKyAgICAgICAgaWYgKCFzdHJuY21wKGN0eC0+dmlkZW9fZmlsZW5hbWUsICJkZWZhdWx0IiwgNykpIHsKKyAgICAgICAgICAgIHZpZGVvX2RldmljZSA9IFtBVkNhcHR1cmVEZXZpY2UgZGVmYXVsdERldmljZVdpdGhNZWRpYVR5cGU6QVZNZWRpYVR5cGVWaWRlb107CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGxvb2tpbmcgZm9yIHZpZGVvIGlucHV0cworICAgICAgICBmb3IgKEFWQ2FwdHVyZURldmljZSAqZGV2aWNlIGluIHZpZGVvX2RldmljZXMpIHsKKyAgICAgICAgICAgIGlmICghc3RybmNtcChjdHgtPnZpZGVvX2ZpbGVuYW1lLCBbW2RldmljZSBsb2NhbGl6ZWROYW1lXSBVVEY4U3RyaW5nXSwgc3RybGVuKGN0eC0+dmlkZW9fZmlsZW5hbWUpKSkgeworICAgICAgICAgICAgICAgIHZpZGVvX2RldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgX19NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA+PSAxMDcwCisgICAgICAgIC8vIGxvb2tpbmcgZm9yIHNjcmVlbiBpbnB1dHMKKyAgICAgICAgaWYgKCF2aWRlb19kZXZpY2UpIHsKKyAgICAgICAgICAgIGludCBpZHg7CisgICAgICAgICAgICBpZihzc2NhbmYoY3R4LT52aWRlb19maWxlbmFtZSwgIkNhcHR1cmUgc2NyZWVuICVkIiwgJmlkeCkgJiYgaWR4IDwgbnVtX3NjcmVlbnMpIHsKKyAgICAgICAgICAgICAgICBDR0RpcmVjdERpc3BsYXlJRCBzY3JlZW5zW251bV9zY3JlZW5zXTsKKyAgICAgICAgICAgICAgICBDR0dldEFjdGl2ZURpc3BsYXlMaXN0KG51bV9zY3JlZW5zLCBzY3JlZW5zLCAmbnVtX3NjcmVlbnMpOworICAgICAgICAgICAgICAgIEFWQ2FwdHVyZVNjcmVlbklucHV0KiBjYXB0dXJlX3NjcmVlbl9pbnB1dCA9IFtbW0FWQ2FwdHVyZVNjcmVlbklucHV0IGFsbG9jXSBpbml0V2l0aERpc3BsYXlJRDpzY3JlZW5zW2lkeF1dIGF1dG9yZWxlYXNlXTsKKyAgICAgICAgICAgICAgICB2aWRlb19kZXZpY2UgPSAoQVZDYXB0dXJlRGV2aWNlKikgY2FwdHVyZV9zY3JlZW5faW5wdXQ7CisgICAgICAgICAgICAgICAgY3R4LT52aWRlb19kZXZpY2VfaW5kZXggPSBjdHgtPm51bV92aWRlb19kZXZpY2VzICsgaWR4OworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmlkZW9fZGV2aWNlKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJWaWRlbyBkZXZpY2Ugbm90IGZvdW5kXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGdldCBhdWRpbyBkZXZpY2UKKyAgICBpZiAoY3R4LT5hdWRpb19kZXZpY2VfaW5kZXggPj0gMCkgeworICAgICAgICBOU0FycmF5ICpkZXZpY2VzID0gW0FWQ2FwdHVyZURldmljZSBkZXZpY2VzV2l0aE1lZGlhVHlwZTpBVk1lZGlhVHlwZUF1ZGlvXTsKKworICAgICAgICBpZiAoY3R4LT5hdWRpb19kZXZpY2VfaW5kZXggPj0gW2RldmljZXMgY291bnRdKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGF1ZGlvIGRldmljZSBpbmRleFxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBhdWRpb19kZXZpY2UgPSBbZGV2aWNlcyBvYmplY3RBdEluZGV4OmN0eC0+YXVkaW9fZGV2aWNlX2luZGV4XTsKKyAgICB9IGVsc2UgaWYgKGN0eC0+YXVkaW9fZmlsZW5hbWUgJiYKKyAgICAgICAgICAgICAgIHN0cm5jbXAoY3R4LT5hdWRpb19maWxlbmFtZSwgIm5vbmUiLCA0KSkgeworICAgICAgICBpZiAoIXN0cm5jbXAoY3R4LT5hdWRpb19maWxlbmFtZSwgImRlZmF1bHQiLCA3KSkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlID0gW0FWQ2FwdHVyZURldmljZSBkZWZhdWx0RGV2aWNlV2l0aE1lZGlhVHlwZTpBVk1lZGlhVHlwZUF1ZGlvXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgTlNBcnJheSAqZGV2aWNlcyA9IFtBVkNhcHR1cmVEZXZpY2UgZGV2aWNlc1dpdGhNZWRpYVR5cGU6QVZNZWRpYVR5cGVBdWRpb107CisKKyAgICAgICAgZm9yIChBVkNhcHR1cmVEZXZpY2UgKmRldmljZSBpbiBkZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoIXN0cm5jbXAoY3R4LT5hdWRpb19maWxlbmFtZSwgW1tkZXZpY2UgbG9jYWxpemVkTmFtZV0gVVRGOFN0cmluZ10sIHN0cmxlbihjdHgtPmF1ZGlvX2ZpbGVuYW1lKSkpIHsKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2UgPSBkZXZpY2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghYXVkaW9fZGV2aWNlKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJBdWRpbyBkZXZpY2Ugbm90IGZvdW5kXG4iKTsKKyAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWaWRlbyBub3IgQXVkaW8gY2FwdHVyZSBkZXZpY2Ugbm90IGZvdW5kLCBsb29raW5nIGZvciBBVk1lZGlhVHlwZVZpZGVvL0F1ZGlvCisgICAgaWYgKCF2aWRlb19kZXZpY2UgJiYgIWF1ZGlvX2RldmljZSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm8gQVYgY2FwdHVyZSBkZXZpY2UgZm91bmRcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHZpZGVvX2RldmljZSkgeworICAgICAgICBpZiAoY3R4LT52aWRlb19kZXZpY2VfaW5kZXggPCBjdHgtPm51bV92aWRlb19kZXZpY2VzKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiJyVzJyBvcGVuZWRcbiIsIFtbdmlkZW9fZGV2aWNlIGxvY2FsaXplZE5hbWVdIFVURjhTdHJpbmddKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICInJXMnIG9wZW5lZFxuIiwgW1t2aWRlb19kZXZpY2UgZGVzY3JpcHRpb25dIFVURjhTdHJpbmddKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYXVkaW9fZGV2aWNlKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJhdWRpbyBkZXZpY2UgJyVzJyBvcGVuZWRcbiIsIFtbYXVkaW9fZGV2aWNlIGxvY2FsaXplZE5hbWVdIFVURjhTdHJpbmddKTsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGNhcHR1cmUgc2Vzc2lvbgorICAgIGN0eC0+Y2FwdHVyZV9zZXNzaW9uID0gW1tBVkNhcHR1cmVTZXNzaW9uIGFsbG9jXSBpbml0XTsKKworICAgIGlmICh2aWRlb19kZXZpY2UgJiYgYWRkX3ZpZGVvX2RldmljZShzLCB2aWRlb19kZXZpY2UpKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGF1ZGlvX2RldmljZSAmJiBhZGRfYXVkaW9fZGV2aWNlKHMsIGF1ZGlvX2RldmljZSkpIHsKKyAgICB9CisKKyAgICBbY3R4LT5jYXB0dXJlX3Nlc3Npb24gc3RhcnRSdW5uaW5nXTsKKworICAgIGlmICh2aWRlb19kZXZpY2UgJiYgZ2V0X3ZpZGVvX2NvbmZpZyhzKSkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLy8gc2V0IGF1ZGlvIHN0cmVhbQorICAgIGlmIChhdWRpb19kZXZpY2UgJiYgZ2V0X2F1ZGlvX2NvbmZpZyhzKSkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgW3Bvb2wgcmVsZWFzZV07CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgW3Bvb2wgcmVsZWFzZV07CisgICAgZGVzdHJveV9jb250ZXh0KGN0eCk7CisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworc3RhdGljIGludCBhdmZfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWRkNvbnRleHQqIGN0eCA9IChBVkZDb250ZXh0KilzLT5wcml2X2RhdGE7CisKKyAgICBkbyB7CisgICAgICAgIGxvY2tfZnJhbWVzKGN0eCk7CisKKyAgICAgICAgQ1ZJbWFnZUJ1ZmZlclJlZiBpbWFnZV9idWZmZXIgPSBDTVNhbXBsZUJ1ZmZlckdldEltYWdlQnVmZmVyKGN0eC0+Y3VycmVudF9mcmFtZSk7CisKKyAgICAgICAgaWYgKGN0eC0+Y3VycmVudF9mcmFtZSAhPSBuaWwpIHsKKyAgICAgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgKGludClDVlBpeGVsQnVmZmVyR2V0RGF0YVNpemUoaW1hZ2VfYnVmZmVyKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGt0LT5wdHMgPSBwa3QtPmR0cyA9IGF2X3Jlc2NhbGVfcShhdl9nZXR0aW1lKCkgLSBjdHgtPmZpcnN0X3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Zl90aW1lX2Jhc2VfcSk7CisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCAgPSBjdHgtPnZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICAgICAgICAgIHBrdC0+ZmxhZ3MgICAgICAgIHw9IEFWX1BLVF9GTEFHX0tFWTsKKworICAgICAgICAgICAgQ1ZQaXhlbEJ1ZmZlckxvY2tCYXNlQWRkcmVzcyhpbWFnZV9idWZmZXIsIDApOworCisgICAgICAgICAgICB2b2lkKiBkYXRhID0gQ1ZQaXhlbEJ1ZmZlckdldEJhc2VBZGRyZXNzKGltYWdlX2J1ZmZlcik7CisgICAgICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBkYXRhLCBwa3QtPnNpemUpOworCisgICAgICAgICAgICBDVlBpeGVsQnVmZmVyVW5sb2NrQmFzZUFkZHJlc3MoaW1hZ2VfYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIENGUmVsZWFzZShjdHgtPmN1cnJlbnRfZnJhbWUpOworICAgICAgICAgICAgY3R4LT5jdXJyZW50X2ZyYW1lID0gbmlsOworICAgICAgICB9IGVsc2UgaWYgKGN0eC0+Y3VycmVudF9hdWRpb19mcmFtZSAhPSBuaWwpIHsKKyAgICAgICAgICAgIENNQmxvY2tCdWZmZXJSZWYgYmxvY2tfYnVmZmVyID0gQ01TYW1wbGVCdWZmZXJHZXREYXRhQnVmZmVyKGN0eC0+Y3VycmVudF9hdWRpb19mcmFtZSk7CisgICAgICAgICAgICBpbnQgYmxvY2tfYnVmZmVyX3NpemUgICAgICAgICA9IENNQmxvY2tCdWZmZXJHZXREYXRhTGVuZ3RoKGJsb2NrX2J1ZmZlcik7CisKKyAgICAgICAgICAgIGlmICghYmxvY2tfYnVmZmVyIHx8ICFibG9ja19idWZmZXJfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjdHgtPmF1ZGlvX25vbl9pbnRlcmxlYXZlZCAmJiBibG9ja19idWZmZXJfc2l6ZSA+IGN0eC0+YXVkaW9fYnVmZmVyX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIGJsb2NrX2J1ZmZlcl9zaXplKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwa3QtPnB0cyA9IHBrdC0+ZHRzID0gYXZfcmVzY2FsZV9xKGF2X2dldHRpbWUoKSAtIGN0eC0+Zmlyc3RfYXVkaW9fcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZmX3RpbWVfYmFzZV9xKTsKKworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggID0gY3R4LT5hdWRpb19zdHJlYW1faW5kZXg7CisgICAgICAgICAgICBwa3QtPmZsYWdzICAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICAgICAgICAgIGlmIChjdHgtPmF1ZGlvX25vbl9pbnRlcmxlYXZlZCkgeworICAgICAgICAgICAgICAgIGludCBzYW1wbGUsIGMsIHNoaWZ0OworCisgICAgICAgICAgICAgICAgT1NTdGF0dXMgcmV0ID0gQ01CbG9ja0J1ZmZlckNvcHlEYXRhQnl0ZXMoYmxvY2tfYnVmZmVyLCAwLCBwa3QtPnNpemUsIGN0eC0+YXVkaW9fYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IGtDTUJsb2NrQnVmZmVyTm9FcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgbnVtX3NhbXBsZXMgPSBwa3QtPnNpemUgLyAoY3R4LT5hdWRpb19jaGFubmVscyAqIChjdHgtPmF1ZGlvX2JpdHNfcGVyX3NhbXBsZSA+PiAzKSk7CisKKyAgICAgICAgICAgICAgICAvLyB0cmFuc2Zvcm0gZGVjb2RlZCBmcmFtZSBpbnRvIG91dHB1dCBmb3JtYXQKKyAgICAgICAgICAgICAgICAjZGVmaW5lIElOVEVSTEVBVkVfT1VUUFVUKGJwcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaW50IyNicHMjI190ICoqc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaW50IyNicHMjI190ICpkZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgc3JjID0gYXZfbWFsbG9jKGN0eC0+YXVkaW9fY2hhbm5lbHMgKiBzaXplb2YoaW50IyNicHMjI190KikpOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzcmMpIHJldHVybiBBVkVSUk9SKEVJTyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGN0eC0+YXVkaW9fY2hhbm5lbHM7IGMrKykgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tjXSA9ICgoaW50IyNicHMjI190KiljdHgtPmF1ZGlvX2J1ZmZlcikgKyBjICogbnVtX3NhbXBsZXM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZGVzdCAgPSAoaW50IyNicHMjI190Kilwa3QtPmRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSBicHMgLSBjdHgtPmF1ZGlvX2JpdHNfcGVyX3NhbXBsZTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBudW1fc2FtcGxlczsgc2FtcGxlKyspICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjdHgtPmF1ZGlvX2NoYW5uZWxzOyBjKyspICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gc3JjW2NdW3NhbXBsZV0gPDwgc2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY3R4LT5hdWRpb19iaXRzX3Blcl9zYW1wbGUgPD0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgSU5URVJMRUFWRV9PVVRQVVQoMTYpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSU5URVJMRUFWRV9PVVRQVVQoMzIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBPU1N0YXR1cyByZXQgPSBDTUJsb2NrQnVmZmVyQ29weURhdGFCeXRlcyhibG9ja19idWZmZXIsIDAsIHBrdC0+c2l6ZSwgcGt0LT5kYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IGtDTUJsb2NrQnVmZmVyTm9FcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENGUmVsZWFzZShjdHgtPmN1cnJlbnRfYXVkaW9fZnJhbWUpOworICAgICAgICAgICAgY3R4LT5jdXJyZW50X2F1ZGlvX2ZyYW1lID0gbmlsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGt0LT5kYXRhID0gTlVMTDsKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZjdHgtPmZyYW1lX3dhaXRfY29uZCwgJmN0eC0+ZnJhbWVfbG9jayk7CisgICAgICAgIH0KKworICAgICAgICB1bmxvY2tfZnJhbWVzKGN0eCk7CisgICAgfSB3aGlsZSAoIXBrdC0+ZGF0YSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdmZfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWRkNvbnRleHQqIGN0eCA9IChBVkZDb250ZXh0KilzLT5wcml2X2RhdGE7CisgICAgZGVzdHJveV9jb250ZXh0KGN0eCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAibGlzdF9kZXZpY2VzIiwgImxpc3QgYXZhaWxhYmxlIGRldmljZXMiLCBvZmZzZXRvZihBVkZDb250ZXh0LCBsaXN0X2RldmljZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgImxpc3RfZGV2aWNlcyIgfSwKKyAgICB7ICJ0cnVlIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJsaXN0X2RldmljZXMiIH0sCisgICAgeyAiZmFsc2UiLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTB9LCAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgImxpc3RfZGV2aWNlcyIgfSwKKyAgICB7ICJ2aWRlb19kZXZpY2VfaW5kZXgiLCAic2VsZWN0IHZpZGVvIGRldmljZSBieSBpbmRleCBmb3IgZGV2aWNlcyB3aXRoIHNhbWUgbmFtZSAoc3RhcnRzIGF0IDApIiwgb2Zmc2V0b2YoQVZGQ29udGV4dCwgdmlkZW9fZGV2aWNlX2luZGV4KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiYXVkaW9fZGV2aWNlX2luZGV4IiwgInNlbGVjdCBhdWRpbyBkZXZpY2UgYnkgaW5kZXggZm9yIGRldmljZXMgd2l0aCBzYW1lIG5hbWUgKHN0YXJ0cyBhdCAwKSIsIG9mZnNldG9mKEFWRkNvbnRleHQsIGF1ZGlvX2RldmljZV9pbmRleCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgInBpeGVsX2Zvcm1hdCIsICJzZXQgcGl4ZWwgZm9ybWF0Iiwgb2Zmc2V0b2YoQVZGQ29udGV4dCwgcGl4ZWxfZm9ybWF0KSwgQVZfT1BUX1RZUEVfUElYRUxfRk1ULCB7Lmk2NCA9IEFWX1BJWF9GTVRfWVVWNDIwUH0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGF2Zl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJBVkZvdW5kYXRpb24gaW5wdXQgZGV2aWNlIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19JTlBVVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfYXZmb3VuZGF0aW9uX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImF2Zm91bmRhdGlvbiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFWRm91bmRhdGlvbiBpbnB1dCBkZXZpY2UiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVZGQ29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgID0gYXZmX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGF2Zl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBhdmZfY2xvc2UsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZhdmZfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2JrdHIuYyBiL2ZmbXBlZy9saWJhdmRldmljZS9ia3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1YTgzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9ia3RyLmMKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKiAqQlNEIHZpZGVvIGdyYWIgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgU3RldmUgTydIYXJhLVNtaXRoCisgKiBiYXNlZCBvbgorICogICAgICAgICAgIExpbnV4IHZpZGVvIGdyYWIgaW50ZXJmYWNlCisgKiAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogYW5kCisgKiAgICAgICAgICAgc2ltcGxlX2dyYWIuYyBDb3B5cmlnaHQgKGMpIDE5OTkgUm9nZXIgSGFyZGltYW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaWYgSEFWRV9ERVZfQktUUl9JT0NUTF9NRVRFT1JfSCAmJiBIQVZFX0RFVl9CS1RSX0lPQ1RMX0JUODQ4X0gKKyMgaW5jbHVkZSA8ZGV2L2JrdHIvaW9jdGxfbWV0ZW9yLmg+CisjIGluY2x1ZGUgPGRldi9ia3RyL2lvY3RsX2J0ODQ4Lmg+CisjZWxpZiBIQVZFX01BQ0hJTkVfSU9DVExfTUVURU9SX0ggJiYgSEFWRV9NQUNISU5FX0lPQ1RMX0JUODQ4X0gKKyMgaW5jbHVkZSA8bWFjaGluZS9pb2N0bF9tZXRlb3IuaD4KKyMgaW5jbHVkZSA8bWFjaGluZS9pb2N0bF9idDg0OC5oPgorI2VsaWYgSEFWRV9ERVZfVklERU9fTUVURU9SX0lPQ1RMX01FVEVPUl9IICYmIEhBVkVfREVWX1ZJREVPX0JLVFJfSU9DVExfQlQ4NDhfSAorIyBpbmNsdWRlIDxkZXYvdmlkZW8vbWV0ZW9yL2lvY3RsX21ldGVvci5oPgorIyBpbmNsdWRlIDxkZXYvdmlkZW8vYmt0ci9pb2N0bF9idDg0OC5oPgorI2VsaWYgSEFWRV9ERVZfSUNfQlQ4WFhfSAorIyBpbmNsdWRlIDxkZXYvaWMvYnQ4eHguaD4KKyNlbmRpZgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKK3R5cGVkZWYgc3RydWN0IFZpZGVvRGF0YSB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHZpZGVvX2ZkOworICAgIGludCB0dW5lcl9mZDsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICB1aW50NjRfdCBwZXJfZnJhbWU7CisgICAgaW50IHN0YW5kYXJkOworICAgIGNoYXIgKmZyYW1lcmF0ZTsgIC8qKjwgU2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uICovCit9IFZpZGVvRGF0YTsKKworCisjZGVmaW5lIFBBTCAxCisjZGVmaW5lIFBBTEJER0hJIDEKKyNkZWZpbmUgTlRTQyAyCisjZGVmaW5lIE5UU0NNIDIKKyNkZWZpbmUgU0VDQU0gMworI2RlZmluZSBQQUxOIDQKKyNkZWZpbmUgUEFMTSA1CisjZGVmaW5lIE5UU0NKIDYKKworLyogUEFMIGlzIDc2OCB4IDU3Ni4gTlRTQyBpcyA2NDAgeCA0ODAgKi8KKyNkZWZpbmUgUEFMX0hFSUdIVCA1NzYKKyNkZWZpbmUgU0VDQU1fSEVJR0hUIDU3NgorI2RlZmluZSBOVFNDX0hFSUdIVCA0ODAKKworI2lmbmRlZiBWSURFT19GT1JNQVQKKyNkZWZpbmUgVklERU9fRk9STUFUIE5UU0MKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgaW50IGJrdHJfZGV2W10gPSB7IE1FVEVPUl9ERVYwLCBNRVRFT1JfREVWMSwgTUVURU9SX0RFVjIsCisgICAgTUVURU9SX0RFVjMsIE1FVEVPUl9ERVZfU1ZJREVPIH07CisKK3VpbnQ4X3QgKnZpZGVvX2J1ZjsKK3NpemVfdCB2aWRlb19idWZfc2l6ZTsKK3VpbnQ2NF90IGxhc3RfZnJhbWVfdGltZTsKK3ZvbGF0aWxlIHNpZ19hdG9taWNfdCBuc2lnbmFsczsKKworCitzdGF0aWMgdm9pZCBjYXRjaHNpZ25hbChpbnQgc2lnbmFsKQoreworICAgIG5zaWduYWxzKys7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYmt0cl9pbml0KGNvbnN0IGNoYXIgKnZpZGVvX2RldmljZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgIGludCBmb3JtYXQsIGludCAqdmlkZW9fZmQsIGludCAqdHVuZXJfZmQsIGludCBpZGV2LCBkb3VibGUgZnJlcXVlbmN5KQoreworICAgIHN0cnVjdCBtZXRlb3JfZ2VvbWV0IGdlbzsKKyAgICBpbnQgaF9tYXg7CisgICAgbG9uZyBpb2N0bF9mcmVxdWVuY3k7CisgICAgY2hhciAqYXJnOworICAgIGludCBjOworICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0ID0geyB7MH0gfSwgb2xkOworCisgICAgaWYgKGlkZXYgPCAwIHx8IGlkZXYgPiA0KQorICAgIHsKKyAgICAgICAgYXJnID0gZ2V0ZW52ICgiQktUUl9ERVYiKTsKKyAgICAgICAgaWYgKGFyZykKKyAgICAgICAgICAgIGlkZXYgPSBhdG9pIChhcmcpOworICAgICAgICBpZiAoaWRldiA8IDAgfHwgaWRldiA+IDQpCisgICAgICAgICAgICBpZGV2ID0gMTsKKyAgICB9CisKKyAgICBpZiAoZm9ybWF0IDwgMSB8fCBmb3JtYXQgPiA2KQorICAgIHsKKyAgICAgICAgYXJnID0gZ2V0ZW52ICgiQktUUl9GT1JNQVQiKTsKKyAgICAgICAgaWYgKGFyZykKKyAgICAgICAgICAgIGZvcm1hdCA9IGF0b2kgKGFyZyk7CisgICAgICAgIGlmIChmb3JtYXQgPCAxIHx8IGZvcm1hdCA+IDYpCisgICAgICAgICAgICBmb3JtYXQgPSBWSURFT19GT1JNQVQ7CisgICAgfQorCisgICAgaWYgKGZyZXF1ZW5jeSA8PSAwKQorICAgIHsKKyAgICAgICAgYXJnID0gZ2V0ZW52ICgiQktUUl9GUkVRVUVOQ1kiKTsKKyAgICAgICAgaWYgKGFyZykKKyAgICAgICAgICAgIGZyZXF1ZW5jeSA9IGF0b2YgKGFyZyk7CisgICAgICAgIGlmIChmcmVxdWVuY3kgPD0gMCkKKyAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDAuMDsKKyAgICB9CisKKyAgICBzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOworICAgIGFjdC5zYV9oYW5kbGVyID0gY2F0Y2hzaWduYWw7CisgICAgc2lnYWN0aW9uKFNJR1VTUjEsICZhY3QsICZvbGQpOworCisgICAgKnR1bmVyX2ZkID0gYXZwcml2X29wZW4oIi9kZXYvdHVuZXIwIiwgT19SRE9OTFkpOworICAgIGlmICgqdHVuZXJfZmQgPCAwKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiV2FybmluZy4gVHVuZXIgbm90IG9wZW5lZCwgY29udGludWluZzogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKyAgICAqdmlkZW9fZmQgPSBhdnByaXZfb3Blbih2aWRlb19kZXZpY2UsIE9fUkRPTkxZKTsKKyAgICBpZiAoKnZpZGVvX2ZkIDwgMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJXM6ICVzXG4iLCB2aWRlb19kZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBnZW8ucm93cyA9IGhlaWdodDsKKyAgICBnZW8uY29sdW1ucyA9IHdpZHRoOworICAgIGdlby5mcmFtZXMgPSAxOworICAgIGdlby5vZm9ybWF0ID0gTUVURU9SX0dFT19ZVVZfNDIyIHwgTUVURU9SX0dFT19ZVVZfMTI7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgUEFMOiAgIGhfbWF4ID0gUEFMX0hFSUdIVDsgICBjID0gQlQ4NDhfSUZPUk1fRl9QQUxCREdISTsgYnJlYWs7CisgICAgY2FzZSBQQUxOOiAgaF9tYXggPSBQQUxfSEVJR0hUOyAgIGMgPSBCVDg0OF9JRk9STV9GX1BBTE47ICAgICBicmVhazsKKyAgICBjYXNlIFBBTE06ICBoX21heCA9IFBBTF9IRUlHSFQ7ICAgYyA9IEJUODQ4X0lGT1JNX0ZfUEFMTTsgICAgIGJyZWFrOworICAgIGNhc2UgU0VDQU06IGhfbWF4ID0gU0VDQU1fSEVJR0hUOyBjID0gQlQ4NDhfSUZPUk1fRl9TRUNBTTsgICAgYnJlYWs7CisgICAgY2FzZSBOVFNDOiAgaF9tYXggPSBOVFNDX0hFSUdIVDsgIGMgPSBCVDg0OF9JRk9STV9GX05UU0NNOyAgICBicmVhazsKKyAgICBjYXNlIE5UU0NKOiBoX21heCA9IE5UU0NfSEVJR0hUOyAgYyA9IEJUODQ4X0lGT1JNX0ZfTlRTQ0o7ICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgIGhfbWF4ID0gUEFMX0hFSUdIVDsgICBjID0gQlQ4NDhfSUZPUk1fRl9QQUxCREdISTsgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGhlaWdodCA8PSBoX21heCAvIDIpCisgICAgICAgIGdlby5vZm9ybWF0IHw9IE1FVEVPUl9HRU9fRVZFTl9PTkxZOworCisgICAgaWYgKGlvY3RsKCp2aWRlb19mZCwgTUVURU9SU0VUR0VPLCAmZ2VvKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk1FVEVPUlNFVEdFTzogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoaW9jdGwoKnZpZGVvX2ZkLCBCVDg0OFNGTVQsICZjKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkJUODQ4U0ZNVDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjID0gYmt0cl9kZXZbaWRldl07CisgICAgaWYgKGlvY3RsKCp2aWRlb19mZCwgTUVURU9SU0lOUFVULCAmYykgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJNRVRFT1JTSU5QVVQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdmlkZW9fYnVmX3NpemUgPSB3aWR0aCAqIGhlaWdodCAqIDEyIC8gODsKKworICAgIHZpZGVvX2J1ZiA9ICh1aW50OF90ICopbW1hcCgoY2FkZHJfdCkwLCB2aWRlb19idWZfc2l6ZSwKKyAgICAgICAgUFJPVF9SRUFELCBNQVBfU0hBUkVELCAqdmlkZW9fZmQsIChvZmZfdCkwKTsKKyAgICBpZiAodmlkZW9fYnVmID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIm1tYXA6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGZyZXF1ZW5jeSAhPSAwLjApIHsKKyAgICAgICAgaW9jdGxfZnJlcXVlbmN5ICA9ICh1bnNpZ25lZCBsb25nKShmcmVxdWVuY3kqMTYpOworICAgICAgICBpZiAoaW9jdGwoKnR1bmVyX2ZkLCBUVlRVTkVSX1NFVEZSRVEsICZpb2N0bF9mcmVxdWVuY3kpIDwgMCkKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJUVlRVTkVSX1NFVEZSRVE6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKworICAgIGMgPSBBVURJT19VTk1VVEU7CisgICAgaWYgKGlvY3RsKCp0dW5lcl9mZCwgQlQ4NDhfU0FVRElPLCAmYykgPCAwKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVFZUVU5FUl9TQVVESU86ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCisgICAgYyA9IE1FVEVPUl9DQVBfQ09OVElOT1VTOworICAgIGlvY3RsKCp2aWRlb19mZCwgTUVURU9SQ0FQVFVSLCAmYyk7CisKKyAgICBjID0gU0lHVVNSMTsKKyAgICBpb2N0bCgqdmlkZW9fZmQsIE1FVEVPUlNTSUdOQUwsICZjKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBia3RyX2dldGZyYW1lKHVpbnQ2NF90IHBlcl9mcmFtZSkKK3sKKyAgICB1aW50NjRfdCBjdXJ0aW1lOworCisgICAgY3VydGltZSA9IGF2X2dldHRpbWUoKTsKKyAgICBpZiAoIWxhc3RfZnJhbWVfdGltZQorICAgICAgICB8fCAoKGxhc3RfZnJhbWVfdGltZSArIHBlcl9mcmFtZSkgPiBjdXJ0aW1lKSkgeworICAgICAgICBpZiAoIXVzbGVlcChsYXN0X2ZyYW1lX3RpbWUgKyBwZXJfZnJhbWUgKyBwZXJfZnJhbWUgLyA4IC0gY3VydGltZSkpIHsKKyAgICAgICAgICAgIGlmICghbnNpZ25hbHMpCisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAiU0xFUFQgTk8gc2lnbmFscyAtICVkIG1pY3Jvc2Vjb25kcyBsYXRlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KShhdl9nZXR0aW1lKCkgLSBsYXN0X2ZyYW1lX3RpbWUgLSBwZXJfZnJhbWUpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBuc2lnbmFscyA9IDA7CisgICAgbGFzdF9mcmFtZV90aW1lID0gY3VydGltZTsKK30KKworCisvKiBub3RlOiB3ZSBzdXBwb3J0IG9ubHkgb25lIHBpY3R1cmUgcmVhZCBhdCBhIHRpbWUgKi8KK3N0YXRpYyBpbnQgZ3JhYl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMxLCBBVlBhY2tldCAqcGt0KQoreworICAgIFZpZGVvRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIHZpZGVvX2J1Zl9zaXplKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBia3RyX2dldGZyYW1lKHMtPnBlcl9mcmFtZSk7CisKKyAgICBwa3QtPnB0cyA9IGF2X2dldHRpbWUoKTsKKyAgICBtZW1jcHkocGt0LT5kYXRhLCB2aWRlb19idWYsIHZpZGVvX2J1Zl9zaXplKTsKKworICAgIHJldHVybiB2aWRlb19idWZfc2l6ZTsKK30KKworc3RhdGljIGludCBncmFiX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqczEpCit7CisgICAgVmlkZW9EYXRhICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgQVZSYXRpb25hbCBmcmFtZXJhdGU7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIXMtPmZyYW1lcmF0ZSkKKyAgICAgICAgc3dpdGNoIChzLT5zdGFuZGFyZCkgeworICAgICAgICBjYXNlIFBBTDogICBzLT5mcmFtZXJhdGUgPSBhdl9zdHJkdXAoInBhbCIpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgTlRTQzogIHMtPmZyYW1lcmF0ZSA9IGF2X3N0cmR1cCgibnRzYyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBTRUNBTTogcy0+ZnJhbWVyYXRlID0gYXZfc3RyZHVwKCIyNSIpOyAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJVbmtub3duIHN0YW5kYXJkLlxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIGlmICgocmV0ID0gYXZfcGFyc2VfdmlkZW9fcmF0ZSgmZnJhbWVyYXRlLCBzLT5mcmFtZXJhdGUpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgcGFyc2UgZnJhbWVyYXRlICclcycuXG4iLCBzLT5mcmFtZXJhdGUpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oczEsIE5VTEwpOworICAgIGlmICghc3QpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOyAvKiA2NCBiaXRzIHB0cyBpbiB1c2UgKi8KKworICAgIHMtPnBlcl9mcmFtZSA9ICgodWludDY0X3QpMTAwMDAwMCAqIGZyYW1lcmF0ZS5kZW4pIC8gZnJhbWVyYXRlLm51bTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIHN0LT5jb2RlYy0+d2lkdGggPSBzLT53aWR0aDsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZS5kZW4gPSBmcmFtZXJhdGUubnVtOworICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlLm51bSA9IGZyYW1lcmF0ZS5kZW47CisKKworICAgIGlmIChia3RyX2luaXQoczEtPmZpbGVuYW1lLCBzLT53aWR0aCwgcy0+aGVpZ2h0LCBzLT5zdGFuZGFyZCwKKyAgICAgICAgICAgICAgICAgICZzLT52aWRlb19mZCwgJnMtPnR1bmVyX2ZkLCAtMSwgMC4wKSA8IDApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBuc2lnbmFscyA9IDA7CisgICAgbGFzdF9mcmFtZV90aW1lID0gMDsKKworb3V0OgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3JhYl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqczEpCit7CisgICAgVmlkZW9EYXRhICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBpbnQgYzsKKworICAgIGMgPSBNRVRFT1JfQ0FQX1NUT1BfQ09OVDsKKyAgICBpb2N0bChzLT52aWRlb19mZCwgTUVURU9SQ0FQVFVSLCAmYyk7CisgICAgY2xvc2Uocy0+dmlkZW9fZmQpOworCisgICAgYyA9IEFVRElPX01VVEU7CisgICAgaW9jdGwocy0+dHVuZXJfZmQsIEJUODQ4X1NBVURJTywgJmMpOworICAgIGNsb3NlKHMtPnR1bmVyX2ZkKTsKKworICAgIG11bm1hcCgoY2FkZHJfdCl2aWRlb19idWYsIHZpZGVvX2J1Zl9zaXplKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihWaWRlb0RhdGEsIHgpCisjZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJzdGFuZGFyZCIsICIiLCBvZmZzZXRvZihWaWRlb0RhdGEsIHN0YW5kYXJkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFZJREVPX0ZPUk1BVH0sIFBBTCwgTlRTQ0osIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAic3RhbmRhcmQiIH0sCisgICAgeyAiUEFMIiwgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gUEFMfSwgICAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgInN0YW5kYXJkIiB9LAorICAgIHsgIk5UU0MiLCAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE5UU0N9LCAgMCwgMCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJzdGFuZGFyZCIgfSwKKyAgICB7ICJTRUNBTSIsICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBTRUNBTX0sIDAsIDAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAic3RhbmRhcmQiIH0sCisgICAgeyAiUEFMTiIsICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gUEFMTn0sICAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgInN0YW5kYXJkIiB9LAorICAgIHsgIlBBTE0iLCAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFBBTE19LCAgMCwgMCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJzdGFuZGFyZCIgfSwKKyAgICB7ICJOVFNDSiIsICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBOVFNDSn0sIDAsIDAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAic3RhbmRhcmQiIH0sCisgICAgeyAidmlkZW9fc2l6ZSIsICJBIHN0cmluZyBkZXNjcmliaW5nIGZyYW1lIHNpemUsIHN1Y2ggYXMgNjQweDQ4MCBvciBoZDcyMC4iLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9ICJ2Z2EifSwgMCwgMCwgREVDIH0sCisgICAgeyAiZnJhbWVyYXRlIiwgIiIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIERFQyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYmt0cl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJCS1RSIGdyYWIgaW50ZXJmYWNlIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19JTlBVVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfYmt0cl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJia3RyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgidmlkZW8gZ3JhYiIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWaWRlb0RhdGEpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGdyYWJfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZ3JhYl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBncmFiX3JlYWRfY2xvc2UsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZia3RyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9jYWNhLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvY2FjYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTQ5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvY2FjYS5jCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8Y2FjYS5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKK3R5cGVkZWYgc3RydWN0IENBQ0FDb250ZXh0IHsKKyAgICBBVkNsYXNzICAgICAgICAgKmNsYXNzOworICAgIEFWRm9ybWF0Q29udGV4dCAqY3R4OworICAgIGNoYXIgICAgICAgICAgICAqd2luZG93X3RpdGxlOworICAgIGludCAgICAgICAgICAgICB3aW5kb3dfd2lkdGgsICB3aW5kb3dfaGVpZ2h0OworCisgICAgY2FjYV9jYW52YXNfdCAgICpjYW52YXM7CisgICAgY2FjYV9kaXNwbGF5X3QgICpkaXNwbGF5OworICAgIGNhY2FfZGl0aGVyX3QgICAqZGl0aGVyOworCisgICAgY2hhciAgICAgICAgICAgICphbGdvcml0aG0sICphbnRpYWxpYXM7CisgICAgY2hhciAgICAgICAgICAgICpjaGFyc2V0LCAqY29sb3I7CisgICAgY2hhciAgICAgICAgICAgICpkcml2ZXI7CisKKyAgICBjaGFyICAgICAgICAgICAgKmxpc3RfZGl0aGVyOworICAgIGludCAgICAgICAgICAgICBsaXN0X2RyaXZlcnM7Cit9IENBQ0FDb250ZXh0OworCitzdGF0aWMgaW50IGNhY2Ffd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQ0FDQUNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmYy0+d2luZG93X3RpdGxlKTsKKworICAgIGlmIChjLT5kaXNwbGF5KSB7CisgICAgICAgIGNhY2FfZnJlZV9kaXNwbGF5KGMtPmRpc3BsYXkpOworICAgICAgICBjLT5kaXNwbGF5ID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGMtPmRpdGhlcikgeworICAgICAgICBjYWNhX2ZyZWVfZGl0aGVyKGMtPmRpdGhlcik7CisgICAgICAgIGMtPmRpdGhlciA9IE5VTEw7CisgICAgfQorICAgIGlmIChjLT5jYW52YXMpIHsKKyAgICAgICAgY2FjYV9mcmVlX2NhbnZhcyhjLT5jYW52YXMpOworICAgICAgICBjLT5jYW52YXMgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGlzdF9kcml2ZXJzKENBQ0FDb250ZXh0ICpjKQoreworICAgIGNvbnN0IGNoYXIgKmNvbnN0ICpkcml2ZXJzID0gY2FjYV9nZXRfZGlzcGxheV9kcml2ZXJfbGlzdCgpOworICAgIGludCBpOworCisgICAgYXZfbG9nKGMtPmN0eCwgQVZfTE9HX0lORk8sICJBdmFpbGFibGUgZHJpdmVyczpcbiIpOworICAgIGZvciAoaSA9IDA7IGRyaXZlcnNbaV07IGkgKz0gMikKKyAgICAgICAgYXZfbG9nKGMtPmN0eCwgQVZfTE9HX0lORk8sICIlcyA6ICVzXG4iLCBkcml2ZXJzW2ldLCBkcml2ZXJzW2kgKyAxXSk7Cit9CisKKyNkZWZpbmUgREVGSU5FX0xJU1RfRElUSEVSKHRoaW5nLCB0aGluZ19zdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgbGlzdF9kaXRoZXJfIyMgdGhpbmcoQ0FDQUNvbnRleHQgKmMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGNoYXIgKmNvbnN0ICp0aGluZyA9IGNhY2FfZ2V0X2RpdGhlcl8jIyB0aGluZyAjI19saXN0KGMtPmRpdGhlcik7ICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2xvZyhjLT5jdHgsIEFWX0xPR19JTkZPLCAiQXZhaWxhYmxlICVzOlxuIiwgdGhpbmdfc3RyKTsgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgdGhpbmdbaV07IGkgKz0gMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXZfbG9nKGMtPmN0eCwgQVZfTE9HX0lORk8sICIlcyA6ICVzXG4iLCB0aGluZ1tpXSwgdGhpbmdbaSArIDFdKTsgICAgXAorfQorCitERUZJTkVfTElTVF9ESVRIRVIoY29sb3IsICJjb2xvcnMiKTsKK0RFRklORV9MSVNUX0RJVEhFUihjaGFyc2V0LCAiY2hhcnNldHMiKTsKK0RFRklORV9MSVNUX0RJVEhFUihhbGdvcml0aG0sICJhbGdvcml0aG1zIik7CitERUZJTkVfTElTVF9ESVRIRVIoYW50aWFsaWFzLCAiYW50aWFsaWFzIik7CisKK3N0YXRpYyBpbnQgY2FjYV93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIENBQ0FDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgQVZDb2RlY0NvbnRleHQgKmVuY2N0eCA9IHN0LT5jb2RlYzsKKyAgICBpbnQgcmV0LCBicHA7CisKKyAgICBjLT5jdHggPSBzOworICAgIGlmIChjLT5saXN0X2RyaXZlcnMpIHsKKyAgICAgICAgbGlzdF9kcml2ZXJzKGMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgIH0KKyAgICBpZiAoYy0+bGlzdF9kaXRoZXIpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYy0+bGlzdF9kaXRoZXIsICJjb2xvcnMiKSkgeworICAgICAgICAgICAgbGlzdF9kaXRoZXJfY29sb3IoYyk7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjLT5saXN0X2RpdGhlciwgImNoYXJzZXRzIikpIHsKKyAgICAgICAgICAgIGxpc3RfZGl0aGVyX2NoYXJzZXQoYyk7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjLT5saXN0X2RpdGhlciwgImFsZ29yaXRobXMiKSkgeworICAgICAgICAgICAgbGlzdF9kaXRoZXJfYWxnb3JpdGhtKGMpOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYy0+bGlzdF9kaXRoZXIsICJhbnRpYWxpYXNlcyIpKSB7CisgICAgICAgICAgICBsaXN0X2RpdGhlcl9hbnRpYWxpYXMoYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50ICclcycsIGZvciAnbGlzdF9kaXRoZXInIG9wdGlvblxuIgorICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBtdXN0IGJlIG9uZSBvZiAnYWxnb3JpdGhtcywgJ2FudGlhbGlhc2VzJywgJ2NoYXJzZXRzJywgJ2NvbG9ycydcbiIsCisgICAgICAgICAgICAgICAgICAgYy0+bGlzdF9kaXRoZXIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgIH0KKworICAgIGlmICggICBzLT5uYl9zdHJlYW1zID4gMQorICAgICAgICB8fCBlbmNjdHgtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPCisgICAgICAgIHx8IGVuY2N0eC0+Y29kZWNfaWQgICAhPSBBVl9DT0RFQ19JRF9SQVdWSURFTykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT25seSBzdXBwb3J0cyBvbmUgcmF3dmlkZW8gc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoZW5jY3R4LT5waXhfZm10ICE9IEFWX1BJWF9GTVRfUkdCMjQpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQgJyVzJywgY2hvb3NlIHJnYjI0XG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShlbmNjdHgtPnBpeF9mbXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBjLT5jYW52YXMgPSBjYWNhX2NyZWF0ZV9jYW52YXMoYy0+d2luZG93X3dpZHRoLCBjLT53aW5kb3dfaGVpZ2h0KTsKKyAgICBpZiAoIWMtPmNhbnZhcykgeworICAgICAgICByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgY2FudmFzXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGJwcCA9IGF2X2dldF9iaXRzX3Blcl9waXhlbChhdl9waXhfZm10X2Rlc2NfZ2V0KGVuY2N0eC0+cGl4X2ZtdCkpOworICAgIGMtPmRpdGhlciA9IGNhY2FfY3JlYXRlX2RpdGhlcihicHAsIGVuY2N0eC0+d2lkdGgsIGVuY2N0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicHAgLyA4ICogZW5jY3R4LT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZmYsIDB4MDBmZjAwLCAweGZmMDAwMCwgMCk7CisgICAgaWYgKCFjLT5kaXRoZXIpIHsKKyAgICAgICAgcmV0ID0gIEFWRVJST1IoZXJybm8pOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBkaXRoZXJcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisjZGVmaW5lIENIRUNLX0RJVEhFUl9PUFQob3B0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNhY2Ffc2V0X2RpdGhlcl8jI29wdChjLT5kaXRoZXIsIGMtPm9wdCkgPCAwKSAgeyAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IHZhbHVlICclcycgZm9yIG9wdGlvbiAnJXMnXG4iLCBcCisgICAgICAgICAgICAgICBjLT5vcHQsICNvcHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gZmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgIENIRUNLX0RJVEhFUl9PUFQoYWxnb3JpdGhtKTsKKyAgICBDSEVDS19ESVRIRVJfT1BUKGFudGlhbGlhcyk7CisgICAgQ0hFQ0tfRElUSEVSX09QVChjaGFyc2V0KTsKKyAgICBDSEVDS19ESVRIRVJfT1BUKGNvbG9yKTsKKworICAgIGMtPmRpc3BsYXkgPSBjYWNhX2NyZWF0ZV9kaXNwbGF5X3dpdGhfZHJpdmVyKGMtPmNhbnZhcywgYy0+ZHJpdmVyKTsKKyAgICBpZiAoIWMtPmRpc3BsYXkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGRpc3BsYXlcbiIpOworICAgICAgICBsaXN0X2RyaXZlcnMoYyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoIWMtPndpbmRvd193aWR0aCB8fCAhYy0+d2luZG93X2hlaWdodCkgeworICAgICAgICBjLT53aW5kb3dfd2lkdGggID0gY2FjYV9nZXRfY2FudmFzX3dpZHRoKGMtPmNhbnZhcyk7CisgICAgICAgIGMtPndpbmRvd19oZWlnaHQgPSBjYWNhX2dldF9jYW52YXNfaGVpZ2h0KGMtPmNhbnZhcyk7CisgICAgfQorCisgICAgaWYgKCFjLT53aW5kb3dfdGl0bGUpCisgICAgICAgIGMtPndpbmRvd190aXRsZSA9IGF2X3N0cmR1cChzLT5maWxlbmFtZSk7CisgICAgY2FjYV9zZXRfZGlzcGxheV90aXRsZShjLT5kaXNwbGF5LCBjLT53aW5kb3dfdGl0bGUpOworICAgIGNhY2Ffc2V0X2Rpc3BsYXlfdGltZShjLT5kaXNwbGF5LCBhdl9yZXNjYWxlX3EoMSwgc3QtPmNvZGVjLT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKSk7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBjYWNhX3dyaXRlX3RyYWlsZXIocyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYWNhX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQ0FDQUNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisKKyAgICBjYWNhX2RpdGhlcl9iaXRtYXAoYy0+Y2FudmFzLCAwLCAwLCBjLT53aW5kb3dfd2lkdGgsIGMtPndpbmRvd19oZWlnaHQsIGMtPmRpdGhlciwgcGt0LT5kYXRhKTsKKyAgICBjYWNhX3JlZnJlc2hfZGlzcGxheShjLT5kaXNwbGF5KTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDQUNBQ29udGV4dCx4KQorI2RlZmluZSBFTkMgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJ3aW5kb3dfc2l6ZSIsICAic2V0IHdpbmRvdyBmb3JjZWQgc2l6ZSIsICBPRkZTRVQod2luZG93X3dpZHRoKSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSBOVUxMIH0sIDAsIDAsIEVOQ30sCisgICAgeyAid2luZG93X3RpdGxlIiwgInNldCB3aW5kb3cgdGl0bGUiLCAgICAgICAgT0ZGU0VUKHdpbmRvd190aXRsZSksIEFWX09QVF9UWVBFX1NUUklORywgICAgIHsuc3RyID0gTlVMTCB9LCAwLCAwLCBFTkMgfSwKKyAgICB7ICJkcml2ZXIiLCAgICAgICAic2V0IGRpc3BsYXkgZHJpdmVyIiwgICAgICBPRkZTRVQoZHJpdmVyKSwgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEwgfSwgMCwgMCwgRU5DIH0sCisgICAgeyAiYWxnb3JpdGhtIiwgICAgInNldCBkaXRoZXJpbmcgYWxnb3JpdGhtIiwgT0ZGU0VUKGFsZ29yaXRobSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiZGVmYXVsdCIgfSwgMCwgMCwgRU5DIH0sCisgICAgeyAiYW50aWFsaWFzIiwgICAgInNldCBhbnRpYWxpYXMgbWV0aG9kIiwgICAgT0ZGU0VUKGFudGlhbGlhcyksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiZGVmYXVsdCIgfSwgMCwgMCwgRU5DIH0sCisgICAgeyAiY2hhcnNldCIsICAgICAgInNldCBjaGFyc2V0IHVzZWQgdG8gcmVuZGVyIG91dHB1dCIsIE9GRlNFVChjaGFyc2V0KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJkZWZhdWx0IiB9LCAwLCAwLCBFTkMgfSwKKyAgICB7ICJjb2xvciIsICAgICAgICAic2V0IGNvbG9yIHVzZWQgdG8gcmVuZGVyIG91dHB1dCIsICAgT0ZGU0VUKGNvbG9yKSwgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gImRlZmF1bHQiIH0sIDAsIDAsIEVOQyB9LAorICAgIHsgImxpc3RfZHJpdmVycyIsICJsaXN0IGF2YWlsYWJsZSBkcml2ZXJzIiwgIE9GRlNFVChsaXN0X2RyaXZlcnMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBFTkMsICJsaXN0X2RyaXZlcnMiIH0sCisgICAgeyAidHJ1ZSIsICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMX0sIDAsIDAsIEVOQywgImxpc3RfZHJpdmVycyIgfSwKKyAgICB7ICJmYWxzZSIsICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAwfSwgMCwgMCwgRU5DLCAibGlzdF9kcml2ZXJzIiB9LAorICAgIHsgImxpc3RfZGl0aGVyIiwgImxpc3QgYXZhaWxhYmxlIGRpdGhlciBvcHRpb25zIiwgT0ZGU0VUKGxpc3RfZGl0aGVyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LmRibD0wfSwgMCwgMSwgRU5DLCAibGlzdF9kaXRoZXIiIH0sCisgICAgeyAiYWxnb3JpdGhtcyIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuc3RyID0gImFsZ29yaXRobXMifSwgMCwgMCwgRU5DLCAibGlzdF9kaXRoZXIiIH0sCisgICAgeyAiYW50aWFsaWFzZXMiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuc3RyID0gImFudGlhbGlhc2VzIn0sMCwgMCwgRU5DLCAibGlzdF9kaXRoZXIiIH0sCisgICAgeyAiY2hhcnNldHMiLCAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuc3RyID0gImNoYXJzZXRzIn0sICAgMCwgMCwgRU5DLCAibGlzdF9kaXRoZXIiIH0sCisgICAgeyAiY29sb3JzIiwgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuc3RyID0gImNvbG9ycyJ9LCAgICAgMCwgMCwgRU5DLCAibGlzdF9kaXRoZXIiIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBjYWNhX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImNhY2Ffb3V0ZGV2IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19PVVRQVVQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9jYWNhX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjYWNhIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiY2FjYSAoY29sb3IgQVNDSUkgYXJ0KSBvdXRwdXQgZGV2aWNlIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENBQ0FDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC52aWRlb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICA9IGNhY2Ffd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IGNhY2Ffd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICA9IGNhY2Ffd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmNhY2FfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2NvbW1vbi5jcHAgYi9mZm1wZWcvbGliYXZkZXZpY2UvZGVja2xpbmtfY29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2UxNjUxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2NvbW1vbi5jcHAKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBCbGFja21hZ2ljIERlY2tMaW5rIG91dHB1dAorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgUmFtaXJvIFBvbGxhLCBMdWNhIEJhcmJhdG8sIERldGkgRmxpZWdsCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxEZWNrTGlua0FQSS5oPgorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPERlY2tMaW5rQVBJX2kuYz4KKyNlbHNlCisjaW5jbHVkZSA8RGVja0xpbmtBUElEaXNwYXRjaC5jcHA+CisjZW5kaWYKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorfQorCisjaW5jbHVkZSAiZGVja2xpbmtfY29tbW9uLmgiCisKKyNpZmRlZiBfV0lOMzIKK0lEZWNrTGlua0l0ZXJhdG9yICpDcmVhdGVEZWNrTGlua0l0ZXJhdG9ySW5zdGFuY2Uodm9pZCkKK3sKKyAgICBJRGVja0xpbmtJdGVyYXRvciAqaXRlcjsKKworICAgIGlmIChDb0luaXRpYWxpemUoTlVMTCkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDT00gaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChDb0NyZWF0ZUluc3RhbmNlKENMU0lEX0NEZWNrTGlua0l0ZXJhdG9yLCBOVUxMLCBDTFNDVFhfQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIElJRF9JRGVja0xpbmtJdGVyYXRvciwgKHZvaWQqKikgJml0ZXIpICE9IFNfT0spIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkRlY2tMaW5rIGRyaXZlcnMgbm90IGluc3RhbGxlZC5cbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gaXRlcjsKK30KKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCitzdGF0aWMgY2hhciAqZHVwX3djaGFyX3RvX3V0Zjgod2NoYXJfdCAqdykKK3sKKyAgICBjaGFyICpzID0gTlVMTDsKKyAgICBpbnQgbCA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgdywgLTEsIDAsIDAsIDAsIDApOworICAgIHMgPSAoY2hhciAqKSBhdl9tYWxsb2MobCk7CisgICAgaWYgKHMpCisgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgdywgLTEsIHMsIGwsIDAsIDApOworICAgIHJldHVybiBzOworfQorI2RlZmluZSBERUNLTElOS19TVFIgICAgT0xFQ0hBUiAqCisjZGVmaW5lIERFQ0tMSU5LX1NUUkRVUCBkdXBfd2NoYXJfdG9fdXRmOAorI2RlZmluZSBERUNLTElOS19GUkVFKHMpIFN5c0ZyZWVTdHJpbmcocykKKyNlbHNlCisjZGVmaW5lIERFQ0tMSU5LX1NUUiAgICBjb25zdCBjaGFyICoKKyNkZWZpbmUgREVDS0xJTktfU1RSRFVQIGF2X3N0cmR1cAorLyogZnJlZSgpIGlzIG5lZWRlZCBmb3IgYSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIERlY2tMaW5rIFNETC4gKi8KKyNkZWZpbmUgREVDS0xJTktfRlJFRShzKSBmcmVlKCh2b2lkICopIHMpCisjZW5kaWYKKworSFJFU1VMVCBmZl9kZWNrbGlua19nZXRfZGlzcGxheV9uYW1lKElEZWNrTGluayAqVGhpcywgY29uc3QgY2hhciAqKmRpc3BsYXlOYW1lKQoreworICAgIERFQ0tMSU5LX1NUUiB0bXBEaXNwbGF5TmFtZTsKKyAgICBIUkVTVUxUIGhyID0gVGhpcy0+R2V0RGlzcGxheU5hbWUoJnRtcERpc3BsYXlOYW1lKTsKKyAgICBpZiAoaHIgIT0gU19PSykKKyAgICAgICAgcmV0dXJuIGhyOworICAgICpkaXNwbGF5TmFtZSA9IERFQ0tMSU5LX1NUUkRVUCh0bXBEaXNwbGF5TmFtZSk7CisgICAgREVDS0xJTktfRlJFRSh0bXBEaXNwbGF5TmFtZSk7CisgICAgcmV0dXJuIGhyOworfQorCitpbnQgZmZfZGVja2xpbmtfc2V0X2Zvcm1hdChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGJfbnVtLCBpbnQgdGJfZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tsaW5rX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgaW50IG51bSkKK3sKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopY2N0eC0+Y3R4OworICAgIEJNRERpc3BsYXlNb2RlU3VwcG9ydCBzdXBwb3J0OworICAgIElEZWNrTGlua0Rpc3BsYXlNb2RlSXRlcmF0b3IgKml0ZXJtb2RlOworICAgIElEZWNrTGlua0Rpc3BsYXlNb2RlICptb2RlOworICAgIGludCBpID0gMTsKKyAgICBIUkVTVUxUIHJlczsKKworICAgIGlmIChkaXJlY3Rpb24gPT0gRElSRUNUSU9OX0lOKSB7CisgICAgICAgIHJlcyA9IGN0eC0+ZGxpLT5HZXREaXNwbGF5TW9kZUl0ZXJhdG9yICgmaXRlcm1vZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IGN0eC0+ZGxvLT5HZXREaXNwbGF5TW9kZUl0ZXJhdG9yICgmaXRlcm1vZGUpOworICAgIH0KKworICAgIGlmIChyZXMhPSBTX09LKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBnZXQgRGlzcGxheSBNb2RlIEl0ZXJhdG9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisKKyAgICBpZiAodGJfbnVtID09IDEpIHsKKyAgICAgICAgdGJfbnVtICo9IDEwMDA7CisgICAgICAgIHRiX2RlbiAqPSAxMDAwOworICAgIH0KKyAgICBjdHgtPmJtZF9tb2RlID0gYm1kTW9kZVVua25vd247CisgICAgd2hpbGUgKChjdHgtPmJtZF9tb2RlID09IGJtZE1vZGVVbmtub3duKSAmJiBpdGVybW9kZS0+TmV4dCgmbW9kZSkgPT0gU19PSykgeworICAgICAgICBCTURUaW1lVmFsdWUgYm1kX3RiX251bSwgYm1kX3RiX2RlbjsKKyAgICAgICAgaW50IGJtZF93aWR0aCAgPSBtb2RlLT5HZXRXaWR0aCgpOworICAgICAgICBpbnQgYm1kX2hlaWdodCA9IG1vZGUtPkdldEhlaWdodCgpOworCisgICAgICAgIG1vZGUtPkdldEZyYW1lUmF0ZSgmYm1kX3RiX251bSwgJmJtZF90Yl9kZW4pOworCisgICAgICAgIGlmICgoYm1kX3dpZHRoID09IHdpZHRoICYmIGJtZF9oZWlnaHQgPT0gaGVpZ2h0ICYmCisgICAgICAgICAgICBibWRfdGJfbnVtID09IHRiX251bSAmJiBibWRfdGJfZGVuID09IHRiX2RlbikgfHwgaSA9PSBudW0pIHsKKyAgICAgICAgICAgIGN0eC0+Ym1kX21vZGUgICA9IG1vZGUtPkdldERpc3BsYXlNb2RlKCk7CisgICAgICAgICAgICBjdHgtPmJtZF93aWR0aCAgPSBibWRfd2lkdGg7CisgICAgICAgICAgICBjdHgtPmJtZF9oZWlnaHQgPSBibWRfaGVpZ2h0OworICAgICAgICAgICAgY3R4LT5ibWRfdGJfZGVuID0gYm1kX3RiX2RlbjsKKyAgICAgICAgICAgIGN0eC0+Ym1kX3RiX251bSA9IGJtZF90Yl9udW07CisgICAgICAgICAgICBjdHgtPmJtZF9maWVsZF9kb21pbmFuY2UgPSBtb2RlLT5HZXRGaWVsZERvbWluYW5jZSgpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIkZvdW5kIERlY2tsaW5rIG1vZGUgJWQgeCAlZCB3aXRoIHJhdGUgJS4yZiVzXG4iLAorICAgICAgICAgICAgICAgIGJtZF93aWR0aCwgYm1kX2hlaWdodCwgKGZsb2F0KWJtZF90Yl9kZW4vKGZsb2F0KWJtZF90Yl9udW0sCisgICAgICAgICAgICAgICAgKGN0eC0+Ym1kX2ZpZWxkX2RvbWluYW5jZT09Ym1kTG93ZXJGaWVsZEZpcnN0IHx8IGN0eC0+Ym1kX2ZpZWxkX2RvbWluYW5jZT09Ym1kVXBwZXJGaWVsZEZpcnN0KT8iKGkpIjoiIik7CisgICAgICAgIH0KKworICAgICAgICBtb2RlLT5SZWxlYXNlKCk7CisgICAgICAgIGkrKzsKKyAgICB9CisKKyAgICBpdGVybW9kZS0+UmVsZWFzZSgpOworCisgICAgaWYgKGN0eC0+Ym1kX21vZGUgPT0gYm1kTW9kZVVua25vd24pCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9JTikgeworICAgICAgICBpZiAoY3R4LT5kbGktPkRvZXNTdXBwb3J0VmlkZW9Nb2RlKGN0eC0+Ym1kX21vZGUsIGJtZEZvcm1hdDhCaXRZVVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1kVmlkZW9PdXRwdXRGbGFnRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VwcG9ydCwgTlVMTCkgIT0gU19PSykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY3R4LT5kbG8tPkRvZXNTdXBwb3J0VmlkZW9Nb2RlKGN0eC0+Ym1kX21vZGUsIGJtZEZvcm1hdDhCaXRZVVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1kVmlkZW9PdXRwdXRGbGFnRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VwcG9ydCwgTlVMTCkgIT0gU19PSykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc3VwcG9ydCA9PSBibWREaXNwbGF5TW9kZVN1cHBvcnRlZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBmZl9kZWNrbGlua19zZXRfZm9ybWF0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIGRlY2tsaW5rX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgaW50IG51bSkgeworICAgIHJldHVybiBmZl9kZWNrbGlua19zZXRfZm9ybWF0KGF2Y3R4LCAwLCAwLCAwLCAwLCBkaXJlY3Rpb24sIG51bSk7Cit9CisKK2ludCBmZl9kZWNrbGlua19saXN0X2RldmljZXMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBJRGVja0xpbmsgKmRsID0gTlVMTDsKKyAgICBJRGVja0xpbmtJdGVyYXRvciAqaXRlciA9IENyZWF0ZURlY2tMaW5rSXRlcmF0b3JJbnN0YW5jZSgpOworICAgIGlmICghaXRlcikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgRGVja0xpbmsgaXRlcmF0b3JcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiQmxhY2ttYWdpYyBEZWNrTGluayBkZXZpY2VzOlxuIik7CisgICAgd2hpbGUgKGl0ZXItPk5leHQoJmRsKSA9PSBTX09LKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmRpc3BsYXlOYW1lOworICAgICAgICBmZl9kZWNrbGlua19nZXRfZGlzcGxheV9uYW1lKGRsLCAmZGlzcGxheU5hbWUpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiXHQnJXMnXG4iLCBkaXNwbGF5TmFtZSk7CisgICAgICAgIGF2X2ZyZWUoKHZvaWQgKikgZGlzcGxheU5hbWUpOworICAgICAgICBkbC0+UmVsZWFzZSgpOworICAgIH0KKyAgICBpdGVyLT5SZWxlYXNlKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9kZWNrbGlua19saXN0X2Zvcm1hdHMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgZGVja2xpbmtfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKQoreworICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopIGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKiljY3R4LT5jdHg7CisgICAgSURlY2tMaW5rRGlzcGxheU1vZGVJdGVyYXRvciAqaXRlcm1vZGU7CisgICAgSURlY2tMaW5rRGlzcGxheU1vZGUgKm1vZGU7CisgICAgaW50IGk9MDsKKyAgICBIUkVTVUxUIHJlczsKKworICAgIGlmIChkaXJlY3Rpb24gPT0gRElSRUNUSU9OX0lOKSB7CisgICAgICAgIHJlcyA9IGN0eC0+ZGxpLT5HZXREaXNwbGF5TW9kZUl0ZXJhdG9yICgmaXRlcm1vZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IGN0eC0+ZGxvLT5HZXREaXNwbGF5TW9kZUl0ZXJhdG9yICgmaXRlcm1vZGUpOworICAgIH0KKworICAgIGlmIChyZXMhPSBTX09LKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBnZXQgRGlzcGxheSBNb2RlIEl0ZXJhdG9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIlN1cHBvcnRlZCBmb3JtYXRzIGZvciAnJXMnOlxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5maWxlbmFtZSk7CisgICAgd2hpbGUgKGl0ZXJtb2RlLT5OZXh0KCZtb2RlKSA9PSBTX09LKSB7CisgICAgICAgIEJNRFRpbWVWYWx1ZSB0Yl9udW0sIHRiX2RlbjsKKyAgICAgICAgbW9kZS0+R2V0RnJhbWVSYXRlKCZ0Yl9udW0sICZ0Yl9kZW4pOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiXHQlZFx0JWxkeCVsZCBhdCAlZC8lZCBmcHMiLAorICAgICAgICAgICAgICAgICsraSxtb2RlLT5HZXRXaWR0aCgpLCBtb2RlLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAoaW50KSB0Yl9kZW4sIChpbnQpIHRiX251bSk7CisgICAgICAgIHN3aXRjaCAobW9kZS0+R2V0RmllbGREb21pbmFuY2UoKSkgeworICAgICAgICBjYXNlIGJtZExvd2VyRmllbGRGaXJzdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIiAoaW50ZXJsYWNlZCwgbG93ZXIgZmllbGQgZmlyc3QpIik7IGJyZWFrOworICAgICAgICBjYXNlIGJtZFVwcGVyRmllbGRGaXJzdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIiAoaW50ZXJsYWNlZCwgdXBwZXIgZmllbGQgZmlyc3QpIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJcbiIpOworICAgICAgICBtb2RlLT5SZWxlYXNlKCk7CisgICAgfQorCisgICAgaXRlcm1vZGUtPlJlbGVhc2UoKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2NvbW1vbi5oIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OTEyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvZGVja2xpbmtfY29tbW9uLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIEJsYWNrbWFnaWMgRGVja0xpbmsgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFJhbWlybyBQb2xsYSwgTHVjYSBCYXJiYXRvLCBEZXRpIEZsaWVnbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZGVja2xpbmtfY29tbW9uX2MuaCIKKworY2xhc3MgZGVja2xpbmtfb3V0cHV0X2NhbGxiYWNrOworY2xhc3MgZGVja2xpbmtfaW5wdXRfY2FsbGJhY2s7CisKK3R5cGVkZWYgc3RydWN0IEFWUGFja2V0UXVldWUgeworICAgIEFWUGFja2V0TGlzdCAqZmlyc3RfcGt0LCAqbGFzdF9wa3Q7CisgICAgaW50IG5iX3BhY2tldHM7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHNpemU7CisgICAgaW50IGFib3J0X3JlcXVlc3Q7CisgICAgcHRocmVhZF9tdXRleF90IG11dGV4OworICAgIHB0aHJlYWRfY29uZF90IGNvbmQ7CisgICAgQVZGb3JtYXRDb250ZXh0ICphdmN0eDsKK30gQVZQYWNrZXRRdWV1ZTsKKworc3RydWN0IGRlY2tsaW5rX2N0eCB7CisgICAgLyogRGVja0xpbmsgU0RLIGludGVyZmFjZXMgKi8KKyAgICBJRGVja0xpbmsgKmRsOworICAgIElEZWNrTGlua091dHB1dCAqZGxvOworICAgIElEZWNrTGlua0lucHV0ICpkbGk7CisgICAgZGVja2xpbmtfb3V0cHV0X2NhbGxiYWNrICpvdXRwdXRfY2FsbGJhY2s7CisgICAgZGVja2xpbmtfaW5wdXRfY2FsbGJhY2sgKmlucHV0X2NhbGxiYWNrOworCisgICAgLyogRGVja0xpbmsgbW9kZSBpbmZvcm1hdGlvbiAqLworICAgIEJNRFRpbWVWYWx1ZSBibWRfdGJfZGVuOworICAgIEJNRFRpbWVWYWx1ZSBibWRfdGJfbnVtOworICAgIEJNRERpc3BsYXlNb2RlIGJtZF9tb2RlOworICAgIGludCBibWRfd2lkdGg7CisgICAgaW50IGJtZF9oZWlnaHQ7CisgICAgaW50IGJtZF9maWVsZF9kb21pbmFuY2U7CisKKyAgICAvKiBDYXB0dXJlIGJ1ZmZlciBxdWV1ZSAqLworICAgIEFWUGFja2V0UXVldWUgcXVldWU7CisKKyAgICAvKiBTdHJlYW1zIHByZXNlbnQgKi8KKyAgICBpbnQgYXVkaW87CisgICAgaW50IHZpZGVvOworCisgICAgLyogU3RhdHVzICovCisgICAgaW50IHBsYXliYWNrX3N0YXJ0ZWQ7CisgICAgaW50IGNhcHR1cmVfc3RhcnRlZDsKKyAgICBpbnQ2NF90IGxhc3RfcHRzOworICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVDb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgZHJvcHBlZDsKKyAgICBBVlN0cmVhbSAqYXVkaW9fc3Q7CisgICAgQVZTdHJlYW0gKnZpZGVvX3N0OworCisgICAgLyogT3B0aW9ucyAqLworICAgIGludCBsaXN0X2RldmljZXM7CisgICAgaW50IGxpc3RfZm9ybWF0czsKKyAgICBkb3VibGUgcHJlcm9sbDsKKworICAgIGludCBmcmFtZXNfcHJlcm9sbDsKKyAgICBpbnQgZnJhbWVzX2J1ZmZlcjsKKworICAgIHNlbV90IHNlbWFwaG9yZTsKKworICAgIGludCBjaGFubmVsczsKK307CisKK3R5cGVkZWYgZW51bSB7IERJUkVDVElPTl9JTiwgRElSRUNUSU9OX09VVH0gZGVja2xpbmtfZGlyZWN0aW9uX3Q7CisKKyNpZmRlZiBfV0lOMzIKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBidWZmZXJjb3VudF90eXBlOworSURlY2tMaW5rSXRlcmF0b3IgKkNyZWF0ZURlY2tMaW5rSXRlcmF0b3JJbnN0YW5jZSh2b2lkKTsKKyNlbHNlCit0eXBlZGVmIHVpbnQzMl90IGJ1ZmZlcmNvdW50X3R5cGU7CisjZW5kaWYKKworCitIUkVTVUxUIGZmX2RlY2tsaW5rX2dldF9kaXNwbGF5X25hbWUoSURlY2tMaW5rICpUaGlzLCBjb25zdCBjaGFyICoqZGlzcGxheU5hbWUpOworaW50IGZmX2RlY2tsaW5rX3NldF9mb3JtYXQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgdGJfbnVtLCBpbnQgdGJfZGVuLCBkZWNrbGlua19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBESVJFQ1RJT05fT1VULCBpbnQgbnVtID0gMCk7CitpbnQgZmZfZGVja2xpbmtfc2V0X2Zvcm1hdChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBkZWNrbGlua19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGludCBudW0pOworaW50IGZmX2RlY2tsaW5rX2xpc3RfZGV2aWNlcyhBVkZvcm1hdENvbnRleHQgKmF2Y3R4KTsKK2ludCBmZl9kZWNrbGlua19saXN0X2Zvcm1hdHMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgZGVja2xpbmtfZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gRElSRUNUSU9OX09VVCk7CisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9kZWNrbGlua19jb21tb25fYy5oIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2NvbW1vbl9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxYTUxYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9kZWNrbGlua19jb21tb25fYy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBCbGFja21hZ2ljIERlY2tMaW5rIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBSYW1pcm8gUG9sbGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworc3RydWN0IGRlY2tsaW5rX2NjdHggeworICAgIGNvbnN0IEFWQ2xhc3MgKmNjbGFzczsKKworICAgIHZvaWQgKmN0eDsKKworICAgIC8qIE9wdGlvbnMgKi8KKyAgICBpbnQgbGlzdF9kZXZpY2VzOworICAgIGludCBsaXN0X2Zvcm1hdHM7CisgICAgZG91YmxlIHByZXJvbGw7Cit9OworCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvZGVja2xpbmtfZGVjLmNwcCBiL2ZmbXBlZy9saWJhdmRldmljZS9kZWNrbGlua19kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTBmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvZGVja2xpbmtfZGVjLmNwcApAQCAtMCwwICsxLDUzMSBAQAorLyoKKyAqIEJsYWNrbWFnaWMgRGVja0xpbmsgb3V0cHV0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBMdWNhIEJhcmJhdG8sIERldGkgRmxpZWdsCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxEZWNrTGlua0FQSS5oPgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCit9CisKKyNpbmNsdWRlICJkZWNrbGlua19jb21tb24uaCIKKyNpbmNsdWRlICJkZWNrbGlua19kZWMuaCIKKworc3RhdGljIHZvaWQgYXZwYWNrZXRfcXVldWVfaW5pdChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlBhY2tldFF1ZXVlICpxKQoreworICAgIG1lbXNldChxLCAwLCBzaXplb2YoQVZQYWNrZXRRdWV1ZSkpOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmcS0+bXV0ZXgsIE5VTEwpOworICAgIHB0aHJlYWRfY29uZF9pbml0KCZxLT5jb25kLCBOVUxMKTsKKyAgICBxLT5hdmN0eCA9IGF2Y3R4OworfQorCitzdGF0aWMgdm9pZCBhdnBhY2tldF9xdWV1ZV9mbHVzaChBVlBhY2tldFF1ZXVlICpxKQoreworICAgIEFWUGFja2V0TGlzdCAqcGt0LCAqcGt0MTsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+bXV0ZXgpOworICAgIGZvciAocGt0ID0gcS0+Zmlyc3RfcGt0OyBwa3QgIT0gTlVMTDsgcGt0ID0gcGt0MSkgeworICAgICAgICBwa3QxID0gcGt0LT5uZXh0OworICAgICAgICBhdl9mcmVlX3BhY2tldCgmcGt0LT5wa3QpOworICAgICAgICBhdl9mcmVlcCgmcGt0KTsKKyAgICB9CisgICAgcS0+bGFzdF9wa3QgICA9IE5VTEw7CisgICAgcS0+Zmlyc3RfcGt0ICA9IE5VTEw7CisgICAgcS0+bmJfcGFja2V0cyA9IDA7CisgICAgcS0+c2l6ZSAgICAgICA9IDA7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnEtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgYXZwYWNrZXRfcXVldWVfZW5kKEFWUGFja2V0UXVldWUgKnEpCit7CisgICAgYXZwYWNrZXRfcXVldWVfZmx1c2gocSk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZxLT5tdXRleCk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnEtPmNvbmQpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGF2cGFja2V0X3F1ZXVlX3NpemUoQVZQYWNrZXRRdWV1ZSAqcSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnEtPm11dGV4KTsKKyAgICBzaXplID0gcS0+c2l6ZTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcS0+bXV0ZXgpOworICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGF2cGFja2V0X3F1ZXVlX3B1dChBVlBhY2tldFF1ZXVlICpxLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWUGFja2V0TGlzdCAqcGt0MTsKKworICAgIC8vIERyb3AgUGFja2V0IGlmIHF1ZXVlIHNpemUgaXMgPiAxR0IKKyAgICBpZiAoYXZwYWNrZXRfcXVldWVfc2l6ZShxKSA+ICAxMDI0ICogMTAyNCAqIDEwMjQgKSB7CisgICAgICAgIGF2X2xvZyhxLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICAiRGVja2xpbmsgaW5wdXQgYnVmZmVyIG92ZXJydW4hXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBkdXBsaWNhdGUgdGhlIHBhY2tldCAqLworICAgIGlmIChhdl9kdXBfcGFja2V0KHBrdCkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwa3QxID0gKEFWUGFja2V0TGlzdCAqKWF2X21hbGxvYyhzaXplb2YoQVZQYWNrZXRMaXN0KSk7CisgICAgaWYgKCFwa3QxKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcGt0MS0+cGt0ICA9ICpwa3Q7CisgICAgcGt0MS0+bmV4dCA9IE5VTEw7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnEtPm11dGV4KTsKKworICAgIGlmICghcS0+bGFzdF9wa3QpIHsKKyAgICAgICAgcS0+Zmlyc3RfcGt0ID0gcGt0MTsKKyAgICB9IGVsc2UgeworICAgICAgICBxLT5sYXN0X3BrdC0+bmV4dCA9IHBrdDE7CisgICAgfQorCisgICAgcS0+bGFzdF9wa3QgPSBwa3QxOworICAgIHEtPm5iX3BhY2tldHMrKzsKKyAgICBxLT5zaXplICs9IHBrdDEtPnBrdC5zaXplICsgc2l6ZW9mKCpwa3QxKTsKKworICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnEtPmNvbmQpOworCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnEtPm11dGV4KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdnBhY2tldF9xdWV1ZV9nZXQoQVZQYWNrZXRRdWV1ZSAqcSwgQVZQYWNrZXQgKnBrdCwgaW50IGJsb2NrKQoreworICAgIEFWUGFja2V0TGlzdCAqcGt0MTsKKyAgICBpbnQgcmV0OworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxLT5tdXRleCk7CisKKyAgICBmb3IgKDs7ICkgeworICAgICAgICBwa3QxID0gcS0+Zmlyc3RfcGt0OworICAgICAgICBpZiAocGt0MSkgeworICAgICAgICAgICAgcS0+Zmlyc3RfcGt0ID0gcGt0MS0+bmV4dDsKKyAgICAgICAgICAgIGlmICghcS0+Zmlyc3RfcGt0KSB7CisgICAgICAgICAgICAgICAgcS0+bGFzdF9wa3QgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcS0+bmJfcGFja2V0cy0tOworICAgICAgICAgICAgcS0+c2l6ZSAtPSBwa3QxLT5wa3Quc2l6ZSArIHNpemVvZigqcGt0MSk7CisgICAgICAgICAgICAqcGt0ICAgICA9IHBrdDEtPnBrdDsKKyAgICAgICAgICAgIGF2X2ZyZWUocGt0MSk7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoIWJsb2NrKSB7CisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcS0+Y29uZCwgJnEtPm11dGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcS0+bXV0ZXgpOworICAgIHJldHVybiByZXQ7Cit9CisKK2NsYXNzIGRlY2tsaW5rX2lucHV0X2NhbGxiYWNrIDogcHVibGljIElEZWNrTGlua0lucHV0Q2FsbGJhY2sKK3sKK3B1YmxpYzoKKyAgICAgICAgZGVja2xpbmtfaW5wdXRfY2FsbGJhY2soQVZGb3JtYXRDb250ZXh0ICpfYXZjdHgpOworICAgICAgICB+ZGVja2xpbmtfaW5wdXRfY2FsbGJhY2soKTsKKworICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUXVlcnlJbnRlcmZhY2UoUkVGSUlEIGlpZCwgTFBWT0lEICpwcHYpIHsgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7IH0KKyAgICAgICAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBBZGRSZWYodm9pZCk7CisgICAgICAgIHZpcnR1YWwgVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgIFJlbGVhc2Uodm9pZCk7CisgICAgICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBWaWRlb0lucHV0Rm9ybWF0Q2hhbmdlZChCTURWaWRlb0lucHV0Rm9ybWF0Q2hhbmdlZEV2ZW50cywgSURlY2tMaW5rRGlzcGxheU1vZGUqLCBCTUREZXRlY3RlZFZpZGVvSW5wdXRGb3JtYXRGbGFncyk7CisgICAgICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBWaWRlb0lucHV0RnJhbWVBcnJpdmVkKElEZWNrTGlua1ZpZGVvSW5wdXRGcmFtZSosIElEZWNrTGlua0F1ZGlvSW5wdXRQYWNrZXQqKTsKKworcHJpdmF0ZToKKyAgICAgICAgVUxPTkcgICAgICAgICAgIG1fcmVmQ291bnQ7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtX211dGV4OworICAgICAgICBBVkZvcm1hdENvbnRleHQgKmF2Y3R4OworICAgICAgICBkZWNrbGlua19jdHggICAgKmN0eDsKKyAgICAgICAgaW50IG5vX3ZpZGVvOworICAgICAgICBpbnQ2NF90IGluaXRpYWxfdmlkZW9fcHRzOworICAgICAgICBpbnQ2NF90IGluaXRpYWxfYXVkaW9fcHRzOworfTsKKworZGVja2xpbmtfaW5wdXRfY2FsbGJhY2s6OmRlY2tsaW5rX2lucHV0X2NhbGxiYWNrKEFWRm9ybWF0Q29udGV4dCAqX2F2Y3R4KSA6IG1fcmVmQ291bnQoMCkKK3sKKyAgICBhdmN0eCA9IF9hdmN0eDsKKyAgICBkZWNrbGlua19jY3R4ICAgICAgICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopIGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKikgY2N0eC0+Y3R4OworICAgIGluaXRpYWxfYXVkaW9fcHRzID0gaW5pdGlhbF92aWRlb19wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJm1fbXV0ZXgsIE5VTEwpOworfQorCitkZWNrbGlua19pbnB1dF9jYWxsYmFjazo6fmRlY2tsaW5rX2lucHV0X2NhbGxiYWNrKCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fbXV0ZXgpOworfQorCitVTE9ORyBkZWNrbGlua19pbnB1dF9jYWxsYmFjazo6QWRkUmVmKHZvaWQpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX211dGV4KTsKKyAgICBtX3JlZkNvdW50Kys7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbXV0ZXgpOworCisgICAgcmV0dXJuIChVTE9ORyltX3JlZkNvdW50OworfQorCitVTE9ORyBkZWNrbGlua19pbnB1dF9jYWxsYmFjazo6UmVsZWFzZSh2b2lkKQoreworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9tdXRleCk7CisgICAgbV9yZWZDb3VudC0tOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX211dGV4KTsKKworICAgIGlmIChtX3JlZkNvdW50ID09IDApIHsKKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAoVUxPTkcpbV9yZWZDb3VudDsKK30KKworSFJFU1VMVCBkZWNrbGlua19pbnB1dF9jYWxsYmFjazo6VmlkZW9JbnB1dEZyYW1lQXJyaXZlZCgKKyAgICBJRGVja0xpbmtWaWRlb0lucHV0RnJhbWUgKnZpZGVvRnJhbWUsIElEZWNrTGlua0F1ZGlvSW5wdXRQYWNrZXQgKmF1ZGlvRnJhbWUpCit7CisgICAgdm9pZCAqZnJhbWVCeXRlczsKKyAgICB2b2lkICphdWRpb0ZyYW1lQnl0ZXM7CisgICAgQk1EVGltZVZhbHVlIGZyYW1lVGltZTsKKyAgICBCTURUaW1lVmFsdWUgZnJhbWVEdXJhdGlvbjsKKworICAgIGN0eC0+ZnJhbWVDb3VudCsrOworCisgICAgLy8gSGFuZGxlIFZpZGVvIEZyYW1lCisgICAgaWYgKHZpZGVvRnJhbWUpIHsKKyAgICAgICAgQVZQYWNrZXQgcGt0OworICAgICAgICBBVkNvZGVjQ29udGV4dCAqYzsKKyAgICAgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7CisgICAgICAgIGMgPSBjdHgtPnZpZGVvX3N0LT5jb2RlYzsKKyAgICAgICAgaWYgKGN0eC0+ZnJhbWVDb3VudCAlIDI1ID09IDApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBxc2l6ZSA9IGF2cGFja2V0X3F1ZXVlX3NpemUoJmN0eC0+cXVldWUpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICJGcmFtZSByZWNlaXZlZCAoIyVsdSkgLSBWYWxpZCAoJWxpQikgLSBRU2l6ZSAlZk1CXG4iLAorICAgICAgICAgICAgICAgICAgICBjdHgtPmZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPkdldFJvd0J5dGVzKCkgKiB2aWRlb0ZyYW1lLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlxc2l6ZSAvIDEwMjQgLyAxMDI0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvRnJhbWUtPkdldEJ5dGVzKCZmcmFtZUJ5dGVzKTsKKyAgICAgICAgdmlkZW9GcmFtZS0+R2V0U3RyZWFtVGltZSgmZnJhbWVUaW1lLCAmZnJhbWVEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZpZGVvX3N0LT50aW1lX2Jhc2UuZGVuKTsKKworICAgICAgICBpZiAodmlkZW9GcmFtZS0+R2V0RmxhZ3MoKSAmIGJtZEZyYW1lSGFzTm9JbnB1dFNvdXJjZSkgeworICAgICAgICAgICAgdW5zaWduZWQgYmFyc1s4XSA9IHsKKyAgICAgICAgICAgICAgICAweEVBODBFQTgwLCAweEQyOTJEMjEwLCAweEE5MTBBOUE1LCAweDkwMjI5MDM1LAorICAgICAgICAgICAgICAgIDB4NkFERDZBQ0EsIDB4NTFFRjUxNUEsIDB4Mjg2RDI4RUYsIDB4MTA4MDEwODAgfTsKKyAgICAgICAgICAgIGludCB3aWR0aCAgPSB2aWRlb0ZyYW1lLT5HZXRXaWR0aCgpOworICAgICAgICAgICAgaW50IGhlaWdodCA9IHZpZGVvRnJhbWUtPkdldEhlaWdodCgpOworICAgICAgICAgICAgdW5zaWduZWQgKnAgPSAodW5zaWduZWQgKilmcmFtZUJ5dGVzOworCisgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCArPSAyKQorICAgICAgICAgICAgICAgICAgICAqcCsrID0gYmFyc1soeCAqIDgpIC8gd2lkdGhdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW5vX3ZpZGVvKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkZyYW1lIHJlY2VpdmVkICgjJWx1KSAtIE5vIGlucHV0IHNpZ25hbCBkZXRlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiLSBGcmFtZXMgZHJvcHBlZCAldVxuIiwgY3R4LT5mcmFtZUNvdW50LCArK2N0eC0+ZHJvcHBlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub192aWRlbyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobm9fdmlkZW8pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRnJhbWUgcmVjZWl2ZWQgKCMlbHUpIC0gSW5wdXQgcmV0dXJuZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIi0gRnJhbWVzIGRyb3BwZWQgJXVcbiIsIGN0eC0+ZnJhbWVDb3VudCwgKytjdHgtPmRyb3BwZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9fdmlkZW8gPSAwOworICAgICAgICB9CisKKyAgICAgICAgcGt0LnB0cyA9IGZyYW1lVGltZSAvIGN0eC0+dmlkZW9fc3QtPnRpbWVfYmFzZS5udW07CisKKyAgICAgICAgaWYgKGluaXRpYWxfdmlkZW9fcHRzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBpbml0aWFsX3ZpZGVvX3B0cyA9IHBrdC5wdHM7CisgICAgICAgIH0KKworICAgICAgICBwa3QucHRzIC09IGluaXRpYWxfdmlkZW9fcHRzOworICAgICAgICBwa3QuZHRzID0gcGt0LnB0czsKKworICAgICAgICBwa3QuZHVyYXRpb24gPSBmcmFtZUR1cmF0aW9uOworICAgICAgICAvL1RvIGJlIG1hZGUgc3VyZSBpdCBzdGlsbCBhcHBsaWVzCisgICAgICAgIHBrdC5mbGFncyAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgICAgIHBrdC5zdHJlYW1faW5kZXggPSBjdHgtPnZpZGVvX3N0LT5pbmRleDsKKyAgICAgICAgcGt0LmRhdGEgICAgICAgICA9ICh1aW50OF90ICopZnJhbWVCeXRlczsKKyAgICAgICAgcGt0LnNpemUgICAgICAgICA9IHZpZGVvRnJhbWUtPkdldFJvd0J5dGVzKCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+R2V0SGVpZ2h0KCk7CisgICAgICAgIC8vZnByaW50ZihzdGRlcnIsIlZpZGVvIEZyYW1lIHNpemUgJWQgdHMgJWRcbiIsIHBrdC5zaXplLCBwa3QucHRzKTsKKyAgICAgICAgYy0+ZnJhbWVfbnVtYmVyKys7CisgICAgICAgIGlmIChhdnBhY2tldF9xdWV1ZV9wdXQoJmN0eC0+cXVldWUsICZwa3QpIDwgMCkgeworICAgICAgICAgICAgKytjdHgtPmRyb3BwZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBIYW5kbGUgQXVkaW8gRnJhbWUKKyAgICBpZiAoYXVkaW9GcmFtZSkgeworICAgICAgICBBVkNvZGVjQ29udGV4dCAqYzsKKyAgICAgICAgQVZQYWNrZXQgcGt0OworICAgICAgICBCTURUaW1lVmFsdWUgYXVkaW9fcHRzOworICAgICAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKKworICAgICAgICBjID0gY3R4LT5hdWRpb19zdC0+Y29kZWM7CisgICAgICAgIC8vaGFjayBhbW9uZyBoYWNrcworICAgICAgICBwa3Quc2l6ZSA9IGF1ZGlvRnJhbWUtPkdldFNhbXBsZUZyYW1lQ291bnQoKSAqIGN0eC0+YXVkaW9fc3QtPmNvZGVjLT5jaGFubmVscyAqICgxNiAvIDgpOworICAgICAgICBhdWRpb0ZyYW1lLT5HZXRCeXRlcygmYXVkaW9GcmFtZUJ5dGVzKTsKKyAgICAgICAgYXVkaW9GcmFtZS0+R2V0UGFja2V0VGltZSgmYXVkaW9fcHRzLCBjdHgtPmF1ZGlvX3N0LT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgcGt0LnB0cyA9IGF1ZGlvX3B0cyAvIGN0eC0+YXVkaW9fc3QtPnRpbWVfYmFzZS5udW07CisKKyAgICAgICAgaWYgKGluaXRpYWxfYXVkaW9fcHRzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBpbml0aWFsX2F1ZGlvX3B0cyA9IHBrdC5wdHM7CisgICAgICAgIH0KKworICAgICAgICBwa3QucHRzIC09IGluaXRpYWxfYXVkaW9fcHRzOworICAgICAgICBwa3QuZHRzID0gcGt0LnB0czsKKworICAgICAgICAvL2ZwcmludGYoc3RkZXJyLCJBdWRpbyBGcmFtZSBzaXplICVkIHRzICVkXG4iLCBwa3Quc2l6ZSwgcGt0LnB0cyk7CisgICAgICAgIHBrdC5mbGFncyAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgICAgIHBrdC5zdHJlYW1faW5kZXggPSBjdHgtPmF1ZGlvX3N0LT5pbmRleDsKKyAgICAgICAgcGt0LmRhdGEgICAgICAgICA9ICh1aW50OF90ICopYXVkaW9GcmFtZUJ5dGVzOworCisgICAgICAgIGMtPmZyYW1lX251bWJlcisrOworICAgICAgICBpZiAoYXZwYWNrZXRfcXVldWVfcHV0KCZjdHgtPnF1ZXVlLCAmcGt0KSA8IDApIHsKKyAgICAgICAgICAgICsrY3R4LT5kcm9wcGVkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgZGVja2xpbmtfaW5wdXRfY2FsbGJhY2s6OlZpZGVvSW5wdXRGb3JtYXRDaGFuZ2VkKAorICAgIEJNRFZpZGVvSW5wdXRGb3JtYXRDaGFuZ2VkRXZlbnRzIGV2ZW50cywgSURlY2tMaW5rRGlzcGxheU1vZGUgKm1vZGUsCisgICAgQk1ERGV0ZWN0ZWRWaWRlb0lucHV0Rm9ybWF0RmxhZ3MpCit7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIGRlY2tsaW5rX3N0YXJ0X2lucHV0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKikgYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKSBjY3R4LT5jdHg7CisKKyAgICBjdHgtPmlucHV0X2NhbGxiYWNrID0gbmV3IGRlY2tsaW5rX2lucHV0X2NhbGxiYWNrKGF2Y3R4KTsKKyAgICBjdHgtPmRsaS0+U2V0Q2FsbGJhY2soY3R4LT5pbnB1dF9jYWxsYmFjayk7CisgICAgcmV0dXJuIGN0eC0+ZGxpLT5TdGFydFN0cmVhbXMoKTsKK30KKworZXh0ZXJuICJDIiB7CisKK2F2X2NvbGQgaW50IGZmX2RlY2tsaW5rX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopIGNjdHgtPmN0eDsKKworICAgIGlmIChjdHgtPmNhcHR1cmVfc3RhcnRlZCkgeworICAgICAgICBjdHgtPmRsaS0+U3RvcFN0cmVhbXMoKTsKKyAgICAgICAgY3R4LT5kbGktPkRpc2FibGVWaWRlb0lucHV0KCk7CisgICAgICAgIGN0eC0+ZGxpLT5EaXNhYmxlQXVkaW9JbnB1dCgpOworICAgIH0KKworICAgIGlmIChjdHgtPmRsaSkKKyAgICAgICAgY3R4LT5kbGktPlJlbGVhc2UoKTsKKyAgICBpZiAoY3R4LT5kbCkKKyAgICAgICAgY3R4LT5kbC0+UmVsZWFzZSgpOworCisgICAgYXZwYWNrZXRfcXVldWVfZW5kKCZjdHgtPnF1ZXVlKTsKKworICAgIGF2X2ZyZWVwKCZjY3R4LT5jdHgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgaW50IGZmX2RlY2tsaW5rX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKikgYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHg7CisgICAgSURlY2tMaW5rRGlzcGxheU1vZGVJdGVyYXRvciAqaXRlcm1vZGU7CisgICAgSURlY2tMaW5rSXRlcmF0b3IgKml0ZXI7CisgICAgSURlY2tMaW5rICpkbCA9IE5VTEw7CisgICAgQVZTdHJlYW0gKnN0OworICAgIEhSRVNVTFQgcmVzdWx0OworICAgIGNoYXIgZm5hbWVbMTAyNF07CisgICAgY2hhciAqdG1wOworICAgIGludCBtb2RlX251bSA9IDA7CisKKyAgICBjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKSBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3QgZGVja2xpbmtfY3R4KSk7CisgICAgaWYgKCFjdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgY3R4LT5saXN0X2RldmljZXMgPSBjY3R4LT5saXN0X2RldmljZXM7CisgICAgY3R4LT5saXN0X2Zvcm1hdHMgPSBjY3R4LT5saXN0X2Zvcm1hdHM7CisgICAgY3R4LT5wcmVyb2xsICAgICAgPSBjY3R4LT5wcmVyb2xsOworICAgIGNjdHgtPmN0eCA9IGN0eDsKKworICAgIGl0ZXIgPSBDcmVhdGVEZWNrTGlua0l0ZXJhdG9ySW5zdGFuY2UoKTsKKyAgICBpZiAoIWl0ZXIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIERlY2tMaW5rIGl0ZXJhdG9yXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICAvKiBMaXN0IGF2YWlsYWJsZSBkZXZpY2VzLiAqLworICAgIGlmIChjdHgtPmxpc3RfZGV2aWNlcykgeworICAgICAgICBmZl9kZWNrbGlua19saXN0X2RldmljZXMoYXZjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgIH0KKworICAgIHN0cmNweSAoZm5hbWUsIGF2Y3R4LT5maWxlbmFtZSk7CisgICAgdG1wPXN0cmNociAoZm5hbWUsICdAJyk7CisgICAgaWYgKHRtcCAhPSBOVUxMKSB7CisgICAgICAgIG1vZGVfbnVtID0gYXRvaSAodG1wKzEpOworICAgICAgICAqdG1wID0gMDsKKyAgICB9CisKKyAgICAvKiBPcGVuIGRldmljZS4gKi8KKyAgICB3aGlsZSAoaXRlci0+TmV4dCgmZGwpID09IFNfT0spIHsKKyAgICAgICAgY29uc3QgY2hhciAqZGlzcGxheU5hbWU7CisgICAgICAgIGZmX2RlY2tsaW5rX2dldF9kaXNwbGF5X25hbWUoZGwsICZkaXNwbGF5TmFtZSk7CisgICAgICAgIGlmICghc3RyY21wKGZuYW1lLCBkaXNwbGF5TmFtZSkpIHsKKyAgICAgICAgICAgIGF2X2ZyZWUoKHZvaWQgKikgZGlzcGxheU5hbWUpOworICAgICAgICAgICAgY3R4LT5kbCA9IGRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZSgodm9pZCAqKSBkaXNwbGF5TmFtZSk7CisgICAgICAgIGRsLT5SZWxlYXNlKCk7CisgICAgfQorICAgIGl0ZXItPlJlbGVhc2UoKTsKKyAgICBpZiAoIWN0eC0+ZGwpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgb3BlbiAnJXMnXG4iLCBmbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgLyogR2V0IGlucHV0IGRldmljZS4gKi8KKyAgICBpZiAoY3R4LT5kbC0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEZWNrTGlua0lucHV0LCAodm9pZCAqKikgJmN0eC0+ZGxpKSAhPSBTX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gb3V0cHV0IGRldmljZSBmcm9tICclcydcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+ZmlsZW5hbWUpOworICAgICAgICBjdHgtPmRsLT5SZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgLyogTGlzdCBzdXBwb3J0ZWQgZm9ybWF0cy4gKi8KKyAgICBpZiAoY3R4LT5saXN0X2Zvcm1hdHMpIHsKKyAgICAgICAgZmZfZGVja2xpbmtfbGlzdF9mb3JtYXRzKGF2Y3R4LCBESVJFQ1RJT05fSU4pOworICAgICAgICBjdHgtPmRsaS0+UmVsZWFzZSgpOworICAgICAgICBjdHgtPmRsLT5SZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZGxpLT5HZXREaXNwbGF5TW9kZUl0ZXJhdG9yKCZpdGVybW9kZSkgIT0gU19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBnZXQgRGlzcGxheSBNb2RlIEl0ZXJhdG9yXG4iKTsKKyAgICAgICAgY3R4LT5kbC0+UmVsZWFzZSgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGlmIChtb2RlX251bSA+IDApIHsKKyAgICAgICAgaWYgKGZmX2RlY2tsaW5rX3NldF9mb3JtYXQoYXZjdHgsIERJUkVDVElPTl9JTiwgbW9kZV9udW0pIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgc2V0IG1vZGUgJWQgZm9yICVzXG4iLCBtb2RlX251bSwgZm5hbWUpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGl0ZXJtb2RlLT5SZWxlYXNlKCk7CisKKyAgICAvKiBTZXR1cCBzdHJlYW1zLiAqLworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShhdmN0eCwgTlVMTCk7CisgICAgaWYgKCFzdCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhZGQgc3RyZWFtXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBibWRBdWRpb1NhbXBsZVJhdGU0OGtIejsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gMjsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMDAwMCk7ICAvKiA2NCBiaXRzIHB0cyBpbiB1cyAqLworICAgIGN0eC0+YXVkaW9fc3Q9c3Q7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYXZjdHgsIE5VTEwpOworICAgIGlmICghc3QpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWRkIHN0cmVhbVxuIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICAgPSBjdHgtPmJtZF93aWR0aDsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgID0gY3R4LT5ibWRfaGVpZ2h0OworCisgICAgc3QtPmNvZGVjLT5waXhfZm10ICAgICA9IEFWX1BJWF9GTVRfVVlWWTQyMjsKKyAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZS5kZW4gICAgICA9IGN0eC0+Ym1kX3RiX2RlbjsKKyAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW0gICAgICA9IGN0eC0+Ym1kX3RiX251bTsKKyAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgID0gYXZwaWN0dXJlX2dldF9zaXplKHN0LT5jb2RlYy0+cGl4X2ZtdCwgY3R4LT5ibWRfd2lkdGgsIGN0eC0+Ym1kX2hlaWdodCkgKiAxL2F2X3EyZChzdC0+Y29kZWMtPnRpbWVfYmFzZSkgKiA4OworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgPSBNS1RBRygnVScsICdZJywgJ1YnLCAnWScpOworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOyAgLyogNjQgYml0cyBwdHMgaW4gdXMgKi8KKworICAgIGN0eC0+dmlkZW9fc3Q9c3Q7CisKKyAgICByZXN1bHQgPSBjdHgtPmRsaS0+RW5hYmxlQXVkaW9JbnB1dChibWRBdWRpb1NhbXBsZVJhdGU0OGtIeiwgYm1kQXVkaW9TYW1wbGVUeXBlMTZiaXRJbnRlZ2VyLCAyKTsKKworICAgIGlmIChyZXN1bHQgIT0gU19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBlbmFibGUgYXVkaW8gaW5wdXRcbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJlc3VsdCA9IGN0eC0+ZGxpLT5FbmFibGVWaWRlb0lucHV0KGN0eC0+Ym1kX21vZGUsIGJtZEZvcm1hdDhCaXRZVVYsIGJtZFZpZGVvSW5wdXRGbGFnRGVmYXVsdCk7CisKKyAgICBpZiAocmVzdWx0ICE9IFNfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgZW5hYmxlIHZpZGVvIGlucHV0XG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBhdnBhY2tldF9xdWV1ZV9pbml0IChhdmN0eCwgJmN0eC0+cXVldWUpOworCisgICAgaWYgKGRlY2tsaW5rX3N0YXJ0X2lucHV0IChhdmN0eCkgIT0gU19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBzdGFydCBpbnB1dCBzdHJlYW1cbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldHVybiAwOworCitlcnJvcjoKKworICAgIGN0eC0+ZGxpLT5SZWxlYXNlKCk7CisgICAgY3R4LT5kbC0+UmVsZWFzZSgpOworCisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworaW50IGZmX2RlY2tsaW5rX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKikgYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKSBjY3R4LT5jdHg7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBjdHgtPnZpZGVvX3N0LT5jb2RlYy0+Y29kZWRfZnJhbWU7CisKKyAgICBhdnBhY2tldF9xdWV1ZV9nZXQoJmN0eC0+cXVldWUsIHBrdCwgMSk7CisgICAgaWYgKGZyYW1lICYmIChjdHgtPmJtZF9maWVsZF9kb21pbmFuY2UgPT0gYm1kVXBwZXJGaWVsZEZpcnN0IHx8IGN0eC0+Ym1kX2ZpZWxkX2RvbWluYW5jZSA9PSBibWRMb3dlckZpZWxkRmlyc3QpKSB7CisgICAgICAgIGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICAgICAgaWYgKGN0eC0+Ym1kX2ZpZWxkX2RvbWluYW5jZSA9PSBibWRVcHBlckZpZWxkRmlyc3QpIHsKKyAgICAgICAgICAgIGZyYW1lLT50b3BfZmllbGRfZmlyc3QgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK30gLyogZXh0ZXJuICJDIiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2RlYy5oIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZDkyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvZGVja2xpbmtfZGVjLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIEJsYWNrbWFnaWMgRGVja0xpbmsgb3V0cHV0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBSYW1pcm8gUG9sbGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitpbnQgZmZfZGVja2xpbmtfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCk7CitpbnQgZmZfZGVja2xpbmtfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCk7CitpbnQgZmZfZGVja2xpbmtfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKmF2Y3R4KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2RlY19jLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvZGVja2xpbmtfZGVjX2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWVhMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2RlY19jLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIEJsYWNrbWFnaWMgRGVja0xpbmsgb3V0cHV0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgRGV0aSBGbGllZ2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjaW5jbHVkZSAiZGVja2xpbmtfY29tbW9uX2MuaCIKKyNpbmNsdWRlICJkZWNrbGlua19kZWMuaCIKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2Yoc3RydWN0IGRlY2tsaW5rX2NjdHgsIHgpCisjZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImxpc3RfZGV2aWNlcyIsICJsaXN0IGF2YWlsYWJsZSBkZXZpY2VzIiAgLCBPRkZTRVQobGlzdF9kZXZpY2VzKSwgQVZfT1BUX1RZUEVfSU5UICAgLCB7IC5pNjQgPSAwICAgfSwgMCwgMSwgREVDIH0sCisgICAgeyAibGlzdF9mb3JtYXRzIiwgImxpc3Qgc3VwcG9ydGVkIGZvcm1hdHMiICAsIE9GRlNFVChsaXN0X2Zvcm1hdHMpLCBBVl9PUFRfVFlQRV9JTlQgICAsIHsgLmk2NCA9IDAgICB9LCAwLCAxLCBERUMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGRlY2tsaW5rX2RlbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiQmxhY2ttYWdpYyBEZWNrTGluayBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19JTlBVVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfZGVja2xpbmtfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZGVja2xpbmsiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCbGFja21hZ2ljIERlY2tMaW5rIGlucHV0IiksCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFIHwgQVZGTVRfUkFXUElDVFVSRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZGVja2xpbmtfZGVtdXhlcl9jbGFzcywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGRlY2tsaW5rX2NjdHgpLAorICAgIC5yZWFkX2hlYWRlciAgID0gZmZfZGVja2xpbmtfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgPSBmZl9kZWNrbGlua19yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICA9IGZmX2RlY2tsaW5rX3JlYWRfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2VuYy5jcHAgYi9mZm1wZWcvbGliYXZkZXZpY2UvZGVja2xpbmtfZW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzU0NTBmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2VuYy5jcHAKQEAgLTAsMCArMSw0MjYgQEAKKy8qCisgKiBCbGFja21hZ2ljIERlY2tMaW5rIG91dHB1dAorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgUmFtaXJvIFBvbGxhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxEZWNrTGlua0FQSS5oPgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCit9CisKKyNpbmNsdWRlICJkZWNrbGlua19jb21tb24uaCIKKyNpbmNsdWRlICJkZWNrbGlua19lbmMuaCIKKworCisvKiBEZWNrTGluayBjYWxsYmFjayBjbGFzcyBkZWNsYXJhdGlvbiAqLworY2xhc3MgZGVja2xpbmtfZnJhbWUgOiBwdWJsaWMgSURlY2tMaW5rVmlkZW9GcmFtZQoreworcHVibGljOgorICAgIGRlY2tsaW5rX2ZyYW1lKHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCwgQVZGcmFtZSAqYXZmcmFtZSwgbG9uZyB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICBsb25nIGhlaWdodCwgdm9pZCAqYnVmZmVyKSA6CisgICAgICAgICAgICAgICAgICAgX2N0eChjdHgpLCBfYXZmcmFtZShhdmZyYW1lKSwgX3dpZHRoKHdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICBfaGVpZ2h0KGhlaWdodCksIF9idWZmZXIoYnVmZmVyKSwgX3JlZnMoMCkgeyB9CisKKyAgICB2aXJ0dWFsIGxvbmcgICAgICAgICAgIFNURE1FVEhPRENBTExUWVBFIEdldFdpZHRoICAgICAgKHZvaWQpICAgICAgICAgIHsgcmV0dXJuIF93aWR0aDsgfQorICAgIHZpcnR1YWwgbG9uZyAgICAgICAgICAgU1RETUVUSE9EQ0FMTFRZUEUgR2V0SGVpZ2h0ICAgICAodm9pZCkgICAgICAgICAgeyByZXR1cm4gX2hlaWdodDsgfQorICAgIHZpcnR1YWwgbG9uZyAgICAgICAgICAgU1RETUVUSE9EQ0FMTFRZUEUgR2V0Um93Qnl0ZXMgICAodm9pZCkgICAgICAgICAgeyByZXR1cm4gX3dpZHRoPDwxOyB9CisgICAgdmlydHVhbCBCTURQaXhlbEZvcm1hdCBTVERNRVRIT0RDQUxMVFlQRSBHZXRQaXhlbEZvcm1hdCh2b2lkKSAgICAgICAgICB7IHJldHVybiBibWRGb3JtYXQ4Qml0WVVWOyB9CisgICAgdmlydHVhbCBCTURGcmFtZUZsYWdzICBTVERNRVRIT0RDQUxMVFlQRSBHZXRGbGFncyAgICAgICh2b2lkKSAgICAgICAgICB7IHJldHVybiBibWRWaWRlb091dHB1dEZsYWdEZWZhdWx0OyB9CisgICAgdmlydHVhbCBIUkVTVUxUICAgICAgICBTVERNRVRIT0RDQUxMVFlQRSBHZXRCeXRlcyAgICAgICh2b2lkICoqYnVmZmVyKSB7ICpidWZmZXIgPSBfYnVmZmVyOyByZXR1cm4gU19PSzsgfQorCisgICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIEdldFRpbWVjb2RlICAgICAoQk1EVGltZWNvZGVGb3JtYXQgZm9ybWF0LCBJRGVja0xpbmtUaW1lY29kZSAqKnRpbWVjb2RlKSB7IHJldHVybiBTX0ZBTFNFOyB9CisgICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIEdldEFuY2lsbGFyeURhdGEoSURlY2tMaW5rVmlkZW9GcmFtZUFuY2lsbGFyeSAqKmFuY2lsbGFyeSkgICAgICAgICAgICAgICB7IHJldHVybiBTX0ZBTFNFOyB9CisKKyAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUXVlcnlJbnRlcmZhY2UoUkVGSUlEIGlpZCwgTFBWT0lEICpwcHYpIHsgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7IH0KKyAgICB2aXJ0dWFsIFVMT05HICAgU1RETUVUSE9EQ0FMTFRZUEUgQWRkUmVmKHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICsrX3JlZnM7IH0KKyAgICB2aXJ0dWFsIFVMT05HICAgU1RETUVUSE9EQ0FMTFRZUEUgUmVsZWFzZSh2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWYgKCEtLV9yZWZzKSBkZWxldGUgdGhpczsgcmV0dXJuIF9yZWZzOyB9CisKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpfY3R4OworICAgIEFWRnJhbWUgKl9hdmZyYW1lOworCitwcml2YXRlOgorICAgIGxvbmcgIF93aWR0aDsKKyAgICBsb25nICBfaGVpZ2h0OworICAgIHZvaWQgKl9idWZmZXI7CisgICAgaW50ICAgX3JlZnM7Cit9OworCitjbGFzcyBkZWNrbGlua19vdXRwdXRfY2FsbGJhY2sgOiBwdWJsaWMgSURlY2tMaW5rVmlkZW9PdXRwdXRDYWxsYmFjaworeworcHVibGljOgorICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBTY2hlZHVsZWRGcmFtZUNvbXBsZXRlZChJRGVja0xpbmtWaWRlb0ZyYW1lICpfZnJhbWUsIEJNRE91dHB1dEZyYW1lQ29tcGxldGlvblJlc3VsdCByZXN1bHQpCisgICAgeworICAgICAgICBkZWNrbGlua19mcmFtZSAqZnJhbWUgPSBzdGF0aWNfY2FzdDxkZWNrbGlua19mcmFtZSAqPihfZnJhbWUpOworICAgICAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSBmcmFtZS0+X2N0eDsKKyAgICAgICAgQVZGcmFtZSAqYXZmcmFtZSA9IGZyYW1lLT5fYXZmcmFtZTsKKworICAgICAgICBhdl9mcmFtZV9mcmVlKCZhdmZyYW1lKTsKKworICAgICAgICBzZW1fcG9zdCgmY3R4LT5zZW1hcGhvcmUpOworCisgICAgICAgIHJldHVybiBTX09LOworICAgIH0KKyAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgU2NoZWR1bGVkUGxheWJhY2tIYXNTdG9wcGVkKHZvaWQpICAgICAgIHsgcmV0dXJuIFNfT0s7IH0KKyAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUXVlcnlJbnRlcmZhY2UoUkVGSUlEIGlpZCwgTFBWT0lEICpwcHYpIHsgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7IH0KKyAgICB2aXJ0dWFsIFVMT05HICAgU1RETUVUSE9EQ0FMTFRZUEUgQWRkUmVmKHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDE7IH0KKyAgICB2aXJ0dWFsIFVMT05HICAgU1RETUVUSE9EQ0FMTFRZUEUgUmVsZWFzZSh2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDE7IH0KK307CisKK3N0YXRpYyBpbnQgZGVja2xpbmtfc2V0dXBfdmlkZW8oQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZTdHJlYW0gKnN0KQoreworICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopIGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKikgY2N0eC0+Y3R4OworICAgIEFWQ29kZWNDb250ZXh0ICpjID0gc3QtPmNvZGVjOworCisgICAgaWYgKGN0eC0+dmlkZW8pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IG9uZSB2aWRlbyBzdHJlYW0gaXMgc3VwcG9ydGVkIVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1VZVlk0MjIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQhIgorICAgICAgICAgICAgICAgIiBPbmx5IEFWX1BJWF9GTVRfVVlWWTQyMiBpcyBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoZmZfZGVja2xpbmtfc2V0X2Zvcm1hdChhdmN0eCwgYy0+d2lkdGgsIGMtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT50aW1lX2Jhc2UubnVtLCBjLT50aW1lX2Jhc2UuZGVuKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHZpZGVvIHNpemUgb3IgZnJhbWVyYXRlISIKKyAgICAgICAgICAgICAgICIgQ2hlY2sgYXZhaWxhYmxlIGZvcm1hdHMgd2l0aCAtbGlzdF9mb3JtYXRzIDEuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoY3R4LT5kbG8tPkVuYWJsZVZpZGVvT3V0cHV0KGN0eC0+Ym1kX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibWRWaWRlb091dHB1dEZsYWdEZWZhdWx0KSAhPSBTX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGVuYWJsZSB2aWRlbyBvdXRwdXQhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFNldCBjYWxsYmFjay4gKi8KKyAgICBjdHgtPm91dHB1dF9jYWxsYmFjayA9IG5ldyBkZWNrbGlua19vdXRwdXRfY2FsbGJhY2soKTsKKyAgICBjdHgtPmRsby0+U2V0U2NoZWR1bGVkRnJhbWVDb21wbGV0aW9uQ2FsbGJhY2soY3R4LT5vdXRwdXRfY2FsbGJhY2spOworCisgICAgLyogU3RhcnQgdmlkZW8gc2VtYXBob3JlLiAqLworICAgIGN0eC0+ZnJhbWVzX3ByZXJvbGwgPSBjLT50aW1lX2Jhc2UuZGVuICogY3R4LT5wcmVyb2xsOworICAgIGlmIChjLT50aW1lX2Jhc2UuZGVuID4gMTAwMCkKKyAgICAgICAgY3R4LT5mcmFtZXNfcHJlcm9sbCAvPSAxMDAwOworCisgICAgLyogQnVmZmVyIHR3aWNlIGFzIG1hbnkgZnJhbWVzIGFzIHRoZSBwcmVyb2xsLiAqLworICAgIGN0eC0+ZnJhbWVzX2J1ZmZlciA9IGN0eC0+ZnJhbWVzX3ByZXJvbGwgKiAyOworICAgIGN0eC0+ZnJhbWVzX2J1ZmZlciA9IEZGTUlOKGN0eC0+ZnJhbWVzX2J1ZmZlciwgNjApOworICAgIHNlbV9pbml0KCZjdHgtPnNlbWFwaG9yZSwgMCwgY3R4LT5mcmFtZXNfYnVmZmVyKTsKKworICAgIC8qIFRoZSBkZXZpY2UgZXhwZWN0cyB0aGUgZnJhbWVyYXRlIHRvIGJlIGZpeGVkLiAqLworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBjLT50aW1lX2Jhc2UubnVtLCBjLT50aW1lX2Jhc2UuZGVuKTsKKworICAgIGN0eC0+dmlkZW8gPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVja2xpbmtfc2V0dXBfYXVkaW8oQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZTdHJlYW0gKnN0KQoreworICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopIGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKikgY2N0eC0+Y3R4OworICAgIEFWQ29kZWNDb250ZXh0ICpjID0gc3QtPmNvZGVjOworCisgICAgaWYgKGN0eC0+YXVkaW8pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IG9uZSBhdWRpbyBzdHJlYW0gaXMgc3VwcG9ydGVkIVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGMtPnNhbXBsZV9yYXRlICE9IDQ4MDAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUhIgorICAgICAgICAgICAgICAgIiBPbmx5IDQ4a0h6IGlzIHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChjLT5jaGFubmVscyAhPSAyICYmIGMtPmNoYW5uZWxzICE9IDgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMhIgorICAgICAgICAgICAgICAgIiBPbmx5IHN0ZXJlbyBhbmQgNy4xIGFyZSBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoY3R4LT5kbG8tPkVuYWJsZUF1ZGlvT3V0cHV0KGJtZEF1ZGlvU2FtcGxlUmF0ZTQ4a0h6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1kQXVkaW9TYW1wbGVUeXBlMTZiaXRJbnRlZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibWRBdWRpb091dHB1dFN0cmVhbVRpbWVzdGFtcGVkKSAhPSBTX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGVuYWJsZSBhdWRpbyBvdXRwdXQhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoY3R4LT5kbG8tPkJlZ2luQXVkaW9QcmVyb2xsKCkgIT0gU19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBiZWdpbiBhdWRpbyBwcmVyb2xsIVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBUaGUgZGV2aWNlIGV4cGVjdHMgdGhlIHNhbXBsZSByYXRlIHRvIGJlIGZpeGVkLiAqLworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBjLT5zYW1wbGVfcmF0ZSk7CisgICAgY3R4LT5jaGFubmVscyA9IGMtPmNoYW5uZWxzOworCisgICAgY3R4LT5hdWRpbyA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworYXZfY29sZCBpbnQgZmZfZGVja2xpbmtfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQoreworICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopIGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKikgY2N0eC0+Y3R4OworCisgICAgaWYgKGN0eC0+cGxheWJhY2tfc3RhcnRlZCkgeworICAgICAgICBCTURUaW1lVmFsdWUgYWN0dWFsOworICAgICAgICBjdHgtPmRsby0+U3RvcFNjaGVkdWxlZFBsYXliYWNrKGN0eC0+bGFzdF9wdHMgKiBjdHgtPmJtZF90Yl9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbCwgY3R4LT5ibWRfdGJfZGVuKTsKKyAgICAgICAgY3R4LT5kbG8tPkRpc2FibGVWaWRlb091dHB1dCgpOworICAgICAgICBpZiAoY3R4LT5hdWRpbykKKyAgICAgICAgICAgIGN0eC0+ZGxvLT5EaXNhYmxlQXVkaW9PdXRwdXQoKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5kbG8pCisgICAgICAgIGN0eC0+ZGxvLT5SZWxlYXNlKCk7CisgICAgaWYgKGN0eC0+ZGwpCisgICAgICAgIGN0eC0+ZGwtPlJlbGVhc2UoKTsKKworICAgIGlmIChjdHgtPm91dHB1dF9jYWxsYmFjaykKKyAgICAgICAgZGVsZXRlIGN0eC0+b3V0cHV0X2NhbGxiYWNrOworCisgICAgc2VtX2Rlc3Ryb3koJmN0eC0+c2VtYXBob3JlKTsKKworICAgIGF2X2ZyZWVwKCZjY3R4LT5jdHgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVja2xpbmtfd3JpdGVfdmlkZW9fcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKikgYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKSBjY3R4LT5jdHg7CisgICAgQVZQaWN0dXJlICphdnBpY3R1cmUgPSAoQVZQaWN0dXJlICopIHBrdC0+ZGF0YTsKKyAgICBBVkZyYW1lICphdmZyYW1lLCAqdG1wOworICAgIGRlY2tsaW5rX2ZyYW1lICpmcmFtZTsKKyAgICBidWZmZXJjb3VudF90eXBlIGJ1ZmZlcmVkOworICAgIEhSRVNVTFQgaHI7CisKKyAgICAvKiBIQUNLIHdoaWxlIGF2X3VuY29kZWRfZnJhbWUoKSBpc24ndCBpbXBsZW1lbnRlZCAqLworICAgIGludCByZXQ7CisKKyAgICB0bXAgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHRtcC0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9VWVZZNDIyOworICAgIHRtcC0+d2lkdGggID0gY3R4LT5ibWRfd2lkdGg7CisgICAgdG1wLT5oZWlnaHQgPSBjdHgtPmJtZF9oZWlnaHQ7CisgICAgcmV0ID0gYXZfZnJhbWVfZ2V0X2J1ZmZlcih0bXAsIDMyKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZ0bXApOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBhdl9pbWFnZV9jb3B5KHRtcC0+ZGF0YSwgdG1wLT5saW5lc2l6ZSwgKGNvbnN0IHVpbnQ4X3QgKiopIGF2cGljdHVyZS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgIGF2cGljdHVyZS0+bGluZXNpemUsIChBVlBpeGVsRm9ybWF0KSB0bXAtPmZvcm1hdCwgdG1wLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgIHRtcC0+aGVpZ2h0KTsKKyAgICBhdmZyYW1lID0gYXZfZnJhbWVfY2xvbmUodG1wKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZ0bXApOworICAgIGlmICghYXZmcmFtZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjbG9uZSB2aWRlbyBmcmFtZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICAvKiBlbmQgSEFDSyAqLworCisgICAgZnJhbWUgPSBuZXcgZGVja2xpbmtfZnJhbWUoY3R4LCBhdmZyYW1lLCBjdHgtPmJtZF93aWR0aCwgY3R4LT5ibWRfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGF2ZnJhbWUtPmRhdGFbMF0pOworICAgIGlmICghZnJhbWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIG5ldyBmcmFtZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIC8qIEFsd2F5cyBrZWVwIGF0IG1vc3Qgb25lIHNlY29uZCBvZiBmcmFtZXMgYnVmZmVyZWQuICovCisgICAgc2VtX3dhaXQoJmN0eC0+c2VtYXBob3JlKTsKKworICAgIC8qIFNjaGVkdWxlIGZyYW1lIGZvciBwbGF5YmFjay4gKi8KKyAgICBociA9IGN0eC0+ZGxvLT5TY2hlZHVsZVZpZGVvRnJhbWUoKHN0cnVjdCBJRGVja0xpbmtWaWRlb0ZyYW1lICopIGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPnB0cyAqIGN0eC0+Ym1kX3RiX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5ibWRfdGJfbnVtLCBjdHgtPmJtZF90Yl9kZW4pOworICAgIGlmIChociAhPSBTX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHNjaGVkdWxlIHZpZGVvIGZyYW1lLiIKKyAgICAgICAgICAgICAgICAiIGVycm9yICUwOHguXG4iLCAodWludDMyX3QpIGhyKTsKKyAgICAgICAgZnJhbWUtPlJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBjdHgtPmRsby0+R2V0QnVmZmVyZWRWaWRlb0ZyYW1lQ291bnQoJmJ1ZmZlcmVkKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkJ1ZmZlcmVkIHZpZGVvIGZyYW1lczogJWQuXG4iLCAoaW50KSBidWZmZXJlZCk7CisgICAgaWYgKHBrdC0+cHRzID4gMiAmJiBidWZmZXJlZCA8PSAyKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggYnVmZmVyZWQgdmlkZW8gZnJhbWVzLiIKKyAgICAgICAgICAgICAgICIgVmlkZW8gbWF5IG1pc2JlaGF2ZSFcbiIpOworCisgICAgLyogUHJlcm9sbCB2aWRlbyBmcmFtZXMuICovCisgICAgaWYgKCFjdHgtPnBsYXliYWNrX3N0YXJ0ZWQgJiYgcGt0LT5wdHMgPiBjdHgtPmZyYW1lc19wcmVyb2xsKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRW5kaW5nIGF1ZGlvIHByZXJvbGwuXG4iKTsKKyAgICAgICAgaWYgKGN0eC0+YXVkaW8gJiYgY3R4LT5kbG8tPkVuZEF1ZGlvUHJlcm9sbCgpICE9IFNfT0spIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGVuZCBhdWRpbyBwcmVyb2xsIVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU3RhcnRpbmcgc2NoZWR1bGVkIHBsYXliYWNrLlxuIik7CisgICAgICAgIGlmIChjdHgtPmRsby0+U3RhcnRTY2hlZHVsZWRQbGF5YmFjaygwLCBjdHgtPmJtZF90Yl9kZW4sIDEuMCkgIT0gU19PSykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgc3RhcnQgc2NoZWR1bGVkIHBsYXliYWNrIVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9CisgICAgICAgIGN0eC0+cGxheWJhY2tfc3RhcnRlZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVja2xpbmtfd3JpdGVfYXVkaW9fcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKikgYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKSBjY3R4LT5jdHg7CisgICAgaW50IHNhbXBsZV9jb3VudCA9IHBrdC0+c2l6ZSAvIChjdHgtPmNoYW5uZWxzIDw8IDEpOworICAgIGJ1ZmZlcmNvdW50X3R5cGUgYnVmZmVyZWQ7CisKKyAgICBjdHgtPmRsby0+R2V0QnVmZmVyZWRBdWRpb1NhbXBsZUZyYW1lQ291bnQoJmJ1ZmZlcmVkKTsKKyAgICBpZiAocGt0LT5wdHMgPiAxICYmICFidWZmZXJlZCkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlRoZXJlJ3Mgbm8gYnVmZmVyZWQgYXVkaW8uIgorICAgICAgICAgICAgICAgIiBBdWRpbyB3aWxsIG1pc2JlaGF2ZSFcbiIpOworCisgICAgaWYgKGN0eC0+ZGxvLT5TY2hlZHVsZUF1ZGlvU2FtcGxlcyhwa3QtPmRhdGEsIHNhbXBsZV9jb3VudCwgcGt0LT5wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibWRBdWRpb1NhbXBsZVJhdGU0OGtIeiwgTlVMTCkgIT0gU19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBzY2hlZHVsZSBhdWRpbyBzYW1wbGVzLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2V4dGVybiAiQyIgeworCithdl9jb2xkIGludCBmZl9kZWNrbGlua193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eDsKKyAgICBJRGVja0xpbmtEaXNwbGF5TW9kZUl0ZXJhdG9yICppdGVybW9kZTsKKyAgICBJRGVja0xpbmtJdGVyYXRvciAqaXRlcjsKKyAgICBJRGVja0xpbmsgKmRsID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpbnQgbjsKKworICAgIGN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopIGF2X21hbGxvY3ooc2l6ZW9mKHN0cnVjdCBkZWNrbGlua19jdHgpKTsKKyAgICBpZiAoIWN0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBjdHgtPmxpc3RfZGV2aWNlcyA9IGNjdHgtPmxpc3RfZGV2aWNlczsKKyAgICBjdHgtPmxpc3RfZm9ybWF0cyA9IGNjdHgtPmxpc3RfZm9ybWF0czsKKyAgICBjdHgtPnByZXJvbGwgICAgICA9IGNjdHgtPnByZXJvbGw7CisgICAgY2N0eC0+Y3R4ID0gY3R4OworCisgICAgaXRlciA9IENyZWF0ZURlY2tMaW5rSXRlcmF0b3JJbnN0YW5jZSgpOworICAgIGlmICghaXRlcikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgRGVja0xpbmsgaXRlcmF0b3JcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIC8qIExpc3QgYXZhaWxhYmxlIGRldmljZXMuICovCisgICAgaWYgKGN0eC0+bGlzdF9kZXZpY2VzKSB7CisgICAgICAgIGZmX2RlY2tsaW5rX2xpc3RfZGV2aWNlcyhhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisgICAgfQorCisgICAgLyogT3BlbiBkZXZpY2UuICovCisgICAgd2hpbGUgKGl0ZXItPk5leHQoJmRsKSA9PSBTX09LKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmRpc3BsYXlOYW1lOworICAgICAgICBmZl9kZWNrbGlua19nZXRfZGlzcGxheV9uYW1lKGRsLCAmZGlzcGxheU5hbWUpOworICAgICAgICBpZiAoIXN0cmNtcChhdmN0eC0+ZmlsZW5hbWUsIGRpc3BsYXlOYW1lKSkgeworICAgICAgICAgICAgYXZfZnJlZSgodm9pZCAqKSBkaXNwbGF5TmFtZSk7CisgICAgICAgICAgICBjdHgtPmRsID0gZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlKCh2b2lkICopIGRpc3BsYXlOYW1lKTsKKyAgICAgICAgZGwtPlJlbGVhc2UoKTsKKyAgICB9CisgICAgaXRlci0+UmVsZWFzZSgpOworICAgIGlmICghY3R4LT5kbCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBvcGVuICclcydcbiIsIGF2Y3R4LT5maWxlbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgLyogR2V0IG91dHB1dCBkZXZpY2UuICovCisgICAgaWYgKGN0eC0+ZGwtPlF1ZXJ5SW50ZXJmYWNlKElJRF9JRGVja0xpbmtPdXRwdXQsICh2b2lkICoqKSAmY3R4LT5kbG8pICE9IFNfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgZGV2aWNlIGZyb20gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5maWxlbmFtZSk7CisgICAgICAgIGN0eC0+ZGwtPlJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICAvKiBMaXN0IHN1cHBvcnRlZCBmb3JtYXRzLiAqLworICAgIGlmIChjdHgtPmxpc3RfZm9ybWF0cykgeworICAgICAgICBmZl9kZWNrbGlua19saXN0X2Zvcm1hdHMoYXZjdHgpOworICAgICAgICBjdHgtPmRsby0+UmVsZWFzZSgpOworICAgICAgICBjdHgtPmRsLT5SZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZGxvLT5HZXREaXNwbGF5TW9kZUl0ZXJhdG9yKCZpdGVybW9kZSkgIT0gU19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBnZXQgRGlzcGxheSBNb2RlIEl0ZXJhdG9yXG4iKTsKKyAgICAgICAgY3R4LT5kbC0+UmVsZWFzZSgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIC8qIFNldHVwIHN0cmVhbXMuICovCisgICAgZm9yIChuID0gMDsgbiA8IGF2Y3R4LT5uYl9zdHJlYW1zOyBuKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZjdHgtPnN0cmVhbXNbbl07CisgICAgICAgIEFWQ29kZWNDb250ZXh0ICpjID0gc3QtPmNvZGVjOworICAgICAgICBpZiAgICAgICAgKGMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoZGVja2xpbmtfc2V0dXBfYXVkaW8oYXZjdHgsIHN0KSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9IGVsc2UgaWYgKGMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBpZiAoZGVja2xpbmtfc2V0dXBfdmlkZW8oYXZjdHgsIHN0KSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBzdHJlYW0gdHlwZS5cbiIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpdGVybW9kZS0+UmVsZWFzZSgpOworCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorCisgICAgY3R4LT5kbG8tPlJlbGVhc2UoKTsKKyAgICBjdHgtPmRsLT5SZWxlYXNlKCk7CisKKyAgICByZXR1cm4gQVZFUlJPUihFSU8pOworfQorCitpbnQgZmZfZGVja2xpbmtfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKikgYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKSBjY3R4LT5jdHg7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZjdHgtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworCisgICAgY3R4LT5sYXN0X3B0cyA9IEZGTUFYKGN0eC0+bGFzdF9wdHMsIHBrdC0+cHRzKTsKKworICAgIGlmICAgICAgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIHJldHVybiBkZWNrbGlua193cml0ZV92aWRlb19wYWNrZXQoYXZjdHgsIHBrdCk7CisgICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgcmV0dXJuIGRlY2tsaW5rX3dyaXRlX2F1ZGlvX3BhY2tldChhdmN0eCwgcGt0KTsKKworICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Cit9CisKK30gLyogZXh0ZXJuICJDIiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2VuYy5oIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwODY5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvZGVja2xpbmtfZW5jLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIEJsYWNrbWFnaWMgRGVja0xpbmsgb3V0cHV0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBSYW1pcm8gUG9sbGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitpbnQgZmZfZGVja2xpbmtfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpOworaW50IGZmX2RlY2tsaW5rX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0KTsKK2ludCBmZl9kZWNrbGlua193cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZXh0ZXJuICJDIiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvZGVja2xpbmtfZW5jX2MuYyBiL2ZmbXBlZy9saWJhdmRldmljZS9kZWNrbGlua19lbmNfYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzkwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvZGVja2xpbmtfZW5jX2MuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQmxhY2ttYWdpYyBEZWNrTGluayBvdXRwdXQKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFJhbWlybyBQb2xsYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJkZWNrbGlua19jb21tb25fYy5oIgorI2luY2x1ZGUgImRlY2tsaW5rX2VuYy5oIgorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihzdHJ1Y3QgZGVja2xpbmtfY2N0eCwgeCkKKyNkZWZpbmUgRU5DIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImxpc3RfZGV2aWNlcyIsICJsaXN0IGF2YWlsYWJsZSBkZXZpY2VzIiAgLCBPRkZTRVQobGlzdF9kZXZpY2VzKSwgQVZfT1BUX1RZUEVfSU5UICAgLCB7IC5pNjQgPSAwICAgfSwgMCwgMSwgRU5DIH0sCisgICAgeyAibGlzdF9mb3JtYXRzIiwgImxpc3Qgc3VwcG9ydGVkIGZvcm1hdHMiICAsIE9GRlNFVChsaXN0X2Zvcm1hdHMpLCBBVl9PUFRfVFlQRV9JTlQgICAsIHsgLmk2NCA9IDAgICB9LCAwLCAxLCBFTkMgfSwKKyAgICB7ICJwcmVyb2xsIiAgICAgLCAidmlkZW8gcHJlcm9sbCBpbiBzZWNvbmRzIiwgT0ZGU0VUKHByZXJvbGwgICAgICksIEFWX09QVF9UWVBFX0RPVUJMRSwgeyAuZGJsID0gMC41IH0sIDAsIDUsIEVOQyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZGVja2xpbmtfbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiQmxhY2ttYWdpYyBEZWNrTGluayBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfVklERU9fT1VUUFVULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfZGVja2xpbmtfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImRlY2tsaW5rIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQmxhY2ttYWdpYyBEZWNrTGluayBvdXRwdXQiKSwKKyAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCisgICAgLnN1YnRpdGxlX2NvZGVjID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUgfCBBVkZNVF9SQVdQSUNUVVJFLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZkZWNrbGlua19tdXhlcl9jbGFzcywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGRlY2tsaW5rX2NjdHgpLAorICAgIC53cml0ZV9oZWFkZXIgICA9IGZmX2RlY2tsaW5rX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBmZl9kZWNrbGlua193cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gZmZfZGVja2xpbmtfd3JpdGVfdHJhaWxlciwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvZHNob3cuYyBiL2ZmbXBlZy9saWJhdmRldmljZS9kc2hvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDA4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvZHNob3cuYwpAQCAtMCwwICsxLDExMDAgQEAKKy8qCisgKiBEaXJlY3RzaG93IGNhcHR1cmUgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmFtaXJvIFBvbGxhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkc2hvd19jYXB0dXJlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L3JpZmYuaCIKKyNpbmNsdWRlICJhdmRldmljZS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvcmF3LmgiCisKK3N0cnVjdCBkc2hvd19jdHggeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgSUdyYXBoQnVpbGRlciAqZ3JhcGg7CisKKyAgICBjaGFyICpkZXZpY2VfbmFtZVsyXTsKKyAgICBpbnQgdmlkZW9fZGV2aWNlX251bWJlcjsKKyAgICBpbnQgYXVkaW9fZGV2aWNlX251bWJlcjsKKworICAgIGludCAgIGxpc3Rfb3B0aW9uczsKKyAgICBpbnQgICBsaXN0X2RldmljZXM7CisgICAgaW50ICAgYXVkaW9fYnVmZmVyX3NpemU7CisKKyAgICBJQmFzZUZpbHRlciAqZGV2aWNlX2ZpbHRlclsyXTsKKyAgICBJUGluICAgICAgICAqZGV2aWNlX3BpblsyXTsKKyAgICBsaWJBVkZpbHRlciAqY2FwdHVyZV9maWx0ZXJbMl07CisgICAgbGliQVZQaW4gICAgKmNhcHR1cmVfcGluWzJdOworCisgICAgSEFORExFIG11dGV4OworICAgIEhBTkRMRSBldmVudFsyXTsgLyogZXZlbnRbMF0gaXMgc2V0IGJ5IERpcmVjdFNob3cKKyAgICAgICAgICAgICAgICAgICAgICAqIGV2ZW50WzFdIGlzIHNldCBieSBjYWxsYmFjaygpICovCisgICAgQVZQYWNrZXRMaXN0ICpwa3RsOworCisgICAgaW50IGVvZjsKKworICAgIGludDY0X3QgY3VyYnVmc2l6ZVsyXTsKKyAgICB1bnNpZ25lZCBpbnQgdmlkZW9fZnJhbWVfbnVtOworCisgICAgSU1lZGlhQ29udHJvbCAqY29udHJvbDsKKyAgICBJTWVkaWFFdmVudCAqbWVkaWFfZXZlbnQ7CisKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4ZWxfZm9ybWF0OworICAgIGVudW0gQVZDb2RlY0lEIHZpZGVvX2NvZGVjX2lkOworICAgIGNoYXIgKmZyYW1lcmF0ZTsKKworICAgIGludCByZXF1ZXN0ZWRfd2lkdGg7CisgICAgaW50IHJlcXVlc3RlZF9oZWlnaHQ7CisgICAgQVZSYXRpb25hbCByZXF1ZXN0ZWRfZnJhbWVyYXRlOworCisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGludCBzYW1wbGVfc2l6ZTsKKyAgICBpbnQgY2hhbm5lbHM7Cit9OworCitzdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IGRzaG93X3BpeGZtdChEV09SRCBiaUNvbXByZXNzaW9uLCBXT1JEIGJpQml0Q291bnQpCit7CisgICAgc3dpdGNoKGJpQ29tcHJlc3Npb24pIHsKKyAgICBjYXNlIEJJX0JJVEZJRUxEUzoKKyAgICBjYXNlIEJJX1JHQjoKKyAgICAgICAgc3dpdGNoKGJpQml0Q291bnQpIHsgLyogMS04IGFyZSB1bnRlc3RlZCAqLworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX01PTk9XSElURTsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZfUElYX0ZNVF9SR0I0OworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX1JHQjg7CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX1JHQjU1NTsKKyAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfQkdSMjQ7CisgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UXzBSR0IzMjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXZwcml2X2ZpbmRfcGl4X2ZtdChhdnByaXZfZ2V0X3Jhd19waXhfZm10X3RhZ3MoKSwgYmlDb21wcmVzc2lvbik7IC8vIGFsbCBvdGhlcnMKK30KKworc3RhdGljIGludAorZHNob3dfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgc3RydWN0IGRzaG93X2N0eCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIEFWUGFja2V0TGlzdCAqcGt0bDsKKworICAgIGlmIChjdHgtPmNvbnRyb2wpIHsKKyAgICAgICAgSU1lZGlhQ29udHJvbF9TdG9wKGN0eC0+Y29udHJvbCk7CisgICAgICAgIElNZWRpYUNvbnRyb2xfUmVsZWFzZShjdHgtPmNvbnRyb2wpOworICAgIH0KKworICAgIGlmIChjdHgtPm1lZGlhX2V2ZW50KQorICAgICAgICBJTWVkaWFFdmVudF9SZWxlYXNlKGN0eC0+bWVkaWFfZXZlbnQpOworCisgICAgaWYgKGN0eC0+Z3JhcGgpIHsKKyAgICAgICAgSUVudW1GaWx0ZXJzICpmZW51bTsKKyAgICAgICAgaW50IHI7CisgICAgICAgIHIgPSBJR3JhcGhCdWlsZGVyX0VudW1GaWx0ZXJzKGN0eC0+Z3JhcGgsICZmZW51bSk7CisgICAgICAgIGlmIChyID09IFNfT0spIHsKKyAgICAgICAgICAgIElCYXNlRmlsdGVyICpmOworICAgICAgICAgICAgSUVudW1GaWx0ZXJzX1Jlc2V0KGZlbnVtKTsKKyAgICAgICAgICAgIHdoaWxlIChJRW51bUZpbHRlcnNfTmV4dChmZW51bSwgMSwgJmYsIE5VTEwpID09IFNfT0spIHsKKyAgICAgICAgICAgICAgICBpZiAoSUdyYXBoQnVpbGRlcl9SZW1vdmVGaWx0ZXIoY3R4LT5ncmFwaCwgZikgPT0gU19PSykKKyAgICAgICAgICAgICAgICAgICAgSUVudW1GaWx0ZXJzX1Jlc2V0KGZlbnVtKTsgLyogV2hlbiBhIGZpbHRlciBpcyByZW1vdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbGlzdCBtdXN0IGJlIHJlc2V0LiAqLworICAgICAgICAgICAgICAgIElCYXNlRmlsdGVyX1JlbGVhc2UoZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJRW51bUZpbHRlcnNfUmVsZWFzZShmZW51bSk7CisgICAgICAgIH0KKyAgICAgICAgSUdyYXBoQnVpbGRlcl9SZWxlYXNlKGN0eC0+Z3JhcGgpOworICAgIH0KKworICAgIGlmIChjdHgtPmNhcHR1cmVfcGluW1ZpZGVvRGV2aWNlXSkKKyAgICAgICAgbGliQVZQaW5fUmVsZWFzZShjdHgtPmNhcHR1cmVfcGluW1ZpZGVvRGV2aWNlXSk7CisgICAgaWYgKGN0eC0+Y2FwdHVyZV9waW5bQXVkaW9EZXZpY2VdKQorICAgICAgICBsaWJBVlBpbl9SZWxlYXNlKGN0eC0+Y2FwdHVyZV9waW5bQXVkaW9EZXZpY2VdKTsKKyAgICBpZiAoY3R4LT5jYXB0dXJlX2ZpbHRlcltWaWRlb0RldmljZV0pCisgICAgICAgIGxpYkFWRmlsdGVyX1JlbGVhc2UoY3R4LT5jYXB0dXJlX2ZpbHRlcltWaWRlb0RldmljZV0pOworICAgIGlmIChjdHgtPmNhcHR1cmVfZmlsdGVyW0F1ZGlvRGV2aWNlXSkKKyAgICAgICAgbGliQVZGaWx0ZXJfUmVsZWFzZShjdHgtPmNhcHR1cmVfZmlsdGVyW0F1ZGlvRGV2aWNlXSk7CisKKyAgICBpZiAoY3R4LT5kZXZpY2VfcGluW1ZpZGVvRGV2aWNlXSkKKyAgICAgICAgSVBpbl9SZWxlYXNlKGN0eC0+ZGV2aWNlX3BpbltWaWRlb0RldmljZV0pOworICAgIGlmIChjdHgtPmRldmljZV9waW5bQXVkaW9EZXZpY2VdKQorICAgICAgICBJUGluX1JlbGVhc2UoY3R4LT5kZXZpY2VfcGluW0F1ZGlvRGV2aWNlXSk7CisgICAgaWYgKGN0eC0+ZGV2aWNlX2ZpbHRlcltWaWRlb0RldmljZV0pCisgICAgICAgIElCYXNlRmlsdGVyX1JlbGVhc2UoY3R4LT5kZXZpY2VfZmlsdGVyW1ZpZGVvRGV2aWNlXSk7CisgICAgaWYgKGN0eC0+ZGV2aWNlX2ZpbHRlcltBdWRpb0RldmljZV0pCisgICAgICAgIElCYXNlRmlsdGVyX1JlbGVhc2UoY3R4LT5kZXZpY2VfZmlsdGVyW0F1ZGlvRGV2aWNlXSk7CisKKyAgICBpZiAoY3R4LT5kZXZpY2VfbmFtZVswXSkKKyAgICAgICAgYXZfZnJlZShjdHgtPmRldmljZV9uYW1lWzBdKTsKKyAgICBpZiAoY3R4LT5kZXZpY2VfbmFtZVsxXSkKKyAgICAgICAgYXZfZnJlZShjdHgtPmRldmljZV9uYW1lWzFdKTsKKworICAgIGlmKGN0eC0+bXV0ZXgpCisgICAgICAgIENsb3NlSGFuZGxlKGN0eC0+bXV0ZXgpOworICAgIGlmKGN0eC0+ZXZlbnRbMF0pCisgICAgICAgIENsb3NlSGFuZGxlKGN0eC0+ZXZlbnRbMF0pOworICAgIGlmKGN0eC0+ZXZlbnRbMV0pCisgICAgICAgIENsb3NlSGFuZGxlKGN0eC0+ZXZlbnRbMV0pOworCisgICAgcGt0bCA9IGN0eC0+cGt0bDsKKyAgICB3aGlsZSAocGt0bCkgeworICAgICAgICBBVlBhY2tldExpc3QgKm5leHQgPSBwa3RsLT5uZXh0OworICAgICAgICBhdl9kZXN0cnVjdF9wYWNrZXQoJnBrdGwtPnBrdCk7CisgICAgICAgIGF2X2ZyZWUocGt0bCk7CisgICAgICAgIHBrdGwgPSBuZXh0OworICAgIH0KKworICAgIENvVW5pbml0aWFsaXplKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKmR1cF93Y2hhcl90b191dGY4KHdjaGFyX3QgKncpCit7CisgICAgY2hhciAqcyA9IE5VTEw7CisgICAgaW50IGwgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsIDAsIHcsIC0xLCAwLCAwLCAwLCAwKTsKKyAgICBzID0gYXZfbWFsbG9jKGwpOworICAgIGlmIChzKQorICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsIDAsIHcsIC0xLCBzLCBsLCAwLCAwKTsKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIGludCBzaGFsbF93ZV9kcm9wKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGluZGV4LCBlbnVtIGRzaG93RGV2aWNlVHlwZSBkZXZ0eXBlKQoreworICAgIHN0cnVjdCBkc2hvd19jdHggKmN0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkcm9wc2NvcmVbXSA9IHs2MiwgNzUsIDg3LCAxMDB9OworICAgIGNvbnN0IGludCBuZHJvcHNjb3JlcyA9IEZGX0FSUkFZX0VMRU1TKGRyb3BzY29yZSk7CisgICAgdW5zaWduZWQgaW50IGJ1ZmZlcl9mdWxsbmVzcyA9IChjdHgtPmN1cmJ1ZnNpemVbaW5kZXhdKjEwMCkvcy0+bWF4X3BpY3R1cmVfYnVmZmVyOworCisgICAgaWYoZHJvcHNjb3JlWysrY3R4LT52aWRlb19mcmFtZV9udW0lbmRyb3BzY29yZXNdIDw9IGJ1ZmZlcl9mdWxsbmVzcykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAicmVhbC10aW1lIGJ1ZmZlclslc10gdG9vIGZ1bGwgKCVkJSUgb2Ygc2l6ZTogJWQpISBmcmFtZSBkcm9wcGVkIVxuIiwgY3R4LT5kZXZpY2VfbmFtZVtkZXZ0eXBlXSwgYnVmZmVyX2Z1bGxuZXNzLCBzLT5tYXhfcGljdHVyZV9idWZmZXIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2NhbGxiYWNrKHZvaWQgKnByaXZfZGF0YSwgaW50IGluZGV4LCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50NjRfdCB0aW1lLCBlbnVtIGRzaG93RGV2aWNlVHlwZSBkZXZ0eXBlKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqcyA9IHByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZHNob3dfY3R4ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQVZQYWNrZXRMaXN0ICoqcHBrdGwsICpwa3RsX25leHQ7CisKKy8vICAgIGR1bXBfdmlkZW9oZHIocywgdmRoZHIpOworCisgICAgV2FpdEZvclNpbmdsZU9iamVjdChjdHgtPm11dGV4LCBJTkZJTklURSk7CisKKyAgICBpZihzaGFsbF93ZV9kcm9wKHMsIGluZGV4LCBkZXZ0eXBlKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcGt0bF9uZXh0ID0gYXZfbWFsbG9jeihzaXplb2YoQVZQYWNrZXRMaXN0KSk7CisgICAgaWYoIXBrdGxfbmV4dCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYoYXZfbmV3X3BhY2tldCgmcGt0bF9uZXh0LT5wa3QsIGJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgYXZfZnJlZShwa3RsX25leHQpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcGt0bF9uZXh0LT5wa3Quc3RyZWFtX2luZGV4ID0gaW5kZXg7CisgICAgcGt0bF9uZXh0LT5wa3QucHRzID0gdGltZTsKKyAgICBtZW1jcHkocGt0bF9uZXh0LT5wa3QuZGF0YSwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICBmb3IocHBrdGwgPSAmY3R4LT5wa3RsIDsgKnBwa3RsIDsgcHBrdGwgPSAmKCpwcGt0bCktPm5leHQpOworICAgICpwcGt0bCA9IHBrdGxfbmV4dDsKKyAgICBjdHgtPmN1cmJ1ZnNpemVbaW5kZXhdICs9IGJ1Zl9zaXplOworCisgICAgU2V0RXZlbnQoY3R4LT5ldmVudFsxXSk7CisgICAgUmVsZWFzZU11dGV4KGN0eC0+bXV0ZXgpOworCisgICAgcmV0dXJuOworZmFpbDoKKyAgICBSZWxlYXNlTXV0ZXgoY3R4LT5tdXRleCk7CisgICAgcmV0dXJuOworfQorCisvKioKKyAqIEN5Y2xlIHRocm91Z2ggYXZhaWxhYmxlIGRldmljZXMgdXNpbmcgdGhlIGRldmljZSBlbnVtZXJhdG9yIGRldmVudW0sCisgKiByZXRyaWV2ZSB0aGUgZGV2aWNlIHdpdGggdHlwZSBzcGVjaWZpZWQgYnkgZGV2dHlwZSBhbmQgcmV0dXJuIHRoZQorICogcG9pbnRlciB0byB0aGUgb2JqZWN0IGZvdW5kIGluICpwZmlsdGVyLgorICogSWYgcGZpbHRlciBpcyBOVUxMLCBsaXN0IGFsbCBkZXZpY2UgbmFtZXMuCisgKi8KK3N0YXRpYyBpbnQKK2RzaG93X2N5Y2xlX2RldmljZXMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgSUNyZWF0ZURldkVudW0gKmRldmVudW0sCisgICAgICAgICAgICAgICAgICAgIGVudW0gZHNob3dEZXZpY2VUeXBlIGRldnR5cGUsIElCYXNlRmlsdGVyICoqcGZpbHRlcikKK3sKKyAgICBzdHJ1Y3QgZHNob3dfY3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIElCYXNlRmlsdGVyICpkZXZpY2VfZmlsdGVyID0gTlVMTDsKKyAgICBJRW51bU1vbmlrZXIgKmNsYXNzZW51bSA9IE5VTEw7CisgICAgSU1vbmlrZXIgKm0gPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lID0gY3R4LT5kZXZpY2VfbmFtZVtkZXZ0eXBlXTsKKyAgICBpbnQgc2tpcCA9IChkZXZ0eXBlID09IFZpZGVvRGV2aWNlKSA/IGN0eC0+dmlkZW9fZGV2aWNlX251bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3R4LT5hdWRpb19kZXZpY2VfbnVtYmVyOworICAgIGludCByOworCisgICAgY29uc3QgR1VJRCAqZGV2aWNlX2d1aWRbMl0gPSB7ICZDTFNJRF9WaWRlb0lucHV0RGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDTFNJRF9BdWRpb0lucHV0RGV2aWNlQ2F0ZWdvcnkgfTsKKyAgICBjb25zdCBjaGFyICpkZXZ0eXBlbmFtZSA9IChkZXZ0eXBlID09IFZpZGVvRGV2aWNlKSA/ICJ2aWRlbyIgOiAiYXVkaW8iOworCisgICAgciA9IElDcmVhdGVEZXZFbnVtX0NyZWF0ZUNsYXNzRW51bWVyYXRvcihkZXZlbnVtLCBkZXZpY2VfZ3VpZFtkZXZ0eXBlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRW51bU1vbmlrZXIgKiopICZjbGFzc2VudW0sIDApOworICAgIGlmIChyICE9IFNfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZW51bWVyYXRlICVzIGRldmljZXMuXG4iLAorICAgICAgICAgICAgICAgZGV2dHlwZW5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHdoaWxlICghZGV2aWNlX2ZpbHRlciAmJiBJRW51bU1vbmlrZXJfTmV4dChjbGFzc2VudW0sIDEsICZtLCBOVUxMKSA9PSBTX09LKSB7CisgICAgICAgIElQcm9wZXJ0eUJhZyAqYmFnID0gTlVMTDsKKyAgICAgICAgY2hhciAqYnVmID0gTlVMTDsKKyAgICAgICAgVkFSSUFOVCB2YXI7CisKKyAgICAgICAgciA9IElNb25pa2VyX0JpbmRUb1N0b3JhZ2UobSwgMCwgMCwgJklJRF9JUHJvcGVydHlCYWcsICh2b2lkICopICZiYWcpOworICAgICAgICBpZiAociAhPSBTX09LKQorICAgICAgICAgICAgZ290byBmYWlsMTsKKworICAgICAgICB2YXIudnQgPSBWVF9CU1RSOworICAgICAgICByID0gSVByb3BlcnR5QmFnX1JlYWQoYmFnLCBMIkZyaWVuZGx5TmFtZSIsICZ2YXIsIE5VTEwpOworICAgICAgICBpZiAociAhPSBTX09LKQorICAgICAgICAgICAgZ290byBmYWlsMTsKKworICAgICAgICBidWYgPSBkdXBfd2NoYXJfdG9fdXRmOCh2YXIuYnN0clZhbCk7CisKKyAgICAgICAgaWYgKHBmaWx0ZXIpIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoZGV2aWNlX25hbWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgZ290byBmYWlsMTsKKworICAgICAgICAgICAgaWYgKCFza2lwLS0pCisgICAgICAgICAgICAgICAgSU1vbmlrZXJfQmluZFRvT2JqZWN0KG0sIDAsIDAsICZJSURfSUJhc2VGaWx0ZXIsICh2b2lkICopICZkZXZpY2VfZmlsdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICIgXCIlc1wiXG4iLCBidWYpOworICAgICAgICB9CisKK2ZhaWwxOgorICAgICAgICBpZiAoYnVmKQorICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICBpZiAoYmFnKQorICAgICAgICAgICAgSVByb3BlcnR5QmFnX1JlbGVhc2UoYmFnKTsKKyAgICAgICAgSU1vbmlrZXJfUmVsZWFzZShtKTsKKyAgICB9CisKKyAgICBJRW51bU1vbmlrZXJfUmVsZWFzZShjbGFzc2VudW0pOworCisgICAgaWYgKHBmaWx0ZXIpIHsKKyAgICAgICAgaWYgKCFkZXZpY2VfZmlsdGVyKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBmaW5kICVzIGRldmljZS5cbiIsCisgICAgICAgICAgICAgICAgICAgZGV2dHlwZW5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorICAgICAgICAqcGZpbHRlciA9IGRldmljZV9maWx0ZXI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ3ljbGUgdGhyb3VnaCBhdmFpbGFibGUgZm9ybWF0cyB1c2luZyB0aGUgc3BlY2lmaWVkIHBpbiwKKyAqIHRyeSB0byBzZXQgcGFyYW1ldGVycyBzcGVjaWZpZWQgdGhyb3VnaCBBVk9wdGlvbnMgYW5kIGlmIHN1Y2Nlc3NmdWwKKyAqIHJldHVybiAxIGluICpwZm9ybWF0X3NldC4KKyAqIElmIHBmb3JtYXRfc2V0IGlzIE5VTEwsIGxpc3QgYWxsIHBpbiBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyB2b2lkCitkc2hvd19jeWNsZV9mb3JtYXRzKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIGVudW0gZHNob3dEZXZpY2VUeXBlIGRldnR5cGUsCisgICAgICAgICAgICAgICAgICAgIElQaW4gKnBpbiwgaW50ICpwZm9ybWF0X3NldCkKK3sKKyAgICBzdHJ1Y3QgZHNob3dfY3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIElBTVN0cmVhbUNvbmZpZyAqY29uZmlnID0gTlVMTDsKKyAgICBBTV9NRURJQV9UWVBFICp0eXBlID0gTlVMTDsKKyAgICBpbnQgZm9ybWF0X3NldCA9IDA7CisgICAgdm9pZCAqY2FwcyA9IE5VTEw7CisgICAgaW50IGksIG4sIHNpemU7CisKKyAgICBpZiAoSVBpbl9RdWVyeUludGVyZmFjZShwaW4sICZJSURfSUFNU3RyZWFtQ29uZmlnLCAodm9pZCAqKikgJmNvbmZpZykgIT0gU19PSykKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChJQU1TdHJlYW1Db25maWdfR2V0TnVtYmVyT2ZDYXBhYmlsaXRpZXMoY29uZmlnLCAmbiwgJnNpemUpICE9IFNfT0spCisgICAgICAgIGdvdG8gZW5kOworCisgICAgY2FwcyA9IGF2X21hbGxvYyhzaXplKTsKKyAgICBpZiAoIWNhcHMpCisgICAgICAgIGdvdG8gZW5kOworCisgICAgZm9yIChpID0gMDsgaSA8IG4gJiYgIWZvcm1hdF9zZXQ7IGkrKykgeworICAgICAgICBJQU1TdHJlYW1Db25maWdfR2V0U3RyZWFtQ2Fwcyhjb25maWcsIGksICZ0eXBlLCAodm9pZCAqKSBjYXBzKTsKKworI2lmIERTSE9XREVCVUcKKyAgICAgICAgZmZfcHJpbnRfQU1fTUVESUFfVFlQRSh0eXBlKTsKKyNlbmRpZgorCisgICAgICAgIGlmIChkZXZ0eXBlID09IFZpZGVvRGV2aWNlKSB7CisgICAgICAgICAgICBWSURFT19TVFJFQU1fQ09ORklHX0NBUFMgKnZjYXBzID0gY2FwczsKKyAgICAgICAgICAgIEJJVE1BUElORk9IRUFERVIgKmJpaDsKKyAgICAgICAgICAgIGludDY0X3QgKmZyOworICAgICAgICAgICAgY29uc3QgQVZDb2RlY1RhZyAqY29uc3QgdGFnc1tdID0geyBhdmZvcm1hdF9nZXRfcmlmZl92aWRlb190YWdzKCksIE5VTEwgfTsKKyNpZiBEU0hPV0RFQlVHCisgICAgICAgICAgICBmZl9wcmludF9WSURFT19TVFJFQU1fQ09ORklHX0NBUFModmNhcHMpOworI2VuZGlmCisgICAgICAgICAgICBpZiAoSXNFcXVhbEdVSUQoJnR5cGUtPmZvcm1hdHR5cGUsICZGT1JNQVRfVmlkZW9JbmZvKSkgeworICAgICAgICAgICAgICAgIFZJREVPSU5GT0hFQURFUiAqdiA9ICh2b2lkICopIHR5cGUtPnBiRm9ybWF0OworICAgICAgICAgICAgICAgIGZyID0gJnYtPkF2Z1RpbWVQZXJGcmFtZTsKKyAgICAgICAgICAgICAgICBiaWggPSAmdi0+Ym1pSGVhZGVyOworICAgICAgICAgICAgfSBlbHNlIGlmIChJc0VxdWFsR1VJRCgmdHlwZS0+Zm9ybWF0dHlwZSwgJkZPUk1BVF9WaWRlb0luZm8yKSkgeworICAgICAgICAgICAgICAgIFZJREVPSU5GT0hFQURFUjIgKnYgPSAodm9pZCAqKSB0eXBlLT5wYkZvcm1hdDsKKyAgICAgICAgICAgICAgICBmciA9ICZ2LT5BdmdUaW1lUGVyRnJhbWU7CisgICAgICAgICAgICAgICAgYmloID0gJnYtPmJtaUhlYWRlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwZm9ybWF0X3NldCkgeworICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10ID0gZHNob3dfcGl4Zm10KGJpaC0+YmlDb21wcmVzc2lvbiwgYmloLT5iaUJpdENvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQgPSBhdl9jb2RlY19nZXRfaWQodGFncywgYmloLT5iaUNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgQVZDb2RlYyAqY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2Rlcihjb2RlY19pZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FIHx8ICFjb2RlYykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIiAgdW5rbm93biBjb21wcmVzc2lvbiB0eXBlIDB4JVgiLCAoaW50KSBiaWgtPmJpQ29tcHJlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIiAgdmNvZGVjPSVzIiwgY29kZWMtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIiAgcGl4ZWxfZm9ybWF0PSVzIiwgYXZfZ2V0X3BpeF9mbXRfbmFtZShwaXhfZm10KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICIgIG1pbiBzPSVsZHglbGQgZnBzPSVnIG1heCBzPSVsZHglbGQgZnBzPSVnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB2Y2Fwcy0+TWluT3V0cHV0U2l6ZS5jeCwgdmNhcHMtPk1pbk91dHB1dFNpemUuY3ksCisgICAgICAgICAgICAgICAgICAgICAgIDFlNyAvIHZjYXBzLT5NYXhGcmFtZUludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICB2Y2Fwcy0+TWF4T3V0cHV0U2l6ZS5jeCwgdmNhcHMtPk1heE91dHB1dFNpemUuY3ksCisgICAgICAgICAgICAgICAgICAgICAgIDFlNyAvIHZjYXBzLT5NaW5GcmFtZUludGVydmFsKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdHgtPnZpZGVvX2NvZGVjX2lkICE9IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+dmlkZW9fY29kZWNfaWQgIT0gYXZfY29kZWNfZ2V0X2lkKHRhZ3MsIGJpaC0+YmlDb21wcmVzc2lvbikpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdHgtPnBpeGVsX2Zvcm1hdCAhPSBBVl9QSVhfRk1UX05PTkUgJiYKKyAgICAgICAgICAgICAgICBjdHgtPnBpeGVsX2Zvcm1hdCAhPSBkc2hvd19waXhmbXQoYmloLT5iaUNvbXByZXNzaW9uLCBiaWgtPmJpQml0Q291bnQpKSB7CisgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN0eC0+ZnJhbWVyYXRlKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZXJhdGUgPSAoKGludDY0X3QpIGN0eC0+cmVxdWVzdGVkX2ZyYW1lcmF0ZS5kZW4qMTAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gIGN0eC0+cmVxdWVzdGVkX2ZyYW1lcmF0ZS5udW07CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lcmF0ZSA+IHZjYXBzLT5NYXhGcmFtZUludGVydmFsIHx8CisgICAgICAgICAgICAgICAgICAgIGZyYW1lcmF0ZSA8IHZjYXBzLT5NaW5GcmFtZUludGVydmFsKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICAgICAgKmZyID0gZnJhbWVyYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN0eC0+cmVxdWVzdGVkX3dpZHRoICYmIGN0eC0+cmVxdWVzdGVkX2hlaWdodCkgeworICAgICAgICAgICAgICAgIGlmIChjdHgtPnJlcXVlc3RlZF93aWR0aCAgPiB2Y2Fwcy0+TWF4T3V0cHV0U2l6ZS5jeCB8fAorICAgICAgICAgICAgICAgICAgICBjdHgtPnJlcXVlc3RlZF93aWR0aCAgPCB2Y2Fwcy0+TWluT3V0cHV0U2l6ZS5jeCB8fAorICAgICAgICAgICAgICAgICAgICBjdHgtPnJlcXVlc3RlZF9oZWlnaHQgPiB2Y2Fwcy0+TWF4T3V0cHV0U2l6ZS5jeSB8fAorICAgICAgICAgICAgICAgICAgICBjdHgtPnJlcXVlc3RlZF9oZWlnaHQgPCB2Y2Fwcy0+TWluT3V0cHV0U2l6ZS5jeSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAgIGJpaC0+YmlXaWR0aCAgPSBjdHgtPnJlcXVlc3RlZF93aWR0aDsKKyAgICAgICAgICAgICAgICBiaWgtPmJpSGVpZ2h0ID0gY3R4LT5yZXF1ZXN0ZWRfaGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVVESU9fU1RSRUFNX0NPTkZJR19DQVBTICphY2FwcyA9IGNhcHM7CisgICAgICAgICAgICBXQVZFRk9STUFURVggKmZ4OworI2lmIERTSE9XREVCVUcKKyAgICAgICAgICAgIGZmX3ByaW50X0FVRElPX1NUUkVBTV9DT05GSUdfQ0FQUyhhY2Fwcyk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChJc0VxdWFsR1VJRCgmdHlwZS0+Zm9ybWF0dHlwZSwgJkZPUk1BVF9XYXZlRm9ybWF0RXgpKSB7CisgICAgICAgICAgICAgICAgZnggPSAodm9pZCAqKSB0eXBlLT5wYkZvcm1hdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwZm9ybWF0X3NldCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICIgIG1pbiBjaD0lbHUgYml0cz0lbHUgcmF0ZT0lNmx1IG1heCBjaD0lbHUgYml0cz0lbHUgcmF0ZT0lNmx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhY2Fwcy0+TWluaW11bUNoYW5uZWxzLCBhY2Fwcy0+TWluaW11bUJpdHNQZXJTYW1wbGUsIGFjYXBzLT5NaW5pbXVtU2FtcGxlRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICBhY2Fwcy0+TWF4aW11bUNoYW5uZWxzLCBhY2Fwcy0+TWF4aW11bUJpdHNQZXJTYW1wbGUsIGFjYXBzLT5NYXhpbXVtU2FtcGxlRnJlcXVlbmN5KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdHgtPnNhbXBsZV9yYXRlKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+c2FtcGxlX3JhdGUgPiBhY2Fwcy0+TWF4aW11bVNhbXBsZUZyZXF1ZW5jeSB8fAorICAgICAgICAgICAgICAgICAgICBjdHgtPnNhbXBsZV9yYXRlIDwgYWNhcHMtPk1pbmltdW1TYW1wbGVGcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgICAgICAgICBmeC0+blNhbXBsZXNQZXJTZWMgPSBjdHgtPnNhbXBsZV9yYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN0eC0+c2FtcGxlX3NpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3R4LT5zYW1wbGVfc2l6ZSA+IGFjYXBzLT5NYXhpbXVtQml0c1BlclNhbXBsZSB8fAorICAgICAgICAgICAgICAgICAgICBjdHgtPnNhbXBsZV9zaXplIDwgYWNhcHMtPk1pbmltdW1CaXRzUGVyU2FtcGxlKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICAgICAgZngtPndCaXRzUGVyU2FtcGxlID0gY3R4LT5zYW1wbGVfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+Y2hhbm5lbHMgPiBhY2Fwcy0+TWF4aW11bUNoYW5uZWxzIHx8CisgICAgICAgICAgICAgICAgICAgIGN0eC0+Y2hhbm5lbHMgPCBhY2Fwcy0+TWluaW11bUNoYW5uZWxzKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICAgICAgZngtPm5DaGFubmVscyA9IGN0eC0+Y2hhbm5lbHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKElBTVN0cmVhbUNvbmZpZ19TZXRGb3JtYXQoY29uZmlnLCB0eXBlKSAhPSBTX09LKQorICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICBmb3JtYXRfc2V0ID0gMTsKK25leHQ6CisgICAgICAgIGlmICh0eXBlLT5wYkZvcm1hdCkKKyAgICAgICAgICAgIENvVGFza01lbUZyZWUodHlwZS0+cGJGb3JtYXQpOworICAgICAgICBDb1Rhc2tNZW1GcmVlKHR5cGUpOworICAgIH0KK2VuZDoKKyAgICBJQU1TdHJlYW1Db25maWdfUmVsZWFzZShjb25maWcpOworICAgIGlmIChjYXBzKQorICAgICAgICBhdl9mcmVlKGNhcHMpOworICAgIGlmIChwZm9ybWF0X3NldCkKKyAgICAgICAgKnBmb3JtYXRfc2V0ID0gZm9ybWF0X3NldDsKK30KKworLyoqCisgKiBTZXQgYXVkaW8gZGV2aWNlIGJ1ZmZlciBzaXplIGluIG1pbGxpc2Vjb25kcyAod2hpY2ggY2FuIGRpcmVjdGx5IGltcGFjdAorICogbGF0ZW5jeSwgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpLgorICovCitzdGF0aWMgaW50Citkc2hvd19zZXRfYXVkaW9fYnVmZmVyX3NpemUoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgSVBpbiAqcGluKQoreworICAgIHN0cnVjdCBkc2hvd19jdHggKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgSUFNQnVmZmVyTmVnb3RpYXRpb24gKmJ1ZmZlcl9uZWdvdGlhdGlvbiA9IE5VTEw7CisgICAgQUxMT0NBVE9SX1BST1BFUlRJRVMgcHJvcHMgPSB7IC0xLCAtMSwgLTEsIC0xIH07CisgICAgSUFNU3RyZWFtQ29uZmlnICpjb25maWcgPSBOVUxMOworICAgIEFNX01FRElBX1RZUEUgKnR5cGUgPSBOVUxMOworICAgIGludCByZXQgPSBBVkVSUk9SKEVJTyk7CisKKyAgICBpZiAoSVBpbl9RdWVyeUludGVyZmFjZShwaW4sICZJSURfSUFNU3RyZWFtQ29uZmlnLCAodm9pZCAqKikgJmNvbmZpZykgIT0gU19PSykKKyAgICAgICAgZ290byBlbmQ7CisgICAgaWYgKElBTVN0cmVhbUNvbmZpZ19HZXRGb3JtYXQoY29uZmlnLCAmdHlwZSkgIT0gU19PSykKKyAgICAgICAgZ290byBlbmQ7CisgICAgaWYgKCFJc0VxdWFsR1VJRCgmdHlwZS0+Zm9ybWF0dHlwZSwgJkZPUk1BVF9XYXZlRm9ybWF0RXgpKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIHByb3BzLmNiQnVmZmVyID0gKCgoV0FWRUZPUk1BVEVYICopIHR5cGUtPnBiRm9ybWF0KS0+bkF2Z0J5dGVzUGVyU2VjKQorICAgICAgICAgICAgICAgICAgICogY3R4LT5hdWRpb19idWZmZXJfc2l6ZSAvIDEwMDA7CisKKyAgICBpZiAoSVBpbl9RdWVyeUludGVyZmFjZShwaW4sICZJSURfSUFNQnVmZmVyTmVnb3RpYXRpb24sICh2b2lkICoqKSAmYnVmZmVyX25lZ290aWF0aW9uKSAhPSBTX09LKQorICAgICAgICBnb3RvIGVuZDsKKyAgICBpZiAoSUFNQnVmZmVyTmVnb3RpYXRpb25fU3VnZ2VzdEFsbG9jYXRvclByb3BlcnRpZXMoYnVmZmVyX25lZ290aWF0aW9uLCAmcHJvcHMpICE9IFNfT0spCisgICAgICAgIGdvdG8gZW5kOworCisgICAgcmV0ID0gMDsKKworZW5kOgorICAgIGlmIChidWZmZXJfbmVnb3RpYXRpb24pCisgICAgICAgIElBTUJ1ZmZlck5lZ290aWF0aW9uX1JlbGVhc2UoYnVmZmVyX25lZ290aWF0aW9uKTsKKyAgICBpZiAodHlwZSkgeworICAgICAgICBpZiAodHlwZS0+cGJGb3JtYXQpCisgICAgICAgICAgICBDb1Rhc2tNZW1GcmVlKHR5cGUtPnBiRm9ybWF0KTsKKyAgICAgICAgQ29UYXNrTWVtRnJlZSh0eXBlKTsKKyAgICB9CisgICAgaWYgKGNvbmZpZykKKyAgICAgICAgSUFNU3RyZWFtQ29uZmlnX1JlbGVhc2UoY29uZmlnKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQ3ljbGUgdGhyb3VnaCBhdmFpbGFibGUgcGlucyB1c2luZyB0aGUgZGV2aWNlX2ZpbHRlciBkZXZpY2UsIG9mIHR5cGUKKyAqIGRldnR5cGUsIHJldHJpZXZlIHRoZSBmaXJzdCBvdXRwdXQgcGluIGFuZCByZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlCisgKiBvYmplY3QgZm91bmQgaW4gKnBwaW4uCisgKiBJZiBwcGluIGlzIE5VTEwsIGN5Y2xlIHRocm91Z2ggYWxsIHBpbnMgbGlzdGluZyBhdWRpby92aWRlbyBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBpbnQKK2RzaG93X2N5Y2xlX3BpbnMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgZW51bSBkc2hvd0RldmljZVR5cGUgZGV2dHlwZSwKKyAgICAgICAgICAgICAgICAgSUJhc2VGaWx0ZXIgKmRldmljZV9maWx0ZXIsIElQaW4gKipwcGluKQoreworICAgIHN0cnVjdCBkc2hvd19jdHggKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgSUVudW1QaW5zICpwaW5zID0gMDsKKyAgICBJUGluICpkZXZpY2VfcGluID0gTlVMTDsKKyAgICBJUGluICpwaW47CisgICAgaW50IHI7CisKKyAgICBjb25zdCBHVUlEICptZWRpYXR5cGVbMl0gPSB7ICZNRURJQVRZUEVfVmlkZW8sICZNRURJQVRZUEVfQXVkaW8gfTsKKyAgICBjb25zdCBjaGFyICpkZXZ0eXBlbmFtZSA9IChkZXZ0eXBlID09IFZpZGVvRGV2aWNlKSA/ICJ2aWRlbyIgOiAiYXVkaW8iOworCisgICAgaW50IHNldF9mb3JtYXQgPSAoZGV2dHlwZSA9PSBWaWRlb0RldmljZSAmJiAoY3R4LT5mcmFtZXJhdGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdHgtPnJlcXVlc3RlZF93aWR0aCAmJiBjdHgtPnJlcXVlc3RlZF9oZWlnaHQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5waXhlbF9mb3JtYXQgIT0gQVZfUElYX0ZNVF9OT05FIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52aWRlb19jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9SQVdWSURFTykpCisgICAgICAgICAgICAgICAgICB8fCAoZGV2dHlwZSA9PSBBdWRpb0RldmljZSAmJiAoY3R4LT5jaGFubmVscyB8fCBjdHgtPnNhbXBsZV9yYXRlKSk7CisgICAgaW50IGZvcm1hdF9zZXQgPSAwOworCisgICAgciA9IElCYXNlRmlsdGVyX0VudW1QaW5zKGRldmljZV9maWx0ZXIsICZwaW5zKTsKKyAgICBpZiAociAhPSBTX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGVudW1lcmF0ZSBwaW5zLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgaWYgKCFwcGluKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJEaXJlY3RTaG93ICVzIGRldmljZSBvcHRpb25zXG4iLAorICAgICAgICAgICAgICAgZGV2dHlwZW5hbWUpOworICAgIH0KKyAgICB3aGlsZSAoIWRldmljZV9waW4gJiYgSUVudW1QaW5zX05leHQocGlucywgMSwgJnBpbiwgTlVMTCkgPT0gU19PSykgeworICAgICAgICBJS3NQcm9wZXJ0eVNldCAqcCA9IE5VTEw7CisgICAgICAgIElFbnVtTWVkaWFUeXBlcyAqdHlwZXMgPSBOVUxMOworICAgICAgICBQSU5fSU5GTyBpbmZvID0gezB9OworICAgICAgICBBTV9NRURJQV9UWVBFICp0eXBlOworICAgICAgICBHVUlEIGNhdGVnb3J5OworICAgICAgICBEV09SRCByMjsKKworICAgICAgICBJUGluX1F1ZXJ5UGluSW5mbyhwaW4sICZpbmZvKTsKKyAgICAgICAgSUJhc2VGaWx0ZXJfUmVsZWFzZShpbmZvLnBGaWx0ZXIpOworCisgICAgICAgIGlmIChpbmZvLmRpciAhPSBQSU5ESVJfT1VUUFVUKQorICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICBpZiAoSVBpbl9RdWVyeUludGVyZmFjZShwaW4sICZJSURfSUtzUHJvcGVydHlTZXQsICh2b2lkICoqKSAmcCkgIT0gU19PSykKKyAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgaWYgKElLc1Byb3BlcnR5U2V0X0dldChwLCAmQU1QUk9QU0VUSURfUGluLCBBTVBST1BFUlRZX1BJTl9DQVRFR09SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAmY2F0ZWdvcnksIHNpemVvZihHVUlEKSwgJnIyKSAhPSBTX09LKQorICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICBpZiAoIUlzRXF1YWxHVUlEKCZjYXRlZ29yeSwgJlBJTl9DQVRFR09SWV9DQVBUVVJFKSkKKyAgICAgICAgICAgIGdvdG8gbmV4dDsKKworICAgICAgICBpZiAoIXBwaW4pIHsKKyAgICAgICAgICAgIGNoYXIgKmJ1ZiA9IGR1cF93Y2hhcl90b191dGY4KGluZm8uYWNoTmFtZSk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiIFBpbiBcIiVzXCJcbiIsIGJ1Zik7CisgICAgICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgICAgICBkc2hvd19jeWNsZV9mb3JtYXRzKGF2Y3R4LCBkZXZ0eXBlLCBwaW4sIE5VTEwpOworICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChzZXRfZm9ybWF0KSB7CisgICAgICAgICAgICBkc2hvd19jeWNsZV9mb3JtYXRzKGF2Y3R4LCBkZXZ0eXBlLCBwaW4sICZmb3JtYXRfc2V0KTsKKyAgICAgICAgICAgIGlmICghZm9ybWF0X3NldCkgeworICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2dHlwZSA9PSBBdWRpb0RldmljZSAmJiBjdHgtPmF1ZGlvX2J1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICBpZiAoZHNob3dfc2V0X2F1ZGlvX2J1ZmZlcl9zaXplKGF2Y3R4LCBwaW4pIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5hYmxlIHRvIHNldCBhdWRpbyBidWZmZXIgc2l6ZSAlZCB0byBwaW4sIHVzaW5nIHBpbiBhbnl3YXkuLi4iLCBjdHgtPmF1ZGlvX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChJUGluX0VudW1NZWRpYVR5cGVzKHBpbiwgJnR5cGVzKSAhPSBTX09LKQorICAgICAgICAgICAgZ290byBuZXh0OworCisgICAgICAgIElFbnVtTWVkaWFUeXBlc19SZXNldCh0eXBlcyk7CisgICAgICAgIHdoaWxlICghZGV2aWNlX3BpbiAmJiBJRW51bU1lZGlhVHlwZXNfTmV4dCh0eXBlcywgMSwgJnR5cGUsIE5VTEwpID09IFNfT0spIHsKKyAgICAgICAgICAgIGlmIChJc0VxdWFsR1VJRCgmdHlwZS0+bWFqb3J0eXBlLCBtZWRpYXR5cGVbZGV2dHlwZV0pKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlX3BpbiA9IHBpbjsKKyAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb1Rhc2tNZW1GcmVlKHR5cGUpOworICAgICAgICB9CisKK25leHQ6CisgICAgICAgIGlmICh0eXBlcykKKyAgICAgICAgICAgIElFbnVtTWVkaWFUeXBlc19SZWxlYXNlKHR5cGVzKTsKKyAgICAgICAgaWYgKHApCisgICAgICAgICAgICBJS3NQcm9wZXJ0eVNldF9SZWxlYXNlKHApOworICAgICAgICBpZiAoZGV2aWNlX3BpbiAhPSBwaW4pCisgICAgICAgICAgICBJUGluX1JlbGVhc2UocGluKTsKKyAgICB9CisKKyAgICBJRW51bVBpbnNfUmVsZWFzZShwaW5zKTsKKworICAgIGlmIChwcGluKSB7CisgICAgICAgIGlmIChzZXRfZm9ybWF0ICYmICFmb3JtYXRfc2V0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBzZXQgJXMgb3B0aW9uc1xuIiwgZGV2dHlwZW5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWRldmljZV9waW4pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBvdXRwdXQgcGluIGZyb20gJXMgY2FwdHVyZSBkZXZpY2UuXG4iLCBkZXZ0eXBlbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9CisgICAgICAgICpwcGluID0gZGV2aWNlX3BpbjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBMaXN0IG9wdGlvbnMgZm9yIGRldmljZSB3aXRoIHR5cGUgZGV2dHlwZS4KKyAqCisgKiBAcGFyYW0gZGV2ZW51bSBkZXZpY2UgZW51bWVyYXRvciB1c2VkIGZvciBhY2Nlc3NpbmcgdGhlIGRldmljZQorICovCitzdGF0aWMgaW50Citkc2hvd19saXN0X2RldmljZV9vcHRpb25zKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIElDcmVhdGVEZXZFbnVtICpkZXZlbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGRzaG93RGV2aWNlVHlwZSBkZXZ0eXBlKQoreworICAgIHN0cnVjdCBkc2hvd19jdHggKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgSUJhc2VGaWx0ZXIgKmRldmljZV9maWx0ZXIgPSBOVUxMOworICAgIGludCByOworCisgICAgaWYgKChyID0gZHNob3dfY3ljbGVfZGV2aWNlcyhhdmN0eCwgZGV2ZW51bSwgZGV2dHlwZSwgJmRldmljZV9maWx0ZXIpKSA8IDApCisgICAgICAgIHJldHVybiByOworICAgIGN0eC0+ZGV2aWNlX2ZpbHRlcltkZXZ0eXBlXSA9IGRldmljZV9maWx0ZXI7CisgICAgaWYgKChyID0gZHNob3dfY3ljbGVfcGlucyhhdmN0eCwgZGV2dHlwZSwgZGV2aWNlX2ZpbHRlciwgTlVMTCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHNob3dfb3Blbl9kZXZpY2UoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgSUNyZWF0ZURldkVudW0gKmRldmVudW0sCisgICAgICAgICAgICAgICAgICBlbnVtIGRzaG93RGV2aWNlVHlwZSBkZXZ0eXBlKQoreworICAgIHN0cnVjdCBkc2hvd19jdHggKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgSUJhc2VGaWx0ZXIgKmRldmljZV9maWx0ZXIgPSBOVUxMOworICAgIElHcmFwaEJ1aWxkZXIgKmdyYXBoID0gY3R4LT5ncmFwaDsKKyAgICBJUGluICpkZXZpY2VfcGluID0gTlVMTDsKKyAgICBsaWJBVlBpbiAqY2FwdHVyZV9waW4gPSBOVUxMOworICAgIGxpYkFWRmlsdGVyICpjYXB0dXJlX2ZpbHRlciA9IE5VTEw7CisgICAgaW50IHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICBpbnQgcjsKKworICAgIGNvbnN0IHdjaGFyX3QgKmZpbHRlcl9uYW1lWzJdID0geyBMIkF1ZGlvIGNhcHR1cmUgZmlsdGVyIiwgTCJWaWRlbyBjYXB0dXJlIGZpbHRlciIgfTsKKworICAgIGlmICgociA9IGRzaG93X2N5Y2xlX2RldmljZXMoYXZjdHgsIGRldmVudW0sIGRldnR5cGUsICZkZXZpY2VfZmlsdGVyKSkgPCAwKSB7CisgICAgICAgIHJldCA9IHI7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgY3R4LT5kZXZpY2VfZmlsdGVyIFtkZXZ0eXBlXSA9IGRldmljZV9maWx0ZXI7CisKKyAgICByID0gSUdyYXBoQnVpbGRlcl9BZGRGaWx0ZXIoZ3JhcGgsIGRldmljZV9maWx0ZXIsIE5VTEwpOworICAgIGlmIChyICE9IFNfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgYWRkIGRldmljZSBmaWx0ZXIgdG8gZ3JhcGguXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoKHIgPSBkc2hvd19jeWNsZV9waW5zKGF2Y3R4LCBkZXZ0eXBlLCBkZXZpY2VfZmlsdGVyLCAmZGV2aWNlX3BpbikpIDwgMCkgeworICAgICAgICByZXQgPSByOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBjdHgtPmRldmljZV9waW5bZGV2dHlwZV0gPSBkZXZpY2VfcGluOworCisgICAgY2FwdHVyZV9maWx0ZXIgPSBsaWJBVkZpbHRlcl9DcmVhdGUoYXZjdHgsIGNhbGxiYWNrLCBkZXZ0eXBlKTsKKyAgICBpZiAoIWNhcHR1cmVfZmlsdGVyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSBncmFiYmVyIGZpbHRlci5cbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBjdHgtPmNhcHR1cmVfZmlsdGVyW2RldnR5cGVdID0gY2FwdHVyZV9maWx0ZXI7CisKKyAgICByID0gSUdyYXBoQnVpbGRlcl9BZGRGaWx0ZXIoZ3JhcGgsIChJQmFzZUZpbHRlciAqKSBjYXB0dXJlX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX25hbWVbZGV2dHlwZV0pOworICAgIGlmIChyICE9IFNfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgYWRkIGNhcHR1cmUgZmlsdGVyIHRvIGdyYXBoXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBsaWJBVlBpbl9BZGRSZWYoY2FwdHVyZV9maWx0ZXItPnBpbik7CisgICAgY2FwdHVyZV9waW4gPSBjYXB0dXJlX2ZpbHRlci0+cGluOworICAgIGN0eC0+Y2FwdHVyZV9waW5bZGV2dHlwZV0gPSBjYXB0dXJlX3BpbjsKKworICAgIHIgPSBJR3JhcGhCdWlsZGVyX0Nvbm5lY3REaXJlY3QoZ3JhcGgsIGRldmljZV9waW4sIChJUGluICopIGNhcHR1cmVfcGluLCBOVUxMKTsKKyAgICBpZiAociAhPSBTX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNvbm5lY3QgcGluc1xuIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmV0ID0gMDsKKworZXJyb3I6CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVudW0gQVZDb2RlY0lEIHdhdmVmb3JtX2NvZGVjX2lkKGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCkKK3sKKyAgICBzd2l0Y2ggKHNhbXBsZV9mbXQpIHsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfVTg6ICByZXR1cm4gQVZfQ09ERUNfSURfUENNX1U4OworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6IHJldHVybiBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMjogcmV0dXJuIEFWX0NPREVDX0lEX1BDTV9TMzJMRTsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICByZXR1cm4gQVZfQ09ERUNfSURfTk9ORTsgLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KKyAgICB9Cit9CisKK3N0YXRpYyBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRfYml0c19wZXJfc2FtcGxlKGludCBiaXRzKQoreworICAgIHN3aXRjaCAoYml0cykgeworICAgIGNhc2UgODogIHJldHVybiBBVl9TQU1QTEVfRk1UX1U4OworICAgIGNhc2UgMTY6IHJldHVybiBBVl9TQU1QTEVfRk1UX1MxNjsKKyAgICBjYXNlIDMyOiByZXR1cm4gQVZfU0FNUExFX0ZNVF9TMzI7CisgICAgZGVmYXVsdDogcmV0dXJuIEFWX1NBTVBMRV9GTVRfTk9ORTsgLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2RzaG93X2FkZF9kZXZpY2UoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgZW51bSBkc2hvd0RldmljZVR5cGUgZGV2dHlwZSkKK3sKKyAgICBzdHJ1Y3QgZHNob3dfY3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFNX01FRElBX1RZUEUgdHlwZTsKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWM7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCByZXQgPSBBVkVSUk9SKEVJTyk7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYXZjdHgsIE5VTEwpOworICAgIGlmICghc3QpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzdC0+aWQgPSBkZXZ0eXBlOworCisgICAgY3R4LT5jYXB0dXJlX2ZpbHRlcltkZXZ0eXBlXS0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworCisgICAgbGliQVZQaW5fQ29ubmVjdGlvbk1lZGlhVHlwZShjdHgtPmNhcHR1cmVfcGluW2RldnR5cGVdLCAmdHlwZSk7CisKKyAgICBjb2RlYyA9IHN0LT5jb2RlYzsKKyAgICBpZiAoZGV2dHlwZSA9PSBWaWRlb0RldmljZSkgeworICAgICAgICBCSVRNQVBJTkZPSEVBREVSICpiaWggPSBOVUxMOworICAgICAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsKKworICAgICAgICBpZiAoSXNFcXVhbEdVSUQoJnR5cGUuZm9ybWF0dHlwZSwgJkZPUk1BVF9WaWRlb0luZm8pKSB7CisgICAgICAgICAgICBWSURFT0lORk9IRUFERVIgKnYgPSAodm9pZCAqKSB0eXBlLnBiRm9ybWF0OworICAgICAgICAgICAgdGltZV9iYXNlID0gKEFWUmF0aW9uYWwpIHsgdi0+QXZnVGltZVBlckZyYW1lLCAxMDAwMDAwMCB9OworICAgICAgICAgICAgYmloID0gJnYtPmJtaUhlYWRlcjsKKyAgICAgICAgfSBlbHNlIGlmIChJc0VxdWFsR1VJRCgmdHlwZS5mb3JtYXR0eXBlLCAmRk9STUFUX1ZpZGVvSW5mbzIpKSB7CisgICAgICAgICAgICBWSURFT0lORk9IRUFERVIyICp2ID0gKHZvaWQgKikgdHlwZS5wYkZvcm1hdDsKKyAgICAgICAgICAgIHRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKSB7IHYtPkF2Z1RpbWVQZXJGcmFtZSwgMTAwMDAwMDAgfTsKKyAgICAgICAgICAgIGJpaCA9ICZ2LT5ibWlIZWFkZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFiaWgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGdldCBtZWRpYSB0eXBlLlxuIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgY29kZWMtPnRpbWVfYmFzZSAgPSB0aW1lX2Jhc2U7CisgICAgICAgIGNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICBjb2RlYy0+d2lkdGggICAgICA9IGJpaC0+YmlXaWR0aDsKKyAgICAgICAgY29kZWMtPmhlaWdodCAgICAgPSBiaWgtPmJpSGVpZ2h0OworICAgICAgICBjb2RlYy0+Y29kZWNfdGFnICA9IGJpaC0+YmlDb21wcmVzc2lvbjsKKyAgICAgICAgY29kZWMtPnBpeF9mbXQgICAgPSBkc2hvd19waXhmbXQoYmloLT5iaUNvbXByZXNzaW9uLCBiaWgtPmJpQml0Q291bnQpOworICAgICAgICBpZiAoYmloLT5iaUNvbXByZXNzaW9uID09IE1LVEFHKCdIJywgJ0QnLCAnWScsICdDJykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiYXR0ZW1wdCB0byB1c2UgZnVsbCByYW5nZSBmb3IgSERZQy4uLlxuIik7CisgICAgICAgICAgICBjb2RlYy0+Y29sb3JfcmFuZ2UgPSBBVkNPTF9SQU5HRV9NUEVHOyAvLyBqdXN0IGluIGNhc2UgaXQgbmVlZHMgdGhpcy4uLgorICAgICAgICB9CisgICAgICAgIGlmIChjb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgICAgIGNvbnN0IEFWQ29kZWNUYWcgKmNvbnN0IHRhZ3NbXSA9IHsgYXZmb3JtYXRfZ2V0X3JpZmZfdmlkZW9fdGFncygpLCBOVUxMIH07CisgICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPSBhdl9jb2RlY19nZXRfaWQodGFncywgYmloLT5iaUNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjb21wcmVzc2lvbiB0eXBlLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHJlcG9ydCB0eXBlIDB4JVguXG4iLCAoaW50KSBiaWgtPmJpQ29tcHJlc3Npb24pOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaWgtPmJpQml0Q291bnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICAgICAgICAgIGlmIChiaWgtPmJpQ29tcHJlc3Npb24gPT0gQklfUkdCIHx8IGJpaC0+YmlDb21wcmVzc2lvbiA9PSBCSV9CSVRGSUVMRFMpIHsKKyAgICAgICAgICAgICAgICBjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYmloLT5iaUJpdENvdW50OworICAgICAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGEgPSBhdl9tYWxsb2MoOSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgICAgIGlmIChjb2RlYy0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb2RlYy0+ZXh0cmFkYXRhLCAiQm90dG9tVXAiLCA5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBXQVZFRk9STUFURVggKmZ4ID0gTlVMTDsKKworICAgICAgICBpZiAoSXNFcXVhbEdVSUQoJnR5cGUuZm9ybWF0dHlwZSwgJkZPUk1BVF9XYXZlRm9ybWF0RXgpKSB7CisgICAgICAgICAgICBmeCA9ICh2b2lkICopIHR5cGUucGJGb3JtYXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmeCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZ2V0IG1lZGlhIHR5cGUuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBjb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIGNvZGVjLT5zYW1wbGVfZm10ICA9IHNhbXBsZV9mbXRfYml0c19wZXJfc2FtcGxlKGZ4LT53Qml0c1BlclNhbXBsZSk7CisgICAgICAgIGNvZGVjLT5jb2RlY19pZCAgICA9IHdhdmVmb3JtX2NvZGVjX2lkKGNvZGVjLT5zYW1wbGVfZm10KTsKKyAgICAgICAgY29kZWMtPnNhbXBsZV9yYXRlID0gZngtPm5TYW1wbGVzUGVyU2VjOworICAgICAgICBjb2RlYy0+Y2hhbm5lbHMgICAgPSBmeC0+bkNoYW5uZWxzOworICAgIH0KKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwMCk7CisKKyAgICByZXQgPSAwOworCitlcnJvcjoKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBhcnNlX2RldmljZV9uYW1lKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgc3RydWN0IGRzaG93X2N0eCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjaGFyICoqZGV2aWNlX25hbWUgPSBjdHgtPmRldmljZV9uYW1lOworICAgIGNoYXIgKm5hbWUgPSBhdl9zdHJkdXAoYXZjdHgtPmZpbGVuYW1lKTsKKyAgICBjaGFyICp0bXAgPSBuYW1lOworICAgIGludCByZXQgPSAxOworICAgIGNoYXIgKnR5cGU7CisKKyAgICB3aGlsZSAoKHR5cGUgPSBzdHJ0b2sodG1wLCAiPSIpKSkgeworICAgICAgICBjaGFyICp0b2tlbiA9IHN0cnRvayhOVUxMLCAiOiIpOworICAgICAgICB0bXAgPSBOVUxMOworCisgICAgICAgIGlmICAgICAgICAoIXN0cmNtcCh0eXBlLCAidmlkZW8iKSkgeworICAgICAgICAgICAgZGV2aWNlX25hbWVbMF0gPSB0b2tlbjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHR5cGUsICJhdWRpbyIpKSB7CisgICAgICAgICAgICBkZXZpY2VfbmFtZVsxXSA9IHRva2VuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGV2aWNlX25hbWVbMF0gPSBOVUxMOworICAgICAgICAgICAgZGV2aWNlX25hbWVbMV0gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWRldmljZV9uYW1lWzBdICYmICFkZXZpY2VfbmFtZVsxXSkgeworICAgICAgICByZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkZXZpY2VfbmFtZVswXSkKKyAgICAgICAgICAgIGRldmljZV9uYW1lWzBdID0gYXZfc3RyZHVwKGRldmljZV9uYW1lWzBdKTsKKyAgICAgICAgaWYgKGRldmljZV9uYW1lWzFdKQorICAgICAgICAgICAgZGV2aWNlX25hbWVbMV0gPSBhdl9zdHJkdXAoZGV2aWNlX25hbWVbMV0pOworICAgIH0KKworICAgIGF2X2ZyZWUobmFtZSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2hvd19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQoreworICAgIHN0cnVjdCBkc2hvd19jdHggKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgSUdyYXBoQnVpbGRlciAqZ3JhcGggPSBOVUxMOworICAgIElDcmVhdGVEZXZFbnVtICpkZXZlbnVtID0gTlVMTDsKKyAgICBJTWVkaWFDb250cm9sICpjb250cm9sID0gTlVMTDsKKyAgICBJTWVkaWFFdmVudCAqbWVkaWFfZXZlbnQgPSBOVUxMOworICAgIEhBTkRMRSBtZWRpYV9ldmVudF9oYW5kbGU7CisgICAgSEFORExFIHByb2M7CisgICAgaW50IHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICBpbnQgcjsKKworICAgIENvSW5pdGlhbGl6ZSgwKTsKKworICAgIGlmICghY3R4LT5saXN0X2RldmljZXMgJiYgIXBhcnNlX2RldmljZV9uYW1lKGF2Y3R4KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1hbGZvcm1lZCBkc2hvdyBpbnB1dCBzdHJpbmcuXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBjdHgtPnZpZGVvX2NvZGVjX2lkID0gYXZjdHgtPnZpZGVvX2NvZGVjX2lkID8gYXZjdHgtPnZpZGVvX2NvZGVjX2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIGlmIChjdHgtPnBpeGVsX2Zvcm1hdCAhPSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgaWYgKGN0eC0+dmlkZW9fY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGl4ZWwgZm9ybWF0IG1heSBvbmx5IGJlIHNldCB3aGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlbyBjb2RlYyBpcyBub3Qgc2V0IG9yIHNldCB0byByYXd2aWRlb1xuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjdHgtPmZyYW1lcmF0ZSkgeworICAgICAgICByID0gYXZfcGFyc2VfdmlkZW9fcmF0ZSgmY3R4LT5yZXF1ZXN0ZWRfZnJhbWVyYXRlLCBjdHgtPmZyYW1lcmF0ZSk7CisgICAgICAgIGlmIChyIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgcGFyc2UgZnJhbWVyYXRlICclcycuXG4iLCBjdHgtPmZyYW1lcmF0ZSk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgciA9IENvQ3JlYXRlSW5zdGFuY2UoJkNMU0lEX0ZpbHRlckdyYXBoLCBOVUxMLCBDTFNDVFhfSU5QUk9DX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmSUlEX0lHcmFwaEJ1aWxkZXIsICh2b2lkICoqKSAmZ3JhcGgpOworICAgIGlmIChyICE9IFNfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIGNhcHR1cmUgZ3JhcGguXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgY3R4LT5ncmFwaCA9IGdyYXBoOworCisgICAgciA9IENvQ3JlYXRlSW5zdGFuY2UoJkNMU0lEX1N5c3RlbURldmljZUVudW0sIE5VTEwsIENMU0NUWF9JTlBST0NfU0VSVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICZJSURfSUNyZWF0ZURldkVudW0sICh2b2lkICoqKSAmZGV2ZW51bSk7CisgICAgaWYgKHIgIT0gU19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBlbnVtZXJhdGUgc3lzdGVtIGRldmljZXMuXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5saXN0X2RldmljZXMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIkRpcmVjdFNob3cgdmlkZW8gZGV2aWNlc1xuIik7CisgICAgICAgIGRzaG93X2N5Y2xlX2RldmljZXMoYXZjdHgsIGRldmVudW0sIFZpZGVvRGV2aWNlLCBOVUxMKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIkRpcmVjdFNob3cgYXVkaW8gZGV2aWNlc1xuIik7CisgICAgICAgIGRzaG93X2N5Y2xlX2RldmljZXMoYXZjdHgsIGRldmVudW0sIEF1ZGlvRGV2aWNlLCBOVUxMKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWElUOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAoY3R4LT5saXN0X29wdGlvbnMpIHsKKyAgICAgICAgaWYgKGN0eC0+ZGV2aWNlX25hbWVbVmlkZW9EZXZpY2VdKQorICAgICAgICAgICAgZHNob3dfbGlzdF9kZXZpY2Vfb3B0aW9ucyhhdmN0eCwgZGV2ZW51bSwgVmlkZW9EZXZpY2UpOworICAgICAgICBpZiAoY3R4LT5kZXZpY2VfbmFtZVtBdWRpb0RldmljZV0pCisgICAgICAgICAgICBkc2hvd19saXN0X2RldmljZV9vcHRpb25zKGF2Y3R4LCBkZXZlbnVtLCBBdWRpb0RldmljZSk7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhJVDsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5kZXZpY2VfbmFtZVtWaWRlb0RldmljZV0pIHsKKyAgICAgICAgaWYgKChyID0gZHNob3dfb3Blbl9kZXZpY2UoYXZjdHgsIGRldmVudW0sIFZpZGVvRGV2aWNlKSkgPCAwIHx8CisgICAgICAgICAgICAociA9IGRzaG93X2FkZF9kZXZpY2UoYXZjdHgsIFZpZGVvRGV2aWNlKSkgPCAwKSB7CisgICAgICAgICAgICByZXQgPSByOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY3R4LT5kZXZpY2VfbmFtZVtBdWRpb0RldmljZV0pIHsKKyAgICAgICAgaWYgKChyID0gZHNob3dfb3Blbl9kZXZpY2UoYXZjdHgsIGRldmVudW0sIEF1ZGlvRGV2aWNlKSkgPCAwIHx8CisgICAgICAgICAgICAociA9IGRzaG93X2FkZF9kZXZpY2UoYXZjdHgsIEF1ZGlvRGV2aWNlKSkgPCAwKSB7CisgICAgICAgICAgICByZXQgPSByOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBjdHgtPmN1cmJ1ZnNpemVbMF0gPSAwOworICAgIGN0eC0+Y3VyYnVmc2l6ZVsxXSA9IDA7CisgICAgY3R4LT5tdXRleCA9IENyZWF0ZU11dGV4KE5VTEwsIDAsIE5VTEwpOworICAgIGlmICghY3R4LT5tdXRleCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgTXV0ZXhcbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBjdHgtPmV2ZW50WzFdID0gQ3JlYXRlRXZlbnQoTlVMTCwgMSwgMCwgTlVMTCk7CisgICAgaWYgKCFjdHgtPmV2ZW50WzFdKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSBFdmVudFxuIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgciA9IElHcmFwaEJ1aWxkZXJfUXVlcnlJbnRlcmZhY2UoZ3JhcGgsICZJSURfSU1lZGlhQ29udHJvbCwgKHZvaWQgKiopICZjb250cm9sKTsKKyAgICBpZiAociAhPSBTX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGdldCBtZWRpYSBjb250cm9sLlxuIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGN0eC0+Y29udHJvbCA9IGNvbnRyb2w7CisKKyAgICByID0gSUdyYXBoQnVpbGRlcl9RdWVyeUludGVyZmFjZShncmFwaCwgJklJRF9JTWVkaWFFdmVudCwgKHZvaWQgKiopICZtZWRpYV9ldmVudCk7CisgICAgaWYgKHIgIT0gU19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBnZXQgbWVkaWEgZXZlbnQuXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgY3R4LT5tZWRpYV9ldmVudCA9IG1lZGlhX2V2ZW50OworCisgICAgciA9IElNZWRpYUV2ZW50X0dldEV2ZW50SGFuZGxlKG1lZGlhX2V2ZW50LCAodm9pZCAqKSAmbWVkaWFfZXZlbnRfaGFuZGxlKTsKKyAgICBpZiAociAhPSBTX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGdldCBtZWRpYSBldmVudCBoYW5kbGUuXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcHJvYyA9IEdldEN1cnJlbnRQcm9jZXNzKCk7CisgICAgciA9IER1cGxpY2F0ZUhhbmRsZShwcm9jLCBtZWRpYV9ldmVudF9oYW5kbGUsIHByb2MsICZjdHgtPmV2ZW50WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKKyAgICBpZiAoIXIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZHVwbGljYXRlIG1lZGlhIGV2ZW50IGhhbmRsZS5cbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHIgPSBJTWVkaWFDb250cm9sX1J1bihjb250cm9sKTsKKyAgICBpZiAociA9PSBTX0ZBTFNFKSB7CisgICAgICAgIE9BRmlsdGVyU3RhdGUgcGZzOworICAgICAgICByID0gSU1lZGlhQ29udHJvbF9HZXRTdGF0ZShjb250cm9sLCAwLCAmcGZzKTsKKyAgICB9CisgICAgaWYgKHIgIT0gU19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBydW4gZmlsdGVyXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXQgPSAwOworCitlcnJvcjoKKworICAgIGlmIChkZXZlbnVtKQorICAgICAgICBJQ3JlYXRlRGV2RW51bV9SZWxlYXNlKGRldmVudW0pOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGRzaG93X3JlYWRfY2xvc2UoYXZjdHgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBDaGVja3MgbWVkaWEgZXZlbnRzIGZyb20gRGlyZWN0U2hvdyBhbmQgcmV0dXJucyAtMSBvbiBlcnJvciBvciBFT0YuIEFsc28KKyAqIHB1cmdlcyBhbGwgZXZlbnRzIHRoYXQgbWlnaHQgYmUgaW4gdGhlIGV2ZW50IHF1ZXVlIHRvIHN0b3AgdGhlIHRyaWdnZXIKKyAqIG9mIGV2ZW50IG5vdGlmaWNhdGlvbi4KKyAqLworc3RhdGljIGludCBkc2hvd19jaGVja19ldmVudF9xdWV1ZShJTWVkaWFFdmVudCAqbWVkaWFfZXZlbnQpCit7CisgICAgTE9OR19QVFIgcDEsIHAyOworICAgIGxvbmcgY29kZTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHdoaWxlIChJTWVkaWFFdmVudF9HZXRFdmVudChtZWRpYV9ldmVudCwgJmNvZGUsICZwMSwgJnAyLCAwKSAhPSBFX0FCT1JUKSB7CisgICAgICAgIGlmIChjb2RlID09IEVDX0NPTVBMRVRFIHx8IGNvZGUgPT0gRUNfREVWSUNFX0xPU1QgfHwgY29kZSA9PSBFQ19FUlJPUkFCT1JUKQorICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIElNZWRpYUV2ZW50X0ZyZWVFdmVudFBhcmFtcyhtZWRpYV9ldmVudCwgY29kZSwgcDEsIHAyKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzaG93X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBzdHJ1Y3QgZHNob3dfY3R4ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQVZQYWNrZXRMaXN0ICpwa3RsID0gTlVMTDsKKworICAgIHdoaWxlICghY3R4LT5lb2YgJiYgIXBrdGwpIHsKKyAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChjdHgtPm11dGV4LCBJTkZJTklURSk7CisgICAgICAgIHBrdGwgPSBjdHgtPnBrdGw7CisgICAgICAgIGlmIChwa3RsKSB7CisgICAgICAgICAgICAqcGt0ID0gcGt0bC0+cGt0OworICAgICAgICAgICAgY3R4LT5wa3RsID0gY3R4LT5wa3RsLT5uZXh0OworICAgICAgICAgICAgYXZfZnJlZShwa3RsKTsKKyAgICAgICAgICAgIGN0eC0+Y3VyYnVmc2l6ZVtwa3QtPnN0cmVhbV9pbmRleF0gLT0gcGt0LT5zaXplOworICAgICAgICB9CisgICAgICAgIFJlc2V0RXZlbnQoY3R4LT5ldmVudFsxXSk7CisgICAgICAgIFJlbGVhc2VNdXRleChjdHgtPm11dGV4KTsKKyAgICAgICAgaWYgKCFwa3RsKSB7CisgICAgICAgICAgICBpZiAoZHNob3dfY2hlY2tfZXZlbnRfcXVldWUoY3R4LT5tZWRpYV9ldmVudCkgPCAwKSB7CisgICAgICAgICAgICAgICAgY3R4LT5lb2YgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5mbGFncyAmIEFWRk1UX0ZMQUdfTk9OQkxPQ0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsIGN0eC0+ZXZlbnQsIDAsIElORklOSVRFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjdHgtPmVvZiA/IEFWRVJST1IoRUlPKSA6IHBrdC0+c2l6ZTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2Yoc3RydWN0IGRzaG93X2N0eCwgeCkKKyNkZWZpbmUgREVDIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInZpZGVvX3NpemUiLCAic2V0IHZpZGVvIHNpemUgZ2l2ZW4gYSBzdHJpbmcgc3VjaCBhcyA2NDB4NDgwIG9yIGhkNzIwLiIsIE9GRlNFVChyZXF1ZXN0ZWRfd2lkdGgpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBERUMgfSwKKyAgICB7ICJwaXhlbF9mb3JtYXQiLCAic2V0IHZpZGVvIHBpeGVsIGZvcm1hdCIsIE9GRlNFVChwaXhlbF9mb3JtYXQpLCBBVl9PUFRfVFlQRV9QSVhFTF9GTVQsIHsuaTY0ID0gQVZfUElYX0ZNVF9OT05FfSwgLTEsIElOVF9NQVgsIERFQyB9LAorICAgIHsgImZyYW1lcmF0ZSIsICJzZXQgdmlkZW8gZnJhbWUgcmF0ZSIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIERFQyB9LAorICAgIHsgInNhbXBsZV9yYXRlIiwgInNldCBhdWRpbyBzYW1wbGUgcmF0ZSIsIE9GRlNFVChzYW1wbGVfcmF0ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgREVDIH0sCisgICAgeyAic2FtcGxlX3NpemUiLCAic2V0IGF1ZGlvIHNhbXBsZSBzaXplIiwgT0ZGU0VUKHNhbXBsZV9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxNiwgREVDIH0sCisgICAgeyAiY2hhbm5lbHMiLCAic2V0IG51bWJlciBvZiBhdWRpbyBjaGFubmVscywgc3VjaCBhcyAxIG9yIDIiLCBPRkZTRVQoY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIERFQyB9LAorICAgIHsgImxpc3RfZGV2aWNlcyIsICJsaXN0IGF2YWlsYWJsZSBkZXZpY2VzIiwgT0ZGU0VUKGxpc3RfZGV2aWNlcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIDEsIERFQywgImxpc3RfZGV2aWNlcyIgfSwKKyAgICB7ICJ0cnVlIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgREVDLCAibGlzdF9kZXZpY2VzIiB9LAorICAgIHsgImZhbHNlIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgREVDLCAibGlzdF9kZXZpY2VzIiB9LAorICAgIHsgImxpc3Rfb3B0aW9ucyIsICJsaXN0IGF2YWlsYWJsZSBvcHRpb25zIGZvciBzcGVjaWZpZWQgZGV2aWNlIiwgT0ZGU0VUKGxpc3Rfb3B0aW9ucyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIDEsIERFQywgImxpc3Rfb3B0aW9ucyIgfSwKKyAgICB7ICJ0cnVlIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgREVDLCAibGlzdF9vcHRpb25zIiB9LAorICAgIHsgImZhbHNlIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgREVDLCAibGlzdF9vcHRpb25zIiB9LAorICAgIHsgInZpZGVvX2RldmljZV9udW1iZXIiLCAic2V0IHZpZGVvIGRldmljZSBudW1iZXIgZm9yIGRldmljZXMgd2l0aCBzYW1lIG5hbWUgKHN0YXJ0cyBhdCAwKSIsIE9GRlNFVCh2aWRlb19kZXZpY2VfbnVtYmVyKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBERUMgfSwKKyAgICB7ICJhdWRpb19kZXZpY2VfbnVtYmVyIiwgInNldCBhdWRpbyBkZXZpY2UgbnVtYmVyIGZvciBkZXZpY2VzIHdpdGggc2FtZSBuYW1lIChzdGFydHMgYXQgMCkiLCBPRkZTRVQoYXVkaW9fZGV2aWNlX251bWJlciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgREVDIH0sCisgICAgeyAiYXVkaW9fYnVmZmVyX3NpemUiLCAic2V0IGF1ZGlvIGRldmljZSBidWZmZXIgbGF0ZW5jeSBzaXplIGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdCBpcyB0aGUgZGV2aWNlJ3MgZGVmYXVsdCkiLCBPRkZTRVQoYXVkaW9fYnVmZmVyX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIERFQyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZHNob3dfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZHNob3cgaW5kZXYiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX0lOUFVULAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl9kc2hvd19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJkc2hvdyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRpcmVjdFNob3cgY2FwdHVyZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZHNob3dfY3R4KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBkc2hvd19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBkc2hvd19yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBkc2hvd19yZWFkX2Nsb3NlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZHNob3dfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2RzaG93X2NhcHR1cmUuaCBiL2ZmbXBlZy9saWJhdmRldmljZS9kc2hvd19jYXB0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1MjA3MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9kc2hvd19jYXB0dXJlLmgKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBEaXJlY3RTaG93IGNhcHR1cmUgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmFtaXJvIFBvbGxhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZERVZJQ0VfRFNIT1dfSAorI2RlZmluZSBBVkRFVklDRV9EU0hPV19ICisKKyNkZWZpbmUgRFNIT1dERUJVRyAwCisKKyNpbmNsdWRlICJhdmRldmljZS5oIgorCisjZGVmaW5lIENPQkpNQUNST1MKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNkZWZpbmUgTk9fRFNIT1dfU1RSU0FGRQorI2luY2x1ZGUgPGRzaG93Lmg+CisjaW5jbHVkZSA8ZHZkbWVkaWEuaD4KKworLyogRUNfREVWSUNFX0xPU1QgaXMgbm90IGRlZmluZWQgaW4gTWluR1cgZHNob3cgaGVhZGVycy4gKi8KKyNpZm5kZWYgRUNfREVWSUNFX0xPU1QKKyNkZWZpbmUgRUNfREVWSUNFX0xPU1QgMHgxZgorI2VuZGlmCisKK2xvbmcgZmZfY29weV9kc2hvd19tZWRpYV90eXBlKEFNX01FRElBX1RZUEUgKmRzdCwgY29uc3QgQU1fTUVESUFfVFlQRSAqc3JjKTsKK3ZvaWQgZmZfcHJpbnRfVklERU9fU1RSRUFNX0NPTkZJR19DQVBTKGNvbnN0IFZJREVPX1NUUkVBTV9DT05GSUdfQ0FQUyAqY2Fwcyk7Cit2b2lkIGZmX3ByaW50X0FVRElPX1NUUkVBTV9DT05GSUdfQ0FQUyhjb25zdCBBVURJT19TVFJFQU1fQ09ORklHX0NBUFMgKmNhcHMpOwordm9pZCBmZl9wcmludF9BTV9NRURJQV9UWVBFKGNvbnN0IEFNX01FRElBX1RZUEUgKnR5cGUpOwordm9pZCBmZl9wcmludEdVSUQoY29uc3QgR1VJRCAqZyk7CisKKyNpZiBEU0hPV0RFQlVHCitleHRlcm4gY29uc3QgQVZDbGFzcyAqZmZfZHNob3dfY29udGV4dF9jbGFzc19wdHI7CisjZGVmaW5lIGRzaG93ZGVidWcoLi4uKSBhdl9sb2coJmZmX2RzaG93X2NvbnRleHRfY2xhc3NfcHRyLCBBVl9MT0dfREVCVUcsIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgZHNob3dkZWJ1ZyguLi4pCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIG5vdGhpbmcodm9pZCAqZm9vKQoreworfQorCitzdHJ1Y3QgR1VJRG9mZnNldCB7CisgICAgY29uc3QgR1VJRCAqaWlkOworICAgIGludCBvZmZzZXQ7Cit9OworCitlbnVtIGRzaG93RGV2aWNlVHlwZSB7CisgICAgVmlkZW9EZXZpY2UgPSAwLAorICAgIEF1ZGlvRGV2aWNlID0gMSwKK307CisKKyNkZWZpbmUgREVDTEFSRV9RVUVSWUlOVEVSRkFDRShjbGFzcywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbG9uZyBXSU5BUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjbGFzcyMjX1F1ZXJ5SW50ZXJmYWNlKGNsYXNzICp0aGlzLCBjb25zdCBHVUlEICpyaWlkLCB2b2lkICoqcHB2T2JqZWN0KSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBHVUlEb2Zmc2V0IGlmYWNlc1tdID0gX19WQV9BUkdTX187ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc2hvd2RlYnVnKEFWX1NUUklOR0lGWShjbGFzcykiX1F1ZXJ5SW50ZXJmYWNlKCVwLCAlcCwgJXApXG4iLCB0aGlzLCByaWlkLCBwcHZPYmplY3QpOyBcCisgICAgZmZfcHJpbnRHVUlEKHJpaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXBwdk9iamVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gRV9QT0lOVEVSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihpZmFjZXMpL3NpemVvZihpZmFjZXNbMF0pOyBpKyspIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKElzRXF1YWxHVUlEKHJpaWQsIGlmYWNlc1tpXS5paWQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdm9pZCAqb2JqID0gKHZvaWQgKikgKCh1aW50OF90ICopIHRoaXMgKyBpZmFjZXNbaV0ub2Zmc2V0KTsgICAgICBcCisgICAgICAgICAgICBjbGFzcyMjX0FkZFJlZih0aGlzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzaG93ZGVidWcoIlx0Zm91bmQgJWQgd2l0aCBvZmZzZXQgJWRcbiIsIGksIGlmYWNlc1tpXS5vZmZzZXQpOyAgXAorICAgICAgICAgICAgKnBwdk9iamVjdCA9ICh2b2lkICopIG9iajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gU19PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHNob3dkZWJ1ZygiXHRFX05PSU5URVJGQUNFXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqcHB2T2JqZWN0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBFX05PSU5URVJGQUNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERFQ0xBUkVfQUREUkVGKGNsYXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3Vuc2lnbmVkIGxvbmcgV0lOQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorY2xhc3MjI19BZGRSZWYoY2xhc3MgKnRoaXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc2hvd2RlYnVnKEFWX1NUUklOR0lGWShjbGFzcykiX0FkZFJlZiglcClcdCVsZFxuIiwgdGhpcywgdGhpcy0+cmVmKzEpOyAgXAorICAgIHJldHVybiBJbnRlcmxvY2tlZEluY3JlbWVudCgmdGhpcy0+cmVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERFQ0xBUkVfUkVMRUFTRShjbGFzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3Vuc2lnbmVkIGxvbmcgV0lOQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorY2xhc3MjI19SZWxlYXNlKGNsYXNzICp0aGlzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb25nIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZ0aGlzLT5yZWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzaG93ZGVidWcoQVZfU1RSSU5HSUZZKGNsYXNzKSJfUmVsZWFzZSglcClcdCVsZFxuIiwgdGhpcywgcmVmKTsgICAgICAgICBcCisgICAgaWYgKCFyZWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2xhc3MjI19EZXN0cm95KHRoaXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiByZWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgREVDTEFSRV9ERVNUUk9ZKGNsYXNzLCBmdW5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBjbGFzcyMjX0Rlc3Ryb3koY2xhc3MgKnRoaXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc2hvd2RlYnVnKEFWX1NUUklOR0lGWShjbGFzcykiX0Rlc3Ryb3koJXApXG4iLCB0aGlzKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGZ1bmModGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHRoaXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHRoaXMtPnZ0YmwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQ29UYXNrTWVtRnJlZSh0aGlzLT52dGJsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENvVGFza01lbUZyZWUodGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBERUNMQVJFX0NSRUFURShjbGFzcywgc2V0dXAsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjbGFzcyAqY2xhc3MjI19DcmVhdGUoX19WQV9BUkdTX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXNzICp0aGlzID0gQ29UYXNrTWVtQWxsb2Moc2l6ZW9mKGNsYXNzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCAgKnZ0YmwgPSBDb1Rhc2tNZW1BbGxvYyhzaXplb2YoKnRoaXMtPnZ0YmwpKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc2hvd2RlYnVnKEFWX1NUUklOR0lGWShjbGFzcykiX0NyZWF0ZSglcClcbiIsIHRoaXMpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghdGhpcyB8fCAhdnRibCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gZmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBaZXJvTWVtb3J5KHRoaXMsIHNpemVvZihjbGFzcykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFplcm9NZW1vcnkodnRibCwgc2l6ZW9mKCp0aGlzLT52dGJsKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGhpcy0+cmVmICA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aGlzLT52dGJsID0gdnRibDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghc2V0dXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gZmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc2hvd2RlYnVnKCJjcmVhdGVkICJBVl9TVFJJTkdJRlkoY2xhc3MpIiAlcFxuIiwgdGhpcyk7ICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0aGlzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitmYWlsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGFzcyMjX0Rlc3Ryb3kodGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzaG93ZGVidWcoImNvdWxkIG5vdCBjcmVhdGUgIkFWX1NUUklOR0lGWShjbGFzcykiXG4iKTsgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBTRVRWVEJMKHZ0YmwsIGNsYXNzLCBmbikgXAorICAgIGRvIHsgKHZ0YmwpLT5mbiA9ICh2b2lkICopIGNsYXNzIyNfIyNmbjsgfSB3aGlsZSgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZvcndhcmQgRGVjbGFyYXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IGxpYkFWUGluIGxpYkFWUGluOwordHlwZWRlZiBzdHJ1Y3QgbGliQVZNZW1JbnB1dFBpbiBsaWJBVk1lbUlucHV0UGluOwordHlwZWRlZiBzdHJ1Y3QgbGliQVZFbnVtUGlucyBsaWJBVkVudW1QaW5zOwordHlwZWRlZiBzdHJ1Y3QgbGliQVZFbnVtTWVkaWFUeXBlcyBsaWJBVkVudW1NZWRpYVR5cGVzOwordHlwZWRlZiBzdHJ1Y3QgbGliQVZGaWx0ZXIgbGliQVZGaWx0ZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbGliQVZQaW4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGxpYkFWUGluIHsKKyAgICBJUGluVnRibCAqdnRibDsKKyAgICBsb25nIHJlZjsKKyAgICBsaWJBVkZpbHRlciAqZmlsdGVyOworICAgIElQaW4gKmNvbm5lY3RlZHRvOworICAgIEFNX01FRElBX1RZUEUgdHlwZTsKKyAgICBJTWVtSW5wdXRQaW5WdGJsICppbWVtdnRibDsKK307CisKK2xvbmcgICAgICAgICAgV0lOQVBJIGxpYkFWUGluX1F1ZXJ5SW50ZXJmYWNlICAgICAgICAgIChsaWJBVlBpbiAqLCBjb25zdCBHVUlEICosIHZvaWQgKiopOwordW5zaWduZWQgbG9uZyBXSU5BUEkgbGliQVZQaW5fQWRkUmVmICAgICAgICAgICAgICAgICAgKGxpYkFWUGluICopOwordW5zaWduZWQgbG9uZyBXSU5BUEkgbGliQVZQaW5fUmVsZWFzZSAgICAgICAgICAgICAgICAgKGxpYkFWUGluICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZQaW5fQ29ubmVjdCAgICAgICAgICAgICAgICAgKGxpYkFWUGluICosIElQaW4gKiwgY29uc3QgQU1fTUVESUFfVFlQRSAqKTsKK2xvbmcgICAgICAgICAgV0lOQVBJIGxpYkFWUGluX1JlY2VpdmVDb25uZWN0aW9uICAgICAgIChsaWJBVlBpbiAqLCBJUGluICosIGNvbnN0IEFNX01FRElBX1RZUEUgKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVlBpbl9EaXNjb25uZWN0ICAgICAgICAgICAgICAobGliQVZQaW4gKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVlBpbl9Db25uZWN0ZWRUbyAgICAgICAgICAgICAobGliQVZQaW4gKiwgSVBpbiAqKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVlBpbl9Db25uZWN0aW9uTWVkaWFUeXBlICAgICAobGliQVZQaW4gKiwgQU1fTUVESUFfVFlQRSAqKTsKK2xvbmcgICAgICAgICAgV0lOQVBJIGxpYkFWUGluX1F1ZXJ5UGluSW5mbyAgICAgICAgICAgIChsaWJBVlBpbiAqLCBQSU5fSU5GTyAqKTsKK2xvbmcgICAgICAgICAgV0lOQVBJIGxpYkFWUGluX1F1ZXJ5RGlyZWN0aW9uICAgICAgICAgIChsaWJBVlBpbiAqLCBQSU5fRElSRUNUSU9OICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZQaW5fUXVlcnlJZCAgICAgICAgICAgICAgICAgKGxpYkFWUGluICosIHdjaGFyX3QgKiopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZQaW5fUXVlcnlBY2NlcHQgICAgICAgICAgICAgKGxpYkFWUGluICosIGNvbnN0IEFNX01FRElBX1RZUEUgKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVlBpbl9FbnVtTWVkaWFUeXBlcyAgICAgICAgICAobGliQVZQaW4gKiwgSUVudW1NZWRpYVR5cGVzICoqKTsKK2xvbmcgICAgICAgICAgV0lOQVBJIGxpYkFWUGluX1F1ZXJ5SW50ZXJuYWxDb25uZWN0aW9ucyhsaWJBVlBpbiAqLCBJUGluICoqLCB1bnNpZ25lZCBsb25nICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZQaW5fRW5kT2ZTdHJlYW0gICAgICAgICAgICAgKGxpYkFWUGluICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZQaW5fQmVnaW5GbHVzaCAgICAgICAgICAgICAgKGxpYkFWUGluICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZQaW5fRW5kRmx1c2ggICAgICAgICAgICAgICAgKGxpYkFWUGluICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZQaW5fTmV3U2VnbWVudCAgICAgICAgICAgICAgKGxpYkFWUGluICosIFJFRkVSRU5DRV9USU1FLCBSRUZFUkVOQ0VfVElNRSwgZG91YmxlKTsKKworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZNZW1JbnB1dFBpbl9RdWVyeUludGVyZmFjZSAgICAgICAgICAobGliQVZNZW1JbnB1dFBpbiAqLCBjb25zdCBHVUlEICosIHZvaWQgKiopOwordW5zaWduZWQgbG9uZyBXSU5BUEkgbGliQVZNZW1JbnB1dFBpbl9BZGRSZWYgICAgICAgICAgICAgICAgICAobGliQVZNZW1JbnB1dFBpbiAqKTsKK3Vuc2lnbmVkIGxvbmcgV0lOQVBJIGxpYkFWTWVtSW5wdXRQaW5fUmVsZWFzZSAgICAgICAgICAgICAgICAgKGxpYkFWTWVtSW5wdXRQaW4gKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVk1lbUlucHV0UGluX0dldEFsbG9jYXRvciAgICAgICAgICAgIChsaWJBVk1lbUlucHV0UGluICosIElNZW1BbGxvY2F0b3IgKiopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZNZW1JbnB1dFBpbl9Ob3RpZnlBbGxvY2F0b3IgICAgICAgICAobGliQVZNZW1JbnB1dFBpbiAqLCBJTWVtQWxsb2NhdG9yICosIEJPT0wpOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZNZW1JbnB1dFBpbl9HZXRBbGxvY2F0b3JSZXF1aXJlbWVudHMobGliQVZNZW1JbnB1dFBpbiAqLCBBTExPQ0FUT1JfUFJPUEVSVElFUyAqKTsKK2xvbmcgICAgICAgICAgV0lOQVBJIGxpYkFWTWVtSW5wdXRQaW5fUmVjZWl2ZSAgICAgICAgICAgICAgICAgKGxpYkFWTWVtSW5wdXRQaW4gKiwgSU1lZGlhU2FtcGxlICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZNZW1JbnB1dFBpbl9SZWNlaXZlTXVsdGlwbGUgICAgICAgICAobGliQVZNZW1JbnB1dFBpbiAqLCBJTWVkaWFTYW1wbGUgKiosIGxvbmcsIGxvbmcgKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVk1lbUlucHV0UGluX1JlY2VpdmVDYW5CbG9jayAgICAgICAgIChsaWJBVk1lbUlucHV0UGluICopOworCit2b2lkICAgICAgICAgICAgICAgICBsaWJBVlBpbl9EZXN0cm95KGxpYkFWUGluICopOworbGliQVZQaW4gICAgICAgICAgICAqbGliQVZQaW5fQ3JlYXRlIChsaWJBVkZpbHRlciAqZmlsdGVyKTsKKwordm9pZCAgICAgICAgICAgICAgICAgbGliQVZNZW1JbnB1dFBpbl9EZXN0cm95KGxpYkFWTWVtSW5wdXRQaW4gKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbGliQVZFbnVtUGlucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgbGliQVZFbnVtUGlucyB7CisgICAgSUVudW1QaW5zVnRibCAqdnRibDsKKyAgICBsb25nIHJlZjsKKyAgICBpbnQgcG9zOworICAgIGxpYkFWUGluICpwaW47CisgICAgbGliQVZGaWx0ZXIgKmZpbHRlcjsKK307CisKK2xvbmcgICAgICAgICAgV0lOQVBJIGxpYkFWRW51bVBpbnNfUXVlcnlJbnRlcmZhY2UobGliQVZFbnVtUGlucyAqLCBjb25zdCBHVUlEICosIHZvaWQgKiopOwordW5zaWduZWQgbG9uZyBXSU5BUEkgbGliQVZFbnVtUGluc19BZGRSZWYgICAgICAgIChsaWJBVkVudW1QaW5zICopOwordW5zaWduZWQgbG9uZyBXSU5BUEkgbGliQVZFbnVtUGluc19SZWxlYXNlICAgICAgIChsaWJBVkVudW1QaW5zICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZFbnVtUGluc19OZXh0ICAgICAgICAgIChsaWJBVkVudW1QaW5zICosIHVuc2lnbmVkIGxvbmcsIElQaW4gKiosIHVuc2lnbmVkIGxvbmcgKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVkVudW1QaW5zX1NraXAgICAgICAgICAgKGxpYkFWRW51bVBpbnMgKiwgdW5zaWduZWQgbG9uZyk7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVkVudW1QaW5zX1Jlc2V0ICAgICAgICAgKGxpYkFWRW51bVBpbnMgKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVkVudW1QaW5zX0Nsb25lICAgICAgICAgKGxpYkFWRW51bVBpbnMgKiwgbGliQVZFbnVtUGlucyAqKik7CisKK3ZvaWQgICAgICAgICAgICAgICAgIGxpYkFWRW51bVBpbnNfRGVzdHJveShsaWJBVkVudW1QaW5zICopOworbGliQVZFbnVtUGlucyAgICAgICAqbGliQVZFbnVtUGluc19DcmVhdGUgKGxpYkFWUGluICpwaW4sIGxpYkFWRmlsdGVyICpmaWx0ZXIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGxpYkFWRW51bU1lZGlhVHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGxpYkFWRW51bU1lZGlhVHlwZXMgeworICAgIElFbnVtUGluc1Z0YmwgKnZ0Ymw7CisgICAgbG9uZyByZWY7CisgICAgaW50IHBvczsKKyAgICBBTV9NRURJQV9UWVBFIHR5cGU7Cit9OworCitsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVkVudW1NZWRpYVR5cGVzX1F1ZXJ5SW50ZXJmYWNlKGxpYkFWRW51bU1lZGlhVHlwZXMgKiwgY29uc3QgR1VJRCAqLCB2b2lkICoqKTsKK3Vuc2lnbmVkIGxvbmcgV0lOQVBJIGxpYkFWRW51bU1lZGlhVHlwZXNfQWRkUmVmICAgICAgICAobGliQVZFbnVtTWVkaWFUeXBlcyAqKTsKK3Vuc2lnbmVkIGxvbmcgV0lOQVBJIGxpYkFWRW51bU1lZGlhVHlwZXNfUmVsZWFzZSAgICAgICAobGliQVZFbnVtTWVkaWFUeXBlcyAqKTsKK2xvbmcgICAgICAgICAgV0lOQVBJIGxpYkFWRW51bU1lZGlhVHlwZXNfTmV4dCAgICAgICAgICAobGliQVZFbnVtTWVkaWFUeXBlcyAqLCB1bnNpZ25lZCBsb25nLCBBTV9NRURJQV9UWVBFICoqLCB1bnNpZ25lZCBsb25nICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZFbnVtTWVkaWFUeXBlc19Ta2lwICAgICAgICAgIChsaWJBVkVudW1NZWRpYVR5cGVzICosIHVuc2lnbmVkIGxvbmcpOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZFbnVtTWVkaWFUeXBlc19SZXNldCAgICAgICAgIChsaWJBVkVudW1NZWRpYVR5cGVzICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZFbnVtTWVkaWFUeXBlc19DbG9uZSAgICAgICAgIChsaWJBVkVudW1NZWRpYVR5cGVzICosIGxpYkFWRW51bU1lZGlhVHlwZXMgKiopOworCit2b2lkICAgICAgICAgICAgICAgICBsaWJBVkVudW1NZWRpYVR5cGVzX0Rlc3Ryb3kobGliQVZFbnVtTWVkaWFUeXBlcyAqKTsKK2xpYkFWRW51bU1lZGlhVHlwZXMgKmxpYkFWRW51bU1lZGlhVHlwZXNfQ3JlYXRlKGNvbnN0IEFNX01FRElBX1RZUEUgKnR5cGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGxpYkFWRmlsdGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBsaWJBVkZpbHRlciB7CisgICAgSUJhc2VGaWx0ZXJWdGJsICp2dGJsOworICAgIGxvbmcgcmVmOworICAgIGNvbnN0IHdjaGFyX3QgKm5hbWU7CisgICAgbGliQVZQaW4gKnBpbjsKKyAgICBGSUxURVJfSU5GTyBpbmZvOworICAgIEZJTFRFUl9TVEFURSBzdGF0ZTsKKyAgICBJUmVmZXJlbmNlQ2xvY2sgKmNsb2NrOworICAgIGVudW0gZHNob3dEZXZpY2VUeXBlIHR5cGU7CisgICAgdm9pZCAqcHJpdl9kYXRhOworICAgIGludCBzdHJlYW1faW5kZXg7CisgICAgaW50NjRfdCBzdGFydF90aW1lOworICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqcHJpdl9kYXRhLCBpbnQgaW5kZXgsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQ2NF90IHRpbWUsIGVudW0gZHNob3dEZXZpY2VUeXBlIHR5cGUpOworfTsKKworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZGaWx0ZXJfUXVlcnlJbnRlcmZhY2UgKGxpYkFWRmlsdGVyICosIGNvbnN0IEdVSUQgKiwgdm9pZCAqKik7Cit1bnNpZ25lZCBsb25nIFdJTkFQSSBsaWJBVkZpbHRlcl9BZGRSZWYgICAgICAgICAobGliQVZGaWx0ZXIgKik7Cit1bnNpZ25lZCBsb25nIFdJTkFQSSBsaWJBVkZpbHRlcl9SZWxlYXNlICAgICAgICAobGliQVZGaWx0ZXIgKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVkZpbHRlcl9HZXRDbGFzc0lEICAgICAobGliQVZGaWx0ZXIgKiwgQ0xTSUQgKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVkZpbHRlcl9TdG9wICAgICAgICAgICAobGliQVZGaWx0ZXIgKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVkZpbHRlcl9QYXVzZSAgICAgICAgICAobGliQVZGaWx0ZXIgKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVkZpbHRlcl9SdW4gICAgICAgICAgICAobGliQVZGaWx0ZXIgKiwgUkVGRVJFTkNFX1RJTUUpOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZGaWx0ZXJfR2V0U3RhdGUgICAgICAgKGxpYkFWRmlsdGVyICosIERXT1JELCBGSUxURVJfU1RBVEUgKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVkZpbHRlcl9TZXRTeW5jU291cmNlICAobGliQVZGaWx0ZXIgKiwgSVJlZmVyZW5jZUNsb2NrICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZGaWx0ZXJfR2V0U3luY1NvdXJjZSAgKGxpYkFWRmlsdGVyICosIElSZWZlcmVuY2VDbG9jayAqKik7Citsb25nICAgICAgICAgIFdJTkFQSSBsaWJBVkZpbHRlcl9FbnVtUGlucyAgICAgICAobGliQVZGaWx0ZXIgKiwgSUVudW1QaW5zICoqKTsKK2xvbmcgICAgICAgICAgV0lOQVBJIGxpYkFWRmlsdGVyX0ZpbmRQaW4gICAgICAgIChsaWJBVkZpbHRlciAqLCBjb25zdCB3Y2hhcl90ICosIElQaW4gKiopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZGaWx0ZXJfUXVlcnlGaWx0ZXJJbmZvKGxpYkFWRmlsdGVyICosIEZJTFRFUl9JTkZPICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZGaWx0ZXJfSm9pbkZpbHRlckdyYXBoKGxpYkFWRmlsdGVyICosIElGaWx0ZXJHcmFwaCAqLCBjb25zdCB3Y2hhcl90ICopOworbG9uZyAgICAgICAgICBXSU5BUEkgbGliQVZGaWx0ZXJfUXVlcnlWZW5kb3JJbmZvKGxpYkFWRmlsdGVyICosIHdjaGFyX3QgKiopOworCit2b2lkICAgICAgICAgICAgICAgICBsaWJBVkZpbHRlcl9EZXN0cm95KGxpYkFWRmlsdGVyICopOworbGliQVZGaWx0ZXIgICAgICAgICAqbGliQVZGaWx0ZXJfQ3JlYXRlICh2b2lkICosIHZvaWQgKiwgZW51bSBkc2hvd0RldmljZVR5cGUpOworCisjZW5kaWYgLyogQVZERVZJQ0VfRFNIT1dfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2RzaG93X2NvbW1vbi5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2RzaG93X2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjBkZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvZHNob3dfY29tbW9uLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBEaXJlY3RzaG93IGNhcHR1cmUgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmFtaXJvIFBvbGxhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkc2hvd19jYXB0dXJlLmgiCisKK2xvbmcgZmZfY29weV9kc2hvd19tZWRpYV90eXBlKEFNX01FRElBX1RZUEUgKmRzdCwgY29uc3QgQU1fTUVESUFfVFlQRSAqc3JjKQoreworICAgIHVpbnQ4X3QgKnBiRm9ybWF0ID0gTlVMTDsKKworICAgIGlmIChzcmMtPmNiRm9ybWF0KSB7CisgICAgICAgIHBiRm9ybWF0ID0gQ29UYXNrTWVtQWxsb2Moc3JjLT5jYkZvcm1hdCk7CisgICAgICAgIGlmICghcGJGb3JtYXQpCisgICAgICAgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKyAgICAgICAgbWVtY3B5KHBiRm9ybWF0LCBzcmMtPnBiRm9ybWF0LCBzcmMtPmNiRm9ybWF0KTsKKyAgICB9CisKKyAgICAqZHN0ID0gKnNyYzsKKyAgICBkc3QtPnBVbmsgPSBOVUxMOworICAgIGRzdC0+cGJGb3JtYXQgPSBwYkZvcm1hdDsKKworICAgIHJldHVybiBTX09LOworfQorCit2b2lkIGZmX3ByaW50R1VJRChjb25zdCBHVUlEICpnKQoreworI2lmIERTSE9XREVCVUcKKyAgICBjb25zdCB1aW50MzJfdCAqZCA9IChjb25zdCB1aW50MzJfdCAqKSAmZy0+RGF0YTE7CisgICAgY29uc3QgdWludDE2X3QgKncgPSAoY29uc3QgdWludDE2X3QgKikgJmctPkRhdGEyOworICAgIGNvbnN0IHVpbnQ4X3QgICpjID0gKGNvbnN0IHVpbnQ4X3QgICopICZnLT5EYXRhNDsKKworICAgIGRzaG93ZGVidWcoIjB4JTA4eCAweCUwNHggMHglMDR4ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgICAgIGRbMF0sIHdbMF0sIHdbMV0sCisgICAgICAgICAgICAgICBjWzBdLCBjWzFdLCBjWzJdLCBjWzNdLCBjWzRdLCBjWzVdLCBjWzZdLCBjWzddKTsKKyNlbmRpZgorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZHNob3dfY29udGV4dF90b19uYW1lKHZvaWQgKnB0cikKK3sKKyAgICByZXR1cm4gImRzaG93IjsKK30KK3N0YXRpYyBjb25zdCBBVkNsYXNzIGZmX2RzaG93X2NvbnRleHRfY2xhc3MgPSB7ICJEaXJlY3RTaG93IiwgZHNob3dfY29udGV4dF90b19uYW1lIH07Citjb25zdCBBVkNsYXNzICpmZl9kc2hvd19jb250ZXh0X2NsYXNzX3B0ciA9ICZmZl9kc2hvd19jb250ZXh0X2NsYXNzOworCisjZGVmaW5lIGRzdHJ1Y3QocGN0eCwgc25hbWUsIHZhciwgdHlwZSkgXAorICAgIGRzaG93ZGVidWcoIiAgICAgICIjdmFyIjpcdCUidHlwZSJcbiIsIHNuYW1lLT52YXIpCisKKyNpZiBEU0hPV0RFQlVHCitzdGF0aWMgdm9pZCBkdW1wX2JpaCh2b2lkICpzLCBCSVRNQVBJTkZPSEVBREVSICpiaWgpCit7CisgICAgZHNob3dkZWJ1ZygiICAgICAgQklUTUFQSU5GT0hFQURFUlxuIik7CisgICAgZHN0cnVjdChzLCBiaWgsIGJpU2l6ZSwgImx1Iik7CisgICAgZHN0cnVjdChzLCBiaWgsIGJpV2lkdGgsICJsZCIpOworICAgIGRzdHJ1Y3QocywgYmloLCBiaUhlaWdodCwgImxkIik7CisgICAgZHN0cnVjdChzLCBiaWgsIGJpUGxhbmVzLCAiZCIpOworICAgIGRzdHJ1Y3QocywgYmloLCBiaUJpdENvdW50LCAiZCIpOworICAgIGRzdHJ1Y3QocywgYmloLCBiaUNvbXByZXNzaW9uLCAibHUiKTsKKyAgICBkc2hvd2RlYnVnKCIgICAgICBiaUNvbXByZXNzaW9uOlx0XCIlLjRzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgKGNoYXIqKSAmYmloLT5iaUNvbXByZXNzaW9uKTsKKyAgICBkc3RydWN0KHMsIGJpaCwgYmlTaXplSW1hZ2UsICJsdSIpOworICAgIGRzdHJ1Y3QocywgYmloLCBiaVhQZWxzUGVyTWV0ZXIsICJsdSIpOworICAgIGRzdHJ1Y3QocywgYmloLCBiaVlQZWxzUGVyTWV0ZXIsICJsdSIpOworICAgIGRzdHJ1Y3QocywgYmloLCBiaUNsclVzZWQsICJsdSIpOworICAgIGRzdHJ1Y3QocywgYmloLCBiaUNsckltcG9ydGFudCwgImx1Iik7Cit9CisjZW5kaWYKKwordm9pZCBmZl9wcmludF9WSURFT19TVFJFQU1fQ09ORklHX0NBUFMoY29uc3QgVklERU9fU1RSRUFNX0NPTkZJR19DQVBTICpjYXBzKQoreworI2lmIERTSE9XREVCVUcKKyAgICBkc2hvd2RlYnVnKCIgVklERU9fU1RSRUFNX0NPTkZJR19DQVBTXG4iKTsKKyAgICBkc2hvd2RlYnVnKCIgIGd1aWRcdCIpOworICAgIGZmX3ByaW50R1VJRCgmY2Fwcy0+Z3VpZCk7CisgICAgZHNob3dkZWJ1ZygiXG4iKTsKKyAgICBkc2hvd2RlYnVnKCIgIFZpZGVvU3RhbmRhcmRcdCVsdVxuIiwgY2Fwcy0+VmlkZW9TdGFuZGFyZCk7CisgICAgZHNob3dkZWJ1ZygiICBJbnB1dFNpemUgJWxkXHQlbGRcbiIsIGNhcHMtPklucHV0U2l6ZS5jeCwgY2Fwcy0+SW5wdXRTaXplLmN5KTsKKyAgICBkc2hvd2RlYnVnKCIgIE1pbkNyb3BwaW5nU2l6ZSAlbGRcdCVsZFxuIiwgY2Fwcy0+TWluQ3JvcHBpbmdTaXplLmN4LCBjYXBzLT5NaW5Dcm9wcGluZ1NpemUuY3kpOworICAgIGRzaG93ZGVidWcoIiAgTWF4Q3JvcHBpbmdTaXplICVsZFx0JWxkXG4iLCBjYXBzLT5NYXhDcm9wcGluZ1NpemUuY3gsIGNhcHMtPk1heENyb3BwaW5nU2l6ZS5jeSk7CisgICAgZHNob3dkZWJ1ZygiICBDcm9wR3JhbnVsYXJpdHlYXHQlZFxuIiwgY2Fwcy0+Q3JvcEdyYW51bGFyaXR5WCk7CisgICAgZHNob3dkZWJ1ZygiICBDcm9wR3JhbnVsYXJpdHlZXHQlZFxuIiwgY2Fwcy0+Q3JvcEdyYW51bGFyaXR5WSk7CisgICAgZHNob3dkZWJ1ZygiICBDcm9wQWxpZ25YXHQlZFxuIiwgY2Fwcy0+Q3JvcEFsaWduWCk7CisgICAgZHNob3dkZWJ1ZygiICBDcm9wQWxpZ25ZXHQlZFxuIiwgY2Fwcy0+Q3JvcEFsaWduWSk7CisgICAgZHNob3dkZWJ1ZygiICBNaW5PdXRwdXRTaXplICVsZFx0JWxkXG4iLCBjYXBzLT5NaW5PdXRwdXRTaXplLmN4LCBjYXBzLT5NaW5PdXRwdXRTaXplLmN5KTsKKyAgICBkc2hvd2RlYnVnKCIgIE1heE91dHB1dFNpemUgJWxkXHQlbGRcbiIsIGNhcHMtPk1heE91dHB1dFNpemUuY3gsIGNhcHMtPk1heE91dHB1dFNpemUuY3kpOworICAgIGRzaG93ZGVidWcoIiAgT3V0cHV0R3JhbnVsYXJpdHlYXHQlZFxuIiwgY2Fwcy0+T3V0cHV0R3JhbnVsYXJpdHlYKTsKKyAgICBkc2hvd2RlYnVnKCIgIE91dHB1dEdyYW51bGFyaXR5WVx0JWRcbiIsIGNhcHMtPk91dHB1dEdyYW51bGFyaXR5WSk7CisgICAgZHNob3dkZWJ1ZygiICBTdHJldGNoVGFwc1hcdCVkXG4iLCBjYXBzLT5TdHJldGNoVGFwc1gpOworICAgIGRzaG93ZGVidWcoIiAgU3RyZXRjaFRhcHNZXHQlZFxuIiwgY2Fwcy0+U3RyZXRjaFRhcHNZKTsKKyAgICBkc2hvd2RlYnVnKCIgIFNocmlua1RhcHNYXHQlZFxuIiwgY2Fwcy0+U2hyaW5rVGFwc1gpOworICAgIGRzaG93ZGVidWcoIiAgU2hyaW5rVGFwc1lcdCVkXG4iLCBjYXBzLT5TaHJpbmtUYXBzWSk7CisgICAgZHNob3dkZWJ1ZygiICBNaW5GcmFtZUludGVydmFsXHQlIlBSSWQ2NCJcbiIsIGNhcHMtPk1pbkZyYW1lSW50ZXJ2YWwpOworICAgIGRzaG93ZGVidWcoIiAgTWF4RnJhbWVJbnRlcnZhbFx0JSJQUklkNjQiXG4iLCBjYXBzLT5NYXhGcmFtZUludGVydmFsKTsKKyAgICBkc2hvd2RlYnVnKCIgIE1pbkJpdHNQZXJTZWNvbmRcdCVsZFxuIiwgY2Fwcy0+TWluQml0c1BlclNlY29uZCk7CisgICAgZHNob3dkZWJ1ZygiICBNYXhCaXRzUGVyU2Vjb25kXHQlbGRcbiIsIGNhcHMtPk1heEJpdHNQZXJTZWNvbmQpOworI2VuZGlmCit9CisKK3ZvaWQgZmZfcHJpbnRfQVVESU9fU1RSRUFNX0NPTkZJR19DQVBTKGNvbnN0IEFVRElPX1NUUkVBTV9DT05GSUdfQ0FQUyAqY2FwcykKK3sKKyNpZiBEU0hPV0RFQlVHCisgICAgZHNob3dkZWJ1ZygiIEFVRElPX1NUUkVBTV9DT05GSUdfQ0FQU1xuIik7CisgICAgZHNob3dkZWJ1ZygiICBndWlkXHQiKTsKKyAgICBmZl9wcmludEdVSUQoJmNhcHMtPmd1aWQpOworICAgIGRzaG93ZGVidWcoIlxuIik7CisgICAgZHNob3dkZWJ1ZygiICBNaW5pbXVtQ2hhbm5lbHNcdCVsdVxuIiwgY2Fwcy0+TWluaW11bUNoYW5uZWxzKTsKKyAgICBkc2hvd2RlYnVnKCIgIE1heGltdW1DaGFubmVsc1x0JWx1XG4iLCBjYXBzLT5NYXhpbXVtQ2hhbm5lbHMpOworICAgIGRzaG93ZGVidWcoIiAgQ2hhbm5lbHNHcmFudWxhcml0eVx0JWx1XG4iLCBjYXBzLT5DaGFubmVsc0dyYW51bGFyaXR5KTsKKyAgICBkc2hvd2RlYnVnKCIgIE1pbmltdW1CaXRzUGVyU2FtcGxlXHQlbHVcbiIsIGNhcHMtPk1pbmltdW1CaXRzUGVyU2FtcGxlKTsKKyAgICBkc2hvd2RlYnVnKCIgIE1heGltdW1CaXRzUGVyU2FtcGxlXHQlbHVcbiIsIGNhcHMtPk1heGltdW1CaXRzUGVyU2FtcGxlKTsKKyAgICBkc2hvd2RlYnVnKCIgIEJpdHNQZXJTYW1wbGVHcmFudWxhcml0eVx0JWx1XG4iLCBjYXBzLT5CaXRzUGVyU2FtcGxlR3JhbnVsYXJpdHkpOworICAgIGRzaG93ZGVidWcoIiAgTWluaW11bVNhbXBsZUZyZXF1ZW5jeVx0JWx1XG4iLCBjYXBzLT5NaW5pbXVtU2FtcGxlRnJlcXVlbmN5KTsKKyAgICBkc2hvd2RlYnVnKCIgIE1heGltdW1TYW1wbGVGcmVxdWVuY3lcdCVsdVxuIiwgY2Fwcy0+TWF4aW11bVNhbXBsZUZyZXF1ZW5jeSk7CisgICAgZHNob3dkZWJ1ZygiICBTYW1wbGVGcmVxdWVuY3lHcmFudWxhcml0eVx0JWx1XG4iLCBjYXBzLT5TYW1wbGVGcmVxdWVuY3lHcmFudWxhcml0eSk7CisjZW5kaWYKK30KKwordm9pZCBmZl9wcmludF9BTV9NRURJQV9UWVBFKGNvbnN0IEFNX01FRElBX1RZUEUgKnR5cGUpCit7CisjaWYgRFNIT1dERUJVRworICAgIGRzaG93ZGVidWcoIiAgICBtYWpvcnR5cGVcdCIpOworICAgIGZmX3ByaW50R1VJRCgmdHlwZS0+bWFqb3J0eXBlKTsKKyAgICBkc2hvd2RlYnVnKCJcbiIpOworICAgIGRzaG93ZGVidWcoIiAgICBzdWJ0eXBlXHQiKTsKKyAgICBmZl9wcmludEdVSUQoJnR5cGUtPnN1YnR5cGUpOworICAgIGRzaG93ZGVidWcoIlxuIik7CisgICAgZHNob3dkZWJ1ZygiICAgIGJGaXhlZFNpemVTYW1wbGVzXHQlZFxuIiwgdHlwZS0+YkZpeGVkU2l6ZVNhbXBsZXMpOworICAgIGRzaG93ZGVidWcoIiAgICBiVGVtcG9yYWxDb21wcmVzc2lvblx0JWRcbiIsIHR5cGUtPmJUZW1wb3JhbENvbXByZXNzaW9uKTsKKyAgICBkc2hvd2RlYnVnKCIgICAgbFNhbXBsZVNpemVcdCVsdVxuIiwgdHlwZS0+bFNhbXBsZVNpemUpOworICAgIGRzaG93ZGVidWcoIiAgICBmb3JtYXR0eXBlXHQiKTsKKyAgICBmZl9wcmludEdVSUQoJnR5cGUtPmZvcm1hdHR5cGUpOworICAgIGRzaG93ZGVidWcoIlxuIik7CisgICAgZHNob3dkZWJ1ZygiICAgIHBVbmtcdCVwXG4iLCB0eXBlLT5wVW5rKTsKKyAgICBkc2hvd2RlYnVnKCIgICAgY2JGb3JtYXRcdCVsdVxuIiwgdHlwZS0+Y2JGb3JtYXQpOworICAgIGRzaG93ZGVidWcoIiAgICBwYkZvcm1hdFx0JXBcbiIsIHR5cGUtPnBiRm9ybWF0KTsKKworICAgIGlmIChJc0VxdWFsR1VJRCgmdHlwZS0+Zm9ybWF0dHlwZSwgJkZPUk1BVF9WaWRlb0luZm8pKSB7CisgICAgICAgIFZJREVPSU5GT0hFQURFUiAqdiA9ICh2b2lkICopIHR5cGUtPnBiRm9ybWF0OworICAgICAgICBkc2hvd2RlYnVnKCIgICAgICByY1NvdXJjZTogbGVmdCAlbGQgdG9wICVsZCByaWdodCAlbGQgYm90dG9tICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICB2LT5yY1NvdXJjZS5sZWZ0LCB2LT5yY1NvdXJjZS50b3AsIHYtPnJjU291cmNlLnJpZ2h0LCB2LT5yY1NvdXJjZS5ib3R0b20pOworICAgICAgICBkc2hvd2RlYnVnKCIgICAgICByY1RhcmdldDogbGVmdCAlbGQgdG9wICVsZCByaWdodCAlbGQgYm90dG9tICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICB2LT5yY1RhcmdldC5sZWZ0LCB2LT5yY1RhcmdldC50b3AsIHYtPnJjVGFyZ2V0LnJpZ2h0LCB2LT5yY1RhcmdldC5ib3R0b20pOworICAgICAgICBkc2hvd2RlYnVnKCIgICAgICBkd0JpdFJhdGU6ICVsdVxuIiwgdi0+ZHdCaXRSYXRlKTsKKyAgICAgICAgZHNob3dkZWJ1ZygiICAgICAgZHdCaXRFcnJvclJhdGU6ICVsdVxuIiwgdi0+ZHdCaXRFcnJvclJhdGUpOworICAgICAgICBkc2hvd2RlYnVnKCIgICAgICBBdmdUaW1lUGVyRnJhbWU6ICUiUFJJZDY0IlxuIiwgdi0+QXZnVGltZVBlckZyYW1lKTsKKyAgICAgICAgZHVtcF9iaWgoTlVMTCwgJnYtPmJtaUhlYWRlcik7CisgICAgfSBlbHNlIGlmIChJc0VxdWFsR1VJRCgmdHlwZS0+Zm9ybWF0dHlwZSwgJkZPUk1BVF9WaWRlb0luZm8yKSkgeworICAgICAgICBWSURFT0lORk9IRUFERVIyICp2ID0gKHZvaWQgKikgdHlwZS0+cGJGb3JtYXQ7CisgICAgICAgIGRzaG93ZGVidWcoIiAgICAgIHJjU291cmNlOiBsZWZ0ICVsZCB0b3AgJWxkIHJpZ2h0ICVsZCBib3R0b20gJWxkXG4iLAorICAgICAgICAgICAgICAgICAgIHYtPnJjU291cmNlLmxlZnQsIHYtPnJjU291cmNlLnRvcCwgdi0+cmNTb3VyY2UucmlnaHQsIHYtPnJjU291cmNlLmJvdHRvbSk7CisgICAgICAgIGRzaG93ZGVidWcoIiAgICAgIHJjVGFyZ2V0OiBsZWZ0ICVsZCB0b3AgJWxkIHJpZ2h0ICVsZCBib3R0b20gJWxkXG4iLAorICAgICAgICAgICAgICAgICAgIHYtPnJjVGFyZ2V0LmxlZnQsIHYtPnJjVGFyZ2V0LnRvcCwgdi0+cmNUYXJnZXQucmlnaHQsIHYtPnJjVGFyZ2V0LmJvdHRvbSk7CisgICAgICAgIGRzaG93ZGVidWcoIiAgICAgIGR3Qml0UmF0ZTogJWx1XG4iLCB2LT5kd0JpdFJhdGUpOworICAgICAgICBkc2hvd2RlYnVnKCIgICAgICBkd0JpdEVycm9yUmF0ZTogJWx1XG4iLCB2LT5kd0JpdEVycm9yUmF0ZSk7CisgICAgICAgIGRzaG93ZGVidWcoIiAgICAgIEF2Z1RpbWVQZXJGcmFtZTogJSJQUklkNjQiXG4iLCB2LT5BdmdUaW1lUGVyRnJhbWUpOworICAgICAgICBkc2hvd2RlYnVnKCIgICAgICBkd0ludGVybGFjZUZsYWdzOiAlbHVcbiIsIHYtPmR3SW50ZXJsYWNlRmxhZ3MpOworICAgICAgICBkc2hvd2RlYnVnKCIgICAgICBkd0NvcHlQcm90ZWN0RmxhZ3M6ICVsdVxuIiwgdi0+ZHdDb3B5UHJvdGVjdEZsYWdzKTsKKyAgICAgICAgZHNob3dkZWJ1ZygiICAgICAgZHdQaWN0QXNwZWN0UmF0aW9YOiAlbHVcbiIsIHYtPmR3UGljdEFzcGVjdFJhdGlvWCk7CisgICAgICAgIGRzaG93ZGVidWcoIiAgICAgIGR3UGljdEFzcGVjdFJhdGlvWTogJWx1XG4iLCB2LT5kd1BpY3RBc3BlY3RSYXRpb1kpOworLy8gICAgICAgIGRzaG93ZGVidWcoIiAgICAgIGR3UmVzZXJ2ZWQxOiAlbHVcbiIsIHYtPnUuZHdSZXNlcnZlZDEpOyAvKiBtaW5ndy13NjQgaXMgYnVnZ3kgYW5kIGRvZXNuJ3QgbmFtZSB1bm5hbWVkIHVuaW9ucyAqLworICAgICAgICBkc2hvd2RlYnVnKCIgICAgICBkd1Jlc2VydmVkMjogJWx1XG4iLCB2LT5kd1Jlc2VydmVkMik7CisgICAgICAgIGR1bXBfYmloKE5VTEwsICZ2LT5ibWlIZWFkZXIpOworICAgIH0gZWxzZSBpZiAoSXNFcXVhbEdVSUQoJnR5cGUtPmZvcm1hdHR5cGUsICZGT1JNQVRfV2F2ZUZvcm1hdEV4KSkgeworICAgICAgICBXQVZFRk9STUFURVggKmZ4ID0gKHZvaWQgKikgdHlwZS0+cGJGb3JtYXQ7CisgICAgICAgIGRzaG93ZGVidWcoIiAgICAgIHdGb3JtYXRUYWc6ICV1XG4iLCBmeC0+d0Zvcm1hdFRhZyk7CisgICAgICAgIGRzaG93ZGVidWcoIiAgICAgIG5DaGFubmVsczogJXVcbiIsIGZ4LT5uQ2hhbm5lbHMpOworICAgICAgICBkc2hvd2RlYnVnKCIgICAgICBuU2FtcGxlc1BlclNlYzogJWx1XG4iLCBmeC0+blNhbXBsZXNQZXJTZWMpOworICAgICAgICBkc2hvd2RlYnVnKCIgICAgICBuQXZnQnl0ZXNQZXJTZWM6ICVsdVxuIiwgZngtPm5BdmdCeXRlc1BlclNlYyk7CisgICAgICAgIGRzaG93ZGVidWcoIiAgICAgIG5CbG9ja0FsaWduOiAldVxuIiwgZngtPm5CbG9ja0FsaWduKTsKKyAgICAgICAgZHNob3dkZWJ1ZygiICAgICAgd0JpdHNQZXJTYW1wbGU6ICV1XG4iLCBmeC0+d0JpdHNQZXJTYW1wbGUpOworICAgICAgICBkc2hvd2RlYnVnKCIgICAgICBjYlNpemU6ICV1XG4iLCBmeC0+Y2JTaXplKTsKKyAgICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9kc2hvd19lbnVtbWVkaWF0eXBlcy5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2RzaG93X2VudW1tZWRpYXR5cGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2OWE1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9kc2hvd19lbnVtbWVkaWF0eXBlcy5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogRGlyZWN0U2hvdyBjYXB0dXJlIGludGVyZmFjZQorICogQ29weXJpZ2h0IChjKSAyMDEwIFJhbWlybyBQb2xsYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZHNob3dfY2FwdHVyZS5oIgorCitERUNMQVJFX1FVRVJZSU5URVJGQUNFKGxpYkFWRW51bU1lZGlhVHlwZXMsCisgICAgeyB7JklJRF9JVW5rbm93biwwfSwgeyZJSURfSUVudW1NZWRpYVR5cGVzLDB9IH0pCitERUNMQVJFX0FERFJFRihsaWJBVkVudW1NZWRpYVR5cGVzKQorREVDTEFSRV9SRUxFQVNFKGxpYkFWRW51bU1lZGlhVHlwZXMpCisKK2xvbmcgV0lOQVBJCitsaWJBVkVudW1NZWRpYVR5cGVzX05leHQobGliQVZFbnVtTWVkaWFUeXBlcyAqdGhpcywgdW5zaWduZWQgbG9uZyBuLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFNX01FRElBX1RZUEUgKip0eXBlcywgdW5zaWduZWQgbG9uZyAqZmV0Y2hlZCkKK3sKKyAgICBpbnQgY291bnQgPSAwOworICAgIGRzaG93ZGVidWcoImxpYkFWRW51bU1lZGlhVHlwZXNfTmV4dCglcClcbiIsIHRoaXMpOworICAgIGlmICghdHlwZXMpCisgICAgICAgIHJldHVybiBFX1BPSU5URVI7CisgICAgaWYgKCF0aGlzLT5wb3MgJiYgbiA9PSAxKSB7CisgICAgICAgIGlmICghSXNFcXVhbEdVSUQoJnRoaXMtPnR5cGUubWFqb3J0eXBlLCAmR1VJRF9OVUxMKSkgeworICAgICAgICAgICAgQU1fTUVESUFfVFlQRSAqdHlwZSA9IGF2X21hbGxvYyhzaXplb2YoQU1fTUVESUFfVFlQRSkpOworICAgICAgICAgICAgZmZfY29weV9kc2hvd19tZWRpYV90eXBlKHR5cGUsICZ0aGlzLT50eXBlKTsKKyAgICAgICAgICAgICp0eXBlcyA9IHR5cGU7CisgICAgICAgICAgICBjb3VudCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy0+cG9zID0gMTsKKyAgICB9CisgICAgaWYgKGZldGNoZWQpCisgICAgICAgICpmZXRjaGVkID0gY291bnQ7CisgICAgaWYgKCFjb3VudCkKKyAgICAgICAgcmV0dXJuIFNfRkFMU0U7CisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZFbnVtTWVkaWFUeXBlc19Ta2lwKGxpYkFWRW51bU1lZGlhVHlwZXMgKnRoaXMsIHVuc2lnbmVkIGxvbmcgbikKK3sKKyAgICBkc2hvd2RlYnVnKCJsaWJBVkVudW1NZWRpYVR5cGVzX1NraXAoJXApXG4iLCB0aGlzKTsKKyAgICBpZiAobikgLyogQW55IHNraXAgd2lsbCBhbHdheXMgZmFsbCBvdXRzaWRlIG9mIHRoZSBvbmx5IHZhbGlkIHR5cGUuICovCisgICAgICAgIHJldHVybiBTX0ZBTFNFOworICAgIHJldHVybiBTX09LOworfQorbG9uZyBXSU5BUEkKK2xpYkFWRW51bU1lZGlhVHlwZXNfUmVzZXQobGliQVZFbnVtTWVkaWFUeXBlcyAqdGhpcykKK3sKKyAgICBkc2hvd2RlYnVnKCJsaWJBVkVudW1NZWRpYVR5cGVzX1Jlc2V0KCVwKVxuIiwgdGhpcyk7CisgICAgdGhpcy0+cG9zID0gMDsKKyAgICByZXR1cm4gU19PSzsKK30KK2xvbmcgV0lOQVBJCitsaWJBVkVudW1NZWRpYVR5cGVzX0Nsb25lKGxpYkFWRW51bU1lZGlhVHlwZXMgKnRoaXMsIGxpYkFWRW51bU1lZGlhVHlwZXMgKiplbnVtcykKK3sKKyAgICBsaWJBVkVudW1NZWRpYVR5cGVzICpuZXc7CisgICAgZHNob3dkZWJ1ZygibGliQVZFbnVtTWVkaWFUeXBlc19DbG9uZSglcClcbiIsIHRoaXMpOworICAgIGlmICghZW51bXMpCisgICAgICAgIHJldHVybiBFX1BPSU5URVI7CisgICAgbmV3ID0gbGliQVZFbnVtTWVkaWFUeXBlc19DcmVhdGUoJnRoaXMtPnR5cGUpOworICAgIGlmICghbmV3KQorICAgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKyAgICBuZXctPnBvcyA9IHRoaXMtPnBvczsKKyAgICAqZW51bXMgPSBuZXc7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK3N0YXRpYyBpbnQKK2xpYkFWRW51bU1lZGlhVHlwZXNfU2V0dXAobGliQVZFbnVtTWVkaWFUeXBlcyAqdGhpcywgY29uc3QgQU1fTUVESUFfVFlQRSAqdHlwZSkKK3sKKyAgICBJRW51bU1lZGlhVHlwZXNWdGJsICp2dGJsID0gdGhpcy0+dnRibDsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRW51bU1lZGlhVHlwZXMsIFF1ZXJ5SW50ZXJmYWNlKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRW51bU1lZGlhVHlwZXMsIEFkZFJlZik7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVkVudW1NZWRpYVR5cGVzLCBSZWxlYXNlKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRW51bU1lZGlhVHlwZXMsIE5leHQpOworICAgIFNFVFZUQkwodnRibCwgbGliQVZFbnVtTWVkaWFUeXBlcywgU2tpcCk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVkVudW1NZWRpYVR5cGVzLCBSZXNldCk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVkVudW1NZWRpYVR5cGVzLCBDbG9uZSk7CisKKyAgICBpZiAoIXR5cGUpIHsKKyAgICAgICAgdGhpcy0+dHlwZS5tYWpvcnR5cGUgPSBHVUlEX05VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmZfY29weV9kc2hvd19tZWRpYV90eXBlKCZ0aGlzLT50eXBlLCB0eXBlKTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KK0RFQ0xBUkVfQ1JFQVRFKGxpYkFWRW51bU1lZGlhVHlwZXMsIGxpYkFWRW51bU1lZGlhVHlwZXNfU2V0dXAodGhpcywgdHlwZSksIGNvbnN0IEFNX01FRElBX1RZUEUgKnR5cGUpCitERUNMQVJFX0RFU1RST1kobGliQVZFbnVtTWVkaWFUeXBlcywgbm90aGluZykKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9kc2hvd19lbnVtcGlucy5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2RzaG93X2VudW1waW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjMTFjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9kc2hvd19lbnVtcGlucy5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogRGlyZWN0U2hvdyBjYXB0dXJlIGludGVyZmFjZQorICogQ29weXJpZ2h0IChjKSAyMDEwIFJhbWlybyBQb2xsYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZHNob3dfY2FwdHVyZS5oIgorCitERUNMQVJFX1FVRVJZSU5URVJGQUNFKGxpYkFWRW51bVBpbnMsCisgICAgeyB7JklJRF9JVW5rbm93biwwfSwgeyZJSURfSUVudW1QaW5zLDB9IH0pCitERUNMQVJFX0FERFJFRihsaWJBVkVudW1QaW5zKQorREVDTEFSRV9SRUxFQVNFKGxpYkFWRW51bVBpbnMpCisKK2xvbmcgV0lOQVBJCitsaWJBVkVudW1QaW5zX05leHQobGliQVZFbnVtUGlucyAqdGhpcywgdW5zaWduZWQgbG9uZyBuLCBJUGluICoqcGlucywKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpmZXRjaGVkKQoreworICAgIGludCBjb3VudCA9IDA7CisgICAgZHNob3dkZWJ1ZygibGliQVZFbnVtUGluc19OZXh0KCVwKVxuIiwgdGhpcyk7CisgICAgaWYgKCFwaW5zKQorICAgICAgICByZXR1cm4gRV9QT0lOVEVSOworICAgIGlmICghdGhpcy0+cG9zICYmIG4gPT0gMSkgeworICAgICAgICBsaWJBVlBpbl9BZGRSZWYodGhpcy0+cGluKTsKKyAgICAgICAgKnBpbnMgPSAoSVBpbiAqKSB0aGlzLT5waW47CisgICAgICAgIGNvdW50ID0gMTsKKyAgICAgICAgdGhpcy0+cG9zID0gMTsKKyAgICB9CisgICAgaWYgKGZldGNoZWQpCisgICAgICAgICpmZXRjaGVkID0gY291bnQ7CisgICAgaWYgKCFjb3VudCkKKyAgICAgICAgcmV0dXJuIFNfRkFMU0U7CisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZFbnVtUGluc19Ta2lwKGxpYkFWRW51bVBpbnMgKnRoaXMsIHVuc2lnbmVkIGxvbmcgbikKK3sKKyAgICBkc2hvd2RlYnVnKCJsaWJBVkVudW1QaW5zX1NraXAoJXApXG4iLCB0aGlzKTsKKyAgICBpZiAobikgLyogQW55IHNraXAgd2lsbCBhbHdheXMgZmFsbCBvdXRzaWRlIG9mIHRoZSBvbmx5IHZhbGlkIHBpbi4gKi8KKyAgICAgICAgcmV0dXJuIFNfRkFMU0U7CisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZFbnVtUGluc19SZXNldChsaWJBVkVudW1QaW5zICp0aGlzKQoreworICAgIGRzaG93ZGVidWcoImxpYkFWRW51bVBpbnNfUmVzZXQoJXApXG4iLCB0aGlzKTsKKyAgICB0aGlzLT5wb3MgPSAwOworICAgIHJldHVybiBTX09LOworfQorbG9uZyBXSU5BUEkKK2xpYkFWRW51bVBpbnNfQ2xvbmUobGliQVZFbnVtUGlucyAqdGhpcywgbGliQVZFbnVtUGlucyAqKnBpbnMpCit7CisgICAgbGliQVZFbnVtUGlucyAqbmV3OworICAgIGRzaG93ZGVidWcoImxpYkFWRW51bVBpbnNfQ2xvbmUoJXApXG4iLCB0aGlzKTsKKyAgICBpZiAoIXBpbnMpCisgICAgICAgIHJldHVybiBFX1BPSU5URVI7CisgICAgbmV3ID0gbGliQVZFbnVtUGluc19DcmVhdGUodGhpcy0+cGluLCB0aGlzLT5maWx0ZXIpOworICAgIGlmICghbmV3KQorICAgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKyAgICBuZXctPnBvcyA9IHRoaXMtPnBvczsKKyAgICAqcGlucyA9IG5ldzsKKyAgICByZXR1cm4gU19PSzsKK30KKworc3RhdGljIGludAorbGliQVZFbnVtUGluc19TZXR1cChsaWJBVkVudW1QaW5zICp0aGlzLCBsaWJBVlBpbiAqcGluLCBsaWJBVkZpbHRlciAqZmlsdGVyKQoreworICAgIElFbnVtUGluc1Z0YmwgKnZ0YmwgPSB0aGlzLT52dGJsOworICAgIFNFVFZUQkwodnRibCwgbGliQVZFbnVtUGlucywgUXVlcnlJbnRlcmZhY2UpOworICAgIFNFVFZUQkwodnRibCwgbGliQVZFbnVtUGlucywgQWRkUmVmKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRW51bVBpbnMsIFJlbGVhc2UpOworICAgIFNFVFZUQkwodnRibCwgbGliQVZFbnVtUGlucywgTmV4dCk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVkVudW1QaW5zLCBTa2lwKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRW51bVBpbnMsIFJlc2V0KTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRW51bVBpbnMsIENsb25lKTsKKworICAgIHRoaXMtPnBpbiA9IHBpbjsKKyAgICB0aGlzLT5maWx0ZXIgPSBmaWx0ZXI7CisgICAgbGliQVZGaWx0ZXJfQWRkUmVmKHRoaXMtPmZpbHRlcik7CisKKyAgICByZXR1cm4gMTsKK30KK3N0YXRpYyBpbnQKK2xpYkFWRW51bVBpbnNfQ2xlYW51cChsaWJBVkVudW1QaW5zICp0aGlzKQoreworICAgIGxpYkFWRmlsdGVyX1JlbGVhc2UodGhpcy0+ZmlsdGVyKTsKKyAgICByZXR1cm4gMTsKK30KK0RFQ0xBUkVfQ1JFQVRFKGxpYkFWRW51bVBpbnMsIGxpYkFWRW51bVBpbnNfU2V0dXAodGhpcywgcGluLCBmaWx0ZXIpLAorICAgICAgICAgICAgICAgbGliQVZQaW4gKnBpbiwgbGliQVZGaWx0ZXIgKmZpbHRlcikKK0RFQ0xBUkVfREVTVFJPWShsaWJBVkVudW1QaW5zLCBsaWJBVkVudW1QaW5zX0NsZWFudXApCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvZHNob3dfZmlsdGVyLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvZHNob3dfZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2MGFkYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9kc2hvd19maWx0ZXIuYwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIERpcmVjdFNob3cgY2FwdHVyZSBpbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoYykgMjAxMCBSYW1pcm8gUG9sbGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImRzaG93X2NhcHR1cmUuaCIKKworREVDTEFSRV9RVUVSWUlOVEVSRkFDRShsaWJBVkZpbHRlciwKKyAgICB7IHsmSUlEX0lVbmtub3duLDB9LCB7JklJRF9JQmFzZUZpbHRlciwwfSB9KQorREVDTEFSRV9BRERSRUYobGliQVZGaWx0ZXIpCitERUNMQVJFX1JFTEVBU0UobGliQVZGaWx0ZXIpCisKK2xvbmcgV0lOQVBJCitsaWJBVkZpbHRlcl9HZXRDbGFzc0lEKGxpYkFWRmlsdGVyICp0aGlzLCBDTFNJRCAqaWQpCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZGaWx0ZXJfR2V0Q2xhc3NJRCglcClcbiIsIHRoaXMpOworICAgIC8qIEknbSBub3QgY3JlYXRpbmcgYSBDbGFzc0lEIGp1c3QgZm9yIHRoaXMuICovCisgICAgcmV0dXJuIEVfRkFJTDsKK30KK2xvbmcgV0lOQVBJCitsaWJBVkZpbHRlcl9TdG9wKGxpYkFWRmlsdGVyICp0aGlzKQoreworICAgIGRzaG93ZGVidWcoImxpYkFWRmlsdGVyX1N0b3AoJXApXG4iLCB0aGlzKTsKKyAgICB0aGlzLT5zdGF0ZSA9IFN0YXRlX1N0b3BwZWQ7CisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZGaWx0ZXJfUGF1c2UobGliQVZGaWx0ZXIgKnRoaXMpCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZGaWx0ZXJfUGF1c2UoJXApXG4iLCB0aGlzKTsKKyAgICB0aGlzLT5zdGF0ZSA9IFN0YXRlX1BhdXNlZDsKKyAgICByZXR1cm4gU19PSzsKK30KK2xvbmcgV0lOQVBJCitsaWJBVkZpbHRlcl9SdW4obGliQVZGaWx0ZXIgKnRoaXMsIFJFRkVSRU5DRV9USU1FIHN0YXJ0KQoreworICAgIGRzaG93ZGVidWcoImxpYkFWRmlsdGVyX1J1biglcCkgJSJQUklkNjQiXG4iLCB0aGlzLCBzdGFydCk7CisgICAgdGhpcy0+c3RhdGUgPSBTdGF0ZV9SdW5uaW5nOworICAgIHRoaXMtPnN0YXJ0X3RpbWUgPSBzdGFydDsKKyAgICByZXR1cm4gU19PSzsKK30KK2xvbmcgV0lOQVBJCitsaWJBVkZpbHRlcl9HZXRTdGF0ZShsaWJBVkZpbHRlciAqdGhpcywgRFdPUkQgbXMsIEZJTFRFUl9TVEFURSAqc3RhdGUpCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZGaWx0ZXJfR2V0U3RhdGUoJXApXG4iLCB0aGlzKTsKKyAgICBpZiAoIXN0YXRlKQorICAgICAgICByZXR1cm4gRV9QT0lOVEVSOworICAgICpzdGF0ZSA9IHRoaXMtPnN0YXRlOworICAgIHJldHVybiBTX09LOworfQorbG9uZyBXSU5BUEkKK2xpYkFWRmlsdGVyX1NldFN5bmNTb3VyY2UobGliQVZGaWx0ZXIgKnRoaXMsIElSZWZlcmVuY2VDbG9jayAqY2xvY2spCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZGaWx0ZXJfU2V0U3luY1NvdXJjZSglcClcbiIsIHRoaXMpOworCisgICAgaWYgKHRoaXMtPmNsb2NrICE9IGNsb2NrKSB7CisgICAgICAgIGlmICh0aGlzLT5jbG9jaykKKyAgICAgICAgICAgIElSZWZlcmVuY2VDbG9ja19SZWxlYXNlKHRoaXMtPmNsb2NrKTsKKyAgICAgICAgdGhpcy0+Y2xvY2sgPSBjbG9jazsKKyAgICAgICAgaWYgKGNsb2NrKQorICAgICAgICAgICAgSVJlZmVyZW5jZUNsb2NrX0FkZFJlZihjbG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZGaWx0ZXJfR2V0U3luY1NvdXJjZShsaWJBVkZpbHRlciAqdGhpcywgSVJlZmVyZW5jZUNsb2NrICoqY2xvY2spCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZGaWx0ZXJfR2V0U3luY1NvdXJjZSglcClcbiIsIHRoaXMpOworCisgICAgaWYgKCFjbG9jaykKKyAgICAgICAgcmV0dXJuIEVfUE9JTlRFUjsKKyAgICBpZiAodGhpcy0+Y2xvY2spCisgICAgICAgIElSZWZlcmVuY2VDbG9ja19BZGRSZWYodGhpcy0+Y2xvY2spOworICAgICpjbG9jayA9IHRoaXMtPmNsb2NrOworCisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZGaWx0ZXJfRW51bVBpbnMobGliQVZGaWx0ZXIgKnRoaXMsIElFbnVtUGlucyAqKmVudW1waW4pCit7CisgICAgbGliQVZFbnVtUGlucyAqbmV3OworICAgIGRzaG93ZGVidWcoImxpYkFWRmlsdGVyX0VudW1QaW5zKCVwKVxuIiwgdGhpcyk7CisKKyAgICBpZiAoIWVudW1waW4pCisgICAgICAgIHJldHVybiBFX1BPSU5URVI7CisgICAgbmV3ID0gbGliQVZFbnVtUGluc19DcmVhdGUodGhpcy0+cGluLCB0aGlzKTsKKyAgICBpZiAoIW5ldykKKyAgICAgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisKKyAgICAqZW51bXBpbiA9IChJRW51bVBpbnMgKikgbmV3OworICAgIHJldHVybiBTX09LOworfQorbG9uZyBXSU5BUEkKK2xpYkFWRmlsdGVyX0ZpbmRQaW4obGliQVZGaWx0ZXIgKnRoaXMsIGNvbnN0IHdjaGFyX3QgKmlkLCBJUGluICoqcGluKQoreworICAgIGxpYkFWUGluICpmb3VuZCA9IE5VTEw7CisgICAgZHNob3dkZWJ1ZygibGliQVZGaWx0ZXJfRmluZFBpbiglcClcbiIsIHRoaXMpOworCisgICAgaWYgKCFpZCB8fCAhcGluKQorICAgICAgICByZXR1cm4gRV9QT0lOVEVSOworICAgIGlmICghd2NzY21wKGlkLCBMIkluIikpIHsKKyAgICAgICAgZm91bmQgPSB0aGlzLT5waW47CisgICAgICAgIGxpYkFWUGluX0FkZFJlZihmb3VuZCk7CisgICAgfQorICAgICpwaW4gPSAoSVBpbiAqKSBmb3VuZDsKKyAgICBpZiAoIWZvdW5kKQorICAgICAgICByZXR1cm4gVkZXX0VfTk9UX0ZPVU5EOworCisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZGaWx0ZXJfUXVlcnlGaWx0ZXJJbmZvKGxpYkFWRmlsdGVyICp0aGlzLCBGSUxURVJfSU5GTyAqaW5mbykKK3sKKyAgICBkc2hvd2RlYnVnKCJsaWJBVkZpbHRlcl9RdWVyeUZpbHRlckluZm8oJXApXG4iLCB0aGlzKTsKKworICAgIGlmICghaW5mbykKKyAgICAgICAgcmV0dXJuIEVfUE9JTlRFUjsKKyAgICBpZiAodGhpcy0+aW5mby5wR3JhcGgpCisgICAgICAgIElGaWx0ZXJHcmFwaF9BZGRSZWYodGhpcy0+aW5mby5wR3JhcGgpOworICAgICppbmZvID0gdGhpcy0+aW5mbzsKKworICAgIHJldHVybiBTX09LOworfQorbG9uZyBXSU5BUEkKK2xpYkFWRmlsdGVyX0pvaW5GaWx0ZXJHcmFwaChsaWJBVkZpbHRlciAqdGhpcywgSUZpbHRlckdyYXBoICpncmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90ICpuYW1lKQoreworICAgIGRzaG93ZGVidWcoImxpYkFWRmlsdGVyX0pvaW5GaWx0ZXJHcmFwaCglcClcbiIsIHRoaXMpOworCisgICAgdGhpcy0+aW5mby5wR3JhcGggPSBncmFwaDsKKyAgICBpZiAobmFtZSkKKyAgICAgICAgd2NzY3B5KHRoaXMtPmluZm8uYWNoTmFtZSwgbmFtZSk7CisKKyAgICByZXR1cm4gU19PSzsKK30KK2xvbmcgV0lOQVBJCitsaWJBVkZpbHRlcl9RdWVyeVZlbmRvckluZm8obGliQVZGaWx0ZXIgKnRoaXMsIHdjaGFyX3QgKippbmZvKQoreworICAgIGRzaG93ZGVidWcoImxpYkFWRmlsdGVyX1F1ZXJ5VmVuZG9ySW5mbyglcClcbiIsIHRoaXMpOworCisgICAgaWYgKCFpbmZvKQorICAgICAgICByZXR1cm4gRV9QT0lOVEVSOworICAgICppbmZvID0gd2NzZHVwKEwibGliQVYiKTsKKworICAgIHJldHVybiBTX09LOworfQorCitzdGF0aWMgaW50CitsaWJBVkZpbHRlcl9TZXR1cChsaWJBVkZpbHRlciAqdGhpcywgdm9pZCAqcHJpdl9kYXRhLCB2b2lkICpjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgIGVudW0gZHNob3dEZXZpY2VUeXBlIHR5cGUpCit7CisgICAgSUJhc2VGaWx0ZXJWdGJsICp2dGJsID0gdGhpcy0+dnRibDsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRmlsdGVyLCBRdWVyeUludGVyZmFjZSk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVkZpbHRlciwgQWRkUmVmKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRmlsdGVyLCBSZWxlYXNlKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRmlsdGVyLCBHZXRDbGFzc0lEKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRmlsdGVyLCBTdG9wKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRmlsdGVyLCBQYXVzZSk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVkZpbHRlciwgUnVuKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRmlsdGVyLCBHZXRTdGF0ZSk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVkZpbHRlciwgU2V0U3luY1NvdXJjZSk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVkZpbHRlciwgR2V0U3luY1NvdXJjZSk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVkZpbHRlciwgRW51bVBpbnMpOworICAgIFNFVFZUQkwodnRibCwgbGliQVZGaWx0ZXIsIEZpbmRQaW4pOworICAgIFNFVFZUQkwodnRibCwgbGliQVZGaWx0ZXIsIFF1ZXJ5RmlsdGVySW5mbyk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVkZpbHRlciwgSm9pbkZpbHRlckdyYXBoKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWRmlsdGVyLCBRdWVyeVZlbmRvckluZm8pOworCisgICAgdGhpcy0+cGluID0gbGliQVZQaW5fQ3JlYXRlKHRoaXMpOworCisgICAgdGhpcy0+cHJpdl9kYXRhID0gcHJpdl9kYXRhOworICAgIHRoaXMtPmNhbGxiYWNrICA9IGNhbGxiYWNrOworICAgIHRoaXMtPnR5cGUgICAgICA9IHR5cGU7CisKKyAgICByZXR1cm4gMTsKK30KK3N0YXRpYyBpbnQKK2xpYkFWRmlsdGVyX0NsZWFudXAobGliQVZGaWx0ZXIgKnRoaXMpCit7CisgICAgbGliQVZQaW5fUmVsZWFzZSh0aGlzLT5waW4pOworICAgIHJldHVybiAxOworfQorREVDTEFSRV9DUkVBVEUobGliQVZGaWx0ZXIsIGxpYkFWRmlsdGVyX1NldHVwKHRoaXMsIHByaXZfZGF0YSwgY2FsbGJhY2ssIHR5cGUpLAorICAgICAgICAgICAgICAgdm9pZCAqcHJpdl9kYXRhLCB2b2lkICpjYWxsYmFjaywgZW51bSBkc2hvd0RldmljZVR5cGUgdHlwZSkKK0RFQ0xBUkVfREVTVFJPWShsaWJBVkZpbHRlciwgbGliQVZGaWx0ZXJfQ2xlYW51cCkKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9kc2hvd19waW4uYyBiL2ZmbXBlZy9saWJhdmRldmljZS9kc2hvd19waW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBkY2EyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2RzaG93X3Bpbi5jCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogRGlyZWN0U2hvdyBjYXB0dXJlIGludGVyZmFjZQorICogQ29weXJpZ2h0IChjKSAyMDEwIFJhbWlybyBQb2xsYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZHNob3dfY2FwdHVyZS5oIgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZGVmaW5lIGltZW1vZmZzZXQgb2Zmc2V0b2YobGliQVZQaW4sIGltZW12dGJsKQorCitERUNMQVJFX1FVRVJZSU5URVJGQUNFKGxpYkFWUGluLAorICAgIHsgeyZJSURfSVVua25vd24sMH0sIHsmSUlEX0lQaW4sMH0sIHsmSUlEX0lNZW1JbnB1dFBpbixpbWVtb2Zmc2V0fSB9KQorREVDTEFSRV9BRERSRUYobGliQVZQaW4pCitERUNMQVJFX1JFTEVBU0UobGliQVZQaW4pCisKK2xvbmcgV0lOQVBJCitsaWJBVlBpbl9Db25uZWN0KGxpYkFWUGluICp0aGlzLCBJUGluICpwaW4sIGNvbnN0IEFNX01FRElBX1RZUEUgKnR5cGUpCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZQaW5fQ29ubmVjdCglcCwgJXAsICVwKVxuIiwgdGhpcywgcGluLCB0eXBlKTsKKyAgICAvKiBJbnB1dCBwaW5zIHJlY2VpdmUgY29ubmVjdGlvbnMuICovCisgICAgcmV0dXJuIFNfRkFMU0U7Cit9Citsb25nIFdJTkFQSQorbGliQVZQaW5fUmVjZWl2ZUNvbm5lY3Rpb24obGliQVZQaW4gKnRoaXMsIElQaW4gKnBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFNX01FRElBX1RZUEUgKnR5cGUpCit7CisgICAgZW51bSBkc2hvd0RldmljZVR5cGUgZGV2dHlwZSA9IHRoaXMtPmZpbHRlci0+dHlwZTsKKyAgICBkc2hvd2RlYnVnKCJsaWJBVlBpbl9SZWNlaXZlQ29ubmVjdGlvbiglcClcbiIsIHRoaXMpOworCisgICAgaWYgKCFwaW4pCisgICAgICAgIHJldHVybiBFX1BPSU5URVI7CisgICAgaWYgKHRoaXMtPmNvbm5lY3RlZHRvKQorICAgICAgICByZXR1cm4gVkZXX0VfQUxSRUFEWV9DT05ORUNURUQ7CisKKyAgICBmZl9wcmludF9BTV9NRURJQV9UWVBFKHR5cGUpOworICAgIGlmIChkZXZ0eXBlID09IFZpZGVvRGV2aWNlKSB7CisgICAgICAgIGlmICghSXNFcXVhbEdVSUQoJnR5cGUtPm1ham9ydHlwZSwgJk1FRElBVFlQRV9WaWRlbykpCisgICAgICAgICAgICByZXR1cm4gVkZXX0VfVFlQRV9OT1RfQUNDRVBURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFJc0VxdWFsR1VJRCgmdHlwZS0+bWFqb3J0eXBlLCAmTUVESUFUWVBFX0F1ZGlvKSkKKyAgICAgICAgICAgIHJldHVybiBWRldfRV9UWVBFX05PVF9BQ0NFUFRFRDsKKyAgICB9CisKKyAgICBJUGluX0FkZFJlZihwaW4pOworICAgIHRoaXMtPmNvbm5lY3RlZHRvID0gcGluOworCisgICAgZmZfY29weV9kc2hvd19tZWRpYV90eXBlKCZ0aGlzLT50eXBlLCB0eXBlKTsKKworICAgIHJldHVybiBTX09LOworfQorbG9uZyBXSU5BUEkKK2xpYkFWUGluX0Rpc2Nvbm5lY3QobGliQVZQaW4gKnRoaXMpCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZQaW5fRGlzY29ubmVjdCglcClcbiIsIHRoaXMpOworCisgICAgaWYgKHRoaXMtPmZpbHRlci0+c3RhdGUgIT0gU3RhdGVfU3RvcHBlZCkKKyAgICAgICAgcmV0dXJuIFZGV19FX05PVF9TVE9QUEVEOworICAgIGlmICghdGhpcy0+Y29ubmVjdGVkdG8pCisgICAgICAgIHJldHVybiBTX0ZBTFNFOworICAgIElQaW5fUmVsZWFzZSh0aGlzLT5jb25uZWN0ZWR0byk7CisgICAgdGhpcy0+Y29ubmVjdGVkdG8gPSBOVUxMOworCisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZQaW5fQ29ubmVjdGVkVG8obGliQVZQaW4gKnRoaXMsIElQaW4gKipwaW4pCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZQaW5fQ29ubmVjdGVkVG8oJXApXG4iLCB0aGlzKTsKKworICAgIGlmICghcGluKQorICAgICAgICByZXR1cm4gRV9QT0lOVEVSOworICAgIGlmICghdGhpcy0+Y29ubmVjdGVkdG8pCisgICAgICAgIHJldHVybiBWRldfRV9OT1RfQ09OTkVDVEVEOworICAgIElQaW5fQWRkUmVmKHRoaXMtPmNvbm5lY3RlZHRvKTsKKyAgICAqcGluID0gdGhpcy0+Y29ubmVjdGVkdG87CisKKyAgICByZXR1cm4gU19PSzsKK30KK2xvbmcgV0lOQVBJCitsaWJBVlBpbl9Db25uZWN0aW9uTWVkaWFUeXBlKGxpYkFWUGluICp0aGlzLCBBTV9NRURJQV9UWVBFICp0eXBlKQoreworICAgIGRzaG93ZGVidWcoImxpYkFWUGluX0Nvbm5lY3Rpb25NZWRpYVR5cGUoJXApXG4iLCB0aGlzKTsKKworICAgIGlmICghdHlwZSkKKyAgICAgICAgcmV0dXJuIEVfUE9JTlRFUjsKKyAgICBpZiAoIXRoaXMtPmNvbm5lY3RlZHRvKQorICAgICAgICByZXR1cm4gVkZXX0VfTk9UX0NPTk5FQ1RFRDsKKworICAgIHJldHVybiBmZl9jb3B5X2RzaG93X21lZGlhX3R5cGUodHlwZSwgJnRoaXMtPnR5cGUpOworfQorbG9uZyBXSU5BUEkKK2xpYkFWUGluX1F1ZXJ5UGluSW5mbyhsaWJBVlBpbiAqdGhpcywgUElOX0lORk8gKmluZm8pCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZQaW5fUXVlcnlQaW5JbmZvKCVwKVxuIiwgdGhpcyk7CisKKyAgICBpZiAoIWluZm8pCisgICAgICAgIHJldHVybiBFX1BPSU5URVI7CisKKyAgICBpZiAodGhpcy0+ZmlsdGVyKQorICAgICAgICBsaWJBVkZpbHRlcl9BZGRSZWYodGhpcy0+ZmlsdGVyKTsKKworICAgIGluZm8tPnBGaWx0ZXIgPSAoSUJhc2VGaWx0ZXIgKikgdGhpcy0+ZmlsdGVyOworICAgIGluZm8tPmRpciAgICAgPSBQSU5ESVJfSU5QVVQ7CisgICAgd2NzY3B5KGluZm8tPmFjaE5hbWUsIEwiQ2FwdHVyZSIpOworCisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZQaW5fUXVlcnlEaXJlY3Rpb24obGliQVZQaW4gKnRoaXMsIFBJTl9ESVJFQ1RJT04gKmRpcikKK3sKKyAgICBkc2hvd2RlYnVnKCJsaWJBVlBpbl9RdWVyeURpcmVjdGlvbiglcClcbiIsIHRoaXMpOworICAgIGlmICghZGlyKQorICAgICAgICByZXR1cm4gRV9QT0lOVEVSOworICAgICpkaXIgPSBQSU5ESVJfSU5QVVQ7CisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZQaW5fUXVlcnlJZChsaWJBVlBpbiAqdGhpcywgd2NoYXJfdCAqKmlkKQoreworICAgIGRzaG93ZGVidWcoImxpYkFWUGluX1F1ZXJ5SWQoJXApXG4iLCB0aGlzKTsKKworICAgIGlmICghaWQpCisgICAgICAgIHJldHVybiBFX1BPSU5URVI7CisKKyAgICAqaWQgPSB3Y3NkdXAoTCJsaWJBViBQaW4iKTsKKworICAgIHJldHVybiBTX09LOworfQorbG9uZyBXSU5BUEkKK2xpYkFWUGluX1F1ZXJ5QWNjZXB0KGxpYkFWUGluICp0aGlzLCBjb25zdCBBTV9NRURJQV9UWVBFICp0eXBlKQoreworICAgIGRzaG93ZGVidWcoImxpYkFWUGluX1F1ZXJ5QWNjZXB0KCVwKVxuIiwgdGhpcyk7CisgICAgcmV0dXJuIFNfRkFMU0U7Cit9Citsb25nIFdJTkFQSQorbGliQVZQaW5fRW51bU1lZGlhVHlwZXMobGliQVZQaW4gKnRoaXMsIElFbnVtTWVkaWFUeXBlcyAqKmVudW10eXBlcykKK3sKKyAgICBjb25zdCBBTV9NRURJQV9UWVBFICp0eXBlID0gTlVMTDsKKyAgICBsaWJBVkVudW1NZWRpYVR5cGVzICpuZXc7CisgICAgZHNob3dkZWJ1ZygibGliQVZQaW5fRW51bU1lZGlhVHlwZXMoJXApXG4iLCB0aGlzKTsKKworICAgIGlmICghZW51bXR5cGVzKQorICAgICAgICByZXR1cm4gRV9QT0lOVEVSOworICAgIG5ldyA9IGxpYkFWRW51bU1lZGlhVHlwZXNfQ3JlYXRlKHR5cGUpOworICAgIGlmICghbmV3KQorICAgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKworICAgICplbnVtdHlwZXMgPSAoSUVudW1NZWRpYVR5cGVzICopIG5ldzsKKyAgICByZXR1cm4gU19PSzsKK30KK2xvbmcgV0lOQVBJCitsaWJBVlBpbl9RdWVyeUludGVybmFsQ29ubmVjdGlvbnMobGliQVZQaW4gKnRoaXMsIElQaW4gKipwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqbnBpbikKK3sKKyAgICBkc2hvd2RlYnVnKCJsaWJBVlBpbl9RdWVyeUludGVybmFsQ29ubmVjdGlvbnMoJXApXG4iLCB0aGlzKTsKKyAgICByZXR1cm4gRV9OT1RJTVBMOworfQorbG9uZyBXSU5BUEkKK2xpYkFWUGluX0VuZE9mU3RyZWFtKGxpYkFWUGluICp0aGlzKQoreworICAgIGRzaG93ZGVidWcoImxpYkFWUGluX0VuZE9mU3RyZWFtKCVwKVxuIiwgdGhpcyk7CisgICAgLyogSSBkb24ndCBjYXJlLiAqLworICAgIHJldHVybiBTX09LOworfQorbG9uZyBXSU5BUEkKK2xpYkFWUGluX0JlZ2luRmx1c2gobGliQVZQaW4gKnRoaXMpCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZQaW5fQmVnaW5GbHVzaCglcClcbiIsIHRoaXMpOworICAgIC8qIEkgZG9uJ3QgY2FyZS4gKi8KKyAgICByZXR1cm4gU19PSzsKK30KK2xvbmcgV0lOQVBJCitsaWJBVlBpbl9FbmRGbHVzaChsaWJBVlBpbiAqdGhpcykKK3sKKyAgICBkc2hvd2RlYnVnKCJsaWJBVlBpbl9FbmRGbHVzaCglcClcbiIsIHRoaXMpOworICAgIC8qIEkgZG9uJ3QgY2FyZS4gKi8KKyAgICByZXR1cm4gU19PSzsKK30KK2xvbmcgV0lOQVBJCitsaWJBVlBpbl9OZXdTZWdtZW50KGxpYkFWUGluICp0aGlzLCBSRUZFUkVOQ0VfVElNRSBzdGFydCwgUkVGRVJFTkNFX1RJTUUgc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJhdGUpCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZQaW5fTmV3U2VnbWVudCglcClcbiIsIHRoaXMpOworICAgIC8qIEkgZG9uJ3QgY2FyZS4gKi8KKyAgICByZXR1cm4gU19PSzsKK30KKworc3RhdGljIGludAorbGliQVZQaW5fU2V0dXAobGliQVZQaW4gKnRoaXMsIGxpYkFWRmlsdGVyICpmaWx0ZXIpCit7CisgICAgSVBpblZ0YmwgKnZ0YmwgPSB0aGlzLT52dGJsOworICAgIElNZW1JbnB1dFBpblZ0YmwgKmltZW12dGJsOworCisgICAgaWYgKCFmaWx0ZXIpCisgICAgICAgIHJldHVybiAwOworCisgICAgaW1lbXZ0YmwgPSBhdl9tYWxsb2Moc2l6ZW9mKElNZW1JbnB1dFBpblZ0YmwpKTsKKyAgICBpZiAoIWltZW12dGJsKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFNFVFZUQkwoaW1lbXZ0YmwsIGxpYkFWTWVtSW5wdXRQaW4sIFF1ZXJ5SW50ZXJmYWNlKTsKKyAgICBTRVRWVEJMKGltZW12dGJsLCBsaWJBVk1lbUlucHV0UGluLCBBZGRSZWYpOworICAgIFNFVFZUQkwoaW1lbXZ0YmwsIGxpYkFWTWVtSW5wdXRQaW4sIFJlbGVhc2UpOworICAgIFNFVFZUQkwoaW1lbXZ0YmwsIGxpYkFWTWVtSW5wdXRQaW4sIEdldEFsbG9jYXRvcik7CisgICAgU0VUVlRCTChpbWVtdnRibCwgbGliQVZNZW1JbnB1dFBpbiwgTm90aWZ5QWxsb2NhdG9yKTsKKyAgICBTRVRWVEJMKGltZW12dGJsLCBsaWJBVk1lbUlucHV0UGluLCBHZXRBbGxvY2F0b3JSZXF1aXJlbWVudHMpOworICAgIFNFVFZUQkwoaW1lbXZ0YmwsIGxpYkFWTWVtSW5wdXRQaW4sIFJlY2VpdmUpOworICAgIFNFVFZUQkwoaW1lbXZ0YmwsIGxpYkFWTWVtSW5wdXRQaW4sIFJlY2VpdmVNdWx0aXBsZSk7CisgICAgU0VUVlRCTChpbWVtdnRibCwgbGliQVZNZW1JbnB1dFBpbiwgUmVjZWl2ZUNhbkJsb2NrKTsKKworICAgIHRoaXMtPmltZW12dGJsID0gaW1lbXZ0Ymw7CisKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWUGluLCBRdWVyeUludGVyZmFjZSk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVlBpbiwgQWRkUmVmKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWUGluLCBSZWxlYXNlKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWUGluLCBDb25uZWN0KTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWUGluLCBSZWNlaXZlQ29ubmVjdGlvbik7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVlBpbiwgRGlzY29ubmVjdCk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVlBpbiwgQ29ubmVjdGVkVG8pOworICAgIFNFVFZUQkwodnRibCwgbGliQVZQaW4sIENvbm5lY3Rpb25NZWRpYVR5cGUpOworICAgIFNFVFZUQkwodnRibCwgbGliQVZQaW4sIFF1ZXJ5UGluSW5mbyk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVlBpbiwgUXVlcnlEaXJlY3Rpb24pOworICAgIFNFVFZUQkwodnRibCwgbGliQVZQaW4sIFF1ZXJ5SWQpOworICAgIFNFVFZUQkwodnRibCwgbGliQVZQaW4sIFF1ZXJ5QWNjZXB0KTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWUGluLCBFbnVtTWVkaWFUeXBlcyk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVlBpbiwgUXVlcnlJbnRlcm5hbENvbm5lY3Rpb25zKTsKKyAgICBTRVRWVEJMKHZ0YmwsIGxpYkFWUGluLCBFbmRPZlN0cmVhbSk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVlBpbiwgQmVnaW5GbHVzaCk7CisgICAgU0VUVlRCTCh2dGJsLCBsaWJBVlBpbiwgRW5kRmx1c2gpOworICAgIFNFVFZUQkwodnRibCwgbGliQVZQaW4sIE5ld1NlZ21lbnQpOworCisgICAgdGhpcy0+ZmlsdGVyID0gZmlsdGVyOworCisgICAgcmV0dXJuIDE7Cit9CitERUNMQVJFX0NSRUFURShsaWJBVlBpbiwgbGliQVZQaW5fU2V0dXAodGhpcywgZmlsdGVyKSwgbGliQVZGaWx0ZXIgKmZpbHRlcikKK0RFQ0xBUkVfREVTVFJPWShsaWJBVlBpbiwgbm90aGluZykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBsaWJBVk1lbUlucHV0UGluCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2xvbmcgV0lOQVBJCitsaWJBVk1lbUlucHV0UGluX1F1ZXJ5SW50ZXJmYWNlKGxpYkFWTWVtSW5wdXRQaW4gKnRoaXMsIGNvbnN0IEdVSUQgKnJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipwcHZPYmplY3QpCit7CisgICAgbGliQVZQaW4gKnBpbiA9IChsaWJBVlBpbiAqKSAoKHVpbnQ4X3QgKikgdGhpcyAtIGltZW1vZmZzZXQpOworICAgIGRzaG93ZGVidWcoImxpYkFWTWVtSW5wdXRQaW5fUXVlcnlJbnRlcmZhY2UoJXApXG4iLCB0aGlzKTsKKyAgICByZXR1cm4gbGliQVZQaW5fUXVlcnlJbnRlcmZhY2UocGluLCByaWlkLCBwcHZPYmplY3QpOworfQordW5zaWduZWQgbG9uZyBXSU5BUEkKK2xpYkFWTWVtSW5wdXRQaW5fQWRkUmVmKGxpYkFWTWVtSW5wdXRQaW4gKnRoaXMpCit7CisgICAgbGliQVZQaW4gKnBpbiA9IChsaWJBVlBpbiAqKSAoKHVpbnQ4X3QgKikgdGhpcyAtIGltZW1vZmZzZXQpOworICAgIGRzaG93ZGVidWcoImxpYkFWTWVtSW5wdXRQaW5fQWRkUmVmKCVwKVxuIiwgdGhpcyk7CisgICAgcmV0dXJuIGxpYkFWUGluX0FkZFJlZihwaW4pOworfQordW5zaWduZWQgbG9uZyBXSU5BUEkKK2xpYkFWTWVtSW5wdXRQaW5fUmVsZWFzZShsaWJBVk1lbUlucHV0UGluICp0aGlzKQoreworICAgIGxpYkFWUGluICpwaW4gPSAobGliQVZQaW4gKikgKCh1aW50OF90ICopIHRoaXMgLSBpbWVtb2Zmc2V0KTsKKyAgICBkc2hvd2RlYnVnKCJsaWJBVk1lbUlucHV0UGluX1JlbGVhc2UoJXApXG4iLCB0aGlzKTsKKyAgICByZXR1cm4gbGliQVZQaW5fUmVsZWFzZShwaW4pOworfQorbG9uZyBXSU5BUEkKK2xpYkFWTWVtSW5wdXRQaW5fR2V0QWxsb2NhdG9yKGxpYkFWTWVtSW5wdXRQaW4gKnRoaXMsIElNZW1BbGxvY2F0b3IgKiphbGxvYykKK3sKKyAgICBkc2hvd2RlYnVnKCJsaWJBVk1lbUlucHV0UGluX0dldEFsbG9jYXRvciglcClcbiIsIHRoaXMpOworICAgIHJldHVybiBWRldfRV9OT19BTExPQ0FUT1I7Cit9Citsb25nIFdJTkFQSQorbGliQVZNZW1JbnB1dFBpbl9Ob3RpZnlBbGxvY2F0b3IobGliQVZNZW1JbnB1dFBpbiAqdGhpcywgSU1lbUFsbG9jYXRvciAqYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIHJkd3IpCit7CisgICAgZHNob3dkZWJ1ZygibGliQVZNZW1JbnB1dFBpbl9Ob3RpZnlBbGxvY2F0b3IoJXApXG4iLCB0aGlzKTsKKyAgICByZXR1cm4gU19PSzsKK30KK2xvbmcgV0lOQVBJCitsaWJBVk1lbUlucHV0UGluX0dldEFsbG9jYXRvclJlcXVpcmVtZW50cyhsaWJBVk1lbUlucHV0UGluICp0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxMT0NBVE9SX1BST1BFUlRJRVMgKnByb3BzKQoreworICAgIGRzaG93ZGVidWcoImxpYkFWTWVtSW5wdXRQaW5fR2V0QWxsb2NhdG9yUmVxdWlyZW1lbnRzKCVwKVxuIiwgdGhpcyk7CisgICAgcmV0dXJuIEVfTk9USU1QTDsKK30KK2xvbmcgV0lOQVBJCitsaWJBVk1lbUlucHV0UGluX1JlY2VpdmUobGliQVZNZW1JbnB1dFBpbiAqdGhpcywgSU1lZGlhU2FtcGxlICpzYW1wbGUpCit7CisgICAgbGliQVZQaW4gKnBpbiA9IChsaWJBVlBpbiAqKSAoKHVpbnQ4X3QgKikgdGhpcyAtIGltZW1vZmZzZXQpOworICAgIGVudW0gZHNob3dEZXZpY2VUeXBlIGRldnR5cGUgPSBwaW4tPmZpbHRlci0+dHlwZTsKKyAgICB2b2lkICpwcml2X2RhdGE7CisgICAgdWludDhfdCAqYnVmOworICAgIGludCBidWZfc2l6ZTsKKyAgICBpbnQgaW5kZXg7CisgICAgaW50NjRfdCBjdXJ0aW1lOworCisgICAgZHNob3dkZWJ1ZygibGliQVZNZW1JbnB1dFBpbl9SZWNlaXZlKCVwKVxuIiwgdGhpcyk7CisKKyAgICBpZiAoIXNhbXBsZSkKKyAgICAgICAgcmV0dXJuIEVfUE9JTlRFUjsKKworICAgIGlmIChkZXZ0eXBlID09IFZpZGVvRGV2aWNlKSB7CisgICAgICAgIC8qIFBUUyBmcm9tIHZpZGVvIGRldmljZXMgaXMgdW5yZWxpYWJsZS4gKi8KKyAgICAgICAgSVJlZmVyZW5jZUNsb2NrICpjbG9jayA9IHBpbi0+ZmlsdGVyLT5jbG9jazsKKyAgICAgICAgSVJlZmVyZW5jZUNsb2NrX0dldFRpbWUoY2xvY2ssICZjdXJ0aW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IGR1bW15OworICAgICAgICBJTWVkaWFTYW1wbGVfR2V0VGltZShzYW1wbGUsICZjdXJ0aW1lLCAmZHVtbXkpOworICAgICAgICBjdXJ0aW1lICs9IHBpbi0+ZmlsdGVyLT5zdGFydF90aW1lOworICAgIH0KKworICAgIGJ1Zl9zaXplID0gSU1lZGlhU2FtcGxlX0dldEFjdHVhbERhdGFMZW5ndGgoc2FtcGxlKTsKKyAgICBJTWVkaWFTYW1wbGVfR2V0UG9pbnRlcihzYW1wbGUsICZidWYpOworICAgIHByaXZfZGF0YSA9IHBpbi0+ZmlsdGVyLT5wcml2X2RhdGE7CisgICAgaW5kZXggPSBwaW4tPmZpbHRlci0+c3RyZWFtX2luZGV4OworCisgICAgcGluLT5maWx0ZXItPmNhbGxiYWNrKHByaXZfZGF0YSwgaW5kZXgsIGJ1ZiwgYnVmX3NpemUsIGN1cnRpbWUsIGRldnR5cGUpOworCisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZNZW1JbnB1dFBpbl9SZWNlaXZlTXVsdGlwbGUobGliQVZNZW1JbnB1dFBpbiAqdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNZWRpYVNhbXBsZSAqKnNhbXBsZXMsIGxvbmcgbiwgbG9uZyAqbnByb2MpCit7CisgICAgaW50IGk7CisgICAgZHNob3dkZWJ1ZygibGliQVZNZW1JbnB1dFBpbl9SZWNlaXZlTXVsdGlwbGUoJXApXG4iLCB0aGlzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGxpYkFWTWVtSW5wdXRQaW5fUmVjZWl2ZSh0aGlzLCBzYW1wbGVzW2ldKTsKKworICAgICpucHJvYyA9IG47CisgICAgcmV0dXJuIFNfT0s7Cit9Citsb25nIFdJTkFQSQorbGliQVZNZW1JbnB1dFBpbl9SZWNlaXZlQ2FuQmxvY2sobGliQVZNZW1JbnB1dFBpbiAqdGhpcykKK3sKKyAgICBkc2hvd2RlYnVnKCJsaWJBVk1lbUlucHV0UGluX1JlY2VpdmVDYW5CbG9jayglcClcbiIsIHRoaXMpOworICAgIC8qIEkgc3dlYXIgSSB3aWxsIG5vdCBibG9jay4gKi8KKyAgICByZXR1cm4gU19GQUxTRTsKK30KKwordm9pZAorbGliQVZNZW1JbnB1dFBpbl9EZXN0cm95KGxpYkFWTWVtSW5wdXRQaW4gKnRoaXMpCit7CisgICAgbGliQVZQaW4gKnBpbiA9IChsaWJBVlBpbiAqKSAoKHVpbnQ4X3QgKikgdGhpcyAtIGltZW1vZmZzZXQpOworICAgIGRzaG93ZGVidWcoImxpYkFWTWVtSW5wdXRQaW5fRGVzdHJveSglcClcbiIsIHRoaXMpOworICAgIGxpYkFWUGluX0Rlc3Ryb3kocGluKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9kdjEzOTQuYyBiL2ZmbXBlZy9saWJhdmRldmljZS9kdjEzOTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODI0MWUzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2R2MTM5NC5jCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogTGludXggRFYxMzk0IGludGVyZmFjZQorICogQ29weXJpZ2h0IChjKSAyMDAzIE1heCBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvZHYuaCIKKyNpbmNsdWRlICJkdjEzOTQuaCIKKworc3RydWN0IGR2MTM5NF9kYXRhIHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgZmQ7CisgICAgaW50IGNoYW5uZWw7CisgICAgaW50IGZvcm1hdDsKKworICAgIHVpbnQ4X3QgKnJpbmc7IC8qIFJpbmcgYnVmZmVyICovCisgICAgaW50IGluZGV4OyAgLyogQ3VycmVudCBmcmFtZSBpbmRleCAqLworICAgIGludCBhdmFpbDsgIC8qIE51bWJlciBvZiBmcmFtZXMgYXZhaWxhYmxlIGZvciByZWFkaW5nICovCisgICAgaW50IGRvbmU7ICAgLyogTnVtYmVyIG9mIGNvbXBsZXRlZCBmcmFtZXMgKi8KKworICAgIERWRGVtdXhDb250ZXh0KiBkdl9kZW11eDsgLyogR2VuZXJpYyBEViBtdXhpbmcvZGVtdXhpbmcgY29udGV4dCAqLworfTsKKworLyoKKyAqIFRoZSB0cmljayBoZXJlIGlzIHRvIGtsdWRnZSBhcm91bmQgd2VsbCBrbm93biBwcm9ibGVtIHdpdGgga2VybmVsIE9vb3BzaW5nCisgKiB3aGVuIHlvdSB0cnkgdG8gY2FwdHVyZSBQQUwgb24gYSBkZXZpY2Ugbm9kZSBjb25maWd1cmUgZm9yIE5UU0MuIFRoYXQncworICogd2h5IHdlIGhhdmUgdG8gY29uZmlndXJlIHRoZSBkZXZpY2Ugbm9kZSBmb3IgUEFMLCBhbmQgdGhlbiByZWFkIG9ubHkgTlRTQworICogYW1vdW50IG9mIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgZHYxMzk0X3Jlc2V0KHN0cnVjdCBkdjEzOTRfZGF0YSAqZHYpCit7CisgICAgc3RydWN0IGR2MTM5NF9pbml0IGluaXQ7CisKKyAgICBpbml0LmNoYW5uZWwgICAgID0gZHYtPmNoYW5uZWw7CisgICAgaW5pdC5hcGlfdmVyc2lvbiA9IERWMTM5NF9BUElfVkVSU0lPTjsKKyAgICBpbml0Lm5fZnJhbWVzICAgID0gRFYxMzk0X1JJTkdfRlJBTUVTOworICAgIGluaXQuZm9ybWF0ICAgICAgPSBEVjEzOTRfUEFMOworCisgICAgaWYgKGlvY3RsKGR2LT5mZCwgRFYxMzk0X0lOSVQsICZpbml0KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGR2LT5hdmFpbCAgPSBkdi0+ZG9uZSA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHYxMzk0X3N0YXJ0KHN0cnVjdCBkdjEzOTRfZGF0YSAqZHYpCit7CisgICAgLyogVGVsbCBEVjEzOTQgZHJpdmVyIHRvIGVuYWJsZSByZWNlaXZlciAqLworICAgIGlmIChpb2N0bChkdi0+ZmQsIERWMTM5NF9TVEFSVF9SRUNFSVZFLCAwKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzdGFydCByZWNlaXZlcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHYxMzk0X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqIGNvbnRleHQpCit7CisgICAgc3RydWN0IGR2MTM5NF9kYXRhICpkdiA9IGNvbnRleHQtPnByaXZfZGF0YTsKKworICAgIGR2LT5kdl9kZW11eCA9IGF2cHJpdl9kdl9pbml0X2RlbXV4KGNvbnRleHQpOworICAgIGlmICghZHYtPmR2X2RlbXV4KQorICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgIC8qIE9wZW4gYW5kIGluaXRpYWxpemUgRFYxMzk0IGRldmljZSAqLworICAgIGR2LT5mZCA9IGF2cHJpdl9vcGVuKGNvbnRleHQtPmZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgaWYgKGR2LT5mZCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIERWIGludGVyZmFjZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAgIGlmIChkdjEzOTRfcmVzZXQoZHYpIDwgMCkgeworICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgRFYgaW50ZXJmYWNlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgZHYtPnJpbmcgPSBtbWFwKE5VTEwsIERWMTM5NF9QQUxfRlJBTUVfU0laRSAqIERWMTM5NF9SSU5HX0ZSQU1FUywKKyAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZHYtPmZkLCAwKTsKKyAgICBpZiAoZHYtPnJpbmcgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG1tYXAgRFYgcmluZyBidWZmZXI6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBpZiAoZHYxMzk0X3N0YXJ0KGR2KSA8IDApCisgICAgICAgIGdvdG8gZmFpbGVkOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWxlZDoKKyAgICBjbG9zZShkdi0+ZmQpOworICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Cit9CisKK3N0YXRpYyBpbnQgZHYxMzk0X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY29udGV4dCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBzdHJ1Y3QgZHYxMzk0X2RhdGEgKmR2ID0gY29udGV4dC0+cHJpdl9kYXRhOworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IGF2cHJpdl9kdl9nZXRfcGFja2V0KGR2LT5kdl9kZW11eCwgcGt0KTsKKyAgICBpZiAoc2l6ZSA+IDApCisgICAgICAgIHJldHVybiBzaXplOworCisgICAgaWYgKCFkdi0+YXZhaWwpIHsKKyAgICAgICAgc3RydWN0IGR2MTM5NF9zdGF0dXMgczsKKyAgICAgICAgc3RydWN0IHBvbGxmZCBwOworCisgICAgICAgIGlmIChkdi0+ZG9uZSkgeworICAgICAgICAgICAgLyogUmVxdWVzdCBtb3JlIGZyYW1lcyAqLworICAgICAgICAgICAgaWYgKGlvY3RsKGR2LT5mZCwgRFYxMzk0X1JFQ0VJVkVfRlJBTUVTLCBkdi0+ZG9uZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgLyogVGhpcyB1c3VhbGx5IG1lYW5zIHRoYXQgcmluZyBidWZmZXIgb3ZlcmZsb3dlZC4KKyAgICAgICAgICAgICAgICAgKiBXZSBoYXZlIHRvIHJlc2V0IDooLgorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIkRWMTM5NDogUmluZyBidWZmZXIgb3ZlcmZsb3cuIFJlc2V0aW5nIC4uXG4iKTsKKworICAgICAgICAgICAgICAgIGR2MTM5NF9yZXNldChkdik7CisgICAgICAgICAgICAgICAgZHYxMzk0X3N0YXJ0KGR2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR2LT5kb25lID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFdhaXQgdW50aWwgbW9yZSBmcmFtZXMgYXJlIGF2YWlsYWJsZSAqLworcmVzdGFydF9wb2xsOgorICAgICAgICBwLmZkID0gZHYtPmZkOworICAgICAgICBwLmV2ZW50cyA9IFBPTExJTiB8IFBPTExFUlIgfCBQT0xMSFVQOworICAgICAgICBpZiAocG9sbCgmcCwgMSwgLTEpIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgICAgICBnb3RvIHJlc3RhcnRfcG9sbDsKKyAgICAgICAgICAgIGF2X2xvZyhjb250ZXh0LCBBVl9MT0dfRVJST1IsICJQb2xsIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlvY3RsKGR2LT5mZCwgRFYxMzk0X0dFVF9TVEFUVVMsICZzKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjb250ZXh0LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IHN0YXR1czogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9CisgICAgICAgIGF2X2Rsb2coY29udGV4dCwgIkRWMTM5NDogc3RhdHVzXG4iCisgICAgICAgICAgICAgICAgIlx0YWN0aXZlX2ZyYW1lXHQlZFxuIgorICAgICAgICAgICAgICAgICJcdGZpcnN0X2NsZWFyX2ZyYW1lXHQlZFxuIgorICAgICAgICAgICAgICAgICJcdG5fY2xlYXJfZnJhbWVzXHQlZFxuIgorICAgICAgICAgICAgICAgICJcdGRyb3BwZWRfZnJhbWVzXHQlZFxuIiwKKyAgICAgICAgICAgICAgICBzLmFjdGl2ZV9mcmFtZSwgcy5maXJzdF9jbGVhcl9mcmFtZSwKKyAgICAgICAgICAgICAgICBzLm5fY2xlYXJfZnJhbWVzLCBzLmRyb3BwZWRfZnJhbWVzKTsKKworICAgICAgICBkdi0+YXZhaWwgPSBzLm5fY2xlYXJfZnJhbWVzOworICAgICAgICBkdi0+aW5kZXggPSBzLmZpcnN0X2NsZWFyX2ZyYW1lOworICAgICAgICBkdi0+ZG9uZSAgPSAwOworCisgICAgICAgIGlmIChzLmRyb3BwZWRfZnJhbWVzKSB7CisgICAgICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiRFYxMzk0OiBGcmFtZSBkcm9wIGRldGVjdGVkICglZCkuIFJlc2V0aW5nIC4uXG4iLAorICAgICAgICAgICAgICAgICAgICBzLmRyb3BwZWRfZnJhbWVzKTsKKworICAgICAgICAgICAgZHYxMzk0X3Jlc2V0KGR2KTsKKyAgICAgICAgICAgIGR2MTM5NF9zdGFydChkdik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9kbG9nKGNvbnRleHQsICJpbmRleCAlZCwgYXZhaWwgJWQsIGRvbmUgJWRcbiIsIGR2LT5pbmRleCwgZHYtPmF2YWlsLAorICAgICAgICAgICAgZHYtPmRvbmUpOworCisgICAgc2l6ZSA9IGF2cHJpdl9kdl9wcm9kdWNlX3BhY2tldChkdi0+ZHZfZGVtdXgsIHBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHYtPnJpbmcgKyAoZHYtPmluZGV4ICogRFYxMzk0X1BBTF9GUkFNRV9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFYxMzk0X1BBTF9GUkFNRV9TSVpFLCAtMSk7CisgICAgZHYtPmluZGV4ID0gKGR2LT5pbmRleCArIDEpICUgRFYxMzk0X1JJTkdfRlJBTUVTOworICAgIGR2LT5kb25lKys7IGR2LT5hdmFpbC0tOworCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgZHYxMzk0X2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqIGNvbnRleHQpCit7CisgICAgc3RydWN0IGR2MTM5NF9kYXRhICpkdiA9IGNvbnRleHQtPnByaXZfZGF0YTsKKworICAgIC8qIFNodXRkb3duIERWMTM5NCByZWNlaXZlciAqLworICAgIGlmIChpb2N0bChkdi0+ZmQsIERWMTM5NF9TSFVURE9XTiwgMCkgPCAwKQorICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNodXRkb3duIERWMTM5NDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKyAgICAvKiBVbm1hcCByaW5nIGJ1ZmZlciAqLworICAgIGlmIChtdW5tYXAoZHYtPnJpbmcsIERWMTM5NF9OVFNDX0ZSQU1FX1NJWkUgKiBEVjEzOTRfUklOR19GUkFNRVMpIDwgMCkKKyAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBtdW5tYXAgRFYxMzk0IHJpbmcgYnVmZmVyOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKworICAgIGNsb3NlKGR2LT5mZCk7CisgICAgYXZfZnJlZShkdi0+ZHZfZGVtdXgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAic3RhbmRhcmQiLCAiIiwgb2Zmc2V0b2Yoc3RydWN0IGR2MTM5NF9kYXRhLCBmb3JtYXQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gRFYxMzk0X05UU0N9LCBEVjEzOTRfTlRTQywgRFYxMzk0X1BBTCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJzdGFuZGFyZCIgfSwKKyAgICB7ICJQQUwiLCAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBEVjEzOTRfUEFMfSwgICAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgInN0YW5kYXJkIiB9LAorICAgIHsgIk5UU0MiLCAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IERWMTM5NF9OVFNDfSwgIDAsIDAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAic3RhbmRhcmQiIH0sCisgICAgeyAiY2hhbm5lbCIsICAiIiwgb2Zmc2V0b2Yoc3RydWN0IGR2MTM5NF9kYXRhLCBjaGFubmVsKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERWMTM5NF9ERUZBVUxUX0NIQU5ORUx9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZHYxMzk0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIkRWMTM5NCBpbmRldiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfVklERU9fSU5QVVQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2R2MTM5NF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJkdjEzOTQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEVjEzOTQgQS9WIGdyYWIiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGR2MTM5NF9kYXRhKSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBkdjEzOTRfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZHYxMzk0X3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGR2MTM5NF9jbG9zZSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmR2MTM5NF9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvZHYxMzk0LmggYi9mZm1wZWcvbGliYXZkZXZpY2UvZHYxMzk0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2ZDYzMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9kdjEzOTQuaApAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIERWIGlucHV0L291dHB1dCBvdmVyIElFRUUgMTM5NCBvbiBPSENJIGNoaXBzCisgKiAgIENvcHlyaWdodCAoQykyMDAxIERhbmllbCBNYWFzIDxkbWFhc0BkY2luZS5jb20+CisgKiAgICAgcmVjZWl2ZSwgcHJvY19mcyBieSBEYW4gRGVubmVkeSA8ZGFuQGRlbm5lZHkub3JnPgorICoKKyAqIGJhc2VkIG9uOgorICogICB2aWRlbzEzOTQuaCAtIGRyaXZlciBmb3IgT0hDSSAxMzk0IGJvYXJkcworICogICBDb3B5cmlnaHQgKEMpMTk5OSwyMDAwIFNlYmFzdGllbiBSb3VnZWF1eCA8c2ViYXN0aWVuLnJvdWdlYXV4QGFudS5lZHUuYXU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUGV0ZXIgU2NobGFpbGUgPHVkYnpAcnoudW5pLWthcmxzcnVoZS5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkRFVklDRV9EVjEzOTRfSAorI2RlZmluZSBBVkRFVklDRV9EVjEzOTRfSAorCisjZGVmaW5lIERWMTM5NF9ERUZBVUxUX0NIQU5ORUwgNjMKKyNkZWZpbmUgRFYxMzk0X0RFRkFVTFRfQ0FSRCAgICAwCisjZGVmaW5lIERWMTM5NF9SSU5HX0ZSQU1FUyAgICAgMjAKKworI2RlZmluZSBEVjEzOTRfV0lEVEggIDcyMAorI2RlZmluZSBEVjEzOTRfTlRTQ19IRUlHSFQgNDgwCisjZGVmaW5lIERWMTM5NF9QQUxfSEVJR0hUIDU3NgorCisvKiBUaGlzIGlzIHRoZSBwdWJsaWMgdXNlci1zcGFjZSBpbnRlcmZhY2UuIFRyeSBub3QgdG8gYnJlYWsgaXQuICovCisKKyNkZWZpbmUgRFYxMzk0X0FQSV9WRVJTSU9OIDB4MjAwMTExMjcKKworLyogKioqKioqKioqKioqKioqKioqKioKKyAgICoqICAgICAgICAgICAgICAgICoqCisgICAqKiAgIERWMTM5NCBBUEkgICAqKgorICAgKiogICAgICAgICAgICAgICAgKioKKyAgICoqKioqKioqKioqKioqKioqKioqCisKKyAgIFRoZXJlIGFyZSB0d28gbWV0aG9kcyBvZiBvcGVyYXRpbmcgdGhlIERWMTM5NCBEViBvdXRwdXQgZGV2aWNlLgorCisgICAxKQorCisgICBUaGUgc2ltcGxlc3QgaXMgYW4gaW50ZXJmYWNlIGJhc2VkIG9uIHdyaXRlKCk6IHNpbXBseSB3cml0ZQorICAgZnVsbCBEViBmcmFtZXMgb2YgZGF0YSB0byB0aGUgZGV2aWNlLCBhbmQgdGhleSB3aWxsIGJlIHRyYW5zbWl0dGVkCisgICBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLiBUaGUgRkQgbWF5IGJlIHNldCBmb3Igbm9uLWJsb2NraW5nIEkvTywKKyAgIGluIHdoaWNoIGNhc2UgeW91IGNhbiB1c2Ugc2VsZWN0KCkgb3IgcG9sbCgpIHRvIHdhaXQgZm9yIG91dHB1dAorICAgYnVmZmVyIHNwYWNlLgorCisgICBUbyBzZXQgdGhlIERWIG91dHB1dCBwYXJhbWV0ZXJzIChlLmcuIHdoZXRoZXIgeW91IHdhbnQgTlRTQyBvciBQQUwKKyAgIHZpZGVvKSwgdXNlIHRoZSBEVjEzOTRfSU5JVCBpb2N0bCwgcGFzc2luZyBpbiB0aGUgcGFyYW1ldGVycyB5b3UKKyAgIHdhbnQgaW4gYSBzdHJ1Y3QgZHYxMzk0X2luaXQuCisKKyAgIEV4YW1wbGUgMToKKyAgICAgICAgIFRvIHBsYXkgYSByYXcgLkRWIGZpbGU6ICAgY2F0IGZvby5EViA+IC9kZXYvZHYxMzk0CisgICAgICAgICAoY2F0IHdpbGwgdXNlIHdyaXRlKCkgaW50ZXJuYWxseSkKKworICAgRXhhbXBsZSAyOgorICAgICAgICAgICBzdGF0aWMgc3RydWN0IGR2MTM5NF9pbml0IGluaXQgPSB7CisgICAgICAgICAgICAgIDB4NjMsICAgICAgICAoYnJvYWRjYXN0IGNoYW5uZWwpCisgICAgICAgICAgICAgIDQsICAgICAgICAgICAoZm91ci1mcmFtZSByaW5nYnVmZmVyKQorICAgICAgICAgICAgICBEVjEzOTRfTlRTQywgKHNlbmQgTlRTQyB2aWRlbykKKyAgICAgICAgICAgICAgMCwgMCAgICAgICAgIChkZWZhdWx0IGVtcHR5IHBhY2tldCByYXRlKQorICAgICAgICAgICB9CisKKyAgICAgICAgICAgaW9jdGwoZmQsIERWMTM5NF9JTklULCAmaW5pdCk7CisKKyAgICAgICAgICAgd2hpbGUoMSkgeworICAgICAgICAgICAgICAgICAgcmVhZCggPGEgcmF3IERWIGZpbGU+LCBidWYsIERWMTM5NF9OVFNDX0ZSQU1FX1NJWkUgKTsKKyAgICAgICAgICAgICAgICAgIHdyaXRlKCA8dGhlIGR2MTM5NCBGRD4sIGJ1ZiwgRFYxMzk0X05UU0NfRlJBTUVfU0laRSApOworICAgICAgICAgICB9CisKKyAgIDIpCisKKyAgIEZvciBtb3JlIGNvbnRyb2wgb3ZlciBidWZmZXJpbmcsIGFuZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb3BpZXMKKyAgIG9mIHRoZSBEViBkYXRhLCB5b3UgY2FuIHVzZSB0aGUgbW9yZSBzb3BoaXN0aWNhdGVkIHRoZSBtbWFwKCkgaW50ZXJmYWNlLgorICAgRmlyc3QsIGNhbGwgdGhlIERWMTM5NF9JTklUIGlvY3RsIHRvIHNwZWNpZnkgeW91ciBwYXJhbWV0ZXJzLAorICAgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSByaW5nYnVmZmVyLiBUaGVuLCBjYWxsaW5nIG1tYXAoKQorICAgb24gdGhlIGR2MTM5NCBkZXZpY2Ugd2lsbCBnaXZlIHlvdSBkaXJlY3QgYWNjZXNzIHRvIHRoZSByaW5nYnVmZmVyCisgICBmcm9tIHdoaWNoIHRoZSBEViBjYXJkIHJlYWRzIHlvdXIgZnJhbWUgZGF0YS4KKworICAgVGhlIHJpbmdidWZmZXIgaXMgc2ltcGx5IG9uZSBsYXJnZSwgY29udGlndW91cyByZWdpb24gb2YgbWVtb3J5CisgICBjb250YWluaW5nIHR3byBvciBtb3JlIGZyYW1lcyBvZiBwYWNrZWQgRFYgZGF0YS4gRWFjaCBmcmFtZSBvZiBEViBkYXRhCisgICBpcyAxMjAwMDAgYnl0ZXMgKE5UU0MpIG9yIDE0NDAwMCBieXRlcyAoUEFMKS4KKworICAgRmlsbCBvbmUgb3IgbW9yZSBmcmFtZXMgaW4gdGhlIHJpbmdidWZmZXIsIHRoZW4gdXNlIHRoZSBEVjEzOTRfU1VCTUlUX0ZSQU1FUworICAgaW9jdGwgdG8gYmVnaW4gSS9PLiBZb3UgY2FuIHVzZSBlaXRoZXIgdGhlIERWMTM5NF9XQUlUX0ZSQU1FUyBpb2N0bAorICAgb3Igc2VsZWN0KCkvcG9sbCgpIHRvIHdhaXQgdW50aWwgdGhlIGZyYW1lcyBhcmUgdHJhbnNtaXR0ZWQuIE5leHQsIHlvdSdsbAorICAgbmVlZCB0byBjYWxsIHRoZSBEVjEzOTRfR0VUX1NUQVRVUyBpb2N0bCB0byBkZXRlcm1pbmUgd2hpY2ggcmluZ2J1ZmZlcgorICAgZnJhbWVzIGFyZSBjbGVhciAocmVhZHkgdG8gYmUgZmlsbGVkIHdpdGggbmV3IERWIGRhdGEpLiBGaW5hbGx5LCB1c2UKKyAgIERWMTM5NF9TVUJNSVRfRlJBTUVTIGFnYWluIHRvIHNlbmQgdGhlIG5ldyBkYXRhIHRvIHRoZSBEViBvdXRwdXQuCisKKworICAgRXhhbXBsZTogaGVyZSBpcyB3aGF0IGEgZm91ci1mcmFtZSByaW5nYnVmZmVyIG1pZ2h0IGxvb2sgbGlrZQorICAgICAgICAgICAgZHVyaW5nIERWIHRyYW5zbWlzc2lvbjoKKworCisgICAgICAgICBmcmFtZSAwICAgZnJhbWUgMSAgIGZyYW1lIDIgICBmcmFtZSAzCisKKyAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAgICB8IENMRUFSICAgfCBEViBkYXRhIHwgRFYgZGF0YSB8IENMRUFSICB8CisgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgICAgICAgICAgICAgICA8QUNUSVZFPgorCisgICAgICAgIHRyYW5zbWlzc2lvbiBnb2VzIGluIHRoaXMgZGlyZWN0aW9uIC0tLT4+PgorCisKKyAgIFRoZSBEViBoYXJkd2FyZSBpcyBjdXJyZW50bHkgdHJhbnNtaXR0aW5nIHRoZSBkYXRhIGluIGZyYW1lIDEuCisgICBPbmNlIGZyYW1lIDEgaXMgZmluaXNoZWQsIGl0IHdpbGwgYXV0b21hdGljYWxseSB0cmFuc21pdCBmcmFtZSAyLgorICAgKGlmIGZyYW1lIDIgZmluaXNoZXMgYmVmb3JlIGZyYW1lIDMgaXMgc3VibWl0dGVkLCB0aGUgZGV2aWNlCisgICB3aWxsIGNvbnRpbnVlIHRvIHRyYW5zbWl0IGZyYW1lIDIsIGFuZCB3aWxsIGluY3JlYXNlIHRoZSBkcm9wcGVkX2ZyYW1lcworICAgY291bnRlciBlYWNoIHRpbWUgaXQgcmVwZWF0cyB0aGUgdHJhbnNtaXNzaW9uKS4KKworCisgICBJZiB5b3UgY2FsbGVkIERWMTM5NF9HRVRfU1RBVFVTIGF0IHRoaXMgaW5zdGFudCwgeW91IHdvdWxkCisgICByZWNlaXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisgICAgICAgICAgICAgICAgICBuX2ZyYW1lcyAgICAgICAgICA9IDQKKyAgICAgICAgICAgICAgICAgIGFjdGl2ZV9mcmFtZSAgICAgID0gMQorICAgICAgICAgICAgICAgICAgZmlyc3RfY2xlYXJfZnJhbWUgPSAzCisgICAgICAgICAgICAgICAgICBuX2NsZWFyX2ZyYW1lcyAgICA9IDIKKworICAgQXQgdGhpcyBwb2ludCwgeW91IHNob3VsZCB3cml0ZSBuZXcgRFYgZGF0YSBpbnRvIGZyYW1lIDMgYW5kIG9wdGlvbmFsbHkKKyAgIGZyYW1lIDAuIFRoZW4gY2FsbCBEVjEzOTRfU1VCTUlUX0ZSQU1FUyB0byBpbmZvcm0gdGhlIGRldmljZSB0aGF0CisgICBpdCBtYXkgdHJhbnNtaXQgdGhlIG5ldyBmcmFtZXMuCisKKyAgIEVSUk9SIEhBTkRMSU5HCisKKyAgIEFuIGVycm9yIChidWZmZXIgdW5kZXJmbG93L292ZXJmbG93IG9yIGEgYnJlYWsgaW4gdGhlIERWIHN0cmVhbSBkdWUKKyAgIHRvIGEgMTM5NCBidXMgcmVzZXQpIGNhbiBiZSBkZXRlY3RlZCBieSBjaGVja2luZyB0aGUgZHJvcHBlZF9mcmFtZXMKKyAgIGZpZWxkIG9mIHN0cnVjdCBkdjEzOTRfc3RhdHVzIChvYnRhaW5lZCB0aHJvdWdoIHRoZQorICAgRFYxMzk0X0dFVF9TVEFUVVMgaW9jdGwpLgorCisgICBUaGUgYmVzdCB3YXkgdG8gcmVjb3ZlciBmcm9tIHN1Y2ggYW4gZXJyb3IgaXMgdG8gcmUtaW5pdGlhbGl6ZQorICAgZHYxMzk0LCBlaXRoZXIgYnkgdXNpbmcgdGhlIERWMTM5NF9JTklUIGlvY3RsIGNhbGwsIG9yIGNsb3NpbmcgdGhlCisgICBmaWxlIGRlc2NyaXB0b3IgYW5kIG9wZW5pbmcgaXQgYWdhaW4uIChub3RlIHRoYXQgeW91IG11c3QgdW5tYXAgYWxsCisgICByaW5nYnVmZmVyIG1hcHBpbmdzIHdoZW4gY2xvc2luZyB0aGUgZmlsZSBkZXNjcmlwdG9yLCBvciBlbHNlCisgICBkdjEzOTQgd2lsbCBzdGlsbCBiZSBjb25zaWRlcmVkICdpbiB1c2UnKS4KKworICAgTUFJTiBMT09QCisKKyAgIEZvciBtYXhpbXVtIGVmZmljaWVuY3kgYW5kIHJvYnVzdG5lc3MgYWdhaW5zdCBidXMgZXJyb3JzLCB5b3UgYXJlCisgICBhZHZpc2VkIHRvIG1vZGVsIHRoZSBtYWluIGxvb3Agb2YgeW91ciBhcHBsaWNhdGlvbiBhZnRlciB0aGUKKyAgIGZvbGxvd2luZyBwc2V1ZG8tY29kZSBleGFtcGxlOgorCisgICAoY2hlY2tzIG9mIHN5c3RlbSBjYWxsIHJldHVybiB2YWx1ZXMgb21pdHRlZCBmb3IgYnJldml0eTsgYWx3YXlzCisgICBjaGVjayByZXR1cm4gdmFsdWVzIGluIHlvdXIgY29kZSEpCisKKyAgIHdoaWxlKCBmcmFtZXMgbGVmdCApIHsKKworICAgIHN0cnVjdCBwb2xsZmQgKnBmZCA9IC4uLjsKKworICAgIHBmZC0+ZmQgPSBkdjEzOTRfZmQ7CisgICAgcGZkLT5yZXZlbnRzID0gMDsKKyAgICBwZmQtPmV2ZW50cyA9IFBPTExPVVQgfCBQT0xMSU47IChPVVQgZm9yIHRyYW5zbWl0LCBJTiBmb3IgcmVjZWl2ZSkKKworICAgIChhZGQgb3RoZXIgc291cmNlcyBvZiBJL08gaGVyZSkKKworICAgIHBvbGwocGZkLCAxLCAtMSk7IChvciBzZWxlY3QoKTsgYWRkIGEgdGltZW91dCBpZiB5b3Ugd2FudCkKKworICAgIGlmKHBmZC0+cmV2ZW50cykgeworICAgICAgICAgc3RydWN0IGR2MTM5NF9zdGF0dXMgc3RhdHVzOworCisgICAgICAgICBpb2N0bChkdjEzOTRfZmQsIERWMTM5NF9HRVRfU1RBVFVTLCAmc3RhdHVzKTsKKworICAgICAgICAgaWYoc3RhdHVzLmRyb3BwZWRfZnJhbWVzID4gMCkgeworICAgICAgICAgICAgICByZXNldF9kdjEzOTQoKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhdHVzLm5fY2xlYXJfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgIGNvcHlfRFZfZnJhbWUoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgIH0KKyAgIH0KKworICAgd2hlcmUgY29weV9EVl9mcmFtZSgpIHJlYWRzIG9yIHdyaXRlcyBvbiB0aGUgZHYxMzk0IGZpbGUgZGVzY3JpcHRvcgorICAgKHJlYWQvd3JpdGUgbW9kZSkgb3IgY29waWVzIGRhdGEgdG8vZnJvbSB0aGUgbW1hcCByaW5nYnVmZmVyIGFuZAorICAgdGhlbiBjYWxscyBpb2N0bChEVjEzOTRfU1VCTUlUX0ZSQU1FUykgdG8gbm90aWZ5IGR2MTM5NCB0aGF0IG5ldworICAgZnJhbWVzIGFyZSBhdmFpbGFibGUgKG1tYXAgbW9kZSkuCisKKyAgIHJlc2V0X2R2MTM5NCgpIGlzIGNhbGxlZCBpbiB0aGUgZXZlbnQgb2YgYSBidWZmZXIKKyAgIHVuZGVyZmxvdy9vdmVyZmxvdyBvciBhIGhhbHQgaW4gdGhlIERWIHN0cmVhbSAoZS5nLiBkdWUgdG8gYSAxMzk0CisgICBidXMgcmVzZXQpLiBUbyBndWFyYW50ZWUgcmVjb3ZlcnkgZnJvbSB0aGUgZXJyb3IsIHRoaXMgZnVuY3Rpb24KKyAgIHNob3VsZCBjbG9zZSB0aGUgZHYxMzk0IGZpbGUgZGVzY3JpcHRvciAoYW5kIG11bm1hcCgpIGFsbAorICAgcmluZ2J1ZmZlciBtYXBwaW5ncywgaWYgeW91IGFyZSB1c2luZyB0aGVtKSwgdGhlbiByZS1vcGVuIHRoZQorICAgZHYxMzk0IGRldmljZSAoYW5kIHJlLW1hcCB0aGUgcmluZ2J1ZmZlcikuCisKKyovCisKKworLyogbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSByaW5nYnVmZmVyICovCisjZGVmaW5lIERWMTM5NF9NQVhfRlJBTUVTIDMyCisKKy8qIG51bWJlciBvZiAqZnVsbCogaXNvY2hyb25vdXMgcGFja2V0cyBwZXIgRFYgZnJhbWUgKi8KKyNkZWZpbmUgRFYxMzk0X05UU0NfUEFDS0VUU19QRVJfRlJBTUUgMjUwCisjZGVmaW5lIERWMTM5NF9QQUxfUEFDS0VUU19QRVJfRlJBTUUgIDMwMAorCisvKiBzaXplIG9mIG9uZSBmcmFtZSdzIHdvcnRoIG9mIERWIGRhdGEsIGluIGJ5dGVzICovCisjZGVmaW5lIERWMTM5NF9OVFNDX0ZSQU1FX1NJWkUgKDQ4MCAqIERWMTM5NF9OVFNDX1BBQ0tFVFNfUEVSX0ZSQU1FKQorI2RlZmluZSBEVjEzOTRfUEFMX0ZSQU1FX1NJWkUgICg0ODAgKiBEVjEzOTRfUEFMX1BBQ0tFVFNfUEVSX0ZSQU1FKQorCisKKy8qIGlvY3RsKCkgY29tbWFuZHMgKi8KKworZW51bSB7CisgICAgICAgIC8qIEkgZG9uJ3QgbGlrZSB1c2luZyAwIGFzIGEgdmFsaWQgaW9jdGwoKSAqLworICAgICAgICBEVjEzOTRfSU5WQUxJRCA9IDAsCisKKworICAgICAgICAvKiBnZXQgdGhlIGRyaXZlciByZWFkeSB0byB0cmFuc21pdCB2aWRlby4KKyAgICAgICAgICAgcGFzcyBhIHN0cnVjdCBkdjEzOTRfaW5pdCogYXMgdGhlIHBhcmFtZXRlciAoc2VlIGJlbG93KSwKKyAgICAgICAgICAgb3IgTlVMTCB0byBnZXQgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisgICAgICAgIERWMTM5NF9JTklULAorCisKKyAgICAgICAgLyogc3RvcCB0cmFuc21pdHRpbmcgdmlkZW8gYW5kIGZyZWUgdGhlIHJpbmdidWZmZXIgKi8KKyAgICAgICAgRFYxMzk0X1NIVVRET1dOLAorCisKKyAgICAgICAgLyogc3VibWl0IE4gbmV3IGZyYW1lcyB0byBiZSB0cmFuc21pdHRlZCwgd2hlcmUKKyAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBuZXcgZnJhbWUgaXMgZmlyc3RfY2xlYXJfYnVmZmVyLAorICAgICAgICAgICBhbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5ldyBmcmFtZSBpcworICAgICAgICAgICAoZmlyc3RfY2xlYXJfYnVmZmVyICsgTikgJSBuX2ZyYW1lcyAqLworICAgICAgICBEVjEzOTRfU1VCTUlUX0ZSQU1FUywKKworCisgICAgICAgIC8qIGJsb2NrIHVudGlsIE4gYnVmZmVycyBhcmUgY2xlYXIgKHBhc3MgTiBhcyB0aGUgcGFyYW1ldGVyKQorICAgICAgICAgICBCZWNhdXNlIHdlIHJlLXRyYW5zbWl0IHRoZSBsYXN0IGZyYW1lIG9uIHVuZGVycnVuLCB0aGVyZQorICAgICAgICAgICB3aWxsIGF0IG1vc3QgYmUgbl9mcmFtZXMgLSAxIGNsZWFyIGZyYW1lcyBhdCBhbnkgdGltZSAqLworICAgICAgICBEVjEzOTRfV0FJVF9GUkFNRVMsCisKKyAgICAgICAgLyogY2FwdHVyZSBuZXcgZnJhbWVzIHRoYXQgaGF2ZSBiZWVuIHJlY2VpdmVkLCB3aGVyZQorICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5ldyBmcmFtZSBpcyBmaXJzdF9jbGVhcl9idWZmZXIsCisgICAgICAgICAgIGFuZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgbmV3IGZyYW1lIGlzCisgICAgICAgICAgIChmaXJzdF9jbGVhcl9idWZmZXIgKyBOKSAlIG5fZnJhbWVzICovCisgICAgICAgIERWMTM5NF9SRUNFSVZFX0ZSQU1FUywKKworCisgICAgICAgIERWMTM5NF9TVEFSVF9SRUNFSVZFLAorCisKKyAgICAgICAgLyogcGFzcyBhIHN0cnVjdCBkdjEzOTRfc3RhdHVzKiBhcyB0aGUgcGFyYW1ldGVyIChzZWUgYmVsb3cpICovCisgICAgICAgIERWMTM5NF9HRVRfU1RBVFVTLAorfTsKKworCisKK2VudW0gcGFsX29yX250c2MgeworICAgICAgICBEVjEzOTRfTlRTQyA9IDAsCisgICAgICAgIERWMTM5NF9QQUwKK307CisKKworCisKKy8qIHRoaXMgaXMgdGhlIGFyZ3VtZW50IHRvIERWMTM5NF9JTklUICovCitzdHJ1Y3QgZHYxMzk0X2luaXQgeworICAgICAgICAvKiBEVjEzOTRfQVBJX1ZFUlNJT04gKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGFwaV92ZXJzaW9uOworCisgICAgICAgIC8qIGlzb2Nocm9ub3VzIHRyYW5zbWlzc2lvbiBjaGFubmVsIHRvIHVzZSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKworICAgICAgICAvKiBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSByaW5nYnVmZmVyLiBNdXN0IGJlIGF0IGxlYXN0IDIKKyAgICAgICAgICAgYW5kIGF0IG1vc3QgRFYxMzk0X01BWF9GUkFNRVMuICovCisgICAgICAgIHVuc2lnbmVkIGludCBuX2ZyYW1lczsKKworICAgICAgICAvKiBzZW5kL3JlY2VpdmUgUEFMIG9yIE5UU0MgdmlkZW8gZm9ybWF0ICovCisgICAgICAgIGVudW0gcGFsX29yX250c2MgZm9ybWF0OworCisgICAgICAgIC8qIHRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgb25seSBmb3IgdHJhbnNtaXNzaW9uICovCisKKyAgICAgICAgLyogc2V0IHRoZXNlIHRvIHplcm8gdW5sZXNzIHlvdSB3YW50IGEKKyAgICAgICAgICAgbm9uLWRlZmF1bHQgZW1wdHkgcGFja2V0IHJhdGUgKHNlZSBiZWxvdykgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyBjaXBfbjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBjaXBfZDsKKworICAgICAgICAvKiBzZXQgdGhpcyB0byB6ZXJvIHVubGVzcyB5b3Ugd2FudCBhCisgICAgICAgICAgIG5vbi1kZWZhdWx0IFNZVCBjeWNsZSBvZmZzZXQgKGRlZmF1bHQgPSAzIGN5Y2xlcykgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHN5dF9vZmZzZXQ7Cit9OworCisvKiBOT1RFOiB5b3UgbWF5IG9ubHkgYWxsb2NhdGUgdGhlIERWIGZyYW1lIHJpbmdidWZmZXIgb25jZSBlYWNoIHRpbWUKKyAgIHlvdSBvcGVuIHRoZSBkdjEzOTQgZGV2aWNlLiBEVjEzOTRfSU5JVCB3aWxsIGZhaWwgaWYgeW91IGNhbGwgaXQgYQorICAgc2Vjb25kIHRpbWUgd2l0aCBkaWZmZXJlbnQgJ25fZnJhbWVzJyBvciAnZm9ybWF0JyBhcmd1bWVudHMgKHdoaWNoCisgICB3b3VsZCBpbXBseSBhIGRpZmZlcmVudCBzaXplIGZvciB0aGUgcmluZ2J1ZmZlcikuIElmIHlvdSBuZWVkIGEKKyAgIGRpZmZlcmVudCBidWZmZXIgc2l6ZSwgc2ltcGx5IGNsb3NlIGFuZCByZS1vcGVuIHRoZSBkZXZpY2UsIHRoZW4KKyAgIGluaXRpYWxpemUgaXQgd2l0aCB5b3VyIG5ldyBzZXR0aW5ncy4gKi8KKworLyogUTogV2hhdCBhcmUgY2lwX24gYW5kIGNpcF9kPyAqLworCisvKgorICBBOiBEViB2aWRlbyBzdHJlYW1zIGRvIG5vdCB1dGlsaXplIDEwMCUgb2YgdGhlIHBvdGVudGlhbCBiYW5kd2lkdGggb2ZmZXJlZAorICBieSBJRUVFIDEzOTQgKEZpcmVXaXJlKS4gVG8gYWNoaWV2ZSB0aGUgY29ycmVjdCByYXRlIG9mIGRhdGEgdHJhbnNtaXNzaW9uLAorICBEViBkZXZpY2VzIG11c3QgcGVyaW9kaWNhbGx5IGluc2VydCBlbXB0eSBwYWNrZXRzIGludG8gdGhlIDEzOTQgZGF0YSBzdHJlYW0uCisgIFR5cGljYWxseSB0aGVyZSBpcyBvbmUgZW1wdHkgcGFja2V0IHBlciAxNC0xNiBkYXRhLWNhcnJ5aW5nIHBhY2tldHMuCisKKyAgU29tZSBEViBkZXZpY2VzIHdpbGwgYWNjZXB0IGEgd2lkZSByYW5nZSBvZiBlbXB0eSBwYWNrZXQgcmF0ZXMsIHdoaWxlIG90aGVycworICByZXF1aXJlIGEgcHJlY2lzZSByYXRlLiBJZiB0aGUgZHYxMzk0IGRyaXZlciBwcm9kdWNlcyBlbXB0eSBwYWNrZXRzIGF0CisgIGEgcmF0ZSB0aGF0IHlvdXIgZGV2aWNlIGRvZXMgbm90IGFjY2VwdCwgeW91IG1heSBzZWUgdWdseSBwYXR0ZXJucyBvbiB0aGUKKyAgRFYgb3V0cHV0LCBvciBldmVuIG5vIG91dHB1dCBhdCBhbGwuCisKKyAgVGhlIGRlZmF1bHQgZW1wdHkgcGFja2V0IGluc2VydGlvbiByYXRlIHNlZW1zIHRvIHdvcmsgZm9yIG1hbnkgcGVvcGxlOyBpZgorICB5b3VyIERWIG91dHB1dCBpcyBzdGFibGUsIHlvdSBjYW4gc2ltcGx5IGlnbm9yZSB0aGlzIGRpc2N1c3Npb24uIEhvd2V2ZXIsCisgIHdlIGhhdmUgZXhwb3NlZCB0aGUgZW1wdHkgcGFja2V0IHJhdGUgYXMgYSBwYXJhbWV0ZXIgdG8gc3VwcG9ydCBkZXZpY2VzIHRoYXQKKyAgZG8gbm90IHdvcmsgd2l0aCB0aGUgZGVmYXVsdCByYXRlLgorCisgIFRoZSBkZWNpc2lvbiB0byBpbnNlcnQgYW4gZW1wdHkgcGFja2V0IGlzIG1hZGUgd2l0aCBhIG51bWVyYXRvci9kZW5vbWluYXRvcgorICBhbGdvcml0aG0uIEVtcHR5IHBhY2tldHMgYXJlIHByb2R1Y2VkIGF0IGFuIGF2ZXJhZ2UgcmF0ZSBvZiBDSVBfTiAvIENJUF9ELgorICBZb3UgY2FuIGFsdGVyIHRoZSBlbXB0eSBwYWNrZXQgcmF0ZSBieSBwYXNzaW5nIG5vbi16ZXJvIHZhbHVlcyBmb3IgY2lwX24KKyAgYW5kIGNpcF9kIHRvIHRoZSBJTklUIGlvY3RsLgorCisgKi8KKworCisKK3N0cnVjdCBkdjEzOTRfc3RhdHVzIHsKKyAgICAgICAgLyogdGhpcyBlbWJlZGRlZCBpbml0IHN0cnVjdCByZXR1cm5zIHRoZSBjdXJyZW50IGR2MTM5NAorICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHVzZSAqLworICAgICAgICBzdHJ1Y3QgZHYxMzk0X2luaXQgaW5pdDsKKworICAgICAgICAvKiB0aGUgcmluZ2J1ZmZlciBmcmFtZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZworICAgICAgICAgICBkaXNwbGF5ZWQuICgtMSBpZiB0aGUgZGV2aWNlIGlzIG5vdCB0cmFuc21pdHRpbmcgYW55dGhpbmcpICovCisgICAgICAgIGludCBhY3RpdmVfZnJhbWU7CisKKyAgICAgICAgLyogaW5kZXggb2YgdGhlIGZpcnN0IGJ1ZmZlciAoYWhlYWQgb2YgYWN0aXZlX2ZyYW1lKSB0aGF0CisgICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIGZpbGxlZCB3aXRoIGRhdGEgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGZpcnN0X2NsZWFyX2ZyYW1lOworCisgICAgICAgIC8qIGhvdyBtYW55IGJ1ZmZlcnMsIGluY2x1ZGluZyBmaXJzdF9jbGVhcl9idWZmZXIsIGFyZQorICAgICAgICAgICByZWFkeSB0byBiZSBmaWxsZWQgd2l0aCBkYXRhICovCisgICAgICAgIHVuc2lnbmVkIGludCBuX2NsZWFyX2ZyYW1lczsKKworICAgICAgICAvKiBob3cgbWFueSB0aW1lcyB0aGUgRFYgc3RyZWFtIGhhcyB1bmRlcmZsb3dlZCwgb3ZlcmZsb3dlZCwKKyAgICAgICAgICAgb3Igb3RoZXJ3aXNlIGVuY291bnRlcmVkIGFuIGVycm9yLCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbAorICAgICAgICAgICB0byBEVjEzOTRfR0VUX1NUQVRVUyAqLworICAgICAgICB1bnNpZ25lZCBpbnQgZHJvcHBlZF9mcmFtZXM7CisKKyAgICAgICAgLyogTi5CLiBUaGUgZHJvcHBlZF9mcmFtZXMgY291bnRlciBpcyBvbmx5IGEgbG93ZXIgYm91bmQgb24gdGhlIGFjdHVhbAorICAgICAgICAgICBudW1iZXIgb2YgZHJvcHBlZCBmcmFtZXMsIHdpdGggdGhlIHNwZWNpYWwgY2FzZSB0aGF0IGlmIGRyb3BwZWRfZnJhbWVzCisgICAgICAgICAgIGlzIHplcm8sIHRoZW4gaXQgaXMgZ3VhcmFudGVlZCB0aGF0IE5PIGZyYW1lcyBoYXZlIGJlZW4gZHJvcHBlZAorICAgICAgICAgICBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIERWMTM5NF9HRVRfU1RBVFVTLgorICAgICAgICAqLworfTsKKworCisjZW5kaWYgLyogQVZERVZJQ0VfRFYxMzk0X0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9mYmRldl9jb21tb24uYyBiL2ZmbXBlZy9saWJhdmRldmljZS9mYmRldl9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY5NmRlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2ZiZGV2X2NvbW1vbi5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFN0ZWZhbm8gU2FiYXRpbmkKKyAqIENvcHlyaWdodCAoYykgMjAwOSBHaWxpYXJkIEIuIGRlIEZyZWl0YXMgPGdpbGlhcmRlQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBHdW5uYXIgTW9uZWxsIDxnbW9AbGludXgubnU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImZiZGV2X2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJhdmRldmljZS5oIgorCitzdHJ1Y3QgcmdiX3BpeGZtdF9tYXBfZW50cnkgeworICAgIGludCBiaXRzX3Blcl9waXhlbDsKKyAgICBpbnQgcmVkX29mZnNldCwgZ3JlZW5fb2Zmc2V0LCBibHVlX29mZnNldCwgYWxwaGFfb2Zmc2V0OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhmbXQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJnYl9waXhmbXRfbWFwX2VudHJ5IHJnYl9waXhmbXRfbWFwW10gPSB7CisgICAgLy8gYnBwLCByZWRfb2Zmc2V0LCAgZ3JlZW5fb2Zmc2V0LCBibHVlX29mZnNldCwgYWxwaGFfb2Zmc2V0LCBwaXhmbXQKKyAgICB7ICAzMiwgICAgICAgMCwgICAgICAgICAgIDgsICAgICAgICAgIDE2LCAgICAgICAgICAgMjQsICAgQVZfUElYX0ZNVF9SR0JBICB9LAorICAgIHsgIDMyLCAgICAgIDE2LCAgICAgICAgICAgOCwgICAgICAgICAgIDAsICAgICAgICAgICAyNCwgICBBVl9QSVhfRk1UX0JHUkEgIH0sCisgICAgeyAgMzIsICAgICAgIDgsICAgICAgICAgIDE2LCAgICAgICAgICAyNCwgICAgICAgICAgICAwLCAgIEFWX1BJWF9GTVRfQVJHQiAgfSwKKyAgICB7ICAzMiwgICAgICAgMywgICAgICAgICAgIDIsICAgICAgICAgICA4LCAgICAgICAgICAgIDAsICAgQVZfUElYX0ZNVF9BQkdSICB9LAorICAgIHsgIDI0LCAgICAgICAwLCAgICAgICAgICAgOCwgICAgICAgICAgMTYsICAgICAgICAgICAgMCwgICBBVl9QSVhfRk1UX1JHQjI0IH0sCisgICAgeyAgMjQsICAgICAgMTYsICAgICAgICAgICA4LCAgICAgICAgICAgMCwgICAgICAgICAgICAwLCAgIEFWX1BJWF9GTVRfQkdSMjQgfSwKKyAgICB7ICAxNiwgICAgICAxMSwgICAgICAgICAgIDUsICAgICAgICAgICAwLCAgICAgICAgICAgMTYsICAgQVZfUElYX0ZNVF9SR0I1NjUgfSwKK307CisKK2VudW0gQVZQaXhlbEZvcm1hdCBmZl9nZXRfcGl4Zm10X2Zyb21fZmJfdmFyaW5mbyhzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcmluZm8pCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocmdiX3BpeGZtdF9tYXApOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IHJnYl9waXhmbXRfbWFwX2VudHJ5ICplbnRyeSA9ICZyZ2JfcGl4Zm10X21hcFtpXTsKKyAgICAgICAgaWYgKGVudHJ5LT5iaXRzX3Blcl9waXhlbCA9PSB2YXJpbmZvLT5iaXRzX3Blcl9waXhlbCAmJgorICAgICAgICAgICAgZW50cnktPnJlZF9vZmZzZXQgICAgID09IHZhcmluZm8tPnJlZC5vZmZzZXQgICAgICYmCisgICAgICAgICAgICBlbnRyeS0+Z3JlZW5fb2Zmc2V0ICAgPT0gdmFyaW5mby0+Z3JlZW4ub2Zmc2V0ICAgJiYKKyAgICAgICAgICAgIGVudHJ5LT5ibHVlX29mZnNldCAgICA9PSB2YXJpbmZvLT5ibHVlLm9mZnNldCkKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS0+cGl4Zm10OworICAgIH0KKworICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7Cit9CisKK2NvbnN0IGNoYXIqIGZmX2ZiZGV2X2RlZmF1bHRfZGV2aWNlKCkKK3sKKyAgICBjb25zdCBjaGFyICpkZXYgPSBnZXRlbnYoIkZSQU1FQlVGRkVSIik7CisgICAgaWYgKCFkZXYpCisgICAgICAgIGRldiA9ICIvZGV2L2ZiMCI7CisgICAgcmV0dXJuIGRldjsKK30KKworaW50IGZmX2ZiZGV2X2dldF9kZXZpY2VfbGlzdChBVkRldmljZUluZm9MaXN0ICpkZXZpY2VfbGlzdCkKK3sKKyAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyaW5mbzsKKyAgICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gZml4aW5mbzsKKyAgICBjaGFyIGRldmljZV9maWxlWzEyXTsKKyAgICBBVkRldmljZUluZm8gKmRldmljZSA9IE5VTEw7CisgICAgaW50IGksIGZkLCByZXQgPSAwOworICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfZGV2aWNlID0gZmZfZmJkZXZfZGVmYXVsdF9kZXZpY2UoKTsKKworICAgIGlmICghZGV2aWNlX2xpc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IDMxOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoZGV2aWNlX2ZpbGUsIHNpemVvZihkZXZpY2VfZmlsZSksICIvZGV2L2ZiJWQiLCBpKTsKKworICAgICAgICBpZiAoKGZkID0gYXZwcml2X29wZW4oZGV2aWNlX2ZpbGUsIE9fUkRXUikpIDwgMCkgeworICAgICAgICAgICAgaW50IGVyciA9IEFWRVJST1IoZXJybm8pOworICAgICAgICAgICAgaWYgKGVyciAhPSBBVkVSUk9SKEVOT0VOVCkpCisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBvcGVuIGZyYW1lYnVmZmVyIGRldmljZSAnJXMnOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2ZpbGUsIGF2X2VycjJzdHIoZXJyKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW9jdGwoZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2YXJpbmZvKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbF9kZXZpY2U7CisgICAgICAgIGlmIChpb2N0bChmZCwgRkJJT0dFVF9GU0NSRUVOSU5GTywgJmZpeGluZm8pID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsX2RldmljZTsKKworICAgICAgICBkZXZpY2UgPSBhdl9tYWxsb2N6KHNpemVvZihBVkRldmljZUluZm8pKTsKKyAgICAgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbF9kZXZpY2U7CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlLT5kZXZpY2VfbmFtZSA9IGF2X3N0cmR1cChkZXZpY2VfZmlsZSk7CisgICAgICAgIGRldmljZS0+ZGV2aWNlX2Rlc2NyaXB0aW9uID0gYXZfc3RyZHVwKGZpeGluZm8uaWQpOworICAgICAgICBpZiAoIWRldmljZS0+ZGV2aWNlX25hbWUgfHwgIWRldmljZS0+ZGV2aWNlX2Rlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWxfZGV2aWNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBhdl9keW5hcnJheV9hZGRfbm9mcmVlKCZkZXZpY2VfbGlzdC0+ZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VfbGlzdC0+bmJfZGV2aWNlcywgZGV2aWNlKSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsX2RldmljZTsKKworICAgICAgICBpZiAoZGVmYXVsdF9kZXZpY2UgJiYgIXN0cmNtcChkZXZpY2UtPmRldmljZV9uYW1lLCBkZWZhdWx0X2RldmljZSkpIHsKKyAgICAgICAgICAgIGRldmljZV9saXN0LT5kZWZhdWx0X2RldmljZSA9IGRldmljZV9saXN0LT5uYl9kZXZpY2VzIC0gMTsKKyAgICAgICAgICAgIGRlZmF1bHRfZGV2aWNlID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBmYWlsX2RldmljZToKKyAgICAgICAgaWYgKGRldmljZSkgeworICAgICAgICAgICAgYXZfZnJlZXAoJmRldmljZS0+ZGV2aWNlX25hbWUpOworICAgICAgICAgICAgYXZfZnJlZXAoJmRldmljZS0+ZGV2aWNlX2Rlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZkZXZpY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChmZCA+PSAwKQorICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2ZiZGV2X2NvbW1vbi5oIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2ZiZGV2X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiODFhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvZmJkZXZfY29tbW9uLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTdGVmYW5vIFNhYmF0aW5pCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgR2lsaWFyZCBCLiBkZSBGcmVpdGFzIDxnaWxpYXJkZUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgR3VubmFyIE1vbmVsbCA8Z21vQGxpbnV4Lm51PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWREVWSUNFX0ZCREVWX0NPTU1PTl9ICisjZGVmaW5lIEFWREVWSUNFX0ZCREVWX0NPTU1PTl9ICisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorCitzdHJ1Y3QgQVZEZXZpY2VJbmZvTGlzdDsKKworZW51bSBBVlBpeGVsRm9ybWF0IGZmX2dldF9waXhmbXRfZnJvbV9mYl92YXJpbmZvKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyaW5mbyk7CisKK2NvbnN0IGNoYXIqIGZmX2ZiZGV2X2RlZmF1bHRfZGV2aWNlKHZvaWQpOworCitpbnQgZmZfZmJkZXZfZ2V0X2RldmljZV9saXN0KHN0cnVjdCBBVkRldmljZUluZm9MaXN0ICpkZXZpY2VfbGlzdCk7CisKKyNlbmRpZiAvKiBBVkRFVklDRV9GQkRFVl9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2ZiZGV2X2RlYy5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2ZiZGV2X2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjQwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvZmJkZXZfZGVjLmMKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU3RlZmFubyBTYWJhdGluaQorICogQ29weXJpZ2h0IChjKSAyMDA5IEdpbGlhcmQgQi4gZGUgRnJlaXRhcyA8Z2lsaWFyZGVAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDAyIEd1bm5hciBNb25lbGwgPGdtb0BsaW51eC5udT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTGludXggZnJhbWVidWZmZXIgaW5wdXQgZGV2aWNlLAorICogaW5zcGlyZWQgYnkgY29kZSBmcm9tIGZiZ3JhYi5jIGJ5IEd1bm5hciBNb25lbGwuCisgKiBAc2VlIGh0dHA6Ly9saW51eC1mYmRldi5zb3VyY2Vmb3JnZS5uZXQvCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZkZXZpY2UuaCIKKyNpbmNsdWRlICJmYmRldl9jb21tb24uaCIKKwordHlwZWRlZiBzdHJ1Y3QgRkJEZXZDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsgICAgICAgICAgLy8vPCBjbGFzcyBmb3IgcHJpdmF0ZSBvcHRpb25zCisgICAgaW50IGZyYW1lX3NpemU7ICAgICAgICAgIC8vLzwgc2l6ZSBpbiBieXRlcyBvZiBhIGdyYWJiZWQgZnJhbWUKKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZV9xOyAgLy8vPCBmcmFtZXJhdGUKKyAgICBpbnQ2NF90IHRpbWVfZnJhbWU7ICAgICAgLy8vPCB0aW1lIGZvciB0aGUgbmV4dCBmcmFtZSB0byBvdXRwdXQgKGluIDEvMTAwMDAwMCB1bml0cykKKworICAgIGludCBmZDsgICAgICAgICAgICAgICAgICAvLy88IGZyYW1lYnVmZmVyIGRldmljZSBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsgICAgICAgLy8vPCBhc3N1bWVkIGZyYW1lIHJlc29sdXRpb24KKyAgICBpbnQgZnJhbWVfbGluZXNpemU7ICAgICAgLy8vPCBsaW5lc2l6ZSBvZiB0aGUgb3V0cHV0IGZyYW1lLCBpdCBpcyBhc3N1bWVkIHRvIGJlIGNvbnN0YW50CisgICAgaW50IGJ5dGVzX3Blcl9waXhlbDsKKworICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXJpbmZvOyAvLy88IHZhcmlhYmxlIGluZm87CisgICAgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGZpeGluZm87IC8vLzwgZml4ZWQgICAgaW5mbzsKKworICAgIHVpbnQ4X3QgKmRhdGE7ICAgICAgICAgICAvLy88IGZyYW1lYnVmZmVyIGRhdGEKK30gRkJEZXZDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgZmJkZXZfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGQkRldkNvbnRleHQgKmZiZGV2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBOVUxMOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworICAgIGludCByZXQsIGZsYWdzID0gT19SRE9OTFk7CisgICAgY29uc3QgY2hhciogZGV2aWNlOworCisgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2Y3R4LCBOVUxMKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOyAvKiA2NCBiaXRzIHB0cyBpbiBtaWNyb3NlY29uZHMgKi8KKworICAgIC8qIE5PTkJMT0NLIGlzIGlnbm9yZWQgYnkgdGhlIGZiZGV2IGRyaXZlciwgb25seSBzZXQgZm9yIGNvbnNpc3RlbmN5ICovCisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIEFWRk1UX0ZMQUdfTk9OQkxPQ0spCisgICAgICAgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CisKKyAgICBpZiAoYXZjdHgtPmZpbGVuYW1lWzBdKQorICAgICAgICBkZXZpY2UgPSBhdmN0eC0+ZmlsZW5hbWU7CisgICAgZWxzZQorICAgICAgICBkZXZpY2UgPSBmZl9mYmRldl9kZWZhdWx0X2RldmljZSgpOworCisgICAgaWYgKChmYmRldi0+ZmQgPSBhdnByaXZfb3BlbihkZXZpY2UsIGZsYWdzKSkgPT0gLTEpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBvcGVuIGZyYW1lYnVmZmVyIGRldmljZSAnJXMnOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGRldmljZSwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoaW9jdGwoZmJkZXYtPmZkLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAmZmJkZXYtPnZhcmluZm8pIDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRkJJT0dFVF9WU0NSRUVOSU5GTzogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoaW9jdGwoZmJkZXYtPmZkLCBGQklPR0VUX0ZTQ1JFRU5JTkZPLCAmZmJkZXYtPmZpeGluZm8pIDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRkJJT0dFVF9GU0NSRUVOSU5GTzogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBwaXhfZm10ID0gZmZfZ2V0X3BpeGZtdF9mcm9tX2ZiX3ZhcmluZm8oJmZiZGV2LT52YXJpbmZvKTsKKyAgICBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGcmFtZWJ1ZmZlciBwaXhlbCBmb3JtYXQgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZmJkZXYtPndpZHRoICAgICAgICAgICA9IGZiZGV2LT52YXJpbmZvLnhyZXM7CisgICAgZmJkZXYtPmhlaWdodCAgICAgICAgICA9IGZiZGV2LT52YXJpbmZvLnlyZXM7CisgICAgZmJkZXYtPmJ5dGVzX3Blcl9waXhlbCA9IChmYmRldi0+dmFyaW5mby5iaXRzX3Blcl9waXhlbCArIDcpID4+IDM7CisgICAgZmJkZXYtPmZyYW1lX2xpbmVzaXplICA9IGZiZGV2LT53aWR0aCAqIGZiZGV2LT5ieXRlc19wZXJfcGl4ZWw7CisgICAgZmJkZXYtPmZyYW1lX3NpemUgICAgICA9IGZiZGV2LT5mcmFtZV9saW5lc2l6ZSAqIGZiZGV2LT5oZWlnaHQ7CisgICAgZmJkZXYtPnRpbWVfZnJhbWUgICAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgIGZiZGV2LT5kYXRhID0gbW1hcChOVUxMLCBmYmRldi0+Zml4aW5mby5zbWVtX2xlbiwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmYmRldi0+ZmQsIDApOworICAgIGlmIChmYmRldi0+ZGF0YSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluIG1tYXAoKTogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gZmJkZXYtPndpZHRoOworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGZiZGV2LT5oZWlnaHQ7CisgICAgc3QtPmNvZGVjLT5waXhfZm10ICAgID0gcGl4X2ZtdDsKKyAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZSAgPSBhdl9pbnZfcShmYmRldi0+ZnJhbWVyYXRlX3EpOworICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICA9CisgICAgICAgIGZiZGV2LT53aWR0aCAqIGZiZGV2LT5oZWlnaHQgKiBmYmRldi0+Ynl0ZXNfcGVyX3BpeGVsICogYXZfcTJkKGZiZGV2LT5mcmFtZXJhdGVfcSkgKiA4OworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgInc6JWQgaDolZCBicHA6JWQgcGl4Zm10OiVzIGZwczolZC8lZCBiaXRfcmF0ZTolZFxuIiwKKyAgICAgICAgICAgZmJkZXYtPndpZHRoLCBmYmRldi0+aGVpZ2h0LCBmYmRldi0+dmFyaW5mby5iaXRzX3Blcl9waXhlbCwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShwaXhfZm10KSwKKyAgICAgICAgICAgZmJkZXYtPmZyYW1lcmF0ZV9xLm51bSwgZmJkZXYtPmZyYW1lcmF0ZV9xLmRlbiwKKyAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSk7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgY2xvc2UoZmJkZXYtPmZkKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZiZGV2X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgRkJEZXZDb250ZXh0ICpmYmRldiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBjdXJ0aW1lLCBkZWxheTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgaW50IGksIHJldDsKKyAgICB1aW50OF90ICpwaW4sICpwb3V0OworCisgICAgaWYgKGZiZGV2LT50aW1lX2ZyYW1lID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBmYmRldi0+dGltZV9mcmFtZSA9IGF2X2dldHRpbWUoKTsKKworICAgIC8qIHdhaXQgYmFzZWQgb24gdGhlIGZyYW1lIHJhdGUgKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBjdXJ0aW1lID0gYXZfZ2V0dGltZSgpOworICAgICAgICBkZWxheSA9IGZiZGV2LT50aW1lX2ZyYW1lIC0gY3VydGltZTsKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwKKyAgICAgICAgICAgICAgICAidGltZV9mcmFtZTolIlBSSWQ2NCIgY3VydGltZTolIlBSSWQ2NCIgZGVsYXk6JSJQUklkNjQiXG4iLAorICAgICAgICAgICAgICAgIGZiZGV2LT50aW1lX2ZyYW1lLCBjdXJ0aW1lLCBkZWxheSk7CisgICAgICAgIGlmIChkZWxheSA8PSAwKSB7CisgICAgICAgICAgICBmYmRldi0+dGltZV9mcmFtZSArPSBJTlQ2NF9DKDEwMDAwMDApIC8gYXZfcTJkKGZiZGV2LT5mcmFtZXJhdGVfcSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZjdHgtPmZsYWdzICYgQVZGTVRfRkxBR19OT05CTE9DSykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIHRzLnR2X3NlYyAgPSAgZGVsYXkgLyAxMDAwMDAwOworICAgICAgICB0cy50dl9uc2VjID0gKGRlbGF5ICUgMTAwMDAwMCkgKiAxMDAwOworICAgICAgICB3aGlsZSAobmFub3NsZWVwKCZ0cywgJnRzKSA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIGZiZGV2LT5mcmFtZV9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogcmVmcmVzaCBmYmRldi0+dmFyaW5mbywgdmlzaWJsZSBkYXRhIHBvc2l0aW9uIG1heSBjaGFuZ2UgYXQgZWFjaCBjYWxsICovCisgICAgaWYgKGlvY3RsKGZiZGV2LT5mZCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJmZiZGV2LT52YXJpbmZvKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJFcnJvciByZWZyZXNoaW5nIHZhcmlhYmxlIGluZm86ICVzXG4iLCBhdl9lcnIyc3RyKEFWRVJST1IoZXJybm8pKSk7CisgICAgfQorCisgICAgcGt0LT5wdHMgPSBjdXJ0aW1lOworCisgICAgLyogY29tcHV0ZSB2aXNpYmxlIGRhdGEgb2Zmc2V0ICovCisgICAgcGluID0gZmJkZXYtPmRhdGEgKyBmYmRldi0+Ynl0ZXNfcGVyX3BpeGVsICogZmJkZXYtPnZhcmluZm8ueG9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICBmYmRldi0+dmFyaW5mby55b2Zmc2V0ICogZmJkZXYtPmZpeGluZm8ubGluZV9sZW5ndGg7CisgICAgcG91dCA9IHBrdC0+ZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmYmRldi0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgbWVtY3B5KHBvdXQsIHBpbiwgZmJkZXYtPmZyYW1lX2xpbmVzaXplKTsKKyAgICAgICAgcGluICArPSBmYmRldi0+Zml4aW5mby5saW5lX2xlbmd0aDsKKyAgICAgICAgcG91dCArPSBmYmRldi0+ZnJhbWVfbGluZXNpemU7CisgICAgfQorCisgICAgcmV0dXJuIGZiZGV2LT5mcmFtZV9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZmJkZXZfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQoreworICAgIEZCRGV2Q29udGV4dCAqZmJkZXYgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgbXVubWFwKGZiZGV2LT5kYXRhLCBmYmRldi0+Zml4aW5mby5zbWVtX2xlbik7CisgICAgY2xvc2UoZmJkZXYtPmZkKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZiZGV2X2dldF9kZXZpY2VfbGlzdChBVkZvcm1hdENvbnRleHQgKnMsIEFWRGV2aWNlSW5mb0xpc3QgKmRldmljZV9saXN0KQoreworICAgIHJldHVybiBmZl9mYmRldl9nZXRfZGV2aWNlX2xpc3QoZGV2aWNlX2xpc3QpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGQkRldkNvbnRleHQsIHgpCisjZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJmcmFtZXJhdGUiLCIiLCBPRkZTRVQoZnJhbWVyYXRlX3EpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCAwLCBERUMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGZiZGV2X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImZiZGV2IGluZGV2IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19JTlBVVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfZmJkZXZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZmJkZXYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMaW51eCBmcmFtZWJ1ZmZlciIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGQkRldkNvbnRleHQpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGZiZGV2X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZiZGV2X3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGZiZGV2X3JlYWRfY2xvc2UsCisgICAgLmdldF9kZXZpY2VfbGlzdCA9IGZiZGV2X2dldF9kZXZpY2VfbGlzdCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmZiZGV2X2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9mYmRldl9lbmMuYyBiL2ZmbXBlZy9saWJhdmRldmljZS9mYmRldl9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGVmYzcxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2ZiZGV2X2VuYy5jCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIEx1a2FzeiBNYXJlaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImZiZGV2X2NvbW1vbi5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsgICAgICAgICAgICAgICAgICAgLy8vPCBjbGFzcyBmb3IgcHJpdmF0ZSBvcHRpb25zCisgICAgaW50IHhvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgeCBjb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lcgorICAgIGludCB5b2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAvLy88IHkgY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIKKyAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyaW5mbzsgLy8vPCBmcmFtZWJ1ZmZlciB2YXJpYWJsZSBpbmZvCisgICAgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGZpeGluZm87IC8vLzwgZnJhbWVidWZmZXIgZml4ZWQgaW5mbworICAgIGludCBmZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZyYW1lYnVmZmVyIGRldmljZSBmaWxlIGRlc2NyaXB0b3IKKyAgICB1aW50OF90ICpkYXRhOyAgICAgICAgICAgICAgICAgICAgLy8vPCBmcmFtZWJ1ZmZlciBkYXRhCit9IEZCRGV2Q29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGZiZGV2X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmgpCit7CisgICAgRkJEZXZDb250ZXh0ICpmYmRldiA9IGgtPnByaXZfZGF0YTsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKKyAgICBpbnQgcmV0LCBmbGFncyA9IE9fUkRXUjsKKyAgICBjb25zdCBjaGFyKiBkZXZpY2U7CisKKyAgICBpZiAoaC0+bmJfc3RyZWFtcyAhPSAxIHx8IGgtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBhdl9sb2coZmJkZXYsIEFWX0xPR19FUlJPUiwgIk9ubHkgYSBzaW5nbGUgdmlkZW8gc3RyZWFtIGlzIHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChoLT5maWxlbmFtZVswXSkKKyAgICAgICAgZGV2aWNlID0gaC0+ZmlsZW5hbWU7CisgICAgZWxzZQorICAgICAgICBkZXZpY2UgPSBmZl9mYmRldl9kZWZhdWx0X2RldmljZSgpOworCisgICAgaWYgKChmYmRldi0+ZmQgPSBhdnByaXZfb3BlbihkZXZpY2UsIGZsYWdzKSkgPT0gLTEpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ291bGQgbm90IG9wZW4gZnJhbWVidWZmZXIgZGV2aWNlICclcyc6ICVzXG4iLAorICAgICAgICAgICAgICAgZGV2aWNlLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChpb2N0bChmYmRldi0+ZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZmYmRldi0+dmFyaW5mbykgPCAwKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiRkJJT0dFVF9WU0NSRUVOSU5GTzogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoaW9jdGwoZmJkZXYtPmZkLCBGQklPR0VUX0ZTQ1JFRU5JTkZPLCAmZmJkZXYtPmZpeGluZm8pIDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkZCSU9HRVRfRlNDUkVFTklORk86ICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcGl4X2ZtdCA9IGZmX2dldF9waXhmbXRfZnJvbV9mYl92YXJpbmZvKCZmYmRldi0+dmFyaW5mbyk7CisgICAgaWYgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkZyYW1lYnVmZmVyIHBpeGVsIGZvcm1hdCBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmYmRldi0+ZGF0YSA9IG1tYXAoTlVMTCwgZmJkZXYtPmZpeGluZm8uc21lbV9sZW4sIFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZiZGV2LT5mZCwgMCk7CisgICAgaWYgKGZiZGV2LT5kYXRhID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJFcnJvciBpbiBtbWFwKCk6ICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisgIGZhaWw6CisgICAgY2xvc2UoZmJkZXYtPmZkKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZiZGV2X3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgRkJEZXZDb250ZXh0ICpmYmRldiA9IGgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpwaW4sICpwb3V0OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmYl9waXhfZm10OworICAgIGludCBkaXNwX2hlaWdodDsKKyAgICBpbnQgYnl0ZXNfdG9fY29weTsKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWNfY3R4ID0gaC0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHZpZGVvX3BpeF9mbXQgPSBjb2RlY19jdHgtPnBpeF9mbXQ7CisgICAgaW50IHZpZGVvX3dpZHRoID0gY29kZWNfY3R4LT53aWR0aDsKKyAgICBpbnQgdmlkZW9faGVpZ2h0ID0gY29kZWNfY3R4LT5oZWlnaHQ7CisgICAgaW50IGJ5dGVzX3Blcl9waXhlbCA9ICgoY29kZWNfY3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKyA3KSA+PiAzKTsKKyAgICBpbnQgc3JjX2xpbmVfc2l6ZSA9IHZpZGVvX3dpZHRoICogYnl0ZXNfcGVyX3BpeGVsOworICAgIGludCBpOworCisgICAgaWYgKGlvY3RsKGZiZGV2LT5mZCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJmZiZGV2LT52YXJpbmZvKSA8IDApCisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJFcnJvciByZWZyZXNoaW5nIHZhcmlhYmxlIGluZm86ICVzXG4iLCBhdl9lcnIyc3RyKEFWRVJST1IoZXJybm8pKSk7CisKKyAgICBmYl9waXhfZm10ID0gZmZfZ2V0X3BpeGZtdF9mcm9tX2ZiX3ZhcmluZm8oJmZiZGV2LT52YXJpbmZvKTsKKworICAgIGlmIChmYl9waXhfZm10ICE9IHZpZGVvX3BpeF9mbXQpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlBpeGVsIGZvcm1hdCAlcyBpcyBub3Qgc3VwcG9ydGVkLCB1c2UgJXNcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKHZpZGVvX3BpeF9mbXQpLCBhdl9nZXRfcGl4X2ZtdF9uYW1lKGZiX3BpeF9mbXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBkaXNwX2hlaWdodCA9IEZGTUlOKGZiZGV2LT52YXJpbmZvLnlyZXMsIHZpZGVvX2hlaWdodCk7CisgICAgYnl0ZXNfdG9fY29weSA9IEZGTUlOKGZiZGV2LT52YXJpbmZvLnhyZXMsIHZpZGVvX3dpZHRoKSAqIGJ5dGVzX3Blcl9waXhlbDsKKworICAgIHBpbiAgPSBwa3QtPmRhdGE7CisgICAgcG91dCA9IGZiZGV2LT5kYXRhICsKKyAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsICogZmJkZXYtPnZhcmluZm8ueG9mZnNldCArCisgICAgICAgICAgIGZiZGV2LT52YXJpbmZvLnlvZmZzZXQgKiBmYmRldi0+Zml4aW5mby5saW5lX2xlbmd0aDsKKworICAgIGlmIChmYmRldi0+eG9mZnNldCkgeworICAgICAgICBpZiAoZmJkZXYtPnhvZmZzZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAoLWZiZGV2LT54b2Zmc2V0ID49IHZpZGVvX3dpZHRoKSAvL25vdGhpbmcgdG8gZGlzcGxheQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgYnl0ZXNfdG9fY29weSArPSBmYmRldi0+eG9mZnNldCAqIGJ5dGVzX3Blcl9waXhlbDsKKyAgICAgICAgICAgIHBpbiAtPSBmYmRldi0+eG9mZnNldCAqIGJ5dGVzX3Blcl9waXhlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBkaWZmID0gKHZpZGVvX3dpZHRoICsgZmJkZXYtPnhvZmZzZXQpIC0gZmJkZXYtPnZhcmluZm8ueHJlczsKKyAgICAgICAgICAgIGlmIChkaWZmID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChkaWZmID49IHZpZGVvX3dpZHRoKSAvL25vdGhpbmcgdG8gZGlzcGxheQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBieXRlc190b19jb3B5IC09IGRpZmYgKiBieXRlc19wZXJfcGl4ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3V0ICs9IGJ5dGVzX3Blcl9waXhlbCAqIGZiZGV2LT54b2Zmc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZiZGV2LT55b2Zmc2V0KSB7CisgICAgICAgIGlmIChmYmRldi0+eW9mZnNldCA8IDApIHsKKyAgICAgICAgICAgIGlmICgtZmJkZXYtPnlvZmZzZXQgPj0gdmlkZW9faGVpZ2h0KSAvL25vdGhpbmcgdG8gZGlzcGxheQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgZGlzcF9oZWlnaHQgKz0gZmJkZXYtPnlvZmZzZXQ7CisgICAgICAgICAgICBwaW4gLT0gZmJkZXYtPnlvZmZzZXQgKiBzcmNfbGluZV9zaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGRpZmYgPSAodmlkZW9faGVpZ2h0ICsgZmJkZXYtPnlvZmZzZXQpIC0gZmJkZXYtPnZhcmluZm8ueXJlczsKKyAgICAgICAgICAgIGlmIChkaWZmID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChkaWZmID49IHZpZGVvX2hlaWdodCkgLy9ub3RoaW5nIHRvIGRpc3BsYXkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgZGlzcF9oZWlnaHQgLT0gZGlmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvdXQgKz0gZmJkZXYtPnlvZmZzZXQgKiBmYmRldi0+Zml4aW5mby5saW5lX2xlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBkaXNwX2hlaWdodDsgaSsrKSB7CisgICAgICAgIG1lbWNweShwb3V0LCBwaW4sIGJ5dGVzX3RvX2NvcHkpOworICAgICAgICBwb3V0ICs9IGZiZGV2LT5maXhpbmZvLmxpbmVfbGVuZ3RoOworICAgICAgICBwaW4gICs9IHNyY19saW5lX3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBmYmRldl93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqaCkKK3sKKyAgICBGQkRldkNvbnRleHQgKmZiZGV2ID0gaC0+cHJpdl9kYXRhOworICAgIG11bm1hcChmYmRldi0+ZGF0YSwgZmJkZXYtPmZpeGluZm8uc21lbV9sZW4pOworICAgIGNsb3NlKGZiZGV2LT5mZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmJkZXZfZ2V0X2RldmljZV9saXN0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZEZXZpY2VJbmZvTGlzdCAqZGV2aWNlX2xpc3QpCit7CisgICAgcmV0dXJuIGZmX2ZiZGV2X2dldF9kZXZpY2VfbGlzdChkZXZpY2VfbGlzdCk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZCRGV2Q29udGV4dCwgeCkKKyNkZWZpbmUgRU5DIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInhvZmZzZXQiLCAic2V0IHggY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIiLCBPRkZTRVQoeG9mZnNldCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgSU5UX01JTiwgSU5UX01BWCwgRU5DIH0sCisgICAgeyAieW9mZnNldCIsICJzZXQgeSBjb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciIsIE9GRlNFVCh5b2Zmc2V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCBJTlRfTUlOLCBJTlRfTUFYLCBFTkMgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZmJkZXZfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZmJkZXYgb3V0ZGV2IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19PVVRQVVQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9mYmRldl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZmJkZXYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMaW51eCBmcmFtZWJ1ZmZlciIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGQkRldkNvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCisgICAgLndyaXRlX2hlYWRlciAgID0gZmJkZXZfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IGZiZGV2X3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgPSBmYmRldl93cml0ZV90cmFpbGVyLAorICAgIC5nZXRfZGV2aWNlX2xpc3QgPSBmYmRldl9nZXRfZGV2aWNlX2xpc3QsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFIHwgQVZGTVRfVkFSSUFCTEVfRlBTIHwgQVZGTVRfTk9USU1FU1RBTVBTLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZmYmRldl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvZmlsZV9vcGVuLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvZmlsZV9vcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0YTVkMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9maWxlX29wZW4uYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpbGVfb3Blbi5jIgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2dkaWdyYWIuYyBiL2ZmbXBlZy9saWJhdmRldmljZS9nZGlncmFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExODVkNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9nZGlncmFiLmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qCisgKiBHREkgdmlkZW8gZ3JhYiBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIENhbHZpbiBXYWx0b24gPGNhbHZpbi53YWx0b25Aa2Vwc3Rpbi5jYT4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIENocmlzdG9waGUgR2lzcXVldCA8d29yZDEud29yZDJAZ21haWwuY29tPgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEdESSBmcmFtZSBkZXZpY2UgZGVtdXhlcgorICogQGF1dGhvciBDYWx2aW4gV2FsdG9uIDxjYWx2aW4ud2FsdG9uQGtlcHN0aW4uY2E+CisgKiBAYXV0aG9yIENocmlzdG9waGUgR2lzcXVldCA8d29yZDEud29yZDJAZ21haWwuY29tPgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworLyoqCisgKiBHREkgRGV2aWNlIERlbXV4ZXIgY29udGV4dAorICovCitzdHJ1Y3QgZ2RpZ3JhYiB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7ICAgLyoqPCBDbGFzcyBmb3IgcHJpdmF0ZSBvcHRpb25zICovCisKKyAgICBpbnQgICAgICAgIGZyYW1lX3NpemU7ICAvKio8IFNpemUgaW4gYnl0ZXMgb2YgdGhlIGZyYW1lIHBpeGVsIGRhdGEgKi8KKyAgICBpbnQgICAgICAgIGhlYWRlcl9zaXplOyAvKio8IFNpemUgaW4gYnl0ZXMgb2YgdGhlIERJQiBoZWFkZXIgKi8KKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsgICAvKio8IFRpbWUgYmFzZSAqLworICAgIGludDY0X3QgICAgdGltZV9mcmFtZTsgIC8qKjwgQ3VycmVudCB0aW1lICovCisKKyAgICBpbnQgICAgICAgIGRyYXdfbW91c2U7ICAvKio8IERyYXcgbW91c2UgY3Vyc29yIChwcml2YXRlIG9wdGlvbikgKi8KKyAgICBpbnQgICAgICAgIHNob3dfcmVnaW9uOyAvKio8IERyYXcgYm9yZGVyIChwcml2YXRlIG9wdGlvbikgKi8KKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZTsgICAvKio8IENhcHR1cmUgZnJhbWVyYXRlIChwcml2YXRlIG9wdGlvbikgKi8KKyAgICBpbnQgICAgICAgIHdpZHRoOyAgICAgICAvKio8IFdpZHRoIG9mIHRoZSBncmFiIGZyYW1lIChwcml2YXRlIG9wdGlvbikgKi8KKyAgICBpbnQgICAgICAgIGhlaWdodDsgICAgICAvKio8IEhlaWdodCBvZiB0aGUgZ3JhYiBmcmFtZSAocHJpdmF0ZSBvcHRpb24pICovCisgICAgaW50ICAgICAgICBvZmZzZXRfeDsgICAgLyoqPCBDYXB0dXJlIHggb2Zmc2V0IChwcml2YXRlIG9wdGlvbikgKi8KKyAgICBpbnQgICAgICAgIG9mZnNldF95OyAgICAvKio8IENhcHR1cmUgeSBvZmZzZXQgKHByaXZhdGUgb3B0aW9uKSAqLworCisgICAgSFdORCAgICAgICBod25kOyAgICAgICAgLyoqPCBIYW5kbGUgb2YgdGhlIHdpbmRvdyBmb3IgdGhlIGdyYWIgKi8KKyAgICBIREMgICAgICAgIHNvdXJjZV9oZGM7ICAvKio8IFNvdXJjZSBkZXZpY2UgY29udGV4dCAqLworICAgIEhEQyAgICAgICAgZGVzdF9oZGM7ICAgIC8qKjwgRGVzdGluYXRpb24sIHNvdXJjZS1jb21wYXRpYmxlIERDICovCisgICAgQklUTUFQSU5GTyBibWk7ICAgICAgICAgLyoqPCBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIERJQiBmb3JtYXQgKi8KKyAgICBIQklUTUFQICAgIGhibXA7ICAgICAgICAvKio8IEluZm9ybWF0aW9uIG9uIHRoZSBiaXRtYXAgY2FwdHVyZWQgKi8KKyAgICB2b2lkICAgICAgKmJ1ZmZlcjsgICAgICAvKio8IFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgYml0bWFwIGltYWdlIGRhdGEgKi8KKyAgICBSRUNUICAgICAgIGNsaXBfcmVjdDsgICAvKio8IFRoZSBzdWJhcmVhIG9mIHRoZSBzY3JlZW4gb3Igd2luZG93IHRvIGNsaXAgKi8KKworICAgIEhXTkQgICAgICAgcmVnaW9uX2h3bmQ7IC8qKjwgSGFuZGxlIG9mIHRoZSByZWdpb24gYm9yZGVyIHdpbmRvdyAqLworCisgICAgaW50IGN1cnNvcl9lcnJvcl9wcmludGVkOworfTsKKworI2RlZmluZSBXSU4zMl9BUElfRVJST1Ioc3RyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCBzdHIgIiAoZXJyb3IgJWxpKVxuIiwgR2V0TGFzdEVycm9yKCkpCisKKyNkZWZpbmUgUkVHSU9OX1dORF9CT1JERVIgMworCisvKioKKyAqIENhbGxiYWNrIHRvIGhhbmRsZSBXaW5kb3dzIG1lc3NhZ2VzIGZvciB0aGUgcmVnaW9uIG91dGxpbmUgd2luZG93LgorICoKKyAqIEluIHBhcnRpY3VsYXIsIHRoaXMgaGFuZGxlcyBwYWludGluZyB0aGUgZnJhbWUgcmVjdGFuZ2xlLgorICoKKyAqIEBwYXJhbSBod25kIFRoZSByZWdpb24gb3V0bGluZSB3aW5kb3cgaGFuZGxlLgorICogQHBhcmFtIG1zZyBUaGUgV2luZG93cyBtZXNzYWdlLgorICogQHBhcmFtIHdwYXJhbSBGaXJzdCBXaW5kb3dzIG1lc3NhZ2UgcGFyYW1ldGVyLgorICogQHBhcmFtIGxwYXJhbSBTZWNvbmQgV2luZG93cyBtZXNzYWdlIHBhcmFtZXRlci4KKyAqIEByZXR1cm4gMCBzdWNjZXNzLCAhMCBmYWlsdXJlCisgKi8KK3N0YXRpYyBMUkVTVUxUIENBTExCQUNLCitnZGlncmFiX3JlZ2lvbl93bmRfcHJvYyhIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd3BhcmFtLCBMUEFSQU0gbHBhcmFtKQoreworICAgIFBBSU5UU1RSVUNUIHBzOworICAgIEhEQyBoZGM7CisgICAgUkVDVCByZWN0OworCisgICAgc3dpdGNoIChtc2cpIHsKKyAgICBjYXNlIFdNX1BBSU5UOgorICAgICAgICBoZGMgPSBCZWdpblBhaW50KGh3bmQsICZwcyk7CisKKyAgICAgICAgR2V0Q2xpZW50UmVjdChod25kLCAmcmVjdCk7CisgICAgICAgIEZyYW1lUmVjdChoZGMsICZyZWN0LCBHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCkpOworCisgICAgICAgIHJlY3QubGVmdCsrOyByZWN0LnRvcCsrOyByZWN0LnJpZ2h0LS07IHJlY3QuYm90dG9tLS07CisgICAgICAgIEZyYW1lUmVjdChoZGMsICZyZWN0LCBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCkpOworCisgICAgICAgIHJlY3QubGVmdCsrOyByZWN0LnRvcCsrOyByZWN0LnJpZ2h0LS07IHJlY3QuYm90dG9tLS07CisgICAgICAgIEZyYW1lUmVjdChoZGMsICZyZWN0LCBHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCkpOworCisgICAgICAgIEVuZFBhaW50KGh3bmQsICZwcyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIG1zZywgd3BhcmFtLCBscGFyYW0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBJbml0aWFsaXplIHRoZSByZWdpb24gb3V0bGluZSB3aW5kb3cuCisgKgorICogQHBhcmFtIHMxIFRoZSBmb3JtYXQgY29udGV4dC4KKyAqIEBwYXJhbSBnZGlncmFiIGdkaWdyYWIgY29udGV4dC4KKyAqIEByZXR1cm4gMCBzdWNjZXNzLCAhMCBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK2dkaWdyYWJfcmVnaW9uX3duZF9pbml0KEFWRm9ybWF0Q29udGV4dCAqczEsIHN0cnVjdCBnZGlncmFiICpnZGlncmFiKQoreworICAgIEhXTkQgaHduZDsKKyAgICBSRUNUIHJlY3QgPSBnZGlncmFiLT5jbGlwX3JlY3Q7CisgICAgSFJHTiByZWdpb24gPSBOVUxMOworICAgIEhSR04gcmVnaW9uX2ludGVyaW9yID0gTlVMTDsKKworICAgIERXT1JEIHN0eWxlID0gV1NfUE9QVVAgfCBXU19WSVNJQkxFOworICAgIERXT1JEIGV4ID0gV1NfRVhfVE9PTFdJTkRPVyB8IFdTX0VYX1RPUE1PU1QgfCBXU19FWF9UUkFOU1BBUkVOVDsKKworICAgIHJlY3QubGVmdCAtPSBSRUdJT05fV05EX0JPUkRFUjsgcmVjdC50b3AgLT0gUkVHSU9OX1dORF9CT1JERVI7CisgICAgcmVjdC5yaWdodCArPSBSRUdJT05fV05EX0JPUkRFUjsgcmVjdC5ib3R0b20gKz0gUkVHSU9OX1dORF9CT1JERVI7CisKKyAgICBBZGp1c3RXaW5kb3dSZWN0RXgoJnJlY3QsIHN0eWxlLCBGQUxTRSwgZXgpOworCisgICAgLy8gQ3JlYXRlIGEgd2luZG93IHdpdGggbm8gb3duZXI7IHVzZSBXQ19ESUFMT0cgaW5zdGVhZCBvZiB3cml0aW5nIGEgY3VzdG9tCisgICAgLy8gd2luZG93IGNsYXNzCisgICAgaHduZCA9IENyZWF0ZVdpbmRvd0V4KGV4LCBXQ19ESUFMT0csIE5VTEwsIHN0eWxlLCByZWN0LmxlZnQsIHJlY3QudG9wLAorICAgICAgICAgICAgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwgcmVjdC5ib3R0b20gLSByZWN0LnRvcCwKKyAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGlmICghaHduZCkgeworICAgICAgICBXSU4zMl9BUElfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgcmVnaW9uIGRpc3BsYXkgd2luZG93Iik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gU2V0IHRoZSB3aW5kb3cgc2hhcGUgdG8gb25seSBpbmNsdWRlIHRoZSBib3JkZXIgYXJlYQorICAgIEdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOworICAgIHJlZ2lvbiA9IENyZWF0ZVJlY3RSZ24oMCwgMCwKKyAgICAgICAgICAgIHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHJlY3QuYm90dG9tIC0gcmVjdC50b3ApOworICAgIHJlZ2lvbl9pbnRlcmlvciA9IENyZWF0ZVJlY3RSZ24oUkVHSU9OX1dORF9CT1JERVIsIFJFR0lPTl9XTkRfQk9SREVSLAorICAgICAgICAgICAgcmVjdC5yaWdodCAtIHJlY3QubGVmdCAtIFJFR0lPTl9XTkRfQk9SREVSLAorICAgICAgICAgICAgcmVjdC5ib3R0b20gLSByZWN0LnRvcCAtIFJFR0lPTl9XTkRfQk9SREVSKTsKKyAgICBDb21iaW5lUmduKHJlZ2lvbiwgcmVnaW9uLCByZWdpb25faW50ZXJpb3IsIFJHTl9ESUZGKTsKKyAgICBpZiAoIVNldFdpbmRvd1Jnbihod25kLCByZWdpb24sIEZBTFNFKSkgeworICAgICAgICBXSU4zMl9BUElfRVJST1IoIkNvdWxkIG5vdCBzZXQgd2luZG93IHJlZ2lvbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICAvLyBUaGUgInJlZ2lvbiIgbWVtb3J5IGlzIG5vdyBvd25lZCBieSB0aGUgd2luZG93CisgICAgcmVnaW9uID0gTlVMTDsKKyAgICBEZWxldGVPYmplY3QocmVnaW9uX2ludGVyaW9yKTsKKworICAgIFNldFdpbmRvd0xvbmdQdHIoaHduZCwgR1dMUF9XTkRQUk9DLCAoTE9OR19QVFIpIGdkaWdyYWJfcmVnaW9uX3duZF9wcm9jKTsKKworICAgIFNob3dXaW5kb3coaHduZCwgU1dfU0hPVyk7CisKKyAgICBnZGlncmFiLT5yZWdpb25faHduZCA9IGh3bmQ7CisKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgaWYgKHJlZ2lvbikKKyAgICAgICAgRGVsZXRlT2JqZWN0KHJlZ2lvbik7CisgICAgaWYgKHJlZ2lvbl9pbnRlcmlvcikKKyAgICAgICAgRGVsZXRlT2JqZWN0KHJlZ2lvbl9pbnRlcmlvcik7CisgICAgaWYgKGh3bmQpCisgICAgICAgIERlc3Ryb3lXaW5kb3coaHduZCk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ2xlYW51cC9mcmVlIHRoZSByZWdpb24gb3V0bGluZSB3aW5kb3cuCisgKgorICogQHBhcmFtIHMxIFRoZSBmb3JtYXQgY29udGV4dC4KKyAqIEBwYXJhbSBnZGlncmFiIGdkaWdyYWIgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQKK2dkaWdyYWJfcmVnaW9uX3duZF9kZXN0cm95KEFWRm9ybWF0Q29udGV4dCAqczEsIHN0cnVjdCBnZGlncmFiICpnZGlncmFiKQoreworICAgIGlmIChnZGlncmFiLT5yZWdpb25faHduZCkKKyAgICAgICAgRGVzdHJveVdpbmRvdyhnZGlncmFiLT5yZWdpb25faHduZCk7CisgICAgZ2RpZ3JhYi0+cmVnaW9uX2h3bmQgPSBOVUxMOworfQorCisvKioKKyAqIFByb2Nlc3MgdGhlIFdpbmRvd3MgbWVzc2FnZSBxdWV1ZS4KKyAqCisgKiBUaGlzIGlzIGltcG9ydGFudCB0byBwcmV2ZW50IFdpbmRvd3MgZnJvbSB0aGlua2luZyB0aGUgd2luZG93IGhhcyBiZWNvbWUKKyAqIHVucmVzcG9uc2l2ZS4gQXMgd2VsbCwgdGhpbmdzIGxpa2UgV01fUEFJTlQgKHRvIGFjdHVhbGx5IGRyYXcgdGhlIHdpbmRvdworICogY29udGVudHMpIGFyZSBoYW5kbGVkIGZyb20gdGhlIG1lc3NhZ2UgcXVldWUgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gczEgVGhlIGZvcm1hdCBjb250ZXh0LgorICogQHBhcmFtIGdkaWdyYWIgZ2RpZ3JhYiBjb250ZXh0LgorICovCitzdGF0aWMgdm9pZAorZ2RpZ3JhYl9yZWdpb25fd25kX3VwZGF0ZShBVkZvcm1hdENvbnRleHQgKnMxLCBzdHJ1Y3QgZ2RpZ3JhYiAqZ2RpZ3JhYikKK3sKKyAgICBIV05EIGh3bmQgPSBnZGlncmFiLT5yZWdpb25faHduZDsKKyAgICBNU0cgbXNnOworCisgICAgd2hpbGUgKFBlZWtNZXNzYWdlKCZtc2csIGh3bmQsIDAsIDAsIFBNX1JFTU9WRSkpIHsKKyAgICAgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworICAgIH0KK30KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgZ2RpIGdyYWIgZGV2aWNlIGRlbXV4ZXIgKHB1YmxpYyBkZXZpY2UgZGVtdXhlciBBUEkpLgorICoKKyAqIEBwYXJhbSBzMSBDb250ZXh0IGZyb20gYXZmb3JtYXQgY29yZQorICogQHJldHVybiBBVkVSUk9SX0lPIGVycm9yLCAwIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorZ2RpZ3JhYl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMxKQoreworICAgIHN0cnVjdCBnZGlncmFiICpnZGlncmFiID0gczEtPnByaXZfZGF0YTsKKworICAgIEhXTkQgaHduZDsKKyAgICBIREMgc291cmNlX2hkYyA9IE5VTEw7CisgICAgSERDIGRlc3RfaGRjICAgPSBOVUxMOworICAgIEJJVE1BUElORk8gYm1pOworICAgIEhCSVRNQVAgaGJtcCAgID0gTlVMTDsKKyAgICB2b2lkICpidWZmZXIgICA9IE5VTEw7CisKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IHMxLT5maWxlbmFtZTsKKyAgICBjb25zdCBjaGFyICpuYW1lICAgICA9IE5VTEw7CisgICAgQVZTdHJlYW0gICAqc3QgICAgICAgPSBOVUxMOworCisgICAgaW50IGJwcDsKKyAgICBSRUNUIHZpcnR1YWxfcmVjdDsKKyAgICBSRUNUIGNsaXBfcmVjdDsKKyAgICBCSVRNQVAgYm1wOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIXN0cm5jbXAoZmlsZW5hbWUsICJ0aXRsZT0iLCA2KSkgeworICAgICAgICBuYW1lID0gZmlsZW5hbWUgKyA2OworICAgICAgICBod25kID0gRmluZFdpbmRvdyhOVUxMLCBuYW1lKTsKKyAgICAgICAgaWYgKCFod25kKSB7CisgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZmluZCB3aW5kb3cgJyVzJywgYWJvcnRpbmcuXG4iLCBuYW1lKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdkaWdyYWItPnNob3dfcmVnaW9uKSB7CisgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2hvdyByZWdpb24gd2hlbiBncmFiYmluZyBhIHdpbmRvdy5cbiIpOworICAgICAgICAgICAgZ2RpZ3JhYi0+c2hvd19yZWdpb24gPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGZpbGVuYW1lLCAiZGVza3RvcCIpKSB7CisgICAgICAgIGh3bmQgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlBsZWFzZSB1c2UgXCJkZXNrdG9wXCIgb3IgXCJ0aXRsZT08d2luZG93bmFtZT5cIiB0byBzcGVjaWZ5IHlvdXIgdGFyZ2V0LlxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoaHduZCkgeworICAgICAgICBHZXRDbGllbnRSZWN0KGh3bmQsICZ2aXJ0dWFsX3JlY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZpcnR1YWxfcmVjdC5sZWZ0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9YVklSVFVBTFNDUkVFTik7CisgICAgICAgIHZpcnR1YWxfcmVjdC50b3AgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX1lWSVJUVUFMU0NSRUVOKTsKKyAgICAgICAgdmlydHVhbF9yZWN0LnJpZ2h0ID0gdmlydHVhbF9yZWN0LmxlZnQgKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYVklSVFVBTFNDUkVFTik7CisgICAgICAgIHZpcnR1YWxfcmVjdC5ib3R0b20gPSB2aXJ0dWFsX3JlY3QudG9wICsgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVZJUlRVQUxTQ1JFRU4pOworICAgIH0KKworICAgIC8qIElmIG5vIHdpZHRoIG9yIGhlaWdodCBzZXQsIHVzZSBmdWxsIHNjcmVlbi93aW5kb3cgYXJlYSAqLworICAgIGlmICghZ2RpZ3JhYi0+d2lkdGggfHwgIWdkaWdyYWItPmhlaWdodCkgeworICAgICAgICBjbGlwX3JlY3QubGVmdCA9IHZpcnR1YWxfcmVjdC5sZWZ0OworICAgICAgICBjbGlwX3JlY3QudG9wID0gdmlydHVhbF9yZWN0LnRvcDsKKyAgICAgICAgY2xpcF9yZWN0LnJpZ2h0ID0gdmlydHVhbF9yZWN0LnJpZ2h0OworICAgICAgICBjbGlwX3JlY3QuYm90dG9tID0gdmlydHVhbF9yZWN0LmJvdHRvbTsKKyAgICB9IGVsc2UgeworICAgICAgICBjbGlwX3JlY3QubGVmdCA9IGdkaWdyYWItPm9mZnNldF94OworICAgICAgICBjbGlwX3JlY3QudG9wID0gZ2RpZ3JhYi0+b2Zmc2V0X3k7CisgICAgICAgIGNsaXBfcmVjdC5yaWdodCA9IGdkaWdyYWItPndpZHRoICsgZ2RpZ3JhYi0+b2Zmc2V0X3g7CisgICAgICAgIGNsaXBfcmVjdC5ib3R0b20gPSBnZGlncmFiLT5oZWlnaHQgKyBnZGlncmFiLT5vZmZzZXRfeTsKKyAgICB9CisKKyAgICBpZiAoY2xpcF9yZWN0LmxlZnQgPCB2aXJ0dWFsX3JlY3QubGVmdCB8fAorICAgICAgICAgICAgY2xpcF9yZWN0LnRvcCA8IHZpcnR1YWxfcmVjdC50b3AgfHwKKyAgICAgICAgICAgIGNsaXBfcmVjdC5yaWdodCA+IHZpcnR1YWxfcmVjdC5yaWdodCB8fAorICAgICAgICAgICAgY2xpcF9yZWN0LmJvdHRvbSA+IHZpcnR1YWxfcmVjdC5ib3R0b20pIHsKKyAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiQ2FwdHVyZSBhcmVhICglbGksJWxpKSwoJWxpLCVsaSkgZXh0ZW5kcyBvdXRzaWRlIHdpbmRvdyBhcmVhICglbGksJWxpKSwoJWxpLCVsaSkiLAorICAgICAgICAgICAgICAgICAgICBjbGlwX3JlY3QubGVmdCwgY2xpcF9yZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgY2xpcF9yZWN0LnJpZ2h0LCBjbGlwX3JlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsX3JlY3QubGVmdCwgdmlydHVhbF9yZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgdmlydHVhbF9yZWN0LnJpZ2h0LCB2aXJ0dWFsX3JlY3QuYm90dG9tKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogVGhpcyB3aWxsIGdldCB0aGUgZGV2aWNlIGNvbnRleHQgZm9yIHRoZSBzZWxlY3RlZCB3aW5kb3csIG9yIGlmCisgICAgICogbm9uZSwgdGhlIHByaW1hcnkgc2NyZWVuICovCisgICAgc291cmNlX2hkYyA9IEdldERDKGh3bmQpOworICAgIGlmICghc291cmNlX2hkYykgeworICAgICAgICBXSU4zMl9BUElfRVJST1IoIkNvdWxkbid0IGdldCB3aW5kb3cgZGV2aWNlIGNvbnRleHQiKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBicHAgPSBHZXREZXZpY2VDYXBzKHNvdXJjZV9oZGMsIEJJVFNQSVhFTCk7CisKKyAgICBpZiAobmFtZSkgeworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgIkZvdW5kIHdpbmRvdyAlcywgY2FwdHVyaW5nICVsaXglbGl4JWkgYXQgKCVsaSwlbGkpXG4iLAorICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgIGNsaXBfcmVjdC5yaWdodCAtIGNsaXBfcmVjdC5sZWZ0LAorICAgICAgICAgICAgICAgY2xpcF9yZWN0LmJvdHRvbSAtIGNsaXBfcmVjdC50b3AsCisgICAgICAgICAgICAgICBicHAsIGNsaXBfcmVjdC5sZWZ0LCBjbGlwX3JlY3QudG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgIkNhcHR1cmluZyB3aG9sZSBkZXNrdG9wIGFzICVsaXglbGl4JWkgYXQgKCVsaSwlbGkpXG4iLAorICAgICAgICAgICAgICAgY2xpcF9yZWN0LnJpZ2h0IC0gY2xpcF9yZWN0LmxlZnQsCisgICAgICAgICAgICAgICBjbGlwX3JlY3QuYm90dG9tIC0gY2xpcF9yZWN0LnRvcCwKKyAgICAgICAgICAgICAgIGJwcCwgY2xpcF9yZWN0LmxlZnQsIGNsaXBfcmVjdC50b3ApOworICAgIH0KKworICAgIGlmIChjbGlwX3JlY3QucmlnaHQgLSBjbGlwX3JlY3QubGVmdCA8PSAwIHx8CisgICAgICAgICAgICBjbGlwX3JlY3QuYm90dG9tIC0gY2xpcF9yZWN0LnRvcCA8PSAwIHx8IGJwcCU4KSB7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwcm9wZXJ0aWVzLCBhYm9ydGluZ1xuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBkZXN0X2hkYyA9IENyZWF0ZUNvbXBhdGlibGVEQyhzb3VyY2VfaGRjKTsKKyAgICBpZiAoIWRlc3RfaGRjKSB7CisgICAgICAgIFdJTjMyX0FQSV9FUlJPUigiU2NyZWVuIERDIENyZWF0ZUNvbXBhdGlibGVEQyIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogQ3JlYXRlIGEgRElCIGFuZCBzZWxlY3QgaXQgaW50byB0aGUgZGVzdF9oZGMgKi8KKyAgICBibWkuYm1pSGVhZGVyLmJpU2l6ZSAgICAgICAgICA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICBibWkuYm1pSGVhZGVyLmJpV2lkdGggICAgICAgICA9IGNsaXBfcmVjdC5yaWdodCAtIGNsaXBfcmVjdC5sZWZ0OworICAgIGJtaS5ibWlIZWFkZXIuYmlIZWlnaHQgICAgICAgID0gLShjbGlwX3JlY3QuYm90dG9tIC0gY2xpcF9yZWN0LnRvcCk7CisgICAgYm1pLmJtaUhlYWRlci5iaVBsYW5lcyAgICAgICAgPSAxOworICAgIGJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCAgICAgID0gYnBwOworICAgIGJtaS5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiAgID0gQklfUkdCOworICAgIGJtaS5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgICAgID0gMDsKKyAgICBibWkuYm1pSGVhZGVyLmJpWFBlbHNQZXJNZXRlciA9IDA7CisgICAgYm1pLmJtaUhlYWRlci5iaVlQZWxzUGVyTWV0ZXIgPSAwOworICAgIGJtaS5ibWlIZWFkZXIuYmlDbHJVc2VkICAgICAgID0gMDsKKyAgICBibWkuYm1pSGVhZGVyLmJpQ2xySW1wb3J0YW50ICA9IDA7CisgICAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oZGVzdF9oZGMsICZibWksIERJQl9SR0JfQ09MT1JTLAorICAgICAgICAgICAgJmJ1ZmZlciwgTlVMTCwgMCk7CisgICAgaWYgKCFoYm1wKSB7CisgICAgICAgIFdJTjMyX0FQSV9FUlJPUigiQ3JlYXRpbmcgRElCIFNlY3Rpb24iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmICghU2VsZWN0T2JqZWN0KGRlc3RfaGRjLCBoYm1wKSkgeworICAgICAgICBXSU4zMl9BUElfRVJST1IoIlNlbGVjdE9iamVjdCIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogR2V0IGluZm8gZnJvbSB0aGUgYml0bWFwICovCisgICAgR2V0T2JqZWN0KGhibXAsIHNpemVvZihCSVRNQVApLCAmYm1wKTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzMSwgTlVMTCk7CisgICAgaWYgKCFzdCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsgLyogNjQgYml0cyBwdHMgaW4gdXMgKi8KKworICAgIGdkaWdyYWItPmZyYW1lX3NpemUgID0gYm1wLmJtV2lkdGhCeXRlcyAqIGJtcC5ibUhlaWdodCAqIGJtcC5ibVBsYW5lczsKKyAgICBnZGlncmFiLT5oZWFkZXJfc2l6ZSA9IHNpemVvZihCSVRNQVBGSUxFSEVBREVSKSArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnBwIDw9IDggPyAoMSA8PCBicHApIDogMCkgKiBzaXplb2YoUkdCUVVBRCkgLyogcGFsZXR0ZSBzaXplICovOworICAgIGdkaWdyYWItPnRpbWVfYmFzZSAgID0gYXZfaW52X3EoZ2RpZ3JhYi0+ZnJhbWVyYXRlKTsKKyAgICBnZGlncmFiLT50aW1lX2ZyYW1lICA9IGF2X2dldHRpbWUoKSAvIGF2X3EyZChnZGlncmFiLT50aW1lX2Jhc2UpOworCisgICAgZ2RpZ3JhYi0+aHduZCAgICAgICA9IGh3bmQ7CisgICAgZ2RpZ3JhYi0+c291cmNlX2hkYyA9IHNvdXJjZV9oZGM7CisgICAgZ2RpZ3JhYi0+ZGVzdF9oZGMgICA9IGRlc3RfaGRjOworICAgIGdkaWdyYWItPmhibXAgICAgICAgPSBoYm1wOworICAgIGdkaWdyYWItPmJtaSAgICAgICAgPSBibWk7CisgICAgZ2RpZ3JhYi0+YnVmZmVyICAgICA9IGJ1ZmZlcjsKKyAgICBnZGlncmFiLT5jbGlwX3JlY3QgID0gY2xpcF9yZWN0OworCisgICAgZ2RpZ3JhYi0+Y3Vyc29yX2Vycm9yX3ByaW50ZWQgPSAwOworCisgICAgaWYgKGdkaWdyYWItPnNob3dfcmVnaW9uKSB7CisgICAgICAgIGlmIChnZGlncmFiX3JlZ2lvbl93bmRfaW5pdChzMSwgZ2RpZ3JhYikpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQk1QOworICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlICA9IGdkaWdyYWItPnRpbWVfYmFzZTsKKyAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgPSAoZ2RpZ3JhYi0+aGVhZGVyX3NpemUgKyBnZGlncmFiLT5mcmFtZV9zaXplKSAqIDEvYXZfcTJkKGdkaWdyYWItPnRpbWVfYmFzZSkgKiA4OworCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIGlmIChzb3VyY2VfaGRjKQorICAgICAgICBSZWxlYXNlREMoaHduZCwgc291cmNlX2hkYyk7CisgICAgaWYgKGRlc3RfaGRjKQorICAgICAgICBEZWxldGVEQyhkZXN0X2hkYyk7CisgICAgaWYgKGhibXApCisgICAgICAgIERlbGV0ZU9iamVjdChoYm1wKTsKKyAgICBpZiAoc291cmNlX2hkYykKKyAgICAgICAgRGVsZXRlREMoc291cmNlX2hkYyk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBQYWludHMgYSBtb3VzZSBwb2ludGVyIGluIGEgV2luMzIgaW1hZ2UuCisgKgorICogQHBhcmFtIHMxIENvbnRleHQgb2YgdGhlIGxvZyBpbmZvcm1hdGlvbgorICogQHBhcmFtIHMgIEN1cnJlbnQgZ3JhZCBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgcGFpbnRfbW91c2VfcG9pbnRlcihBVkZvcm1hdENvbnRleHQgKnMxLCBzdHJ1Y3QgZ2RpZ3JhYiAqZ2RpZ3JhYikKK3sKKyAgICBDVVJTT1JJTkZPIGNpID0gezB9OworCisjZGVmaW5lIENVUlNPUl9FUlJPUihzdHIpICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFnZGlncmFiLT5jdXJzb3JfZXJyb3JfcHJpbnRlZCkgeyAgICAgICBcCisgICAgICAgIFdJTjMyX0FQSV9FUlJPUihzdHIpOyAgICAgICAgICAgICBcCisgICAgICAgIGdkaWdyYWItPmN1cnNvcl9lcnJvcl9wcmludGVkID0gMTsgICAgICBcCisgICAgfQorCisgICAgY2kuY2JTaXplID0gc2l6ZW9mKGNpKTsKKworICAgIGlmIChHZXRDdXJzb3JJbmZvKCZjaSkpIHsKKyAgICAgICAgSENVUlNPUiBpY29uID0gQ29weUN1cnNvcihjaS5oQ3Vyc29yKTsKKyAgICAgICAgSUNPTklORk8gaW5mbzsKKyAgICAgICAgUE9JTlQgcG9zOworICAgICAgICBSRUNUIGNsaXBfcmVjdCA9IGdkaWdyYWItPmNsaXBfcmVjdDsKKyAgICAgICAgSFdORCBod25kID0gZ2RpZ3JhYi0+aHduZDsKKyAgICAgICAgaW5mby5oYm1NYXNrID0gTlVMTDsKKyAgICAgICAgaW5mby5oYm1Db2xvciA9IE5VTEw7CisKKyAgICAgICAgaWYgKGNpLmZsYWdzICE9IENVUlNPUl9TSE9XSU5HKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICghaWNvbikgeworICAgICAgICAgICAgLyogVXNlIHRoZSBzdGFuZGFyZCBhcnJvdyBjdXJzb3IgYXMgYSBmYWxsYmFjay4KKyAgICAgICAgICAgICAqIFlvdSdsbCBwcm9iYWJseSBvbmx5IGhpdCB0aGlzIGluIFdpbmUsIHdoaWNoIGNhbid0IGZldGNoCisgICAgICAgICAgICAgKiB0aGUgY3VycmVudCBzeXN0ZW0gY3Vyc29yLiAqLworICAgICAgICAgICAgaWNvbiA9IENvcHlDdXJzb3IoTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghR2V0SWNvbkluZm8oaWNvbiwgJmluZm8pKSB7CisgICAgICAgICAgICBDVVJTT1JfRVJST1IoIkNvdWxkIG5vdCBnZXQgaWNvbiBpbmZvIik7CisgICAgICAgICAgICBnb3RvIGljb25fZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBwb3MueCA9IGNpLnB0U2NyZWVuUG9zLnggLSBjbGlwX3JlY3QubGVmdCAtIGluZm8ueEhvdHNwb3Q7CisgICAgICAgIHBvcy55ID0gY2kucHRTY3JlZW5Qb3MueSAtIGNsaXBfcmVjdC50b3AgLSBpbmZvLnlIb3RzcG90OworCisgICAgICAgIGlmIChod25kKSB7CisgICAgICAgICAgICBSRUNUIHJlY3Q7CisKKyAgICAgICAgICAgIGlmIChHZXRXaW5kb3dSZWN0KGh3bmQsICZyZWN0KSkgeworICAgICAgICAgICAgICAgIHBvcy54IC09IHJlY3QubGVmdDsKKyAgICAgICAgICAgICAgICBwb3MueSAtPSByZWN0LnRvcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ1VSU09SX0VSUk9SKCJDb3VsZG4ndCBnZXQgd2luZG93IHJlY3RhbmdsZSIpOworICAgICAgICAgICAgICAgIGdvdG8gaWNvbl9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0RFQlVHLCAiQ3Vyc29yIHBvcyAoJWxpLCVsaSkgLT4gKCVsaSwlbGkpXG4iLAorICAgICAgICAgICAgICAgIGNpLnB0U2NyZWVuUG9zLngsIGNpLnB0U2NyZWVuUG9zLnksIHBvcy54LCBwb3MueSk7CisKKyAgICAgICAgaWYgKHBvcy54ID49IDAgJiYgcG9zLnggPD0gY2xpcF9yZWN0LnJpZ2h0IC0gY2xpcF9yZWN0LmxlZnQgJiYKKyAgICAgICAgICAgICAgICBwb3MueSA+PSAwICYmIHBvcy55IDw9IGNsaXBfcmVjdC5ib3R0b20gLSBjbGlwX3JlY3QudG9wKSB7CisgICAgICAgICAgICBpZiAoIURyYXdJY29uKGdkaWdyYWItPmRlc3RfaGRjLCBwb3MueCwgcG9zLnksIGljb24pKQorICAgICAgICAgICAgICAgIENVUlNPUl9FUlJPUigiQ291bGRuJ3QgZHJhdyBpY29uIik7CisgICAgICAgIH0KKworaWNvbl9lcnJvcjoKKyAgICAgICAgaWYgKGluZm8uaGJtTWFzaykKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdChpbmZvLmhibU1hc2spOworICAgICAgICBpZiAoaW5mby5oYm1Db2xvcikKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdChpbmZvLmhibUNvbG9yKTsKKyAgICAgICAgaWYgKGljb24pCisgICAgICAgICAgICBEZXN0cm95Q3Vyc29yKGljb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIENVUlNPUl9FUlJPUigiQ291bGRuJ3QgZ2V0IGN1cnNvciBpbmZvIik7CisgICAgfQorfQorCisvKioKKyAqIEdyYWJzIGEgZnJhbWUgZnJvbSBnZGkgKHB1YmxpYyBkZXZpY2UgZGVtdXhlciBBUEkpLgorICoKKyAqIEBwYXJhbSBzMSBDb250ZXh0IGZyb20gYXZmb3JtYXQgY29yZQorICogQHBhcmFtIHBrdCBQYWNrZXQgaG9sZGluZyB0aGUgZ3JhYmJlZCBmcmFtZQorICogQHJldHVybiBmcmFtZSBzaXplIGluIGJ5dGVzCisgKi8KK3N0YXRpYyBpbnQgZ2RpZ3JhYl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMxLCBBVlBhY2tldCAqcGt0KQoreworICAgIHN0cnVjdCBnZGlncmFiICpnZGlncmFiID0gczEtPnByaXZfZGF0YTsKKworICAgIEhEQyAgICAgICAgZGVzdF9oZGMgICA9IGdkaWdyYWItPmRlc3RfaGRjOworICAgIEhEQyAgICAgICAgc291cmNlX2hkYyA9IGdkaWdyYWItPnNvdXJjZV9oZGM7CisgICAgUkVDVCAgICAgICBjbGlwX3JlY3QgID0gZ2RpZ3JhYi0+Y2xpcF9yZWN0OworICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlICA9IGdkaWdyYWItPnRpbWVfYmFzZTsKKyAgICBpbnQ2NF90ICAgIHRpbWVfZnJhbWUgPSBnZGlncmFiLT50aW1lX2ZyYW1lOworCisgICAgQklUTUFQRklMRUhFQURFUiBiZmg7CisgICAgaW50IGZpbGVfc2l6ZSA9IGdkaWdyYWItPmhlYWRlcl9zaXplICsgZ2RpZ3JhYi0+ZnJhbWVfc2l6ZTsKKworICAgIGludDY0X3QgY3VydGltZSwgZGVsYXk7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHRpbWUgb2YgdGhlIG5leHQgZnJhbWUgKi8KKyAgICB0aW1lX2ZyYW1lICs9IElOVDY0X0MoMTAwMDAwMCk7CisKKyAgICAvKiBSdW4gV2luZG93IG1lc3NhZ2UgcHJvY2Vzc2luZyBxdWV1ZSAqLworICAgIGlmIChnZGlncmFiLT5zaG93X3JlZ2lvbikKKyAgICAgICAgZ2RpZ3JhYl9yZWdpb25fd25kX3VwZGF0ZShzMSwgZ2RpZ3JhYik7CisKKyAgICAvKiB3YWl0IGJhc2VkIG9uIHRoZSBmcmFtZSByYXRlICovCisgICAgZm9yICg7OykgeworICAgICAgICBjdXJ0aW1lID0gYXZfZ2V0dGltZSgpOworICAgICAgICBkZWxheSA9IHRpbWVfZnJhbWUgKiBhdl9xMmQodGltZV9iYXNlKSAtIGN1cnRpbWU7CisgICAgICAgIGlmIChkZWxheSA8PSAwKSB7CisgICAgICAgICAgICBpZiAoZGVsYXkgPCBJTlQ2NF9DKC0xMDAwMDAwKSAqIGF2X3EyZCh0aW1lX2Jhc2UpKSB7CisgICAgICAgICAgICAgICAgdGltZV9mcmFtZSArPSBJTlQ2NF9DKDEwMDAwMDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMxLT5mbGFncyAmIEFWRk1UX0ZMQUdfTk9OQkxPQ0spIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl91c2xlZXAoZGVsYXkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBmaWxlX3NpemUpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBwa3QtPnB0cyA9IGN1cnRpbWU7CisKKyAgICAvKiBCbGl0IHNjcmVlbiBncmFiICovCisgICAgaWYgKCFCaXRCbHQoZGVzdF9oZGMsIDAsIDAsCisgICAgICAgICAgICAgICAgY2xpcF9yZWN0LnJpZ2h0IC0gY2xpcF9yZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgY2xpcF9yZWN0LmJvdHRvbSAtIGNsaXBfcmVjdC50b3AsCisgICAgICAgICAgICAgICAgc291cmNlX2hkYywKKyAgICAgICAgICAgICAgICBjbGlwX3JlY3QubGVmdCwgY2xpcF9yZWN0LnRvcCwgU1JDQ09QWSB8IENBUFRVUkVCTFQpKSB7CisgICAgICAgIFdJTjMyX0FQSV9FUlJPUigiRmFpbGVkIHRvIGNhcHR1cmUgaW1hZ2UiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgaWYgKGdkaWdyYWItPmRyYXdfbW91c2UpCisgICAgICAgIHBhaW50X21vdXNlX3BvaW50ZXIoczEsIGdkaWdyYWIpOworCisgICAgLyogQ29weSBiaXRzIHRvIHBhY2tldCBkYXRhICovCisKKyAgICBiZmguYmZUeXBlID0gMHg0ZDQyOyAvKiAiQk0iIGluIGxpdHRsZS1lbmRpYW4gKi8KKyAgICBiZmguYmZTaXplID0gZmlsZV9zaXplOworICAgIGJmaC5iZlJlc2VydmVkMSA9IDA7CisgICAgYmZoLmJmUmVzZXJ2ZWQyID0gMDsKKyAgICBiZmguYmZPZmZCaXRzID0gZ2RpZ3JhYi0+aGVhZGVyX3NpemU7CisKKyAgICBtZW1jcHkocGt0LT5kYXRhLCAmYmZoLCBzaXplb2YoYmZoKSk7CisKKyAgICBtZW1jcHkocGt0LT5kYXRhICsgc2l6ZW9mKGJmaCksICZnZGlncmFiLT5ibWkuYm1pSGVhZGVyLCBzaXplb2YoZ2RpZ3JhYi0+Ym1pLmJtaUhlYWRlcikpOworCisgICAgaWYgKGdkaWdyYWItPmJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCA8PSA4KQorICAgICAgICBHZXRESUJDb2xvclRhYmxlKGRlc3RfaGRjLCAwLCAxIDw8IGdkaWdyYWItPmJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCwKKyAgICAgICAgICAgICAgICAoUkdCUVVBRCAqKSAocGt0LT5kYXRhICsgc2l6ZW9mKGJmaCkgKyBzaXplb2YoZ2RpZ3JhYi0+Ym1pLmJtaUhlYWRlcikpKTsKKworICAgIG1lbWNweShwa3QtPmRhdGEgKyBnZGlncmFiLT5oZWFkZXJfc2l6ZSwgZ2RpZ3JhYi0+YnVmZmVyLCBnZGlncmFiLT5mcmFtZV9zaXplKTsKKworICAgIGdkaWdyYWItPnRpbWVfZnJhbWUgPSB0aW1lX2ZyYW1lOworCisgICAgcmV0dXJuIGdkaWdyYWItPmhlYWRlcl9zaXplICsgZ2RpZ3JhYi0+ZnJhbWVfc2l6ZTsKK30KKworLyoqCisgKiBDbG9zZXMgZ2RpIGZyYW1lIGdyYWJiZXIgKHB1YmxpYyBkZXZpY2UgZGVtdXhlciBBUEkpLgorICoKKyAqIEBwYXJhbSBzMSBDb250ZXh0IGZyb20gYXZmb3JtYXQgY29yZQorICogQHJldHVybiAwIHN1Y2Nlc3MsICEwIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBnZGlncmFiX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzMSkKK3sKKyAgICBzdHJ1Y3QgZ2RpZ3JhYiAqcyA9IHMxLT5wcml2X2RhdGE7CisKKyAgICBpZiAocy0+c2hvd19yZWdpb24pCisgICAgICAgIGdkaWdyYWJfcmVnaW9uX3duZF9kZXN0cm95KHMxLCBzKTsKKworICAgIGlmIChzLT5zb3VyY2VfaGRjKQorICAgICAgICBSZWxlYXNlREMocy0+aHduZCwgcy0+c291cmNlX2hkYyk7CisgICAgaWYgKHMtPmRlc3RfaGRjKQorICAgICAgICBEZWxldGVEQyhzLT5kZXN0X2hkYyk7CisgICAgaWYgKHMtPmhibXApCisgICAgICAgIERlbGV0ZU9iamVjdChzLT5oYm1wKTsKKyAgICBpZiAocy0+c291cmNlX2hkYykKKyAgICAgICAgRGVsZXRlREMocy0+c291cmNlX2hkYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2Yoc3RydWN0IGdkaWdyYWIsIHgpCisjZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJkcmF3X21vdXNlIiwgImRyYXcgdGhlIG1vdXNlIHBvaW50ZXIiLCBPRkZTRVQoZHJhd19tb3VzZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgMCwgMSwgREVDIH0sCisgICAgeyAic2hvd19yZWdpb24iLCAiZHJhdyBib3JkZXIgYXJvdW5kIGNhcHR1cmUgYXJlYSIsIE9GRlNFVChzaG93X3JlZ2lvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMSwgREVDIH0sCisgICAgeyAiZnJhbWVyYXRlIiwgInNldCB2aWRlbyBmcmFtZSByYXRlIiwgT0ZGU0VUKGZyYW1lcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIm50c2MifSwgMCwgMCwgREVDIH0sCisgICAgeyAidmlkZW9fc2l6ZSIsICJzZXQgdmlkZW8gZnJhbWUgc2l6ZSIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyID0gTlVMTH0sIDAsIDAsIERFQyB9LAorICAgIHsgIm9mZnNldF94IiwgImNhcHR1cmUgYXJlYSB4IG9mZnNldCIsIE9GRlNFVChvZmZzZXRfeCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgSU5UX01JTiwgSU5UX01BWCwgREVDIH0sCisgICAgeyAib2Zmc2V0X3kiLCAiY2FwdHVyZSBhcmVhIHkgb2Zmc2V0IiwgT0ZGU0VUKG9mZnNldF95KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCBJTlRfTUlOLCBJTlRfTUFYLCBERUMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGdkaWdyYWJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiR0RJZ3JhYiBpbmRldiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCisvKiogZ2RpIGdyYWJiZXIgZGV2aWNlIGRlbXV4ZXIgZGVjbGFyYXRpb24gKi8KK0FWSW5wdXRGb3JtYXQgZmZfZ2RpZ3JhYl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJnZGlncmFiIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR0RJIEFQSSBXaW5kb3dzIGZyYW1lIGdyYWJiZXIiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGdkaWdyYWIpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGdkaWdyYWJfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZ2RpZ3JhYl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBnZGlncmFiX3JlYWRfY2xvc2UsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZnZGlncmFiX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9pZWM2MTg4My5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2llYzYxODgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5YWFkMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9pZWM2MTg4My5jCkBAIC0wLDAgKzEsNDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEdlb3JnIExpcHBpdHNjaCA8Z2VvcmcubGlwcGl0c2NoQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbGliaWVjNjE4ODMgaW50ZXJmYWNlCisgKi8KKworI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8bGlicmF3MTM5NC9yYXcxMzk0Lmg+CisjaW5jbHVkZSA8bGliYXZjMTM5NC9hdmMxMzk0Lmg+CisjaW5jbHVkZSA8bGliYXZjMTM5NC9yb20xMzk0Lmg+CisjaW5jbHVkZSA8bGliaWVjNjE4ODMvaWVjNjE4ODMuaD4KKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9kdi5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L21wZWd0cy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmRldmljZS5oIgorCisjZGVmaW5lIFRIUkVBRFMgSEFWRV9QVEhSRUFEUworCisjaWYgVEhSRUFEUworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCisjZGVmaW5lIE1PVERDVF9TUEVDX0lEICAgICAgMHgwMDAwNTA2OAorI2RlZmluZSBJRUM2MTg4M19BVVRPICAgICAgIDAKKyNkZWZpbmUgSUVDNjE4ODNfRFYgICAgICAgICAxCisjZGVmaW5lIElFQzYxODgzX0hEViAgICAgICAgMgorCisvKioKKyAqIEZvciBEViwgb25lIHBhY2tldCBjb3JyZXNwb25kcyBleGFjdGx5IHRvIG9uZSBmcmFtZS4KKyAqIEZvciBIRFYsIHRoZXNlIGFyZSBNUEVHMiB0cmFuc3BvcnQgc3RyZWFtIHBhY2tldHMuCisgKiBUaGUgcXVldWUgaXMgaW1wbGVtZW50ZWQgYXMgbGlua2VkIGxpc3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IERWUGFja2V0IHsKKyAgICB1aW50OF90ICpidWY7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IGFjdHVhbCBidWZmZXIgZGF0YQorICAgIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc2l6ZSBvZiBidWZmZXIgYWxsb2NhdGVkCisgICAgc3RydWN0IERWUGFja2V0ICpuZXh0OyAgICAgICAgICAgICAgLy8vPCBuZXh0IERWUGFja2V0Cit9IERWUGFja2V0OworCitzdHJ1Y3QgaWVjNjE4ODNfZGF0YSB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgcmF3MTM5NGhhbmRsZV90IHJhdzEzOTQ7ICAgICAgICAgICAgLy8vPCBoYW5kbGUgZm9yIGxpYnJhdzEzOTQKKyAgICBpZWM2MTg4M19kdl9mYl90IGllYzYxODgzX2R2OyAgICAgICAvLy88IGhhbmRsZSBmb3IgbGliaWVjNjE4ODMgd2hlbiB1c2VkIHdpdGggRFYKKyAgICBpZWM2MTg4M19tcGVnMl90IGllYzYxODgzX21wZWcyOyAgICAvLy88IGhhbmRsZSBmb3IgbGliaWVjNjE4ODMgd2hlbiB1c2VkIHdpdGggSERWCisKKyAgICBEVkRlbXV4Q29udGV4dCAqZHZfZGVtdXg7ICAgICAgICAgICAvLy88IGdlbmVyaWMgRFYgbXV4aW5nL2RlbXV4aW5nIGNvbnRleHQKKyAgICBNcGVnVFNDb250ZXh0ICptcGVnX2RlbXV4OyAgICAgICAgICAvLy88IGdlbmVyaWMgSERWIG11eGluZy9kZW11eGluZyBjb250ZXh0CisKKyAgICBEVlBhY2tldCAqcXVldWVfZmlyc3Q7ICAgICAgICAgICAgICAvLy88IGZpcnN0IGVsZW1lbnQgb2YgcGFja2V0IHF1ZXVlCisgICAgRFZQYWNrZXQgKnF1ZXVlX2xhc3Q7ICAgICAgICAgICAgICAgLy8vPCBsYXN0IGVsZW1lbnQgb2YgcGFja2V0IHF1ZXVlCisKKyAgICBjaGFyICpkZXZpY2VfZ3VpZDsgICAgICAgICAgICAgICAgICAvLy88IHRvIHNlbGVjdCBvbmUgb2YgbXVsdGlwbGUgRFYgZGV2aWNlcworCisgICAgaW50IHBhY2tldHM7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgcGFja2V0cyBxdWV1ZWQKKyAgICBpbnQgbWF4X3BhY2tldHM7ICAgICAgICAgICAgICAgICAgICAvLy88IE1heC4gbnVtYmVyIG9mIHBhY2tldHMgaW4gcXVldWUKKworICAgIGludCBiYW5kd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcmV0dXJuZWQgYnkgbGliaWVjNjE4ODMKKyAgICBpbnQgY2hhbm5lbDsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHJldHVybmVkIGJ5IGxpYmllYzYxODgzCisgICAgaW50IGlucHV0X3BvcnQ7ICAgICAgICAgICAgICAgICAgICAgLy8vPCByZXR1cm5lZCBieSBsaWJpZWM2MTg4MworICAgIGludCB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgU3RyZWFtIHR5cGUsIHRvIGRpc3Rpbmd1aXNoIERWL0hEVgorICAgIGludCBub2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcmV0dXJuZWQgYnkgbGliaWVjNjE4ODMKKyAgICBpbnQgb3V0cHV0X3BvcnQ7ICAgICAgICAgICAgICAgICAgICAvLy88IHJldHVybmVkIGJ5IGxpYmllYzYxODgzCisgICAgaW50IHRocmVhZF9sb29wOyAgICAgICAgICAgICAgICAgICAgLy8vPCBDb25kaXRpb24gZm9yIHRocmVhZCB3aGlsZS1sb29wCisgICAgaW50IHJlY2VpdmluZzsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUcnVlIGFzIHNvb24gZGF0YSBmcm9tIGRldmljZSBhdmFpbGFibGUKKyAgICBpbnQgcmVjZWl2ZV9lcnJvcjsgICAgICAgICAgICAgICAgICAvLy88IFNldCBpbiByZWNlaXZlIHRhc2sgaW4gY2FzZSBvZiBlcnJvcgorICAgIGludCBlb2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVHJ1ZSBhcyBzb29uIGFzIG5vIG1vcmUgZGF0YSBhdmFpbGFibGUKKworICAgIHN0cnVjdCBwb2xsZmQgcmF3MTM5NF9wb2xsOyAgICAgICAgIC8vLzwgdG8gcG9sbCBmb3IgbmV3IGRhdGEgZnJvbSBsaWJyYXcxMzk0CisKKyAgICAvKiogUGFyc2UgZnVuY3Rpb24gZm9yIERWL0hEViBkaWZmZXJzLCBzbyB0aGlzIGlzIHNldCBiZWZvcmUgcGFja2V0cyBhcnJpdmUgKi8KKyAgICBpbnQgKCpwYXJzZV9xdWV1ZSkoc3RydWN0IGllYzYxODgzX2RhdGEgKmR2LCBBVlBhY2tldCAqcGt0KTsKKworI2lmIFRIUkVBRFMKKyAgICBwdGhyZWFkX3QgcmVjZWl2ZV90YXNrX3RocmVhZDsKKyAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7CisgICAgcHRocmVhZF9jb25kX3QgY29uZDsKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBpZWM2MTg4M19jYWxsYmFjayh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGxldGUsIHZvaWQgKmNhbGxiYWNrX2RhdGEpCit7CisgICAgc3RydWN0IGllYzYxODgzX2RhdGEgKmR2ID0gY2FsbGJhY2tfZGF0YTsKKyAgICBEVlBhY2tldCAqcGFja2V0OworICAgIGludCByZXQ7CisKKyNpZiBUSFJFQURTCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZkdi0+bXV0ZXgpOworI2VuZGlmCisKKyAgICBpZiAoZHYtPnBhY2tldHMgPj0gZHYtPm1heF9wYWNrZXRzKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJEViBwYWNrZXQgcXVldWUgb3ZlcnJ1biwgZHJvcHBpbmcuXG4iKTsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHBhY2tldCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpwYWNrZXQpKTsKKyAgICBpZiAoIXBhY2tldCkgeworICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHBhY2tldC0+YnVmID0gYXZfbWFsbG9jKGxlbmd0aCk7CisgICAgaWYgKCFwYWNrZXQtPmJ1ZikgeworICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBwYWNrZXQtPmxlbiA9IGxlbmd0aDsKKworICAgIG1lbWNweShwYWNrZXQtPmJ1ZiwgZGF0YSwgbGVuZ3RoKTsKKworICAgIGlmIChkdi0+cXVldWVfZmlyc3QpIHsKKyAgICAgICAgZHYtPnF1ZXVlX2xhc3QtPm5leHQgPSBwYWNrZXQ7CisgICAgICAgIGR2LT5xdWV1ZV9sYXN0ID0gcGFja2V0OworICAgIH0gZWxzZSB7CisgICAgICAgIGR2LT5xdWV1ZV9maXJzdCA9IHBhY2tldDsKKyAgICAgICAgZHYtPnF1ZXVlX2xhc3QgPSBwYWNrZXQ7CisgICAgfQorICAgIGR2LT5wYWNrZXRzKys7CisKKyAgICByZXQgPSAwOworCitleGl0OgorI2lmIFRIUkVBRFMKKyAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZkdi0+Y29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmR2LT5tdXRleCk7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCAqaWVjNjE4ODNfcmVjZWl2ZV90YXNrKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBzdHJ1Y3QgaWVjNjE4ODNfZGF0YSAqZHYgPSAoc3RydWN0IGllYzYxODgzX2RhdGEgKilvcGFxdWU7CisgICAgaW50IHJlc3VsdDsKKworI2lmIFRIUkVBRFMKKyAgICB3aGlsZSAoZHYtPnRocmVhZF9sb29wKQorI2VuZGlmCisgICAgeworICAgICAgICB3aGlsZSAoKHJlc3VsdCA9IHBvbGwoJmR2LT5yYXcxMzk0X3BvbGwsIDEsIDIwMCkpIDwgMCkgeworICAgICAgICAgICAgaWYgKCEoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJSYXcxMzk0IHBvbGwgZXJyb3Igb2NjdXJyZWQuXG4iKTsKKyAgICAgICAgICAgICAgICBkdi0+cmVjZWl2ZV9lcnJvciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ID4gMCAmJiAoKGR2LT5yYXcxMzk0X3BvbGwucmV2ZW50cyAmIFBPTExJTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChkdi0+cmF3MTM5NF9wb2xsLnJldmVudHMgJiBQT0xMUFJJKSkpIHsKKyAgICAgICAgICAgIGR2LT5yZWNlaXZpbmcgPSAxOworICAgICAgICAgICAgcmF3MTM5NF9sb29wX2l0ZXJhdGUoZHYtPnJhdzEzOTQpOworICAgICAgICB9IGVsc2UgaWYgKGR2LT5yZWNlaXZpbmcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJObyBtb3JlIGlucHV0IGRhdGEgYXZhaWxhYmxlXG4iKTsKKyNpZiBUSFJFQURTCisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmR2LT5tdXRleCk7CisgICAgICAgICAgICBkdi0+ZW9mID0gMTsKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJmR2LT5jb25kKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkdi0+bXV0ZXgpOworI2Vsc2UKKyAgICAgICAgICAgIGR2LT5lb2YgPSAxOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGllYzYxODgzX3BhcnNlX3F1ZXVlX2R2KHN0cnVjdCBpZWM2MTg4M19kYXRhICpkdiwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBEVlBhY2tldCAqcGFja2V0OworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IGF2cHJpdl9kdl9nZXRfcGFja2V0KGR2LT5kdl9kZW11eCwgcGt0KTsKKyAgICBpZiAoc2l6ZSA+IDApCisgICAgICAgIHJldHVybiBzaXplOworCisgICAgcGFja2V0ID0gZHYtPnF1ZXVlX2ZpcnN0OworICAgIGlmICghcGFja2V0KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzaXplID0gYXZwcml2X2R2X3Byb2R1Y2VfcGFja2V0KGR2LT5kdl9kZW11eCwgcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5idWYsIHBhY2tldC0+bGVuLCAtMSk7CisgICAgcGt0LT5kZXN0cnVjdCA9IGF2X2Rlc3RydWN0X3BhY2tldDsKKyAgICBkdi0+cXVldWVfZmlyc3QgPSBwYWNrZXQtPm5leHQ7CisgICAgYXZfZnJlZShwYWNrZXQpOworICAgIGR2LT5wYWNrZXRzLS07CisKKyAgICBpZiAoc2l6ZSA+IDApCisgICAgICAgIHJldHVybiBzaXplOworCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGllYzYxODgzX3BhcnNlX3F1ZXVlX2hkdihzdHJ1Y3QgaWVjNjE4ODNfZGF0YSAqZHYsIEFWUGFja2V0ICpwa3QpCit7CisgICAgRFZQYWNrZXQgKnBhY2tldDsKKyAgICBpbnQgc2l6ZTsKKworICAgIHdoaWxlIChkdi0+cXVldWVfZmlyc3QpIHsKKyAgICAgICAgcGFja2V0ID0gZHYtPnF1ZXVlX2ZpcnN0OworICAgICAgICBzaXplID0gYXZwcml2X21wZWd0c19wYXJzZV9wYWNrZXQoZHYtPm1wZWdfZGVtdXgsIHBrdCwgcGFja2V0LT5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmxlbik7CisgICAgICAgIGR2LT5xdWV1ZV9maXJzdCA9IHBhY2tldC0+bmV4dDsKKyAgICAgICAgYXZfZnJlZXAoJnBhY2tldC0+YnVmKTsKKyAgICAgICAgYXZfZnJlZXAoJnBhY2tldCk7CisgICAgICAgIGR2LT5wYWNrZXRzLS07CisKKyAgICAgICAgaWYgKHNpemUgPiAwKQorICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGllYzYxODgzX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqY29udGV4dCkKK3sKKyAgICBzdHJ1Y3QgaWVjNjE4ODNfZGF0YSAqZHYgPSBjb250ZXh0LT5wcml2X2RhdGE7CisgICAgc3RydWN0IHJhdzEzOTRfcG9ydGluZm8gcGluZlsxNl07CisgICAgcm9tMTM5NF9kaXJlY3Rvcnkgcm9tX2RpcjsKKyAgICBjaGFyICplbmRwdHI7CisgICAgaW50IGlucG9ydDsKKyAgICBpbnQgbmJfcG9ydHM7CisgICAgaW50IHBvcnQgPSAtMTsKKyAgICBpbnQgcmVzcG9uc2U7CisgICAgaW50IGksIGogPSAwOworICAgIHVpbnQ2NF90IGd1aWQgPSAwOworCisgICAgZHYtPmlucHV0X3BvcnQgPSAtMTsKKyAgICBkdi0+b3V0cHV0X3BvcnQgPSAtMTsKKyAgICBkdi0+Y2hhbm5lbCA9IC0xOworCisgICAgZHYtPnJhdzEzOTQgPSByYXcxMzk0X25ld19oYW5kbGUoKTsKKworICAgIGlmICghZHYtPnJhdzEzOTQpIHsKKyAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIElFRUUxMzk0IGludGVyZmFjZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGlmICgobmJfcG9ydHMgPSByYXcxMzk0X2dldF9wb3J0X2luZm8oZHYtPnJhdzEzOTQsIHBpbmYsIDE2KSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjb250ZXh0LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IG51bWJlciBvZiBJRUVFMTM5NCBwb3J0cy5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaW5wb3J0ID0gc3RydG9sKGNvbnRleHQtPmZpbGVuYW1lLCAmZW5kcHRyLCAxMCk7CisgICAgaWYgKGVuZHB0ciAhPSBjb250ZXh0LT5maWxlbmFtZSAmJiAqZW5kcHRyID09ICdcMCcpIHsKKyAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19JTkZPLCAiU2VsZWN0aW5nIElFRUUxMzk0IHBvcnQ6ICVkXG4iLCBpbnBvcnQpOworICAgICAgICBqID0gaW5wb3J0OworICAgICAgICBuYl9wb3J0cyA9IGlucG9ydCArIDE7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoY29udGV4dC0+ZmlsZW5hbWUsICJhdXRvIikpIHsKKyAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgaW5wdXQgXCIlc1wiLCB5b3Ugc2hvdWxkIHNwZWNpZnkgIgorICAgICAgICAgICAgICAgIlwiYXV0b1wiIGZvciBhdXRvLWRldGVjdGlvbiwgb3IgdGhlIHBvcnQgbnVtYmVyLlxuIiwgY29udGV4dC0+ZmlsZW5hbWUpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGR2LT5kZXZpY2VfZ3VpZCkgeworICAgICAgICBpZiAoc3NjYW5mKGR2LT5kZXZpY2VfZ3VpZCwgIiVsbHgiLCAobG9uZyBsb25nIHVuc2lnbmVkIGludCAqKSZndWlkKSAhPSAxKSB7CisgICAgICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0lORk8sICJJbnZhbGlkIGR2Z3VpZCBwYXJhbWV0ZXI6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGR2LT5kZXZpY2VfZ3VpZCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKDsgaiA8IG5iX3BvcnRzICYmIHBvcnQ9PS0xOyArK2opIHsKKyAgICAgICAgcmF3MTM5NF9kZXN0cm95X2hhbmRsZShkdi0+cmF3MTM5NCk7CisKKyAgICAgICAgaWYgKCEoZHYtPnJhdzEzOTQgPSByYXcxMzk0X25ld19oYW5kbGVfb25fcG9ydChqKSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjb250ZXh0LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgc2V0dGluZyBJRUVFMTM5NCBwb3J0LlxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTxyYXcxMzk0X2dldF9ub2RlY291bnQoZHYtPnJhdzEzOTQpOyArK2kpIHsKKworICAgICAgICAgICAgLyogU2VsZWN0IGRldmljZSBleHBsaWNpdGx5IGJ5IEdVSUQgKi8KKworICAgICAgICAgICAgaWYgKGd1aWQgPiAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGd1aWQgPT0gcm9tMTM5NF9nZXRfZ3VpZChkdi0+cmF3MTM5NCwgaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZHYtPm5vZGUgPSBpOworICAgICAgICAgICAgICAgICAgICBwb3J0ID0gajsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIC8qIFNlbGVjdCBmaXJzdCBBVi9DIHRhcGUgcmVjb3JkZXIgcGxheWVyIG5vZGUgKi8KKworICAgICAgICAgICAgICAgIGlmIChyb20xMzk0X2dldF9kaXJlY3RvcnkoZHYtPnJhdzEzOTQsIGksICZyb21fZGlyKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICgoKHJvbTEzOTRfZ2V0X25vZGVfdHlwZSgmcm9tX2RpcikgPT0gUk9NMTM5NF9OT0RFX1RZUEVfQVZDKSAmJgorICAgICAgICAgICAgICAgICAgICAgYXZjMTM5NF9jaGVja19zdWJ1bml0X3R5cGUoZHYtPnJhdzEzOTQsIGksIEFWQzEzOTRfU1VCVU5JVF9UWVBFX1ZDUikpIHx8CisgICAgICAgICAgICAgICAgICAgIChyb21fZGlyLnVuaXRfc3BlY19pZCA9PSBNT1REQ1RfU1BFQ19JRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcm9tMTM5NF9mcmVlX2RpcmVjdG9yeSgmcm9tX2Rpcik7CisgICAgICAgICAgICAgICAgICAgIGR2LT5ub2RlID0gaTsKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGo7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb20xMzk0X2ZyZWVfZGlyZWN0b3J5KCZyb21fZGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwb3J0ID09IC0xKSB7CisgICAgICAgIGF2X2xvZyhjb250ZXh0LCBBVl9MT0dfRVJST1IsICJObyBBVi9DIGRldmljZXMgZm91bmQuXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIFByb3ZpZGUgYnVzIHNhbml0eSBmb3IgbXVsdGlwbGUgY29ubmVjdGlvbnMgKi8KKworICAgIGllYzYxODgzX2NtcF9ub3JtYWxpemVfb3V0cHV0KGR2LT5yYXcxMzk0LCAweGZmYzAgfCBkdi0+bm9kZSk7CisKKyAgICAvKiBGaW5kIG91dCBpZiBkZXZpY2UgaXMgRFYgb3IgSERWICovCisKKyAgICBpZiAoZHYtPnR5cGUgPT0gSUVDNjE4ODNfQVVUTykgeworICAgICAgICByZXNwb25zZSA9IGF2YzEzOTRfdHJhbnNhY3Rpb24oZHYtPnJhdzEzOTQsIGR2LT5ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDMTM5NF9DVFlQRV9TVEFUVVMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDMTM5NF9TVUJVTklUX1RZUEVfVEFQRV9SRUNPUkRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkMxMzk0X1NVQlVOSVRfSURfMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkMxMzk0X1ZDUl9DT01NQU5EX09VVFBVVF9TSUdOQUxfTU9ERSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGLCAyKTsKKyAgICAgICAgcmVzcG9uc2UgPSBBVkMxMzk0X0dFVF9PUEVSQU5EMChyZXNwb25zZSk7CisgICAgICAgIGR2LT50eXBlID0gKHJlc3BvbnNlID09IDB4MTAgfHwgcmVzcG9uc2UgPT0gMHg5MCB8fCByZXNwb25zZSA9PSAweDFBIHx8IHJlc3BvbnNlID09IDB4OUEpID8KKyAgICAgICAgICAgIElFQzYxODgzX0hEViA6IElFQzYxODgzX0RWOworICAgIH0KKworICAgIC8qIENvbm5lY3QgdG8gZGV2aWNlLCBhbmQgZG8gaW5pdGlhbGl6YXRpb24gKi8KKworICAgIGR2LT5jaGFubmVsID0gaWVjNjE4ODNfY21wX2Nvbm5lY3QoZHYtPnJhdzEzOTQsIGR2LT5ub2RlLCAmZHYtPm91dHB1dF9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3MTM5NF9nZXRfbG9jYWxfaWQoZHYtPnJhdzEzOTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2LT5pbnB1dF9wb3J0LCAmZHYtPmJhbmR3aWR0aCk7CisKKyAgICBpZiAoZHYtPmNoYW5uZWwgPCAwKQorICAgICAgICBkdi0+Y2hhbm5lbCA9IDYzOworCisgICAgaWYgKCFkdi0+bWF4X3BhY2tldHMpCisgICAgICAgIGR2LT5tYXhfcGFja2V0cyA9IDEwMDsKKworICAgIGlmIChDT05GSUdfTVBFR1RTX0RFTVVYRVIgJiYgZHYtPnR5cGUgPT0gSUVDNjE4ODNfSERWKSB7CisKKyAgICAgICAgLyogSW5pdCBIRFYgcmVjZWl2ZSAqLworCisgICAgICAgIGF2Zm9ybWF0X25ld19zdHJlYW0oY29udGV4dCwgTlVMTCk7CisKKyAgICAgICAgZHYtPm1wZWdfZGVtdXggPSBhdnByaXZfbXBlZ3RzX3BhcnNlX29wZW4oY29udGV4dCk7CisgICAgICAgIGlmICghZHYtPm1wZWdfZGVtdXgpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgZHYtPnBhcnNlX3F1ZXVlID0gaWVjNjE4ODNfcGFyc2VfcXVldWVfaGR2OworCisgICAgICAgIGR2LT5pZWM2MTg4M19tcGVnMiA9IGllYzYxODgzX21wZWcyX3JlY3ZfaW5pdChkdi0+cmF3MTM5NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZWM2MTg4M19tcGVnMl9yZWN2X3QpaWVjNjE4ODNfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdik7CisKKyAgICAgICAgZHYtPm1heF9wYWNrZXRzICo9IDc2NjsKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8qIEluaXQgRFYgcmVjZWl2ZSAqLworCisgICAgICAgIGR2LT5kdl9kZW11eCA9IGF2cHJpdl9kdl9pbml0X2RlbXV4KGNvbnRleHQpOworICAgICAgICBpZiAoIWR2LT5kdl9kZW11eCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBkdi0+cGFyc2VfcXVldWUgPSBpZWM2MTg4M19wYXJzZV9xdWV1ZV9kdjsKKworICAgICAgICBkdi0+aWVjNjE4ODNfZHYgPSBpZWM2MTg4M19kdl9mYl9pbml0KGR2LT5yYXcxMzk0LCBpZWM2MTg4M19jYWxsYmFjaywgZHYpOworICAgIH0KKworICAgIGR2LT5yYXcxMzk0X3BvbGwuZmQgPSByYXcxMzk0X2dldF9mZChkdi0+cmF3MTM5NCk7CisgICAgZHYtPnJhdzEzOTRfcG9sbC5ldmVudHMgPSBQT0xMSU4gfCBQT0xMRVJSIHwgUE9MTEhVUCB8IFBPTExQUkk7CisKKyAgICAvKiBBY3R1YWxseSBzdGFydCByZWNlaXZpbmcgKi8KKworICAgIGlmIChkdi0+dHlwZSA9PSBJRUM2MTg4M19IRFYpCisgICAgICAgIGllYzYxODgzX21wZWcyX3JlY3Zfc3RhcnQoZHYtPmllYzYxODgzX21wZWcyLCBkdi0+Y2hhbm5lbCk7CisgICAgZWxzZQorICAgICAgICBpZWM2MTg4M19kdl9mYl9zdGFydChkdi0+aWVjNjE4ODNfZHYsIGR2LT5jaGFubmVsKTsKKworI2lmIFRIUkVBRFMKKyAgICBkdi0+dGhyZWFkX2xvb3AgPSAxOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmZHYtPm11dGV4LCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmZHYtPmNvbmQsIE5VTEwpOworICAgIHB0aHJlYWRfY3JlYXRlKCZkdi0+cmVjZWl2ZV90YXNrX3RocmVhZCwgTlVMTCwgaWVjNjE4ODNfcmVjZWl2ZV90YXNrLCBkdik7CisjZW5kaWYKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIHJhdzEzOTRfZGVzdHJveV9oYW5kbGUoZHYtPnJhdzEzOTQpOworICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Cit9CisKK3N0YXRpYyBpbnQgaWVjNjE4ODNfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjb250ZXh0LCBBVlBhY2tldCAqcGt0KQoreworICAgIHN0cnVjdCBpZWM2MTg4M19kYXRhICpkdiA9IGNvbnRleHQtPnByaXZfZGF0YTsKKyAgICBpbnQgc2l6ZTsKKworICAgIC8qKgorICAgICAqIFRyeSB0byBwYXJzZSBmcmFtZXMgZnJvbSBxdWV1ZQorICAgICAqLworCisjaWYgVEhSRUFEUworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZHYtPm11dGV4KTsKKyAgICB3aGlsZSAoKHNpemUgPSBkdi0+cGFyc2VfcXVldWUoZHYsIHBrdCkpID09IC0xKQorICAgICAgICBpZiAoIWR2LT5lb2YpCisgICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmZHYtPmNvbmQsICZkdi0+bXV0ZXgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZHYtPm11dGV4KTsKKyNlbHNlCisgICAgaW50IHJlc3VsdDsKKyAgICB3aGlsZSAoKHNpemUgPSBkdi0+cGFyc2VfcXVldWUoZHYsIHBrdCkpID09IC0xKSB7CisgICAgICAgIGllYzYxODgzX3JlY2VpdmVfdGFzaygodm9pZCAqKWR2KTsKKyAgICAgICAgaWYgKGR2LT5yZWNlaXZlX2Vycm9yKQorICAgICAgICAgICAgcmV0dXJuIGR2LT5yZWNlaXZlX2Vycm9yOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgaWVjNjE4ODNfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpjb250ZXh0KQoreworICAgIHN0cnVjdCBpZWM2MTg4M19kYXRhICpkdiA9IGNvbnRleHQtPnByaXZfZGF0YTsKKworI2lmIFRIUkVBRFMKKyAgICBkdi0+dGhyZWFkX2xvb3AgPSAwOworICAgIHB0aHJlYWRfam9pbihkdi0+cmVjZWl2ZV90YXNrX3RocmVhZCwgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmR2LT5jb25kKTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmR2LT5tdXRleCk7CisjZW5kaWYKKworICAgIGlmIChDT05GSUdfTVBFR1RTX0RFTVVYRVIgJiYgZHYtPnR5cGUgPT0gSUVDNjE4ODNfSERWKSB7CisgICAgICAgIGllYzYxODgzX21wZWcyX3JlY3Zfc3RvcChkdi0+aWVjNjE4ODNfbXBlZzIpOworICAgICAgICBpZWM2MTg4M19tcGVnMl9jbG9zZShkdi0+aWVjNjE4ODNfbXBlZzIpOworICAgICAgICBhdnByaXZfbXBlZ3RzX3BhcnNlX2Nsb3NlKGR2LT5tcGVnX2RlbXV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZWM2MTg4M19kdl9mYl9zdG9wKGR2LT5pZWM2MTg4M19kdik7CisgICAgICAgIGllYzYxODgzX2R2X2ZiX2Nsb3NlKGR2LT5pZWM2MTg4M19kdik7CisgICAgfQorICAgIHdoaWxlIChkdi0+cXVldWVfZmlyc3QpIHsKKyAgICAgICAgRFZQYWNrZXQgKnBhY2tldCA9IGR2LT5xdWV1ZV9maXJzdDsKKyAgICAgICAgZHYtPnF1ZXVlX2ZpcnN0ID0gcGFja2V0LT5uZXh0OworICAgICAgICBhdl9mcmVlcCgmcGFja2V0LT5idWYpOworICAgICAgICBhdl9mcmVlcCgmcGFja2V0KTsKKyAgICB9CisKKyAgICBpZWM2MTg4M19jbXBfZGlzY29ubmVjdChkdi0+cmF3MTM5NCwgZHYtPm5vZGUsIGR2LT5vdXRwdXRfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXcxMzk0X2dldF9sb2NhbF9pZChkdi0+cmF3MTM5NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHYtPmlucHV0X3BvcnQsIGR2LT5jaGFubmVsLCBkdi0+YmFuZHdpZHRoKTsKKworICAgIHJhdzEzOTRfZGVzdHJveV9oYW5kbGUoZHYtPnJhdzEzOTQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiZHZ0eXBlIiwgIm92ZXJyaWRlIGF1dG9kZXRlY3Rpb24gb2YgRFYvSERWIiwgb2Zmc2V0b2Yoc3RydWN0IGllYzYxODgzX2RhdGEsIHR5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gSUVDNjE4ODNfQVVUT30sIElFQzYxODgzX0FVVE8sIElFQzYxODgzX0hEViwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJkdnR5cGUiIH0sCisgICAgeyAiYXV0byIsICAgImF1dG8gZGV0ZWN0IERWL0hEViIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IElFQzYxODgzX0FVVE99LCAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgImR2dHlwZSIgfSwKKyAgICB7ICJkdiIsICAgICAiZm9yY2UgZGV2aWNlIGJlaW5nIHRyZWF0ZWQgYXMgRFYgZGV2aWNlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gSUVDNjE4ODNfRFZ9LCAgIDAsIDAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAiZHZ0eXBlIiB9LAorICAgIHsgImhkdiIgLCAgICJmb3JjZSBkZXZpY2UgYmVpbmcgdHJlYXRlZCBhcyBIRFYgZGV2aWNlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gSUVDNjE4ODNfSERWfSwgIDAsIDAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAiZHZ0eXBlIiB9LAorICAgIHsgImR2YnVmZmVyIiwgInNldCBxdWV1ZSBidWZmZXIgc2l6ZSAoaW4gcGFja2V0cykiLCBvZmZzZXRvZihzdHJ1Y3QgaWVjNjE4ODNfZGF0YSwgbWF4X3BhY2tldHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiZHZndWlkIiwgInNlbGVjdCBvbmUgb2YgbXVsdGlwbGUgRFYgZGV2aWNlcyBieSBpdHMgR1VJRCIsIG9mZnNldG9mKHN0cnVjdCBpZWM2MTg4M19kYXRhLCBkZXZpY2VfZ3VpZCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGllYzYxODgzX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImllYzYxODgzIGluZGV2IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19JTlBVVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfaWVjNjE4ODNfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaWVjNjE4ODMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJpZWM2MTg4MyAobmV3IERWMTM5NCkgQS9WIGlucHV0IGRldmljZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVjNjE4ODNfZGF0YSksCisgICAgLnJlYWRfaGVhZGVyICAgID0gaWVjNjE4ODNfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gaWVjNjE4ODNfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gaWVjNjE4ODNfY2xvc2UsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZpZWM2MTg4M19jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvamFja19hdWRpby5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2phY2tfYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzUyYThlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2phY2tfYXVkaW8uYwpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIEpBQ0sgQXVkaW8gQ29ubmVjdGlvbiBLaXQgaW5wdXQgZGV2aWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2FtYWx5c2UKKyAqIEF1dGhvcjogT2xpdmllciBHdWlseWFyZGkgPG9saXZpZXIgc2FtYWx5c2UgY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisjaW5jbHVkZSA8amFjay9qYWNrLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpZm8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisjaW5jbHVkZSAidGltZWZpbHRlci5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKKy8qKgorICogU2l6ZSBvZiB0aGUgaW50ZXJuYWwgRklGTyBidWZmZXJzIGFzIGEgbnVtYmVyIG9mIGF1ZGlvIHBhY2tldHMKKyAqLworI2RlZmluZSBGSUZPX1BBQ0tFVFNfTlVNIDE2CisKK3R5cGVkZWYgc3RydWN0IEphY2tEYXRhIHsKKyAgICBBVkNsYXNzICAgICAgICAqY2xhc3M7CisgICAgamFja19jbGllbnRfdCAqIGNsaWVudDsKKyAgICBpbnQgICAgICAgICAgICAgYWN0aXZhdGVkOworICAgIHNlbV90ICAgICAgICAgICBwYWNrZXRfY291bnQ7CisgICAgamFja19uZnJhbWVzX3QgIHNhbXBsZV9yYXRlOworICAgIGphY2tfbmZyYW1lc190ICBidWZmZXJfc2l6ZTsKKyAgICBqYWNrX3BvcnRfdCAqKiAgcG9ydHM7CisgICAgaW50ICAgICAgICAgICAgIG5wb3J0czsKKyAgICBUaW1lRmlsdGVyICogICAgdGltZWZpbHRlcjsKKyAgICBBVkZpZm9CdWZmZXIgKiAgbmV3X3BrdHM7CisgICAgQVZGaWZvQnVmZmVyICogIGZpbGxlZF9wa3RzOworICAgIGludCAgICAgICAgICAgICBwa3RfeHJ1bjsKKyAgICBpbnQgICAgICAgICAgICAgamFja194cnVuOworfSBKYWNrRGF0YTsKKworc3RhdGljIGludCBwcm9jZXNzX2NhbGxiYWNrKGphY2tfbmZyYW1lc190IG5mcmFtZXMsIHZvaWQgKmFyZykKK3sKKyAgICAvKiBXYXJuaW5nOiB0aGlzIGZ1bmN0aW9uIHJ1bnMgaW4gcmVhbHRpbWUuIE9uZSBtdXN0bid0IGFsbG9jYXRlIG1lbW9yeSBoZXJlCisgICAgICogb3IgZG8gYW55IG90aGVyIHRoaW5nIHRoYXQgY291bGQgYmxvY2suICovCisKKyAgICBpbnQgaSwgajsKKyAgICBKYWNrRGF0YSAqc2VsZiA9IGFyZzsKKyAgICBmbG9hdCAqIGJ1ZmZlcjsKKyAgICBqYWNrX25mcmFtZXNfdCBsYXRlbmN5LCBjeWNsZV9kZWxheTsKKyAgICBBVlBhY2tldCBwa3Q7CisgICAgZmxvYXQgKnBrdF9kYXRhOworICAgIGRvdWJsZSBjeWNsZV90aW1lOworCisgICAgaWYgKCFzZWxmLT5jbGllbnQpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogVGhlIGFwcHJveGltYXRlIGRlbGF5IHNpbmNlIHRoZSBoYXJkd2FyZSBpbnRlcnJ1cHQgYXMgYSBudW1iZXIgb2YgZnJhbWVzICovCisgICAgY3ljbGVfZGVsYXkgPSBqYWNrX2ZyYW1lc19zaW5jZV9jeWNsZV9zdGFydChzZWxmLT5jbGllbnQpOworCisgICAgLyogUmV0cmlldmUgZmlsdGVyZWQgY3ljbGUgdGltZSAqLworICAgIGN5Y2xlX3RpbWUgPSBmZl90aW1lZmlsdGVyX3VwZGF0ZShzZWxmLT50aW1lZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXR0aW1lKCkgLyAxMDAwMDAwLjAgLSAoZG91YmxlKSBjeWNsZV9kZWxheSAvIHNlbGYtPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5idWZmZXJfc2l6ZSk7CisKKyAgICAvKiBDaGVjayBpZiBhbiBlbXB0eSBwYWNrZXQgaXMgYXZhaWxhYmxlLCBhbmQgaWYgdGhlcmUncyBlbm91Z2ggc3BhY2UgdG8gc2VuZCBpdCBiYWNrIG9uY2UgZmlsbGVkICovCisgICAgaWYgKChhdl9maWZvX3NpemUoc2VsZi0+bmV3X3BrdHMpIDwgc2l6ZW9mKHBrdCkpIHx8IChhdl9maWZvX3NwYWNlKHNlbGYtPmZpbGxlZF9wa3RzKSA8IHNpemVvZihwa3QpKSkgeworICAgICAgICBzZWxmLT5wa3RfeHJ1biA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFJldHJpZXZlIGVtcHR5IChidXQgYWxsb2NhdGVkKSBwYWNrZXQgKi8KKyAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzZWxmLT5uZXdfcGt0cywgJnBrdCwgc2l6ZW9mKHBrdCksIE5VTEwpOworCisgICAgcGt0X2RhdGEgID0gKGZsb2F0ICopIHBrdC5kYXRhOworICAgIGxhdGVuY3kgICA9IDA7CisKKyAgICAvKiBDb3B5IGFuZCBpbnRlcmxlYXZlIGF1ZGlvIGRhdGEgZnJvbSB0aGUgSkFDSyBidWZmZXIgaW50byB0aGUgcGFja2V0ICovCisgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm5wb3J0czsgaSsrKSB7CisgICAgI2lmIEhBVkVfSkFDS19QT1JUX0dFVF9MQVRFTkNZX1JBTkdFCisgICAgICAgIGphY2tfbGF0ZW5jeV9yYW5nZV90IHJhbmdlOworICAgICAgICBqYWNrX3BvcnRfZ2V0X2xhdGVuY3lfcmFuZ2Uoc2VsZi0+cG9ydHNbaV0sIEphY2tDYXB0dXJlTGF0ZW5jeSwgJnJhbmdlKTsKKyAgICAgICAgbGF0ZW5jeSArPSByYW5nZS5tYXg7CisgICAgI2Vsc2UKKyAgICAgICAgbGF0ZW5jeSArPSBqYWNrX3BvcnRfZ2V0X3RvdGFsX2xhdGVuY3koc2VsZi0+Y2xpZW50LCBzZWxmLT5wb3J0c1tpXSk7CisgICAgI2VuZGlmCisgICAgICAgIGJ1ZmZlciA9IGphY2tfcG9ydF9nZXRfYnVmZmVyKHNlbGYtPnBvcnRzW2ldLCBzZWxmLT5idWZmZXJfc2l6ZSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzZWxmLT5idWZmZXJfc2l6ZTsgaisrKQorICAgICAgICAgICAgcGt0X2RhdGFbaiAqIHNlbGYtPm5wb3J0cyArIGldID0gYnVmZmVyW2pdOworICAgIH0KKworICAgIC8qIFRpbWVzdGFtcCB0aGUgcGFja2V0IHdpdGggdGhlIGN5Y2xlIHN0YXJ0IHRpbWUgbWludXMgdGhlIGF2ZXJhZ2UgbGF0ZW5jeSAqLworICAgIHBrdC5wdHMgPSAoY3ljbGVfdGltZSAtIChkb3VibGUpIGxhdGVuY3kgLyAoc2VsZi0+bnBvcnRzICogc2VsZi0+c2FtcGxlX3JhdGUpKSAqIDEwMDAwMDAuMDsKKworICAgIC8qIFNlbmQgdGhlIG5vdyBmaWxsZWQgcGFja2V0IGJhY2ssIGFuZCBpbmNyZWFzZSBwYWNrZXQgY291bnRlciAqLworICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShzZWxmLT5maWxsZWRfcGt0cywgJnBrdCwgc2l6ZW9mKHBrdCksIE5VTEwpOworICAgIHNlbV9wb3N0KCZzZWxmLT5wYWNrZXRfY291bnQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNodXRkb3duX2NhbGxiYWNrKHZvaWQgKmFyZykKK3sKKyAgICBKYWNrRGF0YSAqc2VsZiA9IGFyZzsKKyAgICBzZWxmLT5jbGllbnQgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHhydW5fY2FsbGJhY2sodm9pZCAqYXJnKQoreworICAgIEphY2tEYXRhICpzZWxmID0gYXJnOworICAgIHNlbGYtPmphY2tfeHJ1biA9IDE7CisgICAgZmZfdGltZWZpbHRlcl9yZXNldChzZWxmLT50aW1lZmlsdGVyKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdXBwbHlfbmV3X3BhY2tldHMoSmFja0RhdGEgKnNlbGYsIEFWRm9ybWF0Q29udGV4dCAqY29udGV4dCkKK3sKKyAgICBBVlBhY2tldCBwa3Q7CisgICAgaW50IHRlc3QsIHBrdF9zaXplID0gc2VsZi0+YnVmZmVyX3NpemUgKiBzZWxmLT5ucG9ydHMgKiBzaXplb2YoZmxvYXQpOworCisgICAgLyogU3VwcGx5IHRoZSBwcm9jZXNzIGNhbGxiYWNrIHdpdGggbmV3IGVtcHR5IHBhY2tldHMsIGJ5IGZpbGxpbmcgdGhlIG5ldworICAgICAqIHBhY2tldHMgRklGTyBidWZmZXIgd2l0aCBhcyBtYW55IHBhY2tldHMgYXMgcG9zc2libGUuIHByb2Nlc3NfY2FsbGJhY2soKQorICAgICAqIGNhbid0IGRvIHRoaXMgYnkgaXRzZWxmLCBiZWNhdXNlIGl0IGNhbid0IGFsbG9jYXRlIG1lbW9yeSBpbiByZWFsdGltZS4gKi8KKyAgICB3aGlsZSAoYXZfZmlmb19zcGFjZShzZWxmLT5uZXdfcGt0cykgPj0gc2l6ZW9mKHBrdCkpIHsKKyAgICAgICAgaWYgKCh0ZXN0ID0gYXZfbmV3X3BhY2tldCgmcGt0LCBwa3Rfc2l6ZSkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgcGFja2V0IG9mIHNpemUgJWRcbiIsIHBrdF9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiB0ZXN0OworICAgICAgICB9CisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShzZWxmLT5uZXdfcGt0cywgJnBrdCwgc2l6ZW9mKHBrdCksIE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFydF9qYWNrKEFWRm9ybWF0Q29udGV4dCAqY29udGV4dCkKK3sKKyAgICBKYWNrRGF0YSAqc2VsZiA9IGNvbnRleHQtPnByaXZfZGF0YTsKKyAgICBqYWNrX3N0YXR1c190IHN0YXR1czsKKyAgICBpbnQgaSwgdGVzdDsKKworICAgIC8qIFJlZ2lzdGVyIGFzIGEgSkFDSyBjbGllbnQsIHVzaW5nIHRoZSBjb250ZXh0IGZpbGVuYW1lIGFzIGNsaWVudCBuYW1lLiAqLworICAgIHNlbGYtPmNsaWVudCA9IGphY2tfY2xpZW50X29wZW4oY29udGV4dC0+ZmlsZW5hbWUsIEphY2tOdWxsT3B0aW9uLCAmc3RhdHVzKTsKKyAgICBpZiAoIXNlbGYtPmNsaWVudCkgeworICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGFzIGEgSkFDSyBjbGllbnRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHNlbV9pbml0KCZzZWxmLT5wYWNrZXRfY291bnQsIDAsIDApOworCisgICAgc2VsZi0+c2FtcGxlX3JhdGUgPSBqYWNrX2dldF9zYW1wbGVfcmF0ZShzZWxmLT5jbGllbnQpOworICAgIHNlbGYtPnBvcnRzICAgICAgID0gYXZfbWFsbG9jX2FycmF5KHNlbGYtPm5wb3J0cywgc2l6ZW9mKCpzZWxmLT5wb3J0cykpOworICAgIHNlbGYtPmJ1ZmZlcl9zaXplID0gamFja19nZXRfYnVmZmVyX3NpemUoc2VsZi0+Y2xpZW50KTsKKworICAgIC8qIFJlZ2lzdGVyIEpBQ0sgcG9ydHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bnBvcnRzOyBpKyspIHsKKyAgICAgICAgY2hhciBzdHJbMTZdOworICAgICAgICBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiaW5wdXRfJWQiLCBpICsgMSk7CisgICAgICAgIHNlbGYtPnBvcnRzW2ldID0gamFja19wb3J0X3JlZ2lzdGVyKHNlbGYtPmNsaWVudCwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQUNLX0RFRkFVTFRfQVVESU9fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFja1BvcnRJc0lucHV0LCAwKTsKKyAgICAgICAgaWYgKCFzZWxmLT5wb3J0c1tpXSkgeworICAgICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byByZWdpc3RlciBwb3J0ICVzOiVzXG4iLAorICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmZpbGVuYW1lLCBzdHIpOworICAgICAgICAgICAgamFja19jbGllbnRfY2xvc2Uoc2VsZi0+Y2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZWdpc3RlciBKQUNLIGNhbGxiYWNrcyAqLworICAgIGphY2tfc2V0X3Byb2Nlc3NfY2FsbGJhY2soc2VsZi0+Y2xpZW50LCBwcm9jZXNzX2NhbGxiYWNrLCBzZWxmKTsKKyAgICBqYWNrX29uX3NodXRkb3duKHNlbGYtPmNsaWVudCwgc2h1dGRvd25fY2FsbGJhY2ssIHNlbGYpOworICAgIGphY2tfc2V0X3hydW5fY2FsbGJhY2soc2VsZi0+Y2xpZW50LCB4cnVuX2NhbGxiYWNrLCBzZWxmKTsKKworICAgIC8qIENyZWF0ZSB0aW1lIGZpbHRlciAqLworICAgIHNlbGYtPnRpbWVmaWx0ZXIgID0gZmZfdGltZWZpbHRlcl9uZXcgKDEuMCAvIHNlbGYtPnNhbXBsZV9yYXRlLCBzZWxmLT5idWZmZXJfc2l6ZSwgMS41KTsKKyAgICBpZiAoIXNlbGYtPnRpbWVmaWx0ZXIpIHsKKyAgICAgICAgamFja19jbGllbnRfY2xvc2Uoc2VsZi0+Y2xpZW50KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgRklGTyBidWZmZXJzICovCisgICAgc2VsZi0+ZmlsbGVkX3BrdHMgPSBhdl9maWZvX2FsbG9jX2FycmF5KEZJRk9fUEFDS0VUU19OVU0sIHNpemVvZihBVlBhY2tldCkpOworICAgIC8qIE5ldyBwYWNrZXRzIEZJRk8gd2l0aCBvbmUgZXh0cmEgcGFja2V0IGZvciBzYWZldHkgYWdhaW5zdCB1bmRlcnJ1bnMgKi8KKyAgICBzZWxmLT5uZXdfcGt0cyAgICA9IGF2X2ZpZm9fYWxsb2NfYXJyYXkoKEZJRk9fUEFDS0VUU19OVU0gKyAxKSwgc2l6ZW9mKEFWUGFja2V0KSk7CisgICAgaWYgKCh0ZXN0ID0gc3VwcGx5X25ld19wYWNrZXRzKHNlbGYsIGNvbnRleHQpKSkgeworICAgICAgICBqYWNrX2NsaWVudF9jbG9zZShzZWxmLT5jbGllbnQpOworICAgICAgICByZXR1cm4gdGVzdDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BrdF9maWZvKEFWRmlmb0J1ZmZlciAqKmZpZm8pCit7CisgICAgQVZQYWNrZXQgcGt0OworICAgIHdoaWxlIChhdl9maWZvX3NpemUoKmZpZm8pKSB7CisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKCpmaWZvLCAmcGt0LCBzaXplb2YocGt0KSwgTlVMTCk7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZwa3QpOworICAgIH0KKyAgICBhdl9maWZvX2ZyZWVwKGZpZm8pOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2phY2soSmFja0RhdGEgKnNlbGYpCit7CisgICAgaWYgKHNlbGYtPmNsaWVudCkgeworICAgICAgICBpZiAoc2VsZi0+YWN0aXZhdGVkKQorICAgICAgICAgICAgamFja19kZWFjdGl2YXRlKHNlbGYtPmNsaWVudCk7CisgICAgICAgIGphY2tfY2xpZW50X2Nsb3NlKHNlbGYtPmNsaWVudCk7CisgICAgfQorICAgIHNlbV9kZXN0cm95KCZzZWxmLT5wYWNrZXRfY291bnQpOworICAgIGZyZWVfcGt0X2ZpZm8oJnNlbGYtPm5ld19wa3RzKTsKKyAgICBmcmVlX3BrdF9maWZvKCZzZWxmLT5maWxsZWRfcGt0cyk7CisgICAgYXZfZnJlZXAoJnNlbGYtPnBvcnRzKTsKKyAgICBmZl90aW1lZmlsdGVyX2Rlc3Ryb3koc2VsZi0+dGltZWZpbHRlcik7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpjb250ZXh0KQoreworICAgIEphY2tEYXRhICpzZWxmID0gY29udGV4dC0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdHJlYW07CisgICAgaW50IHRlc3Q7CisKKyAgICBpZiAoKHRlc3QgPSBzdGFydF9qYWNrKGNvbnRleHQpKSkKKyAgICAgICAgcmV0dXJuIHRlc3Q7CisKKyAgICBzdHJlYW0gPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGNvbnRleHQsIE5VTEwpOworICAgIGlmICghc3RyZWFtKSB7CisgICAgICAgIHN0b3BfamFjayhzZWxmKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY19pZCAgICAgPSBBVl9DT0RFQ19JRF9QQ01fRjMyQkU7CisjZWxzZQorICAgIHN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkICAgICA9IEFWX0NPREVDX0lEX1BDTV9GMzJMRTsKKyNlbmRpZgorICAgIHN0cmVhbS0+Y29kZWMtPnNhbXBsZV9yYXRlICA9IHNlbGYtPnNhbXBsZV9yYXRlOworICAgIHN0cmVhbS0+Y29kZWMtPmNoYW5uZWxzICAgICA9IHNlbGYtPm5wb3J0czsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3RyZWFtLCA2NCwgMSwgMTAwMDAwMCk7ICAvKiA2NCBiaXRzIHB0cyBpbiB1cyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1ZGlvX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY29udGV4dCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBKYWNrRGF0YSAqc2VsZiA9IGNvbnRleHQtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZW91dCA9IHswLCAwfTsKKyAgICBpbnQgdGVzdDsKKworICAgIC8qIEFjdGl2YXRlIHRoZSBKQUNLIGNsaWVudCBvbiBmaXJzdCBwYWNrZXQgcmVhZC4gQWN0aXZhdGluZyB0aGUgSkFDSyBjbGllbnQKKyAgICAgKiBtZWFucyB0aGF0IHByb2Nlc3NfY2FsbGJhY2soKSBzdGFydHMgdG8gZ2V0IGNhbGxlZCBhdCByZWd1bGFyIGludGVydmFsLgorICAgICAqIElmIHdlIGFjdGl2YXRlIGl0IGluIGF1ZGlvX3JlYWRfaGVhZGVyKCksIHdlJ3JlIGFjdHVhbGx5IHJlYWRpbmcgYXVkaW8gZGF0YQorICAgICAqIGZyb20gdGhlIGRldmljZSBiZWZvcmUgaW5zdHJ1Y3RlZCB0bywgYW5kIHRoYXQgbWF5IHJlc3VsdCBpbiBhbiBvdmVycnVuLiAqLworICAgIGlmICghc2VsZi0+YWN0aXZhdGVkKSB7CisgICAgICAgIGlmICghamFja19hY3RpdmF0ZShzZWxmLT5jbGllbnQpKSB7CisgICAgICAgICAgICBzZWxmLT5hY3RpdmF0ZWQgPSAxOworICAgICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJKQUNLIGNsaWVudCByZWdpc3RlcmVkIGFuZCBhY3RpdmF0ZWQgKHJhdGU9JWRIeiwgYnVmZmVyX3NpemU9JWQgZnJhbWVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICBzZWxmLT5zYW1wbGVfcmF0ZSwgc2VsZi0+YnVmZmVyX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBhY3RpdmF0ZSBKQUNLIGNsaWVudFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogV2FpdCBmb3IgYSBwYWNrZXQgY29taW5nIGJhY2sgZnJvbSBwcm9jZXNzX2NhbGxiYWNrKCksIGlmIG9uZSBpc24ndCBhdmFpbGFibGUgeWV0ICovCisgICAgdGltZW91dC50dl9zZWMgPSBhdl9nZXR0aW1lKCkgLyAxMDAwMDAwICsgMjsKKyAgICBpZiAoc2VtX3RpbWVkd2FpdCgmc2VsZi0+cGFja2V0X2NvdW50LCAmdGltZW91dCkpIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVUSU1FRE9VVCkgeworICAgICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW5wdXQgZXJyb3I6IHRpbWVkIG91dCB3aGVuIHdhaXRpbmcgZm9yIEpBQ0sgcHJvY2VzcyBjYWxsYmFjayBvdXRwdXRcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgICAgIGludCByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgICAgIGF2X3N0cmVycm9yKHJldCwgZXJyYnVmLCBzaXplb2YoZXJyYnVmKSk7CisgICAgICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgYXVkaW8gcGFja2V0OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBlcnJidWYpOworICAgICAgICB9CisgICAgICAgIGlmICghc2VsZi0+Y2xpZW50KQorICAgICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIklucHV0IGVycm9yOiBKQUNLIHNlcnZlciBpcyBnb25lXG4iKTsKKworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGlmIChzZWxmLT5wa3RfeHJ1bikgeworICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX1dBUk5JTkcsICJBdWRpbyBwYWNrZXQgeHJ1blxuIik7CisgICAgICAgIHNlbGYtPnBrdF94cnVuID0gMDsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+amFja194cnVuKSB7CisgICAgICAgIGF2X2xvZyhjb250ZXh0LCBBVl9MT0dfV0FSTklORywgIkpBQ0sgeHJ1blxuIik7CisgICAgICAgIHNlbGYtPmphY2tfeHJ1biA9IDA7CisgICAgfQorCisgICAgLyogUmV0cmlldmUgdGhlIHBhY2tldCBmaWxsZWQgd2l0aCBhdWRpbyBkYXRhIGJ5IHByb2Nlc3NfY2FsbGJhY2soKSAqLworICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKHNlbGYtPmZpbGxlZF9wa3RzLCBwa3QsIHNpemVvZigqcGt0KSwgTlVMTCk7CisKKyAgICBpZiAoKHRlc3QgPSBzdXBwbHlfbmV3X3BhY2tldHMoc2VsZiwgY29udGV4dCkpKQorICAgICAgICByZXR1cm4gdGVzdDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1ZGlvX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpjb250ZXh0KQoreworICAgIEphY2tEYXRhICpzZWxmID0gY29udGV4dC0+cHJpdl9kYXRhOworICAgIHN0b3BfamFjayhzZWxmKTsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSmFja0RhdGEsIHgpCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImNoYW5uZWxzIiwgIk51bWJlciBvZiBhdWRpbyBjaGFubmVscy4iLCBPRkZTRVQobnBvcnRzKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAyIH0sIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBqYWNrX2luZGV2X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICA9ICJKQUNLIGluZGV2IiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICAgICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfQVVESU9fSU5QVVQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2phY2tfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiamFjayIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkpBQ0sgQXVkaW8gQ29ubmVjdGlvbiBLaXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSmFja0RhdGEpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGF1ZGlvX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGF1ZGlvX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGF1ZGlvX3JlYWRfY2xvc2UsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZqYWNrX2luZGV2X2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9sYXZmaS5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2xhdmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5OGVjZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9sYXZmaS5jCkBAIC0wLDAgKzEsNDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbGliYXZmaWx0ZXIgdmlydHVhbCBpbnB1dCBkZXZpY2UKKyAqLworCisvKiAjZGVmaW5lIERFQlVHICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPiAgICAgICAgICAgICAgLyogREJMX01JTiwgREJMX01BWCAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9maWxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2F2ZmlsdGVyLmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvYXZmaWx0ZXJncmFwaC5oIgorI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2J1ZmZlcnNpbmsuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsgICAgICAgICAgLy8vPCBjbGFzcyBmb3IgcHJpdmF0ZSBvcHRpb25zCisgICAgY2hhciAgICAgICAgICAqZ3JhcGhfc3RyOworICAgIGNoYXIgICAgICAgICAgKmdyYXBoX2ZpbGVuYW1lOworICAgIGNoYXIgICAgICAgICAgKmR1bXBfZ3JhcGg7CisgICAgQVZGaWx0ZXJHcmFwaCAqZ3JhcGg7CisgICAgQVZGaWx0ZXJDb250ZXh0ICoqc2lua3M7CisgICAgaW50ICpzaW5rX3N0cmVhbV9tYXA7CisgICAgaW50ICpzaW5rX2VvZjsKKyAgICBpbnQgKnN0cmVhbV9zaW5rX21hcDsKKyAgICBBVkZyYW1lICpkZWNvZGVkX2ZyYW1lOworfSBMYXZmaUNvbnRleHQ7CisKK3N0YXRpYyBpbnQgKmNyZWF0ZV9hbGxfZm9ybWF0cyhpbnQgbikKK3sKKyAgICBpbnQgaSwgaiwgKmZtdHMsIGNvdW50ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpKTsKKyAgICAgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCkpCisgICAgICAgICAgICBjb3VudCsrOworICAgIH0KKworICAgIGlmICghKGZtdHMgPSBhdl9tYWxsb2MoKGNvdW50KzEpICogc2l6ZW9mKGludCkpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChqID0gMCwgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpKTsKKyAgICAgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCkpCisgICAgICAgICAgICBmbXRzW2orK10gPSBpOworICAgIH0KKyAgICBmbXRzW2pdID0gLTE7CisgICAgcmV0dXJuIGZtdHM7Cit9CisKK2F2X2NvbGQgc3RhdGljIGludCBsYXZmaV9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgTGF2ZmlDb250ZXh0ICpsYXZmaSA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmbGF2ZmktPnNpbmtfc3RyZWFtX21hcCk7CisgICAgYXZfZnJlZXAoJmxhdmZpLT5zaW5rX2VvZik7CisgICAgYXZfZnJlZXAoJmxhdmZpLT5zdHJlYW1fc2lua19tYXApOworICAgIGF2X2ZyZWVwKCZsYXZmaS0+c2lua3MpOworICAgIGF2ZmlsdGVyX2dyYXBoX2ZyZWUoJmxhdmZpLT5ncmFwaCk7CisgICAgYXZfZnJhbWVfZnJlZSgmbGF2ZmktPmRlY29kZWRfZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgc3RhdGljIGludCBsYXZmaV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQoreworICAgIExhdmZpQ29udGV4dCAqbGF2ZmkgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRmlsdGVySW5PdXQgKmlucHV0X2xpbmtzID0gTlVMTCwgKm91dHB1dF9saW5rcyA9IE5VTEwsICppbm91dDsKKyAgICBBVkZpbHRlciAqYnVmZmVyc2luaywgKmFidWZmZXJzaW5rOworICAgIGludCAqcGl4X2ZtdHMgPSBjcmVhdGVfYWxsX2Zvcm1hdHMoQVZfUElYX0ZNVF9OQik7CisgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlOworICAgIGludCByZXQgPSAwLCBpLCBuOworCisjZGVmaW5lIEZBSUwoRVJSKSB7IHJldCA9IEVSUjsgZ290byBlbmQ7IH0KKworICAgIGlmICghcGl4X2ZtdHMpCisgICAgICAgIEZBSUwoQVZFUlJPUihFTk9NRU0pKTsKKworICAgIGF2ZmlsdGVyX3JlZ2lzdGVyX2FsbCgpOworCisgICAgYnVmZmVyc2luayA9IGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJidWZmZXJzaW5rIik7CisgICAgYWJ1ZmZlcnNpbmsgPSBhdmZpbHRlcl9nZXRfYnlfbmFtZSgiYWJ1ZmZlcnNpbmsiKTsKKworICAgIGlmIChsYXZmaS0+Z3JhcGhfZmlsZW5hbWUgJiYgbGF2ZmktPmdyYXBoX3N0cikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJPbmx5IG9uZSBvZiB0aGUgZ3JhcGggb3IgZ3JhcGhfZmlsZSBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgRkFJTChBVkVSUk9SKEVJTlZBTCkpOworICAgIH0KKworICAgIGlmIChsYXZmaS0+Z3JhcGhfZmlsZW5hbWUpIHsKKyAgICAgICAgQVZCUHJpbnQgZ3JhcGhfZmlsZV9wYjsKKyAgICAgICAgQVZJT0NvbnRleHQgKmF2aW8gPSBOVUxMOworICAgICAgICByZXQgPSBhdmlvX29wZW4oJmF2aW8sIGxhdmZpLT5ncmFwaF9maWxlbmFtZSwgQVZJT19GTEFHX1JFQUQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBhdl9icHJpbnRfaW5pdCgmZ3JhcGhfZmlsZV9wYiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKyAgICAgICAgcmV0ID0gYXZpb19yZWFkX3RvX2JwcmludChhdmlvLCAmZ3JhcGhfZmlsZV9wYiwgSU5UX01BWCk7CisgICAgICAgIGF2aW9fY2xvc2UoYXZpbyk7CisgICAgICAgIGF2X2JwcmludF9jaGFycygmZ3JhcGhfZmlsZV9wYiwgJ1wwJywgMSk7CisgICAgICAgIGlmICghcmV0ICYmICFhdl9icHJpbnRfaXNfY29tcGxldGUoJmdyYXBoX2ZpbGVfcGIpKQorICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmdyYXBoX2ZpbGVfcGIsIE5VTEwpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBhdl9icHJpbnRfZmluYWxpemUoJmdyYXBoX2ZpbGVfcGIsICZsYXZmaS0+Z3JhcGhfc3RyKSkpCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAoIWxhdmZpLT5ncmFwaF9zdHIpCisgICAgICAgIGxhdmZpLT5ncmFwaF9zdHIgPSBhdl9zdHJkdXAoYXZjdHgtPmZpbGVuYW1lKTsKKworICAgIC8qIHBhcnNlIHRoZSBncmFwaCwgY3JlYXRlIGEgc3RyZWFtIGZvciBlYWNoIG9wZW4gb3V0cHV0ICovCisgICAgaWYgKCEobGF2ZmktPmdyYXBoID0gYXZmaWx0ZXJfZ3JhcGhfYWxsb2MoKSkpCisgICAgICAgIEZBSUwoQVZFUlJPUihFTk9NRU0pKTsKKworICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfcGFyc2VfcHRyKGxhdmZpLT5ncmFwaCwgbGF2ZmktPmdyYXBoX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dF9saW5rcywgJm91dHB1dF9saW5rcywgYXZjdHgpKSA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgaWYgKGlucHV0X2xpbmtzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk9wZW4gaW5wdXRzIGluIHRoZSBmaWx0ZXJncmFwaCBhcmUgbm90IGFjY2VwdGFibGVcbiIpOworICAgICAgICBGQUlMKEFWRVJST1IoRUlOVkFMKSk7CisgICAgfQorCisgICAgLyogY291bnQgdGhlIG91dHB1dHMgKi8KKyAgICBmb3IgKG4gPSAwLCBpbm91dCA9IG91dHB1dF9saW5rczsgaW5vdXQ7IG4rKywgaW5vdXQgPSBpbm91dC0+bmV4dCk7CisKKyAgICBpZiAoIShsYXZmaS0+c2lua19zdHJlYW1fbWFwID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICogbikpKQorICAgICAgICBGQUlMKEFWRVJST1IoRU5PTUVNKSk7CisgICAgaWYgKCEobGF2ZmktPnNpbmtfZW9mID0gYXZfbWFsbG9jeihzaXplb2YoaW50KSAqIG4pKSkKKyAgICAgICAgRkFJTChBVkVSUk9SKEVOT01FTSkpOworICAgIGlmICghKGxhdmZpLT5zdHJlYW1fc2lua19tYXAgPSBhdl9tYWxsb2Moc2l6ZW9mKGludCkgKiBuKSkpCisgICAgICAgIEZBSUwoQVZFUlJPUihFTk9NRU0pKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGxhdmZpLT5zdHJlYW1fc2lua19tYXBbaV0gPSAtMTsKKworICAgIC8qIHBhcnNlIHRoZSBvdXRwdXQgbGluayBuYW1lcyAtIHRoZXkgbmVlZCB0byBiZSBvZiB0aGUgZm9ybSBvdXQwLCBvdXQxLCAuLi4KKyAgICAgKiBjcmVhdGUgYSBtYXBwaW5nIGJldHdlZW4gdGhlbSBhbmQgdGhlIHN0cmVhbXMgKi8KKyAgICBmb3IgKGkgPSAwLCBpbm91dCA9IG91dHB1dF9saW5rczsgaW5vdXQ7IGkrKywgaW5vdXQgPSBpbm91dC0+bmV4dCkgeworICAgICAgICBpbnQgc3RyZWFtX2lkeDsKKyAgICAgICAgaWYgKCFzdHJjbXAoaW5vdXQtPm5hbWUsICJvdXQiKSkKKyAgICAgICAgICAgIHN0cmVhbV9pZHggPSAwOworICAgICAgICBlbHNlIGlmIChzc2NhbmYoaW5vdXQtPm5hbWUsICJvdXQlZFxuIiwgJnN0cmVhbV9pZHgpICE9IDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwYWQgbmFtZSAnJXMnXG4iLCBpbm91dC0+bmFtZSk7CisgICAgICAgICAgICBGQUlMKEFWRVJST1IoRUlOVkFMKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHVuc2lnbmVkKXN0cmVhbV9pZHggPj0gbikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5kZXggd2FzIHNwZWNpZmllZCBpbiBvdXRwdXQgJyVzJywgIgorICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIHZhbHVlIDwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgaW5vdXQtPm5hbWUsIG4pOworICAgICAgICAgICAgRkFJTChBVkVSUk9SKEVJTlZBTCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhdmZpLT5zdHJlYW1fc2lua19tYXBbc3RyZWFtX2lkeF0gIT0gLTEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQW4gb3V0cHV0IHdpdGggc3RyZWFtIGluZGV4ICVkIHdhcyBhbHJlYWR5IHNwZWNpZmllZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlYW1faWR4KTsKKyAgICAgICAgICAgIEZBSUwoQVZFUlJPUihFSU5WQUwpKTsKKyAgICAgICAgfQorICAgICAgICBsYXZmaS0+c2lua19zdHJlYW1fbWFwW2ldID0gc3RyZWFtX2lkeDsKKyAgICAgICAgbGF2ZmktPnN0cmVhbV9zaW5rX21hcFtzdHJlYW1faWR4XSA9IGk7CisgICAgfQorCisgICAgLyogZm9yIGVhY2ggb3BlbiBvdXRwdXQgY3JlYXRlIGEgY29ycmVzcG9uZGluZyBzdHJlYW0gKi8KKyAgICBmb3IgKGkgPSAwLCBpbm91dCA9IG91dHB1dF9saW5rczsgaW5vdXQ7IGkrKywgaW5vdXQgPSBpbm91dC0+bmV4dCkgeworICAgICAgICBBVlN0cmVhbSAqc3Q7CisgICAgICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShhdmN0eCwgTlVMTCkpKQorICAgICAgICAgICAgRkFJTChBVkVSUk9SKEVOT01FTSkpOworICAgICAgICBzdC0+aWQgPSBpOworICAgIH0KKworICAgIC8qIGNyZWF0ZSBhIHNpbmsgZm9yIGVhY2ggb3V0cHV0IGFuZCBjb25uZWN0IHRoZW0gdG8gdGhlIGdyYXBoICovCisgICAgbGF2ZmktPnNpbmtzID0gYXZfbWFsbG9jX2FycmF5KGF2Y3R4LT5uYl9zdHJlYW1zLCBzaXplb2YoQVZGaWx0ZXJDb250ZXh0ICopKTsKKyAgICBpZiAoIWxhdmZpLT5zaW5rcykKKyAgICAgICAgRkFJTChBVkVSUk9SKEVOT01FTSkpOworCisgICAgZm9yIChpID0gMCwgaW5vdXQgPSBvdXRwdXRfbGlua3M7IGlub3V0OyBpKyssIGlub3V0ID0gaW5vdXQtPm5leHQpIHsKKyAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpzaW5rOworCisgICAgICAgIHR5cGUgPSBpbm91dC0+ZmlsdGVyX2N0eC0+b3V0cHV0X3BhZHNbaW5vdXQtPnBhZF9pZHhdLnR5cGU7CisKKyAgICAgICAgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmICEgYnVmZmVyc2luayB8fAorICAgICAgICAgICAgdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgISBhYnVmZmVyc2luaykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyByZXF1aXJlZCBidWZmZXJzaW5rIGZpbHRlciwgYWJvcnRpbmcuXG4iKTsKKyAgICAgICAgICAgICAgICBGQUlMKEFWRVJST1JfRklMVEVSX05PVF9GT1VORCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJnNpbmssIGJ1ZmZlcnNpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlub3V0LT5uYW1lLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBsYXZmaS0+Z3JhcGgpOworICAgICAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgICAgIHJldCA9IGF2X29wdF9zZXRfaW50X2xpc3Qoc2luaywgInBpeF9mbXRzIiwgcGl4X2ZtdHMsICBBVl9QSVhfRk1UX05PTkUsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsgQVZfU0FNUExFX0ZNVF9VOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkwsIC0xIH07CisKKyAgICAgICAgICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJnNpbmssIGFidWZmZXJzaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm91dC0+bmFtZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgbGF2ZmktPmdyYXBoKTsKKyAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICByZXQgPSBhdl9vcHRfc2V0X2ludF9saXN0KHNpbmssICJzYW1wbGVfZm10cyIsIHNhbXBsZV9mbXRzLCAgQVZfU0FNUExFX0ZNVF9OT05FLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgcmV0ID0gYXZfb3B0X3NldF9pbnQoc2luaywgImFsbF9jaGFubmVsX2NvdW50cyIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCAgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJPdXRwdXQgJyVzJyBpcyBub3QgYSB2aWRlbyBvciBhdWRpbyBvdXRwdXQsIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLCBpbm91dC0+bmFtZSk7CisgICAgICAgICAgICBGQUlMKEFWRVJST1IoRUlOVkFMKSk7CisgICAgICAgIH0KKworICAgICAgICBsYXZmaS0+c2lua3NbaV0gPSBzaW5rOworICAgICAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2xpbmsoaW5vdXQtPmZpbHRlcl9jdHgsIGlub3V0LT5wYWRfaWR4LCBzaW5rLCAwKSkgPCAwKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogY29uZmlndXJlIHRoZSBncmFwaCAqLworICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY29uZmlnKGxhdmZpLT5ncmFwaCwgYXZjdHgpKSA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgaWYgKGxhdmZpLT5kdW1wX2dyYXBoKSB7CisgICAgICAgIGNoYXIgKmR1bXAgPSBhdmZpbHRlcl9ncmFwaF9kdW1wKGxhdmZpLT5ncmFwaCwgbGF2ZmktPmR1bXBfZ3JhcGgpOworICAgICAgICBmcHV0cyhkdW1wLCBzdGRlcnIpOworICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAgYXZfZnJlZShkdW1wKTsKKyAgICB9CisKKyAgICAvKiBmaWxsIGVhY2ggc3RyZWFtIHdpdGggdGhlIGluZm9ybWF0aW9uIGluIHRoZSBjb3JyZXNwb25kaW5nIHNpbmsgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVkZpbHRlckxpbmsgKmxpbmsgPSBsYXZmaS0+c2lua3NbbGF2ZmktPnN0cmVhbV9zaW5rX21hcFtpXV0tPmlucHV0c1swXTsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZjdHgtPnN0cmVhbXNbaV07CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IGxpbmstPnR5cGU7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBsaW5rLT50aW1lX2Jhc2UubnVtLCBsaW5rLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgaWYgKGxpbmstPnR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCAgICA9IGxpbmstPmZvcm1hdDsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlICA9IGxpbmstPnRpbWVfYmFzZTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IGxpbmstPnc7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBsaW5rLT5oOworICAgICAgICAgICAgc3QgICAgICAgLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0KKyAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgICAgICBhdmN0eC0+cHJvYmVzaXplID0gRkZNQVgoYXZjdHgtPnByb2Jlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT53ICogbGluay0+aCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BhZGRlZF9iaXRzX3Blcl9waXhlbChhdl9waXhfZm10X2Rlc2NfZ2V0KGxpbmstPmZvcm1hdCkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCk7CisgICAgICAgIH0gZWxzZSBpZiAobGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBhdl9nZXRfcGNtX2NvZGVjKGxpbmstPmZvcm1hdCwgLTEpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IGF2ZmlsdGVyX2xpbmtfZ2V0X2NoYW5uZWxzKGxpbmspOworICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfZm10ICA9IGxpbmstPmZvcm1hdDsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBsaW5rLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlICAgPSBsaW5rLT50aW1lX2Jhc2U7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gbGluay0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgUENNIGNvZGVjIGZvciBzYW1wbGUgZm9ybWF0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShsaW5rLT5mb3JtYXQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghKGxhdmZpLT5kZWNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCisgICAgICAgIEZBSUwoQVZFUlJPUihFTk9NRU0pKTsKKworZW5kOgorICAgIGF2X2ZyZWUocGl4X2ZtdHMpOworICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJmlucHV0X2xpbmtzKTsKKyAgICBhdmZpbHRlcl9pbm91dF9mcmVlKCZvdXRwdXRfbGlua3MpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBsYXZmaV9yZWFkX2Nsb3NlKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxhdmZpX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTGF2ZmlDb250ZXh0ICpsYXZmaSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZG91YmxlIG1pbl9wdHMgPSBEQkxfTUFYOworICAgIGludCBzdHJlYW1faWR4LCBtaW5fcHRzX3NpbmtfaWR4ID0gMDsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGxhdmZpLT5kZWNvZGVkX2ZyYW1lOworICAgIEFWUGljdHVyZSBwaWN0OworICAgIEFWRGljdGlvbmFyeSAqZnJhbWVfbWV0YWRhdGE7CisgICAgaW50IHJldCwgaTsKKyAgICBpbnQgc2l6ZSA9IDA7CisKKyAgICAvKiBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBncmFwaCBzaW5rcy4gU2VsZWN0IHRoZSBzaW5rIHdpdGggdGhlCisgICAgICogbWluaW11bSBQVFMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlJhdGlvbmFsIHRiID0gbGF2ZmktPnNpbmtzW2ldLT5pbnB1dHNbMF0tPnRpbWVfYmFzZTsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKGxhdmZpLT5zaW5rX2VvZltpXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHJldCA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lX2ZsYWdzKGxhdmZpLT5zaW5rc1tpXSwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0JVRkZFUlNJTktfRkxBR19QRUVLKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgYXZfZGxvZyhhdmN0eCwgIkVPRiBzaW5rX2lkeDolZFxuIiwgaSk7CisgICAgICAgICAgICBsYXZmaS0+c2lua19lb2ZbaV0gPSAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGQgPSBhdl9yZXNjYWxlX3EoZnJhbWUtPnB0cywgdGIsIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgYXZfZGxvZyhhdmN0eCwgInNpbmtfaWR4OiVkIHRpbWU6JWZcbiIsIGksIGQpOworICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisKKyAgICAgICAgaWYgKGQgPCBtaW5fcHRzKSB7CisgICAgICAgICAgICBtaW5fcHRzID0gZDsKKyAgICAgICAgICAgIG1pbl9wdHNfc2lua19pZHggPSBpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtaW5fcHRzID09IERCTF9NQVgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGF2X2Rsb2coYXZjdHgsICJtaW5fcHRzX3NpbmtfaWR4OiVpXG4iLCBtaW5fcHRzX3NpbmtfaWR4KTsKKworICAgIGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lX2ZsYWdzKGxhdmZpLT5zaW5rc1ttaW5fcHRzX3NpbmtfaWR4XSwgZnJhbWUsIDApOworICAgIHN0cmVhbV9pZHggPSBsYXZmaS0+c2lua19zdHJlYW1fbWFwW21pbl9wdHNfc2lua19pZHhdOworCisgICAgaWYgKGZyYW1lLT53aWR0aCAvKiBGSVhNRSBiZXN0IHdheSBvZiB0ZXN0aW5nIGEgdmlkZW8gKi8pIHsKKyAgICAgICAgc2l6ZSA9IGF2cGljdHVyZV9nZXRfc2l6ZShmcmFtZS0+Zm9ybWF0LCBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQpOworICAgICAgICBpZiAoKHJldCA9IGF2X25ld19wYWNrZXQocGt0LCBzaXplKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBtZW1jcHkocGljdC5kYXRhLCAgICAgZnJhbWUtPmRhdGEsICAgICA0KnNpemVvZihmcmFtZS0+ZGF0YVswXSkpOworICAgICAgICBtZW1jcHkocGljdC5saW5lc2l6ZSwgZnJhbWUtPmxpbmVzaXplLCA0KnNpemVvZihmcmFtZS0+bGluZXNpemVbMF0pKTsKKworICAgICAgICBhdnBpY3R1cmVfbGF5b3V0KCZwaWN0LCBmcmFtZS0+Zm9ybWF0LCBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5kYXRhLCBzaXplKTsKKyAgICB9IGVsc2UgaWYgKGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSkgLyogRklYTUUgdGVzdCBhdWRpbyAqLykgeworICAgICAgICBzaXplID0gZnJhbWUtPm5iX3NhbXBsZXMgKiBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShmcmFtZS0+Zm9ybWF0KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSk7CisgICAgICAgIGlmICgocmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIHNpemUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBmcmFtZS0+ZGF0YVswXSwgc2l6ZSk7CisgICAgfQorCisgICAgZnJhbWVfbWV0YWRhdGEgPSBhdl9mcmFtZV9nZXRfbWV0YWRhdGEoZnJhbWUpOworICAgIGlmIChmcmFtZV9tZXRhZGF0YSkgeworICAgICAgICB1aW50OF90ICptZXRhZGF0YTsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmUgPSBOVUxMOworICAgICAgICBBVkJQcmludCBtZXRhX2J1ZjsKKworICAgICAgICBhdl9icHJpbnRfaW5pdCgmbWV0YV9idWYsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KGZyYW1lX21ldGFkYXRhLCAiIiwgZSwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgICAgIGF2X2JwcmludGYoJm1ldGFfYnVmLCAiJXMiLCBlLT5rZXkpOworICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKCZtZXRhX2J1ZiwgJ1wwJywgMSk7CisgICAgICAgICAgICBhdl9icHJpbnRmKCZtZXRhX2J1ZiwgIiVzIiwgZS0+dmFsdWUpOworICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKCZtZXRhX2J1ZiwgJ1wwJywgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhdl9icHJpbnRfaXNfY29tcGxldGUoJm1ldGFfYnVmKSB8fAorICAgICAgICAgICAgIShtZXRhZGF0YSA9IGF2X3BhY2tldF9uZXdfc2lkZV9kYXRhKHBrdCwgQVZfUEtUX0RBVEFfU1RSSU5HU19NRVRBREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2J1Zi5sZW4pKSkgeworICAgICAgICAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZtZXRhX2J1ZiwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIG1lbWNweShtZXRhZGF0YSwgbWV0YV9idWYuc3RyLCBtZXRhX2J1Zi5sZW4pOworICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJm1ldGFfYnVmLCBOVUxMKTsKKyAgICB9CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0cmVhbV9pZHg7CisgICAgcGt0LT5wdHMgPSBmcmFtZS0+cHRzOworICAgIHBrdC0+cG9zID0gYXZfZnJhbWVfZ2V0X3BrdF9wb3MoZnJhbWUpOworICAgIHBrdC0+c2l6ZSA9IHNpemU7CisgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOworICAgIHJldHVybiBzaXplOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihMYXZmaUNvbnRleHQsIHgpCisKKyNkZWZpbmUgREVDIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiZ3JhcGgiLCAgICAgInNldCBsaWJhdmZpbHRlciBncmFwaCIsIE9GRlNFVChncmFwaF9zdHIpLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBERUMgfSwKKyAgICB7ICJncmFwaF9maWxlIiwic2V0IGxpYmF2ZmlsdGVyIGdyYXBoIGZpbGVuYW1lIiwgT0ZGU0VUKGdyYXBoX2ZpbGVuYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBERUN9LAorICAgIHsgImR1bXBncmFwaCIsICJkdW1wIGdyYXBoIHRvIHN0ZGVyciIsICBPRkZTRVQoZHVtcF9ncmFwaCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgREVDIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBsYXZmaV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJsYXZmaSBpbmRldiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfSU5QVVQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2xhdmZpX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxhdmZpIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTGliYXZmaWx0ZXIgdmlydHVhbCBpbnB1dCBkZXZpY2UiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTGF2ZmlDb250ZXh0KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBsYXZmaV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBsYXZmaV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBsYXZmaV9yZWFkX2Nsb3NlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmbGF2ZmlfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2xpYmF2ZGV2aWNlLnYgYi9mZm1wZWcvbGliYXZkZXZpY2UvbGliYXZkZXZpY2UudgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTcyNzhjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2xpYmF2ZGV2aWNlLnYKQEAgLTAsMCArMSw0IEBACitMSUJBVkRFVklDRV8kTUFKT1IgeworICAgICAgICBnbG9iYWw6IGF2ZGV2aWNlXyo7IGF2Xyo7CisgICAgICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9saWJjZGlvLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvbGliY2Rpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTRiMjYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvbGliY2Rpby5jCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEFudG9uIEtoaXJub3YgPGFudG9uQGtoaXJub3YubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBsaWJjZGlvIENEIGdyYWJiaW5nCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgSEFWRV9DRElPX1BBUkFOT0lBX0gKKyNpbmNsdWRlIDxjZGlvL2NkZGEuaD4KKyNpbmNsdWRlIDxjZGlvL3BhcmFub2lhLmg+CisjZWxpZiBIQVZFX0NESU9fUEFSQU5PSUFfUEFSQU5PSUFfSAorI2luY2x1ZGUgPGNkaW8vcGFyYW5vaWEvY2RkYS5oPgorI2luY2x1ZGUgPGNkaW8vcGFyYW5vaWEvcGFyYW5vaWEuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IENESU9Db250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICAgICAgICpjbGFzczsKKyAgICBjZHJvbV9kcml2ZV90ICAgICAgICpkcml2ZTsKKyAgICBjZHJvbV9wYXJhbm9pYV90ICpwYXJhbm9pYTsKKyAgICBpbnQzMl90IGxhc3Rfc2VjdG9yOworCisgICAgLyogcHJpdmF0ZSBvcHRpb25zICovCisgICAgaW50IHNwZWVkOworICAgIGludCBwYXJhbm9pYV9tb2RlOworfSBDRElPQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IHJlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqY3R4KQoreworICAgIENESU9Db250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCByZXQsIGk7CisgICAgY2hhciAqZXJyID0gTlVMTDsKKworICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjdHgsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzLT5kcml2ZSA9IGNkaW9fY2RkYXBfaWRlbnRpZnkoY3R4LT5maWxlbmFtZSwgQ0REQV9NRVNTQUdFX0xPR0lULCAmZXJyKTsKKyAgICBpZiAoIXMtPmRyaXZlKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBvcGVuIGRyaXZlICVzLlxuIiwgY3R4LT5maWxlbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmIChlcnIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIlc1xuIiwgZXJyKTsKKyAgICAgICAgZnJlZShlcnIpOworICAgIH0KKyAgICBpZiAoKHJldCA9IGNkaW9fY2RkYXBfb3BlbihzLT5kcml2ZSkpIDwgMCB8fCAhcy0+ZHJpdmUtPm9wZW5lZCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgb3BlbiBkaXNrIGluIGRyaXZlICVzLlxuIiwgY3R4LT5maWxlbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgY2Rpb19jZGRhcF92ZXJib3NlX3NldChzLT5kcml2ZSwgQ0REQV9NRVNTQUdFX0xPR0lULCBDRERBX01FU1NBR0VfTE9HSVQpOworICAgIGlmIChzLT5zcGVlZCkKKyAgICAgICAgY2Rpb19jZGRhcF9zcGVlZF9zZXQocy0+ZHJpdmUsIHMtPnNwZWVkKTsKKworICAgIHMtPnBhcmFub2lhID0gY2Rpb19wYXJhbm9pYV9pbml0KHMtPmRyaXZlKTsKKyAgICBpZiAoIXMtPnBhcmFub2lhKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBpbml0IHBhcmFub2lhLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGNkaW9fcGFyYW5vaWFfbW9kZXNldChzLT5wYXJhbm9pYSwgcy0+cGFyYW5vaWFfbW9kZSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBpZiAocy0+ZHJpdmUtPmJpZ2VuZGlhbnApCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU7CisgICAgZWxzZQorICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgID0gNDQxMDA7CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgPSAyOworICAgIGlmIChzLT5kcml2ZS0+YXVkaW9fbGFzdF9zZWN0b3IgIT0gQ0RJT19JTlZBTElEX0xTTiAmJgorICAgICAgICBzLT5kcml2ZS0+YXVkaW9fZmlyc3Rfc2VjdG9yICE9IENESU9fSU5WQUxJRF9MU04pCisgICAgICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICAgPSBzLT5kcml2ZS0+YXVkaW9fbGFzdF9zZWN0b3IgLSBzLT5kcml2ZS0+YXVkaW9fZmlyc3Rfc2VjdG9yOworICAgIGVsc2UgaWYgKHMtPmRyaXZlLT50cmFja3MpCisgICAgICAgIHN0LT5kdXJhdGlvbiA9IHMtPmRyaXZlLT5kaXNjX3RvY1tzLT5kcml2ZS0+dHJhY2tzXS5kd1N0YXJ0U2VjdG9yOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBDRElPX0NEX0ZSQU1FU0laRV9SQVcsIDIqc3QtPmNvZGVjLT5jaGFubmVscypzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5kcml2ZS0+dHJhY2tzOyBpKyspIHsKKyAgICAgICAgY2hhciB0aXRsZVsxNl07CisgICAgICAgIHNucHJpbnRmKHRpdGxlLCBzaXplb2YodGl0bGUpLCAidHJhY2sgJTAyZCIsIHMtPmRyaXZlLT5kaXNjX3RvY1tpXS5iVHJhY2spOworICAgICAgICBhdnByaXZfbmV3X2NoYXB0ZXIoY3R4LCBpLCBzdC0+dGltZV9iYXNlLCBzLT5kcml2ZS0+ZGlzY190b2NbaV0uZHdTdGFydFNlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHJpdmUtPmRpc2NfdG9jW2krMV0uZHdTdGFydFNlY3RvciwgdGl0bGUpOworICAgIH0KKworICAgIHMtPmxhc3Rfc2VjdG9yID0gY2Rpb19jZGRhcF9kaXNjX2xhc3RzZWN0b3Iocy0+ZHJpdmUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQ0RJT0NvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworICAgIHVpbnQxNl90ICpidWY7CisgICAgY2hhciAqZXJyID0gTlVMTDsKKworICAgIGlmIChjdHgtPnN0cmVhbXNbMF0tPmN1cl9kdHMgPiBzLT5sYXN0X3NlY3RvcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgYnVmID0gY2Rpb19wYXJhbm9pYV9yZWFkKHMtPnBhcmFub2lhLCBOVUxMKTsKKyAgICBpZiAoIWJ1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgaWYgKGVyciA9IGNkaW9fY2RkYXBfZXJyb3JzKHMtPmRyaXZlKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICIlc1xuIiwgZXJyKTsKKyAgICAgICAgZnJlZShlcnIpOworICAgICAgICBlcnIgPSBOVUxMOworICAgIH0KKyAgICBpZiAoZXJyID0gY2Rpb19jZGRhcF9tZXNzYWdlcyhzLT5kcml2ZSkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIlc1xuIiwgZXJyKTsKKyAgICAgICAgZnJlZShlcnIpOworICAgICAgICBlcnIgPSBOVUxMOworICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIENESU9fQ0RfRlJBTUVTSVpFX1JBVykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBtZW1jcHkocGt0LT5kYXRhLCBidWYsIENESU9fQ0RfRlJBTUVTSVpFX1JBVyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCByZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqY3R4KQoreworICAgIENESU9Db250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgY2Rpb19wYXJhbm9pYV9mcmVlKHMtPnBhcmFub2lhKTsKKyAgICBjZGlvX2NkZGFwX2Nsb3NlKHMtPmRyaXZlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpjdHgsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIENESU9Db250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gY3R4LT5zdHJlYW1zWzBdOworCisgICAgY2Rpb19wYXJhbm9pYV9zZWVrKHMtPnBhcmFub2lhLCB0aW1lc3RhbXAsIFNFRUtfU0VUKTsKKyAgICBzdC0+Y3VyX2R0cyA9IHRpbWVzdGFtcDsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ0RJT0NvbnRleHQsIHgpCisjZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJzcGVlZCIsICAgICAgICAgICAgICAiRHJpdmUgcmVhZGluZyBzcGVlZC4iLCBPRkZTRVQoc3BlZWQpLCAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwIH0sIDAsICAgICAgIElOVF9NQVgsIERFQyB9LAorICAgIHsgInBhcmFub2lhX21vZGUiLCAgICAgICJFcnJvciByZWNvdmVyeSBtb2RlLiIsIE9GRlNFVChwYXJhbm9pYV9tb2RlKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsgLmk2NCA9IDAgfSwgSU5UX01JTiwgSU5UX01BWCwgREVDLCAicGFyYW5vaWFfbW9kZSIgfSwKKyAgICAgICAgeyAidmVyaWZ5IiwgICAgICAgICAiVmVyaWZ5IGRhdGEgaW50ZWdyaXR5IGluIG92ZXJsYXAgYXJlYSIsIDAsICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQQVJBTk9JQV9NT0RFX1ZFUklGWSB9LCAgICAwLCAwLCBERUMsICJwYXJhbm9pYV9tb2RlIiB9LAorICAgICAgICB7ICJvdmVybGFwIiwgICAgICAgICJQZXJmb3JtIG92ZXJsYXBwZWQgcmVhZHMuIiwgICAgICAgICAgICAgMCwgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBBUkFOT0lBX01PREVfT1ZFUkxBUCB9LCAgIDAsIDAsIERFQywgInBhcmFub2lhX21vZGUiIH0sCisgICAgICAgIHsgIm5ldmVyc2tpcCIsICAgICAgIkRvIG5vdCBza2lwIGZhaWxlZCByZWFkcy4iLCAgICAgICAgICAgICAwLCAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUEFSQU5PSUFfTU9ERV9ORVZFUlNLSVAgfSwgMCwgMCwgREVDLCAicGFyYW5vaWFfbW9kZSIgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGxpYmNkaW9fY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibGliY2RpbyBpbmRldiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfQVVESU9fSU5QVVQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2xpYmNkaW9fZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGliY2RpbyIsCisgICAgLnJlYWRfaGVhZGVyICAgID0gcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gcmVhZF9jbG9zZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSByZWFkX3NlZWssCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENESU9Db250ZXh0KSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmxpYmNkaW9fY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL2xpYmRjMTM5NC5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL2xpYmRjMTM5NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YmQ0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvbGliZGMxMzk0LmMKQEAgLTAsMCArMSw0MjEgQEAKKy8qCisgKiBJSURDMTM5NCBncmFiIGludGVyZmFjZSAodXNlcyBsaWJkYzEzOTQgYW5kIGxpYnJhdzEzOTQpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgUm9tYW4gU2hhcG9zaG5paworICogQ29weXJpZ2h0IChjKSAyMDA4IEFsZXNzYW5kcm8gU2FwcGlhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpZiBIQVZFX0xJQkRDMTM5NF8yCisjaW5jbHVkZSA8ZGMxMzk0L2RjMTM5NC5oPgorI2VsaWYgSEFWRV9MSUJEQzEzOTRfMQorI2luY2x1ZGUgPGxpYnJhdzEzOTQvcmF3MTM5NC5oPgorI2luY2x1ZGUgPGxpYmRjMTM5NC9kYzEzOTRfY29udHJvbC5oPgorCisjZGVmaW5lIERDMTM5NF9WSURFT19NT0RFXzMyMHgyNDBfWVVWNDIyIE1PREVfMzIweDI0MF9ZVVY0MjIKKyNkZWZpbmUgREMxMzk0X1ZJREVPX01PREVfNjQweDQ4MF9ZVVY0MTEgTU9ERV82NDB4NDgwX1lVVjQxMQorI2RlZmluZSBEQzEzOTRfVklERU9fTU9ERV82NDB4NDgwX1lVVjQyMiBNT0RFXzY0MHg0ODBfWVVWNDIyCisjZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfMV84NzUgRlJBTUVSQVRFXzFfODc1CisjZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfM183NSAgRlJBTUVSQVRFXzNfNzUKKyNkZWZpbmUgREMxMzk0X0ZSQU1FUkFURV83XzUgICBGUkFNRVJBVEVfN181CisjZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfMTUgICAgRlJBTUVSQVRFXzE1CisjZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfMzAgICAgRlJBTUVSQVRFXzMwCisjZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfNjAgICAgRlJBTUVSQVRFXzYwCisjZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfMTIwICAgRlJBTUVSQVRFXzEyMAorI2RlZmluZSBEQzEzOTRfRlJBTUVSQVRFXzI0MCAgIEZSQU1FUkFURV8yNDAKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBkYzEzOTRfZGF0YSB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisjaWYgSEFWRV9MSUJEQzEzOTRfMQorICAgIHJhdzEzOTRoYW5kbGVfdCBoYW5kbGU7CisgICAgZGMxMzk0X2NhbWVyYWNhcHR1cmUgY2FtZXJhOworICAgIGludCBjaGFubmVsOworI2VsaWYgSEFWRV9MSUJEQzEzOTRfMgorICAgIGRjMTM5NF90ICpkOworICAgIGRjMTM5NGNhbWVyYV90ICpjYW1lcmE7CisgICAgZGMxMzk0dmlkZW9fZnJhbWVfdCAqZnJhbWU7CisjZW5kaWYKKyAgICBpbnQgY3VycmVudF9mcmFtZTsKKyAgICBpbnQgIGZyYW1lX3JhdGU7ICAgICAgICAvKio8IGZyYW1lcyBwZXIgMTAwMCBzZWNvbmRzIChmcHMgKiAxMDAwKSAqLworICAgIGNoYXIgKnZpZGVvX3NpemU7ICAgICAgIC8qKjwgU3RyaW5nIGRlc2NyaWJpbmcgdmlkZW8gc2l6ZSwgc2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uICovCisgICAgY2hhciAqcGl4ZWxfZm9ybWF0OyAgICAgLyoqPCBTZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4gKi8KKyAgICBjaGFyICpmcmFtZXJhdGU7ICAgICAgICAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLworCisgICAgQVZQYWNrZXQgcGFja2V0OworfSBkYzEzOTRfZGF0YTsKKworc3RydWN0IGRjMTM5NF9mcmFtZV9mb3JtYXQgeworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworICAgIGludCBmcmFtZV9zaXplX2lkOworfSBkYzEzOTRfZnJhbWVfZm9ybWF0c1tdID0geworICAgIHsgMzIwLCAyNDAsIEFWX1BJWF9GTVRfVVlWWTQyMiwgICBEQzEzOTRfVklERU9fTU9ERV8zMjB4MjQwX1lVVjQyMiB9LAorICAgIHsgNjQwLCA0ODAsIEFWX1BJWF9GTVRfVVlZVllZNDExLCBEQzEzOTRfVklERU9fTU9ERV82NDB4NDgwX1lVVjQxMSB9LAorICAgIHsgNjQwLCA0ODAsIEFWX1BJWF9GTVRfVVlWWTQyMiwgICBEQzEzOTRfVklERU9fTU9ERV82NDB4NDgwX1lVVjQyMiB9LAorICAgIHsgMCwgMCwgMCwgMCB9IC8qIGdvdHRhIGJlIHRoZSBsYXN0IG9uZSAqLworfTsKKworc3RydWN0IGRjMTM5NF9mcmFtZV9yYXRlIHsKKyAgICBpbnQgZnJhbWVfcmF0ZTsKKyAgICBpbnQgZnJhbWVfcmF0ZV9pZDsKK30gZGMxMzk0X2ZyYW1lX3JhdGVzW10gPSB7CisgICAgeyAgMTg3NSwgREMxMzk0X0ZSQU1FUkFURV8xXzg3NSB9LAorICAgIHsgIDM3NTAsIERDMTM5NF9GUkFNRVJBVEVfM183NSAgfSwKKyAgICB7ICA3NTAwLCBEQzEzOTRfRlJBTUVSQVRFXzdfNSAgIH0sCisgICAgeyAxNTAwMCwgREMxMzk0X0ZSQU1FUkFURV8xNSAgICB9LAorICAgIHsgMzAwMDAsIERDMTM5NF9GUkFNRVJBVEVfMzAgICAgfSwKKyAgICB7IDYwMDAwLCBEQzEzOTRfRlJBTUVSQVRFXzYwICAgIH0sCisgICAgezEyMDAwMCwgREMxMzk0X0ZSQU1FUkFURV8xMjAgICB9LAorICAgIHsyNDAwMDAsIERDMTM5NF9GUkFNRVJBVEVfMjQwICAgIH0sCisgICAgeyAwLCAwIH0gLyogZ290dGEgYmUgdGhlIGxhc3Qgb25lICovCit9OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihkYzEzOTRfZGF0YSwgeCkKKyNkZWZpbmUgREVDIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworI2lmIEhBVkVfTElCREMxMzk0XzEKKyAgICB7ICJjaGFubmVsIiwgIiIsIG9mZnNldG9mKGRjMTM5NF9kYXRhLCBjaGFubmVsKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorI2VuZGlmCisgICAgeyAidmlkZW9fc2l6ZSIsICJBIHN0cmluZyBkZXNjcmliaW5nIGZyYW1lIHNpemUsIHN1Y2ggYXMgNjQweDQ4MCBvciBoZDcyMC4iLCBPRkZTRVQodmlkZW9fc2l6ZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAicXZnYSJ9LCAwLCAwLCBERUMgfSwKKyAgICB7ICJwaXhlbF9mb3JtYXQiLCAiIiwgT0ZGU0VUKHBpeGVsX2Zvcm1hdCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAidXl2eTQyMiJ9LCAwLCAwLCBERUMgfSwKKyAgICB7ICJmcmFtZXJhdGUiLCAiIiwgT0ZGU0VUKGZyYW1lcmF0ZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAibnRzYyJ9LCAwLCAwLCBERUMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGxpYmRjMTM5NF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJsaWJkYzEzOTQgaW5kZXYiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX0lOUFVULAorfTsKKworCitzdGF0aWMgaW5saW5lIGludCBkYzEzOTRfcmVhZF9jb21tb24oQVZGb3JtYXRDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkYzEzOTRfZnJhbWVfZm9ybWF0ICoqc2VsZWN0X2ZtdCwgc3RydWN0IGRjMTM5NF9mcmFtZV9yYXRlICoqc2VsZWN0X2ZwcykKK3sKKyAgICBkYzEzOTRfZGF0YSogZGMxMzk0ID0gYy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtKiB2c3Q7CisgICAgc3RydWN0IGRjMTM5NF9mcmFtZV9mb3JtYXQgKmZtdDsKKyAgICBzdHJ1Y3QgZGMxMzk0X2ZyYW1lX3JhdGUgKmZwczsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmICgocGl4X2ZtdCA9IGF2X2dldF9waXhfZm10KGRjMTM5NC0+cGl4ZWxfZm9ybWF0KSkgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJObyBzdWNoIHBpeGVsIGZvcm1hdDogJXMuXG4iLCBkYzEzOTQtPnBpeGVsX2Zvcm1hdCk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9wYXJzZV92aWRlb19zaXplKCZ3aWR0aCwgJmhlaWdodCwgZGMxMzk0LT52aWRlb19zaXplKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgcGFyc2UgdmlkZW8gc2l6ZSAnJXMnLlxuIiwgZGMxMzk0LT52aWRlb19zaXplKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGlmICgocmV0ID0gYXZfcGFyc2VfdmlkZW9fcmF0ZSgmZnJhbWVyYXRlLCBkYzEzOTQtPmZyYW1lcmF0ZSkpIDwgMCkgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHBhcnNlIGZyYW1lcmF0ZSAnJXMnLlxuIiwgZGMxMzk0LT5mcmFtZXJhdGUpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgZGMxMzk0LT5mcmFtZV9yYXRlID0gYXZfcmVzY2FsZSgxMDAwLCBmcmFtZXJhdGUubnVtLCBmcmFtZXJhdGUuZGVuKTsKKworICAgIGZvciAoZm10ID0gZGMxMzk0X2ZyYW1lX2Zvcm1hdHM7IGZtdC0+d2lkdGg7IGZtdCsrKQorICAgICAgICAgaWYgKGZtdC0+cGl4X2ZtdCA9PSBwaXhfZm10ICYmIGZtdC0+d2lkdGggPT0gd2lkdGggJiYgZm10LT5oZWlnaHQgPT0gaGVpZ2h0KQorICAgICAgICAgICAgIGJyZWFrOworCisgICAgZm9yIChmcHMgPSBkYzEzOTRfZnJhbWVfcmF0ZXM7IGZwcy0+ZnJhbWVfcmF0ZTsgZnBzKyspCisgICAgICAgICBpZiAoZnBzLT5mcmFtZV9yYXRlID09IGRjMTM5NC0+ZnJhbWVfcmF0ZSkKKyAgICAgICAgICAgICBicmVhazsKKworICAgIGlmICghZnBzLT5mcmFtZV9yYXRlIHx8ICFmbXQtPndpZHRoKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJDYW4ndCBmaW5kIG1hdGNoaW5nIGNhbWVyYSBmb3JtYXQgZm9yICVzLCAlZHglZEAlZDoxMDAwZnBzXG4iLCBhdl9nZXRfcGl4X2ZtdF9uYW1lKHBpeF9mbXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZGMxMzk0LT5mcmFtZV9yYXRlKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgYSB2aWRlbyBzdHJlYW0gKi8KKyAgICB2c3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGMsIE5VTEwpOworICAgIGlmICghdnN0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgMSwgMTAwMCk7CisgICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIHZzdC0+Y29kZWMtPnRpbWVfYmFzZS5kZW4gPSBmcmFtZXJhdGUubnVtOworICAgIHZzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW0gPSBmcmFtZXJhdGUuZGVuOworICAgIHZzdC0+Y29kZWMtPndpZHRoID0gZm10LT53aWR0aDsKKyAgICB2c3QtPmNvZGVjLT5oZWlnaHQgPSBmbXQtPmhlaWdodDsKKyAgICB2c3QtPmNvZGVjLT5waXhfZm10ID0gZm10LT5waXhfZm10OworCisgICAgLyogcGFja2V0IGluaXQgKi8KKyAgICBhdl9pbml0X3BhY2tldCgmZGMxMzk0LT5wYWNrZXQpOworICAgIGRjMTM5NC0+cGFja2V0LnNpemUgPSBhdnBpY3R1cmVfZ2V0X3NpemUoZm10LT5waXhfZm10LCBmbXQtPndpZHRoLCBmbXQtPmhlaWdodCk7CisgICAgZGMxMzk0LT5wYWNrZXQuc3RyZWFtX2luZGV4ID0gdnN0LT5pbmRleDsKKyAgICBkYzEzOTQtPnBhY2tldC5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICBkYzEzOTQtPmN1cnJlbnRfZnJhbWUgPSAwOworCisgICAgdnN0LT5jb2RlYy0+Yml0X3JhdGUgPSBhdl9yZXNjYWxlKGRjMTM5NC0+cGFja2V0LnNpemUgKiA4LCBmcHMtPmZyYW1lX3JhdGUsIDEwMDApOworICAgICpzZWxlY3RfZnBzID0gZnBzOworICAgICpzZWxlY3RfZm10ID0gZm10Oworb3V0OgorICAgIHJldHVybiByZXQ7Cit9CisKKyNpZiBIQVZFX0xJQkRDMTM5NF8xCitzdGF0aWMgaW50IGRjMTM5NF92MV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmMpCit7CisgICAgZGMxMzk0X2RhdGEqIGRjMTM5NCA9IGMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSogdnN0OworICAgIG5vZGVpZF90KiBjYW1lcmFfbm9kZXM7CisgICAgaW50IHJlczsKKyAgICBzdHJ1Y3QgZGMxMzk0X2ZyYW1lX2Zvcm1hdCAqZm10ID0gTlVMTDsKKyAgICBzdHJ1Y3QgZGMxMzk0X2ZyYW1lX3JhdGUgKmZwcyA9IE5VTEw7CisKKyAgICBpZiAoZGMxMzk0X3JlYWRfY29tbW9uKGMsICZmbXQsICZmcHMpICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIE5vdyBsZXQgdXMgcHJlcCB0aGUgaGFyZHdhcmUuICovCisgICAgZGMxMzk0LT5oYW5kbGUgPSBkYzEzOTRfY3JlYXRlX2hhbmRsZSgwKTsgLyogRklYTUU6IGdvdHRhIGhhdmUgYXAtPnBvcnQgKi8KKyAgICBpZiAoIWRjMTM5NC0+aGFuZGxlKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJDYW4ndCBhY3F1aXJlIGRjMTM5NCBoYW5kbGUgb24gcG9ydCAlZFxuIiwgMCAvKiBhcC0+cG9ydCAqLyk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBjYW1lcmFfbm9kZXMgPSBkYzEzOTRfZ2V0X2NhbWVyYV9ub2RlcyhkYzEzOTQtPmhhbmRsZSwgJnJlcywgMSk7CisgICAgaWYgKCFjYW1lcmFfbm9kZXMgfHwgY2FtZXJhX25vZGVzW2RjMTM5NC0+Y2hhbm5lbF0gPT0gREMxMzk0X05PX0NBTUVSQSkgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiVGhlcmUncyBubyBJSURDIGNhbWVyYSBvbiB0aGUgY2hhbm5lbCAlZFxuIiwgZGMxMzk0LT5jaGFubmVsKTsKKyAgICAgICAgZ290byBvdXRfaGFuZGxlOworICAgIH0KKyAgICByZXMgPSBkYzEzOTRfZG1hX3NldHVwX2NhcHR1cmUoZGMxMzk0LT5oYW5kbGUsIGNhbWVyYV9ub2Rlc1tkYzEzOTQtPmNoYW5uZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVRfVkdBX05PTkNPTVBSRVNTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC0+ZnJhbWVfc2l6ZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFRURfNDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHMtPmZyYW1lX3JhdGVfaWQsIDgsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGMxMzk0LT5jYW1lcmEpOworICAgIGRjMTM5NF9mcmVlX2NhbWVyYV9ub2RlcyhjYW1lcmFfbm9kZXMpOworICAgIGlmIChyZXMgIT0gREMxMzk0X1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkNhbid0IHByZXBhcmUgY2FtZXJhIGZvciB0aGUgRE1BIGNhcHR1cmVcbiIpOworICAgICAgICBnb3RvIG91dF9oYW5kbGU7CisgICAgfQorCisgICAgcmVzID0gZGMxMzk0X3N0YXJ0X2lzb190cmFuc21pc3Npb24oZGMxMzk0LT5oYW5kbGUsIGRjMTM5NC0+Y2FtZXJhLm5vZGUpOworICAgIGlmIChyZXMgIT0gREMxMzk0X1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkNhbid0IHN0YXJ0IGlzb2Nocm9ub3VzIHRyYW5zbWlzc2lvblxuIik7CisgICAgICAgIGdvdG8gb3V0X2hhbmRsZV9kbWE7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK291dF9oYW5kbGVfZG1hOgorICAgIGRjMTM5NF9kbWFfdW5saXN0ZW4oZGMxMzk0LT5oYW5kbGUsICZkYzEzOTQtPmNhbWVyYSk7CisgICAgZGMxMzk0X2RtYV9yZWxlYXNlX2NhbWVyYShkYzEzOTQtPmhhbmRsZSwgJmRjMTM5NC0+Y2FtZXJhKTsKK291dF9oYW5kbGU6CisgICAgZGMxMzk0X2Rlc3Ryb3lfaGFuZGxlKGRjMTM5NC0+aGFuZGxlKTsKK291dDoKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZGMxMzk0X3YxX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBzdHJ1Y3QgZGMxMzk0X2RhdGEgKmRjMTM5NCA9IGMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmVzOworCisgICAgLyogZGlzY2FyZCBzdGFsZSBmcmFtZSAqLworICAgIGlmIChkYzEzOTQtPmN1cnJlbnRfZnJhbWUrKykgeworICAgICAgICBpZiAoZGMxMzk0X2RtYV9kb25lX3dpdGhfYnVmZmVyKCZkYzEzOTQtPmNhbWVyYSkgIT0gREMxMzk0X1NVQ0NFU1MpCisgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiZmFpbGVkIHRvIHJlbGVhc2UgJWQgZnJhbWVcbiIsIGRjMTM5NC0+Y3VycmVudF9mcmFtZSk7CisgICAgfQorCisgICAgcmVzID0gZGMxMzk0X2RtYV9zaW5nbGVfY2FwdHVyZSgmZGMxMzk0LT5jYW1lcmEpOworCisgICAgaWYgKHJlcyA9PSBEQzEzOTRfU1VDQ0VTUykgeworICAgICAgICBkYzEzOTQtPnBhY2tldC5kYXRhID0gKHVpbnQ4X3QgKikoZGMxMzk0LT5jYW1lcmEuY2FwdHVyZV9idWZmZXIpOworICAgICAgICBkYzEzOTQtPnBhY2tldC5wdHMgPSAoZGMxMzk0LT5jdXJyZW50X2ZyYW1lICogMTAwMDAwMCkgLyBkYzEzOTQtPmZyYW1lX3JhdGU7CisgICAgICAgIHJlcyA9IGRjMTM5NC0+cGFja2V0LnNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkRNQSBjYXB0dXJlIGZhaWxlZFxuIik7CisgICAgICAgIGRjMTM5NC0+cGFja2V0LmRhdGEgPSBOVUxMOworICAgICAgICByZXMgPSAtMTsKKyAgICB9CisKKyAgICAqcGt0ID0gZGMxMzk0LT5wYWNrZXQ7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBkYzEzOTRfdjFfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICogY29udGV4dCkKK3sKKyAgICBzdHJ1Y3QgZGMxMzk0X2RhdGEgKmRjMTM5NCA9IGNvbnRleHQtPnByaXZfZGF0YTsKKworICAgIGRjMTM5NF9zdG9wX2lzb190cmFuc21pc3Npb24oZGMxMzk0LT5oYW5kbGUsIGRjMTM5NC0+Y2FtZXJhLm5vZGUpOworICAgIGRjMTM5NF9kbWFfdW5saXN0ZW4oZGMxMzk0LT5oYW5kbGUsICZkYzEzOTQtPmNhbWVyYSk7CisgICAgZGMxMzk0X2RtYV9yZWxlYXNlX2NhbWVyYShkYzEzOTQtPmhhbmRsZSwgJmRjMTM5NC0+Y2FtZXJhKTsKKyAgICBkYzEzOTRfZGVzdHJveV9oYW5kbGUoZGMxMzk0LT5oYW5kbGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbGlmIEhBVkVfTElCREMxMzk0XzIKK3N0YXRpYyBpbnQgZGMxMzk0X3YyX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqYykKK3sKKyAgICBkYzEzOTRfZGF0YSogZGMxMzk0ID0gYy0+cHJpdl9kYXRhOworICAgIGRjMTM5NGNhbWVyYV9saXN0X3QgKmxpc3Q7CisgICAgaW50IHJlcywgaTsKKyAgICBzdHJ1Y3QgZGMxMzk0X2ZyYW1lX2Zvcm1hdCAqZm10ID0gTlVMTDsKKyAgICBzdHJ1Y3QgZGMxMzk0X2ZyYW1lX3JhdGUgKmZwcyA9IE5VTEw7CisKKyAgICBpZiAoZGMxMzk0X3JlYWRfY29tbW9uKGMsICZmbXQsICZmcHMpICE9IDApCisgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogTm93IGxldCB1cyBwcmVwIHRoZSBoYXJkd2FyZS4gKi8KKyAgICBkYzEzOTQtPmQgPSBkYzEzOTRfbmV3KCk7CisgICAgZGMxMzk0X2NhbWVyYV9lbnVtZXJhdGUgKGRjMTM5NC0+ZCwgJmxpc3QpOworICAgIGlmICggIWxpc3QgfHwgbGlzdC0+bnVtID09IDApIHsKKyAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBsb29rIGZvciBhbiBJSURDIGNhbWVyYVxuXG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogRklYTUU6IFRvIHNlbGVjdCBhIHNwZWNpZmljIGNhbWVyYSBJIG5lZWQgdG8gc2VhcmNoIGluIGxpc3QgaXRzIGd1aWQgKi8KKyAgICBkYzEzOTQtPmNhbWVyYSA9IGRjMTM5NF9jYW1lcmFfbmV3IChkYzEzOTQtPmQsIGxpc3QtPmlkc1swXS5ndWlkKTsKKyAgICBpZiAobGlzdC0+bnVtID4gMSkgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0lORk8sICJXb3JraW5nIHdpdGggdGhlIGZpcnN0IGNhbWVyYSBmb3VuZFxuIik7CisgICAgfQorCisgICAgLyogRnJlZWluZyBsaXN0IG9mIGNhbWVyYXMgKi8KKyAgICBkYzEzOTRfY2FtZXJhX2ZyZWVfbGlzdCAobGlzdCk7CisKKyAgICAvKiBTZWxlY3QgTUFYIFNwZWVkIHBvc3NpYmxlIGZyb20gdGhlIGNhbSAqLworICAgIGlmIChkYzEzOTQtPmNhbWVyYS0+Ym1vZGVfY2FwYWJsZT4wKSB7CisgICAgICAgZGMxMzk0X3ZpZGVvX3NldF9vcGVyYXRpb25fbW9kZShkYzEzOTQtPmNhbWVyYSwgREMxMzk0X09QRVJBVElPTl9NT0RFXzEzOTRCKTsKKyAgICAgICBpID0gREMxMzk0X0lTT19TUEVFRF84MDA7CisgICAgfSBlbHNlIHsKKyAgICAgICBpID0gREMxMzk0X0lTT19TUEVFRF80MDA7CisgICAgfQorCisgICAgZm9yIChyZXMgPSBEQzEzOTRfRkFJTFVSRTsgaSA+PSBEQzEzOTRfSVNPX1NQRUVEX01JTiAmJiByZXMgIT0gREMxMzk0X1NVQ0NFU1M7IGktLSkgeworICAgICAgICAgICAgcmVzPWRjMTM5NF92aWRlb19zZXRfaXNvX3NwZWVkKGRjMTM5NC0+Y2FtZXJhLCBpKTsKKyAgICB9CisgICAgaWYgKHJlcyAhPSBEQzEzOTRfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiQ291bGRuJ3Qgc2V0IElTTyBTcGVlZFxuIik7CisgICAgICAgIGdvdG8gb3V0X2NhbWVyYTsKKyAgICB9CisKKyAgICBpZiAoZGMxMzk0X3ZpZGVvX3NldF9tb2RlKGRjMTM5NC0+Y2FtZXJhLCBmbXQtPmZyYW1lX3NpemVfaWQpICE9IERDMTM5NF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJDb3VsZG4ndCBzZXQgdmlkZW8gZm9ybWF0XG4iKTsKKyAgICAgICAgZ290byBvdXRfY2FtZXJhOworICAgIH0KKworICAgIGlmIChkYzEzOTRfdmlkZW9fc2V0X2ZyYW1lcmF0ZShkYzEzOTQtPmNhbWVyYSxmcHMtPmZyYW1lX3JhdGVfaWQpICE9IERDMTM5NF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJDb3VsZG4ndCBzZXQgZnJhbWVyYXRlICVkIFxuIixmcHMtPmZyYW1lX3JhdGUpOworICAgICAgICBnb3RvIG91dF9jYW1lcmE7CisgICAgfQorICAgIGlmIChkYzEzOTRfY2FwdHVyZV9zZXR1cChkYzEzOTQtPmNhbWVyYSwgMTAsIERDMTM5NF9DQVBUVVJFX0ZMQUdTX0RFRkFVTFQpIT1EQzEzOTRfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IHNldHVwIGNhbWVyYSBcbiIpOworICAgICAgICBnb3RvIG91dF9jYW1lcmE7CisgICAgfQorCisgICAgaWYgKGRjMTM5NF92aWRlb19zZXRfdHJhbnNtaXNzaW9uKGRjMTM5NC0+Y2FtZXJhLCBEQzEzOTRfT04pICE9REMxMzk0X1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBzdGFydCBjYXB0dXJlXG4iKTsKKyAgICAgICAgZ290byBvdXRfY2FtZXJhOworICAgIH0KKyAgICByZXR1cm4gMDsKKworb3V0X2NhbWVyYToKKyAgICBkYzEzOTRfY2FwdHVyZV9zdG9wKGRjMTM5NC0+Y2FtZXJhKTsKKyAgICBkYzEzOTRfdmlkZW9fc2V0X3RyYW5zbWlzc2lvbihkYzEzOTQtPmNhbWVyYSwgREMxMzk0X09GRik7CisgICAgZGMxMzk0X2NhbWVyYV9mcmVlIChkYzEzOTQtPmNhbWVyYSk7CitvdXQ6CisgICAgZGMxMzk0X2ZyZWUoZGMxMzk0LT5kKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZGMxMzk0X3YyX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBzdHJ1Y3QgZGMxMzk0X2RhdGEgKmRjMTM5NCA9IGMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmVzOworCisgICAgLyogZGlzY2FyZCBzdGFsZSBmcmFtZSAqLworICAgIGlmIChkYzEzOTQtPmN1cnJlbnRfZnJhbWUrKykgeworICAgICAgICBpZiAoZGMxMzk0X2NhcHR1cmVfZW5xdWV1ZShkYzEzOTQtPmNhbWVyYSwgZGMxMzk0LT5mcmFtZSkgIT0gREMxMzk0X1NVQ0NFU1MpCisgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiZmFpbGVkIHRvIHJlbGVhc2UgJWQgZnJhbWVcbiIsIGRjMTM5NC0+Y3VycmVudF9mcmFtZSk7CisgICAgfQorCisgICAgcmVzID0gZGMxMzk0X2NhcHR1cmVfZGVxdWV1ZShkYzEzOTQtPmNhbWVyYSwgREMxMzk0X0NBUFRVUkVfUE9MSUNZX1dBSVQsICZkYzEzOTQtPmZyYW1lKTsKKyAgICBpZiAocmVzID09IERDMTM5NF9TVUNDRVNTKSB7CisgICAgICAgIGRjMTM5NC0+cGFja2V0LmRhdGEgPSAodWludDhfdCAqKSBkYzEzOTQtPmZyYW1lLT5pbWFnZTsKKyAgICAgICAgZGMxMzk0LT5wYWNrZXQucHRzICA9IGRjMTM5NC0+Y3VycmVudF9mcmFtZSAqIDEwMDAwMDAgLyBkYzEzOTQtPmZyYW1lX3JhdGU7CisgICAgICAgIHJlcyA9IGRjMTM5NC0+ZnJhbWUtPmltYWdlX2J5dGVzOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJETUEgY2FwdHVyZSBmYWlsZWRcbiIpOworICAgICAgICBkYzEzOTQtPnBhY2tldC5kYXRhID0gTlVMTDsKKyAgICAgICAgcmVzID0gLTE7CisgICAgfQorCisgICAgKnBrdCA9IGRjMTM5NC0+cGFja2V0OworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgZGMxMzk0X3YyX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqIGNvbnRleHQpCit7CisgICAgc3RydWN0IGRjMTM5NF9kYXRhICpkYzEzOTQgPSBjb250ZXh0LT5wcml2X2RhdGE7CisKKyAgICBkYzEzOTRfdmlkZW9fc2V0X3RyYW5zbWlzc2lvbihkYzEzOTQtPmNhbWVyYSwgREMxMzk0X09GRik7CisgICAgZGMxMzk0X2NhcHR1cmVfc3RvcChkYzEzOTQtPmNhbWVyYSk7CisgICAgZGMxMzk0X2NhbWVyYV9mcmVlKGRjMTM5NC0+Y2FtZXJhKTsKKyAgICBkYzEzOTRfZnJlZShkYzEzOTQtPmQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbGliZGMxMzk0X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYmRjMTM5NCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImRjMTM5NCB2LjIgQS9WIGdyYWIiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGRjMTM5NF9kYXRhKSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBkYzEzOTRfdjJfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZGMxMzk0X3YyX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGRjMTM5NF92Ml9jbG9zZSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmxpYmRjMTM5NF9jbGFzcywKK307CisKKyNlbmRpZgorI2lmIEhBVkVfTElCREMxMzk0XzEKK0FWSW5wdXRGb3JtYXQgZmZfbGliZGMxMzk0X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYmRjMTM5NCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImRjMTM5NCB2LjEgQS9WIGdyYWIiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGRjMTM5NF9kYXRhKSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBkYzEzOTRfdjFfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZGMxMzk0X3YxX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGRjMTM5NF92MV9jbG9zZSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmxpYmRjMTM5NF9jbGFzcywKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9vcGVuYWwtZGVjLmMgYi9mZm1wZWcvbGliYXZkZXZpY2Uvb3BlbmFsLWRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNGJhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2Uvb3BlbmFsLWRlYy5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEpvbmF0aGFuIEJhbGR3aW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRICisgKiBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyAqIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwKKyAqIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTQorICogTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogT3BlbkFMIDEuMSBjYXB0dXJlIGRldmljZSBmb3IgbGliYXZkZXZpY2UKKyAqKi8KKworI2luY2x1ZGUgPEFML2FsLmg+CisjaW5jbHVkZSA8QUwvYWxjLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICAvKiogT3BlbkFMIGNhcHR1cmUgZGV2aWNlIGNvbnRleHQuICoqLworICAgIEFMQ2RldmljZSAqZGV2aWNlOworICAgIC8qKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBjYXB0dXJlZCBhdWRpby4gKiovCisgICAgaW50IGNoYW5uZWxzOworICAgIC8qKiBUaGUgc2FtcGxlIHJhdGUgKGluIEh6KSBvZiB0aGUgY2FwdHVyZWQgYXVkaW8uICoqLworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICAvKiogVGhlIHNhbXBsZSBzaXplIChpbiBiaXRzKSBvZiB0aGUgY2FwdHVyZWQgYXVkaW8uICoqLworICAgIGludCBzYW1wbGVfc2l6ZTsKKyAgICAvKiogVGhlIE9wZW5BTCBzYW1wbGUgZm9ybWF0IG9mIHRoZSBjYXB0dXJlZCBhdWRpby4gKiovCisgICAgQUxDZW51bSBzYW1wbGVfZm9ybWF0OworICAgIC8qKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIHNhbXBsZXMgb2YgdGhlIHNhbWUgY2hhbm5lbC9jb21wb25lbnQuICoqLworICAgIEFMQ2ludCBzYW1wbGVfc3RlcDsKKyAgICAvKiogSWYgdHJ1ZSwgcHJpbnQgYSBsaXN0IG9mIGNhcHR1cmUgZGV2aWNlcyBvbiB0aGlzIHN5c3RlbSBhbmQgZXhpdC4gKiovCisgICAgaW50IGxpc3RfZGV2aWNlczsKK30gYWxfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFMQ2VudW0gYWxfZm10OworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkOworICAgIGludCBjaGFubmVsczsKK30gYWxfZm9ybWF0X2luZm87CisKKyNkZWZpbmUgTE9XRVNUX0FMX0ZPUk1BVCBGRk1JTihGRk1JTihBTF9GT1JNQVRfTU9OTzgsQUxfRk9STUFUX01PTk8xNiksRkZNSU4oQUxfRk9STUFUX1NURVJFTzgsQUxfRk9STUFUX1NURVJFTzE2KSkKKworLyoqCisgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYW4gQUxfRk9STUFUIHZhbHVlLgorICogQHBhcmFtIGFsX2ZtdCB0aGUgQUxfRk9STUFUIHZhbHVlIHRvIGZpbmQgaW5mb3JtYXRpb24gYWJvdXQuCisgKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBTF9GT1JNQVQgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgYWxfZm9ybWF0X2luZm8qIGdldF9hbF9mb3JtYXRfaW5mbyhBTENlbnVtIGFsX2ZtdCkKK3sKKyAgICBzdGF0aWMgYWxfZm9ybWF0X2luZm8gaW5mb190YWJsZVtdID0geworICAgICAgICBbQUxfRk9STUFUX01PTk84LUxPV0VTVF9BTF9GT1JNQVRdICAgID0ge0FMX0ZPUk1BVF9NT05POCwgQVZfQ09ERUNfSURfUENNX1U4LCAxfSwKKyAgICAgICAgW0FMX0ZPUk1BVF9NT05PMTYtTE9XRVNUX0FMX0ZPUk1BVF0gICA9IHtBTF9GT1JNQVRfTU9OTzE2LCBBVl9ORSAoQVZfQ09ERUNfSURfUENNX1MxNkJFLCBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpLCAxfSwKKyAgICAgICAgW0FMX0ZPUk1BVF9TVEVSRU84LUxPV0VTVF9BTF9GT1JNQVRdICA9IHtBTF9GT1JNQVRfU1RFUkVPOCwgQVZfQ09ERUNfSURfUENNX1U4LCAyfSwKKyAgICAgICAgW0FMX0ZPUk1BVF9TVEVSRU8xNi1MT1dFU1RfQUxfRk9STUFUXSA9IHtBTF9GT1JNQVRfU1RFUkVPMTYsIEFWX05FIChBVl9DT0RFQ19JRF9QQ01fUzE2QkUsIEFWX0NPREVDX0lEX1BDTV9TMTZMRSksIDJ9LAorICAgIH07CisKKyAgICByZXR1cm4gJmluZm9fdGFibGVbYWxfZm10LUxPV0VTVF9BTF9GT1JNQVRdOworfQorCisvKioKKyAqIEdldCB0aGUgT3BlbkFMIGVycm9yIGNvZGUsIHRyYW5zbGF0ZWQgaW50byBhbiBhdi9lcnJubyBlcnJvciBjb2RlLgorICogQHBhcmFtIGRldmljZSBUaGUgQUxDIGRldmljZSB0byBjaGVjayBmb3IgZXJyb3JzLgorICogQHBhcmFtIGVycm9yX21zZ19yZXQgQSBwb2ludGVyIHRvIGEgY2hhciogaW4gd2hpY2ggdG8gcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlLCBvciBOVUxMIGlmIGRlc2lyZWQuCisgKiBAcmV0dXJuIFRoZSBlcnJvciBjb2RlLCBvciAwIGlmIHRoZXJlIGlzIG5vIGVycm9yLgorICovCitzdGF0aWMgaW5saW5lIGludCBhbF9nZXRfZXJyb3IoQUxDZGV2aWNlICpkZXZpY2UsIGNvbnN0IGNoYXIqKiBlcnJvcl9tc2dfcmV0KQoreworICAgIEFMQ2VudW0gZXJyb3IgPSBhbGNHZXRFcnJvcihkZXZpY2UpOworICAgIGlmIChlcnJvcl9tc2dfcmV0KQorICAgICAgICAqZXJyb3JfbXNnX3JldCA9IChjb25zdCBjaGFyKikgYWxjR2V0U3RyaW5nKGRldmljZSwgZXJyb3IpOworICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICBjYXNlIEFMQ19OT19FUlJPUjoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBBTENfSU5WQUxJRF9ERVZJQ0U6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT0RFVik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUxDX0lOVkFMSURfQ09OVEVYVDoKKyAgICBjYXNlIEFMQ19JTlZBTElEX0VOVU06CisgICAgY2FzZSBBTENfSU5WQUxJRF9WQUxVRToKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTENfT1VUX09GX01FTU9SWToKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9Cit9CisKKy8qKgorICogUHJpbnQgb3V0IGEgbGlzdCBvZiBPcGVuQUwgY2FwdHVyZSBkZXZpY2VzIG9uIHRoaXMgc3lzdGVtLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfYWxfY2FwdHVyZV9kZXZpY2VzKHZvaWQgKmxvZ19jdHgpCit7CisgICAgY29uc3QgY2hhciAqZGV2aWNlczsKKworICAgIGlmICghKGRldmljZXMgPSBhbGNHZXRTdHJpbmcoTlVMTCwgQUxDX0NBUFRVUkVfREVWSUNFX1NQRUNJRklFUikpKQorICAgICAgICByZXR1cm47CisKKyAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0lORk8sICJMaXN0IG9mIE9wZW5BTCBjYXB0dXJlIGRldmljZXMgb24gdGhpcyBzeXN0ZW06XG4iKTsKKworICAgIGZvciAoOyAqZGV2aWNlcyAhPSAnXDAnOyBkZXZpY2VzICs9IHN0cmxlbihkZXZpY2VzKSArIDEpCisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfSU5GTywgIiAgJXNcbiIsIGRldmljZXMpOworfQorCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqY3R4KQoreworICAgIGFsX2RhdGEgKmFkID0gY3R4LT5wcml2X2RhdGE7CisgICAgc3RhdGljIGNvbnN0IEFMQ2VudW0gc2FtcGxlX2Zvcm1hdHNbMl1bMl0gPSB7CisgICAgICAgIHsgQUxfRk9STUFUX01PTk84LCAgQUxfRk9STUFUX1NURVJFTzggIH0sCisgICAgICAgIHsgQUxfRk9STUFUX01PTk8xNiwgQUxfRk9STUFUX1NURVJFTzE2IH0KKyAgICB9OworICAgIGludCBlcnJvciA9IDA7CisgICAgY29uc3QgY2hhciAqZXJyb3JfbXNnOworICAgIEFWU3RyZWFtICpzdCA9IE5VTEw7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gTlVMTDsKKworICAgIGlmIChhZC0+bGlzdF9kZXZpY2VzKSB7CisgICAgICAgIHByaW50X2FsX2NhcHR1cmVfZGV2aWNlcyhjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgIH0KKworICAgIGFkLT5zYW1wbGVfZm9ybWF0ID0gc2FtcGxlX2Zvcm1hdHNbYWQtPnNhbXBsZV9zaXplLzgtMV1bYWQtPmNoYW5uZWxzLTFdOworCisgICAgLyogT3BlbiBkZXZpY2UgZm9yIGNhcHR1cmUgKi8KKyAgICBhZC0+ZGV2aWNlID0KKyAgICAgICAgYWxjQ2FwdHVyZU9wZW5EZXZpY2UoY3R4LT5maWxlbmFtZVswXSA/IGN0eC0+ZmlsZW5hbWUgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZC0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkLT5zYW1wbGVfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZC0+c2FtcGxlX3JhdGUpOyAvKiBNYXhpbXVtIDEgc2Vjb25kIG9mIHNhbXBsZSBkYXRhIHRvIGJlIHJlYWQgYXQgb25jZSAqLworCisgICAgaWYgKGVycm9yID0gYWxfZ2V0X2Vycm9yKGFkLT5kZXZpY2UsICZlcnJvcl9tc2cpKSBnb3RvIGZhaWw7CisKKyAgICAvKiBDcmVhdGUgc3RyZWFtICovCisgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGN0eCwgTlVMTCkpKSB7CisgICAgICAgIGVycm9yID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogV2Ugd29yayBpbiBtaWNyb3NlY29uZHMgKi8KKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMDAwMCk7CisKKyAgICAvKiBTZXQgY29kZWMgcGFyYW1ldGVycyAqLworICAgIGNvZGVjID0gc3QtPmNvZGVjOworICAgIGNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIGNvZGVjLT5zYW1wbGVfcmF0ZSA9IGFkLT5zYW1wbGVfcmF0ZTsKKyAgICBjb2RlYy0+Y2hhbm5lbHMgPSBnZXRfYWxfZm9ybWF0X2luZm8oYWQtPnNhbXBsZV9mb3JtYXQpLT5jaGFubmVsczsKKyAgICBjb2RlYy0+Y29kZWNfaWQgPSBnZXRfYWxfZm9ybWF0X2luZm8oYWQtPnNhbXBsZV9mb3JtYXQpLT5jb2RlY19pZDsKKworICAgIC8qIFRoaXMgaXMgbmVlZGVkIHRvIHJlYWQgdGhlIGF1ZGlvIGRhdGEgKi8KKyAgICBhZC0+c2FtcGxlX3N0ZXAgPSAoYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShnZXRfYWxfZm9ybWF0X2luZm8oYWQtPnNhbXBsZV9mb3JtYXQpLT5jb2RlY19pZCkgKgorICAgICAgICAgICAgICAgICAgICAgICBnZXRfYWxfZm9ybWF0X2luZm8oYWQtPnNhbXBsZV9mb3JtYXQpLT5jaGFubmVscykgLyA4OworCisgICAgLyogRmluYWxseSwgc3RhcnQgdGhlIGNhcHR1cmUgcHJvY2VzcyAqLworICAgIGFsY0NhcHR1cmVTdGFydChhZC0+ZGV2aWNlKTsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIC8qIEhhbmRsZSBmYWlsdXJlICovCisgICAgaWYgKGFkLT5kZXZpY2UpCisgICAgICAgIGFsY0NhcHR1cmVDbG9zZURldmljZShhZC0+ZGV2aWNlKTsKKyAgICBpZiAoZXJyb3JfbXNnKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3Qgb3BlbiBkZXZpY2U6ICVzXG4iLCBlcnJvcl9tc2cpOworICAgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQqIGN0eCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBhbF9kYXRhICphZCA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCBlcnJvcj0wOworICAgIGNvbnN0IGNoYXIgKmVycm9yX21zZzsKKyAgICBBTENpbnQgbmJfc2FtcGxlczsKKworICAgIC8qIEdldCBudW1iZXIgb2Ygc2FtcGxlcyBhdmFpbGFibGUgKi8KKyAgICBhbGNHZXRJbnRlZ2VydihhZC0+ZGV2aWNlLCBBTENfQ0FQVFVSRV9TQU1QTEVTLCAoQUxDc2l6ZWkpIHNpemVvZihBTENpbnQpLCAmbmJfc2FtcGxlcyk7CisgICAgaWYgKGVycm9yID0gYWxfZ2V0X2Vycm9yKGFkLT5kZXZpY2UsICZlcnJvcl9tc2cpKSBnb3RvIGZhaWw7CisKKyAgICAvKiBDcmVhdGUgYSBwYWNrZXQgb2YgYXBwcm9wcmlhdGUgc2l6ZSAqLworICAgIGF2X25ld19wYWNrZXQocGt0LCBuYl9zYW1wbGVzKmFkLT5zYW1wbGVfc3RlcCk7CisgICAgcGt0LT5wdHMgPSBhdl9nZXR0aW1lKCk7CisKKyAgICAvKiBGaWxsIHRoZSBwYWNrZXQgd2l0aCB0aGUgYXZhaWxhYmxlIHNhbXBsZXMgKi8KKyAgICBhbGNDYXB0dXJlU2FtcGxlcyhhZC0+ZGV2aWNlLCBwa3QtPmRhdGEsIG5iX3NhbXBsZXMpOworICAgIGlmIChlcnJvciA9IGFsX2dldF9lcnJvcihhZC0+ZGV2aWNlLCAmZXJyb3JfbXNnKSkgZ290byBmYWlsOworCisgICAgcmV0dXJuIHBrdC0+c2l6ZTsKK2ZhaWw6CisgICAgLyogSGFuZGxlIGZhaWx1cmUgKi8KKyAgICBpZiAocGt0LT5kYXRhKQorICAgICAgICBhdl9kZXN0cnVjdF9wYWNrZXQocGt0KTsKKyAgICBpZiAoZXJyb3JfbXNnKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvcjogJXNcbiIsIGVycm9yX21zZyk7CisgICAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHJlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0KiBjdHgpCit7CisgICAgYWxfZGF0YSAqYWQgPSBjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChhZC0+ZGV2aWNlKSB7CisgICAgICAgIGFsY0NhcHR1cmVTdG9wKGFkLT5kZXZpY2UpOworICAgICAgICBhbGNDYXB0dXJlQ2xvc2VEZXZpY2UoYWQtPmRldmljZSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihhbF9kYXRhLCB4KQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsiY2hhbm5lbHMiLCAic2V0IG51bWJlciBvZiBjaGFubmVscyIsICAgICBPRkZTRVQoY2hhbm5lbHMpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0yfSwgICAgIDEsIDIsICAgICAgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7InNhbXBsZV9yYXRlIiwgInNldCBzYW1wbGUgcmF0ZSIsICAgICAgICAgT0ZGU0VUKHNhbXBsZV9yYXRlKSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9NDQxMDB9LCAxLCAxOTIwMDAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyJzYW1wbGVfc2l6ZSIsICJzZXQgc2FtcGxlIHNpemUiLCAgICAgICAgIE9GRlNFVChzYW1wbGVfc2l6ZSksICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTE2fSwgICAgOCwgMTYsICAgICBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsibGlzdF9kZXZpY2VzIiwgImxpc3QgYXZhaWxhYmxlIGRldmljZXMiLCBPRkZTRVQobGlzdF9kZXZpY2VzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgICAgIDAsIDEsICAgICAgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJsaXN0X2RldmljZXMiICB9LAorICAgIHsidHJ1ZSIsICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgImxpc3RfZGV2aWNlcyIgfSwKKyAgICB7ImZhbHNlIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJsaXN0X2RldmljZXMiIH0sCisgICAge05VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAib3BlbmFsIiwKKyAgICAuaXRlbV9uYW1lID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX0FVRElPX0lOUFVULAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl9vcGVuYWxfZGVtdXhlciA9IHsKKyAgICAubmFtZSA9ICJvcGVuYWwiLAorICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT3BlbkFMIGF1ZGlvIGNhcHR1cmUgZGV2aWNlIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKGFsX2RhdGEpLAorICAgIC5yZWFkX3Byb2JlID0gTlVMTCwKKyAgICAucmVhZF9oZWFkZXIgPSByZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgPSByZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSA9IHJlYWRfY2xvc2UsCisgICAgLmZsYWdzID0gQVZGTVRfTk9GSUxFLAorICAgIC5wcml2X2NsYXNzID0gJmNsYXNzCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL29wZW5nbF9lbmMuYyBiL2ZmbXBlZy9saWJhdmRldmljZS9vcGVuZ2xfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0YWU5NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9vcGVuZ2xfZW5jLmMKQEAgLTAsMCArMSwxMzA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEx1a2FzeiBNYXJlaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvL1RPRE86IHN1cHBvcnQgZm9yIG1vcmUgZm9ybWF0cworLy9UT0RPOiBzdXBwb3J0IGZvciBtb3JlIHN5c3RlbXMuCisvL1RPRE86IGltcGxlbWVudCBYMTEsIFdpbmRvd3MsIE1hYyBPUyBuYXRpdmUgZGVmYXVsdCB3aW5kb3cuIFNETCAxLjIgZG9lc24ndCBhbGxvdyB0byByZW5kZXIgdG8gY3VzdG9tIHRocmVhZC4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEhBVkVfV0lORE9XU19ICisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKyNpZiBIQVZFX09QRU5HTF9HTDNfSAorI2luY2x1ZGUgPE9wZW5HTC9nbDMuaD4KKyNlbGlmIEhBVkVfRVMyX0dMX0gKKyNpbmNsdWRlIDxFUzIvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSA8R0wvZ2wuaD4KKyNpbmNsdWRlIDxHTC9nbGV4dC5oPgorI2VuZGlmCisjaWYgSEFWRV9HTFhHRVRQUk9DQUREUkVTUworI2luY2x1ZGUgPEdML2dseC5oPgorI2VuZGlmCisKKyNpZiBIQVZFX1NETAorI2luY2x1ZGUgPFNETC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmRldmljZS9hdmRldmljZS5oIgorI2luY2x1ZGUgIm9wZW5nbF9lbmNfc2hhZGVycy5oIgorCisjaWZuZGVmIEFQSUVOVFJZCisjZGVmaW5lIEFQSUVOVFJZCisjZW5kaWYKKworLyogRkZfR0xfUkVEX0NPTVBPTkVOVCBpcyB1c2VkIGZvciBwbGFubmFyIHBpeGVsIHR5cGVzLgorICogT25seSByZWQgY29tcG9uZW50IGlzIHNhbXBsZWQgaW4gc2hhZGVycy4KKyAqIE9uIHNvbWUgcGxhdGZvcm1zIEdMX1JFRCBpcyBub3QgYXZhaWxhYmxlIGFuZCBHTF9MVU1JTkFOQ0UgaGF2ZSB0byBiZSB1c2VkLAorICogYnV0IHNpbmNlIE9wZW5HTCAzLjAgR0xfTFVNSU5BTkNFIGlzIGRlcHJlY2F0ZWQuCisgKiBHTF9SRUQgcHJvZHVjZXMgUkdCQSA9IHZhbHVlLCAwLCAwLCAxLgorICogR0xfTFVNSU5BTkNFIHByb2R1Y2VzIFJHQkEgPSB2YWx1ZSwgdmFsdWUsIHZhbHVlLCAxLgorICogTm90ZTogR0xfSU5URU5TSVRZIG1heSBhbHNvIGJlIHVzZWQgd2hpY2ggcHJvZHVjZSBSR0JBID0gdmFsdWUsIHZhbHVlLCB2YWx1ZSwgdmFsdWUuICovCisjaWYgZGVmaW5lZChHTF9SRUQpCisjZGVmaW5lIEZGX0dMX1JFRF9DT01QT05FTlQgR0xfUkVECisjZWxpZiBkZWZpbmVkKEdMX0xVTUlOQU5DRSkKKyNkZWZpbmUgRkZfR0xfUkVEX0NPTVBPTkVOVCBHTF9MVU1JTkFOQ0UKKyNlbHNlCisjZGVmaW5lIEZGX0dMX1JFRF9DT01QT05FTlQgMHgxOTAzOyAvL0dMX1JFRAorI2VuZGlmCisKKy8qIENvbnN0YW50cyBub3QgZGVmaW5lZCBmb3IgaU9TICovCisjZGVmaW5lIEZGX0dMX1VOU0lHTkVEX0JZVEVfM18zXzIgMHg4MDMyCisjZGVmaW5lIEZGX0dMX1VOU0lHTkVEX0JZVEVfMl8zXzNfUkVWIDB4ODM2MgorI2RlZmluZSBGRl9HTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFViAweDgzNjYKKyNkZWZpbmUgRkZfR0xfVU5QQUNLX1JPV19MRU5HVEggICAgICAgICAgMHgwQ0YyCisKKy8qIE1pbkdXIGV4cG9zZXMgb25seSBPcGVuR0wgMS4xIEFQSSAqLworI2RlZmluZSBGRl9HTF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgMHg4ODkyCisjZGVmaW5lIEZGX0dMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICAgICAgICAweDg4OTMKKyNkZWZpbmUgRkZfR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgIDB4ODhFNAorI2RlZmluZSBGRl9HTF9GUkFHTUVOVF9TSEFERVIgICAgICAgICAgICAgMHg4QjMwCisjZGVmaW5lIEZGX0dMX1ZFUlRFWF9TSEFERVIgICAgICAgICAgICAgICAweDhCMzEKKyNkZWZpbmUgRkZfR0xfQ09NUElMRV9TVEFUVVMgICAgICAgICAgICAgIDB4OEI4MQorI2RlZmluZSBGRl9HTF9MSU5LX1NUQVRVUyAgICAgICAgICAgICAgICAgMHg4QjgyCisjZGVmaW5lIEZGX0dMX0lORk9fTE9HX0xFTkdUSCAgICAgICAgICAgICAweDhCODQKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xBQ1RJVkVURVhUVVJFUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xHRU5CVUZGRVJTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xERUxFVEVCVUZGRVJTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xCVUZGRVJEQVRBUFJPQykgKEdMZW51bSB0YXJnZXQsIHB0cmRpZmZfdCBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSk7Cit0eXBlZGVmIHZvaWQgICAoQVBJRU5UUlkgKkZGX1BGTkdMQklOREJVRkZFUlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgR0xpbnQgIChBUElFTlRSWSAqRkZfUEZOR0xHRVRBVFRSSUJMT0NBVElPTlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgICAoQVBJRU5UUlkgKkZGX1BGTkdMRU5BQkxFVkVSVEVYQVRUUklCQVJSQVlQUk9DKSAoR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgdWludHB0cl90IHBvaW50ZXIpOwordHlwZWRlZiBHTGludCAgKEFQSUVOVFJZICpGRl9QRk5HTEdFVFVOSUZPUk1MT0NBVElPTlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgICAoQVBJRU5UUlkgKkZGX1BGTkdMVU5JRk9STTFGUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xVTklGT1JNMUlQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwKTsKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xVTklGT1JNTUFUUklYNEZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUlkgKkZGX1BGTkdMQ1JFQVRFUFJPR1JBTVBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xERUxFVEVQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xVU0VQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xMSU5LUFJPR1JBTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgICAoQVBJRU5UUlkgKkZGX1BGTkdMR0VUUFJPR1JBTUlWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkICAgKEFQSUVOVFJZICpGRl9QRk5HTEdFVFBST0dSQU1JTkZPTE9HUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgY2hhciAqaW5mb0xvZyk7Cit0eXBlZGVmIHZvaWQgICAoQVBJRU5UUlkgKkZGX1BGTkdMQVRUQUNIU0hBREVSUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWSAqRkZfUEZOR0xDUkVBVEVTSEFERVJQUk9DKSAoR0xlbnVtIHR5cGUpOwordHlwZWRlZiB2b2lkICAgKEFQSUVOVFJZICpGRl9QRk5HTERFTEVURVNIQURFUlBST0MpIChHTHVpbnQgc2hhZGVyKTsKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xDT01QSUxFU0hBREVSUFJPQykgKEdMdWludCBzaGFkZXIpOwordHlwZWRlZiB2b2lkICAgKEFQSUVOVFJZICpGRl9QRk5HTFNIQURFUlNPVVJDRVBST0MpIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBjaGFyKiAqc3RyaW5nLCBjb25zdCBHTGludCAqbGVuZ3RoKTsKK3R5cGVkZWYgdm9pZCAgIChBUElFTlRSWSAqRkZfUEZOR0xHRVRTSEFERVJJVlBST0MpIChHTHVpbnQgc2hhZGVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkICAgKEFQSUVOVFJZICpGRl9QRk5HTEdFVFNIQURFUklORk9MT0dQUk9DKSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIGNoYXIgKmluZm9Mb2cpOworCit0eXBlZGVmIHN0cnVjdCBGRk9wZW5HTEZ1bmN0aW9ucyB7CisgICAgRkZfUEZOR0xBQ1RJVkVURVhUVVJFUFJPQyBnbEFjdGl2ZVRleHR1cmU7ICAgICAgICAgICAgICAgICAgICAgLy9SZXF1aXJlIEdMIEFSQiBtdWx0aXRleHR1cmUKKyAgICBGRl9QRk5HTEdFTkJVRkZFUlNQUk9DIGdsR2VuQnVmZmVyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlcXVpcmUgR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0CisgICAgRkZfUEZOR0xERUxFVEVCVUZGRVJTUFJPQyBnbERlbGV0ZUJ1ZmZlcnM7ICAgICAgICAgICAgICAgICAgICAgLy9SZXF1aXJlIEdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdAorICAgIEZGX1BGTkdMQlVGRkVSREFUQVBST0MgZ2xCdWZmZXJEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVxdWlyZSBHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QKKyAgICBGRl9QRk5HTEJJTkRCVUZGRVJQUk9DIGdsQmluZEJ1ZmZlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlcXVpcmUgR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0CisgICAgRkZfUEZOR0xHRVRBVFRSSUJMT0NBVElPTlBST0MgZ2xHZXRBdHRyaWJMb2NhdGlvbjsgICAgICAgICAgICAgLy9SZXF1aXJlIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyCisgICAgRkZfUEZOR0xFTkFCTEVWRVJURVhBVFRSSUJBUlJBWVBST0MgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheTsgLy9SZXF1aXJlIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyCisgICAgRkZfUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSUFJPQyBnbFZlcnRleEF0dHJpYlBvaW50ZXI7ICAgICAgICAgLy9SZXF1aXJlIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyCisgICAgRkZfUEZOR0xHRVRVTklGT1JNTE9DQVRJT05QUk9DIGdsR2V0VW5pZm9ybUxvY2F0aW9uOyAgICAgICAgICAgLy9SZXF1aXJlIEdMX0FSQl9zaGFkZXJfb2JqZWN0cworICAgIEZGX1BGTkdMVU5JRk9STTFGUFJPQyBnbFVuaWZvcm0xZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVxdWlyZSBHTF9BUkJfc2hhZGVyX29iamVjdHMKKyAgICBGRl9QRk5HTFVOSUZPUk0xSVBST0MgZ2xVbmlmb3JtMWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlcXVpcmUgR0xfQVJCX3NoYWRlcl9vYmplY3RzCisgICAgRkZfUEZOR0xVTklGT1JNTUFUUklYNEZWUFJPQyBnbFVuaWZvcm1NYXRyaXg0ZnY7ICAgICAgICAgICAgICAgLy9SZXF1aXJlIEdMX0FSQl9zaGFkZXJfb2JqZWN0cworICAgIEZGX1BGTkdMQ1JFQVRFUFJPR1JBTVBST0MgZ2xDcmVhdGVQcm9ncmFtOyAgICAgICAgICAgICAgICAgICAgIC8vUmVxdWlyZSBHTF9BUkJfc2hhZGVyX29iamVjdHMKKyAgICBGRl9QRk5HTERFTEVURVBST0dSQU1QUk9DIGdsRGVsZXRlUHJvZ3JhbTsgICAgICAgICAgICAgICAgICAgICAvL1JlcXVpcmUgR0xfQVJCX3NoYWRlcl9vYmplY3RzCisgICAgRkZfUEZOR0xVU0VQUk9HUkFNUFJPQyBnbFVzZVByb2dyYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZXF1aXJlIEdMX0FSQl9zaGFkZXJfb2JqZWN0cworICAgIEZGX1BGTkdMTElOS1BST0dSQU1QUk9DIGdsTGlua1Byb2dyYW07ICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVxdWlyZSBHTF9BUkJfc2hhZGVyX29iamVjdHMKKyAgICBGRl9QRk5HTEdFVFBST0dSQU1JVlBST0MgZ2xHZXRQcm9ncmFtaXY7ICAgICAgICAgICAgICAgICAgICAgICAvL1JlcXVpcmUgR0xfQVJCX3NoYWRlcl9vYmplY3RzCisgICAgRkZfUEZOR0xHRVRQUk9HUkFNSU5GT0xPR1BST0MgZ2xHZXRQcm9ncmFtSW5mb0xvZzsgICAgICAgICAgICAgLy9SZXF1aXJlIEdMX0FSQl9zaGFkZXJfb2JqZWN0cworICAgIEZGX1BGTkdMQVRUQUNIU0hBREVSUFJPQyBnbEF0dGFjaFNoYWRlcjsgICAgICAgICAgICAgICAgICAgICAgIC8vUmVxdWlyZSBHTF9BUkJfc2hhZGVyX29iamVjdHMKKyAgICBGRl9QRk5HTENSRUFURVNIQURFUlBST0MgZ2xDcmVhdGVTaGFkZXI7ICAgICAgICAgICAgICAgICAgICAgICAvL1JlcXVpcmUgR0xfQVJCX3NoYWRlcl9vYmplY3RzCisgICAgRkZfUEZOR0xERUxFVEVTSEFERVJQUk9DIGdsRGVsZXRlU2hhZGVyOyAgICAgICAgICAgICAgICAgICAgICAgLy9SZXF1aXJlIEdMX0FSQl9zaGFkZXJfb2JqZWN0cworICAgIEZGX1BGTkdMQ09NUElMRVNIQURFUlBST0MgZ2xDb21waWxlU2hhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8vUmVxdWlyZSBHTF9BUkJfc2hhZGVyX29iamVjdHMKKyAgICBGRl9QRk5HTFNIQURFUlNPVVJDRVBST0MgZ2xTaGFkZXJTb3VyY2U7ICAgICAgICAgICAgICAgICAgICAgICAvL1JlcXVpcmUgR0xfQVJCX3NoYWRlcl9vYmplY3RzCisgICAgRkZfUEZOR0xHRVRTSEFERVJJVlBST0MgZ2xHZXRTaGFkZXJpdjsgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZXF1aXJlIEdMX0FSQl9zaGFkZXJfb2JqZWN0cworICAgIEZGX1BGTkdMR0VUU0hBREVSSU5GT0xPR1BST0MgZ2xHZXRTaGFkZXJJbmZvTG9nOyAgICAgICAgICAgICAgIC8vUmVxdWlyZSBHTF9BUkJfc2hhZGVyX29iamVjdHMKK30gRkZPcGVuR0xGdW5jdGlvbnM7CisKKyNkZWZpbmUgT1BFTkdMX0VSUk9SX0NIRUNLKGN0eCkgXAore1wKKyAgICBHTGVudW0gZXJyX2NvZGU7IFwKKyAgICBpZiAoKGVycl9jb2RlID0gZ2xHZXRFcnJvcigpKSAhPSBHTF9OT19FUlJPUikgeyBcCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5HTCBlcnJvciBvY2N1cnJlZCBpbiAnJXMnLCBsaW5lICVkOiAlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZXJyX2NvZGUpOyBcCisgICAgICAgIGdvdG8gZmFpbDsgXAorICAgIH0gXAorfVwKKwordHlwZWRlZiBzdHJ1Y3QgT3BlbkdMVmVydGV4SW5mbworeworICAgIGZsb2F0IHgsIHksIHo7ICAgIC8vLzxQb3NpdGlvbgorICAgIGZsb2F0IHMwLCB0MDsgICAgIC8vLzxUZXh0dXJlIGNvb3JkcworfSBPcGVuR0xWZXJ0ZXhJbmZvOworCisvKiBkZWZpbmVzIDIgdHJpYW5nbGVzIHRvIGRpc3BsYXkgKi8KK3N0YXRpYyBjb25zdCBHTHVzaG9ydCBnX2luZGV4WzZdID0KK3sKKyAgICAwLCAxLCAyLAorICAgIDAsIDMsIDIsCit9OworCit0eXBlZGVmIHN0cnVjdCBPcGVuR0xDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsgICAgICAgICAgICAgICAgICAgIC8vLzwgY2xhc3MgZm9yIHByaXZhdGUgb3B0aW9ucworCisjaWYgSEFWRV9TREwKKyAgICBTRExfU3VyZmFjZSAqc3VyZmFjZTsKKyNlbmRpZgorICAgIEZGT3BlbkdMRnVuY3Rpb25zIGdscHJvY3M7CisKKyAgICBpbnQgaW5pdGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgU2V0IHRvIDEgd2hlbiB3cml0ZV9oZWFkZXIgd2FzIHN1Y2Nlc3NmdWxseSBjYWxsZWQuCisgICAgdWludDhfdCBiYWNrZ3JvdW5kWzRdOyAgICAgICAgICAgICAvLy88IEJhY2tncm91bmQgY29sb3IKKyAgICBpbnQgbm9fd2luZG93OyAgICAgICAgICAgICAgICAgICAgIC8vLzwgMCBmb3IgY3JlYXRlIGRlZmF1bHQgd2luZG93CisgICAgY2hhciAqd2luZG93X3RpdGxlOyAgICAgICAgICAgICAgICAvLy88IFRpdGxlIG9mIHRoZSB3aW5kb3cKKworICAgIC8qIE9wZW5HTCBpbXBsZW1lbnRhdGlvbiBsaW1pdHMgKi8KKyAgICBHTGludCBtYXhfdGV4dHVyZV9zaXplOyAgICAgICAgICAgIC8vLzwgTWF4aW11bSB0ZXh0dXJlIHNpemUKKyAgICBHTGludCBtYXhfdmlld3BvcnRfd2lkdGg7ICAgICAgICAgIC8vLzwgTWF4aW11bSB2aWV3cG9ydCBzaXplCisgICAgR0xpbnQgbWF4X3ZpZXdwb3J0X2hlaWdodDsgICAgICAgICAvLy88IE1heGltdW0gdmlld3BvcnQgc2l6ZQorICAgIGludCBub25fcG93XzJfdGV4dHVyZXM7ICAgICAgICAgICAgLy8vPCAxIHdoZW4gbm9uIHBvd2VyIG9mIDIgdGV4dHVyZXMgYXJlIHN1cHBvcnRlZAorICAgIGludCB1bnBhY2tfc3ViaW1hZ2U7ICAgICAgICAgICAgICAgLy8vPCAxIHdoZW4gR0xfRVhUX3VucGFja19zdWJpbWFnZSBpcyBhdmFpbGFibGUKKworICAgIC8qIEN1cnJlbnQgT3BlbkdMIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBHTHVpbnQgcHJvZ3JhbTsgICAgICAgICAgICAgICAgICAgIC8vLzwgU2hhZGVyIHByb2dyYW0KKyAgICBHTHVpbnQgdmVydGV4X3NoYWRlcjsgICAgICAgICAgICAgIC8vLzwgVmVydGV4IHNoYWRlcgorICAgIEdMdWludCBmcmFnbWVudF9zaGFkZXI7ICAgICAgICAgICAgLy8vPCBGcmFnbWVudCBzaGFkZXIgZm9yIGN1cnJlbnQgcGl4X3BtdAorICAgIEdMdWludCB0ZXh0dXJlX25hbWVbNF07ICAgICAgICAgICAgLy8vPCBUZXh0dXJlcycgSURzCisgICAgR0x1aW50IGluZGV4X2J1ZmZlcjsgICAgICAgICAgICAgICAvLy88IEluZGV4IGJ1ZmZlcgorICAgIEdMdWludCB2ZXJ0ZXhfYnVmZmVyOyAgICAgICAgICAgICAgLy8vPCBWZXJ0ZXggYnVmZmVyCisgICAgT3BlbkdMVmVydGV4SW5mbyB2ZXJ0ZXhbNF07ICAgICAgICAvLy88IFZCTworICAgIEdMaW50IHByb2plY3Rpb25fbWF0cml4X2xvY2F0aW9uOyAgLy8vPCBVbmlmb3JtcycgbG9jYXRpb25zCisgICAgR0xpbnQgbW9kZWxfdmlld19tYXRyaXhfbG9jYXRpb247CisgICAgR0xpbnQgY29sb3JfbWFwX2xvY2F0aW9uOworICAgIEdMaW50IGNocm9tYV9kaXZfd19sb2NhdGlvbjsKKyAgICBHTGludCBjaHJvbWFfZGl2X2hfbG9jYXRpb247CisgICAgR0xpbnQgdGV4dHVyZV9sb2NhdGlvbls0XTsKKyAgICBHTGludCBwb3NpdGlvbl9hdHRyaWI7ICAgICAgICAgICAgIC8vLzwgQXR0aWJ1dGVzJyBsb2NhdGlvbnMKKyAgICBHTGludCB0ZXh0dXJlX2Nvb3Jkc19hdHRyaWI7CisKKyAgICBHTGZsb2F0IHByb2plY3Rpb25fbWF0cml4WzE2XTsgICAgIC8vLzwgUHJvamVjdGlvbiBtYXRyaXgKKyAgICBHTGZsb2F0IG1vZGVsX3ZpZXdfbWF0cml4WzE2XTsgICAgIC8vLzwgTW9kZXYgdmlldyBtYXRyaXgKKyAgICBHTGZsb2F0IGNvbG9yX21hcFsxNl07ICAgICAgICAgICAgIC8vLzwgUkdCQSBjb2xvciBtYXAgbWF0cml4CisgICAgR0xmbG9hdCBjaHJvbWFfZGl2X3c7ICAgICAgICAgICAgICAvLy88IENocm9tYSBzdWJzYW1wbGluZyB3IHJhdGlvCisgICAgR0xmbG9hdCBjaHJvbWFfZGl2X2g7ICAgICAgICAgICAgICAvLy88IENocm9tYSBzdWJzYW1wbGluZyBoIHJhdGlvCisKKyAgICAvKiBTdHJlYW0gaW5mb3JtYXRpb24gKi8KKyAgICBHTGVudW0gZm9ybWF0OworICAgIEdMZW51bSB0eXBlOworICAgIGludCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBTdHJlYW0gd2lkdGgKKyAgICBpbnQgaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgU3RyZWFtIGhlaWdodAorICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OyAgICAgICAgLy8vPCBTdHJlYW0gcGl4ZWwgZm9ybWF0CisgICAgaW50IHBpY3R1cmVfd2lkdGg7ICAgICAgICAgICAgICAgICAvLy88IFJlbmRlcmVkIHdpZHRoCisgICAgaW50IHBpY3R1cmVfaGVpZ2h0OyAgICAgICAgICAgICAgICAvLy88IFJlbmRlcmVkIGhlaWdodAorICAgIGludCB3aW5kb3dfd2lkdGg7CisgICAgaW50IHdpbmRvd19oZWlnaHQ7Cit9IE9wZW5HTENvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgT3BlbkdMRm9ybWF0RGVzYyB7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGZpeGVsX2Zvcm1hdDsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKiBmcmFnbWVudF9zaGFkZXI7CisgICAgR0xlbnVtIGZvcm1hdDsKKyAgICBHTGVudW0gdHlwZTsKK30gb3BlbmdsX2Zvcm1hdF9kZXNjW10gPSB7CisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAsICAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVl9QTEFOQVIsICBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9CWVRFIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAsICAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVl9QTEFOQVIsICBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9CWVRFIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAsICAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVl9QTEFOQVIsICBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9CWVRFIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQxMFAsICAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVl9QTEFOQVIsICBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9CWVRFIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQxMVAsICAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVl9QTEFOQVIsICBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9CWVRFIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQ0MFAsICAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVl9QTEFOQVIsICBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9CWVRFIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAxNiwgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVl9QTEFOQVIsICBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9TSE9SVCB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjJQMTYsICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9ZVVZfUExBTkFSLCAgRkZfR0xfUkVEX0NPTVBPTkVOVCwgR0xfVU5TSUdORURfU0hPUlQgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDQ0UDE2LCAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfWVVWX1BMQU5BUiwgIEZGX0dMX1JFRF9DT01QT05FTlQsIEdMX1VOU0lHTkVEX1NIT1JUIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0MjBQLCAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVkFfUExBTkFSLCBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9CWVRFIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0NDRQLCAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVkFfUExBTkFSLCBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9CWVRFIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0MjJQLCAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVkFfUExBTkFSLCBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9CWVRFIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVkE0MjBQMTYsICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVkFfUExBTkFSLCBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9TSE9SVCB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2LCAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9ZVVZBX1BMQU5BUiwgRkZfR0xfUkVEX0NPTVBPTkVOVCwgR0xfVU5TSUdORURfU0hPUlQgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfWVVWQV9QTEFOQVIsIEZGX0dMX1JFRF9DT01QT05FTlQsIEdMX1VOU0lHTkVEX1NIT1JUIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjI0LCAgICAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1JHQl9QQUNLRVQsICBHTF9SR0IsIEdMX1VOU0lHTkVEX0JZVEUgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSMjQsICAgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCX1BBQ0tFVCwgIEdMX1JHQiwgR0xfVU5TSUdORURfQllURSB9LAorICAgIHsgQVZfUElYX0ZNVF8wUkdCLCAgICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUEFDS0VULCAgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0IwLCAgICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUEFDS0VULCAgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSB9LAorICAgIHsgQVZfUElYX0ZNVF8wQkdSLCAgICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUEFDS0VULCAgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1IwLCAgICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUEFDS0VULCAgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NjUsICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUEFDS0VULCAgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1I1NjUsICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUEFDS0VULCAgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NTUsICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUEFDS0VULCAgR0xfUkdCQSwgRkZfR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVYgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSNTU1LCAgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCX1BBQ0tFVCwgIEdMX1JHQkEsIEZGX0dMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjgsICAgICAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1JHQl9QQUNLRVQsICBHTF9SR0IsIEZGX0dMX1VOU0lHTkVEX0JZVEVfM18zXzIgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSOCwgICAgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCX1BBQ0tFVCwgIEdMX1JHQiwgRkZfR0xfVU5TSUdORURfQllURV8yXzNfM19SRVYgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCNDgsICAgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCX1BBQ0tFVCwgIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlQgfSwKKyAgICB7IEFWX1BJWF9GTVRfQVJHQiwgICAgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCQV9QQUNLRVQsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCQSwgICAgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCQV9QQUNLRVQsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUgfSwKKyAgICB7IEFWX1BJWF9GTVRfQUJHUiwgICAgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCQV9QQUNLRVQsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSQSwgICAgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCQV9QQUNLRVQsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCQTY0LCAgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCQV9QQUNLRVQsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX1NIT1JUIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUkE2NCwgICAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1JHQkFfUEFDS0VULCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVCB9LAorICAgIHsgQVZfUElYX0ZNVF9HQlJQLCAgICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUExBTkFSLCAgRkZfR0xfUkVEX0NPTVBPTkVOVCwgR0xfVU5TSUdORURfQllURSB9LAorICAgIHsgQVZfUElYX0ZNVF9HQlJQMTYsICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUExBTkFSLCAgRkZfR0xfUkVEX0NPTVBPTkVOVCwgR0xfVU5TSUdORURfU0hPUlQgfSwKKyAgICB7IEFWX1BJWF9GTVRfR0JSQVAsICAgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCQV9QTEFOQVIsIEZGX0dMX1JFRF9DT01QT05FTlQsIEdMX1VOU0lHTkVEX0JZVEUgfSwKKyAgICB7IEFWX1BJWF9GTVRfR0JSQVAxNiwgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCQV9QTEFOQVIsIEZGX0dMX1JFRF9DT01QT05FTlQsIEdMX1VOU0lHTkVEX1NIT1JUIH0sCisgICAgeyBBVl9QSVhfRk1UX0dSQVk4LCAgICAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX0dSQVksICAgICAgICBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9CWVRFIH0sCisgICAgeyBBVl9QSVhfRk1UX0dSQVkxNiwgICAgICZGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX0dSQVksICAgICAgICBGRl9HTF9SRURfQ09NUE9ORU5ULCBHTF9VTlNJR05FRF9TSE9SVCB9LAorICAgIHsgQVZfUElYX0ZNVF9OT05FLCAgICAgICBOVUxMIH0KK307CisKK3N0YXRpYyBhdl9jb2xkIGludCBvcGVuZ2xfcHJlcGFyZV92ZXJ0ZXgoQVZGb3JtYXRDb250ZXh0ICpzKTsKK3N0YXRpYyBpbnQgb3BlbmdsX2RyYXcoQVZGb3JtYXRDb250ZXh0ICpoLCB2b2lkICppbnRwdXQsIGludCByZXBhaW50LCBpbnQgaXNfcGt0KTsKK3N0YXRpYyBhdl9jb2xkIGludCBvcGVuZ2xfaW5pdF9jb250ZXh0KE9wZW5HTENvbnRleHQgKm9wZW5nbCk7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgb3BlbmdsX2RlaW5pdF9jb250ZXh0KE9wZW5HTENvbnRleHQgKm9wZW5nbCkKK3sKKyAgICBnbERlbGV0ZVRleHR1cmVzKDQsIG9wZW5nbC0+dGV4dHVyZV9uYW1lKTsKKyAgICBvcGVuZ2wtPnRleHR1cmVfbmFtZVswXSA9IG9wZW5nbC0+dGV4dHVyZV9uYW1lWzFdID0KKyAgICBvcGVuZ2wtPnRleHR1cmVfbmFtZVsyXSA9IG9wZW5nbC0+dGV4dHVyZV9uYW1lWzNdID0gMDsKKyAgICBpZiAob3BlbmdsLT5nbHByb2NzLmdsVXNlUHJvZ3JhbSkKKyAgICAgICAgb3BlbmdsLT5nbHByb2NzLmdsVXNlUHJvZ3JhbSgwKTsKKyAgICBpZiAob3BlbmdsLT5nbHByb2NzLmdsRGVsZXRlUHJvZ3JhbSkgeworICAgICAgICBvcGVuZ2wtPmdscHJvY3MuZ2xEZWxldGVQcm9ncmFtKG9wZW5nbC0+cHJvZ3JhbSk7CisgICAgICAgIG9wZW5nbC0+cHJvZ3JhbSA9IDA7CisgICAgfQorICAgIGlmIChvcGVuZ2wtPmdscHJvY3MuZ2xEZWxldGVTaGFkZXIpIHsKKyAgICAgICAgb3BlbmdsLT5nbHByb2NzLmdsRGVsZXRlU2hhZGVyKG9wZW5nbC0+dmVydGV4X3NoYWRlcik7CisgICAgICAgIG9wZW5nbC0+Z2xwcm9jcy5nbERlbGV0ZVNoYWRlcihvcGVuZ2wtPmZyYWdtZW50X3NoYWRlcik7CisgICAgICAgIG9wZW5nbC0+dmVydGV4X3NoYWRlciA9IG9wZW5nbC0+ZnJhZ21lbnRfc2hhZGVyID0gMDsKKyAgICB9CisgICAgaWYgKG9wZW5nbC0+Z2xwcm9jcy5nbEJpbmRCdWZmZXIpIHsKKyAgICAgICAgb3BlbmdsLT5nbHByb2NzLmdsQmluZEJ1ZmZlcihGRl9HTF9BUlJBWV9CVUZGRVIsIDApOworICAgICAgICBvcGVuZ2wtPmdscHJvY3MuZ2xCaW5kQnVmZmVyKEZGX0dMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICB9CisgICAgaWYgKG9wZW5nbC0+Z2xwcm9jcy5nbERlbGV0ZUJ1ZmZlcnMpIHsKKyAgICAgICAgb3BlbmdsLT5nbHByb2NzLmdsRGVsZXRlQnVmZmVycygyLCAmb3BlbmdsLT5pbmRleF9idWZmZXIpOworICAgICAgICBvcGVuZ2wtPnZlcnRleF9idWZmZXIgPSBvcGVuZ2wtPmluZGV4X2J1ZmZlciA9IDA7CisgICAgfQorfQorCitzdGF0aWMgaW50IG9wZW5nbF9yZXNpemUoQVZGb3JtYXRDb250ZXh0ICpoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgT3BlbkdMQ29udGV4dCAqb3BlbmdsID0gaC0+cHJpdl9kYXRhOworICAgIG9wZW5nbC0+d2luZG93X3dpZHRoID0gd2lkdGg7CisgICAgb3BlbmdsLT53aW5kb3dfaGVpZ2h0ID0gaGVpZ2h0OworICAgIGlmIChvcGVuZ2wtPmluaXRlZCkgeworICAgICAgICBpZiAob3BlbmdsLT5ub193aW5kb3cgJiYKKyAgICAgICAgICAgIChyZXQgPSBhdmRldmljZV9kZXZfdG9fYXBwX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9ERVZfVE9fQVBQX1BSRVBBUkVfV0lORE9XX0JVRkZFUiwgTlVMTCAsIDApKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19FUlJPUiwgIkFwcGxpY2F0aW9uIGZhaWxlZCB0byBwcmVwYXJlIHdpbmRvdyBidWZmZXIuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIGlmICgocmV0ID0gb3BlbmdsX3ByZXBhcmVfdmVydGV4KGgpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgcmV0ID0gb3BlbmdsX2RyYXcoaCwgTlVMTCwgMSwgMCk7CisgICAgfQorICBlbmQ6CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvcGVuZ2xfY29udHJvbF9tZXNzYWdlKEFWRm9ybWF0Q29udGV4dCAqaCwgaW50IHR5cGUsIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpCit7CisgICAgT3BlbkdMQ29udGV4dCAqb3BlbmdsID0gaC0+cHJpdl9kYXRhOworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSBBVl9BUFBfVE9fREVWX1dJTkRPV19TSVpFOgorICAgICAgICBpZiAoZGF0YSkgeworICAgICAgICAgICAgQVZEZXZpY2VSZWN0ICptZXNzYWdlID0gZGF0YTsKKyAgICAgICAgICAgIHJldHVybiBvcGVuZ2xfcmVzaXplKGgsIG1lc3NhZ2UtPndpZHRoLCBtZXNzYWdlLT5oZWlnaHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgY2FzZSBBVl9BUFBfVE9fREVWX1dJTkRPV19SRVBBSU5UOgorICAgICAgICByZXR1cm4gb3BlbmdsX3Jlc2l6ZShoLCBvcGVuZ2wtPndpbmRvd193aWR0aCwgb3BlbmdsLT53aW5kb3dfaGVpZ2h0KTsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKworI2lmIEhBVkVfU0RMCitzdGF0aWMgaW50IG9wZW5nbF9zZGxfcmVjcmVhdGVfd2luZG93KE9wZW5HTENvbnRleHQgKm9wZW5nbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIG9wZW5nbC0+c3VyZmFjZSA9IFNETF9TZXRWaWRlb01vZGUod2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLCBTRExfT1BFTkdMIHwgU0RMX1JFU0laQUJMRSk7CisgICAgaWYgKCFvcGVuZ2wtPnN1cmZhY2UpIHsKKyAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNldCB2aWRlbyBtb2RlOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZShTRExfR0xfUkVEX1NJWkUsIDgpOworICAgIFNETF9HTF9TZXRBdHRyaWJ1dGUoU0RMX0dMX0dSRUVOX1NJWkUsIDgpOworICAgIFNETF9HTF9TZXRBdHRyaWJ1dGUoU0RMX0dMX0JMVUVfU0laRSwgOCk7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZShTRExfR0xfQUxQSEFfU0laRSwgOCk7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZShTRExfR0xfRE9VQkxFQlVGRkVSLCAxKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcGVuZ2xfc2RsX3Byb2Nlc3NfZXZlbnRzKEFWRm9ybWF0Q29udGV4dCAqaCkKK3sKKyAgICBpbnQgcmV0OworICAgIE9wZW5HTENvbnRleHQgKm9wZW5nbCA9IGgtPnByaXZfZGF0YTsKKyAgICBTRExfRXZlbnQgZXZlbnQ7CisgICAgU0RMX1B1bXBFdmVudHMoKTsKKyAgICB3aGlsZSAoU0RMX1BlZXBFdmVudHMoJmV2ZW50LCAxLCBTRExfR0VURVZFTlQsIFNETF9BTExFVkVOVFMpID4gMCkgeworICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKyAgICAgICAgY2FzZSBTRExfUVVJVDoKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIGNhc2UgU0RMX0tFWURPV046CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleS5rZXlzeW0uc3ltKSB7CisgICAgICAgICAgICBjYXNlIFNETEtfRVNDQVBFOgorICAgICAgICAgICAgY2FzZSBTRExLX3E6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIFNETF9WSURFT1JFU0laRTogeworICAgICAgICAgICAgY2hhciBidWZmZXJbMTAwXTsKKyAgICAgICAgICAgIGludCByZWluaXQ7CisgICAgICAgICAgICBBVkRldmljZVJlY3QgbWVzc2FnZTsKKyAgICAgICAgICAgIC8qIGNsZWFuIHVwIG9sZCBjb250ZXh0IGJlY2F1c2UgU0RMX1NldFZpZGVvTW9kZSBtYXkgbG9zZSBpdHMgc3RhdGUuICovCisgICAgICAgICAgICBTRExfVmlkZW9Ecml2ZXJOYW1lKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgcmVpbml0ID0gIWF2X3N0cm5jYXNlY21wKGJ1ZmZlciwgInF1YXJ0eiIsIHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIGlmIChyZWluaXQpIHsKKyAgICAgICAgICAgICAgICBvcGVuZ2xfZGVpbml0X2NvbnRleHQob3BlbmdsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocmV0ID0gb3BlbmdsX3NkbF9yZWNyZWF0ZV93aW5kb3cob3BlbmdsLCBldmVudC5yZXNpemUudywgZXZlbnQucmVzaXplLmgpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGlmIChyZWluaXQgJiYgKHJldCA9IG9wZW5nbF9pbml0X2NvbnRleHQob3BlbmdsKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBtZXNzYWdlLndpZHRoID0gb3BlbmdsLT5zdXJmYWNlLT53OworICAgICAgICAgICAgbWVzc2FnZS5oZWlnaHQgPSBvcGVuZ2wtPnN1cmZhY2UtPmg7CisgICAgICAgICAgICByZXR1cm4gb3BlbmdsX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9BUFBfVE9fREVWX1dJTkRPV19TSVpFLCAmbWVzc2FnZSwgc2l6ZW9mKEFWRGV2aWNlUmVjdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF2X2NvbGQgb3BlbmdsX3NkbF9jcmVhdGVfd2luZG93KEFWRm9ybWF0Q29udGV4dCAqaCkKK3sKKyAgICBpbnQgcmV0OworICAgIGNoYXIgYnVmZmVyWzEwMF07CisgICAgT3BlbkdMQ29udGV4dCAqb3BlbmdsID0gaC0+cHJpdl9kYXRhOworICAgIEFWRGV2aWNlUmVjdCBtZXNzYWdlOworICAgIGlmIChTRExfSW5pdChTRExfSU5JVF9WSURFTykpIHsKKyAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgU0RMOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisgICAgaWYgKChyZXQgPSBvcGVuZ2xfc2RsX3JlY3JlYXRlX3dpbmRvdyhvcGVuZ2wsIG9wZW5nbC0+d2luZG93X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmdsLT53aW5kb3dfaGVpZ2h0KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19JTkZPLCAiU0RMIGRyaXZlcjogJyVzJy5cbiIsIFNETF9WaWRlb0RyaXZlck5hbWUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpOworICAgIG1lc3NhZ2Uud2lkdGggPSBvcGVuZ2wtPnN1cmZhY2UtPnc7CisgICAgbWVzc2FnZS5oZWlnaHQgPSBvcGVuZ2wtPnN1cmZhY2UtPmg7CisgICAgU0RMX1dNX1NldENhcHRpb24ob3BlbmdsLT53aW5kb3dfdGl0bGUsIE5VTEwpOworICAgIG9wZW5nbF9jb250cm9sX21lc3NhZ2UoaCwgQVZfQVBQX1RPX0RFVl9XSU5ET1dfU0laRSwgJm1lc3NhZ2UsIHNpemVvZihBVkRldmljZVJlY3QpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdl9jb2xkIG9wZW5nbF9zZGxfbG9hZF9wcm9jZWR1cmVzKE9wZW5HTENvbnRleHQgKm9wZW5nbCkKK3sKKyAgICBGRk9wZW5HTEZ1bmN0aW9ucyAqcHJvY3MgPSAmb3BlbmdsLT5nbHByb2NzOworCisjZGVmaW5lIExPQURfT1BFTkdMX0ZVTihuYW1lLCB0eXBlKSBcCisgICAgcHJvY3MtPm5hbWUgPSAodHlwZSlTRExfR0xfR2V0UHJvY0FkZHJlc3MoI25hbWUpOyBcCisgICAgaWYgKCFwcm9jcy0+bmFtZSkgeyBcCisgICAgICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBsb2FkIE9wZW5HTCBmdW5jdGlvbjogJyVzJ1xuIiwgI25hbWUpOyBcCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7IFwKKyAgICB9CisKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xBY3RpdmVUZXh0dXJlLCBGRl9QRk5HTEFDVElWRVRFWFRVUkVQUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbEdlbkJ1ZmZlcnMsIEZGX1BGTkdMR0VOQlVGRkVSU1BST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsRGVsZXRlQnVmZmVycywgRkZfUEZOR0xERUxFVEVCVUZGRVJTUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xCdWZmZXJEYXRhLCBGRl9QRk5HTEJVRkZFUkRBVEFQUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbEJpbmRCdWZmZXIsIEZGX1BGTkdMQklOREJVRkZFUlBST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsR2V0QXR0cmliTG9jYXRpb24sIEZGX1BGTkdMR0VUQVRUUklCTE9DQVRJT05QUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbEdldFVuaWZvcm1Mb2NhdGlvbiwgRkZfUEZOR0xHRVRVTklGT1JNTE9DQVRJT05QUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbFVuaWZvcm0xZiwgRkZfUEZOR0xVTklGT1JNMUZQUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbFVuaWZvcm0xaSwgRkZfUEZOR0xVTklGT1JNMUlQUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbFVuaWZvcm1NYXRyaXg0ZnYsIEZGX1BGTkdMVU5JRk9STU1BVFJJWDRGVlBST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsQ3JlYXRlUHJvZ3JhbSwgRkZfUEZOR0xDUkVBVEVQUk9HUkFNUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xEZWxldGVQcm9ncmFtLCBGRl9QRk5HTERFTEVURVBST0dSQU1QUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbFVzZVByb2dyYW0sIEZGX1BGTkdMVVNFUFJPR1JBTVBST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsTGlua1Byb2dyYW0sIEZGX1BGTkdMTElOS1BST0dSQU1QUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbEdldFByb2dyYW1pdiwgRkZfUEZOR0xHRVRQUk9HUkFNSVZQUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbEdldFByb2dyYW1JbmZvTG9nLCBGRl9QRk5HTEdFVFBST0dSQU1JTkZPTE9HUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xBdHRhY2hTaGFkZXIsIEZGX1BGTkdMQVRUQUNIU0hBREVSUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xDcmVhdGVTaGFkZXIsIEZGX1BGTkdMQ1JFQVRFU0hBREVSUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xEZWxldGVTaGFkZXIsIEZGX1BGTkdMREVMRVRFU0hBREVSUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xDb21waWxlU2hhZGVyLCBGRl9QRk5HTENPTVBJTEVTSEFERVJQUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbFNoYWRlclNvdXJjZSwgRkZfUEZOR0xTSEFERVJTT1VSQ0VQUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbEdldFNoYWRlcml2LCBGRl9QRk5HTEdFVFNIQURFUklWUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xHZXRTaGFkZXJJbmZvTG9nLCBGRl9QRk5HTEdFVFNIQURFUklORk9MT0dQUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCBGRl9QRk5HTEVOQUJMRVZFUlRFWEFUVFJJQkFSUkFZUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyLCBGRl9QRk5HTFZFUlRFWEFUVFJJQlBPSU5URVJQUk9DKQorCisgICAgcmV0dXJuIDA7CisKKyN1bmRlZiBMT0FEX09QRU5HTF9GVU4KK30KKyNlbmRpZiAvKiBIQVZFX1NETCAqLworCisjaWYgZGVmaW5lZChfX0FQUExFX18pCitzdGF0aWMgaW50IGF2X2NvbGQgb3BlbmdsX2xvYWRfcHJvY2VkdXJlcyhPcGVuR0xDb250ZXh0ICpvcGVuZ2wpCit7CisgICAgRkZPcGVuR0xGdW5jdGlvbnMgKnByb2NzID0gJm9wZW5nbC0+Z2xwcm9jczsKKworI2lmIEhBVkVfU0RMCisgICAgaWYgKCFvcGVuZ2wtPm5vX3dpbmRvdykKKyAgICAgICAgcmV0dXJuIG9wZW5nbF9zZGxfbG9hZF9wcm9jZWR1cmVzKG9wZW5nbCk7CisjZW5kaWYKKworICAgIHByb2NzLT5nbEFjdGl2ZVRleHR1cmUgPSBnbEFjdGl2ZVRleHR1cmU7CisgICAgcHJvY3MtPmdsR2VuQnVmZmVycyA9IGdsR2VuQnVmZmVyczsKKyAgICBwcm9jcy0+Z2xEZWxldGVCdWZmZXJzID0gZ2xEZWxldGVCdWZmZXJzOworICAgIHByb2NzLT5nbEJ1ZmZlckRhdGEgPSBnbEJ1ZmZlckRhdGE7CisgICAgcHJvY3MtPmdsQmluZEJ1ZmZlciA9IGdsQmluZEJ1ZmZlcjsKKyAgICBwcm9jcy0+Z2xHZXRBdHRyaWJMb2NhdGlvbiA9IGdsR2V0QXR0cmliTG9jYXRpb247CisgICAgcHJvY3MtPmdsR2V0VW5pZm9ybUxvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb247CisgICAgcHJvY3MtPmdsVW5pZm9ybTFmID0gZ2xVbmlmb3JtMWY7CisgICAgcHJvY3MtPmdsVW5pZm9ybTFpID0gZ2xVbmlmb3JtMWk7CisgICAgcHJvY3MtPmdsVW5pZm9ybU1hdHJpeDRmdiA9IGdsVW5pZm9ybU1hdHJpeDRmdjsKKyAgICBwcm9jcy0+Z2xDcmVhdGVQcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtOworICAgIHByb2NzLT5nbERlbGV0ZVByb2dyYW0gPSBnbERlbGV0ZVByb2dyYW07CisgICAgcHJvY3MtPmdsVXNlUHJvZ3JhbSA9IGdsVXNlUHJvZ3JhbTsKKyAgICBwcm9jcy0+Z2xMaW5rUHJvZ3JhbSA9IGdsTGlua1Byb2dyYW07CisgICAgcHJvY3MtPmdsR2V0UHJvZ3JhbWl2ID0gZ2xHZXRQcm9ncmFtaXY7CisgICAgcHJvY3MtPmdsR2V0UHJvZ3JhbUluZm9Mb2cgPSBnbEdldFByb2dyYW1JbmZvTG9nOworICAgIHByb2NzLT5nbEF0dGFjaFNoYWRlciA9IGdsQXR0YWNoU2hhZGVyOworICAgIHByb2NzLT5nbENyZWF0ZVNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyOworICAgIHByb2NzLT5nbERlbGV0ZVNoYWRlciA9IGdsRGVsZXRlU2hhZGVyOworICAgIHByb2NzLT5nbENvbXBpbGVTaGFkZXIgPSBnbENvbXBpbGVTaGFkZXI7CisgICAgcHJvY3MtPmdsU2hhZGVyU291cmNlID0gZ2xTaGFkZXJTb3VyY2U7CisgICAgcHJvY3MtPmdsR2V0U2hhZGVyaXYgPSBnbEdldFNoYWRlcml2OworICAgIHByb2NzLT5nbEdldFNoYWRlckluZm9Mb2cgPSBnbEdldFNoYWRlckluZm9Mb2c7CisgICAgcHJvY3MtPmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkgPSBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5OworICAgIHByb2NzLT5nbFZlcnRleEF0dHJpYlBvaW50ZXIgPSAoRkZfUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSUFJPQykgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyOworICAgIHJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgYXZfY29sZCBvcGVuZ2xfbG9hZF9wcm9jZWR1cmVzKE9wZW5HTENvbnRleHQgKm9wZW5nbCkKK3sKKyAgICBGRk9wZW5HTEZ1bmN0aW9ucyAqcHJvY3MgPSAmb3BlbmdsLT5nbHByb2NzOworCisjaWYgSEFWRV9HTFhHRVRQUk9DQUREUkVTUworI2RlZmluZSBTZWxlY3RlZEdldFByb2NBZGRyZXNzIGdsWEdldFByb2NBZGRyZXNzCisjZWxpZiBIQVZFX1dHTEdFVFBST0NBRERSRVNTCisjZGVmaW5lIFNlbGVjdGVkR2V0UHJvY0FkZHJlc3Mgd2dsR2V0UHJvY0FkZHJlc3MKKyNlbmRpZgorCisjZGVmaW5lIExPQURfT1BFTkdMX0ZVTihuYW1lLCB0eXBlKSBcCisgICAgcHJvY3MtPm5hbWUgPSAodHlwZSlTZWxlY3RlZEdldFByb2NBZGRyZXNzKCNuYW1lKTsgXAorICAgIGlmICghcHJvY3MtPm5hbWUpIHsgXAorICAgICAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgbG9hZCBPcGVuR0wgZnVuY3Rpb246ICclcydcbiIsICNuYW1lKTsgXAorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOyBcCisgICAgfQorCisjaWYgSEFWRV9TREwKKyAgICBpZiAoIW9wZW5nbC0+bm9fd2luZG93KQorICAgICAgICByZXR1cm4gb3BlbmdsX3NkbF9sb2FkX3Byb2NlZHVyZXMob3BlbmdsKTsKKyNlbmRpZgorCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsQWN0aXZlVGV4dHVyZSwgRkZfUEZOR0xBQ1RJVkVURVhUVVJFUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xHZW5CdWZmZXJzLCBGRl9QRk5HTEdFTkJVRkZFUlNQUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbERlbGV0ZUJ1ZmZlcnMsIEZGX1BGTkdMREVMRVRFQlVGRkVSU1BST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsQnVmZmVyRGF0YSwgRkZfUEZOR0xCVUZGRVJEQVRBUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xCaW5kQnVmZmVyLCBGRl9QRk5HTEJJTkRCVUZGRVJQUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbEdldEF0dHJpYkxvY2F0aW9uLCBGRl9QRk5HTEdFVEFUVFJJQkxPQ0FUSU9OUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xHZXRVbmlmb3JtTG9jYXRpb24sIEZGX1BGTkdMR0VUVU5JRk9STUxPQ0FUSU9OUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xVbmlmb3JtMWYsIEZGX1BGTkdMVU5JRk9STTFGUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xVbmlmb3JtMWksIEZGX1BGTkdMVU5JRk9STTFJUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xVbmlmb3JtTWF0cml4NGZ2LCBGRl9QRk5HTFVOSUZPUk1NQVRSSVg0RlZQUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbENyZWF0ZVByb2dyYW0sIEZGX1BGTkdMQ1JFQVRFUFJPR1JBTVBST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsRGVsZXRlUHJvZ3JhbSwgRkZfUEZOR0xERUxFVEVQUk9HUkFNUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xVc2VQcm9ncmFtLCBGRl9QRk5HTFVTRVBST0dSQU1QUk9DKQorICAgIExPQURfT1BFTkdMX0ZVTihnbExpbmtQcm9ncmFtLCBGRl9QRk5HTExJTktQUk9HUkFNUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xHZXRQcm9ncmFtaXYsIEZGX1BGTkdMR0VUUFJPR1JBTUlWUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xHZXRQcm9ncmFtSW5mb0xvZywgRkZfUEZOR0xHRVRQUk9HUkFNSU5GT0xPR1BST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsQXR0YWNoU2hhZGVyLCBGRl9QRk5HTEFUVEFDSFNIQURFUlBST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsQ3JlYXRlU2hhZGVyLCBGRl9QRk5HTENSRUFURVNIQURFUlBST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsRGVsZXRlU2hhZGVyLCBGRl9QRk5HTERFTEVURVNIQURFUlBST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsQ29tcGlsZVNoYWRlciwgRkZfUEZOR0xDT01QSUxFU0hBREVSUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xTaGFkZXJTb3VyY2UsIEZGX1BGTkdMU0hBREVSU09VUkNFUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xHZXRTaGFkZXJpdiwgRkZfUEZOR0xHRVRTSEFERVJJVlBST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsR2V0U2hhZGVySW5mb0xvZywgRkZfUEZOR0xHRVRTSEFERVJJTkZPTE9HUFJPQykKKyAgICBMT0FEX09QRU5HTF9GVU4oZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSwgRkZfUEZOR0xFTkFCTEVWRVJURVhBVFRSSUJBUlJBWVBST0MpCisgICAgTE9BRF9PUEVOR0xfRlVOKGdsVmVydGV4QXR0cmliUG9pbnRlciwgRkZfUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSUFJPQykKKworICAgIHJldHVybiAwOworCisjdW5kZWYgU2VsZWN0ZWRHZXRQcm9jQWRkcmVzcworI3VuZGVmIExPQURfT1BFTkdMX0ZVTgorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG9wZW5nbF9tYWtlX2lkZW50aXR5KGZsb2F0IG1hdHJpeFsxNl0pCit7CisgICAgbWVtc2V0KG1hdHJpeCwgMCwgMTYgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtYXRyaXhbMF0gPSBtYXRyaXhbNV0gPSBtYXRyaXhbMTBdID0gbWF0cml4WzE1XSA9IDEuMGY7Cit9CisKK3N0YXRpYyB2b2lkIG9wZW5nbF9tYWtlX29ydGhvKGZsb2F0IG1hdHJpeFsxNl0sIGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXJaLCBmbG9hdCBmYXJaKQoreworICAgIGZsb2F0IHJhbCA9IHJpZ2h0ICsgbGVmdDsKKyAgICBmbG9hdCByc2wgPSByaWdodCAtIGxlZnQ7CisgICAgZmxvYXQgdGFiID0gdG9wICsgYm90dG9tOworICAgIGZsb2F0IHRzYiA9IHRvcCAtIGJvdHRvbTsKKyAgICBmbG9hdCBmYW4gPSBmYXJaICsgbmVhclo7CisgICAgZmxvYXQgZnNuID0gZmFyWiAtIG5lYXJaOworCisgICAgbWVtc2V0KG1hdHJpeCwgMCwgMTYgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtYXRyaXhbMF0gPSAyLjBmIC8gcnNsOworICAgIG1hdHJpeFs1XSA9IDIuMGYgLyB0c2I7CisgICAgbWF0cml4WzEwXSA9IC0yLjBmIC8gZnNuOworICAgIG1hdHJpeFsxMl0gPSAtcmFsIC8gcnNsOworICAgIG1hdHJpeFsxM10gPSAtdGFiIC8gdHNiOworICAgIG1hdHJpeFsxNF0gPSAtZmFuIC8gZnNuOworICAgIG1hdHJpeFsxNV0gPSAxLjBmOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgb3BlbmdsX3JlYWRfbGltaXRzKE9wZW5HTENvbnRleHQgKm9wZW5nbCkKK3sKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0eworICAgICAgICBjb25zdCBjaGFyICpleHRlbnNpb247CisgICAgICAgIGludCBtYWpvcjsKKyAgICAgICAgaW50IG1pbm9yOworICAgIH0gcmVxdWlyZWRfZXh0ZW5zaW9uc1tdID0geworICAgICAgICB7ICJHTF9BUkJfbXVsdGl0ZXh0dXJlIiwgICAgICAgICAxLCAzIH0sCisgICAgICAgIHsgIkdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdCIsIDEsIDUgfSwgLy9HTFhfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0CisgICAgICAgIHsgIkdMX0FSQl92ZXJ0ZXhfc2hhZGVyIiwgICAgICAgIDIsIDAgfSwKKyAgICAgICAgeyAiR0xfQVJCX2ZyYWdtZW50X3NoYWRlciIsICAgICAgMiwgMCB9LAorICAgICAgICB7ICJHTF9BUkJfc2hhZGVyX29iamVjdHMiLCAgICAgICAyLCAwIH0sCisgICAgICAgIHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAgfQorICAgIH07CisgICAgaW50IGksIG1ham9yLCBtaW5vcjsKKyAgICBjb25zdCBjaGFyICpleHRlbnNpb25zLCAqdmVyc2lvbjsKKworICAgIHZlcnNpb24gPSBnbEdldFN0cmluZyhHTF9WRVJTSU9OKTsKKyAgICBleHRlbnNpb25zID0gZ2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUyk7CisKKyAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfREVCVUcsICJPcGVuR0wgdmVyc2lvbjogJXNcbiIsIHZlcnNpb24pOworICAgIHNzY2FuZih2ZXJzaW9uLCAiJWQuJWQiLCAmbWFqb3IsICZtaW5vcik7CisKKyAgICBmb3IgKGkgPSAwOyByZXF1aXJlZF9leHRlbnNpb25zW2ldLmV4dGVuc2lvbjsgaSsrKSB7CisgICAgICAgIGlmIChtYWpvciA8IHJlcXVpcmVkX2V4dGVuc2lvbnNbaV0ubWFqb3IgJiYKKyAgICAgICAgICAgIChtYWpvciA9PSByZXF1aXJlZF9leHRlbnNpb25zW2ldLm1ham9yICYmIG1pbm9yIDwgcmVxdWlyZWRfZXh0ZW5zaW9uc1tpXS5taW5vcikgJiYKKyAgICAgICAgICAgICFzdHJzdHIoZXh0ZW5zaW9ucywgcmVxdWlyZWRfZXh0ZW5zaW9uc1tpXS5leHRlbnNpb24pKSB7CisgICAgICAgICAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfRVJST1IsICJSZXF1aXJlZCBleHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRfZXh0ZW5zaW9uc1tpXS5leHRlbnNpb24pOworICAgICAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0RFQlVHLCAiU3VwcG9ydGVkIGV4dGVuc2lvbnMgYXJlOiAlc1xuIiwgZXh0ZW5zaW9ucyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICAgICB9CisgICAgfQorICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfU0laRSwgJm9wZW5nbC0+bWF4X3RleHR1cmVfc2l6ZSk7CisgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVklFV1BPUlRfRElNUywgJm9wZW5nbC0+bWF4X3ZpZXdwb3J0X3dpZHRoKTsKKyAgICBvcGVuZ2wtPm5vbl9wb3dfMl90ZXh0dXJlcyA9IG1ham9yID49IDIgfHwgc3Ryc3RyKGV4dGVuc2lvbnMsICJHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvIik7CisjaWYgZGVmaW5lZChHTF9FU19WRVJTSU9OXzJfMCkKKyAgICBvcGVuZ2wtPnVucGFja19zdWJpbWFnZSA9ICEhc3Ryc3RyKGV4dGVuc2lvbnMsICJHTF9FWFRfdW5wYWNrX3N1YmltYWdlIik7CisjZWxzZQorICAgIG9wZW5nbC0+dW5wYWNrX3N1YmltYWdlID0gMTsKKyNlbmRpZgorCisgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0RFQlVHLCAiTm9uIFBvd2VyIG9mIDIgdGV4dHVyZXMgc3VwcG9ydDogJXNcbiIsIG9wZW5nbC0+bm9uX3Bvd18yX3RleHR1cmVzID8gIlllcyIgOiAiTm8iKTsKKyAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfREVCVUcsICJVbnBhY2sgU3ViaW1hZ2UgZXh0ZW5zaW9uIHN1cHBvcnQ6ICVzXG4iLCBvcGVuZ2wtPnVucGFja19zdWJpbWFnZSA/ICJZZXMiIDogIk5vIik7CisgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0RFQlVHLCAiTWF4IHRleHR1cmUgc2l6ZTogJWR4JWRcbiIsIG9wZW5nbC0+bWF4X3RleHR1cmVfc2l6ZSwgb3BlbmdsLT5tYXhfdGV4dHVyZV9zaXplKTsKKyAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfREVCVUcsICJNYXggdmlld3BvcnQgc2l6ZTogJWR4JWRcbiIsCisgICAgICAgICAgIG9wZW5nbC0+bWF4X3ZpZXdwb3J0X3dpZHRoLCBvcGVuZ2wtPm1heF92aWV3cG9ydF9oZWlnaHQpOworCisgICAgT1BFTkdMX0VSUk9SX0NIRUNLKG9wZW5nbCk7CisgICAgcmV0dXJuIDA7CisgIGZhaWw6CisgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBvcGVuZ2xfZ2V0X2ZyYWdtZW50X3NoYWRlcl9jb2RlKGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKG9wZW5nbF9mb3JtYXRfZGVzYyk7IGkrKykgeworICAgICAgICBpZiAob3BlbmdsX2Zvcm1hdF9kZXNjW2ldLmZpeGVsX2Zvcm1hdCA9PSBmb3JtYXQpCisgICAgICAgICAgICByZXR1cm4gKm9wZW5nbF9mb3JtYXRfZGVzY1tpXS5mcmFnbWVudF9zaGFkZXI7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG9wZW5nbF90eXBlX3NpemUoR0xlbnVtIHR5cGUpCit7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUOgorICAgIGNhc2UgRkZfR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVY6CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNToKKyAgICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgIGNhc2UgRkZfR0xfVU5TSUdORURfQllURV8zXzNfMjoKKyAgICBjYXNlIEZGX0dMX1VOU0lHTkVEX0JZVEVfMl8zXzNfUkVWOgorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBvcGVuZ2xfZ2V0X3RleHR1cmVfcGFyYW1zKE9wZW5HTENvbnRleHQgKm9wZW5nbCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMob3BlbmdsX2Zvcm1hdF9kZXNjKTsgaSsrKSB7CisgICAgICAgIGlmIChvcGVuZ2xfZm9ybWF0X2Rlc2NbaV0uZml4ZWxfZm9ybWF0ID09IG9wZW5nbC0+cGl4X2ZtdCkgeworICAgICAgICAgICAgb3BlbmdsLT5mb3JtYXQgPSBvcGVuZ2xfZm9ybWF0X2Rlc2NbaV0uZm9ybWF0OworICAgICAgICAgICAgb3BlbmdsLT50eXBlID0gb3BlbmdsX2Zvcm1hdF9kZXNjW2ldLnR5cGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgb3BlbmdsX2NvbXB1dGVfZGlzcGxheV9hcmVhKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlJhdGlvbmFsIHNhciwgZGFyOyAvKiBzYW1wbGUgYW5kIGRpc3BsYXkgYXNwZWN0IHJhdGlvcyAqLworICAgIE9wZW5HTENvbnRleHQgKm9wZW5nbCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIEFWQ29kZWNDb250ZXh0ICplbmNjdHggPSBzdC0+Y29kZWM7CisKKyAgICAvKiBjb21wdXRlIG92ZXJsYXkgd2lkdGggYW5kIGhlaWdodCBmcm9tIHRoZSBjb2RlYyBjb250ZXh0IGluZm9ybWF0aW9uICovCisgICAgc2FyID0gc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID8gc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gOiAoQVZSYXRpb25hbCl7IDEsIDEgfTsKKyAgICBkYXIgPSBhdl9tdWxfcShzYXIsIChBVlJhdGlvbmFsKXsgZW5jY3R4LT53aWR0aCwgZW5jY3R4LT5oZWlnaHQgfSk7CisKKyAgICAvKiB3ZSBzdXBwb3NlIHRoZSBzY3JlZW4gaGFzIGEgMS8xIHNhbXBsZSBhc3BlY3QgcmF0aW8gKi8KKyAgICAvKiBmaXQgaW4gdGhlIHdpbmRvdyAqLworICAgIGlmIChhdl9jbXBfcShkYXIsIChBVlJhdGlvbmFsKXsgb3BlbmdsLT53aW5kb3dfd2lkdGgsIG9wZW5nbC0+d2luZG93X2hlaWdodCB9KSA+IDApIHsKKyAgICAgICAgLyogZml0IGluIHdpZHRoICovCisgICAgICAgIG9wZW5nbC0+cGljdHVyZV93aWR0aCA9IG9wZW5nbC0+d2luZG93X3dpZHRoOworICAgICAgICBvcGVuZ2wtPnBpY3R1cmVfaGVpZ2h0ID0gYXZfcmVzY2FsZShvcGVuZ2wtPnBpY3R1cmVfd2lkdGgsIGRhci5kZW4sIGRhci5udW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGZpdCBpbiBoZWlnaHQgKi8KKyAgICAgICAgb3BlbmdsLT5waWN0dXJlX2hlaWdodCA9IG9wZW5nbC0+d2luZG93X2hlaWdodDsKKyAgICAgICAgb3BlbmdsLT5waWN0dXJlX3dpZHRoID0gYXZfcmVzY2FsZShvcGVuZ2wtPnBpY3R1cmVfaGVpZ2h0LCBkYXIubnVtLCBkYXIuZGVuKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgb3BlbmdsX2dldF90ZXh0dXJlX3NpemUoT3BlbkdMQ29udGV4dCAqb3BlbmdsLCBpbnQgaW5fd2lkdGgsIGludCBpbl9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X3dpZHRoLCBpbnQgKm91dF9oZWlnaHQpCit7CisgICAgaWYgKG9wZW5nbC0+bm9uX3Bvd18yX3RleHR1cmVzKSB7CisgICAgICAgICpvdXRfd2lkdGggPSBpbl93aWR0aDsKKyAgICAgICAgKm91dF9oZWlnaHQgPSBpbl9oZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IG1heCA9IEZGTUlOKEZGTUFYKGluX3dpZHRoLCBpbl9oZWlnaHQpLCBvcGVuZ2wtPm1heF90ZXh0dXJlX3NpemUpOworICAgICAgICB1bnNpZ25lZCBwb3dlcl9vZl8yID0gMTsKKyAgICAgICAgd2hpbGUgKHBvd2VyX29mXzIgPCBtYXgpCisgICAgICAgICAgICBwb3dlcl9vZl8yICo9IDI7CisgICAgICAgICpvdXRfaGVpZ2h0ID0gcG93ZXJfb2ZfMjsKKyAgICAgICAgKm91dF93aWR0aCA9IHBvd2VyX29mXzI7CisgICAgICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19ERUJVRywgIlRleHR1cmUgc2l6ZSBjYWxjdWxhdGVkIGZyb20gJWR4JWQgaW50byAlZHglZFxuIiwKKyAgICAgICAgICAgICAgIGluX3dpZHRoLCBpbl9oZWlnaHQsICpvdXRfd2lkdGgsICpvdXRfaGVpZ2h0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgb3BlbmdsX2ZpbGxfY29sb3JfbWFwKE9wZW5HTENvbnRleHQgKm9wZW5nbCkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7CisgICAgaW50IHNoaWZ0OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10ID0gb3BlbmdsLT5waXhfZm10OworCisgICAgLyogV2UgbmVlZCBvcmRlciBvZiBjb21wb25lbnRzLCBub3QgZXhhY3QgcG9zaXRpb24sIHNvbWUgbWlub3IgSEFDS3MgaGVyZSAqLworICAgIGlmIChwaXhfZm10ID09IEFWX1BJWF9GTVRfUkdCNTY1IHx8IHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1I1NTUgfHwKKyAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjggICB8fCBwaXhfZm10ID09IEFWX1BJWF9GTVRfUkdCOCkKKyAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgZWxzZSBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjU2NSB8fCBwaXhfZm10ID09IEFWX1BJWF9GTVRfUkdCNTU1KQorICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9CR1IyNDsKKworICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIGlmICghKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQikpCisgICAgICAgIHJldHVybjsKKworI2RlZmluZSBGSUxMX0NPTVBPTkVOVChpKSB7IFwKKyAgICAgICAgc2hpZnQgPSBkZXNjLT5jb21wW2ldLmRlcHRoX21pbnVzMSA+PiAzOyBcCisgICAgICAgIG9wZW5nbC0+Y29sb3JfbWFwWyhpIDw8IDIpICsgKChkZXNjLT5jb21wW2ldLm9mZnNldF9wbHVzMSAtIDEpID4+IHNoaWZ0KV0gPSAxLjA7IFwKKyAgICB9CisKKyAgICBtZW1zZXQob3BlbmdsLT5jb2xvcl9tYXAsIDAsIHNpemVvZihvcGVuZ2wtPmNvbG9yX21hcCkpOworICAgIEZJTExfQ09NUE9ORU5UKDApOworICAgIEZJTExfQ09NUE9ORU5UKDEpOworICAgIEZJTExfQ09NUE9ORU5UKDIpOworICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSkKKyAgICAgICAgRklMTF9DT01QT05FTlQoMyk7CisKKyN1bmRlZiBGSUxMX0NPTVBPTkVOVAorfQorCitzdGF0aWMgYXZfY29sZCBHTHVpbnQgb3BlbmdsX2xvYWRfc2hhZGVyKE9wZW5HTENvbnRleHQgKm9wZW5nbCwgR0xlbnVtIHR5cGUsIGNvbnN0IGNoYXIgKnNvdXJjZSkKK3sKKyAgICBHTHVpbnQgc2hhZGVyID0gb3BlbmdsLT5nbHByb2NzLmdsQ3JlYXRlU2hhZGVyKHR5cGUpOworICAgIEdMaW50IHJlc3VsdDsKKyAgICBpZiAoIXNoYWRlcikgeworICAgICAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfRVJST1IsICJnbENyZWF0ZVNoYWRlcigpIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmc291cmNlLCBOVUxMKTsKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7CisKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEZGX0dMX0NPTVBJTEVfU1RBVFVTLCAmcmVzdWx0KTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBjaGFyICpsb2c7CisgICAgICAgIG9wZW5nbC0+Z2xwcm9jcy5nbEdldFNoYWRlcml2KHNoYWRlciwgRkZfR0xfSU5GT19MT0dfTEVOR1RILCAmcmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgaWYgKChsb2cgPSBhdl9tYWxsb2MocmVzdWx0KSkpIHsKKyAgICAgICAgICAgICAgICBvcGVuZ2wtPmdscHJvY3MuZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgcmVzdWx0LCBOVUxMLCBsb2cpOworICAgICAgICAgICAgICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19FUlJPUiwgIkNvbXBpbGUgZXJyb3I6ICVzXG4iLCBsb2cpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUobG9nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIE9QRU5HTF9FUlJPUl9DSEVDSyhvcGVuZ2wpOworICAgIHJldHVybiBzaGFkZXI7CisgIGZhaWw6CisgICAgb3BlbmdsLT5nbHByb2NzLmdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBvcGVuZ2xfY29tcGlsZV9zaGFkZXJzKE9wZW5HTENvbnRleHQgKm9wZW5nbCwgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgR0xpbnQgcmVzdWx0OworICAgIGNvbnN0IGNoYXIgKmZyYWdtZW50X3NoYWRlcl9jb2RlID0gb3BlbmdsX2dldF9mcmFnbWVudF9zaGFkZXJfY29kZShwaXhfZm10KTsKKworICAgIGlmICghZnJhZ21lbnRfc2hhZGVyX2NvZGUpIHsKKyAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0VSUk9SLCAiUHJvdmlkZWQgcGl4ZWwgZm9ybWF0ICclcycgaXMgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUocGl4X2ZtdCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG9wZW5nbC0+dmVydGV4X3NoYWRlciA9IG9wZW5nbF9sb2FkX3NoYWRlcihvcGVuZ2wsIEZGX0dMX1ZFUlRFWF9TSEFERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5HTF9WRVJURVhfU0hBREVSKTsKKyAgICBpZiAoIW9wZW5nbC0+dmVydGV4X3NoYWRlcikgeworICAgICAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfRVJST1IsICJWZXJ0ZXggc2hhZGVyIGxvYWRpbmcgZmFpbGVkLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgb3BlbmdsLT5mcmFnbWVudF9zaGFkZXIgPSBvcGVuZ2xfbG9hZF9zaGFkZXIob3BlbmdsLCBGRl9HTF9GUkFHTUVOVF9TSEFERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRfc2hhZGVyX2NvZGUpOworICAgIGlmICghb3BlbmdsLT5mcmFnbWVudF9zaGFkZXIpIHsKKyAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0VSUk9SLCAiRnJhZ21lbnQgc2hhZGVyIGxvYWRpbmcgZmFpbGVkLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBvcGVuZ2wtPnByb2dyYW0gPSBvcGVuZ2wtPmdscHJvY3MuZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgaWYgKCFvcGVuZ2wtPnByb2dyYW0pCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIG9wZW5nbC0+Z2xwcm9jcy5nbEF0dGFjaFNoYWRlcihvcGVuZ2wtPnByb2dyYW0sIG9wZW5nbC0+dmVydGV4X3NoYWRlcik7CisgICAgb3BlbmdsLT5nbHByb2NzLmdsQXR0YWNoU2hhZGVyKG9wZW5nbC0+cHJvZ3JhbSwgb3BlbmdsLT5mcmFnbWVudF9zaGFkZXIpOworICAgIG9wZW5nbC0+Z2xwcm9jcy5nbExpbmtQcm9ncmFtKG9wZW5nbC0+cHJvZ3JhbSk7CisKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xHZXRQcm9ncmFtaXYob3BlbmdsLT5wcm9ncmFtLCBGRl9HTF9MSU5LX1NUQVRVUywgJnJlc3VsdCk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgY2hhciAqbG9nOworICAgICAgICBvcGVuZ2wtPmdscHJvY3MuZ2xHZXRQcm9ncmFtaXYob3BlbmdsLT5wcm9ncmFtLCBGRl9HTF9JTkZPX0xPR19MRU5HVEgsICZyZXN1bHQpOworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBsb2cgPSBhdl9tYWxsb2MocmVzdWx0KTsKKyAgICAgICAgICAgIGlmICghbG9nKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIG9wZW5nbC0+Z2xwcm9jcy5nbEdldFByb2dyYW1JbmZvTG9nKG9wZW5nbC0+cHJvZ3JhbSwgcmVzdWx0LCBOVUxMLCBsb2cpOworICAgICAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0VSUk9SLCAiTGluayBlcnJvcjogJXNcbiIsIGxvZyk7CisgICAgICAgICAgICBhdl9mcmVlKGxvZyk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG9wZW5nbC0+cG9zaXRpb25fYXR0cmliID0gb3BlbmdsLT5nbHByb2NzLmdsR2V0QXR0cmliTG9jYXRpb24ob3BlbmdsLT5wcm9ncmFtLCAiYV9wb3NpdGlvbiIpOworICAgIG9wZW5nbC0+dGV4dHVyZV9jb29yZHNfYXR0cmliID0gb3BlbmdsLT5nbHByb2NzLmdsR2V0QXR0cmliTG9jYXRpb24ob3BlbmdsLT5wcm9ncmFtLCAiYV90ZXh0dXJlQ29vcmRzIik7CisgICAgb3BlbmdsLT5wcm9qZWN0aW9uX21hdHJpeF9sb2NhdGlvbiA9IG9wZW5nbC0+Z2xwcm9jcy5nbEdldFVuaWZvcm1Mb2NhdGlvbihvcGVuZ2wtPnByb2dyYW0sICJ1X3Byb2plY3Rpb25NYXRyaXgiKTsKKyAgICBvcGVuZ2wtPm1vZGVsX3ZpZXdfbWF0cml4X2xvY2F0aW9uID0gb3BlbmdsLT5nbHByb2NzLmdsR2V0VW5pZm9ybUxvY2F0aW9uKG9wZW5nbC0+cHJvZ3JhbSwgInVfbW9kZWxWaWV3TWF0cml4Iik7CisgICAgb3BlbmdsLT5jb2xvcl9tYXBfbG9jYXRpb24gPSBvcGVuZ2wtPmdscHJvY3MuZ2xHZXRVbmlmb3JtTG9jYXRpb24ob3BlbmdsLT5wcm9ncmFtLCAidV9jb2xvck1hcCIpOworICAgIG9wZW5nbC0+dGV4dHVyZV9sb2NhdGlvblswXSA9IG9wZW5nbC0+Z2xwcm9jcy5nbEdldFVuaWZvcm1Mb2NhdGlvbihvcGVuZ2wtPnByb2dyYW0sICJ1X3RleHR1cmUwIik7CisgICAgb3BlbmdsLT50ZXh0dXJlX2xvY2F0aW9uWzFdID0gb3BlbmdsLT5nbHByb2NzLmdsR2V0VW5pZm9ybUxvY2F0aW9uKG9wZW5nbC0+cHJvZ3JhbSwgInVfdGV4dHVyZTEiKTsKKyAgICBvcGVuZ2wtPnRleHR1cmVfbG9jYXRpb25bMl0gPSBvcGVuZ2wtPmdscHJvY3MuZ2xHZXRVbmlmb3JtTG9jYXRpb24ob3BlbmdsLT5wcm9ncmFtLCAidV90ZXh0dXJlMiIpOworICAgIG9wZW5nbC0+dGV4dHVyZV9sb2NhdGlvblszXSA9IG9wZW5nbC0+Z2xwcm9jcy5nbEdldFVuaWZvcm1Mb2NhdGlvbihvcGVuZ2wtPnByb2dyYW0sICJ1X3RleHR1cmUzIik7CisgICAgb3BlbmdsLT5jaHJvbWFfZGl2X3dfbG9jYXRpb24gPSBvcGVuZ2wtPmdscHJvY3MuZ2xHZXRVbmlmb3JtTG9jYXRpb24ob3BlbmdsLT5wcm9ncmFtLCAidV9jaHJvbWFfZGl2X3ciKTsKKyAgICBvcGVuZ2wtPmNocm9tYV9kaXZfaF9sb2NhdGlvbiA9IG9wZW5nbC0+Z2xwcm9jcy5nbEdldFVuaWZvcm1Mb2NhdGlvbihvcGVuZ2wtPnByb2dyYW0sICJ1X2Nocm9tYV9kaXZfaCIpOworCisgICAgT1BFTkdMX0VSUk9SX0NIRUNLKG9wZW5nbCk7CisgICAgcmV0dXJuIDA7CisgIGZhaWw6CisgICAgb3BlbmdsLT5nbHByb2NzLmdsRGVsZXRlU2hhZGVyKG9wZW5nbC0+dmVydGV4X3NoYWRlcik7CisgICAgb3BlbmdsLT5nbHByb2NzLmdsRGVsZXRlU2hhZGVyKG9wZW5nbC0+ZnJhZ21lbnRfc2hhZGVyKTsKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xEZWxldGVQcm9ncmFtKG9wZW5nbC0+cHJvZ3JhbSk7CisgICAgb3BlbmdsLT5mcmFnbWVudF9zaGFkZXIgPSBvcGVuZ2wtPnZlcnRleF9zaGFkZXIgPSBvcGVuZ2wtPnByb2dyYW0gPSAwOworICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgb3BlbmdsX2NvbmZpZ3VyZV90ZXh0dXJlKE9wZW5HTENvbnRleHQgKm9wZW5nbCwgR0x1aW50IHRleHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQoreworICAgIGlmICh0ZXh0dXJlKSB7CisgICAgICAgIGludCBuZXdfd2lkdGgsIG5ld19oZWlnaHQ7CisgICAgICAgIG9wZW5nbF9nZXRfdGV4dHVyZV9zaXplKG9wZW5nbCwgd2lkdGgsIGhlaWdodCwgJm5ld193aWR0aCwgJm5ld19oZWlnaHQpOworICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgb3BlbmdsLT5mb3JtYXQsIG5ld193aWR0aCwgbmV3X2hlaWdodCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIG9wZW5nbC0+Zm9ybWF0LCBvcGVuZ2wtPnR5cGUsIE5VTEwpOworICAgICAgICBPUEVOR0xfRVJST1JfQ0hFQ0soTlVMTCk7CisgICAgfQorICAgIHJldHVybiAwOworICBmYWlsOgorICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgb3BlbmdsX3ByZXBhcmVfdmVydGV4KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBPcGVuR0xDb250ZXh0ICpvcGVuZ2wgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHRleF93LCB0ZXhfaDsKKworICAgIGlmIChvcGVuZ2wtPndpbmRvd193aWR0aCA+IG9wZW5nbC0+bWF4X3ZpZXdwb3J0X3dpZHRoIHx8IG9wZW5nbC0+d2luZG93X2hlaWdodCA+IG9wZW5nbC0+bWF4X3ZpZXdwb3J0X2hlaWdodCkgeworICAgICAgICBvcGVuZ2wtPndpbmRvd193aWR0aCA9IEZGTUlOKG9wZW5nbC0+d2luZG93X3dpZHRoLCBvcGVuZ2wtPm1heF92aWV3cG9ydF93aWR0aCk7CisgICAgICAgIG9wZW5nbC0+d2luZG93X2hlaWdodCA9IEZGTUlOKG9wZW5nbC0+d2luZG93X2hlaWdodCwgb3BlbmdsLT5tYXhfdmlld3BvcnRfaGVpZ2h0KTsKKyAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX1dBUk5JTkcsICJUb28gYmlnIHZpZXdwb3J0IHJlcXVlc3RlZCwgbGltaXRlZCB0byAlZHglZCIsIG9wZW5nbC0+d2luZG93X3dpZHRoLCBvcGVuZ2wtPndpbmRvd19oZWlnaHQpOworICAgIH0KKyAgICBnbFZpZXdwb3J0KDAsIDAsIG9wZW5nbC0+d2luZG93X3dpZHRoLCBvcGVuZ2wtPndpbmRvd19oZWlnaHQpOworICAgIG9wZW5nbF9tYWtlX29ydGhvKG9wZW5nbC0+cHJvamVjdGlvbl9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgLSAoZmxvYXQpb3BlbmdsLT53aW5kb3dfd2lkdGggIC8gMi4wZiwgKGZsb2F0KW9wZW5nbC0+d2luZG93X3dpZHRoICAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgLSAoZmxvYXQpb3BlbmdsLT53aW5kb3dfaGVpZ2h0IC8gMi4wZiwgKGZsb2F0KW9wZW5nbC0+d2luZG93X2hlaWdodCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgMS4wZiwgLTEuMGYpOworICAgIG9wZW5nbF9tYWtlX2lkZW50aXR5KG9wZW5nbC0+bW9kZWxfdmlld19tYXRyaXgpOworCisgICAgb3BlbmdsX2NvbXB1dGVfZGlzcGxheV9hcmVhKHMpOworCisgICAgb3BlbmdsLT52ZXJ0ZXhbMF0ueiA9IG9wZW5nbC0+dmVydGV4WzFdLnogPSBvcGVuZ2wtPnZlcnRleFsyXS56ID0gb3BlbmdsLT52ZXJ0ZXhbM10ueiA9IDAuMGY7CisgICAgb3BlbmdsLT52ZXJ0ZXhbMF0ueCA9IG9wZW5nbC0+dmVydGV4WzFdLnggPSAtIChmbG9hdClvcGVuZ2wtPnBpY3R1cmVfd2lkdGggLyAyLjBmOworICAgIG9wZW5nbC0+dmVydGV4WzJdLnggPSBvcGVuZ2wtPnZlcnRleFszXS54ID0gICAoZmxvYXQpb3BlbmdsLT5waWN0dXJlX3dpZHRoIC8gMi4wZjsKKyAgICBvcGVuZ2wtPnZlcnRleFsxXS55ID0gb3BlbmdsLT52ZXJ0ZXhbMl0ueSA9IC0gKGZsb2F0KW9wZW5nbC0+cGljdHVyZV9oZWlnaHQgLyAyLjBmOworICAgIG9wZW5nbC0+dmVydGV4WzBdLnkgPSBvcGVuZ2wtPnZlcnRleFszXS55ID0gICAoZmxvYXQpb3BlbmdsLT5waWN0dXJlX2hlaWdodCAvIDIuMGY7CisKKyAgICBvcGVuZ2xfZ2V0X3RleHR1cmVfc2l6ZShvcGVuZ2wsIG9wZW5nbC0+d2lkdGgsIG9wZW5nbC0+aGVpZ2h0LCAmdGV4X3csICZ0ZXhfaCk7CisKKyAgICBvcGVuZ2wtPnZlcnRleFswXS5zMCA9IDAuMGY7CisgICAgb3BlbmdsLT52ZXJ0ZXhbMF0udDAgPSAwLjBmOworICAgIG9wZW5nbC0+dmVydGV4WzFdLnMwID0gMC4wZjsKKyAgICBvcGVuZ2wtPnZlcnRleFsxXS50MCA9IChmbG9hdClvcGVuZ2wtPmhlaWdodCAvIChmbG9hdCl0ZXhfaDsKKyAgICBvcGVuZ2wtPnZlcnRleFsyXS5zMCA9IChmbG9hdClvcGVuZ2wtPndpZHRoICAvIChmbG9hdCl0ZXhfdzsKKyAgICBvcGVuZ2wtPnZlcnRleFsyXS50MCA9IChmbG9hdClvcGVuZ2wtPmhlaWdodCAvIChmbG9hdCl0ZXhfaDsKKyAgICBvcGVuZ2wtPnZlcnRleFszXS5zMCA9IChmbG9hdClvcGVuZ2wtPndpZHRoICAvIChmbG9hdCl0ZXhfdzsKKyAgICBvcGVuZ2wtPnZlcnRleFszXS50MCA9IDAuMGY7CisKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xCaW5kQnVmZmVyKEZGX0dMX0FSUkFZX0JVRkZFUiwgb3BlbmdsLT52ZXJ0ZXhfYnVmZmVyKTsKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xCdWZmZXJEYXRhKEZGX0dMX0FSUkFZX0JVRkZFUiwgc2l6ZW9mKG9wZW5nbC0+dmVydGV4KSwgb3BlbmdsLT52ZXJ0ZXgsIEZGX0dMX1NUQVRJQ19EUkFXKTsKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xCaW5kQnVmZmVyKEZGX0dMX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgT1BFTkdMX0VSUk9SX0NIRUNLKG9wZW5nbCk7CisgICAgcmV0dXJuIDA7CisgIGZhaWw6CisgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmdsX3ByZXBhcmUoT3BlbkdMQ29udGV4dCAqb3BlbmdsKQoreworICAgIGludCBpOworICAgIG9wZW5nbC0+Z2xwcm9jcy5nbFVzZVByb2dyYW0ob3BlbmdsLT5wcm9ncmFtKTsKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xVbmlmb3JtTWF0cml4NGZ2KG9wZW5nbC0+cHJvamVjdGlvbl9tYXRyaXhfbG9jYXRpb24sIDEsIEdMX0ZBTFNFLCBvcGVuZ2wtPnByb2plY3Rpb25fbWF0cml4KTsKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xVbmlmb3JtTWF0cml4NGZ2KG9wZW5nbC0+bW9kZWxfdmlld19tYXRyaXhfbG9jYXRpb24sIDEsIEdMX0ZBTFNFLCBvcGVuZ2wtPm1vZGVsX3ZpZXdfbWF0cml4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBpZiAob3BlbmdsLT50ZXh0dXJlX2xvY2F0aW9uW2ldICE9IC0xKSB7CisgICAgICAgICAgICBvcGVuZ2wtPmdscHJvY3MuZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwICsgaSk7CisgICAgICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG9wZW5nbC0+dGV4dHVyZV9uYW1lW2ldKTsKKyAgICAgICAgICAgIG9wZW5nbC0+Z2xwcm9jcy5nbFVuaWZvcm0xaShvcGVuZ2wtPnRleHR1cmVfbG9jYXRpb25baV0sIGkpOworICAgICAgICB9CisgICAgaWYgKG9wZW5nbC0+Y29sb3JfbWFwX2xvY2F0aW9uICE9IC0xKQorICAgICAgICBvcGVuZ2wtPmdscHJvY3MuZ2xVbmlmb3JtTWF0cml4NGZ2KG9wZW5nbC0+Y29sb3JfbWFwX2xvY2F0aW9uLCAxLCBHTF9GQUxTRSwgb3BlbmdsLT5jb2xvcl9tYXApOworICAgIGlmIChvcGVuZ2wtPmNocm9tYV9kaXZfaF9sb2NhdGlvbiAhPSAtMSkKKyAgICAgICAgb3BlbmdsLT5nbHByb2NzLmdsVW5pZm9ybTFmKG9wZW5nbC0+Y2hyb21hX2Rpdl9oX2xvY2F0aW9uLCBvcGVuZ2wtPmNocm9tYV9kaXZfaCk7CisgICAgaWYgKG9wZW5nbC0+Y2hyb21hX2Rpdl93X2xvY2F0aW9uICE9IC0xKQorICAgICAgICBvcGVuZ2wtPmdscHJvY3MuZ2xVbmlmb3JtMWYob3BlbmdsLT5jaHJvbWFfZGl2X3dfbG9jYXRpb24sIG9wZW5nbC0+Y2hyb21hX2Rpdl93KTsKKworICAgIE9QRU5HTF9FUlJPUl9DSEVDSyhvcGVuZ2wpOworICAgIHJldHVybiAwOworICBmYWlsOgorICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworfQorCitzdGF0aWMgaW50IG9wZW5nbF9jcmVhdGVfd2luZG93KEFWRm9ybWF0Q29udGV4dCAqaCkKK3sKKyAgICBPcGVuR0xDb250ZXh0ICpvcGVuZ2wgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICghb3BlbmdsLT5ub193aW5kb3cpIHsKKyNpZiBIQVZFX1NETAorICAgICAgICBpZiAoKHJldCA9IG9wZW5nbF9zZGxfY3JlYXRlX3dpbmRvdyhoKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgY3JlYXRlIGRlZmF1bHQgU0RMIHdpbmRvdy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0VSUk9SLCAiRkZtcGVnIGlzIGNvbXBpbGVkIHdpdGhvdXQgU0RMLiBDYW5ub3QgY3JlYXRlIGRlZmF1bHQgd2luZG93LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBBVkRldmljZVJlY3QgbWVzc2FnZTsKKyAgICAgICAgbWVzc2FnZS54ID0gbWVzc2FnZS55ID0gMDsKKyAgICAgICAgbWVzc2FnZS53aWR0aCA9IG9wZW5nbC0+d2luZG93X3dpZHRoOworICAgICAgICBtZXNzYWdlLmhlaWdodCA9IG9wZW5nbC0+d2luZG93X2hlaWdodDsKKyAgICAgICAgaWYgKChyZXQgPSBhdmRldmljZV9kZXZfdG9fYXBwX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9ERVZfVE9fQVBQX0NSRUFURV9XSU5ET1dfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlICwgc2l6ZW9mKG1lc3NhZ2UpKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfRVJST1IsICJBcHBsaWNhdGlvbiBmYWlsZWQgdG8gY3JlYXRlIHdpbmRvdyBidWZmZXIuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBhdmRldmljZV9kZXZfdG9fYXBwX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9ERVZfVE9fQVBQX1BSRVBBUkVfV0lORE9XX0JVRkZFUiwgTlVMTCAsIDApKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19FUlJPUiwgIkFwcGxpY2F0aW9uIGZhaWxlZCB0byBwcmVwYXJlIHdpbmRvdyBidWZmZXIuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmdsX3JlbGVhc2Vfd2luZG93KEFWRm9ybWF0Q29udGV4dCAqaCkKK3sKKyAgICBpbnQgcmV0OworICAgIE9wZW5HTENvbnRleHQgKm9wZW5nbCA9IGgtPnByaXZfZGF0YTsKKyAgICBpZiAoIW9wZW5nbC0+bm9fd2luZG93KSB7CisjaWYgSEFWRV9TREwKKyAgICAgICAgU0RMX1F1aXQoKTsKKyNlbmRpZgorICAgIH0gZWxzZSBpZiAoKHJldCA9IGF2ZGV2aWNlX2Rldl90b19hcHBfY29udHJvbF9tZXNzYWdlKGgsIEFWX0RFVl9UT19BUFBfREVTVFJPWV9XSU5ET1dfQlVGRkVSLCBOVUxMICwgMCkpIDwgMCkgeworICAgICAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfRVJST1IsICJBcHBsaWNhdGlvbiBmYWlsZWQgdG8gcmVsZWFzZSB3aW5kb3cgYnVmZmVyLlxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgb3BlbmdsX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpoKQoreworICAgIE9wZW5HTENvbnRleHQgKm9wZW5nbCA9IGgtPnByaXZfZGF0YTsKKworICAgIGlmIChvcGVuZ2wtPm5vX3dpbmRvdyAmJgorICAgICAgICBhdmRldmljZV9kZXZfdG9fYXBwX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9ERVZfVE9fQVBQX1BSRVBBUkVfV0lORE9XX0JVRkZFUiwgTlVMTCAsIDApIDwgMCkKKyAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0VSUk9SLCAiQXBwbGljYXRpb24gZmFpbGVkIHRvIHByZXBhcmUgd2luZG93IGJ1ZmZlci5cbiIpOworCisgICAgb3BlbmdsX2RlaW5pdF9jb250ZXh0KG9wZW5nbCk7CisgICAgb3BlbmdsX3JlbGVhc2Vfd2luZG93KGgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBvcGVuZ2xfaW5pdF9jb250ZXh0KE9wZW5HTENvbnRleHQgKm9wZW5nbCkKK3sKKyAgICBpbnQgaSwgcmV0OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKKworICAgIGlmICgocmV0ID0gb3BlbmdsX2NvbXBpbGVfc2hhZGVycyhvcGVuZ2wsIG9wZW5nbC0+cGl4X2ZtdCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQob3BlbmdsLT5waXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MtPm5iX2NvbXBvbmVudHMgPiAwICYmIGRlc2MtPm5iX2NvbXBvbmVudHMgPD0gNCk7CisgICAgZ2xHZW5UZXh0dXJlcyhkZXNjLT5uYl9jb21wb25lbnRzLCBvcGVuZ2wtPnRleHR1cmVfbmFtZSk7CisKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xHZW5CdWZmZXJzKDIsICZvcGVuZ2wtPmluZGV4X2J1ZmZlcik7CisgICAgaWYgKCFvcGVuZ2wtPmluZGV4X2J1ZmZlciB8fCAhb3BlbmdsLT52ZXJ0ZXhfYnVmZmVyKSB7CisgICAgICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19FUlJPUiwgIkJ1ZmZlciBnZW5lcmF0aW9uIGZhaWxlZC5cbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgb3BlbmdsX2NvbmZpZ3VyZV90ZXh0dXJlKG9wZW5nbCwgb3BlbmdsLT50ZXh0dXJlX25hbWVbMF0sIG9wZW5nbC0+d2lkdGgsIG9wZW5nbC0+aGVpZ2h0KTsKKyAgICBpZiAoZGVzYy0+bmJfY29tcG9uZW50cyA+IDEpIHsKKyAgICAgICAgaW50IGhhc19hbHBoYSA9IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBOworICAgICAgICBpbnQgbnVtX3BsYW5lcyA9IGRlc2MtPm5iX2NvbXBvbmVudHMgLSAoaGFzX2FscGhhID8gMSA6IDApOworICAgICAgICBpZiAob3BlbmdsLT5ub25fcG93XzJfdGV4dHVyZXMpIHsKKyAgICAgICAgICAgIG9wZW5nbC0+Y2hyb21hX2Rpdl93ID0gMS4wZjsKKyAgICAgICAgICAgIG9wZW5nbC0+Y2hyb21hX2Rpdl9oID0gMS4wZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wZW5nbC0+Y2hyb21hX2Rpdl93ID0gMSA8PCBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgICAgICAgICAgb3BlbmdsLT5jaHJvbWFfZGl2X2ggPSAxIDw8IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMTsgaSA8IG51bV9wbGFuZXM7IGkrKykKKyAgICAgICAgICAgIGlmIChvcGVuZ2wtPm5vbl9wb3dfMl90ZXh0dXJlcykKKyAgICAgICAgICAgICAgICBvcGVuZ2xfY29uZmlndXJlX3RleHR1cmUob3BlbmdsLCBvcGVuZ2wtPnRleHR1cmVfbmFtZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZGX0NFSUxfUlNISUZUKG9wZW5nbC0+d2lkdGgsIGRlc2MtPmxvZzJfY2hyb21hX3cpLAorICAgICAgICAgICAgICAgICAgICAgICAgRkZfQ0VJTF9SU0hJRlQob3BlbmdsLT5oZWlnaHQsIGRlc2MtPmxvZzJfY2hyb21hX2gpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvcGVuZ2xfY29uZmlndXJlX3RleHR1cmUob3BlbmdsLCBvcGVuZ2wtPnRleHR1cmVfbmFtZVtpXSwgb3BlbmdsLT53aWR0aCwgb3BlbmdsLT5oZWlnaHQpOworICAgICAgICBpZiAoaGFzX2FscGhhKQorICAgICAgICAgICAgb3BlbmdsX2NvbmZpZ3VyZV90ZXh0dXJlKG9wZW5nbCwgb3BlbmdsLT50ZXh0dXJlX25hbWVbM10sIG9wZW5nbC0+d2lkdGgsIG9wZW5nbC0+aGVpZ2h0KTsKKyAgICB9CisKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xCaW5kQnVmZmVyKEZGX0dMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBvcGVuZ2wtPmluZGV4X2J1ZmZlcik7CisgICAgb3BlbmdsLT5nbHByb2NzLmdsQnVmZmVyRGF0YShGRl9HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgc2l6ZW9mKGdfaW5kZXgpLCBnX2luZGV4LCBGRl9HTF9TVEFUSUNfRFJBVyk7CisgICAgb3BlbmdsLT5nbHByb2NzLmdsQmluZEJ1ZmZlcihGRl9HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCk7CisKKyAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgZ2xCbGVuZEZ1bmMoR0xfU1JDX0FMUEhBLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKworICAgIGdsQ2xlYXJDb2xvcigoZmxvYXQpb3BlbmdsLT5iYWNrZ3JvdW5kWzBdIC8gMjU1LjBmLCAoZmxvYXQpb3BlbmdsLT5iYWNrZ3JvdW5kWzFdIC8gMjU1LjBmLAorICAgICAgICAgICAgICAgICAoZmxvYXQpb3BlbmdsLT5iYWNrZ3JvdW5kWzJdIC8gMjU1LjBmLCAxLjBmKTsKKworICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgT1BFTkdMX0VSUk9SX0NIRUNLKG9wZW5nbCk7CisKKyAgICByZXR1cm4gMDsKKyAgZmFpbDoKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgb3BlbmdsX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmgpCit7CisgICAgT3BlbkdMQ29udGV4dCAqb3BlbmdsID0gaC0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGgtPm5iX3N0cmVhbXMgIT0gMSB8fAorICAgICAgICBoLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8gfHwKKyAgICAgICAgaC0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB7CisgICAgICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19FUlJPUiwgIk9ubHkgYSBzaW5nbGUgdmlkZW8gc3RyZWFtIGlzIHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBzdCA9IGgtPnN0cmVhbXNbMF07CisgICAgb3BlbmdsLT53aWR0aCA9IHN0LT5jb2RlYy0+d2lkdGg7CisgICAgb3BlbmdsLT5oZWlnaHQgPSBzdC0+Y29kZWMtPmhlaWdodDsKKyAgICBvcGVuZ2wtPnBpeF9mbXQgPSBzdC0+Y29kZWMtPnBpeF9mbXQ7CisgICAgaWYgKCFvcGVuZ2wtPndpbmRvd193aWR0aCkKKyAgICAgICAgb3BlbmdsLT53aW5kb3dfd2lkdGggPSBvcGVuZ2wtPndpZHRoOworICAgIGlmICghb3BlbmdsLT53aW5kb3dfaGVpZ2h0KQorICAgICAgICBvcGVuZ2wtPndpbmRvd19oZWlnaHQgPSBvcGVuZ2wtPmhlaWdodDsKKworICAgIGlmICghb3BlbmdsLT53aW5kb3dfdGl0bGUgJiYgIW9wZW5nbC0+bm9fd2luZG93KQorICAgICAgICBvcGVuZ2wtPndpbmRvd190aXRsZSA9IGF2X3N0cmR1cChoLT5maWxlbmFtZSk7CisKKyAgICBpZiAoKHJldCA9IG9wZW5nbF9jcmVhdGVfd2luZG93KGgpKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKChyZXQgPSBvcGVuZ2xfcmVhZF9saW1pdHMob3BlbmdsKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAob3BlbmdsLT53aWR0aCA+IG9wZW5nbC0+bWF4X3RleHR1cmVfc2l6ZSB8fCBvcGVuZ2wtPmhlaWdodCA+IG9wZW5nbC0+bWF4X3RleHR1cmVfc2l6ZSkgeworICAgICAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfRVJST1IsICJUb28gYmlnIHBpY3R1cmUgJWR4JWQsIG1heCBzdXBwb3J0ZWQgc2l6ZSBpcyAlZHglZFxuIiwKKyAgICAgICAgICAgICAgIG9wZW5nbC0+d2lkdGgsIG9wZW5nbC0+aGVpZ2h0LCBvcGVuZ2wtPm1heF90ZXh0dXJlX3NpemUsIG9wZW5nbC0+bWF4X3RleHR1cmVfc2l6ZSk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICgocmV0ID0gb3BlbmdsX2xvYWRfcHJvY2VkdXJlcyhvcGVuZ2wpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIG9wZW5nbF9maWxsX2NvbG9yX21hcChvcGVuZ2wpOworICAgIG9wZW5nbF9nZXRfdGV4dHVyZV9wYXJhbXMob3BlbmdsKTsKKworICAgIGlmICgocmV0ID0gb3BlbmdsX2luaXRfY29udGV4dChvcGVuZ2wpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmICgocmV0ID0gb3BlbmdsX3ByZXBhcmVfdmVydGV4KGgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyNpZiBIQVZFX1NETAorICAgIGlmICghb3BlbmdsLT5ub193aW5kb3cpCisgICAgICAgIFNETF9HTF9Td2FwQnVmZmVycygpOworI2VuZGlmCisgICAgaWYgKG9wZW5nbC0+bm9fd2luZG93ICYmCisgICAgICAgIChyZXQgPSBhdmRldmljZV9kZXZfdG9fYXBwX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9ERVZfVE9fQVBQX0RJU1BMQVlfV0lORE9XX0JVRkZFUiwgTlVMTCAsIDApKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0VSUk9SLCAiQXBwbGljYXRpb24gZmFpbGVkIHRvIGRpc3BsYXkgd2luZG93IGJ1ZmZlci5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICBPUEVOR0xfRVJST1JfQ0hFQ0sob3BlbmdsKTsKKworICAgIG9wZW5nbC0+aW5pdGVkID0gMTsKKyAgICByZXR1cm4gMDsKKworICBmYWlsOgorICAgIG9wZW5nbF93cml0ZV90cmFpbGVyKGgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1aW50OF90KiBvcGVuZ2xfZ2V0X3BsYW5lX3BvaW50ZXIoT3BlbkdMQ29udGV4dCAqb3BlbmdsLCBBVlBhY2tldCAqcGt0LCBpbnQgY29tcF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjKQoreworICAgIHVpbnQ4X3QgKmRhdGEgPSBwa3QtPmRhdGE7CisgICAgaW50IHdvcmRzaXplID0gb3BlbmdsX3R5cGVfc2l6ZShvcGVuZ2wtPnR5cGUpOworICAgIGludCB3aWR0aF9jaHJvbWEgPSBGRl9DRUlMX1JTSElGVChvcGVuZ2wtPndpZHRoLCBkZXNjLT5sb2cyX2Nocm9tYV93KTsKKyAgICBpbnQgaGVpZ2h0X2Nocm9tYSA9IEZGX0NFSUxfUlNISUZUKG9wZW5nbC0+aGVpZ2h0LCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBpbnQgcGxhbmUgPSBkZXNjLT5jb21wW2NvbXBfaW5kZXhdLnBsYW5lOworCisgICAgc3dpdGNoKHBsYW5lKSB7CisgICAgY2FzZSAwOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRhdGEgKz0gb3BlbmdsLT53aWR0aCAqIG9wZW5nbC0+aGVpZ2h0ICogd29yZHNpemU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGF0YSArPSBvcGVuZ2wtPndpZHRoICogb3BlbmdsLT5oZWlnaHQgKiB3b3Jkc2l6ZTsKKyAgICAgICAgZGF0YSArPSB3aWR0aF9jaHJvbWEgKiBoZWlnaHRfY2hyb21hICogd29yZHNpemU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgZGF0YSArPSBvcGVuZ2wtPndpZHRoICogb3BlbmdsLT5oZWlnaHQgKiB3b3Jkc2l6ZTsKKyAgICAgICAgZGF0YSArPSAyICogd2lkdGhfY2hyb21hICogaGVpZ2h0X2Nocm9tYSAqIHdvcmRzaXplOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGRhdGE7Cit9CisKKyNkZWZpbmUgTE9BRF9URVhUVVJFX0RBVEEoY29tcF9pbmRleCwgc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHdpZHRoID0gc3ViID8gRkZfQ0VJTF9SU0hJRlQob3BlbmdsLT53aWR0aCwgZGVzYy0+bG9nMl9jaHJvbWFfdykgOiBvcGVuZ2wtPndpZHRoOyAgIFwKKyAgICBpbnQgaGVpZ2h0ID0gc3ViID8gRkZfQ0VJTF9SU0hJRlQob3BlbmdsLT5oZWlnaHQsIGRlc2MtPmxvZzJfY2hyb21hX2gpOiBvcGVuZ2wtPmhlaWdodDsgXAorICAgIHVpbnQ4X3QgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHBsYW5lID0gZGVzYy0+Y29tcFtjb21wX2luZGV4XS5wbGFuZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgb3BlbmdsLT50ZXh0dXJlX25hbWVbY29tcF9pbmRleF0pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFpc19wa3QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR0xpbnQgbGVuZ3RoID0gKChBVkZyYW1lICopaW5wdXQpLT5saW5lc2l6ZVtwbGFuZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgYnl0ZXNfcGVyX3BpeGVsID0gb3BlbmdsX3R5cGVfc2l6ZShvcGVuZ2wtPnR5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJ5dGVzX3Blcl9waXhlbCAqPSBkZXNjLT5uYl9jb21wb25lbnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkYXRhID0gKChBVkZyYW1lICopaW5wdXQpLT5kYXRhW3BsYW5lXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKGxlbmd0aCAlIGJ5dGVzX3Blcl9waXhlbCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChvcGVuZ2wtPnVucGFja19zdWJpbWFnZSB8fCAoKGxlbmd0aCAvIGJ5dGVzX3Blcl9waXhlbCkgPT0gd2lkdGgpKSkgeyAgICAgICAgICAgXAorICAgICAgICAgICAgbGVuZ3RoIC89IGJ5dGVzX3Blcl9waXhlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobGVuZ3RoICE9IHdpZHRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBnbFBpeGVsU3RvcmVpKEZGX0dMX1VOUEFDS19ST1dfTEVOR1RILCBsZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIHdpZHRoLCBoZWlnaHQsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmdsLT5mb3JtYXQsIG9wZW5nbC0+dHlwZSwgZGF0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChsZW5ndGggIT0gd2lkdGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdsUGl4ZWxTdG9yZWkoRkZfR0xfVU5QQUNLX1JPV19MRU5HVEgsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChoID0gMDsgaCA8IGhlaWdodDsgaCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIGgsIHdpZHRoLCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmdsLT5mb3JtYXQsIG9wZW5nbC0+dHlwZSwgZGF0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRhdGEgKz0gbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRhdGEgPSBvcGVuZ2xfZ2V0X3BsYW5lX3BvaW50ZXIob3BlbmdsLCBpbnB1dCwgY29tcF9pbmRleCwgZGVzYyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIHdpZHRoLCBoZWlnaHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmdsLT5mb3JtYXQsIG9wZW5nbC0+dHlwZSwgZGF0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworc3RhdGljIGludCBvcGVuZ2xfZHJhdyhBVkZvcm1hdENvbnRleHQgKmgsIHZvaWQgKmlucHV0LCBpbnQgcmVwYWludCwgaW50IGlzX3BrdCkKK3sKKyAgICBPcGVuR0xDb250ZXh0ICpvcGVuZ2wgPSBoLT5wcml2X2RhdGE7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQgPSBoLT5zdHJlYW1zWzBdLT5jb2RlYy0+cGl4X2ZtdDsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIGludCByZXQ7CisKKyNpZiBIQVZFX1NETAorICAgIGlmICghb3BlbmdsLT5ub193aW5kb3cgJiYgKHJldCA9IG9wZW5nbF9zZGxfcHJvY2Vzc19ldmVudHMoaCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworI2VuZGlmCisgICAgaWYgKG9wZW5nbC0+bm9fd2luZG93ICYmCisgICAgICAgIChyZXQgPSBhdmRldmljZV9kZXZfdG9fYXBwX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9ERVZfVE9fQVBQX1BSRVBBUkVfV0lORE9XX0JVRkZFUiwgTlVMTCAsIDApKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0VSUk9SLCAiQXBwbGljYXRpb24gZmFpbGVkIHRvIHByZXBhcmUgd2luZG93IGJ1ZmZlci5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgIGlmICghcmVwYWludCkgeworICAgICAgICBpZiAoaXNfcGt0KQorICAgICAgICAgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKyAgICAgICAgTE9BRF9URVhUVVJFX0RBVEEoMCwgMCkKKyAgICAgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUikgeworICAgICAgICAgICAgTE9BRF9URVhUVVJFX0RBVEEoMSwgMSkKKyAgICAgICAgICAgIExPQURfVEVYVFVSRV9EQVRBKDIsIDEpCisgICAgICAgICAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEpCisgICAgICAgICAgICAgICAgTE9BRF9URVhUVVJFX0RBVEEoMywgMCkKKyAgICAgICAgfQorICAgIH0KKyAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgIE9QRU5HTF9FUlJPUl9DSEVDSyhvcGVuZ2wpOworCisgICAgaWYgKChyZXQgPSBvcGVuZ2xfcHJlcGFyZShvcGVuZ2wpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIG9wZW5nbC0+Z2xwcm9jcy5nbEJpbmRCdWZmZXIoRkZfR0xfQVJSQVlfQlVGRkVSLCBvcGVuZ2wtPnZlcnRleF9idWZmZXIpOworICAgIG9wZW5nbC0+Z2xwcm9jcy5nbEJpbmRCdWZmZXIoRkZfR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG9wZW5nbC0+aW5kZXhfYnVmZmVyKTsKKyAgICBvcGVuZ2wtPmdscHJvY3MuZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG9wZW5nbC0+cG9zaXRpb25fYXR0cmliLCAzLCBHTF9GTE9BVCwgR0xfRkFMU0UsIHNpemVvZihPcGVuR0xWZXJ0ZXhJbmZvKSwgMCk7CisgICAgb3BlbmdsLT5nbHByb2NzLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkob3BlbmdsLT5wb3NpdGlvbl9hdHRyaWIpOworICAgIG9wZW5nbC0+Z2xwcm9jcy5nbFZlcnRleEF0dHJpYlBvaW50ZXIob3BlbmdsLT50ZXh0dXJlX2Nvb3Jkc19hdHRyaWIsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgc2l6ZW9mKE9wZW5HTFZlcnRleEluZm8pLCAxMik7CisgICAgb3BlbmdsLT5nbHByb2NzLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkob3BlbmdsLT50ZXh0dXJlX2Nvb3Jkc19hdHRyaWIpOworCisgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBGRl9BUlJBWV9FTEVNUyhnX2luZGV4KSwgR0xfVU5TSUdORURfU0hPUlQsIDApOworCisgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICBPUEVOR0xfRVJST1JfQ0hFQ0sob3BlbmdsKTsKKworI2lmIEhBVkVfU0RMCisgICAgaWYgKCFvcGVuZ2wtPm5vX3dpbmRvdykKKyAgICAgICAgU0RMX0dMX1N3YXBCdWZmZXJzKCk7CisjZW5kaWYKKyAgICBpZiAob3BlbmdsLT5ub193aW5kb3cgJiYKKyAgICAgICAgKHJldCA9IGF2ZGV2aWNlX2Rldl90b19hcHBfY29udHJvbF9tZXNzYWdlKGgsIEFWX0RFVl9UT19BUFBfRElTUExBWV9XSU5ET1dfQlVGRkVSLCBOVUxMICwgMCkpIDwgMCkgeworICAgICAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfRVJST1IsICJBcHBsaWNhdGlvbiBmYWlsZWQgdG8gZGlzcGxheSB3aW5kb3cgYnVmZmVyLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyAgZmFpbDoKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9wZW5nbF93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpoLCBBVlBhY2tldCAqcGt0KQoreworICAgIHJldHVybiBvcGVuZ2xfZHJhdyhoLCBwa3QsIDAsIDEpOworfQorCitzdGF0aWMgaW50IG9wZW5nbF93cml0ZV9mcmFtZShBVkZvcm1hdENvbnRleHQgKmgsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICoqZnJhbWUsIHVuc2lnbmVkIGZsYWdzKQoreworICAgIGlmICgoZmxhZ3MgJiBBVl9XUklURV9VTkNPREVEX0ZSQU1FX1FVRVJZKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIG9wZW5nbF9kcmF3KGgsICpmcmFtZSwgMCwgMCk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE9wZW5HTENvbnRleHQsIHgpCisjZGVmaW5lIEVOQyBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJiYWNrZ3JvdW5kIiwgICAic2V0IGJhY2tncm91bmQgY29sb3IiLCAgIE9GRlNFVChiYWNrZ3JvdW5kKSwgICBBVl9PUFRfVFlQRV9DT0xPUiwgIHsuc3RyID0gImJsYWNrIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRU5DIH0sCisgICAgeyAibm9fd2luZG93IiwgICAgImRpc2FibGUgZGVmYXVsdCB3aW5kb3ciLCBPRkZTRVQobm9fd2luZG93KSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDB9LCBJTlRfTUlOLCBJTlRfTUFYLCBFTkMgfSwKKyAgICB7ICJ3aW5kb3dfdGl0bGUiLCAic2V0IHdpbmRvdyB0aXRsZSIsICAgICAgIE9GRlNFVCh3aW5kb3dfdGl0bGUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEVOQyB9LAorICAgIHsgIndpbmRvd19zaXplIiwgICJzZXQgd2luZG93IHNpemUiLCAgICAgICAgT0ZGU0VUKHdpbmRvd193aWR0aCksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEVOQyB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBvcGVuZ2xfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAib3BlbmdsIG91dGRldiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfVklERU9fT1VUUFVULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfb3BlbmdsX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJvcGVuZ2wiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPcGVuR0wgb3V0cHV0IiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE9wZW5HTENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCisgICAgLndyaXRlX2hlYWRlciAgID0gb3BlbmdsX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBvcGVuZ2xfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV91bmNvZGVkX2ZyYW1lID0gb3BlbmdsX3dyaXRlX2ZyYW1lLAorICAgIC53cml0ZV90cmFpbGVyICA9IG9wZW5nbF93cml0ZV90cmFpbGVyLAorICAgIC5jb250cm9sX21lc3NhZ2UgPSBvcGVuZ2xfY29udHJvbF9tZXNzYWdlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSB8IEFWRk1UX1ZBUklBQkxFX0ZQUyB8IEFWRk1UX05PVElNRVNUQU1QUywKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmb3BlbmdsX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9vcGVuZ2xfZW5jX3NoYWRlcnMuaCBiL2ZmbXBlZy9saWJhdmRldmljZS9vcGVuZ2xfZW5jX3NoYWRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDhiM2QzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL29wZW5nbF9lbmNfc2hhZGVycy5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEx1a2FzeiBNYXJlaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWREVWSUNFX09QRU5HTF9TSEFERVJTX0gKKyNkZWZpbmUgQVZERVZJQ0VfT1BFTkdMX1NIQURFUlNfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IEZGX09QRU5HTF9WRVJURVhfU0hBREVSID0KKyAgICAidW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbk1hdHJpeDsiCisgICAgInVuaWZvcm0gbWF0NCB1X21vZGVsVmlld01hdHJpeDsiCisKKyAgICAiYXR0cmlidXRlIHZlYzQgYV9wb3NpdGlvbjsiCisgICAgImF0dHJpYnV0ZSB2ZWMyIGFfdGV4dHVyZUNvb3JkczsiCisKKyAgICAidmFyeWluZyB2ZWMyIHRleHR1cmVfY29vcmRpbmF0ZTsiCisKKyAgICAidm9pZCBtYWluKCkiCisgICAgInsiCisgICAgICAgICJnbF9Qb3NpdGlvbiA9IHVfcHJvamVjdGlvbk1hdHJpeCAqIChhX3Bvc2l0aW9uICogdV9tb2RlbFZpZXdNYXRyaXgpOyIKKyAgICAgICAgInRleHR1cmVfY29vcmRpbmF0ZSA9IGFfdGV4dHVyZUNvb3JkczsiCisgICAgIn0iOworCisvKioKKyAqIEZyYWdtZW50IHNoYWRlciBmb3IgcGFja2V0IFJHQkEgZm9ybWF0cy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1JHQkFfUEFDS0VUID0KKyNpZiBkZWZpbmVkKEdMX0VTX1ZFUlNJT05fMl8wKQorICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsiCisjZW5kaWYKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlMDsiCisgICAgInVuaWZvcm0gbWF0NCB1X2NvbG9yTWFwOyIKKworICAgICJ2YXJ5aW5nIHZlYzIgdGV4dHVyZV9jb29yZGluYXRlOyIKKworICAgICJ2b2lkIG1haW4oKSIKKyAgICAieyIKKyAgICAgICAgImdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1X3RleHR1cmUwLCB0ZXh0dXJlX2Nvb3JkaW5hdGUpICogdV9jb2xvck1hcDsiCisgICAgIn0iOworCisvKioKKyAqIEZyYWdtZW50IHNoYWRlciBmb3IgcGFja2V0IFJHQiBmb3JtYXRzLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IEZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCX1BBQ0tFVCA9CisjaWYgZGVmaW5lZChHTF9FU19WRVJTSU9OXzJfMCkKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7IgorI2VuZGlmCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTA7IgorICAgICJ1bmlmb3JtIG1hdDQgdV9jb2xvck1hcDsiCisKKyAgICAidmFyeWluZyB2ZWMyIHRleHR1cmVfY29vcmRpbmF0ZTsiCisKKyAgICAidm9pZCBtYWluKCkiCisgICAgInsiCisgICAgICAgICJnbF9GcmFnQ29sb3IgPSB2ZWM0KCh0ZXh0dXJlMkQodV90ZXh0dXJlMCwgdGV4dHVyZV9jb29yZGluYXRlKSAqIHVfY29sb3JNYXApLnJnYiwgMS4wKTsiCisgICAgIn0iOworCisvKioKKyAqIEZyYWdtZW50IHNoYWRlciBmb3IgcGxhbmFyIFJHQkEgZm9ybWF0cy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1JHQkFfUExBTkFSID0KKyNpZiBkZWZpbmVkKEdMX0VTX1ZFUlNJT05fMl8wKQorICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsiCisjZW5kaWYKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlMDsiCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTE7IgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmUyOyIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlMzsiCisKKyAgICAidmFyeWluZyB2ZWMyIHRleHR1cmVfY29vcmRpbmF0ZTsiCisKKyAgICAidm9pZCBtYWluKCkiCisgICAgInsiCisgICAgICAgICJnbF9GcmFnQ29sb3IgPSB2ZWM0KHRleHR1cmUyRCh1X3RleHR1cmUwLCB0ZXh0dXJlX2Nvb3JkaW5hdGUpLnIsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0dXJlMkQodV90ZXh0dXJlMSwgdGV4dHVyZV9jb29yZGluYXRlKS5yLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dHVyZTJEKHVfdGV4dHVyZTIsIHRleHR1cmVfY29vcmRpbmF0ZSkuciwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHR1cmUyRCh1X3RleHR1cmUzLCB0ZXh0dXJlX2Nvb3JkaW5hdGUpLnIpOyIKKyAgICAifSI7CisKKy8qKgorICogRnJhZ21lbnQgc2hhZGVyIGZvciBwbGFuYXIgUkdCIGZvcm1hdHMuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUExBTkFSID0KKyNpZiBkZWZpbmVkKEdMX0VTX1ZFUlNJT05fMl8wKQorICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsiCisjZW5kaWYKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlMDsiCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTE7IgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmUyOyIKKworICAgICJ2YXJ5aW5nIHZlYzIgdGV4dHVyZV9jb29yZGluYXRlOyIKKworICAgICJ2b2lkIG1haW4oKSIKKyAgICAieyIKKyAgICAgICAgImdsX0ZyYWdDb2xvciA9IHZlYzQodGV4dHVyZTJEKHVfdGV4dHVyZTAsIHRleHR1cmVfY29vcmRpbmF0ZSkuciwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHR1cmUyRCh1X3RleHR1cmUxLCB0ZXh0dXJlX2Nvb3JkaW5hdGUpLnIsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0dXJlMkQodV90ZXh0dXJlMiwgdGV4dHVyZV9jb29yZGluYXRlKS5yLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMS4wKTsiCisgICAgIn0iOworCisvKioKKyAqIEZyYWdtZW50IHNoYWRlciBmb3IgcGxhbmFyIFlVViBmb3JtYXRzLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0ICBGRl9PUEVOR0xfRlJBR01FTlRfU0hBREVSX1lVVl9QTEFOQVIgPQorI2lmIGRlZmluZWQoR0xfRVNfVkVSU0lPTl8yXzApCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OyIKKyNlbmRpZgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmUwOyIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlMTsiCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTI7IgorICAgICJ1bmlmb3JtIGZsb2F0IHVfY2hyb21hX2Rpdl93OyIKKyAgICAidW5pZm9ybSBmbG9hdCB1X2Nocm9tYV9kaXZfaDsiCisKKyAgICAidmFyeWluZyB2ZWMyIHRleHR1cmVfY29vcmRpbmF0ZTsiCisKKyAgICAidm9pZCBtYWluKCkiCisgICAgInsiCisgICAgICAgICJ2ZWMzIHl1djsiCisKKyAgICAgICAgInl1di5yID0gdGV4dHVyZTJEKHVfdGV4dHVyZTAsIHRleHR1cmVfY29vcmRpbmF0ZSkuciAtIDAuMDYyNTsiCisgICAgICAgICJ5dXYuZyA9IHRleHR1cmUyRCh1X3RleHR1cmUxLCB2ZWMyKHRleHR1cmVfY29vcmRpbmF0ZS54IC8gdV9jaHJvbWFfZGl2X3csIHRleHR1cmVfY29vcmRpbmF0ZS55IC8gdV9jaHJvbWFfZGl2X2gpKS5yIC0gMC41OyIKKyAgICAgICAgInl1di5iID0gdGV4dHVyZTJEKHVfdGV4dHVyZTIsIHZlYzIodGV4dHVyZV9jb29yZGluYXRlLnggLyB1X2Nocm9tYV9kaXZfdywgdGV4dHVyZV9jb29yZGluYXRlLnkgLyB1X2Nocm9tYV9kaXZfaCkpLnIgLSAwLjU7IgorCisgICAgICAgICJnbF9GcmFnQ29sb3IgPSBjbGFtcCh2ZWM0KG1hdDMoMS4xNjQzLCAgMS4xNjQzMCwgMS4xNjQzLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjAsICAgIC0wLjM5MTczLCAyLjAxNzAsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEuNTk1OCwgLTAuODEyOTAsIDAuMCkgKiB5dXYsIDEuMCksIDAuMCwgMS4wKTsiCisKKyAgICAifSI7CisKKy8qKgorICogRnJhZ21lbnQgc2hhZGVyIGZvciBwbGFuYXIgWVVWQSBmb3JtYXRzLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IEZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfWVVWQV9QTEFOQVIgPQorI2lmIGRlZmluZWQoR0xfRVNfVkVSU0lPTl8yXzApCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OyIKKyNlbmRpZgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmUwOyIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlMTsiCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTI7IgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmUzOyIKKyAgICAidW5pZm9ybSBmbG9hdCB1X2Nocm9tYV9kaXZfdzsiCisgICAgInVuaWZvcm0gZmxvYXQgdV9jaHJvbWFfZGl2X2g7IgorCisgICAgInZhcnlpbmcgdmVjMiB0ZXh0dXJlX2Nvb3JkaW5hdGU7IgorCisgICAgInZvaWQgbWFpbigpIgorICAgICJ7IgorICAgICAgICAidmVjMyB5dXY7IgorCisgICAgICAgICJ5dXYuciA9IHRleHR1cmUyRCh1X3RleHR1cmUwLCB0ZXh0dXJlX2Nvb3JkaW5hdGUpLnIgLSAwLjA2MjU7IgorICAgICAgICAieXV2LmcgPSB0ZXh0dXJlMkQodV90ZXh0dXJlMSwgdmVjMih0ZXh0dXJlX2Nvb3JkaW5hdGUueCAvIHVfY2hyb21hX2Rpdl93LCB0ZXh0dXJlX2Nvb3JkaW5hdGUueSAvIHVfY2hyb21hX2Rpdl9oKSkuciAtIDAuNTsiCisgICAgICAgICJ5dXYuYiA9IHRleHR1cmUyRCh1X3RleHR1cmUyLCB2ZWMyKHRleHR1cmVfY29vcmRpbmF0ZS54IC8gdV9jaHJvbWFfZGl2X3csIHRleHR1cmVfY29vcmRpbmF0ZS55IC8gdV9jaHJvbWFfZGl2X2gpKS5yIC0gMC41OyIKKworICAgICAgICAiZ2xfRnJhZ0NvbG9yID0gY2xhbXAodmVjNChtYXQzKDEuMTY0MywgIDEuMTY0MzAsIDEuMTY0MywiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMC4wLCAgICAtMC4zOTE3MywgMi4wMTcwLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxLjU5NTgsIC0wLjgxMjkwLCAwLjApICogeXV2LCB0ZXh0dXJlMkQodV90ZXh0dXJlMywgdGV4dHVyZV9jb29yZGluYXRlKS5yKSwgMC4wLCAxLjApOyIKKyAgICAifSI7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9HUkFZID0KKyNpZiBkZWZpbmVkKEdMX0VTX1ZFUlNJT05fMl8wKQorICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsiCisjZW5kaWYKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlMDsiCisgICAgInZhcnlpbmcgdmVjMiB0ZXh0dXJlX2Nvb3JkaW5hdGU7IgorICAgICJ2b2lkIG1haW4oKSIKKyAgICAieyIKKyAgICAgICAgImZsb2F0IGMgPSB0ZXh0dXJlMkQodV90ZXh0dXJlMCwgdGV4dHVyZV9jb29yZGluYXRlKS5yOyIKKyAgICAgICAgImdsX0ZyYWdDb2xvciA9IHZlYzQoYywgYywgYywgMS4wKTsiCisgICAgIn0iOworCisjZW5kaWYgLyogQVZERVZJQ0VfT1BFTkdMX1NIQURFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL29zc19hdWRpby5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL29zc19hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOGI1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2Uvb3NzX2F1ZGlvLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBMaW51eCBhdWRpbyBwbGF5IGFuZCBncmFiIGludGVyZmFjZQorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIEhBVkVfU09VTkRDQVJEX0gKKyNpbmNsdWRlIDxzb3VuZGNhcmQuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorI2VuZGlmCisKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAiYXZkZXZpY2UuaCIKKworI2luY2x1ZGUgIm9zc19hdWRpby5oIgorCitpbnQgZmZfb3NzX2F1ZGlvX29wZW4oQVZGb3JtYXRDb250ZXh0ICpzMSwgaW50IGlzX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphdWRpb19kZXZpY2UpCit7CisgICAgT1NTQXVkaW9EYXRhICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBpbnQgYXVkaW9fZmQ7CisgICAgaW50IHRtcCwgZXJyOworICAgIGNoYXIgKmZsaXAgPSBnZXRlbnYoIkFVRElPX0ZMSVBfTEVGVCIpOworCisgICAgaWYgKGlzX291dHB1dCkKKyAgICAgICAgYXVkaW9fZmQgPSBhdnByaXZfb3BlbihhdWRpb19kZXZpY2UsIE9fV1JPTkxZKTsKKyAgICBlbHNlCisgICAgICAgIGF1ZGlvX2ZkID0gYXZwcml2X29wZW4oYXVkaW9fZGV2aWNlLCBPX1JET05MWSk7CisgICAgaWYgKGF1ZGlvX2ZkIDwgMCkgeworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIiVzOiAlc1xuIiwgYXVkaW9fZGV2aWNlLCBhdl9lcnIyc3RyKEFWRVJST1IoZXJybm8pKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgaWYgKGZsaXAgJiYgKmZsaXAgPT0gJzEnKSB7CisgICAgICAgIHMtPmZsaXBfbGVmdCA9IDE7CisgICAgfQorCisgICAgLyogbm9uIGJsb2NraW5nIG1vZGUgKi8KKyAgICBpZiAoIWlzX291dHB1dCkgeworICAgICAgICBpZiAoZmNudGwoYXVkaW9fZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfV0FSTklORywgIiVzOiBDb3VsZCBub3QgZW5hYmxlIG5vbiBibG9jayBtb2RlICglcylcbiIsIGF1ZGlvX2RldmljZSwgYXZfZXJyMnN0cihBVkVSUk9SKGVycm5vKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+ZnJhbWVfc2l6ZSA9IE9TU19BVURJT19CTE9DS19TSVpFOworCisjZGVmaW5lIENIRUNLX0lPQ1RMX0VSUk9SKGV2ZW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVyciA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAjZXZlbnQgIjogJXNcbiIsIGF2X2VycjJzdHIoQVZFUlJPUihlcnJubykpKTtcCisgICAgICAgIGdvdG8gZmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisgICAgLyogc2VsZWN0IGZvcm1hdCA6IGZhdm91ciBuYXRpdmUgZm9ybWF0CisgICAgICogV2UgZG9uJ3QgQ0hFQ0tfSU9DVExfRVJST1IgaGVyZSBiZWNhdXNlIGV2ZW4gaWYgZmFpbGVkIE9TUyBzdGlsbCBtYXkgYmUKKyAgICAgKiB1c2FibGUuIElmIE9TUyBpcyBub3QgdXNhYmxlIHRoZSBTTkRDVExfRFNQX1NFVEZNVFMgbGF0ZXIgaXMgZ29pbmcgdG8KKyAgICAgKiBmYWlsIGFueXdheS4gKi8KKyAgICBlcnIgPSBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9HRVRGTVRTLCAmdG1wKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19XQVJOSU5HLCAiU05EQ1RMX0RTUF9HRVRGTVRTOiAlc1xuIiwgYXZfZXJyMnN0cihBVkVSUk9SKGVycm5vKSkpOworICAgIH0KKworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgaWYgKHRtcCAmIEFGTVRfUzE2X0JFKSB7CisgICAgICAgIHRtcCA9IEFGTVRfUzE2X0JFOworICAgIH0gZWxzZSBpZiAodG1wICYgQUZNVF9TMTZfTEUpIHsKKyAgICAgICAgdG1wID0gQUZNVF9TMTZfTEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wID0gMDsKKyAgICB9CisjZWxzZQorICAgIGlmICh0bXAgJiBBRk1UX1MxNl9MRSkgeworICAgICAgICB0bXAgPSBBRk1UX1MxNl9MRTsKKyAgICB9IGVsc2UgaWYgKHRtcCAmIEFGTVRfUzE2X0JFKSB7CisgICAgICAgIHRtcCA9IEFGTVRfUzE2X0JFOworICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICBzd2l0Y2godG1wKSB7CisgICAgY2FzZSBBRk1UX1MxNl9MRToKKyAgICAgICAgcy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUZNVF9TMTZfQkU6CisgICAgICAgIHMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkJFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIlNvdW5kY2FyZCBkb2VzIG5vdCBzdXBwb3J0IDE2IGJpdCBzYW1wbGUgZm9ybWF0XG4iKTsKKyAgICAgICAgY2xvc2UoYXVkaW9fZmQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBlcnI9aW9jdGwoYXVkaW9fZmQsIFNORENUTF9EU1BfU0VURk1ULCAmdG1wKTsKKyAgICBDSEVDS19JT0NUTF9FUlJPUihTTkRDVExfRFNQX1NFVEZNVFMpCisKKyAgICB0bXAgPSAocy0+Y2hhbm5lbHMgPT0gMik7CisgICAgZXJyID0gaW9jdGwoYXVkaW9fZmQsIFNORENUTF9EU1BfU1RFUkVPLCAmdG1wKTsKKyAgICBDSEVDS19JT0NUTF9FUlJPUihTTkRDVExfRFNQX1NURVJFTykKKworICAgIHRtcCA9IHMtPnNhbXBsZV9yYXRlOworICAgIGVyciA9IGlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX1NQRUVELCAmdG1wKTsKKyAgICBDSEVDS19JT0NUTF9FUlJPUihTTkRDVExfRFNQX1NQRUVEKQorICAgIHMtPnNhbXBsZV9yYXRlID0gdG1wOyAvKiBzdG9yZSByZWFsIHNhbXBsZSByYXRlICovCisgICAgcy0+ZmQgPSBhdWRpb19mZDsKKworICAgIHJldHVybiAwOworIGZhaWw6CisgICAgY2xvc2UoYXVkaW9fZmQpOworICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisjdW5kZWYgQ0hFQ0tfSU9DVExfRVJST1IKK30KKworaW50IGZmX29zc19hdWRpb19jbG9zZShPU1NBdWRpb0RhdGEgKnMpCit7CisgICAgY2xvc2Uocy0+ZmQpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL29zc19hdWRpby5oIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL29zc19hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTgwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2Uvb3NzX2F1ZGlvLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWREVWSUNFX09TU19BVURJT19ICisjZGVmaW5lIEFWREVWSUNFX09TU19BVURJT19ICisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisKKyNkZWZpbmUgT1NTX0FVRElPX0JMT0NLX1NJWkUgNDA5NgorCit0eXBlZGVmIHN0cnVjdCBPU1NBdWRpb0RhdGEgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBmZDsKKyAgICBpbnQgc2FtcGxlX3JhdGU7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBmcmFtZV9zaXplOyAvKiBpbiBieXRlcyAhICovCisgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQ7CisgICAgdW5zaWduZWQgaW50IGZsaXBfbGVmdCA6IDE7CisgICAgdWludDhfdCBidWZmZXJbT1NTX0FVRElPX0JMT0NLX1NJWkVdOworICAgIGludCBidWZmZXJfcHRyOworfSBPU1NBdWRpb0RhdGE7CisKK2ludCBmZl9vc3NfYXVkaW9fb3BlbihBVkZvcm1hdENvbnRleHQgKnMxLCBpbnQgaXNfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF1ZGlvX2RldmljZSk7CisKK2ludCBmZl9vc3NfYXVkaW9fY2xvc2UoT1NTQXVkaW9EYXRhICpzKTsKKworI2VuZGlmIC8qIEFWREVWSUNFX09TU19BVURJT19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2Uvb3NzX2F1ZGlvX2RlYy5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL29zc19hdWRpb19kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjg2ZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL29zc19hdWRpb19kZWMuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIExpbnV4IGF1ZGlvIHBsYXkgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgSEFWRV9TT1VORENBUkRfSAorI2luY2x1ZGUgPHNvdW5kY2FyZC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CisjZW5kaWYKKworI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorCisjaW5jbHVkZSAiYXZkZXZpY2UuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSAib3NzX2F1ZGlvLmgiCisKK3N0YXRpYyBpbnQgYXVkaW9fcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzMSkKK3sKKyAgICBPU1NBdWRpb0RhdGEgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgcmV0OworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMxLCBOVUxMKTsKKyAgICBpZiAoIXN0KSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0ID0gZmZfb3NzX2F1ZGlvX29wZW4oczEsIDAsIHMxLT5maWxlbmFtZSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICAvKiB0YWtlIHJlYWwgcGFyYW1ldGVycyAqLworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gcy0+Y29kZWNfaWQ7CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHMtPnNhbXBsZV9yYXRlOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBzLT5jaGFubmVsczsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsgIC8qIDY0IGJpdHMgcHRzIGluIHVzICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzMSwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBPU1NBdWRpb0RhdGEgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIGludCByZXQsIGJkZWxheTsKKyAgICBpbnQ2NF90IGN1cl90aW1lOworICAgIHN0cnVjdCBhdWRpb19idWZfaW5mbyBhYnVmaTsKKworICAgIGlmICgocmV0PWF2X25ld19wYWNrZXQocGt0LCBzLT5mcmFtZV9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gcmVhZChzLT5mZCwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIGlmIChyZXQgPD0gMCl7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgIHBrdC0+c2l6ZSA9IDA7CisgICAgICAgIGlmIChyZXQ8MCkgIHJldHVybiBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgZWxzZSAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0KKyAgICBwa3QtPnNpemUgPSByZXQ7CisKKyAgICAvKiBjb21wdXRlIHB0cyBvZiB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldCAqLworICAgIGN1cl90aW1lID0gYXZfZ2V0dGltZSgpOworICAgIGJkZWxheSA9IHJldDsKKyAgICBpZiAoaW9jdGwocy0+ZmQsIFNORENUTF9EU1BfR0VUSVNQQUNFLCAmYWJ1ZmkpID09IDApIHsKKyAgICAgICAgYmRlbGF5ICs9IGFidWZpLmJ5dGVzOworICAgIH0KKyAgICAvKiBzdWJ0cmFjdCB0aW1lIHJlcHJlc2VudGVkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGF1ZGlvIGZpZm8gKi8KKyAgICBjdXJfdGltZSAtPSAoYmRlbGF5ICogMTAwMDAwMExMKSAvIChzLT5zYW1wbGVfcmF0ZSAqIHMtPmNoYW5uZWxzKTsKKworICAgIC8qIGNvbnZlcnQgdG8gd2FudGVkIHVuaXRzICovCisgICAgcGt0LT5wdHMgPSBjdXJfdGltZTsKKworICAgIGlmIChzLT5mbGlwX2xlZnQgJiYgcy0+Y2hhbm5lbHMgPT0gMikgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgc2hvcnQgKnAgPSAoc2hvcnQgKikgcGt0LT5kYXRhOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXQ7IGkgKz0gNCkgeworICAgICAgICAgICAgKnAgPSB+KnA7CisgICAgICAgICAgICBwICs9IDI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMxKQoreworICAgIE9TU0F1ZGlvRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CisKKyAgICBmZl9vc3NfYXVkaW9fY2xvc2Uocyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAic2FtcGxlX3JhdGUiLCAiIiwgb2Zmc2V0b2YoT1NTQXVkaW9EYXRhLCBzYW1wbGVfcmF0ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA0ODAwMH0sIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiY2hhbm5lbHMiLCAgICAiIiwgb2Zmc2V0b2YoT1NTQXVkaW9EYXRhLCBjaGFubmVscyksICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAyfSwgICAgIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBvc3NfZGVtdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAiT1NTIGRlbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgICAgICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgICAgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9BVURJT19JTlBVVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfb3NzX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm9zcyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9TUyAoT3BlbiBTb3VuZCBTeXN0ZW0pIGNhcHR1cmUiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoT1NTQXVkaW9EYXRhKSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhdWRpb19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBhdWRpb19yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBhdWRpb19yZWFkX2Nsb3NlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmb3NzX2RlbXV4ZXJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL29zc19hdWRpb19lbmMuYyBiL2ZmbXBlZy9saWJhdmRldmljZS9vc3NfYXVkaW9fZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzYmRlZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9vc3NfYXVkaW9fZW5jLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBMaW51eCBhdWRpbyBncmFiIGludGVyZmFjZQorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX1NPVU5EQ0FSRF9ICisjaW5jbHVkZSA8c291bmRjYXJkLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KKyNlbmRpZgorCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisKKyNpbmNsdWRlICJhdmRldmljZS5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisKKyNpbmNsdWRlICJvc3NfYXVkaW8uaCIKKworc3RhdGljIGludCBhdWRpb193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzMSkKK3sKKyAgICBPU1NBdWRpb0RhdGEgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgcmV0OworCisgICAgc3QgPSBzMS0+c3RyZWFtc1swXTsKKyAgICBzLT5zYW1wbGVfcmF0ZSA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgcy0+Y2hhbm5lbHMgPSBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgIHJldCA9IGZmX29zc19hdWRpb19vcGVuKHMxLCAxLCBzMS0+ZmlsZW5hbWUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgaW50IGF1ZGlvX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMxLCBBVlBhY2tldCAqcGt0KQoreworICAgIE9TU0F1ZGlvRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgaW50IGxlbiwgcmV0OworICAgIGludCBzaXplPSBwa3QtPnNpemU7CisgICAgdWludDhfdCAqYnVmPSBwa3QtPmRhdGE7CisKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgbGVuID0gRkZNSU4oT1NTX0FVRElPX0JMT0NLX1NJWkUgLSBzLT5idWZmZXJfcHRyLCBzaXplKTsKKyAgICAgICAgbWVtY3B5KHMtPmJ1ZmZlciArIHMtPmJ1ZmZlcl9wdHIsIGJ1ZiwgbGVuKTsKKyAgICAgICAgcy0+YnVmZmVyX3B0ciArPSBsZW47CisgICAgICAgIGlmIChzLT5idWZmZXJfcHRyID49IE9TU19BVURJT19CTE9DS19TSVpFKSB7CisgICAgICAgICAgICBmb3IoOzspIHsKKyAgICAgICAgICAgICAgICByZXQgPSB3cml0ZShzLT5mZCwgcy0+YnVmZmVyLCBPU1NfQVVESU9fQkxPQ0tfU0laRSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA+IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwICYmIChlcnJubyAhPSBFQUdBSU4gJiYgZXJybm8gIT0gRUlOVFIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+YnVmZmVyX3B0ciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnVmICs9IGxlbjsKKyAgICAgICAgc2l6ZSAtPSBsZW47CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1ZGlvX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzMSkKK3sKKyAgICBPU1NBdWRpb0RhdGEgKnMgPSBzMS0+cHJpdl9kYXRhOworCisgICAgZmZfb3NzX2F1ZGlvX2Nsb3NlKHMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBvc3NfbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgICAgID0gIk9TUyBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLnZlcnNpb24gICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgICAgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9BVURJT19PVVRQVVQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9vc3NfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm9zcyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9TUyAoT3BlbiBTb3VuZCBTeXN0ZW0pIHBsYXliYWNrIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE9TU0F1ZGlvRGF0YSksCisgICAgLyogWFhYOiB3ZSBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHNvdW5kY2FyZCBhY2NlcHRzIHRoaXMgZm9ybWF0ICovCisgICAgLyogWFhYOiBmaW5kIGJldHRlciBzb2x1dGlvbiB3aXRoICJwcmVpbml0IiBtZXRob2QsIG5lZWRlZCBhbHNvIGluCisgICAgICAgb3RoZXIgZm9ybWF0cyAqLworICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX05FKEFWX0NPREVDX0lEX1BDTV9TMTZCRSwgQVZfQ09ERUNfSURfUENNX1MxNkxFKSwKKyAgICAudmlkZW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC53cml0ZV9oZWFkZXIgICA9IGF1ZGlvX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBhdWRpb193cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gYXVkaW9fd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJm9zc19tdXhlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvcHVsc2VfYXVkaW9fY29tbW9uLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvcHVsc2VfYXVkaW9fY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0NjY0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9wdWxzZV9hdWRpb19jb21tb24uYwpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIFB1bHNlYXVkaW8gY29tbW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTHVrYXN6IE1hcmVrCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTHVjYSBCYXJiYXRvIDxsdV96ZXJvQGdlbnRvby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJwdWxzZV9hdWRpb19jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworcGFfc2FtcGxlX2Zvcm1hdF90IGF2X2NvbGQgZmZfY29kZWNfaWRfdG9fcHVsc2VfZm9ybWF0KGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKQoreworICAgIHN3aXRjaCAoY29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VODogICAgcmV0dXJuIFBBX1NBTVBMRV9VODsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9BTEFXOiAgcmV0dXJuIFBBX1NBTVBMRV9BTEFXOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX01VTEFXOiByZXR1cm4gUEFfU0FNUExFX1VMQVc7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU6IHJldHVybiBQQV9TQU1QTEVfUzE2TEU7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU6IHJldHVybiBQQV9TQU1QTEVfUzE2QkU7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjMyTEU6IHJldHVybiBQQV9TQU1QTEVfRkxPQVQzMkxFOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkJFOiByZXR1cm4gUEFfU0FNUExFX0ZMT0FUMzJCRTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJMRTogcmV0dXJuIFBBX1NBTVBMRV9TMzJMRTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJCRTogcmV0dXJuIFBBX1NBTVBMRV9TMzJCRTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRMRTogcmV0dXJuIFBBX1NBTVBMRV9TMjRMRTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRCRTogcmV0dXJuIFBBX1NBTVBMRV9TMjRCRTsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBBX1NBTVBMRV9JTlZBTElEOworICAgIH0KK30KKworZW51bSBQdWxzZUF1ZGlvQ29udGV4dFN0YXRlIHsKKyAgICBQVUxTRV9DT05URVhUX0lOSVRJQUxJWklORywKKyAgICBQVUxTRV9DT05URVhUX1JFQURZLAorICAgIFBVTFNFX0NPTlRFWFRfRklOSVNIRUQKK307CisKK3R5cGVkZWYgc3RydWN0IFB1bHNlQXVkaW9EZXZpY2VMaXN0IHsKKyAgICBBVkRldmljZUluZm9MaXN0ICpkZXZpY2VzOworICAgIGludCBlcnJvcl9jb2RlOworICAgIGludCBvdXRwdXQ7CisgICAgY2hhciAqZGVmYXVsdF9kZXZpY2U7Cit9IFB1bHNlQXVkaW9EZXZpY2VMaXN0OworCitzdGF0aWMgdm9pZCBwYV9zdGF0ZV9jYihwYV9jb250ZXh0ICpjLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgICBlbnVtIFB1bHNlQXVkaW9Db250ZXh0U3RhdGUgKmNvbnRleHRfc3RhdGUgPSB1c2VyZGF0YTsKKworICAgIHN3aXRjaCAgKHBhX2NvbnRleHRfZ2V0X3N0YXRlKGMpKSB7CisgICAgY2FzZSBQQV9DT05URVhUX0ZBSUxFRDoKKyAgICBjYXNlIFBBX0NPTlRFWFRfVEVSTUlOQVRFRDoKKyAgICAgICAgKmNvbnRleHRfc3RhdGUgPSBQVUxTRV9DT05URVhUX0ZJTklTSEVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBBX0NPTlRFWFRfUkVBRFk6CisgICAgICAgICpjb250ZXh0X3N0YXRlID0gUFVMU0VfQ09OVEVYVF9SRUFEWTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGZmX3B1bHNlX2F1ZGlvX2Rpc2Nvbm5lY3RfY29udGV4dChwYV9tYWlubG9vcCAqKnBhX21sLCBwYV9jb250ZXh0ICoqcGFfY3R4KQoreworICAgIGF2X2Fzc2VydDAocGFfbWwpOworICAgIGF2X2Fzc2VydDAocGFfY3R4KTsKKworICAgIGlmICgqcGFfY3R4KSB7CisgICAgICAgIHBhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrKCpwYV9jdHgsIE5VTEwsIE5VTEwpOworICAgICAgICBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QoKnBhX2N0eCk7CisgICAgICAgIHBhX2NvbnRleHRfdW5yZWYoKnBhX2N0eCk7CisgICAgfQorICAgIGlmICgqcGFfbWwpCisgICAgICAgIHBhX21haW5sb29wX2ZyZWUoKnBhX21sKTsKKyAgICAqcGFfbWwgPSBOVUxMOworICAgICpwYV9jdHggPSBOVUxMOworfQorCitpbnQgZmZfcHVsc2VfYXVkaW9fY29ubmVjdF9jb250ZXh0KHBhX21haW5sb29wICoqcGFfbWwsIHBhX2NvbnRleHQgKipwYV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcnZlciwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCit7CisgICAgaW50IHJldDsKKyAgICBwYV9tYWlubG9vcF9hcGkgKnBhX21sYXBpID0gTlVMTDsKKyAgICBlbnVtIFB1bHNlQXVkaW9Db250ZXh0U3RhdGUgY29udGV4dF9zdGF0ZSA9IFBVTFNFX0NPTlRFWFRfSU5JVElBTElaSU5HOworCisgICAgYXZfYXNzZXJ0MChwYV9tbCk7CisgICAgYXZfYXNzZXJ0MChwYV9jdHgpOworCisgICAgKnBhX21sID0gTlVMTDsKKyAgICAqcGFfY3R4ID0gTlVMTDsKKworICAgIGlmICghKCpwYV9tbCA9IHBhX21haW5sb29wX25ldygpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpZiAoIShwYV9tbGFwaSA9IHBhX21haW5sb29wX2dldF9hcGkoKnBhX21sKSkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoISgqcGFfY3R4ID0gcGFfY29udGV4dF9uZXcocGFfbWxhcGksIGRlc2NyaXB0aW9uKSkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHBhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrKCpwYV9jdHgsIHBhX3N0YXRlX2NiLCAmY29udGV4dF9zdGF0ZSk7CisgICAgaWYgKHBhX2NvbnRleHRfY29ubmVjdCgqcGFfY3R4LCBzZXJ2ZXIsIDAsIE5VTEwpIDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgd2hpbGUgKGNvbnRleHRfc3RhdGUgPT0gUFVMU0VfQ09OVEVYVF9JTklUSUFMSVpJTkcpCisgICAgICAgIHBhX21haW5sb29wX2l0ZXJhdGUoKnBhX21sLCAxLCBOVUxMKTsKKyAgICBpZiAoY29udGV4dF9zdGF0ZSA9PSBQVUxTRV9DT05URVhUX0ZJTklTSEVEKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcmV0dXJuIDA7CisKKyAgZmFpbDoKKyAgICBmZl9wdWxzZV9hdWRpb19kaXNjb25uZWN0X2NvbnRleHQocGFfbWwsIHBhX2N0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcHVsc2VfYWRkX2RldGVjdGVkX2RldmljZShQdWxzZUF1ZGlvRGV2aWNlTGlzdCAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCit7CisgICAgaW50IHJldDsKKyAgICBBVkRldmljZUluZm8gKm5ld19kZXZpY2UgPSBOVUxMOworCisgICAgaWYgKGluZm8tPmVycm9yX2NvZGUpCisgICAgICAgIHJldHVybjsKKworICAgIG5ld19kZXZpY2UgPSBhdl9tYWxsb2N6KHNpemVvZihBVkRldmljZUluZm8pKTsKKyAgICBpZiAoIW5ld19kZXZpY2UpIHsKKyAgICAgICAgaW5mby0+ZXJyb3JfY29kZSA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5ld19kZXZpY2UtPmRldmljZV9kZXNjcmlwdGlvbiA9IGF2X3N0cmR1cChkZXNjcmlwdGlvbik7CisgICAgbmV3X2RldmljZS0+ZGV2aWNlX25hbWUgPSBhdl9zdHJkdXAobmFtZSk7CisKKyAgICBpZiAoIW5ld19kZXZpY2UtPmRldmljZV9kZXNjcmlwdGlvbiB8fCAhbmV3X2RldmljZS0+ZGV2aWNlX25hbWUpIHsKKyAgICAgICAgaW5mby0+ZXJyb3JfY29kZSA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfZHluYXJyYXlfYWRkX25vZnJlZSgmaW5mby0+ZGV2aWNlcy0+ZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8tPmRldmljZXMtPm5iX2RldmljZXMsIG5ld19kZXZpY2UpKSA8IDApIHsKKyAgICAgICAgaW5mby0+ZXJyb3JfY29kZSA9IHJldDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICByZXR1cm47CisKKyAgZmFpbDoKKyAgICBhdl9mcmVlcCgmbmV3X2RldmljZS0+ZGV2aWNlX2Rlc2NyaXB0aW9uKTsKKyAgICBhdl9mcmVlcCgmbmV3X2RldmljZS0+ZGV2aWNlX25hbWUpOworICAgIGF2X2ZyZWUobmV3X2RldmljZSk7CisKK30KKworc3RhdGljIHZvaWQgcHVsc2VfYXVkaW9fc291cmNlX2RldmljZV9jYihwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9zb3VyY2VfaW5mbyAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgICBpZiAoIWVvbCkKKyAgICAgICAgcHVsc2VfYWRkX2RldGVjdGVkX2RldmljZSh1c2VyZGF0YSwgZGV2LT5uYW1lLCBkZXYtPmRlc2NyaXB0aW9uKTsKK30KKworc3RhdGljIHZvaWQgcHVsc2VfYXVkaW9fc2lua19kZXZpY2VfY2IocGFfY29udGV4dCAqYywgY29uc3QgcGFfc2lua19pbmZvICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgICBpZiAoIWVvbCkKKyAgICAgICAgcHVsc2VfYWRkX2RldGVjdGVkX2RldmljZSh1c2VyZGF0YSwgZGV2LT5uYW1lLCBkZXYtPmRlc2NyaXB0aW9uKTsKK30KKworc3RhdGljIHZvaWQgcHVsc2Vfc2VydmVyX2luZm9fY2IocGFfY29udGV4dCAqYywgY29uc3QgcGFfc2VydmVyX2luZm8gKmksIHZvaWQgKnVzZXJkYXRhKQoreworICAgIFB1bHNlQXVkaW9EZXZpY2VMaXN0ICppbmZvID0gdXNlcmRhdGE7CisgICAgaWYgKGluZm8tPm91dHB1dCkKKyAgICAgICAgaW5mby0+ZGVmYXVsdF9kZXZpY2UgPSBhdl9zdHJkdXAoaS0+ZGVmYXVsdF9zaW5rX25hbWUpOworICAgIGVsc2UKKyAgICAgICAgaW5mby0+ZGVmYXVsdF9kZXZpY2UgPSBhdl9zdHJkdXAoaS0+ZGVmYXVsdF9zb3VyY2VfbmFtZSk7CisgICAgaWYgKCFpbmZvLT5kZWZhdWx0X2RldmljZSkKKyAgICAgICAgaW5mby0+ZXJyb3JfY29kZSA9IEFWRVJST1IoRU5PTUVNKTsKK30KKworaW50IGZmX3B1bHNlX2F1ZGlvX2dldF9kZXZpY2VzKEFWRGV2aWNlSW5mb0xpc3QgKmRldmljZXMsIGNvbnN0IGNoYXIgKnNlcnZlciwgaW50IG91dHB1dCkKK3sKKyAgICBwYV9tYWlubG9vcCAqcGFfbWwgPSBOVUxMOworICAgIHBhX29wZXJhdGlvbiAqcGFfb3AgPSBOVUxMOworICAgIHBhX2NvbnRleHQgKnBhX2N0eCA9IE5VTEw7CisgICAgZW51bSBwYV9vcGVyYXRpb25fc3RhdGUgb3Bfc3RhdGU7CisgICAgUHVsc2VBdWRpb0RldmljZUxpc3QgZGV2X2xpc3QgPSB7IDAgfTsKKyAgICBpbnQgaTsKKworICAgIGRldl9saXN0Lm91dHB1dCA9IG91dHB1dDsKKyAgICBkZXZfbGlzdC5kZXZpY2VzID0gZGV2aWNlczsKKyAgICBpZiAoIWRldmljZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgZGV2aWNlcy0+bmJfZGV2aWNlcyA9IDA7CisgICAgZGV2aWNlcy0+ZGV2aWNlcyA9IE5VTEw7CisKKyAgICBpZiAoKGRldl9saXN0LmVycm9yX2NvZGUgPSBmZl9wdWxzZV9hdWRpb19jb25uZWN0X2NvbnRleHQoJnBhX21sLCAmcGFfY3R4LCBzZXJ2ZXIsICJRdWVyeSBkZXZpY2VzIikpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKG91dHB1dCkKKyAgICAgICAgcGFfb3AgPSBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fbGlzdChwYV9jdHgsIHB1bHNlX2F1ZGlvX3NpbmtfZGV2aWNlX2NiLCAmZGV2X2xpc3QpOworICAgIGVsc2UKKyAgICAgICAgcGFfb3AgPSBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19saXN0KHBhX2N0eCwgcHVsc2VfYXVkaW9fc291cmNlX2RldmljZV9jYiwgJmRldl9saXN0KTsKKyAgICB3aGlsZSAoKG9wX3N0YXRlID0gcGFfb3BlcmF0aW9uX2dldF9zdGF0ZShwYV9vcCkpID09IFBBX09QRVJBVElPTl9SVU5OSU5HKQorICAgICAgICBwYV9tYWlubG9vcF9pdGVyYXRlKHBhX21sLCAxLCBOVUxMKTsKKyAgICBpZiAob3Bfc3RhdGUgIT0gUEFfT1BFUkFUSU9OX0RPTkUpCisgICAgICAgIGRldl9saXN0LmVycm9yX2NvZGUgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgIHBhX29wZXJhdGlvbl91bnJlZihwYV9vcCk7CisgICAgaWYgKGRldl9saXN0LmVycm9yX2NvZGUgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBwYV9vcCA9IHBhX2NvbnRleHRfZ2V0X3NlcnZlcl9pbmZvKHBhX2N0eCwgcHVsc2Vfc2VydmVyX2luZm9fY2IsICZkZXZfbGlzdCk7CisgICAgd2hpbGUgKChvcF9zdGF0ZSA9IHBhX29wZXJhdGlvbl9nZXRfc3RhdGUocGFfb3ApKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykKKyAgICAgICAgcGFfbWFpbmxvb3BfaXRlcmF0ZShwYV9tbCwgMSwgTlVMTCk7CisgICAgaWYgKG9wX3N0YXRlICE9IFBBX09QRVJBVElPTl9ET05FKQorICAgICAgICBkZXZfbGlzdC5lcnJvcl9jb2RlID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYocGFfb3ApOworICAgIGlmIChkZXZfbGlzdC5lcnJvcl9jb2RlIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZGV2aWNlcy0+ZGVmYXVsdF9kZXZpY2UgPSAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGV2aWNlcy0+bmJfZGV2aWNlczsgaSsrKSB7CisgICAgICAgIGlmICghc3RyY21wKGRldmljZXMtPmRldmljZXNbaV0tPmRldmljZV9uYW1lLCBkZXZfbGlzdC5kZWZhdWx0X2RldmljZSkpIHsKKyAgICAgICAgICAgIGRldmljZXMtPmRlZmF1bHRfZGV2aWNlID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgIGZhaWw6CisgICAgYXZfZnJlZShkZXZfbGlzdC5kZWZhdWx0X2RldmljZSk7CisgICAgZmZfcHVsc2VfYXVkaW9fZGlzY29ubmVjdF9jb250ZXh0KCZwYV9tbCwgJnBhX2N0eCk7CisgICAgcmV0dXJuIGRldl9saXN0LmVycm9yX2NvZGU7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvcHVsc2VfYXVkaW9fY29tbW9uLmggYi9mZm1wZWcvbGliYXZkZXZpY2UvcHVsc2VfYXVkaW9fY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1MzRmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9wdWxzZV9hdWRpb19jb21tb24uaApAQCAtMCwwICsxLDM4IEBACisvKgorICogUHVsc2VhdWRpbyBpbnB1dAorICogQ29weXJpZ2h0IChjKSAyMDExIEx1Y2EgQmFyYmF0byA8bHVfemVyb0BnZW50b28ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWREVWSUNFX1BVTFNFX0FVRElPX0NPTU1PTl9ICisjZGVmaW5lIEFWREVWSUNFX1BVTFNFX0FVRElPX0NPTU1PTl9ICisKKyNpbmNsdWRlIDxwdWxzZS9wdWxzZWF1ZGlvLmg+CisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAiYXZkZXZpY2UuaCIKKworcGFfc2FtcGxlX2Zvcm1hdF90IGZmX2NvZGVjX2lkX3RvX3B1bHNlX2Zvcm1hdChlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCk7CisKK2ludCBmZl9wdWxzZV9hdWRpb19nZXRfZGV2aWNlcyhBVkRldmljZUluZm9MaXN0ICpkZXZpY2VzLCBjb25zdCBjaGFyICpzZXJ2ZXIsIGludCBvdXRwdXQpOworCitpbnQgZmZfcHVsc2VfYXVkaW9fY29ubmVjdF9jb250ZXh0KHBhX21haW5sb29wICoqcGFfbWwsIHBhX2NvbnRleHQgKipwYV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcnZlciwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOworCit2b2lkIGZmX3B1bHNlX2F1ZGlvX2Rpc2Nvbm5lY3RfY29udGV4dChwYV9tYWlubG9vcCAqKnBhX21sLCBwYV9jb250ZXh0ICoqcGFfY3R4KTsKKworI2VuZGlmIC8qIEFWREVWSUNFX1BVTFNFX0FVRElPX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvcHVsc2VfYXVkaW9fZGVjLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvcHVsc2VfYXVkaW9fZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2Y2M0YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9wdWxzZV9hdWRpb19kZWMuYwpAQCAtMCwwICsxLDM3MyBAQAorLyoKKyAqIFB1bHNlYXVkaW8gaW5wdXQKKyAqIENvcHlyaWdodCAoYykgMjAxMSBMdWNhIEJhcmJhdG8gPGx1X3plcm9AZ2VudG9vLm9yZz4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHB1bHNlL3J0Y2xvY2suaD4KKyNpbmNsdWRlIDxwdWxzZS9lcnJvci5oPgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJwdWxzZV9hdWRpb19jb21tb24uaCIKKyNpbmNsdWRlICJ0aW1lZmlsdGVyLmgiCisKKyNkZWZpbmUgREVGQVVMVF9DT0RFQ19JRCBBVl9ORShBVl9DT0RFQ19JRF9QQ01fUzE2QkUsIEFWX0NPREVDX0lEX1BDTV9TMTZMRSkKKwordHlwZWRlZiBzdHJ1Y3QgUHVsc2VEYXRhIHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBjaGFyICpzZXJ2ZXI7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICpzdHJlYW1fbmFtZTsKKyAgICBpbnQgIHNhbXBsZV9yYXRlOworICAgIGludCAgY2hhbm5lbHM7CisgICAgaW50ICBmcmFtZV9zaXplOworICAgIGludCAgZnJhZ21lbnRfc2l6ZTsKKworICAgIHBhX3RocmVhZGVkX21haW5sb29wICptYWlubG9vcDsKKyAgICBwYV9jb250ZXh0ICpjb250ZXh0OworICAgIHBhX3N0cmVhbSAqc3RyZWFtOworCisgICAgVGltZUZpbHRlciAqdGltZWZpbHRlcjsKKyAgICBpbnQgbGFzdF9wZXJpb2Q7CisgICAgaW50IHdhbGxjbG9jazsKK30gUHVsc2VEYXRhOworCisKKyNkZWZpbmUgQ0hFQ0tfU1VDQ0VTU19HT1RPKHJlcnJvciwgZXhwcmVzc2lvbiwgbGFiZWwpICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShleHByZXNzaW9uKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlcnJvciA9IEFWRVJST1JfRVhURVJOQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnb3RvIGxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApOworCisjZGVmaW5lIENIRUNLX0RFQURfR09UTyhwLCByZXJyb3IsIGxhYmVsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKHApLT5jb250ZXh0IHx8ICFQQV9DT05URVhUX0lTX0dPT0QocGFfY29udGV4dF9nZXRfc3RhdGUoKHApLT5jb250ZXh0KSkgfHwgXAorICAgICAgICAgICAgIShwKS0+c3RyZWFtIHx8ICFQQV9TVFJFQU1fSVNfR09PRChwYV9zdHJlYW1fZ2V0X3N0YXRlKChwKS0+c3RyZWFtKSkpIHsgXAorICAgICAgICAgICAgcmVycm9yID0gQVZFUlJPUl9FWFRFUk5BTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZ290byBsYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCk7CisKK3N0YXRpYyB2b2lkIGNvbnRleHRfc3RhdGVfY2IocGFfY29udGV4dCAqYywgdm9pZCAqdXNlcmRhdGEpIHsKKyAgICBQdWxzZURhdGEgKnAgPSB1c2VyZGF0YTsKKworICAgIHN3aXRjaCAocGFfY29udGV4dF9nZXRfc3RhdGUoYykpIHsKKyAgICAgICAgY2FzZSBQQV9DT05URVhUX1JFQURZOgorICAgICAgICBjYXNlIFBBX0NPTlRFWFRfVEVSTUlOQVRFRDoKKyAgICAgICAgY2FzZSBQQV9DT05URVhUX0ZBSUxFRDoKKyAgICAgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbChwLT5tYWlubG9vcCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHN0cmVhbV9zdGF0ZV9jYihwYV9zdHJlYW0gKnMsIHZvaWQgKiB1c2VyZGF0YSkgeworICAgIFB1bHNlRGF0YSAqcCA9IHVzZXJkYXRhOworCisgICAgc3dpdGNoIChwYV9zdHJlYW1fZ2V0X3N0YXRlKHMpKSB7CisgICAgICAgIGNhc2UgUEFfU1RSRUFNX1JFQURZOgorICAgICAgICBjYXNlIFBBX1NUUkVBTV9GQUlMRUQ6CisgICAgICAgIGNhc2UgUEFfU1RSRUFNX1RFUk1JTkFURUQ6CisgICAgICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwocC0+bWFpbmxvb3AsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzdHJlYW1fcmVxdWVzdF9jYihwYV9zdHJlYW0gKnMsIHNpemVfdCBsZW5ndGgsIHZvaWQgKnVzZXJkYXRhKSB7CisgICAgUHVsc2VEYXRhICpwID0gdXNlcmRhdGE7CisKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwocC0+bWFpbmxvb3AsIDApOworfQorCitzdGF0aWMgdm9pZCBzdHJlYW1fbGF0ZW5jeV91cGRhdGVfY2IocGFfc3RyZWFtICpzLCB2b2lkICp1c2VyZGF0YSkgeworICAgIFB1bHNlRGF0YSAqcCA9IHVzZXJkYXRhOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsKHAtPm1haW5sb29wLCAwKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHB1bHNlX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBQdWxzZURhdGEgKnBkID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKHBkLT5tYWlubG9vcCkKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RvcChwZC0+bWFpbmxvb3ApOworCisgICAgaWYgKHBkLT5zdHJlYW0pCisgICAgICAgIHBhX3N0cmVhbV91bnJlZihwZC0+c3RyZWFtKTsKKyAgICBwZC0+c3RyZWFtID0gTlVMTDsKKworICAgIGlmIChwZC0+Y29udGV4dCkgeworICAgICAgICBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QocGQtPmNvbnRleHQpOworICAgICAgICBwYV9jb250ZXh0X3VucmVmKHBkLT5jb250ZXh0KTsKKyAgICB9CisgICAgcGQtPmNvbnRleHQgPSBOVUxMOworCisgICAgaWYgKHBkLT5tYWlubG9vcCkKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZnJlZShwZC0+bWFpbmxvb3ApOworICAgIHBkLT5tYWlubG9vcCA9IE5VTEw7CisKKyAgICBmZl90aW1lZmlsdGVyX2Rlc3Ryb3kocGQtPnRpbWVmaWx0ZXIpOworICAgIHBkLT50aW1lZmlsdGVyID0gTlVMTDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcHVsc2VfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFB1bHNlRGF0YSAqcGQgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGNoYXIgKmRldmljZSA9IE5VTEw7CisgICAgaW50IHJldDsKKyAgICBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCA9CisgICAgICAgIHMtPmF1ZGlvX2NvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUgPyBERUZBVUxUX0NPREVDX0lEIDogcy0+YXVkaW9fY29kZWNfaWQ7CisgICAgY29uc3QgcGFfc2FtcGxlX3NwZWMgc3MgPSB7IGZmX2NvZGVjX2lkX3RvX3B1bHNlX2Zvcm1hdChjb2RlY19pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGQtPmNoYW5uZWxzIH07CisKKyAgICBwYV9idWZmZXJfYXR0ciBhdHRyID0geyAtMSB9OworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworCisgICAgaWYgKCFzdCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFkZCBzdHJlYW1cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF0dHIuZnJhZ3NpemUgPSBwZC0+ZnJhZ21lbnRfc2l6ZTsKKworICAgIGlmIChzLT5maWxlbmFtZVswXSAhPSAnXDAnICYmIHN0cmNtcChzLT5maWxlbmFtZSwgImRlZmF1bHQiKSkKKyAgICAgICAgZGV2aWNlID0gcy0+ZmlsZW5hbWU7CisKKyAgICBpZiAoIShwZC0+bWFpbmxvb3AgPSBwYV90aHJlYWRlZF9tYWlubG9vcF9uZXcoKSkpIHsKKyAgICAgICAgcHVsc2VfY2xvc2Uocyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIGlmICghKHBkLT5jb250ZXh0ID0gcGFfY29udGV4dF9uZXcocGFfdGhyZWFkZWRfbWFpbmxvb3BfZ2V0X2FwaShwZC0+bWFpbmxvb3ApLCBwZC0+bmFtZSkpKSB7CisgICAgICAgIHB1bHNlX2Nsb3NlKHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjayhwZC0+Y29udGV4dCwgY29udGV4dF9zdGF0ZV9jYiwgcGQpOworCisgICAgaWYgKHBhX2NvbnRleHRfY29ubmVjdChwZC0+Y29udGV4dCwgcGQtPnNlcnZlciwgMCwgTlVMTCkgPCAwKSB7CisgICAgICAgIHB1bHNlX2Nsb3NlKHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihwYV9jb250ZXh0X2Vycm5vKHBkLT5jb250ZXh0KSk7CisgICAgfQorCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhwZC0+bWFpbmxvb3ApOworCisgICAgaWYgKHBhX3RocmVhZGVkX21haW5sb29wX3N0YXJ0KHBkLT5tYWlubG9vcCkgPCAwKSB7CisgICAgICAgIHJldCA9IC0xOworICAgICAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHBhX2NvbnRleHRfc3RhdGVfdCBzdGF0ZTsKKworICAgICAgICBzdGF0ZSA9IHBhX2NvbnRleHRfZ2V0X3N0YXRlKHBkLT5jb250ZXh0KTsKKworICAgICAgICBpZiAoc3RhdGUgPT0gUEFfQ09OVEVYVF9SRUFEWSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICghUEFfQ09OVEVYVF9JU19HT09EKHN0YXRlKSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihwYV9jb250ZXh0X2Vycm5vKHBkLT5jb250ZXh0KSk7CisgICAgICAgICAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFdhaXQgdW50aWwgdGhlIGNvbnRleHQgaXMgcmVhZHkgKi8KKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdChwZC0+bWFpbmxvb3ApOworICAgIH0KKworICAgIGlmICghKHBkLT5zdHJlYW0gPSBwYV9zdHJlYW1fbmV3KHBkLT5jb250ZXh0LCBwZC0+c3RyZWFtX25hbWUsICZzcywgTlVMTCkpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IocGFfY29udGV4dF9lcnJubyhwZC0+Y29udGV4dCkpOworICAgICAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgICB9CisKKyAgICBwYV9zdHJlYW1fc2V0X3N0YXRlX2NhbGxiYWNrKHBkLT5zdHJlYW0sIHN0cmVhbV9zdGF0ZV9jYiwgcGQpOworICAgIHBhX3N0cmVhbV9zZXRfcmVhZF9jYWxsYmFjayhwZC0+c3RyZWFtLCBzdHJlYW1fcmVxdWVzdF9jYiwgcGQpOworICAgIHBhX3N0cmVhbV9zZXRfd3JpdGVfY2FsbGJhY2socGQtPnN0cmVhbSwgc3RyZWFtX3JlcXVlc3RfY2IsIHBkKTsKKyAgICBwYV9zdHJlYW1fc2V0X2xhdGVuY3lfdXBkYXRlX2NhbGxiYWNrKHBkLT5zdHJlYW0sIHN0cmVhbV9sYXRlbmN5X3VwZGF0ZV9jYiwgcGQpOworCisgICAgcmV0ID0gcGFfc3RyZWFtX2Nvbm5lY3RfcmVjb3JkKHBkLT5zdHJlYW0sIGRldmljZSwgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQV9TVFJFQU1fSU5URVJQT0xBVEVfVElNSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8UEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8UEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURSk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKHBhX2NvbnRleHRfZXJybm8ocGQtPmNvbnRleHQpKTsKKyAgICAgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgICAgfQorCisgICAgZm9yICg7OykgeworICAgICAgICBwYV9zdHJlYW1fc3RhdGVfdCBzdGF0ZTsKKworICAgICAgICBzdGF0ZSA9IHBhX3N0cmVhbV9nZXRfc3RhdGUocGQtPnN0cmVhbSk7CisKKyAgICAgICAgaWYgKHN0YXRlID09IFBBX1NUUkVBTV9SRUFEWSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICghUEFfU1RSRUFNX0lTX0dPT0Qoc3RhdGUpKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKHBhX2NvbnRleHRfZXJybm8ocGQtPmNvbnRleHQpKTsKKyAgICAgICAgICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICAgICAgICB9CisKKyAgICAgICAgLyogV2FpdCB1bnRpbCB0aGUgc3RyZWFtIGlzIHJlYWR5ICovCisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQocGQtPm1haW5sb29wKTsKKyAgICB9CisKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2socGQtPm1haW5sb29wKTsKKworICAgIC8qIHRha2UgcmVhbCBwYXJhbWV0ZXJzICovCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gY29kZWNfaWQ7CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHBkLT5zYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gcGQtPmNoYW5uZWxzOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsgIC8qIDY0IGJpdHMgcHRzIGluIHVzICovCisKKyAgICBwZC0+dGltZWZpbHRlciA9IGZmX3RpbWVmaWx0ZXJfbmV3KDEwMDAwMDAuMCAvIHBkLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAsIDEuNUUtNik7CisKKyAgICBpZiAoIXBkLT50aW1lZmlsdGVyKSB7CisgICAgICAgIHB1bHNlX2Nsb3NlKHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworCit1bmxvY2tfYW5kX2ZhaWw6CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKHBkLT5tYWlubG9vcCk7CisKKyAgICBwdWxzZV9jbG9zZShzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHB1bHNlX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBQdWxzZURhdGEgKnBkICA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworICAgIHNpemVfdCByZWFkX2xlbmd0aDsKKyAgICBjb25zdCB2b2lkICpyZWFkX2RhdGEgPSBOVUxMOworICAgIGludDY0X3QgZHRzOworICAgIHBhX3VzZWNfdCBsYXRlbmN5OworICAgIGludCBuZWdhdGl2ZTsKKworICAgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2socGQtPm1haW5sb29wKTsKKworICAgIENIRUNLX0RFQURfR09UTyhwZCwgcmV0LCB1bmxvY2tfYW5kX2ZhaWwpOworCisgICAgd2hpbGUgKCFyZWFkX2RhdGEpIHsKKyAgICAgICAgaW50IHI7CisKKyAgICAgICAgciA9IHBhX3N0cmVhbV9wZWVrKHBkLT5zdHJlYW0sICZyZWFkX2RhdGEsICZyZWFkX2xlbmd0aCk7CisgICAgICAgIENIRUNLX1NVQ0NFU1NfR09UTyhyZXQsIHIgPT0gMCwgdW5sb2NrX2FuZF9mYWlsKTsKKworICAgICAgICBpZiAocmVhZF9sZW5ndGggPD0gMCkgeworICAgICAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdChwZC0+bWFpbmxvb3ApOworICAgICAgICAgICAgQ0hFQ0tfREVBRF9HT1RPKHBkLCByZXQsIHVubG9ja19hbmRfZmFpbCk7CisgICAgICAgIH0gZWxzZSBpZiAoIXJlYWRfZGF0YSkgeworICAgICAgICAgICAgLyogVGhlcmUncyBhIGhvbGUgaW4gdGhlIHN0cmVhbSwgc2tpcCBpdC4gV2UgY291bGQgZ2VuZXJhdGUKKyAgICAgICAgICAgICAgICAqIHNpbGVuY2UsIGJ1dCB0aGF0IHdvdWxkbid0IHdvcmsgZm9yIGNvbXByZXNzZWQgc3RyZWFtcy4gKi8KKyAgICAgICAgICAgIHIgPSBwYV9zdHJlYW1fZHJvcChwZC0+c3RyZWFtKTsKKyAgICAgICAgICAgIENIRUNLX1NVQ0NFU1NfR09UTyhyZXQsIHIgPT0gMCwgdW5sb2NrX2FuZF9mYWlsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgcmVhZF9sZW5ndGgpIDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICAgIH0KKworICAgIGR0cyA9IGF2X2dldHRpbWUoKTsKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYocGFfc3RyZWFtX3VwZGF0ZV90aW1pbmdfaW5mbyhwZC0+c3RyZWFtLCBOVUxMLCBOVUxMKSk7CisKKyAgICBpZiAocGFfc3RyZWFtX2dldF9sYXRlbmN5KHBkLT5zdHJlYW0sICZsYXRlbmN5LCAmbmVnYXRpdmUpID49IDApIHsKKyAgICAgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQgPQorICAgICAgICAgICAgcy0+YXVkaW9fY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSA/IERFRkFVTFRfQ09ERUNfSUQgOiBzLT5hdWRpb19jb2RlY19pZDsKKyAgICAgICAgaW50IGZyYW1lX3NpemUgPSAoKGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoY29kZWNfaWQpID4+IDMpICogcGQtPmNoYW5uZWxzKTsKKyAgICAgICAgaW50IGZyYW1lX2R1cmF0aW9uID0gcmVhZF9sZW5ndGggLyBmcmFtZV9zaXplOworCisKKyAgICAgICAgaWYgKG5lZ2F0aXZlKSB7CisgICAgICAgICAgICBkdHMgKz0gbGF0ZW5jeTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBkdHMgLT0gbGF0ZW5jeTsKKyAgICAgICAgaWYgKHBkLT53YWxsY2xvY2spCisgICAgICAgICAgICBwa3QtPnB0cyA9IGZmX3RpbWVmaWx0ZXJfdXBkYXRlKHBkLT50aW1lZmlsdGVyLCBkdHMsIHBkLT5sYXN0X3BlcmlvZCk7CisKKyAgICAgICAgcGQtPmxhc3RfcGVyaW9kID0gZnJhbWVfZHVyYXRpb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAicGFfc3RyZWFtX2dldF9sYXRlbmN5KCkgZmFpbGVkXG4iKTsKKyAgICB9CisKKyAgICBtZW1jcHkocGt0LT5kYXRhLCByZWFkX2RhdGEsIHJlYWRfbGVuZ3RoKTsKKyAgICBwYV9zdHJlYW1fZHJvcChwZC0+c3RyZWFtKTsKKworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhwZC0+bWFpbmxvb3ApOworICAgIHJldHVybiAwOworCit1bmxvY2tfYW5kX2ZhaWw6CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKHBkLT5tYWlubG9vcCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwdWxzZV9nZXRfZGV2aWNlX2xpc3QoQVZGb3JtYXRDb250ZXh0ICpoLCBBVkRldmljZUluZm9MaXN0ICpkZXZpY2VfbGlzdCkKK3sKKyAgICBQdWxzZURhdGEgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3B1bHNlX2F1ZGlvX2dldF9kZXZpY2VzKGRldmljZV9saXN0LCBzLT5zZXJ2ZXIsIDApOworfQorCisjZGVmaW5lIE9GRlNFVChhKSBvZmZzZXRvZihQdWxzZURhdGEsIGEpCisjZGVmaW5lIEQgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJzZXJ2ZXIiLCAgICAgICAgInNldCBQdWxzZUF1ZGlvIHNlcnZlciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc2VydmVyKSwgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgICAgIDAsIDAsIEQgfSwKKyAgICB7ICJuYW1lIiwgICAgICAgICAgInNldCBhcHBsaWNhdGlvbiBuYW1lIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQobmFtZSksICAgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBMSUJBVkZPUk1BVF9JREVOVH0sICAwLCAwLCBEIH0sCisgICAgeyAic3RyZWFtX25hbWUiLCAgICJzZXQgc3RyZWFtIGRlc2NyaXB0aW9uIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHN0cmVhbV9uYW1lKSwgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gInJlY29yZCJ9LCAwLCAwLCBEIH0sCisgICAgeyAic2FtcGxlX3JhdGUiLCAgICJzZXQgc2FtcGxlIHJhdGUgaW4gSHoiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHNhbXBsZV9yYXRlKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gNDgwMDB9LCAgICAxLCBJTlRfTUFYLCBEIH0sCisgICAgeyAiY2hhbm5lbHMiLCAgICAgICJzZXQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIiwgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGNoYW5uZWxzKSwgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMn0sICAgICAgICAxLCBJTlRfTUFYLCBEIH0sCisgICAgeyAiZnJhbWVfc2l6ZSIsICAgICJzZXQgbnVtYmVyIG9mIGJ5dGVzIHBlciBmcmFtZSIsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGZyYW1lX3NpemUpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMTAyNH0sICAgICAxLCBJTlRfTUFYLCBEIH0sCisgICAgeyAiZnJhZ21lbnRfc2l6ZSIsICJzZXQgYnVmZmVyaW5nIHNpemUsIGFmZmVjdHMgbGF0ZW5jeSBhbmQgY3B1IHVzYWdlIiwgT0ZGU0VUKGZyYWdtZW50X3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gLTF9LCAgICAgIC0xLCBJTlRfTUFYLCBEIH0sCisgICAgeyAid2FsbGNsb2NrIiwgICAgICJzZXQgdGhlIGluaXRpYWwgcHRzIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUiLCAgICAgT0ZGU0VUKHdhbGxjbG9jayksICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMX0sICAgICAgIC0xLCAxLCBEIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBwdWxzZV9kZW11eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICA9ICJQdWxzZSBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICAgICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfQVVESU9fSU5QVVQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX3B1bHNlX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInB1bHNlIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUHVsc2UgYXVkaW8gaW5wdXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUHVsc2VEYXRhKSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBwdWxzZV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBwdWxzZV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBwdWxzZV9jbG9zZSwKKyAgICAuZ2V0X2RldmljZV9saXN0ID0gcHVsc2VfZ2V0X2RldmljZV9saXN0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmcHVsc2VfZGVtdXhlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvcHVsc2VfYXVkaW9fZW5jLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvcHVsc2VfYXVkaW9fZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0ZDFmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9wdWxzZV9hdWRpb19lbmMuYwpAQCAtMCwwICsxLDc5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBMdWthc3ogTWFyZWsgPGx1a2Fzei5tLmx1a2lAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHB1bHNlL3B1bHNlYXVkaW8uaD4KKyNpbmNsdWRlIDxwdWxzZS9lcnJvci5oPgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJwdWxzZV9hdWRpb19jb21tb24uaCIKKwordHlwZWRlZiBzdHJ1Y3QgUHVsc2VEYXRhIHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBjb25zdCBjaGFyICpzZXJ2ZXI7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpzdHJlYW1fbmFtZTsKKyAgICBjb25zdCBjaGFyICpkZXZpY2U7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgaW50IGJ1ZmZlcl9zaXplOyAgICAgICAgICAgICAgIC8qKjwgQnVmZmVyIHNpemUgaW4gYnl0ZXMgKi8KKyAgICBpbnQgYnVmZmVyX2R1cmF0aW9uOyAgICAgICAgICAgLyoqPCBCdWZmZXIgc2l6ZSBpbiBtcywgcmVjYWxjdWxhdGVkIHRvIGJ1ZmZlcl9zaXplICovCisgICAgaW50IHByZWJ1ZjsKKyAgICBpbnQgbWlucmVxOworICAgIGludCBsYXN0X3Jlc3VsdDsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcCAqbWFpbmxvb3A7CisgICAgcGFfY29udGV4dCAqY3R4OworICAgIHBhX3N0cmVhbSAqc3RyZWFtOworICAgIGludCBub25ibG9ja2luZzsKKyAgICBpbnQgbXV0ZTsKKyAgICBwYV92b2x1bWVfdCBiYXNlX3ZvbHVtZTsKKyAgICBwYV92b2x1bWVfdCBsYXN0X3ZvbHVtZTsKK30gUHVsc2VEYXRhOworCitzdGF0aWMgdm9pZCBwdWxzZV9hdWRpb19zaW5rX2RldmljZV9jYihwYV9jb250ZXh0ICpjdHgsIGNvbnN0IHBhX3NpbmtfaW5mbyAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgUHVsc2VEYXRhICpzID0gdXNlcmRhdGE7CisKKyAgICBpZiAocy0+Y3R4ICE9IGN0eCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGVvbCkgeworICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwocy0+bWFpbmxvb3AsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkZXYtPmZsYWdzICYgUEFfU0lOS19GTEFUX1ZPTFVNRSkKKyAgICAgICAgICAgIHMtPmJhc2Vfdm9sdW1lID0gZGV2LT5iYXNlX3ZvbHVtZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+YmFzZV92b2x1bWUgPSBQQV9WT0xVTUVfTk9STTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImJhc2Ugdm9sdW1lOiAldVxuIiwgcy0+YmFzZV92b2x1bWUpOworICAgIH0KK30KKworLyogTWFpbmxvb3AgbXVzdCBiZSBsb2NrZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhcyBpdCB1c2VzIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQuICovCitzdGF0aWMgaW50IHB1bHNlX3VwZGF0ZV9zaW5rX2luZm8oQVZGb3JtYXRDb250ZXh0ICpoKQoreworICAgIFB1bHNlRGF0YSAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBwYV9vcGVyYXRpb24gKm9wOworICAgIGlmICghKG9wID0gcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUocy0+Y3R4LCBzLT5kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWxzZV9hdWRpb19zaW5rX2RldmljZV9jYiwgcykpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fYnlfbmFtZSBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorICAgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlKG9wKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdChzLT5tYWlubG9vcCk7CisgICAgcGFfb3BlcmF0aW9uX3VucmVmKG9wKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHVsc2VfYXVkaW9fc2lua19pbnB1dF9jYihwYV9jb250ZXh0ICpjdHgsIGNvbnN0IHBhX3NpbmtfaW5wdXRfaW5mbyAqaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpoID0gdXNlcmRhdGE7CisgICAgUHVsc2VEYXRhICpzID0gaC0+cHJpdl9kYXRhOworCisgICAgaWYgKHMtPmN0eCAhPSBjdHgpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghZW9sKSB7CisgICAgICAgIGRvdWJsZSB2YWw7CisgICAgICAgIHBhX3ZvbHVtZV90IHZvbCA9IHBhX2N2b2x1bWVfYXZnKCZpLT52b2x1bWUpOworICAgICAgICBpZiAocy0+bXV0ZSA8IDAgfHwgKHMtPm11dGUgJiYgIWktPm11dGUpIHx8ICghcy0+bXV0ZSAmJiBpLT5tdXRlKSkgeworICAgICAgICAgICAgcy0+bXV0ZSA9IGktPm11dGU7CisgICAgICAgICAgICBhdmRldmljZV9kZXZfdG9fYXBwX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9ERVZfVE9fQVBQX01VVEVfU1RBVEVfQ0hBTkdFRCwgJnMtPm11dGUsIHNpemVvZihzLT5tdXRlKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2wgPSBwYV9zd192b2x1bWVfZGl2aWRlKHZvbCwgcy0+YmFzZV92b2x1bWUpOworICAgICAgICBpZiAocy0+bGFzdF92b2x1bWUgIT0gdm9sKSB7CisgICAgICAgICAgICB2YWwgPSAoZG91YmxlKXZvbCAvIFBBX1ZPTFVNRV9OT1JNOworICAgICAgICAgICAgYXZkZXZpY2VfZGV2X3RvX2FwcF9jb250cm9sX21lc3NhZ2UoaCwgQVZfREVWX1RPX0FQUF9WT0xVTUVfTEVWRUxfQ0hBTkdFRCwgJnZhbCwgc2l6ZW9mKHZhbCkpOworICAgICAgICAgICAgcy0+bGFzdF92b2x1bWUgPSB2b2w7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBuZXcgbG9vcCBzbyBtYXkgYmUgY2FsbGVkIGZyb20gUEEgY2FsbGJhY2tzLgorICAgTWFpbmxvb3AgbXVzdCBiZSBsb2NrZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhcyBpdCBvcGVyYXRlcyBvbiBzdHJlYW1zLiAqLworc3RhdGljIGludCBwdWxzZV91cGRhdGVfc2lua19pbnB1dF9pbmZvKEFWRm9ybWF0Q29udGV4dCAqaCkKK3sKKyAgICBQdWxzZURhdGEgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgcGFfb3BlcmF0aW9uICpvcDsKKyAgICBlbnVtIHBhX29wZXJhdGlvbl9zdGF0ZSBvcF9zdGF0ZTsKKyAgICBwYV9tYWlubG9vcCAqbWwgPSBOVUxMOworICAgIHBhX2NvbnRleHQgKmN0eCA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoKHJldCA9IGZmX3B1bHNlX2F1ZGlvX2Nvbm5lY3RfY29udGV4dCgmbWwsICZjdHgsIHMtPnNlcnZlciwgIlVwZGF0ZSBzaW5rIGlucHV0IGluZm9ybWF0aW9uIikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICghKG9wID0gcGFfY29udGV4dF9nZXRfc2lua19pbnB1dF9pbmZvKGN0eCwgcGFfc3RyZWFtX2dldF9pbmRleChzLT5zdHJlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1bHNlX2F1ZGlvX3NpbmtfaW5wdXRfY2IsIGgpKSkgeworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgd2hpbGUgKChvcF9zdGF0ZSA9IHBhX29wZXJhdGlvbl9nZXRfc3RhdGUob3ApKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykKKyAgICAgICAgcGFfbWFpbmxvb3BfaXRlcmF0ZShtbCwgMSwgTlVMTCk7CisgICAgcGFfb3BlcmF0aW9uX3VucmVmKG9wKTsKKyAgICBpZiAob3Bfc3RhdGUgIT0gUEFfT1BFUkFUSU9OX0RPTkUpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICBmYWlsOgorICAgIGZmX3B1bHNlX2F1ZGlvX2Rpc2Nvbm5lY3RfY29udGV4dCgmbWwsICZjdHgpOworICAgIGlmIChyZXQpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJwYV9jb250ZXh0X2dldF9zaW5rX2lucHV0X2luZm8gZmFpbGVkLlxuIik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcHVsc2VfZXZlbnQocGFfY29udGV4dCAqY3R4LCBwYV9zdWJzY3JpcHRpb25fZXZlbnRfdHlwZV90IHQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpZHgsIHZvaWQgKnVzZXJkYXRhKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqaCA9IHVzZXJkYXRhOworICAgIFB1bHNlRGF0YSAqcyA9IGgtPnByaXZfZGF0YTsKKworICAgIGlmIChzLT5jdHggIT0gY3R4KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoKHQgJiBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfRkFDSUxJVFlfTUFTSykgPT0gUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTktfSU5QVVQpIHsKKyAgICAgICAgaWYgKCh0ICYgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1RZUEVfTUFTSykgPT0gUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0NIQU5HRSkKKyAgICAgICAgICAgIC8vIENhbGxpbmcgZnJvbSBtYWlubG9vcCBjYWxsYmFjay4gTm8gbmVlZCB0byBsb2NrIG1haW5sb29wLgorICAgICAgICAgICAgcHVsc2VfdXBkYXRlX3NpbmtfaW5wdXRfaW5mbyhoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1bHNlX3N0cmVhbV93cml0YWJsZShwYV9zdHJlYW0gKnN0cmVhbSwgc2l6ZV90IG5ieXRlcywgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpoID0gdXNlcmRhdGE7CisgICAgUHVsc2VEYXRhICpzID0gaC0+cHJpdl9kYXRhOworICAgIGludDY0X3QgdmFsID0gbmJ5dGVzOworCisgICAgaWYgKHN0cmVhbSAhPSBzLT5zdHJlYW0pCisgICAgICAgIHJldHVybjsKKworICAgIGF2ZGV2aWNlX2Rldl90b19hcHBfY29udHJvbF9tZXNzYWdlKGgsIEFWX0RFVl9UT19BUFBfQlVGRkVSX1dSSVRBQkxFLCAmdmFsLCBzaXplb2YodmFsKSk7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsKHMtPm1haW5sb29wLCAwKTsKK30KKworc3RhdGljIHZvaWQgcHVsc2Vfb3ZlcmZsb3cocGFfc3RyZWFtICpzdHJlYW0sIHZvaWQgKnVzZXJkYXRhKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqaCA9IHVzZXJkYXRhOworICAgIGF2ZGV2aWNlX2Rldl90b19hcHBfY29udHJvbF9tZXNzYWdlKGgsIEFWX0RFVl9UT19BUFBfQlVGRkVSX09WRVJGTE9XLCBOVUxMLCAwKTsKK30KKworc3RhdGljIHZvaWQgcHVsc2VfdW5kZXJmbG93KHBhX3N0cmVhbSAqc3RyZWFtLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKmggPSB1c2VyZGF0YTsKKyAgICBhdmRldmljZV9kZXZfdG9fYXBwX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9ERVZfVE9fQVBQX0JVRkZFUl9VTkRFUkZMT1csIE5VTEwsIDApOworfQorCitzdGF0aWMgdm9pZCBwdWxzZV9zdHJlYW1fc3RhdGUocGFfc3RyZWFtICpzdHJlYW0sIHZvaWQgKnVzZXJkYXRhKQoreworICAgIFB1bHNlRGF0YSAqcyA9IHVzZXJkYXRhOworCisgICAgaWYgKHN0cmVhbSAhPSBzLT5zdHJlYW0pCisgICAgICAgIHJldHVybjsKKworICAgIHN3aXRjaCAocGFfc3RyZWFtX2dldF9zdGF0ZShzLT5zdHJlYW0pKSB7CisgICAgICAgIGNhc2UgUEFfU1RSRUFNX1JFQURZOgorICAgICAgICBjYXNlIFBBX1NUUkVBTV9GQUlMRUQ6CisgICAgICAgIGNhc2UgUEFfU1RSRUFNX1RFUk1JTkFURUQ6CisgICAgICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwocy0+bWFpbmxvb3AsIDApOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW50IHB1bHNlX3N0cmVhbV93YWl0KFB1bHNlRGF0YSAqcykKK3sKKyAgICBwYV9zdHJlYW1fc3RhdGVfdCBzdGF0ZTsKKworICAgIHdoaWxlICgoc3RhdGUgPSBwYV9zdHJlYW1fZ2V0X3N0YXRlKHMtPnN0cmVhbSkpICE9IFBBX1NUUkVBTV9SRUFEWSkgeworICAgICAgICBpZiAoc3RhdGUgPT0gUEFfU1RSRUFNX0ZBSUxFRCB8fCBzdGF0ZSA9PSBQQV9TVFJFQU1fVEVSTUlOQVRFRCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KHMtPm1haW5sb29wKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1bHNlX2NvbnRleHRfc3RhdGUocGFfY29udGV4dCAqY3R4LCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgICBQdWxzZURhdGEgKnMgPSB1c2VyZGF0YTsKKworICAgIGlmIChzLT5jdHggIT0gY3R4KQorICAgICAgICByZXR1cm47CisKKyAgICBzd2l0Y2ggKHBhX2NvbnRleHRfZ2V0X3N0YXRlKGN0eCkpIHsKKyAgICAgICAgY2FzZSBQQV9DT05URVhUX1JFQURZOgorICAgICAgICBjYXNlIFBBX0NPTlRFWFRfRkFJTEVEOgorICAgICAgICBjYXNlIFBBX0NPTlRFWFRfVEVSTUlOQVRFRDoKKyAgICAgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbChzLT5tYWlubG9vcCwgMCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcHVsc2VfY29udGV4dF93YWl0KFB1bHNlRGF0YSAqcykKK3sKKyAgICBwYV9jb250ZXh0X3N0YXRlX3Qgc3RhdGU7CisKKyAgICB3aGlsZSAoKHN0YXRlID0gcGFfY29udGV4dF9nZXRfc3RhdGUocy0+Y3R4KSkgIT0gUEFfQ09OVEVYVF9SRUFEWSkgeworICAgICAgICBpZiAoc3RhdGUgPT0gUEFfQ09OVEVYVF9GQUlMRUQgfHwgc3RhdGUgPT0gUEFfQ09OVEVYVF9URVJNSU5BVEVEKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQocy0+bWFpbmxvb3ApOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHVsc2Vfc3RyZWFtX3Jlc3VsdChwYV9zdHJlYW0gKnN0cmVhbSwgaW50IHN1Y2Nlc3MsIHZvaWQgKnVzZXJkYXRhKQoreworICAgIFB1bHNlRGF0YSAqcyA9IHVzZXJkYXRhOworCisgICAgaWYgKHN0cmVhbSAhPSBzLT5zdHJlYW0pCisgICAgICAgIHJldHVybjsKKworICAgIHMtPmxhc3RfcmVzdWx0ID0gc3VjY2VzcyA/IDAgOiBBVkVSUk9SX0VYVEVSTkFMOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbChzLT5tYWlubG9vcCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgcHVsc2VfZmluaXNoX3N0cmVhbV9vcGVyYXRpb24oUHVsc2VEYXRhICpzLCBwYV9vcGVyYXRpb24gKm9wLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGlmICghb3ApIHsKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKHMtPm1haW5sb29wKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiVzIGZhaWxlZC5cbiIsIG5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisgICAgcy0+bGFzdF9yZXN1bHQgPSAyOworICAgIHdoaWxlIChzLT5sYXN0X3Jlc3VsdCA9PSAyKQorICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KHMtPm1haW5sb29wKTsKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYob3ApOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhzLT5tYWlubG9vcCk7CisgICAgaWYgKHMtPmxhc3RfcmVzdWx0ICE9IDApCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICIlcyBmYWlsZWQuXG4iLCBuYW1lKTsKKyAgICByZXR1cm4gcy0+bGFzdF9yZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHVsc2Vfc2V0X3BhdXNlKFB1bHNlRGF0YSAqcywgaW50IHBhdXNlKQoreworICAgIHBhX29wZXJhdGlvbiAqb3A7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhzLT5tYWlubG9vcCk7CisgICAgb3AgPSBwYV9zdHJlYW1fY29yayhzLT5zdHJlYW0sIHBhdXNlLCBwdWxzZV9zdHJlYW1fcmVzdWx0LCBzKTsKKyAgICByZXR1cm4gcHVsc2VfZmluaXNoX3N0cmVhbV9vcGVyYXRpb24ocywgb3AsICJwYV9zdHJlYW1fY29yayIpOworfQorCitzdGF0aWMgaW50IHB1bHNlX2ZsYXNoX3N0cmVhbShQdWxzZURhdGEgKnMpCit7CisgICAgcGFfb3BlcmF0aW9uICpvcDsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKHMtPm1haW5sb29wKTsKKyAgICBvcCA9IHBhX3N0cmVhbV9mbHVzaChzLT5zdHJlYW0sIHB1bHNlX3N0cmVhbV9yZXN1bHQsIHMpOworICAgIHJldHVybiBwdWxzZV9maW5pc2hfc3RyZWFtX29wZXJhdGlvbihzLCBvcCwgInBhX3N0cmVhbV9mbHVzaCIpOworfQorCitzdGF0aWMgdm9pZCBwdWxzZV9jb250ZXh0X3Jlc3VsdChwYV9jb250ZXh0ICpjdHgsIGludCBzdWNjZXNzLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgICBQdWxzZURhdGEgKnMgPSB1c2VyZGF0YTsKKworICAgIGlmIChzLT5jdHggIT0gY3R4KQorICAgICAgICByZXR1cm47CisKKyAgICBzLT5sYXN0X3Jlc3VsdCA9IHN1Y2Nlc3MgPyAwIDogQVZFUlJPUl9FWFRFUk5BTDsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwocy0+bWFpbmxvb3AsIDApOworfQorCitzdGF0aWMgaW50IHB1bHNlX2ZpbmlzaF9jb250ZXh0X29wZXJhdGlvbihQdWxzZURhdGEgKnMsIHBhX29wZXJhdGlvbiAqb3AsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYgKCFvcCkgeworICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2socy0+bWFpbmxvb3ApOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJXMgZmFpbGVkLlxuIiwgbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyAgICBzLT5sYXN0X3Jlc3VsdCA9IDI7CisgICAgd2hpbGUgKHMtPmxhc3RfcmVzdWx0ID09IDIpCisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQocy0+bWFpbmxvb3ApOworICAgIHBhX29wZXJhdGlvbl91bnJlZihvcCk7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKHMtPm1haW5sb29wKTsKKyAgICBpZiAocy0+bGFzdF9yZXN1bHQgIT0gMCkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiVzIGZhaWxlZC5cbiIsIG5hbWUpOworICAgIHJldHVybiBzLT5sYXN0X3Jlc3VsdDsKK30KKworc3RhdGljIGludCBwdWxzZV9zZXRfbXV0ZShQdWxzZURhdGEgKnMpCit7CisgICAgcGFfb3BlcmF0aW9uICpvcDsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKHMtPm1haW5sb29wKTsKKyAgICBvcCA9IHBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfbXV0ZShzLT5jdHgsIHBhX3N0cmVhbV9nZXRfaW5kZXgocy0+c3RyZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdXRlLCBwdWxzZV9jb250ZXh0X3Jlc3VsdCwgcyk7CisgICAgcmV0dXJuIHB1bHNlX2ZpbmlzaF9jb250ZXh0X29wZXJhdGlvbihzLCBvcCwgInBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfbXV0ZSIpOworfQorCitzdGF0aWMgaW50IHB1bHNlX3NldF92b2x1bWUoUHVsc2VEYXRhICpzLCBkb3VibGUgdm9sdW1lKQoreworICAgIHBhX29wZXJhdGlvbiAqb3A7CisgICAgcGFfY3ZvbHVtZSBjdm9sOworICAgIHBhX3ZvbHVtZV90IHZvbDsKKyAgICBjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3MgPSBwYV9zdHJlYW1fZ2V0X3NhbXBsZV9zcGVjKHMtPnN0cmVhbSk7CisKKyAgICB2b2wgPSBwYV9zd192b2x1bWVfbXVsdGlwbHkobHJvdW5kKHZvbHVtZSAqIFBBX1ZPTFVNRV9OT1JNKSwgcy0+YmFzZV92b2x1bWUpOworICAgIHBhX2N2b2x1bWVfc2V0KCZjdm9sLCBzcy0+Y2hhbm5lbHMsIFBBX1ZPTFVNRV9OT1JNKTsKKyAgICBwYV9zd19jdm9sdW1lX211bHRpcGx5X3NjYWxhcigmY3ZvbCwgJmN2b2wsIHZvbCk7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhzLT5tYWlubG9vcCk7CisgICAgb3AgPSBwYV9jb250ZXh0X3NldF9zaW5rX2lucHV0X3ZvbHVtZShzLT5jdHgsIHBhX3N0cmVhbV9nZXRfaW5kZXgocy0+c3RyZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdm9sLCBwdWxzZV9jb250ZXh0X3Jlc3VsdCwgcyk7CisgICAgcmV0dXJuIHB1bHNlX2ZpbmlzaF9jb250ZXh0X29wZXJhdGlvbihzLCBvcCwgInBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfdm9sdW1lIik7Cit9CisKK3N0YXRpYyBpbnQgcHVsc2Vfc3Vic2NyaWJlX2V2ZW50cyhQdWxzZURhdGEgKnMpCit7CisgICAgcGFfb3BlcmF0aW9uICpvcDsKKworICAgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2socy0+bWFpbmxvb3ApOworICAgIG9wID0gcGFfY29udGV4dF9zdWJzY3JpYmUocy0+Y3R4LCBQQV9TVUJTQ1JJUFRJT05fTUFTS19TSU5LX0lOUFVULCBwdWxzZV9jb250ZXh0X3Jlc3VsdCwgcyk7CisgICAgcmV0dXJuIHB1bHNlX2ZpbmlzaF9jb250ZXh0X29wZXJhdGlvbihzLCBvcCwgInBhX2NvbnRleHRfc3Vic2NyaWJlIik7Cit9CisKK3N0YXRpYyB2b2lkIHB1bHNlX21hcF9jaGFubmVsc190b19wdWxzZShpbnQ2NF90IGNoYW5uZWxfbGF5b3V0LCBwYV9jaGFubmVsX21hcCAqY2hhbm5lbF9tYXApCit7CisgICAgY2hhbm5lbF9tYXAtPmNoYW5uZWxzID0gMDsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9MRUZUKQorICAgICAgICBjaGFubmVsX21hcC0+bWFwW2NoYW5uZWxfbWFwLT5jaGFubmVscysrXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVDsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9SSUdIVCkKKyAgICAgICAgY2hhbm5lbF9tYXAtPm1hcFtjaGFubmVsX21hcC0+Y2hhbm5lbHMrK10gPSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUOworICAgIGlmIChjaGFubmVsX2xheW91dCAmIEFWX0NIX0ZST05UX0NFTlRFUikKKyAgICAgICAgY2hhbm5lbF9tYXAtPm1hcFtjaGFubmVsX21hcC0+Y2hhbm5lbHMrK10gPSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUjsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9MT1dfRlJFUVVFTkNZKQorICAgICAgICBjaGFubmVsX21hcC0+bWFwW2NoYW5uZWxfbWFwLT5jaGFubmVscysrXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fTEZFOworICAgIGlmIChjaGFubmVsX2xheW91dCAmIEFWX0NIX0JBQ0tfTEVGVCkKKyAgICAgICAgY2hhbm5lbF9tYXAtPm1hcFtjaGFubmVsX21hcC0+Y2hhbm5lbHMrK10gPSBQQV9DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVDsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9CQUNLX1JJR0hUKQorICAgICAgICBjaGFubmVsX21hcC0+bWFwW2NoYW5uZWxfbWFwLT5jaGFubmVscysrXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVDsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUikKKyAgICAgICAgY2hhbm5lbF9tYXAtPm1hcFtjaGFubmVsX21hcC0+Y2hhbm5lbHMrK10gPSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSOworICAgIGlmIChjaGFubmVsX2xheW91dCAmIEFWX0NIX0ZST05UX1JJR0hUX09GX0NFTlRFUikKKyAgICAgICAgY2hhbm5lbF9tYXAtPm1hcFtjaGFubmVsX21hcC0+Y2hhbm5lbHMrK10gPSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUX09GX0NFTlRFUjsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9CQUNLX0NFTlRFUikKKyAgICAgICAgY2hhbm5lbF9tYXAtPm1hcFtjaGFubmVsX21hcC0+Y2hhbm5lbHMrK10gPSBQQV9DSEFOTkVMX1BPU0lUSU9OX1JFQVJfQ0VOVEVSOworICAgIGlmIChjaGFubmVsX2xheW91dCAmIEFWX0NIX1NJREVfTEVGVCkKKyAgICAgICAgY2hhbm5lbF9tYXAtPm1hcFtjaGFubmVsX21hcC0+Y2hhbm5lbHMrK10gPSBQQV9DSEFOTkVMX1BPU0lUSU9OX1NJREVfTEVGVDsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9TSURFX1JJR0hUKQorICAgICAgICBjaGFubmVsX21hcC0+bWFwW2NoYW5uZWxfbWFwLT5jaGFubmVscysrXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVDsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9UT1BfQ0VOVEVSKQorICAgICAgICBjaGFubmVsX21hcC0+bWFwW2NoYW5uZWxfbWFwLT5jaGFubmVscysrXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0NFTlRFUjsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9UT1BfRlJPTlRfTEVGVCkKKyAgICAgICAgY2hhbm5lbF9tYXAtPm1hcFtjaGFubmVsX21hcC0+Y2hhbm5lbHMrK10gPSBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9MRUZUOworICAgIGlmIChjaGFubmVsX2xheW91dCAmIEFWX0NIX1RPUF9GUk9OVF9DRU5URVIpCisgICAgICAgIGNoYW5uZWxfbWFwLT5tYXBbY2hhbm5lbF9tYXAtPmNoYW5uZWxzKytdID0gUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfQ0VOVEVSOworICAgIGlmIChjaGFubmVsX2xheW91dCAmIEFWX0NIX1RPUF9GUk9OVF9SSUdIVCkKKyAgICAgICAgY2hhbm5lbF9tYXAtPm1hcFtjaGFubmVsX21hcC0+Y2hhbm5lbHMrK10gPSBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9SSUdIVDsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9UT1BfQkFDS19MRUZUKQorICAgICAgICBjaGFubmVsX21hcC0+bWFwW2NoYW5uZWxfbWFwLT5jaGFubmVscysrXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfTEVGVDsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9UT1BfQkFDS19DRU5URVIpCisgICAgICAgIGNoYW5uZWxfbWFwLT5tYXBbY2hhbm5lbF9tYXAtPmNoYW5uZWxzKytdID0gUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9DRU5URVI7CisgICAgaWYgKGNoYW5uZWxfbGF5b3V0ICYgQVZfQ0hfVE9QX0JBQ0tfUklHSFQpCisgICAgICAgIGNoYW5uZWxfbWFwLT5tYXBbY2hhbm5lbF9tYXAtPmNoYW5uZWxzKytdID0gUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9SSUdIVDsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9TVEVSRU9fTEVGVCkKKyAgICAgICAgY2hhbm5lbF9tYXAtPm1hcFtjaGFubmVsX21hcC0+Y2hhbm5lbHMrK10gPSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQ7CisgICAgaWYgKGNoYW5uZWxfbGF5b3V0ICYgQVZfQ0hfU1RFUkVPX1JJR0hUKQorICAgICAgICBjaGFubmVsX21hcC0+bWFwW2NoYW5uZWxfbWFwLT5jaGFubmVscysrXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQ7CisgICAgaWYgKGNoYW5uZWxfbGF5b3V0ICYgQVZfQ0hfV0lERV9MRUZUKQorICAgICAgICBjaGFubmVsX21hcC0+bWFwW2NoYW5uZWxfbWFwLT5jaGFubmVscysrXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMDsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9XSURFX1JJR0hUKQorICAgICAgICBjaGFubmVsX21hcC0+bWFwW2NoYW5uZWxfbWFwLT5jaGFubmVscysrXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9TVVJST1VORF9ESVJFQ1RfTEVGVCkKKyAgICAgICAgY2hhbm5lbF9tYXAtPm1hcFtjaGFubmVsX21hcC0+Y2hhbm5lbHMrK10gPSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI7CisgICAgaWYgKGNoYW5uZWxfbGF5b3V0ICYgQVZfQ0hfU1VSUk9VTkRfRElSRUNUX1JJR0hUKQorICAgICAgICBjaGFubmVsX21hcC0+bWFwW2NoYW5uZWxfbWFwLT5jaGFubmVscysrXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMzsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9MT1dfRlJFUVVFTkNZXzIpCisgICAgICAgIGNoYW5uZWxfbWFwLT5tYXBbY2hhbm5lbF9tYXAtPmNoYW5uZWxzKytdID0gUEFfQ0hBTk5FTF9QT1NJVElPTl9MRkU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBwdWxzZV93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqaCkKK3sKKyAgICBQdWxzZURhdGEgKnMgPSBoLT5wcml2X2RhdGE7CisKKyAgICBpZiAocy0+bWFpbmxvb3ApIHsKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhzLT5tYWlubG9vcCk7CisgICAgICAgIGlmIChzLT5zdHJlYW0pIHsKKyAgICAgICAgICAgIHBhX3N0cmVhbV9kaXNjb25uZWN0KHMtPnN0cmVhbSk7CisgICAgICAgICAgICBwYV9zdHJlYW1fc2V0X3N0YXRlX2NhbGxiYWNrKHMtPnN0cmVhbSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrKHMtPnN0cmVhbSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBwYV9zdHJlYW1fc2V0X292ZXJmbG93X2NhbGxiYWNrKHMtPnN0cmVhbSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBwYV9zdHJlYW1fc2V0X3VuZGVyZmxvd19jYWxsYmFjayhzLT5zdHJlYW0sIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgcGFfc3RyZWFtX3VucmVmKHMtPnN0cmVhbSk7CisgICAgICAgICAgICBzLT5zdHJlYW0gPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5jdHgpIHsKKyAgICAgICAgICAgIHBhX2NvbnRleHRfZGlzY29ubmVjdChzLT5jdHgpOworICAgICAgICAgICAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2socy0+Y3R4LCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIHBhX2NvbnRleHRfc2V0X3N1YnNjcmliZV9jYWxsYmFjayhzLT5jdHgsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgcGFfY29udGV4dF91bnJlZihzLT5jdHgpOworICAgICAgICAgICAgcy0+Y3R4ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2socy0+bWFpbmxvb3ApOworICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zdG9wKHMtPm1haW5sb29wKTsKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZnJlZShzLT5tYWlubG9vcCk7CisgICAgICAgIHMtPm1haW5sb29wID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHB1bHNlX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmgpCit7CisgICAgUHVsc2VEYXRhICpzID0gaC0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IE5VTEw7CisgICAgaW50IHJldDsKKyAgICBwYV9zYW1wbGVfc3BlYyBzYW1wbGVfc3BlYzsKKyAgICBwYV9idWZmZXJfYXR0ciBidWZmZXJfYXR0cmlidXRlcyA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xIH07CisgICAgcGFfY2hhbm5lbF9tYXAgY2hhbm5lbF9tYXA7CisgICAgcGFfbWFpbmxvb3BfYXBpICptYWlubG9vcF9hcGk7CisgICAgY29uc3QgY2hhciAqc3RyZWFtX25hbWUgPSBzLT5zdHJlYW1fbmFtZTsKKyAgICBzdGF0aWMgY29uc3QgcGFfc3RyZWFtX2ZsYWdzX3Qgc3RyZWFtX2ZsYWdzID0gUEFfU1RSRUFNX0lOVEVSUE9MQVRFX1RJTUlORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQV9TVFJFQU1fTk9UX01PTk9UT05JQzsKKworICAgIGlmIChoLT5uYl9zdHJlYW1zICE9IDEgfHwgaC0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPbmx5IGEgc2luZ2xlIGF1ZGlvIHN0cmVhbSBpcyBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgc3QgPSBoLT5zdHJlYW1zWzBdOworCisgICAgaWYgKCFzdHJlYW1fbmFtZSkgeworICAgICAgICBpZiAoaC0+ZmlsZW5hbWVbMF0pCisgICAgICAgICAgICBzdHJlYW1fbmFtZSA9IGgtPmZpbGVuYW1lOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHJlYW1fbmFtZSA9ICJQbGF5YmFjayI7CisgICAgfQorICAgIHMtPm5vbmJsb2NraW5nID0gKGgtPmZsYWdzICYgQVZGTVRfRkxBR19OT05CTE9DSyk7CisKKyAgICBpZiAocy0+YnVmZmVyX2R1cmF0aW9uKSB7CisgICAgICAgIGludDY0X3QgYnl0ZXMgPSBzLT5idWZmZXJfZHVyYXRpb247CisgICAgICAgIGJ5dGVzICo9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICoKKyAgICAgICAgICAgICAgICAgYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5zYW1wbGVfZm10KTsKKyAgICAgICAgYnl0ZXMgLz0gMTAwMDsKKyAgICAgICAgYnVmZmVyX2F0dHJpYnV0ZXMudGxlbmd0aCA9IEZGTUFYKHMtPmJ1ZmZlcl9zaXplLCBhdl9jbGlwNjQoYnl0ZXMsIDAsIFVJTlQzMl9NQVggLSAxKSk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiQnVmZmVyIGR1cmF0aW9uOiAldW1zIHJlY2FsY3VsYXRlZCBpbnRvICUiUFJJZDY0IiBieXRlcyBidWZmZXIuXG4iLAorICAgICAgICAgICAgICAgcy0+YnVmZmVyX2R1cmF0aW9uLCBieXRlcyk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJSZWFsIGJ1ZmZlciBsZW5ndGggaXMgJXUgYnl0ZXNcbiIsIGJ1ZmZlcl9hdHRyaWJ1dGVzLnRsZW5ndGgpOworICAgIH0gZWxzZSBpZiAocy0+YnVmZmVyX3NpemUpCisgICAgICAgIGJ1ZmZlcl9hdHRyaWJ1dGVzLnRsZW5ndGggPSBzLT5idWZmZXJfc2l6ZTsKKyAgICBpZiAocy0+cHJlYnVmKQorICAgICAgICBidWZmZXJfYXR0cmlidXRlcy5wcmVidWYgPSBzLT5wcmVidWY7CisgICAgaWYgKHMtPm1pbnJlcSkKKyAgICAgICAgYnVmZmVyX2F0dHJpYnV0ZXMubWlucmVxID0gcy0+bWlucmVxOworCisgICAgc2FtcGxlX3NwZWMuZm9ybWF0ID0gZmZfY29kZWNfaWRfdG9fcHVsc2VfZm9ybWF0KHN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgIHNhbXBsZV9zcGVjLnJhdGUgPSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlOworICAgIHNhbXBsZV9zcGVjLmNoYW5uZWxzID0gc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICBpZiAoIXBhX3NhbXBsZV9zcGVjX3ZhbGlkKCZzYW1wbGVfc3BlYykpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2FtcGxlIHNwZWMuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoc2FtcGxlX3NwZWMuY2hhbm5lbHMgPT0gMSkgeworICAgICAgICBjaGFubmVsX21hcC5jaGFubmVscyA9IDE7CisgICAgICAgIGNoYW5uZWxfbWFwLm1hcFswXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fTU9OTzsKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgaWYgKGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0KSAhPSBzdC0+Y29kZWMtPmNoYW5uZWxzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgcHVsc2VfbWFwX2NoYW5uZWxzX3RvX3B1bHNlKHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQsICZjaGFubmVsX21hcCk7CisgICAgICAgIC8qIFVua25vd24gY2hhbm5lbCBpcyBwcmVzZW50IGluIGNoYW5uZWxfbGF5b3V0LCBsZXQgUHVsc2VBdWRpbyB1c2UgaXRzIGRlZmF1bHQuICovCisgICAgICAgIGlmIChjaGFubmVsX21hcC5jaGFubmVscyAhPSBzYW1wbGVfc3BlYy5jaGFubmVscykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBjaGFubmVsLiBVc2luZyBkZWZhdWwgY2hhbm5lbCBtYXAuXG4iKTsKKyAgICAgICAgICAgIGNoYW5uZWxfbWFwLmNoYW5uZWxzID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBjaGFubmVsX21hcC5jaGFubmVscyA9IDA7CisKKyAgICBpZiAoIWNoYW5uZWxfbWFwLmNoYW5uZWxzKQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVc2luZyBQdWxzZUF1ZGlvJ3MgZGVmYXVsdCBjaGFubmVsIG1hcC5cbiIpOworICAgIGVsc2UgaWYgKCFwYV9jaGFubmVsX21hcF92YWxpZCgmY2hhbm5lbF9tYXApKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNoYW5uZWwgbWFwLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogc3RhcnQgbWFpbiBsb29wICovCisgICAgcy0+bWFpbmxvb3AgPSBwYV90aHJlYWRlZF9tYWlubG9vcF9uZXcoKTsKKyAgICBpZiAoIXMtPm1haW5sb29wKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgY3JlYXRlIHRocmVhZGVkIG1haW5sb29wLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGlmICgocmV0ID0gcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RhcnQocy0+bWFpbmxvb3ApKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBzdGFydCB0aHJlYWRlZCBtYWlubG9vcDogJXMuXG4iLCBwYV9zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZnJlZShzLT5tYWlubG9vcCk7CisgICAgICAgIHMtPm1haW5sb29wID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhzLT5tYWlubG9vcCk7CisKKyAgICBtYWlubG9vcF9hcGkgPSBwYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfYXBpKHMtPm1haW5sb29wKTsKKyAgICBpZiAoIW1haW5sb29wX2FwaSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGdldCBtYWlubG9vcCBBUEkuXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHMtPmN0eCA9IHBhX2NvbnRleHRfbmV3KG1haW5sb29wX2FwaSwgcy0+bmFtZSk7CisgICAgaWYgKCFzLT5jdHgpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBjcmVhdGUgY29udGV4dC5cbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2socy0+Y3R4LCBwdWxzZV9jb250ZXh0X3N0YXRlLCBzKTsKKyAgICBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2socy0+Y3R4LCBwdWxzZV9ldmVudCwgaCk7CisKKyAgICBpZiAoKHJldCA9IHBhX2NvbnRleHRfY29ubmVjdChzLT5jdHgsIHMtPnNlcnZlciwgMCwgTlVMTCkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGNvbm5lY3QgY29udGV4dDogJXMuXG4iLCBwYV9zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICgocmV0ID0gcHVsc2VfY29udGV4dF93YWl0KHMpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvbnRleHQgZmFpbGVkLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzLT5zdHJlYW0gPSBwYV9zdHJlYW1fbmV3KHMtPmN0eCwgc3RyZWFtX25hbWUsICZzYW1wbGVfc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwLmNoYW5uZWxzID8gJmNoYW5uZWxfbWFwIDogTlVMTCk7CisKKyAgICBpZiAoKHJldCA9IHB1bHNlX3VwZGF0ZV9zaW5rX2luZm8oaCkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVXBkYXRpbmcgc2luayBpbmZvIGZhaWxlZC5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKCFzLT5zdHJlYW0pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBjcmVhdGUgc3RyZWFtLlxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBwYV9zdHJlYW1fc2V0X3N0YXRlX2NhbGxiYWNrKHMtPnN0cmVhbSwgcHVsc2Vfc3RyZWFtX3N0YXRlLCBzKTsKKyAgICBwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrKHMtPnN0cmVhbSwgcHVsc2Vfc3RyZWFtX3dyaXRhYmxlLCBoKTsKKyAgICBwYV9zdHJlYW1fc2V0X292ZXJmbG93X2NhbGxiYWNrKHMtPnN0cmVhbSwgcHVsc2Vfb3ZlcmZsb3csIGgpOworICAgIHBhX3N0cmVhbV9zZXRfdW5kZXJmbG93X2NhbGxiYWNrKHMtPnN0cmVhbSwgcHVsc2VfdW5kZXJmbG93LCBoKTsKKworICAgIGlmICgocmV0ID0gcGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2socy0+c3RyZWFtLCBzLT5kZXZpY2UsICZidWZmZXJfYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9mbGFncywgTlVMTCwgTlVMTCkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2sgZmFpbGVkOiAlcy5cbiIsIHBhX3N0cmVycm9yKHJldCkpOworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBwdWxzZV9zdHJlYW1fd2FpdChzKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTdHJlYW0gZmFpbGVkLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiByZWFkIGJhY2sgYnVmZmVyIGF0dHJpYnV0ZXMgZm9yIGZ1dHVyZSB1c2UgKi8KKyAgICBidWZmZXJfYXR0cmlidXRlcyA9ICpwYV9zdHJlYW1fZ2V0X2J1ZmZlcl9hdHRyKHMtPnN0cmVhbSk7CisgICAgcy0+YnVmZmVyX3NpemUgPSBidWZmZXJfYXR0cmlidXRlcy50bGVuZ3RoOworICAgIHMtPnByZWJ1ZiA9IGJ1ZmZlcl9hdHRyaWJ1dGVzLnByZWJ1ZjsKKyAgICBzLT5taW5yZXEgPSBidWZmZXJfYXR0cmlidXRlcy5taW5yZXE7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIlJlYWwgYnVmZmVyIGF0dHJpYnV0ZXM6IHNpemU6ICVkLCBwcmVidWY6ICVkLCBtaW5yZXE6ICVkXG4iLAorICAgICAgICAgICBzLT5idWZmZXJfc2l6ZSwgcy0+cHJlYnVmLCBzLT5taW5yZXEpOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKHMtPm1haW5sb29wKTsKKworICAgIGlmICgocmV0ID0gcHVsc2Vfc3Vic2NyaWJlX2V2ZW50cyhzKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFdmVudCBzdWJzY3JpcHRpb24gZmFpbGVkLlxuIik7CisgICAgICAgIC8qIGEgYml0IHVnbHkgYnV0IHRoZSBzaW1wbGVzdCB0byBsb2NrIGhlcmUqLworICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKHMtPm1haW5sb29wKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIGZvcmNlIGNvbnRyb2wgbWVzc2FnZXMgKi8KKyAgICBzLT5tdXRlID0gLTE7CisgICAgcy0+bGFzdF92b2x1bWUgPSBQQV9WT0xVTUVfSU5WQUxJRDsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKHMtPm1haW5sb29wKTsKKyAgICBpZiAoKHJldCA9IHB1bHNlX3VwZGF0ZV9zaW5rX2lucHV0X2luZm8oaCkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVXBkYXRpbmcgc2luayBpbnB1dCBpbmZvIGZhaWxlZC5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhzLT5tYWlubG9vcCk7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMDAwMCk7ICAvKiA2NCBiaXRzIHB0cyBpbiB1cyAqLworCisgICAgcmV0dXJuIDA7CisgIGZhaWw6CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKHMtPm1haW5sb29wKTsKKyAgICBwdWxzZV93cml0ZV90cmFpbGVyKGgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHVsc2Vfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqaCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBQdWxzZURhdGEgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKyAgICBpbnQ2NF90IHdyaXRhYmxlX3NpemU7CisKKyAgICBpZiAoIXBrdCkKKyAgICAgICAgcmV0dXJuIHB1bHNlX2ZsYXNoX3N0cmVhbShzKTsKKworICAgIGlmIChwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcy0+dGltZXN0YW1wID0gcGt0LT5kdHM7CisKKyAgICBpZiAocGt0LT5kdXJhdGlvbikgeworICAgICAgICBzLT50aW1lc3RhbXAgKz0gcGt0LT5kdXJhdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBoLT5zdHJlYW1zWzBdOworICAgICAgICBBVkNvZGVjQ29udGV4dCAqY29kZWNfY3R4ID0gc3QtPmNvZGVjOworICAgICAgICBBVlJhdGlvbmFsIHIgPSB7IDEsIGNvZGVjX2N0eC0+c2FtcGxlX3JhdGUgfTsKKyAgICAgICAgaW50NjRfdCBzYW1wbGVzID0gcGt0LT5zaXplIC8gKGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGNvZGVjX2N0eC0+c2FtcGxlX2ZtdCkgKiBjb2RlY19jdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgcy0+dGltZXN0YW1wICs9IGF2X3Jlc2NhbGVfcShzYW1wbGVzLCByLCBzdC0+dGltZV9iYXNlKTsKKyAgICB9CisKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKHMtPm1haW5sb29wKTsKKyAgICBpZiAoIVBBX1NUUkVBTV9JU19HT09EKHBhX3N0cmVhbV9nZXRfc3RhdGUocy0+c3RyZWFtKSkpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlB1bHNlQXVkaW8gc3RyZWFtIGlzIGluIGludmFsaWQgc3RhdGUuXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICB3aGlsZSAocGFfc3RyZWFtX3dyaXRhYmxlX3NpemUocy0+c3RyZWFtKSA8IHMtPm1pbnJlcSkgeworICAgICAgICBpZiAocy0+bm9uYmxvY2tpbmcpIHsKKyAgICAgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhzLT5tYWlubG9vcCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQocy0+bWFpbmxvb3ApOworICAgIH0KKworICAgIGlmICgocmV0ID0gcGFfc3RyZWFtX3dyaXRlKHMtPnN0cmVhbSwgcGt0LT5kYXRhLCBwa3QtPnNpemUsIE5VTEwsIDAsIFBBX1NFRUtfUkVMQVRJVkUpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInBhX3N0cmVhbV93cml0ZSBmYWlsZWQ6ICVzXG4iLCBwYV9zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoKHdyaXRhYmxlX3NpemUgPSBwYV9zdHJlYW1fd3JpdGFibGVfc2l6ZShzLT5zdHJlYW0pKSA+PSBzLT5taW5yZXEpCisgICAgICAgIGF2ZGV2aWNlX2Rldl90b19hcHBfY29udHJvbF9tZXNzYWdlKGgsIEFWX0RFVl9UT19BUFBfQlVGRkVSX1dSSVRBQkxFLCAmd3JpdGFibGVfc2l6ZSwgc2l6ZW9mKHdyaXRhYmxlX3NpemUpKTsKKworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhzLT5tYWlubG9vcCk7CisKKyAgICByZXR1cm4gMDsKKyAgZmFpbDoKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2socy0+bWFpbmxvb3ApOworICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworfQorCitzdGF0aWMgaW50IHB1bHNlX3dyaXRlX2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqaCwgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqKmZyYW1lLCB1bnNpZ25lZCBmbGFncykKK3sKKyAgICBBVlBhY2tldCBwa3Q7CisKKyAgICAvKiBQbGFuYXIgZm9ybWF0cyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuICovCisgICAgaWYgKGZsYWdzICYgQVZfV1JJVEVfVU5DT0RFRF9GUkFNRV9RVUVSWSkKKyAgICAgICAgcmV0dXJuIGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGgtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWMtPnNhbXBsZV9mbXQpID8KKyAgICAgICAgICAgICAgIEFWRVJST1IoRUlOVkFMKSA6IDA7CisKKyAgICBwa3QuZGF0YSAgICAgPSAoKmZyYW1lKS0+ZGF0YVswXTsKKyAgICBwa3Quc2l6ZSAgICAgPSAoKmZyYW1lKS0+bmJfc2FtcGxlcyAqIGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKCgqZnJhbWUpLT5mb3JtYXQpICogYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKCpmcmFtZSk7CisgICAgcGt0LmR0cyAgICAgID0gKCpmcmFtZSktPnBrdF9kdHM7CisgICAgcGt0LmR1cmF0aW9uID0gYXZfZnJhbWVfZ2V0X3BrdF9kdXJhdGlvbigqZnJhbWUpOworICAgIHJldHVybiBwdWxzZV93cml0ZV9wYWNrZXQoaCwgJnBrdCk7Cit9CisKKworc3RhdGljIHZvaWQgcHVsc2VfZ2V0X291dHB1dF90aW1lc3RhbXAoQVZGb3JtYXRDb250ZXh0ICpoLCBpbnQgc3RyZWFtLCBpbnQ2NF90ICpkdHMsIGludDY0X3QgKndhbGwpCit7CisgICAgUHVsc2VEYXRhICpzID0gaC0+cHJpdl9kYXRhOworICAgIHBhX3VzZWNfdCBsYXRlbmN5OworICAgIGludCBuZWc7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhzLT5tYWlubG9vcCk7CisgICAgcGFfc3RyZWFtX2dldF9sYXRlbmN5KHMtPnN0cmVhbSwgJmxhdGVuY3ksICZuZWcpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhzLT5tYWlubG9vcCk7CisgICAgaWYgKHdhbGwpCisgICAgICAgICp3YWxsID0gYXZfZ2V0dGltZSgpOworICAgIGlmIChkdHMpCisgICAgICAgICpkdHMgPSBzLT50aW1lc3RhbXAgLSAobmVnID8gLWxhdGVuY3kgOiBsYXRlbmN5KTsKK30KKworc3RhdGljIGludCBwdWxzZV9nZXRfZGV2aWNlX2xpc3QoQVZGb3JtYXRDb250ZXh0ICpoLCBBVkRldmljZUluZm9MaXN0ICpkZXZpY2VfbGlzdCkKK3sKKyAgICBQdWxzZURhdGEgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3B1bHNlX2F1ZGlvX2dldF9kZXZpY2VzKGRldmljZV9saXN0LCBzLT5zZXJ2ZXIsIDEpOworfQorCitzdGF0aWMgaW50IHB1bHNlX2NvbnRyb2xfbWVzc2FnZShBVkZvcm1hdENvbnRleHQgKmgsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkKK3sKKyAgICBQdWxzZURhdGEgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSBBVl9BUFBfVE9fREVWX1BBVVNFOgorICAgICAgICByZXR1cm4gcHVsc2Vfc2V0X3BhdXNlKHMsIDEpOworICAgIGNhc2UgQVZfQVBQX1RPX0RFVl9QTEFZOgorICAgICAgICByZXR1cm4gcHVsc2Vfc2V0X3BhdXNlKHMsIDApOworICAgIGNhc2UgQVZfQVBQX1RPX0RFVl9UT0dHTEVfUEFVU0U6CisgICAgICAgIHJldHVybiBwdWxzZV9zZXRfcGF1c2UocywgIXBhX3N0cmVhbV9pc19jb3JrZWQocy0+c3RyZWFtKSk7CisgICAgY2FzZSBBVl9BUFBfVE9fREVWX01VVEU6CisgICAgICAgIGlmICghcy0+bXV0ZSkgeworICAgICAgICAgICAgcy0+bXV0ZSA9IDE7CisgICAgICAgICAgICByZXR1cm4gcHVsc2Vfc2V0X211dGUocyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBBVl9BUFBfVE9fREVWX1VOTVVURToKKyAgICAgICAgaWYgKHMtPm11dGUpIHsKKyAgICAgICAgICAgIHMtPm11dGUgPSAwOworICAgICAgICAgICAgcmV0dXJuIHB1bHNlX3NldF9tdXRlKHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgQVZfQVBQX1RPX0RFVl9UT0dHTEVfTVVURToKKyAgICAgICAgcy0+bXV0ZSA9ICFzLT5tdXRlOworICAgICAgICByZXR1cm4gcHVsc2Vfc2V0X211dGUocyk7CisgICAgY2FzZSBBVl9BUFBfVE9fREVWX1NFVF9WT0xVTUU6CisgICAgICAgIHJldHVybiBwdWxzZV9zZXRfdm9sdW1lKHMsICooZG91YmxlICopZGF0YSk7CisgICAgY2FzZSBBVl9BUFBfVE9fREVWX0dFVF9WT0xVTUU6CisgICAgICAgIHMtPmxhc3Rfdm9sdW1lID0gUEFfVk9MVU1FX0lOVkFMSUQ7CisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2socy0+bWFpbmxvb3ApOworICAgICAgICByZXQgPSBwdWxzZV91cGRhdGVfc2lua19pbnB1dF9pbmZvKGgpOworICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2socy0+bWFpbmxvb3ApOworICAgICAgICByZXR1cm4gcmV0OworICAgIGNhc2UgQVZfQVBQX1RPX0RFVl9HRVRfTVVURToKKyAgICAgICAgcy0+bXV0ZSA9IC0xOworICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKHMtPm1haW5sb29wKTsKKyAgICAgICAgcmV0ID0gcHVsc2VfdXBkYXRlX3NpbmtfaW5wdXRfaW5mbyhoKTsKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKHMtPm1haW5sb29wKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKworI2RlZmluZSBPRkZTRVQoYSkgb2Zmc2V0b2YoUHVsc2VEYXRhLCBhKQorI2RlZmluZSBFIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInNlcnZlciIsICAgICAgICAgICJzZXQgUHVsc2VBdWRpbyBzZXJ2ZXIiLCAgICAgICAgICAgIE9GRlNFVChzZXJ2ZXIpLCAgICAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEUgfSwKKyAgICB7ICJuYW1lIiwgICAgICAgICAgICAic2V0IGFwcGxpY2F0aW9uIG5hbWUiLCAgICAgICAgICAgICBPRkZTRVQobmFtZSksICAgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IExJQkFWRk9STUFUX0lERU5UfSwgIDAsIDAsIEUgfSwKKyAgICB7ICJzdHJlYW1fbmFtZSIsICAgICAic2V0IHN0cmVhbSBkZXNjcmlwdGlvbiIsICAgICAgICAgICBPRkZTRVQoc3RyZWFtX25hbWUpLCAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBFIH0sCisgICAgeyAiZGV2aWNlIiwgICAgICAgICAgInNldCBkZXZpY2UgbmFtZSIsICAgICAgICAgICAgICAgICAgT0ZGU0VUKGRldmljZSksICAgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRSB9LAorICAgIHsgImJ1ZmZlcl9zaXplIiwgICAgICJzZXQgYnVmZmVyIHNpemUgaW4gYnl0ZXMiLCAgICAgICAgIE9GRlNFVChidWZmZXJfc2l6ZSksICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIEUgfSwKKyAgICB7ICJidWZmZXJfZHVyYXRpb24iLCAic2V0IGJ1ZmZlciBkdXJhdGlvbiBpbiBtaWxsaXNlY3MiLCBPRkZTRVQoYnVmZmVyX2R1cmF0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBFIH0sCisgICAgeyAicHJlYnVmIiwgICAgICAgICAgInNldCBwcmUtYnVmZmVyaW5nIHNpemUiLCAgICAgICAgICAgT0ZGU0VUKHByZWJ1ZiksICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgRSB9LAorICAgIHsgIm1pbnJlcSIsICAgICAgICAgICJzZXQgbWluaW11bSByZXF1ZXN0IHNpemUiLCAgICAgICAgIE9GRlNFVChtaW5yZXEpLCAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIEUgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgcHVsc2VfbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgICAgID0gIlB1bHNlQXVkaW8gbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgICAgICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgICAgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9BVURJT19PVVRQVVQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9wdWxzZV9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAicHVsc2UiLAorICAgIC5sb25nX25hbWUgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQdWxzZSBhdWRpbyBvdXRwdXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgPSBzaXplb2YoUHVsc2VEYXRhKSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgICAgPSBBVl9ORShBVl9DT0RFQ19JRF9QQ01fUzE2QkUsIEFWX0NPREVDX0lEX1BDTV9TMTZMRSksCisgICAgLnZpZGVvX2NvZGVjICAgICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgICAgPSBwdWxzZV93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgICAgID0gcHVsc2Vfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV91bmNvZGVkX2ZyYW1lICA9IHB1bHNlX3dyaXRlX2ZyYW1lLAorICAgIC53cml0ZV90cmFpbGVyICAgICAgICA9IHB1bHNlX3dyaXRlX3RyYWlsZXIsCisgICAgLmdldF9vdXRwdXRfdGltZXN0YW1wID0gcHVsc2VfZ2V0X291dHB1dF90aW1lc3RhbXAsCisgICAgLmdldF9kZXZpY2VfbGlzdCAgICAgID0gcHVsc2VfZ2V0X2RldmljZV9saXN0LAorICAgIC5jb250cm9sX21lc3NhZ2UgICAgICA9IHB1bHNlX2NvbnRyb2xfbWVzc2FnZSwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUgfCBBVkZNVF9BTExPV19GTFVTSCwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgICAgPSAmcHVsc2VfbXV4ZXJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL3F0a2l0Lm0gYi9mZm1wZWcvbGliYXZkZXZpY2UvcXRraXQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThmYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3F0a2l0Lm0KQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBRVEtpdCBpbnB1dCBkZXZpY2UKKyAqIENvcHlyaWdodCAoYykgMjAxMyBWYWRpbSBLYWxpbnNreSA8dmFkaW1Aa2FsaW5za3kucnU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFFUS2l0IGlucHV0IGRldmljZQorICogQGF1dGhvciBWYWRpbSBLYWxpbnNreSA8dmFkaW1Aa2FsaW5za3kucnU+CisgKi8KKworI2ltcG9ydCA8UVRLaXQvUVRLaXQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaW5jbHVkZSAiYXZkZXZpY2UuaCIKKworI2RlZmluZSBRVEtJVF9USU1FQkFTRSAxMDAKKworc3RhdGljIGNvbnN0IEFWUmF0aW9uYWwga1FUS2l0VGltZUJhc2VfcSA9IHsKKyAgICAubnVtID0gMSwKKyAgICAuZGVuID0gUVRLSVRfVElNRUJBU0UKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQVZDbGFzcyogICAgICAgIGNsYXNzOworCisgICAgZmxvYXQgICAgICAgICAgIGZyYW1lX3JhdGU7CisgICAgaW50ICAgICAgICAgICAgIGZyYW1lc19jYXB0dXJlZDsKKyAgICBpbnQ2NF90ICAgICAgICAgZmlyc3RfcHRzOworICAgIHB0aHJlYWRfbXV0ZXhfdCBmcmFtZV9sb2NrOworICAgIHB0aHJlYWRfY29uZF90ICBmcmFtZV93YWl0X2NvbmQ7CisgICAgaWQgICAgICAgICAgICAgIHF0X2RlbGVnYXRlOworCisgICAgaW50ICAgICAgICAgICAgIGxpc3RfZGV2aWNlczsKKyAgICBpbnQgICAgICAgICAgICAgdmlkZW9fZGV2aWNlX2luZGV4OworCisgICAgUVRDYXB0dXJlU2Vzc2lvbiogICAgICAgICAgICAgICAgIGNhcHR1cmVfc2Vzc2lvbjsKKyAgICBRVENhcHR1cmVEZWNvbXByZXNzZWRWaWRlb091dHB1dCogdmlkZW9fb3V0cHV0OworICAgIENWSW1hZ2VCdWZmZXJSZWYgICAgICAgICAgICAgICAgICBjdXJyZW50X2ZyYW1lOworfSBDYXB0dXJlQ29udGV4dDsKKworc3RhdGljIHZvaWQgbG9ja19mcmFtZXMoQ2FwdHVyZUNvbnRleHQqIGN0eCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmN0eC0+ZnJhbWVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHVubG9ja19mcmFtZXMoQ2FwdHVyZUNvbnRleHQqIGN0eCkKK3sKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY3R4LT5mcmFtZV9sb2NrKTsKK30KKworLyoqIEZyYW1lUmVjaWV2ZXIgY2xhc3MgLSBkZWxlZ2F0ZSBmb3IgUVRDYXB0dXJlU2Vzc2lvbgorICovCitAaW50ZXJmYWNlIEZGTVBFR19GcmFtZVJlY2VpdmVyIDogTlNPYmplY3QKK3sKKyAgICBDYXB0dXJlQ29udGV4dCogX2NvbnRleHQ7Cit9CisKKy0gKGlkKWluaXRXaXRoQ29udGV4dDooQ2FwdHVyZUNvbnRleHQqKWNvbnRleHQ7CisKKy0gKHZvaWQpY2FwdHVyZU91dHB1dDooUVRDYXB0dXJlT3V0cHV0ICopY2FwdHVyZU91dHB1dAorICBkaWRPdXRwdXRWaWRlb0ZyYW1lOihDVkltYWdlQnVmZmVyUmVmKXZpZGVvRnJhbWUKKyAgICAgd2l0aFNhbXBsZUJ1ZmZlcjooUVRTYW1wbGVCdWZmZXIgKilzYW1wbGVCdWZmZXIKKyAgICAgICBmcm9tQ29ubmVjdGlvbjooUVRDYXB0dXJlQ29ubmVjdGlvbiAqKWNvbm5lY3Rpb247CisKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEZGTVBFR19GcmFtZVJlY2VpdmVyCisKKy0gKGlkKWluaXRXaXRoQ29udGV4dDooQ2FwdHVyZUNvbnRleHQqKWNvbnRleHQKK3sKKyAgICBpZiAoc2VsZiA9IFtzdXBlciBpbml0XSkgeworICAgICAgICBfY29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKWNhcHR1cmVPdXRwdXQ6KFFUQ2FwdHVyZU91dHB1dCAqKWNhcHR1cmVPdXRwdXQKKyAgZGlkT3V0cHV0VmlkZW9GcmFtZTooQ1ZJbWFnZUJ1ZmZlclJlZil2aWRlb0ZyYW1lCisgICAgIHdpdGhTYW1wbGVCdWZmZXI6KFFUU2FtcGxlQnVmZmVyICopc2FtcGxlQnVmZmVyCisgICAgICAgZnJvbUNvbm5lY3Rpb246KFFUQ2FwdHVyZUNvbm5lY3Rpb24gKiljb25uZWN0aW9uCit7CisgICAgbG9ja19mcmFtZXMoX2NvbnRleHQpOworICAgIGlmIChfY29udGV4dC0+Y3VycmVudF9mcmFtZSAhPSBuaWwpIHsKKyAgICAgICAgQ1ZCdWZmZXJSZWxlYXNlKF9jb250ZXh0LT5jdXJyZW50X2ZyYW1lKTsKKyAgICB9CisKKyAgICBfY29udGV4dC0+Y3VycmVudF9mcmFtZSA9IENWQnVmZmVyUmV0YWluKHZpZGVvRnJhbWUpOworCisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmX2NvbnRleHQtPmZyYW1lX3dhaXRfY29uZCk7CisKKyAgICB1bmxvY2tfZnJhbWVzKF9jb250ZXh0KTsKKworICAgICsrX2NvbnRleHQtPmZyYW1lc19jYXB0dXJlZDsKK30KKworQGVuZAorCitzdGF0aWMgdm9pZCBkZXN0cm95X2NvbnRleHQoQ2FwdHVyZUNvbnRleHQqIGN0eCkKK3sKKyAgICBbY3R4LT5jYXB0dXJlX3Nlc3Npb24gc3RvcFJ1bm5pbmddOworCisgICAgW2N0eC0+Y2FwdHVyZV9zZXNzaW9uIHJlbGVhc2VdOworICAgIFtjdHgtPnZpZGVvX291dHB1dCAgICByZWxlYXNlXTsKKyAgICBbY3R4LT5xdF9kZWxlZ2F0ZSAgICAgcmVsZWFzZV07CisKKyAgICBjdHgtPmNhcHR1cmVfc2Vzc2lvbiA9IE5VTEw7CisgICAgY3R4LT52aWRlb19vdXRwdXQgICAgPSBOVUxMOworICAgIGN0eC0+cXRfZGVsZWdhdGUgICAgID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmY3R4LT5mcmFtZV9sb2NrKTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmY3R4LT5mcmFtZV93YWl0X2NvbmQpOworCisgICAgaWYgKGN0eC0+Y3VycmVudF9mcmFtZSkKKyAgICAgICAgQ1ZCdWZmZXJSZWxlYXNlKGN0eC0+Y3VycmVudF9mcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcXRraXRfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE5TQXV0b3JlbGVhc2VQb29sKiBwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisKKyAgICBDYXB0dXJlQ29udGV4dCogY3R4ID0gKENhcHR1cmVDb250ZXh0KilzLT5wcml2X2RhdGE7CisKKyAgICBjdHgtPmZpcnN0X3B0cyA9IGF2X2dldHRpbWUoKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmY3R4LT5mcmFtZV9sb2NrLCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmY3R4LT5mcmFtZV93YWl0X2NvbmQsIE5VTEwpOworCisgICAgLy8gTGlzdCBkZXZpY2VzIGlmIHJlcXVlc3RlZAorICAgIGlmIChjdHgtPmxpc3RfZGV2aWNlcykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlFUS2l0IHZpZGVvIGRldmljZXM6XG4iKTsKKyAgICAgICAgTlNBcnJheSAqZGV2aWNlcyA9IFtRVENhcHR1cmVEZXZpY2UgaW5wdXREZXZpY2VzV2l0aE1lZGlhVHlwZTpRVE1lZGlhVHlwZVZpZGVvXTsKKyAgICAgICAgZm9yIChRVENhcHR1cmVEZXZpY2UgKmRldmljZSBpbiBkZXZpY2VzKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gW1tkZXZpY2UgbG9jYWxpemVkRGlzcGxheU5hbWVdIFVURjhTdHJpbmddOworICAgICAgICAgICAgaW50IGluZGV4ICA9IFtkZXZpY2VzIGluZGV4T2ZPYmplY3Q6ZGV2aWNlXTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiWyVkXSAlc1xuIiwgaW5kZXgsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvLyBGaW5kIGNhcHR1cmUgZGV2aWNlCisgICAgUVRDYXB0dXJlRGV2aWNlICp2aWRlb19kZXZpY2UgPSBuaWw7CisKKyAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGluZGV4IGdpdmVuIGluIGZpbGVuYW1lCisgICAgaWYgKGN0eC0+dmlkZW9fZGV2aWNlX2luZGV4ID09IC0xKSB7CisgICAgICAgIHNzY2FuZihzLT5maWxlbmFtZSwgIiVkIiwgJmN0eC0+dmlkZW9fZGV2aWNlX2luZGV4KTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT52aWRlb19kZXZpY2VfaW5kZXggPj0gMCkgeworICAgICAgICBOU0FycmF5ICpkZXZpY2VzID0gW1FUQ2FwdHVyZURldmljZSBpbnB1dERldmljZXNXaXRoTWVkaWFUeXBlOlFUTWVkaWFUeXBlVmlkZW9dOworCisgICAgICAgIGlmIChjdHgtPnZpZGVvX2RldmljZV9pbmRleCA+PSBbZGV2aWNlcyBjb3VudF0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZGV2aWNlIGluZGV4XG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvX2RldmljZSA9IFtkZXZpY2VzIG9iamVjdEF0SW5kZXg6Y3R4LT52aWRlb19kZXZpY2VfaW5kZXhdOworICAgIH0gZWxzZSBpZiAoc3RybmNtcChzLT5maWxlbmFtZSwgIiIsICAgICAgICAxKSAmJgorICAgICAgICAgICAgICAgc3RybmNtcChzLT5maWxlbmFtZSwgImRlZmF1bHQiLCA3KSkgeworICAgICAgICBOU0FycmF5ICpkZXZpY2VzID0gW1FUQ2FwdHVyZURldmljZSBpbnB1dERldmljZXNXaXRoTWVkaWFUeXBlOlFUTWVkaWFUeXBlVmlkZW9dOworCisgICAgICAgIGZvciAoUVRDYXB0dXJlRGV2aWNlICpkZXZpY2UgaW4gZGV2aWNlcykgeworICAgICAgICAgICAgaWYgKCFzdHJuY21wKHMtPmZpbGVuYW1lLCBbW2RldmljZSBsb2NhbGl6ZWREaXNwbGF5TmFtZV0gVVRGOFN0cmluZ10sIHN0cmxlbihzLT5maWxlbmFtZSkpKSB7CisgICAgICAgICAgICAgICAgdmlkZW9fZGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghdmlkZW9fZGV2aWNlKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJWaWRlbyBkZXZpY2Ugbm90IGZvdW5kXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHZpZGVvX2RldmljZSA9IFtRVENhcHR1cmVEZXZpY2UgZGVmYXVsdElucHV0RGV2aWNlV2l0aE1lZGlhVHlwZTpRVE1lZGlhVHlwZU11eGVkXTsKKyAgICB9CisKKyAgICBCT09MIHN1Y2Nlc3MgPSBbdmlkZW9fZGV2aWNlIG9wZW46bmlsXTsKKworICAgIC8vIFZpZGVvIGNhcHR1cmUgZGV2aWNlIG5vdCBmb3VuZCwgbG9va2luZyBmb3IgUVRNZWRpYVR5cGVWaWRlbworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICB2aWRlb19kZXZpY2UgPSBbUVRDYXB0dXJlRGV2aWNlIGRlZmF1bHRJbnB1dERldmljZVdpdGhNZWRpYVR5cGU6UVRNZWRpYVR5cGVWaWRlb107CisgICAgICAgIHN1Y2Nlc3MgICAgICA9IFt2aWRlb19kZXZpY2Ugb3BlbjpuaWxdOworCisgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vIFFUIGNhcHR1cmUgZGV2aWNlIGZvdW5kXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIE5TU3RyaW5nKiBkZXZfZGlzcGxheV9uYW1lID0gW3ZpZGVvX2RldmljZSBsb2NhbGl6ZWREaXNwbGF5TmFtZV07CisgICAgYXZfbG9nIChzLCBBVl9MT0dfREVCVUcsICInJXMnIG9wZW5lZFxuIiwgW2Rldl9kaXNwbGF5X25hbWUgVVRGOFN0cmluZ10pOworCisgICAgLy8gSW5pdGlhbGl6ZSBjYXB0dXJlIHNlc3Npb24KKyAgICBjdHgtPmNhcHR1cmVfc2Vzc2lvbiA9IFtbUVRDYXB0dXJlU2Vzc2lvbiBhbGxvY10gaW5pdF07CisKKyAgICBRVENhcHR1cmVEZXZpY2VJbnB1dCogY2FwdHVyZV9kZXZfaW5wdXQgPSBbW1tRVENhcHR1cmVEZXZpY2VJbnB1dCBhbGxvY10gaW5pdFdpdGhEZXZpY2U6dmlkZW9fZGV2aWNlXSBhdXRvcmVsZWFzZV07CisgICAgc3VjY2VzcyA9IFtjdHgtPmNhcHR1cmVfc2Vzc2lvbiBhZGRJbnB1dDpjYXB0dXJlX2Rldl9pbnB1dCBlcnJvcjpuaWxdOworCisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIGF2X2xvZyAocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFkZCBRVCBjYXB0dXJlIGRldmljZSB0byBzZXNzaW9uXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8vIEF0dGFjaGluZyBvdXRwdXQKKyAgICAvLyBGSVhNRTogQWxsb3cgZm9yIGEgdXNlciBkZWZpbmVkIHBpeGVsIGZvcm1hdAorICAgIGN0eC0+dmlkZW9fb3V0cHV0ID0gW1tRVENhcHR1cmVEZWNvbXByZXNzZWRWaWRlb091dHB1dCBhbGxvY10gaW5pdF07CisKKyAgICBOU0RpY3Rpb25hcnkgKmNhcHR1cmVEaWN0aW9uYXJ5ID0gW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOU051bWJlciBudW1iZXJXaXRoVW5zaWduZWRJbnQ6a0NWUGl4ZWxGb3JtYXRUeXBlXzI0UkdCXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpZClrQ1ZQaXhlbEJ1ZmZlclBpeGVsRm9ybWF0VHlwZUtleV07CisKKyAgICBbY3R4LT52aWRlb19vdXRwdXQgc2V0UGl4ZWxCdWZmZXJBdHRyaWJ1dGVzOmNhcHR1cmVEaWN0aW9uYXJ5XTsKKworICAgIGN0eC0+cXRfZGVsZWdhdGUgPSBbW0ZGTVBFR19GcmFtZVJlY2VpdmVyIGFsbG9jXSBpbml0V2l0aENvbnRleHQ6Y3R4XTsKKworICAgIFtjdHgtPnZpZGVvX291dHB1dCBzZXREZWxlZ2F0ZTpjdHgtPnF0X2RlbGVnYXRlXTsKKyAgICBbY3R4LT52aWRlb19vdXRwdXQgc2V0QXV0b21hdGljYWxseURyb3BzTGF0ZVZpZGVvRnJhbWVzOllFU107CisgICAgW2N0eC0+dmlkZW9fb3V0cHV0IHNldE1pbmltdW1WaWRlb0ZyYW1lSW50ZXJ2YWw6MS4wL2N0eC0+ZnJhbWVfcmF0ZV07CisKKyAgICBzdWNjZXNzID0gW2N0eC0+Y2FwdHVyZV9zZXNzaW9uIGFkZE91dHB1dDpjdHgtPnZpZGVvX291dHB1dCBlcnJvcjpuaWxdOworCisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIGF2X2xvZyAocywgQVZfTE9HX0VSUk9SLCAiY2FuJ3QgYWRkIHZpZGVvIG91dHB1dCB0byBjYXB0dXJlIHNlc3Npb25cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgW2N0eC0+Y2FwdHVyZV9zZXNzaW9uIHN0YXJ0UnVubmluZ107CisKKyAgICAvLyBUYWtlIHN0cmVhbSBpbmZvIGZyb20gdGhlIGZpcnN0IGZyYW1lLgorICAgIHdoaWxlIChjdHgtPmZyYW1lc19jYXB0dXJlZCA8IDEpIHsKKyAgICAgICAgQ0ZSdW5Mb29wUnVuSW5Nb2RlKGtDRlJ1bkxvb3BEZWZhdWx0TW9kZSwgMC4xLCBZRVMpOworICAgIH0KKworICAgIGxvY2tfZnJhbWVzKGN0eCk7CisKKyAgICBBVlN0cmVhbSogc3RyZWFtID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKworICAgIGlmICghc3RyZWFtKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0cmVhbSwgNjQsIDEsIFFUS0lUX1RJTUVCQVNFKTsKKworICAgIHN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0cmVhbS0+Y29kZWMtPndpZHRoICAgICAgPSAoaW50KUNWUGl4ZWxCdWZmZXJHZXRXaWR0aCAoY3R4LT5jdXJyZW50X2ZyYW1lKTsKKyAgICBzdHJlYW0tPmNvZGVjLT5oZWlnaHQgICAgID0gKGludClDVlBpeGVsQnVmZmVyR2V0SGVpZ2h0KGN0eC0+Y3VycmVudF9mcmFtZSk7CisgICAgc3RyZWFtLT5jb2RlYy0+cGl4X2ZtdCAgICA9IEFWX1BJWF9GTVRfUkdCMjQ7CisKKyAgICBDVkJ1ZmZlclJlbGVhc2UoY3R4LT5jdXJyZW50X2ZyYW1lKTsKKyAgICBjdHgtPmN1cnJlbnRfZnJhbWUgPSBuaWw7CisKKyAgICB1bmxvY2tfZnJhbWVzKGN0eCk7CisKKyAgICBbcG9vbCByZWxlYXNlXTsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIFtwb29sIHJlbGVhc2VdOworCisgICAgZGVzdHJveV9jb250ZXh0KGN0eCk7CisKKyAgICByZXR1cm4gQVZFUlJPUihFSU8pOworfQorCitzdGF0aWMgaW50IHF0a2l0X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBDYXB0dXJlQ29udGV4dCogY3R4ID0gKENhcHR1cmVDb250ZXh0KilzLT5wcml2X2RhdGE7CisKKyAgICBkbyB7CisgICAgICAgIGxvY2tfZnJhbWVzKGN0eCk7CisKKyAgICAgICAgaWYgKGN0eC0+Y3VycmVudF9mcmFtZSAhPSBuaWwpIHsKKyAgICAgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgKGludClDVlBpeGVsQnVmZmVyR2V0RGF0YVNpemUoY3R4LT5jdXJyZW50X2ZyYW1lKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGt0LT5wdHMgPSBwa3QtPmR0cyA9IGF2X3Jlc2NhbGVfcShhdl9nZXR0aW1lKCkgLSBjdHgtPmZpcnN0X3B0cywgQVZfVElNRV9CQVNFX1EsIGtRVEtpdFRpbWVCYXNlX3EpOworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgICAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICAgICAgICAgIENWUGl4ZWxCdWZmZXJMb2NrQmFzZUFkZHJlc3MoY3R4LT5jdXJyZW50X2ZyYW1lLCAwKTsKKworICAgICAgICAgICAgdm9pZCogZGF0YSA9IENWUGl4ZWxCdWZmZXJHZXRCYXNlQWRkcmVzcyhjdHgtPmN1cnJlbnRfZnJhbWUpOworICAgICAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgZGF0YSwgcGt0LT5zaXplKTsKKworICAgICAgICAgICAgQ1ZQaXhlbEJ1ZmZlclVubG9ja0Jhc2VBZGRyZXNzKGN0eC0+Y3VycmVudF9mcmFtZSwgMCk7CisgICAgICAgICAgICBDVkJ1ZmZlclJlbGVhc2UoY3R4LT5jdXJyZW50X2ZyYW1lKTsKKyAgICAgICAgICAgIGN0eC0+Y3VycmVudF9mcmFtZSA9IG5pbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBrdC0+ZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmY3R4LT5mcmFtZV93YWl0X2NvbmQsICZjdHgtPmZyYW1lX2xvY2spOworICAgICAgICB9CisKKyAgICAgICAgdW5sb2NrX2ZyYW1lcyhjdHgpOworICAgIH0gd2hpbGUgKCFwa3QtPmRhdGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXRraXRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIENhcHR1cmVDb250ZXh0KiBjdHggPSAoQ2FwdHVyZUNvbnRleHQqKXMtPnByaXZfZGF0YTsKKworICAgIGRlc3Ryb3lfY29udGV4dChjdHgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiZnJhbWVfcmF0ZSIsICJzZXQgZnJhbWUgcmF0ZSIsIG9mZnNldG9mKENhcHR1cmVDb250ZXh0LCBmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IDMwLjAgfSwgMC4xLCAzMC4wLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCBOVUxMIH0sCisgICAgeyAibGlzdF9kZXZpY2VzIiwgImxpc3QgYXZhaWxhYmxlIGRldmljZXMiLCBvZmZzZXRvZihDYXB0dXJlQ29udGV4dCwgbGlzdF9kZXZpY2VzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJsaXN0X2RldmljZXMiIH0sCisgICAgeyAidHJ1ZSIsICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MX0sIDAsIDAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAibGlzdF9kZXZpY2VzIiB9LAorICAgIHsgImZhbHNlIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJsaXN0X2RldmljZXMiIH0sCisgICAgeyAidmlkZW9fZGV2aWNlX2luZGV4IiwgInNlbGVjdCB2aWRlbyBkZXZpY2UgYnkgaW5kZXggZm9yIGRldmljZXMgd2l0aCBzYW1lIG5hbWUgKHN0YXJ0cyBhdCAwKSIsIG9mZnNldG9mKENhcHR1cmVDb250ZXh0LCB2aWRlb19kZXZpY2VfaW5kZXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHF0a2l0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlFUS2l0IGlucHV0IGRldmljZSIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfVklERU9fSU5QVVQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX3F0a2l0X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInF0a2l0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUVRLaXQgaW5wdXQgZGV2aWNlIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENhcHR1cmVDb250ZXh0KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBxdGtpdF9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBxdGtpdF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBxdGtpdF9jbG9zZSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnF0a2l0X2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9zZGwuYyBiL2ZmbXBlZy9saWJhdmRldmljZS9zZGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOThhYWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3NkbC5jCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbGliU0RMIG91dHB1dCBkZXZpY2UKKyAqLworCisjaW5jbHVkZSA8U0RMLmg+CisjaW5jbHVkZSA8U0RMX3RocmVhZC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBTRExfU3VyZmFjZSAqc3VyZmFjZTsKKyAgICBTRExfT3ZlcmxheSAqb3ZlcmxheTsKKyAgICBjaGFyICp3aW5kb3dfdGl0bGU7CisgICAgY2hhciAqaWNvbl90aXRsZTsKKyAgICBpbnQgd2luZG93X3dpZHRoLCAgd2luZG93X2hlaWdodDsgIC8qKjwgc2l6ZSBvZiB0aGUgd2luZG93ICovCisgICAgaW50IHdpbmRvd19mdWxsc2NyZWVuOworCisgICAgU0RMX1JlY3Qgb3ZlcmxheV9yZWN0OworICAgIGludCBvdmVybGF5X2ZtdDsKKworICAgIGludCBzZGxfd2FzX2FscmVhZHlfaW5pdGVkOworICAgIFNETF9UaHJlYWQgKmV2ZW50X3RocmVhZDsKKyAgICBTRExfbXV0ZXggKm11dGV4OworICAgIFNETF9jb25kICppbml0X2NvbmQ7CisgICAgaW50IGluaXRfcmV0OyAvKiByZXR1cm4gY29kZSB1c2VkIHRvIHNpZ25hbCBpbml0aWFsaXphdGlvbiBlcnJvcnMgKi8KKyAgICBpbnQgaW5pdGVkOworICAgIGludCBxdWl0OworfSBTRExDb250ZXh0OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkbF9vdmVybGF5X3BpeF9mbXRfZW50cnkgeworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OyBpbnQgb3ZlcmxheV9mbXQ7Cit9IHNkbF9vdmVybGF5X3BpeF9mbXRfbWFwW10gPSB7CisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAsIFNETF9JWVVWX09WRVJMQVkgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVZVjQyMiwgU0RMX1lVWTJfT1ZFUkxBWSB9LAorICAgIHsgQVZfUElYX0ZNVF9VWVZZNDIyLCBTRExfVVlWWV9PVkVSTEFZIH0sCisgICAgeyBBVl9QSVhfRk1UX05PTkUsICAgIDAgICAgICAgICAgICAgICAgfSwKK307CisKK3N0YXRpYyBpbnQgc2RsX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNETENvbnRleHQgKnNkbCA9IHMtPnByaXZfZGF0YTsKKworICAgIHNkbC0+cXVpdCA9IDE7CisKKyAgICBpZiAoc2RsLT5vdmVybGF5KQorICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkoc2RsLT5vdmVybGF5KTsKKyAgICBzZGwtPm92ZXJsYXkgPSBOVUxMOworICAgIGlmIChzZGwtPmV2ZW50X3RocmVhZCkKKyAgICAgICAgU0RMX1dhaXRUaHJlYWQoc2RsLT5ldmVudF90aHJlYWQsIE5VTEwpOworICAgIHNkbC0+ZXZlbnRfdGhyZWFkID0gTlVMTDsKKyAgICBpZiAoc2RsLT5tdXRleCkKKyAgICAgICAgU0RMX0Rlc3Ryb3lNdXRleChzZGwtPm11dGV4KTsKKyAgICBzZGwtPm11dGV4ID0gTlVMTDsKKyAgICBpZiAoc2RsLT5pbml0X2NvbmQpCisgICAgICAgIFNETF9EZXN0cm95Q29uZChzZGwtPmluaXRfY29uZCk7CisgICAgc2RsLT5pbml0X2NvbmQgPSBOVUxMOworCisgICAgaWYgKCFzZGwtPnNkbF93YXNfYWxyZWFkeV9pbml0ZWQpCisgICAgICAgIFNETF9RdWl0KCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZV9vdmVybGF5X3JlY3QoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWUmF0aW9uYWwgc2FyLCBkYXI7IC8qIHNhbXBsZSBhbmQgZGlzcGxheSBhc3BlY3QgcmF0aW9zICovCisgICAgU0RMQ29udGV4dCAqc2RsID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgQVZDb2RlY0NvbnRleHQgKmVuY2N0eCA9IHN0LT5jb2RlYzsKKyAgICBTRExfUmVjdCAqb3ZlcmxheV9yZWN0ID0gJnNkbC0+b3ZlcmxheV9yZWN0OworCisgICAgLyogY29tcHV0ZSBvdmVybGF5IHdpZHRoIGFuZCBoZWlnaHQgZnJvbSB0aGUgY29kZWMgY29udGV4dCBpbmZvcm1hdGlvbiAqLworICAgIHNhciA9IHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA/IHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvIDogKEFWUmF0aW9uYWwpeyAxLCAxIH07CisgICAgZGFyID0gYXZfbXVsX3Eoc2FyLCAoQVZSYXRpb25hbCl7IGVuY2N0eC0+d2lkdGgsIGVuY2N0eC0+aGVpZ2h0IH0pOworCisgICAgLyogd2Ugc3VwcG9zZSB0aGUgc2NyZWVuIGhhcyBhIDEvMSBzYW1wbGUgYXNwZWN0IHJhdGlvICovCisgICAgaWYgKHNkbC0+d2luZG93X3dpZHRoICYmIHNkbC0+d2luZG93X2hlaWdodCkgeworICAgICAgICAvKiBmaXQgaW4gdGhlIHdpbmRvdyAqLworICAgICAgICBpZiAoYXZfY21wX3EoZGFyLCAoQVZSYXRpb25hbCl7IHNkbC0+d2luZG93X3dpZHRoLCBzZGwtPndpbmRvd19oZWlnaHQgfSkgPiAwKSB7CisgICAgICAgICAgICAvKiBmaXQgaW4gd2lkdGggKi8KKyAgICAgICAgICAgIG92ZXJsYXlfcmVjdC0+dyA9IHNkbC0+d2luZG93X3dpZHRoOworICAgICAgICAgICAgb3ZlcmxheV9yZWN0LT5oID0gYXZfcmVzY2FsZShvdmVybGF5X3JlY3QtPncsIGRhci5kZW4sIGRhci5udW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZml0IGluIGhlaWdodCAqLworICAgICAgICAgICAgb3ZlcmxheV9yZWN0LT5oID0gc2RsLT53aW5kb3dfaGVpZ2h0OworICAgICAgICAgICAgb3ZlcmxheV9yZWN0LT53ID0gYXZfcmVzY2FsZShvdmVybGF5X3JlY3QtPmgsIGRhci5udW0sIGRhci5kZW4pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNhci5udW0gPiBzYXIuZGVuKSB7CisgICAgICAgICAgICBvdmVybGF5X3JlY3QtPncgPSBlbmNjdHgtPndpZHRoOworICAgICAgICAgICAgb3ZlcmxheV9yZWN0LT5oID0gYXZfcmVzY2FsZShvdmVybGF5X3JlY3QtPncsIGRhci5kZW4sIGRhci5udW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3ZlcmxheV9yZWN0LT5oID0gZW5jY3R4LT5oZWlnaHQ7CisgICAgICAgICAgICBvdmVybGF5X3JlY3QtPncgPSBhdl9yZXNjYWxlKG92ZXJsYXlfcmVjdC0+aCwgZGFyLm51bSwgZGFyLmRlbik7CisgICAgICAgIH0KKyAgICAgICAgc2RsLT53aW5kb3dfd2lkdGggID0gb3ZlcmxheV9yZWN0LT53OworICAgICAgICBzZGwtPndpbmRvd19oZWlnaHQgPSBvdmVybGF5X3JlY3QtPmg7CisgICAgfQorCisgICAgb3ZlcmxheV9yZWN0LT54ID0gKHNkbC0+d2luZG93X3dpZHRoICAtIG92ZXJsYXlfcmVjdC0+dykgLyAyOworICAgIG92ZXJsYXlfcmVjdC0+eSA9IChzZGwtPndpbmRvd19oZWlnaHQgLSBvdmVybGF5X3JlY3QtPmgpIC8gMjsKK30KKworI2RlZmluZSBTRExfQkFTRV9GTEFHUyAoU0RMX1NXU1VSRkFDRXxTRExfUkVTSVpBQkxFKQorCitzdGF0aWMgaW50IGV2ZW50X3RocmVhZCh2b2lkICphcmcpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpzID0gYXJnOworICAgIFNETENvbnRleHQgKnNkbCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgZmxhZ3MgPSBTRExfQkFTRV9GTEFHUyB8IChzZGwtPndpbmRvd19mdWxsc2NyZWVuID8gU0RMX0ZVTExTQ1JFRU4gOiAwKTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIEFWQ29kZWNDb250ZXh0ICplbmNjdHggPSBzdC0+Y29kZWM7CisKKyAgICAvKiBpbml0aWFsaXphdGlvbiAqLworICAgIGlmIChTRExfSW5pdChTRExfSU5JVF9WSURFTykgIT0gMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgU0RMOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICBzZGwtPmluaXRfcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGluaXRfZW5kOworICAgIH0KKworICAgIFNETF9XTV9TZXRDYXB0aW9uKHNkbC0+d2luZG93X3RpdGxlLCBzZGwtPmljb25fdGl0bGUpOworICAgIHNkbC0+c3VyZmFjZSA9IFNETF9TZXRWaWRlb01vZGUoc2RsLT53aW5kb3dfd2lkdGgsIHNkbC0+d2luZG93X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0LCBmbGFncyk7CisgICAgaWYgKCFzZGwtPnN1cmZhY2UpIHsKKyAgICAgICAgYXZfbG9nKHNkbCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNldCB2aWRlbyBtb2RlOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICBzZGwtPmluaXRfcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGluaXRfZW5kOworICAgIH0KKworICAgIHNkbC0+b3ZlcmxheSA9IFNETF9DcmVhdGVZVVZPdmVybGF5KGVuY2N0eC0+d2lkdGgsIGVuY2N0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkbC0+b3ZlcmxheV9mbXQsIHNkbC0+c3VyZmFjZSk7CisgICAgaWYgKCFzZGwtPm92ZXJsYXkgfHwgc2RsLT5vdmVybGF5LT5waXRjaGVzWzBdIDwgZW5jY3R4LT53aWR0aCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlNETCBkb2VzIG5vdCBzdXBwb3J0IGFuIG92ZXJsYXkgd2l0aCBzaXplIG9mICVkeCVkIHBpeGVsc1xuIiwKKyAgICAgICAgICAgICAgIGVuY2N0eC0+d2lkdGgsIGVuY2N0eC0+aGVpZ2h0KTsKKyAgICAgICAgc2RsLT5pbml0X3JldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBpbml0X2VuZDsKKyAgICB9CisKKyAgICBzZGwtPmluaXRfcmV0ID0gMDsKKyAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJ3OiVkIGg6JWQgZm10OiVzIC0+IHc6JWQgaDolZFxuIiwKKyAgICAgICAgICAgZW5jY3R4LT53aWR0aCwgZW5jY3R4LT5oZWlnaHQsIGF2X2dldF9waXhfZm10X25hbWUoZW5jY3R4LT5waXhfZm10KSwKKyAgICAgICAgICAgc2RsLT5vdmVybGF5X3JlY3Qudywgc2RsLT5vdmVybGF5X3JlY3QuaCk7CisKK2luaXRfZW5kOgorICAgIFNETF9Mb2NrTXV0ZXgoc2RsLT5tdXRleCk7CisgICAgc2RsLT5pbml0ZWQgPSAxOworICAgIFNETF9VbmxvY2tNdXRleChzZGwtPm11dGV4KTsKKyAgICBTRExfQ29uZFNpZ25hbChzZGwtPmluaXRfY29uZCk7CisKKyAgICBpZiAoc2RsLT5pbml0X3JldCA8IDApCisgICAgICAgIHJldHVybiBzZGwtPmluaXRfcmV0OworCisgICAgLyogZXZlbnQgbG9vcCAqLworICAgIHdoaWxlICghc2RsLT5xdWl0KSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIFNETF9FdmVudCBldmVudDsKKyAgICAgICAgU0RMX1B1bXBFdmVudHMoKTsKKyAgICAgICAgcmV0ID0gU0RMX1BlZXBFdmVudHMoJmV2ZW50LCAxLCBTRExfR0VURVZFTlQsIFNETF9BTExFVkVOVFMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVycm9yIHdoZW4gZ2V0dGluZyBTREwgZXZlbnQ6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIFNETF9EZWxheSgxMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgeworICAgICAgICBjYXNlIFNETF9LRVlET1dOOgorICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXkua2V5c3ltLnN5bSkgeworICAgICAgICAgICAgY2FzZSBTRExLX0VTQ0FQRToKKyAgICAgICAgICAgIGNhc2UgU0RMS19xOgorICAgICAgICAgICAgICAgIHNkbC0+cXVpdCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRExfUVVJVDoKKyAgICAgICAgICAgIHNkbC0+cXVpdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNETF9WSURFT1JFU0laRToKKyAgICAgICAgICAgIHNkbC0+d2luZG93X3dpZHRoICA9IGV2ZW50LnJlc2l6ZS53OworICAgICAgICAgICAgc2RsLT53aW5kb3dfaGVpZ2h0ID0gZXZlbnQucmVzaXplLmg7CisKKyAgICAgICAgICAgIFNETF9Mb2NrTXV0ZXgoc2RsLT5tdXRleCk7CisgICAgICAgICAgICBzZGwtPnN1cmZhY2UgPSBTRExfU2V0VmlkZW9Nb2RlKHNkbC0+d2luZG93X3dpZHRoLCBzZGwtPndpbmRvd19oZWlnaHQsIDI0LCBTRExfQkFTRV9GTEFHUyk7CisgICAgICAgICAgICBpZiAoIXNkbC0+c3VyZmFjZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IFNETCB2aWRlbyBtb2RlOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICAgICAgICAgIHNkbC0+cXVpdCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbXB1dGVfb3ZlcmxheV9yZWN0KHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0RMX1VubG9ja011dGV4KHNkbC0+bXV0ZXgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RsX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgU0RMQ29udGV4dCAqc2RsID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgQVZDb2RlY0NvbnRleHQgKmVuY2N0eCA9IHN0LT5jb2RlYzsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKCFzZGwtPndpbmRvd190aXRsZSkKKyAgICAgICAgc2RsLT53aW5kb3dfdGl0bGUgPSBhdl9zdHJkdXAocy0+ZmlsZW5hbWUpOworICAgIGlmICghc2RsLT5pY29uX3RpdGxlKQorICAgICAgICBzZGwtPmljb25fdGl0bGUgPSBhdl9zdHJkdXAoc2RsLT53aW5kb3dfdGl0bGUpOworCisgICAgaWYgKFNETF9XYXNJbml0KFNETF9JTklUX1ZJREVPKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlNETCB2aWRlbyBzdWJzeXN0ZW0gd2FzIGFscmVhZHkgaW5pdGVkLCBhYm9ydGluZ1xuIik7CisgICAgICAgIHNkbC0+c2RsX3dhc19hbHJlYWR5X2luaXRlZCA9IDE7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICggICBzLT5uYl9zdHJlYW1zID4gMQorICAgICAgICB8fCBlbmNjdHgtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPCisgICAgICAgIHx8IGVuY2N0eC0+Y29kZWNfaWQgICAhPSBBVl9DT0RFQ19JRF9SQVdWSURFTykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT25seSBzdXBwb3J0cyBvbmUgcmF3dmlkZW8gc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgc2RsX292ZXJsYXlfcGl4X2ZtdF9tYXBbaV0ucGl4X2ZtdCAhPSBBVl9QSVhfRk1UX05PTkU7IGkrKykgeworICAgICAgICBpZiAoc2RsX292ZXJsYXlfcGl4X2ZtdF9tYXBbaV0ucGl4X2ZtdCA9PSBlbmNjdHgtPnBpeF9mbXQpIHsKKyAgICAgICAgICAgIHNkbC0+b3ZlcmxheV9mbXQgPSBzZGxfb3ZlcmxheV9waXhfZm10X21hcFtpXS5vdmVybGF5X2ZtdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzZGwtPm92ZXJsYXlfZm10KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0ICclcycsIGNob29zZSBvbmUgb2YgeXV2NDIwcCwgeXV5djQyMiwgb3IgdXl2eTQyMlxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoZW5jY3R4LT5waXhfZm10KSk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgb3ZlcmxheSB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gdGhlIGNvZGVjIGNvbnRleHQgaW5mb3JtYXRpb24gKi8KKyAgICBjb21wdXRlX292ZXJsYXlfcmVjdChzKTsKKworICAgIHNkbC0+aW5pdF9jb25kID0gU0RMX0NyZWF0ZUNvbmQoKTsKKyAgICBpZiAoIXNkbC0+aW5pdF9jb25kKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIFNETCBjb25kaXRpb24gdmFyaWFibGU6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgc2RsLT5tdXRleCA9IFNETF9DcmVhdGVNdXRleCgpOworICAgIGlmICghc2RsLT5tdXRleCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSBTREwgbXV0ZXg6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgc2RsLT5ldmVudF90aHJlYWQgPSBTRExfQ3JlYXRlVGhyZWFkKGV2ZW50X3RocmVhZCwgcyk7CisgICAgaWYgKCFzZGwtPmV2ZW50X3RocmVhZCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSBTREwgZXZlbnQgdGhyZWFkOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogd2FpdCB1bnRpbCB0aGUgdmlkZW8gc3lzdGVtIGhhcyBiZWVuIGluaXRlZCAqLworICAgIFNETF9Mb2NrTXV0ZXgoc2RsLT5tdXRleCk7CisgICAgd2hpbGUgKCFzZGwtPmluaXRlZCkgeworICAgICAgICBTRExfQ29uZFdhaXQoc2RsLT5pbml0X2NvbmQsIHNkbC0+bXV0ZXgpOworICAgIH0KKyAgICBTRExfVW5sb2NrTXV0ZXgoc2RsLT5tdXRleCk7CisgICAgaWYgKHNkbC0+aW5pdF9yZXQgPCAwKSB7CisgICAgICAgIHJldCA9IHNkbC0+aW5pdF9yZXQ7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgc2RsX3dyaXRlX3RyYWlsZXIocyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZGxfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBTRExDb250ZXh0ICpzZGwgPSBzLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuY2N0eCA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWUGljdHVyZSBwaWN0OworICAgIGludCBpOworCisgICAgaWYgKHNkbC0+cXVpdCkgeworICAgICAgICBzZGxfd3JpdGVfdHJhaWxlcihzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgYXZwaWN0dXJlX2ZpbGwoJnBpY3QsIHBrdC0+ZGF0YSwgZW5jY3R4LT5waXhfZm10LCBlbmNjdHgtPndpZHRoLCBlbmNjdHgtPmhlaWdodCk7CisKKyAgICBTRExfTG9ja011dGV4KHNkbC0+bXV0ZXgpOworICAgIFNETF9GaWxsUmVjdChzZGwtPnN1cmZhY2UsICZzZGwtPnN1cmZhY2UtPmNsaXBfcmVjdCwKKyAgICAgICAgICAgICAgICAgU0RMX01hcFJHQihzZGwtPnN1cmZhY2UtPmZvcm1hdCwgMCwgMCwgMCkpOworICAgIFNETF9Mb2NrWVVWT3ZlcmxheShzZGwtPm92ZXJsYXkpOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgc2RsLT5vdmVybGF5LT5waXhlbHMgW2ldID0gcGljdC5kYXRhICAgIFtpXTsKKyAgICAgICAgc2RsLT5vdmVybGF5LT5waXRjaGVzW2ldID0gcGljdC5saW5lc2l6ZVtpXTsKKyAgICB9CisgICAgU0RMX0Rpc3BsYXlZVVZPdmVybGF5KHNkbC0+b3ZlcmxheSwgJnNkbC0+b3ZlcmxheV9yZWN0KTsKKyAgICBTRExfVW5sb2NrWVVWT3ZlcmxheShzZGwtPm92ZXJsYXkpOworCisgICAgU0RMX1VwZGF0ZVJlY3Qoc2RsLT5zdXJmYWNlLAorICAgICAgICAgICAgICAgICAgIHNkbC0+b3ZlcmxheV9yZWN0LngsIHNkbC0+b3ZlcmxheV9yZWN0LnksCisgICAgICAgICAgICAgICAgICAgc2RsLT5vdmVybGF5X3JlY3Qudywgc2RsLT5vdmVybGF5X3JlY3QuaCk7CisgICAgU0RMX1VubG9ja011dGV4KHNkbC0+bXV0ZXgpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNETENvbnRleHQseCkKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJ3aW5kb3dfdGl0bGUiLCAic2V0IFNETCB3aW5kb3cgdGl0bGUiLCAgICAgICAgICAgT0ZGU0VUKHdpbmRvd190aXRsZSksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgImljb25fdGl0bGUiLCAgICJzZXQgU0RMIGljb25pZmllZCB3aW5kb3cgdGl0bGUiLCBPRkZTRVQoaWNvbl90aXRsZSkgICwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sIDAsIDAsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAid2luZG93X3NpemUiLCAgInNldCBTREwgd2luZG93IGZvcmNlZCBzaXplIiwgICAgIE9GRlNFVCh3aW5kb3dfd2lkdGgpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7IC5zdHIgPSBOVUxMIH0sIDAsIDAsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAid2luZG93X2Z1bGxzY3JlZW4iLCAic2V0IFNETCB3aW5kb3cgZnVsbHNjcmVlbiIsIE9GRlNFVCh3aW5kb3dfZnVsbHNjcmVlbiksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgc2RsX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gInNkbCBvdXRkZXYiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX09VVFBVVCwKK307CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3NkbF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic2RsIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU0RMIG91dHB1dCBkZXZpY2UiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU0RMQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAudmlkZW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTywKKyAgICAud3JpdGVfaGVhZGVyICAgPSBzZGxfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IHNkbF93cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gc2RsX3dyaXRlX3RyYWlsZXIsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFIHwgQVZGTVRfVkFSSUFCTEVfRlBTIHwgQVZGTVRfTk9USU1FU1RBTVBTLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZzZGxfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL3NuZGlvX2NvbW1vbi5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3NuZGlvX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZjM5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2Uvc25kaW9fY29tbW9uLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBzbmRpbyBwbGF5IGFuZCBncmFiIGludGVyZmFjZQorICogQ29weXJpZ2h0IChjKSAyMDEwIEphY29iIE1ldXNlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c25kaW8uaD4KKworI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKKyNpbmNsdWRlICJzbmRpb19jb21tb24uaCIKKworc3RhdGljIGlubGluZSB2b2lkIG1vdmVjYih2b2lkICphZGRyLCBpbnQgZGVsdGEpCit7CisgICAgU25kaW9EYXRhICpzID0gYWRkcjsKKworICAgIHMtPmh3cG9zICs9IGRlbHRhICogcy0+Y2hhbm5lbHMgKiBzLT5icHM7Cit9CisKK2F2X2NvbGQgaW50IGZmX3NuZGlvX29wZW4oQVZGb3JtYXRDb250ZXh0ICpzMSwgaW50IGlzX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXVkaW9fZGV2aWNlKQoreworICAgIFNuZGlvRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgc3RydWN0IHNpb19oZGwgKmhkbDsKKyAgICBzdHJ1Y3Qgc2lvX3BhciBwYXI7CisKKyAgICBoZGwgPSBzaW9fb3BlbihhdWRpb19kZXZpY2UsIGlzX291dHB1dCA/IFNJT19QTEFZIDogU0lPX1JFQywgMCk7CisgICAgaWYgKCFoZGwpIHsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgb3BlbiBzbmRpbyBkZXZpY2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHNpb19pbml0cGFyKCZwYXIpOworCisgICAgcGFyLmJpdHMgPSAxNjsKKyAgICBwYXIuc2lnICA9IDE7CisgICAgcGFyLmxlICAgPSBTSU9fTEVfTkFUSVZFOworCisgICAgaWYgKGlzX291dHB1dCkKKyAgICAgICAgcGFyLnBjaGFuID0gcy0+Y2hhbm5lbHM7CisgICAgZWxzZQorICAgICAgICBwYXIucmNoYW4gPSBzLT5jaGFubmVsczsKKyAgICBwYXIucmF0ZSA9IHMtPnNhbXBsZV9yYXRlOworCisgICAgaWYgKCFzaW9fc2V0cGFyKGhkbCwgJnBhcikgfHwgIXNpb19nZXRwYXIoaGRsLCAmcGFyKSkgeworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIkltcG9zc2libGUgdG8gc2V0IHNuZGlvIHBhcmFtZXRlcnMsICIKKyAgICAgICAgICAgICAgICJjaGFubmVsczogJWQgc2FtcGxlIHJhdGU6ICVkXG4iLCBzLT5jaGFubmVscywgcy0+c2FtcGxlX3JhdGUpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHBhci5iaXRzICE9IDE2IHx8IHBhci5zaWcgIT0gMSB8fAorICAgICAgICAoaXNfb3V0cHV0ICAmJiAocGFyLnBjaGFuICE9IHMtPmNoYW5uZWxzKSkgfHwKKyAgICAgICAgKCFpc19vdXRwdXQgJiYgKHBhci5yY2hhbiAhPSBzLT5jaGFubmVscykpIHx8CisgICAgICAgIChwYXIucmF0ZSAhPSBzLT5zYW1wbGVfcmF0ZSkpIHsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgc2V0IGFwcHJvcHJpYXRlIHNuZGlvIHBhcmFtZXRlcnMsICIKKyAgICAgICAgICAgICAgICJjaGFubmVsczogJWQgc2FtcGxlIHJhdGU6ICVkXG4iLCBzLT5jaGFubmVscywgcy0+c2FtcGxlX3JhdGUpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcy0+YnVmZmVyX3NpemUgPSBwYXIucm91bmQgKiBwYXIuYnBzICoKKyAgICAgICAgICAgICAgICAgICAgIChpc19vdXRwdXQgPyBwYXIucGNoYW4gOiBwYXIucmNoYW4pOworCisgICAgaWYgKGlzX291dHB1dCkgeworICAgICAgICBzLT5idWZmZXIgPSBhdl9tYWxsb2Mocy0+YnVmZmVyX3NpemUpOworICAgICAgICBpZiAoIXMtPmJ1ZmZlcikgeworICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmNvZGVjX2lkICAgID0gcGFyLmxlID8gQVZfQ09ERUNfSURfUENNX1MxNkxFIDogQVZfQ09ERUNfSURfUENNX1MxNkJFOworICAgIHMtPmNoYW5uZWxzICAgID0gaXNfb3V0cHV0ID8gcGFyLnBjaGFuIDogcGFyLnJjaGFuOworICAgIHMtPnNhbXBsZV9yYXRlID0gcGFyLnJhdGU7CisgICAgcy0+YnBzICAgICAgICAgPSBwYXIuYnBzOworCisgICAgc2lvX29ubW92ZShoZGwsIG1vdmVjYiwgcyk7CisKKyAgICBpZiAoIXNpb19zdGFydChoZGwpKSB7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHN0YXJ0IHNuZGlvXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHMtPmhkbCA9IGhkbDsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2ZyZWVwKCZzLT5idWZmZXIpOworCisgICAgaWYgKGhkbCkKKyAgICAgICAgc2lvX2Nsb3NlKGhkbCk7CisKKyAgICByZXR1cm4gQVZFUlJPUihFSU8pOworfQorCitpbnQgZmZfc25kaW9fY2xvc2UoU25kaW9EYXRhICpzKQoreworICAgIGF2X2ZyZWVwKCZzLT5idWZmZXIpOworCisgICAgaWYgKHMtPmhkbCkKKyAgICAgICAgc2lvX2Nsb3NlKHMtPmhkbCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS9zbmRpb19jb21tb24uaCBiL2ZmbXBlZy9saWJhdmRldmljZS9zbmRpb19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGY0MWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3NuZGlvX2NvbW1vbi5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBzbmRpbyBwbGF5IGFuZCBncmFiIGludGVyZmFjZQorICogQ29weXJpZ2h0IChjKSAyMDEwIEphY29iIE1ldXNlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWREVWSUNFX1NORElPX0NPTU1PTl9ICisjZGVmaW5lIEFWREVWSUNFX1NORElPX0NPTU1PTl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzbmRpby5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKK3R5cGVkZWYgc3RydWN0IFNuZGlvRGF0YSB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgc3RydWN0IHNpb19oZGwgKmhkbDsKKyAgICBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZDsKKyAgICBpbnQ2NF90IGh3cG9zOworICAgIGludDY0X3Qgc29mdHBvczsKKyAgICB1aW50OF90ICpidWZmZXI7CisgICAgaW50IGJwczsKKyAgICBpbnQgYnVmZmVyX3NpemU7CisgICAgaW50IGJ1ZmZlcl9vZmZzZXQ7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBzYW1wbGVfcmF0ZTsKK30gU25kaW9EYXRhOworCitpbnQgZmZfc25kaW9fb3BlbihBVkZvcm1hdENvbnRleHQgKnMxLCBpbnQgaXNfb3V0cHV0LCBjb25zdCBjaGFyICphdWRpb19kZXZpY2UpOworaW50IGZmX3NuZGlvX2Nsb3NlKFNuZGlvRGF0YSAqcyk7CisKKyNlbmRpZiAvKiBBVkRFVklDRV9TTkRJT19DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL3NuZGlvX2RlYy5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3NuZGlvX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YzY5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2Uvc25kaW9fZGVjLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBzbmRpbyBwbGF5IGFuZCBncmFiIGludGVyZmFjZQorICogQ29weXJpZ2h0IChjKSAyMDEwIEphY29iIE1ldXNlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c25kaW8uaD4KKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKworI2luY2x1ZGUgInNuZGlvX2NvbW1vbi5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgYXVkaW9fcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzMSkKK3sKKyAgICBTbmRpb0RhdGEgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgcmV0OworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMxLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gZmZfc25kaW9fb3BlbihzMSwgMCwgczEtPmZpbGVuYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIHRha2UgcmVhbCBwYXJhbWV0ZXJzICovCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gcy0+Y29kZWNfaWQ7CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHMtPnNhbXBsZV9yYXRlOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBzLT5jaGFubmVsczsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsgIC8qIDY0IGJpdHMgcHRzIGluIHVzICovCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdWRpb19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMxLCBBVlBhY2tldCAqcGt0KQoreworICAgIFNuZGlvRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBiZGVsYXksIGN1cl90aW1lOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGF2X25ld19wYWNrZXQocGt0LCBzLT5idWZmZXJfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IHNpb19yZWFkKHMtPmhkbCwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIGlmIChyZXQgPT0gMCB8fCBzaW9fZW9mKHMtPmhkbCkpIHsKKyAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0KKworICAgIHBrdC0+c2l6ZSAgID0gcmV0OworICAgIHMtPnNvZnRwb3MgKz0gcmV0OworCisgICAgLyogY29tcHV0ZSBwdHMgb2YgdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQgKi8KKyAgICBjdXJfdGltZSA9IGF2X2dldHRpbWUoKTsKKworICAgIGJkZWxheSA9IHJldCArIHMtPmh3cG9zIC0gcy0+c29mdHBvczsKKworICAgIC8qIGNvbnZlcnQgdG8gcHRzICovCisgICAgcGt0LT5wdHMgPSBjdXJfdGltZSAtICgoYmRlbGF5ICogMTAwMDAwMCkgLworICAgICAgICAocy0+YnBzICogcy0+Y2hhbm5lbHMgKiBzLT5zYW1wbGVfcmF0ZSkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhdWRpb19yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqczEpCit7CisgICAgU25kaW9EYXRhICpzID0gczEtPnByaXZfZGF0YTsKKworICAgIGZmX3NuZGlvX2Nsb3NlKHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAic2FtcGxlX3JhdGUiLCAiIiwgb2Zmc2V0b2YoU25kaW9EYXRhLCBzYW1wbGVfcmF0ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA0ODAwMH0sIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiY2hhbm5lbHMiLCAgICAiIiwgb2Zmc2V0b2YoU25kaW9EYXRhLCBjaGFubmVscyksICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAyfSwgICAgIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBzbmRpb19kZW11eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICA9ICJzbmRpbyBpbmRldiIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgICAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX0FVRElPX0lOUFVULAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl9zbmRpb19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzbmRpbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInNuZGlvIGF1ZGlvIGNhcHR1cmUiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU25kaW9EYXRhKSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhdWRpb19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBhdWRpb19yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBhdWRpb19yZWFkX2Nsb3NlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmc25kaW9fZGVtdXhlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2Uvc25kaW9fZW5jLmMgYi9mZm1wZWcvbGliYXZkZXZpY2Uvc25kaW9fZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1Y2YyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS9zbmRpb19lbmMuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIHNuZGlvIHBsYXkgYW5kIGdyYWIgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSmFjb2IgTWV1c2VyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzbmRpby5oPgorCisjaW5jbHVkZSAiYXZkZXZpY2UuaCIKKyNpbmNsdWRlICJzbmRpb19jb21tb24uaCIKKworc3RhdGljIGF2X2NvbGQgaW50IGF1ZGlvX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMxKQoreworICAgIFNuZGlvRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCByZXQ7CisKKyAgICBzdCAgICAgICAgICAgICA9IHMxLT5zdHJlYW1zWzBdOworICAgIHMtPnNhbXBsZV9yYXRlID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKKyAgICBzLT5jaGFubmVscyAgICA9IHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisKKyAgICByZXQgPSBmZl9zbmRpb19vcGVuKHMxLCAxLCBzMS0+ZmlsZW5hbWUpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdWRpb193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzMSwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBTbmRpb0RhdGEgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKmJ1Zj0gcGt0LT5kYXRhOworICAgIGludCBzaXplID0gcGt0LT5zaXplOworICAgIGludCBsZW4sIHJldDsKKworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBsZW4gPSBGRk1JTihzLT5idWZmZXJfc2l6ZSAtIHMtPmJ1ZmZlcl9vZmZzZXQsIHNpemUpOworICAgICAgICBtZW1jcHkocy0+YnVmZmVyICsgcy0+YnVmZmVyX29mZnNldCwgYnVmLCBsZW4pOworICAgICAgICBidWYgICs9IGxlbjsKKyAgICAgICAgc2l6ZSAtPSBsZW47CisgICAgICAgIHMtPmJ1ZmZlcl9vZmZzZXQgKz0gbGVuOworICAgICAgICBpZiAocy0+YnVmZmVyX29mZnNldCA+PSBzLT5idWZmZXJfc2l6ZSkgeworICAgICAgICAgICAgcmV0ID0gc2lvX3dyaXRlKHMtPmhkbCwgcy0+YnVmZmVyLCBzLT5idWZmZXJfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0ID09IDAgfHwgc2lvX2VvZihzLT5oZGwpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBzLT5zb2Z0cG9zICAgICAgKz0gcmV0OworICAgICAgICAgICAgcy0+YnVmZmVyX29mZnNldCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdWRpb193cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqczEpCit7CisgICAgU25kaW9EYXRhICpzID0gczEtPnByaXZfZGF0YTsKKworICAgIHNpb193cml0ZShzLT5oZGwsIHMtPmJ1ZmZlciwgcy0+YnVmZmVyX29mZnNldCk7CisKKyAgICBmZl9zbmRpb19jbG9zZShzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBzbmRpb19tdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAic25kaW8gb3V0ZGV2IiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgICAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX0FVRElPX09VVFBVVCwKK307CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3NuZGlvX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzbmRpbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInNuZGlvIGF1ZGlvIHBsYXliYWNrIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNuZGlvRGF0YSksCisgICAgLyogWFhYOiB3ZSBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHNvdW5kY2FyZCBhY2NlcHRzIHRoaXMgZm9ybWF0ICovCisgICAgLyogWFhYOiBmaW5kIGJldHRlciBzb2x1dGlvbiB3aXRoICJwcmVpbml0IiBtZXRob2QsIG5lZWRlZCBhbHNvIGluCisgICAgICAgb3RoZXIgZm9ybWF0cyAqLworICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX05FKEFWX0NPREVDX0lEX1BDTV9TMTZCRSwgQVZfQ09ERUNfSURfUENNX1MxNkxFKSwKKyAgICAudmlkZW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC53cml0ZV9oZWFkZXIgICA9IGF1ZGlvX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBhdWRpb193cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gYXVkaW9fd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnNuZGlvX211eGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS90aW1lZmlsdGVyLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvdGltZWZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMzhmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvdGltZWZpbHRlci5jCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogRGVsYXkgTG9ja2VkIExvb3AgYmFzZWQgdGltZSBmaWx0ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBTYW1hbHlzZQorICogQ29weXJpZ2h0IChjKSAyMDA5IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqIEF1dGhvcjogT2xpdmllciBHdWlseWFyZGkgPG9saXZpZXIgc2FtYWx5c2UgY29tPgorICogICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmkgZ214IGF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJ0aW1lZmlsdGVyLmgiCisKK3N0cnVjdCBUaW1lRmlsdGVyIHsKKyAgICAvLyBEZWxheSBMb2NrZWQgTG9vcCBkYXRhLiBUaGVzZSB2YXJpYWJsZXMgcmVmZXIgdG8gbWF0aGVtYXRpY2FsCisgICAgLy8gY29uY2VwdHMgZGVzY3JpYmVkIGluOiBodHRwOi8vd3d3Lmtva2tpbml6aXRhLm5ldC9wYXBlcnMvdXNpbmdkbGwucGRmCisgICAgZG91YmxlIGN5Y2xlX3RpbWU7CisgICAgZG91YmxlIGZlZWRiYWNrMl9mYWN0b3I7CisgICAgZG91YmxlIGZlZWRiYWNrM19mYWN0b3I7CisgICAgZG91YmxlIGNsb2NrX3BlcmlvZDsKKyAgICBpbnQgY291bnQ7Cit9OworCisvKiAxIC0gZXhwKC14KSB1c2luZyBhIDMtb3JkZXIgcG93ZXIgc2VyaWVzICovCitzdGF0aWMgZG91YmxlIHFleHBuZWcoZG91YmxlIHgpCit7CisgICAgcmV0dXJuIDEgLSAxIC8gKDEgKyB4ICogKDEgKyB4IC8gMiAqICgxICsgeCAvIDMpKSk7Cit9CisKK1RpbWVGaWx0ZXIgKmZmX3RpbWVmaWx0ZXJfbmV3KGRvdWJsZSB0aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJhbmR3aWR0aCkKK3sKKyAgICBUaW1lRmlsdGVyICpzZWxmICAgICAgID0gYXZfbWFsbG9jeihzaXplb2YoVGltZUZpbHRlcikpOworICAgIGRvdWJsZSBvICAgICAgICAgICAgICAgPSAyICogTV9QSSAqIGJhbmR3aWR0aCAqIHBlcmlvZCAqIHRpbWVfYmFzZTsKKworICAgIGlmICghc2VsZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzZWxmLT5jbG9ja19wZXJpb2QgICAgID0gdGltZV9iYXNlOworICAgIHNlbGYtPmZlZWRiYWNrMl9mYWN0b3IgPSBxZXhwbmVnKE1fU1FSVDIgKiBvKTsKKyAgICBzZWxmLT5mZWVkYmFjazNfZmFjdG9yID0gcWV4cG5lZyhvICogbykgLyBwZXJpb2Q7CisgICAgcmV0dXJuIHNlbGY7Cit9CisKK3ZvaWQgZmZfdGltZWZpbHRlcl9kZXN0cm95KFRpbWVGaWx0ZXIgKnNlbGYpCit7CisgICAgYXZfZnJlZXAoJnNlbGYpOworfQorCit2b2lkIGZmX3RpbWVmaWx0ZXJfcmVzZXQoVGltZUZpbHRlciAqc2VsZikKK3sKKyAgICBzZWxmLT5jb3VudCA9IDA7Cit9CisKK2RvdWJsZSBmZl90aW1lZmlsdGVyX3VwZGF0ZShUaW1lRmlsdGVyICpzZWxmLCBkb3VibGUgc3lzdGVtX3RpbWUsIGRvdWJsZSBwZXJpb2QpCit7CisgICAgc2VsZi0+Y291bnQrKzsKKyAgICBpZiAoc2VsZi0+Y291bnQgPT0gMSkgeworICAgICAgICBzZWxmLT5jeWNsZV90aW1lID0gc3lzdGVtX3RpbWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZG91YmxlIGxvb3BfZXJyb3I7CisgICAgICAgIHNlbGYtPmN5Y2xlX3RpbWUgKz0gc2VsZi0+Y2xvY2tfcGVyaW9kICogcGVyaW9kOworICAgICAgICBsb29wX2Vycm9yID0gc3lzdGVtX3RpbWUgLSBzZWxmLT5jeWNsZV90aW1lOworCisgICAgICAgIHNlbGYtPmN5Y2xlX3RpbWUgICArPSBGRk1BWChzZWxmLT5mZWVkYmFjazJfZmFjdG9yLCAxLjAgLyBzZWxmLT5jb3VudCkgKiBsb29wX2Vycm9yOworICAgICAgICBzZWxmLT5jbG9ja19wZXJpb2QgKz0gc2VsZi0+ZmVlZGJhY2szX2ZhY3RvciAqIGxvb3BfZXJyb3I7CisgICAgfQorICAgIHJldHVybiBzZWxmLT5jeWNsZV90aW1lOworfQorCitkb3VibGUgZmZfdGltZWZpbHRlcl9ldmFsKFRpbWVGaWx0ZXIgKnNlbGYsIGRvdWJsZSBkZWx0YSkKK3sKKyAgICByZXR1cm4gc2VsZi0+Y3ljbGVfdGltZSArIHNlbGYtPmNsb2NrX3BlcmlvZCAqIGRlbHRhOworfQorCisjaWZkZWYgVEVTVAorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNkZWZpbmUgTEZHX01BWCAoKDFMTCA8PCAzMikgLSAxKQorCitpbnQgbWFpbih2b2lkKQoreworICAgIEFWTEZHIHBybmc7CisgICAgZG91YmxlIG4wLCBuMTsKKyNkZWZpbmUgU0FNUExFUyAxMDAwCisgICAgZG91YmxlIGlkZWFsW1NBTVBMRVNdOworICAgIGRvdWJsZSBzYW1wbGVzW1NBTVBMRVNdOworICAgIGRvdWJsZSBzYW1wbGV0W1NBTVBMRVNdOworICAgIGZvciAobjAgPSAwOyBuMCA8IDQwOyBuMCA9IDIgKiBuMCArIDEpIHsKKyAgICAgICAgZm9yIChuMSA9IDA7IG4xIDwgMTA7IG4xID0gMiAqIG4xICsgMSkgeworICAgICAgICAgICAgZG91YmxlIGJlc3RfZXJyb3IgPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgZG91YmxlIGJlc3RwYXIwICAgPSBuMCA/IDEgOiAxMDAwMDA7CisgICAgICAgICAgICBkb3VibGUgYmVzdHBhcjEgICA9IDE7CisgICAgICAgICAgICBpbnQgYmV0dGVyLCBpOworCisgICAgICAgICAgICBhdl9sZmdfaW5pdCgmcHJuZywgMTIzKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTQU1QTEVTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzYW1wbGV0W2ldID0gMTAgKyBpICsgKGF2X2xmZ19nZXQoJnBybmcpIDwgTEZHX01BWC8yID8gMCA6IDAuOTk5KTsKKyAgICAgICAgICAgICAgICBpZGVhbFtpXSAgID0gc2FtcGxldFtpXSArIG4xICogaSAvICgxMDAwKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldID0gaWRlYWxbaV0gKyBuMCAqIChhdl9sZmdfZ2V0KCZwcm5nKSAtIExGR19NQVggLyAyKSAvIChMRkdfTUFYICogMTBMTCk7CisgICAgICAgICAgICAgICAgaWYoaSAmJiBzYW1wbGVzW2ldPHNhbXBsZXNbaS0xXSkKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1tpXT1zYW1wbGVzW2ktMV0rMC4wMDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcGFyMCwgcGFyMTsKKyAgICAgICAgICAgICAgICBiZXR0ZXIgPSAwOworICAgICAgICAgICAgICAgIGZvciAocGFyMCA9IGJlc3RwYXIwICogMC44OyBwYXIwIDw9IGJlc3RwYXIwICogMS4yMTsgcGFyMCArPSBiZXN0cGFyMCAqIDAuMDUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwYXIxID0gYmVzdHBhcjEgKiAwLjg7IHBhcjEgPD0gYmVzdHBhcjEgKiAxLjIxOyBwYXIxICs9IGJlc3RwYXIxICogMC4wNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGVycm9yICAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgVGltZUZpbHRlciAqdGYgPSBmZl90aW1lZmlsdGVyX25ldygxLCBwYXIwLCBwYXIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRpbWVmaWx0ZXIuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNBTVBMRVM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmaWx0ZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZCA9IGZmX3RpbWVmaWx0ZXJfdXBkYXRlKHRmLCBzYW1wbGVzW2ldLCBpID8gKHNhbXBsZXRbaV0gLSBzYW1wbGV0W2ktMV0pIDogMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlsdGVyZWQgPCAwIHx8IGZpbHRlcmVkID4gMTAwMDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJmaWx0ZXIgaXMgdW5zdGFibGVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yICAgKz0gKGZpbHRlcmVkIC0gaWRlYWxbaV0pICogKGZpbHRlcmVkIC0gaWRlYWxbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmZfdGltZWZpbHRlcl9kZXN0cm95KHRmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RfZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2Vycm9yID0gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHBhcjAgICA9IHBhcjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHBhcjEgICA9IHBhcjE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0dGVyICAgICA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChiZXR0ZXIpOworI2lmIDAKKyAgICAgICAgICAgIGRvdWJsZSBsYXN0ZmlsID0gOTsKKyAgICAgICAgICAgIFRpbWVGaWx0ZXIgKnRmID0gZmZfdGltZWZpbHRlcl9uZXcoMSwgYmVzdHBhcjAsIGJlc3RwYXIxKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTQU1QTEVTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZmlsdGVyZWQ7CisgICAgICAgICAgICAgICAgZmlsdGVyZWQgPSBmZl90aW1lZmlsdGVyX3VwZGF0ZSh0Ziwgc2FtcGxlc1tpXSwgMSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlZiAlZiAlZiAlZlxuIiwgaSAtIHNhbXBsZXNbaV0gKyAxMCwgZmlsdGVyZWQgLSBzYW1wbGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzW0ZGTUFYKGksIDEpXSAtIHNhbXBsZXNbRkZNQVgoaSAtIDEsIDApXSwgZmlsdGVyZWQgLSBsYXN0ZmlsKTsKKyAgICAgICAgICAgICAgICBsYXN0ZmlsID0gZmlsdGVyZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZl90aW1lZmlsdGVyX2Rlc3Ryb3kodGYpOworI2Vsc2UKKyAgICAgICAgICAgIHByaW50ZigiIFslMTJmICUxMWYgJTlmXSIsIGJlc3RwYXIwLCBiZXN0cGFyMSwgYmVzdF9lcnJvcik7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorICAgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvdGltZWZpbHRlci5oIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3RpbWVmaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNkMGE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3RpbWVmaWx0ZXIuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIERlbGF5IExvY2tlZCBMb29wIGJhc2VkIHRpbWUgZmlsdGVyIHByb3RvdHlwZXMgYW5kIGRlY2xhcmF0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDA5IFNhbWFseXNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWljaGFlbCBOaWVkZXJtYXllcgorICogQXV0aG9yOiBPbGl2aWVyIEd1aWx5YXJkaSA8b2xpdmllciBzYW1hbHlzZSBjb20+CisgKiAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaSBnbXggYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZERVZJQ0VfVElNRUZJTFRFUl9ICisjZGVmaW5lIEFWREVWSUNFX1RJTUVGSUxURVJfSAorCisvKioKKyAqIE9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyBhIHRpbWUgZmlsdGVyIHN0YXRlCisgKgorICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmaWx0ZXIgaXMgdG8gcHJvdmlkZSBhIHdheSB0byBjb21wdXRlIGFjY3VyYXRlIHRpbWUKKyAqIHN0YW1wcyB0aGF0IGNhbiBiZSBjb21wYXJlZCB0byB3YWxsIGNsb2NrIHRpbWUsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nCisgKiB3aXRoIHR3byBjbG9ja3M6IHRoZSBzeXN0ZW0gY2xvY2sgYW5kIGEgaGFyZHdhcmUgZGV2aWNlIGNsb2NrLCBzdWNoIGFzCisgKiBhIHNvdW5kY2FyZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgVGltZUZpbHRlciBUaW1lRmlsdGVyOworCisKKy8qKgorICogQ3JlYXRlIGEgbmV3IERlbGF5IExvY2tlZCBMb29wIHRpbWUgZmlsdGVyCisgKgorICogZmVlZGJhY2syX2ZhY3RvciBhbmQgZmVlZGJhY2szX2ZhY3RvciBhcmUgdGhlIGZhY3RvcnMgdXNlZCBmb3IgdGhlCisgKiBtdWx0aXBsaWNhdGlvbnMgdGhhdCBhcmUgcmVzcGVjdGl2ZWx5IHBlcmZvcm1lZCBpbiB0aGUgc2Vjb25kIGFuZCB0aGlyZAorICogZmVlZGJhY2sgcGF0aHMgb2YgdGhlIGxvb3AuCisgKgorICogVW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgeW91IHNob3VsZCBzZXQgdGhlc2UgYXMgZm9sbG93OgorICoKKyAqIG8gPSAyICogTV9QSSAqIGJhbmR3aWR0aCAqIHBlcmlvZF9pbl9zZWNvbmRzCisgKiBmZWVkYmFjazJfZmFjdG9yID0gc3FydCgyKSAqIG8KKyAqIGZlZWRiYWNrM19mYWN0b3IgPSBvICogbworICoKKyAqIFdoZXJlIGJhbmR3aWR0aCBpcyB1cCB0byB5b3UgdG8gY2hvb3NlLiBTbWFsbGVyIHZhbHVlcyB3aWxsIGZpbHRlciBvdXQgbW9yZQorICogb2YgdGhlIGppdHRlciwgYnV0IGFsc28gdGFrZSBhIGxvbmdlciB0aW1lIGZvciB0aGUgbG9vcCB0byBzZXR0bGUuIEEgZ29vZAorICogc3RhcnRpbmcgcG9pbnQgaXMgc29tZXRoaW5nIGJldHdlZW4gMC4zIGFuZCAzIEh6LgorICoKKyAqIEBwYXJhbSB0aW1lX2Jhc2UgICBwZXJpb2Qgb2YgdGhlIGhhcmR3YXJlIGNsb2NrIGluIHNlY29uZHMKKyAqICAgICAgICAgICAgICAgICAgICAoZm9yIGV4YW1wbGUgMS4wLzQ0MTAwKQorICogQHBhcmFtIHBlcmlvZCAgICAgIGV4cGVjdGVkIHVwZGF0ZSBpbnRlcnZhbCwgaW4gaW5wdXQgdW5pdHMKKyAqIEBwYXJhbSBicmFuZHdpZHRoICBmaWx0ZXJpbmcgYmFuZHdpZHRoLCBpbiBIegorICoKKyAqIEByZXR1cm4gYSBwb2ludGVyIHRvIGEgVGltZUZpbHRlciBzdHJ1Y3QsIG9yIE5VTEwgb24gZXJyb3IKKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZXNlIHBhcmFtZXRlcnMgYW5kIGJhY2tncm91bmQgY29uY2VwdHMgcGxlYXNlIHNlZToKKyAqIGh0dHA6Ly93d3cua29ra2luaXppdGEubmV0L3BhcGVycy91c2luZ2RsbC5wZGYKKyAqLworVGltZUZpbHRlciAqIGZmX3RpbWVmaWx0ZXJfbmV3KGRvdWJsZSBjbG9ja19wZXJpb2QsIGRvdWJsZSBmZWVkYmFjazJfZmFjdG9yLCBkb3VibGUgZmVlZGJhY2szX2ZhY3Rvcik7CisKKy8qKgorICogVXBkYXRlIHRoZSBmaWx0ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluIHJlYWwgdGltZSwgYXQgZWFjaCBwcm9jZXNzIGN5Y2xlLgorICoKKyAqIEBwYXJhbSBwZXJpb2QgdGhlIGRldmljZSBjeWNsZSBkdXJhdGlvbiBpbiBjbG9ja19wZXJpb2RzLiBGb3IgZXhhbXBsZSwgYXQKKyAqIDQ0LjFrSHogYW5kIGEgYnVmZmVyIHNpemUgb2YgNTEyIGZyYW1lcywgcGVyaW9kID0gNTEyIHdoZW4gY2xvY2tfcGVyaW9kCisgKiB3YXMgMS4wLzQ0MTAwLCBvciA1MTIvNDQxMDAgaWYgY2xvY2tfcGVyaW9kIHdhcyAxLgorICoKKyAqIHN5c3RlbV90aW1lLCBpbiBzZWNvbmRzLCBzaG91bGQgYmUgdGhlIHZhbHVlIG9mIHRoZSBzeXN0ZW0gY2xvY2sgdGltZSwKKyAqIGF0IChvciBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0bykgdGhlIG1vbWVudCB0aGUgZGV2aWNlIGhhcmR3YXJlIGludGVycnVwdAorICogb2NjdXJyZWQgKG9yIGFueSBvdGhlciBldmVudCB0aGUgZGV2aWNlIGNsb2NrIHJhaXNlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKKyAqIGN5Y2xlKS4KKyAqCisgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCB0aW1lLCBpbiBzZWNvbmRzCisgKi8KK2RvdWJsZSBmZl90aW1lZmlsdGVyX3VwZGF0ZShUaW1lRmlsdGVyICpzZWxmLCBkb3VibGUgc3lzdGVtX3RpbWUsIGRvdWJsZSBwZXJpb2QpOworCisvKioKKyAqIEV2YWx1YXRlIHRoZSBmaWx0ZXIgYXQgYSBzcGVjaWZpZWQgdGltZQorICoKKyAqIEBwYXJhbSBkZWx0YSAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZXF1ZXN0ZWQgdGltZSBhbmQgdGhlIGN1cnJlbnQgdGltZQorICogICAgICAgICAgICAgICAobGFzdCBjYWxsIHRvIGZmX3RpbWVmaWx0ZXJfdXBkYXRlKS4KKyAqIEByZXR1cm4gIHRoZSBmaWx0ZXJlZCB0aW1lCisgKi8KK2RvdWJsZSBmZl90aW1lZmlsdGVyX2V2YWwoVGltZUZpbHRlciAqc2VsZiwgZG91YmxlIGRlbHRhKTsKKworLyoqCisgKiBSZXNldCB0aGUgZmlsdGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbWFpbmx5IGJlIGNhbGxlZCBpbiBjYXNlIG9mIFhSVU4uCisgKgorICogV2FybmluZzogYWZ0ZXIgY2FsbGluZyB0aGlzLCB0aGUgZmlsdGVyIGlzIGluIGFuIHVuZGV0ZXJtaW5lZCBzdGF0ZSB1bnRpbAorICogdGhlIG5leHQgY2FsbCB0byBmZl90aW1lZmlsdGVyX3VwZGF0ZSgpCisgKi8KK3ZvaWQgZmZfdGltZWZpbHRlcl9yZXNldChUaW1lRmlsdGVyICopOworCisvKioKKyAqIEZyZWUgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbHRlcgorICovCit2b2lkIGZmX3RpbWVmaWx0ZXJfZGVzdHJveShUaW1lRmlsdGVyICopOworCisjZW5kaWYgLyogQVZERVZJQ0VfVElNRUZJTFRFUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvdjRsLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvdjRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzZjcxNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS92NGwuYwpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIExpbnV4IHZpZGVvIGdyYWIgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKKyN1bmRlZiBfX1NUUklDVF9BTlNJX18gLy93b3JrYXJvdW5kIGR1ZSB0byBicm9rZW4ga2VybmVsIGhlYWRlcnMKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmF0aW9uYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9kc3B1dGlsLmgiCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZGVmaW5lIF9MSU5VWF9USU1FX0ggMQorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IGZkOworICAgIGludCBmcmFtZV9mb3JtYXQ7IC8qIHNlZSBWSURFT19QQUxFVFRFX3h4eCAqLworICAgIGludCB1c2VfbW1hcDsKKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsKKyAgICBpbnQ2NF90IHRpbWVfZnJhbWU7CisgICAgaW50IGZyYW1lX3NpemU7CisgICAgc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgdmlkZW9fY2FwOworICAgIHN0cnVjdCB2aWRlb19hdWRpbyBhdWRpb19zYXZlZDsKKyAgICBzdHJ1Y3QgdmlkZW9fd2luZG93IHZpZGVvX3dpbjsKKyAgICB1aW50OF90ICp2aWRlb19idWY7CisgICAgc3RydWN0IHZpZGVvX21idWYgZ2JfYnVmZmVyczsKKyAgICBzdHJ1Y3QgdmlkZW9fbW1hcCBnYl9idWY7CisgICAgaW50IGdiX2ZyYW1lOworICAgIGludCBzdGFuZGFyZDsKK30gVmlkZW9EYXRhOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBpbnQgcGFsZXR0ZTsKKyAgICBpbnQgZGVwdGg7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7Cit9IHZpZGVvX2Zvcm1hdHMgW10gPSB7CisgICAgey5wYWxldHRlID0gVklERU9fUEFMRVRURV9ZVVY0MjBQLCAuZGVwdGggPSAxMiwgLnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAgfSwKKyAgICB7LnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1lVVjQyMiwgIC5kZXB0aCA9IDE2LCAucGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVZVjQyMiB9LAorICAgIHsucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfVVlWWSwgICAgLmRlcHRoID0gMTYsIC5waXhfZm10ID0gQVZfUElYX0ZNVF9VWVZZNDIyIH0sCisgICAgey5wYWxldHRlID0gVklERU9fUEFMRVRURV9ZVVlWLCAgICAuZGVwdGggPSAxNiwgLnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVWVY0MjIgfSwKKyAgICAvKiBOT1RFOiB2NGwgdXNlcyBCR1IyNCwgbm90IFJHQjI0ICovCisgICAgey5wYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IyNCwgICAuZGVwdGggPSAyNCwgLnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjI0ICAgfSwKKyAgICB7LnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JHQjU2NSwgIC5kZXB0aCA9IDE2LCAucGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSNTY1ICB9LAorICAgIHsucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfR1JFWSwgICAgLmRlcHRoID0gOCwgIC5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZOCAgIH0sCit9OworCisKK3N0YXRpYyBpbnQgZ3JhYl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMxLCBBVkZvcm1hdFBhcmFtZXRlcnMgKmFwKQoreworICAgIFZpZGVvRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCB2aWRlb19mZDsKKyAgICBpbnQgZGVzaXJlZF9wYWxldHRlLCBkZXNpcmVkX2RlcHRoOworICAgIHN0cnVjdCB2aWRlb190dW5lciB0dW5lcjsKKyAgICBzdHJ1Y3QgdmlkZW9fYXVkaW8gYXVkaW87CisgICAgc3RydWN0IHZpZGVvX3BpY3R1cmUgcGljdDsKKyAgICBpbnQgajsKKyAgICBpbnQgdmZvcm1hdF9udW0gPSBGRl9BUlJBWV9FTEVNUyh2aWRlb19mb3JtYXRzKTsKKworICAgIGF2X2xvZyhzMSwgQVZfTE9HX1dBUk5JTkcsICJWNEwgaW5wdXQgZGV2aWNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiIpOworCisgICAgaWYgKGFwLT50aW1lX2Jhc2UuZGVuIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJXcm9uZyB0aW1lIGJhc2UgKCVkKVxuIiwgYXAtPnRpbWVfYmFzZS5kZW4pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHMtPnRpbWVfYmFzZSA9IGFwLT50aW1lX2Jhc2U7CisKKyAgICBzLT52aWRlb193aW4ud2lkdGggPSBhcC0+d2lkdGg7CisgICAgcy0+dmlkZW9fd2luLmhlaWdodCA9IGFwLT5oZWlnaHQ7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oczEsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOyAvKiA2NCBiaXRzIHB0cyBpbiB1cyAqLworCisgICAgdmlkZW9fZmQgPSBvcGVuKHMxLT5maWxlbmFtZSwgT19SRFdSKTsKKyAgICBpZiAodmlkZW9fZmQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiJXM6ICVzXG4iLCBzMS0+ZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoaW9jdGwodmlkZW9fZmQsIFZJRElPQ0dDQVAsICZzLT52aWRlb19jYXApIDwgMCkgeworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIlZJRElPQ0dDQVA6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKCEocy0+dmlkZW9fY2FwLnR5cGUgJiBWSURfVFlQRV9DQVBUVVJFKSkgeworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIkZhdGFsOiBncmFiIGRldmljZSBkb2VzIG5vdCBoYW5kbGUgY2FwdHVyZVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiBubyB2YWx1ZXMgc2V0LCBhdXRvZGV0ZWN0IHRoZW0gKi8KKyAgICBpZiAocy0+dmlkZW9fd2luLndpZHRoIDw9IDAgfHwgcy0+dmlkZW9fd2luLmhlaWdodCA8PSAwKSB7CisgICAgICAgIGlmIChpb2N0bCh2aWRlb19mZCwgVklESU9DR1dJTiwgJnMtPnZpZGVvX3dpbiwgc2l6ZW9mKHMtPnZpZGVvX3dpbikpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJWSURJT0NHV0lOOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGF2X2ltYWdlX2NoZWNrX3NpemUocy0+dmlkZW9fd2luLndpZHRoLCBzLT52aWRlb193aW4uaGVpZ2h0LCAwLCBzMSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBkZXNpcmVkX3BhbGV0dGUgPSAtMTsKKyAgICBkZXNpcmVkX2RlcHRoID0gLTE7CisgICAgZm9yIChqID0gMDsgaiA8IHZmb3JtYXRfbnVtOyBqKyspIHsKKyAgICAgICAgaWYgKGFwLT5waXhfZm10ID09IHZpZGVvX2Zvcm1hdHNbal0ucGl4X2ZtdCkgeworICAgICAgICAgICAgZGVzaXJlZF9wYWxldHRlID0gdmlkZW9fZm9ybWF0c1tqXS5wYWxldHRlOworICAgICAgICAgICAgZGVzaXJlZF9kZXB0aCA9IHZpZGVvX2Zvcm1hdHNbal0uZGVwdGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNldCB0diBzdGFuZGFyZCAqLworICAgIGlmICghaW9jdGwodmlkZW9fZmQsIFZJRElPQ0dUVU5FUiwgJnR1bmVyKSkgeworICAgICAgICB0dW5lci5tb2RlID0gcy0+c3RhbmRhcmQ7CisgICAgICAgIGlvY3RsKHZpZGVvX2ZkLCBWSURJT0NTVFVORVIsICZ0dW5lcik7CisgICAgfQorCisgICAgLyogdW5tdXRlIGF1ZGlvICovCisgICAgYXVkaW8uYXVkaW8gPSAwOworICAgIGlvY3RsKHZpZGVvX2ZkLCBWSURJT0NHQVVESU8sICZhdWRpbyk7CisgICAgbWVtY3B5KCZzLT5hdWRpb19zYXZlZCwgJmF1ZGlvLCBzaXplb2YoYXVkaW8pKTsKKyAgICBhdWRpby5mbGFncyAmPSB+VklERU9fQVVESU9fTVVURTsKKyAgICBpb2N0bCh2aWRlb19mZCwgVklESU9DU0FVRElPLCAmYXVkaW8pOworCisgICAgaW9jdGwodmlkZW9fZmQsIFZJRElPQ0dQSUNULCAmcGljdCk7CisgICAgYXZfZGxvZyhzMSwgInY0bDogY29sb3VyPSVkIGh1ZT0lZCBicmlnaHRuZXNzPSVkIGNvbnN0cmFzdD0lZCB3aGl0ZW5lc3M9JWRcbiIsCisgICAgICAgICAgICBwaWN0LmNvbG91ciwgcGljdC5odWUsIHBpY3QuYnJpZ2h0bmVzcywgcGljdC5jb250cmFzdCwgcGljdC53aGl0ZW5lc3MpOworICAgIC8qIHRyeSB0byBjaG9vc2UgYSBzdWl0YWJsZSB2aWRlbyBmb3JtYXQgKi8KKyAgICBwaWN0LnBhbGV0dGUgPSBkZXNpcmVkX3BhbGV0dGU7CisgICAgcGljdC5kZXB0aD0gZGVzaXJlZF9kZXB0aDsKKyAgICBpZiAoZGVzaXJlZF9wYWxldHRlID09IC0xIHx8IGlvY3RsKHZpZGVvX2ZkLCBWSURJT0NTUElDVCwgJnBpY3QpIDwgMCkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdmZvcm1hdF9udW07IGorKykgeworICAgICAgICAgICAgcGljdC5wYWxldHRlID0gdmlkZW9fZm9ybWF0c1tqXS5wYWxldHRlOworICAgICAgICAgICAgcGljdC5kZXB0aCA9IHZpZGVvX2Zvcm1hdHNbal0uZGVwdGg7CisgICAgICAgICAgICBpZiAoLTEgIT0gaW9jdGwodmlkZW9fZmQsIFZJRElPQ1NQSUNULCAmcGljdCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPj0gdmZvcm1hdF9udW0pCisgICAgICAgICAgICBnb3RvIGZhaWwxOworICAgIH0KKworICAgIGlmIChpb2N0bCh2aWRlb19mZCwgVklESU9DR01CVUYsICZzLT5nYl9idWZmZXJzKSA8IDApIHsKKyAgICAgICAgLyogdHJ5IHRvIHVzZSByZWFkIGJhc2VkIGFjY2VzcyAqLworICAgICAgICBpbnQgdmFsOworCisgICAgICAgIHMtPnZpZGVvX3dpbi54ID0gMDsKKyAgICAgICAgcy0+dmlkZW9fd2luLnkgPSAwOworICAgICAgICBzLT52aWRlb193aW4uY2hyb21ha2V5ID0gLTE7CisgICAgICAgIHMtPnZpZGVvX3dpbi5mbGFncyA9IDA7CisKKyAgICAgICAgaWYgKGlvY3RsKHZpZGVvX2ZkLCBWSURJT0NTV0lOLCBzLT52aWRlb193aW4pIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJWSURJT0NTV0lOOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmZyYW1lX2Zvcm1hdCA9IHBpY3QucGFsZXR0ZTsKKworICAgICAgICB2YWwgPSAxOworICAgICAgICBpZiAoaW9jdGwodmlkZW9fZmQsIFZJRElPQ0NBUFRVUkUsICZ2YWwpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJWSURJT0NDQVBUVVJFOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHMtPnRpbWVfZnJhbWUgPSBhdl9nZXR0aW1lKCkgKiBzLT50aW1lX2Jhc2UuZGVuIC8gcy0+dGltZV9iYXNlLm51bTsKKyAgICAgICAgcy0+dXNlX21tYXAgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPnZpZGVvX2J1ZiA9IG1tYXAoMCwgcy0+Z2JfYnVmZmVycy5zaXplLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgdmlkZW9fZmQsIDApOworICAgICAgICBpZiAoKHVuc2lnbmVkIGNoYXIqKS0xID09IHMtPnZpZGVvX2J1ZikgeworICAgICAgICAgICAgcy0+dmlkZW9fYnVmID0gbW1hcCgwLCBzLT5nYl9idWZmZXJzLnNpemUsIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwgdmlkZW9fZmQsIDApOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCBjaGFyKiktMSA9PSBzLT52aWRlb19idWYpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIm1tYXA6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzLT5nYl9mcmFtZSA9IDA7CisgICAgICAgIHMtPnRpbWVfZnJhbWUgPSBhdl9nZXR0aW1lKCkgKiBzLT50aW1lX2Jhc2UuZGVuIC8gcy0+dGltZV9iYXNlLm51bTsKKworICAgICAgICAvKiBzdGFydCB0byBncmFiIHRoZSBmaXJzdCBmcmFtZSAqLworICAgICAgICBzLT5nYl9idWYuZnJhbWUgPSBzLT5nYl9mcmFtZSAlIHMtPmdiX2J1ZmZlcnMuZnJhbWVzOworICAgICAgICBzLT5nYl9idWYuaGVpZ2h0ID0gcy0+dmlkZW9fd2luLmhlaWdodDsKKyAgICAgICAgcy0+Z2JfYnVmLndpZHRoID0gcy0+dmlkZW9fd2luLndpZHRoOworICAgICAgICBzLT5nYl9idWYuZm9ybWF0ID0gcGljdC5wYWxldHRlOworCisgICAgICAgIGlmIChpb2N0bCh2aWRlb19mZCwgVklESU9DTUNBUFRVUkUsICZzLT5nYl9idWYpIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vICE9IEVBR0FJTikgeworICAgICAgICAgICAgZmFpbDE6CisgICAgICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJWSURJT0NNQ0FQVFVSRTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiRmF0YWw6IGdyYWIgZGV2aWNlIGRvZXMgbm90IHJlY2VpdmUgYW55IHZpZGVvIHNpZ25hbFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMTsgaiA8IHMtPmdiX2J1ZmZlcnMuZnJhbWVzOyBqKyspIHsKKyAgICAgICAgICBzLT5nYl9idWYuZnJhbWUgPSBqOworICAgICAgICAgIGlvY3RsKHZpZGVvX2ZkLCBWSURJT0NNQ0FQVFVSRSwgJnMtPmdiX2J1Zik7CisgICAgICAgIH0KKyAgICAgICAgcy0+ZnJhbWVfZm9ybWF0ID0gcy0+Z2JfYnVmLmZvcm1hdDsKKyAgICAgICAgcy0+dXNlX21tYXAgPSAxOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCB2Zm9ybWF0X251bTsgaisrKSB7CisgICAgICAgIGlmIChzLT5mcmFtZV9mb3JtYXQgPT0gdmlkZW9fZm9ybWF0c1tqXS5wYWxldHRlKSB7CisgICAgICAgICAgICBzLT5mcmFtZV9zaXplID0gcy0+dmlkZW9fd2luLndpZHRoICogcy0+dmlkZW9fd2luLmhlaWdodCAqIHZpZGVvX2Zvcm1hdHNbal0uZGVwdGggLyA4OworICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gdmlkZW9fZm9ybWF0c1tqXS5waXhfZm10OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaiA+PSB2Zm9ybWF0X251bSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcy0+ZmQgPSB2aWRlb19mZDsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgc3QtPmNvZGVjLT53aWR0aCA9IHMtPnZpZGVvX3dpbi53aWR0aDsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHMtPnZpZGVvX3dpbi5oZWlnaHQ7CisgICAgc3QtPmNvZGVjLT50aW1lX2Jhc2UgPSBzLT50aW1lX2Jhc2U7CisgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHMtPmZyYW1lX3NpemUgKiAxL2F2X3EyZChzdC0+Y29kZWMtPnRpbWVfYmFzZSkgKiA4OworCisgICAgcmV0dXJuIDA7CisgZmFpbDoKKyAgICBpZiAodmlkZW9fZmQgPj0gMCkKKyAgICAgICAgY2xvc2UodmlkZW9fZmQpOworICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Cit9CisKK3N0YXRpYyBpbnQgdjRsX21tX3JlYWRfcGljdHVyZShWaWRlb0RhdGEgKnMsIHVpbnQ4X3QgKmJ1ZikKK3sKKyAgICB1aW50OF90ICpwdHI7CisKKyAgICB3aGlsZSAoaW9jdGwocy0+ZmQsIFZJRElPQ1NZTkMsICZzLT5nYl9mcmFtZSkgPCAwICYmCisgICAgICAgICAgIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIpKTsKKworICAgIHB0ciA9IHMtPnZpZGVvX2J1ZiArIHMtPmdiX2J1ZmZlcnMub2Zmc2V0c1tzLT5nYl9mcmFtZV07CisgICAgbWVtY3B5KGJ1ZiwgcHRyLCBzLT5mcmFtZV9zaXplKTsKKworICAgIC8qIFNldHVwIHRvIGNhcHR1cmUgdGhlIG5leHQgZnJhbWUgKi8KKyAgICBzLT5nYl9idWYuZnJhbWUgPSBzLT5nYl9mcmFtZTsKKyAgICBpZiAoaW9jdGwocy0+ZmQsIFZJRElPQ01DQVBUVVJFLCAmcy0+Z2JfYnVmKSA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTikKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgU3luY1xuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJWSURJT0NNQ0FQVFVSRTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgLyogVGhpcyBpcyBub3cgdGhlIGdyYWJiaW5nIGZyYW1lICovCisgICAgcy0+Z2JfZnJhbWUgPSAocy0+Z2JfZnJhbWUgKyAxKSAlIHMtPmdiX2J1ZmZlcnMuZnJhbWVzOworCisgICAgcmV0dXJuIHMtPmZyYW1lX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgZ3JhYl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMxLCBBVlBhY2tldCAqcGt0KQoreworICAgIFZpZGVvRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBjdXJ0aW1lLCBkZWxheTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHRpbWUgb2YgdGhlIG5leHQgZnJhbWUgKi8KKyAgICBzLT50aW1lX2ZyYW1lICs9IElOVDY0X0MoMTAwMDAwMCk7CisKKyAgICAvKiB3YWl0IGJhc2VkIG9uIHRoZSBmcmFtZSByYXRlICovCisgICAgZm9yKDs7KSB7CisgICAgICAgIGN1cnRpbWUgPSBhdl9nZXR0aW1lKCk7CisgICAgICAgIGRlbGF5ID0gcy0+dGltZV9mcmFtZSAqIHMtPnRpbWVfYmFzZS5udW0gLyBzLT50aW1lX2Jhc2UuZGVuIC0gY3VydGltZTsKKyAgICAgICAgaWYgKGRlbGF5IDw9IDApIHsKKyAgICAgICAgICAgIGlmIChkZWxheSA8IElOVDY0X0MoLTEwMDAwMDApICogcy0+dGltZV9iYXNlLm51bSAvIHMtPnRpbWVfYmFzZS5kZW4pIHsKKyAgICAgICAgICAgICAgICAvKiBwcmludGYoImdyYWJiaW5nIGlzICVkIGZyYW1lcyBsYXRlIChkcm9wcGluZylcbiIsIChpbnQpIC0oZGVsYXkgLyAxNjY2NikpOyAqLworICAgICAgICAgICAgICAgIHMtPnRpbWVfZnJhbWUgKz0gSU5UNjRfQygxMDAwMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRzLnR2X3NlYyA9IGRlbGF5IC8gMTAwMDAwMDsKKyAgICAgICAgdHMudHZfbnNlYyA9IChkZWxheSAlIDEwMDAwMDApICogMTAwMDsKKyAgICAgICAgbmFub3NsZWVwKCZ0cywgTlVMTCk7CisgICAgfQorCisgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBzLT5mcmFtZV9zaXplKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBwa3QtPnB0cyA9IGN1cnRpbWU7CisKKyAgICAvKiByZWFkIG9uZSBmcmFtZSAqLworICAgIGlmIChzLT51c2VfbW1hcCkgeworICAgICAgICByZXR1cm4gdjRsX21tX3JlYWRfcGljdHVyZShzLCBwa3QtPmRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyZWFkKHMtPmZkLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSkgIT0gcGt0LT5zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgcmV0dXJuIHMtPmZyYW1lX3NpemU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGdyYWJfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMxKQoreworICAgIFZpZGVvRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CisKKyAgICBpZiAocy0+dXNlX21tYXApCisgICAgICAgIG11bm1hcChzLT52aWRlb19idWYsIHMtPmdiX2J1ZmZlcnMuc2l6ZSk7CisKKyAgICAvKiBtdXRlIGF1ZGlvLiB3ZSBtdXN0IGZvcmNlIGl0IGJlY2F1c2UgdGhlIEJUVFYgZHJpdmVyIGRvZXMgbm90CisgICAgICAgcmV0dXJuIGl0cyBzdGF0ZSBjb3JyZWN0bHkgKi8KKyAgICBzLT5hdWRpb19zYXZlZC5mbGFncyB8PSBWSURFT19BVURJT19NVVRFOworICAgIGlvY3RsKHMtPmZkLCBWSURJT0NTQVVESU8sICZzLT5hdWRpb19zYXZlZCk7CisKKyAgICBjbG9zZShzLT5mZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAic3RhbmRhcmQiLCAiIiwgb2Zmc2V0b2YoVmlkZW9EYXRhLCBzdGFuZGFyZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBWSURFT19NT0RFX05UU0N9LCBWSURFT19NT0RFX1BBTCwgVklERU9fTU9ERV9OVFNDLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgInN0YW5kYXJkIiB9LAorICAgIHsgIlBBTCIsICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFZJREVPX01PREVfUEFMfSwgICAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgInN0YW5kYXJkIiB9LAorICAgIHsgIlNFQ0FNIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFZJREVPX01PREVfU0VDQU19LCAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgInN0YW5kYXJkIiB9LAorICAgIHsgIk5UU0MiLCAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFZJREVPX01PREVfTlRTQ30sICAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgInN0YW5kYXJkIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgdjRsX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlY0TCBpbmRldiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfVklERU9fSU5QVVQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX3Y0bF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2aWRlbzRsaW51eCx2NGwiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWaWRlbzRMaW51eCBkZXZpY2UgZ3JhYiIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWaWRlb0RhdGEpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGdyYWJfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZ3JhYl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBncmFiX3JlYWRfY2xvc2UsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ2NGxfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL3Y0bDItY29tbW9uLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvdjRsMi1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTZjMDliCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3Y0bDItY29tbW9uLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInY0bDItY29tbW9uLmgiCisKK2NvbnN0IHN0cnVjdCBmbXRfbWFwIGZmX2ZtdF9jb252ZXJzaW9uX3RhYmxlW10gPSB7CisgICAgLy9mZl9mbXQgICAgICAgICAgICAgIGNvZGVjX2lkICAgICAgICAgICAgICB2NGwyX2ZtdAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9DT0RFQ19JRF9SQVdWSURFTywgVjRMMl9QSVhfRk1UX1lVVjQyMCAgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfQ09ERUNfSURfUkFXVklERU8sIFY0TDJfUElYX0ZNVF9ZVlU0MjAgIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX0NPREVDX0lEX1JBV1ZJREVPLCBWNEwyX1BJWF9GTVRfWVVWNDIyUCB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVlWNDIyLCBBVl9DT0RFQ19JRF9SQVdWSURFTywgVjRMMl9QSVhfRk1UX1lVWVYgICAgfSwKKyAgICB7IEFWX1BJWF9GTVRfVVlWWTQyMiwgQVZfQ09ERUNfSURfUkFXVklERU8sIFY0TDJfUElYX0ZNVF9VWVZZICAgIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX0NPREVDX0lEX1JBV1ZJREVPLCBWNEwyX1BJWF9GTVRfWVVWNDExUCB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MTBQLCBBVl9DT0RFQ19JRF9SQVdWSURFTywgVjRMMl9QSVhfRk1UX1lVVjQxMCAgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDEwUCwgQVZfQ09ERUNfSURfUkFXVklERU8sIFY0TDJfUElYX0ZNVF9ZVlU0MTAgIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjU1NUxFLEFWX0NPREVDX0lEX1JBV1ZJREVPLCBWNEwyX1BJWF9GTVRfUkdCNTU1ICB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NTVCRSxBVl9DT0RFQ19JRF9SQVdWSURFTywgVjRMMl9QSVhfRk1UX1JHQjU1NVggfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCNTY1TEUsQVZfQ09ERUNfSURfUkFXVklERU8sIFY0TDJfUElYX0ZNVF9SR0I1NjUgIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjU2NUJFLEFWX0NPREVDX0lEX1JBV1ZJREVPLCBWNEwyX1BJWF9GTVRfUkdCNTY1WCB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1IyNCwgICBBVl9DT0RFQ19JRF9SQVdWSURFTywgVjRMMl9QSVhfRk1UX0JHUjI0ICAgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCMjQsICAgQVZfQ09ERUNfSURfUkFXVklERU8sIFY0TDJfUElYX0ZNVF9SR0IyNCAgIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjAsICAgIEFWX0NPREVDX0lEX1JBV1ZJREVPLCBWNEwyX1BJWF9GTVRfQkdSMzIgICB9LAorICAgIHsgQVZfUElYX0ZNVF8wUkdCLCAgICBBVl9DT0RFQ19JRF9SQVdWSURFTywgVjRMMl9QSVhfRk1UX1JHQjMyICAgfSwKKyAgICB7IEFWX1BJWF9GTVRfR1JBWTgsICAgQVZfQ09ERUNfSURfUkFXVklERU8sIFY0TDJfUElYX0ZNVF9HUkVZICAgIH0sCisjaWZkZWYgVjRMMl9QSVhfRk1UX1kxNgorICAgIHsgQVZfUElYX0ZNVF9HUkFZMTZMRSxBVl9DT0RFQ19JRF9SQVdWSURFTywgVjRMMl9QSVhfRk1UX1kxNiAgICAgfSwKKyNlbmRpZgorICAgIHsgQVZfUElYX0ZNVF9OVjEyLCAgICBBVl9DT0RFQ19JRF9SQVdWSURFTywgVjRMMl9QSVhfRk1UX05WMTIgICAgfSwKKyAgICB7IEFWX1BJWF9GTVRfTk9ORSwgICAgQVZfQ09ERUNfSURfTUpQRUcsICAgIFY0TDJfUElYX0ZNVF9NSlBFRyAgIH0sCisgICAgeyBBVl9QSVhfRk1UX05PTkUsICAgIEFWX0NPREVDX0lEX01KUEVHLCAgICBWNEwyX1BJWF9GTVRfSlBFRyAgICB9LAorI2lmZGVmIFY0TDJfUElYX0ZNVF9IMjY0CisgICAgeyBBVl9QSVhfRk1UX05PTkUsICAgIEFWX0NPREVDX0lEX0gyNjQsICAgICBWNEwyX1BJWF9GTVRfSDI2NCAgICB9LAorI2VuZGlmCisjaWZkZWYgVjRMMl9QSVhfRk1UX01QRUc0CisgICAgeyBBVl9QSVhfRk1UX05PTkUsICAgIEFWX0NPREVDX0lEX01QRUc0LCAgICBWNEwyX1BJWF9GTVRfTVBFRzQgICB9LAorI2VuZGlmCisjaWZkZWYgVjRMMl9QSVhfRk1UX0NQSUExCisgICAgeyBBVl9QSVhfRk1UX05PTkUsICAgIEFWX0NPREVDX0lEX0NQSUEsICAgICBWNEwyX1BJWF9GTVRfQ1BJQTEgICB9LAorI2VuZGlmCisjaWZkZWYgVjRMMl9QSVhfRk1UX1NSR0dCOAorICAgIHsgQVZfUElYX0ZNVF9CQVlFUl9CR0dSOCwgQVZfQ09ERUNfSURfUkFXVklERU8sIFY0TDJfUElYX0ZNVF9TQkdHUjggfSwKKyAgICB7IEFWX1BJWF9GTVRfQkFZRVJfR0JSRzgsIEFWX0NPREVDX0lEX1JBV1ZJREVPLCBWNEwyX1BJWF9GTVRfU0dCUkc4IH0sCisgICAgeyBBVl9QSVhfRk1UX0JBWUVSX0dSQkc4LCBBVl9DT0RFQ19JRF9SQVdWSURFTywgVjRMMl9QSVhfRk1UX1NHUkJHOCB9LAorICAgIHsgQVZfUElYX0ZNVF9CQVlFUl9SR0dCOCwgQVZfQ09ERUNfSURfUkFXVklERU8sIFY0TDJfUElYX0ZNVF9TUkdHQjggfSwKKyNlbmRpZgorICAgIHsgQVZfUElYX0ZNVF9OT05FLCAgICBBVl9DT0RFQ19JRF9OT05FLCAgICAgMCAgICAgICAgICAgICAgICAgICAgfSwKK307CisKK3VpbnQzMl90IGZmX2ZtdF9mZjJ2NGwoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgZmZfZm10X2NvbnZlcnNpb25fdGFibGVbaV0uY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORTsgaSsrKSB7CisgICAgICAgIGlmICgoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSB8fAorICAgICAgICAgICAgIGZmX2ZtdF9jb252ZXJzaW9uX3RhYmxlW2ldLmNvZGVjX2lkID09IGNvZGVjX2lkKSAmJgorICAgICAgICAgICAgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FIHx8CisgICAgICAgICAgICAgZmZfZm10X2NvbnZlcnNpb25fdGFibGVbaV0uZmZfZm10ID09IHBpeF9mbXQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmZfZm10X2NvbnZlcnNpb25fdGFibGVbaV0udjRsMl9mbXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworZW51bSBBVlBpeGVsRm9ybWF0IGZmX2ZtdF92NGwyZmYodWludDMyX3QgdjRsMl9mbXQsIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgZmZfZm10X2NvbnZlcnNpb25fdGFibGVbaV0uY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORTsgaSsrKSB7CisgICAgICAgIGlmIChmZl9mbXRfY29udmVyc2lvbl90YWJsZVtpXS52NGwyX2ZtdCA9PSB2NGwyX2ZtdCAmJgorICAgICAgICAgICAgZmZfZm10X2NvbnZlcnNpb25fdGFibGVbaV0uY29kZWNfaWQgPT0gY29kZWNfaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBmZl9mbXRfY29udmVyc2lvbl90YWJsZVtpXS5mZl9mbXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQVZfUElYX0ZNVF9OT05FOworfQorCitlbnVtIEFWQ29kZWNJRCBmZl9mbXRfdjRsMmNvZGVjKHVpbnQzMl90IHY0bDJfZm10KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgZmZfZm10X2NvbnZlcnNpb25fdGFibGVbaV0uY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORTsgaSsrKSB7CisgICAgICAgIGlmIChmZl9mbXRfY29udmVyc2lvbl90YWJsZVtpXS52NGwyX2ZtdCA9PSB2NGwyX2ZtdCkgeworICAgICAgICAgICAgcmV0dXJuIGZmX2ZtdF9jb252ZXJzaW9uX3RhYmxlW2ldLmNvZGVjX2lkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEFWX0NPREVDX0lEX05PTkU7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UvdjRsMi1jb21tb24uaCBiL2ZmbXBlZy9saWJhdmRldmljZS92NGwyLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzcxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvdjRsMi1jb21tb24uaApAQCAtMCwwICsxLDYyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZERVZJQ0VfVjRMMl9DT01NT05fSAorI2RlZmluZSBBVkRFVklDRV9WNEwyX0NPTU1PTl9ICisKKyN1bmRlZiBfX1NUUklDVF9BTlNJX18gLy93b3JrYXJvdW5kIGR1ZSB0byBicm9rZW4ga2VybmVsIGhlYWRlcnMKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2lmIEhBVkVfU1lTX1ZJREVPSU9fSAorI2luY2x1ZGUgPHN5cy92aWRlb2lvLmg+CisjZWxzZQorI2lmIEhBVkVfQVNNX1RZUEVTX0gKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2VuZGlmCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0b21pYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZkZXZpY2UuaCIKKyNpbmNsdWRlICJ0aW1lZmlsdGVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisKK3N0cnVjdCBmbXRfbWFwIHsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfZm10OworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkOworICAgIHVpbnQzMl90IHY0bDJfZm10OworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbXRfbWFwIGZmX2ZtdF9jb252ZXJzaW9uX3RhYmxlW107CisKK3VpbnQzMl90IGZmX2ZtdF9mZjJ2NGwoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKTsKK2VudW0gQVZQaXhlbEZvcm1hdCBmZl9mbXRfdjRsMmZmKHVpbnQzMl90IHY0bDJfZm10LCBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCk7CitlbnVtIEFWQ29kZWNJRCBmZl9mbXRfdjRsMmNvZGVjKHVpbnQzMl90IHY0bDJfZm10KTsKKworI2VuZGlmIC8qIEFWREVWSUNFX1Y0TDJfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS92NGwyLmMgYi9mZm1wZWcvbGliYXZkZXZpY2UvdjRsMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTU2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZkZXZpY2UvdjRsMi5jCkBAIC0wLDAgKzEsMTA1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA2IEx1Y2EgQWJlbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVmlkZW80TGludXgyIGdyYWIgaW50ZXJmYWNlCisgKgorICogUGFydCBvZiB0aGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIFY0TDIgdmlkZW8gY2FwdHVyZSBleGFtcGxlCisgKiAoaHR0cDovL2xpbnV4dHYub3JnL2Rvd25sb2Fkcy92NGwtZHZiLWFwaXMvY2FwdHVyZS1leGFtcGxlLmh0bWwpCisgKgorICogVGhhbmtzIHRvIE1pY2hhZWwgTmllZGVybWF5ZXIgZm9yIHByb3ZpZGluZyB0aGUgbWFwcGluZyBiZXR3ZWVuCisgKiBWNEwyX1BJWF9GTVRfKiBhbmQgQVZfUElYX0ZNVF8qCisgKi8KKworI2luY2x1ZGUgInY0bDItY29tbW9uLmgiCisKKyNpZiBDT05GSUdfTElCVjRMMgorI2luY2x1ZGUgPGxpYnY0bDIuaD4KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgaW50IGRlc2lyZWRfdmlkZW9fYnVmZmVycyA9IDI1NjsKKworI2RlZmluZSBWNExfQUxMRk9STUFUUyAgMworI2RlZmluZSBWNExfUkFXRk9STUFUUyAgMQorI2RlZmluZSBWNExfQ09NUEZPUk1BVFMgMgorCisvKioKKyAqIFJldHVybiB0aW1lc3RhbXBzIHRvIHRoZSB1c2VyIGV4YWN0bHkgYXMgcmV0dXJuZWQgYnkgdGhlIGtlcm5lbAorICovCisjZGVmaW5lIFY0TF9UU19ERUZBVUxUICAwCisvKioKKyAqIEF1dG9kZXRlY3QgdGhlIGtpbmQgb2YgdGltZXN0YW1wcyByZXR1cm5lZCBieSB0aGUga2VybmVsIGFuZCBjb252ZXJ0IHRvCisgKiBhYnNvbHV0ZSAod2FsbCBjbG9jaykgdGltZXN0YW1wcy4KKyAqLworI2RlZmluZSBWNExfVFNfQUJTICAgICAgMQorLyoqCisgKiBBc3N1bWUga2VybmVsIHRpbWVzdGFtcHMgYXJlIGZyb20gdGhlIG1vbm90b25pYyBjbG9jayBhbmQgY29udmVydCB0bworICogYWJzb2x1dGUgdGltZXN0YW1wcy4KKyAqLworI2RlZmluZSBWNExfVFNfTU9OTzJBQlMgMgorCisvKioKKyAqIE9uY2UgdGhlIGtpbmQgb2YgdGltZXN0YW1wcyByZXR1cm5lZCBieSB0aGUga2VybmVsIGhhdmUgYmVlbiBkZXRlY3RlZCwKKyAqIHRoZSB2YWx1ZSBvZiB0aGUgdGltZWZpbHRlciAoTlVMTCBvciBub3QpIGRldGVybWluZXMgd2hldGhlciBhIGNvbnZlcnNpb24KKyAqIHRha2VzIHBsYWNlLgorICovCisjZGVmaW5lIFY0TF9UU19DT05WRVJUX1JFQURZIFY0TF9UU19ERUZBVUxUCisKK3N0cnVjdCB2aWRlb19kYXRhIHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgZmQ7CisgICAgaW50IHBpeGVsZm9ybWF0OyAvKiBWNEwyX1BJWF9GTVRfKiAqLworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBmcmFtZV9zaXplOworICAgIGludCBpbnRlcmxhY2VkOworICAgIGludCB0b3BfZmllbGRfZmlyc3Q7CisgICAgaW50IHRzX21vZGU7CisgICAgVGltZUZpbHRlciAqdGltZWZpbHRlcjsKKyAgICBpbnQ2NF90IGxhc3RfdGltZV9tOworCisgICAgaW50IGJ1ZmZlcnM7CisgICAgdm9sYXRpbGUgaW50IGJ1ZmZlcnNfcXVldWVkOworICAgIHZvaWQgKipidWZfc3RhcnQ7CisgICAgdW5zaWduZWQgaW50ICpidWZfbGVuOworICAgIGNoYXIgKnN0YW5kYXJkOworICAgIHY0bDJfc3RkX2lkIHN0ZF9pZDsKKyAgICBpbnQgY2hhbm5lbDsKKyAgICBjaGFyICpwaXhlbF9mb3JtYXQ7IC8qKjwgU2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uICovCisgICAgaW50IGxpc3RfZm9ybWF0OyAgICAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLworICAgIGludCBsaXN0X3N0YW5kYXJkOyAgLyoqPCBTZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4gKi8KKyAgICBjaGFyICpmcmFtZXJhdGU7ICAgIC8qKjwgU2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uICovCisKKyAgICBpbnQgdXNlX2xpYnY0bDI7CisgICAgaW50ICgqb3Blbl9mKShjb25zdCBjaGFyICpmaWxlLCBpbnQgb2ZsYWcsIC4uLik7CisgICAgaW50ICgqY2xvc2VfZikoaW50IGZkKTsKKyAgICBpbnQgKCpkdXBfZikoaW50IGZkKTsKKyAgICBpbnQgKCppb2N0bF9mKShpbnQgZmQsIHVuc2lnbmVkIGxvbmcgaW50IHJlcXVlc3QsIC4uLik7CisgICAgc3NpemVfdCAoKnJlYWRfZikoaW50IGZkLCB2b2lkICpidWZmZXIsIHNpemVfdCBuKTsKKyAgICB2b2lkICooKm1tYXBfZikodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgsIGludCBwcm90LCBpbnQgZmxhZ3MsIGludCBmZCwgaW50NjRfdCBvZmZzZXQpOworICAgIGludCAoKm11bm1hcF9mKSh2b2lkICpfc3RhcnQsIHNpemVfdCBsZW5ndGgpOworfTsKKworc3RydWN0IGJ1ZmZfZGF0YSB7CisgICAgc3RydWN0IHZpZGVvX2RhdGEgKnM7CisgICAgaW50IGluZGV4OworfTsKKworc3RhdGljIGludCBkZXZpY2Vfb3BlbihBVkZvcm1hdENvbnRleHQgKmN0eCkKK3sKKyAgICBzdHJ1Y3QgdmlkZW9fZGF0YSAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgY2FwOworICAgIGludCBmZDsKKyAgICBpbnQgZXJyOworICAgIGludCBmbGFncyA9IE9fUkRXUjsKKworI2RlZmluZSBTRVRfV1JBUFBFUlMocHJlZml4KSBkbyB7ICAgICAgIFwKKyAgICBzLT5vcGVuX2YgICA9IHByZWZpeCAjIyBvcGVuOyAgICAgICBcCisgICAgcy0+Y2xvc2VfZiAgPSBwcmVmaXggIyMgY2xvc2U7ICAgICAgXAorICAgIHMtPmR1cF9mICAgID0gcHJlZml4ICMjIGR1cDsgICAgICAgIFwKKyAgICBzLT5pb2N0bF9mICA9IHByZWZpeCAjIyBpb2N0bDsgICAgICBcCisgICAgcy0+cmVhZF9mICAgPSBwcmVmaXggIyMgcmVhZDsgICAgICAgXAorICAgIHMtPm1tYXBfZiAgID0gcHJlZml4ICMjIG1tYXA7ICAgICAgIFwKKyAgICBzLT5tdW5tYXBfZiA9IHByZWZpeCAjIyBtdW5tYXA7ICAgICBcCit9IHdoaWxlICgwKQorCisgICAgaWYgKHMtPnVzZV9saWJ2NGwyKSB7CisjaWYgQ09ORklHX0xJQlY0TDIKKyAgICAgICAgU0VUX1dSQVBQRVJTKHY0bDJfKTsKKyNlbHNlCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImxpYmF2ZGV2aWNlIGlzIG5vdCBidWlsZCB3aXRoIGxpYnY0bDIgc3VwcG9ydC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgU0VUX1dSQVBQRVJTKCk7CisgICAgfQorCisjZGVmaW5lIHY0bDJfb3BlbiAgIHMtPm9wZW5fZgorI2RlZmluZSB2NGwyX2Nsb3NlICBzLT5jbG9zZV9mCisjZGVmaW5lIHY0bDJfZHVwICAgIHMtPmR1cF9mCisjZGVmaW5lIHY0bDJfaW9jdGwgIHMtPmlvY3RsX2YKKyNkZWZpbmUgdjRsMl9yZWFkICAgcy0+cmVhZF9mCisjZGVmaW5lIHY0bDJfbW1hcCAgIHMtPm1tYXBfZgorI2RlZmluZSB2NGwyX211bm1hcCBzLT5tdW5tYXBfZgorCisgICAgaWYgKGN0eC0+ZmxhZ3MgJiBBVkZNVF9GTEFHX05PTkJMT0NLKSB7CisgICAgICAgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgfQorCisgICAgZmQgPSB2NGwyX29wZW4oY3R4LT5maWxlbmFtZSwgZmxhZ3MsIDApOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBvcGVuIHZpZGVvIGRldmljZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICBjdHgtPmZpbGVuYW1lLCBhdl9lcnIyc3RyKGVycikpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICh2NGwyX2lvY3RsKGZkLCBWSURJT0NfUVVFUllDQVAsICZjYXApIDwgMCkgeworICAgICAgICBlcnIgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW9jdGwoVklESU9DX1FVRVJZQ0FQKTogJXNcbiIsCisgICAgICAgICAgICAgICBhdl9lcnIyc3RyKGVycikpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJmZDolZCBjYXBhYmlsaXRpZXM6JXhcbiIsCisgICAgICAgICAgIGZkLCBjYXAuY2FwYWJpbGl0aWVzKTsKKworICAgIGlmICghKGNhcC5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WSURFT19DQVBUVVJFKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJOb3QgYSB2aWRlbyBjYXB0dXJlIGRldmljZS5cbiIpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT0RFVik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoIShjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfU1RSRUFNSU5HKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVGhlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzdHJlYW1pbmcgSS9PIG1ldGhvZC5cbiIpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXR1cm4gZmQ7CisKK2ZhaWw6CisgICAgdjRsMl9jbG9zZShmZCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkZXZpY2VfaW5pdChBVkZvcm1hdENvbnRleHQgKmN0eCwgaW50ICp3aWR0aCwgaW50ICpoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpeGVsZm9ybWF0KQoreworICAgIHN0cnVjdCB2aWRlb19kYXRhICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdCA9IHsgLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfTsKKyAgICBpbnQgcmVzID0gMDsKKworICAgIGZtdC5mbXQucGl4LndpZHRoID0gKndpZHRoOworICAgIGZtdC5mbXQucGl4LmhlaWdodCA9ICpoZWlnaHQ7CisgICAgZm10LmZtdC5waXgucGl4ZWxmb3JtYXQgPSBwaXhlbGZvcm1hdDsKKyAgICBmbXQuZm10LnBpeC5maWVsZCA9IFY0TDJfRklFTERfQU5ZOworCisgICAgLyogU29tZSBkcml2ZXJzIHdpbGwgZmFpbCBhbmQgcmV0dXJuIEVJTlZBTCB3aGVuIHRoZSBwaXhlbGZvcm1hdAorICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQgKGV2ZW4gaWYgdHlwZSBmaWVsZCBpcyB2YWxpZCBhbmQgc3VwcG9ydGVkKSAqLworICAgIGlmICh2NGwyX2lvY3RsKHMtPmZkLCBWSURJT0NfU19GTVQsICZmbXQpIDwgMCkKKyAgICAgICAgcmVzID0gQVZFUlJPUihlcnJubyk7CisKKyAgICBpZiAoKCp3aWR0aCAhPSBmbXQuZm10LnBpeC53aWR0aCkgfHwgKCpoZWlnaHQgIT0gZm10LmZtdC5waXguaGVpZ2h0KSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICJUaGUgVjRMMiBkcml2ZXIgY2hhbmdlZCB0aGUgdmlkZW8gZnJvbSAlZHglZCB0byAlZHglZFxuIiwKKyAgICAgICAgICAgICAgICp3aWR0aCwgKmhlaWdodCwgZm10LmZtdC5waXgud2lkdGgsIGZtdC5mbXQucGl4LmhlaWdodCk7CisgICAgICAgICp3aWR0aCA9IGZtdC5mbXQucGl4LndpZHRoOworICAgICAgICAqaGVpZ2h0ID0gZm10LmZtdC5waXguaGVpZ2h0OworICAgIH0KKworICAgIGlmIChwaXhlbGZvcm1hdCAhPSBmbXQuZm10LnBpeC5waXhlbGZvcm1hdCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiVGhlIFY0TDIgZHJpdmVyIGNoYW5nZWQgdGhlIHBpeGVsIGZvcm1hdCAiCisgICAgICAgICAgICAgICAiZnJvbSAweCUwOFggdG8gMHglMDhYXG4iLAorICAgICAgICAgICAgICAgcGl4ZWxmb3JtYXQsIGZtdC5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKyAgICAgICAgcmVzID0gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChmbXQuZm10LnBpeC5maWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgIlRoZSBWNEwyIGRyaXZlciBpcyB1c2luZyB0aGUgaW50ZXJsYWNlZCBtb2RlXG4iKTsKKyAgICAgICAgcy0+aW50ZXJsYWNlZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBmaXJzdF9maWVsZChjb25zdCBzdHJ1Y3QgdmlkZW9fZGF0YSAqcykKK3sKKyAgICBpbnQgcmVzOworICAgIHY0bDJfc3RkX2lkIHN0ZDsKKworICAgIHJlcyA9IHY0bDJfaW9jdGwocy0+ZmQsIFZJRElPQ19HX1NURCwgJnN0ZCk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChzdGQgJiBWNEwyX1NURF9OVFNDKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAxOworfQorCisjaWYgSEFWRV9TVFJVQ1RfVjRMMl9GUk1JVkFMRU5VTV9ESVNDUkVURQorc3RhdGljIHZvaWQgbGlzdF9mcmFtZXNpemVzKEFWRm9ybWF0Q29udGV4dCAqY3R4LCB1aW50MzJfdCBwaXhlbGZvcm1hdCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgdmlkZW9fZGF0YSAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtIHZmc2UgPSB7IC5waXhlbF9mb3JtYXQgPSBwaXhlbGZvcm1hdCB9OworCisgICAgd2hpbGUoIXY0bDJfaW9jdGwocy0+ZmQsIFZJRElPQ19FTlVNX0ZSQU1FU0laRVMsICZ2ZnNlKSkgeworICAgICAgICBzd2l0Y2ggKHZmc2UudHlwZSkgeworICAgICAgICBjYXNlIFY0TDJfRlJNU0laRV9UWVBFX0RJU0NSRVRFOgorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgJXV4JXUiLAorICAgICAgICAgICAgICAgICAgIHZmc2UuZGlzY3JldGUud2lkdGgsIHZmc2UuZGlzY3JldGUuaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVjRMMl9GUk1TSVpFX1RZUEVfQ09OVElOVU9VUzoKKyAgICAgICAgY2FzZSBWNEwyX0ZSTVNJWkVfVFlQRV9TVEVQV0lTRToKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiIHsldS0ldSwgJXV9eHsldS0ldSwgJXV9IiwKKyAgICAgICAgICAgICAgICAgICB2ZnNlLnN0ZXB3aXNlLm1pbl93aWR0aCwKKyAgICAgICAgICAgICAgICAgICB2ZnNlLnN0ZXB3aXNlLm1heF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICB2ZnNlLnN0ZXB3aXNlLnN0ZXBfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgdmZzZS5zdGVwd2lzZS5taW5faGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIHZmc2Uuc3RlcHdpc2UubWF4X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICB2ZnNlLnN0ZXB3aXNlLnN0ZXBfaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICB2ZnNlLmluZGV4Kys7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGxpc3RfZm9ybWF0cyhBVkZvcm1hdENvbnRleHQgKmN0eCwgaW50IHR5cGUpCit7CisgICAgY29uc3Qgc3RydWN0IHZpZGVvX2RhdGEgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjIHZmZCA9IHsgLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfTsKKworICAgIHdoaWxlKCF2NGwyX2lvY3RsKHMtPmZkLCBWSURJT0NfRU5VTV9GTVQsICZ2ZmQpKSB7CisgICAgICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkID0gZmZfZm10X3Y0bDJjb2RlYyh2ZmQucGl4ZWxmb3JtYXQpOworICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCA9IGZmX2ZtdF92NGwyZmYodmZkLnBpeGVsZm9ybWF0LCBjb2RlY19pZCk7CisKKyAgICAgICAgdmZkLmluZGV4Kys7CisKKyAgICAgICAgaWYgKCEodmZkLmZsYWdzICYgVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEKSAmJgorICAgICAgICAgICAgdHlwZSAmIFY0TF9SQVdGT1JNQVRTKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmbXRfbmFtZSA9IGF2X2dldF9waXhfZm10X25hbWUocGl4X2ZtdCk7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlJhdyAgICAgICA6ICU5cyA6ICUyMHMgOiIsCisgICAgICAgICAgICAgICAgICAgZm10X25hbWUgPyBmbXRfbmFtZSA6ICJVbnN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgdmZkLmRlc2NyaXB0aW9uKTsKKyAgICAgICAgfSBlbHNlIGlmICh2ZmQuZmxhZ3MgJiBWNEwyX0ZNVF9GTEFHX0NPTVBSRVNTRUQgJiYKKyAgICAgICAgICAgICAgICAgICB0eXBlICYgVjRMX0NPTVBGT1JNQVRTKSB7CisgICAgICAgICAgICBBVkNvZGVjICpjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKGNvZGVjX2lkKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiQ29tcHJlc3NlZDogJTlzIDogJTIwcyA6IiwKKyAgICAgICAgICAgICAgICAgICBjb2RlYyA/IGNvZGVjLT5uYW1lIDogIlVuc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICB2ZmQuZGVzY3JpcHRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworI2lmZGVmIFY0TDJfRk1UX0ZMQUdfRU1VTEFURUQKKyAgICAgICAgaWYgKHZmZC5mbGFncyAmIFY0TDJfRk1UX0ZMQUdfRU1VTEFURUQpCisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiBFbXVsYXRlZCA6Iik7CisjZW5kaWYKKyNpZiBIQVZFX1NUUlVDVF9WNEwyX0ZSTUlWQUxFTlVNX0RJU0NSRVRFCisgICAgICAgIGxpc3RfZnJhbWVzaXplcyhjdHgsIHZmZC5waXhlbGZvcm1hdCk7CisjZW5kaWYKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbGlzdF9zdGFuZGFyZHMoQVZGb3JtYXRDb250ZXh0ICpjdHgpCit7CisgICAgaW50IHJldDsKKyAgICBzdHJ1Y3QgdmlkZW9fZGF0YSAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCB2NGwyX3N0YW5kYXJkIHN0YW5kYXJkOworCisgICAgaWYgKHMtPnN0ZF9pZCA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHN0YW5kYXJkLmluZGV4ID0gMDsgOyBzdGFuZGFyZC5pbmRleCsrKSB7CisgICAgICAgIGlmICh2NGwyX2lvY3RsKHMtPmZkLCBWSURJT0NfRU5VTVNURCwgJnN0YW5kYXJkKSA8IDApIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVJTlZBTCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW9jdGwoVklESU9DX0VOVU1TVEQpOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIlMmQsICUxNiJQUkl4NjQiLCAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0YW5kYXJkLmluZGV4LCAodWludDY0X3Qpc3RhbmRhcmQuaWQsIHN0YW5kYXJkLm5hbWUpOworICAgIH0KK30KKworc3RhdGljIGludCBtbWFwX2luaXQoQVZGb3JtYXRDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGksIHJlczsKKyAgICBzdHJ1Y3QgdmlkZW9fZGF0YSAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHJlcSA9IHsKKyAgICAgICAgLnR5cGUgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKKyAgICAgICAgLmNvdW50ICA9IGRlc2lyZWRfdmlkZW9fYnVmZmVycywKKyAgICAgICAgLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVAKKyAgICB9OworCisgICAgaWYgKHY0bDJfaW9jdGwocy0+ZmQsIFZJRElPQ19SRVFCVUZTLCAmcmVxKSA8IDApIHsKKyAgICAgICAgcmVzID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImlvY3RsKFZJRElPQ19SRVFCVUZTKTogJXNcbiIsIGF2X2VycjJzdHIocmVzKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKHJlcS5jb3VudCA8IDIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGJ1ZmZlciBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBzLT5idWZmZXJzID0gcmVxLmNvdW50OworICAgIHMtPmJ1Zl9zdGFydCA9IGF2X21hbGxvY19hcnJheShzLT5idWZmZXJzLCBzaXplb2Yodm9pZCAqKSk7CisgICAgaWYgKCFzLT5idWZfc3RhcnQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIGJ1ZmZlciBwb2ludGVyc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHMtPmJ1Zl9sZW4gPSBhdl9tYWxsb2NfYXJyYXkocy0+YnVmZmVycywgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICAgIGlmICghcy0+YnVmX2xlbikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgYnVmZmVyIHNpemVzXG4iKTsKKyAgICAgICAgYXZfZnJlZShzLT5idWZfc3RhcnQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCByZXEuY291bnQ7IGkrKykgeworICAgICAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmID0geworICAgICAgICAgICAgLnR5cGUgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKKyAgICAgICAgICAgIC5pbmRleCAgPSBpLAorICAgICAgICAgICAgLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVAKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKHY0bDJfaW9jdGwocy0+ZmQsIFZJRElPQ19RVUVSWUJVRiwgJmJ1ZikgPCAwKSB7CisgICAgICAgICAgICByZXMgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImlvY3RsKFZJRElPQ19RVUVSWUJVRik6ICVzXG4iLCBhdl9lcnIyc3RyKHJlcykpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmJ1Zl9sZW5baV0gPSBidWYubGVuZ3RoOworICAgICAgICBpZiAocy0+ZnJhbWVfc2l6ZSA+IDAgJiYgcy0+YnVmX2xlbltpXSA8IHMtPmZyYW1lX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiYnVmX2xlblslZF0gPSAlZCA8IGV4cGVjdGVkIGZyYW1lIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgaSwgcy0+YnVmX2xlbltpXSwgcy0+ZnJhbWVfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIHMtPmJ1Zl9zdGFydFtpXSA9IHY0bDJfbW1hcChOVUxMLCBidWYubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmQsIGJ1Zi5tLm9mZnNldCk7CisKKyAgICAgICAgaWYgKHMtPmJ1Zl9zdGFydFtpXSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICByZXMgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIm1tYXA6ICVzXG4iLCBhdl9lcnIyc3RyKHJlcykpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjaWYgRkZfQVBJX0RFU1RSVUNUX1BBQ0tFVAorc3RhdGljIHZvaWQgZHVtbXlfcmVsZWFzZV9idWZmZXIoQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBhdl9hc3NlcnQwKDApOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZW5xdWV1ZV9idWZmZXIoc3RydWN0IHZpZGVvX2RhdGEgKnMsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworICAgIGludCByZXMgPSAwOworCisgICAgaWYgKHY0bDJfaW9jdGwocy0+ZmQsIFZJRElPQ19RQlVGLCBidWYpIDwgMCkgeworICAgICAgICByZXMgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImlvY3RsKFZJRElPQ19RQlVGKTogJXNcbiIsIGF2X2VycjJzdHIocmVzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZwcml2X2F0b21pY19pbnRfYWRkX2FuZF9mZXRjaCgmcy0+YnVmZmVyc19xdWV1ZWQsIDEpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIG1tYXBfcmVsZWFzZV9idWZmZXIodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKQoreworICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWYgPSB7IDAgfTsKKyAgICBzdHJ1Y3QgYnVmZl9kYXRhICpidWZfZGVzY3JpcHRvciA9IG9wYXF1ZTsKKyAgICBzdHJ1Y3QgdmlkZW9fZGF0YSAqcyA9IGJ1Zl9kZXNjcmlwdG9yLT5zOworCisgICAgYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgYnVmLmluZGV4ID0gYnVmX2Rlc2NyaXB0b3ItPmluZGV4OworICAgIGF2X2ZyZWUoYnVmX2Rlc2NyaXB0b3IpOworCisgICAgZW5xdWV1ZV9idWZmZXIocywgJmJ1Zik7Cit9CisKKyNpZiBIQVZFX0NMT0NLX0dFVFRJTUUgJiYgZGVmaW5lZChDTE9DS19NT05PVE9OSUMpCitzdGF0aWMgaW50NjRfdCBhdl9nZXR0aW1lX21vbm90b25pYyh2b2lkKQoreworICAgIHJldHVybiBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpbml0X2NvbnZlcnRfdGltZXN0YW1wKEFWRm9ybWF0Q29udGV4dCAqY3R4LCBpbnQ2NF90IHRzKQoreworICAgIHN0cnVjdCB2aWRlb19kYXRhICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBub3c7CisKKyAgICBub3cgPSBhdl9nZXR0aW1lKCk7CisgICAgaWYgKHMtPnRzX21vZGUgPT0gVjRMX1RTX0FCUyAmJgorICAgICAgICB0cyA8PSBub3cgKyAxICogQVZfVElNRV9CQVNFICYmIHRzID49IG5vdyAtIDEwICogQVZfVElNRV9CQVNFKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiRGV0ZWN0ZWQgYWJzb2x1dGUgdGltZXN0YW1wc1xuIik7CisgICAgICAgIHMtPnRzX21vZGUgPSBWNExfVFNfQ09OVkVSVF9SRUFEWTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorI2lmIEhBVkVfQ0xPQ0tfR0VUVElNRSAmJiBkZWZpbmVkKENMT0NLX01PTk9UT05JQykKKyAgICBpZiAoY3R4LT5zdHJlYW1zWzBdLT5hdmdfZnJhbWVfcmF0ZS5udW0pIHsKKyAgICAgICAgbm93ID0gYXZfZ2V0dGltZV9tb25vdG9uaWMoKTsKKyAgICAgICAgaWYgKHMtPnRzX21vZGUgPT0gVjRMX1RTX01PTk8yQUJTIHx8CisgICAgICAgICAgICAodHMgPD0gbm93ICsgMSAqIEFWX1RJTUVfQkFTRSAmJiB0cyA+PSBub3cgLSAxMCAqIEFWX1RJTUVfQkFTRSkpIHsKKyAgICAgICAgICAgIEFWUmF0aW9uYWwgdGIgPSB7QVZfVElNRV9CQVNFLCAxfTsKKyAgICAgICAgICAgIGludDY0X3QgcGVyaW9kID0gYXZfcmVzY2FsZV9xKDEsIHRiLCBjdHgtPnN0cmVhbXNbMF0tPmF2Z19mcmFtZV9yYXRlKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiRGV0ZWN0ZWQgbW9ub3RvbmljIHRpbWVzdGFtcHMsIGNvbnZlcnRpbmdcbiIpOworICAgICAgICAgICAgLyogbWljcm9zZWNvbmRzIGluc3RlYWQgb2Ygc2Vjb25kcywgTUh6IGluc3RlYWQgb2YgSHogKi8KKyAgICAgICAgICAgIHMtPnRpbWVmaWx0ZXIgPSBmZl90aW1lZmlsdGVyX25ldygxLCBwZXJpb2QsIDEuMEUtNik7CisgICAgICAgICAgICBpZiAoIXMtPnRpbWVmaWx0ZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIHMtPnRzX21vZGUgPSBWNExfVFNfQ09OVkVSVF9SRUFEWTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biB0aW1lc3RhbXBzXG4iKTsKKyAgICByZXR1cm4gQVZFUlJPUihFSU8pOworfQorCitzdGF0aWMgaW50IGNvbnZlcnRfdGltZXN0YW1wKEFWRm9ybWF0Q29udGV4dCAqY3R4LCBpbnQ2NF90ICp0cykKK3sKKyAgICBzdHJ1Y3QgdmlkZW9fZGF0YSAqcyA9IGN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKHMtPnRzX21vZGUpIHsKKyAgICAgICAgaW50IHIgPSBpbml0X2NvbnZlcnRfdGltZXN0YW1wKGN0eCwgKnRzKTsKKyAgICAgICAgaWYgKHIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgfQorI2lmIEhBVkVfQ0xPQ0tfR0VUVElNRSAmJiBkZWZpbmVkKENMT0NLX01PTk9UT05JQykKKyAgICBpZiAocy0+dGltZWZpbHRlcikgeworICAgICAgICBpbnQ2NF90IG5vd2EgPSBhdl9nZXR0aW1lKCk7CisgICAgICAgIGludDY0X3Qgbm93bSA9IGF2X2dldHRpbWVfbW9ub3RvbmljKCk7CisgICAgICAgIGZmX3RpbWVmaWx0ZXJfdXBkYXRlKHMtPnRpbWVmaWx0ZXIsIG5vd2EsIG5vd20gLSBzLT5sYXN0X3RpbWVfbSk7CisgICAgICAgIHMtPmxhc3RfdGltZV9tID0gbm93bTsKKyAgICAgICAgKnRzID0gZmZfdGltZWZpbHRlcl9ldmFsKHMtPnRpbWVmaWx0ZXIsICp0cyAtIG5vd20pOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1tYXBfcmVhZF9mcmFtZShBVkZvcm1hdENvbnRleHQgKmN0eCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBzdHJ1Y3QgdmlkZW9fZGF0YSAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWYgPSB7CisgICAgICAgIC50eXBlICAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCisgICAgICAgIC5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQCisgICAgfTsKKyAgICBpbnQgcmVzOworCisgICAgLyogRklYTUU6IFNvbWUgc3BlY2lhbCB0cmVhdG1lbnQgbWlnaHQgYmUgbmVlZGVkIGluIGNhc2Ugb2YgbG9zcyBvZiBzaWduYWwuLi4gKi8KKyAgICB3aGlsZSAoKHJlcyA9IHY0bDJfaW9jdGwocy0+ZmQsIFZJRElPQ19EUUJVRiwgJmJ1ZikpIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIpKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgICBwa3QtPnNpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW9jdGwoVklESU9DX0RRQlVGKTogJXNcbiIsCisgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJlcykpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmIChidWYuaW5kZXggPj0gcy0+YnVmZmVycykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGJ1ZmZlciBpbmRleCByZWNlaXZlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZzLT5idWZmZXJzX3F1ZXVlZCwgLTEpOworICAgIC8vIGFsd2F5cyBrZWVwIGF0IGxlYXN0IG9uZSBidWZmZXIgcXVldWVkCisgICAgYXZfYXNzZXJ0MChhdnByaXZfYXRvbWljX2ludF9nZXQoJnMtPmJ1ZmZlcnNfcXVldWVkKSA+PSAxKTsKKworICAgIC8qIENQSUEgaXMgYSBjb21wcmVzc2VkIGZvcm1hdCBhbmQgd2UgZG9uJ3Qga25vdyB0aGUgZXhhY3QgbnVtYmVyIG9mIGJ5dGVzCisgICAgICogdXNlZCBieSBhIGZyYW1lLCBzbyBzZXQgaXQgaGVyZSBhcyB0aGUgZHJpdmVyIGFubm91bmNlcyBpdC4KKyAgICAgKi8KKyAgICBpZiAoY3R4LT52aWRlb19jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9DUElBKQorICAgICAgICBzLT5mcmFtZV9zaXplID0gYnVmLmJ5dGVzdXNlZDsKKworICAgIGlmIChzLT5mcmFtZV9zaXplID4gMCAmJiBidWYuYnl0ZXN1c2VkICE9IHMtPmZyYW1lX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoZSB2NGwyIGZyYW1lIGlzICVkIGJ5dGVzLCBidXQgJWQgYnl0ZXMgYXJlIGV4cGVjdGVkXG4iLAorICAgICAgICAgICAgICAgYnVmLmJ5dGVzdXNlZCwgcy0+ZnJhbWVfc2l6ZSk7CisgICAgICAgIGVucXVldWVfYnVmZmVyKHMsICZidWYpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBJbWFnZSBpcyBhdCBzLT5idWZmX3N0YXJ0W2J1Zi5pbmRleF0gKi8KKyAgICBpZiAoYXZwcml2X2F0b21pY19pbnRfZ2V0KCZzLT5idWZmZXJzX3F1ZXVlZCkgPT0gRkZNQVgocy0+YnVmZmVycyAvIDgsIDEpKSB7CisgICAgICAgIC8qIHdoZW4gd2Ugc3RhcnQgZ2V0dGluZyBsb3cgb24gcXVldWVkIGJ1ZmZlcnMsIGZhbGwgYmFjayBvbiBjb3B5aW5nIGRhdGEgKi8KKyAgICAgICAgcmVzID0gYXZfbmV3X3BhY2tldChwa3QsIGJ1Zi5ieXRlc3VzZWQpOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYWxsb2NhdGluZyBhIHBhY2tldC5cbiIpOworICAgICAgICAgICAgZW5xdWV1ZV9idWZmZXIocywgJmJ1Zik7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIHMtPmJ1Zl9zdGFydFtidWYuaW5kZXhdLCBidWYuYnl0ZXN1c2VkKTsKKworICAgICAgICByZXMgPSBlbnF1ZXVlX2J1ZmZlcihzLCAmYnVmKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzdHJ1Y3QgYnVmZl9kYXRhICpidWZfZGVzY3JpcHRvcjsKKworICAgICAgICBwa3QtPmRhdGEgICAgID0gcy0+YnVmX3N0YXJ0W2J1Zi5pbmRleF07CisgICAgICAgIHBrdC0+c2l6ZSAgICAgPSBidWYuYnl0ZXN1c2VkOworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgcGt0LT5kZXN0cnVjdCA9IGR1bW15X3JlbGVhc2VfYnVmZmVyOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKworICAgICAgICBidWZfZGVzY3JpcHRvciA9IGF2X21hbGxvYyhzaXplb2Yoc3RydWN0IGJ1ZmZfZGF0YSkpOworICAgICAgICBpZiAoIWJ1Zl9kZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4uLiBTaW5jZSBhdl9tYWxsb2MoKSBmYWlsZWQsIHdlIGNhbm5vdCBldmVuCisgICAgICAgICAgICAgKiBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgbWVtY3B5aW5nIGludG8gaXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYnVmZmVyIGRlc2NyaXB0b3JcbiIpOworICAgICAgICAgICAgZW5xdWV1ZV9idWZmZXIocywgJmJ1Zik7CisKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmX2Rlc2NyaXB0b3ItPmluZGV4ID0gYnVmLmluZGV4OworICAgICAgICBidWZfZGVzY3JpcHRvci0+cyAgICAgPSBzOworCisgICAgICAgIHBrdC0+YnVmID0gYXZfYnVmZmVyX2NyZWF0ZShwa3QtPmRhdGEsIHBrdC0+c2l6ZSwgbW1hcF9yZWxlYXNlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9kZXNjcmlwdG9yLCAwKTsKKyAgICAgICAgaWYgKCFwa3QtPmJ1ZikgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBhIGJ1ZmZlclxuIik7CisgICAgICAgICAgICBlbnF1ZXVlX2J1ZmZlcihzLCAmYnVmKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZidWZfZGVzY3JpcHRvcik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorICAgIHBrdC0+cHRzID0gYnVmLnRpbWVzdGFtcC50dl9zZWMgKiBJTlQ2NF9DKDEwMDAwMDApICsgYnVmLnRpbWVzdGFtcC50dl91c2VjOworICAgIGNvbnZlcnRfdGltZXN0YW1wKGN0eCwgJnBrdC0+cHRzKTsKKworICAgIHJldHVybiBzLT5idWZfbGVuW2J1Zi5pbmRleF07Cit9CisKK3N0YXRpYyBpbnQgbW1hcF9zdGFydChBVkZvcm1hdENvbnRleHQgKmN0eCkKK3sKKyAgICBzdHJ1Y3QgdmlkZW9fZGF0YSAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlOworICAgIGludCBpLCByZXM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YnVmZmVyczsgaSsrKSB7CisgICAgICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWYgPSB7CisgICAgICAgICAgICAudHlwZSAgID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorICAgICAgICAgICAgLmluZGV4ICA9IGksCisgICAgICAgICAgICAubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUAorICAgICAgICB9OworCisgICAgICAgIGlmICh2NGwyX2lvY3RsKHMtPmZkLCBWSURJT0NfUUJVRiwgJmJ1ZikgPCAwKSB7CisgICAgICAgICAgICByZXMgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImlvY3RsKFZJRElPQ19RQlVGKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXMpKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+YnVmZmVyc19xdWV1ZWQgPSBzLT5idWZmZXJzOworCisgICAgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgICBpZiAodjRsMl9pb2N0bChzLT5mZCwgVklESU9DX1NUUkVBTU9OLCAmdHlwZSkgPCAwKSB7CisgICAgICAgIHJlcyA9IEFWRVJST1IoZXJybm8pOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpb2N0bChWSURJT0NfU1RSRUFNT04pOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGF2X2VycjJzdHIocmVzKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1tYXBfY2xvc2Uoc3RydWN0IHZpZGVvX2RhdGEgKnMpCit7CisgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisgICAgaW50IGk7CisKKyAgICB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICAgIC8qIFdlIGRvIG5vdCBjaGVjayBmb3IgdGhlIHJlc3VsdCwgYmVjYXVzZSB3ZSBjb3VsZAorICAgICAqIG5vdCBkbyBhbnl0aGluZyBhYm91dCBpdCBhbnl3YXkuLi4KKyAgICAgKi8KKyAgICB2NGwyX2lvY3RsKHMtPmZkLCBWSURJT0NfU1RSRUFNT0ZGLCAmdHlwZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPmJ1ZmZlcnM7IGkrKykgeworICAgICAgICB2NGwyX211bm1hcChzLT5idWZfc3RhcnRbaV0sIHMtPmJ1Zl9sZW5baV0pOworICAgIH0KKyAgICBhdl9mcmVlKHMtPmJ1Zl9zdGFydCk7CisgICAgYXZfZnJlZShzLT5idWZfbGVuKTsKK30KKworc3RhdGljIGludCB2NGwyX3NldF9wYXJhbWV0ZXJzKEFWRm9ybWF0Q29udGV4dCAqY3R4KQoreworICAgIHN0cnVjdCB2aWRlb19kYXRhICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IHY0bDJfc3RhbmRhcmQgc3RhbmRhcmQgPSB7IDAgfTsKKyAgICBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIHN0cmVhbXBhcm0gPSB7IDAgfTsKKyAgICBzdHJ1Y3QgdjRsMl9mcmFjdCAqdHBmOworICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlX3EgPSB7IDAgfTsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKHMtPmZyYW1lcmF0ZSAmJgorICAgICAgICAocmV0ID0gYXZfcGFyc2VfdmlkZW9fcmF0ZSgmZnJhbWVyYXRlX3EsIHMtPmZyYW1lcmF0ZSkpIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgcGFyc2UgZnJhbWVyYXRlICclcycuXG4iLAorICAgICAgICAgICAgICAgcy0+ZnJhbWVyYXRlKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAocy0+c3RhbmRhcmQpIHsKKyAgICAgICAgaWYgKHMtPnN0ZF9pZCkgeworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlNldHRpbmcgc3RhbmRhcmQ6ICVzXG4iLCBzLT5zdGFuZGFyZCk7CisgICAgICAgICAgICAvKiBzZXQgdHYgc3RhbmRhcmQgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RhbmRhcmQuaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGlmICh2NGwyX2lvY3RsKHMtPmZkLCBWSURJT0NfRU5VTVNURCwgJnN0YW5kYXJkKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAoc3RhbmRhcmQubmFtZSwgcy0+c3RhbmRhcmQpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBzdGFuZGFyZCAnJXMnXG4iLCBzLT5zdGFuZGFyZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHY0bDJfaW9jdGwocy0+ZmQsIFZJRElPQ19TX1NURCwgJnN0YW5kYXJkLmlkKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpb2N0bChWSURJT0NfU19TVEQpOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIlRoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgYW55IHN0YW5kYXJkXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCBzdGFuZGFyZCAqLworICAgIGlmICh2NGwyX2lvY3RsKHMtPmZkLCBWSURJT0NfR19TVEQsICZzLT5zdGRfaWQpID09IDApIHsKKyAgICAgICAgdHBmID0gJnN0YW5kYXJkLmZyYW1lcGVyaW9kOworICAgICAgICBmb3IgKGkgPSAwOyA7IGkrKykgeworICAgICAgICAgICAgc3RhbmRhcmQuaW5kZXggPSBpOworICAgICAgICAgICAgaWYgKHY0bDJfaW9jdGwocy0+ZmQsIFZJRElPQ19FTlVNU1RELCAmc3RhbmRhcmQpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFSU5WQUwpCisjaWZkZWYgRU5PREFUQQorICAgICAgICAgICAgICAgICAgICB8fCByZXQgPT0gQVZFUlJPUihFTk9EQVRBKQorI2VuZGlmCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIHRwZiA9ICZzdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpb2N0bChWSURJT0NfRU5VTVNURCk6ICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhbmRhcmQuaWQgPT0gcy0+c3RkX2lkKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICAgICAiQ3VycmVudCBzdGFuZGFyZDogJXMsIGlkOiAlIlBSSXg2NCIsIGZyYW1lcGVyaW9kOiAlZC8lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQubmFtZSwgKHVpbnQ2NF90KXN0YW5kYXJkLmlkLCB0cGYtPm51bWVyYXRvciwgdHBmLT5kZW5vbWluYXRvcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0cGYgPSAmc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lOworICAgIH0KKworICAgIHN0cmVhbXBhcm0udHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgICBpZiAodjRsMl9pb2N0bChzLT5mZCwgVklESU9DX0dfUEFSTSwgJnN0cmVhbXBhcm0pIDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW9jdGwoVklESU9DX0dfUEFSTSk6ICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChmcmFtZXJhdGVfcS5udW0gJiYgZnJhbWVyYXRlX3EuZGVuKSB7CisgICAgICAgIGlmIChzdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS5jYXBhYmlsaXR5ICYgVjRMMl9DQVBfVElNRVBFUkZSQU1FKSB7CisgICAgICAgICAgICB0cGYgPSAmc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lOworCisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJTZXR0aW5nIHRpbWUgcGVyIGZyYW1lIHRvICVkLyVkXG4iLAorICAgICAgICAgICAgICAgICAgIGZyYW1lcmF0ZV9xLmRlbiwgZnJhbWVyYXRlX3EubnVtKTsKKyAgICAgICAgICAgIHRwZi0+bnVtZXJhdG9yICAgPSBmcmFtZXJhdGVfcS5kZW47CisgICAgICAgICAgICB0cGYtPmRlbm9taW5hdG9yID0gZnJhbWVyYXRlX3EubnVtOworCisgICAgICAgICAgICBpZiAodjRsMl9pb2N0bChzLT5mZCwgVklESU9DX1NfUEFSTSwgJnN0cmVhbXBhcm0pIDwgMCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImlvY3RsKFZJRElPQ19TX1BBUk0pOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZnJhbWVyYXRlX3EubnVtICE9IHRwZi0+ZGVub21pbmF0b3IgfHwKKyAgICAgICAgICAgICAgICBmcmFtZXJhdGVfcS5kZW4gIT0gdHBmLT5udW1lcmF0b3IpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkcml2ZXIgY2hhbmdlZCB0aGUgdGltZSBwZXIgZnJhbWUgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICIlZC8lZCB0byAlZC8lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVyYXRlX3EuZGVuLCBmcmFtZXJhdGVfcS5udW0sCisgICAgICAgICAgICAgICAgICAgICAgIHRwZi0+bnVtZXJhdG9yLCB0cGYtPmRlbm9taW5hdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJUaGUgZHJpdmVyIGRvZXMgbm90IGFsbG93IHRvIGNoYW5nZSB0aW1lIHBlciBmcmFtZVxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRwZi0+ZGVub21pbmF0b3IgPiAwICYmIHRwZi0+bnVtZXJhdG9yID4gMCkgeworICAgICAgICBjdHgtPnN0cmVhbXNbMF0tPmF2Z19mcmFtZV9yYXRlLm51bSA9IHRwZi0+ZGVub21pbmF0b3I7CisgICAgICAgIGN0eC0+c3RyZWFtc1swXS0+YXZnX2ZyYW1lX3JhdGUuZGVuID0gdHBmLT5udW1lcmF0b3I7CisgICAgICAgIGN0eC0+c3RyZWFtc1swXS0+cl9mcmFtZV9yYXRlID0gY3R4LT5zdHJlYW1zWzBdLT5hdmdfZnJhbWVfcmF0ZTsKKyAgICB9IGVsc2UKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaW1lIHBlciBmcmFtZSB1bmtub3duXG4iKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRldmljZV90cnlfaW5pdChBVkZvcm1hdENvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlc2lyZWRfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkNvZGVjSUQgKmNvZGVjX2lkKQoreworICAgIGludCByZXQsIGk7CisKKyAgICAqZGVzaXJlZF9mb3JtYXQgPSBmZl9mbXRfZmYydjRsKHBpeF9mbXQsIGN0eC0+dmlkZW9fY29kZWNfaWQpOworCisgICAgaWYgKCpkZXNpcmVkX2Zvcm1hdCkgeworICAgICAgICByZXQgPSBkZXZpY2VfaW5pdChjdHgsIHdpZHRoLCBoZWlnaHQsICpkZXNpcmVkX2Zvcm1hdCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAqZGVzaXJlZF9mb3JtYXQgPSAwOworICAgICAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SKEVJTlZBTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghKmRlc2lyZWRfZm9ybWF0KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGZmX2ZtdF9jb252ZXJzaW9uX3RhYmxlW2ldLmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX05PTkU7IGkrKykgeworICAgICAgICAgICAgaWYgKGN0eC0+dmlkZW9fY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSB8fAorICAgICAgICAgICAgICAgIGZmX2ZtdF9jb252ZXJzaW9uX3RhYmxlW2ldLmNvZGVjX2lkID09IGN0eC0+dmlkZW9fY29kZWNfaWQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJUcnlpbmcgdG8gc2V0IGNvZGVjOiVzIHBpeF9mbXQ6JXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUoZmZfZm10X2NvbnZlcnNpb25fdGFibGVbaV0uY29kZWNfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKWF2X3hfaWZfbnVsbChhdl9nZXRfcGl4X2ZtdF9uYW1lKGZmX2ZtdF9jb252ZXJzaW9uX3RhYmxlW2ldLmZmX2ZtdCksICJub25lIikpOworCisgICAgICAgICAgICAgICAgKmRlc2lyZWRfZm9ybWF0ID0gZmZfZm10X2NvbnZlcnNpb25fdGFibGVbaV0udjRsMl9mbXQ7CisgICAgICAgICAgICAgICAgcmV0ID0gZGV2aWNlX2luaXQoY3R4LCB3aWR0aCwgaGVpZ2h0LCAqZGVzaXJlZF9mb3JtYXQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmV0ICE9IEFWRVJST1IoRUlOVkFMKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAqZGVzaXJlZF9mb3JtYXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCpkZXNpcmVkX2Zvcm1hdCA9PSAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgZmluZCBhIHByb3BlciBmb3JtYXQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAiY29kZWMgJyVzJyAoaWQgJWQpLCBwaXhlbCBmb3JtYXQgJyVzJyAoaWQgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUoY3R4LT52aWRlb19jb2RlY19pZCksIGN0eC0+dmlkZW9fY29kZWNfaWQsCisgICAgICAgICAgICAgICAgICAgKGNoYXIgKilhdl94X2lmX251bGwoYXZfZ2V0X3BpeF9mbXRfbmFtZShwaXhfZm10KSwgIm5vbmUiKSwgcGl4X2ZtdCk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqY29kZWNfaWQgPSBmZl9mbXRfdjRsMmNvZGVjKCpkZXNpcmVkX2Zvcm1hdCk7CisgICAgYXZfYXNzZXJ0MCgqY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2NGwyX3JlYWRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKGF2X3N0cnN0YXJ0KHAtPmZpbGVuYW1lLCAiL2Rldi92aWRlbyIsIE5VTEwpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY0bDJfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpjdHgpCit7CisgICAgc3RydWN0IHZpZGVvX2RhdGEgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IHJlcyA9IDA7CisgICAgdWludDMyX3QgZGVzaXJlZF9mb3JtYXQ7CisgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOworICAgIHN0cnVjdCB2NGwyX2lucHV0IGlucHV0ID0geyAwIH07CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oY3R4LCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisjaWYgQ09ORklHX0xJQlY0TDIKKyAgICAvKiBzaWxlbmNlIGxpYnY0bDIgbG9nZ2luZy4gaWYgZm9wZW4oKSBmYWlscyB2NGwyX2xvZ19maWxlIHdpbGwgYmUgTlVMTAorICAgICAgIGFuZCBlcnJvcnMgd2lsbCBnZXQgc2VudCB0byBzdGRlcnIgKi8KKyAgICBpZiAocy0+dXNlX2xpYnY0bDIpCisgICAgICAgIHY0bDJfbG9nX2ZpbGUgPSBmb3BlbigiL2Rldi9udWxsIiwgInciKTsKKyNlbmRpZgorCisgICAgcy0+ZmQgPSBkZXZpY2Vfb3BlbihjdHgpOworICAgIGlmIChzLT5mZCA8IDApCisgICAgICAgIHJldHVybiBzLT5mZDsKKworICAgIGlmIChzLT5jaGFubmVsICE9IC0xKSB7CisgICAgICAgIC8qIHNldCB2aWRlbyBpbnB1dCAqLworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJTZWxlY3RpbmcgaW5wdXRfY2hhbm5lbDogJWRcbiIsIHMtPmNoYW5uZWwpOworICAgICAgICBpZiAodjRsMl9pb2N0bChzLT5mZCwgVklESU9DX1NfSU5QVVQsICZzLT5jaGFubmVsKSA8IDApIHsKKyAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoZXJybm8pOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW9jdGwoVklESU9DX1NfSU5QVVQpOiAlc1xuIiwgYXZfZXJyMnN0cihyZXMpKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGdldCBjdXJyZW50IHZpZGVvIGlucHV0ICovCisgICAgICAgIGlmICh2NGwyX2lvY3RsKHMtPmZkLCBWSURJT0NfR19JTlBVVCwgJnMtPmNoYW5uZWwpIDwgMCkgeworICAgICAgICAgICAgcmVzID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpb2N0bChWSURJT0NfR19JTlBVVCk6ICVzXG4iLCBhdl9lcnIyc3RyKHJlcykpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZW51bSBpbnB1dCAqLworICAgIGlucHV0LmluZGV4ID0gcy0+Y2hhbm5lbDsKKyAgICBpZiAodjRsMl9pb2N0bChzLT5mZCwgVklESU9DX0VOVU1JTlBVVCwgJmlucHV0KSA8IDApIHsKKyAgICAgICAgcmVzID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImlvY3RsKFZJRElPQ19FTlVNSU5QVVQpOiAlc1xuIiwgYXZfZXJyMnN0cihyZXMpKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzLT5zdGRfaWQgPSBpbnB1dC5zdGQ7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiQ3VycmVudCBpbnB1dF9jaGFubmVsOiAlZCwgaW5wdXRfbmFtZTogJXMsIGlucHV0X3N0ZDogJSJQUkl4NjQiXG4iLAorICAgICAgICAgICBzLT5jaGFubmVsLCBpbnB1dC5uYW1lLCAodWludDY0X3QpaW5wdXQuc3RkKTsKKworICAgIGlmIChzLT5saXN0X2Zvcm1hdCkgeworICAgICAgICBsaXN0X2Zvcm1hdHMoY3R4LCBzLT5saXN0X2Zvcm1hdCk7CisgICAgICAgIHJlcyA9IEFWRVJST1JfRVhJVDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChzLT5saXN0X3N0YW5kYXJkKSB7CisgICAgICAgIGxpc3Rfc3RhbmRhcmRzKGN0eCk7CisgICAgICAgIHJlcyA9IEFWRVJST1JfRVhJVDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsgLyogNjQgYml0cyBwdHMgaW4gdXMgKi8KKworICAgIGlmIChzLT5waXhlbF9mb3JtYXQpIHsKKyAgICAgICAgQVZDb2RlYyAqY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2Rlcl9ieV9uYW1lKHMtPnBpeGVsX2Zvcm1hdCk7CisKKyAgICAgICAgaWYgKGNvZGVjKQorICAgICAgICAgICAgY3R4LT52aWRlb19jb2RlY19pZCA9IGNvZGVjLT5pZDsKKworICAgICAgICBwaXhfZm10ID0gYXZfZ2V0X3BpeF9mbXQocy0+cGl4ZWxfZm9ybWF0KTsKKworICAgICAgICBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUgJiYgIWNvZGVjKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJObyBzdWNoIGlucHV0IGZvcm1hdDogJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIHMtPnBpeGVsX2Zvcm1hdCk7CisKKyAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcy0+d2lkdGggJiYgIXMtPmhlaWdodCkgeworICAgICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm10ID0geyAudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB9OworCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgIlF1ZXJ5aW5nIHRoZSBkZXZpY2UgZm9yIHRoZSBjdXJyZW50IGZyYW1lIHNpemVcbiIpOworICAgICAgICBpZiAodjRsMl9pb2N0bChzLT5mZCwgVklESU9DX0dfRk1ULCAmZm10KSA8IDApIHsKKyAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoZXJybm8pOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW9jdGwoVklESU9DX0dfRk1UKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXMpKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHMtPndpZHRoICA9IGZtdC5mbXQucGl4LndpZHRoOworICAgICAgICBzLT5oZWlnaHQgPSBmbXQuZm10LnBpeC5oZWlnaHQ7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgIlNldHRpbmcgZnJhbWUgc2l6ZSB0byAlZHglZFxuIiwgcy0+d2lkdGgsIHMtPmhlaWdodCk7CisgICAgfQorCisgICAgcmVzID0gZGV2aWNlX3RyeV9pbml0KGN0eCwgcGl4X2ZtdCwgJnMtPndpZHRoLCAmcy0+aGVpZ2h0LCAmZGVzaXJlZF9mb3JtYXQsICZjb2RlY19pZCk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIC8qIElmIG5vIHBpeGVsX2Zvcm1hdCB3YXMgc3BlY2lmaWVkLCB0aGUgY29kZWNfaWQgd2FzIG5vdCBrbm93biB1cAorICAgICAqIHVudGlsIG5vdy4gU2V0IHZpZGVvX2NvZGVjX2lkIGluIHRoZSBjb250ZXh0LCBhcyBjb2RlY19pZCB3aWxsCisgICAgICogbm90IGJlIGF2YWlsYWJsZSBvdXRzaWRlIHRoaXMgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBpZiAoY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORSAmJiBjdHgtPnZpZGVvX2NvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCisgICAgICAgIGN0eC0+dmlkZW9fY29kZWNfaWQgPSBjb2RlY19pZDsKKworICAgIGlmICgocmVzID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZShzLT53aWR0aCwgcy0+aGVpZ2h0LCAwLCBjdHgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHMtPnBpeGVsZm9ybWF0ID0gZGVzaXJlZF9mb3JtYXQ7CisKKyAgICBpZiAoKHJlcyA9IHY0bDJfc2V0X3BhcmFtZXRlcnMoY3R4KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBmZl9mbXRfdjRsMmZmKGRlc2lyZWRfZm9ybWF0LCBjb2RlY19pZCk7CisgICAgcy0+ZnJhbWVfc2l6ZSA9CisgICAgICAgIGF2cGljdHVyZV9nZXRfc2l6ZShzdC0+Y29kZWMtPnBpeF9mbXQsIHMtPndpZHRoLCBzLT5oZWlnaHQpOworCisgICAgaWYgKChyZXMgPSBtbWFwX2luaXQoY3R4KSkgfHwKKyAgICAgICAgKHJlcyA9IG1tYXBfc3RhcnQoY3R4KSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgcy0+dG9wX2ZpZWxkX2ZpcnN0ID0gZmlyc3RfZmllbGQocyk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGNvZGVjX2lkOworICAgIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTykKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPQorICAgICAgICAgICAgYXZjb2RlY19waXhfZm10X3RvX2NvZGVjX3RhZyhzdC0+Y29kZWMtPnBpeF9mbXQpOworICAgIGVsc2UgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0hFQURFUlM7CisgICAgfQorICAgIGlmIChkZXNpcmVkX2Zvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWVZVNDIwKQorICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IE1LVEFHKCdZJywgJ1YnLCAnMScsICcyJyk7CisgICAgZWxzZSBpZiAoZGVzaXJlZF9mb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lWVTQxMCkKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBNS1RBRygnWScsICdWJywgJ1UnLCAnOScpOworICAgIHN0LT5jb2RlYy0+d2lkdGggPSBzLT53aWR0aDsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICBpZiAoc3QtPmF2Z19mcmFtZV9yYXRlLmRlbikKKyAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHMtPmZyYW1lX3NpemUgKiBhdl9xMmQoc3QtPmF2Z19mcmFtZV9yYXRlKSAqIDg7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICB2NGwyX2Nsb3NlKHMtPmZkKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHY0bDJfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgc3RydWN0IHZpZGVvX2RhdGEgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGN0eC0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVkX2ZyYW1lOworICAgIGludCByZXM7CisKKyAgICBhdl9pbml0X3BhY2tldChwa3QpOworICAgIGlmICgocmVzID0gbW1hcF9yZWFkX2ZyYW1lKGN0eCwgcGt0KSkgPCAwKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKGZyYW1lICYmIHMtPmludGVybGFjZWQpIHsKKyAgICAgICAgZnJhbWUtPmludGVybGFjZWRfZnJhbWUgPSAxOworICAgICAgICBmcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ID0gcy0+dG9wX2ZpZWxkX2ZpcnN0OworICAgIH0KKworICAgIHJldHVybiBwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBpbnQgdjRsMl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqY3R4KQoreworICAgIHN0cnVjdCB2aWRlb19kYXRhICpzID0gY3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXZwcml2X2F0b21pY19pbnRfZ2V0KCZzLT5idWZmZXJzX3F1ZXVlZCkgIT0gcy0+YnVmZmVycykKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJTb21lIGJ1ZmZlcnMgYXJlIHN0aWxsIG93bmVkIGJ5IHRoZSBjYWxsZXIgb24gIgorICAgICAgICAgICAgICAgImNsb3NlLlxuIik7CisKKyAgICBtbWFwX2Nsb3NlKHMpOworCisgICAgdjRsMl9jbG9zZShzLT5mZCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKHN0cnVjdCB2aWRlb19kYXRhLCB4KQorI2RlZmluZSBERUMgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJzdGFuZGFyZCIsICAgICAic2V0IFRWIHN0YW5kYXJkLCB1c2VkIG9ubHkgYnkgYW5hbG9nIGZyYW1lIGdyYWJiZXIiLCAgICAgICBPRkZTRVQoc3RhbmRhcmQpLCAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEwgfSwgMCwgMCwgICAgICAgREVDIH0sCisgICAgeyAiY2hhbm5lbCIsICAgICAgInNldCBUViBjaGFubmVsLCB1c2VkIG9ubHkgYnkgZnJhbWUgZ3JhYmJlciIsICAgICAgICAgICAgICAgT0ZGU0VUKGNoYW5uZWwpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAtMSB9LCAgLTEsIElOVF9NQVgsIERFQyB9LAorICAgIHsgInZpZGVvX3NpemUiLCAgICJzZXQgZnJhbWUgc2l6ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVCh3aWR0aCksICAgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9IE5VTEx9LCAgMCwgMCwgICBERUMgfSwKKyAgICB7ICJwaXhlbF9mb3JtYXQiLCAic2V0IHByZWZlcnJlZCBwaXhlbCBmb3JtYXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocGl4ZWxfZm9ybWF0KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAgMCwgMCwgICAgICAgREVDIH0sCisgICAgeyAiaW5wdXRfZm9ybWF0IiwgInNldCBwcmVmZXJyZWQgcGl4ZWwgZm9ybWF0IChmb3IgcmF3IHZpZGVvKSBvciBjb2RlYyBuYW1lIiwgT0ZGU0VUKHBpeGVsX2Zvcm1hdCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgIDAsIDAsICAgICAgIERFQyB9LAorICAgIHsgImZyYW1lcmF0ZSIsICAgICJzZXQgZnJhbWUgcmF0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChmcmFtZXJhdGUpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sICAwLCAwLCAgICAgICBERUMgfSwKKworICAgIHsgImxpc3RfZm9ybWF0cyIsICJsaXN0IGF2YWlsYWJsZSBmb3JtYXRzIGFuZCBleGl0IiwgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChsaXN0X2Zvcm1hdCksICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMCB9LCAgMCwgSU5UX01BWCwgREVDLCAibGlzdF9mb3JtYXRzIiB9LAorICAgIHsgImFsbCIsICAgICAgICAgICJzaG93IGFsbCBhdmFpbGFibGUgZm9ybWF0cyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChsaXN0X2Zvcm1hdCksICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gVjRMX0FMTEZPUk1BVFMgIH0sICAgIDAsIElOVF9NQVgsIERFQywgImxpc3RfZm9ybWF0cyIgfSwKKyAgICB7ICJyYXciLCAgICAgICAgICAic2hvdyBvbmx5IG5vbi1jb21wcmVzc2VkIGZvcm1hdHMiLCAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQobGlzdF9mb3JtYXQpLCAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IFY0TF9SQVdGT1JNQVRTICB9LCAgICAwLCBJTlRfTUFYLCBERUMsICJsaXN0X2Zvcm1hdHMiIH0sCisgICAgeyAiY29tcHJlc3NlZCIsICAgInNob3cgb25seSBjb21wcmVzc2VkIGZvcm1hdHMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGxpc3RfZm9ybWF0KSwgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBWNExfQ09NUEZPUk1BVFMgfSwgICAgMCwgSU5UX01BWCwgREVDLCAibGlzdF9mb3JtYXRzIiB9LAorCisgICAgeyAibGlzdF9zdGFuZGFyZHMiLCAibGlzdCBzdXBwb3J0ZWQgc3RhbmRhcmRzIGFuZCBleGl0IiwgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGxpc3Rfc3RhbmRhcmQpLCBBVl9PUFRfVFlQRV9JTlQsICAgey5pNjQgPSAwIH0sICAwLCAxLCBERUMsICJsaXN0X3N0YW5kYXJkcyIgfSwKKyAgICB7ICJhbGwiLCAgICAgICAgICAgICJzaG93IGFsbCBzdXBwb3J0ZWQgc3RhbmRhcmRzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQobGlzdF9zdGFuZGFyZCksIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IDEgfSwgIDAsIDAsIERFQywgImxpc3Rfc3RhbmRhcmRzIiB9LAorCisgICAgeyAidGltZXN0YW1wcyIsICAgInNldCB0eXBlIG9mIHRpbWVzdGFtcHMgZm9yIGdyYWJiZWQgZnJhbWVzIiwgICAgICAgICAgICAgICAgT0ZGU0VUKHRzX21vZGUpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAwIH0sIDAsIDIsIERFQywgInRpbWVzdGFtcHMiIH0sCisgICAgeyAidHMiLCAgICAgICAgICAgInNldCB0eXBlIG9mIHRpbWVzdGFtcHMgZm9yIGdyYWJiZWQgZnJhbWVzIiwgICAgICAgICAgICAgICAgT0ZGU0VUKHRzX21vZGUpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAwIH0sIDAsIDIsIERFQywgInRpbWVzdGFtcHMiIH0sCisgICAgeyAiZGVmYXVsdCIsICAgICAgInVzZSB0aW1lc3RhbXBzIGZyb20gdGhlIGtlcm5lbCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHRzX21vZGUpLCAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBWNExfVFNfREVGQVVMVCAgfSwgMCwgMiwgREVDLCAidGltZXN0YW1wcyIgfSwKKyAgICB7ICJhYnMiLCAgICAgICAgICAidXNlIGFic29sdXRlIHRpbWVzdGFtcHMgKHdhbGwgY2xvY2spIiwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQodHNfbW9kZSksICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IFY0TF9UU19BQlMgICAgICB9LCAwLCAyLCBERUMsICJ0aW1lc3RhbXBzIiB9LAorICAgIHsgIm1vbm8yYWJzIiwgICAgICJmb3JjZSBjb252ZXJzaW9uIGZyb20gbW9ub3RvbmljIHRvIGFic29sdXRlIHRpbWVzdGFtcHMiLCAgIE9GRlNFVCh0c19tb2RlKSwgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gVjRMX1RTX01PTk8yQUJTIH0sIDAsIDIsIERFQywgInRpbWVzdGFtcHMiIH0sCisgICAgeyAidXNlX2xpYnY0bDIiLCAgInVzZSBsaWJ2NGwyICh2NGwtdXRpbHMpIGNvbnZlcnNpb24gZnVuY3Rpb25zIiwgICAgICAgICAgICAgT0ZGU0VUKHVzZV9saWJ2NGwyKSwgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAwfSwgMCwgMSwgREVDIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB2NGwyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlY0TDIgaW5kZXYiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX0lOUFVULAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl92NGwyX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZpZGVvNGxpbnV4Mix2NGwyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVmlkZW80TGludXgyIGRldmljZSBncmFiIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2aWRlb19kYXRhKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB2NGwyX3JlYWRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gdjRsMl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSB2NGwyX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHY0bDJfcmVhZF9jbG9zZSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnY0bDJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL3Y0bDJlbmMuYyBiL2ZmbXBlZy9saWJhdmRldmljZS92NGwyZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0MDY4YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS92NGwyZW5jLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2zDqW1lbnQgQsWTc2NoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ2NGwyLWNvbW1vbi5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgZmQ7Cit9IFY0TDJDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqczEpCit7CisgICAgaW50IHJlcyA9IDAsIGZsYWdzID0gT19SRFdSOworICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQgPSB7CisgICAgICAgIC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQKKyAgICB9OworICAgIFY0TDJDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jX2N0eDsKKyAgICB1aW50MzJfdCB2NGwyX3BpeGZtdDsKKworICAgIGlmIChzMS0+ZmxhZ3MgJiBBVkZNVF9GTEFHX05PTkJMT0NLKQorICAgICAgICBmbGFncyB8PSBPX05PTkJMT0NLOworCisgICAgcy0+ZmQgPSBvcGVuKHMxLT5maWxlbmFtZSwgZmxhZ3MpOworICAgIGlmIChzLT5mZCA8IDApIHsKKyAgICAgICAgcmVzID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIG9wZW4gVjRMMiBkZXZpY2UgJyVzJ1xuIiwgczEtPmZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoczEtPm5iX3N0cmVhbXMgIT0gMSB8fAorICAgICAgICBzMS0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgIHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQgICAhPSBBVl9DT0RFQ19JRF9SQVdWSURFTykgeworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJWNEwyIG91dHB1dCBkZXZpY2Ugc3VwcG9ydHMgb25seSBhIHNpbmdsZSByYXcgdmlkZW8gc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBlbmNfY3R4ID0gczEtPnN0cmVhbXNbMF0tPmNvZGVjOworCisgICAgdjRsMl9waXhmbXQgPSBmZl9mbXRfZmYydjRsKGVuY19jdHgtPnBpeF9mbXQsIEFWX0NPREVDX0lEX1JBV1ZJREVPKTsKKyAgICBpZiAoIXY0bDJfcGl4Zm10KSB7IC8vIFhYWDogdHJ5IHRvIGZvcmNlIHRoZW0gb25lIGJ5IG9uZT8KKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJVbmtub3duIFY0TDIgcGl4ZWwgZm9ybWF0IGVxdWl2YWxlbnQgZm9yICVzXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShlbmNfY3R4LT5waXhfZm10KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGlvY3RsKHMtPmZkLCBWSURJT0NfR19GTVQsICZmbXQpIDwgMCkgeworICAgICAgICByZXMgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJpb2N0bChWSURJT0NfR19GTVQpOiAlc1xuIiwgYXZfZXJyMnN0cihyZXMpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBmbXQuZm10LnBpeC53aWR0aCAgICAgICA9IGVuY19jdHgtPndpZHRoOworICAgIGZtdC5mbXQucGl4LmhlaWdodCAgICAgID0gZW5jX2N0eC0+aGVpZ2h0OworICAgIGZtdC5mbXQucGl4LnBpeGVsZm9ybWF0ID0gdjRsMl9waXhmbXQ7CisgICAgZm10LmZtdC5waXguc2l6ZWltYWdlICAgPSBhdl9pbWFnZV9nZXRfYnVmZmVyX3NpemUoZW5jX2N0eC0+cGl4X2ZtdCwgZW5jX2N0eC0+d2lkdGgsIGVuY19jdHgtPmhlaWdodCwgMSk7CisKKyAgICBpZiAoaW9jdGwocy0+ZmQsIFZJRElPQ19TX0ZNVCwgJmZtdCkgPCAwKSB7CisgICAgICAgIHJlcyA9IEFWRVJST1IoZXJybm8pOworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgImlvY3RsKFZJRElPQ19TX0ZNVCk6ICVzXG4iLCBhdl9lcnIyc3RyKHJlcykpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqczEsIEFWUGFja2V0ICpwa3QpCit7CisgICAgY29uc3QgVjRMMkNvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIGlmICh3cml0ZShzLT5mZCwgcGt0LT5kYXRhLCBwa3QtPnNpemUpID09IC0xKQorICAgICAgICByZXR1cm4gQVZFUlJPUihlcnJubyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMxKQoreworICAgIGNvbnN0IFY0TDJDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBjbG9zZShzLT5mZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHY0bDJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiVjRMMiBvdXRkZXYiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfVklERU9fT1VUUFVULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfdjRsMl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidjRsMiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZpZGVvNExpbnV4MiBvdXRwdXQgZGV2aWNlIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFY0TDJDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC52aWRlb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICA9IHdyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSB3cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnY0bDJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL3ZlcnNpb24uaCBiL2ZmbXBlZy9saWJhdmRldmljZS92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0MjdmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS92ZXJzaW9uLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWREVWSUNFX1ZFUlNJT05fSAorI2RlZmluZSBBVkRFVklDRV9WRVJTSU9OX0gKKworLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbGF2ZAorICogTGliYXZkZXZpY2UgdmVyc2lvbiBtYWNyb3MKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3ZlcnNpb24uaCIKKworI2RlZmluZSBMSUJBVkRFVklDRV9WRVJTSU9OX01BSk9SIDU2CisjZGVmaW5lIExJQkFWREVWSUNFX1ZFUlNJT05fTUlOT1IgIDMKKyNkZWZpbmUgTElCQVZERVZJQ0VfVkVSU0lPTl9NSUNSTyAxMDAKKworI2RlZmluZSBMSUJBVkRFVklDRV9WRVJTSU9OX0lOVCBBVl9WRVJTSU9OX0lOVChMSUJBVkRFVklDRV9WRVJTSU9OX01BSk9SLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWREVWSUNFX1ZFUlNJT05fTUlOT1IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCQVZERVZJQ0VfVkVSU0lPTl9NSUNSTykKKyNkZWZpbmUgTElCQVZERVZJQ0VfVkVSU0lPTiAgICAgQVZfVkVSU0lPTihMSUJBVkRFVklDRV9WRVJTSU9OX01BSk9SLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCQVZERVZJQ0VfVkVSU0lPTl9NSU5PUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWREVWSUNFX1ZFUlNJT05fTUlDUk8pCisjZGVmaW5lIExJQkFWREVWSUNFX0JVSUxEICAgICAgIExJQkFWREVWSUNFX1ZFUlNJT05fSU5UCisKKyNkZWZpbmUgTElCQVZERVZJQ0VfSURFTlQgICAgICAgIkxhdmQiIEFWX1NUUklOR0lGWShMSUJBVkRFVklDRV9WRVJTSU9OKQorCisvKioKKyAqIEZGX0FQSV8qIGRlZmluZXMgbWF5IGJlIHBsYWNlZCBiZWxvdyB0byBpbmRpY2F0ZSBwdWJsaWMgQVBJIHRoYXQgd2lsbCBiZQorICogZHJvcHBlZCBhdCBhIGZ1dHVyZSB2ZXJzaW9uIGJ1bXAuIFRoZSBkZWZpbmVzIHRoZW1zZWx2ZXMgYXJlIG5vdCBwYXJ0IG9mCisgKiB0aGUgcHVibGljIEFQSSBhbmQgbWF5IGNoYW5nZSwgYnJlYWsgb3IgZGlzYXBwZWFyIGF0IGFueSB0aW1lLgorICovCisKKyNlbmRpZiAvKiBBVkRFVklDRV9WRVJTSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmRldmljZS92ZndjYXAuYyBiL2ZmbXBlZy9saWJhdmRldmljZS92ZndjYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGZiNDhiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3Zmd2NhcC5jCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogVkZXIGNhcHR1cmUgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBSYW1pcm8gUG9sbGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx2ZncuaD4KKyNpbmNsdWRlICJhdmRldmljZS5oIgorCisvKiBTb21lIG9ic29sZXRlIHZlcnNpb25zIG9mIE1pbkdXMzIgYmVmb3JlIDQuMC4wIGxhY2sgdGhpcy4gKi8KKyNpZm5kZWYgSFdORF9NRVNTQUdFCisjZGVmaW5lIEhXTkRfTUVTU0FHRSAoKEhXTkQpIC0zKQorI2VuZGlmCisKK3N0cnVjdCB2ZndfY3R4IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBIV05EIGh3bmQ7CisgICAgSEFORExFIG11dGV4OworICAgIEhBTkRMRSBldmVudDsKKyAgICBBVlBhY2tldExpc3QgKnBrdGw7CisgICAgdW5zaWduZWQgaW50IGN1cmJ1ZnNpemU7CisgICAgdW5zaWduZWQgaW50IGZyYW1lX251bTsKKyAgICBjaGFyICp2aWRlb19zaXplOyAgICAgICAvKio8IEEgc3RyaW5nIGRlc2NyaWJpbmcgdmlkZW8gc2l6ZSwgc2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uICovCisgICAgY2hhciAqZnJhbWVyYXRlOyAgICAgICAgLyoqPCBTZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4gKi8KK307CisKK3N0YXRpYyBlbnVtIEFWUGl4ZWxGb3JtYXQgdmZ3X3BpeGZtdChEV09SRCBiaUNvbXByZXNzaW9uLCBXT1JEIGJpQml0Q291bnQpCit7CisgICAgc3dpdGNoKGJpQ29tcHJlc3Npb24pIHsKKyAgICBjYXNlIE1LVEFHKCdVJywgJ1knLCAnVicsICdZJyk6CisgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX1VZVlk0MjI7CisgICAgY2FzZSBNS1RBRygnWScsICdVJywgJ1knLCAnMicpOgorICAgICAgICByZXR1cm4gQVZfUElYX0ZNVF9ZVVlWNDIyOworICAgIGNhc2UgTUtUQUcoJ0knLCAnNCcsICcyJywgJzAnKToKKyAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICBjYXNlIEJJX1JHQjoKKyAgICAgICAgc3dpdGNoKGJpQml0Q291bnQpIHsgLyogMS04IGFyZSB1bnRlc3RlZCAqLworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX01PTk9XSElURTsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZfUElYX0ZNVF9SR0I0OworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX1JHQjg7CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX1JHQjU1NTsKKyAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfQkdSMjQ7CisgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX1JHQjMyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7Cit9CisKK3N0YXRpYyBlbnVtIEFWQ29kZWNJRCB2ZndfY29kZWNpZChEV09SRCBiaUNvbXByZXNzaW9uKQoreworICAgIHN3aXRjaChiaUNvbXByZXNzaW9uKSB7CisgICAgY2FzZSBNS1RBRygnZCcsICd2JywgJ3MnLCAnZCcpOgorICAgICAgICByZXR1cm4gQVZfQ09ERUNfSURfRFZWSURFTzsKKyAgICBjYXNlIE1LVEFHKCdNJywgJ0onLCAnUCcsICdHJyk6CisgICAgY2FzZSBNS1RBRygnbScsICdqJywgJ3AnLCAnZycpOgorICAgICAgICByZXR1cm4gQVZfQ09ERUNfSURfTUpQRUc7CisgICAgfQorICAgIHJldHVybiBBVl9DT0RFQ19JRF9OT05FOworfQorCisjZGVmaW5lIGRzdHJ1Y3QocGN0eCwgc25hbWUsIHZhciwgdHlwZSkgXAorICAgIGF2X2xvZyhwY3R4LCBBVl9MT0dfREVCVUcsICN2YXIiOlx0JSJ0eXBlIlxuIiwgc25hbWUtPnZhcikKKworc3RhdGljIHZvaWQgZHVtcF9jYXB0dXJlcGFybXMoQVZGb3JtYXRDb250ZXh0ICpzLCBDQVBUVVJFUEFSTVMgKmNwYXJtcykKK3sKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiQ0FQVFVSRVBBUk1TXG4iKTsKKyAgICBkc3RydWN0KHMsIGNwYXJtcywgZHdSZXF1ZXN0TWljcm9TZWNQZXJGcmFtZSwgImx1Iik7CisgICAgZHN0cnVjdChzLCBjcGFybXMsIGZNYWtlVXNlckhpdE9LVG9DYXB0dXJlLCAiZCIpOworICAgIGRzdHJ1Y3QocywgY3Bhcm1zLCB3UGVyY2VudERyb3BGb3JFcnJvciwgInUiKTsKKyAgICBkc3RydWN0KHMsIGNwYXJtcywgZllpZWxkLCAiZCIpOworICAgIGRzdHJ1Y3QocywgY3Bhcm1zLCBkd0luZGV4U2l6ZSwgImx1Iik7CisgICAgZHN0cnVjdChzLCBjcGFybXMsIHdDaHVua0dyYW51bGFyaXR5LCAidSIpOworICAgIGRzdHJ1Y3QocywgY3Bhcm1zLCBmVXNpbmdET1NNZW1vcnksICJkIik7CisgICAgZHN0cnVjdChzLCBjcGFybXMsIHdOdW1WaWRlb1JlcXVlc3RlZCwgInUiKTsKKyAgICBkc3RydWN0KHMsIGNwYXJtcywgZkNhcHR1cmVBdWRpbywgImQiKTsKKyAgICBkc3RydWN0KHMsIGNwYXJtcywgd051bUF1ZGlvUmVxdWVzdGVkLCAidSIpOworICAgIGRzdHJ1Y3QocywgY3Bhcm1zLCB2S2V5QWJvcnQsICJ1Iik7CisgICAgZHN0cnVjdChzLCBjcGFybXMsIGZBYm9ydExlZnRNb3VzZSwgImQiKTsKKyAgICBkc3RydWN0KHMsIGNwYXJtcywgZkFib3J0UmlnaHRNb3VzZSwgImQiKTsKKyAgICBkc3RydWN0KHMsIGNwYXJtcywgZkxpbWl0RW5hYmxlZCwgImQiKTsKKyAgICBkc3RydWN0KHMsIGNwYXJtcywgd1RpbWVMaW1pdCwgInUiKTsKKyAgICBkc3RydWN0KHMsIGNwYXJtcywgZk1DSUNvbnRyb2wsICJkIik7CisgICAgZHN0cnVjdChzLCBjcGFybXMsIGZTdGVwTUNJRGV2aWNlLCAiZCIpOworICAgIGRzdHJ1Y3QocywgY3Bhcm1zLCBkd01DSVN0YXJ0VGltZSwgImx1Iik7CisgICAgZHN0cnVjdChzLCBjcGFybXMsIGR3TUNJU3RvcFRpbWUsICJsdSIpOworICAgIGRzdHJ1Y3QocywgY3Bhcm1zLCBmU3RlcENhcHR1cmVBdDJ4LCAiZCIpOworICAgIGRzdHJ1Y3QocywgY3Bhcm1zLCB3U3RlcENhcHR1cmVBdmVyYWdlRnJhbWVzLCAidSIpOworICAgIGRzdHJ1Y3QocywgY3Bhcm1zLCBkd0F1ZGlvQnVmZmVyU2l6ZSwgImx1Iik7CisgICAgZHN0cnVjdChzLCBjcGFybXMsIGZEaXNhYmxlV3JpdGVDYWNoZSwgImQiKTsKKyAgICBkc3RydWN0KHMsIGNwYXJtcywgQVZTdHJlYW1NYXN0ZXIsICJ1Iik7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfdmlkZW9oZHIoQVZGb3JtYXRDb250ZXh0ICpzLCBWSURFT0hEUiAqdmhkcikKK3sKKyNpZmRlZiBERUJVRworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJWSURFT0hEUlxuIik7CisgICAgZHN0cnVjdChzLCB2aGRyLCBscERhdGEsICJwIik7CisgICAgZHN0cnVjdChzLCB2aGRyLCBkd0J1ZmZlckxlbmd0aCwgImx1Iik7CisgICAgZHN0cnVjdChzLCB2aGRyLCBkd0J5dGVzVXNlZCwgImx1Iik7CisgICAgZHN0cnVjdChzLCB2aGRyLCBkd1RpbWVDYXB0dXJlZCwgImx1Iik7CisgICAgZHN0cnVjdChzLCB2aGRyLCBkd1VzZXIsICJsdSIpOworICAgIGRzdHJ1Y3QocywgdmhkciwgZHdGbGFncywgImx1Iik7CisgICAgZHN0cnVjdChzLCB2aGRyLCBkd1Jlc2VydmVkWzBdLCAibHUiKTsKKyAgICBkc3RydWN0KHMsIHZoZHIsIGR3UmVzZXJ2ZWRbMV0sICJsdSIpOworICAgIGRzdHJ1Y3QocywgdmhkciwgZHdSZXNlcnZlZFsyXSwgImx1Iik7CisgICAgZHN0cnVjdChzLCB2aGRyLCBkd1Jlc2VydmVkWzNdLCAibHUiKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBkdW1wX2JpaChBVkZvcm1hdENvbnRleHQgKnMsIEJJVE1BUElORk9IRUFERVIgKmJpaCkKK3sKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiQklUTUFQSU5GT0hFQURFUlxuIik7CisgICAgZHN0cnVjdChzLCBiaWgsIGJpU2l6ZSwgImx1Iik7CisgICAgZHN0cnVjdChzLCBiaWgsIGJpV2lkdGgsICJsZCIpOworICAgIGRzdHJ1Y3QocywgYmloLCBiaUhlaWdodCwgImxkIik7CisgICAgZHN0cnVjdChzLCBiaWgsIGJpUGxhbmVzLCAiZCIpOworICAgIGRzdHJ1Y3QocywgYmloLCBiaUJpdENvdW50LCAiZCIpOworICAgIGRzdHJ1Y3QocywgYmloLCBiaUNvbXByZXNzaW9uLCAibHUiKTsKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiICAgIGJpQ29tcHJlc3Npb246XHRcIiUuNHNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAoY2hhciopICZiaWgtPmJpQ29tcHJlc3Npb24pOworICAgIGRzdHJ1Y3QocywgYmloLCBiaVNpemVJbWFnZSwgImx1Iik7CisgICAgZHN0cnVjdChzLCBiaWgsIGJpWFBlbHNQZXJNZXRlciwgImx1Iik7CisgICAgZHN0cnVjdChzLCBiaWgsIGJpWVBlbHNQZXJNZXRlciwgImx1Iik7CisgICAgZHN0cnVjdChzLCBiaWgsIGJpQ2xyVXNlZCwgImx1Iik7CisgICAgZHN0cnVjdChzLCBiaWgsIGJpQ2xySW1wb3J0YW50LCAibHUiKTsKK30KKworc3RhdGljIGludCBzaGFsbF93ZV9kcm9wKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBzdHJ1Y3QgdmZ3X2N0eCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRyb3BzY29yZVtdID0gezYyLCA3NSwgODcsIDEwMH07CisgICAgY29uc3QgaW50IG5kcm9wc2NvcmVzID0gRkZfQVJSQVlfRUxFTVMoZHJvcHNjb3JlKTsKKyAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX2Z1bGxuZXNzID0gKGN0eC0+Y3VyYnVmc2l6ZSoxMDApL3MtPm1heF9waWN0dXJlX2J1ZmZlcjsKKworICAgIGlmKGRyb3BzY29yZVsrK2N0eC0+ZnJhbWVfbnVtJW5kcm9wc2NvcmVzXSA8PSBidWZmZXJfZnVsbG5lc3MpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgInJlYWwtdGltZSBidWZmZXIgJWQlJSBmdWxsISBmcmFtZSBkcm9wcGVkIVxuIiwgYnVmZmVyX2Z1bGxuZXNzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBMUkVTVUxUIENBTExCQUNLIHZpZGVvc3RyZWFtX2NiKEhXTkQgaHduZCwgTFBWSURFT0hEUiB2ZGhkcikKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKnM7CisgICAgc3RydWN0IHZmd19jdHggKmN0eDsKKyAgICBBVlBhY2tldExpc3QgKipwcGt0bCwgKnBrdGxfbmV4dDsKKworICAgIHMgPSAoQVZGb3JtYXRDb250ZXh0ICopIEdldFdpbmRvd0xvbmdQdHIoaHduZCwgR1dMUF9VU0VSREFUQSk7CisgICAgY3R4ID0gcy0+cHJpdl9kYXRhOworCisgICAgZHVtcF92aWRlb2hkcihzLCB2ZGhkcik7CisKKyAgICBpZihzaGFsbF93ZV9kcm9wKHMpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGN0eC0+bXV0ZXgsIElORklOSVRFKTsKKworICAgIHBrdGxfbmV4dCA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWUGFja2V0TGlzdCkpOworICAgIGlmKCFwa3RsX25leHQpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmKGF2X25ld19wYWNrZXQoJnBrdGxfbmV4dC0+cGt0LCB2ZGhkci0+ZHdCeXRlc1VzZWQpIDwgMCkgeworICAgICAgICBhdl9mcmVlKHBrdGxfbmV4dCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBwa3RsX25leHQtPnBrdC5wdHMgPSB2ZGhkci0+ZHdUaW1lQ2FwdHVyZWQ7CisgICAgbWVtY3B5KHBrdGxfbmV4dC0+cGt0LmRhdGEsIHZkaGRyLT5scERhdGEsIHZkaGRyLT5kd0J5dGVzVXNlZCk7CisKKyAgICBmb3IocHBrdGwgPSAmY3R4LT5wa3RsIDsgKnBwa3RsIDsgcHBrdGwgPSAmKCpwcGt0bCktPm5leHQpOworICAgICpwcGt0bCA9IHBrdGxfbmV4dDsKKworICAgIGN0eC0+Y3VyYnVmc2l6ZSArPSB2ZGhkci0+ZHdCeXRlc1VzZWQ7CisKKyAgICBTZXRFdmVudChjdHgtPmV2ZW50KTsKKyAgICBSZWxlYXNlTXV0ZXgoY3R4LT5tdXRleCk7CisKKyAgICByZXR1cm4gVFJVRTsKK2ZhaWw6CisgICAgUmVsZWFzZU11dGV4KGN0eC0+bXV0ZXgpOworICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludCB2ZndfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgc3RydWN0IHZmd19jdHggKmN0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlBhY2tldExpc3QgKnBrdGw7CisKKyAgICBpZihjdHgtPmh3bmQpIHsKKyAgICAgICAgU2VuZE1lc3NhZ2UoY3R4LT5od25kLCBXTV9DQVBfU0VUX0NBTExCQUNLX1ZJREVPU1RSRUFNLCAwLCAwKTsKKyAgICAgICAgU2VuZE1lc3NhZ2UoY3R4LT5od25kLCBXTV9DQVBfRFJJVkVSX0RJU0NPTk5FQ1QsIDAsIDApOworICAgICAgICBEZXN0cm95V2luZG93KGN0eC0+aHduZCk7CisgICAgfQorICAgIGlmKGN0eC0+bXV0ZXgpCisgICAgICAgIENsb3NlSGFuZGxlKGN0eC0+bXV0ZXgpOworICAgIGlmKGN0eC0+ZXZlbnQpCisgICAgICAgIENsb3NlSGFuZGxlKGN0eC0+ZXZlbnQpOworCisgICAgcGt0bCA9IGN0eC0+cGt0bDsKKyAgICB3aGlsZSAocGt0bCkgeworICAgICAgICBBVlBhY2tldExpc3QgKm5leHQgPSBwa3RsLT5uZXh0OworICAgICAgICBhdl9mcmVlX3BhY2tldCgmcGt0bC0+cGt0KTsKKyAgICAgICAgYXZfZnJlZShwa3RsKTsKKyAgICAgICAgcGt0bCA9IG5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmZ3X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBzdHJ1Y3QgdmZ3X2N0eCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYzsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IGRldm51bTsKKyAgICBpbnQgYmlzaXplOworICAgIEJJVE1BUElORk8gKmJpID0gTlVMTDsKKyAgICBDQVBUVVJFUEFSTVMgY3Bhcm1zOworICAgIERXT1JEIGJpQ29tcHJlc3Npb247CisgICAgV09SRCBiaUJpdENvdW50OworICAgIGludCByZXQ7CisgICAgQVZSYXRpb25hbCBmcmFtZXJhdGVfcTsKKworICAgIGlmICghc3RyY21wKHMtPmZpbGVuYW1lLCAibGlzdCIpKSB7CisgICAgICAgIGZvciAoZGV2bnVtID0gMDsgZGV2bnVtIDw9IDk7IGRldm51bSsrKSB7CisgICAgICAgICAgICBjaGFyIGRyaXZlcl9uYW1lWzI1Nl07CisgICAgICAgICAgICBjaGFyIGRyaXZlcl92ZXJbMjU2XTsKKyAgICAgICAgICAgIHJldCA9IGNhcEdldERyaXZlckRlc2NyaXB0aW9uKGRldm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcl9uYW1lLCBzaXplb2YoZHJpdmVyX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyX3Zlciwgc2l6ZW9mKGRyaXZlcl92ZXIpKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJEcml2ZXIgJWRcbiIsIGRldm51bSk7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiICVzXG4iLCBkcml2ZXJfbmFtZSk7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiICVzXG4iLCBkcml2ZXJfdmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGN0eC0+aHduZCA9IGNhcENyZWF0ZUNhcHR1cmVXaW5kb3coTlVMTCwgMCwgMCwgMCwgMCwgMCwgSFdORF9NRVNTQUdFLCAwKTsKKyAgICBpZighY3R4LT5od25kKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIGNhcHR1cmUgd2luZG93LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgLyogSWYgYXRvaSBmYWlscywgZGV2bnVtPT0wIGFuZCB0aGUgZGVmYXVsdCBkZXZpY2UgaXMgdXNlZCAqLworICAgIGRldm51bSA9IGF0b2kocy0+ZmlsZW5hbWUpOworCisgICAgcmV0ID0gU2VuZE1lc3NhZ2UoY3R4LT5od25kLCBXTV9DQVBfRFJJVkVSX0NPTk5FQ1QsIGRldm51bSwgMCk7CisgICAgaWYoIXJldCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gZGV2aWNlLlxuIik7CisgICAgICAgIERlc3Ryb3lXaW5kb3coY3R4LT5od25kKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PREVWKTsKKyAgICB9CisKKyAgICBTZW5kTWVzc2FnZShjdHgtPmh3bmQsIFdNX0NBUF9TRVRfT1ZFUkxBWSwgMCwgMCk7CisgICAgU2VuZE1lc3NhZ2UoY3R4LT5od25kLCBXTV9DQVBfU0VUX1BSRVZJRVcsIDAsIDApOworCisgICAgcmV0ID0gU2VuZE1lc3NhZ2UoY3R4LT5od25kLCBXTV9DQVBfU0VUX0NBTExCQUNLX1ZJREVPU1RSRUFNLCAwLAorICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pIHZpZGVvc3RyZWFtX2NiKTsKKyAgICBpZighcmV0KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgc2V0IHZpZGVvIHN0cmVhbSBjYWxsYmFjay5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgU2V0V2luZG93TG9uZ1B0cihjdHgtPmh3bmQsIEdXTFBfVVNFUkRBVEEsIChMT05HX1BUUikgcyk7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYoIXN0KSB7CisgICAgICAgIHZmd19yZWFkX2Nsb3NlKHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIC8qIFNldCB2aWRlbyBmb3JtYXQgKi8KKyAgICBiaXNpemUgPSBTZW5kTWVzc2FnZShjdHgtPmh3bmQsIFdNX0NBUF9HRVRfVklERU9GT1JNQVQsIDAsIDApOworICAgIGlmKCFiaXNpemUpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBiaSA9IGF2X21hbGxvYyhiaXNpemUpOworICAgIGlmKCFiaSkgeworICAgICAgICB2ZndfcmVhZF9jbG9zZShzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgcmV0ID0gU2VuZE1lc3NhZ2UoY3R4LT5od25kLCBXTV9DQVBfR0VUX1ZJREVPRk9STUFULCBiaXNpemUsIChMUEFSQU0pIGJpKTsKKyAgICBpZighcmV0KQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBkdW1wX2JpaChzLCAmYmktPmJtaUhlYWRlcik7CisKKyAgICByZXQgPSBhdl9wYXJzZV92aWRlb19yYXRlKCZmcmFtZXJhdGVfcSwgY3R4LT5mcmFtZXJhdGUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgcGFyc2UgZnJhbWVyYXRlICclcycuXG4iLCBjdHgtPmZyYW1lcmF0ZSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoY3R4LT52aWRlb19zaXplKSB7CisgICAgICAgIHJldCA9IGF2X3BhcnNlX3ZpZGVvX3NpemUoJmJpLT5ibWlIZWFkZXIuYmlXaWR0aCwgJmJpLT5ibWlIZWFkZXIuYmlIZWlnaHQsIGN0eC0+dmlkZW9fc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGRuJ3QgcGFyc2UgdmlkZW8gc2l6ZS5cbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKDApIHsKKyAgICAgICAgLyogRm9yIHRlc3RpbmcgeWV0IHVuc3VwcG9ydGVkIGNvbXByZXNzaW9ucworICAgICAgICAgKiBDb3B5IHRoZXNlIHZhbHVlcyBmcm9tIHVzZXItc3VwcGxpZWQgdmVyYm9zZSBpbmZvcm1hdGlvbiAqLworICAgICAgICBiaS0+Ym1pSGVhZGVyLmJpV2lkdGggICAgICAgPSAzMjA7CisgICAgICAgIGJpLT5ibWlIZWFkZXIuYmlIZWlnaHQgICAgICA9IDI0MDsKKyAgICAgICAgYmktPmJtaUhlYWRlci5iaVBsYW5lcyAgICAgID0gMTsKKyAgICAgICAgYmktPmJtaUhlYWRlci5iaUJpdENvdW50ICAgID0gMTI7CisgICAgICAgIGJpLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IE1LVEFHKCdJJywnNCcsJzInLCcwJyk7CisgICAgICAgIGJpLT5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgICA9IDExNTIwMDsKKyAgICAgICAgZHVtcF9iaWgocywgJmJpLT5ibWlIZWFkZXIpOworICAgIH0KKworICAgIHJldCA9IFNlbmRNZXNzYWdlKGN0eC0+aHduZCwgV01fQ0FQX1NFVF9WSURFT0ZPUk1BVCwgYmlzaXplLCAoTFBBUkFNKSBiaSk7CisgICAgaWYoIXJldCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHNldCBWaWRlbyBGb3JtYXQuXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGJpQ29tcHJlc3Npb24gPSBiaS0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb247CisgICAgYmlCaXRDb3VudCA9IGJpLT5ibWlIZWFkZXIuYmlCaXRDb3VudDsKKworICAgIC8qIFNldCBzZXF1ZW5jZSBzZXR1cCAqLworICAgIHJldCA9IFNlbmRNZXNzYWdlKGN0eC0+aHduZCwgV01fQ0FQX0dFVF9TRVFVRU5DRV9TRVRVUCwgc2l6ZW9mKGNwYXJtcyksCisgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkgJmNwYXJtcyk7CisgICAgaWYoIXJldCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZHVtcF9jYXB0dXJlcGFybXMocywgJmNwYXJtcyk7CisKKyAgICBjcGFybXMuZllpZWxkID0gMTsgLy8gU3Bhd24gYSBiYWNrZ3JvdW5kIHRocmVhZAorICAgIGNwYXJtcy5kd1JlcXVlc3RNaWNyb1NlY1BlckZyYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVyYXRlX3EuZGVuKjEwMDAwMDApIC8gZnJhbWVyYXRlX3EubnVtOworICAgIGNwYXJtcy5mQWJvcnRMZWZ0TW91c2UgPSAwOworICAgIGNwYXJtcy5mQWJvcnRSaWdodE1vdXNlID0gMDsKKyAgICBjcGFybXMuZkNhcHR1cmVBdWRpbyA9IDA7CisgICAgY3Bhcm1zLnZLZXlBYm9ydCA9IDA7CisKKyAgICByZXQgPSBTZW5kTWVzc2FnZShjdHgtPmh3bmQsIFdNX0NBUF9TRVRfU0VRVUVOQ0VfU0VUVVAsIHNpemVvZihjcGFybXMpLAorICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pICZjcGFybXMpOworICAgIGlmKCFyZXQpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGNvZGVjID0gc3QtPmNvZGVjOworICAgIGNvZGVjLT50aW1lX2Jhc2UgPSBhdl9pbnZfcShmcmFtZXJhdGVfcSk7CisgICAgY29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgY29kZWMtPndpZHRoICA9IGJpLT5ibWlIZWFkZXIuYmlXaWR0aDsKKyAgICBjb2RlYy0+aGVpZ2h0ID0gYmktPmJtaUhlYWRlci5iaUhlaWdodDsKKyAgICBjb2RlYy0+cGl4X2ZtdCA9IHZmd19waXhmbXQoYmlDb21wcmVzc2lvbiwgYmlCaXRDb3VudCk7CisgICAgaWYoY29kZWMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IHZmd19jb2RlY2lkKGJpQ29tcHJlc3Npb24pOworICAgICAgICBpZihjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVua25vd24gY29tcHJlc3Npb24gdHlwZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHJlcG9ydCB2ZXJib3NlICgtdiA5KSBkZWJ1ZyBpbmZvcm1hdGlvbi5cbiIpOworICAgICAgICAgICAgdmZ3X3JlYWRfY2xvc2Uocyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICAgICAgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGJpQml0Q291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgICAgIGlmKGJpQ29tcHJlc3Npb24gPT0gQklfUkdCKSB7CisgICAgICAgICAgICBjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYmlCaXRDb3VudDsKKyAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGEgPSBhdl9tYWxsb2MoOSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgaWYgKGNvZGVjLT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgICAgICBjb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSA5OworICAgICAgICAgICAgICAgIG1lbWNweShjb2RlYy0+ZXh0cmFkYXRhLCAiQm90dG9tVXAiLCA5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2ZyZWVwKCZiaSk7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgMTAwMCk7CisKKyAgICBjdHgtPm11dGV4ID0gQ3JlYXRlTXV0ZXgoTlVMTCwgMCwgTlVMTCk7CisgICAgaWYoIWN0eC0+bXV0ZXgpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgTXV0ZXguXG4iICk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgY3R4LT5ldmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIDEsIDAsIE5VTEwpOworICAgIGlmKCFjdHgtPmV2ZW50KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIEV2ZW50LlxuIiApOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gU2VuZE1lc3NhZ2UoY3R4LT5od25kLCBXTV9DQVBfU0VRVUVOQ0VfTk9GSUxFLCAwLCAwKTsKKyAgICBpZighcmV0KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgc3RhcnQgY2FwdHVyZSBzZXF1ZW5jZS5cbiIgKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2ZyZWVwKCZiaSk7CisgICAgdmZ3X3JlYWRfY2xvc2Uocyk7CisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworc3RhdGljIGludCB2ZndfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIHN0cnVjdCB2ZndfY3R4ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQVZQYWNrZXRMaXN0ICpwa3RsID0gTlVMTDsKKworICAgIHdoaWxlKCFwa3RsKSB7CisgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoY3R4LT5tdXRleCwgSU5GSU5JVEUpOworICAgICAgICBwa3RsID0gY3R4LT5wa3RsOworICAgICAgICBpZihjdHgtPnBrdGwpIHsKKyAgICAgICAgICAgICpwa3QgPSBjdHgtPnBrdGwtPnBrdDsKKyAgICAgICAgICAgIGN0eC0+cGt0bCA9IGN0eC0+cGt0bC0+bmV4dDsKKyAgICAgICAgICAgIGF2X2ZyZWUocGt0bCk7CisgICAgICAgIH0KKyAgICAgICAgUmVzZXRFdmVudChjdHgtPmV2ZW50KTsKKyAgICAgICAgUmVsZWFzZU11dGV4KGN0eC0+bXV0ZXgpOworICAgICAgICBpZighcGt0bCkgeworICAgICAgICAgICAgaWYocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX05PTkJMT0NLKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChjdHgtPmV2ZW50LCBJTkZJTklURSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdHgtPmN1cmJ1ZnNpemUgLT0gcGt0LT5zaXplOworCisgICAgcmV0dXJuIHBrdC0+c2l6ZTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2Yoc3RydWN0IHZmd19jdHgsIHgpCisjZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJ2aWRlb19zaXplIiwgIkEgc3RyaW5nIGRlc2NyaWJpbmcgZnJhbWUgc2l6ZSwgc3VjaCBhcyA2NDB4NDgwIG9yIGhkNzIwLiIsIE9GRlNFVCh2aWRlb19zaXplKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBERUMgfSwKKyAgICB7ICJmcmFtZXJhdGUiLCAiIiwgT0ZGU0VUKGZyYW1lcmF0ZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAibnRzYyJ9LCAwLCAwLCBERUMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHZmd19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJWRlcgaW5kZXYiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX0lOUFVUCit9OworCitBVklucHV0Rm9ybWF0IGZmX3Zmd2NhcF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2ZndjYXAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWZlcgdmlkZW8gY2FwdHVyZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmZ3X2N0eCksCisgICAgLnJlYWRfaGVhZGVyICAgID0gdmZ3X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHZmd19yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSB2ZndfcmVhZF9jbG9zZSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnZmd19jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZkZXZpY2UveDExZ3JhYi5jIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3gxMWdyYWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTgzM2ViCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3gxMWdyYWIuYwpAQCAtMCwwICsxLDY5MiBAQAorLyoKKyAqIFgxMSB2aWRlbyBncmFiIGludGVyZmFjZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaW50ZWdyYXRpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ2xlbWVucyBGcnVod2lydGggPGNsZW1lbnNAZW5kb3JwaGluLm9yZz4KKyAqICAgICAgICAgICAgICAgICAgICBFZG91YXJkIEdvbWV6IDxlZC5nb21lekBmcmVlLmZyPgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZyb20gZ3JhYi5jOgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZnJvbSB0aGUgeHZpZGNhcCBwcm9qZWN0OgorICogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTggUmFzY2EsIEJlcmxpbgorICogICAgICAgICAgICAgICAyMDAzLTIwMDQgS2FybCBILiBCZWNrZXJzLCBGcmFua2Z1cnQKKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogWDExIGZyYW1lIGRldmljZSBkZW11eGVyCisgKiBAYXV0aG9yIENsZW1lbnMgRnJ1aHdpcnRoIDxjbGVtZW5zQGVuZG9ycGhpbi5vcmc+CisgKiBAYXV0aG9yIEVkb3VhcmQgR29tZXogPGVkLmdvbWV6QGZyZWUuZnI+CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9zaG0uaD4KKworI2luY2x1ZGUgPFgxMS9jdXJzb3Jmb250Lmg+CisjaW5jbHVkZSA8WDExL1guaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YbGliaW50Lmg+CisjaW5jbHVkZSA8WDExL1hwcm90by5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2hhcGUuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YZml4ZXMuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YU2htLmg+CisKKyNpbmNsdWRlICJhdmRldmljZS5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorCisvKiogWDExIGRldmljZSBkZW11eGVyIGNvbnRleHQgKi8KK3R5cGVkZWYgc3RydWN0IFgxMUdyYWJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsgICAgLyoqPCBDbGFzcyBmb3IgcHJpdmF0ZSBvcHRpb25zLiAqLworICAgIGludCBmcmFtZV9zaXplOyAgICAgICAgICAvKio8IFNpemUgaW4gYnl0ZXMgb2YgYSBncmFiYmVkIGZyYW1lICovCisgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7ICAgIC8qKjwgVGltZSBiYXNlICovCisgICAgaW50NjRfdCB0aW1lX2ZyYW1lOyAgICAgIC8qKjwgQ3VycmVudCB0aW1lICovCisKKyAgICBpbnQgd2lkdGg7ICAgICAgICAgICAgICAgLyoqPCBXaWR0aCBvZiB0aGUgZ3JhYiBmcmFtZSAqLworICAgIGludCBoZWlnaHQ7ICAgICAgICAgICAgICAvKio8IEhlaWdodCBvZiB0aGUgZ3JhYiBmcmFtZSAqLworICAgIGludCB4X29mZjsgICAgICAgICAgICAgICAvKio8IEhvcml6b250YWwgdG9wLWxlZnQgY29ybmVyIGNvb3JkaW5hdGUgKi8KKyAgICBpbnQgeV9vZmY7ICAgICAgICAgICAgICAgLyoqPCBWZXJ0aWNhbCB0b3AtbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSAqLworCisgICAgRGlzcGxheSAqZHB5OyAgICAgICAgICAgIC8qKjwgWDExIGRpc3BsYXkgZnJvbSB3aGljaCB4MTFncmFiIGdyYWJzIGZyYW1lcyAqLworICAgIFhJbWFnZSAqaW1hZ2U7ICAgICAgICAgICAvKio8IFgxMSBpbWFnZSBob2xkaW5nIHRoZSBncmFiICovCisgICAgaW50IHVzZV9zaG07ICAgICAgICAgICAgIC8qKjwgITAgd2hlbiB1c2luZyBYU2htIGV4dGVuc2lvbiAqLworICAgIFhTaG1TZWdtZW50SW5mbyBzaG1pbmZvOyAvKio8IFdoZW4gdXNpbmcgWFNobSwga2VlcHMgdHJhY2sgb2YgWFNobSBpbmZvcyAqLworICAgIGludCBkcmF3X21vdXNlOyAgICAgICAgICAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLworICAgIGludCBmb2xsb3dfbW91c2U7ICAgICAgICAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLworICAgIGludCBzaG93X3JlZ2lvbjsgICAgICAgICAvKio8IHNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLworICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOyAgICAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLworICAgIGludCBwYWxldHRlX2NoYW5nZWQ7CisgICAgdWludDMyX3QgcGFsZXR0ZVsyNTZdOworCisgICAgQ3Vyc29yIGM7CisgICAgV2luZG93IHJlZ2lvbl93aW47ICAgICAgIC8qKjwgVGhpcyBpcyB1c2VkIGJ5IHNob3dfcmVnaW9uIG9wdGlvbi4gKi8KK30gWDExR3JhYkNvbnRleHQ7CisKKyNkZWZpbmUgUkVHSU9OX1dJTl9CT1JERVIgMworCisvKioKKyAqIERyYXcgZ3JhYmJpbmcgcmVnaW9uIHdpbmRvdworICoKKyAqIEBwYXJhbSBzIHgxMWdyYWIgY29udGV4dAorICovCitzdGF0aWMgdm9pZCB4MTFncmFiX2RyYXdfcmVnaW9uX3dpbihYMTFHcmFiQ29udGV4dCAqcykKK3sKKyAgICBEaXNwbGF5ICpkcHkgPSBzLT5kcHk7CisgICAgV2luZG93IHdpbiAgID0gcy0+cmVnaW9uX3dpbjsKKyAgICBpbnQgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkcHkpOworICAgIEdDIGdjID0gWENyZWF0ZUdDKGRweSwgd2luLCAwLCAwKTsKKworICAgIFhTZXRGb3JlZ3JvdW5kKGRweSwgZ2MsIFdoaXRlUGl4ZWwoZHB5LCBzY3JlZW4pKTsKKyAgICBYU2V0QmFja2dyb3VuZChkcHksIGdjLCBCbGFja1BpeGVsKGRweSwgc2NyZWVuKSk7CisgICAgWFNldExpbmVBdHRyaWJ1dGVzKGRweSwgZ2MsIFJFR0lPTl9XSU5fQk9SREVSLCBMaW5lRG91YmxlRGFzaCwgMCwgMCk7CisgICAgWERyYXdSZWN0YW5nbGUoZHB5LCB3aW4sIGdjLCAxLCAxLAorICAgICAgICAgICAgICAgICAgIChzLT53aWR0aCAgKyBSRUdJT05fV0lOX0JPUkRFUiAqIDIpIC0gMSAqIDIgLSAxLAorICAgICAgICAgICAgICAgICAgIChzLT5oZWlnaHQgKyBSRUdJT05fV0lOX0JPUkRFUiAqIDIpIC0gMSAqIDIgLSAxKTsKKyAgICBYRnJlZUdDKGRweSwgZ2MpOworfQorCisvKioKKyAqIEluaXRpYWxpemUgZ3JhYmJpbmcgcmVnaW9uIHdpbmRvdworICoKKyAqIEBwYXJhbSBzIHgxMWdyYWIgY29udGV4dAorICovCitzdGF0aWMgdm9pZCB4MTFncmFiX3JlZ2lvbl93aW5faW5pdChYMTFHcmFiQ29udGV4dCAqcykKK3sKKyAgICBEaXNwbGF5ICpkcHkgPSBzLT5kcHk7CisgICAgWFJlY3RhbmdsZSByZWN0OworICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnMgPSB7IC5vdmVycmlkZV9yZWRpcmVjdCA9IFRydWUgfTsKKyAgICBpbnQgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkcHkpOworCisgICAgcy0+cmVnaW9uX3dpbiA9IFhDcmVhdGVXaW5kb3coZHB5LCBSb290V2luZG93KGRweSwgc2NyZWVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT54X29mZiAgLSBSRUdJT05fV0lOX0JPUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT55X29mZiAgLSBSRUdJT05fV0lOX0JPUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53aWR0aCAgKyBSRUdJT05fV0lOX0JPUkRFUiAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGVpZ2h0ICsgUkVHSU9OX1dJTl9CT1JERVIgKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIENvcHlGcm9tUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0T3V0cHV0LCBDb3B5RnJvbVBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDV092ZXJyaWRlUmVkaXJlY3QsICZhdHRyaWJzKTsKKyAgICByZWN0LnggICAgICA9IDA7CisgICAgcmVjdC55ICAgICAgPSAwOworICAgIHJlY3Qud2lkdGggID0gcy0+d2lkdGg7CisgICAgcmVjdC5oZWlnaHQgPSBzLT5oZWlnaHQ7CisgICAgWFNoYXBlQ29tYmluZVJlY3RhbmdsZXMoZHB5LCBzLT5yZWdpb25fd2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXBlQm91bmRpbmcsIFJFR0lPTl9XSU5fQk9SREVSLCBSRUdJT05fV0lOX0JPUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCwgMSwgU2hhcGVTdWJ0cmFjdCwgMCk7CisgICAgWE1hcFdpbmRvdyhkcHksIHMtPnJlZ2lvbl93aW4pOworICAgIFhTZWxlY3RJbnB1dChkcHksIHMtPnJlZ2lvbl93aW4sIEV4cG9zdXJlTWFzayB8IFN0cnVjdHVyZU5vdGlmeU1hc2spOworICAgIHgxMWdyYWJfZHJhd19yZWdpb25fd2luKHMpOworfQorCitzdGF0aWMgaW50IHNldHVwX3NobShBVkZvcm1hdENvbnRleHQgKnMsIERpc3BsYXkgKmRweSwgWEltYWdlICoqaW1hZ2UpCit7CisgICAgWDExR3JhYkNvbnRleHQgKmcgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHNjciAgICAgICAgICAgPSBYRGVmYXVsdFNjcmVlbihkcHkpOworICAgIFhJbWFnZSAqaW1nICAgICAgID0gWFNobUNyZWF0ZUltYWdlKGRweSwgRGVmYXVsdFZpc3VhbChkcHksIHNjciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdERlcHRoKGRweSwgc2NyKSwgWlBpeG1hcCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZy0+c2htaW5mbywgZy0+d2lkdGgsIGctPmhlaWdodCk7CisKKyAgICBnLT5zaG1pbmZvLnNobWlkID0gc2htZ2V0KElQQ19QUklWQVRFLCBpbWctPmJ5dGVzX3Blcl9saW5lICogaW1nLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENfQ1JFQVQgfCAwNzc3KTsKKworICAgIGlmIChnLT5zaG1pbmZvLnNobWlkID09IC0xKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgZ2V0IHNoYXJlZCBtZW1vcnkhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBnLT5zaG1pbmZvLnNobWFkZHIgID0gaW1nLT5kYXRhID0gc2htYXQoZy0+c2htaW5mby5zaG1pZCwgMCwgMCk7CisgICAgZy0+c2htaW5mby5yZWFkT25seSA9IEZhbHNlOworCisgICAgaWYgKCFYU2htQXR0YWNoKGRweSwgJmctPnNobWluZm8pKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYXR0YWNoIHNoYXJlZCBtZW1vcnkhXG4iKTsKKyAgICAgICAgLyogbmVlZHMgc29tZSBiZXR0ZXIgZXJyb3Igc3Vicm91dGluZSA6KSAqLworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgICppbWFnZSA9IGltZzsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXR1cF9tb3VzZShEaXNwbGF5ICpkcHksIGludCBzY3JlZW4pCit7CisgICAgaW50IGV2X3JldCwgZXZfZXJyOworCisgICAgaWYgKFhGaXhlc1F1ZXJ5RXh0ZW5zaW9uKGRweSwgJmV2X3JldCwgJmV2X2VycikpIHsKKyAgICAgICAgV2luZG93IHJvb3QgPSBSb290V2luZG93KGRweSwgc2NyZWVuKTsKKyAgICAgICAgWEZpeGVzU2VsZWN0Q3Vyc29ySW5wdXQoZHB5LCByb290LCBYRml4ZXNEaXNwbGF5Q3Vyc29yTm90aWZ5TWFzayk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Cit9CisKK3N0YXRpYyBpbnQgcGl4Zm10X2Zyb21faW1hZ2UoQVZGb3JtYXRDb250ZXh0ICpzLCBYSW1hZ2UgKmltYWdlLCBpbnQgKnBpeF9mbXQpCit7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgIkltYWdlIHIgMHglLjZseCBnIDB4JS42bHggYiAweCUuNmx4IGFuZCBkZXB0aCAlaVxuIiwKKyAgICAgICAgICAgaW1hZ2UtPnJlZF9tYXNrLAorICAgICAgICAgICBpbWFnZS0+Z3JlZW5fbWFzaywKKyAgICAgICAgICAgaW1hZ2UtPmJsdWVfbWFzaywKKyAgICAgICAgICAgaW1hZ2UtPmJpdHNfcGVyX3BpeGVsKTsKKworICAgICpwaXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgc3dpdGNoIChpbWFnZS0+Yml0c19wZXJfcGl4ZWwpIHsKKyAgICBjYXNlIDg6CisgICAgICAgICpwaXhfZm10ID0gIEFWX1BJWF9GTVRfUEFMODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgICAgaWYgKGltYWdlLT5yZWRfbWFzayAgID09IDB4ZjgwMCAmJgorICAgICAgICAgICAgaW1hZ2UtPmdyZWVuX21hc2sgPT0gMHgwN2UwICYmCisgICAgICAgICAgICBpbWFnZS0+Ymx1ZV9tYXNrICA9PSAweDAwMWYpIHsKKyAgICAgICAgICAgICpwaXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NjU7CisgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UtPnJlZF9tYXNrICAgPT0gMHg3YzAwICYmCisgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmdyZWVuX21hc2sgPT0gMHgwM2UwICYmCisgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmJsdWVfbWFzayAgPT0gMHgwMDFmKSB7CisgICAgICAgICAgICAqcGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNTU1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICAgIGlmIChpbWFnZS0+cmVkX21hc2sgICA9PSAweGZmMDAwMCAmJgorICAgICAgICAgICAgaW1hZ2UtPmdyZWVuX21hc2sgPT0gMHgwMGZmMDAgJiYKKyAgICAgICAgICAgIGltYWdlLT5ibHVlX21hc2sgID09IDB4MDAwMGZmKSB7CisgICAgICAgICAgICAqcGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQ7CisgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UtPnJlZF9tYXNrICAgPT0gMHgwMDAwZmYgJiYKKyAgICAgICAgICAgICAgICAgICBpbWFnZS0+Z3JlZW5fbWFzayA9PSAweDAwZmYwMCAmJgorICAgICAgICAgICAgICAgICAgIGltYWdlLT5ibHVlX21hc2sgID09IDB4ZmYwMDAwKSB7CisgICAgICAgICAgICAqcGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgICAgaWYgKGltYWdlLT5yZWRfbWFzayAgID09IDB4ZmYwMDAwICYmCisgICAgICAgICAgICBpbWFnZS0+Z3JlZW5fbWFzayA9PSAweDAwZmYwMCAmJgorICAgICAgICAgICAgaW1hZ2UtPmJsdWVfbWFzayAgPT0gMHgwMDAwZmYgKSB7CisgICAgICAgICAgICAqcGl4X2ZtdCA9IEFWX1BJWF9GTVRfMFJHQjMyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiWEltYWdlcyB3aXRoIFJHQiBtYXNrIDB4JS42bHggMHglLjZseCAweCUuNmx4IGFuZCBkZXB0aCAlaSAiCisgICAgICAgICAgICAgICAiYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuIiwKKyAgICAgICAgICAgICAgIGltYWdlLT5yZWRfbWFzaywKKyAgICAgICAgICAgICAgIGltYWdlLT5ncmVlbl9tYXNrLAorICAgICAgICAgICAgICAgaW1hZ2UtPmJsdWVfbWFzaywKKyAgICAgICAgICAgICAgIGltYWdlLT5iaXRzX3Blcl9waXhlbCk7CisKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIHgxMSBncmFiIGRldmljZSBkZW11eGVyIChwdWJsaWMgZGV2aWNlIGRlbXV4ZXIgQVBJKS4KKyAqCisgKiBAcGFyYW0gczEgQ29udGV4dCBmcm9tIGF2Zm9ybWF0IGNvcmUKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICAgPGxpPkFWRVJST1IoRU5PTUVNKSBubyBtZW1vcnkgbGVmdDwvbGk+CisgKiAgICAgICAgICA8bGk+QVZFUlJPUihFSU8pIG90aGVyIGZhaWx1cmUgY2FzZTwvbGk+CisgKiAgICAgICAgICA8bGk+MCBzdWNjZXNzPC9saT4KKyAqICAgICAgICAgPC91bD4KKyAqLworc3RhdGljIGludCB4MTFncmFiX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqczEpCit7CisgICAgWDExR3JhYkNvbnRleHQgKngxMWdyYWIgPSBzMS0+cHJpdl9kYXRhOworICAgIERpc3BsYXkgKmRweTsKKyAgICBBVlN0cmVhbSAqc3QgPSBOVUxMOworICAgIFhJbWFnZSAqaW1hZ2U7CisgICAgaW50IHhfb2ZmID0gMCwgeV9vZmYgPSAwLCByZXQgPSAwLCBzY3JlZW4sIHVzZV9zaG0gPSAwOworICAgIGNoYXIgKmRweW5hbWUsICpvZmZzZXQ7CisgICAgQ29sb3JtYXAgY29sb3JfbWFwOworICAgIFhDb2xvciBjb2xvclsyNTZdOworICAgIGludCBpOworCisgICAgZHB5bmFtZSA9IGF2X3N0cmR1cChzMS0+ZmlsZW5hbWUpOworICAgIGlmICghZHB5bmFtZSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICBvZmZzZXQgPSBzdHJjaHIoZHB5bmFtZSwgJysnKTsKKyAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIHNzY2FuZihvZmZzZXQsICIlZCwlZCIsICZ4X29mZiwgJnlfb2ZmKTsKKyAgICAgICAgaWYgKHN0cnN0cihvZmZzZXQsICJub21vdXNlIikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIidub21vdXNlJyBzcGVjaWZpY2F0aW9uIGluIGFyZ3VtZW50IGlzIGRlcHJlY2F0ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAidXNlICdkcmF3X21vdXNlJyBvcHRpb24gd2l0aCB2YWx1ZSAwIGluc3RlYWRcbiIpOworICAgICAgICAgICAgeDExZ3JhYi0+ZHJhd19tb3VzZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgKm9mZnNldCA9IDA7CisgICAgfQorCisgICAgYXZfbG9nKHMxLCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgImRldmljZTogJXMgLT4gZGlzcGxheTogJXMgeDogJWQgeTogJWQgd2lkdGg6ICVkIGhlaWdodDogJWRcbiIsCisgICAgICAgICAgIHMxLT5maWxlbmFtZSwgZHB5bmFtZSwgeF9vZmYsIHlfb2ZmLCB4MTFncmFiLT53aWR0aCwgeDExZ3JhYi0+aGVpZ2h0KTsKKworICAgIGRweSA9IFhPcGVuRGlzcGxheShkcHluYW1lKTsKKyAgICBhdl9mcmVlcCgmZHB5bmFtZSk7CisgICAgaWYgKCFkcHkpIHsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgb3BlbiBYIGRpc3BsYXkuXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oczEsIE5VTEwpOworICAgIGlmICghc3QpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOyAvKiA2NCBiaXRzIHB0cyBpbiB1cyAqLworCisgICAgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkcHkpOworCisgICAgaWYgKHgxMWdyYWItPmZvbGxvd19tb3VzZSkgeworICAgICAgICBpbnQgc2NyZWVuX3csIHNjcmVlbl9oOworICAgICAgICBXaW5kb3cgdzsKKworICAgICAgICBzY3JlZW5fdyA9IERpc3BsYXlXaWR0aChkcHksIHNjcmVlbik7CisgICAgICAgIHNjcmVlbl9oID0gRGlzcGxheUhlaWdodChkcHksIHNjcmVlbik7CisgICAgICAgIFhRdWVyeVBvaW50ZXIoZHB5LCBSb290V2luZG93KGRweSwgc2NyZWVuKSwgJncsICZ3LCAmeF9vZmYsICZ5X29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAmcmV0LCAmcmV0LCAmcmV0KTsKKyAgICAgICAgeF9vZmYgLT0geDExZ3JhYi0+d2lkdGggLyAyOworICAgICAgICB5X29mZiAtPSB4MTFncmFiLT5oZWlnaHQgLyAyOworICAgICAgICB4X29mZiAgPSBGRk1JTihGRk1BWCh4X29mZiwgMCksIHNjcmVlbl93IC0geDExZ3JhYi0+d2lkdGgpOworICAgICAgICB5X29mZiAgPSBGRk1JTihGRk1BWCh5X29mZiwgMCksIHNjcmVlbl9oIC0geDExZ3JhYi0+aGVpZ2h0KTsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICJmb2xsb3dtb3VzZSBpcyBlbmFibGVkLCByZXNldHRpbmcgZ3JhYmJpbmcgcmVnaW9uIHRvIHg6ICVkIHk6ICVkXG4iLAorICAgICAgICAgICAgICAgeF9vZmYsIHlfb2ZmKTsKKyAgICB9CisKKyAgICBpZiAoeDExZ3JhYi0+dXNlX3NobSkgeworICAgICAgICB1c2Vfc2htID0gWFNobVF1ZXJ5RXh0ZW5zaW9uKGRweSk7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAic2hhcmVkIG1lbW9yeSBleHRlbnNpb24gJXNmb3VuZFxuIiwgdXNlX3NobSA/ICIiIDogIm5vdCAiKTsKKyAgICB9CisKKyAgICBpZiAodXNlX3NobSAmJiBzZXR1cF9zaG0oczEsIGRweSwgJmltYWdlKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfV0FSTklORywgIkZhbGxpbmcgYmFjayB0byBYR2V0SW1hZ2VcbiIpOworICAgICAgICB1c2Vfc2htID0gMDsKKyAgICB9CisKKyAgICBpZiAoIXVzZV9zaG0pIHsKKyAgICAgICAgaW1hZ2UgPSBYR2V0SW1hZ2UoZHB5LCBSb290V2luZG93KGRweSwgc2NyZWVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeF9vZmYsIHlfb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4MTFncmFiLT53aWR0aCwgeDExZ3JhYi0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxQbGFuZXMsIFpQaXhtYXApOworICAgIH0KKworICAgIGlmICh4MTFncmFiLT5kcmF3X21vdXNlICYmIHNldHVwX21vdXNlKGRweSwgc2NyZWVuKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJYRml4ZXMgbm90IGF2YWlsYWJsZSwgY2Fubm90IGRyYXcgdGhlIG1vdXNlIGN1cnNvclxuIik7CisgICAgICAgIHgxMWdyYWItPmRyYXdfbW91c2UgPSAwOworICAgIH0KKworICAgIHgxMWdyYWItPmZyYW1lX3NpemUgPSB4MTFncmFiLT53aWR0aCAqIHgxMWdyYWItPmhlaWdodCAqIGltYWdlLT5iaXRzX3Blcl9waXhlbCAvIDg7CisgICAgeDExZ3JhYi0+ZHB5ICAgICAgICA9IGRweTsKKyAgICB4MTFncmFiLT50aW1lX2Jhc2UgID0gYXZfaW52X3EoeDExZ3JhYi0+ZnJhbWVyYXRlKTsKKyAgICB4MTFncmFiLT50aW1lX2ZyYW1lID0gYXZfZ2V0dGltZSgpIC8gYXZfcTJkKHgxMWdyYWItPnRpbWVfYmFzZSk7CisgICAgeDExZ3JhYi0+eF9vZmYgICAgICA9IHhfb2ZmOworICAgIHgxMWdyYWItPnlfb2ZmICAgICAgPSB5X29mZjsKKyAgICB4MTFncmFiLT5pbWFnZSAgICAgID0gaW1hZ2U7CisgICAgeDExZ3JhYi0+dXNlX3NobSAgICA9IHVzZV9zaG07CisKKyAgICByZXQgPSBwaXhmbXRfZnJvbV9pbWFnZShzMSwgaW1hZ2UsICZzdC0+Y29kZWMtPnBpeF9mbXQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIG91dDsKKworICAgIGlmIChzdC0+Y29kZWMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7CisgICAgICAgIGNvbG9yX21hcCA9IERlZmF1bHRDb2xvcm1hcChkcHksIHNjcmVlbik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKKyAgICAgICAgICAgIGNvbG9yW2ldLnBpeGVsID0gaTsKKyAgICAgICAgWFF1ZXJ5Q29sb3JzKGRweSwgY29sb3JfbWFwLCBjb2xvciwgMjU2KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKQorICAgICAgICAgICAgeDExZ3JhYi0+cGFsZXR0ZVtpXSA9IChjb2xvcltpXS5yZWQgICAmIDB4RkYwMCkgPDwgOCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbG9yW2ldLmdyZWVuICYgMHhGRjAwKSAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3JbaV0uYmx1ZSAgJiAweEZGMDApID4+IDg7CisgICAgICAgIHgxMWdyYWItPnBhbGV0dGVfY2hhbmdlZCA9IDE7CisgICAgfQorCisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0geDExZ3JhYi0+d2lkdGg7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0geDExZ3JhYi0+aGVpZ2h0OworICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlICA9IHgxMWdyYWItPnRpbWVfYmFzZTsKKyAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgPSB4MTFncmFiLT5mcmFtZV9zaXplICogMSAvIGF2X3EyZCh4MTFncmFiLT50aW1lX2Jhc2UpICogODsKKworb3V0OgorICAgIGF2X2ZyZWUoZHB5bmFtZSk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBQYWludCBhIG1vdXNlIHBvaW50ZXIgaW4gYW4gWDExIGltYWdlLgorICoKKyAqIEBwYXJhbSBpbWFnZSBpbWFnZSB0byBwYWludCB0aGUgbW91c2UgcG9pbnRlciB0bworICogQHBhcmFtIHMgY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIG9yaWdpbmFsIGdyYWJiaW5nIHJlY3RhbmdsZQorICogICAgICAgICAgY29vcmRpbmF0ZXMKKyAqLworc3RhdGljIHZvaWQgcGFpbnRfbW91c2VfcG9pbnRlcihYSW1hZ2UgKmltYWdlLCBBVkZvcm1hdENvbnRleHQgKnMxKQoreworICAgIFgxMUdyYWJDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBpbnQgeF9vZmYgICAgPSBzLT54X29mZjsKKyAgICBpbnQgeV9vZmYgICAgPSBzLT55X29mZjsKKyAgICBpbnQgd2lkdGggICAgPSBzLT53aWR0aDsKKyAgICBpbnQgaGVpZ2h0ICAgPSBzLT5oZWlnaHQ7CisgICAgRGlzcGxheSAqZHB5ID0gcy0+ZHB5OworICAgIFhGaXhlc0N1cnNvckltYWdlICp4Y2ltOworICAgIGludCB4LCB5OworICAgIGludCBsaW5lLCBjb2x1bW47CisgICAgaW50IHRvX2xpbmUsIHRvX2NvbHVtbjsKKyAgICBpbnQgcGl4c3RyaWRlID0gaW1hZ2UtPmJpdHNfcGVyX3BpeGVsID4+IDM7CisgICAgLyogV2FybmluZzogaW4gaXRzIGluc2FuaXR5LCB4bGliIHByb3ZpZGVzIHVuc2lnbmVkIGltYWdlIGRhdGEgdGhyb3VnaCBhCisgICAgICogY2hhciogcG9pbnRlciwgc28gd2UgaGF2ZSB0byBtYWtlIGl0IHVpbnQ4X3QgdG8gbWFrZSB0aGluZ3Mgbm90IGJyZWFrLgorICAgICAqIEFueW9uZSB3aG8gcGVyZm9ybXMgZnVydGhlciBpbnZlc3RpZ2F0aW9uIG9mIHRoZSB4bGliIEFQSSBsaWtlbHkgcmlza3MKKyAgICAgKiBwZXJtYW5lbnQgYnJhaW4gZGFtYWdlLiAqLworICAgIHVpbnQ4X3QgKnBpeCA9IGltYWdlLT5kYXRhOworICAgIFdpbmRvdyByb290OworICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7CisKKyAgICAvKiBDb2RlIGRvZXNuJ3QgY3VycmVudGx5IHN1cHBvcnQgMTYtYml0IG9yIFBBTDggKi8KKyAgICBpZiAoaW1hZ2UtPmJpdHNfcGVyX3BpeGVsICE9IDI0ICYmIGltYWdlLT5iaXRzX3Blcl9waXhlbCAhPSAzMikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFzLT5jKQorICAgICAgICBzLT5jID0gWENyZWF0ZUZvbnRDdXJzb3IoZHB5LCBYQ19sZWZ0X3B0cik7CisgICAgcm9vdCA9IERlZmF1bHRSb290V2luZG93KGRweSk7CisgICAgYXR0ci5jdXJzb3IgPSBzLT5jOworICAgIFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKGRweSwgcm9vdCwgQ1dDdXJzb3IsICZhdHRyKTsKKworICAgIHhjaW0gPSBYRml4ZXNHZXRDdXJzb3JJbWFnZShkcHkpOworICAgIGlmICgheGNpbSkgeworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlhGaXhlc0dldEN1cnNvckltYWdlIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB4ID0geGNpbS0+eCAtIHhjaW0tPnhob3Q7CisgICAgeSA9IHhjaW0tPnkgLSB4Y2ltLT55aG90OworCisgICAgdG9fbGluZSAgID0gRkZNSU4oKHkgKyB4Y2ltLT5oZWlnaHQpLCAoaGVpZ2h0ICsgeV9vZmYpKTsKKyAgICB0b19jb2x1bW4gPSBGRk1JTigoeCArIHhjaW0tPndpZHRoKSwgICh3aWR0aCAgKyB4X29mZikpOworCisgICAgZm9yIChsaW5lID0gRkZNQVgoeSwgeV9vZmYpOyBsaW5lIDwgdG9fbGluZTsgbGluZSsrKSB7CisgICAgICAgIGZvciAoY29sdW1uID0gRkZNQVgoeCwgeF9vZmYpOyBjb2x1bW4gPCB0b19jb2x1bW47IGNvbHVtbisrKSB7CisgICAgICAgICAgICBpbnQgeGNpbV9hZGRyICA9IChsaW5lICAtIHkpICAgICAqIHhjaW0tPndpZHRoICsgY29sdW1uIC0geDsKKyAgICAgICAgICAgIGludCBpbWFnZV9hZGRyID0gKChsaW5lIC0geV9vZmYpICogd2lkdGggICAgICAgKyBjb2x1bW4gLSB4X29mZikgKiBwaXhzdHJpZGU7CisgICAgICAgICAgICBpbnQgciAgICAgICAgICA9ICh1aW50OF90KSh4Y2ltLT5waXhlbHNbeGNpbV9hZGRyXSA+PiAgMCk7CisgICAgICAgICAgICBpbnQgZyAgICAgICAgICA9ICh1aW50OF90KSh4Y2ltLT5waXhlbHNbeGNpbV9hZGRyXSA+PiAgOCk7CisgICAgICAgICAgICBpbnQgYiAgICAgICAgICA9ICh1aW50OF90KSh4Y2ltLT5waXhlbHNbeGNpbV9hZGRyXSA+PiAxNik7CisgICAgICAgICAgICBpbnQgYSAgICAgICAgICA9ICh1aW50OF90KSh4Y2ltLT5waXhlbHNbeGNpbV9hZGRyXSA+PiAyNCk7CisKKyAgICAgICAgICAgIGlmIChhID09IDI1NSkgeworICAgICAgICAgICAgICAgIHBpeFtpbWFnZV9hZGRyICsgMF0gPSByOworICAgICAgICAgICAgICAgIHBpeFtpbWFnZV9hZGRyICsgMV0gPSBnOworICAgICAgICAgICAgICAgIHBpeFtpbWFnZV9hZGRyICsgMl0gPSBiOworICAgICAgICAgICAgfSBlbHNlIGlmIChhKSB7CisgICAgICAgICAgICAgICAgLyogcGl4ZWwgdmFsdWVzIGZyb20gWEZpeGVzR2V0Q3Vyc29ySW1hZ2UgY29tZSBwcmVtdWx0aXBsaWVkIGJ5IGFscGhhICovCisgICAgICAgICAgICAgICAgcGl4W2ltYWdlX2FkZHIgKyAwXSA9IHIgKyAocGl4W2ltYWdlX2FkZHIgKyAwXSAqICgyNTUgLSBhKSArIDI1NSAvIDIpIC8gMjU1OworICAgICAgICAgICAgICAgIHBpeFtpbWFnZV9hZGRyICsgMV0gPSBnICsgKHBpeFtpbWFnZV9hZGRyICsgMV0gKiAoMjU1IC0gYSkgKyAyNTUgLyAyKSAvIDI1NTsKKyAgICAgICAgICAgICAgICBwaXhbaW1hZ2VfYWRkciArIDJdID0gYiArIChwaXhbaW1hZ2VfYWRkciArIDJdICogKDI1NSAtIGEpICsgMjU1IC8gMikgLyAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBYRnJlZSh4Y2ltKTsKKyAgICB4Y2ltID0gTlVMTDsKK30KKworLyoqCisgKiBSZWFkIG5ldyBkYXRhIGluIHRoZSBpbWFnZSBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIGRweSBYMTEgZGlzcGxheSB0byBncmFiIGZyb20KKyAqIEBwYXJhbSBkCisgKiBAcGFyYW0gaW1hZ2UgSW1hZ2Ugd2hlcmUgdGhlIGdyYWIgd2lsbCBiZSBwdXQKKyAqIEBwYXJhbSB4IFRvcC1MZWZ0IGdyYWJiaW5nIHJlY3RhbmdsZSBob3Jpem9udGFsIGNvb3JkaW5hdGUKKyAqIEBwYXJhbSB5IFRvcC1MZWZ0IGdyYWJiaW5nIHJlY3RhbmdsZSB2ZXJ0aWNhbCBjb29yZGluYXRlCisgKiBAcmV0dXJuIDAgaWYgZXJyb3IsICEwIGlmIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGludCB4Z2V0X3pwaXhtYXAoRGlzcGxheSAqZHB5LCBEcmF3YWJsZSBkLCBYSW1hZ2UgKmltYWdlLCBpbnQgeCwgaW50IHkpCit7CisgICAgeEdldEltYWdlUmVwbHkgcmVwOworICAgIHhHZXRJbWFnZVJlcSAqcmVxOworICAgIGxvbmcgbmJ5dGVzOworCisgICAgaWYgKCFpbWFnZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShHZXRJbWFnZSwgcmVxKTsKKworICAgIC8qIEZpcnN0IHNldCB1cCB0aGUgc3RhbmRhcmQgc3R1ZmYgaW4gdGhlIHJlcXVlc3QgKi8KKyAgICByZXEtPmRyYXdhYmxlICA9IGQ7CisgICAgcmVxLT54ICAgICAgICAgPSB4OworICAgIHJlcS0+eSAgICAgICAgID0geTsKKyAgICByZXEtPndpZHRoICAgICA9IGltYWdlLT53aWR0aDsKKyAgICByZXEtPmhlaWdodCAgICA9IGltYWdlLT5oZWlnaHQ7CisgICAgcmVxLT5wbGFuZU1hc2sgPSAodW5zaWduZWQgaW50KUFsbFBsYW5lczsKKyAgICByZXEtPmZvcm1hdCAgICA9IFpQaXhtYXA7CisKKyAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSB8fCAhcmVwLmxlbmd0aCkgeworICAgICAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgICAgIFN5bmNIYW5kbGUoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbmJ5dGVzID0gKGxvbmcpcmVwLmxlbmd0aCA8PCAyOworICAgIF9YUmVhZFBhZChkcHksIGltYWdlLT5kYXRhLCBuYnl0ZXMpOworCisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICByZXR1cm4gMTsKK30KKworLyoqCisgKiBHcmFiIGEgZnJhbWUgZnJvbSB4MTEgKHB1YmxpYyBkZXZpY2UgZGVtdXhlciBBUEkpLgorICoKKyAqIEBwYXJhbSBzMSBDb250ZXh0IGZyb20gYXZmb3JtYXQgY29yZQorICogQHBhcmFtIHBrdCBQYWNrZXQgaG9sZGluZyB0aGUgYnJhYmJlZCBmcmFtZQorICogQHJldHVybiBmcmFtZSBzaXplIGluIGJ5dGVzCisgKi8KK3N0YXRpYyBpbnQgeDExZ3JhYl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMxLCBBVlBhY2tldCAqcGt0KQoreworICAgIFgxMUdyYWJDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBEaXNwbGF5ICpkcHkgICAgICA9IHMtPmRweTsKKyAgICBYSW1hZ2UgKmltYWdlICAgICA9IHMtPmltYWdlOworICAgIGludCB4X29mZiAgICAgICAgID0gcy0+eF9vZmY7CisgICAgaW50IHlfb2ZmICAgICAgICAgPSBzLT55X29mZjsKKyAgICBpbnQgZm9sbG93X21vdXNlICA9IHMtPmZvbGxvd19tb3VzZTsKKyAgICBpbnQgc2NyZWVuLCBwb2ludGVyX3gsIHBvaW50ZXJfeSwgXywgc2FtZV9zY3JlZW4gPSAxOworICAgIFdpbmRvdyB3LCByb290OworICAgIGludDY0X3QgY3VydGltZSwgZGVsYXk7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworCisgICAgLyogQ2FsY3VsYXRlIHRoZSB0aW1lIG9mIHRoZSBuZXh0IGZyYW1lICovCisgICAgcy0+dGltZV9mcmFtZSArPSBJTlQ2NF9DKDEwMDAwMDApOworCisgICAgLyogd2FpdCBiYXNlZCBvbiB0aGUgZnJhbWUgcmF0ZSAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgY3VydGltZSA9IGF2X2dldHRpbWUoKTsKKyAgICAgICAgZGVsYXkgICA9IHMtPnRpbWVfZnJhbWUgKiBhdl9xMmQocy0+dGltZV9iYXNlKSAtIGN1cnRpbWU7CisgICAgICAgIGlmIChkZWxheSA8PSAwKSB7CisgICAgICAgICAgICBpZiAoZGVsYXkgPCBJTlQ2NF9DKC0xMDAwMDAwKSAqIGF2X3EyZChzLT50aW1lX2Jhc2UpKQorICAgICAgICAgICAgICAgIHMtPnRpbWVfZnJhbWUgKz0gSU5UNjRfQygxMDAwMDAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRzLnR2X3NlYyAgPSBkZWxheSAvIDEwMDAwMDA7CisgICAgICAgIHRzLnR2X25zZWMgPSAoZGVsYXkgJSAxMDAwMDAwKSAqIDEwMDA7CisgICAgICAgIG5hbm9zbGVlcCgmdHMsIE5VTEwpOworICAgIH0KKworICAgIGF2X2luaXRfcGFja2V0KHBrdCk7CisgICAgcGt0LT5kYXRhID0gaW1hZ2UtPmRhdGE7CisgICAgcGt0LT5zaXplID0gcy0+ZnJhbWVfc2l6ZTsKKyAgICBwa3QtPnB0cyAgPSBjdXJ0aW1lOworICAgIGlmIChzLT5wYWxldHRlX2NoYW5nZWQpIHsKKyAgICAgICAgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgIGlmICghcGFsKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFwcGVuZCBwYWxldHRlIHRvIHBhY2tldFxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkocGFsLCBzLT5wYWxldHRlLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgICAgICBzLT5wYWxldHRlX2NoYW5nZWQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkcHkpOworICAgIHJvb3QgICA9IFJvb3RXaW5kb3coZHB5LCBzY3JlZW4pOworCisgICAgaWYgKGZvbGxvd19tb3VzZSB8fCBzLT5kcmF3X21vdXNlKQorICAgICAgICBzYW1lX3NjcmVlbiA9IFhRdWVyeVBvaW50ZXIoZHB5LCByb290LCAmdywgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9pbnRlcl94LCAmcG9pbnRlcl95LCAmXywgJl8sICZfKTsKKworICAgIGlmIChmb2xsb3dfbW91c2UgJiYgc2FtZV9zY3JlZW4pIHsKKyAgICAgICAgaW50IHNjcmVlbl93LCBzY3JlZW5faDsKKworICAgICAgICBzY3JlZW5fdyA9IERpc3BsYXlXaWR0aChkcHksIHNjcmVlbik7CisgICAgICAgIHNjcmVlbl9oID0gRGlzcGxheUhlaWdodChkcHksIHNjcmVlbik7CisgICAgICAgIGlmIChmb2xsb3dfbW91c2UgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIGZvbGxvdyB0aGUgbW91c2UsIHB1dCBpdCBhdCBjZW50ZXIgb2YgZ3JhYmJpbmcgcmVnaW9uCisgICAgICAgICAgICB4X29mZiArPSBwb2ludGVyX3ggLSBzLT53aWR0aCAvIDIgLSB4X29mZjsKKyAgICAgICAgICAgIHlfb2ZmICs9IHBvaW50ZXJfeSAtIHMtPmhlaWdodCAvIDIgLSB5X29mZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGZvbGxvdyB0aGUgbW91c2UsIGJ1dCBvbmx5IG1vdmUgdGhlIGdyYWJiaW5nIHJlZ2lvbiB3aGVuIG1vdXNlCisgICAgICAgICAgICAvLyByZWFjaGVzIHdpdGhpbiBjZXJ0YWluIHBpeGVscyB0byB0aGUgZWRnZS4KKyAgICAgICAgICAgIGlmIChwb2ludGVyX3ggPiB4X29mZiArIHMtPndpZHRoIC0gZm9sbG93X21vdXNlKQorICAgICAgICAgICAgICAgIHhfb2ZmICs9IHBvaW50ZXJfeCAtICh4X29mZiArIHMtPndpZHRoIC0gZm9sbG93X21vdXNlKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBvaW50ZXJfeCA8IHhfb2ZmICsgZm9sbG93X21vdXNlKQorICAgICAgICAgICAgICAgIHhfb2ZmIC09ICh4X29mZiArIGZvbGxvd19tb3VzZSkgLSBwb2ludGVyX3g7CisgICAgICAgICAgICBpZiAocG9pbnRlcl95ID4geV9vZmYgKyBzLT5oZWlnaHQgLSBmb2xsb3dfbW91c2UpCisgICAgICAgICAgICAgICAgeV9vZmYgKz0gcG9pbnRlcl95IC0gKHlfb2ZmICsgcy0+aGVpZ2h0IC0gZm9sbG93X21vdXNlKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBvaW50ZXJfeSA8IHlfb2ZmICsgZm9sbG93X21vdXNlKQorICAgICAgICAgICAgICAgIHlfb2ZmIC09ICh5X29mZiArIGZvbGxvd19tb3VzZSkgLSBwb2ludGVyX3k7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRqdXN0IGdyYWJiaW5nIHJlZ2lvbiBwb3NpdGlvbiBpZiBpdCBnb2VzIG91dCBvZiBzY3JlZW4uCisgICAgICAgIHMtPnhfb2ZmID0geF9vZmYgPSBGRk1JTihGRk1BWCh4X29mZiwgMCksIHNjcmVlbl93IC0gcy0+d2lkdGgpOworICAgICAgICBzLT55X29mZiA9IHlfb2ZmID0gRkZNSU4oRkZNQVgoeV9vZmYsIDApLCBzY3JlZW5faCAtIHMtPmhlaWdodCk7CisKKyAgICAgICAgaWYgKHMtPnNob3dfcmVnaW9uICYmIHMtPnJlZ2lvbl93aW4pCisgICAgICAgICAgICBYTW92ZVdpbmRvdyhkcHksIHMtPnJlZ2lvbl93aW4sCisgICAgICAgICAgICAgICAgICAgICAgICBzLT54X29mZiAtIFJFR0lPTl9XSU5fQk9SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+eV9vZmYgLSBSRUdJT05fV0lOX0JPUkRFUik7CisgICAgfQorCisgICAgaWYgKHMtPnNob3dfcmVnaW9uICYmIHNhbWVfc2NyZWVuKSB7CisgICAgICAgIGlmIChzLT5yZWdpb25fd2luKSB7CisgICAgICAgICAgICBYRXZlbnQgZXZ0ID0geyAudHlwZSA9IE5vRXZlbnRNYXNrIH07CisgICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgZXZlbnRzLCBhbmQgZG8gdGhlIGluaXRpYWwgZHJhdyBvciByZWRyYXcuCisgICAgICAgICAgICB3aGlsZSAoWENoZWNrTWFza0V2ZW50KGRweSwgRXhwb3N1cmVNYXNrIHwgU3RydWN0dXJlTm90aWZ5TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2dCkpCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgaWYgKGV2dC50eXBlKQorICAgICAgICAgICAgICAgIHgxMWdyYWJfZHJhd19yZWdpb25fd2luKHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeDExZ3JhYl9yZWdpb25fd2luX2luaXQocyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+dXNlX3NobSkgeworICAgICAgICBpZiAoIVhTaG1HZXRJbWFnZShkcHksIHJvb3QsIGltYWdlLCB4X29mZiwgeV9vZmYsIEFsbFBsYW5lcykpCisgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19JTkZPLCAiWFNobUdldEltYWdlKCkgZmFpbGVkXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXhnZXRfenBpeG1hcChkcHksIHJvb3QsIGltYWdlLCB4X29mZiwgeV9vZmYpKQorICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfSU5GTywgIlhHZXRaUGl4bWFwKCkgZmFpbGVkXG4iKTsKKyAgICB9CisKKyAgICBpZiAocy0+ZHJhd19tb3VzZSAmJiBzYW1lX3NjcmVlbikKKyAgICAgICAgcGFpbnRfbW91c2VfcG9pbnRlcihpbWFnZSwgczEpOworCisgICAgcmV0dXJuIHMtPmZyYW1lX3NpemU7Cit9CisKKy8qKgorICogQ2xvc2UgeDExIGZyYW1lIGdyYWJiZXIgKHB1YmxpYyBkZXZpY2UgZGVtdXhlciBBUEkpLgorICoKKyAqIEBwYXJhbSBzMSBDb250ZXh0IGZyb20gYXZmb3JtYXQgY29yZQorICogQHJldHVybiAwIHN1Y2Nlc3MsICEwIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB4MTFncmFiX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzMSkKK3sKKyAgICBYMTFHcmFiQ29udGV4dCAqeDExZ3JhYiA9IHMxLT5wcml2X2RhdGE7CisKKyAgICAvKiBEZXRhY2ggY2xlYW5seSBmcm9tIHNoYXJlZCBtZW0gKi8KKyAgICBpZiAoeDExZ3JhYi0+dXNlX3NobSkgeworICAgICAgICBYU2htRGV0YWNoKHgxMWdyYWItPmRweSwgJngxMWdyYWItPnNobWluZm8pOworICAgICAgICBzaG1kdCh4MTFncmFiLT5zaG1pbmZvLnNobWFkZHIpOworICAgICAgICBzaG1jdGwoeDExZ3JhYi0+c2htaW5mby5zaG1pZCwgSVBDX1JNSUQsIE5VTEwpOworICAgIH0KKworICAgIC8qIERlc3Ryb3kgWDExIGltYWdlICovCisgICAgaWYgKHgxMWdyYWItPmltYWdlKSB7CisgICAgICAgIFhEZXN0cm95SW1hZ2UoeDExZ3JhYi0+aW1hZ2UpOworICAgICAgICB4MTFncmFiLT5pbWFnZSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHgxMWdyYWItPnJlZ2lvbl93aW4pCisgICAgICAgIFhEZXN0cm95V2luZG93KHgxMWdyYWItPmRweSwgeDExZ3JhYi0+cmVnaW9uX3dpbik7CisKKyAgICAvKiBGcmVlIFgxMSBkaXNwbGF5ICovCisgICAgWENsb3NlRGlzcGxheSh4MTFncmFiLT5kcHkpOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihYMTFHcmFiQ29udGV4dCwgeCkKKyNkZWZpbmUgREVDIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImRyYXdfbW91c2UiLCAiZHJhdyB0aGUgbW91c2UgcG9pbnRlciIsIE9GRlNFVChkcmF3X21vdXNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDF9LCAwLCAxLCBERUMgfSwKKworICAgIHsgImZvbGxvd19tb3VzZSIsICJtb3ZlIHRoZSBncmFiYmluZyByZWdpb24gd2hlbiB0aGUgbW91c2UgcG9pbnRlciByZWFjaGVzIHdpdGhpbiBzcGVjaWZpZWQgYW1vdW50IG9mIHBpeGVscyB0byB0aGUgZWRnZSBvZiByZWdpb24iLAorICAgICAgT0ZGU0VUKGZvbGxvd19tb3VzZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgLTEsIElOVF9NQVgsIERFQywgImZvbGxvd19tb3VzZSIgfSwKKyAgICB7ICJjZW50ZXJlZCIsICAgICAia2VlcCB0aGUgbW91c2UgcG9pbnRlciBhdCB0aGUgY2VudGVyIG9mIGdyYWJiaW5nIHJlZ2lvbiB3aGVuIGZvbGxvd2luZyIsCisgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAtMX0sIElOVF9NSU4sIElOVF9NQVgsIERFQywgImZvbGxvd19tb3VzZSIgfSwKKworICAgIHsgImZyYW1lcmF0ZSIsICAic2V0IHZpZGVvIGZyYW1lIHJhdGUiLCAgICAgIE9GRlNFVChmcmFtZXJhdGUpLCAgIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIm50c2MifSwgMCwgMCwgREVDIH0sCisgICAgeyAic2hvd19yZWdpb24iLCAic2hvdyB0aGUgZ3JhYmJpbmcgcmVnaW9uIiwgT0ZGU0VUKHNob3dfcmVnaW9uKSwgQVZfT1BUX1RZUEVfSU5ULCAgICAgICAgey5pNjQgPSAwfSwgMCwgMSwgREVDIH0sCisgICAgeyAidmlkZW9fc2l6ZSIsICAic2V0IHZpZGVvIGZyYW1lIHNpemUiLCAgICAgT0ZGU0VUKHdpZHRoKSwgICAgICAgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSAidmdhIn0sIDAsIDAsIERFQyB9LAorICAgIHsgInVzZV9zaG0iLCAgICAgInVzZSBNSVQtU0hNIGV4dGVuc2lvbiIsICAgIE9GRlNFVCh1c2Vfc2htKSwgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICAgIHsuaTY0ID0gMX0sIDAsIDEsIERFQyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgeDExX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlgxMWdyYWIgaW5kZXYiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX0lOUFVULAorfTsKKworLyoqIHgxMSBncmFiYmVyIGRldmljZSBkZW11eGVyIGRlY2xhcmF0aW9uICovCitBVklucHV0Rm9ybWF0IGZmX3gxMWdyYWJfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAieDExZ3JhYiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlgxMWdyYWIiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoWDExR3JhYkNvbnRleHQpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHgxMWdyYWJfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0geDExZ3JhYl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSB4MTFncmFiX3JlYWRfY2xvc2UsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ4MTFfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL3hjYmdyYWIuYyBiL2ZmbXBlZy9saWJhdmRldmljZS94Y2JncmFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4ZGUyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmRldmljZS94Y2JncmFiLmMKQEAgLTAsMCArMSw2NzIgQEAKKy8qCisgKiBYQ0IgaW5wdXQgZ3JhYmJlcgorICogQ29weXJpZ2h0IChDKSAyMDE0IEx1Y2EgQmFyYmF0byA8bHVfemVyb0BnZW50b28ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx4Y2IveGNiLmg+CisKKyNpZiBDT05GSUdfTElCWENCX1hGSVhFUworI2luY2x1ZGUgPHhjYi94Zml4ZXMuaD4KKyNlbmRpZgorCisjaWYgQ09ORklHX0xJQlhDQl9TSE0KKyNpbmNsdWRlIDxzeXMvc2htLmg+CisjaW5jbHVkZSA8eGNiL3NobS5oPgorI2VuZGlmCisKKyNpZiBDT05GSUdfTElCWENCX1NIQVBFCisjaW5jbHVkZSA8eGNiL3NoYXBlLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisKK3R5cGVkZWYgc3RydWN0IFhDQkdyYWJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIHhjYl9jb25uZWN0aW9uX3QgKmNvbm47CisgICAgeGNiX3NjcmVlbl90ICpzY3JlZW47CisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsKKyNpZiBDT05GSUdfTElCWENCX1NITQorICAgIHhjYl9zaG1fc2VnX3Qgc2VnbWVudDsKKyNlbmRpZgorCisgICAgaW50NjRfdCB0aW1lX2ZyYW1lOworICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlOworCisgICAgaW50IHgsIHk7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGZyYW1lX3NpemU7CisgICAgaW50IGJwcDsKKworICAgIGludCBkcmF3X21vdXNlOworICAgIGludCBmb2xsb3dfbW91c2U7CisgICAgaW50IHNob3dfcmVnaW9uOworICAgIGludCByZWdpb25fYm9yZGVyOworICAgIGludCBjZW50ZXJlZDsKKworICAgIGNvbnN0IGNoYXIgKnZpZGVvX3NpemU7CisgICAgY29uc3QgY2hhciAqZnJhbWVyYXRlOworCisgICAgaW50IGhhc19zaG07Cit9IFhDQkdyYWJDb250ZXh0OworCisjZGVmaW5lIEZPTExPV19DRU5URVIgLTEKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoWENCR3JhYkNvbnRleHQsIHgpCisjZGVmaW5lIEQgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAieCIsICJJbml0aWFsIHggY29vcmRpbmF0ZS4iLCBPRkZTRVQoeCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBEIH0sCisgICAgeyAieSIsICJJbml0aWFsIHkgY29vcmRpbmF0ZS4iLCBPRkZTRVQoeSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBEIH0sCisgICAgeyAidmlkZW9fc2l6ZSIsICJBIHN0cmluZyBkZXNjcmliaW5nIGZyYW1lIHNpemUsIHN1Y2ggYXMgNjQweDQ4MCBvciBoZDcyMC4iLCBPRkZTRVQodmlkZW9fc2l6ZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAidmdhIiB9LCAwLCAwLCBEIH0sCisgICAgeyAiZnJhbWVyYXRlIiwgIiIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIm50c2MiIH0sIDAsIDAsIEQgfSwKKyAgICB7ICJkcmF3X21vdXNlIiwgIkRyYXcgdGhlIG1vdXNlIHBvaW50ZXIuIiwgT0ZGU0VUKGRyYXdfbW91c2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgMSwgRCB9LAorICAgIHsgImZvbGxvd19tb3VzZSIsICJNb3ZlIHRoZSBncmFiYmluZyByZWdpb24gd2hlbiB0aGUgbW91c2UgcG9pbnRlciByZWFjaGVzIHdpdGhpbiBzcGVjaWZpZWQgYW1vdW50IG9mIHBpeGVscyB0byB0aGUgZWRnZSBvZiByZWdpb24uIiwKKyAgICAgIE9GRlNFVChmb2xsb3dfbW91c2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgIEZPTExPV19DRU5URVIsIElOVF9NQVgsIEQsICJmb2xsb3dfbW91c2UiIH0sCisgICAgeyAiY2VudGVyZWQiLCAiS2VlcCB0aGUgbW91c2UgcG9pbnRlciBhdCB0aGUgY2VudGVyIG9mIGdyYWJiaW5nIHJlZ2lvbiB3aGVuIGZvbGxvd2luZy4iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gLTEgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImZvbGxvd19tb3VzZSIgfSwKKyAgICB7ICJzaG93X3JlZ2lvbiIsICJTaG93IHRoZSBncmFiYmluZyByZWdpb24uIiwgT0ZGU0VUKHNob3dfcmVnaW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEQgfSwKKyAgICB7ICJyZWdpb25fYm9yZGVyIiwgIlNldCB0aGUgcmVnaW9uIGJvcmRlciB0aGlja25lc3MuIiwgT0ZGU0VUKHJlZ2lvbl9ib3JkZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDMgfSwgMSwgMTI4LCBEIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB4Y2JncmFiX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gInhjYmdyYWIgaW5kZXYiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX0lOUFVULAorfTsKKworc3RhdGljIGludCB4Y2JncmFiX3JlcG9zaXRpb24oQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3F1ZXJ5X3BvaW50ZXJfcmVwbHlfdCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfZ2VvbWV0cnlfcmVwbHlfdCAqZ2VvKQoreworICAgIFhDQkdyYWJDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCB4ID0gYy0+eCwgeSA9IGMtPnksIHBfeCA9IHAtPndpbl94LCBwX3kgPSBwLT53aW5feTsKKyAgICBpbnQgdyA9IGMtPndpZHRoLCBoID0gYy0+aGVpZ2h0LCBmID0gYy0+Zm9sbG93X21vdXNlOworCisgICAgaWYgKCFwIHx8ICFnZW8pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBpZiAoZiA9PSBGT0xMT1dfQ0VOVEVSKSB7CisgICAgICAgIHggPSBwX3ggLSB3IC8gMjsKKyAgICAgICAgeSA9IHBfeSAtIGggLyAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBsZWZ0ICAgPSB4ICsgZjsKKyAgICAgICAgaW50IHJpZ2h0ICA9IHggKyB3IC0gZjsKKyAgICAgICAgaW50IHRvcCAgICA9IHkgKyBmOworICAgICAgICBpbnQgYm90dG9tID0geSArIGggKyBmOworICAgICAgICBpZiAocF94ID4gcmlnaHQpIHsKKyAgICAgICAgICAgIHggKz0gcF94IC0gcmlnaHQ7CisgICAgICAgIH0gZWxzZSBpZiAocF94IDwgbGVmdCkgeworICAgICAgICAgICAgeCAtPSBsZWZ0IC0gcF94OworICAgICAgICB9CisgICAgICAgIGlmIChwX3kgPiBib3R0b20pIHsKKyAgICAgICAgICAgIHkgKz0gcF95IC0gYm90dG9tOworICAgICAgICB9IGVsc2UgaWYgKHBfeSA8IHRvcCkgeworICAgICAgICAgICAgeSAtPSB0b3AgLSBwX3k7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjLT54ID0gRkZNSU4oRkZNQVgoMCwgeCksIGdlby0+d2lkdGggIC0gdyk7CisgICAgYy0+eSA9IEZGTUlOKEZGTUFYKDAsIHkpLCBnZW8tPmhlaWdodCAtIGgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGNiZ3JhYl9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgWENCR3JhYkNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgeGNiX2dldF9pbWFnZV9jb29raWVfdCBpcTsKKyAgICB4Y2JfZ2V0X2ltYWdlX3JlcGx5X3QgKmltZzsKKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZSA9IGMtPnNjcmVlbi0+cm9vdDsKKyAgICB1aW50OF90ICpkYXRhOworICAgIGludCBsZW5ndGgsIHJldDsKKworICAgIGlxICA9IHhjYl9nZXRfaW1hZ2UoYy0+Y29ubiwgWENCX0lNQUdFX0ZPUk1BVF9aX1BJWE1BUCwgZHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjLT54LCBjLT55LCBjLT53aWR0aCwgYy0+aGVpZ2h0LCB+MCk7CisKKyAgICBpbWcgPSB4Y2JfZ2V0X2ltYWdlX3JlcGx5KGMtPmNvbm4sIGlxLCBOVUxMKTsKKyAgICBpZiAoIWltZykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKworICAgIGRhdGEgICA9IHhjYl9nZXRfaW1hZ2VfZGF0YShpbWcpOworICAgIGxlbmd0aCA9IHhjYl9nZXRfaW1hZ2VfZGF0YV9sZW5ndGgoaW1nKTsKKworICAgIHJldCA9IGF2X25ld19wYWNrZXQocGt0LCBsZW5ndGgpOworCisgICAgaWYgKCFyZXQpCisgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIGRhdGEsIGxlbmd0aCk7CisKKyAgICBmcmVlKGltZyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3YWl0X2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBYQ0JHcmFiQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IGN1cnRpbWUsIGRlbGF5OworICAgIGludDY0X3QgZnJhbWVfdGltZSA9IGF2X3Jlc2NhbGVfcSgxLCBjLT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKKworICAgIGMtPnRpbWVfZnJhbWUgKz0gZnJhbWVfdGltZTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgY3VydGltZSA9IGF2X2dldHRpbWUoKTsKKyAgICAgICAgZGVsYXkgICA9IGMtPnRpbWVfZnJhbWUgLSBjdXJ0aW1lOworICAgICAgICBpZiAoZGVsYXkgPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhdl91c2xlZXAoZGVsYXkpOworICAgIH0KKworICAgIHBrdC0+cHRzID0gY3VydGltZTsKK30KKworI2lmIENPTkZJR19MSUJYQ0JfU0hNCitzdGF0aWMgaW50IGNoZWNrX3NobSh4Y2JfY29ubmVjdGlvbl90ICpjb25uKQoreworICAgIHhjYl9zaG1fcXVlcnlfdmVyc2lvbl9jb29raWVfdCBjb29raWUgPSB4Y2Jfc2htX3F1ZXJ5X3ZlcnNpb24oY29ubik7CisgICAgeGNiX3NobV9xdWVyeV92ZXJzaW9uX3JlcGx5X3QgKnJlcGx5OworCisgICAgcmVwbHkgPSB4Y2Jfc2htX3F1ZXJ5X3ZlcnNpb25fcmVwbHkoY29ubiwgY29va2llLCBOVUxMKTsKKyAgICBpZiAocmVwbHkpIHsKKyAgICAgICAgZnJlZShyZXBseSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZWFsbG9jX3NobSh2b2lkICp1bnVzZWQsIHVpbnQ4X3QgKmRhdGEpCit7CisgICAgc2htZHQoZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgeGNiZ3JhYl9mcmFtZV9zaG0oQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFhDQkdyYWJDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIHhjYl9zaG1fZ2V0X2ltYWdlX2Nvb2tpZV90IGlxOworICAgIHhjYl9zaG1fZ2V0X2ltYWdlX3JlcGx5X3QgKmltZzsKKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZSA9IGMtPnNjcmVlbi0+cm9vdDsKKyAgICB1aW50OF90ICpkYXRhOworICAgIGludCBzaXplID0gYy0+ZnJhbWVfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkU7CisgICAgaW50IGlkICAgPSBzaG1nZXQoSVBDX1BSSVZBVEUsIHNpemUsIElQQ19DUkVBVCB8IDA3NzcpOworICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgKmUgPSBOVUxMOworCisgICAgaWYgKGlkID09IC0xKSB7CisgICAgICAgIGNoYXIgZXJyYnVmWzEwMjRdOworICAgICAgICBpbnQgZXJyID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X3N0cmVycm9yKGVyciwgZXJyYnVmLCBzaXplb2YoZXJyYnVmKSk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgZ2V0ICVkIGJ5dGVzIG9mIHNoYXJlZCBtZW1vcnk6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIHNpemUsIGVycmJ1Zik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgeGNiX3NobV9hdHRhY2goYy0+Y29ubiwgYy0+c2VnbWVudCwgaWQsIDApOworCisgICAgaXEgPSB4Y2Jfc2htX2dldF9pbWFnZShjLT5jb25uLCBkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPngsIGMtPnksIGMtPndpZHRoLCBjLT5oZWlnaHQsIH4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWENCX0lNQUdFX0ZPUk1BVF9aX1BJWE1BUCwgYy0+c2VnbWVudCwgMCk7CisKKyAgICB4Y2Jfc2htX2RldGFjaChjLT5jb25uLCBjLT5zZWdtZW50KTsKKworICAgIGltZyA9IHhjYl9zaG1fZ2V0X2ltYWdlX3JlcGx5KGMtPmNvbm4sIGlxLCAmZSk7CisKKyAgICB4Y2JfZmx1c2goYy0+Y29ubik7CisKKyAgICBpZiAoZSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNhbm5vdCBnZXQgdGhlIGltYWdlIGRhdGEgIgorICAgICAgICAgICAgICAgImV2ZW50X2Vycm9yOiByZXNwb25zZV90eXBlOiV1IGVycm9yX2NvZGU6JXUgIgorICAgICAgICAgICAgICAgInNlcXVlbmNlOiV1IHJlc291cmNlX2lkOiV1IG1pbm9yX2NvZGU6JXUgbWFqb3JfY29kZToldS5cbiIsCisgICAgICAgICAgICAgICBlLT5yZXNwb25zZV90eXBlLCBlLT5lcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgZS0+c2VxdWVuY2UsIGUtPnJlc291cmNlX2lkLCBlLT5taW5vcl9jb2RlLCBlLT5tYWpvcl9jb2RlKTsKKworICAgICAgICBzaG1jdGwoaWQsIElQQ19STUlELCAwKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFDQ0VTKTsKKyAgICB9CisKKyAgICBmcmVlKGltZyk7CisKKyAgICBkYXRhID0gc2htYXQoaWQsIE5VTEwsIDApOworICAgIHNobWN0bChpZCwgSVBDX1JNSUQsIDApOworCisgICAgaWYgKChpbnRwdHJfdClkYXRhID09IC0xKQorICAgICAgICByZXR1cm4gQVZFUlJPUihlcnJubyk7CisKKyAgICBwa3QtPmJ1ZiA9IGF2X2J1ZmZlcl9jcmVhdGUoZGF0YSwgc2l6ZSwgZGVhbGxvY19zaG0sIE5VTEwsIDApOworICAgIGlmICghcGt0LT5idWYpIHsKKyAgICAgICAgc2htZHQoZGF0YSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcGt0LT5kYXRhID0gcGt0LT5idWYtPmRhdGE7CisgICAgcGt0LT5zaXplID0gYy0+ZnJhbWVfc2l6ZTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19MSUJYQ0JfU0hNICovCisKKyNpZiBDT05GSUdfTElCWENCX1hGSVhFUworc3RhdGljIGludCBjaGVja194Zml4ZXMoeGNiX2Nvbm5lY3Rpb25fdCAqY29ubikKK3sKKyAgICB4Y2JfeGZpeGVzX3F1ZXJ5X3ZlcnNpb25fY29va2llX3QgY29va2llOworICAgIHhjYl94Zml4ZXNfcXVlcnlfdmVyc2lvbl9yZXBseV90ICpyZXBseTsKKworICAgIGNvb2tpZSA9IHhjYl94Zml4ZXNfcXVlcnlfdmVyc2lvbihjb25uLCBYQ0JfWEZJWEVTX01BSk9SX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhDQl9YRklYRVNfTUlOT1JfVkVSU0lPTik7CisgICAgcmVwbHkgID0geGNiX3hmaXhlc19xdWVyeV92ZXJzaW9uX3JlcGx5KGNvbm4sIGNvb2tpZSwgTlVMTCk7CisKKyAgICBpZiAocmVwbHkpIHsKKyAgICAgICAgZnJlZShyZXBseSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBCTEVORCh0YXJnZXQsIHNvdXJjZSwgYWxwaGEpIFwKKyAgICAodGFyZ2V0KSArICgoc291cmNlKSAqICgyNTUgLSAoYWxwaGEpKSArIDI1NSAvIDIpIC8gMjU1CisKK3N0YXRpYyB2b2lkIHhjYmdyYWJfZHJhd19tb3VzZShBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3F1ZXJ5X3BvaW50ZXJfcmVwbHlfdCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X2dlb21ldHJ5X3JlcGx5X3QgKmdlbykKK3sKKyAgICBYQ0JHcmFiQ29udGV4dCAqZ3IgPSBzLT5wcml2X2RhdGE7CisgICAgdWludDMyX3QgKmN1cnNvcjsKKyAgICB1aW50OF90ICppbWFnZSA9IHBrdC0+ZGF0YTsKKyAgICBpbnQgc3RyaWRlICAgICA9IGdyLT5icHAgLyA4OworICAgIHhjYl94Zml4ZXNfZ2V0X2N1cnNvcl9pbWFnZV9jb29raWVfdCBjYzsKKyAgICB4Y2JfeGZpeGVzX2dldF9jdXJzb3JfaW1hZ2VfcmVwbHlfdCAqY2k7CisgICAgaW50IGN4LCBjeSwgeCwgeSwgdywgaCwgY19vZmYsIGlfb2ZmOworCisgICAgY2MgPSB4Y2JfeGZpeGVzX2dldF9jdXJzb3JfaW1hZ2UoZ3ItPmNvbm4pOworICAgIGNpID0geGNiX3hmaXhlc19nZXRfY3Vyc29yX2ltYWdlX3JlcGx5KGdyLT5jb25uLCBjYywgTlVMTCk7CisgICAgaWYgKCFjaSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY3Vyc29yID0geGNiX3hmaXhlc19nZXRfY3Vyc29yX2ltYWdlX2N1cnNvcl9pbWFnZShjaSk7CisgICAgaWYgKCFjdXJzb3IpCisgICAgICAgIHJldHVybjsKKworICAgIGN4ID0gY2ktPnggLSBjaS0+eGhvdDsKKyAgICBjeSA9IGNpLT55IC0gY2ktPnlob3Q7CisKKyAgICB4ID0gRkZNQVgoY3gsIGdyLT54KTsKKyAgICB5ID0gRkZNQVgoY3ksIGdyLT55KTsKKworICAgIHcgPSBGRk1JTihjeCArIGNpLT53aWR0aCwgIGdyLT54ICsgZ3ItPndpZHRoKSAgLSB4OworICAgIGggPSBGRk1JTihjeSArIGNpLT5oZWlnaHQsIGdyLT55ICsgZ3ItPmhlaWdodCkgLSB5OworCisgICAgY19vZmYgPSB4IC0gY3g7CisgICAgaV9vZmYgPSB4IC0gZ3ItPng7CisKKyAgICBjdXJzb3IgKz0gKHkgLSBjeSkgKiBjaS0+d2lkdGg7CisgICAgaW1hZ2UgICs9ICh5IC0gZ3ItPnkpICogZ3ItPndpZHRoICogc3RyaWRlOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBjdXJzb3IgKz0gY19vZmY7CisgICAgICAgIGltYWdlICArPSBpX29mZiAqIHN0cmlkZTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKywgY3Vyc29yKyssIGltYWdlICs9IHN0cmlkZSkgeworICAgICAgICAgICAgaW50IHIsIGcsIGIsIGE7CisKKyAgICAgICAgICAgIHIgPSAgKmN1cnNvciAgICAgICAgJiAweGZmOworICAgICAgICAgICAgZyA9ICgqY3Vyc29yID4+ICA4KSAmIDB4ZmY7CisgICAgICAgICAgICBiID0gKCpjdXJzb3IgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgIGEgPSAoKmN1cnNvciA+PiAyNCkgJiAweGZmOworCisgICAgICAgICAgICBpZiAoIWEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChhID09IDI1NSkgeworICAgICAgICAgICAgICAgIGltYWdlWzBdID0gcjsKKyAgICAgICAgICAgICAgICBpbWFnZVsxXSA9IGc7CisgICAgICAgICAgICAgICAgaW1hZ2VbMl0gPSBiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbWFnZVswXSA9IEJMRU5EKHIsIGltYWdlWzBdLCBhKTsKKyAgICAgICAgICAgICAgICBpbWFnZVsxXSA9IEJMRU5EKGcsIGltYWdlWzFdLCBhKTsKKyAgICAgICAgICAgICAgICBpbWFnZVsyXSA9IEJMRU5EKGIsIGltYWdlWzJdLCBhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGN1cnNvciArPSAgY2ktPndpZHRoIC0gdyAtIGNfb2ZmOworICAgICAgICBpbWFnZSAgKz0gKGdyLT53aWR0aCAtIHcgLSBpX29mZikgKiBzdHJpZGU7CisgICAgfQorCisgICAgZnJlZShjaSk7Cit9CisjZW5kaWYgLyogQ09ORklHX0xJQlhDQl9YRklYRVMgKi8KKworc3RhdGljIHZvaWQgeGNiZ3JhYl91cGRhdGVfcmVnaW9uKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBYQ0JHcmFiQ29udGV4dCAqYyAgICAgPSBzLT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDMyX3QgYXJnc1tdID0geyBjLT54IC0gYy0+cmVnaW9uX2JvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnkgLSBjLT5yZWdpb25fYm9yZGVyIH07CisKKyAgICB4Y2JfY29uZmlndXJlX3dpbmRvdyhjLT5jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGMtPndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYQ0JfQ09ORklHX1dJTkRPV19YIHwgWENCX0NPTkZJR19XSU5ET1dfWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzKTsKK30KKworc3RhdGljIGludCB4Y2JncmFiX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBYQ0JHcmFiQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICB4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdCBwYzsKKyAgICB4Y2JfZ2V0X2dlb21ldHJ5X2Nvb2tpZV90IGdjOworICAgIHhjYl9xdWVyeV9wb2ludGVyX3JlcGx5X3QgKnAgID0gTlVMTDsKKyAgICB4Y2JfZ2V0X2dlb21ldHJ5X3JlcGx5X3QgKmdlbyA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB3YWl0X2ZyYW1lKHMsIHBrdCk7CisKKyAgICBpZiAoYy0+Zm9sbG93X21vdXNlIHx8IGMtPmRyYXdfbW91c2UpIHsKKyAgICAgICAgcGMgID0geGNiX3F1ZXJ5X3BvaW50ZXIoYy0+Y29ubiwgYy0+c2NyZWVuLT5yb290KTsKKyAgICAgICAgZ2MgID0geGNiX2dldF9nZW9tZXRyeShjLT5jb25uLCBjLT5zY3JlZW4tPnJvb3QpOworICAgICAgICBwICAgPSB4Y2JfcXVlcnlfcG9pbnRlcl9yZXBseShjLT5jb25uLCBwYywgTlVMTCk7CisgICAgICAgIGdlbyA9IHhjYl9nZXRfZ2VvbWV0cnlfcmVwbHkoYy0+Y29ubiwgZ2MsIE5VTEwpOworICAgIH0KKworICAgIGlmIChjLT5mb2xsb3dfbW91c2UgJiYgcC0+c2FtZV9zY3JlZW4pCisgICAgICAgIHhjYmdyYWJfcmVwb3NpdGlvbihzLCBwLCBnZW8pOworCisgICAgaWYgKGMtPnNob3dfcmVnaW9uKQorICAgICAgICB4Y2JncmFiX3VwZGF0ZV9yZWdpb24ocyk7CisKKyNpZiBDT05GSUdfTElCWENCX1NITQorICAgIGlmIChjLT5oYXNfc2htICYmIHhjYmdyYWJfZnJhbWVfc2htKHMsIHBrdCkgPCAwKQorICAgICAgICBjLT5oYXNfc2htID0gMDsKKyNlbmRpZgorICAgIGlmICghYy0+aGFzX3NobSkKKyAgICAgICAgcmV0ID0geGNiZ3JhYl9mcmFtZShzLCBwa3QpOworCisjaWYgQ09ORklHX0xJQlhDQl9YRklYRVMKKyAgICBpZiAoYy0+ZHJhd19tb3VzZSAmJiBwLT5zYW1lX3NjcmVlbikKKyAgICAgICAgeGNiZ3JhYl9kcmF3X21vdXNlKHMsIHBrdCwgcCwgZ2VvKTsKKyNlbmRpZgorCisgICAgZnJlZShwKTsKKyAgICBmcmVlKGdlbyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgeGNiZ3JhYl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBYQ0JHcmFiQ29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworCisgICAgeGNiX2Rpc2Nvbm5lY3QoY3R4LT5jb25uKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgeGNiX3NjcmVlbl90ICpnZXRfc2NyZWVuKGNvbnN0IHhjYl9zZXR1cF90ICpzZXR1cCwgaW50IHNjcmVlbl9udW0pCit7CisgICAgeGNiX3NjcmVlbl9pdGVyYXRvcl90IGl0ID0geGNiX3NldHVwX3Jvb3RzX2l0ZXJhdG9yKHNldHVwKTsKKyAgICB4Y2Jfc2NyZWVuX3QgKnNjcmVlbiAgICAgPSBOVUxMOworCisgICAgZm9yICg7IGl0LnJlbSA+IDA7IHhjYl9zY3JlZW5fbmV4dCAoJml0KSkgeworICAgICAgICBpZiAoIXNjcmVlbl9udW0pIHsKKyAgICAgICAgICAgIHNjcmVlbiA9IGl0LmRhdGE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNjcmVlbl9udW0tLTsKKyAgICB9CisKKyAgICByZXR1cm4gc2NyZWVuOworfQorCitzdGF0aWMgaW50IHBpeGZtdF9mcm9tX3BpeG1hcF9mb3JtYXQoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwaXhfZm10KQoreworICAgIFhDQkdyYWJDb250ZXh0ICpjICAgICAgICA9IHMtPnByaXZfZGF0YTsKKyAgICBjb25zdCB4Y2Jfc2V0dXBfdCAqc2V0dXAgPSB4Y2JfZ2V0X3NldHVwKGMtPmNvbm4pOworICAgIGNvbnN0IHhjYl9mb3JtYXRfdCAqZm10ICA9IHhjYl9zZXR1cF9waXhtYXBfZm9ybWF0cyhzZXR1cCk7CisgICAgaW50IGxlbmd0aCAgICAgICAgICAgICAgID0geGNiX3NldHVwX3BpeG1hcF9mb3JtYXRzX2xlbmd0aChzZXR1cCk7CisKKyAgICAqcGl4X2ZtdCA9IDA7CisKKyAgICB3aGlsZSAobGVuZ3RoLS0pIHsKKyAgICAgICAgaWYgKGZtdC0+ZGVwdGggPT0gZGVwdGgpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZGVwdGgpIHsKKyAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgaWYgKGZtdC0+Yml0c19wZXJfcGl4ZWwgPT0gMzIpCisgICAgICAgICAgICAgICAgICAgICpwaXhfZm10ID0gQVZfUElYX0ZNVF9BUkdCOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICBpZiAoZm10LT5iaXRzX3Blcl9waXhlbCA9PSAzMikKKyAgICAgICAgICAgICAgICAgICAgKnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjMyOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZtdC0+Yml0c19wZXJfcGl4ZWwgPT0gMjQpCisgICAgICAgICAgICAgICAgICAgICpwaXhfZm10ID0gQVZfUElYX0ZNVF9SR0IyNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgaWYgKGZtdC0+Yml0c19wZXJfcGl4ZWwgPT0gMTYpCisgICAgICAgICAgICAgICAgICAgICpwaXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NjU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIGlmIChmbXQtPmJpdHNfcGVyX3BpeGVsID09IDE2KQorICAgICAgICAgICAgICAgICAgICAqcGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNTU1OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIGlmIChmbXQtPmJpdHNfcGVyX3BpeGVsID09IDgpCisgICAgICAgICAgICAgICAgICAgICpwaXhfZm10ID0gQVZfUElYX0ZNVF9SR0I4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCpwaXhfZm10KSB7CisgICAgICAgICAgICBjLT5icHAgICAgICAgID0gZm10LT5iaXRzX3Blcl9waXhlbDsKKyAgICAgICAgICAgIGMtPmZyYW1lX3NpemUgPSBjLT53aWR0aCAqIGMtPmhlaWdodCAqIGZtdC0+Yml0c19wZXJfcGl4ZWwgLyA4OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBmbXQrKzsKKyAgICB9CisgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlBpeG1hcCBmb3JtYXQgbm90IG1hcHBhYmxlLlxuIik7CisKKyAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX3N0cmVhbShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgWENCR3JhYkNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ICAgICAgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIHhjYl9nZXRfZ2VvbWV0cnlfY29va2llX3QgZ2M7CisgICAgeGNiX2dldF9nZW9tZXRyeV9yZXBseV90ICpnZW87CisgICAgaW50IHJldDsKKworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXQgPSBhdl9wYXJzZV92aWRlb19zaXplKCZjLT53aWR0aCwgJmMtPmhlaWdodCwgYy0+dmlkZW9fc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBhdl9wYXJzZV92aWRlb19yYXRlKCZzdC0+YXZnX2ZyYW1lX3JhdGUsIGMtPmZyYW1lcmF0ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMDAwMCk7CisKKyAgICBnYyAgPSB4Y2JfZ2V0X2dlb21ldHJ5KGMtPmNvbm4sIGMtPnNjcmVlbi0+cm9vdCk7CisgICAgZ2VvID0geGNiX2dldF9nZW9tZXRyeV9yZXBseShjLT5jb25uLCBnYywgTlVMTCk7CisKKyAgICBjLT53aWR0aCAgICAgID0gRkZNSU4oZ2VvLT53aWR0aCwgYy0+d2lkdGgpOworICAgIGMtPmhlaWdodCAgICAgPSBGRk1JTihnZW8tPmhlaWdodCwgYy0+aGVpZ2h0KTsKKyAgICBjLT50aW1lX2Jhc2UgID0gKEFWUmF0aW9uYWwpeyBzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5hdmdfZnJhbWVfcmF0ZS5udW0gfTsKKyAgICBjLT50aW1lX2ZyYW1lID0gYXZfZ2V0dGltZSgpOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IGMtPndpZHRoOworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGMtPmhlaWdodDsKKyAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZSAgPSBjLT50aW1lX2Jhc2U7CisKKyAgICByZXQgPSBwaXhmbXRfZnJvbV9waXhtYXBfZm9ybWF0KHMsIGdlby0+ZGVwdGgsICZzdC0+Y29kZWMtPnBpeF9mbXQpOworCisgICAgZnJlZShnZW8pOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZHJhd19yZWN0YW5nbGUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFhDQkdyYWJDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIHhjYl9nY29udGV4dF90IGdjID0geGNiX2dlbmVyYXRlX2lkKGMtPmNvbm4pOworICAgIHVpbnQzMl90IG1hc2sgICAgID0gWENCX0dDX0ZPUkVHUk9VTkQgfAorICAgICAgICAgICAgICAgICAgICAgICAgWENCX0dDX0JBQ0tHUk9VTkQgfAorICAgICAgICAgICAgICAgICAgICAgICAgWENCX0dDX0xJTkVfV0lEVEggfAorICAgICAgICAgICAgICAgICAgICAgICAgWENCX0dDX0xJTkVfU1RZTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgWENCX0dDX0ZJTExfU1RZTEU7CisgICAgdWludDMyX3QgdmFsdWVzW10gPSB7IGMtPnNjcmVlbi0+YmxhY2tfcGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnNjcmVlbi0+d2hpdGVfcGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnJlZ2lvbl9ib3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhDQl9MSU5FX1NUWUxFX0RPVUJMRV9EQVNILAorICAgICAgICAgICAgICAgICAgICAgICAgICBYQ0JfRklMTF9TVFlMRV9TT0xJRCB9OworICAgIHhjYl9yZWN0YW5nbGVfdCByID0geyAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjLT53aWR0aCAgKyBjLT5yZWdpb25fYm9yZGVyICogMiAtIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmhlaWdodCArIGMtPnJlZ2lvbl9ib3JkZXIgKiAyIC0gMyB9OworCisgICAgeGNiX2NyZWF0ZV9nYyhjLT5jb25uLCBnYywgYy0+d2luZG93LCBtYXNrLCB2YWx1ZXMpOworCisgICAgeGNiX3BvbHlfcmVjdGFuZ2xlKGMtPmNvbm4sIGMtPndpbmRvdywgZ2MsIDEsICZyKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfd2luZG93KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBYQ0JHcmFiQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50MzJfdCBtYXNrICAgICA9IFhDQl9DV19PVkVSUklERV9SRURJUkVDVCB8IFhDQl9DV19FVkVOVF9NQVNLOworICAgIHVpbnQzMl90IHZhbHVlc1tdID0geyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYQ0JfRVZFTlRfTUFTS19FWFBPU1VSRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIFhDQl9FVkVOVF9NQVNLX1NUUlVDVFVSRV9OT1RJRlkgfTsKKyAgICB4Y2JfcmVjdGFuZ2xlX3QgcmVjdCA9IHsgYy0+eCwgYy0+eSwgYy0+d2lkdGgsIGMtPmhlaWdodCB9OworCisgICAgYy0+d2luZG93ID0geGNiX2dlbmVyYXRlX2lkKGMtPmNvbm4pOworCisgICAgeGNiX2NyZWF0ZV93aW5kb3coYy0+Y29ubiwgWENCX0NPUFlfRlJPTV9QQVJFTlQsCisgICAgICAgICAgICAgICAgICAgICAgYy0+d2luZG93LAorICAgICAgICAgICAgICAgICAgICAgIGMtPnNjcmVlbi0+cm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICBjLT54IC0gYy0+cmVnaW9uX2JvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBjLT55IC0gYy0+cmVnaW9uX2JvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBjLT53aWR0aCArIGMtPnJlZ2lvbl9ib3JkZXIgKiAyLAorICAgICAgICAgICAgICAgICAgICAgIGMtPmhlaWdodCArIGMtPnJlZ2lvbl9ib3JkZXIgKiAyLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgWENCX1dJTkRPV19DTEFTU19JTlBVVF9PVVRQVVQsCisgICAgICAgICAgICAgICAgICAgICAgWENCX0NPUFlfRlJPTV9QQVJFTlQsCisgICAgICAgICAgICAgICAgICAgICAgbWFzaywgdmFsdWVzKTsKKworI2lmIENPTkZJR19MSUJYQ0JfU0hBUEUKKyAgICB4Y2Jfc2hhcGVfcmVjdGFuZ2xlcyhjLT5jb25uLCBYQ0JfU0hBUEVfU09fU1VCVFJBQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgWENCX1NIQVBFX1NLX0JPVU5ESU5HLCBYQ0JfQ0xJUF9PUkRFUklOR19VTlNPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjLT53aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cmVnaW9uX2JvcmRlciwgYy0+cmVnaW9uX2JvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmcmVjdCk7CisjZW5kaWYKKworICAgIHhjYl9tYXBfd2luZG93KGMtPmNvbm4sIGMtPndpbmRvdyk7CisKKyAgICBkcmF3X3JlY3RhbmdsZShzKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHhjYmdyYWJfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFhDQkdyYWJDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCBzY3JlZW5fbnVtLCByZXQ7CisgICAgY29uc3QgeGNiX3NldHVwX3QgKnNldHVwOworICAgIGNoYXIgKmRpc3BsYXlfbmFtZSA9IGF2X3N0cmR1cChzLT5maWxlbmFtZSk7CisKKyAgICBpZiAoIWRpc3BsYXlfbmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmICghc3NjYW5mKHMtPmZpbGVuYW1lLCAiJVteK10rJWQsJWQiLCBkaXNwbGF5X25hbWUsICZjLT54LCAmYy0+eSkpIHsKKyAgICAgICAgKmRpc3BsYXlfbmFtZSA9IDA7CisgICAgICAgIHNzY2FuZihzLT5maWxlbmFtZSwgIislZCwlZCIsICZjLT54LCAmYy0+eSk7CisgICAgfQorCisgICAgYy0+Y29ubiA9IHhjYl9jb25uZWN0KGRpc3BsYXlfbmFtZSwgJnNjcmVlbl9udW0pOworICAgIGF2X2ZyZWVwKCZkaXNwbGF5X25hbWUpOworICAgIGlmICgocmV0ID0geGNiX2Nvbm5lY3Rpb25faGFzX2Vycm9yKGMtPmNvbm4pKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IG9wZW4gZGlzcGxheSAlcywgZXJyb3IgJWQuXG4iLAorICAgICAgICAgICAgICAgKCpzLT5maWxlbmFtZSkgPyBzLT5maWxlbmFtZSA6ICJkZWZhdWx0IiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgc2V0dXAgPSB4Y2JfZ2V0X3NldHVwKGMtPmNvbm4pOworCisgICAgYy0+c2NyZWVuID0gZ2V0X3NjcmVlbihzZXR1cCwgc2NyZWVuX251bSk7CisgICAgaWYgKCFjLT5zY3JlZW4pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlRoZSBzY3JlZW4gJWQgZG9lcyBub3QgZXhpc3QuXG4iLAorICAgICAgICAgICAgICAgc2NyZWVuX251bSk7CisgICAgICAgIHhjYmdyYWJfcmVhZF9jbG9zZShzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyNpZiBDT05GSUdfTElCWENCX1NITQorICAgIGMtPnNlZ21lbnQgPSB4Y2JfZ2VuZXJhdGVfaWQoYy0+Y29ubik7CisjZW5kaWYKKworICAgIHJldCA9IGNyZWF0ZV9zdHJlYW0ocyk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICB4Y2JncmFiX3JlYWRfY2xvc2Uocyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisjaWYgQ09ORklHX0xJQlhDQl9TSE0KKyAgICBjLT5oYXNfc2htID0gY2hlY2tfc2htKGMtPmNvbm4pOworI2VuZGlmCisKKyNpZiBDT05GSUdfTElCWENCX1hGSVhFUworICAgIGlmIChjLT5kcmF3X21vdXNlKSB7CisgICAgICAgIGlmICghKGMtPmRyYXdfbW91c2UgPSBjaGVja194Zml4ZXMoYy0+Y29ubikpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIlhGaXhlcyBub3QgYXZhaWxhYmxlLCBjYW5ub3QgZHJhdyB0aGUgbW91c2UuXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYy0+YnBwIDwgMjQpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMsICIlZCBiaXRzIHBlciBwaXhlbCBzY3JlZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YnBwKTsKKyAgICAgICAgICAgIGMtPmRyYXdfbW91c2UgPSAwOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoYy0+c2hvd19yZWdpb24pCisgICAgICAgIHNldHVwX3dpbmRvdyhzKTsKKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3gxMWdyYWJfeGNiX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIngxMWdyYWIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJYMTEgc2NyZWVuIGNhcHR1cmUsIHVzaW5nIFhDQiIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihYQ0JHcmFiQ29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgID0geGNiZ3JhYl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSB4Y2JncmFiX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHhjYmdyYWJfcmVhZF9jbG9zZSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnhjYmdyYWJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZGV2aWNlL3h2LmMgYi9mZm1wZWcvbGliYXZkZXZpY2UveHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTljMTVjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZGV2aWNlL3h2LmMKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgSmVmZiBNb2d1aWxsYW5za3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogWFZpZGVvIG91dHB1dCBkZXZpY2UKKyAqCisgKiBUT0RPOgorICogLSBhZGQgc3VwcG9ydCB0byBtb3JlIGZvcm1hdHMKKyAqLworCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9Ydi5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hTaG0uaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YdmxpYi5oPgorI2luY2x1ZGUgPHN5cy9zaG0uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZkZXZpY2UuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIEdDIGdjOworCisgICAgV2luZG93IHdpbmRvdzsKKyAgICBpbnQ2NF90IHdpbmRvd19pZDsKKyAgICBjaGFyICp3aW5kb3dfdGl0bGU7CisgICAgaW50IHdpbmRvd193aWR0aCwgd2luZG93X2hlaWdodDsKKyAgICBpbnQgd2luZG93X3gsIHdpbmRvd195OworICAgIGludCBkZXN0X3gsIGRlc3RfeTsgICAgICAgICAgLyoqPCBkaXNwbGF5IGFyZWEgcG9zaXRpb24gKi8KKyAgICB1bnNpZ25lZCBpbnQgZGVzdF93LCBkZXN0X2g7IC8qKjwgZGlzcGxheSBhcmVhIGRpbWVuc2lvbnMgKi8KKworICAgIERpc3BsYXkqIGRpc3BsYXk7CisgICAgY2hhciAqZGlzcGxheV9uYW1lOworCisgICAgWHZJbWFnZSogeXV2X2ltYWdlOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBpbWFnZV9mb3JtYXQ7CisgICAgaW50IGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQ7CisgICAgWFNobVNlZ21lbnRJbmZvIHl1dl9zaG1pbmZvOworICAgIGludCB4dl9wb3J0OworICAgIEF0b20gd21fZGVsZXRlX21lc3NhZ2U7Cit9IFhWQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgWFZUYWdGb3JtYXRNYXAKK3sKKyAgICBpbnQgdGFnOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXQ7Cit9IFhWVGFnRm9ybWF0TWFwOworCitzdGF0aWMgY29uc3QgWFZUYWdGb3JtYXRNYXAgdGFnX2NvZGVjX21hcFtdID0geworICAgIHsgTUtUQUcoJ0knLCc0JywnMicsJzAnKSwgQVZfUElYX0ZNVF9ZVVY0MjBQIH0sCisgICAgeyBNS1RBRygnVScsJ1knLCdWJywnWScpLCBBVl9QSVhfRk1UX1VZVlk0MjIgfSwKKyAgICB7IE1LVEFHKCdZJywnVScsJ1knLCcyJyksIEFWX1BJWF9GTVRfWVVZVjQyMiB9LAorICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0KK307CisKK3N0YXRpYyBpbnQgeHZfZ2V0X3RhZ19mcm9tX2Zvcm1hdChlbnVtIEFWUGl4ZWxGb3JtYXQgZm9ybWF0KQoreworICAgIGNvbnN0IFhWVGFnRm9ybWF0TWFwICptID0gdGFnX2NvZGVjX21hcDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBtLT50YWc7IG0gPSAmdGFnX2NvZGVjX21hcFsrK2ldKSB7CisgICAgICAgIGlmIChtLT5mb3JtYXQgPT0gZm9ybWF0KQorICAgICAgICAgICAgcmV0dXJuIG0tPnRhZzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeHZfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgWFZDb250ZXh0ICp4diA9IHMtPnByaXZfZGF0YTsKKyAgICBpZiAoeHYtPmRpc3BsYXkpIHsKKyAgICAgICAgWFNobURldGFjaCh4di0+ZGlzcGxheSwgJnh2LT55dXZfc2htaW5mbyk7CisgICAgICAgIGlmICh4di0+eXV2X2ltYWdlKQorICAgICAgICAgICAgc2htZHQoeHYtPnl1dl9pbWFnZS0+ZGF0YSk7CisgICAgICAgIFhGcmVlKHh2LT55dXZfaW1hZ2UpOworICAgICAgICBpZiAoeHYtPmdjKQorICAgICAgICAgICAgWEZyZWVHQyh4di0+ZGlzcGxheSwgeHYtPmdjKTsKKyAgICAgICAgWENsb3NlRGlzcGxheSh4di0+ZGlzcGxheSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHh2X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgWFZDb250ZXh0ICp4diA9IHMtPnByaXZfZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgbnVtX2FkYXB0b3JzOworICAgIFh2QWRhcHRvckluZm8gKmFpOworICAgIFh2SW1hZ2VGb3JtYXRWYWx1ZXMgKmZ2OworICAgIFhDb2xvciBmZ2NvbG9yOworICAgIFhXaW5kb3dBdHRyaWJ1dGVzIHdpbmRvd19hdHRyczsKKyAgICBpbnQgbnVtX2Zvcm1hdHMgPSAwLCBqLCB0YWcsIHJldDsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jY3R4ID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisKKyAgICBpZiAoICAgcy0+bmJfc3RyZWFtcyA+IDEKKyAgICAgICAgfHwgZW5jY3R4LT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTworICAgICAgICB8fCBlbmNjdHgtPmNvZGVjX2lkICAgIT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk9ubHkgc3VwcG9ydHMgb25lIHJhd3ZpZGVvIHN0cmVhbVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKCEodGFnID0geHZfZ2V0X3RhZ19mcm9tX2Zvcm1hdChlbmNjdHgtPnBpeF9mbXQpKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdCAnJXMnLCBvbmx5IHl1djQyMHAsIHV5dnk0MjIsIHl1eXY0MjIgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWRcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGVuY2N0eC0+cGl4X2ZtdCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIHh2LT5pbWFnZV9mb3JtYXQgPSBlbmNjdHgtPnBpeF9mbXQ7CisKKyAgICB4di0+ZGlzcGxheSA9IFhPcGVuRGlzcGxheSh4di0+ZGlzcGxheV9uYW1lKTsKKyAgICBpZiAoIXh2LT5kaXNwbGF5KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgb3BlbiB0aGUgWDExIGRpc3BsYXkgJyVzJ1xuIiwgeHYtPmRpc3BsYXlfbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgeHYtPmltYWdlX3dpZHRoICA9IGVuY2N0eC0+d2lkdGg7CisgICAgeHYtPmltYWdlX2hlaWdodCA9IGVuY2N0eC0+aGVpZ2h0OworICAgIGlmICgheHYtPndpbmRvd193aWR0aCAmJiAheHYtPndpbmRvd19oZWlnaHQpIHsKKyAgICAgICAgQVZSYXRpb25hbCBzYXIgPSBlbmNjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgIHh2LT53aW5kb3dfd2lkdGggID0gZW5jY3R4LT53aWR0aDsKKyAgICAgICAgeHYtPndpbmRvd19oZWlnaHQgPSBlbmNjdHgtPmhlaWdodDsKKyAgICAgICAgaWYgKHNhci5udW0pIHsKKyAgICAgICAgICAgIGlmIChzYXIubnVtID4gc2FyLmRlbikKKyAgICAgICAgICAgICAgICB4di0+d2luZG93X3dpZHRoID0gYXZfcmVzY2FsZSh4di0+d2luZG93X3dpZHRoLCBzYXIubnVtLCBzYXIuZGVuKTsKKyAgICAgICAgICAgIGlmIChzYXIubnVtIDwgc2FyLmRlbikKKyAgICAgICAgICAgICAgICB4di0+d2luZG93X2hlaWdodCA9IGF2X3Jlc2NhbGUoeHYtPndpbmRvd19oZWlnaHQsIHNhci5kZW4sIHNhci5udW0pOworICAgICAgICB9CisgICAgfQorICAgIGlmICgheHYtPndpbmRvd19pZCkgeworICAgICAgICB4di0+d2luZG93ID0gWENyZWF0ZVNpbXBsZVdpbmRvdyh4di0+ZGlzcGxheSwgRGVmYXVsdFJvb3RXaW5kb3coeHYtPmRpc3BsYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4di0+d2luZG93X3gsIHh2LT53aW5kb3dfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHYtPndpbmRvd193aWR0aCwgeHYtPndpbmRvd19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICBpZiAoIXh2LT53aW5kb3dfdGl0bGUpIHsKKyAgICAgICAgICAgIGlmICghKHh2LT53aW5kb3dfdGl0bGUgPSBhdl9zdHJkdXAocy0+ZmlsZW5hbWUpKSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgWFN0b3JlTmFtZSh4di0+ZGlzcGxheSwgeHYtPndpbmRvdywgeHYtPndpbmRvd190aXRsZSk7CisgICAgICAgIHh2LT53bV9kZWxldGVfbWVzc2FnZSA9IFhJbnRlcm5BdG9tKHh2LT5kaXNwbGF5LCAiV01fREVMRVRFX1dJTkRPVyIsIEZhbHNlKTsKKyAgICAgICAgWFNldFdNUHJvdG9jb2xzKHh2LT5kaXNwbGF5LCB4di0+d2luZG93LCAmeHYtPndtX2RlbGV0ZV9tZXNzYWdlLCAxKTsKKyAgICAgICAgWE1hcFdpbmRvdyh4di0+ZGlzcGxheSwgeHYtPndpbmRvdyk7CisgICAgfSBlbHNlCisgICAgICAgIHh2LT53aW5kb3cgPSB4di0+d2luZG93X2lkOworCisgICAgaWYgKFh2UXVlcnlBZGFwdG9ycyh4di0+ZGlzcGxheSwgRGVmYXVsdFJvb3RXaW5kb3coeHYtPmRpc3BsYXkpLCAmbnVtX2FkYXB0b3JzLCAmYWkpICE9IFN1Y2Nlc3MpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoIW51bV9hZGFwdG9ycykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm8gWC1WaWRlbyBhZGFwdG9ycyBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PREVWKTsKKyAgICB9CisgICAgeHYtPnh2X3BvcnQgPSBhaVswXS5iYXNlX2lkOworICAgIFh2RnJlZUFkYXB0b3JJbmZvKGFpKTsKKworICAgIGZ2ID0gWHZMaXN0SW1hZ2VGb3JtYXRzKHh2LT5kaXNwbGF5LCB4di0+eHZfcG9ydCwgJm51bV9mb3JtYXRzKTsKKyAgICBpZiAoIWZ2KSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgZm9yIChqID0gMDsgaiA8IG51bV9mb3JtYXRzOyBqKyspIHsKKyAgICAgICAgaWYgKGZ2W2pdLmlkID09IHRhZykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgWEZyZWUoZnYpOworCisgICAgaWYgKGogPj0gbnVtX2Zvcm1hdHMpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBwaXhlbCBmb3JtYXQgJXMsIGFib3J0aW5nXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShlbmNjdHgtPnBpeF9mbXQpKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgeHYtPmdjID0gWENyZWF0ZUdDKHh2LT5kaXNwbGF5LCB4di0+d2luZG93LCAwLCAwKTsKKyAgICB4di0+aW1hZ2Vfd2lkdGggID0gZW5jY3R4LT53aWR0aDsKKyAgICB4di0+aW1hZ2VfaGVpZ2h0ID0gZW5jY3R4LT5oZWlnaHQ7CisgICAgeHYtPnl1dl9pbWFnZSA9IFh2U2htQ3JlYXRlSW1hZ2UoeHYtPmRpc3BsYXksIHh2LT54dl9wb3J0LCB0YWcsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHYtPmltYWdlX3dpZHRoLCB4di0+aW1hZ2VfaGVpZ2h0LCAmeHYtPnl1dl9zaG1pbmZvKTsKKyAgICB4di0+eXV2X3NobWluZm8uc2htaWQgPSBzaG1nZXQoSVBDX1BSSVZBVEUsIHh2LT55dXZfaW1hZ2UtPmRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDX0NSRUFUIHwgMDc3Nyk7CisgICAgeHYtPnl1dl9zaG1pbmZvLnNobWFkZHIgPSAoY2hhciAqKXNobWF0KHh2LT55dXZfc2htaW5mby5zaG1pZCwgMCwgMCk7CisgICAgeHYtPnl1dl9pbWFnZS0+ZGF0YSA9IHh2LT55dXZfc2htaW5mby5zaG1hZGRyOworICAgIHh2LT55dXZfc2htaW5mby5yZWFkT25seSA9IEZhbHNlOworCisgICAgWFNobUF0dGFjaCh4di0+ZGlzcGxheSwgJnh2LT55dXZfc2htaW5mbyk7CisgICAgWFN5bmMoeHYtPmRpc3BsYXksIEZhbHNlKTsKKyAgICBzaG1jdGwoeHYtPnl1dl9zaG1pbmZvLnNobWlkLCBJUENfUk1JRCwgMCk7CisKKyAgICBYR2V0V2luZG93QXR0cmlidXRlcyh4di0+ZGlzcGxheSwgeHYtPndpbmRvdywgJndpbmRvd19hdHRycyk7CisgICAgZmdjb2xvci5yZWQgPSBmZ2NvbG9yLmdyZWVuID0gZmdjb2xvci5ibHVlID0gMDsKKyAgICBmZ2NvbG9yLmZsYWdzID0gRG9SZWQgfCBEb0dyZWVuIHwgRG9CbHVlOworICAgIFhBbGxvY0NvbG9yKHh2LT5kaXNwbGF5LCB3aW5kb3dfYXR0cnMuY29sb3JtYXAsICZmZ2NvbG9yKTsKKyAgICBYU2V0Rm9yZWdyb3VuZCh4di0+ZGlzcGxheSwgeHYtPmdjLCBmZ2NvbG9yLnBpeGVsKTsKKyAgICAvL2ZvcmNlIGRpc3BsYXkgYXJlYSByZWNhbGN1bGF0aW9uIGF0IGZpcnN0IGZyYW1lCisgICAgeHYtPndpbmRvd193aWR0aCA9IHh2LT53aW5kb3dfaGVpZ2h0ID0gMDsKKworICAgIHJldHVybiAwOworICBmYWlsOgorICAgIHh2X3dyaXRlX3RyYWlsZXIocyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZV9kaXNwbGF5X2FyZWEoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFhWQ29udGV4dCAqeHYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZSYXRpb25hbCBzYXIsIGRhcjsgLyogc2FtcGxlIGFuZCBkaXNwbGF5IGFzcGVjdCByYXRpb3MgKi8KKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIEFWQ29kZWNDb250ZXh0ICplbmNjdHggPSBzdC0+Y29kZWM7CisKKyAgICAvKiBjb21wdXRlIG92ZXJsYXkgd2lkdGggYW5kIGhlaWdodCBmcm9tIHRoZSBjb2RlYyBjb250ZXh0IGluZm9ybWF0aW9uICovCisgICAgc2FyID0gc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID8gc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gOiAoQVZSYXRpb25hbCl7IDEsIDEgfTsKKyAgICBkYXIgPSBhdl9tdWxfcShzYXIsIChBVlJhdGlvbmFsKXsgZW5jY3R4LT53aWR0aCwgZW5jY3R4LT5oZWlnaHQgfSk7CisKKyAgICAvKiB3ZSBzdXBwb3NlIHRoZSBzY3JlZW4gaGFzIGEgMS8xIHNhbXBsZSBhc3BlY3QgcmF0aW8gKi8KKyAgICAvKiBmaXQgaW4gdGhlIHdpbmRvdyAqLworICAgIGlmIChhdl9jbXBfcShkYXIsIChBVlJhdGlvbmFsKXsgeHYtPmRlc3RfdywgeHYtPmRlc3RfaCB9KSA+IDApIHsKKyAgICAgICAgLyogZml0IGluIHdpZHRoICovCisgICAgICAgIHh2LT5kZXN0X3kgPSB4di0+ZGVzdF9oOworICAgICAgICB4di0+ZGVzdF94ID0gMDsKKyAgICAgICAgeHYtPmRlc3RfaCA9IGF2X3Jlc2NhbGUoeHYtPmRlc3RfdywgZGFyLmRlbiwgZGFyLm51bSk7CisgICAgICAgIHh2LT5kZXN0X3kgLT0geHYtPmRlc3RfaDsKKyAgICAgICAgeHYtPmRlc3RfeSAvPSAyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGZpdCBpbiBoZWlnaHQgKi8KKyAgICAgICAgeHYtPmRlc3RfeCA9IHh2LT5kZXN0X3c7CisgICAgICAgIHh2LT5kZXN0X3kgPSAwOworICAgICAgICB4di0+ZGVzdF93ID0gYXZfcmVzY2FsZSh4di0+ZGVzdF9oLCBkYXIubnVtLCBkYXIuZGVuKTsKKyAgICAgICAgeHYtPmRlc3RfeCAtPSB4di0+ZGVzdF93OworICAgICAgICB4di0+ZGVzdF94IC89IDI7CisgICAgfQorfQorCitzdGF0aWMgaW50IHh2X3JlcGFpbnQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFhWQ29udGV4dCAqeHYgPSBzLT5wcml2X2RhdGE7CisgICAgWFdpbmRvd0F0dHJpYnV0ZXMgd2luZG93X2F0dHJzOworCisgICAgWEdldFdpbmRvd0F0dHJpYnV0ZXMoeHYtPmRpc3BsYXksIHh2LT53aW5kb3csICZ3aW5kb3dfYXR0cnMpOworICAgIGlmICh3aW5kb3dfYXR0cnMud2lkdGggIT0geHYtPndpbmRvd193aWR0aCB8fCB3aW5kb3dfYXR0cnMuaGVpZ2h0ICE9IHh2LT53aW5kb3dfaGVpZ2h0KSB7CisgICAgICAgIFhSZWN0YW5nbGUgcmVjdFsyXTsKKyAgICAgICAgeHYtPmRlc3RfdyA9IHdpbmRvd19hdHRycy53aWR0aDsKKyAgICAgICAgeHYtPmRlc3RfaCA9IHdpbmRvd19hdHRycy5oZWlnaHQ7CisgICAgICAgIGNvbXB1dGVfZGlzcGxheV9hcmVhKHMpOworICAgICAgICBpZiAoeHYtPmRlc3RfeCkgeworICAgICAgICAgICAgcmVjdFswXS53aWR0aCAgPSByZWN0WzFdLndpZHRoICA9IHh2LT5kZXN0X3g7CisgICAgICAgICAgICByZWN0WzBdLmhlaWdodCA9IHJlY3RbMV0uaGVpZ2h0ID0gd2luZG93X2F0dHJzLmhlaWdodDsKKyAgICAgICAgICAgIHJlY3RbMF0ueSAgICAgID0gcmVjdFsxXS55ICAgICAgPSAwOworICAgICAgICAgICAgcmVjdFswXS54ID0gMDsKKyAgICAgICAgICAgIHJlY3RbMV0ueCA9IHh2LT5kZXN0X3cgKyB4di0+ZGVzdF94OworICAgICAgICAgICAgWEZpbGxSZWN0YW5nbGVzKHh2LT5kaXNwbGF5LCB4di0+d2luZG93LCB4di0+Z2MsIHJlY3QsIDIpOworICAgICAgICB9CisgICAgICAgIGlmICh4di0+ZGVzdF95KSB7CisgICAgICAgICAgICByZWN0WzBdLndpZHRoICA9IHJlY3RbMV0ud2lkdGggID0gd2luZG93X2F0dHJzLndpZHRoOworICAgICAgICAgICAgcmVjdFswXS5oZWlnaHQgPSByZWN0WzFdLmhlaWdodCA9IHh2LT5kZXN0X3k7CisgICAgICAgICAgICByZWN0WzBdLnggICAgICA9IHJlY3RbMV0ueCAgICAgID0gMDsKKyAgICAgICAgICAgIHJlY3RbMF0ueSA9IDA7CisgICAgICAgICAgICByZWN0WzFdLnkgPSB4di0+ZGVzdF9oICsgeHYtPmRlc3RfeTsKKyAgICAgICAgICAgIFhGaWxsUmVjdGFuZ2xlcyh4di0+ZGlzcGxheSwgeHYtPndpbmRvdywgeHYtPmdjLCByZWN0LCAyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChYdlNobVB1dEltYWdlKHh2LT5kaXNwbGF5LCB4di0+eHZfcG9ydCwgeHYtPndpbmRvdywgeHYtPmdjLAorICAgICAgICAgICAgICAgICAgICAgIHh2LT55dXZfaW1hZ2UsIDAsIDAsIHh2LT5pbWFnZV93aWR0aCwgeHYtPmltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICB4di0+ZGVzdF94LCB4di0+ZGVzdF95LCB4di0+ZGVzdF93LCB4di0+ZGVzdF9oLCBUcnVlKSAhPSBTdWNjZXNzKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY29weSBpbWFnZSB0byBYViBzaGFyZWQgbWVtb3J5IGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9waWN0dXJlKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQaWN0dXJlICpwaWN0KQoreworICAgIFhWQ29udGV4dCAqeHYgPSBzLT5wcml2X2RhdGE7CisgICAgWHZJbWFnZSAqaW1nID0geHYtPnl1dl9pbWFnZTsKKyAgICB1aW50OF90ICpkYXRhWzNdID0geworICAgICAgICBpbWctPmRhdGEgKyBpbWctPm9mZnNldHNbMF0sCisgICAgICAgIGltZy0+ZGF0YSArIGltZy0+b2Zmc2V0c1sxXSwKKyAgICAgICAgaW1nLT5kYXRhICsgaW1nLT5vZmZzZXRzWzJdCisgICAgfTsKKworICAgIC8qIENoZWNrIG1lc3NhZ2VzLiBXaW5kb3cgbWlnaHQgZ2V0IGNsb3NlZC4gKi8KKyAgICBpZiAoIXh2LT53aW5kb3dfaWQpIHsKKyAgICAgICAgWEV2ZW50IGV2ZW50OworICAgICAgICB3aGlsZSAoWFBlbmRpbmcoeHYtPmRpc3BsYXkpKSB7CisgICAgICAgICAgICBYTmV4dEV2ZW50KHh2LT5kaXNwbGF5LCAmZXZlbnQpOworICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gQ2xpZW50TWVzc2FnZSAmJiBldmVudC54Y2xpZW50LmRhdGEubFswXSA9PSB4di0+d21fZGVsZXRlX21lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coeHYsIEFWX0xPR19ERUJVRywgIldpbmRvdyBjbG9zZSBldmVudC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVQSVBFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2ltYWdlX2NvcHkoZGF0YSwgaW1nLT5waXRjaGVzLCAoY29uc3QgdWludDhfdCAqKilwaWN0LT5kYXRhLCBwaWN0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgIHh2LT5pbWFnZV9mb3JtYXQsIGltZy0+d2lkdGgsIGltZy0+aGVpZ2h0KTsKKyAgICByZXR1cm4geHZfcmVwYWludChzKTsKK30KKworc3RhdGljIGludCB4dl93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWUGljdHVyZSBwaWN0OworICAgIEFWQ29kZWNDb250ZXh0ICpjdHggPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKworICAgIGF2cGljdHVyZV9maWxsKCZwaWN0LCBwa3QtPmRhdGEsIGN0eC0+cGl4X2ZtdCwgY3R4LT53aWR0aCwgY3R4LT5oZWlnaHQpOworICAgIHJldHVybiB3cml0ZV9waWN0dXJlKHMsICZwaWN0KTsKK30KKworc3RhdGljIGludCB4dl93cml0ZV9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIEFWRnJhbWUgKipmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgLyogeHZfd3JpdGVfaGVhZGVyKCkgc2hvdWxkIGhhdmUgYWNjZXB0ZWQgb25seSBzdXBwb3J0ZWQgZm9ybWF0cyAqLworICAgIGlmICgoZmxhZ3MgJiBBVl9XUklURV9VTkNPREVEX0ZSQU1FX1FVRVJZKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHdyaXRlX3BpY3R1cmUocywgKEFWUGljdHVyZSAqKSpmcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgeHZfY29udHJvbF9tZXNzYWdlKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHR5cGUsIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpCit7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIEFWX0FQUF9UT19ERVZfV0lORE9XX1JFUEFJTlQ6CisgICAgICAgIHJldHVybiB4dl9yZXBhaW50KHMpOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihYVkNvbnRleHQsIHgpCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImRpc3BsYXlfbmFtZSIsICJzZXQgZGlzcGxheSBuYW1lIiwgICAgICAgT0ZGU0VUKGRpc3BsYXlfbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAid2luZG93X2lkIiwgICAgInNldCBleGlzdGluZyB3aW5kb3cgaWQiLCBPRkZTRVQod2luZG93X2lkKSwgICAgQVZfT1BUX1RZUEVfSU5UNjQsICB7Lmk2NCA9IDAgfSwgMCwgSU5UNjRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgIndpbmRvd19zaXplIiwgICJzZXQgd2luZG93IGZvcmNlZCBzaXplIiwgT0ZGU0VUKHdpbmRvd193aWR0aCksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAid2luZG93X3RpdGxlIiwgInNldCB3aW5kb3cgdGl0bGUiLCAgICAgICBPRkZTRVQod2luZG93X3RpdGxlKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEwgfSwgMCwgMCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJ3aW5kb3dfeCIsICAgICAic2V0IHdpbmRvdyB4IG9mZnNldCIsICAgIE9GRlNFVCh3aW5kb3dfeCksICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMCB9LCAtSU5UX01BWCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJ3aW5kb3dfeSIsICAgICAic2V0IHdpbmRvdyB5IG9mZnNldCIsICAgIE9GRlNFVCh3aW5kb3dfeSksICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMCB9LCAtSU5UX01BWCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfQorCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB4dl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJ4dmlkZW8gb3V0ZGV2IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19PVVRQVVQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl94dl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAieHYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJYViAoWFZpZGVvKSBvdXRwdXQgZGV2aWNlIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFhWQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAudmlkZW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTywKKyAgICAud3JpdGVfaGVhZGVyICAgPSB4dl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0geHZfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV91bmNvZGVkX2ZyYW1lID0geHZfd3JpdGVfZnJhbWUsCisgICAgLndyaXRlX3RyYWlsZXIgID0geHZfd3JpdGVfdHJhaWxlciwKKyAgICAuY29udHJvbF9tZXNzYWdlID0geHZfY29udHJvbF9tZXNzYWdlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSB8IEFWRk1UX1ZBUklBQkxFX0ZQUyB8IEFWRk1UX05PVElNRVNUQU1QUywKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmeHZfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL01ha2VmaWxlIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNTZlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwyNTcgQEAKK2luY2x1ZGUgJChTVUJESVIpLi4vY29uZmlnLm1haworCitOQU1FID0gYXZmaWx0ZXIKKworSEVBREVSUyA9IGFzcmNfYWJ1ZmZlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGF2Y29kZWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGF2ZmlsdGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGF2ZmlsdGVyZ3JhcGguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJ1ZmZlcnNpbmsuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJ1ZmZlcnNyYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHZlcnNpb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitPQkpTID0gYWxsZmlsdGVycy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgYXVkaW8ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgYXZmaWx0ZXIubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgYXZmaWx0ZXJncmFwaC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgYnVmZmVyLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgYnVmZmVyc2luay5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgYnVmZmVyc3JjLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgZHJhd3V0aWxzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgZmlmby5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgZm9ybWF0cy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgZ3JhcGhkdW1wLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgZ3JhcGhwYXJzZXIubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgb3BlbmNsX2FsbGtlcm5lbHMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgdHJhbnNmb3JtLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgdmlkZW8ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKworT0JKUy0kKENPTkZJR19BVkNPREVDKSAgICAgICAgICAgICAgICAgICAgICAgKz0gYXZjb2RlYy5vCisKK09CSlMtJChDT05GSUdfQURFTEFZX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGFmX2FkZWxheS5vCitPQkpTLSQoQ09ORklHX0FFQ0hPX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBhZl9hZWNoby5vCitPQkpTLSQoQ09ORklHX0FFVkFMX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBhZXZhbC5vCitPQkpTLSQoQ09ORklHX0FGQURFX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBhZl9hZmFkZS5vCitPQkpTLSQoQ09ORklHX0FGT1JNQVRfRklMVEVSKSAgICAgICAgICAgICAgICArPSBhZl9hZm9ybWF0Lm8KK09CSlMtJChDT05GSUdfQUlOVEVSTEVBVkVfRklMVEVSKSAgICAgICAgICAgICs9IGZfaW50ZXJsZWF2ZS5vCitPQkpTLSQoQ09ORklHX0FMTFBBU1NfRklMVEVSKSAgICAgICAgICAgICAgICArPSBhZl9iaXF1YWRzLm8KK09CSlMtJChDT05GSUdfQU1FUkdFX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGFmX2FtZXJnZS5vCitPQkpTLSQoQ09ORklHX0FNSVhfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSBhZl9hbWl4Lm8KK09CSlMtJChDT05GSUdfQU5VTExfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IGFmX2FudWxsLm8KK09CSlMtJChDT05GSUdfQVBBRF9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IGFmX2FwYWQubworT0JKUy0kKENPTkZJR19BUEVSTVNfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gZl9wZXJtcy5vCitPQkpTLSQoQ09ORklHX0FQSEFTRVJfRklMVEVSKSAgICAgICAgICAgICAgICArPSBhZl9hcGhhc2VyLm8gZ2VuZXJhdGVfd2F2ZV90YWJsZS5vCitPQkpTLSQoQ09ORklHX0FSRVNBTVBMRV9GSUxURVIpICAgICAgICAgICAgICArPSBhZl9hcmVzYW1wbGUubworT0JKUy0kKENPTkZJR19BU0VMRUNUX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gZl9zZWxlY3QubworT0JKUy0kKENPTkZJR19BU0VORENNRF9GSUxURVIpICAgICAgICAgICAgICAgKz0gZl9zZW5kY21kLm8KK09CSlMtJChDT05GSUdfQVNFVE5TQU1QTEVTX0ZJTFRFUikgICAgICAgICAgICs9IGFmX2FzZXRuc2FtcGxlcy5vCitPQkpTLSQoQ09ORklHX0FTRVRQVFNfRklMVEVSKSAgICAgICAgICAgICAgICArPSBzZXRwdHMubworT0JKUy0kKENPTkZJR19BU0VUUkFURV9GSUxURVIpICAgICAgICAgICAgICAgKz0gYWZfYXNldHJhdGUubworT0JKUy0kKENPTkZJR19BU0VUVEJfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gc2V0dGIubworT0JKUy0kKENPTkZJR19BU0hPV0lORk9fRklMVEVSKSAgICAgICAgICAgICAgKz0gYWZfYXNob3dpbmZvLm8KK09CSlMtJChDT05GSUdfQVNQTElUX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHNwbGl0Lm8KK09CSlMtJChDT05GSUdfQVNUQVRTX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGFmX2FzdGF0cy5vCitPQkpTLSQoQ09ORklHX0FTVFJFQU1TWU5DX0ZJTFRFUikgICAgICAgICAgICArPSBhZl9hc3RyZWFtc3luYy5vCitPQkpTLSQoQ09ORklHX0FTWU5DVFNfRklMVEVSKSAgICAgICAgICAgICAgICArPSBhZl9hc3luY3RzLm8KK09CSlMtJChDT05GSUdfQVRFTVBPX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGFmX2F0ZW1wby5vCitPQkpTLSQoQ09ORklHX0FUUklNX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB0cmltLm8KK09CSlMtJChDT05GSUdfQVpNUV9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IGZfem1xLm8KK09CSlMtJChDT05GSUdfQkFORFBBU1NfRklMVEVSKSAgICAgICAgICAgICAgICs9IGFmX2JpcXVhZHMubworT0JKUy0kKENPTkZJR19CQU5EUkVKRUNUX0ZJTFRFUikgICAgICAgICAgICAgKz0gYWZfYmlxdWFkcy5vCitPQkpTLSQoQ09ORklHX0JBU1NfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSBhZl9iaXF1YWRzLm8KK09CSlMtJChDT05GSUdfQklRVUFEX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGFmX2JpcXVhZHMubworT0JKUy0kKENPTkZJR19CUzJCX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gYWZfYnMyYi5vCitPQkpTLSQoQ09ORklHX0NIQU5ORUxNQVBfRklMVEVSKSAgICAgICAgICAgICArPSBhZl9jaGFubmVsbWFwLm8KK09CSlMtJChDT05GSUdfQ0hBTk5FTFNQTElUX0ZJTFRFUikgICAgICAgICAgICs9IGFmX2NoYW5uZWxzcGxpdC5vCitPQkpTLSQoQ09ORklHX0NPTVBBTkRfRklMVEVSKSAgICAgICAgICAgICAgICArPSBhZl9jb21wYW5kLm8KK09CSlMtJChDT05GSUdfRUFSV0FYX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGFmX2VhcndheC5vCitPQkpTLSQoQ09ORklHX0VCVVIxMjhfRklMVEVSKSAgICAgICAgICAgICAgICArPSBmX2VidXIxMjgubworT0JKUy0kKENPTkZJR19FUVVBTElaRVJfRklMVEVSKSAgICAgICAgICAgICAgKz0gYWZfYmlxdWFkcy5vCitPQkpTLSQoQ09ORklHX0ZMQU5HRVJfRklMVEVSKSAgICAgICAgICAgICAgICArPSBhZl9mbGFuZ2VyLm8gZ2VuZXJhdGVfd2F2ZV90YWJsZS5vCitPQkpTLSQoQ09ORklHX0hJR0hQQVNTX0ZJTFRFUikgICAgICAgICAgICAgICArPSBhZl9iaXF1YWRzLm8KK09CSlMtJChDT05GSUdfSk9JTl9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IGFmX2pvaW4ubworT0JKUy0kKENPTkZJR19MQURTUEFfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gYWZfbGFkc3BhLm8KK09CSlMtJChDT05GSUdfTE9XUEFTU19GSUxURVIpICAgICAgICAgICAgICAgICs9IGFmX2JpcXVhZHMubworT0JKUy0kKENPTkZJR19QQU5fRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0gYWZfcGFuLm8KK09CSlMtJChDT05GSUdfUkVQTEFZR0FJTl9GSUxURVIpICAgICAgICAgICAgICs9IGFmX3JlcGxheWdhaW4ubworT0JKUy0kKENPTkZJR19SRVNBTVBMRV9GSUxURVIpICAgICAgICAgICAgICAgKz0gYWZfcmVzYW1wbGUubworT0JKUy0kKENPTkZJR19TSUxFTkNFREVURUNUX0ZJTFRFUikgICAgICAgICAgKz0gYWZfc2lsZW5jZWRldGVjdC5vCitPQkpTLSQoQ09ORklHX1NJTEVOQ0VSRU1PVkVfRklMVEVSKSAgICAgICAgICArPSBhZl9zaWxlbmNlcmVtb3ZlLm8KK09CSlMtJChDT05GSUdfVFJFQkxFX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGFmX2JpcXVhZHMubworT0JKUy0kKENPTkZJR19WT0xVTUVfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gYWZfdm9sdW1lLm8KK09CSlMtJChDT05GSUdfVk9MVU1FREVURUNUX0ZJTFRFUikgICAgICAgICAgICs9IGFmX3ZvbHVtZWRldGVjdC5vCisKK09CSlMtJChDT05GSUdfQUVWQUxTUkNfRklMVEVSKSAgICAgICAgICAgICAgICs9IGFldmFsLm8KK09CSlMtJChDT05GSUdfQU5VTExTUkNfRklMVEVSKSAgICAgICAgICAgICAgICs9IGFzcmNfYW51bGxzcmMubworT0JKUy0kKENPTkZJR19GTElURV9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gYXNyY19mbGl0ZS5vCitPQkpTLSQoQ09ORklHX1NJTkVfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSBhc3JjX3NpbmUubworCitPQkpTLSQoQ09ORklHX0FOVUxMU0lOS19GSUxURVIpICAgICAgICAgICAgICArPSBhc2lua19hbnVsbHNpbmsubworCitPQkpTLSQoQ09ORklHX0FTU19GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9zdWJ0aXRsZXMubworT0JKUy0kKENPTkZJR19BTFBIQUVYVFJBQ1RfRklMVEVSKSAgICAgICAgICAgKz0gdmZfZXh0cmFjdHBsYW5lcy5vCitPQkpTLSQoQ09ORklHX0FMUEhBTUVSR0VfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9hbHBoYW1lcmdlLm8KK09CSlMtJChDT05GSUdfQkJPWF9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IGJib3gubyB2Zl9iYm94Lm8KK09CSlMtJChDT05GSUdfQkxBQ0tERVRFQ1RfRklMVEVSKSAgICAgICAgICAgICs9IHZmX2JsYWNrZGV0ZWN0Lm8KK09CSlMtJChDT05GSUdfQkxBQ0tGUkFNRV9GSUxURVIpICAgICAgICAgICAgICs9IHZmX2JsYWNrZnJhbWUubworT0JKUy0kKENPTkZJR19CTEVORF9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfYmxlbmQubyBkdWFsaW5wdXQubyBmcmFtZXN5bmMubworT0JKUy0kKENPTkZJR19CT1hCTFVSX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gdmZfYm94Ymx1ci5vCitPQkpTLSQoQ09ORklHX0NPREVDVklFV19GSUxURVIpICAgICAgICAgICAgICArPSB2Zl9jb2RlY3ZpZXcubworT0JKUy0kKENPTkZJR19DT0xPUkJBTEFOQ0VfRklMVEVSKSAgICAgICAgICAgKz0gdmZfY29sb3JiYWxhbmNlLm8KK09CSlMtJChDT05GSUdfQ09MT1JDSEFOTkVMTUlYRVJfRklMVEVSKSAgICAgICs9IHZmX2NvbG9yY2hhbm5lbG1peGVyLm8KK09CSlMtJChDT05GSUdfQ09MT1JNQVRSSVhfRklMVEVSKSAgICAgICAgICAgICs9IHZmX2NvbG9ybWF0cml4Lm8KK09CSlMtJChDT05GSUdfQ09QWV9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IHZmX2NvcHkubworT0JKUy0kKENPTkZJR19DUk9QX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gdmZfY3JvcC5vCitPQkpTLSQoQ09ORklHX0NST1BERVRFQ1RfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9jcm9wZGV0ZWN0Lm8KK09CSlMtJChDT05GSUdfQ1VSVkVTX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX2N1cnZlcy5vCitPQkpTLSQoQ09ORklHX0RDVEROT0laX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9kY3Rkbm9pei5vCitPQkpTLSQoQ09ORklHX0RFQ0lNQVRFX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9kZWNpbWF0ZS5vCitPQkpTLSQoQ09ORklHX0RFSlVEREVSX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9kZWp1ZGRlci5vCitPQkpTLSQoQ09ORklHX0RFTE9HT19GSUxURVIpICAgICAgICAgICAgICAgICArPSB2Zl9kZWxvZ28ubworT0JKUy0kKENPTkZJR19ERVNIQUtFX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gdmZfZGVzaGFrZS5vCitPQkpTLSQoQ09ORklHX0RSQVdCT1hfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl9kcmF3Ym94Lm8KK09CSlMtJChDT05GSUdfRFJBV0dSSURfRklMVEVSKSAgICAgICAgICAgICAgICs9IHZmX2RyYXdib3gubworT0JKUy0kKENPTkZJR19EUkFXVEVYVF9GSUxURVIpICAgICAgICAgICAgICAgKz0gdmZfZHJhd3RleHQubworT0JKUy0kKENPTkZJR19FTEJHX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gdmZfZWxiZy5vCitPQkpTLSQoQ09ORklHX0VER0VERVRFQ1RfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9lZGdlZGV0ZWN0Lm8KK09CSlMtJChDT05GSUdfRVhUUkFDVFBMQU5FU19GSUxURVIpICAgICAgICAgICs9IHZmX2V4dHJhY3RwbGFuZXMubworT0JKUy0kKENPTkZJR19GQURFX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gdmZfZmFkZS5vCitPQkpTLSQoQ09ORklHX0ZJRUxEX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB2Zl9maWVsZC5vCitPQkpTLSQoQ09ORklHX0ZJRUxETUFUQ0hfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9maWVsZG1hdGNoLm8KK09CSlMtJChDT05GSUdfRklFTERPUkRFUl9GSUxURVIpICAgICAgICAgICAgICs9IHZmX2ZpZWxkb3JkZXIubworT0JKUy0kKENPTkZJR19GT1JNQVRfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfZm9ybWF0Lm8KK09CSlMtJChDT05GSUdfRlJBTUVTVEVQX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX2ZyYW1lc3RlcC5vCitPQkpTLSQoQ09ORklHX0ZQU19GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9mcHMubworT0JKUy0kKENPTkZJR19GUkFNRVBBQ0tfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfZnJhbWVwYWNrLm8KK09CSlMtJChDT05GSUdfRlJFSTBSX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX2ZyZWkwci5vCitPQkpTLSQoQ09ORklHX0dFUV9GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9nZXEubworT0JKUy0kKENPTkZJR19HUkFERlVOX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gdmZfZ3JhZGZ1bi5vCitPQkpTLSQoQ09ORklHX0hBTERDTFVUX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9sdXQzZC5vIGR1YWxpbnB1dC5vIGZyYW1lc3luYy5vCitPQkpTLSQoQ09ORklHX0hGTElQX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB2Zl9oZmxpcC5vCitPQkpTLSQoQ09ORklHX0hJU1RFUV9GSUxURVIpICAgICAgICAgICAgICAgICArPSB2Zl9oaXN0ZXEubworT0JKUy0kKENPTkZJR19ISVNUT0dSQU1fRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfaGlzdG9ncmFtLm8KK09CSlMtJChDT05GSUdfSFFETjNEX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX2hxZG4zZC5vCitPQkpTLSQoQ09ORklHX0hRWF9GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9ocXgubworT0JKUy0kKENPTkZJR19IVUVfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0gdmZfaHVlLm8KK09CSlMtJChDT05GSUdfSURFVF9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IHZmX2lkZXQubworT0JKUy0kKENPTkZJR19JTF9GSUxURVIpICAgICAgICAgICAgICAgICAgICAgKz0gdmZfaWwubworT0JKUy0kKENPTkZJR19JTlRFUkxBQ0VfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfaW50ZXJsYWNlLm8KK09CSlMtJChDT05GSUdfSU5URVJMRUFWRV9GSUxURVIpICAgICAgICAgICAgICs9IGZfaW50ZXJsZWF2ZS5vCitPQkpTLSQoQ09ORklHX0tFUk5ERUlOVF9GSUxURVIpICAgICAgICAgICAgICArPSB2Zl9rZXJuZGVpbnQubworT0JKUy0kKENPTkZJR19MRU5TQ09SUkVDVElPTl9GSUxURVIpICAgICAgICAgKz0gdmZfbGVuc2NvcnJlY3Rpb24ubworT0JKUy0kKENPTkZJR19MVVQzRF9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfbHV0M2QubworT0JKUy0kKENPTkZJR19MVVRfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0gdmZfbHV0Lm8KK09CSlMtJChDT05GSUdfTFVUUkdCX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX2x1dC5vCitPQkpTLSQoQ09ORklHX0xVVFlVVl9GSUxURVIpICAgICAgICAgICAgICAgICArPSB2Zl9sdXQubworT0JKUy0kKENPTkZJR19NQ0RFSU5UX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gdmZfbWNkZWludC5vCitPQkpTLSQoQ09ORklHX01FUkdFUExBTkVTX0ZJTFRFUikgICAgICAgICAgICArPSB2Zl9tZXJnZXBsYW5lcy5vIGZyYW1lc3luYy5vCitPQkpTLSQoQ09ORklHX01QX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgICArPSB2Zl9tcC5vCitPQkpTLSQoQ09ORklHX01QREVDSU1BVEVfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9tcGRlY2ltYXRlLm8KK09CSlMtJChDT05GSUdfTkVHQVRFX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX2x1dC5vCitPQkpTLSQoQ09ORklHX05PRk9STUFUX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9mb3JtYXQubworT0JKUy0kKENPTkZJR19OT0lTRV9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfbm9pc2UubworT0JKUy0kKENPTkZJR19OVUxMX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gdmZfbnVsbC5vCitPQkpTLSQoQ09ORklHX09DVl9GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9saWJvcGVuY3YubworT0JKUy0kKENPTkZJR19PUEVOQ0wpICAgICAgICAgICAgICAgICAgICAgICAgKz0gZGVzaGFrZV9vcGVuY2wubyB1bnNoYXJwX29wZW5jbC5vCitPQkpTLSQoQ09ORklHX09WRVJMQVlfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl9vdmVybGF5Lm8gZHVhbGlucHV0Lm8gZnJhbWVzeW5jLm8KK09CSlMtJChDT05GSUdfT1dERU5PSVNFX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX293ZGVub2lzZS5vCitPQkpTLSQoQ09ORklHX1BBRF9GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9wYWQubworT0JKUy0kKENPTkZJR19QRVJNU19GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gZl9wZXJtcy5vCitPQkpTLSQoQ09ORklHX1BFUlNQRUNUSVZFX0ZJTFRFUikgICAgICAgICAgICArPSB2Zl9wZXJzcGVjdGl2ZS5vCitPQkpTLSQoQ09ORklHX1BIQVNFX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB2Zl9waGFzZS5vCitPQkpTLSQoQ09ORklHX1BJWERFU0NURVNUX0ZJTFRFUikgICAgICAgICAgICArPSB2Zl9waXhkZXNjdGVzdC5vCitPQkpTLSQoQ09ORklHX1BQX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgICArPSB2Zl9wcC5vCitPQkpTLSQoQ09ORklHX1BTTlJfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB2Zl9wc25yLm8gZHVhbGlucHV0Lm8gZnJhbWVzeW5jLm8KK09CSlMtJChDT05GSUdfUFVMTFVQX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX3B1bGx1cC5vCitPQkpTLSQoQ09ORklHX1JFTU9WRUxPR09fRklMVEVSKSAgICAgICAgICAgICArPSBiYm94Lm8gbHN3c3V0aWxzLm8gbGF2ZnV0aWxzLm8gdmZfcmVtb3ZlbG9nby5vCitPQkpTLSQoQ09ORklHX1JPVEFURV9GSUxURVIpICAgICAgICAgICAgICAgICArPSB2Zl9yb3RhdGUubworT0JKUy0kKENPTkZJR19TRVBBUkFURUZJRUxEU19GSUxURVIpICAgICAgICAgKz0gdmZfc2VwYXJhdGVmaWVsZHMubworT0JKUy0kKENPTkZJR19TQUJfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0gdmZfc2FiLm8KK09CSlMtJChDT05GSUdfU0NBTEVfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHZmX3NjYWxlLm8KK09CSlMtJChDT05GSUdfU0VMRUNUX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGZfc2VsZWN0Lm8KK09CSlMtJChDT05GSUdfU0VORENNRF9GSUxURVIpICAgICAgICAgICAgICAgICs9IGZfc2VuZGNtZC5vCitPQkpTLSQoQ09ORklHX1NFVERBUl9GSUxURVIpICAgICAgICAgICAgICAgICArPSB2Zl9hc3BlY3QubworT0JKUy0kKENPTkZJR19TRVRGSUVMRF9GSUxURVIpICAgICAgICAgICAgICAgKz0gdmZfc2V0ZmllbGQubworT0JKUy0kKENPTkZJR19TRVRQVFNfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gc2V0cHRzLm8KK09CSlMtJChDT05GSUdfU0VUU0FSX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX2FzcGVjdC5vCitPQkpTLSQoQ09ORklHX1NFVFRCX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBzZXR0Yi5vCitPQkpTLSQoQ09ORklHX1NIT1dJTkZPX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9zaG93aW5mby5vCitPQkpTLSQoQ09ORklHX1NIVUZGTEVQTEFORVNfRklMVEVSKSAgICAgICAgICArPSB2Zl9zaHVmZmxlcGxhbmVzLm8KK09CSlMtJChDT05GSUdfU0lHTkFMU1RBVFNfRklMVEVSKSAgICAgICAgICAgICs9IHZmX3NpZ25hbHN0YXRzLm8KK09CSlMtJChDT05GSUdfU01BUlRCTFVSX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX3NtYXJ0Ymx1ci5vCitPQkpTLSQoQ09ORklHX1NQTElUX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBzcGxpdC5vCitPQkpTLSQoQ09ORklHX1NQUF9GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9zcHAubworT0JKUy0kKENPTkZJR19TVEVSRU8zRF9GSUxURVIpICAgICAgICAgICAgICAgKz0gdmZfc3RlcmVvM2QubworT0JKUy0kKENPTkZJR19TVUJUSVRMRVNfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfc3VidGl0bGVzLm8KK09CSlMtJChDT05GSUdfU1VQRVIyWFNBSV9GSUxURVIpICAgICAgICAgICAgICs9IHZmX3N1cGVyMnhzYWkubworT0JKUy0kKENPTkZJR19TV0FQVVZfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfc3dhcHV2Lm8KK09CSlMtJChDT05GSUdfVEVMRUNJTkVfRklMVEVSKSAgICAgICAgICAgICAgICs9IHZmX3RlbGVjaW5lLm8KK09CSlMtJChDT05GSUdfVEhVTUJOQUlMX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX3RodW1ibmFpbC5vCitPQkpTLSQoQ09ORklHX1RJTEVfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB2Zl90aWxlLm8KK09CSlMtJChDT05GSUdfVElOVEVSTEFDRV9GSUxURVIpICAgICAgICAgICAgICs9IHZmX3RpbnRlcmxhY2UubworT0JKUy0kKENPTkZJR19UUkFOU1BPU0VfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfdHJhbnNwb3NlLm8KK09CSlMtJChDT05GSUdfVFJJTV9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IHRyaW0ubworT0JKUy0kKENPTkZJR19VTlNIQVJQX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gdmZfdW5zaGFycC5vCitPQkpTLSQoQ09ORklHX1ZGTElQX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB2Zl92ZmxpcC5vCitPQkpTLSQoQ09ORklHX1ZJRFNUQUJERVRFQ1RfRklMVEVSKSAgICAgICAgICArPSB2aWRzdGFidXRpbHMubyB2Zl92aWRzdGFiZGV0ZWN0Lm8KK09CSlMtJChDT05GSUdfVklEU1RBQlRSQU5TRk9STV9GSUxURVIpICAgICAgICs9IHZpZHN0YWJ1dGlscy5vIHZmX3ZpZHN0YWJ0cmFuc2Zvcm0ubworT0JKUy0kKENPTkZJR19WSUdORVRURV9GSUxURVIpICAgICAgICAgICAgICAgKz0gdmZfdmlnbmV0dGUubworT0JKUy0kKENPTkZJR19XM0ZESUZfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfdzNmZGlmLm8KK09CSlMtJChDT05GSUdfWEJSX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgICs9IHZmX3hici5vCitPQkpTLSQoQ09ORklHX1lBRElGX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB2Zl95YWRpZi5vCitPQkpTLSQoQ09ORklHX1pNUV9GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSBmX3ptcS5vCitPQkpTLSQoQ09ORklHX1pPT01QQU5fRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl96b29tcGFuLm8KKworT0JKUy0kKENPTkZJR19DRUxMQVVUT19GSUxURVIpICAgICAgICAgICAgICAgKz0gdnNyY19jZWxsYXV0by5vCitPQkpTLSQoQ09ORklHX0NPTE9SX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB2c3JjX3Rlc3RzcmMubworT0JKUy0kKENPTkZJR19GUkVJMFJfU1JDX0ZJTFRFUikgICAgICAgICAgICAgKz0gdmZfZnJlaTByLm8KK09CSlMtJChDT05GSUdfSEFMRENMVVRTUkNfRklMVEVSKSAgICAgICAgICAgICs9IHZzcmNfdGVzdHNyYy5vCitPQkpTLSQoQ09ORklHX0xJRkVfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB2c3JjX2xpZmUubworT0JKUy0kKENPTkZJR19NQU5ERUxCUk9UX0ZJTFRFUikgICAgICAgICAgICAgKz0gdnNyY19tYW5kZWxicm90Lm8KK09CSlMtJChDT05GSUdfTVBURVNUU1JDX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZzcmNfbXB0ZXN0c3JjLm8KK09CSlMtJChDT05GSUdfTlVMTFNSQ19GSUxURVIpICAgICAgICAgICAgICAgICs9IHZzcmNfdGVzdHNyYy5vCitPQkpTLSQoQ09ORklHX1JHQlRFU1RTUkNfRklMVEVSKSAgICAgICAgICAgICArPSB2c3JjX3Rlc3RzcmMubworT0JKUy0kKENPTkZJR19TTVBURUJBUlNfRklMVEVSKSAgICAgICAgICAgICAgKz0gdnNyY190ZXN0c3JjLm8KK09CSlMtJChDT05GSUdfU01QVEVIREJBUlNfRklMVEVSKSAgICAgICAgICAgICs9IHZzcmNfdGVzdHNyYy5vCitPQkpTLSQoQ09ORklHX1RFU1RTUkNfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2c3JjX3Rlc3RzcmMubworCitPQkpTLSQoQ09ORklHX05VTExTSU5LX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2c2lua19udWxsc2luay5vCisKK09CSlMtJChDT05GSUdfTVBfRklMVEVSKSArPSBsaWJtcGNvZGVjcy9tcF9pbWFnZS5vCitPQkpTLSQoQ09ORklHX01QX0ZJTFRFUikgKz0gbGlibXBjb2RlY3MvaW1nX2Zvcm1hdC5vCitPQkpTLSQoQ09ORklHX01QX0ZJTFRFUikgKz0gbGlibXBjb2RlY3MvdmZfZXEyLm8KK09CSlMtJChDT05GSUdfTVBfRklMVEVSKSArPSBsaWJtcGNvZGVjcy92Zl9lcS5vCitPQkpTLSQoQ09ORklHX01QX0ZJTFRFUikgKz0gbGlibXBjb2RlY3MvdmZfZnNwcC5vCitPQkpTLSQoQ09ORklHX01QX0ZJTFRFUikgKz0gbGlibXBjb2RlY3MvdmZfaWxwYWNrLm8KK09CSlMtJChDT05GSUdfTVBfRklMVEVSKSArPSBsaWJtcGNvZGVjcy92Zl9wcDcubworT0JKUy0kKENPTkZJR19NUF9GSUxURVIpICs9IGxpYm1wY29kZWNzL3ZmX3NvZnRwdWxsZG93bi5vCitPQkpTLSQoQ09ORklHX01QX0ZJTFRFUikgKz0gbGlibXBjb2RlY3MvdmZfdXNwcC5vCisKKyMgbXVsdGltZWRpYSBmaWx0ZXJzCitPQkpTLSQoQ09ORklHX0FWRUNUT1JTQ09QRV9GSUxURVIpICAgICAgICAgICArPSBhdmZfYXZlY3RvcnNjb3BlLm8KK09CSlMtJChDT05GSUdfQ09OQ0FUX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGF2Zl9jb25jYXQubworT0JKUy0kKENPTkZJR19TSE9XQ1FUX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gYXZmX3Nob3djcXQubworT0JKUy0kKENPTkZJR19TSE9XU1BFQ1RSVU1fRklMVEVSKSAgICAgICAgICAgKz0gYXZmX3Nob3dzcGVjdHJ1bS5vCitPQkpTLSQoQ09ORklHX1NIT1dXQVZFU19GSUxURVIpICAgICAgICAgICAgICArPSBhdmZfc2hvd3dhdmVzLm8KKworIyBtdWx0aW1lZGlhIHNvdXJjZXMKK09CSlMtJChDT05GSUdfQU1PVklFX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHNyY19tb3ZpZS5vCitPQkpTLSQoQ09ORklHX01PVklFX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBzcmNfbW92aWUubworCisjIFdpbmRvd3MgcmVzb3VyY2UgZmlsZQorU0xJQk9CSlMtJChIQVZFX0dOVV9XSU5EUkVTKSAgICAgICAgICAgICAgICAgKz0gYXZmaWx0ZXJyZXMubworCitTS0lQSEVBREVSUy0kKENPTkZJR19MSUJWSURTVEFCKSAgICAgICAgICAgICArPSB2aWRzdGFidXRpbHMuaAorU0tJUEhFQURFUlMtJChDT05GSUdfT1BFTkNMKSAgICAgICAgICAgICAgICAgKz0gb3BlbmNsX2ludGVybmFsLmggZGVzaGFrZV9vcGVuY2xfa2VybmVsLmggdW5zaGFycF9vcGVuY2xfa2VybmVsLmgKKworT0JKUy0kKEhBVkVfVEhSRUFEUykgICAgICAgICAgICAgICAgICAgICAgICAgKz0gcHRocmVhZC5vCitPQkpTLSQoQ09ORklHX1NIQVJFRCkgICAgICAgICAgICAgICAgICAgICAgICArPSBsb2cyX3RhYi5vCisKK1RPT0xTICAgICA9IGdyYXBoMmRvdAorVEVTVFBST0dTID0gZHJhd3V0aWxzIGZpbHRmbXRzIGZvcm1hdHMKKworVE9PTFMtJChDT05GSUdfTElCWk1RKSArPSB6bXFzZW5kCisKK2NsZWFuOjoKKwkkKFJNKSAkKENMRUFOU1VGRklYRVM6JT1saWJhdmZpbHRlci9saWJtcGNvZGVjcy8lKQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FldmFsLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWV2YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYyOWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FldmFsLmMKQEAgLTAsMCArMSw0NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBldmFsIGF1ZGlvIHNvdXJjZQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJjaCIsICAgICAgICAgICAvLy88IHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBjaGFubmVsCisgICAgIm4iLCAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGZyYW1lCisgICAgIm5iX2luX2NoYW5uZWxzIiwKKyAgICAibmJfb3V0X2NoYW5uZWxzIiwKKyAgICAidCIsICAgICAgICAgICAgLy8vPCB0aW1lc3RhbXAgZXhwcmVzc2VkIGluIHNlY29uZHMKKyAgICAicyIsICAgICAgICAgICAgLy8vPCBzYW1wbGUgcmF0ZQorICAgIE5VTEwKK307CisKK2VudW0gdmFyX25hbWUgeworICAgIFZBUl9DSCwKKyAgICBWQVJfTiwKKyAgICBWQVJfTkJfSU5fQ0hBTk5FTFMsCisgICAgVkFSX05CX09VVF9DSEFOTkVMUywKKyAgICBWQVJfVCwKKyAgICBWQVJfUywKKyAgICBWQVJfVkFSU19OQgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGNoYXIgKnNhbXBsZV9yYXRlX3N0cjsKKyAgICBpbnQgc2FtcGxlX3JhdGU7CisgICAgaW50NjRfdCBjaGxheW91dDsKKyAgICBjaGFyICpjaGxheW91dF9zdHI7CisgICAgaW50IG5iX2NoYW5uZWxzOyAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscworICAgIGludCBuYl9pbl9jaGFubmVsczsgICAgICAgICAvLy88IG51bWJlciBvZiBpbnB1dCBjaGFubmVscworICAgIGludCBzYW1lX2NobGF5b3V0OyAgICAgICAgICAvLy88IHNldCBvdXRwdXQgYXMgaW5wdXQgY2hhbm5lbCBsYXlvdXQKKyAgICBpbnQ2NF90IHB0czsKKyAgICBBVkV4cHIgKipleHByOworICAgIGNoYXIgKmV4cHJzOworICAgIGludCBuYl9zYW1wbGVzOyAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBzYW1wbGVzIHBlciByZXF1ZXN0ZWQgZnJhbWUKKyAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgIHVpbnQ2NF90IG47CisgICAgZG91YmxlIHZhcl92YWx1ZXNbVkFSX1ZBUlNfTkJdOworICAgIGRvdWJsZSAqY2hhbm5lbF92YWx1ZXM7CisgICAgaW50NjRfdCBvdXRfY2hhbm5lbF9sYXlvdXQ7Cit9IEV2YWxDb250ZXh0OworCitzdGF0aWMgZG91YmxlIHZhbCh2b2lkICpwcml2LCBkb3VibGUgY2gpCit7CisgICAgRXZhbENvbnRleHQgKmV2YWwgPSBwcml2OworICAgIHJldHVybiBldmFsLT5jaGFubmVsX3ZhbHVlc1tGRk1JTigoaW50KWNoLCBldmFsLT5uYl9pbl9jaGFubmVscy0xKV07Cit9CisKK3N0YXRpYyBkb3VibGUgKCogY29uc3QgYWV2YWxfZnVuYzFbXSkodm9pZCAqLCBkb3VibGUpID0geyB2YWwsIE5VTEwgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWV2YWxfZnVuYzFfbmFtZXNbXSA9IHsgInZhbCIsIE5VTEwgfTsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRXZhbENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYWV2YWxzcmNfb3B0aW9uc1tdPSB7CisgICAgeyAiZXhwcnMiLCAgICAgICAic2V0IHRoZSAnfCctc2VwYXJhdGVkIGxpc3Qgb2YgY2hhbm5lbHMgZXhwcmVzc2lvbnMiLCBPRkZTRVQoZXhwcnMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAibmJfc2FtcGxlcyIsICAic2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgcmVxdWVzdGVkIGZyYW1lIiwgT0ZGU0VUKG5iX3NhbXBsZXMpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAxMDI0fSwgICAgMCwgICAgICAgIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAibiIsICAgICAgICAgICAic2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgcmVxdWVzdGVkIGZyYW1lIiwgT0ZGU0VUKG5iX3NhbXBsZXMpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAxMDI0fSwgICAgMCwgICAgICAgIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAic2FtcGxlX3JhdGUiLCAic2V0IHRoZSBzYW1wbGUgcmF0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHNhbXBsZV9yYXRlX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiNDQxMDAifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgInMiLCAgICAgICAgICAgInNldCB0aGUgc2FtcGxlIHJhdGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChzYW1wbGVfcmF0ZV9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIjQ0MTAwIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJkdXJhdGlvbiIsICAgICJzZXQgYXVkaW8gZHVyYXRpb24iLCBPRkZTRVQoZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQgPSAtMX0sIC0xLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisgICAgeyAiZCIsICAgICAgICAgICAic2V0IGF1ZGlvIGR1cmF0aW9uIiwgT0ZGU0VUKGR1cmF0aW9uKSwgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gLTF9LCAtMSwgSU5UNjRfTUFYLCBGTEFHUyB9LAorICAgIHsgImNoYW5uZWxfbGF5b3V0IiwgInNldCBjaGFubmVsIGxheW91dCIsIE9GRlNFVChjaGxheW91dF9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAiYyIsICAgICAgICAgICAgICAic2V0IGNoYW5uZWwgbGF5b3V0IiwgT0ZGU0VUKGNobGF5b3V0X3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGFldmFsc3JjKTsKKworc3RhdGljIGludCBwYXJzZV9jaGFubmVsX2V4cHJlc3Npb25zKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9uYl9jaGFubmVscykKK3sKKyAgICBFdmFsQ29udGV4dCAqZXZhbCA9IGN0eC0+cHJpdjsKKyAgICBjaGFyICphcmdzMSA9IGF2X3N0cmR1cChldmFsLT5leHBycyk7CisgICAgY2hhciAqZXhwciwgKmxhc3RfZXhwciA9IE5VTEwsICpidWY7CisgICAgZG91YmxlICgqIGNvbnN0ICpmdW5jMSkodm9pZCAqLCBkb3VibGUpID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKmZ1bmMxX25hbWVzID0gTlVMTDsKKyAgICBpbnQgaSwgcmV0ID0gMDsKKworICAgIGlmICghYXJnczEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoIWV2YWwtPmV4cHJzKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNoYW5uZWxzIGV4cHJlc3Npb25zIGxpc3QgaXMgZW1wdHlcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICghc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAiYWV2YWwiKSkgeworICAgICAgICBmdW5jMSA9IGFldmFsX2Z1bmMxOworICAgICAgICBmdW5jMV9uYW1lcyA9IGFldmFsX2Z1bmMxX25hbWVzOworICAgIH0KKworI2RlZmluZSBBRERfRVhQUkVTU0lPTihleHByXykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIWF2X2R5bmFycmF5Ml9hZGQoKHZvaWQgKiopJmV2YWwtPmV4cHIsICZldmFsLT5uYl9jaGFubmVscywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpldmFsLT5leHByKSwgTlVMTCkpIHsgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZ290byBlbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBldmFsLT5leHByW2V2YWwtPm5iX2NoYW5uZWxzLTFdID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXQgPSBhdl9leHByX3BhcnNlKCZldmFsLT5leHByW2V2YWwtPm5iX2NoYW5uZWxzIC0gMV0sIGV4cHJfLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgZnVuYzFfbmFtZXMsIGZ1bmMxLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDAsIGN0eCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAocmV0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZ290byBlbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyAgICAvKiByZXNldCBleHByZXNzaW9ucyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBldmFsLT5uYl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGF2X2V4cHJfZnJlZShldmFsLT5leHByW2ldKTsKKyAgICAgICAgZXZhbC0+ZXhwcltpXSA9IE5VTEw7CisgICAgfQorICAgIGF2X2ZyZWVwKCZldmFsLT5leHByKTsKKyAgICBldmFsLT5uYl9jaGFubmVscyA9IDA7CisKKyAgICBidWYgPSBhcmdzMTsKKyAgICB3aGlsZSAoZXhwciA9IGF2X3N0cnRvayhidWYsICJ8IiwgJmJ1ZikpIHsKKyAgICAgICAgQUREX0VYUFJFU1NJT04oZXhwcik7CisgICAgICAgIGxhc3RfZXhwciA9IGV4cHI7CisgICAgfQorCisgICAgaWYgKGV4cGVjdGVkX25iX2NoYW5uZWxzID4gZXZhbC0+bmJfY2hhbm5lbHMpCisgICAgICAgIGZvciAoaSA9IGV2YWwtPm5iX2NoYW5uZWxzOyBpIDwgZXhwZWN0ZWRfbmJfY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIEFERF9FWFBSRVNTSU9OKGxhc3RfZXhwcik7CisKKyAgICBpZiAoZXhwZWN0ZWRfbmJfY2hhbm5lbHMgPiAwICYmIGV2YWwtPm5iX2NoYW5uZWxzICE9IGV4cGVjdGVkX25iX2NoYW5uZWxzKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJNaXNtYXRjaCBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYW5uZWwgZXhwcmVzc2lvbnMgJyVkJyAiCisgICAgICAgICAgICAgICAiYW5kIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgb3V0cHV0IGNoYW5uZWxzICclZCcgZm9yIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBsYXlvdXRcbiIsCisgICAgICAgICAgICAgICBldmFsLT5uYl9jaGFubmVscywgZXhwZWN0ZWRfbmJfY2hhbm5lbHMpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworZW5kOgorICAgIGF2X2ZyZWUoYXJnczEpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEV2YWxDb250ZXh0ICpldmFsID0gY3R4LT5wcml2OworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGV2YWwtPmNobGF5b3V0X3N0cikgeworICAgICAgICBpZiAoIXN0cmNtcChldmFsLT5jaGxheW91dF9zdHIsICJzYW1lIikgJiYgIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgImFldmFsIikpIHsKKyAgICAgICAgICAgIGV2YWwtPnNhbWVfY2hsYXlvdXQgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gZmZfcGFyc2VfY2hhbm5lbF9sYXlvdXQoJmV2YWwtPmNobGF5b3V0LCBOVUxMLCBldmFsLT5jaGxheW91dF9zdHIsIGN0eCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICByZXQgPSBwYXJzZV9jaGFubmVsX2V4cHJlc3Npb25zKGN0eCwgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGV2YWwtPmNobGF5b3V0KSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZ3Vlc3MgY2hhbm5lbCBsYXlvdXQgZnJvbSBuYiBleHByZXNzaW9ucy9jaGFubmVscyAqLworICAgICAgICBpZiAoKHJldCA9IHBhcnNlX2NoYW5uZWxfZXhwcmVzc2lvbnMoY3R4LCAtMSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgZXZhbC0+Y2hsYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChldmFsLT5uYl9jaGFubmVscyk7CisgICAgICAgIGlmICghZXZhbC0+Y2hsYXlvdXQgJiYgZXZhbC0+bmJfY2hhbm5lbHMgPD0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMgJyVkJyBwcm92aWRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBldmFsLT5uYl9jaGFubmVscyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGV2YWwtPnNhbXBsZV9yYXRlX3N0cikKKyAgICAgICAgaWYgKChyZXQgPSBmZl9wYXJzZV9zYW1wbGVfcmF0ZSgmZXZhbC0+c2FtcGxlX3JhdGUsIGV2YWwtPnNhbXBsZV9yYXRlX3N0ciwgY3R4KSkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIGV2YWwtPm4gPSAwOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRXZhbENvbnRleHQgKmV2YWwgPSBjdHgtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZXZhbC0+bmJfY2hhbm5lbHM7IGkrKykgeworICAgICAgICBhdl9leHByX2ZyZWUoZXZhbC0+ZXhwcltpXSk7CisgICAgICAgIGV2YWwtPmV4cHJbaV0gPSBOVUxMOworICAgIH0KKyAgICBhdl9mcmVlcCgmZXZhbC0+ZXhwcik7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBFdmFsQ29udGV4dCAqZXZhbCA9IG91dGxpbmstPnNyYy0+cHJpdjsKKyAgICBjaGFyIGJ1ZlsxMjhdOworCisgICAgb3V0bGluay0+dGltZV9iYXNlID0gKEFWUmF0aW9uYWwpezEsIGV2YWwtPnNhbXBsZV9yYXRlfTsKKyAgICBvdXRsaW5rLT5zYW1wbGVfcmF0ZSA9IGV2YWwtPnNhbXBsZV9yYXRlOworCisgICAgZXZhbC0+dmFyX3ZhbHVlc1tWQVJfU10gPSBldmFsLT5zYW1wbGVfcmF0ZTsKKyAgICBldmFsLT52YXJfdmFsdWVzW1ZBUl9OQl9JTl9DSEFOTkVMU10gPSBOQU47CisgICAgZXZhbC0+dmFyX3ZhbHVlc1tWQVJfTkJfT1VUX0NIQU5ORUxTXSA9IG91dGxpbmstPmNoYW5uZWxzOworCisgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhidWYsIHNpemVvZihidWYpLCAwLCBldmFsLT5jaGxheW91dCk7CisKKyAgICBhdl9sb2cob3V0bGluay0+c3JjLCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgInNhbXBsZV9yYXRlOiVkIGNobGF5b3V0OiVzIGR1cmF0aW9uOiUiUFJJZDY0IlxuIiwKKyAgICAgICAgICAgZXZhbC0+c2FtcGxlX3JhdGUsIGJ1ZiwgZXZhbC0+ZHVyYXRpb24pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBFdmFsQ29udGV4dCAqZXZhbCA9IGN0eC0+cHJpdjsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geyBBVl9TQU1QTEVfRk1UX0RCTFAsIEFWX1NBTVBMRV9GTVRfTk9ORSB9OworICAgIGludDY0X3QgY2hsYXlvdXRzW10gPSB7IGV2YWwtPmNobGF5b3V0ID8gZXZhbC0+Y2hsYXlvdXQgOiBGRl9DT1VOVDJMQVlPVVQoZXZhbC0+bmJfY2hhbm5lbHMpICwgLTEgfTsKKyAgICBpbnQgc2FtcGxlX3JhdGVzW10gPSB7IGV2YWwtPnNhbXBsZV9yYXRlLCAtMSB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzIChjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpKTsKKyAgICBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGF2ZmlsdGVyX21ha2VfZm9ybWF0NjRfbGlzdChjaGxheW91dHMpKTsKKyAgICBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfcmF0ZXMpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEV2YWxDb250ZXh0ICpldmFsID0gb3V0bGluay0+c3JjLT5wcml2OworICAgIEFWRnJhbWUgKnNhbXBsZXNyZWY7CisgICAgaW50IGksIGo7CisgICAgaW50NjRfdCB0ID0gYXZfcmVzY2FsZShldmFsLT5uLCBBVl9USU1FX0JBU0UsIGV2YWwtPnNhbXBsZV9yYXRlKTsKKworICAgIGlmIChldmFsLT5kdXJhdGlvbiA+PSAwICYmIHQgPj0gZXZhbC0+ZHVyYXRpb24pCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHNhbXBsZXNyZWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGV2YWwtPm5iX3NhbXBsZXMpOworICAgIGlmICghc2FtcGxlc3JlZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8qIGV2YWx1YXRlIGV4cHJlc3Npb24gZm9yIGVhY2ggc2luZ2xlIHNhbXBsZSBhbmQgZm9yIGVhY2ggY2hhbm5lbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBldmFsLT5uYl9zYW1wbGVzOyBpKyssIGV2YWwtPm4rKykgeworICAgICAgICBldmFsLT52YXJfdmFsdWVzW1ZBUl9OXSA9IGV2YWwtPm47CisgICAgICAgIGV2YWwtPnZhcl92YWx1ZXNbVkFSX1RdID0gZXZhbC0+dmFyX3ZhbHVlc1tWQVJfTl0gKiAoZG91YmxlKTEvZXZhbC0+c2FtcGxlX3JhdGU7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGV2YWwtPm5iX2NoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAgICooKGRvdWJsZSAqKSBzYW1wbGVzcmVmLT5leHRlbmRlZF9kYXRhW2pdICsgaSkgPQorICAgICAgICAgICAgICAgIGF2X2V4cHJfZXZhbChldmFsLT5leHByW2pdLCBldmFsLT52YXJfdmFsdWVzLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNhbXBsZXNyZWYtPnB0cyA9IGV2YWwtPnB0czsKKyAgICBzYW1wbGVzcmVmLT5zYW1wbGVfcmF0ZSA9IGV2YWwtPnNhbXBsZV9yYXRlOworICAgIGV2YWwtPnB0cyArPSBldmFsLT5uYl9zYW1wbGVzOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBzYW1wbGVzcmVmKTsKK30KKworI2lmIENPTkZJR19BRVZBTFNSQ19GSUxURVIKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhZXZhbHNyY19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX3Byb3BzLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYXNyY19hZXZhbHNyYyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJhZXZhbHNyYyIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR2VuZXJhdGUgYW4gYXVkaW8gc2lnbmFsIGdlbmVyYXRlZCBieSBhbiBleHByZXNzaW9uLiIpLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRXZhbENvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICAgID0gTlVMTCwKKyAgICAub3V0cHV0cyAgICAgICA9IGFldmFsc3JjX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmYWV2YWxzcmNfY2xhc3MsCit9OworCisjZW5kaWYgLyogQ09ORklHX0FFVkFMU1JDX0ZJTFRFUiAqLworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihFdmFsQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhZXZhbF9vcHRpb25zW109IHsKKyAgICB7ICJleHBycyIsICJzZXQgdGhlICd8Jy1zZXBhcmF0ZWQgbGlzdCBvZiBjaGFubmVscyBleHByZXNzaW9ucyIsIE9GRlNFVChleHBycyksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJjaGFubmVsX2xheW91dCIsICJzZXQgY2hhbm5lbCBsYXlvdXQiLCBPRkZTRVQoY2hsYXlvdXRfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgImMiLCAgICAgICAgICAgICAgInNldCBjaGFubmVsIGxheW91dCIsIE9GRlNFVChjaGxheW91dF9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhhZXZhbCk7CisKK3N0YXRpYyBpbnQgYWV2YWxfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgID0gY3R4LT5pbnB1dHNbMF07CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rICA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBFdmFsQ29udGV4dCAqZXZhbCA9IGN0eC0+cHJpdjsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geworICAgICAgICBBVl9TQU1QTEVfRk1UX0RCTFAsIEFWX1NBTVBMRV9GTVRfTk9ORQorICAgIH07CisKKyAgICAvLyBpbmxpbmsgc3VwcG9ydHMgYW55IGNoYW5uZWwgbGF5b3V0CisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2NvdW50cygpOworICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJmlubGluay0+b3V0X2NoYW5uZWxfbGF5b3V0cyk7CisKKyAgICBpZiAoZXZhbC0+c2FtZV9jaGxheW91dCkgeworICAgICAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfY291bnRzKCk7CisgICAgICAgIGlmICghbGF5b3V0cykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG91dGxpbmsgc3VwcG9ydHMgb25seSByZXF1ZXN0ZWQgb3V0cHV0IGNoYW5uZWwgbGF5b3V0CisgICAgICAgIGxheW91dHMgPSBOVUxMOworICAgICAgICBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoJmxheW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsLT5vdXRfY2hhbm5lbF9sYXlvdXQgPyBldmFsLT5vdXRfY2hhbm5lbF9sYXlvdXQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfQ09VTlQyTEFZT1VUKGV2YWwtPm5iX2NoYW5uZWxzKSk7CisgICAgICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJm91dGxpbmstPmluX2NoYW5uZWxfbGF5b3V0cyk7CisgICAgfQorCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWV2YWxfY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgRXZhbENvbnRleHQgKmV2YWwgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGV2YWwtPnNhbWVfY2hsYXlvdXQpIHsKKyAgICAgICAgZXZhbC0+Y2hsYXlvdXQgPSBpbmxpbmstPmNoYW5uZWxfbGF5b3V0OworCisgICAgICAgIGlmICgocmV0ID0gcGFyc2VfY2hhbm5lbF9leHByZXNzaW9ucyhjdHgsIGlubGluay0+Y2hhbm5lbHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGV2YWwtPm4gPSAwOworICAgIGV2YWwtPm5iX2luX2NoYW5uZWxzID0gZXZhbC0+dmFyX3ZhbHVlc1tWQVJfTkJfSU5fQ0hBTk5FTFNdID0gaW5saW5rLT5jaGFubmVsczsKKyAgICBldmFsLT52YXJfdmFsdWVzW1ZBUl9OQl9PVVRfQ0hBTk5FTFNdID0gb3V0bGluay0+Y2hhbm5lbHM7CisgICAgZXZhbC0+dmFyX3ZhbHVlc1tWQVJfU10gPSBpbmxpbmstPnNhbXBsZV9yYXRlOworICAgIGV2YWwtPnZhcl92YWx1ZXNbVkFSX1RdID0gTkFOOworCisgICAgZXZhbC0+Y2hhbm5lbF92YWx1ZXMgPSBhdl9yZWFsbG9jX2YoZXZhbC0+Y2hhbm5lbF92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5jaGFubmVscywgc2l6ZW9mKCpldmFsLT5jaGFubmVsX3ZhbHVlcykpOworICAgIGlmICghZXZhbC0+Y2hhbm5lbF92YWx1ZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBUUzJUKHRzLCB0YikgKCh0cykgPT0gQVZfTk9QVFNfVkFMVUUgPyBOQU4gOiAoZG91YmxlKSh0cykqYXZfcTJkKHRiKSkKKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEV2YWxDb250ZXh0ICpldmFsICAgICA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIGludCBuYl9zYW1wbGVzICAgICAgICA9IGluLT5uYl9zYW1wbGVzOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBkb3VibGUgdDA7CisgICAgaW50IGksIGo7CisKKyAgICAvKiBkbyB2b2x1bWUgc2NhbGluZyBpbi1wbGFjZSBpZiBpbnB1dCBidWZmZXIgaXMgd3JpdGFibGUgKi8KKyAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5iX3NhbXBsZXMpOworICAgIGlmICghb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisKKyAgICB0MCA9IFRTMlQoaW4tPnB0cywgaW5saW5rLT50aW1lX2Jhc2UpOworCisgICAgLyogZXZhbHVhdGUgZXhwcmVzc2lvbiBmb3IgZWFjaCBzaW5nbGUgc2FtcGxlIGFuZCBmb3IgZWFjaCBjaGFubmVsICovCisgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKywgZXZhbC0+bisrKSB7CisgICAgICAgIGV2YWwtPnZhcl92YWx1ZXNbVkFSX05dID0gZXZhbC0+bjsKKyAgICAgICAgZXZhbC0+dmFyX3ZhbHVlc1tWQVJfVF0gPSB0MCArIGkgKiAoZG91YmxlKTEvaW5saW5rLT5zYW1wbGVfcmF0ZTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5saW5rLT5jaGFubmVsczsgaisrKQorICAgICAgICAgICAgZXZhbC0+Y2hhbm5lbF92YWx1ZXNbal0gPSAqKChkb3VibGUgKikgaW4tPmV4dGVuZGVkX2RhdGFbal0gKyBpKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0bGluay0+Y2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgZXZhbC0+dmFyX3ZhbHVlc1tWQVJfQ0hdID0gajsKKyAgICAgICAgICAgICooKGRvdWJsZSAqKSBvdXQtPmV4dGVuZGVkX2RhdGFbal0gKyBpKSA9CisgICAgICAgICAgICAgICAgYXZfZXhwcl9ldmFsKGV2YWwtPmV4cHJbal0sIGV2YWwtPnZhcl92YWx1ZXMsIGV2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworI2lmIENPTkZJR19BRVZBTF9GSUxURVIKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFldmFsX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYWV2YWxfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGFldmFsX2NvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYWV2YWwgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYWV2YWwiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZpbHRlciBhdWRpbyBzaWduYWwgYWNjb3JkaW5nIHRvIGEgc3BlY2lmaWVkIGV4cHJlc3Npb24uIiksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBhZXZhbF9xdWVyeV9mb3JtYXRzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihFdmFsQ29udGV4dCksCisgICAgLmlucHV0cyAgICAgICAgPSBhZXZhbF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhZXZhbF9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmFldmFsX2NsYXNzLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19BRVZBTF9GSUxURVIgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hZGVsYXkuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hZGVsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjYwZjQzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FkZWxheS5jCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhbkRlbGF5IHsKKyAgICBpbnQgZGVsYXk7CisgICAgdW5zaWduZWQgZGVsYXlfaW5kZXg7CisgICAgdW5zaWduZWQgaW5kZXg7CisgICAgdWludDhfdCAqc2FtcGxlczsKK30gQ2hhbkRlbGF5OworCit0eXBlZGVmIHN0cnVjdCBBdWRpb0RlbGF5Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgY2hhciAqZGVsYXlzOworICAgIENoYW5EZWxheSAqY2hhbmRlbGF5OworICAgIGludCBuYl9kZWxheXM7CisgICAgaW50IGJsb2NrX2FsaWduOworICAgIHVuc2lnbmVkIG1heF9kZWxheTsKKyAgICBpbnQ2NF90IG5leHRfcHRzOworCisgICAgdm9pZCAoKmRlbGF5X2NoYW5uZWwpKENoYW5EZWxheSAqZCwgaW50IG5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0KTsKK30gQXVkaW9EZWxheUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEF1ZGlvRGVsYXlDb250ZXh0LCB4KQorI2RlZmluZSBBIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYWRlbGF5X29wdGlvbnNbXSA9IHsKKyAgICB7ICJkZWxheXMiLCAic2V0IGxpc3Qgb2YgZGVsYXlzIGZvciBlYWNoIGNoYW5uZWwiLCBPRkZTRVQoZGVsYXlzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgMCwgMCwgQSB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYWRlbGF5KTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzOworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRzW10gPSB7CisgICAgICAgIEFWX1NBTVBMRV9GTVRfVThQLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX1NBTVBMRV9GTVRfUzMyUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFRQLCBBVl9TQU1QTEVfRk1UX0RCTFAsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORQorICAgIH07CisKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfbGF5b3V0cygpOworICAgIGlmICghbGF5b3V0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgREVMQVkobmFtZSwgdHlwZSwgZmlsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgZGVsYXlfY2hhbm5lbF8jIyBuYW1lICMjcChDaGFuRGVsYXkgKmQsIGludCBuYl9zYW1wbGVzLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNzcmMsIHVpbnQ4X3QgKmRkc3QpIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHR5cGUgKnNyYyA9ICh0eXBlICopc3NyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSAqZHN0ID0gKHR5cGUgKilkZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlICpzYW1wbGVzID0gKHR5cGUgKilkLT5zYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKG5iX3NhbXBsZXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGQtPmRlbGF5X2luZGV4IDwgZC0+ZGVsYXkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgaW50IGxlbiA9IEZGTUlOKG5iX3NhbXBsZXMsIGQtPmRlbGF5IC0gZC0+ZGVsYXlfaW5kZXgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1lbWNweSgmc2FtcGxlc1tkLT5kZWxheV9pbmRleF0sIHNyYywgbGVuICogc2l6ZW9mKHR5cGUpKTsgICAgXAorICAgICAgICAgICAgbWVtc2V0KGRzdCwgZmlsbCwgbGVuICogc2l6ZW9mKHR5cGUpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkLT5kZWxheV9pbmRleCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNyYyArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0ICs9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuYl9zYW1wbGVzIC09IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKmRzdCA9IHNhbXBsZXNbZC0+aW5kZXhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzYW1wbGVzW2QtPmluZGV4XSA9ICpzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5iX3NhbXBsZXMtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZC0+aW5kZXgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzcmMrKywgZHN0Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGQtPmluZGV4ID0gZC0+aW5kZXggPj0gZC0+ZGVsYXkgPyAwIDogZC0+aW5kZXg7ICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworREVMQVkodTgsICB1aW50OF90LCAweDgwKQorREVMQVkoczE2LCBpbnQxNl90LCAwKQorREVMQVkoczMyLCBpbnQzMl90LCAwKQorREVMQVkoZmx0LCBmbG9hdCwgICAwKQorREVMQVkoZGJsLCBkb3VibGUsICAwKQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEF1ZGlvRGVsYXlDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNoYXIgKnAsICphcmcsICpzYXZlcHRyID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIHMtPmNoYW5kZWxheSA9IGF2X2NhbGxvYyhpbmxpbmstPmNoYW5uZWxzLCBzaXplb2YoKnMtPmNoYW5kZWxheSkpOworICAgIGlmICghcy0+Y2hhbmRlbGF5KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHMtPm5iX2RlbGF5cyA9IGlubGluay0+Y2hhbm5lbHM7CisgICAgcy0+YmxvY2tfYWxpZ24gPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShpbmxpbmstPmZvcm1hdCk7CisKKyAgICBwID0gcy0+ZGVsYXlzOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9kZWxheXM7IGkrKykgeworICAgICAgICBDaGFuRGVsYXkgKmQgPSAmcy0+Y2hhbmRlbGF5W2ldOworICAgICAgICBmbG9hdCBkZWxheTsKKworICAgICAgICBpZiAoIShhcmcgPSBhdl9zdHJ0b2socCwgInwiLCAmc2F2ZXB0cikpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcCA9IE5VTEw7CisgICAgICAgIHNzY2FuZihhcmcsICIlZiIsICZkZWxheSk7CisKKyAgICAgICAgZC0+ZGVsYXkgPSBkZWxheSAqIGlubGluay0+c2FtcGxlX3JhdGUgLyAxMDAwLjA7CisgICAgICAgIGlmIChkLT5kZWxheSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkRlbGF5IG11c3QgYmUgbm9uIG5lZ2F0aXZlIG51bWJlci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9kZWxheXM7IGkrKykgeworICAgICAgICBDaGFuRGVsYXkgKmQgPSAmcy0+Y2hhbmRlbGF5W2ldOworCisgICAgICAgIGlmICghZC0+ZGVsYXkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBkLT5zYW1wbGVzID0gYXZfbWFsbG9jX2FycmF5KGQtPmRlbGF5LCBzLT5ibG9ja19hbGlnbik7CisgICAgICAgIGlmICghZC0+c2FtcGxlcykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgcy0+bWF4X2RlbGF5ID0gRkZNQVgocy0+bWF4X2RlbGF5LCBkLT5kZWxheSk7CisgICAgfQorCisgICAgaWYgKCFzLT5tYXhfZGVsYXkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQXQgbGVhc3Qgb25lIGRlbGF5ID4wIG11c3QgYmUgc3BlY2lmaWVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgc3dpdGNoIChpbmxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9VOFAgOiBzLT5kZWxheV9jaGFubmVsID0gZGVsYXlfY2hhbm5lbF91OHAgOyBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2UDogcy0+ZGVsYXlfY2hhbm5lbCA9IGRlbGF5X2NoYW5uZWxfczE2cDsgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMlA6IHMtPmRlbGF5X2NoYW5uZWwgPSBkZWxheV9jaGFubmVsX3MzMnA7IGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFRQOiBzLT5kZWxheV9jaGFubmVsID0gZGVsYXlfY2hhbm5lbF9mbHRwOyBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMUDogcy0+ZGVsYXlfY2hhbm5lbCA9IGRlbGF5X2NoYW5uZWxfZGJscDsgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEF1ZGlvRGVsYXlDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKm91dF9mcmFtZTsKKyAgICBpbnQgaTsKKworICAgIGlmIChjdHgtPmlzX2Rpc2FibGVkIHx8ICFzLT5kZWxheXMpCisgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBmcmFtZSk7CisKKyAgICBvdXRfZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgIGlmICghb3V0X2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0X2ZyYW1lLCBmcmFtZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfZGVsYXlzOyBpKyspIHsKKyAgICAgICAgQ2hhbkRlbGF5ICpkID0gJnMtPmNoYW5kZWxheVtpXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0gZnJhbWUtPmV4dGVuZGVkX2RhdGFbaV07CisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dF9mcmFtZS0+ZXh0ZW5kZWRfZGF0YVtpXTsKKworICAgICAgICBpZiAoIWQtPmRlbGF5KQorICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBmcmFtZS0+bmJfc2FtcGxlcyAqIHMtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+ZGVsYXlfY2hhbm5lbChkLCBmcmFtZS0+bmJfc2FtcGxlcywgc3JjLCBkc3QpOworICAgIH0KKworICAgIHMtPm5leHRfcHRzID0gZnJhbWUtPnB0cyArIGF2X3Jlc2NhbGVfcShmcmFtZS0+bmJfc2FtcGxlcywgKEFWUmF0aW9uYWwpezEsIGlubGluay0+c2FtcGxlX3JhdGV9LCBpbmxpbmstPnRpbWVfYmFzZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBvdXRfZnJhbWUpOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEF1ZGlvRGVsYXlDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmICFjdHgtPmlzX2Rpc2FibGVkICYmIHMtPm1heF9kZWxheSkgeworICAgICAgICBpbnQgbmJfc2FtcGxlcyA9IEZGTUlOKHMtPm1heF9kZWxheSwgMjA0OCk7CisgICAgICAgIEFWRnJhbWUgKmZyYW1lOworCisgICAgICAgIGZyYW1lID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHMtPm1heF9kZWxheSAtPSBuYl9zYW1wbGVzOworCisgICAgICAgIGF2X3NhbXBsZXNfc2V0X3NpbGVuY2UoZnJhbWUtPmV4dGVuZGVkX2RhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmZvcm1hdCk7CisKKyAgICAgICAgZnJhbWUtPnB0cyA9IHMtPm5leHRfcHRzOworICAgICAgICBpZiAocy0+bmV4dF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBzLT5uZXh0X3B0cyArPSBhdl9yZXNjYWxlX3EobmJfc2FtcGxlcywgKEFWUmF0aW9uYWwpezEsIG91dGxpbmstPnNhbXBsZV9yYXRlfSwgb3V0bGluay0+dGltZV9iYXNlKTsKKworICAgICAgICByZXQgPSBmaWx0ZXJfZnJhbWUoY3R4LT5pbnB1dHNbMF0sIGZyYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBdWRpb0RlbGF5Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9kZWxheXM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJnMtPmNoYW5kZWxheVtpXS5zYW1wbGVzKTsKKyAgICBhdl9mcmVlcCgmcy0+Y2hhbmRlbGF5KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFkZWxheV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFkZWxheV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hZGVsYXkgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYWRlbGF5IiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEZWxheSBvbmUgb3IgbW9yZSBhdWRpbyBjaGFubmVscy4iKSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQXVkaW9EZWxheUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmFkZWxheV9jbGFzcywKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAuaW5wdXRzICAgICAgICA9IGFkZWxheV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhZGVsYXlfb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9JTlRFUk5BTCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYWVjaG8uYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hZWNoby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNmZkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYWVjaG8uYwpAQCAtMCwwICsxLDM1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IEF1ZGlvRWNob0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGZsb2F0IGluX2dhaW4sIG91dF9nYWluOworICAgIGNoYXIgKmRlbGF5cywgKmRlY2F5czsKKyAgICBmbG9hdCAqZGVsYXksICpkZWNheTsKKyAgICBpbnQgbmJfZWNob2VzOworICAgIGludCBkZWxheV9pbmRleDsKKyAgICB1aW50OF90ICoqZGVsYXlwdHJzOworICAgIGludCBtYXhfc2FtcGxlcywgZmFkZV9vdXQ7CisgICAgaW50ICpzYW1wbGVzOworICAgIGludDY0X3QgbmV4dF9wdHM7CisKKyAgICB2b2lkICgqZWNob19zYW1wbGVzKShzdHJ1Y3QgQXVkaW9FY2hvQ29udGV4dCAqY3R4LCB1aW50OF90ICoqZGVsYXlwdHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKiBjb25zdCAqc3JjLCB1aW50OF90ICoqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLCBpbnQgY2hhbm5lbHMpOworfSBBdWRpb0VjaG9Db250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBdWRpb0VjaG9Db250ZXh0LCB4KQorI2RlZmluZSBBIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYWVjaG9fb3B0aW9uc1tdID0geworICAgIHsgImluX2dhaW4iLCAgInNldCBzaWduYWwgaW5wdXQgZ2FpbiIsICBPRkZTRVQoaW5fZ2FpbiksICBBVl9PUFRfVFlQRV9GTE9BVCwgIHsuZGJsPTAuNn0sIDAsIDEsIEEgfSwKKyAgICB7ICJvdXRfZ2FpbiIsICJzZXQgc2lnbmFsIG91dHB1dCBnYWluIiwgT0ZGU0VUKG91dF9nYWluKSwgQVZfT1BUX1RZUEVfRkxPQVQsICB7LmRibD0wLjN9LCAwLCAxLCBBIH0sCisgICAgeyAiZGVsYXlzIiwgICAic2V0IGxpc3Qgb2Ygc2lnbmFsIGRlbGF5cyIsIE9GRlNFVChkZWxheXMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIxMDAwIn0sIDAsIDAsIEEgfSwKKyAgICB7ICJkZWNheXMiLCAgICJzZXQgbGlzdCBvZiBzaWduYWwgZGVjYXlzIiwgT0ZGU0VUKGRlY2F5cyksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjAuNSJ9LCAwLCAwLCBBIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhhZWNobyk7CisKK3N0YXRpYyB2b2lkIGNvdW50X2l0ZW1zKGNoYXIgKml0ZW1fc3RyLCBpbnQgKm5iX2l0ZW1zKQoreworICAgIGNoYXIgKnA7CisKKyAgICAqbmJfaXRlbXMgPSAxOworICAgIGZvciAocCA9IGl0ZW1fc3RyOyAqcDsgcCsrKSB7CisgICAgICAgIGlmICgqcCA9PSAnfCcpCisgICAgICAgICAgICAoKm5iX2l0ZW1zKSsrOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZCBmaWxsX2l0ZW1zKGNoYXIgKml0ZW1fc3RyLCBpbnQgKm5iX2l0ZW1zLCBmbG9hdCAqaXRlbXMpCit7CisgICAgY2hhciAqcCwgKnNhdmVwdHIgPSBOVUxMOworICAgIGludCBpLCBuZXdfbmJfaXRlbXMgPSAwOworCisgICAgcCA9IGl0ZW1fc3RyOworICAgIGZvciAoaSA9IDA7IGkgPCAqbmJfaXRlbXM7IGkrKykgeworICAgICAgICBjaGFyICp0c3RyID0gYXZfc3RydG9rKHAsICJ8IiwgJnNhdmVwdHIpOworICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgbmV3X25iX2l0ZW1zICs9IHNzY2FuZih0c3RyLCAiJWYiLCAmaXRlbXNbaV0pID09IDE7CisgICAgfQorCisgICAgKm5iX2l0ZW1zID0gbmV3X25iX2l0ZW1zOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBdWRpb0VjaG9Db250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfZnJlZXAoJnMtPmRlbGF5KTsKKyAgICBhdl9mcmVlcCgmcy0+ZGVjYXkpOworICAgIGF2X2ZyZWVwKCZzLT5zYW1wbGVzKTsKKworICAgIGlmIChzLT5kZWxheXB0cnMpCisgICAgICAgIGF2X2ZyZWVwKCZzLT5kZWxheXB0cnNbMF0pOworICAgIGF2X2ZyZWVwKCZzLT5kZWxheXB0cnMpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBdWRpb0VjaG9Db250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBuYl9kZWxheXMsIG5iX2RlY2F5cywgaTsKKworICAgIGlmICghcy0+ZGVsYXlzIHx8ICFzLT5kZWNheXMpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBkZWxheXMgYW5kL29yIGRlY2F5cy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGNvdW50X2l0ZW1zKHMtPmRlbGF5cywgJm5iX2RlbGF5cyk7CisgICAgY291bnRfaXRlbXMocy0+ZGVjYXlzLCAmbmJfZGVjYXlzKTsKKworICAgIHMtPmRlbGF5ID0gYXZfcmVhbGxvY19mKHMtPmRlbGF5LCBuYl9kZWxheXMsIHNpemVvZigqcy0+ZGVsYXkpKTsKKyAgICBzLT5kZWNheSA9IGF2X3JlYWxsb2NfZihzLT5kZWNheSwgbmJfZGVjYXlzLCBzaXplb2YoKnMtPmRlY2F5KSk7CisgICAgaWYgKCFzLT5kZWxheSB8fCAhcy0+ZGVjYXkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmaWxsX2l0ZW1zKHMtPmRlbGF5cywgJm5iX2RlbGF5cywgcy0+ZGVsYXkpOworICAgIGZpbGxfaXRlbXMocy0+ZGVjYXlzLCAmbmJfZGVjYXlzLCBzLT5kZWNheSk7CisKKyAgICBpZiAobmJfZGVsYXlzICE9IG5iX2RlY2F5cykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJOdW1iZXIgb2YgZGVsYXlzICVkIGRpZmZlcnMgZnJvbSBudW1iZXIgb2YgZGVjYXlzICVkLlxuIiwgbmJfZGVsYXlzLCBuYl9kZWNheXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPm5iX2VjaG9lcyA9IG5iX2RlbGF5czsKKyAgICBpZiAoIXMtPm5iX2VjaG9lcykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJBdCBsZWFzdCBvbmUgZGVjYXkgJiBkZWxheSBtdXN0IGJlIHNldC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPnNhbXBsZXMgPSBhdl9yZWFsbG9jX2Yocy0+c2FtcGxlcywgbmJfZGVsYXlzLCBzaXplb2YoKnMtPnNhbXBsZXMpKTsKKyAgICBpZiAoIXMtPnNhbXBsZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZGVsYXlzOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPmRlbGF5W2ldIDw9IDAgfHwgcy0+ZGVsYXlbaV0gPiA5MDAwMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiZGVsYXlbJWRdOiAlZiBpcyBvdXQgb2YgYWxsb3dlZCByYW5nZTogKDAsIDkwMDAwXVxuIiwgaSwgcy0+ZGVsYXlbaV0pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+ZGVjYXlbaV0gPD0gMCB8fCBzLT5kZWNheVtpXSA+IDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImRlY2F5WyVkXTogJWYgaXMgb3V0IG9mIGFsbG93ZWQgcmFuZ2U6ICgwLCAxXVxuIiwgaSwgcy0+ZGVjYXlbaV0pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPm5leHRfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJuYl9lY2hvZXM6JWRcbiIsIHMtPm5iX2VjaG9lcyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzOworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0czsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geworICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX1NBTVBMRV9GTVRfUzMyUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFRQLCBBVl9TQU1QTEVfRk1UX0RCTFAsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORQorICAgIH07CisKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfbGF5b3V0cygpOworICAgIGlmICghbGF5b3V0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTU9EKGEsIGIpICgoKGEpID49IChiKSkgPyAoYSkgLSAoYikgOiAoYSkpCisKKyNkZWZpbmUgRUNITyhuYW1lLCB0eXBlLCBtaW4sIG1heCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBlY2hvX3NhbXBsZXNfIyMgbmFtZSAjI3AoQXVkaW9FY2hvQ29udGV4dCAqY3R4LCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipkZWxheXB0cnMsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICogY29uc3QgKnNyYywgdWludDhfdCAqKmRzdCwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCBjaGFubmVscykgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBkb3VibGUgb3V0X2dhaW4gPSBjdHgtPm91dF9nYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgZG91YmxlIGluX2dhaW4gPSBjdHgtPmluX2dhaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBuYl9lY2hvZXMgPSBjdHgtPm5iX2VjaG9lczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgbWF4X3NhbXBsZXMgPSBjdHgtPm1heF9zYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGosIGNoYW4sIGF2X3VuaW5pdChpbmRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdl9hc3NlcnQxKGNoYW5uZWxzID4gMCk7IC8qIHdvdWxkIGNvcnJ1cHQgZGVsYXlfaW5kZXggKi8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBjaGFubmVsczsgY2hhbisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdHlwZSAqcyA9ICh0eXBlICopc3JjW2NoYW5dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHR5cGUgKmQgPSAodHlwZSAqKWRzdFtjaGFuXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0eXBlICpkYnVmID0gKHR5cGUgKilkZWxheXB0cnNbY2hhbl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGluZGV4ID0gY3R4LT5kZWxheV9pbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrLCBzKyssIGQrKykgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvdWJsZSBvdXQsIGluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW4gPSAqczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG91dCA9IGluICogaW5fZ2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmJfZWNob2VzOyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCBpeCA9IGluZGV4ICsgbWF4X3NhbXBsZXMgLSBjdHgtPnNhbXBsZXNbal07ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpeCA9IE1PRChpeCwgbWF4X3NhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgb3V0ICs9IGRidWZbaXhdICogY3R4LT5kZWNheVtqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG91dCAqPSBvdXRfZ2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKmQgPSBhdl9jbGlwZChvdXQsIG1pbiwgbWF4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRidWZbaW5kZXhdID0gaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW5kZXggPSBNT0QoaW5kZXggKyAxLCBtYXhfc2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGN0eC0+ZGVsYXlfaW5kZXggPSBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworRUNITyhkYmwsIGRvdWJsZSwgIC0xLjAsICAgICAgMS4wICAgICAgKQorRUNITyhmbHQsIGZsb2F0LCAgIC0xLjAsICAgICAgMS4wICAgICAgKQorRUNITyhzMTYsIGludDE2X3QsIElOVDE2X01JTiwgSU5UMTZfTUFYKQorRUNITyhzMzIsIGludDMyX3QsIElOVDMyX01JTiwgSU5UMzJfTUFYKQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEF1ZGlvRWNob0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgZmxvYXQgdm9sdW1lID0gMS4wOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2VjaG9lczsgaSsrKSB7CisgICAgICAgIHMtPnNhbXBsZXNbaV0gPSBzLT5kZWxheVtpXSAqIG91dGxpbmstPnNhbXBsZV9yYXRlIC8gMTAwMC4wOworICAgICAgICBzLT5tYXhfc2FtcGxlcyA9IEZGTUFYKHMtPm1heF9zYW1wbGVzLCBzLT5zYW1wbGVzW2ldKTsKKyAgICAgICAgdm9sdW1lICs9IHMtPmRlY2F5W2ldOworICAgIH0KKworICAgIGlmIChzLT5tYXhfc2FtcGxlcyA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vdGhpbmcgdG8gZWNobyAtIG1pc3NpbmcgZGVsYXkgc2FtcGxlcy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBzLT5mYWRlX291dCA9IHMtPm1heF9zYW1wbGVzOworCisgICAgaWYgKHZvbHVtZSAqIHMtPmluX2dhaW4gKiBzLT5vdXRfZ2FpbiA+IDEuMCkKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAib3V0X2dhaW4gJWYgY2FuIGNhdXNlIHNhdHVyYXRpb24gb2Ygb3V0cHV0XG4iLCBzLT5vdXRfZ2Fpbik7CisKKyAgICBzd2l0Y2ggKG91dGxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQOiBzLT5lY2hvX3NhbXBsZXMgPSBlY2hvX3NhbXBsZXNfZGJscDsgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVFA6IHMtPmVjaG9fc2FtcGxlcyA9IGVjaG9fc2FtcGxlc19mbHRwOyBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2UDogcy0+ZWNob19zYW1wbGVzID0gZWNob19zYW1wbGVzX3MxNnA7IGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzJQOiBzLT5lY2hvX3NhbXBsZXMgPSBlY2hvX3NhbXBsZXNfczMycDsgYnJlYWs7CisgICAgfQorCisKKyAgICBpZiAocy0+ZGVsYXlwdHJzKQorICAgICAgICBhdl9mcmVlcCgmcy0+ZGVsYXlwdHJzWzBdKTsKKyAgICBhdl9mcmVlcCgmcy0+ZGVsYXlwdHJzKTsKKworICAgIHJldHVybiBhdl9zYW1wbGVzX2FsbG9jX2FycmF5X2FuZF9zYW1wbGVzKCZzLT5kZWxheXB0cnMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF4X3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+Zm9ybWF0LCAwKTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQXVkaW9FY2hvQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpvdXRfZnJhbWU7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoZnJhbWUpKSB7CisgICAgICAgIG91dF9mcmFtZSA9IGZyYW1lOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dF9mcmFtZSA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghb3V0X2ZyYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXRfZnJhbWUsIGZyYW1lKTsKKyAgICB9CisKKyAgICBzLT5lY2hvX3NhbXBsZXMocywgcy0+ZGVsYXlwdHJzLCBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgb3V0X2ZyYW1lLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcywgaW5saW5rLT5jaGFubmVscyk7CisKKyAgICBzLT5uZXh0X3B0cyA9IGZyYW1lLT5wdHMgKyBhdl9yZXNjYWxlX3EoZnJhbWUtPm5iX3NhbXBsZXMsIChBVlJhdGlvbmFsKXsxLCBpbmxpbmstPnNhbXBsZV9yYXRlfSwgaW5saW5rLT50aW1lX2Jhc2UpOworCisgICAgaWYgKGZyYW1lICE9IG91dF9mcmFtZSkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG91dF9mcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQXVkaW9FY2hvQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7CisKKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmICFjdHgtPmlzX2Rpc2FibGVkICYmIHMtPmZhZGVfb3V0KSB7CisgICAgICAgIGludCBuYl9zYW1wbGVzID0gRkZNSU4ocy0+ZmFkZV9vdXQsIDIwNDgpOworICAgICAgICBBVkZyYW1lICpmcmFtZTsKKworICAgICAgICBmcmFtZSA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBzLT5mYWRlX291dCAtPSBuYl9zYW1wbGVzOworCisgICAgICAgIGF2X3NhbXBsZXNfc2V0X3NpbGVuY2UoZnJhbWUtPmV4dGVuZGVkX2RhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmZvcm1hdCk7CisKKyAgICAgICAgcy0+ZWNob19zYW1wbGVzKHMsIHMtPmRlbGF5cHRycywgZnJhbWUtPmV4dGVuZGVkX2RhdGEsIGZyYW1lLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMsIG91dGxpbmstPmNoYW5uZWxzKTsKKworICAgICAgICBmcmFtZS0+cHRzID0gcy0+bmV4dF9wdHM7CisgICAgICAgIGlmIChzLT5uZXh0X3B0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHMtPm5leHRfcHRzICs9IGF2X3Jlc2NhbGVfcShuYl9zYW1wbGVzLCAoQVZSYXRpb25hbCl7MSwgb3V0bGluay0+c2FtcGxlX3JhdGV9LCBvdXRsaW5rLT50aW1lX2Jhc2UpOworCisgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZnJhbWUpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhZWNob19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFlY2hvX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYWVjaG8gPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYWVjaG8iLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFkZCBlY2hvaW5nIHRvIHRoZSBhdWRpby4iKSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQXVkaW9FY2hvQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmYWVjaG9fY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICAgID0gYWVjaG9faW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYWVjaG9fb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYWZhZGUuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hZmFkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNmY2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYWZhZGUuYwpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogZmFkZSBhdWRpbyBmaWx0ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHR5cGU7CisgICAgaW50IGN1cnZlOworICAgIGludCBuYl9zYW1wbGVzOworICAgIGludDY0X3Qgc3RhcnRfc2FtcGxlOworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgaW50NjRfdCBzdGFydF90aW1lOworCisgICAgdm9pZCAoKmZhZGVfc2FtcGxlcykodWludDhfdCAqKmRzdCwgdWludDhfdCAqIGNvbnN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCBjaGFubmVscywgaW50IGRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0LCBpbnQgcmFuZ2UsIGludCBjdXJ2ZSk7Cit9IEF1ZGlvRmFkZUNvbnRleHQ7CisKK2VudW0gQ3VydmVUeXBlIHsgVFJJLCBRU0lOLCBFU0lOLCBIU0lOLCBMT0csIFBBUiwgUVVBLCBDVUIsIFNRVSwgQ0JSIH07CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEF1ZGlvRmFkZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYWZhZGVfb3B0aW9uc1tdID0geworICAgIHsgInR5cGUiLCAgICAgICAgICJzZXQgdGhlIGZhZGUgZGlyZWN0aW9uIiwgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHR5cGUpLCAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAwICAgIH0sIDAsIDEsIEZMQUdTLCAidHlwZSIgfSwKKyAgICB7ICJ0IiwgICAgICAgICAgICAic2V0IHRoZSBmYWRlIGRpcmVjdGlvbiIsICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVCh0eXBlKSwgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMCAgICB9LCAwLCAxLCBGTEFHUywgInR5cGUiIH0sCisgICAgeyAiaW4iLCAgICAgICAgICAgImZhZGUtaW4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IDAgICAgfSwgMCwgMCwgRkxBR1MsICJ0eXBlIiB9LAorICAgIHsgIm91dCIsICAgICAgICAgICJmYWRlLW91dCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSAxICAgIH0sIDAsIDAsIEZMQUdTLCAidHlwZSIgfSwKKyAgICB7ICJzdGFydF9zYW1wbGUiLCAic2V0IG51bWJlciBvZiBmaXJzdCBzYW1wbGUgdG8gc3RhcnQgZmFkaW5nIiwgIE9GRlNFVChzdGFydF9zYW1wbGUpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgIHsuaTY0ID0gMCAgICB9LCAwLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisgICAgeyAic3MiLCAgICAgICAgICAgInNldCBudW1iZXIgb2YgZmlyc3Qgc2FtcGxlIHRvIHN0YXJ0IGZhZGluZyIsICBPRkZTRVQoc3RhcnRfc2FtcGxlKSwgQVZfT1BUX1RZUEVfSU5UNjQsICB7Lmk2NCA9IDAgICAgfSwgMCwgSU5UNjRfTUFYLCBGTEFHUyB9LAorICAgIHsgIm5iX3NhbXBsZXMiLCAgICJzZXQgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIGZhZGUgZHVyYXRpb24iLCAgICAgT0ZGU0VUKG5iX3NhbXBsZXMpLCAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSA0NDEwMH0sIDEsIElOVDMyX01BWCwgRkxBR1MgfSwKKyAgICB7ICJucyIsICAgICAgICAgICAic2V0IG51bWJlciBvZiBzYW1wbGVzIGZvciBmYWRlIGR1cmF0aW9uIiwgICAgIE9GRlNFVChuYl9zYW1wbGVzKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gNDQxMDB9LCAxLCBJTlQzMl9NQVgsIEZMQUdTIH0sCisgICAgeyAic3RhcnRfdGltZSIsICAgInNldCB0aW1lIHRvIHN0YXJ0IGZhZGluZyIsICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3RhcnRfdGltZSksICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gMC4gfSwgMCwgSU5UMzJfTUFYLCBGTEFHUyB9LAorICAgIHsgInN0IiwgICAgICAgICAgICJzZXQgdGltZSB0byBzdGFydCBmYWRpbmciLCAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHN0YXJ0X3RpbWUpLCAgIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2NCA9IDAuIH0sIDAsIElOVDMyX01BWCwgRkxBR1MgfSwKKyAgICB7ICJkdXJhdGlvbiIsICAgICAic2V0IGZhZGUgZHVyYXRpb24iLCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChkdXJhdGlvbiksICAgICBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQgPSAwLiB9LCAwLCBJTlQzMl9NQVgsIEZMQUdTIH0sCisgICAgeyAiZCIsICAgICAgICAgICAgInNldCBmYWRlIGR1cmF0aW9uIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZHVyYXRpb24pLCAgICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gMC4gfSwgMCwgSU5UMzJfTUFYLCBGTEFHUyB9LAorICAgIHsgImN1cnZlIiwgICAgICAgICJzZXQgZmFkZSBjdXJ2ZSB0eXBlIiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGN1cnZlKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSBUUkkgIH0sIFRSSSwgQ0JSLCBGTEFHUywgImN1cnZlIiB9LAorICAgIHsgImMiLCAgICAgICAgICAgICJzZXQgZmFkZSBjdXJ2ZSB0eXBlIiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGN1cnZlKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSBUUkkgIH0sIFRSSSwgQ0JSLCBGTEFHUywgImN1cnZlIiB9LAorICAgIHsgInRyaSIsICAgICAgICAgICJsaW5lYXIgc2xvcGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBUUkkgIH0sIDAsIDAsIEZMQUdTLCAiY3VydmUiIH0sCisgICAgeyAicXNpbiIsICAgICAgICAgInF1YXJ0ZXIgb2Ygc2luZSB3YXZlIiwgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IFFTSU4gfSwgMCwgMCwgRkxBR1MsICJjdXJ2ZSIgfSwKKyAgICB7ICJlc2luIiwgICAgICAgICAiZXhwb25lbnRpYWwgc2luZSB3YXZlIiwgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gRVNJTiB9LCAwLCAwLCBGTEFHUywgImN1cnZlIiB9LAorICAgIHsgImhzaW4iLCAgICAgICAgICJoYWxmIG9mIHNpbmUgd2F2ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBIU0lOIH0sIDAsIDAsIEZMQUdTLCAiY3VydmUiIH0sCisgICAgeyAibG9nIiwgICAgICAgICAgImxvZ2FyaXRobWljIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IExPRyAgfSwgMCwgMCwgRkxBR1MsICJjdXJ2ZSIgfSwKKyAgICB7ICJwYXIiLCAgICAgICAgICAiaW52ZXJ0ZWQgcGFyYWJvbGEiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gUEFSICB9LCAwLCAwLCBGTEFHUywgImN1cnZlIiB9LAorICAgIHsgInF1YSIsICAgICAgICAgICJxdWFkcmF0aWMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBRVUEgIH0sIDAsIDAsIEZMQUdTLCAiY3VydmUiIH0sCisgICAgeyAiY3ViIiwgICAgICAgICAgImN1YmljIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IENVQiAgfSwgMCwgMCwgRkxBR1MsICJjdXJ2ZSIgfSwKKyAgICB7ICJzcXUiLCAgICAgICAgICAic3F1YXJlIHJvb3QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gU1FVICB9LCAwLCAwLCBGTEFHUywgImN1cnZlIiB9LAorICAgIHsgImNiciIsICAgICAgICAgICJjdWJpYyByb290IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBDQlIgIH0sIDAsIDAsIEZMQUdTLCAiY3VydmUiIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhhZmFkZSk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEF1ZGlvRmFkZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoSU5UNjRfTUFYIC0gcy0+bmJfc2FtcGxlcyA8IHMtPnN0YXJ0X3NhbXBsZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfUzE2UCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzIsIEFWX1NBTVBMRV9GTVRfUzMyUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFQsIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkwsIEFWX1NBTVBMRV9GTVRfREJMUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FCisgICAgfTsKKworICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9sYXlvdXRzKCk7CisgICAgaWYgKCFsYXlvdXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgbGF5b3V0cyk7CisKKyAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10cyk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworCisgICAgZm9ybWF0cyA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZm9ybWF0cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGRvdWJsZSBmYWRlX2dhaW4oaW50IGN1cnZlLCBpbnQ2NF90IGluZGV4LCBpbnQgcmFuZ2UpCit7CisgICAgZG91YmxlIGdhaW47CisKKyAgICBnYWluID0gRkZNQVgoMC4wLCBGRk1JTigxLjAsIDEuMCAqIGluZGV4IC8gcmFuZ2UpKTsKKworICAgIHN3aXRjaCAoY3VydmUpIHsKKyAgICBjYXNlIFFTSU46CisgICAgICAgIGdhaW4gPSBzaW4oZ2FpbiAqIE1fUEkgLyAyLjApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVTSU46CisgICAgICAgIGdhaW4gPSAxLjAgLSBjb3MoTV9QSSAvIDQuMCAqIChwb3coMi4wKmdhaW4gLSAxLCAzKSArIDEpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIU0lOOgorICAgICAgICBnYWluID0gKDEuMCAtIGNvcyhnYWluICogTV9QSSkpIC8gMi4wOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExPRzoKKyAgICAgICAgZ2FpbiA9IHBvdygwLjEsICgxIC0gZ2FpbikgKiA1LjApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBBUjoKKyAgICAgICAgZ2FpbiA9ICgxIC0gKDEgLSBnYWluKSAqICgxIC0gZ2FpbikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFVQToKKyAgICAgICAgZ2FpbiAqPSBnYWluOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENVQjoKKyAgICAgICAgZ2FpbiA9IGdhaW4gKiBnYWluICogZ2FpbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTUVU6CisgICAgICAgIGdhaW4gPSBzcXJ0KGdhaW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENCUjoKKyAgICAgICAgZ2FpbiA9IGNicnQoZ2Fpbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBnYWluOworfQorCisjZGVmaW5lIEZBREVfUExBTkFSKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgZmFkZV9zYW1wbGVzXyMjIG5hbWUgIyNwKHVpbnQ4X3QgKipkc3QsIHVpbnQ4X3QgKiBjb25zdCAqc3JjLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IGNoYW5uZWxzLCBpbnQgZGlyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzdGFydCwgaW50IHJhbmdlLCBpbnQgY3VydmUpICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIGdhaW4gPSBmYWRlX2dhaW4oY3VydmUsIHN0YXJ0ICsgaSAqIGRpciwgcmFuZ2UpOyAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHlwZSAqZCA9ICh0eXBlICopZHN0W2NdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHR5cGUgKnMgPSAodHlwZSAqKXNyY1tjXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZFtpXSA9IHNbaV0gKiBnYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEZBREUobmFtZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgZmFkZV9zYW1wbGVzXyMjIG5hbWUgKHVpbnQ4X3QgKipkc3QsIHVpbnQ4X3QgKiBjb25zdCAqc3JjLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IGNoYW5uZWxzLCBpbnQgZGlyLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzdGFydCwgaW50IHJhbmdlLCBpbnQgY3VydmUpICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlICpkID0gKHR5cGUgKilkc3RbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdHlwZSAqcyA9ICh0eXBlICopc3JjWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBjLCBrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgZ2FpbiA9IGZhZGVfZ2FpbihjdXJ2ZSwgc3RhcnQgKyBpICogZGlyLCByYW5nZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyssIGsrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkW2tdID0gc1trXSAqIGdhaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworRkFERV9QTEFOQVIoZGJsLCBkb3VibGUpCitGQURFX1BMQU5BUihmbHQsIGZsb2F0KQorRkFERV9QTEFOQVIoczE2LCBpbnQxNl90KQorRkFERV9QTEFOQVIoczMyLCBpbnQzMl90KQorCitGQURFKGRibCwgZG91YmxlKQorRkFERShmbHQsIGZsb2F0KQorRkFERShzMTYsIGludDE2X3QpCitGQURFKHMzMiwgaW50MzJfdCkKKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBdWRpb0ZhZGVDb250ZXh0ICpzICA9IGN0eC0+cHJpdjsKKworICAgIHN3aXRjaCAoaW5saW5rLT5mb3JtYXQpIHsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMOiAgcy0+ZmFkZV9zYW1wbGVzID0gZmFkZV9zYW1wbGVzX2RibDsgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQOiBzLT5mYWRlX3NhbXBsZXMgPSBmYWRlX3NhbXBsZXNfZGJscDsgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVDogIHMtPmZhZGVfc2FtcGxlcyA9IGZhZGVfc2FtcGxlc19mbHQ7ICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUUDogcy0+ZmFkZV9zYW1wbGVzID0gZmFkZV9zYW1wbGVzX2ZsdHA7IGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6ICBzLT5mYWRlX3NhbXBsZXMgPSBmYWRlX3NhbXBsZXNfczE2OyAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNlA6IHMtPmZhZGVfc2FtcGxlcyA9IGZhZGVfc2FtcGxlc19zMTZwOyBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyOiAgcy0+ZmFkZV9zYW1wbGVzID0gZmFkZV9zYW1wbGVzX3MzMjsgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzJQOiBzLT5mYWRlX3NhbXBsZXMgPSBmYWRlX3NhbXBsZXNfczMycDsgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHMtPmR1cmF0aW9uKQorICAgICAgICBzLT5uYl9zYW1wbGVzID0gYXZfcmVzY2FsZShzLT5kdXJhdGlvbiwgaW5saW5rLT5zYW1wbGVfcmF0ZSwgQVZfVElNRV9CQVNFKTsKKyAgICBpZiAocy0+c3RhcnRfdGltZSkKKyAgICAgICAgcy0+c3RhcnRfc2FtcGxlID0gYXZfcmVzY2FsZShzLT5zdGFydF90aW1lLCBpbmxpbmstPnNhbXBsZV9yYXRlLCBBVl9USU1FX0JBU0UpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCit7CisgICAgQXVkaW9GYWRlQ29udGV4dCAqcyAgICAgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgICA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIGludCBuYl9zYW1wbGVzICAgICAgICAgID0gYnVmLT5uYl9zYW1wbGVzOworICAgIEFWRnJhbWUgKm91dF9idWY7CisgICAgaW50NjRfdCBjdXJfc2FtcGxlID0gYXZfcmVzY2FsZV9xKGJ1Zi0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsIGlubGluay0+c2FtcGxlX3JhdGV9KTsKKworICAgIGlmICgoIXMtPnR5cGUgJiYgKHMtPnN0YXJ0X3NhbXBsZSArIHMtPm5iX3NhbXBsZXMgPCBjdXJfc2FtcGxlKSkgfHwKKyAgICAgICAgKCBzLT50eXBlICYmIChjdXJfc2FtcGxlICsgcy0+bmJfc2FtcGxlcyA8IHMtPnN0YXJ0X3NhbXBsZSkpKQorICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGJ1Zik7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoYnVmKSkgeworICAgICAgICBvdXRfYnVmID0gYnVmOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dF9idWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgbmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghb3V0X2J1ZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0X2J1ZiwgYnVmKTsKKyAgICB9CisKKyAgICBpZiAoKCFzLT50eXBlICYmIChjdXJfc2FtcGxlICsgbmJfc2FtcGxlcyA8IHMtPnN0YXJ0X3NhbXBsZSkpIHx8CisgICAgICAgICggcy0+dHlwZSAmJiAocy0+c3RhcnRfc2FtcGxlICsgcy0+bmJfc2FtcGxlcyA8IGN1cl9zYW1wbGUpKSkgeworICAgICAgICBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKG91dF9idWYtPmV4dGVuZGVkX2RhdGEsIDAsIG5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKG91dF9idWYpLCBvdXRfYnVmLT5mb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3Qgc3RhcnQ7CisKKyAgICAgICAgaWYgKCFzLT50eXBlKQorICAgICAgICAgICAgc3RhcnQgPSBjdXJfc2FtcGxlIC0gcy0+c3RhcnRfc2FtcGxlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGFydCA9IHMtPnN0YXJ0X3NhbXBsZSArIHMtPm5iX3NhbXBsZXMgLSBjdXJfc2FtcGxlOworCisgICAgICAgIHMtPmZhZGVfc2FtcGxlcyhvdXRfYnVmLT5leHRlbmRlZF9kYXRhLCBidWYtPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzLCBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnR5cGUgPyAtMSA6IDEsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmJfc2FtcGxlcywgcy0+Y3VydmUpOworICAgIH0KKworICAgIGlmIChidWYgIT0gb3V0X2J1ZikKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmYnVmKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0X2J1Zik7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl9hZl9hZmFkZV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2FmYWRlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hZmFkZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJhZmFkZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmFkZSBpbi9vdXQgaW5wdXQgYXVkaW8uIiksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEF1ZGlvRmFkZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAuaW5wdXRzICAgICAgICA9IGF2ZmlsdGVyX2FmX2FmYWRlX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX2FmX2FmYWRlX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmYWZhZGVfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYWZvcm1hdC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2Fmb3JtYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQwMzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2Fmb3JtYXQuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNaW5hIE5hZ3kgWmFraQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBmb3JtYXQgYXVkaW8gZmlsdGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IEFGb3JtYXRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICAgKmNsYXNzOworCisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzOworICAgIEFWRmlsdGVyRm9ybWF0cyAqc2FtcGxlX3JhdGVzOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmNoYW5uZWxfbGF5b3V0czsKKworICAgIGNoYXIgKmZvcm1hdHNfc3RyOworICAgIGNoYXIgKnNhbXBsZV9yYXRlc19zdHI7CisgICAgY2hhciAqY2hhbm5lbF9sYXlvdXRzX3N0cjsKK30gQUZvcm1hdENvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFGb3JtYXRDb250ZXh0LCB4KQorI2RlZmluZSBBIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNCisjZGVmaW5lIEYgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYWZvcm1hdF9vcHRpb25zW10gPSB7CisgICAgeyAic2FtcGxlX2ZtdHMiLCAgICAgIkEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygc2FtcGxlIGZvcm1hdHMuIiwgIE9GRlNFVChmb3JtYXRzX3N0ciksICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBBfEYgfSwKKyAgICB7ICJzYW1wbGVfcmF0ZXMiLCAgICAiQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzYW1wbGUgcmF0ZXMuIiwgICAgT0ZGU0VUKHNhbXBsZV9yYXRlc19zdHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIC5mbGFncyA9IEF8RiB9LAorICAgIHsgImNoYW5uZWxfbGF5b3V0cyIsICJBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNoYW5uZWwgbGF5b3V0cy4iLCBPRkZTRVQoY2hhbm5lbF9sYXlvdXRzX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgLmZsYWdzID0gQXxGIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhhZm9ybWF0KTsKKworI2RlZmluZSBQQVJTRV9GT1JNQVRTKHN0ciwgdHlwZSwgbGlzdCwgYWRkX3RvX2xpc3QsIGdldF9mbXQsIG5vbmUsIGRlc2MpICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhciAqbmV4dCwgKmN1ciA9IHN0ciwgc2VwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3RyICYmIHN0cmNocihzdHIsICcsJykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhpcyBzeW50YXggaXMgZGVwcmVjYXRlZCwgdXNlICd8JyB0byAiXAorICAgICAgICAgICAgICAgInNlcGFyYXRlICVzLlxuIiwgZGVzYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2VwID0gJywnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzZXAgPSAnfCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKGN1cikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0eXBlIGZtdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV4dCA9IHN0cmNocihjdXIsIHNlcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChuZXh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKm5leHQrKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoZm10ID0gZ2V0X2ZtdChjdXIpKSA9PSBub25lKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyAiIGRlc2MgIjogJXMuXG4iLCBjdXIpO1wKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhZGRfdG9fbGlzdCgmbGlzdCwgZm10KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGN1ciA9IG5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgZ2V0X3NhbXBsZV9yYXRlKGNvbnN0IGNoYXIgKnNhbXBsZXJhdGUpCit7CisgICAgaW50IHJldCA9IHN0cnRvbChzYW1wbGVyYXRlLCBOVUxMLCAwKTsKKyAgICByZXR1cm4gRkZNQVgocmV0LCAwKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQUZvcm1hdENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBQQVJTRV9GT1JNQVRTKHMtPmZvcm1hdHNfc3RyLCBlbnVtIEFWU2FtcGxlRm9ybWF0LCBzLT5mb3JtYXRzLAorICAgICAgICAgICAgICAgICAgZmZfYWRkX2Zvcm1hdCwgYXZfZ2V0X3NhbXBsZV9mbXQsIEFWX1NBTVBMRV9GTVRfTk9ORSwgInNhbXBsZSBmb3JtYXQiKTsKKyAgICBQQVJTRV9GT1JNQVRTKHMtPnNhbXBsZV9yYXRlc19zdHIsIGludCwgcy0+c2FtcGxlX3JhdGVzLCBmZl9hZGRfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgZ2V0X3NhbXBsZV9yYXRlLCAwLCAic2FtcGxlIHJhdGUiKTsKKyAgICBQQVJTRV9GT1JNQVRTKHMtPmNoYW5uZWxfbGF5b3V0c19zdHIsIHVpbnQ2NF90LCBzLT5jaGFubmVsX2xheW91dHMsCisgICAgICAgICAgICAgICAgICBmZl9hZGRfY2hhbm5lbF9sYXlvdXQsIGF2X2dldF9jaGFubmVsX2xheW91dCwgMCwKKyAgICAgICAgICAgICAgICAgICJjaGFubmVsIGxheW91dCIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBRm9ybWF0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIHMtPmZvcm1hdHMgPyBzLT5mb3JtYXRzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfYWxsX2Zvcm1hdHMoQVZNRURJQV9UWVBFX0FVRElPKSk7CisgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIHMtPnNhbXBsZV9yYXRlcyA/IHMtPnNhbXBsZV9yYXRlcyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FsbF9zYW1wbGVyYXRlcygpKTsKKyAgICBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIHMtPmNoYW5uZWxfbGF5b3V0cyA/IHMtPmNoYW5uZWxfbGF5b3V0cyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9hbGxfY2hhbm5lbF9jb3VudHMoKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2Fmb3JtYXRfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2Fmb3JtYXRfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYWZvcm1hdCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJhZm9ybWF0IiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDb252ZXJ0IHRoZSBpbnB1dCBhdWRpbyB0byBvbmUgb2YgdGhlIHNwZWNpZmllZCBmb3JtYXRzLiIpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQUZvcm1hdENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmFmb3JtYXRfY2xhc3MsCisgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl9hZl9hZm9ybWF0X2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX2FmX2Fmb3JtYXRfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYW1lcmdlLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYW1lcmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwYTc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hbWVyZ2UuYwpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBOaWNvbGFzIEdlb3JnZSA8bmljb2xhcy5nZW9yZ2VAbm9ybWFsZXN1cC5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEF1ZGlvIG1lcmdpbmcgZmlsdGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImJ1ZmZlcnF1ZXVlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBTV1JfQ0hfTUFYIDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgbmJfaW5wdXRzOworICAgIGludCByb3V0ZVtTV1JfQ0hfTUFYXTsgLyoqPCBjaGFubmVscyByb3V0aW5nLCBzZWUgY29weV9zYW1wbGVzICovCisgICAgaW50IGJwczsKKyAgICBzdHJ1Y3QgYW1lcmdlX2lucHV0IHsKKyAgICAgICAgc3RydWN0IEZGQnVmUXVldWUgcXVldWU7CisgICAgICAgIGludCBuYl9jaDsgICAgICAgICAvKio8IG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhlIGlucHV0ICovCisgICAgICAgIGludCBuYl9zYW1wbGVzOworICAgICAgICBpbnQgcG9zOworICAgIH0gKmluOworfSBBTWVyZ2VDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBTWVyZ2VDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFtZXJnZV9vcHRpb25zW10gPSB7CisgICAgeyAiaW5wdXRzIiwgInNwZWNpZnkgdGhlIG51bWJlciBvZiBpbnB1dHMiLCBPRkZTRVQobmJfaW5wdXRzKSwKKyAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMiB9LCAyLCBTV1JfQ0hfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYW1lcmdlKTsKKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQU1lcmdlQ29udGV4dCAqYW0gPSBjdHgtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYW0tPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGlmIChhbS0+aW4pCisgICAgICAgICAgICBmZl9idWZxdWV1ZV9kaXNjYXJkX2FsbCgmYW0tPmluW2ldLnF1ZXVlKTsKKyAgICAgICAgaWYgKGN0eC0+aW5wdXRfcGFkcykKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZjdHgtPmlucHV0X3BhZHNbaV0ubmFtZSk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZhbS0+aW4pOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQU1lcmdlQ29udGV4dCAqYW0gPSBjdHgtPnByaXY7CisgICAgaW50NjRfdCBpbmxheW91dFtTV1JfQ0hfTUFYXSwgb3V0bGF5b3V0ID0gMDsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHM7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKKyAgICBpbnQgaSwgb3ZlcmxhcCA9IDAsIG5iX2NoID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhbS0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKCFjdHgtPmlucHV0c1tpXS0+aW5fY2hhbm5lbF9sYXlvdXRzIHx8CisgICAgICAgICAgICAhY3R4LT5pbnB1dHNbaV0tPmluX2NoYW5uZWxfbGF5b3V0cy0+bmJfY2hhbm5lbF9sYXlvdXRzKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiTm8gY2hhbm5lbCBsYXlvdXQgZm9yIGlucHV0ICVkXG4iLCBpICsgMSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgICAgICB9CisgICAgICAgIGlubGF5b3V0W2ldID0gY3R4LT5pbnB1dHNbaV0tPmluX2NoYW5uZWxfbGF5b3V0cy0+Y2hhbm5lbF9sYXlvdXRzWzBdOworICAgICAgICBpZiAoY3R4LT5pbnB1dHNbaV0tPmluX2NoYW5uZWxfbGF5b3V0cy0+bmJfY2hhbm5lbF9sYXlvdXRzID4gMSkgeworICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKKyAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgMCwgaW5sYXlvdXRbaV0pOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJVc2luZyBcIiVzXCIgZm9yIGlucHV0ICVkXG4iLCBidWYsIGkgKyAxKTsKKyAgICAgICAgfQorICAgICAgICBhbS0+aW5baV0ubmJfY2ggPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoaW5sYXlvdXRbaV0pOworICAgICAgICBpZiAob3V0bGF5b3V0ICYgaW5sYXlvdXRbaV0pCisgICAgICAgICAgICBvdmVybGFwKys7CisgICAgICAgIG91dGxheW91dCB8PSBpbmxheW91dFtpXTsKKyAgICAgICAgbmJfY2ggKz0gYW0tPmluW2ldLm5iX2NoOworICAgIH0KKyAgICBpZiAobmJfY2ggPiBTV1JfQ0hfTUFYKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IGNoYW5uZWxzIChtYXggJWQpXG4iLCBTV1JfQ0hfTUFYKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKG92ZXJsYXApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiSW5wdXQgY2hhbm5lbCBsYXlvdXRzIG92ZXJsYXA6ICIKKyAgICAgICAgICAgICAgICJvdXRwdXQgbGF5b3V0IHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IGlucHV0IGNoYW5uZWxzXG4iKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2NoOyBpKyspCisgICAgICAgICAgICBhbS0+cm91dGVbaV0gPSBpOworICAgICAgICBvdXRsYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChuYl9jaCk7CisgICAgICAgIGlmICghb3V0bGF5b3V0KQorICAgICAgICAgICAgb3V0bGF5b3V0ID0gKChpbnQ2NF90KTEgPDwgbmJfY2gpIC0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgKnJvdXRlW1NXUl9DSF9NQVhdOworICAgICAgICBpbnQgYywgb3V0X2NoX251bWJlciA9IDA7CisKKyAgICAgICAgcm91dGVbMF0gPSBhbS0+cm91dGU7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBhbS0+bmJfaW5wdXRzOyBpKyspCisgICAgICAgICAgICByb3V0ZVtpXSA9IHJvdXRlW2kgLSAxXSArIGFtLT5pbltpIC0gMV0ubmJfY2g7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCA2NDsgYysrKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFtLT5uYl9pbnB1dHM7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoKGlubGF5b3V0W2ldID4+IGMpICYgMSkKKyAgICAgICAgICAgICAgICAgICAgKihyb3V0ZVtpXSsrKSA9IG91dF9jaF9udW1iZXIrKzsKKyAgICB9CisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QoZmZfcGFja2VkX3NhbXBsZV9mbXRzX2FycmF5KTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYW0tPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGxheW91dHMgPSBOVUxMOworICAgICAgICBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoJmxheW91dHMsIGlubGF5b3V0W2ldKTsKKyAgICAgICAgZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihsYXlvdXRzLCAmY3R4LT5pbnB1dHNbaV0tPm91dF9jaGFubmVsX2xheW91dHMpOworICAgIH0KKyAgICBsYXlvdXRzID0gTlVMTDsKKyAgICBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoJmxheW91dHMsIG91dGxheW91dCk7CisgICAgZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihsYXlvdXRzLCAmY3R4LT5vdXRwdXRzWzBdLT5pbl9jaGFubmVsX2xheW91dHMpOworICAgIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmZl9hbGxfc2FtcGxlcmF0ZXMoKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQU1lcmdlQ29udGV4dCAqYW0gPSBjdHgtPnByaXY7CisgICAgQVZCUHJpbnQgYnA7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgYW0tPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGlmIChjdHgtPmlucHV0c1tpXS0+c2FtcGxlX3JhdGUgIT0gY3R4LT5pbnB1dHNbMF0tPnNhbXBsZV9yYXRlKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIklucHV0cyBtdXN0IGhhdmUgdGhlIHNhbWUgc2FtcGxlIHJhdGUgIgorICAgICAgICAgICAgICAgICAgICIlZCBmb3IgaW4lZCB2cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmlucHV0c1tpXS0+c2FtcGxlX3JhdGUsIGksIGN0eC0+aW5wdXRzWzBdLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorICAgIGFtLT5icHMgPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShjdHgtPm91dHB1dHNbMF0tPmZvcm1hdCk7CisgICAgb3V0bGluay0+c2FtcGxlX3JhdGUgPSBjdHgtPmlucHV0c1swXS0+c2FtcGxlX3JhdGU7CisgICAgb3V0bGluay0+dGltZV9iYXNlICAgPSBjdHgtPmlucHV0c1swXS0+dGltZV9iYXNlOworCisgICAgYXZfYnByaW50X2luaXQoJmJwLCAwLCAxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYW0tPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGF2X2JwcmludGYoJmJwLCAiJXNpbiVkOiIsIGkgPyAiICsgIiA6ICIiLCBpKTsKKyAgICAgICAgYXZfYnByaW50X2NoYW5uZWxfbGF5b3V0KCZicCwgLTEsIGN0eC0+aW5wdXRzW2ldLT5jaGFubmVsX2xheW91dCk7CisgICAgfQorICAgIGF2X2JwcmludGYoJmJwLCAiIC0+IG91dDoiKTsKKyAgICBhdl9icHJpbnRfY2hhbm5lbF9sYXlvdXQoJmJwLCAtMSwgY3R4LT5vdXRwdXRzWzBdLT5jaGFubmVsX2xheW91dCk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIlc1xuIiwgYnAuc3RyKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEFNZXJnZUNvbnRleHQgKmFtID0gY3R4LT5wcml2OworICAgIGludCBpLCByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYW0tPm5iX2lucHV0czsgaSsrKQorICAgICAgICBpZiAoIWFtLT5pbltpXS5uYl9zYW1wbGVzKQorICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzW2ldKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29weSBzYW1wbGVzIGZyb20gc2V2ZXJhbCBpbnB1dCBzdHJlYW1zIHRvIG9uZSBvdXRwdXQgc3RyZWFtLgorICogQHBhcmFtIG5iX2lucHV0cyBudW1iZXIgb2YgaW5wdXRzCisgKiBAcGFyYW0gaW4gICAgICAgIGlucHV0czsgdXNlZCBvbmx5IGZvciB0aGUgbmJfY2ggZmllbGQ7CisgKiBAcGFyYW0gcm91dGUgICAgIHJvdXRpbmcgdmFsdWVzOworICogICAgICAgICAgICAgICAgICBpbnB1dCBjaGFubmVsIGkgZ29lcyB0byBvdXRwdXQgY2hhbm5lbCByb3V0ZVtpXTsKKyAqICAgICAgICAgICAgICAgICAgaSA8ICBpblswXS5uYl9jaCBhcmUgdGhlIGNoYW5uZWxzIGZyb20gdGhlIGZpcnN0IG91dHB1dDsKKyAqICAgICAgICAgICAgICAgICAgaSA+PSBpblswXS5uYl9jaCBhcmUgdGhlIGNoYW5uZWxzIGZyb20gdGhlIHNlY29uZCBvdXRwdXQKKyAqIEBwYXJhbSBpbnMgICAgICAgcG9pbnRlciB0byB0aGUgc2FtcGxlcyBvZiBlYWNoIGlucHV0cywgaW4gcGFja2VkIGZvcm1hdDsKKyAqICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsZWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGNvcGllZCBzYW1wbGVzCisgKiBAcGFyYW0gb3V0cyAgICAgIHBvaW50ZXIgdG8gdGhlIHNhbXBsZXMgb2YgdGhlIG91dHB1dCwgaW4gcGFja2V0IGZvcm1hdDsKKyAqICAgICAgICAgICAgICAgICAgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciBiaWcgZW5vdWdoOworICogICAgICAgICAgICAgICAgICB3aWxsIGJlIGxlZnQgYXQgdGhlIGVuZCBvZiB0aGUgY29waWVkIHNhbXBsZXMKKyAqIEBwYXJhbSBucyAgICAgICAgbnVtYmVyIG9mIHNhbXBsZXMgdG8gY29weQorICogQHBhcmFtIGJwcyAgICAgICBieXRlcyBwZXIgc2FtcGxlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3NhbXBsZXMoaW50IG5iX2lucHV0cywgc3RydWN0IGFtZXJnZV9pbnB1dCBpbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJvdXRlLCB1aW50OF90ICppbnNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKm91dHMsIGludCBucywgaW50IGJwcykKK3sKKyAgICBpbnQgKnJvdXRlX2N1cjsKKyAgICBpbnQgaSwgYywgbmJfY2ggPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0czsgaSsrKQorICAgICAgICBuYl9jaCArPSBpbltpXS5uYl9jaDsKKyAgICB3aGlsZSAobnMtLSkgeworICAgICAgICByb3V0ZV9jdXIgPSByb3V0ZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0czsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgaW5baV0ubmJfY2g7IGMrKykgeworICAgICAgICAgICAgICAgIG1lbWNweSgoKm91dHMpICsgYnBzICogKihyb3V0ZV9jdXIrKyksIGluc1tpXSwgYnBzKTsKKyAgICAgICAgICAgICAgICBpbnNbaV0gKz0gYnBzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpvdXRzICs9IG5iX2NoICogYnBzOworICAgIH0KK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluc2FtcGxlcykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFNZXJnZUNvbnRleHQgKmFtID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqY29uc3Qgb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBpbnQgaW5wdXRfbnVtYmVyOworICAgIGludCBuYl9zYW1wbGVzLCBucywgaTsKKyAgICBBVkZyYW1lICpvdXRidWYsICppbmJ1ZltTV1JfQ0hfTUFYXTsKKyAgICB1aW50OF90ICppbnNbU1dSX0NIX01BWF0sICpvdXRzOworCisgICAgZm9yIChpbnB1dF9udW1iZXIgPSAwOyBpbnB1dF9udW1iZXIgPCBhbS0+bmJfaW5wdXRzOyBpbnB1dF9udW1iZXIrKykKKyAgICAgICAgaWYgKGlubGluayA9PSBjdHgtPmlucHV0c1tpbnB1dF9udW1iZXJdKQorICAgICAgICAgICAgYnJlYWs7CisgICAgYXZfYXNzZXJ0MShpbnB1dF9udW1iZXIgPCBhbS0+bmJfaW5wdXRzKTsKKyAgICBpZiAoZmZfYnVmcXVldWVfaXNfZnVsbCgmYW0tPmluW2lucHV0X251bWJlcl0ucXVldWUpKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluc2FtcGxlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGZmX2J1ZnF1ZXVlX2FkZChjdHgsICZhbS0+aW5baW5wdXRfbnVtYmVyXS5xdWV1ZSwgYXZfZnJhbWVfY2xvbmUoaW5zYW1wbGVzKSk7CisgICAgYW0tPmluW2lucHV0X251bWJlcl0ubmJfc2FtcGxlcyArPSBpbnNhbXBsZXMtPm5iX3NhbXBsZXM7CisgICAgYXZfZnJhbWVfZnJlZSgmaW5zYW1wbGVzKTsKKyAgICBuYl9zYW1wbGVzID0gYW0tPmluWzBdLm5iX3NhbXBsZXM7CisgICAgZm9yIChpID0gMTsgaSA8IGFtLT5uYl9pbnB1dHM7IGkrKykKKyAgICAgICAgbmJfc2FtcGxlcyA9IEZGTUlOKG5iX3NhbXBsZXMsIGFtLT5pbltpXS5uYl9zYW1wbGVzKTsKKyAgICBpZiAoIW5iX3NhbXBsZXMpCisgICAgICAgIHJldHVybiAwOworCisgICAgb3V0YnVmID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihjdHgtPm91dHB1dHNbMF0sIG5iX3NhbXBsZXMpOworICAgIGlmICghb3V0YnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG91dHMgPSBvdXRidWYtPmRhdGFbMF07CisgICAgZm9yIChpID0gMDsgaSA8IGFtLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBpbmJ1ZltpXSA9IGZmX2J1ZnF1ZXVlX3BlZWsoJmFtLT5pbltpXS5xdWV1ZSwgMCk7CisgICAgICAgIGluc1tpXSA9IGluYnVmW2ldLT5kYXRhWzBdICsKKyAgICAgICAgICAgICAgICAgYW0tPmluW2ldLnBvcyAqIGFtLT5pbltpXS5uYl9jaCAqIGFtLT5icHM7CisgICAgfQorICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0YnVmLCBpbmJ1ZlswXSk7CisgICAgb3V0YnVmLT5wdHMgPSBpbmJ1ZlswXS0+cHRzID09IEFWX05PUFRTX1ZBTFVFID8gQVZfTk9QVFNfVkFMVUUgOgorICAgICAgICAgICAgICAgICAgaW5idWZbMF0tPnB0cyArCisgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3EoYW0tPmluWzBdLnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9tYWtlX3EoMSwgY3R4LT5pbnB1dHNbMF0tPnNhbXBsZV9yYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm91dHB1dHNbMF0tPnRpbWVfYmFzZSk7CisKKyAgICBvdXRidWYtPm5iX3NhbXBsZXMgICAgID0gbmJfc2FtcGxlczsKKyAgICBvdXRidWYtPmNoYW5uZWxfbGF5b3V0ID0gb3V0bGluay0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgYXZfZnJhbWVfc2V0X2NoYW5uZWxzKG91dGJ1Ziwgb3V0bGluay0+Y2hhbm5lbHMpOworCisgICAgd2hpbGUgKG5iX3NhbXBsZXMpIHsKKyAgICAgICAgbnMgPSBuYl9zYW1wbGVzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYW0tPm5iX2lucHV0czsgaSsrKQorICAgICAgICAgICAgbnMgPSBGRk1JTihucywgaW5idWZbaV0tPm5iX3NhbXBsZXMgLSBhbS0+aW5baV0ucG9zKTsKKyAgICAgICAgLyogVW5yb2xsIHRoZSBtb3N0IGNvbW1vbiBzYW1wbGUgZm9ybWF0czogc3BlZWQgK34zNTAlIGZvciB0aGUgbG9vcCwKKyAgICAgICAgICAgK34xMyUgb3ZlcmFsbCAoaW5jbHVkaW5nIHR3byBjb21tb24gZGVjb2RlcnMpICovCisgICAgICAgIHN3aXRjaCAoYW0tPmJwcykgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGNvcHlfc2FtcGxlcyhhbS0+bmJfaW5wdXRzLCBhbS0+aW4sIGFtLT5yb3V0ZSwgaW5zLCAmb3V0cywgbnMsIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGNvcHlfc2FtcGxlcyhhbS0+bmJfaW5wdXRzLCBhbS0+aW4sIGFtLT5yb3V0ZSwgaW5zLCAmb3V0cywgbnMsIDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGNvcHlfc2FtcGxlcyhhbS0+bmJfaW5wdXRzLCBhbS0+aW4sIGFtLT5yb3V0ZSwgaW5zLCAmb3V0cywgbnMsIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjb3B5X3NhbXBsZXMoYW0tPm5iX2lucHV0cywgYW0tPmluLCBhbS0+cm91dGUsIGlucywgJm91dHMsIG5zLCBhbS0+YnBzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG5iX3NhbXBsZXMgLT0gbnM7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhbS0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgICAgIGFtLT5pbltpXS5uYl9zYW1wbGVzIC09IG5zOworICAgICAgICAgICAgYW0tPmluW2ldLnBvcyArPSBuczsKKyAgICAgICAgICAgIGlmIChhbS0+aW5baV0ucG9zID09IGluYnVmW2ldLT5uYl9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgYW0tPmluW2ldLnBvcyA9IDA7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5idWZbaV0pOworICAgICAgICAgICAgICAgIGZmX2J1ZnF1ZXVlX2dldCgmYW0tPmluW2ldLnF1ZXVlKTsKKyAgICAgICAgICAgICAgICBpbmJ1ZltpXSA9IGZmX2J1ZnF1ZXVlX3BlZWsoJmFtLT5pbltpXS5xdWV1ZSwgMCk7CisgICAgICAgICAgICAgICAgaW5zW2ldID0gaW5idWZbaV0gPyBpbmJ1ZltpXS0+ZGF0YVswXSA6IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG91dGJ1Zik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFNZXJnZUNvbnRleHQgKmFtID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgYW0tPmluID0gYXZfY2FsbG9jKGFtLT5uYl9pbnB1dHMsIHNpemVvZigqYW0tPmluKSk7CisgICAgaWYgKCFhbS0+aW4pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZm9yIChpID0gMDsgaSA8IGFtLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBjaGFyICpuYW1lID0gYXZfYXNwcmludGYoImluJWQiLCBpKTsKKyAgICAgICAgQVZGaWx0ZXJQYWQgcGFkID0geworICAgICAgICAgICAgLm5hbWUgICAgICAgICAgICAgPSBuYW1lLAorICAgICAgICAgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgICAgICAuZmlsdGVyX2ZyYW1lICAgICA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKCFuYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZmZfaW5zZXJ0X2lucGFkKGN0eCwgaSwgJnBhZCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYW1lcmdlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYW1lcmdlID0geworICAgIC5uYW1lICAgICAgICAgID0gImFtZXJnZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWVyZ2UgdHdvIG9yIG1vcmUgYXVkaW8gc3RyZWFtcyBpbnRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIHNpbmdsZSBtdWx0aS1jaGFubmVsIHN0cmVhbS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihBTWVyZ2VDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gTlVMTCwKKyAgICAub3V0cHV0cyAgICAgICA9IGFtZXJnZV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmFtZXJnZV9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19JTlBVVFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FtaXguYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hbWl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwOTY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hbWl4LmMKQEAgLTAsMCArMSw1NzAgQEAKKy8qCisgKiBBdWRpbyBNaXggRmlsdGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQXVkaW8gTWl4IEZpbHRlcgorICoKKyAqIE1peGVzIGF1ZGlvIGZyb20gbXVsdGlwbGUgc291cmNlcyBpbnRvIGEgc2luZ2xlIG91dHB1dC4gVGhlIGNoYW5uZWwgbGF5b3V0LAorICogc2FtcGxlIHJhdGUsIGFuZCBzYW1wbGUgZm9ybWF0IHdpbGwgYmUgdGhlIHNhbWUgZm9yIGFsbCBpbnB1dHMgYW5kIHRoZQorICogb3V0cHV0LgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdWRpb19maWZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIElOUFVUX09GRiAgICAgIDAgICAgLyoqPCBpbnB1dCBoYXMgcmVhY2hlZCBFT0YgKi8KKyNkZWZpbmUgSU5QVVRfT04gICAgICAgMSAgICAvKio8IGlucHV0IGlzIGFjdGl2ZSAqLworI2RlZmluZSBJTlBVVF9JTkFDVElWRSAyICAgIC8qKjwgaW5wdXQgaXMgb24sIGJ1dCBpcyBjdXJyZW50bHkgaW5hY3RpdmUgKi8KKworI2RlZmluZSBEVVJBVElPTl9MT05HRVNUICAwCisjZGVmaW5lIERVUkFUSU9OX1NIT1JURVNUIDEKKyNkZWZpbmUgRFVSQVRJT05fRklSU1QgICAgMgorCisKK3R5cGVkZWYgc3RydWN0IEZyYW1lSW5mbyB7CisgICAgaW50IG5iX3NhbXBsZXM7CisgICAgaW50NjRfdCBwdHM7CisgICAgc3RydWN0IEZyYW1lSW5mbyAqbmV4dDsKK30gRnJhbWVJbmZvOworCisvKioKKyAqIExpbmtlZCBsaXN0IHVzZWQgdG8gc3RvcmUgdGltZXN0YW1wcyBhbmQgZnJhbWUgc2l6ZXMgb2YgYWxsIGZyYW1lcyBpbiB0aGUKKyAqIEZJRk8gZm9yIHRoZSBmaXJzdCBpbnB1dC4KKyAqCisgKiBUaGlzIGlzIG5lZWRlZCB0byBrZWVwIHRpbWVzdGFtcHMgc3luY2hyb25pemVkIGZvciB0aGUgY2FzZSB3aGVyZSBtdWx0aXBsZQorICogaW5wdXQgZnJhbWVzIGFyZSBwdXNoZWQgdG8gdGhlIGZpbHRlciBmb3IgcHJvY2Vzc2luZyBiZWZvcmUgYSBmcmFtZSBpcworICogcmVxdWVzdGVkIGJ5IHRoZSBvdXRwdXQgbGluay4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRnJhbWVMaXN0IHsKKyAgICBpbnQgbmJfZnJhbWVzOworICAgIGludCBuYl9zYW1wbGVzOworICAgIEZyYW1lSW5mbyAqbGlzdDsKKyAgICBGcmFtZUluZm8gKmVuZDsKK30gRnJhbWVMaXN0OworCitzdGF0aWMgdm9pZCBmcmFtZV9saXN0X2NsZWFyKEZyYW1lTGlzdCAqZnJhbWVfbGlzdCkKK3sKKyAgICBpZiAoZnJhbWVfbGlzdCkgeworICAgICAgICB3aGlsZSAoZnJhbWVfbGlzdC0+bGlzdCkgeworICAgICAgICAgICAgRnJhbWVJbmZvICppbmZvID0gZnJhbWVfbGlzdC0+bGlzdDsKKyAgICAgICAgICAgIGZyYW1lX2xpc3QtPmxpc3QgPSBpbmZvLT5uZXh0OworICAgICAgICAgICAgYXZfZnJlZShpbmZvKTsKKyAgICAgICAgfQorICAgICAgICBmcmFtZV9saXN0LT5uYl9mcmFtZXMgID0gMDsKKyAgICAgICAgZnJhbWVfbGlzdC0+bmJfc2FtcGxlcyA9IDA7CisgICAgICAgIGZyYW1lX2xpc3QtPmVuZCAgICAgICAgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIGludCBmcmFtZV9saXN0X25leHRfZnJhbWVfc2l6ZShGcmFtZUxpc3QgKmZyYW1lX2xpc3QpCit7CisgICAgaWYgKCFmcmFtZV9saXN0LT5saXN0KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZnJhbWVfbGlzdC0+bGlzdC0+bmJfc2FtcGxlczsKK30KKworc3RhdGljIGludDY0X3QgZnJhbWVfbGlzdF9uZXh0X3B0cyhGcmFtZUxpc3QgKmZyYW1lX2xpc3QpCit7CisgICAgaWYgKCFmcmFtZV9saXN0LT5saXN0KQorICAgICAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7CisgICAgcmV0dXJuIGZyYW1lX2xpc3QtPmxpc3QtPnB0czsKK30KKworc3RhdGljIHZvaWQgZnJhbWVfbGlzdF9yZW1vdmVfc2FtcGxlcyhGcmFtZUxpc3QgKmZyYW1lX2xpc3QsIGludCBuYl9zYW1wbGVzKQoreworICAgIGlmIChuYl9zYW1wbGVzID49IGZyYW1lX2xpc3QtPm5iX3NhbXBsZXMpIHsKKyAgICAgICAgZnJhbWVfbGlzdF9jbGVhcihmcmFtZV9saXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgc2FtcGxlcyA9IG5iX3NhbXBsZXM7CisgICAgICAgIHdoaWxlIChzYW1wbGVzID4gMCkgeworICAgICAgICAgICAgRnJhbWVJbmZvICppbmZvID0gZnJhbWVfbGlzdC0+bGlzdDsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoaW5mbyk7CisgICAgICAgICAgICBpZiAoaW5mby0+bmJfc2FtcGxlcyA8PSBzYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlcyAtPSBpbmZvLT5uYl9zYW1wbGVzOworICAgICAgICAgICAgICAgIGZyYW1lX2xpc3QtPmxpc3QgPSBpbmZvLT5uZXh0OworICAgICAgICAgICAgICAgIGlmICghZnJhbWVfbGlzdC0+bGlzdCkKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVfbGlzdC0+ZW5kID0gTlVMTDsKKyAgICAgICAgICAgICAgICBmcmFtZV9saXN0LT5uYl9mcmFtZXMtLTsKKyAgICAgICAgICAgICAgICBmcmFtZV9saXN0LT5uYl9zYW1wbGVzIC09IGluZm8tPm5iX3NhbXBsZXM7CisgICAgICAgICAgICAgICAgYXZfZnJlZShpbmZvKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5mby0+bmJfc2FtcGxlcyAgICAgICAtPSBzYW1wbGVzOworICAgICAgICAgICAgICAgIGluZm8tPnB0cyAgICAgICAgICAgICAgKz0gc2FtcGxlczsKKyAgICAgICAgICAgICAgICBmcmFtZV9saXN0LT5uYl9zYW1wbGVzIC09IHNhbXBsZXM7CisgICAgICAgICAgICAgICAgc2FtcGxlcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZnJhbWVfbGlzdF9hZGRfZnJhbWUoRnJhbWVMaXN0ICpmcmFtZV9saXN0LCBpbnQgbmJfc2FtcGxlcywgaW50NjRfdCBwdHMpCit7CisgICAgRnJhbWVJbmZvICppbmZvID0gYXZfbWFsbG9jKHNpemVvZigqaW5mbykpOworICAgIGlmICghaW5mbykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpbmZvLT5uYl9zYW1wbGVzID0gbmJfc2FtcGxlczsKKyAgICBpbmZvLT5wdHMgICAgICAgID0gcHRzOworICAgIGluZm8tPm5leHQgICAgICAgPSBOVUxMOworCisgICAgaWYgKCFmcmFtZV9saXN0LT5saXN0KSB7CisgICAgICAgIGZyYW1lX2xpc3QtPmxpc3QgPSBpbmZvOworICAgICAgICBmcmFtZV9saXN0LT5lbmQgID0gaW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9hc3NlcnQwKGZyYW1lX2xpc3QtPmVuZCk7CisgICAgICAgIGZyYW1lX2xpc3QtPmVuZC0+bmV4dCA9IGluZm87CisgICAgICAgIGZyYW1lX2xpc3QtPmVuZCAgICAgICA9IGluZm87CisgICAgfQorICAgIGZyYW1lX2xpc3QtPm5iX2ZyYW1lcysrOworICAgIGZyYW1lX2xpc3QtPm5iX3NhbXBsZXMgKz0gbmJfc2FtcGxlczsKKworICAgIHJldHVybiAwOworfQorCisKK3R5cGVkZWYgc3RydWN0IE1peENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOyAgICAgICAvKio8IGNsYXNzIGZvciBBVk9wdGlvbnMgKi8KKyAgICBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcDsKKworICAgIGludCBuYl9pbnB1dHM7ICAgICAgICAgICAgICAvKio8IG51bWJlciBvZiBpbnB1dHMgKi8KKyAgICBpbnQgYWN0aXZlX2lucHV0czsgICAgICAgICAgLyoqPCBudW1iZXIgb2YgaW5wdXQgY3VycmVudGx5IGFjdGl2ZSAqLworICAgIGludCBkdXJhdGlvbl9tb2RlOyAgICAgICAgICAvKio8IG1vZGUgZm9yIGRldGVybWluaW5nIGR1cmF0aW9uICovCisgICAgZmxvYXQgZHJvcG91dF90cmFuc2l0aW9uOyAgIC8qKjwgdHJhbnNpdGlvbiB0aW1lIHdoZW4gYW4gaW5wdXQgZHJvcHMgb3V0ICovCisKKyAgICBpbnQgbmJfY2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBpbnQgc2FtcGxlX3JhdGU7ICAgICAgICAgICAgLyoqPCBzYW1wbGUgcmF0ZSAqLworICAgIGludCBwbGFuYXI7CisgICAgQVZBdWRpb0ZpZm8gKipmaWZvczsgICAgICAgIC8qKjwgYXVkaW8gZmlmbyBmb3IgZWFjaCBpbnB1dCAqLworICAgIHVpbnQ4X3QgKmlucHV0X3N0YXRlOyAgICAgICAvKio8IGN1cnJlbnQgc3RhdGUgb2YgZWFjaCBpbnB1dCAqLworICAgIGZsb2F0ICppbnB1dF9zY2FsZTsgICAgICAgICAvKio8IG1peGluZyBzY2FsZSBmYWN0b3IgZm9yIGVhY2ggaW5wdXQgKi8KKyAgICBmbG9hdCBzY2FsZV9ub3JtOyAgICAgICAgICAgLyoqPCBub3JtYWxpemF0aW9uIGZhY3RvciBmb3IgYWxsIGlucHV0cyAqLworICAgIGludDY0X3QgbmV4dF9wdHM7ICAgICAgICAgICAvKio8IGNhbGN1bGF0ZWQgcHRzIGZvciBuZXh0IG91dHB1dCBmcmFtZSAqLworICAgIEZyYW1lTGlzdCAqZnJhbWVfbGlzdDsgICAgICAvKio8IGxpc3Qgb2YgZnJhbWUgaW5mbyBmb3IgdGhlIGZpcnN0IGlucHV0ICovCit9IE1peENvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE1peENvbnRleHQsIHgpCisjZGVmaW5lIEEgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0KKyNkZWZpbmUgRiBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhbWl4X29wdGlvbnNbXSA9IHsKKyAgICB7ICJpbnB1dHMiLCAiTnVtYmVyIG9mIGlucHV0cy4iLAorICAgICAgICAgICAgT0ZGU0VUKG5iX2lucHV0cyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMiB9LCAxLCAzMiwgQXxGIH0sCisgICAgeyAiZHVyYXRpb24iLCAiSG93IHRvIGRldGVybWluZSB0aGUgZW5kLW9mLXN0cmVhbS4iLAorICAgICAgICAgICAgT0ZGU0VUKGR1cmF0aW9uX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IERVUkFUSU9OX0xPTkdFU1QgfSwgMCwgIDIsIEF8RiwgImR1cmF0aW9uIiB9LAorICAgICAgICB7ICJsb25nZXN0IiwgICJEdXJhdGlvbiBvZiBsb25nZXN0IGlucHV0LiIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRFVSQVRJT05fTE9OR0VTVCAgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxGLCAiZHVyYXRpb24iIH0sCisgICAgICAgIHsgInNob3J0ZXN0IiwgIkR1cmF0aW9uIG9mIHNob3J0ZXN0IGlucHV0LiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBEVVJBVElPTl9TSE9SVEVTVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEYsICJkdXJhdGlvbiIgfSwKKyAgICAgICAgeyAiZmlyc3QiLCAgICAiRHVyYXRpb24gb2YgZmlyc3QgaW5wdXQuIiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IERVUkFUSU9OX0ZJUlNUICAgIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8RiwgImR1cmF0aW9uIiB9LAorICAgIHsgImRyb3BvdXRfdHJhbnNpdGlvbiIsICJUcmFuc2l0aW9uIHRpbWUsIGluIHNlY29uZHMsIGZvciB2b2x1bWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW5vcm1hbGl6YXRpb24gd2hlbiBhbiBpbnB1dCBzdHJlYW0gZW5kcy4iLAorICAgICAgICAgICAgT0ZGU0VUKGRyb3BvdXRfdHJhbnNpdGlvbiksIEFWX09QVF9UWVBFX0ZMT0FULCB7IC5kYmwgPSAyLjAgfSwgMCwgSU5UX01BWCwgQXxGIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhhbWl4KTsKKworLyoqCisgKiBVcGRhdGUgdGhlIHNjYWxpbmcgZmFjdG9ycyB0byBhcHBseSB0byBlYWNoIGlucHV0IGR1cmluZyBtaXhpbmcuCisgKgorICogVGhpcyBiYWxhbmNlcyB0aGUgZnVsbCB2b2x1bWUgcmFuZ2UgYmV0d2VlbiBhY3RpdmUgaW5wdXRzIGFuZCBoYW5kbGVzCisgKiB2b2x1bWUgdHJhbnNpdGlvbnMgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgb24gYW4gaW5wdXQgYnV0IG1peGluZyBjb250aW51ZXMKKyAqIHdpdGggdGhlIHJlbWFpbmluZyBpbnB1dHMuCisgKi8KK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9zY2FsZXMoTWl4Q29udGV4dCAqcywgaW50IG5iX3NhbXBsZXMpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAocy0+c2NhbGVfbm9ybSA+IHMtPmFjdGl2ZV9pbnB1dHMpIHsKKyAgICAgICAgcy0+c2NhbGVfbm9ybSAtPSBuYl9zYW1wbGVzIC8gKHMtPmRyb3BvdXRfdHJhbnNpdGlvbiAqIHMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcy0+c2NhbGVfbm9ybSA9IEZGTUFYKHMtPnNjYWxlX25vcm0sIHMtPmFjdGl2ZV9pbnB1dHMpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBpZiAocy0+aW5wdXRfc3RhdGVbaV0gPT0gSU5QVVRfT04pCisgICAgICAgICAgICBzLT5pbnB1dF9zY2FsZVtpXSA9IDEuMGYgLyBzLT5zY2FsZV9ub3JtOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5pbnB1dF9zY2FsZVtpXSA9IDAuMGY7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIE1peENvbnRleHQgKnMgICAgICA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKyAgICBjaGFyIGJ1Zls2NF07CisKKyAgICBzLT5wbGFuYXIgICAgICAgICAgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihvdXRsaW5rLT5mb3JtYXQpOworICAgIHMtPnNhbXBsZV9yYXRlICAgICA9IG91dGxpbmstPnNhbXBsZV9yYXRlOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKXsgMSwgb3V0bGluay0+c2FtcGxlX3JhdGUgfTsKKyAgICBzLT5uZXh0X3B0cyAgICAgICAgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIHMtPmZyYW1lX2xpc3QgPSBhdl9tYWxsb2N6KHNpemVvZigqcy0+ZnJhbWVfbGlzdCkpOworICAgIGlmICghcy0+ZnJhbWVfbGlzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPmZpZm9zID0gYXZfbWFsbG9jeihzLT5uYl9pbnB1dHMgKiBzaXplb2YoKnMtPmZpZm9zKSk7CisgICAgaWYgKCFzLT5maWZvcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPm5iX2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKG91dGxpbmstPmNoYW5uZWxfbGF5b3V0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgcy0+Zmlmb3NbaV0gPSBhdl9hdWRpb19maWZvX2FsbG9jKG91dGxpbmstPmZvcm1hdCwgcy0+bmJfY2hhbm5lbHMsIDEwMjQpOworICAgICAgICBpZiAoIXMtPmZpZm9zW2ldKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBzLT5pbnB1dF9zdGF0ZSA9IGF2X21hbGxvYyhzLT5uYl9pbnB1dHMpOworICAgIGlmICghcy0+aW5wdXRfc3RhdGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWVtc2V0KHMtPmlucHV0X3N0YXRlLCBJTlBVVF9PTiwgcy0+bmJfaW5wdXRzKTsKKyAgICBzLT5hY3RpdmVfaW5wdXRzID0gcy0+bmJfaW5wdXRzOworCisgICAgcy0+aW5wdXRfc2NhbGUgPSBhdl9tYWxsb2N6X2FycmF5KHMtPm5iX2lucHV0cywgc2l6ZW9mKCpzLT5pbnB1dF9zY2FsZSkpOworICAgIGlmICghcy0+aW5wdXRfc2NhbGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcy0+c2NhbGVfbm9ybSA9IHMtPmFjdGl2ZV9pbnB1dHM7CisgICAgY2FsY3VsYXRlX3NjYWxlcyhzLCAwKTsKKworICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgLTEsIG91dGxpbmstPmNoYW5uZWxfbGF5b3V0KTsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAiaW5wdXRzOiVkIGZtdDolcyBzcmF0ZTolZCBjbDolc1xuIiwgcy0+bmJfaW5wdXRzLAorICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKG91dGxpbmstPmZvcm1hdCksIG91dGxpbmstPnNhbXBsZV9yYXRlLCBidWYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZCBzYW1wbGVzIGZyb20gdGhlIGlucHV0IEZJRk9zLCBtaXgsIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IGxpbmsuCisgKi8KK3N0YXRpYyBpbnQgb3V0cHV0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaywgaW50IG5iX3NhbXBsZXMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgTWl4Q29udGV4dCAgICAgICpzID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKm91dF9idWYsICppbl9idWY7CisgICAgaW50IGk7CisKKyAgICBjYWxjdWxhdGVfc2NhbGVzKHMsIG5iX3NhbXBsZXMpOworCisgICAgb3V0X2J1ZiA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbmJfc2FtcGxlcyk7CisgICAgaWYgKCFvdXRfYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaW5fYnVmID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBuYl9zYW1wbGVzKTsKKyAgICBpZiAoIWluX2J1ZikgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXRfYnVmKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPmlucHV0X3N0YXRlW2ldID09IElOUFVUX09OKSB7CisgICAgICAgICAgICBpbnQgcGxhbmVzLCBwbGFuZV9zaXplLCBwOworCisgICAgICAgICAgICBhdl9hdWRpb19maWZvX3JlYWQocy0+Zmlmb3NbaV0sICh2b2lkICoqKWluX2J1Zi0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzKTsKKworICAgICAgICAgICAgcGxhbmVzICAgICA9IHMtPnBsYW5hciA/IHMtPm5iX2NoYW5uZWxzIDogMTsKKyAgICAgICAgICAgIHBsYW5lX3NpemUgPSBuYl9zYW1wbGVzICogKHMtPnBsYW5hciA/IDEgOiBzLT5uYl9jaGFubmVscyk7CisgICAgICAgICAgICBwbGFuZV9zaXplID0gRkZBTElHTihwbGFuZV9zaXplLCAxNik7CisKKyAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBwbGFuZXM7IHArKykgeworICAgICAgICAgICAgICAgIHMtPmZkc3AtPnZlY3Rvcl9mbWFjX3NjYWxhcigoZmxvYXQgKilvdXRfYnVmLT5leHRlbmRlZF9kYXRhW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBpbl9idWYtPmV4dGVuZGVkX2RhdGFbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfc2NhbGVbaV0sIHBsYW5lX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyYW1lX2ZyZWUoJmluX2J1Zik7CisKKyAgICBvdXRfYnVmLT5wdHMgPSBzLT5uZXh0X3B0czsKKyAgICBpZiAocy0+bmV4dF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHMtPm5leHRfcHRzICs9IG5iX3NhbXBsZXM7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dF9idWYpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHNtYWxsZXN0IG51bWJlciBvZiBzYW1wbGVzIGF2YWlsYWJsZSBpbiB0aGUgaW5wdXQgRklGT3Mgb3RoZXIKKyAqIHRoYW4gdGhhdCBvZiB0aGUgZmlyc3QgaW5wdXQuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2F2YWlsYWJsZV9zYW1wbGVzKE1peENvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisgICAgaW50IGF2YWlsYWJsZV9zYW1wbGVzID0gSU5UX01BWDsKKworICAgIGF2X2Fzc2VydDAocy0+bmJfaW5wdXRzID4gMSk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgaW50IG5iX3NhbXBsZXM7CisgICAgICAgIGlmIChzLT5pbnB1dF9zdGF0ZVtpXSA9PSBJTlBVVF9PRkYpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbmJfc2FtcGxlcyA9IGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvc1tpXSk7CisgICAgICAgIGF2YWlsYWJsZV9zYW1wbGVzID0gRkZNSU4oYXZhaWxhYmxlX3NhbXBsZXMsIG5iX3NhbXBsZXMpOworICAgIH0KKyAgICBpZiAoYXZhaWxhYmxlX3NhbXBsZXMgPT0gSU5UX01BWCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGF2YWlsYWJsZV9zYW1wbGVzOworfQorCisvKioKKyAqIFJlcXVlc3RzIGEgZnJhbWUsIGlmIG5lZWRlZCwgZnJvbSBlYWNoIGlucHV0IGxpbmsgb3RoZXIgdGhhbiB0aGUgZmlyc3QuCisgKi8KK3N0YXRpYyBpbnQgcmVxdWVzdF9zYW1wbGVzKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgbWluX3NhbXBsZXMpCit7CisgICAgTWl4Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgcmV0OworCisgICAgYXZfYXNzZXJ0MChzLT5uYl9pbnB1dHMgPiAxKTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBzLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICByZXQgPSAwOworICAgICAgICBpZiAocy0+aW5wdXRfc3RhdGVbaV0gPT0gSU5QVVRfT0ZGKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHdoaWxlICghcmV0ICYmIGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvc1tpXSkgPCBtaW5fc2FtcGxlcykKKyAgICAgICAgICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbaV0pOworICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GKSB7CisgICAgICAgICAgICBpZiAoYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm9zW2ldKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcy0+aW5wdXRfc3RhdGVbaV0gPSBJTlBVVF9PRkY7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBhY3RpdmUgaW5wdXRzIGFuZCBkZXRlcm1pbmVzIEVPRiBiYXNlZCBvbiB0aGUKKyAqIGR1cmF0aW9uIG9wdGlvbi4KKyAqCisgKiBAcmV0dXJuIDAgaWYgbWl4aW5nIHNob3VsZCBjb250aW51ZSwgb3IgQVZFUlJPUl9FT0YgaWYgbWl4aW5nIHNob3VsZCBzdG9wLgorICovCitzdGF0aWMgaW50IGNhbGNfYWN0aXZlX2lucHV0cyhNaXhDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIGludCBhY3RpdmVfaW5wdXRzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspCisgICAgICAgIGFjdGl2ZV9pbnB1dHMgKz0gISEocy0+aW5wdXRfc3RhdGVbaV0gIT0gSU5QVVRfT0ZGKTsKKyAgICBzLT5hY3RpdmVfaW5wdXRzID0gYWN0aXZlX2lucHV0czsKKworICAgIGlmICghYWN0aXZlX2lucHV0cyB8fAorICAgICAgICAocy0+ZHVyYXRpb25fbW9kZSA9PSBEVVJBVElPTl9GSVJTVCAmJiBzLT5pbnB1dF9zdGF0ZVswXSA9PSBJTlBVVF9PRkYpIHx8CisgICAgICAgIChzLT5kdXJhdGlvbl9tb2RlID09IERVUkFUSU9OX1NIT1JURVNUICYmIGFjdGl2ZV9pbnB1dHMgIT0gcy0+bmJfaW5wdXRzKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIE1peENvbnRleHQgICAgICAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworICAgIGludCB3YW50ZWRfc2FtcGxlcywgYXZhaWxhYmxlX3NhbXBsZXM7CisKKyAgICByZXQgPSBjYWxjX2FjdGl2ZV9pbnB1dHMocyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+aW5wdXRfc3RhdGVbMF0gPT0gSU5QVVRfT0ZGKSB7CisgICAgICAgIHJldCA9IHJlcXVlc3Rfc2FtcGxlcyhjdHgsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0ID0gY2FsY19hY3RpdmVfaW5wdXRzKHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgYXZhaWxhYmxlX3NhbXBsZXMgPSBnZXRfYXZhaWxhYmxlX3NhbXBsZXMocyk7CisgICAgICAgIGlmICghYXZhaWxhYmxlX3NhbXBsZXMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworCisgICAgICAgIHJldHVybiBvdXRwdXRfZnJhbWUob3V0bGluaywgYXZhaWxhYmxlX3NhbXBsZXMpOworICAgIH0KKworICAgIGlmIChzLT5mcmFtZV9saXN0LT5uYl9mcmFtZXMgPT0gMCkgeworICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgcy0+aW5wdXRfc3RhdGVbMF0gPSBJTlBVVF9PRkY7CisgICAgICAgICAgICBpZiAocy0+bmJfaW5wdXRzID09IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGF2X2Fzc2VydDAocy0+ZnJhbWVfbGlzdC0+bmJfZnJhbWVzID4gMCk7CisKKyAgICB3YW50ZWRfc2FtcGxlcyA9IGZyYW1lX2xpc3RfbmV4dF9mcmFtZV9zaXplKHMtPmZyYW1lX2xpc3QpOworCisgICAgaWYgKHMtPmFjdGl2ZV9pbnB1dHMgPiAxKSB7CisgICAgICAgIHJldCA9IHJlcXVlc3Rfc2FtcGxlcyhjdHgsIHdhbnRlZF9zYW1wbGVzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldCA9IGNhbGNfYWN0aXZlX2lucHV0cyhzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChzLT5hY3RpdmVfaW5wdXRzID4gMSkgeworICAgICAgICBhdmFpbGFibGVfc2FtcGxlcyA9IGdldF9hdmFpbGFibGVfc2FtcGxlcyhzKTsKKyAgICAgICAgaWYgKCFhdmFpbGFibGVfc2FtcGxlcykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIGF2YWlsYWJsZV9zYW1wbGVzID0gRkZNSU4oYXZhaWxhYmxlX3NhbXBsZXMsIHdhbnRlZF9zYW1wbGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmFpbGFibGVfc2FtcGxlcyA9IHdhbnRlZF9zYW1wbGVzOworICAgIH0KKworICAgIHMtPm5leHRfcHRzID0gZnJhbWVfbGlzdF9uZXh0X3B0cyhzLT5mcmFtZV9saXN0KTsKKyAgICBmcmFtZV9saXN0X3JlbW92ZV9zYW1wbGVzKHMtPmZyYW1lX2xpc3QsIGF2YWlsYWJsZV9zYW1wbGVzKTsKKworICAgIHJldHVybiBvdXRwdXRfZnJhbWUob3V0bGluaywgYXZhaWxhYmxlX3NhbXBsZXMpOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqYnVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAgKmN0eCA9IGlubGluay0+ZHN0OworICAgIE1peENvbnRleHQgICAgICAgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIGludCBpLCByZXQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspCisgICAgICAgIGlmIChjdHgtPmlucHV0c1tpXSA9PSBpbmxpbmspCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaSA+PSBjdHgtPm5iX2lucHV0cykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJ1bmtub3duIGlucHV0IGxpbmtcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIGludDY0X3QgcHRzID0gYXZfcmVzY2FsZV9xKGJ1Zi0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+dGltZV9iYXNlKTsKKyAgICAgICAgcmV0ID0gZnJhbWVfbGlzdF9hZGRfZnJhbWUocy0+ZnJhbWVfbGlzdCwgYnVmLT5uYl9zYW1wbGVzLCBwdHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBhdl9hdWRpb19maWZvX3dyaXRlKHMtPmZpZm9zW2ldLCAodm9pZCAqKilidWYtPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYtPm5iX3NhbXBsZXMpOworCitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBNaXhDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGNoYXIgbmFtZVszMl07CisgICAgICAgIEFWRmlsdGVyUGFkIHBhZCA9IHsgMCB9OworCisgICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImlucHV0JWQiLCBpKTsKKyAgICAgICAgcGFkLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBwYWQubmFtZSAgICAgICAgICAgPSBhdl9zdHJkdXAobmFtZSk7CisgICAgICAgIHBhZC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZTsKKworICAgICAgICBmZl9pbnNlcnRfaW5wYWQoY3R4LCBpLCAmcGFkKTsKKyAgICB9CisKKyAgICBzLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYygwKTsKKyAgICBpZiAoIXMtPmZkc3ApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGk7CisgICAgTWl4Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlmIChzLT5maWZvcykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspCisgICAgICAgICAgICBhdl9hdWRpb19maWZvX2ZyZWUocy0+Zmlmb3NbaV0pOworICAgICAgICBhdl9mcmVlcCgmcy0+Zmlmb3MpOworICAgIH0KKyAgICBmcmFtZV9saXN0X2NsZWFyKHMtPmZyYW1lX2xpc3QpOworICAgIGF2X2ZyZWVwKCZzLT5mcmFtZV9saXN0KTsKKyAgICBhdl9mcmVlcCgmcy0+aW5wdXRfc3RhdGUpOworICAgIGF2X2ZyZWVwKCZzLT5pbnB1dF9zY2FsZSk7CisgICAgYXZfZnJlZXAoJnMtPmZkc3ApOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZjdHgtPmlucHV0X3BhZHNbaV0ubmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7CisKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfbGF5b3V0cygpOworCisgICAgaWYgKCFsYXlvdXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZmZfYWRkX2Zvcm1hdCgmZm9ybWF0cywgQVZfU0FNUExFX0ZNVF9GTFQpOworICAgIGZmX2FkZF9mb3JtYXQoJmZvcm1hdHMsIEFWX1NBTVBMRV9GTVRfRkxUUCk7CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBsYXlvdXRzKTsKKyAgICBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZmZfYWxsX3NhbXBsZXJhdGVzKCkpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfYW1peF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYW1peCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYW1peCIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkF1ZGlvIG1peGluZy4iKSwKKyAgICAucHJpdl9zaXplICAgICAgPSBzaXplb2YoTWl4Q29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgID0gJmFtaXhfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgICA9IGF2ZmlsdGVyX2FmX2FtaXhfb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfSU5QVVRTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hbnVsbC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FudWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmNDU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hbnVsbC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUy5OLiBIZW1hbnRoIE1lZW5ha3NoaXN1bmRhcmFtIDxzbWVlbmFrc0B1Y3NkLmVkdT4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBudWxsIGF1ZGlvIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2FudWxsX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl9hZl9hbnVsbF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYW51bGwgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYW51bGwiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBhc3MgdGhlIHNvdXJjZSB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dC4iKSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IGZmX3F1ZXJ5X2Zvcm1hdHNfYWxsLAorICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfYWZfYW51bGxfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfYWZfYW51bGxfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYXBhZC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FwYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWZjNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FwYWQuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGF1ZGlvIHBhZCBmaWx0ZXIuCisgKgorICogQmFzZWQgb24gYWZfYXJlc2FtcGxlLmMKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludDY0X3QgbmV4dF9wdHM7CisKKyAgICBpbnQgcGFja2V0X3NpemU7CisgICAgaW50NjRfdCBwYWRfbGVuLCBwYWRfbGVuX2xlZnQ7CisgICAgaW50NjRfdCB3aG9sZV9sZW4sIHdob2xlX2xlbl9sZWZ0OworfSBBUGFkQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQVBhZENvbnRleHQsIHgpCisjZGVmaW5lIEEgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhcGFkX29wdGlvbnNbXSA9IHsKKyAgICB7ICJwYWNrZXRfc2l6ZSIsICJzZXQgc2lsZW5jZSBwYWNrZXQgc2l6ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChwYWNrZXRfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSA0MDk2IH0sIDAsIElOVF9NQVgsIEEgfSwKKyAgICB7ICJwYWRfbGVuIiwgICAgICJzZXQgbnVtYmVyIG9mIHNhbXBsZXMgb2Ygc2lsZW5jZSB0byBhZGQiLCAgICAgICAgICAgICAgICAgIE9GRlNFVChwYWRfbGVuKSwgICAgIEFWX09QVF9UWVBFX0lOVDY0LCB7IC5pNjQgPSAtMSB9LCAtMSwgSU5UNjRfTUFYLCBBIH0sCisgICAgeyAid2hvbGVfbGVuIiwgICAic2V0IG1pbmltdW0gdGFyZ2V0IG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBhdWRpbyBzdHJlYW0iLCBPRkZTRVQod2hvbGVfbGVuKSwgICBBVl9PUFRfVFlQRV9JTlQ2NCwgeyAuaTY0ID0gLTEgfSwgLTEsIElOVDY0X01BWCwgQSB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXBhZCk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFQYWRDb250ZXh0ICphcGFkID0gY3R4LT5wcml2OworCisgICAgYXBhZC0+bmV4dF9wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBpZiAoYXBhZC0+d2hvbGVfbGVuID49IDAgJiYgYXBhZC0+cGFkX2xlbiA+PSAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkJvdGggd2hvbGUgYW5kIHBhZCBsZW5ndGggYXJlIHNldCwgdGhpcyBpcyBub3QgcG9zc2libGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBhcGFkLT5wYWRfbGVuX2xlZnQgICA9IGFwYWQtPnBhZF9sZW47CisgICAgYXBhZC0+d2hvbGVfbGVuX2xlZnQgPSBhcGFkLT53aG9sZV9sZW47CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVBhZENvbnRleHQgKmFwYWQgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoYXBhZC0+d2hvbGVfbGVuID49IDApIHsKKyAgICAgICAgYXBhZC0+d2hvbGVfbGVuX2xlZnQgPSBGRk1BWChhcGFkLT53aG9sZV9sZW5fbGVmdCAtIGZyYW1lLT5uYl9zYW1wbGVzLCAwKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgIm5fb3V0OiVkIHdob2xlX2xlbl9sZWZ0OiUiUFJJZDY0IlxuIiwgZnJhbWUtPm5iX3NhbXBsZXMsIGFwYWQtPndob2xlX2xlbl9sZWZ0KTsKKyAgICB9CisKKyAgICBhcGFkLT5uZXh0X3B0cyA9IGZyYW1lLT5wdHMgKyBhdl9yZXNjYWxlX3EoZnJhbWUtPm5iX3NhbXBsZXMsIChBVlJhdGlvbmFsKXsxLCBpbmxpbmstPnNhbXBsZV9yYXRlfSwgaW5saW5rLT50aW1lX2Jhc2UpOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBmcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVBhZENvbnRleHQgKmFwYWQgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworCisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiAhY3R4LT5pc19kaXNhYmxlZCkgeworICAgICAgICBpbnQgbl9vdXQgPSBhcGFkLT5wYWNrZXRfc2l6ZTsKKyAgICAgICAgQVZGcmFtZSAqb3V0c2FtcGxlc3JlZjsKKworICAgICAgICBpZiAoYXBhZC0+d2hvbGVfbGVuID49IDAgJiYgYXBhZC0+cGFkX2xlbiA8IDApIHsKKyAgICAgICAgICAgIGFwYWQtPnBhZF9sZW4gPSBhcGFkLT5wYWRfbGVuX2xlZnQgPSBhcGFkLT53aG9sZV9sZW5fbGVmdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXBhZC0+cGFkX2xlbiA+PTAgfHwgYXBhZC0+d2hvbGVfbGVuID49IDApIHsKKyAgICAgICAgICAgIG5fb3V0ID0gRkZNSU4obl9vdXQsIGFwYWQtPnBhZF9sZW5fbGVmdCk7CisgICAgICAgICAgICBhcGFkLT5wYWRfbGVuX2xlZnQgLT0gbl9vdXQ7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgInBhZGRpbmcgbl9vdXQ6JWQgcGFkX2xlbl9sZWZ0OiUiUFJJZDY0IlxuIiwgbl9vdXQsIGFwYWQtPnBhZF9sZW5fbGVmdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW5fb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgICAgIG91dHNhbXBsZXNyZWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5fb3V0KTsKKyAgICAgICAgaWYgKCFvdXRzYW1wbGVzcmVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBhdl9hc3NlcnQwKG91dHNhbXBsZXNyZWYtPnNhbXBsZV9yYXRlID09IG91dGxpbmstPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgYXZfYXNzZXJ0MChvdXRzYW1wbGVzcmVmLT5uYl9zYW1wbGVzICA9PSBuX291dCk7CisKKyAgICAgICAgYXZfc2FtcGxlc19zZXRfc2lsZW5jZShvdXRzYW1wbGVzcmVmLT5leHRlbmRlZF9kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2dldF9jaGFubmVscyhvdXRzYW1wbGVzcmVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRzYW1wbGVzcmVmLT5mb3JtYXQpOworCisgICAgICAgIG91dHNhbXBsZXNyZWYtPnB0cyA9IGFwYWQtPm5leHRfcHRzOworICAgICAgICBpZiAoYXBhZC0+bmV4dF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBhcGFkLT5uZXh0X3B0cyArPSBhdl9yZXNjYWxlX3Eobl9vdXQsIChBVlJhdGlvbmFsKXsxLCBvdXRsaW5rLT5zYW1wbGVfcmF0ZX0sIG91dGxpbmstPnRpbWVfYmFzZSk7CisKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXRzYW1wbGVzcmVmKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFwYWRfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhcGFkX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2FwYWQgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYXBhZCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUGFkIGF1ZGlvIHdpdGggc2lsZW5jZS4iKSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQVBhZENvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICAgID0gYXBhZF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhcGFkX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmYXBhZF9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9JTlRFUk5BTCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYXBoYXNlci5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FwaGFzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDhmNjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FwaGFzZXIuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogcGhhc2VyIGF1ZGlvIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZ2VuZXJhdGVfd2F2ZV90YWJsZS5oIgorCit0eXBlZGVmIHN0cnVjdCBBdWRpb1BoYXNlckNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGRvdWJsZSBpbl9nYWluLCBvdXRfZ2FpbjsKKyAgICBkb3VibGUgZGVsYXk7CisgICAgZG91YmxlIGRlY2F5OworICAgIGRvdWJsZSBzcGVlZDsKKworICAgIGVudW0gV2F2ZVR5cGUgdHlwZTsKKworICAgIGludCBkZWxheV9idWZmZXJfbGVuZ3RoOworICAgIGRvdWJsZSAqZGVsYXlfYnVmZmVyOworCisgICAgaW50IG1vZHVsYXRpb25fYnVmZmVyX2xlbmd0aDsKKyAgICBpbnQzMl90ICptb2R1bGF0aW9uX2J1ZmZlcjsKKworICAgIGludCBkZWxheV9wb3MsIG1vZHVsYXRpb25fcG9zOworCisgICAgdm9pZCAoKnBoYXNlcikoc3RydWN0IEF1ZGlvUGhhc2VyQ29udGV4dCAqcCwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90ICogY29uc3QgKnNyYywgdWludDhfdCAqKmRzdCwKKyAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IGNoYW5uZWxzKTsKK30gQXVkaW9QaGFzZXJDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBdWRpb1BoYXNlckNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYXBoYXNlcl9vcHRpb25zW10gPSB7CisgICAgeyAiaW5fZ2FpbiIsICAic2V0IGlucHV0IGdhaW4iLCAgICAgICAgICAgIE9GRlNFVChpbl9nYWluKSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9LjR9LCAgMCwgIDEsICAgRkxBR1MgfSwKKyAgICB7ICJvdXRfZ2FpbiIsICJzZXQgb3V0cHV0IGdhaW4iLCAgICAgICAgICAgT0ZGU0VUKG91dF9nYWluKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0uNzR9LCAwLCAgMWU5LCBGTEFHUyB9LAorICAgIHsgImRlbGF5IiwgICAgInNldCBkZWxheSBpbiBtaWxsaXNlY29uZHMiLCBPRkZTRVQoZGVsYXkpLCAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTMufSwgIDAsICA1LCAgIEZMQUdTIH0sCisgICAgeyAiZGVjYXkiLCAgICAic2V0IGRlY2F5IiwgICAgICAgICAgICAgICAgIE9GRlNFVChkZWNheSksICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9LjR9LCAgMCwgLjk5LCAgRkxBR1MgfSwKKyAgICB7ICJzcGVlZCIsICAgICJzZXQgbW9kdWxhdGlvbiBzcGVlZCIsICAgICAgT0ZGU0VUKHNwZWVkKSwgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0uNX0sIC4xLCAgMiwgICBGTEFHUyB9LAorICAgIHsgInR5cGUiLCAgICAgInNldCBtb2R1bGF0aW9uIHR5cGUiLCAgICAgICBPRkZTRVQodHlwZSksICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PVdBVkVfVFJJfSwgMCwgV0FWRV9OQi0xLCBGTEFHUywgInR5cGUiIH0sCisgICAgeyAidHJpYW5ndWxhciIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PVdBVkVfVFJJfSwgMCwgMCwgRkxBR1MsICJ0eXBlIiB9LAorICAgIHsgInQiLCAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND1XQVZFX1RSSX0sIDAsIDAsIEZMQUdTLCAidHlwZSIgfSwKKyAgICB7ICJzaW51c29pZGFsIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9V0FWRV9TSU59LCAwLCAwLCBGTEFHUywgInR5cGUiIH0sCisgICAgeyAicyIsICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PVdBVkVfU0lOfSwgMCwgMCwgRkxBR1MsICJ0eXBlIiB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXBoYXNlcik7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEF1ZGlvUGhhc2VyQ29udGV4dCAqcCA9IGN0eC0+cHJpdjsKKworICAgIGlmIChwLT5pbl9nYWluID4gKDEgLSBwLT5kZWNheSAqIHAtPmRlY2F5KSkKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJpbl9nYWluIG1heSBjYXVzZSBjbGlwcGluZ1xuIik7CisgICAgaWYgKHAtPmluX2dhaW4gLyAoMSAtIHAtPmRlY2F5KSA+IDEgLyBwLT5vdXRfZ2FpbikKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJvdXRfZ2FpbiBtYXkgY2F1c2UgY2xpcHBpbmdcbiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHM7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geworICAgICAgICBBVl9TQU1QTEVfRk1UX0RCTCwgQVZfU0FNUExFX0ZNVF9EQkxQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMiwgQVZfU0FNUExFX0ZNVF9TMzJQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9OworCisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2xheW91dHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBsYXlvdXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9mbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisKKyAgICBmb3JtYXRzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmb3JtYXRzKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE1PRChhLCBiKSAoKChhKSA+PSAoYikpID8gKGEpIC0gKGIpIDogKGEpKQorCisjZGVmaW5lIFBIQVNFUl9QTEFOQVIobmFtZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHBoYXNlcl8jIyBuYW1lICMjcChBdWRpb1BoYXNlckNvbnRleHQgKnAsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKiBjb25zdCAqc3JjLCB1aW50OF90ICoqZHN0LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCBjaGFubmVscykgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBjLCBkZWxheV9wb3MsIG1vZHVsYXRpb25fcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdl9hc3NlcnQwKGNoYW5uZWxzID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHR5cGUgKnMgPSAodHlwZSAqKXNyY1tjXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdHlwZSAqZCA9ICh0eXBlICopZHN0W2NdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgKmJ1ZmZlciA9IHAtPmRlbGF5X2J1ZmZlciArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYyAqIHAtPmRlbGF5X2J1ZmZlcl9sZW5ndGg7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWxheV9wb3MgICAgICA9IHAtPmRlbGF5X3BvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1vZHVsYXRpb25fcG9zID0gcC0+bW9kdWxhdGlvbl9wb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrLCBzKyssIGQrKykgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkb3VibGUgdiA9ICpzICogcC0+aW5fZ2FpbiArIGJ1ZmZlclsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgTU9EKGRlbGF5X3BvcyArIHAtPm1vZHVsYXRpb25fYnVmZmVyWyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uX3Bvc10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIHAtPmRlbGF5X2J1ZmZlcl9sZW5ndGgpXSAqIHAtPmRlY2F5OyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbW9kdWxhdGlvbl9wb3MgPSBNT0QobW9kdWxhdGlvbl9wb3MgKyAxLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1vZHVsYXRpb25fYnVmZmVyX2xlbmd0aCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRlbGF5X3BvcyA9IE1PRChkZWxheV9wb3MgKyAxLCBwLT5kZWxheV9idWZmZXJfbGVuZ3RoKTsgICAgXAorICAgICAgICAgICAgYnVmZmVyW2RlbGF5X3Bvc10gPSB2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpkID0gdiAqIHAtPm91dF9nYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAtPmRlbGF5X3BvcyAgICAgID0gZGVsYXlfcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcC0+bW9kdWxhdGlvbl9wb3MgPSBtb2R1bGF0aW9uX3BvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBQSEFTRVIobmFtZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgcGhhc2VyXyMjIG5hbWUgKEF1ZGlvUGhhc2VyQ29udGV4dCAqcCwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKiBjb25zdCAqc3JjLCB1aW50OF90ICoqZHN0LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLCBpbnQgY2hhbm5lbHMpICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBjLCBkZWxheV9wb3MsIG1vZHVsYXRpb25fcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgKnMgPSAodHlwZSAqKXNyY1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgKmQgPSAodHlwZSAqKWRzdFswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSAqYnVmZmVyID0gcC0+ZGVsYXlfYnVmZmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlbGF5X3BvcyAgICAgID0gcC0+ZGVsYXlfcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZHVsYXRpb25fcG9zID0gcC0+bW9kdWxhdGlvbl9wb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgcG9zID0gTU9EKGRlbGF5X3BvcyArIHAtPm1vZHVsYXRpb25fYnVmZmVyW21vZHVsYXRpb25fcG9zXSwgXAorICAgICAgICAgICAgICAgICAgIHAtPmRlbGF5X2J1ZmZlcl9sZW5ndGgpICogY2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgbnBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWxheV9wb3MgPSBNT0QoZGVsYXlfcG9zICsgMSwgcC0+ZGVsYXlfYnVmZmVyX2xlbmd0aCk7ICAgICAgICAgXAorICAgICAgICBucG9zID0gZGVsYXlfcG9zICogY2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKywgcysrLCBkKyspIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIHYgPSAqcyAqIHAtPmluX2dhaW4gKyBidWZmZXJbcG9zICsgY10gKiBwLT5kZWNheTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnVmZmVyW25wb3MgKyBjXSA9IHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKmQgPSB2ICogcC0+b3V0X2dhaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtb2R1bGF0aW9uX3BvcyA9IE1PRChtb2R1bGF0aW9uX3BvcyArIDEsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1vZHVsYXRpb25fYnVmZmVyX2xlbmd0aCk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAtPmRlbGF5X3BvcyAgICAgID0gZGVsYXlfcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAtPm1vZHVsYXRpb25fcG9zID0gbW9kdWxhdGlvbl9wb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitQSEFTRVJfUExBTkFSKGRibCwgZG91YmxlKQorUEhBU0VSX1BMQU5BUihmbHQsIGZsb2F0KQorUEhBU0VSX1BMQU5BUihzMTYsIGludDE2X3QpCitQSEFTRVJfUExBTkFSKHMzMiwgaW50MzJfdCkKKworUEhBU0VSKGRibCwgZG91YmxlKQorUEhBU0VSKGZsdCwgZmxvYXQpCitQSEFTRVIoczE2LCBpbnQxNl90KQorUEhBU0VSKHMzMiwgaW50MzJfdCkKKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBdWRpb1BoYXNlckNvbnRleHQgKnAgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBvdXRsaW5rLT5zcmMtPmlucHV0c1swXTsKKworICAgIHAtPmRlbGF5X2J1ZmZlcl9sZW5ndGggPSBwLT5kZWxheSAqIDAuMDAxICogaW5saW5rLT5zYW1wbGVfcmF0ZSArIDAuNTsKKyAgICBwLT5kZWxheV9idWZmZXIgPSBhdl9jYWxsb2MocC0+ZGVsYXlfYnVmZmVyX2xlbmd0aCwgc2l6ZW9mKCpwLT5kZWxheV9idWZmZXIpICogaW5saW5rLT5jaGFubmVscyk7CisgICAgcC0+bW9kdWxhdGlvbl9idWZmZXJfbGVuZ3RoID0gaW5saW5rLT5zYW1wbGVfcmF0ZSAvIHAtPnNwZWVkICsgMC41OworICAgIHAtPm1vZHVsYXRpb25fYnVmZmVyID0gYXZfbWFsbG9jX2FycmF5KHAtPm1vZHVsYXRpb25fYnVmZmVyX2xlbmd0aCwgc2l6ZW9mKCpwLT5tb2R1bGF0aW9uX2J1ZmZlcikpOworCisgICAgaWYgKCFwLT5tb2R1bGF0aW9uX2J1ZmZlciB8fCAhcC0+ZGVsYXlfYnVmZmVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZmZfZ2VuZXJhdGVfd2F2ZV90YWJsZShwLT50eXBlLCBBVl9TQU1QTEVfRk1UX1MzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1vZHVsYXRpb25fYnVmZmVyLCBwLT5tb2R1bGF0aW9uX2J1ZmZlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiwgcC0+ZGVsYXlfYnVmZmVyX2xlbmd0aCwgTV9QSSAvIDIuMCk7CisKKyAgICBwLT5kZWxheV9wb3MgPSBwLT5tb2R1bGF0aW9uX3BvcyA9IDA7CisKKyAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTDogIHAtPnBoYXNlciA9IHBoYXNlcl9kYmw7ICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMUDogcC0+cGhhc2VyID0gcGhhc2VyX2RibHA7IGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFQ6ICBwLT5waGFzZXIgPSBwaGFzZXJfZmx0OyAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVFA6IHAtPnBoYXNlciA9IHBoYXNlcl9mbHRwOyBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2OiAgcC0+cGhhc2VyID0gcGhhc2VyX3MxNjsgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOiBwLT5waGFzZXIgPSBwaGFzZXJfczE2cDsgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMjogIHAtPnBoYXNlciA9IHBoYXNlcl9zMzI7ICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyUDogcC0+cGhhc2VyID0gcGhhc2VyX3MzMnA7IGJyZWFrOworICAgIGRlZmF1bHQ6IGF2X2Fzc2VydDAoMCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbmJ1ZikKK3sKKyAgICBBdWRpb1BoYXNlckNvbnRleHQgKnAgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXRidWY7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW5idWYpKSB7CisgICAgICAgIG91dGJ1ZiA9IGluYnVmOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dGJ1ZiA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBpbmJ1Zi0+bmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghb3V0YnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXRidWYsIGluYnVmKTsKKyAgICB9CisKKyAgICBwLT5waGFzZXIocCwgaW5idWYtPmV4dGVuZGVkX2RhdGEsIG91dGJ1Zi0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgb3V0YnVmLT5uYl9zYW1wbGVzLCBhdl9mcmFtZV9nZXRfY2hhbm5lbHMob3V0YnVmKSk7CisKKyAgICBpZiAoaW5idWYgIT0gb3V0YnVmKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbmJ1Zik7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dGJ1Zik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEF1ZGlvUGhhc2VyQ29udGV4dCAqcCA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyZWVwKCZwLT5kZWxheV9idWZmZXIpOworICAgIGF2X2ZyZWVwKCZwLT5tb2R1bGF0aW9uX2J1ZmZlcik7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhcGhhc2VyX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXBoYXNlcl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hcGhhc2VyID0geworICAgIC5uYW1lICAgICAgICAgID0gImFwaGFzZXIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFkZCBhIHBoYXNpbmcgZWZmZWN0IHRvIHRoZSBhdWRpby4iKSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQXVkaW9QaGFzZXJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLmlucHV0cyAgICAgICAgPSBhcGhhc2VyX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGFwaGFzZXJfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZhcGhhc2VyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hcmVzYW1wbGUuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hcmVzYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2FjMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FyZXNhbXBsZS5jCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFN0ZWZhbm8gU2FiYXRpbmkKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNaW5hIE5hZ3kgWmFraQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiByZXNhbXBsaW5nIGF1ZGlvIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHNhbXBsZV9yYXRlX2FyZzsKKyAgICBkb3VibGUgcmF0aW87CisgICAgc3RydWN0IFN3ckNvbnRleHQgKnN3cjsKKyAgICBpbnQ2NF90IG5leHRfcHRzOworICAgIGludCByZXFfZnVsbGZpbGxlZDsKKyAgICBpbnQgbW9yZV9kYXRhOworfSBBUmVzYW1wbGVDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdF9kaWN0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkRpY3Rpb25hcnkgKipvcHRzKQoreworICAgIEFSZXNhbXBsZUNvbnRleHQgKmFyZXNhbXBsZSA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGFyZXNhbXBsZS0+bmV4dF9wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBhcmVzYW1wbGUtPnN3ciA9IHN3cl9hbGxvYygpOworICAgIGlmICghYXJlc2FtcGxlLT5zd3IpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAob3B0cykgeworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IE5VTEw7CisKKyAgICAgICAgd2hpbGUgKChlID0gYXZfZGljdF9nZXQoKm9wdHMsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0KGFyZXNhbXBsZS0+c3dyLCBlLT5rZXksIGUtPnZhbHVlLCAwKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIGF2X2RpY3RfZnJlZShvcHRzKTsKKyAgICB9CisgICAgaWYgKGFyZXNhbXBsZS0+c2FtcGxlX3JhdGVfYXJnID4gMCkKKyAgICAgICAgYXZfb3B0X3NldF9pbnQoYXJlc2FtcGxlLT5zd3IsICJvc3IiLCBhcmVzYW1wbGUtPnNhbXBsZV9yYXRlX2FyZywgMCk7CitlbmQ6CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVJlc2FtcGxlQ29udGV4dCAqYXJlc2FtcGxlID0gY3R4LT5wcml2OworICAgIHN3cl9mcmVlKCZhcmVzYW1wbGUtPnN3cik7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBUmVzYW1wbGVDb250ZXh0ICphcmVzYW1wbGUgPSBjdHgtPnByaXY7CisgICAgaW50IG91dF9yYXRlICAgICAgICAgICAgICAgICAgID0gYXZfZ2V0X2ludChhcmVzYW1wbGUtPnN3ciwgIm9zciIsIE5VTEwpOworICAgIHVpbnQ2NF90IG91dF9sYXlvdXQgICAgICAgICAgICA9IGF2X2dldF9pbnQoYXJlc2FtcGxlLT5zd3IsICJvY2wiLCBOVUxMKTsKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IG91dF9mb3JtYXQgPSBhdl9nZXRfaW50KGFyZXNhbXBsZS0+c3dyLCAib3NmIiwgTlVMTCk7CisKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayAgPSBjdHgtPmlucHV0c1swXTsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisKKyAgICBBVkZpbHRlckZvcm1hdHMgICAgICAgICppbl9mb3JtYXRzICAgICAgPSBmZl9hbGxfZm9ybWF0cyhBVk1FRElBX1RZUEVfQVVESU8pOworICAgIEFWRmlsdGVyRm9ybWF0cyAgICAgICAgKm91dF9mb3JtYXRzOworICAgIEFWRmlsdGVyRm9ybWF0cyAgICAgICAgKmluX3NhbXBsZXJhdGVzICA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgIEFWRmlsdGVyRm9ybWF0cyAgICAgICAgKm91dF9zYW1wbGVyYXRlczsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICppbl9sYXlvdXRzICAgICAgPSBmZl9hbGxfY2hhbm5lbF9jb3VudHMoKTsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpvdXRfbGF5b3V0czsKKworICAgIGZmX2Zvcm1hdHNfcmVmICAoaW5fZm9ybWF0cywgICAgICAmaW5saW5rLT5vdXRfZm9ybWF0cyk7CisgICAgZmZfZm9ybWF0c19yZWYgIChpbl9zYW1wbGVyYXRlcywgICZpbmxpbmstPm91dF9zYW1wbGVyYXRlcyk7CisgICAgZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihpbl9sYXlvdXRzLCAgICAgICZpbmxpbmstPm91dF9jaGFubmVsX2xheW91dHMpOworCisgICAgaWYob3V0X3JhdGUgPiAwKSB7CisgICAgICAgIGludCByYXRlbGlzdFtdID0geyBvdXRfcmF0ZSwgLTEgfTsKKyAgICAgICAgb3V0X3NhbXBsZXJhdGVzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChyYXRlbGlzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0X3NhbXBsZXJhdGVzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgfQorICAgIGlmICghb3V0X3NhbXBsZXJhdGVzKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSBvdXRwdXQgc2FtcGxlcmF0ZXMuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBmZl9mb3JtYXRzX3JlZihvdXRfc2FtcGxlcmF0ZXMsICZvdXRsaW5rLT5pbl9zYW1wbGVyYXRlcyk7CisKKyAgICBpZihvdXRfZm9ybWF0ICE9IEFWX1NBTVBMRV9GTVRfTk9ORSkgeworICAgICAgICBpbnQgZm9ybWF0bGlzdFtdID0geyBvdXRfZm9ybWF0LCAtMSB9OworICAgICAgICBvdXRfZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QoZm9ybWF0bGlzdCk7CisgICAgfSBlbHNlCisgICAgICAgIG91dF9mb3JtYXRzID0gZmZfYWxsX2Zvcm1hdHMoQVZNRURJQV9UWVBFX0FVRElPKTsKKyAgICBmZl9mb3JtYXRzX3JlZihvdXRfZm9ybWF0cywgJm91dGxpbmstPmluX2Zvcm1hdHMpOworCisgICAgaWYob3V0X2xheW91dCkgeworICAgICAgICBpbnQ2NF90IGxheW91dF9saXN0W10gPSB7IG91dF9sYXlvdXQsIC0xIH07CisgICAgICAgIG91dF9sYXlvdXRzID0gYXZmaWx0ZXJfbWFrZV9mb3JtYXQ2NF9saXN0KGxheW91dF9saXN0KTsKKyAgICB9IGVsc2UKKyAgICAgICAgb3V0X2xheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9jb3VudHMoKTsKKyAgICBmZl9jaGFubmVsX2xheW91dHNfcmVmKG91dF9sYXlvdXRzLCAmb3V0bGluay0+aW5fY2hhbm5lbF9sYXlvdXRzKTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgaW50IHJldDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFSZXNhbXBsZUNvbnRleHQgKmFyZXNhbXBsZSA9IGN0eC0+cHJpdjsKKyAgICBpbnQgb3V0X3JhdGU7CisgICAgdWludDY0X3Qgb3V0X2xheW91dDsKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IG91dF9mb3JtYXQ7CisgICAgY2hhciBpbmNobF9idWZbMTI4XSwgb3V0Y2hsX2J1ZlsxMjhdOworCisgICAgYXJlc2FtcGxlLT5zd3IgPSBzd3JfYWxsb2Nfc2V0X29wdHMoYXJlc2FtcGxlLT5zd3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+Y2hhbm5lbF9sYXlvdXQsIG91dGxpbmstPmZvcm1hdCwgb3V0bGluay0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5jaGFubmVsX2xheW91dCwgaW5saW5rLT5mb3JtYXQsIGlubGluay0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgY3R4KTsKKyAgICBpZiAoIWFyZXNhbXBsZS0+c3dyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmICghaW5saW5rLT5jaGFubmVsX2xheW91dCkKKyAgICAgICAgYXZfb3B0X3NldF9pbnQoYXJlc2FtcGxlLT5zd3IsICJpY2giLCBpbmxpbmstPmNoYW5uZWxzLCAwKTsKKyAgICBpZiAoIW91dGxpbmstPmNoYW5uZWxfbGF5b3V0KQorICAgICAgICBhdl9vcHRfc2V0X2ludChhcmVzYW1wbGUtPnN3ciwgIm9jaCIsIG91dGxpbmstPmNoYW5uZWxzLCAwKTsKKworICAgIHJldCA9IHN3cl9pbml0KGFyZXNhbXBsZS0+c3dyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG91dF9yYXRlICAgPSBhdl9nZXRfaW50KGFyZXNhbXBsZS0+c3dyLCAib3NyIiwgTlVMTCk7CisgICAgb3V0X2xheW91dCA9IGF2X2dldF9pbnQoYXJlc2FtcGxlLT5zd3IsICJvY2wiLCBOVUxMKTsKKyAgICBvdXRfZm9ybWF0ID0gYXZfZ2V0X2ludChhcmVzYW1wbGUtPnN3ciwgIm9zZiIsIE5VTEwpOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKSB7MSwgb3V0X3JhdGV9OworCisgICAgYXZfYXNzZXJ0MChvdXRsaW5rLT5zYW1wbGVfcmF0ZSA9PSBvdXRfcmF0ZSk7CisgICAgYXZfYXNzZXJ0MChvdXRsaW5rLT5jaGFubmVsX2xheW91dCA9PSBvdXRfbGF5b3V0IHx8ICFvdXRsaW5rLT5jaGFubmVsX2xheW91dCk7CisgICAgYXZfYXNzZXJ0MChvdXRsaW5rLT5mb3JtYXQgPT0gb3V0X2Zvcm1hdCk7CisKKyAgICBhcmVzYW1wbGUtPnJhdGlvID0gKGRvdWJsZSlvdXRsaW5rLT5zYW1wbGVfcmF0ZSAvIGlubGluay0+c2FtcGxlX3JhdGU7CisKKyAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGluY2hsX2J1ZiwgIHNpemVvZihpbmNobF9idWYpLCAgaW5saW5rIC0+Y2hhbm5lbHMsIGlubGluayAtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKG91dGNobF9idWYsIHNpemVvZihvdXRjaGxfYnVmKSwgb3V0bGluay0+Y2hhbm5lbHMsIG91dGxpbmstPmNoYW5uZWxfbGF5b3V0KTsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiY2g6JWQgY2hsOiVzIGZtdDolcyByOiVkSHogLT4gY2g6JWQgY2hsOiVzIGZtdDolcyByOiVkSHpcbiIsCisgICAgICAgICAgIGlubGluayAtPmNoYW5uZWxzLCBpbmNobF9idWYsICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGlubGluay0+Zm9ybWF0KSwgIGlubGluay0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgIG91dGxpbmstPmNoYW5uZWxzLCBvdXRjaGxfYnVmLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKG91dGxpbmstPmZvcm1hdCksIG91dGxpbmstPnNhbXBsZV9yYXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluc2FtcGxlc3JlZikKK3sKKyAgICBBUmVzYW1wbGVDb250ZXh0ICphcmVzYW1wbGUgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBjb25zdCBpbnQgbl9pbiAgPSBpbnNhbXBsZXNyZWYtPm5iX3NhbXBsZXM7CisgICAgaW50NjRfdCBkZWxheTsKKyAgICBpbnQgbl9vdXQgICAgICAgPSBuX2luICogYXJlc2FtcGxlLT5yYXRpbyArIDMyOworICAgIEFWRmlsdGVyTGluayAqY29uc3Qgb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dHNhbXBsZXNyZWY7CisgICAgaW50IHJldDsKKworICAgIGRlbGF5ID0gc3dyX2dldF9kZWxheShhcmVzYW1wbGUtPnN3ciwgb3V0bGluay0+c2FtcGxlX3JhdGUpOworICAgIGlmIChkZWxheSA+IDApCisgICAgICAgIG5fb3V0ICs9IEZGTUlOKGRlbGF5LCBGRk1BWCg0MDk2LCBuX291dCkpOworCisgICAgb3V0c2FtcGxlc3JlZiA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbl9vdXQpOworCisgICAgaWYoIW91dHNhbXBsZXNyZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHNhbXBsZXNyZWYsIGluc2FtcGxlc3JlZik7CisgICAgb3V0c2FtcGxlc3JlZi0+Zm9ybWF0ICAgICAgICAgICAgICAgID0gb3V0bGluay0+Zm9ybWF0OworICAgIGF2X2ZyYW1lX3NldF9jaGFubmVscyhvdXRzYW1wbGVzcmVmLCBvdXRsaW5rLT5jaGFubmVscyk7CisgICAgb3V0c2FtcGxlc3JlZi0+Y2hhbm5lbF9sYXlvdXQgICAgICAgID0gb3V0bGluay0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgb3V0c2FtcGxlc3JlZi0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gb3V0bGluay0+c2FtcGxlX3JhdGU7CisKKyAgICBpZihpbnNhbXBsZXNyZWYtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBpbnQ2NF90IGlucHRzID0gYXZfcmVzY2FsZShpbnNhbXBsZXNyZWYtPnB0cywgaW5saW5rLT50aW1lX2Jhc2UubnVtICogKGludDY0X3Qpb3V0bGluay0+c2FtcGxlX3JhdGUgKiBpbmxpbmstPnNhbXBsZV9yYXRlLCBpbmxpbmstPnRpbWVfYmFzZS5kZW4pOworICAgICAgICBpbnQ2NF90IG91dHB0cz0gc3dyX25leHRfcHRzKGFyZXNhbXBsZS0+c3dyLCBpbnB0cyk7CisgICAgICAgIGFyZXNhbXBsZS0+bmV4dF9wdHMgPQorICAgICAgICBvdXRzYW1wbGVzcmVmLT5wdHMgID0gUk9VTkRFRF9ESVYob3V0cHRzLCBpbmxpbmstPnNhbXBsZV9yYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRzYW1wbGVzcmVmLT5wdHMgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgfQorICAgIG5fb3V0ID0gc3dyX2NvbnZlcnQoYXJlc2FtcGxlLT5zd3IsIG91dHNhbXBsZXNyZWYtPmV4dGVuZGVkX2RhdGEsIG5fb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilpbnNhbXBsZXNyZWYtPmV4dGVuZGVkX2RhdGEsIG5faW4pOworICAgIGlmIChuX291dCA8PSAwKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm91dHNhbXBsZXNyZWYpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnNhbXBsZXNyZWYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhcmVzYW1wbGUtPm1vcmVfZGF0YSA9IG91dHNhbXBsZXNyZWYtPm5iX3NhbXBsZXMgPT0gbl9vdXQ7IC8vIEluZGljYXRlIHRoYXQgdGhlcmUgaXMgcHJvYmFibHkgbW9yZSBkYXRhIGluIG91ciBidWZmZXJzCisKKyAgICBvdXRzYW1wbGVzcmVmLT5uYl9zYW1wbGVzICA9IG5fb3V0OworCisgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dHNhbXBsZXNyZWYpOworICAgIGFyZXNhbXBsZS0+cmVxX2Z1bGxmaWxsZWQ9IDE7CisgICAgYXZfZnJhbWVfZnJlZSgmaW5zYW1wbGVzcmVmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZsdXNoX2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaywgaW50IGZpbmFsLCBBVkZyYW1lICoqb3V0c2FtcGxlc3JlZl9yZXQpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVJlc2FtcGxlQ29udGV4dCAqYXJlc2FtcGxlID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqY29uc3QgaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0c2FtcGxlc3JlZjsKKyAgICBpbnQgbl9vdXQgPSA0MDk2OworICAgIGludDY0X3QgcHRzOworCisgICAgb3V0c2FtcGxlc3JlZiA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbl9vdXQpOworICAgICpvdXRzYW1wbGVzcmVmX3JldCA9IG91dHNhbXBsZXNyZWY7CisgICAgaWYgKCFvdXRzYW1wbGVzcmVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcHRzID0gc3dyX25leHRfcHRzKGFyZXNhbXBsZS0+c3dyLCBJTlQ2NF9NSU4pOworICAgIHB0cyA9IFJPVU5ERURfRElWKHB0cywgaW5saW5rLT5zYW1wbGVfcmF0ZSk7CisKKyAgICBuX291dCA9IHN3cl9jb252ZXJ0KGFyZXNhbXBsZS0+c3dyLCBvdXRzYW1wbGVzcmVmLT5leHRlbmRlZF9kYXRhLCBuX291dCwgZmluYWwgPyBOVUxMIDogKHZvaWQqKW91dHNhbXBsZXNyZWYtPmV4dGVuZGVkX2RhdGEsIDApOworICAgIGlmIChuX291dCA8PSAwKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm91dHNhbXBsZXNyZWYpOworICAgICAgICByZXR1cm4gKG5fb3V0ID09IDApID8gQVZFUlJPUl9FT0YgOiBuX291dDsKKyAgICB9CisKKyAgICBvdXRzYW1wbGVzcmVmLT5zYW1wbGVfcmF0ZSA9IG91dGxpbmstPnNhbXBsZV9yYXRlOworICAgIG91dHNhbXBsZXNyZWYtPm5iX3NhbXBsZXMgID0gbl9vdXQ7CisKKyAgICBvdXRzYW1wbGVzcmVmLT5wdHMgPSBwdHM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBBUmVzYW1wbGVDb250ZXh0ICphcmVzYW1wbGUgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIC8vIEZpcnN0IHRyeSB0byBnZXQgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXJzCisgICAgaWYgKGFyZXNhbXBsZS0+bW9yZV9kYXRhKSB7CisgICAgICAgIEFWRnJhbWUgKm91dHNhbXBsZXNyZWY7CisKKyAgICAgICAgaWYgKGZsdXNoX2ZyYW1lKG91dGxpbmssIDAsICZvdXRzYW1wbGVzcmVmKSA+PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dHNhbXBsZXNyZWYpOworICAgICAgICB9CisgICAgfQorICAgIGFyZXNhbXBsZS0+bW9yZV9kYXRhID0gMDsKKworICAgIC8vIFNlY29uZCByZXF1ZXN0IG1vcmUgZGF0YSBmcm9tIHRoZSBpbnB1dAorICAgIGFyZXNhbXBsZS0+cmVxX2Z1bGxmaWxsZWQgPSAwOworICAgIGRveworICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKyAgICB9d2hpbGUoIWFyZXNhbXBsZS0+cmVxX2Z1bGxmaWxsZWQgJiYgcmV0Pj0wKTsKKworICAgIC8vIFRoaXJkIGlmIHdlIGhpdCB0aGUgZW5kIGZsdXNoCisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICBBVkZyYW1lICpvdXRzYW1wbGVzcmVmOworCisgICAgICAgIGlmICgocmV0ID0gZmx1c2hfZnJhbWUob3V0bGluaywgMSwgJm91dHNhbXBsZXNyZWYpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0c2FtcGxlc3JlZik7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzICpyZXNhbXBsZV9jaGlsZF9jbGFzc19uZXh0KGNvbnN0IEFWQ2xhc3MgKnByZXYpCit7CisgICAgcmV0dXJuIHByZXYgPyBOVUxMIDogc3dyX2dldF9jbGFzcygpOworfQorCitzdGF0aWMgdm9pZCAqcmVzYW1wbGVfY2hpbGRfbmV4dCh2b2lkICpvYmosIHZvaWQgKnByZXYpCit7CisgICAgQVJlc2FtcGxlQ29udGV4dCAqcyA9IG9iajsKKyAgICByZXR1cm4gcHJldiA/IE5VTEwgOiBzLT5zd3I7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFSZXNhbXBsZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsic2FtcGxlX3JhdGUiLCBOVUxMLCBPRkZTRVQoc2FtcGxlX3JhdGVfYXJnKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgIDAsICAgICAgICBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHtOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYXJlc2FtcGxlX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICAgID0gImFyZXNhbXBsZSIsCisgICAgLml0ZW1fbmFtZSAgICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNoaWxkX2NsYXNzX25leHQgPSByZXNhbXBsZV9jaGlsZF9jbGFzc19uZXh0LAorICAgIC5jaGlsZF9uZXh0ICAgICAgID0gcmVzYW1wbGVfY2hpbGRfbmV4dCwKK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhcmVzYW1wbGVfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhcmVzYW1wbGVfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hcmVzYW1wbGUgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYXJlc2FtcGxlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZXNhbXBsZSBhdWRpbyBkYXRhLiIpLAorICAgIC5pbml0X2RpY3QgICAgID0gaW5pdF9kaWN0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihBUmVzYW1wbGVDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZhcmVzYW1wbGVfY2xhc3MsCisgICAgLmlucHV0cyAgICAgICAgPSBhcmVzYW1wbGVfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXJlc2FtcGxlX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FzZXRuc2FtcGxlcy5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FzZXRuc2FtcGxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MzA2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYXNldG5zYW1wbGVzLmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQW5kcmV5IFV0a2luCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBGaWx0ZXIgdGhhdCBjaGFuZ2VzIG51bWJlciBvZiBzYW1wbGVzIG9uIHNpbmdsZSBvdXRwdXQgb3BlcmF0aW9uCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdWRpb19maWZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBuYl9vdXRfc2FtcGxlczsgIC8vLzwgaG93IG1hbnkgc2FtcGxlcyB0byBvdXRwdXQKKyAgICBBVkF1ZGlvRmlmbyAqZmlmbzsgICAvLy88IHNhbXBsZXMgYXJlIHF1ZXVlZCBoZXJlCisgICAgaW50NjRfdCBuZXh0X291dF9wdHM7CisgICAgaW50IHBhZDsKK30gQVNOU0NvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFTTlNDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFzZXRuc2FtcGxlc19vcHRpb25zW10gPSB7CisgICAgeyAibmJfb3V0X3NhbXBsZXMiLCAic2V0IHRoZSBudW1iZXIgb2YgcGVyLWZyYW1lIG91dHB1dCBzYW1wbGVzIiwgT0ZGU0VUKG5iX291dF9zYW1wbGVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xMDI0fSwgMSwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJuIiwgICAgICAgICAgICAgICJzZXQgdGhlIG51bWJlciBvZiBwZXItZnJhbWUgb3V0cHV0IHNhbXBsZXMiLCBPRkZTRVQobmJfb3V0X3NhbXBsZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTEwMjR9LCAxLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInBhZCIsICJwYWQgbGFzdCBmcmFtZSB3aXRoIHplcm9zIiwgT0ZGU0VUKHBhZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAicCIsICAgInBhZCBsYXN0IGZyYW1lIHdpdGggemVyb3MiLCBPRkZTRVQocGFkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGFzZXRuc2FtcGxlcyk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFTTlNDb250ZXh0ICphc25zID0gY3R4LT5wcml2OworCisgICAgYXNucy0+bmV4dF9vdXRfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJuYl9vdXRfc2FtcGxlczolZCBwYWQ6JWRcbiIsIGFzbnMtPm5iX291dF9zYW1wbGVzLCBhc25zLT5wYWQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFTTlNDb250ZXh0ICphc25zID0gY3R4LT5wcml2OworICAgIGF2X2F1ZGlvX2ZpZm9fZnJlZShhc25zLT5maWZvKTsKK30KKworc3RhdGljIGludCBjb25maWdfcHJvcHNfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBU05TQ29udGV4dCAqYXNucyA9IG91dGxpbmstPnNyYy0+cHJpdjsKKworICAgIGFzbnMtPmZpZm8gPSBhdl9hdWRpb19maWZvX2FsbG9jKG91dGxpbmstPmZvcm1hdCwgb3V0bGluay0+Y2hhbm5lbHMsIGFzbnMtPm5iX291dF9zYW1wbGVzKTsKKyAgICBpZiAoIWFzbnMtPmZpZm8pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgb3V0bGluay0+ZmxhZ3MgfD0gRkZfTElOS19GTEFHX1JFUVVFU1RfTE9PUDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1c2hfc2FtcGxlcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVNOU0NvbnRleHQgKmFzbnMgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0c2FtcGxlcyA9IE5VTEw7CisgICAgaW50IHJldCwgbmJfb3V0X3NhbXBsZXMsIG5iX3BhZF9zYW1wbGVzOworCisgICAgaWYgKGFzbnMtPnBhZCkgeworICAgICAgICBuYl9vdXRfc2FtcGxlcyA9IGF2X2F1ZGlvX2ZpZm9fc2l6ZShhc25zLT5maWZvKSA/IGFzbnMtPm5iX291dF9zYW1wbGVzIDogMDsKKyAgICAgICAgbmJfcGFkX3NhbXBsZXMgPSBuYl9vdXRfc2FtcGxlcyAtIEZGTUlOKG5iX291dF9zYW1wbGVzLCBhdl9hdWRpb19maWZvX3NpemUoYXNucy0+ZmlmbykpOworICAgIH0gZWxzZSB7CisgICAgICAgIG5iX291dF9zYW1wbGVzID0gRkZNSU4oYXNucy0+bmJfb3V0X3NhbXBsZXMsIGF2X2F1ZGlvX2ZpZm9fc2l6ZShhc25zLT5maWZvKSk7CisgICAgICAgIG5iX3BhZF9zYW1wbGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoIW5iX291dF9zYW1wbGVzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG91dHNhbXBsZXMgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5iX291dF9zYW1wbGVzKTsKKyAgICBpZiAoIW91dHNhbXBsZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9hdWRpb19maWZvX3JlYWQoYXNucy0+ZmlmbywKKyAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopb3V0c2FtcGxlcy0+ZXh0ZW5kZWRfZGF0YSwgbmJfb3V0X3NhbXBsZXMpOworCisgICAgaWYgKG5iX3BhZF9zYW1wbGVzKQorICAgICAgICBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKG91dHNhbXBsZXMtPmV4dGVuZGVkX2RhdGEsIG5iX291dF9zYW1wbGVzIC0gbmJfcGFkX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfcGFkX3NhbXBsZXMsIG91dGxpbmstPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPmZvcm1hdCk7CisgICAgb3V0c2FtcGxlcy0+bmJfc2FtcGxlcyAgICAgPSBuYl9vdXRfc2FtcGxlczsKKyAgICBvdXRzYW1wbGVzLT5jaGFubmVsX2xheW91dCA9IG91dGxpbmstPmNoYW5uZWxfbGF5b3V0OworICAgIG91dHNhbXBsZXMtPnNhbXBsZV9yYXRlICAgID0gb3V0bGluay0+c2FtcGxlX3JhdGU7CisgICAgb3V0c2FtcGxlcy0+cHRzID0gYXNucy0+bmV4dF9vdXRfcHRzOworCisgICAgaWYgKGFzbnMtPm5leHRfb3V0X3B0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgYXNucy0+bmV4dF9vdXRfcHRzICs9IGF2X3Jlc2NhbGVfcShuYl9vdXRfc2FtcGxlcywgKEFWUmF0aW9uYWwpezEsIG91dGxpbmstPnNhbXBsZV9yYXRlfSwgb3V0bGluay0+dGltZV9iYXNlKTsKKworICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXRzYW1wbGVzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gbmJfb3V0X3NhbXBsZXM7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnNhbXBsZXMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBU05TQ29udGV4dCAqYXNucyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgaW50IHJldDsKKyAgICBpbnQgbmJfc2FtcGxlcyA9IGluc2FtcGxlcy0+bmJfc2FtcGxlczsKKworICAgIGlmIChhdl9hdWRpb19maWZvX3NwYWNlKGFzbnMtPmZpZm8pIDwgbmJfc2FtcGxlcykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJObyBzcGFjZSBmb3IgJWQgc2FtcGxlcywgc3RyZXRjaGluZyBhdWRpbyBmaWZvXG4iLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgcmV0ID0gYXZfYXVkaW9fZmlmb19yZWFsbG9jKGFzbnMtPmZpZm8sIGF2X2F1ZGlvX2ZpZm9fc2l6ZShhc25zLT5maWZvKSArIG5iX3NhbXBsZXMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJTdHJldGNoaW5nIGF1ZGlvIGZpZm8gZmFpbGVkLCBkaXNjYXJkZWQgJWQgc2FtcGxlc1xuIiwgbmJfc2FtcGxlcyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfYXVkaW9fZmlmb193cml0ZShhc25zLT5maWZvLCAodm9pZCAqKilpbnNhbXBsZXMtPmV4dGVuZGVkX2RhdGEsIG5iX3NhbXBsZXMpOworICAgIGlmIChhc25zLT5uZXh0X291dF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGFzbnMtPm5leHRfb3V0X3B0cyA9IGluc2FtcGxlcy0+cHRzOworICAgIGF2X2ZyYW1lX2ZyZWUoJmluc2FtcGxlcyk7CisKKyAgICB3aGlsZSAoYXZfYXVkaW9fZmlmb19zaXplKGFzbnMtPmZpZm8pID49IGFzbnMtPm5iX291dF9zYW1wbGVzKQorICAgICAgICBwdXNoX3NhbXBsZXMob3V0bGluayk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBvdXRsaW5rLT5zcmMtPmlucHV0c1swXTsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShpbmxpbmspOworICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgcmV0ID0gcHVzaF9zYW1wbGVzKG91dGxpbmspOworICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IHJldCA+IDAgPyAwIDogQVZFUlJPUl9FT0Y7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFzZXRuc2FtcGxlc19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFzZXRuc2FtcGxlc19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfcHJvcHNfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2FzZXRuc2FtcGxlcyA9IHsKKyAgICAubmFtZSAgICAgICAgPSAiYXNldG5zYW1wbGVzIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgZWFjaCBvdXRwdXQgYXVkaW8gZnJhbWVzLiIpLAorICAgIC5wcml2X3NpemUgICA9IHNpemVvZihBU05TQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgID0gJmFzZXRuc2FtcGxlc19jbGFzcywKKyAgICAuaW5pdCAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICA9IHVuaW5pdCwKKyAgICAuaW5wdXRzICAgICAgPSBhc2V0bnNhbXBsZXNfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IGFzZXRuc2FtcGxlc19vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hc2V0cmF0ZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FzZXRyYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQwNjkxNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hc2V0cmF0ZS5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGludCByZXNjYWxlX3B0czsKK30gQVNldFJhdGVDb250ZXh0OworCisjZGVmaW5lIENPTlRFWFQgQVNldFJhdGVDb250ZXh0CisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCisjZGVmaW5lIE9QVF9HRU5FUklDKG5hbWUsIGZpZWxkLCBkZWYsIG1pbiwgbWF4LCBkZXNjciwgdHlwZSwgZGVmZmllbGQsIC4uLikgXAorICAgIHsgbmFtZSwgZGVzY3IsIG9mZnNldG9mKENPTlRFWFQsIGZpZWxkKSwgQVZfT1BUX1RZUEVfICMjIHR5cGUsICAgICAgICAgIFwKKyAgICAgIHsgLmRlZmZpZWxkID0gZGVmIH0sIG1pbiwgbWF4LCBGTEFHUywgX19WQV9BUkdTX18gfQorCisjZGVmaW5lIE9QVF9JTlQobmFtZSwgZmllbGQsIGRlZiwgbWluLCBtYXgsIGRlc2NyLCAuLi4pIFwKKyAgICBPUFRfR0VORVJJQyhuYW1lLCBmaWVsZCwgZGVmLCBtaW4sIG1heCwgZGVzY3IsIElOVCwgaTY0LCBfX1ZBX0FSR1NfXykKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFzZXRyYXRlX29wdGlvbnNbXSA9IHsKKyAgICBPUFRfSU5UKCJzYW1wbGVfcmF0ZSIsIHNhbXBsZV9yYXRlLCA0NDEwMCwgMSwgSU5UX01BWCwgInNldCB0aGUgc2FtcGxlIHJhdGUiKSwKKyAgICBPUFRfSU5UKCJyIiwgICAgICAgICAgIHNhbXBsZV9yYXRlLCA0NDEwMCwgMSwgSU5UX01BWCwgInNldCB0aGUgc2FtcGxlIHJhdGUiKSwKKyAgICB7TlVMTH0sCit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXNldHJhdGUpOworCitzdGF0aWMgYXZfY29sZCBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBU2V0UmF0ZUNvbnRleHQgKnNyID0gY3R4LT5wcml2OworICAgIGludCBzYW1wbGVfcmF0ZXNbXSA9IHsgc3ItPnNhbXBsZV9yYXRlLCAtMSB9OworCisgICAgZmZfZm9ybWF0c19yZWYoZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfcmF0ZXMpLAorICAgICAgICAgICAgICAgICAgICZjdHgtPm91dHB1dHNbMF0tPmluX3NhbXBsZXJhdGVzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVNldFJhdGVDb250ZXh0ICpzciA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFWUmF0aW9uYWwgaW50YiA9IGN0eC0+aW5wdXRzWzBdLT50aW1lX2Jhc2U7CisgICAgaW50IGlucmF0ZSA9IGlubGluay0+c2FtcGxlX3JhdGU7CisKKyAgICBpZiAoaW50Yi5udW0gPT0gMSAmJiBpbnRiLmRlbiA9PSBpbnJhdGUpIHsKKyAgICAgICAgb3V0bGluay0+dGltZV9iYXNlLm51bSA9IDE7CisgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZS5kZW4gPSBvdXRsaW5rLT5zYW1wbGVfcmF0ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSBpbnRiOworICAgICAgICBzci0+cmVzY2FsZV9wdHMgPSAxOworICAgICAgICBpZiAoYXZfcTJkKGludGIpID4gMS4wIC8gRkZNQVgoaW5yYXRlLCBvdXRsaW5rLT5zYW1wbGVfcmF0ZSkpCisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIlRpbWUgYmFzZSBpcyBpbmFjY3VyYXRlXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFTZXRSYXRlQ29udGV4dCAqc3IgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworCisgICAgZnJhbWUtPnNhbXBsZV9yYXRlID0gb3V0bGluay0+c2FtcGxlX3JhdGU7CisgICAgaWYgKHNyLT5yZXNjYWxlX3B0cykKKyAgICAgICAgZnJhbWUtPnB0cyA9IGF2X3Jlc2NhbGUoZnJhbWUtPnB0cywgaW5saW5rLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT5zYW1wbGVfcmF0ZSk7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhc2V0cmF0ZV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFzZXRyYXRlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYXNldHJhdGUgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYXNldHJhdGUiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNoYW5nZSB0aGUgc2FtcGxlIHJhdGUgd2l0aG91dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0ZXJpbmcgdGhlIGRhdGEuIiksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEFTZXRSYXRlQ29udGV4dCksCisgICAgLmlucHV0cyAgICAgICAgPSBhc2V0cmF0ZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhc2V0cmF0ZV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmFzZXRyYXRlX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hc2hvd2luZm8uYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hc2hvd2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTk1MDI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FzaG93aW5mby5jCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogZmlsdGVyIGZvciBzaG93aW5nIHRleHR1YWwgYXVkaW8gZnJhbWUgaW5mb3JtYXRpb24KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hZGxlcjMyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Rvd25taXhfaW5mby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JlcGxheWdhaW4uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IEFTaG93SW5mb0NvbnRleHQgeworICAgIC8qKgorICAgICAqIFNjcmF0Y2ggc3BhY2UgZm9yIGluZGl2aWR1YWwgcGxhbmUgY2hlY2tzdW1zIGZvciBwbGFuYXIgYXVkaW8KKyAgICAgKi8KKyAgICB1aW50MzJfdCAqcGxhbmVfY2hlY2tzdW1zOworfSBBU2hvd0luZm9Db250ZXh0OworCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBU2hvd0luZm9Db250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGF2X2ZyZWVwKCZzLT5wbGFuZV9jaGVja3N1bXMpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX21hdHJpeGVuYyhBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZVNpZGVEYXRhICpzZCkKK3sKKyAgICBlbnVtIEFWTWF0cml4RW5jb2RpbmcgZW5jOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJtYXRyaXggZW5jb2Rpbmc6ICIpOworCisgICAgaWYgKHNkLT5zaXplIDwgc2l6ZW9mKGVudW0gQVZNYXRyaXhFbmNvZGluZykpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJpbnZhbGlkIGRhdGEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVuYyA9ICooZW51bSBBVk1hdHJpeEVuY29kaW5nICopc2QtPmRhdGE7CisgICAgc3dpdGNoIChlbmMpIHsKKyAgICBjYXNlIEFWX01BVFJJWF9FTkNPRElOR19OT05FOiAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJub25lIik7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfTUFUUklYX0VOQ09ESU5HX0RPTEJZOiAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkRvbGJ5IFN1cnJvdW5kIik7ICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9NQVRSSVhfRU5DT0RJTkdfRFBMSUk6ICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiRG9sYnkgUHJvIExvZ2ljIElJIik7ICBicmVhazsKKyAgICBjYXNlIEFWX01BVFJJWF9FTkNPRElOR19EUExJSVg6ICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJEb2xieSBQcm8gTG9naWMgSUl4Iik7IGJyZWFrOworICAgIGNhc2UgQVZfTUFUUklYX0VOQ09ESU5HX0RQTElJWjogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkRvbGJ5IFBybyBMb2dpYyBJSXoiKTsgYnJlYWs7CisgICAgY2FzZSBBVl9NQVRSSVhfRU5DT0RJTkdfRE9MQllFWDogICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiRG9sYnkgRVgiKTsgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX01BVFJJWF9FTkNPRElOR19ET0xCWUhFQURQSE9ORTogYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJEb2xieSBIZWFkcGhvbmUiKTsgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgInVua25vd24iKTsgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX2Rvd25taXgoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWVTaWRlRGF0YSAqc2QpCit7CisgICAgQVZEb3dubWl4SW5mbyAqZGk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgImRvd25taXg6ICIpOworICAgIGlmIChzZC0+c2l6ZSA8IHNpemVvZigqZGkpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiaW52YWxpZCBkYXRhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkaSA9IChBVkRvd25taXhJbmZvICopc2QtPmRhdGE7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgInByZWZlcnJlZCBkb3dubWl4IHR5cGUgLSAiKTsKKyAgICBzd2l0Y2ggKGRpLT5wcmVmZXJyZWRfZG93bm1peF90eXBlKSB7CisgICAgY2FzZSBBVl9ET1dOTUlYX1RZUEVfTE9STzogICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJMby9SbyIpOyAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9ET1dOTUlYX1RZUEVfTFRSVDogICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJMdC9SdCIpOyAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9ET1dOTUlYX1RZUEVfRFBMSUk6ICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJEb2xieSBQcm8gTG9naWMgSUkiKTsgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJ1bmtub3duIik7ICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgTWl4IGxldmVsczogY2VudGVyICVmICglZiBsdHJ0KSAtICIKKyAgICAgICAgICAgInN1cnJvdW5kICVmICglZiBsdHJ0KSAtIGxmZSAlZiIsCisgICAgICAgICAgIGRpLT5jZW50ZXJfbWl4X2xldmVsLCBkaS0+Y2VudGVyX21peF9sZXZlbF9sdHJ0LAorICAgICAgICAgICBkaS0+c3Vycm91bmRfbWl4X2xldmVsLCBkaS0+c3Vycm91bmRfbWl4X2xldmVsX2x0cnQsCisgICAgICAgICAgIGRpLT5sZmVfbWl4X2xldmVsKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZ2FpbihBVkZpbHRlckNvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqc3RyLCBpbnQzMl90IGdhaW4pCit7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIlcyAtICIsIHN0cik7CisgICAgaWYgKGdhaW4gPT0gSU5UMzJfTUlOKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgInVua25vd24iKTsKKyAgICBlbHNlCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiJWYiLCBnYWluIC8gMTAwMDAwLjBmKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiwgIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3BlYWsoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKnN0ciwgdWludDMyX3QgcGVhaykKK3sKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiVzIC0gIiwgc3RyKTsKKyAgICBpZiAoIXBlYWspCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAidW5rbm93biIpOworICAgIGVsc2UKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIlZiIsIChmbG9hdClwZWFrIC8gVUlOVDMyX01BWCk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIsICIpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3JlcGxheWdhaW4oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWVTaWRlRGF0YSAqc2QpCit7CisgICAgQVZSZXBsYXlHYWluICpyZzsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAicmVwbGF5Z2FpbjogIik7CisgICAgaWYgKHNkLT5zaXplIDwgc2l6ZW9mKCpyZykpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJpbnZhbGlkIGRhdGEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZyA9IChBVlJlcGxheUdhaW4qKXNkLT5kYXRhOworCisgICAgcHJpbnRfZ2FpbihjdHgsICJ0cmFjayBnYWluIiwgcmctPnRyYWNrX2dhaW4pOworICAgIHByaW50X3BlYWsoY3R4LCAidHJhY2sgcGVhayIsIHJnLT50cmFja19wZWFrKTsKKyAgICBwcmludF9nYWluKGN0eCwgImFsYnVtIGdhaW4iLCByZy0+YWxidW1fZ2Fpbik7CisgICAgcHJpbnRfcGVhayhjdHgsICJhbGJ1bSBwZWFrIiwgcmctPmFsYnVtX3BlYWspOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3Vua25vd24oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWVTaWRlRGF0YSAqc2QpCit7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJ1bmtub3duIHNpZGUgZGF0YSB0eXBlOiAlZCwgc2l6ZSAlZCBieXRlcyIsIHNkLT50eXBlLCBzZC0+c2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBU2hvd0luZm9Db250ZXh0ICpzICA9IGN0eC0+cHJpdjsKKyAgICBjaGFyIGNobGF5b3V0X3N0clsxMjhdOworICAgIHVpbnQzMl90IGNoZWNrc3VtID0gMDsKKyAgICBpbnQgY2hhbm5lbHMgICAgPSBpbmxpbmstPmNoYW5uZWxzOworICAgIGludCBwbGFuYXIgICAgICA9IGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGJ1Zi0+Zm9ybWF0KTsKKyAgICBpbnQgYmxvY2tfYWxpZ24gPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShidWYtPmZvcm1hdCkgKiAocGxhbmFyID8gMSA6IGNoYW5uZWxzKTsKKyAgICBpbnQgZGF0YV9zaXplICAgPSBidWYtPm5iX3NhbXBsZXMgKiBibG9ja19hbGlnbjsKKyAgICBpbnQgcGxhbmVzICAgICAgPSBwbGFuYXIgPyBjaGFubmVscyA6IDE7CisgICAgaW50IGk7CisgICAgdm9pZCAqdG1wX3B0ciA9IGF2X3JlYWxsb2Mocy0+cGxhbmVfY2hlY2tzdW1zLCBjaGFubmVscyAqIHNpemVvZigqcy0+cGxhbmVfY2hlY2tzdW1zKSk7CisKKyAgICBpZiAoIXRtcF9wdHIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcy0+cGxhbmVfY2hlY2tzdW1zID0gdG1wX3B0cjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwbGFuZXM7IGkrKykgeworICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmLT5leHRlbmRlZF9kYXRhW2ldOworCisgICAgICAgIHMtPnBsYW5lX2NoZWNrc3Vtc1tpXSA9IGF2X2FkbGVyMzJfdXBkYXRlKDAsIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgICAgIGNoZWNrc3VtID0gaSA/IGF2X2FkbGVyMzJfdXBkYXRlKGNoZWNrc3VtLCBkYXRhLCBkYXRhX3NpemUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVfY2hlY2tzdW1zWzBdOworICAgIH0KKworICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoY2hsYXlvdXRfc3RyLCBzaXplb2YoY2hsYXlvdXRfc3RyKSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYtPmNoYW5uZWxfbGF5b3V0KTsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAibjolIlBSSWQ2NCIgcHRzOiVzIHB0c190aW1lOiVzIHBvczolIlBSSWQ2NCIgIgorICAgICAgICAgICAiZm10OiVzIGNoYW5uZWxzOiVkIGNobGF5b3V0OiVzIHJhdGU6JWQgbmJfc2FtcGxlczolZCAiCisgICAgICAgICAgICJjaGVja3N1bTolMDgiUFJJWDMyIiAiLAorICAgICAgICAgICBpbmxpbmstPmZyYW1lX2NvdW50LAorICAgICAgICAgICBhdl90czJzdHIoYnVmLT5wdHMpLCBhdl90czJ0aW1lc3RyKGJ1Zi0+cHRzLCAmaW5saW5rLT50aW1lX2Jhc2UpLAorICAgICAgICAgICBhdl9mcmFtZV9nZXRfcGt0X3BvcyhidWYpLAorICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGJ1Zi0+Zm9ybWF0KSwgYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGJ1ZiksIGNobGF5b3V0X3N0ciwKKyAgICAgICAgICAgYnVmLT5zYW1wbGVfcmF0ZSwgYnVmLT5uYl9zYW1wbGVzLAorICAgICAgICAgICBjaGVja3N1bSk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgInBsYW5lX2NoZWNrc3VtczogWyAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiJTA4IlBSSVgzMiIgIiwgcy0+cGxhbmVfY2hlY2tzdW1zW2ldKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIl1cbiIpOworCisgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJfc2lkZV9kYXRhOyBpKyspIHsKKyAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZCA9IGJ1Zi0+c2lkZV9kYXRhW2ldOworCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiICBzaWRlIGRhdGEgLSAiKTsKKyAgICAgICAgc3dpdGNoIChzZC0+dHlwZSkgeworICAgICAgICBjYXNlIEFWX0ZSQU1FX0RBVEFfTUFUUklYRU5DT0RJTkc6IGR1bXBfbWF0cml4ZW5jIChjdHgsIHNkKTsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfRlJBTUVfREFUQV9ET1dOTUlYX0lORk86ICAgZHVtcF9kb3dubWl4ICAgKGN0eCwgc2QpOyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9GUkFNRV9EQVRBX1JFUExBWUdBSU46ICAgICBkdW1wX3JlcGxheWdhaW4oY3R4LCBzZCk7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfdW5rbm93biAgIChjdHgsIHNkKTsgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShpbmxpbmstPmRzdC0+b3V0cHV0c1swXSwgYnVmKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2FzaG93aW5mbyA9IHsKKyAgICAubmFtZSAgICAgICAgPSAiYXNob3dpbmZvIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2hvdyB0ZXh0dWFsIGluZm9ybWF0aW9uIGZvciBlYWNoIGF1ZGlvIGZyYW1lLiIpLAorICAgIC5wcml2X3NpemUgICA9IHNpemVvZihBU2hvd0luZm9Db250ZXh0KSwKKyAgICAudW5pbml0ICAgICAgPSB1bmluaXQsCisgICAgLmlucHV0cyAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IG91dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FzdGF0cy5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FzdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwY2NkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYXN0YXRzLmMKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUm9iIFN5a2VzIDxyb2JzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IENoYW5uZWxTdGF0cyB7CisgICAgZG91YmxlIGxhc3Q7CisgICAgZG91YmxlIHNpZ21hX3gsIHNpZ21hX3gyOworICAgIGRvdWJsZSBhdmdfc2lnbWFfeDIsIG1pbl9zaWdtYV94MiwgbWF4X3NpZ21hX3gyOworICAgIGRvdWJsZSBtaW4sIG1heDsKKyAgICBkb3VibGUgbWluX3J1biwgbWF4X3J1bjsKKyAgICBkb3VibGUgbWluX3J1bnMsIG1heF9ydW5zOworICAgIHVpbnQ2NF90IG1pbl9jb3VudCwgbWF4X2NvdW50OworICAgIHVpbnQ2NF90IG5iX3NhbXBsZXM7Cit9IENoYW5uZWxTdGF0czsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIENoYW5uZWxTdGF0cyAqY2hzdGF0czsKKyAgICBpbnQgbmJfY2hhbm5lbHM7CisgICAgdWludDY0X3QgdGNfc2FtcGxlczsKKyAgICBkb3VibGUgdGltZV9jb25zdGFudDsKKyAgICBkb3VibGUgbXVsdDsKK30gQXVkaW9TdGF0c0NvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEF1ZGlvU3RhdHNDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFzdGF0c19vcHRpb25zW10gPSB7CisgICAgeyAibGVuZ3RoIiwgInNldCB0aGUgd2luZG93IGxlbmd0aCIsIE9GRlNFVCh0aW1lX2NvbnN0YW50KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0uMDV9LCAuMDEsIDEwLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXN0YXRzKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0czsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzOworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRzW10gPSB7CisgICAgICAgIEFWX1NBTVBMRV9GTVRfREJMLCBBVl9TQU1QTEVfRk1UX0RCTFAsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORQorICAgIH07CisKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfbGF5b3V0cygpOworICAgIGlmICghbGF5b3V0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQXVkaW9TdGF0c0NvbnRleHQgKnMgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisgICAgaW50IGM7CisKKyAgICBzLT5jaHN0YXRzID0gYXZfY2FsbG9jKHNpemVvZigqcy0+Y2hzdGF0cyksIG91dGxpbmstPmNoYW5uZWxzKTsKKyAgICBpZiAoIXMtPmNoc3RhdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcy0+bmJfY2hhbm5lbHMgPSBvdXRsaW5rLT5jaGFubmVsczsKKyAgICBzLT5tdWx0ID0gZXhwKCgtMSAvIHMtPnRpbWVfY29uc3RhbnQgLyBvdXRsaW5rLT5zYW1wbGVfcmF0ZSkpOworICAgIHMtPnRjX3NhbXBsZXMgPSA1ICogcy0+dGltZV9jb25zdGFudCAqIG91dGxpbmstPnNhbXBsZV9yYXRlICsgLjU7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmJfY2hhbm5lbHM7IGMrKykgeworICAgICAgICBDaGFubmVsU3RhdHMgKnAgPSAmcy0+Y2hzdGF0c1tjXTsKKworICAgICAgICBwLT5taW4gPSBwLT5taW5fc2lnbWFfeDIgPSBEQkxfTUFYOworICAgICAgICBwLT5tYXggPSBwLT5tYXhfc2lnbWFfeDIgPSBEQkxfTUlOOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3N0YXQoQXVkaW9TdGF0c0NvbnRleHQgKnMsIENoYW5uZWxTdGF0cyAqcCwgZG91YmxlIGQpCit7CisgICAgaWYgKGQgPCBwLT5taW4pIHsKKyAgICAgICAgcC0+bWluID0gZDsKKyAgICAgICAgcC0+bWluX3J1biA9IDE7CisgICAgICAgIHAtPm1pbl9ydW5zID0gMDsKKyAgICAgICAgcC0+bWluX2NvdW50ID0gMTsKKyAgICB9IGVsc2UgaWYgKGQgPT0gcC0+bWluKSB7CisgICAgICAgIHAtPm1pbl9jb3VudCsrOworICAgICAgICBwLT5taW5fcnVuID0gZCA9PSBwLT5sYXN0ID8gcC0+bWluX3J1biArIDEgOiAxOworICAgIH0gZWxzZSBpZiAocC0+bGFzdCA9PSBwLT5taW4pIHsKKyAgICAgICAgcC0+bWluX3J1bnMgKz0gcC0+bWluX3J1biAqIHAtPm1pbl9ydW47CisgICAgfQorCisgICAgaWYgKGQgPiBwLT5tYXgpIHsKKyAgICAgICAgcC0+bWF4ID0gZDsKKyAgICAgICAgcC0+bWF4X3J1biA9IDE7CisgICAgICAgIHAtPm1heF9ydW5zID0gMDsKKyAgICAgICAgcC0+bWF4X2NvdW50ID0gMTsKKyAgICB9IGVsc2UgaWYgKGQgPT0gcC0+bWF4KSB7CisgICAgICAgIHAtPm1heF9jb3VudCsrOworICAgICAgICBwLT5tYXhfcnVuID0gZCA9PSBwLT5sYXN0ID8gcC0+bWF4X3J1biArIDEgOiAxOworICAgIH0gZWxzZSBpZiAocC0+bGFzdCA9PSBwLT5tYXgpIHsKKyAgICAgICAgcC0+bWF4X3J1bnMgKz0gcC0+bWF4X3J1biAqIHAtPm1heF9ydW47CisgICAgfQorCisgICAgcC0+c2lnbWFfeCArPSBkOworICAgIHAtPnNpZ21hX3gyICs9IGQgKiBkOworICAgIHAtPmF2Z19zaWdtYV94MiA9IHAtPmF2Z19zaWdtYV94MiAqIHMtPm11bHQgKyAoMS4wIC0gcy0+bXVsdCkgKiBkICogZDsKKyAgICBwLT5sYXN0ID0gZDsKKworICAgIGlmIChwLT5uYl9zYW1wbGVzID49IHMtPnRjX3NhbXBsZXMpIHsKKyAgICAgICAgcC0+bWF4X3NpZ21hX3gyID0gRkZNQVgocC0+bWF4X3NpZ21hX3gyLCBwLT5hdmdfc2lnbWFfeDIpOworICAgICAgICBwLT5taW5fc2lnbWFfeDIgPSBGRk1JTihwLT5taW5fc2lnbWFfeDIsIHAtPmF2Z19zaWdtYV94Mik7CisgICAgfQorICAgIHAtPm5iX3NhbXBsZXMrKzsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmJ1ZikKK3sKKyAgICBBdWRpb1N0YXRzQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IGludCBjaGFubmVscyA9IHMtPm5iX2NoYW5uZWxzOworICAgIGNvbnN0IGRvdWJsZSAqc3JjOworICAgIGludCBpLCBjOworCisgICAgc3dpdGNoIChpbmxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQOgorICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgQ2hhbm5lbFN0YXRzICpwID0gJnMtPmNoc3RhdHNbY107CisgICAgICAgICAgICBzcmMgPSAoY29uc3QgZG91YmxlICopYnVmLT5leHRlbmRlZF9kYXRhW2NdOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmLT5uYl9zYW1wbGVzOyBpKyssIHNyYysrKQorICAgICAgICAgICAgICAgIHVwZGF0ZV9zdGF0KHMsIHAsICpzcmMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkw6CisgICAgICAgIHNyYyA9IChjb25zdCBkb3VibGUgKilidWYtPmV4dGVuZGVkX2RhdGFbMF07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKywgc3JjKyspCisgICAgICAgICAgICAgICAgdXBkYXRlX3N0YXQocywgJnMtPmNoc3RhdHNbY10sICpzcmMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoaW5saW5rLT5kc3QtPm91dHB1dHNbMF0sIGJ1Zik7Cit9CisKKyNkZWZpbmUgTElORUFSX1RPX0RCKHgpIChsb2cxMCh4KSAqIDIwKQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBdWRpb1N0YXRzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICB1aW50NjRfdCBtaW5fY291bnQgPSAwLCBtYXhfY291bnQgPSAwLCBuYl9zYW1wbGVzID0gMDsKKyAgICBkb3VibGUgbWluX3J1bnMgPSAwLCBtYXhfcnVucyA9IDAsCisgICAgICAgICAgIG1pbiA9IERCTF9NQVgsIG1heCA9IERCTF9NSU4sCisgICAgICAgICAgIG1heF9zaWdtYV94ID0gMCwKKyAgICAgICAgICAgc2lnbWFfeCA9IDAsCisgICAgICAgICAgIHNpZ21hX3gyID0gMCwKKyAgICAgICAgICAgbWluX3NpZ21hX3gyID0gREJMX01BWCwKKyAgICAgICAgICAgbWF4X3NpZ21hX3gyID0gREJMX01JTjsKKyAgICBpbnQgYzsKKworICAgIGZvciAoYyA9IDA7IGMgPCBzLT5uYl9jaGFubmVsczsgYysrKSB7CisgICAgICAgIENoYW5uZWxTdGF0cyAqcCA9ICZzLT5jaHN0YXRzW2NdOworCisgICAgICAgIGlmIChwLT5uYl9zYW1wbGVzIDwgcy0+dGNfc2FtcGxlcykKKyAgICAgICAgICAgIHAtPm1pbl9zaWdtYV94MiA9IHAtPm1heF9zaWdtYV94MiA9IHAtPnNpZ21hX3gyIC8gcC0+bmJfc2FtcGxlczsKKworICAgICAgICBtaW4gPSBGRk1JTihtaW4sIHAtPm1pbik7CisgICAgICAgIG1heCA9IEZGTUFYKG1heCwgcC0+bWF4KTsKKyAgICAgICAgbWluX3NpZ21hX3gyID0gRkZNSU4obWluX3NpZ21hX3gyLCBwLT5taW5fc2lnbWFfeDIpOworICAgICAgICBtYXhfc2lnbWFfeDIgPSBGRk1BWChtYXhfc2lnbWFfeDIsIHAtPm1heF9zaWdtYV94Mik7CisgICAgICAgIHNpZ21hX3ggKz0gcC0+c2lnbWFfeDsKKyAgICAgICAgc2lnbWFfeDIgKz0gcC0+c2lnbWFfeDI7CisgICAgICAgIG1pbl9jb3VudCArPSBwLT5taW5fY291bnQ7CisgICAgICAgIG1heF9jb3VudCArPSBwLT5tYXhfY291bnQ7CisgICAgICAgIG1pbl9ydW5zICs9IHAtPm1pbl9ydW5zOworICAgICAgICBtYXhfcnVucyArPSBwLT5tYXhfcnVuczsKKyAgICAgICAgbmJfc2FtcGxlcyArPSBwLT5uYl9zYW1wbGVzOworICAgICAgICBpZiAoZmFicyhwLT5zaWdtYV94KSA+IGZhYnMobWF4X3NpZ21hX3gpKQorICAgICAgICAgICAgbWF4X3NpZ21hX3ggPSBwLT5zaWdtYV94OworCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiQ2hhbm5lbDogJWRcbiIsIGMgKyAxKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJEQyBvZmZzZXQ6ICVmXG4iLCBwLT5zaWdtYV94IC8gcC0+bmJfc2FtcGxlcyk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiTWluIGxldmVsOiAlZlxuIiwgcC0+bWluKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJNYXggbGV2ZWw6ICVmXG4iLCBwLT5tYXgpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlBlYWsgbGV2ZWwgZEI6ICVmXG4iLCBMSU5FQVJfVE9fREIoRkZNQVgoLXAtPm1pbiwgcC0+bWF4KSkpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlJNUyBsZXZlbCBkQjogJWZcbiIsIExJTkVBUl9UT19EQihzcXJ0KHAtPnNpZ21hX3gyIC8gcC0+bmJfc2FtcGxlcykpKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJSTVMgcGVhayBkQjogJWZcbiIsIExJTkVBUl9UT19EQihzcXJ0KHAtPm1heF9zaWdtYV94MikpKTsKKyAgICAgICAgaWYgKHAtPm1pbl9zaWdtYV94MiAhPSAxKQorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJSTVMgdHJvdWdoIGRCOiAlZlxuIixMSU5FQVJfVE9fREIoc3FydChwLT5taW5fc2lnbWFfeDIpKSk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiQ3Jlc3QgZmFjdG9yOiAlZlxuIiwgcC0+c2lnbWFfeDIgPyBGRk1BWCgtcC0+bWluLCBwLT5tYXgpIC8gc3FydChwLT5zaWdtYV94MiAvIHAtPm5iX3NhbXBsZXMpIDogMSk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiRmxhdCBmYWN0b3I6ICVmXG4iLCBMSU5FQVJfVE9fREIoKHAtPm1pbl9ydW5zICsgcC0+bWF4X3J1bnMpIC8gKHAtPm1pbl9jb3VudCArIHAtPm1heF9jb3VudCkpKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJQZWFrIGNvdW50OiAlIlBSSWQ2NCJcbiIsIHAtPm1pbl9jb3VudCArIHAtPm1heF9jb3VudCk7CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJPdmVyYWxsXG4iKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkRDIG9mZnNldDogJWZcbiIsIG1heF9zaWdtYV94IC8gKG5iX3NhbXBsZXMgLyBzLT5uYl9jaGFubmVscykpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiTWluIGxldmVsOiAlZlxuIiwgbWluKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIk1heCBsZXZlbDogJWZcbiIsIG1heCk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJQZWFrIGxldmVsIGRCOiAlZlxuIiwgTElORUFSX1RPX0RCKEZGTUFYKC1taW4sIG1heCkpKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlJNUyBsZXZlbCBkQjogJWZcbiIsIExJTkVBUl9UT19EQihzcXJ0KHNpZ21hX3gyIC8gbmJfc2FtcGxlcykpKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlJNUyBwZWFrIGRCOiAlZlxuIiwgTElORUFSX1RPX0RCKHNxcnQobWF4X3NpZ21hX3gyKSkpOworICAgIGlmIChtaW5fc2lnbWFfeDIgIT0gMSkKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJSTVMgdHJvdWdoIGRCOiAlZlxuIiwgTElORUFSX1RPX0RCKHNxcnQobWluX3NpZ21hX3gyKSkpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiRmxhdCBmYWN0b3I6ICVmXG4iLCBMSU5FQVJfVE9fREIoKG1pbl9ydW5zICsgbWF4X3J1bnMpIC8gKG1pbl9jb3VudCArIG1heF9jb3VudCkpKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlBlYWsgY291bnQ6ICVmXG4iLCAobWluX2NvdW50ICsgbWF4X2NvdW50KSAvIChkb3VibGUpcy0+bmJfY2hhbm5lbHMpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiTnVtYmVyIG9mIHNhbXBsZXM6ICUiUFJJZDY0IlxuIiwgbmJfc2FtcGxlcyAvIHMtPm5iX2NoYW5uZWxzKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQXVkaW9TdGF0c0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBwcmludF9zdGF0cyhjdHgpOworICAgIGF2X2ZyZWVwKCZzLT5jaHN0YXRzKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFzdGF0c19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFzdGF0c19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hc3RhdHMgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYXN0YXRzIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTaG93IHRpbWUgZG9tYWluIHN0YXRpc3RpY3MgYWJvdXQgYXVkaW8gZnJhbWVzLiIpLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihBdWRpb1N0YXRzQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmYXN0YXRzX2NsYXNzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICAgID0gYXN0YXRzX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGFzdGF0c19vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hc3RyZWFtc3luYy5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FzdHJlYW1zeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjZmUzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hc3RyZWFtc3luYy5jCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIE5pY29sYXMgR2VvcmdlIDxuaWNvbGFzLmdlb3JnZUBub3JtYWxlc3VwLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU3RyZWFtIChkZSlzeW5jaHJvbml6YXRpb24gZmlsdGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFFVRVVFX1NJWkUgMTYKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2YXJfbmFtZXNbXSA9IHsKKyAgICAiYjEiLCAiYjIiLAorICAgICJzMSIsICJzMiIsCisgICAgInQxIiwgInQyIiwKKyAgICBOVUxMCit9OworCitlbnVtIHZhcl9uYW1lIHsKKyAgICBWQVJfQjEsIFZBUl9CMiwKKyAgICBWQVJfUzEsIFZBUl9TMiwKKyAgICBWQVJfVDEsIFZBUl9UMiwKKyAgICBWQVJfTkIKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBBVkV4cHIgKmV4cHI7CisgICAgY2hhciAqZXhwcl9zdHI7CisgICAgZG91YmxlIHZhcl92YWx1ZXNbVkFSX05CXTsKKyAgICBzdHJ1Y3QgYnVmX3F1ZXVlIHsKKyAgICAgICAgQVZGcmFtZSAqYnVmW1FVRVVFX1NJWkVdOworICAgICAgICB1bnNpZ25lZCB0YWlsLCBuYjsKKyAgICAgICAgLyogYnVmW3RhaWxdIGlzIHRoZSBvbGRlc3QsCisgICAgICAgICAgIGJ1ZlsodGFpbCArIG5iKSAlIFFVRVVFX1NJWkVdIGlzIHdoZXJlIHRoZSBuZXh0IGlzIGFkZGVkICovCisgICAgfSBxdWV1ZVsyXTsKKyAgICBpbnQgcmVxWzJdOworICAgIGludCBuZXh0X291dDsKKyAgICBpbnQgZW9mOyAvKiBiaXRtYXNrLCBvbmUgYml0IGZvciBlYWNoIHN0cmVhbSAqLworfSBBU3RyZWFtU3luY0NvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFTdHJlYW1TeW5jQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYXN0cmVhbXN5bmNfb3B0aW9uc1tdID0geworICAgIHsgImV4cHIiLCAic2V0IHN0cmVhbSBzZWxlY3Rpb24gZXhwcmVzc2lvbiIsIE9GRlNFVChleHByX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gInQxLXQyIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImUiLCAgICAic2V0IHN0cmVhbSBzZWxlY3Rpb24gZXhwcmVzc2lvbiIsIE9GRlNFVChleHByX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gInQxLXQyIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXN0cmVhbXN5bmMpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBU3RyZWFtU3luY0NvbnRleHQgKmFzID0gY3R4LT5wcml2OworICAgIGludCByLCBpOworCisgICAgciA9IGF2X2V4cHJfcGFyc2UoJmFzLT5leHByLCBhcy0+ZXhwcl9zdHIsIHZhcl9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpOworICAgIGlmIChyIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBpbiBleHByZXNzaW9uIFwiJXNcIlxuIiwgYXMtPmV4cHJfc3RyKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCA0MjsgaSsrKQorICAgICAgICBhdl9leHByX2V2YWwoYXMtPmV4cHIsIGFzLT52YXJfdmFsdWVzLCBOVUxMKTsgLyogZXhlcmNpemUgcHJuZyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGk7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzLCAqcmF0ZXM7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgZm9ybWF0cyA9IGN0eC0+aW5wdXRzW2ldLT5pbl9mb3JtYXRzOworICAgICAgICBmZl9mb3JtYXRzX3JlZihmb3JtYXRzLCAmY3R4LT5pbnB1dHNbaV0tPm91dF9mb3JtYXRzKTsKKyAgICAgICAgZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJmN0eC0+b3V0cHV0c1tpXS0+aW5fZm9ybWF0cyk7CisgICAgICAgIHJhdGVzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgICAgIGZmX2Zvcm1hdHNfcmVmKHJhdGVzLCAmY3R4LT5pbnB1dHNbaV0tPm91dF9zYW1wbGVyYXRlcyk7CisgICAgICAgIGZmX2Zvcm1hdHNfcmVmKHJhdGVzLCAmY3R4LT5vdXRwdXRzW2ldLT5pbl9zYW1wbGVyYXRlcyk7CisgICAgICAgIGxheW91dHMgPSBjdHgtPmlucHV0c1tpXS0+aW5fY2hhbm5lbF9sYXlvdXRzOworICAgICAgICBmZl9jaGFubmVsX2xheW91dHNfcmVmKGxheW91dHMsICZjdHgtPmlucHV0c1tpXS0+b3V0X2NoYW5uZWxfbGF5b3V0cyk7CisgICAgICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJmN0eC0+b3V0cHV0c1tpXS0+aW5fY2hhbm5lbF9sYXlvdXRzKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgaW50IGlkID0gb3V0bGluayA9PSBjdHgtPm91dHB1dHNbMV07CisKKyAgICBvdXRsaW5rLT5zYW1wbGVfcmF0ZSA9IGN0eC0+aW5wdXRzW2lkXS0+c2FtcGxlX3JhdGU7CisgICAgb3V0bGluay0+dGltZV9iYXNlICAgPSBjdHgtPmlucHV0c1tpZF0tPnRpbWVfYmFzZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZW5kX291dChBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IG91dF9pZCkKK3sKKyAgICBBU3RyZWFtU3luY0NvbnRleHQgKmFzID0gY3R4LT5wcml2OworICAgIHN0cnVjdCBidWZfcXVldWUgKnF1ZXVlID0gJmFzLT5xdWV1ZVtvdXRfaWRdOworICAgIEFWRnJhbWUgKmJ1ZiA9IHF1ZXVlLT5idWZbcXVldWUtPnRhaWxdOworICAgIGludCByZXQ7CisKKyAgICBxdWV1ZS0+YnVmW3F1ZXVlLT50YWlsXSA9IE5VTEw7CisgICAgYXMtPnZhcl92YWx1ZXNbVkFSX0IxICsgb3V0X2lkXSsrOworICAgIGFzLT52YXJfdmFsdWVzW1ZBUl9TMSArIG91dF9pZF0gKz0gYnVmLT5uYl9zYW1wbGVzOworICAgIGlmIChidWYtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgYXMtPnZhcl92YWx1ZXNbVkFSX1QxICsgb3V0X2lkXSA9CisgICAgICAgICAgICBhdl9xMmQoY3R4LT5vdXRwdXRzW291dF9pZF0tPnRpbWVfYmFzZSkgKiBidWYtPnB0czsKKyAgICBhcy0+dmFyX3ZhbHVlc1tWQVJfVDEgKyBvdXRfaWRdICs9IGJ1Zi0+bmJfc2FtcGxlcyAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpY3R4LT5pbnB1dHNbb3V0X2lkXS0+c2FtcGxlX3JhdGU7CisgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1tvdXRfaWRdLCBidWYpOworICAgIHF1ZXVlLT5uYi0tOworICAgIHF1ZXVlLT50YWlsID0gKHF1ZXVlLT50YWlsICsgMSkgJSBRVUVVRV9TSVpFOworICAgIGlmIChhcy0+cmVxW291dF9pZF0pCisgICAgICAgIGFzLT5yZXFbb3V0X2lkXS0tOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfbmV4dChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBU3RyZWFtU3luY0NvbnRleHQgKmFzID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCFhcy0+cXVldWVbYXMtPm5leHRfb3V0XS5uYikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzZW5kX291dChjdHgsIGFzLT5uZXh0X291dCk7CisgICAgICAgIGlmICghYXMtPmVvZikKKyAgICAgICAgICAgIGFzLT5uZXh0X291dCA9IGF2X2V4cHJfZXZhbChhcy0+ZXhwciwgYXMtPnZhcl92YWx1ZXMsIE5VTEwpID49IDA7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIGlmIChhcy0+cXVldWVbaV0ubmIgPT0gUVVFVUVfU0laRSkKKyAgICAgICAgICAgIHNlbmRfb3V0KGN0eCwgaSk7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVN0cmVhbVN5bmNDb250ZXh0ICphcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaWQgPSBvdXRsaW5rID09IGN0eC0+b3V0cHV0c1sxXTsKKworICAgIGFzLT5yZXFbaWRdKys7CisgICAgd2hpbGUgKGFzLT5yZXFbaWRdICYmICEoYXMtPmVvZiAmICgxIDw8IGlkKSkpIHsKKyAgICAgICAgaWYgKGFzLT5xdWV1ZVthcy0+bmV4dF9vdXRdLm5iKSB7CisgICAgICAgICAgICBzZW5kX25leHQoY3R4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzLT5lb2YgfD0gMSA8PCBhcy0+bmV4dF9vdXQ7CisgICAgICAgICAgICBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzW2FzLT5uZXh0X291dF0pOworICAgICAgICAgICAgaWYgKGFzLT5lb2YgJiAoMSA8PCBhcy0+bmV4dF9vdXQpKQorICAgICAgICAgICAgICAgIGFzLT5uZXh0X291dCA9ICFhcy0+bmV4dF9vdXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnNhbXBsZXMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBU3RyZWFtU3luY0NvbnRleHQgKmFzID0gY3R4LT5wcml2OworICAgIGludCBpZCA9IGlubGluayA9PSBjdHgtPmlucHV0c1sxXTsKKworICAgIGFzLT5xdWV1ZVtpZF0uYnVmWyhhcy0+cXVldWVbaWRdLnRhaWwgKyBhcy0+cXVldWVbaWRdLm5iKyspICUgUVVFVUVfU0laRV0gPQorICAgICAgICBpbnNhbXBsZXM7CisgICAgYXMtPmVvZiAmPSB+KDEgPDwgaWQpOworICAgIHNlbmRfbmV4dChjdHgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBU3RyZWFtU3luY0NvbnRleHQgKmFzID0gY3R4LT5wcml2OworCisgICAgYXZfZXhwcl9mcmVlKGFzLT5leHByKTsKKyAgICBhcy0+ZXhwciA9IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhc3RyZWFtc3luY19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiaW4xIiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJpbjIiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhc3RyZWFtc3luY19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJvdXQxIiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0seworICAgICAgICAubmFtZSAgICAgICAgICA9ICJvdXQyIiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2FzdHJlYW1zeW5jID0geworICAgIC5uYW1lICAgICAgICAgID0gImFzdHJlYW1zeW5jIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDb3B5IHR3byBzdHJlYW1zIG9mIGF1ZGlvIGRhdGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIGEgY29uZmlndXJhYmxlIG9yZGVyLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEFTdHJlYW1TeW5jQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGFzdHJlYW1zeW5jX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGFzdHJlYW1zeW5jX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmYXN0cmVhbXN5bmNfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2FzeW5jdHMuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hc3luY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4ZTFmNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9hc3luY3RzLmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZyZXNhbXBsZS9hdnJlc2FtcGxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXVkaW9fZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IEFTeW5jQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnI7CisgICAgaW50NjRfdCBwdHM7ICAgICAgICAgICAgLy8vPCB0aW1lc3RhbXAgaW4gc2FtcGxlcyBvZiB0aGUgZmlyc3Qgc2FtcGxlIGluIGZpZm8KKyAgICBpbnQgbWluX2RlbHRhOyAgICAgICAgICAvLy88IHBhZC90cmltIG1pbiB0aHJlc2hvbGQgaW4gc2FtcGxlcworICAgIGludCBmaXJzdF9mcmFtZTsgICAgICAgIC8vLzwgMSB1bnRpbCBmaWx0ZXJfZnJhbWUoKSBoYXMgcHJvY2Vzc2VkIGF0IGxlYXN0IDEgZnJhbWUgd2l0aCBhIHB0cyAhPSBBVl9OT1BUU19WQUxVRQorICAgIGludDY0X3QgZmlyc3RfcHRzOyAgICAgIC8vLzwgdXNlci1zcGVjaWZpZWQgZmlyc3QgZXhwZWN0ZWQgcHRzLCBpbiBzYW1wbGVzCisgICAgaW50IGNvbXA7ICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IHJlc2FtcGxlIGNvbXBlbnNhdGlvbgorCisgICAgLyogb3B0aW9ucyAqLworICAgIGludCByZXNhbXBsZTsKKyAgICBmbG9hdCBtaW5fZGVsdGFfc2VjOworICAgIGludCBtYXhfY29tcDsKKworICAgIC8qIHNldCBieSBmaWx0ZXJfZnJhbWUoKSB0byBzaWduYWwgYW4gb3V0cHV0IGZyYW1lIHRvIHJlcXVlc3RfZnJhbWUoKSAqLworICAgIGludCBnb3Rfb3V0cHV0OworfSBBU3luY0NvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFTeW5jQ29udGV4dCwgeCkKKyNkZWZpbmUgQSBBVl9PUFRfRkxBR19BVURJT19QQVJBTQorI2RlZmluZSBGIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFzeW5jdHNfb3B0aW9uc1tdID0geworICAgIHsgImNvbXBlbnNhdGUiLCAiU3RyZXRjaC9zcXVlZXplIHRoZSBkYXRhIHRvIG1ha2UgaXQgbWF0Y2ggdGhlIHRpbWVzdGFtcHMiLCBPRkZTRVQocmVzYW1wbGUpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwIH0sICAgMCwgMSwgICAgICAgQXxGIH0sCisgICAgeyAibWluX2RlbHRhIiwgICJNaW5pbXVtIGRpZmZlcmVuY2UgYmV0d2VlbiB0aW1lc3RhbXBzIGFuZCBhdWRpbyBkYXRhICIKKyAgICAgICAgICAgICAgICAgICAgIihpbiBzZWNvbmRzKSB0byB0cmlnZ2VyIHBhZGRpbmcvdHJpbW1pbiB0aGUgZGF0YS4iLCAgICAgICAgT0ZGU0VUKG1pbl9kZWx0YV9zZWMpLCBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gMC4xIH0sIDAsIElOVF9NQVgsIEF8RiB9LAorICAgIHsgIm1heF9jb21wIiwgICAiTWF4aW11bSBjb21wZW5zYXRpb24gaW4gc2FtcGxlcyBwZXIgc2Vjb25kLiIsICAgICAgICAgICAgICBPRkZTRVQobWF4X2NvbXApLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSA1MDAgfSwgMCwgSU5UX01BWCwgQXxGIH0sCisgICAgeyAiZmlyc3RfcHRzIiwgICJBc3N1bWUgdGhlIGZpcnN0IHB0cyBzaG91bGQgYmUgdGhpcyB2YWx1ZS4iLCAgICAgICAgICAgICAgIE9GRlNFVChmaXJzdF9wdHMpLCAgICAgQVZfT1BUX1RZUEVfSU5UNjQsIHsgLmk2NCA9IEFWX05PUFRTX1ZBTFVFIH0sIElOVDY0X01JTiwgSU5UNjRfTUFYLCBBfEYgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGFzeW5jdHMpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBU3luY0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzLT5wdHMgICAgICAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgIHMtPmZpcnN0X2ZyYW1lID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBU3luY0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocy0+YXZyKSB7CisgICAgICAgIGF2cmVzYW1wbGVfY2xvc2Uocy0+YXZyKTsKKyAgICAgICAgYXZyZXNhbXBsZV9mcmVlKCZzLT5hdnIpOworICAgIH0KK30KKworc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIEFTeW5jQ29udGV4dCAqcyA9IGxpbmstPnNyYy0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgcy0+bWluX2RlbHRhID0gcy0+bWluX2RlbHRhX3NlYyAqIGxpbmstPnNhbXBsZV9yYXRlOworICAgIGxpbmstPnRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKXsxLCBsaW5rLT5zYW1wbGVfcmF0ZX07CisKKyAgICBzLT5hdnIgPSBhdnJlc2FtcGxlX2FsbG9jX2NvbnRleHQoKTsKKyAgICBpZiAoIXMtPmF2cikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2X29wdF9zZXRfaW50KHMtPmF2ciwgICJpbl9jaGFubmVsX2xheW91dCIsIGxpbmstPmNoYW5uZWxfbGF5b3V0LCAwKTsKKyAgICBhdl9vcHRfc2V0X2ludChzLT5hdnIsICJvdXRfY2hhbm5lbF9sYXlvdXQiLCBsaW5rLT5jaGFubmVsX2xheW91dCwgMCk7CisgICAgYXZfb3B0X3NldF9pbnQocy0+YXZyLCAgImluX3NhbXBsZV9mbXQiLCAgICAgbGluay0+Zm9ybWF0LCAgICAgICAgIDApOworICAgIGF2X29wdF9zZXRfaW50KHMtPmF2ciwgIm91dF9zYW1wbGVfZm10IiwgICAgIGxpbmstPmZvcm1hdCwgICAgICAgICAwKTsKKyAgICBhdl9vcHRfc2V0X2ludChzLT5hdnIsICAiaW5fc2FtcGxlX3JhdGUiLCAgICBsaW5rLT5zYW1wbGVfcmF0ZSwgICAgMCk7CisgICAgYXZfb3B0X3NldF9pbnQocy0+YXZyLCAib3V0X3NhbXBsZV9yYXRlIiwgICAgbGluay0+c2FtcGxlX3JhdGUsICAgIDApOworCisgICAgaWYgKHMtPnJlc2FtcGxlKQorICAgICAgICBhdl9vcHRfc2V0X2ludChzLT5hdnIsICJmb3JjZV9yZXNhbXBsaW5nIiwgMSwgMCk7CisKKyAgICBpZiAoKHJldCA9IGF2cmVzYW1wbGVfb3BlbihzLT5hdnIpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogZ2V0IGFtb3VudCBvZiBkYXRhIGN1cnJlbnRseSBidWZmZXJlZCwgaW4gc2FtcGxlcyAqLworc3RhdGljIGludDY0X3QgZ2V0X2RlbGF5KEFTeW5jQ29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gYXZyZXNhbXBsZV9hdmFpbGFibGUocy0+YXZyKSArIGF2cmVzYW1wbGVfZ2V0X2RlbGF5KHMtPmF2cik7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV90cmltbWluZyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBU3luY0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocy0+cHRzIDwgcy0+Zmlyc3RfcHRzKSB7CisgICAgICAgIGludCBkZWx0YSA9IEZGTUlOKHMtPmZpcnN0X3B0cyAtIHMtPnB0cywgYXZyZXNhbXBsZV9hdmFpbGFibGUocy0+YXZyKSk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiVHJpbW1pbmcgJWQgc2FtcGxlcyBmcm9tIHN0YXJ0XG4iLAorICAgICAgICAgICAgICAgZGVsdGEpOworICAgICAgICBhdnJlc2FtcGxlX3JlYWQocy0+YXZyLCBOVUxMLCBkZWx0YSk7CisgICAgICAgIHMtPnB0cyArPSBkZWx0YTsKKyAgICB9IGVsc2UgaWYgKHMtPmZpcnN0X2ZyYW1lKQorICAgICAgICBzLT5wdHMgPSBzLT5maXJzdF9wdHM7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBsaW5rLT5zcmM7CisgICAgQVN5bmNDb250ZXh0ICAgICAgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IG5iX3NhbXBsZXM7CisKKyAgICBzLT5nb3Rfb3V0cHV0ID0gMDsKKyAgICB3aGlsZSAocmV0ID49IDAgJiYgIXMtPmdvdF9vdXRwdXQpCisgICAgICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworCisgICAgLyogZmx1c2ggdGhlIGZpZm8gKi8KKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GKSB7CisgICAgICAgIGlmIChzLT5maXJzdF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBoYW5kbGVfdHJpbW1pbmcoY3R4KTsKKworICAgICAgICBpZiAobmJfc2FtcGxlcyA9IGdldF9kZWxheShzKSkgeworICAgICAgICAgICAgQVZGcmFtZSAqYnVmID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihsaW5rLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgICAgIGlmICghYnVmKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICByZXQgPSBhdnJlc2FtcGxlX2NvbnZlcnQocy0+YXZyLCBidWYtPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5saW5lc2l6ZVswXSwgbmJfc2FtcGxlcywgTlVMTCwgMCwgMCk7CisgICAgICAgICAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZidWYpOworICAgICAgICAgICAgICAgIHJldHVybiAocmV0IDwgMCkgPyByZXQgOiBBVkVSUk9SX0VPRjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmLT5wdHMgPSBzLT5wdHM7CisgICAgICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGxpbmssIGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdyaXRlX3RvX2ZpZm8oQVN5bmNDb250ZXh0ICpzLCBBVkZyYW1lICpidWYpCit7CisgICAgaW50IHJldCA9IGF2cmVzYW1wbGVfY29udmVydChzLT5hdnIsIE5VTEwsIDAsIDAsIGJ1Zi0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi0+bGluZXNpemVbMF0sIGJ1Zi0+bmJfc2FtcGxlcyk7CisgICAgYXZfZnJhbWVfZnJlZSgmYnVmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqYnVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFTeW5jQ29udGV4dCAgICAgICAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgaW50IG5iX2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGJ1Zi0+Y2hhbm5lbF9sYXlvdXQpOworICAgIGludDY0X3QgcHRzID0gKGJ1Zi0+cHRzID09IEFWX05PUFRTX1ZBTFVFKSA/IGJ1Zi0+cHRzIDoKKyAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShidWYtPnB0cywgaW5saW5rLT50aW1lX2Jhc2UsIG91dGxpbmstPnRpbWVfYmFzZSk7CisgICAgaW50IG91dF9zaXplLCByZXQ7CisgICAgaW50NjRfdCBkZWx0YTsKKyAgICBpbnQ2NF90IG5ld19wdHM7CisKKyAgICAvKiBidWZmZXIgZGF0YSB1bnRpbCB3ZSBnZXQgdGhlIG5leHQgdGltZXN0YW1wICovCisgICAgaWYgKHMtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSB8fCBwdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaWYgKHB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgcy0+cHRzID0gcHRzIC0gZ2V0X2RlbGF5KHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3cml0ZV90b19maWZvKHMsIGJ1Zik7CisgICAgfQorCisgICAgaWYgKHMtPmZpcnN0X3B0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBoYW5kbGVfdHJpbW1pbmcoY3R4KTsKKyAgICAgICAgaWYgKCFhdnJlc2FtcGxlX2F2YWlsYWJsZShzLT5hdnIpKQorICAgICAgICAgICAgcmV0dXJuIHdyaXRlX3RvX2ZpZm8ocywgYnVmKTsKKyAgICB9CisKKyAgICAvKiB3aGVuIHdlIGhhdmUgdHdvIHRpbWVzdGFtcHMsIGNvbXB1dGUgaG93IG1hbnkgc2FtcGxlcyB3b3VsZCB3ZSBoYXZlCisgICAgICogdG8gYWRkL3JlbW92ZSB0byBnZXQgcHJvcGVyIHN5bmMgYmV0d2VlbiBkYXRhIGFuZCB0aW1lc3RhbXBzICovCisgICAgZGVsdGEgICAgPSBwdHMgLSBzLT5wdHMgLSBnZXRfZGVsYXkocyk7CisgICAgb3V0X3NpemUgPSBhdnJlc2FtcGxlX2F2YWlsYWJsZShzLT5hdnIpOworCisgICAgaWYgKGxhYnMoZGVsdGEpID4gcy0+bWluX2RlbHRhIHx8CisgICAgICAgIChzLT5maXJzdF9mcmFtZSAmJiBkZWx0YSAmJiBzLT5maXJzdF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiRGlzY29udGludWl0eSAtICUiUFJJZDY0IiBzYW1wbGVzLlxuIiwgZGVsdGEpOworICAgICAgICBvdXRfc2l6ZSA9IGF2X2NsaXBsX2ludDMyKChpbnQ2NF90KW91dF9zaXplICsgZGVsdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzLT5yZXNhbXBsZSkgeworICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBjb21wZW5zYXRpb24gaWYgZGVsdGEgaXMgbm9uLXplcm8KKyAgICAgICAgICAgIGludCBkZWxheSA9IGdldF9kZWxheShzKTsKKyAgICAgICAgICAgIGludCBjb21wID0gcy0+Y29tcCArIGF2X2NsaXAoZGVsdGEgKiBpbmxpbmstPnNhbXBsZV9yYXRlIC8gZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zLT5tYXhfY29tcCwgcy0+bWF4X2NvbXApOworICAgICAgICAgICAgaWYgKGNvbXAgIT0gcy0+Y29tcCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ29tcGVuc2F0aW5nICVkIHNhbXBsZXMgcGVyIHNlY29uZC5cbiIsIGNvbXApOworICAgICAgICAgICAgICAgIGlmIChhdnJlc2FtcGxlX3NldF9jb21wZW5zYXRpb24ocy0+YXZyLCBjb21wLCBpbmxpbmstPnNhbXBsZV9yYXRlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmNvbXAgPSBjb21wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBhZGp1c3QgUFRTIHRvIGF2b2lkIG1vbm90b25pY2l0eSBlcnJvcnMgd2l0aCBpbnB1dCBQVFMgaml0dGVyCisgICAgICAgIHB0cyAtPSBkZWx0YTsKKyAgICAgICAgZGVsdGEgPSAwOworICAgIH0KKworICAgIGlmIChvdXRfc2l6ZSA+IDApIHsKKyAgICAgICAgQVZGcmFtZSAqYnVmX291dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgb3V0X3NpemUpOworICAgICAgICBpZiAoIWJ1Zl9vdXQpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5maXJzdF9mcmFtZSAmJiBkZWx0YSA+IDApIHsKKyAgICAgICAgICAgIGludCBwbGFuYXIgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihidWZfb3V0LT5mb3JtYXQpOworICAgICAgICAgICAgaW50IHBsYW5lcyA9IHBsYW5hciA/ICBuYl9jaGFubmVscyA6IDE7CisgICAgICAgICAgICBpbnQgYmxvY2tfc2l6ZSA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGJ1Zl9vdXQtPmZvcm1hdCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxhbmFyID8gMSA6IG5iX2NoYW5uZWxzKTsKKworICAgICAgICAgICAgaW50IGNoOworCisgICAgICAgICAgICBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKGJ1Zl9vdXQtPmV4dGVuZGVkX2RhdGEsIDAsIGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9jaGFubmVscywgYnVmLT5mb3JtYXQpOworCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBwbGFuZXM7IGNoKyspCisgICAgICAgICAgICAgICAgYnVmX291dC0+ZXh0ZW5kZWRfZGF0YVtjaF0gKz0gZGVsdGEgKiBibG9ja19zaXplOworCisgICAgICAgICAgICBhdnJlc2FtcGxlX3JlYWQocy0+YXZyLCBidWZfb3V0LT5leHRlbmRlZF9kYXRhLCBvdXRfc2l6ZSk7CisKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHBsYW5lczsgY2grKykKKyAgICAgICAgICAgICAgICBidWZfb3V0LT5leHRlbmRlZF9kYXRhW2NoXSAtPSBkZWx0YSAqIGJsb2NrX3NpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdnJlc2FtcGxlX3JlYWQocy0+YXZyLCBidWZfb3V0LT5leHRlbmRlZF9kYXRhLCBvdXRfc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChkZWx0YSA+IDApIHsKKyAgICAgICAgICAgICAgICBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKGJ1Zl9vdXQtPmV4dGVuZGVkX2RhdGEsIG91dF9zaXplIC0gZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSwgbmJfY2hhbm5lbHMsIGJ1Zi0+Zm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBidWZfb3V0LT5wdHMgPSBzLT5wdHM7CisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBidWZfb3V0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHMtPmdvdF9vdXRwdXQgPSAxOworICAgIH0gZWxzZSBpZiAoYXZyZXNhbXBsZV9hdmFpbGFibGUocy0+YXZyKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIk5vbi1tb25vdG9ub3VzIHRpbWVzdGFtcHMsIGRyb3BwaW5nICIKKyAgICAgICAgICAgICAgICJ3aG9sZSBidWZmZXIuXG4iKTsKKyAgICB9CisKKyAgICAvKiBkcmFpbiBhbnkgcmVtYWluaW5nIGJ1ZmZlcmVkIGRhdGEgKi8KKyAgICBhdnJlc2FtcGxlX3JlYWQocy0+YXZyLCBOVUxMLCBhdnJlc2FtcGxlX2F2YWlsYWJsZShzLT5hdnIpKTsKKworICAgIG5ld19wdHMgPSBwdHMgLSBhdnJlc2FtcGxlX2dldF9kZWxheShzLT5hdnIpOworICAgIC8qIGNoZWNrIGZvciBzLT5wdHMgbW9ub3RvbmljaXR5ICovCisgICAgaWYgKG5ld19wdHMgPiBzLT5wdHMpIHsKKyAgICAgICAgcy0+cHRzID0gbmV3X3B0czsKKyAgICAgICAgcmV0ID0gYXZyZXNhbXBsZV9jb252ZXJ0KHMtPmF2ciwgTlVMTCwgMCwgMCwgYnVmLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5saW5lc2l6ZVswXSwgYnVmLT5uYl9zYW1wbGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIk5vbi1tb25vdG9ub3VzIHRpbWVzdGFtcHMsIGRyb3BwaW5nICIKKyAgICAgICAgICAgICAgICJ3aG9sZSBidWZmZXIuXG4iKTsKKyAgICAgICAgcmV0ID0gMDsKKyAgICB9CisKKyAgICBzLT5maXJzdF9mcmFtZSA9IDA7CitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfYXN5bmN0c19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgPSBmaWx0ZXJfZnJhbWUKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfYXN5bmN0c19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX3Byb3BzLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hc3luY3RzID0geworICAgIC5uYW1lICAgICAgICA9ICJhc3luY3RzIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3luYyBhdWRpbyBkYXRhIHRvIHRpbWVzdGFtcHMiKSwKKyAgICAuaW5pdCAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICA9IHVuaW5pdCwKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoQVN5bmNDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgPSAmYXN5bmN0c19jbGFzcywKKyAgICAuaW5wdXRzICAgICAgPSBhdmZpbHRlcl9hZl9hc3luY3RzX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgPSBhdmZpbHRlcl9hZl9hc3luY3RzX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2F0ZW1wby5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2F0ZW1wby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZDBjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYXRlbXBvLmMKQEAgLTAsMCArMSwxMjAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdmVsIEtvc2hldm95IDxwa29zaGV2b3kgYXQgZ21haWwgZG90IGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogdGVtcG8gc2NhbGluZyBhdWRpbyBmaWx0ZXIgLS0gYW4gaW1wbGVtZW50YXRpb24gb2YgV1NPTEEgYWxnb3JpdGhtCisgKgorICogQmFzZWQgb24gTUlUIGxpY2Vuc2VkIHlhZUF1ZGlvVGVtcG9GaWx0ZXIuaCBhbmQgeWFlQXVkaW9GcmFnbWVudC5oCisgKiBmcm9tIEFwcHJlbnRpY2UgVmlkZW8gcGxheWVyIGJ5IFBhdmVsIEtvc2hldm95LgorICogaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYXBwcmVudGljZXZpZGVvLworICoKKyAqIEFuIGV4cGxhbmF0aW9uIG9mIFNPTEEgYWxnb3JpdGhtIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5zdXJpbmEubmV0L2FydGljbGUvdGltZS1hbmQtcGl0Y2gtc2NhbGluZy5odG1sCisgKgorICogV1NPTEEgaXMgdmVyeSBzaW1pbGFyIHRvIFNPTEEsIG9ubHkgb25lIG1ham9yIGRpZmZlcmVuY2UgZXhpc3RzIGJldHdlZW4KKyAqIHRoZXNlIGFsZ29yaXRobXMuICBTT0xBIHNoaWZ0cyBhdWRpbyBmcmFnbWVudHMgYWxvbmcgdGhlIG91dHB1dCBzdHJlYW0sCisgKiB3aGVyZSBhcyBXU09MQSBzaGlmdHMgYXVkaW8gZnJhZ21lbnRzIGFsb25nIHRoZSBpbnB1dCBzdHJlYW0uCisgKgorICogVGhlIGFkdmFudGFnZSBvZiBXU09MQSBhbGdvcml0aG0gaXMgdGhhdCB0aGUgb3ZlcmxhcCByZWdpb24gc2l6ZSBpcworICogYWx3YXlzIHRoZSBzYW1lLCB0aGVyZWZvcmUgdGhlIGJsZW5kaW5nIGZ1bmN0aW9uIGlzIGNvbnN0YW50IGFuZAorICogY2FuIGJlIHByZWNvbXB1dGVkLgorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZmZnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qKgorICogQSBmcmFnbWVudCBvZiBhdWRpbyB3YXZlZm9ybQorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLy8gaW5kZXggb2YgdGhlIGZpcnN0IHNhbXBsZSBvZiB0aGlzIGZyYWdtZW50IGluIHRoZSBvdmVyYWxsIHdhdmVmb3JtOworICAgIC8vIDA6IGlucHV0IHNhbXBsZSBwb3NpdGlvbgorICAgIC8vIDE6IG91dHB1dCBzYW1wbGUgcG9zaXRpb24KKyAgICBpbnQ2NF90IHBvc2l0aW9uWzJdOworCisgICAgLy8gb3JpZ2luYWwgcGFja2VkIG11bHRpLWNoYW5uZWwgc2FtcGxlczoKKyAgICB1aW50OF90ICpkYXRhOworCisgICAgLy8gbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhpcyBmcmFnbWVudDoKKyAgICBpbnQgbnNhbXBsZXM7CisKKyAgICAvLyByREZUIHRyYW5zZm9ybSBvZiB0aGUgZG93bi1taXhlZCBtb25vIGZyYWdtZW50LCB1c2VkIGZvcgorICAgIC8vIGZhc3Qgd2F2ZWZvcm0gYWxpZ25tZW50IHZpYSBjb3JyZWxhdGlvbiBpbiBmcmVxdWVuY3kgZG9tYWluOgorICAgIEZGVFNhbXBsZSAqeGRhdDsKK30gQXVkaW9GcmFnbWVudDsKKworLyoqCisgKiBGaWx0ZXIgc3RhdGUgbWFjaGluZSBzdGF0ZXMKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBZQUVfTE9BRF9GUkFHTUVOVCwKKyAgICBZQUVfQURKVVNUX1BPU0lUSU9OLAorICAgIFlBRV9SRUxPQURfRlJBR01FTlQsCisgICAgWUFFX09VVFBVVF9PVkVSTEFQX0FERCwKKyAgICBZQUVfRkxVU0hfT1VUUFVULAorfSBGaWx0ZXJTdGF0ZTsKKworLyoqCisgKiBGaWx0ZXIgc3RhdGUgbWFjaGluZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICAvLyByaW5nLWJ1ZmZlciBvZiBpbnB1dCBzYW1wbGVzLCBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIHRpbWVzCisgICAgLy8gaW5wdXQgZnJhZ21lbnQgcG9zaXRpb24gbWF5IGJlIGFkanVzdGVkIGJhY2t3YXJkczoKKyAgICB1aW50OF90ICpidWZmZXI7CisKKyAgICAvLyByaW5nLWJ1ZmZlciBtYXhpbXVtIGNhcGFjaXR5LCBleHByZXNzZWQgaW4gc2FtcGxlIHJhdGUgdGltZSBiYXNlOgorICAgIGludCByaW5nOworCisgICAgLy8gcmluZy1idWZmZXIgaG91c2Uga2VlcGluZzoKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgaGVhZDsKKyAgICBpbnQgdGFpbDsKKworICAgIC8vIDA6IGlucHV0IHNhbXBsZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSByaW5nIGJ1ZmZlciB0YWlsCisgICAgLy8gMTogb3V0cHV0IHNhbXBsZSBwb3NpdGlvbgorICAgIGludDY0X3QgcG9zaXRpb25bMl07CisKKyAgICAvLyBzYW1wbGUgZm9ybWF0OgorICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgZm9ybWF0OworCisgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWxzOgorICAgIGludCBjaGFubmVsczsKKworICAgIC8vIHJvdyBvZiBieXRlcyB0byBza2lwIGZyb20gb25lIHNhbXBsZSB0byBuZXh0LCBhY3Jvc3MgbXVsdHBsZSBjaGFubmVsczsKKyAgICAvLyBzdHJpZGUgPSAobnVtYmVyLW9mLWNoYW5uZWxzICogYml0cy1wZXItc2FtcGxlLXBlci1jaGFubmVsKSAvIDgKKyAgICBpbnQgc3RyaWRlOworCisgICAgLy8gZnJhZ21lbnQgd2luZG93IHNpemUsIHBvd2VyLW9mLXR3byBpbnRlZ2VyOgorICAgIGludCB3aW5kb3c7CisKKyAgICAvLyBIYW5uIHdpbmRvdyBjb2VmZmljaWVudHMsIGZvciBmZWF0aGVyaW5nCisgICAgLy8gKGJsZW5kaW5nKSB0aGUgb3ZlcmxhcHBpbmcgZnJhZ21lbnQgcmVnaW9uOgorICAgIGZsb2F0ICpoYW5uOworCisgICAgLy8gdGVtcG8gc2NhbGluZyBmYWN0b3I6CisgICAgZG91YmxlIHRlbXBvOworCisgICAgLy8gYSBzbmFwc2hvdCBvZiBwcmV2aW91cyBmcmFnbWVudCBpbnB1dCBhbmQgb3V0cHV0IHBvc2l0aW9uIHZhbHVlcworICAgIC8vIGNhcHR1cmVkIHdoZW4gdGhlIHRlbXBvIHNjYWxlIGZhY3RvciB3YXMgc2V0IG1vc3QgcmVjZW50bHk6CisgICAgaW50NjRfdCBvcmlnaW5bMl07CisKKyAgICAvLyBjdXJyZW50L3ByZXZpb3VzIGZyYWdtZW50IHJpbmctYnVmZmVyOgorICAgIEF1ZGlvRnJhZ21lbnQgZnJhZ1syXTsKKworICAgIC8vIGN1cnJlbnQgZnJhZ21lbnQgaW5kZXg6CisgICAgdWludDY0X3QgbmZyYWc7CisKKyAgICAvLyBjdXJyZW50IHN0YXRlOgorICAgIEZpbHRlclN0YXRlIHN0YXRlOworCisgICAgLy8gZm9yIGZhc3QgY29ycmVsYXRpb24gY2FsY3VsYXRpb24gaW4gZnJlcXVlbmN5IGRvbWFpbjoKKyAgICBSREZUQ29udGV4dCAqcmVhbF90b19jb21wbGV4OworICAgIFJERlRDb250ZXh0ICpjb21wbGV4X3RvX3JlYWw7CisgICAgRkZUU2FtcGxlICpjb3JyZWxhdGlvbjsKKworICAgIC8vIGZvciBtYW5hZ2luZyBBVkZpbHRlclBhZC5yZXF1ZXN0X2ZyYW1lIGFuZCBBVkZpbHRlclBhZC5maWx0ZXJfZnJhbWUKKyAgICBBVkZyYW1lICpkc3RfYnVmZmVyOworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICB1aW50OF90ICpkc3RfZW5kOworICAgIHVpbnQ2NF90IG5zYW1wbGVzX2luOworICAgIHVpbnQ2NF90IG5zYW1wbGVzX291dDsKK30gQVRlbXBvQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQVRlbXBvQ29udGV4dCwgeCkKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGF0ZW1wb19vcHRpb25zW10gPSB7CisgICAgeyAidGVtcG8iLCAic2V0IHRlbXBvIHNjYWxlIGZhY3RvciIsCisgICAgICBPRkZTRVQodGVtcG8pLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDEuMCB9LCAwLjUsIDIuMCwKKyAgICAgIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhhdGVtcG8pOworCitpbmxpbmUgc3RhdGljIEF1ZGlvRnJhZ21lbnQgKnlhZV9jdXJyX2ZyYWcoQVRlbXBvQ29udGV4dCAqYXRlbXBvKQoreworICAgIHJldHVybiAmYXRlbXBvLT5mcmFnW2F0ZW1wby0+bmZyYWcgJSAyXTsKK30KKworaW5saW5lIHN0YXRpYyBBdWRpb0ZyYWdtZW50ICp5YWVfcHJldl9mcmFnKEFUZW1wb0NvbnRleHQgKmF0ZW1wbykKK3sKKyAgICByZXR1cm4gJmF0ZW1wby0+ZnJhZ1soYXRlbXBvLT5uZnJhZyArIDEpICUgMl07Cit9CisKKy8qKgorICogUmVzZXQgZmlsdGVyIHRvIGluaXRpYWwgc3RhdGUsIGRvIG5vdCBkZWFsbG9jYXRlIGV4aXN0aW5nIGxvY2FsIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIHlhZV9jbGVhcihBVGVtcG9Db250ZXh0ICphdGVtcG8pCit7CisgICAgYXRlbXBvLT5zaXplID0gMDsKKyAgICBhdGVtcG8tPmhlYWQgPSAwOworICAgIGF0ZW1wby0+dGFpbCA9IDA7CisKKyAgICBhdGVtcG8tPm5mcmFnID0gMDsKKyAgICBhdGVtcG8tPnN0YXRlID0gWUFFX0xPQURfRlJBR01FTlQ7CisKKyAgICBhdGVtcG8tPnBvc2l0aW9uWzBdID0gMDsKKyAgICBhdGVtcG8tPnBvc2l0aW9uWzFdID0gMDsKKworICAgIGF0ZW1wby0+b3JpZ2luWzBdID0gMDsKKyAgICBhdGVtcG8tPm9yaWdpblsxXSA9IDA7CisKKyAgICBhdGVtcG8tPmZyYWdbMF0ucG9zaXRpb25bMF0gPSAwOworICAgIGF0ZW1wby0+ZnJhZ1swXS5wb3NpdGlvblsxXSA9IDA7CisgICAgYXRlbXBvLT5mcmFnWzBdLm5zYW1wbGVzICAgID0gMDsKKworICAgIGF0ZW1wby0+ZnJhZ1sxXS5wb3NpdGlvblswXSA9IDA7CisgICAgYXRlbXBvLT5mcmFnWzFdLnBvc2l0aW9uWzFdID0gMDsKKyAgICBhdGVtcG8tPmZyYWdbMV0ubnNhbXBsZXMgICAgPSAwOworCisgICAgLy8gc2hpZnQgbGVmdCBwb3NpdGlvbiBvZiAxc3QgZnJhZ21lbnQgYnkgaGFsZiBhIHdpbmRvdworICAgIC8vIHNvIHRoYXQgbm8gcmUtbm9ybWFsaXphdGlvbiB3b3VsZCBiZSByZXF1aXJlZCBmb3IKKyAgICAvLyB0aGUgbGVmdCBoYWxmIG9mIHRoZSAxc3QgZnJhZ21lbnQ6CisgICAgYXRlbXBvLT5mcmFnWzBdLnBvc2l0aW9uWzBdID0gLShpbnQ2NF90KShhdGVtcG8tPndpbmRvdyAvIDIpOworICAgIGF0ZW1wby0+ZnJhZ1swXS5wb3NpdGlvblsxXSA9IC0oaW50NjRfdCkoYXRlbXBvLT53aW5kb3cgLyAyKTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmF0ZW1wby0+ZHN0X2J1ZmZlcik7CisgICAgYXRlbXBvLT5kc3QgICAgID0gTlVMTDsKKyAgICBhdGVtcG8tPmRzdF9lbmQgPSBOVUxMOworCisgICAgYXRlbXBvLT5uc2FtcGxlc19pbiAgICAgICA9IDA7CisgICAgYXRlbXBvLT5uc2FtcGxlc19vdXQgICAgICA9IDA7Cit9CisKKy8qKgorICogUmVzZXQgZmlsdGVyIHRvIGluaXRpYWwgc3RhdGUgYW5kIGRlYWxsb2NhdGUgYWxsIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIHlhZV9yZWxlYXNlX2J1ZmZlcnMoQVRlbXBvQ29udGV4dCAqYXRlbXBvKQoreworICAgIHlhZV9jbGVhcihhdGVtcG8pOworCisgICAgYXZfZnJlZXAoJmF0ZW1wby0+ZnJhZ1swXS5kYXRhKTsKKyAgICBhdl9mcmVlcCgmYXRlbXBvLT5mcmFnWzFdLmRhdGEpOworICAgIGF2X2ZyZWVwKCZhdGVtcG8tPmZyYWdbMF0ueGRhdCk7CisgICAgYXZfZnJlZXAoJmF0ZW1wby0+ZnJhZ1sxXS54ZGF0KTsKKworICAgIGF2X2ZyZWVwKCZhdGVtcG8tPmJ1ZmZlcik7CisgICAgYXZfZnJlZXAoJmF0ZW1wby0+aGFubik7CisgICAgYXZfZnJlZXAoJmF0ZW1wby0+Y29ycmVsYXRpb24pOworCisgICAgYXZfcmRmdF9lbmQoYXRlbXBvLT5yZWFsX3RvX2NvbXBsZXgpOworICAgIGF0ZW1wby0+cmVhbF90b19jb21wbGV4ID0gTlVMTDsKKworICAgIGF2X3JkZnRfZW5kKGF0ZW1wby0+Y29tcGxleF90b19yZWFsKTsKKyAgICBhdGVtcG8tPmNvbXBsZXhfdG9fcmVhbCA9IE5VTEw7Cit9CisKKy8qIGF2X3JlYWxsb2MgaXMgbm90IGFsaWduZWQgZW5vdWdoOyBmb3J0dW5hdGVseSwgdGhlIGRhdGEgZG9lcyBub3QgbmVlZCB0bworICogYmUgcHJlc2VydmVkICovCisjZGVmaW5lIFJFX01BTExPQ19PUl9GQUlMKGZpZWxkLCBmaWVsZF9zaXplKSAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXZfZnJlZXAoJmZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZpZWxkID0gYXZfbWFsbG9jKGZpZWxkX3NpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIWZpZWxkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHlhZV9yZWxlYXNlX2J1ZmZlcnMoYXRlbXBvKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisvKioKKyAqIFByZXBhcmUgZmlsdGVyIGZvciBwcm9jZXNzaW5nIGF1ZGlvIGRhdGEgb2YgZ2l2ZW4gZm9ybWF0LAorICogc2FtcGxlIHJhdGUgYW5kIG51bWJlciBvZiBjaGFubmVscy4KKyAqLworc3RhdGljIGludCB5YWVfcmVzZXQoQVRlbXBvQ29udGV4dCAqYXRlbXBvLAorICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpCit7CisgICAgY29uc3QgaW50IHNhbXBsZV9zaXplID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICB1aW50MzJfdCBubGV2ZWxzICA9IDA7CisgICAgdWludDMyX3QgcG90OworICAgIGludCBpOworCisgICAgYXRlbXBvLT5mb3JtYXQgICA9IGZvcm1hdDsKKyAgICBhdGVtcG8tPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgYXRlbXBvLT5zdHJpZGUgICA9IHNhbXBsZV9zaXplICogY2hhbm5lbHM7CisKKyAgICAvLyBwaWNrIGEgc2VnbWVudCB3aW5kb3cgc2l6ZToKKyAgICBhdGVtcG8tPndpbmRvdyA9IHNhbXBsZV9yYXRlIC8gMjQ7CisKKyAgICAvLyBhZGp1c3Qgd2luZG93IHNpemUgdG8gYmUgYSBwb3dlci1vZi10d28gaW50ZWdlcjoKKyAgICBubGV2ZWxzID0gYXZfbG9nMihhdGVtcG8tPndpbmRvdyk7CisgICAgcG90ID0gMSA8PCBubGV2ZWxzOworICAgIGF2X2Fzc2VydDAocG90IDw9IGF0ZW1wby0+d2luZG93KTsKKworICAgIGlmIChwb3QgPCBhdGVtcG8tPndpbmRvdykgeworICAgICAgICBhdGVtcG8tPndpbmRvdyA9IHBvdCAqIDI7CisgICAgICAgIG5sZXZlbHMrKzsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIGF1ZGlvIGZyYWdtZW50IGJ1ZmZlcnM6CisgICAgUkVfTUFMTE9DX09SX0ZBSUwoYXRlbXBvLT5mcmFnWzBdLmRhdGEsIGF0ZW1wby0+d2luZG93ICogYXRlbXBvLT5zdHJpZGUpOworICAgIFJFX01BTExPQ19PUl9GQUlMKGF0ZW1wby0+ZnJhZ1sxXS5kYXRhLCBhdGVtcG8tPndpbmRvdyAqIGF0ZW1wby0+c3RyaWRlKTsKKyAgICBSRV9NQUxMT0NfT1JfRkFJTChhdGVtcG8tPmZyYWdbMF0ueGRhdCwgYXRlbXBvLT53aW5kb3cgKiBzaXplb2YoRkZUQ29tcGxleCkpOworICAgIFJFX01BTExPQ19PUl9GQUlMKGF0ZW1wby0+ZnJhZ1sxXS54ZGF0LCBhdGVtcG8tPndpbmRvdyAqIHNpemVvZihGRlRDb21wbGV4KSk7CisKKyAgICAvLyBpbml0aWFsaXplIHJERlQgY29udGV4dHM6CisgICAgYXZfcmRmdF9lbmQoYXRlbXBvLT5yZWFsX3RvX2NvbXBsZXgpOworICAgIGF0ZW1wby0+cmVhbF90b19jb21wbGV4ID0gTlVMTDsKKworICAgIGF2X3JkZnRfZW5kKGF0ZW1wby0+Y29tcGxleF90b19yZWFsKTsKKyAgICBhdGVtcG8tPmNvbXBsZXhfdG9fcmVhbCA9IE5VTEw7CisKKyAgICBhdGVtcG8tPnJlYWxfdG9fY29tcGxleCA9IGF2X3JkZnRfaW5pdChubGV2ZWxzICsgMSwgREZUX1IyQyk7CisgICAgaWYgKCFhdGVtcG8tPnJlYWxfdG9fY29tcGxleCkgeworICAgICAgICB5YWVfcmVsZWFzZV9idWZmZXJzKGF0ZW1wbyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgYXRlbXBvLT5jb21wbGV4X3RvX3JlYWwgPSBhdl9yZGZ0X2luaXQobmxldmVscyArIDEsIElERlRfQzJSKTsKKyAgICBpZiAoIWF0ZW1wby0+Y29tcGxleF90b19yZWFsKSB7CisgICAgICAgIHlhZV9yZWxlYXNlX2J1ZmZlcnMoYXRlbXBvKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBSRV9NQUxMT0NfT1JfRkFJTChhdGVtcG8tPmNvcnJlbGF0aW9uLCBhdGVtcG8tPndpbmRvdyAqIHNpemVvZihGRlRDb21wbGV4KSk7CisKKyAgICBhdGVtcG8tPnJpbmcgPSBhdGVtcG8tPndpbmRvdyAqIDM7CisgICAgUkVfTUFMTE9DX09SX0ZBSUwoYXRlbXBvLT5idWZmZXIsIGF0ZW1wby0+cmluZyAqIGF0ZW1wby0+c3RyaWRlKTsKKworICAgIC8vIGluaXRpYWxpemUgdGhlIEhhbm4gd2luZG93IGZ1bmN0aW9uOgorICAgIFJFX01BTExPQ19PUl9GQUlMKGF0ZW1wby0+aGFubiwgYXRlbXBvLT53aW5kb3cgKiBzaXplb2YoZmxvYXQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdGVtcG8tPndpbmRvdzsgaSsrKSB7CisgICAgICAgIGRvdWJsZSB0ID0gKGRvdWJsZSlpIC8gKGRvdWJsZSkoYXRlbXBvLT53aW5kb3cgLSAxKTsKKyAgICAgICAgZG91YmxlIGggPSAwLjUgKiAoMS4wIC0gY29zKDIuMCAqIE1fUEkgKiB0KSk7CisgICAgICAgIGF0ZW1wby0+aGFubltpXSA9IChmbG9hdCloOworICAgIH0KKworICAgIHlhZV9jbGVhcihhdGVtcG8pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHlhZV9zZXRfdGVtcG8oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmFyZ190ZW1wbykKK3sKKyAgICBjb25zdCBBdWRpb0ZyYWdtZW50ICpwcmV2OworICAgIEFUZW1wb0NvbnRleHQgKmF0ZW1wbyA9IGN0eC0+cHJpdjsKKyAgICBjaGFyICAgKnRhaWwgPSBOVUxMOworICAgIGRvdWJsZSB0ZW1wbyA9IGF2X3N0cnRvZChhcmdfdGVtcG8sICZ0YWlsKTsKKworICAgIGlmICh0YWlsICYmICp0YWlsKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdGVtcG8gdmFsdWUgJyVzJ1xuIiwgYXJnX3RlbXBvKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAodGVtcG8gPCAwLjUgfHwgdGVtcG8gPiAyLjApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVGVtcG8gdmFsdWUgJWYgZXhjZWVkcyBbMC41LCAyLjBdIHJhbmdlXG4iLAorICAgICAgICAgICAgICAgdGVtcG8pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHByZXYgPSB5YWVfcHJldl9mcmFnKGF0ZW1wbyk7CisgICAgYXRlbXBvLT5vcmlnaW5bMF0gPSBwcmV2LT5wb3NpdGlvblswXSArIGF0ZW1wby0+d2luZG93IC8gMjsKKyAgICBhdGVtcG8tPm9yaWdpblsxXSA9IHByZXYtPnBvc2l0aW9uWzFdICsgYXRlbXBvLT53aW5kb3cgLyAyOworICAgIGF0ZW1wby0+dGVtcG8gPSB0ZW1wbzsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBBIGhlbHBlciBtYWNybyBmb3IgaW5pdGlhbGl6aW5nIGNvbXBsZXggZGF0YSBidWZmZXIgd2l0aCBzY2FsYXIgZGF0YQorICogb2YgYSBnaXZlbiB0eXBlLgorICovCisjZGVmaW5lIHlhZV9pbml0X3hkYXQoc2NhbGFyX3R5cGUsIHNjYWxhcl9tYXgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19lbmQgPSBzcmMgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmcmFnLT5uc2FtcGxlcyAqIGF0ZW1wby0+Y2hhbm5lbHMgKiBzaXplb2Yoc2NhbGFyX3R5cGUpOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZGVFNhbXBsZSAqeGRhdCA9IGZyYWctPnhkYXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNjYWxhcl90eXBlIHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChhdGVtcG8tPmNoYW5uZWxzID09IDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKDsgc3JjIDwgc3JjX2VuZDsgeGRhdCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdG1wID0gKihjb25zdCBzY2FsYXJfdHlwZSAqKXNyYzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3JjICs9IHNpemVvZihzY2FsYXJfdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKnhkYXQgPSAoRkZUU2FtcGxlKXRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBGRlRTYW1wbGUgcywgbWF4LCB0aSwgc2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKDsgc3JjIDwgc3JjX2VuZDsgeGRhdCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdG1wID0gKihjb25zdCBzY2FsYXJfdHlwZSAqKXNyYzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3JjICs9IHNpemVvZihzY2FsYXJfdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbWF4ID0gKEZGVFNhbXBsZSl0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcyA9IEZGTUlOKChGRlRTYW1wbGUpc2NhbGFyX21heCwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGRlRTYW1wbGUpZmFic2YobWF4KSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGF0ZW1wby0+Y2hhbm5lbHM7IGkrKykgeyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHRtcCA9ICooY29uc3Qgc2NhbGFyX3R5cGUgKilzcmM7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHNyYyArPSBzaXplb2Yoc2NhbGFyX3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHRpID0gKEZGVFNhbXBsZSl0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHNpID0gRkZNSU4oKEZGVFNhbXBsZSlzY2FsYXJfbWF4LCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZGVFNhbXBsZSlmYWJzZih0aSkpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmIChzIDwgc2kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBzICAgPSBzaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSB0aTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKnhkYXQgPSBtYXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBJbml0aWFsaXplIGNvbXBsZXggZGF0YSBidWZmZXIgb2YgYSBnaXZlbiBhdWRpbyBmcmFnbWVudAorICogd2l0aCBkb3duLW1peGVkIG1vbm8gZGF0YSBvZiBhcHByb3ByaWF0ZSBzY2FsYXIgdHlwZS4KKyAqLworc3RhdGljIHZvaWQgeWFlX2Rvd25taXgoQVRlbXBvQ29udGV4dCAqYXRlbXBvLCBBdWRpb0ZyYWdtZW50ICpmcmFnKQoreworICAgIC8vIHNob3J0Y3V0czoKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSBmcmFnLT5kYXRhOworCisgICAgLy8gaW5pdCBjb21wbGV4IGRhdGEgYnVmZmVyIHVzZWQgZm9yIEZGVCBhbmQgQ29ycmVsYXRpb246CisgICAgbWVtc2V0KGZyYWctPnhkYXQsIDAsIHNpemVvZihGRlRDb21wbGV4KSAqIGF0ZW1wby0+d2luZG93KTsKKworICAgIGlmIChhdGVtcG8tPmZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX1U4KSB7CisgICAgICAgIHlhZV9pbml0X3hkYXQodWludDhfdCwgMTI3KTsKKyAgICB9IGVsc2UgaWYgKGF0ZW1wby0+Zm9ybWF0ID09IEFWX1NBTVBMRV9GTVRfUzE2KSB7CisgICAgICAgIHlhZV9pbml0X3hkYXQoaW50MTZfdCwgMzI3NjcpOworICAgIH0gZWxzZSBpZiAoYXRlbXBvLT5mb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIpIHsKKyAgICAgICAgeWFlX2luaXRfeGRhdChpbnQsIDIxNDc0ODM2NDcpOworICAgIH0gZWxzZSBpZiAoYXRlbXBvLT5mb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9GTFQpIHsKKyAgICAgICAgeWFlX2luaXRfeGRhdChmbG9hdCwgMSk7CisgICAgfSBlbHNlIGlmIChhdGVtcG8tPmZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX0RCTCkgeworICAgICAgICB5YWVfaW5pdF94ZGF0KGRvdWJsZSwgMSk7CisgICAgfQorfQorCisvKioKKyAqIFBvcHVsYXRlIHRoZSBpbnRlcm5hbCBkYXRhIGJ1ZmZlciBvbiBhcy1uZWVkZWQgYmFzaXMuCisgKgorICogQHJldHVybgorICogICAwIGlmIHJlcXVlc3RlZCBkYXRhIHdhcyBhbHJlYWR5IGF2YWlsYWJsZSBvciB3YXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZCwKKyAqICAgQVZFUlJPUihFQUdBSU4pIGlmIG1vcmUgaW5wdXQgZGF0YSBpcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGludCB5YWVfbG9hZF9kYXRhKEFUZW1wb0NvbnRleHQgKmF0ZW1wbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqc3JjX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc3RvcF9oZXJlKQoreworICAgIC8vIHNob3J0Y3V0OgorICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9ICpzcmNfcmVmOworICAgIGNvbnN0IGludCByZWFkX3NpemUgPSBzdG9wX2hlcmUgLSBhdGVtcG8tPnBvc2l0aW9uWzBdOworCisgICAgaWYgKHN0b3BfaGVyZSA8PSBhdGVtcG8tPnBvc2l0aW9uWzBdKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIHNhbXBsZXMgYXJlIG5vdCBleHBlY3RlZCB0byBiZSBza2lwcGVkOgorICAgIGF2X2Fzc2VydDAocmVhZF9zaXplIDw9IGF0ZW1wby0+cmluZyk7CisKKyAgICB3aGlsZSAoYXRlbXBvLT5wb3NpdGlvblswXSA8IHN0b3BfaGVyZSAmJiBzcmMgPCBzcmNfZW5kKSB7CisgICAgICAgIGludCBzcmNfc2FtcGxlcyA9IChzcmNfZW5kIC0gc3JjKSAvIGF0ZW1wby0+c3RyaWRlOworCisgICAgICAgIC8vIGxvYWQgZGF0YSBwaWVjZS13aXNlLCBpbiBvcmRlciB0byBhdm9pZCBjb21wbGljYXRpbmcgdGhlIGxvZ2ljOgorICAgICAgICBpbnQgbnNhbXBsZXMgPSBGRk1JTihyZWFkX3NpemUsIHNyY19zYW1wbGVzKTsKKyAgICAgICAgaW50IG5hOworICAgICAgICBpbnQgbmI7CisKKyAgICAgICAgbnNhbXBsZXMgPSBGRk1JTihuc2FtcGxlcywgYXRlbXBvLT5yaW5nKTsKKyAgICAgICAgbmEgPSBGRk1JTihuc2FtcGxlcywgYXRlbXBvLT5yaW5nIC0gYXRlbXBvLT50YWlsKTsKKyAgICAgICAgbmIgPSBGRk1JTihuc2FtcGxlcyAtIG5hLCBhdGVtcG8tPnJpbmcpOworCisgICAgICAgIGlmIChuYSkgeworICAgICAgICAgICAgdWludDhfdCAqYSA9IGF0ZW1wby0+YnVmZmVyICsgYXRlbXBvLT50YWlsICogYXRlbXBvLT5zdHJpZGU7CisgICAgICAgICAgICBtZW1jcHkoYSwgc3JjLCBuYSAqIGF0ZW1wby0+c3RyaWRlKTsKKworICAgICAgICAgICAgc3JjICs9IG5hICogYXRlbXBvLT5zdHJpZGU7CisgICAgICAgICAgICBhdGVtcG8tPnBvc2l0aW9uWzBdICs9IG5hOworCisgICAgICAgICAgICBhdGVtcG8tPnNpemUgPSBGRk1JTihhdGVtcG8tPnNpemUgKyBuYSwgYXRlbXBvLT5yaW5nKTsKKyAgICAgICAgICAgIGF0ZW1wby0+dGFpbCA9IChhdGVtcG8tPnRhaWwgKyBuYSkgJSBhdGVtcG8tPnJpbmc7CisgICAgICAgICAgICBhdGVtcG8tPmhlYWQgPQorICAgICAgICAgICAgICAgIGF0ZW1wby0+c2l6ZSA8IGF0ZW1wby0+cmluZyA/CisgICAgICAgICAgICAgICAgYXRlbXBvLT50YWlsIC0gYXRlbXBvLT5zaXplIDoKKyAgICAgICAgICAgICAgICBhdGVtcG8tPnRhaWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmIpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmIgPSBhdGVtcG8tPmJ1ZmZlcjsKKyAgICAgICAgICAgIG1lbWNweShiLCBzcmMsIG5iICogYXRlbXBvLT5zdHJpZGUpOworCisgICAgICAgICAgICBzcmMgKz0gbmIgKiBhdGVtcG8tPnN0cmlkZTsKKyAgICAgICAgICAgIGF0ZW1wby0+cG9zaXRpb25bMF0gKz0gbmI7CisKKyAgICAgICAgICAgIGF0ZW1wby0+c2l6ZSA9IEZGTUlOKGF0ZW1wby0+c2l6ZSArIG5iLCBhdGVtcG8tPnJpbmcpOworICAgICAgICAgICAgYXRlbXBvLT50YWlsID0gKGF0ZW1wby0+dGFpbCArIG5iKSAlIGF0ZW1wby0+cmluZzsKKyAgICAgICAgICAgIGF0ZW1wby0+aGVhZCA9CisgICAgICAgICAgICAgICAgYXRlbXBvLT5zaXplIDwgYXRlbXBvLT5yaW5nID8KKyAgICAgICAgICAgICAgICBhdGVtcG8tPnRhaWwgLSBhdGVtcG8tPnNpemUgOgorICAgICAgICAgICAgICAgIGF0ZW1wby0+dGFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHBhc3MgYmFjayB0aGUgdXBkYXRlZCBzb3VyY2UgYnVmZmVyIHBvaW50ZXI6CisgICAgKnNyY19yZWYgPSBzcmM7CisKKyAgICAvLyBzYW5pdHkgY2hlY2s6CisgICAgYXZfYXNzZXJ0MChhdGVtcG8tPnBvc2l0aW9uWzBdIDw9IHN0b3BfaGVyZSk7CisKKyAgICByZXR1cm4gYXRlbXBvLT5wb3NpdGlvblswXSA9PSBzdG9wX2hlcmUgPyAwIDogQVZFUlJPUihFQUdBSU4pOworfQorCisvKioKKyAqIFBvcHVsYXRlIGN1cnJlbnQgYXVkaW8gZnJhZ21lbnQgZGF0YSBidWZmZXIuCisgKgorICogQHJldHVybgorICogICAwIHdoZW4gdGhlIGZyYWdtZW50IGlzIHJlYWR5LAorICogICBBVkVSUk9SKEVBR0FJTikgaWYgbW9yZSBpbnB1dCBkYXRhIGlzIHJlcXVpcmVkLgorICovCitzdGF0aWMgaW50IHlhZV9sb2FkX2ZyYWcoQVRlbXBvQ29udGV4dCAqYXRlbXBvLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipzcmNfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19lbmQpCit7CisgICAgLy8gc2hvcnRjdXRzOgorICAgIEF1ZGlvRnJhZ21lbnQgKmZyYWcgPSB5YWVfY3Vycl9mcmFnKGF0ZW1wbyk7CisgICAgdWludDhfdCAqZHN0OworICAgIGludDY0X3QgbWlzc2luZywgc3RhcnQsIHplcm9zOworICAgIHVpbnQzMl90IG5zYW1wbGVzOworICAgIGNvbnN0IHVpbnQ4X3QgKmEsICpiOworICAgIGludCBpMCwgaTEsIG4wLCBuMSwgbmEsIG5iOworCisgICAgaW50NjRfdCBzdG9wX2hlcmUgPSBmcmFnLT5wb3NpdGlvblswXSArIGF0ZW1wby0+d2luZG93OworICAgIGlmIChzcmNfcmVmICYmIHlhZV9sb2FkX2RhdGEoYXRlbXBvLCBzcmNfcmVmLCBzcmNfZW5kLCBzdG9wX2hlcmUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKKyAgICAvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzYW1wbGVzIHdlIGRvbid0IGhhdmU6CisgICAgbWlzc2luZyA9CisgICAgICAgIHN0b3BfaGVyZSA+IGF0ZW1wby0+cG9zaXRpb25bMF0gPworICAgICAgICBzdG9wX2hlcmUgLSBhdGVtcG8tPnBvc2l0aW9uWzBdIDogMDsKKworICAgIG5zYW1wbGVzID0KKyAgICAgICAgbWlzc2luZyA8IChpbnQ2NF90KWF0ZW1wby0+d2luZG93ID8KKyAgICAgICAgKHVpbnQzMl90KShhdGVtcG8tPndpbmRvdyAtIG1pc3NpbmcpIDogMDsKKworICAgIC8vIHNldHVwIHRoZSBvdXRwdXQgYnVmZmVyOgorICAgIGZyYWctPm5zYW1wbGVzID0gbnNhbXBsZXM7CisgICAgZHN0ID0gZnJhZy0+ZGF0YTsKKworICAgIHN0YXJ0ID0gYXRlbXBvLT5wb3NpdGlvblswXSAtIGF0ZW1wby0+c2l6ZTsKKyAgICB6ZXJvcyA9IDA7CisKKyAgICBpZiAoZnJhZy0+cG9zaXRpb25bMF0gPCBzdGFydCkgeworICAgICAgICAvLyB3aGF0IHdlIGRvbid0IGhhdmUgd2Ugc3Vic3RpdHV0ZSB3aXRoIHplcm9zOgorICAgICAgICB6ZXJvcyA9IEZGTUlOKHN0YXJ0IC0gZnJhZy0+cG9zaXRpb25bMF0sIChpbnQ2NF90KW5zYW1wbGVzKTsKKyAgICAgICAgYXZfYXNzZXJ0MCh6ZXJvcyAhPSBuc2FtcGxlcyk7CisKKyAgICAgICAgbWVtc2V0KGRzdCwgMCwgemVyb3MgKiBhdGVtcG8tPnN0cmlkZSk7CisgICAgICAgIGRzdCArPSB6ZXJvcyAqIGF0ZW1wby0+c3RyaWRlOworICAgIH0KKworICAgIGlmICh6ZXJvcyA9PSBuc2FtcGxlcykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBnZXQgdGhlIHJlbWFpbmluZyBkYXRhIGZyb20gdGhlIHJpbmcgYnVmZmVyOgorICAgIG5hID0gKGF0ZW1wby0+aGVhZCA8IGF0ZW1wby0+dGFpbCA/CisgICAgICAgICAgYXRlbXBvLT50YWlsIC0gYXRlbXBvLT5oZWFkIDoKKyAgICAgICAgICBhdGVtcG8tPnJpbmcgLSBhdGVtcG8tPmhlYWQpOworCisgICAgbmIgPSBhdGVtcG8tPmhlYWQgPCBhdGVtcG8tPnRhaWwgPyAwIDogYXRlbXBvLT50YWlsOworCisgICAgLy8gc2FuaXR5IGNoZWNrOgorICAgIGF2X2Fzc2VydDAobnNhbXBsZXMgPD0gemVyb3MgKyBuYSArIG5iKTsKKworICAgIGEgPSBhdGVtcG8tPmJ1ZmZlciArIGF0ZW1wby0+aGVhZCAqIGF0ZW1wby0+c3RyaWRlOworICAgIGIgPSBhdGVtcG8tPmJ1ZmZlcjsKKworICAgIGkwID0gZnJhZy0+cG9zaXRpb25bMF0gKyB6ZXJvcyAtIHN0YXJ0OworICAgIGkxID0gaTAgPCBuYSA/IDAgOiBpMCAtIG5hOworCisgICAgbjAgPSBpMCA8IG5hID8gRkZNSU4obmEgLSBpMCwgKGludCkobnNhbXBsZXMgLSB6ZXJvcykpIDogMDsKKyAgICBuMSA9IG5zYW1wbGVzIC0gemVyb3MgLSBuMDsKKworICAgIGlmIChuMCkgeworICAgICAgICBtZW1jcHkoZHN0LCBhICsgaTAgKiBhdGVtcG8tPnN0cmlkZSwgbjAgKiBhdGVtcG8tPnN0cmlkZSk7CisgICAgICAgIGRzdCArPSBuMCAqIGF0ZW1wby0+c3RyaWRlOworICAgIH0KKworICAgIGlmIChuMSkgeworICAgICAgICBtZW1jcHkoZHN0LCBiICsgaTEgKiBhdGVtcG8tPnN0cmlkZSwgbjEgKiBhdGVtcG8tPnN0cmlkZSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUHJlcGFyZSBmb3IgbG9hZGluZyBuZXh0IGF1ZGlvIGZyYWdtZW50LgorICovCitzdGF0aWMgdm9pZCB5YWVfYWR2YW5jZV90b19uZXh0X2ZyYWcoQVRlbXBvQ29udGV4dCAqYXRlbXBvKQoreworICAgIGNvbnN0IGRvdWJsZSBmcmFnbWVudF9zdGVwID0gYXRlbXBvLT50ZW1wbyAqIChkb3VibGUpKGF0ZW1wby0+d2luZG93IC8gMik7CisKKyAgICBjb25zdCBBdWRpb0ZyYWdtZW50ICpwcmV2OworICAgIEF1ZGlvRnJhZ21lbnQgICAgICAgKmZyYWc7CisKKyAgICBhdGVtcG8tPm5mcmFnKys7CisgICAgcHJldiA9IHlhZV9wcmV2X2ZyYWcoYXRlbXBvKTsKKyAgICBmcmFnID0geWFlX2N1cnJfZnJhZyhhdGVtcG8pOworCisgICAgZnJhZy0+cG9zaXRpb25bMF0gPSBwcmV2LT5wb3NpdGlvblswXSArIChpbnQ2NF90KWZyYWdtZW50X3N0ZXA7CisgICAgZnJhZy0+cG9zaXRpb25bMV0gPSBwcmV2LT5wb3NpdGlvblsxXSArIGF0ZW1wby0+d2luZG93IC8gMjsKKyAgICBmcmFnLT5uc2FtcGxlcyAgICA9IDA7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIGNyb3NzLWNvcnJlbGF0aW9uIHZpYSByREZULgorICoKKyAqIE11bHRpcGx5IHR3byB2ZWN0b3JzIG9mIGNvbXBsZXggbnVtYmVycyAocmVzdWx0IG9mIHJlYWxfdG9fY29tcGxleCByREZUKQorICogYW5kIHRyYW5zZm9ybSBiYWNrIHZpYSBjb21wbGV4X3RvX3JlYWwgckRGVC4KKyAqLworc3RhdGljIHZvaWQgeWFlX3hjb3JyX3ZpYV9yZGZ0KEZGVFNhbXBsZSAqeGNvcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRGVENvbnRleHQgKmNvbXBsZXhfdG9fcmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGRlRDb21wbGV4ICp4YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGRlRDb21wbGV4ICp4YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgd2luZG93KQoreworICAgIEZGVENvbXBsZXggKnhjID0gKEZGVENvbXBsZXggKil4Y29ycjsKKyAgICBpbnQgaTsKKworICAgIC8vIE5PVEU6IGZpcnN0IGVsZW1lbnQgcmVxdWlyZXMgc3BlY2lhbCBjYXJlIC0tIEdpdmVuIFkgPSByREZUKFgpLAorICAgIC8vIEltKFlbMF0pIGFuZCBJbShZW04vMl0pIGFyZSBhbHdheXMgemVybywgdGhlcmVmb3JlIGF2X3JkZnRfY2FsYworICAgIC8vIHN0b3JlcyBSZShZW04vMl0pIGluIHBsYWNlIG9mIEltKFlbMF0pLgorCisgICAgeGMtPnJlID0geGEtPnJlICogeGItPnJlOworICAgIHhjLT5pbSA9IHhhLT5pbSAqIHhiLT5pbTsKKyAgICB4YSsrOworICAgIHhiKys7CisgICAgeGMrKzsKKworICAgIGZvciAoaSA9IDE7IGkgPCB3aW5kb3c7IGkrKywgeGErKywgeGIrKywgeGMrKykgeworICAgICAgICB4Yy0+cmUgPSAoeGEtPnJlICogeGItPnJlICsgeGEtPmltICogeGItPmltKTsKKyAgICAgICAgeGMtPmltID0gKHhhLT5pbSAqIHhiLT5yZSAtIHhhLT5yZSAqIHhiLT5pbSk7CisgICAgfQorCisgICAgLy8gYXBwbHkgaW52ZXJzZSByREZUOgorICAgIGF2X3JkZnRfY2FsYyhjb21wbGV4X3RvX3JlYWwsIHhjb3JyKTsKK30KKworLyoqCisgKiBDYWxjdWxhdGUgYWxpZ25tZW50IG9mZnNldCBmb3IgZ2l2ZW4gZnJhZ21lbnQKKyAqIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBmcmFnbWVudC4KKyAqCisgKiBAcmV0dXJuIGFsaWdubWVudCBvZmZzZXQgb2YgY3VycmVudCBmcmFnbWVudCByZWxhdGl2ZSB0byBwcmV2aW91cy4KKyAqLworc3RhdGljIGludCB5YWVfYWxpZ24oQXVkaW9GcmFnbWVudCAqZnJhZywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRnJhZ21lbnQgKnByZXYsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRlbHRhX21heCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkcmlmdCwKKyAgICAgICAgICAgICAgICAgICAgIEZGVFNhbXBsZSAqY29ycmVsYXRpb24sCisgICAgICAgICAgICAgICAgICAgICBSREZUQ29udGV4dCAqY29tcGxleF90b19yZWFsKQoreworICAgIGludCAgICAgICBiZXN0X29mZnNldCA9IC1kcmlmdDsKKyAgICBGRlRTYW1wbGUgYmVzdF9tZXRyaWMgPSAtRkxUX01BWDsKKyAgICBGRlRTYW1wbGUgKnhjb3JyOworCisgICAgaW50IGkwOworICAgIGludCBpMTsKKyAgICBpbnQgaTsKKworICAgIHlhZV94Y29ycl92aWFfcmRmdChjb3JyZWxhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleF90b19yZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgRkZUQ29tcGxleCAqKXByZXYtPnhkYXQsCisgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGRlRDb21wbGV4ICopZnJhZy0+eGRhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgd2luZG93KTsKKworICAgIC8vIGlkZW50aWZ5IHNlYXJjaCB3aW5kb3cgYm91bmRhcmllczoKKyAgICBpMCA9IEZGTUFYKHdpbmRvdyAvIDIgLSBkZWx0YV9tYXggLSBkcmlmdCwgMCk7CisgICAgaTAgPSBGRk1JTihpMCwgd2luZG93KTsKKworICAgIGkxID0gRkZNSU4od2luZG93IC8gMiArIGRlbHRhX21heCAtIGRyaWZ0LCB3aW5kb3cgLSB3aW5kb3cgLyAxNik7CisgICAgaTEgPSBGRk1BWChpMSwgMCk7CisKKyAgICAvLyBpZGVudGlmeSBjcm9zcy1jb3JyZWxhdGlvbiBwZWFrcyB3aXRoaW4gc2VhcmNoIHdpbmRvdzoKKyAgICB4Y29yciA9IGNvcnJlbGF0aW9uICsgaTA7CisKKyAgICBmb3IgKGkgPSBpMDsgaSA8IGkxOyBpKyssIHhjb3JyKyspIHsKKyAgICAgICAgRkZUU2FtcGxlIG1ldHJpYyA9ICp4Y29ycjsKKworICAgICAgICAvLyBub3JtYWxpemU6CisgICAgICAgIEZGVFNhbXBsZSBkcmlmdGkgPSAoRkZUU2FtcGxlKShkcmlmdCArIGkpOworICAgICAgICBtZXRyaWMgKj0gZHJpZnRpICogKEZGVFNhbXBsZSkoaSAtIGkwKSAqIChGRlRTYW1wbGUpKGkxIC0gaSk7CisKKyAgICAgICAgaWYgKG1ldHJpYyA+IGJlc3RfbWV0cmljKSB7CisgICAgICAgICAgICBiZXN0X21ldHJpYyA9IG1ldHJpYzsKKyAgICAgICAgICAgIGJlc3Rfb2Zmc2V0ID0gaSAtIHdpbmRvdyAvIDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmVzdF9vZmZzZXQ7Cit9CisKKy8qKgorICogQWRqdXN0IGN1cnJlbnQgZnJhZ21lbnQgcG9zaXRpb24gZm9yIGJldHRlciBhbGlnbm1lbnQKKyAqIHdpdGggcHJldmlvdXMgZnJhZ21lbnQuCisgKgorICogQHJldHVybiBhbGlnbm1lbnQgY29ycmVjdGlvbi4KKyAqLworc3RhdGljIGludCB5YWVfYWRqdXN0X3Bvc2l0aW9uKEFUZW1wb0NvbnRleHQgKmF0ZW1wbykKK3sKKyAgICBjb25zdCBBdWRpb0ZyYWdtZW50ICpwcmV2ID0geWFlX3ByZXZfZnJhZyhhdGVtcG8pOworICAgIEF1ZGlvRnJhZ21lbnQgICAgICAgKmZyYWcgPSB5YWVfY3Vycl9mcmFnKGF0ZW1wbyk7CisKKyAgICBjb25zdCBkb3VibGUgcHJldl9vdXRwdXRfcG9zaXRpb24gPQorICAgICAgICAoZG91YmxlKShwcmV2LT5wb3NpdGlvblsxXSAtIGF0ZW1wby0+b3JpZ2luWzFdICsgYXRlbXBvLT53aW5kb3cgLyAyKTsKKworICAgIGNvbnN0IGRvdWJsZSBpZGVhbF9vdXRwdXRfcG9zaXRpb24gPQorICAgICAgICAoZG91YmxlKShwcmV2LT5wb3NpdGlvblswXSAtIGF0ZW1wby0+b3JpZ2luWzBdICsgYXRlbXBvLT53aW5kb3cgLyAyKSAvCisgICAgICAgIGF0ZW1wby0+dGVtcG87CisKKyAgICBjb25zdCBpbnQgZHJpZnQgPSAoaW50KShwcmV2X291dHB1dF9wb3NpdGlvbiAtIGlkZWFsX291dHB1dF9wb3NpdGlvbik7CisKKyAgICBjb25zdCBpbnQgZGVsdGFfbWF4ICA9IGF0ZW1wby0+d2luZG93IC8gMjsKKyAgICBjb25zdCBpbnQgY29ycmVjdGlvbiA9IHlhZV9hbGlnbihmcmFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRlbXBvLT53aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ZW1wby0+Y29ycmVsYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRlbXBvLT5jb21wbGV4X3RvX3JlYWwpOworCisgICAgaWYgKGNvcnJlY3Rpb24pIHsKKyAgICAgICAgLy8gYWRqdXN0IGZyYWdtZW50IHBvc2l0aW9uOgorICAgICAgICBmcmFnLT5wb3NpdGlvblswXSAtPSBjb3JyZWN0aW9uOworCisgICAgICAgIC8vIGNsZWFyIHNvIHRoYXQgdGhlIGZyYWdtZW50IGNhbiBiZSByZWxvYWRlZDoKKyAgICAgICAgZnJhZy0+bnNhbXBsZXMgPSAwOworICAgIH0KKworICAgIHJldHVybiBjb3JyZWN0aW9uOworfQorCisvKioKKyAqIEEgaGVscGVyIG1hY3JvIGZvciBibGVuZGluZyB0aGUgb3ZlcmxhcCByZWdpb24gb2YgcHJldmlvdXMKKyAqIGFuZCBjdXJyZW50IGF1ZGlvIGZyYWdtZW50LgorICovCisjZGVmaW5lIHlhZV9ibGVuZChzY2FsYXJfdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHNjYWxhcl90eXBlICphYWEgPSAoY29uc3Qgc2NhbGFyX3R5cGUgKilhOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHNjYWxhcl90eXBlICpiYmIgPSAoY29uc3Qgc2NhbGFyX3R5cGUgKiliOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNjYWxhcl90eXBlICpvdXQgICAgID0gKHNjYWxhcl90eXBlICopZHN0OyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNjYWxhcl90eXBlICpvdXRfZW5kID0gKHNjYWxhcl90eXBlICopZHN0X2VuZDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludDY0X3QgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdmVybGFwICYmIG91dCA8IG91dF9lbmQ7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgaSsrLCBhdGVtcG8tPnBvc2l0aW9uWzFdKyssIHdhKyssIHdiKyspIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmbG9hdCB3MCA9ICp3YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmbG9hdCB3MSA9ICp3YjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXRlbXBvLT5jaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGorKywgYWFhKyssIGJiYisrLCBvdXQrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmxvYXQgdDAgPSAoZmxvYXQpKmFhYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmxvYXQgdDEgPSAoZmxvYXQpKmJiYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKm91dCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZyYWctPnBvc2l0aW9uWzBdICsgaSA8IDAgPyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICphYWEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIChzY2FsYXJfdHlwZSkodDAgKiB3MCArIHQxICogdzEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdCA9ICh1aW50OF90ICopb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBCbGVuZCB0aGUgb3ZlcmxhcCByZWdpb24gb2YgcHJldmlvdXMgYW5kIGN1cnJlbnQgYXVkaW8gZnJhZ21lbnQKKyAqIGFuZCBvdXRwdXQgdGhlIHJlc3VsdHMgdG8gdGhlIGdpdmVuIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqCisgKiBAcmV0dXJuCisgKiAgIDAgaWYgdGhlIG92ZXJsYXAgcmVnaW9uIHdhcyBjb21wbGV0ZWx5IHN0b3JlZCBpbiB0aGUgZHN0IGJ1ZmZlciwKKyAqICAgQVZFUlJPUihFQUdBSU4pIGlmIG1vcmUgZGVzdGluYXRpb24gYnVmZmVyIHNwYWNlIGlzIHJlcXVpcmVkLgorICovCitzdGF0aWMgaW50IHlhZV9vdmVybGFwX2FkZChBVGVtcG9Db250ZXh0ICphdGVtcG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqZHN0X3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdF9lbmQpCit7CisgICAgLy8gc2hvcnRjdXRzOgorICAgIGNvbnN0IEF1ZGlvRnJhZ21lbnQgKnByZXYgPSB5YWVfcHJldl9mcmFnKGF0ZW1wbyk7CisgICAgY29uc3QgQXVkaW9GcmFnbWVudCAqZnJhZyA9IHlhZV9jdXJyX2ZyYWcoYXRlbXBvKTsKKworICAgIGNvbnN0IGludDY0X3Qgc3RhcnRfaGVyZSA9IEZGTUFYKGF0ZW1wby0+cG9zaXRpb25bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZy0+cG9zaXRpb25bMV0pOworCisgICAgY29uc3QgaW50NjRfdCBzdG9wX2hlcmUgPSBGRk1JTihwcmV2LT5wb3NpdGlvblsxXSArIHByZXYtPm5zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZy0+cG9zaXRpb25bMV0gKyBmcmFnLT5uc2FtcGxlcyk7CisKKyAgICBjb25zdCBpbnQ2NF90IG92ZXJsYXAgPSBzdG9wX2hlcmUgLSBzdGFydF9oZXJlOworCisgICAgY29uc3QgaW50NjRfdCBpYSA9IHN0YXJ0X2hlcmUgLSBwcmV2LT5wb3NpdGlvblsxXTsKKyAgICBjb25zdCBpbnQ2NF90IGliID0gc3RhcnRfaGVyZSAtIGZyYWctPnBvc2l0aW9uWzFdOworCisgICAgY29uc3QgZmxvYXQgKndhID0gYXRlbXBvLT5oYW5uICsgaWE7CisgICAgY29uc3QgZmxvYXQgKndiID0gYXRlbXBvLT5oYW5uICsgaWI7CisKKyAgICBjb25zdCB1aW50OF90ICphID0gcHJldi0+ZGF0YSArIGlhICogYXRlbXBvLT5zdHJpZGU7CisgICAgY29uc3QgdWludDhfdCAqYiA9IGZyYWctPmRhdGEgKyBpYiAqIGF0ZW1wby0+c3RyaWRlOworCisgICAgdWludDhfdCAqZHN0ID0gKmRzdF9yZWY7CisKKyAgICBhdl9hc3NlcnQwKHN0YXJ0X2hlcmUgPD0gc3RvcF9oZXJlICYmCisgICAgICAgICAgICAgICBmcmFnLT5wb3NpdGlvblsxXSA8PSBzdGFydF9oZXJlICYmCisgICAgICAgICAgICAgICBvdmVybGFwIDw9IGZyYWctPm5zYW1wbGVzKTsKKworICAgIGlmIChhdGVtcG8tPmZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX1U4KSB7CisgICAgICAgIHlhZV9ibGVuZCh1aW50OF90KTsKKyAgICB9IGVsc2UgaWYgKGF0ZW1wby0+Zm9ybWF0ID09IEFWX1NBTVBMRV9GTVRfUzE2KSB7CisgICAgICAgIHlhZV9ibGVuZChpbnQxNl90KTsKKyAgICB9IGVsc2UgaWYgKGF0ZW1wby0+Zm9ybWF0ID09IEFWX1NBTVBMRV9GTVRfUzMyKSB7CisgICAgICAgIHlhZV9ibGVuZChpbnQpOworICAgIH0gZWxzZSBpZiAoYXRlbXBvLT5mb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9GTFQpIHsKKyAgICAgICAgeWFlX2JsZW5kKGZsb2F0KTsKKyAgICB9IGVsc2UgaWYgKGF0ZW1wby0+Zm9ybWF0ID09IEFWX1NBTVBMRV9GTVRfREJMKSB7CisgICAgICAgIHlhZV9ibGVuZChkb3VibGUpOworICAgIH0KKworICAgIC8vIHBhc3MtYmFjayB0aGUgdXBkYXRlZCBkZXN0aW5hdGlvbiBidWZmZXIgcG9pbnRlcjoKKyAgICAqZHN0X3JlZiA9IGRzdDsKKworICAgIHJldHVybiBhdGVtcG8tPnBvc2l0aW9uWzFdID09IHN0b3BfaGVyZSA/IDAgOiBBVkVSUk9SKEVBR0FJTik7Cit9CisKKy8qKgorICogRmVlZCBhcyBtdWNoIGRhdGEgdG8gdGhlIGZpbHRlciBhcyBpdCBpcyBhYmxlIHRvIGNvbnN1bWUKKyAqIGFuZCByZWNlaXZlIGFzIG11Y2ggcHJvY2Vzc2VkIGRhdGEgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogYXMgaXQgaXMgYWJsZSB0byBwcm9kdWNlIG9yIHN0b3JlLgorICovCitzdGF0aWMgdm9pZAoreWFlX2FwcGx5KEFUZW1wb0NvbnRleHQgKmF0ZW1wbywKKyAgICAgICAgICBjb25zdCB1aW50OF90ICoqc3JjX3JlZiwKKyAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfZW5kLAorICAgICAgICAgIHVpbnQ4X3QgKipkc3RfcmVmLAorICAgICAgICAgIHVpbnQ4X3QgKmRzdF9lbmQpCit7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGF0ZW1wby0+c3RhdGUgPT0gWUFFX0xPQURfRlJBR01FTlQpIHsKKyAgICAgICAgICAgIC8vIGxvYWQgYWRkaXRpb25hbCBkYXRhIGZvciB0aGUgY3VycmVudCBmcmFnbWVudDoKKyAgICAgICAgICAgIGlmICh5YWVfbG9hZF9mcmFnKGF0ZW1wbywgc3JjX3JlZiwgc3JjX2VuZCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkb3duLW1peCB0byBtb25vOgorICAgICAgICAgICAgeWFlX2Rvd25taXgoYXRlbXBvLCB5YWVfY3Vycl9mcmFnKGF0ZW1wbykpOworCisgICAgICAgICAgICAvLyBhcHBseSByREZUOgorICAgICAgICAgICAgYXZfcmRmdF9jYWxjKGF0ZW1wby0+cmVhbF90b19jb21wbGV4LCB5YWVfY3Vycl9mcmFnKGF0ZW1wbyktPnhkYXQpOworCisgICAgICAgICAgICAvLyBtdXN0IGxvYWQgdGhlIHNlY29uZCBmcmFnbWVudCBiZWZvcmUgYWxpZ25tZW50IGNhbiBzdGFydDoKKyAgICAgICAgICAgIGlmICghYXRlbXBvLT5uZnJhZykgeworICAgICAgICAgICAgICAgIHlhZV9hZHZhbmNlX3RvX25leHRfZnJhZyhhdGVtcG8pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdGVtcG8tPnN0YXRlID0gWUFFX0FESlVTVF9QT1NJVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdGVtcG8tPnN0YXRlID09IFlBRV9BREpVU1RfUE9TSVRJT04pIHsKKyAgICAgICAgICAgIC8vIGFkanVzdCBwb3NpdGlvbiBmb3IgYmV0dGVyIGFsaWdubWVudDoKKyAgICAgICAgICAgIGlmICh5YWVfYWRqdXN0X3Bvc2l0aW9uKGF0ZW1wbykpIHsKKyAgICAgICAgICAgICAgICAvLyByZWxvYWQgdGhlIGZyYWdtZW50IGF0IHRoZSBjb3JyZWN0ZWQgcG9zaXRpb24sIHNvIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgLy8gSGFubiB3aW5kb3cgYmxlbmRpbmcgd291bGQgbm90IHJlcXVpcmUgbm9ybWFsaXphdGlvbjoKKyAgICAgICAgICAgICAgICBhdGVtcG8tPnN0YXRlID0gWUFFX1JFTE9BRF9GUkFHTUVOVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXRlbXBvLT5zdGF0ZSA9IFlBRV9PVVRQVVRfT1ZFUkxBUF9BREQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXRlbXBvLT5zdGF0ZSA9PSBZQUVfUkVMT0FEX0ZSQUdNRU5UKSB7CisgICAgICAgICAgICAvLyBsb2FkIGFkZGl0aW9uYWwgZGF0YSBpZiBuZWNlc3NhcnkgZHVlIHRvIHBvc2l0aW9uIGFkanVzdG1lbnQ6CisgICAgICAgICAgICBpZiAoeWFlX2xvYWRfZnJhZyhhdGVtcG8sIHNyY19yZWYsIHNyY19lbmQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZG93bi1taXggdG8gbW9ubzoKKyAgICAgICAgICAgIHlhZV9kb3dubWl4KGF0ZW1wbywgeWFlX2N1cnJfZnJhZyhhdGVtcG8pKTsKKworICAgICAgICAgICAgLy8gYXBwbHkgckRGVDoKKyAgICAgICAgICAgIGF2X3JkZnRfY2FsYyhhdGVtcG8tPnJlYWxfdG9fY29tcGxleCwgeWFlX2N1cnJfZnJhZyhhdGVtcG8pLT54ZGF0KTsKKworICAgICAgICAgICAgYXRlbXBvLT5zdGF0ZSA9IFlBRV9PVVRQVVRfT1ZFUkxBUF9BREQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXRlbXBvLT5zdGF0ZSA9PSBZQUVfT1VUUFVUX09WRVJMQVBfQUREKSB7CisgICAgICAgICAgICAvLyBvdmVybGFwLWFkZCBhbmQgb3V0cHV0IHRoZSByZXN1bHQ6CisgICAgICAgICAgICBpZiAoeWFlX292ZXJsYXBfYWRkKGF0ZW1wbywgZHN0X3JlZiwgZHN0X2VuZCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGZyYWdtZW50LCByZXBlYXQ6CisgICAgICAgICAgICB5YWVfYWR2YW5jZV90b19uZXh0X2ZyYWcoYXRlbXBvKTsKKyAgICAgICAgICAgIGF0ZW1wby0+c3RhdGUgPSBZQUVfTE9BRF9GUkFHTUVOVDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGbHVzaCBhbnkgYnVmZmVyZWQgZGF0YSBmcm9tIHRoZSBmaWx0ZXIuCisgKgorICogQHJldHVybgorICogICAwIGlmIGFsbCBkYXRhIHdhcyBjb21wbGV0ZWx5IHN0b3JlZCBpbiB0aGUgZHN0IGJ1ZmZlciwKKyAqICAgQVZFUlJPUihFQUdBSU4pIGlmIG1vcmUgZGVzdGluYXRpb24gYnVmZmVyIHNwYWNlIGlzIHJlcXVpcmVkLgorICovCitzdGF0aWMgaW50IHlhZV9mbHVzaChBVGVtcG9Db250ZXh0ICphdGVtcG8sCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqZHN0X3JlZiwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdF9lbmQpCit7CisgICAgQXVkaW9GcmFnbWVudCAqZnJhZyA9IHlhZV9jdXJyX2ZyYWcoYXRlbXBvKTsKKyAgICBpbnQ2NF90IG92ZXJsYXBfZW5kOworICAgIGludDY0X3Qgc3RhcnRfaGVyZTsKKyAgICBpbnQ2NF90IHN0b3BfaGVyZTsKKyAgICBpbnQ2NF90IG9mZnNldDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzsKKyAgICB1aW50OF90ICpkc3Q7CisKKyAgICBpbnQgc3JjX3NpemU7CisgICAgaW50IGRzdF9zaXplOworICAgIGludCBuYnl0ZXM7CisKKyAgICBhdGVtcG8tPnN0YXRlID0gWUFFX0ZMVVNIX09VVFBVVDsKKworICAgIGlmIChhdGVtcG8tPnBvc2l0aW9uWzBdID09IGZyYWctPnBvc2l0aW9uWzBdICsgZnJhZy0+bnNhbXBsZXMgJiYKKyAgICAgICAgYXRlbXBvLT5wb3NpdGlvblsxXSA9PSBmcmFnLT5wb3NpdGlvblsxXSArIGZyYWctPm5zYW1wbGVzKSB7CisgICAgICAgIC8vIHRoZSBjdXJyZW50IGZyYWdtZW50IGlzIGFscmVhZHkgZmx1c2hlZDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGZyYWctPnBvc2l0aW9uWzBdICsgZnJhZy0+bnNhbXBsZXMgPCBhdGVtcG8tPnBvc2l0aW9uWzBdKSB7CisgICAgICAgIC8vIGZpbmlzaCBsb2FkaW5nIHRoZSBjdXJyZW50IChwb3NzaWJseSBwYXJ0aWFsKSBmcmFnbWVudDoKKyAgICAgICAgeWFlX2xvYWRfZnJhZyhhdGVtcG8sIE5VTEwsIE5VTEwpOworCisgICAgICAgIGlmIChhdGVtcG8tPm5mcmFnKSB7CisgICAgICAgICAgICAvLyBkb3duLW1peCB0byBtb25vOgorICAgICAgICAgICAgeWFlX2Rvd25taXgoYXRlbXBvLCBmcmFnKTsKKworICAgICAgICAgICAgLy8gYXBwbHkgckRGVDoKKyAgICAgICAgICAgIGF2X3JkZnRfY2FsYyhhdGVtcG8tPnJlYWxfdG9fY29tcGxleCwgZnJhZy0+eGRhdCk7CisKKyAgICAgICAgICAgIC8vIGFsaWduIGN1cnJlbnQgZnJhZ21lbnQgdG8gcHJldmlvdXMgZnJhZ21lbnQ6CisgICAgICAgICAgICBpZiAoeWFlX2FkanVzdF9wb3NpdGlvbihhdGVtcG8pKSB7CisgICAgICAgICAgICAgICAgLy8gcmVsb2FkIHRoZSBjdXJyZW50IGZyYWdtZW50IGR1ZSB0byBhZGp1c3RlZCBwb3NpdGlvbjoKKyAgICAgICAgICAgICAgICB5YWVfbG9hZF9mcmFnKGF0ZW1wbywgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBmbHVzaCB0aGUgb3ZlcmxhcCByZWdpb246CisgICAgb3ZlcmxhcF9lbmQgPSBmcmFnLT5wb3NpdGlvblsxXSArIEZGTUlOKGF0ZW1wby0+d2luZG93IC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZy0+bnNhbXBsZXMpOworCisgICAgd2hpbGUgKGF0ZW1wby0+cG9zaXRpb25bMV0gPCBvdmVybGFwX2VuZCkgeworICAgICAgICBpZiAoeWFlX292ZXJsYXBfYWRkKGF0ZW1wbywgZHN0X3JlZiwgZHN0X2VuZCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNoZWNrIHdoZXRoZXIgYWxsIG9mIHRoZSBpbnB1dCBzYW1wbGVzIGhhdmUgYmVlbiBjb25zdW1lZDoKKyAgICBpZiAoZnJhZy0+cG9zaXRpb25bMF0gKyBmcmFnLT5uc2FtcGxlcyA8IGF0ZW1wby0+cG9zaXRpb25bMF0pIHsKKyAgICAgICAgeWFlX2FkdmFuY2VfdG9fbmV4dF9mcmFnKGF0ZW1wbyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgfQorCisgICAgLy8gZmx1c2ggdGhlIHJlbWFpbmRlciBvZiB0aGUgY3VycmVudCBmcmFnbWVudDoKKyAgICBzdGFydF9oZXJlID0gRkZNQVgoYXRlbXBvLT5wb3NpdGlvblsxXSwgb3ZlcmxhcF9lbmQpOworICAgIHN0b3BfaGVyZSAgPSBmcmFnLT5wb3NpdGlvblsxXSArIGZyYWctPm5zYW1wbGVzOworICAgIG9mZnNldCAgICAgPSBzdGFydF9oZXJlIC0gZnJhZy0+cG9zaXRpb25bMV07CisgICAgYXZfYXNzZXJ0MChzdGFydF9oZXJlIDw9IHN0b3BfaGVyZSAmJiBmcmFnLT5wb3NpdGlvblsxXSA8PSBzdGFydF9oZXJlKTsKKworICAgIHNyYyA9IGZyYWctPmRhdGEgKyBvZmZzZXQgKiBhdGVtcG8tPnN0cmlkZTsKKyAgICBkc3QgPSAodWludDhfdCAqKSpkc3RfcmVmOworCisgICAgc3JjX3NpemUgPSAoaW50KShzdG9wX2hlcmUgLSBzdGFydF9oZXJlKSAqIGF0ZW1wby0+c3RyaWRlOworICAgIGRzdF9zaXplID0gZHN0X2VuZCAtIGRzdDsKKyAgICBuYnl0ZXMgPSBGRk1JTihzcmNfc2l6ZSwgZHN0X3NpemUpOworCisgICAgbWVtY3B5KGRzdCwgc3JjLCBuYnl0ZXMpOworICAgIGRzdCArPSBuYnl0ZXM7CisKKyAgICBhdGVtcG8tPnBvc2l0aW9uWzFdICs9IChuYnl0ZXMgLyBhdGVtcG8tPnN0cmlkZSk7CisKKyAgICAvLyBwYXNzLWJhY2sgdGhlIHVwZGF0ZWQgZGVzdGluYXRpb24gYnVmZmVyIHBvaW50ZXI6CisgICAgKmRzdF9yZWYgPSAodWludDhfdCAqKWRzdDsKKworICAgIHJldHVybiBhdGVtcG8tPnBvc2l0aW9uWzFdID09IHN0b3BfaGVyZSA/IDAgOiBBVkVSUk9SKEVBR0FJTik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFUZW1wb0NvbnRleHQgKmF0ZW1wbyA9IGN0eC0+cHJpdjsKKyAgICBhdGVtcG8tPmZvcm1hdCA9IEFWX1NBTVBMRV9GTVRfTk9ORTsKKyAgICBhdGVtcG8tPnN0YXRlICA9IFlBRV9MT0FEX0ZSQUdNRU5UOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVGVtcG9Db250ZXh0ICphdGVtcG8gPSBjdHgtPnByaXY7CisgICAgeWFlX3JlbGVhc2VfYnVmZmVycyhhdGVtcG8pOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0cyA9IE5VTEw7CisgICAgQVZGaWx0ZXJGb3JtYXRzICAgICAgICAqZm9ybWF0cyA9IE5VTEw7CisKKyAgICAvLyBXU09MQSBuZWNlc3NpdGF0ZXMgYW4gaW50ZXJuYWwgc2xpZGluZyB3aW5kb3cgcmluZyBidWZmZXIKKyAgICAvLyBmb3IgaW5jb21pbmcgYXVkaW8gc3RyZWFtLgorICAgIC8vCisgICAgLy8gUGxhbmFyIHNhbXBsZSBmb3JtYXRzIGFyZSB0b28gY3VtYmVyc29tZSB0byBzdG9yZSBpbiBhIHJpbmcgYnVmZmVyLAorICAgIC8vIHRoZXJlZm9yZSBwbGFuYXIgc2FtcGxlIGZvcm1hdHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgLy8KKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geworICAgICAgICBBVl9TQU1QTEVfRk1UX1U4LAorICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzIsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICBBVl9TQU1QTEVfRk1UX0RCTCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FCisgICAgfTsKKworICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9sYXlvdXRzKCk7CisgICAgaWYgKCFsYXlvdXRzKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgbGF5b3V0cyk7CisKKyAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10cyk7CisgICAgaWYgKCFmb3JtYXRzKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworCisgICAgZm9ybWF0cyA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgIGlmICghZm9ybWF0cykgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZm9ybWF0cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVRlbXBvQ29udGV4dCAqYXRlbXBvID0gY3R4LT5wcml2OworCisgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBmb3JtYXQgPSBpbmxpbmstPmZvcm1hdDsKKyAgICBpbnQgc2FtcGxlX3JhdGUgPSAoaW50KWlubGluay0+c2FtcGxlX3JhdGU7CisgICAgaW50IGNoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGlubGluay0+Y2hhbm5lbF9sYXlvdXQpOworCisgICAgY3R4LT5vdXRwdXRzWzBdLT5mbGFncyB8PSBGRl9MSU5LX0ZMQUdfUkVRVUVTVF9MT09QOworCisgICAgcmV0dXJuIHlhZV9yZXNldChhdGVtcG8sIGZvcm1hdCwgc2FtcGxlX3JhdGUsIGNoYW5uZWxzKTsKK30KKworc3RhdGljIGludCBwdXNoX3NhbXBsZXMoQVRlbXBvQ29udGV4dCAqYXRlbXBvLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5fb3V0KQoreworICAgIGludCByZXQ7CisKKyAgICBhdGVtcG8tPmRzdF9idWZmZXItPnNhbXBsZV9yYXRlID0gb3V0bGluay0+c2FtcGxlX3JhdGU7CisgICAgYXRlbXBvLT5kc3RfYnVmZmVyLT5uYl9zYW1wbGVzICA9IG5fb3V0OworCisgICAgLy8gYWRqdXN0IHRoZSBQVFM6CisgICAgYXRlbXBvLT5kc3RfYnVmZmVyLT5wdHMgPQorICAgICAgICBhdl9yZXNjYWxlX3EoYXRlbXBvLT5uc2FtcGxlc19vdXQsCisgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7IDEsIG91dGxpbmstPnNhbXBsZV9yYXRlIH0sCisgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UpOworCisgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGF0ZW1wby0+ZHN0X2J1ZmZlcik7CisgICAgYXRlbXBvLT5kc3RfYnVmZmVyID0gTlVMTDsKKyAgICBhdGVtcG8tPmRzdCAgICAgICAgPSBOVUxMOworICAgIGF0ZW1wby0+ZHN0X2VuZCAgICA9IE5VTEw7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdGVtcG8tPm5zYW1wbGVzX291dCArPSBuX291dDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKnNyY19idWZmZXIpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVRlbXBvQ29udGV4dCAqYXRlbXBvID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKworICAgIGludCByZXQgPSAwOworICAgIGludCBuX2luID0gc3JjX2J1ZmZlci0+bmJfc2FtcGxlczsKKyAgICBpbnQgbl9vdXQgPSAoaW50KSgwLjUgKyAoKGRvdWJsZSluX2luKSAvIGF0ZW1wby0+dGVtcG8pOworCisgICAgY29uc3QgdWludDhfdCAqc3JjID0gc3JjX2J1ZmZlci0+ZGF0YVswXTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNfZW5kID0gc3JjICsgbl9pbiAqIGF0ZW1wby0+c3RyaWRlOworCisgICAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKKyAgICAgICAgaWYgKCFhdGVtcG8tPmRzdF9idWZmZXIpIHsKKyAgICAgICAgICAgIGF0ZW1wby0+ZHN0X2J1ZmZlciA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbl9vdXQpOworICAgICAgICAgICAgaWYgKCFhdGVtcG8tPmRzdF9idWZmZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMoYXRlbXBvLT5kc3RfYnVmZmVyLCBzcmNfYnVmZmVyKTsKKworICAgICAgICAgICAgYXRlbXBvLT5kc3QgPSBhdGVtcG8tPmRzdF9idWZmZXItPmRhdGFbMF07CisgICAgICAgICAgICBhdGVtcG8tPmRzdF9lbmQgPSBhdGVtcG8tPmRzdCArIG5fb3V0ICogYXRlbXBvLT5zdHJpZGU7CisgICAgICAgIH0KKworICAgICAgICB5YWVfYXBwbHkoYXRlbXBvLCAmc3JjLCBzcmNfZW5kLCAmYXRlbXBvLT5kc3QsIGF0ZW1wby0+ZHN0X2VuZCk7CisKKyAgICAgICAgaWYgKGF0ZW1wby0+ZHN0ID09IGF0ZW1wby0+ZHN0X2VuZCkgeworICAgICAgICAgICAgaW50IG5fc2FtcGxlcyA9ICgoYXRlbXBvLT5kc3QgLSBhdGVtcG8tPmRzdF9idWZmZXItPmRhdGFbMF0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRlbXBvLT5zdHJpZGUpOworICAgICAgICAgICAgcmV0ID0gcHVzaF9zYW1wbGVzKGF0ZW1wbywgb3V0bGluaywgbl9zYW1wbGVzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorCisgICAgYXRlbXBvLT5uc2FtcGxlc19pbiArPSBuX2luOworZW5kOgorICAgIGF2X2ZyYW1lX2ZyZWUoJnNyY19idWZmZXIpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEFUZW1wb0NvbnRleHQgKmF0ZW1wbyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7CisKKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GKSB7CisgICAgICAgIC8vIGZsdXNoIHRoZSBmaWx0ZXI6CisgICAgICAgIGludCBuX21heCA9IGF0ZW1wby0+cmluZzsKKyAgICAgICAgaW50IG5fb3V0OworICAgICAgICBpbnQgZXJyID0gQVZFUlJPUihFQUdBSU4pOworCisgICAgICAgIHdoaWxlIChlcnIgPT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgICAgICBpZiAoIWF0ZW1wby0+ZHN0X2J1ZmZlcikgeworICAgICAgICAgICAgICAgIGF0ZW1wby0+ZHN0X2J1ZmZlciA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbl9tYXgpOworICAgICAgICAgICAgICAgIGlmICghYXRlbXBvLT5kc3RfYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICAgICAgYXRlbXBvLT5kc3QgPSBhdGVtcG8tPmRzdF9idWZmZXItPmRhdGFbMF07CisgICAgICAgICAgICAgICAgYXRlbXBvLT5kc3RfZW5kID0gYXRlbXBvLT5kc3QgKyBuX21heCAqIGF0ZW1wby0+c3RyaWRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlcnIgPSB5YWVfZmx1c2goYXRlbXBvLCAmYXRlbXBvLT5kc3QsIGF0ZW1wby0+ZHN0X2VuZCk7CisKKyAgICAgICAgICAgIG5fb3V0ID0gKChhdGVtcG8tPmRzdCAtIGF0ZW1wby0+ZHN0X2J1ZmZlci0+ZGF0YVswXSkgLworICAgICAgICAgICAgICAgICAgICAgYXRlbXBvLT5zdHJpZGUpOworCisgICAgICAgICAgICBpZiAobl9vdXQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBwdXNoX3NhbXBsZXMoYXRlbXBvLCBvdXRsaW5rLCBuX291dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmFtZV9mcmVlKCZhdGVtcG8tPmRzdF9idWZmZXIpOworICAgICAgICBhdGVtcG8tPmRzdCAgICAgPSBOVUxMOworICAgICAgICBhdGVtcG8tPmRzdF9lbmQgPSBOVUxMOworCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfY29tbWFuZChBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIHJldHVybiAhc3RyY21wKGNtZCwgInRlbXBvIikgPyB5YWVfc2V0X3RlbXBvKGN0eCwgYXJnKSA6IEFWRVJST1IoRU5PU1lTKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF0ZW1wb19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF0ZW1wb19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hdGVtcG8gPSB7CisgICAgLm5hbWUgICAgICAgICAgICA9ICJhdGVtcG8iLAorICAgIC5kZXNjcmlwdGlvbiAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQWRqdXN0IGF1ZGlvIHRlbXBvLiIpLAorICAgIC5pbml0ICAgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgICA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByb2Nlc3NfY29tbWFuZCA9IHByb2Nlc3NfY29tbWFuZCwKKyAgICAucHJpdl9zaXplICAgICAgID0gc2l6ZW9mKEFUZW1wb0NvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICAgPSAmYXRlbXBvX2NsYXNzLAorICAgIC5pbnB1dHMgICAgICAgICAgPSBhdGVtcG9faW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgICAgPSBhdGVtcG9fb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYmlxdWFkcy5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2JpcXVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmJmOWRiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2JpcXVhZHMuYwpAQCAtMCwwICsxLDYyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IFJvYiBTeWtlcyA8cm9ic0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiAyLXBvbGUgZmlsdGVycyBkZXNpZ25lZCBieSBSb2JlcnQgQnJpc3Rvdy1Kb2huc29uIDxyYmpAYXVkaW9pbWFnaW5hdGlvbi5jb20+CisgKiAgIHNlZSBodHRwOi8vd3d3Lm11c2ljZHNwLm9yZy9maWxlcy9BdWRpby1FUS1Db29rYm9vay50eHQKKyAqCisgKiAxLXBvbGUgZmlsdGVycyBiYXNlZCBvbiBjb2RlIChjKSAyMDAwIENocmlzIEJhZ3dlbGwgPGNiYWd3ZWxsQHNwcnluZXQuY29tPgorICogICBBbGdvcml0aG1zOiBSZWN1cnNpdmUgc2luZ2xlIHBvbGUgbG93L2hpZ2ggcGFzcyBmaWx0ZXIKKyAqICAgUmVmZXJlbmNlOiBUaGUgU2NpZW50aXN0IGFuZCBFbmdpbmVlcidzIEd1aWRlIHRvIERpZ2l0YWwgU2lnbmFsIFByb2Nlc3NpbmcKKyAqCisgKiAgIGxvdy1wYXNzOiBvdXRwdXRbTl0gPSBpbnB1dFtOXSAqIEEgKyBvdXRwdXRbTi0xXSAqIEIKKyAqICAgICBYID0gZXhwKC0yLjAgKiBwaSAqIEZjKQorICogICAgIEEgPSAxIC0gWAorICogICAgIEIgPSBYCisgKiAgICAgRmMgPSBjdXRvZmYgZnJlcSAvIHNhbXBsZSByYXRlCisgKgorICogICAgIE1pbWljcyBhbiBSQyBsb3ctcGFzcyBmaWx0ZXI6CisgKgorICogICAgIC0tLS9cL1wvXC9cLS0tLS0tLS0tLS0+CisgKiAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgIC0tLSBDCisgKiAgICAgICAgICAgICAgICAgIC0tLQorICogICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgVgorICoKKyAqICAgaGlnaC1wYXNzOiBvdXRwdXRbTl0gPSBBMCAqIGlucHV0W05dICsgQTEgKiBpbnB1dFtOLTFdICsgQjEgKiBvdXRwdXRbTi0xXQorICogICAgIFggID0gZXhwKC0yLjAgKiBwaSAqIEZjKQorICogICAgIEEwID0gKDEgKyBYKSAvIDIKKyAqICAgICBBMSA9IC0oMSArIFgpIC8gMgorICogICAgIEIxID0gWAorICogICAgIEZjID0gY3V0b2ZmIGZyZXEgLyBzYW1wbGUgcmF0ZQorICoKKyAqICAgICBNaW1pY3MgYW4gUkMgaGlnaC1wYXNzIGZpbHRlcjoKKyAqCisgKiAgICAgICAgIHx8IEMKKyAqICAgICAtLS0tfHwtLS0tLS0tLS0+CisgKiAgICAgICAgIHx8ICAgIHwKKyAqICAgICAgICAgICAgICAgPAorICogICAgICAgICAgICAgICA+IFIKKyAqICAgICAgICAgICAgICAgPAorICogICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgIFYKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitlbnVtIEZpbHRlclR5cGUgeworICAgIGJpcXVhZCwKKyAgICBlcXVhbGl6ZXIsCisgICAgYmFzcywKKyAgICB0cmVibGUsCisgICAgYmFuZCwKKyAgICBiYW5kcGFzcywKKyAgICBiYW5kcmVqZWN0LAorICAgIGFsbHBhc3MsCisgICAgaGlnaHBhc3MsCisgICAgbG93cGFzcywKK307CisKK2VudW0gV2lkdGhUeXBlIHsKKyAgICBOT05FLAorICAgIEhFUlRaLAorICAgIE9DVEFWRSwKKyAgICBRRkFDVE9SLAorICAgIFNMT1BFLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhbkNhY2hlIHsKKyAgICBkb3VibGUgaTEsIGkyOworICAgIGRvdWJsZSBvMSwgbzI7Cit9IENoYW5DYWNoZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgZW51bSBGaWx0ZXJUeXBlIGZpbHRlcl90eXBlOworICAgIGVudW0gV2lkdGhUeXBlIHdpZHRoX3R5cGU7CisgICAgaW50IHBvbGVzOworICAgIGludCBjc2c7CisKKyAgICBkb3VibGUgZ2FpbjsKKyAgICBkb3VibGUgZnJlcXVlbmN5OworICAgIGRvdWJsZSB3aWR0aDsKKworICAgIGRvdWJsZSBhMCwgYTEsIGEyOworICAgIGRvdWJsZSBiMCwgYjEsIGIyOworCisgICAgQ2hhbkNhY2hlICpjYWNoZTsKKworICAgIHZvaWQgKCpmaWx0ZXIpKGNvbnN0IHZvaWQgKmlidWYsIHZvaWQgKm9idWYsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgZG91YmxlICppMSwgZG91YmxlICppMiwgZG91YmxlICpvMSwgZG91YmxlICpvMiwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgYjAsIGRvdWJsZSBiMSwgZG91YmxlIGIyLCBkb3VibGUgYTEsIGRvdWJsZSBhMik7Cit9IEJpcXVhZHNDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBCaXF1YWRzQ29udGV4dCAqcCA9IGN0eC0+cHJpdjsKKworICAgIGlmIChwLT5maWx0ZXJfdHlwZSAhPSBiaXF1YWQpIHsKKyAgICAgICAgaWYgKHAtPmZyZXF1ZW5jeSA8PSAwIHx8IHAtPndpZHRoIDw9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJlcXVlbmN5ICVmIGFuZC9vciB3aWR0aCAlZiA8PSAwXG4iLAorICAgICAgICAgICAgICAgICAgIHAtPmZyZXF1ZW5jeSwgcC0+d2lkdGgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMlAsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkxQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9OworCisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2xheW91dHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBsYXlvdXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9mbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisKKyAgICBmb3JtYXRzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmb3JtYXRzKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEJJUVVBRF9GSUxURVIobmFtZSwgdHlwZSwgbWluLCBtYXgsIG5lZWRfY2xpcHBpbmcpICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBiaXF1YWRfIyMgbmFtZSAoY29uc3Qgdm9pZCAqaW5wdXQsIHZvaWQgKm91dHB1dCwgaW50IGxlbiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICppbjEsIGRvdWJsZSAqaW4yLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpvdXQxLCBkb3VibGUgKm91dDIsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIwLCBkb3VibGUgYjEsIGRvdWJsZSBiMiwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGExLCBkb3VibGUgYTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdHlwZSAqaWJ1ZiA9IGlucHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSAqb2J1ZiA9IG91dHB1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIGkxID0gKmluMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIGkyID0gKmluMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIG8xID0gKm91dDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIG8yID0gKm91dDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYTEgPSAtYTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYTIgPSAtYTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSsxIDwgbGVuOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG8yID0gaTIgKiBiMiArIGkxICogYjEgKyBpYnVmW2ldICogYjAgKyBvMiAqIGEyICsgbzEgKiBhMTsgICAgICAgICAgICBcCisgICAgICAgIGkyID0gaWJ1ZltpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChuZWVkX2NsaXBwaW5nICYmIG8yIDwgbWluKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJjbGlwcGluZ1xuIik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYnVmW2ldID0gbWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAobmVlZF9jbGlwcGluZyAmJiBvMiA+IG1heCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJjbGlwcGluZ1xuIik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYnVmW2ldID0gbWF4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYnVmW2ldID0gbzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG8xID0gaTEgKiBiMiArIGkyICogYjEgKyBpYnVmW2ldICogYjAgKyBvMSAqIGEyICsgbzIgKiBhMTsgICAgICAgICAgICBcCisgICAgICAgIGkxID0gaWJ1ZltpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChuZWVkX2NsaXBwaW5nICYmIG8xIDwgbWluKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJjbGlwcGluZ1xuIik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYnVmW2ldID0gbWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAobmVlZF9jbGlwcGluZyAmJiBvMSA+IG1heCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJjbGlwcGluZ1xuIik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYnVmW2ldID0gbWF4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYnVmW2ldID0gbzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGkgPCBsZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSBvMCA9IGlidWZbaV0gKiBiMCArIGkxICogYjEgKyBpMiAqIGIyICsgbzEgKiBhMSArIG8yICogYTI7ICAgICBcCisgICAgICAgIGkyID0gaTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkxID0gaWJ1ZltpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG8yID0gbzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG8xID0gbzA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChuZWVkX2NsaXBwaW5nICYmIG8wIDwgbWluKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJjbGlwcGluZ1xuIik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYnVmW2ldID0gbWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAobmVlZF9jbGlwcGluZyAmJiBvMCA+IG1heCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJjbGlwcGluZ1xuIik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYnVmW2ldID0gbWF4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYnVmW2ldID0gbzA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmluMSAgPSBpMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmluMiAgPSBpMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKm91dDEgPSBvMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKm91dDIgPSBvMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0JJUVVBRF9GSUxURVIoczE2LCBpbnQxNl90LCBJTlQxNl9NSU4sIElOVDE2X01BWCwgMSkKK0JJUVVBRF9GSUxURVIoczMyLCBpbnQzMl90LCBJTlQzMl9NSU4sIElOVDMyX01BWCwgMSkKK0JJUVVBRF9GSUxURVIoZmx0LCBmbG9hdCwgICAtMS4sIDEuLCAwKQorQklRVUFEX0ZJTFRFUihkYmwsIGRvdWJsZSwgIC0xLiwgMS4sIDApCisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggICAgPSBvdXRsaW5rLT5zcmM7CisgICAgQmlxdWFkc0NvbnRleHQgKnAgICAgICAgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgICAgPSBjdHgtPmlucHV0c1swXTsKKyAgICBkb3VibGUgQSA9IGV4cChwLT5nYWluIC8gNDAgKiBsb2coMTAuKSk7CisgICAgZG91YmxlIHcwID0gMiAqIE1fUEkgKiBwLT5mcmVxdWVuY3kgLyBpbmxpbmstPnNhbXBsZV9yYXRlOworICAgIGRvdWJsZSBhbHBoYTsKKworICAgIGlmICh3MCA+IE1fUEkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkludmFsaWQgZnJlcXVlbmN5ICVmLiBGcmVxdWVuY3kgbXVzdCBiZSBsZXNzIHRoYW4gaGFsZiB0aGUgc2FtcGxlLXJhdGUgJWQuXG4iLAorICAgICAgICAgICAgICAgcC0+ZnJlcXVlbmN5LCBpbmxpbmstPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHAtPndpZHRoX3R5cGUpIHsKKyAgICBjYXNlIE5PTkU6CisgICAgICAgIGFscGhhID0gMC4wOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhFUlRaOgorICAgICAgICBhbHBoYSA9IHNpbih3MCkgLyAoMiAqIHAtPmZyZXF1ZW5jeSAvIHAtPndpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPQ1RBVkU6CisgICAgICAgIGFscGhhID0gc2luKHcwKSAqIHNpbmgobG9nKDIuKSAvIDIgKiBwLT53aWR0aCAqIHcwIC8gc2luKHcwKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUZBQ1RPUjoKKyAgICAgICAgYWxwaGEgPSBzaW4odzApIC8gKDIgKiBwLT53aWR0aCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0xPUEU6CisgICAgICAgIGFscGhhID0gc2luKHcwKSAvIDIgKiBzcXJ0KChBICsgMSAvIEEpICogKDEgLyBwLT53aWR0aCAtIDEpICsgMik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorCisgICAgc3dpdGNoIChwLT5maWx0ZXJfdHlwZSkgeworICAgIGNhc2UgYmlxdWFkOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIGVxdWFsaXplcjoKKyAgICAgICAgcC0+YTAgPSAgIDEgKyBhbHBoYSAvIEE7CisgICAgICAgIHAtPmExID0gIC0yICogY29zKHcwKTsKKyAgICAgICAgcC0+YTIgPSAgIDEgLSBhbHBoYSAvIEE7CisgICAgICAgIHAtPmIwID0gICAxICsgYWxwaGEgKiBBOworICAgICAgICBwLT5iMSA9ICAtMiAqIGNvcyh3MCk7CisgICAgICAgIHAtPmIyID0gICAxIC0gYWxwaGEgKiBBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGJhc3M6CisgICAgICAgIHAtPmEwID0gICAgICAgICAgKEEgKyAxKSArIChBIC0gMSkgKiBjb3ModzApICsgMiAqIHNxcnQoQSkgKiBhbHBoYTsKKyAgICAgICAgcC0+YTEgPSAgICAtMiAqICgoQSAtIDEpICsgKEEgKyAxKSAqIGNvcyh3MCkpOworICAgICAgICBwLT5hMiA9ICAgICAgICAgIChBICsgMSkgKyAoQSAtIDEpICogY29zKHcwKSAtIDIgKiBzcXJ0KEEpICogYWxwaGE7CisgICAgICAgIHAtPmIwID0gICAgIEEgKiAoKEEgKyAxKSAtIChBIC0gMSkgKiBjb3ModzApICsgMiAqIHNxcnQoQSkgKiBhbHBoYSk7CisgICAgICAgIHAtPmIxID0gMiAqIEEgKiAoKEEgLSAxKSAtIChBICsgMSkgKiBjb3ModzApKTsKKyAgICAgICAgcC0+YjIgPSAgICAgQSAqICgoQSArIDEpIC0gKEEgLSAxKSAqIGNvcyh3MCkgLSAyICogc3FydChBKSAqIGFscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSB0cmVibGU6CisgICAgICAgIHAtPmEwID0gICAgICAgICAgKEEgKyAxKSAtIChBIC0gMSkgKiBjb3ModzApICsgMiAqIHNxcnQoQSkgKiBhbHBoYTsKKyAgICAgICAgcC0+YTEgPSAgICAgMiAqICgoQSAtIDEpIC0gKEEgKyAxKSAqIGNvcyh3MCkpOworICAgICAgICBwLT5hMiA9ICAgICAgICAgIChBICsgMSkgLSAoQSAtIDEpICogY29zKHcwKSAtIDIgKiBzcXJ0KEEpICogYWxwaGE7CisgICAgICAgIHAtPmIwID0gICAgIEEgKiAoKEEgKyAxKSArIChBIC0gMSkgKiBjb3ModzApICsgMiAqIHNxcnQoQSkgKiBhbHBoYSk7CisgICAgICAgIHAtPmIxID0tMiAqIEEgKiAoKEEgLSAxKSArIChBICsgMSkgKiBjb3ModzApKTsKKyAgICAgICAgcC0+YjIgPSAgICAgQSAqICgoQSArIDEpICsgKEEgLSAxKSAqIGNvcyh3MCkgLSAyICogc3FydChBKSAqIGFscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBiYW5kcGFzczoKKyAgICAgICAgaWYgKHAtPmNzZykgeworICAgICAgICAgICAgcC0+YTAgPSAgMSArIGFscGhhOworICAgICAgICAgICAgcC0+YTEgPSAtMiAqIGNvcyh3MCk7CisgICAgICAgICAgICBwLT5hMiA9ICAxIC0gYWxwaGE7CisgICAgICAgICAgICBwLT5iMCA9ICBzaW4odzApIC8gMjsKKyAgICAgICAgICAgIHAtPmIxID0gIDA7CisgICAgICAgICAgICBwLT5iMiA9IC1zaW4odzApIC8gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHAtPmEwID0gIDEgKyBhbHBoYTsKKyAgICAgICAgICAgIHAtPmExID0gLTIgKiBjb3ModzApOworICAgICAgICAgICAgcC0+YTIgPSAgMSAtIGFscGhhOworICAgICAgICAgICAgcC0+YjAgPSAgYWxwaGE7CisgICAgICAgICAgICBwLT5iMSA9ICAwOworICAgICAgICAgICAgcC0+YjIgPSAtYWxwaGE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBiYW5kcmVqZWN0OgorICAgICAgICBwLT5hMCA9ICAxICsgYWxwaGE7CisgICAgICAgIHAtPmExID0gLTIgKiBjb3ModzApOworICAgICAgICBwLT5hMiA9ICAxIC0gYWxwaGE7CisgICAgICAgIHAtPmIwID0gIDE7CisgICAgICAgIHAtPmIxID0gLTIgKiBjb3ModzApOworICAgICAgICBwLT5iMiA9ICAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGxvd3Bhc3M6CisgICAgICAgIGlmIChwLT5wb2xlcyA9PSAxKSB7CisgICAgICAgICAgICBwLT5hMCA9IDE7CisgICAgICAgICAgICBwLT5hMSA9IC1leHAoLXcwKTsKKyAgICAgICAgICAgIHAtPmEyID0gMDsKKyAgICAgICAgICAgIHAtPmIwID0gMSArIHAtPmExOworICAgICAgICAgICAgcC0+YjEgPSAwOworICAgICAgICAgICAgcC0+YjIgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcC0+YTAgPSAgMSArIGFscGhhOworICAgICAgICAgICAgcC0+YTEgPSAtMiAqIGNvcyh3MCk7CisgICAgICAgICAgICBwLT5hMiA9ICAxIC0gYWxwaGE7CisgICAgICAgICAgICBwLT5iMCA9ICgxIC0gY29zKHcwKSkgLyAyOworICAgICAgICAgICAgcC0+YjEgPSAgMSAtIGNvcyh3MCk7CisgICAgICAgICAgICBwLT5iMiA9ICgxIC0gY29zKHcwKSkgLyAyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgaGlnaHBhc3M6CisgICAgICAgIGlmIChwLT5wb2xlcyA9PSAxKSB7CisgICAgICAgICAgICBwLT5hMCA9IDE7CisgICAgICAgICAgICBwLT5hMSA9IC1leHAoLXcwKTsKKyAgICAgICAgICAgIHAtPmEyID0gMDsKKyAgICAgICAgICAgIHAtPmIwID0gKDEgLSBwLT5hMSkgLyAyOworICAgICAgICAgICAgcC0+YjEgPSAtcC0+YjA7CisgICAgICAgICAgICBwLT5iMiA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwLT5hMCA9ICAgMSArIGFscGhhOworICAgICAgICAgICAgcC0+YTEgPSAgLTIgKiBjb3ModzApOworICAgICAgICAgICAgcC0+YTIgPSAgIDEgLSBhbHBoYTsKKyAgICAgICAgICAgIHAtPmIwID0gICgxICsgY29zKHcwKSkgLyAyOworICAgICAgICAgICAgcC0+YjEgPSAtKDEgKyBjb3ModzApKTsKKyAgICAgICAgICAgIHAtPmIyID0gICgxICsgY29zKHcwKSkgLyAyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgYWxscGFzczoKKyAgICAgICAgcC0+YTAgPSAgMSArIGFscGhhOworICAgICAgICBwLT5hMSA9IC0yICogY29zKHcwKTsKKyAgICAgICAgcC0+YTIgPSAgMSAtIGFscGhhOworICAgICAgICBwLT5iMCA9ICAxIC0gYWxwaGE7CisgICAgICAgIHAtPmIxID0gLTIgKiBjb3ModzApOworICAgICAgICBwLT5iMiA9ICAxICsgYWxwaGE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorCisgICAgcC0+YTEgLz0gcC0+YTA7CisgICAgcC0+YTIgLz0gcC0+YTA7CisgICAgcC0+YjAgLz0gcC0+YTA7CisgICAgcC0+YjEgLz0gcC0+YTA7CisgICAgcC0+YjIgLz0gcC0+YTA7CisKKyAgICBwLT5jYWNoZSA9IGF2X3JlYWxsb2NfZihwLT5jYWNoZSwgc2l6ZW9mKENoYW5DYWNoZSksIGlubGluay0+Y2hhbm5lbHMpOworICAgIGlmICghcC0+Y2FjaGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWVtc2V0KHAtPmNhY2hlLCAwLCBzaXplb2YoQ2hhbkNhY2hlKSAqIGlubGluay0+Y2hhbm5lbHMpOworCisgICAgc3dpdGNoIChpbmxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOiBwLT5maWx0ZXIgPSBiaXF1YWRfczE2OyBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyUDogcC0+ZmlsdGVyID0gYmlxdWFkX3MzMjsgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVFA6IHAtPmZpbHRlciA9IGJpcXVhZF9mbHQ7IGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQOiBwLT5maWx0ZXIgPSBiaXF1YWRfZGJsOyBicmVhazsKKyAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqYnVmKQoreworICAgIEJpcXVhZHNDb250ZXh0ICpwICAgICAgID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rICAgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXRfYnVmOworICAgIGludCBuYl9zYW1wbGVzID0gYnVmLT5uYl9zYW1wbGVzOworICAgIGludCBjaDsKKworICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShidWYpKSB7CisgICAgICAgIG91dF9idWYgPSBidWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0X2J1ZiA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKCFvdXRfYnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXRfYnVmLCBidWYpOworICAgIH0KKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2X2ZyYW1lX2dldF9jaGFubmVscyhidWYpOyBjaCsrKQorICAgICAgICBwLT5maWx0ZXIoYnVmLT5leHRlbmRlZF9kYXRhW2NoXSwKKyAgICAgICAgICAgICAgICAgIG91dF9idWYtPmV4dGVuZGVkX2RhdGFbY2hdLCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgJnAtPmNhY2hlW2NoXS5pMSwgJnAtPmNhY2hlW2NoXS5pMiwKKyAgICAgICAgICAgICAgICAgICZwLT5jYWNoZVtjaF0ubzEsICZwLT5jYWNoZVtjaF0ubzIsCisgICAgICAgICAgICAgICAgICBwLT5iMCwgcC0+YjEsIHAtPmIyLCBwLT5hMSwgcC0+YTIpOworCisgICAgaWYgKGJ1ZiAhPSBvdXRfYnVmKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZidWYpOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXRfYnVmKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQmlxdWFkc0NvbnRleHQgKnAgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmVlcCgmcC0+Y2FjaGUpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihCaXF1YWRzQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKKyNkZWZpbmUgREVGSU5FX0JJUVVBRF9GSUxURVIobmFtZV8sIGRlc2NyaXB0aW9uXykgICAgICAgICAgICAgICAgICAgICAgIFwKK0FWRklMVEVSX0RFRklORV9DTEFTUyhuYW1lXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBhdl9jb2xkIGludCBuYW1lXyMjX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCaXF1YWRzQ29udGV4dCAqcCA9IGN0eC0+cHJpdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwLT5jbGFzcyA9ICZuYW1lXyMjX2NsYXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwLT5maWx0ZXJfdHlwZSA9IG5hbWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gaW5pdChjdHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0FWRmlsdGVyIGZmX2FmXyMjbmFtZV8gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubmFtZSAgICAgICAgICA9ICNuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGRlc2NyaXB0aW9uXyksIFwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihCaXF1YWRzQ29udGV4dCksICAgICAgICAgICAgIFwKKyAgICAuaW5pdCAgICAgICAgICA9IG5hbWVfIyNfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaW5wdXRzICAgICAgICA9IGlucHV0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub3V0cHV0cyAgICAgICA9IG91dHB1dHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZuYW1lXyMjX2NsYXNzLCAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmIENPTkZJR19FUVVBTElaRVJfRklMVEVSCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZXF1YWxpemVyX29wdGlvbnNbXSA9IHsKKyAgICB7ImZyZXF1ZW5jeSIsICJzZXQgY2VudHJhbCBmcmVxdWVuY3kiLCBPRkZTRVQoZnJlcXVlbmN5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgMCwgOTk5OTk5LCBGTEFHU30sCisgICAgeyJmIiwgICAgICAgICAic2V0IGNlbnRyYWwgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIDAsIDk5OTk5OSwgRkxBR1N9LAorICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBTTE9QRSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJoIiwgIkh6IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJxIiwgIlEtRmFjdG9yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVFGQUNUT1J9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7Im8iLCAib2N0YXZlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9DVEFWRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsicyIsICJzbG9wZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TTE9QRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsid2lkdGgiLCAic2V0IGJhbmQtd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCAwLCA5OTksIEZMQUdTfSwKKyAgICB7InciLCAgICAgInNldCBiYW5kLXdpZHRoIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgMCwgOTk5LCBGTEFHU30sCisgICAgeyJnYWluIiwgInNldCBnYWluIiwgT0ZGU0VUKGdhaW4pLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTB9LCAtOTAwLCA5MDAsIEZMQUdTfSwKKyAgICB7ImciLCAgICAic2V0IGdhaW4iLCBPRkZTRVQoZ2FpbiksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC05MDAsIDkwMCwgRkxBR1N9LAorICAgIHtOVUxMfQorfTsKKworREVGSU5FX0JJUVVBRF9GSUxURVIoZXF1YWxpemVyLCAiQXBwbHkgdHdvLXBvbGUgcGVha2luZyBlcXVhbGl6YXRpb24gKEVRKSBmaWx0ZXIuIik7CisjZW5kaWYgIC8qIENPTkZJR19FUVVBTElaRVJfRklMVEVSICovCisjaWYgQ09ORklHX0JBU1NfRklMVEVSCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYmFzc19vcHRpb25zW10gPSB7CisgICAgeyJmcmVxdWVuY3kiLCAic2V0IGNlbnRyYWwgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MTAwfSwgMCwgOTk5OTk5LCBGTEFHU30sCisgICAgeyJmIiwgICAgICAgICAic2V0IGNlbnRyYWwgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MTAwfSwgMCwgOTk5OTk5LCBGTEFHU30sCisgICAgeyJ3aWR0aF90eXBlIiwgInNldCBmaWx0ZXItd2lkdGggdHlwZSIsIE9GRlNFVCh3aWR0aF90eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1RRkFDVE9SfSwgSEVSVFosIFNMT1BFLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7ImgiLCAiSHoiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9SEVSVFp9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7InEiLCAiUS1GYWN0b3IiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UUZBQ1RPUn0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsibyIsICJvY3RhdmUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9T0NUQVZFfSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJzIiwgInNsb3BlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNMT1BFfSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJ3aWR0aCIsICJzZXQgc2hlbGYgdHJhbnNpdGlvbiBzdGVlcCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC41fSwgMCwgOTk5OTksIEZMQUdTfSwKKyAgICB7InciLCAgICAgInNldCBzaGVsZiB0cmFuc2l0aW9uIHN0ZWVwIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wLjV9LCAwLCA5OTk5OSwgRkxBR1N9LAorICAgIHsiZ2FpbiIsICJzZXQgZ2FpbiIsIE9GRlNFVChnYWluKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgLTkwMCwgOTAwLCBGTEFHU30sCisgICAgeyJnIiwgICAgInNldCBnYWluIiwgT0ZGU0VUKGdhaW4pLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTB9LCAtOTAwLCA5MDAsIEZMQUdTfSwKKyAgICB7TlVMTH0KK307CisKK0RFRklORV9CSVFVQURfRklMVEVSKGJhc3MsICJCb29zdCBvciBjdXQgbG93ZXIgZnJlcXVlbmNpZXMuIik7CisjZW5kaWYgIC8qIENPTkZJR19CQVNTX0ZJTFRFUiAqLworI2lmIENPTkZJR19UUkVCTEVfRklMVEVSCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdHJlYmxlX29wdGlvbnNbXSA9IHsKKyAgICB7ImZyZXF1ZW5jeSIsICJzZXQgY2VudHJhbCBmcmVxdWVuY3kiLCBPRkZTRVQoZnJlcXVlbmN5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0zMDAwfSwgMCwgOTk5OTk5LCBGTEFHU30sCisgICAgeyJmIiwgICAgICAgICAic2V0IGNlbnRyYWwgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MzAwMH0sIDAsIDk5OTk5OSwgRkxBR1N9LAorICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBTTE9QRSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJoIiwgIkh6IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJxIiwgIlEtRmFjdG9yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVFGQUNUT1J9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7Im8iLCAib2N0YXZlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9DVEFWRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsicyIsICJzbG9wZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TTE9QRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsid2lkdGgiLCAic2V0IHNoZWxmIHRyYW5zaXRpb24gc3RlZXAiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuNX0sIDAsIDk5OTk5LCBGTEFHU30sCisgICAgeyJ3IiwgICAgICJzZXQgc2hlbGYgdHJhbnNpdGlvbiBzdGVlcCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC41fSwgMCwgOTk5OTksIEZMQUdTfSwKKyAgICB7ImdhaW4iLCAic2V0IGdhaW4iLCBPRkZTRVQoZ2FpbiksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC05MDAsIDkwMCwgRkxBR1N9LAorICAgIHsiZyIsICAgICJzZXQgZ2FpbiIsIE9GRlNFVChnYWluKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgLTkwMCwgOTAwLCBGTEFHU30sCisgICAge05VTEx9Cit9OworCitERUZJTkVfQklRVUFEX0ZJTFRFUih0cmVibGUsICJCb29zdCBvciBjdXQgdXBwZXIgZnJlcXVlbmNpZXMuIik7CisjZW5kaWYgIC8qIENPTkZJR19UUkVCTEVfRklMVEVSICovCisjaWYgQ09ORklHX0JBTkRQQVNTX0ZJTFRFUgorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGJhbmRwYXNzX29wdGlvbnNbXSA9IHsKKyAgICB7ImZyZXF1ZW5jeSIsICJzZXQgY2VudHJhbCBmcmVxdWVuY3kiLCBPRkZTRVQoZnJlcXVlbmN5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0zMDAwfSwgMCwgOTk5OTk5LCBGTEFHU30sCisgICAgeyJmIiwgICAgICAgICAic2V0IGNlbnRyYWwgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MzAwMH0sIDAsIDk5OTk5OSwgRkxBR1N9LAorICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBTTE9QRSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJoIiwgIkh6IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJxIiwgIlEtRmFjdG9yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVFGQUNUT1J9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7Im8iLCAib2N0YXZlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9DVEFWRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsicyIsICJzbG9wZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TTE9QRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsid2lkdGgiLCAic2V0IGJhbmQtd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuNX0sIDAsIDk5OSwgRkxBR1N9LAorICAgIHsidyIsICAgICAic2V0IGJhbmQtd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuNX0sIDAsIDk5OSwgRkxBR1N9LAorICAgIHsiY3NnIiwgICAidXNlIGNvbnN0YW50IHNraXJ0IGdhaW4iLCBPRkZTRVQoY3NnKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMSwgRkxBR1N9LAorICAgIHtOVUxMfQorfTsKKworREVGSU5FX0JJUVVBRF9GSUxURVIoYmFuZHBhc3MsICJBcHBseSBhIHR3by1wb2xlIEJ1dHRlcndvcnRoIGJhbmQtcGFzcyBmaWx0ZXIuIik7CisjZW5kaWYgIC8qIENPTkZJR19CQU5EUEFTU19GSUxURVIgKi8KKyNpZiBDT05GSUdfQkFORFJFSkVDVF9GSUxURVIKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBiYW5kcmVqZWN0X29wdGlvbnNbXSA9IHsKKyAgICB7ImZyZXF1ZW5jeSIsICJzZXQgY2VudHJhbCBmcmVxdWVuY3kiLCBPRkZTRVQoZnJlcXVlbmN5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0zMDAwfSwgMCwgOTk5OTk5LCBGTEFHU30sCisgICAgeyJmIiwgICAgICAgICAic2V0IGNlbnRyYWwgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MzAwMH0sIDAsIDk5OTk5OSwgRkxBR1N9LAorICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBTTE9QRSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJoIiwgIkh6IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJxIiwgIlEtRmFjdG9yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVFGQUNUT1J9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7Im8iLCAib2N0YXZlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9DVEFWRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsicyIsICJzbG9wZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TTE9QRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsid2lkdGgiLCAic2V0IGJhbmQtd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuNX0sIDAsIDk5OSwgRkxBR1N9LAorICAgIHsidyIsICAgICAic2V0IGJhbmQtd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuNX0sIDAsIDk5OSwgRkxBR1N9LAorICAgIHtOVUxMfQorfTsKKworREVGSU5FX0JJUVVBRF9GSUxURVIoYmFuZHJlamVjdCwgIkFwcGx5IGEgdHdvLXBvbGUgQnV0dGVyd29ydGggYmFuZC1yZWplY3QgZmlsdGVyLiIpOworI2VuZGlmICAvKiBDT05GSUdfQkFORFJFSkVDVF9GSUxURVIgKi8KKyNpZiBDT05GSUdfTE9XUEFTU19GSUxURVIKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBsb3dwYXNzX29wdGlvbnNbXSA9IHsKKyAgICB7ImZyZXF1ZW5jeSIsICJzZXQgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9NTAwfSwgMCwgOTk5OTk5LCBGTEFHU30sCisgICAgeyJmIiwgICAgICAgICAic2V0IGZyZXF1ZW5jeSIsIE9GRlNFVChmcmVxdWVuY3kpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTUwMH0sIDAsIDk5OTk5OSwgRkxBR1N9LAorICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBTTE9QRSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJoIiwgIkh6IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJxIiwgIlEtRmFjdG9yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVFGQUNUT1J9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7Im8iLCAib2N0YXZlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9DVEFWRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsicyIsICJzbG9wZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TTE9QRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsid2lkdGgiLCAic2V0IHdpZHRoIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wLjcwN30sIDAsIDk5OTk5LCBGTEFHU30sCisgICAgeyJ3IiwgICAgICJzZXQgd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuNzA3fSwgMCwgOTk5OTksIEZMQUdTfSwKKyAgICB7InBvbGVzIiwgInNldCBudW1iZXIgb2YgcG9sZXMiLCBPRkZTRVQocG9sZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTJ9LCAxLCAyLCBGTEFHU30sCisgICAgeyJwIiwgICAgICJzZXQgbnVtYmVyIG9mIHBvbGVzIiwgT0ZGU0VUKHBvbGVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0yfSwgMSwgMiwgRkxBR1N9LAorICAgIHtOVUxMfQorfTsKKworREVGSU5FX0JJUVVBRF9GSUxURVIobG93cGFzcywgIkFwcGx5IGEgbG93LXBhc3MgZmlsdGVyIHdpdGggM2RCIHBvaW50IGZyZXF1ZW5jeS4iKTsKKyNlbmRpZiAgLyogQ09ORklHX0xPV1BBU1NfRklMVEVSICovCisjaWYgQ09ORklHX0hJR0hQQVNTX0ZJTFRFUgorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGhpZ2hwYXNzX29wdGlvbnNbXSA9IHsKKyAgICB7ImZyZXF1ZW5jeSIsICJzZXQgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MzAwMH0sIDAsIDk5OTk5OSwgRkxBR1N9LAorICAgIHsiZiIsICAgICAgICAgInNldCBmcmVxdWVuY3kiLCBPRkZTRVQoZnJlcXVlbmN5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0zMDAwfSwgMCwgOTk5OTk5LCBGTEFHU30sCisgICAgeyJ3aWR0aF90eXBlIiwgInNldCBmaWx0ZXItd2lkdGggdHlwZSIsIE9GRlNFVCh3aWR0aF90eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1RRkFDVE9SfSwgSEVSVFosIFNMT1BFLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7ImgiLCAiSHoiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9SEVSVFp9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7InEiLCAiUS1GYWN0b3IiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UUZBQ1RPUn0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsibyIsICJvY3RhdmUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9T0NUQVZFfSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJzIiwgInNsb3BlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNMT1BFfSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJ3aWR0aCIsICJzZXQgd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuNzA3fSwgMCwgOTk5OTksIEZMQUdTfSwKKyAgICB7InciLCAgICAgInNldCB3aWR0aCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC43MDd9LCAwLCA5OTk5OSwgRkxBR1N9LAorICAgIHsicG9sZXMiLCAic2V0IG51bWJlciBvZiBwb2xlcyIsIE9GRlNFVChwb2xlcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Mn0sIDEsIDIsIEZMQUdTfSwKKyAgICB7InAiLCAgICAgInNldCBudW1iZXIgb2YgcG9sZXMiLCBPRkZTRVQocG9sZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTJ9LCAxLCAyLCBGTEFHU30sCisgICAge05VTEx9Cit9OworCitERUZJTkVfQklRVUFEX0ZJTFRFUihoaWdocGFzcywgIkFwcGx5IGEgaGlnaC1wYXNzIGZpbHRlciB3aXRoIDNkQiBwb2ludCBmcmVxdWVuY3kuIik7CisjZW5kaWYgIC8qIENPTkZJR19ISUdIUEFTU19GSUxURVIgKi8KKyNpZiBDT05GSUdfQUxMUEFTU19GSUxURVIKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhbGxwYXNzX29wdGlvbnNbXSA9IHsKKyAgICB7ImZyZXF1ZW5jeSIsICJzZXQgY2VudHJhbCBmcmVxdWVuY3kiLCBPRkZTRVQoZnJlcXVlbmN5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0zMDAwfSwgMCwgOTk5OTk5LCBGTEFHU30sCisgICAgeyJmIiwgICAgICAgICAic2V0IGNlbnRyYWwgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MzAwMH0sIDAsIDk5OTk5OSwgRkxBR1N9LAorICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9SEVSVFp9LCBIRVJUWiwgU0xPUEUsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsiaCIsICJIeiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1IRVJUWn0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsicSIsICJRLUZhY3RvciIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1RRkFDVE9SfSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJvIiwgIm9jdGF2ZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1PQ1RBVkV9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7InMiLCAic2xvcGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U0xPUEV9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7IndpZHRoIiwgInNldCBmaWx0ZXItd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTcwNy4xfSwgMCwgOTk5OTksIEZMQUdTfSwKKyAgICB7InciLCAgICAgInNldCBmaWx0ZXItd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTcwNy4xfSwgMCwgOTk5OTksIEZMQUdTfSwKKyAgICB7TlVMTH0KK307CisKK0RFRklORV9CSVFVQURfRklMVEVSKGFsbHBhc3MsICJBcHBseSBhIHR3by1wb2xlIGFsbC1wYXNzIGZpbHRlci4iKTsKKyNlbmRpZiAgLyogQ09ORklHX0FMTFBBU1NfRklMVEVSICovCisjaWYgQ09ORklHX0JJUVVBRF9GSUxURVIKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBiaXF1YWRfb3B0aW9uc1tdID0geworICAgIHsiYTAiLCBOVUxMLCBPRkZTRVQoYTApLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCBJTlQxNl9NSU4sIElOVDE2X01BWCwgRkxBR1N9LAorICAgIHsiYTEiLCBOVUxMLCBPRkZTRVQoYTEpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCBJTlQxNl9NSU4sIElOVDE2X01BWCwgRkxBR1N9LAorICAgIHsiYTIiLCBOVUxMLCBPRkZTRVQoYTIpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCBJTlQxNl9NSU4sIElOVDE2X01BWCwgRkxBR1N9LAorICAgIHsiYjAiLCBOVUxMLCBPRkZTRVQoYjApLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCBJTlQxNl9NSU4sIElOVDE2X01BWCwgRkxBR1N9LAorICAgIHsiYjEiLCBOVUxMLCBPRkZTRVQoYjEpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCBJTlQxNl9NSU4sIElOVDE2X01BWCwgRkxBR1N9LAorICAgIHsiYjIiLCBOVUxMLCBPRkZTRVQoYjIpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCBJTlQxNl9NSU4sIElOVDE2X01BWCwgRkxBR1N9LAorICAgIHtOVUxMfQorfTsKKworREVGSU5FX0JJUVVBRF9GSUxURVIoYmlxdWFkLCAiQXBwbHkgYSBiaXF1YWQgSUlSIGZpbHRlciB3aXRoIHRoZSBnaXZlbiBjb2VmZmljaWVudHMuIik7CisjZW5kaWYgIC8qIENPTkZJR19CSVFVQURfRklMVEVSICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfYnMyYi5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2JzMmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQwYmNkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2JzMmIuYwpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBCYXVlciBzdGVyZW8tdG8tYmluYXVyYWwgZmlsdGVyCisgKi8KKworI2luY2x1ZGUgPGJzMmIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IEJzMmJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGludCBwcm9maWxlOworICAgIGludCBmY3V0OworICAgIGludCBmZWVkOworCisgICAgdF9iczJiZHAgYnMyYnA7CisKKyAgICB2b2lkICgqZmlsdGVyKSh0X2JzMmJkcCBiczJiZHAsIHVpbnQ4X3QgKnNhbXBsZSwgaW50IG4pOworfSBCczJiQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQnMyYkNvbnRleHQsIHgpCisjZGVmaW5lIEEgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJwcm9maWxlIiwgIkFwcGx5IGEgcHJlLWRlZmluZWQgY3Jvc3NmZWVkIGxldmVsIiwKKyAgICAgICAgICAgIE9GRlNFVChwcm9maWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBCUzJCX0RFRkFVTFRfQ0xFVkVMIH0sIDAsIElOVF9NQVgsIEEsICJwcm9maWxlIiB9LAorICAgICAgICB7ICJkZWZhdWx0IiwgImRlZmF1bHQgcHJvZmlsZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBCUzJCX0RFRkFVTFRfQ0xFVkVMIH0sIDAsIDAsIEEsICJwcm9maWxlIiB9LAorICAgICAgICB7ICJjbW95IiwgICAgIkNodSBNb3kgY2lyY3VpdCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBCUzJCX0NNT1lfQ0xFVkVMICAgIH0sIDAsIDAsIEEsICJwcm9maWxlIiB9LAorICAgICAgICB7ICJqbWVpZXIiLCAgIkphbiBNZWllciBjaXJjdWl0IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEJTMkJfSk1FSUVSX0NMRVZFTCAgfSwgMCwgMCwgQSwgInByb2ZpbGUiIH0sCisgICAgeyAiZmN1dCIsICJTZXQgY3V0IGZyZXF1ZW5jeSAoaW4gSHopIiwKKyAgICAgICAgICAgIE9GRlNFVChmY3V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIEJTMkJfTUFYRkNVVCwgQSB9LAorICAgIHsgImZlZWQiLCAiU2V0IGZlZWQgbGV2ZWwgKGluIEh6KSIsCisgICAgICAgICAgICBPRkZTRVQoZmVlZCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBCUzJCX01BWEZFRUQsIEEgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGJzMmJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiYnMyYiBmaWx0ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQnMyYkNvbnRleHQgKmJzMmIgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoIShiczJiLT5iczJicCA9IGJzMmJfb3BlbigpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGJzMmJfc2V0X2xldmVsKGJzMmItPmJzMmJwLCBiczJiLT5wcm9maWxlKTsKKworICAgIGlmIChiczJiLT5mY3V0KQorICAgICAgICBiczJiX3NldF9sZXZlbF9mY3V0KGJzMmItPmJzMmJwLCBiczJiLT5mY3V0KTsKKworICAgIGlmIChiczJiLT5mZWVkKQorICAgICAgICBiczJiX3NldF9sZXZlbF9mZWVkKGJzMmItPmJzMmJwLCBiczJiLT5mZWVkKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBCczJiQ29udGV4dCAqYnMyYiA9IGN0eC0+cHJpdjsKKworICAgIGlmIChiczJiLT5iczJicCkKKyAgICAgICAgYnMyYl9jbG9zZShiczJiLT5iczJicCk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHMgPSBOVUxMOworCisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9VOCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfUzMyLAorICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkwsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSwKKyAgICB9OworCisgICAgaWYgKGZmX2FkZF9jaGFubmVsX2xheW91dCgmbGF5b3V0cywgQVZfQ0hfTEFZT1VUX1NURVJFTykgIT0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgcmV0OworICAgIEFWRnJhbWUgKm91dF9mcmFtZTsKKworICAgIEJzMmJDb250ZXh0ICAgICAqYnMyYiA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworCisgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGZyYW1lKSkgeworICAgICAgICBvdXRfZnJhbWUgPSBmcmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRfZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgICAgICBpZiAoIW91dF9mcmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2X2ZyYW1lX2NvcHkob3V0X2ZyYW1lLCBmcmFtZSk7CisgICAgICAgIHJldCA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0X2ZyYW1lLCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXRfZnJhbWUpOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJzMmItPmZpbHRlcihiczJiLT5iczJicCwgb3V0X2ZyYW1lLT5leHRlbmRlZF9kYXRhWzBdLCBvdXRfZnJhbWUtPm5iX3NhbXBsZXMpOworCisgICAgaWYgKGZyYW1lICE9IG91dF9mcmFtZSkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXRfZnJhbWUpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEJzMmJDb250ZXh0ICAgICpiczJiID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisKKyAgICBpbnQgc3JhdGUgPSBpbmxpbmstPnNhbXBsZV9yYXRlOworCisgICAgc3dpdGNoIChpbmxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9VODoKKyAgICAgICAgYnMyYi0+ZmlsdGVyID0gYnMyYl9jcm9zc19mZWVkX3U4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2OgorICAgICAgICBiczJiLT5maWx0ZXIgPSAodm9pZCopYnMyYl9jcm9zc19mZWVkX3MxNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMjoKKyAgICAgICAgYnMyYi0+ZmlsdGVyID0gKHZvaWQqKWJzMmJfY3Jvc3NfZmVlZF9zMzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFQ6CisgICAgICAgIGJzMmItPmZpbHRlciA9ICh2b2lkKiliczJiX2Nyb3NzX2ZlZWRfZjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTDoKKyAgICAgICAgYnMyYi0+ZmlsdGVyID0gKHZvaWQqKWJzMmJfY3Jvc3NfZmVlZF9kOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgfQorCisgICAgaWYgKChzcmF0ZSA8IEJTMkJfTUlOU1JBVEUpIHx8IChzcmF0ZSA+IEJTMkJfTUFYU1JBVEUpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworCisgICAgYnMyYl9zZXRfc3JhdGUoYnMyYi0+YnMyYnAsIHNyYXRlKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYnMyYl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lICAgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGJzMmJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgICA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYnMyYiA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYnMyYiIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJhdWVyIHN0ZXJlby10by1iaW5hdXJhbCBmaWx0ZXIuIiksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICAgPSBzaXplb2YoQnMyYkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZiczJiX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICAgICA9IGJzMmJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgICA9IGJzMmJfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfY2hhbm5lbG1hcC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2NoYW5uZWxtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQ1NGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2NoYW5uZWxtYXAuYwpAQCAtMCwwICsxLDQxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogYXVkaW8gY2hhbm5lbCBtYXBwaW5nIGZpbHRlcgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0cnVjdCBDaGFubmVsTWFwIHsKKyAgICB1aW50NjRfdCBpbl9jaGFubmVsOworICAgIHVpbnQ2NF90IG91dF9jaGFubmVsOworICAgIGludCBpbl9jaGFubmVsX2lkeDsKKyAgICBpbnQgb3V0X2NoYW5uZWxfaWR4OworfTsKKworZW51bSBNYXBwaW5nTW9kZSB7CisgICAgTUFQX05PTkUsCisgICAgTUFQX09ORV9JTlQsCisgICAgTUFQX09ORV9TVFIsCisgICAgTUFQX1BBSVJfSU5UX0lOVCwKKyAgICBNQVBfUEFJUl9JTlRfU1RSLAorICAgIE1BUF9QQUlSX1NUUl9JTlQsCisgICAgTUFQX1BBSVJfU1RSX1NUUgorfTsKKworI2RlZmluZSBNQVhfQ0ggNjQKK3R5cGVkZWYgc3RydWN0IENoYW5uZWxNYXBDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpjaGFubmVsX2xheW91dHM7CisgICAgY2hhciAqbWFwcGluZ19zdHI7CisgICAgY2hhciAqY2hhbm5lbF9sYXlvdXRfc3RyOworICAgIHVpbnQ2NF90IG91dHB1dF9sYXlvdXQ7CisgICAgc3RydWN0IENoYW5uZWxNYXAgbWFwW01BWF9DSF07CisgICAgaW50IG5jaDsKKyAgICBlbnVtIE1hcHBpbmdNb2RlIG1vZGU7Cit9IENoYW5uZWxNYXBDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDaGFubmVsTWFwQ29udGV4dCwgeCkKKyNkZWZpbmUgQSBBVl9PUFRfRkxBR19BVURJT19QQVJBTQorI2RlZmluZSBGIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGNoYW5uZWxtYXBfb3B0aW9uc1tdID0geworICAgIHsgIm1hcCIsICJBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGlucHV0IGNoYW5uZWwgbnVtYmVycyBpbiBvdXRwdXQgb3JkZXIuIiwKKyAgICAgICAgICBPRkZTRVQobWFwcGluZ19zdHIpLCAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBBfEYgfSwKKyAgICB7ICJjaGFubmVsX2xheW91dCIsICJPdXRwdXQgY2hhbm5lbCBsYXlvdXQuIiwKKyAgICAgICAgICBPRkZTRVQoY2hhbm5lbF9sYXlvdXRfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBBfEYgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGNoYW5uZWxtYXApOworCitzdGF0aWMgY2hhciogc3BsaXQoY2hhciAqbWVzc2FnZSwgY2hhciBkZWxpbSkgeworICAgIGNoYXIgKm5leHQgPSBzdHJjaHIobWVzc2FnZSwgZGVsaW0pOworICAgIGlmIChuZXh0KQorICAgICAgKm5leHQrKyA9ICdcMCc7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NoYW5uZWxfaWR4KGNoYXIgKiptYXAsIGludCAqY2gsIGNoYXIgZGVsaW0sIGludCBtYXhfY2gpCit7CisgICAgY2hhciAqbmV4dCA9IHNwbGl0KCptYXAsIGRlbGltKTsKKyAgICBpbnQgbGVuOworICAgIGludCBuID0gMDsKKyAgICBpZiAoIW5leHQgJiYgZGVsaW0gPT0gJy0nKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGxlbiA9IHN0cmxlbigqbWFwKTsKKyAgICBzc2NhbmYoKm1hcCwgIiVkJW4iLCBjaCwgJm4pOworICAgIGlmIChuICE9IGxlbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBpZiAoKmNoIDwgMCB8fCAqY2ggPiBtYXhfY2gpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgKm1hcCA9IG5leHQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NoYW5uZWwoY2hhciAqKm1hcCwgdWludDY0X3QgKmNoLCBjaGFyIGRlbGltKQoreworICAgIGNoYXIgKm5leHQgPSBzcGxpdCgqbWFwLCBkZWxpbSk7CisgICAgaWYgKCFuZXh0ICYmIGRlbGltID09ICctJykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAqY2ggPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXQoKm1hcCk7CisgICAgaWYgKGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscygqY2gpICE9IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgKm1hcCA9IG5leHQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjaGFubmVsbWFwX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQ2hhbm5lbE1hcENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY2hhciAqbWFwcGluZywgc2VwYXJhdG9yID0gJ3wnOworICAgIGludCBtYXBfZW50cmllcyA9IDA7CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBlbnVtIE1hcHBpbmdNb2RlIG1vZGU7CisgICAgdWludDY0X3Qgb3V0X2NoX21hc2sgPSAwOworICAgIGludCBpOworCisgICAgbWFwcGluZyA9IHMtPm1hcHBpbmdfc3RyOworCisgICAgaWYgKCFtYXBwaW5nKSB7CisgICAgICAgIG1vZGUgPSBNQVBfTk9ORTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyICpkYXNoID0gc3RyY2hyKG1hcHBpbmcsICctJyk7CisgICAgICAgIGlmICghZGFzaCkgeyAgLy8gc2hvcnQgbWFwcGluZworICAgICAgICAgICAgaWYgKGF2X2lzZGlnaXQoKm1hcHBpbmcpKQorICAgICAgICAgICAgICAgIG1vZGUgPSBNQVBfT05FX0lOVDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtb2RlID0gTUFQX09ORV9TVFI7CisgICAgICAgIH0gZWxzZSBpZiAoYXZfaXNkaWdpdCgqbWFwcGluZykpIHsKKyAgICAgICAgICAgIGlmIChhdl9pc2RpZ2l0KCooZGFzaCsxKSkpCisgICAgICAgICAgICAgICAgbW9kZSA9IE1BUF9QQUlSX0lOVF9JTlQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbW9kZSA9IE1BUF9QQUlSX0lOVF9TVFI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYXZfaXNkaWdpdCgqKGRhc2grMSkpKQorICAgICAgICAgICAgICAgIG1vZGUgPSBNQVBfUEFJUl9TVFJfSU5UOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1vZGUgPSBNQVBfUEFJUl9TVFJfU1RSOworICAgICAgICB9CisjaWYgRkZfQVBJX09MRF9GSUxURVJfT1BUUworICAgICAgICBpZiAoc3RyY2hyKG1hcHBpbmcsICcsJykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhpcyBzeW50YXggaXMgZGVwcmVjYXRlZCwgdXNlICIKKyAgICAgICAgICAgICAgICAgICAiJ3wnIHRvIHNlcGFyYXRlIHRoZSBtYXBwaW5ncy5cbiIpOworICAgICAgICAgICAgc2VwYXJhdG9yID0gJywnOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobW9kZSAhPSBNQVBfTk9ORSkgeworICAgICAgICBjaGFyICpzZXAgPSBtYXBwaW5nOworICAgICAgICBtYXBfZW50cmllcyA9IDE7CisgICAgICAgIHdoaWxlICgoc2VwID0gc3RyY2hyKHNlcCwgc2VwYXJhdG9yKSkpIHsKKyAgICAgICAgICAgIGlmICgqKytzZXApICAvLyBBbGxvdyB0cmFpbGluZyBjb21tYQorICAgICAgICAgICAgICAgIG1hcF9lbnRyaWVzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWFwX2VudHJpZXMgPiBNQVhfQ0gpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgY2hhbm5lbHMgbWFwcGVkOiAnJWQnLlxuIiwgbWFwX2VudHJpZXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXBfZW50cmllczsgaSsrKSB7CisgICAgICAgIGludCBpbl9jaF9pZHggPSAtMSwgb3V0X2NoX2lkeCA9IC0xOworICAgICAgICB1aW50NjRfdCBpbl9jaCA9IDAsIG91dF9jaCA9IDA7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGVycltdID0gIkZhaWxlZCB0byBwYXJzZSBjaGFubmVsIG1hcFxuIjsKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgTUFQX09ORV9JTlQ6CisgICAgICAgICAgICBpZiAoZ2V0X2NoYW5uZWxfaWR4KCZtYXBwaW5nLCAmaW5fY2hfaWR4LCBzZXBhcmF0b3IsIE1BWF9DSCkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5tYXBbaV0uaW5fY2hhbm5lbF9pZHggID0gaW5fY2hfaWR4OworICAgICAgICAgICAgcy0+bWFwW2ldLm91dF9jaGFubmVsX2lkeCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVBfT05FX1NUUjoKKyAgICAgICAgICAgIGlmIChnZXRfY2hhbm5lbCgmbWFwcGluZywgJmluX2NoLCBzZXBhcmF0b3IpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+bWFwW2ldLmluX2NoYW5uZWwgICAgICA9IGluX2NoOworICAgICAgICAgICAgcy0+bWFwW2ldLm91dF9jaGFubmVsX2lkeCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVBfUEFJUl9JTlRfSU5UOgorICAgICAgICAgICAgaWYgKGdldF9jaGFubmVsX2lkeCgmbWFwcGluZywgJmluX2NoX2lkeCwgJy0nLCBNQVhfQ0gpIDwgMCB8fAorICAgICAgICAgICAgICAgIGdldF9jaGFubmVsX2lkeCgmbWFwcGluZywgJm91dF9jaF9pZHgsIHNlcGFyYXRvciwgTUFYX0NIKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPm1hcFtpXS5pbl9jaGFubmVsX2lkeCAgPSBpbl9jaF9pZHg7CisgICAgICAgICAgICBzLT5tYXBbaV0ub3V0X2NoYW5uZWxfaWR4ID0gb3V0X2NoX2lkeDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BUF9QQUlSX0lOVF9TVFI6CisgICAgICAgICAgICBpZiAoZ2V0X2NoYW5uZWxfaWR4KCZtYXBwaW5nLCAmaW5fY2hfaWR4LCAnLScsIE1BWF9DSCkgPCAwIHx8CisgICAgICAgICAgICAgICAgZ2V0X2NoYW5uZWwoJm1hcHBpbmcsICZvdXRfY2gsIHNlcGFyYXRvcikgPCAwIHx8CisgICAgICAgICAgICAgICAgb3V0X2NoICYgb3V0X2NoX21hc2spIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPm1hcFtpXS5pbl9jaGFubmVsX2lkeCAgPSBpbl9jaF9pZHg7CisgICAgICAgICAgICBzLT5tYXBbaV0ub3V0X2NoYW5uZWwgICAgID0gb3V0X2NoOworICAgICAgICAgICAgb3V0X2NoX21hc2sgfD0gb3V0X2NoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFQX1BBSVJfU1RSX0lOVDoKKyAgICAgICAgICAgIGlmIChnZXRfY2hhbm5lbCgmbWFwcGluZywgJmluX2NoLCAnLScpIDwgMCB8fAorICAgICAgICAgICAgICAgIGdldF9jaGFubmVsX2lkeCgmbWFwcGluZywgJm91dF9jaF9pZHgsIHNlcGFyYXRvciwgTUFYX0NIKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPm1hcFtpXS5pbl9jaGFubmVsICAgICAgPSBpbl9jaDsKKyAgICAgICAgICAgIHMtPm1hcFtpXS5vdXRfY2hhbm5lbF9pZHggPSBvdXRfY2hfaWR4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFQX1BBSVJfU1RSX1NUUjoKKyAgICAgICAgICAgIGlmIChnZXRfY2hhbm5lbCgmbWFwcGluZywgJmluX2NoLCAnLScpIDwgMCB8fAorICAgICAgICAgICAgICAgIGdldF9jaGFubmVsKCZtYXBwaW5nLCAmb3V0X2NoLCBzZXBhcmF0b3IpIDwgMCB8fAorICAgICAgICAgICAgICAgIG91dF9jaCAmIG91dF9jaF9tYXNrKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5tYXBbaV0uaW5fY2hhbm5lbCA9IGluX2NoOworICAgICAgICAgICAgcy0+bWFwW2ldLm91dF9jaGFubmVsID0gb3V0X2NoOworICAgICAgICAgICAgb3V0X2NoX21hc2sgfD0gb3V0X2NoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+bW9kZSAgICAgICAgICA9IG1vZGU7CisgICAgcy0+bmNoICAgICAgICAgICA9IG1hcF9lbnRyaWVzOworICAgIHMtPm91dHB1dF9sYXlvdXQgPSBvdXRfY2hfbWFzayA/IG91dF9jaF9tYXNrIDoKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQobWFwX2VudHJpZXMpOworCisgICAgaWYgKHMtPmNoYW5uZWxfbGF5b3V0X3N0cikgeworICAgICAgICB1aW50NjRfdCBmbXQ7CisgICAgICAgIGlmICgoZm10ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0KHMtPmNoYW5uZWxfbGF5b3V0X3N0cikpID09IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgY2hhbm5lbCBsYXlvdXQ6ICclcycuXG4iLAorICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfbGF5b3V0X3N0cik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGlmIChtb2RlID09IE1BUF9OT05FKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIHMtPm5jaCA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhmbXQpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5jaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcy0+bWFwW2ldLmluX2NoYW5uZWxfaWR4ICA9IGk7CisgICAgICAgICAgICAgICAgcy0+bWFwW2ldLm91dF9jaGFubmVsX2lkeCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAob3V0X2NoX21hc2sgJiYgb3V0X2NoX21hc2sgIT0gZm10KSB7CisgICAgICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIDAsIG91dF9jaF9tYXNrKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiT3V0cHV0IGNoYW5uZWwgbGF5b3V0ICclcycgZG9lcyBub3QgbWF0Y2ggdGhlIGxpc3Qgb2YgY2hhbm5lbCBtYXBwZWQ6ICclcycuXG4iLAorICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfbGF5b3V0X3N0ciwgYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0gZWxzZSBpZiAocy0+bmNoICE9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhmbXQpKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIk91dHB1dCBjaGFubmVsIGxheW91dCAlcyBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG1hcHBlZCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9sYXlvdXRfc3RyLCBzLT5uY2gpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBzLT5vdXRwdXRfbGF5b3V0ID0gZm10OworICAgIH0KKyAgICBpZiAoIXMtPm91dHB1dF9sYXlvdXQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3V0cHV0IGNoYW5uZWwgbGF5b3V0IGlzIG5vdCBzZXQgYW5kICIKKyAgICAgICAgICAgICAgICJjYW5ub3QgYmUgZ3Vlc3NlZCBmcm9tIHRoZSBtYXBzLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZmZfYWRkX2NoYW5uZWxfbGF5b3V0KCZzLT5jaGFubmVsX2xheW91dHMsIHMtPm91dHB1dF9sYXlvdXQpOworCisgICAgaWYgKG1vZGUgPT0gTUFQX1BBSVJfSU5UX1NUUiB8fCBtb2RlID09IE1BUF9QQUlSX1NUUl9TVFIpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5jaDsgaSsrKSB7CisgICAgICAgICAgICBzLT5tYXBbaV0ub3V0X2NoYW5uZWxfaWR4ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X2NoYW5uZWxfaW5kZXgoCisgICAgICAgICAgICAgICAgcy0+b3V0cHV0X2xheW91dCwgcy0+bWFwW2ldLm91dF9jaGFubmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoYW5uZWxtYXBfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDaGFubmVsTWFwQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzOworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfcGxhbmFyX3NhbXBsZV9mbXRzKCkpOworICAgIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmZl9hbGxfc2FtcGxlcmF0ZXMoKSk7CisKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfbGF5b3V0cygpOworICAgIGlmICghbGF5b3V0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJmN0eC0+aW5wdXRzWzBdLT5vdXRfY2hhbm5lbF9sYXlvdXRzKTsKKyAgICBmZl9jaGFubmVsX2xheW91dHNfcmVmKHMtPmNoYW5uZWxfbGF5b3V0cywgICAgICAgJmN0eC0+b3V0cHV0c1swXS0+aW5fY2hhbm5lbF9sYXlvdXRzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoYW5uZWxtYXBfZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIGNvbnN0IENoYW5uZWxNYXBDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IGludCBuY2hfaW4gPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoaW5saW5rLT5jaGFubmVsX2xheW91dCk7CisgICAgY29uc3QgaW50IG5jaF9vdXQgPSBzLT5uY2g7CisgICAgaW50IGNoOworICAgIHVpbnQ4X3QgKnNvdXJjZV9wbGFuZXNbTUFYX0NIXTsKKworICAgIG1lbWNweShzb3VyY2VfcGxhbmVzLCBidWYtPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgIG5jaF9pbiAqIHNpemVvZihzb3VyY2VfcGxhbmVzWzBdKSk7CisKKyAgICBpZiAobmNoX291dCA+IG5jaF9pbikgeworICAgICAgICBpZiAobmNoX291dCA+IEZGX0FSUkFZX0VMRU1TKGJ1Zi0+ZGF0YSkpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKipuZXdfZXh0ZW5kZWRfZGF0YSA9CisgICAgICAgICAgICAgICAgYXZfbWFsbG9jel9hcnJheShuY2hfb3V0LCBzaXplb2YoKmJ1Zi0+ZXh0ZW5kZWRfZGF0YSkpOworICAgICAgICAgICAgaWYgKCFuZXdfZXh0ZW5kZWRfZGF0YSkgeworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWYtPmV4dGVuZGVkX2RhdGEgPT0gYnVmLT5kYXRhKSB7CisgICAgICAgICAgICAgICAgYnVmLT5leHRlbmRlZF9kYXRhID0gbmV3X2V4dGVuZGVkX2RhdGE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUoYnVmLT5leHRlbmRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICBidWYtPmV4dGVuZGVkX2RhdGEgPSBuZXdfZXh0ZW5kZWRfZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChidWYtPmV4dGVuZGVkX2RhdGEgIT0gYnVmLT5kYXRhKSB7CisgICAgICAgICAgICBhdl9mcmVlKGJ1Zi0+ZXh0ZW5kZWRfZGF0YSk7CisgICAgICAgICAgICBidWYtPmV4dGVuZGVkX2RhdGEgPSBidWYtPmRhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBuY2hfb3V0OyBjaCsrKSB7CisgICAgICAgIGJ1Zi0+ZXh0ZW5kZWRfZGF0YVtzLT5tYXBbY2hdLm91dF9jaGFubmVsX2lkeF0gPQorICAgICAgICAgICAgc291cmNlX3BsYW5lc1tzLT5tYXBbY2hdLmluX2NoYW5uZWxfaWR4XTsKKyAgICB9CisKKyAgICBpZiAoYnVmLT5kYXRhICE9IGJ1Zi0+ZXh0ZW5kZWRfZGF0YSkKKyAgICAgICAgbWVtY3B5KGJ1Zi0+ZGF0YSwgYnVmLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICBGRk1JTihGRl9BUlJBWV9FTEVNUyhidWYtPmRhdGEpLCBuY2hfb3V0KSAqIHNpemVvZihidWYtPmRhdGFbMF0pKTsKKworICAgIGJ1Zi0+Y2hhbm5lbF9sYXlvdXQgPSBvdXRsaW5rLT5jaGFubmVsX2xheW91dDsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgYnVmKTsKK30KKworc3RhdGljIGludCBjaGFubmVsbWFwX2NvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIENoYW5uZWxNYXBDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBuYl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhpbmxpbmstPmNoYW5uZWxfbGF5b3V0KTsKKyAgICBpbnQgaSwgZXJyID0gMDsKKyAgICBjb25zdCBjaGFyICpjaGFubmVsX25hbWU7CisgICAgY2hhciBsYXlvdXRfbmFtZVsyNTZdOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5jaDsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBDaGFubmVsTWFwICptID0gJnMtPm1hcFtpXTsKKworICAgICAgICBpZiAocy0+bW9kZSA9PSBNQVBfUEFJUl9TVFJfSU5UIHx8IHMtPm1vZGUgPT0gTUFQX1BBSVJfU1RSX1NUUikgeworICAgICAgICAgICAgbS0+aW5fY2hhbm5lbF9pZHggPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfY2hhbm5lbF9pbmRleCgKKyAgICAgICAgICAgICAgICBpbmxpbmstPmNoYW5uZWxfbGF5b3V0LCBtLT5pbl9jaGFubmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtLT5pbl9jaGFubmVsX2lkeCA8IDAgfHwgbS0+aW5fY2hhbm5lbF9pZHggPj0gbmJfY2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcobGF5b3V0X25hbWUsIHNpemVvZihsYXlvdXRfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGlubGluay0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICAgICAgaWYgKG0tPmluX2NoYW5uZWwpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsX25hbWUgPSBhdl9nZXRfY2hhbm5lbF9uYW1lKG0tPmluX2NoYW5uZWwpOworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImlucHV0IGNoYW5uZWwgJyVzJyBub3QgYXZhaWxhYmxlIGZyb20gaW5wdXQgbGF5b3V0ICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbmFtZSwgbGF5b3V0X25hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dCBjaGFubmVsICMlZCBub3QgYXZhaWxhYmxlIGZyb20gaW5wdXQgbGF5b3V0ICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG0tPmluX2NoYW5uZWxfaWR4LCBsYXlvdXRfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfY2hhbm5lbG1hcF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lICAgPSBjaGFubmVsbWFwX2ZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgID0gY2hhbm5lbG1hcF9jb25maWdfaW5wdXQsCisgICAgICAgIC5uZWVkc193cml0YWJsZSA9IDEsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2NoYW5uZWxtYXBfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfY2hhbm5lbG1hcCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJjaGFubmVsbWFwIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZW1hcCBhdWRpbyBjaGFubmVscy4iKSwKKyAgICAuaW5pdCAgICAgICAgICA9IGNoYW5uZWxtYXBfaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IGNoYW5uZWxtYXBfcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihDaGFubmVsTWFwQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmY2hhbm5lbG1hcF9jbGFzcywKKyAgICAuaW5wdXRzICAgICAgICA9IGF2ZmlsdGVyX2FmX2NoYW5uZWxtYXBfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfYWZfY2hhbm5lbG1hcF9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9jaGFubmVsc3BsaXQuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9jaGFubmVsc3BsaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzc1NmUyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2NoYW5uZWxzcGxpdC5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENoYW5uZWwgc3BsaXQgZmlsdGVyCisgKgorICogU3BsaXQgYW4gYXVkaW8gc3RyZWFtIGludG8gcGVyLWNoYW5uZWwgc3RyZWFtcy4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IENoYW5uZWxTcGxpdENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgdWludDY0X3QgY2hhbm5lbF9sYXlvdXQ7CisgICAgY2hhciAgICAqY2hhbm5lbF9sYXlvdXRfc3RyOworfSBDaGFubmVsU3BsaXRDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDaGFubmVsU3BsaXRDb250ZXh0LCB4KQorI2RlZmluZSBBIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNCisjZGVmaW5lIEYgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gY2hhbm5lbHNwbGl0X29wdGlvbnNbXSA9IHsKKyAgICB7ICJjaGFubmVsX2xheW91dCIsICJJbnB1dCBjaGFubmVsIGxheW91dC4iLCBPRkZTRVQoY2hhbm5lbF9sYXlvdXRfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAic3RlcmVvIiB9LCAuZmxhZ3MgPSBBfEYgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGNoYW5uZWxzcGxpdCk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIENoYW5uZWxTcGxpdENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IG5iX2NoYW5uZWxzOworICAgIGludCByZXQgPSAwLCBpOworCisgICAgaWYgKCEocy0+Y2hhbm5lbF9sYXlvdXQgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXQocy0+Y2hhbm5lbF9sYXlvdXRfc3RyKSkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyBjaGFubmVsIGxheW91dCAnJXMnLlxuIiwKKyAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfbGF5b3V0X3N0cik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG5iX2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHMtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfY2hhbm5lbHM7IGkrKykgeworICAgICAgICB1aW50NjRfdCBjaGFubmVsID0gYXZfY2hhbm5lbF9sYXlvdXRfZXh0cmFjdF9jaGFubmVsKHMtPmNoYW5uZWxfbGF5b3V0LCBpKTsKKyAgICAgICAgQVZGaWx0ZXJQYWQgcGFkICA9IHsgMCB9OworCisgICAgICAgIHBhZC50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBwYWQubmFtZSA9IGF2X2dldF9jaGFubmVsX25hbWUoY2hhbm5lbCk7CisKKyAgICAgICAgZmZfaW5zZXJ0X291dHBhZChjdHgsIGksICZwYWQpOworICAgIH0KKworZmFpbDoKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQ2hhbm5lbFNwbGl0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICppbl9sYXlvdXRzID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyAgICAoY3R4LCBmZl9wbGFuYXJfc2FtcGxlX2ZtdHMoKSk7CisgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZmX2FsbF9zYW1wbGVyYXRlcygpKTsKKworICAgIGZmX2FkZF9jaGFubmVsX2xheW91dCgmaW5fbGF5b3V0cywgcy0+Y2hhbm5lbF9sYXlvdXQpOworICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYoaW5fbGF5b3V0cywgJmN0eC0+aW5wdXRzWzBdLT5vdXRfY2hhbm5lbF9sYXlvdXRzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX291dHB1dHM7IGkrKykgeworICAgICAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpvdXRfbGF5b3V0cyA9IE5VTEw7CisgICAgICAgIHVpbnQ2NF90IGNoYW5uZWwgPSBhdl9jaGFubmVsX2xheW91dF9leHRyYWN0X2NoYW5uZWwocy0+Y2hhbm5lbF9sYXlvdXQsIGkpOworCisgICAgICAgIGZmX2FkZF9jaGFubmVsX2xheW91dCgmb3V0X2xheW91dHMsIGNoYW5uZWwpOworICAgICAgICBmZl9jaGFubmVsX2xheW91dHNfcmVmKG91dF9sYXlvdXRzLCAmY3R4LT5vdXRwdXRzW2ldLT5pbl9jaGFubmVsX2xheW91dHMpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqYnVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgaW50IGksIHJldCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9vdXRwdXRzOyBpKyspIHsKKyAgICAgICAgQVZGcmFtZSAqYnVmX291dCA9IGF2X2ZyYW1lX2Nsb25lKGJ1Zik7CisKKyAgICAgICAgaWYgKCFidWZfb3V0KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJ1Zl9vdXQtPmRhdGFbMF0gPSBidWZfb3V0LT5leHRlbmRlZF9kYXRhWzBdID0gYnVmX291dC0+ZXh0ZW5kZWRfZGF0YVtpXTsKKyAgICAgICAgYnVmX291dC0+Y2hhbm5lbF9sYXlvdXQgPQorICAgICAgICAgICAgYXZfY2hhbm5lbF9sYXlvdXRfZXh0cmFjdF9jaGFubmVsKGJ1Zi0+Y2hhbm5lbF9sYXlvdXQsIGkpOworICAgICAgICBhdl9mcmFtZV9zZXRfY2hhbm5lbHMoYnVmX291dCwgMSk7CisKKyAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1tpXSwgYnVmX291dCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2NoYW5uZWxzcGxpdF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfY2hhbm5lbHNwbGl0ID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjaGFubmVsc3BsaXQiLAorICAgIC5kZXNjcmlwdGlvbiAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTcGxpdCBhdWRpbyBpbnRvIHBlci1jaGFubmVsIHN0cmVhbXMuIiksCisgICAgLnByaXZfc2l6ZSAgICAgID0gc2l6ZW9mKENoYW5uZWxTcGxpdENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZjaGFubmVsc3BsaXRfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgID0gaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyAgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgICA9IGF2ZmlsdGVyX2FmX2NoYW5uZWxzcGxpdF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgID0gTlVMTCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfT1VUUFVUUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfY29tcGFuZC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2NvbXBhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2E3M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2NvbXBhbmQuYwpAQCAtMCwwICsxLDU4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBDaHJpcyBCYWd3ZWxsCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgTmljayBCYWlsZXkKKyAqIENvcHlyaWdodCAoYykgMjAwNyBSb2IgU3lrZXMgPHJvYnNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDEzIFBhdWwgQiBNYWhvbAorICogQ29weXJpZ2h0IChjKSAyMDE0IEFuZHJldyBLZWxsZXkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogYXVkaW8gY29tcGFuZCBmaWx0ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhblBhcmFtIHsKKyAgICBkb3VibGUgYXR0YWNrOworICAgIGRvdWJsZSBkZWNheTsKKyAgICBkb3VibGUgdm9sdW1lOworfSBDaGFuUGFyYW07CisKK3R5cGVkZWYgc3RydWN0IENvbXBhbmRTZWdtZW50IHsKKyAgICBkb3VibGUgeCwgeTsKKyAgICBkb3VibGUgYSwgYjsKK30gQ29tcGFuZFNlZ21lbnQ7CisKK3R5cGVkZWYgc3RydWN0IENvbXBhbmRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgbmJfc2VnbWVudHM7CisgICAgY2hhciAqYXR0YWNrcywgKmRlY2F5cywgKnBvaW50czsKKyAgICBDb21wYW5kU2VnbWVudCAqc2VnbWVudHM7CisgICAgQ2hhblBhcmFtICpjaGFubmVsczsKKyAgICBkb3VibGUgaW5fbWluX2xpbjsKKyAgICBkb3VibGUgb3V0X21pbl9saW47CisgICAgZG91YmxlIGN1cnZlX2RCOworICAgIGRvdWJsZSBnYWluX2RCOworICAgIGRvdWJsZSBpbml0aWFsX3ZvbHVtZTsKKyAgICBkb3VibGUgZGVsYXk7CisgICAgQVZGcmFtZSAqZGVsYXlfZnJhbWU7CisgICAgaW50IGRlbGF5X3NhbXBsZXM7CisgICAgaW50IGRlbGF5X2NvdW50OworICAgIGludCBkZWxheV9pbmRleDsKKyAgICBpbnQ2NF90IHB0czsKKworICAgIGludCAoKmNvbXBhbmQpKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSk7Cit9IENvbXBhbmRDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDb21wYW5kQ29udGV4dCwgeCkKKyNkZWZpbmUgQSBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGNvbXBhbmRfb3B0aW9uc1tdID0geworICAgIHsgImF0dGFja3MiLCAic2V0IHRpbWUgb3ZlciB3aGljaCBpbmNyZWFzZSBvZiB2b2x1bWUgaXMgZGV0ZXJtaW5lZCIsIE9GRlNFVChhdHRhY2tzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiMC4zIiB9LCAwLCAwLCBBIH0sCisgICAgeyAiZGVjYXlzIiwgInNldCB0aW1lIG92ZXIgd2hpY2ggZGVjcmVhc2Ugb2Ygdm9sdW1lIGlzIGRldGVybWluZWQiLCBPRkZTRVQoZGVjYXlzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiMC44IiB9LCAwLCAwLCBBIH0sCisgICAgeyAicG9pbnRzIiwgInNldCBwb2ludHMgb2YgdHJhbnNmZXIgZnVuY3Rpb24iLCBPRkZTRVQocG9pbnRzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiLTcwLy03MHwtNjAvLTIwIiB9LCAwLCAwLCBBIH0sCisgICAgeyAic29mdC1rbmVlIiwgInNldCBzb2Z0LWtuZWUiLCBPRkZTRVQoY3VydmVfZEIpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDAuMDEgfSwgMC4wMSwgOTAwLCBBIH0sCisgICAgeyAiZ2FpbiIsICJzZXQgb3V0cHV0IGdhaW4iLCBPRkZTRVQoZ2Fpbl9kQiksIEFWX09QVF9UWVBFX0RPVUJMRSwgeyAuZGJsID0gMCB9LCAtOTAwLCA5MDAsIEEgfSwKKyAgICB7ICJ2b2x1bWUiLCAic2V0IGluaXRpYWwgdm9sdW1lIiwgT0ZGU0VUKGluaXRpYWxfdm9sdW1lKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSAwIH0sIC05MDAsIDAsIEEgfSwKKyAgICB7ICJkZWxheSIsICJzZXQgZGVsYXkgZm9yIHNhbXBsZXMgYmVmb3JlIHNlbmRpbmcgdGhlbSB0byB2b2x1bWUgYWRqdXN0ZXIiLCBPRkZTRVQoZGVsYXkpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDAgfSwgMCwgMjAsIEEgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGNvbXBhbmQpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDb21wYW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBzLT5wdHMgICAgICAgICAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDb21wYW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyZWVwKCZzLT5jaGFubmVscyk7CisgICAgYXZfZnJlZXAoJnMtPnNlZ21lbnRzKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5kZWxheV9mcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzOworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0czsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geworICAgICAgICBBVl9TQU1QTEVfRk1UX0RCTFAsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORQorICAgIH07CisKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfbGF5b3V0cygpOworICAgIGlmICghbGF5b3V0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvdW50X2l0ZW1zKGNoYXIgKml0ZW1fc3RyLCBpbnQgKm5iX2l0ZW1zKQoreworICAgIGNoYXIgKnA7CisKKyAgICAqbmJfaXRlbXMgPSAxOworICAgIGZvciAocCA9IGl0ZW1fc3RyOyAqcDsgcCsrKSB7CisgICAgICAgIGlmICgqcCA9PSAnICcgfHwgKnAgPT0gJ3wnKQorICAgICAgICAgICAgKCpuYl9pdGVtcykrKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV92b2x1bWUoQ2hhblBhcmFtICpjcCwgZG91YmxlIGluKQoreworICAgIGRvdWJsZSBkZWx0YSA9IGluIC0gY3AtPnZvbHVtZTsKKworICAgIGlmIChkZWx0YSA+IDAuMCkKKyAgICAgICAgY3AtPnZvbHVtZSArPSBkZWx0YSAqIGNwLT5hdHRhY2s7CisgICAgZWxzZQorICAgICAgICBjcC0+dm9sdW1lICs9IGRlbHRhICogY3AtPmRlY2F5OworfQorCitzdGF0aWMgZG91YmxlIGdldF92b2x1bWUoQ29tcGFuZENvbnRleHQgKnMsIGRvdWJsZSBpbl9saW4pCit7CisgICAgQ29tcGFuZFNlZ21lbnQgKmNzOworICAgIGRvdWJsZSBpbl9sb2csIG91dF9sb2c7CisgICAgaW50IGk7CisKKyAgICBpZiAoaW5fbGluIDwgcy0+aW5fbWluX2xpbikKKyAgICAgICAgcmV0dXJuIHMtPm91dF9taW5fbGluOworCisgICAgaW5fbG9nID0gbG9nKGluX2xpbik7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgcy0+bmJfc2VnbWVudHM7IGkrKykKKyAgICAgICAgaWYgKGluX2xvZyA8PSBzLT5zZWdtZW50c1tpXS54KQorICAgICAgICAgICAgYnJlYWs7CisgICAgY3MgPSAmcy0+c2VnbWVudHNbaSAtIDFdOworICAgIGluX2xvZyAtPSBjcy0+eDsKKyAgICBvdXRfbG9nID0gY3MtPnkgKyBpbl9sb2cgKiAoY3MtPmEgKiBpbl9sb2cgKyBjcy0+Yik7CisKKyAgICByZXR1cm4gZXhwKG91dF9sb2cpOworfQorCitzdGF0aWMgaW50IGNvbXBhbmRfbm9kZWxheShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQ29tcGFuZENvbnRleHQgKnMgICAgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBjb25zdCBpbnQgY2hhbm5lbHMgICA9IGlubGluay0+Y2hhbm5lbHM7CisgICAgY29uc3QgaW50IG5iX3NhbXBsZXMgPSBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICBBVkZyYW1lICpvdXRfZnJhbWU7CisgICAgaW50IGNoYW4sIGk7CisgICAgaW50IGVycjsKKworICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShmcmFtZSkpIHsKKyAgICAgICAgb3V0X2ZyYW1lID0gZnJhbWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0X2ZyYW1lID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIG5iX3NhbXBsZXMpOworICAgICAgICBpZiAoIW91dF9mcmFtZSkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dF9mcmFtZSwgZnJhbWUpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0X2ZyYW1lKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgY2hhbm5lbHM7IGNoYW4rKykgeworICAgICAgICBjb25zdCBkb3VibGUgKnNyYyA9IChkb3VibGUgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaGFuXTsKKyAgICAgICAgZG91YmxlICpkc3QgPSAoZG91YmxlICopb3V0X2ZyYW1lLT5leHRlbmRlZF9kYXRhW2NoYW5dOworICAgICAgICBDaGFuUGFyYW0gKmNwID0gJnMtPmNoYW5uZWxzW2NoYW5dOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIHVwZGF0ZV92b2x1bWUoY3AsIGZhYnMoc3JjW2ldKSk7CisKKyAgICAgICAgICAgIGRzdFtpXSA9IGF2X2NsaXBkKHNyY1tpXSAqIGdldF92b2x1bWUocywgY3AtPnZvbHVtZSksIC0xLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZSAhPSBvdXRfZnJhbWUpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBvdXRfZnJhbWUpOworfQorCisjZGVmaW5lIE1PRChhLCBiKSAoKChhKSA+PSAoYikpID8gKGEpIC0gKGIpIDogKGEpKQorCitzdGF0aWMgaW50IGNvbXBhbmRfZGVsYXkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIENvbXBhbmRDb250ZXh0ICpzICAgID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgY29uc3QgaW50IGNoYW5uZWxzID0gaW5saW5rLT5jaGFubmVsczsKKyAgICBjb25zdCBpbnQgbmJfc2FtcGxlcyA9IGZyYW1lLT5uYl9zYW1wbGVzOworICAgIGludCBjaGFuLCBpLCBhdl91bmluaXQoZGluZGV4KSwgb2luZGV4LCBhdl91bmluaXQoY291bnQpOworICAgIEFWRnJhbWUgKm91dF9mcmFtZSAgID0gTlVMTDsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKHMtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBzLT5wdHMgPSAoZnJhbWUtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkgPyAwIDogZnJhbWUtPnB0czsKKyAgICB9CisKKyAgICBhdl9hc3NlcnQxKGNoYW5uZWxzID4gMCk7IC8qIHdvdWxkIGNvcnJ1cHQgZGVsYXlfY291bnQgYW5kIGRlbGF5X2luZGV4ICovCisKKyAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgY2hhbm5lbHM7IGNoYW4rKykgeworICAgICAgICBBVkZyYW1lICpkZWxheV9mcmFtZSA9IHMtPmRlbGF5X2ZyYW1lOworICAgICAgICBjb25zdCBkb3VibGUgKnNyYyAgICA9IChkb3VibGUgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaGFuXTsKKyAgICAgICAgZG91YmxlICpkYnVmICAgICAgICAgPSAoZG91YmxlICopZGVsYXlfZnJhbWUtPmV4dGVuZGVkX2RhdGFbY2hhbl07CisgICAgICAgIENoYW5QYXJhbSAqY3AgICAgICAgID0gJnMtPmNoYW5uZWxzW2NoYW5dOworICAgICAgICBkb3VibGUgKmRzdDsKKworICAgICAgICBjb3VudCAgPSBzLT5kZWxheV9jb3VudDsKKyAgICAgICAgZGluZGV4ID0gcy0+ZGVsYXlfaW5kZXg7CisgICAgICAgIGZvciAoaSA9IDAsIG9pbmRleCA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBpbiA9IHNyY1tpXTsKKyAgICAgICAgICAgIHVwZGF0ZV92b2x1bWUoY3AsIGZhYnMoaW4pKTsKKworICAgICAgICAgICAgaWYgKGNvdW50ID49IHMtPmRlbGF5X3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW91dF9mcmFtZSkgeworICAgICAgICAgICAgICAgICAgICBvdXRfZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgbmJfc2FtcGxlcyAtIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW91dF9mcmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dF9mcmFtZSwgZnJhbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0X2ZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0X2ZyYW1lLT5wdHMgPSBzLT5wdHM7CisgICAgICAgICAgICAgICAgICAgIHMtPnB0cyArPSBhdl9yZXNjYWxlX3EobmJfc2FtcGxlcyAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7IDEsIGlubGluay0+c2FtcGxlX3JhdGUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlubGluay0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkc3QgPSAoZG91YmxlICopb3V0X2ZyYW1lLT5leHRlbmRlZF9kYXRhW2NoYW5dOworICAgICAgICAgICAgICAgIGRzdFtvaW5kZXgrK10gPSBhdl9jbGlwZChkYnVmW2RpbmRleF0gKgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3ZvbHVtZShzLCBjcC0+dm9sdW1lKSwgLTEsIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYnVmW2RpbmRleF0gPSBpbjsKKyAgICAgICAgICAgIGRpbmRleCA9IE1PRChkaW5kZXggKyAxLCBzLT5kZWxheV9zYW1wbGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmRlbGF5X2NvdW50ID0gY291bnQ7CisgICAgcy0+ZGVsYXlfaW5kZXggPSBkaW5kZXg7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisKKyAgICBpZiAob3V0X2ZyYW1lKSB7CisgICAgICAgIGVyciA9IGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG91dF9mcmFtZSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFuZF9kcmFpbihBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQ29tcGFuZENvbnRleHQgKnMgICAgPSBjdHgtPnByaXY7CisgICAgY29uc3QgaW50IGNoYW5uZWxzICAgPSBvdXRsaW5rLT5jaGFubmVsczsKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgICA9IE5VTEw7CisgICAgaW50IGNoYW4sIGksIGRpbmRleDsKKworICAgIC8qIDIwNDggaXMgdG8gbGltaXQgb3V0cHV0IGZyYW1lIHNpemUgZHVyaW5nIGRyYWluICovCisgICAgZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIEZGTUlOKDIwNDgsIHMtPmRlbGF5X2NvdW50KSk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmcmFtZS0+cHRzID0gcy0+cHRzOworICAgIHMtPnB0cyArPSBhdl9yZXNjYWxlX3EoZnJhbWUtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAoQVZSYXRpb25hbCl7IDEsIG91dGxpbmstPnNhbXBsZV9yYXRlIH0sIG91dGxpbmstPnRpbWVfYmFzZSk7CisKKyAgICBhdl9hc3NlcnQwKGNoYW5uZWxzID4gMCk7CisgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IGNoYW5uZWxzOyBjaGFuKyspIHsKKyAgICAgICAgQVZGcmFtZSAqZGVsYXlfZnJhbWUgPSBzLT5kZWxheV9mcmFtZTsKKyAgICAgICAgZG91YmxlICpkYnVmID0gKGRvdWJsZSAqKWRlbGF5X2ZyYW1lLT5leHRlbmRlZF9kYXRhW2NoYW5dOworICAgICAgICBkb3VibGUgKmRzdCA9IChkb3VibGUgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaGFuXTsKKyAgICAgICAgQ2hhblBhcmFtICpjcCA9ICZzLT5jaGFubmVsc1tjaGFuXTsKKworICAgICAgICBkaW5kZXggPSBzLT5kZWxheV9pbmRleDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5uYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGRzdFtpXSA9IGF2X2NsaXBkKGRidWZbZGluZGV4XSAqIGdldF92b2x1bWUocywgY3AtPnZvbHVtZSksCisgICAgICAgICAgICAgICAgICAgIC0xLCAxKTsKKyAgICAgICAgICAgIGRpbmRleCA9IE1PRChkaW5kZXggKyAxLCBzLT5kZWxheV9zYW1wbGVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5kZWxheV9jb3VudCAtPSBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICBzLT5kZWxheV9pbmRleCA9IGRpbmRleDsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZnJhbWUpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ICA9IG91dGxpbmstPnNyYzsKKyAgICBDb21wYW5kQ29udGV4dCAqcyAgICAgPSBjdHgtPnByaXY7CisgICAgY29uc3QgaW50IHNhbXBsZV9yYXRlID0gb3V0bGluay0+c2FtcGxlX3JhdGU7CisgICAgZG91YmxlIHJhZGl1cyAgICAgICAgID0gcy0+Y3VydmVfZEIgKiBNX0xOMTAgLyAyMC4wOworICAgIGNoYXIgKnAsICpzYXZlcHRyICAgICA9IE5VTEw7CisgICAgY29uc3QgaW50IGNoYW5uZWxzICAgID0gb3V0bGluay0+Y2hhbm5lbHM7CisgICAgaW50IG5iX2F0dGFja3MsIG5iX2RlY2F5cywgbmJfcG9pbnRzOworICAgIGludCBuZXdfbmJfaXRlbXMsIG51bTsKKyAgICBpbnQgaTsKKyAgICBpbnQgZXJyOworCisKKyAgICBjb3VudF9pdGVtcyhzLT5hdHRhY2tzLCAmbmJfYXR0YWNrcyk7CisgICAgY291bnRfaXRlbXMocy0+ZGVjYXlzLCAmbmJfZGVjYXlzKTsKKyAgICBjb3VudF9pdGVtcyhzLT5wb2ludHMsICZuYl9wb2ludHMpOworCisgICAgaWYgKGNoYW5uZWxzIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICVkXG4iLCBjaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKG5iX2F0dGFja3MgPiBjaGFubmVscyB8fCBuYl9kZWNheXMgPiBjaGFubmVscykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgIk51bWJlciBvZiBhdHRhY2tzL2RlY2F5cyBiaWdnZXIgdGhhbiBudW1iZXIgb2YgY2hhbm5lbHMuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICB1bmluaXQoY3R4KTsKKworICAgIHMtPmNoYW5uZWxzID0gYXZfbWFsbG9jel9hcnJheShjaGFubmVscywgc2l6ZW9mKCpzLT5jaGFubmVscykpOworICAgIHMtPm5iX3NlZ21lbnRzID0gKG5iX3BvaW50cyArIDQpICogMjsKKyAgICBzLT5zZWdtZW50cyA9IGF2X21hbGxvY3pfYXJyYXkocy0+bmJfc2VnbWVudHMsIHNpemVvZigqcy0+c2VnbWVudHMpKTsKKworICAgIGlmICghcy0+Y2hhbm5lbHMgfHwgIXMtPnNlZ21lbnRzKSB7CisgICAgICAgIHVuaW5pdChjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHAgPSBzLT5hdHRhY2tzOworICAgIGZvciAoaSA9IDAsIG5ld19uYl9pdGVtcyA9IDA7IGkgPCBuYl9hdHRhY2tzOyBpKyspIHsKKyAgICAgICAgY2hhciAqdHN0ciA9IGF2X3N0cnRvayhwLCAiIHwiLCAmc2F2ZXB0cik7CisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBuZXdfbmJfaXRlbXMgKz0gc3NjYW5mKHRzdHIsICIlbGYiLCAmcy0+Y2hhbm5lbHNbaV0uYXR0YWNrKSA9PSAxOworICAgICAgICBpZiAocy0+Y2hhbm5lbHNbaV0uYXR0YWNrIDwgMCkgeworICAgICAgICAgICAgdW5pbml0KGN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorICAgIG5iX2F0dGFja3MgPSBuZXdfbmJfaXRlbXM7CisKKyAgICBwID0gcy0+ZGVjYXlzOworICAgIGZvciAoaSA9IDAsIG5ld19uYl9pdGVtcyA9IDA7IGkgPCBuYl9kZWNheXM7IGkrKykgeworICAgICAgICBjaGFyICp0c3RyID0gYXZfc3RydG9rKHAsICIgfCIsICZzYXZlcHRyKTsKKyAgICAgICAgcCA9IE5VTEw7CisgICAgICAgIG5ld19uYl9pdGVtcyArPSBzc2NhbmYodHN0ciwgIiVsZiIsICZzLT5jaGFubmVsc1tpXS5kZWNheSkgPT0gMTsKKyAgICAgICAgaWYgKHMtPmNoYW5uZWxzW2ldLmRlY2F5IDwgMCkgeworICAgICAgICAgICAgdW5pbml0KGN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorICAgIG5iX2RlY2F5cyA9IG5ld19uYl9pdGVtczsKKworICAgIGlmIChuYl9hdHRhY2tzICE9IG5iX2RlY2F5cykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgIk51bWJlciBvZiBhdHRhY2tzICVkIGRpZmZlcnMgZnJvbSBudW1iZXIgb2YgZGVjYXlzICVkLlxuIiwKKyAgICAgICAgICAgICAgICBuYl9hdHRhY2tzLCBuYl9kZWNheXMpOworICAgICAgICB1bmluaXQoY3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyNkZWZpbmUgUyh4KSBzLT5zZWdtZW50c1syICogKCh4KSArIDEpXQorICAgIHAgPSBzLT5wb2ludHM7CisgICAgZm9yIChpID0gMCwgbmV3X25iX2l0ZW1zID0gMDsgaSA8IG5iX3BvaW50czsgaSsrKSB7CisgICAgICAgIGNoYXIgKnRzdHIgPSBhdl9zdHJ0b2socCwgIiB8IiwgJnNhdmVwdHIpOworICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgaWYgKHNzY2FuZih0c3RyLCAiJWxmLyVsZiIsICZTKGkpLngsICZTKGkpLnkpICE9IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYW5kL29yIG1pc3NpbmcgaW5wdXQvb3V0cHV0IHZhbHVlLlxuIik7CisgICAgICAgICAgICB1bmluaXQoY3R4KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgJiYgUyhpIC0gMSkueCA+IFMoaSkueCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiVHJhbnNmZXIgZnVuY3Rpb24gaW5wdXQgdmFsdWVzIG11c3QgYmUgaW5jcmVhc2luZy5cbiIpOworICAgICAgICAgICAgdW5pbml0KGN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIFMoaSkueSAtPSBTKGkpLng7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiVkOiB4PSVmIHk9JWZcbiIsIGksIFMoaSkueCwgUyhpKS55KTsKKyAgICAgICAgbmV3X25iX2l0ZW1zKys7CisgICAgfQorICAgIG51bSA9IG5ld19uYl9pdGVtczsKKworICAgIC8qIEFkZCAwLDAgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKG51bSA9PSAwIHx8IFMobnVtIC0gMSkueCkKKyAgICAgICAgbnVtKys7CisKKyN1bmRlZiBTCisjZGVmaW5lIFMoeCkgcy0+c2VnbWVudHNbMiAqICh4KV0KKyAgICAvKiBBZGQgYSB0YWlsIG9mZiBzZWdtZW50IGF0IHRoZSBzdGFydCAqLworICAgIFMoMCkueCA9IFMoMSkueCAtIDIgKiBzLT5jdXJ2ZV9kQjsKKyAgICBTKDApLnkgPSBTKDEpLnk7CisgICAgbnVtKys7CisKKyAgICAvKiBKb2luIGFkamFjZW50IGNvbGluZWFyIHNlZ21lbnRzICovCisgICAgZm9yIChpID0gMjsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBnMSA9IChTKGkgLSAxKS55IC0gUyhpIC0gMikueSkgKiAoUyhpIC0gMCkueCAtIFMoaSAtIDEpLngpOworICAgICAgICBkb3VibGUgZzIgPSAoUyhpIC0gMCkueSAtIFMoaSAtIDEpLnkpICogKFMoaSAtIDEpLnggLSBTKGkgLSAyKS54KTsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgaWYgKGZhYnMoZzEgLSBnMikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbnVtLS07CisgICAgICAgIGZvciAoaiA9IC0taTsgaiA8IG51bTsgaisrKQorICAgICAgICAgICAgUyhqKSA9IFMoaiArIDEpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7ICFpIHx8IHMtPnNlZ21lbnRzW2kgLSAyXS54OyBpICs9IDIpIHsKKyAgICAgICAgcy0+c2VnbWVudHNbaV0ueSArPSBzLT5nYWluX2RCOworICAgICAgICBzLT5zZWdtZW50c1tpXS54ICo9IE1fTE4xMCAvIDIwOworICAgICAgICBzLT5zZWdtZW50c1tpXS55ICo9IE1fTE4xMCAvIDIwOworICAgIH0KKworI2RlZmluZSBMKHgpIHMtPnNlZ21lbnRzW2kgLSAoeCldCisgICAgZm9yIChpID0gNDsgcy0+c2VnbWVudHNbaSAtIDJdLng7IGkgKz0gMikgeworICAgICAgICBkb3VibGUgeCwgeSwgY3gsIGN5LCBpbjEsIGluMiwgb3V0MSwgb3V0MiwgdGhldGEsIGxlbiwgcjsKKworICAgICAgICBMKDQpLmEgPSAwOworICAgICAgICBMKDQpLmIgPSAoTCgyKS55IC0gTCg0KS55KSAvIChMKDIpLnggLSBMKDQpLngpOworCisgICAgICAgIEwoMikuYSA9IDA7CisgICAgICAgIEwoMikuYiA9IChMKDApLnkgLSBMKDIpLnkpIC8gKEwoMCkueCAtIEwoMikueCk7CisKKyAgICAgICAgdGhldGEgPSBhdGFuMihMKDIpLnkgLSBMKDQpLnksIEwoMikueCAtIEwoNCkueCk7CisgICAgICAgIGxlbiA9IHNxcnQocG93KEwoMikueCAtIEwoNCkueCwgMi4pICsgcG93KEwoMikueSAtIEwoNCkueSwgMi4pKTsKKyAgICAgICAgciA9IEZGTUlOKHJhZGl1cywgbGVuKTsKKyAgICAgICAgTCgzKS54ID0gTCgyKS54IC0gciAqIGNvcyh0aGV0YSk7CisgICAgICAgIEwoMykueSA9IEwoMikueSAtIHIgKiBzaW4odGhldGEpOworCisgICAgICAgIHRoZXRhID0gYXRhbjIoTCgwKS55IC0gTCgyKS55LCBMKDApLnggLSBMKDIpLngpOworICAgICAgICBsZW4gPSBzcXJ0KHBvdyhMKDApLnggLSBMKDIpLngsIDIuKSArIHBvdyhMKDApLnkgLSBMKDIpLnksIDIuKSk7CisgICAgICAgIHIgPSBGRk1JTihyYWRpdXMsIGxlbiAvIDIpOworICAgICAgICB4ID0gTCgyKS54ICsgciAqIGNvcyh0aGV0YSk7CisgICAgICAgIHkgPSBMKDIpLnkgKyByICogc2luKHRoZXRhKTsKKworICAgICAgICBjeCA9IChMKDMpLnggKyBMKDIpLnggKyB4KSAvIDM7CisgICAgICAgIGN5ID0gKEwoMykueSArIEwoMikueSArIHkpIC8gMzsKKworICAgICAgICBMKDIpLnggPSB4OworICAgICAgICBMKDIpLnkgPSB5OworCisgICAgICAgIGluMSAgPSBjeCAtIEwoMykueDsKKyAgICAgICAgb3V0MSA9IGN5IC0gTCgzKS55OworICAgICAgICBpbjIgID0gTCgyKS54IC0gTCgzKS54OworICAgICAgICBvdXQyID0gTCgyKS55IC0gTCgzKS55OworICAgICAgICBMKDMpLmEgPSAob3V0MiAvIGluMiAtIG91dDEgLyBpbjEpIC8gKGluMiAtIGluMSk7CisgICAgICAgIEwoMykuYiA9IG91dDEgLyBpbjEgLSBMKDMpLmEgKiBpbjE7CisgICAgfQorICAgIEwoMykueCA9IDA7CisgICAgTCgzKS55ID0gTCgyKS55OworCisgICAgcy0+aW5fbWluX2xpbiAgPSBleHAocy0+c2VnbWVudHNbMV0ueCk7CisgICAgcy0+b3V0X21pbl9saW4gPSBleHAocy0+c2VnbWVudHNbMV0ueSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgICAgICBDaGFuUGFyYW0gKmNwID0gJnMtPmNoYW5uZWxzW2ldOworCisgICAgICAgIGlmIChjcC0+YXR0YWNrID4gMS4wIC8gc2FtcGxlX3JhdGUpCisgICAgICAgICAgICBjcC0+YXR0YWNrID0gMS4wIC0gZXhwKC0xLjAgLyAoc2FtcGxlX3JhdGUgKiBjcC0+YXR0YWNrKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNwLT5hdHRhY2sgPSAxLjA7CisgICAgICAgIGlmIChjcC0+ZGVjYXkgPiAxLjAgLyBzYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgIGNwLT5kZWNheSA9IDEuMCAtIGV4cCgtMS4wIC8gKHNhbXBsZV9yYXRlICogY3AtPmRlY2F5KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNwLT5kZWNheSA9IDEuMDsKKyAgICAgICAgY3AtPnZvbHVtZSA9IHBvdygxMC4wLCBzLT5pbml0aWFsX3ZvbHVtZSAvIDIwKTsKKyAgICB9CisKKyAgICBzLT5kZWxheV9zYW1wbGVzID0gcy0+ZGVsYXkgKiBzYW1wbGVfcmF0ZTsKKyAgICBpZiAocy0+ZGVsYXlfc2FtcGxlcyA8PSAwKSB7CisgICAgICAgIHMtPmNvbXBhbmQgPSBjb21wYW5kX25vZGVsYXk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHMtPmRlbGF5X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmRlbGF5X2ZyYW1lKSB7CisgICAgICAgIHVuaW5pdChjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHMtPmRlbGF5X2ZyYW1lLT5mb3JtYXQgICAgICAgICA9IG91dGxpbmstPmZvcm1hdDsKKyAgICBzLT5kZWxheV9mcmFtZS0+bmJfc2FtcGxlcyAgICAgPSBzLT5kZWxheV9zYW1wbGVzOworICAgIHMtPmRlbGF5X2ZyYW1lLT5jaGFubmVsX2xheW91dCA9IG91dGxpbmstPmNoYW5uZWxfbGF5b3V0OworCisgICAgZXJyID0gYXZfZnJhbWVfZ2V0X2J1ZmZlcihzLT5kZWxheV9mcmFtZSwgMzIpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBvdXRsaW5rLT5mbGFncyB8PSBGRl9MSU5LX0ZMQUdfUkVRVUVTVF9MT09QOworICAgIHMtPmNvbXBhbmQgPSBjb21wYW5kX2RlbGF5OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBDb21wYW5kQ29udGV4dCAqcyAgICA9IGN0eC0+cHJpdjsKKworICAgIHJldHVybiBzLT5jb21wYW5kKGN0eCwgZnJhbWUpOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIENvbXBhbmRDb250ZXh0ICpzICAgID0gY3R4LT5wcml2OworICAgIGludCByZXQgPSAwOworCisgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7CisKKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmICFjdHgtPmlzX2Rpc2FibGVkICYmIHMtPmRlbGF5X2NvdW50KQorICAgICAgICByZXQgPSBjb21wYW5kX2RyYWluKG91dGxpbmspOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGNvbXBhbmRfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBjb21wYW5kX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworCitBVkZpbHRlciBmZl9hZl9jb21wYW5kID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjb21wYW5kIiwKKyAgICAuZGVzY3JpcHRpb24gICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgKKyAgICAgICAgICAgICJDb21wcmVzcyBvciBleHBhbmQgYXVkaW8gZHluYW1pYyByYW5nZS4iKSwKKyAgICAucXVlcnlfZm9ybWF0cyAgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgICA9IHNpemVvZihDb21wYW5kQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgID0gJmNvbXBhbmRfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSB1bmluaXQsCisgICAgLmlucHV0cyAgICAgICAgID0gY29tcGFuZF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgID0gY29tcGFuZF9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9lYXJ3YXguYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9lYXJ3YXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzEwOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2VhcndheC5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIE1pbmEgTmFneSBaYWtpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgRWR3YXJkIEJlaW5nZXNzbmVyIEFuZCBTdW5kcnkgQ29udHJpYnV0b3JzLgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBmcmVlbHkgcmVkaXN0cmlidXRhYmxlIGFuZCBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2UuCisgKiBUaGlzIGNvcHlyaWdodCBub3RpY2UgbXVzdCBiZSBtYWludGFpbmVkLiAgRWR3YXJkIEJlaW5nZXNzbmVyIEFuZCBTdW5kcnkKKyAqIENvbnRyaWJ1dG9ycyBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciB0aGUgY29uc2VxdWVuY2VzIG9mIHVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTdGVyZW8gV2lkZW5pbmcgRWZmZWN0LiBBZGRzIGF1ZGlvIGN1ZXMgdG8gbW92ZSBzdGVyZW8gaW1hZ2UgaW4KKyAqIGZyb250IG9mIHRoZSBsaXN0ZW5lci4gQWRhcHRlZCBmcm9tIHRoZSBsaWJzb3ggZWFyd2F4IGVmZmVjdC4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKworI2RlZmluZSBOVU1UQVBTIDY0CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgZmlsdFtOVU1UQVBTXSA9IHsKKy8qIDMwwrAgIDMzMMKwICovCisgICAgNCwgICAtNiwgICAgIC8qIDMyIHRhcCBzdGVyZW8gRklSIGZpbHRlci4gKi8KKyAgICA0LCAgLTExLCAgICAgLyogT25lIHNpZGUgZmlsdGVycyBhcyBpZiB0aGUgKi8KKyAgIC0xLCAgIC01LCAgICAgLyogc2lnbmFsIHdhcyBmcm9tIDMwIGRlZ3JlZXMgKi8KKyAgICAzLCAgICAzLCAgICAgLyogZnJvbSB0aGUgZWFyLCB0aGUgb3RoZXIgYXMgKi8KKyAgIC0yLCAgICA1LCAgICAgLyogaWYgMzMwIGRlZ3JlZXMuICovCisgICAtNSwgICAgMCwKKyAgICA5LCAgICAxLAorICAgIDYsICAgIDMsICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgLTQsICAgLTEsICAgICAvKiAgICAgICAgICAgICAgICAgICBMZWZ0ICAgICAgICAgUmlnaHQgICAgICAgICAgICAgICAgICAqLworICAgLTUsICAgLTMsICAgICAvKiAgICAgICAgICAgICAgICBfX19fX19fX19fICAgX19fX19fX19fXyAgICAgICAgICAgICAgICAqLworICAgLTIsICAgLTUsICAgICAvKiAgICAgICAgICAgICAgIHwgICAgICAgICAgfCB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAqLworICAgLTcsICAgIDEsICAgICAvKiAgICAgICAgICAgLi0tLXwgIEhoLDAoZikgfCB8ICBIaCwwKGYpIHwtLS0uICAgICAgICAgICAqLworICAgIDYsICAgLTcsICAgICAvKiAgICAgICAgICAvICAgIHxfX19fX19fX19ffCB8X19fX19fX19fX3wgICAgXCAgICAgICAgICAqLworICAgMzAsICAtMjksICAgICAvKiAgICAgICAgIC8gICAgICAgICAgICAgICAgXCAvICAgICAgICAgICAgICAgIFwgICAgICAgICAqLworICAgMTIsICAgLTMsICAgICAvKiAgICAgICAgLyAgICAgICAgICAgICAgICAgIFggICAgICAgICAgICAgICAgICBcICAgICAgICAqLworICAtMTEsICAgIDQsICAgICAvKiAgICAgICAvICAgICAgICAgICAgICAgICAgLyBcICAgICAgICAgICAgICAgICAgXCAgICAgICAqLworICAgLTMsICAgIDcsICAgICAvKiAgX19fX1ZfX19fXyAgIF9fX19fX19fX19WICAgVl9fX19fX19fX18gICBfX19fX1ZfX19fICAqLworICAtMjAsICAgMjMsICAgICAvKiB8ICAgICAgICAgIHwgfCAgICAgICAgICB8ICAgfCAgICAgICAgICB8IHwgICAgICAgICAgfCAqLworICAgIDIsICAgIDAsICAgICAvKiB8IEhoLDMwKGYpIHwgfCBIaCwzMzAoZil8ICAgfCBIaCwzMzAoZil8IHwgSGgsMzAoZikgfCAqLworICAgIDEsICAgLTYsICAgICAvKiB8X19fX19fX19fX3wgfF9fX19fX19fX198ICAgfF9fX19fX19fX198IHxfX19fX19fX19ffCAqLworICAtMTQsICAgLTUsICAgICAvKiAgICAgIFwgICAgIF9fXyAgICAgIC8gICAgICAgICAgIFwgICAgICBfX18gICAgIC8gICAgICAqLworICAgMTUsICAtMTgsICAgICAvKiAgICAgICBcICAgLyAgIFwgICAgLyAgICBfX19fXyAgICBcICAgIC8gICBcICAgLyAgICAgICAqLworICAgIDYsICAgIDcsICAgICAvKiAgICAgICAgYC0+fCArIHw8LS0nICAgIC8gICAgIFwgICAgYC0tPnwgKyB8PC0nICAgICAgICAqLworICAgMTUsICAtMTAsICAgICAvKiAgICAgICAgICAgXF9fXy8gICAgICBfLyAgICAgICBcXyAgICAgIFxfX18vICAgICAgICAgICAqLworICAtMTQsICAgMjIsICAgICAvKiAgICAgICAgICAgICAgIFwgICAgIC8gXCAgICAgICAvIFwgICAgIC8gICAgICAgICAgICAgICAqLworICAgLTcsICAgLTIsICAgICAvKiAgICAgICAgICAgICAgICBgLS0tPnwgfCAgICAgICB8IHw8LS0tJyAgICAgICAgICAgICAgICAqLworICAgLTQsICAgIDksICAgICAvKiAgICAgICAgICAgICAgICAgICAgIFxfLyAgICAgICBcXy8gICAgICAgICAgICAgICAgICAgICAqLworICAgIDYsICAtMTIsICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIDYsICAgLTYsICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgSGVhZHBob25lcyAgICAgICAgICAgICAgICAgICAgICAqLworICAgIDAsICAtMTEsCisgICAgMCwgICAtNSwKKyAgICA0LCAgICAwfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDE2X3QgdGFwc1tOVU1UQVBTICogMl07Cit9IEVhcndheENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IHNhbXBsZV9yYXRlc1tdID0geyA0NDEwMCwgLTEgfTsKKworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyA9IE5VTEw7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0ID0gTlVMTDsKKworICAgIGZmX2FkZF9mb3JtYXQoJmZvcm1hdHMsIEFWX1NBTVBMRV9GTVRfUzE2KTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKyAgICBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoJmxheW91dCwgQVZfQ0hfTEFZT1VUX1NURVJFTyk7CisgICAgZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBsYXlvdXQpOworICAgIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9yYXRlcykpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8vRklYTUU6IHJlcGxhY2Ugd2l0aCBEU1BDb250ZXh0LnNjYWxhcnByb2R1Y3RfaW50MTYKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCAqc2NhbGFycHJvZHVjdChjb25zdCBpbnQxNl90ICppbiwgY29uc3QgaW50MTZfdCAqZW5kaW4sIGludDE2X3QgKm91dCkKK3sKKyAgICBpbnQzMl90IHNhbXBsZTsKKyAgICBpbnQxNl90IGo7CisKKyAgICB3aGlsZSAoaW4gPCBlbmRpbikgeworICAgICAgICBzYW1wbGUgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgTlVNVEFQUzsgaisrKQorICAgICAgICAgICAgc2FtcGxlICs9IGluW2pdICogZmlsdFtqXTsKKyAgICAgICAgKm91dCA9IGF2X2NsaXBfaW50MTYoc2FtcGxlID4+IDYpOworICAgICAgICBvdXQrKzsKKyAgICAgICAgaW4rKzsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5zYW1wbGVzKQoreworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIGludDE2X3QgKnRhcHMsICplbmRpbiwgKmluLCAqb3V0OworICAgIEFWRnJhbWUgKm91dHNhbXBsZXMgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgaW5zYW1wbGVzLT5uYl9zYW1wbGVzKTsKKyAgICBpbnQgbGVuOworCisgICAgaWYgKCFvdXRzYW1wbGVzKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluc2FtcGxlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0c2FtcGxlcywgaW5zYW1wbGVzKTsKKworICAgIHRhcHMgID0gKChFYXJ3YXhDb250ZXh0ICopaW5saW5rLT5kc3QtPnByaXYpLT50YXBzOworICAgIG91dCAgID0gKGludDE2X3QgKilvdXRzYW1wbGVzLT5kYXRhWzBdOworICAgIGluICAgID0gKGludDE2X3QgKilpbnNhbXBsZXMgLT5kYXRhWzBdOworCisgICAgbGVuID0gRkZNSU4oTlVNVEFQUywgMippbnNhbXBsZXMtPm5iX3NhbXBsZXMpOworICAgIC8vIGNvcHkgcGFydCBvZiBuZXcgaW5wdXQgYW5kIHByb2Nlc3Mgd2l0aCBzYXZlZCBpbnB1dAorICAgIG1lbWNweSh0YXBzK05VTVRBUFMsIGluLCBsZW4gKiBzaXplb2YoKnRhcHMpKTsKKyAgICBvdXQgICA9IHNjYWxhcnByb2R1Y3QodGFwcywgdGFwcyArIGxlbiwgb3V0KTsKKworICAgIC8vIHByb2Nlc3MgY3VycmVudCBpbnB1dAorICAgIGlmICgyKmluc2FtcGxlcy0+bmJfc2FtcGxlcyA+PSBOVU1UQVBTICl7CisgICAgICAgIGVuZGluID0gaW4gKyBpbnNhbXBsZXMtPm5iX3NhbXBsZXMgKiAyIC0gTlVNVEFQUzsKKyAgICAgICAgc2NhbGFycHJvZHVjdChpbiwgZW5kaW4sIG91dCk7CisKKyAgICAgICAgLy8gc2F2ZSBwYXJ0IG9mIGlucHV0IGZvciBuZXh0IHJvdW5kCisgICAgICAgIG1lbWNweSh0YXBzLCBlbmRpbiwgTlVNVEFQUyAqIHNpemVvZigqdGFwcykpOworICAgIH0gZWxzZQorICAgICAgICBtZW1tb3ZlKHRhcHMsIHRhcHMgKyAyKmluc2FtcGxlcy0+bmJfc2FtcGxlcywgTlVNVEFQUyAqIHNpemVvZigqdGFwcykpOworCisgICAgYXZfZnJhbWVfZnJlZSgmaW5zYW1wbGVzKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dHNhbXBsZXMpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZWFyd2F4X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZWFyd2F4X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9lYXJ3YXggPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImVhcndheCIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldpZGVuIHRoZSBzdGVyZW8gaW1hZ2UuIiksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICAgPSBzaXplb2YoRWFyd2F4Q29udGV4dCksCisgICAgLmlucHV0cyAgICAgICAgID0gZWFyd2F4X2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICAgPSBlYXJ3YXhfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfZmxhbmdlci5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2ZsYW5nZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmYzNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX2ZsYW5nZXIuYwpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBSb2IgU3lrZXMgPHJvYnNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJnZW5lcmF0ZV93YXZlX3RhYmxlLmgiCisKKyNkZWZpbmUgSU5URVJQT0xBVElPTl9MSU5FQVIgICAgMAorI2RlZmluZSBJTlRFUlBPTEFUSU9OX1FVQURSQVRJQyAxCisKK3R5cGVkZWYgc3RydWN0IEZsYW5nZXJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBkb3VibGUgZGVsYXlfbWluOworICAgIGRvdWJsZSBkZWxheV9kZXB0aDsKKyAgICBkb3VibGUgZmVlZGJhY2tfZ2FpbjsKKyAgICBkb3VibGUgZGVsYXlfZ2FpbjsKKyAgICBkb3VibGUgc3BlZWQ7CisgICAgaW50IHdhdmVfc2hhcGU7CisgICAgZG91YmxlIGNoYW5uZWxfcGhhc2U7CisgICAgaW50IGludGVycG9sYXRpb247CisgICAgZG91YmxlIGluX2dhaW47CisgICAgaW50IG1heF9zYW1wbGVzOworICAgIHVpbnQ4X3QgKipkZWxheV9idWZmZXI7CisgICAgaW50IGRlbGF5X2J1Zl9wb3M7CisgICAgZG91YmxlICpkZWxheV9sYXN0OworICAgIGZsb2F0ICpsZm87CisgICAgaW50IGxmb19sZW5ndGg7CisgICAgaW50IGxmb19wb3M7Cit9IEZsYW5nZXJDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGbGFuZ2VyQ29udGV4dCwgeCkKKyNkZWZpbmUgQSBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZsYW5nZXJfb3B0aW9uc1tdID0geworICAgIHsgImRlbGF5IiwgImJhc2UgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIiwgICAgICAgIE9GRlNFVChkZWxheV9taW4pLCAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIDAsIDMwLCBBIH0sCisgICAgeyAiZGVwdGgiLCAiYWRkZWQgc3dlcHQgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIiwgT0ZGU0VUKGRlbGF5X2RlcHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0yfSwgMCwgMTAsIEEgfSwKKyAgICB7ICJyZWdlbiIsICJwZXJjZW50YWdlIHJlZ2VuZXJhdGlvbiAoZGVsYXllZCBzaWduYWwgZmVlZGJhY2spIiwgT0ZGU0VUKGZlZWRiYWNrX2dhaW4pLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTB9LCAtOTUsIDk1LCBBIH0sCisgICAgeyAid2lkdGgiLCAicGVyY2VudGFnZSBvZiBkZWxheWVkIHNpZ25hbCBtaXhlZCB3aXRoIG9yaWdpbmFsIiwgT0ZGU0VUKGRlbGF5X2dhaW4pLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTcxfSwgMCwgMTAwLCBBIH0sCisgICAgeyAic3BlZWQiLCAic3dlZXBzIHBlciBzZWNvbmQgKEh6KSIsIE9GRlNFVChzcGVlZCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC41fSwgMC4xLCAxMCwgQSB9LAorICAgIHsgInNoYXBlIiwgInN3ZXB0IHdhdmUgc2hhcGUiLCBPRkZTRVQod2F2ZV9zaGFwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9V0FWRV9TSU59LCBXQVZFX1NJTiwgV0FWRV9OQi0xLCBBLCAidHlwZSIgfSwKKyAgICB7ICJ0cmlhbmd1bGFyIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9V0FWRV9UUkl9LCAwLCAwLCBBLCAidHlwZSIgfSwKKyAgICB7ICJ0IiwgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9V0FWRV9UUkl9LCAwLCAwLCBBLCAidHlwZSIgfSwKKyAgICB7ICJzaW51c29pZGFsIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9V0FWRV9TSU59LCAwLCAwLCBBLCAidHlwZSIgfSwKKyAgICB7ICJzIiwgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9V0FWRV9TSU59LCAwLCAwLCBBLCAidHlwZSIgfSwKKyAgICB7ICJwaGFzZSIsICJzd2VwdCB3YXZlIHBlcmNlbnRhZ2UgcGhhc2Utc2hpZnQgZm9yIG11bHRpLWNoYW5uZWwiLCBPRkZTRVQoY2hhbm5lbF9waGFzZSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MjV9LCAwLCAxMDAsIEEgfSwKKyAgICB7ICJpbnRlcnAiLCAiZGVsYXktbGluZSBpbnRlcnBvbGF0aW9uIiwgT0ZGU0VUKGludGVycG9sYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBBLCAiaXR5cGUiIH0sCisgICAgeyAibGluZWFyIiwgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9SU5URVJQT0xBVElPTl9MSU5FQVJ9LCAgICAwLCAwLCBBLCAiaXR5cGUiIH0sCisgICAgeyAicXVhZHJhdGljIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9SU5URVJQT0xBVElPTl9RVUFEUkFUSUN9LCAwLCAwLCBBLCAiaXR5cGUiIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhmbGFuZ2VyKTsKKworc3RhdGljIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEZsYW5nZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgcy0+ZmVlZGJhY2tfZ2FpbiAvPSAxMDA7CisgICAgcy0+ZGVsYXlfZ2FpbiAgICAvPSAxMDA7CisgICAgcy0+Y2hhbm5lbF9waGFzZSAvPSAxMDA7CisgICAgcy0+ZGVsYXlfbWluICAgICAvPSAxMDAwOworICAgIHMtPmRlbGF5X2RlcHRoICAgLz0gMTAwMDsKKyAgICBzLT5pbl9nYWluICAgICAgICA9IDEgLyAoMSArIHMtPmRlbGF5X2dhaW4pOworICAgIHMtPmRlbGF5X2dhaW4gICAgLz0gMSArIHMtPmRlbGF5X2dhaW47CisgICAgcy0+ZGVsYXlfZ2FpbiAgICAqPSAxIC0gZmFicyhzLT5mZWVkYmFja19nYWluKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHM7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkxQLCBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9OworCisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2xheW91dHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBsYXlvdXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9mbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisKKyAgICBmb3JtYXRzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmb3JtYXRzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEZsYW5nZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgcy0+bWF4X3NhbXBsZXMgPSAocy0+ZGVsYXlfbWluICsgcy0+ZGVsYXlfZGVwdGgpICogaW5saW5rLT5zYW1wbGVfcmF0ZSArIDIuNTsKKyAgICBzLT5sZm9fbGVuZ3RoICA9IGlubGluay0+c2FtcGxlX3JhdGUgLyBzLT5zcGVlZDsKKyAgICBzLT5kZWxheV9sYXN0ICA9IGF2X2NhbGxvYyhpbmxpbmstPmNoYW5uZWxzLCBzaXplb2YoKnMtPmRlbGF5X2xhc3QpKTsKKyAgICBzLT5sZm8gICAgICAgICA9IGF2X2NhbGxvYyhzLT5sZm9fbGVuZ3RoLCBzaXplb2YoKnMtPmxmbykpOworICAgIGlmICghcy0+bGZvIHx8ICFzLT5kZWxheV9sYXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZmZfZ2VuZXJhdGVfd2F2ZV90YWJsZShzLT53YXZlX3NoYXBlLCBBVl9TQU1QTEVfRk1UX0ZMVCwgcy0+bGZvLCBzLT5sZm9fbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3Iocy0+ZGVsYXlfbWluICogaW5saW5rLT5zYW1wbGVfcmF0ZSArIDAuNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYXhfc2FtcGxlcyAtIDIuLCAzICogTV9QSV8yKTsKKworICAgIHJldHVybiBhdl9zYW1wbGVzX2FsbG9jX2FycmF5X2FuZF9zYW1wbGVzKCZzLT5kZWxheV9idWZmZXIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5jaGFubmVscywgcy0+bWF4X3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5mb3JtYXQsIDApOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBGbGFuZ2VyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpvdXRfZnJhbWU7CisgICAgaW50IGNoYW4sIGk7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoZnJhbWUpKSB7CisgICAgICAgIG91dF9mcmFtZSA9IGZyYW1lOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dF9mcmFtZSA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghb3V0X2ZyYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXRfZnJhbWUsIGZyYW1lKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm5iX3NhbXBsZXM7IGkrKykgeworCisgICAgICAgIHMtPmRlbGF5X2J1Zl9wb3MgPSAocy0+ZGVsYXlfYnVmX3BvcyArIHMtPm1heF9zYW1wbGVzIC0gMSkgJSBzLT5tYXhfc2FtcGxlczsKKworICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgaW5saW5rLT5jaGFubmVsczsgY2hhbisrKSB7CisgICAgICAgICAgICBkb3VibGUgKnNyYyA9IChkb3VibGUgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaGFuXTsKKyAgICAgICAgICAgIGRvdWJsZSAqZHN0ID0gKGRvdWJsZSAqKW91dF9mcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaGFuXTsKKyAgICAgICAgICAgIGRvdWJsZSBkZWxheWVkXzAsIGRlbGF5ZWRfMTsKKyAgICAgICAgICAgIGRvdWJsZSBkZWxheWVkOworICAgICAgICAgICAgZG91YmxlIGluLCBvdXQ7CisgICAgICAgICAgICBpbnQgY2hhbm5lbF9waGFzZSA9IGNoYW4gKiBzLT5sZm9fbGVuZ3RoICogcy0+Y2hhbm5lbF9waGFzZSArIC41OworICAgICAgICAgICAgZG91YmxlIGRlbGF5ID0gcy0+bGZvWyhzLT5sZm9fcG9zICsgY2hhbm5lbF9waGFzZSkgJSBzLT5sZm9fbGVuZ3RoXTsKKyAgICAgICAgICAgIGludCBpbnRfZGVsYXkgPSAoaW50KWRlbGF5OworICAgICAgICAgICAgZG91YmxlIGZyYWNfZGVsYXkgPSBtb2RmKGRlbGF5LCAmZGVsYXkpOworICAgICAgICAgICAgZG91YmxlICpkZWxheV9idWZmZXIgPSAoZG91YmxlICopcy0+ZGVsYXlfYnVmZmVyW2NoYW5dOworCisgICAgICAgICAgICBpbiA9IHNyY1tpXTsKKyAgICAgICAgICAgIGRlbGF5X2J1ZmZlcltzLT5kZWxheV9idWZfcG9zXSA9IGluICsgcy0+ZGVsYXlfbGFzdFtjaGFuXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZlZWRiYWNrX2dhaW47CisgICAgICAgICAgICBkZWxheWVkXzAgPSBkZWxheV9idWZmZXJbKHMtPmRlbGF5X2J1Zl9wb3MgKyBpbnRfZGVsYXkrKykgJSBzLT5tYXhfc2FtcGxlc107CisgICAgICAgICAgICBkZWxheWVkXzEgPSBkZWxheV9idWZmZXJbKHMtPmRlbGF5X2J1Zl9wb3MgKyBpbnRfZGVsYXkrKykgJSBzLT5tYXhfc2FtcGxlc107CisKKyAgICAgICAgICAgIGlmIChzLT5pbnRlcnBvbGF0aW9uID09IElOVEVSUE9MQVRJT05fTElORUFSKSB7CisgICAgICAgICAgICAgICAgZGVsYXllZCA9IGRlbGF5ZWRfMCArIChkZWxheWVkXzEgLSBkZWxheWVkXzApICogZnJhY19kZWxheTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZG91YmxlIGEsIGI7CisgICAgICAgICAgICAgICAgZG91YmxlIGRlbGF5ZWRfMiA9IGRlbGF5X2J1ZmZlclsocy0+ZGVsYXlfYnVmX3BvcyArIGludF9kZWxheSsrKSAlIHMtPm1heF9zYW1wbGVzXTsKKyAgICAgICAgICAgICAgICBkZWxheWVkXzIgLT0gZGVsYXllZF8wOworICAgICAgICAgICAgICAgIGRlbGF5ZWRfMSAtPSBkZWxheWVkXzA7CisgICAgICAgICAgICAgICAgYSA9IGRlbGF5ZWRfMiAqIC41IC0gZGVsYXllZF8xOworICAgICAgICAgICAgICAgIGIgPSBkZWxheWVkXzEgKiAgMiAtIGRlbGF5ZWRfMiAqLjU7CisgICAgICAgICAgICAgICAgZGVsYXllZCA9IGRlbGF5ZWRfMCArIChhICogZnJhY19kZWxheSArIGIpICogZnJhY19kZWxheTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+ZGVsYXlfbGFzdFtjaGFuXSA9IGRlbGF5ZWQ7CisgICAgICAgICAgICBvdXQgPSBpbiAqIHMtPmluX2dhaW4gKyBkZWxheWVkICogcy0+ZGVsYXlfZ2FpbjsKKyAgICAgICAgICAgIGRzdFtpXSA9IG91dDsKKyAgICAgICAgfQorICAgICAgICBzLT5sZm9fcG9zID0gKHMtPmxmb19wb3MgKyAxKSAlIHMtPmxmb19sZW5ndGg7CisgICAgfQorCisgICAgaWYgKGZyYW1lICE9IG91dF9mcmFtZSkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG91dF9mcmFtZSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEZsYW5nZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfZnJlZXAoJnMtPmxmbyk7CisgICAgYXZfZnJlZXAoJnMtPmRlbGF5X2xhc3QpOworCisgICAgaWYgKHMtPmRlbGF5X2J1ZmZlcikKKyAgICAgICAgYXZfZnJlZXAoJnMtPmRlbGF5X2J1ZmZlclswXSk7CisgICAgYXZfZnJlZXAoJnMtPmRlbGF5X2J1ZmZlcik7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBmbGFuZ2VyX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZmxhbmdlcl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfZmxhbmdlciA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJmbGFuZ2VyIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBseSBhIGZsYW5naW5nIGVmZmVjdCB0byB0aGUgYXVkaW8uIiksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEZsYW5nZXJDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZmbGFuZ2VyX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAuaW5wdXRzICAgICAgICA9IGZsYW5nZXJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gZmxhbmdlcl9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9qb2luLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfam9pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzE3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfam9pbi5jCkBAIC0wLDAgKzEsNTE5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEF1ZGlvIGpvaW4gZmlsdGVyCisgKgorICogSm9pbiBtdWx0aXBsZSBhdWRpbyBpbnB1dHMgYXMgZGlmZmVyZW50IGNoYW5uZWxzIGluCisgKiBhIHNpbmdsZSBvdXRwdXQKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhbm5lbE1hcCB7CisgICAgaW50IGlucHV0OyAgICAgICAgICAgICAgICAvLy88IGlucHV0IHN0cmVhbSBpbmRleAorICAgIGludCAgICAgICBpbl9jaGFubmVsX2lkeDsgLy8vPCBpbmRleCBvZiBpbl9jaGFubmVsIGluIHRoZSBpbnB1dCBzdHJlYW0gZGF0YQorICAgIHVpbnQ2NF90ICBpbl9jaGFubmVsOyAgICAgLy8vPCBsYXlvdXQgZGVzY3JpYmluZyB0aGUgaW5wdXQgY2hhbm5lbAorICAgIHVpbnQ2NF90IG91dF9jaGFubmVsOyAgICAgLy8vPCBsYXlvdXQgZGVzY3JpYmluZyB0aGUgb3V0cHV0IGNoYW5uZWwKK30gQ2hhbm5lbE1hcDsKKwordHlwZWRlZiBzdHJ1Y3QgSm9pbkNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgaW50IGlucHV0czsKKyAgICBjaGFyICptYXA7CisgICAgY2hhciAgICAqY2hhbm5lbF9sYXlvdXRfc3RyOworICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OworCisgICAgaW50ICAgICAgbmJfY2hhbm5lbHM7CisgICAgQ2hhbm5lbE1hcCAqY2hhbm5lbHM7CisKKyAgICAvKioKKyAgICAgKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgaW5wdXQgZnJhbWVzLCB1bnRpbCB3ZSBnZXQgb25lIG9uIGVhY2ggaW5wdXQuCisgICAgICovCisgICAgQVZGcmFtZSAqKmlucHV0X2ZyYW1lczsKKworICAgIC8qKgorICAgICAqICBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgYnVmZmVyIHJlZmVyZW5jZXMsIGZvciBhc3NlbWJsaW5nIHRoZSBvdXRwdXQgZnJhbWUuCisgICAgICovCisgICAgQVZCdWZmZXJSZWYgKipidWZmZXJzOworfSBKb2luQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSm9pbkNvbnRleHQsIHgpCisjZGVmaW5lIEEgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0KKyNkZWZpbmUgRiBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBqb2luX29wdGlvbnNbXSA9IHsKKyAgICB7ICJpbnB1dHMiLCAgICAgICAgICJOdW1iZXIgb2YgaW5wdXQgc3RyZWFtcy4iLCBPRkZTRVQoaW5wdXRzKSwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAyIH0sIDEsIElOVF9NQVgsICAgICAgIEF8RiB9LAorICAgIHsgImNoYW5uZWxfbGF5b3V0IiwgIkNoYW5uZWwgbGF5b3V0IG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IHN0cmVhbS4iLCAgICAgICAgICAgT0ZGU0VUKGNoYW5uZWxfbGF5b3V0X3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAic3RlcmVvIn0sIDAsIDAsIEF8RiB9LAorICAgIHsgIm1hcCIsICAgICAgICAgICAgIkEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY2hhbm5lbHMgbWFwcyBpbiB0aGUgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICInaW5wdXRfc3RyZWFtLmlucHV0X2NoYW5uZWwtb3V0cHV0X2NoYW5uZWwuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQobWFwKSwgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCAgICAgICAgICAgICAgICAgLmZsYWdzID0gQXxGIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhqb2luKTsKKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGxpbmstPmRzdDsKKyAgICBKb2luQ29udGV4dCAgICAgICAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKQorICAgICAgICBpZiAobGluayA9PSBjdHgtPmlucHV0c1tpXSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGF2X2Fzc2VydDAoaSA8IGN0eC0+bmJfaW5wdXRzKTsKKyAgICBhdl9hc3NlcnQwKCFzLT5pbnB1dF9mcmFtZXNbaV0pOworICAgIHMtPmlucHV0X2ZyYW1lc1tpXSA9IGZyYW1lOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbWFwcyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBKb2luQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjaGFyIHNlcGFyYXRvciA9ICd8JzsKKyAgICBjaGFyICpjdXIgICAgICA9IHMtPm1hcDsKKworI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKKyAgICBpZiAoY3VyICYmIHN0cmNocihjdXIsICcsJykpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaGlzIHN5bnRheCBpcyBkZXByZWNhdGVkLCB1c2UgJ3wnIHRvICIKKyAgICAgICAgICAgICAgICJzZXBhcmF0ZSB0aGUgbWFwcGluZ3MuXG4iKTsKKyAgICAgICAgc2VwYXJhdG9yID0gJywnOworICAgIH0KKyNlbmRpZgorCisgICAgd2hpbGUgKGN1ciAmJiAqY3VyKSB7CisgICAgICAgIGNoYXIgKnNlcCwgKm5leHQsICpwOworICAgICAgICB1aW50NjRfdCBpbl9jaGFubmVsID0gMCwgb3V0X2NoYW5uZWwgPSAwOworICAgICAgICBpbnQgaW5wdXRfaWR4LCBvdXRfY2hfaWR4LCBpbl9jaF9pZHg7CisKKyAgICAgICAgbmV4dCA9IHN0cmNocihjdXIsIHNlcGFyYXRvcik7CisgICAgICAgIGlmIChuZXh0KQorICAgICAgICAgICAgKm5leHQrKyA9IDA7CisKKyAgICAgICAgLyogc3BsaXQgdGhlIG1hcCBpbnRvIGlucHV0IGFuZCBvdXRwdXQgcGFydHMgKi8KKyAgICAgICAgaWYgKCEoc2VwID0gc3RyY2hyKGN1ciwgJy0nKSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3Npbmcgc2VwYXJhdG9yICctJyBpbiBjaGFubmVsICIKKyAgICAgICAgICAgICAgICAgICAibWFwICclcydcbiIsIGN1cik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgICpzZXArKyA9IDA7CisKKyNkZWZpbmUgUEFSU0VfQ0hBTk5FTChzdHIsIHZhciwgaW5vdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKHZhciA9IGF2X2dldF9jaGFubmVsX2xheW91dChzdHIpKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCAiIGlub3V0ICIgY2hhbm5lbDogJXMuXG4iLCBzdHIpO1wKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHZhcikgIT0gMSkgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNoYW5uZWwgbWFwIGRlc2NyaWJlcyBtb3JlIHRoYW4gb25lICIgICBcCisgICAgICAgICAgICAgICAgICAgaW5vdXQgIiBjaGFubmVsLlxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBhcnNlIG91dHB1dCBjaGFubmVsICovCisgICAgICAgIFBBUlNFX0NIQU5ORUwoc2VwLCBvdXRfY2hhbm5lbCwgIm91dHB1dCIpOworICAgICAgICBpZiAoIShvdXRfY2hhbm5lbCAmIHMtPmNoYW5uZWxfbGF5b3V0KSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3V0cHV0IGNoYW5uZWwgJyVzJyBpcyBub3QgcHJlc2VudCBpbiAiCisgICAgICAgICAgICAgICAgICAgInJlcXVlc3RlZCBjaGFubmVsIGxheW91dC5cbiIsIHNlcCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgb3V0X2NoX2lkeCA9IGF2X2dldF9jaGFubmVsX2xheW91dF9jaGFubmVsX2luZGV4KHMtPmNoYW5uZWxfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2NoYW5uZWwpOworICAgICAgICBpZiAocy0+Y2hhbm5lbHNbb3V0X2NoX2lkeF0uaW5wdXQgPj0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTXVsdGlwbGUgbWFwcyBmb3Igb3V0cHV0IGNoYW5uZWwgIgorICAgICAgICAgICAgICAgICAgICInJXMnLlxuIiwgc2VwKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBwYXJzZSBpbnB1dCBjaGFubmVsICovCisgICAgICAgIGlucHV0X2lkeCA9IHN0cnRvbChjdXIsICZjdXIsIDApOworICAgICAgICBpZiAoaW5wdXRfaWR4IDwgMCB8fCBpbnB1dF9pZHggPj0gcy0+aW5wdXRzKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGlucHV0IHN0cmVhbSBpbmRleDogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgIGlucHV0X2lkeCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpjdXIpCisgICAgICAgICAgICBjdXIrKzsKKworICAgICAgICBpbl9jaF9pZHggPSBzdHJ0b2woY3VyLCAmcCwgMCk7CisgICAgICAgIGlmIChwID09IGN1cikgeworICAgICAgICAgICAgLyogY2hhbm5lbCBzcGVjaWZpZXIgaXMgbm90IGEgbnVtYmVyLAorICAgICAgICAgICAgICogdHJ5IHRvIHBhcnNlIGFzIGNoYW5uZWwgbmFtZSAqLworICAgICAgICAgICAgUEFSU0VfQ0hBTk5FTChjdXIsIGluX2NoYW5uZWwsICJpbnB1dCIpOworICAgICAgICB9CisKKyAgICAgICAgcy0+Y2hhbm5lbHNbb3V0X2NoX2lkeF0uaW5wdXQgICAgICA9IGlucHV0X2lkeDsKKyAgICAgICAgaWYgKGluX2NoYW5uZWwpCisgICAgICAgICAgICBzLT5jaGFubmVsc1tvdXRfY2hfaWR4XS5pbl9jaGFubmVsID0gaW5fY2hhbm5lbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+Y2hhbm5lbHNbb3V0X2NoX2lkeF0uaW5fY2hhbm5lbF9pZHggPSBpbl9jaF9pZHg7CisKKyAgICAgICAgY3VyID0gbmV4dDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBqb2luX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgSm9pbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldCwgaTsKKworICAgIGlmICghKHMtPmNoYW5uZWxfbGF5b3V0ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0KHMtPmNoYW5uZWxfbGF5b3V0X3N0cikpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgY2hhbm5lbCBsYXlvdXQgJyVzJy5cbiIsCisgICAgICAgICAgICAgICBzLT5jaGFubmVsX2xheW91dF9zdHIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPm5iX2NoYW5uZWxzICA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzLT5jaGFubmVsX2xheW91dCk7CisgICAgcy0+Y2hhbm5lbHMgICAgID0gYXZfbWFsbG9jeihzaXplb2YoKnMtPmNoYW5uZWxzKSAqIHMtPm5iX2NoYW5uZWxzKTsKKyAgICBzLT5idWZmZXJzICAgICAgPSBhdl9tYWxsb2N6KHNpemVvZigqcy0+YnVmZmVycykgICogcy0+bmJfY2hhbm5lbHMpOworICAgIHMtPmlucHV0X2ZyYW1lcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzLT5pbnB1dF9mcmFtZXMpICogcy0+aW5wdXRzKTsKKyAgICBpZiAoIXMtPmNoYW5uZWxzIHx8ICFzLT5idWZmZXJzfHwgIXMtPmlucHV0X2ZyYW1lcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIHMtPmNoYW5uZWxzW2ldLm91dF9jaGFubmVsID0gYXZfY2hhbm5lbF9sYXlvdXRfZXh0cmFjdF9jaGFubmVsKHMtPmNoYW5uZWxfbGF5b3V0LCBpKTsKKyAgICAgICAgcy0+Y2hhbm5lbHNbaV0uaW5wdXQgICAgICAgPSAtMTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHBhcnNlX21hcHMoY3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmlucHV0czsgaSsrKSB7CisgICAgICAgIGNoYXIgbmFtZVszMl07CisgICAgICAgIEFWRmlsdGVyUGFkIHBhZCA9IHsgMCB9OworCisgICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImlucHV0JWQiLCBpKTsKKyAgICAgICAgcGFkLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBwYWQubmFtZSAgICAgICAgICAgPSBhdl9zdHJkdXAobmFtZSk7CisgICAgICAgIHBhZC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZTsKKworICAgICAgICBwYWQubmVlZHNfZmlmbyA9IDE7CisKKyAgICAgICAgZmZfaW5zZXJ0X2lucGFkKGN0eCwgaSwgJnBhZCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgam9pbl91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgSm9pbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmY3R4LT5pbnB1dF9wYWRzW2ldLm5hbWUpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5pbnB1dF9mcmFtZXNbaV0pOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZzLT5jaGFubmVscyk7CisgICAgYXZfZnJlZXAoJnMtPmJ1ZmZlcnMpOworICAgIGF2X2ZyZWVwKCZzLT5pbnB1dF9mcmFtZXMpOworfQorCitzdGF0aWMgaW50IGpvaW5fcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBKb2luQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIGZmX2FkZF9jaGFubmVsX2xheW91dCgmbGF5b3V0cywgcy0+Y2hhbm5lbF9sYXlvdXQpOworICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJmN0eC0+b3V0cHV0c1swXS0+aW5fY2hhbm5lbF9sYXlvdXRzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9sYXlvdXRzKCk7CisgICAgICAgIGlmICghbGF5b3V0cykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJmN0eC0+aW5wdXRzW2ldLT5vdXRfY2hhbm5lbF9sYXlvdXRzKTsKKyAgICB9CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMgICAgKGN0eCwgZmZfcGxhbmFyX3NhbXBsZV9mbXRzKCkpOworICAgIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmZl9hbGxfc2FtcGxlcmF0ZXMoKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ3Vlc3NfbWFwX21hdGNoaW5nKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBDaGFubmVsTWFwICpjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqaW5wdXRzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICpsaW5rID0gY3R4LT5pbnB1dHNbaV07CisKKyAgICAgICAgaWYgKGNoLT5vdXRfY2hhbm5lbCAmIGxpbmstPmNoYW5uZWxfbGF5b3V0ICYmCisgICAgICAgICAgICAhKGNoLT5vdXRfY2hhbm5lbCAmIGlucHV0c1tpXSkpIHsKKyAgICAgICAgICAgIGNoLT5pbnB1dCAgICAgID0gaTsKKyAgICAgICAgICAgIGNoLT5pbl9jaGFubmVsID0gY2gtPm91dF9jaGFubmVsOworICAgICAgICAgICAgaW5wdXRzW2ldICAgICB8PSBjaC0+b3V0X2NoYW5uZWw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGd1ZXNzX21hcF9hbnkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIENoYW5uZWxNYXAgKmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqaW5wdXRzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICpsaW5rID0gY3R4LT5pbnB1dHNbaV07CisKKyAgICAgICAgaWYgKChpbnB1dHNbaV0gJiBsaW5rLT5jaGFubmVsX2xheW91dCkgIT0gbGluay0+Y2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHVudXNlZCA9IGxpbmstPmNoYW5uZWxfbGF5b3V0ICYgfmlucHV0c1tpXTsKKworICAgICAgICAgICAgY2gtPmlucHV0ICAgICAgPSBpOworICAgICAgICAgICAgY2gtPmluX2NoYW5uZWwgPSBhdl9jaGFubmVsX2xheW91dF9leHRyYWN0X2NoYW5uZWwodW51c2VkLCAwKTsKKyAgICAgICAgICAgIGlucHV0c1tpXSAgICAgfD0gY2gtPmluX2NoYW5uZWw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgam9pbl9jb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBKb2luQ29udGV4dCAgICAgICAqcyA9IGN0eC0+cHJpdjsKKyAgICB1aW50NjRfdCAqaW5wdXRzOyAgIC8vIG50aCBlbGVtZW50IHRyYWNrcyB3aGljaCBjaGFubmVscyBhcmUgdXNlZCBmcm9tIG50aCBpbnB1dAorICAgIGludCBpLCByZXQgPSAwOworCisgICAgLyogaW5pdGlhbGl6ZSBpbnB1dHMgdG8gdXNlci1zcGVjaWZpZWQgbWFwcGluZ3MgKi8KKyAgICBpZiAoIShpbnB1dHMgPSBhdl9tYWxsb2N6KHNpemVvZigqaW5wdXRzKSAqIGN0eC0+bmJfaW5wdXRzKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgQ2hhbm5lbE1hcCAqY2ggPSAmcy0+Y2hhbm5lbHNbaV07CisgICAgICAgIEFWRmlsdGVyTGluayAqaW5saW5rOworCisgICAgICAgIGlmIChjaC0+aW5wdXQgPCAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaW5saW5rID0gY3R4LT5pbnB1dHNbY2gtPmlucHV0XTsKKworICAgICAgICBpZiAoIWNoLT5pbl9jaGFubmVsKQorICAgICAgICAgICAgY2gtPmluX2NoYW5uZWwgPSBhdl9jaGFubmVsX2xheW91dF9leHRyYWN0X2NoYW5uZWwoaW5saW5rLT5jaGFubmVsX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoLT5pbl9jaGFubmVsX2lkeCk7CisKKyAgICAgICAgaWYgKCEoY2gtPmluX2NoYW5uZWwgJiBpbmxpbmstPmNoYW5uZWxfbGF5b3V0KSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUmVxdWVzdGVkIGNoYW5uZWwgJXMgaXMgbm90IHByZXNlbnQgaW4gIgorICAgICAgICAgICAgICAgICAgICJpbnB1dCBzdHJlYW0gIyVkLlxuIiwgYXZfZ2V0X2NoYW5uZWxfbmFtZShjaC0+aW5fY2hhbm5lbCksCisgICAgICAgICAgICAgICAgICAgY2gtPmlucHV0KTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGlucHV0c1tjaC0+aW5wdXRdIHw9IGNoLT5pbl9jaGFubmVsOworICAgIH0KKworICAgIC8qIGd1ZXNzIGNoYW5uZWwgbWFwcyB3aGVuIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgKi8KKyAgICAvKiBmaXJzdCB0cnkgdW51c2VkIG1hdGNoaW5nIGNoYW5uZWxzICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgQ2hhbm5lbE1hcCAqY2ggPSAmcy0+Y2hhbm5lbHNbaV07CisKKyAgICAgICAgaWYgKGNoLT5pbnB1dCA8IDApCisgICAgICAgICAgICBndWVzc19tYXBfbWF0Y2hpbmcoY3R4LCBjaCwgaW5wdXRzKTsKKyAgICB9CisKKyAgICAvKiBpZiB0aGUgYWJvdmUgZmFpbGVkLCB0cnkgdG8gZmluZCBfYW55XyB1bnVzZWQgaW5wdXQgY2hhbm5lbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIENoYW5uZWxNYXAgKmNoID0gJnMtPmNoYW5uZWxzW2ldOworCisgICAgICAgIGlmIChjaC0+aW5wdXQgPCAwKQorICAgICAgICAgICAgZ3Vlc3NfbWFwX2FueShjdHgsIGNoLCBpbnB1dHMpOworCisgICAgICAgIGlmIChjaC0+aW5wdXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZmluZCBpbnB1dCBjaGFubmVsIGZvciAiCisgICAgICAgICAgICAgICAgICAgIm91dHB1dCBjaGFubmVsICclcycuXG4iLAorICAgICAgICAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX25hbWUoY2gtPm91dF9jaGFubmVsKSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBjaC0+aW5fY2hhbm5lbF9pZHggPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfY2hhbm5lbF9pbmRleChjdHgtPmlucHV0c1tjaC0+aW5wdXRdLT5jaGFubmVsX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gtPmluX2NoYW5uZWwpOworICAgIH0KKworICAgIC8qIHByaW50IG1hcHBpbmdzICovCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJtYXBwaW5nczogIik7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgQ2hhbm5lbE1hcCAqY2ggPSAmcy0+Y2hhbm5lbHNbaV07CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiJWQuJXMgPT4gJXMgIiwgY2gtPmlucHV0LAorICAgICAgICAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbmFtZShjaC0+aW5fY2hhbm5lbCksCisgICAgICAgICAgICAgICBhdl9nZXRfY2hhbm5lbF9uYW1lKGNoLT5vdXRfY2hhbm5lbCkpOworICAgIH0KKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlxuIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBpZiAoIWlucHV0c1tpXSkKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiTm8gY2hhbm5lbHMgYXJlIHVzZWQgZnJvbSBpbnB1dCAiCisgICAgICAgICAgICAgICAgICAgInN0cmVhbSAlZC5cbiIsIGkpOworICAgIH0KKworZmFpbDoKKyAgICBhdl9mcmVlcCgmaW5wdXRzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGpvaW5fcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgSm9pbkNvbnRleHQgKnMgICAgICAgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgaW50IGxpbmVzaXplICAgPSBJTlRfTUFYOworICAgIGludCBuYl9zYW1wbGVzID0gMDsKKyAgICBpbnQgbmJfYnVmZmVycyA9IDA7CisgICAgaW50IGksIGosIHJldDsKKworICAgIC8qIGdldCBhIGZyYW1lIG9uIGVhY2ggaW5wdXQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzW2ldOworCisgICAgICAgIGlmICghcy0+aW5wdXRfZnJhbWVzW2ldICYmCisgICAgICAgICAgICAocmV0ID0gZmZfcmVxdWVzdF9mcmFtZShpbmxpbmspKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIC8qIHJlcXVlc3QgdGhlIHNhbWUgbnVtYmVyIG9mIHNhbXBsZXMgb24gYWxsIGlucHV0cyAqLworICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBuYl9zYW1wbGVzID0gcy0+aW5wdXRfZnJhbWVzWzBdLT5uYl9zYW1wbGVzOworCisgICAgICAgICAgICBmb3IgKGogPSAxOyAhaSAmJiBqIDwgY3R4LT5uYl9pbnB1dHM7IGorKykKKyAgICAgICAgICAgICAgICBjdHgtPmlucHV0c1tqXS0+cmVxdWVzdF9zYW1wbGVzID0gbmJfc2FtcGxlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNldHVwIHRoZSBvdXRwdXQgZnJhbWUgKi8KKyAgICBmcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpZiAocy0+bmJfY2hhbm5lbHMgPiBGRl9BUlJBWV9FTEVNUyhmcmFtZS0+ZGF0YSkpIHsKKyAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2RhdGEgPSBhdl9tYWxsb2N6KHMtPm5iX2NoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqZnJhbWUtPmV4dGVuZGVkX2RhdGEpKTsKKyAgICAgICAgaWYgKCFmcmFtZS0+ZXh0ZW5kZWRfZGF0YSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29weSB0aGUgZGF0YSBwb2ludGVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIENoYW5uZWxNYXAgKmNoID0gJnMtPmNoYW5uZWxzW2ldOworICAgICAgICBBVkZyYW1lICpjdXIgICA9IHMtPmlucHV0X2ZyYW1lc1tjaC0+aW5wdXRdOworICAgICAgICBBVkJ1ZmZlclJlZiAqYnVmOworCisgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhW2ldID0gY3VyLT5leHRlbmRlZF9kYXRhW2NoLT5pbl9jaGFubmVsX2lkeF07CisgICAgICAgIGxpbmVzaXplID0gRkZNSU4obGluZXNpemUsIGN1ci0+bGluZXNpemVbMF0pOworCisgICAgICAgIC8qIGFkZCB0aGUgYnVmZmVyIHdoZXJlIHRoaXMgcGxhbiBpcyBzdG9yZWQgdG8gdGhlIGxpc3QgaWYgaXQncworICAgICAgICAgKiBub3QgYWxyZWFkeSB0aGVyZSAqLworICAgICAgICBidWYgPSBhdl9mcmFtZV9nZXRfcGxhbmVfYnVmZmVyKGN1ciwgY2gtPmluX2NoYW5uZWxfaWR4KTsKKyAgICAgICAgaWYgKCFidWYpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmJfYnVmZmVyczsgaisrKQorICAgICAgICAgICAgaWYgKHMtPmJ1ZmZlcnNbal0tPmJ1ZmZlciA9PSBidWYtPmJ1ZmZlcikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGogPT0gaSkKKyAgICAgICAgICAgIHMtPmJ1ZmZlcnNbbmJfYnVmZmVycysrXSA9IGJ1ZjsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgcmVmZXJlbmNlcyB0byB0aGUgYnVmZmVycyB3ZSBjb3BpZWQgdG8gb3V0cHV0ICovCisgICAgaWYgKG5iX2J1ZmZlcnMgPiBGRl9BUlJBWV9FTEVNUyhmcmFtZS0+YnVmKSkgeworICAgICAgICBmcmFtZS0+bmJfZXh0ZW5kZWRfYnVmID0gbmJfYnVmZmVycyAtIEZGX0FSUkFZX0VMRU1TKGZyYW1lLT5idWYpOworICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfYnVmID0gYXZfbWFsbG9jeihzaXplb2YoKmZyYW1lLT5leHRlbmRlZF9idWYpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX2V4dGVuZGVkX2J1Zik7CisgICAgICAgIGlmICghZnJhbWUtPmV4dGVuZGVkX2J1ZikgeworICAgICAgICAgICAgZnJhbWUtPm5iX2V4dGVuZGVkX2J1ZiA9IDA7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IEZGTUlOKEZGX0FSUkFZX0VMRU1TKGZyYW1lLT5idWYpLCBuYl9idWZmZXJzKTsgaSsrKSB7CisgICAgICAgIGZyYW1lLT5idWZbaV0gPSBhdl9idWZmZXJfcmVmKHMtPmJ1ZmZlcnNbaV0pOworICAgICAgICBpZiAoIWZyYW1lLT5idWZbaV0pIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm5iX2V4dGVuZGVkX2J1ZjsgaSsrKSB7CisgICAgICAgIGZyYW1lLT5leHRlbmRlZF9idWZbaV0gPSBhdl9idWZmZXJfcmVmKHMtPmJ1ZmZlcnNbaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0FSUkFZX0VMRU1TKGZyYW1lLT5idWYpXSk7CisgICAgICAgIGlmICghZnJhbWUtPmV4dGVuZGVkX2J1ZltpXSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgICAgID0gbmJfc2FtcGxlczsKKyAgICBmcmFtZS0+Y2hhbm5lbF9sYXlvdXQgPSBvdXRsaW5rLT5jaGFubmVsX2xheW91dDsKKyAgICBhdl9mcmFtZV9zZXRfY2hhbm5lbHMoZnJhbWUsIG91dGxpbmstPmNoYW5uZWxzKTsKKyAgICBmcmFtZS0+c2FtcGxlX3JhdGUgICAgPSBvdXRsaW5rLT5zYW1wbGVfcmF0ZTsKKyAgICBmcmFtZS0+Zm9ybWF0ICAgICAgICAgPSBvdXRsaW5rLT5mb3JtYXQ7CisgICAgZnJhbWUtPnB0cyAgICAgICAgICAgID0gcy0+aW5wdXRfZnJhbWVzWzBdLT5wdHM7CisgICAgZnJhbWUtPmxpbmVzaXplWzBdICAgID0gbGluZXNpemU7CisgICAgaWYgKGZyYW1lLT5kYXRhICE9IGZyYW1lLT5leHRlbmRlZF9kYXRhKSB7CisgICAgICAgIG1lbWNweShmcmFtZS0+ZGF0YSwgZnJhbWUtPmV4dGVuZGVkX2RhdGEsIHNpemVvZigqZnJhbWUtPmRhdGEpICoKKyAgICAgICAgICAgICAgIEZGTUlOKEZGX0FSUkFZX0VMRU1TKGZyYW1lLT5kYXRhKSwgcy0+bmJfY2hhbm5lbHMpKTsKKyAgICB9CisKKyAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZnJhbWUpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmlucHV0X2ZyYW1lc1tpXSk7CisKKyAgICByZXR1cm4gcmV0OworCitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfam9pbl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gam9pbl9jb25maWdfb3V0cHV0LAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IGpvaW5fcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9qb2luID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJqb2luIiwKKyAgICAuZGVzY3JpcHRpb24gICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSm9pbiBtdWx0aXBsZSBhdWRpbyBzdHJlYW1zIGludG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aS1jaGFubmVsIG91dHB1dC4iKSwKKyAgICAucHJpdl9zaXplICAgICAgPSBzaXplb2YoSm9pbkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZqb2luX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgICA9IGpvaW5faW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBqb2luX3VuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyAgPSBqb2luX3F1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgID0gTlVMTCwKKyAgICAub3V0cHV0cyAgICAgICAgPSBhdmZpbHRlcl9hZl9qb2luX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX0lOUFVUUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfbGFkc3BhLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfbGFkc3BhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1N2U2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9sYWRzcGEuYwpAQCAtMCwwICsxLDcwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNaW5hIE5hZ3kgWmFraQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBMQURTUEEgd3JhcHBlcgorICovCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGxhZHNwYS5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTEFEU1BBQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgY2hhciAqZGxfbmFtZTsKKyAgICBjaGFyICpwbHVnaW47CisgICAgY2hhciAqb3B0aW9uczsKKyAgICB2b2lkICpkbF9oYW5kbGU7CisKKyAgICB1bnNpZ25lZCBsb25nIG5iX2lucHV0czsKKyAgICB1bnNpZ25lZCBsb25nICppcG1hcDsgICAgICAvKiBtYXAgaW5wdXQgbnVtYmVyIHRvIHBvcnQgbnVtYmVyICovCisKKyAgICB1bnNpZ25lZCBsb25nIG5iX2lucHV0Y29udHJvbHM7CisgICAgdW5zaWduZWQgbG9uZyAqaWNtYXA7ICAgICAgLyogbWFwIGlucHV0IGNvbnRyb2wgbnVtYmVyIHRvIHBvcnQgbnVtYmVyICovCisgICAgTEFEU1BBX0RhdGEgKmljdGx2OyAgICAgICAgLyogaW5wdXQgY29udHJvbHMgdmFsdWVzICovCisKKyAgICB1bnNpZ25lZCBsb25nIG5iX291dHB1dHM7CisgICAgdW5zaWduZWQgbG9uZyAqb3BtYXA7ICAgICAgLyogbWFwIG91dHB1dCBudW1iZXIgdG8gcG9ydCBudW1iZXIgKi8KKworICAgIHVuc2lnbmVkIGxvbmcgbmJfb3V0cHV0Y29udHJvbHM7CisgICAgdW5zaWduZWQgbG9uZyAqb2NtYXA7ICAgICAgLyogbWFwIG91dHB1dCBjb250cm9sIG51bWJlciB0byBwb3J0IG51bWJlciAqLworICAgIExBRFNQQV9EYXRhICpvY3RsdjsgICAgICAgIC8qIG91dHB1dCBjb250cm9scyB2YWx1ZXMgKi8KKworICAgIGNvbnN0IExBRFNQQV9EZXNjcmlwdG9yICpkZXNjOworICAgIGludCAqY3RsX25lZWRzX3ZhbHVlOworICAgIGludCBuYl9oYW5kbGVzOworICAgIExBRFNQQV9IYW5kbGUgKmhhbmRsZXM7CisKKyAgICBpbnQgc2FtcGxlX3JhdGU7CisgICAgaW50IG5iX3NhbXBsZXM7CisgICAgaW50NjRfdCBwdHM7CisgICAgaW50NjRfdCBkdXJhdGlvbjsKK30gTEFEU1BBQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTEFEU1BBQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBsYWRzcGFfb3B0aW9uc1tdID0geworICAgIHsgImZpbGUiLCAic2V0IGxpYnJhcnkgbmFtZSBvciBmdWxsIHBhdGgiLCBPRkZTRVQoZGxfbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJmIiwgICAgInNldCBsaWJyYXJ5IG5hbWUgb3IgZnVsbCBwYXRoIiwgT0ZGU0VUKGRsX25hbWUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAicGx1Z2luIiwgInNldCBwbHVnaW4gbmFtZSIsIE9GRlNFVChwbHVnaW4pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAicCIsICAgICAgInNldCBwbHVnaW4gbmFtZSIsIE9GRlNFVChwbHVnaW4pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiY29udHJvbHMiLCAic2V0IHBsdWdpbiBvcHRpb25zIiwgT0ZGU0VUKG9wdGlvbnMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiYyIsICAgICAgICAic2V0IHBsdWdpbiBvcHRpb25zIiwgT0ZGU0VUKG9wdGlvbnMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAic2FtcGxlX3JhdGUiLCAic2V0IHNhbXBsZSByYXRlIiwgT0ZGU0VUKHNhbXBsZV9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND00NDEwMH0sIDEsIElOVDMyX01BWCwgRkxBR1MgfSwKKyAgICB7ICJzIiwgICAgICAgICAgICJzZXQgc2FtcGxlIHJhdGUiLCBPRkZTRVQoc2FtcGxlX3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTQ0MTAwfSwgMSwgSU5UMzJfTUFYLCBGTEFHUyB9LAorICAgIHsgIm5iX3NhbXBsZXMiLCAic2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgcmVxdWVzdGVkIGZyYW1lIiwgT0ZGU0VUKG5iX3NhbXBsZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTEwMjR9LCAxLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgIm4iLCAgICAgICAgICAic2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgcmVxdWVzdGVkIGZyYW1lIiwgT0ZGU0VUKG5iX3NhbXBsZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTEwMjR9LCAxLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgImR1cmF0aW9uIiwgInNldCBhdWRpbyBkdXJhdGlvbiIsIE9GRlNFVChkdXJhdGlvbiksIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2ND0tMX0sIC0xLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisgICAgeyAiZCIsICAgICAgICAic2V0IGF1ZGlvIGR1cmF0aW9uIiwgT0ZGU0VUKGR1cmF0aW9uKSwgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0PS0xfSwgLTEsIElOVDY0X01BWCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGxhZHNwYSk7CisKK3N0YXRpYyB2b2lkIHByaW50X2N0bF9pbmZvKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMQURTUEFDb250ZXh0ICpzLCBpbnQgY3RsLCB1bnNpZ25lZCBsb25nICptYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMQURTUEFfRGF0YSAqdmFsdWVzLCBpbnQgcHJpbnQpCit7CisgICAgY29uc3QgTEFEU1BBX1BvcnRSYW5nZUhpbnQgKmggPSBzLT5kZXNjLT5Qb3J0UmFuZ2VIaW50cyArIG1hcFtjdGxdOworCisgICAgYXZfbG9nKGN0eCwgbGV2ZWwsICJjJWk6ICVzIFsiLCBjdGwsIHMtPmRlc2MtPlBvcnROYW1lc1ttYXBbY3RsXV0pOworCisgICAgaWYgKExBRFNQQV9JU19ISU5UX1RPR0dMRUQoaC0+SGludERlc2NyaXB0b3IpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIGxldmVsLCAidG9nZ2xlZCAoMSBvciAwKSIpOworCisgICAgICAgIGlmIChMQURTUEFfSVNfSElOVF9IQVNfREVGQVVMVChoLT5IaW50RGVzY3JpcHRvcikpCisgICAgICAgICAgICBhdl9sb2coY3R4LCBsZXZlbCwgIiAoZGVmYXVsdCAlaSkiLCAoaW50KXZhbHVlc1tjdGxdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoTEFEU1BBX0lTX0hJTlRfSU5URUdFUihoLT5IaW50RGVzY3JpcHRvcikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIGxldmVsLCAiPGludD4iKTsKKworICAgICAgICAgICAgaWYgKExBRFNQQV9JU19ISU5UX0JPVU5ERURfQkVMT1coaC0+SGludERlc2NyaXB0b3IpKQorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIGxldmVsLCAiLCBtaW46ICVpIiwgKGludCloLT5Mb3dlckJvdW5kKTsKKworICAgICAgICAgICAgaWYgKExBRFNQQV9JU19ISU5UX0JPVU5ERURfQUJPVkUoaC0+SGludERlc2NyaXB0b3IpKQorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIGxldmVsLCAiLCBtYXg6ICVpIiwgKGludCloLT5VcHBlckJvdW5kKTsKKworICAgICAgICAgICAgaWYgKHByaW50KQorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIGxldmVsLCAiICh2YWx1ZSAlZCkiLCAoaW50KXZhbHVlc1tjdGxdKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKExBRFNQQV9JU19ISU5UX0hBU19ERUZBVUxUKGgtPkhpbnREZXNjcmlwdG9yKSkKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBsZXZlbCwgIiAoZGVmYXVsdCAlZCkiLCAoaW50KXZhbHVlc1tjdGxdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIGxldmVsLCAiPGZsb2F0PiIpOworCisgICAgICAgICAgICBpZiAoTEFEU1BBX0lTX0hJTlRfQk9VTkRFRF9CRUxPVyhoLT5IaW50RGVzY3JpcHRvcikpCisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgbGV2ZWwsICIsIG1pbjogJWYiLCBoLT5Mb3dlckJvdW5kKTsKKworICAgICAgICAgICAgaWYgKExBRFNQQV9JU19ISU5UX0JPVU5ERURfQUJPVkUoaC0+SGludERlc2NyaXB0b3IpKQorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIGxldmVsLCAiLCBtYXg6ICVmIiwgaC0+VXBwZXJCb3VuZCk7CisKKyAgICAgICAgICAgIGlmIChwcmludCkKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBsZXZlbCwgIiAodmFsdWUgJWYpIiwgdmFsdWVzW2N0bF0pOworICAgICAgICAgICAgZWxzZSBpZiAoTEFEU1BBX0lTX0hJTlRfSEFTX0RFRkFVTFQoaC0+SGludERlc2NyaXB0b3IpKQorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIGxldmVsLCAiIChkZWZhdWx0ICVmKSIsIHZhbHVlc1tjdGxdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMQURTUEFfSVNfSElOVF9TQU1QTEVfUkFURShoLT5IaW50RGVzY3JpcHRvcikpCisgICAgICAgICAgICBhdl9sb2coY3R4LCBsZXZlbCwgIiwgbXVsdGlwbGUgb2Ygc2FtcGxlIHJhdGUiKTsKKworICAgICAgICBpZiAoTEFEU1BBX0lTX0hJTlRfTE9HQVJJVEhNSUMoaC0+SGludERlc2NyaXB0b3IpKQorICAgICAgICAgICAgYXZfbG9nKGN0eCwgbGV2ZWwsICIsIGxvZ2FyaXRobWljIHNjYWxlIik7CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgbGV2ZWwsICJdXG4iKTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgTEFEU1BBQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IGksIGg7CisKKyAgICBpZiAoIXMtPm5iX291dHB1dHMgfHwKKyAgICAgICAgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSAmJiBzLT5uYl9pbnB1dHMgPT0gcy0+bmJfb3V0cHV0cyAmJgorICAgICAgICAhKHMtPmRlc2MtPlByb3BlcnRpZXMgJiBMQURTUEFfUFJPUEVSVFlfSU5QTEFDRV9CUk9LRU4pKSkgeworICAgICAgICBvdXQgPSBpbjsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGN0eC0+b3V0cHV0c1swXSwgaW4tPm5iX3NhbXBsZXMpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0KKworICAgIGZvciAoaCA9IDA7IGggPCBzLT5uYl9oYW5kbGVzOyBoKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgICAgICBzLT5kZXNjLT5jb25uZWN0X3BvcnQocy0+aGFuZGxlc1toXSwgcy0+aXBtYXBbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExBRFNQQV9EYXRhKilpbi0+ZXh0ZW5kZWRfZGF0YVtpXSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfb3V0cHV0czsgaSsrKSB7CisgICAgICAgICAgICBzLT5kZXNjLT5jb25uZWN0X3BvcnQocy0+aGFuZGxlc1toXSwgcy0+b3BtYXBbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExBRFNQQV9EYXRhKilvdXQtPmV4dGVuZGVkX2RhdGFbaV0pOworICAgICAgICB9CisKKyAgICAgICAgcy0+ZGVzYy0+cnVuKHMtPmhhbmRsZXNbaF0sIGluLT5uYl9zYW1wbGVzKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfb3V0cHV0Y29udHJvbHM7IGkrKykKKyAgICAgICAgcHJpbnRfY3RsX2luZm8oY3R4LCBBVl9MT0dfVkVSQk9TRSwgcywgaSwgcy0+b2NtYXAsIHMtPm9jdGx2LCAxKTsKKworICAgIGlmIChvdXQgIT0gaW4pCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBvdXQpOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIExBRFNQQUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludDY0X3QgdDsKKyAgICBpbnQgaTsKKworICAgIGlmIChjdHgtPm5iX2lucHV0cykKKyAgICAgICAgcmV0dXJuIGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworCisgICAgdCA9IGF2X3Jlc2NhbGUocy0+cHRzLCBBVl9USU1FX0JBU0UsIHMtPnNhbXBsZV9yYXRlKTsKKyAgICBpZiAocy0+ZHVyYXRpb24gPj0gMCAmJiB0ID49IHMtPmR1cmF0aW9uKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIHMtPm5iX3NhbXBsZXMpOworICAgIGlmICghb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX291dHB1dHM7IGkrKykKKyAgICAgICAgcy0+ZGVzYy0+Y29ubmVjdF9wb3J0KHMtPmhhbmRsZXNbMF0sIHMtPm9wbWFwW2ldLAorICAgICAgICAgICAgICAgIChMQURTUEFfRGF0YSopb3V0LT5leHRlbmRlZF9kYXRhW2ldKTsKKworICAgIHMtPmRlc2MtPnJ1bihzLT5oYW5kbGVzWzBdLCBzLT5uYl9zYW1wbGVzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9vdXRwdXRjb250cm9sczsgaSsrKQorICAgICAgICBwcmludF9jdGxfaW5mbyhjdHgsIEFWX0xPR19JTkZPLCBzLCBpLCBzLT5vY21hcCwgcy0+b2N0bHYsIDEpOworCisgICAgb3V0LT5zYW1wbGVfcmF0ZSA9IHMtPnNhbXBsZV9yYXRlOworICAgIG91dC0+cHRzICAgICAgICAgPSBzLT5wdHM7CisgICAgcy0+cHRzICAgICAgICAgICs9IHMtPm5iX3NhbXBsZXM7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X2N0bF92YWx1ZShMQURTUEFDb250ZXh0ICpzLCBpbnQgY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKm1hcCwgTEFEU1BBX0RhdGEgKnZhbHVlcykKK3sKKyAgICBjb25zdCBMQURTUEFfUG9ydFJhbmdlSGludCAqaCA9IHMtPmRlc2MtPlBvcnRSYW5nZUhpbnRzICsgbWFwW2N0bF07CisgICAgY29uc3QgTEFEU1BBX0RhdGEgbG93ZXIgPSBoLT5Mb3dlckJvdW5kOworICAgIGNvbnN0IExBRFNQQV9EYXRhIHVwcGVyID0gaC0+VXBwZXJCb3VuZDsKKworICAgIGlmIChMQURTUEFfSVNfSElOVF9ERUZBVUxUX01JTklNVU0oaC0+SGludERlc2NyaXB0b3IpKSB7CisgICAgICAgIHZhbHVlc1tjdGxdID0gbG93ZXI7CisgICAgfSBlbHNlIGlmIChMQURTUEFfSVNfSElOVF9ERUZBVUxUX01BWElNVU0oaC0+SGludERlc2NyaXB0b3IpKSB7CisgICAgICAgIHZhbHVlc1tjdGxdID0gdXBwZXI7CisgICAgfSBlbHNlIGlmIChMQURTUEFfSVNfSElOVF9ERUZBVUxUXzAoaC0+SGludERlc2NyaXB0b3IpKSB7CisgICAgICAgIHZhbHVlc1tjdGxdID0gMC4wOworICAgIH0gZWxzZSBpZiAoTEFEU1BBX0lTX0hJTlRfREVGQVVMVF8xKGgtPkhpbnREZXNjcmlwdG9yKSkgeworICAgICAgICB2YWx1ZXNbY3RsXSA9IDEuMDsKKyAgICB9IGVsc2UgaWYgKExBRFNQQV9JU19ISU5UX0RFRkFVTFRfMTAwKGgtPkhpbnREZXNjcmlwdG9yKSkgeworICAgICAgICB2YWx1ZXNbY3RsXSA9IDEwMC4wOworICAgIH0gZWxzZSBpZiAoTEFEU1BBX0lTX0hJTlRfREVGQVVMVF80NDAoaC0+SGludERlc2NyaXB0b3IpKSB7CisgICAgICAgIHZhbHVlc1tjdGxdID0gNDQwLjA7CisgICAgfSBlbHNlIGlmIChMQURTUEFfSVNfSElOVF9ERUZBVUxUX0xPVyhoLT5IaW50RGVzY3JpcHRvcikpIHsKKyAgICAgICAgaWYgKExBRFNQQV9JU19ISU5UX0xPR0FSSVRITUlDKGgtPkhpbnREZXNjcmlwdG9yKSkKKyAgICAgICAgICAgIHZhbHVlc1tjdGxdID0gZXhwKGxvZyhsb3dlcikgKiAwLjc1ICsgbG9nKHVwcGVyKSAqIDAuMjUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWx1ZXNbY3RsXSA9IGxvd2VyICogMC43NSArIHVwcGVyICogMC4yNTsKKyAgICB9IGVsc2UgaWYgKExBRFNQQV9JU19ISU5UX0RFRkFVTFRfTUlERExFKGgtPkhpbnREZXNjcmlwdG9yKSkgeworICAgICAgICBpZiAoTEFEU1BBX0lTX0hJTlRfTE9HQVJJVEhNSUMoaC0+SGludERlc2NyaXB0b3IpKQorICAgICAgICAgICAgdmFsdWVzW2N0bF0gPSBleHAobG9nKGxvd2VyKSAqIDAuNSArIGxvZyh1cHBlcikgKiAwLjUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWx1ZXNbY3RsXSA9IGxvd2VyICogMC41ICsgdXBwZXIgKiAwLjU7CisgICAgfSBlbHNlIGlmIChMQURTUEFfSVNfSElOVF9ERUZBVUxUX0hJR0goaC0+SGludERlc2NyaXB0b3IpKSB7CisgICAgICAgIGlmIChMQURTUEFfSVNfSElOVF9MT0dBUklUSE1JQyhoLT5IaW50RGVzY3JpcHRvcikpCisgICAgICAgICAgICB2YWx1ZXNbY3RsXSA9IGV4cChsb2cobG93ZXIpICogMC4yNSArIGxvZyh1cHBlcikgKiAwLjc1KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWVzW2N0bF0gPSBsb3dlciAqIDAuMjUgKyB1cHBlciAqIDAuNzU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbm5lY3RfcG9ydHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBMQURTUEFDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpLCBqOworCisgICAgcy0+bmJfaGFuZGxlcyA9IHMtPm5iX2lucHV0cyA9PSAxICYmIHMtPm5iX291dHB1dHMgPT0gMSA/IGxpbmstPmNoYW5uZWxzIDogMTsKKyAgICBzLT5oYW5kbGVzICAgID0gYXZfY2FsbG9jKHMtPm5iX2hhbmRsZXMsIHNpemVvZigqcy0+aGFuZGxlcykpOworICAgIGlmICghcy0+aGFuZGxlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9oYW5kbGVzOyBpKyspIHsKKyAgICAgICAgcy0+aGFuZGxlc1tpXSA9IHMtPmRlc2MtPmluc3RhbnRpYXRlKHMtPmRlc2MsIGxpbmstPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgaWYgKCFzLT5oYW5kbGVzW2ldKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgaW5zdGFudGlhdGUgcGx1Z2luLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbm5lY3QgdGhlIGlucHV0IGNvbnRyb2wgcG9ydHMKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPm5iX2lucHV0Y29udHJvbHM7IGorKykKKyAgICAgICAgICAgIHMtPmRlc2MtPmNvbm5lY3RfcG9ydChzLT5oYW5kbGVzW2ldLCBzLT5pY21hcFtqXSwgcy0+aWN0bHYgKyBqKTsKKworICAgICAgICAvLyBDb25uZWN0IHRoZSBvdXRwdXQgY29udHJvbCBwb3J0cworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+bmJfb3V0cHV0Y29udHJvbHM7IGorKykKKyAgICAgICAgICAgIHMtPmRlc2MtPmNvbm5lY3RfcG9ydChzLT5oYW5kbGVzW2ldLCBzLT5vY21hcFtqXSwgJnMtPm9jdGx2W2pdKTsKKworICAgICAgICBpZiAocy0+ZGVzYy0+YWN0aXZhdGUpCisgICAgICAgICAgICBzLT5kZXNjLT5hY3RpdmF0ZShzLT5oYW5kbGVzW2ldKTsKKyAgICB9CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJoYW5kbGVzOiAlZFxuIiwgcy0+bmJfaGFuZGxlcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKworICAgIHJldHVybiBjb25uZWN0X3BvcnRzKGN0eCwgaW5saW5rKTsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGN0eC0+bmJfaW5wdXRzKSB7CisgICAgICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisKKyAgICAgICAgb3V0bGluay0+Zm9ybWF0ICAgICAgPSBpbmxpbmstPmZvcm1hdDsKKyAgICAgICAgb3V0bGluay0+c2FtcGxlX3JhdGUgPSBpbmxpbmstPnNhbXBsZV9yYXRlOworCisgICAgICAgIHJldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTEFEU1BBQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgICAgICBvdXRsaW5rLT5zYW1wbGVfcmF0ZSA9IHMtPnNhbXBsZV9yYXRlOworICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UgICA9IChBVlJhdGlvbmFsKXsxLCBzLT5zYW1wbGVfcmF0ZX07CisKKyAgICAgICAgcmV0ID0gY29ubmVjdF9wb3J0cyhjdHgsIG91dGxpbmspOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvdW50X3BvcnRzKGNvbnN0IExBRFNQQV9EZXNjcmlwdG9yICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqbmJfaW5wdXRzLCB1bnNpZ25lZCBsb25nICpuYl9vdXRwdXRzKQoreworICAgIExBRFNQQV9Qb3J0RGVzY3JpcHRvciBwZDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5Qb3J0Q291bnQ7IGkrKykgeworICAgICAgICBwZCA9IGRlc2MtPlBvcnREZXNjcmlwdG9yc1tpXTsKKworICAgICAgICBpZiAoTEFEU1BBX0lTX1BPUlRfQVVESU8ocGQpKSB7CisgICAgICAgICAgICBpZiAoTEFEU1BBX0lTX1BPUlRfSU5QVVQocGQpKSB7CisgICAgICAgICAgICAgICAgKCpuYl9pbnB1dHMpKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKExBRFNQQV9JU19QT1JUX09VVFBVVChwZCkpIHsKKyAgICAgICAgICAgICAgICAoKm5iX291dHB1dHMpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkICp0cnlfbG9hZChjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKnNvbmFtZSkKK3sKKyAgICBjaGFyICpwYXRoID0gYXZfYXNwcmludGYoIiVzLyVzLnNvIiwgZGlyLCBzb25hbWUpOworICAgIHZvaWQgKnJldCA9IE5VTEw7CisKKyAgICBpZiAocGF0aCkgeworICAgICAgICByZXQgPSBkbG9wZW4ocGF0aCwgUlRMRF9MT0NBTHxSVExEX05PVyk7CisgICAgICAgIGF2X2ZyZWUocGF0aCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZXRfY29udHJvbChBVkZpbHRlckNvbnRleHQgKmN0eCwgdW5zaWduZWQgbG9uZyBwb3J0LCBMQURTUEFfRGF0YSB2YWx1ZSkKK3sKKyAgICBMQURTUEFDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IGNoYXIgKmxhYmVsID0gcy0+ZGVzYy0+TGFiZWw7CisgICAgTEFEU1BBX1BvcnRSYW5nZUhpbnQgKmggPSAoTEFEU1BBX1BvcnRSYW5nZUhpbnQgKilzLT5kZXNjLT5Qb3J0UmFuZ2VIaW50cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pY21hcFtwb3J0XTsKKworICAgIGlmIChwb3J0ID49IHMtPm5iX2lucHV0Y29udHJvbHMpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ29udHJvbCBjJWxkIGlzIG91dCBvZiByYW5nZSBbMCAtICVsdV0uXG4iLAorICAgICAgICAgICAgICAgcG9ydCwgcy0+bmJfaW5wdXRjb250cm9scyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKExBRFNQQV9JU19ISU5UX0JPVU5ERURfQkVMT1coaC0+SGludERlc2NyaXB0b3IpICYmCisgICAgICAgICAgICB2YWx1ZSA8IGgtPkxvd2VyQm91bmQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogaW5wdXQgY29udHJvbCBjJWxkIGlzIGJlbG93IGxvd2VyIGJvdW5kYXJ5IG9mICUwLjRmLlxuIiwKKyAgICAgICAgICAgICAgICBsYWJlbCwgcG9ydCwgaC0+TG93ZXJCb3VuZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKExBRFNQQV9JU19ISU5UX0JPVU5ERURfQUJPVkUoaC0+SGludERlc2NyaXB0b3IpICYmCisgICAgICAgICAgICB2YWx1ZSA+IGgtPlVwcGVyQm91bmQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogaW5wdXQgY29udHJvbCBjJWxkIGlzIGFib3ZlIHVwcGVyIGJvdW5kYXJ5IG9mICUwLjRmLlxuIiwKKyAgICAgICAgICAgICAgICBsYWJlbCwgcG9ydCwgaC0+VXBwZXJCb3VuZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcy0+aWN0bHZbcG9ydF0gPSB2YWx1ZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBMQURTUEFDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIExBRFNQQV9EZXNjcmlwdG9yX0Z1bmN0aW9uIGRlc2NyaXB0b3JfZm47CisgICAgY29uc3QgTEFEU1BBX0Rlc2NyaXB0b3IgKmRlc2M7CisgICAgTEFEU1BBX1BvcnREZXNjcmlwdG9yIHBkOworICAgIEFWRmlsdGVyUGFkIHBhZCA9IHsgTlVMTCB9OworICAgIGNoYXIgKnAsICphcmcsICpzYXZlcHRyID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIG5iX3BvcnRzOworICAgIGludCBpOworCisgICAgaWYgKCFzLT5kbF9uYW1lKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIHBsdWdpbiBuYW1lIHByb3ZpZGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAocy0+ZGxfbmFtZVswXSA9PSAnLycgfHwgcy0+ZGxfbmFtZVswXSA9PSAnLicpIHsKKyAgICAgICAgLy8gYXJndW1lbnQgaXMgYSBwYXRoCisgICAgICAgIHMtPmRsX2hhbmRsZSA9IGRsb3BlbihzLT5kbF9uYW1lLCBSVExEX0xPQ0FMfFJUTERfTk9XKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBhcmd1bWVudCBpcyBhIHNoYXJlZCBvYmplY3QgbmFtZQorICAgICAgICBjaGFyICpwYXRocyA9IGF2X3N0cmR1cChnZXRlbnYoIkxBRFNQQV9QQVRIIikpOworICAgICAgICBjb25zdCBjaGFyICpzZXBhcmF0b3IgPSAiOiI7CisKKyAgICAgICAgaWYgKHBhdGhzKSB7CisgICAgICAgICAgICBwID0gcGF0aHM7CisgICAgICAgICAgICB3aGlsZSAoKGFyZyA9IGF2X3N0cnRvayhwLCBzZXBhcmF0b3IsICZzYXZlcHRyKSkgJiYgIXMtPmRsX2hhbmRsZSkgeworICAgICAgICAgICAgICAgIHMtPmRsX2hhbmRsZSA9IHRyeV9sb2FkKGFyZywgcy0+ZGxfbmFtZSk7CisgICAgICAgICAgICAgICAgcCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmVlKHBhdGhzKTsKKyAgICAgICAgaWYgKCFzLT5kbF9oYW5kbGUgJiYgKHBhdGhzID0gYXZfYXNwcmludGYoIiVzLy5sYWRzcGEvbGliIiwgZ2V0ZW52KCJIT01FIikpKSkgeworICAgICAgICAgICAgcy0+ZGxfaGFuZGxlID0gdHJ5X2xvYWQocGF0aHMsIHMtPmRsX25hbWUpOworICAgICAgICAgICAgYXZfZnJlZShwYXRocyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXMtPmRsX2hhbmRsZSkKKyAgICAgICAgICAgIHMtPmRsX2hhbmRsZSA9IHRyeV9sb2FkKCIvdXNyL2xvY2FsL2xpYi9sYWRzcGEiLCBzLT5kbF9uYW1lKTsKKworICAgICAgICBpZiAoIXMtPmRsX2hhbmRsZSkKKyAgICAgICAgICAgIHMtPmRsX2hhbmRsZSA9IHRyeV9sb2FkKCIvdXNyL2xpYi9sYWRzcGEiLCBzLT5kbF9uYW1lKTsKKyAgICB9CisgICAgaWYgKCFzLT5kbF9oYW5kbGUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGxvYWQgJyVzJ1xuIiwgcy0+ZGxfbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZGVzY3JpcHRvcl9mbiA9IGRsc3ltKHMtPmRsX2hhbmRsZSwgImxhZHNwYV9kZXNjcmlwdG9yIik7CisgICAgaWYgKCFkZXNjcmlwdG9yX2ZuKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBmaW5kIGxhZHNwYV9kZXNjcmlwdG9yOiAlc1xuIiwgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvLyBGaW5kIHRoZSByZXF1ZXN0ZWQgcGx1Z2luLCBvciBsaXN0IHBsdWdpbnMKKyAgICBpZiAoIXMtPnBsdWdpbikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlRoZSAnJXMnIGxpYnJhcnkgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwbHVnaW5zOlxuIiwgcy0+ZGxfbmFtZSk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiSSA9IElucHV0IENoYW5uZWxzXG4iKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJPID0gT3V0cHV0IENoYW5uZWxzXG4iKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJJOk8gJS0yNXMgJXNcbiIsICJQbHVnaW4iLCAiRGVzY3JpcHRpb24iKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJcbiIpOworICAgICAgICBmb3IgKGkgPSAwOyBkZXNjID0gZGVzY3JpcHRvcl9mbihpKTsgaSsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGlucHV0cyA9IDAsIG91dHB1dHMgPSAwOworCisgICAgICAgICAgICBjb3VudF9wb3J0cyhkZXNjLCAmaW5wdXRzLCAmb3V0cHV0cyk7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiVsdTolbHUgJS0yNXMgJXNcbiIsIGlucHV0cywgb3V0cHV0cywgZGVzYy0+TGFiZWwsCisgICAgICAgICAgICAgICAgICAgKGNoYXIgKilhdl94X2lmX251bGwoZGVzYy0+TmFtZSwgIj8iKSk7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIk1ha2VyOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAoY2hhciAqKWF2X3hfaWZfbnVsbChkZXNjLT5NYWtlciwgIj8iKSk7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNvcHlyaWdodDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgKGNoYXIgKilhdl94X2lmX251bGwoZGVzYy0+Q29weXJpZ2h0LCAiPyIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7OyBpKyspIHsKKyAgICAgICAgICAgIGRlc2MgPSBkZXNjcmlwdG9yX2ZuKGkpOworICAgICAgICAgICAgaWYgKCFkZXNjKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGZpbmQgcGx1Z2luOiAlc1xuIiwgcy0+cGx1Z2luKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVzYy0+TGFiZWwgJiYgIXN0cmNtcChkZXNjLT5MYWJlbCwgcy0+cGx1Z2luKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmRlc2MgID0gZGVzYzsKKyAgICBuYl9wb3J0cyA9IGRlc2MtPlBvcnRDb3VudDsKKworICAgIHMtPmlwbWFwID0gYXZfY2FsbG9jKG5iX3BvcnRzLCBzaXplb2YoKnMtPmlwbWFwKSk7CisgICAgcy0+b3BtYXAgPSBhdl9jYWxsb2MobmJfcG9ydHMsIHNpemVvZigqcy0+b3BtYXApKTsKKyAgICBzLT5pY21hcCA9IGF2X2NhbGxvYyhuYl9wb3J0cywgc2l6ZW9mKCpzLT5pY21hcCkpOworICAgIHMtPm9jbWFwID0gYXZfY2FsbG9jKG5iX3BvcnRzLCBzaXplb2YoKnMtPm9jbWFwKSk7CisgICAgcy0+aWN0bHYgPSBhdl9jYWxsb2MobmJfcG9ydHMsIHNpemVvZigqcy0+aWN0bHYpKTsKKyAgICBzLT5vY3RsdiA9IGF2X2NhbGxvYyhuYl9wb3J0cywgc2l6ZW9mKCpzLT5vY3RsdikpOworICAgIHMtPmN0bF9uZWVkc192YWx1ZSA9IGF2X2NhbGxvYyhuYl9wb3J0cywgc2l6ZW9mKCpzLT5jdGxfbmVlZHNfdmFsdWUpKTsKKyAgICBpZiAoIXMtPmlwbWFwIHx8ICFzLT5vcG1hcCB8fCAhcy0+aWNtYXAgfHwKKyAgICAgICAgIXMtPm9jbWFwIHx8ICFzLT5pY3RsdiB8fCAhcy0+b2N0bHYgfHwgIXMtPmN0bF9uZWVkc192YWx1ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9wb3J0czsgaSsrKSB7CisgICAgICAgIHBkID0gZGVzYy0+UG9ydERlc2NyaXB0b3JzW2ldOworCisgICAgICAgIGlmIChMQURTUEFfSVNfUE9SVF9BVURJTyhwZCkpIHsKKyAgICAgICAgICAgIGlmIChMQURTUEFfSVNfUE9SVF9JTlBVVChwZCkpIHsKKyAgICAgICAgICAgICAgICBzLT5pcG1hcFtzLT5uYl9pbnB1dHNdID0gaTsKKyAgICAgICAgICAgICAgICBzLT5uYl9pbnB1dHMrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoTEFEU1BBX0lTX1BPUlRfT1VUUFVUKHBkKSkgeworICAgICAgICAgICAgICAgIHMtPm9wbWFwW3MtPm5iX291dHB1dHNdID0gaTsKKyAgICAgICAgICAgICAgICBzLT5uYl9vdXRwdXRzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoTEFEU1BBX0lTX1BPUlRfQ09OVFJPTChwZCkpIHsKKyAgICAgICAgICAgIGlmIChMQURTUEFfSVNfUE9SVF9JTlBVVChwZCkpIHsKKyAgICAgICAgICAgICAgICBzLT5pY21hcFtzLT5uYl9pbnB1dGNvbnRyb2xzXSA9IGk7CisKKyAgICAgICAgICAgICAgICBpZiAoTEFEU1BBX0lTX0hJTlRfSEFTX0RFRkFVTFQoZGVzYy0+UG9ydFJhbmdlSGludHNbaV0uSGludERlc2NyaXB0b3IpKQorICAgICAgICAgICAgICAgICAgICBzZXRfZGVmYXVsdF9jdGxfdmFsdWUocywgcy0+bmJfaW5wdXRjb250cm9scywgcy0+aWNtYXAsIHMtPmljdGx2KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHMtPmN0bF9uZWVkc192YWx1ZVtzLT5uYl9pbnB1dGNvbnRyb2xzXSA9IDE7CisKKyAgICAgICAgICAgICAgICBzLT5uYl9pbnB1dGNvbnRyb2xzKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKExBRFNQQV9JU19QT1JUX09VVFBVVChwZCkpIHsKKyAgICAgICAgICAgICAgICBzLT5vY21hcFtzLT5uYl9vdXRwdXRjb250cm9sc10gPSBpOworICAgICAgICAgICAgICAgIHMtPm5iX291dHB1dGNvbnRyb2xzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBMaXN0IENvbnRyb2wgUG9ydHMgaWYgImhlbHAiIGlzIHNwZWNpZmllZAorICAgIGlmIChzLT5vcHRpb25zICYmICFzdHJjbXAocy0+b3B0aW9ucywgImhlbHAiKSkgeworICAgICAgICBpZiAoIXMtPm5iX2lucHV0Y29udHJvbHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJUaGUgJyVzJyBwbHVnaW4gZG9lcyBub3QgaGF2ZSBhbnkgaW5wdXQgY29udHJvbHMuXG4iLAorICAgICAgICAgICAgICAgICAgIGRlc2MtPkxhYmVsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJUaGUgJyVzJyBwbHVnaW4gaGFzIHRoZSBmb2xsb3dpbmcgaW5wdXQgY29udHJvbHM6XG4iLAorICAgICAgICAgICAgICAgICAgIGRlc2MtPkxhYmVsKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9pbnB1dGNvbnRyb2xzOyBpKyspCisgICAgICAgICAgICAgICAgcHJpbnRfY3RsX2luZm8oY3R4LCBBVl9MT0dfSU5GTywgcywgaSwgcy0+aWNtYXAsIHMtPmljdGx2LCAwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgIH0KKworICAgIC8vIFBhcnNlIGNvbnRyb2wgcGFyYW1ldGVycworICAgIHAgPSBzLT5vcHRpb25zOworICAgIHdoaWxlIChzLT5vcHRpb25zKSB7CisgICAgICAgIExBRFNQQV9EYXRhIHZhbDsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAoIShhcmcgPSBhdl9zdHJ0b2socCwgInwiLCAmc2F2ZXB0cikpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHAgPSBOVUxMOworCisgICAgICAgIGlmIChzc2NhbmYoYXJnLCAiYyVkPSVmIiwgJmksICZ2YWwpICE9IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc3ludGF4LlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBzZXRfY29udHJvbChjdHgsIGksIHZhbCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHMtPmN0bF9uZWVkc192YWx1ZVtpXSA9IDA7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgYW55IGNvbnRyb2xzIGFyZSBub3Qgc2V0CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2lucHV0Y29udHJvbHM7IGkrKykgeworICAgICAgICBpZiAocy0+Y3RsX25lZWRzX3ZhbHVlW2ldKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb250cm9sIGMlZCBtdXN0IGJlIHNldC5cbiIsIGkpOworICAgICAgICAgICAgcHJpbnRfY3RsX2luZm8oY3R4LCBBVl9MT0dfRVJST1IsIHMsIGksIHMtPmljbWFwLCBzLT5pY3RsdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgcGFkLnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisKKyAgICBpZiAocy0+bmJfaW5wdXRzKSB7CisgICAgICAgIHBhZC5uYW1lID0gYXZfYXNwcmludGYoImluMDolcyVsdSIsIGRlc2MtPkxhYmVsLCBzLT5uYl9pbnB1dHMpOworICAgICAgICBpZiAoIXBhZC5uYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBwYWQuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lOworICAgICAgICBwYWQuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0OworICAgICAgICBpZiAoZmZfaW5zZXJ0X2lucGFkKGN0eCwgY3R4LT5uYl9pbnB1dHMsICZwYWQpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnBhZC5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJwb3J0czogJWx1XG4iLCBuYl9wb3J0cyk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiaW5wdXRzOiAlbHUgb3V0cHV0czogJWx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmJfaW5wdXRzLCBzLT5uYl9vdXRwdXRzKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJpbnB1dCBjb250cm9sczogJWx1IG91dHB1dCBjb250cm9sczogJWx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmJfaW5wdXRjb250cm9scywgcy0+bmJfb3V0cHV0Y29udHJvbHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBMQURTUEFDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0czsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzOworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRzW10gPSB7CisgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxUUCwgQVZfU0FNUExFX0ZNVF9OT05FIH07CisKKyAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10cyk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworCisgICAgaWYgKHMtPm5iX2lucHV0cykgeworICAgICAgICBmb3JtYXRzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzYW1wbGVfcmF0ZXNbXSA9IHsgcy0+c2FtcGxlX3JhdGUsIC0xIH07CisKKyAgICAgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX3JhdGVzKSk7CisgICAgfQorCisgICAgaWYgKHMtPm5iX2lucHV0cyA9PSAxICYmIHMtPm5iX291dHB1dHMgPT0gMSkgeworICAgICAgICAvLyBXZSB3aWxsIGluc3RhbnRpYXRlIG11bHRpcGxlIExBRFNQQV9IYW5kbGUsIG9uZSBvdmVyIGVhY2ggY2hhbm5lbAorICAgICAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfbGF5b3V0cygpOworICAgICAgICBpZiAoIWxheW91dHMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgbGF5b3V0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworCisgICAgICAgIGlmIChzLT5uYl9pbnB1dHMgPj0gMSkgeworICAgICAgICAgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICAgICAgICAgIGludDY0X3QgaW5sYXlvdXQgPSBGRl9DT1VOVDJMQVlPVVQocy0+bmJfaW5wdXRzKTsKKworICAgICAgICAgICAgbGF5b3V0cyA9IE5VTEw7CisgICAgICAgICAgICBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoJmxheW91dHMsIGlubGF5b3V0KTsKKyAgICAgICAgICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJmlubGluay0+b3V0X2NoYW5uZWxfbGF5b3V0cyk7CisKKyAgICAgICAgICAgIGlmICghcy0+bmJfb3V0cHV0cykKKyAgICAgICAgICAgICAgICBmZl9jaGFubmVsX2xheW91dHNfcmVmKGxheW91dHMsICZvdXRsaW5rLT5pbl9jaGFubmVsX2xheW91dHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPm5iX291dHB1dHMgPj0gMSkgeworICAgICAgICAgICAgaW50NjRfdCBvdXRsYXlvdXQgPSBGRl9DT1VOVDJMQVlPVVQocy0+bmJfb3V0cHV0cyk7CisKKyAgICAgICAgICAgIGxheW91dHMgPSBOVUxMOworICAgICAgICAgICAgZmZfYWRkX2NoYW5uZWxfbGF5b3V0KCZsYXlvdXRzLCBvdXRsYXlvdXQpOworICAgICAgICAgICAgZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihsYXlvdXRzLCAmb3V0bGluay0+aW5fY2hhbm5lbF9sYXlvdXRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBMQURTUEFDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2hhbmRsZXM7IGkrKykgeworICAgICAgICBpZiAocy0+ZGVzYy0+ZGVhY3RpdmF0ZSkKKyAgICAgICAgICAgIHMtPmRlc2MtPmRlYWN0aXZhdGUocy0+aGFuZGxlc1tpXSk7CisgICAgICAgIGlmIChzLT5kZXNjLT5jbGVhbnVwKQorICAgICAgICAgICAgcy0+ZGVzYy0+Y2xlYW51cChzLT5oYW5kbGVzW2ldKTsKKyAgICB9CisKKyAgICBpZiAocy0+ZGxfaGFuZGxlKQorICAgICAgICBkbGNsb3NlKHMtPmRsX2hhbmRsZSk7CisKKyAgICBhdl9mcmVlcCgmcy0+aXBtYXApOworICAgIGF2X2ZyZWVwKCZzLT5vcG1hcCk7CisgICAgYXZfZnJlZXAoJnMtPmljbWFwKTsKKyAgICBhdl9mcmVlcCgmcy0+b2NtYXApOworICAgIGF2X2ZyZWVwKCZzLT5pY3Rsdik7CisgICAgYXZfZnJlZXAoJnMtPm9jdGx2KTsKKyAgICBhdl9mcmVlcCgmcy0+aGFuZGxlcyk7CisgICAgYXZfZnJlZXAoJnMtPmN0bF9uZWVkc192YWx1ZSk7CisKKyAgICBpZiAoY3R4LT5uYl9pbnB1dHMpCisgICAgICAgIGF2X2ZyZWVwKCZjdHgtPmlucHV0X3BhZHNbMF0ubmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19jb21tYW5kKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZXMsIGludCByZXNfbGVuLCBpbnQgZmxhZ3MpCit7CisgICAgTEFEU1BBX0RhdGEgdmFsdWU7CisgICAgdW5zaWduZWQgbG9uZyBwb3J0OworCisgICAgaWYgKHNzY2FuZihjbWQsICJjJWxkIiwgJnBvcnQpICsgc3NjYW5mKGFyZ3MsICIlZiIsICZ2YWx1ZSkgIT0gMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHJldHVybiBzZXRfY29udHJvbChjdHgsIHBvcnQsIHZhbHVlKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGxhZHNwYV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2xhZHNwYSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJsYWRzcGEiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IExBRFNQQSBlZmZlY3QuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTEFEU1BBQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmbGFkc3BhX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByb2Nlc3NfY29tbWFuZCA9IHByb2Nlc3NfY29tbWFuZCwKKyAgICAuaW5wdXRzICAgICAgICA9IDAsCisgICAgLm91dHB1dHMgICAgICAgPSBsYWRzcGFfb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19JTlBVVFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX3Bhbi5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX3Bhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTc3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfcGFuLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgQW5kZXJzIEpvaGFuc3NvbiA8YWpoQGF0cmkuY3VydGluLmVkdS5hdT4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBDbMOpbWVudCBCxZNzY2ggPHUgcGtoIG1lPgorICogQ29weXJpZ2h0IChjKSAyMDExIE5pY29sYXMgR2VvcmdlIDxuaWNvbGFzLmdlb3JnZUBub3JtYWxlc3VwLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQXVkaW8gcGFubmluZyBmaWx0ZXIgKGNoYW5uZWxzIG1peGluZykKKyAqIE9yaWdpbmFsIGNvZGUgd3JpdHRlbiBieSBBbmRlcnMgSm9oYW5zc29uIGZvciBNUGxheWVyLAorICogcmVpbXBsZW1lbnRlZCBmb3IgRkZtcGVnLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTUFYX0NIQU5ORUxTIDYzCisKK3R5cGVkZWYgc3RydWN0IFBhbkNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGNoYXIgKmFyZ3M7CisgICAgaW50NjRfdCBvdXRfY2hhbm5lbF9sYXlvdXQ7CisgICAgZG91YmxlIGdhaW5bTUFYX0NIQU5ORUxTXVtNQVhfQ0hBTk5FTFNdOworICAgIGludDY0X3QgbmVlZF9yZW5vcm07CisgICAgaW50IG5lZWRfcmVudW1iZXI7CisgICAgaW50IG5iX291dHB1dF9jaGFubmVsczsKKworICAgIGludCBwdXJlX2dhaW5zOworICAgIC8qIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpYyAqLworICAgIGludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTFNdOworICAgIHN0cnVjdCBTd3JDb250ZXh0ICpzd3I7Cit9IFBhbkNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIHNraXBfc3BhY2VzKGNoYXIgKiphcmcpCit7CisgICAgaW50IGxlbiA9IDA7CisKKyAgICBzc2NhbmYoKmFyZywgIiAlbiIsICZsZW4pOworICAgICphcmcgKz0gbGVuOworfQorCitzdGF0aWMgaW50IHBhcnNlX2NoYW5uZWxfbmFtZShjaGFyICoqYXJnLCBpbnQgKnJjaGFubmVsLCBpbnQgKnJuYW1lZCkKK3sKKyAgICBjaGFyIGJ1Zls4XTsKKyAgICBpbnQgbGVuLCBpLCBjaGFubmVsX2lkID0gMDsKKyAgICBpbnQ2NF90IGxheW91dCwgbGF5b3V0MDsKKworICAgIHNraXBfc3BhY2VzKGFyZyk7CisgICAgLyogdHJ5IHRvIHBhcnNlIGEgY2hhbm5lbCBuYW1lLCBlLmcuICJGTCIgKi8KKyAgICBpZiAoc3NjYW5mKCphcmcsICIlN1tBLVpdJW4iLCBidWYsICZsZW4pKSB7CisgICAgICAgIGxheW91dDAgPSBsYXlvdXQgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXQoYnVmKTsKKyAgICAgICAgLyogY2hhbm5lbF9pZCA8LSBmaXJzdCBzZXQgYml0IGluIGxheW91dCAqLworICAgICAgICBmb3IgKGkgPSAzMjsgaSA+IDA7IGkgPj49IDEpIHsKKyAgICAgICAgICAgIGlmIChsYXlvdXQgPj0gKGludDY0X3QpMSA8PCBpKSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbF9pZCArPSBpOworICAgICAgICAgICAgICAgIGxheW91dCA+Pj0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiByZWplY3QgbGF5b3V0cyB0aGF0IGFyZSBub3QgYSBzaW5nbGUgY2hhbm5lbCAqLworICAgICAgICBpZiAoY2hhbm5lbF9pZCA+PSBNQVhfQ0hBTk5FTFMgfHwgbGF5b3V0MCAhPSAoaW50NjRfdCkxIDw8IGNoYW5uZWxfaWQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAqcmNoYW5uZWwgPSBjaGFubmVsX2lkOworICAgICAgICAqcm5hbWVkID0gMTsKKyAgICAgICAgKmFyZyArPSBsZW47CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiB0cnkgdG8gcGFyc2UgYSBjaGFubmVsIG51bWJlciwgZS5nLiAiYzIiICovCisgICAgaWYgKHNzY2FuZigqYXJnLCAiYyVkJW4iLCAmY2hhbm5lbF9pZCwgJmxlbikgJiYKKyAgICAgICAgY2hhbm5lbF9pZCA+PSAwICYmIGNoYW5uZWxfaWQgPCBNQVhfQ0hBTk5FTFMpIHsKKyAgICAgICAgKnJjaGFubmVsID0gY2hhbm5lbF9pZDsKKyAgICAgICAgKnJuYW1lZCA9IDA7CisgICAgICAgICphcmcgKz0gbGVuOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUGFuQ29udGV4dCAqY29uc3QgcGFuID0gY3R4LT5wcml2OworICAgIGNoYXIgKmFyZywgKmFyZzAsICp0b2tlbml6ZXIsICphcmdzID0gYXZfc3RyZHVwKHBhbi0+YXJncyk7CisgICAgaW50IG91dF9jaF9pZCwgaW5fY2hfaWQsIGxlbiwgbmFtZWQsIHJldDsKKyAgICBpbnQgbmJfaW5fY2hhbm5lbHNbMl0gPSB7IDAsIDAgfTsgLy8gbnVtYmVyIG9mIHVubmFtZWQgYW5kIG5hbWVkIGlucHV0IGNoYW5uZWxzCisgICAgZG91YmxlIGdhaW47CisKKyAgICBpZiAoIXBhbi0+YXJncykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAicGFuIGZpbHRlciBuZWVkcyBhIGNoYW5uZWwgbGF5b3V0IGFuZCBhIHNldCAiCisgICAgICAgICAgICAgICAib2YgY2hhbm5lbHMgZGVmaW5pdGlvbnMgYXMgcGFyYW1ldGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKCFhcmdzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGFyZyA9IGF2X3N0cnRvayhhcmdzLCAifCIsICZ0b2tlbml6ZXIpOworICAgIHJldCA9IGZmX3BhcnNlX2NoYW5uZWxfbGF5b3V0KCZwYW4tPm91dF9jaGFubmVsX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFuLT5uYl9vdXRwdXRfY2hhbm5lbHMsIGFyZywgY3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgLyogcGFyc2UgY2hhbm5lbCBzcGVjaWZpY2F0aW9ucyAqLworICAgIHdoaWxlICgoYXJnID0gYXJnMCA9IGF2X3N0cnRvayhOVUxMLCAifCIsICZ0b2tlbml6ZXIpKSkgeworICAgICAgICAvKiBjaGFubmVsIG5hbWUgKi8KKyAgICAgICAgaWYgKHBhcnNlX2NoYW5uZWxfbmFtZSgmYXJnLCAmb3V0X2NoX2lkLCAmbmFtZWQpKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG91dCBjaGFubmVsIG5hbWUsIGdvdCBcIiUuOHNcIlxuIiwgYXJnKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZWQpIHsKKyAgICAgICAgICAgIGlmICghKChwYW4tPm91dF9jaGFubmVsX2xheW91dCA+PiBvdXRfY2hfaWQpICYgMSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJDaGFubmVsIFwiJS44c1wiIGRvZXMgbm90IGV4aXN0IGluIHRoZSBjaG9zZW4gbGF5b3V0XG4iLCBhcmcwKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZ2V0IHRoZSBjaGFubmVsIG51bWJlciBpbiB0aGUgb3V0cHV0IGNoYW5uZWwgbGF5b3V0OgorICAgICAgICAgICAgICogb3V0X2NoYW5uZWxfbGF5b3V0ICYgKCgxIDw8IG91dF9jaF9pZCkgLSAxKSBhcmUgYWxsIHRoZQorICAgICAgICAgICAgICogY2hhbm5lbHMgdGhhdCBjb21lIGJlZm9yZSBvdXRfY2hfaWQsCisgICAgICAgICAgICAgKiBzbyB0aGVpciBjb3VudCBpcyB0aGUgaW5kZXggb2Ygb3V0X2NoX2lkICovCisgICAgICAgICAgICBvdXRfY2hfaWQgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocGFuLT5vdXRfY2hhbm5lbF9sYXlvdXQgJiAoKChpbnQ2NF90KTEgPDwgb3V0X2NoX2lkKSAtIDEpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0X2NoX2lkIDwgMCB8fCBvdXRfY2hfaWQgPj0gcGFuLT5uYl9vdXRwdXRfY2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXQgY2hhbm5lbCBuYW1lIFwiJS44c1wiXG4iLCBhcmcwKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBza2lwX3NwYWNlcygmYXJnKTsKKyAgICAgICAgaWYgKCphcmcgPT0gJz0nKSB7CisgICAgICAgICAgICBhcmcrKzsKKyAgICAgICAgfSBlbHNlIGlmICgqYXJnID09ICc8JykgeworICAgICAgICAgICAgcGFuLT5uZWVkX3Jlbm9ybSB8PSAoaW50NjRfdCkxIDw8IG91dF9jaF9pZDsKKyAgICAgICAgICAgIGFyZysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJTeW50YXggZXJyb3IgYWZ0ZXIgY2hhbm5lbCBuYW1lIGluIFwiJS44c1wiXG4iLCBhcmcwKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICAvKiBnYWlucyAqLworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgZ2FpbiA9IDE7CisgICAgICAgICAgICBpZiAoc3NjYW5mKGFyZywgIiVsZiVuIColbiIsICZnYWluLCAmbGVuLCAmbGVuKSkKKyAgICAgICAgICAgICAgICBhcmcgKz0gbGVuOworICAgICAgICAgICAgaWYgKHBhcnNlX2NoYW5uZWxfbmFtZSgmYXJnLCAmaW5fY2hfaWQsICZuYW1lZCkpeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGluIGNoYW5uZWwgbmFtZSwgZ290IFwiJS44c1wiXG4iLCBhcmcpOworICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5iX2luX2NoYW5uZWxzW25hbWVkXSsrOworICAgICAgICAgICAgaWYgKG5iX2luX2NoYW5uZWxzWyFuYW1lZF0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJDYW4gbm90IG1peCBuYW1lZCBhbmQgbnVtYmVyZWQgY2hhbm5lbHNcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYW4tPmdhaW5bb3V0X2NoX2lkXVtpbl9jaF9pZF0gPSBnYWluOworICAgICAgICAgICAgc2tpcF9zcGFjZXMoJmFyZyk7CisgICAgICAgICAgICBpZiAoISphcmcpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoKmFyZyAhPSAnKycpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJTeW50YXggZXJyb3IgbmVhciBcIiUuOHNcIlxuIiwgYXJnKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcGFuLT5uZWVkX3JlbnVtYmVyID0gISFuYl9pbl9jaGFubmVsc1sxXTsKKworICAgIHJldCA9IDA7CitmYWlsOgorICAgIGF2X2ZyZWUoYXJncyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhcmVfZ2FpbnNfcHVyZShjb25zdCBQYW5Db250ZXh0ICpwYW4pCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxTOyBpKyspIHsKKyAgICAgICAgaW50IG5iX2dhaW4gPSAwOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfQ0hBTk5FTFM7IGorKykgeworICAgICAgICAgICAgZG91YmxlIGdhaW4gPSBwYW4tPmdhaW5baV1bal07CisKKyAgICAgICAgICAgIC8qIGNoYW5uZWwgbWFwcGluZyBpcyBlZmZlY3RpdmUgb25seSBpZiAwJSBvciAxMDAlIG9mIGEgY2hhbm5lbCBpcworICAgICAgICAgICAgICogc2VsZWN0ZWQuLi4gKi8KKyAgICAgICAgICAgIGlmIChnYWluICE9IDAuICYmIGdhaW4gIT0gMS4pCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAvKiAuLi5hbmQgaWYgdGhlIG91dHB1dCBjaGFubmVsIGlzIG9ubHkgY29tcG9zZWQgb2Ygb25lIGlucHV0ICovCisgICAgICAgICAgICBpZiAoZ2FpbiAmJiBuYl9nYWluKyspCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBQYW5Db250ZXh0ICpwYW4gPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgID0gY3R4LT5pbnB1dHNbMF07CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyA9IE5VTEw7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKKworICAgIHBhbi0+cHVyZV9nYWlucyA9IGFyZV9nYWluc19wdXJlKHBhbik7CisgICAgLyogbGlic3dyIHN1cHBvcnRzIGFueSBzYW1wbGUgYW5kIHBhY2tpbmcgZm9ybWF0cyAqLworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX2FsbF9mb3JtYXRzKEFWTUVESUFfVFlQRV9BVURJTykpOworCisgICAgZm9ybWF0cyA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZm9ybWF0cyk7CisKKyAgICAvLyBpbmxpbmsgc3VwcG9ydHMgYW55IGNoYW5uZWwgbGF5b3V0CisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2NvdW50cygpOworICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJmlubGluay0+b3V0X2NoYW5uZWxfbGF5b3V0cyk7CisKKyAgICAvLyBvdXRsaW5rIHN1cHBvcnRzIG9ubHkgcmVxdWVzdGVkIG91dHB1dCBjaGFubmVsIGxheW91dAorICAgIGxheW91dHMgPSBOVUxMOworICAgIGZmX2FkZF9jaGFubmVsX2xheW91dCgmbGF5b3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuLT5vdXRfY2hhbm5lbF9sYXlvdXQgPyBwYW4tPm91dF9jaGFubmVsX2xheW91dCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0NPVU5UMkxBWU9VVChwYW4tPm5iX291dHB1dF9jaGFubmVscykpOworICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJm91dGxpbmstPmluX2NoYW5uZWxfbGF5b3V0cyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGxpbmstPmRzdDsKKyAgICBQYW5Db250ZXh0ICpwYW4gPSBjdHgtPnByaXY7CisgICAgY2hhciBidWZbMTAyNF0sICpjdXI7CisgICAgaW50IGksIGosIGssIHI7CisgICAgZG91YmxlIHQ7CisKKyAgICBpZiAocGFuLT5uZWVkX3JlbnVtYmVyKSB7CisgICAgICAgIC8vIGlucHV0IGNoYW5uZWxzIHdlcmUgZ2l2ZW4gYnkgdGhlaXIgbmFtZTogcmVudW1iZXIgdGhlbQorICAgICAgICBmb3IgKGkgPSBqID0gMDsgaSA8IE1BWF9DSEFOTkVMUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKGxpbmstPmNoYW5uZWxfbGF5b3V0ID4+IGkpICYgMSkgeworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwYW4tPm5iX291dHB1dF9jaGFubmVsczsgaysrKQorICAgICAgICAgICAgICAgICAgICBwYW4tPmdhaW5ba11bal0gPSBwYW4tPmdhaW5ba11baV07CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gc2FuaXR5IGNoZWNrOyBjYW4ndCBiZSBkb25lIGluIHF1ZXJ5X2Zvcm1hdHMgc2luY2UgdGhlIGlubGluaworICAgIC8vIGNoYW5uZWwgbGF5b3V0IGlzIHVua25vd24gYXQgdGhhdCB0aW1lCisgICAgaWYgKGxpbmstPmNoYW5uZWxzID4gTUFYX0NIQU5ORUxTIHx8CisgICAgICAgIHBhbi0+bmJfb3V0cHV0X2NoYW5uZWxzID4gTUFYX0NIQU5ORUxTKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJhZl9wYW4gc3VwcG9ydCBhIG1heGltdW0gb2YgJWQgY2hhbm5lbHMuICIKKyAgICAgICAgICAgICAgICJGZWVsIGZyZWUgdG8gYXNrIGZvciBhIGhpZ2hlciBsaW1pdC5cbiIsIE1BWF9DSEFOTkVMUyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvLyBpbml0IGxpYnN3cmVzYW1wbGUgY29udGV4dAorICAgIHBhbi0+c3dyID0gc3dyX2FsbG9jX3NldF9vcHRzKHBhbi0+c3dyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbi0+b3V0X2NoYW5uZWxfbGF5b3V0LCBsaW5rLT5mb3JtYXQsIGxpbmstPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPmNoYW5uZWxfbGF5b3V0LCAgICBsaW5rLT5mb3JtYXQsIGxpbmstPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGN0eCk7CisgICAgaWYgKCFwYW4tPnN3cikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpZiAoIWxpbmstPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgIGlmIChhdl9vcHRfc2V0X2ludChwYW4tPnN3ciwgImljaCIsIGxpbmstPmNoYW5uZWxzLCAwKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoIXBhbi0+b3V0X2NoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgIGlmIChhdl9vcHRfc2V0X2ludChwYW4tPnN3ciwgIm9jaCIsIHBhbi0+bmJfb3V0cHV0X2NoYW5uZWxzLCAwKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8vIGdhaW5zIGFyZSBwdXJlLCBpbml0IHRoZSBjaGFubmVsIG1hcHBpbmcKKyAgICBpZiAocGFuLT5wdXJlX2dhaW5zKSB7CisKKyAgICAgICAgLy8gZ2V0IGNoYW5uZWwgbWFwIGZyb20gdGhlIHB1cmUgZ2FpbnMKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhbi0+bmJfb3V0cHV0X2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjaF9pZCA9IC0xOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxpbmstPmNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGFuLT5nYWluW2ldW2pdKSB7CisgICAgICAgICAgICAgICAgICAgIGNoX2lkID0gajsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFuLT5jaGFubmVsX21hcFtpXSA9IGNoX2lkOworICAgICAgICB9CisKKyAgICAgICAgYXZfb3B0X3NldF9pbnQocGFuLT5zd3IsICJpY2wiLCBwYW4tPm91dF9jaGFubmVsX2xheW91dCwgMCk7CisgICAgICAgIGF2X29wdF9zZXRfaW50KHBhbi0+c3dyLCAidWNoIiwgcGFuLT5uYl9vdXRwdXRfY2hhbm5lbHMsIDApOworICAgICAgICBzd3Jfc2V0X2NoYW5uZWxfbWFwcGluZyhwYW4tPnN3ciwgcGFuLT5jaGFubmVsX21hcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcmVub3JtYWxpemUKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhbi0+bmJfb3V0cHV0X2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghKChwYW4tPm5lZWRfcmVub3JtID4+IGkpICYgMSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB0ID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsaW5rLT5jaGFubmVsczsgaisrKQorICAgICAgICAgICAgICAgIHQgKz0gcGFuLT5nYWluW2ldW2pdOworICAgICAgICAgICAgaWYgKHQgPiAtMUUtNSAmJiB0IDwgMUUtNSkgeworICAgICAgICAgICAgICAgIC8vIHQgaXMgYWxtb3N0IDAgYnV0IG5vdCBleGFjdGx5LCB0aGlzIGlzIHByb2JhYmx5IGEgbWlzdGFrZQorICAgICAgICAgICAgICAgIGlmICh0KQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWdlbmVyYXRlIGNvZWZmaWNpZW50cyB3aGlsZSByZW5vcm1hbGl6aW5nXG4iKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsaW5rLT5jaGFubmVsczsgaisrKQorICAgICAgICAgICAgICAgIHBhbi0+Z2FpbltpXVtqXSAvPSB0OworICAgICAgICB9CisgICAgICAgIGF2X29wdF9zZXRfaW50KHBhbi0+c3dyLCAiaWNsIiwgbGluay0+Y2hhbm5lbF9sYXlvdXQsIDApOworICAgICAgICBhdl9vcHRfc2V0X2ludChwYW4tPnN3ciwgIm9jbCIsIHBhbi0+b3V0X2NoYW5uZWxfbGF5b3V0LCAwKTsKKyAgICAgICAgc3dyX3NldF9tYXRyaXgocGFuLT5zd3IsIHBhbi0+Z2FpblswXSwgcGFuLT5nYWluWzFdIC0gcGFuLT5nYWluWzBdKTsKKyAgICB9CisKKyAgICByID0gc3dyX2luaXQocGFuLT5zd3IpOworICAgIGlmIChyIDwgMCkKKyAgICAgICAgcmV0dXJuIHI7CisKKyAgICAvLyBzdW1tYXJ5CisgICAgZm9yIChpID0gMDsgaSA8IHBhbi0+bmJfb3V0cHV0X2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgY3VyID0gYnVmOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGluay0+Y2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgciA9IHNucHJpbnRmKGN1ciwgYnVmICsgc2l6ZW9mKGJ1ZikgLSBjdXIsICIlcyUuM2cgaSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBqID8gIiArICIgOiAiIiwgcGFuLT5nYWluW2ldW2pdLCBqKTsKKyAgICAgICAgICAgIGN1ciArPSBGRk1JTihidWYgKyBzaXplb2YoYnVmKSAtIGN1ciwgcik7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJvJWQgPSAlc1xuIiwgaSwgYnVmKTsKKyAgICB9CisgICAgLy8gYWRkIGNoYW5uZWwgbWFwcGluZyBzdW1tYXJ5IGlmIHBvc3NpYmxlCisgICAgaWYgKHBhbi0+cHVyZV9nYWlucykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlB1cmUgY2hhbm5lbCBtYXBwaW5nIGRldGVjdGVkOiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFuLT5uYl9vdXRwdXRfY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIGlmIChwYW4tPmNoYW5uZWxfbWFwW2ldIDwgMCkKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiBNIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgJWQiLCBwYW4tPmNoYW5uZWxfbWFwW2ldKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnNhbXBsZXMpCit7CisgICAgaW50IHJldDsKKyAgICBpbnQgbiA9IGluc2FtcGxlcy0+bmJfc2FtcGxlczsKKyAgICBBVkZpbHRlckxpbmsgKmNvbnN0IG91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXRzYW1wbGVzID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBuKTsKKyAgICBQYW5Db250ZXh0ICpwYW4gPSBpbmxpbmstPmRzdC0+cHJpdjsKKworICAgIGlmICghb3V0c2FtcGxlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzd3JfY29udmVydChwYW4tPnN3ciwgb3V0c2FtcGxlcy0+ZXh0ZW5kZWRfZGF0YSwgbiwKKyAgICAgICAgICAgICAgICAodm9pZCAqKWluc2FtcGxlcy0+ZXh0ZW5kZWRfZGF0YSwgbik7CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXRzYW1wbGVzLCBpbnNhbXBsZXMpOworICAgIG91dHNhbXBsZXMtPmNoYW5uZWxfbGF5b3V0ID0gb3V0bGluay0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgYXZfZnJhbWVfc2V0X2NoYW5uZWxzKG91dHNhbXBsZXMsIG91dGxpbmstPmNoYW5uZWxzKTsKKworICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXRzYW1wbGVzKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnNhbXBsZXMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFBhbkNvbnRleHQgKnBhbiA9IGN0eC0+cHJpdjsKKyAgICBzd3JfZnJlZSgmcGFuLT5zd3IpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihQYW5Db250ZXh0LCB4KQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gcGFuX29wdGlvbnNbXSA9IHsKKyAgICB7ICJhcmdzIiwgTlVMTCwgT0ZGU0VUKGFyZ3MpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSB8IEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MocGFuKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHBhbl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfcHJvcHMsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHBhbl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfcGFuID0geworICAgIC5uYW1lICAgICAgICAgID0gInBhbiIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVtaXggY2hhbm5lbHMgd2l0aCBjb2VmZmljaWVudHMgKHBhbm5pbmcpLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFBhbkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnBhbl9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gcGFuX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHBhbl9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9yZXBsYXlnYWluLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfcmVwbGF5Z2Fpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTk4NTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfcmVwbGF5Z2Fpbi5jCkBAIC0wLDAgKzEsNjEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwOSBDb25pZmVyIFNvZnR3YXJlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJlcGxheUdhaW4gc2Nhbm5lcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBISVNUT0dSQU1fU0xPVFMgMTIwMDAKKyNkZWZpbmUgQlVUVEVSX09SREVSICAgICAgICAyCisjZGVmaW5lIFlVTEVfT1JERVIgICAgICAgICAxMAorCit0eXBlZGVmIHN0cnVjdCBSZXBsYXlHYWluRnJlcUluZm8geworICAgIGludCAgICBzYW1wbGVfcmF0ZTsKKyAgICBkb3VibGUgQll1bGVbWVVMRV9PUkRFUiArIDFdOworICAgIGRvdWJsZSBBWXVsZVtZVUxFX09SREVSICsgMV07CisgICAgZG91YmxlIEJCdXR0ZXJbQlVUVEVSX09SREVSICsgMV07CisgICAgZG91YmxlIEFCdXR0ZXJbQlVUVEVSX09SREVSICsgMV07Cit9IFJlcGxheUdhaW5GcmVxSW5mbzsKKworc3RhdGljIGNvbnN0IFJlcGxheUdhaW5GcmVxSW5mbyBmcmVxaW5mb3NbXSA9Cit7CisgICAgeworICAgICAgICAxOTIwMDAsCisgICAgICAgIHsgIDAuMDExODQ3NDIxMjMxMjMsIC0wLjA0NjMxMDkyNDAwMDg2LCAgMC4wNjU4NDIyNjk2MTIzOCwKKyAgICAgICAgICAtMC4wMjE2NTU4ODUyMjQ3OCwgLTAuMDU2NTYyNjA3Nzg5NTIsICAwLjA4NjA3NDkzNTkyNzYwLAorICAgICAgICAgIC0wLjAzMzc1NTQ0MzM5Nzg2LCAtMC4wNDIxNjU3OTkzMjc1NCwgIDAuMDY0MTY3MTE0OTA2NDgsCisgICAgICAgICAgLTAuMDM0NDQ3MDgyNjA4NDQsICAwLjAwNjk3Mjc1ODcyMjQxIH0sCisgICAgICAgIHsgIDEuMDAwMDAwMDAwMDAwMDAsIC01LjI0NzI3MzE4MzQ4MTY3LCAxMC42MDgyMTU4NTE5MjI0NCwKKyAgICAgICAgICAtOC43NDEyNzY2NTgxMDQxMywgLTEuMzM5MDYwNzEzNzE2ODMsICA4LjA3OTcyODgyMDk2NjA2LAorICAgICAgICAgIC01LjQ2MTc5OTE4OTUwODQ3LCAgMC41NDMxODA3MDY1MjUzNiwgIDAuODc0NTA5NjkyMjQyODAsCisgICAgICAgICAgLTAuMzQ2NTYwODM1Mzk3NTQsICAwLjAzMDM0Nzk2ODQzNTg5IH0sCisgICAgICAgIHsgIDAuOTk2NTM1MDE0NjUxMzUsIC0xLjk5MzA3MDAyOTMwMjcxLCAgMC45OTY1MzUwMTQ2NTEzNSB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMS45OTMwNTgwMjMxNDMyMSwgIDAuOTkzMDgyMDM1NDYyMjEgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTc2NDAwLAorICAgICAgICB7ICAwLjAwMjY4NTY4NTI0NTI5LCAtMC4wMDg1MjM3OTQyNjA4MCwgIDAuMDA4NTI3MDQxOTEzNDcsCisgICAgICAgICAgIDAuMDAxNDYxMTYzMTAyOTUsIC0wLjAwOTUwODU1ODI4NzYyLCAgMC4wMDYyNTQ0OTUxNTQ5OSwKKyAgICAgICAgICAgMC4wMDExNjE4Mzg2ODcyMiwgLTAuMDAzNjI0NjE0MTcxMzYsICAwLjAwMjAzOTYxMDAwMTM0LAorICAgICAgICAgIC0wLjAwMDUwNjY0NTg3OTMzLCAgMC4wMDAwNDMyNzQ1NTQyNyB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtNS41NzUxMjc4Mjc2MzA0NSwgMTIuNDQyOTEwNTYwNjU3OTQsCisgICAgICAgICAtMTIuODc0NjI3OTk2ODEyMjEsICAzLjA4NTU0ODQ2OTYxNTc2LCAgNi42MjQ5MzQ1OTg4MDY5MiwKKyAgICAgICAgICAtNy4wNzY2Mjc2NjMxMzI0OCwgIDIuNTExNzU1NDI3MzY0NDEsICAwLjA2NzMxNTEwODAyNzM1LAorICAgICAgICAgIC0wLjI0NTY3NzUzODE5MjEzLCAgMC4wMzk2MTQwNDE2MjM3NiB9LAorICAgICAgICB7ICAwLjk5NjIyOTE2NTgxMTE4LCAtMS45OTI0NTgzMzE2MjIzNiwgIDAuOTk2MjI5MTY1ODExMTggfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTkyNDQ0MTEyMzgxMzMsICAwLjk5MjQ3MjU1MDg2MzM5IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDE0NDAwMCwKKyAgICAgICAgeyAgMC4wMDYzOTY4MjM1OTQ1MCwgLTAuMDI1NTY0Mzc5NzA5NTUsICAwLjA0MjMwODU0NDAwOTM4LAorICAgICAgICAgIC0wLjAzNzIyNDYyMjAxMjY3LCAgMC4wMTcxODUxNDgyNzI5NSwgIDAuMDA2MTA1OTIyNDMwMDksCisgICAgICAgICAgLTAuMDMwNjU5NjU3NDczNjUsICAwLjA0MzQ1NzQ1MDAzNTM5LCAtMC4wMzI5ODU5MjY4MTMwOSwKKyAgICAgICAgICAgMC4wMTMyMDkzNzIzNjgwOSwgLTAuMDAyMjAzMDQxMjc3NTcgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTYuMTQ4MTQ2MjM1MjM0MjUsIDE1LjgwMDAyNDU3MTQxNTY2LAorICAgICAgICAgLTIwLjc4NDg3NTg3Njg2OTM3LCAxMS45ODg0ODU1MjMxMDMxNSwgIDMuMzY0NjIwMTUwNjI2MDYsCisgICAgICAgICAtMTAuMjI0MTk4NjgzNTk0NzAsICA2LjY1NTk5NzAyMTQ2NDczLCAtMS42NzE0MTg2MTExMDQ4NSwKKyAgICAgICAgICAtMC4wNTQxNzk1NjUzNjcxOCwgIDAuMDczNzQ3Njc4Njc0MDYgfSwKKyAgICAgICAgeyAgMC45OTUzODI2ODk1ODcwNiwgLTEuOTkwNzY1Mzc5MTc0MTMsICAwLjk5NTM4MjY4OTU4NzA2IH0sCisgICAgICAgIHsgIDEuMDAwMDAwMDAwMDAwMDAsIC0xLjk5MDc0NDA1OTUwNTA1LCAgMC45OTA3ODY2OTg4NDMyMSB9LAorICAgIH0sCisgICAgeworICAgICAgICAxMjgwMDAsCisgICAgICAgIHsgIDAuMDA1NTMxMjA1ODQzMDUsIC0wLjAyMTEyNjIwNTQ1MDE2LCAgMC4wMzU0OTA3NjI0MzExNywKKyAgICAgICAgICAtMC4wMzM2MjQ5ODMxMjMwNiwgIDAuMDE0MjU4NjcyNDgxODMsICAwLjAxMzQ0Njg2OTI4Nzg3LAorICAgICAgICAgIC0wLjAzMzkyNzcwNzg3ODM2LCAgMC4wMzQ2NDEzNjQ1OTUzMCwgLTAuMDIwMzkxMTYwNTE1NDksCisgICAgICAgICAgIDAuMDA2Njc0MjA3OTQ3MDUsIC0wLjAwMDkzNzYzNzYyOTk1IH0sCisgICAgICAgIHsgIDEuMDAwMDAwMDAwMDAwMDAsIC02LjE0NTgxNzEwODM5OTI1LCAxNi4wNDc4NTkwMzY3NTgzOCwKKyAgICAgICAgIC0yMi4xOTA4OTEzMTQwNzc0OSwgMTUuMjQ3NTY0NzE1ODAyODYsIC0wLjUyMDAxNDQwNDAwMjM4LAorICAgICAgICAgIC04LjAwNDg4NjQxNjk5OTQwLCAgNi42MDkxNjA5NDc2ODg1NSwgLTIuMzc4NTYwMjI4MTA5MjMsCisgICAgICAgICAgIDAuMzMxMDY5NDc5ODYxMDEsICAwLjAwNDU5ODIwODMyMDM2IH0sCisgICAgICAgIHsgIDAuOTk0ODA3MDI2ODEyNzgsIC0xLjk4OTYxNDA1MzYyNTU3LCAgMC45OTQ4MDcwMjY4MTI3OCB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMS45ODk1ODcwODY0NzMyNCwgIDAuOTg5NjQxMDIwNzc3OTAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTEyMDAwLAorICAgICAgICB7ICAwLjAwNTI4Nzc4NzE4MjU5LCAtMC4wMTg5MzI0MDkwNzI0NSwgIDAuMDMxODU5ODI1NjE4NjcsCisgICAgICAgICAgLTAuMDI5MjYyNjAyOTc4MzgsICAwLjAwNzE1NzQzMDM0MDcyLCAgMC4wMTk4NTc0MzM1NTgyNywKKyAgICAgICAgICAtMC4wMzIyMjYxNDg1MDk0MSwgIDAuMDI1NjU2ODE5NzgxOTIsIC0wLjAxMjEwNjYyMzEzNDczLAorICAgICAgICAgICAwLjAwMzI1NDM2Mjg0NTQxLCAtMC4wMDA0NDE3MzU5MzAwMSB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtNi4yNDkzMjEwODQ1NjI4OCwgMTcuNDIzNDQzMjA1Mzg0NzYsCisgICAgICAgICAtMjcuODY4MTk3MDkwNTQ4OTYsIDI2Ljc5MDg3MzQ0NjgxMzI2LC0xMy40MzcxMTA4MTQ4NTEyMywKKyAgICAgICAgICAtMC42NjAyMzYxMjk0ODE3MywgIDYuMDM2NTgwOTE4MTQ5MzUsIC00LjI0OTI2NTc3MDMwMzEwLAorICAgICAgICAgICAxLjQwODI5MjY4NzA5MTg2LCAtMC4xOTQ4MDg1MjYyODExMiB9LAorICAgICAgICB7ICAwLjk5NDA2NzM3ODEwODY3LCAtMS45ODgxMzQ3NTYyMTczNCwgIDAuOTk0MDY3Mzc4MTA4NjcgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTg4MDk5NTU5OTA1MTQsICAwLjk4ODE2OTk1MjUyOTU0IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDk2MDAwLAorICAgICAgICB7ICAwLjAwNTg4MTM4Mjk2NjgzLCAtMC4wMTYxMzU1OTczMDQyMSwgIDAuMDIxODQ3OTg5NTQyMTYsCisgICAgICAgICAgLTAuMDE3NDI0OTA0MDUzMTcsICAwLjAwNDY0NjM1NjQzNzgwLCAgMC4wMTExNzc3MjUxMzIwNSwKKyAgICAgICAgICAtMC4wMjEyMzg2NTgyNDM2OCwgIDAuMDE5NTkzNTQ0MTMzNTAsIC0wLjAxMDc5NzIwNjQzNTIzLAorICAgICAgICAgICAwLjAwMzUyMTgzNjg2Mjg5LCAtMC4wMDA2MzEyNDM0MTQyMSB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtNS45NzgwODgyMzY0MjAwOCwgMTYuMjEzNjI1MDc5NjQwNjgsCisgICAgICAgICAtMjUuNzI5MjM3MzA2NTI1OTksIDI1LjQwNDcwNjYzMTM5NTEzLC0xNC42NjE2NjI4Nzc3MTEzNCwKKyAgICAgICAgICAgMi44MTU5NzQ4NDM1OTc1MiwgIDIuNTE0NDcxMjU5Njk3MzMsIC0yLjIzNTc1MzA2OTg1Mjg2LAorICAgICAgICAgICAwLjc1Nzg4MTUxMDM2NzkxLCAtMC4xMDA3ODAyNTE5OTAyOSB9LAorICAgICAgICB7ICAwLjk5MzA4MjAzNTE3NTQxLCAtMS45ODYxNjQwNzAzNTA4MiwgIDAuOTkzMDgyMDM1MTc1NDEgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTg2MTE2MjExNTQwODksICAwLjk4NjIxMTkyOTE2MDc1IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDg4MjAwLAorICAgICAgICB7ICAwLjAyNjY3NDgyMDQ3NDE2LCAtMC4xMTM3NzQ3OTMzNjA5NywgIDAuMjMwNjMxNjc5MTA5NjUsCisgICAgICAgICAgLTAuMzA3MjY0Nzc5NDU1OTMsICAwLjMzMTg4NTIwNjg2NTI5LCAtMC4zMzg2MjY4MDI0OTA2MywKKyAgICAgICAgICAgMC4zMTgwNzE2MTUzMTM0MCwgLTAuMjM3MzA3OTY5Mjk4ODAsICAwLjEyMjczODk0NzkwMzcxLAorICAgICAgICAgIC0wLjAzODQwMDE3OTY3MjgyLCAgMC4wMDU0OTY3MzM4NzkzNiB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtNi4zMTgzNjQ1MTY1NzMwMiwgMTguMzEzNTEzMTA4MDE3OTksCisgICAgICAgICAtMzEuODgyMTAwMTQ4MTU5MjEsIDM2LjUzNzkyMTQ2OTc2NzQwLC0yOC4yMzM5MzAzNjQ2NzU1OSwKKyAgICAgICAgICAxNC4yNDcyNTI1ODIyNzE4OSwgLTQuMDQ2NzA5ODAwMTI4NTQsICAwLjE4ODY1NzU3MjgwNTE1LAorICAgICAgICAgICAwLjI1NDIwMzMzNTYzOTA4LCAtMC4wNjAxMjMzMzUzMTA2NSB9LAorICAgICAgICB7ICAwLjk5MjQ3MjU1MDQ2MTI5LCAtMS45ODQ5NDUxMDA5MjI1OSwgIDAuOTkyNDcyNTUwNDYxMjkgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTg0ODg4NDM3NjIzMzUsICAwLjk4NTAwMTc2NDIyMTgzIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDY0MDAwLAorICAgICAgICB7ICAwLjAyNjEzMDU2NTY4MTc0LCAtMC4wODEyODc4NjQ4ODEwOSwgIDAuMTQ5MzcyODIzNDczMjUsCisgICAgICAgICAgLTAuMjE2OTU3MTE2NzUxMjYsICAwLjI1MDEwMjg2NjczNDAyLCAtMC4yMzE2MjI4MzYxOTI3OCwKKyAgICAgICAgICAgMC4xNzQyNDA0MTgzMzA1MiwgLTAuMTAyOTk1OTkyMTY2ODAsICAwLjA0MjU4Njk2NDgxOTgxLAorICAgICAgICAgIC0wLjAwOTc3OTUyOTM2NDkzLCAgMC4wMDEwNTMyNTU1ODg4OSB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtNS43MzYyNTQ3NzA5MjExOSwgMTYuMTUyNDk3OTQzNTUwMzUsCisgICAgICAgICAtMjkuNjg2NTQ5MTI0NjQ1MDgsIDM5LjU1NzA2MTU1Njc0MDgzLC0zOS44MjUyNDU1NjI0NjI1MywKKyAgICAgICAgICAzMC41MDYwNTM0NTAxMzAwOSwtMTcuNDMwNTE3NzI4MjEyNDUsICA3LjA1MTU0NTczOTA4MDE3LAorICAgICAgICAgIC0xLjgwNzgzODM5NzIwNTE0LCAgMC4yMjEyNzg0MDIxMDgxMyB9LAorICAgICAgICB7ICAwLjk4OTY0MTAxOTMzNDcyLCAtMS45NzkyODIwMzg2Njk0NCwgIDAuOTg5NjQxMDE5MzM0NzIgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTc5MTc0NzI3MzEwMDksICAwLjk3OTM4OTM1MDAyODgwIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDU2MDAwLAorICAgICAgICB7ICAwLjAzMTQ0OTE0NzM0MDg1LCAtMC4wNjE1MTcyOTIwNjk2MywgIDAuMDgwNjY3ODg3MDgxNDUsCisgICAgICAgICAgLTAuMDk3Mzc5Mzk5MjE1MTYsICAwLjA4OTQzMjEwODAzOTk5LCAtMC4wNjk4OTk4NDY3MjAxMCwKKyAgICAgICAgICAgMC4wNDkyNjk3Mjg0MTA0NCwgLTAuMDMxNjEyNTc4NDg0NTEsICAwLjAxNDU2ODM3NDkzNTA2LAorICAgICAgICAgIC0wLjAwMzE2MDE1MTA4NDk2LCAgMC4wMDEzMjgwNzIxNTg3NSB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtNC44NzM3NzMxMzA5MDAzMiwgMTIuMDM5MjIxNjAxNDAyMDksCisgICAgICAgICAtMjAuMTAxNTExMTgzODEzOTUsIDI1LjEwMzg4NTM0NDE1MTcxLC0yNC4yOTA2NTU2MDgxNTkwMywKKyAgICAgICAgICAxOC4yNzE1ODQ2OTA5MDY2MywtMTAuNDUyNDk1NTI1NjA1OTMsICA0LjMwMzE5NDkxODcyMDAzLAorICAgICAgICAgIC0xLjEzNzE2OTkyMDcwMTg1LCAgMC4xNDUxMDczMzUyNzAzNSB9LAorICAgICAgICB7ICAwLjk4ODE2OTk1MDA3MzkyLCAtMS45NzYzMzk5MDAxNDc4NCwgIDAuOTg4MTY5OTUwMDczOTIgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTc2MTk5OTQ1MTY5NzMsICAwLjk3NjQ3OTg1NTEyNTk0IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDQ4MDAwLAorICAgICAgICB7ICAwLjAzODU3NTk5NDM1MjAwLCAtMC4wMjE2MDM2NzE4NDE4NSwgLTAuMDAxMjMzOTUzMTY4NTEsCisgICAgICAgICAgLTAuMDAwMDkyOTE2Nzc5NTksIC0wLjAxNjU1MjYwMzQxNjE5LCAgMC4wMjE2MTUyNjg0MzI3NCwKKyAgICAgICAgICAtMC4wMjA3NDA0NTIxNTI4NSwgIDAuMDA1OTQyOTgwNjUxMjUsICAwLjAwMzA2NDI4MDIzMTkxLAorICAgICAgICAgICAwLjAwMDEyMDI1MzIyMDI3LCAgMC4wMDI4ODQ2MzY4MzkxNiB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMy44NDY2NDYxNzExODA2NywgIDcuODE1MDE2NTMwMDU1MzgsCisgICAgICAgICAtMTEuMzQxNzAzNTUxMzIwNDIsIDEzLjA1NTA0MjE5MzI3NTQ1LC0xMi4yODc1OTg5NTE0NTI5NCwKKyAgICAgICAgICAgOS40ODI5MzgwNjMxOTc5MCwgLTUuODcyNTc4NjE3NzU5OTksICAyLjc1NDY1ODYxODc0NjEzLAorICAgICAgICAgIC0wLjg2OTg0Mzc2NTkzNTUxLCAgMC4xMzkxOTMxNDU2NzQzMiB9LAorICAgICAgICB7ICAwLjk4NjIxMTkyNDYyNzA4LCAtMS45NzI0MjM4NDkyNTQxNiwgIDAuOTg2MjExOTI0NjI3MDggfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTcyMjMzNzI5MTk1MjcsICAwLjk3MjYxMzk2OTMxMzA2IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDQ0MTAwLAorICAgICAgICB7ICAwLjA1NDE4NjU2NDA2NDMwLCAtMC4wMjkxMTAwNzgwODk0OCwgLTAuMDA4NDg3MDkzNzk4NTEsCisgICAgICAgICAgLTAuMDA4NTExNjU2NDU0NjksIC0wLjAwODM0OTkwOTA0OTM2LCAgMC4wMjI0NTI5MzI1MzMzOSwKKyAgICAgICAgICAtMC4wMjU5NjMzODUxMjkxNSwgIDAuMDE2MjQ4NjQ5NjI5NzUsIC0wLjAwMjQwODc5MDUxNTg0LAorICAgICAgICAgICAwLjAwNjc0NjEzNjgyMjQ3LCAtMC4wMDE4Nzc2Mzc3NzM2MiB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMy40Nzg0NTk0ODU1MDA3MSwgIDYuMzYzMTc3Nzc1NjYxNDgsCisgICAgICAgICAgLTguNTQ3NTE1Mjc0NzE4NzQsICA5LjQ3NjkzNjA3ODAxMjgwLCAtOC44MTQ5ODY4MTM3MDE1NSwKKyAgICAgICAgICAgNi44NTQwMTU0MDkzNjk5OCwgLTQuMzk0NzA5OTYwNzk1NTksICAyLjE5NjExNjg0ODkwNzc0LAorICAgICAgICAgIC0wLjc1MTA0MzAyNDUxNDMyLCAgMC4xMzE0OTMxNzk1ODgwOCB9LAorICAgICAgICB7ICAwLjk4NTAwMTc1Nzg3MjQyLCAtMS45NzAwMDM1MTU3NDQ4NCwgIDAuOTg1MDAxNzU3ODcyNDIgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTY5Nzc4NTU1ODI2MTgsICAwLjk3MDIyODQ3NTY2MzUwIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDM3ODAwLAorICAgICAgICB7ICAwLjA4NzE3ODc5OTc3ODQ0LCAtMC4wMTAwMDM3NDAxNjE3MiwgLTAuMDYyNjU4NTIxMjIzNjgsCisgICAgICAgICAgLTAuMDExMTkzMjg4MDA5NTAsIC0wLjAwMTE0Mjc5MzcyOTYwLCAgMC4wMjA4MTMzMzk1NDc2OSwKKyAgICAgICAgICAtMC4wMTYwMzI2MTg2MzIwNywgIDAuMDE5MzY3NjMwMjg1NDYsICAwLjAwNzYwMDQ0NzM2NDQyLAorICAgICAgICAgIC0wLjAwMzAzOTc5MTEyMjcxLCAtMC4wMDA3NTA4ODYwNTc4OCB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMi42MjgxNjMxMTQ3MjE0NiwgIDMuNTM3MzQ1MzU4MTc5OTIsCisgICAgICAgICAgLTMuODEwMDM0NDg2Nzg5MjEsICAzLjkxMjkxNjM2NzMwMTMyLCAtMy41MzUxODYwNTg5NjI4OCwKKyAgICAgICAgICAgMi43MTM1Njg2NjE1Nzg3MywgLTEuODY3MjMzMTE4NDY1OTIsICAxLjEyMDc1MzgyMzY3NjU5LAorICAgICAgICAgIC0wLjQ4NTc0MDg2ODg2ODkwLCAgMC4xMTMzMDU0NDY2Mzg0OSB9LAorICAgICAgICB7ICAwLjk4MjUyNDAwODE1MTk1LCAtMS45NjUwNDgwMTYzMDM5MSwgIDAuOTgyNTI0MDA4MTUxOTUgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTY0NzQyNTgyNjkwNDEsICAwLjk2NTM1MzQ0OTkxNzQwIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDMyMDAwLAorICAgICAgICB7ICAwLjE1NDU3Mjk5NjgxOTI0LCAtMC4wOTMzMTA0OTA1NjMxNSwgLTAuMDYyNDc4ODAxNTM2NTMsCisgICAgICAgICAgIDAuMDIxNjM1NDE4ODg3OTgsIC0wLjA1NTg4MzkzMzI5ODU2LCAgMC4wNDc4MTQ3NjY3NDkyMSwKKyAgICAgICAgICAgMC4wMDIyMjMxMjU5Nzc0MywgIDAuMDMxNzQwOTI1NDAwNDksIC0wLjAxMzkwNTg5NDIxODk4LAorICAgICAgICAgICAwLjAwNjUxNDIwNjY3ODMxLCAtMC4wMDg4MTM2MjczMzgzOSB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMi4zNzg5ODgzNDk3MzA4NCwgIDIuODQ4NjgxNTExNTYzMjcsCisgICAgICAgICAgLTIuNjQ1NzcxNzAyMjk4MjUsICAyLjIzNjk3NjU3NDUxNzEzLCAtMS42NzE0ODE1MzM2NzYwMiwKKyAgICAgICAgICAgMS4wMDU5NTk1NDgwODU0NywgLTAuNDU5NTM0NTgwNTQ5ODMsICAwLjE2Mzc4MTY0ODU4NTk2LAorICAgICAgICAgIC0wLjA1MDMyMDc3NzE3MTMxLCAgMC4wMjM0Nzg5NzQwNzAyMCB9LAorICAgICAgICB7ICAwLjk3OTM4OTMyNzM1MjE0LCAtMS45NTg3Nzg2NTQ3MDQyOCwgIDAuOTc5Mzg5MzI3MzUyMTQgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTU4MzUzODA5NzUzOTgsICAwLjk1OTIwMzQ5OTY1NDU5IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDI0MDAwLAorICAgICAgICB7ICAwLjMwMjk2OTA3MzE5MzI3LCAtMC4yMjYxMzk4ODY4MjEyMywgLTAuMDg1ODczMjM3MzA3NzIsCisgICAgICAgICAgIDAuMDMyODI5MzAxNzI2NjQsIC0wLjAwOTE1NzAyOTMzNDM0LCAtMC4wMjM2NDE0MTIwMjUyMiwKKyAgICAgICAgICAtMC4wMDU4NDQ1NjAzOTkxMywgIDAuMDYyNzYxMDEzMjE3NDksIC0wLjAwMDAwODI4MDg2NzQ4LAorICAgICAgICAgICAwLjAwMjA1ODYxODg1NTY0LCAtMC4wMjk1MDEzNDk4MzI4NyB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMS42MTI3MzE2NTEzNzI0NywgIDEuMDc5Nzc0OTIyNTk5NzAsCisgICAgICAgICAgLTAuMjU2NTYyNTc3NTQwNzAsIC0wLjE2Mjc2NzE5MTIwNDQwLCAtMC4yMjYzODg5Mzc3MzkwNiwKKyAgICAgICAgICAgMC4zOTEyMDgwMDc4ODI4NCwgLTAuMjIxMzgxMzg5NTQ5MjUsICAwLjA0NTAwMjM1Mzg3MzUyLAorICAgICAgICAgICAwLjAyMDA1ODUxODA2NTAxLCAgMC4wMDMwMjQzOTA5NTc0MSB9LAorICAgICAgICB7ICAwLjk3NTMxODQzMjA0OTI4LCAtMS45NTA2MzY4NjQwOTg1NywgIDAuOTc1MzE4NDMyMDQ5MjggfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTUwMDI3NTkxNDk4NzgsICAwLjk1MTI0NjEzNjY5ODM1IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDIyMDUwLAorICAgICAgICB7ICAwLjMzNjQyMzA0ODU2MTMyLCAtMC4yNTU3MjI0MTQyNTU3MCwgLTAuMTE4Mjg1NzAxNzc1NTUsCisgICAgICAgICAgIDAuMTE5MjExNDg2NzUyMDMsIC0wLjA3ODM0NDg5NjA5NDc5LCAtMC4wMDQ2OTk3NzkxNDM4MCwKKyAgICAgICAgICAtMC4wMDU4OTUwMDIyNDQ0MCwgIDAuMDU3MjQyMjgxNDAzNTEsICAwLjAwODMyMDQzOTgwNzczLAorICAgICAgICAgIC0wLjAxNjM1MzgxMzg0NTQwLCAtMC4wMTc2MDE3NjU2ODE1MCB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMS40OTg1ODk3OTM2Nzc5OSwgIDAuODczNTAyNzE0MTgxODgsCisgICAgICAgICAgIDAuMTIyMDUwMjIzMDgwODQsIC0wLjgwNzc0OTQ0NjcxNDM4LCAgMC40Nzg1NDc5NDU2MjMyNiwKKyAgICAgICAgICAtMC4xMjQ1MzQ1ODE0MDAxOSwgLTAuMDQwNjc1MTAxOTcwMTQsICAwLjA4MzMzNzU1Mjg0MTA3LAorICAgICAgICAgIC0wLjA0MjM3MzQ4MDI1NzQ2LCAgMC4wMjk3NzIwNzMxOTkyNSB9LAorICAgICAgICB7ICAwLjk3MzE2NTIzNDk4MTYxLCAtMS45NDYzMzA0Njk5NjMyMywgIDAuOTczMTY1MjM0OTgxNjEgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTQ1NjEwMjM1NjY1MjcsICAwLjk0NzA1MDcwNDI2MTE4IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDE4OTAwLAorICAgICAgICB7ICAwLjM4NTI0NTMxMDE1MTQyLCAtMC4yNzY4MjIxMjA2MjA2NywgLTAuMDk5ODAxODE0ODg4MDUsCisgICAgICAgICAgIDAuMDk5NTE0ODY3NTU2NDYsIC0wLjA4OTM0MDIwMTU2NjIyLCAtMC4wMDMyMjM2OTMzMDE5OSwKKyAgICAgICAgICAtMC4wMDExMDMyOTA5MDY4OSwgIDAuMDM3ODQ1MDk4NDQ2ODIsICAwLjAxNjgzOTA2MjEzMzAzLAorICAgICAgICAgIC0wLjAxMTQ3MDM5ODYyNTcyLCAtMC4wMTk0MTc2Nzk4NzE5MiB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMS4yOTcwODkxODQwNDUzNCwgIDAuOTAzOTkzMzk2NzQyMDMsCisgICAgICAgICAgLTAuMjk2MTM3OTkwMTc4NzcsIC0wLjQyMzI2NjQ1OTE2MjA3LCAgMC4zNzkzNDg4NzQwMjIwMCwKKyAgICAgICAgICAtMC4zNzkxOTc5NTk0NDkzOCwgIDAuMjM0MTAyODMyODQ3ODUsIC0wLjAzODkyOTcxNzU4ODc5LAorICAgICAgICAgICAwLjAwNDAzMDA5NTUyMzUxLCAgMC4wMzY0MDE2NjYyNjI3OCB9LAorICAgICAgICB7ICAwLjk2NTM1MzI2ODE1ODI5LCAtMS45MzA3MDY1MzYzMTY1OCwgIDAuOTY1MzUzMjY4MTU4MjkgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTI5NTA1Nzc5ODM1MjQsICAwLjkzMTkwNzI5Mjc5NzkzIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDE2MDAwLAorICAgICAgICB7ICAwLjQ0OTE1MjU2NjA4NDUwLCAtMC4xNDM1MTc1NzQ2NDU0NywgLTAuMjI3ODQzOTQ0Mjk3NDksCisgICAgICAgICAgLTAuMDE0MTkxNDAxMDA1NTEsICAwLjA0MDc4MjYyNzk3MTM5LCAtMC4xMjM5ODE2MzM4MTc0OCwKKyAgICAgICAgICAgMC4wNDA5NzU2NTEzNTY0OCwgIDAuMTA0Nzg1MDM2MDAyNTEsIC0wLjAxODYzODg3ODEwOTI3LAorICAgICAgICAgIC0wLjAzMTkzNDI4NDM4OTE1LCAgMC4wMDU0MTkwNzc0ODcwNyB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMC42MjgyMDYxOTIzMzY3MSwgIDAuMjk2NjE3ODM3MDYzNjYsCisgICAgICAgICAgLTAuMzcyNTYzNzI5NDI0MDAsICAwLjAwMjEzNzY3ODU3MTI0LCAtMC40MjAyOTgyMDE3MDkxOCwKKyAgICAgICAgICAgMC4yMjE5OTY1MDU2NDgyNCwgIDAuMDA2MTM0MjQzNTA2ODIsICAwLjA2NzQ3NjIwNzQ0NjgzLAorICAgICAgICAgICAwLjA1Nzg0ODIwMzc1ODAxLCAgMC4wMzIyMjc1NDA3MjE3MyB9LAorICAgICAgICB7ICAwLjk2NDU0NTE1NTUyODI2LCAtMS45MjkwOTAzMTEwNTY1MiwgIDAuOTY0NTQ1MTU1NTI4MjYgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTI3ODMyODY5NzcwMzYsICAwLjkzMDM0Nzc1MjM0MjY4IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDEyMDAwLAorICAgICAgICB7ICAwLjU2NjE5NDcwNzU3NjQxLCAtMC43NTQ2NDQ1NjkzOTMwMiwgIDAuMTYyNDIxMzc3NDIyMzAsCisgICAgICAgICAgIDAuMTY3NDQyNDM0OTM2NzIsIC0wLjE4OTAxNjA0MTk5NjA5LCAgMC4zMDkzMTc4Mjg0MTgzMCwKKyAgICAgICAgICAtMC4yNzU2Mjk2MTk4NjIyNCwgIDAuMDA2NDczMTA2NzcyNDYsICAwLjA4NjQ3NTAzNzgwMzUxLAorICAgICAgICAgIC0wLjAzNzg4OTg0NTU0ODQwLCAtMC4wMDU4ODIxNTQ0MzQyMSB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMS4wNDgwMDMzNTEyNjM0OSwgIDAuMjkxNTYzMTE5NzEyNDksCisgICAgICAgICAgLTAuMjY4MDYwMDEwNDI5NDcsICAwLjAwODE5OTk5NjQ1ODU4LCAgMC40NTA1NDczNDUwNTAwOCwKKyAgICAgICAgICAtMC4zMzAzMjQwMzMxNDAwNiwgIDAuMDY3MzkzNjgzMzMxMTAsIC0wLjA0Nzg0MjU0MjI5MDMzLAorICAgICAgICAgICAwLjAxNjM5OTA3ODM2MTg5LCAgMC4wMTgwNzM2NDMyMzU3MyB9LAorICAgICAgICB7ICAwLjk2MDA5MTQyOTUwNTQxLCAtMS45MjAxODI4NTkwMTA4MiwgIDAuOTYwMDkxNDI5NTA1NDEgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTE4NTg5NTMwMzM3ODQsICAwLjkyMTc3NjE4NzY4MzgxIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDExMDI1LAorICAgICAgICB7ICAwLjU4MTAwNDk0OTYwNTUzLCAtMC41MzE3NDkwOTA1ODU3OCwgLTAuMTQyODk3OTkwMzQyNTMsCisgICAgICAgICAgIDAuMTc1MjA3MDQ4MzU1MjIsICAwLjAyMzc3OTQ1MjE3NjE1LCAgMC4xNTU1ODQ0OTEzNTU3MywKKyAgICAgICAgICAtMC4yNTM0NDc5MDA1OTM1MywgIDAuMDE2Mjg0NjI0MDYzMzMsICAwLjA2OTIwNDY3NzYzOTU5LAorICAgICAgICAgIC0wLjAzNzIxNjExMzk1ODAxLCAtMC4wMDc0OTYxODc5NzE3MiB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMC41MTAzNTMyNzA5NTE4NCwgLTAuMzE4NjM1NjMzMjUyNDUsCisgICAgICAgICAgLTAuMjAyNTY0MTM0ODQ0NzcsICAwLjE0NzI4MTU0MTM0MzMwLCAgMC4zODk1MjYzOTk3ODk5OSwKKyAgICAgICAgICAtMC4yMzMxMzI3MTg4MDg2OCwgLTAuMDUyNDYwMTkwMjQ0NjMsIC0wLjAyNTA1OTYxNzI0MDUzLAorICAgICAgICAgICAwLjAyNDQyMzU3MzE2MDk5LCAgMC4wMTgxODgwMTExMTUwMyB9LAorICAgICAgICB7ICAwLjk1ODU2OTE2NTk5NjAxLCAtMS45MTcxMzgzMzE5OTIwMywgIDAuOTU4NTY5MTY1OTk2MDEgfSwKKyAgICAgICAgeyAgMS4wMDAwMDAwMDAwMDAwMCwgLTEuOTE1NDIxMDgwNzQ3ODAsICAwLjkxODg1NTU4MzIzNjI1IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIDgwMDAsCisgICAgICAgIHsgIDAuNTM2NDg3ODkyNTUxMDUsIC0wLjQyMTYzMDM0MzUwNjk2LCAtMC4wMDI3NTk1MzYxMTkyOSwKKyAgICAgICAgICAgMC4wNDI2Nzg0MjIxOTQxNSwgLTAuMTAyMTQ4NjQxNzk2NzYsICAwLjE0NTkwNzcyMjg5Mzg4LAorICAgICAgICAgIC0wLjAyNDU5ODY0ODU5MzQ1LCAtMC4xMTIwMjMxNTE5NTM4OCwgLTAuMDQwNjAwMzQxMjcwMDAsCisgICAgICAgICAgIDAuMDQ3ODg2NjU1NDgxODAsIC0wLjAyMjE3OTM2ODAxMTM0IH0sCisgICAgICAgIHsgIDEuMDAwMDAwMDAwMDAwMDAsIC0wLjI1MDQ5ODcxOTU2MDIwLCAtMC40MzE5Mzk0MjMxMTExNCwKKyAgICAgICAgICAtMC4wMzQyNDY4MTAxNzY3NSwgLTAuMDQ2NzgzMjg3ODQyNDIsICAwLjI2NDA4MzAwMjAwOTU1LAorICAgICAgICAgICAwLjE1MTEzMTMwNTMzMjE2LCAtMC4xNzU1NjQ5MzM2NjQ0OSwgLTAuMTg4MjMwMDkyNjIxMTUsCisgICAgICAgICAgIDAuMDU0Nzc3MjA0Mjg2NzQsICAwLjA0NzA0NDA5Njg4MTIwIH0sCisgICAgICAgIHsgIDAuOTQ1OTc2ODU2MDAyNzksIC0xLjg5MTk1MzcxMjAwNTU4LCAgMC45NDU5NzY4NTYwMDI3OSB9LAorICAgICAgICB7ICAxLjAwMDAwMDAwMDAwMDAwLCAtMS44ODkwMzMwNzkzOTQ1MiwgIDAuODk0ODc0MzQ0NjE2NjQgfSwKKyAgICB9LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgUmVwbGF5R2FpbkNvbnRleHQgeworICAgIHVpbnQzMl90IGhpc3RvZ3JhbVtISVNUT0dSQU1fU0xPVFNdOworICAgIGZsb2F0IHBlYWs7CisgICAgaW50IHl1bGVfaGlzdF9pLCBidXR0ZXJfaGlzdF9pOworICAgIGNvbnN0IGRvdWJsZSAqeXVsZV9jb2VmZl9hOworICAgIGNvbnN0IGRvdWJsZSAqeXVsZV9jb2VmZl9iOworICAgIGNvbnN0IGRvdWJsZSAqYnV0dGVyX2NvZWZmX2E7CisgICAgY29uc3QgZG91YmxlICpidXR0ZXJfY29lZmZfYjsKKyAgICBmbG9hdCB5dWxlX2hpc3RfYVsyNTZdOworICAgIGZsb2F0IHl1bGVfaGlzdF9iWzI1Nl07CisgICAgZmxvYXQgYnV0dGVyX2hpc3RfYVsyNTZdOworICAgIGZsb2F0IGJ1dHRlcl9oaXN0X2JbMjU2XTsKK30gUmVwbGF5R2FpbkNvbnRleHQ7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dCA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICBmZl9hZGRfZm9ybWF0KCZmb3JtYXRzLCBBVl9TQU1QTEVfRk1UX0ZMVCk7CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgZmZfYWRkX2NoYW5uZWxfbGF5b3V0KCZsYXlvdXQsIEFWX0NIX0xBWU9VVF9TVEVSRU8pOworICAgIGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgbGF5b3V0KTsKKworICAgIGZvcm1hdHMgPSBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhmcmVxaW5mb3MpOyBpKyspCisgICAgICAgIGZmX2FkZF9mb3JtYXQoJmZvcm1hdHMsIGZyZXFpbmZvc1tpXS5zYW1wbGVfcmF0ZSk7CisgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgUmVwbGF5R2FpbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZnJlcWluZm9zKTsgaSsrKSB7CisgICAgICAgIGlmIChmcmVxaW5mb3NbaV0uc2FtcGxlX3JhdGUgPT0gaW5saW5rLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBhdl9hc3NlcnQwKGkgPCBGRl9BUlJBWV9FTEVNUyhmcmVxaW5mb3MpKTsKKworICAgIHMtPnl1bGVfY29lZmZfYSAgID0gZnJlcWluZm9zW2ldLkFZdWxlOworICAgIHMtPnl1bGVfY29lZmZfYiAgID0gZnJlcWluZm9zW2ldLkJZdWxlOworICAgIHMtPmJ1dHRlcl9jb2VmZl9hID0gZnJlcWluZm9zW2ldLkFCdXR0ZXI7CisgICAgcy0+YnV0dGVyX2NvZWZmX2IgPSBmcmVxaW5mb3NbaV0uQkJ1dHRlcjsKKworICAgIHMtPnl1bGVfaGlzdF9pICAgPSAyMDsKKyAgICBzLT5idXR0ZXJfaGlzdF9pID0gNDsKKyAgICBpbmxpbmstPnBhcnRpYWxfYnVmX3NpemUgPQorICAgIGlubGluay0+bWluX3NhbXBsZXMgPQorICAgIGlubGluay0+bWF4X3NhbXBsZXMgPSBpbmxpbmstPnNhbXBsZV9yYXRlIC8gMjA7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFVwZGF0ZSBsYXJnZXN0IGFic29sdXRlIHNhbXBsZSB2YWx1ZS4KKyAqLworc3RhdGljIHZvaWQgY2FsY19zdGVyZW9fcGVhayhjb25zdCBmbG9hdCAqc2FtcGxlcywgaW50IG5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpwZWFrX3ApCit7CisgICAgZmxvYXQgcGVhayA9IDAuMDsKKworICAgIHdoaWxlIChuYl9zYW1wbGVzLS0pIHsKKyAgICAgICAgaWYgKHNhbXBsZXNbMF0gPiBwZWFrKQorICAgICAgICAgICAgcGVhayA9IHNhbXBsZXNbMF07CisgICAgICAgIGVsc2UgaWYgKC1zYW1wbGVzWzBdID4gcGVhaykKKyAgICAgICAgICAgIHBlYWsgPSAtc2FtcGxlc1swXTsKKworICAgICAgICBpZiAoc2FtcGxlc1sxXSA+IHBlYWspCisgICAgICAgICAgICBwZWFrID0gc2FtcGxlc1sxXTsKKyAgICAgICAgZWxzZSBpZiAoLXNhbXBsZXNbMV0gPiBwZWFrKQorICAgICAgICAgICAgcGVhayA9IC1zYW1wbGVzWzFdOworCisgICAgICAgIHNhbXBsZXMgKz0gMjsKKyAgICB9CisKKyAgICAqcGVha19wID0gRkZNQVgocGVhaywgKnBlYWtfcCk7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgc3RlcmVvIFJNUyBsZXZlbC4gTWluaW11bSB2YWx1ZSBpcyBhYm91dCAtMTAwIGRCIGZvcgorICogZGlnaXRhbCBzaWxlbmNlLiBUaGUgOTAgZEIgb2Zmc2V0IGlzIHRvIGNvbXBlbnNhdGUgZm9yIHRoZQorICogbm9ybWFsaXplZCBmbG9hdCByYW5nZSBhbmQgMyBkQiBpcyBmb3Igc3RlcmVvIHNhbXBsZXMuCisgKi8KK3N0YXRpYyBkb3VibGUgY2FsY19zdGVyZW9fcm1zKGNvbnN0IGZsb2F0ICpzYW1wbGVzLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgY291bnQgPSBuYl9zYW1wbGVzOworICAgIGRvdWJsZSBzdW0gPSAxZS0xNjsKKworICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgIHN1bSArPSBzYW1wbGVzWzBdICogc2FtcGxlc1swXSArIHNhbXBsZXNbMV0gKiBzYW1wbGVzWzFdOworICAgICAgICBzYW1wbGVzICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIDEwICogbG9nMTAgKHN1bSAvIG5iX3NhbXBsZXMpICsgOTAuMCAtIDMuMDsKK30KKworLyoKKyAqIE9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBvZiAybmQtb3JkZXIgSUlSIHN0ZXJlbyBmaWx0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGJ1dHRlcl9maWx0ZXJfc3RlcmVvX3NhbXBsZXMoUmVwbGF5R2FpbkNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpzYW1wbGVzLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBjb25zdCBkb3VibGUgKmNvZWZmX2EgPSBzLT5idXR0ZXJfY29lZmZfYTsKKyAgICBjb25zdCBkb3VibGUgKmNvZWZmX2IgPSBzLT5idXR0ZXJfY29lZmZfYjsKKyAgICBmbG9hdCAqaGlzdF9hICAgPSBzLT5idXR0ZXJfaGlzdF9hOworICAgIGZsb2F0ICpoaXN0X2IgICA9IHMtPmJ1dHRlcl9oaXN0X2I7CisgICAgZG91YmxlIGxlZnQsIHJpZ2h0OworICAgIGludCBpLCBqOworCisgICAgaSA9IHMtPmJ1dHRlcl9oaXN0X2k7CisKKyAgICAvLyBJZiBmaWx0ZXIgaGlzdG9yeSBpcyB2ZXJ5IHNtYWxsIG1hZ25pdHVkZSwgY2xlYXIgaXQgY29tcGxldGVseQorICAgIC8vIHRvIHByZXZlbnQgZGVub3JtYWxzIGZyb20gcmF0dGxpbmcgYXJvdW5kIGluIHRoZXJlIGZvcmV2ZXIKKyAgICAvLyAoc2xvd2luZyB1cyBkb3duKS4KKworICAgIGZvciAoaiA9IC00OyBqIDwgMDsgKytqKQorICAgICAgICBpZiAoZmFicyhoaXN0X2FbaSArIGpdKSA+IDFlLTEwIHx8IGZhYnMoaGlzdF9iW2kgKyBqXSkgPiAxZS0xMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgaWYgKCFqKSB7CisgICAgICAgIG1lbXNldChzLT5idXR0ZXJfaGlzdF9hLCAwLCBzaXplb2Yocy0+YnV0dGVyX2hpc3RfYSkpOworICAgICAgICBtZW1zZXQocy0+YnV0dGVyX2hpc3RfYiwgMCwgc2l6ZW9mKHMtPmJ1dHRlcl9oaXN0X2IpKTsKKyAgICB9CisKKyAgICB3aGlsZSAobmJfc2FtcGxlcy0tKSB7CisgICAgICAgIGxlZnQgICA9IChoaXN0X2JbaSAgICBdID0gc2FtcGxlc1swXSkgKiBjb2VmZl9iWzBdOworICAgICAgICByaWdodCAgPSAoaGlzdF9iW2kgKyAxXSA9IHNhbXBsZXNbMV0pICogY29lZmZfYlswXTsKKyAgICAgICAgbGVmdCAgKz0gaGlzdF9iW2kgLSAyXSAqIGNvZWZmX2JbMV0gLSBoaXN0X2FbaSAtIDJdICogY29lZmZfYVsxXTsKKyAgICAgICAgcmlnaHQgKz0gaGlzdF9iW2kgLSAxXSAqIGNvZWZmX2JbMV0gLSBoaXN0X2FbaSAtIDFdICogY29lZmZfYVsxXTsKKyAgICAgICAgbGVmdCAgKz0gaGlzdF9iW2kgLSA0XSAqIGNvZWZmX2JbMl0gLSBoaXN0X2FbaSAtIDRdICogY29lZmZfYVsyXTsKKyAgICAgICAgcmlnaHQgKz0gaGlzdF9iW2kgLSAzXSAqIGNvZWZmX2JbMl0gLSBoaXN0X2FbaSAtIDNdICogY29lZmZfYVsyXTsKKyAgICAgICAgc2FtcGxlc1swXSA9IGhpc3RfYVtpICAgIF0gPSAoZmxvYXQpIGxlZnQ7CisgICAgICAgIHNhbXBsZXNbMV0gPSBoaXN0X2FbaSArIDFdID0gKGZsb2F0KSByaWdodDsKKyAgICAgICAgc2FtcGxlcyArPSAyOworCisgICAgICAgIGlmICgoaSArPSAyKSA9PSAyNTYpIHsKKyAgICAgICAgICAgIG1lbWNweShoaXN0X2EsIGhpc3RfYSArIDI1Miwgc2l6ZW9mKCpoaXN0X2EpICogNCk7CisgICAgICAgICAgICBtZW1jcHkoaGlzdF9iLCBoaXN0X2IgKyAyNTIsIHNpemVvZigqaGlzdF9iKSAqIDQpOworICAgICAgICAgICAgaSA9IDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5idXR0ZXJfaGlzdF9pID0gaTsKK30KKworLyoKKyAqIE9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBvZiAxMHRoLW9yZGVyIElJUiBzdGVyZW8gZmlsdGVyLgorICovCitzdGF0aWMgdm9pZCB5dWxlX2ZpbHRlcl9zdGVyZW9fc2FtcGxlcyhSZXBsYXlHYWluQ29udGV4dCAqcywgY29uc3QgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkc3QsIGludCBuYl9zYW1wbGVzKQoreworICAgIGNvbnN0IGRvdWJsZSAqY29lZmZfYSA9IHMtPnl1bGVfY29lZmZfYTsKKyAgICBjb25zdCBkb3VibGUgKmNvZWZmX2IgPSBzLT55dWxlX2NvZWZmX2I7CisgICAgZmxvYXQgKmhpc3RfYSAgID0gcy0+eXVsZV9oaXN0X2E7CisgICAgZmxvYXQgKmhpc3RfYiAgID0gcy0+eXVsZV9oaXN0X2I7CisgICAgZG91YmxlIGxlZnQsIHJpZ2h0OworICAgIGludCBpLCBqOworCisgICAgaSA9IHMtPnl1bGVfaGlzdF9pOworCisgICAgLy8gSWYgZmlsdGVyIGhpc3RvcnkgaXMgdmVyeSBzbWFsbCBtYWduaXR1ZGUsIGNsZWFyIGl0IGNvbXBsZXRlbHkgdG8KKyAgICAvLyBwcmV2ZW50IGRlbm9ybWFscyBmcm9tIHJhdHRsaW5nIGFyb3VuZCBpbiB0aGVyZSBmb3JldmVyCisgICAgLy8gKHNsb3dpbmcgdXMgZG93bikuCisKKyAgICBmb3IgKGogPSAtMjA7IGogPCAwOyArK2opCisgICAgICAgIGlmIChmYWJzKGhpc3RfYVtpICsgal0pID4gMWUtMTAgfHwgZmFicyhoaXN0X2JbaSArIGpdKSA+IDFlLTEwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBpZiAoIWopIHsKKyAgICAgICAgbWVtc2V0KHMtPnl1bGVfaGlzdF9hLCAwLCBzaXplb2Yocy0+eXVsZV9oaXN0X2EpKTsKKyAgICAgICAgbWVtc2V0KHMtPnl1bGVfaGlzdF9iLCAwLCBzaXplb2Yocy0+eXVsZV9oaXN0X2IpKTsKKyAgICB9CisKKyAgICB3aGlsZSAobmJfc2FtcGxlcy0tKSB7CisgICAgICAgIGxlZnQgICA9IChoaXN0X2JbaV0gPSBzcmNbMF0pICogY29lZmZfYlswXTsKKyAgICAgICAgcmlnaHQgID0gKGhpc3RfYltpICsgMV0gPSBzcmNbMV0pICogY29lZmZfYlswXTsKKyAgICAgICAgbGVmdCAgKz0gaGlzdF9iW2kgLSAgMl0gKiBjb2VmZl9iWyAxXSAtIGhpc3RfYVtpIC0gIDJdICogY29lZmZfYVsxIF07CisgICAgICAgIHJpZ2h0ICs9IGhpc3RfYltpIC0gIDFdICogY29lZmZfYlsgMV0gLSBoaXN0X2FbaSAtICAxXSAqIGNvZWZmX2FbMSBdOworICAgICAgICBsZWZ0ICArPSBoaXN0X2JbaSAtICA0XSAqIGNvZWZmX2JbIDJdIC0gaGlzdF9hW2kgLSAgNF0gKiBjb2VmZl9hWzIgXTsKKyAgICAgICAgcmlnaHQgKz0gaGlzdF9iW2kgLSAgM10gKiBjb2VmZl9iWyAyXSAtIGhpc3RfYVtpIC0gIDNdICogY29lZmZfYVsyIF07CisgICAgICAgIGxlZnQgICs9IGhpc3RfYltpIC0gIDZdICogY29lZmZfYlsgM10gLSBoaXN0X2FbaSAtICA2XSAqIGNvZWZmX2FbMyBdOworICAgICAgICByaWdodCArPSBoaXN0X2JbaSAtICA1XSAqIGNvZWZmX2JbIDNdIC0gaGlzdF9hW2kgLSAgNV0gKiBjb2VmZl9hWzMgXTsKKyAgICAgICAgbGVmdCAgKz0gaGlzdF9iW2kgLSAgOF0gKiBjb2VmZl9iWyA0XSAtIGhpc3RfYVtpIC0gIDhdICogY29lZmZfYVs0IF07CisgICAgICAgIHJpZ2h0ICs9IGhpc3RfYltpIC0gIDddICogY29lZmZfYlsgNF0gLSBoaXN0X2FbaSAtICA3XSAqIGNvZWZmX2FbNCBdOworICAgICAgICBsZWZ0ICArPSBoaXN0X2JbaSAtIDEwXSAqIGNvZWZmX2JbIDVdIC0gaGlzdF9hW2kgLSAxMF0gKiBjb2VmZl9hWzUgXTsKKyAgICAgICAgcmlnaHQgKz0gaGlzdF9iW2kgLSAgOV0gKiBjb2VmZl9iWyA1XSAtIGhpc3RfYVtpIC0gIDldICogY29lZmZfYVs1IF07CisgICAgICAgIGxlZnQgICs9IGhpc3RfYltpIC0gMTJdICogY29lZmZfYlsgNl0gLSBoaXN0X2FbaSAtIDEyXSAqIGNvZWZmX2FbNiBdOworICAgICAgICByaWdodCArPSBoaXN0X2JbaSAtIDExXSAqIGNvZWZmX2JbIDZdIC0gaGlzdF9hW2kgLSAxMV0gKiBjb2VmZl9hWzYgXTsKKyAgICAgICAgbGVmdCAgKz0gaGlzdF9iW2kgLSAxNF0gKiBjb2VmZl9iWyA3XSAtIGhpc3RfYVtpIC0gMTRdICogY29lZmZfYVs3IF07CisgICAgICAgIHJpZ2h0ICs9IGhpc3RfYltpIC0gMTNdICogY29lZmZfYlsgN10gLSBoaXN0X2FbaSAtIDEzXSAqIGNvZWZmX2FbNyBdOworICAgICAgICBsZWZ0ICArPSBoaXN0X2JbaSAtIDE2XSAqIGNvZWZmX2JbIDhdIC0gaGlzdF9hW2kgLSAxNl0gKiBjb2VmZl9hWzggXTsKKyAgICAgICAgcmlnaHQgKz0gaGlzdF9iW2kgLSAxNV0gKiBjb2VmZl9iWyA4XSAtIGhpc3RfYVtpIC0gMTVdICogY29lZmZfYVs4IF07CisgICAgICAgIGxlZnQgICs9IGhpc3RfYltpIC0gMThdICogY29lZmZfYlsgOV0gLSBoaXN0X2FbaSAtIDE4XSAqIGNvZWZmX2FbOSBdOworICAgICAgICByaWdodCArPSBoaXN0X2JbaSAtIDE3XSAqIGNvZWZmX2JbIDldIC0gaGlzdF9hW2kgLSAxN10gKiBjb2VmZl9hWzkgXTsKKyAgICAgICAgbGVmdCAgKz0gaGlzdF9iW2kgLSAyMF0gKiBjb2VmZl9iWzEwXSAtIGhpc3RfYVtpIC0gMjBdICogY29lZmZfYVsxMF07CisgICAgICAgIHJpZ2h0ICs9IGhpc3RfYltpIC0gMTldICogY29lZmZfYlsxMF0gLSBoaXN0X2FbaSAtIDE5XSAqIGNvZWZmX2FbMTBdOworICAgICAgICBkc3RbMF0gPSBoaXN0X2FbaSAgICBdID0gKGZsb2F0KWxlZnQ7CisgICAgICAgIGRzdFsxXSA9IGhpc3RfYVtpICsgMV0gPSAoZmxvYXQpcmlnaHQ7CisgICAgICAgIHNyYyArPSAyOworICAgICAgICBkc3QgKz0gMjsKKworICAgICAgICBpZiAoKGkgKz0gMikgPT0gMjU2KSB7CisgICAgICAgICAgICBtZW1jcHkoaGlzdF9hLCBoaXN0X2EgKyAyMzYsIHNpemVvZigqaGlzdF9hKSAqIDIwKTsKKyAgICAgICAgICAgIG1lbWNweShoaXN0X2IsIGhpc3RfYiArIDIzNiwgc2l6ZW9mKCpoaXN0X2IpICogMjApOworICAgICAgICAgICAgaSA9IDIwOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+eXVsZV9oaXN0X2kgPSBpOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBSZXBsYXlHYWluIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCBsb3VkbmVzcyBoaXN0b2dyYW07CisgKiBjbGlwIHRvIC0yNCAvICs2NCBkQi4KKyAqLworc3RhdGljIGZsb2F0IGNhbGNfcmVwbGF5Z2Fpbih1aW50MzJfdCAqaGlzdG9ncmFtKQoreworICAgIHVpbnQzMl90IGxvdWRfY291bnQgPSAwLCB0b3RhbF93aW5kb3dzID0gMDsKKyAgICBmbG9hdCBnYWluOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEhJU1RPR1JBTV9TTE9UUzsgaSsrKQorICAgICAgICB0b3RhbF93aW5kb3dzICs9IGhpc3RvZ3JhbSBbaV07CisKKyAgICB3aGlsZSAoaS0tKQorICAgICAgICBpZiAoKGxvdWRfY291bnQgKz0gaGlzdG9ncmFtIFtpXSkgKiAyMCA+PSB0b3RhbF93aW5kb3dzKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBnYWluID0gKGZsb2F0KSg2NC41NCAtIGkgLyAxMDAuMCk7CisKKyAgICByZXR1cm4gYXZfY2xpcGYoZ2FpbiwgLTI0LjAsIDY0LjApOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgUmVwbGF5R2FpbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgdWludDMyX3QgbGV2ZWw7CisgICAgQVZGcmFtZSAqb3V0OworCisgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIGluLT5uYl9zYW1wbGVzKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgY2FsY19zdGVyZW9fcGVhaygoZmxvYXQgKilpbi0+ZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5uYl9zYW1wbGVzLCAmcy0+cGVhayk7CisgICAgeXVsZV9maWx0ZXJfc3RlcmVvX3NhbXBsZXMocywgKGNvbnN0IGZsb2F0ICopaW4tPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopb3V0LT5kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+bmJfc2FtcGxlcyk7CisgICAgYnV0dGVyX2ZpbHRlcl9zdGVyZW9fc2FtcGxlcyhzLCAoZmxvYXQgKilvdXQtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPm5iX3NhbXBsZXMpOworICAgIGxldmVsID0gKHVpbnQzMl90KWZsb29yKDEwMCAqIGNhbGNfc3RlcmVvX3JtcygoZmxvYXQgKilvdXQtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+bmJfc2FtcGxlcykpOworICAgIGxldmVsID0gYXZfY2xpcChsZXZlbCwgMCwgSElTVE9HUkFNX1NMT1RTIC0gMSk7CisKKyAgICBzLT5oaXN0b2dyYW1bbGV2ZWxdKys7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgaW4pOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBSZXBsYXlHYWluQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBmbG9hdCBnYWluID0gY2FsY19yZXBsYXlnYWluKHMtPmhpc3RvZ3JhbSk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgInRyYWNrX2dhaW4gPSAlKy4yZiBkQlxuIiwgZ2Fpbik7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJ0cmFja19wZWFrID0gJS42ZlxuIiwgcy0+cGVhayk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCByZXBsYXlnYWluX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgcmVwbGF5Z2Fpbl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfcmVwbGF5Z2FpbiA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJyZXBsYXlnYWluIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZXBsYXlHYWluIHNjYW5uZXIuIiksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFJlcGxheUdhaW5Db250ZXh0KSwKKyAgICAuaW5wdXRzICAgICAgICA9IHJlcGxheWdhaW5faW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gcmVwbGF5Z2Fpbl9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9yZXNhbXBsZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX3Jlc2FtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1ZDRiYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9yZXNhbXBsZS5jCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHNhbXBsZSBmb3JtYXQgYW5kIGNoYW5uZWwgbGF5b3V0IGNvbnZlcnNpb24gYXVkaW8gZmlsdGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImxpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZS5oIgorCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2cjsKKyAgICBBVkRpY3Rpb25hcnkgKm9wdGlvbnM7CisKKyAgICBpbnQ2NF90IG5leHRfcHRzOworICAgIGludDY0X3QgbmV4dF9pbl9wdHM7CisKKyAgICAvKiBzZXQgYnkgZmlsdGVyX2ZyYW1lKCkgdG8gc2lnbmFsIGFuIG91dHB1dCBmcmFtZSB0byByZXF1ZXN0X2ZyYW1lKCkgKi8KKyAgICBpbnQgZ290X291dHB1dDsKK30gUmVzYW1wbGVDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZEaWN0aW9uYXJ5ICoqb3B0cykKK3sKKyAgICBSZXNhbXBsZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZDbGFzcyAqYXZyX2NsYXNzID0gYXZyZXNhbXBsZV9nZXRfY2xhc3MoKTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IE5VTEw7CisKKyAgICB3aGlsZSAoKGUgPSBhdl9kaWN0X2dldCgqb3B0cywgIiIsIGUsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgIGlmIChhdl9vcHRfZmluZCgmYXZyX2NsYXNzLCBlLT5rZXksIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKIHwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+b3B0aW9ucywgZS0+a2V5LCBlLT52YWx1ZSwgMCk7CisgICAgfQorCisgICAgZSA9IE5VTEw7CisgICAgd2hpbGUgKChlID0gYXZfZGljdF9nZXQocy0+b3B0aW9ucywgIiIsIGUsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKQorICAgICAgICBhdl9kaWN0X3NldChvcHRzLCBlLT5rZXksIE5VTEwsIDApOworCisgICAgLyogZG8gbm90IGFsbG93IHRoZSB1c2VyIHRvIG92ZXJyaWRlIGJhc2ljIGZvcm1hdCBvcHRpb25zICovCisgICAgYXZfZGljdF9zZXQoJnMtPm9wdGlvbnMsICAiaW5fY2hhbm5lbF9sYXlvdXQiLCBOVUxMLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmcy0+b3B0aW9ucywgIm91dF9jaGFubmVsX2xheW91dCIsIE5VTEwsIDApOworICAgIGF2X2RpY3Rfc2V0KCZzLT5vcHRpb25zLCAgImluX3NhbXBsZV9mbXQiLCAgICAgTlVMTCwgMCk7CisgICAgYXZfZGljdF9zZXQoJnMtPm9wdGlvbnMsICJvdXRfc2FtcGxlX2ZtdCIsICAgICBOVUxMLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmcy0+b3B0aW9ucywgICJpbl9zYW1wbGVfcmF0ZSIsICAgIE5VTEwsIDApOworICAgIGF2X2RpY3Rfc2V0KCZzLT5vcHRpb25zLCAib3V0X3NhbXBsZV9yYXRlIiwgICAgTlVMTCwgMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUmVzYW1wbGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKHMtPmF2cikgeworICAgICAgICBhdnJlc2FtcGxlX2Nsb3NlKHMtPmF2cik7CisgICAgICAgIGF2cmVzYW1wbGVfZnJlZSgmcy0+YXZyKTsKKyAgICB9CisgICAgYXZfZGljdF9mcmVlKCZzLT5vcHRpb25zKTsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyTGluayAqaW5saW5rICA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKworICAgIEFWRmlsdGVyRm9ybWF0cyAgICAgICAgKmluX2Zvcm1hdHMgICAgICA9IGZmX2FsbF9mb3JtYXRzKEFWTUVESUFfVFlQRV9BVURJTyk7CisgICAgQVZGaWx0ZXJGb3JtYXRzICAgICAgICAqb3V0X2Zvcm1hdHMgICAgID0gZmZfYWxsX2Zvcm1hdHMoQVZNRURJQV9UWVBFX0FVRElPKTsKKyAgICBBVkZpbHRlckZvcm1hdHMgICAgICAgICppbl9zYW1wbGVyYXRlcyAgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBBVkZpbHRlckZvcm1hdHMgICAgICAgICpvdXRfc2FtcGxlcmF0ZXMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICppbl9sYXlvdXRzICAgICAgPSBmZl9hbGxfY2hhbm5lbF9sYXlvdXRzKCk7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqb3V0X2xheW91dHMgICAgID0gZmZfYWxsX2NoYW5uZWxfbGF5b3V0cygpOworCisgICAgZmZfZm9ybWF0c19yZWYoaW5fZm9ybWF0cywgICZpbmxpbmstPm91dF9mb3JtYXRzKTsKKyAgICBmZl9mb3JtYXRzX3JlZihvdXRfZm9ybWF0cywgJm91dGxpbmstPmluX2Zvcm1hdHMpOworCisgICAgZmZfZm9ybWF0c19yZWYoaW5fc2FtcGxlcmF0ZXMsICAmaW5saW5rLT5vdXRfc2FtcGxlcmF0ZXMpOworICAgIGZmX2Zvcm1hdHNfcmVmKG91dF9zYW1wbGVyYXRlcywgJm91dGxpbmstPmluX3NhbXBsZXJhdGVzKTsKKworICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYoaW5fbGF5b3V0cywgICZpbmxpbmstPm91dF9jaGFubmVsX2xheW91dHMpOworICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYob3V0X2xheW91dHMsICZvdXRsaW5rLT5pbl9jaGFubmVsX2xheW91dHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBSZXNhbXBsZUNvbnRleHQgICAqcyA9IGN0eC0+cHJpdjsKKyAgICBjaGFyIGJ1ZjFbNjRdLCBidWYyWzY0XTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHMtPmF2cikgeworICAgICAgICBhdnJlc2FtcGxlX2Nsb3NlKHMtPmF2cik7CisgICAgICAgIGF2cmVzYW1wbGVfZnJlZSgmcy0+YXZyKTsKKyAgICB9CisKKyAgICBpZiAoaW5saW5rLT5jaGFubmVsX2xheW91dCA9PSBvdXRsaW5rLT5jaGFubmVsX2xheW91dCAmJgorICAgICAgICBpbmxpbmstPnNhbXBsZV9yYXRlICAgID09IG91dGxpbmstPnNhbXBsZV9yYXRlICAgICYmCisgICAgICAgIChpbmxpbmstPmZvcm1hdCAgICAgICAgPT0gb3V0bGluay0+Zm9ybWF0IHx8CisgICAgICAgIChhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoaW5saW5rLT5jaGFubmVsX2xheW91dCkgID09IDEgJiYKKyAgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhvdXRsaW5rLT5jaGFubmVsX2xheW91dCkgPT0gMSAmJgorICAgICAgICAgYXZfZ2V0X3BsYW5hcl9zYW1wbGVfZm10KGlubGluay0+Zm9ybWF0KSA9PQorICAgICAgICAgYXZfZ2V0X3BsYW5hcl9zYW1wbGVfZm10KG91dGxpbmstPmZvcm1hdCkpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIShzLT5hdnIgPSBhdnJlc2FtcGxlX2FsbG9jX2NvbnRleHQoKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAocy0+b3B0aW9ucykgeworICAgICAgICBpbnQgcmV0OworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IE5VTEw7CisgICAgICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KHMtPm9wdGlvbnMsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAibGF2ciBvcHRpb246ICVzPSVzXG4iLCBlLT5rZXksIGUtPnZhbHVlKTsKKworICAgICAgICByZXQgPSBhdl9vcHRfc2V0X2RpY3Qocy0+YXZyLCAmcy0+b3B0aW9ucyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBhdl9vcHRfc2V0X2ludChzLT5hdnIsICAiaW5fY2hhbm5lbF9sYXlvdXQiLCBpbmxpbmsgLT5jaGFubmVsX2xheW91dCwgMCk7CisgICAgYXZfb3B0X3NldF9pbnQocy0+YXZyLCAib3V0X2NoYW5uZWxfbGF5b3V0Iiwgb3V0bGluay0+Y2hhbm5lbF9sYXlvdXQsIDApOworICAgIGF2X29wdF9zZXRfaW50KHMtPmF2ciwgICJpbl9zYW1wbGVfZm10IiwgICAgIGlubGluayAtPmZvcm1hdCwgICAgICAgICAwKTsKKyAgICBhdl9vcHRfc2V0X2ludChzLT5hdnIsICJvdXRfc2FtcGxlX2ZtdCIsICAgICBvdXRsaW5rLT5mb3JtYXQsICAgICAgICAgMCk7CisgICAgYXZfb3B0X3NldF9pbnQocy0+YXZyLCAgImluX3NhbXBsZV9yYXRlIiwgICAgaW5saW5rIC0+c2FtcGxlX3JhdGUsICAgIDApOworICAgIGF2X29wdF9zZXRfaW50KHMtPmF2ciwgIm91dF9zYW1wbGVfcmF0ZSIsICAgIG91dGxpbmstPnNhbXBsZV9yYXRlLCAgICAwKTsKKworICAgIGlmICgocmV0ID0gYXZyZXNhbXBsZV9vcGVuKHMtPmF2cikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKXsgMSwgb3V0bGluay0+c2FtcGxlX3JhdGUgfTsKKyAgICBzLT5uZXh0X3B0cyAgICAgICAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBzLT5uZXh0X2luX3B0cyAgICAgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoYnVmMSwgc2l6ZW9mKGJ1ZjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIGlubGluayAtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1ZjIsIHNpemVvZihidWYyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBvdXRsaW5rLT5jaGFubmVsX2xheW91dCk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICJmbXQ6JXMgc3JhdGU6JWQgY2w6JXMgLT4gZm10OiVzIHNyYXRlOiVkIGNsOiVzXG4iLAorICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGlubGluayAtPmZvcm1hdCksIGlubGluayAtPnNhbXBsZV9yYXRlLCBidWYxLAorICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKG91dGxpbmstPmZvcm1hdCksIG91dGxpbmstPnNhbXBsZV9yYXRlLCBidWYyKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIFJlc2FtcGxlQ29udGV4dCAgICpzID0gY3R4LT5wcml2OworICAgIGludCByZXQgPSAwOworCisgICAgcy0+Z290X291dHB1dCA9IDA7CisgICAgd2hpbGUgKHJldCA+PSAwICYmICFzLT5nb3Rfb3V0cHV0KQorICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKworICAgIC8qIGZsdXNoIHRoZSBsYXZyIGRlbGF5IGJ1ZmZlciAqLworICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgcy0+YXZyKSB7CisgICAgICAgIEFWRnJhbWUgKmZyYW1lOworICAgICAgICBpbnQgbmJfc2FtcGxlcyA9IGF2cmVzYW1wbGVfZ2V0X291dF9zYW1wbGVzKHMtPmF2ciwgMCk7CisKKyAgICAgICAgaWYgKCFuYl9zYW1wbGVzKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBmcmFtZSA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHJldCA9IGF2cmVzYW1wbGVfY29udmVydChzLT5hdnIsIGZyYW1lLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmxpbmVzaXplWzBdLCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCk7CisgICAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIChyZXQgPT0gMCkgPyBBVkVSUk9SX0VPRiA6IHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lLT5wdHMgPSBzLT5uZXh0X3B0czsKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBSZXNhbXBsZUNvbnRleHQgICAgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIGludCByZXQ7CisKKyAgICBpZiAocy0+YXZyKSB7CisgICAgICAgIEFWRnJhbWUgKm91dDsKKyAgICAgICAgaW50IGRlbGF5LCBuYl9zYW1wbGVzOworCisgICAgICAgIC8qIG1heGltdW0gcG9zc2libGUgc2FtcGxlcyBsYXZyIGNhbiBvdXRwdXQgKi8KKyAgICAgICAgZGVsYXkgICAgICA9IGF2cmVzYW1wbGVfZ2V0X2RlbGF5KHMtPmF2cik7CisgICAgICAgIG5iX3NhbXBsZXMgPSBhdnJlc2FtcGxlX2dldF9vdXRfc2FtcGxlcyhzLT5hdnIsIGluLT5uYl9zYW1wbGVzKTsKKworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5iX3NhbXBsZXMpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZyZXNhbXBsZV9jb252ZXJ0KHMtPmF2ciwgb3V0LT5leHRlbmRlZF9kYXRhLCBvdXQtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfc2FtcGxlcywgaW4tPmV4dGVuZGVkX2RhdGEsIGluLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKHJldCA8PSAwKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgYXZfYXNzZXJ0MCghYXZyZXNhbXBsZV9hdmFpbGFibGUocy0+YXZyKSk7CisKKyAgICAgICAgaWYgKHMtPm5leHRfcHRzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBpZiAoaW4tPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiRmlyc3QgdGltZXN0YW1wIGlzIG1pc3NpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgImFzc3VtaW5nIDAuXG4iKTsKKyAgICAgICAgICAgICAgICBzLT5uZXh0X3B0cyA9IDA7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBzLT5uZXh0X3B0cyA9IGF2X3Jlc2NhbGVfcShpbi0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgIG91dC0+bmJfc2FtcGxlcyA9IHJldDsKKworICAgICAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dC0+c2FtcGxlX3JhdGUgPSBvdXRsaW5rLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIC8qIE9ubHkgY29udmVydCBpbi0+cHRzIGlmIHRoZXJlIGlzIGEgZGlzY29udGludW91cyBqdW1wLgorICAgICAgICAgICAgICAgVGhpcyBlbnN1cmVzIHRoYXQgb3V0LT5wdHMgdHJhY2tzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBhY3R1YWxseQorICAgICAgICAgICAgICAgb3V0cHV0IGJ5IHRoZSByZXNhbXBsZXIgaW4gdGhlIGFic2VuY2Ugb2Ygc3VjaCBhIGp1bXAuCisgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSByb3VuZGluZyBpbiBhdl9yZXNjYWxlX3EoKSBhbmQgYXZfcmVzY2FsZSgpCisgICAgICAgICAgICAgICBjYXVzZXMgb2ZmLWJ5LTEgZXJyb3JzLiAqLworICAgICAgICAgICAgaWYgKGluLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgaW4tPnB0cyAhPSBzLT5uZXh0X2luX3B0cykgeworICAgICAgICAgICAgICAgIG91dC0+cHRzID0gYXZfcmVzY2FsZV9xKGluLT5wdHMsIGlubGluay0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlKGRlbGF5LCBvdXRsaW5rLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluay0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgb3V0LT5wdHMgPSBzLT5uZXh0X3B0czsKKworICAgICAgICAgICAgcy0+bmV4dF9wdHMgPSBvdXQtPnB0cyArIG91dC0+bmJfc2FtcGxlczsKKyAgICAgICAgICAgIHMtPm5leHRfaW5fcHRzID0gaW4tPnB0cyArIGluLT5uYl9zYW1wbGVzOworCisgICAgICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKKyAgICAgICAgICAgIHMtPmdvdF9vdXRwdXQgPSAxOworICAgICAgICB9CisKK2ZhaWw6CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbi0+Zm9ybWF0ID0gb3V0bGluay0+Zm9ybWF0OworICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgaW4pOworICAgICAgICBzLT5nb3Rfb3V0cHV0ID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyAqcmVzYW1wbGVfY2hpbGRfY2xhc3NfbmV4dChjb25zdCBBVkNsYXNzICpwcmV2KQoreworICAgIHJldHVybiBwcmV2ID8gTlVMTCA6IGF2cmVzYW1wbGVfZ2V0X2NsYXNzKCk7Cit9CisKK3N0YXRpYyB2b2lkICpyZXNhbXBsZV9jaGlsZF9uZXh0KHZvaWQgKm9iaiwgdm9pZCAqcHJldikKK3sKKyAgICBSZXNhbXBsZUNvbnRleHQgKnMgPSBvYmo7CisgICAgcmV0dXJuIHByZXYgPyBOVUxMIDogcy0+YXZyOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyByZXNhbXBsZV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgICA9ICJyZXNhbXBsZSIsCisgICAgLml0ZW1fbmFtZSAgICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAudmVyc2lvbiAgICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2hpbGRfY2xhc3NfbmV4dCA9IHJlc2FtcGxlX2NoaWxkX2NsYXNzX25leHQsCisgICAgLmNoaWxkX25leHQgICAgICAgPSByZXNhbXBsZV9jaGlsZF9uZXh0LAorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX3Jlc2FtcGxlX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lICA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfcmVzYW1wbGVfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZQorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX3Jlc2FtcGxlID0geworICAgIC5uYW1lICAgICAgICAgID0gInJlc2FtcGxlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdWRpbyByZXNhbXBsaW5nIGFuZCBjb252ZXJzaW9uLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFJlc2FtcGxlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmcmVzYW1wbGVfY2xhc3MsCisgICAgLmluaXRfZGljdCAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGF2ZmlsdGVyX2FmX3Jlc2FtcGxlX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX2FmX3Jlc2FtcGxlX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX3NpbGVuY2VkZXRlY3QuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9zaWxlbmNlZGV0ZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3ZDJlNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9zaWxlbmNlZGV0ZWN0LmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQ2zDqW1lbnQgQsWTc2NoIDx1IHBraCBtZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQXVkaW8gc2lsZW5jZSBkZXRlY3RvcgorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPiAvKiBEQkxfTUFYICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVzdGFtcC5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgU2lsZW5jZURldGVjdENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGRvdWJsZSBub2lzZTsgICAgICAgICAgICAgICAvLy88IG5vaXNlIGFtcGxpdHVkZSByYXRpbworICAgIGRvdWJsZSBkdXJhdGlvbjsgICAgICAgICAgICAvLy88IG1pbmltdW0gZHVyYXRpb24gb2Ygc2lsZW5jZSB1bnRpbCBub3RpZmljYXRpb24KKyAgICBpbnQ2NF90IG5iX251bGxfc2FtcGxlczsgICAgLy8vPCBjdXJyZW50IG51bWJlciBvZiBjb250aW51b3VzIHplcm8gc2FtcGxlcworICAgIGludDY0X3Qgc3RhcnQ7ICAgICAgICAgICAgICAvLy88IGlmIHNpbGVuY2UgaXMgZGV0ZWN0ZWQsIHRoaXMgdmFsdWUgY29udGFpbnMgdGhlIHRpbWUgb2YgdGhlIGZpcnN0IHplcm8gc2FtcGxlCisgICAgaW50IGxhc3Rfc2FtcGxlX3JhdGU7ICAgICAgIC8vLzwgbGFzdCBzYW1wbGUgcmF0ZSB0byBjaGVjayBmb3Igc2FtcGxlIHJhdGUgY2hhbmdlcworCisgICAgdm9pZCAoKnNpbGVuY2VkZXRlY3QpKHN0cnVjdCBTaWxlbmNlRGV0ZWN0Q29udGV4dCAqcywgQVZGcmFtZSAqaW5zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50NjRfdCBuYl9zYW1wbGVzX25vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2UpOworfSBTaWxlbmNlRGV0ZWN0Q29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU2lsZW5jZURldGVjdENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19BVURJT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIHNpbGVuY2VkZXRlY3Rfb3B0aW9uc1tdID0geworICAgIHsgIm4iLCAgICAgICAgICJzZXQgbm9pc2UgdG9sZXJhbmNlIiwgICAgICAgICAgICAgIE9GRlNFVChub2lzZSksICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuMDAxfSwgICAgICAgICAgMCwgREJMX01BWCwgIEZMQUdTIH0sCisgICAgeyAibm9pc2UiLCAgICAgInNldCBub2lzZSB0b2xlcmFuY2UiLCAgICAgICAgICAgICAgT0ZGU0VUKG5vaXNlKSwgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC4wMDF9LCAgICAgICAgICAwLCBEQkxfTUFYLCAgRkxBR1MgfSwKKyAgICB7ICJkIiwgICAgICAgICAic2V0IG1pbmltdW0gZHVyYXRpb24gaW4gc2Vjb25kcyIsICBPRkZTRVQoZHVyYXRpb24pLCAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0yLn0sICAgICAgICAgICAgIDAsIDI0KjYwKjYwLCBGTEFHUyB9LAorICAgIHsgImR1cmF0aW9uIiwgICJzZXQgbWluaW11bSBkdXJhdGlvbiBpbiBzZWNvbmRzIiwgIE9GRlNFVChkdXJhdGlvbiksICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTIufSwgICAgICAgICAgICAgMCwgMjQqNjAqNjAsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzaWxlbmNlZGV0ZWN0KTsKKworc3RhdGljIGNoYXIgKmdldF9tZXRhZGF0YV92YWwoQVZGcmFtZSAqaW5zYW1wbGVzLCBjb25zdCBjaGFyICprZXkpCit7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmUgPSBhdl9kaWN0X2dldChpbnNhbXBsZXMtPm1ldGFkYXRhLCBrZXksIE5VTEwsIDApOworICAgIHJldHVybiBlICYmIGUtPnZhbHVlID8gZS0+dmFsdWUgOiBOVUxMOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHVwZGF0ZShTaWxlbmNlRGV0ZWN0Q29udGV4dCAqcywgQVZGcmFtZSAqaW5zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3NpbGVuY2UsIGludDY0X3QgbmJfc2FtcGxlc19ub3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZSkKK3sKKyAgICBpZiAoaXNfc2lsZW5jZSkgeworICAgICAgICBpZiAoIXMtPnN0YXJ0KSB7CisgICAgICAgICAgICBzLT5uYl9udWxsX3NhbXBsZXMrKzsKKyAgICAgICAgICAgIGlmIChzLT5uYl9udWxsX3NhbXBsZXMgPj0gbmJfc2FtcGxlc19ub3RpZnkpIHsKKyAgICAgICAgICAgICAgICBzLT5zdGFydCA9IGluc2FtcGxlcy0+cHRzIC0gKGludDY0X3QpKHMtPmR1cmF0aW9uIC8gYXZfcTJkKHRpbWVfYmFzZSkgKyAuNSk7CisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJmluc2FtcGxlcy0+bWV0YWRhdGEsICJsYXZmaS5zaWxlbmNlX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKHMtPnN0YXJ0LCAmdGltZV9iYXNlKSwgMCk7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAic2lsZW5jZV9zdGFydDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9tZXRhZGF0YV92YWwoaW5zYW1wbGVzLCAibGF2Zmkuc2lsZW5jZV9zdGFydCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzLT5zdGFydCkgeworICAgICAgICAgICAgYXZfZGljdF9zZXQoJmluc2FtcGxlcy0+bWV0YWRhdGEsICJsYXZmaS5zaWxlbmNlX2VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGluc2FtcGxlcy0+cHRzLCAmdGltZV9iYXNlKSwgMCk7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmaW5zYW1wbGVzLT5tZXRhZGF0YSwgImxhdmZpLnNpbGVuY2VfZHVyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgYXZfdHMydGltZXN0cihpbnNhbXBsZXMtPnB0cyAtIHMtPnN0YXJ0LCAmdGltZV9iYXNlKSwgMCk7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgInNpbGVuY2VfZW5kOiAlcyB8IHNpbGVuY2VfZHVyYXRpb246ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGdldF9tZXRhZGF0YV92YWwoaW5zYW1wbGVzLCAibGF2Zmkuc2lsZW5jZV9lbmQiKSwKKyAgICAgICAgICAgICAgICAgICBnZXRfbWV0YWRhdGFfdmFsKGluc2FtcGxlcywgImxhdmZpLnNpbGVuY2VfZHVyYXRpb24iKSk7CisgICAgICAgIH0KKyAgICAgICAgcy0+bmJfbnVsbF9zYW1wbGVzID0gcy0+c3RhcnQgPSAwOworICAgIH0KK30KKworI2RlZmluZSBTSUxFTkNFX0RFVEVDVChuYW1lLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgc2lsZW5jZWRldGVjdF8jI25hbWUoU2lsZW5jZURldGVjdENvbnRleHQgKnMsIEFWRnJhbWUgKmluc2FtcGxlcywgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludDY0X3QgbmJfc2FtcGxlc19ub3RpZnksICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHR5cGUgKnAgPSAoY29uc3QgdHlwZSAqKWluc2FtcGxlcy0+ZGF0YVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHR5cGUgbm9pc2UgPSBzLT5ub2lzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyssIHArKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1cGRhdGUocywgaW5zYW1wbGVzLCAqcCA8IG5vaXNlICYmICpwID4gLW5vaXNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgbmJfc2FtcGxlc19ub3RpZnksIHRpbWVfYmFzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitTSUxFTkNFX0RFVEVDVChkYmwsIGRvdWJsZSkKK1NJTEVOQ0VfREVURUNUKGZsdCwgZmxvYXQpCitTSUxFTkNFX0RFVEVDVChzMzIsIGludDMyX3QpCitTSUxFTkNFX0RFVEVDVChzMTYsIGludDE2X3QpCisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgU2lsZW5jZURldGVjdENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTDogcy0+c2lsZW5jZWRldGVjdCA9IHNpbGVuY2VkZXRlY3RfZGJsOyBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUOiBzLT5zaWxlbmNlZGV0ZWN0ID0gc2lsZW5jZWRldGVjdF9mbHQ7IGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzI6CisgICAgICAgIHMtPm5vaXNlICo9IElOVDMyX01BWDsKKyAgICAgICAgcy0+c2lsZW5jZWRldGVjdCA9IHNpbGVuY2VkZXRlY3RfczMyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2OgorICAgICAgICBzLT5ub2lzZSAqPSBJTlQxNl9NQVg7CisgICAgICAgIHMtPnNpbGVuY2VkZXRlY3QgPSBzaWxlbmNlZGV0ZWN0X3MxNjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnNhbXBsZXMpCit7CisgICAgU2lsZW5jZURldGVjdENvbnRleHQgKnMgICAgICAgICA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IGludCBuYl9jaGFubmVscyAgICAgICAgICAgPSBpbmxpbmstPmNoYW5uZWxzOworICAgIGNvbnN0IGludCBzcmF0ZSAgICAgICAgICAgICAgICAgPSBpbmxpbmstPnNhbXBsZV9yYXRlOworICAgIGNvbnN0IGludCBuYl9zYW1wbGVzICAgICAgICAgICAgPSBpbnNhbXBsZXMtPm5iX3NhbXBsZXMgICAgICogbmJfY2hhbm5lbHM7CisgICAgY29uc3QgaW50NjRfdCBuYl9zYW1wbGVzX25vdGlmeSA9IHNyYXRlICogcy0+ZHVyYXRpb24gKiBuYl9jaGFubmVsczsKKworICAgIC8vIHNjYWxlIG51bWJlciBvZiBudWxsIHNhbXBsZXMgdG8gdGhlIG5ldyBzYW1wbGUgcmF0ZQorICAgIGlmIChzLT5sYXN0X3NhbXBsZV9yYXRlICYmIHMtPmxhc3Rfc2FtcGxlX3JhdGUgIT0gc3JhdGUpCisgICAgICAgIHMtPm5iX251bGxfc2FtcGxlcyA9IHNyYXRlICogcy0+bmJfbnVsbF9zYW1wbGVzIC8gcy0+bGFzdF9zYW1wbGVfcmF0ZTsKKyAgICBzLT5sYXN0X3NhbXBsZV9yYXRlID0gc3JhdGU7CisKKyAgICAvLyBUT0RPOiBkb2N1bWVudCBtZXRhZGF0YQorICAgIHMtPnNpbGVuY2VkZXRlY3QocywgaW5zYW1wbGVzLCBuYl9zYW1wbGVzLCBuYl9zYW1wbGVzX25vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgIGlubGluay0+dGltZV9iYXNlKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoaW5saW5rLT5kc3QtPm91dHB1dHNbMF0sIGluc2FtcGxlcyk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHMgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRzW10gPSB7CisgICAgICAgIEFWX1NBTVBMRV9GTVRfREJMLAorICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzIsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9OworCisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2xheW91dHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBsYXlvdXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9mbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisKKyAgICBmb3JtYXRzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmb3JtYXRzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc2lsZW5jZWRldGVjdF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNpbGVuY2VkZXRlY3Rfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX3NpbGVuY2VkZXRlY3QgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAic2lsZW5jZWRldGVjdCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGV0ZWN0IHNpbGVuY2UuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoU2lsZW5jZURldGVjdENvbnRleHQpLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IHNpbGVuY2VkZXRlY3RfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gc2lsZW5jZWRldGVjdF9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnNpbGVuY2VkZXRlY3RfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX3NpbGVuY2VyZW1vdmUuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9zaWxlbmNlcmVtb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiNjRjZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl9zaWxlbmNlcmVtb3ZlLmMKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSGVpa2tpIExlaW5vbmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgQ2hyaXMgQmFnd2VsbAorICogQ29weXJpZ2h0IChjKSAyMDAzIERvbm5pZSBTbWl0aAorICogQ29weXJpZ2h0IChjKSAyMDE0IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4gLyogREJMX01BWCAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lc3RhbXAuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2VudW0gU2lsZW5jZU1vZGUgeworICAgIFNJTEVOQ0VfVFJJTSwKKyAgICBTSUxFTkNFX1RSSU1fRkxVU0gsCisgICAgU0lMRU5DRV9DT1BZLAorICAgIFNJTEVOQ0VfQ09QWV9GTFVTSCwKKyAgICBTSUxFTkNFX1NUT1AKK307CisKK3R5cGVkZWYgc3RydWN0IFNpbGVuY2VSZW1vdmVDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGVudW0gU2lsZW5jZU1vZGUgbW9kZTsKKworICAgIGludCBzdGFydF9wZXJpb2RzOworICAgIGludDY0X3Qgc3RhcnRfZHVyYXRpb247CisgICAgZG91YmxlIHN0YXJ0X3RocmVzaG9sZDsKKworICAgIGludCBzdG9wX3BlcmlvZHM7CisgICAgaW50NjRfdCBzdG9wX2R1cmF0aW9uOworICAgIGRvdWJsZSBzdG9wX3RocmVzaG9sZDsKKworICAgIGRvdWJsZSAqc3RhcnRfaG9sZG9mZjsKKyAgICBzaXplX3Qgc3RhcnRfaG9sZG9mZl9vZmZzZXQ7CisgICAgc2l6ZV90IHN0YXJ0X2hvbGRvZmZfZW5kOworICAgIGludCAgICBzdGFydF9mb3VuZF9wZXJpb2RzOworCisgICAgZG91YmxlICpzdG9wX2hvbGRvZmY7CisgICAgc2l6ZV90IHN0b3BfaG9sZG9mZl9vZmZzZXQ7CisgICAgc2l6ZV90IHN0b3BfaG9sZG9mZl9lbmQ7CisgICAgaW50ICAgIHN0b3BfZm91bmRfcGVyaW9kczsKKworICAgIGRvdWJsZSAqd2luZG93OworICAgIGRvdWJsZSAqd2luZG93X2N1cnJlbnQ7CisgICAgZG91YmxlICp3aW5kb3dfZW5kOworICAgIGludCB3aW5kb3dfc2l6ZTsKKyAgICBkb3VibGUgcm1zX3N1bTsKKworICAgIGludCBsZWF2ZV9zaWxlbmNlOworICAgIGludCByZXN0YXJ0OworICAgIGludDY0X3QgbmV4dF9wdHM7Cit9IFNpbGVuY2VSZW1vdmVDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTaWxlbmNlUmVtb3ZlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX0FVRElPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gc2lsZW5jZXJlbW92ZV9vcHRpb25zW10gPSB7CisgICAgeyAic3RhcnRfcGVyaW9kcyIsICAgTlVMTCwgT0ZGU0VUKHN0YXJ0X3BlcmlvZHMpLCAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7Lmk2ND0wfSwgICAgIDAsICAgIDkwMDAsIEZMQUdTIH0sCisgICAgeyAic3RhcnRfZHVyYXRpb24iLCAgTlVMTCwgT0ZGU0VUKHN0YXJ0X2R1cmF0aW9uKSwgIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2ND0wfSwgICAgIDAsICAgIDkwMDAsIEZMQUdTIH0sCisgICAgeyAic3RhcnRfdGhyZXNob2xkIiwgTlVMTCwgT0ZGU0VUKHN0YXJ0X3RocmVzaG9sZCksIEFWX09QVF9UWVBFX0RPVUJMRSwgICB7LmRibD0wfSwgICAgIDAsIERCTF9NQVgsIEZMQUdTIH0sCisgICAgeyAic3RvcF9wZXJpb2RzIiwgICAgTlVMTCwgT0ZGU0VUKHN0b3BfcGVyaW9kcyksICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7Lmk2ND0wfSwgLTkwMDAsICAgIDkwMDAsIEZMQUdTIH0sCisgICAgeyAic3RvcF9kdXJhdGlvbiIsICAgTlVMTCwgT0ZGU0VUKHN0b3BfZHVyYXRpb24pLCAgIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2ND0wfSwgICAgIDAsICAgIDkwMDAsIEZMQUdTIH0sCisgICAgeyAic3RvcF90aHJlc2hvbGQiLCAgTlVMTCwgT0ZGU0VUKHN0b3BfdGhyZXNob2xkKSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgICB7LmRibD0wfSwgICAgIDAsIERCTF9NQVgsIEZMQUdTIH0sCisgICAgeyAibGVhdmVfc2lsZW5jZSIsICAgTlVMTCwgT0ZGU0VUKGxlYXZlX3NpbGVuY2UpLCAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7Lmk2ND0wfSwgICAgIDAsICAgICAgIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzaWxlbmNlcmVtb3ZlKTsKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU2lsZW5jZVJlbW92ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocy0+c3RvcF9wZXJpb2RzIDwgMCkgeworICAgICAgICBzLT5zdG9wX3BlcmlvZHMgPSAtcy0+c3RvcF9wZXJpb2RzOworICAgICAgICBzLT5yZXN0YXJ0ID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfcm1zKFNpbGVuY2VSZW1vdmVDb250ZXh0ICpzKQoreworICAgIG1lbXNldChzLT53aW5kb3csIDAsIHMtPndpbmRvd19zaXplICogc2l6ZW9mKCpzLT53aW5kb3cpKTsKKworICAgIHMtPndpbmRvd19jdXJyZW50ID0gcy0+d2luZG93OworICAgIHMtPndpbmRvd19lbmQgPSBzLT53aW5kb3cgKyBzLT53aW5kb3dfc2l6ZTsKKyAgICBzLT5ybXNfc3VtID0gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBTaWxlbmNlUmVtb3ZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPndpbmRvd19zaXplID0gKGlubGluay0+c2FtcGxlX3JhdGUgLyA1MCkgKiBpbmxpbmstPmNoYW5uZWxzOworICAgIHMtPndpbmRvdyA9IGF2X21hbGxvY19hcnJheShzLT53aW5kb3dfc2l6ZSwgc2l6ZW9mKCpzLT53aW5kb3cpKTsKKyAgICBpZiAoIXMtPndpbmRvdykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGNsZWFyX3JtcyhzKTsKKworICAgIHMtPnN0YXJ0X2R1cmF0aW9uID0gYXZfcmVzY2FsZShzLT5zdGFydF9kdXJhdGlvbiwgaW5saW5rLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFKTsKKyAgICBzLT5zdG9wX2R1cmF0aW9uICA9IGF2X3Jlc2NhbGUocy0+c3RvcF9kdXJhdGlvbiwgaW5saW5rLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFKTsKKworICAgIHMtPnN0YXJ0X2hvbGRvZmYgPSBhdl9tYWxsb2NfYXJyYXkoRkZNQVgocy0+c3RhcnRfZHVyYXRpb24sIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5zdGFydF9ob2xkb2ZmKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPmNoYW5uZWxzKTsKKyAgICBpZiAoIXMtPnN0YXJ0X2hvbGRvZmYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5zdGFydF9ob2xkb2ZmX29mZnNldCA9IDA7CisgICAgcy0+c3RhcnRfaG9sZG9mZl9lbmQgICAgPSAwOworICAgIHMtPnN0YXJ0X2ZvdW5kX3BlcmlvZHMgID0gMDsKKworICAgIHMtPnN0b3BfaG9sZG9mZiA9IGF2X21hbGxvY19hcnJheShGRk1BWChzLT5zdG9wX2R1cmF0aW9uLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5zdG9wX2hvbGRvZmYpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5jaGFubmVscyk7CisgICAgaWYgKCFzLT5zdG9wX2hvbGRvZmYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5zdG9wX2hvbGRvZmZfb2Zmc2V0ID0gMDsKKyAgICBzLT5zdG9wX2hvbGRvZmZfZW5kICAgID0gMDsKKyAgICBzLT5zdG9wX2ZvdW5kX3BlcmlvZHMgID0gMDsKKworICAgIGlmIChzLT5zdGFydF9wZXJpb2RzKQorICAgICAgICBzLT5tb2RlID0gU0lMRU5DRV9UUklNOworICAgIGVsc2UKKyAgICAgICAgcy0+bW9kZSA9IFNJTEVOQ0VfQ09QWTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIG91dGxpbmstPmZsYWdzIHw9IEZGX0xJTktfRkxBR19SRVFVRVNUX0xPT1A7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGRvdWJsZSBjb21wdXRlX3JtcyhTaWxlbmNlUmVtb3ZlQ29udGV4dCAqcywgZG91YmxlIHNhbXBsZSkKK3sKKyAgICBkb3VibGUgbmV3X3N1bTsKKworICAgIG5ld19zdW0gID0gcy0+cm1zX3N1bTsKKyAgICBuZXdfc3VtIC09ICpzLT53aW5kb3dfY3VycmVudDsKKyAgICBuZXdfc3VtICs9IHNhbXBsZSAqIHNhbXBsZTsKKworICAgIHJldHVybiBzcXJ0KG5ld19zdW0gLyBzLT53aW5kb3dfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9ybXMoU2lsZW5jZVJlbW92ZUNvbnRleHQgKnMsIGRvdWJsZSBzYW1wbGUpCit7CisgICAgcy0+cm1zX3N1bSAtPSAqcy0+d2luZG93X2N1cnJlbnQ7CisgICAgKnMtPndpbmRvd19jdXJyZW50ID0gc2FtcGxlICogc2FtcGxlOworICAgIHMtPnJtc19zdW0gKz0gKnMtPndpbmRvd19jdXJyZW50OworCisgICAgcy0+d2luZG93X2N1cnJlbnQrKzsKKyAgICBpZiAocy0+d2luZG93X2N1cnJlbnQgPj0gcy0+d2luZG93X2VuZCkKKyAgICAgICAgcy0+d2luZG93X2N1cnJlbnQgPSBzLT53aW5kb3c7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoKEFWRnJhbWUgKm91dCwgQVZGaWx0ZXJMaW5rICpvdXRsaW5rLAorICAgICAgICAgICAgICAgICAgaW50ICpuYl9zYW1wbGVzX3dyaXR0ZW4sIGludCAqcmV0KQoreworICAgIGlmICgqbmJfc2FtcGxlc193cml0dGVuKSB7CisgICAgICAgIG91dC0+bmJfc2FtcGxlcyA9ICpuYl9zYW1wbGVzX3dyaXR0ZW4gLyBvdXRsaW5rLT5jaGFubmVsczsKKyAgICAgICAgKnJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworICAgICAgICAqbmJfc2FtcGxlc193cml0dGVuID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgIH0KK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIFNpbGVuY2VSZW1vdmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpLCBqLCB0aHJlc2hvbGQsIHJldCA9IDA7CisgICAgaW50IG5icywgbmJfc2FtcGxlc19yZWFkLCBuYl9zYW1wbGVzX3dyaXR0ZW47CisgICAgZG91YmxlICpvYnVmLCAqaWJ1ZiA9IChkb3VibGUgKilpbi0+ZGF0YVswXTsKKyAgICBBVkZyYW1lICpvdXQ7CisKKyAgICBuYl9zYW1wbGVzX3JlYWQgPSBuYl9zYW1wbGVzX3dyaXR0ZW4gPSAwOworCisgICAgc3dpdGNoIChzLT5tb2RlKSB7CisgICAgY2FzZSBTSUxFTkNFX1RSSU06CitzaWxlbmNlX3RyaW06CisgICAgICAgIG5icyA9IGluLT5uYl9zYW1wbGVzIC0gbmJfc2FtcGxlc19yZWFkIC8gaW5saW5rLT5jaGFubmVsczsKKyAgICAgICAgaWYgKCFuYnMpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJzOyBpKyspIHsKKyAgICAgICAgICAgIHRocmVzaG9sZCA9IDA7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5saW5rLT5jaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICAgICAgdGhyZXNob2xkIHw9IGNvbXB1dGVfcm1zKHMsIGlidWZbal0pID4gcy0+c3RhcnRfdGhyZXNob2xkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGlubGluay0+Y2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVfcm1zKHMsICppYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+c3RhcnRfaG9sZG9mZltzLT5zdGFydF9ob2xkb2ZmX2VuZCsrXSA9ICppYnVmKys7CisgICAgICAgICAgICAgICAgICAgIG5iX3NhbXBsZXNfcmVhZCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzLT5zdGFydF9ob2xkb2ZmX2VuZCA+PSBzLT5zdGFydF9kdXJhdGlvbiAqIGlubGluay0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsrcy0+c3RhcnRfZm91bmRfcGVyaW9kcyA+PSBzLT5zdGFydF9wZXJpb2RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tb2RlID0gU0lMRU5DRV9UUklNX0ZMVVNIOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzaWxlbmNlX3RyaW1fZmx1c2g7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzLT5zdGFydF9ob2xkb2ZmX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPnN0YXJ0X2hvbGRvZmZfZW5kID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPnN0YXJ0X2hvbGRvZmZfZW5kID0gMDsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbmxpbmstPmNoYW5uZWxzOyBqKyspCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9ybXMocywgaWJ1ZltqXSk7CisKKyAgICAgICAgICAgICAgICBpYnVmICs9IGlubGluay0+Y2hhbm5lbHM7CisgICAgICAgICAgICAgICAgbmJfc2FtcGxlc19yZWFkICs9IGlubGluay0+Y2hhbm5lbHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNJTEVOQ0VfVFJJTV9GTFVTSDoKK3NpbGVuY2VfdHJpbV9mbHVzaDoKKyAgICAgICAgbmJzICA9IHMtPnN0YXJ0X2hvbGRvZmZfZW5kIC0gcy0+c3RhcnRfaG9sZG9mZl9vZmZzZXQ7CisgICAgICAgIG5icyAtPSBuYnMgJSBpbmxpbmstPmNoYW5uZWxzOworICAgICAgICBpZiAoIW5icykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBuYnMgLyBpbmxpbmstPmNoYW5uZWxzKTsKKyAgICAgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkob3V0LT5kYXRhWzBdLCAmcy0+c3RhcnRfaG9sZG9mZltzLT5zdGFydF9ob2xkb2ZmX29mZnNldF0sCisgICAgICAgICAgICAgICBuYnMgKiBzaXplb2YoZG91YmxlKSk7CisgICAgICAgIHMtPnN0YXJ0X2hvbGRvZmZfb2Zmc2V0ICs9IG5iczsKKworICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKKworICAgICAgICBpZiAocy0+c3RhcnRfaG9sZG9mZl9vZmZzZXQgPT0gcy0+c3RhcnRfaG9sZG9mZl9lbmQpIHsKKyAgICAgICAgICAgIHMtPnN0YXJ0X2hvbGRvZmZfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHMtPnN0YXJ0X2hvbGRvZmZfZW5kID0gMDsKKyAgICAgICAgICAgIHMtPm1vZGUgPSBTSUxFTkNFX0NPUFk7CisgICAgICAgICAgICBnb3RvIHNpbGVuY2VfY29weTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgU0lMRU5DRV9DT1BZOgorc2lsZW5jZV9jb3B5OgorICAgICAgICBuYnMgPSBpbi0+bmJfc2FtcGxlcyAtIG5iX3NhbXBsZXNfcmVhZCAvIGlubGluay0+Y2hhbm5lbHM7CisgICAgICAgIGlmICghbmJzKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIG5icyk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIG9idWYgPSAoZG91YmxlICopb3V0LT5kYXRhWzBdOworCisgICAgICAgIGlmIChzLT5zdG9wX3BlcmlvZHMpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYnM7IGkrKykgeworICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IDE7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGlubGluay0+Y2hhbm5lbHM7IGorKykKKyAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkICY9IGNvbXB1dGVfcm1zKHMsIGlidWZbal0pID4gcy0+c3RvcF90aHJlc2hvbGQ7CisKKyAgICAgICAgICAgICAgICBpZiAodGhyZXNob2xkICYmIHMtPnN0b3BfaG9sZG9mZl9lbmQgJiYgIXMtPmxlYXZlX3NpbGVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+bW9kZSA9IFNJTEVOQ0VfQ09QWV9GTFVTSDsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2gob3V0LCBvdXRsaW5rLCAmbmJfc2FtcGxlc193cml0dGVuLCAmcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBzaWxlbmNlX2NvcHlfZmx1c2g7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGlubGluay0+Y2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3JtcyhzLCAqaWJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAqb2J1ZisrID0gKmlidWYrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5iX3NhbXBsZXNfcmVhZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgbmJfc2FtcGxlc193cml0dGVuKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGlubGluay0+Y2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3JtcyhzLCAqaWJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+bGVhdmVfc2lsZW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYnVmKysgPSAqaWJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzX3dyaXR0ZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RvcF9ob2xkb2ZmW3MtPnN0b3BfaG9sZG9mZl9lbmQrK10gPSAqaWJ1ZisrOworICAgICAgICAgICAgICAgICAgICAgICAgbmJfc2FtcGxlc19yZWFkKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocy0+c3RvcF9ob2xkb2ZmX2VuZCA+PSBzLT5zdG9wX2R1cmF0aW9uICogaW5saW5rLT5jaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrcy0+c3RvcF9mb3VuZF9wZXJpb2RzID49IHMtPnN0b3BfcGVyaW9kcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0b3BfaG9sZG9mZl9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0b3BfaG9sZG9mZl9lbmQgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzLT5yZXN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1vZGUgPSBTSUxFTkNFX1NUT1A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoKG91dCwgb3V0bGluaywgJm5iX3NhbXBsZXNfd3JpdHRlbiwgJnJldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2lsZW5jZV9zdG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0b3BfZm91bmRfcGVyaW9kcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXJ0X2ZvdW5kX3BlcmlvZHMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdGFydF9ob2xkb2ZmX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXJ0X2hvbGRvZmZfZW5kID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfcm1zKHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tb2RlID0gU0lMRU5DRV9UUklNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaChvdXQsIG91dGxpbmssICZuYl9zYW1wbGVzX3dyaXR0ZW4sICZyZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNpbGVuY2VfdHJpbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tb2RlID0gU0lMRU5DRV9DT1BZX0ZMVVNIOworICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2gob3V0LCBvdXRsaW5rLCAmbmJfc2FtcGxlc193cml0dGVuLCAmcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2lsZW5jZV9jb3B5X2ZsdXNoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmx1c2gob3V0LCBvdXRsaW5rLCAmbmJfc2FtcGxlc193cml0dGVuLCAmcmV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShvYnVmLCBpYnVmLCBzaXplb2YoZG91YmxlKSAqIG5icyAqIGlubGluay0+Y2hhbm5lbHMpOworICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNJTEVOQ0VfQ09QWV9GTFVTSDoKK3NpbGVuY2VfY29weV9mbHVzaDoKKyAgICAgICAgbmJzICA9IHMtPnN0b3BfaG9sZG9mZl9lbmQgLSBzLT5zdG9wX2hvbGRvZmZfb2Zmc2V0OworICAgICAgICBuYnMgLT0gbmJzICUgaW5saW5rLT5jaGFubmVsczsKKyAgICAgICAgaWYgKCFuYnMpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgbmJzIC8gaW5saW5rLT5jaGFubmVscyk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KG91dC0+ZGF0YVswXSwgJnMtPnN0b3BfaG9sZG9mZltzLT5zdG9wX2hvbGRvZmZfb2Zmc2V0XSwKKyAgICAgICAgICAgICAgIG5icyAqIHNpemVvZihkb3VibGUpKTsKKyAgICAgICAgcy0+c3RvcF9ob2xkb2ZmX29mZnNldCArPSBuYnM7CisKKyAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CisKKyAgICAgICAgaWYgKHMtPnN0b3BfaG9sZG9mZl9vZmZzZXQgPT0gcy0+c3RvcF9ob2xkb2ZmX2VuZCkgeworICAgICAgICAgICAgcy0+c3RvcF9ob2xkb2ZmX29mZnNldCA9IDA7CisgICAgICAgICAgICBzLT5zdG9wX2hvbGRvZmZfZW5kID0gMDsKKyAgICAgICAgICAgIHMtPm1vZGUgPSBTSUxFTkNFX0NPUFk7CisgICAgICAgICAgICBnb3RvIHNpbGVuY2VfY29weTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFNJTEVOQ0VfU1RPUDoKK3NpbGVuY2Vfc3RvcDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBTaWxlbmNlUmVtb3ZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7CisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiAocy0+bW9kZSA9PSBTSUxFTkNFX0NPUFlfRkxVU0ggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tb2RlID09IFNJTEVOQ0VfQ09QWSkpIHsKKyAgICAgICAgaW50IG5icyA9IHMtPnN0b3BfaG9sZG9mZl9lbmQgLSBzLT5zdG9wX2hvbGRvZmZfb2Zmc2V0OworICAgICAgICBpZiAobmJzKSB7CisgICAgICAgICAgICBBVkZyYW1lICpmcmFtZTsKKworICAgICAgICAgICAgZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5icyAvIG91dGxpbmstPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzBdLCAmcy0+c3RvcF9ob2xkb2ZmW3MtPnN0b3BfaG9sZG9mZl9vZmZzZXRdLAorICAgICAgICAgICAgICAgICAgIG5icyAqIHNpemVvZihkb3VibGUpKTsKKyAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShjdHgtPmlucHV0c1swXSwgZnJhbWUpOworICAgICAgICB9CisgICAgICAgIHMtPm1vZGUgPSBTSUxFTkNFX1NUT1A7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHMgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRzW10gPSB7CisgICAgICAgIEFWX1NBTVBMRV9GTVRfREJMLCBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9OworCisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2xheW91dHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBsYXlvdXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9mbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisKKyAgICBmb3JtYXRzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmb3JtYXRzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTaWxlbmNlUmVtb3ZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyZWVwKCZzLT5zdGFydF9ob2xkb2ZmKTsKKyAgICBhdl9mcmVlcCgmcy0+c3RvcF9ob2xkb2ZmKTsKKyAgICBhdl9mcmVlcCgmcy0+d2luZG93KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNpbGVuY2VyZW1vdmVfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzaWxlbmNlcmVtb3ZlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfc2lsZW5jZXJlbW92ZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJzaWxlbmNlcmVtb3ZlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZW1vdmUgc2lsZW5jZS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihTaWxlbmNlUmVtb3ZlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmc2lsZW5jZXJlbW92ZV9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gc2lsZW5jZXJlbW92ZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBzaWxlbmNlcmVtb3ZlX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX3ZvbHVtZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX3ZvbHVtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDlhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfdm9sdW1lLmMKQEAgLTAsMCArMSw0ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU3RlZmFubyBTYWJhdGluaQorICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGF1ZGlvIHZvbHVtZSBmaWx0ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JlcGxheWdhaW4uaCIKKworI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhZl92b2x1bWUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcmVjaXNpb25fc3RyW10gPSB7CisgICAgImZpeGVkIiwgImZsb2F0IiwgImRvdWJsZSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsKKyAgICAibiIsICAgICAgICAgICAgICAgICAgIC8vLzwgZnJhbWUgbnVtYmVyIChzdGFydGluZyBhdCB6ZXJvKQorICAgICJuYl9jaGFubmVscyIsICAgICAgICAgLy8vPCBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAibmJfY29uc3VtZWRfc2FtcGxlcyIsIC8vLzwgbnVtYmVyIG9mIHNhbXBsZXMgY29uc3VtZWQgYnkgdGhlIGZpbHRlcgorICAgICJuYl9zYW1wbGVzIiwgICAgICAgICAgLy8vPCBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgY3VycmVudCBmcmFtZQorICAgICJwb3MiLCAgICAgICAgICAgICAgICAgLy8vPCBwb3NpdGlvbiBpbiB0aGUgZmlsZSBvZiB0aGUgZnJhbWUKKyAgICAicHRzIiwgICAgICAgICAgICAgICAgIC8vLzwgZnJhbWUgcHJlc2VudGF0aW9uIHRpbWVzdGFtcAorICAgICJzYW1wbGVfcmF0ZSIsICAgICAgICAgLy8vPCBzYW1wbGUgcmF0ZQorICAgICJzdGFydHB0cyIsICAgICAgICAgICAgLy8vPCBQVFMgYXQgc3RhcnQgb2Ygc3RyZWFtCisgICAgInN0YXJ0dCIsICAgICAgICAgICAgICAvLy88IHRpbWUgYXQgc3RhcnQgb2Ygc3RyZWFtCisgICAgInQiLCAgICAgICAgICAgICAgICAgICAvLy88IHRpbWUgaW4gdGhlIGZpbGUgb2YgdGhlIGZyYW1lCisgICAgInRiIiwgICAgICAgICAgICAgICAgICAvLy88IHRpbWViYXNlCisgICAgInZvbHVtZSIsICAgICAgICAgICAgICAvLy88IGxhc3Qgc2V0IHZhbHVlCisgICAgTlVMTAorfTsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVm9sdW1lQ29udGV4dCwgeCkKKyNkZWZpbmUgQSBBVl9PUFRfRkxBR19BVURJT19QQVJBTQorI2RlZmluZSBGIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdm9sdW1lX29wdGlvbnNbXSA9IHsKKyAgICB7ICJ2b2x1bWUiLCAic2V0IHZvbHVtZSBhZGp1c3RtZW50IGV4cHJlc3Npb24iLAorICAgICAgICAgICAgT0ZGU0VUKHZvbHVtZV9leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiMS4wIiB9LCAuZmxhZ3MgPSBBfEYgfSwKKyAgICB7ICJwcmVjaXNpb24iLCAic2VsZWN0IG1hdGhlbWF0aWNhbCBwcmVjaXNpb24iLAorICAgICAgICAgICAgT0ZGU0VUKHByZWNpc2lvbiksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gUFJFQ0lTSU9OX0ZMT0FUIH0sIFBSRUNJU0lPTl9GSVhFRCwgUFJFQ0lTSU9OX0RPVUJMRSwgQXxGLCAicHJlY2lzaW9uIiB9LAorICAgICAgICB7ICJmaXhlZCIsICAic2VsZWN0IDgtYml0IGZpeGVkLXBvaW50IiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQUkVDSVNJT05fRklYRUQgIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8RiwgInByZWNpc2lvbiIgfSwKKyAgICAgICAgeyAiZmxvYXQiLCAgInNlbGVjdCAzMi1iaXQgZmxvYXRpbmctcG9pbnQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJFQ0lTSU9OX0ZMT0FUICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEYsICJwcmVjaXNpb24iIH0sCisgICAgICAgIHsgImRvdWJsZSIsICJzZWxlY3QgNjQtYml0IGZsb2F0aW5nLXBvaW50IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBSRUNJU0lPTl9ET1VCTEUgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxGLCAicHJlY2lzaW9uIiB9LAorICAgIHsgImV2YWwiLCAic3BlY2lmeSB3aGVuIHRvIGV2YWx1YXRlIGV4cHJlc3Npb25zIiwgT0ZGU0VUKGV2YWxfbW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBFVkFMX01PREVfT05DRX0sIDAsIEVWQUxfTU9ERV9OQi0xLCAuZmxhZ3MgPSBBfEYsICJldmFsIiB9LAorICAgICAgICAgeyAib25jZSIsICAiZXZhbCB2b2x1bWUgZXhwcmVzc2lvbiBvbmNlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUVWQUxfTU9ERV9PTkNFfSwgIC5mbGFncyA9IEF8RiwgLnVuaXQgPSAiZXZhbCIgfSwKKyAgICAgICAgIHsgImZyYW1lIiwgImV2YWwgdm9sdW1lIGV4cHJlc3Npb24gcGVyLWZyYW1lIiwgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9RVZBTF9NT0RFX0ZSQU1FfSwgLmZsYWdzID0gQXxGLCAudW5pdCA9ICJldmFsIiB9LAorICAgIHsgInJlcGxheWdhaW4iLCAiQXBwbHkgcmVwbGF5Z2FpbiBzaWRlIGRhdGEgd2hlbiBwcmVzZW50IiwKKyAgICAgICAgICAgIE9GRlNFVChyZXBsYXlnYWluKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBSRVBMQVlHQUlOX0RST1AgfSwgUkVQTEFZR0FJTl9EUk9QLCBSRVBMQVlHQUlOX0FMQlVNLCBBLCAicmVwbGF5Z2FpbiIgfSwKKyAgICAgICAgeyAiZHJvcCIsICAgInJlcGxheWdhaW4gc2lkZSBkYXRhIGlzIGRyb3BwZWQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUkVQTEFZR0FJTl9EUk9QICAgfSwgMCwgMCwgQSwgInJlcGxheWdhaW4iIH0sCisgICAgICAgIHsgImlnbm9yZSIsICJyZXBsYXlnYWluIHNpZGUgZGF0YSBpcyBpZ25vcmVkIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFJFUExBWUdBSU5fSUdOT1JFIH0sIDAsIDAsIEEsICJyZXBsYXlnYWluIiB9LAorICAgICAgICB7ICJ0cmFjayIsICAidHJhY2sgZ2FpbiBpcyBwcmVmZXJyZWQiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBSRVBMQVlHQUlOX1RSQUNLICB9LCAwLCAwLCBBLCAicmVwbGF5Z2FpbiIgfSwKKyAgICAgICAgeyAiYWxidW0iLCAgImFsYnVtIGdhaW4gaXMgcHJlZmVycmVkIiwgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUkVQTEFZR0FJTl9BTEJVTSAgfSwgMCwgMCwgQSwgInJlcGxheWdhaW4iIH0sCisgICAgeyAicmVwbGF5Z2Fpbl9wcmVhbXAiLCAiQXBwbHkgcmVwbGF5Z2FpbiBwcmUtYW1wbGlmaWNhdGlvbiIsCisgICAgICAgICAgICBPRkZTRVQocmVwbGF5Z2Fpbl9wcmVhbXApLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDAuMCB9LCAtMTUuMCwgMTUuMCwgQSB9LAorICAgIHsgInJlcGxheWdhaW5fbm9jbGlwIiwgIkFwcGx5IHJlcGxheWdhaW4gY2xpcHBpbmcgcHJldmVudGlvbiIsCisgICAgICAgICAgICBPRkZTRVQocmVwbGF5Z2Fpbl9ub2NsaXApLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgMSwgQSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHZvbHVtZSk7CisKK3N0YXRpYyBpbnQgc2V0X2V4cHIoQVZFeHByICoqcGV4cHIsIGNvbnN0IGNoYXIgKmV4cHIsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgaW50IHJldDsKKyAgICBBVkV4cHIgKm9sZCA9IE5VTEw7CisKKyAgICBpZiAoKnBleHByKQorICAgICAgICBvbGQgPSAqcGV4cHI7CisgICAgcmV0ID0gYXZfZXhwcl9wYXJzZShwZXhwciwgZXhwciwgdmFyX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbG9nX2N0eCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJFcnJvciB3aGVuIGV2YWx1YXRpbmcgdGhlIHZvbHVtZSBleHByZXNzaW9uICclcydcbiIsIGV4cHIpOworICAgICAgICAqcGV4cHIgPSBvbGQ7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXZfZXhwcl9mcmVlKG9sZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFZvbHVtZUNvbnRleHQgKnZvbCA9IGN0eC0+cHJpdjsKKworICAgIHZvbC0+ZmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoMCk7CisgICAgaWYgKCF2b2wtPmZkc3ApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gc2V0X2V4cHIoJnZvbC0+dm9sdW1lX3BleHByLCB2b2wtPnZvbHVtZV9leHByLCBjdHgpOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBWb2x1bWVDb250ZXh0ICp2b2wgPSBjdHgtPnByaXY7CisgICAgYXZfZXhwcl9mcmVlKHZvbC0+dm9sdW1lX3BleHByKTsKKyAgICBhdl9vcHRfZnJlZSh2b2wpOworICAgIGF2X2ZyZWVwKCZ2b2wtPmZkc3ApOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVm9sdW1lQ29udGV4dCAqdm9sID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyA9IE5VTEw7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdWzddID0geworICAgICAgICBbUFJFQ0lTSU9OX0ZJWEVEXSA9IHsKKyAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfVTgsCisgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1U4UCwKKyAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzIsCisgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMlAsCisgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICAgICAgfSwKKyAgICAgICAgW1BSRUNJU0lPTl9GTE9BVF0gPSB7CisgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORQorICAgICAgICB9LAorICAgICAgICBbUFJFQ0lTSU9OX0RPVUJMRV0gPSB7CisgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX0RCTCwKKyAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfREJMUCwKKyAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORQorICAgICAgICB9CisgICAgfTsKKworICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9jb3VudHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBsYXlvdXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9mbXRzW3ZvbC0+cHJlY2lzaW9uXSk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworCisgICAgZm9ybWF0cyA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZm9ybWF0cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjYWxlX3NhbXBsZXNfdTgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IHZvbHVtZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKQorICAgICAgICBkc3RbaV0gPSBhdl9jbGlwX3VpbnQ4KCgoKChpbnQ2NF90KXNyY1tpXSAtIDEyOCkgKiB2b2x1bWUgKyAxMjgpID4+IDgpICsgMTI4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjYWxlX3NhbXBsZXNfdThfc21hbGwodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IHZvbHVtZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKQorICAgICAgICBkc3RbaV0gPSBhdl9jbGlwX3VpbnQ4KCgoKHNyY1tpXSAtIDEyOCkgKiB2b2x1bWUgKyAxMjgpID4+IDgpICsgMTI4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjYWxlX3NhbXBsZXNfczE2KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLCBpbnQgdm9sdW1lKQoreworICAgIGludCBpOworICAgIGludDE2X3QgKnNtcF9kc3QgICAgICAgPSAoaW50MTZfdCAqKWRzdDsKKyAgICBjb25zdCBpbnQxNl90ICpzbXBfc3JjID0gKGNvbnN0IGludDE2X3QgKilzcmM7CisgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykKKyAgICAgICAgc21wX2RzdFtpXSA9IGF2X2NsaXBfaW50MTYoKChpbnQ2NF90KXNtcF9zcmNbaV0gKiB2b2x1bWUgKyAxMjgpID4+IDgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NhbGVfc2FtcGxlc19zMTZfc21hbGwodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCB2b2x1bWUpCit7CisgICAgaW50IGk7CisgICAgaW50MTZfdCAqc21wX2RzdCAgICAgICA9IChpbnQxNl90ICopZHN0OworICAgIGNvbnN0IGludDE2X3QgKnNtcF9zcmMgPSAoY29uc3QgaW50MTZfdCAqKXNyYzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKQorICAgICAgICBzbXBfZHN0W2ldID0gYXZfY2xpcF9pbnQxNigoc21wX3NyY1tpXSAqIHZvbHVtZSArIDEyOCkgPj4gOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2FsZV9zYW1wbGVzX3MzMih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IHZvbHVtZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQzMl90ICpzbXBfZHN0ICAgICAgID0gKGludDMyX3QgKilkc3Q7CisgICAgY29uc3QgaW50MzJfdCAqc21wX3NyYyA9IChjb25zdCBpbnQzMl90ICopc3JjOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspCisgICAgICAgIHNtcF9kc3RbaV0gPSBhdl9jbGlwbF9pbnQzMigoKChpbnQ2NF90KXNtcF9zcmNbaV0gKiB2b2x1bWUgKyAxMjgpID4+IDgpKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB2b2x1bWVfaW5pdChWb2x1bWVDb250ZXh0ICp2b2wpCit7CisgICAgdm9sLT5zYW1wbGVzX2FsaWduID0gMTsKKworICAgIHN3aXRjaCAoYXZfZ2V0X3BhY2tlZF9zYW1wbGVfZm10KHZvbC0+c2FtcGxlX2ZtdCkpIHsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfVTg6CisgICAgICAgIGlmICh2b2wtPnZvbHVtZV9pIDwgMHgxMDAwMDAwKQorICAgICAgICAgICAgdm9sLT5zY2FsZV9zYW1wbGVzID0gc2NhbGVfc2FtcGxlc191OF9zbWFsbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdm9sLT5zY2FsZV9zYW1wbGVzID0gc2NhbGVfc2FtcGxlc191ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNjoKKyAgICAgICAgaWYgKHZvbC0+dm9sdW1lX2kgPCAweDEwMDAwKQorICAgICAgICAgICAgdm9sLT5zY2FsZV9zYW1wbGVzID0gc2NhbGVfc2FtcGxlc19zMTZfc21hbGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZvbC0+c2NhbGVfc2FtcGxlcyA9IHNjYWxlX3NhbXBsZXNfczE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyOgorICAgICAgICB2b2wtPnNjYWxlX3NhbXBsZXMgPSBzY2FsZV9zYW1wbGVzX3MzMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVDoKKyAgICAgICAgdm9sLT5zYW1wbGVzX2FsaWduID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTDoKKyAgICAgICAgdm9sLT5zYW1wbGVzX2FsaWduID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl92b2x1bWVfaW5pdF94ODYodm9sKTsKK30KKworc3RhdGljIGludCBzZXRfdm9sdW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFZvbHVtZUNvbnRleHQgKnZvbCA9IGN0eC0+cHJpdjsKKworICAgIHZvbC0+dm9sdW1lID0gYXZfZXhwcl9ldmFsKHZvbC0+dm9sdW1lX3BleHByLCB2b2wtPnZhcl92YWx1ZXMsIE5VTEwpOworICAgIGlmIChpc25hbih2b2wtPnZvbHVtZSkpIHsKKyAgICAgICAgaWYgKHZvbC0+ZXZhbF9tb2RlID09IEVWQUxfTU9ERV9PTkNFKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHZhbHVlIE5hTiBmb3Igdm9sdW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgdmFsdWUgTmFOIGZvciB2b2x1bWUsIHNldHRpbmcgdG8gMFxuIik7CisgICAgICAgICAgICB2b2wtPnZvbHVtZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9sLT52YXJfdmFsdWVzW1ZBUl9WT0xVTUVdID0gdm9sLT52b2x1bWU7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIm46JWYgdDolZiBwdHM6JWYgcHJlY2lzaW9uOiVzICIsCisgICAgICAgICAgIHZvbC0+dmFyX3ZhbHVlc1tWQVJfTl0sIHZvbC0+dmFyX3ZhbHVlc1tWQVJfVF0sIHZvbC0+dmFyX3ZhbHVlc1tWQVJfUFRTXSwKKyAgICAgICAgICAgcHJlY2lzaW9uX3N0clt2b2wtPnByZWNpc2lvbl0pOworCisgICAgaWYgKHZvbC0+cHJlY2lzaW9uID09IFBSRUNJU0lPTl9GSVhFRCkgeworICAgICAgICB2b2wtPnZvbHVtZV9pID0gKGludCkodm9sLT52b2x1bWUgKiAyNTYgKyAwLjUpOworICAgICAgICB2b2wtPnZvbHVtZSAgID0gdm9sLT52b2x1bWVfaSAvIDI1Ni4wOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgInZvbHVtZV9pOiVkLzI1NSAiLCB2b2wtPnZvbHVtZV9pKTsKKyAgICB9CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJ2b2x1bWU6JWYgdm9sdW1lX2RCOiVmXG4iLAorICAgICAgICAgICB2b2wtPnZvbHVtZSwgMjAuMCpsb2codm9sLT52b2x1bWUpL01fTE4xMCk7CisKKyAgICB2b2x1bWVfaW5pdCh2b2wpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIFZvbHVtZUNvbnRleHQgKnZvbCAgID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisKKyAgICB2b2wtPnNhbXBsZV9mbXQgPSBpbmxpbmstPmZvcm1hdDsKKyAgICB2b2wtPmNoYW5uZWxzICAgPSBpbmxpbmstPmNoYW5uZWxzOworICAgIHZvbC0+cGxhbmVzICAgICA9IGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGlubGluay0+Zm9ybWF0KSA/IHZvbC0+Y2hhbm5lbHMgOiAxOworCisgICAgdm9sLT52YXJfdmFsdWVzW1ZBUl9OXSA9CisgICAgdm9sLT52YXJfdmFsdWVzW1ZBUl9OQl9DT05TVU1FRF9TQU1QTEVTXSA9CisgICAgdm9sLT52YXJfdmFsdWVzW1ZBUl9OQl9TQU1QTEVTXSA9CisgICAgdm9sLT52YXJfdmFsdWVzW1ZBUl9QT1NdID0KKyAgICB2b2wtPnZhcl92YWx1ZXNbVkFSX1BUU10gPQorICAgIHZvbC0+dmFyX3ZhbHVlc1tWQVJfU1RBUlRQVFNdID0KKyAgICB2b2wtPnZhcl92YWx1ZXNbVkFSX1NUQVJUVF0gPQorICAgIHZvbC0+dmFyX3ZhbHVlc1tWQVJfVF0gPQorICAgIHZvbC0+dmFyX3ZhbHVlc1tWQVJfVk9MVU1FXSA9IE5BTjsKKworICAgIHZvbC0+dmFyX3ZhbHVlc1tWQVJfTkJfQ0hBTk5FTFNdID0gaW5saW5rLT5jaGFubmVsczsKKyAgICB2b2wtPnZhcl92YWx1ZXNbVkFSX1RCXSAgICAgICAgICA9IGF2X3EyZChpbmxpbmstPnRpbWVfYmFzZSk7CisgICAgdm9sLT52YXJfdmFsdWVzW1ZBUl9TQU1QTEVfUkFURV0gPSBpbmxpbmstPnNhbXBsZV9yYXRlOworCisgICAgYXZfbG9nKGlubGluay0+c3JjLCBBVl9MT0dfVkVSQk9TRSwgInRiOiVmIHNhbXBsZV9yYXRlOiVmIG5iX2NoYW5uZWxzOiVmXG4iLAorICAgICAgICAgICB2b2wtPnZhcl92YWx1ZXNbVkFSX1RCXSwKKyAgICAgICAgICAgdm9sLT52YXJfdmFsdWVzW1ZBUl9TQU1QTEVfUkFURV0sCisgICAgICAgICAgIHZvbC0+dmFyX3ZhbHVlc1tWQVJfTkJfQ0hBTk5FTFNdKTsKKworICAgIHJldHVybiBzZXRfdm9sdW1lKGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19jb21tYW5kKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZXMsIGludCByZXNfbGVuLCBpbnQgZmxhZ3MpCit7CisgICAgVm9sdW1lQ29udGV4dCAqdm9sID0gY3R4LT5wcml2OworICAgIGludCByZXQgPSBBVkVSUk9SKEVOT1NZUyk7CisKKyAgICBpZiAoIXN0cmNtcChjbWQsICJ2b2x1bWUiKSkgeworICAgICAgICBpZiAoKHJldCA9IHNldF9leHByKCZ2b2wtPnZvbHVtZV9wZXhwciwgYXJncywgY3R4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHZvbC0+ZXZhbF9tb2RlID09IEVWQUxfTU9ERV9PTkNFKQorICAgICAgICAgICAgc2V0X3ZvbHVtZShjdHgpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgRDJUUyhkKSAgKGlzbmFuKGQpID8gQVZfTk9QVFNfVkFMVUUgOiAoaW50NjRfdCkoZCkpCisjZGVmaW5lIFRTMkQodHMpICgodHMpID09IEFWX05PUFRTX1ZBTFVFID8gTkFOIDogKGRvdWJsZSkodHMpKQorI2RlZmluZSBUUzJUKHRzLCB0YikgKCh0cykgPT0gQVZfTk9QVFNfVkFMVUUgPyBOQU4gOiAoZG91YmxlKSh0cykqYXZfcTJkKHRiKSkKKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmJ1ZikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFZvbHVtZUNvbnRleHQgKnZvbCAgICA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIGludCBuYl9zYW1wbGVzICAgICAgICA9IGJ1Zi0+bmJfc2FtcGxlczsKKyAgICBBVkZyYW1lICpvdXRfYnVmOworICAgIGludDY0X3QgcG9zOworICAgIEFWRnJhbWVTaWRlRGF0YSAqc2QgPSBhdl9mcmFtZV9nZXRfc2lkZV9kYXRhKGJ1ZiwgQVZfRlJBTUVfREFUQV9SRVBMQVlHQUlOKTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHNkICYmIHZvbC0+cmVwbGF5Z2FpbiAhPSBSRVBMQVlHQUlOX0lHTk9SRSkgeworICAgICAgICBpZiAodm9sLT5yZXBsYXlnYWluICE9IFJFUExBWUdBSU5fRFJPUCkgeworICAgICAgICAgICAgQVZSZXBsYXlHYWluICpyZXBsYXlnYWluID0gKEFWUmVwbGF5R2Fpbiopc2QtPmRhdGE7CisgICAgICAgICAgICBpbnQzMl90IGdhaW4gID0gMTAwMDAwOworICAgICAgICAgICAgdWludDMyX3QgcGVhayA9IDEwMDAwMDsKKyAgICAgICAgICAgIGZsb2F0IGcsIHA7CisKKyAgICAgICAgICAgIGlmICh2b2wtPnJlcGxheWdhaW4gPT0gUkVQTEFZR0FJTl9UUkFDSyAmJgorICAgICAgICAgICAgICAgIHJlcGxheWdhaW4tPnRyYWNrX2dhaW4gIT0gSU5UMzJfTUlOKSB7CisgICAgICAgICAgICAgICAgZ2FpbiA9IHJlcGxheWdhaW4tPnRyYWNrX2dhaW47CisKKyAgICAgICAgICAgICAgICBpZiAocmVwbGF5Z2Fpbi0+dHJhY2tfcGVhayAhPSAwKQorICAgICAgICAgICAgICAgICAgICBwZWFrID0gcmVwbGF5Z2Fpbi0+dHJhY2tfcGVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVwbGF5Z2Fpbi0+YWxidW1fZ2FpbiAhPSBJTlQzMl9NSU4pIHsKKyAgICAgICAgICAgICAgICBnYWluID0gcmVwbGF5Z2Fpbi0+YWxidW1fZ2FpbjsKKworICAgICAgICAgICAgICAgIGlmIChyZXBsYXlnYWluLT5hbGJ1bV9wZWFrICE9IDApCisgICAgICAgICAgICAgICAgICAgIHBlYWsgPSByZXBsYXlnYWluLT5hbGJ1bV9wZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19XQVJOSU5HLCAiQm90aCBSZXBsYXlHYWluIGdhaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzIGFyZSB1bmtub3duLlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnID0gZ2FpbiAvIDEwMDAwMC4wZjsKKyAgICAgICAgICAgIHAgPSBwZWFrIC8gMTAwMDAwLjBmOworCisgICAgICAgICAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgICAgICJVc2luZyBnYWluICVmIGRCIGZyb20gcmVwbGF5Z2FpbiBzaWRlIGRhdGEuXG4iLCBnKTsKKworICAgICAgICAgICAgdm9sLT52b2x1bWUgICA9IHBvdygxMCwgKGcgKyB2b2wtPnJlcGxheWdhaW5fcHJlYW1wKSAvIDIwKTsKKyAgICAgICAgICAgIGlmICh2b2wtPnJlcGxheWdhaW5fbm9jbGlwKQorICAgICAgICAgICAgICAgIHZvbC0+dm9sdW1lID0gRkZNSU4odm9sLT52b2x1bWUsIDEuMCAvIHApOworICAgICAgICAgICAgdm9sLT52b2x1bWVfaSA9IChpbnQpKHZvbC0+dm9sdW1lICogMjU2ICsgMC41KTsKKworICAgICAgICAgICAgdm9sdW1lX2luaXQodm9sKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9yZW1vdmVfc2lkZV9kYXRhKGJ1ZiwgQVZfRlJBTUVfREFUQV9SRVBMQVlHQUlOKTsKKyAgICB9CisKKyAgICBpZiAoaXNuYW4odm9sLT52YXJfdmFsdWVzW1ZBUl9TVEFSVFBUU10pKSB7CisgICAgICAgIHZvbC0+dmFyX3ZhbHVlc1tWQVJfU1RBUlRQVFNdID0gVFMyRChidWYtPnB0cyk7CisgICAgICAgIHZvbC0+dmFyX3ZhbHVlc1tWQVJfU1RBUlRUICBdID0gVFMyVChidWYtPnB0cywgaW5saW5rLT50aW1lX2Jhc2UpOworICAgIH0KKyAgICB2b2wtPnZhcl92YWx1ZXNbVkFSX1BUU10gPSBUUzJEKGJ1Zi0+cHRzKTsKKyAgICB2b2wtPnZhcl92YWx1ZXNbVkFSX1QgIF0gPSBUUzJUKGJ1Zi0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSk7CisgICAgdm9sLT52YXJfdmFsdWVzW1ZBUl9OICBdID0gaW5saW5rLT5mcmFtZV9jb3VudDsKKworICAgIHBvcyA9IGF2X2ZyYW1lX2dldF9wa3RfcG9zKGJ1Zik7CisgICAgdm9sLT52YXJfdmFsdWVzW1ZBUl9QT1NdID0gcG9zID09IC0xID8gTkFOIDogcG9zOworICAgIGlmICh2b2wtPmV2YWxfbW9kZSA9PSBFVkFMX01PREVfRlJBTUUpCisgICAgICAgIHNldF92b2x1bWUoY3R4KTsKKworICAgIGlmICh2b2wtPnZvbHVtZSA9PSAxLjAgfHwgdm9sLT52b2x1bWVfaSA9PSAyNTYpIHsKKyAgICAgICAgb3V0X2J1ZiA9IGJ1ZjsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogZG8gdm9sdW1lIHNjYWxpbmcgaW4tcGxhY2UgaWYgaW5wdXQgYnVmZmVyIGlzIHdyaXRhYmxlICovCisgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGJ1ZikpIHsKKyAgICAgICAgb3V0X2J1ZiA9IGJ1ZjsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRfYnVmID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIG5iX3NhbXBsZXMpOworICAgICAgICBpZiAoIW91dF9idWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICByZXQgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dF9idWYsIGJ1Zik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXRfYnVmKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZvbC0+cHJlY2lzaW9uICE9IFBSRUNJU0lPTl9GSVhFRCB8fCB2b2wtPnZvbHVtZV9pID4gMCkgeworICAgICAgICBpbnQgcCwgcGxhbmVfc2FtcGxlczsKKworICAgICAgICBpZiAoYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoYnVmLT5mb3JtYXQpKQorICAgICAgICAgICAgcGxhbmVfc2FtcGxlcyA9IEZGQUxJR04obmJfc2FtcGxlcywgdm9sLT5zYW1wbGVzX2FsaWduKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGxhbmVfc2FtcGxlcyA9IEZGQUxJR04obmJfc2FtcGxlcyAqIHZvbC0+Y2hhbm5lbHMsIHZvbC0+c2FtcGxlc19hbGlnbik7CisKKyAgICAgICAgaWYgKHZvbC0+cHJlY2lzaW9uID09IFBSRUNJU0lPTl9GSVhFRCkgeworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHZvbC0+cGxhbmVzOyBwKyspIHsKKyAgICAgICAgICAgICAgICB2b2wtPnNjYWxlX3NhbXBsZXMob3V0X2J1Zi0+ZXh0ZW5kZWRfZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5leHRlbmRlZF9kYXRhW3BdLCBwbGFuZV9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2wtPnZvbHVtZV9pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhdl9nZXRfcGFja2VkX3NhbXBsZV9mbXQodm9sLT5zYW1wbGVfZm10KSA9PSBBVl9TQU1QTEVfRk1UX0ZMVCkgeworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHZvbC0+cGxhbmVzOyBwKyspIHsKKyAgICAgICAgICAgICAgICB2b2wtPmZkc3AtPnZlY3Rvcl9mbXVsX3NjYWxhcigoZmxvYXQgKilvdXRfYnVmLT5leHRlbmRlZF9kYXRhW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopYnVmLT5leHRlbmRlZF9kYXRhW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sLT52b2x1bWUsIHBsYW5lX3NhbXBsZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHZvbC0+cGxhbmVzOyBwKyspIHsKKyAgICAgICAgICAgICAgICB2b2wtPmZkc3AtPnZlY3Rvcl9kbXVsX3NjYWxhcigoZG91YmxlICopb3V0X2J1Zi0+ZXh0ZW5kZWRfZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBkb3VibGUgKilidWYtPmV4dGVuZGVkX2RhdGFbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2wtPnZvbHVtZSwgcGxhbmVfc2FtcGxlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbW1zX2MoKTsKKworICAgIGlmIChidWYgIT0gb3V0X2J1ZikKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmYnVmKTsKKworZW5kOgorICAgIHZvbC0+dmFyX3ZhbHVlc1tWQVJfTkJfQ09OU1VNRURfU0FNUExFU10gKz0gb3V0X2J1Zi0+bmJfc2FtcGxlczsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dF9idWYpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfdm9sdW1lX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfdm9sdW1lX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX3ZvbHVtZSA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidm9sdW1lIiwKKyAgICAuZGVzY3JpcHRpb24gICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ2hhbmdlIGlucHV0IHZvbHVtZS4iKSwKKyAgICAucXVlcnlfZm9ybWF0cyAgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgICA9IHNpemVvZihWb2x1bWVDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmdm9sdW1lX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICAgICA9IGF2ZmlsdGVyX2FmX3ZvbHVtZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgID0gYXZmaWx0ZXJfYWZfdm9sdW1lX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCisgICAgLnByb2Nlc3NfY29tbWFuZCA9IHByb2Nlc3NfY29tbWFuZCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfdm9sdW1lLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfdm9sdW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhMzI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hZl92b2x1bWUuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGF1ZGlvIHZvbHVtZSBmaWx0ZXIKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0FGX1ZPTFVNRV9ICisjZGVmaW5lIEFWRklMVEVSX0FGX1ZPTFVNRV9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKworZW51bSBQcmVjaXNpb25UeXBlIHsKKyAgICBQUkVDSVNJT05fRklYRUQgPSAwLAorICAgIFBSRUNJU0lPTl9GTE9BVCwKKyAgICBQUkVDSVNJT05fRE9VQkxFLAorfTsKKworZW51bSBFdmFsTW9kZSB7CisgICAgRVZBTF9NT0RFX09OQ0UsCisgICAgRVZBTF9NT0RFX0ZSQU1FLAorICAgIEVWQUxfTU9ERV9OQgorfTsKKworZW51bSBWb2x1bWVWYXJOYW1lIHsKKyAgICBWQVJfTiwKKyAgICBWQVJfTkJfQ0hBTk5FTFMsCisgICAgVkFSX05CX0NPTlNVTUVEX1NBTVBMRVMsCisgICAgVkFSX05CX1NBTVBMRVMsCisgICAgVkFSX1BPUywKKyAgICBWQVJfUFRTLAorICAgIFZBUl9TQU1QTEVfUkFURSwKKyAgICBWQVJfU1RBUlRQVFMsCisgICAgVkFSX1NUQVJUVCwKKyAgICBWQVJfVCwKKyAgICBWQVJfVEIsCisgICAgVkFSX1ZPTFVNRSwKKyAgICBWQVJfVkFSU19OQgorfTsKKworZW51bSBSZXBsYXlHYWluVHlwZSB7CisgICAgUkVQTEFZR0FJTl9EUk9QLAorICAgIFJFUExBWUdBSU5fSUdOT1JFLAorICAgIFJFUExBWUdBSU5fVFJBQ0ssCisgICAgUkVQTEFZR0FJTl9BTEJVTSwKK307CisKK3R5cGVkZWYgc3RydWN0IFZvbHVtZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOworICAgIGVudW0gUHJlY2lzaW9uVHlwZSBwcmVjaXNpb247CisgICAgZW51bSBFdmFsTW9kZSBldmFsX21vZGU7CisgICAgY29uc3QgY2hhciAqdm9sdW1lX2V4cHI7CisgICAgQVZFeHByICp2b2x1bWVfcGV4cHI7CisgICAgZG91YmxlIHZhcl92YWx1ZXNbVkFSX1ZBUlNfTkJdOworCisgICAgZW51bSBSZXBsYXlHYWluVHlwZSByZXBsYXlnYWluOworICAgIGRvdWJsZSByZXBsYXlnYWluX3ByZWFtcDsKKyAgICBpbnQgICAgcmVwbGF5Z2Fpbl9ub2NsaXA7CisgICAgZG91YmxlIHZvbHVtZTsKKyAgICBpbnQgICAgdm9sdW1lX2k7CisgICAgaW50ICAgIGNoYW5uZWxzOworICAgIGludCAgICBwbGFuZXM7CisgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10OworCisgICAgdm9pZCAoKnNjYWxlX3NhbXBsZXMpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgbmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZvbHVtZSk7CisgICAgaW50IHNhbXBsZXNfYWxpZ247Cit9IFZvbHVtZUNvbnRleHQ7CisKK3ZvaWQgZmZfdm9sdW1lX2luaXRfeDg2KFZvbHVtZUNvbnRleHQgKnZvbCk7CisKKyNlbmRpZiAvKiBBVkZJTFRFUl9BRl9WT0xVTUVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX3ZvbHVtZWRldGVjdC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FmX3ZvbHVtZWRldGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTExNWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYWZfdm9sdW1lZGV0ZWN0LmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIHNhbXBsZXMgYXQgZWFjaCBQQ00gdmFsdWUuCisgICAgICogaGlzdG9ncmFtWzB4ODAwMCArIGldIGlzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBhdCB2YWx1ZSBpLgorICAgICAqIFRoZSBleHRyYSBlbGVtZW50IGlzIHRoZXJlIGZvciBzeW1tZXRyeS4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBoaXN0b2dyYW1bMHgxMDAwMV07Cit9IFZvbERldGVjdENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geworICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9OworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0czsKKworICAgIGlmICghKGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9mbXRzKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKnNhbXBsZXMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBWb2xEZXRlY3RDb250ZXh0ICp2ZCA9IGN0eC0+cHJpdjsKKyAgICBpbnQ2NF90IGxheW91dCAgPSBzYW1wbGVzLT5jaGFubmVsX2xheW91dDsKKyAgICBpbnQgbmJfc2FtcGxlcyAgPSBzYW1wbGVzLT5uYl9zYW1wbGVzOworICAgIGludCBuYl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhsYXlvdXQpOworICAgIGludCBuYl9wbGFuZXMgICA9IG5iX2NoYW5uZWxzOworICAgIGludCBwbGFuZSwgaTsKKyAgICBpbnQxNl90ICpwY207CisKKyAgICBpZiAoIWF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKHNhbXBsZXMtPmZvcm1hdCkpIHsKKyAgICAgICAgbmJfc2FtcGxlcyAqPSBuYl9jaGFubmVsczsKKyAgICAgICAgbmJfcGxhbmVzID0gMTsKKyAgICB9CisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgbmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIHBjbSA9IChpbnQxNl90ICopc2FtcGxlcy0+ZXh0ZW5kZWRfZGF0YVtwbGFuZV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspCisgICAgICAgICAgICB2ZC0+aGlzdG9ncmFtW3BjbVtpXSArIDB4ODAwMF0rKzsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGlubGluay0+ZHN0LT5vdXRwdXRzWzBdLCBzYW1wbGVzKTsKK30KKworI2RlZmluZSBNQVhfREIgOTEKKworc3RhdGljIGlubGluZSBkb3VibGUgbG9nZGIodWludDY0X3QgdikKK3sKKyAgICBkb3VibGUgZCA9IHYgLyAoZG91YmxlKSgweDgwMDAgKiAweDgwMDApOworICAgIGlmICghdikKKyAgICAgICAgcmV0dXJuIE1BWF9EQjsKKyAgICByZXR1cm4gbG9nKGQpICogLTQuMzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDUwODIyOTsgLyogLTEwL2xvZygxMCkgKi8KK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVm9sRGV0ZWN0Q29udGV4dCAqdmQgPSBjdHgtPnByaXY7CisgICAgaW50IGksIG1heF92b2x1bWUsIHNoaWZ0OworICAgIHVpbnQ2NF90IG5iX3NhbXBsZXMgPSAwLCBwb3dlciA9IDAsIG5iX3NhbXBsZXNfc2hpZnQgPSAwLCBzdW0gPSAwOworICAgIHVpbnQ2NF90IGhpc3RkYltNQVhfREIgKyAxXSA9IHsgMCB9OworCisgICAgZm9yIChpID0gMDsgaSA8IDB4MTAwMDA7IGkrKykKKyAgICAgICAgbmJfc2FtcGxlcyArPSB2ZC0+aGlzdG9ncmFtW2ldOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAibl9zYW1wbGVzOiAlIlBSSWQ2NCJcbiIsIG5iX3NhbXBsZXMpOworICAgIGlmICghbmJfc2FtcGxlcykKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogSWYgbmJfc2FtcGxlcyA+IDE8PDM0LCB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3cgaW4gdGhlCisgICAgICAgbXVsdGlwbGljYXRpb24gb3IgdGhlIHN1bTogc2hpZnQgYWxsIGhpc3RvZ3JhbSB2YWx1ZXMgdG8gYXZvaWQgdGhhdC4KKyAgICAgICBUaGUgdG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgbXVzdCBiZSByZWNvbXB1dGVkIHRvIGF2b2lkIHJvdW5kaW5nCisgICAgICAgZXJyb3JzLiAqLworICAgIHNoaWZ0ID0gYXZfbG9nMihuYl9zYW1wbGVzID4+IDMzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMHgxMDAwMDsgaSsrKSB7CisgICAgICAgIG5iX3NhbXBsZXNfc2hpZnQgKz0gdmQtPmhpc3RvZ3JhbVtpXSA+PiBzaGlmdDsKKyAgICAgICAgcG93ZXIgKz0gKGkgLSAweDgwMDApICogKGkgLSAweDgwMDApICogKHZkLT5oaXN0b2dyYW1baV0gPj4gc2hpZnQpOworICAgIH0KKyAgICBpZiAoIW5iX3NhbXBsZXNfc2hpZnQpCisgICAgICAgIHJldHVybjsKKyAgICBwb3dlciA9IChwb3dlciArIG5iX3NhbXBsZXNfc2hpZnQgLyAyKSAvIG5iX3NhbXBsZXNfc2hpZnQ7CisgICAgYXZfYXNzZXJ0MChwb3dlciA8PSAweDgwMDAgKiAweDgwMDApOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAibWVhbl92b2x1bWU6ICUuMWYgZEJcbiIsIC1sb2dkYihwb3dlcikpOworCisgICAgbWF4X3ZvbHVtZSA9IDB4ODAwMDsKKyAgICB3aGlsZSAobWF4X3ZvbHVtZSA+IDAgJiYgIXZkLT5oaXN0b2dyYW1bMHg4MDAwICsgbWF4X3ZvbHVtZV0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXZkLT5oaXN0b2dyYW1bMHg4MDAwIC0gbWF4X3ZvbHVtZV0pCisgICAgICAgIG1heF92b2x1bWUtLTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIm1heF92b2x1bWU6ICUuMWYgZEJcbiIsIC1sb2dkYihtYXhfdm9sdW1lICogbWF4X3ZvbHVtZSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDB4MTAwMDA7IGkrKykKKyAgICAgICAgaGlzdGRiWyhpbnQpbG9nZGIoKGkgLSAweDgwMDApICogKGkgLSAweDgwMDApKV0gKz0gdmQtPmhpc3RvZ3JhbVtpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9EQiAmJiAhaGlzdGRiW2ldOyBpKyspOworICAgIGZvciAoOyBpIDw9IE1BWF9EQiAmJiBzdW0gPCBuYl9zYW1wbGVzIC8gMTAwMDsgaSsrKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiaGlzdG9ncmFtXyVkZGI6ICUiUFJJZDY0IlxuIiwgaSwgaGlzdGRiW2ldKTsKKyAgICAgICAgc3VtICs9IGhpc3RkYltpXTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHByaW50X3N0YXRzKGN0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB2b2x1bWVkZXRlY3RfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB2b2x1bWVkZXRlY3Rfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX3ZvbHVtZWRldGVjdCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJ2b2x1bWVkZXRlY3QiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRldGVjdCBhdWRpbyB2b2x1bWUuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoVm9sRGV0ZWN0Q29udGV4dCksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICAgID0gdm9sdW1lZGV0ZWN0X2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHZvbHVtZWRldGVjdF9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hbGxfY2hhbm5lbF9sYXlvdXRzLmluYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hbGxfY2hhbm5lbF9sYXlvdXRzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzhlMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FsbF9jaGFubmVsX2xheW91dHMuaW5jCkBAIC0wLDAgKzEsNjggQEAKK0FWX0NIX0ZST05UX0NFTlRFUiwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9MT1dfRlJFUVVFTkNZLAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfTE9XX0ZSRVFVRU5DWSwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfRlJPTlRfQ0VOVEVSLAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVHxBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWSwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9MT1dfRlJFUVVFTkNZfEFWX0NIX0JBQ0tfTEVGVHxBVl9DSF9CQUNLX1JJR0hULAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVHxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfRlJPTlRfQ0VOVEVSfEFWX0NIX0JBQ0tfTEVGVHxBVl9DSF9CQUNLX1JJR0hULAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVHxBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9CQUNLX0NFTlRFUiwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9MT1dfRlJFUVVFTkNZfEFWX0NIX0JBQ0tfQ0VOVEVSLAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVHxBVl9DSF9CQUNLX0NFTlRFUiwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0NFTlRFUiwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfRlJPTlRfQ0VOVEVSfEFWX0NIX0JBQ0tfQ0VOVEVSLAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVHxBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0NFTlRFUiwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9MT1dfRlJFUVVFTkNZfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hULAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVHxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfRlJPTlRfQ0VOVEVSfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hULAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVHxBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVHxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9MT1dfRlJFUVVFTkNZfEFWX0NIX0JBQ0tfTEVGVHxBVl9DSF9CQUNLX1JJR0hUfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hULAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVHxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVHxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVHxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfRlJPTlRfQ0VOVEVSfEFWX0NIX0JBQ0tfTEVGVHxBVl9DSF9CQUNLX1JJR0hUfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hULAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVHxBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVHxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9MT1dfRlJFUVVFTkNZfEFWX0NIX0JBQ0tfQ0VOVEVSfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hULAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVHxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfRlJPTlRfQ0VOVEVSfEFWX0NIX0JBQ0tfQ0VOVEVSfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hULAorQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVHxBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX1NURVJFT19MRUZUfEFWX0NIX1NURVJFT19SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9MT1dfRlJFUVVFTkNZfEFWX0NIX1NURVJFT19MRUZUfEFWX0NIX1NURVJFT19SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0JBQ0tfTEVGVHxBVl9DSF9CQUNLX1JJR0hUfEFWX0NIX1NURVJFT19MRUZUfEFWX0NIX1NURVJFT19SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9MT1dfRlJFUVVFTkNZfEFWX0NIX0JBQ0tfTEVGVHxBVl9DSF9CQUNLX1JJR0hUfEFWX0NIX1NURVJFT19MRUZUfEFWX0NIX1NURVJFT19SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0JBQ0tfQ0VOVEVSfEFWX0NIX1NURVJFT19MRUZUfEFWX0NIX1NURVJFT19SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9MT1dfRlJFUVVFTkNZfEFWX0NIX0JBQ0tfQ0VOVEVSfEFWX0NIX1NURVJFT19MRUZUfEFWX0NIX1NURVJFT19SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hUfEFWX0NIX1NURVJFT19MRUZUfEFWX0NIX1NURVJFT19SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9MT1dfRlJFUVVFTkNZfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hUfEFWX0NIX1NURVJFT19MRUZUfEFWX0NIX1NURVJFT19SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVHxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVHxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0JBQ0tfTEVGVHxBVl9DSF9CQUNLX1JJR0hUfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hUfEFWX0NIX1NURVJFT19MRUZUfEFWX0NIX1NURVJFT19SSUdIVCwKK0FWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9DRU5URVJ8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0JBQ0tfQ0VOVEVSfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hUfEFWX0NIX1NURVJFT19MRUZUfEFWX0NIX1NURVJFT19SSUdIVCwKK0FWX0NIX0ZST05UX0xFRlR8QVZfQ0hfRlJPTlRfUklHSFR8QVZfQ0hfTE9XX0ZSRVFVRU5DWXxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCitBVl9DSF9GUk9OVF9MRUZUfEFWX0NIX0ZST05UX1JJR0hUfEFWX0NIX0ZST05UX0NFTlRFUnxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9TSURFX0xFRlR8QVZfQ0hfU0lERV9SSUdIVHxBVl9DSF9TVEVSRU9fTEVGVHxBVl9DSF9TVEVSRU9fUklHSFQsCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYWxsZmlsdGVycy5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzUyZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYwpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIGZpbHRlciByZWdpc3RyYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwOCBWaXRvciBTZXNzYWsKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAib3BlbmNsX2FsbGtlcm5lbHMuaCIKKworCisjZGVmaW5lIFJFR0lTVEVSX0ZJTFRFUihYLCB4LCB5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGV4dGVybiBBVkZpbHRlciBmZl8jI3kjI18jI3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChDT05GSUdfIyNYIyNfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdmZpbHRlcl9yZWdpc3RlcigmZmZfIyN5IyNfIyN4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIFJFR0lTVEVSX0ZJTFRFUl9VTkNPTkRJVElPTkFMKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGV4dGVybiBBVkZpbHRlciBmZl8jI3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2ZmlsdGVyX3JlZ2lzdGVyKCZmZl8jI3gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCit2b2lkIGF2ZmlsdGVyX3JlZ2lzdGVyX2FsbCh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisKKyAgICBpZiAoaW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBpbml0aWFsaXplZCA9IDE7CisKKyAgICBSRUdJU1RFUl9GSUxURVIoQURFTEFZLCAgICAgICAgIGFkZWxheSwgICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEFFQ0hPLCAgICAgICAgICBhZWNobywgICAgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihBRVZBTCwgICAgICAgICAgYWV2YWwsICAgICAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQUZBREUsICAgICAgICAgIGFmYWRlLCAgICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEFGT1JNQVQsICAgICAgICBhZm9ybWF0LCAgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihBSU5URVJMRUFWRSwgICAgYWludGVybGVhdmUsICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQUxMUEFTUywgICAgICAgIGFsbHBhc3MsICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEFNRVJHRSwgICAgICAgICBhbWVyZ2UsICAgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihBTUlYLCAgICAgICAgICAgYW1peCwgICAgICAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQU5VTEwsICAgICAgICAgIGFudWxsLCAgICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEFQQUQsICAgICAgICAgICBhcGFkLCAgICAgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihBUEVSTVMsICAgICAgICAgYXBlcm1zLCAgICAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQVBIQVNFUiwgICAgICAgIGFwaGFzZXIsICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEFSRVNBTVBMRSwgICAgICBhcmVzYW1wbGUsICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihBU0VMRUNULCAgICAgICAgYXNlbGVjdCwgICAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQVNFTkRDTUQsICAgICAgIGFzZW5kY21kLCAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEFTRVROU0FNUExFUywgICBhc2V0bnNhbXBsZXMsICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihBU0VUUFRTLCAgICAgICAgYXNldHB0cywgICAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQVNFVFJBVEUsICAgICAgIGFzZXRyYXRlLCAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEFTRVRUQiwgICAgICAgICBhc2V0dGIsICAgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihBU0hPV0lORk8sICAgICAgYXNob3dpbmZvLCAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQVNQTElULCAgICAgICAgIGFzcGxpdCwgICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEFTVEFUUywgICAgICAgICBhc3RhdHMsICAgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihBU1RSRUFNU1lOQywgICAgYXN0cmVhbXN5bmMsICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQVNZTkNUUywgICAgICAgIGFzeW5jdHMsICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEFURU1QTywgICAgICAgICBhdGVtcG8sICAgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihBVFJJTSwgICAgICAgICAgYXRyaW0sICAgICAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQVpNUSwgICAgICAgICAgIGF6bXEsICAgICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEJBTkRQQVNTLCAgICAgICBiYW5kcGFzcywgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihCQU5EUkVKRUNULCAgICAgYmFuZHJlamVjdCwgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQkFTUywgICAgICAgICAgIGJhc3MsICAgICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEJJUVVBRCwgICAgICAgICBiaXF1YWQsICAgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihCUzJCLCAgICAgICAgICAgYnMyYiwgICAgICAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQ0hBTk5FTE1BUCwgICAgIGNoYW5uZWxtYXAsICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKENIQU5ORUxTUExJVCwgICBjaGFubmVsc3BsaXQsICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihDT01QQU5ELCAgICAgICAgY29tcGFuZCwgICAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoRUFSV0FYLCAgICAgICAgIGVhcndheCwgICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEVCVVIxMjgsICAgICAgICBlYnVyMTI4LCAgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihFUVVBTElaRVIsICAgICAgZXF1YWxpemVyLCAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoRkxBTkdFUiwgICAgICAgIGZsYW5nZXIsICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKEhJR0hQQVNTLCAgICAgICBoaWdocGFzcywgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihKT0lOLCAgICAgICAgICAgam9pbiwgICAgICAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoTEFEU1BBLCAgICAgICAgIGxhZHNwYSwgICAgICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKExPV1BBU1MsICAgICAgICBsb3dwYXNzLCAgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihQQU4sICAgICAgICAgICAgcGFuLCAgICAgICAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoUkVQTEFZR0FJTiwgICAgIHJlcGxheWdhaW4sICAgICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKFJFU0FNUExFLCAgICAgICByZXNhbXBsZSwgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihTSUxFTkNFREVURUNULCAgc2lsZW5jZWRldGVjdCwgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU0lMRU5DRVJFTU9WRSwgIHNpbGVuY2VyZW1vdmUsICBhZik7CisgICAgUkVHSVNURVJfRklMVEVSKFRSRUJMRSwgICAgICAgICB0cmVibGUsICAgICAgICAgYWYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihWT0xVTUUsICAgICAgICAgdm9sdW1lLCAgICAgICAgIGFmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoVk9MVU1FREVURUNULCAgIHZvbHVtZWRldGVjdCwgICBhZik7CisKKyAgICBSRUdJU1RFUl9GSUxURVIoQUVWQUxTUkMsICAgICAgIGFldmFsc3JjLCAgICAgICBhc3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQU5VTExTUkMsICAgICAgIGFudWxsc3JjLCAgICAgICBhc3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoRkxJVEUsICAgICAgICAgIGZsaXRlLCAgICAgICAgICBhc3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU0lORSwgICAgICAgICAgIHNpbmUsICAgICAgICAgICBhc3JjKTsKKworICAgIFJFR0lTVEVSX0ZJTFRFUihBTlVMTFNJTkssICAgICAgYW51bGxzaW5rLCAgICAgIGFzaW5rKTsKKworICAgIFJFR0lTVEVSX0ZJTFRFUihBTFBIQUVYVFJBQ1QsICAgYWxwaGFleHRyYWN0LCAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQUxQSEFNRVJHRSwgICAgIGFscGhhbWVyZ2UsICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKEFTUywgICAgICAgICAgICBhc3MsICAgICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihCQk9YLCAgICAgICAgICAgYmJveCwgICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQkxBQ0tERVRFQ1QsICAgIGJsYWNrZGV0ZWN0LCAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKEJMQUNLRlJBTUUsICAgICBibGFja2ZyYW1lLCAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihCTEVORCwgICAgICAgICAgYmxlbmQsICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQk9YQkxVUiwgICAgICAgIGJveGJsdXIsICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKENPREVDVklFVywgICAgICBjb2RlY3ZpZXcsICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihDT0xPUkJBTEFOQ0UsICAgY29sb3JiYWxhbmNlLCAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQ09MT1JDSEFOTkVMTUlYRVIsIGNvbG9yY2hhbm5lbG1peGVyLCB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKENPTE9STUFUUklYLCAgICBjb2xvcm1hdHJpeCwgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihDT1BZLCAgICAgICAgICAgY29weSwgICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQ1JPUCwgICAgICAgICAgIGNyb3AsICAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKENST1BERVRFQ1QsICAgICBjcm9wZGV0ZWN0LCAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihDVVJWRVMsICAgICAgICAgY3VydmVzLCAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoRENURE5PSVosICAgICAgIGRjdGRub2l6LCAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKERFQ0lNQVRFLCAgICAgICBkZWNpbWF0ZSwgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihERUpVRERFUiwgICAgICAgZGVqdWRkZXIsICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoREVMT0dPLCAgICAgICAgIGRlbG9nbywgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKERFU0hBS0UsICAgICAgICBkZXNoYWtlLCAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihEUkFXQk9YLCAgICAgICAgZHJhd2JveCwgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoRFJBV0dSSUQsICAgICAgIGRyYXdncmlkLCAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKERSQVdURVhULCAgICAgICBkcmF3dGV4dCwgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihFREdFREVURUNULCAgICAgZWRnZWRldGVjdCwgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoRUxCRywgICAgICAgICAgIGVsYmcsICAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKEVYVFJBQ1RQTEFORVMsICBleHRyYWN0cGxhbmVzLCAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihGQURFLCAgICAgICAgICAgZmFkZSwgICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoRklFTEQsICAgICAgICAgIGZpZWxkLCAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKEZJRUxETUFUQ0gsICAgICBmaWVsZG1hdGNoLCAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihGSUVMRE9SREVSLCAgICAgZmllbGRvcmRlciwgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoRk9STUFULCAgICAgICAgIGZvcm1hdCwgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKEZQUywgICAgICAgICAgICBmcHMsICAgICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihGUkFNRVBBQ0ssICAgICAgZnJhbWVwYWNrLCAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoRlJBTUVTVEVQLCAgICAgIGZyYW1lc3RlcCwgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKEZSRUkwUiwgICAgICAgICBmcmVpMHIsICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihHRVEsICAgICAgICAgICAgZ2VxLCAgICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoR1JBREZVTiwgICAgICAgIGdyYWRmdW4sICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKEhBTERDTFVULCAgICAgICBoYWxkY2x1dCwgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihIRkxJUCwgICAgICAgICAgaGZsaXAsICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoSElTVEVRLCAgICAgICAgIGhpc3RlcSwgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKEhJU1RPR1JBTSwgICAgICBoaXN0b2dyYW0sICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihIUUROM0QsICAgICAgICAgaHFkbjNkLCAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoSFFYLCAgICAgICAgICAgIGhxeCwgICAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKEhVRSwgICAgICAgICAgICBodWUsICAgICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihJREVULCAgICAgICAgICAgaWRldCwgICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoSUwsICAgICAgICAgICAgIGlsLCAgICAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKElOVEVSTEFDRSwgICAgICBpbnRlcmxhY2UsICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihJTlRFUkxFQVZFLCAgICAgaW50ZXJsZWF2ZSwgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoS0VSTkRFSU5ULCAgICAgIGtlcm5kZWludCwgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKExFTlNDT1JSRUNUSU9OLCBsZW5zY29ycmVjdGlvbiwgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihMVVQzRCwgICAgICAgICAgbHV0M2QsICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoTFVULCAgICAgICAgICAgIGx1dCwgICAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKExVVFJHQiwgICAgICAgICBsdXRyZ2IsICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihMVVRZVVYsICAgICAgICAgbHV0eXV2LCAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoTUNERUlOVCwgICAgICAgIG1jZGVpbnQsICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKE1FUkdFUExBTkVTLCAgICBtZXJnZXBsYW5lcywgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihNUCwgICAgICAgICAgICAgbXAsICAgICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoTVBERUNJTUFURSwgICAgIG1wZGVjaW1hdGUsICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKE5FR0FURSwgICAgICAgICBuZWdhdGUsICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihOT0ZPUk1BVCwgICAgICAgbm9mb3JtYXQsICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoTk9JU0UsICAgICAgICAgIG5vaXNlLCAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKE5VTEwsICAgICAgICAgICBudWxsLCAgICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihPQ1YsICAgICAgICAgICAgb2N2LCAgICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoT1ZFUkxBWSwgICAgICAgIG92ZXJsYXksICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKE9XREVOT0lTRSwgICAgICBvd2Rlbm9pc2UsICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihQQUQsICAgICAgICAgICAgcGFkLCAgICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoUEVSTVMsICAgICAgICAgIHBlcm1zLCAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFBFUlNQRUNUSVZFLCAgICBwZXJzcGVjdGl2ZSwgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihQSEFTRSwgICAgICAgICAgcGhhc2UsICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoUElYREVTQ1RFU1QsICAgIHBpeGRlc2N0ZXN0LCAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFBQLCAgICAgICAgICAgICBwcCwgICAgICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihQU05SLCAgICAgICAgICAgcHNuciwgICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoUFVMTFVQLCAgICAgICAgIHB1bGx1cCwgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFJFTU9WRUxPR08sICAgICByZW1vdmVsb2dvLCAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihST1RBVEUsICAgICAgICAgcm90YXRlLCAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU0FCLCAgICAgICAgICAgIHNhYiwgICAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFNDQUxFLCAgICAgICAgICBzY2FsZSwgICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihTRUxFQ1QsICAgICAgICAgc2VsZWN0LCAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU0VORENNRCwgICAgICAgIHNlbmRjbWQsICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFNFUEFSQVRFRklFTERTLCBzZXBhcmF0ZWZpZWxkcywgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihTRVREQVIsICAgICAgICAgc2V0ZGFyLCAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU0VURklFTEQsICAgICAgIHNldGZpZWxkLCAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFNFVFBUUywgICAgICAgICBzZXRwdHMsICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihTRVRTQVIsICAgICAgICAgc2V0c2FyLCAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU0VUVEIsICAgICAgICAgIHNldHRiLCAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFNIT1dJTkZPLCAgICAgICBzaG93aW5mbywgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihTSFVGRkxFUExBTkVTLCAgc2h1ZmZsZXBsYW5lcywgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU0lHTkFMU1RBVFMsICAgIHNpZ25hbHN0YXRzLCAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFNNQVJUQkxVUiwgICAgICBzbWFydGJsdXIsICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihTUExJVCwgICAgICAgICAgc3BsaXQsICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU1BQLCAgICAgICAgICAgIHNwcCwgICAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFNURVJFTzNELCAgICAgICBzdGVyZW8zZCwgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihTVUJUSVRMRVMsICAgICAgc3VidGl0bGVzLCAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU1VQRVIyWFNBSSwgICAgIHN1cGVyMnhzYWksICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFNXQVBVViwgICAgICAgICBzd2FwdXYsICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihURUxFQ0lORSwgICAgICAgdGVsZWNpbmUsICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoVEhVTUJOQUlMLCAgICAgIHRodW1ibmFpbCwgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFRJTEUsICAgICAgICAgICB0aWxlLCAgICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihUSU5URVJMQUNFLCAgICAgdGludGVybGFjZSwgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoVFJBTlNQT1NFLCAgICAgIHRyYW5zcG9zZSwgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFRSSU0sICAgICAgICAgICB0cmltLCAgICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihVTlNIQVJQLCAgICAgICAgdW5zaGFycCwgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoVkZMSVAsICAgICAgICAgIHZmbGlwLCAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFZJRFNUQUJERVRFQ1QsICB2aWRzdGFiZGV0ZWN0LCAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihWSURTVEFCVFJBTlNGT1JNLCB2aWRzdGFidHJhbnNmb3JtLCB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFZJR05FVFRFLCAgICAgICB2aWduZXR0ZSwgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihXM0ZESUYsICAgICAgICAgdzNmZGlmLCAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoWEJSLCAgICAgICAgICAgIHhiciwgICAgICAgICAgICB2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFlBRElGLCAgICAgICAgICB5YWRpZiwgICAgICAgICAgdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihaTVEsICAgICAgICAgICAgem1xLCAgICAgICAgICAgIHZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoWk9PTVBBTiwgICAgICAgIHpvb21wYW4sICAgICAgICB2Zik7CisKKyAgICBSRUdJU1RFUl9GSUxURVIoQ0VMTEFVVE8sICAgICAgIGNlbGxhdXRvLCAgICAgICB2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoQ09MT1IsICAgICAgICAgIGNvbG9yLCAgICAgICAgICB2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoRlJFSTBSLCAgICAgICAgIGZyZWkwcl9zcmMsICAgICB2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoSEFMRENMVVRTUkMsICAgIGhhbGRjbHV0c3JjLCAgICB2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoTElGRSwgICAgICAgICAgIGxpZmUsICAgICAgICAgICB2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoTUFOREVMQlJPVCwgICAgIG1hbmRlbGJyb3QsICAgICB2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoTVBURVNUU1JDLCAgICAgIG1wdGVzdHNyYywgICAgICB2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoTlVMTFNSQywgICAgICAgIG51bGxzcmMsICAgICAgICB2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoUkdCVEVTVFNSQywgICAgIHJnYnRlc3RzcmMsICAgICB2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU01QVEVCQVJTLCAgICAgIHNtcHRlYmFycywgICAgICB2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU01QVEVIREJBUlMsICAgIHNtcHRlaGRiYXJzLCAgICB2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoVEVTVFNSQywgICAgICAgIHRlc3RzcmMsICAgICAgICB2c3JjKTsKKworICAgIFJFR0lTVEVSX0ZJTFRFUihOVUxMU0lOSywgICAgICAgbnVsbHNpbmssICAgICAgIHZzaW5rKTsKKworICAgIC8qIG11bHRpbWVkaWEgZmlsdGVycyAqLworICAgIFJFR0lTVEVSX0ZJTFRFUihBVkVDVE9SU0NPUEUsICAgYXZlY3RvcnNjb3BlLCAgIGF2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKENPTkNBVCwgICAgICAgICBjb25jYXQsICAgICAgICAgYXZmKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoU0hPV0NRVCwgICAgICAgIHNob3djcXQsICAgICAgICBhdmYpOworICAgIFJFR0lTVEVSX0ZJTFRFUihTSE9XU1BFQ1RSVU0sICAgc2hvd3NwZWN0cnVtLCAgIGF2Zik7CisgICAgUkVHSVNURVJfRklMVEVSKFNIT1dXQVZFUywgICAgICBzaG93d2F2ZXMsICAgICAgYXZmKTsKKworICAgIC8qIG11bHRpbWVkaWEgc291cmNlcyAqLworICAgIFJFR0lTVEVSX0ZJTFRFUihBTU9WSUUsICAgICAgICAgYW1vdmllLCAgICAgICAgIGF2c3JjKTsKKyAgICBSRUdJU1RFUl9GSUxURVIoTU9WSUUsICAgICAgICAgIG1vdmllLCAgICAgICAgICBhdnNyYyk7CisKKyNpZiBGRl9BUElfQVZGSUxURVJCVUZGRVIKKyAgICBSRUdJU1RFUl9GSUxURVJfVU5DT05ESVRJT05BTCh2c2lua19mZmJ1ZmZlcnNpbmspOworICAgIFJFR0lTVEVSX0ZJTFRFUl9VTkNPTkRJVElPTkFMKGFzaW5rX2ZmYWJ1ZmZlcnNpbmspOworI2VuZGlmCisKKyAgICAvKiB0aG9zZSBmaWx0ZXJzIGFyZSBwYXJ0IG9mIHB1YmxpYyBvciBpbnRlcm5hbCBBUEkgPT4gcmVnaXN0ZXJlZAorICAgICAqIHVuY29uZGl0aW9uYWxseSAqLworICAgIFJFR0lTVEVSX0ZJTFRFUl9VTkNPTkRJVElPTkFMKGFzcmNfYWJ1ZmZlcik7CisgICAgUkVHSVNURVJfRklMVEVSX1VOQ09ORElUSU9OQUwodnNyY19idWZmZXIpOworICAgIFJFR0lTVEVSX0ZJTFRFUl9VTkNPTkRJVElPTkFMKGFzaW5rX2FidWZmZXIpOworICAgIFJFR0lTVEVSX0ZJTFRFUl9VTkNPTkRJVElPTkFMKHZzaW5rX2J1ZmZlcik7CisgICAgUkVHSVNURVJfRklMVEVSX1VOQ09ORElUSU9OQUwoYWZfYWZpZm8pOworICAgIFJFR0lTVEVSX0ZJTFRFUl9VTkNPTkRJVElPTkFMKHZmX2ZpZm8pOworICAgIGZmX29wZW5jbF9yZWdpc3Rlcl9maWx0ZXJfa2VybmVsX2NvZGVfYWxsKCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYXNpbmtfYW51bGxzaW5rLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXNpbmtfYW51bGxzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1M2QzZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hc2lua19hbnVsbHNpbmsuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFMuTi4gSGVtYW50aCBNZWVuYWtzaGlzdW5kYXJhbSA8c21lZW5ha3NAdWNzZC5lZHU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgbnVsbF9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl9hc2lua19hbnVsbHNpbmtfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgID0gbnVsbF9maWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK0FWRmlsdGVyIGZmX2FzaW5rX2FudWxsc2luayA9IHsKKyAgICAubmFtZSAgICAgICAgPSAiYW51bGxzaW5rIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRG8gYWJzb2x1dGVseSBub3RoaW5nIHdpdGggdGhlIGlucHV0IGF1ZGlvLiIpLAorCisgICAgLnByaXZfc2l6ZSA9IDAsCisKKyAgICAuaW5wdXRzICAgID0gYXZmaWx0ZXJfYXNpbmtfYW51bGxzaW5rX2lucHV0cywKKyAgICAub3V0cHV0cyAgID0gTlVMTCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYXNyY19hYnVmZmVyLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXNyY19hYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzNDQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hc3JjX2FidWZmZXIuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfQVNSQ19BQlVGRkVSX0gKKyNkZWZpbmUgQVZGSUxURVJfQVNSQ19BQlVGRkVSX0gKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisKKy8qKgorICogQGZpbGUKKyAqIG1lbW9yeSBidWZmZXIgc291cmNlIGZvciBhdWRpbworICoKKyAqIEBkZXByZWNhdGVkIHVzZSBidWZmZXJzcmMuaCBpbnN0ZWFkLgorICovCisKKy8qKgorICogUXVldWUgYW4gYXVkaW8gYnVmZmVyIHRvIHRoZSBhdWRpbyBidWZmZXIgc291cmNlLgorICoKKyAqIEBwYXJhbSBhYnVmZmVyc3JjIGF1ZGlvIHNvdXJjZSBidWZmZXIgY29udGV4dAorICogQHBhcmFtIGRhdGEgcG9pbnRlcnMgdG8gdGhlIHNhbXBsZXMgcGxhbmVzCisgKiBAcGFyYW0gbGluZXNpemUgbGluZXNpemVzIG9mIGVhY2ggYXVkaW8gYnVmZmVyIHBsYW5lCisgKiBAcGFyYW0gbmJfc2FtcGxlcyBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbAorICogQHBhcmFtIHNhbXBsZV9mbXQgc2FtcGxlIGZvcm1hdCBvZiB0aGUgYXVkaW8gZGF0YQorICogQHBhcmFtIGNoX2xheW91dCBjaGFubmVsIGxheW91dCBvZiB0aGUgYXVkaW8gZGF0YQorICogQHBhcmFtIHBsYW5hciBmbGFnIHRvIGluZGljYXRlIGlmIGF1ZGlvIGRhdGEgaXMgcGxhbmFyIG9yIHBhY2tlZAorICogQHBhcmFtIHB0cyBwcmVzZW50YXRpb24gdGltZXN0YW1wIG9mIHRoZSBhdWRpbyBidWZmZXIKKyAqIEBwYXJhbSBmbGFncyB1bnVzZWQKKyAqCisgKiBAZGVwcmVjYXRlZCB1c2UgYXZfYnVmZmVyc3JjX2FkZF9yZWYoKSBpbnN0ZWFkLgorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IGF2X2FzcmNfYnVmZmVyX2FkZF9zYW1wbGVzKEFWRmlsdGVyQ29udGV4dCAqYWJ1ZmZlcnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhWzhdLCBpbnQgbGluZXNpemVbOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCBzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlX2ZtdCwgaW50NjRfdCBjaF9sYXlvdXQsIGludCBwbGFuYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMsIGludCBhdl91bnVzZWQgZmxhZ3MpOworCisvKioKKyAqIFF1ZXVlIGFuIGF1ZGlvIGJ1ZmZlciB0byB0aGUgYXVkaW8gYnVmZmVyIHNvdXJjZS4KKyAqCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gYXZfYXNyY19idWZmZXJfYWRkX3NhbXBsZXMoKSwgYnV0IHRoZSBzYW1wbGVzCisgKiBhcmUgc3RvcmVkIGluIGEgYnVmZmVyIHdpdGgga25vd24gc2l6ZS4KKyAqCisgKiBAcGFyYW0gYWJ1ZmZlcnNyYyBhdWRpbyBzb3VyY2UgYnVmZmVyIGNvbnRleHQKKyAqIEBwYXJhbSBidWYgcG9pbnRlciB0byB0aGUgc2FtcGxlcyBkYXRhLCBwYWNrZWQgaXMgYXNzdW1lZAorICogQHBhcmFtIHNpemUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciwgaXQgbXVzdCBjb250YWluIGFuCisgKiBpbnRlZ2VyIG51bWJlciBvZiBzYW1wbGVzCisgKiBAcGFyYW0gc2FtcGxlX2ZtdCBzYW1wbGUgZm9ybWF0IG9mIHRoZSBhdWRpbyBkYXRhCisgKiBAcGFyYW0gY2hfbGF5b3V0IGNoYW5uZWwgbGF5b3V0IG9mIHRoZSBhdWRpbyBkYXRhCisgKiBAcGFyYW0gcHRzIHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgb2YgdGhlIGF1ZGlvIGJ1ZmZlcgorICogQHBhcmFtIGZsYWdzIHVudXNlZAorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBhdl9idWZmZXJzcmNfYWRkX3JlZigpIGluc3RlYWQuCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitpbnQgYXZfYXNyY19idWZmZXJfYWRkX2J1ZmZlcihBVkZpbHRlckNvbnRleHQgKmFidWZmZXJzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfZm10LCBpbnQ2NF90IGNoX2xheW91dCwgaW50IHBsYW5hciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzLCBpbnQgYXZfdW51c2VkIGZsYWdzKTsKKworLyoqCisgKiBRdWV1ZSBhbiBhdWRpbyBidWZmZXIgdG8gdGhlIGF1ZGlvIGJ1ZmZlciBzb3VyY2UuCisgKgorICogQHBhcmFtIGFidWZmZXJzcmMgYXVkaW8gc291cmNlIGJ1ZmZlciBjb250ZXh0CisgKiBAcGFyYW0gc2FtcGxlc3JlZiBidWZmZXIgcmVmIHRvIHF1ZXVlCisgKiBAcGFyYW0gZmxhZ3MgdW51c2VkCisgKgorICogQGRlcHJlY2F0ZWQgdXNlIGF2X2J1ZmZlcnNyY19hZGRfcmVmKCkgaW5zdGVhZC4KKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK2ludCBhdl9hc3JjX2J1ZmZlcl9hZGRfYXVkaW9fYnVmZmVyX3JlZihBVkZpbHRlckNvbnRleHQgKmFidWZmZXJzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJCdWZmZXJSZWYgKnNhbXBsZXNyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF2X3VudXNlZCBmbGFncyk7CisKKyNlbmRpZiAvKiBBVkZJTFRFUl9BU1JDX0FCVUZGRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FzcmNfYW51bGxzcmMuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hc3JjX2FudWxsc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkNDUwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hc3JjX2FudWxsc3JjLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBTLk4uIEhlbWFudGggTWVlbmFrc2hpc3VuZGFyYW0gPHNtZWVuYWtzIHVjc2QgZWR1PgorICogQ29weXJpZ2h0IDIwMTAgU3RlZmFubyBTYWJhdGluaSA8c3RlZmFuby5zYWJhdGluaS1sYWxhIHBvc3RlIGl0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBudWxsIGF1ZGlvIHNvdXJjZQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBjaGFyICAgKmNoYW5uZWxfbGF5b3V0X3N0cjsKKyAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dDsKKyAgICBjaGFyICAgKnNhbXBsZV9yYXRlX3N0cjsKKyAgICBpbnQgICAgIHNhbXBsZV9yYXRlOworICAgIGludCBuYl9zYW1wbGVzOyAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBzYW1wbGVzIHBlciByZXF1ZXN0ZWQgZnJhbWUKKyAgICBpbnQ2NF90IHB0czsKK30gQU51bGxDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBTnVsbENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYW51bGxzcmNfb3B0aW9uc1tdPSB7CisgICAgeyAiY2hhbm5lbF9sYXlvdXQiLCAic2V0IGNoYW5uZWxfbGF5b3V0IiwgT0ZGU0VUKGNoYW5uZWxfbGF5b3V0X3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAic3RlcmVvIn0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAiY2wiLCAgICAgICAgICAgICAic2V0IGNoYW5uZWxfbGF5b3V0IiwgT0ZGU0VUKGNoYW5uZWxfbGF5b3V0X3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAic3RlcmVvIn0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAic2FtcGxlX3JhdGUiLCAgICAic2V0IHNhbXBsZSByYXRlIiwgICAgT0ZGU0VUKHNhbXBsZV9yYXRlX3N0cikgICAsIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiNDQxMDAifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJyIiwgICAgICAgICAgICAgICJzZXQgc2FtcGxlIHJhdGUiLCAgICBPRkZTRVQoc2FtcGxlX3JhdGVfc3RyKSAgICwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICI0NDEwMCJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgIm5iX3NhbXBsZXMiLCAgICAgInNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHJlcXVlc3RlZCBmcmFtZSIsIE9GRlNFVChuYl9zYW1wbGVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDEwMjR9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgIm4iLCAgICAgICAgICAgICAgInNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHJlcXVlc3RlZCBmcmFtZSIsIE9GRlNFVChuYl9zYW1wbGVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDEwMjR9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYW51bGxzcmMpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBTnVsbENvbnRleHQgKm51bGwgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfcGFyc2Vfc2FtcGxlX3JhdGUoJm51bGwtPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwtPnNhbXBsZV9yYXRlX3N0ciwgY3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9wYXJzZV9jaGFubmVsX2xheW91dCgmbnVsbC0+Y2hhbm5lbF9sYXlvdXQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbC0+Y2hhbm5lbF9sYXlvdXRfc3RyLCBjdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFOdWxsQ29udGV4dCAqbnVsbCA9IGN0eC0+cHJpdjsKKyAgICBpbnQ2NF90IGNobGF5b3V0c1tdID0geyBudWxsLT5jaGFubmVsX2xheW91dCwgLTEgfTsKKyAgICBpbnQgc2FtcGxlX3JhdGVzW10gPSB7IG51bGwtPnNhbXBsZV9yYXRlLCAtMSB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzICAgICAgICAoY3R4LCBmZl9hbGxfZm9ybWF0cyhBVk1FRElBX1RZUEVfQVVESU8pKTsKKyAgICBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGF2ZmlsdGVyX21ha2VfZm9ybWF0NjRfbGlzdChjaGxheW91dHMpKTsKKyAgICBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzICAgIChjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX3JhdGVzKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFOdWxsQ29udGV4dCAqbnVsbCA9IG91dGxpbmstPnNyYy0+cHJpdjsKKyAgICBjaGFyIGJ1ZlsxMjhdOworCisgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhidWYsIHNpemVvZihidWYpLCAwLCBudWxsLT5jaGFubmVsX2xheW91dCk7CisgICAgYXZfbG9nKG91dGxpbmstPnNyYywgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICJzYW1wbGVfcmF0ZTolZCBjaGFubmVsX2xheW91dDonJXMnIG5iX3NhbXBsZXM6JWRcbiIsCisgICAgICAgICAgIG51bGwtPnNhbXBsZV9yYXRlLCBidWYsIG51bGwtPm5iX3NhbXBsZXMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgaW50IHJldDsKKyAgICBBTnVsbENvbnRleHQgKm51bGwgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisgICAgQVZGcmFtZSAqc2FtcGxlc3JlZjsKKworICAgIHNhbXBsZXNyZWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG51bGwtPm5iX3NhbXBsZXMpOworICAgIGlmICghc2FtcGxlc3JlZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHNhbXBsZXNyZWYtPnB0cyA9IG51bGwtPnB0czsKKyAgICBzYW1wbGVzcmVmLT5jaGFubmVsX2xheW91dCA9IG51bGwtPmNoYW5uZWxfbGF5b3V0OworICAgIHNhbXBsZXNyZWYtPnNhbXBsZV9yYXRlID0gb3V0bGluay0+c2FtcGxlX3JhdGU7CisKKyAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgYXZfZnJhbWVfY2xvbmUoc2FtcGxlc3JlZikpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnNhbXBsZXNyZWYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgbnVsbC0+cHRzICs9IG51bGwtPm5iX3NhbXBsZXM7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FzcmNfYW51bGxzcmNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19wcm9wcywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FzcmNfYW51bGxzcmMgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYW51bGxzcmMiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk51bGwgYXVkaW8gc291cmNlLCByZXR1cm4gZW1wdHkgYXVkaW8gZnJhbWVzLiIpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQU51bGxDb250ZXh0KSwKKyAgICAuaW5wdXRzICAgICAgICA9IE5VTEwsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl9hc3JjX2FudWxsc3JjX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmYW51bGxzcmNfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FzcmNfZmxpdGUuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hc3JjX2ZsaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4YTFkZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hc3JjX2ZsaXRlLmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBmbGl0ZSB2b2ljZSBzeW50aCBzb3VyY2UKKyAqLworCisjaW5jbHVkZSA8ZmxpdGUvZmxpdGUuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlsZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBjaGFyICp2b2ljZV9zdHI7CisgICAgY2hhciAqdGV4dGZpbGU7CisgICAgY2hhciAqdGV4dDsKKyAgICBjc3Rfd2F2ZSAqd2F2ZTsKKyAgICBpbnQxNl90ICp3YXZlX3NhbXBsZXM7CisgICAgaW50ICAgICAgd2F2ZV9uYl9zYW1wbGVzOworICAgIGludCBsaXN0X3ZvaWNlczsKKyAgICBjc3Rfdm9pY2UgKnZvaWNlOworICAgIHN0cnVjdCB2b2ljZV9lbnRyeSAqdm9pY2VfZW50cnk7CisgICAgaW50NjRfdCBwdHM7CisgICAgaW50IGZyYW1lX25iX3NhbXBsZXM7IC8vLzwgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lCit9IEZsaXRlQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRmxpdGVDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZsaXRlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJsaXN0X3ZvaWNlcyIsICJsaXN0IHZvaWNlcyBhbmQgZXhpdCIsICAgICAgICAgICAgICBPRkZTRVQobGlzdF92b2ljZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgIm5iX3NhbXBsZXMiLCAgInNldCBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUiLCAgIE9GRlNFVChmcmFtZV9uYl9zYW1wbGVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND01MTJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgIm4iLCAgICAgICAgICAgInNldCBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUiLCAgIE9GRlNFVChmcmFtZV9uYl9zYW1wbGVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND01MTJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInRleHQiLCAgICAgICAgInNldCB0ZXh0IHRvIHNwZWFrIiwgICAgICAgICAgICAgICAgIE9GRlNFVCh0ZXh0KSwgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAidGV4dGZpbGUiLCAgICAic2V0IGZpbGVuYW1lIG9mIHRoZSB0ZXh0IHRvIHNwZWFrIiwgT0ZGU0VUKHRleHRmaWxlKSwgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJ2IiwgICAgICAgICAgICJzZXQgdm9pY2UiLCAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQodm9pY2Vfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0ia2FsIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJ2b2ljZSIsICAgICAgICJzZXQgdm9pY2UiLCAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQodm9pY2Vfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0ia2FsIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGZsaXRlKTsKKworc3RhdGljIHZvbGF0aWxlIGludCBmbGl0ZV9pbml0ZWQgPSAwOworCisvKiBkZWNsYXJlIGZ1bmN0aW9ucyBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgdm9pY2VzICovCisjZGVmaW5lIERFQ0xBUkVfUkVHSVNURVJfVk9JQ0VfRk4obmFtZSkgXAorICAgIGNzdF92b2ljZSAqcmVnaXN0ZXJfY211X3VzXyMjIG5hbWUoY29uc3QgY2hhciAqKTsgXAorICAgIHZvaWQgICAgIHVucmVnaXN0ZXJfY211X3VzXyMjIG5hbWUoY3N0X3ZvaWNlICopOworREVDTEFSRV9SRUdJU1RFUl9WT0lDRV9GTihhd2IpOworREVDTEFSRV9SRUdJU1RFUl9WT0lDRV9GTihrYWwpOworREVDTEFSRV9SRUdJU1RFUl9WT0lDRV9GTihrYWwxNik7CitERUNMQVJFX1JFR0lTVEVSX1ZPSUNFX0ZOKHJtcyk7CitERUNMQVJFX1JFR0lTVEVSX1ZPSUNFX0ZOKHNsdCk7CisKK3N0cnVjdCB2b2ljZV9lbnRyeSB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjc3Rfdm9pY2UgKiAoKnJlZ2lzdGVyX2ZuKShjb25zdCBjaGFyICopOworICAgIHZvaWQgKCp1bnJlZ2lzdGVyX2ZuKShjc3Rfdm9pY2UgKik7CisgICAgY3N0X3ZvaWNlICp2b2ljZTsKKyAgICB1bnNpZ25lZCB1c2FnZV9jb3VudDsKK30gdm9pY2VfZW50cnk7CisKKyNkZWZpbmUgTUFLRV9WT0lDRV9TVFJVQ1RVUkUodm9pY2VfbmFtZSkgeyAgICAgICAgICAgICBcCisgICAgLm5hbWUgICAgICAgICAgPSAgICAgICAgICAgICAgICAgICAgICAjdm9pY2VfbmFtZSwgXAorICAgIC5yZWdpc3Rlcl9mbiAgID0gICByZWdpc3Rlcl9jbXVfdXNfICMjIHZvaWNlX25hbWUsIFwKKyAgICAudW5yZWdpc3Rlcl9mbiA9IHVucmVnaXN0ZXJfY211X3VzXyAjIyB2b2ljZV9uYW1lLCBcCit9CitzdGF0aWMgc3RydWN0IHZvaWNlX2VudHJ5IHZvaWNlX2VudHJpZXNbXSA9IHsKKyAgICBNQUtFX1ZPSUNFX1NUUlVDVFVSRShhd2IpLAorICAgIE1BS0VfVk9JQ0VfU1RSVUNUVVJFKGthbCksCisgICAgTUFLRV9WT0lDRV9TVFJVQ1RVUkUoa2FsMTYpLAorICAgIE1BS0VfVk9JQ0VfU1RSVUNUVVJFKHJtcyksCisgICAgTUFLRV9WT0lDRV9TVFJVQ1RVUkUoc2x0KSwKK307CisKK3N0YXRpYyB2b2lkIGxpc3Rfdm9pY2VzKHZvaWQgKmxvZ19jdHgsIGNvbnN0IGNoYXIgKnNlcCkKK3sKKyAgICBpbnQgaSwgbiA9IEZGX0FSUkFZX0VMRU1TKHZvaWNlX2VudHJpZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfSU5GTywgIiVzJXMiLAorICAgICAgICAgICAgICAgdm9pY2VfZW50cmllc1tpXS5uYW1lLCBpIDwgKG4tMSkgPyBzZXAgOiAiXG4iKTsKK30KKworc3RhdGljIGludCBzZWxlY3Rfdm9pY2Uoc3RydWN0IHZvaWNlX2VudHJ5ICoqZW50cnlfcmV0LCBjb25zdCBjaGFyICp2b2ljZV9uYW1lLCB2b2lkICpsb2dfY3R4KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHZvaWNlX2VudHJpZXMpOyBpKyspIHsKKyAgICAgICAgc3RydWN0IHZvaWNlX2VudHJ5ICplbnRyeSA9ICZ2b2ljZV9lbnRyaWVzW2ldOworICAgICAgICBpZiAoIXN0cmNtcChlbnRyeS0+bmFtZSwgdm9pY2VfbmFtZSkpIHsKKyAgICAgICAgICAgIGlmICghZW50cnktPnZvaWNlKQorICAgICAgICAgICAgICAgIGVudHJ5LT52b2ljZSA9IGVudHJ5LT5yZWdpc3Rlcl9mbihOVUxMKTsKKyAgICAgICAgICAgIGlmICghZW50cnktPnZvaWNlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZWdpc3RlciB2b2ljZSAnJXMnXG4iLCB2b2ljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW50cnktPnVzYWdlX2NvdW50Kys7CisgICAgICAgICAgICAqZW50cnlfcmV0ID0gZW50cnk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZmluZCB2b2ljZSAnJXMnXG4iLCB2b2ljZV9uYW1lKTsKKyAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0lORk8sICJDaG9vc2UgYmV0d2VlbiB0aGUgdm9pY2VzOiAiKTsKKyAgICBsaXN0X3ZvaWNlcyhsb2dfY3R4LCAiLCAiKTsKKworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEZsaXRlQ29udGV4dCAqZmxpdGUgPSBjdHgtPnByaXY7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoZmxpdGUtPmxpc3Rfdm9pY2VzKSB7CisgICAgICAgIGxpc3Rfdm9pY2VzKGN0eCwgIlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisgICAgfQorCisgICAgaWYgKCFmbGl0ZV9pbml0ZWQpIHsKKyAgICAgICAgaWYgKGZsaXRlX2luaXQoKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImZsaXRlIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIGZsaXRlX2luaXRlZCsrOworICAgIH0KKworICAgIGlmICgocmV0ID0gc2VsZWN0X3ZvaWNlKCZmbGl0ZS0+dm9pY2VfZW50cnksIGZsaXRlLT52b2ljZV9zdHIsIGN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBmbGl0ZS0+dm9pY2UgPSBmbGl0ZS0+dm9pY2VfZW50cnktPnZvaWNlOworCisgICAgaWYgKGZsaXRlLT50ZXh0ZmlsZSAmJiBmbGl0ZS0+dGV4dCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQm90aCB0ZXh0IGFuZCB0ZXh0ZmlsZSBvcHRpb25zIHNldDogb25seSBvbmUgbXVzdCBiZSBzcGVjaWZpZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChmbGl0ZS0+dGV4dGZpbGUpIHsKKyAgICAgICAgdWludDhfdCAqdGV4dGJ1ZjsKKyAgICAgICAgc2l6ZV90IHRleHRidWZfc2l6ZTsKKworICAgICAgICBpZiAoKHJldCA9IGF2X2ZpbGVfbWFwKGZsaXRlLT50ZXh0ZmlsZSwgJnRleHRidWYsICZ0ZXh0YnVmX3NpemUsIDAsIGN0eCkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJUaGUgdGV4dCBmaWxlICclcycgY291bGQgbm90IGJlIHJlYWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGZsaXRlLT50ZXh0ZmlsZSwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShmbGl0ZS0+dGV4dCA9IGF2X21hbGxvYyh0ZXh0YnVmX3NpemUrMSkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KGZsaXRlLT50ZXh0LCB0ZXh0YnVmLCB0ZXh0YnVmX3NpemUpOworICAgICAgICBmbGl0ZS0+dGV4dFt0ZXh0YnVmX3NpemVdID0gMDsKKyAgICAgICAgYXZfZmlsZV91bm1hcCh0ZXh0YnVmLCB0ZXh0YnVmX3NpemUpOworICAgIH0KKworICAgIGlmICghZmxpdGUtPnRleHQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk5vIHNwZWVjaCB0ZXh0IHNwZWNpZmllZCwgc3BlY2lmeSB0aGUgJ3RleHQnIG9yICd0ZXh0ZmlsZScgb3B0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvKiBzeW50aCBhbGwgdGhlIGZpbGUgZGF0YSBpbiBibG9jayAqLworICAgIGZsaXRlLT53YXZlID0gZmxpdGVfdGV4dF90b193YXZlKGZsaXRlLT50ZXh0LCBmbGl0ZS0+dm9pY2UpOworICAgIGZsaXRlLT53YXZlX3NhbXBsZXMgICAgPSBmbGl0ZS0+d2F2ZS0+c2FtcGxlczsKKyAgICBmbGl0ZS0+d2F2ZV9uYl9zYW1wbGVzID0gZmxpdGUtPndhdmUtPm51bV9zYW1wbGVzOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBGbGl0ZUNvbnRleHQgKmZsaXRlID0gY3R4LT5wcml2OworCisgICAgaWYgKCEtLWZsaXRlLT52b2ljZV9lbnRyeS0+dXNhZ2VfY291bnQpCisgICAgICAgIGZsaXRlLT52b2ljZV9lbnRyeS0+dW5yZWdpc3Rlcl9mbihmbGl0ZS0+dm9pY2UpOworICAgIGZsaXRlLT52b2ljZSA9IE5VTEw7CisgICAgZmxpdGUtPnZvaWNlX2VudHJ5ID0gTlVMTDsKKyAgICBkZWxldGVfd2F2ZShmbGl0ZS0+d2F2ZSk7CisgICAgZmxpdGUtPndhdmUgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRmxpdGVDb250ZXh0ICpmbGl0ZSA9IGN0eC0+cHJpdjsKKworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmNobGF5b3V0cyA9IE5VTEw7CisgICAgaW50NjRfdCBjaGxheW91dCA9IGF2X2dldF9kZWZhdWx0X2NoYW5uZWxfbGF5b3V0KGZsaXRlLT53YXZlLT5udW1fY2hhbm5lbHMpOworICAgIEFWRmlsdGVyRm9ybWF0cyAqc2FtcGxlX2Zvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyRm9ybWF0cyAqc2FtcGxlX3JhdGVzID0gTlVMTDsKKworICAgIGZmX2FkZF9jaGFubmVsX2xheW91dCgmY2hsYXlvdXRzLCBjaGxheW91dCk7CisgICAgZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBjaGxheW91dHMpOworICAgIGZmX2FkZF9mb3JtYXQoJnNhbXBsZV9mb3JtYXRzLCBBVl9TQU1QTEVfRk1UX1MxNik7CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgc2FtcGxlX2Zvcm1hdHMpOworICAgIGZmX2FkZF9mb3JtYXQoJnNhbXBsZV9yYXRlcywgZmxpdGUtPndhdmUtPnNhbXBsZV9yYXRlKTsKKyAgICBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzIChjdHgsIHNhbXBsZV9yYXRlcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEZsaXRlQ29udGV4dCAqZmxpdGUgPSBjdHgtPnByaXY7CisKKyAgICBvdXRsaW5rLT5zYW1wbGVfcmF0ZSA9IGZsaXRlLT53YXZlLT5zYW1wbGVfcmF0ZTsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSAoQVZSYXRpb25hbCl7MSwgZmxpdGUtPndhdmUtPnNhbXBsZV9yYXRlfTsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAidm9pY2U6JXMgZm10OiVzIHNhbXBsZV9yYXRlOiVkXG4iLAorICAgICAgICAgICBmbGl0ZS0+dm9pY2Vfc3RyLAorICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKG91dGxpbmstPmZvcm1hdCksIG91dGxpbmstPnNhbXBsZV9yYXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZyYW1lICpzYW1wbGVzcmVmOworICAgIEZsaXRlQ29udGV4dCAqZmxpdGUgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisgICAgaW50IG5iX3NhbXBsZXMgPSBGRk1JTihmbGl0ZS0+d2F2ZV9uYl9zYW1wbGVzLCBmbGl0ZS0+ZnJhbWVfbmJfc2FtcGxlcyk7CisKKyAgICBpZiAoIW5iX3NhbXBsZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHNhbXBsZXNyZWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5iX3NhbXBsZXMpOworICAgIGlmICghc2FtcGxlc3JlZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIG1lbWNweShzYW1wbGVzcmVmLT5kYXRhWzBdLCBmbGl0ZS0+d2F2ZV9zYW1wbGVzLAorICAgICAgICAgICBuYl9zYW1wbGVzICogZmxpdGUtPndhdmUtPm51bV9jaGFubmVscyAqIDIpOworICAgIHNhbXBsZXNyZWYtPnB0cyA9IGZsaXRlLT5wdHM7CisgICAgYXZfZnJhbWVfc2V0X3BrdF9wb3Moc2FtcGxlc3JlZiwgLTEpOworICAgIGF2X2ZyYW1lX3NldF9zYW1wbGVfcmF0ZShzYW1wbGVzcmVmLCBmbGl0ZS0+d2F2ZS0+c2FtcGxlX3JhdGUpOworICAgIGZsaXRlLT5wdHMgKz0gbmJfc2FtcGxlczsKKyAgICBmbGl0ZS0+d2F2ZV9zYW1wbGVzICs9IG5iX3NhbXBsZXMgKiBmbGl0ZS0+d2F2ZS0+bnVtX2NoYW5uZWxzOworICAgIGZsaXRlLT53YXZlX25iX3NhbXBsZXMgLT0gbmJfc2FtcGxlczsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgc2FtcGxlc3JlZik7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBmbGl0ZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX3Byb3BzLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYXNyY19mbGl0ZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJmbGl0ZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3ludGhlc2l6ZSB2b2ljZSBmcm9tIHRleHQgdXNpbmcgbGliZmxpdGUuIiksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihGbGl0ZUNvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICAgID0gTlVMTCwKKyAgICAub3V0cHV0cyAgICAgICA9IGZsaXRlX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmZmxpdGVfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2FzcmNfc2luZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2FzcmNfc2luZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTEzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXNyY19zaW5lLmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBkb3VibGUgZnJlcXVlbmN5OworICAgIGRvdWJsZSBiZWVwX2ZhY3RvcjsKKyAgICBpbnQgc2FtcGxlc19wZXJfZnJhbWU7CisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgaW50MTZfdCAqc2luOworICAgIGludDY0X3QgcHRzOworICAgIHVpbnQzMl90IHBoaTsgIC8vLzwgY3VycmVudCBwaGFzZSBvZiB0aGUgc2luZSAoMnBpID0gMTw8MzIpCisgICAgdWludDMyX3QgZHBoaTsgLy8vPCBwaGFzZSBpbmNyZW1lbnQgYmV0d2VlbiB0d28gc2FtcGxlcworICAgIHVuc2lnbmVkIGJlZXBfcGVyaW9kOworICAgIHVuc2lnbmVkIGJlZXBfaW5kZXg7CisgICAgdW5zaWduZWQgYmVlcF9sZW5ndGg7CisgICAgdWludDMyX3QgcGhpX2JlZXA7ICAvLy88IGN1cnJlbnQgcGhhc2Ugb2YgdGhlIGJlZXAKKyAgICB1aW50MzJfdCBkcGhpX2JlZXA7IC8vLzwgcGhhc2UgaW5jcmVtZW50IG9mIHRoZSBiZWVwCit9IFNpbmVDb250ZXh0OworCisjZGVmaW5lIENPTlRFWFQgU2luZUNvbnRleHQKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKKyNkZWZpbmUgT1BUX0dFTkVSSUMobmFtZSwgZmllbGQsIGRlZiwgbWluLCBtYXgsIGRlc2NyLCB0eXBlLCBkZWZmaWVsZCwgLi4uKSBcCisgICAgeyBuYW1lLCBkZXNjciwgb2Zmc2V0b2YoQ09OVEVYVCwgZmllbGQpLCBBVl9PUFRfVFlQRV8gIyMgdHlwZSwgICAgICAgICAgXAorICAgICAgeyAuZGVmZmllbGQgPSBkZWYgfSwgbWluLCBtYXgsIEZMQUdTLCBfX1ZBX0FSR1NfXyB9CisKKyNkZWZpbmUgT1BUX0lOVChuYW1lLCBmaWVsZCwgZGVmLCBtaW4sIG1heCwgZGVzY3IsIC4uLikgXAorICAgIE9QVF9HRU5FUklDKG5hbWUsIGZpZWxkLCBkZWYsIG1pbiwgbWF4LCBkZXNjciwgSU5ULCBpNjQsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIE9QVF9EQkwobmFtZSwgZmllbGQsIGRlZiwgbWluLCBtYXgsIGRlc2NyLCAuLi4pIFwKKyAgICBPUFRfR0VORVJJQyhuYW1lLCBmaWVsZCwgZGVmLCBtaW4sIG1heCwgZGVzY3IsIERPVUJMRSwgZGJsLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBPUFRfRFVSKG5hbWUsIGZpZWxkLCBkZWYsIG1pbiwgbWF4LCBkZXNjciwgLi4uKSBcCisgICAgT1BUX0dFTkVSSUMobmFtZSwgZmllbGQsIGRlZiwgbWluLCBtYXgsIGRlc2NyLCBEVVJBVElPTiwgc3RyLCBfX1ZBX0FSR1NfXykKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHNpbmVfb3B0aW9uc1tdID0geworICAgIE9QVF9EQkwoImZyZXF1ZW5jeSIsICAgICAgICAgZnJlcXVlbmN5LCAgICAgICAgICAgIDQ0MCwgMCwgREJMX01BWCwgICAic2V0IHRoZSBzaW5lIGZyZXF1ZW5jeSIpLAorICAgIE9QVF9EQkwoImYiLCAgICAgICAgICAgICAgICAgZnJlcXVlbmN5LCAgICAgICAgICAgIDQ0MCwgMCwgREJMX01BWCwgICAic2V0IHRoZSBzaW5lIGZyZXF1ZW5jeSIpLAorICAgIE9QVF9EQkwoImJlZXBfZmFjdG9yIiwgICAgICAgYmVlcF9mYWN0b3IsICAgICAgICAgICAgMCwgMCwgREJMX01BWCwgICAic2V0IHRoZSBiZWVwIGZlcXVlbmN5IGZhY3RvciIpLAorICAgIE9QVF9EQkwoImIiLCAgICAgICAgICAgICAgICAgYmVlcF9mYWN0b3IsICAgICAgICAgICAgMCwgMCwgREJMX01BWCwgICAic2V0IHRoZSBiZWVwIGZlcXVlbmN5IGZhY3RvciIpLAorICAgIE9QVF9JTlQoInNhbXBsZV9yYXRlIiwgICAgICAgc2FtcGxlX3JhdGUsICAgICAgICA0NDEwMCwgMSwgSU5UX01BWCwgICAic2V0IHRoZSBzYW1wbGUgcmF0ZSIpLAorICAgIE9QVF9JTlQoInIiLCAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGUsICAgICAgICA0NDEwMCwgMSwgSU5UX01BWCwgICAic2V0IHRoZSBzYW1wbGUgcmF0ZSIpLAorICAgIE9QVF9EVVIoImR1cmF0aW9uIiwgICAgICAgICAgZHVyYXRpb24sICAgICAgICAgICAgICAgMCwgMCwgSU5UNjRfTUFYLCAic2V0IHRoZSBhdWRpbyBkdXJhdGlvbiIpLAorICAgIE9QVF9EVVIoImQiLCAgICAgICAgICAgICAgICAgZHVyYXRpb24sICAgICAgICAgICAgICAgMCwgMCwgSU5UNjRfTUFYLCAic2V0IHRoZSBhdWRpbyBkdXJhdGlvbiIpLAorICAgIE9QVF9JTlQoInNhbXBsZXNfcGVyX2ZyYW1lIiwgc2FtcGxlc19wZXJfZnJhbWUsICAgMTAyNCwgMCwgSU5UX01BWCwgICAic2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUiKSwKKyAgICB7TlVMTH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzaW5lKTsKKworI2RlZmluZSBMT0dfUEVSSU9EIDE1CisjZGVmaW5lIEFNUExJVFVERSA0MDk1CisjZGVmaW5lIEFNUExJVFVERV9TSElGVCAzCisKK3N0YXRpYyB2b2lkIG1ha2Vfc2luX3RhYmxlKGludDE2X3QgKnNpbikKK3sKKyAgICB1bnNpZ25lZCBoYWxmX3BpID0gMSA8PCAoTE9HX1BFUklPRCAtIDIpOworICAgIHVuc2lnbmVkIGFtcGxzID0gQU1QTElUVURFIDw8IEFNUExJVFVERV9TSElGVDsKKyAgICB1aW50NjRfdCB1bml0MiA9ICh1aW50NjRfdCkoYW1wbHMgKiBhbXBscykgPDwgMzI7CisgICAgdW5zaWduZWQgc3RlcCwgaSwgYywgcywgaywgbmV3X2ssIG4yOworCisgICAgLyogUHJpbmNpcGxlOiBpZiB1ID0gZXhwKGkqYTEpIGFuZCB2ID0gZXhwKGkqYTIpLCB0aGVuCisgICAgICAgZXhwKGkqKGExK2EyKS8yKSA9ICh1K3YpIC8gbGVuZ3RoKHUrdikgKi8KKyAgICBzaW5bMF0gPSAwOworICAgIHNpbltoYWxmX3BpXSA9IGFtcGxzOworICAgIGZvciAoc3RlcCA9IGhhbGZfcGk7IHN0ZXAgPiAxOyBzdGVwIC89IDIpIHsKKyAgICAgICAgLyogayA9ICgxIDw8IDE2KSAqIGFtcGxpdHVkZSAvIGxlbmd0aCh1K3YpCisgICAgICAgICAgIEluIGV4YWN0IHZhbHVlcywgayBpcyBjb25zdGFudCBhdCBhIGdpdmVuIHN0ZXAgKi8KKyAgICAgICAgayA9IDB4MTAwMDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoYWxmX3BpIC8gMjsgaSArPSBzdGVwKSB7CisgICAgICAgICAgICBzID0gc2luW2ldICsgc2luW2kgKyBzdGVwXTsKKyAgICAgICAgICAgIGMgPSBzaW5baGFsZl9waSAtIGldICsgc2luW2hhbGZfcGkgLSBpIC0gc3RlcF07CisgICAgICAgICAgICBuMiA9IHMgKiBzICsgYyAqIGM7CisgICAgICAgICAgICAvKiBOZXd0b24ncyBtZXRob2QgdG8gc29sdmUgbsKyICoga8KyID0gdW5pdMKyICovCisgICAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgIG5ld19rID0gKGsgKyB1bml0MiAvICgodWludDY0X3QpayAqIG4yKSArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgaWYgKGsgPT0gbmV3X2spCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGsgPSBuZXdfazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpbltpICsgc3RlcCAvIDJdID0gKGsgKiBzICsgMHg3RkZGKSA+PiAxNjsKKyAgICAgICAgICAgIHNpbltoYWxmX3BpIC0gaSAtIHN0ZXAgLyAyXSA9IChrICogYyArIDB4ODAwMCkgPj4gMTY7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogVW5zaGlmdCBhbXBsaXR1ZGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IGhhbGZfcGk7IGkrKykKKyAgICAgICAgc2luW2ldID0gKHNpbltpXSArICgxIDw8IChBTVBMSVRVREVfU0hJRlQgLSAxKSkpID4+IEFNUExJVFVERV9TSElGVDsKKyAgICAvKiBVc2Ugc3ltbWV0cmllcyB0byBmaWxsIHRoZSBvdGhlciB0aHJlZSBxdWFydGVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBoYWxmX3BpOyBpKyspCisgICAgICAgIHNpbltoYWxmX3BpICogMiAtIGldID0gc2luW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCAyICogaGFsZl9waTsgaSsrKQorICAgICAgICBzaW5baSArIDIgKiBoYWxmX3BpXSA9IC1zaW5baV07Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFNpbmVDb250ZXh0ICpzaW5lID0gY3R4LT5wcml2OworCisgICAgaWYgKCEoc2luZS0+c2luID0gYXZfbWFsbG9jKHNpemVvZigqc2luZS0+c2luKSA8PCBMT0dfUEVSSU9EKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc2luZS0+ZHBoaSA9IGxkZXhwKHNpbmUtPmZyZXF1ZW5jeSwgMzIpIC8gc2luZS0+c2FtcGxlX3JhdGUgKyAwLjU7CisgICAgbWFrZV9zaW5fdGFibGUoc2luZS0+c2luKTsKKworICAgIGlmIChzaW5lLT5iZWVwX2ZhY3RvcikgeworICAgICAgICBzaW5lLT5iZWVwX3BlcmlvZCA9IHNpbmUtPnNhbXBsZV9yYXRlOworICAgICAgICBzaW5lLT5iZWVwX2xlbmd0aCA9IHNpbmUtPmJlZXBfcGVyaW9kIC8gMjU7CisgICAgICAgIHNpbmUtPmRwaGlfYmVlcCA9IGxkZXhwKHNpbmUtPmJlZXBfZmFjdG9yICogc2luZS0+ZnJlcXVlbmN5LCAzMikgLworICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5lLT5zYW1wbGVfcmF0ZSArIDAuNTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU2luZUNvbnRleHQgKnNpbmUgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmVlcCgmc2luZS0+c2luKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU2luZUNvbnRleHQgKnNpbmUgPSBjdHgtPnByaXY7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgY2hsYXlvdXRzW10gPSB7IEFWX0NIX0xBWU9VVF9NT05PLCAtMSB9OworICAgIGludCBzYW1wbGVfcmF0ZXNbXSA9IHsgc2luZS0+c2FtcGxlX3JhdGUsIC0xIH07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMgKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10cykpOworICAgIGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgYXZmaWx0ZXJfbWFrZV9mb3JtYXQ2NF9saXN0KGNobGF5b3V0cykpOworICAgIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9yYXRlcykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBTaW5lQ29udGV4dCAqc2luZSA9IG91dGxpbmstPnNyYy0+cHJpdjsKKyAgICBzaW5lLT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGUoc2luZS0+ZHVyYXRpb24sIHNpbmUtPnNhbXBsZV9yYXRlLCBBVl9USU1FX0JBU0UpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIFNpbmVDb250ZXh0ICpzaW5lID0gb3V0bGluay0+c3JjLT5wcml2OworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIGludCBpLCBuYl9zYW1wbGVzID0gc2luZS0+c2FtcGxlc19wZXJfZnJhbWU7CisgICAgaW50MTZfdCAqc2FtcGxlczsKKworICAgIGlmIChzaW5lLT5kdXJhdGlvbikgeworICAgICAgICBuYl9zYW1wbGVzID0gRkZNSU4obmJfc2FtcGxlcywgc2luZS0+ZHVyYXRpb24gLSBzaW5lLT5wdHMpOworICAgICAgICBhdl9hc3NlcnQxKG5iX3NhbXBsZXMgPj0gMCk7CisgICAgICAgIGlmICghbmJfc2FtcGxlcykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisgICAgaWYgKCEoZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5iX3NhbXBsZXMpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzYW1wbGVzID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgc2FtcGxlc1tpXSA9IHNpbmUtPnNpbltzaW5lLT5waGkgPj4gKDMyIC0gTE9HX1BFUklPRCldOworICAgICAgICBzaW5lLT5waGkgKz0gc2luZS0+ZHBoaTsKKyAgICAgICAgaWYgKHNpbmUtPmJlZXBfaW5kZXggPCBzaW5lLT5iZWVwX2xlbmd0aCkgeworICAgICAgICAgICAgc2FtcGxlc1tpXSArPSBzaW5lLT5zaW5bc2luZS0+cGhpX2JlZXAgPj4gKDMyIC0gTE9HX1BFUklPRCldIDw8IDE7CisgICAgICAgICAgICBzaW5lLT5waGlfYmVlcCArPSBzaW5lLT5kcGhpX2JlZXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCsrc2luZS0+YmVlcF9pbmRleCA9PSBzaW5lLT5iZWVwX3BlcmlvZCkKKyAgICAgICAgICAgIHNpbmUtPmJlZXBfaW5kZXggPSAwOworICAgIH0KKworICAgIGZyYW1lLT5wdHMgPSBzaW5lLT5wdHM7CisgICAgc2luZS0+cHRzICs9IG5iX3NhbXBsZXM7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzaW5lX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hc3JjX3NpbmUgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAic2luZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR2VuZXJhdGUgc2luZSB3YXZlIGF1ZGlvIHNpZ25hbC4iKSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFNpbmVDb250ZXh0KSwKKyAgICAuaW5wdXRzICAgICAgICA9IE5VTEwsCisgICAgLm91dHB1dHMgICAgICAgPSBzaW5lX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmc2luZV9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYXVkaW8uYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMWQ4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXVkaW8uYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgU3RlZmFubyBTYWJhdGluaSB8IHN0ZWZhc2FiIGF0IGdtYWlsLmNvbQorICogQ29weXJpZ2h0IChjKSBTLk4uIEhlbWFudGggTWVlbmFrc2hpc3VuZGFyYW0gfCBzbWVlbmFrcyBhdCB1Y3NkLmVkdQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2ludCBhdmZpbHRlcl9yZWZfZ2V0X2NoYW5uZWxzKEFWRmlsdGVyQnVmZmVyUmVmICpyZWYpCit7CisgICAgcmV0dXJuIHJlZi0+YXVkaW8gPyByZWYtPmF1ZGlvLT5jaGFubmVscyA6IDA7Cit9CisKK0FWRnJhbWUgKmZmX251bGxfZ2V0X2F1ZGlvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmxpbmssIGludCBuYl9zYW1wbGVzKQoreworICAgIHJldHVybiBmZl9nZXRfYXVkaW9fYnVmZmVyKGxpbmstPmRzdC0+b3V0cHV0c1swXSwgbmJfc2FtcGxlcyk7Cit9CisKK0FWRnJhbWUgKmZmX2RlZmF1bHRfZ2V0X2F1ZGlvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmxpbmssIGludCBuYl9zYW1wbGVzKQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpbnQgY2hhbm5lbHMgPSBsaW5rLT5jaGFubmVsczsKKyAgICBpbnQgcmV0OworCisgICAgYXZfYXNzZXJ0MChjaGFubmVscyA9PSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMobGluay0+Y2hhbm5lbF9sYXlvdXQpIHx8ICFhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMobGluay0+Y2hhbm5lbF9sYXlvdXQpKTsKKworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgICAgID0gbmJfc2FtcGxlczsKKyAgICBmcmFtZS0+Zm9ybWF0ICAgICAgICAgPSBsaW5rLT5mb3JtYXQ7CisgICAgYXZfZnJhbWVfc2V0X2NoYW5uZWxzKGZyYW1lLCBsaW5rLT5jaGFubmVscyk7CisgICAgZnJhbWUtPmNoYW5uZWxfbGF5b3V0ID0gbGluay0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgZnJhbWUtPnNhbXBsZV9yYXRlICAgID0gbGluay0+c2FtcGxlX3JhdGU7CisgICAgcmV0ID0gYXZfZnJhbWVfZ2V0X2J1ZmZlcihmcmFtZSwgMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKGZyYW1lLT5leHRlbmRlZF9kYXRhLCAwLCBuYl9zYW1wbGVzLCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPmZvcm1hdCk7CisKKworICAgIHJldHVybiBmcmFtZTsKK30KKworQVZGcmFtZSAqZmZfZ2V0X2F1ZGlvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmxpbmssIGludCBuYl9zYW1wbGVzKQoreworICAgIEFWRnJhbWUgKnJldCA9IE5VTEw7CisKKyAgICBpZiAobGluay0+ZHN0cGFkLT5nZXRfYXVkaW9fYnVmZmVyKQorICAgICAgICByZXQgPSBsaW5rLT5kc3RwYWQtPmdldF9hdWRpb19idWZmZXIobGluaywgbmJfc2FtcGxlcyk7CisKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0ID0gZmZfZGVmYXVsdF9nZXRfYXVkaW9fYnVmZmVyKGxpbmssIG5iX3NhbXBsZXMpOworCisgICAgcmV0dXJuIHJldDsKK30KKworI2lmIEZGX0FQSV9BVkZJTFRFUkJVRkZFUgorQVZGaWx0ZXJCdWZmZXJSZWYqIGF2ZmlsdGVyX2dldF9hdWRpb19idWZmZXJfcmVmX2Zyb21fYXJyYXlzX2NoYW5uZWxzKHVpbnQ4X3QgKipkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSxpbnQgcGVybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dCkKK3sKKyAgICBpbnQgcGxhbmVzOworICAgIEFWRmlsdGVyQnVmZmVyICAgICpzYW1wbGVzICAgID0gYXZfbWFsbG9jeihzaXplb2YoKnNhbXBsZXMpKTsKKyAgICBBVkZpbHRlckJ1ZmZlclJlZiAqc2FtcGxlc3JlZiA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzYW1wbGVzcmVmKSk7CisKKyAgICBpZiAoIXNhbXBsZXMgfHwgIXNhbXBsZXNyZWYpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGF2X2Fzc2VydDAoY2hhbm5lbHMpOworICAgIGF2X2Fzc2VydDAoY2hhbm5lbF9sYXlvdXQgPT0gMCB8fAorICAgICAgICAgICAgICAgY2hhbm5lbHMgPT0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGNoYW5uZWxfbGF5b3V0KSk7CisKKyAgICBzYW1wbGVzcmVmLT5idWYgICAgICAgICA9IHNhbXBsZXM7CisgICAgc2FtcGxlc3JlZi0+YnVmLT5mcmVlICAgPSBmZl9hdmZpbHRlcl9kZWZhdWx0X2ZyZWVfYnVmZmVyOworICAgIGlmICghKHNhbXBsZXNyZWYtPmF1ZGlvID0gYXZfbWFsbG9jeihzaXplb2YoKnNhbXBsZXNyZWYtPmF1ZGlvKSkpKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzYW1wbGVzcmVmLT5hdWRpby0+bmJfc2FtcGxlcyAgICAgPSBuYl9zYW1wbGVzOworICAgIHNhbXBsZXNyZWYtPmF1ZGlvLT5jaGFubmVsX2xheW91dCA9IGNoYW5uZWxfbGF5b3V0OworICAgIHNhbXBsZXNyZWYtPmF1ZGlvLT5jaGFubmVscyAgICAgICA9IGNoYW5uZWxzOworCisgICAgcGxhbmVzID0gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoc2FtcGxlX2ZtdCkgPyBjaGFubmVscyA6IDE7CisKKyAgICAvKiBtYWtlIHN1cmUgdGhlIGJ1ZmZlciBnZXRzIHJlYWQgcGVybWlzc2lvbiBvciBpdCdzIHVzZWxlc3MgZm9yIG91dHB1dCAqLworICAgIHNhbXBsZXNyZWYtPnBlcm1zID0gcGVybXMgfCBBVl9QRVJNX1JFQUQ7CisKKyAgICBzYW1wbGVzLT5yZWZjb3VudCAgPSAxOworICAgIHNhbXBsZXNyZWYtPnR5cGUgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzYW1wbGVzcmVmLT5mb3JtYXQgPSBzYW1wbGVfZm10OworCisgICAgbWVtY3B5KHNhbXBsZXMtPmRhdGEsIGRhdGEsCisgICAgICAgICAgIEZGTUlOKEZGX0FSUkFZX0VMRU1TKHNhbXBsZXMtPmRhdGEpLCBwbGFuZXMpKnNpemVvZihzYW1wbGVzLT5kYXRhWzBdKSk7CisgICAgbWVtY3B5KHNhbXBsZXNyZWYtPmRhdGEsIHNhbXBsZXMtPmRhdGEsIHNpemVvZihzYW1wbGVzLT5kYXRhKSk7CisKKyAgICBzYW1wbGVzLT5saW5lc2l6ZVswXSA9IHNhbXBsZXNyZWYtPmxpbmVzaXplWzBdID0gbGluZXNpemU7CisKKyAgICBpZiAocGxhbmVzID4gRkZfQVJSQVlfRUxFTVMoc2FtcGxlcy0+ZGF0YSkpIHsKKyAgICAgICAgc2FtcGxlcy0+ICAgZXh0ZW5kZWRfZGF0YSA9IGF2X21hbGxvY3pfYXJyYXkoc2l6ZW9mKCpzYW1wbGVzLT5leHRlbmRlZF9kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVzKTsKKyAgICAgICAgc2FtcGxlc3JlZi0+ZXh0ZW5kZWRfZGF0YSA9IGF2X21hbGxvY3pfYXJyYXkoc2l6ZW9mKCpzYW1wbGVzcmVmLT5leHRlbmRlZF9kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVzKTsKKworICAgICAgICBpZiAoIXNhbXBsZXMtPmV4dGVuZGVkX2RhdGEgfHwgIXNhbXBsZXNyZWYtPmV4dGVuZGVkX2RhdGEpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgbWVtY3B5KHNhbXBsZXMtPiAgIGV4dGVuZGVkX2RhdGEsIGRhdGEsIHNpemVvZigqZGF0YSkqcGxhbmVzKTsKKyAgICAgICAgbWVtY3B5KHNhbXBsZXNyZWYtPmV4dGVuZGVkX2RhdGEsIGRhdGEsIHNpemVvZigqZGF0YSkqcGxhbmVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzYW1wbGVzLT5leHRlbmRlZF9kYXRhICAgID0gc2FtcGxlcy0+ZGF0YTsKKyAgICAgICAgc2FtcGxlc3JlZi0+ZXh0ZW5kZWRfZGF0YSA9IHNhbXBsZXNyZWYtPmRhdGE7CisgICAgfQorCisgICAgc2FtcGxlc3JlZi0+cHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICByZXR1cm4gc2FtcGxlc3JlZjsKKworZmFpbDoKKyAgICBpZiAoc2FtcGxlcyAmJiBzYW1wbGVzLT5leHRlbmRlZF9kYXRhICE9IHNhbXBsZXMtPmRhdGEpCisgICAgICAgIGF2X2ZyZWVwKCZzYW1wbGVzLT5leHRlbmRlZF9kYXRhKTsKKyAgICBpZiAoc2FtcGxlc3JlZikgeworICAgICAgICBhdl9mcmVlcCgmc2FtcGxlc3JlZi0+YXVkaW8pOworICAgICAgICBpZiAoc2FtcGxlc3JlZi0+ZXh0ZW5kZWRfZGF0YSAhPSBzYW1wbGVzcmVmLT5kYXRhKQorICAgICAgICAgICAgYXZfZnJlZXAoJnNhbXBsZXNyZWYtPmV4dGVuZGVkX2RhdGEpOworICAgIH0KKyAgICBhdl9mcmVlcCgmc2FtcGxlc3JlZik7CisgICAgYXZfZnJlZXAoJnNhbXBsZXMpOworICAgIHJldHVybiBOVUxMOworfQorCitBVkZpbHRlckJ1ZmZlclJlZiogYXZmaWx0ZXJfZ2V0X2F1ZGlvX2J1ZmZlcl9yZWZfZnJvbV9hcnJheXModWludDhfdCAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLGludCBwZXJtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY2hhbm5lbF9sYXlvdXQpCit7CisgICAgaW50IGNoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGNoYW5uZWxfbGF5b3V0KTsKKyAgICByZXR1cm4gYXZmaWx0ZXJfZ2V0X2F1ZGlvX2J1ZmZlcl9yZWZfZnJvbV9hcnJheXNfY2hhbm5lbHMoZGF0YSwgbGluZXNpemUsIHBlcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzLCBzYW1wbGVfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscywgY2hhbm5lbF9sYXlvdXQpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYXVkaW8uaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzVjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXVkaW8uaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSBTdGVmYW5vIFNhYmF0aW5pIHwgc3RlZmFzYWIgYXQgZ21haWwuY29tCisgKiBDb3B5cmlnaHQgKGMpIFMuTi4gSGVtYW50aCBNZWVuYWtzaGlzdW5kYXJhbSB8IHNtZWVuYWtzIGF0IHVjc2QuZWR1CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfQVVESU9fSAorI2RlZmluZSBBVkZJTFRFUl9BVURJT19ICisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IGZmX3BhY2tlZF9zYW1wbGVfZm10c19hcnJheVtdID0geworICAgIEFWX1NBTVBMRV9GTVRfVTgsCisgICAgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgQVZfU0FNUExFX0ZNVF9TMzIsCisgICAgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgQVZfU0FNUExFX0ZNVF9EQkwsCisgICAgQVZfU0FNUExFX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBmZl9wbGFuYXJfc2FtcGxlX2ZtdHNfYXJyYXlbXSA9IHsKKyAgICBBVl9TQU1QTEVfRk1UX1U4UCwKKyAgICBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgQVZfU0FNUExFX0ZNVF9TMzJQLAorICAgIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICBBVl9TQU1QTEVfRk1UX0RCTFAsCisgICAgQVZfU0FNUExFX0ZNVF9OT05FCit9OworCisvKiogZGVmYXVsdCBoYW5kbGVyIGZvciBnZXRfYXVkaW9fYnVmZmVyKCkgZm9yIGF1ZGlvIGlucHV0cyAqLworQVZGcmFtZSAqZmZfZGVmYXVsdF9nZXRfYXVkaW9fYnVmZmVyKEFWRmlsdGVyTGluayAqbGluaywgaW50IG5iX3NhbXBsZXMpOworCisvKiogZ2V0X2F1ZGlvX2J1ZmZlcigpIGhhbmRsZXIgZm9yIGZpbHRlcnMgd2hpY2ggc2ltcGx5IHBhc3MgYXVkaW8gYWxvbmcgKi8KK0FWRnJhbWUgKmZmX251bGxfZ2V0X2F1ZGlvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmxpbmssIGludCBuYl9zYW1wbGVzKTsKKworLyoqCisgKiBSZXF1ZXN0IGFuIGF1ZGlvIHNhbXBsZXMgYnVmZmVyIHdpdGggYSBzcGVjaWZpYyBzZXQgb2YgcGVybWlzc2lvbnMuCisgKgorICogQHBhcmFtIGxpbmsgICAgICAgICAgIHRoZSBvdXRwdXQgbGluayB0byB0aGUgZmlsdGVyIGZyb20gd2hpY2ggdGhlIGJ1ZmZlciB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVxdWVzdGVkCisgKiBAcGFyYW0gbmJfc2FtcGxlcyAgICAgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHNhbXBsZXMuIFRoaXMgbXVzdCBiZSB1bnJlZmVyZW5jZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX3VucmVmX2J1ZmZlciB3aGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCBpdC4KKyAqLworQVZGcmFtZSAqZmZfZ2V0X2F1ZGlvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmxpbmssIGludCBuYl9zYW1wbGVzKTsKKworLyoqCisgKiBTZW5kIGEgYnVmZmVyIG9mIGF1ZGlvIHNhbXBsZXMgdG8gdGhlIG5leHQgZmlsdGVyLgorICoKKyAqIEBwYXJhbSBsaW5rICAgICAgIHRoZSBvdXRwdXQgbGluayBvdmVyIHdoaWNoIHRoZSBhdWRpbyBzYW1wbGVzIGFyZSBiZWluZyBzZW50CisgKiBAcGFyYW0gc2FtcGxlc3JlZiBhIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIG9mIGF1ZGlvIHNhbXBsZXMgYmVpbmcgc2VudC4gVGhlCisgKiAgICAgICAgICAgICAgICAgICByZWNlaXZpbmcgZmlsdGVyIHdpbGwgZnJlZSB0aGlzIHJlZmVyZW5jZSB3aGVuIGl0IG5vIGxvbmdlcgorICogICAgICAgICAgICAgICAgICAgbmVlZHMgaXQgb3IgcGFzcyBpdCBvbiB0byB0aGUgbmV4dCBmaWx0ZXIuCisgKgorICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBvbiBlcnJvci4gVGhlIHJlY2VpdmluZyBmaWx0ZXIKKyAqIGlzIHJlc3BvbnNpYmxlIGZvciB1bnJlZmVyZW5jaW5nIHNhbXBsZXNyZWYgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGZmX2ZpbHRlcl9zYW1wbGVzKEFWRmlsdGVyTGluayAqbGluaywgQVZGaWx0ZXJCdWZmZXJSZWYgKnNhbXBsZXNyZWYpOworCisvKioKKyAqIFNlbmQgYSBidWZmZXIgb2YgYXVkaW8gc2FtcGxlcyB0byB0aGUgbmV4dCBsaW5rLCB3aXRob3V0IGNoZWNraW5nCisgKiBtaW5fc2FtcGxlcy4KKyAqLworaW50IGZmX2ZpbHRlcl9zYW1wbGVzX2ZyYW1lZChBVkZpbHRlckxpbmsgKmxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQnVmZmVyUmVmICpzYW1wbGVzcmVmKTsKKworI2VuZGlmIC8qIEFWRklMVEVSX0FVRElPX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hdmNvZGVjLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZjb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZDkwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZjb2RlYy5jCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgU3RlZmFubyBTYWJhdGluaSB8IHN0ZWZhc2FiIGF0IGdtYWlsLmNvbQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBsaWJhdmNvZGVjL2xpYmF2ZmlsdGVyIGdsdWluZyB1dGlsaXRpZXMKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2lmIEZGX0FQSV9BVkZJTFRFUkJVRkZFUgorQVZGaWx0ZXJCdWZmZXJSZWYgKmF2ZmlsdGVyX2dldF92aWRlb19idWZmZXJfcmVmX2Zyb21fZnJhbWUoY29uc3QgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVybXMpCit7CisgICAgQVZGaWx0ZXJCdWZmZXJSZWYgKnBpY3JlZiA9CisgICAgICAgIGF2ZmlsdGVyX2dldF92aWRlb19idWZmZXJfcmVmX2Zyb21fYXJyYXlzKGZyYW1lLT5kYXRhLCBmcmFtZS0+bGluZXNpemUsIHBlcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5mb3JtYXQpOworICAgIGlmICghcGljcmVmKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYXZmaWx0ZXJfY29weV9mcmFtZV9wcm9wcyhwaWNyZWYsIGZyYW1lKSA8IDApIHsKKyAgICAgICAgcGljcmVmLT5idWYtPmRhdGFbMF0gPSBOVUxMOworICAgICAgICBhdmZpbHRlcl91bnJlZl9idWZmZXJwKCZwaWNyZWYpOworICAgIH0KKyAgICByZXR1cm4gcGljcmVmOworfQorCitBVkZpbHRlckJ1ZmZlclJlZiAqYXZmaWx0ZXJfZ2V0X2F1ZGlvX2J1ZmZlcl9yZWZfZnJvbV9mcmFtZShjb25zdCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZXJtcykKK3sKKyAgICBBVkZpbHRlckJ1ZmZlclJlZiAqc2FtcGxlc3JlZjsKKyAgICBpbnQgY2hhbm5lbHMgPSBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoZnJhbWUpOworICAgIGludDY0X3QgbGF5b3V0ID0gYXZfZnJhbWVfZ2V0X2NoYW5uZWxfbGF5b3V0KGZyYW1lKTsKKworICAgIGlmIChsYXlvdXQgJiYgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGxheW91dCkgIT0gYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGZyYW1lKSkgeworICAgICAgICBhdl9sb2coMCwgQVZfTE9HX0VSUk9SLCAiTGF5b3V0IGluZGljYXRlcyBhIGRpZmZlcmVudCBudW1iZXIgb2YgY2hhbm5lbHMgdGhhbiBhY3R1YWxseSBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc2FtcGxlc3JlZiA9IGF2ZmlsdGVyX2dldF9hdWRpb19idWZmZXJfcmVmX2Zyb21fYXJyYXlzX2NoYW5uZWxzKAorICAgICAgICAodWludDhfdCAqKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgZnJhbWUtPmxpbmVzaXplWzBdLCBwZXJtcywKKyAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMsIGZyYW1lLT5mb3JtYXQsIGNoYW5uZWxzLCBsYXlvdXQpOworICAgIGlmICghc2FtcGxlc3JlZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGF2ZmlsdGVyX2NvcHlfZnJhbWVfcHJvcHMoc2FtcGxlc3JlZiwgZnJhbWUpIDwgMCkgeworICAgICAgICBzYW1wbGVzcmVmLT5idWYtPmRhdGFbMF0gPSBOVUxMOworICAgICAgICBhdmZpbHRlcl91bnJlZl9idWZmZXJwKCZzYW1wbGVzcmVmKTsKKyAgICB9CisgICAgcmV0dXJuIHNhbXBsZXNyZWY7Cit9CisKK0FWRmlsdGVyQnVmZmVyUmVmICphdmZpbHRlcl9nZXRfYnVmZmVyX3JlZl9mcm9tX2ZyYW1lKGVudW0gQVZNZWRpYVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlcm1zKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICByZXR1cm4gYXZmaWx0ZXJfZ2V0X3ZpZGVvX2J1ZmZlcl9yZWZfZnJvbV9mcmFtZShmcmFtZSwgcGVybXMpOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICByZXR1cm4gYXZmaWx0ZXJfZ2V0X2F1ZGlvX2J1ZmZlcl9yZWZfZnJvbV9mcmFtZShmcmFtZSwgcGVybXMpOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworaW50IGF2ZmlsdGVyX2NvcHlfYnVmX3Byb3BzKEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGaWx0ZXJCdWZmZXJSZWYgKnNyYykKK3sKKyAgICBpbnQgcGxhbmVzLCBuYl9jaGFubmVsczsKKworICAgIGlmICghZHN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIC8qIGFib3J0IGluIGNhc2UgdGhlIHNyYyBpcyBOVUxMIGFuZCBkc3QgaXMgbm90LCBhdm9pZCBpbmNvbnNpc3RlbnQgc3RhdGUgaW4gZHN0ICovCisgICAgYXZfYXNzZXJ0MChzcmMpOworCisgICAgbWVtY3B5KGRzdC0+ZGF0YSwgc3JjLT5kYXRhLCBzaXplb2YoZHN0LT5kYXRhKSk7CisgICAgbWVtY3B5KGRzdC0+bGluZXNpemUsIHNyYy0+bGluZXNpemUsIHNpemVvZihkc3QtPmxpbmVzaXplKSk7CisKKyAgICBkc3QtPnB0cyAgICAgPSBzcmMtPnB0czsKKyAgICBkc3QtPmZvcm1hdCAgPSBzcmMtPmZvcm1hdDsKKyAgICBhdl9mcmFtZV9zZXRfcGt0X3Bvcyhkc3QsIHNyYy0+cG9zKTsKKworICAgIHN3aXRjaCAoc3JjLT50eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIGF2X2Fzc2VydDAoc3JjLT52aWRlbyk7CisgICAgICAgIGRzdC0+d2lkdGggICAgICAgICAgICAgICA9IHNyYy0+dmlkZW8tPnc7CisgICAgICAgIGRzdC0+aGVpZ2h0ICAgICAgICAgICAgICA9IHNyYy0+dmlkZW8tPmg7CisgICAgICAgIGRzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHNyYy0+dmlkZW8tPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgIGRzdC0+aW50ZXJsYWNlZF9mcmFtZSAgICA9IHNyYy0+dmlkZW8tPmludGVybGFjZWQ7CisgICAgICAgIGRzdC0+dG9wX2ZpZWxkX2ZpcnN0ICAgICA9IHNyYy0+dmlkZW8tPnRvcF9maWVsZF9maXJzdDsKKyAgICAgICAgZHN0LT5rZXlfZnJhbWUgICAgICAgICAgID0gc3JjLT52aWRlby0+a2V5X2ZyYW1lOworICAgICAgICBkc3QtPnBpY3RfdHlwZSAgICAgICAgICAgPSBzcmMtPnZpZGVvLT5waWN0X3R5cGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBhdl9hc3NlcnQwKHNyYy0+YXVkaW8pOworICAgICAgICBuYl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzcmMtPmF1ZGlvLT5jaGFubmVsX2xheW91dCk7CisgICAgICAgIHBsYW5lcyAgICAgID0gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoc3JjLT5mb3JtYXQpID8gbmJfY2hhbm5lbHMgOiAxOworCisgICAgICAgIGlmIChwbGFuZXMgPiBGRl9BUlJBWV9FTEVNUyhkc3QtPmRhdGEpKSB7CisgICAgICAgICAgICBkc3QtPmV4dGVuZGVkX2RhdGEgPSBhdl9tYWxsb2N6X2FycmF5KHBsYW5lcywgc2l6ZW9mKCpkc3QtPmV4dGVuZGVkX2RhdGEpKTsKKyAgICAgICAgICAgIGlmICghZHN0LT5leHRlbmRlZF9kYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBtZW1jcHkoZHN0LT5leHRlbmRlZF9kYXRhLCBzcmMtPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgcGxhbmVzICogc2l6ZW9mKCpkc3QtPmV4dGVuZGVkX2RhdGEpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBkc3QtPmV4dGVuZGVkX2RhdGEgPSBkc3QtPmRhdGE7CisgICAgICAgIGRzdC0+bmJfc2FtcGxlcyAgICAgICAgICA9IHNyYy0+YXVkaW8tPm5iX3NhbXBsZXM7CisgICAgICAgIGF2X2ZyYW1lX3NldF9zYW1wbGVfcmF0ZSAgIChkc3QsIHNyYy0+YXVkaW8tPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgYXZfZnJhbWVfc2V0X2NoYW5uZWxfbGF5b3V0KGRzdCwgc3JjLT5hdWRpby0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICBhdl9mcmFtZV9zZXRfY2hhbm5lbHMgICAgICAoZHN0LCBzcmMtPmF1ZGlvLT5jaGFubmVscyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hdmNvZGVjLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZjb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZDBlMjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZjb2RlYy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9BVkNPREVDX0gKKyNkZWZpbmUgQVZGSUxURVJfQVZDT0RFQ19ICisKKy8qKgorICogQGZpbGUKKyAqIGxpYmF2Y29kZWMvbGliYXZmaWx0ZXIgZ2x1aW5nIHV0aWxpdGllcworICoKKyAqIFRoaXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFuIGFwcGxpY2F0aW9uIE9OTFkgaWYgdGhlIGluc3RhbGxlZAorICogbGliYXZmaWx0ZXIgaGFzIGJlZW4gY29tcGlsZWQgd2l0aCBsaWJhdmNvZGVjIHN1cHBvcnQsIG90aGVyd2lzZQorICogc3ltYm9scyBkZWZpbmVkIGJlbG93IHdpbGwgbm90IGJlIGF2YWlsYWJsZS4KKyAqLworCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKworI2lmIEZGX0FQSV9BVkZJTFRFUkJVRkZFUgorLyoqCisgKiBDcmVhdGUgYW5kIHJldHVybiBhIHBpY3JlZiByZWZlcmVuY2UgZnJvbSB0aGUgZGF0YSBhbmQgcHJvcGVydGllcworICogY29udGFpbmVkIGluIGZyYW1lLgorICoKKyAqIEBwYXJhbSBwZXJtcyBwZXJtaXNzaW9ucyB0byBhc3NpZ24gdG8gdGhlIG5ldyBidWZmZXIgcmVmZXJlbmNlCisgKiBAZGVwcmVjYXRlZCBhdmZpbHRlciBBUElzIHdvcmsgbmF0aXZlbHkgd2l0aCBBVkZyYW1lIGluc3RlYWQuCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitBVkZpbHRlckJ1ZmZlclJlZiAqYXZmaWx0ZXJfZ2V0X3ZpZGVvX2J1ZmZlcl9yZWZfZnJvbV9mcmFtZShjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50IHBlcm1zKTsKKworCisvKioKKyAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgcGljcmVmIHJlZmVyZW5jZSBmcm9tIHRoZSBkYXRhIGFuZCBwcm9wZXJ0aWVzCisgKiBjb250YWluZWQgaW4gZnJhbWUuCisgKgorICogQHBhcmFtIHBlcm1zIHBlcm1pc3Npb25zIHRvIGFzc2lnbiB0byB0aGUgbmV3IGJ1ZmZlciByZWZlcmVuY2UKKyAqIEBkZXByZWNhdGVkIGF2ZmlsdGVyIEFQSXMgd29yayBuYXRpdmVseSB3aXRoIEFWRnJhbWUgaW5zdGVhZC4KKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK0FWRmlsdGVyQnVmZmVyUmVmICphdmZpbHRlcl9nZXRfYXVkaW9fYnVmZmVyX3JlZl9mcm9tX2ZyYW1lKGNvbnN0IEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlcm1zKTsKKworLyoqCisgKiBDcmVhdGUgYW5kIHJldHVybiBhIGJ1ZmZlciByZWZlcmVuY2UgZnJvbSB0aGUgZGF0YSBhbmQgcHJvcGVydGllcworICogY29udGFpbmVkIGluIGZyYW1lLgorICoKKyAqIEBwYXJhbSBwZXJtcyBwZXJtaXNzaW9ucyB0byBhc3NpZ24gdG8gdGhlIG5ldyBidWZmZXIgcmVmZXJlbmNlCisgKiBAZGVwcmVjYXRlZCBhdmZpbHRlciBBUElzIHdvcmsgbmF0aXZlbHkgd2l0aCBBVkZyYW1lIGluc3RlYWQuCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitBVkZpbHRlckJ1ZmZlclJlZiAqYXZmaWx0ZXJfZ2V0X2J1ZmZlcl9yZWZfZnJvbV9mcmFtZShlbnVtIEFWTWVkaWFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZXJtcyk7CisjZW5kaWYKKworI2VuZGlmIC8qIEFWRklMVEVSX0FWQ09ERUNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2F2Zl9hdmVjdG9yc2NvcGUuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hdmZfYXZlY3RvcnNjb3BlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllYmMwZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hdmZfYXZlY3RvcnNjb3BlLmMKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGF1ZGlvIHRvIHZpZGVvIG11bHRpbWVkaWEgdmVjdG9yc2NvcGUgZmlsdGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitlbnVtIFZlY3RvclNjb3BlTW9kZSB7CisgICAgTElTU0FKT1VTLAorICAgIExJU1NBSk9VU19YWSwKKyAgICBNT0RFX05CLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgQXVkaW9WZWN0b3JTY29wZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEFWRnJhbWUgKm91dHBpY3JlZjsKKyAgICBpbnQgdywgaDsKKyAgICBpbnQgaHcsIGhoOworICAgIGVudW0gVmVjdG9yU2NvcGVNb2RlIG1vZGU7CisgICAgaW50IGNvbnRyYXN0WzNdOworICAgIGludCBmYWRlWzNdOworICAgIGRvdWJsZSB6b29tOworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZTsKK30gQXVkaW9WZWN0b3JTY29wZUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEF1ZGlvVmVjdG9yU2NvcGVDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGF2ZWN0b3JzY29wZV9vcHRpb25zW10gPSB7CisgICAgeyAibW9kZSIsICJzZXQgbW9kZSIsIE9GRlNFVChtb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1MSVNTQUpPVVN9LCAwLCBNT0RFX05CLTEsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJtIiwgICAgInNldCBtb2RlIiwgT0ZGU0VUKG1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUxJU1NBSk9VU30sIDAsIE1PREVfTkItMSwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgImxpc3Nham91cyIsICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TElTU0FKT1VTfSwgICAgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgImxpc3Nham91c194eSIsICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TElTU0FKT1VTX1hZfSwgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgInJhdGUiLCAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInIiLCAgICAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInNpemUiLCAic2V0IHZpZGVvIHNpemUiLCBPRkZTRVQodyksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyPSI0MDB4NDAwIn0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAicyIsICAgICJzZXQgdmlkZW8gc2l6ZSIsIE9GRlNFVCh3KSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHI9IjQwMHg0MDAifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJyYyIsICJzZXQgcmVkIGNvbnRyYXN0IiwgICBPRkZTRVQoY29udHJhc3RbMF0pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTQwfSwgMCwgMjU1LCBGTEFHUyB9LAorICAgIHsgImdjIiwgInNldCBncmVlbiBjb250cmFzdCIsIE9GRlNFVChjb250cmFzdFsxXSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MTYwfSwgMCwgMjU1LCBGTEFHUyB9LAorICAgIHsgImJjIiwgInNldCBibHVlIGNvbnRyYXN0IiwgIE9GRlNFVChjb250cmFzdFsyXSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9ODB9LCAwLCAyNTUsIEZMQUdTIH0sCisgICAgeyAicmYiLCAic2V0IHJlZCBmYWRlIiwgICAgICAgT0ZGU0VUKGZhZGVbMF0pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTE1fSwgMCwgMjU1LCBGTEFHUyB9LAorICAgIHsgImdmIiwgInNldCBncmVlbiBmYWRlIiwgICAgIE9GRlNFVChmYWRlWzFdKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xMH0sIDAsIDI1NSwgRkxBR1MgfSwKKyAgICB7ICJiZiIsICJzZXQgYmx1ZSBmYWRlIiwgICAgICBPRkZTRVQoZmFkZVsyXSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9NX0sIDAsIDI1NSwgRkxBR1MgfSwKKyAgICB7ICJ6b29tIiwgInNldCB6b29tIGZhY3RvciIsICBPRkZTRVQoem9vbSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MX0sIDEsIDEwLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXZlY3RvcnNjb3BlKTsKKworc3RhdGljIHZvaWQgZHJhd19kb3QoQXVkaW9WZWN0b3JTY29wZUNvbnRleHQgKnAsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHkpCit7CisgICAgY29uc3QgaW50IGxpbmVzaXplID0gcC0+b3V0cGljcmVmLT5saW5lc2l6ZVswXTsKKyAgICB1aW50OF90ICpkc3Q7CisKKyAgICBpZiAocC0+em9vbSA+IDEpIHsKKyAgICAgICAgaWYgKHkgPj0gcC0+aCB8fCB4ID49IHAtPncpCisgICAgICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgeSA9IEZGTUlOKHksIHAtPmggLSAxKTsKKyAgICAgICAgeCA9IEZGTUlOKHgsIHAtPncgLSAxKTsKKyAgICB9CisKKyAgICBkc3QgPSAmcC0+b3V0cGljcmVmLT5kYXRhWzBdW3kgKiBsaW5lc2l6ZSArIHggKiA0XTsKKyAgICBkc3RbMF0gPSBGRk1JTihkc3RbMF0gKyBwLT5jb250cmFzdFswXSwgMjU1KTsKKyAgICBkc3RbMV0gPSBGRk1JTihkc3RbMV0gKyBwLT5jb250cmFzdFsxXSwgMjU1KTsKKyAgICBkc3RbMl0gPSBGRk1JTihkc3RbMl0gKyBwLT5jb250cmFzdFsyXSwgMjU1KTsKK30KKworc3RhdGljIHZvaWQgZmFkZShBdWRpb1ZlY3RvclNjb3BlQ29udGV4dCAqcCkKK3sKKyAgICBjb25zdCBpbnQgbGluZXNpemUgPSBwLT5vdXRwaWNyZWYtPmxpbmVzaXplWzBdOworICAgIGludCBpLCBqOworCisgICAgaWYgKHAtPmZhZGVbMF0gfHwgcC0+ZmFkZVsxXSB8fCBwLT5mYWRlWzJdKSB7CisgICAgICAgIHVpbnQ4X3QgKmQgPSBwLT5vdXRwaWNyZWYtPmRhdGFbMF07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwLT5oOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwLT53KjQ7IGorPTQpIHsKKyAgICAgICAgICAgICAgICBkW2orMF0gPSBGRk1BWChkW2orMF0gLSBwLT5mYWRlWzBdLCAwKTsKKyAgICAgICAgICAgICAgICBkW2orMV0gPSBGRk1BWChkW2orMV0gLSBwLT5mYWRlWzFdLCAwKTsKKyAgICAgICAgICAgICAgICBkW2orMl0gPSBGRk1BWChkW2orMl0gLSBwLT5mYWRlWzJdLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGQgKz0gbGluZXNpemU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dCA9IE5VTEw7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX05PTkUgfTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7IEFWX1BJWF9GTVRfUkdCQSwgQVZfUElYX0ZNVF9OT05FIH07CisKKyAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10cyk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZpbmxpbmstPm91dF9mb3JtYXRzKTsKKworICAgIGZmX2FkZF9jaGFubmVsX2xheW91dCgmbGF5b3V0LCBBVl9DSF9MQVlPVVRfU1RFUkVPKTsKKyAgICBmZl9jaGFubmVsX2xheW91dHNfcmVmKGxheW91dCwgJmlubGluay0+b3V0X2NoYW5uZWxfbGF5b3V0cyk7CisKKyAgICBmb3JtYXRzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZpbmxpbmstPm91dF9zYW1wbGVyYXRlcyk7CisKKyAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZvdXRsaW5rLT5pbl9mb3JtYXRzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEF1ZGlvVmVjdG9yU2NvcGVDb250ZXh0ICpwID0gY3R4LT5wcml2OworICAgIGludCBuYl9zYW1wbGVzOworCisgICAgbmJfc2FtcGxlcyA9IEZGTUFYKDEwMjQsICgoZG91YmxlKWlubGluay0+c2FtcGxlX3JhdGUgLyBhdl9xMmQocC0+ZnJhbWVfcmF0ZSkpICsgMC41KTsKKyAgICBpbmxpbmstPnBhcnRpYWxfYnVmX3NpemUgPQorICAgIGlubGluay0+bWluX3NhbXBsZXMgPQorICAgIGlubGluay0+bWF4X3NhbXBsZXMgPSBuYl9zYW1wbGVzOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQXVkaW9WZWN0b3JTY29wZUNvbnRleHQgKnAgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisKKyAgICBvdXRsaW5rLT53ID0gcC0+dzsKKyAgICBvdXRsaW5rLT5oID0gcC0+aDsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpezEsMX07CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IHAtPmZyYW1lX3JhdGU7CisKKyAgICBwLT5odyA9IHAtPncgLyAyOworICAgIHAtPmhoID0gcC0+aCAvIDI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluc2FtcGxlcykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBdWRpb1ZlY3RvclNjb3BlQ29udGV4dCAqcCA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBpbnQgaHcgPSBwLT5odzsKKyAgICBjb25zdCBpbnQgaGggPSBwLT5oaDsKKyAgICB1bnNpZ25lZCB4LCB5OworICAgIGNvbnN0IGRvdWJsZSB6b29tID0gcC0+em9vbTsKKyAgICBpbnQgaTsKKworICAgIGlmICghcC0+b3V0cGljcmVmIHx8IHAtPm91dHBpY3JlZi0+d2lkdGggICE9IG91dGxpbmstPncgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLT5vdXRwaWNyZWYtPmhlaWdodCAhPSBvdXRsaW5rLT5oKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnAtPm91dHBpY3JlZik7CisgICAgICAgIHAtPm91dHBpY3JlZiA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghcC0+b3V0cGljcmVmKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnNhbXBsZXMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRsaW5rLT5oOyBpKyspCisgICAgICAgICAgICBtZW1zZXQocC0+b3V0cGljcmVmLT5kYXRhWzBdICsgaSAqIHAtPm91dHBpY3JlZi0+bGluZXNpemVbMF0sIDAsIG91dGxpbmstPncgKiA0KTsKKyAgICB9CisgICAgcC0+b3V0cGljcmVmLT5wdHMgPSBpbnNhbXBsZXMtPnB0czsKKworICAgIGZhZGUocCk7CisKKyAgICBzd2l0Y2ggKGluc2FtcGxlcy0+Zm9ybWF0KSB7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNjoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluc2FtcGxlcy0+bmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQxNl90ICpzcmMgPSAoaW50MTZfdCAqKWluc2FtcGxlcy0+ZGF0YVswXSArIGkgKiAyOworCisgICAgICAgICAgICBpZiAocC0+bW9kZSA9PSBMSVNTQUpPVVMpIHsKKyAgICAgICAgICAgICAgICB4ID0gKChzcmNbMV0gLSBzcmNbMF0pICogem9vbSAvIChmbG9hdCkoVUlOVDE2X01BWCkgKyAxKSAqIGh3OworICAgICAgICAgICAgICAgIHkgPSAoMS4wIC0gKHNyY1swXSArIHNyY1sxXSkgKiB6b29tIC8gKGZsb2F0KVVJTlQxNl9NQVgpICogaGg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHggPSAoc3JjWzFdICogem9vbSAvIChmbG9hdClJTlQxNl9NQVggKyAxKSAqIGh3OworICAgICAgICAgICAgICAgIHkgPSAoc3JjWzBdICogem9vbSAvIChmbG9hdClJTlQxNl9NQVggKyAxKSAqIGhoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkcmF3X2RvdChwLCB4LCB5KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zYW1wbGVzLT5uYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0ICpzcmMgPSAoZmxvYXQgKilpbnNhbXBsZXMtPmRhdGFbMF0gKyBpICogMjsKKworICAgICAgICAgICAgaWYgKHAtPm1vZGUgPT0gTElTU0FKT1VTKSB7CisgICAgICAgICAgICAgICAgeCA9ICgoc3JjWzFdIC0gc3JjWzBdKSAqIHpvb20gLyAyICsgMSkgKiBodzsKKyAgICAgICAgICAgICAgICB5ID0gKDEuMCAtIChzcmNbMF0gKyBzcmNbMV0pICogem9vbSAvIDIpICogaGg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHggPSAoc3JjWzFdICogem9vbSArIDEpICogaHc7CisgICAgICAgICAgICAgICAgeSA9IChzcmNbMF0gKiB6b29tICsgMSkgKiBoaDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJhd19kb3QocCwgeCwgeSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmaW5zYW1wbGVzKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgYXZfZnJhbWVfY2xvbmUocC0+b3V0cGljcmVmKSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEF1ZGlvVmVjdG9yU2NvcGVDb250ZXh0ICpwID0gY3R4LT5wcml2OworCisgICAgYXZfZnJhbWVfZnJlZSgmcC0+b3V0cGljcmVmKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF1ZGlvdmVjdG9yc2NvcGVfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdWRpb3ZlY3RvcnNjb3BlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2F2Zl9hdmVjdG9yc2NvcGUgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYXZlY3RvcnNjb3BlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDb252ZXJ0IGlucHV0IGF1ZGlvIHRvIHZlY3RvcnNjb3BlIHZpZGVvIG91dHB1dC4iKSwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQXVkaW9WZWN0b3JTY29wZUNvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICAgID0gYXVkaW92ZWN0b3JzY29wZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhdWRpb3ZlY3RvcnNjb3BlX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmYXZlY3RvcnNjb3BlX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hdmZfY29uY2F0LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZmX2NvbmNhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OGQ3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZmX2NvbmNhdC5jCkBAIC0wLDAgKzEsNDI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogY29uY2F0IGF1ZGlvLXZpZGVvIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNkZWZpbmUgRkZfQlVGUVVFVUVfU0laRSAyNTYKKyNpbmNsdWRlICJidWZmZXJxdWV1ZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJhdWRpby5oIgorCisjZGVmaW5lIFRZUEVfQUxMIDIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIHVuc2lnbmVkIG5iX3N0cmVhbXNbVFlQRV9BTExdOyAvKio8IG51bWJlciBvZiBvdXQgc3RyZWFtcyBvZiBlYWNoIHR5cGUgKi8KKyAgICB1bnNpZ25lZCBuYl9zZWdtZW50czsKKyAgICB1bnNpZ25lZCBjdXJfaWR4OyAvKio8IGluZGV4IG9mIHRoZSBmaXJzdCBpbnB1dCBvZiBjdXJyZW50IHNlZ21lbnQgKi8KKyAgICBpbnQ2NF90IGRlbHRhX3RzOyAvKio8IHRpbWVzdGFtcCB0byBhZGQgdG8gcHJvZHVjZSBvdXRwdXQgdGltZXN0YW1wcyAqLworICAgIHVuc2lnbmVkIG5iX2luX2FjdGl2ZTsgLyoqPCBudW1iZXIgb2YgYWN0aXZlIGlucHV0cyBpbiBjdXJyZW50IHNlZ21lbnQgKi8KKyAgICB1bnNpZ25lZCB1bnNhZmU7CisgICAgc3RydWN0IGNvbmNhdF9pbiB7CisgICAgICAgIGludDY0X3QgcHRzOworICAgICAgICBpbnQ2NF90IG5iX2ZyYW1lczsKKyAgICAgICAgdW5zaWduZWQgZW9mOworICAgICAgICBzdHJ1Y3QgRkZCdWZRdWV1ZSBxdWV1ZTsKKyAgICB9ICppbjsKK30gQ29uY2F0Q29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ29uY2F0Q29udGV4dCwgeCkKKyNkZWZpbmUgQSBBVl9PUFRfRkxBR19BVURJT19QQVJBTQorI2RlZmluZSBGIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorI2RlZmluZSBWIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjb25jYXRfb3B0aW9uc1tdID0geworICAgIHsgIm4iLCAic3BlY2lmeSB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIiwgT0ZGU0VUKG5iX3NlZ21lbnRzKSwKKyAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMiB9LCAxLCBJTlRfTUFYLCBWfEF8Rn0sCisgICAgeyAidiIsICJzcGVjaWZ5IHRoZSBudW1iZXIgb2YgdmlkZW8gc3RyZWFtcyIsCisgICAgICBPRkZTRVQobmJfc3RyZWFtc1tBVk1FRElBX1RZUEVfVklERU9dKSwKKyAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMSB9LCAwLCBJTlRfTUFYLCBWfEYgfSwKKyAgICB7ICJhIiwgInNwZWNpZnkgdGhlIG51bWJlciBvZiBhdWRpbyBzdHJlYW1zIiwKKyAgICAgIE9GRlNFVChuYl9zdHJlYW1zW0FWTUVESUFfVFlQRV9BVURJT10pLAorICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIEF8Rn0sCisgICAgeyAidW5zYWZlIiwgImVuYWJsZSB1bnNhZmUgbW9kZSIsCisgICAgICBPRkZTRVQodW5zYWZlKSwKKyAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWfEF8Rn0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhjb25jYXQpOworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQ29uY2F0Q29udGV4dCAqY2F0ID0gY3R4LT5wcml2OworICAgIHVuc2lnbmVkIHR5cGUsIG5iX3N0ciwgaWR4MCA9IDAsIGlkeCwgc3RyLCBzZWc7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzLCAqcmF0ZXMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHMgPSBOVUxMOworCisgICAgZm9yICh0eXBlID0gMDsgdHlwZSA8IFRZUEVfQUxMOyB0eXBlKyspIHsKKyAgICAgICAgbmJfc3RyID0gY2F0LT5uYl9zdHJlYW1zW3R5cGVdOworICAgICAgICBmb3IgKHN0ciA9IDA7IHN0ciA8IG5iX3N0cjsgc3RyKyspIHsKKyAgICAgICAgICAgIGlkeCA9IGlkeDA7CisKKyAgICAgICAgICAgIC8qIFNldCB0aGUgb3V0cHV0IGZvcm1hdHMgKi8KKyAgICAgICAgICAgIGZvcm1hdHMgPSBmZl9hbGxfZm9ybWF0cyh0eXBlKTsKKyAgICAgICAgICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJmN0eC0+b3V0cHV0c1tpZHhdLT5pbl9mb3JtYXRzKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgICAgIHJhdGVzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKCFyYXRlcykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBmZl9mb3JtYXRzX3JlZihyYXRlcywgJmN0eC0+b3V0cHV0c1tpZHhdLT5pbl9zYW1wbGVyYXRlcyk7CisgICAgICAgICAgICAgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2xheW91dHMoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxheW91dHMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihsYXlvdXRzLCAmY3R4LT5vdXRwdXRzW2lkeF0tPmluX2NoYW5uZWxfbGF5b3V0cyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNldCB0aGUgc2FtZSBmb3JtYXRzIGZvciBlYWNoIGNvcnJlc3BvbmRpbmcgaW5wdXQgKi8KKyAgICAgICAgICAgIGZvciAoc2VnID0gMDsgc2VnIDwgY2F0LT5uYl9zZWdtZW50czsgc2VnKyspIHsKKyAgICAgICAgICAgICAgICBmZl9mb3JtYXRzX3JlZihmb3JtYXRzLCAmY3R4LT5pbnB1dHNbaWR4XS0+b3V0X2Zvcm1hdHMpOworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgICAgICAgICBmZl9mb3JtYXRzX3JlZihyYXRlcywgJmN0eC0+aW5wdXRzW2lkeF0tPm91dF9zYW1wbGVyYXRlcyk7CisgICAgICAgICAgICAgICAgICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJmN0eC0+aW5wdXRzW2lkeF0tPm91dF9jaGFubmVsX2xheW91dHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZHggKz0gY3R4LT5uYl9vdXRwdXRzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZHgwKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQ29uY2F0Q29udGV4dCAqY2F0ICAgPSBjdHgtPnByaXY7CisgICAgdW5zaWduZWQgb3V0X25vID0gRkZfT1VUTElOS19JRFgob3V0bGluayk7CisgICAgdW5zaWduZWQgaW5fbm8gID0gb3V0X25vLCBzZWc7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1tpbl9ub107CisKKyAgICAvKiBlbmhhbmNlbWVudDogZmluZCBhIGNvbW1vbiBvbmUgKi8KKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgICAgICAgICAgID0gQVZfVElNRV9CQVNFX1E7CisgICAgb3V0bGluay0+dyAgICAgICAgICAgICAgICAgICA9IGlubGluay0+dzsKKyAgICBvdXRsaW5rLT5oICAgICAgICAgICAgICAgICAgID0gaW5saW5rLT5oOworICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgb3V0bGluay0+Zm9ybWF0ICAgICAgICAgICAgICA9IGlubGluay0+Zm9ybWF0OworICAgIGZvciAoc2VnID0gMTsgc2VnIDwgY2F0LT5uYl9zZWdtZW50czsgc2VnKyspIHsKKyAgICAgICAgaW5saW5rID0gY3R4LT5pbnB1dHNbaW5fbm8gKz0gY3R4LT5uYl9vdXRwdXRzXTsKKyAgICAgICAgaWYgKCFvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkKKyAgICAgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgIC8qIHBvc3NpYmxlIGVuaGFuY2VtZW50OiB1bnNhZmUgbW9kZSwgZG8gbm90IGNoZWNrICovCisgICAgICAgIGlmIChvdXRsaW5rLT53ICAgICAgICAgICAgICAgICAgICAgICAhPSBpbmxpbmstPncgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICBvdXRsaW5rLT5oICAgICAgICAgICAgICAgICAgICAgICAhPSBpbmxpbmstPmggICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAhPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtIHx8CisgICAgICAgICAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAhPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnB1dCBsaW5rICVzIHBhcmFtZXRlcnMgIgorICAgICAgICAgICAgICAgICAgICIoc2l6ZSAlZHglZCwgU0FSICVkOiVkKSBkbyBub3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgIgorICAgICAgICAgICAgICAgICAgICJvdXRwdXQgbGluayAlcyBwYXJhbWV0ZXJzICglZHglZCwgU0FSICVkOiVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmlucHV0X3BhZHNbaW5fbm9dLm5hbWUsIGlubGluay0+dywgaW5saW5rLT5oLAorICAgICAgICAgICAgICAgICAgIGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCisgICAgICAgICAgICAgICAgICAgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmlucHV0X3BhZHNbb3V0X25vXS5uYW1lLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oLAorICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKyAgICAgICAgICAgIGlmICghY2F0LT51bnNhZmUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1c2hfZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHVuc2lnbmVkIGluX25vLCBBVkZyYW1lICpidWYpCit7CisgICAgQ29uY2F0Q29udGV4dCAqY2F0ID0gY3R4LT5wcml2OworICAgIHVuc2lnbmVkIG91dF9ubyA9IGluX25vICUgY3R4LT5uYl9vdXRwdXRzOworICAgIEFWRmlsdGVyTGluayAqIGlubGluayA9IGN0eC0+IGlucHV0c1sgaW5fbm9dOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1tvdXRfbm9dOworICAgIHN0cnVjdCBjb25jYXRfaW4gKmluID0gJmNhdC0+aW5baW5fbm9dOworCisgICAgYnVmLT5wdHMgPSBhdl9yZXNjYWxlX3EoYnVmLT5wdHMsIGlubGluay0+dGltZV9iYXNlLCBvdXRsaW5rLT50aW1lX2Jhc2UpOworICAgIGluLT5wdHMgPSBidWYtPnB0czsKKyAgICBpbi0+bmJfZnJhbWVzKys7CisgICAgLyogYWRkIGR1cmF0aW9uIHRvIGlucHV0IFBUUyAqLworICAgIGlmIChpbmxpbmstPnNhbXBsZV9yYXRlKQorICAgICAgICAvKiB1c2UgbnVtYmVyIG9mIGF1ZGlvIHNhbXBsZXMgKi8KKyAgICAgICAgaW4tPnB0cyArPSBhdl9yZXNjYWxlX3EoYnVmLT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9tYWtlX3EoMSwgaW5saW5rLT5zYW1wbGVfcmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZSk7CisgICAgZWxzZSBpZiAoaW4tPm5iX2ZyYW1lcyA+PSAyKQorICAgICAgICAvKiB1c2UgbWVhbiBkdXJhdGlvbiAqLworICAgICAgICBpbi0+cHRzID0gYXZfcmVzY2FsZShpbi0+cHRzLCBpbi0+bmJfZnJhbWVzLCBpbi0+bmJfZnJhbWVzIC0gMSk7CisKKyAgICBidWYtPnB0cyArPSBjYXQtPmRlbHRhX3RzOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgYnVmKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggID0gaW5saW5rLT5kc3Q7CisgICAgQ29uY2F0Q29udGV4dCAqY2F0ICAgID0gY3R4LT5wcml2OworICAgIHVuc2lnbmVkIGluX25vID0gRkZfSU5MSU5LX0lEWChpbmxpbmspOworCisgICAgaWYgKGluX25vIDwgY2F0LT5jdXJfaWR4KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZyYW1lIGFmdGVyIEVPRiBvbiBpbnB1dCAlc1xuIiwKKyAgICAgICAgICAgICAgIGN0eC0+aW5wdXRfcGFkc1tpbl9ub10ubmFtZSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7CisgICAgfSBlbHNlIGlmIChpbl9ubyA+PSBjYXQtPmN1cl9pZHggKyBjdHgtPm5iX291dHB1dHMpIHsKKyAgICAgICAgZmZfYnVmcXVldWVfYWRkKGN0eCwgJmNhdC0+aW5baW5fbm9dLnF1ZXVlLCBidWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwdXNoX2ZyYW1lKGN0eCwgaW5fbm8sIGJ1Zik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQVZGcmFtZSAqZ2V0X3ZpZGVvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmlubGluaywgaW50IHcsIGludCBoKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgdW5zaWduZWQgaW5fbm8gPSBGRl9JTkxJTktfSURYKGlubGluayk7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzW2luX25vICUgY3R4LT5uYl9vdXRwdXRzXTsKKworICAgIHJldHVybiBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIHcsIGgpOworfQorCitzdGF0aWMgQVZGcmFtZSAqZ2V0X2F1ZGlvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmlubGluaywgaW50IG5iX3NhbXBsZXMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICB1bnNpZ25lZCBpbl9ubyA9IEZGX0lOTElOS19JRFgoaW5saW5rKTsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbaW5fbm8gJSBjdHgtPm5iX291dHB1dHNdOworCisgICAgcmV0dXJuIGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbmJfc2FtcGxlcyk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCit7CisgICAgcmV0dXJuIHByb2Nlc3NfZnJhbWUoaW5saW5rLCBidWYpOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9pbnB1dChBVkZpbHRlckNvbnRleHQgKmN0eCwgdW5zaWduZWQgaW5fbm8pCit7CisgICAgQ29uY2F0Q29udGV4dCAqY2F0ID0gY3R4LT5wcml2OworCisgICAgY2F0LT5pbltpbl9ub10uZW9mID0gMTsKKyAgICBjYXQtPm5iX2luX2FjdGl2ZS0tOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiRU9GIG9uICVzLCAlZCBzdHJlYW1zIGxlZnQgaW4gc2VnbWVudC5cbiIsCisgICAgICAgICAgIGN0eC0+aW5wdXRfcGFkc1tpbl9ub10ubmFtZSwgY2F0LT5uYl9pbl9hY3RpdmUpOworfQorCitzdGF0aWMgdm9pZCBmaW5kX25leHRfZGVsdGFfdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGludDY0X3QgKnNlZ19kZWx0YSkKK3sKKyAgICBDb25jYXRDb250ZXh0ICpjYXQgPSBjdHgtPnByaXY7CisgICAgdW5zaWduZWQgaSA9IGNhdC0+Y3VyX2lkeDsKKyAgICB1bnNpZ25lZCBpbWF4ID0gaSArIGN0eC0+bmJfb3V0cHV0czsKKyAgICBpbnQ2NF90IHB0czsKKworICAgIHB0cyA9IGNhdC0+aW5baSsrXS5wdHM7CisgICAgZm9yICg7IGkgPCBpbWF4OyBpKyspCisgICAgICAgIHB0cyA9IEZGTUFYKHB0cywgY2F0LT5pbltpXS5wdHMpOworICAgIGNhdC0+ZGVsdGFfdHMgKz0gcHRzOworICAgICpzZWdfZGVsdGEgPSBwdHM7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9zaWxlbmNlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbl9ubywgdW5zaWduZWQgb3V0X25vLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzZWdfZGVsdGEpCit7CisgICAgQ29uY2F0Q29udGV4dCAqY2F0ID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1tvdXRfbm9dOworICAgIGludDY0X3QgYmFzZV9wdHMgPSBjYXQtPmluW2luX25vXS5wdHMgKyBjYXQtPmRlbHRhX3RzIC0gc2VnX2RlbHRhOworICAgIGludDY0X3QgbmJfc2FtcGxlcywgc2VudCA9IDA7CisgICAgaW50IGZyYW1lX25iX3NhbXBsZXMsIHJldDsKKyAgICBBVlJhdGlvbmFsIHJhdGVfdGIgPSB7IDEsIGN0eC0+aW5wdXRzW2luX25vXS0+c2FtcGxlX3JhdGUgfTsKKyAgICBBVkZyYW1lICpidWY7CisgICAgaW50IG5iX2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKG91dGxpbmstPmNoYW5uZWxfbGF5b3V0KTsKKworICAgIGlmICghcmF0ZV90Yi5kZW4pCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICBuYl9zYW1wbGVzID0gYXZfcmVzY2FsZV9xKHNlZ19kZWx0YSAtIGNhdC0+aW5baW5fbm9dLnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZSwgcmF0ZV90Yik7CisgICAgZnJhbWVfbmJfc2FtcGxlcyA9IEZGTUFYKDk2MDAsIHJhdGVfdGIuZGVuIC8gNSk7IC8qIGFyYml0cmFyeSAqLworICAgIHdoaWxlIChuYl9zYW1wbGVzKSB7CisgICAgICAgIGZyYW1lX25iX3NhbXBsZXMgPSBGRk1JTihmcmFtZV9uYl9zYW1wbGVzLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgYnVmID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBmcmFtZV9uYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKCFidWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKGJ1Zi0+ZXh0ZW5kZWRfZGF0YSwgMCwgZnJhbWVfbmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9jaGFubmVscywgb3V0bGluay0+Zm9ybWF0KTsKKyAgICAgICAgYnVmLT5wdHMgPSBiYXNlX3B0cyArIGF2X3Jlc2NhbGVfcShzZW50LCByYXRlX3RiLCBvdXRsaW5rLT50aW1lX2Jhc2UpOworICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgYnVmKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBzZW50ICAgICAgICs9IGZyYW1lX25iX3NhbXBsZXM7CisgICAgICAgIG5iX3NhbXBsZXMgLT0gZnJhbWVfbmJfc2FtcGxlczsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmx1c2hfc2VnbWVudChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQgcmV0OworICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGN0eC0+cHJpdjsKKyAgICB1bnNpZ25lZCBzdHIsIHN0cl9tYXg7CisgICAgaW50NjRfdCBzZWdfZGVsdGE7CisKKyAgICBmaW5kX25leHRfZGVsdGFfdHMoY3R4LCAmc2VnX2RlbHRhKTsKKyAgICBjYXQtPmN1cl9pZHggKz0gY3R4LT5uYl9vdXRwdXRzOworICAgIGNhdC0+bmJfaW5fYWN0aXZlID0gY3R4LT5uYl9vdXRwdXRzOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiU2VnbWVudCBmaW5pc2hlZCBhdCBwdHM9JSJQUklkNjQiXG4iLAorICAgICAgICAgICBjYXQtPmRlbHRhX3RzKTsKKworICAgIGlmIChjYXQtPmN1cl9pZHggPCBjdHgtPm5iX2lucHV0cykgeworICAgICAgICAvKiBwYWQgYXVkaW8gc3RyZWFtcyB3aXRoIHNpbGVuY2UgKi8KKyAgICAgICAgc3RyID0gY2F0LT5uYl9zdHJlYW1zW0FWTUVESUFfVFlQRV9WSURFT107CisgICAgICAgIHN0cl9tYXggPSBzdHIgKyBjYXQtPm5iX3N0cmVhbXNbQVZNRURJQV9UWVBFX0FVRElPXTsKKyAgICAgICAgZm9yICg7IHN0ciA8IHN0cl9tYXg7IHN0cisrKSB7CisgICAgICAgICAgICByZXQgPSBzZW5kX3NpbGVuY2UoY3R4LCBjYXQtPmN1cl9pZHggLSBjdHgtPm5iX291dHB1dHMgKyBzdHIsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdfZGVsdGEpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICAvKiBmbHVzaCBxdWV1ZWQgYnVmZmVycyAqLworICAgICAgICAvKiBwb3NzaWJsZSBlbmhhbmNlbWVudDogZmx1c2ggaW4gUFRTIG9yZGVyICovCisgICAgICAgIHN0cl9tYXggPSBjYXQtPmN1cl9pZHggKyBjdHgtPm5iX291dHB1dHM7CisgICAgICAgIGZvciAoc3RyID0gY2F0LT5jdXJfaWR4OyBzdHIgPCBzdHJfbWF4OyBzdHIrKykgeworICAgICAgICAgICAgd2hpbGUgKGNhdC0+aW5bc3RyXS5xdWV1ZS5hdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBwdXNoX2ZyYW1lKGN0eCwgc3RyLCBmZl9idWZxdWV1ZV9nZXQoJmNhdC0+aW5bc3RyXS5xdWV1ZSkpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIENvbmNhdENvbnRleHQgKmNhdCAgID0gY3R4LT5wcml2OworICAgIHVuc2lnbmVkIG91dF9ubyA9IEZGX09VVExJTktfSURYKG91dGxpbmspOworICAgIHVuc2lnbmVkIGluX25vICA9IG91dF9ubyArIGNhdC0+Y3VyX2lkeDsKKyAgICB1bnNpZ25lZCBzdHIsIHN0cl9tYXg7CisgICAgaW50IHJldDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChpbl9ubyA+PSBjdHgtPm5iX2lucHV0cykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICAgICAgaWYgKCFjYXQtPmluW2luX25vXS5lb2YpIHsKKyAgICAgICAgICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbaW5fbm9dKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGNsb3NlX2lucHV0KGN0eCwgaW5fbm8pOworICAgICAgICB9CisgICAgICAgIC8qIGN5Y2xlIG9uIGFsbCBpbnB1dHMgdG8gZmluaXNoIHRoZSBzZWdtZW50ICovCisgICAgICAgIC8qIHBvc3NpYmxlIGVuaGFuY2VtZW50OiByZXF1ZXN0IGluIFBUUyBvcmRlciAqLworICAgICAgICBzdHJfbWF4ID0gY2F0LT5jdXJfaWR4ICsgY3R4LT5uYl9vdXRwdXRzIC0gMTsKKyAgICAgICAgZm9yIChzdHIgPSBjYXQtPmN1cl9pZHg7IGNhdC0+bmJfaW5fYWN0aXZlOworICAgICAgICAgICAgIHN0ciA9IHN0ciA9PSBzdHJfbWF4ID8gY2F0LT5jdXJfaWR4IDogc3RyICsgMSkgeworICAgICAgICAgICAgaWYgKGNhdC0+aW5bc3RyXS5lb2YpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzW3N0cl0pOworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikKKyAgICAgICAgICAgICAgICBjbG9zZV9pbnB1dChjdHgsIHN0cik7CisgICAgICAgICAgICBlbHNlIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gZmx1c2hfc2VnbWVudChjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGluX25vICs9IGN0eC0+bmJfb3V0cHV0czsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGN0eC0+cHJpdjsKKyAgICB1bnNpZ25lZCBzZWcsIHR5cGUsIHN0cjsKKworICAgIC8qIGNyZWF0ZSBpbnB1dCBwYWRzICovCisgICAgZm9yIChzZWcgPSAwOyBzZWcgPCBjYXQtPm5iX3NlZ21lbnRzOyBzZWcrKykgeworICAgICAgICBmb3IgKHR5cGUgPSAwOyB0eXBlIDwgVFlQRV9BTEw7IHR5cGUrKykgeworICAgICAgICAgICAgZm9yIChzdHIgPSAwOyBzdHIgPCBjYXQtPm5iX3N0cmVhbXNbdHlwZV07IHN0cisrKSB7CisgICAgICAgICAgICAgICAgQVZGaWx0ZXJQYWQgcGFkID0geworICAgICAgICAgICAgICAgICAgICAudHlwZSAgICAgICAgICAgICA9IHR5cGUsCisgICAgICAgICAgICAgICAgICAgIC5nZXRfdmlkZW9fYnVmZmVyID0gZ2V0X3ZpZGVvX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgLmdldF9hdWRpb19idWZmZXIgPSBnZXRfYXVkaW9fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyX2ZyYW1lICAgICA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHBhZC5uYW1lID0gYXZfYXNwcmludGYoImluJWQ6JWMlZCIsIHNlZywgInZhIlt0eXBlXSwgc3RyKTsKKyAgICAgICAgICAgICAgICBmZl9pbnNlcnRfaW5wYWQoY3R4LCBjdHgtPm5iX2lucHV0cywgJnBhZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogY3JlYXRlIG91dHB1dCBwYWRzICovCisgICAgZm9yICh0eXBlID0gMDsgdHlwZSA8IFRZUEVfQUxMOyB0eXBlKyspIHsKKyAgICAgICAgZm9yIChzdHIgPSAwOyBzdHIgPCBjYXQtPm5iX3N0cmVhbXNbdHlwZV07IHN0cisrKSB7CisgICAgICAgICAgICBBVkZpbHRlclBhZCBwYWQgPSB7CisgICAgICAgICAgICAgICAgLnR5cGUgICAgICAgICAgPSB0eXBlLAorICAgICAgICAgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICAgICAgICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgcGFkLm5hbWUgPSBhdl9hc3ByaW50Zigib3V0OiVjJWQiLCAidmEiW3R5cGVdLCBzdHIpOworICAgICAgICAgICAgZmZfaW5zZXJ0X291dHBhZChjdHgsIGN0eC0+bmJfb3V0cHV0cywgJnBhZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjYXQtPmluID0gYXZfY2FsbG9jKGN0eC0+bmJfaW5wdXRzLCBzaXplb2YoKmNhdC0+aW4pKTsKKyAgICBpZiAoIWNhdC0+aW4pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgY2F0LT5uYl9pbl9hY3RpdmUgPSBjdHgtPm5iX291dHB1dHM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGN0eC0+cHJpdjsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+aW5wdXRfcGFkc1tpXS5uYW1lKTsKKyAgICAgICAgZmZfYnVmcXVldWVfZGlzY2FyZF9hbGwoJmNhdC0+aW5baV0ucXVldWUpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9vdXRwdXRzOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZjdHgtPm91dHB1dF9wYWRzW2ldLm5hbWUpOworICAgIGF2X2ZyZWVwKCZjYXQtPmluKTsKK30KKworQVZGaWx0ZXIgZmZfYXZmX2NvbmNhdCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJjb25jYXQiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvbmNhdGVuYXRlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zLiIpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQ29uY2F0Q29udGV4dCksCisgICAgLmlucHV0cyAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgID0gTlVMTCwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZjb25jYXRfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfSU5QVVRTIHwgQVZGSUxURVJfRkxBR19EWU5BTUlDX09VVFBVVFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2F2Zl9zaG93Y3F0LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZmX3Nob3djcXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjUwZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2F2Zl9zaG93Y3F0LmMKQEAgLTAsMCArMSw4MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTXVoYW1tYWQgRmFpeiA8bWZjYzY0QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZmZnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3hnYV9mb250X2RhdGEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcXNvcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWYgQ09ORklHX0xJQkZSRUVUWVBFCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyNlbmRpZgorCisvKiB0aGlzIGZpbHRlciBpcyBkZXNpZ25lZCB0byBkbyAxNiBiaW5zL3NlbWl0b25lcyBjb25zdGFudCBRIHRyYW5zZm9ybSB3aXRoIEJyb3duLVB1Y2tldHRlIGFsZ29yaXRobQorICogc3RhcnQgZnJvbSBFMCB0byBEIzEwICgxMCBvY3RhdmVzKQorICogc28gdGhlcmUgYXJlIDE2IGJpbnMvc2VtaXRvbmVzICogMTIgc2VtaXRvbmVzL29jdGF2ZXMgKiAxMCBvY3RhdmVzID0gMTkyMCBiaW5zCisgKiBtYXRjaCB3aXRoIGZ1bGwgSEQgcmVzb2x1dGlvbiAqLworCisjZGVmaW5lIFZJREVPX1dJRFRIIDE5MjAKKyNkZWZpbmUgVklERU9fSEVJR0hUIDEwODAKKyNkZWZpbmUgRk9OVF9IRUlHSFQgMzIKKyNkZWZpbmUgU1BFQ1RPR1JBTV9IRUlHSFQgKChWSURFT19IRUlHSFQtRk9OVF9IRUlHSFQpLzIpCisjZGVmaW5lIFNQRUNUT0dSQU1fU1RBUlQgKFZJREVPX0hFSUdIVC1TUEVDVE9HUkFNX0hFSUdIVCkKKyNkZWZpbmUgQkFTRV9GUkVRIDIwLjA1MTM5MjgwMDQ5MgorI2RlZmluZSBDT0VGRl9DTEFNUCAxLjBlLTQKKyNkZWZpbmUgVExFTkdUSF9NSU4gMC4wMDEKKyNkZWZpbmUgVExFTkdUSF9ERUZBVUxUICIzODQvZip0Yy8oMzg0L2YrdGMpIgorI2RlZmluZSBWT0xVTUVfTUlOIDFlLTEwCisjZGVmaW5lIFZPTFVNRV9NQVggMTAwLjAKKyNkZWZpbmUgRk9OVENPTE9SX0RFRkFVTFQgInN0KDAsIChtaWRpKGYpLTU5LjUpLzEyKTsiIFwKKyAgICAic3QoMSwgaWYoYmV0d2VlbihsZCgwKSwwLDEpLCAwLjUtMC41KmNvcygyKlBJKmxkKDApKSwgMCkpOyIgXAorICAgICJyKDEtbGQoMSkpICsgYihsZCgxKSkiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBGRlRTYW1wbGUgdmFsdWU7CisgICAgaW50IGluZGV4OworfSBTcGFyc2VDb2VmZjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEFWRnJhbWUgKm91dHBpY3JlZjsKKyAgICBGRlRDb250ZXh0ICpmZnRfY29udGV4dDsKKyAgICBGRlRDb21wbGV4ICpmZnRfZGF0YTsKKyAgICBGRlRDb21wbGV4ICpmZnRfcmVzdWx0X2xlZnQ7CisgICAgRkZUQ29tcGxleCAqZmZ0X3Jlc3VsdF9yaWdodDsKKyAgICB1aW50OF90ICpzcGVjdG9ncmFtOworICAgIFNwYXJzZUNvZWZmICpjb2VmZl9zb3J0OworICAgIFNwYXJzZUNvZWZmICpjb2VmZnNbVklERU9fV0lEVEhdOworICAgIHVpbnQ4X3QgKmZvbnRfYWxwaGE7CisgICAgY2hhciAqZm9udGZpbGU7ICAgICAvKiB1c2luZyBmcmVldHlwZSAqLworICAgIGludCBjb2VmZnNfbGVuW1ZJREVPX1dJRFRIXTsKKyAgICB1aW50OF90IGZvbnRjb2xvcl92YWx1ZVtWSURFT19XSURUSCozXTsgIC8qIHJlc3VsdCBvZiBmb250Y29sb3Igb3B0aW9uICovCisgICAgaW50NjRfdCBmcmFtZV9jb3VudDsKKyAgICBpbnQgc3BlY3RvZ3JhbV9jb3VudDsKKyAgICBpbnQgc3BlY3RvZ3JhbV9pbmRleDsKKyAgICBpbnQgZmZ0X2JpdHM7CisgICAgaW50IHJlcV9mdWxsZmlsbGVkOworICAgIGludCByZW1haW5pbmdfZmlsbDsKKyAgICBjaGFyICp0bGVuZ3RoOworICAgIGNoYXIgKnZvbHVtZTsKKyAgICBjaGFyICpmb250Y29sb3I7CisgICAgZG91YmxlIHRpbWVjbGFtcDsgICAvKiBsb3dlciB0aW1lY2xhbXAsIHRpbWUtYWNjdXJhdGUsIGhpZ2hlciB0aW1lY2xhbXAsIGZyZXEtYWNjdXJhdGUgKGF0IGxvdyBmcmVxKSovCisgICAgZmxvYXQgY29lZmZjbGFtcDsgICAvKiBsb3dlciBjb2VmZmNsYW1wLCBtb3JlIHByZWNpc2UsIGhpZ2hlciBjb2VmZmNsYW1wLCBmYXN0ZXIgKi8KKyAgICBpbnQgZnVsbGhkOyAgICAgICAgIC8qIGlmIHRydWUsIG91dHB1dCB2aWRlbyBpcyBhdCBmdWxsIEhEIHJlc29sdXRpb24sIG90aGVyd2lzZSBpdCB3aWxsIGJlIGhhbHZlZCAqLworICAgIGZsb2F0IGdhbW1hOyAgICAgICAgLyogbG93ZXIgZ2FtbWEsIG1vcmUgY29udHJhc3QsIGhpZ2hlciBnYW1tYSwgbW9yZSByYW5nZSAqLworICAgIGludCBmcHM7ICAgICAgICAgICAgLyogdGhlIHJlcXVpcmVkIGZwcyBpcyBzbyBzdHJpY3QsIHNvIGl0J3MgZW5vdWdoIHRvIGJlIGludCwgYnV0IDI0MDAwLzEwMDEgZXRjIGNhbm5vdCBiZSBlbmNvZGVkICovCisgICAgaW50IGNvdW50OyAgICAgICAgICAvKiBmcHMgKiBjb3VudCA9IHRyYW5zZm9ybSByYXRlICovCit9IFNob3dDUVRDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTaG93Q1FUQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzaG93Y3F0X29wdGlvbnNbXSA9IHsKKyAgICB7ICJ2b2x1bWUiLCAic2V0IHZvbHVtZSIsIE9GRlNFVCh2b2x1bWUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICIxNiIgfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgInRsZW5ndGgiLCAic2V0IHRyYW5zZm9ybSBsZW5ndGgiLCBPRkZTRVQodGxlbmd0aCksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gVExFTkdUSF9ERUZBVUxUIH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJ0aW1lY2xhbXAiLCAic2V0IHRpbWVjbGFtcCIsIE9GRlNFVCh0aW1lY2xhbXApLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDAuMTcgfSwgMC4xLCAxLjAsIEZMQUdTIH0sCisgICAgeyAiY29lZmZjbGFtcCIsICJzZXQgY29lZmZjbGFtcCIsIE9GRlNFVChjb2VmZmNsYW1wKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IDEgfSwgMC4xLCAxMCwgRkxBR1MgfSwKKyAgICB7ICJnYW1tYSIsICJzZXQgZ2FtbWEiLCBPRkZTRVQoZ2FtbWEpLCBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gMyB9LCAxLCA3LCBGTEFHUyB9LAorICAgIHsgImZ1bGxoZCIsICJzZXQgZnVsbCBIRCByZXNvbHV0aW9uIiwgT0ZGU0VUKGZ1bGxoZCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMSB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgImZwcyIsICJzZXQgdmlkZW8gZnBzIiwgT0ZGU0VUKGZwcyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMjUgfSwgMTAsIDEwMCwgRkxBR1MgfSwKKyAgICB7ICJjb3VudCIsICJzZXQgbnVtYmVyIG9mIHRyYW5zZm9ybSBwZXIgZnJhbWUiLCBPRkZTRVQoY291bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDYgfSwgMSwgMzAsIEZMQUdTIH0sCisgICAgeyAiZm9udGZpbGUiLCAic2V0IGZvbnQgZmlsZSIsIE9GRlNFVChmb250ZmlsZSksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiZm9udGNvbG9yIiwgInNldCBmb250IGNvbG9yIiwgT0ZGU0VUKGZvbnRjb2xvciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gRk9OVENPTE9SX0RFRkFVTFQgfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moc2hvd2NxdCk7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBrOworCisgICAgU2hvd0NRVENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgYXZfZmZ0X2VuZChzLT5mZnRfY29udGV4dCk7CisgICAgcy0+ZmZ0X2NvbnRleHQgPSBOVUxMOworICAgIGZvciAoayA9IDA7IGsgPCBWSURFT19XSURUSDsgaysrKQorICAgICAgICBhdl9mcmVlcCgmcy0+Y29lZmZzW2tdKTsKKyAgICBhdl9mcmVlcCgmcy0+ZmZ0X2RhdGEpOworICAgIGF2X2ZyZWVwKCZzLT5mZnRfcmVzdWx0X2xlZnQpOworICAgIGF2X2ZyZWVwKCZzLT5mZnRfcmVzdWx0X3JpZ2h0KTsKKyAgICBhdl9mcmVlcCgmcy0+Y29lZmZfc29ydCk7CisgICAgYXZfZnJlZXAoJnMtPnNwZWN0b2dyYW0pOworICAgIGF2X2ZyZWVwKCZzLT5mb250X2FscGhhKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5vdXRwaWNyZWYpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gTlVMTDsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzID0gTlVMTDsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geyBBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9OT05FIH07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geyBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX05PTkUgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBjaGFubmVsX2xheW91dHNbXSA9IHsgQVZfQ0hfTEFZT1VUX1NURVJFTywgQVZfQ0hfTEFZT1VUX1NURVJFT19ET1dOTUlYLCAtMSB9OworICAgIHN0YXRpYyBjb25zdCBpbnQgc2FtcGxlcmF0ZXNbXSA9IHsgNDQxMDAsIDQ4MDAwLCAtMSB9OworCisgICAgLyogc2V0IGlucHV0IGF1ZGlvIGZvcm1hdHMgKi8KKyAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10cyk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZpbmxpbmstPm91dF9mb3JtYXRzKTsKKworICAgIGxheW91dHMgPSBhdmZpbHRlcl9tYWtlX2Zvcm1hdDY0X2xpc3QoY2hhbm5lbF9sYXlvdXRzKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihsYXlvdXRzLCAmaW5saW5rLT5vdXRfY2hhbm5lbF9sYXlvdXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZXJhdGVzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJmlubGluay0+b3V0X3NhbXBsZXJhdGVzKTsKKworICAgIC8qIHNldCBvdXRwdXQgdmlkZW8gZm9ybWF0ICovCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9mb3JtYXRzX3JlZihmb3JtYXRzLCAmb3V0bGluay0+aW5fZm9ybWF0cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19MSUJGUkVFVFlQRQorc3RhdGljIHZvaWQgbG9hZF9mcmVldHlwZV9mb250KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyIHN0cltdID0gIkVGIEcgQSBCQyBEICI7CisgICAgU2hvd0NRVENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgRlRfTGlicmFyeSBsaWIgPSBOVUxMOworICAgIEZUX0ZhY2UgZmFjZSA9IE5VTEw7CisgICAgaW50IHZpZGVvX3NjYWxlID0gcy0+ZnVsbGhkID8gMiA6IDE7CisgICAgaW50IHZpZGVvX3dpZHRoID0gKFZJREVPX1dJRFRILzIpICogdmlkZW9fc2NhbGU7CisgICAgaW50IGZvbnRfaGVpZ2h0ID0gKEZPTlRfSEVJR0hULzIpICogdmlkZW9fc2NhbGU7CisgICAgaW50IGZvbnRfd2lkdGggPSA4ICogdmlkZW9fc2NhbGU7CisgICAgaW50IGZvbnRfcmVwZWF0ID0gZm9udF93aWR0aCAqIDEyOworICAgIGludCBsaW5lYXJfaG9yaV9hZHZhbmNlID0gZm9udF93aWR0aCAqIDY1NTM2OworICAgIGludCBub25fbW9ub3NwYWNlX3dhcm5pbmcgPSAwOworICAgIGludCB4OworCisgICAgcy0+Zm9udF9hbHBoYSA9IE5VTEw7CisKKyAgICBpZiAoIXMtPmZvbnRmaWxlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoRlRfSW5pdF9GcmVlVHlwZSgmbGliKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKEZUX05ld19GYWNlKGxpYiwgcy0+Zm9udGZpbGUsIDAsICZmYWNlKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKEZUX1NldF9DaGFyX1NpemUoZmFjZSwgMTYqNjQsIDAsIDAsIDApKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoRlRfTG9hZF9DaGFyKGZhY2UsICdBJywgRlRfTE9BRF9SRU5ERVIpKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoRlRfU2V0X0NoYXJfU2l6ZShmYWNlLCAxNio2NCAqIGxpbmVhcl9ob3JpX2FkdmFuY2UgLyBmYWNlLT5nbHlwaC0+bGluZWFySG9yaUFkdmFuY2UsIDAsIDAsIDApKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzLT5mb250X2FscGhhID0gYXZfbWFsbG9jKGZvbnRfaGVpZ2h0ICogdmlkZW9fd2lkdGgpOworICAgIGlmICghcy0+Zm9udF9hbHBoYSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgbWVtc2V0KHMtPmZvbnRfYWxwaGEsIDAsIGZvbnRfaGVpZ2h0ICogdmlkZW9fd2lkdGgpOworCisgICAgZm9yICh4ID0gMDsgeCA8IDEyOyB4KyspIHsKKyAgICAgICAgaW50IHN4LCBzeSwgcngsIGJ4LCBieSwgZHgsIGR5OworCisgICAgICAgIGlmIChzdHJbeF0gPT0gJyAnKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKEZUX0xvYWRfQ2hhcihmYWNlLCBzdHJbeF0sIEZUX0xPQURfUkVOREVSKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBpZiAoZmFjZS0+Z2x5cGgtPmFkdmFuY2UueCAhPSBmb250X3dpZHRoKjY0ICYmICFub25fbW9ub3NwYWNlX3dhcm5pbmcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiRm9udCBpcyBub3QgbW9ub3NwYWNlXG4iKTsKKyAgICAgICAgICAgIG5vbl9tb25vc3BhY2Vfd2FybmluZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICBzeSA9IGZvbnRfaGVpZ2h0IC0gNCp2aWRlb19zY2FsZSAtIGZhY2UtPmdseXBoLT5iaXRtYXBfdG9wOworICAgICAgICBmb3IgKHJ4ID0gMDsgcnggPCAxMDsgcngrKykgeworICAgICAgICAgICAgc3ggPSByeCAqIGZvbnRfcmVwZWF0ICsgeCAqIGZvbnRfd2lkdGggKyBmYWNlLT5nbHlwaC0+Yml0bWFwX2xlZnQ7CisgICAgICAgICAgICBmb3IgKGJ5ID0gMDsgYnkgPCBmYWNlLT5nbHlwaC0+Yml0bWFwLnJvd3M7IGJ5KyspIHsKKyAgICAgICAgICAgICAgICBkeSA9IGJ5ICsgc3k7CisgICAgICAgICAgICAgICAgaWYgKGR5IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGR5ID49IGZvbnRfaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGZvciAoYnggPSAwOyBieCA8IGZhY2UtPmdseXBoLT5iaXRtYXAud2lkdGg7IGJ4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHggPSBieCArIHN4OworICAgICAgICAgICAgICAgICAgICBpZiAoZHggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+PSB2aWRlb193aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBzLT5mb250X2FscGhhW2R5KnZpZGVvX3dpZHRoK2R4XSA9IGZhY2UtPmdseXBoLT5iaXRtYXAuYnVmZmVyW2J5KmZhY2UtPmdseXBoLT5iaXRtYXAud2lkdGgrYnhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEZUX0RvbmVfRmFjZShmYWNlKTsKKyAgICBGVF9Eb25lX0ZyZWVUeXBlKGxpYik7CisgICAgcmV0dXJuOworCisgICAgZmFpbDoKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIkVycm9yIHdoaWxlIGxvYWRpbmcgZnJlZXR5cGUgZm9udCwgdXNpbmcgZGVmYXVsdCBmb250IGluc3RlYWRcbiIpOworICAgIEZUX0RvbmVfRmFjZShmYWNlKTsKKyAgICBGVF9Eb25lX0ZyZWVUeXBlKGxpYik7CisgICAgYXZfZnJlZXAoJnMtPmZvbnRfYWxwaGEpOworICAgIHJldHVybjsKK30KKyNlbmRpZgorCitzdGF0aWMgZG91YmxlIGFfd2VpZ2h0aW5nKHZvaWQgKnAsIGRvdWJsZSBmKQoreworICAgIGRvdWJsZSByZXQgPSAxMjIwMC4wKjEyMjAwLjAgKiAoZipmKmYqZik7CisgICAgcmV0IC89IChmKmYgKyAyMC42KjIwLjYpICogKGYqZiArIDEyMjAwLjAqMTIyMDAuMCkgKgorICAgICAgICAgICBzcXJ0KChmKmYgKyAxMDcuNyoxMDcuNykgKiAoZipmICsgNzM3LjkqNzM3LjkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZG91YmxlIGJfd2VpZ2h0aW5nKHZvaWQgKnAsIGRvdWJsZSBmKQoreworICAgIGRvdWJsZSByZXQgPSAxMjIwMC4wKjEyMjAwLjAgKiAoZipmKmYpOworICAgIHJldCAvPSAoZipmICsgMjAuNioyMC42KSAqIChmKmYgKyAxMjIwMC4wKjEyMjAwLjApICogc3FydChmKmYgKyAxNTguNSoxNTguNSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGRvdWJsZSBjX3dlaWdodGluZyh2b2lkICpwLCBkb3VibGUgZikKK3sKKyAgICBkb3VibGUgcmV0ID0gMTIyMDAuMCoxMjIwMC4wICogKGYqZik7CisgICAgcmV0IC89IChmKmYgKyAyMC42KjIwLjYpICogKGYqZiArIDEyMjAwLjAqMTIyMDAuMCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGRvdWJsZSBtaWRpKHZvaWQgKnAsIGRvdWJsZSBmKQoreworICAgIHJldHVybiBsb2cyKGYvNDQwLjApICogMTIuMCArIDY5LjA7Cit9CisKK3N0YXRpYyBkb3VibGUgcl9mdW5jKHZvaWQgKnAsIGRvdWJsZSB4KQoreworICAgIHggPSBhdl9jbGlwZCh4LCAwLjAsIDEuMCk7CisgICAgcmV0dXJuIChpbnQpKHgqMjU1LjArMC41KSA8PCAxNjsKK30KKworc3RhdGljIGRvdWJsZSBnX2Z1bmModm9pZCAqcCwgZG91YmxlIHgpCit7CisgICAgeCA9IGF2X2NsaXBkKHgsIDAuMCwgMS4wKTsKKyAgICByZXR1cm4gKGludCkoeCoyNTUuMCswLjUpIDw8IDg7Cit9CisKK3N0YXRpYyBkb3VibGUgYl9mdW5jKHZvaWQgKnAsIGRvdWJsZSB4KQoreworICAgIHggPSBhdl9jbGlwZCh4LCAwLjAsIDEuMCk7CisgICAgcmV0dXJuIChpbnQpKHgqMjU1LjArMC41KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcXNvcnRfc3BhcnNlY29lZmYoY29uc3QgU3BhcnNlQ29lZmYgKmEsIGNvbnN0IFNwYXJzZUNvZWZmICpiKQoreworICAgIGlmIChmYWJzZihhLT52YWx1ZSkgPj0gZmFic2YoYi0+dmFsdWUpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIFNob3dDUVRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRXhwciAqdGxlbmd0aF9leHByID0gTlVMTCwgKnZvbHVtZV9leHByID0gTlVMTCwgKmZvbnRjb2xvcl9leHByID0gTlVMTDsKKyAgICB1aW50OF90ICpmb250Y29sb3JfdmFsdWUgPSBzLT5mb250Y29sb3JfdmFsdWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHByX3ZhcnNbXSA9IHsgInRpbWVjbGFtcCIsICJ0YyIsICJmcmVxdWVuY3kiLCAiZnJlcSIsICJmIiwgTlVMTCB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXhwcl9mdW5jX25hbWVzW10gPSB7ICJhX3dlaWdodGluZyIsICJiX3dlaWdodGluZyIsICJjX3dlaWdodGluZyIsIE5VTEwgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4cHJfZm9udGNvbG9yX2Z1bmNfbmFtZXNbXSA9IHsgIm1pZGkiLCAiciIsICJnIiwgImIiLCBOVUxMIH07CisgICAgc3RhdGljIGRvdWJsZSAoKiBjb25zdCBleHByX2Z1bmNzW10pKHZvaWQgKiwgZG91YmxlKSA9IHsgYV93ZWlnaHRpbmcsIGJfd2VpZ2h0aW5nLCBjX3dlaWdodGluZywgTlVMTCB9OworICAgIHN0YXRpYyBkb3VibGUgKCogY29uc3QgZXhwcl9mb250Y29sb3JfZnVuY3NbXSkodm9pZCAqLCBkb3VibGUpID0geyBtaWRpLCByX2Z1bmMsIGdfZnVuYywgYl9mdW5jLCBOVUxMIH07CisgICAgaW50IGZmdF9sZW4sIGssIHgsIHksIHJldDsKKyAgICBpbnQgbnVtX2NvZWZmcyA9IDA7CisgICAgaW50IHJhdGUgPSBpbmxpbmstPnNhbXBsZV9yYXRlOworICAgIGRvdWJsZSBtYXhfbGVuID0gcmF0ZSAqIChkb3VibGUpIHMtPnRpbWVjbGFtcDsKKyAgICBpbnQ2NF90IHN0YXJ0X3RpbWUsIGVuZF90aW1lOworICAgIGludCB2aWRlb19zY2FsZSA9IHMtPmZ1bGxoZCA/IDIgOiAxOworICAgIGludCB2aWRlb193aWR0aCA9IChWSURFT19XSURUSC8yKSAqIHZpZGVvX3NjYWxlOworICAgIGludCB2aWRlb19oZWlnaHQgPSAoVklERU9fSEVJR0hULzIpICogdmlkZW9fc2NhbGU7CisgICAgaW50IHNwZWN0b2dyYW1faGVpZ2h0ID0gKFNQRUNUT0dSQU1fSEVJR0hULzIpICogdmlkZW9fc2NhbGU7CisKKyAgICBzLT5mZnRfYml0cyA9IGNlaWwobG9nMihtYXhfbGVuKSk7CisgICAgZmZ0X2xlbiA9IDEgPDwgcy0+ZmZ0X2JpdHM7CisKKyAgICBpZiAocmF0ZSAlIChzLT5mcHMgKiBzLT5jb3VudCkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUmF0ZSAoJXUpIGlzIG5vdCBkaXZpc2libGUgYnkgZnBzKmNvdW50ICgldSoldSlcbiIsIHJhdGUsIHMtPmZwcywgcy0+Y291bnQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPmZmdF9kYXRhICAgICAgICAgPSBhdl9tYWxsb2NfYXJyYXkoZmZ0X2xlbiwgc2l6ZW9mKCpzLT5mZnRfZGF0YSkpOworICAgIHMtPmNvZWZmX3NvcnQgICAgICAgPSBhdl9tYWxsb2NfYXJyYXkoZmZ0X2xlbiwgc2l6ZW9mKCpzLT5jb2VmZl9zb3J0KSk7CisgICAgcy0+ZmZ0X3Jlc3VsdF9sZWZ0ICA9IGF2X21hbGxvY19hcnJheShmZnRfbGVuLCBzaXplb2YoKnMtPmZmdF9yZXN1bHRfbGVmdCkpOworICAgIHMtPmZmdF9yZXN1bHRfcmlnaHQgPSBhdl9tYWxsb2NfYXJyYXkoZmZ0X2xlbiwgc2l6ZW9mKCpzLT5mZnRfcmVzdWx0X3JpZ2h0KSk7CisgICAgcy0+ZmZ0X2NvbnRleHQgICAgICA9IGF2X2ZmdF9pbml0KHMtPmZmdF9iaXRzLCAwKTsKKworICAgIGlmICghcy0+ZmZ0X2RhdGEgfHwgIXMtPmNvZWZmX3NvcnQgfHwgIXMtPmZmdF9yZXN1bHRfbGVmdCB8fCAhcy0+ZmZ0X3Jlc3VsdF9yaWdodCB8fCAhcy0+ZmZ0X2NvbnRleHQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyNpZiBDT05GSUdfTElCRlJFRVRZUEUKKyAgICBsb2FkX2ZyZWV0eXBlX2ZvbnQoY3R4KTsKKyNlbHNlCisgICAgaWYgKHMtPmZvbnRmaWxlKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIkZyZWV0eXBlIGlzIG5vdCBhdmFpbGFibGUsIGlnbm9yaW5nIGZvbnRmaWxlIG9wdGlvblxuIik7CisgICAgcy0+Zm9udF9hbHBoYSA9IE5VTEw7CisjZW5kaWYKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiQ2FsY3VsYXRpbmcgc3BlY3RyYWwga2VybmVsLCBwbGVhc2Ugd2FpdFxuIik7CisgICAgc3RhcnRfdGltZSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICByZXQgPSBhdl9leHByX3BhcnNlKCZ0bGVuZ3RoX2V4cHIsIHMtPnRsZW5ndGgsIGV4cHJfdmFycywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBldmFsX2Vycm9yOworCisgICAgcmV0ID0gYXZfZXhwcl9wYXJzZSgmdm9sdW1lX2V4cHIsIHMtPnZvbHVtZSwgZXhwcl92YXJzLCBleHByX2Z1bmNfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBleHByX2Z1bmNzLCBOVUxMLCBOVUxMLCAwLCBjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGV2YWxfZXJyb3I7CisKKyAgICByZXQgPSBhdl9leHByX3BhcnNlKCZmb250Y29sb3JfZXhwciwgcy0+Zm9udGNvbG9yLCBleHByX3ZhcnMsIGV4cHJfZm9udGNvbG9yX2Z1bmNfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBleHByX2ZvbnRjb2xvcl9mdW5jcywgTlVMTCwgTlVMTCwgMCwgY3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBldmFsX2Vycm9yOworCisgICAgZm9yIChrID0gMDsgayA8IFZJREVPX1dJRFRIOyBrKyspIHsKKyAgICAgICAgaW50IGhsZW4gPSBmZnRfbGVuID4+IDE7CisgICAgICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAgICAgZmxvYXQgcGFydGlhbCA9IDA7CisgICAgICAgIGRvdWJsZSBmcmVxID0gQkFTRV9GUkVRICogZXhwMihrICogKDEuMC8xOTIuMCkpOworICAgICAgICBkb3VibGUgdGxlbiwgdGxlbmd0aCwgdm9sdW1lOworICAgICAgICBkb3VibGUgZXhwcl92YXJzX3ZhbFtdID0geyBzLT50aW1lY2xhbXAsIHMtPnRpbWVjbGFtcCwgZnJlcSwgZnJlcSwgZnJlcSwgMCB9OworICAgICAgICAvKiBhIHdpbmRvdyBmdW5jdGlvbiBmcm9tIEFsYmVydCBILiBOdXR0YWxsLAorICAgICAgICAgKiAiU29tZSBXaW5kb3dzIHdpdGggVmVyeSBHb29kIFNpZGVsb2JlIEJlaGF2aW9yIgorICAgICAgICAgKiAtOTMuMzIgZEIgcGVhayBzaWRlbG9iZSBhbmQgMTggZEIvb2N0YXZlIGFzeW1wdG90aWMgZGVjYXkKKyAgICAgICAgICogY29lZmZpY2llbnQgbm9ybWFsaXplZCB0byBhMCA9IDEgKi8KKyAgICAgICAgZG91YmxlIGEwID0gMC4zNTU3Njg7CisgICAgICAgIGRvdWJsZSBhMSA9IDAuNDg3Mzk2L2EwOworICAgICAgICBkb3VibGUgYTIgPSAwLjE0NDIzMi9hMDsKKyAgICAgICAgZG91YmxlIGEzID0gMC4wMTI2MDQvYTA7CisgICAgICAgIGRvdWJsZSBzdl9zdGVwLCBjdl9zdGVwLCBzdiwgY3Y7CisgICAgICAgIGRvdWJsZSBzd19zdGVwLCBjd19zdGVwLCBzdywgY3csIHc7CisKKyAgICAgICAgdGxlbmd0aCA9IGF2X2V4cHJfZXZhbCh0bGVuZ3RoX2V4cHIsIGV4cHJfdmFyc192YWwsIE5VTEwpOworICAgICAgICBpZiAoaXNuYW4odGxlbmd0aCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiYXQgZnJlcSAlZzogdGxlbmd0aCBpcyBuYW4sIHNldHRpbmcgaXQgdG8gJWdcbiIsIGZyZXEsIHMtPnRpbWVjbGFtcCk7CisgICAgICAgICAgICB0bGVuZ3RoID0gcy0+dGltZWNsYW1wOworICAgICAgICB9IGVsc2UgaWYgKHRsZW5ndGggPCBUTEVOR1RIX01JTikgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJhdCBmcmVxICVnOiB0bGVuZ3RoIGlzICVnLCBzZXR0aW5nIGl0IHRvICVnXG4iLCBmcmVxLCB0bGVuZ3RoLCBUTEVOR1RIX01JTik7CisgICAgICAgICAgICB0bGVuZ3RoID0gVExFTkdUSF9NSU47CisgICAgICAgIH0gZWxzZSBpZiAodGxlbmd0aCA+IHMtPnRpbWVjbGFtcCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJhdCBmcmVxICVnOiB0bGVuZ3RoIGlzICVnLCBzZXR0aW5nIGl0IHRvICVnXG4iLCBmcmVxLCB0bGVuZ3RoLCBzLT50aW1lY2xhbXApOworICAgICAgICAgICAgdGxlbmd0aCA9IHMtPnRpbWVjbGFtcDsKKyAgICAgICAgfQorCisgICAgICAgIHZvbHVtZSA9IEZGQUJTKGF2X2V4cHJfZXZhbCh2b2x1bWVfZXhwciwgZXhwcl92YXJzX3ZhbCwgTlVMTCkpOworICAgICAgICBpZiAoaXNuYW4odm9sdW1lKSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJhdCBmcmVxICVnOiB2b2x1bWUgaXMgbmFuLCBzZXR0aW5nIGl0IHRvIDBcbiIsIGZyZXEpOworICAgICAgICAgICAgdm9sdW1lID0gVk9MVU1FX01JTjsKKyAgICAgICAgfSBlbHNlIGlmICh2b2x1bWUgPCBWT0xVTUVfTUlOKSB7CisgICAgICAgICAgICB2b2x1bWUgPSBWT0xVTUVfTUlOOworICAgICAgICB9IGVsc2UgaWYgKHZvbHVtZSA+IFZPTFVNRV9NQVgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiYXQgZnJlcSAlZzogdm9sdW1lIGlzICVnLCBzZXR0aW5nIGl0IHRvICVnXG4iLCBmcmVxLCB2b2x1bWUsIFZPTFVNRV9NQVgpOworICAgICAgICAgICAgdm9sdW1lID0gVk9MVU1FX01BWDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5mdWxsaGQgfHwgIShrICYgMSkpIHsKKyAgICAgICAgICAgIGludCBmb250Y29sb3IgPSBhdl9leHByX2V2YWwoZm9udGNvbG9yX2V4cHIsIGV4cHJfdmFyc192YWwsIE5VTEwpOworICAgICAgICAgICAgZm9udGNvbG9yX3ZhbHVlWzBdID0gKGZvbnRjb2xvciA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgZm9udGNvbG9yX3ZhbHVlWzFdID0gKGZvbnRjb2xvciA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBmb250Y29sb3JfdmFsdWVbMl0gPSBmb250Y29sb3IgJiAweEZGOworICAgICAgICAgICAgZm9udGNvbG9yX3ZhbHVlICs9IDM7CisgICAgICAgIH0KKworICAgICAgICB0bGVuID0gdGxlbmd0aCAqIHJhdGU7CisgICAgICAgIHMtPmZmdF9kYXRhWzBdLnJlID0gMDsKKyAgICAgICAgcy0+ZmZ0X2RhdGFbMF0uaW0gPSAwOworICAgICAgICBzLT5mZnRfZGF0YVtobGVuXS5yZSA9ICgxLjAgKyBhMSArIGEyICsgYTMpICogKDEuMC90bGVuKSAqIHZvbHVtZSAqICgxLjAvZmZ0X2xlbik7CisgICAgICAgIHMtPmZmdF9kYXRhW2hsZW5dLmltID0gMDsKKyAgICAgICAgc3Zfc3RlcCA9IHN2ID0gc2luKDIuMCpNX1BJKmZyZXEqKDEuMC9yYXRlKSk7CisgICAgICAgIGN2X3N0ZXAgPSBjdiA9IGNvcygyLjAqTV9QSSpmcmVxKigxLjAvcmF0ZSkpOworICAgICAgICAvKiBhbHNvIG9wdGltaXppbmcgd2luZG93IGZ1bmMgKi8KKyAgICAgICAgc3dfc3RlcCA9IHN3ID0gc2luKDIuMCpNX1BJKigxLjAvdGxlbikpOworICAgICAgICBjd19zdGVwID0gY3cgPSBjb3MoMi4wKk1fUEkqKDEuMC90bGVuKSk7CisgICAgICAgIGZvciAoeCA9IDE7IHggPCAwLjUgKiB0bGVuOyB4KyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBjdl90bXAsIGN3X3RtcDsKKyAgICAgICAgICAgIGRvdWJsZSBjdzIsIGN3Mywgc3cyOworCisgICAgICAgICAgICBjdzIgPSBjdyAqIGN3IC0gc3cgKiBzdzsKKyAgICAgICAgICAgIHN3MiA9IGN3ICogc3cgKyBzdyAqIGN3OworICAgICAgICAgICAgY3czID0gY3cgKiBjdzIgLSBzdyAqIHN3MjsKKyAgICAgICAgICAgIHcgPSAoMS4wICsgYTEgKiBjdyArIGEyICogY3cyICsgYTMgKiBjdzMpICogKDEuMC90bGVuKSAqIHZvbHVtZSAqICgxLjAvZmZ0X2xlbik7CisgICAgICAgICAgICBzLT5mZnRfZGF0YVtobGVuICsgeF0ucmUgPSB3ICogY3Y7CisgICAgICAgICAgICBzLT5mZnRfZGF0YVtobGVuICsgeF0uaW0gPSB3ICogc3Y7CisgICAgICAgICAgICBzLT5mZnRfZGF0YVtobGVuIC0geF0ucmUgPSBzLT5mZnRfZGF0YVtobGVuICsgeF0ucmU7CisgICAgICAgICAgICBzLT5mZnRfZGF0YVtobGVuIC0geF0uaW0gPSAtcy0+ZmZ0X2RhdGFbaGxlbiArIHhdLmltOworCisgICAgICAgICAgICBjdl90bXAgPSBjdiAqIGN2X3N0ZXAgLSBzdiAqIHN2X3N0ZXA7CisgICAgICAgICAgICBzdiA9IHN2ICogY3Zfc3RlcCArIGN2ICogc3Zfc3RlcDsKKyAgICAgICAgICAgIGN2ID0gY3ZfdG1wOworICAgICAgICAgICAgY3dfdG1wID0gY3cgKiBjd19zdGVwIC0gc3cgKiBzd19zdGVwOworICAgICAgICAgICAgc3cgPSBzdyAqIGN3X3N0ZXAgKyBjdyAqIHN3X3N0ZXA7CisgICAgICAgICAgICBjdyA9IGN3X3RtcDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgeCA8IGhsZW47IHgrKykgeworICAgICAgICAgICAgcy0+ZmZ0X2RhdGFbaGxlbiArIHhdLnJlID0gMDsKKyAgICAgICAgICAgIHMtPmZmdF9kYXRhW2hsZW4gKyB4XS5pbSA9IDA7CisgICAgICAgICAgICBzLT5mZnRfZGF0YVtobGVuIC0geF0ucmUgPSAwOworICAgICAgICAgICAgcy0+ZmZ0X2RhdGFbaGxlbiAtIHhdLmltID0gMDsKKyAgICAgICAgfQorICAgICAgICBhdl9mZnRfcGVybXV0ZShzLT5mZnRfY29udGV4dCwgcy0+ZmZ0X2RhdGEpOworICAgICAgICBhdl9mZnRfY2FsYyhzLT5mZnRfY29udGV4dCwgcy0+ZmZ0X2RhdGEpOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBmZnRfbGVuOyB4KyspIHsKKyAgICAgICAgICAgIHMtPmNvZWZmX3NvcnRbeF0uaW5kZXggPSB4OworICAgICAgICAgICAgcy0+Y29lZmZfc29ydFt4XS52YWx1ZSA9IHMtPmZmdF9kYXRhW3hdLnJlOworICAgICAgICB9CisKKyAgICAgICAgQVZfUVNPUlQocy0+Y29lZmZfc29ydCwgZmZ0X2xlbiwgU3BhcnNlQ29lZmYsIHFzb3J0X3NwYXJzZWNvZWZmKTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGZmdF9sZW47IHgrKykKKyAgICAgICAgICAgIHRvdGFsICs9IGZhYnNmKHMtPmNvZWZmX3NvcnRbeF0udmFsdWUpOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBmZnRfbGVuOyB4KyspIHsKKyAgICAgICAgICAgIHBhcnRpYWwgKz0gZmFic2Yocy0+Y29lZmZfc29ydFt4XS52YWx1ZSk7CisgICAgICAgICAgICBpZiAocGFydGlhbCA+IHRvdGFsICogcy0+Y29lZmZjbGFtcCAqIENPRUZGX0NMQU1QKSB7CisgICAgICAgICAgICAgICAgcy0+Y29lZmZzX2xlbltrXSA9IGZmdF9sZW4gLSB4OworICAgICAgICAgICAgICAgIG51bV9jb2VmZnMgKz0gcy0+Y29lZmZzX2xlbltrXTsKKyAgICAgICAgICAgICAgICBzLT5jb2VmZnNba10gPSBhdl9tYWxsb2NfYXJyYXkocy0+Y29lZmZzX2xlbltrXSwgc2l6ZW9mKCpzLT5jb2VmZnNba10pKTsKKyAgICAgICAgICAgICAgICBpZiAoIXMtPmNvZWZmc1trXSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXZhbF9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmNvZWZmc19sZW5ba107IHkrKykKKyAgICAgICAgICAgICAgICAgICAgcy0+Y29lZmZzW2tdW3ldID0gcy0+Y29lZmZfc29ydFt4K3ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGF2X2V4cHJfZnJlZShmb250Y29sb3JfZXhwcik7CisgICAgYXZfZXhwcl9mcmVlKHZvbHVtZV9leHByKTsKKyAgICBhdl9leHByX2ZyZWUodGxlbmd0aF9leHByKTsKKyAgICBlbmRfdGltZSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkVsYXBzZWQgdGltZSAlLjZmIHMgKGZmdF9sZW49JXUsIG51bV9jb2VmZnM9JXUpXG4iLCAxZS02ICogKGVuZF90aW1lLXN0YXJ0X3RpbWUpLCBmZnRfbGVuLCBudW1fY29lZmZzKTsKKworICAgIG91dGxpbmstPncgPSB2aWRlb193aWR0aDsKKyAgICBvdXRsaW5rLT5oID0gdmlkZW9faGVpZ2h0OworCisgICAgcy0+cmVxX2Z1bGxmaWxsZWQgPSAwOworICAgIHMtPnNwZWN0b2dyYW1faW5kZXggPSAwOworICAgIHMtPmZyYW1lX2NvdW50ID0gMDsKKyAgICBzLT5zcGVjdG9ncmFtX2NvdW50ID0gMDsKKyAgICBzLT5yZW1haW5pbmdfZmlsbCA9IGZmdF9sZW4gPj4gMTsKKyAgICBtZW1zZXQocy0+ZmZ0X2RhdGEsIDAsIGZmdF9sZW4gKiBzaXplb2YoKnMtPmZmdF9kYXRhKSk7CisKKyAgICBzLT5vdXRwaWNyZWYgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghcy0+b3V0cGljcmVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+c3BlY3RvZ3JhbSA9IGF2X2NhbGxvYyhzcGVjdG9ncmFtX2hlaWdodCwgcy0+b3V0cGljcmVmLT5saW5lc2l6ZVswXSk7CisgICAgaWYgKCFzLT5zcGVjdG9ncmFtKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGF2X21ha2VfcSgxLCAxKTsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSBhdl9tYWtlX3EoMSwgcy0+ZnBzKTsKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gYXZfbWFrZV9xKHMtPmZwcywgMSk7CisgICAgcmV0dXJuIDA7CisKK2V2YWxfZXJyb3I6CisgICAgYXZfZXhwcl9mcmVlKGZvbnRjb2xvcl9leHByKTsKKyAgICBhdl9leHByX2ZyZWUodm9sdW1lX2V4cHIpOworICAgIGF2X2V4cHJfZnJlZSh0bGVuZ3RoX2V4cHIpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGxvdF9jcXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBTaG93Q1FUQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgaW50IGZmdF9sZW4gPSAxIDw8IHMtPmZmdF9iaXRzOworICAgIEZGVFNhbXBsZSByZXN1bHRbVklERU9fV0lEVEhdWzRdOworICAgIGludCB4LCB5LCByZXQgPSAwOworICAgIGludCBsaW5lc2l6ZSA9IHMtPm91dHBpY3JlZi0+bGluZXNpemVbMF07CisgICAgaW50IHZpZGVvX3NjYWxlID0gcy0+ZnVsbGhkID8gMiA6IDE7CisgICAgaW50IHZpZGVvX3dpZHRoID0gKFZJREVPX1dJRFRILzIpICogdmlkZW9fc2NhbGU7CisgICAgaW50IHNwZWN0b2dyYW1faGVpZ2h0ID0gKFNQRUNUT0dSQU1fSEVJR0hULzIpICogdmlkZW9fc2NhbGU7CisgICAgaW50IHNwZWN0b2dyYW1fc3RhcnQgPSAoU1BFQ1RPR1JBTV9TVEFSVC8yKSAqIHZpZGVvX3NjYWxlOworICAgIGludCBmb250X2hlaWdodCA9IChGT05UX0hFSUdIVC8yKSAqIHZpZGVvX3NjYWxlOworCisgICAgLyogcmVhbCBwYXJ0IGNvbnRhaW5zIGxlZnQgc2FtcGxlcywgaW1hZ2luYXJ5IHBhcnQgY29udGFpbnMgcmlnaHQgc2FtcGxlcyAqLworICAgIG1lbWNweShzLT5mZnRfcmVzdWx0X2xlZnQsIHMtPmZmdF9kYXRhLCBmZnRfbGVuICogc2l6ZW9mKCpzLT5mZnRfZGF0YSkpOworICAgIGF2X2ZmdF9wZXJtdXRlKHMtPmZmdF9jb250ZXh0LCBzLT5mZnRfcmVzdWx0X2xlZnQpOworICAgIGF2X2ZmdF9jYWxjKHMtPmZmdF9jb250ZXh0LCBzLT5mZnRfcmVzdWx0X2xlZnQpOworCisgICAgLyogc2VwYXJhdGUgbGVmdCBhbmQgcmlnaHQsIChhbmQgbXVsdGlwbHkgYnkgMi4wKSAqLworICAgIHMtPmZmdF9yZXN1bHRfcmlnaHRbMF0ucmUgPSAyLjBmICogcy0+ZmZ0X3Jlc3VsdF9sZWZ0WzBdLmltOworICAgIHMtPmZmdF9yZXN1bHRfcmlnaHRbMF0uaW0gPSAwOworICAgIHMtPmZmdF9yZXN1bHRfbGVmdFswXS5yZSA9IDIuMGYgKiBzLT5mZnRfcmVzdWx0X2xlZnRbMF0ucmU7CisgICAgcy0+ZmZ0X3Jlc3VsdF9sZWZ0WzBdLmltID0gMDsKKyAgICBmb3IgKHggPSAxOyB4IDw9IGZmdF9sZW4gPj4gMTsgeCsrKSB7CisgICAgICAgIEZGVFNhbXBsZSB0bXB5ID0gcy0+ZmZ0X3Jlc3VsdF9sZWZ0W2ZmdF9sZW4teF0uaW0gLSBzLT5mZnRfcmVzdWx0X2xlZnRbeF0uaW07CisKKyAgICAgICAgcy0+ZmZ0X3Jlc3VsdF9yaWdodFt4XS5yZSA9IHMtPmZmdF9yZXN1bHRfbGVmdFt4XS5pbSArIHMtPmZmdF9yZXN1bHRfbGVmdFtmZnRfbGVuLXhdLmltOworICAgICAgICBzLT5mZnRfcmVzdWx0X3JpZ2h0W3hdLmltID0gcy0+ZmZ0X3Jlc3VsdF9sZWZ0W3hdLnJlIC0gcy0+ZmZ0X3Jlc3VsdF9sZWZ0W2ZmdF9sZW4teF0ucmU7CisgICAgICAgIHMtPmZmdF9yZXN1bHRfcmlnaHRbZmZ0X2xlbi14XS5yZSA9IHMtPmZmdF9yZXN1bHRfcmlnaHRbeF0ucmU7CisgICAgICAgIHMtPmZmdF9yZXN1bHRfcmlnaHRbZmZ0X2xlbi14XS5pbSA9IC1zLT5mZnRfcmVzdWx0X3JpZ2h0W3hdLmltOworCisgICAgICAgIHMtPmZmdF9yZXN1bHRfbGVmdFt4XS5yZSA9IHMtPmZmdF9yZXN1bHRfbGVmdFt4XS5yZSArIHMtPmZmdF9yZXN1bHRfbGVmdFtmZnRfbGVuLXhdLnJlOworICAgICAgICBzLT5mZnRfcmVzdWx0X2xlZnRbeF0uaW0gPSB0bXB5OworICAgICAgICBzLT5mZnRfcmVzdWx0X2xlZnRbZmZ0X2xlbi14XS5yZSA9IHMtPmZmdF9yZXN1bHRfbGVmdFt4XS5yZTsKKyAgICAgICAgcy0+ZmZ0X3Jlc3VsdF9sZWZ0W2ZmdF9sZW4teF0uaW0gPSAtcy0+ZmZ0X3Jlc3VsdF9sZWZ0W3hdLmltOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0aW5nIGNxdCAqLworICAgIGZvciAoeCA9IDA7IHggPCBWSURFT19XSURUSDsgeCsrKSB7CisgICAgICAgIGludCB1OworICAgICAgICBmbG9hdCBnID0gMS4wZiAvIHMtPmdhbW1hOworICAgICAgICBGRlRDb21wbGV4IGwgPSB7MCwwfTsKKyAgICAgICAgRkZUQ29tcGxleCByID0gezAsMH07CisKKyAgICAgICAgZm9yICh1ID0gMDsgdSA8IHMtPmNvZWZmc19sZW5beF07IHUrKykgeworICAgICAgICAgICAgRkZUU2FtcGxlIHZhbHVlID0gcy0+Y29lZmZzW3hdW3VdLnZhbHVlOworICAgICAgICAgICAgaW50IGluZGV4ID0gcy0+Y29lZmZzW3hdW3VdLmluZGV4OworICAgICAgICAgICAgbC5yZSArPSB2YWx1ZSAqIHMtPmZmdF9yZXN1bHRfbGVmdFtpbmRleF0ucmU7CisgICAgICAgICAgICBsLmltICs9IHZhbHVlICogcy0+ZmZ0X3Jlc3VsdF9sZWZ0W2luZGV4XS5pbTsKKyAgICAgICAgICAgIHIucmUgKz0gdmFsdWUgKiBzLT5mZnRfcmVzdWx0X3JpZ2h0W2luZGV4XS5yZTsKKyAgICAgICAgICAgIHIuaW0gKz0gdmFsdWUgKiBzLT5mZnRfcmVzdWx0X3JpZ2h0W2luZGV4XS5pbTsKKyAgICAgICAgfQorICAgICAgICAvKiByZXN1bHQgaXMgcG93ZXIsIG5vdCBhbXBsaXR1ZGUgKi8KKyAgICAgICAgcmVzdWx0W3hdWzBdID0gbC5yZSAqIGwucmUgKyBsLmltICogbC5pbTsKKyAgICAgICAgcmVzdWx0W3hdWzJdID0gci5yZSAqIHIucmUgKyByLmltICogci5pbTsKKyAgICAgICAgcmVzdWx0W3hdWzFdID0gMC41ZiAqIChyZXN1bHRbeF1bMF0gKyByZXN1bHRbeF1bMl0pOworICAgICAgICByZXN1bHRbeF1bM10gPSByZXN1bHRbeF1bMV07CisgICAgICAgIHJlc3VsdFt4XVswXSA9IDI1NS4wZiAqIHBvd2YoRkZNSU4oMS4wZixyZXN1bHRbeF1bMF0pLCBnKTsKKyAgICAgICAgcmVzdWx0W3hdWzFdID0gMjU1LjBmICogcG93ZihGRk1JTigxLjBmLHJlc3VsdFt4XVsxXSksIGcpOworICAgICAgICByZXN1bHRbeF1bMl0gPSAyNTUuMGYgKiBwb3dmKEZGTUlOKDEuMGYscmVzdWx0W3hdWzJdKSwgZyk7CisgICAgfQorCisgICAgaWYgKCFzLT5mdWxsaGQpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHZpZGVvX3dpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIHJlc3VsdFt4XVswXSA9IDAuNWYgKiAocmVzdWx0WzIqeF1bMF0gKyByZXN1bHRbMip4KzFdWzBdKTsKKyAgICAgICAgICAgIHJlc3VsdFt4XVsxXSA9IDAuNWYgKiAocmVzdWx0WzIqeF1bMV0gKyByZXN1bHRbMip4KzFdWzFdKTsKKyAgICAgICAgICAgIHJlc3VsdFt4XVsyXSA9IDAuNWYgKiAocmVzdWx0WzIqeF1bMl0gKyByZXN1bHRbMip4KzFdWzJdKTsKKyAgICAgICAgICAgIHJlc3VsdFt4XVszXSA9IDAuNWYgKiAocmVzdWx0WzIqeF1bM10gKyByZXN1bHRbMip4KzFdWzNdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoeCA9IDA7IHggPCB2aWRlb193aWR0aDsgeCsrKSB7CisgICAgICAgIHMtPnNwZWN0b2dyYW1bcy0+c3BlY3RvZ3JhbV9pbmRleCpsaW5lc2l6ZSArIDMqeF0gPSByZXN1bHRbeF1bMF0gKyAwLjVmOworICAgICAgICBzLT5zcGVjdG9ncmFtW3MtPnNwZWN0b2dyYW1faW5kZXgqbGluZXNpemUgKyAzKnggKyAxXSA9IHJlc3VsdFt4XVsxXSArIDAuNWY7CisgICAgICAgIHMtPnNwZWN0b2dyYW1bcy0+c3BlY3RvZ3JhbV9pbmRleCpsaW5lc2l6ZSArIDMqeCArIDJdID0gcmVzdWx0W3hdWzJdICsgMC41ZjsKKyAgICB9CisKKyAgICAvKiBkcmF3aW5nICovCisgICAgaWYgKCFzLT5zcGVjdG9ncmFtX2NvdW50KSB7CisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCopIHMtPm91dHBpY3JlZi0+ZGF0YVswXTsKKyAgICAgICAgZmxvYXQgcmNwX3Jlc3VsdFtWSURFT19XSURUSF07CisgICAgICAgIGludCB0b3RhbF9sZW5ndGggPSBsaW5lc2l6ZSAqIHNwZWN0b2dyYW1faGVpZ2h0OworICAgICAgICBpbnQgYmFja19sZW5ndGggPSBsaW5lc2l6ZSAqIHMtPnNwZWN0b2dyYW1faW5kZXg7CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHZpZGVvX3dpZHRoOyB4KyspCisgICAgICAgICAgICByY3BfcmVzdWx0W3hdID0gMS4wZiAvIChyZXN1bHRbeF1bM10rMC4wMDAxZik7CisKKyAgICAgICAgLyogZHJhd2luZyBiYXIgKi8KKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNwZWN0b2dyYW1faGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGZsb2F0IGhlaWdodCA9IChzcGVjdG9ncmFtX2hlaWdodCAtIHkpICogKDEuMGYvc3BlY3RvZ3JhbV9oZWlnaHQpOworICAgICAgICAgICAgdWludDhfdCAqbGluZXB0ciA9IGRhdGEgKyB5ICogbGluZXNpemU7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdmlkZW9fd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGZsb2F0IG11bDsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0W3hdWzNdIDw9IGhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICAqbGluZXB0cisrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKmxpbmVwdHIrKyA9IDA7CisgICAgICAgICAgICAgICAgICAgICpsaW5lcHRyKysgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG11bCA9IChyZXN1bHRbeF1bM10gLSBoZWlnaHQpICogcmNwX3Jlc3VsdFt4XTsKKyAgICAgICAgICAgICAgICAgICAgKmxpbmVwdHIrKyA9IG11bCAqIHJlc3VsdFt4XVswXSArIDAuNWY7CisgICAgICAgICAgICAgICAgICAgICpsaW5lcHRyKysgPSBtdWwgKiByZXN1bHRbeF1bMV0gKyAwLjVmOworICAgICAgICAgICAgICAgICAgICAqbGluZXB0cisrID0gbXVsICogcmVzdWx0W3hdWzJdICsgMC41ZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBkcmF3aW5nIGZvbnQgKi8KKyAgICAgICAgaWYgKHMtPmZvbnRfYWxwaGEpIHsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBmb250X2hlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqbGluZXB0ciA9IGRhdGEgKyAoc3BlY3RvZ3JhbV9oZWlnaHQgKyB5KSAqIGxpbmVzaXplOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNwZWN0b2dyYW1fc3JjID0gcy0+c3BlY3RvZ3JhbSArIHMtPnNwZWN0b2dyYW1faW5kZXggKiBsaW5lc2l6ZTsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpmb250Y29sb3JfdmFsdWUgPSBzLT5mb250Y29sb3JfdmFsdWU7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHZpZGVvX3dpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhbHBoYSA9IHMtPmZvbnRfYWxwaGFbeSp2aWRlb193aWR0aCt4XTsKKyAgICAgICAgICAgICAgICAgICAgbGluZXB0clszKnhdID0gKHNwZWN0b2dyYW1fc3JjWzMqeF0gKiAoMjU1LWFscGhhKSArIGZvbnRjb2xvcl92YWx1ZVswXSAqIGFscGhhICsgMjU1KSA+PiA4OworICAgICAgICAgICAgICAgICAgICBsaW5lcHRyWzMqeCsxXSA9IChzcGVjdG9ncmFtX3NyY1szKngrMV0gKiAoMjU1LWFscGhhKSArIGZvbnRjb2xvcl92YWx1ZVsxXSAqIGFscGhhICsgMjU1KSA+PiA4OworICAgICAgICAgICAgICAgICAgICBsaW5lcHRyWzMqeCsyXSA9IChzcGVjdG9ncmFtX3NyY1szKngrMl0gKiAoMjU1LWFscGhhKSArIGZvbnRjb2xvcl92YWx1ZVsyXSAqIGFscGhhICsgMjU1KSA+PiA4OworICAgICAgICAgICAgICAgICAgICBmb250Y29sb3JfdmFsdWUgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZm9udF9oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmxpbmVwdHIgPSBkYXRhICsgKHNwZWN0b2dyYW1faGVpZ2h0ICsgeSkgKiBsaW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkobGluZXB0ciwgcy0+c3BlY3RvZ3JhbSArIHMtPnNwZWN0b2dyYW1faW5kZXggKiBsaW5lc2l6ZSwgdmlkZW9fd2lkdGgqMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdmlkZW9fd2lkdGg7IHggKz0gdmlkZW9fd2lkdGgvMTApIHsKKyAgICAgICAgICAgICAgICBpbnQgdTsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzdHJbXSA9ICJFRiBHIEEgQkMgRCAiOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnN0YXJ0cHRyID0gZGF0YSArIHNwZWN0b2dyYW1faGVpZ2h0ICogbGluZXNpemUgKyB4ICogMzsKKyAgICAgICAgICAgICAgICBmb3IgKHUgPSAwOyBzdHJbdV07IHUrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgdjsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh2ID0gMDsgdiA8IDE2OyB2KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnAgPSBzdGFydHB0ciArIHYgKiBsaW5lc2l6ZSAqIHZpZGVvX3NjYWxlICsgOCAqIDMgKiB1ICogdmlkZW9fc2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXggPSB4ICsgOCAqIHUgKiB2aWRlb19zY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChtYXNrID0gMHg4MDsgbWFzazsgbWFzayA+Pj0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrICYgYXZwcml2X3ZnYTE2X2ZvbnRbc3RyW3VdICogMTYgKyB2XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWzBdID0gcy0+Zm9udGNvbG9yX3ZhbHVlWzMqdXhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWzFdID0gcy0+Zm9udGNvbG9yX3ZhbHVlWzMqdXgrMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbMl0gPSBzLT5mb250Y29sb3JfdmFsdWVbMyp1eCsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvX3NjYWxlID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbbGluZXNpemVdID0gcFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbbGluZXNpemUrMV0gPSBwWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFtsaW5lc2l6ZSsyXSA9IHBbMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWzNdID0gcFtsaW5lc2l6ZSszXSA9IHMtPmZvbnRjb2xvcl92YWx1ZVszKnV4KzNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFs0XSA9IHBbbGluZXNpemUrNF0gPSBzLT5mb250Y29sb3JfdmFsdWVbMyp1eCs0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbNV0gPSBwW2xpbmVzaXplKzVdID0gcy0+Zm9udGNvbG9yX3ZhbHVlWzMqdXgrNV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAgKz0gMyAqIHZpZGVvX3NjYWxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV4ICs9IHZpZGVvX3NjYWxlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogZHJhd2luZyBzcGVjdG9ncmFtL3Nvbm9ncmFtICovCisgICAgICAgIGRhdGEgKz0gc3BlY3RvZ3JhbV9zdGFydCAqIGxpbmVzaXplOworICAgICAgICBtZW1jcHkoZGF0YSwgcy0+c3BlY3RvZ3JhbSArIHMtPnNwZWN0b2dyYW1faW5kZXgqbGluZXNpemUsIHRvdGFsX2xlbmd0aCAtIGJhY2tfbGVuZ3RoKTsKKworICAgICAgICBkYXRhICs9IHRvdGFsX2xlbmd0aCAtIGJhY2tfbGVuZ3RoOworICAgICAgICBpZiAoYmFja19sZW5ndGgpCisgICAgICAgICAgICBtZW1jcHkoZGF0YSwgcy0+c3BlY3RvZ3JhbSwgYmFja19sZW5ndGgpOworCisgICAgICAgIHMtPm91dHBpY3JlZi0+cHRzID0gcy0+ZnJhbWVfY291bnQ7CisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBhdl9mcmFtZV9jbG9uZShzLT5vdXRwaWNyZWYpKTsKKyAgICAgICAgcy0+cmVxX2Z1bGxmaWxsZWQgPSAxOworICAgICAgICBzLT5mcmFtZV9jb3VudCsrOworICAgIH0KKyAgICBzLT5zcGVjdG9ncmFtX2NvdW50ID0gKHMtPnNwZWN0b2dyYW1fY291bnQgKyAxKSAlIHMtPmNvdW50OworICAgIHMtPnNwZWN0b2dyYW1faW5kZXggPSAocy0+c3BlY3RvZ3JhbV9pbmRleCArIHNwZWN0b2dyYW1faGVpZ2h0IC0gMSkgJSBzcGVjdG9ncmFtX2hlaWdodDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5zYW1wbGVzKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgU2hvd0NRVENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHN0ZXAgPSBpbmxpbmstPnNhbXBsZV9yYXRlIC8gKHMtPmZwcyAqIHMtPmNvdW50KTsKKyAgICBpbnQgZmZ0X2xlbiA9IDEgPDwgcy0+ZmZ0X2JpdHM7CisgICAgaW50IHJlbWFpbmluZzsKKyAgICBmbG9hdCAqYXVkaW9fZGF0YTsKKworICAgIGlmICghaW5zYW1wbGVzKSB7CisgICAgICAgIHdoaWxlIChzLT5yZW1haW5pbmdfZmlsbCA8IChmZnRfbGVuID4+IDEpKSB7CisgICAgICAgICAgICBpbnQgcmV0LCB4OworICAgICAgICAgICAgbWVtc2V0KCZzLT5mZnRfZGF0YVtmZnRfbGVuIC0gcy0+cmVtYWluaW5nX2ZpbGxdLCAwLCBzaXplb2YoKnMtPmZmdF9kYXRhKSAqIHMtPnJlbWFpbmluZ19maWxsKTsKKyAgICAgICAgICAgIHJldCA9IHBsb3RfY3F0KGlubGluayk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IChmZnRfbGVuLXN0ZXApOyB4KyspCisgICAgICAgICAgICAgICAgcy0+ZmZ0X2RhdGFbeF0gPSBzLT5mZnRfZGF0YVt4K3N0ZXBdOworICAgICAgICAgICAgcy0+cmVtYWluaW5nX2ZpbGwgKz0gc3RlcDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVZFUlJPUihFT0YpOworICAgIH0KKworICAgIHJlbWFpbmluZyA9IGluc2FtcGxlcy0+bmJfc2FtcGxlczsKKyAgICBhdWRpb19kYXRhID0gKGZsb2F0KikgaW5zYW1wbGVzLT5kYXRhWzBdOworCisgICAgd2hpbGUgKHJlbWFpbmluZykgeworICAgICAgICBpZiAocmVtYWluaW5nID49IHMtPnJlbWFpbmluZ19maWxsKSB7CisgICAgICAgICAgICBpbnQgaSA9IGluc2FtcGxlcy0+bmJfc2FtcGxlcyAtIHJlbWFpbmluZzsKKyAgICAgICAgICAgIGludCBqID0gZmZ0X2xlbiAtIHMtPnJlbWFpbmluZ19maWxsOworICAgICAgICAgICAgaW50IG0sIHJldDsKKyAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCBzLT5yZW1haW5pbmdfZmlsbDsgbSsrKSB7CisgICAgICAgICAgICAgICAgcy0+ZmZ0X2RhdGFbaittXS5yZSA9IGF1ZGlvX2RhdGFbMiooaSttKV07CisgICAgICAgICAgICAgICAgcy0+ZmZ0X2RhdGFbaittXS5pbSA9IGF1ZGlvX2RhdGFbMiooaSttKSsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IHBsb3RfY3F0KGlubGluayk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBzLT5yZW1haW5pbmdfZmlsbDsKKyAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCBmZnRfbGVuLXN0ZXA7IG0rKykKKyAgICAgICAgICAgICAgICBzLT5mZnRfZGF0YVttXSA9IHMtPmZmdF9kYXRhW20rc3RlcF07CisgICAgICAgICAgICBzLT5yZW1haW5pbmdfZmlsbCA9IHN0ZXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaSA9IGluc2FtcGxlcy0+bmJfc2FtcGxlcyAtIHJlbWFpbmluZzsKKyAgICAgICAgICAgIGludCBqID0gZmZ0X2xlbiAtIHMtPnJlbWFpbmluZ19maWxsOworICAgICAgICAgICAgaW50IG07CisgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgcmVtYWluaW5nOyBtKyspIHsKKyAgICAgICAgICAgICAgICBzLT5mZnRfZGF0YVttK2pdLnJlID0gYXVkaW9fZGF0YVsyKihpK20pXTsKKyAgICAgICAgICAgICAgICBzLT5mZnRfZGF0YVttK2pdLmltID0gYXVkaW9fZGF0YVsyKihpK20pKzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+cmVtYWluaW5nX2ZpbGwgLT0gcmVtYWluaW5nOworICAgICAgICAgICAgcmVtYWluaW5nID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9mcmFtZV9mcmVlKCZpbnNhbXBsZXMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIFNob3dDUVRDb250ZXh0ICpzID0gb3V0bGluay0+c3JjLT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisgICAgaW50IHJldDsKKworICAgIHMtPnJlcV9mdWxsZmlsbGVkID0gMDsKKyAgICBkbyB7CisgICAgICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoaW5saW5rKTsKKyAgICB9IHdoaWxlICghcy0+cmVxX2Z1bGxmaWxsZWQgJiYgcmV0ID49IDApOworCisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBzLT5vdXRwaWNyZWYpCisgICAgICAgIGZpbHRlcl9mcmFtZShpbmxpbmssIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzaG93Y3F0X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc2hvd2NxdF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2F2Zl9zaG93Y3F0ID0geworICAgIC5uYW1lICAgICAgICAgID0gInNob3djcXQiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvbnZlcnQgaW5wdXQgYXVkaW8gdG8gYSBDUVQgKENvbnN0YW50IFEgVHJhbnNmb3JtKSBzcGVjdHJ1bSB2aWRlbyBvdXRwdXQuIiksCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFNob3dDUVRDb250ZXh0KSwKKyAgICAuaW5wdXRzICAgICAgICA9IHNob3djcXRfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gc2hvd2NxdF9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnNob3djcXRfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2F2Zl9zaG93c3BlY3RydW0uYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hdmZfc2hvd3NwZWN0cnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxMTZkYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hdmZfc2hvd3NwZWN0cnVtLmMKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMyBDbMOpbWVudCBCxZNzY2gKKyAqIENvcHlyaWdodCAoYykgMjAxMyBSdWRvbGYgUG9semVyIDxkaXZ2ZXJlbnRAeG9ub3RpYy5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGF1ZGlvIHRvIHNwZWN0cnVtICh2aWRlbykgdHJhbnNtZWRpYSBmaWx0ZXIsIGJhc2VkIG9uIGZmcGxheSByZGZ0IHNob3dtb2RlCisgKiAoYnkgTWljaGFlbCBOaWVkZXJtYXllcikgYW5kIGxhdmZpL2F2Zl9zaG93d2F2ZXMgKGJ5IFN0ZWZhbm8gU2FiYXRpbmkpLgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2ZmZ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZW51bSBEaXNwbGF5TW9kZSAgeyBDT01CSU5FRCwgU0VQQVJBVEUsIE5CX01PREVTIH07CitlbnVtIERpc3BsYXlTY2FsZSB7IExJTkVBUiwgU1FSVCwgQ0JSVCwgTE9HLCBOQl9TQ0FMRVMgfTsKK2VudW0gQ29sb3JNb2RlICAgIHsgQ0hBTk5FTCwgSU5URU5TSVRZLCBOQl9DTE1PREVTIH07CitlbnVtIFdpbmRvd0Z1bmMgICB7IFdGVU5DX05PTkUsIFdGVU5DX0hBTk4sIFdGVU5DX0hBTU1JTkcsIFdGVU5DX0JMQUNLTUFOLCBOQl9XRlVOQyB9OworZW51bSBTbGlkZU1vZGUgICAgeyBSRVBMQUNFLCBTQ1JPTEwsIEZVTExGUkFNRSwgTkJfU0xJREVTIH07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgdywgaDsKKyAgICBBVkZyYW1lICpvdXRwaWNyZWY7CisgICAgaW50IHJlcV9mdWxsZmlsbGVkOworICAgIGludCBuYl9kaXNwbGF5X2NoYW5uZWxzOworICAgIGludCBjaGFubmVsX2hlaWdodDsKKyAgICBpbnQgc2xpZGluZzsgICAgICAgICAgICAgICAgLy8vPCAxIGlmIHNsaWRpbmcgbW9kZSwgMCBvdGhlcndpc2UKKyAgICBlbnVtIERpc3BsYXlNb2RlIG1vZGU7ICAgICAgLy8vPCBjaGFubmVsIGRpc3BsYXkgbW9kZQorICAgIGVudW0gQ29sb3JNb2RlIGNvbG9yX21vZGU7ICAvLy88IGRpc3BsYXkgY29sb3Igc2NoZW1lCisgICAgZW51bSBEaXNwbGF5U2NhbGUgc2NhbGU7CisgICAgZmxvYXQgc2F0dXJhdGlvbjsgICAgICAgICAgIC8vLzwgY29sb3Igc2F0dXJhdGlvbiBtdWx0aXBsaWVyCisgICAgaW50IHhwb3M7ICAgICAgICAgICAgICAgICAgIC8vLzwgeCBwb3NpdGlvbiAoY3VycmVudCBjb2x1bW4pCisgICAgUkRGVENvbnRleHQgKnJkZnQ7ICAgICAgICAgIC8vLzwgUmVhbCBEaXNjcmV0ZSBGb3VyaWVyIFRyYW5zZm9ybSBjb250ZXh0CisgICAgaW50IHJkZnRfYml0czsgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJpdHMgKFJERlQgd2luZG93IHNpemUgPSAxPDxyZGZ0X2JpdHMpCisgICAgRkZUU2FtcGxlICoqcmRmdF9kYXRhOyAgICAgIC8vLzwgYmlucyBob2xkZXIgZm9yIGVhY2ggKGRpc3BsYXllZCkgY2hhbm5lbHMKKyAgICBmbG9hdCAqd2luZG93X2Z1bmNfbHV0OyAgICAgLy8vPCBXaW5kb3cgZnVuY3Rpb24gTFVUCisgICAgZW51bSBXaW5kb3dGdW5jIHdpbl9mdW5jOworICAgIGZsb2F0ICpjb21iaW5lX2J1ZmZlcjsgICAgICAvLy88IGNvbG9yIGNvbWJpbmluZyBidWZmZXIgKDMgKiBoIGl0ZW1zKQorfSBTaG93U3BlY3RydW1Db250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTaG93U3BlY3RydW1Db250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHNob3dzcGVjdHJ1bV9vcHRpb25zW10gPSB7CisgICAgeyAic2l6ZSIsICJzZXQgdmlkZW8gc2l6ZSIsIE9GRlNFVCh3KSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSAiNjQweDUxMiJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInMiLCAgICAic2V0IHZpZGVvIHNpemUiLCBPRkZTRVQodyksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyID0gIjY0MHg1MTIifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJzbGlkZSIsICJzZXQgc2xpZGluZyBtb2RlIiwgT0ZGU0VUKHNsaWRpbmcpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIE5CX1NMSURFUywgRkxBR1MsICJzbGlkZSIgfSwKKyAgICAgICAgeyAicmVwbGFjZSIsICJyZXBsYWNlIG9sZCBjb2x1bW5zIHdpdGggbmV3IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVJFUExBQ0V9LCAwLCAwLCBGTEFHUywgInNsaWRlIiB9LAorICAgICAgICB7ICJzY3JvbGwiLCAic2Nyb2xsIGZyb20gcmlnaHQgdG8gbGVmdCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TQ1JPTEx9LCAwLCAwLCBGTEFHUywgInNsaWRlIiB9LAorICAgICAgICB7ICJmdWxsZnJhbWUiLCAicmV0dXJuIGZ1bGwgZnJhbWVzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZVTExGUkFNRX0sIDAsIDAsIEZMQUdTLCAic2xpZGUiIH0sCisgICAgeyAibW9kZSIsICJzZXQgY2hhbm5lbCBkaXNwbGF5IG1vZGUiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Q09NQklORUR9LCBDT01CSU5FRCwgTkJfTU9ERVMtMSwgRkxBR1MsICJtb2RlIiB9LAorICAgICAgICB7ICJjb21iaW5lZCIsICJjb21iaW5lZCBtb2RlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNPTUJJTkVEfSwgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgICAgICB7ICJzZXBhcmF0ZSIsICJzZXBhcmF0ZSBtb2RlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNFUEFSQVRFfSwgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgImNvbG9yIiwgInNldCBjaGFubmVsIGNvbG9yaW5nIiwgT0ZGU0VUKGNvbG9yX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUNIQU5ORUx9LCBDSEFOTkVMLCBOQl9DTE1PREVTLTEsIEZMQUdTLCAiY29sb3IiIH0sCisgICAgICAgIHsgImNoYW5uZWwiLCAgICJzZXBhcmF0ZSBjb2xvciBmb3IgZWFjaCBjaGFubmVsIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNIQU5ORUx9LCAgIDAsIDAsIEZMQUdTLCAiY29sb3IiIH0sCisgICAgICAgIHsgImludGVuc2l0eSIsICJpbnRlbnNpdHkgYmFzZWQgY29sb3JpbmciLCAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUlOVEVOU0lUWX0sIDAsIDAsIEZMQUdTLCAiY29sb3IiIH0sCisgICAgeyAic2NhbGUiLCAic2V0IGRpc3BsYXkgc2NhbGUiLCBPRkZTRVQoc2NhbGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVNRUlR9LCBMSU5FQVIsIE5CX1NDQUxFUy0xLCBGTEFHUywgInNjYWxlIiB9LAorICAgICAgICB7ICJzcXJ0IiwgInNxdWFyZSByb290IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNRUlR9LCAgIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCisgICAgICAgIHsgImNicnQiLCAiY3ViaWMgcm9vdCIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q0JSVH0sICAgMCwgMCwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICAgICAgeyAibG9nIiwgICJsb2dhcml0aG1pYyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1MT0d9LCAgICAwLCAwLCBGTEFHUywgInNjYWxlIiB9LAorICAgICAgICB7ICJsaW4iLCAgImxpbmVhciIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUxJTkVBUn0sIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCisgICAgeyAic2F0dXJhdGlvbiIsICJjb2xvciBzYXR1cmF0aW9uIG11bHRpcGxpZXIiLCBPRkZTRVQoc2F0dXJhdGlvbiksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IDF9LCAtMTAsIDEwLCBGTEFHUyB9LAorICAgIHsgIndpbl9mdW5jIiwgInNldCB3aW5kb3cgZnVuY3Rpb24iLCBPRkZTRVQod2luX2Z1bmMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gV0ZVTkNfSEFOTn0sIDAsIE5CX1dGVU5DLTEsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgICAgIHsgImhhbm4iLCAgICAgIkhhbm4gd2luZG93IiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFdGVU5DX0hBTk59LCAgICAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICAgICAgeyAiaGFtbWluZyIsICAiSGFtbWluZyB3aW5kb3ciLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gV0ZVTkNfSEFNTUlOR30sICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJibGFja21hbiIsICJCbGFja21hbiB3aW5kb3ciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBXRlVOQ19CTEFDS01BTn0sIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzaG93c3BlY3RydW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBmbG9hdCBhLCB5LCB1LCB2OworfSBpbnRlbnNpdHlfY29sb3JfdGFibGVbXSA9IHsKKyAgICB7ICAgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAwIH0sCisgICAgeyAwLjEzLCAuMDM1ODcxMjYyMjg5ODQwNzQsICAuMTU3MzMwMDk3NzYyNDU5NCwgLS4wMjU0ODc0NzU4Mzc1MTg0MiB9LAorICAgIHsgMC4zMCwgLjE4NTcyMjgxNzk0NTY4MDIwLCAgLjE3NzI0MzYyNDYzOTM5ODEsICAuMTc0NzU1NTQ4NDA0MTQ3NTAgfSwKKyAgICB7IDAuNjAsIC4yODE4NDk4MDU4MzY1NjEzMCwgLS4xNTkzMDY0MTE5OTQ1NzgyLCAgLjQ3MTMyMDc0NTU0NjA4OTIwIH0sCisgICAgeyAwLjczLCAuNjU4MzA2MjExNzU1NDc4MTAsIC0uMzcxNjA3MDgwMjIzMjc2NCwgIC4yNDM1Mjc1OTMzMTI1MjkzMCB9LAorICAgIHsgMC43OCwgLjc2MzE4NTM1NzU4MjQyOTAwLCAtLjQzMDc0Njc2ODkyNjM3ODMsICAuMTY4NjY0OTY2MjIzMTA0MzAgfSwKKyAgICB7IDAuOTEsIC45NTMzNjM2MzYzNjM2MzY0MCwgLS4yMDQ1NDU0NTQ1NDU0NTQ2LCAgLjAzMzEzNjM2MzYzNjM2MzYzIH0sCisgICAgeyAgICAxLCAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgMCB9Cit9OworCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTaG93U3BlY3RydW1Db250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgYXZfZnJlZXAoJnMtPmNvbWJpbmVfYnVmZmVyKTsKKyAgICBhdl9yZGZ0X2VuZChzLT5yZGZ0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfZGlzcGxheV9jaGFubmVsczsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmcy0+cmRmdF9kYXRhW2ldKTsKKyAgICBhdl9mcmVlcCgmcy0+cmRmdF9kYXRhKTsKKyAgICBhdl9mcmVlcCgmcy0+d2luZG93X2Z1bmNfbHV0KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5vdXRwaWNyZWYpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gTlVMTDsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzID0gTlVMTDsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geyBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX1NBTVBMRV9GTVRfTk9ORSB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9OT05FIH07CisKKyAgICAvKiBzZXQgaW5wdXQgYXVkaW8gZm9ybWF0cyAqLworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9mbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJmlubGluay0+b3V0X2Zvcm1hdHMpOworCisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2xheW91dHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihsYXlvdXRzLCAmaW5saW5rLT5vdXRfY2hhbm5lbF9sYXlvdXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJmlubGluay0+b3V0X3NhbXBsZXJhdGVzKTsKKworICAgIC8qIHNldCBvdXRwdXQgdmlkZW8gZm9ybWF0ICovCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9mb3JtYXRzX3JlZihmb3JtYXRzLCAmb3V0bGluay0+aW5fZm9ybWF0cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIFNob3dTcGVjdHJ1bUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGksIHJkZnRfYml0cywgd2luX3NpemUsIGg7CisKKyAgICBvdXRsaW5rLT53ID0gcy0+dzsKKyAgICBvdXRsaW5rLT5oID0gcy0+aDsKKworICAgIGggPSAocy0+bW9kZSA9PSBDT01CSU5FRCkgPyBvdXRsaW5rLT5oIDogb3V0bGluay0+aCAvIGlubGluay0+Y2hhbm5lbHM7CisgICAgcy0+Y2hhbm5lbF9oZWlnaHQgPSBoOworCisgICAgLyogUkRGVCB3aW5kb3cgc2l6ZSAocHJlY2lzaW9uKSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBvdXRwdXQgZnJhbWUgaGVpZ2h0ICovCisgICAgZm9yIChyZGZ0X2JpdHMgPSAxOyAxIDw8IHJkZnRfYml0cyA8IDIgKiBoOyByZGZ0X2JpdHMrKyk7CisgICAgd2luX3NpemUgPSAxIDw8IHJkZnRfYml0czsKKworICAgIC8qIChyZS0pY29uZmlndXJhdGlvbiBpZiB0aGUgdmlkZW8gb3V0cHV0IGNoYW5nZWQgKG9yIGZpcnN0IGluaXQpICovCisgICAgaWYgKHJkZnRfYml0cyAhPSBzLT5yZGZ0X2JpdHMpIHsKKyAgICAgICAgc2l6ZV90IHJkZnRfc2l6ZSwgcmRmdF9saXN0c2l6ZTsKKyAgICAgICAgQVZGcmFtZSAqb3V0cGljcmVmOworCisgICAgICAgIGF2X3JkZnRfZW5kKHMtPnJkZnQpOworICAgICAgICBzLT5yZGZ0ID0gYXZfcmRmdF9pbml0KHJkZnRfYml0cywgREZUX1IyQyk7CisgICAgICAgIGlmICghcy0+cmRmdCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSBSREZUIGNvbnRleHQuICIKKyAgICAgICAgICAgICAgICAgICAiVGhlIHdpbmRvdyBzaXplIG1pZ2h0IGJlIHRvbyBoaWdoLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIHMtPnJkZnRfYml0cyA9IHJkZnRfYml0czsKKworICAgICAgICAvKiBSREZUIGJ1ZmZlcnM6IHgyIGZvciBlYWNoIChkaXNwbGF5KSBjaGFubmVsIGJ1ZmZlci4KKyAgICAgICAgICogTm90ZTogd2UgdXNlIGZyZWUgYW5kIG1hbGxvYyBpbnN0ZWFkIG9mIGEgcmVhbGxvYy1saWtlIGZ1bmN0aW9uIHRvCisgICAgICAgICAqIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzIGFsaWduZWQgaW4gbWVtb3J5IGZvciB0aGUgRkZUIGZ1bmN0aW9ucy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5yZGZ0X2RhdGFbaV0pOworICAgICAgICBhdl9mcmVlcCgmcy0+cmRmdF9kYXRhKTsKKyAgICAgICAgcy0+bmJfZGlzcGxheV9jaGFubmVscyA9IGlubGluay0+Y2hhbm5lbHM7CisKKyAgICAgICAgaWYgKGF2X3NpemVfbXVsdChzaXplb2YoKnMtPnJkZnRfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmJfZGlzcGxheV9jaGFubmVscywgJnJkZnRfbGlzdHNpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGlmIChhdl9zaXplX211bHQoc2l6ZW9mKCoqcy0+cmRmdF9kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aW5fc2l6ZSwgJnJkZnRfc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgcy0+cmRmdF9kYXRhID0gYXZfbWFsbG9jKHJkZnRfbGlzdHNpemUpOworICAgICAgICBpZiAoIXMtPnJkZnRfZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9kaXNwbGF5X2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIHMtPnJkZnRfZGF0YVtpXSA9IGF2X21hbGxvYyhyZGZ0X3NpemUpOworICAgICAgICAgICAgaWYgKCFzLT5yZGZ0X2RhdGFbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHByZS1jYWxjIHdpbmRvd2luZyBmdW5jdGlvbiAqLworICAgICAgICBzLT53aW5kb3dfZnVuY19sdXQgPQorICAgICAgICAgICAgYXZfcmVhbGxvY19mKHMtPndpbmRvd19mdW5jX2x1dCwgd2luX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT53aW5kb3dfZnVuY19sdXQpKTsKKyAgICAgICAgaWYgKCFzLT53aW5kb3dfZnVuY19sdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBzd2l0Y2ggKHMtPndpbl9mdW5jKSB7CisgICAgICAgIGNhc2UgV0ZVTkNfTk9ORToKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aW5fc2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgIHMtPndpbmRvd19mdW5jX2x1dFtpXSA9IDEuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0ZVTkNfSEFOTjoKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aW5fc2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgIHMtPndpbmRvd19mdW5jX2x1dFtpXSA9IC41ZiAqICgxIC0gY29zKDIqTV9QSSppIC8gKHdpbl9zaXplLTEpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXRlVOQ19IQU1NSU5HOgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpbl9zaXplOyBpKyspCisgICAgICAgICAgICAgICAgcy0+d2luZG93X2Z1bmNfbHV0W2ldID0gLjU0ZiAtIC40NmYgKiBjb3MoMipNX1BJKmkgLyAod2luX3NpemUtMSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0ZVTkNfQkxBQ0tNQU46IHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aW5fc2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgIHMtPndpbmRvd19mdW5jX2x1dFtpXSA9IC40MmYgLSAuNWYqY29zKDIqTV9QSSppIC8gKHdpbl9zaXplLTEpKSArIC4wOGYqY29zKDQqTV9QSSppIC8gKHdpbl9zaXplLTEpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICB9CisKKyAgICAgICAgLyogcHJlcGFyZSB0aGUgaW5pdGlhbCBwaWNyZWYgYnVmZmVyIChibGFjayBmcmFtZSkgKi8KKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+b3V0cGljcmVmKTsKKyAgICAgICAgcy0+b3V0cGljcmVmID0gb3V0cGljcmVmID0KKyAgICAgICAgICAgIGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0cGljcmVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsxLDF9OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0bGluay0+aDsgaSsrKSB7CisgICAgICAgICAgICBtZW1zZXQob3V0cGljcmVmLT5kYXRhWzBdICsgaSAqIG91dHBpY3JlZi0+bGluZXNpemVbMF0sICAgMCwgb3V0bGluay0+dyk7CisgICAgICAgICAgICBtZW1zZXQob3V0cGljcmVmLT5kYXRhWzFdICsgaSAqIG91dHBpY3JlZi0+bGluZXNpemVbMV0sIDEyOCwgb3V0bGluay0+dyk7CisgICAgICAgICAgICBtZW1zZXQob3V0cGljcmVmLT5kYXRhWzJdICsgaSAqIG91dHBpY3JlZi0+bGluZXNpemVbMl0sIDEyOCwgb3V0bGluay0+dyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+eHBvcyA+PSBvdXRsaW5rLT53KQorICAgICAgICBzLT54cG9zID0gMDsKKworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBhdl9tYWtlX3EoaW5saW5rLT5zYW1wbGVfcmF0ZSwgd2luX3NpemUpOworICAgIGlmIChzLT5zbGlkaW5nID09IEZVTExGUkFNRSkKKyAgICAgICAgb3V0bGluay0+ZnJhbWVfcmF0ZS5kZW4gKj0gb3V0bGluay0+dzsKKworICAgIGlubGluay0+bWluX3NhbXBsZXMgPSBpbmxpbmstPm1heF9zYW1wbGVzID0gaW5saW5rLT5wYXJ0aWFsX2J1Zl9zaXplID0KKyAgICAgICAgd2luX3NpemU7CisKKyAgICBzLT5jb21iaW5lX2J1ZmZlciA9CisgICAgICAgIGF2X3JlYWxsb2NfZihzLT5jb21iaW5lX2J1ZmZlciwgb3V0bGluay0+aCAqIDMsCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPmNvbWJpbmVfYnVmZmVyKSk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgInM6JWR4JWQgUkRGVCB3aW5kb3cgc2l6ZTolZFxuIiwKKyAgICAgICAgICAgcy0+dywgcy0+aCwgd2luX3NpemUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIFNob3dTcGVjdHJ1bUNvbnRleHQgKnMgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBvdXRsaW5rLT5zcmMtPmlucHV0c1swXTsKKyAgICB1bnNpZ25lZCBpOworICAgIGludCByZXQ7CisKKyAgICBzLT5yZXFfZnVsbGZpbGxlZCA9IDA7CisgICAgZG8geworICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGlubGluayk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgcy0+c2xpZGluZyA9PSBGVUxMRlJBTUUgJiYgcy0+eHBvcyA+IDAgJiYKKyAgICAgICAgICAgIHMtPm91dHBpY3JlZikgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dGxpbmstPmg7IGkrKykgeworICAgICAgICAgICAgICAgIG1lbXNldChzLT5vdXRwaWNyZWYtPmRhdGFbMF0gKyBpICogcy0+b3V0cGljcmVmLT5saW5lc2l6ZVswXSArIHMtPnhwb3MsICAgMCwgb3V0bGluay0+dyAtIHMtPnhwb3MpOworICAgICAgICAgICAgICAgIG1lbXNldChzLT5vdXRwaWNyZWYtPmRhdGFbMV0gKyBpICogcy0+b3V0cGljcmVmLT5saW5lc2l6ZVsxXSArIHMtPnhwb3MsIDEyOCwgb3V0bGluay0+dyAtIHMtPnhwb3MpOworICAgICAgICAgICAgICAgIG1lbXNldChzLT5vdXRwaWNyZWYtPmRhdGFbMl0gKyBpICogcy0+b3V0cGljcmVmLT5saW5lc2l6ZVsyXSArIHMtPnhwb3MsIDEyOCwgb3V0bGluay0+dyAtIHMtPnhwb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIHMtPm91dHBpY3JlZik7CisgICAgICAgICAgICBzLT5vdXRwaWNyZWYgPSBOVUxMOworICAgICAgICAgICAgcy0+cmVxX2Z1bGxmaWxsZWQgPSAxOworICAgICAgICB9CisgICAgfSB3aGlsZSAoIXMtPnJlcV9mdWxsZmlsbGVkICYmIHJldCA+PSAwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGxvdF9zcGVjdHJ1bV9jb2x1bW4oQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluc2FtcGxlcykKK3sKKyAgICBpbnQgcmV0OworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIFNob3dTcGVjdHJ1bUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0cGljcmVmID0gcy0+b3V0cGljcmVmOworCisgICAgLyogbmJfZnJlcSBjb250YWlucyB0aGUgcG93ZXIgb2YgdHdvIHN1cGVyaW9yIG9yIGVxdWFsIHRvIHRoZSBvdXRwdXQgaW1hZ2UKKyAgICAgKiBoZWlnaHQgKG9yIGhhbGYgdGhlIFJERlQgd2luZG93IHNpemUpICovCisgICAgY29uc3QgaW50IG5iX2ZyZXEgPSAxIDw8IChzLT5yZGZ0X2JpdHMgLSAxKTsKKyAgICBjb25zdCBpbnQgd2luX3NpemUgPSBuYl9mcmVxIDw8IDE7CisgICAgY29uc3QgZG91YmxlIHcgPSAxLiAvIChzcXJ0KG5iX2ZyZXEpICogMzI3NjguKTsKKyAgICBpbnQgaCA9IHMtPmNoYW5uZWxfaGVpZ2h0OworCisgICAgaW50IGNoLCBwbGFuZSwgbiwgeTsKKworICAgIGF2X2Fzc2VydDAoaW5zYW1wbGVzLT5uYl9zYW1wbGVzID09IHdpbl9zaXplKTsKKworICAgIC8qIGZpbGwgUkRGVCBpbnB1dCB3aXRoIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBhdmFpbGFibGUgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uYl9kaXNwbGF5X2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGNvbnN0IGludDE2X3QgKnAgPSAoaW50MTZfdCAqKWluc2FtcGxlcy0+ZXh0ZW5kZWRfZGF0YVtjaF07CisKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IHdpbl9zaXplOyBuKyspCisgICAgICAgICAgICBzLT5yZGZ0X2RhdGFbY2hdW25dID0gcFtuXSAqIHMtPndpbmRvd19mdW5jX2x1dFtuXTsKKyAgICB9CisKKyAgICAvKiBUT0RPIHJlaW5kZW50ICovCisKKyAgICAgICAgLyogcnVuIFJERlQgb24gZWFjaCBzYW1wbGVzIHNldCAqLworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uYl9kaXNwbGF5X2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgYXZfcmRmdF9jYWxjKHMtPnJkZnQsIHMtPnJkZnRfZGF0YVtjaF0pOworCisgICAgICAgIC8qIGZpbGwgYSBuZXcgc3BlY3RydW0gY29sdW1uICovCisjZGVmaW5lIFJFKHksIGNoKSBzLT5yZGZ0X2RhdGFbY2hdWzIgKiAoeSkgKyAwXQorI2RlZmluZSBJTSh5LCBjaCkgcy0+cmRmdF9kYXRhW2NoXVsyICogKHkpICsgMV0KKyNkZWZpbmUgTUFHTklUVURFKHksIGNoKSBoeXBvdChSRSh5LCBjaCksIElNKHksIGNoKSkKKworICAgICAgICAvKiBpbml0aWFsaXplIGJ1ZmZlciBmb3IgY29tYmluaW5nIHRvIGJsYWNrICovCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBvdXRsaW5rLT5oOyB5KyspIHsKKyAgICAgICAgICAgIHMtPmNvbWJpbmVfYnVmZmVyWzMgKiB5ICAgIF0gPSAwOworICAgICAgICAgICAgcy0+Y29tYmluZV9idWZmZXJbMyAqIHkgKyAxXSA9IDEyNy41OworICAgICAgICAgICAgcy0+Y29tYmluZV9idWZmZXJbMyAqIHkgKyAyXSA9IDEyNy41OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+bmJfZGlzcGxheV9jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgZmxvYXQgeWYsIHVmLCB2ZjsKKworICAgICAgICAgICAgLyogZGVjaWRlIGNvbG9yIHJhbmdlICovCisgICAgICAgICAgICBzd2l0Y2ggKHMtPm1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ09NQklORUQ6CisgICAgICAgICAgICAgICAgLy8gcmVkdWNlIHJhbmdlIGJ5IGNoYW5uZWwgY291bnQKKyAgICAgICAgICAgICAgICB5ZiA9IDI1Ni4wZiAvIHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzLT5jb2xvcl9tb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlNJVFk6CisgICAgICAgICAgICAgICAgICAgIHVmID0geWY7CisgICAgICAgICAgICAgICAgICAgIHZmID0geWY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0hBTk5FTDoKKyAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0IHNhdHVyYXRpb24gZm9yIG1peGVkIFVWIGNvbG9yaW5nICovCisgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgZmFjdG9yIGlzIGNvcnJlY3QgZm9yIGluZmluaXRlIGNoYW5uZWxzLCBhbiBhcHByb3hpbWF0aW9uIG90aGVyd2lzZSAqLworICAgICAgICAgICAgICAgICAgICB1ZiA9IHlmICogTV9QSTsKKyAgICAgICAgICAgICAgICAgICAgdmYgPSB5ZiAqIE1fUEk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRVBBUkFURToKKyAgICAgICAgICAgICAgICAvLyBmdWxsIHJhbmdlCisgICAgICAgICAgICAgICAgeWYgPSAyNTYuMGY7CisgICAgICAgICAgICAgICAgdWYgPSAyNTYuMGY7CisgICAgICAgICAgICAgICAgdmYgPSAyNTYuMGY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5jb2xvcl9tb2RlID09IENIQU5ORUwpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+bmJfZGlzcGxheV9jaGFubmVscyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdWYgKj0gMC41ICogc2luKCgyICogTV9QSSAqIGNoKSAvIHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICB2ZiAqPSAwLjUgKiBjb3MoKDIgKiBNX1BJICogY2gpIC8gcy0+bmJfZGlzcGxheV9jaGFubmVscyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdWYgPSAwLjBmOworICAgICAgICAgICAgICAgICAgICB2ZiA9IDAuMGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdWYgKj0gcy0+c2F0dXJhdGlvbjsKKyAgICAgICAgICAgIHZmICo9IHMtPnNhdHVyYXRpb247CisKKyAgICAgICAgICAgIC8qIGRyYXcgdGhlIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgcm93ID0gKHMtPm1vZGUgPT0gQ09NQklORUQpID8geSA6IGNoICogaCArIHk7CisgICAgICAgICAgICAgICAgZmxvYXQgKm91dCA9ICZzLT5jb21iaW5lX2J1ZmZlclszICogcm93XTsKKworICAgICAgICAgICAgICAgIC8qIGdldCBtYWduaXR1ZGUgKi8KKyAgICAgICAgICAgICAgICBmbG9hdCBhID0gdyAqIE1BR05JVFVERSh5LCBjaCk7CisKKyAgICAgICAgICAgICAgICAvKiBhcHBseSBzY2FsZSAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAocy0+c2NhbGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIExJTkVBUjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTUVJUOgorICAgICAgICAgICAgICAgICAgICBhID0gc3FydChhKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDQlJUOgorICAgICAgICAgICAgICAgICAgICBhID0gY2JydChhKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMT0c6CisgICAgICAgICAgICAgICAgICAgIGEgPSAxIC0gbG9nKEZGTUFYKEZGTUlOKDEsIGEpLCAxZS02KSkgLyBsb2coMWUtNik7IC8vIHplcm8gPSAtMTIwZEJGUworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzLT5jb2xvcl9tb2RlID09IElOVEVOU0lUWSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LCB1LCB2OworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc2l6ZW9mKGludGVuc2l0eV9jb2xvcl90YWJsZSkgLyBzaXplb2YoKmludGVuc2l0eV9jb2xvcl90YWJsZSkgLSAxOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW5zaXR5X2NvbG9yX3RhYmxlW2ldLmEgPj0gYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gaSBub3cgaXMgdGhlIGZpcnN0IGl0ZW0gPj0gdGhlIGNvbG9yCisgICAgICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBrbm93IHRvIGludGVycG9sYXRlIGJldHdlZW4gaXRlbSBpIC0gMSBhbmQgaQorICAgICAgICAgICAgICAgICAgICBpZiAoYSA8PSBpbnRlbnNpdHlfY29sb3JfdGFibGVbaSAtIDFdLmEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBpbnRlbnNpdHlfY29sb3JfdGFibGVbaSAtIDFdLnk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ID0gaW50ZW5zaXR5X2NvbG9yX3RhYmxlW2kgLSAxXS51OworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGludGVuc2l0eV9jb2xvcl90YWJsZVtpIC0gMV0udjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID49IGludGVuc2l0eV9jb2xvcl90YWJsZVtpXS5hKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5ID0gaW50ZW5zaXR5X2NvbG9yX3RhYmxlW2ldLnk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ID0gaW50ZW5zaXR5X2NvbG9yX3RhYmxlW2ldLnU7CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gaW50ZW5zaXR5X2NvbG9yX3RhYmxlW2ldLnY7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzdGFydCA9IGludGVuc2l0eV9jb2xvcl90YWJsZVtpIC0gMV0uYTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGVuZCA9IGludGVuc2l0eV9jb2xvcl90YWJsZVtpXS5hOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGVycGZyYWMgPSAoYSAtIHN0YXJ0KSAvIChlbmQgLSBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB5ID0gaW50ZW5zaXR5X2NvbG9yX3RhYmxlW2kgLSAxXS55ICogKDEuMGYgLSBsZXJwZnJhYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlbnNpdHlfY29sb3JfdGFibGVbaV0ueSAqIGxlcnBmcmFjOworICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGludGVuc2l0eV9jb2xvcl90YWJsZVtpIC0gMV0udSAqICgxLjBmIC0gbGVycGZyYWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZW5zaXR5X2NvbG9yX3RhYmxlW2ldLnUgKiBsZXJwZnJhYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBpbnRlbnNpdHlfY29sb3JfdGFibGVbaSAtIDFdLnYgKiAoMS4wZiAtIGxlcnBmcmFjKQorICAgICAgICAgICAgICAgICAgICAgICAgICArIGludGVuc2l0eV9jb2xvcl90YWJsZVtpXS52ICogbGVycGZyYWM7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvdXRbMF0gKz0geSAqIHlmOworICAgICAgICAgICAgICAgICAgICBvdXRbMV0gKz0gdSAqIHVmOworICAgICAgICAgICAgICAgICAgICBvdXRbMl0gKz0gdiAqIHZmOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dFswXSArPSBhICogeWY7CisgICAgICAgICAgICAgICAgICAgIG91dFsxXSArPSBhICogdWY7CisgICAgICAgICAgICAgICAgICAgIG91dFsyXSArPSBhICogdmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogY29weSB0byBvdXRwdXQgKi8KKyAgICAgICAgaWYgKHMtPnNsaWRpbmcgPT0gU0NST0xMKSB7CisgICAgICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IG91dGxpbmstPmg7IHkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwID0gb3V0cGljcmVmLT5kYXRhW3BsYW5lXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICogb3V0cGljcmVmLT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUocCwgcCArIDEsIG91dGxpbmstPncgLSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT54cG9zID0gb3V0bGluay0+dyAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMzsgcGxhbmUrKykgeworICAgICAgICAgICAgdWludDhfdCAqcCA9IG91dHBpY3JlZi0+ZGF0YVtwbGFuZV0gKworICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRsaW5rLT5oIC0gMSkgKiBvdXRwaWNyZWYtPmxpbmVzaXplW3BsYW5lXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+eHBvczsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBvdXRsaW5rLT5oOyB5KyspIHsKKyAgICAgICAgICAgICAgICAqcCA9IHJpbnQoRkZNQVgoMCwgRkZNSU4ocy0+Y29tYmluZV9idWZmZXJbMyAqIHkgKyBwbGFuZV0sIDI1NSkpKTsKKyAgICAgICAgICAgICAgICBwIC09IG91dHBpY3JlZi0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnNsaWRpbmcgIT0gRlVMTEZSQU1FIHx8IHMtPnhwb3MgPT0gMCkKKyAgICAgICAgICAgIG91dHBpY3JlZi0+cHRzID0gaW5zYW1wbGVzLT5wdHM7CisKKyAgICAgICAgcy0+eHBvcysrOworICAgICAgICBpZiAocy0+eHBvcyA+PSBvdXRsaW5rLT53KQorICAgICAgICAgICAgcy0+eHBvcyA9IDA7CisgICAgICAgIGlmIChzLT5zbGlkaW5nICE9IEZVTExGUkFNRSB8fCBzLT54cG9zID09IDApIHsKKyAgICAgICAgICAgIHMtPnJlcV9mdWxsZmlsbGVkID0gMTsKKyAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBhdl9mcmFtZV9jbG9uZShzLT5vdXRwaWNyZWYpKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgIHJldHVybiB3aW5fc2l6ZTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluc2FtcGxlcykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFNob3dTcGVjdHJ1bUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgdW5zaWduZWQgd2luX3NpemUgPSAxIDw8IHMtPnJkZnRfYml0czsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGF2X2Fzc2VydDAoaW5zYW1wbGVzLT5uYl9zYW1wbGVzIDw9IHdpbl9zaXplKTsKKyAgICBpZiAoaW5zYW1wbGVzLT5uYl9zYW1wbGVzID09IHdpbl9zaXplKQorICAgICAgICByZXQgPSBwbG90X3NwZWN0cnVtX2NvbHVtbihpbmxpbmssIGluc2FtcGxlcyk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnNhbXBsZXMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzaG93c3BlY3RydW1faW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzaG93c3BlY3RydW1fb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hdmZfc2hvd3NwZWN0cnVtID0geworICAgIC5uYW1lICAgICAgICAgID0gInNob3dzcGVjdHJ1bSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29udmVydCBpbnB1dCBhdWRpbyB0byBhIHNwZWN0cnVtIHZpZGVvIG91dHB1dC4iKSwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoU2hvd1NwZWN0cnVtQ29udGV4dCksCisgICAgLmlucHV0cyAgICAgICAgPSBzaG93c3BlY3RydW1faW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gc2hvd3NwZWN0cnVtX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmc2hvd3NwZWN0cnVtX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9hdmZfc2hvd3dhdmVzLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZmX3Nob3d3YXZlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMzRhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZmX3Nob3d3YXZlcy5jCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogYXVkaW8gdG8gdmlkZW8gbXVsdGltZWRpYSBmaWx0ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2VudW0gU2hvd1dhdmVzTW9kZSB7CisgICAgTU9ERV9QT0lOVCwKKyAgICBNT0RFX0xJTkUsCisgICAgTU9ERV9QMlAsCisgICAgTU9ERV9DRU5URVJFRF9MSU5FLAorICAgIE1PREVfTkIsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHcsIGg7CisgICAgQVZSYXRpb25hbCByYXRlOworICAgIGludCBidWZfaWR4OworICAgIGludDE2X3QgKmJ1Zl9pZHk7ICAgIC8qIHkgY29vcmRpbmF0ZSBvZiBwcmV2aW91cyBzYW1wbGUgZm9yIGVhY2ggY2hhbm5lbCAqLworICAgIEFWRnJhbWUgKm91dHBpY3JlZjsKKyAgICBpbnQgcmVxX2Z1bGxmaWxsZWQ7CisgICAgaW50IG47CisgICAgaW50IHNhbXBsZV9jb3VudF9tb2Q7CisgICAgZW51bSBTaG93V2F2ZXNNb2RlIG1vZGU7CisgICAgaW50IHNwbGl0X2NoYW5uZWxzOworICAgIHZvaWQgKCpkcmF3X3NhbXBsZSkodWludDhfdCAqYnVmLCBpbnQgaGVpZ2h0LCBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHNhbXBsZSwgaW50MTZfdCAqcHJldl95LCBpbnQgaW50ZW5zaXR5KTsKK30gU2hvd1dhdmVzQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU2hvd1dhdmVzQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzaG93d2F2ZXNfb3B0aW9uc1tdID0geworICAgIHsgInNpemUiLCAic2V0IHZpZGVvIHNpemUiLCBPRkZTRVQodyksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyID0gIjYwMHgyNDAifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJzIiwgICAgInNldCB2aWRlbyBzaXplIiwgT0ZGU0VUKHcpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9ICI2MDB4MjQwIn0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAibW9kZSIsICJzZWxlY3QgZGlzcGxheSBtb2RlIiwgT0ZGU0VUKG1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PU1PREVfUE9JTlR9LCAwLCBNT0RFX05CLTEsIEZMQUdTLCAibW9kZSJ9LAorICAgICAgICB7ICJwb2ludCIsICJkcmF3IGEgcG9pbnQgZm9yIGVhY2ggc2FtcGxlIiwgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9QT0lOVH0sICAgICAgICAgLmZsYWdzPUZMQUdTLCAudW5pdD0ibW9kZSJ9LAorICAgICAgICB7ICJsaW5lIiwgICJkcmF3IGEgbGluZSBmb3IgZWFjaCBzYW1wbGUiLCAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9MSU5FfSwgICAgICAgICAgLmZsYWdzPUZMQUdTLCAudW5pdD0ibW9kZSJ9LAorICAgICAgICB7ICJwMnAiLCAgICJkcmF3IGEgbGluZSBiZXR3ZWVuIHNhbXBsZXMiLCAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9QMlB9LCAgICAgICAgICAgLmZsYWdzPUZMQUdTLCAudW5pdD0ibW9kZSJ9LAorICAgICAgICB7ICJjbGluZSIsICJkcmF3IGEgY2VudGVyZWQgbGluZSBmb3IgZWFjaCBzYW1wbGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9DRU5URVJFRF9MSU5FfSwgLmZsYWdzPUZMQUdTLCAudW5pdD0ibW9kZSJ9LAorICAgIHsgIm4iLCAgICAic2V0IGhvdyBtYW55IHNhbXBsZXMgdG8gc2hvdyBpbiB0aGUgc2FtZSBwb2ludCIsIE9GRlNFVChuKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInJhdGUiLCAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQocmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAiciIsICAgICJzZXQgdmlkZW8gcmF0ZSIsIE9GRlNFVChyYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJzcGxpdF9jaGFubmVscyIsICJkcmF3IGNoYW5uZWxzIHNlcGFyYXRlbHkiLCBPRkZTRVQoc3BsaXRfY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzaG93d2F2ZXMpOworCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTaG93V2F2ZXNDb250ZXh0ICpzaG93d2F2ZXMgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzaG93d2F2ZXMtPm91dHBpY3JlZik7CisgICAgYXZfZnJlZXAoJnNob3d3YXZlcy0+YnVmX2lkeSk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHMgPSBOVUxMOworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRzW10gPSB7IEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX05PTkUgfTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7IEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfTk9ORSB9OworCisgICAgLyogc2V0IGlucHV0IGF1ZGlvIGZvcm1hdHMgKi8KKyAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10cyk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZpbmxpbmstPm91dF9mb3JtYXRzKTsKKworICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9sYXlvdXRzKCk7CisgICAgaWYgKCFsYXlvdXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJmlubGluay0+b3V0X2NoYW5uZWxfbGF5b3V0cyk7CisKKyAgICBmb3JtYXRzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZpbmxpbmstPm91dF9zYW1wbGVyYXRlcyk7CisKKyAgICAvKiBzZXQgb3V0cHV0IHZpZGVvIGZvcm1hdCAqLworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJm91dGxpbmstPmluX2Zvcm1hdHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBTaG93V2F2ZXNDb250ZXh0ICpzaG93d2F2ZXMgPSBjdHgtPnByaXY7CisgICAgaW50IG5iX2NoYW5uZWxzID0gaW5saW5rLT5jaGFubmVsczsKKworICAgIGlmICghc2hvd3dhdmVzLT5uKQorICAgICAgICBzaG93d2F2ZXMtPm4gPSBGRk1BWCgxLCAoKGRvdWJsZSlpbmxpbmstPnNhbXBsZV9yYXRlIC8gKHNob3d3YXZlcy0+dyAqIGF2X3EyZChzaG93d2F2ZXMtPnJhdGUpKSkgKyAwLjUpOworCisgICAgc2hvd3dhdmVzLT5idWZfaWR4ID0gMDsKKyAgICBpZiAoIShzaG93d2F2ZXMtPmJ1Zl9pZHkgPSBhdl9tYWxsb2N6X2FycmF5KG5iX2NoYW5uZWxzLCBzaXplb2YoKnNob3d3YXZlcy0+YnVmX2lkeSkpKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgYWxsb2NhdGUgc2hvd3dhdmVzIGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIG91dGxpbmstPncgPSBzaG93d2F2ZXMtPnc7CisgICAgb3V0bGluay0+aCA9IHNob3d3YXZlcy0+aDsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpezEsMX07CisKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gYXZfZGl2X3EoKEFWUmF0aW9uYWwpe2lubGluay0+c2FtcGxlX3JhdGUsc2hvd3dhdmVzLT5ufSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpe3Nob3d3YXZlcy0+dywxfSk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgInM6JWR4JWQgcjolZiBuOiVkXG4iLAorICAgICAgICAgICBzaG93d2F2ZXMtPncsIHNob3d3YXZlcy0+aCwgYXZfcTJkKG91dGxpbmstPmZyYW1lX3JhdGUpLCBzaG93d2F2ZXMtPm4pOworICAgIHJldHVybiAwOworfQorCitpbmxpbmUgc3RhdGljIGludCBwdXNoX2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIFNob3dXYXZlc0NvbnRleHQgKnNob3d3YXZlcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKKyAgICBpbnQgbmJfY2hhbm5lbHMgPSBpbmxpbmstPmNoYW5uZWxzOworICAgIGludCByZXQsIGk7CisKKyAgICBpZiAoKHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBzaG93d2F2ZXMtPm91dHBpY3JlZikpID49IDApCisgICAgICAgIHNob3d3YXZlcy0+cmVxX2Z1bGxmaWxsZWQgPSAxOworICAgIHNob3d3YXZlcy0+b3V0cGljcmVmID0gTlVMTDsKKyAgICBzaG93d2F2ZXMtPmJ1Zl9pZHggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jaGFubmVsczsgaSsrKQorICAgICAgICBzaG93d2F2ZXMtPmJ1Zl9pZHlbaV0gPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgU2hvd1dhdmVzQ29udGV4dCAqc2hvd3dhdmVzID0gb3V0bGluay0+c3JjLT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisgICAgaW50IHJldDsKKworICAgIHNob3d3YXZlcy0+cmVxX2Z1bGxmaWxsZWQgPSAwOworICAgIGRvIHsKKyAgICAgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShpbmxpbmspOworICAgIH0gd2hpbGUgKCFzaG93d2F2ZXMtPnJlcV9mdWxsZmlsbGVkICYmIHJldCA+PSAwKTsKKworICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgc2hvd3dhdmVzLT5vdXRwaWNyZWYpCisgICAgICAgIHB1c2hfZnJhbWUob3V0bGluayk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBNQVhfSU5UMTYgKCgxPDwxNSkgLTEpCisKK3N0YXRpYyB2b2lkIGRyYXdfc2FtcGxlX3BvaW50KHVpbnQ4X3QgKmJ1ZiwgaW50IGhlaWdodCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBzYW1wbGUsIGludDE2X3QgKnByZXZfeSwgaW50IGludGVuc2l0eSkKK3sKKyAgICBjb25zdCBpbnQgaCA9IGhlaWdodC8yIC0gYXZfcmVzY2FsZShzYW1wbGUsIGhlaWdodC8yLCBNQVhfSU5UMTYpOworICAgIGlmIChoID49IDAgJiYgaCA8IGhlaWdodCkKKyAgICAgICAgYnVmW2ggKiBsaW5lc2l6ZV0gKz0gaW50ZW5zaXR5OworfQorCitzdGF0aWMgdm9pZCBkcmF3X3NhbXBsZV9saW5lKHVpbnQ4X3QgKmJ1ZiwgaW50IGhlaWdodCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHNhbXBsZSwgaW50MTZfdCAqcHJldl95LCBpbnQgaW50ZW5zaXR5KQoreworICAgIGludCBrOworICAgIGNvbnN0IGludCBoID0gaGVpZ2h0LzIgLSBhdl9yZXNjYWxlKHNhbXBsZSwgaGVpZ2h0LzIsIE1BWF9JTlQxNik7CisgICAgaW50IHN0YXJ0ICAgPSBoZWlnaHQvMjsKKyAgICBpbnQgZW5kICAgICA9IGF2X2NsaXAoaCwgMCwgaGVpZ2h0LTEpOworICAgIGlmIChzdGFydCA+IGVuZCkKKyAgICAgICAgRkZTV0FQKGludDE2X3QsIHN0YXJ0LCBlbmQpOworICAgIGZvciAoayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspCisgICAgICAgIGJ1ZltrICogbGluZXNpemVdICs9IGludGVuc2l0eTsKK30KKworc3RhdGljIHZvaWQgZHJhd19zYW1wbGVfcDJwKHVpbnQ4X3QgKmJ1ZiwgaW50IGhlaWdodCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3Qgc2FtcGxlLCBpbnQxNl90ICpwcmV2X3ksIGludCBpbnRlbnNpdHkpCit7CisgICAgaW50IGs7CisgICAgY29uc3QgaW50IGggPSBoZWlnaHQvMiAtIGF2X3Jlc2NhbGUoc2FtcGxlLCBoZWlnaHQvMiwgTUFYX0lOVDE2KTsKKyAgICBpZiAoaCA+PSAwICYmIGggPCBoZWlnaHQpIHsKKyAgICAgICAgYnVmW2ggKiBsaW5lc2l6ZV0gKz0gaW50ZW5zaXR5OworICAgICAgICBpZiAoKnByZXZfeSAmJiBoICE9ICpwcmV2X3kpIHsKKyAgICAgICAgICAgIGludCBzdGFydCA9ICpwcmV2X3k7CisgICAgICAgICAgICBpbnQgZW5kID0gYXZfY2xpcChoLCAwLCBoZWlnaHQtMSk7CisgICAgICAgICAgICBpZiAoc3RhcnQgPiBlbmQpCisgICAgICAgICAgICAgICAgRkZTV0FQKGludDE2X3QsIHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgZm9yIChrID0gc3RhcnQgKyAxOyBrIDwgZW5kOyBrKyspCisgICAgICAgICAgICAgICAgYnVmW2sgKiBsaW5lc2l6ZV0gKz0gaW50ZW5zaXR5OworICAgICAgICB9CisgICAgfQorICAgICpwcmV2X3kgPSBoOworfQorCitzdGF0aWMgdm9pZCBkcmF3X3NhbXBsZV9jbGluZSh1aW50OF90ICpidWYsIGludCBoZWlnaHQsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3Qgc2FtcGxlLCBpbnQxNl90ICpwcmV2X3ksIGludCBpbnRlbnNpdHkpCit7CisgICAgaW50IGs7CisgICAgY29uc3QgaW50IGggICAgID0gYXZfcmVzY2FsZShhYnMoc2FtcGxlKSwgaGVpZ2h0LCBVSU5UMTZfTUFYKTsKKyAgICBjb25zdCBpbnQgc3RhcnQgPSAoaGVpZ2h0IC0gaCkgLyAyOworICAgIGNvbnN0IGludCBlbmQgICA9IHN0YXJ0ICsgaDsKKyAgICBmb3IgKGsgPSBzdGFydDsgayA8IGVuZDsgaysrKQorICAgICAgICBidWZbayAqIGxpbmVzaXplXSArPSBpbnRlbnNpdHk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnNhbXBsZXMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgU2hvd1dhdmVzQ29udGV4dCAqc2hvd3dhdmVzID0gY3R4LT5wcml2OworICAgIGNvbnN0IGludCBuYl9zYW1wbGVzID0gaW5zYW1wbGVzLT5uYl9zYW1wbGVzOworICAgIEFWRnJhbWUgKm91dHBpY3JlZiA9IHNob3d3YXZlcy0+b3V0cGljcmVmOworICAgIGludCBsaW5lc2l6ZSA9IG91dHBpY3JlZiA/IG91dHBpY3JlZi0+bGluZXNpemVbMF0gOiAwOworICAgIGludDE2X3QgKnAgPSAoaW50MTZfdCAqKWluc2FtcGxlcy0+ZGF0YVswXTsKKyAgICBpbnQgbmJfY2hhbm5lbHMgPSBpbmxpbmstPmNoYW5uZWxzOworICAgIGludCBpLCBqLCByZXQgPSAwOworICAgIGNvbnN0IGludCBuID0gc2hvd3dhdmVzLT5uOworICAgIGNvbnN0IGludCB4ID0gMjU1IC8gKChzaG93d2F2ZXMtPnNwbGl0X2NoYW5uZWxzID8gMSA6IG5iX2NoYW5uZWxzKSAqIG4pOyAvKiBtdWx0aXBsaWNhdGlvbiBmYWN0b3IsIHByZS1jb21wdXRlZCB0byBhdm9pZCBpbi1sb29wIGRpdmlzaW9ucyAqLworICAgIGNvbnN0IGludCBjaF9oZWlnaHQgPSBzaG93d2F2ZXMtPnNwbGl0X2NoYW5uZWxzID8gb3V0bGluay0+aCAvIG5iX2NoYW5uZWxzIDogb3V0bGluay0+aDsKKworICAgIC8qIGRyYXcgZGF0YSBpbiB0aGUgYnVmZmVyICovCisgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykgeworICAgICAgICBpZiAoIXNob3d3YXZlcy0+b3V0cGljcmVmKSB7CisgICAgICAgICAgICBzaG93d2F2ZXMtPm91dHBpY3JlZiA9IG91dHBpY3JlZiA9CisgICAgICAgICAgICAgICAgZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICAgICAgICAgIGlmICghb3V0cGljcmVmKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBvdXRwaWNyZWYtPndpZHRoICA9IG91dGxpbmstPnc7CisgICAgICAgICAgICBvdXRwaWNyZWYtPmhlaWdodCA9IG91dGxpbmstPmg7CisgICAgICAgICAgICBvdXRwaWNyZWYtPnB0cyA9IGluc2FtcGxlcy0+cHRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKChwIC0gKGludDE2X3QgKilpbnNhbXBsZXMtPmRhdGFbMF0pIC8gbmJfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7IDEsIGlubGluay0+c2FtcGxlX3JhdGUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZSk7CisgICAgICAgICAgICBsaW5lc2l6ZSA9IG91dHBpY3JlZi0+bGluZXNpemVbMF07CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0bGluay0+aDsgaisrKQorICAgICAgICAgICAgICAgIG1lbXNldChvdXRwaWNyZWYtPmRhdGFbMF0gKyBqICogbGluZXNpemUsIDAsIG91dGxpbmstPncpOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuYl9jaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICB1aW50OF90ICpidWYgPSBvdXRwaWNyZWYtPmRhdGFbMF0gKyBzaG93d2F2ZXMtPmJ1Zl9pZHg7CisgICAgICAgICAgICBpZiAoc2hvd3dhdmVzLT5zcGxpdF9jaGFubmVscykKKyAgICAgICAgICAgICAgICBidWYgKz0gaipjaF9oZWlnaHQqbGluZXNpemU7CisgICAgICAgICAgICBzaG93d2F2ZXMtPmRyYXdfc2FtcGxlKGJ1ZiwgY2hfaGVpZ2h0LCBsaW5lc2l6ZSwgKnArKywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNob3d3YXZlcy0+YnVmX2lkeVtqXSwgeCk7CisgICAgICAgIH0KKworICAgICAgICBzaG93d2F2ZXMtPnNhbXBsZV9jb3VudF9tb2QrKzsKKyAgICAgICAgaWYgKHNob3d3YXZlcy0+c2FtcGxlX2NvdW50X21vZCA9PSBuKSB7CisgICAgICAgICAgICBzaG93d2F2ZXMtPnNhbXBsZV9jb3VudF9tb2QgPSAwOworICAgICAgICAgICAgc2hvd3dhdmVzLT5idWZfaWR4Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3d3YXZlcy0+YnVmX2lkeCA9PSBzaG93d2F2ZXMtPncpCisgICAgICAgICAgICBpZiAoKHJldCA9IHB1c2hfZnJhbWUob3V0bGluaykpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgb3V0cGljcmVmID0gc2hvd3dhdmVzLT5vdXRwaWNyZWY7CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmaW5zYW1wbGVzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTaG93V2F2ZXNDb250ZXh0ICpzaG93d2F2ZXMgPSBjdHgtPnByaXY7CisKKyAgICBzd2l0Y2ggKHNob3d3YXZlcy0+bW9kZSkgeworICAgIGNhc2UgTU9ERV9QT0lOVDogICAgICAgICBzaG93d2F2ZXMtPmRyYXdfc2FtcGxlID0gZHJhd19zYW1wbGVfcG9pbnQ7IGJyZWFrOworICAgIGNhc2UgTU9ERV9MSU5FOiAgICAgICAgICBzaG93d2F2ZXMtPmRyYXdfc2FtcGxlID0gZHJhd19zYW1wbGVfbGluZTsgIGJyZWFrOworICAgIGNhc2UgTU9ERV9QMlA6ICAgICAgICAgICBzaG93d2F2ZXMtPmRyYXdfc2FtcGxlID0gZHJhd19zYW1wbGVfcDJwOyAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9DRU5URVJFRF9MSU5FOiBzaG93d2F2ZXMtPmRyYXdfc2FtcGxlID0gZHJhd19zYW1wbGVfY2xpbmU7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzaG93d2F2ZXNfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzaG93d2F2ZXNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hdmZfc2hvd3dhdmVzID0geworICAgIC5uYW1lICAgICAgICAgID0gInNob3d3YXZlcyIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29udmVydCBpbnB1dCBhdWRpbyB0byBhIHZpZGVvIG91dHB1dC4iKSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFNob3dXYXZlc0NvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICAgID0gc2hvd3dhdmVzX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHNob3d3YXZlc19vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnNob3d3YXZlc19jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYXZmaWx0ZXIuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hdmZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2M2Y1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZmaWx0ZXIuYwpAQCAtMCwwICsxLDExOTAgQEAKKy8qCisgKiBmaWx0ZXIgbGF5ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCb2JieSBCaW5naGFtCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXRvbWljLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhdGlvbmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IGZmX2ZpbHRlcl9mcmFtZV9mcmFtZWQoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSk7CisKK3ZvaWQgZmZfdGxvZ19yZWYodm9pZCAqY3R4LCBBVkZyYW1lICpyZWYsIGludCBlbmQpCit7CisgICAgYXZfdW51c2VkIGNoYXIgYnVmWzE2XTsKKyAgICBmZl90bG9nKGN0eCwKKyAgICAgICAgICAgICJyZWZbJXAgYnVmOiVwIGRhdGE6JXAgbGluZXNpemVbJWQsICVkLCAlZCwgJWRdIHB0czolIlBSSWQ2NCIgcG9zOiUiUFJJZDY0LAorICAgICAgICAgICAgcmVmLCByZWYtPmJ1ZiwgcmVmLT5kYXRhWzBdLAorICAgICAgICAgICAgcmVmLT5saW5lc2l6ZVswXSwgcmVmLT5saW5lc2l6ZVsxXSwgcmVmLT5saW5lc2l6ZVsyXSwgcmVmLT5saW5lc2l6ZVszXSwKKyAgICAgICAgICAgIHJlZi0+cHRzLCBhdl9mcmFtZV9nZXRfcGt0X3BvcyhyZWYpKTsKKworICAgIGlmIChyZWYtPndpZHRoKSB7CisgICAgICAgIGZmX3Rsb2coY3R4LCAiIGE6JWQvJWQgczolZHglZCBpOiVjIGlza2V5OiVkIHR5cGU6JWMiLAorICAgICAgICAgICAgICAgIHJlZi0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sIHJlZi0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgcmVmLT53aWR0aCwgcmVmLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgIXJlZi0+aW50ZXJsYWNlZF9mcmFtZSAgICAgPyAnUCcgOiAgICAgICAgIC8qIFByb2dyZXNzaXZlICAqLworICAgICAgICAgICAgICAgIHJlZi0+dG9wX2ZpZWxkX2ZpcnN0ID8gJ1QnIDogJ0InLCAgICAvKiBUb3AgLyBCb3R0b20gKi8KKyAgICAgICAgICAgICAgICByZWYtPmtleV9mcmFtZSwKKyAgICAgICAgICAgICAgICBhdl9nZXRfcGljdHVyZV90eXBlX2NoYXIocmVmLT5waWN0X3R5cGUpKTsKKyAgICB9CisgICAgaWYgKHJlZi0+bmJfc2FtcGxlcykgeworICAgICAgICBmZl90bG9nKGN0eCwgIiBjbDolIlBSSWQ2NCJkIG46JWQgcjolZCIsCisgICAgICAgICAgICAgICAgcmVmLT5jaGFubmVsX2xheW91dCwKKyAgICAgICAgICAgICAgICByZWYtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgcmVmLT5zYW1wbGVfcmF0ZSk7CisgICAgfQorCisgICAgZmZfdGxvZyhjdHgsICJdJXMiLCBlbmQgPyAiXG4iIDogIiIpOworfQorCit1bnNpZ25lZCBhdmZpbHRlcl92ZXJzaW9uKHZvaWQpCit7CisgICAgYXZfYXNzZXJ0MChMSUJBVkZJTFRFUl9WRVJTSU9OX01JQ1JPID49IDEwMCk7CisgICAgcmV0dXJuIExJQkFWRklMVEVSX1ZFUlNJT05fSU5UOworfQorCitjb25zdCBjaGFyICphdmZpbHRlcl9jb25maWd1cmF0aW9uKHZvaWQpCit7CisgICAgcmV0dXJuIEZGTVBFR19DT05GSUdVUkFUSU9OOworfQorCitjb25zdCBjaGFyICphdmZpbHRlcl9saWNlbnNlKHZvaWQpCit7CisjZGVmaW5lIExJQ0VOU0VfUFJFRklYICJsaWJhdmZpbHRlciBsaWNlbnNlOiAiCisgICAgcmV0dXJuIExJQ0VOU0VfUFJFRklYIEZGTVBFR19MSUNFTlNFICsgc2l6ZW9mKExJQ0VOU0VfUFJFRklYKSAtIDE7Cit9CisKK3ZvaWQgZmZfY29tbWFuZF9xdWV1ZV9wb3AoQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXIpCit7CisgICAgQVZGaWx0ZXJDb21tYW5kICpjPSBmaWx0ZXItPmNvbW1hbmRfcXVldWU7CisgICAgYXZfZnJlZXAoJmMtPmFyZyk7CisgICAgYXZfZnJlZXAoJmMtPmNvbW1hbmQpOworICAgIGZpbHRlci0+Y29tbWFuZF9xdWV1ZT0gYy0+bmV4dDsKKyAgICBhdl9mcmVlKGMpOworfQorCitpbnQgZmZfaW5zZXJ0X3BhZCh1bnNpZ25lZCBpZHgsIHVuc2lnbmVkICpjb3VudCwgc2l6ZV90IHBhZGlkeF9vZmYsCisgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJQYWQgKipwYWRzLCBBVkZpbHRlckxpbmsgKioqbGlua3MsCisgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJQYWQgKm5ld3BhZCkKK3sKKyAgICBBVkZpbHRlckxpbmsgKipuZXdsaW5rczsKKyAgICBBVkZpbHRlclBhZCAqbmV3cGFkczsKKyAgICB1bnNpZ25lZCBpOworCisgICAgaWR4ID0gRkZNSU4oaWR4LCAqY291bnQpOworCisgICAgbmV3cGFkcyAgPSBhdl9yZWFsbG9jX2FycmF5KCpwYWRzLCAgKmNvdW50ICsgMSwgc2l6ZW9mKEFWRmlsdGVyUGFkKSk7CisgICAgbmV3bGlua3MgPSBhdl9yZWFsbG9jX2FycmF5KCpsaW5rcywgKmNvdW50ICsgMSwgc2l6ZW9mKEFWRmlsdGVyTGluayopKTsKKyAgICBpZiAobmV3cGFkcykKKyAgICAgICAgKnBhZHMgID0gbmV3cGFkczsKKyAgICBpZiAobmV3bGlua3MpCisgICAgICAgICpsaW5rcyA9IG5ld2xpbmtzOworICAgIGlmICghbmV3cGFkcyB8fCAhbmV3bGlua3MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBtZW1tb3ZlKCpwYWRzICArIGlkeCArIDEsICpwYWRzICArIGlkeCwgc2l6ZW9mKEFWRmlsdGVyUGFkKSAgICogKCpjb3VudCAtIGlkeCkpOworICAgIG1lbW1vdmUoKmxpbmtzICsgaWR4ICsgMSwgKmxpbmtzICsgaWR4LCBzaXplb2YoQVZGaWx0ZXJMaW5rKikgKiAoKmNvdW50IC0gaWR4KSk7CisgICAgbWVtY3B5KCpwYWRzICsgaWR4LCBuZXdwYWQsIHNpemVvZihBVkZpbHRlclBhZCkpOworICAgICgqbGlua3MpW2lkeF0gPSBOVUxMOworCisgICAgKCpjb3VudCkrKzsKKyAgICBmb3IgKGkgPSBpZHggKyAxOyBpIDwgKmNvdW50OyBpKyspCisgICAgICAgIGlmICgoKmxpbmtzKVtpXSkKKyAgICAgICAgICAgICgqKHVuc2lnbmVkICopKCh1aW50OF90ICopICgqbGlua3MpW2ldICsgcGFkaWR4X29mZikpKys7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2ZmlsdGVyX2xpbmsoQVZGaWx0ZXJDb250ZXh0ICpzcmMsIHVuc2lnbmVkIHNyY3BhZCwKKyAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQ29udGV4dCAqZHN0LCB1bnNpZ25lZCBkc3RwYWQpCit7CisgICAgQVZGaWx0ZXJMaW5rICpsaW5rOworCisgICAgaWYgKHNyYy0+bmJfb3V0cHV0cyA8PSBzcmNwYWQgfHwgZHN0LT5uYl9pbnB1dHMgPD0gZHN0cGFkIHx8CisgICAgICAgIHNyYy0+b3V0cHV0c1tzcmNwYWRdICAgICAgfHwgZHN0LT5pbnB1dHNbZHN0cGFkXSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKHNyYy0+b3V0cHV0X3BhZHNbc3JjcGFkXS50eXBlICE9IGRzdC0+aW5wdXRfcGFkc1tkc3RwYWRdLnR5cGUpIHsKKyAgICAgICAgYXZfbG9nKHNyYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk1lZGlhIHR5cGUgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgJyVzJyBmaWx0ZXIgb3V0cHV0IHBhZCAlZCAoJXMpIGFuZCB0aGUgJyVzJyBmaWx0ZXIgaW5wdXQgcGFkICVkICglcylcbiIsCisgICAgICAgICAgICAgICBzcmMtPm5hbWUsIHNyY3BhZCwgKGNoYXIgKilhdl94X2lmX251bGwoYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHNyYy0+b3V0cHV0X3BhZHNbc3JjcGFkXS50eXBlKSwgIj8iKSwKKyAgICAgICAgICAgICAgIGRzdC0+bmFtZSwgZHN0cGFkLCAoY2hhciAqKWF2X3hfaWZfbnVsbChhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoZHN0LT4gaW5wdXRfcGFkc1tkc3RwYWRdLnR5cGUpLCAiPyIpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBsaW5rID0gYXZfbWFsbG9jeihzaXplb2YoKmxpbmspKTsKKyAgICBpZiAoIWxpbmspCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzcmMtPm91dHB1dHNbc3JjcGFkXSA9IGRzdC0+aW5wdXRzW2RzdHBhZF0gPSBsaW5rOworCisgICAgbGluay0+c3JjICAgICA9IHNyYzsKKyAgICBsaW5rLT5kc3QgICAgID0gZHN0OworICAgIGxpbmstPnNyY3BhZCAgPSAmc3JjLT5vdXRwdXRfcGFkc1tzcmNwYWRdOworICAgIGxpbmstPmRzdHBhZCAgPSAmZHN0LT5pbnB1dF9wYWRzW2RzdHBhZF07CisgICAgbGluay0+dHlwZSAgICA9IHNyYy0+b3V0cHV0X3BhZHNbc3JjcGFkXS50eXBlOworICAgIGF2X2Fzc2VydDAoQVZfUElYX0ZNVF9OT05FID09IC0xICYmIEFWX1NBTVBMRV9GTVRfTk9ORSA9PSAtMSk7CisgICAgbGluay0+Zm9ybWF0ICA9IC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXZmaWx0ZXJfbGlua19mcmVlKEFWRmlsdGVyTGluayAqKmxpbmspCit7CisgICAgaWYgKCEqbGluaykKKyAgICAgICAgcmV0dXJuOworCisgICAgYXZfZnJhbWVfZnJlZSgmKCpsaW5rKS0+cGFydGlhbF9idWYpOworCisgICAgYXZfZnJlZXAobGluayk7Cit9CisKK2ludCBhdmZpbHRlcl9saW5rX2dldF9jaGFubmVscyhBVkZpbHRlckxpbmsgKmxpbmspCit7CisgICAgcmV0dXJuIGxpbmstPmNoYW5uZWxzOworfQorCit2b2lkIGF2ZmlsdGVyX2xpbmtfc2V0X2Nsb3NlZChBVkZpbHRlckxpbmsgKmxpbmssIGludCBjbG9zZWQpCit7CisgICAgbGluay0+Y2xvc2VkID0gY2xvc2VkOworfQorCitpbnQgYXZmaWx0ZXJfaW5zZXJ0X2ZpbHRlcihBVkZpbHRlckxpbmsgKmxpbmssIEFWRmlsdGVyQ29udGV4dCAqZmlsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZpbHRfc3JjcGFkX2lkeCwgdW5zaWduZWQgZmlsdF9kc3RwYWRfaWR4KQoreworICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgZHN0cGFkX2lkeCA9IGxpbmstPmRzdHBhZCAtIGxpbmstPmRzdC0+aW5wdXRfcGFkczsKKworICAgIGF2X2xvZyhsaW5rLT5kc3QsIEFWX0xPR19WRVJCT1NFLCAiYXV0by1pbnNlcnRpbmcgZmlsdGVyICclcycgIgorICAgICAgICAgICAiYmV0d2VlbiB0aGUgZmlsdGVyICclcycgYW5kIHRoZSBmaWx0ZXIgJyVzJ1xuIiwKKyAgICAgICAgICAgZmlsdC0+bmFtZSwgbGluay0+c3JjLT5uYW1lLCBsaW5rLT5kc3QtPm5hbWUpOworCisgICAgbGluay0+ZHN0LT5pbnB1dHNbZHN0cGFkX2lkeF0gPSBOVUxMOworICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfbGluayhmaWx0LCBmaWx0X2RzdHBhZF9pZHgsIGxpbmstPmRzdCwgZHN0cGFkX2lkeCkpIDwgMCkgeworICAgICAgICAvKiBmYWlsZWQgdG8gbGluayBvdXRwdXQgZmlsdGVyIHRvIG5ldyBmaWx0ZXIgKi8KKyAgICAgICAgbGluay0+ZHN0LT5pbnB1dHNbZHN0cGFkX2lkeF0gPSBsaW5rOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIHJlLWhvb2t1cCB0aGUgbGluayB0byB0aGUgbmV3IGRlc3RpbmF0aW9uIGZpbHRlciB3ZSBpbnNlcnRlZCAqLworICAgIGxpbmstPmRzdCAgICAgICAgICAgICAgICAgICAgID0gZmlsdDsKKyAgICBsaW5rLT5kc3RwYWQgICAgICAgICAgICAgICAgICA9ICZmaWx0LT5pbnB1dF9wYWRzW2ZpbHRfc3JjcGFkX2lkeF07CisgICAgZmlsdC0+aW5wdXRzW2ZpbHRfc3JjcGFkX2lkeF0gPSBsaW5rOworCisgICAgLyogaWYgYW55IGluZm9ybWF0aW9uIG9uIHN1cHBvcnRlZCBtZWRpYSBmb3JtYXRzIGFscmVhZHkgZXhpc3RzIG9uIHRoZQorICAgICAqIGxpbmssIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhhdCAqLworICAgIGlmIChsaW5rLT5vdXRfZm9ybWF0cykKKyAgICAgICAgZmZfZm9ybWF0c19jaGFuZ2VyZWYoJmxpbmstPm91dF9mb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsdC0+b3V0cHV0c1tmaWx0X2RzdHBhZF9pZHhdLT5vdXRfZm9ybWF0cyk7CisgICAgaWYgKGxpbmstPm91dF9zYW1wbGVyYXRlcykKKyAgICAgICAgZmZfZm9ybWF0c19jaGFuZ2VyZWYoJmxpbmstPm91dF9zYW1wbGVyYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbHQtPm91dHB1dHNbZmlsdF9kc3RwYWRfaWR4XS0+b3V0X3NhbXBsZXJhdGVzKTsKKyAgICBpZiAobGluay0+b3V0X2NoYW5uZWxfbGF5b3V0cykKKyAgICAgICAgZmZfY2hhbm5lbF9sYXlvdXRzX2NoYW5nZXJlZigmbGluay0+b3V0X2NoYW5uZWxfbGF5b3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsdC0+b3V0cHV0c1tmaWx0X2RzdHBhZF9pZHhdLT5vdXRfY2hhbm5lbF9sYXlvdXRzKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgYXZmaWx0ZXJfY29uZmlnX2xpbmtzKEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyKQoreworICAgIGludCAoKmNvbmZpZ19saW5rKShBVkZpbHRlckxpbmsgKik7CisgICAgdW5zaWduZWQgaTsKKyAgICBpbnQgcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlci0+bmJfaW5wdXRzOyBpICsrKSB7CisgICAgICAgIEFWRmlsdGVyTGluayAqbGluayA9IGZpbHRlci0+aW5wdXRzW2ldOworICAgICAgICBBVkZpbHRlckxpbmsgKmlubGluazsKKworICAgICAgICBpZiAoIWxpbmspIGNvbnRpbnVlOworICAgICAgICBpZiAoIWxpbmstPnNyYyB8fCAhbGluay0+ZHN0KSB7CisgICAgICAgICAgICBhdl9sb2coZmlsdGVyLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIk5vdCBhbGwgaW5wdXQgYW5kIG91dHB1dCBhcmUgcHJvcGVybHkgbGlua2VkICglZCkuXG4iLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmsgPSBsaW5rLT5zcmMtPm5iX2lucHV0cyA/IGxpbmstPnNyYy0+aW5wdXRzWzBdIDogTlVMTDsKKyAgICAgICAgbGluay0+Y3VycmVudF9wdHMgPSBBVl9OT1BUU19WQUxVRTsKKworICAgICAgICBzd2l0Y2ggKGxpbmstPmluaXRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSBBVkxJTktfSU5JVDoKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlIEFWTElOS19TVEFSVElOSVQ6CisgICAgICAgICAgICBhdl9sb2coZmlsdGVyLCBBVl9MT0dfSU5GTywgImNpcmN1bGFyIGZpbHRlciBjaGFpbiBkZXRlY3RlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBBVkxJTktfVU5JTklUOgorICAgICAgICAgICAgbGluay0+aW5pdF9zdGF0ZSA9IEFWTElOS19TVEFSVElOSVQ7CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfY29uZmlnX2xpbmtzKGxpbmstPnNyYykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBpZiAoIShjb25maWdfbGluayA9IGxpbmstPnNyY3BhZC0+Y29uZmlnX3Byb3BzKSkgeworICAgICAgICAgICAgICAgIGlmIChsaW5rLT5zcmMtPm5iX2lucHV0cyAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhsaW5rLT5zcmMsIEFWX0xPR19FUlJPUiwgIlNvdXJjZSBmaWx0ZXJzIGFuZCBmaWx0ZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCBtb3JlIHRoYW4gb25lIGlucHV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBzZXQgY29uZmlnX3Byb3BzKCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFja3Mgb24gYWxsIG91dHB1dHNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHJldCA9IGNvbmZpZ19saW5rKGxpbmspKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobGluay0+c3JjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29uZmlndXJlIG91dHB1dCBwYWQgb24gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPnNyYy0+bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChsaW5rLT50eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgICAgICAgICBpZiAoIWxpbmstPnRpbWVfYmFzZS5udW0gJiYgIWxpbmstPnRpbWVfYmFzZS5kZW4pCisgICAgICAgICAgICAgICAgICAgIGxpbmstPnRpbWVfYmFzZSA9IGlubGluayA/IGlubGluay0+dGltZV9iYXNlIDogQVZfVElNRV9CQVNFX1E7CisKKyAgICAgICAgICAgICAgICBpZiAoIWxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICYmICFsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbikKKyAgICAgICAgICAgICAgICAgICAgbGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGlubGluayA/CisgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gOiAoQVZSYXRpb25hbCl7MSwxfTsKKworICAgICAgICAgICAgICAgIGlmIChpbmxpbmsgJiYgIWxpbmstPmZyYW1lX3JhdGUubnVtICYmICFsaW5rLT5mcmFtZV9yYXRlLmRlbikKKyAgICAgICAgICAgICAgICAgICAgbGluay0+ZnJhbWVfcmF0ZSA9IGlubGluay0+ZnJhbWVfcmF0ZTsKKworICAgICAgICAgICAgICAgIGlmIChpbmxpbmspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5rLT53KQorICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+dyA9IGlubGluay0+dzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5rLT5oKQorICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+aCA9IGlubGluay0+aDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFsaW5rLT53IHx8ICFsaW5rLT5oKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhsaW5rLT5zcmMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJWaWRlbyBzb3VyY2UgZmlsdGVycyBtdXN0IHNldCB0aGVpciBvdXRwdXQgbGluaydzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCBhbmQgaGVpZ2h0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgICAgIGlmIChpbmxpbmspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5rLT50aW1lX2Jhc2UubnVtICYmICFsaW5rLT50aW1lX2Jhc2UuZGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+dGltZV9iYXNlID0gaW5saW5rLT50aW1lX2Jhc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFsaW5rLT50aW1lX2Jhc2UubnVtICYmICFsaW5rLT50aW1lX2Jhc2UuZGVuKQorICAgICAgICAgICAgICAgICAgICBsaW5rLT50aW1lX2Jhc2UgPSAoQVZSYXRpb25hbCkgezEsIGxpbmstPnNhbXBsZV9yYXRlfTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChjb25maWdfbGluayA9IGxpbmstPmRzdHBhZC0+Y29uZmlnX3Byb3BzKSkKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGNvbmZpZ19saW5rKGxpbmspKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGxpbmstPmRzdCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25maWd1cmUgaW5wdXQgcGFkIG9uICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+ZHN0LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpbmstPmluaXRfc3RhdGUgPSBBVkxJTktfSU5JVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX3Rsb2dfbGluayh2b2lkICpjdHgsIEFWRmlsdGVyTGluayAqbGluaywgaW50IGVuZCkKK3sKKyAgICBpZiAobGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgZmZfdGxvZyhjdHgsCisgICAgICAgICAgICAgICAgImxpbmtbJXAgczolZHglZCBmbXQ6JXMgJXMtPiVzXSVzIiwKKyAgICAgICAgICAgICAgICBsaW5rLCBsaW5rLT53LCBsaW5rLT5oLAorICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUobGluay0+Zm9ybWF0KSwKKyAgICAgICAgICAgICAgICBsaW5rLT5zcmMgPyBsaW5rLT5zcmMtPmZpbHRlci0+bmFtZSA6ICIiLAorICAgICAgICAgICAgICAgIGxpbmstPmRzdCA/IGxpbmstPmRzdC0+ZmlsdGVyLT5uYW1lIDogIiIsCisgICAgICAgICAgICAgICAgZW5kID8gIlxuIiA6ICIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyIGJ1ZlsxMjhdOworICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIC0xLCBsaW5rLT5jaGFubmVsX2xheW91dCk7CisKKyAgICAgICAgZmZfdGxvZyhjdHgsCisgICAgICAgICAgICAgICAgImxpbmtbJXAgcjolZCBjbDolcyBmbXQ6JXMgJXMtPiVzXSVzIiwKKyAgICAgICAgICAgICAgICBsaW5rLCAoaW50KWxpbmstPnNhbXBsZV9yYXRlLCBidWYsCisgICAgICAgICAgICAgICAgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShsaW5rLT5mb3JtYXQpLAorICAgICAgICAgICAgICAgIGxpbmstPnNyYyA/IGxpbmstPnNyYy0+ZmlsdGVyLT5uYW1lIDogIiIsCisgICAgICAgICAgICAgICAgbGluay0+ZHN0ID8gbGluay0+ZHN0LT5maWx0ZXItPm5hbWUgOiAiIiwKKyAgICAgICAgICAgICAgICBlbmQgPyAiXG4iIDogIiIpOworICAgIH0KK30KKworaW50IGZmX3JlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIGludCByZXQgPSAtMTsKKyAgICBGRl9UUFJJTlRGX1NUQVJUKE5VTEwsIHJlcXVlc3RfZnJhbWUpOyBmZl90bG9nX2xpbmsoTlVMTCwgbGluaywgMSk7CisKKyAgICBpZiAobGluay0+Y2xvc2VkKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgYXZfYXNzZXJ0MCghbGluay0+ZnJhbWVfcmVxdWVzdGVkKTsKKyAgICBsaW5rLT5mcmFtZV9yZXF1ZXN0ZWQgPSAxOworICAgIHdoaWxlIChsaW5rLT5mcmFtZV9yZXF1ZXN0ZWQpIHsKKyAgICAgICAgaWYgKGxpbmstPnNyY3BhZC0+cmVxdWVzdF9mcmFtZSkKKyAgICAgICAgICAgIHJldCA9IGxpbmstPnNyY3BhZC0+cmVxdWVzdF9mcmFtZShsaW5rKTsKKyAgICAgICAgZWxzZSBpZiAobGluay0+c3JjLT5pbnB1dHNbMF0pCisgICAgICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGxpbmstPnNyYy0+aW5wdXRzWzBdKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBsaW5rLT5wYXJ0aWFsX2J1ZikgeworICAgICAgICAgICAgQVZGcmFtZSAqcGJ1ZiA9IGxpbmstPnBhcnRpYWxfYnVmOworICAgICAgICAgICAgbGluay0+cGFydGlhbF9idWYgPSBOVUxMOworICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lX2ZyYW1lZChsaW5rLCBwYnVmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgbGluay0+ZnJhbWVfcmVxdWVzdGVkID0gMDsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICAgICAgbGluay0+Y2xvc2VkID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoIWxpbmstPmZyYW1lX3JlcXVlc3RlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5mbGFncyAmIEZGX0xJTktfRkxBR19SRVFVRVNUX0xPT1ApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9wb2xsX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBpbnQgaSwgbWluID0gSU5UX01BWDsKKworICAgIGlmIChsaW5rLT5zcmNwYWQtPnBvbGxfZnJhbWUpCisgICAgICAgIHJldHVybiBsaW5rLT5zcmNwYWQtPnBvbGxfZnJhbWUobGluayk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGluay0+c3JjLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBpbnQgdmFsOworICAgICAgICBpZiAoIWxpbmstPnNyYy0+aW5wdXRzW2ldKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB2YWwgPSBmZl9wb2xsX2ZyYW1lKGxpbmstPnNyYy0+aW5wdXRzW2ldKTsKKyAgICAgICAgbWluID0gRkZNSU4obWluLCB2YWwpOworICAgIH0KKworICAgIHJldHVybiBtaW47Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsKKyAgICAidCIsCisgICAgIm4iLAorICAgICJwb3MiLAorICAgICJ3IiwKKyAgICAiaCIsCisgICAgTlVMTAorfTsKKworZW51bSB7CisgICAgVkFSX1QsCisgICAgVkFSX04sCisgICAgVkFSX1BPUywKKyAgICBWQVJfVywKKyAgICBWQVJfSCwKKyAgICBWQVJfVkFSU19OQgorfTsKKworc3RhdGljIGludCBzZXRfZW5hYmxlX2V4cHIoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmV4cHIpCit7CisgICAgaW50IHJldDsKKyAgICBjaGFyICpleHByX2R1cDsKKyAgICBBVkV4cHIgKm9sZCA9IGN0eC0+ZW5hYmxlOworCisgICAgaWYgKCEoY3R4LT5maWx0ZXItPmZsYWdzICYgQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUaW1lbGluZSAoJ2VuYWJsZScgb3B0aW9uKSBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICJ3aXRoIGZpbHRlciAnJXMnXG4iLCBjdHgtPmZpbHRlci0+bmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBleHByX2R1cCA9IGF2X3N0cmR1cChleHByKTsKKyAgICBpZiAoIWV4cHJfZHVwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKCFjdHgtPnZhcl92YWx1ZXMpIHsKKyAgICAgICAgY3R4LT52YXJfdmFsdWVzID0gYXZfY2FsbG9jKFZBUl9WQVJTX05CLCBzaXplb2YoKmN0eC0+dmFyX3ZhbHVlcykpOworICAgICAgICBpZiAoIWN0eC0+dmFyX3ZhbHVlcykgeworICAgICAgICAgICAgYXZfZnJlZShleHByX2R1cCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gYXZfZXhwcl9wYXJzZSgoQVZFeHByKiopJmN0eC0+ZW5hYmxlLCBleHByX2R1cCwgdmFyX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4LT5wcml2KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LT5wcml2LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRXJyb3Igd2hlbiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uICclcycgZm9yIGVuYWJsZVxuIiwKKyAgICAgICAgICAgICAgIGV4cHJfZHVwKTsKKyAgICAgICAgYXZfZnJlZShleHByX2R1cCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXZfZXhwcl9mcmVlKG9sZCk7CisgICAgYXZfZnJlZShjdHgtPmVuYWJsZV9zdHIpOworICAgIGN0eC0+ZW5hYmxlX3N0ciA9IGV4cHJfZHVwOworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX3VwZGF0ZV9saW5rX2N1cnJlbnRfcHRzKEFWRmlsdGVyTGluayAqbGluaywgaW50NjRfdCBwdHMpCit7CisgICAgaWYgKHB0cyA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcmV0dXJuOworICAgIGxpbmstPmN1cnJlbnRfcHRzID0gYXZfcmVzY2FsZV9xKHB0cywgbGluay0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7CisgICAgLyogVE9ETyB1c2UgZHVyYXRpb24gKi8KKyAgICBpZiAobGluay0+Z3JhcGggJiYgbGluay0+YWdlX2luZGV4ID49IDApCisgICAgICAgIGZmX2F2ZmlsdGVyX2dyYXBoX3VwZGF0ZV9oZWFwKGxpbmstPmdyYXBoLCBsaW5rKTsKK30KKworaW50IGF2ZmlsdGVyX3Byb2Nlc3NfY29tbWFuZChBVkZpbHRlckNvbnRleHQgKmZpbHRlciwgY29uc3QgY2hhciAqY21kLCBjb25zdCBjaGFyICphcmcsIGNoYXIgKnJlcywgaW50IHJlc19sZW4sIGludCBmbGFncykKK3sKKyAgICBpZighc3RyY21wKGNtZCwgInBpbmciKSl7CisgICAgICAgIGNoYXIgbG9jYWxfcmVzWzI1Nl0gPSB7MH07CisKKyAgICAgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgICAgIHJlcyA9IGxvY2FsX3JlczsKKyAgICAgICAgICAgIHJlc19sZW4gPSBzaXplb2YobG9jYWxfcmVzKTsKKyAgICAgICAgfQorICAgICAgICBhdl9zdHJsY2F0ZihyZXMsIHJlc19sZW4sICJwb25nIGZyb206JXMgJXNcbiIsIGZpbHRlci0+ZmlsdGVyLT5uYW1lLCBmaWx0ZXItPm5hbWUpOworICAgICAgICBpZiAocmVzID09IGxvY2FsX3JlcykKKyAgICAgICAgICAgIGF2X2xvZyhmaWx0ZXIsIEFWX0xPR19JTkZPLCAiJXMiLCByZXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9ZWxzZSBpZighc3RyY21wKGNtZCwgImVuYWJsZSIpKSB7CisgICAgICAgIHJldHVybiBzZXRfZW5hYmxlX2V4cHIoZmlsdGVyLCBhcmcpOworICAgIH1lbHNlIGlmKGZpbHRlci0+ZmlsdGVyLT5wcm9jZXNzX2NvbW1hbmQpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlci0+ZmlsdGVyLT5wcm9jZXNzX2NvbW1hbmQoZmlsdGVyLCBjbWQsIGFyZywgcmVzLCByZXNfbGVuLCBmbGFncyk7CisgICAgfQorICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Cit9CisKK3N0YXRpYyBBVkZpbHRlciAqZmlyc3RfZmlsdGVyOworc3RhdGljIEFWRmlsdGVyICoqbGFzdF9maWx0ZXIgPSAmZmlyc3RfZmlsdGVyOworCisjaWYgIUZGX0FQSV9OT0NPTlNUX0dFVF9OQU1FCitjb25zdAorI2VuZGlmCitBVkZpbHRlciAqYXZmaWx0ZXJfZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBBVkZpbHRlciAqZiA9IE5VTEw7CisKKyAgICBpZiAoIW5hbWUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgd2hpbGUgKChmID0gYXZmaWx0ZXJfbmV4dChmKSkpCisgICAgICAgIGlmICghc3RyY21wKGYtPm5hbWUsIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIChBVkZpbHRlciAqKWY7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IGF2ZmlsdGVyX3JlZ2lzdGVyKEFWRmlsdGVyICpmaWx0ZXIpCit7CisgICAgQVZGaWx0ZXIgKipmID0gbGFzdF9maWx0ZXI7CisgICAgaW50IGk7CisKKyAgICAvKiB0aGUgZmlsdGVyIG11c3Qgc2VsZWN0IGdlbmVyaWMgb3IgaW50ZXJuYWwgZXhjbHVzaXZlbHkgKi8KKyAgICBhdl9hc3NlcnQwKChmaWx0ZXItPmZsYWdzICYgQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FKSAhPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkUpOworCisgICAgZm9yKGk9MDsgZmlsdGVyLT5pbnB1dHMgJiYgZmlsdGVyLT5pbnB1dHNbaV0ubmFtZTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEFWRmlsdGVyUGFkICppbnB1dCA9ICZmaWx0ZXItPmlucHV0c1tpXTsKKyAgICAgICAgYXZfYXNzZXJ0MCggICAgICFpbnB1dC0+ZmlsdGVyX2ZyYW1lCisgICAgICAgICAgICAgICAgICAgIHx8ICghaW5wdXQtPnN0YXJ0X2ZyYW1lICYmICFpbnB1dC0+ZW5kX2ZyYW1lKSk7CisgICAgfQorCisgICAgZmlsdGVyLT5uZXh0ID0gTlVMTDsKKworICAgIHdoaWxlKCpmIHx8IGF2cHJpdl9hdG9taWNfcHRyX2Nhcygodm9pZCAqIHZvbGF0aWxlICopZiwgTlVMTCwgZmlsdGVyKSkKKyAgICAgICAgZiA9ICYoKmYpLT5uZXh0OworICAgIGxhc3RfZmlsdGVyID0gJmZpbHRlci0+bmV4dDsKKworICAgIHJldHVybiAwOworfQorCitjb25zdCBBVkZpbHRlciAqYXZmaWx0ZXJfbmV4dChjb25zdCBBVkZpbHRlciAqcHJldikKK3sKKyAgICByZXR1cm4gcHJldiA/IHByZXYtPm5leHQgOiBmaXJzdF9maWx0ZXI7Cit9CisKKyNpZiBGRl9BUElfT0xEX0ZJTFRFUl9SRUdJU1RFUgorQVZGaWx0ZXIgKiphdl9maWx0ZXJfbmV4dChBVkZpbHRlciAqKmZpbHRlcikKK3sKKyAgICByZXR1cm4gZmlsdGVyID8gJigqZmlsdGVyKS0+bmV4dCA6ICZmaXJzdF9maWx0ZXI7Cit9CisKK3ZvaWQgYXZmaWx0ZXJfdW5pbml0KHZvaWQpCit7Cit9CisjZW5kaWYKKworaW50IGF2ZmlsdGVyX3BhZF9jb3VudChjb25zdCBBVkZpbHRlclBhZCAqcGFkcykKK3sKKyAgICBpbnQgY291bnQ7CisKKyAgICBpZiAoIXBhZHMpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChjb3VudCA9IDA7IHBhZHMtPm5hbWU7IGNvdW50KyspCisgICAgICAgIHBhZHMrKzsKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X2ZpbHRlcl9uYW1lKHZvaWQgKmZpbHRlcl9jdHgpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBmaWx0ZXJfY3R4OworICAgIHJldHVybiBjdHgtPm5hbWUgPyBjdHgtPm5hbWUgOiBjdHgtPmZpbHRlci0+bmFtZTsKK30KKworc3RhdGljIHZvaWQgKmZpbHRlcl9jaGlsZF9uZXh0KHZvaWQgKm9iaiwgdm9pZCAqcHJldikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG9iajsKKyAgICBpZiAoIXByZXYgJiYgY3R4LT5maWx0ZXIgJiYgY3R4LT5maWx0ZXItPnByaXZfY2xhc3MgJiYgY3R4LT5wcml2KQorICAgICAgICByZXR1cm4gY3R4LT5wcml2OworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyAqZmlsdGVyX2NoaWxkX2NsYXNzX25leHQoY29uc3QgQVZDbGFzcyAqcHJldikKK3sKKyAgICBjb25zdCBBVkZpbHRlciAqZiA9IE5VTEw7CisKKyAgICAvKiBmaW5kIHRoZSBmaWx0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBwcmV2ICovCisgICAgd2hpbGUgKHByZXYgJiYgKGYgPSBhdmZpbHRlcl9uZXh0KGYpKSkKKyAgICAgICAgaWYgKGYtPnByaXZfY2xhc3MgPT0gcHJldikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgLyogY291bGQgbm90IGZpbmQgZmlsdGVyIGNvcnJlc3BvbmRpbmcgdG8gcHJldiAqLworICAgIGlmIChwcmV2ICYmICFmKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIGZpbmQgbmV4dCBmaWx0ZXIgd2l0aCBzcGVjaWZpYyBvcHRpb25zICovCisgICAgd2hpbGUgKChmID0gYXZmaWx0ZXJfbmV4dChmKSkpCisgICAgICAgIGlmIChmLT5wcml2X2NsYXNzKQorICAgICAgICAgICAgcmV0dXJuIGYtPnByaXZfY2xhc3M7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQVZGaWx0ZXJDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhdmZpbHRlcl9vcHRpb25zW10gPSB7CisgICAgeyAidGhyZWFkX3R5cGUiLCAiQWxsb3dlZCB0aHJlYWQgdHlwZXMiLCBPRkZTRVQodGhyZWFkX3R5cGUpLCBBVl9PUFRfVFlQRV9GTEFHUywKKyAgICAgICAgeyAuaTY0ID0gQVZGSUxURVJfVEhSRUFEX1NMSUNFIH0sIDAsIElOVF9NQVgsIEZMQUdTLCAidGhyZWFkX3R5cGUiIH0sCisgICAgICAgIHsgInNsaWNlIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWRklMVEVSX1RIUkVBRF9TTElDRSB9LCAudW5pdCA9ICJ0aHJlYWRfdHlwZSIgfSwKKyAgICB7ICJlbmFibGUiLCAic2V0IGVuYWJsZSBleHByZXNzaW9uIiwgT0ZGU0VUKGVuYWJsZV9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYXZmaWx0ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiQVZGaWx0ZXIiLAorICAgIC5pdGVtX25hbWUgID0gZGVmYXVsdF9maWx0ZXJfbmFtZSwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0ZJTFRFUiwKKyAgICAuY2hpbGRfbmV4dCA9IGZpbHRlcl9jaGlsZF9uZXh0LAorICAgIC5jaGlsZF9jbGFzc19uZXh0ID0gZmlsdGVyX2NoaWxkX2NsYXNzX25leHQsCisgICAgLm9wdGlvbiAgICAgICAgICAgPSBhdmZpbHRlcl9vcHRpb25zLAorfTsKKworc3RhdGljIGludCBkZWZhdWx0X2V4ZWN1dGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGF2ZmlsdGVyX2FjdGlvbl9mdW5jICpmdW5jLCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJldCwgaW50IG5iX2pvYnMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfam9iczsgaSsrKSB7CisgICAgICAgIGludCByID0gZnVuYyhjdHgsIGFyZywgaSwgbmJfam9icyk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXRbaV0gPSByOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworQVZGaWx0ZXJDb250ZXh0ICpmZl9maWx0ZXJfYWxsb2MoY29uc3QgQVZGaWx0ZXIgKmZpbHRlciwgY29uc3QgY2hhciAqaW5zdF9uYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqcmV0OworCisgICAgaWYgKCFmaWx0ZXIpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0ID0gYXZfbWFsbG9jeihzaXplb2YoQVZGaWx0ZXJDb250ZXh0KSk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0LT5hdl9jbGFzcyA9ICZhdmZpbHRlcl9jbGFzczsKKyAgICByZXQtPmZpbHRlciAgID0gZmlsdGVyOworICAgIHJldC0+bmFtZSAgICAgPSBpbnN0X25hbWUgPyBhdl9zdHJkdXAoaW5zdF9uYW1lKSA6IE5VTEw7CisgICAgaWYgKGZpbHRlci0+cHJpdl9zaXplKSB7CisgICAgICAgIHJldC0+cHJpdiAgICAgPSBhdl9tYWxsb2N6KGZpbHRlci0+cHJpdl9zaXplKTsKKyAgICAgICAgaWYgKCFyZXQtPnByaXYpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKHJldCk7CisgICAgaWYgKGZpbHRlci0+cHJpdl9jbGFzcykgeworICAgICAgICAqKGNvbnN0IEFWQ2xhc3MqKilyZXQtPnByaXYgPSBmaWx0ZXItPnByaXZfY2xhc3M7CisgICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHMocmV0LT5wcml2KTsKKyAgICB9CisKKyAgICByZXQtPmludGVybmFsID0gYXZfbWFsbG9jeihzaXplb2YoKnJldC0+aW50ZXJuYWwpKTsKKyAgICBpZiAoIXJldC0+aW50ZXJuYWwpCisgICAgICAgIGdvdG8gZXJyOworICAgIHJldC0+aW50ZXJuYWwtPmV4ZWN1dGUgPSBkZWZhdWx0X2V4ZWN1dGU7CisKKyAgICByZXQtPm5iX2lucHV0cyA9IGF2ZmlsdGVyX3BhZF9jb3VudChmaWx0ZXItPmlucHV0cyk7CisgICAgaWYgKHJldC0+bmJfaW5wdXRzICkgeworICAgICAgICByZXQtPmlucHV0X3BhZHMgICA9IGF2X21hbGxvY19hcnJheShyZXQtPm5iX2lucHV0cywgc2l6ZW9mKEFWRmlsdGVyUGFkKSk7CisgICAgICAgIGlmICghcmV0LT5pbnB1dF9wYWRzKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIG1lbWNweShyZXQtPmlucHV0X3BhZHMsIGZpbHRlci0+aW5wdXRzLCBzaXplb2YoQVZGaWx0ZXJQYWQpICogcmV0LT5uYl9pbnB1dHMpOworICAgICAgICByZXQtPmlucHV0cyAgICAgICA9IGF2X21hbGxvY3pfYXJyYXkocmV0LT5uYl9pbnB1dHMsIHNpemVvZihBVkZpbHRlckxpbmsqKSk7CisgICAgICAgIGlmICghcmV0LT5pbnB1dHMpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICByZXQtPm5iX291dHB1dHMgPSBhdmZpbHRlcl9wYWRfY291bnQoZmlsdGVyLT5vdXRwdXRzKTsKKyAgICBpZiAocmV0LT5uYl9vdXRwdXRzKSB7CisgICAgICAgIHJldC0+b3V0cHV0X3BhZHMgID0gYXZfbWFsbG9jX2FycmF5KHJldC0+bmJfb3V0cHV0cywgc2l6ZW9mKEFWRmlsdGVyUGFkKSk7CisgICAgICAgIGlmICghcmV0LT5vdXRwdXRfcGFkcykKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBtZW1jcHkocmV0LT5vdXRwdXRfcGFkcywgZmlsdGVyLT5vdXRwdXRzLCBzaXplb2YoQVZGaWx0ZXJQYWQpICogcmV0LT5uYl9vdXRwdXRzKTsKKyAgICAgICAgcmV0LT5vdXRwdXRzICAgICAgPSBhdl9tYWxsb2N6X2FycmF5KHJldC0+bmJfb3V0cHV0cywgc2l6ZW9mKEFWRmlsdGVyTGluayopKTsKKyAgICAgICAgaWYgKCFyZXQtPm91dHB1dHMpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CisjaWYgRkZfQVBJX0ZPT19DT1VOVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIHJldC0+b3V0cHV0X2NvdW50ID0gcmV0LT5uYl9vdXRwdXRzOworICAgIHJldC0+aW5wdXRfY291bnQgID0gcmV0LT5uYl9pbnB1dHM7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorCisgICAgcmV0dXJuIHJldDsKKworZXJyOgorICAgIGF2X2ZyZWVwKCZyZXQtPmlucHV0cyk7CisgICAgYXZfZnJlZXAoJnJldC0+aW5wdXRfcGFkcyk7CisgICAgcmV0LT5uYl9pbnB1dHMgPSAwOworICAgIGF2X2ZyZWVwKCZyZXQtPm91dHB1dHMpOworICAgIGF2X2ZyZWVwKCZyZXQtPm91dHB1dF9wYWRzKTsKKyAgICByZXQtPm5iX291dHB1dHMgPSAwOworICAgIGF2X2ZyZWVwKCZyZXQtPnByaXYpOworICAgIGF2X2ZyZWVwKCZyZXQtPmludGVybmFsKTsKKyAgICBhdl9mcmVlKHJldCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNpZiBGRl9BUElfQVZGSUxURVJfT1BFTgoraW50IGF2ZmlsdGVyX29wZW4oQVZGaWx0ZXJDb250ZXh0ICoqZmlsdGVyX2N0eCwgQVZGaWx0ZXIgKmZpbHRlciwgY29uc3QgY2hhciAqaW5zdF9uYW1lKQoreworICAgICpmaWx0ZXJfY3R4ID0gZmZfZmlsdGVyX2FsbG9jKGZpbHRlciwgaW5zdF9uYW1lKTsKKyAgICByZXR1cm4gKmZpbHRlcl9jdHggPyAwIDogQVZFUlJPUihFTk9NRU0pOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZyZWVfbGluayhBVkZpbHRlckxpbmsgKmxpbmspCit7CisgICAgaWYgKCFsaW5rKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobGluay0+c3JjKQorICAgICAgICBsaW5rLT5zcmMtPm91dHB1dHNbbGluay0+c3JjcGFkIC0gbGluay0+c3JjLT5vdXRwdXRfcGFkc10gPSBOVUxMOworICAgIGlmIChsaW5rLT5kc3QpCisgICAgICAgIGxpbmstPmRzdC0+aW5wdXRzW2xpbmstPmRzdHBhZCAtIGxpbmstPmRzdC0+aW5wdXRfcGFkc10gPSBOVUxMOworCisgICAgZmZfZm9ybWF0c191bnJlZigmbGluay0+aW5fZm9ybWF0cyk7CisgICAgZmZfZm9ybWF0c191bnJlZigmbGluay0+b3V0X2Zvcm1hdHMpOworICAgIGZmX2Zvcm1hdHNfdW5yZWYoJmxpbmstPmluX3NhbXBsZXJhdGVzKTsKKyAgICBmZl9mb3JtYXRzX3VucmVmKCZsaW5rLT5vdXRfc2FtcGxlcmF0ZXMpOworICAgIGZmX2NoYW5uZWxfbGF5b3V0c191bnJlZigmbGluay0+aW5fY2hhbm5lbF9sYXlvdXRzKTsKKyAgICBmZl9jaGFubmVsX2xheW91dHNfdW5yZWYoJmxpbmstPm91dF9jaGFubmVsX2xheW91dHMpOworICAgIGF2ZmlsdGVyX2xpbmtfZnJlZSgmbGluayk7Cit9CisKK3ZvaWQgYXZmaWx0ZXJfZnJlZShBVkZpbHRlckNvbnRleHQgKmZpbHRlcikKK3sKKyAgICBpbnQgaTsKKworICAgIGlmICghZmlsdGVyKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZmlsdGVyLT5ncmFwaCkKKyAgICAgICAgZmZfZmlsdGVyX2dyYXBoX3JlbW92ZV9maWx0ZXIoZmlsdGVyLT5ncmFwaCwgZmlsdGVyKTsKKworICAgIGlmIChmaWx0ZXItPmZpbHRlci0+dW5pbml0KQorICAgICAgICBmaWx0ZXItPmZpbHRlci0+dW5pbml0KGZpbHRlcik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBmcmVlX2xpbmsoZmlsdGVyLT5pbnB1dHNbaV0pOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyLT5uYl9vdXRwdXRzOyBpKyspIHsKKyAgICAgICAgZnJlZV9saW5rKGZpbHRlci0+b3V0cHV0c1tpXSk7CisgICAgfQorCisgICAgaWYgKGZpbHRlci0+ZmlsdGVyLT5wcml2X2NsYXNzKQorICAgICAgICBhdl9vcHRfZnJlZShmaWx0ZXItPnByaXYpOworCisgICAgYXZfZnJlZXAoJmZpbHRlci0+bmFtZSk7CisgICAgYXZfZnJlZXAoJmZpbHRlci0+aW5wdXRfcGFkcyk7CisgICAgYXZfZnJlZXAoJmZpbHRlci0+b3V0cHV0X3BhZHMpOworICAgIGF2X2ZyZWVwKCZmaWx0ZXItPmlucHV0cyk7CisgICAgYXZfZnJlZXAoJmZpbHRlci0+b3V0cHV0cyk7CisgICAgYXZfZnJlZXAoJmZpbHRlci0+cHJpdik7CisgICAgd2hpbGUoZmlsdGVyLT5jb21tYW5kX3F1ZXVlKXsKKyAgICAgICAgZmZfY29tbWFuZF9xdWV1ZV9wb3AoZmlsdGVyKTsKKyAgICB9CisgICAgYXZfb3B0X2ZyZWUoZmlsdGVyKTsKKyAgICBhdl9leHByX2ZyZWUoZmlsdGVyLT5lbmFibGUpOworICAgIGZpbHRlci0+ZW5hYmxlID0gTlVMTDsKKyAgICBhdl9mcmVlcCgmZmlsdGVyLT52YXJfdmFsdWVzKTsKKyAgICBhdl9mcmVlcCgmZmlsdGVyLT5pbnRlcm5hbCk7CisgICAgYXZfZnJlZShmaWx0ZXIpOworfQorCitzdGF0aWMgaW50IHByb2Nlc3Nfb3B0aW9ucyhBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZ3MpCit7CisgICAgY29uc3QgQVZPcHRpb24gKm8gPSBOVUxMOworICAgIGludCByZXQsIGNvdW50ID0gMDsKKyAgICBjaGFyICphdl91bmluaXQocGFyc2VkX2tleSksICphdl91bmluaXQodmFsdWUpOworICAgIGNvbnN0IGNoYXIgKmtleTsKKyAgICBpbnQgb2Zmc2V0PSAtMTsKKworICAgIGlmICghYXJncykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB3aGlsZSAoKmFyZ3MpIHsKKyAgICAgICAgY29uc3QgY2hhciAqc2hvcnRoYW5kID0gTlVMTDsKKworICAgICAgICBvID0gYXZfb3B0X25leHQoY3R4LT5wcml2LCBvKTsKKyAgICAgICAgaWYgKG8pIHsKKyAgICAgICAgICAgIGlmIChvLT50eXBlID09IEFWX09QVF9UWVBFX0NPTlNUIHx8IG8tPm9mZnNldCA9PSBvZmZzZXQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBvZmZzZXQgPSBvLT5vZmZzZXQ7CisgICAgICAgICAgICBzaG9ydGhhbmQgPSBvLT5uYW1lOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZfb3B0X2dldF9rZXlfdmFsdWUoJmFyZ3MsICI9IiwgIjoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydGhhbmQgPyBBVl9PUFRfRkxBR19JTVBMSUNJVF9LRVkgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2VkX2tleSwgJnZhbHVlKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFSU5WQUwpKQorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIG9wdGlvbiBuYW1lIG5lYXIgJyVzJ1xuIiwgYXJncyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHBhcnNlICclcyc6ICVzXG4iLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKmFyZ3MpCisgICAgICAgICAgICBhcmdzKys7CisgICAgICAgIGlmIChwYXJzZWRfa2V5KSB7CisgICAgICAgICAgICBrZXkgPSBwYXJzZWRfa2V5OworICAgICAgICAgICAgd2hpbGUgKChvID0gYXZfb3B0X25leHQoY3R4LT5wcml2LCBvKSkpOyAvKiBkaXNjYXJkIGFsbCByZW1haW5pbmcgc2hvcnRoYW5kICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBrZXkgPSBzaG9ydGhhbmQ7CisgICAgICAgIH0KKworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJTZXR0aW5nICclcycgdG8gdmFsdWUgJyVzJ1xuIiwga2V5LCB2YWx1ZSk7CisKKyAgICAgICAgaWYgKGF2X29wdF9maW5kKGN0eCwga2V5LCBOVUxMLCAwLCAwKSkgeworICAgICAgICAgICAgcmV0ID0gYXZfb3B0X3NldChjdHgsIGtleSwgdmFsdWUsIDApOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHBhcnNlZF9rZXkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2RpY3Rfc2V0KG9wdGlvbnMsIGtleSwgdmFsdWUsIDApOworICAgICAgICBpZiAoKHJldCA9IGF2X29wdF9zZXQoY3R4LT5wcml2LCBrZXksIHZhbHVlLCAwKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoIWF2X29wdF9maW5kKGN0eC0+cHJpdiwga2V5LCBOVUxMLCAwLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOIHwgQVZfT1BUX1NFQVJDSF9GQUtFX09CSikpIHsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk9wdGlvbiAnJXMnIG5vdCBmb3VuZFxuIiwga2V5KTsKKyAgICAgICAgICAgIGF2X2ZyZWUodmFsdWUpOworICAgICAgICAgICAgYXZfZnJlZShwYXJzZWRfa2V5KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyZWUodmFsdWUpOworICAgICAgICBhdl9mcmVlKHBhcnNlZF9rZXkpOworICAgICAgICBjb3VudCsrOworICAgIH0KKworICAgIGlmIChjdHgtPmVuYWJsZV9zdHIpIHsKKyAgICAgICAgcmV0ID0gc2V0X2VuYWJsZV9leHByKGN0eCwgY3R4LT5lbmFibGVfc3RyKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKyNpZiBGRl9BUElfQVZGSUxURVJfSU5JVF9GSUxURVIKK2ludCBhdmZpbHRlcl9pbml0X2ZpbHRlcihBVkZpbHRlckNvbnRleHQgKmZpbHRlciwgY29uc3QgY2hhciAqYXJncywgdm9pZCAqb3BhcXVlKQoreworICAgIHJldHVybiBhdmZpbHRlcl9pbml0X3N0cihmaWx0ZXIsIGFyZ3MpOworfQorI2VuZGlmCisKK2ludCBhdmZpbHRlcl9pbml0X2RpY3QoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICByZXQgPSBhdl9vcHRfc2V0X2RpY3QoY3R4LCBvcHRpb25zKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhcHBseWluZyBnZW5lcmljIGZpbHRlciBvcHRpb25zLlxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZmlsdGVyLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUyAmJgorICAgICAgICBjdHgtPnRocmVhZF90eXBlICYgY3R4LT5ncmFwaC0+dGhyZWFkX3R5cGUgJiBBVkZJTFRFUl9USFJFQURfU0xJQ0UgJiYKKyAgICAgICAgY3R4LT5ncmFwaC0+aW50ZXJuYWwtPnRocmVhZF9leGVjdXRlKSB7CisgICAgICAgIGN0eC0+dGhyZWFkX3R5cGUgICAgICAgPSBBVkZJTFRFUl9USFJFQURfU0xJQ0U7CisgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUgPSBjdHgtPmdyYXBoLT5pbnRlcm5hbC0+dGhyZWFkX2V4ZWN1dGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT50aHJlYWRfdHlwZSA9IDA7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZmlsdGVyLT5wcml2X2NsYXNzKSB7CisgICAgICAgIHJldCA9IGF2X29wdF9zZXRfZGljdChjdHgtPnByaXYsIG9wdGlvbnMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYXBwbHlpbmcgb3B0aW9ucyB0byB0aGUgZmlsdGVyLlxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN0eC0+ZmlsdGVyLT5pbml0X29wYXF1ZSkKKyAgICAgICAgcmV0ID0gY3R4LT5maWx0ZXItPmluaXRfb3BhcXVlKGN0eCwgTlVMTCk7CisgICAgZWxzZSBpZiAoY3R4LT5maWx0ZXItPmluaXQpCisgICAgICAgIHJldCA9IGN0eC0+ZmlsdGVyLT5pbml0KGN0eCk7CisgICAgZWxzZSBpZiAoY3R4LT5maWx0ZXItPmluaXRfZGljdCkKKyAgICAgICAgcmV0ID0gY3R4LT5maWx0ZXItPmluaXRfZGljdChjdHgsIG9wdGlvbnMpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2ZmlsdGVyX2luaXRfc3RyKEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyLCBjb25zdCBjaGFyICphcmdzKQoreworICAgIEFWRGljdGlvbmFyeSAqb3B0aW9ucyA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmU7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoYXJncyAmJiAqYXJncykgeworICAgICAgICBpZiAoIWZpbHRlci0+ZmlsdGVyLT5wcml2X2NsYXNzKSB7CisgICAgICAgICAgICBhdl9sb2coZmlsdGVyLCBBVl9MT0dfRVJST1IsICJUaGlzIGZpbHRlciBkb2VzIG5vdCB0YWtlIGFueSAiCisgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMsIGJ1dCBvcHRpb25zIHdlcmUgcHJvdmlkZWQ6ICVzLlxuIiwgYXJncyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyNpZiBGRl9BUElfT0xEX0ZJTFRFUl9PUFRTCisgICAgICAgICAgICBpZiAoICAgIXN0cmNtcChmaWx0ZXItPmZpbHRlci0+bmFtZSwgImZvcm1hdCIpICAgICB8fAorICAgICAgICAgICAgICAgICAgICFzdHJjbXAoZmlsdGVyLT5maWx0ZXItPm5hbWUsICJub2Zvcm1hdCIpICAgfHwKKyAgICAgICAgICAgICAgICAgICAhc3RyY21wKGZpbHRlci0+ZmlsdGVyLT5uYW1lLCAiZnJlaTByIikgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIXN0cmNtcChmaWx0ZXItPmZpbHRlci0+bmFtZSwgImZyZWkwcl9zcmMiKSB8fAorICAgICAgICAgICAgICAgICAgICFzdHJjbXAoZmlsdGVyLT5maWx0ZXItPm5hbWUsICJvY3YiKSAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAhc3RyY21wKGZpbHRlci0+ZmlsdGVyLT5uYW1lLCAicGFuIikgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIXN0cmNtcChmaWx0ZXItPmZpbHRlci0+bmFtZSwgInBwIikgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICFzdHJjbXAoZmlsdGVyLT5maWx0ZXItPm5hbWUsICJhZXZhbHNyYyIpKSB7CisgICAgICAgICAgICAvKiBhIGhhY2sgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIHN5bnRheAorICAgICAgICAgICAgICogcmVwbGFjZSBjb2xvbnMgd2l0aCB8cyAqLworICAgICAgICAgICAgY2hhciAqY29weSA9IGF2X3N0cmR1cChhcmdzKTsKKyAgICAgICAgICAgIGNoYXIgKnAgICAgPSBjb3B5OworICAgICAgICAgICAgaW50IG5iX2xlYWRpbmcgPSAwOyAvLyBudW1iZXIgb2YgbGVhZGluZyBjb2xvbnMgdG8gc2tpcAorICAgICAgICAgICAgaW50IGRlcHJlY2F0ZWQgPSAwOworCisgICAgICAgICAgICBpZiAoIWNvcHkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXN0cmNtcChmaWx0ZXItPmZpbHRlci0+bmFtZSwgImZyZWkwciIpIHx8CisgICAgICAgICAgICAgICAgIXN0cmNtcChmaWx0ZXItPmZpbHRlci0+bmFtZSwgIm9jdiIpKQorICAgICAgICAgICAgICAgIG5iX2xlYWRpbmcgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChmaWx0ZXItPmZpbHRlci0+bmFtZSwgImZyZWkwcl9zcmMiKSkKKyAgICAgICAgICAgICAgICBuYl9sZWFkaW5nID0gMzsKKworICAgICAgICAgICAgd2hpbGUgKG5iX2xlYWRpbmctLSkgeworICAgICAgICAgICAgICAgIHAgPSBzdHJjaHIocCwgJzonKTsKKyAgICAgICAgICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgICAgICAgICAgcCA9IGNvcHkgKyBzdHJsZW4oY29weSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlcHJlY2F0ZWQgPSBzdHJjaHIocCwgJzonKSAhPSBOVUxMOworCisgICAgICAgICAgICBpZiAoIXN0cmNtcChmaWx0ZXItPmZpbHRlci0+bmFtZSwgImFldmFsc3JjIikpIHsKKyAgICAgICAgICAgICAgICBkZXByZWNhdGVkID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHAgPSBzdHJjaHIocCwgJzonKSkgJiYgcFsxXSAhPSAnOicpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXBvcyA9IHN0cmNocihwICsgMSwgJz0nKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3BvcyA9IHN0cmNocihwICsgMSwgJzonKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5leHRfdG9rZW5faXNfb3B0ID0gZXBvcyAmJiAoIXNwb3MgfHwgZXBvcyA8IHNwb3MpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV4dF90b2tlbl9pc19vcHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgdG9rZW4gZG9lcyBub3QgY29udGFpbiBhICc9JywgYXNzdW1lIGEgY2hhbm5lbCBleHByZXNzaW9uICovCisgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gJ3wnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocCAmJiAqcCA9PSAnOicpIHsgLy8gZG91YmxlIHNlcCAnOjonIGZvdW5kCisgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKHAsIHAgKyAxLCBzdHJsZW4ocCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgd2hpbGUgKChwID0gc3RyY2hyKHAsICc6JykpKQorICAgICAgICAgICAgICAgICpwKysgPSAnfCc7CisKKyAgICAgICAgICAgIGlmIChkZXByZWNhdGVkKQorICAgICAgICAgICAgICAgIGF2X2xvZyhmaWx0ZXIsIEFWX0xPR19XQVJOSU5HLCAiVGhpcyBzeW50YXggaXMgZGVwcmVjYXRlZC4gVXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIid8JyB0byBzZXBhcmF0ZSB0aGUgbGlzdCBpdGVtcy5cbiIpOworCisgICAgICAgICAgICBhdl9sb2coZmlsdGVyLCBBVl9MT0dfREVCVUcsICJjb21wYXQ6IGNhbGxlZCB3aXRoIGFyZ3M9WyVzXVxuIiwgY29weSk7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzX29wdGlvbnMoZmlsdGVyLCAmb3B0aW9ucywgY29weSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmY29weSk7CisKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworI2lmIENPTkZJR19NUF9GSUxURVIKKyAgICAgICAgICAgIGlmICghc3RyY21wKGZpbHRlci0+ZmlsdGVyLT5uYW1lLCAibXAiKSkgeworICAgICAgICAgICAgICAgIGNoYXIgKmVzY2FwZWQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoYXJncywgImZpbHRlcj0iLCA3KSkKKyAgICAgICAgICAgICAgICAgICAgYXJncyArPSA3OworICAgICAgICAgICAgICAgIHJldCA9IGF2X2VzY2FwZSgmZXNjYXBlZCwgYXJncywgIjo9IiwgQVZfRVNDQVBFX01PREVfQkFDS1NMQVNILCAwKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coZmlsdGVyLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gZXNjYXBlIE1QbGF5ZXIgZmlsdGVycyBhcmcgJyVzJ1xuIiwgYXJncyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc19vcHRpb25zKGZpbHRlciwgJm9wdGlvbnMsIGVzY2FwZWQpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoZXNjYXBlZCk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc19vcHRpb25zKGZpbHRlciwgJm9wdGlvbnMsIGFyZ3MpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gYXZmaWx0ZXJfaW5pdF9kaWN0KGZpbHRlciwgJm9wdGlvbnMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoKGUgPSBhdl9kaWN0X2dldChvcHRpb25zLCAiIiwgTlVMTCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgYXZfbG9nKGZpbHRlciwgQVZfTE9HX0VSUk9SLCAiTm8gc3VjaCBvcHRpb246ICVzLlxuIiwgZS0+a2V5KTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIGF2X2RpY3RfZnJlZSgmb3B0aW9ucyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyICphdmZpbHRlcl9wYWRfZ2V0X25hbWUoY29uc3QgQVZGaWx0ZXJQYWQgKnBhZHMsIGludCBwYWRfaWR4KQoreworICAgIHJldHVybiBwYWRzW3BhZF9pZHhdLm5hbWU7Cit9CisKK2VudW0gQVZNZWRpYVR5cGUgYXZmaWx0ZXJfcGFkX2dldF90eXBlKGNvbnN0IEFWRmlsdGVyUGFkICpwYWRzLCBpbnQgcGFkX2lkeCkKK3sKKyAgICByZXR1cm4gcGFkc1twYWRfaWR4XS50eXBlOworfQorCitzdGF0aWMgaW50IGRlZmF1bHRfZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShsaW5rLT5kc3QtPm91dHB1dHNbMF0sIGZyYW1lKTsKK30KKworc3RhdGljIGludCBmZl9maWx0ZXJfZnJhbWVfZnJhbWVkKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50ICgqZmlsdGVyX2ZyYW1lKShBVkZpbHRlckxpbmsgKiwgQVZGcmFtZSAqKTsKKyAgICBBVkZpbHRlckNvbnRleHQgKmRzdGN0eCA9IGxpbmstPmRzdDsKKyAgICBBVkZpbHRlclBhZCAqZHN0ID0gbGluay0+ZHN0cGFkOworICAgIEFWRnJhbWUgKm91dCA9IE5VTEw7CisgICAgaW50IHJldDsKKyAgICBBVkZpbHRlckNvbW1hbmQgKmNtZD0gbGluay0+ZHN0LT5jb21tYW5kX3F1ZXVlOworICAgIGludDY0X3QgcHRzOworCisgICAgaWYgKGxpbmstPmNsb3NlZCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisKKyAgICBpZiAoIShmaWx0ZXJfZnJhbWUgPSBkc3QtPmZpbHRlcl9mcmFtZSkpCisgICAgICAgIGZpbHRlcl9mcmFtZSA9IGRlZmF1bHRfZmlsdGVyX2ZyYW1lOworCisgICAgLyogY29weSB0aGUgZnJhbWUgaWYgbmVlZGVkICovCisgICAgaWYgKGRzdC0+bmVlZHNfd3JpdGFibGUgJiYgIWF2X2ZyYW1lX2lzX3dyaXRhYmxlKGZyYW1lKSkgeworICAgICAgICBhdl9sb2cobGluay0+ZHN0LCBBVl9MT0dfREVCVUcsICJDb3B5aW5nIGRhdGEgaW4gYXZmaWx0ZXIuXG4iKTsKKworICAgICAgICAvKiBNYXliZSB1c2UgZmZfY29weV9idWZmZXJfcmVmIGluc3RlYWQ/ICovCisgICAgICAgIHN3aXRjaCAobGluay0+dHlwZSkgeworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIobGluaywgbGluay0+dywgbGluay0+aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGxpbmssIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgZnJhbWUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBzd2l0Y2ggKGxpbmstPnR5cGUpIHsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5KG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwgKGNvbnN0IHVpbnQ4X3QgKiopZnJhbWUtPmRhdGEsIGZyYW1lLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmZvcm1hdCwgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgICAgIGF2X3NhbXBsZXNfY29weShvdXQtPmV4dGVuZGVkX2RhdGEsIGZyYW1lLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGZyYW1lLT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5mb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgfSBlbHNlCisgICAgICAgIG91dCA9IGZyYW1lOworCisgICAgd2hpbGUoY21kICYmIGNtZC0+dGltZSA8PSBvdXQtPnB0cyAqIGF2X3EyZChsaW5rLT50aW1lX2Jhc2UpKXsKKyAgICAgICAgYXZfbG9nKGxpbmstPmRzdCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgIlByb2Nlc3NpbmcgY29tbWFuZCB0aW1lOiVmIGNvbW1hbmQ6JXMgYXJnOiVzXG4iLAorICAgICAgICAgICAgICAgY21kLT50aW1lLCBjbWQtPmNvbW1hbmQsIGNtZC0+YXJnKTsKKyAgICAgICAgYXZmaWx0ZXJfcHJvY2Vzc19jb21tYW5kKGxpbmstPmRzdCwgY21kLT5jb21tYW5kLCBjbWQtPmFyZywgMCwgMCwgY21kLT5mbGFncyk7CisgICAgICAgIGZmX2NvbW1hbmRfcXVldWVfcG9wKGxpbmstPmRzdCk7CisgICAgICAgIGNtZD0gbGluay0+ZHN0LT5jb21tYW5kX3F1ZXVlOworICAgIH0KKworICAgIHB0cyA9IG91dC0+cHRzOworICAgIGlmIChkc3RjdHgtPmVuYWJsZV9zdHIpIHsKKyAgICAgICAgaW50NjRfdCBwb3MgPSBhdl9mcmFtZV9nZXRfcGt0X3BvcyhvdXQpOworICAgICAgICBkc3RjdHgtPnZhcl92YWx1ZXNbVkFSX05dID0gbGluay0+ZnJhbWVfY291bnQ7CisgICAgICAgIGRzdGN0eC0+dmFyX3ZhbHVlc1tWQVJfVF0gPSBwdHMgPT0gQVZfTk9QVFNfVkFMVUUgPyBOQU4gOiBwdHMgKiBhdl9xMmQobGluay0+dGltZV9iYXNlKTsKKyAgICAgICAgZHN0Y3R4LT52YXJfdmFsdWVzW1ZBUl9XXSA9IGxpbmstPnc7CisgICAgICAgIGRzdGN0eC0+dmFyX3ZhbHVlc1tWQVJfSF0gPSBsaW5rLT5oOworICAgICAgICBkc3RjdHgtPnZhcl92YWx1ZXNbVkFSX1BPU10gPSBwb3MgPT0gLTEgPyBOQU4gOiBwb3M7CisKKyAgICAgICAgZHN0Y3R4LT5pc19kaXNhYmxlZCA9IGZhYnMoYXZfZXhwcl9ldmFsKGRzdGN0eC0+ZW5hYmxlLCBkc3RjdHgtPnZhcl92YWx1ZXMsIE5VTEwpKSA8IDAuNTsKKyAgICAgICAgaWYgKGRzdGN0eC0+aXNfZGlzYWJsZWQgJiYKKyAgICAgICAgICAgIChkc3RjdHgtPmZpbHRlci0+ZmxhZ3MgJiBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQykpCisgICAgICAgICAgICBmaWx0ZXJfZnJhbWUgPSBkZWZhdWx0X2ZpbHRlcl9mcmFtZTsKKyAgICB9CisgICAgcmV0ID0gZmlsdGVyX2ZyYW1lKGxpbmssIG91dCk7CisgICAgbGluay0+ZnJhbWVfY291bnQrKzsKKyAgICBsaW5rLT5mcmFtZV9yZXF1ZXN0ZWQgPSAwOworICAgIGZmX3VwZGF0ZV9saW5rX2N1cnJlbnRfcHRzKGxpbmssIHB0cyk7CisgICAgcmV0dXJuIHJldDsKKworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZmX2ZpbHRlcl9mcmFtZV9uZWVkc19mcmFtaW5nKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IGluc2FtcGxlcyA9IGZyYW1lLT5uYl9zYW1wbGVzLCBpbnBvcyA9IDAsIG5iX3NhbXBsZXM7CisgICAgQVZGcmFtZSAqcGJ1ZiA9IGxpbmstPnBhcnRpYWxfYnVmOworICAgIGludCBuYl9jaGFubmVscyA9IGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSk7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBsaW5rLT5mbGFncyB8PSBGRl9MSU5LX0ZMQUdfUkVRVUVTVF9MT09QOworICAgIC8qIEhhbmRsZSBmcmFtaW5nIChtaW5fc2FtcGxlcywgbWF4X3NhbXBsZXMpICovCisgICAgd2hpbGUgKGluc2FtcGxlcykgeworICAgICAgICBpZiAoIXBidWYpIHsKKyAgICAgICAgICAgIEFWUmF0aW9uYWwgc2FtcGxlc190YiA9IHsgMSwgbGluay0+c2FtcGxlX3JhdGUgfTsKKyAgICAgICAgICAgIHBidWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGxpbmssIGxpbmstPnBhcnRpYWxfYnVmX3NpemUpOworICAgICAgICAgICAgaWYgKCFwYnVmKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGxpbmstPmRzdCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJTYW1wbGVzIGRyb3BwZWQgZHVlIHRvIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMocGJ1ZiwgZnJhbWUpOworICAgICAgICAgICAgcGJ1Zi0+cHRzID0gZnJhbWUtPnB0czsKKyAgICAgICAgICAgIGlmIChwYnVmLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgcGJ1Zi0+cHRzICs9IGF2X3Jlc2NhbGVfcShpbnBvcywgc2FtcGxlc190YiwgbGluay0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgIHBidWYtPm5iX3NhbXBsZXMgPSAwOworICAgICAgICB9CisgICAgICAgIG5iX3NhbXBsZXMgPSBGRk1JTihpbnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5wYXJ0aWFsX2J1Zl9zaXplIC0gcGJ1Zi0+bmJfc2FtcGxlcyk7CisgICAgICAgIGF2X3NhbXBsZXNfY29weShwYnVmLT5leHRlbmRlZF9kYXRhLCBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBidWYtPm5iX3NhbXBsZXMsIGlucG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgbmJfc2FtcGxlcywgbmJfY2hhbm5lbHMsIGxpbmstPmZvcm1hdCk7CisgICAgICAgIGlucG9zICAgICAgICAgICAgICAgICAgICs9IG5iX3NhbXBsZXM7CisgICAgICAgIGluc2FtcGxlcyAgICAgICAgICAgICAgIC09IG5iX3NhbXBsZXM7CisgICAgICAgIHBidWYtPm5iX3NhbXBsZXMgKz0gbmJfc2FtcGxlczsKKyAgICAgICAgaWYgKHBidWYtPm5iX3NhbXBsZXMgPj0gbGluay0+bWluX3NhbXBsZXMpIHsKKyAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZV9mcmFtZWQobGluaywgcGJ1Zik7CisgICAgICAgICAgICBwYnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgbGluay0+cGFydGlhbF9idWYgPSBwYnVmOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBGRl9UUFJJTlRGX1NUQVJUKE5VTEwsIGZpbHRlcl9mcmFtZSk7IGZmX3Rsb2dfbGluayhOVUxMLCBsaW5rLCAxKTsgZmZfdGxvZyhOVUxMLCAiICIpOyBmZl90bG9nX3JlZihOVUxMLCBmcmFtZSwgMSk7CisKKyAgICAvKiBDb25zaXN0ZW5jeSBjaGVja3MgKi8KKyAgICBpZiAobGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgaWYgKHN0cmNtcChsaW5rLT5kc3QtPmZpbHRlci0+bmFtZSwgInNjYWxlIikpIHsKKyAgICAgICAgICAgIGF2X2Fzc2VydDEoZnJhbWUtPmZvcm1hdCAgICAgICAgICAgICAgICAgPT0gbGluay0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDEoZnJhbWUtPndpZHRoICAgICAgICAgICAgICAgPT0gbGluay0+dyk7CisgICAgICAgICAgICBhdl9hc3NlcnQxKGZyYW1lLT5oZWlnaHQgICAgICAgICAgICAgICA9PSBsaW5rLT5oKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2Fzc2VydDEoZnJhbWUtPmZvcm1hdCAgICAgICAgICAgICAgICA9PSBsaW5rLT5mb3JtYXQpOworICAgICAgICBhdl9hc3NlcnQxKGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSkgPT0gbGluay0+Y2hhbm5lbHMpOworICAgICAgICBhdl9hc3NlcnQxKGZyYW1lLT5jaGFubmVsX2xheW91dCAgICAgICAgPT0gbGluay0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICBhdl9hc3NlcnQxKGZyYW1lLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPT0gbGluay0+c2FtcGxlX3JhdGUpOworICAgIH0KKworICAgIC8qIEdvIGRpcmVjdGx5IHRvIGFjdHVhbCBmaWx0ZXJpbmcgaWYgcG9zc2libGUgKi8KKyAgICBpZiAobGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKKyAgICAgICAgbGluay0+bWluX3NhbXBsZXMgJiYKKyAgICAgICAgKGxpbmstPnBhcnRpYWxfYnVmIHx8CisgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyA8IGxpbmstPm1pbl9zYW1wbGVzIHx8CisgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyA+IGxpbmstPm1heF9zYW1wbGVzKSkgeworICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lX25lZWRzX2ZyYW1pbmcobGluaywgZnJhbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWVfZnJhbWVkKGxpbmssIGZyYW1lKTsKKyAgICB9Cit9CisKK2NvbnN0IEFWQ2xhc3MgKmF2ZmlsdGVyX2dldF9jbGFzcyh2b2lkKQoreworICAgIHJldHVybiAmYXZmaWx0ZXJfY2xhc3M7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYXZmaWx0ZXIuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9hdmZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjIwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZmaWx0ZXIuaApAQCAtMCwwICsxLDE1MzEgQEAKKy8qCisgKiBmaWx0ZXIgbGF5ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCb2JieSBCaW5naGFtCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfQVZGSUxURVJfSAorI2RlZmluZSBBVkZJTFRFUl9BVkZJTFRFUl9ICisKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdmZpCisgKiBNYWluIGxpYmF2ZmlsdGVyIHB1YmxpYyBBUEkgaGVhZGVyCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2ZmkgTGliYXZmaWx0ZXIgLSBncmFwaC1iYXNlZCBmcmFtZSBlZGl0aW5nIGxpYnJhcnkKKyAqIEB7CisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmF0aW9uYWwuaCIKKworI2luY2x1ZGUgImxpYmF2ZmlsdGVyL3ZlcnNpb24uaCIKKworLyoqCisgKiBSZXR1cm4gdGhlIExJQkFWRklMVEVSX1ZFUlNJT05fSU5UIGNvbnN0YW50LgorICovCit1bnNpZ25lZCBhdmZpbHRlcl92ZXJzaW9uKHZvaWQpOworCisvKioKKyAqIFJldHVybiB0aGUgbGliYXZmaWx0ZXIgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uLgorICovCitjb25zdCBjaGFyICphdmZpbHRlcl9jb25maWd1cmF0aW9uKHZvaWQpOworCisvKioKKyAqIFJldHVybiB0aGUgbGliYXZmaWx0ZXIgbGljZW5zZS4KKyAqLworY29uc3QgY2hhciAqYXZmaWx0ZXJfbGljZW5zZSh2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgQVZGaWx0ZXJDb250ZXh0IEFWRmlsdGVyQ29udGV4dDsKK3R5cGVkZWYgc3RydWN0IEFWRmlsdGVyTGluayAgICBBVkZpbHRlckxpbms7Cit0eXBlZGVmIHN0cnVjdCBBVkZpbHRlclBhZCAgICAgQVZGaWx0ZXJQYWQ7Cit0eXBlZGVmIHN0cnVjdCBBVkZpbHRlckZvcm1hdHMgQVZGaWx0ZXJGb3JtYXRzOworCisjaWYgRkZfQVBJX0FWRklMVEVSQlVGRkVSCisvKioKKyAqIEEgcmVmZXJlbmNlLWNvdW50ZWQgYnVmZmVyIGRhdGEgdHlwZSB1c2VkIGJ5IHRoZSBmaWx0ZXIgc3lzdGVtLiBGaWx0ZXJzCisgKiBzaG91bGQgbm90IHN0b3JlIHBvaW50ZXJzIHRvIHRoaXMgc3RydWN0dXJlIGRpcmVjdGx5LCBidXQgaW5zdGVhZCB1c2UgdGhlCisgKiBBVkZpbHRlckJ1ZmZlclJlZiBzdHJ1Y3R1cmUgYmVsb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWRmlsdGVyQnVmZmVyIHsKKyAgICB1aW50OF90ICpkYXRhWzhdOyAgICAgICAgICAgLy8vPCBidWZmZXIgZGF0YSBmb3IgZWFjaCBwbGFuZS9jaGFubmVsCisKKyAgICAvKioKKyAgICAgKiBwb2ludGVycyB0byB0aGUgZGF0YSBwbGFuZXMvY2hhbm5lbHMuCisgICAgICoKKyAgICAgKiBGb3IgdmlkZW8sIHRoaXMgc2hvdWxkIHNpbXBseSBwb2ludCB0byBkYXRhW10uCisgICAgICoKKyAgICAgKiBGb3IgcGxhbmFyIGF1ZGlvLCBlYWNoIGNoYW5uZWwgaGFzIGEgc2VwYXJhdGUgZGF0YSBwb2ludGVyLCBhbmQKKyAgICAgKiBsaW5lc2l6ZVswXSBjb250YWlucyB0aGUgc2l6ZSBvZiBlYWNoIGNoYW5uZWwgYnVmZmVyLgorICAgICAqIEZvciBwYWNrZWQgYXVkaW8sIHRoZXJlIGlzIGp1c3Qgb25lIGRhdGEgcG9pbnRlciwgYW5kIGxpbmVzaXplWzBdCisgICAgICogY29udGFpbnMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGJ1ZmZlciBmb3IgYWxsIGNoYW5uZWxzLgorICAgICAqCisgICAgICogTm90ZTogQm90aCBkYXRhIGFuZCBleHRlbmRlZF9kYXRhIHdpbGwgYWx3YXlzIGJlIHNldCwgYnV0IGZvciBwbGFuYXIKKyAgICAgKiBhdWRpbyB3aXRoIG1vcmUgY2hhbm5lbHMgdGhhdCBjYW4gZml0IGluIGRhdGEsIGV4dGVuZGVkX2RhdGEgbXVzdCBiZSB1c2VkCisgICAgICogaW4gb3JkZXIgdG8gYWNjZXNzIGFsbCBjaGFubmVscy4KKyAgICAgKi8KKyAgICB1aW50OF90ICoqZXh0ZW5kZWRfZGF0YTsKKyAgICBpbnQgbGluZXNpemVbOF07ICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgYnl0ZXMgcGVyIGxpbmUKKworICAgIC8qKiBwcml2YXRlIGRhdGEgdG8gYmUgdXNlZCBieSBhIGN1c3RvbSBmcmVlIGZ1bmN0aW9uICovCisgICAgdm9pZCAqcHJpdjsKKyAgICAvKioKKyAgICAgKiBBIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRvIGRlYWxsb2NhdGUgdGhpcyBidWZmZXIgaWYgdGhlIGRlZmF1bHQKKyAgICAgKiBmdW5jdGlvbiBpcyBub3Qgc3VmZmljaWVudC4gVGhpcyBjb3VsZCwgZm9yIGV4YW1wbGUsIGFkZCB0aGUgbWVtb3J5CisgICAgICogYmFjayBpbnRvIGEgbWVtb3J5IHBvb2wgdG8gYmUgcmV1c2VkIGxhdGVyIHdpdGhvdXQgdGhlIG92ZXJoZWFkIG9mCisgICAgICogcmVhbGxvY2F0aW5nIGl0IGZyb20gc2NyYXRjaC4KKyAgICAgKi8KKyAgICB2b2lkICgqZnJlZSkoc3RydWN0IEFWRmlsdGVyQnVmZmVyICpidWYpOworCisgICAgaW50IGZvcm1hdDsgICAgICAgICAgICAgICAgIC8vLzwgbWVkaWEgZm9ybWF0CisgICAgaW50IHcsIGg7ICAgICAgICAgICAgICAgICAgIC8vLzwgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlcgorICAgIHVuc2lnbmVkIHJlZmNvdW50OyAgICAgICAgICAvLy88IG51bWJlciBvZiByZWZlcmVuY2VzIHRvIHRoaXMgYnVmZmVyCit9IEFWRmlsdGVyQnVmZmVyOworCisjZGVmaW5lIEFWX1BFUk1fUkVBRCAgICAgMHgwMSAgIC8vLzwgY2FuIHJlYWQgZnJvbSB0aGUgYnVmZmVyCisjZGVmaW5lIEFWX1BFUk1fV1JJVEUgICAgMHgwMiAgIC8vLzwgY2FuIHdyaXRlIHRvIHRoZSBidWZmZXIKKyNkZWZpbmUgQVZfUEVSTV9QUkVTRVJWRSAweDA0ICAgLy8vPCBub2JvZHkgZWxzZSBjYW4gb3ZlcndyaXRlIHRoZSBidWZmZXIKKyNkZWZpbmUgQVZfUEVSTV9SRVVTRSAgICAweDA4ICAgLy8vPCBjYW4gb3V0cHV0IHRoZSBidWZmZXIgbXVsdGlwbGUgdGltZXMsIHdpdGggdGhlIHNhbWUgY29udGVudHMgZWFjaCB0aW1lCisjZGVmaW5lIEFWX1BFUk1fUkVVU0UyICAgMHgxMCAgIC8vLzwgY2FuIG91dHB1dCB0aGUgYnVmZmVyIG11bHRpcGxlIHRpbWVzLCBtb2RpZmllZCBlYWNoIHRpbWUKKyNkZWZpbmUgQVZfUEVSTV9ORUdfTElORVNJWkVTIDB4MjAgIC8vLzwgdGhlIGJ1ZmZlciByZXF1ZXN0ZWQgY2FuIGhhdmUgbmVnYXRpdmUgbGluZXNpemVzCisjZGVmaW5lIEFWX1BFUk1fQUxJR04gICAgMHg0MCAgIC8vLzwgdGhlIGJ1ZmZlciBtdXN0IGJlIGFsaWduZWQKKworI2RlZmluZSBBVkZJTFRFUl9BTElHTiAxNiAvL25vdCBwYXJ0IG9mIEFCSQorCisvKioKKyAqIEF1ZGlvIHNwZWNpZmljIHByb3BlcnRpZXMgaW4gYSByZWZlcmVuY2UgdG8gYW4gQVZGaWx0ZXJCdWZmZXIuIFNpbmNlCisgKiBBVkZpbHRlckJ1ZmZlclJlZiBpcyBjb21tb24gdG8gZGlmZmVyZW50IG1lZGlhIGZvcm1hdHMsIGF1ZGlvIHNwZWNpZmljCisgKiBwZXIgcmVmZXJlbmNlIHByb3BlcnRpZXMgbXVzdCBiZSBzZXBhcmF0ZWQgb3V0LgorICovCit0eXBlZGVmIHN0cnVjdCBBVkZpbHRlckJ1ZmZlclJlZkF1ZGlvUHJvcHMgeworICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OyAgICAvLy88IGNoYW5uZWwgbGF5b3V0IG9mIGF1ZGlvIGJ1ZmZlcgorICAgIGludCBuYl9zYW1wbGVzOyAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBhdWRpbyBzYW1wbGVzIHBlciBjaGFubmVsCisgICAgaW50IHNhbXBsZV9yYXRlOyAgICAgICAgICAgIC8vLzwgYXVkaW8gYnVmZmVyIHNhbXBsZSByYXRlCisgICAgaW50IGNoYW5uZWxzOyAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGNoYW5uZWxzIChkbyBub3QgYWNjZXNzIGRpcmVjdGx5KQorfSBBVkZpbHRlckJ1ZmZlclJlZkF1ZGlvUHJvcHM7CisKKy8qKgorICogVmlkZW8gc3BlY2lmaWMgcHJvcGVydGllcyBpbiBhIHJlZmVyZW5jZSB0byBhbiBBVkZpbHRlckJ1ZmZlci4gU2luY2UKKyAqIEFWRmlsdGVyQnVmZmVyUmVmIGlzIGNvbW1vbiB0byBkaWZmZXJlbnQgbWVkaWEgZm9ybWF0cywgdmlkZW8gc3BlY2lmaWMKKyAqIHBlciByZWZlcmVuY2UgcHJvcGVydGllcyBtdXN0IGJlIHNlcGFyYXRlZCBvdXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWRmlsdGVyQnVmZmVyUmVmVmlkZW9Qcm9wcyB7CisgICAgaW50IHc7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW1hZ2Ugd2lkdGgKKyAgICBpbnQgaDsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbWFnZSBoZWlnaHQKKyAgICBBVlJhdGlvbmFsIHNhbXBsZV9hc3BlY3RfcmF0aW87IC8vLzwgc2FtcGxlIGFzcGVjdCByYXRpbworICAgIGludCBpbnRlcmxhY2VkOyAgICAgICAgICAgICAvLy88IGlzIGZyYW1lIGludGVybGFjZWQKKyAgICBpbnQgdG9wX2ZpZWxkX2ZpcnN0OyAgICAgICAgLy8vPCBmaWVsZCBvcmRlcgorICAgIGVudW0gQVZQaWN0dXJlVHlwZSBwaWN0X3R5cGU7IC8vLzwgcGljdHVyZSB0eXBlIG9mIHRoZSBmcmFtZQorICAgIGludCBrZXlfZnJhbWU7ICAgICAgICAgICAgICAvLy88IDEgLT4ga2V5ZnJhbWUsIDAtPiBub3QKKyAgICBpbnQgcXBfdGFibGVfbGluZXNpemU7ICAgICAgICAgICAgICAgIC8vLzwgcXBfdGFibGUgc3RyaWRlCisgICAgaW50IHFwX3RhYmxlX3NpemU7ICAgICAgICAgICAgLy8vPCBxcF90YWJsZSBzaXplCisgICAgaW50OF90ICpxcF90YWJsZTsgICAgICAgICAgICAgLy8vPCBhcnJheSBvZiBRdWFudGl6YXRpb24gUGFyYW1ldGVycworfSBBVkZpbHRlckJ1ZmZlclJlZlZpZGVvUHJvcHM7CisKKy8qKgorICogQSByZWZlcmVuY2UgdG8gYW4gQVZGaWx0ZXJCdWZmZXIuIFNpbmNlIGZpbHRlcnMgY2FuIG1hbmlwdWxhdGUgdGhlIG9yaWdpbiBvZgorICogYSBidWZmZXIgdG8sIGZvciBleGFtcGxlLCBjcm9wIGltYWdlIHdpdGhvdXQgYW55IG1lbWNweSwgdGhlIGJ1ZmZlciBvcmlnaW4KKyAqIGFuZCBkaW1lbnNpb25zIGFyZSBwZXItcmVmZXJlbmNlIHByb3BlcnRpZXMuIExpbmVzaXplIGlzIGFsc28gdXNlZnVsIGZvcgorICogaW1hZ2UgZmxpcHBpbmcsIGZyYW1lIHRvIGZpZWxkIGZpbHRlcnMsIGV0YywgYW5kIHNvIGlzIGFsc28gcGVyLXJlZmVyZW5jZS4KKyAqCisgKiBUT0RPOiBhZGQgYW55dGhpbmcgbmVjZXNzYXJ5IGZvciBmcmFtZSByZW9yZGVyaW5nCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWRmlsdGVyQnVmZmVyUmVmIHsKKyAgICBBVkZpbHRlckJ1ZmZlciAqYnVmOyAgICAgICAgLy8vPCB0aGUgYnVmZmVyIHRoYXQgdGhpcyBpcyBhIHJlZmVyZW5jZSB0bworICAgIHVpbnQ4X3QgKmRhdGFbOF07ICAgICAgICAgICAvLy88IHBpY3R1cmUvYXVkaW8gZGF0YSBmb3IgZWFjaCBwbGFuZQorICAgIC8qKgorICAgICAqIHBvaW50ZXJzIHRvIHRoZSBkYXRhIHBsYW5lcy9jaGFubmVscy4KKyAgICAgKgorICAgICAqIEZvciB2aWRlbywgdGhpcyBzaG91bGQgc2ltcGx5IHBvaW50IHRvIGRhdGFbXS4KKyAgICAgKgorICAgICAqIEZvciBwbGFuYXIgYXVkaW8sIGVhY2ggY2hhbm5lbCBoYXMgYSBzZXBhcmF0ZSBkYXRhIHBvaW50ZXIsIGFuZAorICAgICAqIGxpbmVzaXplWzBdIGNvbnRhaW5zIHRoZSBzaXplIG9mIGVhY2ggY2hhbm5lbCBidWZmZXIuCisgICAgICogRm9yIHBhY2tlZCBhdWRpbywgdGhlcmUgaXMganVzdCBvbmUgZGF0YSBwb2ludGVyLCBhbmQgbGluZXNpemVbMF0KKyAgICAgKiBjb250YWlucyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgYnVmZmVyIGZvciBhbGwgY2hhbm5lbHMuCisgICAgICoKKyAgICAgKiBOb3RlOiBCb3RoIGRhdGEgYW5kIGV4dGVuZGVkX2RhdGEgd2lsbCBhbHdheXMgYmUgc2V0LCBidXQgZm9yIHBsYW5hcgorICAgICAqIGF1ZGlvIHdpdGggbW9yZSBjaGFubmVscyB0aGF0IGNhbiBmaXQgaW4gZGF0YSwgZXh0ZW5kZWRfZGF0YSBtdXN0IGJlIHVzZWQKKyAgICAgKiBpbiBvcmRlciB0byBhY2Nlc3MgYWxsIGNoYW5uZWxzLgorICAgICAqLworICAgIHVpbnQ4X3QgKipleHRlbmRlZF9kYXRhOworICAgIGludCBsaW5lc2l6ZVs4XTsgICAgICAgICAgICAvLy88IG51bWJlciBvZiBieXRlcyBwZXIgbGluZQorCisgICAgQVZGaWx0ZXJCdWZmZXJSZWZWaWRlb1Byb3BzICp2aWRlbzsgLy8vPCB2aWRlbyBidWZmZXIgc3BlY2lmaWMgcHJvcGVydGllcworICAgIEFWRmlsdGVyQnVmZmVyUmVmQXVkaW9Qcm9wcyAqYXVkaW87IC8vLzwgYXVkaW8gYnVmZmVyIHNwZWNpZmljIHByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIHByZXNlbnRhdGlvbiB0aW1lc3RhbXAuIFRoZSB0aW1lIHVuaXQgbWF5IGNoYW5nZSBkdXJpbmcKKyAgICAgKiBmaWx0ZXJpbmcsIGFzIGl0IGlzIHNwZWNpZmllZCBpbiB0aGUgbGluayBhbmQgdGhlIGZpbHRlciBjb2RlCisgICAgICogbWF5IG5lZWQgdG8gcmVzY2FsZSB0aGUgUFRTIGFjY29yZGluZ2x5LgorICAgICAqLworICAgIGludDY0X3QgcHRzOworICAgIGludDY0X3QgcG9zOyAgICAgICAgICAgICAgICAvLy88IGJ5dGUgcG9zaXRpb24gaW4gc3RyZWFtLCAtMSBpZiB1bmtub3duCisKKyAgICBpbnQgZm9ybWF0OyAgICAgICAgICAgICAgICAgLy8vPCBtZWRpYSBmb3JtYXQKKworICAgIGludCBwZXJtczsgICAgICAgICAgICAgICAgICAvLy88IHBlcm1pc3Npb25zLCBzZWUgdGhlIEFWX1BFUk1fKiBmbGFncworCisgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlOyAgICAgIC8vLzwgbWVkaWEgdHlwZSBvZiBidWZmZXIgZGF0YQorCisgICAgQVZEaWN0aW9uYXJ5ICptZXRhZGF0YTsgICAgIC8vLzwgZGljdGlvbmFyeSBjb250YWluaW5nIG1ldGFkYXRhIGtleT12YWx1ZSB0YWdzCit9IEFWRmlsdGVyQnVmZmVyUmVmOworCisvKioKKyAqIENvcHkgcHJvcGVydGllcyBvZiBzcmMgdG8gZHN0LCB3aXRob3V0IGNvcHlpbmcgdGhlIGFjdHVhbCBkYXRhCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCit2b2lkIGF2ZmlsdGVyX2NvcHlfYnVmZmVyX3JlZl9wcm9wcyhBVkZpbHRlckJ1ZmZlclJlZiAqZHN0LCBjb25zdCBBVkZpbHRlckJ1ZmZlclJlZiAqc3JjKTsKKworLyoqCisgKiBBZGQgYSBuZXcgcmVmZXJlbmNlIHRvIGEgYnVmZmVyLgorICoKKyAqIEBwYXJhbSByZWYgICBhbiBleGlzdGluZyByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlcgorICogQHBhcmFtIHBtYXNrIGEgYml0bWFzayBjb250YWluaW5nIHRoZSBhbGxvd2FibGUgcGVybWlzc2lvbnMgaW4gdGhlIG5ldworICogICAgICAgICAgICAgIHJlZmVyZW5jZQorICogQHJldHVybiAgICAgIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUKKyAqICAgICAgICAgICAgICBvbGQsIGV4Y2x1ZGluZyBhbnkgcGVybWlzc2lvbnMgZGVuaWVkIGJ5IHBtYXNrCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitBVkZpbHRlckJ1ZmZlclJlZiAqYXZmaWx0ZXJfcmVmX2J1ZmZlcihBVkZpbHRlckJ1ZmZlclJlZiAqcmVmLCBpbnQgcG1hc2spOworCisvKioKKyAqIFJlbW92ZSBhIHJlZmVyZW5jZSB0byBhIGJ1ZmZlci4gSWYgdGhpcyBpcyB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlCisgKiBidWZmZXIsIHRoZSBidWZmZXIgaXRzZWxmIGlzIGFsc28gYXV0b21hdGljYWxseSBmcmVlZC4KKyAqCisgKiBAcGFyYW0gcmVmIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyLCBtYXkgYmUgTlVMTAorICoKKyAqIEBub3RlIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBhdmZpbHRlcl91bnJlZl9idWZmZXJwKCkgaW5zdGVhZCBvZiB0aGlzCisgKiBmdW5jdGlvbgorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAordm9pZCBhdmZpbHRlcl91bnJlZl9idWZmZXIoQVZGaWx0ZXJCdWZmZXJSZWYgKnJlZik7CisKKy8qKgorICogUmVtb3ZlIGEgcmVmZXJlbmNlIHRvIGEgYnVmZmVyIGFuZCBzZXQgdGhlIHBvaW50ZXIgdG8gTlVMTC4KKyAqIElmIHRoaXMgaXMgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIsIHRoZSBidWZmZXIgaXRzZWxmCisgKiBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgZnJlZWQuCisgKgorICogQHBhcmFtIHJlZiBwb2ludGVyIHRvIHRoZSBidWZmZXIgcmVmZXJlbmNlCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCit2b2lkIGF2ZmlsdGVyX3VucmVmX2J1ZmZlcnAoQVZGaWx0ZXJCdWZmZXJSZWYgKipyZWYpOworI2VuZGlmCisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb2YgYSBidWZmZXIgcmVmZXJlbmNlLgorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IGF2ZmlsdGVyX3JlZl9nZXRfY2hhbm5lbHMoQVZGaWx0ZXJCdWZmZXJSZWYgKnJlZik7CisKKyNpZiBGRl9BUElfQVZGSUxURVJQQURfUFVCTElDCisvKioKKyAqIEEgZmlsdGVyIHBhZCB1c2VkIGZvciBlaXRoZXIgaW5wdXQgb3Igb3V0cHV0LgorICoKKyAqIFNlZSBkb2MvZmlsdGVyX2Rlc2lnbi50eHQgZm9yIGRldGFpbHMgb24gaG93IHRvIGltcGxlbWVudCB0aGUgbWV0aG9kcy4KKyAqCisgKiBAd2FybmluZyB0aGlzIHN0cnVjdCBtaWdodCBiZSByZW1vdmVkIGZyb20gcHVibGljIEFQSS4KKyAqIHVzZXJzIHNob3VsZCBjYWxsIGF2ZmlsdGVyX3BhZF9nZXRfbmFtZSgpIGFuZCBhdmZpbHRlcl9wYWRfZ2V0X3R5cGUoKQorICogdG8gYWNjZXNzIHRoZSBuYW1lIGFuZCB0eXBlIGZpZWxkczsgdGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gYWNjZXNzCisgKiBhbnkgb3RoZXIgZmllbGRzIGZyb20gb3V0c2lkZSBvZiBsaWJhdmZpbHRlci4KKyAqLworc3RydWN0IEFWRmlsdGVyUGFkIHsKKyAgICAvKioKKyAgICAgKiBQYWQgbmFtZS4gVGhlIG5hbWUgaXMgdW5pcXVlIGFtb25nIGlucHV0cyBhbmQgYW1vbmcgb3V0cHV0cywgYnV0IGFuCisgICAgICogaW5wdXQgbWF5IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBhbiBvdXRwdXQuIFRoaXMgbWF5IGJlIE5VTEwgaWYgdGhpcworICAgICAqIHBhZCBoYXMgbm8gbmVlZCB0byBldmVyIGJlIHJlZmVyZW5jZWQgYnkgbmFtZS4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgLyoqCisgICAgICogQVZGaWx0ZXJQYWQgdHlwZS4KKyAgICAgKi8KKyAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBJbnB1dCBwYWRzOgorICAgICAqIE1pbmltdW0gcmVxdWlyZWQgcGVybWlzc2lvbnMgb24gaW5jb21pbmcgYnVmZmVycy4gQW55IGJ1ZmZlciB3aXRoCisgICAgICogaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb3BpZWQgYnkgdGhlIGZpbHRlcgorICAgICAqIHN5c3RlbSB0byBhIG5ldyBidWZmZXIgd2hpY2ggcHJvdmlkZXMgdGhlIG5lZWRlZCBhY2Nlc3MgcGVybWlzc2lvbnMuCisgICAgICoKKyAgICAgKiBPdXRwdXQgcGFkczoKKyAgICAgKiBHdWFyYW50ZWVkIHBlcm1pc3Npb25zIG9uIG91dGdvaW5nIGJ1ZmZlcnMuIEFueSBidWZmZXIgcHVzaGVkIG9uIHRoZQorICAgICAqIGxpbmsgbXVzdCBoYXZlIGF0IGxlYXN0IHRoZXNlIHBlcm1pc3Npb25zOyB0aGlzIGZhY3QgaXMgY2hlY2tlZCBieQorICAgICAqIGFzc2VydHMuIEl0IGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGJ1ZmZlciBhbGxvY2F0aW9uLgorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkIGludCBtaW5fcGVybXM7CisKKyAgICAvKioKKyAgICAgKiBJbnB1dCBwYWRzOgorICAgICAqIFBlcm1pc3Npb25zIHdoaWNoIGFyZSBub3QgYWNjZXB0ZWQgb24gaW5jb21pbmcgYnVmZmVycy4gQW55IGJ1ZmZlcgorICAgICAqIHdoaWNoIGhhcyBhbnkgb2YgdGhlc2UgcGVybWlzc2lvbnMgc2V0IHdpbGwgYmUgYXV0b21hdGljYWxseSBjb3BpZWQKKyAgICAgKiBieSB0aGUgZmlsdGVyIHN5c3RlbSB0byBhIG5ldyBidWZmZXIgd2hpY2ggZG9lcyBub3QgaGF2ZSB0aG9zZQorICAgICAqIHBlcm1pc3Npb25zLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGVhc2lseSBkaXNhbGxvdyBidWZmZXJzIHdpdGgKKyAgICAgKiBBVl9QRVJNX1JFVVNFLgorICAgICAqCisgICAgICogT3V0cHV0IHBhZHM6CisgICAgICogUGVybWlzc2lvbnMgd2hpY2ggYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvbiBvdXRnb2luZyBidWZmZXJzLiBJdAorICAgICAqIGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGJ1ZmZlciBhbGxvY2F0aW9uLgorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkIGludCByZWpfcGVybXM7CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgKCpzdGFydF9mcmFtZSkoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZpbHRlckJ1ZmZlclJlZiAqcGljcmVmKTsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGdldCBhIHZpZGVvIGJ1ZmZlci4gSWYgTlVMTCwgdGhlIGZpbHRlciBzeXN0ZW0gd2lsbAorICAgICAqIHVzZSBmZl9kZWZhdWx0X2dldF92aWRlb19idWZmZXIoKS4KKyAgICAgKgorICAgICAqIElucHV0IHZpZGVvIHBhZHMgb25seS4KKyAgICAgKi8KKyAgICBBVkZyYW1lICooKmdldF92aWRlb19idWZmZXIpKEFWRmlsdGVyTGluayAqbGluaywgaW50IHcsIGludCBoKTsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGdldCBhbiBhdWRpbyBidWZmZXIuIElmIE5VTEwsIHRoZSBmaWx0ZXIgc3lzdGVtIHdpbGwKKyAgICAgKiB1c2UgZmZfZGVmYXVsdF9nZXRfYXVkaW9fYnVmZmVyKCkuCisgICAgICoKKyAgICAgKiBJbnB1dCBhdWRpbyBwYWRzIG9ubHkuCisgICAgICovCisgICAgQVZGcmFtZSAqKCpnZXRfYXVkaW9fYnVmZmVyKShBVkZpbHRlckxpbmsgKmxpbmssIGludCBuYl9zYW1wbGVzKTsKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVudXNlZAorICAgICAqLworICAgIGludCAoKmVuZF9mcmFtZSkoQVZGaWx0ZXJMaW5rICpsaW5rKTsKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVudXNlZAorICAgICAqLworICAgIGludCAoKmRyYXdfc2xpY2UpKEFWRmlsdGVyTGluayAqbGluaywgaW50IHksIGludCBoZWlnaHQsIGludCBzbGljZV9kaXIpOworCisgICAgLyoqCisgICAgICogRmlsdGVyaW5nIGNhbGxiYWNrLiBUaGlzIGlzIHdoZXJlIGEgZmlsdGVyIHJlY2VpdmVzIGEgZnJhbWUgd2l0aAorICAgICAqIGF1ZGlvL3ZpZGVvIGRhdGEgYW5kIHNob3VsZCBkbyBpdHMgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIElucHV0IHBhZHMgb25seS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPj0gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1Igb24gZXJyb3IuIFRoaXMgZnVuY3Rpb24KKyAgICAgKiBtdXN0IGVuc3VyZSB0aGF0IGZyYW1lIGlzIHByb3Blcmx5IHVucmVmZXJlbmNlZCBvbiBlcnJvciBpZiBpdAorICAgICAqIGhhc24ndCBiZWVuIHBhc3NlZCBvbiB0byBhbm90aGVyIGZpbHRlci4KKyAgICAgKi8KKyAgICBpbnQgKCpmaWx0ZXJfZnJhbWUpKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpOworCisgICAgLyoqCisgICAgICogRnJhbWUgcG9sbCBjYWxsYmFjay4gVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW1tZWRpYXRlbHkgYXZhaWxhYmxlCisgICAgICogc2FtcGxlcy4gSXQgc2hvdWxkIHJldHVybiBhIHBvc2l0aXZlIHZhbHVlIGlmIHRoZSBuZXh0IHJlcXVlc3RfZnJhbWUoKQorICAgICAqIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIG9uZSBmcmFtZSAod2l0aCBubyBkZWxheSkuCisgICAgICoKKyAgICAgKiBEZWZhdWx0cyB0byBqdXN0IGNhbGxpbmcgdGhlIHNvdXJjZSBwb2xsX2ZyYW1lKCkgbWV0aG9kLgorICAgICAqCisgICAgICogT3V0cHV0IHBhZHMgb25seS4KKyAgICAgKi8KKyAgICBpbnQgKCpwb2xsX2ZyYW1lKShBVkZpbHRlckxpbmsgKmxpbmspOworCisgICAgLyoqCisgICAgICogRnJhbWUgcmVxdWVzdCBjYWxsYmFjay4gQSBjYWxsIHRvIHRoaXMgc2hvdWxkIHJlc3VsdCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgKiBmcmFtZSBiZWluZyBvdXRwdXQgb3ZlciB0aGUgZ2l2ZW4gbGluay4gVGhpcyBzaG91bGQgcmV0dXJuIHplcm8gb24KKyAgICAgKiBzdWNjZXNzLCBhbmQgYW5vdGhlciB2YWx1ZSBvbiBlcnJvci4KKyAgICAgKiBTZWUgZmZfcmVxdWVzdF9mcmFtZSgpIGZvciB0aGUgZXJyb3IgY29kZXMgd2l0aCBhIHNwZWNpZmljCisgICAgICogbWVhbmluZy4KKyAgICAgKgorICAgICAqIE91dHB1dCBwYWRzIG9ubHkuCisgICAgICovCisgICAgaW50ICgqcmVxdWVzdF9mcmFtZSkoQVZGaWx0ZXJMaW5rICpsaW5rKTsKKworICAgIC8qKgorICAgICAqIExpbmsgY29uZmlndXJhdGlvbiBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIEZvciBvdXRwdXQgcGFkcywgdGhpcyBzaG91bGQgc2V0IHRoZSBmb2xsb3dpbmcgbGluayBwcm9wZXJ0aWVzOgorICAgICAqIHZpZGVvOiB3aWR0aCwgaGVpZ2h0LCBzYW1wbGVfYXNwZWN0X3JhdGlvLCB0aW1lX2Jhc2UKKyAgICAgKiBhdWRpbzogc2FtcGxlX3JhdGUuCisgICAgICoKKyAgICAgKiBUaGlzIHNob3VsZCBOT1Qgc2V0IHByb3BlcnRpZXMgc3VjaCBhcyBmb3JtYXQsIGNoYW5uZWxfbGF5b3V0LCBldGMgd2hpY2gKKyAgICAgKiBhcmUgbmVnb3RpYXRlZCBiZXR3ZWVuIGZpbHRlcnMgYnkgdGhlIGZpbHRlciBzeXN0ZW0gdXNpbmcgdGhlCisgICAgICogcXVlcnlfZm9ybWF0cygpIGNhbGxiYWNrIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEZvciBpbnB1dCBwYWRzLCB0aGlzIHNob3VsZCBjaGVjayB0aGUgcHJvcGVydGllcyBvZiB0aGUgbGluaywgYW5kIHVwZGF0ZQorICAgICAqIHRoZSBmaWx0ZXIncyBpbnRlcm5hbCBzdGF0ZSBhcyBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBGb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHBhZHMsIHRoaXMgc2hvdWxkIHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsCisgICAgICogYW5kIGFub3RoZXIgdmFsdWUgb24gZXJyb3IuCisgICAgICovCisgICAgaW50ICgqY29uZmlnX3Byb3BzKShBVkZpbHRlckxpbmsgKmxpbmspOworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBleHBlY3RzIGEgZmlmbyB0byBiZSBpbnNlcnRlZCBvbiBpdHMgaW5wdXQgbGluaywKKyAgICAgKiB0eXBpY2FsbHkgYmVjYXVzZSBpdCBoYXMgYSBkZWxheS4KKyAgICAgKgorICAgICAqIGlucHV0IHBhZHMgb25seS4KKyAgICAgKi8KKyAgICBpbnQgbmVlZHNfZmlmbzsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWx0ZXIgZXhwZWN0cyB3cml0YWJsZSBmcmFtZXMgZnJvbSBpdHMgaW5wdXQgbGluaywKKyAgICAgKiBkdXBsaWNhdGluZyBkYXRhIGJ1ZmZlcnMgaWYgbmVlZGVkLgorICAgICAqCisgICAgICogaW5wdXQgcGFkcyBvbmx5LgorICAgICAqLworICAgIGludCBuZWVkc193cml0YWJsZTsKK307CisjZW5kaWYKKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZiBBVkZpbHRlclBhZHMgKGUuZy4KKyAqIEFWRmlsdGVyLmlucHV0cy9vdXRwdXRzKS4KKyAqLworaW50IGF2ZmlsdGVyX3BhZF9jb3VudChjb25zdCBBVkZpbHRlclBhZCAqcGFkcyk7CisKKy8qKgorICogR2V0IHRoZSBuYW1lIG9mIGFuIEFWRmlsdGVyUGFkLgorICoKKyAqIEBwYXJhbSBwYWRzIGFuIGFycmF5IG9mIEFWRmlsdGVyUGFkcworICogQHBhcmFtIHBhZF9pZHggaW5kZXggb2YgdGhlIHBhZCBpbiB0aGUgYXJyYXkgaXQ7IGlzIHRoZSBjYWxsZXIncworICogICAgICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoZSBpbmRleCBpcyB2YWxpZAorICoKKyAqIEByZXR1cm4gbmFtZSBvZiB0aGUgcGFkX2lkeCd0aCBwYWQgaW4gcGFkcworICovCitjb25zdCBjaGFyICphdmZpbHRlcl9wYWRfZ2V0X25hbWUoY29uc3QgQVZGaWx0ZXJQYWQgKnBhZHMsIGludCBwYWRfaWR4KTsKKworLyoqCisgKiBHZXQgdGhlIHR5cGUgb2YgYW4gQVZGaWx0ZXJQYWQuCisgKgorICogQHBhcmFtIHBhZHMgYW4gYXJyYXkgb2YgQVZGaWx0ZXJQYWRzCisgKiBAcGFyYW0gcGFkX2lkeCBpbmRleCBvZiB0aGUgcGFkIGluIHRoZSBhcnJheTsgaXQgaXMgdGhlIGNhbGxlcidzCisgKiAgICAgICAgICAgICAgICByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhlIGluZGV4IGlzIHZhbGlkCisgKgorICogQHJldHVybiB0eXBlIG9mIHRoZSBwYWRfaWR4J3RoIHBhZCBpbiBwYWRzCisgKi8KK2VudW0gQVZNZWRpYVR5cGUgYXZmaWx0ZXJfcGFkX2dldF90eXBlKGNvbnN0IEFWRmlsdGVyUGFkICpwYWRzLCBpbnQgcGFkX2lkeCk7CisKKy8qKgorICogVGhlIG51bWJlciBvZiB0aGUgZmlsdGVyIGlucHV0cyBpcyBub3QgZGV0ZXJtaW5lZCBqdXN0IGJ5IEFWRmlsdGVyLmlucHV0cy4KKyAqIFRoZSBmaWx0ZXIgbWlnaHQgYWRkIGFkZGl0aW9uYWwgaW5wdXRzIGR1cmluZyBpbml0aWFsaXphdGlvbiBkZXBlbmRpbmcgb24gdGhlCisgKiBvcHRpb25zIHN1cHBsaWVkIHRvIGl0LgorICovCisjZGVmaW5lIEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19JTlBVVFMgICAgICAgICgxIDw8IDApCisvKioKKyAqIFRoZSBudW1iZXIgb2YgdGhlIGZpbHRlciBvdXRwdXRzIGlzIG5vdCBkZXRlcm1pbmVkIGp1c3QgYnkgQVZGaWx0ZXIub3V0cHV0cy4KKyAqIFRoZSBmaWx0ZXIgbWlnaHQgYWRkIGFkZGl0aW9uYWwgb3V0cHV0cyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gZGVwZW5kaW5nIG9uCisgKiB0aGUgb3B0aW9ucyBzdXBwbGllZCB0byBpdC4KKyAqLworI2RlZmluZSBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfT1VUUFVUUyAgICAgICAoMSA8PCAxKQorLyoqCisgKiBUaGUgZmlsdGVyIHN1cHBvcnRzIG11bHRpdGhyZWFkaW5nIGJ5IHNwbGl0dGluZyBmcmFtZXMgaW50byBtdWx0aXBsZSBwYXJ0cworICogYW5kIHByb2Nlc3NpbmcgdGhlbSBjb25jdXJyZW50bHkuCisgKi8KKyNkZWZpbmUgQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTICAgICAgICAgKDEgPDwgMikKKy8qKgorICogU29tZSBmaWx0ZXJzIHN1cHBvcnQgYSBnZW5lcmljICJlbmFibGUiIGV4cHJlc3Npb24gb3B0aW9uIHRoYXQgY2FuIGJlIHVzZWQKKyAqIHRvIGVuYWJsZSBvciBkaXNhYmxlIGEgZmlsdGVyIGluIHRoZSB0aW1lbGluZS4gRmlsdGVycyBzdXBwb3J0aW5nIHRoaXMKKyAqIG9wdGlvbiBoYXZlIHRoaXMgZmxhZyBzZXQuIFdoZW4gdGhlIGVuYWJsZSBleHByZXNzaW9uIGlzIGZhbHNlLCB0aGUgZGVmYXVsdAorICogbm8tb3AgZmlsdGVyX2ZyYW1lKCkgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHBsYWNlIG9mIHRoZSBmaWx0ZXJfZnJhbWUoKQorICogY2FsbGJhY2sgZGVmaW5lZCBvbiBlYWNoIGlucHV0IHBhZCwgdGh1cyB0aGUgZnJhbWUgaXMgcGFzc2VkIHVuY2hhbmdlZCB0bworICogdGhlIG5leHQgZmlsdGVycy4KKyAqLworI2RlZmluZSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQyAgKDEgPDwgMTYpCisvKioKKyAqIFNhbWUgYXMgQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsIGV4Y2VwdCB0aGF0IHRoZSBmaWx0ZXIgd2lsbAorICogaGF2ZSBpdHMgZmlsdGVyX2ZyYW1lKCkgY2FsbGJhY2socykgY2FsbGVkIGFzIHVzdWFsIGV2ZW4gd2hlbiB0aGUgZW5hYmxlCisgKiBleHByZXNzaW9uIGlzIGZhbHNlLiBUaGUgZmlsdGVyIHdpbGwgZGlzYWJsZSBmaWx0ZXJpbmcgd2l0aGluIHRoZQorICogZmlsdGVyX2ZyYW1lKCkgY2FsbGJhY2socykgaXRzZWxmLCBmb3IgZXhhbXBsZSBleGVjdXRpbmcgY29kZSBkZXBlbmRpbmcgb24KKyAqIHRoZSBBVkZpbHRlckNvbnRleHQtPmlzX2Rpc2FibGVkIHZhbHVlLgorICovCisjZGVmaW5lIEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9JTlRFUk5BTCAoMSA8PCAxNykKKy8qKgorICogSGFuZHkgbWFzayB0byB0ZXN0IHdoZXRoZXIgdGhlIGZpbHRlciBzdXBwb3J0cyBvciBubyB0aGUgdGltZWxpbmUgZmVhdHVyZQorICogKGludGVybmFsbHkgb3IgZ2VuZXJpY2FsbHkpLgorICovCisjZGVmaW5lIEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORSAoQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMgfCBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfSU5URVJOQUwpCisKKy8qKgorICogRmlsdGVyIGRlZmluaXRpb24uIFRoaXMgZGVmaW5lcyB0aGUgcGFkcyBhIGZpbHRlciBjb250YWlucywgYW5kIGFsbCB0aGUKKyAqIGNhbGxiYWNrIGZ1bmN0aW9ucyB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIGZpbHRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZGaWx0ZXIgeworICAgIC8qKgorICAgICAqIEZpbHRlciBuYW1lLiBNdXN0IGJlIG5vbi1OVUxMIGFuZCB1bmlxdWUgYW1vbmcgZmlsdGVycy4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgLyoqCisgICAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlsdGVyLiBNYXkgYmUgTlVMTC4KKyAgICAgKgorICAgICAqIFlvdSBzaG91bGQgdXNlIHRoZSBOVUxMX0lGX0NPTkZJR19TTUFMTCgpIG1hY3JvIHRvIGRlZmluZSBpdC4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgaW5wdXRzLCB0ZXJtaW5hdGVkIGJ5IGEgemVyb2VkIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBOVUxMIGlmIHRoZXJlIGFyZSBubyAoc3RhdGljKSBpbnB1dHMuIEluc3RhbmNlcyBvZiBmaWx0ZXJzIHdpdGgKKyAgICAgKiBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfSU5QVVRTIHNldCBtYXkgaGF2ZSBtb3JlIGlucHV0cyB0aGFuIHByZXNlbnQgaW4KKyAgICAgKiB0aGlzIGxpc3QuCisgICAgICovCisgICAgY29uc3QgQVZGaWx0ZXJQYWQgKmlucHV0czsKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIG91dHB1dHMsIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvZWQgZWxlbWVudC4KKyAgICAgKgorICAgICAqIE5VTEwgaWYgdGhlcmUgYXJlIG5vIChzdGF0aWMpIG91dHB1dHMuIEluc3RhbmNlcyBvZiBmaWx0ZXJzIHdpdGgKKyAgICAgKiBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfT1VUUFVUUyBzZXQgbWF5IGhhdmUgbW9yZSBvdXRwdXRzIHRoYW4gcHJlc2VudCBpbgorICAgICAqIHRoaXMgbGlzdC4KKyAgICAgKi8KKyAgICBjb25zdCBBVkZpbHRlclBhZCAqb3V0cHV0czsKKworICAgIC8qKgorICAgICAqIEEgY2xhc3MgZm9yIHRoZSBwcml2YXRlIGRhdGEsIHVzZWQgdG8gZGVjbGFyZSBmaWx0ZXIgcHJpdmF0ZSBBVk9wdGlvbnMuCisgICAgICogVGhpcyBmaWVsZCBpcyBOVUxMIGZvciBmaWx0ZXJzIHRoYXQgZG8gbm90IGRlY2xhcmUgYW55IG9wdGlvbnMuCisgICAgICoKKyAgICAgKiBJZiB0aGlzIGZpZWxkIGlzIG5vbi1OVUxMLCB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBmaWx0ZXIgcHJpdmF0ZSBkYXRhCisgICAgICogbXVzdCBiZSBhIHBvaW50ZXIgdG8gQVZDbGFzcywgd2hpY2ggd2lsbCBiZSBzZXQgYnkgbGliYXZmaWx0ZXIgZ2VuZXJpYworICAgICAqIGNvZGUgdG8gdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBjb25zdCBBVkNsYXNzICpwcml2X2NsYXNzOworCisgICAgLyoqCisgICAgICogQSBjb21iaW5hdGlvbiBvZiBBVkZJTFRFUl9GTEFHXyoKKyAgICAgKi8KKyAgICBpbnQgZmxhZ3M7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBBbGwgZmllbGRzIGJlbG93IHRoaXMgbGluZSBhcmUgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuIFRoZXkKKyAgICAgKiBtYXkgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiBsaWJhdmZpbHRlciBhbmQgY2FuIGJlIGNoYW5nZWQgYW5kCisgICAgICogcmVtb3ZlZCBhdCB3aWxsLgorICAgICAqIE5ldyBwdWJsaWMgZmllbGRzIHNob3VsZCBiZSBhZGRlZCByaWdodCBhYm92ZS4KKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEZpbHRlciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIGR1cmluZyB0aGUgZmlsdGVyIGxpZmV0aW1lLCBhZnRlcgorICAgICAqIGFsbCB0aGUgb3B0aW9ucyBoYXZlIGJlZW4gc2V0LCBidXQgYmVmb3JlIGxpbmtzIGJldHdlZW4gZmlsdGVycyBhcmUKKyAgICAgKiBlc3RhYmxpc2hlZCBhbmQgZm9ybWF0IG5lZ290aWF0aW9uIGlzIGRvbmUuCisgICAgICoKKyAgICAgKiBCYXNpYyBmaWx0ZXIgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGJlIGRvbmUgaGVyZS4gRmlsdGVycyB3aXRoIGR5bmFtaWMKKyAgICAgKiBpbnB1dHMgYW5kL29yIG91dHB1dHMgc2hvdWxkIGNyZWF0ZSB0aG9zZSBpbnB1dHMvb3V0cHV0cyBoZXJlIGJhc2VkIG9uCisgICAgICogcHJvdmlkZWQgb3B0aW9ucy4gTm8gbW9yZSBjaGFuZ2VzIHRvIHRoaXMgZmlsdGVyJ3MgaW5wdXRzL291dHB1dHMgY2FuIGJlCisgICAgICogZG9uZSBhZnRlciB0aGlzIGNhbGxiYWNrLgorICAgICAqCisgICAgICogVGhpcyBjYWxsYmFjayBtdXN0IG5vdCBhc3N1bWUgdGhhdCB0aGUgZmlsdGVyIGxpbmtzIGV4aXN0IG9yIGZyYW1lCisgICAgICogcGFyYW1ldGVycyBhcmUga25vd24uCisgICAgICoKKyAgICAgKiBAcmVmIEFWRmlsdGVyLnVuaW5pdCAidW5pbml0IiBpcyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBldmVuIGlmCisgICAgICogaW5pdGlhbGl6YXRpb24gZmFpbHMsIHNvIHRoaXMgY2FsbGJhY2sgZG9lcyBub3QgaGF2ZSB0byBjbGVhbiB1cCBvbgorICAgICAqIGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBpbnQgKCppbml0KShBVkZpbHRlckNvbnRleHQgKmN0eCk7CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgYmUgc2V0IGluc3RlYWQgb2YgQHJlZiBBVkZpbHRlci5pbml0ICJpbml0IiBieSB0aGUgZmlsdGVycyB0aGF0CisgICAgICogd2FudCB0byBwYXNzIGEgZGljdGlvbmFyeSBvZiBBVk9wdGlvbnMgdG8gbmVzdGVkIGNvbnRleHRzIHRoYXQgYXJlCisgICAgICogYWxsb2NhdGVkIGR1cmluZyBpbml0LgorICAgICAqCisgICAgICogT24gcmV0dXJuLCB0aGUgb3B0aW9ucyBkaWN0IHNob3VsZCBiZSBmcmVlZCBhbmQgcmVwbGFjZWQgd2l0aCBvbmUgdGhhdAorICAgICAqIGNvbnRhaW5zIGFsbCB0aGUgb3B0aW9ucyB3aGljaCBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgZmlsdGVyIChvcgorICAgICAqIHdpdGggTlVMTCBpZiBhbGwgdGhlIG9wdGlvbnMgd2VyZSBwcm9jZXNzZWQpLgorICAgICAqCisgICAgICogT3RoZXJ3aXNlIHRoZSBzZW1hbnRpY3MgaXMgdGhlIHNhbWUgYXMgZm9yIEByZWYgQVZGaWx0ZXIuaW5pdCAiaW5pdCIuCisgICAgICovCisgICAgaW50ICgqaW5pdF9kaWN0KShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucyk7CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgdW5pbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIENhbGxlZCBvbmx5IG9uY2UgcmlnaHQgYmVmb3JlIHRoZSBmaWx0ZXIgaXMgZnJlZWQuIFNob3VsZCBkZWFsbG9jYXRlIGFueQorICAgICAqIG1lbW9yeSBoZWxkIGJ5IHRoZSBmaWx0ZXIsIHJlbGVhc2UgYW55IGJ1ZmZlciByZWZlcmVuY2VzLCBldGMuIEl0IGRvZXMKKyAgICAgKiBub3QgbmVlZCB0byBkZWFsbG9jYXRlIHRoZSBBVkZpbHRlckNvbnRleHQucHJpdiBtZW1vcnkgaXRzZWxmLgorICAgICAqCisgICAgICogVGhpcyBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIGV2ZW4gaWYgQHJlZiBBVkZpbHRlci5pbml0ICJpbml0IiB3YXMgbm90CisgICAgICogY2FsbGVkIG9yIGZhaWxlZCwgc28gaXQgbXVzdCBiZSBwcmVwYXJlZCB0byBoYW5kbGUgc3VjaCBhIHNpdHVhdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkICgqdW5pbml0KShBVkZpbHRlckNvbnRleHQgKmN0eCk7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGUgZmlsdGVyIG9uIGl0cyBpbnB1dHMgYW5kIG91dHB1dHMuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBhZnRlciB0aGUgZmlsdGVyIGlzIGluaXRpYWxpemVkIChzbyB0aGUgaW5wdXRzCisgICAgICogYW5kIG91dHB1dHMgYXJlIGZpeGVkKSwgc2hvcnRseSBiZWZvcmUgdGhlIGZvcm1hdCBuZWdvdGlhdGlvbi4gVGhpcworICAgICAqIGNhbGxiYWNrIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbGxiYWNrIG11c3Qgc2V0IEFWRmlsdGVyTGluay5vdXRfZm9ybWF0cyBvbiBldmVyeSBpbnB1dCBsaW5rIGFuZAorICAgICAqIEFWRmlsdGVyTGluay5pbl9mb3JtYXRzIG9uIGV2ZXJ5IG91dHB1dCBsaW5rIHRvIGEgbGlzdCBvZiBwaXhlbC9zYW1wbGUKKyAgICAgKiBmb3JtYXRzIHRoYXQgdGhlIGZpbHRlciBzdXBwb3J0cyBvbiB0aGF0IGxpbmsuIEZvciBhdWRpbyBsaW5rcywgdGhpcworICAgICAqIGZpbHRlciBtdXN0IGFsc28gc2V0IEByZWYgQVZGaWx0ZXJMaW5rLmluX3NhbXBsZXJhdGVzICJpbl9zYW1wbGVyYXRlcyIgLworICAgICAqIEByZWYgQVZGaWx0ZXJMaW5rLm91dF9zYW1wbGVyYXRlcyAib3V0X3NhbXBsZXJhdGVzIiBhbmQKKyAgICAgKiBAcmVmIEFWRmlsdGVyTGluay5pbl9jaGFubmVsX2xheW91dHMgImluX2NoYW5uZWxfbGF5b3V0cyIgLworICAgICAqIEByZWYgQVZGaWx0ZXJMaW5rLm91dF9jaGFubmVsX2xheW91dHMgIm91dF9jaGFubmVsX2xheW91dHMiIGFuYWxvZ291c2x5LgorICAgICAqCisgICAgICogVGhpcyBjYWxsYmFjayBtYXkgYmUgTlVMTCBmb3IgZmlsdGVycyB3aXRoIG9uZSBpbnB1dCwgaW4gd2hpY2ggY2FzZQorICAgICAqIGxpYmF2ZmlsdGVyIGFzc3VtZXMgdGhhdCBpdCBzdXBwb3J0cyBhbGwgaW5wdXQgZm9ybWF0cyBhbmQgcHJlc2VydmVzCisgICAgICogdGhlbSBvbiBvdXRwdXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHplcm8gb24gc3VjY2VzcywgYSBuZWdhdGl2ZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuCisgICAgICogQVZFUlJPUiBjb2RlIG90aGVyd2lzZQorICAgICAqLworICAgIGludCAoKnF1ZXJ5X2Zvcm1hdHMpKEFWRmlsdGVyQ29udGV4dCAqKTsKKworICAgIGludCBwcml2X3NpemU7ICAgICAgLy8vPCBzaXplIG9mIHByaXZhdGUgZGF0YSB0byBhbGxvY2F0ZSBmb3IgdGhlIGZpbHRlcgorCisgICAgLyoqCisgICAgICogVXNlZCBieSB0aGUgZmlsdGVyIHJlZ2lzdHJhdGlvbiBzeXN0ZW0uIE11c3Qgbm90IGJlIHRvdWNoZWQgYnkgYW55IG90aGVyCisgICAgICogY29kZS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQVZGaWx0ZXIgKm5leHQ7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHRoZSBmaWx0ZXIgaW5zdGFuY2UgcHJvY2VzcyBhIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY21kICAgIHRoZSBjb21tYW5kIHRvIHByb2Nlc3MsIGZvciBoYW5kbGluZyBzaW1wbGljaXR5IGFsbCBjb21tYW5kcyBtdXN0IGJlIGFscGhhbnVtZXJpYyBvbmx5CisgICAgICogQHBhcmFtIGFyZyAgICB0aGUgYXJndW1lbnQgZm9yIHRoZSBjb21tYW5kCisgICAgICogQHBhcmFtIHJlcyAgICBhIGJ1ZmZlciB3aXRoIHNpemUgcmVzX3NpemUgd2hlcmUgdGhlIGZpbHRlcihzKSBjYW4gcmV0dXJuIGEgcmVzcG9uc2UuIFRoaXMgbXVzdCBub3QgY2hhbmdlIHdoZW4gdGhlIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgIGlmIEFWRklMVEVSX0NNRF9GTEFHX0ZBU1QgaXMgc2V0IGFuZCB0aGUgY29tbWFuZCB3b3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgdGltZSBjb25zdW1pbmcgdGhlbiBhIGZpbHRlciBzaG91bGQgdHJlYXQgaXQgbGlrZSBhbiB1bnN1cHBvcnRlZCBjb21tYW5kCisgICAgICoKKyAgICAgKiBAcmV0dXJucyA+PTAgb24gc3VjY2VzcyBvdGhlcndpc2UgYW4gZXJyb3IgY29kZS4KKyAgICAgKiAgICAgICAgICBBVkVSUk9SKEVOT1NZUykgb24gdW5zdXBwb3J0ZWQgY29tbWFuZHMKKyAgICAgKi8KKyAgICBpbnQgKCpwcm9jZXNzX2NvbW1hbmQpKEFWRmlsdGVyQ29udGV4dCAqLCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZywgY2hhciAqcmVzLCBpbnQgcmVzX2xlbiwgaW50IGZsYWdzKTsKKworICAgIC8qKgorICAgICAqIEZpbHRlciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiwgYWx0ZXJuYXRpdmUgdG8gdGhlIGluaXQoKQorICAgICAqIGNhbGxiYWNrLiBBcmdzIGNvbnRhaW5zIHRoZSB1c2VyLXN1cHBsaWVkIHBhcmFtZXRlcnMsIG9wYXF1ZSBpcworICAgICAqIHVzZWQgZm9yIHByb3ZpZGluZyBiaW5hcnkgZGF0YS4KKyAgICAgKi8KKyAgICBpbnQgKCppbml0X29wYXF1ZSkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKm9wYXF1ZSk7Cit9IEFWRmlsdGVyOworCisvKioKKyAqIFByb2Nlc3MgbXVsdGlwbGUgcGFydHMgb2YgdGhlIGZyYW1lIGNvbmN1cnJlbnRseS4KKyAqLworI2RlZmluZSBBVkZJTFRFUl9USFJFQURfU0xJQ0UgKDEgPDwgMCkKKwordHlwZWRlZiBzdHJ1Y3QgQVZGaWx0ZXJJbnRlcm5hbCBBVkZpbHRlckludGVybmFsOworCisvKiogQW4gaW5zdGFuY2Ugb2YgYSBmaWx0ZXIgKi8KK3N0cnVjdCBBVkZpbHRlckNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmF2X2NsYXNzOyAgICAgICAgLy8vPCBuZWVkZWQgZm9yIGF2X2xvZygpIGFuZCBmaWx0ZXJzIGNvbW1vbiBvcHRpb25zCisKKyAgICBjb25zdCBBVkZpbHRlciAqZmlsdGVyOyAgICAgICAgIC8vLzwgdGhlIEFWRmlsdGVyIG9mIHdoaWNoIHRoaXMgaXMgYW4gaW5zdGFuY2UKKworICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBuYW1lIG9mIHRoaXMgZmlsdGVyIGluc3RhbmNlCisKKyAgICBBVkZpbHRlclBhZCAgICppbnB1dF9wYWRzOyAgICAgIC8vLzwgYXJyYXkgb2YgaW5wdXQgcGFkcworICAgIEFWRmlsdGVyTGluayAqKmlucHV0czsgICAgICAgICAgLy8vPCBhcnJheSBvZiBwb2ludGVycyB0byBpbnB1dCBsaW5rcworI2lmIEZGX0FQSV9GT09fQ09VTlQKKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZCB1bnNpZ25lZCBpbnB1dF9jb3VudDsgLy8vPCBAZGVwcmVjYXRlZCB1c2UgbmJfaW5wdXRzCisjZW5kaWYKKyAgICB1bnNpZ25lZCAgICBuYl9pbnB1dHM7ICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGlucHV0IHBhZHMKKworICAgIEFWRmlsdGVyUGFkICAgKm91dHB1dF9wYWRzOyAgICAgLy8vPCBhcnJheSBvZiBvdXRwdXQgcGFkcworICAgIEFWRmlsdGVyTGluayAqKm91dHB1dHM7ICAgICAgICAgLy8vPCBhcnJheSBvZiBwb2ludGVycyB0byBvdXRwdXQgbGlua3MKKyNpZiBGRl9BUElfRk9PX0NPVU5UCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQgdW5zaWduZWQgb3V0cHV0X2NvdW50OyAvLy88IEBkZXByZWNhdGVkIHVzZSBuYl9vdXRwdXRzCisjZW5kaWYKKyAgICB1bnNpZ25lZCAgICBuYl9vdXRwdXRzOyAgICAgICAgIC8vLzwgbnVtYmVyIG9mIG91dHB1dCBwYWRzCisKKyAgICB2b2lkICpwcml2OyAgICAgICAgICAgICAgICAgICAgIC8vLzwgcHJpdmF0ZSBkYXRhIGZvciB1c2UgYnkgdGhlIGZpbHRlcgorCisgICAgc3RydWN0IEFWRmlsdGVyR3JhcGggKmdyYXBoOyAgICAvLy88IGZpbHRlcmdyYXBoIHRoaXMgZmlsdGVyIGJlbG9uZ3MgdG8KKworICAgIC8qKgorICAgICAqIFR5cGUgb2YgbXVsdGl0aHJlYWRpbmcgYmVpbmcgYWxsb3dlZC91c2VkLiBBIGNvbWJpbmF0aW9uIG9mCisgICAgICogQVZGSUxURVJfVEhSRUFEXyogZmxhZ3MuCisgICAgICoKKyAgICAgKiBNYXkgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgZmlsdGVyIHRvIGZvcmJpZCBzb21lCisgICAgICogb3IgYWxsIGtpbmRzIG9mIG11bHRpdGhyZWFkaW5nIGZvciB0aGlzIGZpbHRlci4gVGhlIGRlZmF1bHQgaXMgYWxsb3dpbmcKKyAgICAgKiBldmVyeXRoaW5nLgorICAgICAqCisgICAgICogV2hlbiB0aGUgZmlsdGVyIGlzIGluaXRpYWxpemVkLCB0aGlzIGZpZWxkIGlzIGNvbWJpbmVkIHVzaW5nIGJpdCBBTkQgd2l0aAorICAgICAqIEFWRmlsdGVyR3JhcGgudGhyZWFkX3R5cGUgdG8gZ2V0IHRoZSBmaW5hbCBtYXNrIHVzZWQgZm9yIGRldGVybWluaW5nCisgICAgICogYWxsb3dlZCB0aHJlYWRpbmcgdHlwZXMuIEkuZS4gYSB0aHJlYWRpbmcgdHlwZSBuZWVkcyB0byBiZSBzZXQgaW4gYm90aAorICAgICAqIHRvIGJlIGFsbG93ZWQuCisgICAgICoKKyAgICAgKiBBZnRlciB0aGUgZmlsdGVyIGlzIGluaXRpYWxpemVkLCBsaWJhdmZpbHRlciBzZXRzIHRoaXMgZmllbGQgdG8gdGhlCisgICAgICogdGhyZWFkaW5nIHR5cGUgdGhhdCBpcyBhY3R1YWxseSB1c2VkICgwIGZvciBubyBtdWx0aXRocmVhZGluZykuCisgICAgICovCisgICAgaW50IHRocmVhZF90eXBlOworCisgICAgLyoqCisgICAgICogQW4gb3BhcXVlIHN0cnVjdCBmb3IgbGliYXZmaWx0ZXIgaW50ZXJuYWwgdXNlLgorICAgICAqLworICAgIEFWRmlsdGVySW50ZXJuYWwgKmludGVybmFsOworCisgICAgc3RydWN0IEFWRmlsdGVyQ29tbWFuZCAqY29tbWFuZF9xdWV1ZTsKKworICAgIGNoYXIgKmVuYWJsZV9zdHI7ICAgICAgICAgICAgICAgLy8vPCBlbmFibGUgZXhwcmVzc2lvbiBzdHJpbmcKKyAgICB2b2lkICplbmFibGU7ICAgICAgICAgICAgICAgICAgIC8vLzwgcGFyc2VkIGV4cHJlc3Npb24gKEFWRXhwciopCisgICAgZG91YmxlICp2YXJfdmFsdWVzOyAgICAgICAgICAgICAvLy88IHZhcmlhYmxlIHZhbHVlcyBmb3IgdGhlIGVuYWJsZSBleHByZXNzaW9uCisgICAgaW50IGlzX2Rpc2FibGVkOyAgICAgICAgICAgICAgICAvLy88IHRoZSBlbmFibGVkIHN0YXRlIGZyb20gdGhlIGxhc3QgZXhwcmVzc2lvbiBldmFsdWF0aW9uCit9OworCisvKioKKyAqIEEgbGluayBiZXR3ZWVuIHR3byBmaWx0ZXJzLiBUaGlzIGNvbnRhaW5zIHBvaW50ZXJzIHRvIHRoZSBzb3VyY2UgYW5kCisgKiBkZXN0aW5hdGlvbiBmaWx0ZXJzIGJldHdlZW4gd2hpY2ggdGhpcyBsaW5rIGV4aXN0cywgYW5kIHRoZSBpbmRleGVzIG9mCisgKiB0aGUgcGFkcyBpbnZvbHZlZC4gSW4gYWRkaXRpb24sIHRoaXMgbGluayBhbHNvIGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXJzCisgKiB3aGljaCBoYXZlIGJlZW4gbmVnb3RpYXRlZCBhbmQgYWdyZWVkIHVwb24gYmV0d2VlbiB0aGUgZmlsdGVyLCBzdWNoIGFzCisgKiBpbWFnZSBkaW1lbnNpb25zLCBmb3JtYXQsIGV0Yy4KKyAqLworc3RydWN0IEFWRmlsdGVyTGluayB7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpzcmM7ICAgICAgIC8vLzwgc291cmNlIGZpbHRlcgorICAgIEFWRmlsdGVyUGFkICpzcmNwYWQ7ICAgICAgICAvLy88IG91dHB1dCBwYWQgb24gdGhlIHNvdXJjZSBmaWx0ZXIKKworICAgIEFWRmlsdGVyQ29udGV4dCAqZHN0OyAgICAgICAvLy88IGRlc3QgZmlsdGVyCisgICAgQVZGaWx0ZXJQYWQgKmRzdHBhZDsgICAgICAgIC8vLzwgaW5wdXQgcGFkIG9uIHRoZSBkZXN0IGZpbHRlcgorCisgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlOyAgICAgIC8vLzwgZmlsdGVyIG1lZGlhIHR5cGUKKworICAgIC8qIFRoZXNlIHBhcmFtZXRlcnMgYXBwbHkgb25seSB0byB2aWRlbyAqLworICAgIGludCB3OyAgICAgICAgICAgICAgICAgICAgICAvLy88IGFncmVlZCB1cG9uIGltYWdlIHdpZHRoCisgICAgaW50IGg7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYWdyZWVkIHVwb24gaW1hZ2UgaGVpZ2h0CisgICAgQVZSYXRpb25hbCBzYW1wbGVfYXNwZWN0X3JhdGlvOyAvLy88IGFncmVlZCB1cG9uIHNhbXBsZSBhc3BlY3QgcmF0aW8KKyAgICAvKiBUaGVzZSBwYXJhbWV0ZXJzIGFwcGx5IG9ubHkgdG8gYXVkaW8gKi8KKyAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dDsgICAgLy8vPCBjaGFubmVsIGxheW91dCBvZiBjdXJyZW50IGJ1ZmZlciAoc2VlIGxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oKQorICAgIGludCBzYW1wbGVfcmF0ZTsgICAgICAgICAgICAvLy88IHNhbXBsZXMgcGVyIHNlY29uZAorCisgICAgaW50IGZvcm1hdDsgICAgICAgICAgICAgICAgIC8vLzwgYWdyZWVkIHVwb24gbWVkaWEgZm9ybWF0CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmUgdGhlIHRpbWUgYmFzZSB1c2VkIGJ5IHRoZSBQVFMgb2YgdGhlIGZyYW1lcy9zYW1wbGVzCisgICAgICogd2hpY2ggd2lsbCBwYXNzIHRocm91Z2ggdGhpcyBsaW5rLgorICAgICAqIER1cmluZyB0aGUgY29uZmlndXJhdGlvbiBzdGFnZSwgZWFjaCBmaWx0ZXIgaXMgc3VwcG9zZWQgdG8KKyAgICAgKiBjaGFuZ2Ugb25seSB0aGUgb3V0cHV0IHRpbWViYXNlLCB3aGlsZSB0aGUgdGltZWJhc2Ugb2YgdGhlCisgICAgICogaW5wdXQgbGluayBpcyBhc3N1bWVkIHRvIGJlIGFuIHVuY2hhbmdlYWJsZSBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEFsbCBmaWVsZHMgYmVsb3cgdGhpcyBsaW5lIGFyZSBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSS4gVGhleQorICAgICAqIG1heSBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGxpYmF2ZmlsdGVyIGFuZCBjYW4gYmUgY2hhbmdlZCBhbmQKKyAgICAgKiByZW1vdmVkIGF0IHdpbGwuCisgICAgICogTmV3IHB1YmxpYyBmaWVsZHMgc2hvdWxkIGJlIGFkZGVkIHJpZ2h0IGFib3ZlLgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworICAgIC8qKgorICAgICAqIExpc3RzIG9mIGZvcm1hdHMgYW5kIGNoYW5uZWwgbGF5b3V0cyBzdXBwb3J0ZWQgYnkgdGhlIGlucHV0IGFuZCBvdXRwdXQKKyAgICAgKiBmaWx0ZXJzIHJlc3BlY3RpdmVseS4gVGhlc2UgbGlzdHMgYXJlIHVzZWQgZm9yIG5lZ290aWF0aW5nIHRoZSBmb3JtYXQKKyAgICAgKiB0byBhY3R1YWxseSBiZSB1c2VkLCB3aGljaCB3aWxsIGJlIGxvYWRlZCBpbnRvIHRoZSBmb3JtYXQgYW5kCisgICAgICogY2hhbm5lbF9sYXlvdXQgbWVtYmVycywgYWJvdmUsIHdoZW4gY2hvc2VuLgorICAgICAqCisgICAgICovCisgICAgQVZGaWx0ZXJGb3JtYXRzICppbl9mb3JtYXRzOworICAgIEFWRmlsdGVyRm9ybWF0cyAqb3V0X2Zvcm1hdHM7CisKKyAgICAvKioKKyAgICAgKiBMaXN0cyBvZiBjaGFubmVsIGxheW91dHMgYW5kIHNhbXBsZSByYXRlcyB1c2VkIGZvciBhdXRvbWF0aWMKKyAgICAgKiBuZWdvdGlhdGlvbi4KKyAgICAgKi8KKyAgICBBVkZpbHRlckZvcm1hdHMgICppbl9zYW1wbGVyYXRlczsKKyAgICBBVkZpbHRlckZvcm1hdHMgKm91dF9zYW1wbGVyYXRlczsKKyAgICBzdHJ1Y3QgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAgKmluX2NoYW5uZWxfbGF5b3V0czsKKyAgICBzdHJ1Y3QgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqb3V0X2NoYW5uZWxfbGF5b3V0czsKKworICAgIC8qKgorICAgICAqIEF1ZGlvIG9ubHksIHRoZSBkZXN0aW5hdGlvbiBmaWx0ZXIgc2V0cyB0aGlzIHRvIGEgbm9uLXplcm8gdmFsdWUgdG8KKyAgICAgKiByZXF1ZXN0IHRoYXQgYnVmZmVycyB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2Ygc2FtcGxlcyBzaG91bGQgYmUgc2VudCB0bworICAgICAqIGl0LiBBVkZpbHRlclBhZC5uZWVkc19maWZvIG11c3QgYWxzbyBiZSBzZXQgb24gdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQKKyAgICAgKiBwYWQuCisgICAgICogTGFzdCBidWZmZXIgYmVmb3JlIEVPRiB3aWxsIGJlIHBhZGRlZCB3aXRoIHNpbGVuY2UuCisgICAgICovCisgICAgaW50IHJlcXVlc3Rfc2FtcGxlczsKKworICAgIC8qKiBzdGFnZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGxpbmsgcHJvcGVydGllcyAoZGltZW5zaW9ucywgZXRjKSAqLworICAgIGVudW0geworICAgICAgICBBVkxJTktfVU5JTklUID0gMCwgICAgICAvLy88IG5vdCBzdGFydGVkCisgICAgICAgIEFWTElOS19TVEFSVElOSVQsICAgICAgIC8vLzwgc3RhcnRlZCwgYnV0IGluY29tcGxldGUKKyAgICAgICAgQVZMSU5LX0lOSVQgICAgICAgICAgICAgLy8vPCBjb21wbGV0ZQorICAgIH0gaW5pdF9zdGF0ZTsKKworICAgIHN0cnVjdCBBVkZpbHRlclBvb2wgKnBvb2w7CisKKyAgICAvKioKKyAgICAgKiBHcmFwaCB0aGUgZmlsdGVyIGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgc3RydWN0IEFWRmlsdGVyR3JhcGggKmdyYXBoOworCisgICAgLyoqCisgICAgICogQ3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIGxpbmssIGFzIGRlZmluZWQgYnkgdGhlIG1vc3QgcmVjZW50CisgICAgICogZnJhbWUocyksIGluIEFWX1RJTUVfQkFTRSB1bml0cy4KKyAgICAgKi8KKyAgICBpbnQ2NF90IGN1cnJlbnRfcHRzOworCisgICAgLyoqCisgICAgICogSW5kZXggaW4gdGhlIGFnZSBhcnJheS4KKyAgICAgKi8KKyAgICBpbnQgYWdlX2luZGV4OworCisgICAgLyoqCisgICAgICogRnJhbWUgcmF0ZSBvZiB0aGUgc3RyZWFtIG9uIHRoZSBsaW5rLCBvciAxLzAgaWYgdW5rbm93bjsKKyAgICAgKiBpZiBsZWZ0IHRvIDAvMCwgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGJlIGNvcGllZCBmcm9tIHRoZSBmaXJzdCBpbnB1dAorICAgICAqIG9mIHRoZSBzb3VyY2UgZmlsdGVyIGlmIGl0IGV4aXN0cy4KKyAgICAgKgorICAgICAqIFNvdXJjZXMgc2hvdWxkIHNldCBpdCB0byB0aGUgYmVzdCBlc3RpbWF0aW9uIG9mIHRoZSByZWFsIGZyYW1lIHJhdGUuCisgICAgICogRmlsdGVycyBzaG91bGQgdXBkYXRlIGl0IGlmIG5lY2Vzc2FyeSBkZXBlbmRpbmcgb24gdGhlaXIgZnVuY3Rpb24uCisgICAgICogU2lua3MgY2FuIHVzZSBpdCB0byBzZXQgYSBkZWZhdWx0IG91dHB1dCBmcmFtZSByYXRlLgorICAgICAqIEl0IGlzIHNpbWlsYXIgdG8gdGhlIHJfZnJhbWVfcmF0ZSBmaWVsZCBpbiBBVlN0cmVhbS4KKyAgICAgKi8KKyAgICBBVlJhdGlvbmFsIGZyYW1lX3JhdGU7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgcGFydGlhbGx5IGZpbGxlZCB3aXRoIHNhbXBsZXMgdG8gYWNoaWV2ZSBhIGZpeGVkL21pbmltdW0gc2l6ZS4KKyAgICAgKi8KKyAgICBBVkZyYW1lICpwYXJ0aWFsX2J1ZjsKKworICAgIC8qKgorICAgICAqIFNpemUgb2YgdGhlIHBhcnRpYWwgYnVmZmVyIHRvIGFsbG9jYXRlLgorICAgICAqIE11c3QgYmUgYmV0d2VlbiBtaW5fc2FtcGxlcyBhbmQgbWF4X3NhbXBsZXMuCisgICAgICovCisgICAgaW50IHBhcnRpYWxfYnVmX3NpemU7CisKKyAgICAvKioKKyAgICAgKiBNaW5pbXVtIG51bWJlciBvZiBzYW1wbGVzIHRvIGZpbHRlciBhdCBvbmNlLiBJZiBmaWx0ZXJfZnJhbWUoKSBpcworICAgICAqIGNhbGxlZCB3aXRoIGZld2VyIHNhbXBsZXMsIGl0IHdpbGwgYWNjdW11bGF0ZSB0aGVtIGluIHBhcnRpYWxfYnVmLgorICAgICAqIFRoaXMgZmllbGQgYW5kIHRoZSByZWxhdGVkIG9uZXMgbXVzdCBub3QgYmUgY2hhbmdlZCBhZnRlciBmaWx0ZXJpbmcKKyAgICAgKiBoYXMgc3RhcnRlZC4KKyAgICAgKiBJZiAwLCBhbGwgcmVsYXRlZCBmaWVsZHMgYXJlIGlnbm9yZWQuCisgICAgICovCisgICAgaW50IG1pbl9zYW1wbGVzOworCisgICAgLyoqCisgICAgICogTWF4aW11bSBudW1iZXIgb2Ygc2FtcGxlcyB0byBmaWx0ZXIgYXQgb25jZS4gSWYgZmlsdGVyX2ZyYW1lKCkgaXMKKyAgICAgKiBjYWxsZWQgd2l0aCBtb3JlIHNhbXBsZXMsIGl0IHdpbGwgc3BsaXQgdGhlbS4KKyAgICAgKi8KKyAgICBpbnQgbWF4X3NhbXBsZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYnVmZmVyIHJlZmVyZW5jZSBjdXJyZW50bHkgYmVpbmcgcmVjZWl2ZWQgYWNyb3NzIHRoZSBsaW5rIGJ5IHRoZQorICAgICAqIGRlc3RpbmF0aW9uIGZpbHRlci4gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGZpbHRlciBzeXN0ZW0gdG8KKyAgICAgKiBhbGxvdyBhdXRvbWF0aWMgY29weWluZyBvZiBidWZmZXJzIHdoaWNoIGRvIG5vdCBoYXZlIHN1ZmZpY2llbnQKKyAgICAgKiBwZXJtaXNzaW9ucyBmb3IgdGhlIGRlc3RpbmF0aW9uLiBUaGlzIHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHkKKyAgICAgKiBieSB0aGUgZmlsdGVycy4KKyAgICAgKi8KKyAgICBBVkZpbHRlckJ1ZmZlclJlZiAqY3VyX2J1Zl9jb3B5OworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgbGluayBpcyBjbG9zZWQuCisgICAgICogSWYgc2V0LCBhbGwgYXR0ZW1wdHMgb2Ygc3RhcnRfZnJhbWUsIGZpbHRlcl9mcmFtZSBvciByZXF1ZXN0X2ZyYW1lCisgICAgICogd2lsbCBmYWlsIHdpdGggQVZFUlJPUl9FT0YsIGFuZCBpZiBuZWNlc3NhcnkgdGhlIHJlZmVyZW5jZSB3aWxsIGJlCisgICAgICogZGVzdHJveWVkLgorICAgICAqIElmIHJlcXVlc3RfZnJhbWUgcmV0dXJucyBBVkVSUk9SX0VPRiwgdGhpcyBmbGFnIGlzIHNldCBvbiB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIGxpbmsuCisgICAgICogSXQgY2FuIGJlIHNldCBhbHNvIGJlIHNldCBieSBlaXRoZXIgdGhlIHNvdXJjZSBvciB0aGUgZGVzdGluYXRpb24KKyAgICAgKiBmaWx0ZXIuCisgICAgICovCisgICAgaW50IGNsb3NlZDsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBjaGFubmVscy4KKyAgICAgKi8KKyAgICBpbnQgY2hhbm5lbHM7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIGEgZnJhbWUgaXMgYmVpbmcgcmVxdWVzdGVkIG9uIHRoZSBsaW5rLgorICAgICAqIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgZnJhbWV3b3JrLgorICAgICAqLworICAgIHVuc2lnbmVkIGZyYW1lX3JlcXVlc3RlZDsKKworICAgIC8qKgorICAgICAqIExpbmsgcHJvY2Vzc2luZyBmbGFncy4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBmbGFnczsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBwYXN0IGZyYW1lcyBzZW50IHRocm91Z2ggdGhlIGxpbmsuCisgICAgICovCisgICAgaW50NjRfdCBmcmFtZV9jb3VudDsKK307CisKKy8qKgorICogTGluayB0d28gZmlsdGVycyB0b2dldGhlci4KKyAqCisgKiBAcGFyYW0gc3JjICAgIHRoZSBzb3VyY2UgZmlsdGVyCisgKiBAcGFyYW0gc3JjcGFkIGluZGV4IG9mIHRoZSBvdXRwdXQgcGFkIG9uIHRoZSBzb3VyY2UgZmlsdGVyCisgKiBAcGFyYW0gZHN0ICAgIHRoZSBkZXN0aW5hdGlvbiBmaWx0ZXIKKyAqIEBwYXJhbSBkc3RwYWQgaW5kZXggb2YgdGhlIGlucHV0IHBhZCBvbiB0aGUgZGVzdGluYXRpb24gZmlsdGVyCisgKiBAcmV0dXJuICAgICAgIHplcm8gb24gc3VjY2VzcworICovCitpbnQgYXZmaWx0ZXJfbGluayhBVkZpbHRlckNvbnRleHQgKnNyYywgdW5zaWduZWQgc3JjcGFkLAorICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpkc3QsIHVuc2lnbmVkIGRzdHBhZCk7CisKKy8qKgorICogRnJlZSB0aGUgbGluayBpbiAqbGluaywgYW5kIHNldCBpdHMgcG9pbnRlciB0byBOVUxMLgorICovCit2b2lkIGF2ZmlsdGVyX2xpbmtfZnJlZShBVkZpbHRlckxpbmsgKipsaW5rKTsKKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBjaGFubmVscyBvZiBhIGxpbmsuCisgKi8KK2ludCBhdmZpbHRlcl9saW5rX2dldF9jaGFubmVscyhBVkZpbHRlckxpbmsgKmxpbmspOworCisvKioKKyAqIFNldCB0aGUgY2xvc2VkIGZpZWxkIG9mIGEgbGluay4KKyAqLwordm9pZCBhdmZpbHRlcl9saW5rX3NldF9jbG9zZWQoQVZGaWx0ZXJMaW5rICpsaW5rLCBpbnQgY2xvc2VkKTsKKworLyoqCisgKiBOZWdvdGlhdGUgdGhlIG1lZGlhIGZvcm1hdCwgZGltZW5zaW9ucywgZXRjIG9mIGFsbCBpbnB1dHMgdG8gYSBmaWx0ZXIuCisgKgorICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyIHRvIG5lZ290aWF0ZSB0aGUgcHJvcGVydGllcyBmb3IgaXRzIGlucHV0cworICogQHJldHVybiAgICAgICB6ZXJvIG9uIHN1Y2Nlc3NmdWwgbmVnb3RpYXRpb24KKyAqLworaW50IGF2ZmlsdGVyX2NvbmZpZ19saW5rcyhBVkZpbHRlckNvbnRleHQgKmZpbHRlcik7CisKKyNpZiBGRl9BUElfQVZGSUxURVJCVUZGRVIKKy8qKgorICogQ3JlYXRlIGEgYnVmZmVyIHJlZmVyZW5jZSB3cmFwcGVkIGFyb3VuZCBhbiBhbHJlYWR5IGFsbG9jYXRlZCBpbWFnZQorICogYnVmZmVyLgorICoKKyAqIEBwYXJhbSBkYXRhIHBvaW50ZXJzIHRvIHRoZSBwbGFuZXMgb2YgdGhlIGltYWdlIHRvIHJlZmVyZW5jZQorICogQHBhcmFtIGxpbmVzaXplIGxpbmVzaXplcyBmb3IgdGhlIHBsYW5lcyBvZiB0aGUgaW1hZ2UgdG8gcmVmZXJlbmNlCisgKiBAcGFyYW0gcGVybXMgdGhlIHJlcXVpcmVkIGFjY2VzcyBwZXJtaXNzaW9ucworICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBzcGVjaWZpZWQgYnkgdGhlIGRhdGEgYW5kIGxpbmVzaXplIGFycmF5cworICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2Ugc3BlY2lmaWVkIGJ5IHRoZSBkYXRhIGFuZCBsaW5lc2l6ZSBhcnJheXMKKyAqIEBwYXJhbSBmb3JtYXQgdGhlIHBpeGVsIGZvcm1hdCBvZiB0aGUgaW1hZ2Ugc3BlY2lmaWVkIGJ5IHRoZSBkYXRhIGFuZCBsaW5lc2l6ZSBhcnJheXMKKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK0FWRmlsdGVyQnVmZmVyUmVmICoKK2F2ZmlsdGVyX2dldF92aWRlb19idWZmZXJfcmVmX2Zyb21fYXJyYXlzKHVpbnQ4X3QgKiBjb25zdCBkYXRhWzRdLCBjb25zdCBpbnQgbGluZXNpemVbNF0sIGludCBwZXJtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdCk7CisKKy8qKgorICogQ3JlYXRlIGFuIGF1ZGlvIGJ1ZmZlciByZWZlcmVuY2Ugd3JhcHBlZCBhcm91bmQgYW4gYWxyZWFkeQorICogYWxsb2NhdGVkIHNhbXBsZXMgYnVmZmVyLgorICoKKyAqIFNlZSBhdmZpbHRlcl9nZXRfYXVkaW9fYnVmZmVyX3JlZl9mcm9tX2FycmF5c19jaGFubmVscygpIGZvciBhIHZlcnNpb24KKyAqIHRoYXQgY2FuIGhhbmRsZSB1bmtub3duIGNoYW5uZWwgbGF5b3V0cy4KKyAqCisgKiBAcGFyYW0gZGF0YSAgICAgICAgICAgcG9pbnRlcnMgdG8gdGhlIHNhbXBsZXMgcGxhbmUgYnVmZmVycworICogQHBhcmFtIGxpbmVzaXplICAgICAgIGxpbmVzaXplIGZvciB0aGUgc2FtcGxlcyBwbGFuZSBidWZmZXJzCisgKiBAcGFyYW0gcGVybXMgICAgICAgICAgdGhlIHJlcXVpcmVkIGFjY2VzcyBwZXJtaXNzaW9ucworICogQHBhcmFtIG5iX3NhbXBsZXMgICAgIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsCisgKiBAcGFyYW0gc2FtcGxlX2ZtdCAgICAgdGhlIGZvcm1hdCBvZiBlYWNoIHNhbXBsZSBpbiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlCisgKiBAcGFyYW0gY2hhbm5lbF9sYXlvdXQgdGhlIGNoYW5uZWwgbGF5b3V0IG9mIHRoZSBidWZmZXIKKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK0FWRmlsdGVyQnVmZmVyUmVmICphdmZpbHRlcl9nZXRfYXVkaW9fYnVmZmVyX3JlZl9mcm9tX2FycmF5cyh1aW50OF90ICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dCk7CisvKioKKyAqIENyZWF0ZSBhbiBhdWRpbyBidWZmZXIgcmVmZXJlbmNlIHdyYXBwZWQgYXJvdW5kIGFuIGFscmVhZHkKKyAqIGFsbG9jYXRlZCBzYW1wbGVzIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gZGF0YSAgICAgICAgICAgcG9pbnRlcnMgdG8gdGhlIHNhbXBsZXMgcGxhbmUgYnVmZmVycworICogQHBhcmFtIGxpbmVzaXplICAgICAgIGxpbmVzaXplIGZvciB0aGUgc2FtcGxlcyBwbGFuZSBidWZmZXJzCisgKiBAcGFyYW0gcGVybXMgICAgICAgICAgdGhlIHJlcXVpcmVkIGFjY2VzcyBwZXJtaXNzaW9ucworICogQHBhcmFtIG5iX3NhbXBsZXMgICAgIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsCisgKiBAcGFyYW0gc2FtcGxlX2ZtdCAgICAgdGhlIGZvcm1hdCBvZiBlYWNoIHNhbXBsZSBpbiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlCisgKiBAcGFyYW0gY2hhbm5lbHMgICAgICAgdGhlIG51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgYnVmZmVyCisgKiBAcGFyYW0gY2hhbm5lbF9sYXlvdXQgdGhlIGNoYW5uZWwgbGF5b3V0IG9mIHRoZSBidWZmZXIsCisgKiAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBlaXRoZXIgMCBvciBjb25zaXN0ZW50IHdpdGggY2hhbm5lbHMKKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK0FWRmlsdGVyQnVmZmVyUmVmICphdmZpbHRlcl9nZXRfYXVkaW9fYnVmZmVyX3JlZl9mcm9tX2FycmF5c19jaGFubmVscyh1aW50OF90ICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY2hhbm5lbF9sYXlvdXQpOworCisjZW5kaWYKKworCisjZGVmaW5lIEFWRklMVEVSX0NNRF9GTEFHX09ORSAgIDEgLy8vPCBTdG9wIG9uY2UgYSBmaWx0ZXIgdW5kZXJzdG9vZCB0aGUgY29tbWFuZCAoZm9yIHRhcmdldD1hbGwgZm9yIGV4YW1wbGUpLCBmYXN0IGZpbHRlcnMgYXJlIGZhdm9yZWQgYXV0b21hdGljYWxseQorI2RlZmluZSBBVkZJTFRFUl9DTURfRkxBR19GQVNUICAyIC8vLzwgT25seSBleGVjdXRlIGNvbW1hbmQgd2hlbiBpdHMgZmFzdCAobGlrZSBhIHZpZGVvIG91dCB0aGF0IHN1cHBvcnRzIGNvbnRyYXN0IGFkanVzdG1lbnQgaW4gaHcpCisKKy8qKgorICogTWFrZSB0aGUgZmlsdGVyIGluc3RhbmNlIHByb2Nlc3MgYSBjb21tYW5kLgorICogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGF2ZmlsdGVyX2dyYXBoX3NlbmRfY29tbWFuZCgpLgorICovCitpbnQgYXZmaWx0ZXJfcHJvY2Vzc19jb21tYW5kKEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyLCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZywgY2hhciAqcmVzLCBpbnQgcmVzX2xlbiwgaW50IGZsYWdzKTsKKworLyoqIEluaXRpYWxpemUgdGhlIGZpbHRlciBzeXN0ZW0uIFJlZ2lzdGVyIGFsbCBidWlsdGluIGZpbHRlcnMuICovCit2b2lkIGF2ZmlsdGVyX3JlZ2lzdGVyX2FsbCh2b2lkKTsKKworI2lmIEZGX0FQSV9PTERfRklMVEVSX1JFR0lTVEVSCisvKiogVW5pbml0aWFsaXplIHRoZSBmaWx0ZXIgc3lzdGVtLiBVbnJlZ2lzdGVyIGFsbCBmaWx0ZXJzLiAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK3ZvaWQgYXZmaWx0ZXJfdW5pbml0KHZvaWQpOworI2VuZGlmCisKKy8qKgorICogUmVnaXN0ZXIgYSBmaWx0ZXIuIFRoaXMgaXMgb25seSBuZWVkZWQgaWYgeW91IHBsYW4gdG8gdXNlCisgKiBhdmZpbHRlcl9nZXRfYnlfbmFtZSBsYXRlciB0byBsb29rdXAgdGhlIEFWRmlsdGVyIHN0cnVjdHVyZSBieSBuYW1lLiBBCisgKiBmaWx0ZXIgY2FuIHN0aWxsIGJ5IGluc3RhbnRpYXRlZCB3aXRoIGF2ZmlsdGVyX2dyYXBoX2FsbG9jX2ZpbHRlciBldmVuIGlmIGl0CisgKiBpcyBub3QgcmVnaXN0ZXJlZC4KKyAqCisgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgdG8gcmVnaXN0ZXIKKyAqIEByZXR1cm4gMCBpZiB0aGUgcmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIHZhbHVlCisgKiBvdGhlcndpc2UKKyAqLworaW50IGF2ZmlsdGVyX3JlZ2lzdGVyKEFWRmlsdGVyICpmaWx0ZXIpOworCisvKioKKyAqIEdldCBhIGZpbHRlciBkZWZpbml0aW9uIG1hdGNoaW5nIHRoZSBnaXZlbiBuYW1lLgorICoKKyAqIEBwYXJhbSBuYW1lIHRoZSBmaWx0ZXIgbmFtZSB0byBmaW5kCisgKiBAcmV0dXJuICAgICB0aGUgZmlsdGVyIGRlZmluaXRpb24sIGlmIGFueSBtYXRjaGluZyBvbmUgaXMgcmVnaXN0ZXJlZC4KKyAqICAgICAgICAgICAgIE5VTEwgaWYgbm9uZSBmb3VuZC4KKyAqLworI2lmICFGRl9BUElfTk9DT05TVF9HRVRfTkFNRQorY29uc3QKKyNlbmRpZgorQVZGaWx0ZXIgKmF2ZmlsdGVyX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworCisvKioKKyAqIEl0ZXJhdGUgb3ZlciBhbGwgcmVnaXN0ZXJlZCBmaWx0ZXJzLgorICogQHJldHVybiBJZiBwcmV2IGlzIG5vbi1OVUxMLCBuZXh0IHJlZ2lzdGVyZWQgZmlsdGVyIGFmdGVyIHByZXYgb3IgTlVMTCBpZgorICogcHJldiBpcyB0aGUgbGFzdCBmaWx0ZXIuIElmIHByZXYgaXMgTlVMTCwgcmV0dXJuIHRoZSBmaXJzdCByZWdpc3RlcmVkIGZpbHRlci4KKyAqLworY29uc3QgQVZGaWx0ZXIgKmF2ZmlsdGVyX25leHQoY29uc3QgQVZGaWx0ZXIgKnByZXYpOworCisjaWYgRkZfQVBJX09MRF9GSUxURVJfUkVHSVNURVIKKy8qKgorICogSWYgZmlsdGVyIGlzIE5VTEwsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCByZWdpc3RlcmVkIGZpbHRlciBwb2ludGVyLAorICogaWYgZmlsdGVyIGlzIG5vbi1OVUxMLCByZXR1cm5zIHRoZSBuZXh0IHBvaW50ZXIgYWZ0ZXIgZmlsdGVyLgorICogSWYgdGhlIHJldHVybmVkIHBvaW50ZXIgcG9pbnRzIHRvIE5VTEwsIHRoZSBsYXN0IHJlZ2lzdGVyZWQgZmlsdGVyCisgKiB3YXMgYWxyZWFkeSByZWFjaGVkLgorICogQGRlcHJlY2F0ZWQgdXNlIGF2ZmlsdGVyX25leHQoKQorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAorQVZGaWx0ZXIgKiphdl9maWx0ZXJfbmV4dChBVkZpbHRlciAqKmZpbHRlcik7CisjZW5kaWYKKworI2lmIEZGX0FQSV9BVkZJTFRFUl9PUEVOCisvKioKKyAqIENyZWF0ZSBhIGZpbHRlciBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gZmlsdGVyX2N0eCBwdXQgaGVyZSBhIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgZmlsdGVyIGNvbnRleHQKKyAqIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZQorICogQHBhcmFtIGZpbHRlciAgICB0aGUgZmlsdGVyIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZgorICogQHBhcmFtIGluc3RfbmFtZSBOYW1lIHRvIGdpdmUgdG8gdGhlIG5ldyBpbnN0YW5jZS4gQ2FuIGJlIE5VTEwgZm9yIG5vbmUuCisgKiBAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKiBAZGVwcmVjYXRlZCB1c2UgYXZmaWx0ZXJfZ3JhcGhfYWxsb2NfZmlsdGVyKCkgaW5zdGVhZAorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IGF2ZmlsdGVyX29wZW4oQVZGaWx0ZXJDb250ZXh0ICoqZmlsdGVyX2N0eCwgQVZGaWx0ZXIgKmZpbHRlciwgY29uc3QgY2hhciAqaW5zdF9uYW1lKTsKKyNlbmRpZgorCisKKyNpZiBGRl9BUElfQVZGSUxURVJfSU5JVF9GSUxURVIKKy8qKgorICogSW5pdGlhbGl6ZSBhIGZpbHRlci4KKyAqCisgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgdG8gaW5pdGlhbGl6ZQorICogQHBhcmFtIGFyZ3MgICBBIHN0cmluZyBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGluaXRpYWxpemluZyB0aGUgZmlsdGVyLgorICogICAgICAgICAgICAgICBUaGUgZm9ybWF0IGFuZCBtZWFuaW5nIG9mIHRoaXMgc3RyaW5nIHZhcmllcyBieSBmaWx0ZXIuCisgKiBAcGFyYW0gb3BhcXVlIEFueSBleHRyYSBub24tc3RyaW5nIGRhdGEgbmVlZGVkIGJ5IHRoZSBmaWx0ZXIuIFRoZSBtZWFuaW5nCisgKiAgICAgICAgICAgICAgIG9mIHRoaXMgcGFyYW1ldGVyIHZhcmllcyBieSBmaWx0ZXIuCisgKiBAcmV0dXJuICAgICAgIHplcm8gb24gc3VjY2VzcworICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IGF2ZmlsdGVyX2luaXRfZmlsdGVyKEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyLCBjb25zdCBjaGFyICphcmdzLCB2b2lkICpvcGFxdWUpOworI2VuZGlmCisKKy8qKgorICogSW5pdGlhbGl6ZSBhIGZpbHRlciB3aXRoIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSBjdHggIHVuaW5pdGlhbGl6ZWQgZmlsdGVyIGNvbnRleHQgdG8gaW5pdGlhbGl6ZQorICogQHBhcmFtIGFyZ3MgT3B0aW9ucyB0byBpbml0aWFsaXplIHRoZSBmaWx0ZXIgd2l0aC4gVGhpcyBtdXN0IGJlIGEKKyAqICAgICAgICAgICAgICc6Jy1zZXBhcmF0ZWQgbGlzdCBvZiBvcHRpb25zIGluIHRoZSAna2V5PXZhbHVlJyBmb3JtLgorICogICAgICAgICAgICAgTWF5IGJlIE5VTEwgaWYgdGhlIG9wdGlvbnMgaGF2ZSBiZWVuIHNldCBkaXJlY3RseSB1c2luZyB0aGUKKyAqICAgICAgICAgICAgIEFWT3B0aW9ucyBBUEkgb3IgdGhlcmUgYXJlIG5vIG9wdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHNldC4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1Igb24gZmFpbHVyZQorICovCitpbnQgYXZmaWx0ZXJfaW5pdF9zdHIoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmFyZ3MpOworCisvKioKKyAqIEluaXRpYWxpemUgYSBmaWx0ZXIgd2l0aCB0aGUgc3VwcGxpZWQgZGljdGlvbmFyeSBvZiBvcHRpb25zLgorICoKKyAqIEBwYXJhbSBjdHggICAgIHVuaW5pdGlhbGl6ZWQgZmlsdGVyIGNvbnRleHQgdG8gaW5pdGlhbGl6ZQorICogQHBhcmFtIG9wdGlvbnMgQW4gQVZEaWN0aW9uYXJ5IGZpbGxlZCB3aXRoIG9wdGlvbnMgZm9yIHRoaXMgZmlsdGVyLiBPbgorICogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgZGVzdHJveWVkIGFuZCByZXBsYWNlZCB3aXRoCisgKiAgICAgICAgICAgICAgICBhIGRpY3QgY29udGFpbmluZyBvcHRpb25zIHRoYXQgd2VyZSBub3QgZm91bmQuIFRoaXMgZGljdGlvbmFyeQorICogICAgICAgICAgICAgICAgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICogICAgICAgICAgICAgICAgTWF5IGJlIE5VTEwsIHRoZW4gdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvCisgKiAgICAgICAgICAgICAgICBhdmZpbHRlcl9pbml0X3N0cigpIHdpdGggdGhlIHNlY29uZCBwYXJhbWV0ZXIgc2V0IHRvIE5VTEwuCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIG9uIGZhaWx1cmUKKyAqCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGFuZCBhdmZpbHRlcl9pbml0X3N0cigpIGRvIGVzc2VudGlhbGx5IHRoZSBzYW1lIHRoaW5nLAorICogdGhlIGRpZmZlcmVuY2UgaXMgaW4gbWFubmVyIGluIHdoaWNoIHRoZSBvcHRpb25zIGFyZSBwYXNzZWQuIEl0IGlzIHVwIHRvIHRoZQorICogY2FsbGluZyBjb2RlIHRvIGNob29zZSB3aGljaGV2ZXIgaXMgbW9yZSBwcmVmZXJhYmxlLiBUaGUgdHdvIGZ1bmN0aW9ucyBhbHNvCisgKiBiZWhhdmUgZGlmZmVyZW50bHkgd2hlbiBzb21lIG9mIHRoZSBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgZGVjbGFyZWQgYXMKKyAqIHN1cHBvcnRlZCBieSB0aGUgZmlsdGVyLiBJbiBzdWNoIGEgY2FzZSwgYXZmaWx0ZXJfaW5pdF9zdHIoKSB3aWxsIGZhaWwsIGJ1dAorICogdGhpcyBmdW5jdGlvbiB3aWxsIGxlYXZlIHRob3NlIGV4dHJhIG9wdGlvbnMgaW4gdGhlIG9wdGlvbnMgQVZEaWN0aW9uYXJ5IGFuZAorICogY29udGludWUgYXMgdXN1YWwuCisgKi8KK2ludCBhdmZpbHRlcl9pbml0X2RpY3QoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpOworCisvKioKKyAqIEZyZWUgYSBmaWx0ZXIgY29udGV4dC4gVGhpcyB3aWxsIGFsc28gcmVtb3ZlIHRoZSBmaWx0ZXIgZnJvbSBpdHMKKyAqIGZpbHRlcmdyYXBoJ3MgbGlzdCBvZiBmaWx0ZXJzLgorICoKKyAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciB0byBmcmVlCisgKi8KK3ZvaWQgYXZmaWx0ZXJfZnJlZShBVkZpbHRlckNvbnRleHQgKmZpbHRlcik7CisKKy8qKgorICogSW5zZXJ0IGEgZmlsdGVyIGluIHRoZSBtaWRkbGUgb2YgYW4gZXhpc3RpbmcgbGluay4KKyAqCisgKiBAcGFyYW0gbGluayB0aGUgbGluayBpbnRvIHdoaWNoIHRoZSBmaWx0ZXIgc2hvdWxkIGJlIGluc2VydGVkCisgKiBAcGFyYW0gZmlsdCB0aGUgZmlsdGVyIHRvIGJlIGluc2VydGVkCisgKiBAcGFyYW0gZmlsdF9zcmNwYWRfaWR4IHRoZSBpbnB1dCBwYWQgb24gdGhlIGZpbHRlciB0byBjb25uZWN0CisgKiBAcGFyYW0gZmlsdF9kc3RwYWRfaWR4IHRoZSBvdXRwdXQgcGFkIG9uIHRoZSBmaWx0ZXIgdG8gY29ubmVjdAorICogQHJldHVybiAgICAgemVybyBvbiBzdWNjZXNzCisgKi8KK2ludCBhdmZpbHRlcl9pbnNlcnRfZmlsdGVyKEFWRmlsdGVyTGluayAqbGluaywgQVZGaWx0ZXJDb250ZXh0ICpmaWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmlsdF9zcmNwYWRfaWR4LCB1bnNpZ25lZCBmaWx0X2RzdHBhZF9pZHgpOworCisjaWYgRkZfQVBJX0FWRklMVEVSQlVGRkVSCisvKioKKyAqIENvcHkgdGhlIGZyYW1lIHByb3BlcnRpZXMgb2Ygc3JjIHRvIGRzdCwgd2l0aG91dCBjb3B5aW5nIHRoZSBhY3R1YWwKKyAqIGltYWdlIGRhdGEuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGVycm9yLgorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IGF2ZmlsdGVyX2NvcHlfZnJhbWVfcHJvcHMoQVZGaWx0ZXJCdWZmZXJSZWYgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjKTsKKworLyoqCisgKiBDb3B5IHRoZSBmcmFtZSBwcm9wZXJ0aWVzIGFuZCBkYXRhIHBvaW50ZXJzIG9mIHNyYyB0byBkc3QsIHdpdGhvdXQgY29weWluZworICogdGhlIGFjdHVhbCBkYXRhLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvbiBlcnJvci4KKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK2ludCBhdmZpbHRlcl9jb3B5X2J1Zl9wcm9wcyhBVkZyYW1lICpkc3QsIGNvbnN0IEFWRmlsdGVyQnVmZmVyUmVmICpzcmMpOworI2VuZGlmCisKKy8qKgorICogQHJldHVybiBBVkNsYXNzIGZvciBBVkZpbHRlckNvbnRleHQuCisgKgorICogQHNlZSBhdl9vcHRfZmluZCgpLgorICovCitjb25zdCBBVkNsYXNzICphdmZpbHRlcl9nZXRfY2xhc3Modm9pZCk7CisKK3R5cGVkZWYgc3RydWN0IEFWRmlsdGVyR3JhcGhJbnRlcm5hbCBBVkZpbHRlckdyYXBoSW50ZXJuYWw7CisKKy8qKgorICogQSBmdW5jdGlvbiBwb2ludGVyIHBhc3NlZCB0byB0aGUgQHJlZiBBVkZpbHRlckdyYXBoLmV4ZWN1dGUgY2FsbGJhY2sgdG8gYmUKKyAqIGV4ZWN1dGVkIG11bHRpcGxlIHRpbWVzLCBwb3NzaWJseSBpbiBwYXJhbGxlbC4KKyAqCisgKiBAcGFyYW0gY3R4IHRoZSBmaWx0ZXIgY29udGV4dCB0aGUgam9iIGJlbG9uZ3MgdG8KKyAqIEBwYXJhbSBhcmcgYW4gb3BhcXVlIHBhcmFtZXRlciBwYXNzZWQgdGhyb3VnaCBmcm9tIEByZWYKKyAqICAgICAgICAgICAgQVZGaWx0ZXJHcmFwaC5leGVjdXRlCisgKiBAcGFyYW0gam9ibnIgdGhlIGluZGV4IG9mIHRoZSBqb2IgYmVpbmcgZXhlY3V0ZWQKKyAqIEBwYXJhbSBuYl9qb2JzIHRoZSB0b3RhbCBudW1iZXIgb2Ygam9icworICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1Igb24gZXJyb3IKKyAqLwordHlwZWRlZiBpbnQgKGF2ZmlsdGVyX2FjdGlvbl9mdW5jKShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKTsKKworLyoqCisgKiBBIGZ1bmN0aW9uIGV4ZWN1dGluZyBtdWx0aXBsZSBqb2JzLCBwb3NzaWJseSBpbiBwYXJhbGxlbC4KKyAqCisgKiBAcGFyYW0gY3R4IHRoZSBmaWx0ZXIgY29udGV4dCB0byB3aGljaCB0aGUgam9icyBiZWxvbmcKKyAqIEBwYXJhbSBmdW5jIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKKyAqIEBwYXJhbSBhcmcgdGhlIGFyZ3VtZW50IHRvIGJlIHBhc3NlZCB0byBmdW5jCisgKiBAcGFyYW0gcmV0IGEgbmJfam9icy1zaXplZCBhcnJheSB0byBiZSBmaWxsZWQgd2l0aCByZXR1cm4gdmFsdWVzIGZyb20gZWFjaAorICogICAgICAgICAgICBpbnZvY2F0aW9uIG9mIGZ1bmMKKyAqIEBwYXJhbSBuYl9qb2JzIHRoZSBudW1iZXIgb2Ygam9icyB0byBleGVjdXRlCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBvbiBlcnJvcgorICovCit0eXBlZGVmIGludCAoYXZmaWx0ZXJfZXhlY3V0ZV9mdW5jKShBVkZpbHRlckNvbnRleHQgKmN0eCwgYXZmaWx0ZXJfYWN0aW9uX2Z1bmMgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcsIGludCAqcmV0LCBpbnQgbmJfam9icyk7CisKK3R5cGVkZWYgc3RydWN0IEFWRmlsdGVyR3JhcGggeworICAgIGNvbnN0IEFWQ2xhc3MgKmF2X2NsYXNzOworI2lmIEZGX0FQSV9GT09fQ09VTlQKKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorICAgIHVuc2lnbmVkIGZpbHRlcl9jb3VudF91bnVzZWQ7CisjZW5kaWYKKyAgICBBVkZpbHRlckNvbnRleHQgKipmaWx0ZXJzOworI2lmICFGRl9BUElfRk9PX0NPVU5UCisgICAgdW5zaWduZWQgbmJfZmlsdGVyczsKKyNlbmRpZgorCisgICAgY2hhciAqc2NhbGVfc3dzX29wdHM7IC8vLzwgc3dzIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUgYXV0by1pbnNlcnRlZCBzY2FsZSBmaWx0ZXJzCisgICAgY2hhciAqcmVzYW1wbGVfbGF2cl9vcHRzOyAgIC8vLzwgbGliYXZyZXNhbXBsZSBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIGF1dG8taW5zZXJ0ZWQgcmVzYW1wbGUgZmlsdGVycworI2lmIEZGX0FQSV9GT09fQ09VTlQKKyAgICB1bnNpZ25lZCBuYl9maWx0ZXJzOworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBUeXBlIG9mIG11bHRpdGhyZWFkaW5nIGFsbG93ZWQgZm9yIGZpbHRlcnMgaW4gdGhpcyBncmFwaC4gQSBjb21iaW5hdGlvbgorICAgICAqIG9mIEFWRklMVEVSX1RIUkVBRF8qIGZsYWdzLgorICAgICAqCisgICAgICogTWF5IGJlIHNldCBieSB0aGUgY2FsbGVyIGF0IGFueSBwb2ludCwgdGhlIHNldHRpbmcgd2lsbCBhcHBseSB0byBhbGwKKyAgICAgKiBmaWx0ZXJzIGluaXRpYWxpemVkIGFmdGVyIHRoYXQuIFRoZSBkZWZhdWx0IGlzIGFsbG93aW5nIGV2ZXJ5dGhpbmcuCisgICAgICoKKyAgICAgKiBXaGVuIGEgZmlsdGVyIGluIHRoaXMgZ3JhcGggaXMgaW5pdGlhbGl6ZWQsIHRoaXMgZmllbGQgaXMgY29tYmluZWQgdXNpbmcKKyAgICAgKiBiaXQgQU5EIHdpdGggQVZGaWx0ZXJDb250ZXh0LnRocmVhZF90eXBlIHRvIGdldCB0aGUgZmluYWwgbWFzayB1c2VkIGZvcgorICAgICAqIGRldGVybWluaW5nIGFsbG93ZWQgdGhyZWFkaW5nIHR5cGVzLiBJLmUuIGEgdGhyZWFkaW5nIHR5cGUgbmVlZHMgdG8gYmUKKyAgICAgKiBzZXQgaW4gYm90aCB0byBiZSBhbGxvd2VkLgorICAgICAqLworICAgIGludCB0aHJlYWRfdHlwZTsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdXNlZCBieSBmaWx0ZXJzIGluIHRoaXMgZ3JhcGguIE1heSBiZSBzZXQgYnkKKyAgICAgKiB0aGUgY2FsbGVyIGJlZm9yZSBhZGRpbmcgYW55IGZpbHRlcnMgdG8gdGhlIGZpbHRlcmdyYXBoLiBaZXJvICh0aGUKKyAgICAgKiBkZWZhdWx0KSBtZWFucyB0aGF0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpcyBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkuCisgICAgICovCisgICAgaW50IG5iX3RocmVhZHM7CisKKyAgICAvKioKKyAgICAgKiBPcGFxdWUgb2JqZWN0IGZvciBsaWJhdmZpbHRlciBpbnRlcm5hbCB1c2UuCisgICAgICovCisgICAgQVZGaWx0ZXJHcmFwaEludGVybmFsICppbnRlcm5hbDsKKworICAgIC8qKgorICAgICAqIE9wYXF1ZSB1c2VyIGRhdGEuIE1heSBiZSBzZXQgYnkgdGhlIGNhbGxlciB0byBhbiBhcmJpdHJhcnkgdmFsdWUsIGUuZy4gdG8KKyAgICAgKiBiZSB1c2VkIGZyb20gY2FsbGJhY2tzIGxpa2UgQHJlZiBBVkZpbHRlckdyYXBoLmV4ZWN1dGUuCisgICAgICogTGliYXZmaWx0ZXIgd2lsbCBub3QgdG91Y2ggdGhpcyBmaWVsZCBpbiBhbnkgd2F5LgorICAgICAqLworICAgIHZvaWQgKm9wYXF1ZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2FsbGJhY2sgbWF5IGJlIHNldCBieSB0aGUgY2FsbGVyIGltbWVkaWF0ZWx5IGFmdGVyIGFsbG9jYXRpbmcgdGhlCisgICAgICogZ3JhcGggYW5kIGJlZm9yZSBhZGRpbmcgYW55IGZpbHRlcnMgdG8gaXQsIHRvIHByb3ZpZGUgYSBjdXN0b20KKyAgICAgKiBtdWx0aXRocmVhZGluZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIElmIHNldCwgZmlsdGVycyB3aXRoIHNsaWNlIHRocmVhZGluZyBjYXBhYmlsaXR5IHdpbGwgY2FsbCB0aGlzIGNhbGxiYWNrCisgICAgICogdG8gZXhlY3V0ZSBtdWx0aXBsZSBqb2JzIGluIHBhcmFsbGVsLgorICAgICAqCisgICAgICogSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IHVuc2V0LCBsaWJhdmZpbHRlciB3aWxsIHVzZSBpdHMgaW50ZXJuYWwKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgbXVsdGl0aHJlYWRlZCBkZXBlbmRpbmcgb24gdGhlCisgICAgICogcGxhdGZvcm0gYW5kIGJ1aWxkIG9wdGlvbnMuCisgICAgICovCisgICAgYXZmaWx0ZXJfZXhlY3V0ZV9mdW5jICpleGVjdXRlOworCisgICAgY2hhciAqYXJlc2FtcGxlX3N3cl9vcHRzOyAvLy88IHN3ciBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIGF1dG8taW5zZXJ0ZWQgYXJlc2FtcGxlIGZpbHRlcnMsIEFjY2VzcyBPTkxZIHRocm91Z2ggQVZPcHRpb25zCisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGZpZWxkcworICAgICAqCisgICAgICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KKyAgICAgKiBUaGVpciB0eXBlLCBvZmZzZXQsIG51bWJlciBhbmQgc2VtYW50aWMgY2FuIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KKyAgICAgKi8KKworICAgIEFWRmlsdGVyTGluayAqKnNpbmtfbGlua3M7CisgICAgaW50IHNpbmtfbGlua3NfY291bnQ7CisKKyAgICB1bnNpZ25lZCBkaXNhYmxlX2F1dG9fY29udmVydDsKK30gQVZGaWx0ZXJHcmFwaDsKKworLyoqCisgKiBBbGxvY2F0ZSBhIGZpbHRlciBncmFwaC4KKyAqLworQVZGaWx0ZXJHcmFwaCAqYXZmaWx0ZXJfZ3JhcGhfYWxsb2Modm9pZCk7CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGZpbHRlciBpbnN0YW5jZSBpbiBhIGZpbHRlciBncmFwaC4KKyAqCisgKiBAcGFyYW0gZ3JhcGggZ3JhcGggaW4gd2hpY2ggdGhlIG5ldyBmaWx0ZXIgd2lsbCBiZSB1c2VkCisgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mCisgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIGdpdmUgdG8gdGhlIG5ldyBpbnN0YW5jZSAod2lsbCBiZSBjb3BpZWQgdG8KKyAqICAgICAgICAgICAgIEFWRmlsdGVyQ29udGV4dC5uYW1lKS4gVGhpcyBtYXkgYmUgdXNlZCBieSB0aGUgY2FsbGVyIHRvIGlkZW50aWZ5CisgKiAgICAgICAgICAgICBkaWZmZXJlbnQgZmlsdGVycywgbGliYXZmaWx0ZXIgaXRzZWxmIGFzc2lnbnMgbm8gc2VtYW50aWNzIHRvCisgKiAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlci4gTWF5IGJlIE5VTEwuCisgKgorICogQHJldHVybiB0aGUgY29udGV4dCBvZiB0aGUgbmV3bHkgY3JlYXRlZCBmaWx0ZXIgaW5zdGFuY2UgKG5vdGUgdGhhdCBpdCBpcworICogICAgICAgICBhbHNvIHJldHJpZXZhYmxlIGRpcmVjdGx5IHRocm91Z2ggQVZGaWx0ZXJHcmFwaC5maWx0ZXJzIG9yIHdpdGgKKyAqICAgICAgICAgYXZmaWx0ZXJfZ3JhcGhfZ2V0X2ZpbHRlcigpKSBvbiBzdWNjZXNzIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqLworQVZGaWx0ZXJDb250ZXh0ICphdmZpbHRlcl9ncmFwaF9hbGxvY19maWx0ZXIoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZpbHRlciAqZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogR2V0IGEgZmlsdGVyIGluc3RhbmNlIGlkZW50aWZpZWQgYnkgaW5zdGFuY2UgbmFtZSBmcm9tIGdyYXBoLgorICoKKyAqIEBwYXJhbSBncmFwaCBmaWx0ZXIgZ3JhcGggdG8gc2VhcmNoIHRocm91Z2guCisgKiBAcGFyYW0gbmFtZSBmaWx0ZXIgaW5zdGFuY2UgbmFtZSAoc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgZ3JhcGgpLgorICogQHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgZm91bmQgZmlsdGVyIGluc3RhbmNlIG9yIE5VTEwgaWYgaXQKKyAqIGNhbm5vdCBiZSBmb3VuZC4KKyAqLworQVZGaWx0ZXJDb250ZXh0ICphdmZpbHRlcl9ncmFwaF9nZXRfZmlsdGVyKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBjb25zdCBjaGFyICpuYW1lKTsKKworI2lmIEZGX0FQSV9BVkZJTFRFUl9PUEVOCisvKioKKyAqIEFkZCBhbiBleGlzdGluZyBmaWx0ZXIgaW5zdGFuY2UgdG8gYSBmaWx0ZXIgZ3JhcGguCisgKgorICogQHBhcmFtIGdyYXBoY3R4ICB0aGUgZmlsdGVyIGdyYXBoCisgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgdG8gYmUgYWRkZWQKKyAqCisgKiBAZGVwcmVjYXRlZCB1c2UgYXZmaWx0ZXJfZ3JhcGhfYWxsb2NfZmlsdGVyKCkgdG8gYWxsb2NhdGUgYSBmaWx0ZXIgaW4gYQorICogZmlsdGVyIGdyYXBoCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitpbnQgYXZmaWx0ZXJfZ3JhcGhfYWRkX2ZpbHRlcihBVkZpbHRlckdyYXBoICpncmFwaGN0eCwgQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXIpOworI2VuZGlmCisKKy8qKgorICogQ3JlYXRlIGFuZCBhZGQgYSBmaWx0ZXIgaW5zdGFuY2UgaW50byBhbiBleGlzdGluZyBncmFwaC4KKyAqIFRoZSBmaWx0ZXIgaW5zdGFuY2UgaXMgY3JlYXRlZCBmcm9tIHRoZSBmaWx0ZXIgZmlsdCBhbmQgaW5pdGVkCisgKiB3aXRoIHRoZSBwYXJhbWV0ZXJzIGFyZ3MgYW5kIG9wYXF1ZS4KKyAqCisgKiBJbiBjYXNlIG9mIHN1Y2Nlc3MgcHV0IGluICpmaWx0X2N0eCB0aGUgcG9pbnRlciB0byB0aGUgY3JlYXRlZAorICogZmlsdGVyIGluc3RhbmNlLCBvdGhlcndpc2Ugc2V0ICpmaWx0X2N0eCB0byBOVUxMLgorICoKKyAqIEBwYXJhbSBuYW1lIHRoZSBpbnN0YW5jZSBuYW1lIHRvIGdpdmUgdG8gdGhlIGNyZWF0ZWQgZmlsdGVyIGluc3RhbmNlCisgKiBAcGFyYW0gZ3JhcGhfY3R4IHRoZSBmaWx0ZXIgZ3JhcGgKKyAqIEByZXR1cm4gYSBuZWdhdGl2ZSBBVkVSUk9SIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLCBhIG5vbgorICogbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK2ludCBhdmZpbHRlcl9ncmFwaF9jcmVhdGVfZmlsdGVyKEFWRmlsdGVyQ29udGV4dCAqKmZpbHRfY3R4LCBjb25zdCBBVkZpbHRlciAqZmlsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFyZ3MsIHZvaWQgKm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyR3JhcGggKmdyYXBoX2N0eCk7CisKKy8qKgorICogRW5hYmxlIG9yIGRpc2FibGUgYXV0b21hdGljIGZvcm1hdCBjb252ZXJzaW9uIGluc2lkZSB0aGUgZ3JhcGguCisgKgorICogTm90ZSB0aGF0IGZvcm1hdCBjb252ZXJzaW9uIGNhbiBzdGlsbCBoYXBwZW4gaW5zaWRlIGV4cGxpY2l0bHkgaW5zZXJ0ZWQKKyAqIHNjYWxlIGFuZCBhcmVzYW1wbGUgZmlsdGVycy4KKyAqCisgKiBAcGFyYW0gZmxhZ3MgIGFueSBvZiB0aGUgQVZGSUxURVJfQVVUT19DT05WRVJUXyogY29uc3RhbnRzCisgKi8KK3ZvaWQgYXZmaWx0ZXJfZ3JhcGhfc2V0X2F1dG9fY29udmVydChBVkZpbHRlckdyYXBoICpncmFwaCwgdW5zaWduZWQgZmxhZ3MpOworCitlbnVtIHsKKyAgICBBVkZJTFRFUl9BVVRPX0NPTlZFUlRfQUxMICA9ICAwLCAvKio8IGFsbCBhdXRvbWF0aWMgY29udmVyc2lvbnMgZW5hYmxlZCAqLworICAgIEFWRklMVEVSX0FVVE9fQ09OVkVSVF9OT05FID0gLTEsIC8qKjwgYWxsIGF1dG9tYXRpYyBjb252ZXJzaW9ucyBkaXNhYmxlZCAqLworfTsKKworLyoqCisgKiBDaGVjayB2YWxpZGl0eSBhbmQgY29uZmlndXJlIGFsbCB0aGUgbGlua3MgYW5kIGZvcm1hdHMgaW4gdGhlIGdyYXBoLgorICoKKyAqIEBwYXJhbSBncmFwaGN0eCB0aGUgZmlsdGVyIGdyYXBoCisgKiBAcGFyYW0gbG9nX2N0eCBjb250ZXh0IHVzZWQgZm9yIGxvZ2dpbmcKKyAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG90aGVyd2lzZQorICovCitpbnQgYXZmaWx0ZXJfZ3JhcGhfY29uZmlnKEFWRmlsdGVyR3JhcGggKmdyYXBoY3R4LCB2b2lkICpsb2dfY3R4KTsKKworLyoqCisgKiBGcmVlIGEgZ3JhcGgsIGRlc3Ryb3kgaXRzIGxpbmtzLCBhbmQgc2V0ICpncmFwaCB0byBOVUxMLgorICogSWYgKmdyYXBoIGlzIE5VTEwsIGRvIG5vdGhpbmcuCisgKi8KK3ZvaWQgYXZmaWx0ZXJfZ3JhcGhfZnJlZShBVkZpbHRlckdyYXBoICoqZ3JhcGgpOworCisvKioKKyAqIEEgbGlua2VkLWxpc3Qgb2YgdGhlIGlucHV0cy9vdXRwdXRzIG9mIHRoZSBmaWx0ZXIgY2hhaW4uCisgKgorICogVGhpcyBpcyBtYWlubHkgdXNlZnVsIGZvciBhdmZpbHRlcl9ncmFwaF9wYXJzZSgpIC8gYXZmaWx0ZXJfZ3JhcGhfcGFyc2UyKCksCisgKiB3aGVyZSBpdCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIG9wZW4gKHVubGlua2VkKSBpbnB1dHMgYW5kIG91dHB1dHMgZnJvbSBhbmQKKyAqIHRvIHRoZSBjYWxsZXIuCisgKiBUaGlzIHN0cnVjdCBzcGVjaWZpZXMsIHBlciBlYWNoIG5vdCBjb25uZWN0ZWQgcGFkIGNvbnRhaW5lZCBpbiB0aGUgZ3JhcGgsIHRoZQorICogZmlsdGVyIGNvbnRleHQgYW5kIHRoZSBwYWQgaW5kZXggcmVxdWlyZWQgZm9yIGVzdGFibGlzaGluZyBhIGxpbmsuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWRmlsdGVySW5PdXQgeworICAgIC8qKiB1bmlxdWUgbmFtZSBmb3IgdGhpcyBpbnB1dC9vdXRwdXQgaW4gdGhlIGxpc3QgKi8KKyAgICBjaGFyICpuYW1lOworCisgICAgLyoqIGZpbHRlciBjb250ZXh0IGFzc29jaWF0ZWQgdG8gdGhpcyBpbnB1dC9vdXRwdXQgKi8KKyAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRlcl9jdHg7CisKKyAgICAvKiogaW5kZXggb2YgdGhlIGZpbHRfY3R4IHBhZCB0byB1c2UgZm9yIGxpbmtpbmcgKi8KKyAgICBpbnQgcGFkX2lkeDsKKworICAgIC8qKiBuZXh0IGlucHV0L2lucHV0IGluIHRoZSBsaXN0LCBOVUxMIGlmIHRoaXMgaXMgdGhlIGxhc3QgKi8KKyAgICBzdHJ1Y3QgQVZGaWx0ZXJJbk91dCAqbmV4dDsKK30gQVZGaWx0ZXJJbk91dDsKKworLyoqCisgKiBBbGxvY2F0ZSBhIHNpbmdsZSBBVkZpbHRlckluT3V0IGVudHJ5LgorICogTXVzdCBiZSBmcmVlZCB3aXRoIGF2ZmlsdGVyX2lub3V0X2ZyZWUoKS4KKyAqIEByZXR1cm4gYWxsb2NhdGVkIEFWRmlsdGVySW5PdXQgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICovCitBVkZpbHRlckluT3V0ICphdmZpbHRlcl9pbm91dF9hbGxvYyh2b2lkKTsKKworLyoqCisgKiBGcmVlIHRoZSBzdXBwbGllZCBsaXN0IG9mIEFWRmlsdGVySW5PdXQgYW5kIHNldCAqaW5vdXQgdG8gTlVMTC4KKyAqIElmICppbm91dCBpcyBOVUxMLCBkbyBub3RoaW5nLgorICovCit2b2lkIGF2ZmlsdGVyX2lub3V0X2ZyZWUoQVZGaWx0ZXJJbk91dCAqKmlub3V0KTsKKworI2lmIEFWX0hBVkVfSU5DT01QQVRJQkxFX0xJQkFWX0FCSSB8fCAhRkZfQVBJX09MRF9HUkFQSF9QQVJTRQorLyoqCisgKiBBZGQgYSBncmFwaCBkZXNjcmliZWQgYnkgYSBzdHJpbmcgdG8gYSBncmFwaC4KKyAqCisgKiBAbm90ZSBUaGUgY2FsbGVyIG11c3QgcHJvdmlkZSB0aGUgbGlzdHMgb2YgaW5wdXRzIGFuZCBvdXRwdXRzLAorICogd2hpY2ggdGhlcmVmb3JlIG11c3QgYmUga25vd24gYmVmb3JlIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLgorICoKKyAqIEBub3RlIFRoZSBpbnB1dHMgcGFyYW1ldGVyIGRlc2NyaWJlcyBpbnB1dHMgb2YgdGhlIGFscmVhZHkgZXhpc3RpbmcKKyAqIHBhcnQgb2YgdGhlIGdyYXBoOyBpLmUuIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIG5ld2x5IGNyZWF0ZWQKKyAqIHBhcnQsIHRoZXkgYXJlIG91dHB1dHMuIFNpbWlsYXJseSB0aGUgb3V0cHV0cyBwYXJhbWV0ZXIgZGVzY3JpYmVzCisgKiBvdXRwdXRzIG9mIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGZpbHRlcnMsIHdoaWNoIGFyZSBwcm92aWRlZCBhcworICogaW5wdXRzIHRvIHRoZSBwYXJzZWQgZmlsdGVycy4KKyAqCisgKiBAcGFyYW0gZ3JhcGggICB0aGUgZmlsdGVyIGdyYXBoIHdoZXJlIHRvIGxpbmsgdGhlIHBhcnNlZCBncmFwaCBjb250ZXh0CisgKiBAcGFyYW0gZmlsdGVycyBzdHJpbmcgdG8gYmUgcGFyc2VkCisgKiBAcGFyYW0gaW5wdXRzICBsaW5rZWQgbGlzdCB0byB0aGUgaW5wdXRzIG9mIHRoZSBncmFwaAorICogQHBhcmFtIG91dHB1dHMgbGlua2VkIGxpc3QgdG8gdGhlIG91dHB1dHMgb2YgdGhlIGdyYXBoCisgKiBAcmV0dXJuIHplcm8gb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZXJyb3IKKyAqLworaW50IGF2ZmlsdGVyX2dyYXBoX3BhcnNlKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBjb25zdCBjaGFyICpmaWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVySW5PdXQgKmlucHV0cywgQVZGaWx0ZXJJbk91dCAqb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpsb2dfY3R4KTsKKyNlbHNlCisvKioKKyAqIEFkZCBhIGdyYXBoIGRlc2NyaWJlZCBieSBhIHN0cmluZyB0byBhIGdyYXBoLgorICoKKyAqIEBwYXJhbSBncmFwaCAgIHRoZSBmaWx0ZXIgZ3JhcGggd2hlcmUgdG8gbGluayB0aGUgcGFyc2VkIGdyYXBoIGNvbnRleHQKKyAqIEBwYXJhbSBmaWx0ZXJzIHN0cmluZyB0byBiZSBwYXJzZWQKKyAqIEBwYXJhbSBpbnB1dHMgIHBvaW50ZXIgdG8gYSBsaW5rZWQgbGlzdCB0byB0aGUgaW5wdXRzIG9mIHRoZSBncmFwaCwgbWF5IGJlIE5VTEwuCisgKiAgICAgICAgICAgICAgICBJZiBub24tTlVMTCwgKmlucHV0cyBpcyB1cGRhdGVkIHRvIGNvbnRhaW4gdGhlIGxpc3Qgb2Ygb3BlbiBpbnB1dHMKKyAqICAgICAgICAgICAgICAgIGFmdGVyIHRoZSBwYXJzaW5nLCBzaG91bGQgYmUgZnJlZWQgd2l0aCBhdmZpbHRlcl9pbm91dF9mcmVlKCkuCisgKiBAcGFyYW0gb3V0cHV0cyBwb2ludGVyIHRvIGEgbGlua2VkIGxpc3QgdG8gdGhlIG91dHB1dHMgb2YgdGhlIGdyYXBoLCBtYXkgYmUgTlVMTC4KKyAqICAgICAgICAgICAgICAgIElmIG5vbi1OVUxMLCAqb3V0cHV0cyBpcyB1cGRhdGVkIHRvIGNvbnRhaW4gdGhlIGxpc3Qgb2Ygb3BlbiBvdXRwdXRzCisgKiAgICAgICAgICAgICAgICBhZnRlciB0aGUgcGFyc2luZywgc2hvdWxkIGJlIGZyZWVkIHdpdGggYXZmaWx0ZXJfaW5vdXRfZnJlZSgpLgorICogQHJldHVybiBub24gbmVnYXRpdmUgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZXJyb3IKKyAqIEBkZXByZWNhdGVkIFVzZSBhdmZpbHRlcl9ncmFwaF9wYXJzZV9wdHIoKSBpbnN0ZWFkLgorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IGF2ZmlsdGVyX2dyYXBoX3BhcnNlKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBjb25zdCBjaGFyICpmaWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVySW5PdXQgKippbnB1dHMsIEFWRmlsdGVySW5PdXQgKipvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxvZ19jdHgpOworI2VuZGlmCisKKy8qKgorICogQWRkIGEgZ3JhcGggZGVzY3JpYmVkIGJ5IGEgc3RyaW5nIHRvIGEgZ3JhcGguCisgKgorICogQHBhcmFtIGdyYXBoICAgdGhlIGZpbHRlciBncmFwaCB3aGVyZSB0byBsaW5rIHRoZSBwYXJzZWQgZ3JhcGggY29udGV4dAorICogQHBhcmFtIGZpbHRlcnMgc3RyaW5nIHRvIGJlIHBhcnNlZAorICogQHBhcmFtIGlucHV0cyAgcG9pbnRlciB0byBhIGxpbmtlZCBsaXN0IHRvIHRoZSBpbnB1dHMgb2YgdGhlIGdyYXBoLCBtYXkgYmUgTlVMTC4KKyAqICAgICAgICAgICAgICAgIElmIG5vbi1OVUxMLCAqaW5wdXRzIGlzIHVwZGF0ZWQgdG8gY29udGFpbiB0aGUgbGlzdCBvZiBvcGVuIGlucHV0cworICogICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIHBhcnNpbmcsIHNob3VsZCBiZSBmcmVlZCB3aXRoIGF2ZmlsdGVyX2lub3V0X2ZyZWUoKS4KKyAqIEBwYXJhbSBvdXRwdXRzIHBvaW50ZXIgdG8gYSBsaW5rZWQgbGlzdCB0byB0aGUgb3V0cHV0cyBvZiB0aGUgZ3JhcGgsIG1heSBiZSBOVUxMLgorICogICAgICAgICAgICAgICAgSWYgbm9uLU5VTEwsICpvdXRwdXRzIGlzIHVwZGF0ZWQgdG8gY29udGFpbiB0aGUgbGlzdCBvZiBvcGVuIG91dHB1dHMKKyAqICAgICAgICAgICAgICAgIGFmdGVyIHRoZSBwYXJzaW5nLCBzaG91bGQgYmUgZnJlZWQgd2l0aCBhdmZpbHRlcl9pbm91dF9mcmVlKCkuCisgKiBAcmV0dXJuIG5vbiBuZWdhdGl2ZSBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBlcnJvcgorICovCitpbnQgYXZmaWx0ZXJfZ3JhcGhfcGFyc2VfcHRyKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBjb25zdCBjaGFyICpmaWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckluT3V0ICoqaW5wdXRzLCBBVkZpbHRlckluT3V0ICoqb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbG9nX2N0eCk7CisKKy8qKgorICogQWRkIGEgZ3JhcGggZGVzY3JpYmVkIGJ5IGEgc3RyaW5nIHRvIGEgZ3JhcGguCisgKgorICogQHBhcmFtW2luXSAgZ3JhcGggICB0aGUgZmlsdGVyIGdyYXBoIHdoZXJlIHRvIGxpbmsgdGhlIHBhcnNlZCBncmFwaCBjb250ZXh0CisgKiBAcGFyYW1baW5dICBmaWx0ZXJzIHN0cmluZyB0byBiZSBwYXJzZWQKKyAqIEBwYXJhbVtvdXRdIGlucHV0cyAgYSBsaW5rZWQgbGlzdCBvZiBhbGwgZnJlZSAodW5saW5rZWQpIGlucHV0cyBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgcGFyc2VkIGdyYXBoIHdpbGwgYmUgcmV0dXJuZWQgaGVyZS4gSXQgaXMgdG8gYmUgZnJlZWQKKyAqICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGNhbGxlciB1c2luZyBhdmZpbHRlcl9pbm91dF9mcmVlKCkuCisgKiBAcGFyYW1bb3V0XSBvdXRwdXRzIGEgbGlua2VkIGxpc3Qgb2YgYWxsIGZyZWUgKHVubGlua2VkKSBvdXRwdXRzIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICBwYXJzZWQgZ3JhcGggd2lsbCBiZSByZXR1cm5lZCBoZXJlLiBJdCBpcyB0byBiZSBmcmVlZCBieSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgY2FsbGVyIHVzaW5nIGF2ZmlsdGVyX2lub3V0X2ZyZWUoKS4KKyAqIEByZXR1cm4gemVybyBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBlcnJvcgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzIHRoYXQgYXJlIGxlZnQKKyAqIHVubGlua2VkIGFmdGVyIHBhcnNpbmcgdGhlIGdyYXBoIGFuZCB0aGUgY2FsbGVyIHRoZW4gZGVhbHMgd2l0aAorICogdGhlbS4KKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbWFrZXMgbm8gcmVmZXJlbmNlIHdoYXRzb2V2ZXIgdG8gYWxyZWFkeQorICogZXhpc3RpbmcgcGFydHMgb2YgdGhlIGdyYXBoIGFuZCB0aGUgaW5wdXRzIHBhcmFtZXRlciB3aWxsIG9uIHJldHVybgorICogY29udGFpbiBpbnB1dHMgb2YgdGhlIG5ld2x5IHBhcnNlZCBwYXJ0IG9mIHRoZSBncmFwaC4gIEFuYWxvZ291c2x5CisgKiB0aGUgb3V0cHV0cyBwYXJhbWV0ZXIgd2lsbCBjb250YWluIG91dHB1dHMgb2YgdGhlIG5ld2x5IGNyZWF0ZWQKKyAqIGZpbHRlcnMuCisgKi8KK2ludCBhdmZpbHRlcl9ncmFwaF9wYXJzZTIoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsIGNvbnN0IGNoYXIgKmZpbHRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVySW5PdXQgKippbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVySW5PdXQgKipvdXRwdXRzKTsKKworLyoqCisgKiBTZW5kIGEgY29tbWFuZCB0byBvbmUgb3IgbW9yZSBmaWx0ZXIgaW5zdGFuY2VzLgorICoKKyAqIEBwYXJhbSBncmFwaCAgdGhlIGZpbHRlciBncmFwaAorICogQHBhcmFtIHRhcmdldCB0aGUgZmlsdGVyKHMpIHRvIHdoaWNoIHRoZSBjb21tYW5kIHNob3VsZCBiZSBzZW50CisgKiAgICAgICAgICAgICAgICJhbGwiIHNlbmRzIHRvIGFsbCBmaWx0ZXJzCisgKiAgICAgICAgICAgICAgIG90aGVyd2lzZSBpdCBjYW4gYmUgYSBmaWx0ZXIgb3IgZmlsdGVyIGluc3RhbmNlIG5hbWUKKyAqICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBzZW5kIHRoZSBjb21tYW5kIHRvIGFsbCBtYXRjaGluZyBmaWx0ZXJzLgorICogQHBhcmFtIGNtZCAgICB0aGUgY29tbWFuZCB0byBzZW5kLCBmb3IgaGFuZGxpbmcgc2ltcGxpY2l0eSBhbGwgY29tbWFuZHMgbXVzdCBiZSBhbHBoYW51bWVyaWMgb25seQorICogQHBhcmFtIGFyZyAgICB0aGUgYXJndW1lbnQgZm9yIHRoZSBjb21tYW5kCisgKiBAcGFyYW0gcmVzICAgIGEgYnVmZmVyIHdpdGggc2l6ZSByZXNfc2l6ZSB3aGVyZSB0aGUgZmlsdGVyKHMpIGNhbiByZXR1cm4gYSByZXNwb25zZS4KKyAqCisgKiBAcmV0dXJucyA+PTAgb24gc3VjY2VzcyBvdGhlcndpc2UgYW4gZXJyb3IgY29kZS4KKyAqICAgICAgICAgICAgICBBVkVSUk9SKEVOT1NZUykgb24gdW5zdXBwb3J0ZWQgY29tbWFuZHMKKyAqLworaW50IGF2ZmlsdGVyX2dyYXBoX3NlbmRfY29tbWFuZChBVkZpbHRlckdyYXBoICpncmFwaCwgY29uc3QgY2hhciAqdGFyZ2V0LCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZywgY2hhciAqcmVzLCBpbnQgcmVzX2xlbiwgaW50IGZsYWdzKTsKKworLyoqCisgKiBRdWV1ZSBhIGNvbW1hbmQgZm9yIG9uZSBvciBtb3JlIGZpbHRlciBpbnN0YW5jZXMuCisgKgorICogQHBhcmFtIGdyYXBoICB0aGUgZmlsdGVyIGdyYXBoCisgKiBAcGFyYW0gdGFyZ2V0IHRoZSBmaWx0ZXIocykgdG8gd2hpY2ggdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHNlbnQKKyAqICAgICAgICAgICAgICAgImFsbCIgc2VuZHMgdG8gYWxsIGZpbHRlcnMKKyAqICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGl0IGNhbiBiZSBhIGZpbHRlciBvciBmaWx0ZXIgaW5zdGFuY2UgbmFtZQorICogICAgICAgICAgICAgICB3aGljaCB3aWxsIHNlbmQgdGhlIGNvbW1hbmQgdG8gYWxsIG1hdGNoaW5nIGZpbHRlcnMuCisgKiBAcGFyYW0gY21kICAgIHRoZSBjb21tYW5kIHRvIHNlbnQsIGZvciBoYW5kbGluZyBzaW1wbGljaXR5IGFsbCBjb21tYW5kcyBtdXN0IGJlIGFscGhhbnVtZXJpYyBvbmx5CisgKiBAcGFyYW0gYXJnICAgIHRoZSBhcmd1bWVudCBmb3IgdGhlIGNvbW1hbmQKKyAqIEBwYXJhbSB0cyAgICAgdGltZSBhdCB3aGljaCB0aGUgY29tbWFuZCBzaG91bGQgYmUgc2VudCB0byB0aGUgZmlsdGVyCisgKgorICogQG5vdGUgQXMgdGhpcyBleGVjdXRlcyBjb21tYW5kcyBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIG5vIHJldHVybiBjb2RlCisgKiAgICAgICBmcm9tIHRoZSBmaWx0ZXIgaXMgcHJvdmlkZWQsIGFsc28gQVZGSUxURVJfQ01EX0ZMQUdfT05FIGlzIG5vdCBzdXBwb3J0ZWQuCisgKi8KK2ludCBhdmZpbHRlcl9ncmFwaF9xdWV1ZV9jb21tYW5kKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBjb25zdCBjaGFyICp0YXJnZXQsIGNvbnN0IGNoYXIgKmNtZCwgY29uc3QgY2hhciAqYXJnLCBpbnQgZmxhZ3MsIGRvdWJsZSB0cyk7CisKKworLyoqCisgKiBEdW1wIGEgZ3JhcGggaW50byBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gZ3JhcGggICAgdGhlIGdyYXBoIHRvIGR1bXAKKyAqIEBwYXJhbSBvcHRpb25zICBmb3JtYXR0aW5nIG9wdGlvbnM7IGN1cnJlbnRseSBpZ25vcmVkCisgKiBAcmV0dXJuICBhIHN0cmluZywgb3IgTlVMTCBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmU7CisgKiAgICAgICAgICB0aGUgc3RyaW5nIG11c3QgYmUgZnJlZWQgdXNpbmcgYXZfZnJlZQorICovCitjaGFyICphdmZpbHRlcl9ncmFwaF9kdW1wKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBjb25zdCBjaGFyICpvcHRpb25zKTsKKworLyoqCisgKiBSZXF1ZXN0IGEgZnJhbWUgb24gdGhlIG9sZGVzdCBzaW5rIGxpbmsuCisgKgorICogSWYgdGhlIHJlcXVlc3QgcmV0dXJucyBBVkVSUk9SX0VPRiwgdHJ5IHRoZSBuZXh0LgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBtZWFudCB0byBiZSB0aGUgc29sZSBzY2hlZHVsaW5nIG1lY2hhbmlzbQorICogb2YgYSBmaWx0ZXJncmFwaCwgb25seSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGhlbHAgZHJhaW4gYSBmaWx0ZXJncmFwaAorICogaW4gYSBiYWxhbmNlZCB3YXkgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMuCisgKgorICogQWxzbyBub3RlIHRoYXQgQVZFUlJPUl9FT0YgZG9lcyBub3QgbWVhbiB0aGF0IGZyYW1lcyBkaWQgbm90IGFycml2ZSBvbgorICogc29tZSBvZiB0aGUgc2lua3MgZHVyaW5nIHRoZSBwcm9jZXNzLgorICogV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgc2luayBsaW5rcywgaW4gY2FzZSB0aGUgcmVxdWVzdGVkIGxpbmsKKyAqIHJldHVybnMgYW4gRU9GLCB0aGlzIG1heSBjYXVzZSBhIGZpbHRlciB0byBmbHVzaCBwZW5kaW5nIGZyYW1lcworICogd2hpY2ggYXJlIHNlbnQgdG8gYW5vdGhlciBzaW5rIGxpbmssIGFsdGhvdWdoIHVucmVxdWVzdGVkLgorICoKKyAqIEByZXR1cm4gIHRoZSByZXR1cm4gdmFsdWUgb2YgZmZfcmVxdWVzdF9mcmFtZSgpLAorICogICAgICAgICAgb3IgQVZFUlJPUl9FT0YgaWYgYWxsIGxpbmtzIHJldHVybmVkIEFWRVJST1JfRU9GCisgKi8KK2ludCBhdmZpbHRlcl9ncmFwaF9yZXF1ZXN0X29sZGVzdChBVkZpbHRlckdyYXBoICpncmFwaCk7CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZGSUxURVJfQVZGSUxURVJfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2F2ZmlsdGVyZ3JhcGguYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hdmZpbHRlcmdyYXBoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1OWVjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9hdmZpbHRlcmdyYXBoLmMKQEAgLTAsMCArMSwxMzQxIEBACisvKgorICogZmlsdGVyIGdyYXBocworICogQ29weXJpZ2h0IChjKSAyMDA4IFZpdG9yIFNlc3NhaworICogQ29weXJpZ2h0IChjKSAyMDA3IEJvYmJ5IEJpbmdoYW0KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBVkZpbHRlckdyYXBoLCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBmaWx0ZXJncmFwaF9vcHRpb25zW10gPSB7CisgICAgeyAidGhyZWFkX3R5cGUiLCAiQWxsb3dlZCB0aHJlYWQgdHlwZXMiLCBPRkZTRVQodGhyZWFkX3R5cGUpLCBBVl9PUFRfVFlQRV9GTEFHUywKKyAgICAgICAgeyAuaTY0ID0gQVZGSUxURVJfVEhSRUFEX1NMSUNFIH0sIDAsIElOVF9NQVgsIEZMQUdTLCAidGhyZWFkX3R5cGUiIH0sCisgICAgICAgIHsgInNsaWNlIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWRklMVEVSX1RIUkVBRF9TTElDRSB9LCAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAidGhyZWFkX3R5cGUiIH0sCisgICAgeyAidGhyZWFkcyIsICAgICAiTWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyIsIE9GRlNFVChuYl90aHJlYWRzKSwKKyAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7InNjYWxlX3N3c19vcHRzIiAgICAgICAsICJkZWZhdWx0IHNjYWxlIGZpbHRlciBvcHRpb25zIiAgICAgICAgLCBPRkZTRVQoc2NhbGVfc3dzX29wdHMpICAgICAgICAsCisgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ImFyZXNhbXBsZV9zd3Jfb3B0cyIgICAsICJkZWZhdWx0IGFyZXNhbXBsZSBmaWx0ZXIgb3B0aW9ucyIgICAgLCBPRkZTRVQoYXJlc2FtcGxlX3N3cl9vcHRzKSAgICAsCisgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGZpbHRlcmdyYXBoX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIkFWRmlsdGVyR3JhcGgiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLm9wdGlvbiAgICAgPSBmaWx0ZXJncmFwaF9vcHRpb25zLAorICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfRklMVEVSLAorfTsKKworI2lmICFIQVZFX1RIUkVBRFMKK3ZvaWQgZmZfZ3JhcGhfdGhyZWFkX2ZyZWUoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgpCit7Cit9CisKK2ludCBmZl9ncmFwaF90aHJlYWRfaW5pdChBVkZpbHRlckdyYXBoICpncmFwaCkKK3sKKyAgICBncmFwaC0+dGhyZWFkX3R5cGUgPSAwOworICAgIGdyYXBoLT5uYl90aHJlYWRzICA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworQVZGaWx0ZXJHcmFwaCAqYXZmaWx0ZXJfZ3JhcGhfYWxsb2Modm9pZCkKK3sKKyAgICBBVkZpbHRlckdyYXBoICpyZXQgPSBhdl9tYWxsb2N6KHNpemVvZigqcmV0KSk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0LT5pbnRlcm5hbCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpyZXQtPmludGVybmFsKSk7CisgICAgaWYgKCFyZXQtPmludGVybmFsKSB7CisgICAgICAgIGF2X2ZyZWVwKCZyZXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXQtPmF2X2NsYXNzID0gJmZpbHRlcmdyYXBoX2NsYXNzOworICAgIGF2X29wdF9zZXRfZGVmYXVsdHMocmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZmZfZmlsdGVyX2dyYXBoX3JlbW92ZV9maWx0ZXIoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsIEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBncmFwaC0+bmJfZmlsdGVyczsgaSsrKSB7CisgICAgICAgIGlmIChncmFwaC0+ZmlsdGVyc1tpXSA9PSBmaWx0ZXIpIHsKKyAgICAgICAgICAgIEZGU1dBUChBVkZpbHRlckNvbnRleHQqLCBncmFwaC0+ZmlsdGVyc1tpXSwKKyAgICAgICAgICAgICAgICAgICBncmFwaC0+ZmlsdGVyc1tncmFwaC0+bmJfZmlsdGVycyAtIDFdKTsKKyAgICAgICAgICAgIGdyYXBoLT5uYl9maWx0ZXJzLS07CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgYXZmaWx0ZXJfZ3JhcGhfZnJlZShBVkZpbHRlckdyYXBoICoqZ3JhcGgpCit7CisgICAgaWYgKCEqZ3JhcGgpCisgICAgICAgIHJldHVybjsKKworICAgIHdoaWxlICgoKmdyYXBoKS0+bmJfZmlsdGVycykKKyAgICAgICAgYXZmaWx0ZXJfZnJlZSgoKmdyYXBoKS0+ZmlsdGVyc1swXSk7CisKKyAgICBmZl9ncmFwaF90aHJlYWRfZnJlZSgqZ3JhcGgpOworCisgICAgYXZfZnJlZXAoJigqZ3JhcGgpLT5zaW5rX2xpbmtzKTsKKworICAgIGF2X2ZyZWVwKCYoKmdyYXBoKS0+c2NhbGVfc3dzX29wdHMpOworICAgIGF2X2ZyZWVwKCYoKmdyYXBoKS0+YXJlc2FtcGxlX3N3cl9vcHRzKTsKKyAgICBhdl9mcmVlcCgmKCpncmFwaCktPnJlc2FtcGxlX2xhdnJfb3B0cyk7CisgICAgYXZfZnJlZXAoJigqZ3JhcGgpLT5maWx0ZXJzKTsKKyAgICBhdl9mcmVlcCgmKCpncmFwaCktPmludGVybmFsKTsKKyAgICBhdl9mcmVlcChncmFwaCk7Cit9CisKKyNpZiBGRl9BUElfQVZGSUxURVJfT1BFTgoraW50IGF2ZmlsdGVyX2dyYXBoX2FkZF9maWx0ZXIoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsIEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqKmZpbHRlcnMgPSBhdl9yZWFsbG9jKGdyYXBoLT5maWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqZmlsdGVycykgKiAoZ3JhcGgtPm5iX2ZpbHRlcnMgKyAxKSk7CisgICAgaWYgKCFmaWx0ZXJzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZ3JhcGgtPmZpbHRlcnMgPSBmaWx0ZXJzOworICAgIGdyYXBoLT5maWx0ZXJzW2dyYXBoLT5uYl9maWx0ZXJzKytdID0gZmlsdGVyOworCisjaWYgRkZfQVBJX0ZPT19DT1VOVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGdyYXBoLT5maWx0ZXJfY291bnRfdW51c2VkID0gZ3JhcGgtPm5iX2ZpbHRlcnM7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorCisgICAgZmlsdGVyLT5ncmFwaCA9IGdyYXBoOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoQVZGaWx0ZXJDb250ZXh0ICoqZmlsdF9jdHgsIGNvbnN0IEFWRmlsdGVyICpmaWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXJncywgdm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJHcmFwaCAqZ3JhcGhfY3R4KQoreworICAgIGludCByZXQ7CisKKyAgICAqZmlsdF9jdHggPSBhdmZpbHRlcl9ncmFwaF9hbGxvY19maWx0ZXIoZ3JhcGhfY3R4LCBmaWx0LCBuYW1lKTsKKyAgICBpZiAoISpmaWx0X2N0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldCA9IGF2ZmlsdGVyX2luaXRfc3RyKCpmaWx0X2N0eCwgYXJncyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGlmICgqZmlsdF9jdHgpCisgICAgICAgIGF2ZmlsdGVyX2ZyZWUoKmZpbHRfY3R4KTsKKyAgICAqZmlsdF9jdHggPSBOVUxMOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXZmaWx0ZXJfZ3JhcGhfc2V0X2F1dG9fY29udmVydChBVkZpbHRlckdyYXBoICpncmFwaCwgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgZ3JhcGgtPmRpc2FibGVfYXV0b19jb252ZXJ0ID0gZmxhZ3M7Cit9CisKK0FWRmlsdGVyQ29udGV4dCAqYXZmaWx0ZXJfZ3JhcGhfYWxsb2NfZmlsdGVyKEFWRmlsdGVyR3JhcGggKmdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGaWx0ZXIgKmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICoqZmlsdGVycywgKnM7CisKKyAgICBpZiAoZ3JhcGgtPnRocmVhZF90eXBlICYmICFncmFwaC0+aW50ZXJuYWwtPnRocmVhZF9leGVjdXRlKSB7CisgICAgICAgIGlmIChncmFwaC0+ZXhlY3V0ZSkgeworICAgICAgICAgICAgZ3JhcGgtPmludGVybmFsLT50aHJlYWRfZXhlY3V0ZSA9IGdyYXBoLT5leGVjdXRlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHJldCA9IGZmX2dyYXBoX3RocmVhZF9pbml0KGdyYXBoKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGdyYXBoLCBBVl9MT0dfRVJST1IsICJFcnJvciBpbml0aWFsaXppbmcgdGhyZWFkaW5nLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzID0gZmZfZmlsdGVyX2FsbG9jKGZpbHRlciwgbmFtZSk7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZpbHRlcnMgPSBhdl9yZWFsbG9jKGdyYXBoLT5maWx0ZXJzLCBzaXplb2YoKmZpbHRlcnMpICogKGdyYXBoLT5uYl9maWx0ZXJzICsgMSkpOworICAgIGlmICghZmlsdGVycykgeworICAgICAgICBhdmZpbHRlcl9mcmVlKHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBncmFwaC0+ZmlsdGVycyA9IGZpbHRlcnM7CisgICAgZ3JhcGgtPmZpbHRlcnNbZ3JhcGgtPm5iX2ZpbHRlcnMrK10gPSBzOworCisjaWYgRkZfQVBJX0ZPT19DT1VOVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGdyYXBoLT5maWx0ZXJfY291bnRfdW51c2VkID0gZ3JhcGgtPm5iX2ZpbHRlcnM7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorCisgICAgcy0+Z3JhcGggPSBncmFwaDsKKworICAgIHJldHVybiBzOworfQorCisvKioKKyAqIENoZWNrIGZvciB0aGUgdmFsaWRpdHkgb2YgZ3JhcGguCisgKgorICogQSBncmFwaCBpcyBjb25zaWRlcmVkIHZhbGlkIGlmIGFsbCBpdHMgaW5wdXQgYW5kIG91dHB1dCBwYWRzIGFyZQorICogY29ubmVjdGVkLgorICoKKyAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgZ3JhcGhfY2hlY2tfdmFsaWRpdHkoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsIEFWQ2xhc3MgKmxvZ19jdHgpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpmaWx0OworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGdyYXBoLT5uYl9maWx0ZXJzOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVZGaWx0ZXJQYWQgKnBhZDsKKyAgICAgICAgZmlsdCA9IGdyYXBoLT5maWx0ZXJzW2ldOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmaWx0LT5uYl9pbnB1dHM7IGorKykgeworICAgICAgICAgICAgaWYgKCFmaWx0LT5pbnB1dHNbal0gfHwgIWZpbHQtPmlucHV0c1tqXS0+c3JjKSB7CisgICAgICAgICAgICAgICAgcGFkID0gJmZpbHQtPmlucHV0X3BhZHNbal07CisgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIklucHV0IHBhZCBcIiVzXCIgd2l0aCB0eXBlICVzIG9mIHRoZSBmaWx0ZXIgaW5zdGFuY2UgXCIlc1wiIG9mICVzIG5vdCBjb25uZWN0ZWQgdG8gYW55IHNvdXJjZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFkLT5uYW1lLCBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcocGFkLT50eXBlKSwgZmlsdC0+bmFtZSwgZmlsdC0+ZmlsdGVyLT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpbHQtPm5iX291dHB1dHM7IGorKykgeworICAgICAgICAgICAgaWYgKCFmaWx0LT5vdXRwdXRzW2pdIHx8ICFmaWx0LT5vdXRwdXRzW2pdLT5kc3QpIHsKKyAgICAgICAgICAgICAgICBwYWQgPSAmZmlsdC0+b3V0cHV0X3BhZHNbal07CisgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk91dHB1dCBwYWQgXCIlc1wiIHdpdGggdHlwZSAlcyBvZiB0aGUgZmlsdGVyIGluc3RhbmNlIFwiJXNcIiBvZiAlcyBub3QgY29ubmVjdGVkIHRvIGFueSBkZXN0aW5hdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFkLT5uYW1lLCBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcocGFkLT50eXBlKSwgZmlsdC0+bmFtZSwgZmlsdC0+ZmlsdGVyLT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29uZmlndXJlIGFsbCB0aGUgbGlua3Mgb2YgZ3JhcGhjdHguCisgKgorICogQHJldHVybiA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBncmFwaF9jb25maWdfbGlua3MoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsIEFWQ2xhc3MgKmxvZ19jdHgpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpmaWx0OworICAgIGludCBpLCByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX2ZpbHRlcnM7IGkrKykgeworICAgICAgICBmaWx0ID0gZ3JhcGgtPmZpbHRlcnNbaV07CisKKyAgICAgICAgaWYgKCFmaWx0LT5uYl9vdXRwdXRzKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2NvbmZpZ19saW5rcyhmaWx0KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitBVkZpbHRlckNvbnRleHQgKmF2ZmlsdGVyX2dyYXBoX2dldF9maWx0ZXIoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX2ZpbHRlcnM7IGkrKykKKyAgICAgICAgaWYgKGdyYXBoLT5maWx0ZXJzW2ldLT5uYW1lICYmICFzdHJjbXAobmFtZSwgZ3JhcGgtPmZpbHRlcnNbaV0tPm5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIGdyYXBoLT5maWx0ZXJzW2ldOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNhbml0aXplX2NoYW5uZWxfbGF5b3V0cyh2b2lkICpsb2csIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmwpCit7CisgICAgaWYgKCFsKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGwtPm5iX2NoYW5uZWxfbGF5b3V0cykgeworICAgICAgICBpZiAobC0+YWxsX2xheW91dHMgfHwgbC0+YWxsX2NvdW50cykKKyAgICAgICAgICAgIGF2X2xvZyhsb2csIEFWX0xPR19XQVJOSU5HLCAiQWxsIGxheW91dHMgc2V0IG9uIG5vbi1lbXB0eSBsaXN0XG4iKTsKKyAgICAgICAgbC0+YWxsX2xheW91dHMgPSBsLT5hbGxfY291bnRzID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobC0+YWxsX2NvdW50cyAmJiAhbC0+YWxsX2xheW91dHMpCisgICAgICAgICAgICBhdl9sb2cobG9nLCBBVl9MT0dfV0FSTklORywgIkFsbCBjb3VudHMgd2l0aG91dCBhbGwgbGF5b3V0c1xuIik7CisgICAgICAgIGwtPmFsbF9sYXlvdXRzID0gMTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX3F1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IHJldCwgaTsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHM7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqY2hsYXlvdXRzOworICAgIEFWRmlsdGVyRm9ybWF0cyAqc2FtcGxlcmF0ZXM7CisgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlID0gY3R4LT5pbnB1dHMgICYmIGN0eC0+aW5wdXRzIFswXSA/IGN0eC0+aW5wdXRzIFswXS0+dHlwZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5vdXRwdXRzICYmIGN0eC0+b3V0cHV0c1swXSA/IGN0eC0+b3V0cHV0c1swXS0+dHlwZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZNRURJQV9UWVBFX1ZJREVPOworCisgICAgaWYgKChyZXQgPSBjdHgtPmZpbHRlci0+cXVlcnlfZm9ybWF0cyhjdHgpKSA8IDApIHsKKyAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJRdWVyeSBmb3JtYXQgZmFpbGVkIGZvciAnJXMnOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBjdHgtPm5hbWUsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspCisgICAgICAgIHNhbml0aXplX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGN0eC0+aW5wdXRzW2ldLT5vdXRfY2hhbm5lbF9sYXlvdXRzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9vdXRwdXRzOyBpKyspCisgICAgICAgIHNhbml0aXplX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGN0eC0+b3V0cHV0c1tpXS0+aW5fY2hhbm5lbF9sYXlvdXRzKTsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfZm9ybWF0cyh0eXBlKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIHNhbXBsZXJhdGVzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgICAgIGlmICghc2FtcGxlcmF0ZXMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgc2FtcGxlcmF0ZXMpOworICAgICAgICBjaGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9sYXlvdXRzKCk7CisgICAgICAgIGlmICghY2hsYXlvdXRzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBjaGxheW91dHMpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmb3JtYXRzX2RlY2xhcmVkKEFWRmlsdGVyQ29udGV4dCAqZikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBpZiAoIWYtPmlucHV0c1tpXS0+b3V0X2Zvcm1hdHMpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGYtPmlucHV0c1tpXS0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKKyAgICAgICAgICAgICEoZi0+aW5wdXRzW2ldLT5vdXRfc2FtcGxlcmF0ZXMgJiYKKyAgICAgICAgICAgICAgZi0+aW5wdXRzW2ldLT5vdXRfY2hhbm5lbF9sYXlvdXRzKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZi0+bmJfb3V0cHV0czsgaSsrKSB7CisgICAgICAgIGlmICghZi0+b3V0cHV0c1tpXS0+aW5fZm9ybWF0cykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoZi0+b3V0cHV0c1tpXS0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKKyAgICAgICAgICAgICEoZi0+b3V0cHV0c1tpXS0+aW5fc2FtcGxlcmF0ZXMgJiYKKyAgICAgICAgICAgICAgZi0+b3V0cHV0c1tpXS0+aW5fY2hhbm5lbF9sYXlvdXRzKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIEFWRmlsdGVyRm9ybWF0cyAqY2xvbmVfZmlsdGVyX2Zvcm1hdHMoQVZGaWx0ZXJGb3JtYXRzICphcmcpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICphID0gYXZfbWVtZHVwKGFyZywgc2l6ZW9mKCphcmcpKTsKKyAgICBpZiAoYSkgeworICAgICAgICBhLT5yZWZjb3VudCA9IDA7CisgICAgICAgIGEtPnJlZnMgICAgID0gTlVMTDsKKyAgICAgICAgYS0+Zm9ybWF0cyAgPSBhdl9tZW1kdXAoYS0+Zm9ybWF0cywgc2l6ZW9mKCphLT5mb3JtYXRzKSAqIGEtPm5iX2Zvcm1hdHMpOworICAgICAgICBpZiAoIWEtPmZvcm1hdHMgJiYgYXJnLT5mb3JtYXRzKQorICAgICAgICAgICAgYXZfZnJlZXAoJmEpOworICAgIH0KKyAgICByZXR1cm4gYTsKK30KKworc3RhdGljIGludCBjYW5fbWVyZ2VfZm9ybWF0cyhBVkZpbHRlckZvcm1hdHMgKmFfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckZvcm1hdHMgKmJfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19zYW1wbGVfcmF0ZSkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmEsICpiLCAqcmV0OworICAgIGlmIChhX2FyZyA9PSBiX2FyZykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYSA9IGNsb25lX2ZpbHRlcl9mb3JtYXRzKGFfYXJnKTsKKyAgICBiID0gY2xvbmVfZmlsdGVyX2Zvcm1hdHMoYl9hcmcpOworCisgICAgaWYgKCFhIHx8ICFiKSB7CisgICAgICAgIGlmIChhKQorICAgICAgICAgICAgYXZfZnJlZXAoJmEtPmZvcm1hdHMpOworICAgICAgICBpZiAoYikKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZiLT5mb3JtYXRzKTsKKworICAgICAgICBhdl9mcmVlcCgmYSk7CisgICAgICAgIGF2X2ZyZWVwKCZiKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoaXNfc2FtcGxlX3JhdGUpIHsKKyAgICAgICAgcmV0ID0gZmZfbWVyZ2Vfc2FtcGxlcmF0ZXMoYSwgYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gZmZfbWVyZ2VfZm9ybWF0cyhhLCBiLCB0eXBlKTsKKyAgICB9CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9mcmVlcCgmcmV0LT5mb3JtYXRzKTsKKyAgICAgICAgYXZfZnJlZXAoJnJldC0+cmVmcyk7CisgICAgICAgIGF2X2ZyZWVwKCZyZXQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9mcmVlcCgmYS0+Zm9ybWF0cyk7CisgICAgICAgIGF2X2ZyZWVwKCZiLT5mb3JtYXRzKTsKKyAgICAgICAgYXZfZnJlZXAoJmEpOworICAgICAgICBhdl9mcmVlcCgmYik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyoqCisgKiBQZXJmb3JtIG9uZSByb3VuZCBvZiBxdWVyeV9mb3JtYXRzKCkgYW5kIG1lcmdpbmcgZm9ybWF0cyBsaXN0cyBvbiB0aGUKKyAqIGZpbHRlciBncmFwaC4KKyAqIEByZXR1cm4gID49MCBpZiBhbGwgbGlua3MgZm9ybWF0cyBsaXN0cyBjb3VsZCBiZSBxdWVyaWVkIGFuZCBtZXJnZWQ7CisgKiAgICAgICAgICBBVkVSUk9SKEVBR0FJTikgc29tZSBwcm9ncmVzcyB3YXMgbWFkZSBpbiB0aGUgcXVlcmllcyBvciBtZXJnaW5nCisgKiAgICAgICAgICBhbmQgYSBsYXRlciBjYWxsIG1heSBzdWNjZWVkOworICogICAgICAgICAgQVZFUlJPUihFSU8pIChtYXkgYmUgY2hhbmdlZCkgcGx1cyBhIGxvZyBtZXNzYWdlIGlmIG5vIHByb2dyZXNzCisgKiAgICAgICAgICB3YXMgbWFkZSBhbmQgdGhlIG5lZ290aWF0aW9uIGlzIHN0dWNrOworICogICAgICAgICAgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHNvbWUgb3RoZXIgZXJyb3IgaGFwcGVuZWQKKyAqLworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBBVkNsYXNzICpsb2dfY3R4KQoreworICAgIGludCBpLCBqLCByZXQ7CisgICAgaW50IHNjYWxlcl9jb3VudCA9IDAsIHJlc2FtcGxlcl9jb3VudCA9IDA7CisgICAgaW50IGNvdW50X3F1ZXJpZWQgPSAwOyAgICAgICAgLyogc3VjY2Vzc2Z1bCBjYWxscyB0byBxdWVyeV9mb3JtYXRzKCkgKi8KKyAgICBpbnQgY291bnRfbWVyZ2VkID0gMDsgICAgICAgICAvKiBzdWNjZXNzZnVsIG1lcmdlIG9mIGZvcm1hdHMgbGlzdHMgKi8KKyAgICBpbnQgY291bnRfYWxyZWFkeV9tZXJnZWQgPSAwOyAvKiBsaXN0cyBhbHJlYWR5IG1lcmdlZCAqLworICAgIGludCBjb3VudF9kZWxheWVkID0gMDsgICAgICAgIC8qIGxpc3RzIHRoYXQgbmVlZCB0byBiZSBtZXJnZWQgbGF0ZXIgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBncmFwaC0+bmJfZmlsdGVyczsgaSsrKSB7CisgICAgICAgIEFWRmlsdGVyQ29udGV4dCAqZiA9IGdyYXBoLT5maWx0ZXJzW2ldOworICAgICAgICBpZiAoZm9ybWF0c19kZWNsYXJlZChmKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoZi0+ZmlsdGVyLT5xdWVyeV9mb3JtYXRzKQorICAgICAgICAgICAgcmV0ID0gZmlsdGVyX3F1ZXJ5X2Zvcm1hdHMoZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldCA9IGZmX2RlZmF1bHRfcXVlcnlfZm9ybWF0cyhmKTsKKyAgICAgICAgaWYgKHJldCA8IDAgJiYgcmV0ICE9IEFWRVJST1IoRUFHQUlOKSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIC8qIG5vdGU6IEVBR0FJTiBjb3VsZCBpbmRpY2F0ZSBhIHBhcnRpYWwgc3VjY2Vzcywgbm90IGNvdW50ZWQgeWV0ICovCisgICAgICAgIGNvdW50X3F1ZXJpZWQgKz0gcmV0ID49IDA7CisgICAgfQorCisgICAgLyogZ28gdGhyb3VnaCBhbmQgbWVyZ2UgYXMgbWFueSBmb3JtYXQgbGlzdHMgYXMgcG9zc2libGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX2ZpbHRlcnM7IGkrKykgeworICAgICAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRlciA9IGdyYXBoLT5maWx0ZXJzW2ldOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmaWx0ZXItPm5iX2lucHV0czsgaisrKSB7CisgICAgICAgICAgICBBVkZpbHRlckxpbmsgKmxpbmsgPSBmaWx0ZXItPmlucHV0c1tqXTsKKyAgICAgICAgICAgIGludCBjb252ZXJ0X25lZWRlZCA9IDA7CisKKyAgICAgICAgICAgIGlmICghbGluaykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGxpbmstPmluX2Zvcm1hdHMgIT0gbGluay0+b3V0X2Zvcm1hdHMKKyAgICAgICAgICAgICAgICAmJiBsaW5rLT5pbl9mb3JtYXRzICYmIGxpbmstPm91dF9mb3JtYXRzKQorICAgICAgICAgICAgICAgIGlmICghY2FuX21lcmdlX2Zvcm1hdHMobGluay0+aW5fZm9ybWF0cywgbGluay0+b3V0X2Zvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPnR5cGUsIDApKQorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0X25lZWRlZCA9IDE7CisgICAgICAgICAgICBpZiAobGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgICAgICBpZiAobGluay0+aW5fc2FtcGxlcmF0ZXMgIT0gbGluay0+b3V0X3NhbXBsZXJhdGVzCisgICAgICAgICAgICAgICAgICAgICYmIGxpbmstPmluX3NhbXBsZXJhdGVzICYmIGxpbmstPm91dF9zYW1wbGVyYXRlcykKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5fbWVyZ2VfZm9ybWF0cyhsaW5rLT5pbl9zYW1wbGVyYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5vdXRfc2FtcGxlcmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0X25lZWRlZCA9IDE7CisgICAgICAgICAgICB9CisKKyNkZWZpbmUgTUVSR0VfRElTUEFUQ0goZmllbGQsIHN0YXRlbWVudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCEobGluay0+aW5fICMjIGZpZWxkICYmIGxpbmstPm91dF8gIyMgZmllbGQpKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY291bnRfZGVsYXllZCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGluay0+aW5fICMjIGZpZWxkID09IGxpbmstPm91dF8gIyMgZmllbGQpIHsgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvdW50X2FscmVhZHlfbWVyZ2VkKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgaWYgKCFjb252ZXJ0X25lZWRlZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb3VudF9tZXJnZWQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0YXRlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsaW5rLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgICAgIE1FUkdFX0RJU1BBVENIKGNoYW5uZWxfbGF5b3V0cywKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmZl9tZXJnZV9jaGFubmVsX2xheW91dHMobGluay0+aW5fY2hhbm5lbF9sYXlvdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5vdXRfY2hhbm5lbF9sYXlvdXRzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRfbmVlZGVkID0gMTsKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgTUVSR0VfRElTUEFUQ0goc2FtcGxlcmF0ZXMsCisgICAgICAgICAgICAgICAgICAgIGlmICghZmZfbWVyZ2Vfc2FtcGxlcmF0ZXMobGluay0+aW5fc2FtcGxlcmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+b3V0X3NhbXBsZXJhdGVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRfbmVlZGVkID0gMTsKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9CisgICAgICAgICAgICBNRVJHRV9ESVNQQVRDSChmb3JtYXRzLAorICAgICAgICAgICAgICAgIGlmICghZmZfbWVyZ2VfZm9ybWF0cyhsaW5rLT5pbl9mb3JtYXRzLCBsaW5rLT5vdXRfZm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+dHlwZSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRfbmVlZGVkID0gMTsKKyAgICAgICAgICAgICkKKyN1bmRlZiBNRVJHRV9ESVNQQVRDSAorCisgICAgICAgICAgICBpZiAoY29udmVydF9uZWVkZWQpIHsKKyAgICAgICAgICAgICAgICBBVkZpbHRlckNvbnRleHQgKmNvbnZlcnQ7CisgICAgICAgICAgICAgICAgQVZGaWx0ZXIgKmZpbHRlcjsKKyAgICAgICAgICAgICAgICBBVkZpbHRlckxpbmsgKmlubGluaywgKm91dGxpbms7CisgICAgICAgICAgICAgICAgY2hhciBzY2FsZV9hcmdzWzI1Nl07CisgICAgICAgICAgICAgICAgY2hhciBpbnN0X25hbWVbMzBdOworCisgICAgICAgICAgICAgICAgLyogY291bGRuJ3QgbWVyZ2UgZm9ybWF0IGxpc3RzLiBhdXRvLWluc2VydCBjb252ZXJzaW9uIGZpbHRlciAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAobGluay0+dHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgICAgICAgICBpZiAoIShmaWx0ZXIgPSBhdmZpbHRlcl9nZXRfYnlfbmFtZSgic2NhbGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICInc2NhbGUnIGZpbHRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBwcmVzZW50LCBjYW5ub3QgY29udmVydCBwaXhlbCBmb3JtYXRzLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoaW5zdF9uYW1lLCBzaXplb2YoaW5zdF9uYW1lKSwgImF1dG8taW5zZXJ0ZWQgc2NhbGVyICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVyX2NvdW50KyspOworCisgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmY29udmVydCwgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdF9uYW1lLCBncmFwaC0+c2NhbGVfc3dzX29wdHMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgICAgICAgICBpZiAoIShmaWx0ZXIgPSBhdmZpbHRlcl9nZXRfYnlfbmFtZSgiYXJlc2FtcGxlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiJ2FyZXNhbXBsZScgZmlsdGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IHByZXNlbnQsIGNhbm5vdCBjb252ZXJ0IGF1ZGlvIGZvcm1hdHMuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihpbnN0X25hbWUsIHNpemVvZihpbnN0X25hbWUpLCAiYXV0by1pbnNlcnRlZCByZXNhbXBsZXIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNhbXBsZXJfY291bnQrKyk7CisgICAgICAgICAgICAgICAgICAgIHNjYWxlX2FyZ3NbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhcGgtPmFyZXNhbXBsZV9zd3Jfb3B0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHNjYWxlX2FyZ3MsIHNpemVvZihzY2FsZV9hcmdzKSwgIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoLT5hcmVzYW1wbGVfc3dyX29wdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJmNvbnZlcnQsIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RfbmFtZSwgZ3JhcGgtPmFyZXNhbXBsZV9zd3Jfb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGdyYXBoKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2luc2VydF9maWx0ZXIobGluaywgY29udmVydCwgMCwgMCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmlsdGVyX3F1ZXJ5X2Zvcm1hdHMoY29udmVydCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgIGlubGluayAgPSBjb252ZXJ0LT5pbnB1dHNbMF07CisgICAgICAgICAgICAgICAgb3V0bGluayA9IGNvbnZlcnQtPm91dHB1dHNbMF07CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCggaW5saW5rLT4gaW5fZm9ybWF0cy0+cmVmY291bnQgPiAwKTsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKCBpbmxpbmstPm91dF9mb3JtYXRzLT5yZWZjb3VudCA+IDApOworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAob3V0bGluay0+IGluX2Zvcm1hdHMtPnJlZmNvdW50ID4gMCk7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChvdXRsaW5rLT5vdXRfZm9ybWF0cy0+cmVmY291bnQgPiAwKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0bGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCggaW5saW5rLT4gaW5fc2FtcGxlcmF0ZXMtPnJlZmNvdW50ID4gMCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoIGlubGluay0+b3V0X3NhbXBsZXJhdGVzLT5yZWZjb3VudCA+IDApOworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKG91dGxpbmstPiBpbl9zYW1wbGVyYXRlcy0+cmVmY291bnQgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChvdXRsaW5rLT5vdXRfc2FtcGxlcmF0ZXMtPnJlZmNvdW50ID4gMCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoIGlubGluay0+IGluX2NoYW5uZWxfbGF5b3V0cy0+cmVmY291bnQgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCggaW5saW5rLT5vdXRfY2hhbm5lbF9sYXlvdXRzLT5yZWZjb3VudCA+IDApOworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKG91dGxpbmstPiBpbl9jaGFubmVsX2xheW91dHMtPnJlZmNvdW50ID4gMCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAob3V0bGluay0+b3V0X2NoYW5uZWxfbGF5b3V0cy0+cmVmY291bnQgPiAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFmZl9tZXJnZV9mb3JtYXRzKCBpbmxpbmstPmluX2Zvcm1hdHMsICBpbmxpbmstPm91dF9mb3JtYXRzLCAgaW5saW5rLT50eXBlKSB8fAorICAgICAgICAgICAgICAgICAgICAhZmZfbWVyZ2VfZm9ybWF0cyhvdXRsaW5rLT5pbl9mb3JtYXRzLCBvdXRsaW5rLT5vdXRfZm9ybWF0cywgb3V0bGluay0+dHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5saW5rLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgICAgICAoIWZmX21lcmdlX3NhbXBsZXJhdGVzKGlubGluay0+aW5fc2FtcGxlcmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5vdXRfc2FtcGxlcmF0ZXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAhZmZfbWVyZ2VfY2hhbm5lbF9sYXlvdXRzKGlubGluay0+aW5fY2hhbm5lbF9sYXlvdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPm91dF9jaGFubmVsX2xheW91dHMpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9TWVMpOworICAgICAgICAgICAgICAgIGlmIChvdXRsaW5rLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgICAgICAoIWZmX21lcmdlX3NhbXBsZXJhdGVzKG91dGxpbmstPmluX3NhbXBsZXJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPm91dF9zYW1wbGVyYXRlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICFmZl9tZXJnZV9jaGFubmVsX2xheW91dHMob3V0bGluay0+aW5fY2hhbm5lbF9sYXlvdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT5vdXRfY2hhbm5lbF9sYXlvdXRzKSkpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PU1lTKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wb3NzaWJsZSB0byBjb252ZXJ0IGJldHdlZW4gdGhlIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSBmaWx0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgYW5kIHRoZSBmaWx0ZXIgJyVzJ1xuIiwgbGluay0+c3JjLT5uYW1lLCBsaW5rLT5kc3QtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2xvZyhncmFwaCwgQVZfTE9HX0RFQlVHLCAicXVlcnlfZm9ybWF0czogIgorICAgICAgICAgICAiJWQgcXVlcmllZCwgJWQgbWVyZ2VkLCAlZCBhbHJlYWR5IGRvbmUsICVkIGRlbGF5ZWRcbiIsCisgICAgICAgICAgIGNvdW50X3F1ZXJpZWQsIGNvdW50X21lcmdlZCwgY291bnRfYWxyZWFkeV9tZXJnZWQsIGNvdW50X2RlbGF5ZWQpOworICAgIGlmIChjb3VudF9kZWxheWVkKSB7CisgICAgICAgIEFWQlByaW50IGJwOworCisgICAgICAgIC8qIGlmIGNvdW50X3F1ZXJpZWQgPiAwLCBvbmUgZmlsdGVyIGF0IGxlYXN0IGRpZCBzZXQgaXRzIGZvcm1hdHMsCisgICAgICAgICAgIHRoYXQgd2lsbCBnaXZlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gaXRzIG5laWdoYm91cjsKKyAgICAgICAgICAgaWYgY291bnRfbWVyZ2VkID4gMCwgb25lIHBhaXIgb2YgZm9ybWF0cyBsaXN0cyBhdCBsZWFzdCB3YXMgbWVyZ2VkLAorICAgICAgICAgICB0aGF0IHdpbGwgZ2l2ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGFsbCBjb25uZWN0ZWQgZmlsdGVyczsKKyAgICAgICAgICAgaW4gYm90aCBjYXNlcywgcHJvZ3Jlc3Mgd2FzIG1hZGUgYW5kIGEgbmV3IHJvdW5kIG11c3QgYmUgZG9uZSAqLworICAgICAgICBpZiAoY291bnRfcXVlcmllZCB8fCBjb3VudF9tZXJnZWQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgICAgICBhdl9icHJpbnRfaW5pdCgmYnAsIDAsIEFWX0JQUklOVF9TSVpFX0FVVE9NQVRJQyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBncmFwaC0+bmJfZmlsdGVyczsgaSsrKQorICAgICAgICAgICAgaWYgKCFmb3JtYXRzX2RlY2xhcmVkKGdyYXBoLT5maWx0ZXJzW2ldKSkKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRmKCZicCwgIiVzJXMiLCBicC5sZW4gPyAiLCAiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoLT5maWx0ZXJzW2ldLT5uYW1lKTsKKyAgICAgICAgYXZfbG9nKGdyYXBoLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVGhlIGZvbGxvd2luZyBmaWx0ZXJzIGNvdWxkIG5vdCBjaG9vc2UgdGhlaXIgZm9ybWF0czogJXNcbiIKKyAgICAgICAgICAgICAgICJDb25zaWRlciBpbnNlcnRpbmcgdGhlIChhKWZvcm1hdCBmaWx0ZXIgbmVhciB0aGVpciBpbnB1dCBvciAiCisgICAgICAgICAgICAgICAib3V0cHV0LlxuIiwgYnAuc3RyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGlja19mb3JtYXQoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZpbHRlckxpbmsgKnJlZikKK3sKKyAgICBpZiAoIWxpbmsgfHwgIWxpbmstPmluX2Zvcm1hdHMpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGxpbmstPnR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGlmKHJlZiAmJiByZWYtPnR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKXsKKyAgICAgICAgICAgIGludCBoYXNfYWxwaGE9IGF2X3BpeF9mbXRfZGVzY19nZXQocmVmLT5mb3JtYXQpLT5uYl9jb21wb25lbnRzICUgMiA9PSAwOworICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IGJlc3Q9IEFWX1BJWF9GTVRfTk9ORTsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpPTA7IGk8bGluay0+aW5fZm9ybWF0cy0+bmJfZm9ybWF0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHAgPSBsaW5rLT5pbl9mb3JtYXRzLT5mb3JtYXRzW2ldOworICAgICAgICAgICAgICAgIGJlc3Q9IGF2X2ZpbmRfYmVzdF9waXhfZm10X29mXzIoYmVzdCwgcCwgcmVmLT5mb3JtYXQsIGhhc19hbHBoYSwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9sb2cobGluay0+c3JjLEFWX0xPR19ERUJVRywgInBpY2tpbmcgJXMgb3V0IG9mICVkIHJlZjolcyBhbHBoYTolZFxuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGJlc3QpLCBsaW5rLT5pbl9mb3JtYXRzLT5uYl9mb3JtYXRzLAorICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUocmVmLT5mb3JtYXQpLCBoYXNfYWxwaGEpOworICAgICAgICAgICAgbGluay0+aW5fZm9ybWF0cy0+Zm9ybWF0c1swXSA9IGJlc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsaW5rLT5pbl9mb3JtYXRzLT5uYl9mb3JtYXRzID0gMTsKKyAgICBsaW5rLT5mb3JtYXQgPSBsaW5rLT5pbl9mb3JtYXRzLT5mb3JtYXRzWzBdOworCisgICAgaWYgKGxpbmstPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGlmICghbGluay0+aW5fc2FtcGxlcmF0ZXMtPm5iX2Zvcm1hdHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhsaW5rLT5zcmMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBzZWxlY3Qgc2FtcGxlIHJhdGUgZm9yIgorICAgICAgICAgICAgICAgICAgICIgdGhlIGxpbmsgYmV0d2VlbiBmaWx0ZXJzICVzIGFuZCAlcy5cbiIsIGxpbmstPnNyYy0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICBsaW5rLT5kc3QtPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBsaW5rLT5pbl9zYW1wbGVyYXRlcy0+bmJfZm9ybWF0cyA9IDE7CisgICAgICAgIGxpbmstPnNhbXBsZV9yYXRlID0gbGluay0+aW5fc2FtcGxlcmF0ZXMtPmZvcm1hdHNbMF07CisKKyAgICAgICAgaWYgKGxpbmstPmluX2NoYW5uZWxfbGF5b3V0cy0+YWxsX2xheW91dHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhsaW5rLT5zcmMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBzZWxlY3QgY2hhbm5lbCBsYXlvdXQgZm9yIgorICAgICAgICAgICAgICAgICAgICIgdGhlIGxpbmsgYmV0d2VlbiBmaWx0ZXJzICVzIGFuZCAlcy5cbiIsIGxpbmstPnNyYy0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICBsaW5rLT5kc3QtPm5hbWUpOworICAgICAgICAgICAgaWYgKCFsaW5rLT5pbl9jaGFubmVsX2xheW91dHMtPmFsbF9jb3VudHMpCisgICAgICAgICAgICAgICAgYXZfbG9nKGxpbmstPnNyYywgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjaGFubmVsIGxheW91dHMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInN1cHBvcnRlZCwgdHJ5IHNwZWNpZnlpbmcgYSBjaGFubmVsIGxheW91dCB1c2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICInYWZvcm1hdD1jaGFubmVsX2xheW91dHM9c29tZXRoaW5nJy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBsaW5rLT5pbl9jaGFubmVsX2xheW91dHMtPm5iX2NoYW5uZWxfbGF5b3V0cyA9IDE7CisgICAgICAgIGxpbmstPmNoYW5uZWxfbGF5b3V0ID0gbGluay0+aW5fY2hhbm5lbF9sYXlvdXRzLT5jaGFubmVsX2xheW91dHNbMF07CisgICAgICAgIGlmICgobGluay0+Y2hhbm5lbHMgPSBGRl9MQVlPVVQyQ09VTlQobGluay0+Y2hhbm5lbF9sYXlvdXQpKSkKKyAgICAgICAgICAgIGxpbmstPmNoYW5uZWxfbGF5b3V0ID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGluay0+Y2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMobGluay0+Y2hhbm5lbF9sYXlvdXQpOworICAgIH0KKworICAgIGZmX2Zvcm1hdHNfdW5yZWYoJmxpbmstPmluX2Zvcm1hdHMpOworICAgIGZmX2Zvcm1hdHNfdW5yZWYoJmxpbmstPm91dF9mb3JtYXRzKTsKKyAgICBmZl9mb3JtYXRzX3VucmVmKCZsaW5rLT5pbl9zYW1wbGVyYXRlcyk7CisgICAgZmZfZm9ybWF0c191bnJlZigmbGluay0+b3V0X3NhbXBsZXJhdGVzKTsKKyAgICBmZl9jaGFubmVsX2xheW91dHNfdW5yZWYoJmxpbmstPmluX2NoYW5uZWxfbGF5b3V0cyk7CisgICAgZmZfY2hhbm5lbF9sYXlvdXRzX3VucmVmKCZsaW5rLT5vdXRfY2hhbm5lbF9sYXlvdXRzKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFJFRFVDRV9GT1JNQVRTKGZtdF90eXBlLCBsaXN0X3R5cGUsIGxpc3QsIHZhciwgbmIsIGFkZF9mb3JtYXQpIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPm5iX2lucHV0czsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFWRmlsdGVyTGluayAqbGluayA9IGZpbHRlci0+aW5wdXRzW2ldOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm10X3R5cGUgZm10OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghbGluay0+b3V0XyAjIyBsaXN0IHx8IGxpbmstPm91dF8gIyMgbGlzdC0+bmIgIT0gMSkgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmbXQgPSBsaW5rLT5vdXRfICMjIGxpc3QtPnZhclswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpbHRlci0+bmJfb3V0cHV0czsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQVZGaWx0ZXJMaW5rICpvdXRfbGluayA9IGZpbHRlci0+b3V0cHV0c1tqXTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsaXN0X3R5cGUgKmZtdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGxpbmstPnR5cGUgIT0gb3V0X2xpbmstPnR5cGUgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgb3V0X2xpbmstPmluXyAjIyBsaXN0LT5uYiA9PSAxKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm10cyA9IG91dF9saW5rLT5pbl8gIyMgbGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICghb3V0X2xpbmstPmluXyAjIyBsaXN0LT5uYikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGFkZF9mb3JtYXQoJm91dF9saW5rLT5pbl8gIyNsaXN0LCBmbXQpOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmV0ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBvdXRfbGluay0+aW5fICMjIGxpc3QtPm5iOyBrKyspICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChmbXRzLT52YXJba10gPT0gZm10KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZtdHMtPnZhclswXSAgPSBmbXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZm10cy0+bmIgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByZXQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgcmVkdWNlX2Zvcm1hdHNfb25fZmlsdGVyKEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyKQoreworICAgIGludCBpLCBqLCBrLCByZXQgPSAwOworCisgICAgUkVEVUNFX0ZPUk1BVFMoaW50LCAgICAgIEFWRmlsdGVyRm9ybWF0cywgICAgICAgIGZvcm1hdHMsICAgICAgICAgZm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICBuYl9mb3JtYXRzLCBmZl9hZGRfZm9ybWF0KTsKKyAgICBSRURVQ0VfRk9STUFUUyhpbnQsICAgICAgQVZGaWx0ZXJGb3JtYXRzLCAgICAgICAgc2FtcGxlcmF0ZXMsICAgICBmb3JtYXRzLAorICAgICAgICAgICAgICAgICAgIG5iX2Zvcm1hdHMsIGZmX2FkZF9mb3JtYXQpOworCisgICAgLyogcmVkdWNlIGNoYW5uZWwgbGF5b3V0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gZmlsdGVyLT5pbnB1dHNbaV07CisgICAgICAgIHVpbnQ2NF90IGZtdDsKKworICAgICAgICBpZiAoIWlubGluay0+b3V0X2NoYW5uZWxfbGF5b3V0cyB8fAorICAgICAgICAgICAgaW5saW5rLT5vdXRfY2hhbm5lbF9sYXlvdXRzLT5uYl9jaGFubmVsX2xheW91dHMgIT0gMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmbXQgPSBpbmxpbmstPm91dF9jaGFubmVsX2xheW91dHMtPmNoYW5uZWxfbGF5b3V0c1swXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyLT5uYl9vdXRwdXRzOyBqKyspIHsKKyAgICAgICAgICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGZpbHRlci0+b3V0cHV0c1tqXTsKKyAgICAgICAgICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmZtdHM7CisKKyAgICAgICAgICAgIGZtdHMgPSBvdXRsaW5rLT5pbl9jaGFubmVsX2xheW91dHM7CisgICAgICAgICAgICBpZiAoaW5saW5rLT50eXBlICE9IG91dGxpbmstPnR5cGUgfHwgZm10cy0+bmJfY2hhbm5lbF9sYXlvdXRzID09IDEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChmbXRzLT5hbGxfbGF5b3V0cyAmJgorICAgICAgICAgICAgICAgICghRkZfTEFZT1VUMkNPVU5UKGZtdCkgfHwgZm10cy0+YWxsX2NvdW50cykpIHsKKyAgICAgICAgICAgICAgICAvKiBUdXJuIHRoZSBpbmZpbml0ZSBsaXN0IGludG8gYSBzaW5nbGV0b24gKi8KKyAgICAgICAgICAgICAgICBmbXRzLT5hbGxfbGF5b3V0cyA9IGZtdHMtPmFsbF9jb3VudHMgID0gMDsKKyAgICAgICAgICAgICAgICBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoJm91dGxpbmstPmluX2NoYW5uZWxfbGF5b3V0cywgZm10KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG91dGxpbmstPmluX2NoYW5uZWxfbGF5b3V0cy0+bmJfY2hhbm5lbF9sYXlvdXRzOyBrKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZm10cy0+Y2hhbm5lbF9sYXlvdXRzW2tdID09IGZtdCkgeworICAgICAgICAgICAgICAgICAgICBmbXRzLT5jaGFubmVsX2xheW91dHNbMF0gID0gZm10OworICAgICAgICAgICAgICAgICAgICBmbXRzLT5uYl9jaGFubmVsX2xheW91dHMgPSAxOworICAgICAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByZWR1Y2VfZm9ybWF0cyhBVkZpbHRlckdyYXBoICpncmFwaCkKK3sKKyAgICBpbnQgaSwgcmVkdWNlZDsKKworICAgIGRvIHsKKyAgICAgICAgcmVkdWNlZCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGdyYXBoLT5uYl9maWx0ZXJzOyBpKyspCisgICAgICAgICAgICByZWR1Y2VkIHw9IHJlZHVjZV9mb3JtYXRzX29uX2ZpbHRlcihncmFwaC0+ZmlsdGVyc1tpXSk7CisgICAgfSB3aGlsZSAocmVkdWNlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHN3YXBfc2FtcGxlcmF0ZXNfb25fZmlsdGVyKEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyKQoreworICAgIEFWRmlsdGVyTGluayAqbGluayA9IE5VTEw7CisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlci0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgbGluayA9IGZpbHRlci0+aW5wdXRzW2ldOworCisgICAgICAgIGlmIChsaW5rLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgbGluay0+b3V0X3NhbXBsZXJhdGVzLT5uYl9mb3JtYXRzPT0gMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA9PSBmaWx0ZXItPm5iX2lucHV0cykKKyAgICAgICAgcmV0dXJuOworCisgICAgc2FtcGxlX3JhdGUgPSBsaW5rLT5vdXRfc2FtcGxlcmF0ZXMtPmZvcm1hdHNbMF07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyLT5uYl9vdXRwdXRzOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gZmlsdGVyLT5vdXRwdXRzW2ldOworICAgICAgICBpbnQgYmVzdF9pZHgsIGJlc3RfZGlmZiA9IElOVF9NQVg7CisKKyAgICAgICAgaWYgKG91dGxpbmstPnR5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPIHx8CisgICAgICAgICAgICBvdXRsaW5rLT5pbl9zYW1wbGVyYXRlcy0+bmJfZm9ybWF0cyA8IDIpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0bGluay0+aW5fc2FtcGxlcmF0ZXMtPm5iX2Zvcm1hdHM7IGorKykgeworICAgICAgICAgICAgaW50IGRpZmYgPSBhYnMoc2FtcGxlX3JhdGUgLSBvdXRsaW5rLT5pbl9zYW1wbGVyYXRlcy0+Zm9ybWF0c1tqXSk7CisKKyAgICAgICAgICAgIGlmIChkaWZmIDwgYmVzdF9kaWZmKSB7CisgICAgICAgICAgICAgICAgYmVzdF9kaWZmID0gZGlmZjsKKyAgICAgICAgICAgICAgICBiZXN0X2lkeCAgPSBqOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZGU1dBUChpbnQsIG91dGxpbmstPmluX3NhbXBsZXJhdGVzLT5mb3JtYXRzWzBdLAorICAgICAgICAgICAgICAgb3V0bGluay0+aW5fc2FtcGxlcmF0ZXMtPmZvcm1hdHNbYmVzdF9pZHhdKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHN3YXBfc2FtcGxlcmF0ZXMoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX2ZpbHRlcnM7IGkrKykKKyAgICAgICAgc3dhcF9zYW1wbGVyYXRlc19vbl9maWx0ZXIoZ3JhcGgtPmZpbHRlcnNbaV0pOworfQorCisjZGVmaW5lIENIX0NFTlRFUl9QQUlSIChBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8IEFWX0NIX0ZST05UX1JJR0hUX09GX0NFTlRFUikKKyNkZWZpbmUgQ0hfRlJPTlRfUEFJUiAgKEFWX0NIX0ZST05UX0xFRlQgICAgICAgICAgIHwgQVZfQ0hfRlJPTlRfUklHSFQpCisjZGVmaW5lIENIX1NURVJFT19QQUlSIChBVl9DSF9TVEVSRU9fTEVGVCAgICAgICAgICB8IEFWX0NIX1NURVJFT19SSUdIVCkKKyNkZWZpbmUgQ0hfV0lERV9QQUlSICAgKEFWX0NIX1dJREVfTEVGVCAgICAgICAgICAgIHwgQVZfQ0hfV0lERV9SSUdIVCkKKyNkZWZpbmUgQ0hfU0lERV9QQUlSICAgKEFWX0NIX1NJREVfTEVGVCAgICAgICAgICAgIHwgQVZfQ0hfU0lERV9SSUdIVCkKKyNkZWZpbmUgQ0hfRElSRUNUX1BBSVIgKEFWX0NIX1NVUlJPVU5EX0RJUkVDVF9MRUZUIHwgQVZfQ0hfU1VSUk9VTkRfRElSRUNUX1JJR0hUKQorI2RlZmluZSBDSF9CQUNLX1BBSVIgICAoQVZfQ0hfQkFDS19MRUZUICAgICAgICAgICAgfCBBVl9DSF9CQUNLX1JJR0hUKQorCisvKiBhbGxvd2FibGUgc3Vic3RpdHV0aW9ucyBmb3IgY2hhbm5lbCBwYWlycyB3aGVuIGNvbXBhcmluZyBsYXlvdXRzLAorICogb3JkZXJlZCBieSBwcmlvcml0eSBmb3IgYm90aCB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50NjRfdCBjaF9zdWJzdFtdWzJdID0geworICAgIHsgQ0hfRlJPTlRfUEFJUiwgICAgICBDSF9DRU5URVJfUEFJUiAgICAgfSwKKyAgICB7IENIX0ZST05UX1BBSVIsICAgICAgQ0hfV0lERV9QQUlSICAgICAgIH0sCisgICAgeyBDSF9GUk9OVF9QQUlSLCAgICAgIEFWX0NIX0ZST05UX0NFTlRFUiB9LAorICAgIHsgQ0hfQ0VOVEVSX1BBSVIsICAgICBDSF9GUk9OVF9QQUlSICAgICAgfSwKKyAgICB7IENIX0NFTlRFUl9QQUlSLCAgICAgQ0hfV0lERV9QQUlSICAgICAgIH0sCisgICAgeyBDSF9DRU5URVJfUEFJUiwgICAgIEFWX0NIX0ZST05UX0NFTlRFUiB9LAorICAgIHsgQ0hfV0lERV9QQUlSLCAgICAgICBDSF9GUk9OVF9QQUlSICAgICAgfSwKKyAgICB7IENIX1dJREVfUEFJUiwgICAgICAgQ0hfQ0VOVEVSX1BBSVIgICAgIH0sCisgICAgeyBDSF9XSURFX1BBSVIsICAgICAgIEFWX0NIX0ZST05UX0NFTlRFUiB9LAorICAgIHsgQVZfQ0hfRlJPTlRfQ0VOVEVSLCBDSF9GUk9OVF9QQUlSICAgICAgfSwKKyAgICB7IEFWX0NIX0ZST05UX0NFTlRFUiwgQ0hfQ0VOVEVSX1BBSVIgICAgIH0sCisgICAgeyBBVl9DSF9GUk9OVF9DRU5URVIsIENIX1dJREVfUEFJUiAgICAgICB9LAorICAgIHsgQ0hfU0lERV9QQUlSLCAgICAgICBDSF9ESVJFQ1RfUEFJUiAgICAgfSwKKyAgICB7IENIX1NJREVfUEFJUiwgICAgICAgQ0hfQkFDS19QQUlSICAgICAgIH0sCisgICAgeyBDSF9TSURFX1BBSVIsICAgICAgIEFWX0NIX0JBQ0tfQ0VOVEVSICB9LAorICAgIHsgQ0hfQkFDS19QQUlSLCAgICAgICBDSF9ESVJFQ1RfUEFJUiAgICAgfSwKKyAgICB7IENIX0JBQ0tfUEFJUiwgICAgICAgQ0hfU0lERV9QQUlSICAgICAgIH0sCisgICAgeyBDSF9CQUNLX1BBSVIsICAgICAgIEFWX0NIX0JBQ0tfQ0VOVEVSICB9LAorICAgIHsgQVZfQ0hfQkFDS19DRU5URVIsICBDSF9CQUNLX1BBSVIgICAgICAgfSwKKyAgICB7IEFWX0NIX0JBQ0tfQ0VOVEVSLCAgQ0hfRElSRUNUX1BBSVIgICAgIH0sCisgICAgeyBBVl9DSF9CQUNLX0NFTlRFUiwgIENIX1NJREVfUEFJUiAgICAgICB9LAorfTsKKworc3RhdGljIHZvaWQgc3dhcF9jaGFubmVsX2xheW91dHNfb25fZmlsdGVyKEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyKQoreworICAgIEFWRmlsdGVyTGluayAqbGluayA9IE5VTEw7CisgICAgaW50IGksIGosIGs7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBsaW5rID0gZmlsdGVyLT5pbnB1dHNbaV07CisKKyAgICAgICAgaWYgKGxpbmstPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICAgICBsaW5rLT5vdXRfY2hhbm5lbF9sYXlvdXRzLT5uYl9jaGFubmVsX2xheW91dHMgPT0gMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA9PSBmaWx0ZXItPm5iX2lucHV0cykKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlci0+bmJfb3V0cHV0czsgaSsrKSB7CisgICAgICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGZpbHRlci0+b3V0cHV0c1tpXTsKKyAgICAgICAgaW50IGJlc3RfaWR4ID0gLTEsIGJlc3Rfc2NvcmUgPSBJTlRfTUlOLCBiZXN0X2NvdW50X2RpZmYgPSBJTlRfTUFYOworCisgICAgICAgIGlmIChvdXRsaW5rLT50eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyB8fAorICAgICAgICAgICAgb3V0bGluay0+aW5fY2hhbm5lbF9sYXlvdXRzLT5uYl9jaGFubmVsX2xheW91dHMgPCAyKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dGxpbmstPmluX2NoYW5uZWxfbGF5b3V0cy0+bmJfY2hhbm5lbF9sYXlvdXRzOyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQ2NF90ICBpbl9jaGxheW91dCA9IGxpbmstPm91dF9jaGFubmVsX2xheW91dHMtPmNoYW5uZWxfbGF5b3V0c1swXTsKKyAgICAgICAgICAgIHVpbnQ2NF90IG91dF9jaGxheW91dCA9IG91dGxpbmstPmluX2NoYW5uZWxfbGF5b3V0cy0+Y2hhbm5lbF9sYXlvdXRzW2pdOworICAgICAgICAgICAgaW50ICBpbl9jaGFubmVscyAgICAgID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGluX2NobGF5b3V0KTsKKyAgICAgICAgICAgIGludCBvdXRfY2hhbm5lbHMgICAgICA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhvdXRfY2hsYXlvdXQpOworICAgICAgICAgICAgaW50IGNvdW50X2RpZmYgICAgICAgID0gb3V0X2NoYW5uZWxzIC0gaW5fY2hhbm5lbHM7CisgICAgICAgICAgICBpbnQgbWF0Y2hlZF9jaGFubmVscywgZXh0cmFfY2hhbm5lbHM7CisgICAgICAgICAgICBpbnQgc2NvcmUgPSAxMDAwMDA7CisKKyAgICAgICAgICAgIGlmIChGRl9MQVlPVVQyQ09VTlQoaW5fY2hsYXlvdXQpIHx8IEZGX0xBWU9VVDJDT1VOVChvdXRfY2hsYXlvdXQpKSB7CisgICAgICAgICAgICAgICAgLyogQ29tcHV0ZSBzY29yZSBpbiBjYXNlIHRoZSBpbnB1dCBvciBvdXRwdXQgbGF5b3V0IGVuY29kZXMKKyAgICAgICAgICAgICAgICAgICBhIGNoYW5uZWwgY291bnQ7IGluIHRoaXMgY2FzZSB0aGUgc2NvcmUgaXMgbm90IGFsdGVyZWQgYnkKKyAgICAgICAgICAgICAgICAgICB0aGUgY29tcHV0YXRpb24gYWZ0ZXJ3YXJkcywgYXMgaW5fY2hsYXlvdXQgYW5kCisgICAgICAgICAgICAgICAgICAgb3V0X2NobGF5b3V0IGhhdmUgYm90aCBiZWVuIHNldCB0byAwICovCisgICAgICAgICAgICAgICAgaWYgKEZGX0xBWU9VVDJDT1VOVChpbl9jaGxheW91dCkpCisgICAgICAgICAgICAgICAgICAgIGluX2NoYW5uZWxzID0gRkZfTEFZT1VUMkNPVU5UKGluX2NobGF5b3V0KTsKKyAgICAgICAgICAgICAgICBpZiAoRkZfTEFZT1VUMkNPVU5UKG91dF9jaGxheW91dCkpCisgICAgICAgICAgICAgICAgICAgIG91dF9jaGFubmVscyA9IEZGX0xBWU9VVDJDT1VOVChvdXRfY2hsYXlvdXQpOworICAgICAgICAgICAgICAgIHNjb3JlIC09IDEwMDAwICsgRkZBQlMob3V0X2NoYW5uZWxzIC0gaW5fY2hhbm5lbHMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW5fY2hhbm5lbHMgPiBvdXRfY2hhbm5lbHMgPyAxMDAwMCA6IDApOworICAgICAgICAgICAgICAgIGluX2NobGF5b3V0ID0gb3V0X2NobGF5b3V0ID0gMDsKKyAgICAgICAgICAgICAgICAvKiBMZXQgdGhlIHJlbWFpbmluZyBjb21wdXRhdGlvbiBydW4sIGV2ZW4gaWYgdGhlIHNjb3JlCisgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgbm90IGFsdGVyZWQgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2hhbm5lbCBzdWJzdGl0dXRpb24gKi8KKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBGRl9BUlJBWV9FTEVNUyhjaF9zdWJzdCk7IGsrKykgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNtcDAgPSBjaF9zdWJzdFtrXVswXTsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBjbXAxID0gY2hfc3Vic3Rba11bMV07CisgICAgICAgICAgICAgICAgaWYgKCggaW5fY2hsYXlvdXQgJiBjbXAwKSAmJiAoIShvdXRfY2hsYXlvdXQgJiBjbXAwKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG91dF9jaGxheW91dCAmIGNtcDEpICYmICghKCBpbl9jaGxheW91dCAmIGNtcDEpKSkgeworICAgICAgICAgICAgICAgICAgICBpbl9jaGxheW91dCAgJj0gfmNtcDA7CisgICAgICAgICAgICAgICAgICAgIG91dF9jaGxheW91dCAmPSB+Y21wMTsKKyAgICAgICAgICAgICAgICAgICAgLyogYWRkIHNjb3JlIGZvciBjaGFubmVsIG1hdGNoLCBtaW51cyBhIGRlZHVjdGlvbiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgaGF2aW5nIHRvIGRvIHRoZSBzdWJzdGl0dXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gMTAgKiBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoY21wMSkgLSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbm8gcGVuYWx0eSBmb3IgTEZFIGNoYW5uZWwgbWlzbWF0Y2ggKi8KKyAgICAgICAgICAgIGlmICggKGluX2NobGF5b3V0ICYgQVZfQ0hfTE9XX0ZSRVFVRU5DWSkgJiYKKyAgICAgICAgICAgICAgICAob3V0X2NobGF5b3V0ICYgQVZfQ0hfTE9XX0ZSRVFVRU5DWSkpCisgICAgICAgICAgICAgICAgc2NvcmUgKz0gMTA7CisgICAgICAgICAgICBpbl9jaGxheW91dCAgJj0gfkFWX0NIX0xPV19GUkVRVUVOQ1k7CisgICAgICAgICAgICBvdXRfY2hsYXlvdXQgJj0gfkFWX0NIX0xPV19GUkVRVUVOQ1k7CisKKyAgICAgICAgICAgIG1hdGNoZWRfY2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoaW5fY2hsYXlvdXQgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfY2hsYXlvdXQpOworICAgICAgICAgICAgZXh0cmFfY2hhbm5lbHMgICA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhvdXRfY2hsYXlvdXQgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAofmluX2NobGF5b3V0KSk7CisgICAgICAgICAgICBzY29yZSArPSAxMCAqIG1hdGNoZWRfY2hhbm5lbHMgLSA1ICogZXh0cmFfY2hhbm5lbHM7CisKKyAgICAgICAgICAgIGlmIChzY29yZSA+IGJlc3Rfc2NvcmUgfHwKKyAgICAgICAgICAgICAgICAoY291bnRfZGlmZiA8IGJlc3RfY291bnRfZGlmZiAmJiBzY29yZSA9PSBiZXN0X3Njb3JlKSkgeworICAgICAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKKyAgICAgICAgICAgICAgICBiZXN0X2lkeCAgID0gajsKKyAgICAgICAgICAgICAgICBiZXN0X2NvdW50X2RpZmYgPSBjb3VudF9kaWZmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2X2Fzc2VydDAoYmVzdF9pZHggPj0gMCk7CisgICAgICAgIEZGU1dBUCh1aW50NjRfdCwgb3V0bGluay0+aW5fY2hhbm5lbF9sYXlvdXRzLT5jaGFubmVsX2xheW91dHNbMF0sCisgICAgICAgICAgICAgICBvdXRsaW5rLT5pbl9jaGFubmVsX2xheW91dHMtPmNoYW5uZWxfbGF5b3V0c1tiZXN0X2lkeF0pOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZCBzd2FwX2NoYW5uZWxfbGF5b3V0cyhBVkZpbHRlckdyYXBoICpncmFwaCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBncmFwaC0+bmJfZmlsdGVyczsgaSsrKQorICAgICAgICBzd2FwX2NoYW5uZWxfbGF5b3V0c19vbl9maWx0ZXIoZ3JhcGgtPmZpbHRlcnNbaV0pOworfQorCitzdGF0aWMgdm9pZCBzd2FwX3NhbXBsZV9mbXRzX29uX2ZpbHRlcihBVkZpbHRlckNvbnRleHQgKmZpbHRlcikKK3sKKyAgICBBVkZpbHRlckxpbmsgKmxpbmsgPSBOVUxMOworICAgIGludCBmb3JtYXQsIGJwczsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGxpbmsgPSBmaWx0ZXItPmlucHV0c1tpXTsKKworICAgICAgICBpZiAobGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKKyAgICAgICAgICAgIGxpbmstPm91dF9mb3JtYXRzLT5uYl9mb3JtYXRzID09IDEpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gZmlsdGVyLT5uYl9pbnB1dHMpCisgICAgICAgIHJldHVybjsKKworICAgIGZvcm1hdCA9IGxpbmstPm91dF9mb3JtYXRzLT5mb3JtYXRzWzBdOworICAgIGJwcyAgICA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyLT5uYl9vdXRwdXRzOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gZmlsdGVyLT5vdXRwdXRzW2ldOworICAgICAgICBpbnQgYmVzdF9pZHggPSAtMSwgYmVzdF9zY29yZSA9IElOVF9NSU47CisKKyAgICAgICAgaWYgKG91dGxpbmstPnR5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPIHx8CisgICAgICAgICAgICBvdXRsaW5rLT5pbl9mb3JtYXRzLT5uYl9mb3JtYXRzIDwgMikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRsaW5rLT5pbl9mb3JtYXRzLT5uYl9mb3JtYXRzOyBqKyspIHsKKyAgICAgICAgICAgIGludCBvdXRfZm9ybWF0ID0gb3V0bGluay0+aW5fZm9ybWF0cy0+Zm9ybWF0c1tqXTsKKyAgICAgICAgICAgIGludCBvdXRfYnBzICAgID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUob3V0X2Zvcm1hdCk7CisgICAgICAgICAgICBpbnQgc2NvcmU7CisKKyAgICAgICAgICAgIGlmIChhdl9nZXRfcGFja2VkX3NhbXBsZV9mbXQob3V0X2Zvcm1hdCkgPT0gZm9ybWF0IHx8CisgICAgICAgICAgICAgICAgYXZfZ2V0X3BsYW5hcl9zYW1wbGVfZm10KG91dF9mb3JtYXQpID09IGZvcm1hdCkgeworICAgICAgICAgICAgICAgIGJlc3RfaWR4ICAgPSBqOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBmb3IgczMyIGFuZCBmbG9hdCBwcmVmZXIgZG91YmxlIHRvIHByZXZlbnQgbG9zcyBvZiBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgaWYgKGJwcyA9PSA0ICYmIG91dF9icHMgPT0gOCkgeworICAgICAgICAgICAgICAgIGJlc3RfaWR4ID0gajsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcHJlZmVyIGNsb3Nlc3QgaGlnaGVyIG9yIGVxdWFsIGJwcyAqLworICAgICAgICAgICAgc2NvcmUgPSAtYWJzKG91dF9icHMgLSBicHMpOworICAgICAgICAgICAgaWYgKG91dF9icHMgPj0gYnBzKQorICAgICAgICAgICAgICAgIHNjb3JlICs9IElOVF9NQVgvMjsKKworICAgICAgICAgICAgaWYgKHNjb3JlID4gYmVzdF9zY29yZSkgeworICAgICAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKKyAgICAgICAgICAgICAgICBiZXN0X2lkeCAgID0gajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9hc3NlcnQwKGJlc3RfaWR4ID49IDApOworICAgICAgICBGRlNXQVAoaW50LCBvdXRsaW5rLT5pbl9mb3JtYXRzLT5mb3JtYXRzWzBdLAorICAgICAgICAgICAgICAgb3V0bGluay0+aW5fZm9ybWF0cy0+Zm9ybWF0c1tiZXN0X2lkeF0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3dhcF9zYW1wbGVfZm10cyhBVkZpbHRlckdyYXBoICpncmFwaCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBncmFwaC0+bmJfZmlsdGVyczsgaSsrKQorICAgICAgICBzd2FwX3NhbXBsZV9mbXRzX29uX2ZpbHRlcihncmFwaC0+ZmlsdGVyc1tpXSk7CisKK30KKworc3RhdGljIGludCBwaWNrX2Zvcm1hdHMoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgpCit7CisgICAgaW50IGksIGosIHJldDsKKyAgICBpbnQgY2hhbmdlOworCisgICAgZG97CisgICAgICAgIGNoYW5nZSA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBncmFwaC0+bmJfZmlsdGVyczsgaSsrKSB7CisgICAgICAgICAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRlciA9IGdyYXBoLT5maWx0ZXJzW2ldOworICAgICAgICAgICAgaWYgKGZpbHRlci0+bmJfaW5wdXRzKXsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyLT5uYl9pbnB1dHM7IGorKyl7CisgICAgICAgICAgICAgICAgICAgIGlmKGZpbHRlci0+aW5wdXRzW2pdLT5pbl9mb3JtYXRzICYmIGZpbHRlci0+aW5wdXRzW2pdLT5pbl9mb3JtYXRzLT5uYl9mb3JtYXRzID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gcGlja19mb3JtYXQoZmlsdGVyLT5pbnB1dHNbal0sIE5VTEwpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsdGVyLT5uYl9vdXRwdXRzKXsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyLT5uYl9vdXRwdXRzOyBqKyspeworICAgICAgICAgICAgICAgICAgICBpZihmaWx0ZXItPm91dHB1dHNbal0tPmluX2Zvcm1hdHMgJiYgZmlsdGVyLT5vdXRwdXRzW2pdLT5pbl9mb3JtYXRzLT5uYl9mb3JtYXRzID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gcGlja19mb3JtYXQoZmlsdGVyLT5vdXRwdXRzW2pdLCBOVUxMKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbHRlci0+bmJfaW5wdXRzICYmIGZpbHRlci0+bmJfb3V0cHV0cyAmJiBmaWx0ZXItPmlucHV0c1swXS0+Zm9ybWF0Pj0wKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpbHRlci0+bmJfb3V0cHV0czsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGZpbHRlci0+b3V0cHV0c1tqXS0+Zm9ybWF0PDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gcGlja19mb3JtYXQoZmlsdGVyLT5vdXRwdXRzW2pdLCBmaWx0ZXItPmlucHV0c1swXSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH13aGlsZShjaGFuZ2UpOworCisgICAgZm9yIChpID0gMDsgaSA8IGdyYXBoLT5uYl9maWx0ZXJzOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXIgPSBncmFwaC0+ZmlsdGVyc1tpXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyLT5uYl9pbnB1dHM7IGorKykKKyAgICAgICAgICAgIGlmICgocmV0ID0gcGlja19mb3JtYXQoZmlsdGVyLT5pbnB1dHNbal0sIE5VTEwpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpbHRlci0+bmJfb3V0cHV0czsgaisrKQorICAgICAgICAgICAgaWYgKChyZXQgPSBwaWNrX2Zvcm1hdChmaWx0ZXItPm91dHB1dHNbal0sIE5VTEwpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBmb3JtYXRzIG9mIGFsbCB0aGUgbGlua3MgaW4gdGhlIGdyYXBoLgorICovCitzdGF0aWMgaW50IGdyYXBoX2NvbmZpZ19mb3JtYXRzKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBBVkNsYXNzICpsb2dfY3R4KQoreworICAgIGludCByZXQ7CisKKyAgICAvKiBmaW5kIHN1cHBvcnRlZCBmb3JtYXRzIGZyb20gc3ViLWZpbHRlcnMsIGFuZCBtZXJnZSBhbG9uZyBsaW5rcyAqLworICAgIHdoaWxlICgocmV0ID0gcXVlcnlfZm9ybWF0cyhncmFwaCwgbG9nX2N0eCkpID09IEFWRVJST1IoRUFHQUlOKSkKKyAgICAgICAgYXZfbG9nKGdyYXBoLCBBVl9MT0dfREVCVUcsICJxdWVyeV9mb3JtYXRzIG5vdCBmaW5pc2hlZFxuIik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBPbmNlIGV2ZXJ5dGhpbmcgaXMgbWVyZ2VkLCBpdCdzIHBvc3NpYmxlIHRoYXQgd2UnbGwgc3RpbGwgaGF2ZQorICAgICAqIG11bHRpcGxlIHZhbGlkIG1lZGlhIGZvcm1hdCBjaG9pY2VzLiBXZSB0cnkgdG8gbWluaW1pemUgdGhlIGFtb3VudAorICAgICAqIG9mIGZvcm1hdCBjb252ZXJzaW9uIGluc2lkZSBmaWx0ZXJzICovCisgICAgcmVkdWNlX2Zvcm1hdHMoZ3JhcGgpOworCisgICAgLyogZm9yIGF1ZGlvIGZpbHRlcnMsIGVuc3VyZSB0aGUgYmVzdCBmb3JtYXQsIHNhbXBsZSByYXRlIGFuZCBjaGFubmVsIGxheW91dAorICAgICAqIGlzIHNlbGVjdGVkICovCisgICAgc3dhcF9zYW1wbGVfZm10cyhncmFwaCk7CisgICAgc3dhcF9zYW1wbGVyYXRlcyhncmFwaCk7CisgICAgc3dhcF9jaGFubmVsX2xheW91dHMoZ3JhcGgpOworCisgICAgaWYgKChyZXQgPSBwaWNrX2Zvcm1hdHMoZ3JhcGgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZl9hdmZpbHRlcl9ncmFwaF9jb25maWdfcG9pbnRlcnMoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNsYXNzICpsb2dfY3R4KQoreworICAgIHVuc2lnbmVkIGksIGo7CisgICAgaW50IHNpbmtfbGlua3NfY291bnQgPSAwLCBuID0gMDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmY7CisgICAgQVZGaWx0ZXJMaW5rICoqc2lua3M7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX2ZpbHRlcnM7IGkrKykgeworICAgICAgICBmID0gZ3JhcGgtPmZpbHRlcnNbaV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmLT5uYl9pbnB1dHM7IGorKykgeworICAgICAgICAgICAgZi0+aW5wdXRzW2pdLT5ncmFwaCAgICAgPSBncmFwaDsKKyAgICAgICAgICAgIGYtPmlucHV0c1tqXS0+YWdlX2luZGV4ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGYtPm5iX291dHB1dHM7IGorKykgeworICAgICAgICAgICAgZi0+b3V0cHV0c1tqXS0+Z3JhcGggICAgPSBncmFwaDsKKyAgICAgICAgICAgIGYtPm91dHB1dHNbal0tPmFnZV9pbmRleD0gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmLT5uYl9vdXRwdXRzKSB7CisgICAgICAgICAgICBpZiAoZi0+bmJfaW5wdXRzID4gSU5UX01BWCAtIHNpbmtfbGlua3NfY291bnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIHNpbmtfbGlua3NfY291bnQgKz0gZi0+bmJfaW5wdXRzOworICAgICAgICB9CisgICAgfQorICAgIHNpbmtzID0gYXZfY2FsbG9jKHNpbmtfbGlua3NfY291bnQsIHNpemVvZigqc2lua3MpKTsKKyAgICBpZiAoIXNpbmtzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZvciAoaSA9IDA7IGkgPCBncmFwaC0+bmJfZmlsdGVyczsgaSsrKSB7CisgICAgICAgIGYgPSBncmFwaC0+ZmlsdGVyc1tpXTsKKyAgICAgICAgaWYgKCFmLT5uYl9vdXRwdXRzKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZi0+bmJfaW5wdXRzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzaW5rc1tuXSA9IGYtPmlucHV0c1tqXTsKKyAgICAgICAgICAgICAgICBmLT5pbnB1dHNbal0tPmFnZV9pbmRleCA9IG4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9hc3NlcnQwKG4gPT0gc2lua19saW5rc19jb3VudCk7CisgICAgZ3JhcGgtPnNpbmtfbGlua3MgICAgICAgPSBzaW5rczsKKyAgICBncmFwaC0+c2lua19saW5rc19jb3VudCA9IHNpbmtfbGlua3NfY291bnQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3JhcGhfaW5zZXJ0X2ZpZm9zKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBBVkNsYXNzICpsb2dfY3R4KQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqZjsKKyAgICBpbnQgaSwgaiwgcmV0OworICAgIGludCBmaWZvX2NvdW50ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBncmFwaC0+bmJfZmlsdGVyczsgaSsrKSB7CisgICAgICAgIGYgPSBncmFwaC0+ZmlsdGVyc1tpXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZi0+bmJfaW5wdXRzOyBqKyspIHsKKyAgICAgICAgICAgIEFWRmlsdGVyTGluayAqbGluayA9IGYtPmlucHV0c1tqXTsKKyAgICAgICAgICAgIEFWRmlsdGVyQ29udGV4dCAqZmlmb19jdHg7CisgICAgICAgICAgICBBVkZpbHRlciAqZmlmbzsKKyAgICAgICAgICAgIGNoYXIgbmFtZVszMl07CisKKyAgICAgICAgICAgIGlmICghbGluay0+ZHN0cGFkLT5uZWVkc19maWZvKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBmaWZvID0gZi0+aW5wdXRzW2pdLT50eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyA/CisgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImZpZm8iKSA6CisgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImFmaWZvIik7CisKKyAgICAgICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImF1dG8taW5zZXJ0ZWQgZmlmbyAlZCIsIGZpZm9fY291bnQrKyk7CisKKyAgICAgICAgICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJmZpZm9fY3R4LCBmaWZvLCBuYW1lLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBncmFwaCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICByZXQgPSBhdmZpbHRlcl9pbnNlcnRfZmlsdGVyKGxpbmssIGZpZm9fY3R4LCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2ZmlsdGVyX2dyYXBoX2NvbmZpZyhBVkZpbHRlckdyYXBoICpncmFwaGN0eCwgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBncmFwaF9jaGVja192YWxpZGl0eShncmFwaGN0eCwgbG9nX2N0eCkpKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICgocmV0ID0gZ3JhcGhfaW5zZXJ0X2ZpZm9zKGdyYXBoY3R4LCBsb2dfY3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICgocmV0ID0gZ3JhcGhfY29uZmlnX2Zvcm1hdHMoZ3JhcGhjdHgsIGxvZ19jdHgpKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoKHJldCA9IGdyYXBoX2NvbmZpZ19saW5rcyhncmFwaGN0eCwgbG9nX2N0eCkpKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICgocmV0ID0gZmZfYXZmaWx0ZXJfZ3JhcGhfY29uZmlnX3BvaW50ZXJzKGdyYXBoY3R4LCBsb2dfY3R4KSkpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2ZmlsdGVyX2dyYXBoX3NlbmRfY29tbWFuZChBVkZpbHRlckdyYXBoICpncmFwaCwgY29uc3QgY2hhciAqdGFyZ2V0LCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZywgY2hhciAqcmVzLCBpbnQgcmVzX2xlbiwgaW50IGZsYWdzKQoreworICAgIGludCBpLCByID0gQVZFUlJPUihFTk9TWVMpOworCisgICAgaWYgKCFncmFwaCkKKyAgICAgICAgcmV0dXJuIHI7CisKKyAgICBpZiAoKGZsYWdzICYgQVZGSUxURVJfQ01EX0ZMQUdfT05FKSAmJiAhKGZsYWdzICYgQVZGSUxURVJfQ01EX0ZMQUdfRkFTVCkpIHsKKyAgICAgICAgciA9IGF2ZmlsdGVyX2dyYXBoX3NlbmRfY29tbWFuZChncmFwaCwgdGFyZ2V0LCBjbWQsIGFyZywgcmVzLCByZXNfbGVuLCBmbGFncyB8IEFWRklMVEVSX0NNRF9GTEFHX0ZBU1QpOworICAgICAgICBpZiAociAhPSBBVkVSUk9SKEVOT1NZUykpCisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBpZiAocmVzX2xlbiAmJiByZXMpCisgICAgICAgIHJlc1swXSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX2ZpbHRlcnM7IGkrKykgeworICAgICAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRlciA9IGdyYXBoLT5maWx0ZXJzW2ldOworICAgICAgICBpZiAoIXN0cmNtcCh0YXJnZXQsICJhbGwiKSB8fCAoZmlsdGVyLT5uYW1lICYmICFzdHJjbXAodGFyZ2V0LCBmaWx0ZXItPm5hbWUpKSB8fCAhc3RyY21wKHRhcmdldCwgZmlsdGVyLT5maWx0ZXItPm5hbWUpKSB7CisgICAgICAgICAgICByID0gYXZmaWx0ZXJfcHJvY2Vzc19jb21tYW5kKGZpbHRlciwgY21kLCBhcmcsIHJlcywgcmVzX2xlbiwgZmxhZ3MpOworICAgICAgICAgICAgaWYgKHIgIT0gQVZFUlJPUihFTk9TWVMpKSB7CisgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIEFWRklMVEVSX0NNRF9GTEFHX09ORSkgfHwgciA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHI7Cit9CisKK2ludCBhdmZpbHRlcl9ncmFwaF9xdWV1ZV9jb21tYW5kKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBjb25zdCBjaGFyICp0YXJnZXQsIGNvbnN0IGNoYXIgKmNvbW1hbmQsIGNvbnN0IGNoYXIgKmFyZywgaW50IGZsYWdzLCBkb3VibGUgdHMpCit7CisgICAgaW50IGk7CisKKyAgICBpZighZ3JhcGgpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGdyYXBoLT5uYl9maWx0ZXJzOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXIgPSBncmFwaC0+ZmlsdGVyc1tpXTsKKyAgICAgICAgaWYoZmlsdGVyICYmICghc3RyY21wKHRhcmdldCwgImFsbCIpIHx8ICFzdHJjbXAodGFyZ2V0LCBmaWx0ZXItPm5hbWUpIHx8ICFzdHJjbXAodGFyZ2V0LCBmaWx0ZXItPmZpbHRlci0+bmFtZSkpKXsKKyAgICAgICAgICAgIEFWRmlsdGVyQ29tbWFuZCAqKnF1ZXVlID0gJmZpbHRlci0+Y29tbWFuZF9xdWV1ZSwgKm5leHQ7CisgICAgICAgICAgICB3aGlsZSAoKnF1ZXVlICYmICgqcXVldWUpLT50aW1lIDw9IHRzKQorICAgICAgICAgICAgICAgIHF1ZXVlID0gJigqcXVldWUpLT5uZXh0OworICAgICAgICAgICAgbmV4dCA9ICpxdWV1ZTsKKyAgICAgICAgICAgICpxdWV1ZSA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWRmlsdGVyQ29tbWFuZCkpOworICAgICAgICAgICAgKCpxdWV1ZSktPmNvbW1hbmQgPSBhdl9zdHJkdXAoY29tbWFuZCk7CisgICAgICAgICAgICAoKnF1ZXVlKS0+YXJnICAgICA9IGF2X3N0cmR1cChhcmcpOworICAgICAgICAgICAgKCpxdWV1ZSktPnRpbWUgICAgPSB0czsKKyAgICAgICAgICAgICgqcXVldWUpLT5mbGFncyAgID0gZmxhZ3M7CisgICAgICAgICAgICAoKnF1ZXVlKS0+bmV4dCAgICA9IG5leHQ7CisgICAgICAgICAgICBpZihmbGFncyAmIEFWRklMVEVSX0NNRF9GTEFHX09ORSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoZWFwX2J1YmJsZV91cChBVkZpbHRlckdyYXBoICpncmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyTGluayAqbGluaywgaW50IGluZGV4KQoreworICAgIEFWRmlsdGVyTGluayAqKmxpbmtzID0gZ3JhcGgtPnNpbmtfbGlua3M7CisKKyAgICB3aGlsZSAoaW5kZXgpIHsKKyAgICAgICAgaW50IHBhcmVudCA9IChpbmRleCAtIDEpID4+IDE7CisgICAgICAgIGlmIChsaW5rc1twYXJlbnRdLT5jdXJyZW50X3B0cyA+PSBsaW5rLT5jdXJyZW50X3B0cykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBsaW5rc1tpbmRleF0gPSBsaW5rc1twYXJlbnRdOworICAgICAgICBsaW5rc1tpbmRleF0tPmFnZV9pbmRleCA9IGluZGV4OworICAgICAgICBpbmRleCA9IHBhcmVudDsKKyAgICB9CisgICAgbGlua3NbaW5kZXhdID0gbGluazsKKyAgICBsaW5rLT5hZ2VfaW5kZXggPSBpbmRleDsKK30KKworc3RhdGljIHZvaWQgaGVhcF9idWJibGVfZG93bihBVkZpbHRlckdyYXBoICpncmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJMaW5rICpsaW5rLCBpbnQgaW5kZXgpCit7CisgICAgQVZGaWx0ZXJMaW5rICoqbGlua3MgPSBncmFwaC0+c2lua19saW5rczsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCBjaGlsZCA9IDIgKiBpbmRleCArIDE7CisgICAgICAgIGlmIChjaGlsZCA+PSBncmFwaC0+c2lua19saW5rc19jb3VudCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoY2hpbGQgKyAxIDwgZ3JhcGgtPnNpbmtfbGlua3NfY291bnQgJiYKKyAgICAgICAgICAgIGxpbmtzW2NoaWxkICsgMV0tPmN1cnJlbnRfcHRzIDwgbGlua3NbY2hpbGRdLT5jdXJyZW50X3B0cykKKyAgICAgICAgICAgIGNoaWxkKys7CisgICAgICAgIGlmIChsaW5rLT5jdXJyZW50X3B0cyA8IGxpbmtzW2NoaWxkXS0+Y3VycmVudF9wdHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGlua3NbaW5kZXhdID0gbGlua3NbY2hpbGRdOworICAgICAgICBsaW5rc1tpbmRleF0tPmFnZV9pbmRleCA9IGluZGV4OworICAgICAgICBpbmRleCA9IGNoaWxkOworICAgIH0KKyAgICBsaW5rc1tpbmRleF0gPSBsaW5rOworICAgIGxpbmstPmFnZV9pbmRleCA9IGluZGV4OworfQorCit2b2lkIGZmX2F2ZmlsdGVyX2dyYXBoX3VwZGF0ZV9oZWFwKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBBVkZpbHRlckxpbmsgKmxpbmspCit7CisgICAgaGVhcF9idWJibGVfdXAgIChncmFwaCwgbGluaywgbGluay0+YWdlX2luZGV4KTsKKyAgICBoZWFwX2J1YmJsZV9kb3duKGdyYXBoLCBsaW5rLCBsaW5rLT5hZ2VfaW5kZXgpOworfQorCisKK2ludCBhdmZpbHRlcl9ncmFwaF9yZXF1ZXN0X29sZGVzdChBVkZpbHRlckdyYXBoICpncmFwaCkKK3sKKyAgICB3aGlsZSAoZ3JhcGgtPnNpbmtfbGlua3NfY291bnQpIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICpvbGRlc3QgPSBncmFwaC0+c2lua19saW5rc1swXTsKKyAgICAgICAgaW50IHIgPSBmZl9yZXF1ZXN0X2ZyYW1lKG9sZGVzdCk7CisgICAgICAgIGlmIChyICE9IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIGF2X2xvZyhvbGRlc3QtPmRzdCwgQVZfTE9HX0RFQlVHLCAiRU9GIG9uIHNpbmsgbGluayAlczolcy5cbiIsCisgICAgICAgICAgICAgICBvbGRlc3QtPmRzdCA/IG9sZGVzdC0+ZHN0LT5uYW1lIDogInVua25vd24iLAorICAgICAgICAgICAgICAgb2xkZXN0LT5kc3RwYWQgPyBvbGRlc3QtPmRzdHBhZC0+bmFtZSA6ICJ1bmtub3duIik7CisgICAgICAgIC8qIEVPRjogcmVtb3ZlIHRoZSBsaW5rIGZyb20gdGhlIGhlYXAgKi8KKyAgICAgICAgaWYgKG9sZGVzdC0+YWdlX2luZGV4IDwgLS1ncmFwaC0+c2lua19saW5rc19jb3VudCkKKyAgICAgICAgICAgIGhlYXBfYnViYmxlX2Rvd24oZ3JhcGgsIGdyYXBoLT5zaW5rX2xpbmtzW2dyYXBoLT5zaW5rX2xpbmtzX2NvdW50XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkZXN0LT5hZ2VfaW5kZXgpOworICAgICAgICBvbGRlc3QtPmFnZV9pbmRleCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYXZmaWx0ZXJncmFwaC5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2F2ZmlsdGVyZ3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFkNTgxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2F2ZmlsdGVyZ3JhcGguaApAQCAtMCwwICsxLDI4IEBACisvKgorICogRmlsdGVyIGdyYXBocworICogY29weXJpZ2h0IChjKSAyMDA3IEJvYmJ5IEJpbmdoYW0KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9BVkZJTFRFUkdSQVBIX0gKKyNkZWZpbmUgQVZGSUxURVJfQVZGSUxURVJHUkFQSF9ICisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKworI2VuZGlmIC8qIEFWRklMVEVSX0FWRklMVEVSR1JBUEhfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2F2ZmlsdGVycmVzLnJjIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2F2ZmlsdGVycmVzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTYyNDcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYXZmaWx0ZXJyZXMucmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIFdpbmRvd3MgcmVzb3VyY2UgZmlsZSBmb3IgbGliYXZmaWx0ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSmFtZXMgQWxtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaWFuY2hlbmcgIlRpbW90aHkiIEd1CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAibGliYXZmaWx0ZXIvdmVyc2lvbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworMSBWRVJTSU9OSU5GTworRklMRVZFUlNJT04gICAgIExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IsIExJQkFWRklMVEVSX1ZFUlNJT05fTUlOT1IsIExJQkFWRklMVEVSX1ZFUlNJT05fTUlDUk8sIDAKK1BST0RVQ1RWRVJTSU9OICBMSUJBVkZJTFRFUl9WRVJTSU9OX01BSk9SLCBMSUJBVkZJTFRFUl9WRVJTSU9OX01JTk9SLCBMSUJBVkZJTFRFUl9WRVJTSU9OX01JQ1JPLCAwCitGSUxFRkxBR1NNQVNLICAgVlNfRkZJX0ZJTEVGTEFHU01BU0sKK0ZJTEVPUyAgICAgICAgICBWT1NfTlRfV0lORE9XUzMyCitGSUxFVFlQRSAgICAgICAgVkZUX0RMTAoreworICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICB7CisgICAgICAgIEJMT0NLICIwNDA5MDRCMCIKKyAgICAgICAgeworICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgICAgICAiRkZtcGVnIFByb2plY3QiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgICJGRm1wZWcgYXVkaW8vdmlkZW8gZmlsdGVyaW5nIGxpYnJhcnkiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAgICAgIEFWX1NUUklOR0lGWShMSUJBVkZJTFRFUl9WRVJTSU9OKQorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICAgICAibGliYXZmaWx0ZXIiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAgICJDb3B5cmlnaHQgKEMpIDIwMDAtIiBBVl9TVFJJTkdJRlkoQ09ORklHX1RISVNfWUVBUikgIiBGRm1wZWcgUHJvamVjdCIKKyAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgImF2ZmlsdGVyIiBCVUlMRFNVRiAiLSIgQVZfU1RSSU5HSUZZKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IpIFNMSUJTVUYKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICAgICAgIkZGbXBlZyIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICAgRkZNUEVHX1ZFUlNJT04KKyAgICAgICAgfQorICAgIH0KKworICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgICB7CisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4MDQwOSwgMHgwNEIwCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2Jib3guYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9iYm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5YjJlNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9iYm94LmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBSb2JlcnQgRWRlbGUgPHlhcnRyZWJvQGVhcnRobGluay5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJiYm94LmgiCisKK2ludCBmZl9jYWxjdWxhdGVfYm91bmRpbmdfYm94KEZGQm91bmRpbmdCb3ggKmJib3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgbGluZXNpemUsIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5fdmFsKQoreworICAgIGludCB4LCB5OworICAgIGludCBzdGFydF94OworICAgIGludCBzdGFydF95OworICAgIGludCBlbmRfeDsKKyAgICBpbnQgZW5kX3k7CisgICAgY29uc3QgdWludDhfdCAqbGluZTsKKworICAgIC8qIGxlZnQgYm91bmQgKi8KKyAgICBmb3IgKHN0YXJ0X3ggPSAwOyBzdGFydF94IDwgdzsgc3RhcnRfeCsrKQorICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKQorICAgICAgICAgICAgaWYgKChkYXRhW3kgKiBsaW5lc2l6ZSArIHN0YXJ0X3hdID4gbWluX3ZhbCkpCisgICAgICAgICAgICAgICAgZ290byBvdXRsOworb3V0bDoKKyAgICBpZiAoc3RhcnRfeCA9PSB3KSAvKiBubyBwb2ludHMgZm91bmQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiByaWdodCBib3VuZCAqLworICAgIGZvciAoZW5kX3ggPSB3IC0gMTsgZW5kX3ggPj0gc3RhcnRfeDsgZW5kX3gtLSkKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykKKyAgICAgICAgICAgIGlmICgoZGF0YVt5ICogbGluZXNpemUgKyBlbmRfeF0gPiBtaW5fdmFsKSkKKyAgICAgICAgICAgICAgICBnb3RvIG91dHI7CitvdXRyOgorCisgICAgLyogdG9wIGJvdW5kICovCisgICAgbGluZSA9IGRhdGE7CisgICAgZm9yIChzdGFydF95ID0gMDsgc3RhcnRfeSA8IGg7IHN0YXJ0X3krKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgaWYgKGxpbmVbeF0gPiBtaW5fdmFsKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0dDsKKyAgICAgICAgbGluZSArPSBsaW5lc2l6ZTsKKyAgICB9CitvdXR0OgorCisgICAgLyogYm90dG9tIGJvdW5kICovCisgICAgbGluZSA9IGRhdGEgKyAoaC0xKSpsaW5lc2l6ZTsKKyAgICBmb3IgKGVuZF95ID0gaCAtIDE7IGVuZF95ID49IHN0YXJ0X3k7IGVuZF95LS0pIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKyAgICAgICAgICAgIGlmIChsaW5lW3hdID4gbWluX3ZhbCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dGI7CisgICAgICAgIGxpbmUgLT0gbGluZXNpemU7CisgICAgfQorb3V0YjoKKworICAgIGJib3gtPngxID0gc3RhcnRfeDsKKyAgICBiYm94LT55MSA9IHN0YXJ0X3k7CisgICAgYmJveC0+eDIgPSBlbmRfeDsKKyAgICBiYm94LT55MiA9IGVuZF95OworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2Jib3guaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9iYm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3MzE1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9iYm94LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBSb2JlcnQgRWRlbGUgPHlhcnRyZWJvQGVhcnRobGluay5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfQkJPWF9ICisjZGVmaW5lIEFWRklMVEVSX0JCT1hfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgeDEsIHgyLCB5MSwgeTI7Cit9IEZGQm91bmRpbmdCb3g7CisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhhdCB3aWxsIGVuY29tcGFzcyB0aGUKKyAqIHJlZ2lvbiB3aXRoIHZhbHVlcyA+IG1pbl92YWwuCisgKgorICogQHBhcmFtIGJib3ggYm91bmRpbmcgYm94IHN0cnVjdHVyZSB3aGljaCBpcyB1cGRhdGVkIHdpdGggdGhlIGZvdW5kIHZhbHVlcy4KKyAqICAgICAgICAgICAgIElmIG5vIHBpeGVscyBjb3VsZCBiZSBmb3VuZCB3aXRoIHZhbHVlID4gbWluX3ZhbCwgdGhlCisgKiAgICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgbm90IG1vZGlmaWVkLgorICogQHJldHVybiAxIGluIGNhc2UgYXQgbGVhc3Qgb25lIHBpeGVsIHdpdGggdmFsdWUgPiBtaW5fdmFsIHdhcyBmb3VuZCwKKyAqICAgICAgICAgMCBvdGhlcndpc2UKKyAqLworaW50IGZmX2NhbGN1bGF0ZV9ib3VuZGluZ19ib3goRkZCb3VuZGluZ0JveCAqYmJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG1pbl92YWwpOworCisjZW5kaWYgLyogQVZGSUxURVJfQkJPWF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYnVmZmVyLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyNzk1MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9idWZmZXIuYwpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCBTdGVmYW5vIFNhYmF0aW5pIDxzdGVmYXNhYiBnbWFpbCBjb20+CisgKiBDb3B5cmlnaHQgQW50b24gS2hpcm5vdiA8YW50b24ga2hpcm5vdiBuZXQ+CisgKiBDb3B5cmlnaHQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pIGdteCBhdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNpZiBGRl9BUElfQVZGSUxURVJCVUZGRVIKK3ZvaWQgZmZfYXZmaWx0ZXJfZGVmYXVsdF9mcmVlX2J1ZmZlcihBVkZpbHRlckJ1ZmZlciAqcHRyKQoreworICAgIGlmIChwdHItPmV4dGVuZGVkX2RhdGEgIT0gcHRyLT5kYXRhKQorICAgICAgICBhdl9mcmVlcCgmcHRyLT5leHRlbmRlZF9kYXRhKTsKKyAgICBhdl9mcmVlKHB0ci0+ZGF0YVswXSk7CisgICAgYXZfZnJlZShwdHIpOworfQorCitzdGF0aWMgdm9pZCBjb3B5X3ZpZGVvX3Byb3BzKEFWRmlsdGVyQnVmZmVyUmVmVmlkZW9Qcm9wcyAqZHN0LCBBVkZpbHRlckJ1ZmZlclJlZlZpZGVvUHJvcHMgKnNyYykgeworICAgICpkc3QgPSAqc3JjOworICAgIGlmIChzcmMtPnFwX3RhYmxlKSB7CisgICAgICAgIGludCBxc2l6ZSA9IHNyYy0+cXBfdGFibGVfc2l6ZTsKKyAgICAgICAgZHN0LT5xcF90YWJsZSA9IGF2X21hbGxvYyhxc2l6ZSk7CisgICAgICAgIG1lbWNweShkc3QtPnFwX3RhYmxlLCBzcmMtPnFwX3RhYmxlLCBxc2l6ZSk7CisgICAgfQorfQorCitBVkZpbHRlckJ1ZmZlclJlZiAqYXZmaWx0ZXJfcmVmX2J1ZmZlcihBVkZpbHRlckJ1ZmZlclJlZiAqcmVmLCBpbnQgcG1hc2spCit7CisgICAgQVZGaWx0ZXJCdWZmZXJSZWYgKnJldCA9IGF2X21hbGxvYyhzaXplb2YoQVZGaWx0ZXJCdWZmZXJSZWYpKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgKnJldCA9ICpyZWY7CisKKyAgICByZXQtPm1ldGFkYXRhID0gTlVMTDsKKyAgICBhdl9kaWN0X2NvcHkoJnJldC0+bWV0YWRhdGEsIHJlZi0+bWV0YWRhdGEsIDApOworCisgICAgaWYgKHJlZi0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgcmV0LT52aWRlbyA9IGF2X21hbGxvYyhzaXplb2YoQVZGaWx0ZXJCdWZmZXJSZWZWaWRlb1Byb3BzKSk7CisgICAgICAgIGlmICghcmV0LT52aWRlbykgeworICAgICAgICAgICAgYXZfZnJlZShyZXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgY29weV92aWRlb19wcm9wcyhyZXQtPnZpZGVvLCByZWYtPnZpZGVvKTsKKyAgICAgICAgcmV0LT5leHRlbmRlZF9kYXRhID0gcmV0LT5kYXRhOworICAgIH0gZWxzZSBpZiAocmVmLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICByZXQtPmF1ZGlvID0gYXZfbWFsbG9jKHNpemVvZihBVkZpbHRlckJ1ZmZlclJlZkF1ZGlvUHJvcHMpKTsKKyAgICAgICAgaWYgKCFyZXQtPmF1ZGlvKSB7CisgICAgICAgICAgICBhdl9mcmVlKHJldCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAqcmV0LT5hdWRpbyA9ICpyZWYtPmF1ZGlvOworCisgICAgICAgIGlmIChyZWYtPmV4dGVuZGVkX2RhdGEgJiYgcmVmLT5leHRlbmRlZF9kYXRhICE9IHJlZi0+ZGF0YSkgeworICAgICAgICAgICAgaW50IG5iX2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHJlZi0+YXVkaW8tPmNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgICAgIGlmICghKHJldC0+ZXh0ZW5kZWRfZGF0YSA9IGF2X21hbGxvY19hcnJheShzaXplb2YoKnJldC0+ZXh0ZW5kZWRfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfY2hhbm5lbHMpKSkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZyZXQtPmF1ZGlvKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShyZXQtPmV4dGVuZGVkX2RhdGEsIHJlZi0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoKnJldC0+ZXh0ZW5kZWRfZGF0YSkgKiBuYl9jaGFubmVscyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0LT5leHRlbmRlZF9kYXRhID0gcmV0LT5kYXRhOworICAgIH0KKyAgICByZXQtPnBlcm1zICY9IHBtYXNrOworICAgIHJldC0+YnVmLT5yZWZjb3VudCArKzsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGF2ZmlsdGVyX3VucmVmX2J1ZmZlcihBVkZpbHRlckJ1ZmZlclJlZiAqcmVmKQoreworICAgIGlmICghcmVmKQorICAgICAgICByZXR1cm47CisgICAgYXZfYXNzZXJ0MChyZWYtPmJ1Zi0+cmVmY291bnQgPiAwKTsKKyAgICBpZiAoISgtLXJlZi0+YnVmLT5yZWZjb3VudCkpCisgICAgICAgIHJlZi0+YnVmLT5mcmVlKHJlZi0+YnVmKTsKKyAgICBpZiAocmVmLT5leHRlbmRlZF9kYXRhICE9IHJlZi0+ZGF0YSkKKyAgICAgICAgYXZfZnJlZXAoJnJlZi0+ZXh0ZW5kZWRfZGF0YSk7CisgICAgaWYgKHJlZi0+dmlkZW8pCisgICAgICAgIGF2X2ZyZWVwKCZyZWYtPnZpZGVvLT5xcF90YWJsZSk7CisgICAgYXZfZnJlZXAoJnJlZi0+dmlkZW8pOworICAgIGF2X2ZyZWVwKCZyZWYtPmF1ZGlvKTsKKyAgICBhdl9kaWN0X2ZyZWUoJnJlZi0+bWV0YWRhdGEpOworICAgIGF2X2ZyZWUocmVmKTsKK30KKwordm9pZCBhdmZpbHRlcl91bnJlZl9idWZmZXJwKEFWRmlsdGVyQnVmZmVyUmVmICoqcmVmKQoreworRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGF2ZmlsdGVyX3VucmVmX2J1ZmZlcigqcmVmKTsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICpyZWYgPSBOVUxMOworfQorCitpbnQgYXZmaWx0ZXJfY29weV9mcmFtZV9wcm9wcyhBVkZpbHRlckJ1ZmZlclJlZiAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgZHN0LT5wdHMgICAgPSBzcmMtPnB0czsKKyAgICBkc3QtPnBvcyAgICA9IGF2X2ZyYW1lX2dldF9wa3RfcG9zKHNyYyk7CisgICAgZHN0LT5mb3JtYXQgPSBzcmMtPmZvcm1hdDsKKworICAgIGF2X2RpY3RfZnJlZSgmZHN0LT5tZXRhZGF0YSk7CisgICAgYXZfZGljdF9jb3B5KCZkc3QtPm1ldGFkYXRhLCBhdl9mcmFtZV9nZXRfbWV0YWRhdGEoc3JjKSwgMCk7CisKKyAgICBzd2l0Y2ggKGRzdC0+dHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBkc3QtPnZpZGVvLT53ICAgICAgICAgICAgICAgICAgID0gc3JjLT53aWR0aDsKKyAgICAgICAgZHN0LT52aWRlby0+aCAgICAgICAgICAgICAgICAgICA9IHNyYy0+aGVpZ2h0OworICAgICAgICBkc3QtPnZpZGVvLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gc3JjLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgICAgICBkc3QtPnZpZGVvLT5pbnRlcmxhY2VkICAgICAgICAgID0gc3JjLT5pbnRlcmxhY2VkX2ZyYW1lOworICAgICAgICBkc3QtPnZpZGVvLT50b3BfZmllbGRfZmlyc3QgICAgID0gc3JjLT50b3BfZmllbGRfZmlyc3Q7CisgICAgICAgIGRzdC0+dmlkZW8tPmtleV9mcmFtZSAgICAgICAgICAgPSBzcmMtPmtleV9mcmFtZTsKKyAgICAgICAgZHN0LT52aWRlby0+cGljdF90eXBlICAgICAgICAgICA9IHNyYy0+cGljdF90eXBlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgZHN0LT5hdWRpby0+c2FtcGxlX3JhdGUgICAgICAgICA9IHNyYy0+c2FtcGxlX3JhdGU7CisgICAgICAgIGRzdC0+YXVkaW8tPmNoYW5uZWxfbGF5b3V0ICAgICAgPSBzcmMtPmNoYW5uZWxfbGF5b3V0OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGF2ZmlsdGVyX2NvcHlfYnVmZmVyX3JlZl9wcm9wcyhBVkZpbHRlckJ1ZmZlclJlZiAqZHN0LCBjb25zdCBBVkZpbHRlckJ1ZmZlclJlZiAqc3JjKQoreworICAgIC8vIGNvcHkgY29tbW9uIHByb3BlcnRpZXMKKyAgICBkc3QtPnB0cyAgICAgICAgICAgICA9IHNyYy0+cHRzOworICAgIGRzdC0+cG9zICAgICAgICAgICAgID0gc3JjLT5wb3M7CisKKyAgICBzd2l0Y2ggKHNyYy0+dHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOiB7CisgICAgICAgIGlmIChkc3QtPnZpZGVvLT5xcF90YWJsZSkKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZkc3QtPnZpZGVvLT5xcF90YWJsZSk7CisgICAgICAgIGNvcHlfdmlkZW9fcHJvcHMoZHN0LT52aWRlbywgc3JjLT52aWRlbyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzogKmRzdC0+YXVkaW8gPSAqc3JjLT5hdWRpbzsgYnJlYWs7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorCisgICAgYXZfZGljdF9mcmVlKCZkc3QtPm1ldGFkYXRhKTsKKyAgICBhdl9kaWN0X2NvcHkoJmRzdC0+bWV0YWRhdGEsIHNyYy0+bWV0YWRhdGEsIDApOworfQorI2VuZGlmIC8qIEZGX0FQSV9BVkZJTFRFUkJVRkZFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2J1ZmZlcnF1ZXVlLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvYnVmZmVycXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWU1ZGYyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2J1ZmZlcnF1ZXVlLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBHZW5lcmljIGJ1ZmZlciBxdWV1ZQorICogQ29weXJpZ2h0IChjKSAyMDEyIE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfQlVGRkVSUVVFVUVfSAorI2RlZmluZSBBVkZJTFRFUl9CVUZGRVJRVUVVRV9ICisKKy8qKgorICogRkZCdWZRdWV1ZTogc2ltcGxlIEFWRnJhbWUgcXVldWUgQVBJCisgKgorICogTm90ZTogdGhpcyBBUEkgaXMgbm90IHRocmVhZC1zYWZlLiBDb25jdXJyZW50IGFjY2VzcyB0byB0aGUgc2FtZSBxdWV1ZQorICogbXVzdCBiZSBwcm90ZWN0ZWQgYnkgYSBtdXRleCBvciBhbnkgc3luY2hyb25pemF0aW9uIG1lY2hhbmlzbS4KKyAqLworCisvKioKKyAqIE1heGltdW0gc2l6ZSBvZiB0aGUgcXVldWUuCisgKgorICogVGhpcyB2YWx1ZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbnlpbmcgaXQgYmVmb3JlIGluY2x1ZGluZyB0aGlzCisgKiBoZWFkZXIuCisgKiBQb3dlcnMgb2YgMiBhcmUgcmVjb21tZW5kZWQuCisgKi8KKyNpZm5kZWYgRkZfQlVGUVVFVUVfU0laRQorI2RlZmluZSBGRl9CVUZRVUVVRV9TSVpFIDY0CisjZW5kaWYKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKKy8qKgorICogU3RydWN0dXJlIGhvbGRpbmcgdGhlIHF1ZXVlCisgKi8KK3N0cnVjdCBGRkJ1ZlF1ZXVlIHsKKyAgICBBVkZyYW1lICpxdWV1ZVtGRl9CVUZRVUVVRV9TSVpFXTsKKyAgICB1bnNpZ25lZCBzaG9ydCBoZWFkOworICAgIHVuc2lnbmVkIHNob3J0IGF2YWlsYWJsZTsgLyoqPCBudW1iZXIgb2YgYXZhaWxhYmxlIGJ1ZmZlcnMgKi8KK307CisKKyNkZWZpbmUgQlVDS0VUKGkpIHF1ZXVlLT5xdWV1ZVsocXVldWUtPmhlYWQgKyAoaSkpICUgRkZfQlVGUVVFVUVfU0laRV0KKworLyoqCisgKiBUZXN0IGlmIGEgYnVmZmVyIHF1ZXVlIGlzIGZ1bGwuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZmX2J1ZnF1ZXVlX2lzX2Z1bGwoc3RydWN0IEZGQnVmUXVldWUgKnF1ZXVlKQoreworICAgIHJldHVybiBxdWV1ZS0+YXZhaWxhYmxlID09IEZGX0JVRlFVRVVFX1NJWkU7Cit9CisKKy8qKgorICogQWRkIGEgYnVmZmVyIHRvIHRoZSBxdWV1ZS4KKyAqCisgKiBJZiB0aGUgcXVldWUgaXMgYWxyZWFkeSBmdWxsLCB0aGVuIHRoZSBjdXJyZW50IGxhc3QgYnVmZmVyIGlzIGRyb3BwZWQKKyAqIChhbmQgdW5yZWZlZCkgd2l0aCBhIHdhcm5pbmcgYmVmb3JlIGFkZGluZyB0aGUgbmV3IGJ1ZmZlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZmX2J1ZnF1ZXVlX2FkZCh2b2lkICpsb2csIHN0cnVjdCBGRkJ1ZlF1ZXVlICpxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqYnVmKQoreworICAgIGlmIChmZl9idWZxdWV1ZV9pc19mdWxsKHF1ZXVlKSkgeworICAgICAgICBhdl9sb2cobG9nLCBBVl9MT0dfV0FSTklORywgIkJ1ZmZlciBxdWV1ZSBvdmVyZmxvdywgZHJvcHBpbmcuXG4iKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmQlVDS0VUKC0tcXVldWUtPmF2YWlsYWJsZSkpOworICAgIH0KKyAgICBCVUNLRVQocXVldWUtPmF2YWlsYWJsZSsrKSA9IGJ1ZjsKK30KKworLyoqCisgKiBHZXQgYSBidWZmZXIgZnJvbSB0aGUgcXVldWUgd2l0aG91dCBhbHRlcmluZyBpdC4KKyAqCisgKiBCdWZmZXIgd2l0aCBpbmRleCAwIGlzIHRoZSBmaXJzdCBidWZmZXIgaW4gdGhlIHF1ZXVlLgorICogUmV0dXJuIE5VTEwgaWYgdGhlIHF1ZXVlIGhhcyBub3QgZW5vdWdoIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgQVZGcmFtZSAqZmZfYnVmcXVldWVfcGVlayhzdHJ1Y3QgRkZCdWZRdWV1ZSAqcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgpCit7CisgICAgcmV0dXJuIGluZGV4IDwgcXVldWUtPmF2YWlsYWJsZSA/IEJVQ0tFVChpbmRleCkgOiBOVUxMOworfQorCisvKioKKyAqIEdldCB0aGUgZmlyc3QgYnVmZmVyIGZyb20gdGhlIHF1ZXVlIGFuZCByZW1vdmUgaXQuCisgKgorICogRG8gbm90IHVzZSBvbiBhbiBlbXB0eSBxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSBBVkZyYW1lICpmZl9idWZxdWV1ZV9nZXQoc3RydWN0IEZGQnVmUXVldWUgKnF1ZXVlKQoreworICAgIEFWRnJhbWUgKnJldCA9IHF1ZXVlLT5xdWV1ZVtxdWV1ZS0+aGVhZF07CisgICAgYXZfYXNzZXJ0MChxdWV1ZS0+YXZhaWxhYmxlKTsKKyAgICBxdWV1ZS0+YXZhaWxhYmxlLS07CisgICAgcXVldWUtPnF1ZXVlW3F1ZXVlLT5oZWFkXSA9IE5VTEw7CisgICAgcXVldWUtPmhlYWQgPSAocXVldWUtPmhlYWQgKyAxKSAlIEZGX0JVRlFVRVVFX1NJWkU7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBVbnJlZiBhbmQgcmVtb3ZlIGFsbCBidWZmZXJzIGZyb20gdGhlIHF1ZXVlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmZfYnVmcXVldWVfZGlzY2FyZF9hbGwoc3RydWN0IEZGQnVmUXVldWUgKnF1ZXVlKQoreworICAgIHdoaWxlIChxdWV1ZS0+YXZhaWxhYmxlKSB7CisgICAgICAgIEFWRnJhbWUgKmJ1ZiA9IGZmX2J1ZnF1ZXVlX2dldChxdWV1ZSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7CisgICAgfQorfQorCisjdW5kZWYgQlVDS0VUCisKKyNlbmRpZiAvKiBBVkZJTFRFUl9CVUZGRVJRVUVVRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvYnVmZmVyc2luay5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2J1ZmZlcnNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjVmOTdiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2J1ZmZlcnNpbmsuYwpAQCAtMCwwICsxLDYwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGJ1ZmZlciBzaW5rCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdWRpb19maWZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJidWZmZXJzaW5rLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQnVmZmVyU2lua0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEFWRmlmb0J1ZmZlciAqZmlmbzsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBGSUZPIGJ1ZmZlciBvZiB2aWRlbyBmcmFtZSByZWZlcmVuY2VzCisgICAgdW5zaWduZWQgd2FybmluZ19saW1pdDsKKworICAgIC8qIG9ubHkgdXNlZCBmb3IgdmlkZW8gKi8KKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKnBpeGVsX2ZtdHM7ICAgICAgICAgICAvLy88IGxpc3Qgb2YgYWNjZXB0ZWQgcGl4ZWwgZm9ybWF0cywgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggLTEKKyAgICBpbnQgcGl4ZWxfZm10c19zaXplOworCisgICAgLyogb25seSB1c2VkIGZvciBhdWRpbyAqLworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgKnNhbXBsZV9mbXRzOyAgICAgICAvLy88IGxpc3Qgb2YgYWNjZXB0ZWQgc2FtcGxlIGZvcm1hdHMsIHRlcm1pbmF0ZWQgYnkgQVZfU0FNUExFX0ZNVF9OT05FCisgICAgaW50IHNhbXBsZV9mbXRzX3NpemU7CisgICAgaW50NjRfdCAqY2hhbm5lbF9sYXlvdXRzOyAgICAgICAgICAgICAgIC8vLzwgbGlzdCBvZiBhY2NlcHRlZCBjaGFubmVsIGxheW91dHMsIHRlcm1pbmF0ZWQgYnkgLTEKKyAgICBpbnQgY2hhbm5lbF9sYXlvdXRzX3NpemU7CisgICAgaW50ICpjaGFubmVsX2NvdW50czsgICAgICAgICAgICAgICAgICAgIC8vLzwgbGlzdCBvZiBhY2NlcHRlZCBjaGFubmVsIGNvdW50cywgdGVybWluYXRlZCBieSAtMQorICAgIGludCBjaGFubmVsX2NvdW50c19zaXplOworICAgIGludCBhbGxfY2hhbm5lbF9jb3VudHM7CisgICAgaW50ICpzYW1wbGVfcmF0ZXM7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbGlzdCBvZiBhY2NlcHRlZCBzYW1wbGUgcmF0ZXMsIHRlcm1pbmF0ZWQgYnkgLTEKKyAgICBpbnQgc2FtcGxlX3JhdGVzX3NpemU7CisKKyAgICAvKiBvbmx5IHVzZWQgZm9yIGNvbXBhdCBBUEkgKi8KKyAgICBBVkF1ZGlvRmlmbyAqYXVkaW9fZmlmbzsgICAgIC8vLzwgRklGTyBmb3IgYXVkaW8gc2FtcGxlcworICAgIGludDY0X3QgbmV4dF9wdHM7ICAgICAgICAgICAgLy8vPCBpbnRlcnBvbGF0aW5nIGF1ZGlvIHB0cworfSBCdWZmZXJTaW5rQ29udGV4dDsKKworI2RlZmluZSBOQl9JVEVNUyhsaXN0KSAobGlzdCAjIyBfc2l6ZSAvIHNpemVvZigqbGlzdCkpCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpzaW5rID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKmZyYW1lOworCisgICAgaWYgKHNpbmstPmF1ZGlvX2ZpZm8pCisgICAgICAgIGF2X2F1ZGlvX2ZpZm9fZnJlZShzaW5rLT5hdWRpb19maWZvKTsKKworICAgIGlmIChzaW5rLT5maWZvKSB7CisgICAgICAgIHdoaWxlIChhdl9maWZvX3NpemUoc2luay0+ZmlmbykgPj0gc2l6ZW9mKEFWRmlsdGVyQnVmZmVyUmVmICopKSB7CisgICAgICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzaW5rLT5maWZvLCAmZnJhbWUsIHNpemVvZihmcmFtZSksIE5VTEwpOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICB9CisgICAgICAgIGF2X2ZpZm9fZnJlZXAoJnNpbmstPmZpZm8pOworICAgIH0KK30KKworc3RhdGljIGludCBhZGRfYnVmZmVyX3JlZihBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqcmVmKQoreworICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpidWYgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoYXZfZmlmb19zcGFjZShidWYtPmZpZm8pIDwgc2l6ZW9mKEFWRmlsdGVyQnVmZmVyUmVmICopKSB7CisgICAgICAgIC8qIHJlYWxsb2MgZmlmbyBzaXplICovCisgICAgICAgIGlmIChhdl9maWZvX3JlYWxsb2MyKGJ1Zi0+ZmlmbywgYXZfZmlmb19zaXplKGJ1Zi0+ZmlmbykgKiAyKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGJ1ZmZlciBtb3JlIGZyYW1lcy4gQ29uc3VtZSBzb21lIGF2YWlsYWJsZSBmcmFtZXMgIgorICAgICAgICAgICAgICAgICAgICJiZWZvcmUgYWRkaW5nIG5ldyBvbmVzLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2FjaGUgZnJhbWUgKi8KKyAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoYnVmLT5maWZvLCAmcmVmLCBzaXplb2YoQVZGaWx0ZXJCdWZmZXJSZWYgKiksIE5VTEwpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+ZHN0OworICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpidWYgPSBsaW5rLT5kc3QtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gYWRkX2J1ZmZlcl9yZWYoY3R4LCBmcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoYnVmLT53YXJuaW5nX2xpbWl0ICYmCisgICAgICAgIGF2X2ZpZm9fc2l6ZShidWYtPmZpZm8pIC8gc2l6ZW9mKEFWRmlsdGVyQnVmZmVyUmVmICopID49IGJ1Zi0+d2FybmluZ19saW1pdCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICIlZCBidWZmZXJzIHF1ZXVlZCBpbiAlcywgc29tZXRoaW5nIG1heSBiZSB3cm9uZy5cbiIsCisgICAgICAgICAgICAgICBidWYtPndhcm5pbmdfbGltaXQsCisgICAgICAgICAgICAgICAoY2hhciAqKWF2X3hfaWZfbnVsbChjdHgtPm5hbWUsIGN0eC0+ZmlsdGVyLT5uYW1lKSk7CisgICAgICAgIGJ1Zi0+d2FybmluZ19saW1pdCAqPSAxMDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICByZXR1cm4gYXZfYnVmZmVyc2lua19nZXRfZnJhbWVfZmxhZ3MoY3R4LCBmcmFtZSwgMCk7Cit9CisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lX2ZsYWdzKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSwgaW50IGZsYWdzKQoreworICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpidWYgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBpbnQgcmV0OworICAgIEFWRnJhbWUgKmN1cl9mcmFtZTsKKworICAgIC8qIG5vIHBpY3JlZiBhdmFpbGFibGUsIGZldGNoIGl0IGZyb20gdGhlIGZpbHRlcmNoYWluICovCisgICAgaWYgKCFhdl9maWZvX3NpemUoYnVmLT5maWZvKSkgeworICAgICAgICBpZiAoZmxhZ3MgJiBBVl9CVUZGRVJTSU5LX0ZMQUdfTk9fUkVRVUVTVCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIGlmICgocmV0ID0gZmZfcmVxdWVzdF9mcmFtZShpbmxpbmspKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICghYXZfZmlmb19zaXplKGJ1Zi0+ZmlmbykpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoZmxhZ3MgJiBBVl9CVUZGRVJTSU5LX0ZMQUdfUEVFSykgeworICAgICAgICBjdXJfZnJhbWUgPSAqKChBVkZyYW1lICoqKWF2X2ZpZm9fcGVlazIoYnVmLT5maWZvLCAwKSk7CisgICAgICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGZyYW1lLCBjdXJfZnJhbWUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKGJ1Zi0+ZmlmbywgJmN1cl9mcmFtZSwgc2l6ZW9mKGN1cl9mcmFtZSksIE5VTEwpOworICAgICAgICBhdl9mcmFtZV9tb3ZlX3JlZihmcmFtZSwgY3VyX2ZyYW1lKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmY3VyX2ZyYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2Zyb21fZmlmbyhBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzKQoreworICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAgICpsaW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgQVZGcmFtZSAqdG1wOworCisgICAgaWYgKCEodG1wID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihsaW5rLCBuYl9zYW1wbGVzKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZfYXVkaW9fZmlmb19yZWFkKHMtPmF1ZGlvX2ZpZm8sICh2b2lkKiopdG1wLT5leHRlbmRlZF9kYXRhLCBuYl9zYW1wbGVzKTsKKworICAgIHRtcC0+cHRzID0gcy0+bmV4dF9wdHM7CisgICAgaWYgKHMtPm5leHRfcHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBzLT5uZXh0X3B0cyArPSBhdl9yZXNjYWxlX3EobmJfc2FtcGxlcywgKEFWUmF0aW9uYWwpezEsIGxpbmstPnNhbXBsZV9yYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPnRpbWVfYmFzZSk7CisKKyAgICBhdl9mcmFtZV9tb3ZlX3JlZihmcmFtZSwgdG1wKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZ0bXApOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2X2J1ZmZlcnNpbmtfZ2V0X3NhbXBsZXMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBCdWZmZXJTaW5rQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgICAqbGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFWRnJhbWUgKmN1cl9mcmFtZTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmICghcy0+YXVkaW9fZmlmbykgeworICAgICAgICBpbnQgbmJfY2hhbm5lbHMgPSBsaW5rLT5jaGFubmVsczsKKyAgICAgICAgaWYgKCEocy0+YXVkaW9fZmlmbyA9IGF2X2F1ZGlvX2ZpZm9fYWxsb2MobGluay0+Zm9ybWF0LCBuYl9jaGFubmVscywgbmJfc2FtcGxlcykpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICB3aGlsZSAocmV0ID49IDApIHsKKyAgICAgICAgaWYgKGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5hdWRpb19maWZvKSA+PSBuYl9zYW1wbGVzKQorICAgICAgICAgICAgcmV0dXJuIHJlYWRfZnJvbV9maWZvKGN0eCwgZnJhbWUsIG5iX3NhbXBsZXMpOworCisgICAgICAgIGlmICghKGN1cl9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcmV0ID0gYXZfYnVmZmVyc2lua19nZXRfZnJhbWVfZmxhZ3MoY3R4LCBjdXJfZnJhbWUsIDApOworICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5hdWRpb19maWZvKSkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmY3VyX2ZyYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZWFkX2Zyb21fZmlmbyhjdHgsIGZyYW1lLCBhdl9hdWRpb19maWZvX3NpemUocy0+YXVkaW9fZmlmbykpOworICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmN1cl9mcmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cl9mcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBzLT5uZXh0X3B0cyA9IGN1cl9mcmFtZS0+cHRzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5hdWRpb19maWZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgbGluay0+c2FtcGxlX3JhdGUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPnRpbWVfYmFzZSk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBhdl9hdWRpb19maWZvX3dyaXRlKHMtPmF1ZGlvX2ZpZm8sICh2b2lkKiopY3VyX2ZyYW1lLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9mcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmN1cl9mcmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworQVZCdWZmZXJTaW5rUGFyYW1zICphdl9idWZmZXJzaW5rX3BhcmFtc19hbGxvYyh2b2lkKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgcGl4ZWxfZm10c1tdID0geyBBVl9QSVhfRk1UX05PTkUgfTsKKyAgICBBVkJ1ZmZlclNpbmtQYXJhbXMgKnBhcmFtcyA9IGF2X21hbGxvYyhzaXplb2YoQVZCdWZmZXJTaW5rUGFyYW1zKSk7CisgICAgaWYgKCFwYXJhbXMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcGFyYW1zLT5waXhlbF9mbXRzID0gcGl4ZWxfZm10czsKKyAgICByZXR1cm4gcGFyYW1zOworfQorCitBVkFCdWZmZXJTaW5rUGFyYW1zICphdl9hYnVmZmVyc2lua19wYXJhbXNfYWxsb2Modm9pZCkKK3sKKyAgICBBVkFCdWZmZXJTaW5rUGFyYW1zICpwYXJhbXMgPSBhdl9tYWxsb2N6KHNpemVvZihBVkFCdWZmZXJTaW5rUGFyYW1zKSk7CisKKyAgICBpZiAoIXBhcmFtcykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHBhcmFtczsKK30KKworI2RlZmluZSBGSUZPX0lOSVRfU0laRSA4CisKK3N0YXRpYyBhdl9jb2xkIGludCBjb21tb25faW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBCdWZmZXJTaW5rQ29udGV4dCAqYnVmID0gY3R4LT5wcml2OworCisgICAgYnVmLT5maWZvID0gYXZfZmlmb19hbGxvY19hcnJheShGSUZPX0lOSVRfU0laRSwgc2l6ZW9mKEFWRmlsdGVyQnVmZmVyUmVmICopKTsKKyAgICBpZiAoIWJ1Zi0+ZmlmbykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgZmlmb1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGJ1Zi0+d2FybmluZ19saW1pdCA9IDEwMDsKKyAgICBidWYtPm5leHRfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXZfYnVmZmVyc2lua19zZXRfZnJhbWVfc2l6ZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdW5zaWduZWQgZnJhbWVfc2l6ZSkKK3sKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworCisgICAgaW5saW5rLT5taW5fc2FtcGxlcyA9IGlubGluay0+bWF4X3NhbXBsZXMgPQorICAgIGlubGluay0+cGFydGlhbF9idWZfc2l6ZSA9IGZyYW1lX3NpemU7Cit9CisKKyNpZiBGRl9BUElfQVZGSUxURVJCVUZGRVIKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKK3N0YXRpYyB2b2lkIGNvbXBhdF9mcmVlX2J1ZmZlcihBVkZpbHRlckJ1ZmZlciAqYnVmKQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gYnVmLT5wcml2OworICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICBhdl9mcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X3JlYWQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQnVmZmVyUmVmICoqcGJ1ZiwgaW50IG5iX3NhbXBsZXMsIGludCBmbGFncykKK3sKKyAgICBBVkZpbHRlckJ1ZmZlclJlZiAqYnVmOworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIXBidWYpCisgICAgICAgIHJldHVybiBmZl9wb2xsX2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKworICAgIGZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKCFuYl9zYW1wbGVzKQorICAgICAgICByZXQgPSBhdl9idWZmZXJzaW5rX2dldF9mcmFtZV9mbGFncyhjdHgsIGZyYW1lLCBmbGFncyk7CisgICAgZWxzZQorICAgICAgICByZXQgPSBhdl9idWZmZXJzaW5rX2dldF9zYW1wbGVzKGN0eCwgZnJhbWUsIG5iX3NhbXBsZXMpOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIEFWX05PV0FSTl9ERVBSRUNBVEVEKAorICAgIGlmIChjdHgtPmlucHV0c1swXS0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgYnVmID0gYXZmaWx0ZXJfZ2V0X3ZpZGVvX2J1ZmZlcl9yZWZfZnJvbV9hcnJheXMoZnJhbWUtPmRhdGEsIGZyYW1lLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEVSTV9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5mb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZiA9IGF2ZmlsdGVyX2dldF9hdWRpb19idWZmZXJfcmVmX2Zyb21fYXJyYXlzKGZyYW1lLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbMF0sIEFWX1BFUk1fUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5jaGFubmVsX2xheW91dCk7CisgICAgfQorICAgIGlmICghYnVmKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGF2ZmlsdGVyX2NvcHlfZnJhbWVfcHJvcHMoYnVmLCBmcmFtZSk7CisgICAgKQorCisgICAgYnVmLT5idWYtPnByaXYgPSBmcmFtZTsKKyAgICBidWYtPmJ1Zi0+ZnJlZSA9IGNvbXBhdF9mcmVlX2J1ZmZlcjsKKworICAgICpwYnVmID0gYnVmOworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXR0cmlidXRlX2FsaWduX2FyZyBhdl9idWZmZXJzaW5rX3JlYWQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRmlsdGVyQnVmZmVyUmVmICoqYnVmKQoreworICAgIHJldHVybiBjb21wYXRfcmVhZChjdHgsIGJ1ZiwgMCwgMCk7Cit9CisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2X2J1ZmZlcnNpbmtfcmVhZF9zYW1wbGVzKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZpbHRlckJ1ZmZlclJlZiAqKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzKQoreworICAgIHJldHVybiBjb21wYXRfcmVhZChjdHgsIGJ1ZiwgbmJfc2FtcGxlcywgMCk7Cit9CisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2X2J1ZmZlcnNpbmtfZ2V0X2J1ZmZlcl9yZWYoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQnVmZmVyUmVmICoqYnVmcmVmLCBpbnQgZmxhZ3MpCit7CisgICAgKmJ1ZnJlZiA9IE5VTEw7CisKKyAgICBhdl9hc3NlcnQwKCAgICAhc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAiYnVmZmVyc2luayIpCisgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgImFidWZmZXJzaW5rIikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAiZmZidWZmZXJzaW5rIikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAiZmZhYnVmZmVyc2luayIpKTsKKworICAgIHJldHVybiBjb21wYXRfcmVhZChjdHgsIGJ1ZnJlZiwgMCwgZmxhZ3MpOworfQorRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKworQVZSYXRpb25hbCBhdl9idWZmZXJzaW5rX2dldF9mcmFtZV9yYXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGF2X2Fzc2VydDAoICAgIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgImJ1ZmZlcnNpbmsiKQorICAgICAgICAgICAgICAgfHwgIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgImZmYnVmZmVyc2luayIpKTsKKworICAgIHJldHVybiBjdHgtPmlucHV0c1swXS0+ZnJhbWVfcmF0ZTsKK30KKworaW50IGF0dHJpYnV0ZV9hbGlnbl9hcmcgYXZfYnVmZmVyc2lua19wb2xsX2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpidWYgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKworICAgIGF2X2Fzc2VydDAoICAgIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgImJ1ZmZlcnNpbmsiKQorICAgICAgICAgICAgICAgfHwgIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgImFidWZmZXJzaW5rIikKKyAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoY3R4LT5maWx0ZXItPm5hbWUsICJmZmJ1ZmZlcnNpbmsiKQorICAgICAgICAgICAgICAgfHwgIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgImZmYWJ1ZmZlcnNpbmsiKSk7CisKKyAgICByZXR1cm4gYXZfZmlmb19zaXplKGJ1Zi0+Zmlmbykvc2l6ZW9mKEFWRmlsdGVyQnVmZmVyUmVmICopICsgZmZfcG9sbF9mcmFtZShpbmxpbmspOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdnNpbmtfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqb3BhcXVlKQoreworICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpidWYgPSBjdHgtPnByaXY7CisgICAgQVZCdWZmZXJTaW5rUGFyYW1zICpwYXJhbXMgPSBvcGFxdWU7CisgICAgaW50IHJldDsKKworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0X2ludF9saXN0KGJ1ZiwgInBpeF9mbXRzIiwgcGFyYW1zLT5waXhlbF9mbXRzLCBBVl9QSVhfRk1UX05PTkUsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiBjb21tb25faW5pdChjdHgpOworfQorCisjZGVmaW5lIENIRUNLX0xJU1RfU0laRShmaWVsZCkgXAorICAgICAgICBpZiAoYnVmLT5maWVsZCAjIyBfc2l6ZSAlIHNpemVvZigqYnVmLT5maWVsZCkpIHsgXAorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzaXplIGZvciAiICNmaWVsZCAiOiAlZCwgIiBcCisgICAgICAgICAgICAgICAgICAgInNob3VsZCBiZSBtdWx0aXBsZSBvZiAlZFxuIiwgXAorICAgICAgICAgICAgICAgICAgIGJ1Zi0+ZmllbGQgIyMgX3NpemUsIChpbnQpc2l6ZW9mKCpidWYtPmZpZWxkKSk7IFwKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7IFwKKyAgICAgICAgfQorc3RhdGljIGludCB2c2lua19xdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpidWYgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpOworICAgIGludCByZXQ7CisKKyAgICBDSEVDS19MSVNUX1NJWkUocGl4ZWxfZm10cykKKyAgICBpZiAoYnVmLT5waXhlbF9mbXRzX3NpemUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5CX0lURU1TKGJ1Zi0+cGl4ZWxfZm10cyk7IGkrKykKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfYWRkX2Zvcm1hdCgmZm9ybWF0cywgYnVmLT5waXhlbF9mbXRzW2ldKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZmZfZm9ybWF0c191bnJlZigmZm9ybWF0cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmZfZGVmYXVsdF9xdWVyeV9mb3JtYXRzKGN0eCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhc2lua19pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICpvcGFxdWUpCit7CisgICAgQnVmZmVyU2lua0NvbnRleHQgKmJ1ZiA9IGN0eC0+cHJpdjsKKyAgICBBVkFCdWZmZXJTaW5rUGFyYW1zICpwYXJhbXMgPSBvcGFxdWU7CisgICAgaW50IHJldDsKKworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0X2ludF9saXN0KGJ1ZiwgInNhbXBsZV9mbXRzIiwgICAgIHBhcmFtcy0+c2FtcGxlX2ZtdHMsICBBVl9TQU1QTEVfRk1UX05PTkUsIDApKSA8IDAgfHwKKyAgICAgICAgICAgIChyZXQgPSBhdl9vcHRfc2V0X2ludF9saXN0KGJ1ZiwgInNhbXBsZV9yYXRlcyIsICAgIHBhcmFtcy0+c2FtcGxlX3JhdGVzLCAgICAtMSwgMCkpIDwgMCB8fAorICAgICAgICAgICAgKHJldCA9IGF2X29wdF9zZXRfaW50X2xpc3QoYnVmLCAiY2hhbm5lbF9sYXlvdXRzIiwgcGFyYW1zLT5jaGFubmVsX2xheW91dHMsIC0xLCAwKSkgPCAwIHx8CisgICAgICAgICAgICAocmV0ID0gYXZfb3B0X3NldF9pbnRfbGlzdChidWYsICJjaGFubmVsX2NvdW50cyIsICBwYXJhbXMtPmNoYW5uZWxfY291bnRzLCAgLTEsIDApKSA8IDAgfHwKKyAgICAgICAgICAgIChyZXQgPSBhdl9vcHRfc2V0X2ludChidWYsICJhbGxfY2hhbm5lbF9jb3VudHMiLCBwYXJhbXMtPmFsbF9jaGFubmVsX2NvdW50cywgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBjb21tb25faW5pdChjdHgpOworfQorCitzdGF0aWMgaW50IGFzaW5rX3F1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQnVmZmVyU2lua0NvbnRleHQgKmJ1ZiA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHMgPSBOVUxMOworICAgIHVuc2lnbmVkIGk7CisgICAgaW50IHJldDsKKworICAgIENIRUNLX0xJU1RfU0laRShzYW1wbGVfZm10cykKKyAgICBDSEVDS19MSVNUX1NJWkUoc2FtcGxlX3JhdGVzKQorICAgIENIRUNLX0xJU1RfU0laRShjaGFubmVsX2xheW91dHMpCisgICAgQ0hFQ0tfTElTVF9TSVpFKGNoYW5uZWxfY291bnRzKQorCisgICAgaWYgKGJ1Zi0+c2FtcGxlX2ZtdHNfc2l6ZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJfSVRFTVMoYnVmLT5zYW1wbGVfZm10cyk7IGkrKykKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfYWRkX2Zvcm1hdCgmZm9ybWF0cywgYnVmLT5zYW1wbGVfZm10c1tpXSkpIDwgMCkgeworICAgICAgICAgICAgICAgIGZmX2Zvcm1hdHNfdW5yZWYoJmZvcm1hdHMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworICAgIH0KKworICAgIGlmIChidWYtPmNoYW5uZWxfbGF5b3V0c19zaXplIHx8IGJ1Zi0+Y2hhbm5lbF9jb3VudHNfc2l6ZSB8fAorICAgICAgICBidWYtPmFsbF9jaGFubmVsX2NvdW50cykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJfSVRFTVMoYnVmLT5jaGFubmVsX2xheW91dHMpOyBpKyspCisgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2FkZF9jaGFubmVsX2xheW91dCgmbGF5b3V0cywgYnVmLT5jaGFubmVsX2xheW91dHNbaV0pKSA8IDApIHsKKyAgICAgICAgICAgICAgICBmZl9jaGFubmVsX2xheW91dHNfdW5yZWYoJmxheW91dHMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQl9JVEVNUyhidWYtPmNoYW5uZWxfY291bnRzKTsgaSsrKQorICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoJmxheW91dHMsIEZGX0NPVU5UMkxBWU9VVChidWYtPmNoYW5uZWxfY291bnRzW2ldKSkpIDwgMCkgeworICAgICAgICAgICAgICAgIGZmX2NoYW5uZWxfbGF5b3V0c191bnJlZigmbGF5b3V0cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1Zi0+YWxsX2NoYW5uZWxfY291bnRzKSB7CisgICAgICAgICAgICBpZiAobGF5b3V0cykKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZsaWN0aW5nIGFsbF9jaGFubmVsX2NvdW50cyBhbmQgbGlzdCBpbiBvcHRpb25zXG4iKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCEobGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2NvdW50cygpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgbGF5b3V0cyk7CisgICAgfQorCisgICAgaWYgKGJ1Zi0+c2FtcGxlX3JhdGVzX3NpemUpIHsKKyAgICAgICAgZm9ybWF0cyA9IE5VTEw7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQl9JVEVNUyhidWYtPnNhbXBsZV9yYXRlcyk7IGkrKykKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfYWRkX2Zvcm1hdCgmZm9ybWF0cywgYnVmLT5zYW1wbGVfcmF0ZXNbaV0pKSA8IDApIHsKKyAgICAgICAgICAgICAgICBmZl9mb3JtYXRzX3VucmVmKCZmb3JtYXRzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZm9ybWF0cyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEJ1ZmZlclNpbmtDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBidWZmZXJzaW5rX29wdGlvbnNbXSA9IHsKKyAgICB7ICJwaXhfZm10cyIsICJzZXQgdGhlIHN1cHBvcnRlZCBwaXhlbCBmb3JtYXRzIiwgT0ZGU0VUKHBpeGVsX2ZtdHMpLCBBVl9PUFRfVFlQRV9CSU5BUlksIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworI3VuZGVmIEZMQUdTCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFidWZmZXJzaW5rX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzYW1wbGVfZm10cyIsICAgICAic2V0IHRoZSBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdHMiLCAgT0ZGU0VUKHNhbXBsZV9mbXRzKSwgICAgIEFWX09QVF9UWVBFX0JJTkFSWSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJzYW1wbGVfcmF0ZXMiLCAgICAic2V0IHRoZSBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzIiwgICAgT0ZGU0VUKHNhbXBsZV9yYXRlcyksICAgIEFWX09QVF9UWVBFX0JJTkFSWSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJjaGFubmVsX2xheW91dHMiLCAic2V0IHRoZSBzdXBwb3J0ZWQgY2hhbm5lbCBsYXlvdXRzIiwgT0ZGU0VUKGNoYW5uZWxfbGF5b3V0cyksIEFWX09QVF9UWVBFX0JJTkFSWSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJjaGFubmVsX2NvdW50cyIsICAic2V0IHRoZSBzdXBwb3J0ZWQgY2hhbm5lbCBjb3VudHMiLCAgT0ZGU0VUKGNoYW5uZWxfY291bnRzKSwgIEFWX09QVF9UWVBFX0JJTkFSWSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJhbGxfY2hhbm5lbF9jb3VudHMiLCAiYWNjZXB0IGFsbCBjaGFubmVsIGNvdW50cyIsIE9GRlNFVChhbGxfY2hhbm5lbF9jb3VudHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworI3VuZGVmIEZMQUdTCisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhidWZmZXJzaW5rKTsKK0FWRklMVEVSX0RFRklORV9DTEFTUyhhYnVmZmVyc2luayk7CisKKyNpZiBGRl9BUElfQVZGSUxURVJCVUZGRVIKKworI2RlZmluZSBmZmJ1ZmZlcnNpbmtfb3B0aW9ucyBidWZmZXJzaW5rX29wdGlvbnMKKyNkZWZpbmUgZmZhYnVmZmVyc2lua19vcHRpb25zIGFidWZmZXJzaW5rX29wdGlvbnMKK0FWRklMVEVSX0RFRklORV9DTEFTUyhmZmJ1ZmZlcnNpbmspOworQVZGSUxURVJfREVGSU5FX0NMQVNTKGZmYWJ1ZmZlcnNpbmspOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZmZidWZmZXJzaW5rX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9LAorfTsKKworQVZGaWx0ZXIgZmZfdnNpbmtfZmZidWZmZXJzaW5rID0geworICAgIC5uYW1lICAgICAgPSAiZmZidWZmZXJzaW5rIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQnVmZmVyIHZpZGVvIGZyYW1lcywgYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUgdG8gdGhlIGVuZCBvZiB0aGUgZmlsdGVyIGdyYXBoLiIpLAorICAgIC5wcml2X3NpemUgPSBzaXplb2YoQnVmZmVyU2lua0NvbnRleHQpLAorICAgIC5wcml2X2NsYXNzID0gJmZmYnVmZmVyc2lua19jbGFzcywKKyAgICAuaW5pdF9vcGFxdWUgPSB2c2lua19pbml0LAorICAgIC51bmluaXQgICAgPSB1bmluaXQsCisKKyAgICAucXVlcnlfZm9ybWF0cyA9IHZzaW5rX3F1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBmZmJ1ZmZlcnNpbmtfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBmZmFidWZmZXJzaW5rX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9LAorfTsKKworQVZGaWx0ZXIgZmZfYXNpbmtfZmZhYnVmZmVyc2luayA9IHsKKyAgICAubmFtZSAgICAgID0gImZmYWJ1ZmZlcnNpbmsiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCdWZmZXIgYXVkaW8gZnJhbWVzLCBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZSB0byB0aGUgZW5kIG9mIHRoZSBmaWx0ZXIgZ3JhcGguIiksCisgICAgLmluaXRfb3BhcXVlID0gYXNpbmtfaW5pdCwKKyAgICAudW5pbml0ICAgID0gdW5pbml0LAorICAgIC5wcml2X3NpemUgPSBzaXplb2YoQnVmZmVyU2lua0NvbnRleHQpLAorICAgIC5wcml2X2NsYXNzID0gJmZmYWJ1ZmZlcnNpbmtfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBhc2lua19xdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gZmZhYnVmZmVyc2lua19pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBOVUxMLAorfTsKKyNlbmRpZiAvKiBGRl9BUElfQVZGSUxURVJCVUZGRVIgKi8KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZzaW5rX2J1ZmZlcl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdnNpbmtfYnVmZmVyID0geworICAgIC5uYW1lICAgICAgICA9ICJidWZmZXJzaW5rIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQnVmZmVyIHZpZGVvIGZyYW1lcywgYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUgdG8gdGhlIGVuZCBvZiB0aGUgZmlsdGVyIGdyYXBoLiIpLAorICAgIC5wcml2X3NpemUgICA9IHNpemVvZihCdWZmZXJTaW5rQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgID0gJmJ1ZmZlcnNpbmtfY2xhc3MsCisgICAgLmluaXRfb3BhcXVlID0gdnNpbmtfaW5pdCwKKyAgICAudW5pbml0ICAgICAgPSB1bmluaXQsCisKKyAgICAucXVlcnlfZm9ybWF0cyA9IHZzaW5rX3F1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgID0gYXZmaWx0ZXJfdnNpbmtfYnVmZmVyX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgPSBOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FzaW5rX2FidWZmZXJfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FzaW5rX2FidWZmZXIgPSB7CisgICAgLm5hbWUgICAgICAgID0gImFidWZmZXJzaW5rIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQnVmZmVyIGF1ZGlvIGZyYW1lcywgYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUgdG8gdGhlIGVuZCBvZiB0aGUgZmlsdGVyIGdyYXBoLiIpLAorICAgIC5wcml2X2NsYXNzICA9ICZhYnVmZmVyc2lua19jbGFzcywKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoQnVmZmVyU2lua0NvbnRleHQpLAorICAgIC5pbml0X29wYXF1ZSA9IGFzaW5rX2luaXQsCisgICAgLnVuaW5pdCAgICAgID0gdW5pbml0LAorCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBhc2lua19xdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICA9IGF2ZmlsdGVyX2FzaW5rX2FidWZmZXJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IE5VTEwsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2J1ZmZlcnNpbmsuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9idWZmZXJzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjZDJmZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9idWZmZXJzaW5rLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9CVUZGRVJTSU5LX0gKKyNkZWZpbmUgQVZGSUxURVJfQlVGRkVSU0lOS19ICisKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdmZpX2J1ZmZlcnNpbmsKKyAqIG1lbW9yeSBidWZmZXIgc2luayBBUEkgZm9yIGF1ZGlvIGFuZCB2aWRlbworICovCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorCisvKioKKyAqIEBkZWZncm91cCBsYXZmaV9idWZmZXJzaW5rIEJ1ZmZlciBzaW5rIEFQSQorICogQGluZ3JvdXAgbGF2ZmkKKyAqIEB7CisgKi8KKworI2lmIEZGX0FQSV9BVkZJTFRFUkJVRkZFUgorLyoqCisgKiBHZXQgYW4gYXVkaW8vdmlkZW8gYnVmZmVyIGRhdGEgZnJvbSBidWZmZXJfc2luayBhbmQgcHV0IGl0IGluIGJ1ZnJlZi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggYm90aCBhdWRpbyBhbmQgdmlkZW8gYnVmZmVyIHNpbmtzLgorICoKKyAqIEBwYXJhbSBidWZmZXJfc2luayBwb2ludGVyIHRvIGEgYnVmZmVyc2luayBvciBhYnVmZmVyc2luayBjb250ZXh0CisgKiBAcGFyYW0gZmxhZ3MgYSBjb21iaW5hdGlvbiBvZiBBVl9CVUZGRVJTSU5LX0ZMQUdfKiBmbGFncworICogQHJldHVybiA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgaW4gY2FzZSBvZgorICogZmFpbHVyZQorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IGF2X2J1ZmZlcnNpbmtfZ2V0X2J1ZmZlcl9yZWYoQVZGaWx0ZXJDb250ZXh0ICpidWZmZXJfc2luaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQnVmZmVyUmVmICoqYnVmcmVmLCBpbnQgZmxhZ3MpOworCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSBmcmFtZXMuCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitpbnQgYXZfYnVmZmVyc2lua19wb2xsX2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKKworLyoqCisgKiBHZXQgYSBidWZmZXIgd2l0aCBmaWx0ZXJlZCBkYXRhIGZyb20gc2luayBhbmQgcHV0IGl0IGluIGJ1Zi4KKyAqCisgKiBAcGFyYW0gY3R4IHBvaW50ZXIgdG8gYSBjb250ZXh0IG9mIGEgYnVmZmVyc2luayBvciBhYnVmZmVyc2luayBBVkZpbHRlci4KKyAqIEBwYXJhbSBidWYgcG9pbnRlciB0byB0aGUgYnVmZmVyIHdpbGwgYmUgd3JpdHRlbiBoZXJlIGlmIGJ1ZiBpcyBub24tTlVMTC4gYnVmCisgKiAgICAgICAgICAgIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBhdmZpbHRlcl91bnJlZl9idWZmZXIoKS4KKyAqICAgICAgICAgICAgQnVmIG1heSBhbHNvIGJlIE5VTEwgdG8gcXVlcnkgd2hldGhlciBhIGJ1ZmZlciBpcyByZWFkeSB0byBiZQorICogICAgICAgICAgICBvdXRwdXQuCisgKgorICogQHJldHVybiA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgaW4gY2FzZSBvZgorICogICAgICAgICBmYWlsdXJlLgorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IGF2X2J1ZmZlcnNpbmtfcmVhZChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGaWx0ZXJCdWZmZXJSZWYgKipidWYpOworCisvKioKKyAqIFNhbWUgYXMgYXZfYnVmZmVyc2lua19yZWFkLCBidXQgd2l0aCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YKKyAqIHNhbXBsZXMgcmVhZC4gVGhpcyBmdW5jdGlvbiBpcyBsZXNzIGVmZmljaWVudCB0aGFuIGF2X2J1ZmZlcnNpbmtfcmVhZCgpLAorICogYmVjYXVzZSBpdCBjb3BpZXMgdGhlIGRhdGEgYXJvdW5kLgorICoKKyAqIEBwYXJhbSBjdHggcG9pbnRlciB0byBhIGNvbnRleHQgb2YgdGhlIGFidWZmZXJzaW5rIEFWRmlsdGVyLgorICogQHBhcmFtIGJ1ZiBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2lsbCBiZSB3cml0dGVuIGhlcmUgaWYgYnVmIGlzIG5vbi1OVUxMLiBidWYKKyAqICAgICAgICAgICAgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGF2ZmlsdGVyX3VucmVmX2J1ZmZlcigpLiBidWYKKyAqICAgICAgICAgICAgd2lsbCBjb250YWluIGV4YWN0bHkgbmJfc2FtcGxlcyBhdWRpbyBzYW1wbGVzLCBleGNlcHQgYXQgdGhlIGVuZAorICogICAgICAgICAgICBvZiBzdHJlYW0sIHdoZW4gaXQgY2FuIGNvbnRhaW4gbGVzcyB0aGFuIG5iX3NhbXBsZXMuCisgKiAgICAgICAgICAgIEJ1ZiBtYXkgYWxzbyBiZSBOVUxMIHRvIHF1ZXJ5IHdoZXRoZXIgYSBidWZmZXIgaXMgcmVhZHkgdG8gYmUKKyAqICAgICAgICAgICAgb3V0cHV0LgorICoKKyAqIEB3YXJuaW5nIGRvIG5vdCBtaXggdGhpcyBmdW5jdGlvbiB3aXRoIGF2X2J1ZmZlcnNpbmtfcmVhZCgpLiBVc2Ugb25seSBvbmUgb3IKKyAqIHRoZSBvdGhlciB3aXRoIGEgc2luZ2xlIHNpbmssIG5vdCBib3RoLgorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IGF2X2J1ZmZlcnNpbmtfcmVhZF9zYW1wbGVzKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZpbHRlckJ1ZmZlclJlZiAqKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcyk7CisjZW5kaWYKKworLyoqCisgKiBHZXQgYSBmcmFtZSB3aXRoIGZpbHRlcmVkIGRhdGEgZnJvbSBzaW5rIGFuZCBwdXQgaXQgaW4gZnJhbWUuCisgKgorICogQHBhcmFtIGN0eCAgICBwb2ludGVyIHRvIGEgYnVmZmVyc2luayBvciBhYnVmZmVyc2luayBmaWx0ZXIgY29udGV4dC4KKyAqIEBwYXJhbSBmcmFtZSAgcG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgZnJhbWUgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIGRhdGEuCisgKiAgICAgICAgICAgICAgIFRoZSBkYXRhIG11c3QgYmUgZnJlZWQgdXNpbmcgYXZfZnJhbWVfdW5yZWYoKSAvIGF2X2ZyYW1lX2ZyZWUoKQorICogQHBhcmFtIGZsYWdzICBhIGNvbWJpbmF0aW9uIG9mIEFWX0JVRkZFUlNJTktfRkxBR18qIGZsYWdzCisgKgorICogQHJldHVybiAgPj0gMCBpbiBmb3Igc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgZm9yIGZhaWx1cmUuCisgKi8KK2ludCBhdl9idWZmZXJzaW5rX2dldF9mcmFtZV9mbGFncyhBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncyk7CisKKy8qKgorICogVGVsbCBhdl9idWZmZXJzaW5rX2dldF9idWZmZXJfcmVmKCkgdG8gcmVhZCB2aWRlby9zYW1wbGVzIGJ1ZmZlcgorICogcmVmZXJlbmNlLCBidXQgbm90IHJlbW92ZSBpdCBmcm9tIHRoZSBidWZmZXIuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdQorICogbmVlZCBvbmx5IHRvIHJlYWQgYSB2aWRlby9zYW1wbGVzIGJ1ZmZlciwgd2l0aG91dCB0byBmZXRjaCBpdC4KKyAqLworI2RlZmluZSBBVl9CVUZGRVJTSU5LX0ZMQUdfUEVFSyAxCisKKy8qKgorICogVGVsbCBhdl9idWZmZXJzaW5rX2dldF9idWZmZXJfcmVmKCkgbm90IHRvIHJlcXVlc3QgYSBmcmFtZSBmcm9tIGl0cyBpbnB1dC4KKyAqIElmIGEgZnJhbWUgaXMgYWxyZWFkeSBidWZmZXJlZCwgaXQgaXMgcmVhZCAoYW5kIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyKSwKKyAqIGJ1dCBpZiBubyBmcmFtZSBpcyBwcmVzZW50LCByZXR1cm4gQVZFUlJPUihFQUdBSU4pLgorICovCisjZGVmaW5lIEFWX0JVRkZFUlNJTktfRkxBR19OT19SRVFVRVNUIDIKKworLyoqCisgKiBTdHJ1Y3QgdG8gdXNlIGZvciBpbml0aWFsaXppbmcgYSBidWZmZXJzaW5rIGNvbnRleHQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnBpeGVsX2ZtdHM7IC8vLzwgbGlzdCBvZiBhbGxvd2VkIHBpeGVsIGZvcm1hdHMsIHRlcm1pbmF0ZWQgYnkgQVZfUElYX0ZNVF9OT05FCit9IEFWQnVmZmVyU2lua1BhcmFtczsKKworLyoqCisgKiBDcmVhdGUgYW4gQVZCdWZmZXJTaW5rUGFyYW1zIHN0cnVjdHVyZS4KKyAqCisgKiBNdXN0IGJlIGZyZWVkIHdpdGggYXZfZnJlZSgpLgorICovCitBVkJ1ZmZlclNpbmtQYXJhbXMgKmF2X2J1ZmZlcnNpbmtfcGFyYW1zX2FsbG9jKHZvaWQpOworCisvKioKKyAqIFN0cnVjdCB0byB1c2UgZm9yIGluaXRpYWxpemluZyBhbiBhYnVmZmVyc2luayBjb250ZXh0LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCAqc2FtcGxlX2ZtdHM7IC8vLzwgbGlzdCBvZiBhbGxvd2VkIHNhbXBsZSBmb3JtYXRzLCB0ZXJtaW5hdGVkIGJ5IEFWX1NBTVBMRV9GTVRfTk9ORQorICAgIGNvbnN0IGludDY0X3QgKmNoYW5uZWxfbGF5b3V0czsgICAgICAgICAvLy88IGxpc3Qgb2YgYWxsb3dlZCBjaGFubmVsIGxheW91dHMsIHRlcm1pbmF0ZWQgYnkgLTEKKyAgICBjb25zdCBpbnQgKmNoYW5uZWxfY291bnRzOyAgICAgICAgICAgICAgLy8vPCBsaXN0IG9mIGFsbG93ZWQgY2hhbm5lbCBjb3VudHMsIHRlcm1pbmF0ZWQgYnkgLTEKKyAgICBpbnQgYWxsX2NoYW5uZWxfY291bnRzOyAgICAgICAgICAgICAgICAgLy8vPCBpZiBub3QgMCwgYWNjZXB0IGFueSBjaGFubmVsIGNvdW50IG9yIGxheW91dAorICAgIGludCAqc2FtcGxlX3JhdGVzOyAgICAgICAgICAgICAgICAgICAgICAvLy88IGxpc3Qgb2YgYWxsb3dlZCBzYW1wbGUgcmF0ZXMsIHRlcm1pbmF0ZWQgYnkgLTEKK30gQVZBQnVmZmVyU2lua1BhcmFtczsKKworLyoqCisgKiBDcmVhdGUgYW4gQVZBQnVmZmVyU2lua1BhcmFtcyBzdHJ1Y3R1cmUuCisgKgorICogTXVzdCBiZSBmcmVlZCB3aXRoIGF2X2ZyZWUoKS4KKyAqLworQVZBQnVmZmVyU2lua1BhcmFtcyAqYXZfYWJ1ZmZlcnNpbmtfcGFyYW1zX2FsbG9jKHZvaWQpOworCisvKioKKyAqIFNldCB0aGUgZnJhbWUgc2l6ZSBmb3IgYW4gYXVkaW8gYnVmZmVyIHNpbmsuCisgKgorICogQWxsIGNhbGxzIHRvIGF2X2J1ZmZlcnNpbmtfZ2V0X2J1ZmZlcl9yZWYgd2lsbCByZXR1cm4gYSBidWZmZXIgd2l0aAorICogZXhhY3RseSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzYW1wbGVzLCBvciBBVkVSUk9SKEVBR0FJTikgaWYgdGhlcmUgaXMKKyAqIG5vdCBlbm91Z2guIFRoZSBsYXN0IGJ1ZmZlciBhdCBFT0Ygd2lsbCBiZSBwYWRkZWQgd2l0aCAwLgorICovCit2b2lkIGF2X2J1ZmZlcnNpbmtfc2V0X2ZyYW1lX3NpemUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHVuc2lnbmVkIGZyYW1lX3NpemUpOworCisvKioKKyAqIEdldCB0aGUgZnJhbWUgcmF0ZSBvZiB0aGUgaW5wdXQuCisgKi8KK0FWUmF0aW9uYWwgYXZfYnVmZmVyc2lua19nZXRfZnJhbWVfcmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCk7CisKKy8qKgorICogR2V0IGEgZnJhbWUgd2l0aCBmaWx0ZXJlZCBkYXRhIGZyb20gc2luayBhbmQgcHV0IGl0IGluIGZyYW1lLgorICoKKyAqIEBwYXJhbSBjdHggcG9pbnRlciB0byBhIGNvbnRleHQgb2YgYSBidWZmZXJzaW5rIG9yIGFidWZmZXJzaW5rIEFWRmlsdGVyLgorICogQHBhcmFtIGZyYW1lIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIGZyYW1lIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCBkYXRhLgorICogICAgICAgICAgICAgIFRoZSBkYXRhIG11c3QgYmUgZnJlZWQgdXNpbmcgYXZfZnJhbWVfdW5yZWYoKSAvIGF2X2ZyYW1lX2ZyZWUoKQorICoKKyAqIEByZXR1cm4KKyAqICAgICAgICAgLSA+PSAwIGlmIGEgZnJhbWUgd2FzIHN1Y2Nlc3NmdWxseSByZXR1cm5lZC4KKyAqICAgICAgICAgLSBBVkVSUk9SKEVBR0FJTikgaWYgbm8gZnJhbWVzIGFyZSBhdmFpbGFibGUgYXQgdGhpcyBwb2ludDsgbW9yZQorICogICAgICAgICAgIGlucHV0IGZyYW1lcyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBmaWx0ZXJncmFwaCB0byBnZXQgbW9yZSBvdXRwdXQuCisgKiAgICAgICAgIC0gQVZFUlJPUl9FT0YgaWYgdGhlcmUgd2lsbCBiZSBubyBtb3JlIG91dHB1dCBmcmFtZXMgb24gdGhpcyBzaW5rLgorICogICAgICAgICAtIEEgZGlmZmVyZW50IG5lZ2F0aXZlIEFWRVJST1IgY29kZSBpbiBvdGhlciBmYWlsdXJlIGNhc2VzLgorICovCitpbnQgYXZfYnVmZmVyc2lua19nZXRfZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBTYW1lIGFzIGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lKCksIGJ1dCB3aXRoIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgdGhlIG51bWJlcgorICogb2Ygc2FtcGxlcyByZWFkLiBUaGlzIGZ1bmN0aW9uIGlzIGxlc3MgZWZmaWNpZW50IHRoYW4KKyAqIGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lKCksIGJlY2F1c2UgaXQgY29waWVzIHRoZSBkYXRhIGFyb3VuZC4KKyAqCisgKiBAcGFyYW0gY3R4IHBvaW50ZXIgdG8gYSBjb250ZXh0IG9mIHRoZSBhYnVmZmVyc2luayBBVkZpbHRlci4KKyAqIEBwYXJhbSBmcmFtZSBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBmcmFtZSB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggZGF0YS4KKyAqICAgICAgICAgICAgICBUaGUgZGF0YSBtdXN0IGJlIGZyZWVkIHVzaW5nIGF2X2ZyYW1lX3VucmVmKCkgLyBhdl9mcmFtZV9mcmVlKCkKKyAqICAgICAgICAgICAgICBmcmFtZSB3aWxsIGNvbnRhaW4gZXhhY3RseSBuYl9zYW1wbGVzIGF1ZGlvIHNhbXBsZXMsIGV4Y2VwdCBhdAorICogICAgICAgICAgICAgIHRoZSBlbmQgb2Ygc3RyZWFtLCB3aGVuIGl0IGNhbiBjb250YWluIGxlc3MgdGhhbiBuYl9zYW1wbGVzLgorICoKKyAqIEByZXR1cm4gVGhlIHJldHVybiBjb2RlcyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yCisgKiAgICAgICAgIGF2X2J1ZmZlcnNpbmtfZ2V0X3NhbXBsZXMoKS4KKyAqCisgKiBAd2FybmluZyBkbyBub3QgbWl4IHRoaXMgZnVuY3Rpb24gd2l0aCBhdl9idWZmZXJzaW5rX2dldF9mcmFtZSgpLiBVc2Ugb25seSBvbmUgb3IKKyAqIHRoZSBvdGhlciB3aXRoIGEgc2luZ2xlIHNpbmssIG5vdCBib3RoLgorICovCitpbnQgYXZfYnVmZmVyc2lua19nZXRfc2FtcGxlcyhBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUsIGludCBuYl9zYW1wbGVzKTsKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBVkZJTFRFUl9CVUZGRVJTSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9idWZmZXJzcmMuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9idWZmZXJzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QzZGIwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5jCkBAIC0wLDAgKzEsNTU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFZpdG9yIFNlc3NhaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBtZW1vcnkgYnVmZmVyIHNvdXJjZSBmaWx0ZXIKKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImJ1ZmZlcnNyYy5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCit0eXBlZGVmIHN0cnVjdCBCdWZmZXJTb3VyY2VDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICAgICpjbGFzczsKKyAgICBBVkZpZm9CdWZmZXIgICAgICpmaWZvOworICAgIEFWUmF0aW9uYWwgICAgICAgIHRpbWVfYmFzZTsgICAgIC8vLzwgdGltZV9iYXNlIHRvIHNldCBpbiB0aGUgb3V0cHV0IGxpbmsKKyAgICBBVlJhdGlvbmFsICAgICAgICBmcmFtZV9yYXRlOyAgICAvLy88IGZyYW1lX3JhdGUgdG8gc2V0IGluIHRoZSBvdXRwdXQgbGluaworICAgIHVuc2lnbmVkICAgICAgICAgIG5iX2ZhaWxlZF9yZXF1ZXN0czsKKyAgICB1bnNpZ25lZCAgICAgICAgICB3YXJuaW5nX2xpbWl0OworCisgICAgLyogdmlkZW8gb25seSAqLworICAgIGludCAgICAgICAgICAgICAgIHcsIGg7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0ICBwaXhfZm10OworICAgIEFWUmF0aW9uYWwgICAgICAgIHBpeGVsX2FzcGVjdDsKKyAgICBjaGFyICAgICAgICAgICAgICAqc3dzX3BhcmFtOworCisgICAgLyogYXVkaW8gb25seSAqLworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQ7CisgICAgaW50IGNoYW5uZWxzOworICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OworICAgIGNoYXIgICAgKmNoYW5uZWxfbGF5b3V0X3N0cjsKKworICAgIGludCBlb2Y7Cit9IEJ1ZmZlclNvdXJjZUNvbnRleHQ7CisKKyNkZWZpbmUgQ0hFQ0tfVklERU9fUEFSQU1fQ0hBTkdFKHMsIGMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdClcCisgICAgaWYgKGMtPncgIT0gd2lkdGggfHwgYy0+aCAhPSBoZWlnaHQgfHwgYy0+cGl4X2ZtdCAhPSBmb3JtYXQpIHtcCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIkNoYW5naW5nIGZyYW1lIHByb3BlcnRpZXMgb24gdGhlIGZseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBmaWx0ZXJzLlxuIik7XAorICAgIH0KKworI2RlZmluZSBDSEVDS19BVURJT19QQVJBTV9DSEFOR0UocywgYywgc3JhdGUsIGNoX2xheW91dCwgY2hfY291bnQsIGZvcm1hdClcCisgICAgaWYgKGMtPnNhbXBsZV9mbXQgIT0gZm9ybWF0IHx8IGMtPnNhbXBsZV9yYXRlICE9IHNyYXRlIHx8XAorICAgICAgICBjLT5jaGFubmVsX2xheW91dCAhPSBjaF9sYXlvdXQgfHwgYy0+Y2hhbm5lbHMgIT0gY2hfY291bnQpIHtcCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDaGFuZ2luZyBmcmFtZSBwcm9wZXJ0aWVzIG9uIHRoZSBmbHkgaXMgbm90IHN1cHBvcnRlZC5cbiIpO1wKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTtcCisgICAgfQorCitpbnQgYXR0cmlidXRlX2FsaWduX2FyZyBhdl9idWZmZXJzcmNfd3JpdGVfZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQoreworICAgIHJldHVybiBhdl9idWZmZXJzcmNfYWRkX2ZyYW1lX2ZsYWdzKGN0eCwgKEFWRnJhbWUgKilmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9CVUZGRVJTUkNfRkxBR19LRUVQX1JFRik7Cit9CisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2X2J1ZmZlcnNyY19hZGRfZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIHJldHVybiBhdl9idWZmZXJzcmNfYWRkX2ZyYW1lX2ZsYWdzKGN0eCwgZnJhbWUsIDApOworfQorCitzdGF0aWMgaW50IGF2X2J1ZmZlcnNyY19hZGRfZnJhbWVfaW50ZXJuYWwoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncyk7CisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2X2J1ZmZlcnNyY19hZGRfZnJhbWVfZmxhZ3MoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgQVZGcmFtZSAqY29weSA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoZnJhbWUgJiYgZnJhbWUtPmNoYW5uZWxfbGF5b3V0ICYmCisgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpICE9IGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSkpIHsKKyAgICAgICAgYXZfbG9nKDAsIEFWX0xPR19FUlJPUiwgIkxheW91dCBpbmRpY2F0ZXMgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGNoYW5uZWxzIHRoYW4gYWN0dWFsbHkgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKCEoZmxhZ3MgJiBBVl9CVUZGRVJTUkNfRkxBR19LRUVQX1JFRikgfHwgIWZyYW1lKQorICAgICAgICByZXR1cm4gYXZfYnVmZmVyc3JjX2FkZF9mcmFtZV9pbnRlcm5hbChjdHgsIGZyYW1lLCBmbGFncyk7CisKKyAgICBpZiAoIShjb3B5ID0gYXZfZnJhbWVfYWxsb2MoKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0ID0gYXZfZnJhbWVfcmVmKGNvcHksIGZyYW1lKTsKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIHJldCA9IGF2X2J1ZmZlcnNyY19hZGRfZnJhbWVfaW50ZXJuYWwoY3R4LCBjb3B5LCBmbGFncyk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZjb3B5KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF2X2J1ZmZlcnNyY19hZGRfZnJhbWVfaW50ZXJuYWwoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncykKK3sKKyAgICBCdWZmZXJTb3VyY2VDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKmNvcHk7CisgICAgaW50IHJlZmNvdW50ZWQsIHJldDsKKworICAgIHMtPm5iX2ZhaWxlZF9yZXF1ZXN0cyA9IDA7CisKKyAgICBpZiAoIWZyYW1lKSB7CisgICAgICAgIHMtPmVvZiA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAocy0+ZW9mKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgcmVmY291bnRlZCA9ICEhZnJhbWUtPmJ1ZlswXTsKKworICAgIGlmICghKGZsYWdzICYgQVZfQlVGRkVSU1JDX0ZMQUdfTk9fQ0hFQ0tfRk9STUFUKSkgeworCisgICAgc3dpdGNoIChjdHgtPm91dHB1dHNbMF0tPnR5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgQ0hFQ0tfVklERU9fUEFSQU1fQ0hBTkdFKGN0eCwgcywgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAvKiBGb3IgbGF5b3V0cyB1bmtub3duIG9uIGlucHV0IGJ1dCBrbm93biBvbiBsaW5rIGFmdGVyIG5lZ290aWF0aW9uLiAqLworICAgICAgICBpZiAoIWZyYW1lLT5jaGFubmVsX2xheW91dCkKKyAgICAgICAgICAgIGZyYW1lLT5jaGFubmVsX2xheW91dCA9IHMtPmNoYW5uZWxfbGF5b3V0OworICAgICAgICBDSEVDS19BVURJT19QQVJBTV9DSEFOR0UoY3R4LCBzLCBmcmFtZS0+c2FtcGxlX3JhdGUsIGZyYW1lLT5jaGFubmVsX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSksIGZyYW1lLT5mb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIH0KKworICAgIGlmICghYXZfZmlmb19zcGFjZShzLT5maWZvKSAmJgorICAgICAgICAocmV0ID0gYXZfZmlmb19yZWFsbG9jMihzLT5maWZvLCBhdl9maWZvX3NpemUocy0+ZmlmbykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY29weSkpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIShjb3B5ID0gYXZfZnJhbWVfYWxsb2MoKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAocmVmY291bnRlZCkgeworICAgICAgICBhdl9mcmFtZV9tb3ZlX3JlZihjb3B5LCBmcmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gYXZfZnJhbWVfcmVmKGNvcHksIGZyYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmNvcHkpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfZmlmb19nZW5lcmljX3dyaXRlKHMtPmZpZm8sICZjb3B5LCBzaXplb2YoY29weSksIE5VTEwpKSA8IDApIHsKKyAgICAgICAgaWYgKHJlZmNvdW50ZWQpCisgICAgICAgICAgICBhdl9mcmFtZV9tb3ZlX3JlZihmcmFtZSwgY29weSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmNvcHkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICgoZmxhZ3MgJiBBVl9CVUZGRVJTUkNfRkxBR19QVVNIKSkKKyAgICAgICAgaWYgKChyZXQgPSBjdHgtPm91dHB1dF9wYWRzWzBdLnJlcXVlc3RfZnJhbWUoY3R4LT5vdXRwdXRzWzBdKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCisjaWYgRkZfQVBJX0FWRklMVEVSQlVGRkVSCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCitzdGF0aWMgdm9pZCBjb21wYXRfZnJlZV9idWZmZXIodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKQoreworICAgIEFWRmlsdGVyQnVmZmVyUmVmICpidWYgPSBvcGFxdWU7CisgICAgQVZfTk9XQVJOX0RFUFJFQ0FURUQoCisgICAgYXZmaWx0ZXJfdW5yZWZfYnVmZmVyKGJ1Zik7CisgICAgKQorfQorCitzdGF0aWMgdm9pZCBjb21wYXRfdW5yZWZfYnVmZmVyKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBBVkJ1ZmZlclJlZiAqYnVmID0gb3BhcXVlOworICAgIEFWX05PV0FSTl9ERVBSRUNBVEVEKAorICAgIGF2X2J1ZmZlcl91bnJlZigmYnVmKTsKKyAgICApCit9CisKK2ludCBhdl9idWZmZXJzcmNfYWRkX3JlZihBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGaWx0ZXJCdWZmZXJSZWYgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgQnVmZmVyU291cmNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpmcmFtZSA9IE5VTEw7CisgICAgQVZCdWZmZXJSZWYgKmR1bW15X2J1ZiA9IE5VTEw7CisgICAgaW50IHJldCA9IDAsIHBsYW5lcywgaTsKKworICAgIGlmICghYnVmKSB7CisgICAgICAgIHMtPmVvZiA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAocy0+ZW9mKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBkdW1teV9idWYgPSBhdl9idWZmZXJfY3JlYXRlKE5VTEwsIDAsIGNvbXBhdF9mcmVlX2J1ZmZlciwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Zi0+cGVybXMgJiBBVl9QRVJNX1dSSVRFKSA/IDAgOiBBVl9CVUZGRVJfRkxBR19SRUFET05MWSk7CisgICAgaWYgKCFkdW1teV9idWYpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgQVZfTk9XQVJOX0RFUFJFQ0FURUQoCisgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9jb3B5X2J1Zl9wcm9wcyhmcmFtZSwgYnVmKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgKQorCisjZGVmaW5lIFdSQVBfUExBTkUocmVmX291dCwgZGF0YSwgZGF0YV9zaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVZCdWZmZXJSZWYgKmR1bW15X3JlZiA9IGF2X2J1ZmZlcl9yZWYoZHVtbXlfYnVmKTsgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFkdW1teV9yZWYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gZmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVmX291dCA9IGF2X2J1ZmZlcl9jcmVhdGUoZGF0YSwgZGF0YV9zaXplLCBjb21wYXRfdW5yZWZfYnVmZmVyLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlfcmVmLCAoYnVmLT5wZXJtcyAmIEFWX1BFUk1fV1JJVEUpID8gMCA6IEFWX0JVRkZFUl9GTEFHX1JFQURPTkxZKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFyZWZfb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gZmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgaWYgKGN0eC0+b3V0cHV0c1swXS0+dHlwZSAgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZnJhbWUtPmZvcm1hdCk7CisKKyAgICAgICAgcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoZnJhbWUtPmZvcm1hdCk7CisgICAgICAgIGlmICghZGVzYyB8fCBwbGFuZXMgPD0gMCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lczsgaSsrKSB7CisgICAgICAgICAgICBpbnQgdl9zaGlmdCAgICA9IChpID09IDEgfHwgaSA9PSAyKSA/IGRlc2MtPmxvZzJfY2hyb21hX2ggOiAwOworICAgICAgICAgICAgaW50IHBsYW5lX3NpemUgPSAoZnJhbWUtPmhlaWdodCA+PiB2X3NoaWZ0KSAqIGZyYW1lLT5saW5lc2l6ZVtpXTsKKworICAgICAgICAgICAgV1JBUF9QTEFORShmcmFtZS0+YnVmW2ldLCBmcmFtZS0+ZGF0YVtpXSwgcGxhbmVfc2l6ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcGxhbmFyID0gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoZnJhbWUtPmZvcm1hdCk7CisgICAgICAgIGludCBjaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpOworCisgICAgICAgIHBsYW5lcyA9IHBsYW5hciA/IGNoYW5uZWxzIDogMTsKKworICAgICAgICBpZiAocGxhbmVzID4gRkZfQVJSQVlfRUxFTVMoZnJhbWUtPmJ1ZikpIHsKKyAgICAgICAgICAgIGZyYW1lLT5uYl9leHRlbmRlZF9idWYgPSBwbGFuZXMgLSBGRl9BUlJBWV9FTEVNUyhmcmFtZS0+YnVmKTsKKyAgICAgICAgICAgIGZyYW1lLT5leHRlbmRlZF9idWYgPSBhdl9tYWxsb2N6X2FycmF5KHNpemVvZigqZnJhbWUtPmV4dGVuZGVkX2J1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfZXh0ZW5kZWRfYnVmKTsKKyAgICAgICAgICAgIGlmICghZnJhbWUtPmV4dGVuZGVkX2J1ZikgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZNSU4ocGxhbmVzLCBGRl9BUlJBWV9FTEVNUyhmcmFtZS0+YnVmKSk7IGkrKykKKyAgICAgICAgICAgIFdSQVBfUExBTkUoZnJhbWUtPmJ1ZltpXSwgZnJhbWUtPmV4dGVuZGVkX2RhdGFbaV0sIGZyYW1lLT5saW5lc2l6ZVswXSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lcyAtIEZGX0FSUkFZX0VMRU1TKGZyYW1lLT5idWYpOyBpKyspCisgICAgICAgICAgICBXUkFQX1BMQU5FKGZyYW1lLT5leHRlbmRlZF9idWZbaV0sCisgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhW2kgKyBGRl9BUlJBWV9FTEVNUyhmcmFtZS0+YnVmKV0sCisgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgfQorCisgICAgcmV0ID0gYXZfYnVmZmVyc3JjX2FkZF9mcmFtZV9mbGFncyhjdHgsIGZyYW1lLCBmbGFncyk7CisKK2ZhaWw6CisgICAgYXZfYnVmZmVyX3VucmVmKCZkdW1teV9idWYpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKworICAgIHJldHVybiByZXQ7Cit9CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworaW50IGF2X2J1ZmZlcnNyY19idWZmZXIoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRmlsdGVyQnVmZmVyUmVmICpidWYpCit7CisgICAgcmV0dXJuIGF2X2J1ZmZlcnNyY19hZGRfcmVmKGN0eCwgYnVmLCAwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdF92aWRlbyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBCdWZmZXJTb3VyY2VDb250ZXh0ICpjID0gY3R4LT5wcml2OworCisgICAgaWYgKGMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FIHx8ICFjLT53IHx8ICFjLT5oIHx8IGF2X3EyZChjLT50aW1lX2Jhc2UpIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYXJhbWV0ZXJzIHByb3ZpZGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKCEoYy0+ZmlmbyA9IGF2X2ZpZm9fYWxsb2Moc2l6ZW9mKEFWRnJhbWUqKSkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJ3OiVkIGg6JWQgcGl4Zm10OiVzIHRiOiVkLyVkIGZyOiVkLyVkIHNhcjolZC8lZCBzd3NfcGFyYW06JXNcbiIsCisgICAgICAgICAgIGMtPncsIGMtPmgsIGF2X2dldF9waXhfZm10X25hbWUoYy0+cGl4X2ZtdCksCisgICAgICAgICAgIGMtPnRpbWVfYmFzZS5udW0sIGMtPnRpbWVfYmFzZS5kZW4sIGMtPmZyYW1lX3JhdGUubnVtLCBjLT5mcmFtZV9yYXRlLmRlbiwKKyAgICAgICAgICAgYy0+cGl4ZWxfYXNwZWN0Lm51bSwgYy0+cGl4ZWxfYXNwZWN0LmRlbiwgKGNoYXIgKilhdl94X2lmX251bGwoYy0+c3dzX3BhcmFtLCAiIikpOworICAgIGMtPndhcm5pbmdfbGltaXQgPSAxMDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGF2X2J1ZmZlcnNyY19nZXRfbmJfZmFpbGVkX3JlcXVlc3RzKEFWRmlsdGVyQ29udGV4dCAqYnVmZmVyX3NyYykKK3sKKyAgICByZXR1cm4gKChCdWZmZXJTb3VyY2VDb250ZXh0ICopYnVmZmVyX3NyYy0+cHJpdiktPm5iX2ZhaWxlZF9yZXF1ZXN0czsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQnVmZmVyU291cmNlQ29udGV4dCwgeCkKKyNkZWZpbmUgQSBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0KKyNkZWZpbmUgViBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGJ1ZmZlcl9vcHRpb25zW10gPSB7CisgICAgeyAid2lkdGgiLCAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHcpLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWIH0sCisgICAgeyAidmlkZW9fc2l6ZSIsICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHcpLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCAgICAgICAgICAgICAgICAuZmxhZ3MgPSBWIH0sCisgICAgeyAiaGVpZ2h0IiwgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGgpLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWIH0sCisgICAgeyAicGl4X2ZtdCIsICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHBpeF9mbXQpLCAgICAgICAgICBBVl9PUFRfVFlQRV9QSVhFTF9GTVQsIHsgLmk2NCA9IEFWX1BJWF9GTVRfTk9ORSB9LCAubWluID0gQVZfUElYX0ZNVF9OT05FLCAubWF4ID0gSU5UX01BWCwgLmZsYWdzID0gViB9LAorI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKKyAgICAvKiB0aG9zZSA0IGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQgb3B0aW9uIHBhc3Npbmcgc3lzdGVtIHdoZXJlIGVhY2ggZmlsdGVyCisgICAgICogZGlkIGl0cyBvd24gcGFyc2luZyAqLworICAgIHsgInRpbWVfYmFzZV9udW0iLCAiZGVwcmVjYXRlZCwgZG8gbm90IHVzZSIsIE9GRlNFVCh0aW1lX2Jhc2UubnVtKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgICAgIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgViB9LAorICAgIHsgInRpbWVfYmFzZV9kZW4iLCAiZGVwcmVjYXRlZCwgZG8gbm90IHVzZSIsIE9GRlNFVCh0aW1lX2Jhc2UuZGVuKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgICAgIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgViB9LAorICAgIHsgInNhcl9udW0iLCAgICAgICAiZGVwcmVjYXRlZCwgZG8gbm90IHVzZSIsIE9GRlNFVChwaXhlbF9hc3BlY3QubnVtKSwgQVZfT1BUX1RZUEVfSU5ULCAgICAgIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgViB9LAorICAgIHsgInNhcl9kZW4iLCAgICAgICAiZGVwcmVjYXRlZCwgZG8gbm90IHVzZSIsIE9GRlNFVChwaXhlbF9hc3BlY3QuZGVuKSwgQVZfT1BUX1RZUEVfSU5ULCAgICAgIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgViB9LAorI2VuZGlmCisgICAgeyAic2FyIiwgICAgICAgICAgICJzYW1wbGUgYXNwZWN0IHJhdGlvIiwgICAgT0ZGU0VUKHBpeGVsX2FzcGVjdCksICAgICBBVl9PUFRfVFlQRV9SQVRJT05BTCwgeyAuZGJsID0gMSB9LCAwLCBEQkxfTUFYLCBWIH0sCisgICAgeyAicGl4ZWxfYXNwZWN0IiwgICJzYW1wbGUgYXNwZWN0IHJhdGlvIiwgICAgT0ZGU0VUKHBpeGVsX2FzcGVjdCksICAgICBBVl9PUFRfVFlQRV9SQVRJT05BTCwgeyAuZGJsID0gMSB9LCAwLCBEQkxfTUFYLCBWIH0sCisgICAgeyAidGltZV9iYXNlIiwgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHRpbWVfYmFzZSksICAgICAgICBBVl9PUFRfVFlQRV9SQVRJT05BTCwgeyAuZGJsID0gMCB9LCAwLCBEQkxfTUFYLCBWIH0sCisgICAgeyAiZnJhbWVfcmF0ZSIsICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGZyYW1lX3JhdGUpLCAgICAgICBBVl9PUFRfVFlQRV9SQVRJT05BTCwgeyAuZGJsID0gMCB9LCAwLCBEQkxfTUFYLCBWIH0sCisgICAgeyAic3dzX3BhcmFtIiwgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHN3c19wYXJhbSksICAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsICAgICAgICAgICAgICAgICAgICAuZmxhZ3MgPSBWIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYnVmZmVyKTsKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFidWZmZXJfb3B0aW9uc1tdID0geworICAgIHsgInRpbWVfYmFzZSIsICAgICAgTlVMTCwgT0ZGU0VUKHRpbWVfYmFzZSksICAgICAgICAgICBBVl9PUFRfVFlQRV9SQVRJT05BTCwgeyAuZGJsID0gMCB9LCAwLCBJTlRfTUFYLCBBIH0sCisgICAgeyAic2FtcGxlX3JhdGUiLCAgICBOVUxMLCBPRkZTRVQoc2FtcGxlX3JhdGUpLCAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIEEgfSwKKyAgICB7ICJzYW1wbGVfZm10IiwgICAgIE5VTEwsIE9GRlNFVChzYW1wbGVfZm10KSwgICAgICAgICAgQVZfT1BUX1RZUEVfU0FNUExFX0ZNVCwgeyAuaTY0ID0gQVZfU0FNUExFX0ZNVF9OT05FIH0sIC5taW4gPSBBVl9TQU1QTEVfRk1UX05PTkUsIC5tYXggPSBJTlRfTUFYLCAuZmxhZ3MgPSBBIH0sCisgICAgeyAiY2hhbm5lbF9sYXlvdXQiLCBOVUxMLCBPRkZTRVQoY2hhbm5lbF9sYXlvdXRfc3RyKSwgIEFWX09QVF9UWVBFX1NUUklORywgICAgICAgICAgICAgLmZsYWdzID0gQSB9LAorICAgIHsgImNoYW5uZWxzIiwgICAgICAgTlVMTCwgT0ZGU0VUKGNoYW5uZWxzKSwgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBBIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYWJ1ZmZlcik7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0X2F1ZGlvKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEJ1ZmZlclNvdXJjZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAocy0+c2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiU2FtcGxlIGZvcm1hdCB3YXMgbm90IHNldCBvciB3YXMgaW52YWxpZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKHMtPmNoYW5uZWxfbGF5b3V0X3N0cikgeworICAgICAgICBpbnQgbjsKKworICAgICAgICBzLT5jaGFubmVsX2xheW91dCA9IGF2X2dldF9jaGFubmVsX2xheW91dChzLT5jaGFubmVsX2xheW91dF9zdHIpOworICAgICAgICBpZiAoIXMtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNoYW5uZWwgbGF5b3V0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5jaGFubmVsX2xheW91dF9zdHIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBuID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHMtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgaWYgKHMtPmNoYW5uZWxzKSB7CisgICAgICAgICAgICBpZiAobiAhPSBzLT5jaGFubmVscykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk1pc21hdGNoaW5nIGNoYW5uZWwgY291bnQgJWQgYW5kIGxheW91dCAnJXMnICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiglZCBjaGFubmVscylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxzLCBzLT5jaGFubmVsX2xheW91dF9zdHIsIG4pOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcy0+Y2hhbm5lbHMgPSBuOworICAgIH0gZWxzZSBpZiAoIXMtPmNoYW5uZWxzKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5laXRoZXIgbnVtYmVyIG9mIGNoYW5uZWxzIG5vciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbGF5b3V0IHNwZWNpZmllZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKCEocy0+ZmlmbyA9IGF2X2ZpZm9fYWxsb2Moc2l6ZW9mKEFWRnJhbWUqKSkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKCFzLT50aW1lX2Jhc2UubnVtKQorICAgICAgICBzLT50aW1lX2Jhc2UgPSAoQVZSYXRpb25hbCl7MSwgcy0+c2FtcGxlX3JhdGV9OworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICJ0YjolZC8lZCBzYW1wbGVmbXQ6JXMgc2FtcGxlcmF0ZTolZCBjaGxheW91dDolc1xuIiwKKyAgICAgICAgICAgcy0+dGltZV9iYXNlLm51bSwgcy0+dGltZV9iYXNlLmRlbiwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShzLT5zYW1wbGVfZm10KSwKKyAgICAgICAgICAgcy0+c2FtcGxlX3JhdGUsIHMtPmNoYW5uZWxfbGF5b3V0X3N0cik7CisgICAgcy0+d2FybmluZ19saW1pdCA9IDEwMDsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEJ1ZmZlclNvdXJjZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgd2hpbGUgKHMtPmZpZm8gJiYgYXZfZmlmb19zaXplKHMtPmZpZm8pKSB7CisgICAgICAgIEFWRnJhbWUgKmZyYW1lOworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzLT5maWZvLCAmZnJhbWUsIHNpemVvZihmcmFtZSksIE5VTEwpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgfQorICAgIGF2X2ZpZm9fZnJlZXAoJnMtPmZpZm8pOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQnVmZmVyU291cmNlQ29udGV4dCAqYyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpjaGFubmVsX2xheW91dHMgPSBOVUxMOworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyA9IE5VTEw7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpzYW1wbGVyYXRlcyA9IE5VTEw7CisKKyAgICBzd2l0Y2ggKGN0eC0+b3V0cHV0c1swXS0+dHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBmZl9hZGRfZm9ybWF0KCZmb3JtYXRzLCBjLT5waXhfZm10KTsKKyAgICAgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBmZl9hZGRfZm9ybWF0KCZmb3JtYXRzLCAgICAgICAgICAgYy0+c2FtcGxlX2ZtdCk7CisgICAgICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworCisgICAgICAgIGZmX2FkZF9mb3JtYXQoJnNhbXBsZXJhdGVzLCAgICAgICBjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBzYW1wbGVyYXRlcyk7CisKKyAgICAgICAgZmZfYWRkX2NoYW5uZWxfbGF5b3V0KCZjaGFubmVsX2xheW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jaGFubmVsX2xheW91dCA/IGMtPmNoYW5uZWxfbGF5b3V0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0NPVU5UMkxBWU9VVChjLT5jaGFubmVscykpOworICAgICAgICBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGNoYW5uZWxfbGF5b3V0cyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBCdWZmZXJTb3VyY2VDb250ZXh0ICpjID0gbGluay0+c3JjLT5wcml2OworCisgICAgc3dpdGNoIChsaW5rLT50eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIGxpbmstPncgPSBjLT53OworICAgICAgICBsaW5rLT5oID0gYy0+aDsKKyAgICAgICAgbGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGMtPnBpeGVsX2FzcGVjdDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIGlmICghYy0+Y2hhbm5lbF9sYXlvdXQpCisgICAgICAgICAgICBjLT5jaGFubmVsX2xheW91dCA9IGxpbmstPmNoYW5uZWxfbGF5b3V0OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGxpbmstPnRpbWVfYmFzZSA9IGMtPnRpbWVfYmFzZTsKKyAgICBsaW5rLT5mcmFtZV9yYXRlID0gYy0+ZnJhbWVfcmF0ZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBCdWZmZXJTb3VyY2VDb250ZXh0ICpjID0gbGluay0+c3JjLT5wcml2OworICAgIEFWRnJhbWUgKmZyYW1lOworCisgICAgaWYgKCFhdl9maWZvX3NpemUoYy0+ZmlmbykpIHsKKyAgICAgICAgaWYgKGMtPmVvZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICAgICAgYy0+bmJfZmFpbGVkX3JlcXVlc3RzKys7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgfQorICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKGMtPmZpZm8sICZmcmFtZSwgc2l6ZW9mKGZyYW1lKSwgTlVMTCk7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGxpbmssIGZyYW1lKTsKK30KKworc3RhdGljIGludCBwb2xsX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBCdWZmZXJTb3VyY2VDb250ZXh0ICpjID0gbGluay0+c3JjLT5wcml2OworICAgIGludCBzaXplID0gYXZfZmlmb19zaXplKGMtPmZpZm8pOworICAgIGlmICghc2l6ZSAmJiBjLT5lb2YpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICByZXR1cm4gc2l6ZS9zaXplb2YoQVZGcmFtZSopOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdnNyY19idWZmZXJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5wb2xsX2ZyYW1lICAgID0gcG9sbF9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdnNyY19idWZmZXIgPSB7CisgICAgLm5hbWUgICAgICA9ICJidWZmZXIiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCdWZmZXIgdmlkZW8gZnJhbWVzLCBhbmQgbWFrZSB0aGVtIGFjY2Vzc2libGUgdG8gdGhlIGZpbHRlcmNoYWluLiIpLAorICAgIC5wcml2X3NpemUgPSBzaXplb2YoQnVmZmVyU291cmNlQ29udGV4dCksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorCisgICAgLmluaXQgICAgICA9IGluaXRfdmlkZW8sCisgICAgLnVuaW5pdCAgICA9IHVuaW5pdCwKKworICAgIC5pbnB1dHMgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgPSBhdmZpbHRlcl92c3JjX2J1ZmZlcl9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzID0gJmJ1ZmZlcl9jbGFzcywKK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl9hc3JjX2FidWZmZXJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5wb2xsX2ZyYW1lICAgID0gcG9sbF9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYXNyY19hYnVmZmVyID0geworICAgIC5uYW1lICAgICAgICAgID0gImFidWZmZXIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJ1ZmZlciBhdWRpbyBmcmFtZXMsIGFuZCBtYWtlIHRoZW0gYWNjZXNzaWJsZSB0byB0aGUgZmlsdGVyY2hhaW4uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQnVmZmVyU291cmNlQ29udGV4dCksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorCisgICAgLmluaXQgICAgICA9IGluaXRfYXVkaW8sCisgICAgLnVuaW5pdCAgICA9IHVuaW5pdCwKKworICAgIC5pbnB1dHMgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgPSBhdmZpbHRlcl9hc3JjX2FidWZmZXJfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyA9ICZhYnVmZmVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9idWZmZXJzcmMuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9idWZmZXJzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTM0YzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0JVRkZFUlNSQ19ICisjZGVmaW5lIEFWRklMVEVSX0JVRkZFUlNSQ19ICisKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdmZpX2J1ZmZlcnNyYworICogTWVtb3J5IGJ1ZmZlciBzb3VyY2UgQVBJLgorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorCisvKioKKyAqIEBkZWZncm91cCBsYXZmaV9idWZmZXJzcmMgQnVmZmVyIHNvdXJjZSBBUEkKKyAqIEBpbmdyb3VwIGxhdmZpCisgKiBAeworICovCisKK2VudW0geworCisgICAgLyoqCisgICAgICogRG8gbm90IGNoZWNrIGZvciBmb3JtYXQgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBBVl9CVUZGRVJTUkNfRkxBR19OT19DSEVDS19GT1JNQVQgPSAxLAorCisjaWYgRkZfQVBJX0FWRklMVEVSQlVGRkVSCisgICAgLyoqCisgICAgICogSWdub3JlZAorICAgICAqLworICAgIEFWX0JVRkZFUlNSQ19GTEFHX05PX0NPUFkgPSAyLAorI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBJbW1lZGlhdGVseSBwdXNoIHRoZSBmcmFtZSB0byB0aGUgb3V0cHV0LgorICAgICAqLworICAgIEFWX0JVRkZFUlNSQ19GTEFHX1BVU0ggPSA0LAorCisgICAgLyoqCisgICAgICogS2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgZnJhbWUuCisgICAgICogSWYgdGhlIGZyYW1lIGlmIHJlZmVyZW5jZS1jb3VudGVkLCBjcmVhdGUgYSBuZXcgcmVmZXJlbmNlOyBvdGhlcndpc2UKKyAgICAgKiBjb3B5IHRoZSBmcmFtZSBkYXRhLgorICAgICAqLworICAgIEFWX0JVRkZFUlNSQ19GTEFHX0tFRVBfUkVGID0gOCwKKworfTsKKworLyoqCisgKiBBZGQgYnVmZmVyIGRhdGEgaW4gcGljcmVmIHRvIGJ1ZmZlcl9zcmMuCisgKgorICogQHBhcmFtIGJ1ZmZlcl9zcmMgIHBvaW50ZXIgdG8gYSBidWZmZXIgc291cmNlIGNvbnRleHQKKyAqIEBwYXJhbSBwaWNyZWYgICAgICBhIGJ1ZmZlciByZWZlcmVuY2UsIG9yIE5VTEwgdG8gbWFyayBFT0YKKyAqIEBwYXJhbSBmbGFncyAgICAgICBhIGNvbWJpbmF0aW9uIG9mIEFWX0JVRkZFUlNSQ19GTEFHXyoKKyAqIEByZXR1cm4gICAgICAgICAgICA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUKKyAqICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGF2X2J1ZmZlcnNyY19hZGRfcmVmKEFWRmlsdGVyQ29udGV4dCAqYnVmZmVyX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckJ1ZmZlclJlZiAqcGljcmVmLCBpbnQgZmxhZ3MpOworCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0cy4KKyAqCisgKiBBIGZhaWxlZCByZXF1ZXN0IGlzIHdoZW4gdGhlIHJlcXVlc3RfZnJhbWUgbWV0aG9kIGlzIGNhbGxlZCB3aGlsZSBubworICogZnJhbWUgaXMgcHJlc2VudCBpbiB0aGUgYnVmZmVyLgorICogVGhlIG51bWJlciBpcyByZXNldCB3aGVuIGEgZnJhbWUgaXMgYWRkZWQuCisgKi8KK3Vuc2lnbmVkIGF2X2J1ZmZlcnNyY19nZXRfbmJfZmFpbGVkX3JlcXVlc3RzKEFWRmlsdGVyQ29udGV4dCAqYnVmZmVyX3NyYyk7CisKKyNpZiBGRl9BUElfQVZGSUxURVJCVUZGRVIKKy8qKgorICogQWRkIGEgYnVmZmVyIHRvIGEgZmlsdGVyZ3JhcGguCisgKgorICogQHBhcmFtIGN0eCBhbiBpbnN0YW5jZSBvZiB0aGUgYnVmZmVyc3JjIGZpbHRlcgorICogQHBhcmFtIGJ1ZiBidWZmZXIgY29udGFpbmluZyBmcmFtZSBkYXRhIHRvIGJlIHBhc3NlZCBkb3duIHRoZSBmaWx0ZXJncmFwaC4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIG93bmVyc2hpcCBvZiBidWYsIHRoZSB1c2VyIG11c3Qgbm90IGZyZWUgaXQuCisgKiBBIE5VTEwgYnVmIHNpZ25hbHMgRU9GIC0tIGkuZS4gbm8gbW9yZSBmcmFtZXMgd2lsbCBiZSBzZW50IHRvIHRoaXMgZmlsdGVyLgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBhdl9idWZmZXJzcmNfd3JpdGVfZnJhbWUoKSBvciBhdl9idWZmZXJzcmNfYWRkX2ZyYW1lKCkKKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK2ludCBhdl9idWZmZXJzcmNfYnVmZmVyKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZpbHRlckJ1ZmZlclJlZiAqYnVmKTsKKyNlbmRpZgorCisvKioKKyAqIEFkZCBhIGZyYW1lIHRvIHRoZSBidWZmZXIgc291cmNlLgorICoKKyAqIEBwYXJhbSBjdHggICBhbiBpbnN0YW5jZSBvZiB0aGUgYnVmZmVyc3JjIGZpbHRlcgorICogQHBhcmFtIGZyYW1lIGZyYW1lIHRvIGJlIGFkZGVkLiBJZiB0aGUgZnJhbWUgaXMgcmVmZXJlbmNlIGNvdW50ZWQsIHRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgbWFrZSBhIG5ldyByZWZlcmVuY2UgdG8gaXQuIE90aGVyd2lzZSB0aGUgZnJhbWUgZGF0YSB3aWxsIGJlCisgKiBjb3BpZWQuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBvbiBlcnJvcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBhdl9idWZmZXJzcmNfYWRkX2ZyYW1lX2ZsYWdzKCkgd2l0aCB0aGUKKyAqIEFWX0JVRkZFUlNSQ19GTEFHX0tFRVBfUkVGIGZsYWcuCisgKi8KK2ludCBhdl9idWZmZXJzcmNfd3JpdGVfZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBBZGQgYSBmcmFtZSB0byB0aGUgYnVmZmVyIHNvdXJjZS4KKyAqCisgKiBAcGFyYW0gY3R4ICAgYW4gaW5zdGFuY2Ugb2YgdGhlIGJ1ZmZlcnNyYyBmaWx0ZXIKKyAqIEBwYXJhbSBmcmFtZSBmcmFtZSB0byBiZSBhZGRlZC4gSWYgdGhlIGZyYW1lIGlzIHJlZmVyZW5jZSBjb3VudGVkLCB0aGlzCisgKiBmdW5jdGlvbiB3aWxsIHRha2Ugb3duZXJzaGlwIG9mIHRoZSByZWZlcmVuY2UocykgYW5kIHJlc2V0IHRoZSBmcmFtZS4KKyAqIE90aGVyd2lzZSB0aGUgZnJhbWUgZGF0YSB3aWxsIGJlIGNvcGllZC4gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yLAorICogdGhlIGlucHV0IGZyYW1lIGlzIG5vdCB0b3VjaGVkLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1Igb24gZXJyb3IuCisgKgorICogQG5vdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCBhdl9idWZmZXJzcmNfd3JpdGVfZnJhbWUoKSBpcworICogdGhhdCBhdl9idWZmZXJzcmNfd3JpdGVfZnJhbWUoKSBjcmVhdGVzIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgaW5wdXQgZnJhbWUsCisgKiB3aGlsZSB0aGlzIGZ1bmN0aW9uIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcmVmZXJlbmNlIHBhc3NlZCB0byBpdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYXZfYnVmZmVyc3JjX2FkZF9mcmFtZV9mbGFncygpIHdpdGhvdXQgdGhlCisgKiBBVl9CVUZGRVJTUkNfRkxBR19LRUVQX1JFRiBmbGFnLgorICovCitpbnQgYXZfYnVmZmVyc3JjX2FkZF9mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUpOworCisvKioKKyAqIEFkZCBhIGZyYW1lIHRvIHRoZSBidWZmZXIgc291cmNlLgorICoKKyAqIEJ5IGRlZmF1bHQsIGlmIHRoZSBmcmFtZSBpcyByZWZlcmVuY2UtY291bnRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHRha2UKKyAqIG93bmVyc2hpcCBvZiB0aGUgcmVmZXJlbmNlKHMpIGFuZCByZXNldCB0aGUgZnJhbWUuIFRoaXMgY2FuIGJlIGNvbnRyb2xsZWQKKyAqIHVzaW5nIHRoZSBmbGFncy4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IsIHRoZSBpbnB1dCBmcmFtZSBpcyBub3QgdG91Y2hlZC4KKyAqCisgKiBAcGFyYW0gYnVmZmVyX3NyYyAgcG9pbnRlciB0byBhIGJ1ZmZlciBzb3VyY2UgY29udGV4dAorICogQHBhcmFtIGZyYW1lICAgICAgIGEgZnJhbWUsIG9yIE5VTEwgdG8gbWFyayBFT0YKKyAqIEBwYXJhbSBmbGFncyAgICAgICBhIGNvbWJpbmF0aW9uIG9mIEFWX0JVRkZFUlNSQ19GTEFHXyoKKyAqIEByZXR1cm4gICAgICAgICAgICA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUKKyAqICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGF2X2J1ZmZlcnNyY19hZGRfZnJhbWVfZmxhZ3MoQVZGaWx0ZXJDb250ZXh0ICpidWZmZXJfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncyk7CisKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBVkZJTFRFUl9CVUZGRVJTUkNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2Rlc2hha2UuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9kZXNoYWtlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjZDZjMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9kZXNoYWtlLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgV2VpIEdhbyA8d2VpZ2FvQG11bHRpY29yZXdhcmVpbmMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIExlbm55IFdhbmcKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9ERVNIQUtFX0gKKyNkZWZpbmUgQVZGSUxURVJfREVTSEFLRV9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgInRyYW5zZm9ybS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhlbHV0aWxzLmgiCisjaWYgQ09ORklHX09QRU5DTAorI2luY2x1ZGUgImxpYmF2dXRpbC9vcGVuY2wuaCIKKyNlbmRpZgorCisKK2VudW0gU2VhcmNoTWV0aG9kIHsKKyAgICBFWEhBVVNUSVZFLCAgICAgICAgLy8vPCBTZWFyY2ggYWxsIHBvc3NpYmxlIHBvc2l0aW9ucworICAgIFNNQVJUX0VYSEFVU1RJVkUsICAvLy88IFNlYXJjaCBtb3N0IHBvc3NpYmxlIHBvc2l0aW9ucyAoZmFzdGVyKQorICAgIFNFQVJDSF9DT1VOVAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB4OyAgICAgICAgICAgICAvLy88IEhvcml6b250YWwgc2hpZnQKKyAgICBpbnQgeTsgICAgICAgICAgICAgLy8vPCBWZXJ0aWNhbCBzaGlmdAorfSBJbnRNb3Rpb25WZWN0b3I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBkb3VibGUgeDsgICAgICAgICAgICAgLy8vPCBIb3Jpem9udGFsIHNoaWZ0CisgICAgZG91YmxlIHk7ICAgICAgICAgICAgIC8vLzwgVmVydGljYWwgc2hpZnQKK30gTW90aW9uVmVjdG9yOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTW90aW9uVmVjdG9yIHZlYzsgICAgIC8vLzwgTW90aW9uIHZlY3RvcgorICAgIGRvdWJsZSBhbmdsZTsgICAgICAgICAvLy88IEFuZ2xlIG9mIHJvdGF0aW9uCisgICAgZG91YmxlIHpvb207ICAgICAgICAgIC8vLzwgWm9vbSBwZXJjZW50YWdlCit9IFRyYW5zZm9ybTsKKworI2lmIENPTkZJR19PUEVOQ0wKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZTsKKyAgICBjbF9wcm9ncmFtIHByb2dyYW07CisgICAgY2xfa2VybmVsIGtlcm5lbF9sdW1hOworICAgIGNsX2tlcm5lbCBrZXJuZWxfY2hyb21hOworICAgIGludCBpbl9wbGFuZV9zaXplWzhdOworICAgIGludCBvdXRfcGxhbmVfc2l6ZVs4XTsKKyAgICBpbnQgcGxhbmVfbnVtOworICAgIGNsX21lbSBjbF9pbmJ1ZjsKKyAgICBzaXplX3QgY2xfaW5idWZfc2l6ZTsKKyAgICBjbF9tZW0gY2xfb3V0YnVmOworICAgIHNpemVfdCBjbF9vdXRidWZfc2l6ZTsKK30gRGVzaGFrZU9wZW5jbENvbnRleHQ7CisKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9SIDY0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgY291bnRzWzIqTUFYX1IrMV1bMipNQVhfUisxXTsgLy8vIDwgU2NyYXRjaCBidWZmZXIgZm9yIG1vdGlvbiBzZWFyY2gKKyAgICBkb3VibGUgKmFuZ2xlczsgICAgICAgICAgICAvLy88IFNjcmF0Y2ggYnVmZmVyIGZvciBibG9jayBhbmdsZXMKKyAgICB1bnNpZ25lZCBhbmdsZXNfc2l6ZTsKKyAgICBBVkZyYW1lICpyZWY7ICAgICAgICAgICAgICAvLy88IFByZXZpb3VzIGZyYW1lCisgICAgaW50IHJ4OyAgICAgICAgICAgICAgICAgICAgLy8vPCBNYXhpbXVtIGhvcml6b250YWwgc2hpZnQKKyAgICBpbnQgcnk7ICAgICAgICAgICAgICAgICAgICAvLy88IE1heGltdW0gdmVydGljYWwgc2hpZnQKKyAgICBpbnQgZWRnZTsgICAgICAgICAgICAgICAgICAvLy88IEVkZ2UgZmlsbCBtZXRob2QKKyAgICBpbnQgYmxvY2tzaXplOyAgICAgICAgICAgICAvLy88IFNpemUgb2YgYmxvY2tzIHRvIGNvbXBhcmUKKyAgICBpbnQgY29udHJhc3Q7ICAgICAgICAgICAgICAvLy88IENvbnRyYXN0IHRocmVzaG9sZAorICAgIGludCBzZWFyY2g7ICAgICAgICAgICAgICAgIC8vLzwgTW90aW9uIHNlYXJjaCBtZXRob2QKKyAgICBhdl9waXhlbHV0aWxzX3NhZF9mbiBzYWQ7ICAvLy88IFN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBmdW5jdGlvbgorICAgIFRyYW5zZm9ybSBsYXN0OyAgICAgICAgICAgIC8vLzwgVHJhbnNmb3JtIGZyb20gbGFzdCBmcmFtZQorICAgIGludCByZWZjb3VudDsgICAgICAgICAgICAgIC8vLzwgTnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgKGRlZmluZXMgYXZlcmFnaW5nIHdpbmRvdykKKyAgICBGSUxFICpmcDsKKyAgICBUcmFuc2Zvcm0gYXZnOworICAgIGludCBjdzsgICAgICAgICAgICAgICAgICAgIC8vLzwgQ3JvcCBtb3Rpb24gc2VhcmNoIHRvIHRoaXMgYm94CisgICAgaW50IGNoOworICAgIGludCBjeDsKKyAgICBpbnQgY3k7CisgICAgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgLy8vPCBNb3Rpb24gc2VhcmNoIGRldGFpbGVkIGxvZyBmaWxlbmFtZQorICAgIGludCBvcGVuY2w7CisjaWYgQ09ORklHX09QRU5DTAorICAgIERlc2hha2VPcGVuY2xDb250ZXh0IG9wZW5jbF9jdHg7CisjZW5kaWYKKyAgICBpbnQgKCogdHJhbnNmb3JtKShBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgY3csIGludCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbWF0cml4X3ksIGNvbnN0IGZsb2F0ICptYXRyaXhfdXYsIGVudW0gSW50ZXJwb2xhdGVNZXRob2QgaW50ZXJwb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgZW51bSBGaWxsTWV0aG9kIGZpbGwsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQpOworfSBEZXNoYWtlQ29udGV4dDsKKworI2VuZGlmIC8qIEFWRklMVEVSX0RFU0hBS0VfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2Rlc2hha2Vfb3BlbmNsLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZGVzaGFrZV9vcGVuY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODIxMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2Rlc2hha2Vfb3BlbmNsLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgV2VpIEdhbyA8d2VpZ2FvQG11bHRpY29yZXdhcmVpbmMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIExlbm55IFdhbmcKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogdHJhbnNmb3JtIGlucHV0IHZpZGVvCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiZGVzaGFrZV9vcGVuY2wuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3BlbmNsX2ludGVybmFsLmgiCisKKyNkZWZpbmUgUExBTkVfTlVNIDMKKyNkZWZpbmUgUk9VTkRfVE9fMTYoYSkgKCgoKChhKSAtIDEpLzE2KSsxKSoxNikKKworaW50IGZmX29wZW5jbF90cmFuc2Zvcm0oQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBjdywgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKm1hdHJpeF95LCBjb25zdCBmbG9hdCAqbWF0cml4X3V2LAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBJbnRlcnBvbGF0ZU1ldGhvZCBpbnRlcnBvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gRmlsbE1ldGhvZCBmaWxsLCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0KQoreworICAgIGludCByZXQgPSAwOworICAgIGNsX2ludCBzdGF0dXM7CisgICAgRGVzaGFrZUNvbnRleHQgKmRlc2hha2UgPSBjdHgtPnByaXY7CisgICAgZmxvYXQ0IHBhY2tlZF9tYXRyaXhfbHUgPSB7bWF0cml4X3lbMF0sIG1hdHJpeF95WzFdLCBtYXRyaXhfeVsyXSwgbWF0cml4X3lbNV19OworICAgIGZsb2F0NCBwYWNrZWRfbWF0cml4X2NoID0ge21hdHJpeF91dlswXSwgbWF0cml4X3V2WzFdLCBtYXRyaXhfdXZbMl0sIG1hdHJpeF91dls1XX07CisgICAgc2l6ZV90IGdsb2JhbF93b3Jrc2l6ZV9sdVsyXSA9IHsoc2l6ZV90KVJPVU5EX1RPXzE2KHdpZHRoKSwgKHNpemVfdClST1VORF9UT18xNihoZWlnaHQpfTsKKyAgICBzaXplX3QgZ2xvYmFsX3dvcmtzaXplX2NoWzJdID0geyhzaXplX3QpUk9VTkRfVE9fMTYoY3cpLCAoc2l6ZV90KSgyKlJPVU5EX1RPXzE2KGNoKSl9OworICAgIHNpemVfdCBsb2NhbF93b3Jrc2l6ZVsyXSA9IHsxNiwgMTZ9OworICAgIEZGT3BlbmNsUGFyYW0gcGFyYW1fbHUgPSB7MH07CisgICAgRkZPcGVuY2xQYXJhbSBwYXJhbV9jaCA9IHswfTsKKyAgICBwYXJhbV9sdS5jdHggPSBwYXJhbV9jaC5jdHggPSBjdHg7CisgICAgcGFyYW1fbHUua2VybmVsID0gZGVzaGFrZS0+b3BlbmNsX2N0eC5rZXJuZWxfbHVtYTsKKyAgICBwYXJhbV9jaC5rZXJuZWwgPSBkZXNoYWtlLT5vcGVuY2xfY3R4Lmtlcm5lbF9jaHJvbWE7CisKKyAgICBpZiAoKHVuc2lnbmVkIGludClpbnRlcnBvbGF0ZSA+IElOVEVSUE9MQVRFX0JJUVVBRFJBVElDKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlNlbGVjdGVkIGludGVycG9sYXRlIG1ldGhvZCBpcyBpbnZhbGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0ID0gYXZwcml2X29wZW5jbF9zZXRfcGFyYW1ldGVyKCZwYXJhbV9sdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX2luYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX291dGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8ocGFja2VkX21hdHJpeF9sdSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oaW50ZXJwb2xhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGZpbGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGluLT5saW5lc2l6ZVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8ob3V0LT5saW5lc2l6ZVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oaGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gYXZwcml2X29wZW5jbF9zZXRfcGFyYW1ldGVyKCZwYXJhbV9jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX2luYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX291dGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8ocGFja2VkX21hdHJpeF9jaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oaW50ZXJwb2xhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGZpbGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGluLT5saW5lc2l6ZVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8ob3V0LT5saW5lc2l6ZVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oaW4tPmxpbmVzaXplWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhvdXQtPmxpbmVzaXplWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhoZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhjaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oY3cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHN0YXR1cyA9IGNsRW5xdWV1ZU5EUmFuZ2VLZXJuZWwoZGVzaGFrZS0+b3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5rZXJuZWxfbHVtYSwgMiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF93b3Jrc2l6ZV9sdSwgbG9jYWxfd29ya3NpemUsIDAsIE5VTEwsIE5VTEwpOworICAgIHN0YXR1cyB8PSBjbEVucXVldWVORFJhbmdlS2VybmVsKGRlc2hha2UtPm9wZW5jbF9jdHguY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHgua2VybmVsX2Nocm9tYSwgMiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF93b3Jrc2l6ZV9jaCwgbG9jYWxfd29ya3NpemUsIDAsIE5VTEwsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPcGVuQ0wgcnVuIGtlcm5lbCBlcnJvciBvY2N1cnJlZDogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyAgICByZXQgPSBhdl9vcGVuY2xfYnVmZmVyX3JlYWRfaW1hZ2Uob3V0LT5kYXRhLCBkZXNoYWtlLT5vcGVuY2xfY3R4Lm91dF9wbGFuZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNoYWtlLT5vcGVuY2xfY3R4LnBsYW5lX251bSwgZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9vdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHguY2xfb3V0YnVmX3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9vcGVuY2xfZGVzaGFrZV9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCByZXQgPSAwOworICAgIERlc2hha2VDb250ZXh0ICpkZXNoYWtlID0gY3R4LT5wcml2OworICAgIHJldCA9IGF2X29wZW5jbF9pbml0KE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGRlc2hha2UtPm9wZW5jbF9jdHgucGxhbmVfbnVtID0gUExBTkVfTlVNOworICAgIGRlc2hha2UtPm9wZW5jbF9jdHguY29tbWFuZF9xdWV1ZSA9IGF2X29wZW5jbF9nZXRfY29tbWFuZF9xdWV1ZSgpOworICAgIGlmICghZGVzaGFrZS0+b3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBnZXQgT3BlbkNMIGNvbW1hbmQgcXVldWUgaW4gZmlsdGVyICdkZXNoYWtlJ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGRlc2hha2UtPm9wZW5jbF9jdHgucHJvZ3JhbSA9IGF2X29wZW5jbF9jb21waWxlKCJhdmZpbHRlcl90cmFuc2Zvcm0iLCBOVUxMKTsKKyAgICBpZiAoIWRlc2hha2UtPm9wZW5jbF9jdHgucHJvZ3JhbSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPcGVuQ0wgZmFpbGVkIHRvIGNvbXBpbGUgcHJvZ3JhbSAnYXZmaWx0ZXJfdHJhbnNmb3JtJ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmICghZGVzaGFrZS0+b3BlbmNsX2N0eC5rZXJuZWxfbHVtYSkgeworICAgICAgICBkZXNoYWtlLT5vcGVuY2xfY3R4Lmtlcm5lbF9sdW1hID0gY2xDcmVhdGVLZXJuZWwoZGVzaGFrZS0+b3BlbmNsX2N0eC5wcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF2ZmlsdGVyX3RyYW5zZm9ybV9sdW1hIiwgJnJldCk7CisgICAgICAgIGlmIChyZXQgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3BlbkNMIGZhaWxlZCB0byBjcmVhdGUga2VybmVsICdhdmZpbHRlcl90cmFuc2Zvcm1fbHVtYSdcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWRlc2hha2UtPm9wZW5jbF9jdHgua2VybmVsX2Nocm9tYSkgeworICAgICAgICBkZXNoYWtlLT5vcGVuY2xfY3R4Lmtlcm5lbF9jaHJvbWEgPSBjbENyZWF0ZUtlcm5lbChkZXNoYWtlLT5vcGVuY2xfY3R4LnByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdmZpbHRlcl90cmFuc2Zvcm1fY2hyb21hIiwgJnJldCk7CisgICAgICAgIGlmIChyZXQgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3BlbkNMIGZhaWxlZCB0byBjcmVhdGUga2VybmVsICdhdmZpbHRlcl90cmFuc2Zvcm1fY2hyb21hJ1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZmZfb3BlbmNsX2Rlc2hha2VfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIERlc2hha2VDb250ZXh0ICpkZXNoYWtlID0gY3R4LT5wcml2OworICAgIGF2X29wZW5jbF9idWZmZXJfcmVsZWFzZSgmZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9pbmJ1Zik7CisgICAgYXZfb3BlbmNsX2J1ZmZlcl9yZWxlYXNlKCZkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX291dGJ1Zik7CisgICAgY2xSZWxlYXNlS2VybmVsKGRlc2hha2UtPm9wZW5jbF9jdHgua2VybmVsX2x1bWEpOworICAgIGNsUmVsZWFzZUtlcm5lbChkZXNoYWtlLT5vcGVuY2xfY3R4Lmtlcm5lbF9jaHJvbWEpOworICAgIGNsUmVsZWFzZVByb2dyYW0oZGVzaGFrZS0+b3BlbmNsX2N0eC5wcm9ncmFtKTsKKyAgICBkZXNoYWtlLT5vcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUgPSBOVUxMOworICAgIGF2X29wZW5jbF91bmluaXQoKTsKK30KKworaW50IGZmX29wZW5jbF9kZXNoYWtlX3Byb2Nlc3NfaW5vdXRfYnVmKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0KQoreworICAgIGludCByZXQgPSAwOworICAgIEFWRmlsdGVyTGluayAqbGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIERlc2hha2VDb250ZXh0ICpkZXNoYWtlID0gY3R4LT5wcml2OworICAgIGNvbnN0IGludCBoc2hpZnQgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGxpbmstPmZvcm1hdCktPmxvZzJfY2hyb21hX2g7CisgICAgaW50IGNocm9tYV9oZWlnaHQgPSBGRl9DRUlMX1JTSElGVChsaW5rLT5oLCBoc2hpZnQpOworCisgICAgaWYgKCghZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9pbmJ1ZikgfHwgKCFkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX291dGJ1ZikpIHsKKyAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5pbl9wbGFuZV9zaXplWzBdICA9IChpbi0+bGluZXNpemVbMF0gKiBpbi0+aGVpZ2h0KTsKKyAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5pbl9wbGFuZV9zaXplWzFdICA9IChpbi0+bGluZXNpemVbMV0gKiBjaHJvbWFfaGVpZ2h0KTsKKyAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5pbl9wbGFuZV9zaXplWzJdICA9IChpbi0+bGluZXNpemVbMl0gKiBjaHJvbWFfaGVpZ2h0KTsKKyAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5vdXRfcGxhbmVfc2l6ZVswXSA9IChvdXQtPmxpbmVzaXplWzBdICogb3V0LT5oZWlnaHQpOworICAgICAgICBkZXNoYWtlLT5vcGVuY2xfY3R4Lm91dF9wbGFuZV9zaXplWzFdID0gKG91dC0+bGluZXNpemVbMV0gKiBjaHJvbWFfaGVpZ2h0KTsKKyAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5vdXRfcGxhbmVfc2l6ZVsyXSA9IChvdXQtPmxpbmVzaXplWzJdICogY2hyb21hX2hlaWdodCk7CisgICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHguY2xfaW5idWZfc2l6ZSAgPSBkZXNoYWtlLT5vcGVuY2xfY3R4LmluX3BsYW5lX3NpemVbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5pbl9wbGFuZV9zaXplWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZVsyXTsKKyAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9vdXRidWZfc2l6ZSA9IGRlc2hha2UtPm9wZW5jbF9jdHgub3V0X3BsYW5lX3NpemVbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5vdXRfcGxhbmVfc2l6ZVsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNoYWtlLT5vcGVuY2xfY3R4Lm91dF9wbGFuZV9zaXplWzJdOworICAgICAgICBpZiAoIWRlc2hha2UtPm9wZW5jbF9jdHguY2xfaW5idWYpIHsKKyAgICAgICAgICAgIHJldCA9IGF2X29wZW5jbF9idWZmZXJfY3JlYXRlKCZkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX2luYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX2luYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX09OTFksIE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWRlc2hha2UtPm9wZW5jbF9jdHguY2xfb3V0YnVmKSB7CisgICAgICAgICAgICByZXQgPSBhdl9vcGVuY2xfYnVmZmVyX2NyZWF0ZSgmZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9vdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHguY2xfb3V0YnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX1dSSVRFLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0ID0gYXZfb3BlbmNsX2J1ZmZlcl93cml0ZV9pbWFnZShkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX2luYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9pbmJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgaW4tPmRhdGEsZGVzaGFrZS0+b3BlbmNsX2N0eC5pbl9wbGFuZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5wbGFuZV9udW0pOworICAgIGlmKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9kZXNoYWtlX29wZW5jbC5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2Rlc2hha2Vfb3BlbmNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwYTI0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9kZXNoYWtlX29wZW5jbC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgV2VpIEdhbyA8d2VpZ2FvQG11bHRpY29yZXdhcmVpbmMuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0RFU0hBS0VfT1BFTkNMX0gKKyNkZWZpbmUgQVZGSUxURVJfREVTSEFLRV9PUEVOQ0xfSAorCisjaW5jbHVkZSAiZGVzaGFrZS5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgeDsKKyAgICBmbG9hdCB5OworICAgIGZsb2F0IHo7CisgICAgZmxvYXQgdzsKK30gZmxvYXQ0OworCitpbnQgZmZfb3BlbmNsX2Rlc2hha2VfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCk7CisKK3ZvaWQgZmZfb3BlbmNsX2Rlc2hha2VfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKKworaW50IGZmX29wZW5jbF9kZXNoYWtlX3Byb2Nlc3NfaW5vdXRfYnVmKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0KTsKKworaW50IGZmX29wZW5jbF90cmFuc2Zvcm0oQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBjdywgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKm1hdHJpeF95LCBjb25zdCBmbG9hdCAqbWF0cml4X3V2LAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBJbnRlcnBvbGF0ZU1ldGhvZCBpbnRlcnBvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gRmlsbE1ldGhvZCBmaWxsLCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0KTsKKworI2VuZGlmIC8qIEFWRklMVEVSX0RFU0hBS0VfT1BFTkNMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9kZXNoYWtlX29wZW5jbF9rZXJuZWwuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9kZXNoYWtlX29wZW5jbF9rZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ1ZDZmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2Rlc2hha2Vfb3BlbmNsX2tlcm5lbC5oCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFdlaSBHYW8gPHdlaWdhb0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBMZW5ueSBXYW5nCisgKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0RFU0hBS0VfT1BFTkNMX0tFUk5FTF9ICisjZGVmaW5lIEFWRklMVEVSX0RFU0hBS0VfT1BFTkNMX0tFUk5FTF9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3BlbmNsLmgiCisKK2NvbnN0IGNoYXIgKmZmX2tlcm5lbF9kZXNoYWtlX29wZW5jbCA9IEFWX09QRU5DTF9LRVJORUwoCitpbmxpbmUgdW5zaWduZWQgY2hhciBwaXhlbChnbG9iYWwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsaW50IHN0cmlkZSwgdW5zaWduZWQgY2hhciBkZWYpCit7CisgICAgcmV0dXJuICh4IDwgMCB8fCB5IDwgMCB8fCB4ID49IHcgfHwgeSA+PSBoKSA/IGRlZiA6IHNyY1t4ICsgeSAqIHN0cmlkZV07Cit9CisKK3Vuc2lnbmVkIGNoYXIgaW50ZXJwb2xhdGVfbmVhcmVzdChmbG9hdCB4LCBmbG9hdCB5LCBnbG9iYWwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgdW5zaWduZWQgY2hhciBkZWYpCit7CisgICAgcmV0dXJuIHBpeGVsKHNyYywgKGludCkoeCArIDAuNWYpLCAoaW50KSh5ICsgMC41ZiksIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKK30KKwordW5zaWduZWQgY2hhciBpbnRlcnBvbGF0ZV9iaWxpbmVhcihmbG9hdCB4LCBmbG9hdCB5LCBnbG9iYWwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIHVuc2lnbmVkIGNoYXIgZGVmKQoreworICAgIGludCB4X2MsIHhfZiwgeV9jLCB5X2Y7CisgICAgaW50IHYxLCB2MiwgdjMsIHY0OworICAgIHhfZiA9IChpbnQpeDsKKyAgICB5X2YgPSAoaW50KXk7CisgICAgeF9jID0geF9mICsgMTsKKyAgICB5X2MgPSB5X2YgKyAxOworCisgICAgaWYgKHhfZiA8IC0xIHx8IHhfZiA+IHdpZHRoIHx8IHlfZiA8IC0xIHx8IHlfZiA+IGhlaWdodCkgeworICAgICAgICByZXR1cm4gZGVmOworICAgIH0gZWxzZSB7CisgICAgICAgIHY0ID0gcGl4ZWwoc3JjLCB4X2YsIHlfZiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBkZWYpOworICAgICAgICB2MiA9IHBpeGVsKHNyYywgeF9jLCB5X2YsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKKyAgICAgICAgdjMgPSBwaXhlbChzcmMsIHhfZiwgeV9jLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGRlZik7CisgICAgICAgIHYxID0gcGl4ZWwoc3JjLCB4X2MsIHlfYywgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBkZWYpOworICAgICAgICByZXR1cm4gKHYxKih4IC0geF9mKSooeSAtIHlfZikgKyB2MiooKHggLSB4X2YpKih5X2MgLSB5KSkgKworICAgICAgICAgICAgICAgIHYzKih4X2MgLSB4KSooeSAtIHlfZikgKyB2NCooKHhfYyAtIHgpKih5X2MgLSB5KSkpOworICAgIH0KK30KKwordW5zaWduZWQgY2hhciBpbnRlcnBvbGF0ZV9iaXF1YWRyYXRpYyhmbG9hdCB4LCBmbG9hdCB5LCBnbG9iYWwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIHVuc2lnbmVkIGNoYXIgZGVmKQoreworICAgIGludCAgICAgeF9jLCB4X2YsIHlfYywgeV9mOworICAgIHVuc2lnbmVkIGNoYXIgdjEsICB2MiwgIHYzLCAgdjQ7CisgICAgZmxvYXQgICBmMSwgIGYyLCAgZjMsICBmNDsKKyAgICB4X2YgPSAoaW50KXg7CisgICAgeV9mID0gKGludCl5OworICAgIHhfYyA9IHhfZiArIDE7CisgICAgeV9jID0geV9mICsgMTsKKworICAgIGlmICh4X2YgPCAtIDEgfHwgeF9mID4gd2lkdGggfHwgeV9mIDwgLTEgfHwgeV9mID4gaGVpZ2h0KQorICAgICAgICByZXR1cm4gZGVmOworICAgIGVsc2UgeworICAgICAgICB2NCA9IHBpeGVsKHNyYywgeF9mLCB5X2YsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKKyAgICAgICAgdjIgPSBwaXhlbChzcmMsIHhfYywgeV9mLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGRlZik7CisgICAgICAgIHYzID0gcGl4ZWwoc3JjLCB4X2YsIHlfYywgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBkZWYpOworICAgICAgICB2MSA9IHBpeGVsKHNyYywgeF9jLCB5X2MsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKKworICAgICAgICBmMSA9IDEgLSBzcXJ0KCh4X2MgLSB4KSAqICh5X2MgLSB5KSk7CisgICAgICAgIGYyID0gMSAtIHNxcnQoKHhfYyAtIHgpICogKHkgLSB5X2YpKTsKKyAgICAgICAgZjMgPSAxIC0gc3FydCgoeCAtIHhfZikgKiAoeV9jIC0geSkpOworICAgICAgICBmNCA9IDEgLSBzcXJ0KCh4IC0geF9mKSAqICh5IC0geV9mKSk7CisgICAgICAgIHJldHVybiAodjEgKiBmMSArIHYyICogZjIgKyB2MyAqIGYzICsgdjQgKiBmNCkgLyAoZjEgKyBmMiArIGYzICsgZjQpOworICAgIH0KK30KKworaW5saW5lIGNvbnN0IGZsb2F0IGNsaXBmKGZsb2F0IGEsIGZsb2F0IGFtaW4sIGZsb2F0IGFtYXgpCit7CisgICAgaWYgICAgICAoYSA8IGFtaW4pIHJldHVybiBhbWluOworICAgIGVsc2UgaWYgKGEgPiBhbWF4KSByZXR1cm4gYW1heDsKKyAgICBlbHNlICAgICAgICAgICAgICAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBpbnQgbWlycm9yKGludCB2LCBpbnQgbSkKK3sKKyAgICB3aGlsZSAoKHVuc2lnbmVkKXYgPiAodW5zaWduZWQpbSkgeworICAgICAgICB2ID0gLXY7CisgICAgICAgIGlmICh2IDwgMCkKKyAgICAgICAgICAgIHYgKz0gMiAqIG07CisgICAgfQorICAgIHJldHVybiB2OworfQorCitrZXJuZWwgdm9pZCBhdmZpbHRlcl90cmFuc2Zvcm1fbHVtYShnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJwb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlX2x1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGVfbHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQoreworICAgIGludCB4ID0gZ2V0X2dsb2JhbF9pZCgwKTsKKyAgICBpbnQgeSA9IGdldF9nbG9iYWxfaWQoMSk7CisgICAgaW50IGlkeF9kc3QgPSB5ICogZHN0X3N0cmlkZV9sdSArIHg7CisgICAgdW5zaWduZWQgY2hhciBkZWYgPSAwOworICAgIGZsb2F0IHhfcyA9IHggKiBtYXRyaXgueCArIHkgKiBtYXRyaXgueSArIG1hdHJpeC56OworICAgIGZsb2F0IHlfcyA9IHggKiAoLW1hdHJpeC55KSArIHkgKiBtYXRyaXgueCArIG1hdHJpeC53OworCisgICAgaWYgKHggPCB3aWR0aCAmJiB5IDwgaGVpZ2h0KSB7CisgICAgICAgIHN3aXRjaCAoZmlsbCkgeworICAgICAgICAgICAgY2FzZSAwOiAvL0ZJTExfQkxBTksKKyAgICAgICAgICAgICAgICBkZWYgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvL0ZJTExfT1JJR0lOQUwKKyAgICAgICAgICAgICAgICBkZWYgPSBzcmNbeSpzcmNfc3RyaWRlX2x1ICsgeF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8vRklMTF9DTEFNUAorICAgICAgICAgICAgICAgIHlfcyA9IGNsaXBmKHlfcywgMCwgaGVpZ2h0IC0gMSk7CisgICAgICAgICAgICAgICAgeF9zID0gY2xpcGYoeF9zLCAwLCB3aWR0aCAtIDEpOworICAgICAgICAgICAgICAgIGRlZiA9IHNyY1soaW50KXlfcyAqIHNyY19zdHJpZGVfbHUgKyAoaW50KXhfc107CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IC8vRklMTF9NSVJST1IKKyAgICAgICAgICAgICAgICB5X3MgPSBtaXJyb3IoeV9zLCBoZWlnaHQgLSAxKTsKKyAgICAgICAgICAgICAgICB4X3MgPSBtaXJyb3IoeF9zLCB3aWR0aCAtIDEpOworICAgICAgICAgICAgICAgIGRlZiA9IHNyY1soaW50KXlfcyAqIHNyY19zdHJpZGVfbHUgKyAoaW50KXhfc107CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChpbnRlcnBvbGF0ZSkgeworICAgICAgICAgICAgY2FzZSAwOiAvL0lOVEVSUE9MQVRFX05FQVJFU1QKKyAgICAgICAgICAgICAgICBkc3RbaWR4X2RzdF0gPSBpbnRlcnBvbGF0ZV9uZWFyZXN0KHhfcywgeV9zLCBzcmMsIHdpZHRoLCBoZWlnaHQsIHNyY19zdHJpZGVfbHUsIGRlZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IC8vSU5URVJQT0xBVEVfQklMSU5FQVIKKyAgICAgICAgICAgICAgICBkc3RbaWR4X2RzdF0gPSBpbnRlcnBvbGF0ZV9iaWxpbmVhcih4X3MsIHlfcywgc3JjLCB3aWR0aCwgaGVpZ2h0LCBzcmNfc3RyaWRlX2x1LCBkZWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAvL0lOVEVSUE9MQVRFX0JJUVVBRFJBVElDCisgICAgICAgICAgICAgICAgZHN0W2lkeF9kc3RdID0gaW50ZXJwb2xhdGVfYmlxdWFkcmF0aWMoeF9zLCB5X3MsIHNyYywgd2lkdGgsIGhlaWdodCwgc3JjX3N0cmlkZV9sdSwgZGVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCitrZXJuZWwgdm9pZCBhdmZpbHRlcl90cmFuc2Zvcm1fY2hyb21hKGdsb2JhbCB1bnNpZ25lZCBjaGFyICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcnBvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlX2x1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZV9sdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGVfY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlX2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN3KQoreworCisgICAgaW50IHggPSBnZXRfZ2xvYmFsX2lkKDApOworICAgIGludCB5ID0gZ2V0X2dsb2JhbF9pZCgxKTsKKyAgICBpbnQgcGFkX2NoID0gZ2V0X2dsb2JhbF9zaXplKDEpPj4xOworICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpkc3RfdSA9IGRzdCArIGhlaWdodCAqIGRzdF9zdHJpZGVfbHU7CisgICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKnNyY191ID0gc3JjICsgaGVpZ2h0ICogc3JjX3N0cmlkZV9sdTsKKyAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqZHN0X3YgPSBkc3RfdSArIGNoICogZHN0X3N0cmlkZV9jaDsKKyAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjX3YgPSBzcmNfdSArIGNoICogc3JjX3N0cmlkZV9jaDsKKyAgICBzcmMgPSB5IDwgcGFkX2NoID8gc3JjX3UgOiBzcmNfdjsKKyAgICBkc3QgPSB5IDwgcGFkX2NoID8gZHN0X3UgOiBkc3RfdjsKKyAgICB5ID0gc2VsZWN0KHkgLSBwYWRfY2gsIHksIHkgPCBwYWRfY2gpOworICAgIGZsb2F0IHhfcyA9IHggKiBtYXRyaXgueCArIHkgKiBtYXRyaXgueSArIG1hdHJpeC56OworICAgIGZsb2F0IHlfcyA9IHggKiAoLW1hdHJpeC55KSArIHkgKiBtYXRyaXgueCArIG1hdHJpeC53OworICAgIGludCBpZHhfZHN0ID0geSAqIGRzdF9zdHJpZGVfY2ggKyB4OworICAgIHVuc2lnbmVkIGNoYXIgZGVmOworCisgICAgaWYgKHggPCBjdyAmJiB5IDwgY2gpIHsKKyAgICAgICAgc3dpdGNoIChmaWxsKSB7CisgICAgICAgICAgICBjYXNlIDA6IC8vRklMTF9CTEFOSworICAgICAgICAgICAgICAgIGRlZiA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IC8vRklMTF9PUklHSU5BTAorICAgICAgICAgICAgICAgIGRlZiA9IHNyY1t5KnNyY19zdHJpZGVfY2ggKyB4XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLy9GSUxMX0NMQU1QCisgICAgICAgICAgICAgICAgeV9zID0gY2xpcGYoeV9zLCAwLCBjaCAtIDEpOworICAgICAgICAgICAgICAgIHhfcyA9IGNsaXBmKHhfcywgMCwgY3cgLSAxKTsKKyAgICAgICAgICAgICAgICBkZWYgPSBzcmNbKGludCl5X3MgKiBzcmNfc3RyaWRlX2NoICsgKGludCl4X3NdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiAvL0ZJTExfTUlSUk9SCisgICAgICAgICAgICAgICAgeV9zID0gbWlycm9yKHlfcywgY2ggLSAxKTsKKyAgICAgICAgICAgICAgICB4X3MgPSBtaXJyb3IoeF9zLCBjdyAtIDEpOworICAgICAgICAgICAgICAgIGRlZiA9IHNyY1soaW50KXlfcyAqIHNyY19zdHJpZGVfY2ggKyAoaW50KXhfc107CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChpbnRlcnBvbGF0ZSkgeworICAgICAgICAgICAgY2FzZSAwOiAvL0lOVEVSUE9MQVRFX05FQVJFU1QKKyAgICAgICAgICAgICAgICBkc3RbaWR4X2RzdF0gPSBpbnRlcnBvbGF0ZV9uZWFyZXN0KHhfcywgeV9zLCBzcmMsIGN3LCBjaCwgc3JjX3N0cmlkZV9jaCwgZGVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogLy9JTlRFUlBPTEFURV9CSUxJTkVBUgorICAgICAgICAgICAgICAgIGRzdFtpZHhfZHN0XSA9IGludGVycG9sYXRlX2JpbGluZWFyKHhfcywgeV9zLCBzcmMsIGN3LCBjaCwgc3JjX3N0cmlkZV9jaCwgZGVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLy9JTlRFUlBPTEFURV9CSVFVQURSQVRJQworICAgICAgICAgICAgICAgIGRzdFtpZHhfZHN0XSA9IGludGVycG9sYXRlX2JpcXVhZHJhdGljKHhfcywgeV9zLCBzcmMsIGN3LCBjaCwgc3JjX3N0cmlkZV9jaCwgZGVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorKTsKKworI2VuZGlmIC8qIEFWRklMVEVSX0RFU0hBS0VfT1BFTkNMX0tFUk5FTF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvZHJhd3V0aWxzLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZHJhd3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzN2MyYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9kcmF3dXRpbHMuYwpAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFN0ZWZhbm8gU2FiYXRpbmkgPHN0ZWZhbm8uc2FiYXRpbmktbGFsYSBwb3N0ZSBpdD4KKyAqIENvcHlyaWdodCAyMDEyIE5pY29sYXMgR2VvcmdlIDxuaWNvbGFzLmdlb3JnZSBub3JtYWxlc3VwIG9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb2xvcnNwYWNlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorCitlbnVtIHsgUkVEID0gMCwgR1JFRU4sIEJMVUUsIEFMUEhBIH07CisKK2ludCBmZl9maWxsX3JnYmFfbWFwKHVpbnQ4X3QgKnJnYmFfbWFwLCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3sKKyAgICBzd2l0Y2ggKHBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfMFJHQjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfQVJHQjogIHJnYmFfbWFwW0FMUEhBXSA9IDA7IHJnYmFfbWFwW1JFRCAgXSA9IDE7IHJnYmFfbWFwW0dSRUVOXSA9IDI7IHJnYmFfbWFwW0JMVUUgXSA9IDM7IGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF8wQkdSOgorICAgIGNhc2UgQVZfUElYX0ZNVF9BQkdSOiAgcmdiYV9tYXBbQUxQSEFdID0gMDsgcmdiYV9tYXBbQkxVRSBdID0gMTsgcmdiYV9tYXBbR1JFRU5dID0gMjsgcmdiYV9tYXBbUkVEICBdID0gMzsgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6IHJnYmFfbWFwW1JFRCAgXSA9IDA7IHJnYmFfbWFwW0dSRUVOXSA9IDE7IHJnYmFfbWFwW0JMVUUgXSA9IDI7IHJnYmFfbWFwW0FMUEhBXSA9IDM7IGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0OExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0OEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBNjRCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQTY0TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OiByZ2JhX21hcFtCTFVFIF0gPSAwOyByZ2JhX21hcFtHUkVFTl0gPSAxOyByZ2JhX21hcFtSRUQgIF0gPSAyOyByZ2JhX21hcFtBTFBIQV0gPSAzOyBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA6ICByZ2JhX21hcFtHUkVFTl0gPSAwOyByZ2JhX21hcFtCTFVFIF0gPSAxOyByZ2JhX21hcFtSRUQgIF0gPSAyOyByZ2JhX21hcFtBTFBIQV0gPSAzOyBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgLyogdW5zdXBwb3J0ZWQgKi8KKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9maWxsX2xpbmVfd2l0aF9jb2xvcih1aW50OF90ICpsaW5lWzRdLCBpbnQgcGl4ZWxfc3RlcFs0XSwgaW50IHcsIHVpbnQ4X3QgZHN0X2NvbG9yWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCB1aW50OF90IHJnYmFfY29sb3JbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppc19wYWNrZWRfcmdiYSwgdWludDhfdCByZ2JhX21hcF9wdHJbNF0pCit7CisgICAgdWludDhfdCByZ2JhX21hcFs0XSA9IHswfTsKKyAgICBpbnQgaTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBpbnQgaHN1YiA9IHBpeF9kZXNjLT5sb2cyX2Nocm9tYV93OworCisgICAgKmlzX3BhY2tlZF9yZ2JhID0gZmZfZmlsbF9yZ2JhX21hcChyZ2JhX21hcCwgcGl4X2ZtdCkgPj0gMDsKKworICAgIGlmICgqaXNfcGFja2VkX3JnYmEpIHsKKyAgICAgICAgcGl4ZWxfc3RlcFswXSA9IChhdl9nZXRfYml0c19wZXJfcGl4ZWwocGl4X2Rlc2MpKT4+MzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIGRzdF9jb2xvcltyZ2JhX21hcFtpXV0gPSByZ2JhX2NvbG9yW2ldOworCisgICAgICAgIGxpbmVbMF0gPSBhdl9tYWxsb2ModyAqIHBpeGVsX3N0ZXBbMF0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKQorICAgICAgICAgICAgbWVtY3B5KGxpbmVbMF0gKyBpICogcGl4ZWxfc3RlcFswXSwgZHN0X2NvbG9yLCBwaXhlbF9zdGVwWzBdKTsKKyAgICAgICAgaWYgKHJnYmFfbWFwX3B0cikKKyAgICAgICAgICAgIG1lbWNweShyZ2JhX21hcF9wdHIsIHJnYmFfbWFwLCBzaXplb2YocmdiYV9tYXBbMF0pICogNCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHBsYW5lOworCisgICAgICAgIGRzdF9jb2xvclswXSA9IFJHQl9UT19ZX0NDSVIocmdiYV9jb2xvclswXSwgcmdiYV9jb2xvclsxXSwgcmdiYV9jb2xvclsyXSk7CisgICAgICAgIGRzdF9jb2xvclsxXSA9IFJHQl9UT19VX0NDSVIocmdiYV9jb2xvclswXSwgcmdiYV9jb2xvclsxXSwgcmdiYV9jb2xvclsyXSwgMCk7CisgICAgICAgIGRzdF9jb2xvclsyXSA9IFJHQl9UT19WX0NDSVIocmdiYV9jb2xvclswXSwgcmdiYV9jb2xvclsxXSwgcmdiYV9jb2xvclsyXSwgMCk7CisgICAgICAgIGRzdF9jb2xvclszXSA9IHJnYmFfY29sb3JbM107CisKKyAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgNDsgcGxhbmUrKykgeworICAgICAgICAgICAgaW50IGxpbmVfc2l6ZTsKKyAgICAgICAgICAgIGludCBoc3ViMSA9IChwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIpID8gaHN1YiA6IDA7CisKKyAgICAgICAgICAgIHBpeGVsX3N0ZXBbcGxhbmVdID0gMTsKKyAgICAgICAgICAgIGxpbmVfc2l6ZSA9IEZGX0NFSUxfUlNISUZUKHcsIGhzdWIxKSAqIHBpeGVsX3N0ZXBbcGxhbmVdOworICAgICAgICAgICAgbGluZVtwbGFuZV0gPSBhdl9tYWxsb2MobGluZV9zaXplKTsKKyAgICAgICAgICAgIG1lbXNldChsaW5lW3BsYW5lXSwgZHN0X2NvbG9yW3BsYW5lXSwgbGluZV9zaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX2RyYXdfcmVjdGFuZ2xlKHVpbnQ4X3QgKmRzdFs0XSwgaW50IGRzdF9saW5lc2l6ZVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjWzRdLCBpbnQgcGl4ZWxzdGVwWzRdLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN1YiwgaW50IHZzdWIsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIGludCBpLCBwbGFuZTsKKyAgICB1aW50OF90ICpwOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgNCAmJiBkc3RbcGxhbmVdOyBwbGFuZSsrKSB7CisgICAgICAgIGludCBoc3ViMSA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IGhzdWIgOiAwOworICAgICAgICBpbnQgdnN1YjEgPSBwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIgPyB2c3ViIDogMDsKKyAgICAgICAgaW50IHdpZHRoICA9IEZGX0NFSUxfUlNISUZUKHcsIGhzdWIxKTsKKyAgICAgICAgaW50IGhlaWdodCA9IEZGX0NFSUxfUlNISUZUKGgsIHZzdWIxKTsKKworICAgICAgICBwID0gZHN0W3BsYW5lXSArICh5ID4+IHZzdWIxKSAqIGRzdF9saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgbWVtY3B5KHAgKyAoeCA+PiBoc3ViMSkgKiBwaXhlbHN0ZXBbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgIHNyY1twbGFuZV0sIHdpZHRoICogcGl4ZWxzdGVwW3BsYW5lXSk7CisgICAgICAgICAgICBwICs9IGRzdF9saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZmZfY29weV9yZWN0YW5nbGUodWludDhfdCAqZHN0WzRdLCBpbnQgZHN0X2xpbmVzaXplWzRdLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmNbNF0sIGludCBzcmNfbGluZXNpemVbNF0sIGludCBwaXhlbHN0ZXBbNF0sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBoc3ViLCBpbnQgdnN1YiwgaW50IHgsIGludCB5LCBpbnQgeTIsIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgaSwgcGxhbmU7CisgICAgdWludDhfdCAqcDsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQgJiYgZHN0W3BsYW5lXTsgcGxhbmUrKykgeworICAgICAgICBpbnQgaHN1YjEgPSBwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIgPyBoc3ViIDogMDsKKyAgICAgICAgaW50IHZzdWIxID0gcGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyID8gdnN1YiA6IDA7CisgICAgICAgIGludCB3aWR0aCAgPSBGRl9DRUlMX1JTSElGVCh3LCBoc3ViMSk7CisgICAgICAgIGludCBoZWlnaHQgPSBGRl9DRUlMX1JTSElGVChoLCB2c3ViMSk7CisKKyAgICAgICAgcCA9IGRzdFtwbGFuZV0gKyAoeSA+PiB2c3ViMSkgKiBkc3RfbGluZXNpemVbcGxhbmVdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIG1lbWNweShwICsgKHggPj4gaHN1YjEpICogcGl4ZWxzdGVwW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICBzcmNbcGxhbmVdICsgc3JjX2xpbmVzaXplW3BsYW5lXSooaSsoeTI+PnZzdWIxKSksIHdpZHRoICogcGl4ZWxzdGVwW3BsYW5lXSk7CisgICAgICAgICAgICBwICs9IGRzdF9saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBmZl9kcmF3X2luaXQoRkZEcmF3Q29udGV4dCAqZHJhdywgZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdCwgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChmb3JtYXQpOworICAgIGNvbnN0IEFWQ29tcG9uZW50RGVzY3JpcHRvciAqYzsKKyAgICB1bnNpZ25lZCBpLCBuYl9wbGFuZXMgPSAwOworICAgIGludCBwaXhlbHN0ZXBbTUFYX1BMQU5FU10gPSB7IDAgfTsKKworICAgIGlmICghZGVzYy0+bmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBpZiAoZGVzYy0+ZmxhZ3MgJiB+KEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgZm9yIChpID0gMDsgaSA8IGRlc2MtPm5iX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICBjID0gJmRlc2MtPmNvbXBbaV07CisgICAgICAgIC8qIGZvciBub3csIG9ubHkgOC1iaXRzIGZvcm1hdHMgKi8KKyAgICAgICAgaWYgKGMtPmRlcHRoX21pbnVzMSAhPSA4IC0gMSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGlmIChjLT5wbGFuZSA+PSBNQVhfUExBTkVTKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgLyogc3RyYW5nZSBpbnRlcmxlYXZpbmcgKi8KKyAgICAgICAgaWYgKHBpeGVsc3RlcFtjLT5wbGFuZV0gIT0gMCAmJgorICAgICAgICAgICAgcGl4ZWxzdGVwW2MtPnBsYW5lXSAhPSBjLT5zdGVwX21pbnVzMSArIDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICAgICBwaXhlbHN0ZXBbYy0+cGxhbmVdID0gYy0+c3RlcF9taW51czEgKyAxOworICAgICAgICBpZiAocGl4ZWxzdGVwW2MtPnBsYW5lXSA+PSA4KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgbmJfcGxhbmVzID0gRkZNQVgobmJfcGxhbmVzLCBjLT5wbGFuZSArIDEpOworICAgIH0KKyAgICBpZiAoKGRlc2MtPmxvZzJfY2hyb21hX3cgfHwgZGVzYy0+bG9nMl9jaHJvbWFfaCkgJiYgbmJfcGxhbmVzIDwgMykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsgLyogZXhjbHVkZSBOVjEyIGFuZCBOVjIxICovCisgICAgbWVtc2V0KGRyYXcsIDAsIHNpemVvZigqZHJhdykpOworICAgIGRyYXctPmRlc2MgICAgICA9IGRlc2M7CisgICAgZHJhdy0+Zm9ybWF0ICAgID0gZm9ybWF0OworICAgIGRyYXctPm5iX3BsYW5lcyA9IG5iX3BsYW5lczsKKyAgICBtZW1jcHkoZHJhdy0+cGl4ZWxzdGVwLCBwaXhlbHN0ZXAsIHNpemVvZihkcmF3LT5waXhlbHN0ZXApKTsKKyAgICBkcmF3LT5oc3ViWzFdID0gZHJhdy0+aHN1YlsyXSA9IGRyYXctPmhzdWJfbWF4ID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBkcmF3LT52c3ViWzFdID0gZHJhdy0+dnN1YlsyXSA9IGRyYXctPnZzdWJfbWF4ID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKChkZXNjLT5uYl9jb21wb25lbnRzIC0gMSkgfCAxKTsgaSsrKQorICAgICAgICBkcmF3LT5jb21wX21hc2tbZGVzYy0+Y29tcFtpXS5wbGFuZV0gfD0KKyAgICAgICAgICAgIDEgPDwgKGRlc2MtPmNvbXBbaV0ub2Zmc2V0X3BsdXMxIC0gMSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfZHJhd19jb2xvcihGRkRyYXdDb250ZXh0ICpkcmF3LCBGRkRyYXdDb2xvciAqY29sb3IsIGNvbnN0IHVpbnQ4X3QgcmdiYVs0XSkKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIHVpbnQ4X3QgcmdiYV9tYXBbNF07CisKKyAgICBpZiAocmdiYSAhPSBjb2xvci0+cmdiYSkKKyAgICAgICAgbWVtY3B5KGNvbG9yLT5yZ2JhLCByZ2JhLCBzaXplb2YoY29sb3ItPnJnYmEpKTsKKyAgICBpZiAoKGRyYXctPmRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQikgJiYKKyAgICAgICAgZmZfZmlsbF9yZ2JhX21hcChyZ2JhX21hcCwgZHJhdy0+Zm9ybWF0KSA+PSAwKSB7CisgICAgICAgIGlmIChkcmF3LT5uYl9wbGFuZXMgPT0gMSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgY29sb3ItPmNvbXBbMF0udThbcmdiYV9tYXBbaV1dID0gcmdiYVtpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgY29sb3ItPmNvbXBbcmdiYV9tYXBbaV1dLnU4WzBdID0gcmdiYVtpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZHJhdy0+bmJfcGxhbmVzID09IDMgfHwgZHJhdy0+bmJfcGxhbmVzID09IDQpIHsKKyAgICAgICAgLyogYXNzdW1lIFlVViAqLworICAgICAgICBjb2xvci0+Y29tcFswXS51OFswXSA9IFJHQl9UT19ZX0NDSVIocmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXSk7CisgICAgICAgIGNvbG9yLT5jb21wWzFdLnU4WzBdID0gUkdCX1RPX1VfQ0NJUihyZ2JhWzBdLCByZ2JhWzFdLCByZ2JhWzJdLCAwKTsKKyAgICAgICAgY29sb3ItPmNvbXBbMl0udThbMF0gPSBSR0JfVE9fVl9DQ0lSKHJnYmFbMF0sIHJnYmFbMV0sIHJnYmFbMl0sIDApOworICAgICAgICBjb2xvci0+Y29tcFszXS51OFswXSA9IHJnYmFbM107CisgICAgfSBlbHNlIGlmIChkcmF3LT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9HUkFZOCB8fCBkcmF3LT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9HUkFZOEEpIHsKKyAgICAgICAgY29sb3ItPmNvbXBbMF0udThbMF0gPSBSR0JfVE9fWV9DQ0lSKHJnYmFbMF0sIHJnYmFbMV0sIHJnYmFbMl0pOworICAgICAgICBjb2xvci0+Y29tcFsxXS51OFswXSA9IHJnYmFbM107CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkNvbG9yIGNvbnZlcnNpb24gbm90IGltcGxlbWVudGVkIGZvciAlc1xuIiwgZHJhdy0+ZGVzYy0+bmFtZSk7CisgICAgICAgIG1lbXNldChjb2xvciwgMTI4LCBzaXplb2YoKmNvbG9yKSk7CisgICAgfQorfQorCitzdGF0aWMgdWludDhfdCAqcG9pbnRlcl9hdChGRkRyYXdDb250ZXh0ICpkcmF3LCB1aW50OF90ICpkYXRhW10sIGludCBsaW5lc2l6ZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYW5lLCBpbnQgeCwgaW50IHkpCit7CisgICAgcmV0dXJuIGRhdGFbcGxhbmVdICsKKyAgICAgICAgICAgKHkgPj4gZHJhdy0+dnN1YltwbGFuZV0pICogbGluZXNpemVbcGxhbmVdICsKKyAgICAgICAgICAgKHggPj4gZHJhdy0+aHN1YltwbGFuZV0pICogZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXTsKK30KKwordm9pZCBmZl9jb3B5X3JlY3RhbmdsZTIoRkZEcmF3Q29udGV4dCAqZHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0X2xpbmVzaXplW10sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmNbXSwgaW50IHNyY19saW5lc2l6ZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF94LCBpbnQgZHN0X3ksIGludCBzcmNfeCwgaW50IHNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKQoreworICAgIGludCBwbGFuZSwgeSwgd3AsIGhwOworICAgIHVpbnQ4X3QgKnAsICpxOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgZHJhdy0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIHAgPSBwb2ludGVyX2F0KGRyYXcsIHNyYywgc3JjX2xpbmVzaXplLCBwbGFuZSwgc3JjX3gsIHNyY195KTsKKyAgICAgICAgcSA9IHBvaW50ZXJfYXQoZHJhdywgZHN0LCBkc3RfbGluZXNpemUsIHBsYW5lLCBkc3RfeCwgZHN0X3kpOworICAgICAgICB3cCA9IEZGX0NFSUxfUlNISUZUKHcsIGRyYXctPmhzdWJbcGxhbmVdKSAqIGRyYXctPnBpeGVsc3RlcFtwbGFuZV07CisgICAgICAgIGhwID0gRkZfQ0VJTF9SU0hJRlQoaCwgZHJhdy0+dnN1YltwbGFuZV0pOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaHA7IHkrKykgeworICAgICAgICAgICAgbWVtY3B5KHEsIHAsIHdwKTsKKyAgICAgICAgICAgIHAgKz0gc3JjX2xpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgIHEgKz0gZHN0X2xpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl9maWxsX3JlY3RhbmdsZShGRkRyYXdDb250ZXh0ICpkcmF3LCBGRkRyYXdDb2xvciAqY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0X2xpbmVzaXplW10sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfeCwgaW50IGRzdF95LCBpbnQgdywgaW50IGgpCit7CisgICAgaW50IHBsYW5lLCB4LCB5LCB3cCwgaHA7CisgICAgdWludDhfdCAqcDAsICpwOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgZHJhdy0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIHAwID0gcG9pbnRlcl9hdChkcmF3LCBkc3QsIGRzdF9saW5lc2l6ZSwgcGxhbmUsIGRzdF94LCBkc3RfeSk7CisgICAgICAgIHdwID0gRkZfQ0VJTF9SU0hJRlQodywgZHJhdy0+aHN1YltwbGFuZV0pOworICAgICAgICBocCA9IEZGX0NFSUxfUlNISUZUKGgsIGRyYXctPnZzdWJbcGxhbmVdKTsKKyAgICAgICAgaWYgKCFocCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcCA9IHAwOworICAgICAgICAvKiBjb3B5IGZpcnN0IGxpbmUgZnJvbSBjb2xvciAqLworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd3A7IHgrKykgeworICAgICAgICAgICAgbWVtY3B5KHAsIGNvbG9yLT5jb21wW3BsYW5lXS51OCwgZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXSk7CisgICAgICAgICAgICBwICs9IGRyYXctPnBpeGVsc3RlcFtwbGFuZV07CisgICAgICAgIH0KKyAgICAgICAgd3AgKj0gZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXTsKKyAgICAgICAgLyogY29weSBuZXh0IGxpbmVzIGZyb20gZmlyc3QgbGluZSAqLworICAgICAgICBwID0gcDAgKyBkc3RfbGluZXNpemVbcGxhbmVdOworICAgICAgICBmb3IgKHkgPSAxOyB5IDwgaHA7IHkrKykgeworICAgICAgICAgICAgbWVtY3B5KHAsIHAwLCB3cCk7CisgICAgICAgICAgICBwICs9IGRzdF9saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogQ2xpcCBpbnRlcnZhbCBbeDsgeCt3WyB3aXRoaW4gWzA7IHdtYXhbLgorICogVGhlIHJlc3VsdGluZyB3IG1heSBiZSBuZWdhdGl2ZSBpZiB0aGUgZmluYWwgaW50ZXJ2YWwgaXMgZW1wdHkuCisgKiBkeCwgaWYgbm90IG51bGwsIHJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGluIGFuZCBvdXQgdmFsdWUgb2YgeC4KKyAqLworc3RhdGljIHZvaWQgY2xpcF9pbnRlcnZhbChpbnQgd21heCwgaW50ICp4LCBpbnQgKncsIGludCAqZHgpCit7CisgICAgaWYgKGR4KQorICAgICAgICAqZHggPSAwOworICAgIGlmICgqeCA8IDApIHsKKyAgICAgICAgaWYgKGR4KQorICAgICAgICAgICAgKmR4ID0gLSp4OworICAgICAgICAqdyArPSAqeDsKKyAgICAgICAgKnggPSAwOworICAgIH0KKyAgICBpZiAoKnggKyAqdyA+IHdtYXgpCisgICAgICAgICp3ID0gd21heCAtICp4OworfQorCisvKioKKyAqIERlY29tcG9zZSB3IHBpeGVscyBzdGFydGluZyBhdCB4CisgKiBpbnRvIHN0YXJ0ICsgKHcgc3RhcnRpbmcgYXQgeCkgKyBlbmQKKyAqIHdpdGggeCBhbmQgdyBhbGlnbmVkIG9uIG11bHRpcGxlcyBvZiAxPDxzdWIuCisgKi8KK3N0YXRpYyB2b2lkIHN1YnNhbXBsaW5nX2JvdW5kcyhpbnQgc3ViLCBpbnQgKngsIGludCAqdywgaW50ICpzdGFydCwgaW50ICplbmQpCit7CisgICAgaW50IG1hc2sgPSAoMSA8PCBzdWIpIC0gMTsKKworICAgICpzdGFydCA9ICgtKngpICYgbWFzazsKKyAgICAqeCArPSAqc3RhcnQ7CisgICAgKnN0YXJ0ID0gRkZNSU4oKnN0YXJ0LCAqdyk7CisgICAgKncgLT0gKnN0YXJ0OworICAgICplbmQgPSAqdyAmIG1hc2s7CisgICAgKncgPj49IHN1YjsKK30KKworc3RhdGljIGludCBjb21wb25lbnRfdXNlZChGRkRyYXdDb250ZXh0ICpkcmF3LCBpbnQgcGxhbmUsIGludCBjb21wKQoreworICAgIHJldHVybiAoZHJhdy0+Y29tcF9tYXNrW3BsYW5lXSA+PiBjb21wKSAmIDE7Cit9CisKKy8qIElmIGFscGhhIGlzIGluIHRoZSBbIDAgOyAweDEwMTAxMDEgXSByYW5nZSwKKyAgIHRoZW4gYWxwaGEgKiB2YWx1ZSBpcyBpbiB0aGUgWyAwIDsgMHhGRkZGRkZGRiBdIHJhbmdlLAorICAgYW5kID4+IDI0IGdpdmVzIGEgY29ycmVjdCByb3VuZGluZy4gKi8KK3N0YXRpYyB2b2lkIGJsZW5kX2xpbmUodWludDhfdCAqZHN0LCB1bnNpZ25lZCBzcmMsIHVuc2lnbmVkIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHgsIGludCB3LCB1bnNpZ25lZCBoc3ViLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQoreworICAgIHVuc2lnbmVkIGFzcmMgPSBhbHBoYSAqIHNyYzsKKyAgICB1bnNpZ25lZCB0YXUgPSAweDEwMTAxMDEgLSBhbHBoYTsKKyAgICBpbnQgeDsKKworICAgIGlmIChsZWZ0KSB7CisgICAgICAgIHVuc2lnbmVkIHN1YmEgPSAobGVmdCAqIGFscGhhKSA+PiBoc3ViOworICAgICAgICAqZHN0ID0gKCpkc3QgKiAoMHgxMDEwMTAxIC0gc3ViYSkgKyBzcmMgKiBzdWJhKSA+PiAyNDsKKyAgICAgICAgZHN0ICs9IGR4OworICAgIH0KKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICpkc3QgPSAoKmRzdCAqIHRhdSArIGFzcmMpID4+IDI0OworICAgICAgICBkc3QgKz0gZHg7CisgICAgfQorICAgIGlmIChyaWdodCkgeworICAgICAgICB1bnNpZ25lZCBzdWJhID0gKHJpZ2h0ICogYWxwaGEpID4+IGhzdWI7CisgICAgICAgICpkc3QgPSAoKmRzdCAqICgweDEwMTAxMDEgLSBzdWJhKSArIHNyYyAqIHN1YmEpID4+IDI0OworICAgIH0KK30KKwordm9pZCBmZl9ibGVuZF9yZWN0YW5nbGUoRkZEcmF3Q29udGV4dCAqZHJhdywgRkZEcmF3Q29sb3IgKmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RfbGluZXNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfdywgaW50IGRzdF9oLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgwLCBpbnQgeTAsIGludCB3LCBpbnQgaCkKK3sKKyAgICB1bnNpZ25lZCBhbHBoYSwgbmJfcGxhbmVzLCBuYl9jb21wLCBwbGFuZSwgY29tcDsKKyAgICBpbnQgd19zdWIsIGhfc3ViLCB4X3N1YiwgeV9zdWIsIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgeTsKKyAgICB1aW50OF90ICpwMCwgKnA7CisKKyAgICAvKiBUT0RPIG9wdGltaXplIGlmIGFscGhhID0gMHhGRiAqLworICAgIGNsaXBfaW50ZXJ2YWwoZHN0X3csICZ4MCwgJncsIE5VTEwpOworICAgIGNsaXBfaW50ZXJ2YWwoZHN0X2gsICZ5MCwgJmgsIE5VTEwpOworICAgIGlmICh3IDw9IDAgfHwgaCA8PSAwIHx8ICFjb2xvci0+cmdiYVszXSkKKyAgICAgICAgcmV0dXJuOworICAgIC8qIDB4MTAyMDMgKiBhbHBoYSArIDIgaXMgaW4gdGhlIFsgMiA7IDB4MTAxMDEwMSAtIDIgXSByYW5nZSAqLworICAgIGFscGhhID0gMHgxMDIwMyAqIGNvbG9yLT5yZ2JhWzNdICsgMHgyOworICAgIG5iX3BsYW5lcyA9IChkcmF3LT5uYl9wbGFuZXMgLSAxKSB8IDE7IC8qIGVsaW1pbmF0ZSBhbHBoYSAqLworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IG5iX3BsYW5lczsgcGxhbmUrKykgeworICAgICAgICBuYl9jb21wID0gZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXTsKKyAgICAgICAgcDAgPSBwb2ludGVyX2F0KGRyYXcsIGRzdCwgZHN0X2xpbmVzaXplLCBwbGFuZSwgeDAsIHkwKTsKKyAgICAgICAgd19zdWIgPSB3OworICAgICAgICBoX3N1YiA9IGg7CisgICAgICAgIHhfc3ViID0geDA7CisgICAgICAgIHlfc3ViID0geTA7CisgICAgICAgIHN1YnNhbXBsaW5nX2JvdW5kcyhkcmF3LT5oc3ViW3BsYW5lXSwgJnhfc3ViLCAmd19zdWIsICZsZWZ0LCAmcmlnaHQpOworICAgICAgICBzdWJzYW1wbGluZ19ib3VuZHMoZHJhdy0+dnN1YltwbGFuZV0sICZ5X3N1YiwgJmhfc3ViLCAmdG9wLCAmYm90dG9tKTsKKyAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IG5iX2NvbXA7IGNvbXArKykgeworICAgICAgICAgICAgaWYgKCFjb21wb25lbnRfdXNlZChkcmF3LCBwbGFuZSwgY29tcCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBwID0gcDAgKyBjb21wOworICAgICAgICAgICAgaWYgKHRvcCkgeworICAgICAgICAgICAgICAgIGJsZW5kX2xpbmUocCwgY29sb3ItPmNvbXBbcGxhbmVdLnU4W2NvbXBdLCBhbHBoYSA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXSwgd19zdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5oc3ViW3BsYW5lXSwgbGVmdCwgcmlnaHQpOworICAgICAgICAgICAgICAgIHAgKz0gZHN0X2xpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoX3N1YjsgeSsrKSB7CisgICAgICAgICAgICAgICAgYmxlbmRfbGluZShwLCBjb2xvci0+Y29tcFtwbGFuZV0udThbY29tcF0sIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXSwgd19zdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5oc3ViW3BsYW5lXSwgbGVmdCwgcmlnaHQpOworICAgICAgICAgICAgICAgIHAgKz0gZHN0X2xpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChib3R0b20pCisgICAgICAgICAgICAgICAgYmxlbmRfbGluZShwLCBjb2xvci0+Y29tcFtwbGFuZV0udThbY29tcF0sIGFscGhhID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdLCB3X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPmhzdWJbcGxhbmVdLCBsZWZ0LCByaWdodCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJsZW5kX3BpeGVsKHVpbnQ4X3QgKmRzdCwgdW5zaWduZWQgc3JjLCB1bnNpZ25lZCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm1hc2ssIGludCBtYXNrX2xpbmVzaXplLCBpbnQgbDJkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgsIHVuc2lnbmVkIHNoaWZ0LCB1bnNpZ25lZCB4bTApCit7CisgICAgdW5zaWduZWQgeG0sIHgsIHksIHQgPSAwOworICAgIHVuc2lnbmVkIHhtc2hmID0gMyAtIGwyZGVwdGg7CisgICAgdW5zaWduZWQgeG1tb2QgPSA3ID4+IGwyZGVwdGg7CisgICAgdW5zaWduZWQgbWJpdHMgPSAoMSA8PCAoMSA8PCBsMmRlcHRoKSkgLSAxOworICAgIHVuc2lnbmVkIG1tdWx0ID0gMjU1IC8gbWJpdHM7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIHhtID0geG0wOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICB0ICs9ICgobWFza1t4bSA+PiB4bXNoZl0gPj4gKCh+eG0gJiB4bW1vZCkgPDwgbDJkZXB0aCkpICYgbWJpdHMpCisgICAgICAgICAgICAgICAgICogbW11bHQ7CisgICAgICAgICAgICB4bSsrOworICAgICAgICB9CisgICAgICAgIG1hc2sgKz0gbWFza19saW5lc2l6ZTsKKyAgICB9CisgICAgYWxwaGEgPSAodCA+PiBzaGlmdCkgKiBhbHBoYTsKKyAgICAqZHN0ID0gKCgweDEwMTAxMDEgLSBhbHBoYSkgKiAqZHN0ICsgYWxwaGEgKiBzcmMpID4+IDI0OworfQorCitzdGF0aWMgdm9pZCBibGVuZF9saW5lX2h2KHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9kZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3JjLCB1bnNpZ25lZCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbWFzaywgaW50IG1hc2tfbGluZXNpemUsIGludCBsMmRlcHRoLCBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaHN1YiwgdW5zaWduZWQgdnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhtLCBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgaGJhbmQpCit7CisgICAgaW50IHg7CisKKyAgICBpZiAobGVmdCkgeworICAgICAgICBibGVuZF9waXhlbChkc3QsIHNyYywgYWxwaGEsIG1hc2ssIG1hc2tfbGluZXNpemUsIGwyZGVwdGgsCisgICAgICAgICAgICAgICAgICAgIGxlZnQsIGhiYW5kLCBoc3ViICsgdnN1YiwgeG0pOworICAgICAgICBkc3QgKz0gZHN0X2RlbHRhOworICAgICAgICB4bSArPSBsZWZ0OworICAgIH0KKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgIGJsZW5kX3BpeGVsKGRzdCwgc3JjLCBhbHBoYSwgbWFzaywgbWFza19saW5lc2l6ZSwgbDJkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgMSA8PCBoc3ViLCBoYmFuZCwgaHN1YiArIHZzdWIsIHhtKTsKKyAgICAgICAgZHN0ICs9IGRzdF9kZWx0YTsKKyAgICAgICAgeG0gKz0gMSA8PCBoc3ViOworICAgIH0KKyAgICBpZiAocmlnaHQpCisgICAgICAgIGJsZW5kX3BpeGVsKGRzdCwgc3JjLCBhbHBoYSwgbWFzaywgbWFza19saW5lc2l6ZSwgbDJkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgcmlnaHQsIGhiYW5kLCBoc3ViICsgdnN1YiwgeG0pOworfQorCit2b2lkIGZmX2JsZW5kX21hc2soRkZEcmF3Q29udGV4dCAqZHJhdywgRkZEcmF3Q29sb3IgKmNvbG9yLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0X2xpbmVzaXplW10sIGludCBkc3RfdywgaW50IGRzdF9oLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm1hc2ssICBpbnQgbWFza19saW5lc2l6ZSwgaW50IG1hc2tfdywgaW50IG1hc2tfaCwKKyAgICAgICAgICAgICAgICAgICBpbnQgbDJkZXB0aCwgdW5zaWduZWQgZW5kaWFubmVzcywgaW50IHgwLCBpbnQgeTApCit7CisgICAgdW5zaWduZWQgYWxwaGEsIG5iX3BsYW5lcywgbmJfY29tcCwgcGxhbmUsIGNvbXA7CisgICAgaW50IHhtMCwgeW0wLCB3X3N1YiwgaF9zdWIsIHhfc3ViLCB5X3N1YiwgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB5OworICAgIHVpbnQ4X3QgKnAwLCAqcCwgKm07CisKKyAgICBjbGlwX2ludGVydmFsKGRzdF93LCAmeDAsICZtYXNrX3csICZ4bTApOworICAgIGNsaXBfaW50ZXJ2YWwoZHN0X2gsICZ5MCwgJm1hc2tfaCwgJnltMCk7CisgICAgbWFzayArPSB5bTAgKiBtYXNrX2xpbmVzaXplOworICAgIGlmIChtYXNrX3cgPD0gMCB8fCBtYXNrX2ggPD0gMCB8fCAhY29sb3ItPnJnYmFbM10pCisgICAgICAgIHJldHVybjsKKyAgICAvKiBhbHBoYSBpcyBpbiB0aGUgWyAwIDsgMHgxMDIwMyBdIHJhbmdlLAorICAgICAgIGFscGhhICogbWFzayBpcyBpbiB0aGUgWyAwIDsgMHgxMDEwMTAxIC0gNCBdIHJhbmdlICovCisgICAgYWxwaGEgPSAoMHgxMDMwNyAqIGNvbG9yLT5yZ2JhWzNdICsgMHgzKSA+PiA4OworICAgIG5iX3BsYW5lcyA9IChkcmF3LT5uYl9wbGFuZXMgLSAxKSB8IDE7IC8qIGVsaW1pbmF0ZSBhbHBoYSAqLworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IG5iX3BsYW5lczsgcGxhbmUrKykgeworICAgICAgICBuYl9jb21wID0gZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXTsKKyAgICAgICAgcDAgPSBwb2ludGVyX2F0KGRyYXcsIGRzdCwgZHN0X2xpbmVzaXplLCBwbGFuZSwgeDAsIHkwKTsKKyAgICAgICAgd19zdWIgPSBtYXNrX3c7CisgICAgICAgIGhfc3ViID0gbWFza19oOworICAgICAgICB4X3N1YiA9IHgwOworICAgICAgICB5X3N1YiA9IHkwOworICAgICAgICBzdWJzYW1wbGluZ19ib3VuZHMoZHJhdy0+aHN1YltwbGFuZV0sICZ4X3N1YiwgJndfc3ViLCAmbGVmdCwgJnJpZ2h0KTsKKyAgICAgICAgc3Vic2FtcGxpbmdfYm91bmRzKGRyYXctPnZzdWJbcGxhbmVdLCAmeV9zdWIsICZoX3N1YiwgJnRvcCwgJmJvdHRvbSk7CisgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCBuYl9jb21wOyBjb21wKyspIHsKKyAgICAgICAgICAgIGlmICghY29tcG9uZW50X3VzZWQoZHJhdywgcGxhbmUsIGNvbXApKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcCA9IHAwICsgY29tcDsKKyAgICAgICAgICAgIG0gPSBtYXNrOworICAgICAgICAgICAgaWYgKHRvcCkgeworICAgICAgICAgICAgICAgIGJsZW5kX2xpbmVfaHYocCwgZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLT5jb21wW3BsYW5lXS51OFtjb21wXSwgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLCBtYXNrX2xpbmVzaXplLCBsMmRlcHRoLCB3X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPmhzdWJbcGxhbmVdLCBkcmF3LT52c3ViW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtMCwgbGVmdCwgcmlnaHQsIHRvcCk7CisgICAgICAgICAgICAgICAgcCArPSBkc3RfbGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgICAgIG0gKz0gdG9wICogbWFza19saW5lc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoX3N1YjsgeSsrKSB7CisgICAgICAgICAgICAgICAgYmxlbmRfbGluZV9odihwLCBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3ItPmNvbXBbcGxhbmVdLnU4W2NvbXBdLCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0sIG1hc2tfbGluZXNpemUsIGwyZGVwdGgsIHdfc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy0+aHN1YltwbGFuZV0sIGRyYXctPnZzdWJbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG0wLCBsZWZ0LCByaWdodCwgMSA8PCBkcmF3LT52c3ViW3BsYW5lXSk7CisgICAgICAgICAgICAgICAgcCArPSBkc3RfbGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgICAgIG0gKz0gbWFza19saW5lc2l6ZSA8PCBkcmF3LT52c3ViW3BsYW5lXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChib3R0b20pCisgICAgICAgICAgICAgICAgYmxlbmRfbGluZV9odihwLCBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3ItPmNvbXBbcGxhbmVdLnU4W2NvbXBdLCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0sIG1hc2tfbGluZXNpemUsIGwyZGVwdGgsIHdfc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy0+aHN1YltwbGFuZV0sIGRyYXctPnZzdWJbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG0wLCBsZWZ0LCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGZmX2RyYXdfcm91bmRfdG9fc3ViKEZGRHJhd0NvbnRleHQgKmRyYXcsIGludCBzdWJfZGlyLCBpbnQgcm91bmRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkKK3sKKyAgICB1bnNpZ25lZCBzaGlmdCA9IHN1Yl9kaXIgPyBkcmF3LT52c3ViX21heCA6IGRyYXctPmhzdWJfbWF4OworCisgICAgaWYgKCFzaGlmdCkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIGlmIChyb3VuZF9kaXIgPj0gMCkKKyAgICAgICAgdmFsdWUgKz0gcm91bmRfZGlyID8gKDEgPDwgc2hpZnQpIC0gMSA6IDEgPDwgKHNoaWZ0IC0gMSk7CisgICAgcmV0dXJuICh2YWx1ZSA+PiBzaGlmdCkgPDwgc2hpZnQ7Cit9CisKK0FWRmlsdGVyRm9ybWF0cyAqZmZfZHJhd19zdXBwb3J0ZWRfcGl4ZWxfZm9ybWF0cyh1bnNpZ25lZCBmbGFncykKK3sKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgaTsKKyAgICBGRkRyYXdDb250ZXh0IGRyYXc7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmbXRzID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGF2X3BpeF9mbXRfZGVzY19nZXQoaSk7IGkrKykKKyAgICAgICAgaWYgKGZmX2RyYXdfaW5pdCgmZHJhdywgaSwgZmxhZ3MpID49IDApCisgICAgICAgICAgICBmZl9hZGRfZm9ybWF0KCZmbXRzLCBpKTsKKyAgICByZXR1cm4gZm10czsKK30KKworI2lmZGVmIFRFU1QKKworI3VuZGVmIHByaW50ZgorCitpbnQgbWFpbih2b2lkKQoreworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKKyAgICBGRkRyYXdDb250ZXh0IGRyYXc7CisgICAgRkZEcmF3Q29sb3IgY29sb3I7CisgICAgaW50IHIsIGk7CisKKyAgICBmb3IgKGYgPSAwOyBhdl9waXhfZm10X2Rlc2NfZ2V0KGYpOyBmKyspIHsKKyAgICAgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZik7CisgICAgICAgIGlmICghZGVzYy0+bmFtZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBwcmludGYoIlRlc3RpbmcgJXMuLi4lKnMiLCBkZXNjLT5uYW1lLAorICAgICAgICAgICAgICAgKGludCkoMTYgLSBzdHJsZW4oZGVzYy0+bmFtZSkpLCAiIik7CisgICAgICAgIHIgPSBmZl9kcmF3X2luaXQoJmRyYXcsIGYsIDApOworICAgICAgICBpZiAociA8IDApIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICAgICAgICBhdl9zdHJlcnJvcihyLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgIHByaW50Zigibm86ICVzXG4iLCBidWYpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZmZfZHJhd19jb2xvcigmZHJhdywgJmNvbG9yLCAodWludDhfdFtdKSB7IDEsIDAsIDAsIDEgfSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoY29sb3IpOyBpKyspCisgICAgICAgICAgICBpZiAoKCh1aW50OF90ICopJmNvbG9yKVtpXSAhPSAxMjgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChpID09IHNpemVvZihjb2xvcikpIHsKKyAgICAgICAgICAgIHByaW50ZigiZmFsbGJhY2sgY29sb3JcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJva1xuIik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9kcmF3dXRpbHMuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9kcmF3dXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmZmZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2RyYXd1dGlscy5oCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfRFJBV1VUSUxTX0gKKyNkZWZpbmUgQVZGSUxURVJfRFJBV1VUSUxTX0gKKworLyoqCisgKiBAZmlsZQorICogbWlzYyBkcmF3aW5nIHV0aWxpdGllcworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKworaW50IGZmX2ZpbGxfcmdiYV9tYXAodWludDhfdCAqcmdiYV9tYXAsIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KTsKKworaW50IGZmX2ZpbGxfbGluZV93aXRoX2NvbG9yKHVpbnQ4X3QgKmxpbmVbNF0sIGludCBwaXhlbF9zdGVwWzRdLCBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRzdF9jb2xvcls0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgdWludDhfdCByZ2JhX2NvbG9yWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaXNfcGFja2VkX3JnYmEsIHVpbnQ4X3QgcmdiYV9tYXBbNF0pOworCit2b2lkIGZmX2RyYXdfcmVjdGFuZ2xlKHVpbnQ4X3QgKmRzdFs0XSwgaW50IGRzdF9saW5lc2l6ZVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjWzRdLCBpbnQgcGl4ZWxzdGVwWzRdLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN1YiwgaW50IHZzdWIsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKKwordm9pZCBmZl9jb3B5X3JlY3RhbmdsZSh1aW50OF90ICpkc3RbNF0sIGludCBkc3RfbGluZXNpemVbNF0sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyY1s0XSwgaW50IHNyY19saW5lc2l6ZVs0XSwgaW50IHBpeGVsc3RlcFs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdWIsIGludCB2c3ViLCBpbnQgeCwgaW50IHksIGludCB5MiwgaW50IHcsIGludCBoKTsKKworI2RlZmluZSBNQVhfUExBTkVTIDQKKwordHlwZWRlZiBzdHJ1Y3QgRkZEcmF3Q29udGV4dCB7CisgICAgY29uc3Qgc3RydWN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZm9ybWF0OworICAgIHVuc2lnbmVkIG5iX3BsYW5lczsKKyAgICBpbnQgcGl4ZWxzdGVwW01BWF9QTEFORVNdOyAvKjwgb2Zmc2V0IGJldHdlZW4gcGl4ZWxzICovCisgICAgdWludDhfdCBjb21wX21hc2tbTUFYX1BMQU5FU107IC8qPCBiaXRtYXNrIG9mIHVzZWQgbm9uLWFscGhhIGNvbXBvbmVudHMgKi8KKyAgICB1aW50OF90IGhzdWJbTUFYX1BMQU5FU107ICAvKjwgaG9yaXpvbnRhbCBzdWJzYW1wbGluZyAqLworICAgIHVpbnQ4X3QgdnN1YltNQVhfUExBTkVTXTsgIC8qPCB2ZXJ0aWNhbCBzdWJzYW1wbGluZyAqLworICAgIHVpbnQ4X3QgaHN1Yl9tYXg7CisgICAgdWludDhfdCB2c3ViX21heDsKK30gRkZEcmF3Q29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgRkZEcmF3Q29sb3IgeworICAgIHVpbnQ4X3QgcmdiYVs0XTsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IHUzMjsKKyAgICAgICAgdWludDE2X3QgdTE2OworICAgICAgICB1aW50OF90ICB1OFs0XTsKKyAgICB9IGNvbXBbTUFYX1BMQU5FU107Cit9IEZGRHJhd0NvbG9yOworCisvKioKKyAqIEluaXQgYSBkcmF3IGNvbnRleHQuCisgKgorICogT25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIHBpeGVsIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCwgaWYgZm9ybWF0IGlzIG5vdAorICogc3VwcG9ydGVkIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBlcnJvci4KKyAqIE5vIGZsYWdzIGN1cnJlbnRseSBkZWZpbmVkLgorICogQHJldHVybiAgMCBmb3Igc3VjY2VzcywgPCAwIGZvciBlcnJvcgorICovCitpbnQgZmZfZHJhd19pbml0KEZGRHJhd0NvbnRleHQgKmRyYXcsIGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXQsIHVuc2lnbmVkIGZsYWdzKTsKKworLyoqCisgKiBQcmVwYXJlIGEgY29sb3IuCisgKi8KK3ZvaWQgZmZfZHJhd19jb2xvcihGRkRyYXdDb250ZXh0ICpkcmF3LCBGRkRyYXdDb2xvciAqY29sb3IsIGNvbnN0IHVpbnQ4X3QgcmdiYVs0XSk7CisKKy8qKgorICogQ29weSBhIHJlY3RhbmdsZSBmcm9tIGFuIGltYWdlIHRvIGFub3RoZXIuCisgKgorICogVGhlIGNvb3JkaW5hdGVzIG11c3QgYmUgYXMgZXZlbiBhcyB0aGUgc3Vic2FtcGxpbmcgcmVxdWlyZXMuCisgKi8KK3ZvaWQgZmZfY29weV9yZWN0YW5nbGUyKEZGRHJhd0NvbnRleHQgKmRyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RbXSwgaW50IGRzdF9saW5lc2l6ZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjW10sIGludCBzcmNfbGluZXNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfeCwgaW50IGRzdF95LCBpbnQgc3JjX3gsIGludCBzcmNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCk7CisKKy8qKgorICogRmlsbCBhIHJlY3RhbmdsZSB3aXRoIGFuIHVuaWZvcm0gY29sb3IuCisgKgorICogVGhlIGNvb3JkaW5hdGVzIG11c3QgYmUgYXMgZXZlbiBhcyB0aGUgc3Vic2FtcGxpbmcgcmVxdWlyZXMuCisgKiBUaGUgY29sb3IgbmVlZHMgdG8gYmUgaW5pdGVkIHdpdGggZmZfZHJhd19jb2xvci4KKyAqLwordm9pZCBmZl9maWxsX3JlY3RhbmdsZShGRkRyYXdDb250ZXh0ICpkcmF3LCBGRkRyYXdDb2xvciAqY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0X2xpbmVzaXplW10sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfeCwgaW50IGRzdF95LCBpbnQgdywgaW50IGgpOworCisvKioKKyAqIEJsZW5kIGEgcmVjdGFuZ2xlIHdpdGggYW4gdW5pZm9ybSBjb2xvci4KKyAqLwordm9pZCBmZl9ibGVuZF9yZWN0YW5nbGUoRkZEcmF3Q29udGV4dCAqZHJhdywgRkZEcmF3Q29sb3IgKmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RfbGluZXNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfdywgaW50IGRzdF9oLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgwLCBpbnQgeTAsIGludCB3LCBpbnQgaCk7CisKKy8qKgorICogQmxlbmQgYW4gYWxwaGEgbWFzayB3aXRoIGFuIHVuaWZvcm0gY29sb3IuCisgKgorICogQHBhcmFtIGRyYXcgICAgICAgICAgIGRyYXcgY29udGV4dAorICogQHBhcmFtIGNvbG9yICAgICAgICAgIGNvbG9yIGZvciB0aGUgb3ZlcmxheTsKKyAqIEBwYXJhbSBkc3QgICAgICAgICAgICBkZXN0aW5hdGlvbiBpbWFnZQorICogQHBhcmFtIGRzdF9saW5lc2l6ZSAgIGxpbmUgc3RyaWRlIG9mIHRoZSBkZXN0aW5hdGlvbgorICogQHBhcmFtIGRzdF93ICAgICAgICAgIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBpbWFnZQorICogQHBhcmFtIGRzdF9oICAgICAgICAgIGhlaWdodCBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UKKyAqIEBwYXJhbSBtYXNrICAgICAgICAgICBtYXNrCisgKiBAcGFyYW0gbWFza19saW5lc2l6ZSAgbGluZSBzdHJpZGUgb2YgdGhlIG1hc2sKKyAqIEBwYXJhbSBtYXNrX3cgICAgICAgICB3aWR0aCBvZiB0aGUgbWFzaworICogQHBhcmFtIG1hc2tfaCAgICAgICAgIGhlaWdodCBvZiB0aGUgbWFzaworICogQHBhcmFtIGwyZGVwdGggICAgICAgIGxvZzIgb2YgZGVwdGggb2YgdGhlIG1hc2sgKDAgZm9yIDFicHAsIDMgZm9yIDhicHApCisgKiBAcGFyYW0gZW5kaWFubmVzcyAgICAgYml0IG9yZGVyIG9mIHRoZSBtYXNrICgwOiBNU0IgdG8gdGhlIGxlZnQpCisgKiBAcGFyYW0geDAgICAgICAgICAgICAgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgb3ZlcmxheQorICogQHBhcmFtIHkwICAgICAgICAgICAgIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5CisgKi8KK3ZvaWQgZmZfYmxlbmRfbWFzayhGRkRyYXdDb250ZXh0ICpkcmF3LCBGRkRyYXdDb2xvciAqY29sb3IsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RfbGluZXNpemVbXSwgaW50IGRzdF93LCBpbnQgZHN0X2gsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbWFzaywgaW50IG1hc2tfbGluZXNpemUsIGludCBtYXNrX3csIGludCBtYXNrX2gsCisgICAgICAgICAgICAgICAgICAgaW50IGwyZGVwdGgsIHVuc2lnbmVkIGVuZGlhbm5lc3MsIGludCB4MCwgaW50IHkwKTsKKworLyoqCisgKiBSb3VuZCBhIGRpbWVuc2lvbiBhY2NvcmRpbmcgdG8gc3Vic2FtcGxpbmcuCisgKgorICogQHBhcmFtIGRyYXcgICAgICAgZHJhdyBjb250ZXh0CisgKiBAcGFyYW0gc3ViX2RpciAgICAwIGZvciBob3Jpem9udGFsLCAxIGZvciB2ZXJ0aWNhbAorICogQHBhcmFtIHJvdW5kX2RpciAgMCBuZWFyZXN0LCAtMSByb3VuZCBkb3duLCArMSByb3VuZCB1cAorICogQHBhcmFtIHZhbHVlICAgICAgdmFsdWUgdG8gcm91bmQKKyAqIEByZXR1cm4gIHRoZSByb3VuZGVkIHZhbHVlCisgKi8KK2ludCBmZl9kcmF3X3JvdW5kX3RvX3N1YihGRkRyYXdDb250ZXh0ICpkcmF3LCBpbnQgc3ViX2RpciwgaW50IHJvdW5kX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpOworCisvKioKKyAqIFJldHVybiB0aGUgbGlzdCBvZiBwaXhlbCBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGUgZHJhdyBmdW5jdGlvbnMuCisgKgorICogVGhlIGZsYWdzIGFyZSB0aGUgc2FtZSBhcyBmZl9kcmF3X2luaXQsIGkuZS4sIG5vbmUgY3VycmVudGx5LgorICovCitBVkZpbHRlckZvcm1hdHMgKmZmX2RyYXdfc3VwcG9ydGVkX3BpeGVsX2Zvcm1hdHModW5zaWduZWQgZmxhZ3MpOworCisjZW5kaWYgLyogQVZGSUxURVJfRFJBV1VUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9kdWFsaW5wdXQuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9kdWFsaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWY2ODEwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2R1YWxpbnB1dC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImR1YWxpbnB1dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lc3RhbXAuaCIKKworc3RhdGljIGludCBwcm9jZXNzX2ZyYW1lKEZGRnJhbWVTeW5jICpmcykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGZzLT5wYXJlbnQ7CisgICAgRkZEdWFsSW5wdXRDb250ZXh0ICpzID0gZnMtPm9wYXF1ZTsKKyAgICBBVkZyYW1lICptYWlucGljID0gTlVMTCwgKnNlY29uZHBpYyA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19nZXRfZnJhbWUoJnMtPmZzLCAwLCAmbWFpbnBpYywgICAxKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZzLT5mcywgMSwgJnNlY29uZHBpYywgMCkpIDwgMCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZtYWlucGljKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgYXZfYXNzZXJ0MChtYWlucGljKTsKKyAgICBtYWlucGljLT5wdHMgPSBhdl9yZXNjYWxlX3EobWFpbnBpYy0+cHRzLCBzLT5mcy50aW1lX2Jhc2UsIGN0eC0+b3V0cHV0c1swXS0+dGltZV9iYXNlKTsKKyAgICBpZiAoc2Vjb25kcGljICYmICFjdHgtPmlzX2Rpc2FibGVkKQorICAgICAgICBtYWlucGljID0gcy0+cHJvY2VzcyhjdHgsIG1haW5waWMsIHNlY29uZHBpYyk7CisgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgbWFpbnBpYyk7CisgICAgYXZfYXNzZXJ0MShyZXQgIT0gQVZFUlJPUihFQUdBSU4pKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfZHVhbGlucHV0X2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEZGRHVhbElucHV0Q29udGV4dCAqcykKK3sKKyAgICBGRkZyYW1lU3luY0luICppbiA9IHMtPmZzLmluOworCisgICAgZmZfZnJhbWVzeW5jX2luaXQoJnMtPmZzLCBjdHgsIDIpOworICAgIHMtPmZzLm9wYXF1ZSA9IHM7CisgICAgcy0+ZnMub25fZXZlbnQgPSBwcm9jZXNzX2ZyYW1lOworICAgIGluWzBdLnRpbWVfYmFzZSA9IGN0eC0+aW5wdXRzWzBdLT50aW1lX2Jhc2U7CisgICAgaW5bMV0udGltZV9iYXNlID0gY3R4LT5pbnB1dHNbMV0tPnRpbWVfYmFzZTsKKyAgICBpblswXS5zeW5jICAgPSAyOworICAgIGluWzBdLmJlZm9yZSA9IEVYVF9TVE9QOworICAgIGluWzBdLmFmdGVyICA9IEVYVF9JTkZJTklUWTsKKyAgICBpblsxXS5zeW5jICAgPSAxOworICAgIGluWzFdLmJlZm9yZSA9IEVYVF9OVUxMOworICAgIGluWzFdLmFmdGVyICA9IEVYVF9JTkZJTklUWTsKKworICAgIGlmIChzLT5zaG9ydGVzdCkKKyAgICAgICAgaW5bMF0uYWZ0ZXIgPSBpblsxXS5hZnRlciA9IEVYVF9TVE9QOworICAgIGlmICghcy0+cmVwZWF0bGFzdCkgeworICAgICAgICBpblsxXS5hZnRlciA9IEVYVF9OVUxMOworICAgICAgICBpblsxXS5zeW5jICA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19jb25maWd1cmUoJnMtPmZzKTsKK30KKworaW50IGZmX2R1YWxpbnB1dF9maWx0ZXJfZnJhbWUoRkZEdWFsSW5wdXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19maWx0ZXJfZnJhbWUoJnMtPmZzLCBpbmxpbmssIGluKTsKK30KKworaW50IGZmX2R1YWxpbnB1dF9yZXF1ZXN0X2ZyYW1lKEZGRHVhbElucHV0Q29udGV4dCAqcywgQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfcmVxdWVzdF9mcmFtZSgmcy0+ZnMsIG91dGxpbmspOworfQorCit2b2lkIGZmX2R1YWxpbnB1dF91bmluaXQoRkZEdWFsSW5wdXRDb250ZXh0ICpzKQoreworICAgIGZmX2ZyYW1lc3luY191bmluaXQoJnMtPmZzKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9kdWFsaW5wdXQuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9kdWFsaW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWMwZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2R1YWxpbnB1dC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRG91YmxlIGlucHV0IHN0cmVhbXMgaGVscGVyIGZvciBmaWx0ZXJzCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9EVUFMSU5QVVRfSAorI2RlZmluZSBBVkZJTFRFUl9EVUFMSU5QVVRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiYnVmZmVycXVldWUuaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRkZGcmFtZVN5bmMgZnM7CisgICAgRkZGcmFtZVN5bmNJbiBzZWNvbmRfaW5wdXQ7IC8qIG11c3QgYmUgaW1tZWRpYXRlbHkgYWZ0ZXIgZnMgKi8KKworICAgIEFWRnJhbWUgKigqcHJvY2VzcykoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKm1haW4sIGNvbnN0IEFWRnJhbWUgKnNlY29uZCk7CisgICAgaW50IHNob3J0ZXN0OyAgICAgICAgICAgICAgIC8vLzwgdGVybWluYXRlIHN0cmVhbSB3aGVuIHRoZSBzZWNvbmQgaW5wdXQgdGVybWluYXRlcworICAgIGludCByZXBlYXRsYXN0OyAgICAgICAgICAgICAvLy88IHJlcGVhdCBsYXN0IHNlY29uZCBmcmFtZQorfSBGRkR1YWxJbnB1dENvbnRleHQ7CisKK2ludCBmZl9kdWFsaW5wdXRfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCwgRkZEdWFsSW5wdXRDb250ZXh0ICpzKTsKK2ludCBmZl9kdWFsaW5wdXRfZmlsdGVyX2ZyYW1lKEZGRHVhbElucHV0Q29udGV4dCAqcywgQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKTsKK2ludCBmZl9kdWFsaW5wdXRfcmVxdWVzdF9mcmFtZShGRkR1YWxJbnB1dENvbnRleHQgKnMsIEFWRmlsdGVyTGluayAqb3V0bGluayk7Cit2b2lkIGZmX2R1YWxpbnB1dF91bmluaXQoRkZEdWFsSW5wdXRDb250ZXh0ICpzKTsKKworI2VuZGlmIC8qIEFWRklMVEVSX0RVQUxJTlBVVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvZl9lYnVyMTI4LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZl9lYnVyMTI4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4YWU3OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9mX2VidXIxMjguYwpAQCAtMCwwICsxLDkzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBFQlUgUi4xMjggaW1wbGVtZW50YXRpb24KKyAqIEBzZWUgaHR0cDovL3RlY2guZWJ1LmNoL2xvdWRuZXNzCisgKiBAc2VlIGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9aXVFdFFxQy1TcW8gIkVCVSBSMTI4IEludHJvZHVjdGlvbiAtIEZsb3JpYW4gQ2FtZXJlciIKKyAqIEB0b2RvIGltcGxlbWVudCBzdGFydC9zdG9wL3Jlc2V0IHRocm91Z2ggZmlsdGVyIGNvbW1hbmQgaW5qZWN0aW9uCisgKiBAdG9kbyBzdXBwb3J0IG90aGVyIGZyZXF1ZW5jaWVzIHRvIGF2b2lkIHJlc2FtcGxpbmcKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveGdhX2ZvbnRfZGF0YS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisjaW5jbHVkZSAibGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIE1BWF9DSEFOTkVMUyA2MworCisvKiBwcmUtZmlsdGVyIGNvZWZmaWNpZW50cyAqLworI2RlZmluZSBQUkVfQjAgIDEuNTM1MTI0ODU5NTg2OTcKKyNkZWZpbmUgUFJFX0IxIC0yLjY5MTY5NjE4OTQwNjM4CisjZGVmaW5lIFBSRV9CMiAgMS4xOTgzOTI4MTA4NTI4NQorI2RlZmluZSBQUkVfQTEgLTEuNjkwNjU5MjkzMTgyNDEKKyNkZWZpbmUgUFJFX0EyICAwLjczMjQ4MDc3NDIxNTg1CisKKy8qIFJMQi1maWx0ZXIgY29lZmZpY2llbnRzICovCisjZGVmaW5lIFJMQl9CMCAgMS4wCisjZGVmaW5lIFJMQl9CMSAtMi4wCisjZGVmaW5lIFJMQl9CMiAgMS4wCisjZGVmaW5lIFJMQl9BMSAtMS45OTAwNDc0NTQ4MzM5OAorI2RlZmluZSBSTEJfQTIgIDAuOTkwMDcyMjUwMzY2MjEKKworI2RlZmluZSBBQlNfVEhSRVMgICAgLTcwICAgICAgICAgICAgLy8vPCBzaWxlbmNlIGdhdGU6IHdlIGRpc2NhcmQgYW55dGhpbmcgYmVsb3cgdGhpcyBhYnNvbHV0ZSAoTFVGUykgdGhyZXNob2xkCisjZGVmaW5lIEFCU19VUF9USFJFUyAgMTAgICAgICAgICAgICAvLy88IHVwcGVyIGxvdWQgbGltaXQgdG8gY29uc2lkZXIgKEFCU19USFJFUyBiZWluZyB0aGUgbWluaW11bSkKKyNkZWZpbmUgSElTVF9HUkFJTiAgIDEwMCAgICAgICAgICAgIC8vLzwgZGVmaW5lcyBoaXN0b2dyYW0gcHJlY2lzaW9uCisjZGVmaW5lIEhJU1RfU0laRSAgKChBQlNfVVBfVEhSRVMgLSBBQlNfVEhSRVMpICogSElTVF9HUkFJTiArIDEpCisKKy8qKgorICogQSBoaXN0b2dyYW0gaXMgYW4gYXJyYXkgb2YgSElTVF9TSVpFIGhpc3RfZW50cnkgc3RvcmluZyBhbGwgdGhlIGVuZXJnaWVzCisgKiByZWNvcmRlZCAod2l0aCBhbiBhY2N1cmFjeSBvZiAxL0hJU1RfR1JBSU4pIG9mIHRoZSBsb3VkbmVzc2VzIGZyb20gQUJTX1RIUkVTCisgKiAoYXQgMCkgdG8gQUJTX1VQX1RIUkVTIChhdCBISVNUX1NJWkUtMSkuCisgKiBUaGlzIGZpeGVkLXNpemUgc3lzdGVtIGF2b2lkcyB0aGUgbmVlZCBvZiBhIGxpc3Qgb2YgZW5lcmdpZXMgZ3Jvd2luZworICogaW5maW5pdGVseSBvdmVyIHRoZSB0aW1lIGFuZCBpcyB0aHVzIG1vcmUgc2NhbGFibGUuCisgKi8KK3N0cnVjdCBoaXN0X2VudHJ5IHsKKyAgICBpbnQgY291bnQ7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaG93IG1hbnkgdGltZXMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2NjdXJyZWQKKyAgICBkb3VibGUgZW5lcmd5OyAgICAgICAgICAgICAgICAgIC8vLzwgRSA9IDEwXigoTCArIDAuNjkxKSAvIDEwKQorICAgIGRvdWJsZSBsb3VkbmVzczsgICAgICAgICAgICAgICAgLy8vPCBMID0gLTAuNjkxICsgMTAgKiBsb2cxMChFKQorfTsKKworc3RydWN0IGludGVncmF0b3IgeworICAgIGRvdWJsZSAqY2FjaGVbTUFYX0NIQU5ORUxTXTsgICAgLy8vPCB3aW5kb3cgb2YgZmlsdGVyZWQgc2FtcGxlcyAoTiBtcykKKyAgICBpbnQgY2FjaGVfcG9zOyAgICAgICAgICAgICAgICAgIC8vLzwgZm9jdXMgb24gdGhlIGxhc3QgYWRkZWQgYmluIGluIHRoZSBjYWNoZSBhcnJheQorICAgIGRvdWJsZSBzdW1bTUFYX0NIQU5ORUxTXTsgICAgICAgLy8vPCBzdW0gb2YgdGhlIGxhc3QgTiBtcyBmaWx0ZXJlZCBzYW1wbGVzIChjYWNoZSBjb250ZW50KQorICAgIGludCBmaWxsZWQ7ICAgICAgICAgICAgICAgICAgICAgLy8vPCAxIGlmIHRoZSBjYWNoZSBpcyBjb21wbGV0ZWx5IGZpbGxlZCwgMCBvdGhlcndpc2UKKyAgICBkb3VibGUgcmVsX3RocmVzaG9sZDsgICAgICAgICAgIC8vLzwgcmVsYXRpdmUgdGhyZXNob2xkCisgICAgZG91YmxlIHN1bV9rZXB0X3Bvd2VyczsgICAgICAgICAvLy88IHN1bSBvZiB0aGUgcG93ZXJzICh3ZWlnaHRlZCBzdW1zKSBhYm92ZSBhYnNvbHV0ZSB0aHJlc2hvbGQKKyAgICBpbnQgbmJfa2VwdF9wb3dlcnM7ICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHN1bSBhYm92ZSBhYnNvbHV0ZSB0aHJlc2hvbGQKKyAgICBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGlzdG9ncmFtOyAgIC8vLzwgaGlzdG9ncmFtIG9mIHRoZSBwb3dlcnMsIHVzZWQgdG8gY29tcHV0ZSBMUkEgYW5kIEkKK307CisKK3N0cnVjdCByZWN0IHsgaW50IHgsIHksIHcsIGg7IH07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsgICAgICAgICAgIC8vLzwgQVZDbGFzcyBjb250ZXh0IGZvciBsb2cgYW5kIG9wdGlvbnMgcHVycG9zZQorCisgICAgLyogcGVhayBtZXRlcmluZyAqLworICAgIGludCBwZWFrX21vZGU7ICAgICAgICAgICAgICAgICAgLy8vPCBlbmFibGVkIHBlYWsgbW9kZXMKKyAgICBkb3VibGUgKnRydWVfcGVha3M7ICAgICAgICAgICAgIC8vLzwgdHJ1ZSBwZWFrcyBwZXIgY2hhbm5lbAorICAgIGRvdWJsZSAqc2FtcGxlX3BlYWtzOyAgICAgICAgICAgLy8vPCBzYW1wbGUgcGVha3MgcGVyIGNoYW5uZWwKKyAgICBkb3VibGUgKnRydWVfcGVha3NfcGVyX2ZyYW1lOyAgIC8vLzwgdHJ1ZSBwZWFrcyBpbiBhIGZyYW1lIHBlciBjaGFubmVsCisjaWYgQ09ORklHX1NXUkVTQU1QTEUKKyAgICBTd3JDb250ZXh0ICpzd3JfY3R4OyAgICAgICAgICAgIC8vLzwgb3Zlci1zYW1wbGluZyBjb250ZXh0IGZvciB0cnVlIHBlYWsgbWV0ZXJpbmcKKyAgICBkb3VibGUgKnN3cl9idWY7ICAgICAgICAgICAgICAgIC8vLzwgcmVzYW1wbGVkIGF1ZGlvIGRhdGEgZm9yIHRydWUgcGVhayBtZXRlcmluZworICAgIGludCBzd3JfbGluZXNpemU7CisjZW5kaWYKKworICAgIC8qIHZpZGVvICAqLworICAgIGludCBkb192aWRlbzsgICAgICAgICAgICAgICAgICAgLy8vPCAxIGlmIHZpZGVvIG91dHB1dCBlbmFibGVkLCAwIG90aGVyd2lzZQorICAgIGludCB3LCBoOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzaXplIG9mIHRoZSB2aWRlbyBvdXRwdXQKKyAgICBzdHJ1Y3QgcmVjdCB0ZXh0OyAgICAgICAgICAgICAgIC8vLzwgcmVjdGFuZ2xlIGZvciB0aGUgTFUgbGVnZW5kIG9uIHRoZSBsZWZ0CisgICAgc3RydWN0IHJlY3QgZ3JhcGg7ICAgICAgICAgICAgICAvLy88IHJlY3RhbmdsZSBmb3IgdGhlIG1haW4gZ3JhcGggaW4gdGhlIGNlbnRlcgorICAgIHN0cnVjdCByZWN0IGdhdWdlOyAgICAgICAgICAgICAgLy8vPCByZWN0YW5nbGUgZm9yIHRoZSBnYXVnZSBvbiB0aGUgcmlnaHQKKyAgICBBVkZyYW1lICpvdXRwaWNyZWY7ICAgICAgICAgICAgIC8vLzwgb3V0cHV0IHBpY3R1cmUgcmVmZXJlbmNlLCB1cGRhdGVkIHJlZ3VsYXJseQorICAgIGludCBtZXRlcjsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzZWxlY3QgYSBFQlUgbW9kZSBiZXR3ZWVuICs5IGFuZCArMTgKKyAgICBpbnQgc2NhbGVfcmFuZ2U7ICAgICAgICAgICAgICAgIC8vLzwgdGhlIHJhbmdlIG9mIExVIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIG1ldGVyCisgICAgaW50IHlfemVyb19sdTsgICAgICAgICAgICAgICAgICAvLy88IHRoZSB5IHZhbHVlIChwaXhlbCBwb3NpdGlvbikgZm9yIDAgTFUKKyAgICBpbnQgKnlfbGluZV9yZWY7ICAgICAgICAgICAgICAgIC8vLzwgeSByZWZlcmVuY2UgdmFsdWVzIGZvciBkcmF3aW5nIHRoZSBMVSBsaW5lcyBpbiB0aGUgZ3JhcGggYW5kIHRoZSBnYXVnZQorCisgICAgLyogYXVkaW8gKi8KKyAgICBpbnQgbmJfY2hhbm5lbHM7ICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBpbnB1dAorICAgIGRvdWJsZSAqY2hfd2VpZ2h0aW5nOyAgICAgICAgICAgLy8vPCBjaGFubmVsIHdlaWdodGluZyBtYXBwaW5nCisgICAgaW50IHNhbXBsZV9jb3VudDsgICAgICAgICAgICAgICAvLy88IHNhbXBsZSBjb3VudCB1c2VkIGZvciByZWZyZXNoIGZyZXF1ZW5jeSwgcmVzZXQgYXQgcmVmcmVzaAorCisgICAgLyogRmlsdGVyIGNhY2hlcy4KKyAgICAgKiBUaGUgbXVsdCBieSAzIGluIHRoZSBmb2xsb3dpbmcgaXMgZm9yIFhbaV0sIFhbaS0xXSBhbmQgWFtpLTJdICovCisgICAgZG91YmxlIHhbTUFYX0NIQU5ORUxTICogM107ICAgICAvLy88IDMgaW5wdXQgc2FtcGxlcyBjYWNoZSBmb3IgZWFjaCBjaGFubmVsCisgICAgZG91YmxlIHlbTUFYX0NIQU5ORUxTICogM107ICAgICAvLy88IDMgcHJlLWZpbHRlciBzYW1wbGVzIGNhY2hlIGZvciBlYWNoIGNoYW5uZWwKKyAgICBkb3VibGUgeltNQVhfQ0hBTk5FTFMgKiAzXTsgICAgIC8vLzwgMyBSTEItZmlsdGVyIHNhbXBsZXMgY2FjaGUgZm9yIGVhY2ggY2hhbm5lbAorCisjZGVmaW5lIEk0MDBfQklOUyAgKDQ4MDAwICogNCAvIDEwKQorI2RlZmluZSBJMzAwMF9CSU5TICg0ODAwMCAqIDMpCisgICAgc3RydWN0IGludGVncmF0b3IgaTQwMDsgICAgICAgICAvLy88IDQwMG1zIGludGVncmF0b3IsIHVzZWQgZm9yIE1vbWVudGFyeSBsb3VkbmVzcyAgKE0pLCBhbmQgSW50ZWdyYXRlZCBsb3VkbmVzcyAoSSkKKyAgICBzdHJ1Y3QgaW50ZWdyYXRvciBpMzAwMDsgICAgICAgIC8vLzwgICAgM3MgaW50ZWdyYXRvciwgdXNlZCBmb3IgU2hvcnQgdGVybSBsb3VkbmVzcyAoUyksIGFuZCBMb3VkbmVzcyBSYW5nZSAgICAgIChMUkEpCisKKyAgICAvKiBJIGFuZCBMUkEgc3BlY2lmaWMgKi8KKyAgICBkb3VibGUgaW50ZWdyYXRlZF9sb3VkbmVzczsgICAgIC8vLzwgaW50ZWdyYXRlZCBsb3VkbmVzcyBpbiBMVUZTIChJKQorICAgIGRvdWJsZSBsb3VkbmVzc19yYW5nZTsgICAgICAgICAgLy8vPCBsb3VkbmVzcyByYW5nZSBpbiBMVSAoTFJBKQorICAgIGRvdWJsZSBscmFfbG93LCBscmFfaGlnaDsgICAgICAgLy8vPCBsb3cgYW5kIGhpZ2ggTFJBIHZhbHVlcworCisgICAgLyogbWlzYyAqLworICAgIGludCBsb2dsZXZlbDsgICAgICAgICAgICAgICAgICAgLy8vPCBsb2cgbGV2ZWwgZm9yIGZyYW1lIGxvZ2dpbmcKKyAgICBpbnQgbWV0YWRhdGE7ICAgICAgICAgICAgICAgICAgIC8vLzwgd2hldGhlciBvciBub3QgdG8gaW5qZWN0IGxvdWRuZXNzIHJlc3VsdHMgaW4gZnJhbWVzCit9IEVCVVIxMjhDb250ZXh0OworCitlbnVtIHsKKyAgICBQRUFLX01PREVfTk9ORSAgICAgICAgICA9IDAsCisgICAgUEVBS19NT0RFX1NBTVBMRVNfUEVBS1MgPSAxPDwxLAorICAgIFBFQUtfTU9ERV9UUlVFX1BFQUtTICAgID0gMTw8MiwKK307CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEVCVVIxMjhDb250ZXh0LCB4KQorI2RlZmluZSBBIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNCisjZGVmaW5lIFYgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKyNkZWZpbmUgRiBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBlYnVyMTI4X29wdGlvbnNbXSA9IHsKKyAgICB7ICJ2aWRlbyIsICJzZXQgdmlkZW8gb3V0cHV0IiwgT0ZGU0VUKGRvX3ZpZGVvKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxLCBWfEYgfSwKKyAgICB7ICJzaXplIiwgICJzZXQgdmlkZW8gc2l6ZSIsICAgT0ZGU0VUKHcpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9ICI2NDB4NDgwIn0sIDAsIDAsIFZ8RiB9LAorICAgIHsgIm1ldGVyIiwgInNldCBzY2FsZSBtZXRlciAoKzkgdG8gKzE4KSIsICBPRkZTRVQobWV0ZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gOX0sIDksIDE4LCBWfEYgfSwKKyAgICB7ICJmcmFtZWxvZyIsICJmb3JjZSBmcmFtZSBsb2dnaW5nIGxldmVsIiwgT0ZGU0VUKGxvZ2xldmVsKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgICBJTlRfTUlOLCBJTlRfTUFYLCBBfFZ8RiwgImxldmVsIiB9LAorICAgICAgICB7ICJpbmZvIiwgICAgImluZm9ybWF0aW9uIGxvZ2dpbmcgbGV2ZWwiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9MT0dfSU5GT30sICAgIElOVF9NSU4sIElOVF9NQVgsIEF8VnxGLCAibGV2ZWwiIH0sCisgICAgICAgIHsgInZlcmJvc2UiLCAidmVyYm9zZSBsb2dnaW5nIGxldmVsIiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0xPR19WRVJCT1NFfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfEYsICJsZXZlbCIgfSwKKyAgICB7ICJtZXRhZGF0YSIsICJpbmplY3QgbWV0YWRhdGEgaW4gdGhlIGZpbHRlcmdyYXBoIiwgT0ZGU0VUKG1ldGFkYXRhKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxLCBBfFZ8RiB9LAorICAgIHsgInBlYWsiLCAic2V0IHBlYWsgbW9kZSIsIE9GRlNFVChwZWFrX21vZGUpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSBQRUFLX01PREVfTk9ORX0sIDAsIElOVF9NQVgsIEF8RiwgIm1vZGUiIH0sCisgICAgICAgIHsgIm5vbmUiLCAgICJkaXNhYmxlIGFueSBwZWFrIG1vZGUiLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFBFQUtfTU9ERV9OT05FfSwgICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgQXxGLCAibW9kZSIgfSwKKyAgICAgICAgeyAic2FtcGxlIiwgImVuYWJsZSBwZWFrLXNhbXBsZSBtb2RlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gUEVBS19NT0RFX1NBTVBMRVNfUEVBS1N9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEYsICJtb2RlIiB9LAorICAgICAgICB7ICJ0cnVlIiwgICAiZW5hYmxlIHRydWUtcGVhayBtb2RlIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBQRUFLX01PREVfVFJVRV9QRUFLU30sICAgIElOVF9NSU4sIElOVF9NQVgsIEF8RiwgIm1vZGUiIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZWJ1cjEyOCk7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGdyYXBoX2NvbG9yc1tdID0geworICAgIDB4ZGQsIDB4NjYsIDB4NjYsICAgLy8gdmFsdWUgYWJvdmUgMExVIG5vbiByZWFjaGVkCisgICAgMHg2NiwgMHg2NiwgMHhkZCwgICAvLyB2YWx1ZSBiZWxvdyAwTFUgbm9uIHJlYWNoZWQKKyAgICAweDk2LCAweDMzLCAweDMzLCAgIC8vIHZhbHVlIGFib3ZlIDBMVSByZWFjaGVkCisgICAgMHgzMywgMHgzMywgMHg5NiwgICAvLyB2YWx1ZSBiZWxvdyAwTFUgcmVhY2hlZAorICAgIDB4ZGQsIDB4OTYsIDB4OTYsICAgLy8gdmFsdWUgYWJvdmUgMExVIGxpbmUgbm9uIHJlYWNoZWQKKyAgICAweDk2LCAweDk2LCAweGRkLCAgIC8vIHZhbHVlIGJlbG93IDBMVSBsaW5lIG5vbiByZWFjaGVkCisgICAgMHhkZCwgMHgzMywgMHgzMywgICAvLyB2YWx1ZSBhYm92ZSAwTFUgbGluZSByZWFjaGVkCisgICAgMHgzMywgMHgzMywgMHhkZCwgICAvLyB2YWx1ZSBiZWxvdyAwTFUgbGluZSByZWFjaGVkCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCAqZ2V0X2dyYXBoX2NvbG9yKGNvbnN0IEVCVVIxMjhDb250ZXh0ICplYnVyMTI4LCBpbnQgdiwgaW50IHkpCit7CisgICAgY29uc3QgaW50IGJlbG93MCAgPSB5ID4gZWJ1cjEyOC0+eV96ZXJvX2x1OworICAgIGNvbnN0IGludCByZWFjaGVkID0geSA+PSB2OworICAgIGNvbnN0IGludCBsaW5lICAgID0gZWJ1cjEyOC0+eV9saW5lX3JlZlt5XSB8fCB5ID09IGVidXIxMjgtPnlfemVyb19sdTsKKyAgICBjb25zdCBpbnQgY29sb3JpZCA9IDQqbGluZSArIDIqcmVhY2hlZCArIGJlbG93MDsKKyAgICByZXR1cm4gZ3JhcGhfY29sb3JzICsgMypjb2xvcmlkOworfQorCitzdGF0aWMgaW5saW5lIGludCBsdV90b195KGNvbnN0IEVCVVIxMjhDb250ZXh0ICplYnVyMTI4LCBkb3VibGUgdikKK3sKKyAgICB2ICs9IDIgKiBlYnVyMTI4LT5tZXRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBpdCBpbiByYW5nZSBbMDsuLi5dCisgICAgdiAgPSBhdl9jbGlwZih2LCAwLCBlYnVyMTI4LT5zY2FsZV9yYW5nZSk7ICAgICAgICAgIC8vIG1ha2Ugc3VyZSBpdCdzIGluIHRoZSBncmFwaCBzY2FsZQorICAgIHYgID0gZWJ1cjEyOC0+c2NhbGVfcmFuZ2UgLSB2OyAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZlcnQgdmFsdWUgKHk9MCBpcyBvbiB0b3ApCisgICAgcmV0dXJuIHYgKiBlYnVyMTI4LT5ncmFwaC5oIC8gZWJ1cjEyOC0+c2NhbGVfcmFuZ2U7IC8vIHJlc2NhbGUgZnJvbSBzY2FsZSByYW5nZSB0byBweCBoZWlnaHQKK30KKworI2RlZmluZSBGT05UOCAgIDAKKyNkZWZpbmUgRk9OVDE2ICAxCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGZvbnRfY29sb3JzW10gPSB7CisgICAgMHhkZCwgMHhkZCwgMHgwMCwKKyAgICAweDAwLCAweDk2LCAweDk2LAorfTsKKworc3RhdGljIHZvaWQgZHJhd3RleHQoQVZGcmFtZSAqcGljLCBpbnQgeCwgaW50IHksIGludCBmdGlkLCBjb25zdCB1aW50OF90ICpjb2xvciwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgaW50IGk7CisgICAgY2hhciBidWZbMTI4XSA9IHswfTsKKyAgICBjb25zdCB1aW50OF90ICpmb250OworICAgIGludCBmb250X2hlaWdodDsKKyAgICB2YV9saXN0IHZsOworCisgICAgaWYgICAgICAoZnRpZCA9PSBGT05UMTYpIGZvbnQgPSBhdnByaXZfdmdhMTZfZm9udCwgZm9udF9oZWlnaHQgPSAxNjsKKyAgICBlbHNlIGlmIChmdGlkID09IEZPTlQ4KSAgZm9udCA9IGF2cHJpdl9jZ2FfZm9udCwgICBmb250X2hlaWdodCA9ICA4OworICAgIGVsc2UgcmV0dXJuOworCisgICAgdmFfc3RhcnQodmwsIGZtdCk7CisgICAgdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgdmwpOworICAgIHZhX2VuZCh2bCk7CisKKyAgICBmb3IgKGkgPSAwOyBidWZbaV07IGkrKykgeworICAgICAgICBpbnQgY2hhcl95LCBtYXNrOworICAgICAgICB1aW50OF90ICpwID0gcGljLT5kYXRhWzBdICsgeSpwaWMtPmxpbmVzaXplWzBdICsgKHggKyBpKjgpKjM7CisKKyAgICAgICAgZm9yIChjaGFyX3kgPSAwOyBjaGFyX3kgPCBmb250X2hlaWdodDsgY2hhcl95KyspIHsKKyAgICAgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2s7IG1hc2sgPj49IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm9udFtidWZbaV0gKiBmb250X2hlaWdodCArIGNoYXJfeV0gJiBtYXNrKQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkocCwgY29sb3IsIDMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHAsICJceDAwXHgwMFx4MDAiLCAzKTsKKyAgICAgICAgICAgICAgICBwICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwICs9IHBpYy0+bGluZXNpemVbMF0gLSA4KjM7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdsaW5lKEFWRnJhbWUgKnBpYywgaW50IHgsIGludCB5LCBpbnQgbGVuLCBpbnQgc3RlcCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90ICpwID0gcGljLT5kYXRhWzBdICsgeSpwaWMtPmxpbmVzaXplWzBdICsgeCozOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIG1lbWNweShwLCAiXHgwMFx4ZmZceDAwIiwgMyk7CisgICAgICAgIHAgKz0gc3RlcDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3ZpZGVvX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgaW50IGksIHgsIHk7CisgICAgdWludDhfdCAqcDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBFQlVSMTI4Q29udGV4dCAqZWJ1cjEyOCA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpvdXRwaWNyZWY7CisKKyAgICAvKiBjaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gcmVwcmVzZW50IGV2ZXJ5dGhpbmcgZGVjZW50bHkgKi8KKyAgICBpZiAoZWJ1cjEyOC0+dyA8IDY0MCB8fCBlYnVyMTI4LT5oIDwgNDgwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlZpZGVvIHNpemUgJWR4JWQgaXMgdG9vIHNtYWxsLCAiCisgICAgICAgICAgICAgICAibWluaW11bSBzaXplIGlzIDY0MHg0ODBcbiIsIGVidXIxMjgtPncsIGVidXIxMjgtPmgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBvdXRsaW5rLT53ID0gZWJ1cjEyOC0+dzsKKyAgICBvdXRsaW5rLT5oID0gZWJ1cjEyOC0+aDsKKworI2RlZmluZSBQQUQgOAorCisgICAgLyogY29uZmlndXJlIHRleHQgYXJlYSBwb3NpdGlvbiBhbmQgc2l6ZSAqLworICAgIGVidXIxMjgtPnRleHQueCAgPSBQQUQ7CisgICAgZWJ1cjEyOC0+dGV4dC55ICA9IDQwOworICAgIGVidXIxMjgtPnRleHQudyAgPSAzICogODsgICAvLyAzIGNoYXJhY3RlcnMKKyAgICBlYnVyMTI4LT50ZXh0LmggID0gZWJ1cjEyOC0+aCAtIFBBRCAtIGVidXIxMjgtPnRleHQueTsKKworICAgIC8qIGNvbmZpZ3VyZSBnYXVnZSBwb3NpdGlvbiBhbmQgc2l6ZSAqLworICAgIGVidXIxMjgtPmdhdWdlLncgPSAyMDsKKyAgICBlYnVyMTI4LT5nYXVnZS5oID0gZWJ1cjEyOC0+dGV4dC5oOworICAgIGVidXIxMjgtPmdhdWdlLnggPSBlYnVyMTI4LT53IC0gUEFEIC0gZWJ1cjEyOC0+Z2F1Z2UudzsKKyAgICBlYnVyMTI4LT5nYXVnZS55ID0gZWJ1cjEyOC0+dGV4dC55OworCisgICAgLyogY29uZmlndXJlIGdyYXBoIHBvc2l0aW9uIGFuZCBzaXplICovCisgICAgZWJ1cjEyOC0+Z3JhcGgueCA9IGVidXIxMjgtPnRleHQueCArIGVidXIxMjgtPnRleHQudyArIFBBRDsKKyAgICBlYnVyMTI4LT5ncmFwaC55ID0gZWJ1cjEyOC0+Z2F1Z2UueTsKKyAgICBlYnVyMTI4LT5ncmFwaC53ID0gZWJ1cjEyOC0+Z2F1Z2UueCAtIGVidXIxMjgtPmdyYXBoLnggLSBQQUQ7CisgICAgZWJ1cjEyOC0+Z3JhcGguaCA9IGVidXIxMjgtPmdhdWdlLmg7CisKKyAgICAvKiBncmFwaCBhbmQgZ2F1Z2Ugc2hhcmUgdGhlIExVLXRvLXBpeGVsIGNvZGUgKi8KKyAgICBhdl9hc3NlcnQwKGVidXIxMjgtPmdyYXBoLmggPT0gZWJ1cjEyOC0+Z2F1Z2UuaCk7CisKKyAgICAvKiBwcmVwYXJlIHRoZSBpbml0aWFsIHBpY3JlZiBidWZmZXIgKi8KKyAgICBhdl9mcmFtZV9mcmVlKCZlYnVyMTI4LT5vdXRwaWNyZWYpOworICAgIGVidXIxMjgtPm91dHBpY3JlZiA9IG91dHBpY3JlZiA9CisgICAgICAgIGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXRwaWNyZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsxLDF9OworCisgICAgLyogaW5pdCB5IHJlZmVyZW5jZXMgdmFsdWVzICh0byBkcmF3IExVIGxpbmVzKSAqLworICAgIGVidXIxMjgtPnlfbGluZV9yZWYgPSBhdl9jYWxsb2MoZWJ1cjEyOC0+Z3JhcGguaCArIDEsIHNpemVvZigqZWJ1cjEyOC0+eV9saW5lX3JlZikpOworICAgIGlmICghZWJ1cjEyOC0+eV9saW5lX3JlZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8qIGJsYWNrIGJhY2tncm91bmQgKi8KKyAgICBtZW1zZXQob3V0cGljcmVmLT5kYXRhWzBdLCAwLCBlYnVyMTI4LT5oICogb3V0cGljcmVmLT5saW5lc2l6ZVswXSk7CisKKyAgICAvKiBkcmF3IExVIGxlZ2VuZHMgKi8KKyAgICBkcmF3dGV4dChvdXRwaWNyZWYsIFBBRCwgUEFEKzE2LCBGT05UOCwgZm9udF9jb2xvcnMrMywgIiBMVSIpOworICAgIGZvciAoaSA9IGVidXIxMjgtPm1ldGVyOyBpID49IC1lYnVyMTI4LT5tZXRlciAqIDI7IGktLSkgeworICAgICAgICB5ID0gbHVfdG9feShlYnVyMTI4LCBpKTsKKyAgICAgICAgeCA9IFBBRCArIChpIDwgMTAgJiYgaSA+IC0xMCkgKiA4OworICAgICAgICBlYnVyMTI4LT55X2xpbmVfcmVmW3ldID0gaTsKKyAgICAgICAgeSAtPSA0OyAvLyAtNCB0byBjZW50ZXIgdmVydGljYWxseQorICAgICAgICBkcmF3dGV4dChvdXRwaWNyZWYsIHgsIHkgKyBlYnVyMTI4LT5ncmFwaC55LCBGT05UOCwgZm9udF9jb2xvcnMrMywKKyAgICAgICAgICAgICAgICAgIiVjJWQiLCBpIDwgMCA/ICctJyA6IGkgPiAwID8gJysnIDogJyAnLCBGRkFCUyhpKSk7CisgICAgfQorCisgICAgLyogZHJhdyBncmFwaCAqLworICAgIGVidXIxMjgtPnlfemVyb19sdSA9IGx1X3RvX3koZWJ1cjEyOCwgMCk7CisgICAgcCA9IG91dHBpY3JlZi0+ZGF0YVswXSArIGVidXIxMjgtPmdyYXBoLnkgKiBvdXRwaWNyZWYtPmxpbmVzaXplWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVidXIxMjgtPmdyYXBoLnggKiAzOworICAgIGZvciAoeSA9IDA7IHkgPCBlYnVyMTI4LT5ncmFwaC5oOyB5KyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqYyA9IGdldF9ncmFwaF9jb2xvcihlYnVyMTI4LCBJTlRfTUFYLCB5KTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZWJ1cjEyOC0+Z3JhcGgudzsgeCsrKQorICAgICAgICAgICAgbWVtY3B5KHAgKyB4KjMsIGMsIDMpOworICAgICAgICBwICs9IG91dHBpY3JlZi0+bGluZXNpemVbMF07CisgICAgfQorCisgICAgLyogZHJhdyBmYW5jeSByZWN0YW5nbGVzIGFyb3VuZCB0aGUgZ3JhcGggYW5kIHRoZSBnYXVnZSAqLworI2RlZmluZSBEUkFXX1JFQ1QocikgZG8geyBcCisgICAgZHJhd2xpbmUob3V0cGljcmVmLCByLngsICAgICAgIHIueSAtIDEsICAgci53LCAzKTsgXAorICAgIGRyYXdsaW5lKG91dHBpY3JlZiwgci54LCAgICAgICByLnkgKyByLmgsIHIudywgMyk7IFwKKyAgICBkcmF3bGluZShvdXRwaWNyZWYsIHIueCAtIDEsICAgci55LCAgICAgICByLmgsIG91dHBpY3JlZi0+bGluZXNpemVbMF0pOyBcCisgICAgZHJhd2xpbmUob3V0cGljcmVmLCByLnggKyByLncsIHIueSwgICAgICAgci5oLCBvdXRwaWNyZWYtPmxpbmVzaXplWzBdKTsgXAorfSB3aGlsZSAoMCkKKyAgICBEUkFXX1JFQ1QoZWJ1cjEyOC0+Z3JhcGgpOworICAgIERSQVdfUkVDVChlYnVyMTI4LT5nYXVnZSk7CisKKyAgICBvdXRsaW5rLT5mbGFncyB8PSBGRl9MSU5LX0ZMQUdfUkVRVUVTVF9MT09QOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2F1ZGlvX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgRUJVUjEyOENvbnRleHQgKmVidXIxMjggPSBjdHgtPnByaXY7CisKKyAgICAvKiBGb3JjZSAxMDBtcyBmcmFtaW5nIGluIGNhc2Ugb2YgbWV0YWRhdGEgaW5qZWN0aW9uOiB0aGUgZnJhbWVzIG11c3QgaGF2ZQorICAgICAqIGEgZ3JhbnVsYXJpdHkgb2YgdGhlIHdpbmRvdyBvdmVybGFwIHRvIGJlIGFjY3VyYXRlbHkgZXhwbG9pdGVkLgorICAgICAqIEFzIGZvciB0aGUgdHJ1ZSBwZWFrcyBtb2RlLCBpdCBqdXN0IHNpbXBsaWZpZXMgdGhlIHJlc2FtcGxpbmcgYnVmZmVyCisgICAgICogYWxsb2NhdGlvbiBhbmQgdGhlIGxvb2t1cCBpbiBpdCAoc2luY2Ugc2FtcGxlIGJ1ZmZlcnMgZGlmZmVyIGluIHNpemUsIGl0CisgICAgICogY2FuIGJlIG1vcmUgY29tcGxleCB0byBpbnRlZ3JhdGUgaW4gdGhlIG9uZS1zYW1wbGUgbG9vcCBvZgorICAgICAqIGZpbHRlcl9mcmFtZSgpKS4gKi8KKyAgICBpZiAoZWJ1cjEyOC0+bWV0YWRhdGEgfHwgKGVidXIxMjgtPnBlYWtfbW9kZSAmIFBFQUtfTU9ERV9UUlVFX1BFQUtTKSkKKyAgICAgICAgaW5saW5rLT5taW5fc2FtcGxlcyA9CisgICAgICAgIGlubGluay0+bWF4X3NhbXBsZXMgPQorICAgICAgICBpbmxpbmstPnBhcnRpYWxfYnVmX3NpemUgPSBpbmxpbmstPnNhbXBsZV9yYXRlIC8gMTA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2F1ZGlvX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgaW50IGk7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgRUJVUjEyOENvbnRleHQgKmVidXIxMjggPSBjdHgtPnByaXY7CisgICAgY29uc3QgaW50IG5iX2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKG91dGxpbmstPmNoYW5uZWxfbGF5b3V0KTsKKworI2RlZmluZSBCQUNLX01BU0sgKEFWX0NIX0JBQ0tfTEVGVCAgICB8QVZfQ0hfQkFDS19DRU5URVIgICAgfEFWX0NIX0JBQ0tfUklHSFR8IFwKKyAgICAgICAgICAgICAgICAgICBBVl9DSF9UT1BfQkFDS19MRUZUfEFWX0NIX1RPUF9CQUNLX0NFTlRFUnxBVl9DSF9UT1BfQkFDS19SSUdIVHwgXAorICAgICAgICAgICAgICAgICAgIEFWX0NIX1NJREVfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgfEFWX0NIX1NJREVfUklHSFR8IFwKKyAgICAgICAgICAgICAgICAgICBBVl9DSF9TVVJST1VORF9ESVJFQ1RfTEVGVCAgICAgICAgICAgICAgIHxBVl9DSF9TVVJST1VORF9ESVJFQ1RfUklHSFQpCisKKyAgICBlYnVyMTI4LT5uYl9jaGFubmVscyAgPSBuYl9jaGFubmVsczsKKyAgICBlYnVyMTI4LT5jaF93ZWlnaHRpbmcgPSBhdl9jYWxsb2MobmJfY2hhbm5lbHMsIHNpemVvZigqZWJ1cjEyOC0+Y2hfd2VpZ2h0aW5nKSk7CisgICAgaWYgKCFlYnVyMTI4LT5jaF93ZWlnaHRpbmcpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfY2hhbm5lbHM7IGkrKykgeworICAgICAgICAvKiBjaGFubmVsIHdlaWdodGluZyAqLworICAgICAgICBjb25zdCB1aW50MTZfdCBjaGwgPSBhdl9jaGFubmVsX2xheW91dF9leHRyYWN0X2NoYW5uZWwob3V0bGluay0+Y2hhbm5lbF9sYXlvdXQsIGkpOworICAgICAgICBpZiAoY2hsICYgKEFWX0NIX0xPV19GUkVRVUVOQ1l8QVZfQ0hfTE9XX0ZSRVFVRU5DWV8yKSkgeworICAgICAgICAgICAgZWJ1cjEyOC0+Y2hfd2VpZ2h0aW5nW2ldID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChjaGwgJiBCQUNLX01BU0spIHsKKyAgICAgICAgICAgIGVidXIxMjgtPmNoX3dlaWdodGluZ1tpXSA9IDEuNDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlYnVyMTI4LT5jaF93ZWlnaHRpbmdbaV0gPSAxLjA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWVidXIxMjgtPmNoX3dlaWdodGluZ1tpXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIGJpbnMgYnVmZmVyIGZvciB0aGUgdHdvIGludGVncmF0aW9uIHdpbmRvdyAoNDAwbXMgYW5kIDNzKSAqLworICAgICAgICBlYnVyMTI4LT5pNDAwLmNhY2hlW2ldICA9IGF2X2NhbGxvYyhJNDAwX0JJTlMsICBzaXplb2YoKmVidXIxMjgtPmk0MDAuY2FjaGVbMF0pKTsKKyAgICAgICAgZWJ1cjEyOC0+aTMwMDAuY2FjaGVbaV0gPSBhdl9jYWxsb2MoSTMwMDBfQklOUywgc2l6ZW9mKCplYnVyMTI4LT5pMzAwMC5jYWNoZVswXSkpOworICAgICAgICBpZiAoIWVidXIxMjgtPmk0MDAuY2FjaGVbaV0gfHwgIWVidXIxMjgtPmkzMDAwLmNhY2hlW2ldKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBvdXRsaW5rLT5mbGFncyB8PSBGRl9MSU5LX0ZMQUdfUkVRVUVTVF9MT09QOworCisjaWYgQ09ORklHX1NXUkVTQU1QTEUKKyAgICBpZiAoZWJ1cjEyOC0+cGVha19tb2RlICYgUEVBS19NT0RFX1RSVUVfUEVBS1MpIHsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBlYnVyMTI4LT5zd3JfYnVmICAgID0gYXZfbWFsbG9jX2FycmF5KG5iX2NoYW5uZWxzLCAxOTIwMCAqIHNpemVvZihkb3VibGUpKTsKKyAgICAgICAgZWJ1cjEyOC0+dHJ1ZV9wZWFrcyA9IGF2X2NhbGxvYyhuYl9jaGFubmVscywgc2l6ZW9mKCplYnVyMTI4LT50cnVlX3BlYWtzKSk7CisgICAgICAgIGVidXIxMjgtPnRydWVfcGVha3NfcGVyX2ZyYW1lID0gYXZfY2FsbG9jKG5iX2NoYW5uZWxzLCBzaXplb2YoKmVidXIxMjgtPnRydWVfcGVha3NfcGVyX2ZyYW1lKSk7CisgICAgICAgIGVidXIxMjgtPnN3cl9jdHggICAgPSBzd3JfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFlYnVyMTI4LT5zd3JfYnVmIHx8ICFlYnVyMTI4LT50cnVlX3BlYWtzIHx8CisgICAgICAgICAgICAhZWJ1cjEyOC0+dHJ1ZV9wZWFrc19wZXJfZnJhbWUgfHwgIWVidXIxMjgtPnN3cl9jdHgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGF2X29wdF9zZXRfaW50KGVidXIxMjgtPnN3cl9jdHgsICJpbl9jaGFubmVsX2xheW91dCIsICAgIG91dGxpbmstPmNoYW5uZWxfbGF5b3V0LCAwKTsKKyAgICAgICAgYXZfb3B0X3NldF9pbnQoZWJ1cjEyOC0+c3dyX2N0eCwgImluX3NhbXBsZV9yYXRlIiwgICAgICAgb3V0bGluay0+c2FtcGxlX3JhdGUsIDApOworICAgICAgICBhdl9vcHRfc2V0X3NhbXBsZV9mbXQoZWJ1cjEyOC0+c3dyX2N0eCwgImluX3NhbXBsZV9mbXQiLCBvdXRsaW5rLT5mb3JtYXQsIDApOworCisgICAgICAgIGF2X29wdF9zZXRfaW50KGVidXIxMjgtPnN3cl9jdHgsICJvdXRfY2hhbm5lbF9sYXlvdXQiLCAgICBvdXRsaW5rLT5jaGFubmVsX2xheW91dCwgMCk7CisgICAgICAgIGF2X29wdF9zZXRfaW50KGVidXIxMjgtPnN3cl9jdHgsICJvdXRfc2FtcGxlX3JhdGUiLCAgICAgICAxOTIwMDAsIDApOworICAgICAgICBhdl9vcHRfc2V0X3NhbXBsZV9mbXQoZWJ1cjEyOC0+c3dyX2N0eCwgIm91dF9zYW1wbGVfZm10Iiwgb3V0bGluay0+Zm9ybWF0LCAwKTsKKworICAgICAgICByZXQgPSBzd3JfaW5pdChlYnVyMTI4LT5zd3JfY3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGVidXIxMjgtPnBlYWtfbW9kZSAmIFBFQUtfTU9ERV9TQU1QTEVTX1BFQUtTKSB7CisgICAgICAgIGVidXIxMjgtPnNhbXBsZV9wZWFrcyA9IGF2X2NhbGxvYyhuYl9jaGFubmVscywgc2l6ZW9mKCplYnVyMTI4LT5zYW1wbGVfcGVha3MpKTsKKyAgICAgICAgaWYgKCFlYnVyMTI4LT5zYW1wbGVfcGVha3MpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEVORVJHWShsb3VkbmVzcykgKHBvdygxMCwgKChsb3VkbmVzcykgKyAwLjY5MSkgLyAxMC4pKQorI2RlZmluZSBMT1VETkVTUyhlbmVyZ3kpICgtMC42OTEgKyAxMCAqIGxvZzEwKGVuZXJneSkpCisjZGVmaW5lIERCRlMoZW5lcmd5KSAoMjAgKiBsb2cxMChlbmVyZ3kpKQorCitzdGF0aWMgc3RydWN0IGhpc3RfZW50cnkgKmdldF9oaXN0b2dyYW0odm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgaGlzdF9lbnRyeSAqaCA9IGF2X2NhbGxvYyhISVNUX1NJWkUsIHNpemVvZigqaCkpOworCisgICAgaWYgKCFoKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgSElTVF9TSVpFOyBpKyspIHsKKyAgICAgICAgaFtpXS5sb3VkbmVzcyA9IGkgLyAoZG91YmxlKUhJU1RfR1JBSU4gKyBBQlNfVEhSRVM7CisgICAgICAgIGhbaV0uZW5lcmd5ICAgPSBFTkVSR1koaFtpXS5sb3VkbmVzcyk7CisgICAgfQorICAgIHJldHVybiBoOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBFQlVSMTI4Q29udGV4dCAqZWJ1cjEyOCA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlclBhZCBwYWQ7CisKKyAgICBpZiAoZWJ1cjEyOC0+bG9nbGV2ZWwgIT0gQVZfTE9HX0lORk8gJiYKKyAgICAgICAgZWJ1cjEyOC0+bG9nbGV2ZWwgIT0gQVZfTE9HX1ZFUkJPU0UpIHsKKyAgICAgICAgaWYgKGVidXIxMjgtPmRvX3ZpZGVvIHx8IGVidXIxMjgtPm1ldGFkYXRhKQorICAgICAgICAgICAgZWJ1cjEyOC0+bG9nbGV2ZWwgPSBBVl9MT0dfVkVSQk9TRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWJ1cjEyOC0+bG9nbGV2ZWwgPSBBVl9MT0dfSU5GTzsKKyAgICB9CisKKyAgICBpZiAoIUNPTkZJR19TV1JFU0FNUExFICYmIChlYnVyMTI4LT5wZWFrX21vZGUgJiBQRUFLX01PREVfVFJVRV9QRUFLUykpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRydWUtcGVhayBtb2RlIHJlcXVpcmVzIGxpYnN3cmVzYW1wbGUgdG8gYmUgcGVyZm9ybWVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvLyBpZiBtZXRlciBpcyAgKzkgc2NhbGUsIHNjYWxlIHJhbmdlIGlzIGZyb20gLTE4IExVIHRvICArOSBMVSAob3IgMyo5KQorICAgIC8vIGlmIG1ldGVyIGlzICsxOCBzY2FsZSwgc2NhbGUgcmFuZ2UgaXMgZnJvbSAtMzYgTFUgdG8gKzE4IExVIChvciAzKjE4KQorICAgIGVidXIxMjgtPnNjYWxlX3JhbmdlID0gMyAqIGVidXIxMjgtPm1ldGVyOworCisgICAgZWJ1cjEyOC0+aTQwMC5oaXN0b2dyYW0gID0gZ2V0X2hpc3RvZ3JhbSgpOworICAgIGVidXIxMjgtPmkzMDAwLmhpc3RvZ3JhbSA9IGdldF9oaXN0b2dyYW0oKTsKKyAgICBpZiAoIWVidXIxMjgtPmk0MDAuaGlzdG9ncmFtIHx8ICFlYnVyMTI4LT5pMzAwMC5oaXN0b2dyYW0pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBlYnVyMTI4LT5pbnRlZ3JhdGVkX2xvdWRuZXNzID0gQUJTX1RIUkVTOworICAgIGVidXIxMjgtPmxvdWRuZXNzX3JhbmdlID0gMDsKKworICAgIC8qIGluc2VydCBvdXRwdXQgcGFkcyAqLworICAgIGlmIChlYnVyMTI4LT5kb192aWRlbykgeworICAgICAgICBwYWQgPSAoQVZGaWx0ZXJQYWQpeworICAgICAgICAgICAgLm5hbWUgICAgICAgICA9IGF2X3N0cmR1cCgib3V0MCIpLAorICAgICAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfdmlkZW9fb3V0cHV0LAorICAgICAgICB9OworICAgICAgICBpZiAoIXBhZC5uYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZmZfaW5zZXJ0X291dHBhZChjdHgsIDAsICZwYWQpOworICAgIH0KKyAgICBwYWQgPSAoQVZGaWx0ZXJQYWQpeworICAgICAgICAubmFtZSAgICAgICAgID0gYXZfYXNwcmludGYoIm91dCVkIiwgZWJ1cjEyOC0+ZG9fdmlkZW8pLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2F1ZGlvX291dHB1dCwKKyAgICB9OworICAgIGlmICghcGFkLm5hbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfaW5zZXJ0X291dHBhZChjdHgsIGVidXIxMjgtPmRvX3ZpZGVvLCAmcGFkKTsKKworICAgIC8qIHN1bW1hcnkgKi8KKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkVCVSArJWQgc2NhbGVcbiIsIGVidXIxMjgtPm1ldGVyKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEhJU1RfUE9TKHBvd2VyKSAoaW50KSgoKHBvd2VyKSAtIEFCU19USFJFUykgKiBISVNUX0dSQUlOKQorCisvKiBsb3VkbmVzcyBhbmQgcG93ZXIgc2hvdWxkIGJlIHNldCBzdWNoIGFzIGxvdWRuZXNzID0gLTAuNjkxICsKKyAqIDEwKmxvZzEwKHBvd2VyKSwgd2UganVzdCBhdm9pZCBkb2luZyB0aGF0IGNhbGN1bHVzIHR3byB0aW1lcyAqLworc3RhdGljIGludCBnYXRlX3VwZGF0ZShzdHJ1Y3QgaW50ZWdyYXRvciAqaW50ZWcsIGRvdWJsZSBwb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxvdWRuZXNzLCBpbnQgZ2F0ZV90aHJlcykKK3sKKyAgICBpbnQgaXBvd2VyOworICAgIGRvdWJsZSByZWxhdGl2ZV90aHJlc2hvbGQ7CisgICAgaW50IGdhdGVfaGlzdF9wb3M7CisKKyAgICAvKiB1cGRhdGUgcG93ZXJzIGhpc3RvZ3JhbXMgYnkgaW5jcmVtZW50aW5nIGN1cnJlbnQgcG93ZXIgY291bnQgKi8KKyAgICBpcG93ZXIgPSBhdl9jbGlwKEhJU1RfUE9TKGxvdWRuZXNzKSwgMCwgSElTVF9TSVpFIC0gMSk7CisgICAgaW50ZWctPmhpc3RvZ3JhbVtpcG93ZXJdLmNvdW50Kys7CisKKyAgICAvKiBjb21wdXRlIHJlbGF0aXZlIHRocmVzaG9sZCBhbmQgZ2V0IGl0cyBwb3NpdGlvbiBpbiB0aGUgaGlzdG9ncmFtICovCisgICAgaW50ZWctPnN1bV9rZXB0X3Bvd2VycyArPSBwb3dlcjsKKyAgICBpbnRlZy0+bmJfa2VwdF9wb3dlcnMrKzsKKyAgICByZWxhdGl2ZV90aHJlc2hvbGQgPSBpbnRlZy0+c3VtX2tlcHRfcG93ZXJzIC8gaW50ZWctPm5iX2tlcHRfcG93ZXJzOworICAgIGlmICghcmVsYXRpdmVfdGhyZXNob2xkKQorICAgICAgICByZWxhdGl2ZV90aHJlc2hvbGQgPSAxZS0xMjsKKyAgICBpbnRlZy0+cmVsX3RocmVzaG9sZCA9IExPVURORVNTKHJlbGF0aXZlX3RocmVzaG9sZCkgKyBnYXRlX3RocmVzOworICAgIGdhdGVfaGlzdF9wb3MgPSBhdl9jbGlwKEhJU1RfUE9TKGludGVnLT5yZWxfdGhyZXNob2xkKSwgMCwgSElTVF9TSVpFIC0gMSk7CisKKyAgICByZXR1cm4gZ2F0ZV9oaXN0X3BvczsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgY2gsIGlkeF9pbnNhbXBsZTsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEVCVVIxMjhDb250ZXh0ICplYnVyMTI4ID0gY3R4LT5wcml2OworICAgIGNvbnN0IGludCBuYl9jaGFubmVscyA9IGVidXIxMjgtPm5iX2NoYW5uZWxzOworICAgIGNvbnN0IGludCBuYl9zYW1wbGVzICA9IGluc2FtcGxlcy0+bmJfc2FtcGxlczsKKyAgICBjb25zdCBkb3VibGUgKnNhbXBsZXMgPSAoZG91YmxlICopaW5zYW1wbGVzLT5kYXRhWzBdOworICAgIEFWRnJhbWUgKnBpYyA9IGVidXIxMjgtPm91dHBpY3JlZjsKKworI2lmIENPTkZJR19TV1JFU0FNUExFCisgICAgaWYgKGVidXIxMjgtPnBlYWtfbW9kZSAmIFBFQUtfTU9ERV9UUlVFX1BFQUtTKSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSAqc3dyX3NhbXBsZXMgPSBlYnVyMTI4LT5zd3JfYnVmOworICAgICAgICBpbnQgcmV0ID0gc3dyX2NvbnZlcnQoZWJ1cjEyOC0+c3dyX2N0eCwgKHVpbnQ4X3QqKikmZWJ1cjEyOC0+c3dyX2J1ZiwgMTkyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKilpbnNhbXBsZXMtPmRhdGEsIG5iX3NhbXBsZXMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5iX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgZWJ1cjEyOC0+dHJ1ZV9wZWFrc19wZXJfZnJhbWVbY2hdID0gMC4wOworICAgICAgICBmb3IgKGlkeF9pbnNhbXBsZSA9IDA7IGlkeF9pbnNhbXBsZSA8IHJldDsgaWR4X2luc2FtcGxlKyspIHsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgZWJ1cjEyOC0+dHJ1ZV9wZWFrc1tjaF0gPSBGRk1BWChlYnVyMTI4LT50cnVlX3BlYWtzW2NoXSwgRkZBQlMoKnN3cl9zYW1wbGVzKSk7CisgICAgICAgICAgICAgICAgZWJ1cjEyOC0+dHJ1ZV9wZWFrc19wZXJfZnJhbWVbY2hdID0gRkZNQVgoZWJ1cjEyOC0+dHJ1ZV9wZWFrc19wZXJfZnJhbWVbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGQUJTKCpzd3Jfc2FtcGxlcykpOworICAgICAgICAgICAgICAgIHN3cl9zYW1wbGVzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZvciAoaWR4X2luc2FtcGxlID0gMDsgaWR4X2luc2FtcGxlIDwgbmJfc2FtcGxlczsgaWR4X2luc2FtcGxlKyspIHsKKyAgICAgICAgY29uc3QgaW50IGJpbl9pZF80MDAgID0gZWJ1cjEyOC0+aTQwMC5jYWNoZV9wb3M7CisgICAgICAgIGNvbnN0IGludCBiaW5faWRfMzAwMCA9IGVidXIxMjgtPmkzMDAwLmNhY2hlX3BvczsKKworI2RlZmluZSBNT1ZFX1RPX05FWFRfQ0FDSEVEX0VOVFJZKHRpbWUpIGRvIHsgICAgICAgICAgICAgICAgXAorICAgIGVidXIxMjgtPmkjI3RpbWUuY2FjaGVfcG9zKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlYnVyMTI4LT5pIyN0aW1lLmNhY2hlX3BvcyA9PSBJIyN0aW1lIyNfQklOUykgeyAgICAgXAorICAgICAgICBlYnVyMTI4LT5pIyN0aW1lLmZpbGxlZCAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlYnVyMTI4LT5pIyN0aW1lLmNhY2hlX3BvcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworICAgICAgICBNT1ZFX1RPX05FWFRfQ0FDSEVEX0VOVFJZKDQwMCk7CisgICAgICAgIE1PVkVfVE9fTkVYVF9DQUNIRURfRU5UUlkoMzAwMCk7CisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbmJfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBiaW47CisKKyAgICAgICAgICAgIGlmIChlYnVyMTI4LT5wZWFrX21vZGUgJiBQRUFLX01PREVfU0FNUExFU19QRUFLUykKKyAgICAgICAgICAgICAgICBlYnVyMTI4LT5zYW1wbGVfcGVha3NbY2hdID0gRkZNQVgoZWJ1cjEyOC0+c2FtcGxlX3BlYWtzW2NoXSwgRkZBQlMoKnNhbXBsZXMpKTsKKworICAgICAgICAgICAgZWJ1cjEyOC0+eFtjaCAqIDNdID0gKnNhbXBsZXMrKzsgLy8gc2V0IFhbaV0KKworICAgICAgICAgICAgaWYgKCFlYnVyMTI4LT5jaF93ZWlnaHRpbmdbY2hdKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvKiBZW2ldID0gWFtpXSpiMCArIFhbaS0xXSpiMSArIFhbaS0yXSpiMiAtIFlbaS0xXSphMSAtIFlbaS0yXSphMiAqLworI2RlZmluZSBGSUxURVIoWSwgWCwgbmFtZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkb3VibGUgKmRzdCA9IGVidXIxMjgtPlkgKyBjaCozOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvdWJsZSAqc3JjID0gZWJ1cjEyOC0+WCArIGNoKjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0WzJdID0gZHN0WzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbMV0gPSBkc3RbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXSpuYW1lIyNfQjAgKyBzcmNbMV0qbmFtZSMjX0IxICsgc3JjWzJdKm5hbWUjI19CMiAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGRzdFsxXSpuYW1lIyNfQTEgLSBkc3RbMl0qbmFtZSMjX0EyOyAgICBcCit9IHdoaWxlICgwKQorCisgICAgICAgICAgICAvLyBUT0RPOiBtZXJnZSBib3RoIGZpbHRlcnMgaW4gb25lPworICAgICAgICAgICAgRklMVEVSKHksIHgsIFBSRSk7ICAvLyBhcHBseSBwcmUtZmlsdGVyCisgICAgICAgICAgICBlYnVyMTI4LT54W2NoICogMyArIDJdID0gZWJ1cjEyOC0+eFtjaCAqIDMgKyAxXTsKKyAgICAgICAgICAgIGVidXIxMjgtPnhbY2ggKiAzICsgMV0gPSBlYnVyMTI4LT54W2NoICogMyAgICBdOworICAgICAgICAgICAgRklMVEVSKHosIHksIFJMQik7ICAvLyBhcHBseSBSTEItZmlsdGVyCisKKyAgICAgICAgICAgIGJpbiA9IGVidXIxMjgtPnpbY2ggKiAzXSAqIGVidXIxMjgtPnpbY2ggKiAzXTsKKworICAgICAgICAgICAgLyogYWRkIHRoZSBuZXcgdmFsdWUsIGFuZCBsaW1pdCB0aGUgc3VtIHRvIHRoZSBjYWNoZSBzaXplICg0MDBtcyBvciAzcykKKyAgICAgICAgICAgICAqIGJ5IHJlbW92aW5nIHRoZSBvbGRlc3Qgb25lICovCisgICAgICAgICAgICBlYnVyMTI4LT5pNDAwLnN1bSBbY2hdID0gZWJ1cjEyOC0+aTQwMC5zdW0gW2NoXSArIGJpbiAtIGVidXIxMjgtPmk0MDAuY2FjaGUgW2NoXVtiaW5faWRfNDAwXTsKKyAgICAgICAgICAgIGVidXIxMjgtPmkzMDAwLnN1bVtjaF0gPSBlYnVyMTI4LT5pMzAwMC5zdW1bY2hdICsgYmluIC0gZWJ1cjEyOC0+aTMwMDAuY2FjaGVbY2hdW2Jpbl9pZF8zMDAwXTsKKworICAgICAgICAgICAgLyogb3ZlcnJpZGUgb2xkIGNhY2hlIGVudHJ5IHdpdGggdGhlIG5ldyB2YWx1ZSAqLworICAgICAgICAgICAgZWJ1cjEyOC0+aTQwMC5jYWNoZSBbY2hdW2Jpbl9pZF80MDAgXSA9IGJpbjsKKyAgICAgICAgICAgIGVidXIxMjgtPmkzMDAwLmNhY2hlW2NoXVtiaW5faWRfMzAwMF0gPSBiaW47CisgICAgICAgIH0KKworICAgICAgICAvKiBGb3IgaW50ZWdyYXRlZCBsb3VkbmVzcywgZ2F0aW5nIGJsb2NrcyBhcmUgNDAwbXMgbG9uZyB3aXRoIDc1JQorICAgICAgICAgKiBvdmVybGFwIChzZWUgQlMuMTc3MC0yIHA1KSwgc28gYSByZS1jb21wdXRhdGlvbiBpcyBuZWVkZWQgZWFjaCAxMDBtcworICAgICAgICAgKiAoNDgwMCBzYW1wbGVzIGF0IDQ4a0h6KS4gKi8KKyAgICAgICAgaWYgKCsrZWJ1cjEyOC0+c2FtcGxlX2NvdW50ID09IDQ4MDApIHsKKyAgICAgICAgICAgIGRvdWJsZSBsb3VkbmVzc180MDAsIGxvdWRuZXNzXzMwMDA7CisgICAgICAgICAgICBkb3VibGUgcG93ZXJfNDAwID0gMWUtMTIsIHBvd2VyXzMwMDAgPSAxZS0xMjsKKyAgICAgICAgICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcHRzID0gaW5zYW1wbGVzLT5wdHMgKworICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShpZHhfaW5zYW1wbGUsIChBVlJhdGlvbmFsKXsgMSwgaW5saW5rLT5zYW1wbGVfcmF0ZSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UpOworCisgICAgICAgICAgICBlYnVyMTI4LT5zYW1wbGVfY291bnQgPSAwOworCisjZGVmaW5lIENPTVBVVEVfTE9VRE5FU1MobSwgdGltZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVidXIxMjgtPmkjI3RpbWUuZmlsbGVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIHdlaWdodGluZyBzdW0gb2YgdGhlIGxhc3QgPHRpbWU+IG1zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5iX2NoYW5uZWxzOyBjaCsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwb3dlcl8jI3RpbWUgKz0gZWJ1cjEyOC0+Y2hfd2VpZ2h0aW5nW2NoXSAqIGVidXIxMjgtPmkjI3RpbWUuc3VtW2NoXTsgICBcCisgICAgICAgIHBvd2VyXyMjdGltZSAvPSBJIyN0aW1lIyNfQklOUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG91ZG5lc3NfIyN0aW1lID0gTE9VRE5FU1MocG93ZXJfIyN0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgICAgICAgICBDT01QVVRFX0xPVURORVNTKE0sICA0MDApOworICAgICAgICAgICAgQ09NUFVURV9MT1VETkVTUyhTLCAzMDAwKTsKKworICAgICAgICAgICAgLyogSW50ZWdyYXRlZCBsb3VkbmVzcyAqLworI2RlZmluZSBJX0dBVEVfVEhSRVMgLTEwICAvLyBpbml0aWFsbHkgZGVmaW5lZCB0byAtOCBMVSBpbiB0aGUgZmlyc3QgRUJVIHN0YW5kYXJkCisKKyAgICAgICAgICAgIGlmIChsb3VkbmVzc180MDAgPj0gQUJTX1RIUkVTKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIGludGVncmF0ZWRfc3VtID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbmJfaW50ZWdyYXRlZCA9IDA7CisgICAgICAgICAgICAgICAgaW50IGdhdGVfaGlzdF9wb3MgPSBnYXRlX3VwZGF0ZSgmZWJ1cjEyOC0+aTQwMCwgcG93ZXJfNDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG91ZG5lc3NfNDAwLCBJX0dBVEVfVEhSRVMpOworCisgICAgICAgICAgICAgICAgLyogY29tcHV0ZSBpbnRlZ3JhdGVkIGxvdWRuZXNzIGJ5IHN1bW1pbmcgdGhlIGhpc3RvZ3JhbSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgKiBhYm92ZSB0aGUgcmVsYXRpdmUgdGhyZXNob2xkICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gZ2F0ZV9oaXN0X3BvczsgaSA8IEhJU1RfU0laRTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuYl92ID0gZWJ1cjEyOC0+aTQwMC5oaXN0b2dyYW1baV0uY291bnQ7CisgICAgICAgICAgICAgICAgICAgIG5iX2ludGVncmF0ZWQgICs9IG5iX3Y7CisgICAgICAgICAgICAgICAgICAgIGludGVncmF0ZWRfc3VtICs9IG5iX3YgKiBlYnVyMTI4LT5pNDAwLmhpc3RvZ3JhbVtpXS5lbmVyZ3k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuYl9pbnRlZ3JhdGVkKQorICAgICAgICAgICAgICAgICAgICBlYnVyMTI4LT5pbnRlZ3JhdGVkX2xvdWRuZXNzID0gTE9VRE5FU1MoaW50ZWdyYXRlZF9zdW0gLyBuYl9pbnRlZ3JhdGVkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTFJBICovCisjZGVmaW5lIExSQV9HQVRFX1RIUkVTIC0yMAorI2RlZmluZSBMUkFfTE9XRVJfUFJDICAgMTAKKyNkZWZpbmUgTFJBX0hJR0hFUl9QUkMgIDk1CisKKyAgICAgICAgICAgIC8qIFhYWDogZXhhbXBsZSBjb2RlIGluIEVCVSAzMzQyIGlzICI+PSIgYnV0IGZvcm11bGEgaW4gQlMuMTc3MAorICAgICAgICAgICAgICogc3BlY3MgaXMgIj4iICovCisgICAgICAgICAgICBpZiAobG91ZG5lc3NfMzAwMCA+PSBBQlNfVEhSRVMpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmJfcG93ZXJzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgZ2F0ZV9oaXN0X3BvcyA9IGdhdGVfdXBkYXRlKCZlYnVyMTI4LT5pMzAwMCwgcG93ZXJfMzAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdWRuZXNzXzMwMDAsIExSQV9HQVRFX1RIUkVTKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IGdhdGVfaGlzdF9wb3M7IGkgPCBISVNUX1NJWkU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgbmJfcG93ZXJzICs9IGVidXIxMjgtPmkzMDAwLmhpc3RvZ3JhbVtpXS5jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAobmJfcG93ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuLCBuYl9wb3c7CisKKyAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGxvd2VyIGxvdWRuZXNzIHRvIGNvbnNpZGVyICovCisgICAgICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgICAgICAgICBuYl9wb3cgPSBMUkFfTE9XRVJfUFJDICAqIG5iX3Bvd2VycyAvIDEwMC4gKyAwLjU7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGdhdGVfaGlzdF9wb3M7IGkgPCBISVNUX1NJWkU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbiArPSBlYnVyMTI4LT5pMzAwMC5oaXN0b2dyYW1baV0uY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA+PSBuYl9wb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYnVyMTI4LT5scmFfbG93ID0gZWJ1cjEyOC0+aTMwMDAuaGlzdG9ncmFtW2ldLmxvdWRuZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGhpZ2hlciBsb3VkbmVzcyB0byBjb25zaWRlciAqLworICAgICAgICAgICAgICAgICAgICBuID0gbmJfcG93ZXJzOworICAgICAgICAgICAgICAgICAgICBuYl9wb3cgPSBMUkFfSElHSEVSX1BSQyAqIG5iX3Bvd2VycyAvIDEwMC4gKyAwLjU7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IEhJU1RfU0laRSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuIC09IGVidXIxMjgtPmkzMDAwLmhpc3RvZ3JhbVtpXS5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuIDwgbmJfcG93KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWJ1cjEyOC0+bHJhX2hpZ2ggPSBlYnVyMTI4LT5pMzAwMC5oaXN0b2dyYW1baV0ubG91ZG5lc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBYWFg6IHNob3cgbG93ICYgaGlnaCBvbiB0aGUgZ3JhcGg/CisgICAgICAgICAgICAgICAgICAgIGVidXIxMjgtPmxvdWRuZXNzX3JhbmdlID0gZWJ1cjEyOC0+bHJhX2hpZ2ggLSBlYnVyMTI4LT5scmFfbG93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2RlZmluZSBMT0dfRk1UICJNOiU2LjFmIFM6JTYuMWYgICAgIEk6JTYuMWYgTFVGUyAgICAgTFJBOiU2LjFmIExVIgorCisgICAgICAgICAgICAvKiBwdXNoIG9uZSB2aWRlbyBmcmFtZSAqLworICAgICAgICAgICAgaWYgKGVidXIxMjgtPmRvX3ZpZGVvKSB7CisgICAgICAgICAgICAgICAgaW50IHgsIHksIHJldDsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpwOworCisgICAgICAgICAgICAgICAgY29uc3QgaW50IHlfbG91ZG5lc3NfbHVfZ3JhcGggPSBsdV90b195KGVidXIxMjgsIGxvdWRuZXNzXzMwMDAgKyAyMyk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHlfbG91ZG5lc3NfbHVfZ2F1Z2UgPSBsdV90b195KGVidXIxMjgsIGxvdWRuZXNzXzQwMCAgKyAyMyk7CisKKyAgICAgICAgICAgICAgICAvKiBkcmF3IHRoZSBncmFwaCB1c2luZyB0aGUgc2hvcnQtdGVybSBsb3VkbmVzcyAqLworICAgICAgICAgICAgICAgIHAgPSBwaWMtPmRhdGFbMF0gKyBlYnVyMTI4LT5ncmFwaC55KnBpYy0+bGluZXNpemVbMF0gKyBlYnVyMTI4LT5ncmFwaC54KjM7CisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGVidXIxMjgtPmdyYXBoLmg7IHkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjID0gZ2V0X2dyYXBoX2NvbG9yKGVidXIxMjgsIHlfbG91ZG5lc3NfbHVfZ3JhcGgsIHkpOworCisgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUocCwgcCArIDMsIChlYnVyMTI4LT5ncmFwaC53IC0gMSkgKiAzKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHAgKyAoZWJ1cjEyOC0+Z3JhcGgudyAtIDEpICogMywgYywgMyk7CisgICAgICAgICAgICAgICAgICAgIHAgKz0gcGljLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBkcmF3IHRoZSBnYXVnZSB1c2luZyB0aGUgbW9tZW50YXJ5IGxvdWRuZXNzICovCisgICAgICAgICAgICAgICAgcCA9IHBpYy0+ZGF0YVswXSArIGVidXIxMjgtPmdhdWdlLnkqcGljLT5saW5lc2l6ZVswXSArIGVidXIxMjgtPmdhdWdlLngqMzsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZWJ1cjEyOC0+Z2F1Z2UuaDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmMgPSBnZXRfZ3JhcGhfY29sb3IoZWJ1cjEyOCwgeV9sb3VkbmVzc19sdV9nYXVnZSwgeSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGVidXIxMjgtPmdhdWdlLnc7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwICsgeCozLCBjLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgcCArPSBwaWMtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGRyYXcgdGV4dHVhbCBpbmZvICovCisgICAgICAgICAgICAgICAgZHJhd3RleHQocGljLCBQQUQsIFBBRCAtIFBBRC8yLCBGT05UMTYsIGZvbnRfY29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExPR19GTVQgIiAgICAgIiwgLy8gcGFkZGluZyB0byBlcmFzZSB0cmFpbGluZyBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgbG91ZG5lc3NfNDAwLCBsb3VkbmVzc18zMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVidXIxMjgtPmludGVncmF0ZWRfbG91ZG5lc3MsIGVidXIxMjgtPmxvdWRuZXNzX3JhbmdlKTsKKworICAgICAgICAgICAgICAgIC8qIHNldCBwdHMgYW5kIHB1c2ggZnJhbWUgKi8KKyAgICAgICAgICAgICAgICBwaWMtPnB0cyA9IHB0czsKKyAgICAgICAgICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgYXZfZnJhbWVfY2xvbmUocGljKSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlYnVyMTI4LT5tZXRhZGF0YSkgeyAvKiBoYXBwZW5zIG9ubHkgb25jZSBwZXIgZmlsdGVyX2ZyYW1lIGNhbGwgKi8KKyAgICAgICAgICAgICAgICBjaGFyIG1ldGFidWZbMTI4XTsKKyNkZWZpbmUgTUVUQV9QUkVGSVggImxhdmZpLnIxMjguIgorCisjZGVmaW5lIFNFVF9NRVRBKG5hbWUsIHZhcikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNucHJpbnRmKG1ldGFidWYsIHNpemVvZihtZXRhYnVmKSwgIiUuM2YiLCB2YXIpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdl9kaWN0X3NldCgmaW5zYW1wbGVzLT5tZXRhZGF0YSwgbmFtZSwgbWV0YWJ1ZiwgMCk7ICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFVF9NRVRBX1BFQUsobmFtZSwgcHR5cGUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlYnVyMTI4LT5wZWFrX21vZGUgJiBQRUFLX01PREVfICMjIHB0eXBlICMjIF9QRUFLUykgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2hhciBrZXlbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5iX2NoYW5uZWxzOyBjaCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc25wcmludGYoa2V5LCBzaXplb2Yoa2V5KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIE1FVEFfUFJFRklYIEFWX1NUUklOR0lGWShuYW1lKSAiX3BlYWtzX2NoJWQiLCBjaCk7ICAgICBcCisgICAgICAgICAgICBTRVRfTUVUQShrZXksIGVidXIxMjgtPm5hbWUjI19wZWFrc1tjaF0pOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgICAgICAgICAgICAgU0VUX01FVEEoTUVUQV9QUkVGSVggIk0iLCAgICAgICAgbG91ZG5lc3NfNDAwKTsKKyAgICAgICAgICAgICAgICBTRVRfTUVUQShNRVRBX1BSRUZJWCAiUyIsICAgICAgICBsb3VkbmVzc18zMDAwKTsKKyAgICAgICAgICAgICAgICBTRVRfTUVUQShNRVRBX1BSRUZJWCAiSSIsICAgICAgICBlYnVyMTI4LT5pbnRlZ3JhdGVkX2xvdWRuZXNzKTsKKyAgICAgICAgICAgICAgICBTRVRfTUVUQShNRVRBX1BSRUZJWCAiTFJBIiwgICAgICBlYnVyMTI4LT5sb3VkbmVzc19yYW5nZSk7CisgICAgICAgICAgICAgICAgU0VUX01FVEEoTUVUQV9QUkVGSVggIkxSQS5sb3ciLCAgZWJ1cjEyOC0+bHJhX2xvdyk7CisgICAgICAgICAgICAgICAgU0VUX01FVEEoTUVUQV9QUkVGSVggIkxSQS5oaWdoIiwgZWJ1cjEyOC0+bHJhX2hpZ2gpOworCisgICAgICAgICAgICAgICAgU0VUX01FVEFfUEVBSyhzYW1wbGUsIFNBTVBMRVMpOworICAgICAgICAgICAgICAgIFNFVF9NRVRBX1BFQUsodHJ1ZSwgICBUUlVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfbG9nKGN0eCwgZWJ1cjEyOC0+bG9nbGV2ZWwsICJ0OiAlLTEwcyAiIExPR19GTVQsCisgICAgICAgICAgICAgICAgICAgYXZfdHMydGltZXN0cihwdHMsICZvdXRsaW5rLT50aW1lX2Jhc2UpLAorICAgICAgICAgICAgICAgICAgIGxvdWRuZXNzXzQwMCwgbG91ZG5lc3NfMzAwMCwKKyAgICAgICAgICAgICAgICAgICBlYnVyMTI4LT5pbnRlZ3JhdGVkX2xvdWRuZXNzLCBlYnVyMTI4LT5sb3VkbmVzc19yYW5nZSk7CisKKyNkZWZpbmUgUFJJTlRfUEVBS1Moc3RyLCBzcCwgcHR5cGUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlYnVyMTI4LT5wZWFrX21vZGUgJiBQRUFLX01PREVfICMjIHB0eXBlICMjIF9QRUFLUykgeyAgICAgICBcCisgICAgICAgIGF2X2xvZyhjdHgsIGVidXIxMjgtPmxvZ2xldmVsLCAiICAiIHN0ciAiOiIpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbmJfY2hhbm5lbHM7IGNoKyspICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXZfbG9nKGN0eCwgZWJ1cjEyOC0+bG9nbGV2ZWwsICIgJTUuMWYiLCBEQkZTKHNwW2NoXSkpOyBcCisgICAgICAgIGF2X2xvZyhjdHgsIGVidXIxMjgtPmxvZ2xldmVsLCAiIGRCRlMiKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworICAgICAgICAgICAgUFJJTlRfUEVBS1MoIlNQSyIsIGVidXIxMjgtPnNhbXBsZV9wZWFrcywgU0FNUExFUyk7CisgICAgICAgICAgICBQUklOVF9QRUFLUygiRlRQSyIsIGVidXIxMjgtPnRydWVfcGVha3NfcGVyX2ZyYW1lLCBUUlVFKTsKKyAgICAgICAgICAgIFBSSU5UX1BFQUtTKCJUUEsiLCBlYnVyMTI4LT50cnVlX3BlYWtzLCAgIFRSVUUpOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgZWJ1cjEyOC0+bG9nbGV2ZWwsICJcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbZWJ1cjEyOC0+ZG9fdmlkZW9dLCBpbnNhbXBsZXMpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRUJVUjEyOENvbnRleHQgKmVidXIxMjggPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geyBBVl9TQU1QTEVfRk1UX0RCTCwgQVZfU0FNUExFX0ZNVF9OT05FIH07CisgICAgc3RhdGljIGNvbnN0IGludCBpbnB1dF9zcmF0ZVtdID0gezQ4MDAwLCAtMX07IC8vIElUVS1SIEJTLjE3NzAgcHJvdmlkZXMgY29lZmYgb25seSBmb3IgNDhrSHoKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7IEFWX1BJWF9GTVRfUkdCMjQsIEFWX1BJWF9GTVRfTk9ORSB9OworCisgICAgLyogc2V0IG9wdGlvbmFsIG91dHB1dCB2aWRlbyBmb3JtYXQgKi8KKyAgICBpZiAoZWJ1cjEyOC0+ZG9fdmlkZW8pIHsKKyAgICAgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpOworICAgICAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmZl9mb3JtYXRzX3JlZihmb3JtYXRzLCAmb3V0bGluay0+aW5fZm9ybWF0cyk7CisgICAgICAgIG91dGxpbmsgPSBjdHgtPm91dHB1dHNbMV07CisgICAgfQorCisgICAgLyogc2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gZm9ybWF0cworICAgICAqIE5vdGU6IGZmX3NldF9jb21tb25fKiBmdW5jdGlvbnMgYXJlIG5vdCB1c2VkIGJlY2F1c2UgdGhleSBhZmZlY3QgYWxsIHRoZQorICAgICAqIGxpbmtzLCBhbmQgdGh1cyBicmVhayB0aGUgdmlkZW8gZm9ybWF0IG5lZ290aWF0aW9uICovCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9mb3JtYXRzX3JlZihmb3JtYXRzLCAmaW5saW5rLT5vdXRfZm9ybWF0cyk7CisgICAgZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJm91dGxpbmstPmluX2Zvcm1hdHMpOworCisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2xheW91dHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihsYXlvdXRzLCAmaW5saW5rLT5vdXRfY2hhbm5lbF9sYXlvdXRzKTsKKyAgICBmZl9jaGFubmVsX2xheW91dHNfcmVmKGxheW91dHMsICZvdXRsaW5rLT5pbl9jaGFubmVsX2xheW91dHMpOworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QoaW5wdXRfc3JhdGUpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9mb3JtYXRzX3JlZihmb3JtYXRzLCAmaW5saW5rLT5vdXRfc2FtcGxlcmF0ZXMpOworICAgIGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZvdXRsaW5rLT5pbl9zYW1wbGVyYXRlcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGk7CisgICAgRUJVUjEyOENvbnRleHQgKmVidXIxMjggPSBjdHgtPnByaXY7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlN1bW1hcnk6XG5cbiIKKyAgICAgICAgICAgIiAgSW50ZWdyYXRlZCBsb3VkbmVzczpcbiIKKyAgICAgICAgICAgIiAgICBJOiAgICAgICAgICU1LjFmIExVRlNcbiIKKyAgICAgICAgICAgIiAgICBUaHJlc2hvbGQ6ICU1LjFmIExVRlNcblxuIgorICAgICAgICAgICAiICBMb3VkbmVzcyByYW5nZTpcbiIKKyAgICAgICAgICAgIiAgICBMUkE6ICAgICAgICU1LjFmIExVXG4iCisgICAgICAgICAgICIgICAgVGhyZXNob2xkOiAlNS4xZiBMVUZTXG4iCisgICAgICAgICAgICIgICAgTFJBIGxvdzogICAlNS4xZiBMVUZTXG4iCisgICAgICAgICAgICIgICAgTFJBIGhpZ2g6ICAlNS4xZiBMVUZTIiwKKyAgICAgICAgICAgZWJ1cjEyOC0+aW50ZWdyYXRlZF9sb3VkbmVzcywgZWJ1cjEyOC0+aTQwMC5yZWxfdGhyZXNob2xkLAorICAgICAgICAgICBlYnVyMTI4LT5sb3VkbmVzc19yYW5nZSwgICAgICBlYnVyMTI4LT5pMzAwMC5yZWxfdGhyZXNob2xkLAorICAgICAgICAgICBlYnVyMTI4LT5scmFfbG93LCBlYnVyMTI4LT5scmFfaGlnaCk7CisKKyNkZWZpbmUgUFJJTlRfUEVBS19TVU1NQVJZKHN0ciwgc3AsIHB0eXBlKSBkbyB7ICAgICAgICAgICAgICAgICAgXAorICAgIGludCBjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIG1heHBlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYXhwZWFrID0gMC4wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlYnVyMTI4LT5wZWFrX21vZGUgJiBQRUFLX01PREVfICMjIHB0eXBlICMjIF9QRUFLUykgeyAgICBcCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGVidXIxMjgtPm5iX2NoYW5uZWxzOyBjaCsrKSAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1heHBlYWsgPSBGRk1BWChtYXhwZWFrLCBzcFtjaF0pOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlxuXG4gICIgc3RyICIgcGVhazpcbiIgICAgICAgICBcCisgICAgICAgICAgICAgICAiICAgIFBlYWs6ICAgICAgJTUuMWYgZEJGUyIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIERCRlMobWF4cGVhaykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgUFJJTlRfUEVBS19TVU1NQVJZKCJTYW1wbGUiLCBlYnVyMTI4LT5zYW1wbGVfcGVha3MsIFNBTVBMRVMpOworICAgIFBSSU5UX1BFQUtfU1VNTUFSWSgiVHJ1ZSIsICAgZWJ1cjEyOC0+dHJ1ZV9wZWFrcywgICBUUlVFKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CisKKyAgICBhdl9mcmVlcCgmZWJ1cjEyOC0+eV9saW5lX3JlZik7CisgICAgYXZfZnJlZXAoJmVidXIxMjgtPmNoX3dlaWdodGluZyk7CisgICAgYXZfZnJlZXAoJmVidXIxMjgtPnRydWVfcGVha3MpOworICAgIGF2X2ZyZWVwKCZlYnVyMTI4LT5zYW1wbGVfcGVha3MpOworICAgIGF2X2ZyZWVwKCZlYnVyMTI4LT50cnVlX3BlYWtzX3Blcl9mcmFtZSk7CisgICAgYXZfZnJlZXAoJmVidXIxMjgtPmk0MDAuaGlzdG9ncmFtKTsKKyAgICBhdl9mcmVlcCgmZWJ1cjEyOC0+aTMwMDAuaGlzdG9ncmFtKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZWJ1cjEyOC0+bmJfY2hhbm5lbHM7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmZWJ1cjEyOC0+aTQwMC5jYWNoZVtpXSk7CisgICAgICAgIGF2X2ZyZWVwKCZlYnVyMTI4LT5pMzAwMC5jYWNoZVtpXSk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX291dHB1dHM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+b3V0cHV0X3BhZHNbaV0ubmFtZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmZWJ1cjEyOC0+b3V0cGljcmVmKTsKKyNpZiBDT05GSUdfU1dSRVNBTVBMRQorICAgIGF2X2ZyZWVwKCZlYnVyMTI4LT5zd3JfYnVmKTsKKyAgICBzd3JfZnJlZSgmZWJ1cjEyOC0+c3dyX2N0eCk7CisjZW5kaWYKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGVidXIxMjhfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2F1ZGlvX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2VidXIxMjggPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiZWJ1cjEyOCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRUJVIFIxMjggc2Nhbm5lci4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihFQlVSMTI4Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGVidXIxMjhfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gTlVMTCwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZlYnVyMTI4X2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX09VVFBVVFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2ZfaW50ZXJsZWF2ZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2ZfaW50ZXJsZWF2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDAxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZl9pbnRlcmxlYXZlLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBhdWRpbyBhbmQgdmlkZW8gaW50ZXJsZWF2ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiYnVmZmVycXVldWUuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgbmJfaW5wdXRzOworICAgIHN0cnVjdCBGRkJ1ZlF1ZXVlICpxdWV1ZXM7Cit9IEludGVybGVhdmVDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihJbnRlcmxlYXZlQ29udGV4dCwgeCkKKworI2RlZmluZSBERUZJTkVfT1BUSU9OUyhmaWx0X25hbWUsIGZsYWdzXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZmlsdF9uYW1lIyNfb3B0aW9uc1tdID0geyAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHsgIm5iX2lucHV0cyIsICJzZXQgbnVtYmVyIG9mIGlucHV0cyIsIE9GRlNFVChuYl9pbnB1dHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMn0sIDEsIElOVF9NQVgsIC5mbGFncyA9IGZsYWdzXyB9LCBcCisgICB7ICJuIiwgICAgICAgICAic2V0IG51bWJlciBvZiBpbnB1dHMiLCBPRkZTRVQobmJfaW5wdXRzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDJ9LCAxLCBJTlRfTUFYLCAuZmxhZ3MgPSBmbGFnc18gfSwgXAorICAgeyBOVUxMIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK2lubGluZSBzdGF0aWMgaW50IHB1c2hfZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgSW50ZXJsZWF2ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgaW50IGksIHF1ZXVlX2lkeCA9IC0xOworICAgIGludDY0X3QgcHRzX21pbiA9IElOVDY0X01BWDsKKworICAgIC8qIGxvb2sgZm9yIG9sZGVzdCBmcmFtZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBGRkJ1ZlF1ZXVlICpxID0gJnMtPnF1ZXVlc1tpXTsKKworICAgICAgICBpZiAoIXEtPmF2YWlsYWJsZSAmJiAhY3R4LT5pbnB1dHNbaV0tPmNsb3NlZCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAocS0+YXZhaWxhYmxlKSB7CisgICAgICAgICAgICBmcmFtZSA9IGZmX2J1ZnF1ZXVlX3BlZWsocSwgMCk7CisgICAgICAgICAgICBpZiAoZnJhbWUtPnB0cyA8IHB0c19taW4pIHsKKyAgICAgICAgICAgICAgICBwdHNfbWluID0gZnJhbWUtPnB0czsKKyAgICAgICAgICAgICAgICBxdWV1ZV9pZHggPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogYWxsIGlucHV0cyBhcmUgY2xvc2VkICovCisgICAgaWYgKHF1ZXVlX2lkeCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGZyYW1lID0gZmZfYnVmcXVldWVfZ2V0KCZzLT5xdWV1ZXNbcXVldWVfaWR4XSk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAicXVldWU6JWQgLT4gZnJhbWUgdGltZTolZlxuIiwKKyAgICAgICAgICAgcXVldWVfaWR4LCBmcmFtZS0+cHRzICogYXZfcTJkKEFWX1RJTUVfQkFTRV9RKSk7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIGZyYW1lKTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgSW50ZXJsZWF2ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgdW5zaWduZWQgaW5fbm8gPSBGRl9JTkxJTktfSURYKGlubGluayk7CisKKyAgICBpZiAoZnJhbWUtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJOT1BUUyB2YWx1ZSBmb3IgaW5wdXQgZnJhbWUgY2Fubm90IGJlIGFjY2VwdGVkLCBmcmFtZSBkaXNjYXJkZWRcbiIpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIHF1ZXVlIGZyYW1lICovCisgICAgZnJhbWUtPnB0cyA9IGF2X3Jlc2NhbGVfcShmcmFtZS0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgImZyYW1lIHB0czolZiAtPiBxdWV1ZSBpZHg6JWQgYXZhaWxhYmxlOiVkXG4iLAorICAgICAgICAgICBmcmFtZS0+cHRzICogYXZfcTJkKEFWX1RJTUVfQkFTRV9RKSwgaW5fbm8sIHMtPnF1ZXVlc1tpbl9ub10uYXZhaWxhYmxlKTsKKyAgICBmZl9idWZxdWV1ZV9hZGQoY3R4LCAmcy0+cXVldWVzW2luX25vXSwgZnJhbWUpOworCisgICAgcmV0dXJuIHB1c2hfZnJhbWUoY3R4KTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgSW50ZXJsZWF2ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZGaWx0ZXJQYWQgKm91dHBhZCA9ICZjdHgtPmZpbHRlci0+b3V0cHV0c1swXTsKKyAgICBpbnQgaTsKKworICAgIHMtPnF1ZXVlcyA9IGF2X2NhbGxvYyhzLT5uYl9pbnB1dHMsIHNpemVvZihzLT5xdWV1ZXNbMF0pKTsKKyAgICBpZiAoIXMtPnF1ZXVlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBBVkZpbHRlclBhZCBpbnBhZCA9IHsgMCB9OworCisgICAgICAgIGlucGFkLm5hbWUgPSBhdl9hc3ByaW50ZigiaW5wdXQlZCIsIGkpOworICAgICAgICBpZiAoIWlucGFkLm5hbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBpbnBhZC50eXBlICAgICAgICAgPSBvdXRwYWQtPnR5cGU7CisgICAgICAgIGlucGFkLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZTsKKworICAgICAgICBzd2l0Y2ggKG91dHBhZC0+dHlwZSkgeworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgICAgIGlucGFkLmdldF92aWRlb19idWZmZXIgPSBmZl9udWxsX2dldF92aWRlb19idWZmZXI7IGJyZWFrOworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgICAgIGlucGFkLmdldF9hdWRpb19idWZmZXIgPSBmZl9udWxsX2dldF9hdWRpb19idWZmZXI7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgfQorICAgICAgICBmZl9pbnNlcnRfaW5wYWQoY3R4LCBpLCAmaW5wYWQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBJbnRlcmxlYXZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGZmX2J1ZnF1ZXVlX2Rpc2NhcmRfYWxsKCZzLT5xdWV1ZXNbaV0pOworICAgICAgICBhdl9mcmVlcCgmcy0+cXVldWVzW2ldKTsKKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+aW5wdXRfcGFkc1tpXS5uYW1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmswID0gY3R4LT5pbnB1dHNbMF07CisgICAgaW50IGk7CisKKyAgICBpZiAob3V0bGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgb3V0bGluay0+dGltZV9iYXNlICAgICAgICAgICA9IEFWX1RJTUVfQkFTRV9ROworICAgICAgICBvdXRsaW5rLT53ICAgICAgICAgICAgICAgICAgID0gaW5saW5rMC0+dzsKKyAgICAgICAgb3V0bGluay0+aCAgICAgICAgICAgICAgICAgICA9IGlubGluazAtPmg7CisgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpbmxpbmswLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgICAgICBvdXRsaW5rLT5mb3JtYXQgICAgICAgICAgICAgID0gaW5saW5rMC0+Zm9ybWF0OworICAgICAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gKEFWUmF0aW9uYWwpIHsxLCAwfTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbaV07CisKKyAgICAgICAgICAgIGlmIChvdXRsaW5rLT53ICAgICAgICAgICAgICAgICAgICAgICAhPSBpbmxpbmstPncgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgb3V0bGluay0+aCAgICAgICAgICAgICAgICAgICAgICAgIT0gaW5saW5rLT5oICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICE9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gfHwKKyAgICAgICAgICAgICAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAhPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUGFyYW1ldGVycyBmb3IgaW5wdXQgbGluayAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICIoc2l6ZSAlZHglZCwgU0FSICVkOiVkKSBkbyBub3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IGxpbmsgcGFyYW1ldGVycyAoJWR4JWQsIFNBUiAlZDolZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aW5wdXRfcGFkc1tpXS5uYW1lLCBpbmxpbmstPncsIGlubGluay0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+dywgb3V0bGluay0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCisgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgb3V0bGluay0+ZmxhZ3MgfD0gRkZfTElOS19GTEFHX1JFUVVFU1RfTE9PUDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBJbnRlcmxlYXZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKCFzLT5xdWV1ZXNbaV0uYXZhaWxhYmxlICYmICFjdHgtPmlucHV0c1tpXS0+Y2xvc2VkKSB7CisgICAgICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzW2ldKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwdXNoX2ZyYW1lKGN0eCk7Cit9CisKKyNpZiBDT05GSUdfSU5URVJMRUFWRV9GSUxURVIKKworREVGSU5FX09QVElPTlMoaW50ZXJsZWF2ZSwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNKTsKK0FWRklMVEVSX0RFRklORV9DTEFTUyhpbnRlcmxlYXZlKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGludGVybGVhdmVfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9pbnRlcmxlYXZlID0geworICAgIC5uYW1lICAgICAgICA9ICJpbnRlcmxlYXZlIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVGVtcG9yYWxseSBpbnRlcmxlYXZlIHZpZGVvIGlucHV0cy4iKSwKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoSW50ZXJsZWF2ZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgID0gdW5pbml0LAorICAgIC5vdXRwdXRzICAgICA9IGludGVybGVhdmVfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgPSAmaW50ZXJsZWF2ZV9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgPSBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfSU5QVVRTLAorfTsKKworI2VuZGlmCisKKyNpZiBDT05GSUdfQUlOVEVSTEVBVkVfRklMVEVSCisKK0RFRklORV9PUFRJT05TKGFpbnRlcmxlYXZlLCBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0pOworQVZGSUxURVJfREVGSU5FX0NMQVNTKGFpbnRlcmxlYXZlKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFpbnRlcmxlYXZlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYWludGVybGVhdmUgPSB7CisgICAgLm5hbWUgICAgICAgID0gImFpbnRlcmxlYXZlIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVGVtcG9yYWxseSBpbnRlcmxlYXZlIGF1ZGlvIGlucHV0cy4iKSwKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoSW50ZXJsZWF2ZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgID0gdW5pbml0LAorICAgIC5vdXRwdXRzICAgICA9IGFpbnRlcmxlYXZlX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgID0gJmFpbnRlcmxlYXZlX2NsYXNzLAorICAgIC5mbGFncyAgICAgICA9IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19JTlBVVFMsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9mX3Blcm1zLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZl9wZXJtcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OGNlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZl9wZXJtcy5jCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIENsw6ltZW50IELFk3NjaAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmFuZG9tX3NlZWQuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK2VudW0gbW9kZSB7CisgICAgTU9ERV9OT05FLAorICAgIE1PREVfUk8sCisgICAgTU9ERV9SVywKKyAgICBNT0RFX1RPR0dMRSwKKyAgICBNT0RFX1JBTkRPTSwKKyAgICBOQl9NT0RFUworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEFWTEZHIGxmZzsKKyAgICBpbnQ2NF90IHJhbmRvbV9zZWVkOworICAgIGVudW0gbW9kZSBtb2RlOworfSBQZXJtc0NvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFBlcm1zQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNIHwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgIm1vZGUiLCAic2VsZWN0IHBlcm1pc3Npb25zIG1vZGUiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBNT0RFX05PTkV9LCBNT0RFX05PTkUsIE5CX01PREVTLTEsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAibm9uZSIsICAgImRvIG5vdGhpbmciLCAgICAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTU9ERV9OT05FfSwgICAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtb2RlIiB9LAorICAgICAgICB7ICJybyIsICAgICAic2V0IGFsbCBvdXRwdXQgZnJhbWVzIHJlYWQtb25seSIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNT0RFX1JPfSwgICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUiIH0sCisgICAgICAgIHsgInJ3IiwgICAgICJzZXQgYWxsIG91dHB1dCBmcmFtZXMgd3JpdGFibGUiLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1PREVfUld9LCAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAidG9nZ2xlIiwgInN3aXRjaCBwZXJtaXNzaW9ucyIsICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTU9ERV9UT0dHTEV9LCAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtb2RlIiB9LAorICAgICAgICB7ICJyYW5kb20iLCAic2V0IHBlcm1pc3Npb25zIHJhbmRvbWx5IiwgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNT0RFX1JBTkRPTX0sICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAic2VlZCIsICJzZXQgdGhlIHNlZWQgZm9yIHRoZSByYW5kb20gbW9kZSIsIE9GRlNFVChyYW5kb21fc2VlZCksIEFWX09QVF9UWVBFX0lOVDY0LCB7Lmk2NCA9IC0xfSwgLTEsIFVJTlQzMl9NQVgsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFBlcm1zQ29udGV4dCAqcGVybXMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocGVybXMtPm1vZGUgPT0gTU9ERV9SQU5ET00pIHsKKyAgICAgICAgdWludDMyX3Qgc2VlZDsKKworICAgICAgICBpZiAocGVybXMtPnJhbmRvbV9zZWVkID09IC0xKQorICAgICAgICAgICAgcGVybXMtPnJhbmRvbV9zZWVkID0gYXZfZ2V0X3JhbmRvbV9zZWVkKCk7CisgICAgICAgIHNlZWQgPSBwZXJtcy0+cmFuZG9tX3NlZWQ7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAicmFuZG9tIHNlZWQ6IDB4JTA4eFxuIiwgc2VlZCk7CisgICAgICAgIGF2X2xmZ19pbml0KCZwZXJtcy0+bGZnLCBzZWVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworZW51bSBwZXJtICAgICAgICAgICAgICAgICAgICAgICAgeyAgUk8sICAgUlcgIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBlcm1fc3RyWzJdID0geyAiUk8iLCAiUlciIH07CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgcmV0OworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgUGVybXNDb250ZXh0ICpwZXJtcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpvdXQgPSBmcmFtZTsKKyAgICBlbnVtIHBlcm0gaW5fcGVybSA9IGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGZyYW1lKSA/IFJXIDogUk87CisgICAgZW51bSBwZXJtIG91dF9wZXJtOworCisgICAgc3dpdGNoIChwZXJtcy0+bW9kZSkgeworICAgIGNhc2UgTU9ERV9UT0dHTEU6ICAgb3V0X3Blcm0gPSBpbl9wZXJtID09IFJPID8gUlcgOiBSTzsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9SQU5ET006ICAgb3V0X3Blcm0gPSBhdl9sZmdfZ2V0KCZwZXJtcy0+bGZnKSAmIDEgPyBSVyA6IFJPOyAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9STzogICAgICAgb3V0X3Blcm0gPSBSTzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9SVzogICAgICAgb3V0X3Blcm0gPSBSVzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgb3V0X3Blcm0gPSBpbl9wZXJtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiJXMgLT4gJXMlc1xuIiwKKyAgICAgICAgICAgcGVybV9zdHJbaW5fcGVybV0sIHBlcm1fc3RyW291dF9wZXJtXSwKKyAgICAgICAgICAgaW5fcGVybSA9PSBvdXRfcGVybSA/ICIgKG5vLW9wKSIgOiAiIik7CisKKyAgICBpZiAoaW5fcGVybSA9PSBSTyAmJiBvdXRfcGVybSA9PSBSVykgeworICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX21ha2Vfd3JpdGFibGUoZnJhbWUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSBpZiAoaW5fcGVybSA9PSBSVyAmJiBvdXRfcGVybSA9PSBSTykgeworICAgICAgICBvdXQgPSBhdl9mcmFtZV9jbG9uZShmcmFtZSk7CisgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBvdXQpOworCisgICAgaWYgKGluX3Blcm0gPT0gUlcgJiYgb3V0X3Blcm0gPT0gUk8pCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworfQorCisjaWYgQ09ORklHX0FQRVJNU19GSUxURVIKKworI2RlZmluZSBhcGVybXNfb3B0aW9ucyBvcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXBlcm1zKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFwZXJtc19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFwZXJtc19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYXBlcm1zID0geworICAgIC5uYW1lICAgICAgICA9ICJhcGVybXMiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTZXQgcGVybWlzc2lvbnMgZm9yIHRoZSBvdXRwdXQgYXVkaW8gZnJhbWUuIiksCisgICAgLmluaXQgICAgICAgID0gaW5pdCwKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoUGVybXNDb250ZXh0KSwKKyAgICAuaW5wdXRzICAgICAgPSBhcGVybXNfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IGFwZXJtc19vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICA9ICZhcGVybXNfY2xhc3MsCit9OworI2VuZGlmIC8qIENPTkZJR19BUEVSTVNfRklMVEVSICovCisKKyNpZiBDT05GSUdfUEVSTVNfRklMVEVSCisKKyNkZWZpbmUgcGVybXNfb3B0aW9ucyBvcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MocGVybXMpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgcGVybXNfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBwZXJtc19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfcGVybXMgPSB7CisgICAgLm5hbWUgICAgICAgID0gInBlcm1zIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2V0IHBlcm1pc3Npb25zIGZvciB0aGUgb3V0cHV0IHZpZGVvIGZyYW1lLiIpLAorICAgIC5pbml0ICAgICAgICA9IGluaXQsCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFBlcm1zQ29udGV4dCksCisgICAgLmlucHV0cyAgICAgID0gcGVybXNfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IHBlcm1zX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgID0gJnBlcm1zX2NsYXNzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUEVSTVNfRklMVEVSICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvZl9zZWxlY3QuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9mX3NlbGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NmE5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZl9zZWxlY3QuYwpAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGZpbHRlciBmb3Igc2VsZWN0aW5nIHdoaWNoIGZyYW1lIHBhc3NlcyBpbiB0aGUgZmlsdGVyY2hhaW4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZWx1dGlscy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFyX25hbWVzW10gPSB7CisgICAgIlRCIiwgICAgICAgICAgICAgICAgLy8vPCB0aW1lYmFzZQorCisgICAgInB0cyIsICAgICAgICAgICAgICAgLy8vPCBvcmlnaW5hbCBwdHMgaW4gdGhlIGZpbGUgb2YgdGhlIGZyYW1lCisgICAgInN0YXJ0X3B0cyIsICAgICAgICAgLy8vPCBmaXJzdCBQVFMgaW4gdGhlIHN0cmVhbSwgZXhwcmVzc2VkIGluIFRCIHVuaXRzCisgICAgInByZXZfcHRzIiwgICAgICAgICAgLy8vPCBwcmV2aW91cyBmcmFtZSBQVFMKKyAgICAicHJldl9zZWxlY3RlZF9wdHMiLCAvLy88IHByZXZpb3VzIHNlbGVjdGVkIGZyYW1lIFBUUworCisgICAgInQiLCAgICAgICAgICAgICAgICAgLy8vPCB0aW1lc3RhbXAgZXhwcmVzc2VkIGluIHNlY29uZHMKKyAgICAic3RhcnRfdCIsICAgICAgICAgICAvLy88IGZpcnN0IFBUUyBpbiB0aGUgc3RyZWFtLCBleHByZXNzZWQgaW4gc2Vjb25kcworICAgICJwcmV2X3QiLCAgICAgICAgICAgIC8vLzwgcHJldmlvdXMgZnJhbWUgdGltZQorICAgICJwcmV2X3NlbGVjdGVkX3QiLCAgIC8vLzwgcHJldmlvdXNseSBzZWxlY3RlZCB0aW1lCisKKyAgICAicGljdF90eXBlIiwgICAgICAgICAvLy88IHRoZSB0eXBlIG9mIHBpY3R1cmUgaW4gdGhlIG1vdmllCisgICAgIkkiLAorICAgICJQIiwKKyAgICAiQiIsCisgICAgIlMiLAorICAgICJTSSIsCisgICAgIlNQIiwKKyAgICAiQkkiLAorICAgICJQSUNUX1RZUEVfSSIsCisgICAgIlBJQ1RfVFlQRV9QIiwKKyAgICAiUElDVF9UWVBFX0IiLAorICAgICJQSUNUX1RZUEVfUyIsCisgICAgIlBJQ1RfVFlQRV9TSSIsCisgICAgIlBJQ1RfVFlQRV9TUCIsCisgICAgIlBJQ1RfVFlQRV9CSSIsCisKKyAgICAiaW50ZXJsYWNlX3R5cGUiLCAgICAvLy88IHRoZSBmcmFtZSBpbnRlcmxhY2UgdHlwZQorICAgICJQUk9HUkVTU0lWRSIsCisgICAgIlRPUEZJUlNUIiwKKyAgICAiQk9UVE9NRklSU1QiLAorCisgICAgImNvbnN1bWVkX3NhbXBsZXNfbiIsLy8vPCBudW1iZXIgb2Ygc2FtcGxlcyBjb25zdW1lZCBieSB0aGUgZmlsdGVyIChvbmx5IGF1ZGlvKQorICAgICJzYW1wbGVzX24iLCAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGN1cnJlbnQgZnJhbWUgKG9ubHkgYXVkaW8pCisgICAgInNhbXBsZV9yYXRlIiwgICAgICAgLy8vPCBzYW1wbGUgcmF0ZSAob25seSBhdWRpbykKKworICAgICJuIiwgICAgICAgICAgICAgICAgIC8vLzwgZnJhbWUgbnVtYmVyIChzdGFydGluZyBmcm9tIHplcm8pCisgICAgInNlbGVjdGVkX24iLCAgICAgICAgLy8vPCBzZWxlY3RlZCBmcmFtZSBudW1iZXIgKHN0YXJ0aW5nIGZyb20gemVybykKKyAgICAicHJldl9zZWxlY3RlZF9uIiwgICAvLy88IG51bWJlciBvZiB0aGUgbGFzdCBzZWxlY3RlZCBmcmFtZQorCisgICAgImtleSIsICAgICAgICAgICAgICAgLy8vPCB0ZWxsIGlmIHRoZSBmcmFtZSBpcyBhIGtleSBmcmFtZQorICAgICJwb3MiLCAgICAgICAgICAgICAgIC8vLzwgb3JpZ2luYWwgcG9zaXRpb24gaW4gdGhlIGZpbGUgb2YgdGhlIGZyYW1lCisKKyAgICAic2NlbmUiLAorCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX1RCLAorCisgICAgVkFSX1BUUywKKyAgICBWQVJfU1RBUlRfUFRTLAorICAgIFZBUl9QUkVWX1BUUywKKyAgICBWQVJfUFJFVl9TRUxFQ1RFRF9QVFMsCisKKyAgICBWQVJfVCwKKyAgICBWQVJfU1RBUlRfVCwKKyAgICBWQVJfUFJFVl9ULAorICAgIFZBUl9QUkVWX1NFTEVDVEVEX1QsCisKKyAgICBWQVJfUElDVF9UWVBFLAorICAgIFZBUl9JLAorICAgIFZBUl9QLAorICAgIFZBUl9CLAorICAgIFZBUl9TLAorICAgIFZBUl9TSSwKKyAgICBWQVJfU1AsCisgICAgVkFSX0JJLAorICAgIFZBUl9QSUNUX1RZUEVfSSwKKyAgICBWQVJfUElDVF9UWVBFX1AsCisgICAgVkFSX1BJQ1RfVFlQRV9CLAorICAgIFZBUl9QSUNUX1RZUEVfUywKKyAgICBWQVJfUElDVF9UWVBFX1NJLAorICAgIFZBUl9QSUNUX1RZUEVfU1AsCisgICAgVkFSX1BJQ1RfVFlQRV9CSSwKKworICAgIFZBUl9JTlRFUkxBQ0VfVFlQRSwKKyAgICBWQVJfSU5URVJMQUNFX1RZUEVfUCwKKyAgICBWQVJfSU5URVJMQUNFX1RZUEVfVCwKKyAgICBWQVJfSU5URVJMQUNFX1RZUEVfQiwKKworICAgIFZBUl9DT05TVU1FRF9TQU1QTEVTX04sCisgICAgVkFSX1NBTVBMRVNfTiwKKyAgICBWQVJfU0FNUExFX1JBVEUsCisKKyAgICBWQVJfTiwKKyAgICBWQVJfU0VMRUNURURfTiwKKyAgICBWQVJfUFJFVl9TRUxFQ1RFRF9OLAorCisgICAgVkFSX0tFWSwKKyAgICBWQVJfUE9TLAorCisgICAgVkFSX1NDRU5FLAorCisgICAgVkFSX1ZBUlNfTkIKK307CisKK3R5cGVkZWYgc3RydWN0IFNlbGVjdENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGNoYXIgKmV4cHJfc3RyOworICAgIEFWRXhwciAqZXhwcjsKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJfVkFSU19OQl07CisgICAgaW50IGRvX3NjZW5lX2RldGVjdDsgICAgICAgICAgICAvLy88IDEgaWYgdGhlIGV4cHJlc3Npb24gcmVxdWlyZXMgc2NlbmUgZGV0ZWN0aW9uIHZhcmlhYmxlcywgMCBvdGhlcndpc2UKKyAgICBhdl9waXhlbHV0aWxzX3NhZF9mbiBzYWQ7ICAgICAgIC8vLzwgU3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGZ1bmN0aW9uIChzY2VuZSBkZXRlY3Qgb25seSkKKyAgICBkb3VibGUgcHJldl9tYWZkOyAgICAgICAgICAgICAgIC8vLzwgcHJldmlvdXMgTUFGRCAgICAgICAgICAgICAgICAgICAgICAgICAgIChzY2VuZSBkZXRlY3Qgb25seSkKKyAgICBBVkZyYW1lICpwcmV2X3BpY3JlZjsgICAgICAgICAgIC8vLzwgcHJldmlvdXMgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgIChzY2VuZSBkZXRlY3Qgb25seSkKKyAgICBkb3VibGUgc2VsZWN0OworICAgIGludCBzZWxlY3Rfb3V0OyAgICAgICAgICAgICAgICAgLy8vPCBtYXJrIHRoZSBzZWxlY3RlZCBvdXRwdXQgcGFkIGluZGV4CisgICAgaW50IG5iX291dHB1dHM7Cit9IFNlbGVjdENvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNlbGVjdENvbnRleHQsIHgpCisjZGVmaW5lIERFRklORV9PUFRJT05TKGZpbHRfbmFtZSwgRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBmaWx0X25hbWUjI19vcHRpb25zW10gPSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgImV4cHIiLCAic2V0IGFuIGV4cHJlc3Npb24gdG8gdXNlIGZvciBzZWxlY3RpbmcgZnJhbWVzIiwgT0ZGU0VUKGV4cHJfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiMSIgfSwgLmZsYWdzPUZMQUdTIH0sIFwKKyAgICB7ICJlIiwgICAgInNldCBhbiBleHByZXNzaW9uIHRvIHVzZSBmb3Igc2VsZWN0aW5nIGZyYW1lcyIsIE9GRlNFVChleHByX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIjEiIH0sIC5mbGFncz1GTEFHUyB9LCBcCisgICAgeyAib3V0cHV0cyIsICJzZXQgdGhlIG51bWJlciBvZiBvdXRwdXRzIiwgT0ZGU0VUKG5iX291dHB1dHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMX0sIDEsIElOVF9NQVgsIC5mbGFncz1GTEFHUyB9LCBcCisgICAgeyAibiIsICAgICAgICJzZXQgdGhlIG51bWJlciBvZiBvdXRwdXRzIiwgT0ZGU0VUKG5iX291dHB1dHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMX0sIDEsIElOVF9NQVgsIC5mbGFncz1GTEFHUyB9LCBcCisgICAgeyBOVUxMIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTZWxlY3RDb250ZXh0ICpzZWxlY3QgPSBjdHgtPnByaXY7CisgICAgaW50IGksIHJldDsKKworICAgIGlmICgocmV0ID0gYXZfZXhwcl9wYXJzZSgmc2VsZWN0LT5leHByLCBzZWxlY3QtPmV4cHJfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCkpIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciB3aGlsZSBwYXJzaW5nIGV4cHJlc3Npb24gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgIHNlbGVjdC0+ZXhwcl9zdHIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBzZWxlY3QtPmRvX3NjZW5lX2RldGVjdCA9ICEhc3Ryc3RyKHNlbGVjdC0+ZXhwcl9zdHIsICJzY2VuZSIpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNlbGVjdC0+bmJfb3V0cHV0czsgaSsrKSB7CisgICAgICAgIEFWRmlsdGVyUGFkIHBhZCA9IHsgMCB9OworCisgICAgICAgIHBhZC5uYW1lID0gYXZfYXNwcmludGYoIm91dHB1dCVkIiwgaSk7CisgICAgICAgIGlmICghcGFkLm5hbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBwYWQudHlwZSA9IGN0eC0+ZmlsdGVyLT5pbnB1dHNbMF0udHlwZTsKKyAgICAgICAgcGFkLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lOworICAgICAgICBmZl9pbnNlcnRfb3V0cGFkKGN0eCwgaSwgJnBhZCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSU5URVJMQUNFX1RZUEVfUCAwCisjZGVmaW5lIElOVEVSTEFDRV9UWVBFX1QgMQorI2RlZmluZSBJTlRFUkxBQ0VfVFlQRV9CIDIKKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgU2VsZWN0Q29udGV4dCAqc2VsZWN0ID0gaW5saW5rLT5kc3QtPnByaXY7CisKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX05dICAgICAgICAgID0gMC4wOworICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfU0VMRUNURURfTl0gPSAwLjA7CisKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1RCXSA9IGF2X3EyZChpbmxpbmstPnRpbWVfYmFzZSk7CisKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1BSRVZfUFRTXSAgICAgICAgICA9IE5BTjsKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1BSRVZfU0VMRUNURURfUFRTXSA9IE5BTjsKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1BSRVZfU0VMRUNURURfVF0gICA9IE5BTjsKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1BSRVZfVF0gICAgICAgICAgICA9IE5BTjsKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1NUQVJUX1BUU10gICAgICAgICA9IE5BTjsKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1NUQVJUX1RdICAgICAgICAgICA9IE5BTjsKKworICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfSV0gID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9QXSAgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX0JdICA9IEFWX1BJQ1RVUkVfVFlQRV9COworICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfU0ldID0gQVZfUElDVFVSRV9UWVBFX1NJOworICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfU1BdID0gQVZfUElDVFVSRV9UWVBFX1NQOworICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfQkldID0gQVZfUElDVFVSRV9UWVBFX0JJOworICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfUElDVF9UWVBFX0ldICA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfUElDVF9UWVBFX1BdICA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfUElDVF9UWVBFX0JdICA9IEFWX1BJQ1RVUkVfVFlQRV9COworICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfUElDVF9UWVBFX1NJXSA9IEFWX1BJQ1RVUkVfVFlQRV9TSTsKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1BJQ1RfVFlQRV9TUF0gPSBBVl9QSUNUVVJFX1RZUEVfU1A7CisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9QSUNUX1RZUEVfQkldID0gQVZfUElDVFVSRV9UWVBFX0JJOworCisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9JTlRFUkxBQ0VfVFlQRV9QXSA9IElOVEVSTEFDRV9UWVBFX1A7CisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9JTlRFUkxBQ0VfVFlQRV9UXSA9IElOVEVSTEFDRV9UWVBFX1Q7CisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9JTlRFUkxBQ0VfVFlQRV9CXSA9IElOVEVSTEFDRV9UWVBFX0I7CisKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1BJQ1RfVFlQRV0gICAgICAgICA9IE5BTjsKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX0lOVEVSTEFDRV9UWVBFXSAgICA9IE5BTjsKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1NDRU5FXSAgICAgICAgICAgICA9IE5BTjsKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX0NPTlNVTUVEX1NBTVBMRVNfTl0gPSBOQU47CisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9TQU1QTEVTX05dICAgICAgICAgID0gTkFOOworCisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9TQU1QTEVfUkFURV0gPQorICAgICAgICBpbmxpbmstPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPID8gaW5saW5rLT5zYW1wbGVfcmF0ZSA6IE5BTjsKKworICAgIGlmIChzZWxlY3QtPmRvX3NjZW5lX2RldGVjdCkgeworICAgICAgICBzZWxlY3QtPnNhZCA9IGF2X3BpeGVsdXRpbHNfZ2V0X3NhZF9mbigzLCAzLCAyLCBzZWxlY3QpOyAvLyA4eDggYm90aCBzb3VyY2VzIGFsaWduZWQKKyAgICAgICAgaWYgKCFzZWxlY3QtPnNhZCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgZG91YmxlIGdldF9zY2VuZV9zY29yZShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgZG91YmxlIHJldCA9IDA7CisgICAgU2VsZWN0Q29udGV4dCAqc2VsZWN0ID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKnByZXZfcGljcmVmID0gc2VsZWN0LT5wcmV2X3BpY3JlZjsKKworICAgIGlmIChwcmV2X3BpY3JlZiAmJgorICAgICAgICBmcmFtZS0+aGVpZ2h0ID09IHByZXZfcGljcmVmLT5oZWlnaHQgJiYKKyAgICAgICAgZnJhbWUtPndpZHRoICA9PSBwcmV2X3BpY3JlZi0+d2lkdGgpIHsKKyAgICAgICAgaW50IHgsIHksIG5iX3NhZCA9IDA7CisgICAgICAgIGludDY0X3Qgc2FkID0gMDsKKyAgICAgICAgZG91YmxlIG1hZmQsIGRpZmY7CisgICAgICAgIHVpbnQ4X3QgKnAxID0gICAgICBmcmFtZS0+ZGF0YVswXTsKKyAgICAgICAgdWludDhfdCAqcDIgPSBwcmV2X3BpY3JlZi0+ZGF0YVswXTsKKyAgICAgICAgY29uc3QgaW50IHAxX2xpbmVzaXplID0gICAgICAgZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBjb25zdCBpbnQgcDJfbGluZXNpemUgPSBwcmV2X3BpY3JlZi0+bGluZXNpemVbMF07CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGZyYW1lLT5oZWlnaHQgLSA3OyB5ICs9IDgpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBmcmFtZS0+d2lkdGgqMyAtIDc7IHggKz0gOCkgeworICAgICAgICAgICAgICAgIHNhZCArPSBzZWxlY3QtPnNhZChwMSArIHgsIHAxX2xpbmVzaXplLCBwMiArIHgsIHAyX2xpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBuYl9zYWQgKz0gOCAqIDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwMSArPSA4ICogcDFfbGluZXNpemU7CisgICAgICAgICAgICBwMiArPSA4ICogcDJfbGluZXNpemU7CisgICAgICAgIH0KKyAgICAgICAgZW1tc19jKCk7CisgICAgICAgIG1hZmQgPSBuYl9zYWQgPyAoZG91YmxlKXNhZCAvIG5iX3NhZCA6IDA7CisgICAgICAgIGRpZmYgPSBmYWJzKG1hZmQgLSBzZWxlY3QtPnByZXZfbWFmZCk7CisgICAgICAgIHJldCAgPSBhdl9jbGlwZihGRk1JTihtYWZkLCBkaWZmKSAvIDEwMC4sIDAsIDEpOworICAgICAgICBzZWxlY3QtPnByZXZfbWFmZCA9IG1hZmQ7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnByZXZfcGljcmVmKTsKKyAgICB9CisgICAgc2VsZWN0LT5wcmV2X3BpY3JlZiA9IGF2X2ZyYW1lX2Nsb25lKGZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEQyVFMoZCkgIChpc25hbihkKSA/IEFWX05PUFRTX1ZBTFVFIDogKGludDY0X3QpKGQpKQorI2RlZmluZSBUUzJEKHRzKSAoKHRzKSA9PSBBVl9OT1BUU19WQUxVRSA/IE5BTiA6IChkb3VibGUpKHRzKSkKKworc3RhdGljIHZvaWQgc2VsZWN0X2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBTZWxlY3RDb250ZXh0ICpzZWxlY3QgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBkb3VibGUgcmVzOworCisgICAgaWYgKGlzbmFuKHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfU1RBUlRfUFRTXSkpCisgICAgICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfU1RBUlRfUFRTXSA9IFRTMkQoZnJhbWUtPnB0cyk7CisgICAgaWYgKGlzbmFuKHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfU1RBUlRfVF0pKQorICAgICAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1NUQVJUX1RdID0gVFMyRChmcmFtZS0+cHRzKSAqIGF2X3EyZChpbmxpbmstPnRpbWVfYmFzZSk7CisKKyAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX04gIF0gPSBpbmxpbmstPmZyYW1lX2NvdW50OworICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfUFRTXSA9IFRTMkQoZnJhbWUtPnB0cyk7CisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9UICBdID0gVFMyRChmcmFtZS0+cHRzKSAqIGF2X3EyZChpbmxpbmstPnRpbWVfYmFzZSk7CisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9QT1NdID0gYXZfZnJhbWVfZ2V0X3BrdF9wb3MoZnJhbWUpID09IC0xID8gTkFOIDogYXZfZnJhbWVfZ2V0X3BrdF9wb3MoZnJhbWUpOworICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfS0VZXSA9IGZyYW1lLT5rZXlfZnJhbWU7CisKKyAgICBzd2l0Y2ggKGlubGluay0+dHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1NBTVBMRVNfTl0gPSBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9JTlRFUkxBQ0VfVFlQRV0gPQorICAgICAgICAgICAgIWZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lID8gSU5URVJMQUNFX1RZUEVfUCA6CisgICAgICAgIGZyYW1lLT50b3BfZmllbGRfZmlyc3QgPyBJTlRFUkxBQ0VfVFlQRV9UIDogSU5URVJMQUNFX1RZUEVfQjsKKyAgICAgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9QSUNUX1RZUEVdID0gZnJhbWUtPnBpY3RfdHlwZTsKKyAgICAgICAgaWYgKHNlbGVjdC0+ZG9fc2NlbmVfZGV0ZWN0KSB7CisgICAgICAgICAgICBjaGFyIGJ1ZlszMl07CisgICAgICAgICAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1NDRU5FXSA9IGdldF9zY2VuZV9zY29yZShjdHgsIGZyYW1lKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGRvY3VtZW50IG1ldGFkYXRhCisgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWYiLCBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1NDRU5FXSk7CisgICAgICAgICAgICBhdl9kaWN0X3NldChhdnByaXZfZnJhbWVfZ2V0X21ldGFkYXRhcChmcmFtZSksICJsYXZmaS5zY2VuZV9zY29yZSIsIGJ1ZiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc2VsZWN0LT5zZWxlY3QgPSByZXMgPSBhdl9leHByX2V2YWwoc2VsZWN0LT5leHByLCBzZWxlY3QtPnZhcl92YWx1ZXMsIE5VTEwpOworICAgIGF2X2xvZyhpbmxpbmstPmRzdCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAibjolZiBwdHM6JWYgdDolZiBrZXk6JWQiLAorICAgICAgICAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX05dLAorICAgICAgICAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1BUU10sCisgICAgICAgICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfVF0sCisgICAgICAgICAgIGZyYW1lLT5rZXlfZnJhbWUpOworCisgICAgc3dpdGNoIChpbmxpbmstPnR5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgYXZfbG9nKGlubGluay0+ZHN0LCBBVl9MT0dfREVCVUcsICIgaW50ZXJsYWNlX3R5cGU6JWMgcGljdF90eXBlOiVjIHNjZW5lOiVmIiwKKyAgICAgICAgICAgICAgICghZnJhbWUtPmludGVybGFjZWRfZnJhbWUpID8gJ1AnIDoKKyAgICAgICAgICAgICAgIGZyYW1lLT50b3BfZmllbGRfZmlyc3QgICAgID8gJ1QnIDogJ0InLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpY3R1cmVfdHlwZV9jaGFyKGZyYW1lLT5waWN0X3R5cGUpLAorICAgICAgICAgICAgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9TQ0VORV0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgYXZfbG9nKGlubGluay0+ZHN0LCBBVl9MT0dfREVCVUcsICIgc2FtcGxlc19uOiVkIGNvbnN1bWVkX3NhbXBsZXNfbjolZiIsCisgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfQ09OU1VNRURfU0FNUExFU19OXSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICBzZWxlY3QtPnNlbGVjdF9vdXQgPSAtMTsgLyogZHJvcCAqLworICAgIH0gZWxzZSBpZiAoaXNuYW4ocmVzKSB8fCByZXMgPCAwKSB7CisgICAgICAgIHNlbGVjdC0+c2VsZWN0X291dCA9IDA7IC8qIGZpcnN0IG91dHB1dCAqLworICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGVjdC0+c2VsZWN0X291dCA9IEZGTUlOKGNlaWxmKHJlcyktMSwgc2VsZWN0LT5uYl9vdXRwdXRzLTEpOyAvKiBvdGhlciBvdXRwdXRzICovCisgICAgfQorCisgICAgYXZfbG9nKGlubGluay0+ZHN0LCBBVl9MT0dfREVCVUcsICIgLT4gc2VsZWN0OiVmIHNlbGVjdF9vdXQ6JWRcbiIsIHJlcywgc2VsZWN0LT5zZWxlY3Rfb3V0KTsKKworICAgIGlmIChyZXMpIHsKKyAgICAgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9QUkVWX1NFTEVDVEVEX05dICAgPSBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX05dOworICAgICAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1BSRVZfU0VMRUNURURfUFRTXSA9IHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfUFRTXTsKKyAgICAgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9QUkVWX1NFTEVDVEVEX1RdICAgPSBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1RdOworICAgICAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1NFTEVDVEVEX05dICs9IDEuMDsKKyAgICAgICAgaWYgKGlubGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgICAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX0NPTlNVTUVEX1NBTVBMRVNfTl0gKz0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgfQorCisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9QUkVWX1BUU10gPSBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1BUU107CisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9QUkVWX1RdICAgPSBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1RdOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBTZWxlY3RDb250ZXh0ICpzZWxlY3QgPSBjdHgtPnByaXY7CisKKyAgICBzZWxlY3RfZnJhbWUoY3R4LCBmcmFtZSk7CisgICAgaWYgKHNlbGVjdC0+c2VsZWN0KQorICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1tzZWxlY3QtPnNlbGVjdF9vdXRdLCBmcmFtZSk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgU2VsZWN0Q29udGV4dCAqc2VsZWN0ID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisgICAgaW50IG91dF9ubyA9IEZGX09VVExJTktfSURYKG91dGxpbmspOworCisgICAgZG8geworICAgICAgICBpbnQgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShpbmxpbmspOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSB3aGlsZSAoc2VsZWN0LT5zZWxlY3Rfb3V0ICE9IG91dF9ubyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU2VsZWN0Q29udGV4dCAqc2VsZWN0ID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgYXZfZXhwcl9mcmVlKHNlbGVjdC0+ZXhwcik7CisgICAgc2VsZWN0LT5leHByID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX291dHB1dHM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+b3V0cHV0X3BhZHNbaV0ubmFtZSk7CisKKyAgICBpZiAoc2VsZWN0LT5kb19zY2VuZV9kZXRlY3QpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmc2VsZWN0LT5wcmV2X3BpY3JlZik7CisgICAgfQorfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU2VsZWN0Q29udGV4dCAqc2VsZWN0ID0gY3R4LT5wcml2OworCisgICAgaWYgKCFzZWxlY3QtPmRvX3NjZW5lX2RldGVjdCkgeworICAgICAgICByZXR1cm4gZmZfZGVmYXVsdF9xdWVyeV9mb3JtYXRzKGN0eCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9CR1IyNCwKKyAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgICAgICB9OworICAgICAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX0FTRUxFQ1RfRklMVEVSCisKK0RFRklORV9PUFRJT05TKGFzZWxlY3QsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSk7CitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXNlbGVjdCk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBhc2VsZWN0X2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU2VsZWN0Q29udGV4dCAqc2VsZWN0ID0gY3R4LT5wcml2OworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGluaXQoY3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHNlbGVjdC0+ZG9fc2NlbmVfZGV0ZWN0KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlNjZW5lIGRldGVjdGlvbiBpcyBpZ25vcmVkIGluIGFzZWxlY3QgZmlsdGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2FzZWxlY3RfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2FzZWxlY3QgPSB7CisgICAgLm5hbWUgICAgICAgID0gImFzZWxlY3QiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTZWxlY3QgYXVkaW8gZnJhbWVzIHRvIHBhc3MgaW4gb3V0cHV0LiIpLAorICAgIC5pbml0ICAgICAgICA9IGFzZWxlY3RfaW5pdCwKKyAgICAudW5pbml0ICAgICAgPSB1bmluaXQsCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFNlbGVjdENvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICA9IGF2ZmlsdGVyX2FmX2FzZWxlY3RfaW5wdXRzLAorICAgIC5wcml2X2NsYXNzICA9ICZhc2VsZWN0X2NsYXNzLAorICAgIC5mbGFncyAgICAgICA9IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19PVVRQVVRTLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfQVNFTEVDVF9GSUxURVIgKi8KKworI2lmIENPTkZJR19TRUxFQ1RfRklMVEVSCisKK0RFRklORV9PUFRJT05TKHNlbGVjdCwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNKTsKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzZWxlY3QpOworCitzdGF0aWMgYXZfY29sZCBpbnQgc2VsZWN0X2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gaW5pdChjdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX3NlbGVjdF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfc2VsZWN0ID0geworICAgIC5uYW1lICAgICAgICAgID0gInNlbGVjdCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2VsZWN0IHZpZGVvIGZyYW1lcyB0byBwYXNzIGluIG91dHB1dC4iKSwKKyAgICAuaW5pdCAgICAgICAgICA9IHNlbGVjdF9pbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihTZWxlY3RDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZzZWxlY3RfY2xhc3MsCisgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl92Zl9zZWxlY3RfaW5wdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX09VVFBVVFMsCit9OworI2VuZGlmIC8qIENPTkZJR19TRUxFQ1RfRklMVEVSICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvZl9zZW5kY21kLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZl9zZW5kY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwZjQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9mX3NlbmRjbWQuYwpAQCAtMCwwICsxLDU3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHNlbmQgY29tbWFuZHMgZmlsdGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlsZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmZpbHRlcmdyYXBoLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCisjZGVmaW5lIENPTU1BTkRfRkxBR19FTlRFUiAxCisjZGVmaW5lIENPTU1BTkRfRkxBR19MRUFWRSAyCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqbWFrZV9jb21tYW5kX2ZsYWdzX3N0cihBVkJQcmludCAqcGJ1ZiwgaW50IGZsYWdzKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZmxhZ19zdHJpbmdzW10gPSB7ICJlbnRlciIsICJsZWF2ZSIgfTsKKyAgICBpbnQgaSwgaXNfZmlyc3QgPSAxOworCisgICAgYXZfYnByaW50X2luaXQocGJ1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfQVVUT01BVElDKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZmxhZ19zdHJpbmdzKTsgaSsrKSB7CisgICAgICAgIGlmIChmbGFncyAmIDE8PGkpIHsKKyAgICAgICAgICAgIGlmICghaXNfZmlyc3QpCisgICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKHBidWYsICcrJywgMSk7CisgICAgICAgICAgICBhdl9icHJpbnRmKHBidWYsICIlcyIsIGZsYWdfc3RyaW5nc1tpXSk7CisgICAgICAgICAgICBpc19maXJzdCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcGJ1Zi0+c3RyOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGZsYWdzOworICAgIGNoYXIgKnRhcmdldCwgKmNvbW1hbmQsICphcmc7CisgICAgaW50IGluZGV4OworfSBDb21tYW5kOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50NjRfdCBzdGFydF90czsgICAgICAgICAgLy8vPCBzdGFydCB0aW1lc3RhbXAgZXhwcmVzc2VkIGFzIG1pY3Jvc2Vjb25kcyB1bml0cworICAgIGludDY0X3QgZW5kX3RzOyAgICAgICAgICAgIC8vLzwgZW5kICAgdGltZXN0YW1wIGV4cHJlc3NlZCBhcyBtaWNyb3NlY29uZHMgdW5pdHMKKyAgICBpbnQgaW5kZXg7ICAgICAgICAgICAgICAgICAvLy88IHVuaXF1ZSBpbmRleCBmb3IgdGhlc2UgaW50ZXJ2YWwgY29tbWFuZHMKKyAgICBDb21tYW5kICpjb21tYW5kczsKKyAgICBpbnQgICBuYl9jb21tYW5kczsKKyAgICBpbnQgZW5hYmxlZDsgICAgICAgICAgICAgICAvLy88IGN1cnJlbnQgdGltZSBkZXRlY3RlZCBpbnNpZGUgdGhpcyBpbnRlcnZhbAorfSBJbnRlcnZhbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEludGVydmFsICppbnRlcnZhbHM7CisgICAgaW50ICAgbmJfaW50ZXJ2YWxzOworCisgICAgY2hhciAqY29tbWFuZHNfZmlsZW5hbWU7CisgICAgY2hhciAqY29tbWFuZHNfc3RyOworfSBTZW5kQ21kQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU2VuZENtZENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSB8IEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiY29tbWFuZHMiLCAic2V0IGNvbW1hbmRzIiwgT0ZGU0VUKGNvbW1hbmRzX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJjIiwgICAgICAgICJzZXQgY29tbWFuZHMiLCBPRkZTRVQoY29tbWFuZHNfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgImZpbGVuYW1lIiwgInNldCBjb21tYW5kcyBmaWxlIiwgIE9GRlNFVChjb21tYW5kc19maWxlbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJmIiwgICAgICAgICJzZXQgY29tbWFuZHMgZmlsZSIsICBPRkZTRVQoY29tbWFuZHNfZmlsZW5hbWUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNkZWZpbmUgU1BBQ0VTICIgXGZcdFxuXHIiCisKK3N0YXRpYyB2b2lkIHNraXBfY29tbWVudHMoY29uc3QgY2hhciAqKmJ1ZikKK3sKKyAgICB3aGlsZSAoKipidWYpIHsKKyAgICAgICAgLyogc2tpcCBsZWFkaW5nIHNwYWNlcyAqLworICAgICAgICAqYnVmICs9IHN0cnNwbigqYnVmLCBTUEFDRVMpOworICAgICAgICBpZiAoKipidWYgIT0gJyMnKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgKCpidWYpKys7CisKKyAgICAgICAgLyogc2tpcCBjb21tZW50IHVudGlsIHRoZSBlbmQgb2YgbGluZSAqLworICAgICAgICAqYnVmICs9IHN0cmNzcG4oKmJ1ZiwgIlxuIik7CisgICAgICAgIGlmICgqKmJ1ZikKKyAgICAgICAgICAgICgqYnVmKSsrOworICAgIH0KK30KKworI2RlZmluZSBDT01NQU5EX0RFTElNUyAiIFxmXHRcblxyLDsiCisKK3N0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChDb21tYW5kICpjbWQsIGludCBjbWRfY291bnQsIGludCBpbnRlcnZhbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqYnVmLCB2b2lkICpsb2dfY3R4KQoreworICAgIGludCByZXQ7CisKKyAgICBtZW1zZXQoY21kLCAwLCBzaXplb2YoQ29tbWFuZCkpOworICAgIGNtZC0+aW5kZXggPSBjbWRfY291bnQ7CisKKyAgICAvKiBmb3JtYXQ6IFtGTEFHU10gdGFyZ2V0IGNvbW1hbmQgYXJnICovCisgICAgKmJ1ZiArPSBzdHJzcG4oKmJ1ZiwgU1BBQ0VTKTsKKworICAgIC8qIHBhcnNlIGZsYWdzICovCisgICAgaWYgKCoqYnVmID09ICdbJykgeworICAgICAgICAoKmJ1ZikrKzsgLyogc2tpcCAiWyIgKi8KKworICAgICAgICB3aGlsZSAoKipidWYpIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBzdHJjc3BuKCpidWYsICJ8K10iKTsKKworICAgICAgICAgICAgaWYgICAgICAoIXN0cm5jbXAoKmJ1ZiwgImVudGVyIiwgc3RybGVuKCJlbnRlciIpKSkgY21kLT5mbGFncyB8PSBDT01NQU5EX0ZMQUdfRU5URVI7CisgICAgICAgICAgICBlbHNlIGlmICghc3RybmNtcCgqYnVmLCAibGVhdmUiLCBzdHJsZW4oImxlYXZlIikpKSBjbWQtPmZsYWdzIHw9IENPTU1BTkRfRkxBR19MRUFWRTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXIgZmxhZ19idWZbNjRdOworICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkoZmxhZ19idWYsICpidWYsIHNpemVvZihmbGFnX2J1ZikpOworICAgICAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGZsYWcgJyVzJyBpbiBpbnRlcnZhbCAjJWQsIGNvbW1hbmQgIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBmbGFnX2J1ZiwgaW50ZXJ2YWxfY291bnQsIGNtZF9jb3VudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpidWYgKz0gbGVuOworICAgICAgICAgICAgaWYgKCoqYnVmID09ICddJykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICghc3Ryc3BuKCpidWYsICIrfCIpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZmxhZ3MgY2hhciAnJWMnIGluIGludGVydmFsICMlZCwgY29tbWFuZCAjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICoqYnVmLCBpbnRlcnZhbF9jb3VudCwgY21kX2NvdW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqYnVmKQorICAgICAgICAgICAgICAgICgqYnVmKSsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCoqYnVmICE9ICddJykgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBmbGFnIHRlcm1pbmF0b3Igb3IgZXh0cmFuZW91cyBkYXRhIGZvdW5kIGF0IHRoZSBlbmQgb2YgZmxhZ3MgIgorICAgICAgICAgICAgICAgICAgICJpbiBpbnRlcnZhbCAjJWQsIGNvbW1hbmQgIyVkXG4iLCBpbnRlcnZhbF9jb3VudCwgY21kX2NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgKCpidWYpKys7IC8qIHNraXAgIl0iICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgY21kLT5mbGFncyA9IENPTU1BTkRfRkxBR19FTlRFUjsKKyAgICB9CisKKyAgICAqYnVmICs9IHN0cnNwbigqYnVmLCBTUEFDRVMpOworICAgIGNtZC0+dGFyZ2V0ID0gYXZfZ2V0X3Rva2VuKGJ1ZiwgQ09NTUFORF9ERUxJTVMpOworICAgIGlmICghY21kLT50YXJnZXQgfHwgIWNtZC0+dGFyZ2V0WzBdKSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTm8gdGFyZ2V0IHNwZWNpZmllZCBpbiBpbnRlcnZhbCAjJWQsIGNvbW1hbmQgIyVkXG4iLAorICAgICAgICAgICAgICAgaW50ZXJ2YWxfY291bnQsIGNtZF9jb3VudCk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgICpidWYgKz0gc3Ryc3BuKCpidWYsIFNQQUNFUyk7CisgICAgY21kLT5jb21tYW5kID0gYXZfZ2V0X3Rva2VuKGJ1ZiwgQ09NTUFORF9ERUxJTVMpOworICAgIGlmICghY21kLT5jb21tYW5kIHx8ICFjbWQtPmNvbW1hbmRbMF0pIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJObyBjb21tYW5kIHNwZWNpZmllZCBpbiBpbnRlcnZhbCAjJWQsIGNvbW1hbmQgIyVkXG4iLAorICAgICAgICAgICAgICAgaW50ZXJ2YWxfY291bnQsIGNtZF9jb3VudCk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgICpidWYgKz0gc3Ryc3BuKCpidWYsIFNQQUNFUyk7CisgICAgY21kLT5hcmcgPSBhdl9nZXRfdG9rZW4oYnVmLCBDT01NQU5EX0RFTElNUyk7CisKKyAgICByZXR1cm4gMTsKKworZmFpbDoKKyAgICBhdl9mcmVlcCgmY21kLT50YXJnZXQpOworICAgIGF2X2ZyZWVwKCZjbWQtPmNvbW1hbmQpOworICAgIGF2X2ZyZWVwKCZjbWQtPmFyZyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwYXJzZV9jb21tYW5kcyhDb21tYW5kICoqY21kcywgaW50ICpuYl9jbWRzLCBpbnQgaW50ZXJ2YWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipidWYsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgaW50IGNtZF9jb3VudCA9IDA7CisgICAgaW50IHJldCwgbiA9IDA7CisgICAgQVZCUHJpbnQgcGJ1ZjsKKworICAgICpjbWRzID0gTlVMTDsKKyAgICAqbmJfY21kcyA9IDA7CisKKyAgICB3aGlsZSAoKipidWYpIHsKKyAgICAgICAgQ29tbWFuZCBjbWQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9jb21tYW5kKCZjbWQsIGNtZF9jb3VudCwgaW50ZXJ2YWxfY291bnQsIGJ1ZiwgbG9nX2N0eCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGNtZF9jb3VudCsrOworCisgICAgICAgIC8qIChyZSlhbGxvY2F0ZSBjb21tYW5kcyBhcnJheSBpZiByZXF1aXJlZCAqLworICAgICAgICBpZiAoKm5iX2NtZHMgPT0gbikgeworICAgICAgICAgICAgbiA9IEZGTUFYKDE2LCAyKm4pOyAvKiBmaXJzdCBhbGxvY2F0aW9uID0gMTYsIG9yIGRvdWJsZSB0aGUgbnVtYmVyICovCisgICAgICAgICAgICAqY21kcyA9IGF2X3JlYWxsb2NfZigqY21kcywgbiwgMipzaXplb2YoQ29tbWFuZCkpOworICAgICAgICAgICAgaWYgKCEqY21kcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgKHJlKWFsbG9jYXRlIGNvbW1hbmQgYXJyYXlcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAoKmNtZHMpWygqbmJfY21kcykrK10gPSBjbWQ7CisKKyAgICAgICAgKmJ1ZiArPSBzdHJzcG4oKmJ1ZiwgU1BBQ0VTKTsKKyAgICAgICAgaWYgKCoqYnVmICYmICoqYnVmICE9ICc7JyAmJiAqKmJ1ZiAhPSAnLCcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIk1pc3Npbmcgc2VwYXJhdG9yIG9yIGV4dHJhbmVvdXMgZGF0YSBmb3VuZCBhdCB0aGUgZW5kIG9mICIKKyAgICAgICAgICAgICAgICAgICAiaW50ZXJ2YWwgIyVkLCBpbiBjb21tYW5kICMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBpbnRlcnZhbF9jb3VudCwgY21kX2NvdW50KTsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNvbW1hbmQgd2FzIHBhcnNlZCBhczogZmxhZ3M6WyVzXSB0YXJnZXQ6JXMgY29tbWFuZDolcyBhcmc6JXNcbiIsCisgICAgICAgICAgICAgICAgICAgbWFrZV9jb21tYW5kX2ZsYWdzX3N0cigmcGJ1ZiwgY21kLmZsYWdzKSwgY21kLnRhcmdldCwgY21kLmNvbW1hbmQsIGNtZC5hcmcpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipidWYgPT0gJzsnKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmICgqKmJ1ZiA9PSAnLCcpCisgICAgICAgICAgICAoKmJ1ZikrKzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBERUxJTVMgIiBcZlx0XG5cciw7IgorCitzdGF0aWMgaW50IHBhcnNlX2ludGVydmFsKEludGVydmFsICppbnRlcnZhbCwgaW50IGludGVydmFsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqYnVmLCB2b2lkICpsb2dfY3R4KQoreworICAgIGNoYXIgKmludGVydmFsc3RyOworICAgIGludCByZXQ7CisKKyAgICAqYnVmICs9IHN0cnNwbigqYnVmLCBTUEFDRVMpOworICAgIGlmICghKipidWYpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogcmVzZXQgZGF0YSAqLworICAgIG1lbXNldChpbnRlcnZhbCwgMCwgc2l6ZW9mKEludGVydmFsKSk7CisgICAgaW50ZXJ2YWwtPmluZGV4ID0gaW50ZXJ2YWxfY291bnQ7CisKKyAgICAvKiBmb3JtYXQ6IElOVEVSVkFMIENPTU1BTkRTICovCisKKyAgICAvKiBwYXJzZSBpbnRlcnZhbCAqLworICAgIGludGVydmFsc3RyID0gYXZfZ2V0X3Rva2VuKGJ1ZiwgREVMSU1TKTsKKyAgICBpZiAoaW50ZXJ2YWxzdHIgJiYgaW50ZXJ2YWxzdHJbMF0pIHsKKyAgICAgICAgY2hhciAqc3RhcnQsICplbmQ7CisKKyAgICAgICAgc3RhcnQgPSBhdl9zdHJ0b2soaW50ZXJ2YWxzdHIsICItIiwgJmVuZCk7CisgICAgICAgIGlmICgocmV0ID0gYXZfcGFyc2VfdGltZSgmaW50ZXJ2YWwtPnN0YXJ0X3RzLCBzdGFydCwgMSkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBzdGFydCB0aW1lIHNwZWNpZmljYXRpb24gJyVzJyBpbiBpbnRlcnZhbCAjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgc3RhcnQsIGludGVydmFsX2NvdW50KTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZCkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9wYXJzZV90aW1lKCZpbnRlcnZhbC0+ZW5kX3RzLCBlbmQsIDEpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBlbmQgdGltZSBzcGVjaWZpY2F0aW9uICclcycgaW4gaW50ZXJ2YWwgIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBlbmQsIGludGVydmFsX2NvdW50KTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludGVydmFsLT5lbmRfdHMgPSBJTlQ2NF9NQVg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludGVydmFsLT5lbmRfdHMgPCBpbnRlcnZhbC0+c3RhcnRfdHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZW5kIHRpbWUgJyVzJyBpbiBpbnRlcnZhbCAjJWQ6ICIKKyAgICAgICAgICAgICAgICAgICAiY2Fubm90IGJlIGxlc3NlciB0aGFuIHN0YXJ0IHRpbWUgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICBlbmQsIGludGVydmFsX2NvdW50LCBzdGFydCk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTm8gaW50ZXJ2YWwgc3BlY2lmaWVkIGZvciBpbnRlcnZhbCAjJWRcbiIsIGludGVydmFsX2NvdW50KTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICAvKiBwYXJzZSBjb21tYW5kcyAqLworICAgIHJldCA9IHBhcnNlX2NvbW1hbmRzKCZpbnRlcnZhbC0+Y29tbWFuZHMsICZpbnRlcnZhbC0+bmJfY29tbWFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxfY291bnQsIGJ1ZiwgbG9nX2N0eCk7CisKK2VuZDoKKyAgICBhdl9mcmVlKGludGVydmFsc3RyKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBhcnNlX2ludGVydmFscyhJbnRlcnZhbCAqKmludGVydmFscywgaW50ICpuYl9pbnRlcnZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgaW50IGludGVydmFsX2NvdW50ID0gMDsKKyAgICBpbnQgcmV0LCBuID0gMDsKKworICAgICppbnRlcnZhbHMgPSBOVUxMOworICAgICpuYl9pbnRlcnZhbHMgPSAwOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgSW50ZXJ2YWwgaW50ZXJ2YWw7CisKKyAgICAgICAgc2tpcF9jb21tZW50cygmYnVmKTsKKyAgICAgICAgaWYgKCEoKmJ1ZikpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoKHJldCA9IHBhcnNlX2ludGVydmFsKCZpbnRlcnZhbCwgaW50ZXJ2YWxfY291bnQsICZidWYsIGxvZ19jdHgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGJ1ZiArPSBzdHJzcG4oYnVmLCBTUEFDRVMpOworICAgICAgICBpZiAoKmJ1ZikgeworICAgICAgICAgICAgaWYgKCpidWYgIT0gJzsnKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgdGVybWluYXRvciBvciBleHRyYW5lb3VzIGRhdGEgZm91bmQgYXQgdGhlIGVuZCBvZiBpbnRlcnZhbCAjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsX2NvdW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmKys7IC8qIHNraXAgJzsnICovCisgICAgICAgIH0KKyAgICAgICAgaW50ZXJ2YWxfY291bnQrKzsKKworICAgICAgICAvKiAocmUpYWxsb2NhdGUgY29tbWFuZHMgYXJyYXkgaWYgcmVxdWlyZWQgKi8KKyAgICAgICAgaWYgKCpuYl9pbnRlcnZhbHMgPT0gbikgeworICAgICAgICAgICAgbiA9IEZGTUFYKDE2LCAyKm4pOyAvKiBmaXJzdCBhbGxvY2F0aW9uID0gMTYsIG9yIGRvdWJsZSB0aGUgbnVtYmVyICovCisgICAgICAgICAgICAqaW50ZXJ2YWxzID0gYXZfcmVhbGxvY19mKCppbnRlcnZhbHMsIG4sIDIqc2l6ZW9mKEludGVydmFsKSk7CisgICAgICAgICAgICBpZiAoISppbnRlcnZhbHMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IChyZSlhbGxvY2F0ZSBpbnRlcnZhbHMgYXJyYXlcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAoKmludGVydmFscylbKCpuYl9pbnRlcnZhbHMpKytdID0gaW50ZXJ2YWw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY21wX2ludGVydmFscyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIGNvbnN0IEludGVydmFsICppMSA9IGE7CisgICAgY29uc3QgSW50ZXJ2YWwgKmkyID0gYjsKKyAgICBpbnQ2NF90IHRzX2RpZmYgPSBpMS0+c3RhcnRfdHMgLSBpMi0+c3RhcnRfdHM7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IHRzX2RpZmYgPiAwID8gMSA6IHRzX2RpZmYgPCAwID8gLTEgOiAwOworICAgIHJldHVybiByZXQgPT0gMCA/IGkxLT5pbmRleCAtIGkyLT5pbmRleCA6IHJldDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU2VuZENtZENvbnRleHQgKnNlbmRjbWQgPSBjdHgtPnByaXY7CisgICAgaW50IHJldCwgaSwgajsKKworICAgIGlmIChzZW5kY21kLT5jb21tYW5kc19maWxlbmFtZSAmJiBzZW5kY21kLT5jb21tYW5kc19zdHIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk9ubHkgb25lIG9mIHRoZSBmaWxlbmFtZSBvciBjb21tYW5kcyBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoc2VuZGNtZC0+Y29tbWFuZHNfZmlsZW5hbWUpIHsKKyAgICAgICAgdWludDhfdCAqZmlsZV9idWYsICpidWY7CisgICAgICAgIHNpemVfdCBmaWxlX2J1ZnNpemU7CisgICAgICAgIHJldCA9IGF2X2ZpbGVfbWFwKHNlbmRjbWQtPmNvbW1hbmRzX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZV9idWYsICZmaWxlX2J1ZnNpemUsIDAsIGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAvKiBjcmVhdGUgYSAwLXRlcm1pbmF0ZWQgc3RyaW5nIGJhc2VkIG9uIHRoZSByZWFkIGZpbGUgKi8KKyAgICAgICAgYnVmID0gYXZfbWFsbG9jKGZpbGVfYnVmc2l6ZSArIDEpOworICAgICAgICBpZiAoIWJ1ZikgeworICAgICAgICAgICAgYXZfZmlsZV91bm1hcChmaWxlX2J1ZiwgZmlsZV9idWZzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJ1ZiwgZmlsZV9idWYsIGZpbGVfYnVmc2l6ZSk7CisgICAgICAgIGJ1ZltmaWxlX2J1ZnNpemVdID0gMDsKKyAgICAgICAgYXZfZmlsZV91bm1hcChmaWxlX2J1ZiwgZmlsZV9idWZzaXplKTsKKyAgICAgICAgc2VuZGNtZC0+Y29tbWFuZHNfc3RyID0gYnVmOworICAgIH0KKworICAgIGlmICgocmV0ID0gcGFyc2VfaW50ZXJ2YWxzKCZzZW5kY21kLT5pbnRlcnZhbHMsICZzZW5kY21kLT5uYl9pbnRlcnZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGNtZC0+Y29tbWFuZHNfc3RyLCBjdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBxc29ydChzZW5kY21kLT5pbnRlcnZhbHMsIHNlbmRjbWQtPm5iX2ludGVydmFscywgc2l6ZW9mKEludGVydmFsKSwgY21wX2ludGVydmFscyk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJQYXJzZWQgY29tbWFuZHM6XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VuZGNtZC0+bmJfaW50ZXJ2YWxzOyBpKyspIHsKKyAgICAgICAgQVZCUHJpbnQgcGJ1ZjsKKyAgICAgICAgSW50ZXJ2YWwgKmludGVydmFsID0gJnNlbmRjbWQtPmludGVydmFsc1tpXTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJzdGFydF90aW1lOiVmIGVuZF90aW1lOiVmIGluZGV4OiVkXG4iLAorICAgICAgICAgICAgICAgKGRvdWJsZSlpbnRlcnZhbC0+c3RhcnRfdHMvMTAwMDAwMCwgKGRvdWJsZSlpbnRlcnZhbC0+ZW5kX3RzLzEwMDAwMDAsIGludGVydmFsLT5pbmRleCk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbnRlcnZhbC0+bmJfY29tbWFuZHM7IGorKykgeworICAgICAgICAgICAgQ29tbWFuZCAqY21kID0gJmludGVydmFsLT5jb21tYW5kc1tqXTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgICAgICIgICAgWyVzXSB0YXJnZXQ6JXMgY29tbWFuZDolcyBhcmc6JXMgaW5kZXg6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgbWFrZV9jb21tYW5kX2ZsYWdzX3N0cigmcGJ1ZiwgY21kLT5mbGFncyksIGNtZC0+dGFyZ2V0LCBjbWQtPmNvbW1hbmQsIGNtZC0+YXJnLCBjbWQtPmluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTZW5kQ21kQ29udGV4dCAqc2VuZGNtZCA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzZW5kY21kLT5uYl9pbnRlcnZhbHM7IGkrKykgeworICAgICAgICBJbnRlcnZhbCAqaW50ZXJ2YWwgPSAmc2VuZGNtZC0+aW50ZXJ2YWxzW2ldOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW50ZXJ2YWwtPm5iX2NvbW1hbmRzOyBqKyspIHsKKyAgICAgICAgICAgIENvbW1hbmQgKmNtZCA9ICZpbnRlcnZhbC0+Y29tbWFuZHNbal07CisgICAgICAgICAgICBhdl9mcmVlKGNtZC0+dGFyZ2V0KTsKKyAgICAgICAgICAgIGF2X2ZyZWUoY21kLT5jb21tYW5kKTsKKyAgICAgICAgICAgIGF2X2ZyZWUoY21kLT5hcmcpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWUoaW50ZXJ2YWwtPmNvbW1hbmRzKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJnNlbmRjbWQtPmludGVydmFscyk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpyZWYpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBTZW5kQ21kQ29udGV4dCAqc2VuZGNtZCA9IGN0eC0+cHJpdjsKKyAgICBpbnQ2NF90IHRzOworICAgIGludCBpLCBqLCByZXQ7CisKKyAgICBpZiAocmVmLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGdvdG8gZW5kOworCisgICAgdHMgPSBhdl9yZXNjYWxlX3EocmVmLT5wdHMsIGlubGluay0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7CisKKyNkZWZpbmUgV0lUSElOX0lOVEVSVkFMKHRzLCBzdGFydF90cywgZW5kX3RzKSAoKHRzKSA+PSAoc3RhcnRfdHMpICYmICh0cykgPCAoZW5kX3RzKSkKKworICAgIGZvciAoaSA9IDA7IGkgPCBzZW5kY21kLT5uYl9pbnRlcnZhbHM7IGkrKykgeworICAgICAgICBJbnRlcnZhbCAqaW50ZXJ2YWwgPSAmc2VuZGNtZC0+aW50ZXJ2YWxzW2ldOworICAgICAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgICAgIGlmICghaW50ZXJ2YWwtPmVuYWJsZWQgJiYgV0lUSElOX0lOVEVSVkFMKHRzLCBpbnRlcnZhbC0+c3RhcnRfdHMsIGludGVydmFsLT5lbmRfdHMpKSB7CisgICAgICAgICAgICBmbGFncyArPSBDT01NQU5EX0ZMQUdfRU5URVI7CisgICAgICAgICAgICBpbnRlcnZhbC0+ZW5hYmxlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludGVydmFsLT5lbmFibGVkICYmICFXSVRISU5fSU5URVJWQUwodHMsIGludGVydmFsLT5zdGFydF90cywgaW50ZXJ2YWwtPmVuZF90cykpIHsKKyAgICAgICAgICAgIGZsYWdzICs9IENPTU1BTkRfRkxBR19MRUFWRTsKKyAgICAgICAgICAgIGludGVydmFsLT5lbmFibGVkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFncykgeworICAgICAgICAgICAgQVZCUHJpbnQgcGJ1ZjsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgICAgICJbJXNdIGludGVydmFsICMlZCBzdGFydF90czolZiBlbmRfdHM6JWYgdHM6JWZcbiIsCisgICAgICAgICAgICAgICAgICAgbWFrZV9jb21tYW5kX2ZsYWdzX3N0cigmcGJ1ZiwgZmxhZ3MpLCBpbnRlcnZhbC0+aW5kZXgsCisgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlpbnRlcnZhbC0+c3RhcnRfdHMvMTAwMDAwMCwgKGRvdWJsZSlpbnRlcnZhbC0+ZW5kX3RzLzEwMDAwMDAsCisgICAgICAgICAgICAgICAgICAgKGRvdWJsZSl0cy8xMDAwMDAwKTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgZmxhZ3MgJiYgaiA8IGludGVydmFsLT5uYl9jb21tYW5kczsgaisrKSB7CisgICAgICAgICAgICAgICAgQ29tbWFuZCAqY21kID0gJmludGVydmFsLT5jb21tYW5kc1tqXTsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMDI0XTsKKworICAgICAgICAgICAgICAgIGlmIChjbWQtPmZsYWdzICYgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2Vzc2luZyBjb21tYW5kICMlZCB0YXJnZXQ6JXMgY29tbWFuZDolcyBhcmc6JXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPmluZGV4LCBjbWQtPnRhcmdldCwgY21kLT5jb21tYW5kLCBjbWQtPmFyZyk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX3NlbmRfY29tbWFuZChpbmxpbmstPmdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT50YXJnZXQsIGNtZC0+Y29tbWFuZCwgY21kLT5hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGSUxURVJfQ01EX0ZMQUdfT05FKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tbWFuZCByZXBseSBmb3IgY29tbWFuZCAjJWQ6IHJldDolcyByZXM6JXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPmluZGV4LCBhdl9lcnIyc3RyKHJldCksIGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitlbmQ6CisgICAgc3dpdGNoIChpbmxpbmstPnR5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShpbmxpbmstPmRzdC0+b3V0cHV0c1swXSwgcmVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworfQorCisjaWYgQ09ORklHX1NFTkRDTURfRklMVEVSCisKKyNkZWZpbmUgc2VuZGNtZF9vcHRpb25zIG9wdGlvbnMKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzZW5kY21kKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNlbmRjbWRfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzZW5kY21kX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9zZW5kY21kID0geworICAgIC5uYW1lICAgICAgICA9ICJzZW5kY21kIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2VuZCBjb21tYW5kcyB0byBmaWx0ZXJzLiIpLAorICAgIC5pbml0ICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgID0gdW5pbml0LAorICAgIC5wcml2X3NpemUgICA9IHNpemVvZihTZW5kQ21kQ29udGV4dCksCisgICAgLmlucHV0cyAgICAgID0gc2VuZGNtZF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgID0gc2VuZGNtZF9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICA9ICZzZW5kY21kX2NsYXNzLAorfTsKKworI2VuZGlmCisKKyNpZiBDT05GSUdfQVNFTkRDTURfRklMVEVSCisKKyNkZWZpbmUgYXNlbmRjbWRfb3B0aW9ucyBvcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXNlbmRjbWQpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXNlbmRjbWRfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhc2VuZGNtZF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYXNlbmRjbWQgPSB7CisgICAgLm5hbWUgICAgICAgID0gImFzZW5kY21kIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2VuZCBjb21tYW5kcyB0byBmaWx0ZXJzLiIpLAorICAgIC5pbml0ICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgID0gdW5pbml0LAorICAgIC5wcml2X3NpemUgICA9IHNpemVvZihTZW5kQ21kQ29udGV4dCksCisgICAgLmlucHV0cyAgICAgID0gYXNlbmRjbWRfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IGFzZW5kY21kX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgID0gJmFzZW5kY21kX2NsYXNzLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvZl96bXEuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9mX3ptcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YzNjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZl96bXEuYwpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHJlY2VpdmUgY29tbWFuZHMgdGhyb3VnaCBsaWJ6ZXJvbXEgYW5kIGJyb2tlciB0aGVtIHRvIGZpbHRlcnMKKyAqLworCisjaW5jbHVkZSA8em1xLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXJncmFwaC5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIHZvaWQgKnptcTsKKyAgICB2b2lkICpyZXNwb25kZXI7CisgICAgY2hhciAqYmluZF9hZGRyZXNzOworICAgIGludCBjb21tYW5kX2NvdW50OworfSBaTVFDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihaTVFDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSB8IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImJpbmRfYWRkcmVzcyIsICJzZXQgYmluZCBhZGRyZXNzIiwgT0ZGU0VUKGJpbmRfYWRkcmVzcyksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAidGNwOi8vKjo1NTU1In0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAiYiIsICAgICAgICAgICAgInNldCBiaW5kIGFkZHJlc3MiLCBPRkZTRVQoYmluZF9hZGRyZXNzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJ0Y3A6Ly8qOjU1NTUifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgWk1RQ29udGV4dCAqem1xID0gY3R4LT5wcml2OworCisgICAgem1xLT56bXEgPSB6bXFfY3R4X25ldygpOworICAgIGlmICghem1xLT56bXEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgWk1RIGNvbnRleHQ6ICVzXG4iLCB6bXFfc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgem1xLT5yZXNwb25kZXIgPSB6bXFfc29ja2V0KHptcS0+em1xLCBaTVFfUkVQKTsKKyAgICBpZiAoIXptcS0+cmVzcG9uZGVyKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIFpNUSBzb2NrZXQ6ICVzXG4iLCB6bXFfc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgaWYgKHptcV9iaW5kKHptcS0+cmVzcG9uZGVyLCB6bXEtPmJpbmRfYWRkcmVzcykgPT0gLTEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBiaW5kIFpNUSBzb2NrZXQgdG8gYWRkcmVzcyAnJXMnOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHptcS0+YmluZF9hZGRyZXNzLCB6bXFfc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgem1xLT5jb21tYW5kX2NvdW50ID0gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF2X2NvbGQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFpNUUNvbnRleHQgKnptcSA9IGN0eC0+cHJpdjsKKworICAgIHptcV9jbG9zZSh6bXEtPnJlc3BvbmRlcik7CisgICAgem1xX2N0eF9kZXN0cm95KHptcS0+em1xKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgKnRhcmdldCwgKmNvbW1hbmQsICphcmc7Cit9IENvbW1hbmQ7CisKKyNkZWZpbmUgU1BBQ0VTICIgXGZcdFxuXHIiCisKK3N0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChDb21tYW5kICpjbWQsIGNvbnN0IGNoYXIgKmNvbW1hbmRfc3RyLCB2b2lkICpsb2dfY3R4KQoreworICAgIGNvbnN0IGNoYXIgKipidWYgPSAmY29tbWFuZF9zdHI7CisKKyAgICBjbWQtPnRhcmdldCA9IGF2X2dldF90b2tlbihidWYsIFNQQUNFUyk7CisgICAgaWYgKCFjbWQtPnRhcmdldCB8fCAhY21kLT50YXJnZXRbMF0pIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJObyB0YXJnZXQgc3BlY2lmaWVkIGluIGNvbW1hbmQgJyVzJ1xuIiwgY29tbWFuZF9zdHIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGNtZC0+Y29tbWFuZCA9IGF2X2dldF90b2tlbihidWYsIFNQQUNFUyk7CisgICAgaWYgKCFjbWQtPmNvbW1hbmQgfHwgIWNtZC0+Y29tbWFuZFswXSkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk5vIGNvbW1hbmQgc3BlY2lmaWVkIGluIGNvbW1hbmQgJyVzJ1xuIiwgY29tbWFuZF9zdHIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGNtZC0+YXJnID0gYXZfZ2V0X3Rva2VuKGJ1ZiwgU1BBQ0VTKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWN2X21zZyhBVkZpbHRlckNvbnRleHQgKmN0eCwgY2hhciAqKmJ1ZiwgaW50ICpidWZfc2l6ZSkKK3sKKyAgICBaTVFDb250ZXh0ICp6bXEgPSBjdHgtPnByaXY7CisgICAgem1xX21zZ190IG1zZzsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmICh6bXFfbXNnX2luaXQoJm1zZykgPT0gLTEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiQ291bGQgbm90IGluaXRpYWxpemUgcmVjZWl2ZSBtZXNzYWdlOiAlc1xuIiwgem1xX3N0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIGlmICh6bXFfbXNnX3JlY3YoJm1zZywgem1xLT5yZXNwb25kZXIsIFpNUV9ET05UV0FJVCkgPT0gLTEpIHsKKyAgICAgICAgaWYgKGVycm5vICE9IEVBR0FJTikKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVjZWl2ZSBtZXNzYWdlOiAlc1xuIiwgem1xX3N0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgICpidWZfc2l6ZSA9IHptcV9tc2dfc2l6ZSgmbXNnKSArIDE7CisgICAgKmJ1ZiA9IGF2X21hbGxvYygqYnVmX3NpemUpOworICAgIGlmICghKmJ1ZikgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBtZW1jcHkoKmJ1Ziwgem1xX21zZ19kYXRhKCZtc2cpLCAqYnVmX3NpemUpOworICAgICgqYnVmKVsqYnVmX3NpemUtMV0gPSAwOworCitlbmQ6CisgICAgem1xX21zZ19jbG9zZSgmbXNnKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqcmVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgWk1RQ29udGV4dCAqem1xID0gY3R4LT5wcml2OworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgY2hhciBjbWRfYnVmWzEwMjRdOworICAgICAgICBjaGFyICpyZWN2X2J1ZiwgKnNlbmRfYnVmOworICAgICAgICBpbnQgcmVjdl9idWZfc2l6ZTsKKyAgICAgICAgQ29tbWFuZCBjbWQgPSB7MH07CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgLyogcmVjZWl2ZSBjb21tYW5kICovCisgICAgICAgIGlmIChyZWN2X21zZyhjdHgsICZyZWN2X2J1ZiwgJnJlY3ZfYnVmX3NpemUpIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB6bXEtPmNvbW1hbmRfY291bnQrKzsKKworICAgICAgICAvKiBwYXJzZSBjb21tYW5kICovCisgICAgICAgIGlmIChwYXJzZV9jb21tYW5kKCZjbWQsIHJlY3ZfYnVmLCBjdHgpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHBhcnNlIGNvbW1hbmQgIyVkXG4iLCB6bXEtPmNvbW1hbmRfY291bnQpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcm9jZXNzIGNvbW1hbmQgKi8KKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAiUHJvY2Vzc2luZyBjb21tYW5kICMlZCB0YXJnZXQ6JXMgY29tbWFuZDolcyBhcmc6JXNcbiIsCisgICAgICAgICAgICAgICB6bXEtPmNvbW1hbmRfY291bnQsIGNtZC50YXJnZXQsIGNtZC5jb21tYW5kLCBjbWQuYXJnKTsKKyAgICAgICAgcmV0ID0gYXZmaWx0ZXJfZ3JhcGhfc2VuZF9jb21tYW5kKGlubGluay0+Z3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQudGFyZ2V0LCBjbWQuY29tbWFuZCwgY21kLmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZF9idWYsIHNpemVvZihjbWRfYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRklMVEVSX0NNRF9GTEFHX09ORSk7CisgICAgICAgIHNlbmRfYnVmID0gYXZfYXNwcmludGYoIiVkICVzJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJldCwgYXZfZXJyMnN0cihyZXQpLCBjbWRfYnVmWzBdID8gIlxuIiA6ICIiLCBjbWRfYnVmKTsKKyAgICAgICAgaWYgKCFzZW5kX2J1ZikgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAiU2VuZGluZyBjb21tYW5kIHJlcGx5IGZvciBjb21tYW5kICMlZDpcbiVzXG4iLAorICAgICAgICAgICAgICAgem1xLT5jb21tYW5kX2NvdW50LCBzZW5kX2J1Zik7CisgICAgICAgIGlmICh6bXFfc2VuZCh6bXEtPnJlc3BvbmRlciwgc2VuZF9idWYsIHN0cmxlbihzZW5kX2J1ZiksIDApID09IC0xKQorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNlbmQgcmVwbHkgZm9yIGNvbW1hbmQgIyVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICB6bXEtPmNvbW1hbmRfY291bnQsIHptcV9zdHJlcnJvcihyZXQpKTsKKworICAgIGVuZDoKKyAgICAgICAgYXZfZnJlZXAoJnNlbmRfYnVmKTsKKyAgICAgICAgYXZfZnJlZXAoJnJlY3ZfYnVmKTsKKyAgICAgICAgcmVjdl9idWZfc2l6ZSA9IDA7CisgICAgICAgIGF2X2ZyZWVwKCZjbWQudGFyZ2V0KTsKKyAgICAgICAgYXZfZnJlZXAoJmNtZC5jb21tYW5kKTsKKyAgICAgICAgYXZfZnJlZXAoJmNtZC5hcmcpOworICAgIH0KKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCByZWYpOworfQorCisjaWYgQ09ORklHX1pNUV9GSUxURVIKKworI2RlZmluZSB6bXFfb3B0aW9ucyBvcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moem1xKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHptcV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHptcV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfem1xID0geworICAgIC5uYW1lICAgICAgICA9ICJ6bXEiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWNlaXZlIGNvbW1hbmRzIHRocm91Z2ggWk1RIGFuZCBicm9rZXIgdGhlbSB0byBmaWx0ZXJzLiIpLAorICAgIC5pbml0ICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgID0gdW5pbml0LAorICAgIC5wcml2X3NpemUgICA9IHNpemVvZihaTVFDb250ZXh0KSwKKyAgICAuaW5wdXRzICAgICAgPSB6bXFfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IHptcV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICA9ICZ6bXFfY2xhc3MsCit9OworCisjZW5kaWYKKworI2lmIENPTkZJR19BWk1RX0ZJTFRFUgorCisjZGVmaW5lIGF6bXFfb3B0aW9ucyBvcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXptcSk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhem1xX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXptcV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYXptcSA9IHsKKyAgICAubmFtZSAgICAgICAgPSAiYXptcSIsCisgICAgLmRlc2NyaXB0aW9uID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlY2VpdmUgY29tbWFuZHMgdGhyb3VnaCBaTVEgYW5kIGJyb2tlciB0aGVtIHRvIGZpbHRlcnMuIiksCisgICAgLmluaXQgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgPSB1bmluaXQsCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFpNUUNvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICA9IGF6bXFfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IGF6bXFfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgPSAmYXptcV9jbGFzcywKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2ZpZm8uYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9maWZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3N2NmZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9maWZvLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQm9iYnkgQmluZ2hhbQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBGSUZPIGJ1ZmZlcmluZyBmaWx0ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKworI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IEJ1ZiB7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgc3RydWN0IEJ1ZiAgICAgICAgKm5leHQ7Cit9IEJ1ZjsKKwordHlwZWRlZiBzdHJ1Y3QgRmlmb0NvbnRleHQgeworICAgIEJ1ZiAgcm9vdDsKKyAgICBCdWYgKmxhc3Q7ICAgLy8vPCBsYXN0IGJ1ZmZlcmVkIGZyYW1lCisKKyAgICAvKioKKyAgICAgKiBXaGVuIGEgc3BlY2lmaWMgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIGlzIHJlcXVlc3RlZCwgdGhlIHBhcnRpYWwKKyAgICAgKiBidWZmZXIgaXMgc3RvcmVkIGhlcmUKKyAgICAgKi8KKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IGFsbG9jYXRlZF9zYW1wbGVzOyAgICAgIC8vLzwgbnVtYmVyIG9mIHNhbXBsZXMgb3V0IHdhcyBhbGxvY2F0ZWQgZm9yCit9IEZpZm9Db250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBGaWZvQ29udGV4dCAqZmlmbyA9IGN0eC0+cHJpdjsKKyAgICBmaWZvLT5sYXN0ID0gJmZpZm8tPnJvb3Q7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRmlmb0NvbnRleHQgKmZpZm8gPSBjdHgtPnByaXY7CisgICAgQnVmICpidWYsICp0bXA7CisKKyAgICBmb3IgKGJ1ZiA9IGZpZm8tPnJvb3QubmV4dDsgYnVmOyBidWYgPSB0bXApIHsKKyAgICAgICAgdG1wID0gYnVmLT5uZXh0OworICAgICAgICBhdl9mcmFtZV9mcmVlKCZidWYtPmZyYW1lKTsKKyAgICAgICAgYXZfZnJlZShidWYpOworICAgIH0KKworICAgIGF2X2ZyYW1lX2ZyZWUoJmZpZm8tPm91dCk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3RvX3F1ZXVlKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBGaWZvQ29udGV4dCAqZmlmbyA9IGlubGluay0+ZHN0LT5wcml2OworCisgICAgZmlmby0+bGFzdC0+bmV4dCA9IGF2X21hbGxvY3ooc2l6ZW9mKEJ1ZikpOworICAgIGlmICghZmlmby0+bGFzdC0+bmV4dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZmlmby0+bGFzdCA9IGZpZm8tPmxhc3QtPm5leHQ7CisgICAgZmlmby0+bGFzdC0+ZnJhbWUgPSBmcmFtZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9wb3AoRmlmb0NvbnRleHQgKnMpCit7CisgICAgQnVmICp0bXAgPSBzLT5yb290Lm5leHQtPm5leHQ7CisgICAgaWYgKHMtPmxhc3QgPT0gcy0+cm9vdC5uZXh0KQorICAgICAgICBzLT5sYXN0ID0gJnMtPnJvb3Q7CisgICAgYXZfZnJlZXAoJnMtPnJvb3QubmV4dCk7CisgICAgcy0+cm9vdC5uZXh0ID0gdG1wOworfQorCisvKioKKyAqIE1vdmUgZGF0YSBwb2ludGVycyBhbmQgcHRzIG9mZnNldCBzYW1wbGVzIGZvcndhcmQuCisgKi8KK3N0YXRpYyB2b2lkIGJ1ZmZlcl9vZmZzZXQoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCkKK3sKKyAgICBpbnQgbmJfY2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMobGluay0+Y2hhbm5lbF9sYXlvdXQpOworICAgIGludCBwbGFuYXIgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihsaW5rLT5mb3JtYXQpOworICAgIGludCBwbGFuZXMgPSBwbGFuYXIgPyBuYl9jaGFubmVscyA6IDE7CisgICAgaW50IGJsb2NrX2FsaWduID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUobGluay0+Zm9ybWF0KSAqIChwbGFuYXIgPyAxIDogbmJfY2hhbm5lbHMpOworICAgIGludCBpOworCisgICAgYXZfYXNzZXJ0MChmcmFtZS0+bmJfc2FtcGxlcyA+IG9mZnNldCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspCisgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhW2ldICs9IGJsb2NrX2FsaWduICogb2Zmc2V0OworICAgIGlmIChmcmFtZS0+ZGF0YSAhPSBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSkKKyAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhLCBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgIEZGTUlOKHBsYW5lcywgRkZfQVJSQVlfRUxFTVMoZnJhbWUtPmRhdGEpKSAqIHNpemVvZigqZnJhbWUtPmRhdGEpKTsKKyAgICBmcmFtZS0+bGluZXNpemVbMF0gLT0gYmxvY2tfYWxpZ24qb2Zmc2V0OworICAgIGZyYW1lLT5uYl9zYW1wbGVzIC09IG9mZnNldDsKKworICAgIGlmIChmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGZyYW1lLT5wdHMgKz0gYXZfcmVzY2FsZV9xKG9mZnNldCwgKEFWUmF0aW9uYWwpezEsIGxpbmstPnNhbXBsZV9yYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+dGltZV9iYXNlKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY2FsY19wdHJfYWxpZ25tZW50KEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCBwbGFuZXMgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihmcmFtZS0+Zm9ybWF0KSA/CisgICAgICAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpIDogMTsKKyAgICBpbnQgbWluX2FsaWduID0gMTI4OworICAgIGludCBwOworCisgICAgZm9yIChwID0gMDsgcCA8IHBsYW5lczsgcCsrKSB7CisgICAgICAgIGludCBjdXJfYWxpZ24gPSAxMjg7CisgICAgICAgIHdoaWxlICgoaW50cHRyX3QpZnJhbWUtPmV4dGVuZGVkX2RhdGFbcF0gJSBjdXJfYWxpZ24pCisgICAgICAgICAgICBjdXJfYWxpZ24gPj49IDE7CisgICAgICAgIGlmIChjdXJfYWxpZ24gPCBtaW5fYWxpZ24pCisgICAgICAgICAgICBtaW5fYWxpZ24gPSBjdXJfYWxpZ247CisgICAgfQorICAgIHJldHVybiBtaW5fYWxpZ247Cit9CisKK3N0YXRpYyBpbnQgcmV0dXJuX2F1ZGlvX2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyTGluayAqbGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBGaWZvQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpoZWFkID0gcy0+cm9vdC5uZXh0ID8gcy0+cm9vdC5uZXh0LT5mcmFtZSA6IE5VTEw7CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludCByZXQ7CisKKyAgICAvKiBpZiBoZWFkIGlzIE5VTEwgdGhlbiB3ZSdyZSBmbHVzaGluZyB0aGUgcmVtYWluaW5nIHNhbXBsZXMgaW4gb3V0ICovCisgICAgaWYgKCFoZWFkICYmICFzLT5vdXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGlmICghcy0+b3V0ICYmCisgICAgICAgIGhlYWQtPm5iX3NhbXBsZXMgPj0gbGluay0+cmVxdWVzdF9zYW1wbGVzICYmCisgICAgICAgIGNhbGNfcHRyX2FsaWdubWVudChoZWFkKSA+PSAzMikgeworICAgICAgICBpZiAoaGVhZC0+bmJfc2FtcGxlcyA9PSBsaW5rLT5yZXF1ZXN0X3NhbXBsZXMpIHsKKyAgICAgICAgICAgIG91dCA9IGhlYWQ7CisgICAgICAgICAgICBxdWV1ZV9wb3Aocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPSBhdl9mcmFtZV9jbG9uZShoZWFkKTsKKyAgICAgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgIG91dC0+bmJfc2FtcGxlcyA9IGxpbmstPnJlcXVlc3Rfc2FtcGxlczsKKyAgICAgICAgICAgIGJ1ZmZlcl9vZmZzZXQobGluaywgaGVhZCwgbGluay0+cmVxdWVzdF9zYW1wbGVzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBuYl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhsaW5rLT5jaGFubmVsX2xheW91dCk7CisKKyAgICAgICAgaWYgKCFzLT5vdXQpIHsKKyAgICAgICAgICAgIHMtPm91dCA9IGZmX2dldF9hdWRpb19idWZmZXIobGluaywgbGluay0+cmVxdWVzdF9zYW1wbGVzKTsKKyAgICAgICAgICAgIGlmICghcy0+b3V0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgIHMtPm91dC0+bmJfc2FtcGxlcyA9IDA7CisgICAgICAgICAgICBzLT5vdXQtPnB0cyAgICAgICAgICAgICAgICAgICA9IGhlYWQtPnB0czsKKyAgICAgICAgICAgIHMtPmFsbG9jYXRlZF9zYW1wbGVzICAgICAgICAgID0gbGluay0+cmVxdWVzdF9zYW1wbGVzOworICAgICAgICB9IGVsc2UgaWYgKGxpbmstPnJlcXVlc3Rfc2FtcGxlcyAhPSBzLT5hbGxvY2F0ZWRfc2FtcGxlcykgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAicmVxdWVzdF9zYW1wbGVzIGNoYW5nZWQgYmVmb3JlIHRoZSAiCisgICAgICAgICAgICAgICAgICAgImJ1ZmZlciB3YXMgcmV0dXJuZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocy0+b3V0LT5uYl9zYW1wbGVzIDwgcy0+YWxsb2NhdGVkX3NhbXBsZXMpIHsKKyAgICAgICAgICAgIGludCBsZW47CisKKyAgICAgICAgICAgIGlmICghcy0+cm9vdC5uZXh0KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgICAgICAgICBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKHMtPm91dC0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5vdXQtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWxsb2NhdGVkX3NhbXBsZXMgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dC0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9jaGFubmVscywgbGluay0+Zm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgcy0+b3V0LT5uYl9zYW1wbGVzID0gcy0+YWxsb2NhdGVkX3NhbXBsZXM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKHMtPnJvb3QubmV4dCk7IC8vIElmIGZmX3JlcXVlc3RfZnJhbWUoKSBzdWNjZWVkZWQgdGhlbiB3ZSBzaG91bGQgaGF2ZSBhIGZyYW1lCisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZWFkID0gcy0+cm9vdC5uZXh0LT5mcmFtZTsKKworICAgICAgICAgICAgbGVuID0gRkZNSU4ocy0+YWxsb2NhdGVkX3NhbXBsZXMgLSBzLT5vdXQtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkLT5uYl9zYW1wbGVzKTsKKworICAgICAgICAgICAgYXZfc2FtcGxlc19jb3B5KHMtPm91dC0+ZXh0ZW5kZWRfZGF0YSwgaGVhZC0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5vdXQtPm5iX3NhbXBsZXMsIDAsIGxlbiwgbmJfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+Zm9ybWF0KTsKKyAgICAgICAgICAgIHMtPm91dC0+bmJfc2FtcGxlcyArPSBsZW47CisKKyAgICAgICAgICAgIGlmIChsZW4gPT0gaGVhZC0+bmJfc2FtcGxlcykgeworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmhlYWQpOworICAgICAgICAgICAgICAgIHF1ZXVlX3BvcChzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX29mZnNldChsaW5rLCBoZWFkLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dCA9IHMtPm91dDsKKyAgICAgICAgcy0+b3V0ID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShsaW5rLCBvdXQpOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEZpZm9Db250ZXh0ICpmaWZvID0gb3V0bGluay0+c3JjLT5wcml2OworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKCFmaWZvLT5yb290Lm5leHQpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKG91dGxpbmstPnNyYy0+aW5wdXRzWzBdKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIG91dGxpbmstPnJlcXVlc3Rfc2FtcGxlcykKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuX2F1ZGlvX2ZyYW1lKG91dGxpbmstPnNyYyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGF2X2Fzc2VydDAoZmlmby0+cm9vdC5uZXh0KTsKKyAgICB9CisKKyAgICBpZiAob3V0bGluay0+cmVxdWVzdF9zYW1wbGVzKSB7CisgICAgICAgIHJldHVybiByZXR1cm5fYXVkaW9fZnJhbWUob3V0bGluay0+c3JjKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZmlmby0+cm9vdC5uZXh0LT5mcmFtZSk7CisgICAgICAgIHF1ZXVlX3BvcChmaWZvKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfZmlmb19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgICAgPSBhZGRfdG9fcXVldWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX2ZpZm9fb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfZmlmbyA9IHsKKyAgICAubmFtZSAgICAgID0gImZpZm8iLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCdWZmZXIgaW5wdXQgaW1hZ2VzIGFuZCBzZW5kIHRoZW0gd2hlbiB0aGV5IGFyZSByZXF1ZXN0ZWQuIiksCisKKyAgICAuaW5pdCAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgID0gdW5pbml0LAorCisgICAgLnByaXZfc2l6ZSA9IHNpemVvZihGaWZvQ29udGV4dCksCisKKyAgICAuaW5wdXRzICAgID0gYXZmaWx0ZXJfdmZfZmlmb19pbnB1dHMsCisgICAgLm91dHB1dHMgICA9IGF2ZmlsdGVyX3ZmX2ZpZm9fb3V0cHV0cywKK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl9hZl9hZmlmb19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgICAgPSBhZGRfdG9fcXVldWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2FmaWZvX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2FmaWZvID0geworICAgIC5uYW1lICAgICAgICA9ICJhZmlmbyIsCisgICAgLmRlc2NyaXB0aW9uID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJ1ZmZlciBpbnB1dCBmcmFtZXMgYW5kIHNlbmQgdGhlbSB3aGVuIHRoZXkgYXJlIHJlcXVlc3RlZC4iKSwKKworICAgIC5pbml0ICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgPSB1bmluaXQsCisKKyAgICAucHJpdl9zaXplID0gc2l6ZW9mKEZpZm9Db250ZXh0KSwKKworICAgIC5pbnB1dHMgICAgPSBhdmZpbHRlcl9hZl9hZmlmb19pbnB1dHMsCisgICAgLm91dHB1dHMgICA9IGF2ZmlsdGVyX2FmX2FmaWZvX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2ZpbHRmbXRzLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZmlsdGZtdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTAyNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2ZpbHRmbXRzLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKworI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2F2ZmlsdGVyLmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvZm9ybWF0cy5oIgorCitzdGF0aWMgdm9pZCBwcmludF9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyX2N0eCkKK3sKKyAgICBpbnQgaSwgajsKKworI2RlZmluZSBQUklOVF9GTVRTKGlub3V0LCBvdXRpbiwgSU5PVVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJfY3R4LT5uYl8jI2lub3V0IyNwdXRzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmaWx0ZXJfY3R4LT5pbm91dCMjcHV0c1tpXS0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsgICBcCisgICAgICAgICAgICBBVkZpbHRlckZvcm1hdHMgKmZtdHMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmlsdGVyX2N0eC0+aW5vdXQjI3B1dHNbaV0tPm91dGluIyNfZm9ybWF0czsgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZm10cy0+bmJfZm9ybWF0czsgaisrKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKGF2X2dldF9waXhfZm10X25hbWUoZm10cy0+Zm9ybWF0c1tqXSkpICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHByaW50ZigjSU5PVVQgIlBVVFslZF0gJXM6IGZtdDolc1xuIiwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBpLCBhdmZpbHRlcl9wYWRfZ2V0X25hbWUoZmlsdGVyX2N0eC0+aW5vdXQjI3B1dF9wYWRzLCBpKSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoZm10cy0+Zm9ybWF0c1tqXSkpOyAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyX2N0eC0+aW5vdXQjI3B1dHNbaV0tPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7IFwKKyAgICAgICAgICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZtdHMgPSBmaWx0ZXJfY3R4LT5pbm91dCMjcHV0c1tpXS0+b3V0aW4jI19mb3JtYXRzOyAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmbXRzLT5uYl9mb3JtYXRzOyBqKyspICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcHJpbnRmKCNJTk9VVCAiUFVUWyVkXSAlczogZm10OiVzXG4iLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIGksIGF2ZmlsdGVyX3BhZF9nZXRfbmFtZShmaWx0ZXJfY3R4LT5pbm91dCMjcHV0X3BhZHMsIGkpLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShmbXRzLT5mb3JtYXRzW2pdKSk7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxheW91dHMgPSBmaWx0ZXJfY3R4LT5pbm91dCMjcHV0c1tpXS0+b3V0aW4jI19jaGFubmVsX2xheW91dHM7IFwKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsYXlvdXRzLT5uYl9jaGFubmVsX2xheW91dHM7IGorKykgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIC0xLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dHMtPmNoYW5uZWxfbGF5b3V0c1tqXSk7ICAgICAgICAgXAorICAgICAgICAgICAgICAgIHByaW50ZigjSU5PVVQgIlBVVFslZF0gJXM6IGNobGF5b3V0OiVzXG4iLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBpLCBhdmZpbHRlcl9wYWRfZ2V0X25hbWUoZmlsdGVyX2N0eC0+aW5vdXQjI3B1dF9wYWRzLCBpKSwgYnVmKTsgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisgICAgUFJJTlRfRk1UUyhpbiwgIG91dCwgSU4pOworICAgIFBSSU5UX0ZNVFMob3V0LCBpbiwgIE9VVCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBBVkZpbHRlciAqZmlsdGVyOworICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyX2N0eDsKKyAgICBBVkZpbHRlckdyYXBoICpncmFwaF9jdHg7CisgICAgY29uc3QgY2hhciAqZmlsdGVyX25hbWU7CisgICAgY29uc3QgY2hhciAqZmlsdGVyX2FyZ3MgPSBOVUxMOworICAgIGludCBpOworCisgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOworCisgICAgaWYgKGFyZ2MgPCAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWx0ZXIgbmFtZSBhcyBhcmd1bWVudFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGZpbHRlcl9uYW1lID0gYXJndlsxXTsKKyAgICBpZiAoYXJnYyA+IDIpCisgICAgICAgIGZpbHRlcl9hcmdzID0gYXJndlsyXTsKKworICAgIC8qIGFsbG9jYXRlIGdyYXBoICovCisgICAgZ3JhcGhfY3R4ID0gYXZmaWx0ZXJfZ3JhcGhfYWxsb2MoKTsKKyAgICBpZiAoIWdyYXBoX2N0eCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBhdmZpbHRlcl9yZWdpc3Rlcl9hbGwoKTsKKworICAgIC8qIGdldCBhIGNvcnJlc3BvbmRpbmcgZmlsdGVyIGFuZCBvcGVuIGl0ICovCisgICAgaWYgKCEoZmlsdGVyID0gYXZmaWx0ZXJfZ2V0X2J5X25hbWUoZmlsdGVyX25hbWUpKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBmaWx0ZXIgd2l0aCBuYW1lICclcydcbiIsIGZpbHRlcl9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogb3BlbiBmaWx0ZXIgYW5kIGFkZCBpdCB0byB0aGUgZ3JhcGggKi8KKyAgICBpZiAoIShmaWx0ZXJfY3R4ID0gYXZmaWx0ZXJfZ3JhcGhfYWxsb2NfZmlsdGVyKGdyYXBoX2N0eCwgZmlsdGVyLCBmaWx0ZXJfbmFtZSkpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW1wb3NzaWJsZSB0byBvcGVuIGZpbHRlciB3aXRoIG5hbWUgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICBmaWx0ZXJfbmFtZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoYXZmaWx0ZXJfaW5pdF9zdHIoZmlsdGVyX2N0eCwgZmlsdGVyX2FyZ3MpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkltcG9zc2libGUgdG8gaW5pdCBmaWx0ZXIgJyVzJyB3aXRoIGFyZ3VtZW50cyAnJXMnXG4iLAorICAgICAgICAgICAgICAgIGZpbHRlcl9uYW1lLCBmaWx0ZXJfYXJncyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGNyZWF0ZSBhIGxpbmsgZm9yIGVhY2ggb2YgdGhlIGlucHV0IHBhZHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyX2N0eC0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICpsaW5rID0gYXZfbWFsbG9jeihzaXplb2YoQVZGaWx0ZXJMaW5rKSk7CisgICAgICAgIGxpbmstPnR5cGUgPSBhdmZpbHRlcl9wYWRfZ2V0X3R5cGUoZmlsdGVyX2N0eC0+aW5wdXRfcGFkcywgaSk7CisgICAgICAgIGZpbHRlcl9jdHgtPmlucHV0c1tpXSA9IGxpbms7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJfY3R4LT5uYl9vdXRwdXRzOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICpsaW5rID0gYXZfbWFsbG9jeihzaXplb2YoQVZGaWx0ZXJMaW5rKSk7CisgICAgICAgIGxpbmstPnR5cGUgPSBhdmZpbHRlcl9wYWRfZ2V0X3R5cGUoZmlsdGVyX2N0eC0+b3V0cHV0X3BhZHMsIGkpOworICAgICAgICBmaWx0ZXJfY3R4LT5vdXRwdXRzW2ldID0gbGluazsKKyAgICB9CisKKyAgICBpZiAoZmlsdGVyLT5xdWVyeV9mb3JtYXRzKQorICAgICAgICBmaWx0ZXItPnF1ZXJ5X2Zvcm1hdHMoZmlsdGVyX2N0eCk7CisgICAgZWxzZQorICAgICAgICBmZl9kZWZhdWx0X3F1ZXJ5X2Zvcm1hdHMoZmlsdGVyX2N0eCk7CisKKyAgICBwcmludF9mb3JtYXRzKGZpbHRlcl9jdHgpOworCisgICAgYXZmaWx0ZXJfZnJlZShmaWx0ZXJfY3R4KTsKKyAgICBhdmZpbHRlcl9ncmFwaF9mcmVlKCZncmFwaF9jdHgpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2Zvcm1hdHMuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9mb3JtYXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzYjg3YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9mb3JtYXRzLmMKQEAgLTAsMCArMSw2NzIgQEAKKy8qCisgKiBGaWx0ZXIgbGF5ZXIgLSBmb3JtYXQgbmVnb3RpYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNyBCb2JieSBCaW5naGFtCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKworI2RlZmluZSBLTk9XTihsKSAoIUZGX0xBWU9VVDJDT1VOVChsKSkgLyogZm9yIHJlYWRhYmlsaXR5ICovCisKKy8qKgorICogQWRkIGFsbCByZWZzIGZyb20gYSB0byByZXQgYW5kIGRlc3Ryb3kgYS4KKyAqLworI2RlZmluZSBNRVJHRV9SRUYocmV0LCBhLCBmbXRzLCB0eXBlLCBmYWlsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgKioqdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKHRtcCA9IGF2X3JlYWxsb2NfYXJyYXkocmV0LT5yZWZzLCByZXQtPnJlZmNvdW50ICsgYS0+cmVmY291bnQsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCp0bXApKSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIGZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldC0+cmVmcyA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBhLT5yZWZjb3VudDsgaSArKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXQtPnJlZnNbcmV0LT5yZWZjb3VudF0gPSBhLT5yZWZzW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqcmV0LT5yZWZzW3JldC0+cmVmY291bnQrK10gPSByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2ZyZWVwKCZhLT5yZWZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2ZyZWVwKCZhLT5mbXRzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2ZyZWVwKCZhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqCisgKiBBZGQgYWxsIGZvcm1hdHMgY29tbW9uIGZvciBhIGFuZCBiIHRvIHJldCwgY29weSB0aGUgcmVmcyBhbmQgZGVzdHJveQorICogYSBhbmQgYi4KKyAqLworI2RlZmluZSBNRVJHRV9GT1JNQVRTKHJldCwgYSwgYiwgZm10cywgbmIsIHR5cGUsIGZhaWwpICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgaiwgayA9IDAsIGNvdW50ID0gRkZNSU4oYS0+bmIsIGItPm5iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEocmV0ID0gYXZfbWFsbG9jeihzaXplb2YoKnJldCkpKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ290byBmYWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNvdW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCEocmV0LT5mbXRzID0gYXZfbWFsbG9jX2FycmF5KGNvdW50LCBzaXplb2YoKnJldC0+Zm10cykpKSkgICAgICAgICAgXAorICAgICAgICAgICAgZ290byBmYWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhLT5uYjsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBiLT5uYjsgaisrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChhLT5mbXRzW2ldID09IGItPmZtdHNbal0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmKGsgPj0gRkZNSU4oYS0+bmIsIGItPm5iKSl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJEdXBsaWNhdGUgZm9ybWF0cyBpbiBhdmZpbHRlcl9tZXJnZV9mb3JtYXRzKCkgZGV0ZWN0ZWRcbiIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKHJldC0+Zm10cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUocmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcmV0LT5mbXRzW2srK10gPSBhLT5mbXRzW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXQtPm5iID0gazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgd2FzIGF0IGxlYXN0IG9uZSBjb21tb24gZm9ybWF0ICovICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFyZXQtPm5iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ290byBmYWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUVSR0VfUkVGKHJldCwgYSwgZm10cywgdHlwZSwgZmFpbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNRVJHRV9SRUYocmV0LCBiLCBmbXRzLCB0eXBlLCBmYWlsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworQVZGaWx0ZXJGb3JtYXRzICpmZl9tZXJnZV9mb3JtYXRzKEFWRmlsdGVyRm9ybWF0cyAqYSwgQVZGaWx0ZXJGb3JtYXRzICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZSkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKnJldCA9IE5VTEw7CisgICAgaW50IGksIGo7CisgICAgaW50IGFscGhhMT0wLCBhbHBoYTI9MDsKKyAgICBpbnQgY2hyb21hMT0wLCBjaHJvbWEyPTA7CisKKyAgICBpZiAoYSA9PSBiKQorICAgICAgICByZXR1cm4gYTsKKworICAgIC8qIERvIG5vdCBsb3NlIGNocm9tYSBvciBhbHBoYSBpbiBtZXJnaW5nLgorICAgICAgIEl0IGhhcHBlbnMgaWYgYm90aCBsaXN0cyBoYXZlIGZvcm1hdHMgd2l0aCBjaHJvbWEgKHJlc3AuIGFscGhhKSwgYnV0CisgICAgICAgdGhlIG9ubHkgZm9ybWF0cyBpbiBjb21tb24gZG8gbm90IGhhdmUgaXQgKGUuZy4gWVVWK2dyYXkgdnMuCisgICAgICAgUkdCK2dyYXkpOiBpbiB0aGF0IGNhc2UsIHRoZSBtZXJnaW5nIHdvdWxkIHNlbGVjdCB0aGUgZ3JheSBmb3JtYXQsCisgICAgICAgcG9zc2libHkgY2F1c2luZyBhIGxvc3N5IGNvbnZlcnNpb24gZWxzZXdoZXJlIGluIHRoZSBncmFwaC4KKyAgICAgICBUbyBhdm9pZCB0aGF0LCBwcmV0ZW5kIHRoYXQgdGhlcmUgYXJlIG5vIGNvbW1vbiBmb3JtYXRzIHRvIGZvcmNlIHRoZQorICAgICAgIGluc2VydGlvbiBvZiBhIGNvbnZlcnNpb24gZmlsdGVyLiAqLworICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGEtPm5iX2Zvcm1hdHM7IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBiLT5uYl9mb3JtYXRzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmFkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhLT5mb3JtYXRzW2ldKTsKKyAgICAgICAgICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmJkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChiLT5mb3JtYXRzW2pdKTsKKyAgICAgICAgICAgICAgICBhbHBoYTIgfD0gYWRlc2MtPmZsYWdzICYgYmRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBOworICAgICAgICAgICAgICAgIGNocm9tYTJ8PSBhZGVzYy0+bmJfY29tcG9uZW50cyA+IDEgJiYgYmRlc2MtPm5iX2NvbXBvbmVudHMgPiAxOworICAgICAgICAgICAgICAgIGlmIChhLT5mb3JtYXRzW2ldID09IGItPmZvcm1hdHNbal0pIHsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGExIHw9IGFkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQTsKKyAgICAgICAgICAgICAgICAgICAgY2hyb21hMXw9IGFkZXNjLT5uYl9jb21wb25lbnRzID4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAvLyBJZiBjaHJvbWEgb3IgYWxwaGEgY2FuIGJlIGxvc3QgdGhyb3VnaCBtZXJnaW5nIHRoZW4gZG8gbm90IG1lcmdlCisgICAgaWYgKGFscGhhMiA+IGFscGhhMSB8fCBjaHJvbWEyID4gY2hyb21hMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBNRVJHRV9GT1JNQVRTKHJldCwgYSwgYiwgZm9ybWF0cywgbmJfZm9ybWF0cywgQVZGaWx0ZXJGb3JtYXRzLCBmYWlsKTsKKworICAgIHJldHVybiByZXQ7CitmYWlsOgorICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfZnJlZXAoJnJldC0+cmVmcyk7CisgICAgICAgIGF2X2ZyZWVwKCZyZXQtPmZvcm1hdHMpOworICAgIH0KKyAgICBhdl9mcmVlcCgmcmV0KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworQVZGaWx0ZXJGb3JtYXRzICpmZl9tZXJnZV9zYW1wbGVyYXRlcyhBVkZpbHRlckZvcm1hdHMgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyRm9ybWF0cyAqYikKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKnJldCA9IE5VTEw7CisKKyAgICBpZiAoYSA9PSBiKSByZXR1cm4gYTsKKworICAgIGlmIChhLT5uYl9mb3JtYXRzICYmIGItPm5iX2Zvcm1hdHMpIHsKKyAgICAgICAgTUVSR0VfRk9STUFUUyhyZXQsIGEsIGIsIGZvcm1hdHMsIG5iX2Zvcm1hdHMsIEFWRmlsdGVyRm9ybWF0cywgZmFpbCk7CisgICAgfSBlbHNlIGlmIChhLT5uYl9mb3JtYXRzKSB7CisgICAgICAgIE1FUkdFX1JFRihhLCBiLCBmb3JtYXRzLCBBVkZpbHRlckZvcm1hdHMsIGZhaWwpOworICAgICAgICByZXQgPSBhOworICAgIH0gZWxzZSB7CisgICAgICAgIE1FUkdFX1JFRihiLCBhLCBmb3JtYXRzLCBBVkZpbHRlckZvcm1hdHMsIGZhaWwpOworICAgICAgICByZXQgPSBiOworICAgIH0KKworICAgIHJldHVybiByZXQ7CitmYWlsOgorICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfZnJlZXAoJnJldC0+cmVmcyk7CisgICAgICAgIGF2X2ZyZWVwKCZyZXQtPmZvcm1hdHMpOworICAgIH0KKyAgICBhdl9mcmVlcCgmcmV0KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqZmZfbWVyZ2VfY2hhbm5lbF9sYXlvdXRzKEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqYikKK3sKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpyZXQgPSBOVUxMOworICAgIHVuc2lnbmVkIGFfYWxsID0gYS0+YWxsX2xheW91dHMgKyBhLT5hbGxfY291bnRzOworICAgIHVuc2lnbmVkIGJfYWxsID0gYi0+YWxsX2xheW91dHMgKyBiLT5hbGxfY291bnRzOworICAgIGludCByZXRfbWF4LCByZXRfbmIgPSAwLCBpLCBqLCByb3VuZDsKKworICAgIGlmIChhID09IGIpIHJldHVybiBhOworCisgICAgLyogUHV0IHRoZSBtb3N0IGdlbmVyaWMgc2V0IGluIGEsIHRvIGF2b2lkIGRvaW5nIGV2ZXJ5dGhpbmcgdHdpY2UgKi8KKyAgICBpZiAoYV9hbGwgPCBiX2FsbCkgeworICAgICAgICBGRlNXQVAoQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqLCBhLCBiKTsKKyAgICAgICAgRkZTV0FQKHVuc2lnbmVkLCBhX2FsbCwgYl9hbGwpOworICAgIH0KKyAgICBpZiAoYV9hbGwpIHsKKyAgICAgICAgaWYgKGFfYWxsID09IDEgJiYgIWJfYWxsKSB7CisgICAgICAgICAgICAvKiBrZWVwIG9ubHkga25vd24gbGF5b3V0cyBpbiBiOyB3b3JrcyBhbHNvIGZvciBiX2FsbCA9IDEgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IGogPSAwOyBpIDwgYi0+bmJfY2hhbm5lbF9sYXlvdXRzOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKEtOT1dOKGItPmNoYW5uZWxfbGF5b3V0c1tpXSkpCisgICAgICAgICAgICAgICAgICAgIGItPmNoYW5uZWxfbGF5b3V0c1tqKytdID0gYi0+Y2hhbm5lbF9sYXlvdXRzW2ldOworICAgICAgICAgICAgLyogTm90IG9wdGltYWw6IHRoZSB1bmtub3duIGxheW91dHMgb2YgYiBtYXkgYmVjb21lIGtub3duIGFmdGVyCisgICAgICAgICAgICAgICBhbm90aGVyIG1lcmdlLiAqLworICAgICAgICAgICAgaWYgKCFqKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgYi0+bmJfY2hhbm5lbF9sYXlvdXRzID0gajsKKyAgICAgICAgfQorICAgICAgICBNRVJHRV9SRUYoYiwgYSwgY2hhbm5lbF9sYXlvdXRzLCBBVkZpbHRlckNoYW5uZWxMYXlvdXRzLCBmYWlsKTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorCisgICAgcmV0X21heCA9IGEtPm5iX2NoYW5uZWxfbGF5b3V0cyArIGItPm5iX2NoYW5uZWxfbGF5b3V0czsKKyAgICBpZiAoIShyZXQgPSBhdl9tYWxsb2N6KHNpemVvZigqcmV0KSkpIHx8CisgICAgICAgICEocmV0LT5jaGFubmVsX2xheW91dHMgPSBhdl9tYWxsb2NfYXJyYXkocmV0X21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnJldC0+Y2hhbm5lbF9sYXlvdXRzKSkpKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiBhW2tub3duXSBpbnRlcnNlY3QgYltrbm93bl0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYS0+bmJfY2hhbm5lbF9sYXlvdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKCFLTk9XTihhLT5jaGFubmVsX2xheW91dHNbaV0pKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBiLT5uYl9jaGFubmVsX2xheW91dHM7IGorKykgeworICAgICAgICAgICAgaWYgKGEtPmNoYW5uZWxfbGF5b3V0c1tpXSA9PSBiLT5jaGFubmVsX2xheW91dHNbal0pIHsKKyAgICAgICAgICAgICAgICByZXQtPmNoYW5uZWxfbGF5b3V0c1tyZXRfbmIrK10gPSBhLT5jaGFubmVsX2xheW91dHNbaV07CisgICAgICAgICAgICAgICAgYS0+Y2hhbm5lbF9sYXlvdXRzW2ldID0gYi0+Y2hhbm5lbF9sYXlvdXRzW2pdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiAxc3Qgcm91bmQ6IGFba25vd25dIGludGVyc2VjdCBiW2dlbmVyaWNdCisgICAgICAgMm5kIHJvdW5kOiBhW2dlbmVyaWNdIGludGVyc2VjdCBiW2tub3duXSAqLworICAgIGZvciAocm91bmQgPSAwOyByb3VuZCA8IDI7IHJvdW5kKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGEtPm5iX2NoYW5uZWxfbGF5b3V0czsgaSsrKSB7CisgICAgICAgICAgICB1aW50NjRfdCBmbXQgPSBhLT5jaGFubmVsX2xheW91dHNbaV0sIGJmbXQ7CisgICAgICAgICAgICBpZiAoIWZtdCB8fCAhS05PV04oZm10KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGJmbXQgPSBGRl9DT1VOVDJMQVlPVVQoYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGZtdCkpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGItPm5iX2NoYW5uZWxfbGF5b3V0czsgaisrKQorICAgICAgICAgICAgICAgIGlmIChiLT5jaGFubmVsX2xheW91dHNbal0gPT0gYmZtdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0LT5jaGFubmVsX2xheW91dHNbcmV0X25iKytdID0gYS0+Y2hhbm5lbF9sYXlvdXRzW2ldOworICAgICAgICB9CisgICAgICAgIC8qIDFzdCByb3VuZDogc3dhcCB0byBwcmVwYXJlIDJuZCByb3VuZDsgMm5kIHJvdW5kOiBwdXQgaXQgYmFjayAqLworICAgICAgICBGRlNXQVAoQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqLCBhLCBiKTsKKyAgICB9CisgICAgLyogYVtnZW5lcmljXSBpbnRlcnNlY3QgYltnZW5lcmljXSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhLT5uYl9jaGFubmVsX2xheW91dHM7IGkrKykgeworICAgICAgICBpZiAoS05PV04oYS0+Y2hhbm5lbF9sYXlvdXRzW2ldKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYi0+bmJfY2hhbm5lbF9sYXlvdXRzOyBqKyspCisgICAgICAgICAgICBpZiAoYS0+Y2hhbm5lbF9sYXlvdXRzW2ldID09IGItPmNoYW5uZWxfbGF5b3V0c1tqXSkKKyAgICAgICAgICAgICAgICByZXQtPmNoYW5uZWxfbGF5b3V0c1tyZXRfbmIrK10gPSBhLT5jaGFubmVsX2xheW91dHNbaV07CisgICAgfQorCisgICAgcmV0LT5uYl9jaGFubmVsX2xheW91dHMgPSByZXRfbmI7CisgICAgaWYgKCFyZXQtPm5iX2NoYW5uZWxfbGF5b3V0cykKKyAgICAgICAgZ290byBmYWlsOworICAgIE1FUkdFX1JFRihyZXQsIGEsIGNoYW5uZWxfbGF5b3V0cywgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cywgZmFpbCk7CisgICAgTUVSR0VfUkVGKHJldCwgYiwgY2hhbm5lbF9sYXlvdXRzLCBBVkZpbHRlckNoYW5uZWxMYXlvdXRzLCBmYWlsKTsKKyAgICByZXR1cm4gcmV0OworCitmYWlsOgorICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfZnJlZXAoJnJldC0+cmVmcyk7CisgICAgICAgIGF2X2ZyZWVwKCZyZXQtPmNoYW5uZWxfbGF5b3V0cyk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZyZXQpOworICAgIHJldHVybiBOVUxMOworfQorCitpbnQgZmZfZm10X2lzX2luKGludCBmbXQsIGNvbnN0IGludCAqZm10cykKK3sKKyAgICBjb25zdCBpbnQgKnA7CisKKyAgICBmb3IgKHAgPSBmbXRzOyAqcCAhPSAtMTsgcCsrKSB7CisgICAgICAgIGlmIChmbXQgPT0gKnApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ09QWV9JTlRfTElTVChsaXN0X2NvcHksIGxpc3QsIHR5cGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobGlzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChjb3VudCA9IDA7IGxpc3RbY291bnRdICE9IC0xOyBjb3VudCsrKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsaXN0X2NvcHkgPSBhdl9jYWxsb2MoY291bnQrMSwgc2l6ZW9mKHR5cGUpKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobGlzdF9jb3B5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWVtY3B5KGxpc3RfY29weSwgbGlzdCwgc2l6ZW9mKHR5cGUpICogY291bnQpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGlzdF9jb3B5W2NvdW50XSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBNQUtFX0ZPUk1BVF9MSVNUKHR5cGUsIGZpZWxkLCBjb3VudF9maWVsZCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgKmZvcm1hdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBjb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmbXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGNvdW50ID0gMDsgZm10c1tjb3VudF0gIT0gLTE7IGNvdW50KyspICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvcm1hdHMgPSBhdl9tYWxsb2N6KHNpemVvZigqZm9ybWF0cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghZm9ybWF0cykgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvcm1hdHMtPmNvdW50X2ZpZWxkID0gY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjb3VudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3JtYXRzLT5maWVsZCA9IGF2X21hbGxvY19hcnJheShjb3VudCwgc2l6ZW9mKCpmb3JtYXRzLT5maWVsZCkpOyAgICAgIFwKKyAgICAgICAgaWYgKCFmb3JtYXRzLT5maWVsZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2X2ZyZWUoZm9ybWF0cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK0FWRmlsdGVyRm9ybWF0cyAqZmZfbWFrZV9mb3JtYXRfbGlzdChjb25zdCBpbnQgKmZtdHMpCit7CisgICAgTUFLRV9GT1JNQVRfTElTVChBVkZpbHRlckZvcm1hdHMsIGZvcm1hdHMsIG5iX2Zvcm1hdHMpOworICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICBmb3JtYXRzLT5mb3JtYXRzW2NvdW50XSA9IGZtdHNbY291bnRdOworCisgICAgcmV0dXJuIGZvcm1hdHM7Cit9CisKK0FWRmlsdGVyQ2hhbm5lbExheW91dHMgKmF2ZmlsdGVyX21ha2VfZm9ybWF0NjRfbGlzdChjb25zdCBpbnQ2NF90ICpmbXRzKQoreworICAgIE1BS0VfRk9STUFUX0xJU1QoQVZGaWx0ZXJDaGFubmVsTGF5b3V0cywKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbGF5b3V0cywgbmJfY2hhbm5lbF9sYXlvdXRzKTsKKyAgICBpZiAoY291bnQpCisgICAgICAgIG1lbWNweShmb3JtYXRzLT5jaGFubmVsX2xheW91dHMsIGZtdHMsCisgICAgICAgICAgICAgICBzaXplb2YoKmZvcm1hdHMtPmNoYW5uZWxfbGF5b3V0cykgKiBjb3VudCk7CisKKyAgICByZXR1cm4gZm9ybWF0czsKK30KKworI2RlZmluZSBBRERfRk9STUFUKGYsIGZtdCwgdHlwZSwgbGlzdCwgbmIpICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgKmZtdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgKm9sZGYgPSAqZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKCpmKSAmJiAhKCpmID0gYXZfbWFsbG9jeihzaXplb2YoKipmKSkpKSAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZtdHMgPSBhdl9yZWFsbG9jKCgqZiktPmxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqKCpmKS0+bGlzdCkgKiAoKCpmKS0+bmIgKyAxKSk7XAorICAgIGlmICghZm10cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIW9sZGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXZfZnJlZXAoZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqZiktPmxpc3QgPSBmbXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqZiktPmxpc3RbKCpmKS0+bmIrK10gPSBmbXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworaW50IGZmX2FkZF9mb3JtYXQoQVZGaWx0ZXJGb3JtYXRzICoqYXZmZiwgaW50NjRfdCBmbXQpCit7CisgICAgQUREX0ZPUk1BVChhdmZmLCBmbXQsIGludCwgZm9ybWF0cywgbmJfZm9ybWF0cyk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqKmwsIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0KQoreworICAgIGF2X2Fzc2VydDEoISgqbCAmJiAoKmwpLT5hbGxfbGF5b3V0cykpOworICAgIEFERF9GT1JNQVQobCwgY2hhbm5lbF9sYXlvdXQsIHVpbnQ2NF90LCBjaGFubmVsX2xheW91dHMsIG5iX2NoYW5uZWxfbGF5b3V0cyk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWRmlsdGVyRm9ybWF0cyAqZmZfYWxsX2Zvcm1hdHMoZW51bSBBVk1lZGlhVHlwZSB0eXBlKQoreworICAgIEFWRmlsdGVyRm9ybWF0cyAqcmV0ID0gTlVMTDsKKworICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBOVUxMOworICAgICAgICB3aGlsZSAoKGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfbmV4dChkZXNjKSkpIHsKKyAgICAgICAgICAgIGlmICghKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpKQorICAgICAgICAgICAgICAgIGZmX2FkZF9mb3JtYXQoJnJldCwgYXZfcGl4X2ZtdF9kZXNjX2dldF9pZChkZXNjKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgZm10ID0gMDsKKyAgICAgICAgd2hpbGUgKGF2X2dldF9zYW1wbGVfZm10X25hbWUoZm10KSkgeworICAgICAgICAgICAgZmZfYWRkX2Zvcm1hdCgmcmV0LCBmbXQpOworICAgICAgICAgICAgZm10Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitjb25zdCBpbnQ2NF90IGF2ZmlsdGVyX2FsbF9jaGFubmVsX2xheW91dHNbXSA9IHsKKyNpbmNsdWRlICJhbGxfY2hhbm5lbF9sYXlvdXRzLmluYyIKKyAgICAtMQorfTsKKworLy8gQVZGaWx0ZXJGb3JtYXRzICphdmZpbHRlcl9tYWtlX2FsbF9jaGFubmVsX2xheW91dHModm9pZCkKKy8vIHsKKy8vICAgICByZXR1cm4gYXZmaWx0ZXJfbWFrZV9mb3JtYXQ2NF9saXN0KGF2ZmlsdGVyX2FsbF9jaGFubmVsX2xheW91dHMpOworLy8gfQorCitBVkZpbHRlckZvcm1hdHMgKmZmX3BsYW5hcl9zYW1wbGVfZm10cyh2b2lkKQoreworICAgIEFWRmlsdGVyRm9ybWF0cyAqcmV0ID0gTlVMTDsKKyAgICBpbnQgZm10OworCisgICAgZm9yIChmbXQgPSAwOyBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShmbXQpPjA7IGZtdCsrKQorICAgICAgICBpZiAoYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoZm10KSkKKyAgICAgICAgICAgIGZmX2FkZF9mb3JtYXQoJnJldCwgZm10KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK0FWRmlsdGVyRm9ybWF0cyAqZmZfYWxsX3NhbXBsZXJhdGVzKHZvaWQpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpyZXQgPSBhdl9tYWxsb2N6KHNpemVvZigqcmV0KSk7CisgICAgcmV0dXJuIHJldDsKK30KKworQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqZmZfYWxsX2NoYW5uZWxfbGF5b3V0cyh2b2lkKQoreworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKnJldCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpyZXQpKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0LT5hbGxfbGF5b3V0cyA9IDE7CisgICAgcmV0dXJuIHJldDsKK30KKworQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqZmZfYWxsX2NoYW5uZWxfY291bnRzKHZvaWQpCit7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqcmV0ID0gYXZfbWFsbG9jeihzaXplb2YoKnJldCkpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXQtPmFsbF9sYXlvdXRzID0gcmV0LT5hbGxfY291bnRzID0gMTsKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEZPUk1BVFNfUkVGKGYsIHJlZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKnJlZiA9IGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZi0+cmVmcyA9IGF2X3JlYWxsb2MoZi0+cmVmcywgc2l6ZW9mKCpmLT5yZWZzKSAqICsrZi0+cmVmY291bnQpOyBcCisgICAgZi0+cmVmc1tmLT5yZWZjb3VudC0xXSA9IHJlZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCit2b2lkIGZmX2NoYW5uZWxfbGF5b3V0c19yZWYoQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqZiwgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqKnJlZikKK3sKKyAgICBGT1JNQVRTX1JFRihmLCByZWYpOworfQorCit2b2lkIGZmX2Zvcm1hdHNfcmVmKEFWRmlsdGVyRm9ybWF0cyAqZiwgQVZGaWx0ZXJGb3JtYXRzICoqcmVmKQoreworICAgIEZPUk1BVFNfUkVGKGYsIHJlZik7Cit9CisKKyNkZWZpbmUgRklORF9SRUZfSU5ERVgocmVmLCBpZHgpICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgKCpyZWYpLT5yZWZjb3VudDsgaSArKykgXAorICAgICAgICBpZigoKnJlZiktPnJlZnNbaV0gPT0gcmVmKSB7ICAgICAgICBcCisgICAgICAgICAgICBpZHggPSBpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZPUk1BVFNfVU5SRUYocmVmLCBsaXN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaWR4ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKnJlZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTkRfUkVGX0lOREVYKHJlZiwgaWR4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGlkeCA+PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtZW1tb3ZlKCgqcmVmKS0+cmVmcyArIGlkeCwgKCpyZWYpLT5yZWZzICsgaWR4ICsgMSwgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVvZigqKCpyZWYpLT5yZWZzKSAqICgoKnJlZiktPnJlZmNvdW50IC0gaWR4IC0gMSkpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCEtLSgqcmVmKS0+cmVmY291bnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXZfZnJlZSgoKnJlZiktPmxpc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2ZyZWUoKCpyZWYpLT5yZWZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9mcmVlKCpyZWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKnJlZiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKwordm9pZCBmZl9mb3JtYXRzX3VucmVmKEFWRmlsdGVyRm9ybWF0cyAqKnJlZikKK3sKKyAgICBGT1JNQVRTX1VOUkVGKHJlZiwgZm9ybWF0cyk7Cit9CisKK3ZvaWQgZmZfY2hhbm5lbF9sYXlvdXRzX3VucmVmKEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKipyZWYpCit7CisgICAgRk9STUFUU19VTlJFRihyZWYsIGNoYW5uZWxfbGF5b3V0cyk7Cit9CisKKyNkZWZpbmUgRk9STUFUU19DSEFOR0VSRUYob2xkcmVmLCBuZXdyZWYpICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaWR4ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSU5EX1JFRl9JTkRFWChvbGRyZWYsIGlkeCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoaWR4ID49IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpvbGRyZWYpLT5yZWZzW2lkeF0gPSBuZXdyZWY7ICAgICAgICAgIFwKKyAgICAgICAgKm5ld3JlZiA9ICpvbGRyZWY7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKm9sZHJlZiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3ZvaWQgZmZfY2hhbm5lbF9sYXlvdXRzX2NoYW5nZXJlZihBVkZpbHRlckNoYW5uZWxMYXlvdXRzICoqb2xkcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKipuZXdyZWYpCit7CisgICAgRk9STUFUU19DSEFOR0VSRUYob2xkcmVmLCBuZXdyZWYpOworfQorCit2b2lkIGZmX2Zvcm1hdHNfY2hhbmdlcmVmKEFWRmlsdGVyRm9ybWF0cyAqKm9sZHJlZiwgQVZGaWx0ZXJGb3JtYXRzICoqbmV3cmVmKQoreworICAgIEZPUk1BVFNfQ0hBTkdFUkVGKG9sZHJlZiwgbmV3cmVmKTsKK30KKworI2RlZmluZSBTRVRfQ09NTU9OX0ZPUk1BVFMoY3R4LCBmbXRzLCBpbl9mbXRzLCBvdXRfZm10cywgcmVmLCBsaXN0KSBcCitpZiAoZm10cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY291bnQgPSAwLCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGN0eC0+aW5wdXRzW2ldICYmICFjdHgtPmlucHV0c1tpXS0+b3V0X2ZtdHMpIHsgICAgICAgICAgXAorICAgICAgICAgICAgcmVmKGZtdHMsICZjdHgtPmlucHV0c1tpXS0+b3V0X2ZtdHMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb3VudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfb3V0cHV0czsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGN0eC0+b3V0cHV0c1tpXSAmJiAhY3R4LT5vdXRwdXRzW2ldLT5pbl9mbXRzKSB7ICAgICAgICAgXAorICAgICAgICAgICAgcmVmKGZtdHMsICZjdHgtPm91dHB1dHNbaV0tPmluX2ZtdHMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb3VudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIWNvdW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9mcmVlcCgmZm10cy0+bGlzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2ZyZWVwKCZmbXRzLT5yZWZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXZfZnJlZXAoJmZtdHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3ZvaWQgZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHMpCit7CisgICAgU0VUX0NPTU1PTl9GT1JNQVRTKGN0eCwgbGF5b3V0cywgaW5fY2hhbm5lbF9sYXlvdXRzLCBvdXRfY2hhbm5lbF9sYXlvdXRzLAorICAgICAgICAgICAgICAgICAgICAgICBmZl9jaGFubmVsX2xheW91dHNfcmVmLCBjaGFubmVsX2xheW91dHMpOworfQorCit2b2lkIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJGb3JtYXRzICpzYW1wbGVyYXRlcykKK3sKKyAgICBTRVRfQ09NTU9OX0ZPUk1BVFMoY3R4LCBzYW1wbGVyYXRlcywgaW5fc2FtcGxlcmF0ZXMsIG91dF9zYW1wbGVyYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgZmZfZm9ybWF0c19yZWYsIGZvcm1hdHMpOworfQorCisvKioKKyAqIEEgaGVscGVyIGZvciBxdWVyeV9mb3JtYXRzKCkgd2hpY2ggc2V0cyBhbGwgbGlua3MgdG8gdGhlIHNhbWUgbGlzdCBvZgorICogZm9ybWF0cy4gSWYgdGhlcmUgYXJlIG5vIGxpbmtzIGhvb2tlZCB0byB0aGlzIGZpbHRlciwgdGhlIGxpc3Qgb2YgZm9ybWF0cyBpcworICogZnJlZWQuCisgKi8KK3ZvaWQgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMpCit7CisgICAgU0VUX0NPTU1PTl9GT1JNQVRTKGN0eCwgZm9ybWF0cywgaW5fZm9ybWF0cywgb3V0X2Zvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGZmX2Zvcm1hdHNfcmVmLCBmb3JtYXRzKTsKK30KKworc3RhdGljIGludCBkZWZhdWx0X3F1ZXJ5X2Zvcm1hdHNfY29tbW9uKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKihsYXlvdXRzKSh2b2lkKSkKK3sKKyAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUgPSBjdHgtPmlucHV0cyAgJiYgY3R4LT5pbnB1dHMgWzBdID8gY3R4LT5pbnB1dHMgWzBdLT50eXBlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm91dHB1dHMgJiYgY3R4LT5vdXRwdXRzWzBdID8gY3R4LT5vdXRwdXRzWzBdLT50eXBlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVk1FRElBX1RZUEVfVklERU87CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9hbGxfZm9ybWF0cyh0eXBlKSk7CisgICAgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgbGF5b3V0cygpKTsKKyAgICAgICAgZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZmX2FsbF9zYW1wbGVyYXRlcygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2RlZmF1bHRfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICByZXR1cm4gZGVmYXVsdF9xdWVyeV9mb3JtYXRzX2NvbW1vbihjdHgsIGZmX2FsbF9jaGFubmVsX2xheW91dHMpOworfQorCitpbnQgZmZfcXVlcnlfZm9ybWF0c19hbGwoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgcmV0dXJuIGRlZmF1bHRfcXVlcnlfZm9ybWF0c19jb21tb24oY3R4LCBmZl9hbGxfY2hhbm5lbF9jb3VudHMpOworfQorCisvKiBpbnRlcm5hbCBmdW5jdGlvbnMgZm9yIHBhcnNpbmcgYXVkaW8gZm9ybWF0IGFyZ3VtZW50cyAqLworCitpbnQgZmZfcGFyc2VfcGl4ZWxfZm9ybWF0KGVudW0gQVZQaXhlbEZvcm1hdCAqcmV0LCBjb25zdCBjaGFyICphcmcsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgY2hhciAqdGFpbDsKKyAgICBpbnQgcGl4X2ZtdCA9IGF2X2dldF9waXhfZm10KGFyZyk7CisgICAgaWYgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgIHBpeF9mbXQgPSBzdHJ0b2woYXJnLCAmdGFpbCwgMCk7CisgICAgICAgIGlmICgqdGFpbCB8fCAhYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KSkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGl4ZWwgZm9ybWF0ICclcydcbiIsIGFyZyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorICAgICpyZXQgPSBwaXhfZm10OworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfcGFyc2Vfc2FtcGxlX2Zvcm1hdChpbnQgKnJldCwgY29uc3QgY2hhciAqYXJnLCB2b2lkICpsb2dfY3R4KQoreworICAgIGNoYXIgKnRhaWw7CisgICAgaW50IHNmbXQgPSBhdl9nZXRfc2FtcGxlX2ZtdChhcmcpOworICAgIGlmIChzZm10ID09IEFWX1NBTVBMRV9GTVRfTk9ORSkgeworICAgICAgICBzZm10ID0gc3RydG9sKGFyZywgJnRhaWwsIDApOworICAgICAgICBpZiAoKnRhaWwgfHwgYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoc2ZtdCk8PTApIHsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSBmb3JtYXQgJyVzJ1xuIiwgYXJnKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgKnJldCA9IHNmbXQ7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9wYXJzZV90aW1lX2Jhc2UoQVZSYXRpb25hbCAqcmV0LCBjb25zdCBjaGFyICphcmcsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgQVZSYXRpb25hbCByOworICAgIGlmKGF2X3BhcnNlX3JhdGlvKCZyLCBhcmcsIElOVF9NQVgsIDAsIGxvZ19jdHgpIDwgMCB8fHIubnVtPD0wICB8fHIuZGVuPD0wKSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHRpbWUgYmFzZSAnJXMnXG4iLCBhcmcpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICAqcmV0ID0gcjsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3BhcnNlX3NhbXBsZV9yYXRlKGludCAqcmV0LCBjb25zdCBjaGFyICphcmcsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgY2hhciAqdGFpbDsKKyAgICBkb3VibGUgc3JhdGUgPSBhdl9zdHJ0b2QoYXJnLCAmdGFpbCk7CisgICAgaWYgKCp0YWlsIHx8IHNyYXRlIDwgMSB8fCAoaW50KXNyYXRlICE9IHNyYXRlIHx8IHNyYXRlID4gSU5UX01BWCkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1wbGUgcmF0ZSAnJXMnXG4iLCBhcmcpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICAqcmV0ID0gc3JhdGU7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9wYXJzZV9jaGFubmVsX2xheW91dChpbnQ2NF90ICpyZXQsIGludCAqbnJldCwgY29uc3QgY2hhciAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxvZ19jdHgpCit7CisgICAgY2hhciAqdGFpbDsKKyAgICBpbnQ2NF90IGNobGF5b3V0LCBjb3VudDsKKworICAgIGlmIChucmV0KSB7CisgICAgICAgIGNvdW50ID0gc3RydG9sKGFyZywgJnRhaWwsIDEwKTsKKyAgICAgICAgaWYgKCp0YWlsID09ICdjJyAmJiAhdGFpbFsxXSAmJiBjb3VudCA+IDAgJiYgY291bnQgPCA2MykgeworICAgICAgICAgICAgKm5yZXQgPSBjb3VudDsKKyAgICAgICAgICAgICpyZXQgPSAwOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgY2hsYXlvdXQgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXQoYXJnKTsKKyAgICBpZiAoY2hsYXlvdXQgPT0gMCkgeworICAgICAgICBjaGxheW91dCA9IHN0cnRvbChhcmcsICZ0YWlsLCAxMCk7CisgICAgICAgIGlmICgqdGFpbCB8fCBjaGxheW91dCA9PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaGFubmVsIGxheW91dCAnJXMnXG4iLCBhcmcpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqcmV0ID0gY2hsYXlvdXQ7CisgICAgaWYgKG5yZXQpCisgICAgICAgICpucmV0ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGNobGF5b3V0KTsKKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIFRFU1QKKworI3VuZGVmIHByaW50ZgorCitpbnQgbWFpbih2b2lkKQoreworICAgIGNvbnN0IGludDY0X3QgKmNsOworICAgIGNoYXIgYnVmWzUxMl07CisKKyAgICBmb3IgKGNsID0gYXZmaWx0ZXJfYWxsX2NoYW5uZWxfbGF5b3V0czsgKmNsICE9IC0xOyBjbCsrKSB7CisgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgLTEsICpjbCk7CisgICAgICAgIHByaW50ZigiJXNcbiIsIGJ1Zik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvZm9ybWF0cy5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2Zvcm1hdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjhlYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2Zvcm1hdHMuaApAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0ZPUk1BVFNfSAorI2RlZmluZSBBVkZJTFRFUl9GT1JNQVRTX0gKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisKKy8qKgorICogQSBsaXN0IG9mIHN1cHBvcnRlZCBmb3JtYXRzIGZvciBvbmUgZW5kIG9mIGEgZmlsdGVyIGxpbmsuIFRoaXMgaXMgdXNlZAorICogZHVyaW5nIHRoZSBmb3JtYXQgbmVnb3RpYXRpb24gcHJvY2VzcyB0byB0cnkgdG8gcGljayB0aGUgYmVzdCBmb3JtYXQgdG8KKyAqIHVzZSB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIG5lY2Vzc2FyeSBjb252ZXJzaW9ucy4gRWFjaCBmaWx0ZXIgZ2l2ZXMgYQorICogbGlzdCBvZiB0aGUgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgZWFjaCBpbnB1dCBhbmQgb3V0cHV0IHBhZC4gVGhlIGxpc3QKKyAqIGdpdmVuIGZvciBlYWNoIHBhZCBuZWVkIG5vdCBiZSBkaXN0aW5jdCAtIHRoZXkgbWF5IGJlIHJlZmVyZW5jZXMgdG8gdGhlCisgKiBzYW1lIGxpc3Qgb2YgZm9ybWF0cywgYXMgaXMgb2Z0ZW4gdGhlIGNhc2Ugd2hlbiBhIGZpbHRlciBzdXBwb3J0cyBtdWx0aXBsZQorICogZm9ybWF0cywgYnV0IHdpbGwgYWx3YXlzIG91dHB1dCB0aGUgc2FtZSBmb3JtYXQgYXMgaXQgaXMgZ2l2ZW4gaW4gaW5wdXQuCisgKgorICogSW4gdGhpcyB3YXksIGEgbGlzdCBvZiBwb3NzaWJsZSBpbnB1dCBmb3JtYXRzIGFuZCBhIGxpc3Qgb2YgcG9zc2libGUKKyAqIG91dHB1dCBmb3JtYXRzIGFyZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBsaW5rLiBXaGVuIGEgc2V0IG9mIGZvcm1hdHMgaXMKKyAqIG5lZ290aWF0ZWQgb3ZlciBhIGxpbmssIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGxpc3RzIGFyZSBtZXJnZWQgdG8gZm9ybSBhCisgKiBuZXcgbGlzdCBjb250YWluaW5nIG9ubHkgdGhlIGNvbW1vbiBlbGVtZW50cyBvZiBlYWNoIGxpc3QuIEluIHRoZSBjYXNlCisgKiB0aGF0IHRoZXJlIHdlcmUgbm8gY29tbW9uIGVsZW1lbnRzLCBhIGZvcm1hdCBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeS4KKyAqIE90aGVyd2lzZSwgdGhlIGxpc3RzIGFyZSBtZXJnZWQsIGFuZCBhbGwgb3RoZXIgbGlua3Mgd2hpY2ggcmVmZXJlbmNlCisgKiBlaXRoZXIgb2YgdGhlIGZvcm1hdCBsaXN0cyBpbnZvbHZlZCBpbiB0aGUgbWVyZ2UgYXJlIGFsc28gYWZmZWN0ZWQuCisgKgorICogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmaWx0ZXIgY2hhaW46CisgKiBmaWx0ZXIgKGEpIC0tPiAoYikgZmlsdGVyIChiKSAtLT4gKGMpIGZpbHRlcgorICoKKyAqIHdoZXJlIHRoZSBsZXR0ZXJzIGluIHBhcmVudGhlc2lzIGluZGljYXRlIGEgbGlzdCBvZiBmb3JtYXRzIHN1cHBvcnRlZCBvbgorICogdGhlIGlucHV0IG9yIG91dHB1dCBvZiB0aGUgbGluay4gU3VwcG9zZSB0aGUgbGlzdHMgYXJlIGFzIGZvbGxvd3M6CisgKiAoYSkgPSB7QSwgQn0KKyAqIChiKSA9IHtBLCBCLCBDfQorICogKGMpID0ge0IsIEN9CisgKgorICogRmlyc3QsIHRoZSBmaXJzdCBsaW5rJ3MgbGlzdHMgYXJlIG1lcmdlZCwgeWllbGRpbmc6CisgKiBmaWx0ZXIgKGEpIC0tPiAoYSkgZmlsdGVyIChhKSAtLT4gKGMpIGZpbHRlcgorICoKKyAqIE5vdGljZSB0aGF0IGZvcm1hdCBsaXN0IChiKSBub3cgcmVmZXJzIHRvIHRoZSBzYW1lIGxpc3QgYXMgZmlsdGVyIGxpc3QgKGEpLgorICogTmV4dCwgdGhlIGxpc3RzIGZvciB0aGUgc2Vjb25kIGxpbmsgYXJlIG1lcmdlZCwgeWllbGRpbmc6CisgKiBmaWx0ZXIgKGEpIC0tPiAoYSkgZmlsdGVyIChhKSAtLT4gKGEpIGZpbHRlcgorICoKKyAqIHdoZXJlIChhKSA9IHtCfS4KKyAqCisgKiBVbmZvcnR1bmF0ZWx5LCB3aGVuIHRoZSBmb3JtYXQgbGlzdHMgYXQgdGhlIHR3byBlbmRzIG9mIGEgbGluayBhcmUgbWVyZ2VkLAorICogd2UgbXVzdCBlbnN1cmUgdGhhdCBhbGwgbGlua3Mgd2hpY2ggcmVmZXJlbmNlIGVpdGhlciBwcmUtbWVyZ2UgZm9ybWF0IGxpc3QKKyAqIGdldCB1cGRhdGVkIGFzIHdlbGwuIFRoZXJlZm9yZSwgd2UgaGF2ZSB0aGUgZm9ybWF0IGxpc3Qgc3RydWN0dXJlIHN0b3JlIGEKKyAqIHBvaW50ZXIgdG8gZWFjaCBvZiB0aGUgcG9pbnRlcnMgdG8gaXRzZWxmLgorICovCitzdHJ1Y3QgQVZGaWx0ZXJGb3JtYXRzIHsKKyAgICB1bnNpZ25lZCBuYl9mb3JtYXRzOyAgICAgICAgLy8vPCBudW1iZXIgb2YgZm9ybWF0cworICAgIGludCAqZm9ybWF0czsgICAgICAgICAgICAgICAvLy88IGxpc3Qgb2YgbWVkaWEgZm9ybWF0cworCisgICAgdW5zaWduZWQgcmVmY291bnQ7ICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gdGhpcyBsaXN0CisgICAgc3RydWN0IEFWRmlsdGVyRm9ybWF0cyAqKipyZWZzOyAvLy88IHJlZmVyZW5jZXMgdG8gdGhpcyBsaXN0Cit9OworCisvKioKKyAqIEEgbGlzdCBvZiBzdXBwb3J0ZWQgY2hhbm5lbCBsYXlvdXRzLgorICoKKyAqIFRoZSBsaXN0IHdvcmtzIHRoZSBzYW1lIGFzIEFWRmlsdGVyRm9ybWF0cywgZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nCisgKiBkaWZmZXJlbmNlczoKKyAqIC0gQSBsaXN0IHdpdGggYWxsX2xheW91dHMgPSAxIG1lYW5zIGFsbCBjaGFubmVsIGxheW91dHMgd2l0aCBhIGtub3duCisgKiAgIGRpc3Bvc2l0aW9uOyBuYl9jaGFubmVsX2xheW91dHMgbXVzdCB0aGVuIGJlIDAuCisgKiAtIEEgbGlzdCB3aXRoIGFsbF9jb3VudHMgPSAxIG1lYW5zIGFsbCBjaGFubmVsIGNvdW50cywgd2l0aCBhIGtub3duIG9yCisgKiAgIHVua25vd24gZGlzcG9zaXRpb247IG5iX2NoYW5uZWxfbGF5b3V0cyBtdXN0IHRoZW4gYmUgMCBhbmQgYWxsX2xheW91dHMgMS4KKyAqIC0gVGhlIGxpc3QgbXVzdCBub3QgY29udGFpbiBhIGxheW91dCB3aXRoIGEga25vd24gZGlzcG9zaXRpb24gYW5kIGEKKyAqICAgY2hhbm5lbCBjb3VudCB3aXRoIHVua25vd24gZGlzcG9zaXRpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAqICAgKGUuZy4gQVZfQ0hfTEFZT1VUX1NURVJFTyBhbmQgRkZfQ09VTlQyTEFZT1VUKDIpLgorICovCit0eXBlZGVmIHN0cnVjdCBBVkZpbHRlckNoYW5uZWxMYXlvdXRzIHsKKyAgICB1aW50NjRfdCAqY2hhbm5lbF9sYXlvdXRzOyAgLy8vPCBsaXN0IG9mIGNoYW5uZWwgbGF5b3V0cworICAgIGludCAgICBuYl9jaGFubmVsX2xheW91dHM7ICAvLy88IG51bWJlciBvZiBjaGFubmVsIGxheW91dHMKKyAgICBjaGFyIGFsbF9sYXlvdXRzOyAgICAgICAgICAgLy8vPCBhY2NlcHQgYW55IGtub3duIGNoYW5uZWwgbGF5b3V0CisgICAgY2hhciBhbGxfY291bnRzOyAgICAgICAgICAgIC8vLzwgYWNjZXB0IGFueSBjaGFubmVsIGxheW91dCBvciBjb3VudAorCisgICAgdW5zaWduZWQgcmVmY291bnQ7ICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gdGhpcyBsaXN0CisgICAgc3RydWN0IEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKioqcmVmczsgLy8vPCByZWZlcmVuY2VzIHRvIHRoaXMgbGlzdAorfSBBVkZpbHRlckNoYW5uZWxMYXlvdXRzOworCisvKioKKyAqIEVuY29kZSBhIGNoYW5uZWwgY291bnQgYXMgYSBjaGFubmVsIGxheW91dC4KKyAqIEZGX0NPVU5UMkxBWU9VVChjKSBtZWFucyBhbnkgY2hhbm5lbCBsYXlvdXQgd2l0aCBjIGNoYW5uZWxzLCB3aXRoIGEga25vd24KKyAqIG9yIHVua25vd24gZGlzcG9zaXRpb24uCisgKiBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaW5zaWRlIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgYW5kIGltbWVkaWF0ZWx5CisgKiByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBGRl9DT1VOVDJMQVlPVVQoYykgKDB4ODAwMDAwMDAwMDAwMDAwMFVMTCB8IChjKSkKKworLyoqCisgKiBEZWNvZGUgYSBjaGFubmVsIGNvdW50IGVuY29kZWQgYXMgYSBjaGFubmVsIGxheW91dC4KKyAqIFJldHVybiAwIGlmIHRoZSBjaGFubmVsIGxheW91dCB3YXMgYSByZWFsIG9uZS4KKyAqLworI2RlZmluZSBGRl9MQVlPVVQyQ09VTlQobCkgKCgobCkgJiAweDgwMDAwMDAwMDAwMDAwMDBVTEwpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKGwpICYgMHg3RkZGRkZGRikgOiAwKQorCisvKioKKyAqIFJldHVybiBhIGNoYW5uZWwgbGF5b3V0cy9zYW1wbGVyYXRlcyBsaXN0IHdoaWNoIGNvbnRhaW5zIHRoZSBpbnRlcnNlY3Rpb24gb2YKKyAqIHRoZSBsYXlvdXRzL3NhbXBsZXJhdGVzIG9mIGEgYW5kIGIuIEFsc28sIGFsbCB0aGUgcmVmZXJlbmNlcyBvZiBhLCBhbGwgdGhlCisgKiByZWZlcmVuY2VzIG9mIGIsIGFuZCBhIGFuZCBiIHRoZW1zZWx2ZXMgd2lsbCBiZSBkZWFsbG9jYXRlZC4KKyAqCisgKiBJZiBhIGFuZCBiIGRvIG5vdCBzaGFyZSBhbnkgY29tbW9uIGVsZW1lbnRzLCBuZWl0aGVyIGlzIG1vZGlmaWVkLCBhbmQgTlVMTAorICogaXMgcmV0dXJuZWQuCisgKi8KK0FWRmlsdGVyQ2hhbm5lbExheW91dHMgKmZmX21lcmdlX2NoYW5uZWxfbGF5b3V0cyhBVkZpbHRlckNoYW5uZWxMYXlvdXRzICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmIpOworQVZGaWx0ZXJGb3JtYXRzICpmZl9tZXJnZV9zYW1wbGVyYXRlcyhBVkZpbHRlckZvcm1hdHMgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyRm9ybWF0cyAqYik7CisKKy8qKgorICogQ29uc3RydWN0IGFuIGVtcHR5IEFWRmlsdGVyQ2hhbm5lbExheW91dHMvQVZGaWx0ZXJGb3JtYXRzIHN0cnVjdCAtLQorICogcmVwcmVzZW50aW5nIGFueSBjaGFubmVsIGxheW91dCAod2l0aCBrbm93biBkaXNwb3NpdGlvbikvc2FtcGxlIHJhdGUuCisgKi8KK0FWRmlsdGVyQ2hhbm5lbExheW91dHMgKmZmX2FsbF9jaGFubmVsX2xheW91dHModm9pZCk7CitBVkZpbHRlckZvcm1hdHMgKmZmX2FsbF9zYW1wbGVyYXRlcyh2b2lkKTsKKworLyoqCisgKiBDb25zdHJ1Y3QgYW4gQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyBjb2RpbmcgZm9yIGFueSBjaGFubmVsIGxheW91dCwgd2l0aAorICoga25vd24gb3IgdW5rbm93biBkaXNwb3NpdGlvbi4KKyAqLworQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqZmZfYWxsX2NoYW5uZWxfY291bnRzKHZvaWQpOworCitBVkZpbHRlckNoYW5uZWxMYXlvdXRzICphdmZpbHRlcl9tYWtlX2Zvcm1hdDY0X2xpc3QoY29uc3QgaW50NjRfdCAqZm10cyk7CisKKworLyoqCisgKiBBIGhlbHBlciBmb3IgcXVlcnlfZm9ybWF0cygpIHdoaWNoIHNldHMgYWxsIGxpbmtzIHRvIHRoZSBzYW1lIGxpc3Qgb2YgY2hhbm5lbAorICogbGF5b3V0cy9zYW1wbGUgcmF0ZXMuIElmIHRoZXJlIGFyZSBubyBsaW5rcyBob29rZWQgdG8gdGhpcyBmaWx0ZXIsIHRoZSBsaXN0CisgKiBpcyBmcmVlZC4KKyAqLwordm9pZCBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0cyk7Cit2b2lkIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJGb3JtYXRzICpzYW1wbGVyYXRlcyk7CisKKy8qKgorICogQSBoZWxwZXIgZm9yIHF1ZXJ5X2Zvcm1hdHMoKSB3aGljaCBzZXRzIGFsbCBsaW5rcyB0byB0aGUgc2FtZSBsaXN0IG9mCisgKiBmb3JtYXRzLiBJZiB0aGVyZSBhcmUgbm8gbGlua3MgaG9va2VkIHRvIHRoaXMgZmlsdGVyLCB0aGUgbGlzdCBvZiBmb3JtYXRzIGlzCisgKiBmcmVlZC4KKyAqLwordm9pZCBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyk7CisKK2ludCBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqKmwsIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0KTsKKworLyoqCisgKiBBZGQgKnJlZiBhcyBhIG5ldyByZWZlcmVuY2UgdG8gZi4KKyAqLwordm9pZCBmZl9jaGFubmVsX2xheW91dHNfcmVmKEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqKnJlZik7CisKKy8qKgorICogUmVtb3ZlIGEgcmVmZXJlbmNlIHRvIGEgY2hhbm5lbCBsYXlvdXRzIGxpc3QuCisgKi8KK3ZvaWQgZmZfY2hhbm5lbF9sYXlvdXRzX3VucmVmKEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKipyZWYpOworCit2b2lkIGZmX2NoYW5uZWxfbGF5b3V0c19jaGFuZ2VyZWYoQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqKm9sZHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICoqbmV3cmVmKTsKKworaW50IGZmX2RlZmF1bHRfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCk7CisKKy8qKgorICogU2V0IHRoZSBmb3JtYXRzIGxpc3QgdG8gYWxsIGV4aXN0aW5nIGZvcm1hdHMuCisgKiBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgbGlrZSBmZl9kZWZhdWx0X3F1ZXJ5X2Zvcm1hdHMoKSwgZXhjZXB0IGl0IGFsc28KKyAqIGFjY2VwdHMgY2hhbm5lbCBsYXlvdXRzIHdpdGggdW5rbm93biBkaXNwb3NpdGlvbi4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZAorICogd2l0aCBhdWRpbyBmaWx0ZXJzLgorICovCitpbnQgZmZfcXVlcnlfZm9ybWF0c19hbGwoQVZGaWx0ZXJDb250ZXh0ICpjdHgpOworCisKKy8qKgorICogQ3JlYXRlIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cy4gVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIGluCisgKiBBVkZpbHRlci0+cXVlcnlfZm9ybWF0cygpLgorICoKKyAqIEBwYXJhbSBmbXRzIGxpc3Qgb2YgbWVkaWEgZm9ybWF0cywgdGVybWluYXRlZCBieSAtMQorICogQHJldHVybiB0aGUgZm9ybWF0IGxpc3QsIHdpdGggbm8gZXhpc3RpbmcgcmVmZXJlbmNlcworICovCitBVkZpbHRlckZvcm1hdHMgKmZmX21ha2VfZm9ybWF0X2xpc3QoY29uc3QgaW50ICpmbXRzKTsKKworLyoqCisgKiBBZGQgZm10IHRvIHRoZSBsaXN0IG9mIG1lZGlhIGZvcm1hdHMgY29udGFpbmVkIGluICphdmZmLgorICogSWYgKmF2ZmYgaXMgTlVMTCB0aGUgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBmaWx0ZXIgZm9ybWF0cyBzdHJ1Y3QKKyAqIGFuZCBwdXRzIGl0cyBwb2ludGVyIGluICphdmZmLgorICoKKyAqIEByZXR1cm4gYSBub24gbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlCisgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIEFWRVJST1IgY29kZSBpbiBjYXNlIG9mIGVycm9yCisgKi8KK2ludCBmZl9hZGRfZm9ybWF0KEFWRmlsdGVyRm9ybWF0cyAqKmF2ZmYsIGludDY0X3QgZm10KTsKKworLyoqCisgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBmb3JtYXRzIHN1cHBvcnRlZCBieSBGRm1wZWcgZm9yIHRoZSBnaXZlbiBtZWRpYSB0eXBlLgorICovCitBVkZpbHRlckZvcm1hdHMgKmZmX2FsbF9mb3JtYXRzKGVudW0gQVZNZWRpYVR5cGUgdHlwZSk7CisKKy8qKgorICogQ29uc3RydWN0IGEgZm9ybWF0cyBsaXN0IGNvbnRhaW5pbmcgYWxsIHBsYW5hciBzYW1wbGUgZm9ybWF0cy4KKyAqLworQVZGaWx0ZXJGb3JtYXRzICpmZl9wbGFuYXJfc2FtcGxlX2ZtdHModm9pZCk7CisKKy8qKgorICogUmV0dXJuIGEgZm9ybWF0IGxpc3Qgd2hpY2ggY29udGFpbnMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgZm9ybWF0cyBvZgorICogYSBhbmQgYi4gQWxzbywgYWxsIHRoZSByZWZlcmVuY2VzIG9mIGEsIGFsbCB0aGUgcmVmZXJlbmNlcyBvZiBiLCBhbmQKKyAqIGEgYW5kIGIgdGhlbXNlbHZlcyB3aWxsIGJlIGRlYWxsb2NhdGVkLgorICoKKyAqIElmIGEgYW5kIGIgZG8gbm90IHNoYXJlIGFueSBjb21tb24gZm9ybWF0cywgbmVpdGhlciBpcyBtb2RpZmllZCwgYW5kIE5VTEwKKyAqIGlzIHJldHVybmVkLgorICovCitBVkZpbHRlckZvcm1hdHMgKmZmX21lcmdlX2Zvcm1hdHMoQVZGaWx0ZXJGb3JtYXRzICphLCBBVkZpbHRlckZvcm1hdHMgKmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlKTsKKworLyoqCisgKiBBZGQgKnJlZiBhcyBhIG5ldyByZWZlcmVuY2UgdG8gZm9ybWF0cy4KKyAqIFRoYXQgaXMgdGhlIHBvaW50ZXJzIHdpbGwgcG9pbnQgbGlrZSBpbiB0aGUgYXNjaWkgYXJ0IGJlbG93OgorICogICBfX19fX19fXworICogIHxmb3JtYXRzIHw8LS0tLS0tLS0uCisgKiAgfCAgX19fXyAgfCAgICAgX19fX3xfX19fX19fX19fX19fX19fX19fCisgKiAgfCB8cmVmc3wgfCAgICB8ICBfX3xfCisgKiAgfCB8KiAqIHwgfCAgICB8IHwgIHwgfCAgQVZGaWx0ZXJMaW5rCisgKiAgfCB8KiAqLS0tLS0tLS0tPnwqcmVmfAorICogIHwgfF9fX198IHwgICAgfCB8X19fX3wKKyAqICB8X19fX19fX198ICAgIHxfX19fX19fX19fX19fX19fX19fX19fX18KKyAqLwordm9pZCBmZl9mb3JtYXRzX3JlZihBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMsIEFWRmlsdGVyRm9ybWF0cyAqKnJlZik7CisKKy8qKgorICogSWYgKnJlZiBpcyBub24tTlVMTCwgcmVtb3ZlICpyZWYgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGZvcm1hdCBsaXN0CisgKiBpdCBjdXJyZW50bHkgcG9pbnRzIHRvLCBkZWFsbG9jYXRlcyB0aGF0IGxpc3QgaWYgdGhpcyB3YXMgdGhlIGxhc3QKKyAqIHJlZmVyZW5jZSwgYW5kIHNldHMgKnJlZiB0byBOVUxMLgorICoKKyAqICAgICAgICAgQmVmb3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWZ0ZXIKKyAqICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX18gICAgICAgICBOVUxMCisgKiAgfGZvcm1hdHMgfDwtLS0tLS0tLS4gICAgICAgICAgICAgICAgICAgfGZvcm1hdHMgfCAgICAgICAgIF4KKyAqICB8ICBfX19fICB8ICAgICBfX19ffF9fX19fX19fX19fX19fX18gICB8ICBfX19fICB8ICAgICBfX19ffF9fX19fX19fX19fX19fX18KKyAqICB8IHxyZWZzfCB8ICAgIHwgIF9ffF8gICAgICAgICAgICAgICAgICB8IHxyZWZzfCB8ICAgIHwgIF9ffF8KKyAqICB8IHwqICogfCB8ICAgIHwgfCAgfCB8ICBBVkZpbHRlckxpbmsgICB8IHwqICogfCB8ICAgIHwgfCAgfCB8ICBBVkZpbHRlckxpbmsKKyAqICB8IHwqICotLS0tLS0tLS0+fCpyZWZ8ICAgICAgICAgICAgICAgICB8IHwqICAgfCB8ICAgIHwgfCpyZWZ8CisgKiAgfCB8X19fX3wgfCAgICB8IHxfX19ffCAgICAgICAgICAgICAgICAgfCB8X19fX3wgfCAgICB8IHxfX19ffAorICogIHxfX19fX19fX3wgICAgfF9fX19fX19fX19fX19fX19fX19fXyAgIHxfX19fX19fX3wgICAgfF9fX19fX19fX19fX19fX19fX19fXworICovCit2b2lkIGZmX2Zvcm1hdHNfdW5yZWYoQVZGaWx0ZXJGb3JtYXRzICoqcmVmKTsKKworLyoqCisgKgorICogICAgICAgICBCZWZvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZnRlcgorICogICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fXworICogIHxmb3JtYXRzIHw8LS0tLS0tLS0tLiAgICAgICAgICAgIHxmb3JtYXRzIHw8LS0tLS0tLS0tLgorICogIHwgIF9fX18gIHwgICAgICAgX19ffF9fXyAgICAgICAgIHwgIF9fX18gIHwgICAgICAgX19ffF9fXworICogIHwgfHJlZnN8IHwgICAgICB8ICAgfCAgIHwgICAgICAgIHwgfHJlZnN8IHwgICAgICB8ICAgfCAgIHwgICBOVUxMCisgKiAgfCB8KiAqLS0tLS0tLS0tPnwqb2xkcmVmfCAgICAgICAgfCB8KiAqLS0tLS0tLS0tPnwqbmV3cmVmfCAgICAgXgorICogIHwgfCogKiB8IHwgICAgICB8X19fX19fX3wgICAgICAgIHwgfCogKiB8IHwgICAgICB8X19fX19fX3wgIF9fX3xfX18KKyAqICB8IHxfX19ffCB8ICAgICAgICAgICAgICAgICAgICAgICB8IHxfX19ffCB8ICAgICAgICAgICAgICAgIHwgICB8ICAgfAorICogIHxfX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX3wgICAgICAgICAgICAgICAgfCpvbGRyZWZ8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX3wKKyAqLwordm9pZCBmZl9mb3JtYXRzX2NoYW5nZXJlZihBVkZpbHRlckZvcm1hdHMgKipvbGRyZWYsIEFWRmlsdGVyRm9ybWF0cyAqKm5ld3JlZik7CisKKyNlbmRpZiAvKiBBVkZJTFRFUl9GT1JNQVRTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9mcmFtZXN5bmMuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9mcmFtZXN5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmRiNTBjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2ZyYW1lc3luYy5jCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImJ1ZmZlcnF1ZXVlLmgiCisjaW5jbHVkZSAiZnJhbWVzeW5jLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBPRkZTRVQobWVtYmVyKSBvZmZzZXRvZihGRkZyYW1lU3luYywgbWVtYmVyKQorCitzdGF0aWMgY29uc3QgY2hhciAqZnJhbWVzeW5jX25hbWUodm9pZCAqcHRyKQoreworICAgIHJldHVybiAiZnJhbWVzeW5jIjsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZnJhbWVzeW5jX2NsYXNzID0geworICAgIC52ZXJzaW9uICAgICAgICAgICAgICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jbGFzc19uYW1lICAgICAgICAgICAgICAgID0gImZyYW1lc3luYyIsCisgICAgLml0ZW1fbmFtZSAgICAgICAgICAgICAgICAgPSBmcmFtZXN5bmNfbmFtZSwKKyAgICAuY2F0ZWdvcnkgICAgICAgICAgICAgICAgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0ZJTFRFUiwKKyAgICAub3B0aW9uICAgICAgICAgICAgICAgICAgICA9IE5VTEwsCisgICAgLnBhcmVudF9sb2dfY29udGV4dF9vZmZzZXQgPSBPRkZTRVQocGFyZW50KSwKK307CisKK2VudW0geworICAgIFNUQVRFX0JPRiwKKyAgICBTVEFURV9SVU4sCisgICAgU1RBVEVfRU9GLAorfTsKKwordm9pZCBmZl9mcmFtZXN5bmNfaW5pdChGRkZyYW1lU3luYyAqZnMsIHZvaWQgKnBhcmVudCwgdW5zaWduZWQgbmJfaW4pCit7CisgICAgZnMtPmNsYXNzICA9ICZmcmFtZXN5bmNfY2xhc3M7CisgICAgZnMtPnBhcmVudCA9IHBhcmVudDsKKyAgICBmcy0+bmJfaW4gID0gbmJfaW47Cit9CisKK3N0YXRpYyB2b2lkIGZyYW1lc3luY19zeW5jX2xldmVsX3VwZGF0ZShGRkZyYW1lU3luYyAqZnMpCit7CisgICAgdW5zaWduZWQgaSwgbGV2ZWwgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGZzLT5uYl9pbjsgaSsrKQorICAgICAgICBpZiAoZnMtPmluW2ldLnN0YXRlICE9IFNUQVRFX0VPRikKKyAgICAgICAgICAgIGxldmVsID0gRkZNQVgobGV2ZWwsIGZzLT5pbltpXS5zeW5jKTsKKyAgICBhdl9hc3NlcnQwKGxldmVsIDw9IGZzLT5zeW5jX2xldmVsKTsKKyAgICBpZiAobGV2ZWwgPCBmcy0+c3luY19sZXZlbCkKKyAgICAgICAgYXZfbG9nKGZzLCBBVl9MT0dfVkVSQk9TRSwgIlN5bmMgbGV2ZWwgJXVcbiIsIGxldmVsKTsKKyAgICBpZiAobGV2ZWwpCisgICAgICAgIGZzLT5zeW5jX2xldmVsID0gbGV2ZWw7CisgICAgZWxzZQorICAgICAgICBmcy0+ZW9mID0gMTsKK30KKworaW50IGZmX2ZyYW1lc3luY19jb25maWd1cmUoRkZGcmFtZVN5bmMgKmZzKQoreworICAgIHVuc2lnbmVkIGk7CisgICAgaW50NjRfdCBnY2QsIGxjbTsKKworICAgIGlmICghZnMtPnRpbWVfYmFzZS5udW0pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZzLT5uYl9pbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZnMtPmluW2ldLnN5bmMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZnMtPnRpbWVfYmFzZS5udW0pIHsKKyAgICAgICAgICAgICAgICAgICAgZ2NkID0gYXZfZ2NkKGZzLT50aW1lX2Jhc2UuZGVuLCBmcy0+aW5baV0udGltZV9iYXNlLmRlbik7CisgICAgICAgICAgICAgICAgICAgIGxjbSA9IChmcy0+dGltZV9iYXNlLmRlbiAvIGdjZCkgKiBmcy0+aW5baV0udGltZV9iYXNlLmRlbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxjbSA8IEFWX1RJTUVfQkFTRSAvIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZzLT50aW1lX2Jhc2UuZGVuID0gbGNtOworICAgICAgICAgICAgICAgICAgICAgICAgZnMtPnRpbWVfYmFzZS5udW0gPSBhdl9nY2QoZnMtPnRpbWVfYmFzZS5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy0+aW5baV0udGltZV9iYXNlLm51bSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcy0+dGltZV9iYXNlLm51bSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmcy0+dGltZV9iYXNlLmRlbiA9IEFWX1RJTUVfQkFTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnMtPnRpbWVfYmFzZSA9IGZzLT5pbltpXS50aW1lX2Jhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZnMtPnRpbWVfYmFzZS5udW0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhmcywgQVZfTE9HX0VSUk9SLCAiSW1wb3NzaWJsZSB0byBzZXQgdGltZSBiYXNlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKGZzLCBBVl9MT0dfVkVSQk9TRSwgIlNlbGVjdGVkICVkLyVkIHRpbWUgYmFzZVxuIiwKKyAgICAgICAgICAgICAgIGZzLT50aW1lX2Jhc2UubnVtLCBmcy0+dGltZV9iYXNlLmRlbik7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGZzLT5uYl9pbjsgaSsrKQorICAgICAgICBmcy0+aW5baV0ucHRzID0gZnMtPmluW2ldLnB0c19uZXh0ID0gQVZfTk9QVFNfVkFMVUU7CisgICAgZnMtPnN5bmNfbGV2ZWwgPSBVSU5UX01BWDsKKyAgICBmcmFtZXN5bmNfc3luY19sZXZlbF91cGRhdGUoZnMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyYW1lc3luY19hZHZhbmNlKEZGRnJhbWVTeW5jICpmcykKK3sKKyAgICBpbnQgbGF0ZXN0OworICAgIHVuc2lnbmVkIGk7CisgICAgaW50NjRfdCBwdHM7CisKKyAgICBpZiAoZnMtPmVvZikKKyAgICAgICAgcmV0dXJuOworICAgIHdoaWxlICghZnMtPmZyYW1lX3JlYWR5KSB7CisgICAgICAgIGxhdGVzdCA9IC0xOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnMtPm5iX2luOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghZnMtPmluW2ldLmhhdmVfbmV4dCkgeworICAgICAgICAgICAgICAgIGlmIChsYXRlc3QgPCAwIHx8IGZzLT5pbltpXS5wdHMgPCBmcy0+aW5bbGF0ZXN0XS5wdHMpCisgICAgICAgICAgICAgICAgICAgIGxhdGVzdCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxhdGVzdCA+PSAwKSB7CisgICAgICAgICAgICBmcy0+aW5fcmVxdWVzdCA9IGxhdGVzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcHRzID0gZnMtPmluWzBdLnB0c19uZXh0OworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZnMtPm5iX2luOyBpKyspCisgICAgICAgICAgICBpZiAoZnMtPmluW2ldLnB0c19uZXh0IDwgcHRzKQorICAgICAgICAgICAgICAgIHB0cyA9IGZzLT5pbltpXS5wdHNfbmV4dDsKKyAgICAgICAgaWYgKHB0cyA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIGZzLT5lb2YgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZzLT5uYl9pbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZnMtPmluW2ldLnB0c19uZXh0ID09IHB0cyB8fAorICAgICAgICAgICAgICAgIChmcy0+aW5baV0uYmVmb3JlID09IEVYVF9JTkZJTklUWSAmJgorICAgICAgICAgICAgICAgICBmcy0+aW5baV0uc3RhdGUgPT0gU1RBVEVfQk9GKSkgeworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZzLT5pbltpXS5mcmFtZSk7CisgICAgICAgICAgICAgICAgZnMtPmluW2ldLmZyYW1lICAgICAgPSBmcy0+aW5baV0uZnJhbWVfbmV4dDsKKyAgICAgICAgICAgICAgICBmcy0+aW5baV0ucHRzICAgICAgICA9IGZzLT5pbltpXS5wdHNfbmV4dDsKKyAgICAgICAgICAgICAgICBmcy0+aW5baV0uZnJhbWVfbmV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgZnMtPmluW2ldLnB0c19uZXh0ICAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgICAgICAgICBmcy0+aW5baV0uaGF2ZV9uZXh0ICA9IDA7CisgICAgICAgICAgICAgICAgZnMtPmluW2ldLnN0YXRlICAgICAgPSBmcy0+aW5baV0uZnJhbWUgPyBTVEFURV9SVU4gOiBTVEFURV9FT0Y7CisgICAgICAgICAgICAgICAgaWYgKGZzLT5pbltpXS5zeW5jID09IGZzLT5zeW5jX2xldmVsICYmIGZzLT5pbltpXS5mcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZnMtPmZyYW1lX3JlYWR5ID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoZnMtPmluW2ldLnN0YXRlID09IFNUQVRFX0VPRiAmJgorICAgICAgICAgICAgICAgICAgICBmcy0+aW5baV0uYWZ0ZXIgPT0gRVhUX1NUT1ApCisgICAgICAgICAgICAgICAgICAgIGZzLT5lb2YgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmcy0+ZW9mKQorICAgICAgICAgICAgZnMtPmZyYW1lX3JlYWR5ID0gMDsKKyAgICAgICAgaWYgKGZzLT5mcmFtZV9yZWFkeSkKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcy0+bmJfaW47IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoKGZzLT5pbltpXS5zdGF0ZSA9PSBTVEFURV9CT0YgJiYKKyAgICAgICAgICAgICAgICAgICAgIGZzLT5pbltpXS5iZWZvcmUgPT0gRVhUX1NUT1ApKQorICAgICAgICAgICAgICAgICAgICBmcy0+ZnJhbWVfcmVhZHkgPSAwOworICAgICAgICBmcy0+cHRzID0gcHRzOworICAgIH0KK30KKworc3RhdGljIGludDY0X3QgZnJhbWVzeW5jX3B0c19leHRyYXBvbGF0ZShGRkZyYW1lU3luYyAqZnMsIHVuc2lnbmVkIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cykKK3sKKyAgICAvKiBQb3NzaWJsZSBlbmhhbmNlbWVudDogdXNlIHRoZSBsaW5rJ3MgZnJhbWUgcmF0ZSAqLworICAgIHJldHVybiBwdHMgKyAxOworfQorCitzdGF0aWMgdm9pZCBmcmFtZXN5bmNfaW5qZWN0X2ZyYW1lKEZGRnJhbWVTeW5jICpmcywgdW5zaWduZWQgaW4sIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludDY0X3QgcHRzOworCisgICAgYXZfYXNzZXJ0MCghZnMtPmluW2luXS5oYXZlX25leHQpOworICAgIGlmIChmcmFtZSkgeworICAgICAgICBwdHMgPSBhdl9yZXNjYWxlX3EoZnJhbWUtPnB0cywgZnMtPmluW2luXS50aW1lX2Jhc2UsIGZzLT50aW1lX2Jhc2UpOworICAgICAgICBmcmFtZS0+cHRzID0gcHRzOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0cyA9IGZzLT5pbltpbl0uc3RhdGUgIT0gU1RBVEVfUlVOIHx8IGZzLT5pbltpbl0uYWZ0ZXIgPT0gRVhUX0lORklOSVRZCisgICAgICAgICAgICA/IElOVDY0X01BWCA6IGZyYW1lc3luY19wdHNfZXh0cmFwb2xhdGUoZnMsIGluLCBmcy0+aW5baW5dLnB0cyk7CisgICAgICAgIGZzLT5pbltpbl0uc3luYyA9IDA7CisgICAgICAgIGZyYW1lc3luY19zeW5jX2xldmVsX3VwZGF0ZShmcyk7CisgICAgfQorICAgIGZzLT5pbltpbl0uZnJhbWVfbmV4dCA9IGZyYW1lOworICAgIGZzLT5pbltpbl0ucHRzX25leHQgICA9IHB0czsKKyAgICBmcy0+aW5baW5dLmhhdmVfbmV4dCAgPSAxOworfQorCitpbnQgZmZfZnJhbWVzeW5jX2FkZF9mcmFtZShGRkZyYW1lU3luYyAqZnMsIHVuc2lnbmVkIGluLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBhdl9hc3NlcnQxKGluIDwgZnMtPm5iX2luKTsKKyAgICBpZiAoIWZzLT5pbltpbl0uaGF2ZV9uZXh0KQorICAgICAgICBmcmFtZXN5bmNfaW5qZWN0X2ZyYW1lKGZzLCBpbiwgZnJhbWUpOworICAgIGVsc2UKKyAgICAgICAgZmZfYnVmcXVldWVfYWRkKGZzLCAmZnMtPmluW2luXS5xdWV1ZSwgZnJhbWUpOworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX2ZyYW1lc3luY19uZXh0KEZGRnJhbWVTeW5jICpmcykKK3sKKyAgICB1bnNpZ25lZCBpOworCisgICAgYXZfYXNzZXJ0MCghZnMtPmZyYW1lX3JlYWR5KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnMtPm5iX2luOyBpKyspCisgICAgICAgIGlmICghZnMtPmluW2ldLmhhdmVfbmV4dCAmJiBmcy0+aW5baV0ucXVldWUuYXZhaWxhYmxlKQorICAgICAgICAgICAgZnJhbWVzeW5jX2luamVjdF9mcmFtZShmcywgaSwgZmZfYnVmcXVldWVfZ2V0KCZmcy0+aW5baV0ucXVldWUpKTsKKyAgICBmcy0+ZnJhbWVfcmVhZHkgPSAwOworICAgIGZyYW1lc3luY19hZHZhbmNlKGZzKTsKK30KKwordm9pZCBmZl9mcmFtZXN5bmNfZHJvcChGRkZyYW1lU3luYyAqZnMpCit7CisgICAgZnMtPmZyYW1lX3JlYWR5ID0gMDsKK30KKworaW50IGZmX2ZyYW1lc3luY19nZXRfZnJhbWUoRkZGcmFtZVN5bmMgKmZzLCB1bnNpZ25lZCBpbiwgQVZGcmFtZSAqKnJmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGdldCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICB1bnNpZ25lZCBuZWVkX2NvcHkgPSAwLCBpOworICAgIGludDY0X3QgcHRzX25leHQ7CisgICAgaW50IHJldDsKKworICAgIGlmICghZnMtPmluW2luXS5mcmFtZSkgeworICAgICAgICAqcmZyYW1lID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZyYW1lID0gZnMtPmluW2luXS5mcmFtZTsKKyAgICBpZiAoZ2V0KSB7CisgICAgICAgIC8qIEZpbmQgb3V0IGlmIHdlIG5lZWQgdG8gY29weSB0aGUgZnJhbWU6IGlzIHRoZXJlIGFub3RoZXIgc3luYworICAgICAgICAgICBzdHJlYW0sIGFuZCBkbyB3ZSBrbm93IGlmIGl0cyBjdXJyZW50IGZyYW1lIHdpbGwgb3V0bGFzdCB0aGlzIG9uZT8gKi8KKyAgICAgICAgcHRzX25leHQgPSBmcy0+aW5baW5dLmhhdmVfbmV4dCA/IGZzLT5pbltpbl0ucHRzX25leHQgOiBJTlQ2NF9NQVg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcy0+bmJfaW4gJiYgIW5lZWRfY29weTsgaSsrKQorICAgICAgICAgICAgaWYgKGkgIT0gaW4gJiYgZnMtPmluW2ldLnN5bmMgJiYKKyAgICAgICAgICAgICAgICAoIWZzLT5pbltpXS5oYXZlX25leHQgfHwgZnMtPmluW2ldLnB0c19uZXh0IDwgcHRzX25leHQpKQorICAgICAgICAgICAgICAgIG5lZWRfY29weSA9IDE7CisgICAgICAgIGlmIChuZWVkX2NvcHkpIHsKKyAgICAgICAgICAgIGlmICghKGZyYW1lID0gYXZfZnJhbWVfY2xvbmUoZnJhbWUpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKGZyYW1lKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcy0+aW5baW5dLmZyYW1lID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBmcy0+ZnJhbWVfcmVhZHkgPSAwOworICAgIH0KKyAgICAqcmZyYW1lID0gZnJhbWU7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfZnJhbWVzeW5jX3VuaW5pdChGRkZyYW1lU3luYyAqZnMpCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmcy0+bmJfaW47IGkrKykgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcy0+aW5baV0uZnJhbWUpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcy0+aW5baV0uZnJhbWVfbmV4dCk7CisgICAgICAgIGZmX2J1ZnF1ZXVlX2Rpc2NhcmRfYWxsKCZmcy0+aW5baV0ucXVldWUpOworICAgIH0KK30KKworaW50IGZmX2ZyYW1lc3luY19wcm9jZXNzX2ZyYW1lKEZGRnJhbWVTeW5jICpmcywgdW5zaWduZWQgYWxsKQoreworICAgIGludCByZXQsIGNvdW50ID0gMDsKKworICAgIGF2X2Fzc2VydDAoZnMtPm9uX2V2ZW50KTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBmZl9mcmFtZXN5bmNfbmV4dChmcyk7CisgICAgICAgIGlmIChmcy0+ZW9mIHx8ICFmcy0+ZnJhbWVfcmVhZHkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKChyZXQgPSBmcy0+b25fZXZlbnQoZnMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBmZl9mcmFtZXN5bmNfZHJvcChmcyk7CisgICAgICAgIGNvdW50Kys7CisgICAgICAgIGlmICghYWxsKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghY291bnQgJiYgZnMtPmVvZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIHJldHVybiBjb3VudDsKK30KKworaW50IGZmX2ZyYW1lc3luY19maWx0ZXJfZnJhbWUoRkZGcmFtZVN5bmMgKmZzLCBBVkZpbHRlckxpbmsgKmlubGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmluKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19wcm9jZXNzX2ZyYW1lKGZzLCAxKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICgocmV0ID0gZmZfZnJhbWVzeW5jX2FkZF9mcmFtZShmcywgRkZfSU5MSU5LX0lEWChpbmxpbmspLCBpbikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19wcm9jZXNzX2ZyYW1lKGZzLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfZnJhbWVzeW5jX3JlcXVlc3RfZnJhbWUoRkZGcmFtZVN5bmMgKmZzLCBBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgaW50IGlucHV0LCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19wcm9jZXNzX2ZyYW1lKGZzLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmIChyZXQgPiAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoZnMtPmVvZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIG91dGxpbmstPmZsYWdzIHw9IEZGX0xJTktfRkxBR19SRVFVRVNUX0xPT1A7CisgICAgaW5wdXQgPSBmcy0+aW5fcmVxdWVzdDsKKyAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzW2lucHV0XSk7CisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19hZGRfZnJhbWUoZnMsIGlucHV0LCBOVUxMKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfcHJvY2Vzc19mcmFtZShmcywgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IDA7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvZnJhbWVzeW5jLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvZnJhbWVzeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3Mjc4MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9mcmFtZXN5bmMuaApAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBOaWNvbGFzIEdlb3JnZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0ZSQU1FU1lOQ19ICisjZGVmaW5lIEFWRklMVEVSX0ZSQU1FU1lOQ19ICisKKyNpbmNsdWRlICJidWZmZXJxdWV1ZS5oIgorCisvKgorICogVE9ETworICogQ2FsbGJhY2stYmFzZWQgQVBJIHNpbWlsYXIgdG8gZHVhbGlucHV0LgorICogRXhwb3J0IGNvbnZlbmllbnQgb3B0aW9ucy4KKyAqLworCisvKioKKyAqIFRoaXMgQVBJIGlzIGludGVuZGVkIGFzIGEgaGVscGVyIGZvciBmaWx0ZXJzIHRoYXQgaGF2ZSBzZXZlcmFsIHZpZGVvCisgKiBpbnB1dCBhbmQgbmVlZCB0byBjb21iaW5lIHRoZW0gc29tZWhvdy4gSWYgdGhlIGlucHV0cyBoYXZlIGRpZmZlcmVudCBvcgorICogdmFyaWFibGUgZnJhbWUgcmF0ZSwgZ2V0dGluZyB0aGUgaW5wdXQgZnJhbWVzIHRvIG1hdGNoIHJlcXVpcmVzIGEgcmF0aGVyCisgKiBjb21wbGV4IGxvZ2ljIGFuZCBhIGZldyB1c2VyLXR1bmFibGUgb3B0aW9ucy4KKyAqCisgKiBJbiB0aGlzIEFQSSwgd2hlbiBhIHNldCBvZiBzeW5jaHJvbml6ZWQgaW5wdXQgZnJhbWVzIGlzIHJlYWR5IHRvIGJlCisgKiBwcm9jZXNlZCBpcyBjYWxsZWQgYSBmcmFtZSBldmVudC4gRnJhbWUgZXZlbnQgY2FuIGJlIGdlbmVyYXRlZCBpbgorICogcmVzcG9uc2UgdG8gaW5wdXQgZnJhbWVzIG9uIGFueSBvciBhbGwgaW5wdXRzIGFuZCB0aGUgaGFuZGxpbmcgb2YKKyAqIHNpdHVhdGlvbnMgd2hlcmUgc29tZSBzdHJlYW0gZXh0ZW5kIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9yIHRoZSBlbmQgb2YKKyAqIG90aGVycyBjYW4gYmUgY29uZmlndXJlZC4KKyAqCisgKiBUaGUgYmFzaWMgd29ya2luZyBvZiB0aGlzIEFQSSBpcyB0aGUgZm9sbG93aW5nOgorICoKKyAqIC0gV2hlbiBhIGZyYW1lIGlzIGF2YWlsYWJsZSBvbiBhbnkgaW5wdXQsIGFkZCBpdCB1c2luZworICogICBmZl9mcmFtZXN5bmNfYWRkX2ZyYW1lKCkuCisgKgorICogLSBXaGVuIGEgZnJhbWUgZXZlbnQgaXMgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkIChpLmUuIGFmdGVyIGFkZGluZyBhIGZyYW1lCisgKiAgIG9yIHdoZW4gcmVxdWVzdGVkIG9uIGlucHV0KToKKyAqICAgLSBjYWxsIGZmX2ZyYW1lc3luY19uZXh0KCk7CisgKiAgIC0gaWYgZnMtPmZyYW1lX3JlYWR5IGlzIHRydWUsIHByb2Nlc3MgdGhlIGZyYW1lczsKKyAqICAgLSBjYWxsIGZmX2ZyYW1lc3luY19kcm9wKCkuCisgKi8KKworLyoqCisgKiBTdHJlYW0gZXh0cmFwb2xhdGlvbiBtb2RlCisgKgorICogRGVzY3JpYmUgaG93IHRoZSBmcmFtZXMgb2YgYSBzdHJlYW0gYXJlIGV4dHJhcG9sYXRlZCBiZWZvcmUgdGhlIGZpcnN0IG9uZQorICogYW5kIGFmdGVyIEVPRiB0byBrZWVwIHN5bmMgd2l0aCBwb3NzaWJseSBsb25nZXIgb3RoZXIgc3RyZWFtcy4KKyAqLworZW51bSBGRkZyYW1lU3luY0V4dE1vZGUgeworCisgICAgLyoqCisgICAgICogQ29tcGxldGVseSBzdG9wIGFsbCBzdHJlYW1zIHdpdGggdGhpcyBvbmUuCisgICAgICovCisgICAgRVhUX1NUT1AsCisKKyAgICAvKioKKyAgICAgKiBJZ25vcmUgdGhpcyBzdHJlYW0gYW5kIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIG90aGVyIG9uZXMuCisgICAgICovCisgICAgRVhUX05VTEwsCisKKyAgICAvKioKKyAgICAgKiBFeHRlbmQgdGhlIGZyYW1lIHRvIGluZmluaXR5LgorICAgICAqLworICAgIEVYVF9JTkZJTklUWSwKK307CisKKy8qKgorICogSW5wdXQgc3RyZWFtIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBGRkZyYW1lU3luY0luIHsKKworICAgIC8qKgorICAgICAqIFF1ZXVlIG9mIGluY29taW5nIEFWRnJhbWUsIGFuZCBOVUxMIHRvIG1hcmsgRU9GCisgICAgICovCisgICAgc3RydWN0IEZGQnVmUXVldWUgcXVldWU7CisKKyAgICAvKioKKyAgICAgKiBFeHRyYXBvbGF0aW9uIG1vZGUgZm9yIHRpbWVzdGFtcHMgYmVmb3JlIHRoZSBmaXJzdCBmcmFtZQorICAgICAqLworICAgIGVudW0gRkZGcmFtZVN5bmNFeHRNb2RlIGJlZm9yZTsKKworICAgIC8qKgorICAgICAqIEV4dHJhcG9sYXRpb24gbW9kZSBmb3IgdGltZXN0YW1wcyBhZnRlciB0aGUgbGFzdCBmcmFtZQorICAgICAqLworICAgIGVudW0gRkZGcmFtZVN5bmNFeHRNb2RlIGFmdGVyOworCisgICAgLyoqCisgICAgICogVGltZSBiYXNlIGZvciB0aGUgaW5jb21pbmcgZnJhbWVzCisgICAgICovCisgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7CisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IGZyYW1lLCBtYXkgYmUgTlVMTCBiZWZvcmUgdGhlIGZpcnN0IG9uZSBvciBhZnRlciBFT0YKKyAgICAgKi8KKyAgICBBVkZyYW1lICpmcmFtZTsKKworICAgIC8qKgorICAgICAqIE5leHQgZnJhbWUsIGZvciBpbnRlcm5hbCB1c2UKKyAgICAgKi8KKyAgICBBVkZyYW1lICpmcmFtZV9uZXh0OworCisgICAgLyoqCisgICAgICogUFRTIG9mIHRoZSBjdXJyZW50IGZyYW1lCisgICAgICovCisgICAgaW50NjRfdCBwdHM7CisKKyAgICAvKioKKyAgICAgKiBQVFMgb2YgdGhlIG5leHQgZnJhbWUsIGZvciBpbnRlcm5hbCB1c2UKKyAgICAgKi8KKyAgICBpbnQ2NF90IHB0c19uZXh0OworCisgICAgLyoqCisgICAgICogQm9vbGVhbiBmbGFnZ2luZyB0aGUgbmV4dCBmcmFtZSwgZm9yIGludGVybmFsIHVzZQorICAgICAqLworICAgIHVpbnQ4X3QgaGF2ZV9uZXh0OworCisgICAgLyoqCisgICAgICogU3RhdGU6IGJlZm9yZSBmaXJzdCwgaW4gc3RyZWFtIG9yIGFmdGVyIEVPRiwgZm9yIGludGVybmFsIHVzZQorICAgICAqLworICAgIHVpbnQ4X3Qgc3RhdGU7CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6YXRpb24gbGV2ZWw6IGZyYW1lcyBvbiBpbnB1dCBhdCB0aGUgaGlnaGVzdCBzeW5jIGxldmVsIHdpbGwKKyAgICAgKiBnZW5lcmF0ZSBvdXRwdXQgZnJhbWUgZXZlbnRzLgorICAgICAqCisgICAgICogRm9yIGV4YW1wbGUsIGlmIGlucHV0cyAjMCBhbmQgIzEgaGF2ZSBzeW5jIGxldmVsIDIgYW5kIGlucHV0ICMyIGhhcworICAgICAqIHN5bmMgbGV2ZWwgMSwgdGhlbiBhIGZyYW1lIG9uIGVpdGhlciBpbnB1dCAjMCBvciAjMSB3aWxsIGdlbmVyYXRlIGEKKyAgICAgKiBmcmFtZSBldmVudCwgYnV0IG5vdCBhIGZyYW1lIG9uIGlucHV0ICMyIHVudGlsIGJvdGggaW5wdXRzICMwIGFuZCAjMQorICAgICAqIGhhdmUgcmVhY2hlZCBFT0YuCisgICAgICoKKyAgICAgKiBJZiBzeW5jIGlzIDAsIG5vIGZyYW1lIGV2ZW50IHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgICAqLworICAgIHVuc2lnbmVkIHN5bmM7CisKK30gRkZGcmFtZVN5bmNJbjsKKworLyoqCisgKiBGcmFtZSBzeW5jIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRkZGcmFtZVN5bmMgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIHZvaWQgKnBhcmVudDsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBpbnB1dCBzdHJlYW1zCisgICAgICovCisgICAgdW5zaWduZWQgbmJfaW47CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGJhc2UgZm9yIHRoZSBvdXRwdXQgZXZlbnRzCisgICAgICovCisgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7CisKKyAgICAvKioKKyAgICAgKiBUaW1lc3RhbXAgb2YgdGhlIGN1cnJlbnQgZXZlbnQKKyAgICAgKi8KKyAgICBpbnQ2NF90IHB0czsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIGEgZnJhbWUgZXZlbnQgaXMgcmVhZHkKKyAgICAgKi8KKyAgICBpbnQgKCpvbl9ldmVudCkoc3RydWN0IEZGRnJhbWVTeW5jICpmcyk7CisKKyAgICAvKioKKyAgICAgKiBPcGFxdWUgcG9pbnRlciwgbm90IHVzZWQgYnkgdGhlIEFQSQorICAgICAqLworICAgIHZvaWQgKm9wYXF1ZTsKKworICAgIC8qKgorICAgICAqIEluZGV4IG9mIHRoZSBpbnB1dCB0aGF0IHJlcXVpcmVzIGEgcmVxdWVzdAorICAgICAqLworICAgIHVuc2lnbmVkIGluX3JlcXVlc3Q7CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6YXRpb24gbGV2ZWw6IG9ubHkgaW5wdXRzIHdpdGggdGhlIHNhbWUgc3luYyBsZXZlbCBhcmUgc3luYworICAgICAqIHNvdXJjZXMuCisgICAgICovCisgICAgdW5zaWduZWQgc3luY19sZXZlbDsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IGEgZnJhbWUgZXZlbnQgaXMgcmVhZHkKKyAgICAgKi8KKyAgICB1aW50OF90IGZyYW1lX3JlYWR5OworCisgICAgLyoqCisgICAgICogRmxhZyBpbmRpY2F0aW5nIHRoYXQgb3V0cHV0IGhhcyByZWFjaGVkIEVPRi4KKyAgICAgKi8KKyAgICB1aW50OF90IGVvZjsKKworICAgIC8qKgorICAgICAqIEFycmF5IG9mIGlucHV0czsgYWxsIGlucHV0cyBtdXN0IGJlIGluIGNvbnNlY3V0aXZlIG1lbW9yeQorICAgICAqLworICAgIEZGRnJhbWVTeW5jSW4gaW5bMV07IC8qIG11c3QgYmUgdGhlIGxhc3QgZmllbGQgKi8KKworfSBGRkZyYW1lU3luYzsKKworLyoqCisgKiBJbml0aWFsaXplIGEgZnJhbWUgc3luYyBzdHJ1Y3R1cmUuCisgKgorICogVGhlIGVudGlyZSBzdHJ1Y3R1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgYWxyZWFkeSBzZXQgdG8gMC4KKyAqCisgKiBAcGFyYW0gIGZzICAgICAgZnJhbWUgc3luYyBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZQorICogQHBhcmFtICBwYXJlbnQgIHBhcmVudCBvYmplY3QsIHVzZWQgZm9yIGxvZ2dpbmcKKyAqIEBwYXJhbSAgbmJfaW4gICBudW1iZXIgb2YgaW5wdXRzCisgKi8KK3ZvaWQgZmZfZnJhbWVzeW5jX2luaXQoRkZGcmFtZVN5bmMgKmZzLCB2b2lkICpwYXJlbnQsIHVuc2lnbmVkIG5iX2luKTsKKworLyoqCisgKiBDb25maWd1cmUgYSBmcmFtZSBzeW5jIHN0cnVjdHVyZS4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgb3B0aW9ucyBhcmUgc2V0IGJ1dCBiZWZvcmUgYWxsIHVzZS4KKyAqCisgKiBAcmV0dXJuICA+PSAwIGZvciBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitpbnQgZmZfZnJhbWVzeW5jX2NvbmZpZ3VyZShGRkZyYW1lU3luYyAqZnMpOworCisvKioKKyAqIEZyZWUgYWxsIG1lbW9yeSBjdXJyZW50bHkgYWxsb2NhdGVkLgorICovCit2b2lkIGZmX2ZyYW1lc3luY191bmluaXQoRkZGcmFtZVN5bmMgKmZzKTsKKworLyoqCisgKiBBZGQgYSBmcmFtZSB0byBhbiBpbnB1dAorICoKKyAqIFR5cGljYWxseSBjYWxsZWQgZnJvbSB0aGUgZmlsdGVyX2ZyYW1lKCkgbWV0aG9kLgorICoKKyAqIEBwYXJhbSBmcyAgICAgZnJhbWUgc3luYyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBpbiAgICAgaW5kZXggb2YgdGhlIGlucHV0CisgKiBAcGFyYW0gZnJhbWUgIGlucHV0IGZyYW1lLCBvciBOVUxMIGZvciBFT0YKKyAqLworaW50IGZmX2ZyYW1lc3luY19hZGRfZnJhbWUoRkZGcmFtZVN5bmMgKmZzLCB1bnNpZ25lZCBpbiwgQVZGcmFtZSAqZnJhbWUpOworCisvKioKKyAqIFByZXBhcmUgdGhlIG5leHQgZnJhbWUgZXZlbnQuCisgKgorICogVGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uIGNhbiBiZSBmb3VuZCBpbiBmcy0+ZnJhbWVfcmVhZHkgYW5kIGZzLT5lb2YuCisgKi8KK3ZvaWQgZmZfZnJhbWVzeW5jX25leHQoRkZGcmFtZVN5bmMgKmZzKTsKKworLyoqCisgKiBEcm9wIHRoZSBjdXJyZW50IGZyYW1lIGV2ZW50LgorICovCit2b2lkIGZmX2ZyYW1lc3luY19kcm9wKEZGRnJhbWVTeW5jICpmcyk7CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IGZyYW1lIGluIGFuIGlucHV0LgorICoKKyAqIEBwYXJhbSBmcyAgICAgIGZyYW1lIHN5bmMgc3RydWN0dXJlCisgKiBAcGFyYW0gaW4gICAgICBpbmRleCBvZiB0aGUgaW5wdXQKKyAqIEBwYXJhbSByZnJhbWUgIHVzZWQgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGZyYW1lIChvciBOVUxMKQorICogQHBhcmFtIGdldCAgICAgaWYgbm90IHplcm8sIHRoZSBjYWxsaW5nIGNvZGUgbmVlZHMgdG8gZ2V0IG93bmVyc2hpcCBvZgorICogICAgICAgICAgICAgICAgdGhlIHJldHVybmVkIGZyYW1lOyB0aGUgY3VycmVudCBmcmFtZSB3aWxsIGVpdGhlciBiZQorICogICAgICAgICAgICAgICAgZHVwbGljYXRlZCBvciByZW1vdmVkIGZyb20gdGhlIGZyYW1lc3luYyBzdHJ1Y3R1cmUKKyAqLworaW50IGZmX2ZyYW1lc3luY19nZXRfZnJhbWUoRkZGcmFtZVN5bmMgKmZzLCB1bnNpZ25lZCBpbiwgQVZGcmFtZSAqKnJmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGdldCk7CisKKy8qKgorICogUHJvY2VzcyBvbmUgb3Igc2V2ZXJhbCBmcmFtZSB1c2luZyB0aGUgb25fZXZlbnQgY2FsbGJhY2suCisgKgorICogQHJldHVybiAgbnVtYmVyIG9mIGZyYW1lcyBwcm9jZXNzZWQgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitpbnQgZmZfZnJhbWVzeW5jX3Byb2Nlc3NfZnJhbWUoRkZGcmFtZVN5bmMgKmZzLCB1bnNpZ25lZCBhbGwpOworCisKKy8qKgorICogQWNjZXB0IGEgZnJhbWUgb24gYSBmaWx0ZXIgaW5wdXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIGFsbCBmaWx0ZXJfZnJhbWUKKyAqIG1ldGhvZHMgb2YgYSBmaWx0ZXIgdXNpbmcgZnJhbWVzeW5jLgorICovCitpbnQgZmZfZnJhbWVzeW5jX2ZpbHRlcl9mcmFtZShGRkZyYW1lU3luYyAqZnMsIEFWRmlsdGVyTGluayAqaW5saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqaW4pOworCisvKioKKyAqIFJlcXVlc3QgYSBmcmFtZSBvbiB0aGUgZmlsdGVyIG91dHB1dC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgYWxsIGZpbHRlcl9mcmFtZQorICogbWV0aG9kcyBvZiBhIGZpbHRlciB1c2luZyBmcmFtZXN5bmMgaWYgaXQgaGFzIG9ubHkgb25lIG91dHB1dC4KKyAqLworaW50IGZmX2ZyYW1lc3luY19yZXF1ZXN0X2ZyYW1lKEZGRnJhbWVTeW5jICpmcywgQVZGaWx0ZXJMaW5rICpvdXRsaW5rKTsKKworI2VuZGlmIC8qIEFWRklMVEVSX0ZSQU1FU1lOQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvZ2VuZXJhdGVfd2F2ZV90YWJsZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2dlbmVyYXRlX3dhdmVfdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWU5YzAwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2dlbmVyYXRlX3dhdmVfdGFibGUuYwpAQCAtMCwwICsxLDg0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImdlbmVyYXRlX3dhdmVfdGFibGUuaCIKKwordm9pZCBmZl9nZW5lcmF0ZV93YXZlX3RhYmxlKGVudW0gV2F2ZVR5cGUgd2F2ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0YWJsZSwgaW50IHRhYmxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbiwgZG91YmxlIG1heCwgZG91YmxlIHBoYXNlKQoreworICAgIHVpbnQzMl90IGksIHBoYXNlX29mZnNldCA9IHBoYXNlIC8gTV9QSSAvIDIgKiB0YWJsZV9zaXplICsgMC41OworCisgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlX3NpemU7IGkrKykgeworICAgICAgICB1aW50MzJfdCBwb2ludCA9IChpICsgcGhhc2Vfb2Zmc2V0KSAlIHRhYmxlX3NpemU7CisgICAgICAgIGRvdWJsZSBkOworCisgICAgICAgIHN3aXRjaCAod2F2ZV90eXBlKSB7CisgICAgICAgIGNhc2UgV0FWRV9TSU46CisgICAgICAgICAgICBkID0gKHNpbigoZG91YmxlKXBvaW50IC8gdGFibGVfc2l6ZSAqIDIgKiBNX1BJKSArIDEpIC8gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdBVkVfVFJJOgorICAgICAgICAgICAgZCA9IChkb3VibGUpcG9pbnQgKiAyIC8gdGFibGVfc2l6ZTsKKyAgICAgICAgICAgIHN3aXRjaCAoNCAqIHBvaW50IC8gdGFibGVfc2l6ZSkgeworICAgICAgICAgICAgY2FzZSAwOiBkID0gZCArIDAuNTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjYXNlIDI6IGQgPSAxLjUgLSBkOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogZCA9IGQgLSAxLjU7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICB9CisKKyAgICAgICAgZCAgPSBkICogKG1heCAtIG1pbikgKyBtaW47CisgICAgICAgIHN3aXRjaCAoc2FtcGxlX2ZtdCkgeworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUOiB7CisgICAgICAgICAgICBmbG9hdCAqZnAgPSAoZmxvYXQgKil0YWJsZTsKKyAgICAgICAgICAgICpmcCsrID0gKGZsb2F0KWQ7CisgICAgICAgICAgICB0YWJsZSA9IGZwOworICAgICAgICAgICAgY29udGludWU7IH0KKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTDogeworICAgICAgICAgICAgZG91YmxlICpkcCA9IChkb3VibGUgKil0YWJsZTsKKyAgICAgICAgICAgICpkcCsrID0gZDsKKyAgICAgICAgICAgIHRhYmxlID0gZHA7CisgICAgICAgICAgICBjb250aW51ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgZCArPSBkIDwgMCA/IC0wLjUgOiAwLjU7CisgICAgICAgIHN3aXRjaCAoc2FtcGxlX2ZtdCkgeworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2OiB7CisgICAgICAgICAgICBpbnQxNl90ICpzcCA9IHRhYmxlOworICAgICAgICAgICAgKnNwKysgPSAoaW50MTZfdClkOworICAgICAgICAgICAgdGFibGUgPSBzcDsKKyAgICAgICAgICAgIGNvbnRpbnVlOyB9CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzI6IHsKKyAgICAgICAgICAgIGludDMyX3QgKmlwID0gdGFibGU7CisgICAgICAgICAgICAqaXArKyA9IChpbnQzMl90KWQ7CisgICAgICAgICAgICB0YWJsZSA9IGlwOworICAgICAgICAgICAgY29udGludWU7IH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2dlbmVyYXRlX3dhdmVfdGFibGUuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9nZW5lcmF0ZV93YXZlX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlYTJhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9nZW5lcmF0ZV93YXZlX3RhYmxlLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0dFTkVSQVRFX1dBVkVfVEFCTEVfSAorI2RlZmluZSBBVkZJTFRFUl9HRU5FUkFURV9XQVZFX1RBQkxFX0gKKworZW51bSBXYXZlVHlwZSB7CisgICAgV0FWRV9TSU4sCisgICAgV0FWRV9UUkksCisgICAgV0FWRV9OQiwKK307CisKK3ZvaWQgZmZfZ2VuZXJhdGVfd2F2ZV90YWJsZShlbnVtIFdhdmVUeXBlIHdhdmVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdGFibGUsIGludCB0YWJsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgsIGRvdWJsZSBwaGFzZSk7CisKKyNlbmRpZiAvKiBBVkZJTFRFUl9HRU5FUkFURV9XQVZFX1RBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9ncmFkZnVuLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvZ3JhZGZ1bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMWYxZWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZ3JhZGZ1bi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTm9sYW4gTHVtIDxub2w4ODhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA5IExvcmVuIE1lcnJpdHQgPGxvcmVubUB1Lndhc2hpbmd0b24uZWR1PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0dSQURGVU5fSAorI2RlZmluZSBBVkZJTFRFUl9HUkFERlVOX0gKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisKKy8vLyBIb2xkcyBpbnN0YW5jZS1zcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgZ3JhZGZ1bi4KK3R5cGVkZWYgc3RydWN0IEdyYWRGdW5Db250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBmbG9hdCBzdHJlbmd0aDsKKyAgICBpbnQgdGhyZXNoOyAgICAvLy88IHRocmVzaG9sZCBmb3IgZ3JhZGllbnQgYWxnb3JpdGhtCisgICAgaW50IHJhZGl1czsgICAgLy8vPCBibHVyIHJhZGl1cworICAgIGludCBjaHJvbWFfdzsgIC8vLzwgd2lkdGggb2YgdGhlIGNocm9tYSBwbGFuZXMKKyAgICBpbnQgY2hyb21hX2g7ICAvLy88IHdlaWdodCBvZiB0aGUgY2hyb21hIHBsYW5lcworICAgIGludCBjaHJvbWFfcjsgIC8vLzwgYmx1ciByYWRpdXMgZm9yIHRoZSBjaHJvbWEgcGxhbmVzCisgICAgdWludDE2X3QgKmJ1ZjsgLy8vPCBob2xkcyBpbWFnZSBkYXRhIGZvciBibHVyIGFsZ29yaXRobSBwYXNzZWQgaW50byBmaWx0ZXIuCisgICAgLy8vIERTUCBmdW5jdGlvbnMuCisgICAgdm9pZCAoKmZpbHRlcl9saW5lKSAodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQxNl90ICpkYywgaW50IHdpZHRoLCBpbnQgdGhyZXNoLCBjb25zdCB1aW50MTZfdCAqZGl0aGVycyk7CisgICAgdm9pZCAoKmJsdXJfbGluZSkgKHVpbnQxNl90ICpkYywgdWludDE2X3QgKmJ1ZiwgY29uc3QgdWludDE2X3QgKmJ1ZjEsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19saW5lc2l6ZSwgaW50IHdpZHRoKTsKK30gR3JhZEZ1bkNvbnRleHQ7CisKK3ZvaWQgZmZfZ3JhZGZ1bl9pbml0X3g4NihHcmFkRnVuQ29udGV4dCAqZ2YpOworCit2b2lkIGZmX2dyYWRmdW5fZmlsdGVyX2xpbmVfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDE2X3QgKmRjLCBpbnQgd2lkdGgsIGludCB0aHJlc2gsIGNvbnN0IHVpbnQxNl90ICpkaXRoZXJzKTsKK3ZvaWQgZmZfZ3JhZGZ1bl9ibHVyX2xpbmVfYyh1aW50MTZfdCAqZGMsIHVpbnQxNl90ICpidWYsIGNvbnN0IHVpbnQxNl90ICpidWYxLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGluZXNpemUsIGludCB3aWR0aCk7CisKKyNlbmRpZiAvKiBBVkZJTFRFUl9HUkFERlVOX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9ncmFwaGR1bXAuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9ncmFwaGR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDcwMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2dyYXBoZHVtcC5jCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogRmlsdGVyIGdyYXBocyB0byBiYWQgQVNDSUktYXJ0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJhdmZpbHRlcmdyYXBoLmgiCisKK3N0YXRpYyBpbnQgcHJpbnRfbGlua19wcm9wKEFWQlByaW50ICpidWYsIEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBjaGFyICpmb3JtYXQ7CisgICAgY2hhciBsYXlvdXRbNjRdOworICAgIEFWQlByaW50IGR1bW15X2J1ZmZlciA9IHsgMCB9OworCisgICAgaWYgKCFidWYpCisgICAgICAgIGJ1ZiA9ICZkdW1teV9idWZmZXI7CisgICAgc3dpdGNoIChsaW5rLT50eXBlKSB7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgZm9ybWF0ID0gYXZfeF9pZl9udWxsKGF2X2dldF9waXhfZm10X25hbWUobGluay0+Zm9ybWF0KSwgIj8iKTsKKyAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiWyVkeCVkICVkOiVkICVzXSIsIGxpbmstPncsIGxpbmstPmgsCisgICAgICAgICAgICAgICAgICAgIGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgICBsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhsYXlvdXQsIHNpemVvZihsYXlvdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5jaGFubmVscywgbGluay0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICAgICAgZm9ybWF0ID0gYXZfeF9pZl9udWxsKGF2X2dldF9zYW1wbGVfZm10X25hbWUobGluay0+Zm9ybWF0KSwgIj8iKTsKKyAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiWyVkSHogJXM6JXNdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludClsaW5rLT5zYW1wbGVfcmF0ZSwgZm9ybWF0LCBsYXlvdXQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiPyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBidWYtPmxlbjsKK30KKworc3RhdGljIHZvaWQgYXZmaWx0ZXJfZ3JhcGhfZHVtcF90b19idWYoQVZCUHJpbnQgKmJ1ZiwgQVZGaWx0ZXJHcmFwaCAqZ3JhcGgpCit7CisgICAgdW5zaWduZWQgaSwgaiwgeCwgZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBncmFwaC0+bmJfZmlsdGVyczsgaSsrKSB7CisgICAgICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyID0gZ3JhcGgtPmZpbHRlcnNbaV07CisgICAgICAgIHVuc2lnbmVkIG1heF9zcmNfbmFtZSA9IDAsIG1heF9kc3RfbmFtZSA9IDA7CisgICAgICAgIHVuc2lnbmVkIG1heF9pbl9uYW1lICA9IDAsIG1heF9vdXRfbmFtZSA9IDA7CisgICAgICAgIHVuc2lnbmVkIG1heF9pbl9mbXQgICA9IDAsIG1heF9vdXRfZm10ICA9IDA7CisgICAgICAgIHVuc2lnbmVkIHdpZHRoLCBoZWlnaHQsIGluX2luZGVudDsKKyAgICAgICAgdW5zaWduZWQgbG5hbWUgPSBzdHJsZW4oZmlsdGVyLT5uYW1lKTsKKyAgICAgICAgdW5zaWduZWQgbHR5cGUgPSBzdHJsZW4oZmlsdGVyLT5maWx0ZXItPm5hbWUpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmaWx0ZXItPm5iX2lucHV0czsgaisrKSB7CisgICAgICAgICAgICBBVkZpbHRlckxpbmsgKmwgPSBmaWx0ZXItPmlucHV0c1tqXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxuID0gc3RybGVuKGwtPnNyYy0+bmFtZSkgKyAxICsgc3RybGVuKGwtPnNyY3BhZC0+bmFtZSk7CisgICAgICAgICAgICBtYXhfc3JjX25hbWUgPSBGRk1BWChtYXhfc3JjX25hbWUsIGxuKTsKKyAgICAgICAgICAgIG1heF9pbl9uYW1lID0gRkZNQVgobWF4X2luX25hbWUsIHN0cmxlbihsLT5kc3RwYWQtPm5hbWUpKTsKKyAgICAgICAgICAgIG1heF9pbl9mbXQgPSBGRk1BWChtYXhfaW5fZm10LCBwcmludF9saW5rX3Byb3AoTlVMTCwgbCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmaWx0ZXItPm5iX291dHB1dHM7IGorKykgeworICAgICAgICAgICAgQVZGaWx0ZXJMaW5rICpsID0gZmlsdGVyLT5vdXRwdXRzW2pdOworICAgICAgICAgICAgdW5zaWduZWQgbG4gPSBzdHJsZW4obC0+ZHN0LT5uYW1lKSArIDEgKyBzdHJsZW4obC0+ZHN0cGFkLT5uYW1lKTsKKyAgICAgICAgICAgIG1heF9kc3RfbmFtZSA9IEZGTUFYKG1heF9kc3RfbmFtZSwgbG4pOworICAgICAgICAgICAgbWF4X291dF9uYW1lID0gRkZNQVgobWF4X291dF9uYW1lLCBzdHJsZW4obC0+c3JjcGFkLT5uYW1lKSk7CisgICAgICAgICAgICBtYXhfb3V0X2ZtdCA9IEZGTUFYKG1heF9vdXRfZm10LCBwcmludF9saW5rX3Byb3AoTlVMTCwgbCkpOworICAgICAgICB9CisgICAgICAgIGluX2luZGVudCA9IG1heF9zcmNfbmFtZSArIG1heF9pbl9uYW1lICsgbWF4X2luX2ZtdDsKKyAgICAgICAgaW5faW5kZW50ICs9IGluX2luZGVudCA/IDQgOiAwOworICAgICAgICB3aWR0aCA9IEZGTUFYKGxuYW1lICsgMiwgbHR5cGUgKyA0KTsKKyAgICAgICAgaGVpZ2h0ID0gRkZNQVgzKDIsIGZpbHRlci0+bmJfaW5wdXRzLCBmaWx0ZXItPm5iX291dHB1dHMpOworICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnVmLCAnICcsIGluX2luZGVudCk7CisgICAgICAgIGF2X2JwcmludGYoYnVmLCAiKyIpOworICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnVmLCAnLScsIHdpZHRoKTsKKyAgICAgICAgYXZfYnByaW50ZihidWYsICIrXG4iKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbl9ubyAgPSBqIC0gKGhlaWdodCAtIGZpbHRlci0+bmJfaW5wdXRzICkgLyAyOworICAgICAgICAgICAgdW5zaWduZWQgb3V0X25vID0gaiAtIChoZWlnaHQgLSBmaWx0ZXItPm5iX291dHB1dHMpIC8gMjsKKworICAgICAgICAgICAgLyogSW5wdXQgbGluayAqLworICAgICAgICAgICAgaWYgKGluX25vIDwgZmlsdGVyLT5uYl9pbnB1dHMpIHsKKyAgICAgICAgICAgICAgICBBVkZpbHRlckxpbmsgKmwgPSBmaWx0ZXItPmlucHV0c1tpbl9ub107CisgICAgICAgICAgICAgICAgZSA9IGJ1Zi0+bGVuICsgbWF4X3NyY19uYW1lICsgMjsKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIiVzOiVzIiwgbC0+c3JjLT5uYW1lLCBsLT5zcmNwYWQtPm5hbWUpOworICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhidWYsICctJywgZSAtIGJ1Zi0+bGVuKTsKKyAgICAgICAgICAgICAgICBlID0gYnVmLT5sZW4gKyBtYXhfaW5fZm10ICsgMiArCisgICAgICAgICAgICAgICAgICAgIG1heF9pbl9uYW1lIC0gc3RybGVuKGwtPmRzdHBhZC0+bmFtZSk7CisgICAgICAgICAgICAgICAgcHJpbnRfbGlua19wcm9wKGJ1ZiwgbCk7CisgICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGJ1ZiwgJy0nLCBlIC0gYnVmLT5sZW4pOworICAgICAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiJXMiLCBsLT5kc3RwYWQtPm5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnVmLCAnICcsIGluX2luZGVudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEZpbHRlciAqLworICAgICAgICAgICAgYXZfYnByaW50ZihidWYsICJ8Iik7CisgICAgICAgICAgICBpZiAoaiA9PSAoaGVpZ2h0IC0gMikgLyAyKSB7CisgICAgICAgICAgICAgICAgeCA9ICh3aWR0aCAtIGxuYW1lKSAvIDI7CisgICAgICAgICAgICAgICAgYXZfYnByaW50ZihidWYsICIlKnMlLSpzIiwgeCwgIiIsIHdpZHRoIC0geCwgZmlsdGVyLT5uYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaiA9PSAoaGVpZ2h0IC0gMikgLyAyICsgMSkgeworICAgICAgICAgICAgICAgIHggPSAod2lkdGggLSBsdHlwZSAtIDIpIC8gMjsKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIiUqcyglcyklKnMiLCB4LCAiIiwgZmlsdGVyLT5maWx0ZXItPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAtIGx0eXBlIC0gMiAtIHgsICIiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGJ1ZiwgJyAnLCB3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgInwiKTsKKworICAgICAgICAgICAgLyogT3V0cHV0IGxpbmsgKi8KKyAgICAgICAgICAgIGlmIChvdXRfbm8gPCBmaWx0ZXItPm5iX291dHB1dHMpIHsKKyAgICAgICAgICAgICAgICBBVkZpbHRlckxpbmsgKmwgPSBmaWx0ZXItPm91dHB1dHNbb3V0X25vXTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsbiA9IHN0cmxlbihsLT5kc3QtPm5hbWUpICsgMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4obC0+ZHN0cGFkLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBlID0gYnVmLT5sZW4gKyBtYXhfb3V0X25hbWUgKyAyOworICAgICAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiJXMiLCBsLT5zcmNwYWQtPm5hbWUpOworICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhidWYsICctJywgZSAtIGJ1Zi0+bGVuKTsKKyAgICAgICAgICAgICAgICBlID0gYnVmLT5sZW4gKyBtYXhfb3V0X2ZtdCArIDIgKworICAgICAgICAgICAgICAgICAgICBtYXhfZHN0X25hbWUgLSBsbjsKKyAgICAgICAgICAgICAgICBwcmludF9saW5rX3Byb3AoYnVmLCBsKTsKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnVmLCAnLScsIGUgLSBidWYtPmxlbik7CisgICAgICAgICAgICAgICAgYXZfYnByaW50ZihidWYsICIlczolcyIsIGwtPmRzdC0+bmFtZSwgbC0+ZHN0cGFkLT5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnVmLCAnICcsIGluX2luZGVudCk7CisgICAgICAgIGF2X2JwcmludGYoYnVmLCAiKyIpOworICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnVmLCAnLScsIHdpZHRoKTsKKyAgICAgICAgYXZfYnByaW50ZihidWYsICIrXG4iKTsKKyAgICAgICAgYXZfYnByaW50ZihidWYsICJcbiIpOworICAgIH0KK30KKworY2hhciAqYXZmaWx0ZXJfZ3JhcGhfZHVtcChBVkZpbHRlckdyYXBoICpncmFwaCwgY29uc3QgY2hhciAqb3B0aW9ucykKK3sKKyAgICBBVkJQcmludCBidWY7CisgICAgY2hhciAqZHVtcDsKKworICAgIGF2X2JwcmludF9pbml0KCZidWYsIDAsIDApOworICAgIGF2ZmlsdGVyX2dyYXBoX2R1bXBfdG9fYnVmKCZidWYsIGdyYXBoKTsKKyAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCBidWYubGVuICsgMSwgYnVmLmxlbiArIDEpOworICAgIGF2ZmlsdGVyX2dyYXBoX2R1bXBfdG9fYnVmKCZidWYsIGdyYXBoKTsKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZiwgJmR1bXApOworICAgIHJldHVybiBkdW1wOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2dyYXBocGFyc2VyLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvZ3JhcGhwYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgwYmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2dyYXBocGFyc2VyLmMKQEAgLTAsMCArMSw2MDcgQEAKKy8qCisgKiBmaWx0ZXIgZ3JhcGggcGFyc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVml0b3IgU2Vzc2FrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQm9iYnkgQmluZ2hhbQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorCisjZGVmaW5lIFdISVRFU1BBQ0VTICIgXG5cdCIKKworLyoqCisgKiBMaW5rIHR3byBmaWx0ZXJzIHRvZ2V0aGVyLgorICoKKyAqIEBzZWUgYXZmaWx0ZXJfbGluaygpCisgKi8KK3N0YXRpYyBpbnQgbGlua19maWx0ZXIoQVZGaWx0ZXJDb250ZXh0ICpzcmMsIGludCBzcmNwYWQsCisgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQ29udGV4dCAqZHN0LCBpbnQgZHN0cGFkLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpsb2dfY3R4KQoreworICAgIGludCByZXQ7CisgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9saW5rKHNyYywgc3JjcGFkLCBkc3QsIGRzdHBhZCkpKSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSB0aGUgbGluayAlczolZCAtPiAlczolZFxuIiwKKyAgICAgICAgICAgICAgIHNyYy0+ZmlsdGVyLT5uYW1lLCBzcmNwYWQsIGRzdC0+ZmlsdGVyLT5uYW1lLCBkc3RwYWQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFBhcnNlIHRoZSBuYW1lIG9mIGEgbGluaywgd2hpY2ggaGFzIHRoZSBmb3JtYXQgIltsaW5rbmFtZV0iLgorICoKKyAqIEByZXR1cm4gYSBwb2ludGVyICh0aGF0IG5lZWQgdG8gYmUgZnJlZWQgYWZ0ZXIgdXNlKSB0byB0aGUgbmFtZQorICogYmV0d2VlbiBwYXJlbnRoZXNpcworICovCitzdGF0aWMgY2hhciAqcGFyc2VfbGlua19uYW1lKGNvbnN0IGNoYXIgKipidWYsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgY29uc3QgY2hhciAqc3RhcnQgPSAqYnVmOworICAgIGNoYXIgKm5hbWU7CisgICAgKCpidWYpKys7CisKKyAgICBuYW1lID0gYXZfZ2V0X3Rva2VuKGJ1ZiwgIl0iKTsKKworICAgIGlmICghbmFtZVswXSkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkJhZCAoZW1wdHk/KSBsYWJlbCBmb3VuZCBpbiB0aGUgZm9sbG93aW5nOiBcIiVzXCIuXG4iLCBzdGFydCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoKigqYnVmKSsrICE9ICddJykgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk1pc21hdGNoZWQgJ1snIGZvdW5kIGluIHRoZSBmb2xsb3dpbmc6IFwiJXNcIi5cbiIsIHN0YXJ0KTsKKyAgICBmYWlsOgorICAgICAgICBhdl9mcmVlcCgmbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIG5hbWU7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgZmlsdGVyLCBpbml0aWFsaXplIGFuZCBpbnNlcnQgaXQgaW4gdGhlCisgKiBmaWx0ZXJncmFwaCBpbiAqY3R4LgorICoKKyAqIEBwYXJhbSBmaWx0X2N0eCBwdXQgaGVyZSBhIGZpbHRlciBjb250ZXh0IGluIGNhc2Ugb2Ygc3VjY2Vzc2Z1bCBjcmVhdGlvbiBhbmQgY29uZmlndXJhdGlvbiwgTlVMTCBvdGhlcndpc2UuCisgKiBAcGFyYW0gY3R4IHRoZSBmaWx0ZXJncmFwaCBjb250ZXh0CisgKiBAcGFyYW0gaW5kZXggYW4gaW5kZXggd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgdW5pcXVlIGZvciBlYWNoIGZpbHRlciBpbnN0YW5jZSBhZGRlZCB0byB0aGUgZmlsdGVyZ3JhcGgKKyAqIEBwYXJhbSBmaWx0X25hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbHRlciB0byBjcmVhdGUKKyAqIEBwYXJhbSBhcmdzIHRoZSBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGZpbHRlciBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uCisgKiBAcGFyYW0gbG9nX2N0eCB0aGUgbG9nIGNvbnRleHQgdG8gdXNlCisgKiBAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBjcmVhdGVfZmlsdGVyKEFWRmlsdGVyQ29udGV4dCAqKmZpbHRfY3R4LCBBVkZpbHRlckdyYXBoICpjdHgsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWx0X25hbWUsIGNvbnN0IGNoYXIgKmFyZ3MsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgQVZGaWx0ZXIgKmZpbHQ7CisgICAgY2hhciBpbnN0X25hbWVbMzBdOworICAgIGNoYXIgKnRtcF9hcmdzID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgc25wcmludGYoaW5zdF9uYW1lLCBzaXplb2YoaW5zdF9uYW1lKSwgIlBhcnNlZF8lc18lZCIsIGZpbHRfbmFtZSwgaW5kZXgpOworCisgICAgZmlsdCA9IGF2ZmlsdGVyX2dldF9ieV9uYW1lKGZpbHRfbmFtZSk7CisKKyAgICBpZiAoIWZpbHQpIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJObyBzdWNoIGZpbHRlcjogJyVzJ1xuIiwgZmlsdF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAqZmlsdF9jdHggPSBhdmZpbHRlcl9ncmFwaF9hbGxvY19maWx0ZXIoY3R4LCBmaWx0LCBpbnN0X25hbWUpOworICAgIGlmICghKmZpbHRfY3R4KSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRXJyb3IgY3JlYXRpbmcgZmlsdGVyICclcydcbiIsIGZpbHRfbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAoZmlsdF9uYW1lLCAic2NhbGUiKSAmJiBhcmdzICYmICFzdHJzdHIoYXJncywgImZsYWdzIikgJiYKKyAgICAgICAgY3R4LT5zY2FsZV9zd3Nfb3B0cykgeworICAgICAgICB0bXBfYXJncyA9IGF2X2FzcHJpbnRmKCIlczolcyIsCisgICAgICAgICAgICAgICAgIGFyZ3MsIGN0eC0+c2NhbGVfc3dzX29wdHMpOworICAgICAgICBpZiAoIXRtcF9hcmdzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXJncyA9IHRtcF9hcmdzOworICAgIH0KKworICAgIHJldCA9IGF2ZmlsdGVyX2luaXRfc3RyKCpmaWx0X2N0eCwgYXJncyk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJFcnJvciBpbml0aWFsaXppbmcgZmlsdGVyICclcyciLCBmaWx0X25hbWUpOworICAgICAgICBpZiAoYXJncykKKyAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICIgd2l0aCBhcmdzICclcyciLCBhcmdzKTsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIlxuIik7CisgICAgICAgIGF2ZmlsdGVyX2ZyZWUoKmZpbHRfY3R4KTsKKyAgICAgICAgKmZpbHRfY3R4ID0gTlVMTDsKKyAgICB9CisKKyAgICBhdl9mcmVlKHRtcF9hcmdzKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFBhcnNlIGEgc3RyaW5nIG9mIHRoZSBmb3JtIEZJTFRFUl9OQU1FWz1QQVJBTVNdLCBhbmQgY3JlYXRlIGEKKyAqIGNvcnJlc3BvbmRpbmcgZmlsdGVyIGluc3RhbmNlIHdoaWNoIGlzIGFkZGVkIHRvIGdyYXBoIHdpdGgKKyAqIGNyZWF0ZV9maWx0ZXIoKS4KKyAqCisgKiBAcGFyYW0gZmlsdF9jdHggUG9pbnRlciB0aGF0IGlzIHNldCB0byB0aGUgY3JlYXRlZCBhbmQgY29uZmlndXJlZCBmaWx0ZXIKKyAqICAgICAgICAgICAgICAgICBjb250ZXh0IG9uIHN1Y2Nlc3MsIHNldCB0byBOVUxMIG9uIGZhaWx1cmUuCisgKiBAcGFyYW0gZmlsdF9jdHggcHV0IGhlcmUgYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIGZpbHRlciBjb250ZXh0IG9uCisgKiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZQorICogQHBhcmFtIGJ1ZiBwb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcGFyc2UsICpidWYgd2lsbCBiZSB1cGRhdGVkIHRvCisgKiBwb2ludCB0byB0aGUgY2hhciBuZXh0IGFmdGVyIHRoZSBwYXJzZWQgc3RyaW5nCisgKiBAcGFyYW0gaW5kZXggYW4gaW5kZXggd2hpY2ggaXMgYXNzaWduZWQgdG8gdGhlIGNyZWF0ZWQgZmlsdGVyCisgKiBpbnN0YW5jZSwgYW5kIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIHVuaXF1ZSBmb3IgZWFjaCBmaWx0ZXIKKyAqIGluc3RhbmNlIGFkZGVkIHRvIHRoZSBmaWx0ZXJncmFwaAorICogQHJldHVybiA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfZmlsdGVyKEFWRmlsdGVyQ29udGV4dCAqKmZpbHRfY3R4LCBjb25zdCBjaGFyICoqYnVmLCBBVkZpbHRlckdyYXBoICpncmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBjaGFyICpvcHRzID0gTlVMTDsKKyAgICBjaGFyICpuYW1lID0gYXZfZ2V0X3Rva2VuKGJ1ZiwgIj0sO1tcbiIpOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKipidWYgPT0gJz0nKSB7CisgICAgICAgICgqYnVmKSsrOworICAgICAgICBvcHRzID0gYXZfZ2V0X3Rva2VuKGJ1ZiwgIltdLDtcbiIpOworICAgIH0KKworICAgIHJldCA9IGNyZWF0ZV9maWx0ZXIoZmlsdF9jdHgsIGdyYXBoLCBpbmRleCwgbmFtZSwgb3B0cywgbG9nX2N0eCk7CisgICAgYXZfZnJlZShuYW1lKTsKKyAgICBhdl9mcmVlKG9wdHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK0FWRmlsdGVySW5PdXQgKmF2ZmlsdGVyX2lub3V0X2FsbG9jKHZvaWQpCit7CisgICAgcmV0dXJuIGF2X21hbGxvY3ooc2l6ZW9mKEFWRmlsdGVySW5PdXQpKTsKK30KKwordm9pZCBhdmZpbHRlcl9pbm91dF9mcmVlKEFWRmlsdGVySW5PdXQgKippbm91dCkKK3sKKyAgICB3aGlsZSAoKmlub3V0KSB7CisgICAgICAgIEFWRmlsdGVySW5PdXQgKm5leHQgPSAoKmlub3V0KS0+bmV4dDsKKyAgICAgICAgYXZfZnJlZXAoJigqaW5vdXQpLT5uYW1lKTsKKyAgICAgICAgYXZfZnJlZXAoaW5vdXQpOworICAgICAgICAqaW5vdXQgPSBuZXh0OworICAgIH0KK30KKworc3RhdGljIEFWRmlsdGVySW5PdXQgKmV4dHJhY3RfaW5vdXQoY29uc3QgY2hhciAqbGFiZWwsIEFWRmlsdGVySW5PdXQgKipsaW5rcykKK3sKKyAgICBBVkZpbHRlckluT3V0ICpyZXQ7CisKKyAgICB3aGlsZSAoKmxpbmtzICYmICghKCpsaW5rcyktPm5hbWUgfHwgc3RyY21wKCgqbGlua3MpLT5uYW1lLCBsYWJlbCkpKQorICAgICAgICBsaW5rcyA9ICYoKCpsaW5rcyktPm5leHQpOworCisgICAgcmV0ID0gKmxpbmtzOworCisgICAgaWYgKHJldCkgeworICAgICAgICAqbGlua3MgPSByZXQtPm5leHQ7CisgICAgICAgIHJldC0+bmV4dCA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaW5zZXJ0X2lub3V0KEFWRmlsdGVySW5PdXQgKippbm91dHMsIEFWRmlsdGVySW5PdXQgKmVsZW1lbnQpCit7CisgICAgZWxlbWVudC0+bmV4dCA9ICppbm91dHM7CisgICAgKmlub3V0cyA9IGVsZW1lbnQ7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZF9pbm91dChBVkZpbHRlckluT3V0ICoqaW5vdXRzLCBBVkZpbHRlckluT3V0ICoqZWxlbWVudCkKK3sKKyAgICB3aGlsZSAoKmlub3V0cyAmJiAoKmlub3V0cyktPm5leHQpCisgICAgICAgIGlub3V0cyA9ICYoKCppbm91dHMpLT5uZXh0KTsKKworICAgIGlmICghKmlub3V0cykKKyAgICAgICAgKmlub3V0cyA9ICplbGVtZW50OworICAgIGVsc2UKKyAgICAgICAgKCppbm91dHMpLT5uZXh0ID0gKmVsZW1lbnQ7CisgICAgKmVsZW1lbnQgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGxpbmtfZmlsdGVyX2lub3V0cyhBVkZpbHRlckNvbnRleHQgKmZpbHRfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJJbk91dCAqKmN1cnJfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJJbk91dCAqKm9wZW5faW5wdXRzLCB2b2lkICpsb2dfY3R4KQoreworICAgIGludCBwYWQsIHJldDsKKworICAgIGZvciAocGFkID0gMDsgcGFkIDwgZmlsdF9jdHgtPm5iX2lucHV0czsgcGFkKyspIHsKKyAgICAgICAgQVZGaWx0ZXJJbk91dCAqcCA9ICpjdXJyX2lucHV0czsKKworICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgKmN1cnJfaW5wdXRzID0gKCpjdXJyX2lucHV0cyktPm5leHQ7CisgICAgICAgICAgICBwLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmICghKHAgPSBhdl9tYWxsb2N6KHNpemVvZigqcCkpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgaWYgKHAtPmZpbHRlcl9jdHgpIHsKKyAgICAgICAgICAgIHJldCA9IGxpbmtfZmlsdGVyKHAtPmZpbHRlcl9jdHgsIHAtPnBhZF9pZHgsIGZpbHRfY3R4LCBwYWQsIGxvZ19jdHgpOworICAgICAgICAgICAgYXZfZnJlZXAoJnAtPm5hbWUpOworICAgICAgICAgICAgYXZfZnJlZXAoJnApOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHAtPmZpbHRlcl9jdHggPSBmaWx0X2N0eDsKKyAgICAgICAgICAgIHAtPnBhZF9pZHggPSBwYWQ7CisgICAgICAgICAgICBhcHBlbmRfaW5vdXQob3Blbl9pbnB1dHMsICZwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgqY3Vycl9pbnB1dHMpIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUb28gbWFueSBpbnB1dHMgc3BlY2lmaWVkIGZvciB0aGUgXCIlc1wiIGZpbHRlci5cbiIsCisgICAgICAgICAgICAgICBmaWx0X2N0eC0+ZmlsdGVyLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBwYWQgPSBmaWx0X2N0eC0+bmJfb3V0cHV0czsKKyAgICB3aGlsZSAocGFkLS0pIHsKKyAgICAgICAgQVZGaWx0ZXJJbk91dCAqY3VycmxpbmtuID0gYXZfbWFsbG9jeihzaXplb2YoQVZGaWx0ZXJJbk91dCkpOworICAgICAgICBpZiAoIWN1cnJsaW5rbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGN1cnJsaW5rbi0+ZmlsdGVyX2N0eCAgPSBmaWx0X2N0eDsKKyAgICAgICAgY3VycmxpbmtuLT5wYWRfaWR4ID0gcGFkOworICAgICAgICBpbnNlcnRfaW5vdXQoY3Vycl9pbnB1dHMsIGN1cnJsaW5rbik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfaW5wdXRzKGNvbnN0IGNoYXIgKipidWYsIEFWRmlsdGVySW5PdXQgKipjdXJyX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVySW5PdXQgKipvcGVuX291dHB1dHMsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgQVZGaWx0ZXJJbk91dCAqcGFyc2VkX2lucHV0cyA9IE5VTEw7CisgICAgaW50IHBhZCA9IDA7CisKKyAgICB3aGlsZSAoKipidWYgPT0gJ1snKSB7CisgICAgICAgIGNoYXIgKm5hbWUgPSBwYXJzZV9saW5rX25hbWUoYnVmLCBsb2dfY3R4KTsKKyAgICAgICAgQVZGaWx0ZXJJbk91dCAqbWF0Y2g7CisKKyAgICAgICAgaWYgKCFuYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICAgICAvKiBGaXJzdCBjaGVjayBpZiB0aGUgbGFiZWwgaXMgbm90IGluIHRoZSBvcGVuX291dHB1dHMgbGlzdCAqLworICAgICAgICBtYXRjaCA9IGV4dHJhY3RfaW5vdXQobmFtZSwgb3Blbl9vdXRwdXRzKTsKKworICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgIGF2X2ZyZWUobmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBOb3QgaW4gdGhlIGxpc3QsIHNvIGFkZCBpdCBhcyBhbiBpbnB1dCAqLworICAgICAgICAgICAgaWYgKCEobWF0Y2ggPSBhdl9tYWxsb2N6KHNpemVvZihBVkZpbHRlckluT3V0KSkpKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZShuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2gtPm5hbWUgICAgPSBuYW1lOworICAgICAgICAgICAgbWF0Y2gtPnBhZF9pZHggPSBwYWQ7CisgICAgICAgIH0KKworICAgICAgICBhcHBlbmRfaW5vdXQoJnBhcnNlZF9pbnB1dHMsICZtYXRjaCk7CisKKyAgICAgICAgKmJ1ZiArPSBzdHJzcG4oKmJ1ZiwgV0hJVEVTUEFDRVMpOworICAgICAgICBwYWQrKzsKKyAgICB9CisKKyAgICBhcHBlbmRfaW5vdXQoJnBhcnNlZF9pbnB1dHMsIGN1cnJfaW5wdXRzKTsKKyAgICAqY3Vycl9pbnB1dHMgPSBwYXJzZWRfaW5wdXRzOworCisgICAgcmV0dXJuIHBhZDsKK30KKworc3RhdGljIGludCBwYXJzZV9vdXRwdXRzKGNvbnN0IGNoYXIgKipidWYsIEFWRmlsdGVySW5PdXQgKipjdXJyX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckluT3V0ICoqb3Blbl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJJbk91dCAqKm9wZW5fb3V0cHV0cywgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBpbnQgcmV0LCBwYWQgPSAwOworCisgICAgd2hpbGUgKCoqYnVmID09ICdbJykgeworICAgICAgICBjaGFyICpuYW1lID0gcGFyc2VfbGlua19uYW1lKGJ1ZiwgbG9nX2N0eCk7CisgICAgICAgIEFWRmlsdGVySW5PdXQgKm1hdGNoOworCisgICAgICAgIEFWRmlsdGVySW5PdXQgKmlucHV0ID0gKmN1cnJfaW5wdXRzOworCisgICAgICAgIGlmICghbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAgICAgaWYgKCFpbnB1dCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTm8gb3V0cHV0IHBhZCBjYW4gYmUgYXNzb2NpYXRlZCB0byBsaW5rIGxhYmVsICclcycuXG4iLCBuYW1lKTsKKyAgICAgICAgICAgIGF2X2ZyZWUobmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgICpjdXJyX2lucHV0cyA9ICgqY3Vycl9pbnB1dHMpLT5uZXh0OworCisgICAgICAgIC8qIEZpcnN0IGNoZWNrIGlmIHRoZSBsYWJlbCBpcyBub3QgaW4gdGhlIG9wZW5faW5wdXRzIGxpc3QgKi8KKyAgICAgICAgbWF0Y2ggPSBleHRyYWN0X2lub3V0KG5hbWUsIG9wZW5faW5wdXRzKTsKKworICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gbGlua19maWx0ZXIoaW5wdXQtPmZpbHRlcl9jdHgsIGlucHV0LT5wYWRfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC0+ZmlsdGVyX2N0eCwgbWF0Y2gtPnBhZF9pZHgsIGxvZ19jdHgpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9mcmVlcCgmbWF0Y2gtPm5hbWUpOworICAgICAgICAgICAgYXZfZnJlZXAoJm5hbWUpOworICAgICAgICAgICAgYXZfZnJlZXAoJm1hdGNoKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZpbnB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBOb3QgaW4gdGhlIGxpc3QsIHNvIGFkZCB0aGUgZmlyc3QgaW5wdXQgYXMgYSBvcGVuX291dHB1dCAqLworICAgICAgICAgICAgaW5wdXQtPm5hbWUgPSBuYW1lOworICAgICAgICAgICAgaW5zZXJ0X2lub3V0KG9wZW5fb3V0cHV0cywgaW5wdXQpOworICAgICAgICB9CisgICAgICAgICpidWYgKz0gc3Ryc3BuKCpidWYsIFdISVRFU1BBQ0VTKTsKKyAgICAgICAgcGFkKys7CisgICAgfQorCisgICAgcmV0dXJuIHBhZDsKK30KKworc3RhdGljIGludCBwYXJzZV9zd3NfZmxhZ3MoY29uc3QgY2hhciAqKmJ1ZiwgQVZGaWx0ZXJHcmFwaCAqZ3JhcGgpCit7CisgICAgY2hhciAqcCA9IHN0cmNocigqYnVmLCAnOycpOworCisgICAgaWYgKHN0cm5jbXAoKmJ1ZiwgInN3c19mbGFncz0iLCAxMCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFwKSB7CisgICAgICAgIGF2X2xvZyhncmFwaCwgQVZfTE9HX0VSUk9SLCAic3dzX2ZsYWdzIG5vdCB0ZXJtaW5hdGVkIHdpdGggJzsnLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgKmJ1ZiArPSA0OyAgLy8ga2VlcCB0aGUgJ2ZsYWdzPScgcGFydAorCisgICAgYXZfZnJlZXAoJmdyYXBoLT5zY2FsZV9zd3Nfb3B0cyk7CisgICAgaWYgKCEoZ3JhcGgtPnNjYWxlX3N3c19vcHRzID0gYXZfbWFsbG9jeihwIC0gKmJ1ZiArIDEpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdl9zdHJsY3B5KGdyYXBoLT5zY2FsZV9zd3Nfb3B0cywgKmJ1ZiwgcCAtICpidWYgKyAxKTsKKworICAgICpidWYgPSBwICsgMTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2ZmlsdGVyX2dyYXBoX3BhcnNlMihBVkZpbHRlckdyYXBoICpncmFwaCwgY29uc3QgY2hhciAqZmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJJbk91dCAqKmlucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJJbk91dCAqKm91dHB1dHMpCit7CisgICAgaW50IGluZGV4ID0gMCwgcmV0ID0gMDsKKyAgICBjaGFyIGNociA9IDA7CisKKyAgICBBVkZpbHRlckluT3V0ICpjdXJyX2lucHV0cyA9IE5VTEwsICpvcGVuX2lucHV0cyA9IE5VTEwsICpvcGVuX291dHB1dHMgPSBOVUxMOworCisgICAgZmlsdGVycyArPSBzdHJzcG4oZmlsdGVycywgV0hJVEVTUEFDRVMpOworCisgICAgaWYgKChyZXQgPSBwYXJzZV9zd3NfZmxhZ3MoJmZpbHRlcnMsIGdyYXBoKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBkbyB7CisgICAgICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyOworICAgICAgICBmaWx0ZXJzICs9IHN0cnNwbihmaWx0ZXJzLCBXSElURVNQQUNFUyk7CisKKyAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9pbnB1dHMoJmZpbHRlcnMsICZjdXJyX2lucHV0cywgJm9wZW5fb3V0cHV0cywgZ3JhcGgpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9maWx0ZXIoJmZpbHRlciwgJmZpbHRlcnMsIGdyYXBoLCBpbmRleCwgZ3JhcGgpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKworCisgICAgICAgIGlmICgocmV0ID0gbGlua19maWx0ZXJfaW5vdXRzKGZpbHRlciwgJmN1cnJfaW5wdXRzLCAmb3Blbl9pbnB1dHMsIGdyYXBoKSkgPCAwKQorICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9vdXRwdXRzKCZmaWx0ZXJzLCAmY3Vycl9pbnB1dHMsICZvcGVuX2lucHV0cywgJm9wZW5fb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoKSkgPCAwKQorICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgZmlsdGVycyArPSBzdHJzcG4oZmlsdGVycywgV0hJVEVTUEFDRVMpOworICAgICAgICBjaHIgPSAqZmlsdGVycysrOworCisgICAgICAgIGlmIChjaHIgPT0gJzsnICYmIGN1cnJfaW5wdXRzKQorICAgICAgICAgICAgYXBwZW5kX2lub3V0KCZvcGVuX291dHB1dHMsICZjdXJyX2lucHV0cyk7CisgICAgICAgIGluZGV4Kys7CisgICAgfSB3aGlsZSAoY2hyID09ICcsJyB8fCBjaHIgPT0gJzsnKTsKKworICAgIGlmIChjaHIpIHsKKyAgICAgICAgYXZfbG9nKGdyYXBoLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHBhcnNlIGdyYXBoIGRlc2NyaXB0aW9uIHN1YnN0cmluZzogXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgZmlsdGVycyAtIDEpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGFwcGVuZF9pbm91dCgmb3Blbl9vdXRwdXRzLCAmY3Vycl9pbnB1dHMpOworCisKKyAgICAqaW5wdXRzICA9IG9wZW5faW5wdXRzOworICAgICpvdXRwdXRzID0gb3Blbl9vdXRwdXRzOworICAgIHJldHVybiAwOworCisgZmFpbDplbmQ6CisgICAgd2hpbGUgKGdyYXBoLT5uYl9maWx0ZXJzKQorICAgICAgICBhdmZpbHRlcl9mcmVlKGdyYXBoLT5maWx0ZXJzWzBdKTsKKyAgICBhdl9mcmVlcCgmZ3JhcGgtPmZpbHRlcnMpOworICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJm9wZW5faW5wdXRzKTsKKyAgICBhdmZpbHRlcl9pbm91dF9mcmVlKCZvcGVuX291dHB1dHMpOworICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJmN1cnJfaW5wdXRzKTsKKworICAgICppbnB1dHMgID0gTlVMTDsKKyAgICAqb3V0cHV0cyA9IE5VTEw7CisKKyAgICByZXR1cm4gcmV0OworfQorCisjaWYgSEFWRV9JTkNPTVBBVElCTEVfTElCQVZfQUJJIHx8ICFGRl9BUElfT0xEX0dSQVBIX1BBUlNFCitpbnQgYXZmaWx0ZXJfZ3JhcGhfcGFyc2UoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsIGNvbnN0IGNoYXIgKmZpbHRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJJbk91dCAqb3Blbl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJJbk91dCAqb3Blbl9vdXRwdXRzLCB2b2lkICpsb2dfY3R4KQoreworICAgIGludCByZXQ7CisgICAgQVZGaWx0ZXJJbk91dCAqY3VyLCAqbWF0Y2gsICppbnB1dHMgPSBOVUxMLCAqb3V0cHV0cyA9IE5VTEw7CisKKyAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2dyYXBoX3BhcnNlMihncmFwaCwgZmlsdGVycywgJmlucHV0cywgJm91dHB1dHMpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIC8qIEZpcnN0IGlucHV0IGNhbiBiZSBvbWl0dGVkIGlmIGl0IGlzICJbaW5dIiAqLworICAgIGlmIChpbnB1dHMgJiYgIWlucHV0cy0+bmFtZSkKKyAgICAgICAgaW5wdXRzLT5uYW1lID0gYXZfc3RyZHVwKCJpbiIpOworICAgIGZvciAoY3VyID0gaW5wdXRzOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIWN1ci0+bmFtZSkgeworICAgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggaW5wdXRzIHNwZWNpZmllZCBmb3IgdGhlIFwiJXNcIiBmaWx0ZXIuXG4iLAorICAgICAgICAgICAgICAgICAgICAgY3VyLT5maWx0ZXJfY3R4LT5maWx0ZXItPm5hbWUpOworICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShtYXRjaCA9IGV4dHJhY3RfaW5vdXQoY3VyLT5uYW1lLCAmb3Blbl9vdXRwdXRzKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcmV0ID0gYXZmaWx0ZXJfbGluayhtYXRjaC0+ZmlsdGVyX2N0eCwgbWF0Y2gtPnBhZF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyLT5maWx0ZXJfY3R4LCAgIGN1ci0+cGFkX2lkeCk7CisgICAgICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJm1hdGNoKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogTGFzdCBvdXRwdXQgY2FuIGJlIG9taXR0ZWQgaWYgaXQgaXMgIltvdXRdIiAqLworICAgIGlmIChvdXRwdXRzICYmICFvdXRwdXRzLT5uYW1lKQorICAgICAgICBvdXRwdXRzLT5uYW1lID0gYXZfc3RyZHVwKCJvdXQiKTsKKyAgICBmb3IgKGN1ciA9IG91dHB1dHM7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICghY3VyLT5uYW1lKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZpbHRlcmNoYWluIGNvbnRhaW5pbmcgYW4gdW5sYWJlbGxlZCBvdXRwdXQgcGFkOiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgZmlsdGVycyk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEobWF0Y2ggPSBleHRyYWN0X2lub3V0KGN1ci0+bmFtZSwgJm9wZW5faW5wdXRzKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcmV0ID0gYXZmaWx0ZXJfbGluayhjdXItPmZpbHRlcl9jdHgsICAgY3VyLT5wYWRfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoLT5maWx0ZXJfY3R4LCBtYXRjaC0+cGFkX2lkeCk7CisgICAgICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJm1hdGNoKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgZmFpbDoKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICB3aGlsZSAoZ3JhcGgtPm5iX2ZpbHRlcnMpCisgICAgICAgICAgICBhdmZpbHRlcl9mcmVlKGdyYXBoLT5maWx0ZXJzWzBdKTsKKyAgICAgICAgYXZfZnJlZXAoJmdyYXBoLT5maWx0ZXJzKTsKKyAgICB9CisgICAgYXZmaWx0ZXJfaW5vdXRfZnJlZSgmaW5wdXRzKTsKKyAgICBhdmZpbHRlcl9pbm91dF9mcmVlKCZvdXRwdXRzKTsKKyAgICBhdmZpbHRlcl9pbm91dF9mcmVlKCZvcGVuX2lucHV0cyk7CisgICAgYXZmaWx0ZXJfaW5vdXRfZnJlZSgmb3Blbl9vdXRwdXRzKTsKKyAgICByZXR1cm4gcmV0OworI2Vsc2UKK2ludCBhdmZpbHRlcl9ncmFwaF9wYXJzZShBVkZpbHRlckdyYXBoICpncmFwaCwgY29uc3QgY2hhciAqZmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckluT3V0ICoqaW5wdXRzLCBBVkZpbHRlckluT3V0ICoqb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpsb2dfY3R4KQoreworICAgIHJldHVybiBhdmZpbHRlcl9ncmFwaF9wYXJzZV9wdHIoZ3JhcGgsIGZpbHRlcnMsIGlucHV0cywgb3V0cHV0cywgbG9nX2N0eCk7CisjZW5kaWYKK30KKworaW50IGF2ZmlsdGVyX2dyYXBoX3BhcnNlX3B0cihBVkZpbHRlckdyYXBoICpncmFwaCwgY29uc3QgY2hhciAqZmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckluT3V0ICoqb3Blbl9pbnB1dHNfcHRyLCBBVkZpbHRlckluT3V0ICoqb3Blbl9vdXRwdXRzX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpsb2dfY3R4KQoreworICAgIGludCBpbmRleCA9IDAsIHJldCA9IDA7CisgICAgY2hhciBjaHIgPSAwOworCisgICAgQVZGaWx0ZXJJbk91dCAqY3Vycl9pbnB1dHMgPSBOVUxMOworICAgIEFWRmlsdGVySW5PdXQgKm9wZW5faW5wdXRzICA9IG9wZW5faW5wdXRzX3B0ciAgPyAqb3Blbl9pbnB1dHNfcHRyICA6IE5VTEw7CisgICAgQVZGaWx0ZXJJbk91dCAqb3Blbl9vdXRwdXRzID0gb3Blbl9vdXRwdXRzX3B0ciA/ICpvcGVuX291dHB1dHNfcHRyIDogTlVMTDsKKworICAgIGlmICgocmV0ID0gcGFyc2Vfc3dzX2ZsYWdzKCZmaWx0ZXJzLCBncmFwaCkpIDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBkbyB7CisgICAgICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyOworICAgICAgICBjb25zdCBjaGFyICpmaWx0ZXJjaGFpbiA9IGZpbHRlcnM7CisgICAgICAgIGZpbHRlcnMgKz0gc3Ryc3BuKGZpbHRlcnMsIFdISVRFU1BBQ0VTKTsKKworICAgICAgICBpZiAoKHJldCA9IHBhcnNlX2lucHV0cygmZmlsdGVycywgJmN1cnJfaW5wdXRzLCAmb3Blbl9vdXRwdXRzLCBsb2dfY3R4KSkgPCAwKQorICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9maWx0ZXIoJmZpbHRlciwgJmZpbHRlcnMsIGdyYXBoLCBpbmRleCwgbG9nX2N0eCkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworCisgICAgICAgIGlmIChmaWx0ZXItPm5iX2lucHV0cyA9PSAxICYmICFjdXJyX2lucHV0cyAmJiAhaW5kZXgpIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IGlucHV0IHBhZCwgYXNzdW1lIGl0IGlzICJbaW5dIiBpZiBub3Qgc3BlY2lmaWVkICovCisgICAgICAgICAgICBjb25zdCBjaGFyICp0bXAgPSAiW2luXSI7CisgICAgICAgICAgICBpZiAoKHJldCA9IHBhcnNlX2lucHV0cygmdG1wLCAmY3Vycl9pbnB1dHMsICZvcGVuX291dHB1dHMsIGxvZ19jdHgpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldCA9IGxpbmtfZmlsdGVyX2lub3V0cyhmaWx0ZXIsICZjdXJyX2lucHV0cywgJm9wZW5faW5wdXRzLCBsb2dfY3R4KSkgPCAwKQorICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9vdXRwdXRzKCZmaWx0ZXJzLCAmY3Vycl9pbnB1dHMsICZvcGVuX2lucHV0cywgJm9wZW5fb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19jdHgpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKworICAgICAgICBmaWx0ZXJzICs9IHN0cnNwbihmaWx0ZXJzLCBXSElURVNQQUNFUyk7CisgICAgICAgIGNociA9ICpmaWx0ZXJzKys7CisKKyAgICAgICAgaWYgKGNociA9PSAnOycgJiYgY3Vycl9pbnB1dHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZmlsdGVyY2hhaW4gY29udGFpbmluZyBhbiB1bmxhYmVsbGVkIG91dHB1dCBwYWQ6IFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICBmaWx0ZXJjaGFpbik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpbmRleCsrOworICAgIH0gd2hpbGUgKGNociA9PSAnLCcgfHwgY2hyID09ICc7Jyk7CisKKyAgICBpZiAoY2hyKSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHBhcnNlIGdyYXBoIGRlc2NyaXB0aW9uIHN1YnN0cmluZzogXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgZmlsdGVycyAtIDEpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmIChjdXJyX2lucHV0cykgeworICAgICAgICAvKiBMYXN0IG91dHB1dCBwYWQsIGFzc3VtZSBpdCBpcyAiW291dF0iIGlmIG5vdCBzcGVjaWZpZWQgKi8KKyAgICAgICAgY29uc3QgY2hhciAqdG1wID0gIltvdXRdIjsKKyAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9vdXRwdXRzKCZ0bXAsICZjdXJyX2lucHV0cywgJm9wZW5faW5wdXRzLCAmb3Blbl9vdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2N0eCkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworZW5kOgorICAgIC8qIGNsZWFyIG9wZW5faW4vb3V0cHV0cyBvbmx5IGlmIG5vdCBwYXNzZWQgYXMgcGFyYW1ldGVycyAqLworICAgIGlmIChvcGVuX2lucHV0c19wdHIpICpvcGVuX2lucHV0c19wdHIgPSBvcGVuX2lucHV0czsKKyAgICBlbHNlIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJm9wZW5faW5wdXRzKTsKKyAgICBpZiAob3Blbl9vdXRwdXRzX3B0cikgKm9wZW5fb3V0cHV0c19wdHIgPSBvcGVuX291dHB1dHM7CisgICAgZWxzZSBhdmZpbHRlcl9pbm91dF9mcmVlKCZvcGVuX291dHB1dHMpOworICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJmN1cnJfaW5wdXRzKTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHdoaWxlIChncmFwaC0+bmJfZmlsdGVycykKKyAgICAgICAgICAgIGF2ZmlsdGVyX2ZyZWUoZ3JhcGgtPmZpbHRlcnNbMF0pOworICAgICAgICBhdl9mcmVlcCgmZ3JhcGgtPmZpbHRlcnMpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2ludGVybGFjZS5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2ludGVybGFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZjFlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvaW50ZXJsYWNlLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIHByb2dyZXNzaXZlIHRvIGludGVybGFjZWQgY29udGVudCBmaWx0ZXIsIGluc3BpcmVkIGJ5IGhlYXZ5IGRlYnVnZ2luZyBvZgorICogdGludGVybGFjZSBmaWx0ZXIuCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9JTlRFUkxBQ0VfSAorI2RlZmluZSBBVkZJTFRFUl9JTlRFUkxBQ0VfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworZW51bSBTY2FuTW9kZSB7CisgICAgTU9ERV9URkYgPSAwLAorICAgIE1PREVfQkZGID0gMSwKK307CisKK2VudW0gRmllbGRUeXBlIHsKKyAgICBGSUVMRF9VUFBFUiA9IDAsCisgICAgRklFTERfTE9XRVIgPSAxLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgSW50ZXJsYWNlQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgZW51bSBTY2FuTW9kZSBzY2FuOyAgICAvLyB0b3Agb3IgYm90dG9tIGZpZWxkIGZpcnN0IHNjYW5uaW5nCisgICAgaW50IGxvd3Bhc3M7ICAgICAgICAgICAvLyBlbmFibGUgb3IgZGlzYWJsZSBsb3cgcGFzcyBmaWx0ZXJuaW5nCisgICAgQVZGcmFtZSAqY3VyLCAqbmV4dDsgICAvLyB0aGUgdHdvIGZyYW1lcyBmcm9tIHdoaWNoIHRoZSBuZXcgb25lIGlzIG9idGFpbmVkCisgICAgdm9pZCAoKmxvd3Bhc3NfbGluZSkodWludDhfdCAqZHN0cCwgcHRyZGlmZl90IGxpbmVzaXplLCBjb25zdCB1aW50OF90ICpzcmNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYWJvdmUsIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYmVsb3cpOworfSBJbnRlcmxhY2VDb250ZXh0OworCit2b2lkIGZmX2ludGVybGFjZV9pbml0X3g4NihJbnRlcmxhY2VDb250ZXh0ICppbnRlcmxhY2UpOworCisjZW5kaWYgLyogQVZGSUxURVJfSU5URVJMQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9pbnRlcm5hbC5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4YjExNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfSU5URVJOQUxfSAorI2RlZmluZSBBVkZJTFRFUl9JTlRFUk5BTF9ICisKKy8qKgorICogQGZpbGUKKyAqIGludGVybmFsIEFQSSBmdW5jdGlvbnMKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJhdmZpbHRlcmdyYXBoLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCisjZGVmaW5lIFBPT0xfU0laRSAzMgordHlwZWRlZiBzdHJ1Y3QgQVZGaWx0ZXJQb29sIHsKKyAgICBBVkZpbHRlckJ1ZmZlclJlZiAqcGljW1BPT0xfU0laRV07CisgICAgaW50IGNvdW50OworICAgIGludCByZWZjb3VudDsKKyAgICBpbnQgZHJhaW5pbmc7Cit9IEFWRmlsdGVyUG9vbDsKKwordHlwZWRlZiBzdHJ1Y3QgQVZGaWx0ZXJDb21tYW5kIHsKKyAgICBkb3VibGUgdGltZTsgICAgICAgICAgICAgICAgLy8vPCB0aW1lIGV4cHJlc3NlZCBpbiBzZWNvbmRzCisgICAgY2hhciAqY29tbWFuZDsgICAgICAgICAgICAgIC8vLzwgY29tbWFuZAorICAgIGNoYXIgKmFyZzsgICAgICAgICAgICAgICAgICAvLy88IG9wdGlvbmFsIGFyZ3VtZW50IGZvciB0aGUgY29tbWFuZAorICAgIGludCBmbGFnczsKKyAgICBzdHJ1Y3QgQVZGaWx0ZXJDb21tYW5kICpuZXh0OworfSBBVkZpbHRlckNvbW1hbmQ7CisKKy8qKgorICogVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiBhIGxpbmsgaW4gdGhlIGFnZSBoZWFwLgorICovCit2b2lkIGZmX2F2ZmlsdGVyX2dyYXBoX3VwZGF0ZV9oZWFwKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBBVkZpbHRlckxpbmsgKmxpbmspOworCisjaWYgIUZGX0FQSV9BVkZJTFRFUlBBRF9QVUJMSUMKKy8qKgorICogQSBmaWx0ZXIgcGFkIHVzZWQgZm9yIGVpdGhlciBpbnB1dCBvciBvdXRwdXQuCisgKi8KK3N0cnVjdCBBVkZpbHRlclBhZCB7CisgICAgLyoqCisgICAgICogUGFkIG5hbWUuIFRoZSBuYW1lIGlzIHVuaXF1ZSBhbW9uZyBpbnB1dHMgYW5kIGFtb25nIG91dHB1dHMsIGJ1dCBhbgorICAgICAqIGlucHV0IG1heSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYW4gb3V0cHV0LiBUaGlzIG1heSBiZSBOVUxMIGlmIHRoaXMKKyAgICAgKiBwYWQgaGFzIG5vIG5lZWQgdG8gZXZlciBiZSByZWZlcmVuY2VkIGJ5IG5hbWUuCisgICAgICovCisgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgIC8qKgorICAgICAqIEFWRmlsdGVyUGFkIHR5cGUuCisgICAgICovCisgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlOworCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZ2V0IGEgdmlkZW8gYnVmZmVyLiBJZiBOVUxMLCB0aGUgZmlsdGVyIHN5c3RlbSB3aWxsCisgICAgICogdXNlIGZmX2RlZmF1bHRfZ2V0X3ZpZGVvX2J1ZmZlcigpLgorICAgICAqCisgICAgICogSW5wdXQgdmlkZW8gcGFkcyBvbmx5LgorICAgICAqLworICAgIEFWRnJhbWUgKigqZ2V0X3ZpZGVvX2J1ZmZlcikoQVZGaWx0ZXJMaW5rICpsaW5rLCBpbnQgdywgaW50IGgpOworCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZ2V0IGFuIGF1ZGlvIGJ1ZmZlci4gSWYgTlVMTCwgdGhlIGZpbHRlciBzeXN0ZW0gd2lsbAorICAgICAqIHVzZSBmZl9kZWZhdWx0X2dldF9hdWRpb19idWZmZXIoKS4KKyAgICAgKgorICAgICAqIElucHV0IGF1ZGlvIHBhZHMgb25seS4KKyAgICAgKi8KKyAgICBBVkZyYW1lICooKmdldF9hdWRpb19idWZmZXIpKEFWRmlsdGVyTGluayAqbGluaywgaW50IG5iX3NhbXBsZXMpOworCisgICAgLyoqCisgICAgICogRmlsdGVyaW5nIGNhbGxiYWNrLiBUaGlzIGlzIHdoZXJlIGEgZmlsdGVyIHJlY2VpdmVzIGEgZnJhbWUgd2l0aAorICAgICAqIGF1ZGlvL3ZpZGVvIGRhdGEgYW5kIHNob3VsZCBkbyBpdHMgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIElucHV0IHBhZHMgb25seS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPj0gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1Igb24gZXJyb3IuIFRoaXMgZnVuY3Rpb24KKyAgICAgKiBtdXN0IGVuc3VyZSB0aGF0IHNhbXBsZXNyZWYgaXMgcHJvcGVybHkgdW5yZWZlcmVuY2VkIG9uIGVycm9yIGlmIGl0CisgICAgICogaGFzbid0IGJlZW4gcGFzc2VkIG9uIHRvIGFub3RoZXIgZmlsdGVyLgorICAgICAqLworICAgIGludCAoKmZpbHRlcl9mcmFtZSkoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBGcmFtZSBwb2xsIGNhbGxiYWNrLiBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBpbW1lZGlhdGVseSBhdmFpbGFibGUKKyAgICAgKiBzYW1wbGVzLiBJdCBzaG91bGQgcmV0dXJuIGEgcG9zaXRpdmUgdmFsdWUgaWYgdGhlIG5leHQgcmVxdWVzdF9mcmFtZSgpCisgICAgICogaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gb25lIGZyYW1lICh3aXRoIG5vIGRlbGF5KS4KKyAgICAgKgorICAgICAqIERlZmF1bHRzIHRvIGp1c3QgY2FsbGluZyB0aGUgc291cmNlIHBvbGxfZnJhbWUoKSBtZXRob2QuCisgICAgICoKKyAgICAgKiBPdXRwdXQgcGFkcyBvbmx5LgorICAgICAqLworICAgIGludCAoKnBvbGxfZnJhbWUpKEFWRmlsdGVyTGluayAqbGluayk7CisKKyAgICAvKioKKyAgICAgKiBGcmFtZSByZXF1ZXN0IGNhbGxiYWNrLiBBIGNhbGwgdG8gdGhpcyBzaG91bGQgcmVzdWx0IGluIGF0IGxlYXN0IG9uZQorICAgICAqIGZyYW1lIGJlaW5nIG91dHB1dCBvdmVyIHRoZSBnaXZlbiBsaW5rLiBUaGlzIHNob3VsZCByZXR1cm4gemVybyBvbgorICAgICAqIHN1Y2Nlc3MsIGFuZCBhbm90aGVyIHZhbHVlIG9uIGVycm9yLgorICAgICAqCisgICAgICogT3V0cHV0IHBhZHMgb25seS4KKyAgICAgKi8KKyAgICBpbnQgKCpyZXF1ZXN0X2ZyYW1lKShBVkZpbHRlckxpbmsgKmxpbmspOworCisgICAgLyoqCisgICAgICogTGluayBjb25maWd1cmF0aW9uIGNhbGxiYWNrLgorICAgICAqCisgICAgICogRm9yIG91dHB1dCBwYWRzLCB0aGlzIHNob3VsZCBzZXQgdGhlIGxpbmsgcHJvcGVydGllcyBzdWNoIGFzCisgICAgICogd2lkdGgvaGVpZ2h0LiBUaGlzIHNob3VsZCBOT1Qgc2V0IHRoZSBmb3JtYXQgcHJvcGVydHkgLSB0aGF0IGlzCisgICAgICogbmVnb3RpYXRlZCBiZXR3ZWVuIGZpbHRlcnMgYnkgdGhlIGZpbHRlciBzeXN0ZW0gdXNpbmcgdGhlCisgICAgICogcXVlcnlfZm9ybWF0cygpIGNhbGxiYWNrIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEZvciBpbnB1dCBwYWRzLCB0aGlzIHNob3VsZCBjaGVjayB0aGUgcHJvcGVydGllcyBvZiB0aGUgbGluaywgYW5kIHVwZGF0ZQorICAgICAqIHRoZSBmaWx0ZXIncyBpbnRlcm5hbCBzdGF0ZSBhcyBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBGb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGZpbHRlcnMsIHRoaXMgc2hvdWxkIHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsCisgICAgICogYW5kIGFub3RoZXIgdmFsdWUgb24gZXJyb3IuCisgICAgICovCisgICAgaW50ICgqY29uZmlnX3Byb3BzKShBVkZpbHRlckxpbmsgKmxpbmspOworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBleHBlY3RzIGEgZmlmbyB0byBiZSBpbnNlcnRlZCBvbiBpdHMgaW5wdXQgbGluaywKKyAgICAgKiB0eXBpY2FsbHkgYmVjYXVzZSBpdCBoYXMgYSBkZWxheS4KKyAgICAgKgorICAgICAqIGlucHV0IHBhZHMgb25seS4KKyAgICAgKi8KKyAgICBpbnQgbmVlZHNfZmlmbzsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWx0ZXIgZXhwZWN0cyB3cml0YWJsZSBmcmFtZXMgZnJvbSBpdHMgaW5wdXQgbGluaywKKyAgICAgKiBkdXBsaWNhdGluZyBkYXRhIGJ1ZmZlcnMgaWYgbmVlZGVkLgorICAgICAqCisgICAgICogaW5wdXQgcGFkcyBvbmx5LgorICAgICAqLworICAgIGludCBuZWVkc193cml0YWJsZTsKK307CisjZW5kaWYKKworc3RydWN0IEFWRmlsdGVyR3JhcGhJbnRlcm5hbCB7CisgICAgdm9pZCAqdGhyZWFkOworICAgIGF2ZmlsdGVyX2V4ZWN1dGVfZnVuYyAqdGhyZWFkX2V4ZWN1dGU7Cit9OworCitzdHJ1Y3QgQVZGaWx0ZXJJbnRlcm5hbCB7CisgICAgYXZmaWx0ZXJfZXhlY3V0ZV9mdW5jICpleGVjdXRlOworfTsKKworI2lmIEZGX0FQSV9BVkZJTFRFUkJVRkZFUgorLyoqIGRlZmF1bHQgaGFuZGxlciBmb3IgZnJlZWluZyBhdWRpby92aWRlbyBidWZmZXIgd2hlbiB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlcyBsZWZ0ICovCit2b2lkIGZmX2F2ZmlsdGVyX2RlZmF1bHRfZnJlZV9idWZmZXIoQVZGaWx0ZXJCdWZmZXIgKmJ1Zik7CisjZW5kaWYKKworLyoqIFRlbGwgaXMgYSBmb3JtYXQgaXMgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZCBsaXN0IHRlcm1pbmF0ZWQgYnkgLTEuICovCitpbnQgZmZfZm10X2lzX2luKGludCBmbXQsIGNvbnN0IGludCAqZm10cyk7CisKKy8qIEZ1bmN0aW9ucyB0byBwYXJzZSBhdWRpbyBmb3JtYXQgYXJndW1lbnRzICovCisKKy8qKgorICogUGFyc2UgYSBwaXhlbCBmb3JtYXQuCisgKgorICogQHBhcmFtIHJldCBwaXhlbCBmb3JtYXQgcG9pbnRlciB0byB3aGVyZSB0aGUgdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSBhcmcgc3RyaW5nIHRvIHBhcnNlCisgKiBAcGFyYW0gbG9nX2N0eCBsb2cgY29udGV4dAorICogQHJldHVybiA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZXJyb3IKKyAqLworaW50IGZmX3BhcnNlX3BpeGVsX2Zvcm1hdChlbnVtIEFWUGl4ZWxGb3JtYXQgKnJldCwgY29uc3QgY2hhciAqYXJnLCB2b2lkICpsb2dfY3R4KTsKKworLyoqCisgKiBQYXJzZSBhIHNhbXBsZSByYXRlLgorICoKKyAqIEBwYXJhbSByZXQgdW5zaWduZWQgaW50ZWdlciBwb2ludGVyIHRvIHdoZXJlIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbgorICogQHBhcmFtIGFyZyBzdHJpbmcgdG8gcGFyc2UKKyAqIEBwYXJhbSBsb2dfY3R4IGxvZyBjb250ZXh0CisgKiBAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBlcnJvcgorICovCitpbnQgZmZfcGFyc2Vfc2FtcGxlX3JhdGUoaW50ICpyZXQsIGNvbnN0IGNoYXIgKmFyZywgdm9pZCAqbG9nX2N0eCk7CisKKy8qKgorICogUGFyc2UgYSB0aW1lIGJhc2UuCisgKgorICogQHBhcmFtIHJldCB1bnNpZ25lZCBBVlJhdGlvbmFsIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuCisgKiBAcGFyYW0gYXJnIHN0cmluZyB0byBwYXJzZQorICogQHBhcmFtIGxvZ19jdHggbG9nIGNvbnRleHQKKyAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGVycm9yCisgKi8KK2ludCBmZl9wYXJzZV90aW1lX2Jhc2UoQVZSYXRpb25hbCAqcmV0LCBjb25zdCBjaGFyICphcmcsIHZvaWQgKmxvZ19jdHgpOworCisvKioKKyAqIFBhcnNlIGEgc2FtcGxlIGZvcm1hdCBuYW1lIG9yIGEgY29ycmVzcG9uZGluZyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIEBwYXJhbSByZXQgaW50ZWdlciBwb2ludGVyIHRvIHdoZXJlIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbgorICogQHBhcmFtIGFyZyBzdHJpbmcgdG8gcGFyc2UKKyAqIEBwYXJhbSBsb2dfY3R4IGxvZyBjb250ZXh0CisgKiBAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBlcnJvcgorICovCitpbnQgZmZfcGFyc2Vfc2FtcGxlX2Zvcm1hdChpbnQgKnJldCwgY29uc3QgY2hhciAqYXJnLCB2b2lkICpsb2dfY3R4KTsKKworLyoqCisgKiBQYXJzZSBhIGNoYW5uZWwgbGF5b3V0IG9yIGEgY29ycmVzcG9uZGluZyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIEBwYXJhbSByZXQgNjRiaXQgaW50ZWdlciBwb2ludGVyIHRvIHdoZXJlIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbi4KKyAqIEBwYXJhbSBucmV0IGludGVnZXIgcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzOworICogICAgICAgICAgICAgaWYgbm90IE5VTEwsIHRoZW4gdW5rbm93biBjaGFubmVsIGxheW91dHMgYXJlIGFjY2VwdGVkCisgKiBAcGFyYW0gYXJnIHN0cmluZyB0byBwYXJzZQorICogQHBhcmFtIGxvZ19jdHggbG9nIGNvbnRleHQKKyAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGVycm9yCisgKi8KK2ludCBmZl9wYXJzZV9jaGFubmVsX2xheW91dChpbnQ2NF90ICpyZXQsIGludCAqbnJldCwgY29uc3QgY2hhciAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxvZ19jdHgpOworCit2b2lkIGZmX3VwZGF0ZV9saW5rX2N1cnJlbnRfcHRzKEFWRmlsdGVyTGluayAqbGluaywgaW50NjRfdCBwdHMpOworCit2b2lkIGZmX2NvbW1hbmRfcXVldWVfcG9wKEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyKTsKKworLyogbWlzYyB0cmFjZSBmdW5jdGlvbnMgKi8KKworLyogI2RlZmluZSBGRl9BVkZJTFRFUl9UUkFDRSAqLworCisjaWZkZWYgRkZfQVZGSUxURVJfVFJBQ0UKKyMgICAgZGVmaW5lIGZmX3Rsb2cocGN0eCwgLi4uKSBhdl9sb2cocGN0eCwgQVZfTE9HX0RFQlVHLCBfX1ZBX0FSR1NfXykKKyNlbHNlCisjICAgIGRlZmluZSBmZl90bG9nKHBjdHgsIC4uLikgZG8geyBpZiAoMCkgYXZfbG9nKHBjdHgsIEFWX0xPR19ERUJVRywgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgRkZfVFBSSU5URl9TVEFSVChjdHgsIGZ1bmMpIGZmX3Rsb2coTlVMTCwgIiUtMTZzOiAiLCAjZnVuYykKKworY2hhciAqZmZfZ2V0X3JlZl9wZXJtc19zdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUsIGludCBwZXJtcyk7CisKK3ZvaWQgZmZfdGxvZ19yZWYodm9pZCAqY3R4LCBBVkZyYW1lICpyZWYsIGludCBlbmQpOworCit2b2lkIGZmX3Rsb2dfbGluayh2b2lkICpjdHgsIEFWRmlsdGVyTGluayAqbGluaywgaW50IGVuZCk7CisKKy8qKgorICogSW5zZXJ0IGEgbmV3IHBhZC4KKyAqCisgKiBAcGFyYW0gaWR4IEluc2VydGlvbiBwb2ludC4gUGFkIGlzIGluc2VydGVkIGF0IHRoZSBlbmQgaWYgdGhpcyBwb2ludAorICogICAgICAgICAgICBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBwYWRzLgorICogQHBhcmFtIGNvdW50IFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBwYWRzIGluIHRoZSBsaXN0CisgKiBAcGFyYW0gcGFkaWR4X29mZiBPZmZzZXQgd2l0aGluIGFuIEFWRmlsdGVyTGluayBzdHJ1Y3R1cmUgdG8gdGhlIGVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgIHRvIGluY3JlbWVudCB3aGVuIGluc2VydGluZyBhIG5ldyBwYWQgY2F1c2VzIGxpbmsKKyAqICAgICAgICAgICAgICAgICAgIG51bWJlcmluZyB0byBjaGFuZ2UKKyAqIEBwYXJhbSBwYWRzIFBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCBvZiBwYWRzCisgKiBAcGFyYW0gbGlua3MgUG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IG9mIGxpbmtzCisgKiBAcGFyYW0gbmV3cGFkIFRoZSBuZXcgcGFkIHRvIGFkZC4gQSBjb3B5IGlzIG1hZGUgd2hlbiBhZGRpbmcuCisgKiBAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBlcnJvcgorICovCitpbnQgZmZfaW5zZXJ0X3BhZCh1bnNpZ25lZCBpZHgsIHVuc2lnbmVkICpjb3VudCwgc2l6ZV90IHBhZGlkeF9vZmYsCisgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJQYWQgKipwYWRzLCBBVkZpbHRlckxpbmsgKioqbGlua3MsCisgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJQYWQgKm5ld3BhZCk7CisKKy8qKiBJbnNlcnQgYSBuZXcgaW5wdXQgcGFkIGZvciB0aGUgZmlsdGVyLiAqLworc3RhdGljIGlubGluZSBpbnQgZmZfaW5zZXJ0X2lucGFkKEFWRmlsdGVyQ29udGV4dCAqZiwgdW5zaWduZWQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyUGFkICpwKQoreworICAgIGludCByZXQgPSBmZl9pbnNlcnRfcGFkKGluZGV4LCAmZi0+bmJfaW5wdXRzLCBvZmZzZXRvZihBVkZpbHRlckxpbmssIGRzdHBhZCksCisgICAgICAgICAgICAgICAgICAmZi0+aW5wdXRfcGFkcywgJmYtPmlucHV0cywgcCk7CisjaWYgRkZfQVBJX0ZPT19DT1VOVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGYtPmlucHV0X2NvdW50ID0gZi0+bmJfaW5wdXRzOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICByZXR1cm4gcmV0OworfQorCisvKiogSW5zZXJ0IGEgbmV3IG91dHB1dCBwYWQgZm9yIHRoZSBmaWx0ZXIuICovCitzdGF0aWMgaW5saW5lIGludCBmZl9pbnNlcnRfb3V0cGFkKEFWRmlsdGVyQ29udGV4dCAqZiwgdW5zaWduZWQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlclBhZCAqcCkKK3sKKyAgICBpbnQgcmV0ID0gZmZfaW5zZXJ0X3BhZChpbmRleCwgJmYtPm5iX291dHB1dHMsIG9mZnNldG9mKEFWRmlsdGVyTGluaywgc3JjcGFkKSwKKyAgICAgICAgICAgICAgICAgICZmLT5vdXRwdXRfcGFkcywgJmYtPm91dHB1dHMsIHApOworI2lmIEZGX0FQSV9GT09fQ09VTlQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBmLT5vdXRwdXRfY291bnQgPSBmLT5uYl9vdXRwdXRzOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFBvbGwgYSBmcmFtZSBmcm9tIHRoZSBmaWx0ZXIgY2hhaW4uCisgKgorICogQHBhcmFtICBsaW5rIHRoZSBpbnB1dCBsaW5rCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIGZyYW1lcywgYSBuZWdhdGl2ZQorICogbnVtYmVyIGluIGNhc2Ugb2YgZXJyb3IKKyAqLworaW50IGZmX3BvbGxfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKTsKKworLyoqCisgKiBSZXF1ZXN0IGFuIGlucHV0IGZyYW1lIGZyb20gdGhlIGZpbHRlciBhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBsaW5rLgorICoKKyAqIEBwYXJhbSBsaW5rIHRoZSBpbnB1dCBsaW5rCisgKiBAcmV0dXJuICAgICB6ZXJvIG9uIHN1Y2Nlc3MKKyAqLworaW50IGZmX3JlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKTsKKworI2RlZmluZSBBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZm5hbWUpICAgICAgICAgICAgXAorICAgIHN0YXRpYyBjb25zdCBBVkNsYXNzIGZuYW1lIyNfY2xhc3MgPSB7ICAgICAgXAorICAgICAgICAuY2xhc3NfbmFtZSA9ICNmbmFtZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLCAgICAgXAorICAgICAgICAub3B0aW9uICAgICA9IGZuYW1lIyNfb3B0aW9ucywgICAgICAgICAgXAorICAgICAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwgICAgXAorICAgICAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0ZJTFRFUiwgXAorICAgIH0KKworQVZGaWx0ZXJCdWZmZXJSZWYgKmZmX2NvcHlfYnVmZmVyX3JlZihBVkZpbHRlckxpbmsgKm91dGxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQnVmZmVyUmVmICpyZWYpOworCisvKioKKyAqIEZpbmQgdGhlIGluZGV4IG9mIGEgbGluay4KKyAqCisgKiBJLmUuIGZpbmQgaSBzdWNoIHRoYXQgbGluayA9PSBjdHgtPihpbnxvdXQpcHV0c1tpXQorICovCisjZGVmaW5lIEZGX0lOTElOS19JRFgobGluaykgICgoaW50KSgobGluayktPmRzdHBhZCAtIChsaW5rKS0+ZHN0LT5pbnB1dF9wYWRzKSkKKyNkZWZpbmUgRkZfT1VUTElOS19JRFgobGluaykgKChpbnQpKChsaW5rKS0+c3JjcGFkIC0gKGxpbmspLT5zcmMtPm91dHB1dF9wYWRzKSkKKworaW50IGZmX2J1ZmZlcnNpbmtfcmVhZF9jb21wYXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRmlsdGVyQnVmZmVyUmVmICoqYnVmKTsKK2ludCBmZl9idWZmZXJzaW5rX3JlYWRfc2FtcGxlc19jb21wYXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRmlsdGVyQnVmZmVyUmVmICoqcGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMpOworLyoqCisgKiBTZW5kIGEgZnJhbWUgb2YgZGF0YSB0byB0aGUgbmV4dCBmaWx0ZXIuCisgKgorICogQHBhcmFtIGxpbmsgICB0aGUgb3V0cHV0IGxpbmsgb3ZlciB3aGljaCB0aGUgZGF0YSBpcyBiZWluZyBzZW50CisgKiBAcGFyYW0gZnJhbWUgYSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBvZiBkYXRhIGJlaW5nIHNlbnQuIFRoZQorICogICAgICAgICAgICAgIHJlY2VpdmluZyBmaWx0ZXIgd2lsbCBmcmVlIHRoaXMgcmVmZXJlbmNlIHdoZW4gaXQgbm8gbG9uZ2VyCisgKiAgICAgICAgICAgICAgbmVlZHMgaXQgb3IgcGFzcyBpdCBvbiB0byB0aGUgbmV4dCBmaWx0ZXIuCisgKgorICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBvbiBlcnJvci4gVGhlIHJlY2VpdmluZyBmaWx0ZXIKKyAqIGlzIHJlc3BvbnNpYmxlIGZvciB1bnJlZmVyZW5jaW5nIGZyYW1lIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK2ludCBmZl9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSk7CisKKy8qKgorICogRmxhZ3MgZm9yIEFWRmlsdGVyTGluay5mbGFncy4KKyAqLworZW51bSB7CisKKyAgICAvKioKKyAgICAgKiBGcmFtZSByZXF1ZXN0cyBtYXkgbmVlZCB0byBsb29wIGluIG9yZGVyIHRvIGJlIGZ1bGZpbGxlZC4KKyAgICAgKiBBIGZpbHRlciBtdXN0IHNldCB0aGlzIGZsYWdzIG9uIGFuIG91dHB1dCBsaW5rIGlmIGl0IG1heSByZXR1cm4gMCBpbgorICAgICAqIHJlcXVlc3RfZnJhbWUoKSB3aXRob3V0IGZpbHRlcmluZyBhIGZyYW1lLgorICAgICAqLworICAgIEZGX0xJTktfRkxBR19SRVFVRVNUX0xPT1AgPSAxLAorCit9OworCisvKioKKyAqIEFsbG9jYXRlIGEgbmV3IGZpbHRlciBjb250ZXh0IGFuZCByZXR1cm4gaXQuCisgKgorICogQHBhcmFtIGZpbHRlciB3aGF0IGZpbHRlciB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKKyAqIEBwYXJhbSBpbnN0X25hbWUgbmFtZSB0byBnaXZlIHRvIHRoZSBuZXcgZmlsdGVyIGNvbnRleHQKKyAqCisgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgZmlsdGVyIGNvbnRleHQgb3IgTlVMTCBvbiBmYWlsdXJlCisgKi8KK0FWRmlsdGVyQ29udGV4dCAqZmZfZmlsdGVyX2FsbG9jKGNvbnN0IEFWRmlsdGVyICpmaWx0ZXIsIGNvbnN0IGNoYXIgKmluc3RfbmFtZSk7CisKKy8qKgorICogUmVtb3ZlIGEgZmlsdGVyIGZyb20gYSBncmFwaDsKKyAqLwordm9pZCBmZl9maWx0ZXJfZ3JhcGhfcmVtb3ZlX2ZpbHRlcihBVkZpbHRlckdyYXBoICpncmFwaCwgQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXIpOworCisjZW5kaWYgLyogQVZGSUxURVJfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2xhdmZ1dGlscy5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xhdmZ1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMzEwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGF2ZnV0aWxzLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMiBTdGVmYW5vIFNhYmF0aW5pIDxzdGVmYXNhYiBnbWFpbCBjb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsYXZmdXRpbHMuaCIKKworaW50IGZmX2xvYWRfaW1hZ2UodWludDhfdCAqZGF0YVs0XSwgaW50IGxpbmVzaXplWzRdLAorICAgICAgICAgICAgICAgICAgaW50ICp3LCBpbnQgKmgsIGVudW0gQVZQaXhlbEZvcm1hdCAqcGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpsb2dfY3R4KQoreworICAgIEFWSW5wdXRGb3JtYXQgKmlmb3JtYXQgPSBOVUxMOworICAgIEFWRm9ybWF0Q29udGV4dCAqZm9ybWF0X2N0eCA9IE5VTEw7CisgICAgQVZDb2RlYyAqY29kZWM7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjX2N0eDsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBpbnQgZnJhbWVfZGVjb2RlZCwgcmV0ID0gMDsKKyAgICBBVlBhY2tldCBwa3Q7CisKKyAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKKworICAgIGF2X3JlZ2lzdGVyX2FsbCgpOworCisgICAgaWZvcm1hdCA9IGF2X2ZpbmRfaW5wdXRfZm9ybWF0KCJpbWFnZTIiKTsKKyAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJmZvcm1hdF9jdHgsIGZpbGVuYW1lLCBpZm9ybWF0LCBOVUxMKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gaW5wdXQgZmlsZSAnJXMnXG4iLCBmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKGZvcm1hdF9jdHgsIE5VTEwpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkZpbmQgc3RyZWFtIGluZm8gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBjb2RlY19jdHggPSBmb3JtYXRfY3R4LT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKGNvZGVjX2N0eC0+Y29kZWNfaWQpOworICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBmaW5kIGNvZGVjXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2Y29kZWNfb3BlbjIoY29kZWNfY3R4LCBjb2RlYywgTlVMTCkpIDwgMCkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gY29kZWNcbiIpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAoIShmcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpICkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jIGZyYW1lXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICByZXQgPSBhdl9yZWFkX2ZyYW1lKGZvcm1hdF9jdHgsICZwa3QpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBmcmFtZSBmcm9tIGZpbGVcbiIpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICByZXQgPSBhdmNvZGVjX2RlY29kZV92aWRlbzIoY29kZWNfY3R4LCBmcmFtZSwgJmZyYW1lX2RlY29kZWQsICZwa3QpOworICAgIGlmIChyZXQgPCAwIHx8ICFmcmFtZV9kZWNvZGVkKSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlIGltYWdlIGZyb20gZmlsZVxuIik7CisgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICAqdyAgICAgICA9IGZyYW1lLT53aWR0aDsKKyAgICAqaCAgICAgICA9IGZyYW1lLT5oZWlnaHQ7CisgICAgKnBpeF9mbXQgPSBmcmFtZS0+Zm9ybWF0OworCisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9hbGxvYyhkYXRhLCBsaW5lc2l6ZSwgKncsICpoLCAqcGl4X2ZtdCwgMTYpKSA8IDApCisgICAgICAgIGdvdG8gZW5kOworICAgIHJldCA9IDA7CisKKyAgICBhdl9pbWFnZV9jb3B5KGRhdGEsIGxpbmVzaXplLCAoY29uc3QgdWludDhfdCAqKilmcmFtZS0+ZGF0YSwgZnJhbWUtPmxpbmVzaXplLCAqcGl4X2ZtdCwgKncsICpoKTsKKworZW5kOgorICAgIGF2X2ZyZWVfcGFja2V0KCZwa3QpOworICAgIGF2Y29kZWNfY2xvc2UoY29kZWNfY3R4KTsKKyAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmZm9ybWF0X2N0eCk7CisgICAgYXZfZnJlZXAoJmZyYW1lKTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgbG9hZGluZyBpbWFnZSBmaWxlICclcydcbiIsIGZpbGVuYW1lKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2xhdmZ1dGlscy5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xhdmZ1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNTMwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGF2ZnV0aWxzLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNaXNjZWxsYW5lb3VzIHV0aWxpdGllcyB3aGljaCBtYWtlIHVzZSBvZiB0aGUgbGliYXZmb3JtYXQgbGlicmFyeQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfTEFWRlVUSUxTX0gKKyNkZWZpbmUgQVZGSUxURVJfTEFWRlVUSUxTX0gKKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisKKy8qKgorICogTG9hZCBpbWFnZSBmcm9tIGZpbGVuYW1lIGFuZCBwdXQgdGhlIHJlc3VsdGluZyBpbWFnZSBpbiBkYXRhLgorICoKKyAqIEBwYXJhbSB3IHBvaW50ZXIgdG8gdGhlIHdpZHRoIG9mIHRoZSBsb2FkZWQgaW1hZ2UKKyAqIEBwYXJhbSBoIHBvaW50ZXIgdG8gdGhlIGhlaWdodCBvZiB0aGUgbG9hZGVkIGltYWdlCisgKiBAcGFyYW0gcGl4X2ZtdCBwb2ludGVyIHRvIHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlIGxvYWRlZCBpbWFnZQorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBuYW1lIG9mIHRoZSBpbWFnZSBmaWxlIHRvIGxvYWQKKyAqIEBwYXJhbSBsb2dfY3R4IGxvZyBjb250ZXh0CisgKiBAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZmZfbG9hZF9pbWFnZSh1aW50OF90ICpkYXRhWzRdLCBpbnQgbGluZXNpemVbNF0sCisgICAgICAgICAgICAgICAgICBpbnQgKncsIGludCAqaCwgZW51bSBBVlBpeGVsRm9ybWF0ICpwaXhfZm10LAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmxvZ19jdHgpOworCisjZW5kaWYgIC8qIEFWRklMVEVSX0xBVkZVVElMU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvbGliYXZmaWx0ZXIudiBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJhdmZpbHRlci52Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZTg4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGliYXZmaWx0ZXIudgpAQCAtMCwwICsxLDQgQEAKK0xJQkFWRklMVEVSXyRNQUpPUiB7CisgICAgICAgIGdsb2JhbDogYXZmaWx0ZXJfKjsgYXZfKjsKKyAgICAgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL2F2X2hlbHBlcnMuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy9hdl9oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiNjdkNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy9hdl9oZWxwZXJzLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIEdlbmVyaWMgbGliYXYqIGhlbHBlcnMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBNUGxheWVyLgorICoKKyAqIE1QbGF5ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE1QbGF5ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIE1QbGF5ZXI7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBNUExBWUVSX0FWX0hFTFBFUlNfSAorI2RlZmluZSBNUExBWUVSX0FWX0hFTFBFUlNfSAorCit2b2lkIGZmX2luaXRfYXZjb2RlYyh2b2lkKTsKK3ZvaWQgZmZfaW5pdF9hdmZvcm1hdCh2b2lkKTsKKworI2VuZGlmIC8qIE1QTEFZRVJfQVZfSEVMUEVSU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvY3B1ZGV0ZWN0LmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvY3B1ZGV0ZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwZjZlNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy9jcHVkZXRlY3QuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTVBsYXllci4KKyAqCisgKiBNUGxheWVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBNUGxheWVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBNUGxheWVyOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgTVBMQVlFUl9DUFVERVRFQ1RfSAorI2RlZmluZSBNUExBWUVSX0NQVURFVEVDVF9ICisKKyNkZWZpbmUgQ1BVVFlQRV9JMzg2ICAgIDMKKyNkZWZpbmUgQ1BVVFlQRV9JNDg2ICAgIDQKKyNkZWZpbmUgQ1BVVFlQRV9JNTg2ICAgIDUKKyNkZWZpbmUgQ1BVVFlQRV9JNjg2ICAgIDYKKworI2luY2x1ZGUgImxpYmF2dXRpbC94ODZfY3B1LmgiCisKK3R5cGVkZWYgc3RydWN0IGNwdWNhcHNfcyB7CisgICAgaW50IGNwdVR5cGU7CisgICAgaW50IGNwdU1vZGVsOworICAgIGludCBjcHVTdGVwcGluZzsKKyAgICBpbnQgaGFzTU1YOworICAgIGludCBoYXNNTVgyOworICAgIGludCBoYXMzRE5vdzsKKyAgICBpbnQgaGFzM0ROb3dFeHQ7CisgICAgaW50IGhhc1NTRTsKKyAgICBpbnQgaGFzU1NFMjsKKyAgICBpbnQgaGFzU1NFMzsKKyAgICBpbnQgaGFzU1NTRTM7CisgICAgaW50IGhhc1NTRTQ7CisgICAgaW50IGhhc1NTRTQyOworICAgIGludCBoYXNTU0U0YTsKKyAgICBpbnQgaGFzQVZYOworICAgIGludCBpc1g4NjsKKyAgICB1bnNpZ25lZCBjbF9zaXplOyAvKiBzaXplIG9mIGNhY2hlIGxpbmUgKi8KKyAgICBpbnQgaGFzQWx0aVZlYzsKKyAgICBpbnQgaGFzVFNDOworfSBDcHVDYXBzOworCitleHRlcm4gQ3B1Q2FwcyBmZl9nQ3B1Q2FwczsKKwordm9pZCBmZl9kb19jcHVpZCh1bnNpZ25lZCBpbnQgYXgsIHVuc2lnbmVkIGludCAqcCk7CisKK3ZvaWQgZmZfR2V0Q3B1Q2FwcyhDcHVDYXBzICpjYXBzKTsKKworLyogcmV0dXJuZWQgdmFsdWUgaXMgbWFsbG9jKCknZWQgc28gZnJlZSgpIGl0IGFmdGVyIHVzZSAqLworY2hhciAqZmZfR2V0Q3B1RnJpZW5kbHlOYW1lKHVuc2lnbmVkIGludCByZWdzW10sIHVuc2lnbmVkIGludCByZWdzMltdKTsKKworI2VuZGlmIC8qIE1QTEFZRVJfQ1BVREVURUNUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy9pbWdfZm9ybWF0LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvaW1nX2Zvcm1hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDdmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvaW1nX2Zvcm1hdC5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTVBsYXllci4KKyAqCisgKiBNUGxheWVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBNUGxheWVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBNUGxheWVyOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJpbWdfZm9ybWF0LmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKKworY29uc3QgY2hhciAqZmZfdm9fZm9ybWF0X25hbWUoaW50IGZvcm1hdCkKK3sKKyAgICBzdGF0aWMgY2hhciB1bmtub3duX2Zvcm1hdFsyMF07CisgICAgc3dpdGNoKGZvcm1hdCkKKyAgICB7CisgICAgY2FzZSBJTUdGTVRfUkdCMTogICAgcmV0dXJuICJSR0IgMS1iaXQiOworICAgIGNhc2UgSU1HRk1UX1JHQjQ6ICAgIHJldHVybiAiUkdCIDQtYml0IjsKKyAgICBjYXNlIElNR0ZNVF9SRzRCOiAgICByZXR1cm4gIlJHQiA0LWJpdCBwZXIgYnl0ZSI7CisgICAgY2FzZSBJTUdGTVRfUkdCODogICAgcmV0dXJuICJSR0IgOC1iaXQiOworICAgIGNhc2UgSU1HRk1UX1JHQjEyOiAgIHJldHVybiAiUkdCIDEyLWJpdCI7CisgICAgY2FzZSBJTUdGTVRfUkdCMTU6ICAgcmV0dXJuICJSR0IgMTUtYml0IjsKKyAgICBjYXNlIElNR0ZNVF9SR0IxNjogICByZXR1cm4gIlJHQiAxNi1iaXQiOworICAgIGNhc2UgSU1HRk1UX1JHQjI0OiAgIHJldHVybiAiUkdCIDI0LWJpdCI7CisvLyAgY2FzZSBJTUdGTVRfUkdCMzI6ICAgcmV0dXJuICJSR0IgMzItYml0IjsKKyAgICBjYXNlIElNR0ZNVF9SR0I0OExFOiByZXR1cm4gIlJHQiA0OC1iaXQgTEUiOworICAgIGNhc2UgSU1HRk1UX1JHQjQ4QkU6IHJldHVybiAiUkdCIDQ4LWJpdCBCRSI7CisgICAgY2FzZSBJTUdGTVRfUkdCNjRMRTogcmV0dXJuICJSR0IgNjQtYml0IExFIjsKKyAgICBjYXNlIElNR0ZNVF9SR0I2NEJFOiByZXR1cm4gIlJHQiA2NC1iaXQgQkUiOworICAgIGNhc2UgSU1HRk1UX0JHUjE6ICAgIHJldHVybiAiQkdSIDEtYml0IjsKKyAgICBjYXNlIElNR0ZNVF9CR1I0OiAgICByZXR1cm4gIkJHUiA0LWJpdCI7CisgICAgY2FzZSBJTUdGTVRfQkc0QjogICAgcmV0dXJuICJCR1IgNC1iaXQgcGVyIGJ5dGUiOworICAgIGNhc2UgSU1HRk1UX0JHUjg6ICAgIHJldHVybiAiQkdSIDgtYml0IjsKKyAgICBjYXNlIElNR0ZNVF9CR1IxMjogICByZXR1cm4gIkJHUiAxMi1iaXQiOworICAgIGNhc2UgSU1HRk1UX0JHUjE1OiAgIHJldHVybiAiQkdSIDE1LWJpdCI7CisgICAgY2FzZSBJTUdGTVRfQkdSMTY6ICAgcmV0dXJuICJCR1IgMTYtYml0IjsKKyAgICBjYXNlIElNR0ZNVF9CR1IyNDogICByZXR1cm4gIkJHUiAyNC1iaXQiOworLy8gIGNhc2UgSU1HRk1UX0JHUjMyOiAgIHJldHVybiAiQkdSIDMyLWJpdCI7CisgICAgY2FzZSBJTUdGTVRfQUJHUjogICAgcmV0dXJuICJBQkdSIjsKKyAgICBjYXNlIElNR0ZNVF9CR1JBOiAgICByZXR1cm4gIkJHUkEiOworICAgIGNhc2UgSU1HRk1UX0FSR0I6ICAgIHJldHVybiAiQVJHQiI7CisgICAgY2FzZSBJTUdGTVRfUkdCQTogICAgcmV0dXJuICJSR0JBIjsKKyAgICBjYXNlIElNR0ZNVF9YWVoxMkxFOiByZXR1cm4gIlhZWiAzNi1iaXQgTEUiOworICAgIGNhc2UgSU1HRk1UX1hZWjEyQkU6IHJldHVybiAiWFlaIDM2LWJpdCBCRSI7CisgICAgY2FzZSBJTUdGTVRfR0JSMjRQOiAgcmV0dXJuICJQbGFuYXIgR0JSIDI0LWJpdCI7CisgICAgY2FzZSBJTUdGTVRfR0JSMTJQOiAgcmV0dXJuICJQbGFuYXIgR0JSIDM2LWJpdCI7CisgICAgY2FzZSBJTUdGTVRfR0JSMTRQOiAgcmV0dXJuICJQbGFuYXIgR0JSIDQyLWJpdCI7CisgICAgY2FzZSBJTUdGTVRfWVZVOTogICAgcmV0dXJuICJQbGFuYXIgWVZVOSI7CisgICAgY2FzZSBJTUdGTVRfSUYwOTogICAgcmV0dXJuICJQbGFuYXIgSUYwOSI7CisgICAgY2FzZSBJTUdGTVRfWVYxMjogICAgcmV0dXJuICJQbGFuYXIgWVYxMiI7CisgICAgY2FzZSBJTUdGTVRfSTQyMDogICAgcmV0dXJuICJQbGFuYXIgSTQyMCI7CisgICAgY2FzZSBJTUdGTVRfSVlVVjogICAgcmV0dXJuICJQbGFuYXIgSVlVViI7CisgICAgY2FzZSBJTUdGTVRfQ0xQTDogICAgcmV0dXJuICJQbGFuYXIgQ0xQTCI7CisgICAgY2FzZSBJTUdGTVRfWTgwMDogICAgcmV0dXJuICJQbGFuYXIgWTgwMCI7CisgICAgY2FzZSBJTUdGTVRfWTg6ICAgICAgcmV0dXJuICJQbGFuYXIgWTgiOworICAgIGNhc2UgSU1HRk1UX1k4QTogICAgIHJldHVybiAiUGxhbmFyIFk4IHdpdGggYWxwaGEiOworICAgIGNhc2UgSU1HRk1UX1kxNl9MRTogIHJldHVybiAiUGxhbmFyIFkxNiBsaXR0bGUtZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF9ZMTZfQkU6ICByZXR1cm4gIlBsYW5hciBZMTYgYmlnLWVuZGlhbiI7CisgICAgY2FzZSBJTUdGTVRfNDIwUDE2X0xFOiByZXR1cm4gIlBsYW5hciA0MjBQIDE2LWJpdCBsaXR0bGUtZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80MjBQMTZfQkU6IHJldHVybiAiUGxhbmFyIDQyMFAgMTYtYml0IGJpZy1lbmRpYW4iOworICAgIGNhc2UgSU1HRk1UXzQyMFAxNF9MRTogcmV0dXJuICJQbGFuYXIgNDIwUCAxNC1iaXQgbGl0dGxlLWVuZGlhbiI7CisgICAgY2FzZSBJTUdGTVRfNDIwUDE0X0JFOiByZXR1cm4gIlBsYW5hciA0MjBQIDE0LWJpdCBiaWctZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80MjBQMTJfTEU6IHJldHVybiAiUGxhbmFyIDQyMFAgMTItYml0IGxpdHRsZS1lbmRpYW4iOworICAgIGNhc2UgSU1HRk1UXzQyMFAxMl9CRTogcmV0dXJuICJQbGFuYXIgNDIwUCAxMi1iaXQgYmlnLWVuZGlhbiI7CisgICAgY2FzZSBJTUdGTVRfNDIwUDEwX0xFOiByZXR1cm4gIlBsYW5hciA0MjBQIDEwLWJpdCBsaXR0bGUtZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80MjBQMTBfQkU6IHJldHVybiAiUGxhbmFyIDQyMFAgMTAtYml0IGJpZy1lbmRpYW4iOworICAgIGNhc2UgSU1HRk1UXzQyMFA5X0xFOiAgcmV0dXJuICJQbGFuYXIgNDIwUCA5LWJpdCBsaXR0bGUtZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80MjBQOV9CRTogIHJldHVybiAiUGxhbmFyIDQyMFAgOS1iaXQgYmlnLWVuZGlhbiI7CisgICAgY2FzZSBJTUdGTVRfNDIyUDE2X0xFOiByZXR1cm4gIlBsYW5hciA0MjJQIDE2LWJpdCBsaXR0bGUtZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80MjJQMTZfQkU6IHJldHVybiAiUGxhbmFyIDQyMlAgMTYtYml0IGJpZy1lbmRpYW4iOworICAgIGNhc2UgSU1HRk1UXzQyMlAxNF9MRTogcmV0dXJuICJQbGFuYXIgNDIyUCAxNC1iaXQgbGl0dGxlLWVuZGlhbiI7CisgICAgY2FzZSBJTUdGTVRfNDIyUDE0X0JFOiByZXR1cm4gIlBsYW5hciA0MjJQIDE0LWJpdCBiaWctZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80MjJQMTJfTEU6IHJldHVybiAiUGxhbmFyIDQyMlAgMTItYml0IGxpdHRsZS1lbmRpYW4iOworICAgIGNhc2UgSU1HRk1UXzQyMlAxMl9CRTogcmV0dXJuICJQbGFuYXIgNDIyUCAxMi1iaXQgYmlnLWVuZGlhbiI7CisgICAgY2FzZSBJTUdGTVRfNDIyUDEwX0xFOiByZXR1cm4gIlBsYW5hciA0MjJQIDEwLWJpdCBsaXR0bGUtZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80MjJQMTBfQkU6IHJldHVybiAiUGxhbmFyIDQyMlAgMTAtYml0IGJpZy1lbmRpYW4iOworICAgIGNhc2UgSU1HRk1UXzQyMlA5X0xFOiAgcmV0dXJuICJQbGFuYXIgNDIyUCA5LWJpdCBsaXR0bGUtZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80MjJQOV9CRTogIHJldHVybiAiUGxhbmFyIDQyMlAgOS1iaXQgYmlnLWVuZGlhbiI7CisgICAgY2FzZSBJTUdGTVRfNDQ0UDE2X0xFOiByZXR1cm4gIlBsYW5hciA0NDRQIDE2LWJpdCBsaXR0bGUtZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80NDRQMTZfQkU6IHJldHVybiAiUGxhbmFyIDQ0NFAgMTYtYml0IGJpZy1lbmRpYW4iOworICAgIGNhc2UgSU1HRk1UXzQ0NFAxNF9MRTogcmV0dXJuICJQbGFuYXIgNDQ0UCAxNC1iaXQgbGl0dGxlLWVuZGlhbiI7CisgICAgY2FzZSBJTUdGTVRfNDQ0UDE0X0JFOiByZXR1cm4gIlBsYW5hciA0NDRQIDE0LWJpdCBiaWctZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80NDRQMTJfTEU6IHJldHVybiAiUGxhbmFyIDQ0NFAgMTItYml0IGxpdHRsZS1lbmRpYW4iOworICAgIGNhc2UgSU1HRk1UXzQ0NFAxMl9CRTogcmV0dXJuICJQbGFuYXIgNDQ0UCAxMi1iaXQgYmlnLWVuZGlhbiI7CisgICAgY2FzZSBJTUdGTVRfNDQ0UDEwX0xFOiByZXR1cm4gIlBsYW5hciA0NDRQIDEwLWJpdCBsaXR0bGUtZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80NDRQMTBfQkU6IHJldHVybiAiUGxhbmFyIDQ0NFAgMTAtYml0IGJpZy1lbmRpYW4iOworICAgIGNhc2UgSU1HRk1UXzQ0NFA5X0xFOiAgcmV0dXJuICJQbGFuYXIgNDQ0UCA5LWJpdCBsaXR0bGUtZW5kaWFuIjsKKyAgICBjYXNlIElNR0ZNVF80NDRQOV9CRTogIHJldHVybiAiUGxhbmFyIDQ0NFAgOS1iaXQgYmlnLWVuZGlhbiI7CisgICAgY2FzZSBJTUdGTVRfNDIwQTogcmV0dXJuICJQbGFuYXIgNDIwUCB3aXRoIGFscGhhIjsKKyAgICBjYXNlIElNR0ZNVF80NDRQOiByZXR1cm4gIlBsYW5hciA0NDRQIjsKKyAgICBjYXNlIElNR0ZNVF80NDRBOiByZXR1cm4gIlBsYW5hciA0NDRQIHdpdGggYWxwaGEiOworICAgIGNhc2UgSU1HRk1UXzQyMlA6IHJldHVybiAiUGxhbmFyIDQyMlAiOworICAgIGNhc2UgSU1HRk1UXzQyMkE6IHJldHVybiAiUGxhbmFyIDQyMlAgd2l0aCBhbHBoYSI7CisgICAgY2FzZSBJTUdGTVRfNDExUDogcmV0dXJuICJQbGFuYXIgNDExUCI7CisgICAgY2FzZSBJTUdGTVRfNDQwUDogcmV0dXJuICJQbGFuYXIgNDQwUCI7CisgICAgY2FzZSBJTUdGTVRfTlYxMjogcmV0dXJuICJQbGFuYXIgTlYxMiI7CisgICAgY2FzZSBJTUdGTVRfTlYyMTogcmV0dXJuICJQbGFuYXIgTlYyMSI7CisgICAgY2FzZSBJTUdGTVRfSE0xMjogcmV0dXJuICJQbGFuYXIgTlYxMiBNYWNyb2Jsb2NrIjsKKyAgICBjYXNlIElNR0ZNVF9JVVlWOiByZXR1cm4gIlBhY2tlZCBJVVlWIjsKKyAgICBjYXNlIElNR0ZNVF9JWTQxOiByZXR1cm4gIlBhY2tlZCBJWTQxIjsKKyAgICBjYXNlIElNR0ZNVF9JWVUxOiByZXR1cm4gIlBhY2tlZCBJWVUxIjsKKyAgICBjYXNlIElNR0ZNVF9JWVUyOiByZXR1cm4gIlBhY2tlZCBJWVUyIjsKKyAgICBjYXNlIElNR0ZNVF9VWVZZOiByZXR1cm4gIlBhY2tlZCBVWVZZIjsKKyAgICBjYXNlIElNR0ZNVF9VWU5WOiByZXR1cm4gIlBhY2tlZCBVWU5WIjsKKyAgICBjYXNlIElNR0ZNVF9jeXV2OiByZXR1cm4gIlBhY2tlZCBDWVVWIjsKKyAgICBjYXNlIElNR0ZNVF9ZNDIyOiByZXR1cm4gIlBhY2tlZCBZNDIyIjsKKyAgICBjYXNlIElNR0ZNVF9ZVVkyOiByZXR1cm4gIlBhY2tlZCBZVVkyIjsKKyAgICBjYXNlIElNR0ZNVF9ZVU5WOiByZXR1cm4gIlBhY2tlZCBZVU5WIjsKKyAgICBjYXNlIElNR0ZNVF9ZVllVOiByZXR1cm4gIlBhY2tlZCBZVllVIjsKKyAgICBjYXNlIElNR0ZNVF9ZNDFQOiByZXR1cm4gIlBhY2tlZCBZNDFQIjsKKyAgICBjYXNlIElNR0ZNVF9ZMjExOiByZXR1cm4gIlBhY2tlZCBZMjExIjsKKyAgICBjYXNlIElNR0ZNVF9ZNDFUOiByZXR1cm4gIlBhY2tlZCBZNDFUIjsKKyAgICBjYXNlIElNR0ZNVF9ZNDJUOiByZXR1cm4gIlBhY2tlZCBZNDJUIjsKKyAgICBjYXNlIElNR0ZNVF9WNDIyOiByZXR1cm4gIlBhY2tlZCBWNDIyIjsKKyAgICBjYXNlIElNR0ZNVF9WNjU1OiByZXR1cm4gIlBhY2tlZCBWNjU1IjsKKyAgICBjYXNlIElNR0ZNVF9DTEpSOiByZXR1cm4gIlBhY2tlZCBDTEpSIjsKKyAgICBjYXNlIElNR0ZNVF9ZVVZQOiByZXR1cm4gIlBhY2tlZCBZVVZQIjsKKyAgICBjYXNlIElNR0ZNVF9VWVZQOiByZXR1cm4gIlBhY2tlZCBVWVZQIjsKKyAgICBjYXNlIElNR0ZNVF9NUEVHUEVTOiAgICAgICAgIHJldHVybiAiTXBlZyBQRVMiOworICAgIGNhc2UgSU1HRk1UX1pSTUpQRUdOSTogICAgICAgcmV0dXJuICJab3JhbiBNSlBFRyBub24taW50ZXJsYWNlZCI7CisgICAgY2FzZSBJTUdGTVRfWlJNSlBFR0lUOiAgICAgICByZXR1cm4gIlpvcmFuIE1KUEVHIHRvcCBmaWVsZCBmaXJzdCI7CisgICAgY2FzZSBJTUdGTVRfWlJNSlBFR0lCOiAgICAgICByZXR1cm4gIlpvcmFuIE1KUEVHIGJvdHRvbSBmaWVsZCBmaXJzdCI7CisgICAgY2FzZSBJTUdGTVRfWFZNQ19NT0NPX01QRUcyOiByZXR1cm4gIk1QRUcxLzIgTW90aW9uIENvbXBlbnNhdGlvbiI7CisgICAgY2FzZSBJTUdGTVRfWFZNQ19JRENUX01QRUcyOiByZXR1cm4gIk1QRUcxLzIgTW90aW9uIENvbXBlbnNhdGlvbiBhbmQgSURDVCI7CisgICAgY2FzZSBJTUdGTVRfVkRQQVVfTVBFRzE6ICAgICByZXR1cm4gIk1QRUcxIFZEUEFVIGFjY2VsZXJhdGlvbiI7CisgICAgY2FzZSBJTUdGTVRfVkRQQVVfTVBFRzI6ICAgICByZXR1cm4gIk1QRUcyIFZEUEFVIGFjY2VsZXJhdGlvbiI7CisgICAgY2FzZSBJTUdGTVRfVkRQQVVfSDI2NDogICAgICByZXR1cm4gIkguMjY0IFZEUEFVIGFjY2VsZXJhdGlvbiI7CisgICAgY2FzZSBJTUdGTVRfVkRQQVVfTVBFRzQ6ICAgICByZXR1cm4gIk1QRUctNCBQYXJ0IDIgVkRQQVUgYWNjZWxlcmF0aW9uIjsKKyAgICBjYXNlIElNR0ZNVF9WRFBBVV9XTVYzOiAgICAgIHJldHVybiAiV01WMyBWRFBBVSBhY2NlbGVyYXRpb24iOworICAgIGNhc2UgSU1HRk1UX1ZEUEFVX1ZDMTogICAgICAgcmV0dXJuICJWQzEgVkRQQVUgYWNjZWxlcmF0aW9uIjsKKyAgICB9CisgICAgc25wcmludGYodW5rbm93bl9mb3JtYXQsMjAsIlVua25vd24gMHglMDR4Iixmb3JtYXQpOworICAgIHJldHVybiB1bmtub3duX2Zvcm1hdDsKK30KKworaW50IGZmX21wX2dldF9jaHJvbWFfc2hpZnQoaW50IGZvcm1hdCwgaW50ICp4X3NoaWZ0LCBpbnQgKnlfc2hpZnQsIGludCAqY29tcG9uZW50X2JpdHMpCit7CisgICAgaW50IHhzID0gMCwgeXMgPSAwOworICAgIGludCBicHA7CisgICAgaW50IGVyciA9IDA7CisgICAgaW50IGJpdHMgPSA4OworICAgIGlmICgoZm9ybWF0ICYgMHhmZjAwMDBmMCkgPT0gMHgzNDAwMDA1MCkKKyAgICAgICAgZm9ybWF0ID0gYXZfYnN3YXAzMihmb3JtYXQpOworICAgIGlmICgoZm9ybWF0ICYgMHhmMDAwMDBmZikgPT0gMHg1MDAwMDAzNCkgeworICAgICAgICBzd2l0Y2ggKGZvcm1hdCA+PiAyNCkgeworICAgICAgICBjYXNlIDB4NTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDUxOgorICAgICAgICAgICAgYml0cyA9IDE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg1MjoKKyAgICAgICAgICAgIGJpdHMgPSAxMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NTM6CisgICAgICAgICAgICBiaXRzID0gOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoZm9ybWF0ICYgMHgwMGZmZmZmZikgeworICAgICAgICBjYXNlIDB4MDAzNDM0MzQ6IC8vIDQ0NAorICAgICAgICAgICAgeHMgPSAwOworICAgICAgICAgICAgeXMgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMDMyMzIzNDogLy8gNDIyCisgICAgICAgICAgICB4cyA9IDE7CisgICAgICAgICAgICB5cyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMzAzMjM0OiAvLyA0MjAKKyAgICAgICAgICAgIHhzID0gMTsKKyAgICAgICAgICAgIHlzID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDAzMTMxMzQ6IC8vIDQxMQorICAgICAgICAgICAgeHMgPSAyOworICAgICAgICAgICAgeXMgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMDMwMzQzNDogLy8gNDQwCisgICAgICAgICAgICB4cyA9IDA7CisgICAgICAgICAgICB5cyA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVyciA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgSU1HRk1UXzQ0NEE6CisgICAgICAgIHhzID0gMDsKKyAgICAgICAgeXMgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElNR0ZNVF80MjJBOgorICAgICAgICB4cyA9IDE7CisgICAgICAgIHlzID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTUdGTVRfNDIwQToKKyAgICBjYXNlIElNR0ZNVF9JNDIwOgorICAgIGNhc2UgSU1HRk1UX0lZVVY6CisgICAgY2FzZSBJTUdGTVRfWVYxMjoKKyAgICAgICAgeHMgPSAxOworICAgICAgICB5cyA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU1HRk1UX0lGMDk6CisgICAgY2FzZSBJTUdGTVRfWVZVOToKKyAgICAgICAgeHMgPSAyOworICAgICAgICB5cyA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU1HRk1UX1k4OgorICAgIGNhc2UgSU1HRk1UX1k4MDA6CisgICAgICAgIHhzID0gMzE7CisgICAgICAgIHlzID0gMzE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU1HRk1UX05WMTI6CisgICAgY2FzZSBJTUdGTVRfTlYyMToKKyAgICAgICAgeHMgPSAxOworICAgICAgICB5cyA9IDE7CisgICAgICAgIC8vIFRPRE86IGFsbG93aW5nIHRoaXMgdGhvdWdoIGN1cnJlbnRseSBicmVha3MKKyAgICAgICAgLy8gdGhpbmdzIGFsbCBvdmVyIHRoZSBwbGFjZS4KKyAgICAgICAgZXJyID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh4X3NoaWZ0KSAqeF9zaGlmdCA9IHhzOworICAgIGlmICh5X3NoaWZ0KSAqeV9zaGlmdCA9IHlzOworICAgIGlmIChjb21wb25lbnRfYml0cykgKmNvbXBvbmVudF9iaXRzID0gYml0czsKKyAgICBicHAgPSA4ICsgKCgxNiA+PiB4cykgPj4geXMpOworICAgIGlmIChmb3JtYXQgPT0gSU1HRk1UXzQyMEEgfHwgZm9ybWF0ID09IElNR0ZNVF80MjJBIHx8IGZvcm1hdCA9PSBJTUdGTVRfNDQ0QSkKKyAgICAgICAgYnBwICs9IDg7CisgICAgYnBwICo9IChiaXRzICsgNykgPj4gMzsKKyAgICByZXR1cm4gZXJyID8gMCA6IGJwcDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy9pbWdfZm9ybWF0LmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvaW1nX2Zvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzBiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvaW1nX2Zvcm1hdC5oCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTVBsYXllci4KKyAqCisgKiBNUGxheWVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBNUGxheWVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBNUGxheWVyOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgTVBMQVlFUl9JTUdfRk9STUFUX0gKKyNkZWZpbmUgTVBMQVlFUl9JTUdfRk9STUFUX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisvKiBSR0IvQkdSIEZvcm1hdHMgKi8KKworI2RlZmluZSBJTUdGTVRfUkdCX01BU0sgMHhGRkZGRkYwMAorI2RlZmluZSBJTUdGTVRfUkdCICgoJ1InPDwyNCl8KCdHJzw8MTYpfCgnQic8PDgpKQorI2RlZmluZSBJTUdGTVRfUkdCMSAgKElNR0ZNVF9SR0J8MSkKKyNkZWZpbmUgSU1HRk1UX1JHQjQgIChJTUdGTVRfUkdCfDQpCisjZGVmaW5lIElNR0ZNVF9SR0I0X0NIQVIgIChJTUdGTVRfUkdCfDR8MTI4KSAvLyBSR0I0IHdpdGggMSBwaXhlbCBwZXIgYnl0ZQorI2RlZmluZSBJTUdGTVRfUkdCOCAgKElNR0ZNVF9SR0J8OCkKKyNkZWZpbmUgSU1HRk1UX1JHQjEyIChJTUdGTVRfUkdCfDEyKQorI2RlZmluZSBJTUdGTVRfUkdCMTUgKElNR0ZNVF9SR0J8MTUpCisjZGVmaW5lIElNR0ZNVF9SR0IxNiAoSU1HRk1UX1JHQnwxNikKKyNkZWZpbmUgSU1HRk1UX1JHQjI0IChJTUdGTVRfUkdCfDI0KQorI2RlZmluZSBJTUdGTVRfUkdCMzIgKElNR0ZNVF9SR0J8MzIpCisjZGVmaW5lIElNR0ZNVF9SR0I0OExFIChJTUdGTVRfUkdCfDQ4KQorI2RlZmluZSBJTUdGTVRfUkdCNDhCRSAoSU1HRk1UX1JHQnw0OHwxMjgpCisjZGVmaW5lIElNR0ZNVF9SR0I2NExFIChJTUdGTVRfUkdCfDY0KQorI2RlZmluZSBJTUdGTVRfUkdCNjRCRSAoSU1HRk1UX1JHQnw2NHwxMjgpCisKKyNkZWZpbmUgSU1HRk1UX0JHUl9NQVNLIDB4RkZGRkZGMDAKKyNkZWZpbmUgSU1HRk1UX0JHUiAoKCdCJzw8MjQpfCgnRyc8PDE2KXwoJ1InPDw4KSkKKyNkZWZpbmUgSU1HRk1UX0JHUjEgIChJTUdGTVRfQkdSfDEpCisjZGVmaW5lIElNR0ZNVF9CR1I0ICAoSU1HRk1UX0JHUnw0KQorI2RlZmluZSBJTUdGTVRfQkdSNF9DSEFSIChJTUdGTVRfQkdSfDR8MTI4KSAvLyBCR1I0IHdpdGggMSBwaXhlbCBwZXIgYnl0ZQorI2RlZmluZSBJTUdGTVRfQkdSOCAgKElNR0ZNVF9CR1J8OCkKKyNkZWZpbmUgSU1HRk1UX0JHUjEyIChJTUdGTVRfQkdSfDEyKQorI2RlZmluZSBJTUdGTVRfQkdSMTUgKElNR0ZNVF9CR1J8MTUpCisjZGVmaW5lIElNR0ZNVF9CR1IxNiAoSU1HRk1UX0JHUnwxNikKKyNkZWZpbmUgSU1HRk1UX0JHUjI0IChJTUdGTVRfQkdSfDI0KQorI2RlZmluZSBJTUdGTVRfQkdSMzIgKElNR0ZNVF9CR1J8MzIpCisKKyNkZWZpbmUgSU1HRk1UX1hZWl9NQVNLIDB4RkZGRkZGMDAKKyNkZWZpbmUgSU1HRk1UX1hZWiAoKCdYJzw8MjQpfCgnWSc8PDE2KXwoJ1onPDw4KSkKKyNkZWZpbmUgSU1HRk1UX1hZWjEyTEUgKElNR0ZNVF9YWVp8MTIpCisjZGVmaW5lIElNR0ZNVF9YWVoxMkJFIChJTUdGTVRfWFlafDEyfDEyOCkKKworI2RlZmluZSBJTUdGTVRfR0JSMjRQICgoJ0cnPDwyNCl8KCdCJzw8MTYpfCgnUic8PDgpfDI0KQorI2RlZmluZSBJTUdGTVRfR0JSMTJQTEUgKCgnRyc8PDI0KXwoJ0InPDwxNil8KCdSJzw8OCl8MzYpCisjZGVmaW5lIElNR0ZNVF9HQlIxMlBCRSAoKCdHJzw8MjQpfCgnQic8PDE2KXwoJ1InPDw4KXwzNnwxMjgpCisjZGVmaW5lIElNR0ZNVF9HQlIxNFBMRSAoKCdHJzw8MjQpfCgnQic8PDE2KXwoJ1InPDw4KXw0MikKKyNkZWZpbmUgSU1HRk1UX0dCUjE0UEJFICgoJ0cnPDwyNCl8KCdCJzw8MTYpfCgnUic8PDgpfDQyfDEyOCkKKworI2lmIEhBVkVfQklHRU5ESUFOCisjZGVmaW5lIElNR0ZNVF9BQkdSICAgIElNR0ZNVF9SR0IzMgorI2RlZmluZSBJTUdGTVRfQkdSQSAgICAoSU1HRk1UX1JHQjMyfDEyOCkKKyNkZWZpbmUgSU1HRk1UX0FSR0IgICAgSU1HRk1UX0JHUjMyCisjZGVmaW5lIElNR0ZNVF9SR0JBICAgIChJTUdGTVRfQkdSMzJ8MTI4KQorI2RlZmluZSBJTUdGTVRfUkdCNjRORSBJTUdGTVRfUkdCNjRCRQorI2RlZmluZSBJTUdGTVRfUkdCNDhORSBJTUdGTVRfUkdCNDhCRQorI2RlZmluZSBJTUdGTVRfUkdCMTJCRSBJTUdGTVRfUkdCMTIKKyNkZWZpbmUgSU1HRk1UX1JHQjEyTEUgKElNR0ZNVF9SR0IxMnwxMjgpCisjZGVmaW5lIElNR0ZNVF9SR0IxNUJFIElNR0ZNVF9SR0IxNQorI2RlZmluZSBJTUdGTVRfUkdCMTVMRSAoSU1HRk1UX1JHQjE1fDEyOCkKKyNkZWZpbmUgSU1HRk1UX1JHQjE2QkUgSU1HRk1UX1JHQjE2CisjZGVmaW5lIElNR0ZNVF9SR0IxNkxFIChJTUdGTVRfUkdCMTZ8MTI4KQorI2RlZmluZSBJTUdGTVRfQkdSMTJCRSBJTUdGTVRfQkdSMTIKKyNkZWZpbmUgSU1HRk1UX0JHUjEyTEUgKElNR0ZNVF9CR1IxMnwxMjgpCisjZGVmaW5lIElNR0ZNVF9CR1IxNUJFIElNR0ZNVF9CR1IxNQorI2RlZmluZSBJTUdGTVRfQkdSMTVMRSAoSU1HRk1UX0JHUjE1fDEyOCkKKyNkZWZpbmUgSU1HRk1UX0JHUjE2QkUgSU1HRk1UX0JHUjE2CisjZGVmaW5lIElNR0ZNVF9CR1IxNkxFIChJTUdGTVRfQkdSMTZ8MTI4KQorI2RlZmluZSBJTUdGTVRfWFlaMTIgIElNR0ZNVF9YWVoxMkJFCisjZGVmaW5lIElNR0ZNVF9HQlIxMlAgSU1HRk1UX0dCUjEyUEJFCisjZGVmaW5lIElNR0ZNVF9HQlIxNFAgSU1HRk1UX0dCUjE0UEJFCisjZWxzZQorI2RlZmluZSBJTUdGTVRfQUJHUiAoSU1HRk1UX0JHUjMyfDEyOCkKKyNkZWZpbmUgSU1HRk1UX0JHUkEgSU1HRk1UX0JHUjMyCisjZGVmaW5lIElNR0ZNVF9BUkdCIChJTUdGTVRfUkdCMzJ8MTI4KQorI2RlZmluZSBJTUdGTVRfUkdCQSBJTUdGTVRfUkdCMzIKKyNkZWZpbmUgSU1HRk1UX1JHQjY0TkUgSU1HRk1UX1JHQjY0TEUKKyNkZWZpbmUgSU1HRk1UX1JHQjQ4TkUgSU1HRk1UX1JHQjQ4TEUKKyNkZWZpbmUgSU1HRk1UX1JHQjEyQkUgKElNR0ZNVF9SR0IxMnwxMjgpCisjZGVmaW5lIElNR0ZNVF9SR0IxMkxFIElNR0ZNVF9SR0IxMgorI2RlZmluZSBJTUdGTVRfUkdCMTVCRSAoSU1HRk1UX1JHQjE1fDEyOCkKKyNkZWZpbmUgSU1HRk1UX1JHQjE1TEUgSU1HRk1UX1JHQjE1CisjZGVmaW5lIElNR0ZNVF9SR0IxNkJFIChJTUdGTVRfUkdCMTZ8MTI4KQorI2RlZmluZSBJTUdGTVRfUkdCMTZMRSBJTUdGTVRfUkdCMTYKKyNkZWZpbmUgSU1HRk1UX0JHUjEyQkUgKElNR0ZNVF9CR1IxMnwxMjgpCisjZGVmaW5lIElNR0ZNVF9CR1IxMkxFIElNR0ZNVF9CR1IxMgorI2RlZmluZSBJTUdGTVRfQkdSMTVCRSAoSU1HRk1UX0JHUjE1fDEyOCkKKyNkZWZpbmUgSU1HRk1UX0JHUjE1TEUgSU1HRk1UX0JHUjE1CisjZGVmaW5lIElNR0ZNVF9CR1IxNkJFIChJTUdGTVRfQkdSMTZ8MTI4KQorI2RlZmluZSBJTUdGTVRfQkdSMTZMRSBJTUdGTVRfQkdSMTYKKyNkZWZpbmUgSU1HRk1UX1hZWjEyICBJTUdGTVRfWFlaMTJMRQorI2RlZmluZSBJTUdGTVRfR0JSMTJQIElNR0ZNVF9HQlIxMlBMRQorI2RlZmluZSBJTUdGTVRfR0JSMTRQIElNR0ZNVF9HQlIxNFBMRQorI2VuZGlmCisKKy8qIG9sZCBuYW1lcyBmb3IgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBJTUdGTVRfUkc0QiAgSU1HRk1UX1JHQjRfQ0hBUgorI2RlZmluZSBJTUdGTVRfQkc0QiAgSU1HRk1UX0JHUjRfQ0hBUgorCisjZGVmaW5lIElNR0ZNVF9JU19SR0IoZm10KSAoKChmbXQpJklNR0ZNVF9SR0JfTUFTSyk9PUlNR0ZNVF9SR0IpCisjZGVmaW5lIElNR0ZNVF9JU19CR1IoZm10KSAoKChmbXQpJklNR0ZNVF9CR1JfTUFTSyk9PUlNR0ZNVF9CR1IpCisjZGVmaW5lIElNR0ZNVF9JU19YWVooZm10KSAoKChmbXQpJklNR0ZNVF9YWVpfTUFTSyk9PUlNR0ZNVF9YWVopCisKKyNkZWZpbmUgSU1HRk1UX1JHQl9ERVBUSChmbXQpICgoZm10KSYweDdGKQorI2RlZmluZSBJTUdGTVRfQkdSX0RFUFRIKGZtdCkgKChmbXQpJjB4N0YpCisjZGVmaW5lIElNR0ZNVF9YWVpfREVQVEgoZm10KSAoKGZtdCkmMHg3RikKKworCisvKiBQbGFuYXIgWVVWIEZvcm1hdHMgKi8KKworI2RlZmluZSBJTUdGTVRfWVZVOSAweDM5NTU1NjU5CisjZGVmaW5lIElNR0ZNVF9JRjA5IDB4MzkzMDQ2NDkKKyNkZWZpbmUgSU1HRk1UX1lWMTIgMHgzMjMxNTY1OQorI2RlZmluZSBJTUdGTVRfSTQyMCAweDMwMzIzNDQ5CisjZGVmaW5lIElNR0ZNVF9JWVVWIDB4NTY1NTU5NDkKKyNkZWZpbmUgSU1HRk1UX0NMUEwgMHg0QzUwNEM0MworI2RlZmluZSBJTUdGTVRfWTgwMCAweDMwMzAzODU5CisjZGVmaW5lIElNR0ZNVF9ZOCAgIDB4MjAyMDM4NTkKKyNkZWZpbmUgSU1HRk1UX05WMTIgMHgzMjMxNTY0RQorI2RlZmluZSBJTUdGTVRfTlYyMSAweDMxMzI1NjRFCisjZGVmaW5lIElNR0ZNVF9ZMTZfTEUgMHgyMDM2MzE1OQorCisvKiB1bm9mZmljaWFsIFBsYW5hciBGb3JtYXRzLCBGSVhNRSBpZiBvZmZpY2lhbCA0Q0MgZXhpc3RzICovCisjZGVmaW5lIElNR0ZNVF80NDRQIDB4NTAzNDM0MzQKKyNkZWZpbmUgSU1HRk1UXzQyMlAgMHg1MDMyMzIzNAorI2RlZmluZSBJTUdGTVRfNDExUCAweDUwMzEzMTM0CisjZGVmaW5lIElNR0ZNVF80NDBQIDB4NTAzMDM0MzQKKyNkZWZpbmUgSU1HRk1UX0hNMTIgMHgzMjMxNEQ0OAorI2RlZmluZSBJTUdGTVRfWTE2X0JFIDB4NTkzMTM2MjAKKworLy8gR3JheSB3aXRoIGFscGhhCisjZGVmaW5lIElNR0ZNVF9ZOEEgMHg1OTMyMDAwOAorLy8gNDoyOjAgcGxhbmFyIHdpdGggYWxwaGEKKyNkZWZpbmUgSU1HRk1UXzQyMEEgMHg0MTMwMzIzNAorLy8gNDoyOjIgcGxhbmFyIHdpdGggYWxwaGEKKyNkZWZpbmUgSU1HRk1UXzQyMkEgMHg0MTMyMzIzNAorLy8gNDo0OjQgcGxhbmFyIHdpdGggYWxwaGEKKyNkZWZpbmUgSU1HRk1UXzQ0NEEgMHg0MTM0MzQzNAorCisjZGVmaW5lIElNR0ZNVF80NDRQMTZfTEUgMHg1MTM0MzQzNAorI2RlZmluZSBJTUdGTVRfNDQ0UDE2X0JFIDB4MzQzNDM0NTEKKyNkZWZpbmUgSU1HRk1UXzQ0NFAxNF9MRSAweDU0MzQzNDM0CisjZGVmaW5lIElNR0ZNVF80NDRQMTRfQkUgMHgzNDM0MzQ1NAorI2RlZmluZSBJTUdGTVRfNDQ0UDEyX0xFIDB4NTUzNDM0MzQKKyNkZWZpbmUgSU1HRk1UXzQ0NFAxMl9CRSAweDM0MzQzNDU1CisjZGVmaW5lIElNR0ZNVF80NDRQMTBfTEUgMHg1MjM0MzQzNAorI2RlZmluZSBJTUdGTVRfNDQ0UDEwX0JFIDB4MzQzNDM0NTIKKyNkZWZpbmUgSU1HRk1UXzQ0NFA5X0xFICAweDUzMzQzNDM0CisjZGVmaW5lIElNR0ZNVF80NDRQOV9CRSAgMHgzNDM0MzQ1MworI2RlZmluZSBJTUdGTVRfNDIyUDE2X0xFIDB4NTEzMjMyMzQKKyNkZWZpbmUgSU1HRk1UXzQyMlAxNl9CRSAweDM0MzIzMjUxCisjZGVmaW5lIElNR0ZNVF80MjJQMTRfTEUgMHg1NDMyMzIzNAorI2RlZmluZSBJTUdGTVRfNDIyUDE0X0JFIDB4MzQzMjMyNTQKKyNkZWZpbmUgSU1HRk1UXzQyMlAxMl9MRSAweDU1MzIzMjM0CisjZGVmaW5lIElNR0ZNVF80MjJQMTJfQkUgMHgzNDMyMzI1NQorI2RlZmluZSBJTUdGTVRfNDIyUDEwX0xFIDB4NTIzMjMyMzQKKyNkZWZpbmUgSU1HRk1UXzQyMlAxMF9CRSAweDM0MzIzMjUyCisjZGVmaW5lIElNR0ZNVF80MjJQOV9MRSAgMHg1MzMyMzIzNAorI2RlZmluZSBJTUdGTVRfNDIyUDlfQkUgIDB4MzQzMjMyNTMKKyNkZWZpbmUgSU1HRk1UXzQyMFAxNl9MRSAweDUxMzAzMjM0CisjZGVmaW5lIElNR0ZNVF80MjBQMTZfQkUgMHgzNDMyMzA1MQorI2RlZmluZSBJTUdGTVRfNDIwUDE0X0xFIDB4NTQzMDMyMzQKKyNkZWZpbmUgSU1HRk1UXzQyMFAxNF9CRSAweDM0MzIzMDU0CisjZGVmaW5lIElNR0ZNVF80MjBQMTJfTEUgMHg1NTMwMzIzNAorI2RlZmluZSBJTUdGTVRfNDIwUDEyX0JFIDB4MzQzMjMwNTUKKyNkZWZpbmUgSU1HRk1UXzQyMFAxMF9MRSAweDUyMzAzMjM0CisjZGVmaW5lIElNR0ZNVF80MjBQMTBfQkUgMHgzNDMyMzA1MgorI2RlZmluZSBJTUdGTVRfNDIwUDlfTEUgIDB4NTMzMDMyMzQKKyNkZWZpbmUgSU1HRk1UXzQyMFA5X0JFICAweDM0MzIzMDUzCisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgSU1HRk1UXzQ0NFAxNiBJTUdGTVRfNDQ0UDE2X0JFCisjZGVmaW5lIElNR0ZNVF80NDRQMTQgSU1HRk1UXzQ0NFAxNF9CRQorI2RlZmluZSBJTUdGTVRfNDQ0UDEyIElNR0ZNVF80NDRQMTJfQkUKKyNkZWZpbmUgSU1HRk1UXzQ0NFAxMCBJTUdGTVRfNDQ0UDEwX0JFCisjZGVmaW5lIElNR0ZNVF80NDRQOSAgSU1HRk1UXzQ0NFA5X0JFCisjZGVmaW5lIElNR0ZNVF80MjJQMTYgSU1HRk1UXzQyMlAxNl9CRQorI2RlZmluZSBJTUdGTVRfNDIyUDE0IElNR0ZNVF80MjJQMTRfQkUKKyNkZWZpbmUgSU1HRk1UXzQyMlAxMiBJTUdGTVRfNDIyUDEyX0JFCisjZGVmaW5lIElNR0ZNVF80MjJQMTAgSU1HRk1UXzQyMlAxMF9CRQorI2RlZmluZSBJTUdGTVRfNDIyUDkgIElNR0ZNVF80MjJQOV9CRQorI2RlZmluZSBJTUdGTVRfNDIwUDE2IElNR0ZNVF80MjBQMTZfQkUKKyNkZWZpbmUgSU1HRk1UXzQyMFAxNCBJTUdGTVRfNDIwUDE0X0JFCisjZGVmaW5lIElNR0ZNVF80MjBQMTIgSU1HRk1UXzQyMFAxMl9CRQorI2RlZmluZSBJTUdGTVRfNDIwUDEwIElNR0ZNVF80MjBQMTBfQkUKKyNkZWZpbmUgSU1HRk1UXzQyMFA5ICBJTUdGTVRfNDIwUDlfQkUKKyNkZWZpbmUgSU1HRk1UX1kxNiAgICBJTUdGTVRfWTE2X0JFCisjZGVmaW5lIElNR0ZNVF9JU19ZVVZQMTZfTkUoZm10KSBJTUdGTVRfSVNfWVVWUDE2X0JFKGZtdCkKKyNlbHNlCisjZGVmaW5lIElNR0ZNVF80NDRQMTYgSU1HRk1UXzQ0NFAxNl9MRQorI2RlZmluZSBJTUdGTVRfNDQ0UDE0IElNR0ZNVF80NDRQMTRfTEUKKyNkZWZpbmUgSU1HRk1UXzQ0NFAxMiBJTUdGTVRfNDQ0UDEyX0xFCisjZGVmaW5lIElNR0ZNVF80NDRQMTAgSU1HRk1UXzQ0NFAxMF9MRQorI2RlZmluZSBJTUdGTVRfNDQ0UDkgIElNR0ZNVF80NDRQOV9MRQorI2RlZmluZSBJTUdGTVRfNDIyUDE2IElNR0ZNVF80MjJQMTZfTEUKKyNkZWZpbmUgSU1HRk1UXzQyMlAxNCBJTUdGTVRfNDIyUDE0X0xFCisjZGVmaW5lIElNR0ZNVF80MjJQMTIgSU1HRk1UXzQyMlAxMl9MRQorI2RlZmluZSBJTUdGTVRfNDIyUDEwIElNR0ZNVF80MjJQMTBfTEUKKyNkZWZpbmUgSU1HRk1UXzQyMlA5ICBJTUdGTVRfNDIyUDlfTEUKKyNkZWZpbmUgSU1HRk1UXzQyMFAxNiBJTUdGTVRfNDIwUDE2X0xFCisjZGVmaW5lIElNR0ZNVF80MjBQMTQgSU1HRk1UXzQyMFAxNF9MRQorI2RlZmluZSBJTUdGTVRfNDIwUDEyIElNR0ZNVF80MjBQMTJfTEUKKyNkZWZpbmUgSU1HRk1UXzQyMFAxMCBJTUdGTVRfNDIwUDEwX0xFCisjZGVmaW5lIElNR0ZNVF80MjBQOSAgSU1HRk1UXzQyMFA5X0xFCisjZGVmaW5lIElNR0ZNVF9ZMTYgICAgSU1HRk1UX1kxNl9MRQorI2RlZmluZSBJTUdGTVRfSVNfWVVWUDE2X05FKGZtdCkgSU1HRk1UX0lTX1lVVlAxNl9MRShmbXQpCisjZW5kaWYKKworI2RlZmluZSBJTUdGTVRfSVNfWVVWUDE2X0xFKGZtdCkgKCgoZm10IC0gMHg1MTAwMDAzNCkgJiAweGZjMDAwMGZmKSA9PSAwKQorI2RlZmluZSBJTUdGTVRfSVNfWVVWUDE2X0JFKGZtdCkgKCgoZm10IC0gMHgzNDAwMDA1MSkgJiAweGZmMDAwMGZjKSA9PSAwKQorI2RlZmluZSBJTUdGTVRfSVNfWVVWUDE2KGZtdCkgICAgKElNR0ZNVF9JU19ZVVZQMTZfTEUoZm10KSB8fCBJTUdGTVRfSVNfWVVWUDE2X0JFKGZtdCkpCisKKy8qKgorICogXGJyaWVmIEZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgZnVsbCAxNiBiaXQgZm9ybWF0LCBpLmUuIElNR0ZNVF80MjBQMTBfTEUgLT4gSU1HRk1UXzQyMFAxNl9MRQorICogXHJldHVybiBub3JtYWxpemVkIGZvcm1hdCBJRCBvciAwIGlmIG5vbmUgZXhpc3RzLgorICovCitzdGF0aWMgaW5saW5lIGludCBub3JtYWxpemVfeXV2cDE2KGludCBmbXQpIHsKKyAgICBpZiAoSU1HRk1UX0lTX1lVVlAxNl9MRShmbXQpKQorICAgICAgICByZXR1cm4gKGZtdCAmIDB4MDBmZmZmZmYpIHwgMHg1MTAwMDAwMDsKKyAgICBpZiAoSU1HRk1UX0lTX1lVVlAxNl9CRShmbXQpKQorICAgICAgICByZXR1cm4gKGZtdCAmIDB4ZmZmZmZmMDApIHwgMHgwMDAwMDA1MTsKKyAgICByZXR1cm4gMDsKK30KKworLyogUGFja2VkIFlVViBGb3JtYXRzICovCisKKyNkZWZpbmUgSU1HRk1UX0lVWVYgMHg1NjU5NTU0OSAvLyBJbnRlcmxhY2VkIFVZVlkKKyNkZWZpbmUgSU1HRk1UX0lZNDEgMHgzMTQzNTk0OSAvLyBJbnRlcmxhY2VkIFk0MVAKKyNkZWZpbmUgSU1HRk1UX0lZVTEgMHgzMTU1NTk0OQorI2RlZmluZSBJTUdGTVRfSVlVMiAweDMyNTU1OTQ5CisjZGVmaW5lIElNR0ZNVF9VWVZZIDB4NTk1NjU5NTUKKyNkZWZpbmUgSU1HRk1UX1VZTlYgMHg1NjRFNTk1NSAvLyBFeGFjdGx5IHNhbWUgYXMgVVlWWQorI2RlZmluZSBJTUdGTVRfY3l1diAweDc2NzU3OTYzIC8vIHVwc2lkZS1kb3duIFVZVlkKKyNkZWZpbmUgSU1HRk1UX1k0MjIgMHgzMjMyMzQ1OSAvLyBFeGFjdGx5IHNhbWUgYXMgVVlWWQorI2RlZmluZSBJTUdGTVRfWVVZMiAweDMyNTk1NTU5CisjZGVmaW5lIElNR0ZNVF9ZVU5WIDB4NTY0RTU1NTkgLy8gRXhhY3RseSBzYW1lIGFzIFlVWTIKKyNkZWZpbmUgSU1HRk1UX1lWWVUgMHg1NTU5NTY1OQorI2RlZmluZSBJTUdGTVRfWTQxUCAweDUwMzEzNDU5CisjZGVmaW5lIElNR0ZNVF9ZMjExIDB4MzEzMTMyNTkKKyNkZWZpbmUgSU1HRk1UX1k0MVQgMHg1NDMxMzQ1OSAvLyBZNDFQLCBZIGxzYiA9IHRyYW5zcGFyZW5jeQorI2RlZmluZSBJTUdGTVRfWTQyVCAweDU0MzIzNDU5IC8vIFVZVlksIFkgbHNiID0gdHJhbnNwYXJlbmN5CisjZGVmaW5lIElNR0ZNVF9WNDIyIDB4MzIzMjM0NTYgLy8gdXBzaWRlLWRvd24gVVlWWT8KKyNkZWZpbmUgSU1HRk1UX1Y2NTUgMHgzNTM1MzY1NgorI2RlZmluZSBJTUdGTVRfQ0xKUiAweDUyNEE0QzQzCisjZGVmaW5lIElNR0ZNVF9ZVVZQIDB4NTA1NjU1NTkgLy8gMTAtYml0IFlVWVYKKyNkZWZpbmUgSU1HRk1UX1VZVlAgMHg1MDU2NTk1NSAvLyAxMC1iaXQgVVlWWQorCisvKiBDb21wcmVzc2VkIEZvcm1hdHMgKi8KKyNkZWZpbmUgSU1HRk1UX01QRUdQRVMgKCgnTSc8PDI0KXwoJ1AnPDwxNil8KCdFJzw8OCl8KCdTJykpCisjZGVmaW5lIElNR0ZNVF9NSlBFRyAoKCdNJyl8KCdKJzw8OCl8KCdQJzw8MTYpfCgnRyc8PDI0KSkKKy8qIEZvcm1hdHMgdGhhdCBhcmUgdW5kZXJzdG9vZCBieSB6b3JhbiBjaGlwcywgd2UgaW5jbHVkZQorICogbm9uLWludGVybGFjZWQsIGludGVybGFjZWQgdG9wLWZpcnN0LCBpbnRlcmxhY2VkIGJvdHRvbS1maXJzdCAqLworI2RlZmluZSBJTUdGTVRfWlJNSlBFR05JICAoKCdaJzw8MjQpfCgnUic8PDE2KXwoJ04nPDw4KXwoJ0knKSkKKyNkZWZpbmUgSU1HRk1UX1pSTUpQRUdJVCAoKCdaJzw8MjQpfCgnUic8PDE2KXwoJ0knPDw4KXwoJ1QnKSkKKyNkZWZpbmUgSU1HRk1UX1pSTUpQRUdJQiAoKCdaJzw8MjQpfCgnUic8PDE2KXwoJ0knPDw4KXwoJ0InKSkKKworLy8gSSB0aGluayB0aGF0IHRoaXMgY29kZSBjb3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgY29kZWMvZm9ybWF0CisjZGVmaW5lIElNR0ZNVF9YVk1DIDB4MURDNzAwMDAKKyNkZWZpbmUgSU1HRk1UX1hWTUNfTUFTSyAweEZGRkYwMDAwCisjZGVmaW5lIElNR0ZNVF9JU19YVk1DKGZtdCkgKCgoZm10KSZJTUdGTVRfWFZNQ19NQVNLKT09SU1HRk1UX1hWTUMpCisvL3RoZXNlIGFyZSBjaHJvbWE0MjAKKyNkZWZpbmUgSU1HRk1UX1hWTUNfTU9DT19NUEVHMiAoSU1HRk1UX1hWTUN8MHgwMikKKyNkZWZpbmUgSU1HRk1UX1hWTUNfSURDVF9NUEVHMiAoSU1HRk1UX1hWTUN8MHg4MikKKworLy8gVkRQQVUgc3BlY2lmaWMgZm9ybWF0LgorI2RlZmluZSBJTUdGTVRfVkRQQVUgICAgICAgICAgICAgICAweDFEQzgwMDAwCisjZGVmaW5lIElNR0ZNVF9WRFBBVV9NQVNLICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgSU1HRk1UX0lTX1ZEUEFVKGZtdCkgICAgICAgKCgoZm10KSZJTUdGTVRfVkRQQVVfTUFTSyk9PUlNR0ZNVF9WRFBBVSkKKyNkZWZpbmUgSU1HRk1UX1ZEUEFVX01QRUcxICAgICAgICAgKElNR0ZNVF9WRFBBVXwweDAxKQorI2RlZmluZSBJTUdGTVRfVkRQQVVfTVBFRzIgICAgICAgICAoSU1HRk1UX1ZEUEFVfDB4MDIpCisjZGVmaW5lIElNR0ZNVF9WRFBBVV9IMjY0ICAgICAgICAgIChJTUdGTVRfVkRQQVV8MHgwMykKKyNkZWZpbmUgSU1HRk1UX1ZEUEFVX1dNVjMgICAgICAgICAgKElNR0ZNVF9WRFBBVXwweDA0KQorI2RlZmluZSBJTUdGTVRfVkRQQVVfVkMxICAgICAgICAgICAoSU1HRk1UX1ZEUEFVfDB4MDUpCisjZGVmaW5lIElNR0ZNVF9WRFBBVV9NUEVHNCAgICAgICAgIChJTUdGTVRfVkRQQVV8MHgwNikKKworI2RlZmluZSBJTUdGTVRfSVNfSFdBQ0NFTChmbXQpIChJTUdGTVRfSVNfVkRQQVUoZm10KSB8fCBJTUdGTVRfSVNfWFZNQyhmbXQpKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCogZGF0YTsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgaWQ7ICAgICAgICAvLyBzdHJlYW0gaWQuIHVzdWFsbHkgMHgxRTAKKyAgICBpbnQgdGltZXN0YW1wOyAvLyBwdHMsIDkwMDAwIEh6IGNvdW50ZXIgYmFzZWQKK30gdm9fbXBlZ3Blc190OworCitjb25zdCBjaGFyICpmZl92b19mb3JtYXRfbmFtZShpbnQgZm9ybWF0KTsKKworLyoqCisgKiBDYWxjdWxhdGVzIHRoZSBzY2FsZSBzaGlmdHMgZm9yIHRoZSBjaHJvbWEgcGxhbmVzIGZvciBwbGFuYXIgWVVWCisgKgorICogXHBhcmFtIGNvbXBvbmVudF9iaXRzIGJpdHMgcGVyIGNvbXBvbmVudAorICogXHJldHVybiBiaXRzLXBlci1waXhlbCBmb3IgZm9ybWF0IGlmIHN1Y2Nlc3NmdWwgKGkuZS4gZm9ybWF0IGlzIDMgb3IgNC1wbGFuZXMgcGxhbmFyIFlVViksIDAgb3RoZXJ3aXNlCisgKi8KK2ludCBmZl9tcF9nZXRfY2hyb21hX3NoaWZ0KGludCBmb3JtYXQsIGludCAqeF9zaGlmdCwgaW50ICp5X3NoaWZ0LCBpbnQgKmNvbXBvbmVudF9iaXRzKTsKKworI2VuZGlmIC8qIE1QTEFZRVJfSU1HX0ZPUk1BVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvbGlidm8vZmFzdG1lbWNweS5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL2xpYnZvL2Zhc3RtZW1jcHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTE3ZDAxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL2xpYnZvL2Zhc3RtZW1jcHkuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTVBsYXllci4KKyAqCisgKiBNUGxheWVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBNUGxheWVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIE1QbGF5ZXI7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIE1QTEFZRVJfRkFTVE1FTUNQWV9ICisjZGVmaW5lIE1QTEFZRVJfRkFTVE1FTUNQWV9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCit2b2lkICogZmFzdF9tZW1jcHkodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IGxlbik7Cit2b2lkICogbWVtMmFncGNweSh2b2lkICogdG8sIGNvbnN0IHZvaWQgKiBmcm9tLCBzaXplX3QgbGVuKTsKKworI2lmICEgZGVmaW5lZChDT05GSUdfRkFTVE1FTUNQWSkgfHwgISAoSEFWRV9NTVggfHwgSEFWRV9NTVgyIHx8IEhBVkVfQU1EM0ROT1cgLyogfHwgSEFWRV9TU0UgfHwgSEFWRV9TU0UyICovKQorI2RlZmluZSBtZW0yYWdwY3B5KGEsYixjKSBtZW1jcHkoYSxiLGMpCisjZGVmaW5lIGZhc3RfbWVtY3B5KGEsYixjKSBtZW1jcHkoYSxiLGMpCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkICogbWVtMmFncGNweV9waWModm9pZCAqIGRzdCwgY29uc3Qgdm9pZCAqIHNyYywgaW50IGJ5dGVzUGVyTGluZSwgaW50IGhlaWdodCwgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICB2b2lkICpyZXR2YWw9ZHN0OworCisgICAgaWYoZHN0U3RyaWRlID09IHNyY1N0cmlkZSkKKyAgICB7CisgICAgICAgIGlmIChzcmNTdHJpZGUgPCAwKSB7CisgICAgICAgICAgICAgICAgc3JjID0gKGNvbnN0IHVpbnQ4X3QqKXNyYyArIChoZWlnaHQtMSkqc3JjU3RyaWRlOworICAgICAgICAgICAgICAgIGRzdCA9ICh1aW50OF90Kilkc3QgKyAoaGVpZ2h0LTEpKmRzdFN0cmlkZTsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSAtc3JjU3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgbWVtMmFncGNweShkc3QsIHNyYywgc3JjU3RyaWRlKmhlaWdodCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvcihpPTA7IGk8aGVpZ2h0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbTJhZ3BjcHkoZHN0LCBzcmMsIGJ5dGVzUGVyTGluZSk7CisgICAgICAgICAgICBzcmMgPSAoY29uc3QgdWludDhfdCopc3JjICsgc3JjU3RyaWRlOworICAgICAgICAgICAgZHN0ID0gKHVpbnQ4X3QqKWRzdCArIGRzdFN0cmlkZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgbWVtY3B5X3BpYyhkLCBzLCBiLCBoLCBkcywgc3MpIG1lbWNweV9waWMyKGQsIHMsIGIsIGgsIGRzLCBzcywgMCkKKyNkZWZpbmUgbXlfbWVtY3B5X3BpYyhkLCBzLCBiLCBoLCBkcywgc3MpIG1lbWNweV9waWMyKGQsIHMsIGIsIGgsIGRzLCBzcywgMSkKKworLyoqCisgKiBccGFyYW0gbGltaXQyd2lkdGggYWx3YXlzIHNraXAgZGF0YSBiZXR3ZWVuIGVuZCBvZiBsaW5lIGFuZCBzdGFydCBvZiBuZXh0CisgKiAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBjb3B5aW5nIHRoZSBmdWxsIGJsb2NrIHdoZW4gc3RyaWRlcyBhcmUgdGhlIHNhbWUKKyAqLworc3RhdGljIGlubGluZSB2b2lkICogbWVtY3B5X3BpYzIodm9pZCAqIGRzdCwgY29uc3Qgdm9pZCAqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1BlckxpbmUsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgbGltaXQyd2lkdGgpCit7CisgICAgaW50IGk7CisgICAgdm9pZCAqcmV0dmFsPWRzdDsKKworICAgIGlmKCFsaW1pdDJ3aWR0aCAmJiBkc3RTdHJpZGUgPT0gc3JjU3RyaWRlKQorICAgIHsKKyAgICAgICAgaWYgKHNyY1N0cmlkZSA8IDApIHsKKyAgICAgICAgICAgICAgICBzcmMgPSAoY29uc3QgdWludDhfdCopc3JjICsgKGhlaWdodC0xKSpzcmNTdHJpZGU7CisgICAgICAgICAgICAgICAgZHN0ID0gKHVpbnQ4X3QqKWRzdCArIChoZWlnaHQtMSkqZHN0U3RyaWRlOworICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IC1zcmNTdHJpZGU7CisgICAgICAgIH0KKworICAgICAgICBmYXN0X21lbWNweShkc3QsIHNyYywgc3JjU3RyaWRlKmhlaWdodCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvcihpPTA7IGk8aGVpZ2h0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhc3RfbWVtY3B5KGRzdCwgc3JjLCBieXRlc1BlckxpbmUpOworICAgICAgICAgICAgc3JjID0gKGNvbnN0IHVpbnQ4X3QqKXNyYyArIHNyY1N0cmlkZTsKKyAgICAgICAgICAgIGRzdCA9ICh1aW50OF90Kilkc3QgKyBkc3RTdHJpZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYgLyogTVBMQVlFUl9GQVNUTUVNQ1BZX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy9saWJ2by92aWRlb19vdXQuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy9saWJ2by92aWRlb19vdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQzMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL2xpYnZvL3ZpZGVvX291dC5oCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSBBYXJvbiBIb2x0em1hbiAtIEF1ZyAxOTk5CisgKiBTdHJvbmdseSBtb2RpZmllZCwgbW9zdCBwYXJ0cyByZXdyaXR0ZW46IEEncnBpL0VTUC10ZWFtIC0gMjAwMC0yMDAxCisgKiAoQykgTVBsYXllciBkZXZlbG9wZXJzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTVBsYXllci4KKyAqCisgKiBNUGxheWVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBNUGxheWVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBNUGxheWVyOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgTVBMQVlFUl9WSURFT19PVVRfSAorI2RlZmluZSBNUExBWUVSX1ZJREVPX09VVF9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvLyNpbmNsdWRlICJzdWIvZm9udF9sb2FkLmgiCisjaW5jbHVkZSAiLi4vaW1nX2Zvcm1hdC5oIgorLy8jaW5jbHVkZSAidmlkaXgvdmlkaXguaCIKKworCisjZGVmaW5lIFJPVEFURSh0LCB4LCB5KSBkbyB7IFwKKyAgdCByb3RfdG1wID0geDsgXAorICB4ID0geTsgXAorICB5ID0gLXJvdF90bXA7IFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBWT19FVkVOVF9FWFBPU0UgMQorI2RlZmluZSBWT19FVkVOVF9SRVNJWkUgMgorI2RlZmluZSBWT19FVkVOVF9LRVlQUkVTUyA0CisjZGVmaW5lIFZPX0VWRU5UX1JFSU5JVCA4CisjZGVmaW5lIFZPX0VWRU5UX01PVkUgMTYKKyNkZWZpbmUgVk9fRVZFTlRfTU9VU0UgMzIKKworLyogT2Jzb2xldGU6IFZPQ1RSTF9RVUVSWV9WQUEgMSAqLworLyogZG9lcyB0aGUgZGV2aWNlIHN1cHBvcnQgdGhlIHJlcXVpcmVkIGZvcm1hdCAqLworI2RlZmluZSBWT0NUUkxfUVVFUllfRk9STUFUIDIKKy8qIHNpZ25hbCBhIGRldmljZSByZXNldCBzZWVrICovCisjZGVmaW5lIFZPQ1RSTF9SRVNFVCAzCisvKiB0cnVlIGlmIHZvIGRyaXZlciBjYW4gdXNlIEdVSSBjcmVhdGVkIHdpbmRvd3MgKi8KKyNkZWZpbmUgVk9DVFJMX0dVSVNVUFBPUlQgNAorLyogdXNlZCB0byBzd2l0Y2ggdG8gZnVsbHNjcmVlbiAqLworI2RlZmluZSBWT0NUUkxfRlVMTFNDUkVFTiA1CisvKiBzaWduYWwgYSBkZXZpY2UgcGF1c2UgKi8KKyNkZWZpbmUgVk9DVFJMX1BBVVNFIDcKKy8qIHN0YXJ0L3Jlc3VtZSBwbGF5YmFjayAqLworI2RlZmluZSBWT0NUUkxfUkVTVU1FIDgKKy8qIGxpYm1wY29kZWNzIGRpcmVjdCByZW5kZXJpbmc6ICovCisjZGVmaW5lIFZPQ1RSTF9HRVRfSU1BR0UgOQorI2RlZmluZSBWT0NUUkxfRFJBV19JTUFHRSAxMworI2RlZmluZSBWT0NUUkxfU0VUX1NQVV9QQUxFVFRFIDE0CisvKiBkZWNvZGluZyBhaGVhZDogKi8KKyNkZWZpbmUgVk9DVFJMX0dFVF9OVU1fRlJBTUVTIDEwCisjZGVmaW5lIFZPQ1RSTF9HRVRfRlJBTUVfTlVNICAxMQorI2RlZmluZSBWT0NUUkxfU0VUX0ZSQU1FX05VTSAgMTIKKyNkZWZpbmUgVk9DVFJMX0dFVF9QQU5TQ0FOIDE1CisjZGVmaW5lIFZPQ1RSTF9TRVRfUEFOU0NBTiAxNgorLyogZXF1YWxpemVyIGNvbnRyb2xzICovCisjZGVmaW5lIFZPQ1RSTF9TRVRfRVFVQUxJWkVSIDE3CisjZGVmaW5lIFZPQ1RSTF9HRVRfRVFVQUxJWkVSIDE4CisvKiBGcmFtZSBkdXBsaWNhdGlvbiAqLworI2RlZmluZSBWT0NUUkxfRFVQTElDQVRFX0ZSQU1FIDIwCisvLyAuLi4gMjEKKyNkZWZpbmUgVk9DVFJMX1NUQVJUX1NMSUNFIDIxCisKKyNkZWZpbmUgVk9DVFJMX09OVE9QIDI1CisjZGVmaW5lIFZPQ1RSTF9ST09UV0lOIDI2CisjZGVmaW5lIFZPQ1RSTF9CT1JERVIgMjcKKyNkZWZpbmUgVk9DVFJMX0RSQVdfRU9TRCAyOAorI2RlZmluZSBWT0NUUkxfR0VUX0VPU0RfUkVTIDI5CisKKyNkZWZpbmUgVk9DVFJMX1NFVF9ERUlOVEVSTEFDRSAzMAorI2RlZmluZSBWT0NUUkxfR0VUX0RFSU5URVJMQUNFIDMxCisKKyNkZWZpbmUgVk9DVFJMX1VQREFURV9TQ1JFRU5JTkZPIDMyCisKKy8vIFZvIGNhbiBiZSB1c2VkIGJ5IHhvdmVyCisjZGVmaW5lIFZPQ1RSTF9YT1ZFUkxBWV9TVVBQT1JUIDIyCisKKyNkZWZpbmUgVk9DVFJMX1hPVkVSTEFZX1NFVF9DT0xPUktFWSAyNAordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCB4MTE7IC8vIFRoZSByYXcgeDExIGNvbG9yCisgIHVpbnQxNl90IHIsZyxiOworfSBtcF9jb2xvcmtleV90OworCisjZGVmaW5lIFZPQ1RSTF9YT1ZFUkxBWV9TRVRfV0lOIDIzCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB4LHk7CisgIGludCB3LGg7Cit9IG1wX3dpbl90OworCisjZGVmaW5lIFZPX1RSVUUgICAgICAxCisjZGVmaW5lIFZPX0ZBTFNFICAgICAwCisjZGVmaW5lIFZPX0VSUk9SICAgIC0xCisjZGVmaW5lIFZPX05PVEFWQUlMIC0yCisjZGVmaW5lIFZPX05PVElNUEwgIC0zCisKKyNkZWZpbmUgVk9GTEFHX0ZVTExTQ1JFRU4gICAgICAgICAweDAxCisjZGVmaW5lIFZPRkxBR19NT0RFU1dJVENISU5HICAgICAgMHgwMgorI2RlZmluZSBWT0ZMQUdfU1dTQ0FMRSAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgVk9GTEFHX0ZMSVBQSU5HICAgICAgICAgICAweDA4CisjZGVmaW5lIFZPRkxBR19ISURERU4gICAgICAgICAgICAgMHgxMCAgLy88IFVzZSB0byBjcmVhdGUgYSBoaWRkZW4gd2luZG93CisjZGVmaW5lIFZPRkxBR19TVEVSRU8gICAgICAgICAgICAgMHgyMCAgLy88IFVzZSB0byBjcmVhdGUgYSBzdGVyZW8tY2FwYWJsZSB3aW5kb3cKKyNkZWZpbmUgVk9GTEFHX0RFUFRIICAgICAgICAgICAgICAweDQwICAvLzwgUmVxdWVzdCBhIGRlcHRoIGJ1ZmZlcgorI2RlZmluZSBWT0ZMQUdfWE9WRVJMQVlfU1VCX1ZPIDB4MTAwMDAKKwordHlwZWRlZiBzdHJ1Y3Qgdm9faW5mb19zCit7CisgICAgLyogZHJpdmVyIG5hbWUgKCJNYXRyb3ggTWlsbGVubml1bSBHMjAwL0c0MDAiICovCisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAvKiBzaG9ydCBuYW1lIChmb3IgY29uZmlnIHN0cmluZ3MpICgibWdhIikgKi8KKyAgICBjb25zdCBjaGFyICpzaG9ydF9uYW1lOworICAgIC8qIGF1dGhvciAoIkFhcm9uIEhvbHR6bWFuIDxhaG9sdHptYUBlc3MuZW5nci51dmljLmNhPiIpICovCisgICAgY29uc3QgY2hhciAqYXV0aG9yOworICAgIC8qIGFueSBhZGRpdGlvbmFsIGNvbW1lbnRzICovCisgICAgY29uc3QgY2hhciAqY29tbWVudDsKK30gdm9faW5mb190OworCit0eXBlZGVmIHN0cnVjdCB2b19mdW5jdGlvbnNfcworeworICAgIGNvbnN0IHZvX2luZm9fdCAqaW5mbzsKKyAgICAvKgorICAgICAqIFByZWluaXRpYWxpemVzIGRyaXZlciAocmVhbCBJTklUSUFMSVpBVElPTikKKyAgICAgKiAgIGFyZyAtIGN1cnJlbnRseSBpdCdzIHZvX3N1YmRldmljZQorICAgICAqICAgcmV0dXJuczogemVybyBvbiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLCBub24temVybyBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBpbnQgKCpwcmVpbml0KShjb25zdCBjaGFyICphcmcpOworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSAobWVhbnMgQ09ORklHVVJFKSB0aGUgZGlzcGxheSBkcml2ZXIuCisgICAgICogcGFyYW1zOgorICAgICAqICAgd2lkdGgsaGVpZ2h0OiBpbWFnZSBzb3VyY2Ugc2l6ZQorICAgICAqICAgZF93aWR0aCxkX2hlaWdodDogc2l6ZSBvZiB0aGUgcmVxdWVzdGVkIHdpbmRvdyBzaXplLCBqdXN0IGEgaGludAorICAgICAqICAgZnVsbHNjcmVlbjogZmxhZywgMD13aW5kb3dkIDE9ZnVsbHNjcmVlbiwganVzdCBhIGhpbnQKKyAgICAgKiAgIHRpdGxlOiB3aW5kb3cgdGl0bGUsIGlmIGF2YWlsYWJsZQorICAgICAqICAgZm9ybWF0OiBmb3VyY2Mgb2YgcGl4ZWwgZm9ybWF0CisgICAgICogcmV0dXJucyA6IHplcm8gb24gc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbiwgbm9uLXplcm8gb24gZXJyb3IuCisgICAgICovCisgICAgaW50ICgqY29uZmlnKSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBkX3dpZHRoLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgZF9oZWlnaHQsIHVpbnQzMl90IGZ1bGxzY3JlZW4sIGNoYXIgKnRpdGxlLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0KTsKKworICAgIC8qCisgICAgICogQ29udHJvbCBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBpbnQgKCpjb250cm9sKSh1aW50MzJfdCByZXF1ZXN0LCB2b2lkICpkYXRhLCAuLi4pOworCisgICAgLyoKKyAgICAgKiBEaXNwbGF5IGEgbmV3IFJHQi9CR1IgZnJhbWUgb2YgdGhlIHZpZGVvIHRvIHRoZSBzY3JlZW4uCisgICAgICogcGFyYW1zOgorICAgICAqICAgc3JjWzBdIC0gcG9pbnRlciB0byB0aGUgaW1hZ2UKKyAgICAgKi8KKyAgICBpbnQgKCpkcmF3X2ZyYW1lKSh1aW50OF90ICpzcmNbXSk7CisKKyAgICAvKgorICAgICAqIERyYXcgYSBwbGFuYXIgWVVWIHNsaWNlIHRvIHRoZSBidWZmZXI6CisgICAgICogcGFyYW1zOgorICAgICAqICAgc3JjWzNdID0gc291cmNlIGltYWdlIHBsYW5lcyAoWSxVLFYpCisgICAgICogICBzdHJpZGVbM10gPSBzb3VyY2UgaW1hZ2UgcGxhbmVzIGxpbmUgd2lkdGhzIChpbiBieXRlcykKKyAgICAgKiAgIHcsaCA9IHdpZHRoKmhlaWdodCBvZiBhcmVhIHRvIGJlIGNvcGllZCAoaW4gWSBwaXhlbHMpCisgICAgICogICB4LHkgPSBwb3NpdGlvbiBhdCB0aGUgZGVzdGluYXRpb24gaW1hZ2UgKGluIFkgcGl4ZWxzKQorICAgICAqLworICAgIGludCAoKmRyYXdfc2xpY2UpKHVpbnQ4X3QgKnNyY1tdLCBpbnQgc3RyaWRlW10sIGludCB3LGludCBoLCBpbnQgeCxpbnQgeSk7CisKKyAgICAvKgorICAgICAqIERyYXdzIE9TRCB0byB0aGUgc2NyZWVuIGJ1ZmZlcgorICAgICAqLworICAgIHZvaWQgKCpkcmF3X29zZCkodm9pZCk7CisKKyAgICAvKgorICAgICAqIEJsaXQvRmxpcCBidWZmZXIgdG8gdGhlIHNjcmVlbi4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBmcmFtZSEKKyAgICAgKi8KKyAgICB2b2lkICgqZmxpcF9wYWdlKSh2b2lkKTsKKworICAgIC8qCisgICAgICogVGhpcyBmdW5jIGlzIGNhbGxlZCBhZnRlciBldmVyeSBmcmFtZXMgdG8gaGFuZGxlIGtleWJvYXJkIGFuZAorICAgICAqIG90aGVyIGV2ZW50cy4gSXQncyBjYWxsZWQgaW4gUEFVU0UgbW9kZSB0b28hCisgICAgICovCisgICAgdm9pZCAoKmNoZWNrX2V2ZW50cykodm9pZCk7CisKKyAgICAvKgorICAgICAqIENsb3NlcyBkcml2ZXIuIFNob3VsZCByZXN0b3JlIHRoZSBvcmlnaW5hbCBzdGF0ZSBvZiB0aGUgc3lzdGVtLgorICAgICAqLworICAgIHZvaWQgKCp1bmluaXQpKHZvaWQpOworfSB2b19mdW5jdGlvbnNfdDsKKworY29uc3Qgdm9fZnVuY3Rpb25zX3QqIGluaXRfYmVzdF92aWRlb19vdXQoY2hhcioqIHZvX2xpc3QpOworaW50IGNvbmZpZ192aWRlb19vdXQoY29uc3Qgdm9fZnVuY3Rpb25zX3QgKnZvLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZF93aWR0aCwgdWludDMyX3QgZF9oZWlnaHQsIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgY2hhciAqdGl0bGUsIHVpbnQzMl90IGZvcm1hdCk7Cit2b2lkIGxpc3RfdmlkZW9fb3V0KHZvaWQpOworCisvLyBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYWxsIGRyaXZlcnMKK2V4dGVybiBjb25zdCB2b19mdW5jdGlvbnNfdCogY29uc3QgdmlkZW9fb3V0X2RyaXZlcnNbXTsKKworZXh0ZXJuIGludCB2b19mbGFnczsKKworZXh0ZXJuIGludCB2b19jb25maWdfY291bnQ7CisKK2V4dGVybiBpbnQgeGluZXJhbWFfc2NyZWVuOworZXh0ZXJuIGludCB4aW5lcmFtYV94OworZXh0ZXJuIGludCB4aW5lcmFtYV95OworCisvLyBjb3JyZWN0IHJlc29sdXRpb24vYnBwIG9uIHNjcmVlbjogIChzaG91bGQgYmUgYXV0b2RldGVjdGVkIGJ5IHZvX2luaXQoKSkKK2V4dGVybiBpbnQgdm9fZGVwdGhvbnNjcmVlbjsKK2V4dGVybiBpbnQgdm9fc2NyZWVud2lkdGg7CitleHRlcm4gaW50IHZvX3NjcmVlbmhlaWdodDsKKworLy8gcmVxdWVzdGVkIHJlc29sdXRpb24vYnBwOiAgKC14IC15IC1icHAgb3B0aW9ucykKK2V4dGVybiBpbnQgdm9fZHg7CitleHRlcm4gaW50IHZvX2R5OworZXh0ZXJuIGludCB2b19kd2lkdGg7CitleHRlcm4gaW50IHZvX2RoZWlnaHQ7CitleHRlcm4gaW50IHZvX2RicHA7CisKK2V4dGVybiBpbnQgdm9fZ3JhYnBvaW50ZXI7CitleHRlcm4gaW50IHZvX2RvdWJsZWJ1ZmZlcmluZzsKK2V4dGVybiBpbnQgdm9fZGlyZWN0cmVuZGVyaW5nOworZXh0ZXJuIGludCB2b192c3luYzsKK2V4dGVybiBpbnQgdm9fZnNtb2RlOworZXh0ZXJuIGZsb2F0IHZvX3BhbnNjYW47CitleHRlcm4gZmxvYXQgdm9fYm9yZGVyX3Bvc194OworZXh0ZXJuIGZsb2F0IHZvX2JvcmRlcl9wb3NfeTsKK2V4dGVybiBpbnQgdm9fcm90YXRlOworZXh0ZXJuIGludCB2b19hZGFwdGVyX251bTsKK2V4dGVybiBpbnQgdm9fcmVmcmVzaF9yYXRlOworZXh0ZXJuIGludCB2b19rZWVwYXNwZWN0OworZXh0ZXJuIGludCB2b19yb290d2luOworZXh0ZXJuIGludCB2b19vbnRvcDsKK2V4dGVybiBpbnQgdm9fYm9yZGVyOworCitleHRlcm4gaW50IHZvX2dhbW1hX2dhbW1hOworZXh0ZXJuIGludCB2b19nYW1tYV9icmlnaHRuZXNzOworZXh0ZXJuIGludCB2b19nYW1tYV9zYXR1cmF0aW9uOworZXh0ZXJuIGludCB2b19nYW1tYV9jb250cmFzdDsKK2V4dGVybiBpbnQgdm9fZ2FtbWFfaHVlOworZXh0ZXJuIGludCB2b19nYW1tYV9yZWRfaW50ZW5zaXR5OworZXh0ZXJuIGludCB2b19nYW1tYV9ncmVlbl9pbnRlbnNpdHk7CitleHRlcm4gaW50IHZvX2dhbW1hX2JsdWVfaW50ZW5zaXR5OworCitleHRlcm4gaW50IHZvX25vbW91c2VfaW5wdXQ7CitleHRlcm4gaW50IGVuYWJsZV9tb3VzZV9tb3ZlbWVudHM7CisKK2V4dGVybiBpbnQgdm9fcHRzOworZXh0ZXJuIGZsb2F0IHZvX2ZwczsKKworZXh0ZXJuIGNoYXIgKnZvX3N1YmRldmljZTsKKworZXh0ZXJuIGludCB2b19jb2xvcmtleTsKKworZXh0ZXJuIGNoYXIgKnZvX3dpbm5hbWU7CitleHRlcm4gY2hhciAqdm9fd2ludGl0bGU7CisKK2V4dGVybiBpbnQ2NF90IFdpbklEOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGZsb2F0IG1pbjsKKyAgICAgICAgZmxvYXQgbWF4OworICAgICAgICB9IHJhbmdlX3Q7CisKK2Zsb2F0IHJhbmdlX21heChyYW5nZV90ICpyKTsKK2ludCBpbl9yYW5nZShyYW5nZV90ICpyLCBmbG9hdCBmKTsKK3JhbmdlX3QgKnN0cjJyYW5nZShjaGFyICpzKTsKK2V4dGVybiBjaGFyICptb25pdG9yX2hmcmVxX3N0cjsKK2V4dGVybiBjaGFyICptb25pdG9yX3ZmcmVxX3N0cjsKK2V4dGVybiBjaGFyICptb25pdG9yX2RvdGNsb2NrX3N0cjsKKworc3RydWN0IG1wX2tleW1hcCB7CisgIGludCBmcm9tOworICBpbnQgdG87Cit9OworaW50IGxvb2t1cF9rZXltYXBfdGFibGUoY29uc3Qgc3RydWN0IG1wX2tleW1hcCAqbWFwLCBpbnQga2V5KTsKK3N0cnVjdCB2b19yZWN0IHsKKyAgaW50IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgd2lkdGgsIGhlaWdodDsKK307Cit2b2lkIGNhbGNfc3JjX2RzdF9yZWN0cyhpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwgc3RydWN0IHZvX3JlY3QgKnNyYywgc3RydWN0IHZvX3JlY3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2b19yZWN0ICpib3JkZXJzLCBjb25zdCBzdHJ1Y3Qgdm9fcmVjdCAqY3JvcCk7Cit2b2lkIHZvX21vdXNlX21vdmVtZW50KGludCBwb3N4LCBpbnQgcG9zeSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGFwcGx5X2JvcmRlcl9wb3MoaW50IGZ1bGwsIGludCBwYXJ0LCBmbG9hdCBwb3MpIHsKKyAgaWYgKHBvcyA+PSAwLjAgJiYgcG9zIDw9IDEuMCkgeworICAgIHJldHVybiBwb3MqKGZ1bGwgLSBwYXJ0KTsKKyAgfQorICBpZiAocG9zIDwgMCkKKyAgICByZXR1cm4gcG9zICogcGFydDsKKyAgcmV0dXJuIGZ1bGwgLSBwYXJ0ICsgKHBvcyAtIDEpICogcGFydDsKK30KKworI2VuZGlmIC8qIE1QTEFZRVJfVklERU9fT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy9tcF9pbWFnZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL21wX2ltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU0ZDZkNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy9tcF9pbWFnZS5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTVBsYXllci4KKyAqCisgKiBNUGxheWVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBNUGxheWVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBNUGxheWVyOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBIQVZFX01BTExPQ19ICisjaW5jbHVkZSA8bWFsbG9jLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImltZ19mb3JtYXQuaCIKKyNpbmNsdWRlICJtcF9pbWFnZS5oIgorCisjaW5jbHVkZSAibGlidm8vZmFzdG1lbWNweS5oIgorLy8jaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorCit2b2lkIGZmX21wX2ltYWdlX2FsbG9jX3BsYW5lcyhtcF9pbWFnZV90ICptcGkpIHsKKyAgICB1aW50MzJfdCB0ZW1wWzI1Nl07CisgICAgaWYgKGF2cHJpdl9zZXRfc3lzdGVtYXRpY19wYWwyKHRlbXAsIGZmX21wMmZmX3BpeF9mbXQobXBpLT5pbWdmbXQpKSA+PSAwKQorICAgICAgICBtcGktPmZsYWdzIHw9IE1QX0lNR0ZMQUdfUkdCX1BBTEVUVEU7CisKKyAgLy8gSUYwOSAtIGFsbG9jYXRlIHNwYWNlIGZvciA0LiBwbGFuZSBkZWx0YSBpbmZvIC0gdW51c2VkCisgIGlmIChtcGktPmltZ2ZtdCA9PSBJTUdGTVRfSUYwOSkgeworICAgIG1waS0+cGxhbmVzWzBdPWF2X21hbGxvYyhtcGktPmJwcCptcGktPndpZHRoKihtcGktPmhlaWdodCsyKS84KworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1waS0+Y2hyb21hX3dpZHRoKm1waS0+Y2hyb21hX2hlaWdodCk7CisgIH0gZWxzZQorICAgIG1waS0+cGxhbmVzWzBdPWF2X21hbGxvYyhtcGktPmJwcCptcGktPndpZHRoKihtcGktPmhlaWdodCsyKS84KTsKKyAgaWYgKG1waS0+ZmxhZ3MmTVBfSU1HRkxBR19QTEFOQVIpIHsKKyAgICBpbnQgYnBwID0gSU1HRk1UX0lTX1lVVlAxNihtcGktPmltZ2ZtdCk/IDIgOiAxOworICAgIC8vIFlWMTIvSTQyMC9ZVlU5L0lGMDkuIGZlZWwgZnJlZSB0byBhZGQgb3RoZXIgcGxhbmFyIGZvcm1hdHMgaGVyZS4uLgorICAgIG1waS0+c3RyaWRlWzBdPW1waS0+c3RyaWRlWzNdPWJwcCptcGktPndpZHRoOworICAgIGlmKG1waS0+bnVtX3BsYW5lcyA+IDIpeworICAgICAgbXBpLT5zdHJpZGVbMV09bXBpLT5zdHJpZGVbMl09YnBwKm1waS0+Y2hyb21hX3dpZHRoOworICAgICAgaWYobXBpLT5mbGFncyZNUF9JTUdGTEFHX1NXQVBQRUQpeworICAgICAgICAvLyBJNDIwL0lZVVYgIChZLFUsVikKKyAgICAgICAgbXBpLT5wbGFuZXNbMV09bXBpLT5wbGFuZXNbMF0rbXBpLT5zdHJpZGVbMF0qbXBpLT5oZWlnaHQ7CisgICAgICAgIG1waS0+cGxhbmVzWzJdPW1waS0+cGxhbmVzWzFdK21waS0+c3RyaWRlWzFdKm1waS0+Y2hyb21hX2hlaWdodDsKKyAgICAgICAgaWYgKG1waS0+bnVtX3BsYW5lcyA+IDMpCisgICAgICAgICAgICBtcGktPnBsYW5lc1szXT1tcGktPnBsYW5lc1syXSttcGktPnN0cmlkZVsyXSptcGktPmNocm9tYV9oZWlnaHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBZVjEyLFlWVTksSUYwOSAgKFksVixVKQorICAgICAgICBtcGktPnBsYW5lc1syXT1tcGktPnBsYW5lc1swXSttcGktPnN0cmlkZVswXSptcGktPmhlaWdodDsKKyAgICAgICAgbXBpLT5wbGFuZXNbMV09bXBpLT5wbGFuZXNbMl0rbXBpLT5zdHJpZGVbMV0qbXBpLT5jaHJvbWFfaGVpZ2h0OworICAgICAgICBpZiAobXBpLT5udW1fcGxhbmVzID4gMykKKyAgICAgICAgICAgIG1waS0+cGxhbmVzWzNdPW1waS0+cGxhbmVzWzFdK21waS0+c3RyaWRlWzFdKm1waS0+Y2hyb21hX2hlaWdodDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gTlYxMi9OVjIxCisgICAgICBtcGktPnN0cmlkZVsxXT1tcGktPmNocm9tYV93aWR0aDsKKyAgICAgIG1waS0+cGxhbmVzWzFdPW1waS0+cGxhbmVzWzBdK21waS0+c3RyaWRlWzBdKm1waS0+aGVpZ2h0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtcGktPnN0cmlkZVswXT1tcGktPndpZHRoKm1waS0+YnBwLzg7CisgICAgaWYgKG1waS0+ZmxhZ3MgJiBNUF9JTUdGTEFHX1JHQl9QQUxFVFRFKSB7CisgICAgICBtcGktPnBsYW5lc1sxXSA9IGF2X21hbGxvYygxMDI0KTsKKyAgICAgIG1lbWNweShtcGktPnBsYW5lc1sxXSwgdGVtcCwgMTAyNCk7CisgICAgfQorICB9CisgIG1waS0+ZmxhZ3N8PU1QX0lNR0ZMQUdfQUxMT0NBVEVEOworfQorCittcF9pbWFnZV90KiBmZl9hbGxvY19tcGkoaW50IHcsIGludCBoLCB1bnNpZ25lZCBsb25nIGludCBmbXQpIHsKKyAgbXBfaW1hZ2VfdCogbXBpID0gZmZfbmV3X21wX2ltYWdlKHcsaCk7CisKKyAgZmZfbXBfaW1hZ2Vfc2V0Zm10KG1waSxmbXQpOworICBmZl9tcF9pbWFnZV9hbGxvY19wbGFuZXMobXBpKTsKKworICByZXR1cm4gbXBpOworfQorCit2b2lkIGZmX2NvcHlfbXBpKG1wX2ltYWdlX3QgKmRtcGksIG1wX2ltYWdlX3QgKm1waSkgeworICBpZihtcGktPmZsYWdzJk1QX0lNR0ZMQUdfUExBTkFSKXsKKyAgICBtZW1jcHlfcGljKGRtcGktPnBsYW5lc1swXSxtcGktPnBsYW5lc1swXSwgbXBpLT53LCBtcGktPmgsCisgICAgICAgICAgICAgICBkbXBpLT5zdHJpZGVbMF0sbXBpLT5zdHJpZGVbMF0pOworICAgIG1lbWNweV9waWMoZG1waS0+cGxhbmVzWzFdLG1waS0+cGxhbmVzWzFdLCBtcGktPmNocm9tYV93aWR0aCwgbXBpLT5jaHJvbWFfaGVpZ2h0LAorICAgICAgICAgICAgICAgZG1waS0+c3RyaWRlWzFdLG1waS0+c3RyaWRlWzFdKTsKKyAgICBtZW1jcHlfcGljKGRtcGktPnBsYW5lc1syXSwgbXBpLT5wbGFuZXNbMl0sIG1waS0+Y2hyb21hX3dpZHRoLCBtcGktPmNocm9tYV9oZWlnaHQsCisgICAgICAgICAgICAgICBkbXBpLT5zdHJpZGVbMl0sbXBpLT5zdHJpZGVbMl0pOworICB9IGVsc2UgeworICAgIG1lbWNweV9waWMoZG1waS0+cGxhbmVzWzBdLG1waS0+cGxhbmVzWzBdLAorICAgICAgICAgICAgICAgbXBpLT53KihkbXBpLT5icHAvOCksIG1waS0+aCwKKyAgICAgICAgICAgICAgIGRtcGktPnN0cmlkZVswXSxtcGktPnN0cmlkZVswXSk7CisgIH0KK30KKwordm9pZCBmZl9tcF9pbWFnZV9zZXRmbXQobXBfaW1hZ2VfdCogbXBpLHVuc2lnbmVkIGludCBvdXRfZm10KXsKKyAgICBtcGktPmZsYWdzJj1+KE1QX0lNR0ZMQUdfUExBTkFSfE1QX0lNR0ZMQUdfWVVWfE1QX0lNR0ZMQUdfU1dBUFBFRCk7CisgICAgbXBpLT5pbWdmbXQ9b3V0X2ZtdDsKKyAgICAvLyBjb21wcmVzc2VkIGZvcm1hdHMKKyAgICBpZihvdXRfZm10ID09IElNR0ZNVF9NUEVHUEVTIHx8CisgICAgICAgb3V0X2ZtdCA9PSBJTUdGTVRfWlJNSlBFR05JIHx8IG91dF9mbXQgPT0gSU1HRk1UX1pSTUpQRUdJVCB8fCBvdXRfZm10ID09IElNR0ZNVF9aUk1KUEVHSUIgfHwKKyAgICAgICBJTUdGTVRfSVNfSFdBQ0NFTChvdXRfZm10KSl7CisgICAgICAgIG1waS0+YnBwPTA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbXBpLT5udW1fcGxhbmVzPTE7CisgICAgaWYgKElNR0ZNVF9JU19SR0Iob3V0X2ZtdCkpIHsKKyAgICAgICAgaWYgKElNR0ZNVF9SR0JfREVQVEgob3V0X2ZtdCkgPCA4ICYmICEob3V0X2ZtdCYxMjgpKQorICAgICAgICAgICAgbXBpLT5icHAgPSBJTUdGTVRfUkdCX0RFUFRIKG91dF9mbXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtcGktPmJwcD0oSU1HRk1UX1JHQl9ERVBUSChvdXRfZm10KSs3KSYofjcpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChJTUdGTVRfSVNfQkdSKG91dF9mbXQpKSB7CisgICAgICAgIGlmIChJTUdGTVRfQkdSX0RFUFRIKG91dF9mbXQpIDwgOCAmJiAhKG91dF9mbXQmMTI4KSkKKyAgICAgICAgICAgIG1waS0+YnBwID0gSU1HRk1UX0JHUl9ERVBUSChvdXRfZm10KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbXBpLT5icHA9KElNR0ZNVF9CR1JfREVQVEgob3V0X2ZtdCkrNykmKH43KTsKKyAgICAgICAgbXBpLT5mbGFnc3w9TVBfSU1HRkxBR19TV0FQUEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChJTUdGTVRfSVNfWFlaKG91dF9mbXQpKSB7CisgICAgICAgIG1waS0+YnBwPTMqKChJTUdGTVRfWFlaX0RFUFRIKG91dF9mbXQpICsgNykgJiB+Nyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbXBpLT5udW1fcGxhbmVzPTM7CisgICAgaWYgKG91dF9mbXQgPT0gSU1HRk1UX0dCUjI0UCkgeworICAgICAgICBtcGktPmJwcD0yNDsKKyAgICAgICAgbXBpLT5mbGFnc3w9TVBfSU1HRkxBR19QTEFOQVI7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKG91dF9mbXQgPT0gSU1HRk1UX0dCUjEyUCkgeworICAgICAgICBtcGktPmJwcD0zNjsKKyAgICAgICAgbXBpLT5mbGFnc3w9TVBfSU1HRkxBR19QTEFOQVI7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKG91dF9mbXQgPT0gSU1HRk1UX0dCUjE0UCkgeworICAgICAgICBtcGktPmJwcD00MjsKKyAgICAgICAgbXBpLT5mbGFnc3w9TVBfSU1HRkxBR19QTEFOQVI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbXBpLT5mbGFnc3w9TVBfSU1HRkxBR19ZVVY7CisgICAgaWYgKGZmX21wX2dldF9jaHJvbWFfc2hpZnQob3V0X2ZtdCwgTlVMTCwgTlVMTCwgTlVMTCkpIHsKKyAgICAgICAgbXBpLT5mbGFnc3w9TVBfSU1HRkxBR19QTEFOQVI7CisgICAgICAgIG1waS0+YnBwID0gZmZfbXBfZ2V0X2Nocm9tYV9zaGlmdChvdXRfZm10LCAmbXBpLT5jaHJvbWFfeF9zaGlmdCwgJm1waS0+Y2hyb21hX3lfc2hpZnQsIE5VTEwpOworICAgICAgICBtcGktPmNocm9tYV93aWR0aCAgPSBtcGktPndpZHRoICA+PiBtcGktPmNocm9tYV94X3NoaWZ0OworICAgICAgICBtcGktPmNocm9tYV9oZWlnaHQgPSBtcGktPmhlaWdodCA+PiBtcGktPmNocm9tYV95X3NoaWZ0OworICAgIH0KKyAgICBzd2l0Y2gob3V0X2ZtdCl7CisgICAgY2FzZSBJTUdGTVRfSTQyMDoKKyAgICBjYXNlIElNR0ZNVF9JWVVWOgorICAgICAgICBtcGktPmZsYWdzfD1NUF9JTUdGTEFHX1NXQVBQRUQ7CisgICAgY2FzZSBJTUdGTVRfWVYxMjoKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgSU1HRk1UXzQyMEE6CisgICAgY2FzZSBJTUdGTVRfNDIyQToKKyAgICBjYXNlIElNR0ZNVF80NDRBOgorICAgIGNhc2UgSU1HRk1UX0lGMDk6CisgICAgICAgIG1waS0+bnVtX3BsYW5lcz00OworICAgIGNhc2UgSU1HRk1UX1lWVTk6CisgICAgY2FzZSBJTUdGTVRfNDQ0UDoKKyAgICBjYXNlIElNR0ZNVF80MjJQOgorICAgIGNhc2UgSU1HRk1UXzQxMVA6CisgICAgY2FzZSBJTUdGTVRfNDQwUDoKKyAgICBjYXNlIElNR0ZNVF80NDRQMTZfTEU6CisgICAgY2FzZSBJTUdGTVRfNDQ0UDE2X0JFOgorICAgIGNhc2UgSU1HRk1UXzQ0NFAxNF9MRToKKyAgICBjYXNlIElNR0ZNVF80NDRQMTRfQkU6CisgICAgY2FzZSBJTUdGTVRfNDQ0UDEyX0xFOgorICAgIGNhc2UgSU1HRk1UXzQ0NFAxMl9CRToKKyAgICBjYXNlIElNR0ZNVF80NDRQMTBfTEU6CisgICAgY2FzZSBJTUdGTVRfNDQ0UDEwX0JFOgorICAgIGNhc2UgSU1HRk1UXzQ0NFA5X0xFOgorICAgIGNhc2UgSU1HRk1UXzQ0NFA5X0JFOgorICAgIGNhc2UgSU1HRk1UXzQyMlAxNl9MRToKKyAgICBjYXNlIElNR0ZNVF80MjJQMTZfQkU6CisgICAgY2FzZSBJTUdGTVRfNDIyUDE0X0xFOgorICAgIGNhc2UgSU1HRk1UXzQyMlAxNF9CRToKKyAgICBjYXNlIElNR0ZNVF80MjJQMTJfTEU6CisgICAgY2FzZSBJTUdGTVRfNDIyUDEyX0JFOgorICAgIGNhc2UgSU1HRk1UXzQyMlAxMF9MRToKKyAgICBjYXNlIElNR0ZNVF80MjJQMTBfQkU6CisgICAgY2FzZSBJTUdGTVRfNDIyUDlfTEU6CisgICAgY2FzZSBJTUdGTVRfNDIyUDlfQkU6CisgICAgY2FzZSBJTUdGTVRfNDIwUDE2X0xFOgorICAgIGNhc2UgSU1HRk1UXzQyMFAxNl9CRToKKyAgICBjYXNlIElNR0ZNVF80MjBQMTRfTEU6CisgICAgY2FzZSBJTUdGTVRfNDIwUDE0X0JFOgorICAgIGNhc2UgSU1HRk1UXzQyMFAxMl9MRToKKyAgICBjYXNlIElNR0ZNVF80MjBQMTJfQkU6CisgICAgY2FzZSBJTUdGTVRfNDIwUDEwX0xFOgorICAgIGNhc2UgSU1HRk1UXzQyMFAxMF9CRToKKyAgICBjYXNlIElNR0ZNVF80MjBQOV9MRToKKyAgICBjYXNlIElNR0ZNVF80MjBQOV9CRToKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgSU1HRk1UX1kxNl9MRToKKyAgICBjYXNlIElNR0ZNVF9ZMTZfQkU6CisgICAgICAgIG1waS0+YnBwPTE2OworICAgIGNhc2UgSU1HRk1UX1k4MDA6CisgICAgY2FzZSBJTUdGTVRfWTg6CisgICAgICAgIC8qIHRoZXkncmUgcGxhbmFyIG9uZXMsIGJ1dCBmb3IgZWFzaWVyIGhhbmRsaW5nIHVzZSB0aGVtIGFzIHBhY2tlZCAqLworICAgICAgICBtcGktPmZsYWdzJj1+TVBfSU1HRkxBR19QTEFOQVI7CisgICAgICAgIG1waS0+bnVtX3BsYW5lcz0xOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJTUdGTVRfWThBOgorICAgICAgICBtcGktPm51bV9wbGFuZXM9MjsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgSU1HRk1UX1VZVlk6CisgICAgICAgIG1waS0+ZmxhZ3N8PU1QX0lNR0ZMQUdfU1dBUFBFRDsKKyAgICBjYXNlIElNR0ZNVF9ZVVkyOgorICAgICAgICBtcGktPmNocm9tYV94X3NoaWZ0ID0gMTsKKyAgICAgICAgbXBpLT5icHA9MTY7CisgICAgICAgIG1waS0+bnVtX3BsYW5lcz0xOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJTUdGTVRfTlYxMjoKKyAgICAgICAgbXBpLT5mbGFnc3w9TVBfSU1HRkxBR19TV0FQUEVEOworICAgIGNhc2UgSU1HRk1UX05WMjE6CisgICAgICAgIG1waS0+ZmxhZ3N8PU1QX0lNR0ZMQUdfUExBTkFSOworICAgICAgICBtcGktPmJwcD0xMjsKKyAgICAgICAgbXBpLT5udW1fcGxhbmVzPTI7CisgICAgICAgIG1waS0+Y2hyb21hX3dpZHRoPShtcGktPndpZHRoPj4wKTsKKyAgICAgICAgbXBpLT5jaHJvbWFfaGVpZ2h0PShtcGktPmhlaWdodD4+MSk7CisgICAgICAgIG1waS0+Y2hyb21hX3hfc2hpZnQ9MDsKKyAgICAgICAgbXBpLT5jaHJvbWFfeV9zaGlmdD0xOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZmX21wX21zZyhNU0dUX0RFQ1ZJREVPLE1TR0xfV0FSTiwibXBfaW1hZ2U6IHVua25vd24gb3V0X2ZtdDogMHglWFxuIixvdXRfZm10KTsKKyAgICBtcGktPmJwcD0wOworfQorCittcF9pbWFnZV90KiBmZl9uZXdfbXBfaW1hZ2UoaW50IHcsaW50IGgpeworICAgIG1wX2ltYWdlX3QqIG1waSA9IG1hbGxvYyhzaXplb2YobXBfaW1hZ2VfdCkpOworICAgIGlmKCFtcGkpIHJldHVybiBOVUxMOyAvLyBlcnJvciEKKyAgICBtZW1zZXQobXBpLDAsc2l6ZW9mKG1wX2ltYWdlX3QpKTsKKyAgICBtcGktPndpZHRoPW1waS0+dz13OworICAgIG1waS0+aGVpZ2h0PW1waS0+aD1oOworICAgIHJldHVybiBtcGk7Cit9CisKK3ZvaWQgZmZfZnJlZV9tcF9pbWFnZShtcF9pbWFnZV90KiBtcGkpeworICAgIGlmKCFtcGkpIHJldHVybjsKKyAgICBpZihtcGktPmZsYWdzJk1QX0lNR0ZMQUdfQUxMT0NBVEVEKXsKKyAgICAgICAgLyogYmVjYXVzZSB3ZSBhbGxvY2F0ZSB0aGUgd2hvbGUgaW1hZ2UgYXQgb25jZSAqLworICAgICAgICBhdl9mcmVlKG1waS0+cGxhbmVzWzBdKTsKKyAgICAgICAgaWYgKG1waS0+ZmxhZ3MgJiBNUF9JTUdGTEFHX1JHQl9QQUxFVFRFKQorICAgICAgICAgICAgYXZfZnJlZShtcGktPnBsYW5lc1sxXSk7CisgICAgfQorICAgIGZyZWUobXBpKTsKK30KKwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL21wX2ltYWdlLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvbXBfaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWRmNDUxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL21wX2ltYWdlLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBNUGxheWVyLgorICoKKyAqIE1QbGF5ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE1QbGF5ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIE1QbGF5ZXI7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBNUExBWUVSX01QX0lNQUdFX0gKKyNkZWZpbmUgTVBMQVlFUl9NUF9JTUFHRV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI3VuZGVmIHByaW50ZiAvL0ZJWE1FCisjdW5kZWYgZnByaW50ZiAvL0ZJWE1FCisjaW5jbHVkZSAibXBfbXNnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI3VuZGVmIHJlYWxsb2MKKyN1bmRlZiBtYWxsb2MKKyN1bmRlZiBmcmVlCisjdW5kZWYgcmFuZAorI3VuZGVmIHNyYW5kCisjdW5kZWYgcHJpbnRmCisjdW5kZWYgc3RybmNweQorI2RlZmluZSBBU01BTElHTihaRVJPQklUUykgIi5wMmFsaWduICIgI1pFUk9CSVRTICJcblx0IgorI2RlZmluZSBDT0RFQ19GTEFHMl9NRU1DX09OTFkgICAgIDB4MDAwMDEwMDAgLy8vPCBPbmx5IGRvIE1FL01DIChJIGZyYW1lcyAtPiByZWYsIFAgZnJhbWUgLT4gTUUrTUMpLgorCitlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfbXAyZmZfcGl4X2ZtdChpbnQgbXApOworCisvLy0tLS0tLS0tLSBjb2RlYydzIHJlcXVpcmVtZW50cyAoZmlsbGVkIGJ5IHRoZSBjb2RlYy92ZikgLS0tLS0tLS0tCisKKy8vLS0tIGJ1ZmZlciBjb250ZW50IHJlc3RyaWN0aW9uczoKKy8vIHNldCBpZiBidWZmZXIgY29udGVudCBzaG91bGRuJ3QgYmUgbW9kaWZpZWQ6CisjZGVmaW5lIE1QX0lNR0ZMQUdfUFJFU0VSVkUgMHgwMQorLy8gc2V0IGlmIGJ1ZmZlciBjb250ZW50IHdpbGwgYmUgUkVBRC4KKy8vIFRoaXMgY2FuIGJlIGUuZy4gZm9yIG5leHQgZnJhbWUncyBNQzogKEkvUCBtcGVnIGZyYW1lcykgLQorLy8gdGhlbiBpbiBjb21iaW5hdGlvbiB3aXRoIE1QX0lNR0ZMQUdfUFJFU0VSVkUgLSBvciBpdAorLy8gY2FuIGJlIGJlY2F1c2UgYSB2aWRlbyBmaWx0ZXIgb3IgY29kZWMgd2lsbCByZWFkIGEgc2lnbmlmaWNhbnQKKy8vIGFtb3VudCBvZiBkYXRhIHdoaWxlIHByb2Nlc3NpbmcgdGhhdCBmcmFtZSAoZS5nLiBibGVuZGluZyBzb21ldGhpbmcKKy8vIG9udG8gdGhlIGZyYW1lLCBNViBiYXNlZCBpbnRyYSBwcmVkaWN0aW9uKS4KKy8vIEEgZnJhbWUgbWFya2VkIGxpa2UgdGhpcyBzaG91bGQgbm90IGJlIHBsYWNlZCBpbiB0byB1bmNhY2hhYmxlCisvLyB2aWRlbyBSQU0gZm9yIGV4YW1wbGUuCisjZGVmaW5lIE1QX0lNR0ZMQUdfUkVBREFCTEUgMHgwMgorCisvLy0tLSBidWZmZXIgd2lkdGgvc3RyaWRlL3BsYW5lIHJlc3RyaWN0aW9uczogKHVzZWQgZm9yIGRpcmVjdCByZW5kZXJpbmcpCisvLyBzdHJpZGUgX2hhdmVfdG9fIGJlIGFsaWduZWQgdG8gTUIgYm91bmRhcnk6ICBbZm9yIERSIHJlc3RyaWN0aW9uc10KKyNkZWZpbmUgTVBfSU1HRkxBR19BQ0NFUFRfQUxJR05FRF9TVFJJREUgMHg0CisvLyBzdHJpZGUgc2hvdWxkIGJlIGFsaWduZWQgdG8gTUIgYm91bmRhcnk6ICAgICBbZm9yIGJ1ZmZlciBhbGxvY2F0aW9uXQorI2RlZmluZSBNUF9JTUdGTEFHX1BSRUZFUl9BTElHTkVEX1NUUklERSAweDgKKy8vIGNvZGVjIGFjY2VwdCBhbnkgc3RyaWRlICg+PXdpZHRoKToKKyNkZWZpbmUgTVBfSU1HRkxBR19BQ0NFUFRfU1RSSURFIDB4MTAKKy8vIGNvZGVjIGFjY2VwdCBhbnkgd2lkdGggKHdpZHRoKmJwcD1zdHJpZGUgLT4gc3RyaWRlJWJwcD09MCkgKD49d2lkdGgpOgorI2RlZmluZSBNUF9JTUdGTEFHX0FDQ0VQVF9XSURUSCAweDIwCisvLy0tLSBmb3IgcGxhbmFyIGZvcm1hdHMgb25seToKKy8vIHVzZXMgb25seSBzdHJpZGVbMF0sIGFuZCBzdHJpZGVbMV09c3RyaWRlWzJdPXN0cmlkZVswXT4+bXBpLT5jaHJvbWFfeF9zaGlmdAorI2RlZmluZSBNUF9JTUdGTEFHX0NPTU1PTl9TVFJJREUgMHg0MAorLy8gdXNlcyBvbmx5IHBsYW5lc1swXSwgYW5kIGNhbGN1bGF0ZXMgcGxhbmVzWzEsMl0gZnJvbSB3aWR0aCxoZWlnaHQsaW1nZm10CisjZGVmaW5lIE1QX0lNR0ZMQUdfQ09NTU9OX1BMQU5FIDB4ODAKKworI2RlZmluZSBNUF9JTUdGTEFHTUFTS19SRVNUUklDVElPTlMgMHhGRgorCisvLy0tLS0tLS0tLSBjb2xvciBpbmZvIChmaWxsZWQgYnkgZmZfbXBfaW1hZ2Vfc2V0Zm10KCkgKSAtLS0tLS0tLS0tLQorLy8gc2V0IGlmIG51bWJlciBvZiBwbGFuZXMgPiAxCisjZGVmaW5lIE1QX0lNR0ZMQUdfUExBTkFSIDB4MTAwCisvLyBzZXQgaWYgaXQncyBZVVYgY29sb3JzcGFjZQorI2RlZmluZSBNUF9JTUdGTEFHX1lVViAweDIwMAorLy8gc2V0IGlmIGl0J3Mgc3dhcHBlZCAoQkdSIG9yIFlWVSkgcGxhbmUvYnl0ZW9yZGVyCisjZGVmaW5lIE1QX0lNR0ZMQUdfU1dBUFBFRCAweDQwMAorLy8gc2V0IGlmIHlvdSB3YW50IG1lbW9yeSBmb3IgcGFsZXR0ZSBhbGxvY2F0ZWQgYW5kIG1hbmFnZWQgYnkgZmZfdmZfZ2V0X2ltYWdlIGV0Yy4KKyNkZWZpbmUgTVBfSU1HRkxBR19SR0JfUEFMRVRURSAweDgwMAorCisjZGVmaW5lIE1QX0lNR0ZMQUdNQVNLX0NPTE9SUyAweEYwMAorCisvLyBjb2RlYyB1c2VzIGRyYXdpbmcvcmVuZGVyaW5nIGNhbGxiYWNrcyAoZHJhd19zbGljZSgpLWxpa2UgdGhpbmcsIERSIG1ldGhvZCAyKQorLy8gW3RoZSBjb2RlYyB3aWxsIHNldCB0aGlzIGZsYWcgaWYgaXQgc3VwcG9ydHMgY2FsbGJhY2tzLCBhbmQgdGhlIHZvIF9tYXlfCisvLyAgY2xlYXIgaXQgaW4gZ2V0X2ltYWdlKCkgaWYgZHJhd19zbGljZSgpIG5vdCBpbXBsZW1lbnRlZF0KKyNkZWZpbmUgTVBfSU1HRkxBR19EUkFXX0NBTExCQUNLIDB4MTAwMAorLy8gc2V0IGlmIGl0J3MgaW4gdmlkZW8gYnVmZmVyL21lbW9yeTogW3NldCBieSB2by92ZidzIGdldF9pbWFnZSgpICEhIV0KKyNkZWZpbmUgTVBfSU1HRkxBR19ESVJFQ1QgMHgyMDAwCisvLyBzZXQgaWYgYnVmZmVyIGlzIGFsbG9jYXRlZCAodXNlZCBpbiBkZXN0aW5hdGlvbiBpbWFnZXMpOgorI2RlZmluZSBNUF9JTUdGTEFHX0FMTE9DQVRFRCAweDQwMDAKKworLy8gYnVmZmVyIHR5cGUgd2FzIHByaW50ZWQgKGRvIE5PVCBzZXQgdGhpcyBmbGFnIC0gaXQncyBmb3IgSU5URVJOQUwgVVNFISEhKQorI2RlZmluZSBNUF9JTUdGTEFHX1RZUEVfRElTUExBWUVEIDB4ODAwMAorCisvLyBjb2RlYyBkb2Vzbid0IHN1cHBvcnQgYW55IGZvcm0gb2YgZGlyZWN0IHJlbmRlcmluZyAtIGl0IGhhcyBvd24gYnVmZmVyCisvLyBhbGxvY2F0aW9uLiBzbyB3ZSBqdXN0IGV4cG9ydCBpdHMgYnVmZmVyIHBvaW50ZXJzOgorI2RlZmluZSBNUF9JTUdUWVBFX0VYUE9SVCAwCisvLyBjb2RlYyByZXF1aXJlcyBhIHN0YXRpYyBXTyBidWZmZXIsIGJ1dCBpdCBkb2VzIG9ubHkgcGFydGlhbCB1cGRhdGVzIGxhdGVyOgorI2RlZmluZSBNUF9JTUdUWVBFX1NUQVRJQyAxCisvLyBjb2RlYyBqdXN0IG5lZWRzIHNvbWUgV08gbWVtb3J5LCB3aGVyZSBpdCB3cml0ZXMvY29waWVzIHRoZSB3aG9sZSBmcmFtZSB0bzoKKyNkZWZpbmUgTVBfSU1HVFlQRV9URU1QIDIKKy8vIEkrUCB0eXBlLCByZXF1aXJlcyAyKyBpbmRlcGVuZGVudCBzdGF0aWMgUi9XIGJ1ZmZlcnMKKyNkZWZpbmUgTVBfSU1HVFlQRV9JUCAzCisvLyBJK1ArQiB0eXBlLCByZXF1aXJlcyAyKyBpbmRlcGVuZGVudCBzdGF0aWMgUi9XIGFuZCAxKyB0ZW1wIFdPIGJ1ZmZlcnMKKyNkZWZpbmUgTVBfSU1HVFlQRV9JUEIgNAorLy8gVXBwZXIgMTYgYml0cyBnaXZlIGRlc2lyZWQgYnVmZmVyIG51bWJlciwgLTEgbWVhbnMgZ2V0IG5leHQgYXZhaWxhYmxlCisjZGVmaW5lIE1QX0lNR1RZUEVfTlVNQkVSRUQgNQorLy8gRG9lc24ndCBuZWVkIGFueSBidWZmZXIsIGluY29tcGxldGUgaW1hZ2UgKHByb2JhYmx5IGEgZmlyc3QgZmllbGQgb25seSkKKy8vIHdlIG5lZWQgdGhpcyB0eXBlIHRvIGJlIGFibGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGhhbGYgZnJhbWVzIGFuZAorLy8gYWxsIG90aGVyIGNhc2VzCisjZGVmaW5lIE1QX0lNR1RZUEVfSU5DT01QTEVURSA2CisKKyNkZWZpbmUgTVBfTUFYX1BMQU5FUyA0CisKKyNkZWZpbmUgTVBfSU1HRklFTERfT1JERVJFRCAweDAxCisjZGVmaW5lIE1QX0lNR0ZJRUxEX1RPUF9GSVJTVCAweDAyCisjZGVmaW5lIE1QX0lNR0ZJRUxEX1JFUEVBVF9GSVJTVCAweDA0CisjZGVmaW5lIE1QX0lNR0ZJRUxEX1RPUCAweDA4CisjZGVmaW5lIE1QX0lNR0ZJRUxEX0JPVFRPTSAweDEwCisjZGVmaW5lIE1QX0lNR0ZJRUxEX0lOVEVSTEFDRUQgMHgyMAorCit0eXBlZGVmIHN0cnVjdCBtcF9pbWFnZSB7CisgICAgdW5zaWduZWQgaW50IGZsYWdzOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZTsKKyAgICBpbnQgbnVtYmVyOworICAgIHVuc2lnbmVkIGNoYXIgYnBwOyAgLy8gYml0cy9waXhlbC4gTk9UIGRlcHRoISBmb3IgUkdCIGl0IHdpbGwgYmUgbio4CisgICAgdW5zaWduZWQgaW50IGltZ2ZtdDsKKyAgICBpbnQgd2lkdGgsaGVpZ2h0OyAgLy8gc3RvcmVkIGRpbWVuc2lvbnMKKyAgICBpbnQgeCx5LHcsaDsgIC8vIHZpc2libGUgZGltZW5zaW9ucworICAgIHVuc2lnbmVkIGNoYXIqIHBsYW5lc1tNUF9NQVhfUExBTkVTXTsKKyAgICBpbnQgc3RyaWRlW01QX01BWF9QTEFORVNdOworICAgIGNoYXIgKiBxc2NhbGU7CisgICAgaW50IHFzdHJpZGU7CisgICAgaW50IHBpY3RfdHlwZTsgLy8gMC0+dW5rbm93biwgMS0+SSwgMi0+UCwgMy0+QgorICAgIGludCBmaWVsZHM7CisgICAgaW50IHFzY2FsZV90eXBlOyAvLyAwLT5tcGVnMS80L2gyNjMsIDEtPm1wZWcyCisgICAgaW50IG51bV9wbGFuZXM7CisgICAgLyogdGhlc2UgYXJlIG9ubHkgdXNlZCBieSBwbGFuYXIgZm9ybWF0cyBZLFUoQ2IpLFYoQ3IpICovCisgICAgaW50IGNocm9tYV93aWR0aDsKKyAgICBpbnQgY2hyb21hX2hlaWdodDsKKyAgICBpbnQgY2hyb21hX3hfc2hpZnQ7IC8vIGhvcml6b250YWwKKyAgICBpbnQgY2hyb21hX3lfc2hpZnQ7IC8vIHZlcnRpY2FsCisgICAgaW50IHVzYWdlX2NvdW50OworICAgIC8qIGZvciBwcml2YXRlIHVzZSBieSBmaWx0ZXIgb3Igdm8gZHJpdmVyICh0byBzdG9yZSBidWZmZXIgaWQgb3IgZG1waSkgKi8KKyAgICB2b2lkKiBwcml2OworfSBtcF9pbWFnZV90OworCit2b2lkIGZmX21wX2ltYWdlX3NldGZtdChtcF9pbWFnZV90KiBtcGksdW5zaWduZWQgaW50IG91dF9mbXQpOworbXBfaW1hZ2VfdCogZmZfbmV3X21wX2ltYWdlKGludCB3LGludCBoKTsKK3ZvaWQgZmZfZnJlZV9tcF9pbWFnZShtcF9pbWFnZV90KiBtcGkpOworCittcF9pbWFnZV90KiBmZl9hbGxvY19tcGkoaW50IHcsIGludCBoLCB1bnNpZ25lZCBsb25nIGludCBmbXQpOwordm9pZCBmZl9tcF9pbWFnZV9hbGxvY19wbGFuZXMobXBfaW1hZ2VfdCAqbXBpKTsKK3ZvaWQgZmZfY29weV9tcGkobXBfaW1hZ2VfdCAqZG1waSwgbXBfaW1hZ2VfdCAqbXBpKTsKKworI2VuZGlmIC8qIE1QTEFZRVJfTVBfSU1BR0VfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL21wX21zZy5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL21wX21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxY2RmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvbXBfbXNnLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBNUGxheWVyLgorICoKKyAqIE1QbGF5ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE1QbGF5ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIE1QbGF5ZXI7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBNUExBWUVSX01QX01TR19ICisjZGVmaW5lIE1QTEFZRVJfTVBfTVNHX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvLyBkZWZpbmVkIGluIG1wbGF5ZXIuYyBhbmQgbWVuY29kZXIuYworZXh0ZXJuIGludCB2ZXJib3NlOworCisvLyB2ZXJib3NpdHkgZWxldmVsOgorCisvKiBPbmx5IG1lc3NhZ2VzIGxldmVsIE1TR0xfRkFUQUwtTVNHTF9TVEFUVVMgc2hvdWxkIGJlIHRyYW5zbGF0ZWQsCisgKiBtZXNzYWdlcyBsZXZlbCBNU0dMX1YgYW5kIGFib3ZlIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4gKi8KKworI2RlZmluZSBNU0dMX0ZBVEFMIDAgIC8vIHdpbGwgZXhpdC9hYm9ydAorI2RlZmluZSBNU0dMX0VSUiAxICAgIC8vIGNvbnRpbnVlcworI2RlZmluZSBNU0dMX1dBUk4gMiAgIC8vIG9ubHkgd2FybmluZworI2RlZmluZSBNU0dMX0hJTlQgMyAgIC8vIHNob3J0IGhlbHAgbWVzc2FnZQorI2RlZmluZSBNU0dMX0lORk8gNCAgIC8vIC1xdWlldAorI2RlZmluZSBNU0dMX1NUQVRVUyA1IC8vIHY9MAorI2RlZmluZSBNU0dMX1YgNiAgICAgIC8vIHY9MQorI2RlZmluZSBNU0dMX0RCRzIgNyAgIC8vIHY9MgorI2RlZmluZSBNU0dMX0RCRzMgOCAgIC8vIHY9MworI2RlZmluZSBNU0dMX0RCRzQgOSAgIC8vIHY9NAorI2RlZmluZSBNU0dMX0RCRzUgMTAgIC8vIHY9NQorCisjZGVmaW5lIE1TR0xfRklYTUUgMSAgLy8gZm9yIGNvbnZlcnNpb25zIGZyb20gcHJpbnRmIHdoZXJlIHRoZSBhcHByb3ByaWF0ZSBNU0dMIGlzIG5vdCBrbm93bjsgc2V0IGVxdWFsIHRvIEVSUiBmb3Igb2J0cnVzaXZlbmVzcworI2RlZmluZSBNU0dUX0ZJWE1FIDAgIC8vIGZvciBjb252ZXJzaW9ucyBmcm9tIHByaW50ZiB3aGVyZSB0aGUgYXBwcm9wcmlhdGUgTVNHVCBpcyBub3Qga25vd247IHNldCBlcXVhbCB0byBHTE9CQUwgZm9yIG9idHJ1c2l2ZW5lc3MKKworLy8gY29kZS9tb2R1bGU6CisKKyNkZWZpbmUgTVNHVF9HTE9CQUwgMCAgICAgICAgLy8gY29tbW9uIHBsYXllciBzdHVmZiBlcnJvcnMKKyNkZWZpbmUgTVNHVF9DUExBWUVSIDEgICAgICAgLy8gY29uc29sZSBwbGF5ZXIgKG1wbGF5ZXIuYykKKyNkZWZpbmUgTVNHVF9HUExBWUVSIDIgICAgICAgLy8gZ3VpIHBsYXllcgorCisjZGVmaW5lIE1TR1RfVk8gMyAgICAgICAvLyBsaWJ2bworI2RlZmluZSBNU0dUX0FPIDQgICAgICAgLy8gbGliYW8KKworI2RlZmluZSBNU0dUX0RFTVVYRVIgNSAgICAvLyBkZW11eGVyLmMgKGdlbmVyYWwgc3R1ZmYpCisjZGVmaW5lIE1TR1RfRFMgNiAgICAgICAgIC8vIGRlbXV4IHN0cmVhbSAoYWRkL3JlYWQgcGFja2V0IGV0YykKKyNkZWZpbmUgTVNHVF9ERU1VWCA3ICAgICAgLy8gZmlsZWZvcm1hdC1zcGVjaWZpYyBzdHVmZiAoZGVtdXhfKi5jKQorI2RlZmluZSBNU0dUX0hFQURFUiA4ICAgICAvLyBmaWxlZm9ybWF0LXNwZWNpZmljIGhlYWRlciAoKmhlYWRlci5jKQorCisjZGVmaW5lIE1TR1RfQVZTWU5DIDkgICAgIC8vIG1wbGF5ZXIuYyB0aW1lciBzdHVmZgorI2RlZmluZSBNU0dUX0FVVE9RIDEwICAgICAvLyBtcGxheWVyLmMgYXV0by1xdWFsaXR5IHN0dWZmCisKKyNkZWZpbmUgTVNHVF9DRkdQQVJTRVIgMTEgLy8gY2ZncGFyc2VyLmMKKworI2RlZmluZSBNU0dUX0RFQ0FVRElPIDEyICAvLyBhdiBkZWNvZGVyCisjZGVmaW5lIE1TR1RfREVDVklERU8gMTMKKworI2RlZmluZSBNU0dUX1NFRUsgMTQgICAgLy8gc2Vla2luZyBjb2RlCisjZGVmaW5lIE1TR1RfV0lOMzIgMTUgICAvLyB3aW4zMiBkbGwgc3R1ZmYKKyNkZWZpbmUgTVNHVF9PUEVOIDE2ICAgIC8vIG9wZW4uYyAoc3RyZWFtIG9wZW5pbmcpCisjZGVmaW5lIE1TR1RfRFZEIDE3ICAgICAvLyBvcGVuLmMgKERWRCBpbml0L3JlYWQvc2VlaykKKworI2RlZmluZSBNU0dUX1BBUlNFRVMgMTggLy8gcGFyc2VfZXMuYyAobXBlZyBzdHJlYW0gcGFyc2VyKQorI2RlZmluZSBNU0dUX0xJUkMgMTkgICAgLy8gbGlyY19tcC5jIGFuZCBpbnB1dCBsaXJjIGRyaXZlcgorCisjZGVmaW5lIE1TR1RfU1RSRUFNIDIwICAvLyBzdHJlYW0uYworI2RlZmluZSBNU0dUX0NBQ0hFIDIxICAgLy8gY2FjaGUyLmMKKworI2RlZmluZSBNU0dUX01FTkNPREVSIDIyCisKKyNkZWZpbmUgTVNHVF9YQUNPREVDIDIzIC8vIFhBbmltIGNvZGVjcworCisjZGVmaW5lIE1TR1RfVFYgMjQgICAgICAvLyBUViBpbnB1dCBzdWJzeXN0ZW0KKworI2RlZmluZSBNU0dUX09TREVQIDI1ICAvLyBPUy1kZXBlbmRlbnQgcGFydHMKKworI2RlZmluZSBNU0dUX1NQVURFQyAyNiAvLyBzcHVkZWMuYworCisjZGVmaW5lIE1TR1RfUExBWVRSRUUgMjcgICAgLy8gUGxheXRyZWUgaGFuZGVsaW5nIChwbGF5dHJlZS5jLCBwbGF5dHJlZXBhcnNlci5jKQorCisjZGVmaW5lIE1TR1RfSU5QVVQgMjgKKworI2RlZmluZSBNU0dUX1ZGSUxURVIgMjkKKworI2RlZmluZSBNU0dUX09TRCAzMAorCisjZGVmaW5lIE1TR1RfTkVUV09SSyAzMQorCisjZGVmaW5lIE1TR1RfQ1BVREVURUNUIDMyCisKKyNkZWZpbmUgTVNHVF9DT0RFQ0NGRyAzMworCisjZGVmaW5lIE1TR1RfU1dTIDM0CisKKyNkZWZpbmUgTVNHVF9WT0JTVUIgMzUKKyNkZWZpbmUgTVNHVF9TVUJSRUFERVIgMzYKKworI2RlZmluZSBNU0dUX0FGSUxURVIgMzcgIC8vIEF1ZGlvIGZpbHRlciBtZXNzYWdlcworCisjZGVmaW5lIE1TR1RfTkVUU1QgMzggLy8gTmV0c3RyZWFtCisKKyNkZWZpbmUgTVNHVF9NVVhFUiAzOSAvLyBtdXhlciBsYXllcgorCisjZGVmaW5lIE1TR1RfT1NEX01FTlUgNDAKKworI2RlZmluZSBNU0dUX0lERU5USUZZIDQxICAvLyAtaWRlbnRpZnkgb3V0cHV0CisKKyNkZWZpbmUgTVNHVF9SQURJTyA0MgorCisjZGVmaW5lIE1TR1RfQVNTIDQzIC8vIGxpYmFzcyBtZXNzYWdlcworCisjZGVmaW5lIE1TR1RfTE9BREVSIDQ0IC8vIGRsbCBsb2FkZXIgbWVzc2FnZXMKKworI2RlZmluZSBNU0dUX1NUQVRVU0xJTkUgNDUgLy8gcGxheWJhY2svZW5jb2Rpbmcgc3RhdHVzIGxpbmUKKworI2RlZmluZSBNU0dUX1RFTEVURVhUIDQ2ICAgICAgIC8vIFRlbGV0ZXh0IGRlY29kZXIKKworI2RlZmluZSBNU0dUX01BWCA2NAorCisKK2V4dGVybiBjaGFyICpmZl9tcF9tc2dfY2hhcnNldDsKK2V4dGVybiBpbnQgZmZfbXBfbXNnX2NvbG9yOworZXh0ZXJuIGludCBmZl9tcF9tc2dfbW9kdWxlOworCitleHRlcm4gaW50IGZmX21wX21zZ19sZXZlbHNbTVNHVF9NQVhdOworZXh0ZXJuIGludCBmZl9tcF9tc2dfbGV2ZWxfYWxsOworCisKK3ZvaWQgZmZfbXBfbXNnX2luaXQodm9pZCk7CitpbnQgZmZfbXBfbXNnX3Rlc3QoaW50IG1vZCwgaW50IGxldik7CisKKyNpbmNsdWRlICJjb25maWcuaCIKKwordm9pZCBmZl9tcF9tc2dfdmEoaW50IG1vZCwgaW50IGxldiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKTsKKyNpZmRlZiBfX0dOVUNfXwordm9pZCBmZl9tcF9tc2coaW50IG1vZCwgaW50IGxldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4gKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CisjICAgaWZkZWYgTVBfREVCVUcKKyMgICAgICBkZWZpbmUgbXBfZGJnKG1vZCxsZXYsIGFyZ3MuLi4gKSBmZl9tcF9tc2cobW9kLCBsZXYsICMjIGFyZ3MgKQorIyAgIGVsc2UKKyAgICAgICAvLyBvbmx5IHVzZWZ1bCBmb3IgZGV2ZWxvcGVycywgZGlzYWJsZSBidXQgY2hlY2sgc3ludGF4CisjICAgICAgZGVmaW5lIG1wX2RiZyhtb2QsbGV2LCBhcmdzLi4uICkgZG8geyBpZiAoMCkgZmZfbXBfbXNnKG1vZCwgbGV2LCAjIyBhcmdzICk7IH0gd2hpbGUgKDApCisjICAgZW5kaWYKKyNlbHNlIC8vIG5vdCBHTlUgQwordm9pZCBmZl9tcF9tc2coaW50IG1vZCwgaW50IGxldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4gKTsKKyMgICBpZmRlZiBNUF9ERUJVRworIyAgICAgIGRlZmluZSBtcF9kYmcobW9kLGxldiwgLi4uICkgZmZfbXBfbXNnKG1vZCwgbGV2LCBfX1ZBX0FSR1NfXykKKyMgICBlbHNlCisgICAgICAgLy8gb25seSB1c2VmdWwgZm9yIGRldmVsb3BlcnMsIGRpc2FibGUgYnV0IGNoZWNrIHN5bnRheAorIyAgICAgIGRlZmluZSBtcF9kYmcobW9kLGxldiwgLi4uICkgZG8geyBpZiAoMCkgZmZfbXBfbXNnKG1vZCwgbGV2LCBfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjICAgZW5kaWYKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCitjb25zdCBjaGFyKiBmZl9maWxlbmFtZV9yZWNvZGUoY29uc3QgY2hhciogZmlsZW5hbWUpOworCisjZW5kaWYgLyogTVBMQVlFUl9NUF9NU0dfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL21wY19pbmZvLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvbXBjX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTU0Njk5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL21wY19pbmZvLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE1QbGF5ZXIuCisgKgorICogTVBsYXllciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTVBsYXllciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggTVBsYXllcjsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIE1QTEFZRVJfTVBDX0lORk9fSAorI2RlZmluZSBNUExBWUVSX01QQ19JTkZPX0gKKwordHlwZWRlZiBzdHJ1Y3QgbXBfY29kZWNfaW5mb19zCit7CisgICAgICAgIC8qIGNvZGVjIGxvbmcgbmFtZSAoIkF1dG9kZXNrIEZMSS9GTEMgQW5pbWF0aW9uIGRlY29kZXIiICovCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgIC8qIHNob3J0IG5hbWUgKHNhbWUgYXMgZHJpdmVyIG5hbWUgaW4gY29kZWNzLmNvbmYpICgiZHNob3ciKSAqLworICAgICAgICBjb25zdCBjaGFyICpzaG9ydF9uYW1lOworICAgICAgICAvKiBpbnRlcmZhY2UgYXV0aG9yL21haW50YWluZXIgKi8KKyAgICAgICAgY29uc3QgY2hhciAqbWFpbnRhaW5lcjsKKyAgICAgICAgLyogY29kZWMgYXV0aG9yICgiQWFyb24gSG9sdHptYW4gPGFob2x0em1hQGVzcy5lbmdyLnV2aWMuY2E+IikgKi8KKyAgICAgICAgY29uc3QgY2hhciAqYXV0aG9yOworICAgICAgICAvKiBhbnkgYWRkaXRpb25hbCBjb21tZW50cyAqLworICAgICAgICBjb25zdCBjaGFyICpjb21tZW50OworfSBtcF9jb2RlY19pbmZvX3Q7CisKKyNkZWZpbmUgQ09OVFJPTF9PSyAxCisjZGVmaW5lIENPTlRST0xfVFJVRSAxCisjZGVmaW5lIENPTlRST0xfRkFMU0UgMAorI2RlZmluZSBDT05UUk9MX1VOS05PV04gLTEKKyNkZWZpbmUgQ09OVFJPTF9FUlJPUiAtMgorI2RlZmluZSBDT05UUk9MX05BIC0zCisKKyNlbmRpZiAvKiBNUExBWUVSX01QQ19JTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy92Zi5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL3ZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmYzY2YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy92Zi5oCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTVBsYXllci4KKyAqCisgKiBNUGxheWVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBNUGxheWVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBNUGxheWVyOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgTVBMQVlFUl9WRl9ICisjZGVmaW5lIE1QTEFZRVJfVkZfSAorCisvLyNpbmNsdWRlICJtX29wdGlvbi5oIgorI2luY2x1ZGUgIm1wX2ltYWdlLmgiCisKKy8vZXh0ZXJuIG1fb2JqX3NldHRpbmdzX3QqIHZmX3NldHRpbmdzOworLy9leHRlcm4gY29uc3QgbV9vYmpfbGlzdF90IHZmX29ial9saXN0OworCitzdHJ1Y3QgdmZfaW5zdGFuY2U7CitzdHJ1Y3QgdmZfcHJpdl9zOworCit0eXBlZGVmIHN0cnVjdCB2Zl9pbmZvX3MgeworICAgIGNvbnN0IGNoYXIgKmluZm87CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICphdXRob3I7CisgICAgY29uc3QgY2hhciAqY29tbWVudDsKKyAgICBpbnQgKCp2Zl9vcGVuKShzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLGNoYXIqIGFyZ3MpOworICAgIC8vIFB0ciB0byBhIHN0cnVjdCBkc2NyaWJpbmcgdGhlIG9wdGlvbnMKKyAgICBjb25zdCB2b2lkKiBvcHRzOworfSB2Zl9pbmZvX3Q7CisKKyNkZWZpbmUgTlVNX05VTUJFUkVEX01QSSA1MAorCit0eXBlZGVmIHN0cnVjdCB2Zl9pbWFnZV9jb250ZXh0X3MgeworICAgIG1wX2ltYWdlX3QqIHN0YXRpY19pbWFnZXNbMl07CisgICAgbXBfaW1hZ2VfdCogdGVtcF9pbWFnZXNbMV07CisgICAgbXBfaW1hZ2VfdCogZXhwb3J0X2ltYWdlc1sxXTsKKyAgICBtcF9pbWFnZV90KiBudW1iZXJlZF9pbWFnZXNbTlVNX05VTUJFUkVEX01QSV07CisgICAgaW50IHN0YXRpY19pZHg7Cit9IHZmX2ltYWdlX2NvbnRleHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdmZfZm9ybWF0X2NvbnRleHRfdCB7CisgICAgaW50IGhhdmVfY29uZmlndXJlZDsKKyAgICBpbnQgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG9yaWdfZm10OworfSB2Zl9mb3JtYXRfY29udGV4dF90OworCit0eXBlZGVmIHN0cnVjdCB2Zl9pbnN0YW5jZSB7CisgICAgY29uc3QgdmZfaW5mb190KiBpbmZvOworICAgIC8vIGZ1bmNzOgorICAgIGludCAoKmNvbmZpZykoc3RydWN0IHZmX2luc3RhbmNlICp2ZiwKKyAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZF93aWR0aCwgaW50IGRfaGVpZ2h0LAorICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGludCBvdXRmbXQpOworICAgIGludCAoKmNvbnRyb2wpKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsCisgICAgICAgIGludCByZXF1ZXN0LCB2b2lkKiBkYXRhKTsKKyAgICBpbnQgKCpxdWVyeV9mb3JtYXQpKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsCisgICAgICAgIHVuc2lnbmVkIGludCBmbXQpOworICAgIHZvaWQgKCpnZXRfaW1hZ2UpKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsCisgICAgICAgIG1wX2ltYWdlX3QgKm1waSk7CisgICAgaW50ICgqcHV0X2ltYWdlKShzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLAorICAgICAgICBtcF9pbWFnZV90ICptcGksIGRvdWJsZSBwdHMpOworICAgIHZvaWQgKCpzdGFydF9zbGljZSkoc3RydWN0IHZmX2luc3RhbmNlICp2ZiwKKyAgICAgICAgbXBfaW1hZ2VfdCAqbXBpKTsKKyAgICB2b2lkICgqZHJhd19zbGljZSkoc3RydWN0IHZmX2luc3RhbmNlICp2ZiwKKyAgICAgICAgdW5zaWduZWQgY2hhcioqIHNyYywgaW50KiBzdHJpZGUsIGludCB3LGludCBoLCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgKCp1bmluaXQpKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYpOworCisgICAgaW50ICgqY29udGludWVfYnVmZmVyZWRfaW1hZ2UpKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYpOworICAgIC8vIGNhcHM6CisgICAgdW5zaWduZWQgaW50IGRlZmF1bHRfY2FwczsgLy8gdXNlZCBieSBkZWZhdWx0IHF1ZXJ5X2Zvcm1hdCgpCisgICAgdW5zaWduZWQgaW50IGRlZmF1bHRfcmVxczsgLy8gdXNlZCBieSBkZWZhdWx0IGNvbmZpZygpCisgICAgLy8gZGF0YToKKyAgICBpbnQgdywgaDsKKyAgICB2Zl9pbWFnZV9jb250ZXh0X3QgaW1nY3R4OworICAgIHZmX2Zvcm1hdF9jb250ZXh0X3QgZm10OworICAgIHN0cnVjdCB2Zl9pbnN0YW5jZSAqbmV4dDsKKyAgICBtcF9pbWFnZV90ICpkbXBpOworICAgIHN0cnVjdCB2Zl9wcml2X3MqIHByaXY7Cit9IHZmX2luc3RhbmNlX3Q7CisKKy8vIGNvbnRyb2wgY29kZXM6CisjaW5jbHVkZSAibXBjX2luZm8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgdmZfc2V0ZXFfcworeworICAgIGNvbnN0IGNoYXIgKml0ZW07CisgICAgaW50IHZhbHVlOworfSB2Zl9lcXVhbGl6ZXJfdDsKKworI2RlZmluZSBWRkNUUkxfUVVFUllfTUFYX1BQX0xFVkVMIDQgLyogdGVzdCBmb3IgcG9zdHByb2Nlc3Npbmcgc3VwcG9ydCAobWF4IGxldmVsKSAqLworI2RlZmluZSBWRkNUUkxfU0VUX1BQX0xFVkVMIDUgLyogc2V0IHBvc3Rwcm9jZXNzaW5nIGxldmVsICovCisjZGVmaW5lIFZGQ1RSTF9TRVRfRVFVQUxJWkVSIDYgLyogc2V0IGNvbG9yIG9wdGlvbnMgKGJyaWdodG5lc3MsY29udHJhc3QgZXRjKSAqLworI2RlZmluZSBWRkNUUkxfR0VUX0VRVUFMSVpFUiA4IC8qIGdzZXQgY29sb3Igb3B0aW9ucyAoYnJpZ2h0bmVzcyxjb250cmFzdCBldGMpICovCisjZGVmaW5lIFZGQ1RSTF9EUkFXX09TRCA3CisjZGVmaW5lIFZGQ1RSTF9DSEFOR0VfUkVDVEFOR0xFIDkgLyogQ2hhbmdlIHRoZSByZWN0YW5nbGUgYm91bmRhcmllcyAqLworI2RlZmluZSBWRkNUUkxfRkxJUF9QQUdFIDEwIC8qIFRlbGwgdGhlIHZvIHRvIGZsaXAgcGFnZXMgKi8KKyNkZWZpbmUgVkZDVFJMX0RVUExJQ0FURV9GUkFNRSAxMSAvKiBGb3IgZW5jb2RpbmcgLSBlbmNvZGUgemVyby1jaGFuZ2UgZnJhbWUgKi8KKyNkZWZpbmUgVkZDVFJMX1NLSVBfTkVYVF9GUkFNRSAxMiAvKiBGb3IgZW5jb2RpbmcgLSBkcm9wIHRoZSBuZXh0IGZyYW1lIHRoYXQgcGFzc2VzIHRocm91Z2ggKi8KKyNkZWZpbmUgVkZDVFJMX0ZMVVNIX0ZSQU1FUyAgICAxMyAvKiBGb3IgZW5jb2RpbmcgLSBmbHVzaCBkZWxheWVkIGZyYW1lcyAqLworI2RlZmluZSBWRkNUUkxfU0NSRUVOU0hPVCAgICAgIDE0IC8qIE1ha2UgYSBzY3JlZW5zaG90ICovCisjZGVmaW5lIFZGQ1RSTF9JTklUX0VPU0QgICAgICAgMTUgLyogU2VsZWN0IEVPU0QgcmVuZGVyZXIgKi8KKyNkZWZpbmUgVkZDVFJMX0RSQVdfRU9TRCAgICAgICAxNiAvKiBSZW5kZXIgRU9TRCAqLworI2RlZmluZSBWRkNUUkxfR0VUX1BUUyAgICAgICAgIDE3IC8qIFJldHVybiBsYXN0IHB0cyB2YWx1ZSB0aGF0IHJlYWNoZWQgdmZfdm8qLworI2RlZmluZSBWRkNUUkxfU0VUX0RFSU5URVJMQUNFIDE4IC8qIFNldCBkZWludGVybGFjaW5nIHN0YXR1cyAqLworI2RlZmluZSBWRkNUUkxfR0VUX0RFSU5URVJMQUNFIDE5IC8qIEdldCBkZWludGVybGFjaW5nIHN0YXR1cyAqLworCisjaW5jbHVkZSAidmZjYXAuaCIKKworLy9GSVhNRSB0aGlzIHNob3VsZCBiZSBpbiBhIGNvbW1vbiBoZWFkZXIsIGJ1dCBpIGR1bm5vIHdoaWNoCisjZGVmaW5lIE1QX05PUFRTX1ZBTFVFICgtMUxMPDw2MykgLy9ib3RoIGludDY0X3QgYW5kIGRvdWJsZSBzaG91bGQgYmUgYWJsZSB0byByZXByZXNlbnQgdGhpcyBleGFjdGx5CisKKworLy8gZnVuY3Rpb25zOgordm9pZCBmZl92Zl9tcGlfY2xlYXIobXBfaW1hZ2VfdCogbXBpLGludCB4MCxpbnQgeTAsaW50IHcsaW50IGgpOworbXBfaW1hZ2VfdCogZmZfdmZfZ2V0X2ltYWdlKHZmX2luc3RhbmNlX3QqIHZmLCB1bnNpZ25lZCBpbnQgb3V0Zm10LCBpbnQgbXBfaW1ndHlwZSwgaW50IG1wX2ltZ2ZsYWcsIGludCB3LCBpbnQgaCk7CisKK3ZmX2luc3RhbmNlX3QqIHZmX29wZW5fcGx1Z2luKGNvbnN0IHZmX2luZm9fdCogY29uc3QqIGZpbHRlcl9saXN0LCB2Zl9pbnN0YW5jZV90KiBuZXh0LCBjb25zdCBjaGFyICpuYW1lLCBjaGFyICoqYXJncyk7Cit2Zl9pbnN0YW5jZV90KiB2Zl9vcGVuX2ZpbHRlcih2Zl9pbnN0YW5jZV90KiBuZXh0LCBjb25zdCBjaGFyICpuYW1lLCBjaGFyICoqYXJncyk7Cit2Zl9pbnN0YW5jZV90KiBmZl92Zl9hZGRfYmVmb3JlX3ZvKHZmX2luc3RhbmNlX3QgKip2ZiwgY2hhciAqbmFtZSwgY2hhciAqKmFyZ3MpOwordmZfaW5zdGFuY2VfdCogdmZfb3Blbl9lbmNvZGVyKHZmX2luc3RhbmNlX3QqIG5leHQsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmFyZ3MpOworCit1bnNpZ25lZCBpbnQgZmZfdmZfbWF0Y2hfY3NwKHZmX2luc3RhbmNlX3QqKiB2ZnAsY29uc3QgdW5zaWduZWQgaW50KiBsaXN0LHVuc2lnbmVkIGludCBwcmVmZXJyZWQpOwordm9pZCBmZl92Zl9jbG9uZV9tcGlfYXR0cmlidXRlcyhtcF9pbWFnZV90KiBkc3QsIG1wX2ltYWdlX3QqIHNyYyk7Cit2b2lkIGZmX3ZmX3F1ZXVlX2ZyYW1lKHZmX2luc3RhbmNlX3QgKnZmLCBpbnQgKCopKHZmX2luc3RhbmNlX3QgKikpOworaW50IGZmX3ZmX291dHB1dF9xdWV1ZWRfZnJhbWUodmZfaW5zdGFuY2VfdCAqdmYpOworCisvLyBkZWZhdWx0IHdyYXBwZXJzOgoraW50IGZmX3ZmX25leHRfY29uZmlnKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsCisgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRfd2lkdGgsIGludCBkX2hlaWdodCwKKyAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgb3V0Zm10KTsKK2ludCBmZl92Zl9uZXh0X2NvbnRyb2woc3RydWN0IHZmX2luc3RhbmNlICp2ZiwgaW50IHJlcXVlc3QsIHZvaWQqIGRhdGEpOwordm9pZCBmZl92Zl9leHRyYV9mbGlwKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYpOworaW50IGZmX3ZmX25leHRfcXVlcnlfZm9ybWF0KHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsIHVuc2lnbmVkIGludCBmbXQpOworaW50IGZmX3ZmX25leHRfcHV0X2ltYWdlKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsbXBfaW1hZ2VfdCAqbXBpLCBkb3VibGUgcHRzKTsKK3ZvaWQgZmZfdmZfbmV4dF9kcmF3X3NsaWNlIChzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLCB1bnNpZ25lZCBjaGFyKiogc3JjLCBpbnQqIHN0cmlkZSwgaW50IHcsaW50IGgsIGludCB4LCBpbnQgeSk7CisKK3ZmX2luc3RhbmNlX3QqIGZmX2FwcGVuZF9maWx0ZXJzKHZmX2luc3RhbmNlX3QqIGxhc3QpOworCit2b2lkIGZmX3ZmX3VuaW5pdF9maWx0ZXIodmZfaW5zdGFuY2VfdCogdmYpOwordm9pZCBmZl92Zl91bmluaXRfZmlsdGVyX2NoYWluKHZmX2luc3RhbmNlX3QqIHZmKTsKKworaW50IGZmX3ZmX2NvbmZpZ193cmFwcGVyKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZF93aWR0aCwgaW50IGRfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IG91dGZtdCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IG5vcm1fcXNjYWxlKGludCBxc2NhbGUsIGludCB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgMDogLy8gTVBFRy0xCisgICAgICAgIHJldHVybiBxc2NhbGU7CisgICAgY2FzZSAxOiAvLyBNUEVHLTIKKyAgICAgICAgcmV0dXJuIHFzY2FsZSA+PiAxOworICAgIGNhc2UgMjogLy8gSDI2NAorICAgICAgICByZXR1cm4gcXNjYWxlID4+IDI7CisgICAgY2FzZSAzOiAvLyBWUDU2CisgICAgICAgIHJldHVybiAoNjMgLSBxc2NhbGUgKyAyKSA+PiAyOworICAgIH0KKyAgICByZXR1cm4gcXNjYWxlOworfQorCisjZW5kaWYgLyogTVBMQVlFUl9WRl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvdmZfZXEuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy92Zl9lcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTE2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvdmZfZXEuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE1QbGF5ZXIuCisgKgorICogTVBsYXllciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTVBsYXllciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggTVBsYXllcjsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibXBfbXNnLmgiCisjaW5jbHVkZSAiY3B1ZGV0ZWN0LmgiCisKKyNpbmNsdWRlICJpbWdfZm9ybWF0LmgiCisjaW5jbHVkZSAibXBfaW1hZ2UuaCIKKyNpbmNsdWRlICJ2Zi5oIgorCisjaW5jbHVkZSAibGlidm8vdmlkZW9fb3V0LmgiCisKK3N0cnVjdCB2Zl9wcml2X3MgeworICAgICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgICAgIGludCBicmlnaHRuZXNzOworICAgICAgICBpbnQgY29udHJhc3Q7Cit9OworCisjaWYgSEFWRV9NTVhfSU5MSU5FICYmIEhBVkVfNlJFR1MKK3N0YXRpYyB2b2lkIHByb2Nlc3NfTU1YKHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBkc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBicmlnaHRuZXNzLCBpbnQgY29udHJhc3QpCit7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgcGVsOworICAgICAgICBpbnQgZHN0ZXAgPSBkc3RyaWRlLXc7CisgICAgICAgIGludCBzc3RlcCA9IHNzdHJpZGUtdzsKKyAgICAgICAgc2hvcnQgYnJ2ZWNbNF07CisgICAgICAgIHNob3J0IGNvbnR2ZWNbNF07CisKKyAgICAgICAgY29udHJhc3QgPSAoKGNvbnRyYXN0KzEwMCkqMjU2KjE2KS8xMDA7CisgICAgICAgIGJyaWdodG5lc3MgPSAoKGJyaWdodG5lc3MrMTAwKSo1MTEpLzIwMC0xMjggLSBjb250cmFzdC8zMjsKKworICAgICAgICBicnZlY1swXSA9IGJydmVjWzFdID0gYnJ2ZWNbMl0gPSBicnZlY1szXSA9IGJyaWdodG5lc3M7CisgICAgICAgIGNvbnR2ZWNbMF0gPSBjb250dmVjWzFdID0gY29udHZlY1syXSA9IGNvbnR2ZWNbM10gPSBjb250cmFzdDsKKworICAgICAgICB3aGlsZSAoaC0tKSB7CisgICAgICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAgICAgICAgICAgICAibW92cSAoJTUpLCAlJW1tMyBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgIm1vdnEgKCU2KSwgJSVtbTQgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJweG9yICUlbW0wLCAlJW1tMCBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmwgJTQsICUlZWF4XG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTTUFMSUdOKDQpCisgICAgICAgICAgICAgICAgICAgICAgICAiMTogXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZxICglMCksICUlbW0xIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAibW92cSAoJTApLCAlJW1tMiBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTEgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTAsICUlbW0yIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAicHNsbHcgJDQsICUlbW0xIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAicHNsbHcgJDQsICUlbW0yIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAicG11bGh3ICUlbW00LCAlJW1tMSBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgInBtdWxodyAlJW1tNCwgJSVtbTIgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTEgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTIgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrdXN3YiAlJW1tMiwgJSVtbTEgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhZGQgJDgsICUwIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAibW92cSAlJW1tMSwgKCUxKSBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgImFkZCAkOCwgJTEgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZWNsICUlZWF4IFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAiam56IDFiIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIgKHNyYyksICI9ciIgKGRlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIiAoc3JjKSwgIjEiIChkZXN0KSwgInIiICh3Pj4zKSwgInIiIChicnZlYyksICJyIiAoY29udHZlYykKKyAgICAgICAgICAgICAgICAgICAgICAgIDogIiVlYXgiCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IHcmNzsgaTsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbCA9ICgoKnNyYysrKiBjb250cmFzdCk+PjEyKSArIGJyaWdodG5lc3M7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwZWwmNzY4KSBwZWwgPSAoLXBlbCk+PjMxOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHBlbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcmMgKz0gc3N0ZXA7CisgICAgICAgICAgICAgICAgZGVzdCArPSBkc3RlcDsKKyAgICAgICAgfQorICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggImVtbXMgXG5cdCIgOjo6ICJtZW1vcnkiICk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcHJvY2Vzc19DKHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBkc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBicmlnaHRuZXNzLCBpbnQgY29udHJhc3QpCit7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgcGVsOworICAgICAgICBpbnQgZHN0ZXAgPSBkc3RyaWRlLXc7CisgICAgICAgIGludCBzc3RlcCA9IHNzdHJpZGUtdzsKKworICAgICAgICBjb250cmFzdCA9ICgoY29udHJhc3QrMTAwKSoyNTYqMjU2KS8xMDA7CisgICAgICAgIGJyaWdodG5lc3MgPSAoKGJyaWdodG5lc3MrMTAwKSo1MTEpLzIwMC0xMjggLSBjb250cmFzdC81MTI7CisKKyAgICAgICAgd2hpbGUgKGgtLSkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IHc7IGk7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwZWwgPSAoKCpzcmMrKyogY29udHJhc3QpPj4xNikgKyBicmlnaHRuZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYocGVsJjc2OCkgcGVsID0gKC1wZWwpPj4zMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBwZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNyYyArPSBzc3RlcDsKKyAgICAgICAgICAgICAgICBkZXN0ICs9IGRzdGVwOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkICgqcHJvY2VzcykodW5zaWduZWQgY2hhciAqZGVzdCwgaW50IGRzdHJpZGUsIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IGJyaWdodG5lc3MsIGludCBjb250cmFzdCk7CisKKy8qIEZJWE1FOiBhZGQgcGFja2VkIHl1diB2ZXJzaW9uIG9mIHByb2Nlc3MgKi8KKworc3RhdGljIGludCBwdXRfaW1hZ2Uoc3RydWN0IHZmX2luc3RhbmNlICp2ZiwgbXBfaW1hZ2VfdCAqbXBpLCBkb3VibGUgcHRzKQoreworICAgICAgICBtcF9pbWFnZV90ICpkbXBpOworCisgICAgICAgIGRtcGk9ZmZfdmZfZ2V0X2ltYWdlKHZmLT5uZXh0LCBtcGktPmltZ2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTVBfSU1HVFlQRV9FWFBPUlQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1waS0+dywgbXBpLT5oKTsKKworICAgICAgICBkbXBpLT5zdHJpZGVbMF0gPSBtcGktPnN0cmlkZVswXTsKKyAgICAgICAgZG1waS0+cGxhbmVzWzFdID0gbXBpLT5wbGFuZXNbMV07CisgICAgICAgIGRtcGktPnBsYW5lc1syXSA9IG1waS0+cGxhbmVzWzJdOworICAgICAgICBkbXBpLT5zdHJpZGVbMV0gPSBtcGktPnN0cmlkZVsxXTsKKyAgICAgICAgZG1waS0+c3RyaWRlWzJdID0gbXBpLT5zdHJpZGVbMl07CisKKyAgICAgICAgaWYgKCF2Zi0+cHJpdi0+YnVmKSB2Zi0+cHJpdi0+YnVmID0gbWFsbG9jKG1waS0+c3RyaWRlWzBdKm1waS0+aCk7CisKKyAgICAgICAgaWYgKCh2Zi0+cHJpdi0+YnJpZ2h0bmVzcyA9PSAwKSAmJiAodmYtPnByaXYtPmNvbnRyYXN0ID09IDApKQorICAgICAgICAgICAgICAgIGRtcGktPnBsYW5lc1swXSA9IG1waS0+cGxhbmVzWzBdOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBkbXBpLT5wbGFuZXNbMF0gPSB2Zi0+cHJpdi0+YnVmOworICAgICAgICAgICAgICAgIHByb2Nlc3MoZG1waS0+cGxhbmVzWzBdLCBkbXBpLT5zdHJpZGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBtcGktPnBsYW5lc1swXSwgbXBpLT5zdHJpZGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBtcGktPncsIG1waS0+aCwgdmYtPnByaXYtPmJyaWdodG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICB2Zi0+cHJpdi0+Y29udHJhc3QpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZmX3ZmX25leHRfcHV0X2ltYWdlKHZmLGRtcGksIHB0cyk7Cit9CisKK3N0YXRpYyBpbnQgY29udHJvbChzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLCBpbnQgcmVxdWVzdCwgdm9pZCogZGF0YSkKK3sKKyAgICAgICAgdmZfZXF1YWxpemVyX3QgKmVxOworCisgICAgICAgIHN3aXRjaCAocmVxdWVzdCkgeworICAgICAgICBjYXNlIFZGQ1RSTF9TRVRfRVFVQUxJWkVSOgorICAgICAgICAgICAgICAgIGVxID0gZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChlcS0+aXRlbSwiYnJpZ2h0bmVzcyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2Zi0+cHJpdi0+YnJpZ2h0bmVzcyA9IGVxLT52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT05UUk9MX1RSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXEtPml0ZW0sImNvbnRyYXN0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZmLT5wcml2LT5jb250cmFzdCA9IGVxLT52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT05UUk9MX1RSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZGQ1RSTF9HRVRfRVFVQUxJWkVSOgorICAgICAgICAgICAgICAgIGVxID0gZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChlcS0+aXRlbSwiYnJpZ2h0bmVzcyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcS0+dmFsdWUgPSB2Zi0+cHJpdi0+YnJpZ2h0bmVzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT05UUk9MX1RSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXEtPml0ZW0sImNvbnRyYXN0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxLT52YWx1ZSA9IHZmLT5wcml2LT5jb250cmFzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT05UUk9MX1RSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmZl92Zl9uZXh0X2NvbnRyb2wodmYsIHJlcXVlc3QsIGRhdGEpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdChzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLCB1bnNpZ25lZCBpbnQgZm10KQoreworICAgICAgICBzd2l0Y2ggKGZtdCkgeworICAgICAgICBjYXNlIElNR0ZNVF9ZVlU5OgorICAgICAgICBjYXNlIElNR0ZNVF9JRjA5OgorICAgICAgICBjYXNlIElNR0ZNVF9ZVjEyOgorICAgICAgICBjYXNlIElNR0ZNVF9JNDIwOgorICAgICAgICBjYXNlIElNR0ZNVF9JWVVWOgorICAgICAgICBjYXNlIElNR0ZNVF9DTFBMOgorICAgICAgICBjYXNlIElNR0ZNVF9ZODAwOgorICAgICAgICBjYXNlIElNR0ZNVF9ZODoKKyAgICAgICAgY2FzZSBJTUdGTVRfTlYxMjoKKyAgICAgICAgY2FzZSBJTUdGTVRfTlYyMToKKyAgICAgICAgY2FzZSBJTUdGTVRfNDQ0UDoKKyAgICAgICAgY2FzZSBJTUdGTVRfNDIyUDoKKyAgICAgICAgY2FzZSBJTUdGTVRfNDExUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmZfdmZfbmV4dF9xdWVyeV9mb3JtYXQodmYsIGZtdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVuaW5pdChzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmKQoreworICAgICAgICBmcmVlKHZmLT5wcml2LT5idWYpOworICAgICAgICBmcmVlKHZmLT5wcml2KTsKK30KKworc3RhdGljIGludCB2Zl9vcGVuKHZmX2luc3RhbmNlX3QgKnZmLCBjaGFyICphcmdzKQoreworICAgICAgICB2Zi0+Y29udHJvbD1jb250cm9sOworICAgICAgICB2Zi0+cXVlcnlfZm9ybWF0PXF1ZXJ5X2Zvcm1hdDsKKyAgICAgICAgdmYtPnB1dF9pbWFnZT1wdXRfaW1hZ2U7CisgICAgICAgIHZmLT51bmluaXQ9dW5pbml0OworCisgICAgdmYtPnByaXYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB2Zl9wcml2X3MpKTsKKyAgICBtZW1zZXQodmYtPnByaXYsIDAsIHNpemVvZihzdHJ1Y3QgdmZfcHJpdl9zKSk7CisgICAgaWYgKGFyZ3MpIHNzY2FuZihhcmdzLCAiJWQ6JWQiLCAmdmYtPnByaXYtPmJyaWdodG5lc3MsICZ2Zi0+cHJpdi0+Y29udHJhc3QpOworCisgICAgICAgIHByb2Nlc3MgPSBwcm9jZXNzX0M7CisjaWYgSEFWRV9NTVhfSU5MSU5FICYmIEhBVkVfNlJFR1MKKyAgICAgICAgaWYoZmZfZ0NwdUNhcHMuaGFzTU1YKSBwcm9jZXNzID0gcHJvY2Vzc19NTVg7CisjZW5kaWYKKworICAgICAgICByZXR1cm4gMTsKK30KKworY29uc3QgdmZfaW5mb190IGZmX3ZmX2luZm9fZXEgPSB7CisgICAgICAgICJzb2Z0IHZpZGVvIGVxdWFsaXplciIsCisgICAgICAgICJlcSIsCisgICAgICAgICJSaWNoYXJkIEZlbGtlciIsCisgICAgICAgICIiLAorICAgICAgICB2Zl9vcGVuLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy92Zl9lcTIuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy92Zl9lcTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGEyYjkyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL3ZmX2VxMi5jCkBAIC0wLDAgKzEsNTE5IEBACisvKgorICogU29mdHdhcmUgZXF1YWxpemVyIChicmlnaHRuZXNzLCBjb250cmFzdCwgZ2FtbWEsIHNhdHVyYXRpb24pCisgKgorICogSGFtcGEgSHVnIDxoYW1wYUBoYW1wYS5jaD4gKG9yaWdpbmFsIExVVCBnYW1tYS9jb250cmFzdC9icmlnaHRuZXNzIGZpbHRlcikKKyAqIERhbmllbCBNb3Jlbm8gPGNvbWFjQGNvbWFjLmRhcmt0ZWNoLm9yZz4gKHNhdHVyYXRpb24sIFIvRy9CIGdhbW1hIHN1cHBvcnQpCisgKiBSaWNoYXJkIEZlbGtlciAob3JpZ2luYWwgTU1YIGNvbnRyYXN0L2JyaWdodG5lc3MgY29kZSAodmZfZXEuYykpCisgKiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWxuaUBnbXguYXQ+IChMVVQxNikKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBNUGxheWVyLgorICoKKyAqIE1QbGF5ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE1QbGF5ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIE1QbGF5ZXI7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJtcF9tc2cuaCIKKyNpbmNsdWRlICJjcHVkZXRlY3QuaCIKKworI2luY2x1ZGUgImltZ19mb3JtYXQuaCIKKyNpbmNsdWRlICJtcF9pbWFnZS5oIgorI2luY2x1ZGUgInZmLmgiCisKKyNkZWZpbmUgTFVUMTYKKworLyogUGVyIGNoYW5uZWwgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgZXEyX3BhcmFtX3QgeworICB1bnNpZ25lZCBjaGFyIGx1dFsyNTZdOworI2lmZGVmIExVVDE2CisgIHVpbnQxNl90IGx1dDE2WzI1NioyNTZdOworI2VuZGlmCisgIGludCAgICAgICAgICAgbHV0X2NsZWFuOworCisgIHZvaWQgKCphZGp1c3QpIChzdHJ1Y3QgZXEyX3BhcmFtX3QgKnBhciwgdW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBjaGFyICpzcmMsCisgICAgdW5zaWduZWQgdywgdW5zaWduZWQgaCwgdW5zaWduZWQgZHN0cmlkZSwgdW5zaWduZWQgc3N0cmlkZSk7CisKKyAgZG91YmxlICAgICAgICBjOworICBkb3VibGUgICAgICAgIGI7CisgIGRvdWJsZSAgICAgICAgZzsKKyAgZG91YmxlICAgICAgICB3OworfSBlcTJfcGFyYW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgdmZfcHJpdl9zIHsKKyAgZXEyX3BhcmFtX3QgcGFyYW1bM107CisKKyAgZG91YmxlICAgICAgICBjb250cmFzdDsKKyAgZG91YmxlICAgICAgICBicmlnaHRuZXNzOworICBkb3VibGUgICAgICAgIHNhdHVyYXRpb247CisKKyAgZG91YmxlICAgICAgICBnYW1tYTsKKyAgZG91YmxlICAgICAgICBnYW1tYV93ZWlnaHQ7CisgIGRvdWJsZSAgICAgICAgcmdhbW1hOworICBkb3VibGUgICAgICAgIGdnYW1tYTsKKyAgZG91YmxlICAgICAgICBiZ2FtbWE7CisKKyAgdW5zaWduZWQgICAgICBidWZfd1szXTsKKyAgdW5zaWduZWQgICAgICBidWZfaFszXTsKKyAgdW5zaWduZWQgY2hhciAqYnVmWzNdOworfSB2Zl9lcTJfdDsKKworCitzdGF0aWMKK3ZvaWQgY3JlYXRlX2x1dCAoZXEyX3BhcmFtX3QgKnBhcikKK3sKKyAgdW5zaWduZWQgaTsKKyAgZG91YmxlICAgZywgdjsKKyAgZG91YmxlICAgbHcsIGd3OworCisgIGcgPSBwYXItPmc7CisgIGd3ID0gcGFyLT53OworICBsdyA9IDEuMCAtIGd3OworCisgIGlmICgoZyA8IDAuMDAxKSB8fCAoZyA+IDEwMDAuMCkpIHsKKyAgICBnID0gMS4wOworICB9CisKKyAgZyA9IDEuMCAvIGc7CisKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgdiA9IChkb3VibGUpIGkgLyAyNTUuMDsKKyAgICB2ID0gcGFyLT5jICogKHYgLSAwLjUpICsgMC41ICsgcGFyLT5iOworCisgICAgaWYgKHYgPD0gMC4wKSB7CisgICAgICBwYXItPmx1dFtpXSA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdiA9IHYqbHcgKyBwb3codiwgZykqZ3c7CisKKyAgICAgIGlmICh2ID49IDEuMCkgeworICAgICAgICBwYXItPmx1dFtpXSA9IDI1NTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwYXItPmx1dFtpXSA9ICh1bnNpZ25lZCBjaGFyKSAoMjU2LjAgKiB2KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmZGVmIExVVDE2CisgIGZvcihpPTA7IGk8MjU2KjI1NjsgaSsrKXsKKyAgICBwYXItPmx1dDE2W2ldPSBwYXItPmx1dFtpJjB4RkZdICsgKHBhci0+bHV0W2k+PjhdPDw4KTsKKyAgfQorI2VuZGlmCisKKyAgcGFyLT5sdXRfY2xlYW4gPSAxOworfQorCisjaWYgSEFWRV9NTVhfSU5MSU5FICYmIEhBVkVfNlJFR1MKK3N0YXRpYwordm9pZCBhZmZpbmVfMWRfTU1YIChlcTJfcGFyYW1fdCAqcGFyLCB1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywKKyAgdW5zaWduZWQgdywgdW5zaWduZWQgaCwgdW5zaWduZWQgZHN0cmlkZSwgdW5zaWduZWQgc3N0cmlkZSkKK3sKKyAgdW5zaWduZWQgaTsKKyAgaW50ICAgICAgY29udHJhc3QsIGJyaWdodG5lc3M7CisgIHVuc2lnbmVkIGRzdGVwLCBzc3RlcDsKKyAgaW50ICAgICAgcGVsOworICBzaG9ydCAgICBicnZlY1s0XTsKKyAgc2hvcnQgICAgY29udHZlY1s0XTsKKworLy8gIHByaW50ZigiXG5tbXg6IHNyYz0lcCBkc3Q9JXAgdz0lZCBoPSVkIGRzPSVkIHNzPSVkXG4iLHNyYyxkc3QsdyxoLGRzdHJpZGUsc3N0cmlkZSk7CisKKyAgY29udHJhc3QgPSAoaW50KSAocGFyLT5jICogMjU2ICogMTYpOworICBicmlnaHRuZXNzID0gKChpbnQpICgxMDAuMCAqIHBhci0+YiArIDEwMC4wKSAqIDUxMSkgLyAyMDAgLSAxMjggLSBjb250cmFzdCAvIDMyOworCisgIGJydmVjWzBdID0gYnJ2ZWNbMV0gPSBicnZlY1syXSA9IGJydmVjWzNdID0gYnJpZ2h0bmVzczsKKyAgY29udHZlY1swXSA9IGNvbnR2ZWNbMV0gPSBjb250dmVjWzJdID0gY29udHZlY1szXSA9IGNvbnRyYXN0OworCisgIHNzdGVwID0gc3N0cmlkZSAtIHc7CisgIGRzdGVwID0gZHN0cmlkZSAtIHc7CisKKyAgd2hpbGUgKGgtLSA+IDApIHsKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICJtb3ZxICglNSksICUlbW0zIFxuXHQiCisgICAgICAibW92cSAoJTYpLCAlJW1tNCBcblx0IgorICAgICAgInB4b3IgJSVtbTAsICUlbW0wIFxuXHQiCisgICAgICAibW92bCAlNCwgJSVlYXhcblx0IgorICAgICAgQVNNQUxJR04oNCkKKyAgICAgICIxOiBcblx0IgorICAgICAgIm1vdnEgKCUwKSwgJSVtbTEgXG5cdCIKKyAgICAgICJtb3ZxICglMCksICUlbW0yIFxuXHQiCisgICAgICAicHVucGNrbGJ3ICUlbW0wLCAlJW1tMSBcblx0IgorICAgICAgInB1bnBja2hidyAlJW1tMCwgJSVtbTIgXG5cdCIKKyAgICAgICJwc2xsdyAkNCwgJSVtbTEgXG5cdCIKKyAgICAgICJwc2xsdyAkNCwgJSVtbTIgXG5cdCIKKyAgICAgICJwbXVsaHcgJSVtbTQsICUlbW0xIFxuXHQiCisgICAgICAicG11bGh3ICUlbW00LCAlJW1tMiBcblx0IgorICAgICAgInBhZGR3ICUlbW0zLCAlJW1tMSBcblx0IgorICAgICAgInBhZGR3ICUlbW0zLCAlJW1tMiBcblx0IgorICAgICAgInBhY2t1c3diICUlbW0yLCAlJW1tMSBcblx0IgorICAgICAgImFkZCAkOCwgJTAgXG5cdCIKKyAgICAgICJtb3ZxICUlbW0xLCAoJTEpIFxuXHQiCisgICAgICAiYWRkICQ4LCAlMSBcblx0IgorICAgICAgImRlY2wgJSVlYXggXG5cdCIKKyAgICAgICJqbnogMWIgXG5cdCIKKyAgICAgIDogIj1yIiAoc3JjKSwgIj1yIiAoZHN0KQorICAgICAgOiAiMCIgKHNyYyksICIxIiAoZHN0KSwgInIiICh3ID4+IDMpLCAiciIgKGJydmVjKSwgInIiIChjb250dmVjKQorICAgICAgOiAiJWVheCIKKyAgICApOworCisgICAgZm9yIChpID0gdyAmIDc7IGkgPiAwOyBpLS0pIHsKKyAgICAgIHBlbCA9ICgoKnNyYysrICogY29udHJhc3QpID4+IDEyKSArIGJyaWdodG5lc3M7CisgICAgICBpZiAocGVsICYgNzY4KSB7CisgICAgICAgIHBlbCA9ICgtcGVsKSA+PiAzMTsKKyAgICAgIH0KKyAgICAgICpkc3QrKyA9IHBlbDsKKyAgICB9CisKKyAgICBzcmMgKz0gc3N0ZXA7CisgICAgZHN0ICs9IGRzdGVwOworICB9CisKKyAgX19hc21fXyB2b2xhdGlsZSAoICJlbW1zIFxuXHQiIDo6OiAibWVtb3J5IiApOworfQorI2VuZGlmCisKK3N0YXRpYwordm9pZCBhcHBseV9sdXQgKGVxMl9wYXJhbV90ICpwYXIsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgY2hhciAqc3JjLAorICB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLCB1bnNpZ25lZCBkc3RyaWRlLCB1bnNpZ25lZCBzc3RyaWRlKQoreworICB1bnNpZ25lZCAgICAgIGksIGosIHcyOworICB1bnNpZ25lZCBjaGFyICpsdXQ7CisgIHVpbnQxNl90ICpsdXQxNjsKKworICBpZiAoIXBhci0+bHV0X2NsZWFuKSB7CisgICAgY3JlYXRlX2x1dCAocGFyKTsKKyAgfQorCisgIGx1dCA9IHBhci0+bHV0OworI2lmZGVmIExVVDE2CisgIGx1dDE2ID0gcGFyLT5sdXQxNjsKKyAgdzI9ICh3Pj4zKTw8MjsKKyAgZm9yIChqID0gMDsgaiA8IGg7IGorKykgeworICAgIHVpbnQxNl90ICpzcmMxNj0gKHVpbnQxNl90KilzcmM7CisgICAgdWludDE2X3QgKmRzdDE2PSAodWludDE2X3QqKWRzdDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdzI7IGkrPTQpIHsKKyAgICAgIGRzdDE2W2krMF0gPSBsdXQxNltzcmMxNltpKzBdXTsKKyAgICAgIGRzdDE2W2krMV0gPSBsdXQxNltzcmMxNltpKzFdXTsKKyAgICAgIGRzdDE2W2krMl0gPSBsdXQxNltzcmMxNltpKzJdXTsKKyAgICAgIGRzdDE2W2krM10gPSBsdXQxNltzcmMxNltpKzNdXTsKKyAgICB9CisgICAgaSA8PD0gMTsKKyNlbHNlCisgIHcyPSAodz4+Myk8PDM7CisgIGZvciAoaiA9IDA7IGogPCBoOyBqKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdzI7IGkrPTgpIHsKKyAgICAgIGRzdFtpKzBdID0gbHV0W3NyY1tpKzBdXTsKKyAgICAgIGRzdFtpKzFdID0gbHV0W3NyY1tpKzFdXTsKKyAgICAgIGRzdFtpKzJdID0gbHV0W3NyY1tpKzJdXTsKKyAgICAgIGRzdFtpKzNdID0gbHV0W3NyY1tpKzNdXTsKKyAgICAgIGRzdFtpKzRdID0gbHV0W3NyY1tpKzRdXTsKKyAgICAgIGRzdFtpKzVdID0gbHV0W3NyY1tpKzVdXTsKKyAgICAgIGRzdFtpKzZdID0gbHV0W3NyY1tpKzZdXTsKKyAgICAgIGRzdFtpKzddID0gbHV0W3NyY1tpKzddXTsKKyAgICB9CisjZW5kaWYKKyAgICBmb3IgKDsgaSA8IHc7IGkrKykgeworICAgICAgZHN0W2ldID0gbHV0W3NyY1tpXV07CisgICAgfQorCisgICAgc3JjICs9IHNzdHJpZGU7CisgICAgZHN0ICs9IGRzdHJpZGU7CisgIH0KK30KKworc3RhdGljCitpbnQgcHV0X2ltYWdlICh2Zl9pbnN0YW5jZV90ICp2ZiwgbXBfaW1hZ2VfdCAqc3JjLCBkb3VibGUgcHRzKQoreworICB1bnNpZ25lZCAgICAgIGk7CisgIHZmX2VxMl90ICAgICAgKmVxMjsKKyAgbXBfaW1hZ2VfdCAgICAqZHN0OworICB1bnNpZ25lZCBsb25nIGltZ19uLGltZ19jOworCisgIGVxMiA9IHZmLT5wcml2OworCisgIGlmICgoZXEyLT5idWZfd1swXSAhPSBzcmMtPncpIHx8IChlcTItPmJ1Zl9oWzBdICE9IHNyYy0+aCkpIHsKKyAgICBlcTItPmJ1Zl93WzBdID0gc3JjLT53OworICAgIGVxMi0+YnVmX2hbMF0gPSBzcmMtPmg7CisgICAgICBlcTItPmJ1Zl93WzFdID0gZXEyLT5idWZfd1syXSA9IHNyYy0+dyA+PiBzcmMtPmNocm9tYV94X3NoaWZ0OworICAgICAgZXEyLT5idWZfaFsxXSA9IGVxMi0+YnVmX2hbMl0gPSBzcmMtPmggPj4gc3JjLT5jaHJvbWFfeV9zaGlmdDsKKyAgICBpbWdfbiA9IGVxMi0+YnVmX3dbMF0qZXEyLT5idWZfaFswXTsKKyAgICBpZihzcmMtPm51bV9wbGFuZXM+MSl7CisgICAgICBpbWdfYyA9IGVxMi0+YnVmX3dbMV0qZXEyLT5idWZfaFsxXTsKKyAgICAgIGVxMi0+YnVmWzBdID0gcmVhbGxvYyAoZXEyLT5idWZbMF0sIGltZ19uICsgMippbWdfYyk7CisgICAgICBlcTItPmJ1ZlsxXSA9IGVxMi0+YnVmWzBdICsgaW1nX247CisgICAgICBlcTItPmJ1ZlsyXSA9IGVxMi0+YnVmWzFdICsgaW1nX2M7CisgICAgfSBlbHNlCisgICAgICBlcTItPmJ1ZlswXSA9IHJlYWxsb2MgKGVxMi0+YnVmWzBdLCBpbWdfbik7CisgIH0KKworICBkc3QgPSBmZl92Zl9nZXRfaW1hZ2UgKHZmLT5uZXh0LCBzcmMtPmltZ2ZtdCwgTVBfSU1HVFlQRV9FWFBPUlQsIDAsIHNyYy0+dywgc3JjLT5oKTsKKworICBmb3IgKGkgPSAwOyBpIDwgKChzcmMtPm51bV9wbGFuZXM+MSk/MzoxKTsgaSsrKSB7CisgICAgaWYgKGVxMi0+cGFyYW1baV0uYWRqdXN0KSB7CisgICAgICBkc3QtPnBsYW5lc1tpXSA9IGVxMi0+YnVmW2ldOworICAgICAgZHN0LT5zdHJpZGVbaV0gPSBlcTItPmJ1Zl93W2ldOworCisgICAgICBlcTItPnBhcmFtW2ldLmFkanVzdCAoJmVxMi0+cGFyYW1baV0sIGRzdC0+cGxhbmVzW2ldLCBzcmMtPnBsYW5lc1tpXSwKKyAgICAgICAgZXEyLT5idWZfd1tpXSwgZXEyLT5idWZfaFtpXSwgZHN0LT5zdHJpZGVbaV0sIHNyYy0+c3RyaWRlW2ldKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBkc3QtPnBsYW5lc1tpXSA9IHNyYy0+cGxhbmVzW2ldOworICAgICAgZHN0LT5zdHJpZGVbaV0gPSBzcmMtPnN0cmlkZVtpXTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmZfdmZfbmV4dF9wdXRfaW1hZ2UgKHZmLCBkc3QsIHB0cyk7Cit9CisKK3N0YXRpYwordm9pZCBjaGVja192YWx1ZXMgKGVxMl9wYXJhbV90ICpwYXIpCit7CisgIC8qIHl1Y2shIGZsb2F0aW5nIHBvaW50IGNvbXBhcmlzb25zLi4uICovCisKKyAgaWYgKChwYXItPmMgPT0gMS4wKSAmJiAocGFyLT5iID09IDAuMCkgJiYgKHBhci0+ZyA9PSAxLjApKSB7CisgICAgcGFyLT5hZGp1c3QgPSBOVUxMOworICB9CisjaWYgSEFWRV9NTVhfSU5MSU5FICYmIEhBVkVfNlJFR1MKKyAgZWxzZSBpZiAocGFyLT5nID09IDEuMCAmJiBmZl9nQ3B1Q2Fwcy5oYXNNTVgpIHsKKyAgICBwYXItPmFkanVzdCA9ICZhZmZpbmVfMWRfTU1YOworICB9CisjZW5kaWYKKyAgZWxzZSB7CisgICAgcGFyLT5hZGp1c3QgPSAmYXBwbHlfbHV0OworICB9Cit9CisKK3N0YXRpYwordm9pZCBwcmludF92YWx1ZXMgKHZmX2VxMl90ICplcTIpCit7CisgIGZmX21wX21zZyAoTVNHVF9WRklMVEVSLCBNU0dMX1YsICJ2Zl9lcTI6IGM9JS4yZiBiPSUuMmYgZz0lLjRmIHM9JS4yZiBcbiIsCisgICAgZXEyLT5jb250cmFzdCwgZXEyLT5icmlnaHRuZXNzLCBlcTItPmdhbW1hLCBlcTItPnNhdHVyYXRpb24KKyAgKTsKK30KKworc3RhdGljCit2b2lkIHNldF9jb250cmFzdCAodmZfZXEyX3QgKmVxMiwgZG91YmxlIGMpCit7CisgIGVxMi0+Y29udHJhc3QgPSBjOworICBlcTItPnBhcmFtWzBdLmMgPSBjOworICBlcTItPnBhcmFtWzBdLmx1dF9jbGVhbiA9IDA7CisgIGNoZWNrX3ZhbHVlcyAoJmVxMi0+cGFyYW1bMF0pOworICBwcmludF92YWx1ZXMgKGVxMik7Cit9CisKK3N0YXRpYwordm9pZCBzZXRfYnJpZ2h0bmVzcyAodmZfZXEyX3QgKmVxMiwgZG91YmxlIGIpCit7CisgIGVxMi0+YnJpZ2h0bmVzcyA9IGI7CisgIGVxMi0+cGFyYW1bMF0uYiA9IGI7CisgIGVxMi0+cGFyYW1bMF0ubHV0X2NsZWFuID0gMDsKKyAgY2hlY2tfdmFsdWVzICgmZXEyLT5wYXJhbVswXSk7CisgIHByaW50X3ZhbHVlcyAoZXEyKTsKK30KKworc3RhdGljCit2b2lkIHNldF9nYW1tYSAodmZfZXEyX3QgKmVxMiwgZG91YmxlIGcpCit7CisgIGVxMi0+Z2FtbWEgPSBnOworCisgIGVxMi0+cGFyYW1bMF0uZyA9IGVxMi0+Z2FtbWEgKiBlcTItPmdnYW1tYTsKKyAgZXEyLT5wYXJhbVsxXS5nID0gc3FydCAoZXEyLT5iZ2FtbWEgLyBlcTItPmdnYW1tYSk7CisgIGVxMi0+cGFyYW1bMl0uZyA9IHNxcnQgKGVxMi0+cmdhbW1hIC8gZXEyLT5nZ2FtbWEpOworICBlcTItPnBhcmFtWzBdLncgPSBlcTItPnBhcmFtWzFdLncgPSBlcTItPnBhcmFtWzJdLncgPSBlcTItPmdhbW1hX3dlaWdodDsKKworICBlcTItPnBhcmFtWzBdLmx1dF9jbGVhbiA9IDA7CisgIGVxMi0+cGFyYW1bMV0ubHV0X2NsZWFuID0gMDsKKyAgZXEyLT5wYXJhbVsyXS5sdXRfY2xlYW4gPSAwOworCisgIGNoZWNrX3ZhbHVlcyAoJmVxMi0+cGFyYW1bMF0pOworICBjaGVja192YWx1ZXMgKCZlcTItPnBhcmFtWzFdKTsKKyAgY2hlY2tfdmFsdWVzICgmZXEyLT5wYXJhbVsyXSk7CisKKyAgcHJpbnRfdmFsdWVzIChlcTIpOworfQorCitzdGF0aWMKK3ZvaWQgc2V0X3NhdHVyYXRpb24gKHZmX2VxMl90ICplcTIsIGRvdWJsZSBzKQoreworICBlcTItPnNhdHVyYXRpb24gPSBzOworCisgIGVxMi0+cGFyYW1bMV0uYyA9IHM7CisgIGVxMi0+cGFyYW1bMl0uYyA9IHM7CisKKyAgZXEyLT5wYXJhbVsxXS5sdXRfY2xlYW4gPSAwOworICBlcTItPnBhcmFtWzJdLmx1dF9jbGVhbiA9IDA7CisKKyAgY2hlY2tfdmFsdWVzICgmZXEyLT5wYXJhbVsxXSk7CisgIGNoZWNrX3ZhbHVlcyAoJmVxMi0+cGFyYW1bMl0pOworCisgIHByaW50X3ZhbHVlcyAoZXEyKTsKK30KKworc3RhdGljCitpbnQgY29udHJvbCAodmZfaW5zdGFuY2VfdCAqdmYsIGludCByZXF1ZXN0LCB2b2lkICpkYXRhKQoreworICB2Zl9lcXVhbGl6ZXJfdCAqZXE7CisKKyAgc3dpdGNoIChyZXF1ZXN0KSB7CisgICAgY2FzZSBWRkNUUkxfU0VUX0VRVUFMSVpFUjoKKyAgICAgIGVxID0gKHZmX2VxdWFsaXplcl90ICopIGRhdGE7CisKKyAgICAgIGlmIChzdHJjbXAgKGVxLT5pdGVtLCAiZ2FtbWEiKSA9PSAwKSB7CisgICAgICAgIHNldF9nYW1tYSAodmYtPnByaXYsIGV4cCAobG9nICg4LjApICogZXEtPnZhbHVlIC8gMTAwLjApKTsKKyAgICAgICAgcmV0dXJuIENPTlRST0xfVFJVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZXEtPml0ZW0sICJjb250cmFzdCIpID09IDApIHsKKyAgICAgICAgc2V0X2NvbnRyYXN0ICh2Zi0+cHJpdiwgKDEuMCAvIDEwMC4wKSAqIChlcS0+dmFsdWUgKyAxMDApKTsKKyAgICAgICAgcmV0dXJuIENPTlRST0xfVFJVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZXEtPml0ZW0sICJicmlnaHRuZXNzIikgPT0gMCkgeworICAgICAgICBzZXRfYnJpZ2h0bmVzcyAodmYtPnByaXYsICgxLjAgLyAxMDAuMCkgKiBlcS0+dmFsdWUpOworICAgICAgICByZXR1cm4gQ09OVFJPTF9UUlVFOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChlcS0+aXRlbSwgInNhdHVyYXRpb24iKSA9PSAwKSB7CisgICAgICAgIHNldF9zYXR1cmF0aW9uICh2Zi0+cHJpdiwgKGRvdWJsZSkgKGVxLT52YWx1ZSArIDEwMCkgLyAxMDAuMCk7CisgICAgICAgIHJldHVybiBDT05UUk9MX1RSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVkZDVFJMX0dFVF9FUVVBTElaRVI6CisgICAgICBlcSA9ICh2Zl9lcXVhbGl6ZXJfdCAqKSBkYXRhOworICAgICAgaWYgKHN0cmNtcCAoZXEtPml0ZW0sICJnYW1tYSIpID09IDApIHsKKyAgICAgICAgZXEtPnZhbHVlID0gKGludCkgKDEwMC4wICogbG9nICh2Zi0+cHJpdi0+Z2FtbWEpIC8gbG9nICg4LjApKTsKKyAgICAgICAgcmV0dXJuIENPTlRST0xfVFJVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZXEtPml0ZW0sICJjb250cmFzdCIpID09IDApIHsKKyAgICAgICAgZXEtPnZhbHVlID0gKGludCkgKDEwMC4wICogdmYtPnByaXYtPmNvbnRyYXN0KSAtIDEwMDsKKyAgICAgICAgcmV0dXJuIENPTlRST0xfVFJVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZXEtPml0ZW0sICJicmlnaHRuZXNzIikgPT0gMCkgeworICAgICAgICBlcS0+dmFsdWUgPSAoaW50KSAoMTAwLjAgKiB2Zi0+cHJpdi0+YnJpZ2h0bmVzcyk7CisgICAgICAgIHJldHVybiBDT05UUk9MX1RSVUU7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGVxLT5pdGVtLCAic2F0dXJhdGlvbiIpID09IDApIHsKKyAgICAgICAgZXEtPnZhbHVlID0gKGludCkgKDEwMC4wICogdmYtPnByaXYtPnNhdHVyYXRpb24pIC0gMTAwOworICAgICAgICByZXR1cm4gQ09OVFJPTF9UUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZmZfdmZfbmV4dF9jb250cm9sICh2ZiwgcmVxdWVzdCwgZGF0YSk7Cit9CisKK3N0YXRpYworaW50IHF1ZXJ5X2Zvcm1hdCAodmZfaW5zdGFuY2VfdCAqdmYsIHVuc2lnbmVkIGZtdCkKK3sKKyAgc3dpdGNoIChmbXQpIHsKKyAgICBjYXNlIElNR0ZNVF9ZVlU5OgorICAgIGNhc2UgSU1HRk1UX0lGMDk6CisgICAgY2FzZSBJTUdGTVRfWVYxMjoKKyAgICBjYXNlIElNR0ZNVF9JNDIwOgorICAgIGNhc2UgSU1HRk1UX0lZVVY6CisgICAgY2FzZSBJTUdGTVRfWTgwMDoKKyAgICBjYXNlIElNR0ZNVF9ZODoKKyAgICBjYXNlIElNR0ZNVF80NDRQOgorICAgIGNhc2UgSU1HRk1UXzQyMlA6CisgICAgY2FzZSBJTUdGTVRfNDExUDoKKyAgICAgIHJldHVybiBmZl92Zl9uZXh0X3F1ZXJ5X2Zvcm1hdCAodmYsIGZtdCk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljCit2b2lkIHVuaW5pdCAodmZfaW5zdGFuY2VfdCAqdmYpCit7CisgIGlmICh2Zi0+cHJpdikgeworICAgIGZyZWUgKHZmLT5wcml2LT5idWZbMF0pOworICAgIGZyZWUgKHZmLT5wcml2KTsKKyAgfQorfQorCitzdGF0aWMKK2ludCB2Zl9vcGVuKHZmX2luc3RhbmNlX3QgKnZmLCBjaGFyICphcmdzKQoreworICB1bnNpZ25lZCBpOworICB2Zl9lcTJfdCAqZXEyOworICBkb3VibGUgICBwYXJbOF07CisKKyAgdmYtPmNvbnRyb2wgPSBjb250cm9sOworICB2Zi0+cXVlcnlfZm9ybWF0ID0gcXVlcnlfZm9ybWF0OworICB2Zi0+cHV0X2ltYWdlID0gcHV0X2ltYWdlOworICB2Zi0+dW5pbml0ID0gdW5pbml0OworCisgIHZmLT5wcml2ID0gbWFsbG9jIChzaXplb2YgKHZmX2VxMl90KSk7CisgIGVxMiA9IHZmLT5wcml2OworCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBlcTItPmJ1ZltpXSA9IE5VTEw7CisgICAgZXEyLT5idWZfd1tpXSA9IDA7CisgICAgZXEyLT5idWZfaFtpXSA9IDA7CisKKyAgICBlcTItPnBhcmFtW2ldLmFkanVzdCA9IE5VTEw7CisgICAgZXEyLT5wYXJhbVtpXS5jID0gMS4wOworICAgIGVxMi0+cGFyYW1baV0uYiA9IDAuMDsKKyAgICBlcTItPnBhcmFtW2ldLmcgPSAxLjA7CisgICAgZXEyLT5wYXJhbVtpXS5sdXRfY2xlYW4gPSAwOworICB9CisKKyAgZXEyLT5jb250cmFzdCA9IDEuMDsKKyAgZXEyLT5icmlnaHRuZXNzID0gMC4wOworICBlcTItPnNhdHVyYXRpb24gPSAxLjA7CisKKyAgZXEyLT5nYW1tYSA9IDEuMDsKKyAgZXEyLT5nYW1tYV93ZWlnaHQgPSAxLjA7CisgIGVxMi0+cmdhbW1hID0gMS4wOworICBlcTItPmdnYW1tYSA9IDEuMDsKKyAgZXEyLT5iZ2FtbWEgPSAxLjA7CisKKyAgaWYgKGFyZ3MpIHsKKyAgICBwYXJbMF0gPSAxLjA7CisgICAgcGFyWzFdID0gMS4wOworICAgIHBhclsyXSA9IDAuMDsKKyAgICBwYXJbM10gPSAxLjA7CisgICAgcGFyWzRdID0gMS4wOworICAgIHBhcls1XSA9IDEuMDsKKyAgICBwYXJbNl0gPSAxLjA7CisgICAgcGFyWzddID0gMS4wOworICAgIHNzY2FuZiAoYXJncywgIiVsZjolbGY6JWxmOiVsZjolbGY6JWxmOiVsZjolbGYiLAorICAgICAgcGFyLCBwYXIgKyAxLCBwYXIgKyAyLCBwYXIgKyAzLCBwYXIgKyA0LCBwYXIgKyA1LCBwYXIgKyA2LCBwYXIgKyA3CisgICAgKTsKKworICAgIGVxMi0+cmdhbW1hID0gcGFyWzRdOworICAgIGVxMi0+Z2dhbW1hID0gcGFyWzVdOworICAgIGVxMi0+YmdhbW1hID0gcGFyWzZdOworICAgIGVxMi0+Z2FtbWFfd2VpZ2h0ID0gcGFyWzddOworCisgICAgc2V0X2dhbW1hIChlcTIsIHBhclswXSk7CisgICAgc2V0X2NvbnRyYXN0IChlcTIsIHBhclsxXSk7CisgICAgc2V0X2JyaWdodG5lc3MgKGVxMiwgcGFyWzJdKTsKKyAgICBzZXRfc2F0dXJhdGlvbiAoZXEyLCBwYXJbM10pOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK2NvbnN0IHZmX2luZm9fdCBmZl92Zl9pbmZvX2VxMiA9IHsKKyAgIlNvZnR3YXJlIGVxdWFsaXplciIsCisgICJlcTIiLAorICAiSGFtcGEgSHVnLCBEYW5pZWwgTW9yZW5vLCBSaWNoYXJkIEZlbGtlciIsCisgICIiLAorICAmdmZfb3BlbiwKKyAgTlVMTAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy92Zl9mc3BwLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvdmZfZnNwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTc4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvdmZfZnNwcC5jCkBAIC0wLDAgKzEsMjEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5pa29sYWogUG9yb3NoaW4gPHBvcm9zaDNAcHN1LnJ1PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE1QbGF5ZXIuCisgKgorICogTVBsYXllciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTVBsYXllciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggTVBsYXllcjsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisvKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBhbGdvcml0aG0gZGVzY3JpYmVkIGluCisgKiAiQXJpYSBOb3NyYXRpbmlhIEVtYmVkZGVkIFBvc3QtUHJvY2Vzc2luZyBmb3IKKyAqIEVuaGFuY2VtZW50IG9mIENvbXByZXNzZWQgSW1hZ2VzICgxOTk5KSIKKyAqIChodHRwOi8vY2l0ZXNlZXIubmoubmVjLmNvbS9ub3NyYXRpbmlhOTllbWJlZGRlZC5odG1sKQorICogRnVydGhlciwgd2l0aCBzcGxpdHRpbmcgKGkpZGN0IGludG8gaG9yL3ZlciBwYXNzZXMsIG9uZSBvZiB0aGVtIGNhbiBiZQorICogcGVyZm9ybWVkIG9uY2UgcGVyIGJsb2NrLCBub3QgcGl4ZWwuIFRoaXMgYWxsb3dzIGZvciBtdWNoIGJldHRlciBzcGVlZC4KKyAqLworCisvKgorICBIZWF2aWx5IG9wdGltaXplZCB2ZXJzaW9uIG9mIFNQUCBmaWx0ZXIgYnkgTmlrb2xhagorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJtcF9tc2cuaCIKKyNpbmNsdWRlICJjcHVkZXRlY3QuaCIKKyNpbmNsdWRlICJpbWdfZm9ybWF0LmgiCisjaW5jbHVkZSAibXBfaW1hZ2UuaCIKKyNpbmNsdWRlICJ2Zi5oIgorI2luY2x1ZGUgImF2X2hlbHBlcnMuaCIKKyNpbmNsdWRlICJsaWJ2by9mYXN0bWVtY3B5LmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisKKyN1bmRlZiBmcmVlCisjdW5kZWYgbWFsbG9jCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKyNkZWZpbmUgQkxPQ0tTWiAxMgorCitzdGF0aWMgY29uc3Qgc2hvcnQgY3VzdG9tX3RocmVzaG9sZFs2NF09CisvLyB2YWx1ZXMgKDI5NikgY2FuJ3QgYmUgdG9vIGhpZ2gKKy8vIC1pdCBjYXVzZXMgdG9vIGJpZyBxdWFudCBkZXBlbmRlbmNlCisvLyBvciBtYXliZSBvdmVyZmxvdyhjaGVjayksIHdoaWNoIHJlc3VsdHMgaW4gc29tZSBmbGFzaGluZworeyA3MSwgMjk2LCAyOTUsIDIzNywgIDcxLCAgNDAsICAzOCwgIDE5LAorICAyNDUsIDE5MywgMTg1LCAxMjEsIDEwMiwgIDczLCAgNTMsICAyNywKKyAgMTU4LCAxMjksIDE0MSwgMTA3LCAgOTcsICA3MywgIDUwLCAgMjYsCisgIDEwMiwgMTE2LCAxMDksICA5OCwgIDgyLCAgNjYsICA0NSwgIDIzLAorICA3MSwgIDk0LCAgOTUsICA4MSwgIDcwLCAgNTYsICAzOCwgIDIwLAorICA1NiwgIDc3LCAgNzQsICA2NiwgIDU2LCAgNDQsICAzMCwgIDE1LAorICAzOCwgIDUzLCAgNTAsICA0NSwgIDM4LCAgMzAsICAyMSwgIDExLAorICAyMCwgIDI3LCAgMjYsICAyMywgIDIwLCAgMTUsICAxMSwgICA1Cit9OworCitERUNMQVJFX0FMSUdORUQoMzIsIHN0YXRpYyBjb25zdCB1aW50OF90LCBkaXRoZXIpWzhdWzhdID0geworICAgIHsgIDAsICA0OCwgIDEyLCAgNjAsICAgMywgIDUxLCAgMTUsICA2MywgfSwKKyAgICB7IDMyLCAgMTYsICA0NCwgIDI4LCAgMzUsICAxOSwgIDQ3LCAgMzEsIH0sCisgICAgeyAgOCwgIDU2LCAgIDQsICA1MiwgIDExLCAgNTksICAgNywgIDU1LCB9LAorICAgIHsgNDAsICAyNCwgIDM2LCAgMjAsICA0MywgIDI3LCAgMzksICAyMywgfSwKKyAgICB7ICAyLCAgNTAsICAxNCwgIDYyLCAgIDEsICA0OSwgIDEzLCAgNjEsIH0sCisgICAgeyAzNCwgIDE4LCAgNDYsICAzMCwgIDMzLCAgMTcsICA0NSwgIDI5LCB9LAorICAgIHsgMTAsICA1OCwgICA2LCAgNTQsICAgOSwgIDU3LCAgIDUsICA1MywgfSwKKyAgICB7IDQyLCAgMjYsICAzOCwgIDIyLCAgNDEsICAyNSwgIDM3LCAgMjEsIH0sCit9OworCitzdHJ1Y3QgdmZfcHJpdl9zIHsgLy9hbGlnbiAxNiAhCisgICAgdWludDY0X3QgdGhyZXNob2xkX210eF9ub3FbOCoyXTsKKyAgICB1aW50NjRfdCB0aHJlc2hvbGRfbXR4WzgqMl07Ly91c2VkIGluIGJvdGggQyAmIE1NWCAoJiBsYXRlciBTU0UyKSB2ZXJzaW9ucworCisgICAgaW50IGxvZzJfY291bnQ7CisgICAgaW50IHRlbXBfc3RyaWRlOworICAgIGludCBxcDsKKyAgICBpbnQgbXBlZzI7CisgICAgaW50IHByZXZfcTsKKyAgICB1aW50OF90ICpzcmM7CisgICAgaW50MTZfdCAqdGVtcDsKKyAgICBpbnQgYmZyYW1lczsKKyAgICBjaGFyICpub25fYl9xcDsKK307CisKKworI2lmICFIQVZFX01NWF9JTkxJTkUKKworLy9UaGlzIGZ1bmMgcmVhZHMgZnJvbSAxIHNsaWNlLCAxIGFuZCBjbGVhcnMgMCAmIDEKK3N0YXRpYyB2b2lkIHN0b3JlX3NsaWNlX2ModWludDhfdCAqZHN0LCBpbnQxNl90ICpzcmMsIGludCBkc3Rfc3RyaWRlLCBpbnQgc3JjX3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9zY2FsZSkKK3tpbnQgeSwgeDsKKyNkZWZpbmUgU1RPUkUocG9zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXA9IChzcmNbeCArIHBvc10gKyAoZFtwb3NdPj5sb2cyX3NjYWxlKSk+Pig2LWxvZzJfc2NhbGUpOyAgICAgICAgXAorICAgIHNyY1t4ICsgcG9zXT1zcmNbeCArIHBvcyAtIDgqc3JjX3N0cmlkZV09MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZih0ZW1wICYgMHgxMDApIHRlbXA9IH4odGVtcD4+MzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W3ggKyBwb3NdPSB0ZW1wOworCisgICAgZm9yKHk9MDsgeTxoZWlnaHQ7IHkrKyl7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmQ9IGRpdGhlclt5XTsKKyAgICAgICAgZm9yKHg9MDsgeDx3aWR0aDsgeCs9OCl7CisgICAgICAgICAgICBpbnQgdGVtcDsKKyAgICAgICAgICAgIFNUT1JFKDApOworICAgICAgICAgICAgU1RPUkUoMSk7CisgICAgICAgICAgICBTVE9SRSgyKTsKKyAgICAgICAgICAgIFNUT1JFKDMpOworICAgICAgICAgICAgU1RPUkUoNCk7CisgICAgICAgICAgICBTVE9SRSg1KTsKKyAgICAgICAgICAgIFNUT1JFKDYpOworICAgICAgICAgICAgU1RPUkUoNyk7CisgICAgICAgIH0KKyAgICAgICAgc3JjKz1zcmNfc3RyaWRlOworICAgICAgICBkc3QrPWRzdF9zdHJpZGU7CisgICAgfQorfQorCisvL1RoaXMgZnVuYyByZWFkcyBmcm9tIDIgc2xpY2VzLCAwICYgMiAgYW5kIGNsZWFycyAyLW5kCitzdGF0aWMgdm9pZCBzdG9yZV9zbGljZTJfYyh1aW50OF90ICpkc3QsIGludDE2X3QgKnNyYywgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBsb2cyX3NjYWxlKQore2ludCB5LCB4OworI2RlZmluZSBTVE9SRTIocG9zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXA9IChzcmNbeCArIHBvc10gKyBzcmNbeCArIHBvcyArIDE2KnNyY19zdHJpZGVdICsgKGRbcG9zXT4+bG9nMl9zY2FsZSkpPj4oNi1sb2cyX3NjYWxlKTsgICAgICAgIFwKKyAgICBzcmNbeCArIHBvcyArIDE2KnNyY19zdHJpZGVdPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZih0ZW1wICYgMHgxMDApIHRlbXA9IH4odGVtcD4+MzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W3ggKyBwb3NdPSB0ZW1wOworCisgICAgZm9yKHk9MDsgeTxoZWlnaHQ7IHkrKyl7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmQ9IGRpdGhlclt5XTsKKyAgICAgICAgZm9yKHg9MDsgeDx3aWR0aDsgeCs9OCl7CisgICAgICAgICAgICBpbnQgdGVtcDsKKyAgICAgICAgICAgIFNUT1JFMigwKTsKKyAgICAgICAgICAgIFNUT1JFMigxKTsKKyAgICAgICAgICAgIFNUT1JFMigyKTsKKyAgICAgICAgICAgIFNUT1JFMigzKTsKKyAgICAgICAgICAgIFNUT1JFMig0KTsKKyAgICAgICAgICAgIFNUT1JFMig1KTsKKyAgICAgICAgICAgIFNUT1JFMig2KTsKKyAgICAgICAgICAgIFNUT1JFMig3KTsKKyAgICAgICAgfQorICAgICAgICBzcmMrPXNyY19zdHJpZGU7CisgICAgICAgIGRzdCs9ZHN0X3N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG11bF90aHJtYXRfYyhzdHJ1Y3QgdmZfcHJpdl9zICpwLGludCBxKQoreworICAgIGludCBhOworICAgIGZvcihhPTA7YTw2NDthKyspCisgICAgICAgICgoc2hvcnQqKXAtPnRocmVzaG9sZF9tdHgpW2FdPXEgKiAoKHNob3J0KilwLT50aHJlc2hvbGRfbXR4X25vcSlbYV07Ly9pbnRzIGZhc3RlciBpbiBDCit9CisKK3N0YXRpYyB2b2lkIGNvbHVtbl9maWRjdF9jKGludDE2X3QqIHRocl9hZHIsIGludDE2X3QgKmRhdGEsIGludDE2X3QgKm91dHB1dCwgaW50IGNudCk7CitzdGF0aWMgdm9pZCByb3dfaWRjdF9jKGludDE2X3QqIHdvcmtzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0cHV0X2FkciwgaW50IG91dHB1dF9zdHJpZGUsIGludCBjbnQpOworc3RhdGljIHZvaWQgcm93X2ZkY3RfYyhpbnQxNl90ICpkYXRhLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIGludCBsaW5lX3NpemUsIGludCBjbnQpOworCisvL3RoaXMgaXMgcmF0aGVyIHVnbHksIGJ1dCB0aGVyZSBpcyBubyBuZWVkIGZvciBmdW5jdGlvbiBwb2ludGVycworI2RlZmluZSBzdG9yZV9zbGljZV9zIHN0b3JlX3NsaWNlX2MKKyNkZWZpbmUgc3RvcmVfc2xpY2UyX3Mgc3RvcmVfc2xpY2UyX2MKKyNkZWZpbmUgbXVsX3Rocm1hdF9zIG11bF90aHJtYXRfYworI2RlZmluZSBjb2x1bW5fZmlkY3RfcyBjb2x1bW5fZmlkY3RfYworI2RlZmluZSByb3dfaWRjdF9zIHJvd19pZGN0X2MKKyNkZWZpbmUgcm93X2ZkY3RfcyByb3dfZmRjdF9jCisKKyNlbHNlIC8qIEhBVkVfTU1YX0lOTElORSAqLworCisvL1RoaXMgZnVuYyByZWFkcyBmcm9tIDEgc2xpY2UsIDEgYW5kIGNsZWFycyAwICYgMQorc3RhdGljIHZvaWQgc3RvcmVfc2xpY2VfbW14KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqc3JjLCBsb25nIGRzdF9zdHJpZGUsIGxvbmcgc3JjX3N0cmlkZSwgbG9uZyB3aWR0aCwgbG9uZyBoZWlnaHQsIGxvbmcgbG9nMl9zY2FsZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpvZD0mZGl0aGVyWzBdWzBdOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZD0mZGl0aGVyW2hlaWdodF1bMF07CisgICAgd2lkdGggPSAod2lkdGgrNykmfjc7CisgICAgZHN0X3N0cmlkZS09d2lkdGg7CisgICAgLy9zcmNfc3RyaWRlPShzcmNfc3RyaWRlLXdpZHRoKSoyOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3YgJTUsICUlIlJFR19kIiAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICU2LCAlJSJSRUdfUyIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAlNywgJSUiUkVHX0QiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJTEsICUlIlJFR19hIiAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJSJSRUdfZCIsICUlbW01ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgJC0xLCAlJSJSRUdfZCIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJSUiUkVHX2EiLCAlJSJSRUdfYyIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAkNywgJSUiUkVHX2QiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm5lZyAlJSJSRUdfYSIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YiAlMCwgJSUiUkVHX2MiICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAlJSJSRUdfYyIsICUlIlJFR19jIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJSJSRUdfZCIsICUlbW0yICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJSUiUkVHX2MiLCAlMSAgICAgICBcblx0IgorICAgICAgICAibW92ICUyLCAlJSJSRUdfZCIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hsICQ0LCAlJSJSRUdfYSIgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJSRUdfZCIpLCAlJW1tMyAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJweG9yICUlbW03LCAlJW1tNyAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMyAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTQgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJTAsICUlIlJFR19jIiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhdyAlJW1tNSwgJSVtbTMgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYXcgJSVtbTUsICUlbW00ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTcsICglJSJSRUdfUyIsJSUiUkVHX2EiKSAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19TIiksICUlbW0wICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSA4KCUlIlJFR19TIiksICUlbW0xICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTcsIDgoJSUiUkVHX1MiLCUlIlJFR19hIikgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tMCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNCwgJSVtbTEgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW03LCAoJSUiUkVHX1MiKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhdyAlJW1tMiwgJSVtbTEgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW03LCA4KCUlIlJFR19TIikgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c3diICUlbW0xLCAlJW1tMCAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJDE2LCAlJSJSRUdfUyIgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTAsICglJSJSRUdfRCIpICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICQ4LCAlJSJSRUdfRCIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICQ4LCAlJSJSRUdfYyIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiamcgMWIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAlMSwgJSUiUkVHX1MiICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJDgsICUlIlJFR19kIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJTMsICUlIlJFR19EIiAgICAgICBcblx0IgorICAgICAgICAiY21wICU0LCAlJSJSRUdfZCIgICAgICAgICAgIFxuXHQiCisgICAgICAgICJqbCAyYiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDoKKyAgICAgICAgOiAibSIgKHdpZHRoKSwgIm0iIChzcmNfc3RyaWRlKSwgImVybSIgKG9kKSwgIm0iIChkc3Rfc3RyaWRlKSwgImVybSIgKGVuZCksCisgICAgICAgICAgIm0iIChsb2cyX3NjYWxlKSwgIm0iIChzcmMpLCAibSIgKGRzdCkgLy9pbnB1dAorICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfYywgIiUiUkVHX2QsICIlIlJFR19TLCAiJSJSRUdfRAorICAgICAgICApOworfQorCisvL1RoaXMgZnVuYyByZWFkcyBmcm9tIDIgc2xpY2VzLCAwICYgMiAgYW5kIGNsZWFycyAyLW5kCitzdGF0aWMgdm9pZCBzdG9yZV9zbGljZTJfbW14KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqc3JjLCBsb25nIGRzdF9zdHJpZGUsIGxvbmcgc3JjX3N0cmlkZSwgbG9uZyB3aWR0aCwgbG9uZyBoZWlnaHQsIGxvbmcgbG9nMl9zY2FsZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpvZD0mZGl0aGVyWzBdWzBdOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZD0mZGl0aGVyW2hlaWdodF1bMF07CisgICAgd2lkdGggPSAod2lkdGgrNykmfjc7CisgICAgZHN0X3N0cmlkZS09d2lkdGg7CisgICAgLy9zcmNfc3RyaWRlPShzcmNfc3RyaWRlLXdpZHRoKSoyOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3YgJTUsICUlIlJFR19kIiAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICU2LCAlJSJSRUdfUyIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAlNywgJSUiUkVHX0QiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJTEsICUlIlJFR19hIiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlIlJFR19kIiwgJSVtbTUgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAkLTEsICUlIlJFR19kIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAlJSJSRUdfYSIsICUlIlJFR19jIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICQ3LCAlJSJSRUdfZCIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICUwLCAlJSJSRUdfYyIgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICUlIlJFR19jIiwgJSUiUkVHX2MiICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlIlJFR19kIiwgJSVtbTIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAlJSJSRUdfYyIsICUxICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJTIsICUlIlJFR19kIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaGwgJDUsICUlIlJFR19hIiAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19kIiksICUlbW0zICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMywgJSVtbTQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0zICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tNCAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAlMCwgJSUiUkVHX2MiICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICUlbW01LCAlJW1tMyAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhdyAlJW1tNSwgJSVtbTQgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiUkVHX1MiKSwgJSVtbTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxIDgoJSUiUkVHX1MiKSwgJSVtbTEgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tMCAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICglJSJSRUdfUyIsJSUiUkVHX2EiKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW00LCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxIDgoJSUiUkVHX1MiLCUlIlJFR19hIiksICUlbW02ICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTcsICglJSJSRUdfUyIsJSUiUkVHX2EiKSAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNiwgJSVtbTEgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW03LCA4KCUlIlJFR19TIiwlJSJSRUdfYSIpICAgIFxuXHQiCisgICAgICAgICJwc3JhdyAlJW1tMiwgJSVtbTEgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3Vzd2IgJSVtbTEsICUlbW0wICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tMCwgKCUlIlJFR19EIikgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJDE2LCAlJSJSRUdfUyIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJDgsICUlIlJFR19EIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgJDgsICUlIlJFR19jIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJqZyAxYiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICUxLCAlJSJSRUdfUyIgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAkOCwgJSUiUkVHX2QiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAlMywgJSUiUkVHX0QiICAgICAgIFxuXHQiCisgICAgICAgICJjbXAgJTQsICUlIlJFR19kIiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImpsIDJiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOgorICAgICAgICA6ICJtIiAod2lkdGgpLCAibSIgKHNyY19zdHJpZGUpLCAiZXJtIiAob2QpLCAibSIgKGRzdF9zdHJpZGUpLCAiZXJtIiAoZW5kKSwKKyAgICAgICAgICAibSIgKGxvZzJfc2NhbGUpLCAibSIgKHNyYyksICJtIiAoZHN0KSAvL2lucHV0CisgICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19jLCAiJSJSRUdfZCwgIiUiUkVHX0QsICIlIlJFR19TCisgICAgICAgICk7Cit9CisKK3N0YXRpYyB2b2lkIG11bF90aHJtYXRfbW14KHN0cnVjdCB2Zl9wcml2X3MgKnAsIGludCBxKQoreworICAgIHVpbnQ2NF90ICphZHI9JnAtPnRocmVzaG9sZF9tdHhfbm9xWzBdOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZkICUwLCAlJW1tNyAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICQ4KjgqMiwgJSUiUkVHX0QiICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgMCo4KCUlIlJFR19TIiksICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICUlbW03LCAlJW1tNyAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgMSo4KCUlIlJFR19TIiksICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGRxICUlbW03LCAlJW1tNyAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsdyAlJW1tNywgJSVtbTAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgMio4KCUlIlJFR19TIiksICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAicG11bGx3ICUlbW03LCAlJW1tMSAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAzKjgoJSUiUkVHX1MiKSwgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbHcgJSVtbTcsICUlbW0yICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW0wLCAwKjgoJSUiUkVHX0QiKSAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgNCo4KCUlIlJFR19TIiksICUlbW00ICAgICAgICBcblx0IgorICAgICAgICAicG11bGx3ICUlbW03LCAlJW1tMyAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tMSwgMSo4KCUlIlJFR19EIikgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxIDUqOCglJSJSRUdfUyIpLCAlJW1tNSAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsdyAlJW1tNywgJSVtbTQgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTIsIDIqOCglJSJSRUdfRCIpICAgICAgICBcblx0IgorICAgICAgICAibW92cSA2KjgoJSUiUkVHX1MiKSwgJSVtbTYgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbHcgJSVtbTcsICUlbW01ICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW0zLCAzKjgoJSUiUkVHX0QiKSAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgNyo4KzAqOCglJSJSRUdfUyIpLCAlJW1tMCAgICBcblx0IgorICAgICAgICAicG11bGx3ICUlbW03LCAlJW1tNiAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tNCwgNCo4KCUlIlJFR19EIikgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxIDcqOCsxKjgoJSUiUkVHX1MiKSwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgInBtdWxsdyAlJW1tNywgJSVtbTAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTUsIDUqOCglJSJSRUdfRCIpICAgICAgICBcblx0IgorICAgICAgICAibW92cSA3KjgrMio4KCUlIlJFR19TIiksICUlbW0yICAgIFxuXHQiCisgICAgICAgICJwbXVsbHcgJSVtbTcsICUlbW0xICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW02LCA2KjgoJSUiUkVHX0QiKSAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgNyo4KzMqOCglJSJSRUdfUyIpLCAlJW1tMyAgICBcblx0IgorICAgICAgICAicG11bGx3ICUlbW03LCAlJW1tMiAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tMCwgNyo4KzAqOCglJSJSRUdfRCIpICAgIFxuXHQiCisgICAgICAgICJtb3ZxIDcqOCs0KjgoJSUiUkVHX1MiKSwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgInBtdWxsdyAlJW1tNywgJSVtbTMgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTEsIDcqOCsxKjgoJSUiUkVHX0QiKSAgICBcblx0IgorICAgICAgICAibW92cSA3KjgrNSo4KCUlIlJFR19TIiksICUlbW01ICAgIFxuXHQiCisgICAgICAgICJwbXVsbHcgJSVtbTcsICUlbW00ICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW0yLCA3KjgrMio4KCUlIlJFR19EIikgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgNyo4KzYqOCglJSJSRUdfUyIpLCAlJW1tNiAgICBcblx0IgorICAgICAgICAicG11bGx3ICUlbW03LCAlJW1tNSAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tMywgNyo4KzMqOCglJSJSRUdfRCIpICAgIFxuXHQiCisgICAgICAgICJtb3ZxIDE0KjgrMCo4KCUlIlJFR19TIiksICUlbW0wICAgXG5cdCIKKyAgICAgICAgInBtdWxsdyAlJW1tNywgJSVtbTYgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTQsIDcqOCs0KjgoJSUiUkVHX0QiKSAgICBcblx0IgorICAgICAgICAibW92cSAxNCo4KzEqOCglJSJSRUdfUyIpLCAlJW1tMSAgIFxuXHQiCisgICAgICAgICJwbXVsbHcgJSVtbTcsICUlbW0wICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW01LCA3KjgrNSo4KCUlIlJFR19EIikgICAgXG5cdCIKKyAgICAgICAgInBtdWxsdyAlJW1tNywgJSVtbTEgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTYsIDcqOCs2KjgoJSUiUkVHX0QiKSAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgMTQqOCswKjgoJSUiUkVHX0QiKSAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0xLCAxNCo4KzEqOCglJSJSRUdfRCIpICAgXG5cdCIKKworICAgICAgICA6ICIrZyIgKHEpLCAiK1MiIChhZHIpLCAiK0QiIChhZHIpCisgICAgICAgIDoKKyAgICAgICAgKTsKK30KKworc3RhdGljIHZvaWQgY29sdW1uX2ZpZGN0X21teChpbnQxNl90KiB0aHJfYWRyLCAgaW50MTZfdCAqZGF0YSwgIGludDE2X3QgKm91dHB1dCwgIGludCBjbnQpOworc3RhdGljIHZvaWQgcm93X2lkY3RfbW14KGludDE2X3QqIHdvcmtzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXRwdXRfYWRyLCAgaW50IG91dHB1dF9zdHJpZGUsICBpbnQgY250KTsKK3N0YXRpYyB2b2lkIHJvd19mZGN0X21teChpbnQxNl90ICpkYXRhLCAgY29uc3QgdWludDhfdCAqcGl4ZWxzLCAgaW50IGxpbmVfc2l6ZSwgIGludCBjbnQpOworCisjZGVmaW5lIHN0b3JlX3NsaWNlX3Mgc3RvcmVfc2xpY2VfbW14CisjZGVmaW5lIHN0b3JlX3NsaWNlMl9zIHN0b3JlX3NsaWNlMl9tbXgKKyNkZWZpbmUgbXVsX3Rocm1hdF9zIG11bF90aHJtYXRfbW14CisjZGVmaW5lIGNvbHVtbl9maWRjdF9zIGNvbHVtbl9maWRjdF9tbXgKKyNkZWZpbmUgcm93X2lkY3RfcyByb3dfaWRjdF9tbXgKKyNkZWZpbmUgcm93X2ZkY3RfcyByb3dfZmRjdF9tbXgKKyNlbmRpZiAvLyBIQVZFX01NWF9JTkxJTkUKKworc3RhdGljIHZvaWQgZmlsdGVyKHN0cnVjdCB2Zl9wcml2X3MgKnAsIHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcXBfc3RvcmUsIGludCBxcF9zdHJpZGUsIGludCBpc19sdW1hKQoreworICAgIGludCB4LCB4MCwgeSwgZXMsIHF5LCB0OworICAgIGNvbnN0IGludCBzdHJpZGU9IGlzX2x1bWEgPyBwLT50ZW1wX3N0cmlkZSA6ICh3aWR0aCsxNik7Ly8oKHdpZHRoKzE2KzE1KSYofjE1KSkKKyAgICBjb25zdCBpbnQgc3RlcD02LXAtPmxvZzJfY291bnQ7CisgICAgY29uc3QgaW50IHFwcz0gMyArIGlzX2x1bWE7CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBpbnQzMl90LCBibG9ja19hbGlnbilbNCo4KkJMT0NLU1orIDQqOCpCTE9DS1NaXTsKKyAgICBpbnQxNl90ICpibG9jaz0gKGludDE2X3QgKilibG9ja19hbGlnbjsKKyAgICBpbnQxNl90ICpibG9jazM9KGludDE2X3QgKikoYmxvY2tfYWxpZ24rNCo4KkJMT0NLU1opOworCisgICAgbWVtc2V0KGJsb2NrMywgMCwgNCo4KkJMT0NLU1opOworCisgICAgLy9wLT5zcmM9c3JjLXNyY19zdHJpZGUqOC04Oy8vIQorICAgIGlmICghc3JjIHx8ICFkc3QpIHJldHVybjsgLy8gSEFDSyBhdm9pZCBjcmFzaCBmb3IgWTggY29sb3Vyc3BhY2UKKyAgICBmb3IoeT0wOyB5PGhlaWdodDsgeSsrKXsKKyAgICAgICAgaW50IGluZGV4PSA4ICsgOCpzdHJpZGUgKyB5KnN0cmlkZTsKKyAgICAgICAgZmFzdF9tZW1jcHkocC0+c3JjICsgaW5kZXgsIHNyYyArIHkqc3JjX3N0cmlkZSwgd2lkdGgpOy8vdGhpcyBsaW5lIGNhbiBiZSBhdm9pZGVkIGJ5IHVzaW5nIERSICYgdXNlciBmci5idWZmZXJzCisgICAgICAgIGZvcih4PTA7IHg8ODsgeCsrKXsKKyAgICAgICAgICAgIHAtPnNyY1tpbmRleCAgICAgICAgIC0geCAtIDFdPSBwLT5zcmNbaW5kZXggKyAgICAgICAgIHggICAgXTsKKyAgICAgICAgICAgIHAtPnNyY1tpbmRleCArIHdpZHRoICsgeCAgICBdPSBwLT5zcmNbaW5kZXggKyB3aWR0aCAtIHggLSAxXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IoeT0wOyB5PDg7IHkrKyl7CisgICAgICAgIGZhc3RfbWVtY3B5KHAtPnNyYyArICggICAgICA3LXkpKnN0cmlkZSwgcC0+c3JjICsgKCAgICAgIHkrOCkqc3RyaWRlLCBzdHJpZGUpOworICAgICAgICBmYXN0X21lbWNweShwLT5zcmMgKyAoaGVpZ2h0KzgreSkqc3RyaWRlLCBwLT5zcmMgKyAoaGVpZ2h0LXkrNykqc3RyaWRlLCBzdHJpZGUpOworICAgIH0KKyAgICAvL0ZJWE1FICh0cnkgZWRnZSBlbXUpCisKKyAgICBmb3IoeT04OyB5PDI0OyB5KyspCisgICAgICAgIG1lbXNldChwLT50ZW1wKyA4ICt5KnN0cmlkZSwgMCx3aWR0aCpzaXplb2YoaW50MTZfdCkpOworCisgICAgZm9yKHk9c3RlcDsgeTxoZWlnaHQrODsgeSs9c3RlcCl7ICAgIC8vc3RlcD0gMSwyCisgICAgICAgIHF5PXktNDsKKyAgICAgICAgaWYgKHF5PmhlaWdodC0xKSBxeT1oZWlnaHQtMTsKKyAgICAgICAgaWYgKHF5PDApIHF5PTA7CisgICAgICAgIHF5PShxeT4+cXBzKSpxcF9zdHJpZGU7CisgICAgICAgIHJvd19mZGN0X3MoYmxvY2ssIHAtPnNyYyArIHkqc3RyaWRlICsyLSh5JjEpLCBzdHJpZGUsIDIpOworICAgICAgICBmb3IoeDA9MDsgeDA8d2lkdGgrOC04KihCTE9DS1NaLTEpOyB4MCs9OCooQkxPQ0tTWi0xKSl7CisgICAgICAgICAgICByb3dfZmRjdF9zKGJsb2NrKzgqOCwgcC0+c3JjICsgeSpzdHJpZGUrOCt4MCArMi0oeSYxKSwgc3RyaWRlLCAyKihCTE9DS1NaLTEpKTsKKyAgICAgICAgICAgIGlmKHAtPnFwKQorICAgICAgICAgICAgICAgIGNvbHVtbl9maWRjdF9zKChpbnQxNl90KikoJnAtPnRocmVzaG9sZF9tdHhbMF0pLCBibG9jayswKjgsIGJsb2NrMyswKjgsIDgqKEJMT0NLU1otMSkpOyAvL3llcywgdGhpcyBpcyBhIEhPVFNQT1QKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IgKHg9MDsgeDw4KihCTE9DS1NaLTEpOyB4Kz04KSB7CisgICAgICAgICAgICAgICAgICAgIHQ9eCt4MC0yOyAvL2NvcnJlY3QgdD14K3gwLTItKHkmMSksIGJ1dCBpdHMgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQ8MCkgdD0wOy8vdCBhbHdheXMgPCB3aWR0aC0yCisgICAgICAgICAgICAgICAgICAgIHQ9cXBfc3RvcmVbcXkrKHQ+PnFwcyldOworICAgICAgICAgICAgICAgICAgICB0PW5vcm1fcXNjYWxlKHQsIHAtPm1wZWcyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQhPXAtPnByZXZfcSkgcC0+cHJldl9xPXQsIG11bF90aHJtYXRfcyhwLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uX2ZpZGN0X3MoKGludDE2X3QqKSgmcC0+dGhyZXNob2xkX210eFswXSksIGJsb2NrK3gqOCwgYmxvY2szK3gqOCwgOCk7IC8veWVzLCB0aGlzIGlzIGEgSE9UU1BPVAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvd19pZGN0X3MoYmxvY2szKzAqOCwgcC0+dGVtcCArICh5JjE1KSpzdHJpZGUreDArMi0oeSYxKSwgc3RyaWRlLCAyKihCTE9DS1NaLTEpKTsKKyAgICAgICAgICAgIG1lbW1vdmUoYmxvY2ssIGJsb2NrKyhCTE9DS1NaLTEpKjY0LCA4Kjgqc2l6ZW9mKGludDE2X3QpKTsgLy9jeWNsaW5nCisgICAgICAgICAgICBtZW1tb3ZlKGJsb2NrMywgYmxvY2szKyhCTE9DS1NaLTEpKjY0LCA2Kjgqc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgfQorICAgICAgICAvLworICAgICAgICBlcz13aWR0aCs4LXgwOyAvLyAgOCwgLi4uCisgICAgICAgIGlmIChlcz44KQorICAgICAgICAgICAgcm93X2ZkY3RfcyhibG9jays4KjgsIHAtPnNyYyArIHkqc3RyaWRlKzgreDAgKzItKHkmMSksIHN0cmlkZSwgKGVzLTQpPj4yKTsKKyAgICAgICAgY29sdW1uX2ZpZGN0X3MoKGludDE2X3QqKSgmcC0+dGhyZXNob2xkX210eFswXSksIGJsb2NrLCBibG9jazMsIGVzJih+MSkpOworICAgICAgICByb3dfaWRjdF9zKGJsb2NrMyswKjgsIHAtPnRlbXAgKyAoeSYxNSkqc3RyaWRlK3gwKzItKHkmMSksIHN0cmlkZSwgZXM+PjIpOworICAgICAgICB7Y29uc3QgaW50IHkxPXktOCtzdGVwOy8vbDUtNyAgbDQtNgorICAgICAgICAgICAgaWYgKCEoeTEmNykgJiYgeTEpIHsKKyAgICAgICAgICAgICAgICBpZiAoeTEmOCkgc3RvcmVfc2xpY2Vfcyhkc3QgKyAoeTEtOCkqZHN0X3N0cmlkZSwgcC0+dGVtcCsgOCArOCpzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0cmlkZSwgc3RyaWRlLCB3aWR0aCwgOCwgNS1wLT5sb2cyX2NvdW50KTsKKyAgICAgICAgICAgICAgICBlbHNlIHN0b3JlX3NsaWNlMl9zKGRzdCArICh5MS04KSpkc3Rfc3RyaWRlLCBwLT50ZW1wKyA4ICswKnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUsIHN0cmlkZSwgd2lkdGgsIDgsIDUtcC0+bG9nMl9jb3VudCk7CisgICAgICAgICAgICB9IH0KKyAgICB9CisKKyAgICBpZiAoeSY3KSB7ICAvLyA9PSBoZWlnaHQgJiA3CisgICAgICAgIGlmICh5JjgpIHN0b3JlX3NsaWNlX3MoZHN0ICsgKCh5LTgpJn43KSpkc3Rfc3RyaWRlLCBwLT50ZW1wKyA4ICs4KnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RyaWRlLCBzdHJpZGUsIHdpZHRoLCB5JjcsIDUtcC0+bG9nMl9jb3VudCk7CisgICAgICAgIGVsc2Ugc3RvcmVfc2xpY2UyX3MoZHN0ICsgKCh5LTgpJn43KSpkc3Rfc3RyaWRlLCBwLT50ZW1wKyA4ICswKnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RyaWRlLCBzdHJpZGUsIHdpZHRoLCB5JjcsIDUtcC0+bG9nMl9jb3VudCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbmZpZyhzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLAorICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZF93aWR0aCwgaW50IGRfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgb3V0Zm10KQoreworICAgIGludCBoPSAoaGVpZ2h0KzE2KzE1KSYofjE1KTsKKworICAgIHZmLT5wcml2LT50ZW1wX3N0cmlkZT0gKHdpZHRoKzE2KzE1KSYofjE1KTsKKyAgICB2Zi0+cHJpdi0+dGVtcD0gKGludDE2X3QqKWF2X21hbGxvY3oodmYtPnByaXYtPnRlbXBfc3RyaWRlKjMqOCpzaXplb2YoaW50MTZfdCkpOworICAgIC8vdGhpcyBjYW4gYWxzbyBiZSBhdm9pZGVkLCBzZWUgYWJvdmUKKyAgICB2Zi0+cHJpdi0+c3JjID0gKHVpbnQ4X3QqKWF2X21hbGxvYyh2Zi0+cHJpdi0+dGVtcF9zdHJpZGUqaCpzaXplb2YodWludDhfdCkpOworCisgICAgcmV0dXJuIGZmX3ZmX25leHRfY29uZmlnKHZmLHdpZHRoLGhlaWdodCxkX3dpZHRoLGRfaGVpZ2h0LGZsYWdzLG91dGZtdCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9pbWFnZShzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLCBtcF9pbWFnZV90ICptcGkpCit7CisgICAgaWYobXBpLT5mbGFncyZNUF9JTUdGTEFHX1BSRVNFUlZFKSByZXR1cm47IC8vIGRvbid0IGNoYW5nZQorICAgIC8vIG9rLCB3ZSBjYW4gZG8gcHAgaW4tcGxhY2UgKG9yIHBwIGRpc2FibGVkKToKKyAgICB2Zi0+ZG1waT1mZl92Zl9nZXRfaW1hZ2UodmYtPm5leHQsbXBpLT5pbWdmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1waS0+dHlwZSwgbXBpLT5mbGFncywgbXBpLT53aWR0aCwgbXBpLT5oZWlnaHQpOworICAgIG1waS0+cGxhbmVzWzBdPXZmLT5kbXBpLT5wbGFuZXNbMF07CisgICAgbXBpLT5zdHJpZGVbMF09dmYtPmRtcGktPnN0cmlkZVswXTsKKyAgICBtcGktPndpZHRoPXZmLT5kbXBpLT53aWR0aDsKKyAgICBpZihtcGktPmZsYWdzJk1QX0lNR0ZMQUdfUExBTkFSKXsKKyAgICAgICAgbXBpLT5wbGFuZXNbMV09dmYtPmRtcGktPnBsYW5lc1sxXTsKKyAgICAgICAgbXBpLT5wbGFuZXNbMl09dmYtPmRtcGktPnBsYW5lc1syXTsKKyAgICAgICAgbXBpLT5zdHJpZGVbMV09dmYtPmRtcGktPnN0cmlkZVsxXTsKKyAgICAgICAgbXBpLT5zdHJpZGVbMl09dmYtPmRtcGktPnN0cmlkZVsyXTsKKyAgICB9CisgICAgbXBpLT5mbGFnc3w9TVBfSU1HRkxBR19ESVJFQ1Q7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2ltYWdlKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsIG1wX2ltYWdlX3QgKm1waSwgZG91YmxlIHB0cykKK3sKKyAgICBtcF9pbWFnZV90ICpkbXBpOworICAgIGlmKCEobXBpLT5mbGFncyZNUF9JTUdGTEFHX0RJUkVDVCkpeworICAgICAgICAvLyBubyBEUiwgc28gZ2V0IGEgbmV3IGltYWdlISBob3BlIHdlJ2xsIGdldCBEUiBidWZmZXI6CisgICAgICAgIGRtcGk9ZmZfdmZfZ2V0X2ltYWdlKHZmLT5uZXh0LG1waS0+aW1nZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICBNUF9JTUdUWVBFX1RFTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1QX0lNR0ZMQUdfQUNDRVBUX1NUUklERXxNUF9JTUdGTEFHX1BSRUZFUl9BTElHTkVEX1NUUklERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXBpLT53aWR0aCxtcGktPmhlaWdodCk7CisgICAgICAgIGZmX3ZmX2Nsb25lX21waV9hdHRyaWJ1dGVzKGRtcGksIG1waSk7CisgICAgfWVsc2V7CisgICAgICAgIGRtcGk9dmYtPmRtcGk7CisgICAgfQorCisgICAgdmYtPnByaXYtPm1wZWcyPSBtcGktPnFzY2FsZV90eXBlOworICAgIGlmKG1waS0+cGljdF90eXBlICE9IDMgJiYgbXBpLT5xc2NhbGUgJiYgIXZmLT5wcml2LT5xcCl7CisgICAgICAgIGludCB3ID0gbXBpLT5xc3RyaWRlOworICAgICAgICBpbnQgaCA9IChtcGktPmggKyAxNSkgPj4gNDsKKyAgICAgICAgaWYgKCF3KSB7CisgICAgICAgICAgICB3ID0gKG1waS0+dyArIDE1KSA+PiA0OworICAgICAgICAgICAgaCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYoIXZmLT5wcml2LT5ub25fYl9xcCkKKyAgICAgICAgICAgIHZmLT5wcml2LT5ub25fYl9xcD0gbWFsbG9jKHcqaCk7CisgICAgICAgIGZhc3RfbWVtY3B5KHZmLT5wcml2LT5ub25fYl9xcCwgbXBpLT5xc2NhbGUsIHcqaCk7CisgICAgfQorICAgIGlmKHZmLT5wcml2LT5sb2cyX2NvdW50IHx8ICEobXBpLT5mbGFncyZNUF9JTUdGTEFHX0RJUkVDVCkpeworICAgICAgICBjaGFyICpxcF90YWI9IHZmLT5wcml2LT5ub25fYl9xcDsKKyAgICAgICAgaWYodmYtPnByaXYtPmJmcmFtZXMgfHwgIXFwX3RhYikKKyAgICAgICAgICAgIHFwX3RhYj0gbXBpLT5xc2NhbGU7CisKKyAgICAgICAgaWYocXBfdGFiIHx8IHZmLT5wcml2LT5xcCl7CisgICAgICAgICAgICBmaWx0ZXIodmYtPnByaXYsIGRtcGktPnBsYW5lc1swXSwgbXBpLT5wbGFuZXNbMF0sIGRtcGktPnN0cmlkZVswXSwgbXBpLT5zdHJpZGVbMF0sCisgICAgICAgICAgICAgICAgICAgbXBpLT53LCBtcGktPmgsIHFwX3RhYiwgbXBpLT5xc3RyaWRlLCAxKTsKKyAgICAgICAgICAgIGZpbHRlcih2Zi0+cHJpdiwgZG1waS0+cGxhbmVzWzFdLCBtcGktPnBsYW5lc1sxXSwgZG1waS0+c3RyaWRlWzFdLCBtcGktPnN0cmlkZVsxXSwKKyAgICAgICAgICAgICAgICAgICBtcGktPnc+Pm1waS0+Y2hyb21hX3hfc2hpZnQsIG1waS0+aD4+bXBpLT5jaHJvbWFfeV9zaGlmdCwgcXBfdGFiLCBtcGktPnFzdHJpZGUsIDApOworICAgICAgICAgICAgZmlsdGVyKHZmLT5wcml2LCBkbXBpLT5wbGFuZXNbMl0sIG1waS0+cGxhbmVzWzJdLCBkbXBpLT5zdHJpZGVbMl0sIG1waS0+c3RyaWRlWzJdLAorICAgICAgICAgICAgICAgICAgIG1waS0+dz4+bXBpLT5jaHJvbWFfeF9zaGlmdCwgbXBpLT5oPj5tcGktPmNocm9tYV95X3NoaWZ0LCBxcF90YWIsIG1waS0+cXN0cmlkZSwgMCk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgbWVtY3B5X3BpYyhkbXBpLT5wbGFuZXNbMF0sIG1waS0+cGxhbmVzWzBdLCBtcGktPncsIG1waS0+aCwgZG1waS0+c3RyaWRlWzBdLCBtcGktPnN0cmlkZVswXSk7CisgICAgICAgICAgICBtZW1jcHlfcGljKGRtcGktPnBsYW5lc1sxXSwgbXBpLT5wbGFuZXNbMV0sIG1waS0+dz4+bXBpLT5jaHJvbWFfeF9zaGlmdCwgbXBpLT5oPj5tcGktPmNocm9tYV95X3NoaWZ0LCBkbXBpLT5zdHJpZGVbMV0sIG1waS0+c3RyaWRlWzFdKTsKKyAgICAgICAgICAgIG1lbWNweV9waWMoZG1waS0+cGxhbmVzWzJdLCBtcGktPnBsYW5lc1syXSwgbXBpLT53Pj5tcGktPmNocm9tYV94X3NoaWZ0LCBtcGktPmg+Pm1waS0+Y2hyb21hX3lfc2hpZnQsIGRtcGktPnN0cmlkZVsyXSwgbXBpLT5zdHJpZGVbMl0pOworICAgICAgICB9CisgICAgfQorCisjaWYgSEFWRV9NTVhfSU5MSU5FCisgICAgaWYoZmZfZ0NwdUNhcHMuaGFzTU1YKSBfX2FzbV9fIHZvbGF0aWxlICgiZW1tc1xuXHQiKTsKKyNlbmRpZgorI2lmIEhBVkVfTU1YRVhUX0lOTElORQorICAgIGlmKGZmX2dDcHVDYXBzLmhhc01NWDIpIF9fYXNtX18gdm9sYXRpbGUgKCJzZmVuY2Vcblx0Iik7CisjZW5kaWYKKyAgICByZXR1cm4gZmZfdmZfbmV4dF9wdXRfaW1hZ2UodmYsZG1waSwgcHRzKTsKK30KKworc3RhdGljIHZvaWQgdW5pbml0KHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYpCit7CisgICAgaWYoIXZmLT5wcml2KSByZXR1cm47CisKKyAgICBhdl9mcmVlKHZmLT5wcml2LT50ZW1wKTsKKyAgICB2Zi0+cHJpdi0+dGVtcD0gTlVMTDsKKyAgICBhdl9mcmVlKHZmLT5wcml2LT5zcmMpOworICAgIHZmLT5wcml2LT5zcmM9IE5VTEw7CisgICAgLy9mcmVlKHZmLT5wcml2LT5hdmN0eCk7CisgICAgLy92Zi0+cHJpdi0+YXZjdHg9IE5VTEw7CisgICAgZnJlZSh2Zi0+cHJpdi0+bm9uX2JfcXApOworICAgIHZmLT5wcml2LT5ub25fYl9xcD0gTlVMTDsKKworICAgIGF2X2ZyZWUodmYtPnByaXYpOworICAgIHZmLT5wcml2PU5VTEw7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXQoc3RydWN0IHZmX2luc3RhbmNlICp2ZiwgdW5zaWduZWQgaW50IGZtdCkKK3sKKyAgICBzd2l0Y2goZm10KXsKKyAgICBjYXNlIElNR0ZNVF9ZVlU5OgorICAgIGNhc2UgSU1HRk1UX0lGMDk6CisgICAgY2FzZSBJTUdGTVRfWVYxMjoKKyAgICBjYXNlIElNR0ZNVF9JNDIwOgorICAgIGNhc2UgSU1HRk1UX0lZVVY6CisgICAgY2FzZSBJTUdGTVRfQ0xQTDoKKyAgICBjYXNlIElNR0ZNVF9ZODAwOgorICAgIGNhc2UgSU1HRk1UX1k4OgorICAgIGNhc2UgSU1HRk1UXzQ0NFA6CisgICAgY2FzZSBJTUdGTVRfNDIyUDoKKyAgICBjYXNlIElNR0ZNVF80MTFQOgorICAgICAgICByZXR1cm4gZmZfdmZfbmV4dF9xdWVyeV9mb3JtYXQodmYsZm10KTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29udHJvbChzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLCBpbnQgcmVxdWVzdCwgdm9pZCogZGF0YSkKK3sKKyAgICBzd2l0Y2gocmVxdWVzdCl7CisgICAgY2FzZSBWRkNUUkxfUVVFUllfTUFYX1BQX0xFVkVMOgorICAgICAgICByZXR1cm4gNTsKKyAgICBjYXNlIFZGQ1RSTF9TRVRfUFBfTEVWRUw6CisgICAgICAgIHZmLT5wcml2LT5sb2cyX2NvdW50PSAqKCh1bnNpZ25lZCBpbnQqKWRhdGEpOworICAgICAgICBpZiAodmYtPnByaXYtPmxvZzJfY291bnQgPCA0KSB2Zi0+cHJpdi0+bG9nMl9jb3VudD00OworICAgICAgICByZXR1cm4gQ09OVFJPTF9UUlVFOworICAgIH0KKyAgICByZXR1cm4gZmZfdmZfbmV4dF9jb250cm9sKHZmLHJlcXVlc3QsZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgdmZfb3Blbih2Zl9pbnN0YW5jZV90ICp2ZiwgY2hhciAqYXJncykKK3sKKyAgICBpbnQgaT0wLCBiaWFzOworICAgIGludCBjdXN0b21fdGhyZXNob2xkX21bNjRdOworICAgIGludCBsb2cyYz0tMTsKKworICAgIHZmLT5jb25maWc9Y29uZmlnOworICAgIHZmLT5wdXRfaW1hZ2U9cHV0X2ltYWdlOworICAgIHZmLT5nZXRfaW1hZ2U9Z2V0X2ltYWdlOworICAgIHZmLT5xdWVyeV9mb3JtYXQ9cXVlcnlfZm9ybWF0OworICAgIHZmLT51bmluaXQ9dW5pbml0OworICAgIHZmLT5jb250cm9sPSBjb250cm9sOworICAgIHZmLT5wcml2PWF2X21hbGxvY3ooc2l6ZW9mKHN0cnVjdCB2Zl9wcml2X3MpKTsvL2Fzc3VtZXMgYWxpZ24gMTYgIQorCisgICAgZmZfaW5pdF9hdmNvZGVjKCk7CisKKyAgICAvL3ZmLT5wcml2LT5hdmN0eD0gYXZjb2RlY19hbGxvY19jb250ZXh0KCk7CisgICAgLy9kc3B1dGlsX2luaXQoJnZmLT5wcml2LT5kc3AsIHZmLT5wcml2LT5hdmN0eCk7CisKKyAgICB2Zi0+cHJpdi0+bG9nMl9jb3VudD0gNDsKKyAgICB2Zi0+cHJpdi0+YmZyYW1lcyA9IDA7CisKKyAgICBpZiAoYXJncykgc3NjYW5mKGFyZ3MsICIlZDolZDolZDolZCIsICZsb2cyYywgJnZmLT5wcml2LT5xcCwgJmksICZ2Zi0+cHJpdi0+YmZyYW1lcyk7CisKKyAgICBpZiggbG9nMmMgPj00ICYmIGxvZzJjIDw9NSApCisgICAgICAgIHZmLT5wcml2LT5sb2cyX2NvdW50ID0gbG9nMmM7CisgICAgZWxzZSBpZiggbG9nMmMgPj0gNiApCisgICAgICAgIHZmLT5wcml2LT5sb2cyX2NvdW50ID0gNTsKKworICAgIGlmKHZmLT5wcml2LT5xcCA8IDApCisgICAgICAgIHZmLT5wcml2LT5xcCA9IDA7CisKKyAgICBpZiAoaSA8IC0xNSkgaSA9IC0xNTsKKyAgICBpZiAoaSA+IDMyKSBpID0gMzI7CisKKyAgICBiaWFzPSAoMTw8NCkraTsgLy9yZWd1bGFibGUKKyAgICB2Zi0+cHJpdi0+cHJldl9xPTA7CisgICAgLy8KKyAgICBmb3IoaT0wO2k8NjQ7aSsrKSAvL0ZJWE1FOiB0dW5lIGN1c3RvbV90aHJlc2hvbGRbXSBhbmQgcmVtb3ZlIHRoaXMgIQorICAgICAgICBjdXN0b21fdGhyZXNob2xkX21baV09KGludCkoY3VzdG9tX3RocmVzaG9sZFtpXSooYmlhcy83MS4pKyAwLjUpOworICAgIGZvcihpPTA7aTw4O2krKyl7CisgICAgICAgIHZmLT5wcml2LT50aHJlc2hvbGRfbXR4X25vcVsyKmldPSh1aW50NjRfdCljdXN0b21fdGhyZXNob2xkX21baSo4KzJdCisgICAgICAgICAgICB8KCgodWludDY0X3QpY3VzdG9tX3RocmVzaG9sZF9tW2kqOCs2XSk8PDE2KQorICAgICAgICAgICAgfCgoKHVpbnQ2NF90KWN1c3RvbV90aHJlc2hvbGRfbVtpKjgrMF0pPDwzMikKKyAgICAgICAgICAgIHwoKCh1aW50NjRfdCljdXN0b21fdGhyZXNob2xkX21baSo4KzRdKTw8NDgpOworICAgICAgICB2Zi0+cHJpdi0+dGhyZXNob2xkX210eF9ub3FbMippKzFdPSh1aW50NjRfdCljdXN0b21fdGhyZXNob2xkX21baSo4KzVdCisgICAgICAgICAgICB8KCgodWludDY0X3QpY3VzdG9tX3RocmVzaG9sZF9tW2kqOCszXSk8PDE2KQorICAgICAgICAgICAgfCgoKHVpbnQ2NF90KWN1c3RvbV90aHJlc2hvbGRfbVtpKjgrMV0pPDwzMikKKyAgICAgICAgICAgIHwoKCh1aW50NjRfdCljdXN0b21fdGhyZXNob2xkX21baSo4KzddKTw8NDgpOworICAgIH0KKworICAgIGlmICh2Zi0+cHJpdi0+cXApIHZmLT5wcml2LT5wcmV2X3E9dmYtPnByaXYtPnFwLCBtdWxfdGhybWF0X3ModmYtPnByaXYsIHZmLT5wcml2LT5xcCk7CisKKyAgICByZXR1cm4gMTsKK30KKworY29uc3QgdmZfaW5mb190IGZmX3ZmX2luZm9fZnNwcCA9IHsKKyAgICAiZmFzdCBzaW1wbGUgcG9zdHByb2Nlc3MiLAorICAgICJmc3BwIiwKKyAgICAiTWljaGFlbCBOaWVkZXJtYXllciwgTmlrb2xhaiBQb3Jvc2hpbiIsCisgICAgIiIsCisgICAgdmZfb3BlbiwKKyAgICBOVUxMCit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvL1NwZWNpZmljIHNwcCdzIGRjdCwgaWRjdCBhbmQgdGhyZXNob2xkIGZ1bmN0aW9ucworLy9JJ2QgcHJlZmVyIHRvIGhhdmUgdGhlbSBpbiB0aGUgc2VwYXJhdGUgZmlsZS4KKworLy8jZGVmaW5lIE1BTkdMRShhKSAjYQorCisvL3R5cGVkZWYgaW50MTZfdCBpbnQxNl90OyAvLyEgb25seSBpbnQxNl90CisKKyNkZWZpbmUgRENUU0laRSA4CisjZGVmaW5lIERDVFNJWkVfUyAiOCIKKworI2RlZmluZSBGSVgoeCxzKSAgKChpbnQpICgoeCkgKiAoMTw8cykgKyAwLjUpJjB4ZmZmZikKKyNkZWZpbmUgQzY0KHgpICAgICgodWludDY0X3QpKCh4KXwoeCk8PDE2KSk8PDMyIHwgKHVpbnQ2NF90KSh4KSB8ICh1aW50NjRfdCkoeCk8PDE2CisjZGVmaW5lIEZJWDY0KHgscykgIEM2NChGSVgoeCxzKSkKKworI2RlZmluZSBNVUxUSVBMWTE2SCh4LGspICAgKCgoeCkqKGspKT4+MTYpCisjZGVmaW5lIFRIUkVTSE9MRChyLHgsdCkgaWYoKCh1bnNpZ25lZCkoKHgpK3QpKT50KjIpIHI9KHgpO2Vsc2Ugcj0wOworI2RlZmluZSBERVNDQUxFKHgsbikgICgoKHgpICsgKDEgPDwgKChuKS0xKSkpID4+IG4pCisKKyNpZiBIQVZFX01NWF9JTkxJTkUKKworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIE1NX0ZJWF8wXzM4MjY4MzQzMyk9RklYNjQoMC4zODI2ODM0MzMsIDE0KTsKK0RFQ0xBUkVfQUxJR05FRCg4LCB1aW50NjRfdCwgZmZfTU1fRklYXzBfNTQxMTk2MTAwKT1GSVg2NCgwLjU0MTE5NjEwMCwgMTQpOworREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCBmZl9NTV9GSVhfMF83MDcxMDY3ODEpPUZJWDY0KDAuNzA3MTA2NzgxLCAxNCk7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgTU1fRklYXzFfMzA2NTYyOTY1KT1GSVg2NCgxLjMwNjU2Mjk2NSwgMTQpOworCitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgTU1fRklYXzFfNDE0MjEzNTYyX0EpPUZJWDY0KDEuNDE0MjEzNTYyLCAxNCk7CisKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBNTV9GSVhfMV84NDc3NTkwNjUpPUZJWDY0KDEuODQ3NzU5MDY1LCAxMyk7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgTU1fRklYXzJfNjEzMTI1OTMwKT1GSVg2NCgtMi42MTMxMjU5MzAsIDEzKTsgLy8tCitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgTU1fRklYXzFfNDE0MjEzNTYyKT1GSVg2NCgxLjQxNDIxMzU2MiwgMTMpOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIE1NX0ZJWF8xXzA4MjM5MjIwMCk9RklYNjQoMS4wODIzOTIyMDAsIDEzKTsKKy8vZm9yIHQzLHQ1LHQ3ID09IDAgc2hvcnRjdXQKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBNTV9GSVhfMF84NDc3NTkwNjUpPUZJWDY0KDAuODQ3NzU5MDY1LCAxNCk7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgTU1fRklYXzBfNTY2NDU0NDk3KT1GSVg2NCgwLjU2NjQ1NDQ5NywgMTQpOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIE1NX0ZJWF8wXzE5ODkxMjM2Nyk9RklYNjQoMC4xOTg5MTIzNjcsIDE0KTsKKworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIE1NX0RFU0NBTEVfUk5EKT1DNjQoNCk7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgTU1fMik9QzY0KDIpOworCisjZWxzZSAvKiAhSEFWRV9NTVhfSU5MSU5FICovCisKK3R5cGVkZWYgaW50MzJfdCBpbnRfc2ltZDE2X3Q7CitzdGF0aWMgY29uc3QgaW50MTZfdCBGSVhfMF8zODI2ODM0MzM9RklYKDAuMzgyNjgzNDMzLCAxNCk7CitzdGF0aWMgY29uc3QgaW50MTZfdCBGSVhfMF81NDExOTYxMDA9RklYKDAuNTQxMTk2MTAwLCAxNCk7CitzdGF0aWMgY29uc3QgaW50MTZfdCBGSVhfMF83MDcxMDY3ODE9RklYKDAuNzA3MTA2NzgxLCAxNCk7CitzdGF0aWMgY29uc3QgaW50MTZfdCBGSVhfMV8zMDY1NjI5NjU9RklYKDEuMzA2NTYyOTY1LCAxNCk7CitzdGF0aWMgY29uc3QgaW50MTZfdCBGSVhfMV80MTQyMTM1NjJfQT1GSVgoMS40MTQyMTM1NjIsIDE0KTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IEZJWF8xXzg0Nzc1OTA2NT1GSVgoMS44NDc3NTkwNjUsIDEzKTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IEZJWF8yXzYxMzEyNTkzMD1GSVgoLTIuNjEzMTI1OTMwLCAxMyk7IC8vLQorc3RhdGljIGNvbnN0IGludDE2X3QgRklYXzFfNDE0MjEzNTYyPUZJWCgxLjQxNDIxMzU2MiwgMTMpOworc3RhdGljIGNvbnN0IGludDE2X3QgRklYXzFfMDgyMzkyMjAwPUZJWCgxLjA4MjM5MjIwMCwgMTMpOworCisjZW5kaWYKKworI2lmICFIQVZFX01NWF9JTkxJTkUKKworc3RhdGljIHZvaWQgY29sdW1uX2ZpZGN0X2MoaW50MTZfdCogdGhyX2FkciwgaW50MTZfdCAqZGF0YSwgaW50MTZfdCAqb3V0cHV0LCBpbnQgY250KQoreworICAgIGludF9zaW1kMTZfdCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIGludF9zaW1kMTZfdCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgICBpbnRfc2ltZDE2X3QgejEsejIsejMsejQsejUsIHoxMCwgejExLCB6MTIsIHoxMzsKKyAgICBpbnRfc2ltZDE2X3QgZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3OworCisgICAgaW50MTZfdCogZGF0YXB0cjsKKyAgICBpbnQxNl90KiB3c3B0cjsKKyAgICBpbnQxNl90ICp0aHJlc2hvbGQ7CisgICAgaW50IGN0cjsKKworICAgIGRhdGFwdHIgPSBkYXRhOworICAgIHdzcHRyID0gb3V0cHV0OworCisgICAgZm9yICg7IGNudCA+IDA7IGNudC09MikgeyAvL3N0YXJ0IHBvc2l0aW9ucworICAgICAgICB0aHJlc2hvbGQ9KGludDE2X3QqKXRocl9hZHI7Ly90aHJlc2hvbGRfbXR4CisgICAgICAgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKKyAgICAgICAgICAgIC8vIFByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBhZGQgdG8gb3V0cHV0LgorICAgICAgICAgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICAgICAgICAgIHRtcDcgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqN107CisKKyAgICAgICAgICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgICAgICAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworCisgICAgICAgICAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgICAgICAgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKKworICAgICAgICAgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICAgICAgICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSBkYXRhcHRyW0RDVFNJWkUqNF07CisKKyAgICAgICAgICAgIC8vIEV2ZW4gcGFydCBvZiBGRENUCisKKyAgICAgICAgICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgICAgICAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgICAgICAgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisKKyAgICAgICAgICAgIGQwID0gdG1wMTAgKyB0bXAxMTsKKyAgICAgICAgICAgIGQ0ID0gdG1wMTAgLSB0bXAxMTsKKworICAgICAgICAgICAgejEgPSBNVUxUSVBMWTE2SCgodG1wMTIgKyB0bXAxMykgPDwyLCBGSVhfMF83MDcxMDY3ODEpOworICAgICAgICAgICAgZDIgPSB0bXAxMyArIHoxOworICAgICAgICAgICAgZDYgPSB0bXAxMyAtIHoxOworCisgICAgICAgICAgICAvLyBFdmVuIHBhcnQgb2YgSURDVAorCisgICAgICAgICAgICBUSFJFU0hPTEQodG1wMCwgZDAsIHRocmVzaG9sZFswKjhdKTsKKyAgICAgICAgICAgIFRIUkVTSE9MRCh0bXAxLCBkMiwgdGhyZXNob2xkWzIqOF0pOworICAgICAgICAgICAgVEhSRVNIT0xEKHRtcDIsIGQ0LCB0aHJlc2hvbGRbNCo4XSk7CisgICAgICAgICAgICBUSFJFU0hPTEQodG1wMywgZDYsIHRocmVzaG9sZFs2KjhdKTsKKyAgICAgICAgICAgIHRtcDArPTI7CisgICAgICAgICAgICB0bXAxMCA9ICh0bXAwICsgdG1wMik+PjI7CisgICAgICAgICAgICB0bXAxMSA9ICh0bXAwIC0gdG1wMik+PjI7CisKKyAgICAgICAgICAgIHRtcDEzID0gKHRtcDEgKyB0bXAzKT4+MjsgLy8rMiAhICAocHNuciBkZWNpZGVzKQorICAgICAgICAgICAgdG1wMTIgPSBNVUxUSVBMWTE2SCgodG1wMSAtIHRtcDMpLCBGSVhfMV80MTQyMTM1NjJfQSkgLSB0bXAxMzsgLy88PDIKKworICAgICAgICAgICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7IC8vLT50ZW1wcworICAgICAgICAgICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7IC8vLT50ZW1wcworICAgICAgICAgICAgdG1wMSA9IHRtcDExICsgdG1wMTI7IC8vLT50ZW1wcworICAgICAgICAgICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7IC8vLT50ZW1wcworCisgICAgICAgICAgICAvLyBPZGQgcGFydCBvZiBGRENUCisKKyAgICAgICAgICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CisgICAgICAgICAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OworICAgICAgICAgICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKKworICAgICAgICAgICAgejUgPSBNVUxUSVBMWTE2SCgodG1wMTAgLSB0bXAxMik8PDIsIEZJWF8wXzM4MjY4MzQzMyk7CisgICAgICAgICAgICB6MiA9IE1VTFRJUExZMTZIKHRtcDEwIDw8MiwgRklYXzBfNTQxMTk2MTAwKSArIHo1OworICAgICAgICAgICAgejQgPSBNVUxUSVBMWTE2SCh0bXAxMiA8PDIsIEZJWF8xXzMwNjU2Mjk2NSkgKyB6NTsKKyAgICAgICAgICAgIHozID0gTVVMVElQTFkxNkgodG1wMTEgPDwyLCBGSVhfMF83MDcxMDY3ODEpOworCisgICAgICAgICAgICB6MTEgPSB0bXA3ICsgejM7CisgICAgICAgICAgICB6MTMgPSB0bXA3IC0gejM7CisKKyAgICAgICAgICAgIGQ1ID0gejEzICsgejI7CisgICAgICAgICAgICBkMyA9IHoxMyAtIHoyOworICAgICAgICAgICAgZDEgPSB6MTEgKyB6NDsKKyAgICAgICAgICAgIGQ3ID0gejExIC0gejQ7CisKKyAgICAgICAgICAgIC8vIE9kZCBwYXJ0IG9mIElEQ1QKKworICAgICAgICAgICAgVEhSRVNIT0xEKHRtcDQsIGQxLCB0aHJlc2hvbGRbMSo4XSk7CisgICAgICAgICAgICBUSFJFU0hPTEQodG1wNSwgZDMsIHRocmVzaG9sZFszKjhdKTsKKyAgICAgICAgICAgIFRIUkVTSE9MRCh0bXA2LCBkNSwgdGhyZXNob2xkWzUqOF0pOworICAgICAgICAgICAgVEhSRVNIT0xEKHRtcDcsIGQ3LCB0aHJlc2hvbGRbNyo4XSk7CisKKyAgICAgICAgICAgIC8vU2ltZCB2ZXJzaW9uIHVzZXMgaGVyZSBhIHNob3J0Y3V0IGZvciB0aGUgdG1wNSx0bXA2LHRtcDcgPT0gMAorICAgICAgICAgICAgejEzID0gdG1wNiArIHRtcDU7CisgICAgICAgICAgICB6MTAgPSAodG1wNiAtIHRtcDUpPDwxOworICAgICAgICAgICAgejExID0gdG1wNCArIHRtcDc7CisgICAgICAgICAgICB6MTIgPSAodG1wNCAtIHRtcDcpPDwxOworCisgICAgICAgICAgICB0bXA3ID0gKHoxMSArIHoxMyk+PjI7IC8vKzIgIQorICAgICAgICAgICAgdG1wMTEgPSBNVUxUSVBMWTE2SCgoejExIC0gejEzKTw8MSwgRklYXzFfNDE0MjEzNTYyKTsKKyAgICAgICAgICAgIHo1ID0gICAgTVVMVElQTFkxNkgoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOworICAgICAgICAgICAgdG1wMTAgPSBNVUxUSVBMWTE2SCh6MTIsIEZJWF8xXzA4MjM5MjIwMCkgLSB6NTsKKyAgICAgICAgICAgIHRtcDEyID0gTVVMVElQTFkxNkgoejEwLCBGSVhfMl82MTMxMjU5MzApICsgejU7IC8vIC0gISEKKworICAgICAgICAgICAgdG1wNiA9IHRtcDEyIC0gdG1wNzsKKyAgICAgICAgICAgIHRtcDUgPSB0bXAxMSAtIHRtcDY7CisgICAgICAgICAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OworCisgICAgICAgICAgICB3c3B0cltEQ1RTSVpFKjBdKz0gICh0bXAwICsgdG1wNyk7CisgICAgICAgICAgICB3c3B0cltEQ1RTSVpFKjFdKz0gICh0bXAxICsgdG1wNik7CisgICAgICAgICAgICB3c3B0cltEQ1RTSVpFKjJdKz0gICh0bXAyICsgdG1wNSk7CisgICAgICAgICAgICB3c3B0cltEQ1RTSVpFKjNdKz0gICh0bXAzIC0gdG1wNCk7CisgICAgICAgICAgICB3c3B0cltEQ1RTSVpFKjRdKz0gICh0bXAzICsgdG1wNCk7CisgICAgICAgICAgICB3c3B0cltEQ1RTSVpFKjVdKz0gICh0bXAyIC0gdG1wNSk7CisgICAgICAgICAgICB3c3B0cltEQ1RTSVpFKjZdPSAgKHRtcDEgLSB0bXA2KTsKKyAgICAgICAgICAgIHdzcHRyW0RDVFNJWkUqN109ICAodG1wMCAtIHRtcDcpOworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGRhdGFwdHIrKzsgLy9uZXh0IGNvbHVtbgorICAgICAgICAgICAgd3NwdHIrKzsKKyAgICAgICAgICAgIHRocmVzaG9sZCsrOworICAgICAgICB9CisgICAgICAgIGRhdGFwdHIrPTg7IC8vc2tpcCBlYWNoIHNlY29uZCBzdGFydCBwb3MKKyAgICAgICAgd3NwdHIgICs9ODsKKyAgICB9Cit9CisKKyNlbHNlIC8qIEhBVkVfTU1YX0lOTElORSAqLworCitzdGF0aWMgdm9pZCBjb2x1bW5fZmlkY3RfbW14KGludDE2X3QqIHRocl9hZHIsICBpbnQxNl90ICpkYXRhLCAgaW50MTZfdCAqb3V0cHV0LCAgaW50IGNudCkKK3sKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIHRlbXBzKVs0XTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICBBU01BTElHTig0KQorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgIkRDVFNJWkVfUyIqMCoyKCUlIlJFR19TIiksICUlbW0xIFxuXHQiCisgICAgICAgIC8vCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjMqMiglJSJSRUdfUyIpLCAlJW1tNyBcblx0IgorICAgICAgICAibW92cSAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgIkRDVFNJWkVfUyIqNyoyKCUlIlJFR19TIiksICUlbW0xIFxuXHQiIC8vdDAKKyAgICAgICAgIm1vdnEgJSVtbTcsICUlbW0zICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICJEQ1RTSVpFX1MiKjQqMiglJSJSRUdfUyIpLCAlJW1tNyBcblx0IiAvL3QzCisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tNSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjEqMiglJSJSRUdfUyIpLCAlJW1tNiBcblx0IgorICAgICAgICAicHN1YncgJSVtbTcsICUlbW0xICAgICAgICAgICAgXG5cdCIgLy90MTMKKworICAgICAgICAibW92cSAiRENUU0laRV9TIioyKjIoJSUiUkVHX1MiKSwgJSVtbTIgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTYsICUlbW00ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICJEQ1RTSVpFX1MiKjYqMiglJSJSRUdfUyIpLCAlJW1tNiBcblx0IiAvL3QxCisgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTUgICAgICAgICAgICBcblx0IiAvL3QxMAorCisgICAgICAgICJwYWRkdyAiRENUU0laRV9TIio1KjIoJSUiUkVHX1MiKSwgJSVtbTIgXG5cdCIgLy90MgorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTcgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgJSVtbTIsICUlbW02ICAgICAgICAgICAgXG5cdCIgLy90MTEKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNyAgICAgICAgICAgIFxuXHQiIC8vdDEyCisKKyAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0yICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNiwgJSVtbTUgICAgICAgICAgICBcblx0IiAvL2QwCisgICAgICAgIC8vIGkwIHQxMyB0MTIgaTMgaTEgZDAgLSBkNAorICAgICAgICAicHN1YncgJSVtbTYsICUlbW0yICAgICAgICAgICAgXG5cdCIgLy9kNAorICAgICAgICAicGFkZHcgJSVtbTEsICUlbW03ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAgNCoxNiglJSJSRUdfZCIpLCAlJW1tNiAgICAgIFxuXHQiCisgICAgICAgICJwc2xsdyAkMiwgJSVtbTcgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBzdWJ3IDAqMTYoJSUiUkVHX2QiKSwgJSVtbTUgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTYsICUlbW0yICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHVzdyAwKjE2KCUlIlJFR19kIiksICUlbW01ICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW02LCAlJW1tMiAgICAgICAgICBcblx0IgorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShmZl9NTV9GSVhfMF83MDcxMDY3ODEpIiwgJSVtbTcgXG5cdCIKKyAgICAgICAgLy8KKyAgICAgICAgInBhZGR3IDAqMTYoJSUiUkVHX2QiKSwgJSVtbTUgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW0yICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHN1YnVzdyAwKjE2KCUlIlJFR19kIiksICUlbW01ICAgIFxuXHQiCisgICAgICAgICJwc3VidXN3ICUlbW02LCAlJW1tMiAgICAgICAgICBcblx0IgorCisvL1RoaXMgZnVuYyBpcyB0b3RhbGx5IGNvbXB1dGUtYm91bmQsICBvcGVyYXRlcyBhdCBodWdlIHNwZWVkLiBTbywgIERDIHNob3J0Y3V0CisvLyBhdCB0aGlzIHBsYWNlIGlzbid0IHdvcnRod2hpbGUgZHVlIHRvIEJUQiBtaXNzIHBlbmFsdHkgKGNoZWNrZWQgb24gUGVudC4gMykuCisvL0hvd2V2ZXIsICB0eXBpY2FsIG51bWJlcnM6IG5vbmRjIC0gMjklJSwgIGRjIC0gNDYlJSwgIHplcm8gLSAyNSUlLiBBbGwgPD4gMCBjYXNlIGlzIHZlcnkgcmFyZS4KKyAgICAgICAgInBhZGR3ICJNQU5HTEUoTU1fMikiLCAlJW1tNSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNiAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTIgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTYsICUlbW01ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tMSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW03LCAlJW1tMSAgICAgICAgICAgIFxuXHQiIC8vZDIKKworICAgICAgICAicHN1YncgMioxNiglJSJSRUdfZCIpLCAlJW1tMSAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNywgJSVtbTYgICAgICAgICAgICBcblx0IiAvL2Q2CisKKyAgICAgICAgIm1vdnEgNioxNiglJSJSRUdfZCIpLCAlJW1tNyAgICAgICBcblx0IgorICAgICAgICAicHNyYXcgJDIsICUlbW01ICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdXN3IDIqMTYoJSUiUkVHX2QiKSwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW03LCAlJW1tNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vIHQ3IGQyIC90MTEgdDQgdDYgLSBkNiAvdDEwCisKKyAgICAgICAgInBhZGR3IDIqMTYoJSUiUkVHX2QiKSwgJSVtbTEgICAgICBcblx0IgorICAgICAgICAicGFkZHVzdyAlJW1tNywgJSVtbTYgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHN1YnVzdyAyKjE2KCUlIlJFR19kIiksICUlbW0xICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTYgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc3VidyAiRENUU0laRV9TIio0KjIoJSUiUkVHX1MiKSwgJSVtbTMgXG5cdCIKKyAgICAgICAgInBzdWJ1c3cgJSVtbTcsICUlbW02ICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgLy9tb3ZxIFtlZGkrIkRDVFNJWkVfUyIqMioyXSwgbW0xCisgICAgICAgIC8vbW92cSBbZWRpKyJEQ1RTSVpFX1MiKjYqMl0sIG1tNgorICAgICAgICAibW92cSAlJW1tMSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICQyLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHN1YncgIkRDVFNJWkVfUyIqNioyKCUlIlJFR19TIiksICUlbW00IFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTEgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc3VidyAiRENUU0laRV9TIio3KjIoJSUiUkVHX1MiKSwgJSVtbTAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW03LCAlJW1tNiAgICAgICAgICAgIFxuXHQiIC8vJ3QxMworCisgICAgICAgICJwc3JhdyAkMiwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8vcGFkZHcgbW02LCBNTV8yICEhICAgIC0tLQorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTcgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoTU1fRklYXzFfNDE0MjEzNTYyX0EpIiwgJSVtbTEgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW02LCAlJW1tMiAgICAgICAgICAgIFxuXHQiIC8vJ3QwCisKKyAgICAgICAgIm1vdnEgJSVtbTIsIDAqOCslMyAgICAgICAgICAgIFxuXHQiIC8vIQorICAgICAgICAicHN1YncgJSVtbTYsICUlbW03ICAgICAgICAgICAgXG5cdCIgLy8ndDMKKworICAgICAgICAibW92cSAiRENUU0laRV9TIioyKjIoJSUiUkVHX1MiKSwgJSVtbTIgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMSAgICAgICAgICAgIFxuXHQiIC8vJ3QxMgorCisgICAgICAgICJwc3VidyAiRENUU0laRV9TIio1KjIoJSUiUkVHX1MiKSwgJSVtbTIgXG5cdCIgLy90NQorICAgICAgICAibW92cSAlJW1tNSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tNywgMyo4KyUzICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMyAgICAgICAgICAgIFxuXHQiIC8vdDEwCisKKyAgICAgICAgInBhZGR3ICUlbW00LCAlJW1tMiAgICAgICAgICAgIFxuXHQiIC8vdDExCisgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTQgICAgICAgICAgICBcblx0IiAvL3QxMgorCisgICAgICAgICJtb3ZxICUlbW0zLCAlJW1tNyAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTQsICUlbW0zICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHNsbHcgJDIsICUlbW0zICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNsbHcgJDIsICUlbW03ICAgICAgICAgICAgICBcblx0IiAvL29wdCBmb3IgUDYKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoTU1fRklYXzBfMzgyNjgzNDMzKSIsICUlbW0zIFxuXHQiCisgICAgICAgICJwc2xsdyAkMiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBtdWxodyAiTUFOR0xFKGZmX01NX0ZJWF8wXzU0MTE5NjEwMCkiLCAlJW1tNyBcblx0IgorICAgICAgICAicHNsbHcgJDIsICUlbW0yICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMV8zMDY1NjI5NjUpIiwgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0xLCAlJW1tNSAgICAgICAgICAgIFxuXHQiIC8vJ3QxCisKKyAgICAgICAgInBtdWxodyAiTUFOR0xFKGZmX01NX0ZJWF8wXzcwNzEwNjc4MSkiLCAlJW1tMiBcblx0IgorICAgICAgICAicHN1YncgJSVtbTEsICUlbW02ICAgICAgICAgICAgXG5cdCIgLy8ndDIKKyAgICAgICAgLy8gdDcgJ3QxMiAndDExIHQ0IHQ2IC0gJ3QxMyAndDEwICAgLS0tCisKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tNyAgICAgICAgICAgIFxuXHQiIC8vejIKKworICAgICAgICAibW92cSAlJW1tNSwgMSo4KyUzICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tNCAgICAgICAgICAgIFxuXHQiIC8vejQKKworICAgICAgICAibW92cSAzKjE2KCUlIlJFR19kIiksICUlbW0zICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW02LCAyKjgrJTMgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTIsICUlbW0xICAgICAgICAgICAgXG5cdCIgLy96MTMKKworLy89PT0KKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgIFxuXHQiIC8vejExCisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tNSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxIDUqMTYoJSUiUkVHX2QiKSwgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW03LCAlJW1tMSAgICAgICAgICAgIFxuXHQiIC8vZDMKKworICAgICAgICAicGFkZHcgJSVtbTcsICUlbW01ICAgICAgICAgICAgXG5cdCIgLy9kNQorICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAxKjE2KCUlIlJFR19kIiksICUlbW03ICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTUgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNiAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTQsICUlbW0wICAgICAgICAgICAgXG5cdCIgLy9kMQorCisgICAgICAgICJwYWRkdXN3ICUlbW0zLCAlJW1tMSAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTQsICUlbW02ICAgICAgICAgICAgXG5cdCIgLy9kNworCisgICAgICAgIC8vIGQxIGQzIC0gLSAtIGQ1IGQ3IC0KKyAgICAgICAgIm1vdnEgNyoxNiglJSJSRUdfZCIpLCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTcsICUlbW0wICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHN1YncgJSVtbTQsICUlbW02ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTIsICUlbW01ICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR1c3cgJSVtbTQsICUlbW02ICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTEgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTUgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTQsICUlbW02ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHN1YnVzdyAlJW1tMywgJSVtbTEgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c3cgJSVtbTIsICUlbW01ICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBzdWJ1c3cgJSVtbTQsICUlbW02ICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tNCAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwb3IgJSVtbTUsICUlbW00ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzdyAlJW1tNywgJSVtbTAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicG9yICUlbW02LCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW03LCAlJW1tMCAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXN3ICUlbW03LCAlJW1tMCAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZkICUlbW00LCAlJSJSRUdfYSIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICUlIlJFR19hIiwgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiam56IDJmICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAvL21vdnEgW2VkaSsiRENUU0laRV9TIiozKjJdLCBtbTEKKyAgICAgICAgLy9tb3ZxIFtlZGkrIkRDVFNJWkVfUyIqNSoyXSwgbW01CisgICAgICAgIC8vbW92cSBbZWRpKyJEQ1RTSVpFX1MiKjEqMl0sIG1tMAorICAgICAgICAvL21vdnEgW2VkaSsiRENUU0laRV9TIio3KjJdLCBtbTYKKyAgICAgICAgLy8gdDQgdDUgLSAtIC0gdDYgdDcgLQorICAgICAgICAvLy0tLSB0NCAobW0wKSBtYXkgYmUgPD4wOyBtbTEsIG1tNSwgbW02ID09IDAKKy8vVHlwaWNhbCBudW1iZXJzOiBub25kYyAtIDE5JSUsICBkYyAtIDI2JSUsICB6ZXJvIC0gNTUlJS4gemVybyBjYXNlIGFsb25lIGlzbid0IHdvcnRod2hpbGUKKyAgICAgICAgIm1vdnEgMCo4KyUzLCAlJW1tNCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMF84NDc3NTkwNjUpIiwgJSVtbTAgXG5cdCIgLy90bXA2CisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tMiAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjAqMiglJSJSRUdfRCIpLCAlJW1tNSBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoTU1fRklYXzBfNTY2NDU0NDk3KSIsICUlbW0xIFxuXHQiIC8vdG1wNQorICAgICAgICAicGFkZHcgJSVtbTQsICUlbW01ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAxKjgrJTMsICUlbW02ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLy9wYWRkdyBtbTMsIE1NXzIKKyAgICAgICAgInBzcmF3ICQyLCAlJW1tMyAgICAgICAgICAgICAgXG5cdCIgLy90bXA3CisKKyAgICAgICAgInBtdWxodyAiTUFOR0xFKE1NX0ZJWF8wXzE5ODkxMjM2NykiLCAlJW1tMiBcblx0IiAvLy10bXA0CisgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTQgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjEqMiglJSJSRUdfRCIpLCAlJW1tNyBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW01ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tNCwgIkRDVFNJWkVfUyIqNyoyKCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW02LCAlJW1tNyAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgMio4KyUzLCAlJW1tMyAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMCwgJSVtbTYgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjIqMiglJSJSRUdfRCIpLCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTAsICUlbW03ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tNSwgIkRDVFNJWkVfUyIqMCoyKCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tNCAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTYsICJEQ1RTSVpFX1MiKjYqMiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMSwgJSVtbTMgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjUqMiglJSJSRUdfRCIpLCAlJW1tNSBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTEsICUlbW00ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAiRENUU0laRV9TIiozKjIoJSUiUkVHX0QiKSwgJSVtbTYgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tNSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgMyo4KyUzLCAlJW1tMCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJDgsICUlIlJFR19TIiAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTcsICJEQ1RTSVpFX1MiKjEqMiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTYgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW00LCAiRENUU0laRV9TIioyKjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAiRENUU0laRV9TIio0KjIoJSUiUkVHX0QiKSwgJSVtbTcgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tNiAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTUsICJEQ1RTSVpFX1MiKjUqMiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTcgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW02LCAiRENUU0laRV9TIiozKjIoJSUiUkVHX0QiKSBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW03LCAiRENUU0laRV9TIio0KjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAiYWRkICQ4LCAlJSJSRUdfRCIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiam1wIDRmICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vLS0tIG5vbiBEQzIKKyAgICAgICAgLy9wc3JhdyBtbTEsIDIgdy9vIGl0IC0+IG9mZnNldC4gdGhyMSwgdGhyMSwgdGhyMSAgKGFjdHVhbGx5IHRocjEsIHRocjEsIHRocjEtMSkKKyAgICAgICAgLy9wc3JhdyBtbTUsIDIKKyAgICAgICAgLy9wc3JhdyBtbTAsIDIKKyAgICAgICAgLy9wc3JhdyBtbTYsIDIKKyAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0zICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMSwgJSVtbTUgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc2xsdyAkMSwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8vJ3oxMAorICAgICAgICAicGFkZHcgJSVtbTEsICUlbW0zICAgICAgICAgICAgXG5cdCIgLy8nejEzCisKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNsbHcgJDEsICUlbW0wICAgICAgICAgICAgICBcblx0IiAvLyd6MTIKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoTU1fRklYXzJfNjEzMTI1OTMwKSIsICUlbW0xIFxuXHQiIC8vLQorICAgICAgICAicGFkZHcgJSVtbTAsICUlbW01ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoTU1fRklYXzFfODQ3NzU5MDY1KSIsICUlbW01IFxuXHQiIC8vJ3o1CisgICAgICAgICJwYWRkdyAlJW1tNiwgJSVtbTIgICAgICAgICAgICBcblx0IiAvLyd6MTEKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoTU1fRklYXzFfMDgyMzkyMjAwKSIsICUlbW0wIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNyAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIC8vLS0tCisgICAgICAgICJtb3ZxIDAqOCslMywgJSVtbTQgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTMsICUlbW0yICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHNsbHcgJDEsICUlbW0yICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW03ICAgICAgICAgICAgXG5cdCIgLy8ndDcKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoTU1fRklYXzFfNDE0MjEzNTYyKSIsICUlbW0yIFxuXHQiIC8vJ3QxMQorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLy9wYWRkdyBtbTcsIE1NXzIKKyAgICAgICAgInBzcmF3ICQyLCAlJW1tNyAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgIkRDVFNJWkVfUyIqMCoyKCUlIlJFR19EIiksICUlbW00IFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNywgJSVtbTYgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxIDEqOCslMywgJSVtbTMgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTcsICUlbW00ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tNiwgIkRDVFNJWkVfUyIqNyoyKCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tMSAgICAgICAgICAgIFxuXHQiIC8vJ3QxMgorCisgICAgICAgICJtb3ZxICUlbW00LCAiRENUU0laRV9TIiowKjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAicHN1YncgJSVtbTcsICUlbW0xICAgICAgICAgICAgXG5cdCIgLy8ndDYKKworICAgICAgICAibW92cSAyKjgrJTMsICUlbW03ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW01LCAlJW1tMCAgICAgICAgICAgIFxuXHQiIC8vJ3QxMAorCisgICAgICAgICJtb3ZxIDMqOCslMywgJSVtbTYgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMywgJSVtbTUgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgIkRDVFNJWkVfUyIqMSoyKCUlIlJFR19EIiksICUlbW0zIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMSwgJSVtbTUgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc3VidyAlJW1tMSwgJSVtbTIgICAgICAgICAgICBcblx0IiAvLyd0NQorICAgICAgICAicGFkZHcgJSVtbTEsICUlbW0zICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tNSwgIkRDVFNJWkVfUyIqNioyKCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICJEQ1RTSVpFX1MiKjIqMiglJSJSRUdfRCIpLCAlJW1tNyBcblx0IgorICAgICAgICAicHN1YncgJSVtbTIsICUlbW00ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgIkRDVFNJWkVfUyIqNSoyKCUlIlJFR19EIiksICUlbW00IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTcgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW0zLCAiRENUU0laRV9TIioxKjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTIsICUlbW0wICAgICAgICAgICAgXG5cdCIgLy8ndDQKKworICAgICAgICAvLyAndDQgJ3Q2ICd0NSAtIC0gLSAtICd0NworICAgICAgICAibW92cSAlJW1tNywgIkRDVFNJWkVfUyIqMioyKCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTYsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICJEQ1RTSVpFX1MiKjQqMiglJSJSRUdfRCIpLCAlJW1tNiBcblx0IgorICAgICAgICAicHN1YncgJSVtbTAsICUlbW0xICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgIkRDVFNJWkVfUyIqMyoyKCUlIlJFR19EIiksICUlbW0xIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTYgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW00LCAiRENUU0laRV9TIio1KjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAiYWRkICQ4LCAlJSJSRUdfUyIgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW02LCAiRENUU0laRV9TIio0KjIoJSUiUkVHX0QiKSBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW0xLCAiRENUU0laRV9TIiozKjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAiYWRkICQ4LCAlJSJSRUdfRCIgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICI0OiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisvLz1wYXJ0IDIgKHRoZSBzYW1lKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjAqMiglJSJSRUdfUyIpLCAlJW1tMSBcblx0IgorICAgICAgICAvLworICAgICAgICAibW92cSAiRENUU0laRV9TIiozKjIoJSUiUkVHX1MiKSwgJSVtbTcgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICJEQ1RTSVpFX1MiKjcqMiglJSJSRUdfUyIpLCAlJW1tMSBcblx0IiAvL3QwCisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tMyAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAiRENUU0laRV9TIio0KjIoJSUiUkVHX1MiKSwgJSVtbTcgXG5cdCIgLy90MworICAgICAgICAibW92cSAlJW1tMSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAiRENUU0laRV9TIioxKjIoJSUiUkVHX1MiKSwgJSVtbTYgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW03LCAlJW1tMSAgICAgICAgICAgIFxuXHQiIC8vdDEzCisKKyAgICAgICAgIm1vdnEgIkRDVFNJWkVfUyIqMioyKCUlIlJFR19TIiksICUlbW0yIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tNCAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAiRENUU0laRV9TIio2KjIoJSUiUkVHX1MiKSwgJSVtbTYgXG5cdCIgLy90MQorICAgICAgICAicGFkZHcgJSVtbTcsICUlbW01ICAgICAgICAgICAgXG5cdCIgLy90MTAKKworICAgICAgICAicGFkZHcgIkRDVFNJWkVfUyIqNSoyKCUlIlJFR19TIiksICUlbW0yIFxuXHQiIC8vdDIKKyAgICAgICAgIm1vdnEgJSVtbTYsICUlbW03ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tNiAgICAgICAgICAgIFxuXHQiIC8vdDExCisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTcgICAgICAgICAgICBcblx0IiAvL3QxMgorCisgICAgICAgICJtb3ZxICUlbW01LCAlJW1tMiAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW01ICAgICAgICAgICAgXG5cdCIgLy9kMAorICAgICAgICAvLyBpMCB0MTMgdDEyIGkzIGkxIGQwIC0gZDQKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMiAgICAgICAgICAgIFxuXHQiIC8vZDQKKyAgICAgICAgInBhZGR3ICUlbW0xLCAlJW1tNyAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgIDEqOCs0KjE2KCUlIlJFR19kIiksICUlbW02ICBcblx0IgorICAgICAgICAicHNsbHcgJDIsICUlbW03ICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc3VidyAxKjgrMCoxNiglJSJSRUdfZCIpLCAlJW1tNSAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMiAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR1c3cgMSo4KzAqMTYoJSUiUkVHX2QiKSwgJSVtbTUgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTYsICUlbW0yICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBtdWxodyAiTUFOR0xFKGZmX01NX0ZJWF8wXzcwNzEwNjc4MSkiLCAlJW1tNyBcblx0IgorICAgICAgICAvLworICAgICAgICAicGFkZHcgMSo4KzAqMTYoJSUiUkVHX2QiKSwgJSVtbTUgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNiwgJSVtbTIgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc3VidXN3IDEqOCswKjE2KCUlIlJFR19kIiksICUlbW01IFxuXHQiCisgICAgICAgICJwc3VidXN3ICUlbW02LCAlJW1tMiAgICAgICAgICBcblx0IgorCisvL1RoaXMgZnVuYyBpcyB0b3RhbGx5IGNvbXB1dGUtYm91bmQsICBvcGVyYXRlcyBhdCBodWdlIHNwZWVkLiBTbywgIERDIHNob3J0Y3V0CisvLyBhdCB0aGlzIHBsYWNlIGlzbid0IHdvcnRod2hpbGUgZHVlIHRvIEJUQiBtaXNzIHBlbmFsdHkgKGNoZWNrZWQgb24gUGVudC4gMykuCisvL0hvd2V2ZXIsICB0eXBpY2FsIG51bWJlcnM6IG5vbmRjIC0gMjklJSwgIGRjIC0gNDYlJSwgIHplcm8gLSAyNSUlLiBBbGwgPD4gMCBjYXNlIGlzIHZlcnkgcmFyZS4KKyAgICAgICAgInBhZGR3ICJNQU5HTEUoTU1fMikiLCAlJW1tNSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNiAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTIgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTYsICUlbW01ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tMSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW03LCAlJW1tMSAgICAgICAgICAgIFxuXHQiIC8vZDIKKworICAgICAgICAicHN1YncgMSo4KzIqMTYoJSUiUkVHX2QiKSwgJSVtbTEgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNywgJSVtbTYgICAgICAgICAgICBcblx0IiAvL2Q2CisKKyAgICAgICAgIm1vdnEgMSo4KzYqMTYoJSUiUkVHX2QiKSwgJSVtbTcgICBcblx0IgorICAgICAgICAicHNyYXcgJDIsICUlbW01ICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdXN3IDEqOCsyKjE2KCUlIlJFR19kIiksICUlbW0xIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNywgJSVtbTYgICAgICAgICAgICBcblx0IgorICAgICAgICAvLyB0NyBkMiAvdDExIHQ0IHQ2IC0gZDYgL3QxMAorCisgICAgICAgICJwYWRkdyAxKjgrMioxNiglJSJSRUdfZCIpLCAlJW1tMSAgXG5cdCIKKyAgICAgICAgInBhZGR1c3cgJSVtbTcsICUlbW02ICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBzdWJ1c3cgMSo4KzIqMTYoJSUiUkVHX2QiKSwgJSVtbTEgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW03LCAlJW1tNiAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBzdWJ3ICJEQ1RTSVpFX1MiKjQqMiglJSJSRUdfUyIpLCAlJW1tMyBcblx0IgorICAgICAgICAicHN1YnVzdyAlJW1tNywgJSVtbTYgICAgICAgICAgXG5cdCIKKworICAgICAgICAvL21vdnEgW2VkaSsiRENUU0laRV9TIioyKjJdLCBtbTEKKyAgICAgICAgLy9tb3ZxIFtlZGkrIkRDVFNJWkVfUyIqNioyXSwgbW02CisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tNyAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYXcgJDIsICUlbW0yICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc3VidyAiRENUU0laRV9TIio2KjIoJSUiUkVHX1MiKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBzdWJ3ICJEQ1RTSVpFX1MiKjcqMiglJSJSRUdfUyIpLCAlJW1tMCBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTcsICUlbW02ICAgICAgICAgICAgXG5cdCIgLy8ndDEzCisKKyAgICAgICAgInBzcmF3ICQyLCAlJW1tNiAgICAgICAgICAgICAgXG5cdCIgLy9wYWRkdyBtbTYsIE1NXzIgISEgICAgLS0tCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNyAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMV80MTQyMTM1NjJfQSkiLCAlJW1tMSBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW0yICAgICAgICAgICAgXG5cdCIgLy8ndDAKKworICAgICAgICAibW92cSAlJW1tMiwgMCo4KyUzICAgICAgICAgICAgXG5cdCIgLy8hCisgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTcgICAgICAgICAgICBcblx0IiAvLyd0MworCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjIqMiglJSJSRUdfUyIpLCAlJW1tMiBcblx0IgorICAgICAgICAicHN1YncgJSVtbTYsICUlbW0xICAgICAgICAgICAgXG5cdCIgLy8ndDEyCisKKyAgICAgICAgInBzdWJ3ICJEQ1RTSVpFX1MiKjUqMiglJSJSRUdfUyIpLCAlJW1tMiBcblx0IiAvL3Q1CisgICAgICAgICJtb3ZxICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW03LCAzKjgrJTMgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTIsICUlbW0zICAgICAgICAgICAgXG5cdCIgLy90MTAKKworICAgICAgICAicGFkZHcgJSVtbTQsICUlbW0yICAgICAgICAgICAgXG5cdCIgLy90MTEKKyAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tNCAgICAgICAgICAgIFxuXHQiIC8vdDEyCisKKyAgICAgICAgIm1vdnEgJSVtbTMsICUlbW03ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNCwgJSVtbTMgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc2xsdyAkMiwgJSVtbTMgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2xsdyAkMiwgJSVtbTcgICAgICAgICAgICAgIFxuXHQiIC8vb3B0IGZvciBQNgorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMF8zODI2ODM0MzMpIiwgJSVtbTMgXG5cdCIKKyAgICAgICAgInBzbGx3ICQyLCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoZmZfTU1fRklYXzBfNTQxMTk2MTAwKSIsICUlbW03IFxuXHQiCisgICAgICAgICJwc2xsdyAkMiwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBtdWxodyAiTUFOR0xFKE1NX0ZJWF8xXzMwNjU2Mjk2NSkiLCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTEsICUlbW01ICAgICAgICAgICAgXG5cdCIgLy8ndDEKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoZmZfTU1fRklYXzBfNzA3MTA2NzgxKSIsICUlbW0yIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMSwgJSVtbTYgICAgICAgICAgICBcblx0IiAvLyd0MgorICAgICAgICAvLyB0NyAndDEyICd0MTEgdDQgdDYgLSAndDEzICd0MTAgICAtLS0KKworICAgICAgICAicGFkZHcgJSVtbTMsICUlbW03ICAgICAgICAgICAgXG5cdCIgLy96MgorCisgICAgICAgICJtb3ZxICUlbW01LCAxKjgrJTMgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW00ICAgICAgICAgICAgXG5cdCIgLy96NAorCisgICAgICAgICJtb3ZxIDEqOCszKjE2KCUlIlJFR19kIiksICUlbW0zICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTYsIDIqOCslMyAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTEgICAgICAgICAgICBcblx0IiAvL3oxMworCisvLz09PQorICAgICAgICAicGFkZHcgJSVtbTIsICUlbW0wICAgICAgICAgICAgXG5cdCIgLy96MTEKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW01ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgMSo4KzUqMTYoJSUiUkVHX2QiKSwgJSVtbTIgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTcsICUlbW0xICAgICAgICAgICAgXG5cdCIgLy9kMworCisgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTUgICAgICAgICAgICBcblx0IiAvL2Q1CisgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxIDEqOCsxKjE2KCUlIlJFR19kIiksICUlbW03ICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW02ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNCwgJSVtbTAgICAgICAgICAgICBcblx0IiAvL2QxCisKKyAgICAgICAgInBhZGR1c3cgJSVtbTMsICUlbW0xICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNCwgJSVtbTYgICAgICAgICAgICBcblx0IiAvL2Q3CisKKyAgICAgICAgLy8gZDEgZDMgLSAtIC0gZDUgZDcgLQorICAgICAgICAibW92cSAxKjgrNyoxNiglJSJSRUdfZCIpLCAlJW1tNCAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNywgJSVtbTAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc3VidyAlJW1tNCwgJSVtbTYgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzdyAlJW1tMiwgJSVtbTUgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHVzdyAlJW1tNCwgJSVtbTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tNSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNCwgJSVtbTYgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc3VidXN3ICUlbW0zLCAlJW1tMSAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzdyAlJW1tMiwgJSVtbTUgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHN1YnVzdyAlJW1tNCwgJSVtbTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW00ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBvciAlJW1tNSwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXN3ICUlbW03LCAlJW1tMCAgICAgICAgICBcblx0IgorCisgICAgICAgICJwb3IgJSVtbTYsICUlbW00ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTcsICUlbW0wICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW00ICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c3cgJSVtbTcsICUlbW0wICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdmQgJSVtbTQsICUlIlJFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJqbnogM2YgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vbW92cSBbZWRpKyJEQ1RTSVpFX1MiKjMqMl0sIG1tMQorICAgICAgICAvL21vdnEgW2VkaSsiRENUU0laRV9TIio1KjJdLCBtbTUKKyAgICAgICAgLy9tb3ZxIFtlZGkrIkRDVFNJWkVfUyIqMSoyXSwgbW0wCisgICAgICAgIC8vbW92cSBbZWRpKyJEQ1RTSVpFX1MiKjcqMl0sIG1tNgorICAgICAgICAvLyB0NCB0NSAtIC0gLSB0NiB0NyAtCisgICAgICAgIC8vLS0tIHQ0IChtbTApIG1heSBiZSA8PjA7IG1tMSwgbW01LCBtbTYgPT0gMAorLy9UeXBpY2FsIG51bWJlcnM6IG5vbmRjIC0gMTklJSwgIGRjIC0gMjYlJSwgIHplcm8gLSA1NSUlLiB6ZXJvIGNhc2UgYWxvbmUgaXNuJ3Qgd29ydGh3aGlsZQorICAgICAgICAibW92cSAwKjgrJTMsICUlbW00ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBtdWxodyAiTUFOR0xFKE1NX0ZJWF8wXzg0Nzc1OTA2NSkiLCAlJW1tMCBcblx0IiAvL3RtcDYKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0yICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgIkRDVFNJWkVfUyIqMCoyKCUlIlJFR19EIiksICUlbW01IFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tMyAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMF81NjY0NTQ0OTcpIiwgJSVtbTEgXG5cdCIgLy90bXA1CisgICAgICAgICJwYWRkdyAlJW1tNCwgJSVtbTUgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxIDEqOCslMywgJSVtbTYgICAgICAgICAgICBcblx0IgorICAgICAgICAvL3BhZGR3IG1tMywgTU1fMgorICAgICAgICAicHNyYXcgJDIsICUlbW0zICAgICAgICAgICAgICBcblx0IiAvL3RtcDcKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoTU1fRklYXzBfMTk4OTEyMzY3KSIsICUlbW0yIFxuXHQiIC8vLXRtcDQKKyAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tNCAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgIkRDVFNJWkVfUyIqMSoyKCUlIlJFR19EIiksICUlbW03IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTUgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW00LCAiRENUU0laRV9TIio3KjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW03ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAyKjgrJTMsICUlbW0zICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW0wLCAlJW1tNiAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgIkRDVFNJWkVfUyIqMioyKCUlIlJFR19EIiksICUlbW00IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTcgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW01LCAiRENUU0laRV9TIiowKjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW00ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tNiwgIkRDVFNJWkVfUyIqNioyKCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW0xLCAlJW1tMyAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgIkRDVFNJWkVfUyIqNSoyKCUlIlJFR19EIiksICUlbW01IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMSwgJSVtbTQgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjMqMiglJSJSRUdfRCIpLCAlJW1tNiBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW01ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAzKjgrJTMsICUlbW0wICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAkMjQsICUlIlJFR19TIiAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tNywgIkRDVFNJWkVfUyIqMSoyKCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tNiAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTQsICJEQ1RTSVpFX1MiKjIqMiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjQqMiglJSJSRUdfRCIpLCAlJW1tNyBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTIsICUlbW02ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tNSwgIkRDVFNJWkVfUyIqNSoyKCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tNyAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTYsICJEQ1RTSVpFX1MiKjMqMiglJSJSRUdfRCIpIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTcsICJEQ1RTSVpFX1MiKjQqMiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJhZGQgJDI0LCAlJSJSRUdfRCIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgJDIsICUlIlJFR19jIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJqbnogMWIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImptcCA1ZiAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIzOiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLy8tLS0gbm9uIERDMgorICAgICAgICAvL3BzcmF3IG1tMSwgMiB3L28gaXQgLT4gb2Zmc2V0LiB0aHIxLCB0aHIxLCB0aHIxICAoYWN0dWFsbHkgdGhyMSwgdGhyMSwgdGhyMS0xKQorICAgICAgICAvL3BzcmF3IG1tNSwgMgorICAgICAgICAvL3BzcmF3IG1tMCwgMgorICAgICAgICAvL3BzcmF3IG1tNiwgMgorICAgICAgICAibW92cSAlJW1tNSwgJSVtbTMgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW0xLCAlJW1tNSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBzbGx3ICQxLCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIgLy8nejEwCisgICAgICAgICJwYWRkdyAlJW1tMSwgJSVtbTMgICAgICAgICAgICBcblx0IiAvLyd6MTMKKworICAgICAgICAibW92cSAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMCAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2xsdyAkMSwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiIC8vJ3oxMgorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMl82MTMxMjU5MzApIiwgJSVtbTEgXG5cdCIgLy8tCisgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTUgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMV84NDc3NTkwNjUpIiwgJSVtbTUgXG5cdCIgLy8nejUKKyAgICAgICAgInBhZGR3ICUlbW02LCAlJW1tMiAgICAgICAgICAgIFxuXHQiIC8vJ3oxMQorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMV8wODIzOTIyMDApIiwgJSVtbTAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW03ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgLy8tLS0KKyAgICAgICAgIm1vdnEgMCo4KyUzLCAlJW1tNCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTIgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc2xsdyAkMSwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTcgICAgICAgICAgICBcblx0IiAvLyd0NworCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMV80MTQyMTM1NjIpIiwgJSVtbTIgXG5cdCIgLy8ndDExCisgICAgICAgICJtb3ZxICUlbW00LCAlJW1tNiAgICAgICAgICAgICBcblx0IgorICAgICAgICAvL3BhZGR3IG1tNywgTU1fMgorICAgICAgICAicHNyYXcgJDIsICUlbW03ICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAiRENUU0laRV9TIiowKjIoJSUiUkVHX0QiKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW03LCAlJW1tNiAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgMSo4KyUzLCAlJW1tMyAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTQgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW02LCAiRENUU0laRV9TIio3KjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW0xICAgICAgICAgICAgXG5cdCIgLy8ndDEyCisKKyAgICAgICAgIm1vdnEgJSVtbTQsICJEQ1RTSVpFX1MiKjAqMiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNywgJSVtbTEgICAgICAgICAgICBcblx0IiAvLyd0NgorCisgICAgICAgICJtb3ZxIDIqOCslMywgJSVtbTcgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTUsICUlbW0wICAgICAgICAgICAgXG5cdCIgLy8ndDEwCisKKyAgICAgICAgIm1vdnEgMyo4KyUzLCAlJW1tNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0zLCAlJW1tNSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAiRENUU0laRV9TIioxKjIoJSUiUkVHX0QiKSwgJSVtbTMgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW0xLCAlJW1tNSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBzdWJ3ICUlbW0xLCAlJW1tMiAgICAgICAgICAgIFxuXHQiIC8vJ3Q1CisgICAgICAgICJwYWRkdyAlJW1tMSwgJSVtbTMgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW01LCAiRENUU0laRV9TIio2KjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAibW92cSAlJW1tNywgJSVtbTQgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgIkRDVFNJWkVfUyIqMioyKCUlIlJFR19EIiksICUlbW03IFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTQgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAiRENUU0laRV9TIio1KjIoJSUiUkVHX0QiKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tNyAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTMsICJEQ1RTSVpFX1MiKjEqMiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTAgICAgICAgICAgICBcblx0IiAvLyd0NAorCisgICAgICAgIC8vICd0NCAndDYgJ3Q1IC0gLSAtIC0gJ3Q3CisgICAgICAgICJtb3ZxICUlbW03LCAiRENUU0laRV9TIioyKjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgIkRDVFNJWkVfUyIqNCoyKCUlIlJFR19EIiksICUlbW02IFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMCwgJSVtbTEgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAiRENUU0laRV9TIiozKjIoJSUiUkVHX0QiKSwgJSVtbTEgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tNiAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTQsICJEQ1RTSVpFX1MiKjUqMiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJhZGQgJDI0LCAlJSJSRUdfUyIgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTYsICJEQ1RTSVpFX1MiKjQqMiglJSJSRUdfRCIpIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTEsICJEQ1RTSVpFX1MiKjMqMiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJhZGQgJDI0LCAlJSJSRUdfRCIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgJDIsICUlIlJFR19jIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJqbnogMWIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjU6ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiAiK1MiKGRhdGEpLCAiK0QiKG91dHB1dCksICIrYyIoY250KSwgIj1vIih0ZW1wcykKKyAgICAgICAgOiAiZCIodGhyX2FkcikKKyAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfTU1fRklYXzBfNzA3MTA2NzgxLE1NXzIsTU1fRklYXzFfNDE0MjEzNTYyX0EsTU1fRklYXzFfNDE0MjEzNTYyLE1NX0ZJWF8wXzM4MjY4MzQzMywKKyAgICAgICAgICBmZl9NTV9GSVhfMF81NDExOTYxMDAsTU1fRklYXzFfMzA2NTYyOTY1LE1NX0ZJWF8wXzg0Nzc1OTA2NSkKKyAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoTU1fRklYXzBfNTY2NDU0NDk3LE1NX0ZJWF8wXzE5ODkxMjM2NyxNTV9GSVhfMl82MTMxMjU5MzAsTU1fRklYXzFfODQ3NzU5MDY1LAorICAgICAgICAgIE1NX0ZJWF8xXzA4MjM5MjIwMCkKKyAgICAgICAgOiAiJSJSRUdfYQorICAgICAgICApOworfQorCisjZW5kaWYgLy8gSEFWRV9NTVhfSU5MSU5FCisKKyNpZiAhSEFWRV9NTVhfSU5MSU5FCisKK3N0YXRpYyB2b2lkIHJvd19pZGN0X2MoaW50MTZfdCogd29ya3NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXRwdXRfYWRyLCBpbnQgb3V0cHV0X3N0cmlkZSwgaW50IGNudCkKK3sKKyAgICBpbnRfc2ltZDE2X3QgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICBpbnRfc2ltZDE2X3QgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgICAgaW50X3NpbWQxNl90IHo1LCB6MTAsIHoxMSwgejEyLCB6MTM7CisgICAgaW50MTZfdCogb3V0cHRyOworICAgIGludDE2X3QqIHdzcHRyOworCisgICAgY250Kj00OworICAgIHdzcHRyID0gd29ya3NwYWNlOworICAgIG91dHB0ciA9IG91dHB1dF9hZHI7CisgICAgZm9yICg7IGNudCA+IDA7IGNudC0tKSB7CisgICAgICAgIC8vIEV2ZW4gcGFydAorICAgICAgICAvL1NpbWQgdmVyc2lvbiByZWFkcyA0eDQgYmxvY2sgYW5kIHRyYW5zcG9zZXMgaXQKKyAgICAgICAgdG1wMTAgPSAoIHdzcHRyWzJdICsgIHdzcHRyWzNdKTsKKyAgICAgICAgdG1wMTEgPSAoIHdzcHRyWzJdIC0gIHdzcHRyWzNdKTsKKworICAgICAgICB0bXAxMyA9ICggd3NwdHJbMF0gKyAgd3NwdHJbMV0pOworICAgICAgICB0bXAxMiA9IChNVUxUSVBMWTE2SCggd3NwdHJbMF0gLSB3c3B0clsxXSwgRklYXzFfNDE0MjEzNTYyX0EpPDwyKSAtIHRtcDEzOy8vdGhpcyBzaGlmdCBvcmRlciB0byBhdm9pZCBvdmVyZmxvdworCisgICAgICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOyAvLy0+dGVtcHMKKyAgICAgICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7IC8vLT50ZW1wcworICAgICAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKKyAgICAgICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7CisKKyAgICAgICAgLy8gT2RkIHBhcnQKKyAgICAgICAgLy9BbHNvIHRyYW5zcG9zZSwgd2l0aCBwcmV2aW91czoKKyAgICAgICAgLy8gLS0tLSAtLS0tICAgICAgfHx8fAorICAgICAgICAvLyAtLS0tIC0tLS0gaWRjdCB8fHx8CisgICAgICAgIC8vIC0tLS0gLS0tLSAtLS0+IHx8fHwKKyAgICAgICAgLy8gLS0tLSAtLS0tICAgICAgfHx8fAorICAgICAgICB6MTMgPSB3c3B0cls0XSArIHdzcHRyWzVdOworICAgICAgICB6MTAgPSB3c3B0cls0XSAtIHdzcHRyWzVdOworICAgICAgICB6MTEgPSB3c3B0cls2XSArIHdzcHRyWzddOworICAgICAgICB6MTIgPSB3c3B0cls2XSAtIHdzcHRyWzddOworCisgICAgICAgIHRtcDcgPSB6MTEgKyB6MTM7CisgICAgICAgIHRtcDExID0gTVVMVElQTFkxNkgoejExIC0gejEzLCBGSVhfMV80MTQyMTM1NjIpOworCisgICAgICAgIHo1ID0gICAgTVVMVElQTFkxNkgoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOworICAgICAgICB0bXAxMCA9IE1VTFRJUExZMTZIKHoxMiwgRklYXzFfMDgyMzkyMjAwKSAtIHo1OworICAgICAgICB0bXAxMiA9IE1VTFRJUExZMTZIKHoxMCwgRklYXzJfNjEzMTI1OTMwKSArIHo1OyAvLyAtIEZJWF8KKworICAgICAgICB0bXA2ID0gKHRtcDEyPDwzKSAtIHRtcDc7CisgICAgICAgIHRtcDUgPSAodG1wMTE8PDMpIC0gdG1wNjsKKyAgICAgICAgdG1wNCA9ICh0bXAxMDw8MykgKyB0bXA1OworCisgICAgICAgIC8vIEZpbmFsIG91dHB1dCBzdGFnZTogZGVzY2FsZSBhbmQgd3JpdGUgY29sdW1uCisgICAgICAgIG91dHB0clswKm91dHB1dF9zdHJpZGVdKz0gREVTQ0FMRSh0bXAwICsgdG1wNywgMyk7CisgICAgICAgIG91dHB0clsxKm91dHB1dF9zdHJpZGVdKz0gREVTQ0FMRSh0bXAxICsgdG1wNiwgMyk7CisgICAgICAgIG91dHB0clsyKm91dHB1dF9zdHJpZGVdKz0gREVTQ0FMRSh0bXAyICsgdG1wNSwgMyk7CisgICAgICAgIG91dHB0clszKm91dHB1dF9zdHJpZGVdKz0gREVTQ0FMRSh0bXAzIC0gdG1wNCwgMyk7CisgICAgICAgIG91dHB0cls0Km91dHB1dF9zdHJpZGVdKz0gREVTQ0FMRSh0bXAzICsgdG1wNCwgMyk7CisgICAgICAgIG91dHB0cls1Km91dHB1dF9zdHJpZGVdKz0gREVTQ0FMRSh0bXAyIC0gdG1wNSwgMyk7CisgICAgICAgIG91dHB0cls2Km91dHB1dF9zdHJpZGVdKz0gREVTQ0FMRSh0bXAxIC0gdG1wNiwgMyk7IC8vbm8gKz0gPworICAgICAgICBvdXRwdHJbNypvdXRwdXRfc3RyaWRlXSs9IERFU0NBTEUodG1wMCAtIHRtcDcsIDMpOyAvL25vICs9ID8KKyAgICAgICAgb3V0cHRyKys7CisKKyAgICAgICAgd3NwdHIgKz0gRENUU0laRTsgICAgICAgLy8gYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93CisgICAgfQorfQorCisjZWxzZSAvKiBIQVZFX01NWF9JTkxJTkUgKi8KKworc3RhdGljIHZvaWQgcm93X2lkY3RfbW14IChpbnQxNl90KiB3b3Jrc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dHB1dF9hZHIsICBpbnQgb3V0cHV0X3N0cmlkZSwgIGludCBjbnQpCit7CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCB0ZW1wcylbNF07CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAoJSUiUkVHX2EiLCUlIlJFR19hIiwyKSwgJSUiUkVHX2QiICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjAqMiglJSJSRUdfUyIpLCAlJW1tMCBcblx0IgorICAgICAgICAvLworCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjEqMiglJSJSRUdfUyIpLCAlJW1tMSBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTQgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAiRENUU0laRV9TIioyKjIoJSUiUkVHX1MiKSwgJSVtbTIgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tMSwgJSVtbTAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgIkRDVFNJWkVfUyIqMyoyKCUlIlJFR19TIiksICUlbW0zIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgJSVtbTEsICUlbW00ICAgICAgICBcblx0IgorCisgICAgICAgIC8vdHJhbnNwb3NlIDR4NAorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTcgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tMywgJSVtbTIgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW02ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsZHEgJSVtbTIsICUlbW0wICAgICAgICBcblx0IiAvLzAKKworICAgICAgICAicHVucGNraGRxICUlbW0yLCAlJW1tNiAgICAgICAgXG5cdCIgLy8xCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwdW5wY2tod2QgJSVtbTMsICUlbW03ICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTYsICUlbW0wICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoTU1fRklYXzFfNDE0MjEzNTYyX0EpIiwgJSVtbTAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInB1bnBja2xkcSAlJW1tNywgJSVtbTQgICAgICAgIFxuXHQiIC8vMgorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW01ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHVucGNraGRxICUlbW03LCAlJW1tMiAgICAgICAgXG5cdCIgLy8zCisgICAgICAgICJtb3ZxICUlbW00LCAlJW1tMSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc2xsdyAkMiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTQgICAgICAgICAgICBcblx0IiAvL3QxMAorCisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjAqMisiRENUU0laRV9TIiglJSJSRUdfUyIpLCAlJW1tMyBcblx0IgorICAgICAgICAicHN1YncgJSVtbTIsICUlbW0xICAgICAgICAgICAgXG5cdCIgLy90MTEKKworICAgICAgICAibW92cSAiRENUU0laRV9TIioxKjIrIkRDVFNJWkVfUyIoJSUiUkVHX1MiKSwgJSVtbTIgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW01LCAlJW1tMCAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW02ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTQgICAgICAgICAgICBcblx0IiAvL3QwCisKKyAgICAgICAgInBzdWJ3ICUlbW01LCAlJW1tNiAgICAgICAgICAgIFxuXHQiIC8vdDMKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW03ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgIkRDVFNJWkVfUyIqMioyKyJEQ1RTSVpFX1MiKCUlIlJFR19TIiksICUlbW01IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTEgICAgICAgICAgICBcblx0IiAvL3QxCisKKyAgICAgICAgIm1vdnEgJSVtbTQsIDAqOCslMyAgICAgICAgICAgIFxuXHQiIC8vdDAKKyAgICAgICAgIm1vdnEgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTYsIDEqOCslMyAgICAgICAgICAgIFxuXHQiIC8vdDMKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tMiwgJSVtbTMgICAgICAgIFxuXHQiCisKKyAgICAgICAgLy90cmFuc3Bvc2UgNHg0CisgICAgICAgICJtb3ZxICJEQ1RTSVpFX1MiKjMqMisiRENUU0laRV9TIiglJSJSRUdfUyIpLCAlJW1tNiBcblx0IgorICAgICAgICAicHVucGNraHdkICUlbW0yLCAlJW1tNCAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tNiwgJSVtbTUgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBzdWJ3ICUlbW0wLCAlJW1tNyAgICAgICAgICAgIFxuXHQiIC8vdDIKKyAgICAgICAgInB1bnBja2h3ZCAlJW1tNiwgJSVtbTIgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTMsICUlbW0wICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsZHEgJSVtbTUsICUlbW0zICAgICAgICBcblx0IiAvLzQKKworICAgICAgICAicHVucGNraGRxICUlbW01LCAlJW1tMCAgICAgICAgXG5cdCIgLy81CisgICAgICAgICJtb3ZxICUlbW00LCAlJW1tNSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIC8vCisgICAgICAgICJtb3ZxICUlbW0zLCAlJW1tNiAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGRxICUlbW0yLCAlJW1tNCAgICAgICAgXG5cdCIgLy82CisKKyAgICAgICAgInBzdWJ3ICUlbW0wLCAlJW1tMyAgICAgICAgICAgIFxuXHQiIC8vejEwCisgICAgICAgICJwdW5wY2toZHEgJSVtbTIsICUlbW01ICAgICAgICBcblx0IiAvLzcKKworICAgICAgICAicGFkZHcgJSVtbTAsICUlbW02ICAgICAgICAgICAgXG5cdCIgLy96MTMKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTMsICUlbW0wICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNSwgJSVtbTQgICAgICAgICAgICBcblx0IiAvL3oxMgorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMl82MTMxMjU5MzApIiwgJSVtbTAgXG5cdCIgLy8tCisgICAgICAgICJwYWRkdyAlJW1tNCwgJSVtbTMgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMV84NDc3NTkwNjUpIiwgJSVtbTMgXG5cdCIgLy96NQorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW0yICAgICAgICAgICAgXG5cdCIgLy96MTEgID4KKworICAgICAgICAicG11bGh3ICJNQU5HTEUoTU1fRklYXzFfMDgyMzkyMjAwKSIsICUlbW00IFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTIgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW01ICAgICAgICAgICAgXG5cdCIgLy90NworCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShNTV9GSVhfMV80MTQyMTM1NjIpIiwgJSVtbTIgXG5cdCIgLy90MTEKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tMCAgICAgICAgICAgIFxuXHQiIC8vdDEyCisKKyAgICAgICAgInBzbGx3ICQzLCAlJW1tMCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tNCAgICAgICAgICAgIFxuXHQiIC8vdDEwCisKKyAgICAgICAgIm1vdnEgMCo4KyUzLCAlJW1tNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tMyAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc2xsdyAkMywgJSVtbTQgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNSwgJSVtbTAgICAgICAgICAgICBcblx0IiAvL3Q2CisKKyAgICAgICAgInBzbGx3ICQzLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tMSAgICAgICAgICAgIFxuXHQiIC8vZDEKKworICAgICAgICAicHN1YncgJSVtbTAsICUlbW0yICAgICAgICAgICAgXG5cdCIgLy90NQorICAgICAgICAicHN1YncgJSVtbTAsICUlbW0zICAgICAgICAgICAgXG5cdCIgLy9kNgorCisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTQgICAgICAgICAgICBcblx0IiAvL3Q0CisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tMCAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTcgICAgICAgICAgICBcblx0IiAvL2QyCisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICAgICBcblx0IiAvL2Q1CisKKyAgICAgICAgIm1vdnEgIk1BTkdMRShNTV9ERVNDQUxFX1JORCkiLCAlJW1tMiAgIFxuXHQiIC8vNAorICAgICAgICAicHN1YncgJSVtbTUsICUlbW02ICAgICAgICAgICAgXG5cdCIgLy9kNworCisgICAgICAgICJwYWRkdyAwKjgrJTMsICUlbW01ICAgICAgICAgICBcblx0IiAvL2QwCisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTEgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTUgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYXcgJDMsICUlbW0xICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTcgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYXcgJDMsICUlbW01ICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAoJSUiUkVHX0QiKSwgJSVtbTUgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICQzLCAlJW1tNyAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgKCUlIlJFR19EIiwlJSJSRUdfYSIpLCAlJW1tMSAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTIsICUlbW0wICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgKCUlIlJFR19EIiwlJSJSRUdfYSIsMiksICUlbW03ICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMyAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTUsICglJSJSRUdfRCIpICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTIsICUlbW02ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tMSwgKCUlIlJFR19EIiwlJSJSRUdfYSIpICAgICBcblx0IgorICAgICAgICAicHNyYXcgJDMsICUlbW0wICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW03LCAoJSUiUkVHX0QiLCUlIlJFR19hIiwyKSAgICBcblx0IgorICAgICAgICAiYWRkICUlIlJFR19kIiwgJSUiUkVHX0QiICAgICAgICAgICAgIFxuXHQiIC8vMypscworCisgICAgICAgICJtb3ZxIDEqOCslMywgJSVtbTUgICAgICAgICAgIFxuXHQiIC8vdDMKKyAgICAgICAgInBzcmF3ICQzLCAlJW1tMyAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgKCUlIlJFR19EIiwlJSJSRUdfYSIsMiksICUlbW0wICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW00LCAlJW1tNSAgICAgICAgICAgIFxuXHQiIC8vZDMKKworICAgICAgICAicGFkZHcgKCUlIlJFR19EIiwlJSJSRUdfZCIpLCAlJW1tMyAgICBcblx0IgorICAgICAgICAicHNyYXcgJDMsICUlbW02ICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAxKjgrJTMsICUlbW00ICAgICAgICAgICBcblx0IiAvL2Q0CisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTUgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAoJSUiUkVHX0QiLCUlIlJFR19hIiw0KSwgJSVtbTYgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTIsICUlbW00ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tMCwgKCUlIlJFR19EIiwlJSJSRUdfYSIsMikgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICQzLCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHcgKCUlIlJFR19EIiksICUlbW01ICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhdyAkMywgJSVtbTQgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICglJSJSRUdfRCIsJSUiUkVHX2EiKSwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgImFkZCAkIkRDVFNJWkVfUyIqMio0LCAlJSJSRUdfUyIgICAgICBcblx0IiAvLzQgcm93cworCisgICAgICAgICJtb3ZxICUlbW0zLCAoJSUiUkVHX0QiLCUlIlJFR19kIikgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW02LCAoJSUiUkVHX0QiLCUlIlJFR19hIiw0KSAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNSwgKCUlIlJFR19EIikgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW00LCAoJSUiUkVHX0QiLCUlIlJFR19hIikgICAgIFxuXHQiCisKKyAgICAgICAgInN1YiAlJSJSRUdfZCIsICUlIlJFR19EIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICQ4LCAlJSJSRUdfRCIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGVjICUlIlJFR19jIiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiam56IDFiICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6ICIrUyIod29ya3NwYWNlKSwgIitEIihvdXRwdXRfYWRyKSwgIitjIihjbnQpLCAiPW8iKHRlbXBzKQorICAgICAgICA6ICJhIihvdXRwdXRfc3RyaWRlKnNpemVvZihzaG9ydCkpCisgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChNTV9GSVhfMV80MTQyMTM1NjJfQSxNTV9GSVhfMl82MTMxMjU5MzAsTU1fRklYXzFfODQ3NzU5MDY1LE1NX0ZJWF8xXzA4MjM5MjIwMCwKKyAgICAgICAgTU1fRklYXzFfNDE0MjEzNTYyLE1NX0RFU0NBTEVfUk5EKQorICAgICAgICA6ICIlIlJFR19kCisgICAgICAgICk7Cit9CisKKyNlbmRpZiAvLyBIQVZFX01NWF9JTkxJTkUKKworI2lmICFIQVZFX01NWF9JTkxJTkUKKworc3RhdGljIHZvaWQgcm93X2ZkY3RfYyhpbnQxNl90ICpkYXRhLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIGludCBsaW5lX3NpemUsIGludCBjbnQpCit7CisgICAgaW50X3NpbWQxNl90IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgaW50X3NpbWQxNl90IHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICAgIGludF9zaW1kMTZfdCB6MSwgejIsIHozLCB6NCwgejUsIHoxMSwgejEzOworICAgIGludDE2X3QgKmRhdGFwdHI7CisKKyAgICBjbnQqPTQ7CisgICAgLy8gUGFzcyAxOiBwcm9jZXNzIHJvd3MuCisKKyAgICBkYXRhcHRyID0gZGF0YTsKKyAgICBmb3IgKDsgY250ID4gMDsgY250LS0pIHsKKyAgICAgICAgdG1wMCA9IHBpeGVsc1tsaW5lX3NpemUqMF0gKyBwaXhlbHNbbGluZV9zaXplKjddOworICAgICAgICB0bXA3ID0gcGl4ZWxzW2xpbmVfc2l6ZSowXSAtIHBpeGVsc1tsaW5lX3NpemUqN107CisgICAgICAgIHRtcDEgPSBwaXhlbHNbbGluZV9zaXplKjFdICsgcGl4ZWxzW2xpbmVfc2l6ZSo2XTsKKyAgICAgICAgdG1wNiA9IHBpeGVsc1tsaW5lX3NpemUqMV0gLSBwaXhlbHNbbGluZV9zaXplKjZdOworICAgICAgICB0bXAyID0gcGl4ZWxzW2xpbmVfc2l6ZSoyXSArIHBpeGVsc1tsaW5lX3NpemUqNV07CisgICAgICAgIHRtcDUgPSBwaXhlbHNbbGluZV9zaXplKjJdIC0gcGl4ZWxzW2xpbmVfc2l6ZSo1XTsKKyAgICAgICAgdG1wMyA9IHBpeGVsc1tsaW5lX3NpemUqM10gKyBwaXhlbHNbbGluZV9zaXplKjRdOworICAgICAgICB0bXA0ID0gcGl4ZWxzW2xpbmVfc2l6ZSozXSAtIHBpeGVsc1tsaW5lX3NpemUqNF07CisKKyAgICAgICAgLy8gRXZlbiBwYXJ0CisKKyAgICAgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICAgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICAgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAgICAgLy9FdmVuIGNvbHVtbnMgYXJlIHdyaXR0ZW4gZmlyc3QsIHRoaXMgbGVhZHMgdG8gZGlmZmVyZW50IG9yZGVyIG9mIGNvbHVtbnMKKyAgICAgICAgLy9pbiBjb2x1bW5fZmlkY3QoKSwgYnV0IHRoZXkgYXJlIHByb2Nlc3NlZCBpbmRlcGVuZGVudGx5LCBzbyBhbGwgb2suCisgICAgICAgIC8vTGF0ZXIgaW4gdGhlIHJvd19pZGN0KCkgY29sdW1ucyByZWFkZWQgYXQgdGhlIHNhbWUgb3JkZXIuCisgICAgICAgIGRhdGFwdHJbMl0gPSB0bXAxMCArIHRtcDExOworICAgICAgICBkYXRhcHRyWzNdID0gdG1wMTAgLSB0bXAxMTsKKworICAgICAgICB6MSA9IE1VTFRJUExZMTZIKCh0bXAxMiArIHRtcDEzKTw8MiwgRklYXzBfNzA3MTA2NzgxKTsKKyAgICAgICAgZGF0YXB0clswXSA9IHRtcDEzICsgejE7CisgICAgICAgIGRhdGFwdHJbMV0gPSB0bXAxMyAtIHoxOworCisgICAgICAgIC8vIE9kZCBwYXJ0CisKKyAgICAgICAgdG1wMTAgPSAodG1wNCArIHRtcDUpIDw8MjsKKyAgICAgICAgdG1wMTEgPSAodG1wNSArIHRtcDYpIDw8MjsKKyAgICAgICAgdG1wMTIgPSAodG1wNiArIHRtcDcpIDw8MjsKKworICAgICAgICB6NSA9IE1VTFRJUExZMTZIKHRtcDEwIC0gdG1wMTIsIEZJWF8wXzM4MjY4MzQzMyk7CisgICAgICAgIHoyID0gTVVMVElQTFkxNkgodG1wMTAsIEZJWF8wXzU0MTE5NjEwMCkgKyB6NTsKKyAgICAgICAgejQgPSBNVUxUSVBMWTE2SCh0bXAxMiwgRklYXzFfMzA2NTYyOTY1KSArIHo1OworICAgICAgICB6MyA9IE1VTFRJUExZMTZIKHRtcDExLCBGSVhfMF83MDcxMDY3ODEpOworCisgICAgICAgIHoxMSA9IHRtcDcgKyB6MzsKKyAgICAgICAgejEzID0gdG1wNyAtIHozOworCisgICAgICAgIGRhdGFwdHJbNF0gPSB6MTMgKyB6MjsKKyAgICAgICAgZGF0YXB0cls1XSA9IHoxMyAtIHoyOworICAgICAgICBkYXRhcHRyWzZdID0gejExICsgejQ7CisgICAgICAgIGRhdGFwdHJbN10gPSB6MTEgLSB6NDsKKworICAgICAgICBwaXhlbHMrKzsgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4KKyAgICAgICAgZGF0YXB0ciArPSBEQ1RTSVpFOworICAgIH0KK30KKworI2Vsc2UgLyogSEFWRV9NTVhfSU5MSU5FICovCisKK3N0YXRpYyB2b2lkIHJvd19mZGN0X21teChpbnQxNl90ICpkYXRhLCAgY29uc3QgdWludDhfdCAqcGl4ZWxzLCAgaW50IGxpbmVfc2l6ZSwgIGludCBjbnQpCit7CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCB0ZW1wcylbNF07CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAoJSUiUkVHX2EiLCUlIlJFR19hIiwyKSwgJSUiUkVHX2QiICAgIFxuXHQiCisgICAgICAgICI2OiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICglJSJSRUdfUyIpLCAlJW1tMCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdmQgKCUlIlJFR19TIiwlJSJSRUdfYSIpLCAlJW1tMSAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdmQgKCUlIlJFR19TIiwlJSJSRUdfYSIsMiksICUlbW0yICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0xICAgICAgICBcblx0IgorCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAiYWRkICUlIlJFR19kIiwgJSUiUkVHX1MiICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW01ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vCisKKyAgICAgICAgIm1vdmQgKCUlIlJFR19TIiwlJSJSRUdfYSIsNCksICUlbW0zICAgIFxuXHQiIC8vNyAgO3ByZWZldGNoIQorICAgICAgICAibW92cSAlJW1tMSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92ZCAoJSUiUkVHX1MiLCUlIlJFR19kIiksICUlbW00ICAgICBcblx0IiAvLzYKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTMgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tNSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW00ICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTQsICUlbW02ICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92ZCAoJSUiUkVHX1MiLCUlIlJFR19hIiwyKSwgJSVtbTMgICAgXG5cdCIgLy81CisgICAgICAgICJwYWRkdyAlJW1tNCwgJSVtbTEgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW01LCAlMyAgICAgICAgICAgICAgICBcblx0IiAvL3Q3CisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0zICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW02LCAlNCAgICAgICAgICAgICAgICBcblx0IiAvL3Q2CisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNCAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZkICglJSJSRUdfUyIpLCAlJW1tNSAgICAgICAgICAgXG5cdCIgLy8zCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTIgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZkICglJSJSRUdfUyIsJSUiUkVHX2EiKSwgJSVtbTYgICAgIFxuXHQiIC8vNAorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNSAgICAgICAgXG5cdCIKKworICAgICAgICAicHN1YncgJSVtbTMsICUlbW00ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTYgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0zICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNiwgJSVtbTUgICAgICAgICAgICBcblx0IiAvL3QzCisKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMyAgICAgICAgICAgIFxuXHQiIC8vdDQgIDsgdDAgdDEgdDIgdDQgdDUgdDMgLSAtCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNiAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tNyAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTUsICUlbW0wICAgICAgICAgICAgXG5cdCIgLy90MTMKKworICAgICAgICAicHN1YncgJSVtbTIsICUlbW0xICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tNyAgICAgICAgICAgIFxuXHQiIC8vdDExCisKKyAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tMiAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwc2xsdyAkMiwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTYgICAgICAgICAgICBcblx0IiAvL3QxMAorCisgICAgICAgICJwbXVsaHcgIk1BTkdMRShmZl9NTV9GSVhfMF83MDcxMDY3ODEpIiwgJSVtbTEgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW02LCAlJW1tNyAgICAgICAgICAgIFxuXHQiIC8vZDIKKworICAgICAgICAicHN1YncgJSVtbTIsICUlbW02ICAgICAgICAgICAgXG5cdCIgLy9kMworICAgICAgICAibW92cSAlJW1tMCwgJSVtbTUgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAvL3RyYW5zcG9zZSA0eDQKKyAgICAgICAgIm1vdnEgJSVtbTcsICUlbW0yICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgJSVtbTYsICUlbW03ICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkdyAlJW1tMSwgJSVtbTAgICAgICAgICAgICBcblx0IiAvL2QwCisgICAgICAgICJwdW5wY2tod2QgJSVtbTYsICUlbW0yICAgICAgICBcblx0IgorCisgICAgICAgICJwc3VidyAlJW1tMSwgJSVtbTUgICAgICAgICAgICBcblx0IiAvL2QxCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNiAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICU0LCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICUlbW01LCAlJW1tMCAgICAgICAgXG5cdCIKKworICAgICAgICAicHVucGNraHdkICUlbW01LCAlJW1tNiAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW01ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInB1bnBja2xkcSAlJW1tNywgJSVtbTAgICAgICAgIFxuXHQiIC8vMAorICAgICAgICAicGFkZHcgJSVtbTQsICUlbW0zICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHVucGNraGRxICUlbW03LCAlJW1tNSAgICAgICAgXG5cdCIgLy8xCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tNyAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW0wLCAiRENUU0laRV9TIiowKjIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAicHVucGNrbGRxICUlbW0yLCAlJW1tNiAgICAgICAgXG5cdCIgLy8yCisKKyAgICAgICAgIm1vdnEgJSVtbTUsICJEQ1RTSVpFX1MiKjEqMiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJwdW5wY2toZHEgJSVtbTIsICUlbW03ICAgICAgICBcblx0IiAvLzMKKworICAgICAgICAibW92cSAlJW1tNiwgIkRDVFNJWkVfUyIqMioyKCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0xLCAlJW1tNCAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTcsICJEQ1RTSVpFX1MiKjMqMiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJwc2xsdyAkMiwgJSVtbTMgICAgICAgICAgICAgIFxuXHQiIC8vdDEwCisKKyAgICAgICAgIm1vdnEgJTMsICUlbW0yICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzbGx3ICQyLCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIgLy90MTEKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoZmZfTU1fRklYXzBfNzA3MTA2NzgxKSIsICUlbW00IFxuXHQiIC8vejMKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBzbGx3ICQyLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIgLy90MTIKKyAgICAgICAgIm1vdnEgJSVtbTMsICUlbW0wICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBtdWxodyAiTUFOR0xFKGZmX01NX0ZJWF8wXzU0MTE5NjEwMCkiLCAlJW1tMCBcblx0IgorICAgICAgICAicHN1YncgJSVtbTEsICUlbW0zICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicG11bGh3ICJNQU5HTEUoTU1fRklYXzBfMzgyNjgzNDMzKSIsICUlbW0zIFxuXHQiIC8vejUKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW01ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBtdWxodyAiTUFOR0xFKE1NX0ZJWF8xXzMwNjU2Mjk2NSkiLCAlJW1tMSBcblx0IgorICAgICAgICAicHN1YncgJSVtbTQsICUlbW0yICAgICAgICAgICAgXG5cdCIgLy96MTMKKworICAgICAgICAicGFkZHcgJSVtbTQsICUlbW01ICAgICAgICAgICAgXG5cdCIgLy96MTEKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW02ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tMCAgICAgICAgICAgIFxuXHQiIC8vejIKKyAgICAgICAgIm1vdnEgJSVtbTUsICUlbW03ICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tMiAgICAgICAgICAgIFxuXHQiIC8vZDQKKyAgICAgICAgInBzdWJ3ICUlbW0wLCAlJW1tNiAgICAgICAgICAgIFxuXHQiIC8vZDUKKworICAgICAgICAibW92cSAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgIFxuXHQiIC8vejQKKworICAgICAgICAvL3RyYW5zcG9zZSA0eDQKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tNiwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMSwgJSVtbTUgICAgICAgICAgICBcblx0IiAvL2Q2CisKKyAgICAgICAgInB1bnBja2h3ZCAlJW1tNiwgJSVtbTQgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMSwgJSVtbTcgICAgICAgICAgICBcblx0IiAvL2Q3CisKKyAgICAgICAgIm1vdnEgJSVtbTUsICUlbW02ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgJSVtbTcsICUlbW01ICAgICAgICBcblx0IgorCisgICAgICAgICJwdW5wY2tod2QgJSVtbTcsICUlbW02ICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTcgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHVucGNrbGRxICUlbW01LCAlJW1tMiAgICAgICAgXG5cdCIgLy80CisgICAgICAgICJzdWIgJSUiUkVHX2QiLCAlJSJSRUdfUyIgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicHVucGNraGRxICUlbW01LCAlJW1tNyAgICAgICAgXG5cdCIgLy81CisgICAgICAgICJtb3ZxICUlbW00LCAlJW1tNSAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW0yLCAiRENUU0laRV9TIiowKjIrIkRDVFNJWkVfUyIoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAicHVucGNrbGRxICUlbW02LCAlJW1tNCAgICAgICAgXG5cdCIgLy82CisKKyAgICAgICAgIm1vdnEgJSVtbTcsICJEQ1RTSVpFX1MiKjEqMisiRENUU0laRV9TIiglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJwdW5wY2toZHEgJSVtbTYsICUlbW01ICAgICAgICBcblx0IiAvLzcKKworICAgICAgICAibW92cSAlJW1tNCwgIkRDVFNJWkVfUyIqMioyKyJEQ1RTSVpFX1MiKCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgImFkZCAkNCwgJSUiUkVHX1MiICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tNSwgIkRDVFNJWkVfUyIqMyoyKyJEQ1RTSVpFX1MiKCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgImFkZCAkIkRDVFNJWkVfUyIqMio0LCAlJSJSRUdfRCIgICAgICBcblx0IiAvLzQgcm93cworICAgICAgICAiZGVjICUlIlJFR19jIiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiam56IDZiICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6ICIrUyIocGl4ZWxzKSwgIitEIihkYXRhKSwgIitjIihjbnQpLCAiPW8iKHRlbXBzKSwgIj1vIih0ZW1wc1sxXSkKKyAgICAgICAgOiAiYSIobGluZV9zaXplKQorICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfTU1fRklYXzBfNzA3MTA2NzgxLGZmX01NX0ZJWF8wXzU0MTE5NjEwMCxNTV9GSVhfMF8zODI2ODM0MzMsTU1fRklYXzFfMzA2NTYyOTY1KQorICAgICAgICA6ICIlIlJFR19kKTsKK30KKworI2VuZGlmIC8vIEhBVkVfTU1YX0lOTElORQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL3ZmX2lscGFjay5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL3ZmX2lscGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmIwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvdmZfaWxwYWNrLmMKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBNUGxheWVyLgorICoKKyAqIE1QbGF5ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE1QbGF5ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIE1QbGF5ZXI7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIm1wX21zZy5oIgorI2luY2x1ZGUgImNwdWRldGVjdC5oIgorCisjaW5jbHVkZSAiaW1nX2Zvcm1hdC5oIgorI2luY2x1ZGUgIm1wX2ltYWdlLmgiCisjaW5jbHVkZSAidmYuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisKK3R5cGVkZWYgdm9pZCAocGFja19mdW5jX3QpKHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgY2hhciAqeSwKKyAgICB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgdywgaW50IHVzLCBpbnQgdnMpOworCitzdHJ1Y3QgdmZfcHJpdl9zIHsKKyAgICBpbnQgbW9kZTsKKyAgICBwYWNrX2Z1bmNfdCAqcGFja1syXTsKK307CisKK3N0YXRpYyB2b2lkIHBhY2tfbm5fQyh1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGNoYXIgKnksCisgICAgdW5zaWduZWQgY2hhciAqdSwgdW5zaWduZWQgY2hhciAqdiwgaW50IHcsCisgICAgaW50IGF2X3VudXNlZCB1cywgaW50IGF2X3VudXNlZCB2cykKK3sKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSB3LzI7IGo7IGotLSkgeworICAgICAgICAqZHN0KysgPSAqeSsrOworICAgICAgICAqZHN0KysgPSAqdSsrOworICAgICAgICAqZHN0KysgPSAqeSsrOworICAgICAgICAqZHN0KysgPSAqdisrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcGFja19saV8wX0ModW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBjaGFyICp5LAorICAgIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB3LCBpbnQgdXMsIGludCB2cykKK3sKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSB3LzI7IGo7IGotLSkgeworICAgICAgICAqZHN0KysgPSAqeSsrOworICAgICAgICAqZHN0KysgPSAodVt1cyt1c10gKyA3KnVbMF0pPj4zOworICAgICAgICAqZHN0KysgPSAqeSsrOworICAgICAgICAqZHN0KysgPSAodlt2cyt2c10gKyA3KnZbMF0pPj4zOworICAgICAgICB1Kys7IHYrKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBhY2tfbGlfMV9DKHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgY2hhciAqeSwKKyAgICB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgdywgaW50IHVzLCBpbnQgdnMpCit7CisgICAgaW50IGo7CisgICAgZm9yIChqID0gdy8yOyBqOyBqLS0pIHsKKyAgICAgICAgKmRzdCsrID0gKnkrKzsKKyAgICAgICAgKmRzdCsrID0gKDMqdVt1cyt1c10gKyA1KnVbMF0pPj4zOworICAgICAgICAqZHN0KysgPSAqeSsrOworICAgICAgICAqZHN0KysgPSAoMyp2W3ZzK3ZzXSArIDUqdlswXSk+PjM7CisgICAgICAgIHUrKzsgdisrOworICAgIH0KK30KKworI2lmIEhBVkVfTU1YX0lOTElORQorc3RhdGljIHZvaWQgcGFja19ubl9NTVgodW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBjaGFyICp5LAorICAgIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB3LAorICAgIGludCBhdl91bnVzZWQgdXMsIGludCBhdl91bnVzZWQgdnMpCit7CisgICAgX19hc21fXyB2b2xhdGlsZSAoIiIKKyAgICAgICAgQVNNQUxJR04oNCkKKyAgICAgICAgIjE6IFxuXHQiCisgICAgICAgICJtb3ZxICglMCksICUlbW0xIFxuXHQiCisgICAgICAgICJtb3ZxICglMCksICUlbW0yIFxuXHQiCisgICAgICAgICJtb3ZxICglMSksICUlbW00IFxuXHQiCisgICAgICAgICJtb3ZxICglMiksICUlbW02IFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTYsICUlbW00IFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTQsICUlbW0xIFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTQsICUlbW0yIFxuXHQiCisKKyAgICAgICAgImFkZCAkOCwgJTAgXG5cdCIKKyAgICAgICAgImFkZCAkNCwgJTEgXG5cdCIKKyAgICAgICAgImFkZCAkNCwgJTIgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTEsICglMykgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsIDgoJTMpIFxuXHQiCisgICAgICAgICJhZGQgJDE2LCAlMyBcblx0IgorICAgICAgICAiZGVjbCAlNCBcblx0IgorICAgICAgICAiam56IDFiIFxuXHQiCisgICAgICAgICJlbW1zIFxuXHQiCisgICAgICAgIDoKKyAgICAgICAgOiAiciIgKHkpLCAiciIgKHUpLCAiciIgKHYpLCAiciIgKGRzdCksICJyIiAody84KQorICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgcGFja19ubl9DKGRzdCwgeSwgdSwgdiwgKHcmNyksIDAsIDApOworfQorCisjaWYgSEFWRV9FQlhfQVZBSUxBQkxFCitzdGF0aWMgdm9pZCBwYWNrX2xpXzBfTU1YKHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgY2hhciAqeSwKKyAgICB1bnNpZ25lZCBjaGFyICp1LCB1bnNpZ25lZCBjaGFyICp2LCBpbnQgdywgaW50IHVzLCBpbnQgdnMpCit7CisgICAgX19hc21fXyB2b2xhdGlsZSAoIiIKKyAgICAgICAgInB1c2ggJSUiUkVHX0JQIiBcblx0IgorI2lmIEFSQ0hfWDg2XzY0CisgICAgICAgICJtb3YgJTYsICUlIlJFR19CUCIgXG5cdCIKKyNlbHNlCisgICAgICAgICJtb3ZsIDQoJSUiUkVHX2QiKSwgJSUiUkVHX0JQIiBcblx0IgorICAgICAgICAibW92bCAoJSUiUkVHX2QiKSwgJSUiUkVHX2QiIFxuXHQiCisjZW5kaWYKKyAgICAgICAgInB4b3IgJSVtbTAsICUlbW0wIFxuXHQiCisKKyAgICAgICAgQVNNQUxJR04oNCkKKyAgICAgICAgIjI6IFxuXHQiCisgICAgICAgICJtb3ZxICglJSJSRUdfUyIpLCAlJW1tMSBcblx0IgorICAgICAgICAibW92cSAoJSUiUkVHX1MiKSwgJSVtbTIgXG5cdCIKKworICAgICAgICAibW92cSAoJSUiUkVHX2EiLCUlIlJFR19kIiwyKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19iIiwlJSJSRUdfQlAiLDIpLCAlJW1tNiBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW0wLCAlJW1tNCBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW0wLCAlJW1tNiBcblx0IgorICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTMgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19iIiksICUlbW01IFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTAsICUlbW0zIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTAsICUlbW01IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW00IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTYgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW02IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW00IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTYgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW02IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiBcblx0IgorICAgICAgICAicHNybHcgJDMsICUlbW00IFxuXHQiCisgICAgICAgICJwc3JsdyAkMywgJSVtbTYgXG5cdCIKKyAgICAgICAgInBhY2t1c3diICUlbW00LCAlJW1tNCBcblx0IgorICAgICAgICAicGFja3Vzd2IgJSVtbTYsICUlbW02IFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTYsICUlbW00IFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTQsICUlbW0xIFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTQsICUlbW0yIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTEsICglJSJSRUdfRCIpIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0yLCA4KCUlIlJFR19EIikgXG5cdCIKKworICAgICAgICAibW92cSA4KCUlIlJFR19TIiksICUlbW0xIFxuXHQiCisgICAgICAgICJtb3ZxIDgoJSUiUkVHX1MiKSwgJSVtbTIgXG5cdCIKKworICAgICAgICAibW92cSAoJSUiUkVHX2EiLCUlIlJFR19kIiwyKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19iIiwlJSJSRUdfQlAiLDIpLCAlJW1tNiBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW0wLCAlJW1tNCBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW0wLCAlJW1tNiBcblx0IgorICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTMgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19iIiksICUlbW01IFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTAsICUlbW0zIFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTAsICUlbW01IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW00IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTYgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW02IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW00IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTYgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW02IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiBcblx0IgorICAgICAgICAicHNybHcgJDMsICUlbW00IFxuXHQiCisgICAgICAgICJwc3JsdyAkMywgJSVtbTYgXG5cdCIKKyAgICAgICAgInBhY2t1c3diICUlbW00LCAlJW1tNCBcblx0IgorICAgICAgICAicGFja3Vzd2IgJSVtbTYsICUlbW02IFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTYsICUlbW00IFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTQsICUlbW0xIFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTQsICUlbW0yIFxuXHQiCisKKyAgICAgICAgImFkZCAkMTYsICUlIlJFR19TIiBcblx0IgorICAgICAgICAiYWRkICQ4LCAlJSJSRUdfYSIgXG5cdCIKKyAgICAgICAgImFkZCAkOCwgJSUiUkVHX2IiIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTEsIDE2KCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsIDI0KCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgImFkZCAkMzIsICUlIlJFR19EIiBcblx0IgorCisgICAgICAgICJkZWNsICUlZWN4IFxuXHQiCisgICAgICAgICJqbnogMmIgXG5cdCIKKyAgICAgICAgImVtbXMgXG5cdCIKKyAgICAgICAgInBvcCAlJSJSRUdfQlAiIFxuXHQiCisgICAgICAgIDoKKyAgICAgICAgOiAiUyIgKHkpLCAiRCIgKGRzdCksICJhIiAodSksICJiIiAodiksICJjIiAody8xNiksCisjaWYgQVJDSF9YODZfNjQKKyAgICAgICAgImQiICgoeDg2X3JlZyl1cyksICJyIiAoKHg4Nl9yZWcpdnMpCisjZWxzZQorICAgICAgICAiZCIgKCZ1cykKKyNlbmRpZgorICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgcGFja19saV8wX0MoZHN0LCB5LCB1LCB2LCAodyYxNSksIHVzLCB2cyk7Cit9CisKK3N0YXRpYyB2b2lkIHBhY2tfbGlfMV9NTVgodW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBjaGFyICp5LAorICAgIHVuc2lnbmVkIGNoYXIgKnUsIHVuc2lnbmVkIGNoYXIgKnYsIGludCB3LCBpbnQgdXMsIGludCB2cykKK3sKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgiIgorICAgICAgICAicHVzaCAlJSJSRUdfQlAiIFxuXHQiCisjaWYgQVJDSF9YODZfNjQKKyAgICAgICAgIm1vdiAlNiwgJSUiUkVHX0JQIiBcblx0IgorI2Vsc2UKKyAgICAgICAgIm1vdmwgNCglJSJSRUdfZCIpLCAlJSJSRUdfQlAiIFxuXHQiCisgICAgICAgICJtb3ZsICglJSJSRUdfZCIpLCAlJSJSRUdfZCIgXG5cdCIKKyNlbmRpZgorICAgICAgICAicHhvciAlJW1tMCwgJSVtbTAgXG5cdCIKKworICAgICAgICBBU01BTElHTig0KQorICAgICAgICAiMzogXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19TIiksICUlbW0xIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJSRUdfUyIpLCAlJW1tMiBcblx0IgorCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIsJSUiUkVHX2QiLDIpLCAlJW1tNCBcblx0IgorICAgICAgICAibW92cSAoJSUiUkVHX2IiLCUlIlJFR19CUCIsMiksICUlbW02IFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTAsICUlbW00IFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTAsICUlbW02IFxuXHQiCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIpLCAlJW1tMyBcblx0IgorICAgICAgICAibW92cSAoJSUiUkVHX2IiKSwgJSVtbTUgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTMgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTUgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW03IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNCwgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW03LCAlJW1tNCBcblx0IgorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTcgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW02LCAlJW1tNiBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTcsICUlbW02IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW00IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTYgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW02IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW00IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTYgXG5cdCIKKyAgICAgICAgInBzcmx3ICQzLCAlJW1tNCBcblx0IgorICAgICAgICAicHNybHcgJDMsICUlbW02IFxuXHQiCisgICAgICAgICJwYWNrdXN3YiAlJW1tNCwgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhY2t1c3diICUlbW02LCAlJW1tNiBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW02LCAlJW1tNCBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW00LCAlJW1tMSBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW00LCAlJW1tMiBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW0xLCAoJSUiUkVHX0QiKSBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgOCglJSJSRUdfRCIpIFxuXHQiCisKKyAgICAgICAgIm1vdnEgOCglJSJSRUdfUyIpLCAlJW1tMSBcblx0IgorICAgICAgICAibW92cSA4KCUlIlJFR19TIiksICUlbW0yIFxuXHQiCisKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwlJSJSRUdfZCIsMiksICUlbW00IFxuXHQiCisgICAgICAgICJtb3ZxICglJSJSRUdfYiIsJSUiUkVHX0JQIiwyKSwgJSVtbTYgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tMCwgJSVtbTQgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tMCwgJSVtbTYgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiksICUlbW0zIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJSRUdfYiIpLCAlJW1tNSBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW0wLCAlJW1tMyBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW0wLCAlJW1tNSBcblx0IgorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTcgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW00LCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTcsICUlbW00IFxuXHQiCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tNyBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW02IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTYgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW02IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW00IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTYgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tNCBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW02IFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTQgXG5cdCIKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiBcblx0IgorICAgICAgICAicHNybHcgJDMsICUlbW00IFxuXHQiCisgICAgICAgICJwc3JsdyAkMywgJSVtbTYgXG5cdCIKKyAgICAgICAgInBhY2t1c3diICUlbW00LCAlJW1tNCBcblx0IgorICAgICAgICAicGFja3Vzd2IgJSVtbTYsICUlbW02IFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTYsICUlbW00IFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTQsICUlbW0xIFxuXHQiCisgICAgICAgICJwdW5wY2toYncgJSVtbTQsICUlbW0yIFxuXHQiCisKKyAgICAgICAgImFkZCAkMTYsICUlIlJFR19TIiBcblx0IgorICAgICAgICAiYWRkICQ4LCAlJSJSRUdfYSIgXG5cdCIKKyAgICAgICAgImFkZCAkOCwgJSUiUkVHX2IiIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTEsIDE2KCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsIDI0KCUlIlJFR19EIikgXG5cdCIKKyAgICAgICAgImFkZCAkMzIsICUlIlJFR19EIiBcblx0IgorCisgICAgICAgICJkZWNsICUlZWN4IFxuXHQiCisgICAgICAgICJqbnogM2IgXG5cdCIKKyAgICAgICAgImVtbXMgXG5cdCIKKyAgICAgICAgInBvcCAlJSJSRUdfQlAiIFxuXHQiCisgICAgICAgIDoKKyAgICAgICAgOiAiUyIgKHkpLCAiRCIgKGRzdCksICJhIiAodSksICJiIiAodiksICJjIiAody8xNiksCisjaWYgQVJDSF9YODZfNjQKKyAgICAgICAgImQiICgoeDg2X3JlZyl1cyksICJyIiAoKHg4Nl9yZWcpdnMpCisjZWxzZQorICAgICAgICAiZCIgKCZ1cykKKyNlbmRpZgorICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgcGFja19saV8xX0MoZHN0LCB5LCB1LCB2LCAodyYxNSksIHVzLCB2cyk7Cit9CisjZW5kaWYgLyogSEFWRV9FQlhfQVZBSUxBQkxFICovCisjZW5kaWYKKworc3RhdGljIHBhY2tfZnVuY190ICpwYWNrX25uOworc3RhdGljIHBhY2tfZnVuY190ICpwYWNrX2xpXzA7CitzdGF0aWMgcGFja19mdW5jX3QgKnBhY2tfbGlfMTsKKworc3RhdGljIHZvaWQgaWxwYWNrKHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgY2hhciAqc3JjWzNdLAorICAgIGludCBkc3RzdHJpZGUsIGludCBzcmNzdHJpZGVbM10sIGludCB3LCBpbnQgaCwgcGFja19mdW5jX3QgKnBhY2tbMl0pCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciAqeSwgKnUsICp2OworICAgIGludCB5cyA9IHNyY3N0cmlkZVswXSwgdXMgPSBzcmNzdHJpZGVbMV0sIHZzID0gc3Jjc3RyaWRlWzJdOworICAgIGludCBhLCBiOworCisgICAgeSA9IHNyY1swXTsKKyAgICB1ID0gc3JjWzFdOworICAgIHYgPSBzcmNbMl07CisKKyAgICBwYWNrX25uKGRzdCwgeSwgdSwgdiwgdywgMCwgMCk7CisgICAgeSArPSB5czsgZHN0ICs9IGRzdHN0cmlkZTsKKyAgICBwYWNrX25uKGRzdCwgeSwgdSt1cywgdit2cywgdywgMCwgMCk7CisgICAgeSArPSB5czsgZHN0ICs9IGRzdHN0cmlkZTsKKyAgICBmb3IgKGk9MjsgaTxoLTI7IGkrKykgeworICAgICAgICBhID0gKGkmMikgPyAxIDogLTE7CisgICAgICAgIGIgPSAoaSYxKSBeICgoaSYyKT4+MSk7CisgICAgICAgIHBhY2tbYl0oZHN0LCB5LCB1LCB2LCB3LCB1cyphLCB2cyphKTsKKyAgICAgICAgeSArPSB5czsKKyAgICAgICAgaWYgKChpJjMpID09IDEpIHsKKyAgICAgICAgICAgIHUgLT0gdXM7CisgICAgICAgICAgICB2IC09IHZzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdSArPSB1czsKKyAgICAgICAgICAgIHYgKz0gdnM7CisgICAgICAgIH0KKyAgICAgICAgZHN0ICs9IGRzdHN0cmlkZTsKKyAgICB9CisgICAgcGFja19ubihkc3QsIHksIHUsIHYsIHcsIDAsIDApOworICAgIHkgKz0geXM7IGRzdCArPSBkc3RzdHJpZGU7IHUgKz0gdXM7IHYgKz0gdnM7CisgICAgcGFja19ubihkc3QsIHksIHUsIHYsIHcsIDAsIDApOworfQorCisKK3N0YXRpYyBpbnQgcHV0X2ltYWdlKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsIG1wX2ltYWdlX3QgKm1waSwgZG91YmxlIHB0cykKK3sKKyAgICBtcF9pbWFnZV90ICpkbXBpOworCisgICAgLy8gaG9wZSB3ZSdsbCBnZXQgRFIgYnVmZmVyOgorICAgIGRtcGk9ZmZfdmZfZ2V0X2ltYWdlKHZmLT5uZXh0LCBJTUdGTVRfWVVZMiwKKyAgICAgICAgICAgICAgTVBfSU1HVFlQRV9URU1QLCBNUF9JTUdGTEFHX0FDQ0VQVF9TVFJJREUsCisgICAgICAgICAgICAgIG1waS0+dywgbXBpLT5oKTsKKworICAgIGlscGFjayhkbXBpLT5wbGFuZXNbMF0sIG1waS0+cGxhbmVzLCBkbXBpLT5zdHJpZGVbMF0sIG1waS0+c3RyaWRlLCBtcGktPncsIG1waS0+aCwgdmYtPnByaXYtPnBhY2spOworCisgICAgcmV0dXJuIGZmX3ZmX25leHRfcHV0X2ltYWdlKHZmLGRtcGksIHB0cyk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsCisgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZF93aWR0aCwgaW50IGRfaGVpZ2h0LAorICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IG91dGZtdCkKK3sKKyAgICAvKiBGSVhNRSAtIGFsc28gc3VwcG9ydCBVWVZZIG91dHB1dD8gKi8KKyAgICByZXR1cm4gZmZfdmZfbmV4dF9jb25maWcodmYsIHdpZHRoLCBoZWlnaHQsIGRfd2lkdGgsIGRfaGVpZ2h0LCBmbGFncywgSU1HRk1UX1lVWTIpOworfQorCisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0KHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsIHVuc2lnbmVkIGludCBmbXQpCit7CisgICAgLyogRklYTUUgLSByZWFsbHkgYW55IFlVViA0OjI6MCBpbnB1dCBmb3JtYXQgc2hvdWxkIHdvcmsgKi8KKyAgICBzd2l0Y2ggKGZtdCkgeworICAgIGNhc2UgSU1HRk1UX1lWMTI6CisgICAgY2FzZSBJTUdGTVRfSVlVVjoKKyAgICBjYXNlIElNR0ZNVF9JNDIwOgorICAgICAgICByZXR1cm4gZmZfdmZfbmV4dF9xdWVyeV9mb3JtYXQodmYsSU1HRk1UX1lVWTIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2Zl9vcGVuKHZmX2luc3RhbmNlX3QgKnZmLCBjaGFyICphcmdzKQoreworICAgIHZmLT5jb25maWc9Y29uZmlnOworICAgIHZmLT5xdWVyeV9mb3JtYXQ9cXVlcnlfZm9ybWF0OworICAgIHZmLT5wdXRfaW1hZ2U9cHV0X2ltYWdlOworICAgIHZmLT5wcml2ID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdmZfcHJpdl9zKSk7CisgICAgdmYtPnByaXYtPm1vZGUgPSAxOworICAgIGlmIChhcmdzKSBzc2NhbmYoYXJncywgIiVkIiwgJnZmLT5wcml2LT5tb2RlKTsKKworICAgIHBhY2tfbm4gPSBwYWNrX25uX0M7CisgICAgcGFja19saV8wID0gcGFja19saV8wX0M7CisgICAgcGFja19saV8xID0gcGFja19saV8xX0M7CisjaWYgSEFWRV9NTVhfSU5MSU5FCisgICAgaWYoZmZfZ0NwdUNhcHMuaGFzTU1YKSB7CisgICAgICAgIHBhY2tfbm4gPSBwYWNrX25uX01NWDsKKyNpZiBIQVZFX0VCWF9BVkFJTEFCTEUKKyAgICAgICAgcGFja19saV8wID0gcGFja19saV8wX01NWDsKKyAgICAgICAgcGFja19saV8xID0gcGFja19saV8xX01NWDsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorCisgICAgc3dpdGNoKHZmLT5wcml2LT5tb2RlKSB7CisgICAgY2FzZSAwOgorICAgICAgICB2Zi0+cHJpdi0+cGFja1swXSA9IHZmLT5wcml2LT5wYWNrWzFdID0gcGFja19ubjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmZfbXBfbXNnKE1TR1RfVkZJTFRFUiwgTVNHTF9XQVJOLAorICAgICAgICAgICAgImlscGFjazogdW5rbm93biBtb2RlICVkIChmYWxsYmFjayB0byBsaW5lYXIpXG4iLAorICAgICAgICAgICAgdmYtPnByaXYtPm1vZGUpOworICAgICAgICAvKiBGYWxsdGhyb3VnaCAqLworICAgIGNhc2UgMToKKyAgICAgICAgdmYtPnByaXYtPnBhY2tbMF0gPSBwYWNrX2xpXzA7CisgICAgICAgIHZmLT5wcml2LT5wYWNrWzFdID0gcGFja19saV8xOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworY29uc3QgdmZfaW5mb190IGZmX3ZmX2luZm9faWxwYWNrID0geworICAgICI0OjI6MCBwbGFuYXIgLT4gNDoyOjIgcGFja2VkIHJlaW50ZXJsYWNlciIsCisgICAgImlscGFjayIsCisgICAgIlJpY2hhcmQgRmVsa2VyIiwKKyAgICAiIiwKKyAgICB2Zl9vcGVuLAorICAgIE5VTEwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvdmZfcHA3LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvdmZfcHA3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4M2U1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy92Zl9wcDcuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE1QbGF5ZXIuCisgKgorICogTVBsYXllciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTVBsYXllciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggTVBsYXllcjsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJtcF9tc2cuaCIKKyNpbmNsdWRlICJjcHVkZXRlY3QuaCIKKworI2lmIEhBVkVfTUFMTE9DX0gKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaW5jbHVkZSAiaW1nX2Zvcm1hdC5oIgorI2luY2x1ZGUgIm1wX2ltYWdlLmgiCisjaW5jbHVkZSAidmYuaCIKKyNpbmNsdWRlICJsaWJ2by9mYXN0bWVtY3B5LmgiCisKKyNkZWZpbmUgWE1JTihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIFhNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCitERUNMQVJFX0FMSUdORUQoOCwgc3RhdGljIGNvbnN0IHVpbnQ4X3QsIGRpdGhlcilbOF1bOF0gPSB7Cit7ICAwLCAgNDgsICAxMiwgIDYwLCAgIDMsICA1MSwgIDE1LCAgNjMsIH0sCit7IDMyLCAgMTYsICA0NCwgIDI4LCAgMzUsICAxOSwgIDQ3LCAgMzEsIH0sCit7ICA4LCAgNTYsICAgNCwgIDUyLCAgMTEsICA1OSwgICA3LCAgNTUsIH0sCit7IDQwLCAgMjQsICAzNiwgIDIwLCAgNDMsICAyNywgIDM5LCAgMjMsIH0sCit7ICAyLCAgNTAsICAxNCwgIDYyLCAgIDEsICA0OSwgIDEzLCAgNjEsIH0sCit7IDM0LCAgMTgsICA0NiwgIDMwLCAgMzMsICAxNywgIDQ1LCAgMjksIH0sCit7IDEwLCAgNTgsICAgNiwgIDU0LCAgIDksICA1NywgICA1LCAgNTMsIH0sCit7IDQyLCAgMjYsICAzOCwgIDIyLCAgNDEsICAyNSwgIDM3LCAgMjEsIH0sCit9OworCitzdHJ1Y3QgdmZfcHJpdl9zIHsKKyAgICBpbnQgcXA7CisgICAgaW50IG1vZGU7CisgICAgaW50IG1wZWcyOworICAgIGludCB0ZW1wX3N0cmlkZTsKKyAgICB1aW50OF90ICpzcmM7Cit9OworI2lmIDAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY3Q3X2MoaW50MTZfdCAqZHN0LCBpbnQgczAsIGludCBzMSwgaW50IHMyLCBpbnQgczMsIGludCBzdGVwKXsKKyAgICBpbnQgcywgZDsKKyAgICBpbnQgZHN0Mls2NF07CisvLyNkZWZpbmUgUzAgKDEwMjQvMC4zNzc5NjQ0NzMwMDkyMjcxOTc1OSkKKyNkZWZpbmUgQzAgKChpbnQpKDEwMjQqMC4zNzc5NjQ0NzMwMDkyMjcxOTc1OSswLjUpKSAvL3NxcnQoMS83KQorI2RlZmluZSBDMSAoKGludCkoMTAyNCowLjUzNDUyMjQ4MzgyNDg0ODc5MzA4LzYrMC41KSkgLy9zcXJ0KDIvNykvNgorCisjZGVmaW5lIEMyICgoaW50KSgxMDI0KjAuNDUyMjExNzU5ODUwMzQ3NDUwMDQvMiswLjUpKQorI2RlZmluZSBDMyAoKGludCkoMTAyNCowLjM2MjY0NTY3NDc5ODcwODc5NDc0LzIrMC41KSkKKworLy8wLjE5NjI1MDUxODI0MTI5NDE5MTggMC4wMTQ5Mjc2ODA4NDE5Mzk3OTQ0LTAuMjExMTc4MTk5MDgzMjMzOTU4NAorI2RlZmluZSBDNCAoKGludCkoMTAyNCowLjE5NjI1MDUxODI0MTI5NDE5MTgrMC41KSkKKyNkZWZpbmUgQzUgKChpbnQpKDEwMjQqMC4wMTQ5Mjc2ODA4NDE5Mzk3OTQ0KzAuNSkpCisvLyNkZWZpbmUgQzYgKChpbnQpKDEwMjQqMC4yMTExNzgxOTkwODMyMzM5NTg0KzAuNSkpCisjaWYgMAorICAgIHM9IHMwICsgczEgKyBzMjsKKyAgICBkc3RbMCpzdGVwXSA9ICgocyArIHMzKSpDMCArIDUxMikgPj4gMTA7CisgICAgcz0gKHMgLSA2KnMzKSpDMSArIDUxMjsKKyAgICBkPSAoczAtczIpKkM0ICsgKHMxLXMyKSpDNTsKKyAgICBkc3RbMSpzdGVwXSA9IChzICsgMipkKT4+MTA7CisgICAgcyAtPSBkOworICAgIGQ9IChzMS1zMCkqQzIgKyAoczEtczIpKkMzOworICAgIGRzdFsyKnN0ZXBdID0gKHMgKyBkKT4+MTA7CisgICAgZHN0WzMqc3RlcF0gPSAocyAtIGQpPj4xMDsKKyNlbGlmIDEKKyAgICBzID0gczMrczM7CisgICAgczM9IHMtczA7CisgICAgczA9IHMrczA7CisgICAgcyA9IHMyK3MxOworICAgIHMyPSBzMi1zMTsKKyAgICBkc3RbMCpzdGVwXT0gczAgKyBzOworICAgIGRzdFsyKnN0ZXBdPSBzMCAtIHM7CisgICAgZHN0WzEqc3RlcF09IDIqczMgKyAgIHMyOworICAgIGRzdFszKnN0ZXBdPSAgIHMzIC0gMipzMjsKKyNlbHNlCisgICAgaW50IGksaixuPTc7CisgICAgZm9yKGk9MDsgaTw3OyBpKz0yKXsKKyAgICAgICAgZHN0MltpKnN0ZXAvMl09IDA7CisgICAgICAgIGZvcihqPTA7IGo8NDsgaisrKQorICAgICAgICAgICAgZHN0MltpKnN0ZXAvMl0gKz0gc3JjW2oqc3RlcF0gKiBjb3MoaSpNX1BJL24qKGorMC41KSkgKiBzcXJ0KChpPzIuMDoxLjApL24pOworICAgICAgICBpZihmYWJzKGRzdDJbaSpzdGVwLzJdIC0gZHN0W2kqc3RlcC8yXSkgPiAyMCkKKyAgICAgICAgICAgIHByaW50ZigiJWQgJWQgJWQgKCVkICVkICVkICVkKSAtPiAoJWQgJWQgJWQgJWQpXG4iLCBpLGRzdDJbaSpzdGVwLzJdLCBkc3RbaSpzdGVwLzJdLHNyY1swKnN0ZXBdLCBzcmNbMSpzdGVwXSwgc3JjWzIqc3RlcF0sIHNyY1szKnN0ZXBdLCBkc3RbMCpzdGVwXSwgZHN0WzEqc3RlcF0sZHN0WzIqc3RlcF0sZHN0WzMqc3RlcF0pOworICAgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY3RBX2MoaW50MTZfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUpeworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTw0OyBpKyspeworICAgICAgICBpbnQgczA9ICBzcmNbMCpzdHJpZGVdICsgc3JjWzYqc3RyaWRlXTsKKyAgICAgICAgaW50IHMxPSAgc3JjWzEqc3RyaWRlXSArIHNyY1s1KnN0cmlkZV07CisgICAgICAgIGludCBzMj0gIHNyY1syKnN0cmlkZV0gKyBzcmNbNCpzdHJpZGVdOworICAgICAgICBpbnQgczM9ICBzcmNbMypzdHJpZGVdOworICAgICAgICBpbnQgcz0gczMrczM7CisgICAgICAgIHMzPSBzLXMwOworICAgICAgICBzMD0gcytzMDsKKyAgICAgICAgcyA9IHMyK3MxOworICAgICAgICBzMj0gczItczE7CisgICAgICAgIGRzdFswXT0gczAgKyBzOworICAgICAgICBkc3RbMl09IHMwIC0gczsKKyAgICAgICAgZHN0WzFdPSAyKnMzICsgICBzMjsKKyAgICAgICAgZHN0WzNdPSAgIHMzIC0gMipzMjsKKyAgICAgICAgc3JjKys7CisgICAgICAgIGRzdCs9NDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjdEJfYyhpbnQxNl90ICpkc3QsIGludDE2X3QgKnNyYyl7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7CisgICAgICAgIGludCBzMD0gIHNyY1swKjRdICsgc3JjWzYqNF07CisgICAgICAgIGludCBzMT0gIHNyY1sxKjRdICsgc3JjWzUqNF07CisgICAgICAgIGludCBzMj0gIHNyY1syKjRdICsgc3JjWzQqNF07CisgICAgICAgIGludCBzMz0gIHNyY1szKjRdOworICAgICAgICBpbnQgcz0gczMrczM7CisgICAgICAgIHMzPSBzLXMwOworICAgICAgICBzMD0gcytzMDsKKyAgICAgICAgcyA9IHMyK3MxOworICAgICAgICBzMj0gczItczE7CisgICAgICAgIGRzdFswKjRdPSBzMCArIHM7CisgICAgICAgIGRzdFsyKjRdPSBzMCAtIHM7CisgICAgICAgIGRzdFsxKjRdPSAyKnMzICsgICBzMjsKKyAgICAgICAgZHN0WzMqNF09ICAgczMgLSAyKnMyOworICAgICAgICBzcmMrKzsKKyAgICAgICAgZHN0Kys7CisgICAgfQorfQorCisjaWYgSEFWRV9NTVhfSU5MSU5FCitzdGF0aWMgdm9pZCBkY3RCX21teChpbnQxNl90ICpkc3QsIGludDE2X3QgKnNyYyl7CisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJtb3ZxICAoJTApLCAlJW1tMCAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAxKjQqMiglMCksICUlbW0xIFxuXHQiCisgICAgICAgICJwYWRkdyA2KjQqMiglMCksICUlbW0wIFxuXHQiCisgICAgICAgICJwYWRkdyA1KjQqMiglMCksICUlbW0xIFxuXHQiCisgICAgICAgICJtb3ZxICAyKjQqMiglMCksICUlbW0yIFxuXHQiCisgICAgICAgICJtb3ZxICAzKjQqMiglMCksICUlbW0zIFxuXHQiCisgICAgICAgICJwYWRkdyA0KjQqMiglMCksICUlbW0yIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTMgICAgIFxuXHQiIC8vcworICAgICAgICAibW92cSAlJW1tMywgJSVtbTQgICAgICBcblx0IiAvL3MKKyAgICAgICAgInBzdWJ3ICUlbW0wLCAlJW1tMyAgICAgXG5cdCIgLy9zLXMwCisgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTQgICAgIFxuXHQiIC8vcytzMAorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTAgICAgICBcblx0IiAvL3MyCisgICAgICAgICJwc3VidyAlJW1tMSwgJSVtbTIgICAgIFxuXHQiIC8vczItczEKKyAgICAgICAgInBhZGR3ICUlbW0xLCAlJW1tMCAgICAgXG5cdCIgLy9zMitzMQorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTEgICAgICBcblx0IiAvL3MwJworICAgICAgICAicHN1YncgJSVtbTAsICUlbW00ICAgICBcblx0IiAvL3MwJy1zJworICAgICAgICAicGFkZHcgJSVtbTAsICUlbW0xICAgICBcblx0IiAvL3MwJytzJworICAgICAgICAibW92cSAlJW1tMywgJSVtbTAgICAgICBcblx0IiAvL3MzJworICAgICAgICAicHN1YncgJSVtbTIsICUlbW0zICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTIsICUlbW0zICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTAsICUlbW0yICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTAsICUlbW0yICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMSwgKCUxKSAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNCwgMio0KjIoJTEpICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgMSo0KjIoJTEpICBcblx0IgorICAgICAgICAibW92cSAlJW1tMywgMyo0KjIoJTEpICBcblx0IgorICAgICAgICA6OiAiciIgKHNyYyksICJyIihkc3QpCisgICAgKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCAoKmRjdEIpKGludDE2X3QgKmRzdCwgaW50MTZfdCAqc3JjKT0gZGN0Ql9jOworCisjZGVmaW5lIE4wIDQKKyNkZWZpbmUgTjEgNQorI2RlZmluZSBOMiAxMAorI2RlZmluZSBTTjAgMgorI2RlZmluZSBTTjEgMi4yMzYwNjc5Nzc1CisjZGVmaW5lIFNOMiAzLjE2MjI3NzY2MDE3CisjZGVmaW5lIE4gKDE8PDE2KQorCitzdGF0aWMgY29uc3QgaW50IGZhY3RvclsxNl09eworICAgIE4vKE4wKk4wKSwgTi8oTjAqTjEpLCBOLyhOMCpOMCksTi8oTjAqTjIpLAorICAgIE4vKE4xKk4wKSwgTi8oTjEqTjEpLCBOLyhOMSpOMCksTi8oTjEqTjIpLAorICAgIE4vKE4wKk4wKSwgTi8oTjAqTjEpLCBOLyhOMCpOMCksTi8oTjAqTjIpLAorICAgIE4vKE4yKk4wKSwgTi8oTjIqTjEpLCBOLyhOMipOMCksTi8oTjIqTjIpLAorfTsKKworc3RhdGljIGNvbnN0IGludCB0aHJlc1sxNl09eworICAgIE4vKFNOMCpTTjApLCBOLyhTTjAqU04yKSwgTi8oU04wKlNOMCksTi8oU04wKlNOMiksCisgICAgTi8oU04yKlNOMCksIE4vKFNOMipTTjIpLCBOLyhTTjIqU04wKSxOLyhTTjIqU04yKSwKKyAgICBOLyhTTjAqU04wKSwgTi8oU04wKlNOMiksIE4vKFNOMCpTTjApLE4vKFNOMCpTTjIpLAorICAgIE4vKFNOMipTTjApLCBOLyhTTjIqU04yKSwgTi8oU04yKlNOMCksTi8oU04yKlNOMiksCit9OworCitzdGF0aWMgaW50IHRocmVzMls5OV1bMTZdOworCitzdGF0aWMgdm9pZCBpbml0X3RocmVzMih2b2lkKXsKKyAgICBpbnQgcXAsIGk7CisgICAgaW50IGJpYXM9IDA7IC8vRklYTUUKKworICAgIGZvcihxcD0wOyBxcDw5OTsgcXArKyl7CisgICAgICAgIGZvcihpPTA7IGk8MTY7IGkrKyl7CisgICAgICAgICAgICB0aHJlczJbcXBdW2ldPSAoKGkmMSk/U04yOlNOMCkgKiAoKGkmNCk/U04yOlNOMCkgKiBYTUFYKDEscXApICogKDE8PDIpIC0gMSAtIGJpYXM7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaGFyZHRocmVzaF9jKGludDE2X3QgKnNyYywgaW50IHFwKXsKKyAgICBpbnQgaTsKKyAgICBpbnQgYTsKKworICAgIGE9IHNyY1swXSAqIGZhY3RvclswXTsKKyAgICBmb3IoaT0xOyBpPDE2OyBpKyspeworICAgICAgICB1bnNpZ25lZCBpbnQgdGhyZXNob2xkMT0gdGhyZXMyW3FwXVtpXTsKKyAgICAgICAgdW5zaWduZWQgaW50IHRocmVzaG9sZDI9ICh0aHJlc2hvbGQxPDwxKTsKKyAgICAgICAgaW50IGxldmVsPSBzcmNbaV07CisgICAgICAgIGlmKCgodW5zaWduZWQpKGxldmVsK3RocmVzaG9sZDEpKT50aHJlc2hvbGQyKXsKKyAgICAgICAgICAgIGEgKz0gbGV2ZWwgKiBmYWN0b3JbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChhICsgKDE8PDExKSk+PjEyOworfQorCitzdGF0aWMgaW50IG1lZGl1bXRocmVzaF9jKGludDE2X3QgKnNyYywgaW50IHFwKXsKKyAgICBpbnQgaTsKKyAgICBpbnQgYTsKKworICAgIGE9IHNyY1swXSAqIGZhY3RvclswXTsKKyAgICBmb3IoaT0xOyBpPDE2OyBpKyspeworICAgICAgICB1bnNpZ25lZCBpbnQgdGhyZXNob2xkMT0gdGhyZXMyW3FwXVtpXTsKKyAgICAgICAgdW5zaWduZWQgaW50IHRocmVzaG9sZDI9ICh0aHJlc2hvbGQxPDwxKTsKKyAgICAgICAgaW50IGxldmVsPSBzcmNbaV07CisgICAgICAgIGlmKCgodW5zaWduZWQpKGxldmVsK3RocmVzaG9sZDEpKT50aHJlc2hvbGQyKXsKKyAgICAgICAgICAgIGlmKCgodW5zaWduZWQpKGxldmVsKzIqdGhyZXNob2xkMSkpPjIqdGhyZXNob2xkMil7CisgICAgICAgICAgICAgICAgYSArPSBsZXZlbCAqIGZhY3RvcltpXTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKGxldmVsPjApIGErPSAyKihsZXZlbCAtIChpbnQpdGhyZXNob2xkMSkqZmFjdG9yW2ldOworICAgICAgICAgICAgICAgIGVsc2UgICAgICAgIGErPSAyKihsZXZlbCArIChpbnQpdGhyZXNob2xkMSkqZmFjdG9yW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoYSArICgxPDwxMSkpPj4xMjsKK30KKworc3RhdGljIGludCBzb2Z0dGhyZXNoX2MoaW50MTZfdCAqc3JjLCBpbnQgcXApeworICAgIGludCBpOworICAgIGludCBhOworCisgICAgYT0gc3JjWzBdICogZmFjdG9yWzBdOworICAgIGZvcihpPTE7IGk8MTY7IGkrKyl7CisgICAgICAgIHVuc2lnbmVkIGludCB0aHJlc2hvbGQxPSB0aHJlczJbcXBdW2ldOworICAgICAgICB1bnNpZ25lZCBpbnQgdGhyZXNob2xkMj0gKHRocmVzaG9sZDE8PDEpOworICAgICAgICBpbnQgbGV2ZWw9IHNyY1tpXTsKKyAgICAgICAgaWYoKCh1bnNpZ25lZCkobGV2ZWwrdGhyZXNob2xkMSkpPnRocmVzaG9sZDIpeworICAgICAgICAgICAgaWYobGV2ZWw+MCkgYSs9IChsZXZlbCAtIChpbnQpdGhyZXNob2xkMSkqZmFjdG9yW2ldOworICAgICAgICAgICAgZWxzZSAgICAgICAgYSs9IChsZXZlbCArIChpbnQpdGhyZXNob2xkMSkqZmFjdG9yW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoYSArICgxPDwxMSkpPj4xMjsKK30KKworc3RhdGljIGludCAoKnJlcXVhbnRpemUpKGludDE2X3QgKnNyYywgaW50IHFwKT0gaGFyZHRocmVzaF9jOworCitzdGF0aWMgdm9pZCBmaWx0ZXIoc3RydWN0IHZmX3ByaXZfcyAqcCwgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBkc3Rfc3RyaWRlLCBpbnQgc3JjX3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCB1aW50OF90ICpxcF9zdG9yZSwgaW50IHFwX3N0cmlkZSwgaW50IGlzX2x1bWEpeworICAgIGludCB4LCB5OworICAgIGNvbnN0IGludCBzdHJpZGU9IGlzX2x1bWEgPyBwLT50ZW1wX3N0cmlkZSA6ICgod2lkdGgrMTYrMTUpJih+MTUpKTsKKyAgICB1aW50OF90ICAqcF9zcmM9IHAtPnNyYyArIDgqc3RyaWRlOworICAgIGludDE2X3QgKmJsb2NrPSAoaW50MTZfdCAqKXAtPnNyYzsKKyAgICBpbnQxNl90ICp0ZW1wPSAoaW50MTZfdCAqKShwLT5zcmMgKyAzMik7CisKKyAgICBpZiAoIXNyYyB8fCAhZHN0KSByZXR1cm47IC8vIEhBQ0sgYXZvaWQgY3Jhc2ggZm9yIFk4IGNvbG91cnNwYWNlCisgICAgZm9yKHk9MDsgeTxoZWlnaHQ7IHkrKyl7CisgICAgICAgIGludCBpbmRleD0gOCArIDgqc3RyaWRlICsgeSpzdHJpZGU7CisgICAgICAgIGZhc3RfbWVtY3B5KHBfc3JjICsgaW5kZXgsIHNyYyArIHkqc3JjX3N0cmlkZSwgd2lkdGgpOworICAgICAgICBmb3IoeD0wOyB4PDg7IHgrKyl7CisgICAgICAgICAgICBwX3NyY1tpbmRleCAgICAgICAgIC0geCAtIDFdPSBwX3NyY1tpbmRleCArICAgICAgICAgeCAgICBdOworICAgICAgICAgICAgcF9zcmNbaW5kZXggKyB3aWR0aCArIHggICAgXT0gcF9zcmNbaW5kZXggKyB3aWR0aCAtIHggLSAxXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IoeT0wOyB5PDg7IHkrKyl7CisgICAgICAgIGZhc3RfbWVtY3B5KHBfc3JjICsgKCAgICAgICA3LXkpKnN0cmlkZSwgcF9zcmMgKyAoICAgICAgIHkrOCkqc3RyaWRlLCBzdHJpZGUpOworICAgICAgICBmYXN0X21lbWNweShwX3NyYyArIChoZWlnaHQrOCt5KSpzdHJpZGUsIHBfc3JjICsgKGhlaWdodC15KzcpKnN0cmlkZSwgc3RyaWRlKTsKKyAgICB9CisgICAgLy9GSVhNRSAodHJ5IGVkZ2UgZW11KQorCisgICAgZm9yKHk9MDsgeTxoZWlnaHQ7IHkrKyl7CisgICAgICAgIGZvcih4PS04OyB4PDA7IHgrPTQpeworICAgICAgICAgICAgY29uc3QgaW50IGluZGV4PSB4ICsgeSpzdHJpZGUgKyAoOC0zKSooMStzdHJpZGUpICsgODsgLy9GSVhNRSBzaWxseSBvZmZzZXQKKyAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAgPSBwX3NyYyArIGluZGV4OworICAgICAgICAgICAgaW50MTZfdCAqdHA9IHRlbXArNCp4OworCisgICAgICAgICAgICBkY3RBX2ModHArNCo4LCBzcmMsIHN0cmlkZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yKHg9MDsgeDx3aWR0aDsgKXsKKyAgICAgICAgICAgIGNvbnN0IGludCBxcHM9IDMgKyBpc19sdW1hOworICAgICAgICAgICAgaW50IHFwOworICAgICAgICAgICAgaW50IGVuZD0gWE1JTih4KzgsIHdpZHRoKTsKKworICAgICAgICAgICAgaWYocC0+cXApCisgICAgICAgICAgICAgICAgcXA9IHAtPnFwOworICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBxcD0gcXBfc3RvcmVbIChYTUlOKHgsIHdpZHRoLTEpPj5xcHMpICsgKFhNSU4oeSwgaGVpZ2h0LTEpPj5xcHMpICogcXBfc3RyaWRlXTsKKyAgICAgICAgICAgICAgICBxcD1ub3JtX3FzY2FsZShxcCwgcC0+bXBlZzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKDsgeDxlbmQ7IHgrKyl7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGluZGV4PSB4ICsgeSpzdHJpZGUgKyAoOC0zKSooMStzdHJpZGUpICsgODsgLy9GSVhNRSBzaWxseSBvZmZzZXQKKyAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMgID0gcF9zcmMgKyBpbmRleDsKKyAgICAgICAgICAgICAgICBpbnQxNl90ICp0cD0gdGVtcCs0Kng7CisgICAgICAgICAgICAgICAgaW50IHY7CisKKyAgICAgICAgICAgICAgICBpZigoeCYzKT09MCkKKyAgICAgICAgICAgICAgICAgICAgZGN0QV9jKHRwKzQqOCwgc3JjLCBzdHJpZGUpOworCisgICAgICAgICAgICAgICAgZGN0QihibG9jaywgdHApOworCisgICAgICAgICAgICAgICAgdj0gcmVxdWFudGl6ZShibG9jaywgcXApOworICAgICAgICAgICAgICAgIHY9ICh2ICsgZGl0aGVyW3kmN11beCY3XSk+PjY7CisgICAgICAgICAgICAgICAgaWYoKHVuc2lnbmVkKXYgPiAyNTUpCisgICAgICAgICAgICAgICAgICAgIHY9ICgtdik+PjMxOworICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpkc3Rfc3RyaWRlXT0gdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBjb25maWcoc3RydWN0IHZmX2luc3RhbmNlICp2ZiwKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkX3dpZHRoLCBpbnQgZF9oZWlnaHQsCisgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgb3V0Zm10KXsKKyAgICBpbnQgaD0gKGhlaWdodCsxNisxNSkmKH4xNSk7CisKKyAgICB2Zi0+cHJpdi0+dGVtcF9zdHJpZGU9ICh3aWR0aCsxNisxNSkmKH4xNSk7CisgICAgdmYtPnByaXYtPnNyYyA9IGF2X21hbGxvYyh2Zi0+cHJpdi0+dGVtcF9zdHJpZGUqKGgrOCkqc2l6ZW9mKHVpbnQ4X3QpKTsKKworICAgIHJldHVybiBmZl92Zl9uZXh0X2NvbmZpZyh2Zix3aWR0aCxoZWlnaHQsZF93aWR0aCxkX2hlaWdodCxmbGFncyxvdXRmbXQpOworfQorCitzdGF0aWMgdm9pZCBnZXRfaW1hZ2Uoc3RydWN0IHZmX2luc3RhbmNlICp2ZiwgbXBfaW1hZ2VfdCAqbXBpKXsKKyAgICBpZihtcGktPmZsYWdzJk1QX0lNR0ZMQUdfUFJFU0VSVkUpIHJldHVybjsgLy8gZG9uJ3QgY2hhbmdlCisgICAgLy8gb2ssIHdlIGNhbiBkbyBwcCBpbi1wbGFjZSAob3IgcHAgZGlzYWJsZWQpOgorICAgIHZmLT5kbXBpPWZmX3ZmX2dldF9pbWFnZSh2Zi0+bmV4dCxtcGktPmltZ2ZtdCwKKyAgICAgICAgbXBpLT50eXBlLCBtcGktPmZsYWdzIHwgTVBfSU1HRkxBR19SRUFEQUJMRSwgbXBpLT53aWR0aCwgbXBpLT5oZWlnaHQpOworICAgIG1waS0+cGxhbmVzWzBdPXZmLT5kbXBpLT5wbGFuZXNbMF07CisgICAgbXBpLT5zdHJpZGVbMF09dmYtPmRtcGktPnN0cmlkZVswXTsKKyAgICBtcGktPndpZHRoPXZmLT5kbXBpLT53aWR0aDsKKyAgICBpZihtcGktPmZsYWdzJk1QX0lNR0ZMQUdfUExBTkFSKXsKKyAgICAgICAgbXBpLT5wbGFuZXNbMV09dmYtPmRtcGktPnBsYW5lc1sxXTsKKyAgICAgICAgbXBpLT5wbGFuZXNbMl09dmYtPmRtcGktPnBsYW5lc1syXTsKKyAgICAgICAgbXBpLT5zdHJpZGVbMV09dmYtPmRtcGktPnN0cmlkZVsxXTsKKyAgICAgICAgbXBpLT5zdHJpZGVbMl09dmYtPmRtcGktPnN0cmlkZVsyXTsKKyAgICB9CisgICAgbXBpLT5mbGFnc3w9TVBfSU1HRkxBR19ESVJFQ1Q7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2ltYWdlKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsIG1wX2ltYWdlX3QgKm1waSwgZG91YmxlIHB0cyl7CisgICAgbXBfaW1hZ2VfdCAqZG1waTsKKworICAgIGlmKG1waS0+ZmxhZ3MmTVBfSU1HRkxBR19ESVJFQ1QpeworICAgICAgICBkbXBpPXZmLT5kbXBpOworICAgIH1lbHNleworICAgICAgICAvLyBubyBEUiwgc28gZ2V0IGEgbmV3IGltYWdlISBob3BlIHdlJ2xsIGdldCBEUiBidWZmZXI6CisgICAgICAgIGRtcGk9ZmZfdmZfZ2V0X2ltYWdlKHZmLT5uZXh0LG1waS0+aW1nZm10LAorICAgICAgICAgICAgTVBfSU1HVFlQRV9URU1QLAorICAgICAgICAgICAgTVBfSU1HRkxBR19BQ0NFUFRfU1RSSURFfE1QX0lNR0ZMQUdfUFJFRkVSX0FMSUdORURfU1RSSURFLAorICAgICAgICAgICAgbXBpLT53aWR0aCxtcGktPmhlaWdodCk7CisgICAgICAgIGZmX3ZmX2Nsb25lX21waV9hdHRyaWJ1dGVzKGRtcGksIG1waSk7CisgICAgfQorCisgICAgdmYtPnByaXYtPm1wZWcyPSBtcGktPnFzY2FsZV90eXBlOworICAgIGlmKG1waS0+cXNjYWxlIHx8IHZmLT5wcml2LT5xcCl7CisgICAgICAgIGZpbHRlcih2Zi0+cHJpdiwgZG1waS0+cGxhbmVzWzBdLCBtcGktPnBsYW5lc1swXSwgZG1waS0+c3RyaWRlWzBdLCBtcGktPnN0cmlkZVswXSwgbXBpLT53LCBtcGktPmgsIG1waS0+cXNjYWxlLCBtcGktPnFzdHJpZGUsIDEpOworICAgICAgICBmaWx0ZXIodmYtPnByaXYsIGRtcGktPnBsYW5lc1sxXSwgbXBpLT5wbGFuZXNbMV0sIGRtcGktPnN0cmlkZVsxXSwgbXBpLT5zdHJpZGVbMV0sIG1waS0+dz4+bXBpLT5jaHJvbWFfeF9zaGlmdCwgbXBpLT5oPj5tcGktPmNocm9tYV95X3NoaWZ0LCBtcGktPnFzY2FsZSwgbXBpLT5xc3RyaWRlLCAwKTsKKyAgICAgICAgZmlsdGVyKHZmLT5wcml2LCBkbXBpLT5wbGFuZXNbMl0sIG1waS0+cGxhbmVzWzJdLCBkbXBpLT5zdHJpZGVbMl0sIG1waS0+c3RyaWRlWzJdLCBtcGktPnc+Pm1waS0+Y2hyb21hX3hfc2hpZnQsIG1waS0+aD4+bXBpLT5jaHJvbWFfeV9zaGlmdCwgbXBpLT5xc2NhbGUsIG1waS0+cXN0cmlkZSwgMCk7CisgICAgfWVsc2V7CisgICAgICAgIG1lbWNweV9waWMoZG1waS0+cGxhbmVzWzBdLCBtcGktPnBsYW5lc1swXSwgbXBpLT53LCBtcGktPmgsIGRtcGktPnN0cmlkZVswXSwgbXBpLT5zdHJpZGVbMF0pOworICAgICAgICBtZW1jcHlfcGljKGRtcGktPnBsYW5lc1sxXSwgbXBpLT5wbGFuZXNbMV0sIG1waS0+dz4+bXBpLT5jaHJvbWFfeF9zaGlmdCwgbXBpLT5oPj5tcGktPmNocm9tYV95X3NoaWZ0LCBkbXBpLT5zdHJpZGVbMV0sIG1waS0+c3RyaWRlWzFdKTsKKyAgICAgICAgbWVtY3B5X3BpYyhkbXBpLT5wbGFuZXNbMl0sIG1waS0+cGxhbmVzWzJdLCBtcGktPnc+Pm1waS0+Y2hyb21hX3hfc2hpZnQsIG1waS0+aD4+bXBpLT5jaHJvbWFfeV9zaGlmdCwgZG1waS0+c3RyaWRlWzJdLCBtcGktPnN0cmlkZVsyXSk7CisgICAgfQorCisjaWYgSEFWRV9NTVhfSU5MSU5FCisgICAgaWYoZmZfZ0NwdUNhcHMuaGFzTU1YKSBfX2FzbV9fIHZvbGF0aWxlICgiZW1tc1xuXHQiKTsKKyNlbmRpZgorI2lmIEhBVkVfTU1YRVhUX0lOTElORQorICAgIGlmKGZmX2dDcHVDYXBzLmhhc01NWDIpIF9fYXNtX18gdm9sYXRpbGUgKCJzZmVuY2Vcblx0Iik7CisjZW5kaWYKKworICAgIHJldHVybiBmZl92Zl9uZXh0X3B1dF9pbWFnZSh2ZixkbXBpLCBwdHMpOworfQorCitzdGF0aWMgdm9pZCB1bmluaXQoc3RydWN0IHZmX2luc3RhbmNlICp2Zil7CisgICAgaWYoIXZmLT5wcml2KSByZXR1cm47CisKKyAgICBhdl9mcmVlKHZmLT5wcml2LT5zcmMpOworICAgIHZmLT5wcml2LT5zcmM9IE5VTEw7CisKKyAgICBmcmVlKHZmLT5wcml2KTsKKyAgICB2Zi0+cHJpdj1OVUxMOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdChzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLCB1bnNpZ25lZCBpbnQgZm10KXsKKyAgICBzd2l0Y2goZm10KXsKKyAgICBjYXNlIElNR0ZNVF9ZVlU5OgorICAgIGNhc2UgSU1HRk1UX0lGMDk6CisgICAgY2FzZSBJTUdGTVRfWVYxMjoKKyAgICBjYXNlIElNR0ZNVF9JNDIwOgorICAgIGNhc2UgSU1HRk1UX0lZVVY6CisgICAgY2FzZSBJTUdGTVRfQ0xQTDoKKyAgICBjYXNlIElNR0ZNVF9ZODAwOgorICAgIGNhc2UgSU1HRk1UX1k4OgorICAgIGNhc2UgSU1HRk1UXzQ0NFA6CisgICAgY2FzZSBJTUdGTVRfNDIyUDoKKyAgICBjYXNlIElNR0ZNVF80MTFQOgorICAgICAgICByZXR1cm4gZmZfdmZfbmV4dF9xdWVyeV9mb3JtYXQodmYsZm10KTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29udHJvbChzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLCBpbnQgcmVxdWVzdCwgdm9pZCogZGF0YSl7CisgICAgcmV0dXJuIGZmX3ZmX25leHRfY29udHJvbCh2ZixyZXF1ZXN0LGRhdGEpOworfQorCitzdGF0aWMgaW50IHZmX29wZW4odmZfaW5zdGFuY2VfdCAqdmYsIGNoYXIgKmFyZ3MpeworICAgIHZmLT5jb25maWc9Y29uZmlnOworICAgIHZmLT5wdXRfaW1hZ2U9cHV0X2ltYWdlOworICAgIHZmLT5nZXRfaW1hZ2U9Z2V0X2ltYWdlOworICAgIHZmLT5xdWVyeV9mb3JtYXQ9cXVlcnlfZm9ybWF0OworICAgIHZmLT51bmluaXQ9dW5pbml0OworICAgIHZmLT5jb250cm9sPSBjb250cm9sOworICAgIHZmLT5wcml2PW1hbGxvYyhzaXplb2Yoc3RydWN0IHZmX3ByaXZfcykpOworICAgIG1lbXNldCh2Zi0+cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCB2Zl9wcml2X3MpKTsKKworICAgIGlmIChhcmdzKSBzc2NhbmYoYXJncywgIiVkOiVkIiwgJnZmLT5wcml2LT5xcCwgJnZmLT5wcml2LT5tb2RlKTsKKworICAgIGlmKHZmLT5wcml2LT5xcCA8IDApCisgICAgICAgIHZmLT5wcml2LT5xcCA9IDA7CisKKyAgICBpbml0X3RocmVzMigpOworCisgICAgc3dpdGNoKHZmLT5wcml2LT5tb2RlKXsKKyAgICAgICAgY2FzZSAwOiByZXF1YW50aXplPSBoYXJkdGhyZXNoX2M7IGJyZWFrOworICAgICAgICBjYXNlIDE6IHJlcXVhbnRpemU9IHNvZnR0aHJlc2hfYzsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgMjogcmVxdWFudGl6ZT0gbWVkaXVtdGhyZXNoX2M7IGJyZWFrOworICAgIH0KKworI2lmIEhBVkVfTU1YX0lOTElORQorICAgIGlmKGZmX2dDcHVDYXBzLmhhc01NWCl7CisgICAgICAgIGRjdEI9IGRjdEJfbW14OworICAgIH0KKyNlbmRpZgorI2lmIDAKKyAgICBpZihmZl9nQ3B1Q2Fwcy5oYXNNTVgpeworICAgICAgICBzd2l0Y2godmYtPnByaXYtPm1vZGUpeworICAgICAgICAgICAgY2FzZSAwOiByZXF1YW50aXplPSBoYXJkdGhyZXNoX21teDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IHJlcXVhbnRpemU9IHNvZnR0aHJlc2hfbW14OyBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDE7Cit9CisKK2NvbnN0IHZmX2luZm9fdCBmZl92Zl9pbmZvX3BwNyA9IHsKKyAgICAicG9zdHByb2Nlc3MgNyIsCisgICAgInBwNyIsCisgICAgIk1pY2hhZWwgTmllZGVybWF5ZXIiLAorICAgICIiLAorICAgIHZmX29wZW4sCisgICAgTlVMTAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy92Zl9zb2Z0cHVsbGRvd24uYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy92Zl9zb2Z0cHVsbGRvd24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTYzNzRlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL2xpYm1wY29kZWNzL3ZmX3NvZnRwdWxsZG93bi5jCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTVBsYXllci4KKyAqCisgKiBNUGxheWVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBNUGxheWVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBNUGxheWVyOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibXBfbXNnLmgiCisKKyNpbmNsdWRlICJpbWdfZm9ybWF0LmgiCisjaW5jbHVkZSAibXBfaW1hZ2UuaCIKKyNpbmNsdWRlICJ2Zi5oIgorCisjaW5jbHVkZSAibGlidm8vZmFzdG1lbWNweS5oIgorCitzdHJ1Y3QgdmZfcHJpdl9zIHsKKyAgICBpbnQgc3RhdGU7CisgICAgbG9uZyBsb25nIGluOworICAgIGxvbmcgbG9uZyBvdXQ7Cit9OworCitzdGF0aWMgaW50IHB1dF9pbWFnZShzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLCBtcF9pbWFnZV90ICptcGksIGRvdWJsZSBwdHMpCit7CisgICAgbXBfaW1hZ2VfdCAqZG1waTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgZmxhZ3MgPSBtcGktPmZpZWxkczsKKyAgICBpbnQgc3RhdGUgPSB2Zi0+cHJpdi0+c3RhdGU7CisKKyAgICBkbXBpID0gZmZfdmZfZ2V0X2ltYWdlKHZmLT5uZXh0LCBtcGktPmltZ2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1QX0lNR1RZUEVfU1RBVElDLCBNUF9JTUdGTEFHX0FDQ0VQVF9TVFJJREUgfAorICAgICAgICAgICAgICAgICAgICAgICAgTVBfSU1HRkxBR19QUkVTRVJWRSwgbXBpLT53aWR0aCwgbXBpLT5oZWlnaHQpOworCisgICAgdmYtPnByaXYtPmluKys7CisKKyAgICBpZiAoKHN0YXRlID09IDAgJiYKKyAgICAgICAgICEoZmxhZ3MgJiBNUF9JTUdGSUVMRF9UT1BfRklSU1QpKSB8fAorICAgICAgICAoc3RhdGUgPT0gMSAmJgorICAgICAgICAgZmxhZ3MgJiBNUF9JTUdGSUVMRF9UT1BfRklSU1QpKSB7CisgICAgICAgIGZmX21wX21zZyhNU0dUX1ZGSUxURVIsIE1TR0xfV0FSTiwKKyAgICAgICAgICAgICAgICJzb2Z0cHVsbGRvd246IFVuZXhwZWN0ZWQgZmllbGQgZmxhZ3M6IHN0YXRlPSVkIHRvcF9maWVsZF9maXJzdD0lZCByZXBlYXRfZmlyc3RfZmllbGQ9JWRcbiIsCisgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgIChmbGFncyAmIE1QX0lNR0ZJRUxEX1RPUF9GSVJTVCkgIT0gMCwKKyAgICAgICAgICAgICAgIChmbGFncyAmIE1QX0lNR0ZJRUxEX1JFUEVBVF9GSVJTVCkgIT0gMCk7CisgICAgICAgIHN0YXRlIF49IDE7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IDApIHsKKyAgICAgICAgcmV0ID0gZmZfdmZfbmV4dF9wdXRfaW1hZ2UodmYsIG1waSwgTVBfTk9QVFNfVkFMVUUpOworICAgICAgICB2Zi0+cHJpdi0+b3V0Kys7CisgICAgICAgIGlmIChmbGFncyAmIE1QX0lNR0ZJRUxEX1JFUEVBVF9GSVJTVCkgeworICAgICAgICAgICAgbXlfbWVtY3B5X3BpYyhkbXBpLT5wbGFuZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIG1waS0+cGxhbmVzWzBdLCBtcGktPncsIG1waS0+aC8yLAorICAgICAgICAgICAgICAgICAgICAgICBkbXBpLT5zdHJpZGVbMF0qMiwgbXBpLT5zdHJpZGVbMF0qMik7CisgICAgICAgICAgICBpZiAobXBpLT5mbGFncyAmIE1QX0lNR0ZMQUdfUExBTkFSKSB7CisgICAgICAgICAgICAgICAgbXlfbWVtY3B5X3BpYyhkbXBpLT5wbGFuZXNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGktPnBsYW5lc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1waS0+Y2hyb21hX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBpLT5jaHJvbWFfaGVpZ2h0LzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbXBpLT5zdHJpZGVbMV0qMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1waS0+c3RyaWRlWzFdKjIpOworICAgICAgICAgICAgICAgIG15X21lbWNweV9waWMoZG1waS0+cGxhbmVzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBpLT5wbGFuZXNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGktPmNocm9tYV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1waS0+Y2hyb21hX2hlaWdodC8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1waS0+c3RyaWRlWzJdKjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGktPnN0cmlkZVsyXSoyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlPTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBteV9tZW1jcHlfcGljKGRtcGktPnBsYW5lc1swXStkbXBpLT5zdHJpZGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgbXBpLT5wbGFuZXNbMF0rbXBpLT5zdHJpZGVbMF0sIG1waS0+dywgbXBpLT5oLzIsCisgICAgICAgICAgICAgICAgICAgICAgZG1waS0+c3RyaWRlWzBdKjIsIG1waS0+c3RyaWRlWzBdKjIpOworICAgICAgICBpZiAobXBpLT5mbGFncyAmIE1QX0lNR0ZMQUdfUExBTkFSKSB7CisgICAgICAgICAgICBteV9tZW1jcHlfcGljKGRtcGktPnBsYW5lc1sxXStkbXBpLT5zdHJpZGVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1waS0+cGxhbmVzWzFdK21waS0+c3RyaWRlWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtcGktPmNocm9tYV93aWR0aCwgbXBpLT5jaHJvbWFfaGVpZ2h0LzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRtcGktPnN0cmlkZVsxXSoyLCBtcGktPnN0cmlkZVsxXSoyKTsKKyAgICAgICAgICAgIG15X21lbWNweV9waWMoZG1waS0+cGxhbmVzWzJdK2RtcGktPnN0cmlkZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXBpLT5wbGFuZXNbMl0rbXBpLT5zdHJpZGVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1waS0+Y2hyb21hX3dpZHRoLCBtcGktPmNocm9tYV9oZWlnaHQvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG1waS0+c3RyaWRlWzJdKjIsIG1waS0+c3RyaWRlWzJdKjIpOworICAgICAgICB9CisgICAgICAgIHJldCA9IGZmX3ZmX25leHRfcHV0X2ltYWdlKHZmLCBkbXBpLCBNUF9OT1BUU19WQUxVRSk7CisgICAgICAgIHZmLT5wcml2LT5vdXQrKzsKKyAgICAgICAgaWYgKGZsYWdzICYgTVBfSU1HRklFTERfUkVQRUFUX0ZJUlNUKSB7CisgICAgICAgICAgICByZXQgfD0gZmZfdmZfbmV4dF9wdXRfaW1hZ2UodmYsIG1waSwgTVBfTk9QVFNfVkFMVUUpOworICAgICAgICAgICAgdmYtPnByaXYtPm91dCsrOworICAgICAgICAgICAgc3RhdGU9MDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG15X21lbWNweV9waWMoZG1waS0+cGxhbmVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtcGktPnBsYW5lc1swXSwgbXBpLT53LCBtcGktPmgvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG1waS0+c3RyaWRlWzBdKjIsIG1waS0+c3RyaWRlWzBdKjIpOworICAgICAgICAgICAgaWYgKG1waS0+ZmxhZ3MgJiBNUF9JTUdGTEFHX1BMQU5BUikgeworICAgICAgICAgICAgICAgIG15X21lbWNweV9waWMoZG1waS0+cGxhbmVzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBpLT5wbGFuZXNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGktPmNocm9tYV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1waS0+Y2hyb21hX2hlaWdodC8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1waS0+c3RyaWRlWzFdKjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGktPnN0cmlkZVsxXSoyKTsKKyAgICAgICAgICAgICAgICBteV9tZW1jcHlfcGljKGRtcGktPnBsYW5lc1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1waS0+cGxhbmVzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBpLT5jaHJvbWFfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGktPmNocm9tYV9oZWlnaHQvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtcGktPnN0cmlkZVsyXSoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBpLT5zdHJpZGVbMl0qMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2Zi0+cHJpdi0+c3RhdGUgPSBzdGF0ZTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZF93aWR0aCwgaW50IGRfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IG91dGZtdCkKK3sKKyAgICByZXR1cm4gZmZfdmZfbmV4dF9jb25maWcodmYsd2lkdGgsaGVpZ2h0LGRfd2lkdGgsZF9oZWlnaHQsZmxhZ3Msb3V0Zm10KTsKK30KKworc3RhdGljIHZvaWQgdW5pbml0KHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYpCit7CisgICAgZmZfbXBfbXNnKE1TR1RfVkZJTFRFUiwgTVNHTF9JTkZPLCAic29mdHB1bGxkb3duOiAlbGxkIGZyYW1lcyBpbiwgJWxsZCBmcmFtZXMgb3V0XG4iLCB2Zi0+cHJpdi0+aW4sIHZmLT5wcml2LT5vdXQpOworICAgIGZyZWUodmYtPnByaXYpOworfQorCitzdGF0aWMgaW50IHZmX29wZW4odmZfaW5zdGFuY2VfdCAqdmYsIGNoYXIgKmFyZ3MpCit7CisgICAgdmYtPmNvbmZpZyA9IGNvbmZpZzsKKyAgICB2Zi0+cHV0X2ltYWdlID0gcHV0X2ltYWdlOworICAgIHZmLT51bmluaXQgPSB1bmluaXQ7CisgICAgdmYtPmRlZmF1bHRfcmVxcyA9IFZGQ0FQX0FDQ0VQVF9TVFJJREU7CisgICAgdmYtPnByaXYgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB2Zl9wcml2X3MpKTsKKyAgICB2Zi0+cHJpdi0+c3RhdGUgPSAwOworICAgIHJldHVybiAxOworfQorCitjb25zdCB2Zl9pbmZvX3QgZmZfdmZfaW5mb19zb2Z0cHVsbGRvd24gPSB7CisgICAgIm1wZWcyIHNvZnQgMzoyIHB1bGxkb3duIiwKKyAgICAic29mdHB1bGxkb3duIiwKKyAgICAiVG9iaWFzIERpZWRyaWNoIDxyYW5tYSttcGxheWVyQHRkaWVkcmljaC5kZT4iLAorICAgICIiLAorICAgIHZmX29wZW4sCisgICAgTlVMTAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy92Zl91c3BwLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvdmZfdXNwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNDMyOWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvdmZfdXNwcC5jCkBAIC0wLDAgKzEsMzk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTVBsYXllci4KKyAqCisgKiBNUGxheWVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBNUGxheWVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBNUGxheWVyOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJtcF9tc2cuaCIKKyNpbmNsdWRlICJjcHVkZXRlY3QuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKworI2luY2x1ZGUgImltZ19mb3JtYXQuaCIKKyNpbmNsdWRlICJtcF9pbWFnZS5oIgorI2luY2x1ZGUgInZmLmgiCisjaW5jbHVkZSAiYXZfaGVscGVycy5oIgorI2luY2x1ZGUgImxpYnZvL2Zhc3RtZW1jcHkuaCIKKworI2RlZmluZSBYTUlOKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKworI2RlZmluZSBCTE9DSyAxNgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCitERUNMQVJFX0FMSUdORUQoOCwgc3RhdGljIGNvbnN0IHVpbnQ4X3QsIGRpdGhlcilbOF1bOF0gPSB7Cit7ICAwKjQsICA0OCo0LCAgMTIqNCwgIDYwKjQsICAgMyo0LCAgNTEqNCwgIDE1KjQsICA2Myo0LCB9LAoreyAzMio0LCAgMTYqNCwgIDQ0KjQsICAyOCo0LCAgMzUqNCwgIDE5KjQsICA0Nyo0LCAgMzEqNCwgfSwKK3sgIDgqNCwgIDU2KjQsICAgNCo0LCAgNTIqNCwgIDExKjQsICA1OSo0LCAgIDcqNCwgIDU1KjQsIH0sCit7IDQwKjQsICAyNCo0LCAgMzYqNCwgIDIwKjQsICA0Myo0LCAgMjcqNCwgIDM5KjQsICAyMyo0LCB9LAoreyAgMio0LCAgNTAqNCwgIDE0KjQsICA2Mio0LCAgIDEqNCwgIDQ5KjQsICAxMyo0LCAgNjEqNCwgfSwKK3sgMzQqNCwgIDE4KjQsICA0Nio0LCAgMzAqNCwgIDMzKjQsICAxNyo0LCAgNDUqNCwgIDI5KjQsIH0sCit7IDEwKjQsICA1OCo0LCAgIDYqNCwgIDU0KjQsICAgOSo0LCAgNTcqNCwgICA1KjQsICA1Myo0LCB9LAoreyA0Mio0LCAgMjYqNCwgIDM4KjQsICAyMio0LCAgNDEqNCwgIDI1KjQsICAzNyo0LCAgMjEqNCwgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG9mZnNldFs1MTFdWzJdPSB7Cit7IDAsIDB9LAoreyAwLCAwfSwgeyA4LCA4fSwKK3sgMCwgMH0sIHsgNCwgNH0sIHsxMiwgOH0sIHsgOCwxMn0sCit7IDAsIDB9LCB7MTAsIDJ9LCB7IDQsIDR9LCB7MTQsIDZ9LCB7IDgsIDh9LCB7IDIsMTB9LCB7MTIsMTJ9LCB7IDYsMTR9LAorCit7IDAsIDB9LCB7MTAsIDJ9LCB7IDQsIDR9LCB7MTQsIDZ9LCB7IDgsIDh9LCB7IDIsMTB9LCB7MTIsMTJ9LCB7IDYsMTR9LAoreyA1LCAxfSwgezE1LCAzfSwgeyA5LCA1fSwgeyAzLCA3fSwgezEzLCA5fSwgeyA3LDExfSwgeyAxLDEzfSwgezExLDE1fSwKKworeyAwLCAwfSwgeyA4LCAwfSwgeyAwLCA4fSwgeyA4LCA4fSwgeyA1LCAxfSwgezEzLCAxfSwgeyA1LCA5fSwgezEzLCA5fSwKK3sgMiwgMn0sIHsxMCwgMn0sIHsgMiwxMH0sIHsxMCwxMH0sIHsgNywgM30sIHsxNSwgM30sIHsgNywxMX0sIHsxNSwxMX0sCit7IDQsIDR9LCB7MTIsIDR9LCB7IDQsMTJ9LCB7MTIsMTJ9LCB7IDEsIDV9LCB7IDksIDV9LCB7IDEsMTN9LCB7IDksMTN9LAoreyA2LCA2fSwgezE0LCA2fSwgeyA2LDE0fSwgezE0LDE0fSwgeyAzLCA3fSwgezExLCA3fSwgeyAzLDE1fSwgezExLDE1fSwKKworeyAwLCAwfSwgeyA4LCAwfSwgeyAwLCA4fSwgeyA4LCA4fSwgeyA0LCAwfSwgezEyLCAwfSwgeyA0LCA4fSwgezEyLCA4fSwKK3sgMSwgMX0sIHsgOSwgMX0sIHsgMSwgOX0sIHsgOSwgOX0sIHsgNSwgMX0sIHsxMywgMX0sIHsgNSwgOX0sIHsxMywgOX0sCit7IDMsIDJ9LCB7MTEsIDJ9LCB7IDMsMTB9LCB7MTEsMTB9LCB7IDcsIDJ9LCB7MTUsIDJ9LCB7IDcsMTB9LCB7MTUsMTB9LAoreyAyLCAzfSwgezEwLCAzfSwgeyAyLDExfSwgezEwLDExfSwgeyA2LCAzfSwgezE0LCAzfSwgeyA2LDExfSwgezE0LDExfSwKK3sgMCwgNH0sIHsgOCwgNH0sIHsgMCwxMn0sIHsgOCwxMn0sIHsgNCwgNH0sIHsxMiwgNH0sIHsgNCwxMn0sIHsxMiwxMn0sCit7IDEsIDV9LCB7IDksIDV9LCB7IDEsMTN9LCB7IDksMTN9LCB7IDUsIDV9LCB7MTMsIDV9LCB7IDUsMTN9LCB7MTMsMTN9LAoreyAzLCA2fSwgezExLCA2fSwgeyAzLDE0fSwgezExLDE0fSwgeyA3LCA2fSwgezE1LCA2fSwgeyA3LDE0fSwgezE1LDE0fSwKK3sgMiwgN30sIHsxMCwgN30sIHsgMiwxNX0sIHsxMCwxNX0sIHsgNiwgN30sIHsxNCwgN30sIHsgNiwxNX0sIHsxNCwxNX0sCisKK3sgMCwgMH0sIHsgOCwgMH0sIHsgMCwgOH0sIHsgOCwgOH0sIHsgMCwgMn0sIHsgOCwgMn0sIHsgMCwxMH0sIHsgOCwxMH0sCit7IDAsIDR9LCB7IDgsIDR9LCB7IDAsMTJ9LCB7IDgsMTJ9LCB7IDAsIDZ9LCB7IDgsIDZ9LCB7IDAsMTR9LCB7IDgsMTR9LAoreyAxLCAxfSwgeyA5LCAxfSwgeyAxLCA5fSwgeyA5LCA5fSwgeyAxLCAzfSwgeyA5LCAzfSwgeyAxLDExfSwgeyA5LDExfSwKK3sgMSwgNX0sIHsgOSwgNX0sIHsgMSwxM30sIHsgOSwxM30sIHsgMSwgN30sIHsgOSwgN30sIHsgMSwxNX0sIHsgOSwxNX0sCit7IDIsIDB9LCB7MTAsIDB9LCB7IDIsIDh9LCB7MTAsIDh9LCB7IDIsIDJ9LCB7MTAsIDJ9LCB7IDIsMTB9LCB7MTAsMTB9LAoreyAyLCA0fSwgezEwLCA0fSwgeyAyLDEyfSwgezEwLDEyfSwgeyAyLCA2fSwgezEwLCA2fSwgeyAyLDE0fSwgezEwLDE0fSwKK3sgMywgMX0sIHsxMSwgMX0sIHsgMywgOX0sIHsxMSwgOX0sIHsgMywgM30sIHsxMSwgM30sIHsgMywxMX0sIHsxMSwxMX0sCit7IDMsIDV9LCB7MTEsIDV9LCB7IDMsMTN9LCB7MTEsMTN9LCB7IDMsIDd9LCB7MTEsIDd9LCB7IDMsMTV9LCB7MTEsMTV9LAoreyA0LCAwfSwgezEyLCAwfSwgeyA0LCA4fSwgezEyLCA4fSwgeyA0LCAyfSwgezEyLCAyfSwgeyA0LDEwfSwgezEyLDEwfSwKK3sgNCwgNH0sIHsxMiwgNH0sIHsgNCwxMn0sIHsxMiwxMn0sIHsgNCwgNn0sIHsxMiwgNn0sIHsgNCwxNH0sIHsxMiwxNH0sCit7IDUsIDF9LCB7MTMsIDF9LCB7IDUsIDl9LCB7MTMsIDl9LCB7IDUsIDN9LCB7MTMsIDN9LCB7IDUsMTF9LCB7MTMsMTF9LAoreyA1LCA1fSwgezEzLCA1fSwgeyA1LDEzfSwgezEzLDEzfSwgeyA1LCA3fSwgezEzLCA3fSwgeyA1LDE1fSwgezEzLDE1fSwKK3sgNiwgMH0sIHsxNCwgMH0sIHsgNiwgOH0sIHsxNCwgOH0sIHsgNiwgMn0sIHsxNCwgMn0sIHsgNiwxMH0sIHsxNCwxMH0sCit7IDYsIDR9LCB7MTQsIDR9LCB7IDYsMTJ9LCB7MTQsMTJ9LCB7IDYsIDZ9LCB7MTQsIDZ9LCB7IDYsMTR9LCB7MTQsMTR9LAoreyA3LCAxfSwgezE1LCAxfSwgeyA3LCA5fSwgezE1LCA5fSwgeyA3LCAzfSwgezE1LCAzfSwgeyA3LDExfSwgezE1LDExfSwKK3sgNywgNX0sIHsxNSwgNX0sIHsgNywxM30sIHsxNSwxM30sIHsgNywgN30sIHsxNSwgN30sIHsgNywxNX0sIHsxNSwxNX0sCisKK3sgMCwgMH0sIHsgOCwgMH0sIHsgMCwgOH0sIHsgOCwgOH0sIHsgNCwgNH0sIHsxMiwgNH0sIHsgNCwxMn0sIHsxMiwxMn0sIHsgMCwgNH0sIHsgOCwgNH0sIHsgMCwxMn0sIHsgOCwxMn0sIHsgNCwgMH0sIHsxMiwgMH0sIHsgNCwgOH0sIHsxMiwgOH0sIHsgMiwgMn0sIHsxMCwgMn0sIHsgMiwxMH0sIHsxMCwxMH0sIHsgNiwgNn0sIHsxNCwgNn0sIHsgNiwxNH0sIHsxNCwxNH0sIHsgMiwgNn0sIHsxMCwgNn0sIHsgMiwxNH0sIHsxMCwxNH0sIHsgNiwgMn0sIHsxNCwgMn0sIHsgNiwxMH0sIHsxNCwxMH0sIHsgMCwgMn0sIHsgOCwgMn0sIHsgMCwxMH0sIHsgOCwxMH0sIHsgNCwgNn0sIHsxMiwgNn0sIHsgNCwxNH0sIHsxMiwxNH0sIHsgMCwgNn0sIHsgOCwgNn0sIHsgMCwxNH0sIHsgOCwxNH0sIHsgNCwgMn0sIHsxMiwgMn0sIHsgNCwxMH0sIHsxMiwxMH0sIHsgMiwgMH0sIHsxMCwgMH0sIHsgMiwgOH0sIHsxMCwgOH0sIHsgNiwgNH0sIHsxNCwgNH0sIHsgNiwxMn0sIHsxNCwxMn0sIHsgMiwgNH0sIHsxMCwgNH0sIHsgMiwxMn0sIHsxMCwxMn0sIHsgNiwgMH0sIHsxNCwgMH0sIHsgNiwgOH0sIHsxNCwgOH0sIHsgMSwgMX0sIHsgOSwgMX0sIHsgMSwgOX0sIHsgOSwgOX0sIHsgNSwgNX0sIHsxMywgNX0sIHsgNSwxM30sIHsxMywxM30sIHsgMSwgNX0sIHsgOSwgNX0sIHsgMSwxM30sIHsgOSwxM30sIHsgNSwgMX0sIHsxMywgMX0sIHsgNSwgOX0sIHsxMywgOX0sIHsgMywgM30sIHsxMSwgM30sIHsgMywxMX0sIHsxMSwxMX0sIHsgNywgN30sIHsxNSwgN30sIHsgNywxNX0sIHsxNSwxNX0sIHsgMywgN30sIHsxMSwgN30sIHsgMywxNX0sIHsxMSwxNX0sIHsgNywgM30sIHsxNSwgM30sIHsgNywxMX0sIHsxNSwxMX0sIHsgMSwgM30sIHsgOSwgM30sIHsgMSwxMX0sIHsgOSwxMX0sIHsgNSwgN30sIHsxMywgN30sIHsgNSwxNX0sIHsxMywxNX0sIHsgMSwgN30sIHsgOSwgN30sIHsgMSwxNX0sIHsgOSwxNX0sIHsgNSwgM30sIHsxMywgM30sIHsgNSwxMX0sIHsxMywxMX0sIHsgMywgMX0sIHsxMSwgMX0KKywgeyAzLCA5fSwgezExLCA5fSwgeyA3LCA1fSwgezE1LCA1fSwgeyA3LDEzfSwgezE1LDEzfSwgeyAzLCA1fSwgezExLCA1fSwgeyAzLDEzfSwgezExLDEzfSwgeyA3LCAxfSwgezE1LCAxfSwgeyA3LCA5fSwgezE1LCA5fSwgeyAwLCAxfSwgeyA4LCAxfSwgeyAwLCA5fSwgeyA4LCA5fSwgeyA0LCA1fSwgezEyLCA1fSwgeyA0LDEzfSwgezEyLDEzfSwgeyAwLCA1fSwgeyA4LCA1fSwgeyAwLDEzfSwgeyA4LDEzfSwgeyA0LCAxfSwgezEyLCAxfSwgeyA0LCA5fSwgezEyLCA5fSwgeyAyLCAzfSwgezEwLCAzfSwgeyAyLDExfSwgezEwLDExfSwgeyA2LCA3fSwgezE0LCA3fSwgeyA2LDE1fSwgezE0LDE1fSwgeyAyLCA3fSwgezEwLCA3fSwgeyAyLDE1fSwgezEwLDE1fSwgeyA2LCAzfSwgezE0LCAzfSwgeyA2LDExfSwgezE0LDExfSwgeyAwLCAzfSwgeyA4LCAzfSwgeyAwLDExfSwgeyA4LDExfSwgeyA0LCA3fSwgezEyLCA3fSwgeyA0LDE1fSwgezEyLDE1fSwgeyAwLCA3fSwgeyA4LCA3fSwgeyAwLDE1fSwgeyA4LDE1fSwgeyA0LCAzfSwgezEyLCAzfSwgeyA0LDExfSwgezEyLDExfSwgeyAyLCAxfSwgezEwLCAxfSwgeyAyLCA5fSwgezEwLCA5fSwgeyA2LCA1fSwgezE0LCA1fSwgeyA2LDEzfSwgezE0LDEzfSwgeyAyLCA1fSwgezEwLCA1fSwgeyAyLDEzfSwgezEwLDEzfSwgeyA2LCAxfSwgezE0LCAxfSwgeyA2LCA5fSwgezE0LCA5fSwgeyAxLCAwfSwgeyA5LCAwfSwgeyAxLCA4fSwgeyA5LCA4fSwgeyA1LCA0fSwgezEzLCA0fSwgeyA1LDEyfSwgezEzLDEyfSwgeyAxLCA0fSwgeyA5LCA0fSwgeyAxLDEyfSwgeyA5LDEyfSwgeyA1LCAwfSwgezEzLCAwfSwgeyA1LCA4fSwgezEzLCA4fSwgeyAzLCAyfSwgezExLCAyfSwgeyAzLDEwfSwgezExLDEwfSwgeyA3LCA2fSwgezE1LCA2fSwgeyA3LDE0fSwgezE1LDE0fSwgeyAzLCA2fSwgezExLCA2fSwgeyAzLDE0fSwgezExLDE0fSwgeyA3LCAyfSwgezE1LCAyfSwgeyA3LDEwfSwgezE1LDEwfSwgeyAxLCAyfSwgeyA5LCAyfSwgeyAxLDEwfSwgeyA5LAorMTB9LCB7IDUsIDZ9LCB7MTMsIDZ9LCB7IDUsMTR9LCB7MTMsMTR9LCB7IDEsIDZ9LCB7IDksIDZ9LCB7IDEsMTR9LCB7IDksMTR9LCB7IDUsIDJ9LCB7MTMsIDJ9LCB7IDUsMTB9LCB7MTMsMTB9LCB7IDMsIDB9LCB7MTEsIDB9LCB7IDMsIDh9LCB7MTEsIDh9LCB7IDcsIDR9LCB7MTUsIDR9LCB7IDcsMTJ9LCB7MTUsMTJ9LCB7IDMsIDR9LCB7MTEsIDR9LCB7IDMsMTJ9LCB7MTEsMTJ9LCB7IDcsIDB9LCB7MTUsIDB9LCB7IDcsIDh9LCB7MTUsIDh9LAorfTsKKworc3RydWN0IHZmX3ByaXZfcyB7CisgICAgaW50IGxvZzJfY291bnQ7CisgICAgaW50IHFwOworICAgIGludCBtb2RlOworICAgIGludCBtcGVnMjsKKyAgICBpbnQgdGVtcF9zdHJpZGVbM107CisgICAgdWludDhfdCAqc3JjWzNdOworICAgIGludDE2X3QgKnRlbXBbM107CisgICAgaW50IG91dGJ1Zl9zaXplOworICAgIHVpbnQ4X3QgKm91dGJ1ZjsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHhfZW5jW0JMT0NLKkJMT0NLXTsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBBVkZyYW1lICpmcmFtZV9kZWM7Cit9OworCitzdGF0aWMgdm9pZCBzdG9yZV9zbGljZV9jKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqc3JjLCBpbnQgZHN0X3N0cmlkZSwgaW50IHNyY19zdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxvZzJfc2NhbGUpeworICAgICAgICBpbnQgeSwgeDsKKworI2RlZmluZSBTVE9SRShwb3MpIFwKKyAgICAgICAgdGVtcD0gKChzcmNbeCArIHkqc3JjX3N0cmlkZSArIHBvc108PGxvZzJfc2NhbGUpICsgZFtwb3NdKT4+ODtcCisgICAgICAgIGlmKHRlbXAgJiAweDEwMCkgdGVtcD0gfih0ZW1wPj4zMSk7XAorICAgICAgICBkc3RbeCArIHkqZHN0X3N0cmlkZSArIHBvc109IHRlbXA7CisKKyAgICAgICAgZm9yKHk9MDsgeTxoZWlnaHQ7IHkrKyl7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZD0gZGl0aGVyW3kmN107CisgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDx3aWR0aDsgeCs9OCl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JFKDApOworICAgICAgICAgICAgICAgICAgICAgICAgU1RPUkUoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTVE9SRSgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JFKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgU1RPUkUoNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTVE9SRSg1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JFKDYpOworICAgICAgICAgICAgICAgICAgICAgICAgU1RPUkUoNyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcihzdHJ1Y3QgdmZfcHJpdl9zICpwLCB1aW50OF90ICpkc3RbM10sIHVpbnQ4X3QgKnNyY1szXSwgaW50IGRzdF9zdHJpZGVbM10sIGludCBzcmNfc3RyaWRlWzNdLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHVpbnQ4X3QgKnFwX3N0b3JlLCBpbnQgcXBfc3RyaWRlKXsKKyAgICBpbnQgeCwgeSwgaSwgajsKKyAgICBjb25zdCBpbnQgY291bnQ9IDE8PHAtPmxvZzJfY291bnQ7CisKKyAgICBmb3IoaT0wOyBpPDM7IGkrKyl7CisgICAgICAgIGludCBpc19jaHJvbWE9ICEhaTsKKyAgICAgICAgaW50IHc9IHdpZHRoID4+aXNfY2hyb21hOworICAgICAgICBpbnQgaD0gaGVpZ2h0Pj5pc19jaHJvbWE7CisgICAgICAgIGludCBzdHJpZGU9IHAtPnRlbXBfc3RyaWRlW2ldOworICAgICAgICBpbnQgYmxvY2s9IEJMT0NLPj5pc19jaHJvbWE7CisKKyAgICAgICAgaWYgKCFzcmNbaV0gfHwgIWRzdFtpXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBIQUNLIGF2b2lkIGNyYXNoIGZvciBZOCBjb2xvdXJzcGFjZQorICAgICAgICBmb3IoeT0wOyB5PGg7IHkrKyl7CisgICAgICAgICAgICBpbnQgaW5kZXg9IGJsb2NrICsgYmxvY2sqc3RyaWRlICsgeSpzdHJpZGU7CisgICAgICAgICAgICBmYXN0X21lbWNweShwLT5zcmNbaV0gKyBpbmRleCwgc3JjW2ldICsgeSpzcmNfc3RyaWRlW2ldLCB3KTsKKyAgICAgICAgICAgIGZvcih4PTA7IHg8YmxvY2s7IHgrKyl7CisgICAgICAgICAgICAgICAgcC0+c3JjW2ldW2luZGV4ICAgICAtIHggLSAxXT0gcC0+c3JjW2ldW2luZGV4ICsgICAgIHggICAgXTsKKyAgICAgICAgICAgICAgICBwLT5zcmNbaV1baW5kZXggKyB3ICsgeCAgICBdPSBwLT5zcmNbaV1baW5kZXggKyB3IC0geCAtIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvcih5PTA7IHk8YmxvY2s7IHkrKyl7CisgICAgICAgICAgICBmYXN0X21lbWNweShwLT5zcmNbaV0gKyAoICBibG9jay0xLXkpKnN0cmlkZSwgcC0+c3JjW2ldICsgKCAgeStibG9jayAgKSpzdHJpZGUsIHN0cmlkZSk7CisgICAgICAgICAgICBmYXN0X21lbWNweShwLT5zcmNbaV0gKyAoaCtibG9jayAgK3kpKnN0cmlkZSwgcC0+c3JjW2ldICsgKGgteStibG9jay0xKSpzdHJpZGUsIHN0cmlkZSk7CisgICAgICAgIH0KKworICAgICAgICBwLT5mcmFtZS0+bGluZXNpemVbaV09IHN0cmlkZTsKKyAgICAgICAgbWVtc2V0KHAtPnRlbXBbaV0sIDAsIChoKzIqYmxvY2spKnN0cmlkZSpzaXplb2YoaW50MTZfdCkpOworICAgIH0KKworICAgIGlmKHAtPnFwKQorICAgICAgICBwLT5mcmFtZS0+cXVhbGl0eT0gcC0+cXAgKiBGRl9RUDJMQU1CREE7CisgICAgZWxzZQorICAgICAgICBwLT5mcmFtZS0+cXVhbGl0eT0gbm9ybV9xc2NhbGUocXBfc3RvcmVbMF0sIHAtPm1wZWcyKSAqIEZGX1FQMkxBTUJEQTsKKy8vICAgIGluaXQgcGVyIE1CIHFzY2FsZSBzdHVmZiBGSVhNRQorCisgICAgZm9yKGk9MDsgaTxjb3VudDsgaSsrKXsKKyAgICAgICAgY29uc3QgaW50IHgxPSBvZmZzZXRbaStjb3VudC0xXVswXTsKKyAgICAgICAgY29uc3QgaW50IHkxPSBvZmZzZXRbaStjb3VudC0xXVsxXTsKKyAgICAgICAgaW50IG9mZnNldDsKKyAgICAgICAgcC0+ZnJhbWUtPmRhdGFbMF09IHAtPnNyY1swXSArIHgxICsgeTEgKiBwLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIHAtPmZyYW1lLT5kYXRhWzFdPSBwLT5zcmNbMV0gKyB4MS8yICsgeTEvMiAqIHAtPmZyYW1lLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgcC0+ZnJhbWUtPmRhdGFbMl09IHAtPnNyY1syXSArIHgxLzIgKyB5MS8yICogcC0+ZnJhbWUtPmxpbmVzaXplWzJdOworCisgICAgICAgIGF2Y29kZWNfZW5jb2RlX3ZpZGVvKHAtPmF2Y3R4X2VuY1tpXSwgcC0+b3V0YnVmLCBwLT5vdXRidWZfc2l6ZSwgcC0+ZnJhbWUpOworICAgICAgICBwLT5mcmFtZV9kZWMgPSBwLT5hdmN0eF9lbmNbaV0tPmNvZGVkX2ZyYW1lOworCisgICAgICAgIG9mZnNldD0gKEJMT0NLLXgxKSArIChCTE9DSy15MSkqcC0+ZnJhbWVfZGVjLT5saW5lc2l6ZVswXTsKKyAgICAgICAgLy9GSVhNRSBvcHRpbWl6ZQorICAgICAgICBmb3IoeT0wOyB5PGhlaWdodDsgeSsrKXsKKyAgICAgICAgICAgIGZvcih4PTA7IHg8d2lkdGg7IHgrKyl7CisgICAgICAgICAgICAgICAgcC0+dGVtcFswXVsgeCArIHkqcC0+dGVtcF9zdHJpZGVbMF0gXSArPSBwLT5mcmFtZV9kZWMtPmRhdGFbMF1bIHggKyB5KnAtPmZyYW1lX2RlYy0+bGluZXNpemVbMF0gKyBvZmZzZXQgXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvZmZzZXQ9IChCTE9DSy8yLXgxLzIpICsgKEJMT0NLLzIteTEvMikqcC0+ZnJhbWVfZGVjLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgZm9yKHk9MDsgeTxoZWlnaHQvMjsgeSsrKXsKKyAgICAgICAgICAgIGZvcih4PTA7IHg8d2lkdGgvMjsgeCsrKXsKKyAgICAgICAgICAgICAgICBwLT50ZW1wWzFdWyB4ICsgeSpwLT50ZW1wX3N0cmlkZVsxXSBdICs9IHAtPmZyYW1lX2RlYy0+ZGF0YVsxXVsgeCArIHkqcC0+ZnJhbWVfZGVjLT5saW5lc2l6ZVsxXSArIG9mZnNldCBdOworICAgICAgICAgICAgICAgIHAtPnRlbXBbMl1bIHggKyB5KnAtPnRlbXBfc3RyaWRlWzJdIF0gKz0gcC0+ZnJhbWVfZGVjLT5kYXRhWzJdWyB4ICsgeSpwLT5mcmFtZV9kZWMtPmxpbmVzaXplWzJdICsgb2Zmc2V0IF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3Ioaj0wOyBqPDM7IGorKyl7CisgICAgICAgIGludCBpc19jaHJvbWE9ICEhajsKKyAgICAgICAgaWYgKCFkc3Rbal0pCisgICAgICAgICAgICBjb250aW51ZTsgLy8gSEFDSyBhdm9pZCBjcmFzaCBmb3IgWTggY29sb3Vyc3BhY2UKKyAgICAgICAgc3RvcmVfc2xpY2VfYyhkc3Rbal0sIHAtPnRlbXBbal0sIGRzdF9zdHJpZGVbal0sIHAtPnRlbXBfc3RyaWRlW2pdLCB3aWR0aD4+aXNfY2hyb21hLCBoZWlnaHQ+PmlzX2Nocm9tYSwgOC1wLT5sb2cyX2NvdW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsCisgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRfd2lkdGgsIGludCBkX2hlaWdodCwKKyAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgb3V0Zm10KXsKKyAgICAgICAgaW50IGk7CisgICAgICAgIEFWQ29kZWMgKmVuYz0gYXZjb2RlY19maW5kX2VuY29kZXIoQVZfQ09ERUNfSURfU05PVyk7CisKKyAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspeworICAgICAgICAgICAgaW50IGlzX2Nocm9tYT0gISFpOworICAgICAgICAgICAgaW50IHc9ICgod2lkdGggICsgNCpCTE9DSy0xKSAmICh+KDIqQkxPQ0stMSkpKT4+aXNfY2hyb21hOworICAgICAgICAgICAgaW50IGg9ICgoaGVpZ2h0ICsgNCpCTE9DSy0xKSAmICh+KDIqQkxPQ0stMSkpKT4+aXNfY2hyb21hOworCisgICAgICAgICAgICB2Zi0+cHJpdi0+dGVtcF9zdHJpZGVbaV09IHc7CisgICAgICAgICAgICB2Zi0+cHJpdi0+dGVtcFtpXT0gbWFsbG9jKHZmLT5wcml2LT50ZW1wX3N0cmlkZVtpXSpoKnNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICB2Zi0+cHJpdi0+c3JjIFtpXT0gbWFsbG9jKHZmLT5wcml2LT50ZW1wX3N0cmlkZVtpXSpoKnNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGk9MDsgaTwgKDE8PHZmLT5wcml2LT5sb2cyX2NvdW50KTsgaSsrKXsKKyAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eF9lbmM7CisgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOworCisgICAgICAgICAgICBhdmN0eF9lbmM9CisgICAgICAgICAgICB2Zi0+cHJpdi0+YXZjdHhfZW5jW2ldPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOworICAgICAgICAgICAgYXZjdHhfZW5jLT53aWR0aCA9IHdpZHRoICsgQkxPQ0s7CisgICAgICAgICAgICBhdmN0eF9lbmMtPmhlaWdodCA9IGhlaWdodCArIEJMT0NLOworICAgICAgICAgICAgYXZjdHhfZW5jLT50aW1lX2Jhc2U9IChBVlJhdGlvbmFsKXsxLDI1fTsgIC8vIG1lYW5pbmdsZXNzCisgICAgICAgICAgICBhdmN0eF9lbmMtPmdvcF9zaXplID0gMzAwOworICAgICAgICAgICAgYXZjdHhfZW5jLT5tYXhfYl9mcmFtZXM9IDA7CisgICAgICAgICAgICBhdmN0eF9lbmMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgICAgICBhdmN0eF9lbmMtPmZsYWdzID0gQ09ERUNfRkxBR19RU0NBTEUgfCBDT0RFQ19GTEFHX0xPV19ERUxBWTsKKyAgICAgICAgICAgIGF2Y3R4X2VuYy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID0gRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUw7CisgICAgICAgICAgICBhdmN0eF9lbmMtPmdsb2JhbF9xdWFsaXR5PSAxMjM7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgIm5vX2JpdHN0cmVhbSIsICIxIiwgMCk7CisgICAgICAgICAgICBpZiAoYXZjb2RlY19vcGVuMihhdmN0eF9lbmMsIGVuYywgJm9wdHMpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CisgICAgICAgICAgICBhc3NlcnQoYXZjdHhfZW5jLT5jb2RlYyk7CisgICAgICAgIH0KKyAgICAgICAgdmYtPnByaXYtPmZyYW1lPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICB2Zi0+cHJpdi0+ZnJhbWVfZGVjPSBhdl9mcmFtZV9hbGxvYygpOworCisgICAgICAgIHZmLT5wcml2LT5vdXRidWZfc2l6ZT0gKHdpZHRoICsgQkxPQ0spKihoZWlnaHQgKyBCTE9DSykqMTA7CisgICAgICAgIHZmLT5wcml2LT5vdXRidWY9IG1hbGxvYyh2Zi0+cHJpdi0+b3V0YnVmX3NpemUpOworCisgICAgICAgIHJldHVybiBmZl92Zl9uZXh0X2NvbmZpZyh2Zix3aWR0aCxoZWlnaHQsZF93aWR0aCxkX2hlaWdodCxmbGFncyxvdXRmbXQpOworfQorCitzdGF0aWMgdm9pZCBnZXRfaW1hZ2Uoc3RydWN0IHZmX2luc3RhbmNlICp2ZiwgbXBfaW1hZ2VfdCAqbXBpKXsKKyAgICBpZihtcGktPmZsYWdzJk1QX0lNR0ZMQUdfUFJFU0VSVkUpIHJldHVybjsgLy8gZG9uJ3QgY2hhbmdlCisgICAgLy8gb2ssIHdlIGNhbiBkbyBwcCBpbi1wbGFjZSAob3IgcHAgZGlzYWJsZWQpOgorICAgIHZmLT5kbXBpPWZmX3ZmX2dldF9pbWFnZSh2Zi0+bmV4dCxtcGktPmltZ2ZtdCwKKyAgICAgICAgbXBpLT50eXBlLCBtcGktPmZsYWdzIHwgTVBfSU1HRkxBR19SRUFEQUJMRSwgbXBpLT53aWR0aCwgbXBpLT5oZWlnaHQpOworICAgIG1waS0+cGxhbmVzWzBdPXZmLT5kbXBpLT5wbGFuZXNbMF07CisgICAgbXBpLT5zdHJpZGVbMF09dmYtPmRtcGktPnN0cmlkZVswXTsKKyAgICBtcGktPndpZHRoPXZmLT5kbXBpLT53aWR0aDsKKyAgICBpZihtcGktPmZsYWdzJk1QX0lNR0ZMQUdfUExBTkFSKXsKKyAgICAgICAgbXBpLT5wbGFuZXNbMV09dmYtPmRtcGktPnBsYW5lc1sxXTsKKyAgICAgICAgbXBpLT5wbGFuZXNbMl09dmYtPmRtcGktPnBsYW5lc1syXTsKKyAgICAgICAgbXBpLT5zdHJpZGVbMV09dmYtPmRtcGktPnN0cmlkZVsxXTsKKyAgICAgICAgbXBpLT5zdHJpZGVbMl09dmYtPmRtcGktPnN0cmlkZVsyXTsKKyAgICB9CisgICAgbXBpLT5mbGFnc3w9TVBfSU1HRkxBR19ESVJFQ1Q7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2ltYWdlKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsIG1wX2ltYWdlX3QgKm1waSwgZG91YmxlIHB0cyl7CisgICAgbXBfaW1hZ2VfdCAqZG1waTsKKworICAgIGlmKCEobXBpLT5mbGFncyZNUF9JTUdGTEFHX0RJUkVDVCkpeworICAgICAgICAvLyBubyBEUiwgc28gZ2V0IGEgbmV3IGltYWdlISBob3BlIHdlJ2xsIGdldCBEUiBidWZmZXI6CisgICAgICAgIGRtcGk9ZmZfdmZfZ2V0X2ltYWdlKHZmLT5uZXh0LG1waS0+aW1nZm10LAorICAgICAgICAgICAgTVBfSU1HVFlQRV9URU1QLAorICAgICAgICAgICAgTVBfSU1HRkxBR19BQ0NFUFRfU1RSSURFfE1QX0lNR0ZMQUdfUFJFRkVSX0FMSUdORURfU1RSSURFLAorICAgICAgICAgICAgbXBpLT53aWR0aCxtcGktPmhlaWdodCk7CisgICAgICAgIGZmX3ZmX2Nsb25lX21waV9hdHRyaWJ1dGVzKGRtcGksIG1waSk7CisgICAgfWVsc2V7CisgICAgICAgIGRtcGk9dmYtPmRtcGk7CisgICAgfQorCisgICAgdmYtPnByaXYtPm1wZWcyPSBtcGktPnFzY2FsZV90eXBlOworICAgIGlmKHZmLT5wcml2LT5sb2cyX2NvdW50IHx8ICEobXBpLT5mbGFncyZNUF9JTUdGTEFHX0RJUkVDVCkpeworICAgICAgICBpZihtcGktPnFzY2FsZSB8fCB2Zi0+cHJpdi0+cXApeworICAgICAgICAgICAgZmlsdGVyKHZmLT5wcml2LCBkbXBpLT5wbGFuZXMsIG1waS0+cGxhbmVzLCBkbXBpLT5zdHJpZGUsIG1waS0+c3RyaWRlLCBtcGktPncsIG1waS0+aCwgbXBpLT5xc2NhbGUsIG1waS0+cXN0cmlkZSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgbWVtY3B5X3BpYyhkbXBpLT5wbGFuZXNbMF0sIG1waS0+cGxhbmVzWzBdLCBtcGktPncsIG1waS0+aCwgZG1waS0+c3RyaWRlWzBdLCBtcGktPnN0cmlkZVswXSk7CisgICAgICAgICAgICBtZW1jcHlfcGljKGRtcGktPnBsYW5lc1sxXSwgbXBpLT5wbGFuZXNbMV0sIG1waS0+dz4+bXBpLT5jaHJvbWFfeF9zaGlmdCwgbXBpLT5oPj5tcGktPmNocm9tYV95X3NoaWZ0LCBkbXBpLT5zdHJpZGVbMV0sIG1waS0+c3RyaWRlWzFdKTsKKyAgICAgICAgICAgIG1lbWNweV9waWMoZG1waS0+cGxhbmVzWzJdLCBtcGktPnBsYW5lc1syXSwgbXBpLT53Pj5tcGktPmNocm9tYV94X3NoaWZ0LCBtcGktPmg+Pm1waS0+Y2hyb21hX3lfc2hpZnQsIGRtcGktPnN0cmlkZVsyXSwgbXBpLT5zdHJpZGVbMl0pOworICAgICAgICB9CisgICAgfQorCisjaWYgSEFWRV9NTVhfSU5MSU5FCisgICAgaWYoZmZfZ0NwdUNhcHMuaGFzTU1YKSBfX2FzbV9fIHZvbGF0aWxlICgiZW1tc1xuXHQiKTsKKyNlbmRpZgorI2lmIEhBVkVfTU1YRVhUX0lOTElORQorICAgIGlmKGZmX2dDcHVDYXBzLmhhc01NWDIpIF9fYXNtX18gdm9sYXRpbGUgKCJzZmVuY2Vcblx0Iik7CisjZW5kaWYKKworICAgIHJldHVybiBmZl92Zl9uZXh0X3B1dF9pbWFnZSh2ZixkbXBpLCBwdHMpOworfQorCitzdGF0aWMgdm9pZCB1bmluaXQoc3RydWN0IHZmX2luc3RhbmNlICp2Zil7CisgICAgaW50IGk7CisgICAgaWYoIXZmLT5wcml2KSByZXR1cm47CisKKyAgICBmb3IoaT0wOyBpPDM7IGkrKyl7CisgICAgICAgIGZyZWUodmYtPnByaXYtPnRlbXBbaV0pOworICAgICAgICB2Zi0+cHJpdi0+dGVtcFtpXT0gTlVMTDsKKyAgICAgICAgZnJlZSh2Zi0+cHJpdi0+c3JjW2ldKTsKKyAgICAgICAgdmYtPnByaXYtPnNyY1tpXT0gTlVMTDsKKyAgICB9CisgICAgZm9yKGk9MDsgaTxCTE9DSypCTE9DSzsgaSsrKXsKKyAgICAgICAgYXZfZnJlZXAoJnZmLT5wcml2LT5hdmN0eF9lbmNbaV0pOworICAgIH0KKworICAgIGZyZWUodmYtPnByaXYpOworICAgIHZmLT5wcml2PU5VTEw7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0KHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsIHVuc2lnbmVkIGludCBmbXQpeworICAgIHN3aXRjaChmbXQpeworICAgICAgICBjYXNlIElNR0ZNVF9ZVjEyOgorICAgICAgICBjYXNlIElNR0ZNVF9JNDIwOgorICAgICAgICBjYXNlIElNR0ZNVF9JWVVWOgorICAgICAgICBjYXNlIElNR0ZNVF9ZODAwOgorICAgICAgICBjYXNlIElNR0ZNVF9ZODoKKyAgICAgICAgICAgIHJldHVybiBmZl92Zl9uZXh0X3F1ZXJ5X2Zvcm1hdCh2ZixmbXQpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb250cm9sKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsIGludCByZXF1ZXN0LCB2b2lkKiBkYXRhKXsKKyAgICBzd2l0Y2gocmVxdWVzdCl7CisgICAgY2FzZSBWRkNUUkxfUVVFUllfTUFYX1BQX0xFVkVMOgorICAgICAgICByZXR1cm4gODsKKyAgICBjYXNlIFZGQ1RSTF9TRVRfUFBfTEVWRUw6CisgICAgICAgIHZmLT5wcml2LT5sb2cyX2NvdW50PSAqKCh1bnNpZ25lZCBpbnQqKWRhdGEpOworICAgICAgICAvL0ZJWE1FIHdlIGhhdmUgdG8gcmVhbGxvYyBhIGZldyB0aGluZ3MgaGVyZQorICAgICAgICByZXR1cm4gQ09OVFJPTF9UUlVFOworICAgIH0KKyAgICByZXR1cm4gZmZfdmZfbmV4dF9jb250cm9sKHZmLHJlcXVlc3QsZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgdmZfb3Blbih2Zl9pbnN0YW5jZV90ICp2ZiwgY2hhciAqYXJncyl7CisKKyAgICBpbnQgbG9nMmM9LTE7CisKKyAgICB2Zi0+Y29uZmlnPWNvbmZpZzsKKyAgICB2Zi0+cHV0X2ltYWdlPXB1dF9pbWFnZTsKKyAgICB2Zi0+Z2V0X2ltYWdlPWdldF9pbWFnZTsKKyAgICB2Zi0+cXVlcnlfZm9ybWF0PXF1ZXJ5X2Zvcm1hdDsKKyAgICB2Zi0+dW5pbml0PXVuaW5pdDsKKyAgICB2Zi0+Y29udHJvbD0gY29udHJvbDsKKyAgICB2Zi0+cHJpdj1tYWxsb2Moc2l6ZW9mKHN0cnVjdCB2Zl9wcml2X3MpKTsKKyAgICBtZW1zZXQodmYtPnByaXYsIDAsIHNpemVvZihzdHJ1Y3QgdmZfcHJpdl9zKSk7CisKKyAgICBmZl9pbml0X2F2Y29kZWMoKTsKKworICAgIHZmLT5wcml2LT5sb2cyX2NvdW50PSA0OworCisgICAgaWYgKGFyZ3MpIHNzY2FuZihhcmdzLCAiJWQ6JWQ6JWQiLCAmbG9nMmMsICZ2Zi0+cHJpdi0+cXAsICZ2Zi0+cHJpdi0+bW9kZSk7CisKKyAgICBpZiggbG9nMmMgPj0wICYmIGxvZzJjIDw9OCApCisgICAgICAgIHZmLT5wcml2LT5sb2cyX2NvdW50ID0gbG9nMmM7CisKKyAgICBpZih2Zi0+cHJpdi0+cXAgPCAwKQorICAgICAgICB2Zi0+cHJpdi0+cXAgPSAwOworCisvLyAjaWYgSEFWRV9NTVhfSU5MSU5FCisvLyAgICAgaWYoZmZfZ0NwdUNhcHMuaGFzTU1YKXsKKy8vICAgICAgICAgc3RvcmVfc2xpY2U9IHN0b3JlX3NsaWNlX21teDsKKy8vICAgICB9CisvLyAjZW5kaWYKKworICAgIHJldHVybiAxOworfQorCitjb25zdCB2Zl9pbmZvX3QgZmZfdmZfaW5mb191c3BwID0geworICAgICJ1bHRyYSBzaW1wbGUvc2xvdyBwb3N0cHJvY2VzcyIsCisgICAgInVzcHAiLAorICAgICJNaWNoYWVsIE5pZWRlcm1heWVyIiwKKyAgICAiIiwKKyAgICB2Zl9vcGVuLAorICAgIE5VTEwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvdmZjYXAuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci9saWJtcGNvZGVjcy92ZmNhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMWQ2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbGlibXBjb2RlY3MvdmZjYXAuaApAQCAtMCwwICsxLDU2IEBACisvKiBWRkNBUF8qIHZhbHVlczogdGhleSBhcmUgZmxhZ3MsIHJldHVybmVkIGJ5IHF1ZXJ5X2Zvcm1hdCgpOgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE1QbGF5ZXIuCisgKgorICogTVBsYXllciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTVBsYXllciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggTVBsYXllcjsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIE1QTEFZRVJfVkZDQVBfSAorI2RlZmluZSBNUExBWUVSX1ZGQ0FQX0gKKworLy8gc2V0LCBpZiB0aGUgZ2l2ZW4gY29sb3JzcGFjZSBpcyBzdXBwb3J0ZWQgKHdpdGggb3Igd2l0aG91dCBjb252ZXJzaW9uKQorI2RlZmluZSBWRkNBUF9DU1BfU1VQUE9SVEVEIDB4MQorLy8gc2V0LCBpZiB0aGUgZ2l2ZW4gY29sb3JzcGFjZSBpcyBzdXBwb3J0ZWQgX3dpdGhvdXRfIGNvbnZlcnNpb24KKyNkZWZpbmUgVkZDQVBfQ1NQX1NVUFBPUlRFRF9CWV9IVyAweDIKKy8vIHNldCBpZiB0aGUgZHJpdmVyL2ZpbHRlciBjYW4gZHJhdyBPU0QKKyNkZWZpbmUgVkZDQVBfT1NEIDB4NAorLy8gc2V0IGlmIHRoZSBkcml2ZXIvZmlsdGVyIGNhbiBoYW5kbGUgY29tcHJlc3NlZCBTUFUgc3RyZWFtCisjZGVmaW5lIFZGQ0FQX1NQVSAweDgKKy8vIHNjYWxpbmcgdXAvZG93biBieSBoYXJkd2FyZSwgb3Igc29mdHdhcmU6CisjZGVmaW5lIFZGQ0FQX0hXU0NBTEVfVVAgMHgxMAorI2RlZmluZSBWRkNBUF9IV1NDQUxFX0RPV04gMHgyMAorI2RlZmluZSBWRkNBUF9TV1NDQUxFIDB4NDAKKy8vIGRyaXZlci9maWx0ZXIgY2FuIGRvIHZlcnRpY2FsIGZsaXAgKHVwc2lkZS1kb3duKQorI2RlZmluZSBWRkNBUF9GTElQIDB4ODAKKworLy8gZHJpdmVyL2hhcmR3YXJlIGhhbmRsZXMgdGltaW5nIChibG9ja2luZykKKyNkZWZpbmUgVkZDQVBfVElNRVIgMHgxMDAKKy8vIGRyaXZlciBfYWx3YXlzXyBmbGlwIGltYWdlIHVwc2lkZS1kb3duIChmb3IgdmVfdmZ3KQorI2RlZmluZSBWRkNBUF9GTElQUEVEIDB4MjAwCisvLyB2ZiBmaWx0ZXI6IGFjY2VwdHMgc3RyaWRlIChwdXRfaW1hZ2UpCisvLyB2byBkcml2ZXI6IGhhcyBkcmF3X3NsaWNlKCkgc3VwcG9ydCBmb3IgdGhlIGdpdmVuIGNzcAorI2RlZmluZSBWRkNBUF9BQ0NFUFRfU1RSSURFIDB4NDAwCisvLyBmaWx0ZXIgZG9lcyBwb3N0cHJvY2Vzc2luZyAoc28geW91IHNob3VsZG4ndCBzY2FsZS9maWx0ZXIgaW1hZ2UgYmVmb3JlIGl0KQorI2RlZmluZSBWRkNBUF9QT1NUUFJPQyAweDgwMAorLy8gZmlsdGVyIGNhbm5vdCBiZSByZWNvbmZpZ3VyZWQgdG8gZGlmZmVyZW50IHNpemUgJiBmb3JtYXQKKyNkZWZpbmUgVkZDQVBfQ09OU1RBTlQgMHgxMDAwCisvLyBmaWx0ZXIgY2FuIGRyYXcgRU9TRAorI2RlZmluZSBWRkNBUF9FT1NEIDB4MjAwMAorLy8gZmlsdGVyIHdpbGwgZHJhdyBFT1NEIGF0IHNjcmVlbiByZXNvbHV0aW9uICh3aXRob3V0IHNjYWxpbmcpCisjZGVmaW5lIFZGQ0FQX0VPU0RfVU5TQ0FMRUQgMHg0MDAwCisvLyB1c2VkIGJ5IGxpYnZvIGFuZCB2Zl92bywgaW5kaWNhdGVzIHRoZSBWTyBkb2VzIG5vdCBzdXBwb3J0IGRyYXdfc2xpY2UgZm9yIHRoaXMgZm9ybWF0CisjZGVmaW5lIFZPQ0FQX05PU0xJQ0VTIDB4ODAwMAorCisjZW5kaWYgLyogTVBMQVlFUl9WRkNBUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvbG9nMl90YWIuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9sb2cyX3RhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YTFkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbG9nMl90YWIuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZzJfdGFiLmMiCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvbHN3c3V0aWxzLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvbHN3c3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiNGY5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9sc3dzdXRpbHMuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsc3dzdXRpbHMuaCIKKworaW50IGZmX3NjYWxlX2ltYWdlKHVpbnQ4X3QgKmRzdF9kYXRhWzRdLCBpbnQgZHN0X2xpbmVzaXplWzRdLAorICAgICAgICAgICAgICAgICAgIGludCBkc3RfdywgaW50IGRzdF9oLCBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0X3BpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IHNyY19kYXRhWzRdLCBpbnQgc3JjX2xpbmVzaXplWzRdLAorICAgICAgICAgICAgICAgICAgIGludCBzcmNfdywgaW50IHNyY19oLCBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjX3BpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBTd3NDb250ZXh0ICpzd3NfY3R4ID0gc3dzX2dldENvbnRleHQoc3JjX3csIHNyY19oLCBzcmNfcGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF93LCBkc3RfaCwgZHN0X3BpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoIXN3c19jdHgpIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbXBvc3NpYmxlIHRvIGNyZWF0ZSBzY2FsZSBjb250ZXh0IGZvciB0aGUgY29udmVyc2lvbiAiCisgICAgICAgICAgICAgICAiZm10OiVzIHM6JWR4JWQgLT4gZm10OiVzIHM6JWR4JWRcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKHNyY19waXhfZm10KSwgc3JjX3csIHNyY19oLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShkc3RfcGl4X2ZtdCksIGRzdF93LCBkc3RfaCk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9hbGxvYyhkc3RfZGF0YSwgZHN0X2xpbmVzaXplLCBkc3RfdywgZHN0X2gsIGRzdF9waXhfZm10LCAxNikpIDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisgICAgcmV0ID0gMDsKKyAgICBzd3Nfc2NhbGUoc3dzX2N0eCwgKGNvbnN0IHVpbnQ4X3QgKiBjb25zdCopc3JjX2RhdGEsIHNyY19saW5lc2l6ZSwgMCwgc3JjX2gsIGRzdF9kYXRhLCBkc3RfbGluZXNpemUpOworCitlbmQ6CisgICAgc3dzX2ZyZWVDb250ZXh0KHN3c19jdHgpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvbHN3c3V0aWxzLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvbHN3c3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmNTMyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9sc3dzdXRpbHMuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1pc2NlbGxhbmVvdXMgdXRpbGl0aWVzIHdoaWNoIG1ha2UgdXNlIG9mIHRoZSBsaWJzd3NjYWxlIGxpYnJhcnkKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0xTV1NVVElMU19ICisjZGVmaW5lIEFWRklMVEVSX0xTV1NVVElMU19ICisKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3N3c2NhbGUuaCIKKworLyoqCisgKiBTY2FsZSBpbWFnZSB1c2luZyBsaWJzd3NjYWxlLgorICovCitpbnQgZmZfc2NhbGVfaW1hZ2UodWludDhfdCAqZHN0X2RhdGFbNF0sIGludCBkc3RfbGluZXNpemVbNF0sCisgICAgICAgICAgICAgICAgICAgaW50IGRzdF93LCBpbnQgZHN0X2gsIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RfcGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90ICpjb25zdCBzcmNfZGF0YVs0XSwgaW50IHNyY19saW5lc2l6ZVs0XSwKKyAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3csIGludCBzcmNfaCwgZW51bSBBVlBpeGVsRm9ybWF0IHNyY19waXhfZm10LAorICAgICAgICAgICAgICAgICAgIHZvaWQgKmxvZ19jdHgpOworCisjZW5kaWYgIC8qIEFWRklMVEVSX0xTV1NVVElMU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvb3BlbmNsX2FsbGtlcm5lbHMuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9vcGVuY2xfYWxsa2VybmVscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODBmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvb3BlbmNsX2FsbGtlcm5lbHMuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFdlaSBHYW8gPHdlaWdhb0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgIm9wZW5jbF9hbGxrZXJuZWxzLmgiCisjaWYgQ09ORklHX09QRU5DTAorI2luY2x1ZGUgImxpYmF2dXRpbC9vcGVuY2wuaCIKKyNpbmNsdWRlICJkZXNoYWtlX29wZW5jbF9rZXJuZWwuaCIKKyNpbmNsdWRlICJ1bnNoYXJwX29wZW5jbF9rZXJuZWwuaCIKKyNlbmRpZgorCisjZGVmaW5lIE9QRU5DTF9SRUdJU1RFUl9LRVJORUxfQ09ERShYLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChDT05GSUdfIyNYIyNfRklMVEVSKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9vcGVuY2xfcmVnaXN0ZXJfa2VybmVsX2NvZGUoZmZfa2VybmVsXyMjeCMjX29wZW5jbCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCit2b2lkIGZmX29wZW5jbF9yZWdpc3Rlcl9maWx0ZXJfa2VybmVsX2NvZGVfYWxsKHZvaWQpCit7CisgI2lmIENPTkZJR19PUEVOQ0wKKyAgIE9QRU5DTF9SRUdJU1RFUl9LRVJORUxfQ09ERShERVNIQUtFLCAgICAgZGVzaGFrZSk7CisgICBPUEVOQ0xfUkVHSVNURVJfS0VSTkVMX0NPREUoVU5TSEFSUCwgICAgIHVuc2hhcnApOworICNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL29wZW5jbF9hbGxrZXJuZWxzLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvb3BlbmNsX2FsbGtlcm5lbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2EwMmUwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL29wZW5jbF9hbGxrZXJuZWxzLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBXZWkgR2FvIDx3ZWlnYW9AbXVsdGljb3Jld2FyZWluYy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfT1BFTkNMX0FMTEtFUk5FTF9ICisjZGVmaW5lIEFWRklMVEVSX09QRU5DTF9BTExLRVJORUxfSAorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKwordm9pZCBmZl9vcGVuY2xfcmVnaXN0ZXJfZmlsdGVyX2tlcm5lbF9jb2RlX2FsbCh2b2lkKTsKKworI2VuZGlmIC8qIEFWRklMVEVSX09QRU5DTF9BTExLRVJORUxfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3B0aHJlYWQuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci9wdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwYjNiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9wdGhyZWFkLmMKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIExpYmF2ZmlsdGVyIG11bHRpdGhyZWFkaW5nIHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKworI2lmIEhBVkVfUFRIUkVBRFMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZWxpZiBIQVZFX09TMlRIUkVBRFMKKyNpbmNsdWRlICJjb21wYXQvb3MydGhyZWFkcy5oIgorI2VsaWYgSEFWRV9XMzJUSFJFQURTCisjaW5jbHVkZSAiY29tcGF0L3czMnB0aHJlYWRzLmgiCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgVGhyZWFkQ29udGV4dCB7CisgICAgQVZGaWx0ZXJHcmFwaCAqZ3JhcGg7CisKKyAgICBpbnQgbmJfdGhyZWFkczsKKyAgICBwdGhyZWFkX3QgKndvcmtlcnM7CisgICAgYXZmaWx0ZXJfYWN0aW9uX2Z1bmMgKmZ1bmM7CisKKyAgICAvKiBwZXItZXhlY3V0ZSBwZXJhbWV0ZXJzICovCisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHg7CisgICAgdm9pZCAqYXJnOworICAgIGludCAgICpyZXRzOworICAgIGludCBuYl9yZXRzOworICAgIGludCBuYl9qb2JzOworCisgICAgcHRocmVhZF9jb25kX3QgbGFzdF9qb2JfY29uZDsKKyAgICBwdGhyZWFkX2NvbmRfdCBjdXJyZW50X2pvYl9jb25kOworICAgIHB0aHJlYWRfbXV0ZXhfdCBjdXJyZW50X2pvYl9sb2NrOworICAgIGludCBjdXJyZW50X2pvYjsKKyAgICB1bnNpZ25lZCBpbnQgY3VycmVudF9leGVjdXRlOworICAgIGludCBkb25lOworfSBUaHJlYWRDb250ZXh0OworCitzdGF0aWMgdm9pZCogYXR0cmlidXRlX2FsaWduX2FyZyB3b3JrZXIodm9pZCAqdikKK3sKKyAgICBUaHJlYWRDb250ZXh0ICpjID0gdjsKKyAgICBpbnQgb3VyX2pvYiAgICAgID0gYy0+bmJfam9iczsKKyAgICBpbnQgbmJfdGhyZWFkcyAgID0gYy0+bmJfdGhyZWFkczsKKyAgICB1bnNpZ25lZCBpbnQgbGFzdF9leGVjdXRlID0gMDsKKyAgICBpbnQgc2VsZl9pZDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7CisgICAgc2VsZl9pZCA9IGMtPmN1cnJlbnRfam9iKys7CisgICAgZm9yICg7OykgeworICAgICAgICB3aGlsZSAob3VyX2pvYiA+PSBjLT5uYl9qb2JzKSB7CisgICAgICAgICAgICBpZiAoYy0+Y3VycmVudF9qb2IgPT0gbmJfdGhyZWFkcyArIGMtPm5iX2pvYnMpCisgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmYy0+bGFzdF9qb2JfY29uZCk7CisKKyAgICAgICAgICAgIHdoaWxlIChsYXN0X2V4ZWN1dGUgPT0gYy0+Y3VycmVudF9leGVjdXRlICYmICFjLT5kb25lKQorICAgICAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZjLT5jdXJyZW50X2pvYl9jb25kLCAmYy0+Y3VycmVudF9qb2JfbG9jayk7CisgICAgICAgICAgICBsYXN0X2V4ZWN1dGUgPSBjLT5jdXJyZW50X2V4ZWN1dGU7CisgICAgICAgICAgICBvdXJfam9iID0gc2VsZl9pZDsKKworICAgICAgICAgICAgaWYgKGMtPmRvbmUpIHsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOworCisgICAgICAgIGMtPnJldHNbb3VyX2pvYiAlIGMtPm5iX3JldHNdID0gYy0+ZnVuYyhjLT5jdHgsIGMtPmFyZywgb3VyX2pvYiwgYy0+bmJfam9icyk7CisKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjLT5jdXJyZW50X2pvYl9sb2NrKTsKKyAgICAgICAgb3VyX2pvYiA9IGMtPmN1cnJlbnRfam9iKys7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzbGljZV90aHJlYWRfdW5pbml0KFRocmVhZENvbnRleHQgKmMpCit7CisgICAgaW50IGk7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOworICAgIGMtPmRvbmUgPSAxOworICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJmMtPmN1cnJlbnRfam9iX2NvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjLT5jdXJyZW50X2pvYl9sb2NrKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uYl90aHJlYWRzOyBpKyspCisgICAgICAgICBwdGhyZWFkX2pvaW4oYy0+d29ya2Vyc1tpXSwgTlVMTCk7CisKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmMtPmN1cnJlbnRfam9iX2xvY2spOworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZjLT5jdXJyZW50X2pvYl9jb25kKTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmYy0+bGFzdF9qb2JfY29uZCk7CisgICAgYXZfZnJlZXAoJmMtPndvcmtlcnMpOworfQorCitzdGF0aWMgdm9pZCBzbGljZV90aHJlYWRfcGFya193b3JrZXJzKFRocmVhZENvbnRleHQgKmMpCit7CisgICAgd2hpbGUgKGMtPmN1cnJlbnRfam9iICE9IGMtPm5iX3RocmVhZHMgKyBjLT5uYl9qb2JzKQorICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmYy0+bGFzdF9qb2JfY29uZCwgJmMtPmN1cnJlbnRfam9iX2xvY2spOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjLT5jdXJyZW50X2pvYl9sb2NrKTsKK30KKworc3RhdGljIGludCB0aHJlYWRfZXhlY3V0ZShBVkZpbHRlckNvbnRleHQgKmN0eCwgYXZmaWx0ZXJfYWN0aW9uX2Z1bmMgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZywgaW50ICpyZXQsIGludCBuYl9qb2JzKQoreworICAgIFRocmVhZENvbnRleHQgKmMgPSBjdHgtPmdyYXBoLT5pbnRlcm5hbC0+dGhyZWFkOworICAgIGludCBkdW1teV9yZXQ7CisKKyAgICBpZiAobmJfam9icyA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7CisKKyAgICBjLT5jdXJyZW50X2pvYiA9IGMtPm5iX3RocmVhZHM7CisgICAgYy0+bmJfam9icyAgICAgPSBuYl9qb2JzOworICAgIGMtPmN0eCAgICAgICAgID0gY3R4OworICAgIGMtPmFyZyAgICAgICAgID0gYXJnOworICAgIGMtPmZ1bmMgICAgICAgID0gZnVuYzsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGMtPnJldHMgICAgPSByZXQ7CisgICAgICAgIGMtPm5iX3JldHMgPSBuYl9qb2JzOworICAgIH0gZWxzZSB7CisgICAgICAgIGMtPnJldHMgICAgPSAmZHVtbXlfcmV0OworICAgICAgICBjLT5uYl9yZXRzID0gMTsKKyAgICB9CisgICAgYy0+Y3VycmVudF9leGVjdXRlKys7CisKKyAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZjLT5jdXJyZW50X2pvYl9jb25kKTsKKworICAgIHNsaWNlX3RocmVhZF9wYXJrX3dvcmtlcnMoYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aHJlYWRfaW5pdF9pbnRlcm5hbChUaHJlYWRDb250ZXh0ICpjLCBpbnQgbmJfdGhyZWFkcykKK3sKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKCFuYl90aHJlYWRzKSB7CisgICAgICAgIGludCBuYl9jcHVzID0gYXZfY3B1X2NvdW50KCk7CisgICAgICAgIC8vIHVzZSBudW1iZXIgb2YgY29yZXMgKyAxIGFzIHRocmVhZCBjb3VudCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCisgICAgICAgIGlmIChuYl9jcHVzID4gMSkKKyAgICAgICAgICAgIG5iX3RocmVhZHMgPSBuYl9jcHVzICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbmJfdGhyZWFkcyA9IDE7CisgICAgfQorCisgICAgaWYgKG5iX3RocmVhZHMgPD0gMSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBjLT5uYl90aHJlYWRzID0gbmJfdGhyZWFkczsKKyAgICBjLT53b3JrZXJzID0gYXZfbWFsbG9jel9hcnJheShzaXplb2YoKmMtPndvcmtlcnMpLCBuYl90aHJlYWRzKTsKKyAgICBpZiAoIWMtPndvcmtlcnMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBjLT5jdXJyZW50X2pvYiA9IDA7CisgICAgYy0+bmJfam9icyAgICAgPSAwOworICAgIGMtPmRvbmUgICAgICAgID0gMDsKKworICAgIHB0aHJlYWRfY29uZF9pbml0KCZjLT5jdXJyZW50X2pvYl9jb25kLCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmYy0+bGFzdF9qb2JfY29uZCwgICAgTlVMTCk7CisKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmMtPmN1cnJlbnRfam9iX2xvY2ssIE5VTEwpOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7CisgICAgZm9yIChpID0gMDsgaSA8IG5iX3RocmVhZHM7IGkrKykgeworICAgICAgICByZXQgPSBwdGhyZWFkX2NyZWF0ZSgmYy0+d29ya2Vyc1tpXSwgTlVMTCwgd29ya2VyLCBjKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7CisgICAgICAgICAgIGMtPm5iX3RocmVhZHMgPSBpOworICAgICAgICAgICBzbGljZV90aHJlYWRfdW5pbml0KGMpOworICAgICAgICAgICByZXR1cm4gQVZFUlJPUihyZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgc2xpY2VfdGhyZWFkX3Bhcmtfd29ya2VycyhjKTsKKworICAgIHJldHVybiBjLT5uYl90aHJlYWRzOworfQorCitpbnQgZmZfZ3JhcGhfdGhyZWFkX2luaXQoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgpCit7CisgICAgaW50IHJldDsKKworI2lmIEhBVkVfVzMyVEhSRUFEUworICAgIHczMnRocmVhZF9pbml0KCk7CisjZW5kaWYKKworICAgIGlmIChncmFwaC0+bmJfdGhyZWFkcyA9PSAxKSB7CisgICAgICAgIGdyYXBoLT50aHJlYWRfdHlwZSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGdyYXBoLT5pbnRlcm5hbC0+dGhyZWFkID0gYXZfbWFsbG9jeihzaXplb2YoVGhyZWFkQ29udGV4dCkpOworICAgIGlmICghZ3JhcGgtPmludGVybmFsLT50aHJlYWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXQgPSB0aHJlYWRfaW5pdF9pbnRlcm5hbChncmFwaC0+aW50ZXJuYWwtPnRocmVhZCwgZ3JhcGgtPm5iX3RocmVhZHMpOworICAgIGlmIChyZXQgPD0gMSkgeworICAgICAgICBhdl9mcmVlcCgmZ3JhcGgtPmludGVybmFsLT50aHJlYWQpOworICAgICAgICBncmFwaC0+dGhyZWFkX3R5cGUgPSAwOworICAgICAgICBncmFwaC0+bmJfdGhyZWFkcyAgPSAxOworICAgICAgICByZXR1cm4gKHJldCA8IDApID8gcmV0IDogMDsKKyAgICB9CisgICAgZ3JhcGgtPm5iX3RocmVhZHMgPSByZXQ7CisKKyAgICBncmFwaC0+aW50ZXJuYWwtPnRocmVhZF9leGVjdXRlID0gdGhyZWFkX2V4ZWN1dGU7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl9ncmFwaF90aHJlYWRfZnJlZShBVkZpbHRlckdyYXBoICpncmFwaCkKK3sKKyAgICBpZiAoZ3JhcGgtPmludGVybmFsLT50aHJlYWQpCisgICAgICAgIHNsaWNlX3RocmVhZF91bmluaXQoZ3JhcGgtPmludGVybmFsLT50aHJlYWQpOworICAgIGF2X2ZyZWVwKCZncmFwaC0+aW50ZXJuYWwtPnRocmVhZCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvc2V0cHRzLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvc2V0cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiMDdmYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci9zZXRwdHMuYwpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTdGVmYW5vIFNhYmF0aW5pCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmljdG9yIFBhZXNhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHZpZGVvIHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgKFBUUykgbW9kaWZpY2F0aW9uIGZpbHRlcgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFyX25hbWVzW10gPSB7CisgICAgIkZSQU1FX1JBVEUiLCAgLy8vPCBkZWZpbmVkIG9ubHkgZm9yIGNvbnN0YW50IGZyYW1lLXJhdGUgdmlkZW8KKyAgICAiSU5URVJMQUNFRCIsICAvLy88IHRlbGwgaWYgdGhlIGN1cnJlbnQgZnJhbWUgaXMgaW50ZXJsYWNlZAorICAgICJOIiwgICAgICAgICAgIC8vLzwgZnJhbWUgLyBzYW1wbGUgbnVtYmVyIChzdGFydGluZyBhdCB6ZXJvKQorICAgICJOQl9DT05TVU1FRF9TQU1QTEVTIiwgLy8vPCBudW1iZXIgb2Ygc2FtcGxlcyBjb25zdW1lZCBieSB0aGUgZmlsdGVyIChvbmx5IGF1ZGlvKQorICAgICJOQl9TQU1QTEVTIiwgIC8vLzwgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGN1cnJlbnQgZnJhbWUgKG9ubHkgYXVkaW8pCisgICAgIlBPUyIsICAgICAgICAgLy8vPCBvcmlnaW5hbCBwb3NpdGlvbiBpbiB0aGUgZmlsZSBvZiB0aGUgZnJhbWUKKyAgICAiUFJFVl9JTlBUUyIsICAvLy88IHByZXZpb3VzICBpbnB1dCBQVFMKKyAgICAiUFJFVl9JTlQiLCAgICAvLy88IHByZXZpb3VzICBpbnB1dCB0aW1lIGluIHNlY29uZHMKKyAgICAiUFJFVl9PVVRQVFMiLCAvLy88IHByZXZpb3VzIG91dHB1dCBQVFMKKyAgICAiUFJFVl9PVVRUIiwgICAvLy88IHByZXZpb3VzIG91dHB1dCB0aW1lIGluIHNlY29uZHMKKyAgICAiUFRTIiwgICAgICAgICAvLy88IG9yaWdpbmFsIHB0cyBpbiB0aGUgZmlsZSBvZiB0aGUgZnJhbWUKKyAgICAiU0FNUExFX1JBVEUiLCAvLy88IHNhbXBsZSByYXRlIChvbmx5IGF1ZGlvKQorICAgICJTVEFSVFBUUyIsICAgIC8vLzwgUFRTIGF0IHN0YXJ0IG9mIG1vdmllCisgICAgIlNUQVJUVCIsICAgICAgLy8vPCB0aW1lIGF0IHN0YXJ0IG9mIG1vdmllCisgICAgIlQiLCAgICAgICAgICAgLy8vPCBvcmlnaW5hbCB0aW1lIGluIHRoZSBmaWxlIG9mIHRoZSBmcmFtZQorICAgICJUQiIsICAgICAgICAgIC8vLzwgdGltZWJhc2UKKyAgICAiUlRDVElNRSIsICAgICAvLy88IHdhbGxjbG9jayAoUlRDKSB0aW1lIGluIG1pY3JvIHNlY29uZHMKKyAgICAiUlRDU1RBUlQiLCAgICAvLy88IHdhbGxjbG9jayAoUlRDKSB0aW1lIGF0IHRoZSBzdGFydCBvZiB0aGUgbW92aWUgaW4gbWljcm8gc2Vjb25kcworICAgICJTIiwgICAgICAgICAgIC8vICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGN1cnJlbnQgZnJhbWUKKyAgICAiU1IiLCAgICAgICAgICAvLyAgIEF1ZGlvIHNhbXBsZSByYXRlCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX0ZSQU1FX1JBVEUsCisgICAgVkFSX0lOVEVSTEFDRUQsCisgICAgVkFSX04sCisgICAgVkFSX05CX0NPTlNVTUVEX1NBTVBMRVMsCisgICAgVkFSX05CX1NBTVBMRVMsCisgICAgVkFSX1BPUywKKyAgICBWQVJfUFJFVl9JTlBUUywKKyAgICBWQVJfUFJFVl9JTlQsCisgICAgVkFSX1BSRVZfT1VUUFRTLAorICAgIFZBUl9QUkVWX09VVFQsCisgICAgVkFSX1BUUywKKyAgICBWQVJfU0FNUExFX1JBVEUsCisgICAgVkFSX1NUQVJUUFRTLAorICAgIFZBUl9TVEFSVFQsCisgICAgVkFSX1QsCisgICAgVkFSX1RCLAorICAgIFZBUl9SVENUSU1FLAorICAgIFZBUl9SVENTVEFSVCwKKyAgICBWQVJfUywKKyAgICBWQVJfU1IsCisgICAgVkFSX1ZBUlNfTkIKK307CisKK3R5cGVkZWYgc3RydWN0IFNldFBUU0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGNoYXIgKmV4cHJfc3RyOworICAgIEFWRXhwciAqZXhwcjsKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJfVkFSU19OQl07CisgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlOworfSBTZXRQVFNDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTZXRQVFNDb250ZXh0ICpzZXRwdHMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gYXZfZXhwcl9wYXJzZSgmc2V0cHRzLT5leHByLCBzZXRwdHMtPmV4cHJfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCkpIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciB3aGlsZSBwYXJzaW5nIGV4cHJlc3Npb24gJyVzJ1xuIiwgc2V0cHRzLT5leHByX3N0cik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9OXSAgICAgICAgICAgPSAwLjA7CisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9TXSAgICAgICAgICAgPSAwLjA7CisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9QUkVWX0lOUFRTXSAgPSBOQU47CisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9QUkVWX0lOVF0gICAgPSBOQU47CisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9QUkVWX09VVFBUU10gPSBOQU47CisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9QUkVWX09VVFRdICAgPSBOQU47CisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9TVEFSVFBUU10gICAgPSBOQU47CisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9TVEFSVFRdICAgICAgPSBOQU47CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgU2V0UFRTQ29udGV4dCAqc2V0cHRzID0gY3R4LT5wcml2OworCisgICAgc2V0cHRzLT50eXBlID0gaW5saW5rLT50eXBlOworICAgIHNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfVEJdID0gYXZfcTJkKGlubGluay0+dGltZV9iYXNlKTsKKyAgICBzZXRwdHMtPnZhcl92YWx1ZXNbVkFSX1JUQ1NUQVJUXSA9IGF2X2dldHRpbWUoKTsKKworICAgIHNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfU1JdID0KKyAgICBzZXRwdHMtPnZhcl92YWx1ZXNbVkFSX1NBTVBMRV9SQVRFXSA9CisgICAgICAgIHNldHB0cy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gPyBpbmxpbmstPnNhbXBsZV9yYXRlIDogTkFOOworCisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9GUkFNRV9SQVRFXSA9IGlubGluay0+ZnJhbWVfcmF0ZS5udW0gJiYgaW5saW5rLT5mcmFtZV9yYXRlLmRlbiA/CisgICAgICAgIGF2X3EyZChpbmxpbmstPmZyYW1lX3JhdGUpIDogTkFOOworCisgICAgYXZfbG9nKGlubGluay0+c3JjLCBBVl9MT0dfVkVSQk9TRSwgIlRCOiVmIEZSQU1FX1JBVEU6JWYgU0FNUExFX1JBVEU6JWZcbiIsCisgICAgICAgICAgIHNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfVEJdLAorICAgICAgICAgICBzZXRwdHMtPnZhcl92YWx1ZXNbVkFSX0ZSQU1FX1JBVEVdLAorICAgICAgICAgICBzZXRwdHMtPnZhcl92YWx1ZXNbVkFSX1NBTVBMRV9SQVRFXSk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRDJUUyhkKSAgKGlzbmFuKGQpID8gQVZfTk9QVFNfVkFMVUUgOiAoaW50NjRfdCkoZCkpCisjZGVmaW5lIFRTMkQodHMpICgodHMpID09IEFWX05PUFRTX1ZBTFVFID8gTkFOIDogKGRvdWJsZSkodHMpKQorI2RlZmluZSBUUzJUKHRzLCB0YikgKCh0cykgPT0gQVZfTk9QVFNfVkFMVUUgPyBOQU4gOiAoZG91YmxlKSh0cykqYXZfcTJkKHRiKSkKKworI2RlZmluZSBCVUZfU0laRSA2NAorCitzdGF0aWMgaW5saW5lIGNoYXIgKmRvdWJsZTJpbnQ2NHN0cihjaGFyICpidWYsIGRvdWJsZSB2KQoreworICAgIGlmIChpc25hbih2KSkgc25wcmludGYoYnVmLCBCVUZfU0laRSwgIm5hbiIpOworICAgIGVsc2UgICAgICAgICAgc25wcmludGYoYnVmLCBCVUZfU0laRSwgIiUiUFJJZDY0LCAoaW50NjRfdCl2KTsKKyAgICByZXR1cm4gYnVmOworfQorCisjZGVmaW5lIGQyaXN0cih2KSBkb3VibGUyaW50NjRzdHIoKGNoYXJbQlVGX1NJWkVdKXswfSwgdikKKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIFNldFBUU0NvbnRleHQgKnNldHB0cyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGludDY0X3QgaW5fcHRzID0gZnJhbWUtPnB0czsKKyAgICBkb3VibGUgZDsKKworICAgIGlmIChpc25hbihzZXRwdHMtPnZhcl92YWx1ZXNbVkFSX1NUQVJUUFRTXSkpIHsKKyAgICAgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9TVEFSVFBUU10gPSBUUzJEKGZyYW1lLT5wdHMpOworICAgICAgICBzZXRwdHMtPnZhcl92YWx1ZXNbVkFSX1NUQVJUVCAgXSA9IFRTMlQoZnJhbWUtPnB0cywgaW5saW5rLT50aW1lX2Jhc2UpOworICAgIH0KKyAgICBzZXRwdHMtPnZhcl92YWx1ZXNbVkFSX1BUUyAgICAgICBdID0gVFMyRChmcmFtZS0+cHRzKTsKKyAgICBzZXRwdHMtPnZhcl92YWx1ZXNbVkFSX1QgICAgICAgICBdID0gVFMyVChmcmFtZS0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSk7CisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9QT1MgICAgICAgXSA9IGF2X2ZyYW1lX2dldF9wa3RfcG9zKGZyYW1lKSA9PSAtMSA/IE5BTiA6IGF2X2ZyYW1lX2dldF9wa3RfcG9zKGZyYW1lKTsKKyAgICBzZXRwdHMtPnZhcl92YWx1ZXNbVkFSX1JUQ1RJTUUgICBdID0gYXZfZ2V0dGltZSgpOworCisgICAgaWYgKGlubGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9JTlRFUkxBQ0VEXSA9IGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lOworICAgIH0gZWxzZSBpZiAoaW5saW5rLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBzZXRwdHMtPnZhcl92YWx1ZXNbVkFSX1NdID0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgICAgIHNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfTkJfU0FNUExFU10gPSBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICB9CisKKyAgICBkID0gYXZfZXhwcl9ldmFsKHNldHB0cy0+ZXhwciwgc2V0cHRzLT52YXJfdmFsdWVzLCBOVUxMKTsKKyAgICBmcmFtZS0+cHRzID0gRDJUUyhkKTsKKworICAgIGF2X2Rsb2coaW5saW5rLT5kc3QsCisgICAgICAgICAgICAiTjolIlBSSWQ2NCIgUFRTOiVzIFQ6JWYgUE9TOiVzIiwKKyAgICAgICAgICAgIChpbnQ2NF90KXNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfTl0sCisgICAgICAgICAgICBkMmlzdHIoc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9QVFNdKSwKKyAgICAgICAgICAgIHNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfVF0sCisgICAgICAgICAgICBkMmlzdHIoc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9QT1NdKSk7CisgICAgc3dpdGNoIChpbmxpbmstPnR5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgYXZfZGxvZyhpbmxpbmstPmRzdCwgIiBJTlRFUkxBQ0VEOiUiUFJJZDY0LAorICAgICAgICAgICAgICAgIChpbnQ2NF90KXNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfSU5URVJMQUNFRF0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgYXZfZGxvZyhpbmxpbmstPmRzdCwgIiBOQl9TQU1QTEVTOiUiUFJJZDY0IiBOQl9DT05TVU1FRF9TQU1QTEVTOiUiUFJJZDY0LAorICAgICAgICAgICAgICAgIChpbnQ2NF90KXNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfTkJfU0FNUExFU10sCisgICAgICAgICAgICAgICAgKGludDY0X3Qpc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9OQl9DT05TVU1FRF9TQU1QTEVTXSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBhdl9kbG9nKGlubGluay0+ZHN0LCAiIC0+IFBUUzolcyBUOiVmXG4iLCBkMmlzdHIoZCksIFRTMlQoZCwgaW5saW5rLT50aW1lX2Jhc2UpKTsKKworICAgIGlmIChpbmxpbmstPnR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIHNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfTl0gKz0gMS4wOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfTl0gKz0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgfQorCisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9QUkVWX0lOUFRTIF0gPSBUUzJEKGluX3B0cyk7CisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9QUkVWX0lOVCAgIF0gPSBUUzJUKGluX3B0cywgaW5saW5rLT50aW1lX2Jhc2UpOworICAgIHNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfUFJFVl9PVVRQVFNdID0gVFMyRChmcmFtZS0+cHRzKTsKKyAgICBzZXRwdHMtPnZhcl92YWx1ZXNbVkFSX1BSRVZfT1VUVF0gICA9IFRTMlQoZnJhbWUtPnB0cywgaW5saW5rLT50aW1lX2Jhc2UpOworICAgIGlmIChzZXRwdHMtPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIHNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfTkJfQ09OU1VNRURfU0FNUExFU10gKz0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgfQorICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoaW5saW5rLT5kc3QtPm91dHB1dHNbMF0sIGZyYW1lKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU2V0UFRTQ29udGV4dCAqc2V0cHRzID0gY3R4LT5wcml2OworICAgIGF2X2V4cHJfZnJlZShzZXRwdHMtPmV4cHIpOworICAgIHNldHB0cy0+ZXhwciA9IE5VTEw7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNldFBUU0NvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiZXhwciIsICJFeHByZXNzaW9uIGRldGVybWluaW5nIHRoZSBmcmFtZSB0aW1lc3RhbXAiLCBPRkZTRVQoZXhwcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJQVFMiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNpZiBDT05GSUdfU0VUUFRTX0ZJTFRFUgorI2RlZmluZSBzZXRwdHNfb3B0aW9ucyBvcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moc2V0cHRzKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX3NldHB0c19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX3NldHB0c19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfc2V0cHRzID0geworICAgIC5uYW1lICAgICAgPSAic2V0cHRzIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2V0IFBUUyBmb3IgdGhlIG91dHB1dCB2aWRlbyBmcmFtZS4iKSwKKyAgICAuaW5pdCAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgID0gdW5pbml0LAorCisgICAgLnByaXZfc2l6ZSA9IHNpemVvZihTZXRQVFNDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyA9ICZzZXRwdHNfY2xhc3MsCisKKyAgICAuaW5wdXRzICAgID0gYXZmaWx0ZXJfdmZfc2V0cHRzX2lucHV0cywKKyAgICAub3V0cHV0cyAgID0gYXZmaWx0ZXJfdmZfc2V0cHRzX291dHB1dHMsCit9OworI2VuZGlmIC8qIENPTkZJR19TRVRQVFNfRklMVEVSICovCisKKyNpZiBDT05GSUdfQVNFVFBUU19GSUxURVIKKworI2RlZmluZSBhc2V0cHRzX29wdGlvbnMgb3B0aW9ucworQVZGSUxURVJfREVGSU5FX0NMQVNTKGFzZXRwdHMpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXNldHB0c19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFzZXRwdHNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2FzZXRwdHMgPSB7CisgICAgLm5hbWUgICAgICAgID0gImFzZXRwdHMiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTZXQgUFRTIGZvciB0aGUgb3V0cHV0IGF1ZGlvIGZyYW1lLiIpLAorICAgIC5pbml0ICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgID0gdW5pbml0LAorICAgIC5wcml2X3NpemUgICA9IHNpemVvZihTZXRQVFNDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgPSAmYXNldHB0c19jbGFzcywKKyAgICAuaW5wdXRzICAgICAgPSBhc2V0cHRzX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgPSBhc2V0cHRzX291dHB1dHMsCit9OworI2VuZGlmIC8qIENPTkZJR19BU0VUUFRTX0ZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3NldHRiLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvc2V0dGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzYxNmMxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3NldHRiLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTZXQgdGltZWJhc2UgZm9yIHRoZSBvdXRwdXQgbGluay4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhdGlvbmFsLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJBVlRCIiwgICAvKiBkZWZhdWx0IHRpbWViYXNlIDEvQVZfVElNRV9CQVNFICovCisgICAgImludGIiLCAgIC8qIGlucHV0IHRpbWViYXNlICovCisgICAgInNyIiwgICAgIC8qIHNhbXBsZSByYXRlICovCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX0FWVEIsCisgICAgVkFSX0lOVEIsCisgICAgVkFSX1NSLAorICAgIFZBUl9WQVJTX05CCit9OworCit0eXBlZGVmIHN0cnVjdCBTZXRUQkNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGNoYXIgKnRiX2V4cHI7CisgICAgZG91YmxlIHZhcl92YWx1ZXNbVkFSX1ZBUlNfTkJdOworfSBTZXRUQkNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNldFRCQ29udGV4dCwgeCkKKyNkZWZpbmUgREVGSU5FX09QVElPTlMoZmlsdF9uYW1lLCBmaWx0X3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZmlsdF9uYW1lIyNfb3B0aW9uc1tdID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgImV4cHIiLCAic2V0IGV4cHJlc3Npb24gZGV0ZXJtaW5pbmcgdGhlIG91dHB1dCB0aW1lYmFzZSIsIE9GRlNFVCh0Yl9leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iaW50YiJ9LCBcCisgICAgICAgICAgIC5mbGFncz1BVl9PUFRfRkxBR18jI2ZpbHRfdHlwZSMjX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSB9LCAgICAgICAgICAgXAorICAgIHsgInRiIiwgICAic2V0IGV4cHJlc3Npb24gZGV0ZXJtaW5pbmcgdGhlIG91dHB1dCB0aW1lYmFzZSIsIE9GRlNFVCh0Yl9leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iaW50YiJ9LCBcCisgICAgICAgICAgIC5mbGFncz1BVl9PUFRfRkxBR18jI2ZpbHRfdHlwZSMjX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSB9LCAgICAgICAgICAgXAorICAgIHsgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0X3Byb3BzKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBTZXRUQkNvbnRleHQgKnNldHRiID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7CisgICAgaW50IHJldDsKKyAgICBkb3VibGUgcmVzOworCisgICAgc2V0dGItPnZhcl92YWx1ZXNbVkFSX0FWVEJdID0gYXZfcTJkKEFWX1RJTUVfQkFTRV9RKTsKKyAgICBzZXR0Yi0+dmFyX3ZhbHVlc1tWQVJfSU5UQl0gPSBhdl9xMmQoaW5saW5rLT50aW1lX2Jhc2UpOworICAgIHNldHRiLT52YXJfdmFsdWVzW1ZBUl9TUl0gICA9IGlubGluay0+c2FtcGxlX3JhdGU7CisKKyAgICBvdXRsaW5rLT53ID0gaW5saW5rLT53OworICAgIG91dGxpbmstPmggPSBpbmxpbmstPmg7CisKKyAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgc2V0dGItPnRiX2V4cHIsIHZhcl9uYW1lcywgc2V0dGItPnZhcl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIE5VTEwpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBleHByZXNzaW9uICclcycgZm9yIHRpbWViYXNlLlxuIiwgc2V0dGItPnRiX2V4cHIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICB0aW1lX2Jhc2UgPSBhdl9kMnEocmVzLCBJTlRfTUFYKTsKKyAgICBpZiAodGltZV9iYXNlLm51bSA8PSAwIHx8IHRpbWVfYmFzZS5kZW4gPD0gMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBub24tcG9zaXRpdmUgdmFsdWVzIGZvciB0aGUgdGltZWJhc2UgbnVtOiVkIG9yIGRlbjolZC5cbiIsCisgICAgICAgICAgICAgICB0aW1lX2Jhc2UubnVtLCB0aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSB0aW1lX2Jhc2U7CisgICAgYXZfbG9nKG91dGxpbmstPnNyYywgQVZfTE9HX1ZFUkJPU0UsICJ0YjolZC8lZCAtPiB0YjolZC8lZFxuIiwKKyAgICAgICAgICAgaW5saW5rIC0+dGltZV9iYXNlLm51bSwgaW5saW5rIC0+dGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgb3V0bGluay0+dGltZV9iYXNlLm51bSwgb3V0bGluay0+dGltZV9iYXNlLmRlbik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworCisgICAgaWYgKGF2X2NtcF9xKGlubGluay0+dGltZV9iYXNlLCBvdXRsaW5rLT50aW1lX2Jhc2UpKSB7CisgICAgICAgIGludDY0X3Qgb3JpZ19wdHMgPSBmcmFtZS0+cHRzOworICAgICAgICBmcmFtZS0+cHRzID0gYXZfcmVzY2FsZV9xKGZyYW1lLT5wdHMsIGlubGluay0+dGltZV9iYXNlLCBvdXRsaW5rLT50aW1lX2Jhc2UpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJ0YjolZC8lZCBwdHM6JSJQUklkNjQiIC0+IHRiOiVkLyVkIHB0czolIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICBpbmxpbmsgLT50aW1lX2Jhc2UubnVtLCBpbmxpbmsgLT50aW1lX2Jhc2UuZGVuLCBvcmlnX3B0cywKKyAgICAgICAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZS5udW0sIG91dGxpbmstPnRpbWVfYmFzZS5kZW4sIGZyYW1lLT5wdHMpOworICAgIH0KKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZnJhbWUpOworfQorCisjaWYgQ09ORklHX1NFVFRCX0ZJTFRFUgorCitERUZJTkVfT1BUSU9OUyhzZXR0YiwgVklERU8pOworQVZGSUxURVJfREVGSU5FX0NMQVNTKHNldHRiKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX3NldHRiX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfc2V0dGJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19vdXRwdXRfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfc2V0dGIgPSB7CisgICAgLm5hbWUgICAgICAgID0gInNldHRiIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2V0IHRpbWViYXNlIGZvciB0aGUgdmlkZW8gb3V0cHV0IGxpbmsuIiksCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFNldFRCQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgID0gJnNldHRiX2NsYXNzLAorICAgIC5pbnB1dHMgICAgICA9IGF2ZmlsdGVyX3ZmX3NldHRiX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgPSBhdmZpbHRlcl92Zl9zZXR0Yl9vdXRwdXRzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfU0VUVEJfRklMVEVSICovCisKKyNpZiBDT05GSUdfQVNFVFRCX0ZJTFRFUgorCitERUZJTkVfT1BUSU9OUyhhc2V0dGIsIEFVRElPKTsKK0FWRklMVEVSX0RFRklORV9DTEFTUyhhc2V0dGIpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfYXNldHRiX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfYXNldHRiX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0X3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2FzZXR0YiA9IHsKKyAgICAubmFtZSAgICAgICAgPSAiYXNldHRiIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2V0IHRpbWViYXNlIGZvciB0aGUgYXVkaW8gb3V0cHV0IGxpbmsuIiksCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFNldFRCQ29udGV4dCksCisgICAgLmlucHV0cyAgICAgID0gYXZmaWx0ZXJfYWZfYXNldHRiX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgPSBhdmZpbHRlcl9hZl9hc2V0dGJfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgPSAmYXNldHRiX2NsYXNzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfQVNFVFRCX0ZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3NwbGl0LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvc3BsaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWJkNWVlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3NwbGl0LmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQm9iYnkgQmluZ2hhbQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBhdWRpbyBhbmQgdmlkZW8gc3BsaXR0ZXIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IFNwbGl0Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IG5iX291dHB1dHM7Cit9IFNwbGl0Q29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IHNwbGl0X2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU3BsaXRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX291dHB1dHM7IGkrKykgeworICAgICAgICBjaGFyIG5hbWVbMzJdOworICAgICAgICBBVkZpbHRlclBhZCBwYWQgPSB7IDAgfTsKKworICAgICAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJvdXRwdXQlZCIsIGkpOworICAgICAgICBwYWQudHlwZSA9IGN0eC0+ZmlsdGVyLT5pbnB1dHNbMF0udHlwZTsKKyAgICAgICAgcGFkLm5hbWUgPSBhdl9zdHJkdXAobmFtZSk7CisKKyAgICAgICAgZmZfaW5zZXJ0X291dHBhZChjdHgsIGksICZwYWQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHNwbGl0X3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX291dHB1dHM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+b3V0cHV0X3BhZHNbaV0ubmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIGludCBpLCByZXQgPSBBVkVSUk9SX0VPRjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX291dHB1dHM7IGkrKykgeworICAgICAgICBBVkZyYW1lICpidWZfb3V0OworCisgICAgICAgIGlmIChjdHgtPm91dHB1dHNbaV0tPmNsb3NlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBidWZfb3V0ID0gYXZfZnJhbWVfY2xvbmUoZnJhbWUpOworICAgICAgICBpZiAoIWJ1Zl9vdXQpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1tpXSwgYnVmX291dCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTcGxpdENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAib3V0cHV0cyIsICJzZXQgbnVtYmVyIG9mIG91dHB1dHMiLCBPRkZTRVQobmJfb3V0cHV0cyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMiB9LCAxLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCisjZGVmaW5lIHNwbGl0X29wdGlvbnMgb3B0aW9ucworQVZGSUxURVJfREVGSU5FX0NMQVNTKHNwbGl0KTsKKworI2RlZmluZSBhc3BsaXRfb3B0aW9ucyBvcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXNwbGl0KTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX3NwbGl0X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9zcGxpdCA9IHsKKyAgICAubmFtZSAgICAgICAgPSAic3BsaXQiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQYXNzIG9uIHRoZSBpbnB1dCB0byBOIHZpZGVvIG91dHB1dHMuIiksCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFNwbGl0Q29udGV4dCksCisgICAgLnByaXZfY2xhc3MgID0gJnNwbGl0X2NsYXNzLAorICAgIC5pbml0ICAgICAgICA9IHNwbGl0X2luaXQsCisgICAgLnVuaW5pdCAgICAgID0gc3BsaXRfdW5pbml0LAorICAgIC5pbnB1dHMgICAgICA9IGF2ZmlsdGVyX3ZmX3NwbGl0X2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgPSBOVUxMLAorICAgIC5mbGFncyAgICAgICA9IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19PVVRQVVRTLAorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2FzcGxpdF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfYXNwbGl0ID0geworICAgIC5uYW1lICAgICAgICA9ICJhc3BsaXQiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQYXNzIG9uIHRoZSBhdWRpbyBpbnB1dCB0byBOIGF1ZGlvIG91dHB1dHMuIiksCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFNwbGl0Q29udGV4dCksCisgICAgLnByaXZfY2xhc3MgID0gJmFzcGxpdF9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgPSBzcGxpdF9pbml0LAorICAgIC51bmluaXQgICAgICA9IHNwbGl0X3VuaW5pdCwKKyAgICAuaW5wdXRzICAgICAgPSBhdmZpbHRlcl9hZl9hc3BsaXRfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IE5VTEwsCisgICAgLmZsYWdzICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX09VVFBVVFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3NyY19tb3ZpZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3NyY19tb3ZpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOTdiODIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvc3JjX21vdmllLmMKQEAgLTAsMCArMSw2MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU3RlZmFubyBTYWJhdGluaQorICogQ29weXJpZ2h0IChjKSAyMDA4IFZpY3RvciBQYWVzYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBtb3ZpZSB2aWRlbyBzb3VyY2UKKyAqCisgKiBAdG9kbyB1c2UgZGlyZWN0IHJlbmRlcmluZyAobm8gYWxsb2NhdGlvbiBvZiBhIG5ldyBmcmFtZSkKKyAqIEB0b2RvIHN1cHBvcnQgYSBQVFMgY29ycmVjdGlvbiBtZWNoYW5pc20KKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lc3RhbXAuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgTW92aWVTdHJlYW0geworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgZG9uZTsKK30gTW92aWVTdHJlYW07CisKK3R5cGVkZWYgc3RydWN0IE1vdmllQ29udGV4dCB7CisgICAgLyogY29tbW9uIEEvViBmaWVsZHMgKi8KKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQ2NF90IHNlZWtfcG9pbnQ7ICAgLy8vPCBzZWVrcG9pbnQgaW4gbWljcm9zZWNvbmRzCisgICAgZG91YmxlIHNlZWtfcG9pbnRfZDsKKyAgICBjaGFyICpmb3JtYXRfbmFtZTsKKyAgICBjaGFyICpmaWxlX25hbWU7CisgICAgY2hhciAqc3RyZWFtX3NwZWNzOyAvKio8IHVzZXItcHJvdmlkZWQgbGlzdCBvZiBzdHJlYW1zLCBzZXBhcmF0ZWQgYnkgKyAqLworICAgIGludCBzdHJlYW1faW5kZXg7IC8qKjwgZm9yIGNvbXBhdGliaWxpdHkgKi8KKyAgICBpbnQgbG9vcF9jb3VudDsKKworICAgIEFWRm9ybWF0Q29udGV4dCAqZm9ybWF0X2N0eDsKKyAgICBpbnQgZW9mOworICAgIEFWUGFja2V0IHBrdCwgcGt0MDsKKworICAgIGludCBtYXhfc3RyZWFtX2luZGV4OyAvKio8IG1heCBzdHJlYW0gIyBhY3R1YWxseSB1c2VkIGZvciBvdXRwdXQgKi8KKyAgICBNb3ZpZVN0cmVhbSAqc3Q7IC8qKjwgYXJyYXkgb2YgYWxsIHN0cmVhbXMsIG9uZSBwZXIgb3V0cHV0ICovCisgICAgaW50ICpvdXRfaW5kZXg7IC8qKjwgc3RyZWFtIG51bWJlciAtPiBvdXRwdXQgbnVtYmVyIG1hcCwgb3IgLTEgKi8KK30gTW92aWVDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihNb3ZpZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSB8IEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG1vdmllX29wdGlvbnNbXT0geworICAgIHsgImZpbGVuYW1lIiwgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChmaWxlX25hbWUpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJmb3JtYXRfbmFtZSIsICAic2V0IGZvcm1hdCBuYW1lIiwgICAgICAgICBPRkZTRVQoZm9ybWF0X25hbWUpLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiZiIsICAgICAgICAgICAgInNldCBmb3JtYXQgbmFtZSIsICAgICAgICAgT0ZGU0VUKGZvcm1hdF9uYW1lKSwgIEFWX09QVF9UWVBFX1NUUklORywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInN0cmVhbV9pbmRleCIsICJzZXQgc3RyZWFtIGluZGV4IiwgICAgICAgIE9GRlNFVChzdHJlYW1faW5kZXgpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlRfTUFYLCAgICAgICAgICAgICAgICAgRkxBR1MgIH0sCisgICAgeyAic2kiLCAgICAgICAgICAgInNldCBzdHJlYW0gaW5kZXgiLCAgICAgICAgT0ZGU0VUKHN0cmVhbV9pbmRleCksIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsICAgICAgICAgICAgICAgICBGTEFHUyAgfSwKKyAgICB7ICJzZWVrX3BvaW50IiwgICAic2V0IHNlZWtwb2ludCAoc2Vjb25kcykiLCBPRkZTRVQoc2Vla19wb2ludF9kKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSAgMCB9LCAgMCwgKElOVDY0X01BWC0xKSAvIDEwMDAwMDAsIEZMQUdTIH0sCisgICAgeyAic3AiLCAgICAgICAgICAgInNldCBzZWVrcG9pbnQgKHNlY29uZHMpIiwgT0ZGU0VUKHNlZWtfcG9pbnRfZCksIEFWX09QVF9UWVBFX0RPVUJMRSwgeyAuZGJsID0gIDAgfSwgIDAsIChJTlQ2NF9NQVgtMSkgLyAxMDAwMDAwLCBGTEFHUyB9LAorICAgIHsgInN0cmVhbXMiLCAgICAgICJzZXQgc3RyZWFtcyIsICAgICAgICAgICAgIE9GRlNFVChzdHJlYW1fc3BlY3MpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIDB9LCAgQ0hBUl9NQVgsIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgInMiLCAgICAgICAgICAgICJzZXQgc3RyZWFtcyIsICAgICAgICAgICAgIE9GRlNFVChzdHJlYW1fc3BlY3MpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIDB9LCAgQ0hBUl9NQVgsIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImxvb3AiLCAgICAgICAgICJzZXQgbG9vcCBjb3VudCIsICAgICAgICAgIE9GRlNFVChsb29wX2NvdW50KSwgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gIDF9LCAgMCwgICAgICAgIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgaW50IG1vdmllX2NvbmZpZ19vdXRwdXRfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKTsKK3N0YXRpYyBpbnQgbW92aWVfcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspOworCitzdGF0aWMgQVZTdHJlYW0gKmZpbmRfc3RyZWFtKHZvaWQgKmxvZywgQVZGb3JtYXRDb250ZXh0ICphdmYsIGNvbnN0IGNoYXIgKnNwZWMpCit7CisgICAgaW50IGksIHJldCwgYWxyZWFkeSA9IDAsIHN0cmVhbV9pZCA9IC0xOworICAgIGNoYXIgdHlwZV9jaGFyWzJdLCBkdW1teTsKKyAgICBBVlN0cmVhbSAqZm91bmQgPSBOVUxMOworICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZTsKKworICAgIHJldCA9IHNzY2FuZihzcGVjLCAiZCUxW2F2XSVkJWMiLCB0eXBlX2NoYXIsICZzdHJlYW1faWQsICZkdW1teSk7CisgICAgaWYgKHJldCA+PSAxICYmIHJldCA8PSAyKSB7CisgICAgICAgIHR5cGUgPSB0eXBlX2NoYXJbMF0gPT0gJ3YnID8gQVZNRURJQV9UWVBFX1ZJREVPIDogQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICByZXQgPSBhdl9maW5kX2Jlc3Rfc3RyZWFtKGF2ZiwgdHlwZSwgc3RyZWFtX2lkLCAtMSwgTlVMTCwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nLCBBVl9MT0dfRVJST1IsICJObyAlcyBzdHJlYW0gd2l0aCBpbmRleCAnJWQnIGZvdW5kXG4iLAorICAgICAgICAgICAgICAgICAgIGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyh0eXBlKSwgc3RyZWFtX2lkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdmYtPnN0cmVhbXNbcmV0XTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGF2Zi0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHJldCA9IGF2Zm9ybWF0X21hdGNoX3N0cmVhbV9zcGVjaWZpZXIoYXZmLCBhdmYtPnN0cmVhbXNbaV0sIHNwZWMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHN0cmVhbSBzcGVjaWZpZXIgXCIlc1wiXG4iLCBzcGVjKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICghcmV0KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChhdmYtPnN0cmVhbXNbaV0tPmRpc2NhcmQgIT0gQVZESVNDQVJEX0FMTCkgeworICAgICAgICAgICAgYWxyZWFkeSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiQW1iaWd1b3VzIHN0cmVhbSBzcGVjaWZpZXIgXCIlc1wiLCB1c2luZyAjJWRcbiIsIHNwZWMsIGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm91bmQgPSBhdmYtPnN0cmVhbXNbaV07CisgICAgfQorICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX1dBUk5JTkcsICJTdHJlYW0gc3BlY2lmaWVyIFwiJXNcIiAlc1xuIiwgc3BlYywKKyAgICAgICAgICAgICAgIGFscmVhZHkgPyAibWF0Y2hlZCBvbmx5IGFscmVhZHkgdXNlZCBzdHJlYW1zIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgImRpZCBub3QgbWF0Y2ggYW55IHN0cmVhbSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGZvdW5kLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICAgICAgZm91bmQtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBhdl9sb2cobG9nLCBBVl9MT0dfRVJST1IsICJTdHJlYW0gc3BlY2lmaWVyIFwiJXNcIiBtYXRjaGVkIGEgJXMgc3RyZWFtLCIKKyAgICAgICAgICAgICAgICJjdXJyZW50bHkgdW5zdXBwb3J0ZWQgYnkgbGliYXZmaWx0ZXJcbiIsIHNwZWMsCisgICAgICAgICAgICAgICBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoZm91bmQtPmNvZGVjLT5jb2RlY190eXBlKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9zdHJlYW0odm9pZCAqbG9nLCBNb3ZpZVN0cmVhbSAqc3QpCit7CisgICAgQVZDb2RlYyAqY29kZWM7CisgICAgaW50IHJldDsKKworICAgIGNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoc3QtPnN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGZpbmQgYW55IGNvZGVjXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzdC0+c3QtPmNvZGVjLT5yZWZjb3VudGVkX2ZyYW1lcyA9IDE7CisKKyAgICBpZiAoKHJldCA9IGF2Y29kZWNfb3BlbjIoc3QtPnN0LT5jb2RlYywgY29kZWMsIE5VTEwpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gY29kZWNcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGd1ZXNzX2NoYW5uZWxfbGF5b3V0KE1vdmllU3RyZWFtICpzdCwgaW50IHN0X2luZGV4LCB2b2lkICpsb2dfY3R4KQoreworICAgIEFWQ29kZWNDb250ZXh0ICpkZWNfY3R4ID0gc3QtPnN0LT5jb2RlYzsKKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIGludDY0X3QgY2hsID0gYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQoZGVjX2N0eC0+Y2hhbm5lbHMpOworCisgICAgaWYgKCFjaGwpIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDaGFubmVsIGxheW91dCBpcyBub3Qgc2V0IGluIHN0cmVhbSAlZCwgYW5kIGNvdWxkIG5vdCAiCisgICAgICAgICAgICAgICAiYmUgZ3Vlc3NlZCBmcm9tIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgIHN0X2luZGV4LCBkZWNfY3R4LT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhidWYsIHNpemVvZihidWYpLCBkZWNfY3R4LT5jaGFubmVscywgY2hsKTsKKyAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICJDaGFubmVsIGxheW91dCBpcyBub3Qgc2V0IGluIG91dHB1dCBzdHJlYW0gJWQsICIKKyAgICAgICAgICAgImd1ZXNzZWQgY2hhbm5lbCBsYXlvdXQgaXMgJyVzJ1xuIiwKKyAgICAgICAgICAgc3RfaW5kZXgsIGJ1Zik7CisgICAgZGVjX2N0eC0+Y2hhbm5lbF9sYXlvdXQgPSBjaGw7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtb3ZpZV9jb21tb25faW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBNb3ZpZUNvbnRleHQgKm1vdmllID0gY3R4LT5wcml2OworICAgIEFWSW5wdXRGb3JtYXQgKmlmb3JtYXQgPSBOVUxMOworICAgIGludDY0X3QgdGltZXN0YW1wOworICAgIGludCBuYl9zdHJlYW1zID0gMSwgcmV0LCBpOworICAgIGNoYXIgZGVmYXVsdF9zdHJlYW1zWzE2XSwgKnN0cmVhbV9zcGVjcywgKnNwZWMsICpjdXJzb3I7CisgICAgY2hhciBuYW1lWzE2XTsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBpZiAoIW1vdmllLT5maWxlX25hbWUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gZmlsZW5hbWUgcHJvdmlkZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBtb3ZpZS0+c2Vla19wb2ludCA9IG1vdmllLT5zZWVrX3BvaW50X2QgKiAxMDAwMDAwICsgMC41OworCisgICAgc3RyZWFtX3NwZWNzID0gbW92aWUtPnN0cmVhbV9zcGVjczsKKyAgICBpZiAoIXN0cmVhbV9zcGVjcykgeworICAgICAgICBzbnByaW50ZihkZWZhdWx0X3N0cmVhbXMsIHNpemVvZihkZWZhdWx0X3N0cmVhbXMpLCAiZCVjJWQiLAorICAgICAgICAgICAgICAgICAhc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAiYW1vdmllIikgPyAnYScgOiAndicsCisgICAgICAgICAgICAgICAgIG1vdmllLT5zdHJlYW1faW5kZXgpOworICAgICAgICBzdHJlYW1fc3BlY3MgPSBkZWZhdWx0X3N0cmVhbXM7CisgICAgfQorICAgIGZvciAoY3Vyc29yID0gc3RyZWFtX3NwZWNzOyAqY3Vyc29yOyBjdXJzb3IrKykKKyAgICAgICAgaWYgKCpjdXJzb3IgPT0gJysnKQorICAgICAgICAgICAgbmJfc3RyZWFtcysrOworCisgICAgaWYgKG1vdmllLT5sb29wX2NvdW50ICE9IDEgJiYgbmJfc3RyZWFtcyAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJMb29wIHdpdGggc2V2ZXJhbCBzdHJlYW1zIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKKworICAgIC8vIFRyeSB0byBmaW5kIHRoZSBtb3ZpZSBmb3JtYXQgKGNvbnRhaW5lcikKKyAgICBpZm9ybWF0ID0gbW92aWUtPmZvcm1hdF9uYW1lID8gYXZfZmluZF9pbnB1dF9mb3JtYXQobW92aWUtPmZvcm1hdF9uYW1lKSA6IE5VTEw7CisKKyAgICBtb3ZpZS0+Zm9ybWF0X2N0eCA9IE5VTEw7CisgICAgaWYgKChyZXQgPSBhdmZvcm1hdF9vcGVuX2lucHV0KCZtb3ZpZS0+Zm9ybWF0X2N0eCwgbW92aWUtPmZpbGVfbmFtZSwgaWZvcm1hdCwgTlVMTCkpIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGF2Zm9ybWF0X29wZW5faW5wdXQgJyVzJ1xuIiwgbW92aWUtPmZpbGVfbmFtZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmICgocmV0ID0gYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbyhtb3ZpZS0+Zm9ybWF0X2N0eCwgTlVMTCkpIDwgMCkKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gZmluZCBzdHJlYW0gaW5mb1xuIik7CisKKyAgICAvLyBpZiBzZWVraW5nIHJlcXVlc3RlZCwgd2UgZXhlY3V0ZSBpdAorICAgIGlmIChtb3ZpZS0+c2Vla19wb2ludCA+IDApIHsKKyAgICAgICAgdGltZXN0YW1wID0gbW92aWUtPnNlZWtfcG9pbnQ7CisgICAgICAgIC8vIGFkZCB0aGUgc3RyZWFtIHN0YXJ0IHRpbWUsIHNob3VsZCBpdCBleGlzdAorICAgICAgICBpZiAobW92aWUtPmZvcm1hdF9jdHgtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXAgPiBJTlQ2NF9NQVggLSBtb3ZpZS0+Zm9ybWF0X2N0eC0+c3RhcnRfdGltZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzZWVrIHZhbHVlIG92ZXJmbG93IHdpdGggc3RhcnRfdGltZTolIlBSSWQ2NCIgc2Vla19wb2ludDolIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1vdmllLT5maWxlX25hbWUsIG1vdmllLT5mb3JtYXRfY3R4LT5zdGFydF90aW1lLCBtb3ZpZS0+c2Vla19wb2ludCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVzdGFtcCArPSBtb3ZpZS0+Zm9ybWF0X2N0eC0+c3RhcnRfdGltZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJldCA9IGF2X3NlZWtfZnJhbWUobW92aWUtPmZvcm1hdF9jdHgsIC0xLCB0aW1lc3RhbXAsIEFWU0VFS19GTEFHX0JBQ0tXQVJEKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICIlczogY291bGQgbm90IHNlZWsgdG8gcG9zaXRpb24gJSJQUklkNjQiXG4iLAorICAgICAgICAgICAgICAgICAgIG1vdmllLT5maWxlX25hbWUsIHRpbWVzdGFtcCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG1vdmllLT5mb3JtYXRfY3R4LT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIG1vdmllLT5mb3JtYXRfY3R4LT5zdHJlYW1zW2ldLT5kaXNjYXJkID0gQVZESVNDQVJEX0FMTDsKKworICAgIG1vdmllLT5zdCA9IGF2X2NhbGxvYyhuYl9zdHJlYW1zLCBzaXplb2YoKm1vdmllLT5zdCkpOworICAgIGlmICghbW92aWUtPnN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzcGVjID0gYXZfc3RydG9rKHN0cmVhbV9zcGVjcywgIisiLCAmY3Vyc29yKTsKKyAgICAgICAgaWYgKCFzcGVjKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgICAgICBzdHJlYW1fc3BlY3MgPSBOVUxMOyAvKiBmb3IgbmV4dCBzdHJ0b2sgKi8KKyAgICAgICAgc3QgPSBmaW5kX3N0cmVhbShjdHgsIG1vdmllLT5mb3JtYXRfY3R4LCBzcGVjKTsKKyAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIHN0LT5kaXNjYXJkID0gQVZESVNDQVJEX0RFRkFVTFQ7CisgICAgICAgIG1vdmllLT5zdFtpXS5zdCA9IHN0OworICAgICAgICBtb3ZpZS0+bWF4X3N0cmVhbV9pbmRleCA9IEZGTUFYKG1vdmllLT5tYXhfc3RyZWFtX2luZGV4LCBzdC0+aW5kZXgpOworICAgIH0KKyAgICBpZiAoYXZfc3RydG9rKE5VTEwsICIrIiwgJmN1cnNvcikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKworICAgIG1vdmllLT5vdXRfaW5kZXggPSBhdl9jYWxsb2MobW92aWUtPm1heF9zdHJlYW1faW5kZXggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCptb3ZpZS0+b3V0X2luZGV4KSk7CisgICAgaWYgKCFtb3ZpZS0+b3V0X2luZGV4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZvciAoaSA9IDA7IGkgPD0gbW92aWUtPm1heF9zdHJlYW1faW5kZXg7IGkrKykKKyAgICAgICAgbW92aWUtPm91dF9pbmRleFtpXSA9IC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJQYWQgcGFkID0geyAwIH07CisgICAgICAgIG1vdmllLT5vdXRfaW5kZXhbbW92aWUtPnN0W2ldLnN0LT5pbmRleF0gPSBpOworICAgICAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJvdXQlZCIsIGkpOworICAgICAgICBwYWQudHlwZSAgICAgICAgICA9IG1vdmllLT5zdFtpXS5zdC0+Y29kZWMtPmNvZGVjX3R5cGU7CisgICAgICAgIHBhZC5uYW1lICAgICAgICAgID0gYXZfc3RyZHVwKG5hbWUpOworICAgICAgICBwYWQuY29uZmlnX3Byb3BzICA9IG1vdmllX2NvbmZpZ19vdXRwdXRfcHJvcHM7CisgICAgICAgIHBhZC5yZXF1ZXN0X2ZyYW1lID0gbW92aWVfcmVxdWVzdF9mcmFtZTsKKyAgICAgICAgZmZfaW5zZXJ0X291dHBhZChjdHgsIGksICZwYWQpOworICAgICAgICByZXQgPSBvcGVuX3N0cmVhbShjdHgsICZtb3ZpZS0+c3RbaV0pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmICggbW92aWUtPnN0W2ldLnN0LT5jb2RlYy0+Y29kZWMtPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICAgICAhbW92aWUtPnN0W2ldLnN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgICAgIHJldCA9IGd1ZXNzX2NoYW5uZWxfbGF5b3V0KCZtb3ZpZS0+c3RbaV0sIGksIGN0eCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJzZWVrX3BvaW50OiUiUFJJaTY0IiBmb3JtYXRfbmFtZTolcyBmaWxlX25hbWU6JXMgc3RyZWFtX2luZGV4OiVkXG4iLAorICAgICAgICAgICBtb3ZpZS0+c2Vla19wb2ludCwgbW92aWUtPmZvcm1hdF9uYW1lLCBtb3ZpZS0+ZmlsZV9uYW1lLAorICAgICAgICAgICBtb3ZpZS0+c3RyZWFtX2luZGV4KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIG1vdmllX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBNb3ZpZUNvbnRleHQgKm1vdmllID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfb3V0cHV0czsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWVwKCZjdHgtPm91dHB1dF9wYWRzW2ldLm5hbWUpOworICAgICAgICBpZiAobW92aWUtPnN0W2ldLnN0KQorICAgICAgICAgICAgYXZjb2RlY19jbG9zZShtb3ZpZS0+c3RbaV0uc3QtPmNvZGVjKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJm1vdmllLT5zdCk7CisgICAgYXZfZnJlZXAoJm1vdmllLT5vdXRfaW5kZXgpOworICAgIGlmIChtb3ZpZS0+Zm9ybWF0X2N0eCkKKyAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJm1vdmllLT5mb3JtYXRfY3R4KTsKK30KKworc3RhdGljIGludCBtb3ZpZV9xdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIE1vdmllQ29udGV4dCAqbW92aWUgPSBjdHgtPnByaXY7CisgICAgaW50IGxpc3RbXSA9IHsgMCwgLTEgfTsKKyAgICBpbnQ2NF90IGxpc3Q2NFtdID0geyAwLCAtMSB9OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfb3V0cHV0czsgaSsrKSB7CisgICAgICAgIE1vdmllU3RyZWFtICpzdCA9ICZtb3ZpZS0+c3RbaV07CisgICAgICAgIEFWQ29kZWNDb250ZXh0ICpjID0gc3QtPnN0LT5jb2RlYzsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzW2ldOworCisgICAgICAgIHN3aXRjaCAoYy0+Y29kZWNfdHlwZSkgeworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgICAgIGxpc3RbMF0gPSBjLT5waXhfZm10OworICAgICAgICAgICAgZmZfZm9ybWF0c19yZWYoZmZfbWFrZV9mb3JtYXRfbGlzdChsaXN0KSwgJm91dGxpbmstPmluX2Zvcm1hdHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgbGlzdFswXSA9IGMtPnNhbXBsZV9mbXQ7CisgICAgICAgICAgICBmZl9mb3JtYXRzX3JlZihmZl9tYWtlX2Zvcm1hdF9saXN0KGxpc3QpLCAmb3V0bGluay0+aW5fZm9ybWF0cyk7CisgICAgICAgICAgICBsaXN0WzBdID0gYy0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICBmZl9mb3JtYXRzX3JlZihmZl9tYWtlX2Zvcm1hdF9saXN0KGxpc3QpLCAmb3V0bGluay0+aW5fc2FtcGxlcmF0ZXMpOworICAgICAgICAgICAgbGlzdDY0WzBdID0gYy0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgICAgICAgICBmZl9jaGFubmVsX2xheW91dHNfcmVmKGF2ZmlsdGVyX21ha2VfZm9ybWF0NjRfbGlzdChsaXN0NjQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0bGluay0+aW5fY2hhbm5lbF9sYXlvdXRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92aWVfY29uZmlnX291dHB1dF9wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgTW92aWVDb250ZXh0ICptb3ZpZSAgPSBjdHgtPnByaXY7CisgICAgdW5zaWduZWQgb3V0X2lkID0gRkZfT1VUTElOS19JRFgob3V0bGluayk7CisgICAgTW92aWVTdHJlYW0gKnN0ID0gJm1vdmllLT5zdFtvdXRfaWRdOworICAgIEFWQ29kZWNDb250ZXh0ICpjID0gc3QtPnN0LT5jb2RlYzsKKworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IHN0LT5zdC0+dGltZV9iYXNlOworCisgICAgc3dpdGNoIChjLT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIG91dGxpbmstPncgICAgICAgICAgPSBjLT53aWR0aDsKKyAgICAgICAgb3V0bGluay0+aCAgICAgICAgICA9IGMtPmhlaWdodDsKKyAgICAgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IHN0LT5zdC0+cl9mcmFtZV9yYXRlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpkZXNjcmliZV9mcmFtZV90b19zdHIoY2hhciAqZHN0LCBzaXplX3QgZHN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLCBlbnVtIEFWTWVkaWFUeXBlIGZyYW1lX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBzd2l0Y2ggKGZyYW1lX3R5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgc25wcmludGYoZHN0LCBkc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgInZpZGVvIHB0czolcyB0aW1lOiVzIHNpemU6JWR4JWQgYXNwZWN0OiVkLyVkIiwKKyAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKGZyYW1lLT5wdHMpLCBhdl90czJ0aW1lc3RyKGZyYW1lLT5wdHMsICZsaW5rLT50aW1lX2Jhc2UpLAorICAgICAgICAgICAgICAgICBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgICAgZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIHNucHJpbnRmKGRzdCwgZHN0X3NpemUsCisgICAgICAgICAgICAgICAgICJhdWRpbyBwdHM6JXMgdGltZTolcyBzYW1wbGVzOiVkIiwKKyAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKGZyYW1lLT5wdHMpLCBhdl90czJ0aW1lc3RyKGZyYW1lLT5wdHMsICZsaW5rLT50aW1lX2Jhc2UpLAorICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHNucHJpbnRmKGRzdCwgZHN0X3NpemUsICIlcyBCVUciLCBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoZnJhbWVfdHlwZSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGRzdDsKK30KKworc3RhdGljIGludCByZXdpbmRfZmlsZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBNb3ZpZUNvbnRleHQgKm1vdmllID0gY3R4LT5wcml2OworICAgIGludDY0X3QgdGltZXN0YW1wID0gbW92aWUtPnNlZWtfcG9pbnQ7CisgICAgaW50IHJldCwgaTsKKworICAgIGlmIChtb3ZpZS0+Zm9ybWF0X2N0eC0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgdGltZXN0YW1wICs9IG1vdmllLT5mb3JtYXRfY3R4LT5zdGFydF90aW1lOworICAgIHJldCA9IGF2X3NlZWtfZnJhbWUobW92aWUtPmZvcm1hdF9jdHgsIC0xLCB0aW1lc3RhbXAsIEFWU0VFS19GTEFHX0JBQ0tXQVJEKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gbG9vcDogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIG1vdmllLT5sb29wX2NvdW50ID0gMTsgLyogZG8gbm90IHRyeSBhZ2FpbiAqLworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX291dHB1dHM7IGkrKykgeworICAgICAgICBhdmNvZGVjX2ZsdXNoX2J1ZmZlcnMobW92aWUtPnN0W2ldLnN0LT5jb2RlYyk7CisgICAgICAgIG1vdmllLT5zdFtpXS5kb25lID0gMDsKKyAgICB9CisgICAgbW92aWUtPmVvZiA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogVHJ5IHRvIHB1c2ggYSBmcmFtZSB0byB0aGUgcmVxdWVzdGVkIG91dHB1dC4KKyAqCisgKiBAcGFyYW0gY3R4ICAgICBmaWx0ZXIgY29udGV4dAorICogQHBhcmFtIG91dF9pZCAgbnVtYmVyIG9mIG91dHB1dCB3aGVyZSBhIGZyYW1lIGlzIHdhbnRlZDsKKyAqICAgICAgICAgICAgICAgIGlmIHRoZSBmcmFtZSBpcyByZWFkIGZyb20gZmlsZSwgdXNlZCB0byBzZXQgdGhlIHJldHVybiB2YWx1ZTsKKyAqICAgICAgICAgICAgICAgIGlmIHRoZSBjb2RlYyBpcyBiZWluZyBmbHVzaGVkLCBmbHVzaCB0aGUgY29ycmVzcG9uZGluZyBzdHJlYW0KKyAqIEByZXR1cm4gIDEgaWYgYSBmcmFtZSB3YXMgcHVzaGVkIG9uIHRoZSByZXF1ZXN0ZWQgb3V0cHV0LAorICogICAgICAgICAgMCBpZiBhbm90aGVyIGF0dGVtcHQgaXMgcG9zc2libGUsCisgKiAgICAgICAgICA8MCBBVkVSUk9SIGNvZGUKKyAqLworc3RhdGljIGludCBtb3ZpZV9wdXNoX2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB1bnNpZ25lZCBvdXRfaWQpCit7CisgICAgTW92aWVDb250ZXh0ICptb3ZpZSA9IGN0eC0+cHJpdjsKKyAgICBBVlBhY2tldCAqcGt0ID0gJm1vdmllLT5wa3Q7CisgICAgZW51bSBBVk1lZGlhVHlwZSBmcmFtZV90eXBlOworICAgIE1vdmllU3RyZWFtICpzdDsKKyAgICBpbnQgcmV0LCBnb3RfZnJhbWUgPSAwLCBwa3Rfb3V0X2lkOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluazsKKyAgICBBVkZyYW1lICpmcmFtZTsKKworICAgIGlmICghcGt0LT5zaXplKSB7CisgICAgICAgIGlmIChtb3ZpZS0+ZW9mKSB7CisgICAgICAgICAgICBpZiAobW92aWUtPnN0W291dF9pZF0uZG9uZSkgeworICAgICAgICAgICAgICAgIGlmIChtb3ZpZS0+bG9vcF9jb3VudCAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHJld2luZF9maWxlKGN0eCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgbW92aWUtPmxvb3BfY291bnQgLT0gbW92aWUtPmxvb3BfY291bnQgPiAxOworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlN0cmVhbSBmaW5pc2hlZCwgbG9vcGluZy5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogcmV0cnkgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBtb3ZpZS0+c3Rbb3V0X2lkXS5zdC0+aW5kZXg7CisgICAgICAgICAgICAvKiBwYWNrZXQgaXMgYWxyZWFkeSByZWFkeSBmb3IgZmx1c2hpbmcgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGF2X3JlYWRfZnJhbWUobW92aWUtPmZvcm1hdF9jdHgsICZtb3ZpZS0+cGt0MCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2luaXRfcGFja2V0KCZtb3ZpZS0+cGt0MCk7IC8qIHJlYWR5IGZvciBmbHVzaGluZyAqLworICAgICAgICAgICAgICAgICpwa3QgPSBtb3ZpZS0+cGt0MDsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GKSB7CisgICAgICAgICAgICAgICAgICAgIG1vdmllLT5lb2YgPSAxOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogc3RhcnQgZmx1c2hpbmcgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwa3QgPSBtb3ZpZS0+cGt0MDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBrdF9vdXRfaWQgPSBwa3QtPnN0cmVhbV9pbmRleCA+IG1vdmllLT5tYXhfc3RyZWFtX2luZGV4ID8gLTEgOgorICAgICAgICAgICAgICAgICBtb3ZpZS0+b3V0X2luZGV4W3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICBpZiAocGt0X291dF9pZCA8IDApIHsKKyAgICAgICAgYXZfZnJlZV9wYWNrZXQoJm1vdmllLT5wa3QwKTsKKyAgICAgICAgcGt0LT5zaXplID0gMDsgLyogcmVhZHkgZm9yIG5leHQgcnVuICovCisgICAgICAgIHBrdC0+ZGF0YSA9IE5VTEw7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzdCA9ICZtb3ZpZS0+c3RbcGt0X291dF9pZF07CisgICAgb3V0bGluayA9IGN0eC0+b3V0cHV0c1twa3Rfb3V0X2lkXTsKKworICAgIGZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZnJhbWVfdHlwZSA9IHN0LT5zdC0+Y29kZWMtPmNvZGVjX3R5cGU7CisgICAgc3dpdGNoIChmcmFtZV90eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIHJldCA9IGF2Y29kZWNfZGVjb2RlX3ZpZGVvMihzdC0+c3QtPmNvZGVjLCBmcmFtZSwgJmdvdF9mcmFtZSwgcGt0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIHJldCA9IGF2Y29kZWNfZGVjb2RlX2F1ZGlvNChzdC0+c3QtPmNvZGVjLCBmcmFtZSwgJmdvdF9mcmFtZSwgcGt0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9TWVMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJEZWNvZGUgZXJyb3I6ICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZtb3ZpZS0+cGt0MCk7CisgICAgICAgIG1vdmllLT5wa3Quc2l6ZSA9IDA7CisgICAgICAgIG1vdmllLT5wa3QuZGF0YSA9IE5VTEw7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIXJldCB8fCBzdC0+c3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgcmV0ID0gcGt0LT5zaXplOworCisgICAgcGt0LT5kYXRhICs9IHJldDsKKyAgICBwa3QtPnNpemUgLT0gcmV0OworICAgIGlmIChwa3QtPnNpemUgPD0gMCkgeworICAgICAgICBhdl9mcmVlX3BhY2tldCgmbW92aWUtPnBrdDApOworICAgICAgICBwa3QtPnNpemUgPSAwOyAvKiByZWFkeSBmb3IgbmV4dCBydW4gKi8KKyAgICAgICAgcGt0LT5kYXRhID0gTlVMTDsKKyAgICB9CisgICAgaWYgKCFnb3RfZnJhbWUpIHsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgICBzdC0+ZG9uZSA9IDE7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZnJhbWUtPnB0cyA9IGF2X2ZyYW1lX2dldF9iZXN0X2VmZm9ydF90aW1lc3RhbXAoZnJhbWUpOworICAgIGF2X2Rsb2coY3R4LCAibW92aWVfcHVzaF9mcmFtZSgpOiBmaWxlOiclcycgJXNcbiIsIG1vdmllLT5maWxlX25hbWUsCisgICAgICAgICAgICBkZXNjcmliZV9mcmFtZV90b19zdHIoKGNoYXJbMTAyNF0pezB9LCAxMDI0LCBmcmFtZSwgZnJhbWVfdHlwZSwgb3V0bGluaykpOworCisgICAgaWYgKHN0LT5zdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGlmIChmcmFtZS0+Zm9ybWF0ICE9IG91dGxpbmstPmZvcm1hdCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRm9ybWF0IGNoYW5nZWQgJXMgLT4gJXMsIGRpc2NhcmRpbmcgZnJhbWVcbiIsCisgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShvdXRsaW5rLT5mb3JtYXQpLAorICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoZnJhbWUtPmZvcm1hdCkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGZyYW1lKTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBwa3Rfb3V0X2lkID09IG91dF9pZDsKK30KKworc3RhdGljIGludCBtb3ZpZV9yZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICB1bnNpZ25lZCBvdXRfaWQgPSBGRl9PVVRMSU5LX0lEWChvdXRsaW5rKTsKKyAgICBpbnQgcmV0OworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcmV0ID0gbW92aWVfcHVzaF9mcmFtZShjdHgsIG91dF9pZCk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gRkZNSU4ocmV0LCAwKTsKKyAgICB9Cit9CisKKyNpZiBDT05GSUdfTU9WSUVfRklMVEVSCisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhtb3ZpZSk7CisKK0FWRmlsdGVyIGZmX2F2c3JjX21vdmllID0geworICAgIC5uYW1lICAgICAgICAgID0gIm1vdmllIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFkIGZyb20gYSBtb3ZpZSBzb3VyY2UuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTW92aWVDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZtb3ZpZV9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IG1vdmllX2NvbW1vbl9pbml0LAorICAgIC51bmluaXQgICAgICAgID0gbW92aWVfdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gbW92aWVfcXVlcnlfZm9ybWF0cywKKworICAgIC5pbnB1dHMgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgPSBOVUxMLAorICAgIC5mbGFncyAgICAgPSBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfT1VUUFVUUywKK307CisKKyNlbmRpZiAgLyogQ09ORklHX01PVklFX0ZJTFRFUiAqLworCisjaWYgQ09ORklHX0FNT1ZJRV9GSUxURVIKKworI2RlZmluZSBhbW92aWVfb3B0aW9ucyBtb3ZpZV9vcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYW1vdmllKTsKKworQVZGaWx0ZXIgZmZfYXZzcmNfYW1vdmllID0geworICAgIC5uYW1lICAgICAgICAgID0gImFtb3ZpZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVhZCBhdWRpbyBmcm9tIGEgbW92aWUgc291cmNlLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKE1vdmllQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSBtb3ZpZV9jb21tb25faW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IG1vdmllX3VuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IG1vdmllX3F1ZXJ5X2Zvcm1hdHMsCisKKyAgICAuaW5wdXRzICAgICA9IE5VTEwsCisgICAgLm91dHB1dHMgICAgPSBOVUxMLAorICAgIC5wcml2X2NsYXNzID0gJmFtb3ZpZV9jbGFzcywKKyAgICAuZmxhZ3MgICAgICA9IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19PVVRQVVRTLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19BTU9WSUVfRklMVEVSICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdGhyZWFkLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzNDdlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci90aHJlYWQuaApAQCAtMCwwICsxLDI5IEBACisvKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX1RIUkVBRF9ICisjZGVmaW5lIEFWRklMVEVSX1RIUkVBRF9ICisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorCitpbnQgZmZfZ3JhcGhfdGhyZWFkX2luaXQoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgpOworCit2b2lkIGZmX2dyYXBoX3RocmVhZF9mcmVlKEFWRmlsdGVyR3JhcGggKmdyYXBoKTsKKworI2VuZGlmIC8qIEFWRklMVEVSX1RIUkVBRF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdGludGVybGFjZS5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3RpbnRlcmxhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTBhODNhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3RpbnRlcmxhY2UuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFN0ZWZhbm8gU2FiYXRpbmkKKyAqIENvcHlyaWdodCAoYykgMjAxMCBCYXB0aXN0ZSBDb3VkdXJpZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIFp1Y2NoaSA8bm90emVkQHhpbWlhbi5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogdGVtcG9yYWwgZmllbGQgaW50ZXJsYWNlIGZpbHRlciwgcG9ydGVkIGZyb20gTVBsYXllci9saWJtcGNvZGVjcworICovCisjaWZuZGVmIEFWRklMVEVSX1RJTlRFUkxBQ0VfSAorI2RlZmluZSBBVkZJTFRFUl9USU5URVJMQUNFX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorCitlbnVtIFRJbnRlcmxhY2VNb2RlIHsKKyAgICBNT0RFX01FUkdFID0gMCwKKyAgICBNT0RFX0RST1BfRVZFTiwKKyAgICBNT0RFX0RST1BfT0RELAorICAgIE1PREVfUEFELAorICAgIE1PREVfSU5URVJMRUFWRV9UT1AsCisgICAgTU9ERV9JTlRFUkxFQVZFX0JPVFRPTSwKKyAgICBNT0RFX0lOVEVSTEFDRVgyLAorICAgIE1PREVfTkIsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgZW51bSBUSW50ZXJsYWNlTW9kZSBtb2RlOyAgIC8vLzwgaW50ZXJsYWNlIG1vZGUgc2VsZWN0ZWQKKyAgICBBVlJhdGlvbmFsIHByZW91dF90aW1lX2Jhc2U7CisgICAgaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgIC8vLzwgZmxhZ3MgYWZmZWN0aW5nIGludGVybGFjaW5nIGFsZ29yaXRobQorICAgIGludCBmcmFtZTsgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiB0aGUgb3V0cHV0IGZyYW1lCisgICAgaW50IHZzdWI7ICAgICAgICAgICAgICAgICAgIC8vLzwgY2hyb21hIHZlcnRpY2FsIHN1YnNhbXBsaW5nCisgICAgQVZGcmFtZSAqY3VyOworICAgIEFWRnJhbWUgKm5leHQ7CisgICAgdWludDhfdCAqYmxhY2tfZGF0YVs0XTsgICAgIC8vLzwgYnVmZmVyIHVzZWQgdG8gZmlsbCBwYWRkZWQgbGluZXMKKyAgICBpbnQgYmxhY2tfbGluZXNpemVbNF07CisgICAgdm9pZCAoKmxvd3Bhc3NfbGluZSkodWludDhfdCAqZHN0cCwgcHRyZGlmZl90IHdpZHRoLCBjb25zdCB1aW50OF90ICpzcmNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYWJvdmUsIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYmVsb3cpOworfSBUSW50ZXJsYWNlQ29udGV4dDsKKwordm9pZCBmZl90aW50ZXJsYWNlX2luaXRfeDg2KFRJbnRlcmxhY2VDb250ZXh0ICppbnRlcmxhY2UpOworCisjZW5kaWYgLyogQVZGSUxURVJfVElOVEVSTEFDRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdHJhbnNmb3JtLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdHJhbnNmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjNTQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci90cmFuc2Zvcm0uYwpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHZW9yZyBNYXJ0aXVzIDxnZW9yZy5tYXJ0aXVzQHdlYi5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBEYW5pZWwgRy4gVGF5bG9yIDxkYW5AcHJvZ3JhbW1lci1hcnQub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiB0cmFuc2Zvcm0gaW5wdXQgdmlkZW8KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorCisjaW5jbHVkZSAidHJhbnNmb3JtLmgiCisKKyNkZWZpbmUgSU5URVJQT0xBVEVfTUVUSE9EKG5hbWUpIFwKKyAgICBzdGF0aWMgdWludDhfdCBuYW1lKGZsb2F0IHgsIGZsb2F0IHksIGNvbnN0IHVpbnQ4X3QgKnNyYywgXAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCB1aW50OF90IGRlZikKKworI2RlZmluZSBQSVhFTChpbWcsIHgsIHksIHcsIGgsIHN0cmlkZSwgZGVmKSBcCisgICAgKCh4KSA8IDAgfHwgKHkpIDwgMCkgPyAoZGVmKSA6IFwKKyAgICAoKCh4KSA+PSAodykgfHwgKHkpID49IChoKSkgPyAoZGVmKSA6IFwKKyAgICBpbWdbKHgpICsgKHkpICogKHN0cmlkZSldKQorCisvKioKKyAqIE5lYXJlc3QgbmVpZ2hib3IgaW50ZXJwb2xhdGlvbgorICovCitJTlRFUlBPTEFURV9NRVRIT0QoaW50ZXJwb2xhdGVfbmVhcmVzdCkKK3sKKyAgICByZXR1cm4gUElYRUwoc3JjLCAoaW50KSh4ICsgMC41KSwgKGludCkoeSArIDAuNSksIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKK30KKworLyoqCisgKiBCaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgKi8KK0lOVEVSUE9MQVRFX01FVEhPRChpbnRlcnBvbGF0ZV9iaWxpbmVhcikKK3sKKyAgICBpbnQgeF9jLCB4X2YsIHlfYywgeV9mOworICAgIGludCB2MSwgdjIsIHYzLCB2NDsKKworICAgIGlmICh4IDwgLTEgfHwgeCA+IHdpZHRoIHx8IHkgPCAtMSB8fCB5ID4gaGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBkZWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgeF9mID0gKGludCl4OworICAgICAgICB4X2MgPSB4X2YgKyAxOworCisgICAgICAgIHlfZiA9IChpbnQpeTsKKyAgICAgICAgeV9jID0geV9mICsgMTsKKworICAgICAgICB2MSA9IFBJWEVMKHNyYywgeF9jLCB5X2MsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKKyAgICAgICAgdjIgPSBQSVhFTChzcmMsIHhfYywgeV9mLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGRlZik7CisgICAgICAgIHYzID0gUElYRUwoc3JjLCB4X2YsIHlfYywgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBkZWYpOworICAgICAgICB2NCA9IFBJWEVMKHNyYywgeF9mLCB5X2YsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKKworICAgICAgICByZXR1cm4gKHYxKih4IC0geF9mKSooeSAtIHlfZikgKyB2MiooKHggLSB4X2YpKih5X2MgLSB5KSkgKworICAgICAgICAgICAgICAgIHYzKih4X2MgLSB4KSooeSAtIHlfZikgKyB2NCooKHhfYyAtIHgpKih5X2MgLSB5KSkpOworICAgIH0KK30KKworLyoqCisgKiBCaXF1YWRyYXRpYyBpbnRlcnBvbGF0aW9uCisgKi8KK0lOVEVSUE9MQVRFX01FVEhPRChpbnRlcnBvbGF0ZV9iaXF1YWRyYXRpYykKK3sKKyAgICBpbnQgICAgIHhfYywgeF9mLCB5X2MsIHlfZjsKKyAgICB1aW50OF90IHYxLCAgdjIsICB2MywgIHY0OworICAgIGZsb2F0ICAgZjEsICBmMiwgIGYzLCAgZjQ7CisKKyAgICBpZiAoeCA8IC0gMSB8fCB4ID4gd2lkdGggfHwgeSA8IC0xIHx8IHkgPiBoZWlnaHQpCisgICAgICAgIHJldHVybiBkZWY7CisgICAgZWxzZSB7CisgICAgICAgIHhfZiA9IChpbnQpeDsKKyAgICAgICAgeF9jID0geF9mICsgMTsKKyAgICAgICAgeV9mID0gKGludCl5OworICAgICAgICB5X2MgPSB5X2YgKyAxOworCisgICAgICAgIHYxID0gUElYRUwoc3JjLCB4X2MsIHlfYywgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBkZWYpOworICAgICAgICB2MiA9IFBJWEVMKHNyYywgeF9jLCB5X2YsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKKyAgICAgICAgdjMgPSBQSVhFTChzcmMsIHhfZiwgeV9jLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGRlZik7CisgICAgICAgIHY0ID0gUElYRUwoc3JjLCB4X2YsIHlfZiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBkZWYpOworCisgICAgICAgIGYxID0gMSAtIHNxcnQoKHhfYyAtIHgpICogKHlfYyAtIHkpKTsKKyAgICAgICAgZjIgPSAxIC0gc3FydCgoeF9jIC0geCkgKiAoeSAtIHlfZikpOworICAgICAgICBmMyA9IDEgLSBzcXJ0KCh4IC0geF9mKSAqICh5X2MgLSB5KSk7CisgICAgICAgIGY0ID0gMSAtIHNxcnQoKHggLSB4X2YpICogKHkgLSB5X2YpKTsKKyAgICAgICAgcmV0dXJuICh2MSAqIGYxICsgdjIgKiBmMiArIHYzICogZjMgKyB2NCAqIGY0KSAvIChmMSArIGYyICsgZjMgKyBmNCk7CisgICAgfQorfQorCit2b2lkIGF2ZmlsdGVyX2dldF9tYXRyaXgoZmxvYXQgeF9zaGlmdCwgZmxvYXQgeV9zaGlmdCwgZmxvYXQgYW5nbGUsIGZsb2F0IHpvb20sIGZsb2F0ICptYXRyaXgpIHsKKyAgICBtYXRyaXhbMF0gPSB6b29tICogY29zKGFuZ2xlKTsKKyAgICBtYXRyaXhbMV0gPSAtc2luKGFuZ2xlKTsKKyAgICBtYXRyaXhbMl0gPSB4X3NoaWZ0OworICAgIG1hdHJpeFszXSA9IC1tYXRyaXhbMV07CisgICAgbWF0cml4WzRdID0gbWF0cml4WzBdOworICAgIG1hdHJpeFs1XSA9IHlfc2hpZnQ7CisgICAgbWF0cml4WzZdID0gMDsKKyAgICBtYXRyaXhbN10gPSAwOworICAgIG1hdHJpeFs4XSA9IDE7Cit9CisKK3ZvaWQgYXZmaWx0ZXJfYWRkX21hdHJpeChjb25zdCBmbG9hdCAqbTEsIGNvbnN0IGZsb2F0ICptMiwgZmxvYXQgKnJlc3VsdCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorICAgICAgICByZXN1bHRbaV0gPSBtMVtpXSArIG0yW2ldOworfQorCit2b2lkIGF2ZmlsdGVyX3N1Yl9tYXRyaXgoY29uc3QgZmxvYXQgKm0xLCBjb25zdCBmbG9hdCAqbTIsIGZsb2F0ICpyZXN1bHQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKyAgICAgICAgcmVzdWx0W2ldID0gbTFbaV0gLSBtMltpXTsKK30KKwordm9pZCBhdmZpbHRlcl9tdWxfbWF0cml4KGNvbnN0IGZsb2F0ICptMSwgZmxvYXQgc2NhbGFyLCBmbG9hdCAqcmVzdWx0KQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisgICAgICAgIHJlc3VsdFtpXSA9IG0xW2ldICogc2NhbGFyOworfQorCitzdGF0aWMgaW5saW5lIGludCBtaXJyb3IoaW50IHYsIGludCBtKQoreworICAgIHdoaWxlICgodW5zaWduZWQpdiA+ICh1bnNpZ25lZCltKSB7CisgICAgICAgIHYgPSAtdjsKKyAgICAgICAgaWYgKHYgPCAwKQorICAgICAgICAgICAgdiArPSAyICogbTsKKyAgICB9CisgICAgcmV0dXJuIHY7Cit9CisKK2ludCBhdmZpbHRlcl90cmFuc2Zvcm0oY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZSwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IGZsb2F0ICptYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEludGVycG9sYXRlTWV0aG9kIGludGVycG9sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBGaWxsTWV0aG9kIGZpbGwpCit7CisgICAgaW50IHgsIHk7CisgICAgZmxvYXQgeF9zLCB5X3M7CisgICAgdWludDhfdCBkZWYgPSAwOworICAgIHVpbnQ4X3QgKCpmdW5jKShmbG9hdCwgZmxvYXQsIGNvbnN0IHVpbnQ4X3QgKiwgaW50LCBpbnQsIGludCwgdWludDhfdCkgPSBOVUxMOworCisgICAgc3dpdGNoKGludGVycG9sYXRlKSB7CisgICAgICAgIGNhc2UgSU5URVJQT0xBVEVfTkVBUkVTVDoKKyAgICAgICAgICAgIGZ1bmMgPSBpbnRlcnBvbGF0ZV9uZWFyZXN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5URVJQT0xBVEVfQklMSU5FQVI6CisgICAgICAgICAgICBmdW5jID0gaW50ZXJwb2xhdGVfYmlsaW5lYXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRFUlBPTEFURV9CSVFVQURSQVRJQzoKKyAgICAgICAgICAgIGZ1bmMgPSBpbnRlcnBvbGF0ZV9iaXF1YWRyYXRpYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgeF9zID0geCAqIG1hdHJpeFswXSArIHkgKiBtYXRyaXhbMV0gKyBtYXRyaXhbMl07CisgICAgICAgICAgICB5X3MgPSB4ICogbWF0cml4WzNdICsgeSAqIG1hdHJpeFs0XSArIG1hdHJpeFs1XTsKKworICAgICAgICAgICAgc3dpdGNoKGZpbGwpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZJTExfT1JJR0lOQUw6CisgICAgICAgICAgICAgICAgICAgIGRlZiA9IHNyY1t5ICogc3JjX3N0cmlkZSArIHhdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZJTExfQ0xBTVA6CisgICAgICAgICAgICAgICAgICAgIHlfcyA9IGF2X2NsaXBmKHlfcywgMCwgaGVpZ2h0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHhfcyA9IGF2X2NsaXBmKHhfcywgMCwgd2lkdGggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgZGVmID0gc3JjWyhpbnQpeV9zICogc3JjX3N0cmlkZSArIChpbnQpeF9zXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGSUxMX01JUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgeF9zID0gbWlycm9yKHhfcywgIHdpZHRoLTEpOworICAgICAgICAgICAgICAgICAgICB5X3MgPSBtaXJyb3IoeV9zLCBoZWlnaHQtMSk7CisKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0Mih4X3MgPj0gMCAmJiB5X3MgPj0gMCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIoeF9zIDwgd2lkdGggJiYgeV9zIDwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZGVmID0gc3JjWyhpbnQpeV9zICogc3JjX3N0cmlkZSArIChpbnQpeF9zXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0W3kgKiBkc3Rfc3RyaWRlICsgeF0gPSBmdW5jKHhfcywgeV9zLCBzcmMsIHdpZHRoLCBoZWlnaHQsIHNyY19zdHJpZGUsIGRlZik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdHJhbnNmb3JtLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvdHJhbnNmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0MzZiZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci90cmFuc2Zvcm0uaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHZW9yZyBNYXJ0aXVzIDxnZW9yZy5tYXJ0aXVzQHdlYi5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBEYW5pZWwgRy4gVGF5bG9yIDxkYW5AcHJvZ3JhbW1lci1hcnQub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX1RSQU5TRk9STV9ICisjZGVmaW5lIEFWRklMVEVSX1RSQU5TRk9STV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBAZmlsZQorICogdHJhbnNmb3JtIGlucHV0IHZpZGVvCisgKgorICogQWxsIG1hdHJpY2VzIGFyZSBkZWZpbmVkIGFzIGEgc2luZ2xlIDktaXRlbSBibG9jayBvZiBjb250aWd1b3VzIG1lbW9yeS4gRm9yCisgKiBleGFtcGxlLCB0aGUgaWRlbnRpdHkgbWF0cml4IHdvdWxkIGJlOgorICoKKyAqICAgICBmbG9hdCAqbWF0cml4ID0gezEsIDAsIDAsCisgKiAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAwLAorICogICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMX07CisgKi8KKworZW51bSBJbnRlcnBvbGF0ZU1ldGhvZCB7CisgICAgSU5URVJQT0xBVEVfTkVBUkVTVCwgICAgICAgIC8vPCBOZWFyZXN0LW5laWdoYm9yIChmYXN0KQorICAgIElOVEVSUE9MQVRFX0JJTElORUFSLCAgICAgICAvLzwgQmlsaW5lYXIKKyAgICBJTlRFUlBPTEFURV9CSVFVQURSQVRJQywgICAgLy88IEJpcXVhZHJhdGljIChiZXN0KQorICAgIElOVEVSUE9MQVRFX0NPVU5ULCAgICAgICAgICAvLzwgTnVtYmVyIG9mIGludGVycG9sYXRpb24gbWV0aG9kcworfTsKKworLy8gU2hvcnRjdXRzIGZvciB0aGUgZmFzdGVzdCBhbmQgYmVzdCBpbnRlcnBvbGF0aW9uIG1ldGhvZHMKKyNkZWZpbmUgSU5URVJQT0xBVEVfREVGQVVMVCBJTlRFUlBPTEFURV9CSUxJTkVBUgorI2RlZmluZSBJTlRFUlBPTEFURV9GQVNUICAgIElOVEVSUE9MQVRFX05FQVJFU1QKKyNkZWZpbmUgSU5URVJQT0xBVEVfQkVTVCAgICBJTlRFUlBPTEFURV9CSVFVQURSQVRJQworCitlbnVtIEZpbGxNZXRob2QgeworICAgIEZJTExfQkxBTkssICAgICAgICAgLy88IEZpbGwgemVyb2VzIGF0IGJsYW5rIGxvY2F0aW9ucworICAgIEZJTExfT1JJR0lOQUwsICAgICAgLy88IE9yaWdpbmFsIGltYWdlIGF0IGJsYW5rIGxvY2F0aW9ucworICAgIEZJTExfQ0xBTVAsICAgICAgICAgLy88IEV4dHJ1ZGVkIGVkZ2UgdmFsdWUgYXQgYmxhbmsgbG9jYXRpb25zCisgICAgRklMTF9NSVJST1IsICAgICAgICAvLzwgTWlycm9yZWQgZWRnZSBhdCBibGFuayBsb2NhdGlvbnMKKyAgICBGSUxMX0NPVU5ULCAgICAgICAgIC8vPCBOdW1iZXIgb2YgZWRnZSBmaWxsIG1ldGhvZHMKK307CisKKy8vIFNob3J0Y3V0cyBmb3IgZmlsbCBtZXRob2RzCisjZGVmaW5lIEZJTExfREVGQVVMVCBGSUxMX09SSUdJTkFMCisKKy8qKgorICogR2V0IGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggZnJvbSBhIGdpdmVuIHRyYW5zbGF0aW9uLCByb3RhdGlvbiwgYW5kCisgKiB6b29tIGZhY3Rvci4gVGhlIG1hdHJpeCB3aWxsIGxvb2sgbGlrZToKKyAqCisgKiBbIHpvb20gKiBjb3MoYW5nbGUpLCAgICAgICAgICAgLXNpbihhbmdsZSksICAgICB4X3NoaWZ0LAorICogICAgICAgICAgc2luKGFuZ2xlKSwgICAgIHpvb20gKiBjb3MoYW5nbGUpLCAgICAgeV9zaGlmdCwKKyAqICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIDEgXQorICoKKyAqIEBwYXJhbSB4X3NoaWZ0IGhvcml6b250YWwgdHJhbnNsYXRpb24KKyAqIEBwYXJhbSB5X3NoaWZ0IHZlcnRpY2FsIHRyYW5zbGF0aW9uCisgKiBAcGFyYW0gYW5nbGUgICByb3RhdGlvbiBpbiByYWRpYW5zCisgKiBAcGFyYW0gem9vbSAgICBzY2FsZSBwZXJjZW50ICgxLjAgPSAxMDAlKQorICogQHBhcmFtIG1hdHJpeCAgOS1pdGVtIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKKyAqLwordm9pZCBhdmZpbHRlcl9nZXRfbWF0cml4KGZsb2F0IHhfc2hpZnQsIGZsb2F0IHlfc2hpZnQsIGZsb2F0IGFuZ2xlLCBmbG9hdCB6b29tLCBmbG9hdCAqbWF0cml4KTsKKworLyoqCisgKiBBZGQgdHdvIG1hdHJpY2VzIHRvZ2V0aGVyLiByZXN1bHQgPSBtMSArIG0yLgorICoKKyAqIEBwYXJhbSBtMSAgICAgOS1pdGVtIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAorICogQHBhcmFtIG0yICAgICA5LWl0ZW0gdHJhbnNmb3JtYXRpb24gbWF0cml4CisgKiBAcGFyYW0gcmVzdWx0IDktaXRlbSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKKyAqLwordm9pZCBhdmZpbHRlcl9hZGRfbWF0cml4KGNvbnN0IGZsb2F0ICptMSwgY29uc3QgZmxvYXQgKm0yLCBmbG9hdCAqcmVzdWx0KTsKKworLyoqCisgKiBTdWJ0cmFjdCBvbmUgbWF0cml4IGZyb20gYW5vdGhlci4gcmVzdWx0ID0gbTEgLSBtMi4KKyAqCisgKiBAcGFyYW0gbTEgICAgIDktaXRlbSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKKyAqIEBwYXJhbSBtMiAgICAgOS1pdGVtIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAorICogQHBhcmFtIHJlc3VsdCA5LWl0ZW0gdHJhbnNmb3JtYXRpb24gbWF0cml4CisgKi8KK3ZvaWQgYXZmaWx0ZXJfc3ViX21hdHJpeChjb25zdCBmbG9hdCAqbTEsIGNvbnN0IGZsb2F0ICptMiwgZmxvYXQgKnJlc3VsdCk7CisKKy8qKgorICogTXVsdGlwbHkgYSBtYXRyaXggYnkgYSBzY2FsYXIgdmFsdWUuIHJlc3VsdCA9IG0xICogc2NhbGFyLgorICoKKyAqIEBwYXJhbSBtMSAgICAgOS1pdGVtIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAorICogQHBhcmFtIHNjYWxhciBhIG51bWJlcgorICogQHBhcmFtIHJlc3VsdCA5LWl0ZW0gdHJhbnNmb3JtYXRpb24gbWF0cml4CisgKi8KK3ZvaWQgYXZmaWx0ZXJfbXVsX21hdHJpeChjb25zdCBmbG9hdCAqbTEsIGZsb2F0IHNjYWxhciwgZmxvYXQgKnJlc3VsdCk7CisKKy8qKgorICogRG8gYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uIHdpdGggdGhlIGdpdmVuIGludGVycG9sYXRpb24gbWV0aG9kLiBUaGlzCisgKiBtdWx0aXBsaWVzIGVhY2ggdmVjdG9yIFt4LHksMV0gYnkgdGhlIG1hdHJpeCBhbmQgdGhlbiBpbnRlcnBvbGF0ZXMgdG8KKyAqIGdldCB0aGUgZmluYWwgdmFsdWUuCisgKgorICogQHBhcmFtIHNyYyAgICAgICAgIHNvdXJjZSBpbWFnZQorICogQHBhcmFtIGRzdCAgICAgICAgIGRlc3RpbmF0aW9uIGltYWdlCisgKiBAcGFyYW0gc3JjX3N0cmlkZSAgc291cmNlIGltYWdlIGxpbmUgc2l6ZSBpbiBieXRlcworICogQHBhcmFtIGRzdF9zdHJpZGUgIGRlc3RpbmF0aW9uIGltYWdlIGxpbmUgc2l6ZSBpbiBieXRlcworICogQHBhcmFtIHdpZHRoICAgICAgIGltYWdlIHdpZHRoIGluIHBpeGVscworICogQHBhcmFtIGhlaWdodCAgICAgIGltYWdlIGhlaWdodCBpbiBwaXhlbHMKKyAqIEBwYXJhbSBtYXRyaXggICAgICA5LWl0ZW0gYWZmaW5lIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAorICogQHBhcmFtIGludGVycG9sYXRlIHBpeGVsIGludGVycG9sYXRpb24gbWV0aG9kCisgKiBAcGFyYW0gZmlsbCAgICAgICAgZWRnZSBmaWxsIG1ldGhvZAorICogQHJldHVybiBuZWdhdGl2ZSBvbiBlcnJvcgorICovCitpbnQgYXZmaWx0ZXJfdHJhbnNmb3JtKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGUsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBmbG9hdCAqbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBJbnRlcnBvbGF0ZU1ldGhvZCBpbnRlcnBvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gRmlsbE1ldGhvZCBmaWxsKTsKKworI2VuZGlmIC8qIEFWRklMVEVSX1RSQU5TRk9STV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdHJpbS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3RyaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjhkYzAzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3RyaW0uYwpAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKworI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBUcmltQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICAvKgorICAgICAqIEFWT3B0aW9ucworICAgICAqLworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgaW50NjRfdCBzdGFydF90aW1lLCBlbmRfdGltZTsKKyAgICBpbnQ2NF90IHN0YXJ0X2ZyYW1lLCBlbmRfZnJhbWU7CisKKyAgICBkb3VibGUgZHVyYXRpb25fZGJsOworICAgIGRvdWJsZSBzdGFydF90aW1lX2RibCwgZW5kX3RpbWVfZGJsOworICAgIC8qCisgICAgICogaW4gdGhlIGxpbmsgdGltZWJhc2UgZm9yIHZpZGVvLAorICAgICAqIGluIDEvc2FtcGxlcmF0ZSBmb3IgYXVkaW8KKyAgICAgKi8KKyAgICBpbnQ2NF90IHN0YXJ0X3B0cywgZW5kX3B0czsKKyAgICBpbnQ2NF90IHN0YXJ0X3NhbXBsZSwgZW5kX3NhbXBsZTsKKworICAgIC8qCisgICAgICogbnVtYmVyIG9mIHZpZGVvIGZyYW1lcyB0aGF0IGFycml2ZWQgb24gdGhpcyBmaWx0ZXIgc28gZmFyCisgICAgICovCisgICAgaW50NjRfdCBuYl9mcmFtZXM7CisgICAgLyoKKyAgICAgKiBudW1iZXIgb2YgYXVkaW8gc2FtcGxlcyB0aGF0IGFycml2ZWQgb24gdGhpcyBmaWx0ZXIgc28gZmFyCisgICAgICovCisgICAgaW50NjRfdCBuYl9zYW1wbGVzOworICAgIC8qCisgICAgICogdGltZXN0YW1wIG9mIHRoZSBmaXJzdCBmcmFtZSBpbiB0aGUgb3V0cHV0LCBpbiB0aGUgdGltZWJhc2UgdW5pdHMKKyAgICAgKi8KKyAgICBpbnQ2NF90IGZpcnN0X3B0czsKKyAgICAvKgorICAgICAqIGR1cmF0aW9uIGluIHRoZSB0aW1lYmFzZSB1bml0cworICAgICAqLworICAgIGludDY0X3QgZHVyYXRpb25fdGI7CisKKyAgICBpbnQ2NF90IG5leHRfcHRzOworCisgICAgaW50IGVvZjsKK30gVHJpbUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFRyaW1Db250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgcy0+Zmlyc3RfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBUcmltQ29udGV4dCAgICAgICAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVlJhdGlvbmFsIHRiID0gKGlubGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pID8KKyAgICAgICAgICAgICAgICAgICAgIGlubGluay0+dGltZV9iYXNlIDogKEFWUmF0aW9uYWwpeyAxLCBpbmxpbmstPnNhbXBsZV9yYXRlIH07CisKKyAgICBpZiAocy0+c3RhcnRfdGltZV9kYmwgIT0gREJMX01BWCkKKyAgICAgICAgcy0+c3RhcnRfdGltZSA9IHMtPnN0YXJ0X3RpbWVfZGJsICogMWU2OworICAgIGlmIChzLT5lbmRfdGltZV9kYmwgIT0gREJMX01BWCkKKyAgICAgICAgcy0+ZW5kX3RpbWUgPSBzLT5lbmRfdGltZV9kYmwgKiAxZTY7CisgICAgaWYgKHMtPmR1cmF0aW9uX2RibCAhPSAwKQorICAgICAgICBzLT5kdXJhdGlvbiA9IHMtPmR1cmF0aW9uX2RibCAqIDFlNjsKKworICAgIGlmIChzLT5zdGFydF90aW1lICE9IElOVDY0X01BWCkgeworICAgICAgICBpbnQ2NF90IHN0YXJ0X3B0cyA9IGF2X3Jlc2NhbGVfcShzLT5zdGFydF90aW1lLCBBVl9USU1FX0JBU0VfUSwgdGIpOworICAgICAgICBpZiAocy0+c3RhcnRfcHRzID09IEFWX05PUFRTX1ZBTFVFIHx8IHN0YXJ0X3B0cyA8IHMtPnN0YXJ0X3B0cykKKyAgICAgICAgICAgIHMtPnN0YXJ0X3B0cyA9IHN0YXJ0X3B0czsKKyAgICB9CisgICAgaWYgKHMtPmVuZF90aW1lICE9IElOVDY0X01BWCkgeworICAgICAgICBpbnQ2NF90IGVuZF9wdHMgPSBhdl9yZXNjYWxlX3Eocy0+ZW5kX3RpbWUsIEFWX1RJTUVfQkFTRV9RLCB0Yik7CisgICAgICAgIGlmIChzLT5lbmRfcHRzID09IEFWX05PUFRTX1ZBTFVFIHx8IGVuZF9wdHMgPiBzLT5lbmRfcHRzKQorICAgICAgICAgICAgcy0+ZW5kX3B0cyA9IGVuZF9wdHM7CisgICAgfQorICAgIGlmIChzLT5kdXJhdGlvbikKKyAgICAgICAgcy0+ZHVyYXRpb25fdGIgPSBhdl9yZXNjYWxlX3Eocy0+ZHVyYXRpb24sIEFWX1RJTUVfQkFTRV9RLCB0Yik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBvdXRsaW5rLT5mbGFncyB8PSBGRl9MSU5LX0ZMQUdfUkVRVUVTVF9MT09QOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihUcmltQ29udGV4dCwgeCkKKyNkZWZpbmUgQ09NTU9OX09QVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAic3RhcnRpIiwgICAgICAiVGltZXN0YW1wIG9mIHRoZSBmaXJzdCBmcmFtZSB0aGF0ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNob3VsZCBiZSBwYXNzZWQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3RhcnRfdGltZSksICBBVl9PUFRfVFlQRV9EVVJBVElPTiwgeyAuaTY0ID0gSU5UNjRfTUFYIH0sICAgIElOVDY0X01JTiwgSU5UNjRfTUFYLCBGTEFHUyB9LCBcCisgICAgeyAiZW5kaSIsICAgICAgICAiVGltZXN0YW1wIG9mIHRoZSBmaXJzdCBmcmFtZSB0aGF0ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNob3VsZCBiZSBkcm9wcGVkIGFnYWluIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZW5kX3RpbWUpLCAgICBBVl9PUFRfVFlQRV9EVVJBVElPTiwgeyAuaTY0ID0gSU5UNjRfTUFYIH0sICAgIElOVDY0X01JTiwgSU5UNjRfTUFYLCBGTEFHUyB9LCBcCisgICAgeyAic3RhcnRfcHRzIiwgICAiVGltZXN0YW1wIG9mIHRoZSBmaXJzdCBmcmFtZSB0aGF0IHNob3VsZCBiZSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICIgcGFzc2VkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChzdGFydF9wdHMpLCAgIEFWX09QVF9UWVBFX0lOVDY0LCAgeyAuaTY0ID0gQVZfTk9QVFNfVkFMVUUgfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIEZMQUdTIH0sIFwKKyAgICB7ICJlbmRfcHRzIiwgICAgICJUaW1lc3RhbXAgb2YgdGhlIGZpcnN0IGZyYW1lIHRoYXQgc2hvdWxkIGJlICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJkcm9wcGVkIGFnYWluIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGVuZF9wdHMpLCAgICAgQVZfT1BUX1RZUEVfSU5UNjQsICB7IC5pNjQgPSBBVl9OT1BUU19WQUxVRSB9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgRkxBR1MgfSwgXAorICAgIHsgImR1cmF0aW9uaSIsICAgIk1heGltdW0gZHVyYXRpb24gb2YgdGhlIG91dHB1dCIsICAgICAgICAgICAgICAgICAgIE9GRlNFVChkdXJhdGlvbiksICAgIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7IC5pNjQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAwLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisKKyNkZWZpbmUgQ09NUEFUX09QVFMgXAorICAgIHsgInN0YXJ0IiwgICAgICAgIlRpbWVzdGFtcCBpbiBzZWNvbmRzIG9mIHRoZSBmaXJzdCBmcmFtZSB0aGF0ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNob3VsZCBiZSBwYXNzZWQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3RhcnRfdGltZV9kYmwpLEFWX09QVF9UWVBFX0RPVUJMRSwgeyAuZGJsID0gREJMX01BWCB9LCAgICAgICAtREJMX01BWCwgREJMX01BWCwgICAgIEZMQUdTIH0sIFwKKyAgICB7ICJlbmQiLCAgICAgICAgICJUaW1lc3RhbXAgaW4gc2Vjb25kcyBvZiB0aGUgZmlyc3QgZnJhbWUgdGhhdCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzaG91bGQgYmUgZHJvcHBlZCBhZ2FpbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGVuZF90aW1lX2RibCksICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IERCTF9NQVggfSwgICAgICAgLURCTF9NQVgsIERCTF9NQVgsICAgICBGTEFHUyB9LCBcCisgICAgeyAiZHVyYXRpb24iLCAgICAiTWF4aW11bSBkdXJhdGlvbiBvZiB0aGUgb3V0cHV0IGluIHNlY29uZHMiLCAgICAgICAgT0ZGU0VUKGR1cmF0aW9uX2RibCksICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgMCwgICBEQkxfTUFYLCBGTEFHUyB9LAorCisKKyNpZiBDT05GSUdfVFJJTV9GSUxURVIKK3N0YXRpYyBpbnQgdHJpbV9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgVHJpbUNvbnRleHQgICAgICAgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGRyb3A7CisKKyAgICAvKiBkcm9wIGV2ZXJ5dGhpbmcgaWYgRU9GIGhhcyBhbHJlYWR5IGJlZW4gcmV0dXJuZWQgKi8KKyAgICBpZiAocy0+ZW9mKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHMtPnN0YXJ0X2ZyYW1lID49IDAgfHwgcy0+c3RhcnRfcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGRyb3AgPSAxOworICAgICAgICBpZiAocy0+c3RhcnRfZnJhbWUgPj0gMCAmJiBzLT5uYl9mcmFtZXMgPj0gcy0+c3RhcnRfZnJhbWUpCisgICAgICAgICAgICBkcm9wID0gMDsKKyAgICAgICAgaWYgKHMtPnN0YXJ0X3B0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFICYmCisgICAgICAgICAgICBmcmFtZS0+cHRzID49IHMtPnN0YXJ0X3B0cykKKyAgICAgICAgICAgIGRyb3AgPSAwOworICAgICAgICBpZiAoZHJvcCkKKyAgICAgICAgICAgIGdvdG8gZHJvcDsKKyAgICB9CisKKyAgICBpZiAocy0+Zmlyc3RfcHRzID09IEFWX05PUFRTX1ZBTFVFICYmIGZyYW1lLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHMtPmZpcnN0X3B0cyA9IGZyYW1lLT5wdHM7CisKKyAgICBpZiAocy0+ZW5kX2ZyYW1lICE9IElOVDY0X01BWCB8fCBzLT5lbmRfcHRzICE9IEFWX05PUFRTX1ZBTFVFIHx8IHMtPmR1cmF0aW9uX3RiKSB7CisgICAgICAgIGRyb3AgPSAxOworCisgICAgICAgIGlmIChzLT5lbmRfZnJhbWUgIT0gSU5UNjRfTUFYICYmIHMtPm5iX2ZyYW1lcyA8IHMtPmVuZF9mcmFtZSkKKyAgICAgICAgICAgIGRyb3AgPSAwOworICAgICAgICBpZiAocy0+ZW5kX3B0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFICYmCisgICAgICAgICAgICBmcmFtZS0+cHRzIDwgcy0+ZW5kX3B0cykKKyAgICAgICAgICAgIGRyb3AgPSAwOworICAgICAgICBpZiAocy0+ZHVyYXRpb25fdGIgJiYgZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICAgICAgZnJhbWUtPnB0cyAtIHMtPmZpcnN0X3B0cyA8IHMtPmR1cmF0aW9uX3RiKQorICAgICAgICAgICAgZHJvcCA9IDA7CisKKyAgICAgICAgaWYgKGRyb3ApIHsKKyAgICAgICAgICAgIHMtPmVvZiA9IGlubGluay0+Y2xvc2VkID0gMTsKKyAgICAgICAgICAgIGdvdG8gZHJvcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPm5iX2ZyYW1lcysrOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIGZyYW1lKTsKKworZHJvcDoKKyAgICBzLT5uYl9mcmFtZXMrKzsKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiB0cmltX29wdGlvbnNbXSA9IHsKKyAgICBDT01NT05fT1BUUworICAgIHsgInN0YXJ0X2ZyYW1lIiwgIk51bWJlciBvZiB0aGUgZmlyc3QgZnJhbWUgdGhhdCBzaG91bGQgYmUgcGFzc2VkICIKKyAgICAgICAgInRvIHRoZSBvdXRwdXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3RhcnRfZnJhbWUpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgIHsgLmk2NCA9IC0xIH0sICAgICAgIC0xLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisgICAgeyAiZW5kX2ZyYW1lIiwgICAiTnVtYmVyIG9mIHRoZSBmaXJzdCBmcmFtZSB0aGF0IHNob3VsZCBiZSBkcm9wcGVkICIKKyAgICAgICAgImFnYWluIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZW5kX2ZyYW1lKSwgICBBVl9PUFRfVFlQRV9JTlQ2NCwgIHsgLmk2NCA9IElOVDY0X01BWCB9LCAwLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisgICAgQ09NUEFUX09QVFMKKyAgICB7IE5VTEwgfQorfTsKKyN1bmRlZiBGTEFHUworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1ModHJpbSk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB0cmltX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IHRyaW1fZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB0cmltX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3RyaW0gPSB7CisgICAgLm5hbWUgICAgICAgID0gInRyaW0iLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQaWNrIG9uZSBjb250aW51b3VzIHNlY3Rpb24gZnJvbSB0aGUgaW5wdXQsIGRyb3AgdGhlIHJlc3QuIiksCisgICAgLmluaXQgICAgICAgID0gaW5pdCwKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoVHJpbUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICA9ICZ0cmltX2NsYXNzLAorICAgIC5pbnB1dHMgICAgICA9IHRyaW1faW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IHRyaW1fb3V0cHV0cywKK307CisjZW5kaWYgLy8gQ09ORklHX1RSSU1fRklMVEVSCisKKyNpZiBDT05GSUdfQVRSSU1fRklMVEVSCitzdGF0aWMgaW50IGF0cmltX2ZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBUcmltQ29udGV4dCAgICAgICAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQ2NF90IHN0YXJ0X3NhbXBsZSwgZW5kX3NhbXBsZTsKKyAgICBpbnQ2NF90IHB0czsKKyAgICBpbnQgZHJvcDsKKworICAgIC8qIGRyb3AgZXZlcnl0aGluZyBpZiBFT0YgaGFzIGFscmVhZHkgYmVlbiByZXR1cm5lZCAqLworICAgIGlmIChzLT5lb2YpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcHRzID0gYXZfcmVzY2FsZV9xKGZyYW1lLT5wdHMsIGlubGluay0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyAxLCBpbmxpbmstPnNhbXBsZV9yYXRlIH0pOworICAgIGVsc2UKKyAgICAgICAgcHRzID0gcy0+bmV4dF9wdHM7CisgICAgcy0+bmV4dF9wdHMgPSBwdHMgKyBmcmFtZS0+bmJfc2FtcGxlczsKKworICAgIC8qIGNoZWNrIGlmIGF0IGxlYXN0IGEgcGFydCBvZiB0aGUgZnJhbWUgaXMgYWZ0ZXIgdGhlIHN0YXJ0IHRpbWUgKi8KKyAgICBpZiAocy0+c3RhcnRfc2FtcGxlIDwgMCAmJiBzLT5zdGFydF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgc3RhcnRfc2FtcGxlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBkcm9wID0gMTsKKyAgICAgICAgc3RhcnRfc2FtcGxlID0gZnJhbWUtPm5iX3NhbXBsZXM7CisKKyAgICAgICAgaWYgKHMtPnN0YXJ0X3NhbXBsZSA+PSAwICYmCisgICAgICAgICAgICBzLT5uYl9zYW1wbGVzICsgZnJhbWUtPm5iX3NhbXBsZXMgPiBzLT5zdGFydF9zYW1wbGUpIHsKKyAgICAgICAgICAgIGRyb3AgICAgICAgICA9IDA7CisgICAgICAgICAgICBzdGFydF9zYW1wbGUgPSBGRk1JTihzdGFydF9zYW1wbGUsIHMtPnN0YXJ0X3NhbXBsZSAtIHMtPm5iX3NhbXBsZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnN0YXJ0X3B0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBwdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgICAgIHB0cyArIGZyYW1lLT5uYl9zYW1wbGVzID4gcy0+c3RhcnRfcHRzKSB7CisgICAgICAgICAgICBkcm9wID0gMDsKKyAgICAgICAgICAgIHN0YXJ0X3NhbXBsZSA9IEZGTUlOKHN0YXJ0X3NhbXBsZSwgcy0+c3RhcnRfcHRzIC0gcHRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkcm9wKQorICAgICAgICAgICAgZ290byBkcm9wOworICAgIH0KKworICAgIGlmIChzLT5maXJzdF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHMtPmZpcnN0X3B0cyA9IHB0cyArIHN0YXJ0X3NhbXBsZTsKKworICAgIC8qIGNoZWNrIGlmIGF0IGxlYXN0IGEgcGFydCBvZiB0aGUgZnJhbWUgaXMgYmVmb3JlIHRoZSBlbmQgdGltZSAqLworICAgIGlmIChzLT5lbmRfc2FtcGxlID09IElOVDY0X01BWCAmJiBzLT5lbmRfcHRzID09IEFWX05PUFRTX1ZBTFVFICYmICFzLT5kdXJhdGlvbl90YikgeworICAgICAgICBlbmRfc2FtcGxlID0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHJvcCAgICAgICA9IDE7CisgICAgICAgIGVuZF9zYW1wbGUgPSAwOworCisgICAgICAgIGlmIChzLT5lbmRfc2FtcGxlICE9IElOVDY0X01BWCAmJgorICAgICAgICAgICAgcy0+bmJfc2FtcGxlcyA8IHMtPmVuZF9zYW1wbGUpIHsKKyAgICAgICAgICAgIGRyb3AgICAgICAgPSAwOworICAgICAgICAgICAgZW5kX3NhbXBsZSA9IEZGTUFYKGVuZF9zYW1wbGUsIHMtPmVuZF9zYW1wbGUgLSBzLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5lbmRfcHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIHB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICAgICAgcHRzIDwgcy0+ZW5kX3B0cykgeworICAgICAgICAgICAgZHJvcCAgICAgICA9IDA7CisgICAgICAgICAgICBlbmRfc2FtcGxlID0gRkZNQVgoZW5kX3NhbXBsZSwgcy0+ZW5kX3B0cyAtIHB0cyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+ZHVyYXRpb25fdGIgJiYgcHRzIC0gcy0+Zmlyc3RfcHRzIDwgcy0+ZHVyYXRpb25fdGIpIHsKKyAgICAgICAgICAgIGRyb3AgICAgICAgPSAwOworICAgICAgICAgICAgZW5kX3NhbXBsZSA9IEZGTUFYKGVuZF9zYW1wbGUsIHMtPmZpcnN0X3B0cyArIHMtPmR1cmF0aW9uX3RiIC0gcHRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkcm9wKSB7CisgICAgICAgICAgICBzLT5lb2YgPSBpbmxpbmstPmNsb3NlZCA9IDE7CisgICAgICAgICAgICBnb3RvIGRyb3A7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5uYl9zYW1wbGVzICs9IGZyYW1lLT5uYl9zYW1wbGVzOworICAgIHN0YXJ0X3NhbXBsZSAgID0gRkZNQVgoMCwgc3RhcnRfc2FtcGxlKTsKKyAgICBlbmRfc2FtcGxlICAgICA9IEZGTUlOKGZyYW1lLT5uYl9zYW1wbGVzLCBlbmRfc2FtcGxlKTsKKyAgICBhdl9hc3NlcnQwKHN0YXJ0X3NhbXBsZSA8IGVuZF9zYW1wbGUgfHwgKHN0YXJ0X3NhbXBsZSA9PSBlbmRfc2FtcGxlICYmICFmcmFtZS0+bmJfc2FtcGxlcykpOworCisgICAgaWYgKHN0YXJ0X3NhbXBsZSkgeworICAgICAgICBBVkZyYW1lICpvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGN0eC0+b3V0cHV0c1swXSwgZW5kX3NhbXBsZSAtIHN0YXJ0X3NhbXBsZSk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGZyYW1lKTsKKyAgICAgICAgYXZfc2FtcGxlc19jb3B5KG91dC0+ZXh0ZW5kZWRfZGF0YSwgZnJhbWUtPmV4dGVuZGVkX2RhdGEsIDAsIHN0YXJ0X3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+bmJfc2FtcGxlcywgaW5saW5rLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5mb3JtYXQpOworICAgICAgICBpZiAob3V0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBvdXQtPnB0cyArPSBhdl9yZXNjYWxlX3Eoc3RhcnRfc2FtcGxlLCAoQVZSYXRpb25hbCl7IDEsIG91dC0+c2FtcGxlX3JhdGUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPnRpbWVfYmFzZSk7CisKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICBmcmFtZSA9IG91dDsKKyAgICB9IGVsc2UKKyAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBlbmRfc2FtcGxlOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIGZyYW1lKTsKKworZHJvcDoKKyAgICBzLT5uYl9zYW1wbGVzICs9IGZyYW1lLT5uYl9zYW1wbGVzOworICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19BVURJT19QQVJBTSB8IEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGF0cmltX29wdGlvbnNbXSA9IHsKKyAgICBDT01NT05fT1BUUworICAgIHsgInN0YXJ0X3NhbXBsZSIsICJOdW1iZXIgb2YgdGhlIGZpcnN0IGF1ZGlvIHNhbXBsZSB0aGF0IHNob3VsZCBiZSAiCisgICAgICAgICJwYXNzZWQgdG8gdGhlIG91dHB1dCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHN0YXJ0X3NhbXBsZSksIEFWX09QVF9UWVBFX0lOVDY0LCAgeyAuaTY0ID0gLTEgfSwgICAgICAgLTEsIElOVDY0X01BWCwgRkxBR1MgfSwKKyAgICB7ICJlbmRfc2FtcGxlIiwgICAiTnVtYmVyIG9mIHRoZSBmaXJzdCBhdWRpbyBzYW1wbGUgdGhhdCBzaG91bGQgYmUgIgorICAgICAgICAiZHJvcHBlZCBhZ2FpbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChlbmRfc2FtcGxlKSwgICBBVl9PUFRfVFlQRV9JTlQ2NCwgIHsgLmk2NCA9IElOVDY0X01BWCB9LCAwLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisgICAgQ09NUEFUX09QVFMKKyAgICB7IE5VTEwgfQorfTsKKyN1bmRlZiBGTEFHUworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYXRyaW0pOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXRyaW1faW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gYXRyaW1fZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdHJpbV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hdHJpbSA9IHsKKyAgICAubmFtZSAgICAgICAgPSAiYXRyaW0iLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQaWNrIG9uZSBjb250aW51b3VzIHNlY3Rpb24gZnJvbSB0aGUgaW5wdXQsIGRyb3AgdGhlIHJlc3QuIiksCisgICAgLmluaXQgICAgICAgID0gaW5pdCwKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoVHJpbUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICA9ICZhdHJpbV9jbGFzcywKKyAgICAuaW5wdXRzICAgICAgPSBhdHJpbV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgID0gYXRyaW1fb3V0cHV0cywKK307CisjZW5kaWYgLy8gQ09ORklHX0FUUklNX0ZJTFRFUgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3Vuc2hhcnAuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci91bnNoYXJwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhZWQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci91bnNoYXJwLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBXZWkgR2FvIDx3ZWlnYW9AbXVsdGljb3Jld2FyZWluYy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgTGVubnkgV2FuZworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX1VOU0hBUlBfSAorI2RlZmluZSBBVkZJTFRFUl9VTlNIQVJQX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaWYgQ09ORklHX09QRU5DTAorI2luY2x1ZGUgImxpYmF2dXRpbC9vcGVuY2wuaCIKKyNlbmRpZgorCisjZGVmaW5lIE1JTl9NQVRSSVhfU0laRSAzCisjZGVmaW5lIE1BWF9NQVRSSVhfU0laRSA2MworCisjaWYgQ09ORklHX09QRU5DTAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlOworICAgIGNsX3Byb2dyYW0gcHJvZ3JhbTsKKyAgICBjbF9rZXJuZWwga2VybmVsX2RlZmF1bHQ7CisgICAgY2xfa2VybmVsIGtlcm5lbF9sdW1hOworICAgIGNsX2tlcm5lbCBrZXJuZWxfY2hyb21hOworICAgIGNsX21lbSBjbF9sdW1hX21hc2s7CisgICAgY2xfbWVtIGNsX2Nocm9tYV9tYXNrOworICAgIGludCBpbl9wbGFuZV9zaXplWzhdOworICAgIGludCBvdXRfcGxhbmVfc2l6ZVs4XTsKKyAgICBpbnQgcGxhbmVfbnVtOworICAgIGNsX21lbSBjbF9pbmJ1ZjsKKyAgICBzaXplX3QgY2xfaW5idWZfc2l6ZTsKKyAgICBjbF9tZW0gY2xfb3V0YnVmOworICAgIHNpemVfdCBjbF9vdXRidWZfc2l6ZTsKKyAgICBpbnQgdXNlX2Zhc3Rfa2VybmVsczsKK30gVW5zaGFycE9wZW5jbENvbnRleHQ7CisKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBVbnNoYXJwRmlsdGVyUGFyYW0geworICAgIGludCBtc2l6ZV94OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXRyaXggd2lkdGgKKyAgICBpbnQgbXNpemVfeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbWF0cml4IGhlaWdodAorICAgIGludCBhbW91bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBlZmZlY3QgYW1vdW50CisgICAgaW50IHN0ZXBzX3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGhvcml6b250YWwgc3RlcCBjb3VudAorICAgIGludCBzdGVwc195OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB2ZXJ0aWNhbCBzdGVwIGNvdW50CisgICAgaW50IHNjYWxlYml0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGJpdHMgdG8gc2hpZnQgcGl4ZWwKKyAgICBpbnQzMl90IGhhbGZzY2FsZTsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYW1vdW50IHRvIGFkZCB0byBwaXhlbAorICAgIHVpbnQzMl90ICpzY1tNQVhfTUFUUklYX1NJWkUgLSAxXTsgICAgICAgLy8vPCBmaW5pdGUgc3RhdGUgbWFjaGluZSBzdG9yYWdlCit9IFVuc2hhcnBGaWx0ZXJQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgVW5zaGFycENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBsbXNpemVfeCwgbG1zaXplX3ksIGNtc2l6ZV94LCBjbXNpemVfeTsKKyAgICBmbG9hdCBsYW1vdW50LCBjYW1vdW50OworICAgIFVuc2hhcnBGaWx0ZXJQYXJhbSBsdW1hOyAgIC8vLzwgbHVtYSBwYXJhbWV0ZXJzICh3aWR0aCwgaGVpZ2h0LCBhbW91bnQpCisgICAgVW5zaGFycEZpbHRlclBhcmFtIGNocm9tYTsgLy8vPCBjaHJvbWEgcGFyYW1ldGVycyAod2lkdGgsIGhlaWdodCwgYW1vdW50KQorICAgIGludCBoc3ViLCB2c3ViOworICAgIGludCBvcGVuY2w7CisjaWYgQ09ORklHX09QRU5DTAorICAgIFVuc2hhcnBPcGVuY2xDb250ZXh0IG9wZW5jbF9jdHg7CisjZW5kaWYKKyAgICBpbnQgKCogYXBwbHlfdW5zaGFycCkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQpOworfSBVbnNoYXJwQ29udGV4dDsKKworI2VuZGlmIC8qIEFWRklMVEVSX1VOU0hBUlBfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3Vuc2hhcnBfb3BlbmNsLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdW5zaGFycF9vcGVuY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzZiNWVmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3Vuc2hhcnBfb3BlbmNsLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgV2VpIEdhbyA8d2VpZ2FvQG11bHRpY29yZXdhcmVpbmMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIExlbm55IFdhbmcKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogdW5zaGFycCBpbnB1dCB2aWRlbworICovCisKKyNpbmNsdWRlICJ1bnNoYXJwX29wZW5jbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3BlbmNsX2ludGVybmFsLmgiCisKKyNkZWZpbmUgUExBTkVfTlVNIDMKKyNkZWZpbmUgUk9VTkRfVE9fMTYoYSkgKCgoKChhKSAtIDEpLzE2KSsxKSoxNikKKworc3RhdGljIGlubGluZSB2b2lkIGFkZF9tYXNrX2NvdW50ZXIodWludDMyX3QgKmRzdCwgdWludDMyX3QgKmNvdW50ZXIxLCB1aW50MzJfdCAqY291bnRlcjIsIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGRzdFtpXSA9IGNvdW50ZXIxW2ldICsgY291bnRlcjJbaV07CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbXB1dGVfbWFzayhpbnQgc3RlcCwgdWludDMyX3QgKm1hc2spCit7CisgICAgaW50IGksIHosIHJldCA9IDA7CisgICAgaW50IGNvdW50ZXJfc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKiAoMiAqIHN0ZXAgKyAxKTsKKyAgICB1aW50MzJfdCAqdGVtcDFfY291bnRlciwgKnRlbXAyX2NvdW50ZXIsICoqY291bnRlcjsKKyAgICB0ZW1wMV9jb3VudGVyID0gYXZfbWFsbG9jeihjb3VudGVyX3NpemUpOworICAgIGlmICghdGVtcDFfY291bnRlcikgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICB0ZW1wMl9jb3VudGVyID0gYXZfbWFsbG9jeihjb3VudGVyX3NpemUpOworICAgIGlmICghdGVtcDJfY291bnRlcikgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBjb3VudGVyID0gYXZfbWFsbG9jel9hcnJheSgyICogc3RlcCArIDEsIHNpemVvZih1aW50MzJfdCAqKSk7CisgICAgaWYgKCFjb3VudGVyKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAyICogc3RlcCArIDE7IGkrKykgeworICAgICAgICBjb3VudGVyW2ldID0gYXZfbWFsbG9jeihjb3VudGVyX3NpemUpOworICAgICAgICBpZiAoIWNvdW50ZXJbaV0pIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAyICogc3RlcCArIDE7IGkrKykgeworICAgICAgICBtZW1zZXQodGVtcDFfY291bnRlciwgMCwgY291bnRlcl9zaXplKTsKKyAgICAgICAgdGVtcDFfY291bnRlcltpXSA9IDE7CisgICAgICAgIGZvciAoeiA9IDA7IHogPCBzdGVwICogMjsgeiArPSAyKSB7CisgICAgICAgICAgICBhZGRfbWFza19jb3VudGVyKHRlbXAyX2NvdW50ZXIsIGNvdW50ZXJbel0sIHRlbXAxX2NvdW50ZXIsIHN0ZXAgKiAyKTsKKyAgICAgICAgICAgIG1lbWNweShjb3VudGVyW3pdLCB0ZW1wMV9jb3VudGVyLCBjb3VudGVyX3NpemUpOworICAgICAgICAgICAgYWRkX21hc2tfY291bnRlcih0ZW1wMV9jb3VudGVyLCBjb3VudGVyW3ogKyAxXSwgdGVtcDJfY291bnRlciwgc3RlcCAqIDIpOworICAgICAgICAgICAgbWVtY3B5KGNvdW50ZXJbeiArIDFdLCB0ZW1wMl9jb3VudGVyLCBjb3VudGVyX3NpemUpOworICAgICAgICB9CisgICAgfQorICAgIG1lbWNweShtYXNrLCB0ZW1wMV9jb3VudGVyLCBjb3VudGVyX3NpemUpOworZW5kOgorICAgIGF2X2ZyZWVwKCZ0ZW1wMV9jb3VudGVyKTsKKyAgICBhdl9mcmVlcCgmdGVtcDJfY291bnRlcik7CisgICAgZm9yIChpID0gMDsgaSA8IDIgKiBzdGVwICsgMTsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWVwKCZjb3VudGVyW2ldKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmNvdW50ZXIpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29tcHV0ZV9tYXNrX21hdHJpeChjbF9tZW0gY2xfbWFza19tYXRyaXgsIGludCBzdGVwX3gsIGludCBzdGVwX3kpCit7CisgICAgaW50IGksIGosIHJldCA9IDA7CisgICAgdWludDMyX3QgKm1hc2tfbWF0cml4LCAqbWFza194LCAqbWFza195OworICAgIHNpemVfdCBzaXplX21hdHJpeCA9IHNpemVvZih1aW50MzJfdCkgKiAoMiAqIHN0ZXBfeCArIDEpICogKDIgKiBzdGVwX3kgKyAxKTsKKyAgICBtYXNrX3ggPSBhdl9tYWxsb2N6X2FycmF5KDIgKiBzdGVwX3ggKyAxLCBzaXplb2YodWludDMyX3QpKTsKKyAgICBpZiAoIW1hc2tfeCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBtYXNrX3kgPSBhdl9tYWxsb2N6X2FycmF5KDIgKiBzdGVwX3kgKyAxLCBzaXplb2YodWludDMyX3QpKTsKKyAgICBpZiAoIW1hc2tfeSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBtYXNrX21hdHJpeCA9IGF2X21hbGxvY3ooc2l6ZV9tYXRyaXgpOworICAgIGlmICghbWFza19tYXRyaXgpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgcmV0ID0gY29tcHV0ZV9tYXNrKHN0ZXBfeCwgbWFza194KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisgICAgcmV0ID0gY29tcHV0ZV9tYXNrKHN0ZXBfeSwgbWFza195KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisgICAgZm9yIChqID0gMDsgaiA8IDIgKiBzdGVwX3kgKyAxOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgKiBzdGVwX3ggKyAxOyBpKyspIHsKKyAgICAgICAgICAgIG1hc2tfbWF0cml4W2kgKyBqICogKDIgKiBzdGVwX3ggKyAxKV0gPSBtYXNrX3lbal0gKiBtYXNrX3hbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0ID0gYXZfb3BlbmNsX2J1ZmZlcl93cml0ZShjbF9tYXNrX21hdHJpeCwgKHVpbnQ4X3QgKiltYXNrX21hdHJpeCwgc2l6ZV9tYXRyaXgpOworZW5kOgorICAgIGF2X2ZyZWVwKCZtYXNrX3gpOworICAgIGF2X2ZyZWVwKCZtYXNrX3kpOworICAgIGF2X2ZyZWVwKCZtYXNrX21hdHJpeCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9tYXNrKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFVuc2hhcnBDb250ZXh0ICp1bnNoYXJwID0gY3R4LT5wcml2OworICAgIGludCBpLCByZXQgPSAwLCBzdGVwX3hbMl0sIHN0ZXBfeVsyXTsKKyAgICBjbF9tZW0gbWFza19tYXRyaXhbMl07CisgICAgbWFza19tYXRyaXhbMF0gPSB1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2x1bWFfbWFzazsKKyAgICBtYXNrX21hdHJpeFsxXSA9IHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfY2hyb21hX21hc2s7CisgICAgc3RlcF94WzBdID0gdW5zaGFycC0+bHVtYS5zdGVwc194OworICAgIHN0ZXBfeFsxXSA9IHVuc2hhcnAtPmNocm9tYS5zdGVwc194OworICAgIHN0ZXBfeVswXSA9IHVuc2hhcnAtPmx1bWEuc3RlcHNfeTsKKyAgICBzdGVwX3lbMV0gPSB1bnNoYXJwLT5jaHJvbWEuc3RlcHNfeTsKKworICAgIC8qIHVzZSBkZWZhdWx0IGtlcm5lbCBpZiBhbnkgbWF0cml4IGRpbSBsYXJnZXIgdGhhbiA4IGR1ZSB0byBsaW1pdGVkIGxvY2FsIG1lbSBzaXplICovCisgICAgaWYgKHN0ZXBfeFswXT44IHx8IHN0ZXBfeFsxXT44IHx8IHN0ZXBfeVswXT44IHx8IHN0ZXBfeVsxXT44KQorICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LnVzZV9mYXN0X2tlcm5lbHMgPSAwOworICAgIGVsc2UKKyAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC51c2VfZmFzdF9rZXJuZWxzID0gMTsKKworICAgIGlmICghbWFza19tYXRyaXhbMF0gfHwgIW1hc2tfbWF0cml4WzFdKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkx1bWEgbWFzayBhbmQgY2hyb21hIG1hc2sgc2hvdWxkIG5vdCBiZSBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICByZXQgPSBjb21wdXRlX21hc2tfbWF0cml4KG1hc2tfbWF0cml4W2ldLCBzdGVwX3hbaV0sIHN0ZXBfeVtpXSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX29wZW5jbF9hcHBseV91bnNoYXJwKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0KQoreworICAgIGludCByZXQ7CisgICAgQVZGaWx0ZXJMaW5rICpsaW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgVW5zaGFycENvbnRleHQgKnVuc2hhcnAgPSBjdHgtPnByaXY7CisgICAgY2xfaW50IHN0YXR1czsKKyAgICBGRk9wZW5jbFBhcmFtIGtlcm5lbDEgPSB7MH07CisgICAgRkZPcGVuY2xQYXJhbSBrZXJuZWwyID0gezB9OworICAgIGludCB3aWR0aCA9IGxpbmstPnc7CisgICAgaW50IGhlaWdodCA9IGxpbmstPmg7CisgICAgaW50IGN3ID0gRkZfQ0VJTF9SU0hJRlQobGluay0+dywgdW5zaGFycC0+aHN1Yik7CisgICAgaW50IGNoID0gRkZfQ0VJTF9SU0hJRlQobGluay0+aCwgdW5zaGFycC0+dnN1Yik7CisgICAgc2l6ZV90IGdsb2JhbFdvcmtTaXplMWQgPSB3aWR0aCAqIGhlaWdodCArIDIgKiBjaCAqIGN3OworICAgIHNpemVfdCBnbG9iYWxXb3JrU2l6ZTJkTHVtYVsyXTsKKyAgICBzaXplX3QgZ2xvYmFsV29ya1NpemUyZENocm9tYVsyXTsKKyAgICBzaXplX3QgbG9jYWxXb3JrU2l6ZTJkWzJdID0gezE2LCAxNn07CisKKyAgICBpZiAodW5zaGFycC0+b3BlbmNsX2N0eC51c2VfZmFzdF9rZXJuZWxzKSB7CisgICAgICAgIGdsb2JhbFdvcmtTaXplMmRMdW1hWzBdID0gKHNpemVfdClST1VORF9UT18xNih3aWR0aCk7CisgICAgICAgIGdsb2JhbFdvcmtTaXplMmRMdW1hWzFdID0gKHNpemVfdClST1VORF9UT18xNihoZWlnaHQpOworICAgICAgICBnbG9iYWxXb3JrU2l6ZTJkQ2hyb21hWzBdID0gKHNpemVfdClST1VORF9UT18xNihjdyk7CisgICAgICAgIGdsb2JhbFdvcmtTaXplMmRDaHJvbWFbMV0gPSAoc2l6ZV90KSgyKlJPVU5EX1RPXzE2KGNoKSk7CisKKyAgICAgICAga2VybmVsMS5jdHggPSBjdHg7CisgICAgICAgIGtlcm5lbDEua2VybmVsID0gdW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfbHVtYTsKKyAgICAgICAgcmV0ID0gYXZwcml2X29wZW5jbF9zZXRfcGFyYW1ldGVyKCZrZXJuZWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2luYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+b3BlbmNsX2N0eC5jbF9vdXRidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2x1bWFfbWFzayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmx1bWEuYW1vdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+bHVtYS5zY2FsZWJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5sdW1hLmhhbGZzY2FsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGluLT5saW5lc2l6ZVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKG91dC0+bGluZXNpemVbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGhlaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAga2VybmVsMi5jdHggPSBjdHg7CisgICAgICAgIGtlcm5lbDIua2VybmVsID0gdW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfY2hyb21hOworICAgICAgICByZXQgPSBhdnByaXZfb3BlbmNsX3NldF9wYXJhbWV0ZXIoJmtlcm5lbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfaW5idWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX291dGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfY2hyb21hX21hc2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5jaHJvbWEuYW1vdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+Y2hyb21hLnNjYWxlYml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmNocm9tYS5oYWxmc2NhbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhpbi0+bGluZXNpemVbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhpbi0+bGluZXNpemVbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhvdXQtPmxpbmVzaXplWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8ob3V0LT5saW5lc2l6ZVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGxpbmstPncpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhsaW5rLT5oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oY3cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhjaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHN0YXR1cyA9IGNsRW5xdWV1ZU5EUmFuZ2VLZXJuZWwodW5zaGFycC0+b3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHgua2VybmVsX2x1bWEsIDIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsV29ya1NpemUyZEx1bWEsIGxvY2FsV29ya1NpemUyZCwgMCwgTlVMTCwgTlVMTCk7CisgICAgICAgIHN0YXR1cyB8PWNsRW5xdWV1ZU5EUmFuZ2VLZXJuZWwodW5zaGFycC0+b3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHgua2VybmVsX2Nocm9tYSwgMiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxXb3JrU2l6ZTJkQ2hyb21hLCBsb2NhbFdvcmtTaXplMmQsIDAsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBydW4ga2VybmVsIGVycm9yIG9jY3VycmVkOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICB9CisgICAgfSBlbHNlIHsgICAgLyogdXNlIGRlZmF1bHQga2VybmVsICovCisgICAgICAgIGtlcm5lbDEuY3R4ID0gY3R4OworICAgICAgICBrZXJuZWwxLmtlcm5lbCA9IHVuc2hhcnAtPm9wZW5jbF9jdHgua2VybmVsX2RlZmF1bHQ7CisKKyAgICAgICAgcmV0ID0gYXZwcml2X29wZW5jbF9zZXRfcGFyYW1ldGVyKCZrZXJuZWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2luYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+b3BlbmNsX2N0eC5jbF9vdXRidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2x1bWFfbWFzayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfY2hyb21hX21hc2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5sdW1hLmFtb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmNocm9tYS5hbW91bnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5sdW1hLnN0ZXBzX3gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5sdW1hLnN0ZXBzX3kpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5jaHJvbWEuc3RlcHNfeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmNocm9tYS5zdGVwc195KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+bHVtYS5zY2FsZWJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5jaHJvbWEuc2NhbGViaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+bHVtYS5oYWxmc2NhbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5jaHJvbWEuaGFsZnNjYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oaW4tPmxpbmVzaXplWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oaW4tPmxpbmVzaXplWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8ob3V0LT5saW5lc2l6ZVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKG91dC0+bGluZXNpemVbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhsaW5rLT5oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8obGluay0+dyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oY3cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBzdGF0dXMgPSBjbEVucXVldWVORFJhbmdlS2VybmVsKHVuc2hhcnAtPm9wZW5jbF9jdHguY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4Lmtlcm5lbF9kZWZhdWx0LCAxLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxXb3JrU2l6ZTFkLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPcGVuQ0wgcnVuIGtlcm5lbCBlcnJvciBvY2N1cnJlZDogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBjbEZpbmlzaCh1bnNoYXJwLT5vcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUpOworICAgIHJldHVybiBhdl9vcGVuY2xfYnVmZmVyX3JlYWRfaW1hZ2Uob3V0LT5kYXRhLCB1bnNoYXJwLT5vcGVuY2xfY3R4Lm91dF9wbGFuZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5wbGFuZV9udW0sIHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfb3V0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9vdXRidWZfc2l6ZSk7Cit9CisKK2ludCBmZl9vcGVuY2xfdW5zaGFycF9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCByZXQgPSAwOworICAgIGNoYXIgYnVpbGRfb3B0c1s5Nl07CisgICAgVW5zaGFycENvbnRleHQgKnVuc2hhcnAgPSBjdHgtPnByaXY7CisgICAgcmV0ID0gYXZfb3BlbmNsX2luaXQoTlVMTCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gYXZfb3BlbmNsX2J1ZmZlcl9jcmVhdGUoJnVuc2hhcnAtPm9wZW5jbF9jdHguY2xfbHVtYV9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKiAoMiAqIHVuc2hhcnAtPmx1bWEuc3RlcHNfeCArIDEpICogKDIgKiB1bnNoYXJwLT5sdW1hLnN0ZXBzX3kgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9NRU1fUkVBRF9PTkxZLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXQgPSBhdl9vcGVuY2xfYnVmZmVyX2NyZWF0ZSgmdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9jaHJvbWFfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpICogKDIgKiB1bnNoYXJwLT5jaHJvbWEuc3RlcHNfeCArIDEpICogKDIgKiB1bnNoYXJwLT5jaHJvbWEuc3RlcHNfeSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX09OTFksIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldCA9IGdlbmVyYXRlX21hc2soY3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LnBsYW5lX251bSA9IFBMQU5FX05VTTsKKyAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUgPSBhdl9vcGVuY2xfZ2V0X2NvbW1hbmRfcXVldWUoKTsKKyAgICBpZiAoIXVuc2hhcnAtPm9wZW5jbF9jdHguY29tbWFuZF9xdWV1ZSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gZ2V0IE9wZW5DTCBjb21tYW5kIHF1ZXVlIGluIGZpbHRlciAndW5zaGFycCdcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBzbnByaW50ZihidWlsZF9vcHRzLCA5NiwgIi1EIExVX1JBRElVU19YPSVkIC1EIExVX1JBRElVU19ZPSVkIC1EIENIX1JBRElVU19YPSVkIC1EIENIX1JBRElVU19ZPSVkIiwKKyAgICAgICAgICAgIDIqdW5zaGFycC0+bHVtYS5zdGVwc194KzEsIDIqdW5zaGFycC0+bHVtYS5zdGVwc195KzEsIDIqdW5zaGFycC0+Y2hyb21hLnN0ZXBzX3grMSwgMip1bnNoYXJwLT5jaHJvbWEuc3RlcHNfeSsxKTsKKyAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LnByb2dyYW0gPSBhdl9vcGVuY2xfY29tcGlsZSgidW5zaGFycCIsIGJ1aWxkX29wdHMpOworICAgIGlmICghdW5zaGFycC0+b3BlbmNsX2N0eC5wcm9ncmFtKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBmYWlsZWQgdG8gY29tcGlsZSBwcm9ncmFtICd1bnNoYXJwJ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmICh1bnNoYXJwLT5vcGVuY2xfY3R4LnVzZV9mYXN0X2tlcm5lbHMpIHsKKyAgICAgICAgaWYgKCF1bnNoYXJwLT5vcGVuY2xfY3R4Lmtlcm5lbF9sdW1hKSB7CisgICAgICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4Lmtlcm5lbF9sdW1hID0gY2xDcmVhdGVLZXJuZWwodW5zaGFycC0+b3BlbmNsX2N0eC5wcm9ncmFtLCAidW5zaGFycF9sdW1hIiwgJnJldCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPcGVuQ0wgZmFpbGVkIHRvIGNyZWF0ZSBrZXJuZWwgJ3Vuc2hhcnBfbHVtYSdcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF1bnNoYXJwLT5vcGVuY2xfY3R4Lmtlcm5lbF9jaHJvbWEpIHsKKyAgICAgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHgua2VybmVsX2Nocm9tYSA9IGNsQ3JlYXRlS2VybmVsKHVuc2hhcnAtPm9wZW5jbF9jdHgucHJvZ3JhbSwgInVuc2hhcnBfY2hyb21hIiwgJnJldCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBmYWlsZWQgdG8gY3JlYXRlIGtlcm5lbCAndW5zaGFycF9jaHJvbWEnXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIXVuc2hhcnAtPm9wZW5jbF9jdHgua2VybmVsX2RlZmF1bHQpIHsKKyAgICAgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHgua2VybmVsX2RlZmF1bHQgPSBjbENyZWF0ZUtlcm5lbCh1bnNoYXJwLT5vcGVuY2xfY3R4LnByb2dyYW0sICJ1bnNoYXJwX2RlZmF1bHQiLCAmcmV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3BlbkNMIGZhaWxlZCB0byBjcmVhdGUga2VybmVsICd1bnNoYXJwX2RlZmF1bHQnXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZmZfb3BlbmNsX3Vuc2hhcnBfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFVuc2hhcnBDb250ZXh0ICp1bnNoYXJwID0gY3R4LT5wcml2OworICAgIGF2X29wZW5jbF9idWZmZXJfcmVsZWFzZSgmdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9pbmJ1Zik7CisgICAgYXZfb3BlbmNsX2J1ZmZlcl9yZWxlYXNlKCZ1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX291dGJ1Zik7CisgICAgYXZfb3BlbmNsX2J1ZmZlcl9yZWxlYXNlKCZ1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2x1bWFfbWFzayk7CisgICAgYXZfb3BlbmNsX2J1ZmZlcl9yZWxlYXNlKCZ1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2Nocm9tYV9tYXNrKTsKKyAgICBjbFJlbGVhc2VLZXJuZWwodW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfZGVmYXVsdCk7CisgICAgY2xSZWxlYXNlS2VybmVsKHVuc2hhcnAtPm9wZW5jbF9jdHgua2VybmVsX2x1bWEpOworICAgIGNsUmVsZWFzZUtlcm5lbCh1bnNoYXJwLT5vcGVuY2xfY3R4Lmtlcm5lbF9jaHJvbWEpOworICAgIGNsUmVsZWFzZVByb2dyYW0odW5zaGFycC0+b3BlbmNsX2N0eC5wcm9ncmFtKTsKKyAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUgPSBOVUxMOworICAgIGF2X29wZW5jbF91bmluaXQoKTsKK30KKworaW50IGZmX29wZW5jbF91bnNoYXJwX3Byb2Nlc3NfaW5vdXRfYnVmKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0KQoreworICAgIGludCByZXQgPSAwOworICAgIEFWRmlsdGVyTGluayAqbGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIFVuc2hhcnBDb250ZXh0ICp1bnNoYXJwID0gY3R4LT5wcml2OworICAgIGludCBjaCA9IEZGX0NFSUxfUlNISUZUKGxpbmstPmgsIHVuc2hhcnAtPnZzdWIpOworCisgICAgaWYgKCghdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9pbmJ1ZikgfHwgKCF1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX291dGJ1ZikpIHsKKyAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5pbl9wbGFuZV9zaXplWzBdICA9IChpbi0+bGluZXNpemVbMF0gKiBpbi0+aGVpZ2h0KTsKKyAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5pbl9wbGFuZV9zaXplWzFdICA9IChpbi0+bGluZXNpemVbMV0gKiBjaCk7CisgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZVsyXSAgPSAoaW4tPmxpbmVzaXplWzJdICogY2gpOworICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4Lm91dF9wbGFuZV9zaXplWzBdID0gKG91dC0+bGluZXNpemVbMF0gKiBvdXQtPmhlaWdodCk7CisgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHgub3V0X3BsYW5lX3NpemVbMV0gPSAob3V0LT5saW5lc2l6ZVsxXSAqIGNoKTsKKyAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5vdXRfcGxhbmVfc2l6ZVsyXSA9IChvdXQtPmxpbmVzaXplWzJdICogY2gpOworICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2luYnVmX3NpemUgID0gdW5zaGFycC0+b3BlbmNsX2N0eC5pbl9wbGFuZV9zaXplWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZVsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LmluX3BsYW5lX3NpemVbMl07CisgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfb3V0YnVmX3NpemUgPSB1bnNoYXJwLT5vcGVuY2xfY3R4Lm91dF9wbGFuZV9zaXplWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHgub3V0X3BsYW5lX3NpemVbMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5vdXRfcGxhbmVfc2l6ZVsyXTsKKyAgICAgICAgaWYgKCF1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2luYnVmKSB7CisgICAgICAgICAgICByZXQgPSBhdl9vcGVuY2xfYnVmZmVyX2NyZWF0ZSgmdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9pbmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfaW5idWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX09OTFksIE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXVuc2hhcnAtPm9wZW5jbF9jdHguY2xfb3V0YnVmKSB7CisgICAgICAgICAgICByZXQgPSBhdl9vcGVuY2xfYnVmZmVyX2NyZWF0ZSgmdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9vdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX291dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfTUVNX1JFQURfV1JJVEUsIE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXZfb3BlbmNsX2J1ZmZlcl93cml0ZV9pbWFnZSh1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2luYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfaW5idWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBpbi0+ZGF0YSwgdW5zaGFycC0+b3BlbmNsX2N0eC5pbl9wbGFuZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHgucGxhbmVfbnVtKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci91bnNoYXJwX29wZW5jbC5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3Vuc2hhcnBfb3BlbmNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlZmFiNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci91bnNoYXJwX29wZW5jbC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgV2VpIEdhbyA8d2VpZ2FvQG11bHRpY29yZXdhcmVpbmMuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX1VOU0hBUlBfT1BFTkNMX0gKKyNkZWZpbmUgQVZGSUxURVJfVU5TSEFSUF9PUEVOQ0xfSAorCisjaW5jbHVkZSAidW5zaGFycC5oIgorCitpbnQgZmZfb3BlbmNsX3Vuc2hhcnBfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCk7CisKK3ZvaWQgZmZfb3BlbmNsX3Vuc2hhcnBfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKKworaW50IGZmX29wZW5jbF91bnNoYXJwX3Byb2Nlc3NfaW5vdXRfYnVmKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0KTsKKworaW50IGZmX29wZW5jbF9hcHBseV91bnNoYXJwKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0KTsKKworI2VuZGlmIC8qIEFWRklMVEVSX1VOU0hBUlBfT1BFTkNMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci91bnNoYXJwX29wZW5jbF9rZXJuZWwuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci91bnNoYXJwX29wZW5jbF9rZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzRmZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3Vuc2hhcnBfb3BlbmNsX2tlcm5lbC5oCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFdlaSBHYW8gPHdlaWdhb0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBMZW5ueSBXYW5nCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfVU5TSEFSUF9PUEVOQ0xfS0VSTkVMX0gKKyNkZWZpbmUgQVZGSUxURVJfVU5TSEFSUF9PUEVOQ0xfS0VSTkVMX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcGVuY2wuaCIKKworY29uc3QgY2hhciAqZmZfa2VybmVsX3Vuc2hhcnBfb3BlbmNsID0gQVZfT1BFTkNMX0tFUk5FTCgKK2lubGluZSB1bnNpZ25lZCBjaGFyIGNsaXBfdWludDgoaW50IGEpCit7CisgICAgaWYgKGEgJiAofjB4RkYpKQorICAgICAgICByZXR1cm4gKC1hKT4+MzE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYTsKK30KKwora2VybmVsIHZvaWQgdW5zaGFycF9sdW1hKAorICAgICAgICAgICAgICAgICAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjLAorICAgICAgICAgICAgICAgICAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqZHN0LAorICAgICAgICAgICAgICAgICAgICBnbG9iYWwgaW50ICptYXNrLAorICAgICAgICAgICAgICAgICAgICBpbnQgYW1vdW50LAorICAgICAgICAgICAgICAgICAgICBpbnQgc2NhbGViaXRzLAorICAgICAgICAgICAgICAgICAgICBpbnQgaGFsZnNjYWxlLAorICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkKK3sKKyAgICBpbnQyIHRocmVhZElkeCwgYmxvY2tJZHgsIGdsb2JhbElkeDsKKyAgICB0aHJlYWRJZHgueCA9IGdldF9sb2NhbF9pZCgwKTsKKyAgICB0aHJlYWRJZHgueSA9IGdldF9sb2NhbF9pZCgxKTsKKyAgICBibG9ja0lkeC54ID0gZ2V0X2dyb3VwX2lkKDApOworICAgIGJsb2NrSWR4LnkgPSBnZXRfZ3JvdXBfaWQoMSk7CisgICAgZ2xvYmFsSWR4LnggPSBnZXRfZ2xvYmFsX2lkKDApOworICAgIGdsb2JhbElkeC55ID0gZ2V0X2dsb2JhbF9pZCgxKTsKKworICAgIGlmICghYW1vdW50KSB7CisgICAgICAgIGlmIChnbG9iYWxJZHgueCA8IHdpZHRoICYmIGdsb2JhbElkeC55IDwgaGVpZ2h0KQorICAgICAgICAgICAgZHN0W2dsb2JhbElkeC54ICsgZ2xvYmFsSWR4LnkqZHN0X3N0cmlkZV0gPSBzcmNbZ2xvYmFsSWR4LnggKyBnbG9iYWxJZHgueSpzcmNfc3RyaWRlXTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvY2FsIHVjaGFyIGxbMzJdWzMyXTsKKyAgICBsb2NhbCBpbnQgbGNbTFVfUkFESVVTX1gqTFVfUkFESVVTX1ldOworICAgIGludCBpbmRleEl4LCBpbmRleEl5LCBpLCBqOworCisgICAgZm9yKGkgPSAwOyBpIDw9IDE7IGkrKykgeworICAgICAgICBpbmRleEl5ID0gLTggKyAoYmxvY2tJZHgueSArIGkpICogMTYgKyB0aHJlYWRJZHgueTsKKyAgICAgICAgaW5kZXhJeSA9IGluZGV4SXkgPCAwID8gMCA6IGluZGV4SXk7CisgICAgICAgIGluZGV4SXkgPSBpbmRleEl5ID49IGhlaWdodCA/IGhlaWdodCAtIDE6IGluZGV4SXk7CisgICAgICAgIGZvcihqID0gMDsgaiA8PSAxOyBqKyspIHsKKyAgICAgICAgICAgIGluZGV4SXggPSAtOCArIChibG9ja0lkeC54ICsgaikgKiAxNiArIHRocmVhZElkeC54OworICAgICAgICAgICAgaW5kZXhJeCA9IGluZGV4SXggPCAwID8gMCA6IGluZGV4SXg7CisgICAgICAgICAgICBpbmRleEl4ID0gaW5kZXhJeCA+PSB3aWR0aCA/IHdpZHRoIC0gMTogaW5kZXhJeDsKKyAgICAgICAgICAgIGxbaSoxNiArIHRocmVhZElkeC55XVtqKjE2ICsgdGhyZWFkSWR4LnhdID0gc3JjW2luZGV4SXkqc3JjX3N0cmlkZSArIGluZGV4SXhdOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGluZGV4TCA9IHRocmVhZElkeC55KjE2ICsgdGhyZWFkSWR4Lng7CisgICAgaWYgKGluZGV4TCA8IExVX1JBRElVU19YKkxVX1JBRElVU19ZKQorICAgICAgICBsY1tpbmRleExdID0gbWFza1tpbmRleExdOworICAgIGJhcnJpZXIoQ0xLX0xPQ0FMX01FTV9GRU5DRSk7CisKKyAgICBpbnQgaWR4LCBpZHksIG1hc2tJbmRleDsKKyAgICBpbnQgc3VtID0gMDsKKyAgICBpbnQgc3RlcHNfeCA9IExVX1JBRElVU19YLzI7CisgICAgaW50IHN0ZXBzX3kgPSBMVV9SQURJVVNfWS8yOworCisgICAgXG4jcHJhZ21hIHVucm9sbFxuCisgICAgZm9yIChpID0gLXN0ZXBzX3k7IGkgPD0gc3RlcHNfeTsgaSsrKSB7CisgICAgICAgIGlkeSA9IDggKyBpICsgdGhyZWFkSWR4Lnk7CisgICAgICAgIFxuI3ByYWdtYSB1bnJvbGxcbgorICAgICAgICBmb3IgKGogPSAtc3RlcHNfeDsgaiA8PSBzdGVwc194OyBqKyspIHsKKyAgICAgICAgICAgIGlkeCA9IDggKyBqICsgdGhyZWFkSWR4Lng7CisgICAgICAgICAgICBtYXNrSW5kZXggPSAoaSArIHN0ZXBzX3kpKkxVX1JBRElVU19YICsgaiArIHN0ZXBzX3g7CisgICAgICAgICAgICBzdW0gKz0gKGludClsW2lkeV1baWR4XSAqIGxjW21hc2tJbmRleF07CisgICAgICAgIH0KKyAgICB9CisgICAgaW50IHRlbXAgPSAoaW50KWxbdGhyZWFkSWR4LnkgKyA4XVt0aHJlYWRJZHgueCArIDhdOworICAgIGludCByZXMgPSB0ZW1wICsgKCgodGVtcCAtIChpbnQpKChzdW0gKyBoYWxmc2NhbGUpID4+IHNjYWxlYml0cykpICogYW1vdW50KSA+PiAxNik7CisgICAgaWYgKGdsb2JhbElkeC54IDwgd2lkdGggJiYgZ2xvYmFsSWR4LnkgPCBoZWlnaHQpCisgICAgICAgIGRzdFtnbG9iYWxJZHgueCArIGdsb2JhbElkeC55KmRzdF9zdHJpZGVdID0gY2xpcF91aW50OChyZXMpOworfQorCitrZXJuZWwgdm9pZCB1bnNoYXJwX2Nocm9tYSgKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKnNyY195LAorICAgICAgICAgICAgICAgICAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqZHN0X3ksCisgICAgICAgICAgICAgICAgICAgIGdsb2JhbCBpbnQgKm1hc2ssCisgICAgICAgICAgICAgICAgICAgIGludCBhbW91bnQsCisgICAgICAgICAgICAgICAgICAgIGludCBzY2FsZWJpdHMsCisgICAgICAgICAgICAgICAgICAgIGludCBoYWxmc2NhbGUsCisgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlX2x1LAorICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZV9jaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGVfbHUsCisgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlX2NoLAorICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIGludCBjdywKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoKQoreworICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpkc3RfdSA9IGRzdF95ICsgaGVpZ2h0ICogZHN0X3N0cmlkZV9sdTsKKyAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqZHN0X3YgPSBkc3RfdSArIGNoICogZHN0X3N0cmlkZV9jaDsKKyAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjX3UgPSBzcmNfeSArIGhlaWdodCAqIHNyY19zdHJpZGVfbHU7CisgICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKnNyY192ID0gc3JjX3UgKyBjaCAqIHNyY19zdHJpZGVfY2g7CisgICAgaW50MiB0aHJlYWRJZHgsIGJsb2NrSWR4LCBnbG9iYWxJZHg7CisgICAgdGhyZWFkSWR4LnggPSBnZXRfbG9jYWxfaWQoMCk7CisgICAgdGhyZWFkSWR4LnkgPSBnZXRfbG9jYWxfaWQoMSk7CisgICAgYmxvY2tJZHgueCA9IGdldF9ncm91cF9pZCgwKTsKKyAgICBibG9ja0lkeC55ID0gZ2V0X2dyb3VwX2lkKDEpOworICAgIGdsb2JhbElkeC54ID0gZ2V0X2dsb2JhbF9pZCgwKTsKKyAgICBnbG9iYWxJZHgueSA9IGdldF9nbG9iYWxfaWQoMSk7CisgICAgaW50IHBhZGNoID0gZ2V0X2dsb2JhbF9zaXplKDEpLzI7CisgICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKnNyYyA9IGdsb2JhbElkeC55Pj1wYWRjaCA/IHNyY192IDogc3JjX3U7CisgICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKmRzdCA9IGdsb2JhbElkeC55Pj1wYWRjaCA/IGRzdF92IDogZHN0X3U7CisKKyAgICBibG9ja0lkeC55ID0gZ2xvYmFsSWR4Lnk+PXBhZGNoID8gYmxvY2tJZHgueSAtIGdldF9udW1fZ3JvdXBzKDEpLzIgOiBibG9ja0lkeC55OworICAgIGdsb2JhbElkeC55ID0gZ2xvYmFsSWR4Lnk+PXBhZGNoID8gZ2xvYmFsSWR4LnkgLSBwYWRjaCA6IGdsb2JhbElkeC55OworCisgICAgaWYgKCFhbW91bnQpIHsKKyAgICAgICAgaWYgKGdsb2JhbElkeC54IDwgY3cgJiYgZ2xvYmFsSWR4LnkgPCBjaCkKKyAgICAgICAgICAgIGRzdFtnbG9iYWxJZHgueCArIGdsb2JhbElkeC55KmRzdF9zdHJpZGVfY2hdID0gc3JjW2dsb2JhbElkeC54ICsgZ2xvYmFsSWR4Lnkqc3JjX3N0cmlkZV9jaF07CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsb2NhbCB1Y2hhciBsWzMyXVszMl07CisgICAgbG9jYWwgaW50IGxjW0NIX1JBRElVU19YKkNIX1JBRElVU19ZXTsKKyAgICBpbnQgaW5kZXhJeCwgaW5kZXhJeSwgaSwgajsKKyAgICBmb3IoaSA9IDA7IGkgPD0gMTsgaSsrKSB7CisgICAgICAgIGluZGV4SXkgPSAtOCArIChibG9ja0lkeC55ICsgaSkgKiAxNiArIHRocmVhZElkeC55OworICAgICAgICBpbmRleEl5ID0gaW5kZXhJeSA8IDAgPyAwIDogaW5kZXhJeTsKKyAgICAgICAgaW5kZXhJeSA9IGluZGV4SXkgPj0gY2ggPyBjaCAtIDE6IGluZGV4SXk7CisgICAgICAgIGZvcihqID0gMDsgaiA8PSAxOyBqKyspIHsKKyAgICAgICAgICAgIGluZGV4SXggPSAtOCArIChibG9ja0lkeC54ICsgaikgKiAxNiArIHRocmVhZElkeC54OworICAgICAgICAgICAgaW5kZXhJeCA9IGluZGV4SXggPCAwID8gMCA6IGluZGV4SXg7CisgICAgICAgICAgICBpbmRleEl4ID0gaW5kZXhJeCA+PSBjdyA/IGN3IC0gMTogaW5kZXhJeDsKKyAgICAgICAgICAgIGxbaSoxNiArIHRocmVhZElkeC55XVtqKjE2ICsgdGhyZWFkSWR4LnhdID0gc3JjW2luZGV4SXkgKiBzcmNfc3RyaWRlX2NoICsgaW5kZXhJeF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgaW5kZXhMID0gdGhyZWFkSWR4LnkqMTYgKyB0aHJlYWRJZHgueDsKKyAgICBpZiAoaW5kZXhMIDwgQ0hfUkFESVVTX1gqQ0hfUkFESVVTX1kpCisgICAgICAgIGxjW2luZGV4TF0gPSBtYXNrW2luZGV4TF07CisgICAgYmFycmllcihDTEtfTE9DQUxfTUVNX0ZFTkNFKTsKKworICAgIGludCBpZHgsIGlkeSwgbWFza0luZGV4OworICAgIGludCBzdW0gPSAwOworICAgIGludCBzdGVwc194ID0gQ0hfUkFESVVTX1gvMjsKKyAgICBpbnQgc3RlcHNfeSA9IENIX1JBRElVU19ZLzI7CisKKyAgICBcbiNwcmFnbWEgdW5yb2xsXG4KKyAgICBmb3IgKGkgPSAtc3RlcHNfeTsgaSA8PSBzdGVwc195OyBpKyspIHsKKyAgICAgICAgaWR5ID0gOCArIGkgKyB0aHJlYWRJZHgueTsKKyAgICAgICAgXG4jcHJhZ21hIHVucm9sbFxuCisgICAgICAgIGZvciAoaiA9IC1zdGVwc194OyBqIDw9IHN0ZXBzX3g7IGorKykgeworICAgICAgICAgICAgaWR4ID0gOCArIGogKyB0aHJlYWRJZHgueDsKKyAgICAgICAgICAgIG1hc2tJbmRleCA9IChpICsgc3RlcHNfeSkqQ0hfUkFESVVTX1ggKyBqICsgc3RlcHNfeDsKKyAgICAgICAgICAgIHN1bSArPSAoaW50KWxbaWR5XVtpZHhdICogbGNbbWFza0luZGV4XTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbnQgdGVtcCA9IChpbnQpbFt0aHJlYWRJZHgueSArIDhdW3RocmVhZElkeC54ICsgOF07CisgICAgaW50IHJlcyA9IHRlbXAgKyAoKCh0ZW1wIC0gKGludCkoKHN1bSArIGhhbGZzY2FsZSkgPj4gc2NhbGViaXRzKSkgKiBhbW91bnQpID4+IDE2KTsKKyAgICBpZiAoZ2xvYmFsSWR4LnggPCBjdyAmJiBnbG9iYWxJZHgueSA8IGNoKQorICAgICAgICBkc3RbZ2xvYmFsSWR4LnggKyBnbG9iYWxJZHgueSpkc3Rfc3RyaWRlX2NoXSA9IGNsaXBfdWludDgocmVzKTsKK30KKwora2VybmVsIHZvaWQgdW5zaGFycF9kZWZhdWx0KGdsb2JhbCAgdW5zaWduZWQgY2hhciAqc3JjLAorICAgICAgICAgICAgICAgICAgICBnbG9iYWwgIHVuc2lnbmVkIGNoYXIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xvYmFsICB1bnNpZ25lZCBpbnQgKm1hc2tfbHUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbCAgdW5zaWduZWQgaW50ICptYXNrX2NoLAorICAgICAgICAgICAgICAgICAgICBpbnQgYW1vdW50X2x1LAorICAgICAgICAgICAgICAgICAgICBpbnQgYW1vdW50X2NoLAorICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcF94X2x1LAorICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcF95X2x1LAorICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcF94X2NoLAorICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcF95X2NoLAorICAgICAgICAgICAgICAgICAgICBpbnQgc2NhbGViaXRzX2x1LAorICAgICAgICAgICAgICAgICAgICBpbnQgc2NhbGViaXRzX2NoLAorICAgICAgICAgICAgICAgICAgICBpbnQgaGFsZnNjYWxlX2x1LAorICAgICAgICAgICAgICAgICAgICBpbnQgaGFsZnNjYWxlX2NoLAorICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZV9sdSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGVfY2gsCisgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlX2x1LAorICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZV9jaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgIGludCBjdykKK3sKKyAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqZHN0X3kgPSBkc3Q7CisgICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKmRzdF91ID0gZHN0X3kgKyBoZWlnaHQgKiBkc3Rfc3RyaWRlX2x1OworICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpkc3RfdiA9IGRzdF91ICsgY2ggKiBkc3Rfc3RyaWRlX2NoOworCisgICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKnNyY195ID0gc3JjOworICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpzcmNfdSA9IHNyY195ICsgaGVpZ2h0ICogc3JjX3N0cmlkZV9sdTsKKyAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjX3YgPSBzcmNfdSArIGNoICogc3JjX3N0cmlkZV9jaDsKKworICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICp0ZW1wX2RzdDsKKyAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqdGVtcF9zcmM7CisgICAgY29uc3QgZ2xvYmFsIHVuc2lnbmVkIGludCAqdGVtcF9tYXNrOworICAgIGludCBnbG9iYWxfaWQgPSBnZXRfZ2xvYmFsX2lkKDApOworICAgIGludCBpLCBqLCB4LCB5LCB0ZW1wX3NyY19zdHJpZGUsIHRlbXBfZHN0X3N0cmlkZSwgdGVtcF9oZWlnaHQsIHRlbXBfd2lkdGgsIHRlbXBfc3RlcHNfeCwgdGVtcF9zdGVwc195LAorICAgICAgICB0ZW1wX2Ftb3VudCwgdGVtcF9zY2FsZWJpdHMsIHRlbXBfaGFsZnNjYWxlLCBzdW0sIGlkeF94LCBpZHhfeSwgdGVtcCwgcmVzOworICAgIGlmIChnbG9iYWxfaWQgPCB3aWR0aCAqIGhlaWdodCkgeworICAgICAgICB5ID0gZ2xvYmFsX2lkIC8gd2lkdGg7CisgICAgICAgIHggPSBnbG9iYWxfaWQgJSB3aWR0aDsKKyAgICAgICAgdGVtcF9kc3QgPSBkc3RfeTsKKyAgICAgICAgdGVtcF9zcmMgPSBzcmNfeTsKKyAgICAgICAgdGVtcF9zcmNfc3RyaWRlID0gc3JjX3N0cmlkZV9sdTsKKyAgICAgICAgdGVtcF9kc3Rfc3RyaWRlID0gZHN0X3N0cmlkZV9sdTsKKyAgICAgICAgdGVtcF9oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHRlbXBfd2lkdGggPSB3aWR0aDsKKyAgICAgICAgdGVtcF9zdGVwc194ID0gc3RlcF94X2x1OworICAgICAgICB0ZW1wX3N0ZXBzX3kgPSBzdGVwX3lfbHU7CisgICAgICAgIHRlbXBfbWFzayA9IG1hc2tfbHU7CisgICAgICAgIHRlbXBfYW1vdW50ID0gYW1vdW50X2x1OworICAgICAgICB0ZW1wX3NjYWxlYml0cyA9IHNjYWxlYml0c19sdTsKKyAgICAgICAgdGVtcF9oYWxmc2NhbGUgPSBoYWxmc2NhbGVfbHU7CisgICAgfSBlbHNlIGlmICgoZ2xvYmFsX2lkID49IHdpZHRoICogaGVpZ2h0KSAmJiAoZ2xvYmFsX2lkIDwgd2lkdGggKiBoZWlnaHQgKyBjaCAqIGN3KSkgeworICAgICAgICB5ID0gKGdsb2JhbF9pZCAtIHdpZHRoICogaGVpZ2h0KSAvIGN3OworICAgICAgICB4ID0gKGdsb2JhbF9pZCAtIHdpZHRoICogaGVpZ2h0KSAlIGN3OworICAgICAgICB0ZW1wX2RzdCA9IGRzdF91OworICAgICAgICB0ZW1wX3NyYyA9IHNyY191OworICAgICAgICB0ZW1wX3NyY19zdHJpZGUgPSBzcmNfc3RyaWRlX2NoOworICAgICAgICB0ZW1wX2RzdF9zdHJpZGUgPSBkc3Rfc3RyaWRlX2NoOworICAgICAgICB0ZW1wX2hlaWdodCA9IGNoOworICAgICAgICB0ZW1wX3dpZHRoID0gY3c7CisgICAgICAgIHRlbXBfc3RlcHNfeCA9IHN0ZXBfeF9jaDsKKyAgICAgICAgdGVtcF9zdGVwc195ID0gc3RlcF95X2NoOworICAgICAgICB0ZW1wX21hc2sgPSBtYXNrX2NoOworICAgICAgICB0ZW1wX2Ftb3VudCA9IGFtb3VudF9jaDsKKyAgICAgICAgdGVtcF9zY2FsZWJpdHMgPSBzY2FsZWJpdHNfY2g7CisgICAgICAgIHRlbXBfaGFsZnNjYWxlID0gaGFsZnNjYWxlX2NoOworICAgIH0gZWxzZSB7CisgICAgICAgIHkgPSAoZ2xvYmFsX2lkIC0gd2lkdGggKiBoZWlnaHQgLSBjaCAqIGN3KSAvIGN3OworICAgICAgICB4ID0gKGdsb2JhbF9pZCAtIHdpZHRoICogaGVpZ2h0IC0gY2ggKiBjdykgJSBjdzsKKyAgICAgICAgdGVtcF9kc3QgPSBkc3RfdjsKKyAgICAgICAgdGVtcF9zcmMgPSBzcmNfdjsKKyAgICAgICAgdGVtcF9zcmNfc3RyaWRlID0gc3JjX3N0cmlkZV9jaDsKKyAgICAgICAgdGVtcF9kc3Rfc3RyaWRlID0gZHN0X3N0cmlkZV9jaDsKKyAgICAgICAgdGVtcF9oZWlnaHQgPSBjaDsKKyAgICAgICAgdGVtcF93aWR0aCA9IGN3OworICAgICAgICB0ZW1wX3N0ZXBzX3ggPSBzdGVwX3hfY2g7CisgICAgICAgIHRlbXBfc3RlcHNfeSA9IHN0ZXBfeV9jaDsKKyAgICAgICAgdGVtcF9tYXNrID0gbWFza19jaDsKKyAgICAgICAgdGVtcF9hbW91bnQgPSBhbW91bnRfY2g7CisgICAgICAgIHRlbXBfc2NhbGViaXRzID0gc2NhbGViaXRzX2NoOworICAgICAgICB0ZW1wX2hhbGZzY2FsZSA9IGhhbGZzY2FsZV9jaDsKKyAgICB9CisgICAgaWYgKHRlbXBfYW1vdW50KSB7CisgICAgICAgIHN1bSA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPD0gMiAqIHRlbXBfc3RlcHNfeTsgaisrKSB7CisgICAgICAgICAgICBpZHhfeSA9ICh5IC0gdGVtcF9zdGVwc195ICsgaikgPD0gMCA/IDAgOiAoeSAtIHRlbXBfc3RlcHNfeSArIGopID49IHRlbXBfaGVpZ2h0ID8gdGVtcF9oZWlnaHQtMSA6IHkgLSB0ZW1wX3N0ZXBzX3kgKyBqOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSAyICogdGVtcF9zdGVwc194OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZHhfeCA9ICh4IC0gdGVtcF9zdGVwc194ICsgaSkgPD0gMCA/IDAgOiAoeCAtIHRlbXBfc3RlcHNfeCArIGkpID49IHRlbXBfd2lkdGggPyB0ZW1wX3dpZHRoLTEgOiB4IC0gdGVtcF9zdGVwc194ICsgaTsKKyAgICAgICAgICAgICAgICBzdW0gKz0gdGVtcF9tYXNrW2kgKyBqICogKDIgKiB0ZW1wX3N0ZXBzX3ggKyAxKV0gKiB0ZW1wX3NyY1tpZHhfeCArIGlkeF95ICogdGVtcF9zcmNfc3RyaWRlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0ZW1wID0gKGludCl0ZW1wX3NyY1t4ICsgeSAqIHRlbXBfc3JjX3N0cmlkZV07CisgICAgICAgIHJlcyA9IHRlbXAgKyAoKCh0ZW1wIC0gKGludCkoKHN1bSArIHRlbXBfaGFsZnNjYWxlKSA+PiB0ZW1wX3NjYWxlYml0cykpICogdGVtcF9hbW91bnQpID4+IDE2KTsKKyAgICAgICAgdGVtcF9kc3RbeCArIHkgKiB0ZW1wX2RzdF9zdHJpZGVdID0gY2xpcF91aW50OChyZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBfZHN0W3ggKyB5ICogdGVtcF9kc3Rfc3RyaWRlXSA9IHRlbXBfc3JjW3ggKyB5ICogdGVtcF9zcmNfc3RyaWRlXTsKKyAgICB9Cit9CispOworCisjZW5kaWYgLyogQVZGSUxURVJfVU5TSEFSUF9PUEVOQ0xfS0VSTkVMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92ZXJzaW9uLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNjFhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmVyc2lvbi5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBWZXJzaW9uIG1hY3Jvcy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9WRVJTSU9OX0gKKyNkZWZpbmUgQVZGSUxURVJfVkVSU0lPTl9ICisKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdmZpCisgKiBMaWJhdmZpbHRlciB2ZXJzaW9uIG1hY3JvcworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvdmVyc2lvbi5oIgorCisjZGVmaW5lIExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IgIDUKKyNkZWZpbmUgTElCQVZGSUxURVJfVkVSU0lPTl9NSU5PUiAgMgorI2RlZmluZSBMSUJBVkZJTFRFUl9WRVJTSU9OX01JQ1JPIDEwMworCisjZGVmaW5lIExJQkFWRklMVEVSX1ZFUlNJT05fSU5UIEFWX1ZFUlNJT05fSU5UKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCQVZGSUxURVJfVkVSU0lPTl9NSU5PUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJBVkZJTFRFUl9WRVJTSU9OX01JQ1JPKQorI2RlZmluZSBMSUJBVkZJTFRFUl9WRVJTSU9OICAgICBBVl9WRVJTSU9OKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWRklMVEVSX1ZFUlNJT05fTUlOT1IsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWRklMVEVSX1ZFUlNJT05fTUlDUk8pCisjZGVmaW5lIExJQkFWRklMVEVSX0JVSUxEICAgICAgIExJQkFWRklMVEVSX1ZFUlNJT05fSU5UCisKKyNkZWZpbmUgTElCQVZGSUxURVJfSURFTlQgICAgICAgIkxhdmZpIiBBVl9TVFJJTkdJRlkoTElCQVZGSUxURVJfVkVSU0lPTikKKworLyoqCisgKiBGRl9BUElfKiBkZWZpbmVzIG1heSBiZSBwbGFjZWQgYmVsb3cgdG8gaW5kaWNhdGUgcHVibGljIEFQSSB0aGF0IHdpbGwgYmUKKyAqIGRyb3BwZWQgYXQgYSBmdXR1cmUgdmVyc2lvbiBidW1wLiBUaGUgZGVmaW5lcyB0aGVtc2VsdmVzIGFyZSBub3QgcGFydCBvZgorICogdGhlIHB1YmxpYyBBUEkgYW5kIG1heSBjaGFuZ2UsIGJyZWFrIG9yIGRpc2FwcGVhciBhdCBhbnkgdGltZS4KKyAqLworCisjaWZuZGVmIEZGX0FQSV9BVkZJTFRFUlBBRF9QVUJMSUMKKyNkZWZpbmUgRkZfQVBJX0FWRklMVEVSUEFEX1BVQkxJQyAgICAgICAgICAgKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IgPCA2KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9GT09fQ09VTlQKKyNkZWZpbmUgRkZfQVBJX0ZPT19DT1VOVCAgICAgICAgICAgICAgICAgICAgKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IgPCA2KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9BVkZJTFRFUkJVRkZFUgorI2RlZmluZSBGRl9BUElfQVZGSUxURVJCVUZGRVIgICAgICAgICAgICAgICAoTElCQVZGSUxURVJfVkVSU0lPTl9NQUpPUiA8IDYpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX09MRF9GSUxURVJfT1BUUworI2RlZmluZSBGRl9BUElfT0xEX0ZJTFRFUl9PUFRTICAgICAgICAgICAgICAoTElCQVZGSUxURVJfVkVSU0lPTl9NQUpPUiA8IDYpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0FWRklMVEVSX09QRU4KKyNkZWZpbmUgRkZfQVBJX0FWRklMVEVSX09QRU4gICAgICAgICAgICAgICAgKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IgPCA2KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9BVkZJTFRFUl9JTklUX0ZJTFRFUgorI2RlZmluZSBGRl9BUElfQVZGSUxURVJfSU5JVF9GSUxURVIgICAgICAgICAoTElCQVZGSUxURVJfVkVSU0lPTl9NQUpPUiA8IDYpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX09MRF9GSUxURVJfUkVHSVNURVIKKyNkZWZpbmUgRkZfQVBJX09MRF9GSUxURVJfUkVHSVNURVIgICAgICAgICAgKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IgPCA2KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9PTERfR1JBUEhfUEFSU0UKKyNkZWZpbmUgRkZfQVBJX09MRF9HUkFQSF9QQVJTRSAgICAgICAgICAgICAgKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IgPCA1KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9OT0NPTlNUX0dFVF9OQU1FCisjZGVmaW5lIEZGX0FQSV9OT0NPTlNUX0dFVF9OQU1FICAgICAgICAgICAgIChMSUJBVkZJTFRFUl9WRVJTSU9OX01BSk9SIDwgNikKKyNlbmRpZgorCisjZW5kaWYgLyogQVZGSUxURVJfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfYWxwaGFtZXJnZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2FscGhhbWVyZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjBkYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2FscGhhbWVyZ2UuYwpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBTdGV2ZW4gUm9iZXJ0c29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGNvcHkgYW4gYWxwaGEgY29tcG9uZW50IGZyb20gYW5vdGhlciB2aWRlbydzIGx1bWEKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJidWZmZXJxdWV1ZS5oIgorI2luY2x1ZGUgImRyYXd1dGlscy5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK2VudW0geyBZLCBVLCBWLCBBIH07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgZnJhbWVfcmVxdWVzdGVkOworICAgIGludCBpc19wYWNrZWRfcmdiOworICAgIHVpbnQ4X3QgcmdiYV9tYXBbNF07CisgICAgc3RydWN0IEZGQnVmUXVldWUgcXVldWVfbWFpbjsKKyAgICBzdHJ1Y3QgRkZCdWZRdWV1ZSBxdWV1ZV9hbHBoYTsKK30gQWxwaGFNZXJnZUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFscGhhTWVyZ2VDb250ZXh0ICptZXJnZSA9IGN0eC0+cHJpdjsKKyAgICBmZl9idWZxdWV1ZV9kaXNjYXJkX2FsbCgmbWVyZ2UtPnF1ZXVlX21haW4pOworICAgIGZmX2J1ZnF1ZXVlX2Rpc2NhcmRfYWxsKCZtZXJnZS0+cXVldWVfYWxwaGEpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBtYWluX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0JBLCBBVl9QSVhfRk1UX0JHUkEsIEFWX1BJWF9GTVRfQVJHQiwgQVZfUElYX0ZNVF9BQkdSLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgYWxwaGFfZm10c1tdID0geyBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX05PTkUgfTsKKyAgICBBVkZpbHRlckZvcm1hdHMgKm1haW5fZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QobWFpbl9mbXRzKTsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmFscGhhX2Zvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KGFscGhhX2ZtdHMpOworICAgIGZmX2Zvcm1hdHNfcmVmKG1haW5fZm9ybWF0cywgJmN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cyk7CisgICAgZmZfZm9ybWF0c19yZWYoYWxwaGFfZm9ybWF0cywgJmN0eC0+aW5wdXRzWzFdLT5vdXRfZm9ybWF0cyk7CisgICAgZmZfZm9ybWF0c19yZWYobWFpbl9mb3JtYXRzLCAmY3R4LT5vdXRwdXRzWzBdLT5pbl9mb3JtYXRzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXRfbWFpbihBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBbHBoYU1lcmdlQ29udGV4dCAqbWVyZ2UgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBtZXJnZS0+aXNfcGFja2VkX3JnYiA9CisgICAgICAgIGZmX2ZpbGxfcmdiYV9tYXAobWVyZ2UtPnJnYmFfbWFwLCBpbmxpbmstPmZvcm1hdCkgPj0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBBVkZpbHRlckxpbmsgKm1haW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgQVZGaWx0ZXJMaW5rICphbHBoYWxpbmsgPSBjdHgtPmlucHV0c1sxXTsKKyAgICBpZiAobWFpbmxpbmstPncgIT0gYWxwaGFsaW5rLT53IHx8IG1haW5saW5rLT5oICE9IGFscGhhbGluay0+aCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW5wdXQgZnJhbWUgc2l6ZXMgZG8gbm90IG1hdGNoICglZHglZCB2cyAlZHglZCkuXG4iLAorICAgICAgICAgICAgICAgbWFpbmxpbmstPncsIG1haW5saW5rLT5oLAorICAgICAgICAgICAgICAgYWxwaGFsaW5rLT53LCBhbHBoYWxpbmstPmgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG91dGxpbmstPncgPSBtYWlubGluay0+dzsKKyAgICBvdXRsaW5rLT5oID0gbWFpbmxpbmstPmg7CisgICAgb3V0bGluay0+dGltZV9iYXNlID0gbWFpbmxpbmstPnRpbWVfYmFzZTsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gbWFpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IG1haW5saW5rLT5mcmFtZV9yYXRlOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkcmF3X2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICptYWluX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqYWxwaGFfYnVmKQoreworICAgIEFscGhhTWVyZ2VDb250ZXh0ICptZXJnZSA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaCA9IG1haW5fYnVmLT5oZWlnaHQ7CisKKyAgICBpZiAobWVyZ2UtPmlzX3BhY2tlZF9yZ2IpIHsKKyAgICAgICAgaW50IHgsIHk7CisgICAgICAgIHVpbnQ4X3QgKnBpbiwgKnBvdXQ7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIHBpbiA9IGFscGhhX2J1Zi0+ZGF0YVswXSArIHkgKiBhbHBoYV9idWYtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgcG91dCA9IG1haW5fYnVmLT5kYXRhWzBdICsgeSAqIG1haW5fYnVmLT5saW5lc2l6ZVswXSArIG1lcmdlLT5yZ2JhX21hcFtBXTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBtYWluX2J1Zi0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICpwb3V0ID0gKnBpbjsKKyAgICAgICAgICAgICAgICBwaW4gKz0gMTsKKyAgICAgICAgICAgICAgICBwb3V0ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgeTsKKyAgICAgICAgY29uc3QgaW50IG1haW5fbGluZXNpemUgPSBtYWluX2J1Zi0+bGluZXNpemVbQV07CisgICAgICAgIGNvbnN0IGludCBhbHBoYV9saW5lc2l6ZSA9IGFscGhhX2J1Zi0+bGluZXNpemVbWV07CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoICYmIHkgPCBhbHBoYV9idWYtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBtZW1jcHkobWFpbl9idWYtPmRhdGFbQV0gKyB5ICogbWFpbl9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBhbHBoYV9idWYtPmRhdGFbWV0gKyB5ICogYWxwaGFfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgRkZNSU4obWFpbl9saW5lc2l6ZSwgYWxwaGFfbGluZXNpemUpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmJ1ZikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFscGhhTWVyZ2VDb250ZXh0ICptZXJnZSA9IGN0eC0+cHJpdjsKKworICAgIGludCByZXQgPSAwOworICAgIGludCBpc19hbHBoYSA9IChpbmxpbmsgPT0gY3R4LT5pbnB1dHNbMV0pOworICAgIHN0cnVjdCBGRkJ1ZlF1ZXVlICpxdWV1ZSA9CisgICAgICAgIChpc19hbHBoYSA/ICZtZXJnZS0+cXVldWVfYWxwaGEgOiAmbWVyZ2UtPnF1ZXVlX21haW4pOworICAgIGZmX2J1ZnF1ZXVlX2FkZChjdHgsIHF1ZXVlLCBidWYpOworCisgICAgZG8geworICAgICAgICBBVkZyYW1lICptYWluX2J1ZiwgKmFscGhhX2J1ZjsKKworICAgICAgICBpZiAoIWZmX2J1ZnF1ZXVlX3BlZWsoJm1lcmdlLT5xdWV1ZV9tYWluLCAwKSB8fAorICAgICAgICAgICAgIWZmX2J1ZnF1ZXVlX3BlZWsoJm1lcmdlLT5xdWV1ZV9hbHBoYSwgMCkpIGJyZWFrOworCisgICAgICAgIG1haW5fYnVmID0gZmZfYnVmcXVldWVfZ2V0KCZtZXJnZS0+cXVldWVfbWFpbik7CisgICAgICAgIGFscGhhX2J1ZiA9IGZmX2J1ZnF1ZXVlX2dldCgmbWVyZ2UtPnF1ZXVlX2FscGhhKTsKKworICAgICAgICBtZXJnZS0+ZnJhbWVfcmVxdWVzdGVkID0gMDsKKyAgICAgICAgZHJhd19mcmFtZShjdHgsIG1haW5fYnVmLCBhbHBoYV9idWYpOworICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBtYWluX2J1Zik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmFscGhhX2J1Zik7CisgICAgfSB3aGlsZSAocmV0ID49IDApOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQWxwaGFNZXJnZUNvbnRleHQgKm1lcmdlID0gY3R4LT5wcml2OworICAgIGludCBpbiwgcmV0OworCisgICAgbWVyZ2UtPmZyYW1lX3JlcXVlc3RlZCA9IDE7CisgICAgd2hpbGUgKG1lcmdlLT5mcmFtZV9yZXF1ZXN0ZWQpIHsKKyAgICAgICAgaW4gPSBmZl9idWZxdWV1ZV9wZWVrKCZtZXJnZS0+cXVldWVfbWFpbiwgMCkgPyAxIDogMDsKKyAgICAgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1tpbl0pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYWxwaGFtZXJnZV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgICAgID0gIm1haW4iLAorICAgICAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgICAgPSBjb25maWdfaW5wdXRfbWFpbiwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgICAgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5uZWVkc193cml0YWJsZSAgID0gMSwKKyAgICB9LHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgICAgPSAiYWxwaGEiLAorICAgICAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgICAgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFscGhhbWVyZ2Vfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9hbHBoYW1lcmdlID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhbHBoYW1lcmdlIiwKKyAgICAuZGVzY3JpcHRpb24gICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29weSB0aGUgbHVtYSB2YWx1ZSBvZiB0aGUgc2Vjb25kICIKKyAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgaW50byB0aGUgYWxwaGEgY2hhbm5lbCBvZiB0aGUgZmlyc3QgaW5wdXQuIiksCisgICAgLnVuaW5pdCAgICAgICAgID0gdW5pbml0LAorICAgIC5wcml2X3NpemUgICAgICA9IHNpemVvZihBbHBoYU1lcmdlQ29udGV4dCksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICAgPSBhbHBoYW1lcmdlX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICAgPSBhbHBoYW1lcmdlX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2FzcGVjdC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2FzcGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZGJlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfYXNwZWN0LmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQm9iYnkgQmluZ2hhbQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBhc3BlY3QgcmF0aW8gbW9kaWZpY2F0aW9uIHZpZGVvIGZpbHRlcnMKKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJ3IiwKKyAgICAiaCIsCisgICAgImEiLCAiZGFyIiwKKyAgICAic2FyIiwKKyAgICAiaHN1YiIsCisgICAgInZzdWIiLAorICAgIE5VTEwKK307CisKK2VudW0gdmFyX25hbWUgeworICAgIFZBUl9XLAorICAgIFZBUl9ILAorICAgIFZBUl9BLCBWQVJfREFSLAorICAgIFZBUl9TQVIsCisgICAgVkFSX0hTVUIsCisgICAgVkFSX1ZTVUIsCisgICAgVkFSU19OQgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgQXNwZWN0Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgQVZSYXRpb25hbCBkYXI7CisgICAgQVZSYXRpb25hbCBzYXI7CisgICAgaW50IG1heDsKKyNpZiBGRl9BUElfT0xEX0ZJTFRFUl9PUFRTCisgICAgZmxvYXQgYXNwZWN0X2RlbjsKKyNlbmRpZgorICAgIGNoYXIgKnJhdGlvX2V4cHI7Cit9IEFzcGVjdENvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFzcGVjdENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKKyAgICBpZiAocy0+cmF0aW9fZXhwciAmJiBzLT5hc3BlY3RfZGVuID4gMCkgeworICAgICAgICBkb3VibGUgbnVtOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJudW06ZGVuIHN5bnRheCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIG51bS9kZW4gb3IgbmFtZWQgb3B0aW9ucyBpbnN0ZWFkXG4iKTsKKyAgICAgICAgcmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmbnVtLCBzLT5yYXRpb19leHByLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcGFyc2UgcmF0aW8gbnVtZXJhdG9yIFwiJXNcIlxuIiwgcy0+cmF0aW9fZXhwcik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIHMtPnNhciA9IHMtPmRhciA9IGF2X2QycShudW0gLyBzLT5hc3BlY3RfZGVuLCBzLT5tYXgpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQXNwZWN0Q29udGV4dCAqcyA9IGxpbmstPmRzdC0+cHJpdjsKKworICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gcy0+c2FyOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUobGluay0+ZHN0LT5vdXRwdXRzWzBdLCBmcmFtZSk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFzcGVjdENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29tcHV0ZV9kYXIoQVZSYXRpb25hbCAqZGFyLCBBVlJhdGlvbmFsIHNhciwgaW50IHcsIGludCBoKQoreworICAgIGlmIChzYXIubnVtICYmIHNhci5kZW4pIHsKKyAgICAgICAgYXZfcmVkdWNlKCZkYXItPm51bSwgJmRhci0+ZGVuLCBzYXIubnVtICogdywgc2FyLmRlbiAqIGgsIElOVF9NQVgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X3JlZHVjZSgmZGFyLT5udW0sICZkYXItPmRlbiwgdywgaCwgSU5UX01BWCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGdldF9hc3BlY3RfcmF0aW8oQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWUmF0aW9uYWwgKmFzcGVjdF9yYXRpbykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFzcGVjdENvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJTX05CXSwgcmVzOworICAgIGludCByZXQ7CisKKyAgICB2YXJfdmFsdWVzW1ZBUl9XXSAgICAgPSBpbmxpbmstPnc7CisgICAgdmFyX3ZhbHVlc1tWQVJfSF0gICAgID0gaW5saW5rLT5oOworICAgIHZhcl92YWx1ZXNbVkFSX0FdICAgICA9IChkb3VibGUpIGlubGluay0+dyAvIGlubGluay0+aDsKKyAgICB2YXJfdmFsdWVzW1ZBUl9TQVJdICAgPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID8KKyAgICAgICAgKGRvdWJsZSkgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAvIGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gOiAxOworICAgIHZhcl92YWx1ZXNbVkFSX0RBUl0gICA9IHZhcl92YWx1ZXNbVkFSX0FdICogdmFyX3ZhbHVlc1tWQVJfU0FSXTsKKyAgICB2YXJfdmFsdWVzW1ZBUl9IU1VCXSAgPSAxIDw8IGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgdmFyX3ZhbHVlc1tWQVJfVlNVQl0gID0gMSA8PCBkZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgLyogZXZhbHVhdGUgbmV3IGFzcGVjdCByYXRpbyovCisgICAgcmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmcmVzLCBzLT5yYXRpb19leHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIHZhcl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0ID0gYXZfcGFyc2VfcmF0aW8oYXNwZWN0X3JhdGlvLCBzLT5yYXRpb19leHByLCBzLT5tYXgsIDAsIGN0eCk7CisgICAgfSBlbHNlCisgICAgICAgICphc3BlY3RfcmF0aW8gPSBhdl9kMnEocmVzLCBzLT5tYXgpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkVycm9yIHdoZW4gZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiAnJXMnXG4iLCBzLT5yYXRpb19leHByKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKGFzcGVjdF9yYXRpby0+bnVtIDwgMCB8fCBhc3BlY3RfcmF0aW8tPmRlbiA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBzdHJpbmcgJyVzJyBmb3IgYXNwZWN0IHJhdGlvXG4iLCBzLT5yYXRpb19leHByKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfU0VUREFSX0ZJTFRFUgorCitzdGF0aWMgaW50IHNldGRhcl9jb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQXNwZWN0Q29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWUmF0aW9uYWwgZGFyOworICAgIEFWUmF0aW9uYWwgb2xkX2RhcjsKKyAgICBBVlJhdGlvbmFsIG9sZF9zYXIgPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgaW50IHJldDsKKworI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKKyAgICBpZiAoIShzLT5yYXRpb19leHByICYmIHMtPmFzcGVjdF9kZW4gPiAwKSkgeworI2VuZGlmCisgICAgaWYgKChyZXQgPSBnZXRfYXNwZWN0X3JhdGlvKGlubGluaywgJnMtPmRhcikpKQorICAgICAgICByZXR1cm4gcmV0OworI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChzLT5kYXIubnVtICYmIHMtPmRhci5kZW4pIHsKKyAgICAgICAgYXZfcmVkdWNlKCZzLT5zYXIubnVtLCAmcy0+c2FyLmRlbiwKKyAgICAgICAgICAgICAgICAgICBzLT5kYXIubnVtICogaW5saW5rLT5oLAorICAgICAgICAgICAgICAgICAgIHMtPmRhci5kZW4gKiBpbmxpbmstPncsIElOVF9NQVgpOworICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzLT5zYXI7CisgICAgICAgIGRhciA9IHMtPmRhcjsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7IDEsIDEgfTsKKyAgICAgICAgZGFyID0gKEFWUmF0aW9uYWwpeyBpbmxpbmstPncsIGlubGluay0+aCB9OworICAgIH0KKworICAgIGNvbXB1dGVfZGFyKCZvbGRfZGFyLCBvbGRfc2FyLCBpbmxpbmstPncsIGlubGluay0+aCk7CisgICAgYXZfbG9nKGlubGluay0+ZHN0LCBBVl9MT0dfVkVSQk9TRSwgInc6JWQgaDolZCBkYXI6JWQvJWQgc2FyOiVkLyVkIC0+IGRhcjolZC8lZCBzYXI6JWQvJWRcbiIsCisgICAgICAgICAgIGlubGluay0+dywgaW5saW5rLT5oLCBvbGRfZGFyLm51bSwgb2xkX2Rhci5kZW4sIG9sZF9zYXIubnVtLCBvbGRfc2FyLmRlbiwKKyAgICAgICAgICAgZGFyLm51bSwgZGFyLmRlbiwgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHNldGRhcl9vcHRpb25zW10gPSB7CisgICAgeyAiZGFyIiwgICAic2V0IGRpc3BsYXkgYXNwZWN0IHJhdGlvIiwgT0ZGU0VUKHJhdGlvX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICIwIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInJhdGlvIiwgInNldCBkaXNwbGF5IGFzcGVjdCByYXRpbyIsIE9GRlNFVChyYXRpb19leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiMCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJyIiwgICAgICJzZXQgZGlzcGxheSBhc3BlY3QgcmF0aW8iLCBPRkZTRVQocmF0aW9fZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIjAiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisjaWYgRkZfQVBJX09MRF9GSUxURVJfT1BUUworICAgIHsgImRhcl9kZW4iLCBOVUxMLCBPRkZTRVQoYXNwZWN0X2RlbiksIEFWX09QVF9UWVBFX0ZMT0FULCB7IC5kYmwgPSAwIH0sIDAsIEZMVF9NQVgsIEZMQUdTIH0sCisjZW5kaWYKKyAgICB7ICJtYXgiLCAgICJzZXQgbWF4IHZhbHVlIGZvciBub21pbmF0b3Igb3IgZGVub21pbmF0b3IgaW4gdGhlIHJhdGlvIiwgT0ZGU0VUKG1heCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MTAwfSwgMSwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHNldGRhcik7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9zZXRkYXJfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gc2V0ZGFyX2NvbmZpZ19wcm9wcywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfc2V0ZGFyX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9zZXRkYXIgPSB7CisgICAgLm5hbWUgICAgICAgID0gInNldGRhciIsCisgICAgLmRlc2NyaXB0aW9uID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNldCB0aGUgZnJhbWUgZGlzcGxheSBhc3BlY3QgcmF0aW8uIiksCisgICAgLmluaXQgICAgICAgID0gaW5pdCwKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoQXNwZWN0Q29udGV4dCksCisgICAgLnByaXZfY2xhc3MgID0gJnNldGRhcl9jbGFzcywKKyAgICAuaW5wdXRzICAgICAgPSBhdmZpbHRlcl92Zl9zZXRkYXJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IGF2ZmlsdGVyX3ZmX3NldGRhcl9vdXRwdXRzLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19TRVREQVJfRklMVEVSICovCisKKyNpZiBDT05GSUdfU0VUU0FSX0ZJTFRFUgorCitzdGF0aWMgaW50IHNldHNhcl9jb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQXNwZWN0Q29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWUmF0aW9uYWwgb2xkX3NhciA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICBBVlJhdGlvbmFsIG9sZF9kYXIsIGRhcjsKKyAgICBpbnQgcmV0OworCisjaWYgRkZfQVBJX09MRF9GSUxURVJfT1BUUworICAgIGlmICghKHMtPnJhdGlvX2V4cHIgJiYgcy0+YXNwZWN0X2RlbiA+IDApKSB7CisjZW5kaWYKKyAgICBpZiAoKHJldCA9IGdldF9hc3BlY3RfcmF0aW8oaW5saW5rLCAmcy0+c2FyKSkpCisgICAgICAgIHJldHVybiByZXQ7CisjaWYgRkZfQVBJX09MRF9GSUxURVJfT1BUUworICAgIH0KKyNlbmRpZgorCisgICAgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gcy0+c2FyOworCisgICAgY29tcHV0ZV9kYXIoJm9sZF9kYXIsIG9sZF9zYXIsIGlubGluay0+dywgaW5saW5rLT5oKTsKKyAgICBjb21wdXRlX2RhcigmZGFyLCBzLT5zYXIsIGlubGluay0+dywgaW5saW5rLT5oKTsKKyAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19WRVJCT1NFLCAidzolZCBoOiVkIHNhcjolZC8lZCBkYXI6JWQvJWQgLT4gc2FyOiVkLyVkIGRhcjolZC8lZFxuIiwKKyAgICAgICAgICAgaW5saW5rLT53LCBpbmxpbmstPmgsIG9sZF9zYXIubnVtLCBvbGRfc2FyLmRlbiwgb2xkX2Rhci5udW0sIG9sZF9kYXIuZGVuLAorICAgICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLCBkYXIubnVtLCBkYXIuZGVuKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gc2V0c2FyX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzYXIiLCAgICJzZXQgc2FtcGxlIChwaXhlbCkgYXNwZWN0IHJhdGlvIiwgT0ZGU0VUKHJhdGlvX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICIwIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInJhdGlvIiwgInNldCBzYW1wbGUgKHBpeGVsKSBhc3BlY3QgcmF0aW8iLCBPRkZTRVQocmF0aW9fZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIjAiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiciIsICAgICAic2V0IHNhbXBsZSAocGl4ZWwpIGFzcGVjdCByYXRpbyIsIE9GRlNFVChyYXRpb19leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiMCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyNpZiBGRl9BUElfT0xEX0ZJTFRFUl9PUFRTCisgICAgeyAic2FyX2RlbiIsIE5VTEwsIE9GRlNFVChhc3BlY3RfZGVuKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IDAgfSwgMCwgRkxUX01BWCwgRkxBR1MgfSwKKyNlbmRpZgorICAgIHsgIm1heCIsICAgInNldCBtYXggdmFsdWUgZm9yIG5vbWluYXRvciBvciBkZW5vbWluYXRvciBpbiB0aGUgcmF0aW8iLCBPRkZTRVQobWF4KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xMDB9LCAxLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moc2V0c2FyKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX3NldHNhcl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBzZXRzYXJfY29uZmlnX3Byb3BzLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9zZXRzYXJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3NldHNhciA9IHsKKyAgICAubmFtZSAgICAgICAgPSAic2V0c2FyIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2V0IHRoZSBwaXhlbCBzYW1wbGUgYXNwZWN0IHJhdGlvLiIpLAorICAgIC5pbml0ICAgICAgICA9IGluaXQsCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKEFzcGVjdENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICA9ICZzZXRzYXJfY2xhc3MsCisgICAgLmlucHV0cyAgICAgID0gYXZmaWx0ZXJfdmZfc2V0c2FyX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgPSBhdmZpbHRlcl92Zl9zZXRzYXJfb3V0cHV0cywKK307CisKKyNlbmRpZiAvKiBDT05GSUdfU0VUU0FSX0ZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2Jib3guYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9iYm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2ZmVmZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9iYm94LmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBib3VuZGluZyBib3ggZGV0ZWN0aW9uIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJiYm94LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBtaW5fdmFsOworfSBCQm94Q29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQkJveENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYmJveF9vcHRpb25zW10gPSB7CisgICAgeyAibWluX3ZhbCIsICJzZXQgbWluaW11bSBsdW1pbmFuY2UgdmFsdWUgZm9yIGJvdW5kaW5nIGJveCIsIE9GRlNFVChtaW5fdmFsKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxNiB9LCAwLCAyNTQsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhiYm94KTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFNFVF9NRVRBKGtleSwgdmFsdWUpIFwKKyAgICBhdl9kaWN0X3NldF9pbnQobWV0YWRhdGEsIGtleSwgdmFsdWUsIDApOworCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBCQm94Q29udGV4dCAqYmJveCA9IGN0eC0+cHJpdjsKKyAgICBGRkJvdW5kaW5nQm94IGJveDsKKyAgICBpbnQgaGFzX2Jib3gsIHcsIGg7CisKKyAgICBoYXNfYmJveCA9CisgICAgICAgIGZmX2NhbGN1bGF0ZV9ib3VuZGluZ19ib3goJmJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YVswXSwgZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluay0+dywgaW5saW5rLT5oLCBiYm94LT5taW5fdmFsKTsKKyAgICB3ID0gYm94LngyIC0gYm94LngxICsgMTsKKyAgICBoID0gYm94LnkyIC0gYm94LnkxICsgMTsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAibjolIlBSSWQ2NCIgcHRzOiVzIHB0c190aW1lOiVzIiwgaW5saW5rLT5mcmFtZV9jb3VudCwKKyAgICAgICAgICAgYXZfdHMyc3RyKGZyYW1lLT5wdHMpLCBhdl90czJ0aW1lc3RyKGZyYW1lLT5wdHMsICZpbmxpbmstPnRpbWVfYmFzZSkpOworCisgICAgaWYgKGhhc19iYm94KSB7CisgICAgICAgIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhID0gYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAoZnJhbWUpOworCisgICAgICAgIFNFVF9NRVRBKCJsYXZmaS5iYm94LngxIiwgYm94LngxKQorICAgICAgICBTRVRfTUVUQSgibGF2ZmkuYmJveC54MiIsIGJveC54MikKKyAgICAgICAgU0VUX01FVEEoImxhdmZpLmJib3gueTEiLCBib3gueTEpCisgICAgICAgIFNFVF9NRVRBKCJsYXZmaS5iYm94LnkyIiwgYm94LnkyKQorICAgICAgICBTRVRfTUVUQSgibGF2ZmkuYmJveC53IiwgIHcpCisgICAgICAgIFNFVF9NRVRBKCJsYXZmaS5iYm94LmgiLCAgaCkKKworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICIgeDE6JWQgeDI6JWQgeTE6JWQgeTI6JWQgdzolZCBoOiVkIgorICAgICAgICAgICAgICAgIiBjcm9wPSVkOiVkOiVkOiVkIGRyYXdib3g9JWQ6JWQ6JWQ6JWQiLAorICAgICAgICAgICAgICAgYm94LngxLCBib3gueDIsIGJveC55MSwgYm94LnkyLCB3LCBoLAorICAgICAgICAgICAgICAgdywgaCwgYm94LngxLCBib3gueTEsICAgIC8qIGNyb3AgcGFyYW1zICovCisgICAgICAgICAgICAgICBib3gueDEsIGJveC55MSwgdywgaCk7ICAgLyogZHJhd2JveCBwYXJhbXMgKi8KKyAgICB9CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJcbiIpOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShpbmxpbmstPmRzdC0+b3V0cHV0c1swXSwgZnJhbWUpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYmJveF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGJib3hfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2Jib3ggPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYmJveCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29tcHV0ZSBib3VuZGluZyBib3ggZm9yIGVhY2ggZnJhbWUuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQkJveENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmJib3hfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gYmJveF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBiYm94X291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfYmxhY2tkZXRlY3QuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ibGFja2RldGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YTdhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfYmxhY2tkZXRlY3QuYwpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZpZGVvIGJsYWNrIGRldGVjdG9yLCBsb29zZWx5IGJhc2VkIG9uIGJsYWNrZnJhbWUgd2l0aCBleHRlbmRlZAorICogc3ludGF4IGFuZCBmZWF0dXJlcworICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgZG91YmxlICBibGFja19taW5fZHVyYXRpb25fdGltZTsgLy8vPCBtaW5pbXVtIGR1cmF0aW9uIG9mIGRldGVjdGVkIGJsYWNrLCBpbiBzZWNvbmRzCisgICAgaW50NjRfdCBibGFja19taW5fZHVyYXRpb247ICAgICAgLy8vPCBtaW5pbXVtIGR1cmF0aW9uIG9mIGRldGVjdGVkIGJsYWNrLCBleHByZXNzZWQgaW4gdGltZWJhc2UgdW5pdHMKKyAgICBpbnQ2NF90IGJsYWNrX3N0YXJ0OyAgICAgICAgICAgICAvLy88IHB0cyBzdGFydCB0aW1lIG9mIHRoZSBmaXJzdCBibGFjayBwaWN0dXJlCisgICAgaW50NjRfdCBibGFja19lbmQ7ICAgICAgICAgICAgICAgLy8vPCBwdHMgZW5kIHRpbWUgb2YgdGhlIGxhc3QgYmxhY2sgcGljdHVyZQorICAgIGludDY0X3QgbGFzdF9waWNyZWZfcHRzOyAgICAgICAgIC8vLzwgcHRzIG9mIHRoZSBsYXN0IGlucHV0IHBpY3R1cmUKKyAgICBpbnQgYmxhY2tfc3RhcnRlZDsKKworICAgIGRvdWJsZSAgICAgICBwaWN0dXJlX2JsYWNrX3JhdGlvX3RoOworICAgIGRvdWJsZSAgICAgICBwaXhlbF9ibGFja190aDsKKyAgICB1bnNpZ25lZCBpbnQgcGl4ZWxfYmxhY2tfdGhfaTsKKworICAgIHVuc2lnbmVkIGludCBuYl9ibGFja19waXhlbHM7ICAgLy8vPCBudW1iZXIgb2YgYmxhY2sgcGl4ZWxzIGNvdW50ZWQgc28gZmFyCit9IEJsYWNrRGV0ZWN0Q29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQmxhY2tEZXRlY3RDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGJsYWNrZGV0ZWN0X29wdGlvbnNbXSA9IHsKKyAgICB7ICJkIiwgICAgICAgICAgICAgICAgICAic2V0IG1pbmltdW0gZGV0ZWN0ZWQgYmxhY2sgZHVyYXRpb24gaW4gc2Vjb25kcyIsIE9GRlNFVChibGFja19taW5fZHVyYXRpb25fdGltZSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9Mn0sIDAsIERCTF9NQVgsIEZMQUdTIH0sCisgICAgeyAiYmxhY2tfbWluX2R1cmF0aW9uIiwgInNldCBtaW5pbXVtIGRldGVjdGVkIGJsYWNrIGR1cmF0aW9uIGluIHNlY29uZHMiLCBPRkZTRVQoYmxhY2tfbWluX2R1cmF0aW9uX3RpbWUpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTJ9LCAwLCBEQkxfTUFYLCBGTEFHUyB9LAorICAgIHsgInBpY3R1cmVfYmxhY2tfcmF0aW9fdGgiLCAic2V0IHRoZSBwaWN0dXJlIGJsYWNrIHJhdGlvIHRocmVzaG9sZCIsIE9GRlNFVChwaWN0dXJlX2JsYWNrX3JhdGlvX3RoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0uOTh9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInBpY190aCIsICAgICAgICAgICAgICAgICAic2V0IHRoZSBwaWN0dXJlIGJsYWNrIHJhdGlvIHRocmVzaG9sZCIsIE9GRlNFVChwaWN0dXJlX2JsYWNrX3JhdGlvX3RoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0uOTh9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInBpeGVsX2JsYWNrX3RoIiwgInNldCB0aGUgcGl4ZWwgYmxhY2sgdGhyZXNob2xkIiwgT0ZGU0VUKHBpeGVsX2JsYWNrX3RoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0uMTB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInBpeF90aCIsICAgICAgICAgInNldCB0aGUgcGl4ZWwgYmxhY2sgdGhyZXNob2xkIiwgT0ZGU0VUKHBpeGVsX2JsYWNrX3RoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0uMTB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYmxhY2tkZXRlY3QpOworCisjZGVmaW5lIFlVVkpfRk9STUFUUyBcCisgICAgQVZfUElYX0ZNVF9ZVVZKNDExUCwgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDQwUAorCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHl1dmpfZm9ybWF0c1tdID0geworICAgIFlVVkpfRk9STUFUUywgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMFAsIEFWX1BJWF9GTVRfWVVWNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX05WMTIsIEFWX1BJWF9GTVRfTlYyMSwKKyAgICAgICAgWVVWSl9GT1JNQVRTLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEJsYWNrRGV0ZWN0Q29udGV4dCAqYmxhY2tkZXRlY3QgPSBjdHgtPnByaXY7CisKKyAgICBibGFja2RldGVjdC0+YmxhY2tfbWluX2R1cmF0aW9uID0KKyAgICAgICAgYmxhY2tkZXRlY3QtPmJsYWNrX21pbl9kdXJhdGlvbl90aW1lIC8gYXZfcTJkKGlubGluay0+dGltZV9iYXNlKTsKKworICAgIGJsYWNrZGV0ZWN0LT5waXhlbF9ibGFja190aF9pID0gZmZfZm10X2lzX2luKGlubGluay0+Zm9ybWF0LCB5dXZqX2Zvcm1hdHMpID8KKyAgICAgICAgLy8gbHVtaW5hbmNlX21pbmltdW1fdmFsdWUgKyBwaXhlbF9ibGFja190aCAqIGx1bWluYW5jZV9yYW5nZV9zaXplCisgICAgICAgICAgICAgYmxhY2tkZXRlY3QtPnBpeGVsX2JsYWNrX3RoICogIDI1NSA6CisgICAgICAgIDE2ICsgYmxhY2tkZXRlY3QtPnBpeGVsX2JsYWNrX3RoICogKDIzNSAtIDE2KTsKKworICAgIGF2X2xvZyhibGFja2RldGVjdCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICJibGFja19taW5fZHVyYXRpb246JXMgcGl4ZWxfYmxhY2tfdGg6JWYgcGl4ZWxfYmxhY2tfdGhfaTolZCBwaWN0dXJlX2JsYWNrX3JhdGlvX3RoOiVmXG4iLAorICAgICAgICAgICBhdl90czJ0aW1lc3RyKGJsYWNrZGV0ZWN0LT5ibGFja19taW5fZHVyYXRpb24sICZpbmxpbmstPnRpbWVfYmFzZSksCisgICAgICAgICAgIGJsYWNrZGV0ZWN0LT5waXhlbF9ibGFja190aCwgYmxhY2tkZXRlY3QtPnBpeGVsX2JsYWNrX3RoX2ksCisgICAgICAgICAgIGJsYWNrZGV0ZWN0LT5waWN0dXJlX2JsYWNrX3JhdGlvX3RoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfYmxhY2tfZW5kKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEJsYWNrRGV0ZWN0Q29udGV4dCAqYmxhY2tkZXRlY3QgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKworICAgIGlmICgoYmxhY2tkZXRlY3QtPmJsYWNrX2VuZCAtIGJsYWNrZGV0ZWN0LT5ibGFja19zdGFydCkgPj0gYmxhY2tkZXRlY3QtPmJsYWNrX21pbl9kdXJhdGlvbikgeworICAgICAgICBhdl9sb2coYmxhY2tkZXRlY3QsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgImJsYWNrX3N0YXJ0OiVzIGJsYWNrX2VuZDolcyBibGFja19kdXJhdGlvbjolc1xuIiwKKyAgICAgICAgICAgICAgIGF2X3RzMnRpbWVzdHIoYmxhY2tkZXRlY3QtPmJsYWNrX3N0YXJ0LCAmaW5saW5rLT50aW1lX2Jhc2UpLAorICAgICAgICAgICAgICAgYXZfdHMydGltZXN0cihibGFja2RldGVjdC0+YmxhY2tfZW5kLCAgICZpbmxpbmstPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGJsYWNrZGV0ZWN0LT5ibGFja19lbmQgLSBibGFja2RldGVjdC0+YmxhY2tfc3RhcnQsICZpbmxpbmstPnRpbWVfYmFzZSkpOworICAgIH0KK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBCbGFja0RldGVjdENvbnRleHQgKmJsYWNrZGV0ZWN0ID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgaW50IHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoaW5saW5rKTsKKworICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgYmxhY2tkZXRlY3QtPmJsYWNrX3N0YXJ0ZWQpIHsKKyAgICAgICAgLy8gRklYTUU6IGJsYWNrX2VuZCBzaG91bGQgYmUgc2V0IHRvIGxhc3RfcGljcmVmX3B0cyArIGxhc3RfcGljcmVmX2R1cmF0aW9uCisgICAgICAgIGJsYWNrZGV0ZWN0LT5ibGFja19lbmQgPSBibGFja2RldGVjdC0+bGFzdF9waWNyZWZfcHRzOworICAgICAgICBjaGVja19ibGFja19lbmQoY3R4KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLy8gVE9ETzogZG9jdW1lbnQgbWV0YWRhdGEKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpwaWNyZWYpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBCbGFja0RldGVjdENvbnRleHQgKmJsYWNrZGV0ZWN0ID0gY3R4LT5wcml2OworICAgIGRvdWJsZSBwaWN0dXJlX2JsYWNrX3JhdGlvID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpwID0gcGljcmVmLT5kYXRhWzBdOworICAgIGludCB4LCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGlubGluay0+aDsgaSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpbmxpbmstPnc7IHgrKykKKyAgICAgICAgICAgIGJsYWNrZGV0ZWN0LT5uYl9ibGFja19waXhlbHMgKz0gcFt4XSA8PSBibGFja2RldGVjdC0+cGl4ZWxfYmxhY2tfdGhfaTsKKyAgICAgICAgcCArPSBwaWNyZWYtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIHBpY3R1cmVfYmxhY2tfcmF0aW8gPSAoZG91YmxlKWJsYWNrZGV0ZWN0LT5uYl9ibGFja19waXhlbHMgLyAoaW5saW5rLT53ICogaW5saW5rLT5oKTsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgImZyYW1lOiUiUFJJZDY0IiBwaWN0dXJlX2JsYWNrX3JhdGlvOiVmIHB0czolcyB0OiVzIHR5cGU6JWNcbiIsCisgICAgICAgICAgIGlubGluay0+ZnJhbWVfY291bnQsIHBpY3R1cmVfYmxhY2tfcmF0aW8sCisgICAgICAgICAgIGF2X3RzMnN0cihwaWNyZWYtPnB0cyksIGF2X3RzMnRpbWVzdHIocGljcmVmLT5wdHMsICZpbmxpbmstPnRpbWVfYmFzZSksCisgICAgICAgICAgIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihwaWNyZWYtPnBpY3RfdHlwZSkpOworCisgICAgaWYgKHBpY3R1cmVfYmxhY2tfcmF0aW8gPj0gYmxhY2tkZXRlY3QtPnBpY3R1cmVfYmxhY2tfcmF0aW9fdGgpIHsKKyAgICAgICAgaWYgKCFibGFja2RldGVjdC0+YmxhY2tfc3RhcnRlZCkgeworICAgICAgICAgICAgLyogYmxhY2sgc3RhcnRzIGhlcmUgKi8KKyAgICAgICAgICAgIGJsYWNrZGV0ZWN0LT5ibGFja19zdGFydGVkID0gMTsKKyAgICAgICAgICAgIGJsYWNrZGV0ZWN0LT5ibGFja19zdGFydCA9IHBpY3JlZi0+cHRzOworICAgICAgICAgICAgYXZfZGljdF9zZXQoYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAocGljcmVmKSwgImxhdmZpLmJsYWNrX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGJsYWNrZGV0ZWN0LT5ibGFja19zdGFydCwgJmlubGluay0+dGltZV9iYXNlKSwgMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJsYWNrZGV0ZWN0LT5ibGFja19zdGFydGVkKSB7CisgICAgICAgIC8qIGJsYWNrIGVuZHMgaGVyZSAqLworICAgICAgICBibGFja2RldGVjdC0+YmxhY2tfc3RhcnRlZCA9IDA7CisgICAgICAgIGJsYWNrZGV0ZWN0LT5ibGFja19lbmQgPSBwaWNyZWYtPnB0czsKKyAgICAgICAgY2hlY2tfYmxhY2tfZW5kKGN0eCk7CisgICAgICAgIGF2X2RpY3Rfc2V0KGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKHBpY3JlZiksICJsYXZmaS5ibGFja19lbmQiLAorICAgICAgICAgICAgYXZfdHMydGltZXN0cihibGFja2RldGVjdC0+YmxhY2tfZW5kLCAmaW5saW5rLT50aW1lX2Jhc2UpLCAwKTsKKyAgICB9CisKKyAgICBibGFja2RldGVjdC0+bGFzdF9waWNyZWZfcHRzID0gcGljcmVmLT5wdHM7CisgICAgYmxhY2tkZXRlY3QtPm5iX2JsYWNrX3BpeGVscyA9IDA7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShpbmxpbmstPmRzdC0+b3V0cHV0c1swXSwgcGljcmVmKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGJsYWNrZGV0ZWN0X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGJsYWNrZGV0ZWN0X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2JsYWNrZGV0ZWN0ID0geworICAgIC5uYW1lICAgICAgICAgID0gImJsYWNrZGV0ZWN0IiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEZXRlY3QgdmlkZW8gaW50ZXJ2YWxzIHRoYXQgYXJlIChhbG1vc3QpIGJsYWNrLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEJsYWNrRGV0ZWN0Q29udGV4dCksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gYmxhY2tkZXRlY3RfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYmxhY2tkZXRlY3Rfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZibGFja2RldGVjdF9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfYmxhY2tmcmFtZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2JsYWNrZnJhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU5ZmNjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2JsYWNrZnJhbWUuYwpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTdGVmYW5vIFNhYmF0aW5pCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSXZvIHZhbiBQb29ydGVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSnVsaWFuIEhhbGwKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIEJyaWFuIEouIE11cnJlbGwKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTZWFyY2ggZm9yIGJsYWNrIGZyYW1lcyB0byBkZXRlY3Qgc2NlbmUgdHJhbnNpdGlvbnMuCisgKiBQb3J0ZWQgZnJvbSBNUGxheWVyIGxpYm1wY29kZWNzL3ZmX2JsYWNrZnJhbWUuYy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgQmxhY2tGcmFtZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBiYW1vdW50OyAgICAgICAgICAvLy88IGJsYWNrIGFtb3VudAorICAgIGludCBidGhyZXNoOyAgICAgICAgICAvLy88IGJsYWNrIHRocmVzaG9sZAorICAgIHVuc2lnbmVkIGludCBmcmFtZTsgICAvLy88IGZyYW1lIG51bWJlcgorICAgIHVuc2lnbmVkIGludCBuYmxhY2s7ICAvLy88IG51bWJlciBvZiBibGFjayBwaXhlbHMgY291bnRlZCBzbyBmYXIKKyAgICB1bnNpZ25lZCBpbnQgbGFzdF9rZXlmcmFtZTsgLy8vPCBmcmFtZSBudW1iZXIgb2YgdGhlIGxhc3QgcmVjZWl2ZWQga2V5LWZyYW1lCit9IEJsYWNrRnJhbWVDb250ZXh0OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMFAsIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9OVjEyLAorICAgICAgICBBVl9QSVhfRk1UX05WMjEsIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU0VUX01FVEEoa2V5LCBmb3JtYXQsIHZhbHVlKSBcCisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCB2YWx1ZSk7ICBcCisgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsIGtleSwgYnVmLCAwKQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBCbGFja0ZyYW1lQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgeCwgaTsKKyAgICBpbnQgcGJsYWNrID0gMDsKKyAgICB1aW50OF90ICpwID0gZnJhbWUtPmRhdGFbMF07CisgICAgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGE7CisgICAgY2hhciBidWZbMzJdOworCisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5oZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW5saW5rLT53OyB4KyspCisgICAgICAgICAgICBzLT5uYmxhY2sgKz0gcFt4XSA8IHMtPmJ0aHJlc2g7CisgICAgICAgIHAgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIGlmIChmcmFtZS0+a2V5X2ZyYW1lKQorICAgICAgICBzLT5sYXN0X2tleWZyYW1lID0gcy0+ZnJhbWU7CisKKyAgICBwYmxhY2sgPSBzLT5uYmxhY2sgKiAxMDAgLyAoaW5saW5rLT53ICogaW5saW5rLT5oKTsKKyAgICBpZiAocGJsYWNrID49IHMtPmJhbW91bnQpIHsKKyAgICAgICAgbWV0YWRhdGEgPSBhdnByaXZfZnJhbWVfZ2V0X21ldGFkYXRhcChmcmFtZSk7CisKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJmcmFtZToldSBwYmxhY2s6JXUgcHRzOiUiUFJJZDY0IiB0OiVmICIKKyAgICAgICAgICAgICAgICJ0eXBlOiVjIGxhc3Rfa2V5ZnJhbWU6JWRcbiIsCisgICAgICAgICAgICAgICBzLT5mcmFtZSwgcGJsYWNrLCBmcmFtZS0+cHRzLAorICAgICAgICAgICAgICAgZnJhbWUtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSA/IC0xIDogZnJhbWUtPnB0cyAqIGF2X3EyZChpbmxpbmstPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICBhdl9nZXRfcGljdHVyZV90eXBlX2NoYXIoZnJhbWUtPnBpY3RfdHlwZSksIHMtPmxhc3Rfa2V5ZnJhbWUpOworCisgICAgICAgIFNFVF9NRVRBKCJsYXZmaS5ibGFja2ZyYW1lLnBibGFjayIsICIldSIsIHBibGFjayk7CisgICAgfQorCisgICAgcy0+ZnJhbWUrKzsKKyAgICBzLT5uYmxhY2sgPSAwOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoaW5saW5rLT5kc3QtPm91dHB1dHNbMF0sIGZyYW1lKTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQmxhY2tGcmFtZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGJsYWNrZnJhbWVfb3B0aW9uc1tdID0geworICAgIHsgImFtb3VudCIsICJQZXJjZW50YWdlIG9mIHRoZSBwaXhlbHMgdGhhdCBoYXZlIHRvIGJlIGJlbG93IHRoZSB0aHJlc2hvbGQgIgorICAgICAgICAiZm9yIHRoZSBmcmFtZSB0byBiZSBjb25zaWRlcmVkIGJsYWNrLiIsIE9GRlNFVChiYW1vdW50KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSA5OCB9LCAwLCAxMDAsICAgICBGTEFHUyB9LAorICAgIHsgInRocmVzaG9sZCIsICJ0aHJlc2hvbGQgYmVsb3cgd2hpY2ggYSBwaXhlbCB2YWx1ZSBpcyBjb25zaWRlcmVkIGJsYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoYnRocmVzaCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMzIgfSwgMCwgMjU1LCAgICAgRkxBR1MgfSwKKyAgICB7ICJ0aHJlc2giLCAidGhyZXNob2xkIGJlbG93IHdoaWNoIGEgcGl4ZWwgdmFsdWUgaXMgY29uc2lkZXJlZCBibGFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGJ0aHJlc2gpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDMyIH0sIDAsIDI1NSwgICAgIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhibGFja2ZyYW1lKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX2JsYWNrZnJhbWVfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9ibGFja2ZyYW1lX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTworICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2JsYWNrZnJhbWUgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYmxhY2tmcmFtZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGV0ZWN0IGZyYW1lcyB0aGF0IGFyZSAoYWxtb3N0KSBibGFjay4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihCbGFja0ZyYW1lQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmYmxhY2tmcmFtZV9jbGFzcywKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl92Zl9ibGFja2ZyYW1lX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX3ZmX2JsYWNrZnJhbWVfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfYmxlbmQuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ibGVuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZjE5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfYmxlbmQuYwpAQCAtMCwwICsxLDQ2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImJ1ZmZlcnF1ZXVlLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZHVhbGlucHV0LmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworI2RlZmluZSBUT1AgICAgMAorI2RlZmluZSBCT1RUT00gMQorCitlbnVtIEJsZW5kTW9kZSB7CisgICAgQkxFTkRfVU5TRVQgPSAtMSwKKyAgICBCTEVORF9OT1JNQUwsCisgICAgQkxFTkRfQURESVRJT04sCisgICAgQkxFTkRfQU5ELAorICAgIEJMRU5EX0FWRVJBR0UsCisgICAgQkxFTkRfQlVSTiwKKyAgICBCTEVORF9EQVJLRU4sCisgICAgQkxFTkRfRElGRkVSRU5DRSwKKyAgICBCTEVORF9ESVZJREUsCisgICAgQkxFTkRfRE9ER0UsCisgICAgQkxFTkRfRVhDTFVTSU9OLAorICAgIEJMRU5EX0hBUkRMSUdIVCwKKyAgICBCTEVORF9MSUdIVEVOLAorICAgIEJMRU5EX01VTFRJUExZLAorICAgIEJMRU5EX05FR0FUSU9OLAorICAgIEJMRU5EX09SLAorICAgIEJMRU5EX09WRVJMQVksCisgICAgQkxFTkRfUEhPRU5JWCwKKyAgICBCTEVORF9QSU5MSUdIVCwKKyAgICBCTEVORF9SRUZMRUNULAorICAgIEJMRU5EX1NDUkVFTiwKKyAgICBCTEVORF9TT0ZUTElHSFQsCisgICAgQkxFTkRfU1VCVFJBQ1QsCisgICAgQkxFTkRfVklWSURMSUdIVCwKKyAgICBCTEVORF9YT1IsCisgICAgQkxFTkRfTkIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsgICAiWCIsICAgIlkiLCAgICJXIiwgICAiSCIsICAgIlNXIiwgICAiU0giLCAgICJUIiwgICAiTiIsICAgIkEiLCAgICJCIiwgICAiVE9QIiwgICAiQk9UVE9NIiwgICAgICAgIE5VTEwgfTsKK2VudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgVkFSX1gsIFZBUl9ZLCBWQVJfVywgVkFSX0gsIFZBUl9TVywgVkFSX1NILCBWQVJfVCwgVkFSX04sIFZBUl9BLCBWQVJfQiwgVkFSX1RPUCwgVkFSX0JPVFRPTSwgVkFSX1ZBUlNfTkIgfTsKKwordHlwZWRlZiBzdHJ1Y3QgRmlsdGVyUGFyYW1zIHsKKyAgICBlbnVtIEJsZW5kTW9kZSBtb2RlOworICAgIGRvdWJsZSBvcGFjaXR5OworICAgIEFWRXhwciAqZTsKKyAgICBjaGFyICpleHByX3N0cjsKKyAgICB2b2lkICgqYmxlbmQpKGNvbnN0IHVpbnQ4X3QgKnRvcCwgaW50IHRvcF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJvdHRvbSwgaW50IGJvdHRvbV9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgc3RydWN0IEZpbHRlclBhcmFtcyAqcGFyYW0sIGRvdWJsZSAqdmFsdWVzKTsKK30gRmlsdGVyUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCBUaHJlYWREYXRhIHsKKyAgICBjb25zdCBBVkZyYW1lICp0b3AsICpib3R0b207CisgICAgQVZGcmFtZSAqZHN0OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rOworICAgIGludCBwbGFuZTsKKyAgICBpbnQgdywgaDsKKyAgICBGaWx0ZXJQYXJhbXMgKnBhcmFtOworfSBUaHJlYWREYXRhOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgRkZEdWFsSW5wdXRDb250ZXh0IGRpbnB1dDsKKyAgICBpbnQgaHN1YiwgdnN1YjsgICAgICAgICAgICAgLy8vPCBjaHJvbWEgc3Vic2FtcGxpbmcgdmFsdWVzCisgICAgaW50IG5iX3BsYW5lczsKKyAgICBjaGFyICphbGxfZXhwcjsKKyAgICBlbnVtIEJsZW5kTW9kZSBhbGxfbW9kZTsKKyAgICBkb3VibGUgYWxsX29wYWNpdHk7CisKKyAgICBGaWx0ZXJQYXJhbXMgcGFyYW1zWzRdOworfSBCbGVuZENvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEJsZW5kQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBibGVuZF9vcHRpb25zW10gPSB7CisgICAgeyAiYzBfbW9kZSIsICJzZXQgY29tcG9uZW50ICMwIGJsZW5kIG1vZGUiLCBPRkZTRVQocGFyYW1zWzBdLm1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBCTEVORF9OQi0xLCBGTEFHUywgIm1vZGUifSwKKyAgICB7ICJjMV9tb2RlIiwgInNldCBjb21wb25lbnQgIzEgYmxlbmQgbW9kZSIsIE9GRlNFVChwYXJhbXNbMV0ubW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIEJMRU5EX05CLTEsIEZMQUdTLCAibW9kZSJ9LAorICAgIHsgImMyX21vZGUiLCAic2V0IGNvbXBvbmVudCAjMiBibGVuZCBtb2RlIiwgT0ZGU0VUKHBhcmFtc1syXS5tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgQkxFTkRfTkItMSwgRkxBR1MsICJtb2RlIn0sCisgICAgeyAiYzNfbW9kZSIsICJzZXQgY29tcG9uZW50ICMzIGJsZW5kIG1vZGUiLCBPRkZTRVQocGFyYW1zWzNdLm1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBCTEVORF9OQi0xLCBGTEFHUywgIm1vZGUifSwKKyAgICB7ICJhbGxfbW9kZSIsICJzZXQgYmxlbmQgbW9kZSBmb3IgYWxsIGNvbXBvbmVudHMiLCBPRkZTRVQoYWxsX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PS0xfSwtMSwgQkxFTkRfTkItMSwgRkxBR1MsICJtb2RlIn0sCisgICAgeyAiYWRkaXRpb24iLCAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QkxFTkRfQURESVRJT059LCAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJhbmQiLCAgICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1CTEVORF9BTkR9LCAgICAgICAgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgImF2ZXJhZ2UiLCAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0FWRVJBR0V9LCAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAiYnVybiIsICAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QkxFTkRfQlVSTn0sICAgICAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJkYXJrZW4iLCAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1CTEVORF9EQVJLRU59LCAgICAgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgImRpZmZlcmVuY2UiLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0RJRkZFUkVOQ0V9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAiZGl2aWRlIiwgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QkxFTkRfRElWSURFfSwgICAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJkb2RnZSIsICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1CTEVORF9ET0RHRX0sICAgICAgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgImV4Y2x1c2lvbiIsICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0VYQ0xVU0lPTn0sICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAiaGFyZGxpZ2h0IiwgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QkxFTkRfSEFSRExJR0hUfSwgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJsaWdodGVuIiwgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1CTEVORF9MSUdIVEVOfSwgICAgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgIm11bHRpcGx5IiwgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX01VTFRJUExZfSwgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAibmVnYXRpb24iLCAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QkxFTkRfTkVHQVRJT059LCAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJub3JtYWwiLCAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1CTEVORF9OT1JNQUx9LCAgICAgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgIm9yIiwgICAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX09SfSwgICAgICAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAib3ZlcmxheSIsICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QkxFTkRfT1ZFUkxBWX0sICAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJwaG9lbml4IiwgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1CTEVORF9QSE9FTklYfSwgICAgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgInBpbmxpZ2h0IiwgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX1BJTkxJR0hUfSwgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAicmVmbGVjdCIsICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QkxFTkRfUkVGTEVDVH0sICAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJzY3JlZW4iLCAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1CTEVORF9TQ1JFRU59LCAgICAgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgInNvZnRsaWdodCIsICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX1NPRlRMSUdIVH0sICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAic3VidHJhY3QiLCAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QkxFTkRfU1VCVFJBQ1R9LCAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJ2aXZpZGxpZ2h0IiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1CTEVORF9WSVZJRExJR0hUfSwgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgInhvciIsICAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX1hPUn0sICAgICAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAiYzBfZXhwciIsICAic2V0IGNvbG9yIGNvbXBvbmVudCAjMCBleHByZXNzaW9uIiwgT0ZGU0VUKHBhcmFtc1swXS5leHByX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJjMV9leHByIiwgICJzZXQgY29sb3IgY29tcG9uZW50ICMxIGV4cHJlc3Npb24iLCBPRkZTRVQocGFyYW1zWzFdLmV4cHJfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImMyX2V4cHIiLCAgInNldCBjb2xvciBjb21wb25lbnQgIzIgZXhwcmVzc2lvbiIsIE9GRlNFVChwYXJhbXNbMl0uZXhwcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiYzNfZXhwciIsICAic2V0IGNvbG9yIGNvbXBvbmVudCAjMyBleHByZXNzaW9uIiwgT0ZGU0VUKHBhcmFtc1szXS5leHByX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJhbGxfZXhwciIsICJzZXQgZXhwcmVzc2lvbiBmb3IgYWxsIGNvbG9yIGNvbXBvbmVudHMiLCBPRkZTRVQoYWxsX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiYzBfb3BhY2l0eSIsICAic2V0IGNvbG9yIGNvbXBvbmVudCAjMCBvcGFjaXR5IiwgT0ZGU0VUKHBhcmFtc1swXS5vcGFjaXR5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJjMV9vcGFjaXR5IiwgICJzZXQgY29sb3IgY29tcG9uZW50ICMxIG9wYWNpdHkiLCBPRkZTRVQocGFyYW1zWzFdLm9wYWNpdHkpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgImMyX29wYWNpdHkiLCAgInNldCBjb2xvciBjb21wb25lbnQgIzIgb3BhY2l0eSIsIE9GRlNFVChwYXJhbXNbMl0ub3BhY2l0eSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiYzNfb3BhY2l0eSIsICAic2V0IGNvbG9yIGNvbXBvbmVudCAjMyBvcGFjaXR5IiwgT0ZGU0VUKHBhcmFtc1szXS5vcGFjaXR5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJhbGxfb3BhY2l0eSIsICJzZXQgb3BhY2l0eSBmb3IgYWxsIGNvbG9yIGNvbXBvbmVudHMiLCBPRkZTRVQoYWxsX29wYWNpdHkpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCAwLCAxLCBGTEFHU30sCisgICAgeyAic2hvcnRlc3QiLCAgICAiZm9yY2UgdGVybWluYXRpb24gd2hlbiB0aGUgc2hvcnRlc3QgaW5wdXQgdGVybWluYXRlcyIsIE9GRlNFVChkaW5wdXQuc2hvcnRlc3QpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInJlcGVhdGxhc3QiLCAgInJlcGVhdCBsYXN0IGJvdHRvbSBmcmFtZSIsIE9GRlNFVChkaW5wdXQucmVwZWF0bGFzdCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhibGVuZCk7CisKK3N0YXRpYyB2b2lkIGJsZW5kX25vcm1hbChjb25zdCB1aW50OF90ICp0b3AsIGludCB0b3BfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYm90dG9tLCBpbnQgYm90dG9tX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJQYXJhbXMgKnBhcmFtLCBkb3VibGUgKnZhbHVlcykKK3sKKyAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGRzdCwgZHN0X2xpbmVzaXplLCB0b3AsIHRvcF9saW5lc2l6ZSwgd2lkdGgsIGVuZCAtIHN0YXJ0KTsKK30KKworI2RlZmluZSBERUZJTkVfQkxFTkQobmFtZSwgZXhwcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIGJsZW5kXyMjIG5hbWUoY29uc3QgdWludDhfdCAqdG9wLCBpbnQgdG9wX2xpbmVzaXplLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJvdHRvbSwgaW50IGJvdHRvbV9saW5lc2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgc3RhcnQsIGludCBlbmQsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclBhcmFtcyAqcGFyYW0sIGRvdWJsZSAqdmFsdWVzKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3VibGUgb3BhY2l0eSA9IHBhcmFtLT5vcGFjaXR5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2pdID0gdG9wW2pdICsgKChleHByKSAtIHRvcFtqXSkgKiBvcGFjaXR5OyAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdCAgICArPSBkc3RfbGluZXNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0b3AgICAgKz0gdG9wX2xpbmVzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYm90dG9tICs9IGJvdHRvbV9saW5lc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEEgdG9wW2pdCisjZGVmaW5lIEIgYm90dG9tW2pdCisKKyNkZWZpbmUgTVVMVElQTFkoeCwgYSwgYikgKCh4KSAqICgoKGEpICogKGIpKSAvIDI1NSkpCisjZGVmaW5lIFNDUkVFTih4LCBhLCBiKSAgICgyNTUgLSAoeCkgKiAoKDI1NSAtIChhKSkgKiAoMjU1IC0gKGIpKSAvIDI1NSkpCisjZGVmaW5lIEJVUk4oYSwgYikgICAgICAgICgoKGEpID09IDApID8gKGEpIDogRkZNQVgoMCwgMjU1IC0gKCgyNTUgLSAoYikpIDw8IDgpIC8gKGEpKSkKKyNkZWZpbmUgRE9ER0UoYSwgYikgICAgICAgKCgoYSkgPT0gMjU1KSA/IChhKSA6IEZGTUlOKDI1NSwgKCgoYikgPDwgOCkgLyAoMjU1IC0gKGEpKSkpKQorCitERUZJTkVfQkxFTkQoYWRkaXRpb24sICAgRkZNSU4oMjU1LCBBICsgQikpCitERUZJTkVfQkxFTkQoYXZlcmFnZSwgICAgKEEgKyBCKSAvIDIpCitERUZJTkVfQkxFTkQoc3VidHJhY3QsICAgRkZNQVgoMCwgQSAtIEIpKQorREVGSU5FX0JMRU5EKG11bHRpcGx5LCAgIE1VTFRJUExZKDEsIEEsIEIpKQorREVGSU5FX0JMRU5EKG5lZ2F0aW9uLCAgIDI1NSAtIEZGQUJTKDI1NSAtIEEgLSBCKSkKK0RFRklORV9CTEVORChkaWZmZXJlbmNlLCBGRkFCUyhBIC0gQikpCitERUZJTkVfQkxFTkQoc2NyZWVuLCAgICAgU0NSRUVOKDEsIEEsIEIpKQorREVGSU5FX0JMRU5EKG92ZXJsYXksICAgIChBIDwgMTI4KSA/IE1VTFRJUExZKDIsIEEsIEIpIDogU0NSRUVOKDIsIEEsIEIpKQorREVGSU5FX0JMRU5EKGhhcmRsaWdodCwgIChCIDwgMTI4KSA/IE1VTFRJUExZKDIsIEIsIEEpIDogU0NSRUVOKDIsIEIsIEEpKQorREVGSU5FX0JMRU5EKGRhcmtlbiwgICAgIEZGTUlOKEEsIEIpKQorREVGSU5FX0JMRU5EKGxpZ2h0ZW4sICAgIEZGTUFYKEEsIEIpKQorREVGSU5FX0JMRU5EKGRpdmlkZSwgICAgICgoZmxvYXQpQSAvICgoZmxvYXQpQikgKiAyNTUpKQorREVGSU5FX0JMRU5EKGRvZGdlLCAgICAgIERPREdFKEEsIEIpKQorREVGSU5FX0JMRU5EKGJ1cm4sICAgICAgIEJVUk4oQSwgQikpCitERUZJTkVfQkxFTkQoc29mdGxpZ2h0LCAgKEEgPiAxMjcpID8gQiArICgyNTUgLSBCKSAqIChBIC0gMTI3LjUpIC8gMTI3LjUgKiAoMC41IC0gRkZBQlMoQiAtIDEyNy41KSAvIDI1NSk6IEIgLSBCICogKCgxMjcuNSAtIEEpIC8gMTI3LjUpICogKDAuNSAtIEZGQUJTKEIgLSAxMjcuNSkvMjU1KSkKK0RFRklORV9CTEVORChleGNsdXNpb24sICBBICsgQiAtIDIgKiBBICogQiAvIDI1NSkKK0RFRklORV9CTEVORChwaW5saWdodCwgICAoQiA8IDEyOCkgPyBGRk1JTihBLCAyICogQikgOiBGRk1BWChBLCAyICogKEIgLSAxMjgpKSkKK0RFRklORV9CTEVORChwaG9lbml4LCAgICBGRk1JTihBLCBCKSAtIEZGTUFYKEEsIEIpICsgMjU1KQorREVGSU5FX0JMRU5EKHJlZmxlY3QsICAgIChCID09IDI1NSkgPyBCIDogRkZNSU4oMjU1LCAoQSAqIEEgLyAoMjU1IC0gQikpKSkKK0RFRklORV9CTEVORChhbmQsICAgICAgICBBICYgQikKK0RFRklORV9CTEVORChvciwgICAgICAgICBBIHwgQikKK0RFRklORV9CTEVORCh4b3IsICAgICAgICBBIF4gQikKK0RFRklORV9CTEVORCh2aXZpZGxpZ2h0LCAoQiA8IDEyOCkgPyBCVVJOKEEsIDIgKiBCKSA6IERPREdFKEEsIDIgKiAoQiAtIDEyOCkpKQorCitzdGF0aWMgdm9pZCBibGVuZF9leHByKGNvbnN0IHVpbnQ4X3QgKnRvcCwgaW50IHRvcF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYm90dG9tLCBpbnQgYm90dG9tX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJQYXJhbXMgKnBhcmFtLCBkb3VibGUgKnZhbHVlcykKK3sKKyAgICBBVkV4cHIgKmUgPSBwYXJhbS0+ZTsKKyAgICBpbnQgeSwgeDsKKworICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kOyB5KyspIHsKKyAgICAgICAgdmFsdWVzW1ZBUl9ZXSA9IHk7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICB2YWx1ZXNbVkFSX1hdICAgICAgPSB4OworICAgICAgICAgICAgdmFsdWVzW1ZBUl9UT1BdICAgID0gdmFsdWVzW1ZBUl9BXSA9IHRvcFt4XTsKKyAgICAgICAgICAgIHZhbHVlc1tWQVJfQk9UVE9NXSA9IHZhbHVlc1tWQVJfQl0gPSBib3R0b21beF07CisgICAgICAgICAgICBkc3RbeF0gPSBhdl9leHByX2V2YWwoZSwgdmFsdWVzLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBkc3QgICAgKz0gZHN0X2xpbmVzaXplOworICAgICAgICB0b3AgICAgKz0gdG9wX2xpbmVzaXplOworICAgICAgICBib3R0b20gKz0gYm90dG9tX2xpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIGludCBmaWx0ZXJfc2xpY2UoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBpbnQgc2xpY2Vfc3RhcnQgPSAodGQtPmggKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICBpbnQgc2xpY2VfZW5kICAgPSAodGQtPmggKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCB1aW50OF90ICp0b3AgICAgPSB0ZC0+dG9wLT5kYXRhW3RkLT5wbGFuZV07CisgICAgY29uc3QgdWludDhfdCAqYm90dG9tID0gdGQtPmJvdHRvbS0+ZGF0YVt0ZC0+cGxhbmVdOworICAgIHVpbnQ4X3QgKmRzdCAgICA9IHRkLT5kc3QtPmRhdGFbdGQtPnBsYW5lXTsKKyAgICBkb3VibGUgdmFsdWVzW1ZBUl9WQVJTX05CXTsKKworICAgIHZhbHVlc1tWQVJfTl0gID0gdGQtPmlubGluay0+ZnJhbWVfY291bnQ7CisgICAgdmFsdWVzW1ZBUl9UXSAgPSB0ZC0+ZHN0LT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgPyBOQU4gOiB0ZC0+ZHN0LT5wdHMgKiBhdl9xMmQodGQtPmlubGluay0+dGltZV9iYXNlKTsKKyAgICB2YWx1ZXNbVkFSX1ddICA9IHRkLT53OworICAgIHZhbHVlc1tWQVJfSF0gID0gdGQtPmg7CisgICAgdmFsdWVzW1ZBUl9TV10gPSB0ZC0+dyAvIChkb3VibGUpdGQtPmRzdC0+d2lkdGg7CisgICAgdmFsdWVzW1ZBUl9TSF0gPSB0ZC0+aCAvIChkb3VibGUpdGQtPmRzdC0+aGVpZ2h0OworCisgICAgdGQtPnBhcmFtLT5ibGVuZCh0b3AgKyBzbGljZV9zdGFydCAqIHRkLT50b3AtPmxpbmVzaXplW3RkLT5wbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICB0ZC0+dG9wLT5saW5lc2l6ZVt0ZC0+cGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgYm90dG9tICsgc2xpY2Vfc3RhcnQgKiB0ZC0+Ym90dG9tLT5saW5lc2l6ZVt0ZC0+cGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgdGQtPmJvdHRvbS0+bGluZXNpemVbdGQtPnBsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgIGRzdCArIHNsaWNlX3N0YXJ0ICogdGQtPmRzdC0+bGluZXNpemVbdGQtPnBsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3QtPmxpbmVzaXplW3RkLT5wbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICB0ZC0+dywgc2xpY2Vfc3RhcnQsIHNsaWNlX2VuZCwgdGQtPnBhcmFtLCAmdmFsdWVzWzBdKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEFWRnJhbWUgKmJsZW5kX2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICp0b3BfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmJvdHRvbV9idWYpCit7CisgICAgQmxlbmRDb250ZXh0ICpiID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKmRzdF9idWY7CisgICAgaW50IHBsYW5lOworCisgICAgZHN0X2J1ZiA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFkc3RfYnVmKQorICAgICAgICByZXR1cm4gdG9wX2J1ZjsKKyAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKGRzdF9idWYsIHRvcF9idWYpOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgYi0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIGludCBoc3ViID0gcGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyID8gYi0+aHN1YiA6IDA7CisgICAgICAgIGludCB2c3ViID0gcGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyID8gYi0+dnN1YiA6IDA7CisgICAgICAgIGludCBvdXR3ID0gRkZfQ0VJTF9SU0hJRlQoZHN0X2J1Zi0+d2lkdGgsICBoc3ViKTsKKyAgICAgICAgaW50IG91dGggPSBGRl9DRUlMX1JTSElGVChkc3RfYnVmLT5oZWlnaHQsIHZzdWIpOworICAgICAgICBGaWx0ZXJQYXJhbXMgKnBhcmFtID0gJmItPnBhcmFtc1twbGFuZV07CisgICAgICAgIFRocmVhZERhdGEgdGQgPSB7IC50b3AgPSB0b3BfYnVmLCAuYm90dG9tID0gYm90dG9tX2J1ZiwgLmRzdCA9IGRzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC53ID0gb3V0dywgLmggPSBvdXRoLCAucGFyYW0gPSBwYXJhbSwgLnBsYW5lID0gcGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbmxpbmsgPSBpbmxpbmsgfTsKKworICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlLCAmdGQsIE5VTEwsIEZGTUlOKG91dGgsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICB9CisKKyAgICBhdl9mcmFtZV9mcmVlKCZ0b3BfYnVmKTsKKworICAgIHJldHVybiBkc3RfYnVmOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBCbGVuZENvbnRleHQgKmIgPSBjdHgtPnByaXY7CisgICAgaW50IHJldCwgcGxhbmU7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBGRl9BUlJBWV9FTEVNUyhiLT5wYXJhbXMpOyBwbGFuZSsrKSB7CisgICAgICAgIEZpbHRlclBhcmFtcyAqcGFyYW0gPSAmYi0+cGFyYW1zW3BsYW5lXTsKKworICAgICAgICBpZiAoYi0+YWxsX21vZGUgPj0gMCkKKyAgICAgICAgICAgIHBhcmFtLT5tb2RlID0gYi0+YWxsX21vZGU7CisgICAgICAgIGlmIChiLT5hbGxfb3BhY2l0eSA8IDEpCisgICAgICAgICAgICBwYXJhbS0+b3BhY2l0eSA9IGItPmFsbF9vcGFjaXR5OworCisgICAgICAgIHN3aXRjaCAocGFyYW0tPm1vZGUpIHsKKyAgICAgICAgY2FzZSBCTEVORF9BRERJVElPTjogICBwYXJhbS0+YmxlbmQgPSBibGVuZF9hZGRpdGlvbjsgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9BTkQ6ICAgICAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9hbmQ7ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9BVkVSQUdFOiAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9hdmVyYWdlOyAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9CVVJOOiAgICAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9idXJuOyAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9EQVJLRU46ICAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9kYXJrZW47ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9ESUZGRVJFTkNFOiBwYXJhbS0+YmxlbmQgPSBibGVuZF9kaWZmZXJlbmNlOyBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9ESVZJREU6ICAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9kaXZpZGU7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9ET0RHRTogICAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9kb2RnZTsgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9FWENMVVNJT046ICBwYXJhbS0+YmxlbmQgPSBibGVuZF9leGNsdXNpb247ICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9IQVJETElHSFQ6ICBwYXJhbS0+YmxlbmQgPSBibGVuZF9oYXJkbGlnaHQ7ICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9MSUdIVEVOOiAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9saWdodGVuOyAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9NVUxUSVBMWTogICBwYXJhbS0+YmxlbmQgPSBibGVuZF9tdWx0aXBseTsgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9ORUdBVElPTjogICBwYXJhbS0+YmxlbmQgPSBibGVuZF9uZWdhdGlvbjsgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9OT1JNQUw6ICAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9ub3JtYWw7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9PUjogICAgICAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9vcjsgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9PVkVSTEFZOiAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9vdmVybGF5OyAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9QSE9FTklYOiAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9waG9lbml4OyAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9QSU5MSUdIVDogICBwYXJhbS0+YmxlbmQgPSBibGVuZF9waW5saWdodDsgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9SRUZMRUNUOiAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9yZWZsZWN0OyAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9TQ1JFRU46ICAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF9zY3JlZW47ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9TT0ZUTElHSFQ6ICBwYXJhbS0+YmxlbmQgPSBibGVuZF9zb2Z0bGlnaHQ7ICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9TVUJUUkFDVDogICBwYXJhbS0+YmxlbmQgPSBibGVuZF9zdWJ0cmFjdDsgICBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9WSVZJRExJR0hUOiBwYXJhbS0+YmxlbmQgPSBibGVuZF92aXZpZGxpZ2h0OyBicmVhazsKKyAgICAgICAgY2FzZSBCTEVORF9YT1I6ICAgICAgICBwYXJhbS0+YmxlbmQgPSBibGVuZF94b3I7ICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiLT5hbGxfZXhwciAmJiAhcGFyYW0tPmV4cHJfc3RyKSB7CisgICAgICAgICAgICBwYXJhbS0+ZXhwcl9zdHIgPSBhdl9zdHJkdXAoYi0+YWxsX2V4cHIpOworICAgICAgICAgICAgaWYgKCFwYXJhbS0+ZXhwcl9zdHIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW0tPmV4cHJfc3RyKSB7CisgICAgICAgICAgICByZXQgPSBhdl9leHByX3BhcnNlKCZwYXJhbS0+ZSwgcGFyYW0tPmV4cHJfc3RyLCB2YXJfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcGFyYW0tPmJsZW5kID0gYmxlbmRfZXhwcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGItPmRpbnB1dC5wcm9jZXNzID0gYmxlbmRfZnJhbWU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWQTQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsIEFWX1BJWF9GTVRfWVVWSjQyMlAsQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0MFAsIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUkFQLCBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEFWRmlsdGVyTGluayAqdG9wbGluayA9IGN0eC0+aW5wdXRzW1RPUF07CisgICAgQVZGaWx0ZXJMaW5rICpib3R0b21saW5rID0gY3R4LT5pbnB1dHNbQk9UVE9NXTsKKyAgICBCbGVuZENvbnRleHQgKmIgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhfZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQodG9wbGluay0+Zm9ybWF0KTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHRvcGxpbmstPmZvcm1hdCAhPSBib3R0b21saW5rLT5mb3JtYXQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW5wdXRzIG11c3QgYmUgb2Ygc2FtZSBwaXhlbCBmb3JtYXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAodG9wbGluay0+dyAgICAgICAgICAgICAgICAgICAgICAgIT0gYm90dG9tbGluay0+dyB8fAorICAgICAgICB0b3BsaW5rLT5oICAgICAgICAgICAgICAgICAgICAgICAhPSBib3R0b21saW5rLT5oIHx8CisgICAgICAgIHRvcGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICE9IGJvdHRvbWxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtIHx8CisgICAgICAgIHRvcGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuICE9IGJvdHRvbWxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZpcnN0IGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAiCisgICAgICAgICAgICAgICAiKHNpemUgJWR4JWQsIFNBUiAlZDolZCkgZG8gbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nICIKKyAgICAgICAgICAgICAgICJzZWNvbmQgaW5wdXQgbGluayAlcyBwYXJhbWV0ZXJzICglZHglZCwgU0FSICVkOiVkKVxuIiwKKyAgICAgICAgICAgICAgIGN0eC0+aW5wdXRfcGFkc1tUT1BdLm5hbWUsIHRvcGxpbmstPncsIHRvcGxpbmstPmgsCisgICAgICAgICAgICAgICB0b3BsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgIHRvcGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAorICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzW0JPVFRPTV0ubmFtZSwgYm90dG9tbGluay0+dywgYm90dG9tbGluay0+aCwKKyAgICAgICAgICAgICAgIGJvdHRvbWxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgYm90dG9tbGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG91dGxpbmstPncgPSB0b3BsaW5rLT53OworICAgIG91dGxpbmstPmggPSB0b3BsaW5rLT5oOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IHRvcGxpbmstPnRpbWVfYmFzZTsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gdG9wbGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gdG9wbGluay0+ZnJhbWVfcmF0ZTsKKworICAgIGItPmhzdWIgPSBwaXhfZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBiLT52c3ViID0gcGl4X2Rlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgYi0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXModG9wbGluay0+Zm9ybWF0KTsKKworICAgIGlmICgocmV0ID0gZmZfZHVhbGlucHV0X2luaXQoY3R4LCAmYi0+ZGlucHV0KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEJsZW5kQ29udGV4dCAqYiA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZmX2R1YWxpbnB1dF91bmluaXQoJmItPmRpbnB1dCk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGItPnBhcmFtcyk7IGkrKykKKyAgICAgICAgYXZfZXhwcl9mcmVlKGItPnBhcmFtc1tpXS5lKTsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBCbGVuZENvbnRleHQgKmIgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisgICAgcmV0dXJuIGZmX2R1YWxpbnB1dF9yZXF1ZXN0X2ZyYW1lKCZiLT5kaW5wdXQsIG91dGxpbmspOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqYnVmKQoreworICAgIEJsZW5kQ29udGV4dCAqYiA9IGlubGluay0+ZHN0LT5wcml2OworICAgIHJldHVybiBmZl9kdWFsaW5wdXRfZmlsdGVyX2ZyYW1lKCZiLT5kaW5wdXQsIGlubGluaywgYnVmKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGJsZW5kX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAidG9wIiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgID0gZmlsdGVyX2ZyYW1lLAorICAgIH0seworICAgICAgICAubmFtZSAgICAgICAgICA9ICJib3R0b20iLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGJsZW5kX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfYmxlbmQgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYmxlbmQiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJsZW5kIHR3byB2aWRlbyBmcmFtZXMgaW50byBlYWNoIG90aGVyLiIpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihCbGVuZENvbnRleHQpLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGJsZW5kX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGJsZW5kX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmYmxlbmRfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfSU5URVJOQUwgfCBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2JveGJsdXIuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ib3hibHVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhNTEzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ib3hibHVyLmMKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQXBwbHkgYSBib3hibHVyIGZpbHRlciB0byB0aGUgaW5wdXQgdmlkZW8uCisgKiBQb3J0ZWQgZnJvbSBNUGxheWVyIGxpYm1wY29kZWNzL3ZmX2JveGJsdXIuYy4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFyX25hbWVzW10gPSB7CisgICAgInciLAorICAgICJoIiwKKyAgICAiY3ciLAorICAgICJjaCIsCisgICAgImhzdWIiLAorICAgICJ2c3ViIiwKKyAgICBOVUxMCit9OworCitlbnVtIHZhcl9uYW1lIHsKKyAgICBWQVJfVywKKyAgICBWQVJfSCwKKyAgICBWQVJfQ1csCisgICAgVkFSX0NILAorICAgIFZBUl9IU1VCLAorICAgIFZBUl9WU1VCLAorICAgIFZBUlNfTkIKK307CisKK3R5cGVkZWYgc3RydWN0IEZpbHRlclBhcmFtIHsKKyAgICBpbnQgcmFkaXVzOworICAgIGludCBwb3dlcjsKKyAgICBjaGFyICpyYWRpdXNfZXhwcjsKK30gRmlsdGVyUGFyYW07CisKK3R5cGVkZWYgc3RydWN0IEJveEJsdXJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBGaWx0ZXJQYXJhbSBsdW1hX3BhcmFtOworICAgIEZpbHRlclBhcmFtIGNocm9tYV9wYXJhbTsKKyAgICBGaWx0ZXJQYXJhbSBhbHBoYV9wYXJhbTsKKworICAgIGludCBoc3ViLCB2c3ViOworICAgIGludCByYWRpdXNbNF07CisgICAgaW50IHBvd2VyWzRdOworICAgIHVpbnQ4X3QgKnRlbXBbMl07IC8vLzwgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGluIGJsdXJfcG93ZXIoKQorfSBCb3hCbHVyQ29udGV4dDsKKworI2RlZmluZSBZIDAKKyNkZWZpbmUgVSAxCisjZGVmaW5lIFYgMgorI2RlZmluZSBBIDMKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQm94Qmx1ckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoIXMtPmx1bWFfcGFyYW0ucmFkaXVzX2V4cHIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTHVtYSByYWRpdXMgZXhwcmVzc2lvbiBpcyBub3Qgc2V0LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogZmlsbCBtaXNzaW5nIHBhcmFtcyAqLworICAgIGlmICghcy0+Y2hyb21hX3BhcmFtLnJhZGl1c19leHByKSB7CisgICAgICAgIHMtPmNocm9tYV9wYXJhbS5yYWRpdXNfZXhwciA9IGF2X3N0cmR1cChzLT5sdW1hX3BhcmFtLnJhZGl1c19leHByKTsKKyAgICAgICAgaWYgKCFzLT5jaHJvbWFfcGFyYW0ucmFkaXVzX2V4cHIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBpZiAocy0+Y2hyb21hX3BhcmFtLnBvd2VyIDwgMCkKKyAgICAgICAgcy0+Y2hyb21hX3BhcmFtLnBvd2VyID0gcy0+bHVtYV9wYXJhbS5wb3dlcjsKKworICAgIGlmICghcy0+YWxwaGFfcGFyYW0ucmFkaXVzX2V4cHIpIHsKKyAgICAgICAgcy0+YWxwaGFfcGFyYW0ucmFkaXVzX2V4cHIgPSBhdl9zdHJkdXAocy0+bHVtYV9wYXJhbS5yYWRpdXNfZXhwcik7CisgICAgICAgIGlmICghcy0+YWxwaGFfcGFyYW0ucmFkaXVzX2V4cHIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBpZiAocy0+YWxwaGFfcGFyYW0ucG93ZXIgPCAwKQorICAgICAgICBzLT5hbHBoYV9wYXJhbS5wb3dlciA9IHMtPmx1bWFfcGFyYW0ucG93ZXI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQm94Qmx1ckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmVlcCgmcy0+dGVtcFswXSk7CisgICAgYXZfZnJlZXAoJnMtPnRlbXBbMV0pOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICBBVl9QSVhfRk1UX1lVVjQyMlAsICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDExUCwgIEFWX1BJWF9GTVRfWVVWNDEwUCwgIEFWX1BJWF9GTVRfWVVWQTQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIEFWRmlsdGVyQ29udGV4dCAgICAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQm94Qmx1ckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHcgPSBpbmxpbmstPncsIGggPSBpbmxpbmstPmg7CisgICAgaW50IGN3LCBjaDsKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJTX05CXSwgcmVzOworICAgIGNoYXIgKmV4cHI7CisgICAgaW50IHJldDsKKworICAgIGlmICghKHMtPnRlbXBbMF0gPSBhdl9tYWxsb2MoRkZNQVgodywgaCkpKSB8fAorICAgICAgICAhKHMtPnRlbXBbMV0gPSBhdl9tYWxsb2MoRkZNQVgodywgaCkpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPmhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHMtPnZzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgdmFyX3ZhbHVlc1tWQVJfV10gICAgICAgPSBpbmxpbmstPnc7CisgICAgdmFyX3ZhbHVlc1tWQVJfSF0gICAgICAgPSBpbmxpbmstPmg7CisgICAgdmFyX3ZhbHVlc1tWQVJfQ1ddID0gY3cgPSB3Pj5zLT5oc3ViOworICAgIHZhcl92YWx1ZXNbVkFSX0NIXSA9IGNoID0gaD4+cy0+dnN1YjsKKyAgICB2YXJfdmFsdWVzW1ZBUl9IU1VCXSAgICA9IDE8PHMtPmhzdWI7CisgICAgdmFyX3ZhbHVlc1tWQVJfVlNVQl0gICAgPSAxPDxzLT52c3ViOworCisjZGVmaW5lIEVWQUxfUkFESVVTX0VYUFIoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXhwciA9IHMtPmNvbXAjI19wYXJhbS5yYWRpdXNfZXhwcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmcmVzLCBleHByLCB2YXJfbmFtZXMsIHZhcl92YWx1ZXMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpOyBcCisgICAgcy0+Y29tcCMjX3BhcmFtLnJhZGl1cyA9IHJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJldCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAiRXJyb3Igd2hlbiBldmFsdWF0aW5nICIgI2NvbXAgIiByYWRpdXMgZXhwcmVzc2lvbiAnJXMnXG4iLCBleHByKTsgXAorICAgICAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICBFVkFMX1JBRElVU19FWFBSKGx1bWEpOworICAgIEVWQUxfUkFESVVTX0VYUFIoY2hyb21hKTsKKyAgICBFVkFMX1JBRElVU19FWFBSKGFscGhhKTsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAibHVtYV9yYWRpdXM6JWQgbHVtYV9wb3dlcjolZCAiCisgICAgICAgICAgICJjaHJvbWFfcmFkaXVzOiVkIGNocm9tYV9wb3dlcjolZCAiCisgICAgICAgICAgICJhbHBoYV9yYWRpdXM6JWQgYWxwaGFfcG93ZXI6JWQgIgorICAgICAgICAgICAidzolZCBjaHJvbWFfdzolZCBoOiVkIGNocm9tYV9oOiVkXG4iLAorICAgICAgICAgICBzLT5sdW1hX3BhcmFtICAucmFkaXVzLCBzLT5sdW1hX3BhcmFtICAucG93ZXIsCisgICAgICAgICAgIHMtPmNocm9tYV9wYXJhbS5yYWRpdXMsIHMtPmNocm9tYV9wYXJhbS5wb3dlciwKKyAgICAgICAgICAgcy0+YWxwaGFfcGFyYW0gLnJhZGl1cywgcy0+YWxwaGFfcGFyYW0gLnBvd2VyLAorICAgICAgICAgICB3LCBjdywgaCwgY2gpOworCisjZGVmaW5lIENIRUNLX1JBRElVU19WQUwod18sIGhfLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHMtPmNvbXAjI19wYXJhbS5yYWRpdXMgPCAwIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDIqcy0+Y29tcCMjX3BhcmFtLnJhZGl1cyA+IEZGTUlOKHdfLCBoXykpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAiSW52YWxpZCAiICNjb21wICIgcmFkaXVzIHZhbHVlICVkLCBtdXN0IGJlID49IDAgYW5kIDw9ICVkXG4iLCBcCisgICAgICAgICAgICAgICBzLT5jb21wIyNfcGFyYW0ucmFkaXVzLCBGRk1JTih3XywgaF8pLzIpOyAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgIENIRUNLX1JBRElVU19WQUwodywgIGgsICBsdW1hKTsKKyAgICBDSEVDS19SQURJVVNfVkFMKGN3LCBjaCwgY2hyb21hKTsKKyAgICBDSEVDS19SQURJVVNfVkFMKHcsICBoLCAgYWxwaGEpOworCisgICAgcy0+cmFkaXVzW1ldID0gcy0+bHVtYV9wYXJhbS5yYWRpdXM7CisgICAgcy0+cmFkaXVzW1VdID0gcy0+cmFkaXVzW1ZdID0gcy0+Y2hyb21hX3BhcmFtLnJhZGl1czsKKyAgICBzLT5yYWRpdXNbQV0gPSBzLT5hbHBoYV9wYXJhbS5yYWRpdXM7CisKKyAgICBzLT5wb3dlcltZXSA9IHMtPmx1bWFfcGFyYW0ucG93ZXI7CisgICAgcy0+cG93ZXJbVV0gPSBzLT5wb3dlcltWXSA9IHMtPmNocm9tYV9wYXJhbS5wb3dlcjsKKyAgICBzLT5wb3dlcltBXSA9IHMtPmFscGhhX3BhcmFtLnBvd2VyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibHVyKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdGVwLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCByYWRpdXMpCit7CisgICAgLyogTmFpdmUgYm94Ymx1ciB3b3VsZCBzdW0gc291cmNlIHBpeGVscyBmcm9tIHgtcmFkaXVzIC4uIHgrcmFkaXVzCisgICAgICogZm9yIGRlc3RpbmF0aW9uIHBpeGVsIHguIFRoYXQgd291bGQgYmUgTyhyYWRpdXMqd2lkdGgpLgorICAgICAqIElmIHlvdSBub3cgbG9vayBhdCB3aGF0IHNvdXJjZSBwaXhlbHMgcmVwcmVzZW50IDIgY29uc2VjdXRpdmUKKyAgICAgKiBvdXRwdXQgcGl4ZWxzLCB0aGVuIHlvdSBzZWUgdGhleSBhcmUgYWxtb3N0IGlkZW50aWNhbCBhbmQgb25seQorICAgICAqIGRpZmZlciBieSAyIHBpeGVscywgbGlrZToKKyAgICAgKiBzcmMwICAgICAgIDExMTExMTExMQorICAgICAqIGRzdDAgICAgICAgICAgIDEKKyAgICAgKiBzcmMxICAgICAgICAxMTExMTExMTEKKyAgICAgKiBkc3QxICAgICAgICAgICAgMQorICAgICAqIHNyYzAtc3JjMSAgMSAgICAgICAtMQorICAgICAqIHNvIHdoZW4geW91IGtub3cgb25lIG91dHB1dCBwaXhlbCB5b3UgY2FuIGZpbmQgdGhlIG5leHQgYnkganVzdCBhZGRpbmcKKyAgICAgKiBhbmQgc3VidHJhY3RpbmcgMSBpbnB1dCBwaXhlbC4KKyAgICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgYWRvcHRzIHRoaXMgZmFzdGVyIHZhcmlhbnQuCisgICAgICovCisgICAgY29uc3QgaW50IGxlbmd0aCA9IHJhZGl1cyoyICsgMTsKKyAgICBjb25zdCBpbnQgaW52ID0gKCgxPDwxNikgKyBsZW5ndGgvMikvbGVuZ3RoOworICAgIGludCB4LCBzdW0gPSAwOworCisgICAgZm9yICh4ID0gMDsgeCA8IHJhZGl1czsgeCsrKQorICAgICAgICBzdW0gKz0gc3JjW3gqc3JjX3N0ZXBdPDwxOworICAgIHN1bSArPSBzcmNbcmFkaXVzKnNyY19zdGVwXTsKKworICAgIGZvciAoeCA9IDA7IHggPD0gcmFkaXVzOyB4KyspIHsKKyAgICAgICAgc3VtICs9IHNyY1socmFkaXVzK3gpKnNyY19zdGVwXSAtIHNyY1socmFkaXVzLXgpKnNyY19zdGVwXTsKKyAgICAgICAgZHN0W3gqZHN0X3N0ZXBdID0gKHN1bSppbnYgKyAoMTw8MTUpKT4+MTY7CisgICAgfQorCisgICAgZm9yICg7IHggPCBsZW4tcmFkaXVzOyB4KyspIHsKKyAgICAgICAgc3VtICs9IHNyY1socmFkaXVzK3gpKnNyY19zdGVwXSAtIHNyY1soeC1yYWRpdXMtMSkqc3JjX3N0ZXBdOworICAgICAgICBkc3RbeCpkc3Rfc3RlcF0gPSAoc3VtKmludiArICgxPDwxNSkpPj4xNjsKKyAgICB9CisKKyAgICBmb3IgKDsgeCA8IGxlbjsgeCsrKSB7CisgICAgICAgIHN1bSArPSBzcmNbKDIqbGVuLXJhZGl1cy14LTEpKnNyY19zdGVwXSAtIHNyY1soeC1yYWRpdXMtMSkqc3JjX3N0ZXBdOworICAgICAgICBkc3RbeCpkc3Rfc3RlcF0gPSAoc3VtKmludiArICgxPDwxNSkpPj4xNjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibHVyX3Bvd2VyKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdGVwLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCByYWRpdXMsIGludCBwb3dlciwgdWludDhfdCAqdGVtcFsyXSkKK3sKKyAgICB1aW50OF90ICphID0gdGVtcFswXSwgKmIgPSB0ZW1wWzFdOworCisgICAgaWYgKHJhZGl1cyAmJiBwb3dlcikgeworICAgICAgICBibHVyKGEsIDEsIHNyYywgc3JjX3N0ZXAsIGxlbiwgcmFkaXVzKTsKKyAgICAgICAgZm9yICg7IHBvd2VyID4gMjsgcG93ZXItLSkgeworICAgICAgICAgICAgdWludDhfdCAqYzsKKyAgICAgICAgICAgIGJsdXIoYiwgMSwgYSwgMSwgbGVuLCByYWRpdXMpOworICAgICAgICAgICAgYyA9IGE7IGEgPSBiOyBiID0gYzsKKyAgICAgICAgfQorICAgICAgICBpZiAocG93ZXIgPiAxKSB7CisgICAgICAgICAgICBibHVyKGRzdCwgZHN0X3N0ZXAsIGEsIDEsIGxlbiwgcmFkaXVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgICAgIGRzdFtpKmRzdF9zdGVwXSA9IGFbaV07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgZHN0W2kqZHN0X3N0ZXBdID0gc3JjW2kqc3JjX3N0ZXBdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaGJsdXIodWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCByYWRpdXMsIGludCBwb3dlciwgdWludDhfdCAqdGVtcFsyXSkKK3sKKyAgICBpbnQgeTsKKworICAgIGlmIChyYWRpdXMgPT0gMCAmJiBkc3QgPT0gc3JjKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKQorICAgICAgICBibHVyX3Bvd2VyKGRzdCArIHkqZHN0X2xpbmVzaXplLCAxLCBzcmMgKyB5KnNyY19saW5lc2l6ZSwgMSwKKyAgICAgICAgICAgICAgICAgICB3LCByYWRpdXMsIHBvd2VyLCB0ZW1wKTsKK30KKworc3RhdGljIHZvaWQgdmJsdXIodWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCByYWRpdXMsIGludCBwb3dlciwgdWludDhfdCAqdGVtcFsyXSkKK3sKKyAgICBpbnQgeDsKKworICAgIGlmIChyYWRpdXMgPT0gMCAmJiBkc3QgPT0gc3JjKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICBibHVyX3Bvd2VyKGRzdCArIHgsIGRzdF9saW5lc2l6ZSwgc3JjICsgeCwgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgIGgsIHJhZGl1cywgcG93ZXIsIHRlbXApOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBCb3hCbHVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IHBsYW5lOworICAgIGludCBjdyA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+dywgcy0+aHN1YiksIGNoID0gRkZfQ0VJTF9SU0hJRlQoaW4tPmhlaWdodCwgcy0+dnN1Yik7CisgICAgaW50IHdbNF0gPSB7IGlubGluay0+dywgY3csIGN3LCBpbmxpbmstPncgfTsKKyAgICBpbnQgaFs0XSA9IHsgaW4tPmhlaWdodCwgY2gsIGNoLCBpbi0+aGVpZ2h0IH07CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQgJiYgaW4tPmRhdGFbcGxhbmVdICYmIGluLT5saW5lc2l6ZVtwbGFuZV07IHBsYW5lKyspCisgICAgICAgIGhibHVyKG91dC0+ZGF0YVtwbGFuZV0sIG91dC0+bGluZXNpemVbcGxhbmVdLAorICAgICAgICAgICAgICBpbiAtPmRhdGFbcGxhbmVdLCBpbiAtPmxpbmVzaXplW3BsYW5lXSwKKyAgICAgICAgICAgICAgd1twbGFuZV0sIGhbcGxhbmVdLCBzLT5yYWRpdXNbcGxhbmVdLCBzLT5wb3dlcltwbGFuZV0sCisgICAgICAgICAgICAgIHMtPnRlbXApOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgNCAmJiBpbi0+ZGF0YVtwbGFuZV0gJiYgaW4tPmxpbmVzaXplW3BsYW5lXTsgcGxhbmUrKykKKyAgICAgICAgdmJsdXIob3V0LT5kYXRhW3BsYW5lXSwgb3V0LT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgIG91dC0+ZGF0YVtwbGFuZV0sIG91dC0+bGluZXNpemVbcGxhbmVdLAorICAgICAgICAgICAgICB3W3BsYW5lXSwgaFtwbGFuZV0sIHMtPnJhZGl1c1twbGFuZV0sIHMtPnBvd2VyW3BsYW5lXSwKKyAgICAgICAgICAgICAgcy0+dGVtcCk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEJveEJsdXJDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGJveGJsdXJfb3B0aW9uc1tdID0geworICAgIHsgImx1bWFfcmFkaXVzIiwgIlJhZGl1cyBvZiB0aGUgbHVtYSBibHVycmluZyBib3giLCBPRkZTRVQobHVtYV9wYXJhbS5yYWRpdXNfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjIifSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJsciIsICAgICAgICAgICJSYWRpdXMgb2YgdGhlIGx1bWEgYmx1cnJpbmcgYm94IiwgT0ZGU0VUKGx1bWFfcGFyYW0ucmFkaXVzX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIyIn0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAibHVtYV9wb3dlciIsICAiSG93IG1hbnkgdGltZXMgc2hvdWxkIHRoZSBib3hibHVyIGJlIGFwcGxpZWQgdG8gbHVtYSIsICBPRkZTRVQobHVtYV9wYXJhbS5wb3dlciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Mn0sIDAsIElOVF9NQVgsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAibHAiLCAgICAgICAgICAiSG93IG1hbnkgdGltZXMgc2hvdWxkIHRoZSBib3hibHVyIGJlIGFwcGxpZWQgdG8gbHVtYSIsICBPRkZTRVQobHVtYV9wYXJhbS5wb3dlciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Mn0sIDAsIElOVF9NQVgsIC5mbGFncyA9IEZMQUdTIH0sCisKKyAgICB7ICJjaHJvbWFfcmFkaXVzIiwgIlJhZGl1cyBvZiB0aGUgY2hyb21hIGJsdXJyaW5nIGJveCIsIE9GRlNFVChjaHJvbWFfcGFyYW0ucmFkaXVzX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImNyIiwgICAgICAgICAgICAiUmFkaXVzIG9mIHRoZSBjaHJvbWEgYmx1cnJpbmcgYm94IiwgT0ZGU0VUKGNocm9tYV9wYXJhbS5yYWRpdXNfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiY2hyb21hX3Bvd2VyIiwgICJIb3cgbWFueSB0aW1lcyBzaG91bGQgdGhlIGJveGJsdXIgYmUgYXBwbGllZCB0byBjaHJvbWEiLCAgT0ZGU0VUKGNocm9tYV9wYXJhbS5wb3dlciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9LTF9LCAtMSwgSU5UX01BWCwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJjcCIsICAgICAgICAgICAgIkhvdyBtYW55IHRpbWVzIHNob3VsZCB0aGUgYm94Ymx1ciBiZSBhcHBsaWVkIHRvIGNocm9tYSIsICBPRkZTRVQoY2hyb21hX3BhcmFtLnBvd2VyKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0tMX0sIC0xLCBJTlRfTUFYLCAuZmxhZ3MgPSBGTEFHUyB9LAorCisgICAgeyAiYWxwaGFfcmFkaXVzIiwgIlJhZGl1cyBvZiB0aGUgYWxwaGEgYmx1cnJpbmcgYm94IiwgT0ZGU0VUKGFscGhhX3BhcmFtLnJhZGl1c19leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJhciIsICAgICAgICAgICAiUmFkaXVzIG9mIHRoZSBhbHBoYSBibHVycmluZyBib3giLCBPRkZTRVQoYWxwaGFfcGFyYW0ucmFkaXVzX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImFscGhhX3Bvd2VyIiwgICJIb3cgbWFueSB0aW1lcyBzaG91bGQgdGhlIGJveGJsdXIgYmUgYXBwbGllZCB0byBhbHBoYSIsICBPRkZTRVQoYWxwaGFfcGFyYW0ucG93ZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PS0xfSwgLTEsIElOVF9NQVgsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiYXAiLCAgICAgICAgICAgIkhvdyBtYW55IHRpbWVzIHNob3VsZCB0aGUgYm94Ymx1ciBiZSBhcHBsaWVkIHRvIGFscGhhIiwgIE9GRlNFVChhbHBoYV9wYXJhbS5wb3dlciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9LTF9LCAtMSwgSU5UX01BWCwgLmZsYWdzID0gRkxBR1MgfSwKKworICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYm94Ymx1cik7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9ib3hibHVyX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfYm94Ymx1cl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfYm94Ymx1ciA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJib3hibHVyIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCbHVyIHRoZSBpbnB1dC4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihCb3hCbHVyQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmYm94Ymx1cl9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfdmZfYm94Ymx1cl9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl92Zl9ib3hibHVyX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfY29kZWN2aWV3LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfY29kZWN2aWV3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3N2Y5NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9jb2RlY3ZpZXcuYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2zDqW1lbnQgQsWTc2NoIDx1IHBraCBtZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ29kZWMgZGVidWcgdmlld2VyIGZpbHRlci4KKyAqCisgKiBBbGwgdGhlIE1WIGRyYXdpbmcgY29kZSBmcm9tIE1pY2hhZWwgTmllZGVybWF5ZXIgaXMgZXh0cmFjdGVkIGZyb20KKyAqIGxpYmF2Y29kZWMvbXBlZ3ZpZGVvLmMuCisgKgorICogVE9ETzogc2VnbWVudGF0aW9uCisgKiBUT0RPOiBxdWFudGl6YXRpb24KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21vdGlvbl92ZWN0b3IuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIE1WX1BfRk9SICAoMTw8MCkKKyNkZWZpbmUgTVZfQl9GT1IgICgxPDwxKQorI2RlZmluZSBNVl9CX0JBQ0sgKDE8PDIpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICB1bnNpZ25lZCBtdjsKK30gQ29kZWNWaWV3Q29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ29kZWNWaWV3Q29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gY29kZWN2aWV3X29wdGlvbnNbXSA9IHsKKyAgICB7ICJtdiIsICJzZXQgbW90aW9uIHZlY3RvcnMgdG8gdmlzdWFsaXplIiwgT0ZGU0VUKG12KSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0PTB9LCAwLCBJTlRfTUFYLCBGTEFHUywgIm12IiB9LAorICAgICAgICB7InBmIiwgImZvcndhcmQgcHJlZGljdGVkIE1WcyBvZiBQLWZyYW1lcyIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNVl9QX0ZPUiB9LCAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtdiJ9LAorICAgICAgICB7ImJmIiwgImZvcndhcmQgcHJlZGljdGVkIE1WcyBvZiBCLWZyYW1lcyIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNVl9CX0ZPUiB9LCAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtdiJ9LAorICAgICAgICB7ImJiIiwgImJhY2t3YXJkIHByZWRpY3RlZCBNVnMgb2YgQi1mcmFtZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNVl9CX0JBQ0sgfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtdiJ9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoY29kZWN2aWV3KTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIC8vIFRPRE86IHdlIGNhbiBwcm9iYWJseSBhZGQgd2F5IG1vcmUgcGl4ZWwgZm9ybWF0cyB3aXRob3V0IGFueSBvdGhlcgorICAgIC8vIGNoYW5nZXM7IGFueXRoaW5nIHdpdGggOC1iaXQgbHVtYSBpbiBmaXJzdCBwbGFuZSBzaG91bGQgYmUgd29ya2luZworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHtBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfTk9ORX07CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsaXBfbGluZShpbnQgKnN4LCBpbnQgKnN5LCBpbnQgKmV4LCBpbnQgKmV5LCBpbnQgbWF4eCkKK3sKKyAgICBpZigqc3ggPiAqZXgpCisgICAgICAgIHJldHVybiBjbGlwX2xpbmUoZXgsIGV5LCBzeCwgc3ksIG1heHgpOworCisgICAgaWYgKCpzeCA8IDApIHsKKyAgICAgICAgaWYgKCpleCA8IDApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgKnN5ID0gKmV5ICsgKCpzeSAtICpleSkgKiAoaW50NjRfdCkqZXggLyAoKmV4IC0gKnN4KTsKKyAgICAgICAgKnN4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKmV4ID4gbWF4eCkgeworICAgICAgICBpZiAoKnN4ID4gbWF4eCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAqZXkgPSAqc3kgKyAoKmV5IC0gKnN5KSAqIChpbnQ2NF90KShtYXh4IC0gKnN4KSAvICgqZXggLSAqc3gpOworICAgICAgICAqZXggPSBtYXh4OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEcmF3IGEgbGluZSBmcm9tIChleCwgZXkpIC0+IChzeCwgc3kpLgorICogQHBhcmFtIHcgd2lkdGggb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gaCBoZWlnaHQgb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gc3RyaWRlIHN0cmlkZS9saW5lc2l6ZSBvZiB0aGUgaW1hZ2UKKyAqIEBwYXJhbSBjb2xvciBjb2xvciBvZiB0aGUgYXJyb3cKKyAqLworc3RhdGljIHZvaWQgZHJhd19saW5lKHVpbnQ4X3QgKmJ1ZiwgaW50IHN4LCBpbnQgc3ksIGludCBleCwgaW50IGV5LAorICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSwgaW50IGNvbG9yKQoreworICAgIGludCB4LCB5LCBmciwgZjsKKworICAgIGlmIChjbGlwX2xpbmUoJnN4LCAmc3ksICZleCwgJmV5LCB3IC0gMSkpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoY2xpcF9saW5lKCZzeSwgJnN4LCAmZXksICZleCwgaCAtIDEpKQorICAgICAgICByZXR1cm47CisKKyAgICBzeCA9IGF2X2NsaXAoc3gsIDAsIHcgLSAxKTsKKyAgICBzeSA9IGF2X2NsaXAoc3ksIDAsIGggLSAxKTsKKyAgICBleCA9IGF2X2NsaXAoZXgsIDAsIHcgLSAxKTsKKyAgICBleSA9IGF2X2NsaXAoZXksIDAsIGggLSAxKTsKKworICAgIGJ1ZltzeSAqIHN0cmlkZSArIHN4XSArPSBjb2xvcjsKKworICAgIGlmIChGRkFCUyhleCAtIHN4KSA+IEZGQUJTKGV5IC0gc3kpKSB7CisgICAgICAgIGlmIChzeCA+IGV4KSB7CisgICAgICAgICAgICBGRlNXQVAoaW50LCBzeCwgZXgpOworICAgICAgICAgICAgRkZTV0FQKGludCwgc3ksIGV5KTsKKyAgICAgICAgfQorICAgICAgICBidWYgKz0gc3ggKyBzeSAqIHN0cmlkZTsKKyAgICAgICAgZXggIC09IHN4OworICAgICAgICBmICAgID0gKChleSAtIHN5KSA8PCAxNikgLyBleDsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8PSBleDsgeCsrKSB7CisgICAgICAgICAgICB5ICA9ICh4ICogZikgPj4gMTY7CisgICAgICAgICAgICBmciA9ICh4ICogZikgJiAweEZGRkY7CisgICAgICAgICAgICAgICAgICAgYnVmWyB5ICAgICAgKiBzdHJpZGUgKyB4XSArPSAoY29sb3IgKiAoMHgxMDAwMCAtIGZyKSkgPj4gMTY7CisgICAgICAgICAgICBpZihmcikgYnVmWyh5ICsgMSkgKiBzdHJpZGUgKyB4XSArPSAoY29sb3IgKiAgICAgICAgICAgIGZyICkgPj4gMTY7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3kgPiBleSkgeworICAgICAgICAgICAgRkZTV0FQKGludCwgc3gsIGV4KTsKKyAgICAgICAgICAgIEZGU1dBUChpbnQsIHN5LCBleSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmICs9IHN4ICsgc3kgKiBzdHJpZGU7CisgICAgICAgIGV5ICAtPSBzeTsKKyAgICAgICAgaWYgKGV5KQorICAgICAgICAgICAgZiA9ICgoZXggLSBzeCkgPDwgMTYpIC8gZXk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGYgPSAwOworICAgICAgICBmb3IoeT0gMDsgeSA8PSBleTsgeSsrKXsKKyAgICAgICAgICAgIHggID0gKHkqZikgPj4gMTY7CisgICAgICAgICAgICBmciA9ICh5KmYpICYgMHhGRkZGOworICAgICAgICAgICAgICAgICAgIGJ1Zlt5ICogc3RyaWRlICsgeCAgICBdICs9IChjb2xvciAqICgweDEwMDAwIC0gZnIpKSA+PiAxNjsKKyAgICAgICAgICAgIGlmKGZyKSBidWZbeSAqIHN0cmlkZSArIHggKyAxXSArPSAoY29sb3IgKiAgICAgICAgICAgIGZyICkgPj4gMTY7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRHJhdyBhbiBhcnJvdyBmcm9tIChleCwgZXkpIC0+IChzeCwgc3kpLgorICogQHBhcmFtIHcgd2lkdGggb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gaCBoZWlnaHQgb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gc3RyaWRlIHN0cmlkZS9saW5lc2l6ZSBvZiB0aGUgaW1hZ2UKKyAqIEBwYXJhbSBjb2xvciBjb2xvciBvZiB0aGUgYXJyb3cKKyAqLworc3RhdGljIHZvaWQgZHJhd19hcnJvdyh1aW50OF90ICpidWYsIGludCBzeCwgaW50IHN5LCBpbnQgZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBleSwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlLCBpbnQgY29sb3IsIGludCB0YWlsLCBpbnQgZGlyZWN0aW9uKQoreworICAgIGludCBkeCxkeTsKKworICAgIGlmIChkaXJlY3Rpb24pIHsKKyAgICAgICAgRkZTV0FQKGludCwgc3gsIGV4KTsKKyAgICAgICAgRkZTV0FQKGludCwgc3ksIGV5KTsKKyAgICB9CisKKyAgICBzeCA9IGF2X2NsaXAoc3gsIC0xMDAsIHcgKyAxMDApOworICAgIHN5ID0gYXZfY2xpcChzeSwgLTEwMCwgaCArIDEwMCk7CisgICAgZXggPSBhdl9jbGlwKGV4LCAtMTAwLCB3ICsgMTAwKTsKKyAgICBleSA9IGF2X2NsaXAoZXksIC0xMDAsIGggKyAxMDApOworCisgICAgZHggPSBleCAtIHN4OworICAgIGR5ID0gZXkgLSBzeTsKKworICAgIGlmIChkeCAqIGR4ICsgZHkgKiBkeSA+IDMgKiAzKSB7CisgICAgICAgIGludCByeCA9ICBkeCArIGR5OworICAgICAgICBpbnQgcnkgPSAtZHggKyBkeTsKKyAgICAgICAgaW50IGxlbmd0aCA9IHNxcnQoKHJ4ICogcnggKyByeSAqIHJ5KSA8PCA4KTsKKworICAgICAgICAvLyBGSVhNRSBzdWJwaXhlbCBhY2N1cmFjeQorICAgICAgICByeCA9IFJPVU5ERURfRElWKHJ4ICogMyA8PCA0LCBsZW5ndGgpOworICAgICAgICByeSA9IFJPVU5ERURfRElWKHJ5ICogMyA8PCA0LCBsZW5ndGgpOworCisgICAgICAgIGlmICh0YWlsKSB7CisgICAgICAgICAgICByeCA9IC1yeDsKKyAgICAgICAgICAgIHJ5ID0gLXJ5OworICAgICAgICB9CisKKyAgICAgICAgZHJhd19saW5lKGJ1Ziwgc3gsIHN5LCBzeCArIHJ4LCBzeSArIHJ5LCB3LCBoLCBzdHJpZGUsIGNvbG9yKTsKKyAgICAgICAgZHJhd19saW5lKGJ1Ziwgc3gsIHN5LCBzeCAtIHJ5LCBzeSArIHJ4LCB3LCBoLCBzdHJpZGUsIGNvbG9yKTsKKyAgICB9CisgICAgZHJhd19saW5lKGJ1Ziwgc3gsIHN5LCBleCwgZXksIHcsIGgsIHN0cmlkZSwgY29sb3IpOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBDb2RlY1ZpZXdDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKworICAgIEFWRnJhbWVTaWRlRGF0YSAqc2QgPSBhdl9mcmFtZV9nZXRfc2lkZV9kYXRhKGZyYW1lLCBBVl9GUkFNRV9EQVRBX01PVElPTl9WRUNUT1JTKTsKKyAgICBpZiAoc2QpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGNvbnN0IEFWTW90aW9uVmVjdG9yICptdnMgPSAoY29uc3QgQVZNb3Rpb25WZWN0b3IgKilzZC0+ZGF0YTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNkLT5zaXplIC8gc2l6ZW9mKCptdnMpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IEFWTW90aW9uVmVjdG9yICptdiA9ICZtdnNbaV07CisgICAgICAgICAgICBjb25zdCBpbnQgZGlyZWN0aW9uID0gbXYtPnNvdXJjZSA+IDA7CisgICAgICAgICAgICBpZiAoKGRpcmVjdGlvbiA9PSAwICYmIChzLT5tdiAmIE1WX1BfRk9SKSAgJiYgZnJhbWUtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkgfHwKKyAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09IDAgJiYgKHMtPm12ICYgTVZfQl9GT1IpICAmJiBmcmFtZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB8fAorICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT0gMSAmJiAocy0+bXYgJiBNVl9CX0JBQ0spICYmIGZyYW1lLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpKQorICAgICAgICAgICAgICAgIGRyYXdfYXJyb3coZnJhbWUtPmRhdGFbMF0sIG12LT5kc3RfeCwgbXYtPmRzdF95LCBtdi0+c3JjX3gsIG12LT5zcmNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwgZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAwLCBtdi0+c291cmNlID4gMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBjb2RlY3ZpZXdfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAubmVlZHNfd3JpdGFibGUgPSAxLAorICAgICB9LAorICAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGNvZGVjdmlld19vdXRwdXRzW10gPSB7CisgICAgIHsKKyAgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgIH0sCisgICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9jb2RlY3ZpZXcgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiY29kZWN2aWV3IiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWaXN1YWxpemUgaW5mb3JtYXRpb24gYWJvdXQgc29tZSBjb2RlY3MiKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihDb2RlY1ZpZXdDb250ZXh0KSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBjb2RlY3ZpZXdfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gY29kZWN2aWV3X291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmY29kZWN2aWV3X2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2NvbG9yYmFsYW5jZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2NvbG9yYmFsYW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNTFjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfY29sb3JiYWxhbmNlLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImRyYXd1dGlscy5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKKyNkZWZpbmUgUiAwCisjZGVmaW5lIEcgMQorI2RlZmluZSBCIDIKKyNkZWZpbmUgQSAzCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBkb3VibGUgc2hhZG93czsKKyAgICBkb3VibGUgbWlkdG9uZXM7CisgICAgZG91YmxlIGhpZ2hsaWdodHM7Cit9IFJhbmdlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgUmFuZ2UgY3lhbl9yZWQ7CisgICAgUmFuZ2UgbWFnZW50YV9ncmVlbjsKKyAgICBSYW5nZSB5ZWxsb3dfYmx1ZTsKKworICAgIHVpbnQ4X3QgbHV0WzNdWzI1Nl07CisKKyAgICB1aW50OF90IHJnYmFfbWFwWzRdOworICAgIGludCBzdGVwOworfSBDb2xvckJhbGFuY2VDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDb2xvckJhbGFuY2VDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjb2xvcmJhbGFuY2Vfb3B0aW9uc1tdID0geworICAgIHsgInJzIiwgInNldCByZWQgc2hhZG93cyIsICAgICAgT0ZGU0VUKGN5YW5fcmVkLnNoYWRvd3MpLCAgICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0xLCAxLCBGTEFHUyB9LAorICAgIHsgImdzIiwgInNldCBncmVlbiBzaGFkb3dzIiwgICAgT0ZGU0VUKG1hZ2VudGFfZ3JlZW4uc2hhZG93cyksICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0xLCAxLCBGTEFHUyB9LAorICAgIHsgImJzIiwgInNldCBibHVlIHNoYWRvd3MiLCAgICAgT0ZGU0VUKHllbGxvd19ibHVlLnNoYWRvd3MpLCAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0xLCAxLCBGTEFHUyB9LAorICAgIHsgInJtIiwgInNldCByZWQgbWlkdG9uZXMiLCAgICAgT0ZGU0VUKGN5YW5fcmVkLm1pZHRvbmVzKSwgICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0xLCAxLCBGTEFHUyB9LAorICAgIHsgImdtIiwgInNldCBncmVlbiBtaWR0b25lcyIsICAgT0ZGU0VUKG1hZ2VudGFfZ3JlZW4ubWlkdG9uZXMpLCAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0xLCAxLCBGTEFHUyB9LAorICAgIHsgImJtIiwgInNldCBibHVlIG1pZHRvbmVzIiwgICAgT0ZGU0VUKHllbGxvd19ibHVlLm1pZHRvbmVzKSwgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0xLCAxLCBGTEFHUyB9LAorICAgIHsgInJoIiwgInNldCByZWQgaGlnaGxpZ2h0cyIsICAgT0ZGU0VUKGN5YW5fcmVkLmhpZ2hsaWdodHMpLCAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0xLCAxLCBGTEFHUyB9LAorICAgIHsgImdoIiwgInNldCBncmVlbiBoaWdobGlnaHRzIiwgT0ZGU0VUKG1hZ2VudGFfZ3JlZW4uaGlnaGxpZ2h0cyksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0xLCAxLCBGTEFHUyB9LAorICAgIHsgImJoIiwgInNldCBibHVlIGhpZ2hsaWdodHMiLCAgT0ZGU0VUKHllbGxvd19ibHVlLmhpZ2hsaWdodHMpLCAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0xLCAxLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoY29sb3JiYWxhbmNlKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9CR1IyNCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0JBLCAgQVZfUElYX0ZNVF9CR1JBLAorICAgICAgICBBVl9QSVhfRk1UX0FCR1IsICBBVl9QSVhfRk1UX0FSR0IsCisgICAgICAgIEFWX1BJWF9GTVRfMEJHUiwgIEFWX1BJWF9GTVRfMFJHQiwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IwLCAgQVZfUElYX0ZNVF9CR1IwLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIENvbG9yQmFsYW5jZUNvbnRleHQgKmNiID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQob3V0bGluay0+Zm9ybWF0KTsKKyAgICBkb3VibGUgKnNoYWRvd3MsICptaWR0b25lcywgKmhpZ2hsaWdodHMsICpidWZmZXI7CisgICAgaW50IGksIHIsIGcsIGI7CisKKyAgICBidWZmZXIgPSBhdl9tYWxsb2MoMjU2ICogMyAqIHNpemVvZigqYnVmZmVyKSk7CisgICAgaWYgKCFidWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzaGFkb3dzICAgID0gYnVmZmVyICsgMjU2ICogMDsKKyAgICBtaWR0b25lcyAgID0gYnVmZmVyICsgMjU2ICogMTsKKyAgICBoaWdobGlnaHRzID0gYnVmZmVyICsgMjU2ICogMjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBkb3VibGUgbG93ID0gYXZfY2xpcGQoKGkgLSA4NS4wKSAvIC02NC4wICsgMC41LCAwLCAxKSAqIDE3OC41OworICAgICAgICBkb3VibGUgbWlkID0gYXZfY2xpcGQoKGkgLSA4NS4wKSAvICA2NC4wICsgMC41LCAwLCAxKSAqCisgICAgICAgICAgICAgICAgICAgICBhdl9jbGlwZCgoaSArIDg1LjAgLSAyNTUuMCkgLyAtNjQuMCArIDAuNSwgMCwgMSkgKiAxNzguNTsKKworICAgICAgICBzaGFkb3dzW2ldID0gbG93OworICAgICAgICBtaWR0b25lc1tpXSA9IG1pZDsKKyAgICAgICAgaGlnaGxpZ2h0c1syNTUgLSBpXSA9IGxvdzsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgciA9IGcgPSBiID0gaTsKKworICAgICAgICByID0gYXZfY2xpcF91aW50OChyICsgY2ItPmN5YW5fcmVkLnNoYWRvd3MgICAgICAgICAqIHNoYWRvd3Nbcl0pOworICAgICAgICByID0gYXZfY2xpcF91aW50OChyICsgY2ItPmN5YW5fcmVkLm1pZHRvbmVzICAgICAgICAqIG1pZHRvbmVzW3JdKTsKKyAgICAgICAgciA9IGF2X2NsaXBfdWludDgociArIGNiLT5jeWFuX3JlZC5oaWdobGlnaHRzICAgICAgKiBoaWdobGlnaHRzW3JdKTsKKworICAgICAgICBnID0gYXZfY2xpcF91aW50OChnICsgY2ItPm1hZ2VudGFfZ3JlZW4uc2hhZG93cyAgICAqIHNoYWRvd3NbZ10pOworICAgICAgICBnID0gYXZfY2xpcF91aW50OChnICsgY2ItPm1hZ2VudGFfZ3JlZW4ubWlkdG9uZXMgICAqIG1pZHRvbmVzW2ddKTsKKyAgICAgICAgZyA9IGF2X2NsaXBfdWludDgoZyArIGNiLT5tYWdlbnRhX2dyZWVuLmhpZ2hsaWdodHMgKiBoaWdobGlnaHRzW2ddKTsKKworICAgICAgICBiID0gYXZfY2xpcF91aW50OChiICsgY2ItPnllbGxvd19ibHVlLnNoYWRvd3MgICAgICAqIHNoYWRvd3NbYl0pOworICAgICAgICBiID0gYXZfY2xpcF91aW50OChiICsgY2ItPnllbGxvd19ibHVlLm1pZHRvbmVzICAgICAqIG1pZHRvbmVzW2JdKTsKKyAgICAgICAgYiA9IGF2X2NsaXBfdWludDgoYiArIGNiLT55ZWxsb3dfYmx1ZS5oaWdobGlnaHRzICAgKiBoaWdobGlnaHRzW2JdKTsKKworICAgICAgICBjYi0+bHV0W1JdW2ldID0gcjsKKyAgICAgICAgY2ItPmx1dFtHXVtpXSA9IGc7CisgICAgICAgIGNiLT5sdXRbQl1baV0gPSBiOworICAgIH0KKworICAgIGF2X2ZyZWUoYnVmZmVyKTsKKworICAgIGZmX2ZpbGxfcmdiYV9tYXAoY2ItPnJnYmFfbWFwLCBvdXRsaW5rLT5mb3JtYXQpOworICAgIGNiLT5zdGVwID0gYXZfZ2V0X3BhZGRlZF9iaXRzX3Blcl9waXhlbChkZXNjKSA+PiAzOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIENvbG9yQmFsYW5jZUNvbnRleHQgKmNiID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBjb25zdCB1aW50OF90IHJvZmZzZXQgPSBjYi0+cmdiYV9tYXBbUl07CisgICAgY29uc3QgdWludDhfdCBnb2Zmc2V0ID0gY2ItPnJnYmFfbWFwW0ddOworICAgIGNvbnN0IHVpbnQ4X3QgYm9mZnNldCA9IGNiLT5yZ2JhX21hcFtCXTsKKyAgICBjb25zdCB1aW50OF90IGFvZmZzZXQgPSBjYi0+cmdiYV9tYXBbQV07CisgICAgY29uc3QgaW50IHN0ZXAgPSBjYi0+c3RlcDsKKyAgICBjb25zdCB1aW50OF90ICpzcmNyb3cgPSBpbi0+ZGF0YVswXTsKKyAgICB1aW50OF90ICpkc3Ryb3c7CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludCBpLCBqOworCisgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgeworICAgICAgICBvdXQgPSBpbjsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0KKworICAgIGRzdHJvdyA9IG91dC0+ZGF0YVswXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3V0bGluay0+aDsgaSsrKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IHNyY3JvdzsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gZHN0cm93OworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRsaW5rLT53ICogc3RlcDsgaiArPSBzdGVwKSB7CisgICAgICAgICAgICBkc3RbaiArIHJvZmZzZXRdID0gY2ItPmx1dFtSXVtzcmNbaiArIHJvZmZzZXRdXTsKKyAgICAgICAgICAgIGRzdFtqICsgZ29mZnNldF0gPSBjYi0+bHV0W0ddW3NyY1tqICsgZ29mZnNldF1dOworICAgICAgICAgICAgZHN0W2ogKyBib2Zmc2V0XSA9IGNiLT5sdXRbQl1bc3JjW2ogKyBib2Zmc2V0XV07CisgICAgICAgICAgICBpZiAoaW4gIT0gb3V0ICYmIHN0ZXAgPT0gNCkKKyAgICAgICAgICAgICAgICBkc3RbaiArIGFvZmZzZXRdID0gc3JjW2ogKyBhb2Zmc2V0XTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY3JvdyArPSBpbi0+bGluZXNpemVbMF07CisgICAgICAgIGRzdHJvdyArPSBvdXQtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIGlmIChpbiAhPSBvdXQpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgb3V0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGNvbG9yYmFsYW5jZV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGNvbG9yYmFsYW5jZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9jb2xvcmJhbGFuY2UgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiY29sb3JiYWxhbmNlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBZGp1c3QgdGhlIGNvbG9yIGJhbGFuY2UuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQ29sb3JCYWxhbmNlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmY29sb3JiYWxhbmNlX2NsYXNzLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGNvbG9yYmFsYW5jZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBjb2xvcmJhbGFuY2Vfb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9jb2xvcmNoYW5uZWxtaXhlci5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2NvbG9yY2hhbm5lbG1peGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlNjNiNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9jb2xvcmNoYW5uZWxtaXhlci5jCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworI2RlZmluZSBSIDAKKyNkZWZpbmUgRyAxCisjZGVmaW5lIEIgMgorI2RlZmluZSBBIDMKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGRvdWJsZSByciwgcmcsIHJiLCByYTsKKyAgICBkb3VibGUgZ3IsIGdnLCBnYiwgZ2E7CisgICAgZG91YmxlIGJyLCBiZywgYmIsIGJhOworICAgIGRvdWJsZSBhciwgYWcsIGFiLCBhYTsKKworICAgIGludCAqbHV0WzRdWzRdOworCisgICAgaW50ICpidWZmZXI7CisKKyAgICB1aW50OF90IHJnYmFfbWFwWzRdOworfSBDb2xvckNoYW5uZWxNaXhlckNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENvbG9yQ2hhbm5lbE1peGVyQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gY29sb3JjaGFubmVsbWl4ZXJfb3B0aW9uc1tdID0geworICAgIHsgInJyIiwgInNldCB0aGUgcmVkIGdhaW4gZm9yIHRoZSByZWQgY2hhbm5lbCIsICAgICBPRkZTRVQocnIpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCAtMiwgMiwgRkxBR1MgfSwKKyAgICB7ICJyZyIsICJzZXQgdGhlIGdyZWVuIGdhaW4gZm9yIHRoZSByZWQgY2hhbm5lbCIsICAgT0ZGU0VUKHJnKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgLTIsIDIsIEZMQUdTIH0sCisgICAgeyAicmIiLCAic2V0IHRoZSBibHVlIGdhaW4gZm9yIHRoZSByZWQgY2hhbm5lbCIsICAgIE9GRlNFVChyYiksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0yLCAyLCBGTEFHUyB9LAorICAgIHsgInJhIiwgInNldCB0aGUgYWxwaGEgZ2FpbiBmb3IgdGhlIHJlZCBjaGFubmVsIiwgICBPRkZTRVQocmEpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTB9LCAtMiwgMiwgRkxBR1MgfSwKKyAgICB7ICJnciIsICJzZXQgdGhlIHJlZCBnYWluIGZvciB0aGUgZ3JlZW4gY2hhbm5lbCIsICAgT0ZGU0VUKGdyKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgLTIsIDIsIEZMQUdTIH0sCisgICAgeyAiZ2ciLCAic2V0IHRoZSBncmVlbiBnYWluIGZvciB0aGUgZ3JlZW4gY2hhbm5lbCIsIE9GRlNFVChnZyksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MX0sIC0yLCAyLCBGTEFHUyB9LAorICAgIHsgImdiIiwgInNldCB0aGUgYmx1ZSBnYWluIGZvciB0aGUgZ3JlZW4gY2hhbm5lbCIsICBPRkZTRVQoZ2IpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTB9LCAtMiwgMiwgRkxBR1MgfSwKKyAgICB7ICJnYSIsICJzZXQgdGhlIGFscGhhIGdhaW4gZm9yIHRoZSBncmVlbiBjaGFubmVsIiwgT0ZGU0VUKGdhKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgLTIsIDIsIEZMQUdTIH0sCisgICAgeyAiYnIiLCAic2V0IHRoZSByZWQgZ2FpbiBmb3IgdGhlIGJsdWUgY2hhbm5lbCIsICAgIE9GRlNFVChiciksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0yLCAyLCBGTEFHUyB9LAorICAgIHsgImJnIiwgInNldCB0aGUgZ3JlZW4gZ2FpbiBmb3IgdGhlIGJsdWUgY2hhbm5lbCIsICBPRkZTRVQoYmcpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTB9LCAtMiwgMiwgRkxBR1MgfSwKKyAgICB7ICJiYiIsICJzZXQgdGhlIGJsdWUgZ2FpbiBmb3IgdGhlIGJsdWUgY2hhbm5lbCIsICAgT0ZGU0VUKGJiKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgLTIsIDIsIEZMQUdTIH0sCisgICAgeyAiYmEiLCAic2V0IHRoZSBhbHBoYSBnYWluIGZvciB0aGUgYmx1ZSBjaGFubmVsIiwgIE9GRlNFVChiYSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0yLCAyLCBGTEFHUyB9LAorICAgIHsgImFyIiwgInNldCB0aGUgcmVkIGdhaW4gZm9yIHRoZSBhbHBoYSBjaGFubmVsIiwgICBPRkZTRVQoYXIpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTB9LCAtMiwgMiwgRkxBR1MgfSwKKyAgICB7ICJhZyIsICJzZXQgdGhlIGdyZWVuIGdhaW4gZm9yIHRoZSBhbHBoYSBjaGFubmVsIiwgT0ZGU0VUKGFnKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgLTIsIDIsIEZMQUdTIH0sCisgICAgeyAiYWIiLCAic2V0IHRoZSBibHVlIGdhaW4gZm9yIHRoZSBhbHBoYSBjaGFubmVsIiwgIE9GRlNFVChhYiksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0yLCAyLCBGTEFHUyB9LAorICAgIHsgImFhIiwgInNldCB0aGUgYWxwaGEgZ2FpbiBmb3IgdGhlIGFscGhhIGNoYW5uZWwiLCBPRkZTRVQoYWEpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCAtMiwgMiwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGNvbG9yY2hhbm5lbG1peGVyKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgIEFWX1BJWF9GTVRfQkdSMjQsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQSwgICBBVl9QSVhfRk1UX0JHUkEsCisgICAgICAgIEFWX1BJWF9GTVRfQVJHQiwgICBBVl9QSVhfRk1UX0FCR1IsCisgICAgICAgIEFWX1BJWF9GTVRfMFJHQiwgICBBVl9QSVhfRk1UXzBCR1IsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCMCwgICBBVl9QSVhfRk1UX0JHUjAsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCNDgsICBBVl9QSVhfRk1UX0JHUjQ4LAorICAgICAgICBBVl9QSVhfRk1UX1JHQkE2NCwgQVZfUElYX0ZNVF9CR1JBNjQsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQ29sb3JDaGFubmVsTWl4ZXJDb250ZXh0ICpjbSA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgaiwgc2l6ZSwgKmJ1ZmZlcjsKKworICAgIGZmX2ZpbGxfcmdiYV9tYXAoY20tPnJnYmFfbWFwLCBvdXRsaW5rLT5mb3JtYXQpOworCisgICAgc3dpdGNoIChvdXRsaW5rLT5mb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDg6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE2NDoKKyAgICAgICAgc2l6ZSA9IDY1NTM2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzaXplID0gMjU2OworICAgIH0KKworICAgIGNtLT5idWZmZXIgPSBidWZmZXIgPSBhdl9tYWxsb2MoMTYgKiBzaXplICogc2l6ZW9mKCpjbS0+YnVmZmVyKSk7CisgICAgaWYgKCFjbS0+YnVmZmVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKywgYnVmZmVyICs9IHNpemUpCisgICAgICAgICAgICBjbS0+bHV0W2ldW2pdID0gYnVmZmVyOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBjbS0+bHV0W1JdW1JdW2ldID0gcm91bmQoaSAqIGNtLT5ycik7CisgICAgICAgIGNtLT5sdXRbUl1bR11baV0gPSByb3VuZChpICogY20tPnJnKTsKKyAgICAgICAgY20tPmx1dFtSXVtCXVtpXSA9IHJvdW5kKGkgKiBjbS0+cmIpOworICAgICAgICBjbS0+bHV0W1JdW0FdW2ldID0gcm91bmQoaSAqIGNtLT5yYSk7CisKKyAgICAgICAgY20tPmx1dFtHXVtSXVtpXSA9IHJvdW5kKGkgKiBjbS0+Z3IpOworICAgICAgICBjbS0+bHV0W0ddW0ddW2ldID0gcm91bmQoaSAqIGNtLT5nZyk7CisgICAgICAgIGNtLT5sdXRbR11bQl1baV0gPSByb3VuZChpICogY20tPmdiKTsKKyAgICAgICAgY20tPmx1dFtHXVtBXVtpXSA9IHJvdW5kKGkgKiBjbS0+Z2EpOworCisgICAgICAgIGNtLT5sdXRbQl1bUl1baV0gPSByb3VuZChpICogY20tPmJyKTsKKyAgICAgICAgY20tPmx1dFtCXVtHXVtpXSA9IHJvdW5kKGkgKiBjbS0+YmcpOworICAgICAgICBjbS0+bHV0W0JdW0JdW2ldID0gcm91bmQoaSAqIGNtLT5iYik7CisgICAgICAgIGNtLT5sdXRbQl1bQV1baV0gPSByb3VuZChpICogY20tPmJhKTsKKworICAgICAgICBjbS0+bHV0W0FdW1JdW2ldID0gcm91bmQoaSAqIGNtLT5hcik7CisgICAgICAgIGNtLT5sdXRbQV1bR11baV0gPSByb3VuZChpICogY20tPmFnKTsKKyAgICAgICAgY20tPmx1dFtBXVtCXVtpXSA9IHJvdW5kKGkgKiBjbS0+YWIpOworICAgICAgICBjbS0+bHV0W0FdW0FdW2ldID0gcm91bmQoaSAqIGNtLT5hYSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIENvbG9yQ2hhbm5lbE1peGVyQ29udGV4dCAqY20gPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIGNvbnN0IHVpbnQ4X3Qgcm9mZnNldCA9IGNtLT5yZ2JhX21hcFtSXTsKKyAgICBjb25zdCB1aW50OF90IGdvZmZzZXQgPSBjbS0+cmdiYV9tYXBbR107CisgICAgY29uc3QgdWludDhfdCBib2Zmc2V0ID0gY20tPnJnYmFfbWFwW0JdOworICAgIGNvbnN0IHVpbnQ4X3QgYW9mZnNldCA9IGNtLT5yZ2JhX21hcFtBXTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNyb3cgPSBpbi0+ZGF0YVswXTsKKyAgICB1aW50OF90ICpkc3Ryb3c7CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludCBpLCBqOworCisgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgeworICAgICAgICBvdXQgPSBpbjsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0KKworICAgIGRzdHJvdyA9IG91dC0+ZGF0YVswXTsKKyAgICBzd2l0Y2ggKG91dGxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IyNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRsaW5rLT5oOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IHNyY3JvdzsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGRzdHJvdzsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dGxpbmstPncgKiAzOyBqICs9IDMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHJpbiA9IHNyY1tqICsgcm9mZnNldF07CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBnaW4gPSBzcmNbaiArIGdvZmZzZXRdOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYmluID0gc3JjW2ogKyBib2Zmc2V0XTsKKworICAgICAgICAgICAgICAgIGRzdFtqICsgcm9mZnNldF0gPSBhdl9jbGlwX3VpbnQ4KGNtLT5sdXRbUl1bUl1bcmluXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtSXVtHXVtnaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W1JdW0JdW2Jpbl0pOworICAgICAgICAgICAgICAgIGRzdFtqICsgZ29mZnNldF0gPSBhdl9jbGlwX3VpbnQ4KGNtLT5sdXRbR11bUl1bcmluXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtHXVtHXVtnaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0ddW0JdW2Jpbl0pOworICAgICAgICAgICAgICAgIGRzdFtqICsgYm9mZnNldF0gPSBhdl9jbGlwX3VpbnQ4KGNtLT5sdXRbQl1bUl1bcmluXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtCXVtHXVtnaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0JdW0JdW2Jpbl0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcmNyb3cgKz0gaW4tPmxpbmVzaXplWzBdOworICAgICAgICAgICAgZHN0cm93ICs9IG91dC0+bGluZXNpemVbMF07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UXzBCR1I6CisgICAgY2FzZSBBVl9QSVhfRk1UXzBSR0I6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjA6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRsaW5rLT5oOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IHNyY3JvdzsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGRzdHJvdzsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dGxpbmstPncgKiA0OyBqICs9IDQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHJpbiA9IHNyY1tqICsgcm9mZnNldF07CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBnaW4gPSBzcmNbaiArIGdvZmZzZXRdOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYmluID0gc3JjW2ogKyBib2Zmc2V0XTsKKworICAgICAgICAgICAgICAgIGRzdFtqICsgcm9mZnNldF0gPSBhdl9jbGlwX3VpbnQ4KGNtLT5sdXRbUl1bUl1bcmluXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtSXVtHXVtnaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W1JdW0JdW2Jpbl0pOworICAgICAgICAgICAgICAgIGRzdFtqICsgZ29mZnNldF0gPSBhdl9jbGlwX3VpbnQ4KGNtLT5sdXRbR11bUl1bcmluXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtHXVtHXVtnaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0ddW0JdW2Jpbl0pOworICAgICAgICAgICAgICAgIGRzdFtqICsgYm9mZnNldF0gPSBhdl9jbGlwX3VpbnQ4KGNtLT5sdXRbQl1bUl1bcmluXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtCXVtHXVtnaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0JdW0JdW2Jpbl0pOworICAgICAgICAgICAgICAgIGlmIChpbiAhPSBvdXQpCisgICAgICAgICAgICAgICAgICAgIGRzdFtqICsgYW9mZnNldF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcmNyb3cgKz0gaW4tPmxpbmVzaXplWzBdOworICAgICAgICAgICAgZHN0cm93ICs9IG91dC0+bGluZXNpemVbMF07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0FCR1I6CisgICAgY2FzZSBBVl9QSVhfRk1UX0FSR0I6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRsaW5rLT5oOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IHNyY3JvdzsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGRzdHJvdzsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dGxpbmstPncgKiA0OyBqICs9IDQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHJpbiA9IHNyY1tqICsgcm9mZnNldF07CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBnaW4gPSBzcmNbaiArIGdvZmZzZXRdOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYmluID0gc3JjW2ogKyBib2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGFpbiA9IHNyY1tqICsgYW9mZnNldF07CisKKyAgICAgICAgICAgICAgICBkc3RbaiArIHJvZmZzZXRdID0gYXZfY2xpcF91aW50OChjbS0+bHV0W1JdW1JdW3Jpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5sdXRbUl1bR11bZ2luXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtSXVtCXVtiaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W1JdW0FdW2Fpbl0pOworICAgICAgICAgICAgICAgIGRzdFtqICsgZ29mZnNldF0gPSBhdl9jbGlwX3VpbnQ4KGNtLT5sdXRbR11bUl1bcmluXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtHXVtHXVtnaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0ddW0JdW2Jpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5sdXRbR11bQV1bYWluXSk7CisgICAgICAgICAgICAgICAgZHN0W2ogKyBib2Zmc2V0XSA9IGF2X2NsaXBfdWludDgoY20tPmx1dFtCXVtSXVtyaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0JdW0ddW2dpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5sdXRbQl1bQl1bYmluXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtCXVtBXVthaW5dKTsKKyAgICAgICAgICAgICAgICBkc3RbaiArIGFvZmZzZXRdID0gYXZfY2xpcF91aW50OChjbS0+bHV0W0FdW1JdW3Jpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5sdXRbQV1bR11bZ2luXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtBXVtCXVtiaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0FdW0FdW2Fpbl0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcmNyb3cgKz0gaW4tPmxpbmVzaXplWzBdOworICAgICAgICAgICAgZHN0cm93ICs9IG91dC0+bGluZXNpemVbMF07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0ODoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dGxpbmstPmg7IGkrKykgeworICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyYyA9IChjb25zdCB1aW50MTZfdCAqKXNyY3JvdzsKKyAgICAgICAgICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKilkc3Ryb3c7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRsaW5rLT53ICogMzsgaiArPSAzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgcmluID0gc3JjW2ogKyByb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBnaW4gPSBzcmNbaiArIGdvZmZzZXRdOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90IGJpbiA9IHNyY1tqICsgYm9mZnNldF07CisKKyAgICAgICAgICAgICAgICBkc3RbaiArIHJvZmZzZXRdID0gYXZfY2xpcF91aW50MTYoY20tPmx1dFtSXVtSXVtyaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtSXVtHXVtnaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtSXVtCXVtiaW5dKTsKKyAgICAgICAgICAgICAgICBkc3RbaiArIGdvZmZzZXRdID0gYXZfY2xpcF91aW50MTYoY20tPmx1dFtHXVtSXVtyaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtHXVtHXVtnaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtHXVtCXVtiaW5dKTsKKyAgICAgICAgICAgICAgICBkc3RbaiArIGJvZmZzZXRdID0gYXZfY2xpcF91aW50MTYoY20tPmx1dFtCXVtSXVtyaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtCXVtHXVtnaW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmx1dFtCXVtCXVtiaW5dKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3Jjcm93ICs9IGluLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIGRzdHJvdyArPSBvdXQtPmxpbmVzaXplWzBdOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBNjQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dGxpbmstPmg7IGkrKykgeworICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyYyA9IChjb25zdCB1aW50MTZfdCAqKXNyY3JvdzsKKyAgICAgICAgICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKilkc3Ryb3c7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRsaW5rLT53ICogNDsgaiArPSA0KSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgcmluID0gc3JjW2ogKyByb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBnaW4gPSBzcmNbaiArIGdvZmZzZXRdOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90IGJpbiA9IHNyY1tqICsgYm9mZnNldF07CisgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgYWluID0gc3JjW2ogKyBhb2Zmc2V0XTsKKworICAgICAgICAgICAgICAgIGRzdFtqICsgcm9mZnNldF0gPSBhdl9jbGlwX3VpbnQxNihjbS0+bHV0W1JdW1JdW3Jpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W1JdW0ddW2dpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W1JdW0JdW2Jpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W1JdW0FdW2Fpbl0pOworICAgICAgICAgICAgICAgIGRzdFtqICsgZ29mZnNldF0gPSBhdl9jbGlwX3VpbnQxNihjbS0+bHV0W0ddW1JdW3Jpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0ddW0ddW2dpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0ddW0JdW2Jpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0ddW0FdW2Fpbl0pOworICAgICAgICAgICAgICAgIGRzdFtqICsgYm9mZnNldF0gPSBhdl9jbGlwX3VpbnQxNihjbS0+bHV0W0JdW1JdW3Jpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0JdW0ddW2dpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0JdW0JdW2Jpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0JdW0FdW2Fpbl0pOworICAgICAgICAgICAgICAgIGRzdFtqICsgYW9mZnNldF0gPSBhdl9jbGlwX3VpbnQxNihjbS0+bHV0W0FdW1JdW3Jpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0FdW0ddW2dpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0FdW0JdW2Jpbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bHV0W0FdW0FdW2Fpbl0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcmNyb3cgKz0gaW4tPmxpbmVzaXplWzBdOworICAgICAgICAgICAgZHN0cm93ICs9IG91dC0+bGluZXNpemVbMF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW4gIT0gb3V0KQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG91dCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIENvbG9yQ2hhbm5lbE1peGVyQ29udGV4dCAqY20gPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmVlcCgmY20tPmJ1ZmZlcik7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBjb2xvcmNoYW5uZWxtaXhlcl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGNvbG9yY2hhbm5lbG1peGVyX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2NvbG9yY2hhbm5lbG1peGVyID0geworICAgIC5uYW1lICAgICAgICAgID0gImNvbG9yY2hhbm5lbG1peGVyIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBZGp1c3QgY29sb3JzIGJ5IG1peGluZyBjb2xvciBjaGFubmVscy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihDb2xvckNoYW5uZWxNaXhlckNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmNvbG9yY2hhbm5lbG1peGVyX2NsYXNzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGNvbG9yY2hhbm5lbG1peGVyX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGNvbG9yY2hhbm5lbG1peGVyX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfY29sb3JtYXRyaXguYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9jb2xvcm1hdHJpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzgzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfY29sb3JtYXRyaXguYwpAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqIENvbG9yTWF0cml4IHYyLjIgZm9yIEF2aXN5bnRoIDIuNS54CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgS2V2aW4gU3RvbmUKKyAqCisgKiBDb2xvck1hdHJpeCAxLnggaXMgQ29weXJpZ2h0IChDKSBXaWxiZXJ0IERpamtob2YKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDb2xvck1hdHJpeCAyLjAgaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIENvbG9yTWF0cml4IGZpbHRlciBieSBXaWxiZXJ0CisgKiBEaWpraG9mLiAgSXQgYWRkcyB0aGUgYWJpbGl0eSB0byBjb252ZXJ0IGJldHdlZW4gYW55IG9mOiBSZWMuNzA5LCBGQ0MsCisgKiBSZWMuNjAxLCBhbmQgU01QVEUgMjQwTS4gSXQgYWxzbyBtYWtlcyBwcmUgYW5kIHBvc3QgY2xpcHBpbmcgb3B0aW9uYWwsCisgKiBhZGRzIGFuIG9wdGlvbiB0byB1c2Ugc2NhbGVkIG9yIG5vbi1zY2FsZWQgY29lZmZpY2llbnRzLCBhbmQgbW9yZS4uLgorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKworI2RlZmluZSBOUyhuKSAoKG4pIDwgMCA/IChpbnQpKChuKSo2NTUzNi4wLTAuNStEQkxfRVBTSUxPTikgOiAoaW50KSgobikqNjU1MzYuMCswLjUpKQorI2RlZmluZSBDQihuKSBhdl9jbGlwX3VpbnQ4KG4pCisKK3N0YXRpYyBjb25zdCBkb3VibGUgeXV2X2NvZWZmWzRdWzNdWzNdID0geworICAgIHsgeyArMC43MTUyLCArMC4wNzIyLCArMC4yMTI2IH0sIC8vIFJlYy43MDkgKDApCisgICAgICB7IC0wLjM4NTAsICswLjUwMDAsIC0wLjExNTAgfSwKKyAgICAgIHsgLTAuNDU0MCwgLTAuMDQ2MCwgKzAuNTAwMCB9IH0sCisgICAgeyB7ICswLjU5MDAsICswLjExMDAsICswLjMwMDAgfSwgLy8gRkNDICgxKQorICAgICAgeyAtMC4zMzEwLCArMC41MDAwLCAtMC4xNjkwIH0sCisgICAgICB7IC0wLjQyMTAsIC0wLjA3OTAsICswLjUwMDAgfSB9LAorICAgIHsgeyArMC41ODcwLCArMC4xMTQwLCArMC4yOTkwIH0sIC8vIFJlYy42MDEgKElUVS1SIEJULjQ3MC0yL1NNUFRFIDE3ME0pICgyKQorICAgICAgeyAtMC4zMzEzLCArMC41MDAwLCAtMC4xNjg3IH0sCisgICAgICB7IC0wLjQxODcsIC0wLjA4MTMsICswLjUwMDAgfSB9LAorICAgIHsgeyArMC43MDEwLCArMC4wODcwLCArMC4yMTIwIH0sIC8vIFNNUFRFIDI0ME0gKDMpCisgICAgICB7IC0wLjM4NDAsICswLjUwMDAsIC0wLjExNjAgfSwKKyAgICAgIHsgLTAuNDQ1MCwgLTAuMDU1MCwgKzAuNTAwMCB9IH0sCit9OworCitlbnVtIENvbG9yTW9kZSB7CisgICAgQ09MT1JfTU9ERV9OT05FID0gLTEsCisgICAgQ09MT1JfTU9ERV9CVDcwOSwKKyAgICBDT0xPUl9NT0RFX0ZDQywKKyAgICBDT0xPUl9NT0RFX0JUNjAxLAorICAgIENPTE9SX01PREVfU01QVEUyNDBNLAorICAgIENPTE9SX01PREVfQ09VTlQKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgeXV2X2NvbnZlcnRbMTZdWzNdWzNdOworICAgIGludCBpbnRlcmxhY2VkOworICAgIGVudW0gQ29sb3JNb2RlIHNvdXJjZSwgZGVzdDsKKyAgICBpbnQgbW9kZTsKKyAgICBpbnQgaHN1YiwgdnN1YjsKK30gQ29sb3JNYXRyaXhDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDb2xvck1hdHJpeENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gY29sb3JtYXRyaXhfb3B0aW9uc1tdID0geworICAgIHsgInNyYyIsICJzZXQgc291cmNlIGNvbG9yIG1hdHJpeCIsICAgICAgT0ZGU0VUKHNvdXJjZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Q09MT1JfTU9ERV9OT05FfSwgQ09MT1JfTU9ERV9OT05FLCBDT0xPUl9NT0RFX0NPVU5ULTEsIC5mbGFncz1GTEFHUywgLnVuaXQ9ImNvbG9yX21vZGUiIH0sCisgICAgeyAiZHN0IiwgInNldCBkZXN0aW5hdGlvbiBjb2xvciBtYXRyaXgiLCBPRkZTRVQoZGVzdCksICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1DT0xPUl9NT0RFX05PTkV9LCBDT0xPUl9NT0RFX05PTkUsIENPTE9SX01PREVfQ09VTlQtMSwgLmZsYWdzPUZMQUdTLCAudW5pdD0iY29sb3JfbW9kZSIgfSwKKyAgICB7ICJidDcwOSIsICAgICAic2V0IEJULjcwOSBjb2xvcnNwYWNlIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q09MT1JfTU9ERV9CVDcwOX0sICAgICAgIC5mbGFncz1GTEFHUywgLnVuaXQ9ImNvbG9yX21vZGUiIH0sCisgICAgeyAiZmNjIiwgICAgICAgInNldCBGQ0MgY29sb3JzcGFjZSAgICIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNPTE9SX01PREVfRkNDfSwgICAgICAgICAuZmxhZ3M9RkxBR1MsIC51bml0PSJjb2xvcl9tb2RlIiB9LAorICAgIHsgImJ0NjAxIiwgICAgICJzZXQgQlQuNjAxIGNvbG9yc3BhY2UiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1DT0xPUl9NT0RFX0JUNjAxfSwgICAgICAgLmZsYWdzPUZMQUdTLCAudW5pdD0iY29sb3JfbW9kZSIgfSwKKyAgICB7ICJzbXB0ZTI0MG0iLCAic2V0IFNNUFRFLTI0ME0gY29sb3JzcGFjZSIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q09MT1JfTU9ERV9TTVBURTI0ME19LCAgIC5mbGFncz1GTEFHUywgLnVuaXQ9ImNvbG9yX21vZGUiIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhjb2xvcm1hdHJpeCk7CisKKyNkZWZpbmUgbWEgbVswXVswXQorI2RlZmluZSBtYiBtWzBdWzFdCisjZGVmaW5lIG1jIG1bMF1bMl0KKyNkZWZpbmUgbWQgbVsxXVswXQorI2RlZmluZSBtZSBtWzFdWzFdCisjZGVmaW5lIG1mIG1bMV1bMl0KKyNkZWZpbmUgbWcgbVsyXVswXQorI2RlZmluZSBtaCBtWzJdWzFdCisjZGVmaW5lIG1pIG1bMl1bMl0KKworI2RlZmluZSBpbWEgaW1bMF1bMF0KKyNkZWZpbmUgaW1iIGltWzBdWzFdCisjZGVmaW5lIGltYyBpbVswXVsyXQorI2RlZmluZSBpbWQgaW1bMV1bMF0KKyNkZWZpbmUgaW1lIGltWzFdWzFdCisjZGVmaW5lIGltZiBpbVsxXVsyXQorI2RlZmluZSBpbWcgaW1bMl1bMF0KKyNkZWZpbmUgaW1oIGltWzJdWzFdCisjZGVmaW5lIGltaSBpbVsyXVsyXQorCitzdGF0aWMgdm9pZCBpbnZlcnNlM3gzKGRvdWJsZSBpbVszXVszXSwgY29uc3QgZG91YmxlIG1bM11bM10pCit7CisgICAgZG91YmxlIGRldCA9IG1hICogKG1lICogbWkgLSBtZiAqIG1oKSAtIG1iICogKG1kICogbWkgLSBtZiAqIG1nKSArIG1jICogKG1kICogbWggLSBtZSAqIG1nKTsKKyAgICBkZXQgPSAxLjAgLyBkZXQ7CisgICAgaW1hID0gZGV0ICogKG1lICogbWkgLSBtZiAqIG1oKTsKKyAgICBpbWIgPSBkZXQgKiAobWMgKiBtaCAtIG1iICogbWkpOworICAgIGltYyA9IGRldCAqIChtYiAqIG1mIC0gbWMgKiBtZSk7CisgICAgaW1kID0gZGV0ICogKG1mICogbWcgLSBtZCAqIG1pKTsKKyAgICBpbWUgPSBkZXQgKiAobWEgKiBtaSAtIG1jICogbWcpOworICAgIGltZiA9IGRldCAqIChtYyAqIG1kIC0gbWEgKiBtZik7CisgICAgaW1nID0gZGV0ICogKG1kICogbWggLSBtZSAqIG1nKTsKKyAgICBpbWggPSBkZXQgKiAobWIgKiBtZyAtIG1hICogbWgpOworICAgIGltaSA9IGRldCAqIChtYSAqIG1lIC0gbWIgKiBtZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNvbHZlX2NvZWZmaWNpZW50cyhkb3VibGUgY21bM11bM10sIGRvdWJsZSByZ2JbM11bM10sIGNvbnN0IGRvdWJsZSB5dXZbM11bM10pCit7CisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKKyAgICAgICAgICAgIGNtW2ldW2pdID0geXV2W2ldWzBdICogcmdiWzBdW2pdICsgeXV2W2ldWzFdICogcmdiWzFdW2pdICsgeXV2W2ldWzJdICogcmdiWzJdW2pdOworfQorCitzdGF0aWMgdm9pZCBjYWxjX2NvZWZmaWNpZW50cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDb2xvck1hdHJpeENvbnRleHQgKmNvbG9yID0gY3R4LT5wcml2OworICAgIGRvdWJsZSByZ2JfY29lZmZkWzRdWzNdWzNdOworICAgIGRvdWJsZSB5dXZfY29udmVydGRbMTZdWzNdWzNdOworICAgIGludCB2ID0gMDsKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGludmVyc2UzeDMocmdiX2NvZWZmZFtpXSwgeXV2X2NvZWZmW2ldKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgIHNvbHZlX2NvZWZmaWNpZW50cyh5dXZfY29udmVydGRbdl0sIHJnYl9jb2VmZmRbaV0sIHl1dl9jb2VmZltqXSk7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKSB7CisgICAgICAgICAgICAgICAgY29sb3ItPnl1dl9jb252ZXJ0W3ZdW2tdWzBdID0gTlMoeXV2X2NvbnZlcnRkW3ZdW2tdWzBdKTsKKyAgICAgICAgICAgICAgICBjb2xvci0+eXV2X2NvbnZlcnRbdl1ba11bMV0gPSBOUyh5dXZfY29udmVydGRbdl1ba11bMV0pOworICAgICAgICAgICAgICAgIGNvbG9yLT55dXZfY29udmVydFt2XVtrXVsyXSA9IE5TKHl1dl9jb252ZXJ0ZFt2XVtrXVsyXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29sb3ItPnl1dl9jb252ZXJ0W3ZdWzBdWzBdICE9IDY1NTM2IHx8IGNvbG9yLT55dXZfY29udmVydFt2XVsxXVswXSAhPSAwIHx8CisgICAgICAgICAgICAgICAgY29sb3ItPnl1dl9jb252ZXJ0W3ZdWzJdWzBdICE9IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBjYWxjdWxhdGluZyBjb252ZXJzaW9uIGNvZWZmaWNpZW50c1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY29sb3JfbW9kZXNbXSA9IHsiYnQ3MDkiLCAiZmNjIiwgImJ0NjAxIiwgInNtcHRlMjQwbSJ9OworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDb2xvck1hdHJpeENvbnRleHQgKmNvbG9yID0gY3R4LT5wcml2OworCisgICAgaWYgKGNvbG9yLT5kZXN0ID09IENPTE9SX01PREVfTk9ORSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnNwZWNpZmllZCBkZXN0aW5hdGlvbiBjb2xvciBzcGFjZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGNvbG9yLT5zb3VyY2UgPT0gY29sb3ItPmRlc3QpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiU291cmNlIGFuZCBkZXN0aW5hdGlvbiBjb2xvciBzcGFjZSBtdXN0IG5vdCBiZSBpZGVudGljYWxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2ZyYW1lX3V5dnk0MjIoQ29sb3JNYXRyaXhDb250ZXh0ICpjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsIEFWRnJhbWUgKnNyYykKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNwID0gc3JjLT5kYXRhWzBdOworICAgIGNvbnN0IGludCBzcmNfcGl0Y2ggPSBzcmMtPmxpbmVzaXplWzBdOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBzcmMtPmhlaWdodDsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBzcmMtPndpZHRoKjI7CisgICAgdW5zaWduZWQgY2hhciAqZHN0cCA9IGRzdC0+ZGF0YVswXTsKKyAgICBjb25zdCBpbnQgZHN0X3BpdGNoID0gZHN0LT5saW5lc2l6ZVswXTsKKyAgICBjb25zdCBpbnQgYzIgPSBjb2xvci0+eXV2X2NvbnZlcnRbY29sb3ItPm1vZGVdWzBdWzFdOworICAgIGNvbnN0IGludCBjMyA9IGNvbG9yLT55dXZfY29udmVydFtjb2xvci0+bW9kZV1bMF1bMl07CisgICAgY29uc3QgaW50IGM0ID0gY29sb3ItPnl1dl9jb252ZXJ0W2NvbG9yLT5tb2RlXVsxXVsxXTsKKyAgICBjb25zdCBpbnQgYzUgPSBjb2xvci0+eXV2X2NvbnZlcnRbY29sb3ItPm1vZGVdWzFdWzJdOworICAgIGNvbnN0IGludCBjNiA9IGNvbG9yLT55dXZfY29udmVydFtjb2xvci0+bW9kZV1bMl1bMV07CisgICAgY29uc3QgaW50IGM3ID0gY29sb3ItPnl1dl9jb252ZXJ0W2NvbG9yLT5tb2RlXVsyXVsyXTsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gNCkgeworICAgICAgICAgICAgY29uc3QgaW50IHUgPSBzcmNwW3ggKyAwXSAtIDEyODsKKyAgICAgICAgICAgIGNvbnN0IGludCB2ID0gc3JjcFt4ICsgMl0gLSAxMjg7CisgICAgICAgICAgICBjb25zdCBpbnQgdXZ2YWwgPSBjMiAqIHUgKyBjMyAqIHYgKyAxMDgxMzQ0OworICAgICAgICAgICAgZHN0cFt4ICsgMF0gPSBDQigoYzQgKiB1ICsgYzUgKiB2ICsgODQyMTM3NikgPj4gMTYpOworICAgICAgICAgICAgZHN0cFt4ICsgMV0gPSBDQigoNjU1MzYgKiAoc3JjcFt4ICsgMV0gLSAxNikgKyB1dnZhbCkgPj4gMTYpOworICAgICAgICAgICAgZHN0cFt4ICsgMl0gPSBDQigoYzYgKiB1ICsgYzcgKiB2ICsgODQyMTM3NikgPj4gMTYpOworICAgICAgICAgICAgZHN0cFt4ICsgM10gPSBDQigoNjU1MzYgKiAoc3JjcFt4ICsgM10gLSAxNikgKyB1dnZhbCkgPj4gMTYpOworICAgICAgICB9CisgICAgICAgIHNyY3AgKz0gc3JjX3BpdGNoOworICAgICAgICBkc3RwICs9IGRzdF9waXRjaDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZnJhbWVfeXV2NDIycChDb2xvck1hdHJpeENvbnRleHQgKmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmRzdCwgQVZGcmFtZSAqc3JjKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY3BVID0gc3JjLT5kYXRhWzFdOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY3BWID0gc3JjLT5kYXRhWzJdOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY3BZID0gc3JjLT5kYXRhWzBdOworICAgIGNvbnN0IGludCBzcmNfcGl0Y2hZICA9IHNyYy0+bGluZXNpemVbMF07CisgICAgY29uc3QgaW50IHNyY19waXRjaFVWID0gc3JjLT5saW5lc2l6ZVsxXTsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgY29uc3QgaW50IHdpZHRoID0gc3JjLT53aWR0aDsKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RwVSA9IGRzdC0+ZGF0YVsxXTsKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RwViA9IGRzdC0+ZGF0YVsyXTsKKyAgICB1bnNpZ25lZCBjaGFyICpkc3RwWSA9IGRzdC0+ZGF0YVswXTsKKyAgICBjb25zdCBpbnQgZHN0X3BpdGNoWSAgPSBkc3QtPmxpbmVzaXplWzBdOworICAgIGNvbnN0IGludCBkc3RfcGl0Y2hVViA9IGRzdC0+bGluZXNpemVbMV07CisgICAgY29uc3QgaW50IGMyID0gY29sb3ItPnl1dl9jb252ZXJ0W2NvbG9yLT5tb2RlXVswXVsxXTsKKyAgICBjb25zdCBpbnQgYzMgPSBjb2xvci0+eXV2X2NvbnZlcnRbY29sb3ItPm1vZGVdWzBdWzJdOworICAgIGNvbnN0IGludCBjNCA9IGNvbG9yLT55dXZfY29udmVydFtjb2xvci0+bW9kZV1bMV1bMV07CisgICAgY29uc3QgaW50IGM1ID0gY29sb3ItPnl1dl9jb252ZXJ0W2NvbG9yLT5tb2RlXVsxXVsyXTsKKyAgICBjb25zdCBpbnQgYzYgPSBjb2xvci0+eXV2X2NvbnZlcnRbY29sb3ItPm1vZGVdWzJdWzFdOworICAgIGNvbnN0IGludCBjNyA9IGNvbG9yLT55dXZfY29udmVydFtjb2xvci0+bW9kZV1bMl1bMl07CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB1ID0gc3JjcFVbeCA+PiAxXSAtIDEyODsKKyAgICAgICAgICAgIGNvbnN0IGludCB2ID0gc3JjcFZbeCA+PiAxXSAtIDEyODsKKyAgICAgICAgICAgIGNvbnN0IGludCB1dnZhbCA9IGMyICogdSArIGMzICogdiArIDEwODEzNDQ7CisgICAgICAgICAgICBkc3RwWVt4ICsgMF0gPSBDQigoNjU1MzYgKiAoc3JjcFlbeCArIDBdIC0gMTYpICsgdXZ2YWwpID4+IDE2KTsKKyAgICAgICAgICAgIGRzdHBZW3ggKyAxXSA9IENCKCg2NTUzNiAqIChzcmNwWVt4ICsgMV0gLSAxNikgKyB1dnZhbCkgPj4gMTYpOworICAgICAgICAgICAgZHN0cFVbeCA+PiAxXSA9IENCKChjNCAqIHUgKyBjNSAqIHYgKyA4NDIxMzc2KSA+PiAxNik7CisgICAgICAgICAgICBkc3RwVlt4ID4+IDFdID0gQ0IoKGM2ICogdSArIGM3ICogdiArIDg0MjEzNzYpID4+IDE2KTsKKyAgICAgICAgfQorICAgICAgICBzcmNwWSArPSBzcmNfcGl0Y2hZOworICAgICAgICBkc3RwWSArPSBkc3RfcGl0Y2hZOworICAgICAgICBzcmNwVSArPSBzcmNfcGl0Y2hVVjsKKyAgICAgICAgc3JjcFYgKz0gc3JjX3BpdGNoVVY7CisgICAgICAgIGRzdHBVICs9IGRzdF9waXRjaFVWOworICAgICAgICBkc3RwViArPSBkc3RfcGl0Y2hVVjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZnJhbWVfeXV2NDIwcChDb2xvck1hdHJpeENvbnRleHQgKmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmRzdCwgQVZGcmFtZSAqc3JjKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY3BVID0gc3JjLT5kYXRhWzFdOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY3BWID0gc3JjLT5kYXRhWzJdOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY3BZID0gc3JjLT5kYXRhWzBdOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY3BOID0gc3JjLT5kYXRhWzBdICsgc3JjLT5saW5lc2l6ZVswXTsKKyAgICBjb25zdCBpbnQgc3JjX3BpdGNoWSAgPSBzcmMtPmxpbmVzaXplWzBdOworICAgIGNvbnN0IGludCBzcmNfcGl0Y2hVViA9IHNyYy0+bGluZXNpemVbMV07CisgICAgY29uc3QgaW50IGhlaWdodCA9IHNyYy0+aGVpZ2h0OworICAgIGNvbnN0IGludCB3aWR0aCA9IHNyYy0+d2lkdGg7CisgICAgdW5zaWduZWQgY2hhciAqZHN0cFUgPSBkc3QtPmRhdGFbMV07CisgICAgdW5zaWduZWQgY2hhciAqZHN0cFYgPSBkc3QtPmRhdGFbMl07CisgICAgdW5zaWduZWQgY2hhciAqZHN0cFkgPSBkc3QtPmRhdGFbMF07CisgICAgdW5zaWduZWQgY2hhciAqZHN0cE4gPSBkc3QtPmRhdGFbMF0gKyBkc3QtPmxpbmVzaXplWzBdOworICAgIGNvbnN0IGludCBkc3RfcGl0Y2hZICA9IGRzdC0+bGluZXNpemVbMF07CisgICAgY29uc3QgaW50IGRzdF9waXRjaFVWID0gZHN0LT5saW5lc2l6ZVsxXTsKKyAgICBjb25zdCBpbnQgYzIgPSBjb2xvci0+eXV2X2NvbnZlcnRbY29sb3ItPm1vZGVdWzBdWzFdOworICAgIGNvbnN0IGludCBjMyA9IGNvbG9yLT55dXZfY29udmVydFtjb2xvci0+bW9kZV1bMF1bMl07CisgICAgY29uc3QgaW50IGM0ID0gY29sb3ItPnl1dl9jb252ZXJ0W2NvbG9yLT5tb2RlXVsxXVsxXTsKKyAgICBjb25zdCBpbnQgYzUgPSBjb2xvci0+eXV2X2NvbnZlcnRbY29sb3ItPm1vZGVdWzFdWzJdOworICAgIGNvbnN0IGludCBjNiA9IGNvbG9yLT55dXZfY29udmVydFtjb2xvci0+bW9kZV1bMl1bMV07CisgICAgY29uc3QgaW50IGM3ID0gY29sb3ItPnl1dl9jb252ZXJ0W2NvbG9yLT5tb2RlXVsyXVsyXTsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgY29uc3QgaW50IHUgPSBzcmNwVVt4ID4+IDFdIC0gMTI4OworICAgICAgICAgICAgY29uc3QgaW50IHYgPSBzcmNwVlt4ID4+IDFdIC0gMTI4OworICAgICAgICAgICAgY29uc3QgaW50IHV2dmFsID0gYzIgKiB1ICsgYzMgKiB2ICsgMTA4MTM0NDsKKyAgICAgICAgICAgIGRzdHBZW3ggKyAwXSA9IENCKCg2NTUzNiAqIChzcmNwWVt4ICsgMF0gLSAxNikgKyB1dnZhbCkgPj4gMTYpOworICAgICAgICAgICAgZHN0cFlbeCArIDFdID0gQ0IoKDY1NTM2ICogKHNyY3BZW3ggKyAxXSAtIDE2KSArIHV2dmFsKSA+PiAxNik7CisgICAgICAgICAgICBkc3RwTlt4ICsgMF0gPSBDQigoNjU1MzYgKiAoc3JjcE5beCArIDBdIC0gMTYpICsgdXZ2YWwpID4+IDE2KTsKKyAgICAgICAgICAgIGRzdHBOW3ggKyAxXSA9IENCKCg2NTUzNiAqIChzcmNwTlt4ICsgMV0gLSAxNikgKyB1dnZhbCkgPj4gMTYpOworICAgICAgICAgICAgZHN0cFVbeCA+PiAxXSA9IENCKChjNCAqIHUgKyBjNSAqIHYgKyA4NDIxMzc2KSA+PiAxNik7CisgICAgICAgICAgICBkc3RwVlt4ID4+IDFdID0gQ0IoKGM2ICogdSArIGM3ICogdiArIDg0MjEzNzYpID4+IDE2KTsKKyAgICAgICAgfQorICAgICAgICBzcmNwWSArPSBzcmNfcGl0Y2hZIDw8IDE7CisgICAgICAgIGRzdHBZICs9IGRzdF9waXRjaFkgPDwgMTsKKyAgICAgICAgc3JjcE4gKz0gc3JjX3BpdGNoWSA8PCAxOworICAgICAgICBkc3RwTiArPSBkc3RfcGl0Y2hZIDw8IDE7CisgICAgICAgIHNyY3BVICs9IHNyY19waXRjaFVWOworICAgICAgICBzcmNwViArPSBzcmNfcGl0Y2hVVjsKKyAgICAgICAgZHN0cFUgKz0gZHN0X3BpdGNoVVY7CisgICAgICAgIGRzdHBWICs9IGRzdF9waXRjaFVWOworICAgIH0KK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBDb2xvck1hdHJpeENvbnRleHQgKmNvbG9yID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKworICAgIGNvbG9yLT5oc3ViID0gcGl4X2Rlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgY29sb3ItPnZzdWIgPSBwaXhfZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiJXMgLT4gJXNcbiIsCisgICAgICAgICAgIGNvbG9yX21vZGVzW2NvbG9yLT5zb3VyY2VdLCBjb2xvcl9tb2Rlc1tjb2xvci0+ZGVzdF0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1VZVlk0MjIsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGxpbmstPmRzdDsKKyAgICBDb2xvck1hdHJpeENvbnRleHQgKmNvbG9yID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQ7CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKworICAgIGlmIChjb2xvci0+c291cmNlID09IENPTE9SX01PREVfTk9ORSkgeworICAgICAgICBlbnVtIEFWQ29sb3JTcGFjZSBjcyA9IGF2X2ZyYW1lX2dldF9jb2xvcnNwYWNlKGluKTsKKyAgICAgICAgZW51bSBDb2xvck1vZGUgc291cmNlOworCisgICAgICAgIHN3aXRjaChjcykgeworICAgICAgICBjYXNlIEFWQ09MX1NQQ19CVDcwOSAgICAgOiBzb3VyY2UgPSBDT0xPUl9NT0RFX0JUNzA5ICAgICA7IGJyZWFrOworICAgICAgICBjYXNlIEFWQ09MX1NQQ19GQ0MgICAgICAgOiBzb3VyY2UgPSBDT0xPUl9NT0RFX0ZDQyAgICAgICA7IGJyZWFrOworICAgICAgICBjYXNlIEFWQ09MX1NQQ19TTVBURTI0ME0gOiBzb3VyY2UgPSBDT0xPUl9NT0RFX1NNUFRFMjQwTSA7IGJyZWFrOworICAgICAgICBjYXNlIEFWQ09MX1NQQ19CVDQ3MEJHICAgOiBzb3VyY2UgPSBDT0xPUl9NT0RFX0JUNjAxICAgICA7IGJyZWFrOworICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIklucHV0IGZyYW1lIGRvZXMgbm90IHNwZWNpZnkgYSBzdXBwb3J0ZWQgY29sb3JzcGFjZSwgYW5kIG5vbmUgaGFzIGJlZW4gc3BlY2lmaWVkIGFzIHNvdXJjZSBlaXRoZXJcbiIpOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgY29sb3ItPm1vZGUgPSBzb3VyY2UgKiA0ICsgY29sb3ItPmRlc3Q7CisgICAgfSBlbHNlCisgICAgICAgIGNvbG9yLT5tb2RlID0gY29sb3ItPnNvdXJjZSAqIDQgKyBjb2xvci0+ZGVzdDsKKworICAgIHN3aXRjaChjb2xvci0+ZGVzdCkgeworICAgIGNhc2UgQ09MT1JfTU9ERV9CVDcwOSAgICA6IGF2X2ZyYW1lX3NldF9jb2xvcnNwYWNlKG91dCwgQVZDT0xfU1BDX0JUNzA5KSAgICA7IGJyZWFrOworICAgIGNhc2UgQ09MT1JfTU9ERV9GQ0MgICAgICA6IGF2X2ZyYW1lX3NldF9jb2xvcnNwYWNlKG91dCwgQVZDT0xfU1BDX0ZDQykgICAgICA7IGJyZWFrOworICAgIGNhc2UgQ09MT1JfTU9ERV9TTVBURTI0ME06IGF2X2ZyYW1lX3NldF9jb2xvcnNwYWNlKG91dCwgQVZDT0xfU1BDX1NNUFRFMjQwTSk7IGJyZWFrOworICAgIGNhc2UgQ09MT1JfTU9ERV9CVDYwMSAgICA6IGF2X2ZyYW1lX3NldF9jb2xvcnNwYWNlKG91dCwgQVZDT0xfU1BDX0JUNDcwQkcpICA7IGJyZWFrOworICAgIH0KKworICAgIGNhbGNfY29lZmZpY2llbnRzKGN0eCk7CisKKyAgICBpZiAoaW4tPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlApCisgICAgICAgIHByb2Nlc3NfZnJhbWVfeXV2NDIycChjb2xvciwgb3V0LCBpbik7CisgICAgZWxzZSBpZiAoaW4tPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFApCisgICAgICAgIHByb2Nlc3NfZnJhbWVfeXV2NDIwcChjb2xvciwgb3V0LCBpbik7CisgICAgZWxzZQorICAgICAgICBwcm9jZXNzX2ZyYW1lX3V5dnk0MjIoY29sb3IsIG91dCwgaW4pOworCisgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGNvbG9ybWF0cml4X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgY29sb3JtYXRyaXhfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2NvbG9ybWF0cml4ID0geworICAgIC5uYW1lICAgICAgICAgID0gImNvbG9ybWF0cml4IiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDb252ZXJ0IGNvbG9yIG1hdHJpeC4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihDb2xvck1hdHJpeENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBjb2xvcm1hdHJpeF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBjb2xvcm1hdHJpeF9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmNvbG9ybWF0cml4X2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2NvcHkuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9jb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5YTkwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9jb3B5LmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBjb3B5IHZpZGVvIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgaW4tPndpZHRoLCBpbi0+aGVpZ2h0KTsKKworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICBhdl9mcmFtZV9jb3B5KG91dCwgaW4pOworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9jb3B5X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfY29weV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfY29weSA9IHsKKyAgICAubmFtZSAgICAgICAgPSAiY29weSIsCisgICAgLmRlc2NyaXB0aW9uID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvcHkgdGhlIGlucHV0IHZpZGVvIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0LiIpLAorICAgIC5pbnB1dHMgICAgICA9IGF2ZmlsdGVyX3ZmX2NvcHlfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IGF2ZmlsdGVyX3ZmX2NvcHlfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfY3JvcC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2Nyb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmYwMjlhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2Nyb3AuYwpAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCb2JieSBCaW5naGFtCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHZpZGVvIGNyb3AgZmlsdGVyCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJpbl93IiwgIml3IiwgICAvLy88IHdpZHRoICBvZiB0aGUgaW5wdXQgdmlkZW8KKyAgICAiaW5faCIsICJpaCIsICAgLy8vPCBoZWlnaHQgb2YgdGhlIGlucHV0IHZpZGVvCisgICAgIm91dF93IiwgIm93IiwgIC8vLzwgd2lkdGggIG9mIHRoZSBjcm9wcGVkIHZpZGVvCisgICAgIm91dF9oIiwgIm9oIiwgIC8vLzwgaGVpZ2h0IG9mIHRoZSBjcm9wcGVkIHZpZGVvCisgICAgImEiLAorICAgICJzYXIiLAorICAgICJkYXIiLAorICAgICJoc3ViIiwKKyAgICAidnN1YiIsCisgICAgIngiLAorICAgICJ5IiwKKyAgICAibiIsICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgZnJhbWUKKyAgICAicG9zIiwgICAgICAgICAgLy8vPCBwb3NpdGlvbiBpbiB0aGUgZmlsZQorICAgICJ0IiwgICAgICAgICAgICAvLy88IHRpbWVzdGFtcCBleHByZXNzZWQgaW4gc2Vjb25kcworICAgIE5VTEwKK307CisKK2VudW0gdmFyX25hbWUgeworICAgIFZBUl9JTl9XLCAgVkFSX0lXLAorICAgIFZBUl9JTl9ILCAgVkFSX0lILAorICAgIFZBUl9PVVRfVywgVkFSX09XLAorICAgIFZBUl9PVVRfSCwgVkFSX09ILAorICAgIFZBUl9BLAorICAgIFZBUl9TQVIsCisgICAgVkFSX0RBUiwKKyAgICBWQVJfSFNVQiwKKyAgICBWQVJfVlNVQiwKKyAgICBWQVJfWCwKKyAgICBWQVJfWSwKKyAgICBWQVJfTiwKKyAgICBWQVJfUE9TLAorICAgIFZBUl9ULAorICAgIFZBUl9WQVJTX05CCit9OworCit0eXBlZGVmIHN0cnVjdCBDcm9wQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50ICB4OyAgICAgICAgICAgICAvLy88IHggb2Zmc2V0IG9mIHRoZSBub24tY3JvcHBlZCBhcmVhIHdpdGggcmVzcGVjdCB0byB0aGUgaW5wdXQgYXJlYQorICAgIGludCAgeTsgICAgICAgICAgICAgLy8vPCB5IG9mZnNldCBvZiB0aGUgbm9uLWNyb3BwZWQgYXJlYSB3aXRoIHJlc3BlY3QgdG8gdGhlIGlucHV0IGFyZWEKKyAgICBpbnQgIHc7ICAgICAgICAgICAgIC8vLzwgd2lkdGggb2YgdGhlIGNyb3BwZWQgYXJlYQorICAgIGludCAgaDsgICAgICAgICAgICAgLy8vPCBoZWlnaHQgb2YgdGhlIGNyb3BwZWQgYXJlYQorCisgICAgQVZSYXRpb25hbCBvdXRfc2FyOyAvLy88IG91dHB1dCBzYW1wbGUgYXNwZWN0IHJhdGlvCisgICAgaW50IGtlZXBfYXNwZWN0OyAgICAvLy88IGtlZXAgZGlzcGxheSBhc3BlY3QgcmF0aW8gd2hlbiBjcm9wcGluZworCisgICAgaW50IG1heF9zdGVwWzRdOyAgICAvLy88IG1heCBwaXhlbCBzdGVwIGZvciBlYWNoIHBsYW5lLCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgYnl0ZXMKKyAgICBpbnQgaHN1YiwgdnN1YjsgICAgIC8vLzwgY2hyb21hIHN1YnNhbXBsaW5nCisgICAgY2hhciAqeF9leHByLCAqeV9leHByLCAqd19leHByLCAqaF9leHByOworICAgIEFWRXhwciAqeF9wZXhwciwgKnlfcGV4cHI7ICAvKiBwYXJzZWQgZXhwcmVzc2lvbnMgZm9yIHggYW5kIHkgKi8KKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJfVkFSU19OQl07Cit9IENyb3BDb250ZXh0OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gTlVMTDsKKyAgICBpbnQgZm10OworCisgICAgZm9yIChmbXQgPSAwOyBhdl9waXhfZm10X2Rlc2NfZ2V0KGZtdCk7IGZtdCsrKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZm10KTsKKyAgICAgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiAoQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwgfCBBVl9QSVhfRk1UX0ZMQUdfQklUU1RSRUFNKSkgJiYKKyAgICAgICAgICAgICEoKGRlc2MtPmxvZzJfY2hyb21hX3cgfHwgZGVzYy0+bG9nMl9jaHJvbWFfaCkgJiYgIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QTEFOQVIpKSkKKyAgICAgICAgICAgIGZmX2FkZF9mb3JtYXQoJmZvcm1hdHMsIGZtdCk7CisgICAgfQorCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIENyb3BDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfZXhwcl9mcmVlKHMtPnhfcGV4cHIpOworICAgIHMtPnhfcGV4cHIgPSBOVUxMOworICAgIGF2X2V4cHJfZnJlZShzLT55X3BleHByKTsKKyAgICBzLT55X3BleHByID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbm9ybWFsaXplX2RvdWJsZShpbnQgKm4sIGRvdWJsZSBkKQoreworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGlzbmFuKGQpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICB9IGVsc2UgaWYgKGQgPiBJTlRfTUFYIHx8IGQgPCBJTlRfTUlOKSB7CisgICAgICAgICpuID0gZCA+IElOVF9NQVggPyBJTlRfTUFYIDogSU5UX01JTjsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgIH0gZWxzZQorICAgICAgICAqbiA9IHJvdW5kKGQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+ZHN0OworICAgIENyb3BDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGxpbmstPmZvcm1hdCk7CisgICAgaW50IHJldDsKKyAgICBjb25zdCBjaGFyICpleHByOworICAgIGRvdWJsZSByZXM7CisKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9JTl9XXSAgPSBzLT52YXJfdmFsdWVzW1ZBUl9JV10gPSBjdHgtPmlucHV0c1swXS0+dzsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9JTl9IXSAgPSBzLT52YXJfdmFsdWVzW1ZBUl9JSF0gPSBjdHgtPmlucHV0c1swXS0+aDsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9BXSAgICAgPSAoZmxvYXQpIGxpbmstPncgLyBsaW5rLT5oOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1NBUl0gICA9IGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID8gYXZfcTJkKGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8pIDogMTsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9EQVJdICAgPSBzLT52YXJfdmFsdWVzW1ZBUl9BXSAqIHMtPnZhcl92YWx1ZXNbVkFSX1NBUl07CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfSFNVQl0gID0gMTw8cGl4X2Rlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfVlNVQl0gID0gMTw8cGl4X2Rlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfWF0gICAgID0gTkFOOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1ldICAgICA9IE5BTjsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9PVVRfV10gPSBzLT52YXJfdmFsdWVzW1ZBUl9PV10gPSBOQU47CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfT1VUX0hdID0gcy0+dmFyX3ZhbHVlc1tWQVJfT0hdID0gTkFOOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX05dICAgICA9IDA7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfVF0gICAgID0gTkFOOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1BPU10gICA9IE5BTjsKKworICAgIGF2X2ltYWdlX2ZpbGxfbWF4X3BpeHN0ZXBzKHMtPm1heF9zdGVwLCBOVUxMLCBwaXhfZGVzYyk7CisgICAgcy0+aHN1YiA9IHBpeF9kZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHMtPnZzdWIgPSBwaXhfZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIGlmICgocmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmcmVzLCAoZXhwciA9IHMtPndfZXhwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgcy0+dmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWxfZXhwcjsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9PVVRfV10gPSBzLT52YXJfdmFsdWVzW1ZBUl9PV10gPSByZXM7CisgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZyZXMsIChleHByID0gcy0+aF9leHByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCBzLT52YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbF9leHByOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX09VVF9IXSA9IHMtPnZhcl92YWx1ZXNbVkFSX09IXSA9IHJlczsKKyAgICAvKiBldmFsdWF0ZSBhZ2FpbiBvdyBhcyBpdCBtYXkgZGVwZW5kIG9uIG9oICovCisgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZyZXMsIChleHByID0gcy0+d19leHByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCBzLT52YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbF9leHByOworCisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfT1VUX1ddID0gcy0+dmFyX3ZhbHVlc1tWQVJfT1ddID0gcmVzOworICAgIGlmIChub3JtYWxpemVfZG91YmxlKCZzLT53LCBzLT52YXJfdmFsdWVzW1ZBUl9PVVRfV10pIDwgMCB8fAorICAgICAgICBub3JtYWxpemVfZG91YmxlKCZzLT5oLCBzLT52YXJfdmFsdWVzW1ZBUl9PVVRfSF0pIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVG9vIGJpZyB2YWx1ZSBvciBpbnZhbGlkIGV4cHJlc3Npb24gZm9yIG91dF93L293IG9yIG91dF9oL29oLiAiCisgICAgICAgICAgICAgICAiTWF5YmUgdGhlIGV4cHJlc3Npb24gZm9yIG91dF93Oiclcycgb3IgZm9yIG91dF9oOiclcycgaXMgc2VsZi1yZWZlcmVuY2luZy5cbiIsCisgICAgICAgICAgICAgICBzLT53X2V4cHIsIHMtPmhfZXhwcik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHMtPncgJj0gfigoMSA8PCBzLT5oc3ViKSAtIDEpOworICAgIHMtPmggJj0gfigoMSA8PCBzLT52c3ViKSAtIDEpOworCisgICAgYXZfZXhwcl9mcmVlKHMtPnhfcGV4cHIpOworICAgIGF2X2V4cHJfZnJlZShzLT55X3BleHByKTsKKyAgICBzLT54X3BleHByID0gcy0+eV9wZXhwciA9IE5VTEw7CisgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlKCZzLT54X3BleHByLCBzLT54X2V4cHIsIHZhcl9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBhdl9leHByX3BhcnNlKCZzLT55X3BleHByLCBzLT55X2V4cHIsIHZhcl9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKHMtPmtlZXBfYXNwZWN0KSB7CisgICAgICAgIEFWUmF0aW9uYWwgZGFyID0gYXZfbXVsX3EobGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7IGxpbmstPncsIGxpbmstPmggfSk7CisgICAgICAgIGF2X3JlZHVjZSgmcy0+b3V0X3Nhci5udW0sICZzLT5vdXRfc2FyLmRlbiwKKyAgICAgICAgICAgICAgICAgIGRhci5udW0gKiBzLT5oLCBkYXIuZGVuICogcy0+dywgSU5UX01BWCk7CisgICAgfSBlbHNlCisgICAgICAgIHMtPm91dF9zYXIgPSBsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJ3OiVkIGg6JWQgc2FyOiVkLyVkIC0+IHc6JWQgaDolZCBzYXI6JWQvJWRcbiIsCisgICAgICAgICAgIGxpbmstPncsIGxpbmstPmgsIGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgcy0+dywgcy0+aCwgcy0+b3V0X3Nhci5udW0sIHMtPm91dF9zYXIuZGVuKTsKKworICAgIGlmIChzLT53IDw9IDAgfHwgcy0+aCA8PSAwIHx8CisgICAgICAgIHMtPncgPiBsaW5rLT53IHx8IHMtPmggPiBsaW5rLT5oKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHRvbyBiaWcgb3Igbm9uIHBvc2l0aXZlIHNpemUgZm9yIHdpZHRoICclZCcgb3IgaGVpZ2h0ICclZCdcbiIsCisgICAgICAgICAgICAgICBzLT53LCBzLT5oKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvKiBzZXQgZGVmYXVsdCwgcmVxdWlyZWQgaW4gdGhlIGNhc2UgdGhlIGZpcnN0IGNvbXB1dGVkIHZhbHVlIGZvciB4L3kgaXMgTkFOICovCisgICAgcy0+eCA9IChsaW5rLT53IC0gcy0+dykgLyAyOworICAgIHMtPnkgPSAobGluay0+aCAtIHMtPmgpIC8gMjsKKyAgICBzLT54ICY9IH4oKDEgPDwgcy0+aHN1YikgLSAxKTsKKyAgICBzLT55ICY9IH4oKDEgPDwgcy0+dnN1YikgLSAxKTsKKyAgICByZXR1cm4gMDsKKworZmFpbF9leHByOgorICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciB3aGVuIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gJyVzJ1xuIiwgZXhwcik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBDcm9wQ29udGV4dCAqcyA9IGxpbmstPnNyYy0+cHJpdjsKKworICAgIGxpbmstPncgPSBzLT53OworICAgIGxpbmstPmggPSBzLT5oOworICAgIGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzLT5vdXRfc2FyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBsaW5rLT5kc3Q7CisgICAgQ3JvcENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChsaW5rLT5mb3JtYXQpOworICAgIGludCBpOworCisgICAgZnJhbWUtPndpZHRoICA9IHMtPnc7CisgICAgZnJhbWUtPmhlaWdodCA9IHMtPmg7CisKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9OXSA9IGxpbmstPmZyYW1lX2NvdW50OworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1RdID0gZnJhbWUtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSA/CisgICAgICAgIE5BTiA6IGZyYW1lLT5wdHMgKiBhdl9xMmQobGluay0+dGltZV9iYXNlKTsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9QT1NdID0gYXZfZnJhbWVfZ2V0X3BrdF9wb3MoZnJhbWUpID09IC0xID8KKyAgICAgICAgTkFOIDogYXZfZnJhbWVfZ2V0X3BrdF9wb3MoZnJhbWUpOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1hdID0gYXZfZXhwcl9ldmFsKHMtPnhfcGV4cHIsIHMtPnZhcl92YWx1ZXMsIE5VTEwpOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1ldID0gYXZfZXhwcl9ldmFsKHMtPnlfcGV4cHIsIHMtPnZhcl92YWx1ZXMsIE5VTEwpOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1hdID0gYXZfZXhwcl9ldmFsKHMtPnhfcGV4cHIsIHMtPnZhcl92YWx1ZXMsIE5VTEwpOworCisgICAgbm9ybWFsaXplX2RvdWJsZSgmcy0+eCwgcy0+dmFyX3ZhbHVlc1tWQVJfWF0pOworICAgIG5vcm1hbGl6ZV9kb3VibGUoJnMtPnksIHMtPnZhcl92YWx1ZXNbVkFSX1ldKTsKKworICAgIGlmIChzLT54IDwgMCkKKyAgICAgICAgcy0+eCA9IDA7CisgICAgaWYgKHMtPnkgPCAwKQorICAgICAgICBzLT55ID0gMDsKKyAgICBpZiAoKHVuc2lnbmVkKXMtPnggKyAodW5zaWduZWQpcy0+dyA+IGxpbmstPncpCisgICAgICAgIHMtPnggPSBsaW5rLT53IC0gcy0+dzsKKyAgICBpZiAoKHVuc2lnbmVkKXMtPnkgKyAodW5zaWduZWQpcy0+aCA+IGxpbmstPmgpCisgICAgICAgIHMtPnkgPSBsaW5rLT5oIC0gcy0+aDsKKyAgICBzLT54ICY9IH4oKDEgPDwgcy0+aHN1YikgLSAxKTsKKyAgICBzLT55ICY9IH4oKDEgPDwgcy0+dnN1YikgLSAxKTsKKworICAgIGF2X2Rsb2coY3R4LCAibjolZCB0OiVmIHBvczolZiB4OiVkIHk6JWQgeCt3OiVkIHkraDolZFxuIiwKKyAgICAgICAgICAgIChpbnQpcy0+dmFyX3ZhbHVlc1tWQVJfTl0sIHMtPnZhcl92YWx1ZXNbVkFSX1RdLCBzLT52YXJfdmFsdWVzW1ZBUl9QT1NdLAorICAgICAgICAgICAgcy0+eCwgcy0+eSwgcy0+eCtzLT53LCBzLT55K3MtPmgpOworCisgICAgZnJhbWUtPmRhdGFbMF0gKz0gcy0+eSAqIGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICBmcmFtZS0+ZGF0YVswXSArPSBzLT54ICogcy0+bWF4X3N0ZXBbMF07CisKKyAgICBpZiAoIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKSkgeworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMzsgaSArKykgeworICAgICAgICAgICAgaWYgKGZyYW1lLT5kYXRhW2ldKSB7CisgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbaV0gKz0gKHMtPnkgPj4gcy0+dnN1YikgKiBmcmFtZS0+bGluZXNpemVbaV07CisgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbaV0gKz0gKHMtPnggKiBzLT5tYXhfc3RlcFtpXSkgPj4gcy0+aHN1YjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGFscGhhIHBsYW5lICovCisgICAgaWYgKGZyYW1lLT5kYXRhWzNdKSB7CisgICAgICAgIGZyYW1lLT5kYXRhWzNdICs9IHMtPnkgKiBmcmFtZS0+bGluZXNpemVbM107CisgICAgICAgIGZyYW1lLT5kYXRhWzNdICs9IHMtPnggKiBzLT5tYXhfc3RlcFszXTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGxpbmstPmRzdC0+b3V0cHV0c1swXSwgZnJhbWUpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDcm9wQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjcm9wX29wdGlvbnNbXSA9IHsKKyAgICB7ICJvdXRfdyIsICAgICAgICJzZXQgdGhlIHdpZHRoIGNyb3AgYXJlYSBleHByZXNzaW9uIiwgICBPRkZTRVQod19leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJpdyJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAidyIsICAgICAgICAgICAic2V0IHRoZSB3aWR0aCBjcm9wIGFyZWEgZXhwcmVzc2lvbiIsICAgT0ZGU0VUKHdfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiaXcifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgIm91dF9oIiwgICAgICAgInNldCB0aGUgaGVpZ2h0IGNyb3AgYXJlYSBleHByZXNzaW9uIiwgIE9GRlNFVChoX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gImloIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJoIiwgICAgICAgICAgICJzZXQgdGhlIGhlaWdodCBjcm9wIGFyZWEgZXhwcmVzc2lvbiIsICBPRkZTRVQoaF9leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJpaCJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAieCIsICAgICAgICAgICAic2V0IHRoZSB4IGNyb3AgYXJlYSBleHByZXNzaW9uIiwgICAgICAgT0ZGU0VUKHhfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiKGluX3ctb3V0X3cpLzIifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgInkiLCAgICAgICAgICAgInNldCB0aGUgeSBjcm9wIGFyZWEgZXhwcmVzc2lvbiIsICAgICAgIE9GRlNFVCh5X2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIihpbl9oLW91dF9oKS8yIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJrZWVwX2FzcGVjdCIsICJrZWVwIGFzcGVjdCByYXRpbyIsICAgICAgICAgICAgICAgICAgICBPRkZTRVQoa2VlcF9hc3BlY3QpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoY3JvcCk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9jcm9wX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfY3JvcF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9jcm9wID0geworICAgIC5uYW1lICAgICAgICAgID0gImNyb3AiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNyb3AgdGhlIGlucHV0IHZpZGVvLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKENyb3BDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZjcm9wX2NsYXNzLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAuaW5wdXRzICAgICAgICA9IGF2ZmlsdGVyX3ZmX2Nyb3BfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfdmZfY3JvcF9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9jcm9wZGV0ZWN0LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfY3JvcGRldGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YWE3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfY3JvcGRldGVjdC5jCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEEncnBpCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBib3JkZXIgZGV0ZWN0aW9uIGZpbHRlcgorICogUG9ydGVkIGZyb20gTVBsYXllciBsaWJtcGNvZGVjcy92Zl9jcm9wZGV0ZWN0LmMuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ3JvcERldGVjdENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCB4MSwgeTEsIHgyLCB5MjsKKyAgICBpbnQgbGltaXQ7CisgICAgaW50IHJvdW5kOworICAgIGludCByZXNldF9jb3VudDsKKyAgICBpbnQgZnJhbWVfbmI7CisgICAgaW50IG1heF9waXhzdGVwc1s0XTsKK30gQ3JvcERldGVjdENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDExUCwgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgQVZfUElYX0ZNVF9OVjEyLCAgICBBVl9QSVhfRk1UX05WMjEsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tsaW5lKHZvaWQgKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgbGVuLCBpbnQgYnBwKQoreworICAgIGludCB0b3RhbCA9IDA7CisgICAgaW50IGRpdiA9IGxlbjsKKworICAgIHN3aXRjaCAoYnBwKSB7CisgICAgY2FzZSAxOgorICAgICAgICB3aGlsZSAoLS1sZW4gPj0gMCkgeworICAgICAgICAgICAgdG90YWwgKz0gc3JjWzBdOworICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgY2FzZSA0OgorICAgICAgICB3aGlsZSAoLS1sZW4gPj0gMCkgeworICAgICAgICAgICAgdG90YWwgKz0gc3JjWzBdICsgc3JjWzFdICsgc3JjWzJdOworICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICBkaXYgKj0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHRvdGFsIC89IGRpdjsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgInRvdGFsOiVkXG4iLCB0b3RhbCk7CisgICAgcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDcm9wRGV0ZWN0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPmZyYW1lX25iID0gLTI7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgImxpbWl0OiVkIHJvdW5kOiVkIHJlc2V0X2NvdW50OiVkXG4iLAorICAgICAgICAgICBzLT5saW1pdCwgcy0+cm91bmQsIHMtPnJlc2V0X2NvdW50KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIENyb3BEZXRlY3RDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfaW1hZ2VfZmlsbF9tYXhfcGl4c3RlcHMocy0+bWF4X3BpeHN0ZXBzLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpKTsKKworICAgIHMtPngxID0gaW5saW5rLT53IC0gMTsKKyAgICBzLT55MSA9IGlubGluay0+aCAtIDE7CisgICAgcy0+eDIgPSAwOworICAgIHMtPnkyID0gMDsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFNFVF9NRVRBKGtleSwgdmFsdWUpIFwKKyAgICBhdl9kaWN0X3NldF9pbnQobWV0YWRhdGEsIGtleSwgdmFsdWUsIDApCisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIENyb3BEZXRlY3RDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBicHAgPSBzLT5tYXhfcGl4c3RlcHNbMF07CisgICAgaW50IHcsIGgsIHgsIHksIHNocmlua19ieTsKKyAgICBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YTsKKworICAgIC8vIGlnbm9yZSBmaXJzdCAyIGZyYW1lcyAtIHRoZXkgbWF5IGJlIGVtcHR5CisgICAgaWYgKCsrcy0+ZnJhbWVfbmIgPiAwKSB7CisgICAgICAgIG1ldGFkYXRhID0gYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAoZnJhbWUpOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBjcm9wIGFyZWEgZXZlcnkgcmVzZXRfY291bnQgZnJhbWVzLCBpZiByZXNldF9jb3VudCBpcyA+IDAKKyAgICAgICAgaWYgKHMtPnJlc2V0X2NvdW50ID4gMCAmJiBzLT5mcmFtZV9uYiA+IHMtPnJlc2V0X2NvdW50KSB7CisgICAgICAgICAgICBzLT54MSA9IGZyYW1lLT53aWR0aCAgLSAxOworICAgICAgICAgICAgcy0+eTEgPSBmcmFtZS0+aGVpZ2h0IC0gMTsKKyAgICAgICAgICAgIHMtPngyID0gMDsKKyAgICAgICAgICAgIHMtPnkyID0gMDsKKyAgICAgICAgICAgIHMtPmZyYW1lX25iID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzLT55MTsgeSsrKSB7CisgICAgICAgICAgICBpZiAoY2hlY2tsaW5lKGN0eCwgZnJhbWUtPmRhdGFbMF0gKyBmcmFtZS0+bGluZXNpemVbMF0gKiB5LCBicHAsIGZyYW1lLT53aWR0aCwgYnBwKSA+IHMtPmxpbWl0KSB7CisgICAgICAgICAgICAgICAgcy0+eTEgPSB5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gZnJhbWUtPmhlaWdodCAtIDE7IHkgPiBGRk1BWChzLT55Miwgcy0+eTEpOyB5LS0pIHsKKyAgICAgICAgICAgIGlmIChjaGVja2xpbmUoY3R4LCBmcmFtZS0+ZGF0YVswXSArIGZyYW1lLT5saW5lc2l6ZVswXSAqIHksIGJwcCwgZnJhbWUtPndpZHRoLCBicHApID4gcy0+bGltaXQpIHsKKyAgICAgICAgICAgICAgICBzLT55MiA9IHk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+eDE7IHkrKykgeworICAgICAgICAgICAgaWYgKGNoZWNrbGluZShjdHgsIGZyYW1lLT5kYXRhWzBdICsgYnBwKnksIGZyYW1lLT5saW5lc2l6ZVswXSwgZnJhbWUtPmhlaWdodCwgYnBwKSA+IHMtPmxpbWl0KSB7CisgICAgICAgICAgICAgICAgcy0+eDEgPSB5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gZnJhbWUtPndpZHRoIC0gMTsgeSA+IEZGTUFYKHMtPngyLCBzLT54MSk7IHktLSkgeworICAgICAgICAgICAgaWYgKGNoZWNrbGluZShjdHgsIGZyYW1lLT5kYXRhWzBdICsgYnBwKnksIGZyYW1lLT5saW5lc2l6ZVswXSwgZnJhbWUtPmhlaWdodCwgYnBwKSA+IHMtPmxpbWl0KSB7CisgICAgICAgICAgICAgICAgcy0+eDIgPSB5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcm91bmQgeCBhbmQgeSAodXApLCBpbXBvcnRhbnQgZm9yIHl1diBjb2xvcnNwYWNlcworICAgICAgICAvLyBtYWtlIHN1cmUgdGhleSBzdGF5IHJvdW5kZWQhCisgICAgICAgIHggPSAocy0+eDErMSkgJiB+MTsKKyAgICAgICAgeSA9IChzLT55MSsxKSAmIH4xOworCisgICAgICAgIHcgPSBzLT54MiAtIHggKyAxOworICAgICAgICBoID0gcy0+eTIgLSB5ICsgMTsKKworICAgICAgICAvLyB3IGFuZCBoIG11c3QgYmUgZGl2aXNpYmxlIGJ5IDIgYXMgd2VsbCBiZWNhdXNlIG9mIHl1dgorICAgICAgICAvLyBjb2xvcnNwYWNlIHByb2JsZW1zLgorICAgICAgICBpZiAocy0+cm91bmQgPD0gMSkKKyAgICAgICAgICAgIHMtPnJvdW5kID0gMTY7CisgICAgICAgIGlmIChzLT5yb3VuZCAlIDIpCisgICAgICAgICAgICBzLT5yb3VuZCAqPSAyOworCisgICAgICAgIHNocmlua19ieSA9IHcgJSBzLT5yb3VuZDsKKyAgICAgICAgdyAtPSBzaHJpbmtfYnk7CisgICAgICAgIHggKz0gKHNocmlua19ieS8yICsgMSkgJiB+MTsKKworICAgICAgICBzaHJpbmtfYnkgPSBoICUgcy0+cm91bmQ7CisgICAgICAgIGggLT0gc2hyaW5rX2J5OworICAgICAgICB5ICs9IChzaHJpbmtfYnkvMiArIDEpICYgfjE7CisKKyAgICAgICAgU0VUX01FVEEoImxhdmZpLmNyb3BkZXRlY3QueDEiLCBzLT54MSk7CisgICAgICAgIFNFVF9NRVRBKCJsYXZmaS5jcm9wZGV0ZWN0LngyIiwgcy0+eDIpOworICAgICAgICBTRVRfTUVUQSgibGF2ZmkuY3JvcGRldGVjdC55MSIsIHMtPnkxKTsKKyAgICAgICAgU0VUX01FVEEoImxhdmZpLmNyb3BkZXRlY3QueTIiLCBzLT55Mik7CisgICAgICAgIFNFVF9NRVRBKCJsYXZmaS5jcm9wZGV0ZWN0LnciLCAgdyk7CisgICAgICAgIFNFVF9NRVRBKCJsYXZmaS5jcm9wZGV0ZWN0LmgiLCAgaCk7CisgICAgICAgIFNFVF9NRVRBKCJsYXZmaS5jcm9wZGV0ZWN0LngiLCAgeCk7CisgICAgICAgIFNFVF9NRVRBKCJsYXZmaS5jcm9wZGV0ZWN0LnkiLCAgeSk7CisKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAieDE6JWQgeDI6JWQgeTE6JWQgeTI6JWQgdzolZCBoOiVkIHg6JWQgeTolZCBwdHM6JSJQUklkNjQiIHQ6JWYgY3JvcD0lZDolZDolZDolZFxuIiwKKyAgICAgICAgICAgICAgIHMtPngxLCBzLT54Miwgcy0+eTEsIHMtPnkyLCB3LCBoLCB4LCB5LCBmcmFtZS0+cHRzLAorICAgICAgICAgICAgICAgZnJhbWUtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSA/IC0xIDogZnJhbWUtPnB0cyAqIGF2X3EyZChpbmxpbmstPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICB3LCBoLCB4LCB5KTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGlubGluay0+ZHN0LT5vdXRwdXRzWzBdLCBmcmFtZSk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENyb3BEZXRlY3RDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGNyb3BkZXRlY3Rfb3B0aW9uc1tdID0geworICAgIHsgImxpbWl0IiwgIlRocmVzaG9sZCBiZWxvdyB3aGljaCB0aGUgcGl4ZWwgaXMgY29uc2lkZXJlZCBibGFjayIsIE9GRlNFVChsaW1pdCksICAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMjQgfSwgMCwgMjU1LCBGTEFHUyB9LAorICAgIHsgInJvdW5kIiwgIlZhbHVlIGJ5IHdoaWNoIHRoZSB3aWR0aC9oZWlnaHQgc2hvdWxkIGJlIGRpdmlzaWJsZSIsIE9GRlNFVChyb3VuZCksICAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMTYgfSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJyZXNldCIsICJSZWNhbGN1bGF0ZSB0aGUgY3JvcCBhcmVhIGFmdGVyIHRoaXMgbWFueSBmcmFtZXMiLCAgICBPRkZTRVQocmVzZXRfY291bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgIDAsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAicmVzZXRfY291bnQiLCAiUmVjYWxjdWxhdGUgdGhlIGNyb3AgYXJlYSBhZnRlciB0aGlzIG1hbnkgZnJhbWVzIixPRkZTRVQocmVzZXRfY291bnQpLEFWX09QVF9UWVBFX0lOVCx7IC5pNjQgPSAwIH0sICAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoY3JvcGRldGVjdCk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9jcm9wZGV0ZWN0X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfY3JvcGRldGVjdF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8KKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9jcm9wZGV0ZWN0ID0geworICAgIC5uYW1lICAgICAgICAgID0gImNyb3BkZXRlY3QiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkF1dG8tZGV0ZWN0IGNyb3Agc2l6ZS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihDcm9wRGV0ZWN0Q29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmY3JvcGRldGVjdF9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfdmZfY3JvcGRldGVjdF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl92Zl9jcm9wZGV0ZWN0X291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfY3VydmVzLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfY3VydmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3YzM5MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9jdXJ2ZXMuYwpAQCAtMCwwICsxLDU3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlsZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworI2RlZmluZSBSIDAKKyNkZWZpbmUgRyAxCisjZGVmaW5lIEIgMgorI2RlZmluZSBBIDMKKworc3RydWN0IGtleXBvaW50IHsKKyAgICBkb3VibGUgeCwgeTsKKyAgICBzdHJ1Y3Qga2V5cG9pbnQgKm5leHQ7Cit9OworCisjZGVmaW5lIE5CX0NPTVAgMworCitlbnVtIHByZXNldCB7CisgICAgUFJFU0VUX05PTkUsCisgICAgUFJFU0VUX0NPTE9SX05FR0FUSVZFLAorICAgIFBSRVNFVF9DUk9TU19QUk9DRVNTLAorICAgIFBSRVNFVF9EQVJLRVIsCisgICAgUFJFU0VUX0lOQ1JFQVNFX0NPTlRSQVNULAorICAgIFBSRVNFVF9MSUdIVEVSLAorICAgIFBSRVNFVF9MSU5FQVJfQ09OVFJBU1QsCisgICAgUFJFU0VUX01FRElVTV9DT05UUkFTVCwKKyAgICBQUkVTRVRfTkVHQVRJVkUsCisgICAgUFJFU0VUX1NUUk9OR19DT05UUkFTVCwKKyAgICBQUkVTRVRfVklOVEFHRSwKKyAgICBOQl9QUkVTRVRTLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGVudW0gcHJlc2V0IHByZXNldDsKKyAgICBjaGFyICpjb21wX3BvaW50c19zdHJbTkJfQ09NUCArIDFdOworICAgIGNoYXIgKmNvbXBfcG9pbnRzX3N0cl9hbGw7CisgICAgdWludDhfdCBncmFwaFtOQl9DT01QICsgMV1bMjU2XTsKKyAgICBjaGFyICpwc2ZpbGU7CisgICAgdWludDhfdCByZ2JhX21hcFs0XTsKKyAgICBpbnQgc3RlcDsKK30gQ3VydmVzQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgVGhyZWFkRGF0YSB7CisgICAgQVZGcmFtZSAqaW4sICpvdXQ7Cit9IFRocmVhZERhdGE7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEN1cnZlc0NvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGN1cnZlc19vcHRpb25zW10gPSB7CisgICAgeyAicHJlc2V0IiwgInNlbGVjdCBhIGNvbG9yIGN1cnZlcyBwcmVzZXQiLCBPRkZTRVQocHJlc2V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1QUkVTRVRfTk9ORX0sIFBSRVNFVF9OT05FLCBOQl9QUkVTRVRTLTEsIEZMQUdTLCAicHJlc2V0X25hbWUiIH0sCisgICAgICAgIHsgIm5vbmUiLCAgICAgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1QUkVTRVRfTk9ORX0sICAgICAgICAgICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInByZXNldF9uYW1lIiB9LAorICAgICAgICB7ICJjb2xvcl9uZWdhdGl2ZSIsICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UFJFU0VUX0NPTE9SX05FR0FUSVZFfSwgICAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJwcmVzZXRfbmFtZSIgfSwKKyAgICAgICAgeyAiY3Jvc3NfcHJvY2VzcyIsICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVBSRVNFVF9DUk9TU19QUk9DRVNTfSwgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAicHJlc2V0X25hbWUiIH0sCisgICAgICAgIHsgImRhcmtlciIsICAgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1QUkVTRVRfREFSS0VSfSwgICAgICAgICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInByZXNldF9uYW1lIiB9LAorICAgICAgICB7ICJpbmNyZWFzZV9jb250cmFzdCIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UFJFU0VUX0lOQ1JFQVNFX0NPTlRSQVNUfSwgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJwcmVzZXRfbmFtZSIgfSwKKyAgICAgICAgeyAibGlnaHRlciIsICAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVBSRVNFVF9MSUdIVEVSfSwgICAgICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAicHJlc2V0X25hbWUiIH0sCisgICAgICAgIHsgImxpbmVhcl9jb250cmFzdCIsICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1QUkVTRVRfTElORUFSX0NPTlRSQVNUfSwgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInByZXNldF9uYW1lIiB9LAorICAgICAgICB7ICJtZWRpdW1fY29udHJhc3QiLCAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UFJFU0VUX01FRElVTV9DT05UUkFTVH0sICAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJwcmVzZXRfbmFtZSIgfSwKKyAgICAgICAgeyAibmVnYXRpdmUiLCAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVBSRVNFVF9ORUdBVElWRX0sICAgICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAicHJlc2V0X25hbWUiIH0sCisgICAgICAgIHsgInN0cm9uZ19jb250cmFzdCIsICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1QUkVTRVRfU1RST05HX0NPTlRSQVNUfSwgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInByZXNldF9uYW1lIiB9LAorICAgICAgICB7ICJ2aW50YWdlIiwgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UFJFU0VUX1ZJTlRBR0V9LCAgICAgICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJwcmVzZXRfbmFtZSIgfSwKKyAgICB7ICJtYXN0ZXIiLCJzZXQgbWFzdGVyIHBvaW50cyBjb29yZGluYXRlcyIsT0ZGU0VUKGNvbXBfcG9pbnRzX3N0cltOQl9DT01QXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAibSIsICAgICAic2V0IG1hc3RlciBwb2ludHMgY29vcmRpbmF0ZXMiLE9GRlNFVChjb21wX3BvaW50c19zdHJbTkJfQ09NUF0pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInJlZCIsICAgInNldCByZWQgcG9pbnRzIGNvb3JkaW5hdGVzIiwgICBPRkZTRVQoY29tcF9wb2ludHNfc3RyWzBdKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJyIiwgICAgICJzZXQgcmVkIHBvaW50cyBjb29yZGluYXRlcyIsICAgT0ZGU0VUKGNvbXBfcG9pbnRzX3N0clswXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiZ3JlZW4iLCAic2V0IGdyZWVuIHBvaW50cyBjb29yZGluYXRlcyIsIE9GRlNFVChjb21wX3BvaW50c19zdHJbMV0pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImciLCAgICAgInNldCBncmVlbiBwb2ludHMgY29vcmRpbmF0ZXMiLCBPRkZTRVQoY29tcF9wb2ludHNfc3RyWzFdKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJibHVlIiwgICJzZXQgYmx1ZSBwb2ludHMgY29vcmRpbmF0ZXMiLCAgT0ZGU0VUKGNvbXBfcG9pbnRzX3N0clsyXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiYiIsICAgICAic2V0IGJsdWUgcG9pbnRzIGNvb3JkaW5hdGVzIiwgIE9GRlNFVChjb21wX3BvaW50c19zdHJbMl0pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImFsbCIsICAgInNldCBwb2ludHMgY29vcmRpbmF0ZXMgZm9yIGFsbCBjb21wb25lbnRzIiwgT0ZGU0VUKGNvbXBfcG9pbnRzX3N0cl9hbGwpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInBzZmlsZSIsICJzZXQgUGhvdG9zaG9wIGN1cnZlcyBmaWxlIG5hbWUiLCBPRkZTRVQocHNmaWxlKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGN1cnZlcyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKnI7CisgICAgY29uc3QgY2hhciAqZzsKKyAgICBjb25zdCBjaGFyICpiOworICAgIGNvbnN0IGNoYXIgKm1hc3RlcjsKK30gY3VydmVzX3ByZXNldHNbXSA9IHsKKyAgICBbUFJFU0VUX0NPTE9SX05FR0FUSVZFXSA9IHsKKyAgICAgICAgIjAvMSAwLjEyOS8xIDAuNDY2LzAuNDk4IDAuNzI1LzAgMS8wIiwKKyAgICAgICAgIjAvMSAwLjEwOS8xIDAuMzAxLzAuNDk4IDAuNTE3LzAgMS8wIiwKKyAgICAgICAgIjAvMSAwLjA5OC8xIDAuMjM1LzAuNDk4IDAuNDIzLzAgMS8wIiwKKyAgICB9LAorICAgIFtQUkVTRVRfQ1JPU1NfUFJPQ0VTU10gPSB7CisgICAgICAgICIwLjI1LzAuMTU2IDAuNTAxLzAuNTAxIDAuNjg2LzAuNzQ1IiwKKyAgICAgICAgIjAuMjUvMC4xODggMC4zOC8wLjUwMSAwLjc0NS8wLjgxNSAxLzAuODE1IiwKKyAgICAgICAgIjAuMjMxLzAuMDk0IDAuNzA5LzAuODc0IiwKKyAgICB9LAorICAgIFtQUkVTRVRfREFSS0VSXSAgICAgICAgICAgICA9IHsgLm1hc3RlciA9ICIwLjUvMC40IiB9LAorICAgIFtQUkVTRVRfSU5DUkVBU0VfQ09OVFJBU1RdICA9IHsgLm1hc3RlciA9ICIwLjE0OS8wLjA2NiAwLjgzMS8wLjkwNSAwLjkwNS8wLjk4IiB9LAorICAgIFtQUkVTRVRfTElHSFRFUl0gICAgICAgICAgICA9IHsgLm1hc3RlciA9ICIwLjQvMC41IiB9LAorICAgIFtQUkVTRVRfTElORUFSX0NPTlRSQVNUXSAgICA9IHsgLm1hc3RlciA9ICIwLjMwNS8wLjI4NiAwLjY5NC8wLjcxMyIgfSwKKyAgICBbUFJFU0VUX01FRElVTV9DT05UUkFTVF0gICAgPSB7IC5tYXN0ZXIgPSAiMC4yODYvMC4yMTkgMC42MzkvMC42NDMiIH0sCisgICAgW1BSRVNFVF9ORUdBVElWRV0gICAgICAgICAgID0geyAubWFzdGVyID0gIjAvMSAxLzAiIH0sCisgICAgW1BSRVNFVF9TVFJPTkdfQ09OVFJBU1RdICAgID0geyAubWFzdGVyID0gIjAuMzAxLzAuMTk2IDAuNTkyLzAuNiAwLjY4Ni8wLjczNyIgfSwKKyAgICBbUFJFU0VUX1ZJTlRBR0VdID0geworICAgICAgICAiMC8wLjExIDAuNDIvMC41MSAxLzAuOTUiLAorICAgICAgICAiMC41MC8wLjQ4IiwKKyAgICAgICAgIjAvMC4yMiAwLjQ5LzAuNDQgMS8wLjgiLAorICAgIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qga2V5cG9pbnQgKm1ha2VfcG9pbnQoZG91YmxlIHgsIGRvdWJsZSB5LCBzdHJ1Y3Qga2V5cG9pbnQgKm5leHQpCit7CisgICAgc3RydWN0IGtleXBvaW50ICpwb2ludCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpwb2ludCkpOworCisgICAgaWYgKCFwb2ludCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9pbnQtPnggPSB4OworICAgIHBvaW50LT55ID0geTsKKyAgICBwb2ludC0+bmV4dCA9IG5leHQ7CisgICAgcmV0dXJuIHBvaW50OworfQorCitzdGF0aWMgaW50IHBhcnNlX3BvaW50c19zdHIoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHN0cnVjdCBrZXlwb2ludCAqKnBvaW50cywgY29uc3QgY2hhciAqcykKK3sKKyAgICBjaGFyICpwID0gKGNoYXIgKilzOyAvLyBzdHJ0b2Qgd29uJ3QgYWx0ZXIgdGhlIHN0cmluZworICAgIHN0cnVjdCBrZXlwb2ludCAqbGFzdCA9IE5VTEw7CisKKyAgICAvKiBjb25zdHJ1Y3QgYSBsaW5rZWQgbGlzdCBiYXNlZCBvbiB0aGUga2V5IHBvaW50cyBzdHJpbmcgKi8KKyAgICB3aGlsZSAocCAmJiAqcCkgeworICAgICAgICBzdHJ1Y3Qga2V5cG9pbnQgKnBvaW50ID0gbWFrZV9wb2ludCgwLCAwLCBOVUxMKTsKKyAgICAgICAgaWYgKCFwb2ludCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHBvaW50LT54ID0gYXZfc3RydG9kKHAsICZwKTsgaWYgKHAgJiYgKnApIHArKzsKKyAgICAgICAgcG9pbnQtPnkgPSBhdl9zdHJ0b2QocCwgJnApOyBpZiAocCAmJiAqcCkgcCsrOworICAgICAgICBpZiAocG9pbnQtPnggPCAwIHx8IHBvaW50LT54ID4gMSB8fCBwb2ludC0+eSA8IDAgfHwgcG9pbnQtPnkgPiAxKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGtleSBwb2ludCBjb29yZGluYXRlcyAoJWY7JWYpLCAiCisgICAgICAgICAgICAgICAgICAgInggYW5kIHkgbXVzdCBiZSBpbiB0aGUgWzA7MV0gcmFuZ2UuXG4iLCBwb2ludC0+eCwgcG9pbnQtPnkpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISpwb2ludHMpCisgICAgICAgICAgICAqcG9pbnRzID0gcG9pbnQ7CisgICAgICAgIGlmIChsYXN0KSB7CisgICAgICAgICAgICBpZiAoKGludCkobGFzdC0+eCAqIDI1NSkgPj0gKGludCkocG9pbnQtPnggKiAyNTUpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiS2V5IHBvaW50IGNvb3JkaW5hdGVzICglZjslZikgIgorICAgICAgICAgICAgICAgICAgICAgICAiYW5kICglZjslZikgYXJlIHRvbyBjbG9zZSBmcm9tIGVhY2ggb3RoZXIgb3Igbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInN0cmljdGx5IGluY3JlYXNpbmcgb24gdGhlIHgtYXhpc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGFzdC0+eCwgbGFzdC0+eSwgcG9pbnQtPngsIHBvaW50LT55KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdC0+bmV4dCA9IHBvaW50OworICAgICAgICB9CisgICAgICAgIGxhc3QgPSBwb2ludDsKKyAgICB9CisKKyAgICAvKiBhdXRvIGluc2VydCBmaXJzdCBrZXkgcG9pbnQgaWYgbWlzc2luZyBhdCB4PTAgKi8KKyAgICBpZiAoISpwb2ludHMpIHsKKyAgICAgICAgbGFzdCA9IG1ha2VfcG9pbnQoMCwgMCwgTlVMTCk7CisgICAgICAgIGlmICghbGFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGxhc3QtPnggPSBsYXN0LT55ID0gMDsKKyAgICAgICAgKnBvaW50cyA9IGxhc3Q7CisgICAgfSBlbHNlIGlmICgoKnBvaW50cyktPnggIT0gMC4pIHsKKyAgICAgICAgc3RydWN0IGtleXBvaW50ICpuZXdmaXJzdCA9IG1ha2VfcG9pbnQoMCwgMCwgKnBvaW50cyk7CisgICAgICAgIGlmICghbmV3Zmlyc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAqcG9pbnRzID0gbmV3Zmlyc3Q7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MChsYXN0KTsKKworICAgIC8qIGF1dG8gaW5zZXJ0IGxhc3Qga2V5IHBvaW50IGlmIG1pc3NpbmcgYXQgeD0xICovCisgICAgaWYgKGxhc3QtPnggIT0gMS4pIHsKKyAgICAgICAgc3RydWN0IGtleXBvaW50ICpwb2ludCA9IG1ha2VfcG9pbnQoMSwgMSwgTlVMTCk7CisgICAgICAgIGlmICghcG9pbnQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBsYXN0LT5uZXh0ID0gcG9pbnQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X25iX3BvaW50cyhjb25zdCBzdHJ1Y3Qga2V5cG9pbnQgKmQpCit7CisgICAgaW50IG4gPSAwOworICAgIHdoaWxlIChkKSB7CisgICAgICAgIG4rKzsKKyAgICAgICAgZCA9IGQtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBuOworfQorCisvKioKKyAqIE5hdHVyYWwgY3ViaWMgc3BsaW5lIGludGVycG9sYXRpb24KKyAqIEZpbmRpbmcgY3VydmVzIHVzaW5nIEN1YmljIFNwbGluZXMgbm90ZXMgYnkgU3RldmVuIFJhdWNoIGFuZCBKb2huIFN0b2NraWUuCisgKiBAc2VlIGh0dHA6Ly9wZW9wbGUubWF0aC5zZnUuY2EvfnN0b2NraWUvdGVhY2hpbmcvbWFjbTMxNi9ub3Rlcy9zcGxpbmVzLnBkZgorICovCitzdGF0aWMgaW50IGludGVycG9sYXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB1aW50OF90ICp5LCBjb25zdCBzdHJ1Y3Qga2V5cG9pbnQgKnBvaW50cykKK3sKKyAgICBpbnQgaSwgcmV0ID0gMDsKKyAgICBjb25zdCBzdHJ1Y3Qga2V5cG9pbnQgKnBvaW50OworICAgIGRvdWJsZSB4cHJldiA9IDA7CisKKyAgICBpbnQgbiA9IGdldF9uYl9wb2ludHMocG9pbnRzKTsgLy8gbnVtYmVyIG9mIHNwbGluZXMKKworICAgIGRvdWJsZSAoKm1hdHJpeClbM10gPSBhdl9jYWxsb2Mobiwgc2l6ZW9mKCptYXRyaXgpKTsKKyAgICBkb3VibGUgKmggPSBhdl9tYWxsb2MoKG4gLSAxKSAqIHNpemVvZigqaCkpOworICAgIGRvdWJsZSAqciA9IGF2X2NhbGxvYyhuLCBzaXplb2YoKnIpKTsKKworICAgIGlmICghbWF0cml4IHx8ICFoIHx8ICFyKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogaChpKSA9IHgoaSsxKSAtIHgoaSkgKi8KKyAgICBpID0gLTE7CisgICAgZm9yIChwb2ludCA9IHBvaW50czsgcG9pbnQ7IHBvaW50ID0gcG9pbnQtPm5leHQpIHsKKyAgICAgICAgaWYgKGkgIT0gLTEpCisgICAgICAgICAgICBoW2ldID0gcG9pbnQtPnggLSB4cHJldjsKKyAgICAgICAgeHByZXYgPSBwb2ludC0+eDsKKyAgICAgICAgaSsrOworICAgIH0KKworICAgIC8qIHJpZ2h0LXNpZGUgb2YgdGhlIHBvbHlub21pYWxzLCB3aWxsIGJlIG1vZGlmaWVkIHRvIGNvbnRhaW5zIHRoZSBzb2x1dGlvbiAqLworICAgIHBvaW50ID0gcG9pbnRzOworICAgIGZvciAoaSA9IDE7IGkgPCBuIC0gMTsgaSsrKSB7CisgICAgICAgIGRvdWJsZSB5cCA9IHBvaW50LT55LAorICAgICAgICAgICAgICAgeWMgPSBwb2ludC0+bmV4dC0+eSwKKyAgICAgICAgICAgICAgIHluID0gcG9pbnQtPm5leHQtPm5leHQtPnk7CisgICAgICAgIHJbaV0gPSA2ICogKCh5bi15YykvaFtpXSAtICh5Yy15cCkvaFtpLTFdKTsKKyAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKKyAgICB9CisKKyNkZWZpbmUgQkQgMCAvKiBzdWIgIGRpYWdvbmFsIChiZWxvdyBtYWluKSAqLworI2RlZmluZSBNRCAxIC8qIG1haW4gZGlhZ29uYWwgKGNlbnRlcikgKi8KKyNkZWZpbmUgQUQgMiAvKiBzdXAgIGRpYWdvbmFsIChhYm92ZSBtYWluKSAqLworCisgICAgLyogbGVmdCBzaWRlIG9mIHRoZSBwb2x5bm9taWFscyBpbnRvIGEgdHJpZGlhZ29uYWwgbWF0cml4LiAqLworICAgIG1hdHJpeFswXVtNRF0gPSBtYXRyaXhbbiAtIDFdW01EXSA9IDE7CisgICAgZm9yIChpID0gMTsgaSA8IG4gLSAxOyBpKyspIHsKKyAgICAgICAgbWF0cml4W2ldW0JEXSA9IGhbaS0xXTsKKyAgICAgICAgbWF0cml4W2ldW01EXSA9IDIgKiAoaFtpLTFdICsgaFtpXSk7CisgICAgICAgIG1hdHJpeFtpXVtBRF0gPSBoW2ldOworICAgIH0KKworICAgIC8qIHRyaWRpYWdvbmFsIHNvbHZpbmcgb2YgdGhlIGxpbmVhciBzeXN0ZW0gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBkZW4gPSBtYXRyaXhbaV1bTURdIC0gbWF0cml4W2ldW0JEXSAqIG1hdHJpeFtpLTFdW0FEXTsKKyAgICAgICAgZG91YmxlIGsgPSBkZW4gPyAxLi9kZW4gOiAxLjsKKyAgICAgICAgbWF0cml4W2ldW0FEXSAqPSBrOworICAgICAgICByW2ldID0gKHJbaV0gLSBtYXRyaXhbaV1bQkRdICogcltpIC0gMV0pICogazsKKyAgICB9CisgICAgZm9yIChpID0gbiAtIDI7IGkgPj0gMDsgaS0tKQorICAgICAgICByW2ldID0gcltpXSAtIG1hdHJpeFtpXVtBRF0gKiByW2kgKyAxXTsKKworICAgIC8qIGNvbXB1dGUgdGhlIGdyYXBoIHdpdGggeD1bMC4uMjU1XSAqLworICAgIGkgPSAwOworICAgIHBvaW50ID0gcG9pbnRzOworICAgIGF2X2Fzc2VydDAocG9pbnQtPm5leHQpOyAvLyBhbHdheXMgYXQgbGVhc3QgMiBrZXkgcG9pbnRzCisgICAgd2hpbGUgKHBvaW50LT5uZXh0KSB7CisgICAgICAgIGRvdWJsZSB5YyA9IHBvaW50LT55OworICAgICAgICBkb3VibGUgeW4gPSBwb2ludC0+bmV4dC0+eTsKKworICAgICAgICBkb3VibGUgYSA9IHljOworICAgICAgICBkb3VibGUgYiA9ICh5bi15YykvaFtpXSAtIGhbaV0qcltpXS8yLiAtIGhbaV0qKHJbaSsxXS1yW2ldKS82LjsKKyAgICAgICAgZG91YmxlIGMgPSByW2ldIC8gMi47CisgICAgICAgIGRvdWJsZSBkID0gKHJbaSsxXSAtIHJbaV0pIC8gKDYuKmhbaV0pOworCisgICAgICAgIGludCB4OworICAgICAgICBpbnQgeF9zdGFydCA9IHBvaW50LT54ICAgICAgICogMjU1OworICAgICAgICBpbnQgeF9lbmQgICA9IHBvaW50LT5uZXh0LT54ICogMjU1OworCisgICAgICAgIGF2X2Fzc2VydDAoeF9zdGFydCA+PSAwICYmIHhfc3RhcnQgPD0gMjU1ICYmCisgICAgICAgICAgICAgICAgICAgeF9lbmQgICA+PSAwICYmIHhfZW5kICAgPD0gMjU1KTsKKworICAgICAgICBmb3IgKHggPSB4X3N0YXJ0OyB4IDw9IHhfZW5kOyB4KyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB4eCA9ICh4IC0geF9zdGFydCkgKiAxLzI1NS47CisgICAgICAgICAgICBkb3VibGUgeXkgPSBhICsgYip4eCArIGMqeHgqeHggKyBkKnh4Knh4Knh4OworICAgICAgICAgICAgeVt4XSA9IGF2X2NsaXBmKHl5LCAwLCAxKSAqIDI1NTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgImYoJWYpPSVmIC0+IHlbJWRdPSVkXG4iLCB4eCwgeXksIHgsIHlbeF0pOworICAgICAgICB9CisKKyAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKKyAgICAgICAgaSsrOworICAgIH0KKworZW5kOgorICAgIGF2X2ZyZWUobWF0cml4KTsKKyAgICBhdl9mcmVlKGgpOworICAgIGF2X2ZyZWUocik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwYXJzZV9wc2ZpbGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmZuYW1lKQoreworICAgIEN1cnZlc0NvbnRleHQgKmN1cnZlcyA9IGN0eC0+cHJpdjsKKyAgICB1aW50OF90ICpidWY7CisgICAgc2l6ZV90IHNpemU7CisgICAgaW50IGksIHJldCwgYXZfdW51c2VkKHZlcnNpb24pLCBuYl9jdXJ2ZXM7CisgICAgQVZCUHJpbnQgcHRzdHI7CisgICAgc3RhdGljIGNvbnN0IGludCBjb21wX2lkc1tdID0gezMsIDAsIDEsIDJ9OworCisgICAgYXZfYnByaW50X2luaXQoJnB0c3RyLCAwLCBBVl9CUFJJTlRfU0laRV9BVVRPTUFUSUMpOworCisgICAgcmV0ID0gYXZfZmlsZV9tYXAoZm5hbWUsICZidWYsICZzaXplLCAwLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworI2RlZmluZSBSRUFEMTYoZHN0KSBkbyB7ICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc2l6ZSA8IDIpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7ICAgICAgXAorICAgICAgICBnb3RvIGVuZDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0ID0gQVZfUkIxNihidWYpOyAgICAgICAgICAgICAgICAgXAorICAgIGJ1ZiAgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplIC09IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgUkVBRDE2KHZlcnNpb24pOworICAgIFJFQUQxNihuYl9jdXJ2ZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRk1JTihuYl9jdXJ2ZXMsIEZGX0FSUkFZX0VMRU1TKGNvbXBfaWRzKSk7IGkrKykgeworICAgICAgICBpbnQgbmJfcG9pbnRzLCBuOworICAgICAgICBhdl9icHJpbnRfY2xlYXIoJnB0c3RyKTsKKyAgICAgICAgUkVBRDE2KG5iX3BvaW50cyk7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBuYl9wb2ludHM7IG4rKykgeworICAgICAgICAgICAgaW50IHksIHg7CisgICAgICAgICAgICBSRUFEMTYoeSk7CisgICAgICAgICAgICBSRUFEMTYoeCk7CisgICAgICAgICAgICBhdl9icHJpbnRmKCZwdHN0ciwgIiVmLyVmICIsIHggLyAyNTUuLCB5IC8gMjU1Lik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpwdHN0ci5zdHIpIHsKKyAgICAgICAgICAgIGNoYXIgKipwdHMgPSAmY3VydmVzLT5jb21wX3BvaW50c19zdHJbY29tcF9pZHNbaV1dOworICAgICAgICAgICAgaWYgKCEqcHRzKSB7CisgICAgICAgICAgICAgICAgKnB0cyA9IGF2X3N0cmR1cChwdHN0ci5zdHIpOworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgImN1cnZlcyAlZCAoaW50aWQ9JWQpIFslZCBwb2ludHNdOiBbJXNdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBpLCBjb21wX2lkc1tpXSwgbmJfcG9pbnRzLCAqcHRzKTsKKyAgICAgICAgICAgICAgICBpZiAoISpwdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CitlbmQ6CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZwdHN0ciwgTlVMTCk7CisgICAgYXZfZmlsZV91bm1hcChidWYsIHNpemUpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBpLCBqLCByZXQ7CisgICAgQ3VydmVzQ29udGV4dCAqY3VydmVzID0gY3R4LT5wcml2OworICAgIHN0cnVjdCBrZXlwb2ludCAqY29tcF9wb2ludHNbTkJfQ09NUCArIDFdID0gezB9OworICAgIGNoYXIgKipwdHMgPSBjdXJ2ZXMtPmNvbXBfcG9pbnRzX3N0cjsKKyAgICBjb25zdCBjaGFyICphbGxwID0gY3VydmVzLT5jb21wX3BvaW50c19zdHJfYWxsOworCisgICAgLy9pZiAoIWFsbHAgJiYgY3VydmVzLT5wcmVzZXQgIT0gUFJFU0VUX05PTkUgJiYgY3VydmVzX3ByZXNldHNbY3VydmVzLT5wcmVzZXRdLmFsbCkKKyAgICAvLyAgICBhbGxwID0gY3VydmVzX3ByZXNldHNbY3VydmVzLT5wcmVzZXRdLmFsbDsKKworICAgIGlmIChhbGxwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQl9DT01QOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghcHRzW2ldKQorICAgICAgICAgICAgICAgIHB0c1tpXSA9IGF2X3N0cmR1cChhbGxwKTsKKyAgICAgICAgICAgIGlmICghcHRzW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3VydmVzLT5wc2ZpbGUpIHsKKyAgICAgICAgcmV0ID0gcGFyc2VfcHNmaWxlKGN0eCwgY3VydmVzLT5wc2ZpbGUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGN1cnZlcy0+cHJlc2V0ICE9IFBSRVNFVF9OT05FKSB7CisjZGVmaW5lIFNFVF9DT01QX0lGX05PVF9TRVQobiwgbmFtZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXB0c1tuXSAmJiBjdXJ2ZXNfcHJlc2V0c1tjdXJ2ZXMtPnByZXNldF0ubmFtZSkgeyAgICAgICAgICAgXAorICAgICAgICBwdHNbbl0gPSBhdl9zdHJkdXAoY3VydmVzX3ByZXNldHNbY3VydmVzLT5wcmVzZXRdLm5hbWUpOyAgICBcCisgICAgICAgIGlmICghcHRzW25dKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorICAgICAgICBTRVRfQ09NUF9JRl9OT1RfU0VUKDAsIHIpOworICAgICAgICBTRVRfQ09NUF9JRl9OT1RfU0VUKDEsIGcpOworICAgICAgICBTRVRfQ09NUF9JRl9OT1RfU0VUKDIsIGIpOworICAgICAgICBTRVRfQ09NUF9JRl9OT1RfU0VUKDMsIG1hc3Rlcik7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE5CX0NPTVAgKyAxOyBpKyspIHsKKyAgICAgICAgcmV0ID0gcGFyc2VfcG9pbnRzX3N0cihjdHgsIGNvbXBfcG9pbnRzICsgaSwgY3VydmVzLT5jb21wX3BvaW50c19zdHJbaV0pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IGludGVycG9sYXRlKGN0eCwgY3VydmVzLT5ncmFwaFtpXSwgY29tcF9wb2ludHNbaV0pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKHB0c1tOQl9DT01QXSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJfQ09NUDsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQorICAgICAgICAgICAgICAgIGN1cnZlcy0+Z3JhcGhbaV1bal0gPSBjdXJ2ZXMtPmdyYXBoW05CX0NPTVBdW2N1cnZlcy0+Z3JhcGhbaV1bal1dOworICAgIH0KKworICAgIGlmIChhdl9sb2dfZ2V0X2xldmVsKCkgPj0gQVZfTE9HX1ZFUkJPU0UpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5CX0NPTVA7IGkrKykgeworICAgICAgICAgICAgc3RydWN0IGtleXBvaW50ICpwb2ludCA9IGNvbXBfcG9pbnRzW2ldOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIjJWQgcG9pbnRzOiIsIGkpOworICAgICAgICAgICAgd2hpbGUgKHBvaW50KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIgKCVmOyVmKSIsIHBvaW50LT54LCBwb2ludC0+eSk7CisgICAgICAgICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiXG4iKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiIyVkIHZhbHVlczoiLCBpKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyNTY7IGorKykKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIiAlMDJYIiwgY3VydmVzLT5ncmFwaFtpXVtqXSk7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkJfQ09NUCArIDE7IGkrKykgeworICAgICAgICBzdHJ1Y3Qga2V5cG9pbnQgKnBvaW50ID0gY29tcF9wb2ludHNbaV07CisgICAgICAgIHdoaWxlIChwb2ludCkgeworICAgICAgICAgICAgc3RydWN0IGtleXBvaW50ICpuZXh0ID0gcG9pbnQtPm5leHQ7CisgICAgICAgICAgICBhdl9mcmVlKHBvaW50KTsKKyAgICAgICAgICAgIHBvaW50ID0gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCAgQVZfUElYX0ZNVF9CR1IyNCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0JBLCAgIEFWX1BJWF9GTVRfQkdSQSwKKyAgICAgICAgQVZfUElYX0ZNVF9BUkdCLCAgIEFWX1BJWF9GTVRfQUJHUiwKKyAgICAgICAgQVZfUElYX0ZNVF8wUkdCLCAgIEFWX1BJWF9GTVRfMEJHUiwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IwLCAgIEFWX1BJWF9GTVRfQkdSMCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEN1cnZlc0NvbnRleHQgKmN1cnZlcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworCisgICAgZmZfZmlsbF9yZ2JhX21hcChjdXJ2ZXMtPnJnYmFfbWFwLCBpbmxpbmstPmZvcm1hdCk7CisgICAgY3VydmVzLT5zdGVwID0gYXZfZ2V0X3BhZGRlZF9iaXRzX3Blcl9waXhlbChkZXNjKSA+PiAzOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX3NsaWNlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgaW50IHgsIHk7CisgICAgY29uc3QgQ3VydmVzQ29udGV4dCAqY3VydmVzID0gY3R4LT5wcml2OworICAgIGNvbnN0IFRocmVhZERhdGEgKnRkID0gYXJnOworICAgIGNvbnN0IEFWRnJhbWUgKmluICA9IHRkLT5pbjsKKyAgICBjb25zdCBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OworICAgIGNvbnN0IGludCBkaXJlY3QgPSBvdXQgPT0gaW47CisgICAgY29uc3QgaW50IHN0ZXAgPSBjdXJ2ZXMtPnN0ZXA7CisgICAgY29uc3QgdWludDhfdCByID0gY3VydmVzLT5yZ2JhX21hcFtSXTsKKyAgICBjb25zdCB1aW50OF90IGcgPSBjdXJ2ZXMtPnJnYmFfbWFwW0ddOworICAgIGNvbnN0IHVpbnQ4X3QgYiA9IGN1cnZlcy0+cmdiYV9tYXBbQl07CisgICAgY29uc3QgdWludDhfdCBhID0gY3VydmVzLT5yZ2JhX21hcFtBXTsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoaW4tPmhlaWdodCAqICBqb2JuciAgICkgLyBuYl9qb2JzOworICAgIGNvbnN0IGludCBzbGljZV9lbmQgICA9IChpbi0+aGVpZ2h0ICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgdWludDhfdCAgICAgICAqZHN0ID0gb3V0LT5kYXRhWzBdICsgc2xpY2Vfc3RhcnQgKiBvdXQtPmxpbmVzaXplWzBdOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9ICBpbi0+ZGF0YVswXSArIHNsaWNlX3N0YXJ0ICogIGluLT5saW5lc2l6ZVswXTsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGluLT53aWR0aCAqIHN0ZXA7IHggKz0gc3RlcCkgeworICAgICAgICAgICAgZHN0W3ggKyByXSA9IGN1cnZlcy0+Z3JhcGhbUl1bc3JjW3ggKyByXV07CisgICAgICAgICAgICBkc3RbeCArIGddID0gY3VydmVzLT5ncmFwaFtHXVtzcmNbeCArIGddXTsKKyAgICAgICAgICAgIGRzdFt4ICsgYl0gPSBjdXJ2ZXMtPmdyYXBoW0JdW3NyY1t4ICsgYl1dOworICAgICAgICAgICAgaWYgKCFkaXJlY3QgJiYgc3RlcCA9PSA0KQorICAgICAgICAgICAgICAgIGRzdFt4ICsgYV0gPSBzcmNbeCArIGFdOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBvdXQtPmxpbmVzaXplWzBdOworICAgICAgICBzcmMgKz0gaW4gLT5saW5lc2l6ZVswXTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgVGhyZWFkRGF0YSB0ZDsKKworICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShpbikpIHsKKyAgICAgICAgb3V0ID0gaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICAgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICB9CisKKyAgICB0ZC5pbiAgPSBpbjsKKyAgICB0ZC5vdXQgPSBvdXQ7CisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9zbGljZSwgJnRkLCBOVUxMLCBGRk1JTihvdXRsaW5rLT5oLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisKKyAgICBpZiAob3V0ICE9IGluKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBjdXJ2ZXNfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBjdXJ2ZXNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2N1cnZlcyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJjdXJ2ZXMiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFkanVzdCBjb21wb25lbnRzIGN1cnZlcy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihDdXJ2ZXNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gY3VydmVzX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGN1cnZlc19vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmN1cnZlc19jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDIHwgQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9kY3Rkbm9pei5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2RjdGRub2l6LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwMTdiMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9kY3Rkbm9pei5jCkBAIC0wLDAgKzEsNzc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgQ2zDqW1lbnQgQsWTc2NoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQSBzaW1wbGUsIHJlbGF0aXZlbHkgZWZmaWNpZW50IGFuZCBzbG93IERDVCBpbWFnZSBkZW5vaXNlci4KKyAqCisgKiBAc2VlIGh0dHA6Ly93d3cuaXBvbC5pbS9wdWIvYXJ0LzIwMTEveXMtZGN0LworICoKKyAqIFRoZSBEQ1QgZmFjdG9yaXphdGlvbiB1c2VkIGlzIGJhc2VkIG9uICJGYXN0IGFuZCBudW1lcmljYWxseSBzdGFibGUKKyAqIGFsZ29yaXRobXMgZm9yIGRpc2NyZXRlIGNvc2luZSB0cmFuc2Zvcm1zIiBmcm9tIEdlcmxpbmQgUGxvbmthYSAmIE1hbmZyZWQKKyAqIFRhc2NoZSAoRE9JOiAxMC4xMDE2L2oubGFhLjIwMDQuMDcuMDE1KS4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geyAiYyIsIE5VTEwgfTsKK2VudW0geyBWQVJfQywgVkFSX1ZBUlNfTkIgfTsKKworI2RlZmluZSBNQVhfVEhSRUFEUyA4CisKK3R5cGVkZWYgc3RydWN0IERDVGRub2l6Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICAvKiBjb2VmZmljaWVudCBmYWN0b3IgZXhwcmVzc2lvbiAqLworICAgIGNoYXIgKmV4cHJfc3RyOworICAgIEFWRXhwciAqZXhwcltNQVhfVEhSRUFEU107CisgICAgZG91YmxlIHZhcl92YWx1ZXNbTUFYX1RIUkVBRFNdW1ZBUl9WQVJTX05CXTsKKworICAgIGludCBuYl90aHJlYWRzOworICAgIGludCBwcl93aWR0aCwgcHJfaGVpZ2h0OyAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IHRvIHByb2Nlc3MKKyAgICBmbG9hdCBzaWdtYTsgICAgICAgICAgICAgICAgLy8gdXNlZCB3aGVuIG5vIGV4cHJlc3Npb24gYXJlIHN0CisgICAgZmxvYXQgdGg7ICAgICAgICAgICAgICAgICAgIC8vIHRocmVzaG9sZCAoMypzaWdtYSkKKyAgICBmbG9hdCAqY2J1ZlsyXVszXTsgICAgICAgICAgLy8gdHdvIHBsYW5hciByZ2IgY29sb3IgYnVmZmVycworICAgIGZsb2F0ICpzbGljZXNbTUFYX1RIUkVBRFNdOyAvLyBzbGljZXMgYnVmZmVycyAoMSBzbGljZSBidWZmZXIgcGVyIHRocmVhZCkKKyAgICBmbG9hdCAqd2VpZ2h0czsgICAgICAgICAgICAgLy8gZGN0IGNvZWZmIGFyZSBjdW11bGF0ZWQgd2l0aCBvdmVybGFwcGluZzsgdGhlc2UgdmFsdWVzIGFyZSB1c2VkIGZvciBhdmVyYWdpbmcKKyAgICBpbnQgcF9saW5lc2l6ZTsgICAgICAgICAgICAgLy8gbGluZSBzaXplcyBmb3IgY29sb3IgYW5kIHdlaWdodHMKKyAgICBpbnQgb3ZlcmxhcDsgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJsb2NrIG92ZXJsYXBwaW5nIHBpeGVscworICAgIGludCBzdGVwOyAgICAgICAgICAgICAgICAgICAvLyBibG9jayBzdGVwIGluY3JlbWVudCAoYmxvY2tzaXplIC0gb3ZlcmxhcCkKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAgLy8gMTw8biBpcyB0aGUgYmxvY2sgc2l6ZQorICAgIGludCBic2l6ZTsgICAgICAgICAgICAgICAgICAvLyBibG9jayBzaXplLCAxPDxuCisgICAgdm9pZCAoKmZpbHRlcl9mcmVxX2Z1bmMpKHN0cnVjdCBEQ1Rkbm9pekNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMsIGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkc3QsIGludCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlYWRfaWQpOworICAgIHZvaWQgKCpjb2xvcl9kZWNvcnJlbGF0aW9uKShmbG9hdCAqKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpOworICAgIHZvaWQgKCpjb2xvcl9jb3JyZWxhdGlvbikodWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKipzcmMsIGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpOworfSBEQ1Rkbm9pekNvbnRleHQ7CisKKyNkZWZpbmUgTUlOX05CSVRTIDMgLyogYmxvY2tzaXplID0gMTw8MyA9ICA4ICovCisjZGVmaW5lIE1BWF9OQklUUyA0IC8qIGJsb2Nrc2l6ZSA9IDE8PDQgPSAxNiAqLworI2RlZmluZSBERUZBVUxUX05CSVRTIDMKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRENUZG5vaXpDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBkY3Rkbm9pel9vcHRpb25zW10gPSB7CisgICAgeyAic2lnbWEiLCAgICJzZXQgbm9pc2Ugc2lnbWEgY29uc3RhbnQiLCAgICAgICAgICAgICAgIE9GRlNFVChzaWdtYSksICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgey5kYmw9MH0sICAgICAgICAgICAgMCwgOTk5LCAgICAgICAgICAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInMiLCAgICAgICAic2V0IG5vaXNlIHNpZ21hIGNvbnN0YW50IiwgICAgICAgICAgICAgICBPRkZTRVQoc2lnbWEpLCAgICBBVl9PUFRfVFlQRV9GTE9BVCwgIHsuZGJsPTB9LCAgICAgICAgICAgIDAsIDk5OSwgICAgICAgICAgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJvdmVybGFwIiwgInNldCBudW1iZXIgb2YgYmxvY2sgb3ZlcmxhcHBpbmcgcGl4ZWxzIiwgT0ZGU0VUKG92ZXJsYXApLCAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND0tMX0sIC0xLCAoMTw8TUFYX05CSVRTKS0xLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImV4cHIiLCAgICAic2V0IGNvZWZmaWNpZW50IGZhY3RvciBleHByZXNzaW9uIiwgICAgICBPRkZTRVQoZXhwcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAgICAgICAgICAgICAgICAgICAgICAgICAgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJlIiwgICAgICAgInNldCBjb2VmZmljaWVudCBmYWN0b3IgZXhwcmVzc2lvbiIsICAgICAgT0ZGU0VUKGV4cHJfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgICAgICAgICAgICAgICAgICAgICAgICAgIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAibiIsICAgICAgICJzZXQgdGhlIGJsb2NrIHNpemUsIGV4cHJlc3NlZCBpbiBiaXRzIiwgIE9GRlNFVChuKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQ9REVGQVVMVF9OQklUU30sIE1JTl9OQklUUywgTUFYX05CSVRTLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZGN0ZG5vaXopOworCitzdGF0aWMgdm9pZCBhdl9hbHdheXNfaW5saW5lIGZkY3Q4XzFkKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlYSwgaW50IGRzdF9zdHJpZGViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZWEsIGludCBzcmNfc3RyaWRlYikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgY29uc3QgZmxvYXQgeDAwID0gc3JjWzAqc3JjX3N0cmlkZWFdICsgc3JjWzcqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MDEgPSBzcmNbMSpzcmNfc3RyaWRlYV0gKyBzcmNbNipzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwMiA9IHNyY1syKnNyY19zdHJpZGVhXSArIHNyY1s1KnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDAzID0gc3JjWzMqc3JjX3N0cmlkZWFdICsgc3JjWzQqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MDQgPSBzcmNbMCpzcmNfc3RyaWRlYV0gLSBzcmNbNypzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwNSA9IHNyY1sxKnNyY19zdHJpZGVhXSAtIHNyY1s2KnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDA2ID0gc3JjWzIqc3JjX3N0cmlkZWFdIC0gc3JjWzUqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MDcgPSBzcmNbMypzcmNfc3RyaWRlYV0gLSBzcmNbNCpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwOCA9IHgwMCArIHgwMzsKKyAgICAgICAgY29uc3QgZmxvYXQgeDA5ID0geDAxICsgeDAyOworICAgICAgICBjb25zdCBmbG9hdCB4MGEgPSB4MDAgLSB4MDM7CisgICAgICAgIGNvbnN0IGZsb2F0IHgwYiA9IHgwMSAtIHgwMjsKKyAgICAgICAgY29uc3QgZmxvYXQgeDBjID0gMS4zODcwMzk4NDUzMjIxNWYqeDA0ICsgMC4yNzU4OTkzNzkyODI5NDNmKngwNzsKKyAgICAgICAgY29uc3QgZmxvYXQgeDBkID0gMS4xNzU4NzU2MDI0MTkzNmYqeDA1ICsgMC43ODU2OTQ5NTgzODcxMDJmKngwNjsKKyAgICAgICAgY29uc3QgZmxvYXQgeDBlID0gLTAuNzg1Njk0OTU4Mzg3MTAyZip4MDUgKyAxLjE3NTg3NTYwMjQxOTM2Zip4MDY7CisgICAgICAgIGNvbnN0IGZsb2F0IHgwZiA9IDAuMjc1ODk5Mzc5MjgyOTQzZip4MDQgLSAxLjM4NzAzOTg0NTMyMjE1Zip4MDc7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxMCA9IDAuMzUzNTUzMzkwNTkzMjc0ZiAqICh4MGMgLSB4MGQpOworICAgICAgICBjb25zdCBmbG9hdCB4MTEgPSAwLjM1MzU1MzM5MDU5MzI3NGYgKiAoeDBlIC0geDBmKTsKKyAgICAgICAgZHN0WzAqZHN0X3N0cmlkZWFdID0gMC4zNTM1NTMzOTA1OTMyNzRmICogKHgwOCArIHgwOSk7CisgICAgICAgIGRzdFsxKmRzdF9zdHJpZGVhXSA9IDAuMzUzNTUzMzkwNTkzMjc0ZiAqICh4MGMgKyB4MGQpOworICAgICAgICBkc3RbMipkc3Rfc3RyaWRlYV0gPSAwLjQ2MTkzOTc2NjI1NTY0M2YqeDBhICsgMC4xOTEzNDE3MTYxODI1NDVmKngwYjsKKyAgICAgICAgZHN0WzMqZHN0X3N0cmlkZWFdID0gMC43MDcxMDY3ODExODY1NDdmICogKHgxMCAtIHgxMSk7CisgICAgICAgIGRzdFs0KmRzdF9zdHJpZGVhXSA9IDAuMzUzNTUzMzkwNTkzMjc0ZiAqICh4MDggLSB4MDkpOworICAgICAgICBkc3RbNSpkc3Rfc3RyaWRlYV0gPSAwLjcwNzEwNjc4MTE4NjU0N2YgKiAoeDEwICsgeDExKTsKKyAgICAgICAgZHN0WzYqZHN0X3N0cmlkZWFdID0gMC4xOTEzNDE3MTYxODI1NDVmKngwYSAtIDAuNDYxOTM5NzY2MjU1NjQzZip4MGI7CisgICAgICAgIGRzdFs3KmRzdF9zdHJpZGVhXSA9IDAuMzUzNTUzMzkwNTkzMjc0ZiAqICh4MGUgKyB4MGYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZWI7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlYjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGF2X2Fsd2F5c19pbmxpbmUgaWRjdDhfMWQoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGVhLCBpbnQgZHN0X3N0cmlkZWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlYSwgaW50IHNyY19zdHJpZGViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBjb25zdCBmbG9hdCB4MDAgPSAgMS40MTQyMTM1NjIzNzMxZiAgKnNyY1swKnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDAxID0gIDEuMzg3MDM5ODQ1MzIyMTVmICpzcmNbMSpzcmNfc3RyaWRlYV0gKyAwLjI3NTg5OTM3OTI4Mjk0M2Yqc3JjWzcqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MDIgPSAgMS4zMDY1NjI5NjQ4NzYzOGYgKnNyY1syKnNyY19zdHJpZGVhXSArIDAuNTQxMTk2MTAwMTQ2MTk3ZipzcmNbNipzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwMyA9ICAxLjE3NTg3NTYwMjQxOTM2ZiAqc3JjWzMqc3JjX3N0cmlkZWFdICsgMC43ODU2OTQ5NTgzODcxMDJmKnNyY1s1KnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDA0ID0gIDEuNDE0MjEzNTYyMzczMWYgICpzcmNbNCpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwNSA9IC0wLjc4NTY5NDk1ODM4NzEwMmYqc3JjWzMqc3JjX3N0cmlkZWFdICsgMS4xNzU4NzU2MDI0MTkzNmYqc3JjWzUqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MDYgPSAgMC41NDExOTYxMDAxNDYxOTdmKnNyY1syKnNyY19zdHJpZGVhXSAtIDEuMzA2NTYyOTY0ODc2MzhmKnNyY1s2KnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDA3ID0gLTAuMjc1ODk5Mzc5MjgyOTQzZipzcmNbMSpzcmNfc3RyaWRlYV0gKyAxLjM4NzAzOTg0NTMyMjE1ZipzcmNbNypzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwOSA9IHgwMCArIHgwNDsKKyAgICAgICAgY29uc3QgZmxvYXQgeDBhID0geDAxICsgeDAzOworICAgICAgICBjb25zdCBmbG9hdCB4MGIgPSAxLjQxNDIxMzU2MjM3MzFmKngwMjsKKyAgICAgICAgY29uc3QgZmxvYXQgeDBjID0geDAwIC0geDA0OworICAgICAgICBjb25zdCBmbG9hdCB4MGQgPSB4MDEgLSB4MDM7CisgICAgICAgIGNvbnN0IGZsb2F0IHgwZSA9IDAuMzUzNTUzMzkwNTkzMjc0ZiAqICh4MDkgLSB4MGIpOworICAgICAgICBjb25zdCBmbG9hdCB4MGYgPSAwLjM1MzU1MzM5MDU5MzI3NGYgKiAoeDBjICsgeDBkKTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDEwID0gMC4zNTM1NTMzOTA1OTMyNzRmICogKHgwYyAtIHgwZCk7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxMSA9IDEuNDE0MjEzNTYyMzczMWYqeDA2OworICAgICAgICBjb25zdCBmbG9hdCB4MTIgPSB4MDUgKyB4MDc7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxMyA9IHgwNSAtIHgwNzsKKyAgICAgICAgY29uc3QgZmxvYXQgeDE0ID0gMC4zNTM1NTMzOTA1OTMyNzRmICogKHgxMSArIHgxMik7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxNSA9IDAuMzUzNTUzMzkwNTkzMjc0ZiAqICh4MTEgLSB4MTIpOworICAgICAgICBjb25zdCBmbG9hdCB4MTYgPSAwLjVmKngxMzsKKyAgICAgICAgZHN0WzAqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgMCpkc3Rfc3RyaWRlYV0gOiAwKSArIDAuMjVmICogKHgwOSArIHgwYikgKyAwLjM1MzU1MzM5MDU5MzI3NGYqeDBhOworICAgICAgICBkc3RbMSpkc3Rfc3RyaWRlYV0gPSAoYWRkID8gZHN0WyAxKmRzdF9zdHJpZGVhXSA6IDApICsgMC43MDcxMDY3ODExODY1NDdmICogKHgwZiArIHgxNSk7CisgICAgICAgIGRzdFsyKmRzdF9zdHJpZGVhXSA9IChhZGQgPyBkc3RbIDIqZHN0X3N0cmlkZWFdIDogMCkgKyAwLjcwNzEwNjc4MTE4NjU0N2YgKiAoeDBmIC0geDE1KTsKKyAgICAgICAgZHN0WzMqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgMypkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MGUgKyB4MTYpOworICAgICAgICBkc3RbNCpkc3Rfc3RyaWRlYV0gPSAoYWRkID8gZHN0WyA0KmRzdF9zdHJpZGVhXSA6IDApICsgMC43MDcxMDY3ODExODY1NDdmICogKHgwZSAtIHgxNik7CisgICAgICAgIGRzdFs1KmRzdF9zdHJpZGVhXSA9IChhZGQgPyBkc3RbIDUqZHN0X3N0cmlkZWFdIDogMCkgKyAwLjcwNzEwNjc4MTE4NjU0N2YgKiAoeDEwIC0geDE0KTsKKyAgICAgICAgZHN0WzYqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgNipkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MTAgKyB4MTQpOworICAgICAgICBkc3RbNypkc3Rfc3RyaWRlYV0gPSAoYWRkID8gZHN0WyA3KmRzdF9zdHJpZGVhXSA6IDApICsgMC4yNWYgKiAoeDA5ICsgeDBiKSAtIDAuMzUzNTUzMzkwNTkzMjc0Zip4MGE7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlYjsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGViOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBhdl9hbHdheXNfaW5saW5lIGZkY3QxNl8xZChmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGVhLCBpbnQgZHN0X3N0cmlkZWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZWEsIGludCBzcmNfc3RyaWRlYikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHgwMCA9IHNyY1sgMCpzcmNfc3RyaWRlYV0gKyBzcmNbMTUqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MDEgPSBzcmNbIDEqc3JjX3N0cmlkZWFdICsgc3JjWzE0KnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDAyID0gc3JjWyAyKnNyY19zdHJpZGVhXSArIHNyY1sxMypzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwMyA9IHNyY1sgMypzcmNfc3RyaWRlYV0gKyBzcmNbMTIqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MDQgPSBzcmNbIDQqc3JjX3N0cmlkZWFdICsgc3JjWzExKnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDA1ID0gc3JjWyA1KnNyY19zdHJpZGVhXSArIHNyY1sxMCpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwNiA9IHNyY1sgNipzcmNfc3RyaWRlYV0gKyBzcmNbIDkqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MDcgPSBzcmNbIDcqc3JjX3N0cmlkZWFdICsgc3JjWyA4KnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDA4ID0gc3JjWyAwKnNyY19zdHJpZGVhXSAtIHNyY1sxNSpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwOSA9IHNyY1sgMSpzcmNfc3RyaWRlYV0gLSBzcmNbMTQqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MGEgPSBzcmNbIDIqc3JjX3N0cmlkZWFdIC0gc3JjWzEzKnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDBiID0gc3JjWyAzKnNyY19zdHJpZGVhXSAtIHNyY1sxMipzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwYyA9IHNyY1sgNCpzcmNfc3RyaWRlYV0gLSBzcmNbMTEqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MGQgPSBzcmNbIDUqc3JjX3N0cmlkZWFdIC0gc3JjWzEwKnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDBlID0gc3JjWyA2KnNyY19zdHJpZGVhXSAtIHNyY1sgOSpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwZiA9IHNyY1sgNypzcmNfc3RyaWRlYV0gLSBzcmNbIDgqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MTAgPSB4MDAgKyB4MDc7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxMSA9IHgwMSArIHgwNjsKKyAgICAgICAgY29uc3QgZmxvYXQgeDEyID0geDAyICsgeDA1OworICAgICAgICBjb25zdCBmbG9hdCB4MTMgPSB4MDMgKyB4MDQ7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxNCA9IHgwMCAtIHgwNzsKKyAgICAgICAgY29uc3QgZmxvYXQgeDE1ID0geDAxIC0geDA2OworICAgICAgICBjb25zdCBmbG9hdCB4MTYgPSB4MDIgLSB4MDU7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxNyA9IHgwMyAtIHgwNDsKKyAgICAgICAgY29uc3QgZmxvYXQgeDE4ID0geDEwICsgeDEzOworICAgICAgICBjb25zdCBmbG9hdCB4MTkgPSB4MTEgKyB4MTI7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxYSA9IHgxMCAtIHgxMzsKKyAgICAgICAgY29uc3QgZmxvYXQgeDFiID0geDExIC0geDEyOworICAgICAgICBjb25zdCBmbG9hdCB4MWMgPSAgIDEuMzg3MDM5ODQ1MzIyMTVmKngxNCArIDAuMjc1ODk5Mzc5MjgyOTQzZip4MTc7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxZCA9ICAgMS4xNzU4NzU2MDI0MTkzNmYqeDE1ICsgMC43ODU2OTQ5NTgzODcxMDJmKngxNjsKKyAgICAgICAgY29uc3QgZmxvYXQgeDFlID0gLTAuNzg1Njk0OTU4Mzg3MTAyZip4MTUgKyAxLjE3NTg3NTYwMjQxOTM2ZiAqeDE2OworICAgICAgICBjb25zdCBmbG9hdCB4MWYgPSAgMC4yNzU4OTkzNzkyODI5NDNmKngxNCAtIDEuMzg3MDM5ODQ1MzIyMTVmICp4MTc7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyMCA9IDAuMjVmICogKHgxYyAtIHgxZCk7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyMSA9IDAuMjVmICogKHgxZSAtIHgxZik7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyMiA9ICAxLjQwNzQwMzczNzUyNjM4ZiAqeDA4ICsgMC4xMzg2MTcxNjkxOTkwOTFmKngwZjsKKyAgICAgICAgY29uc3QgZmxvYXQgeDIzID0gIDEuMzUzMzE4MDAxMTc0MzVmICp4MDkgKyAwLjQxMDUyNDUyNzUyMjM1N2YqeDBlOworICAgICAgICBjb25zdCBmbG9hdCB4MjQgPSAgMS4yNDcyMjUwMTI5ODY2N2YgKngwYSArIDAuNjY2NjU1NjU4NDc3NzQ3Zip4MGQ7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyNSA9ICAxLjA5MzIwMTg2NzAwMTc2ZiAqeDBiICsgMC44OTcxNjc1ODYzNDI2MzZmKngwYzsKKyAgICAgICAgY29uc3QgZmxvYXQgeDI2ID0gLTAuODk3MTY3NTg2MzQyNjM2Zip4MGIgKyAxLjA5MzIwMTg2NzAwMTc2ZiAqeDBjOworICAgICAgICBjb25zdCBmbG9hdCB4MjcgPSAgMC42NjY2NTU2NTg0Nzc3NDdmKngwYSAtIDEuMjQ3MjI1MDEyOTg2NjdmICp4MGQ7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyOCA9IC0wLjQxMDUyNDUyNzUyMjM1N2YqeDA5ICsgMS4zNTMzMTgwMDExNzQzNWYgKngwZTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDI5ID0gIDAuMTM4NjE3MTY5MTk5MDkxZip4MDggLSAxLjQwNzQwMzczNzUyNjM4ZiAqeDBmOworICAgICAgICBjb25zdCBmbG9hdCB4MmEgPSB4MjIgKyB4MjU7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyYiA9IHgyMyArIHgyNDsKKyAgICAgICAgY29uc3QgZmxvYXQgeDJjID0geDIyIC0geDI1OworICAgICAgICBjb25zdCBmbG9hdCB4MmQgPSB4MjMgLSB4MjQ7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyZSA9IDAuMjVmICogKHgyYSAtIHgyYik7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyZiA9IDAuMzI2NjQwNzQxMjE5MDk0Zip4MmMgKyAwLjEzNTI5OTAyNTAzNjU0OWYqeDJkOworICAgICAgICBjb25zdCBmbG9hdCB4MzAgPSAwLjEzNTI5OTAyNTAzNjU0OWYqeDJjIC0gMC4zMjY2NDA3NDEyMTkwOTRmKngyZDsKKyAgICAgICAgY29uc3QgZmxvYXQgeDMxID0geDI2ICsgeDI5OworICAgICAgICBjb25zdCBmbG9hdCB4MzIgPSB4MjcgKyB4Mjg7CisgICAgICAgIGNvbnN0IGZsb2F0IHgzMyA9IHgyNiAtIHgyOTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDM0ID0geDI3IC0geDI4OworICAgICAgICBjb25zdCBmbG9hdCB4MzUgPSAwLjI1ZiAqICh4MzEgLSB4MzIpOworICAgICAgICBjb25zdCBmbG9hdCB4MzYgPSAwLjMyNjY0MDc0MTIxOTA5NGYqeDMzICsgMC4xMzUyOTkwMjUwMzY1NDlmKngzNDsKKyAgICAgICAgY29uc3QgZmxvYXQgeDM3ID0gMC4xMzUyOTkwMjUwMzY1NDlmKngzMyAtIDAuMzI2NjQwNzQxMjE5MDk0Zip4MzQ7CisgICAgICAgIGRzdFsgMCpkc3Rfc3RyaWRlYV0gPSAwLjI1ZiAqICh4MTggKyB4MTkpOworICAgICAgICBkc3RbIDEqZHN0X3N0cmlkZWFdID0gMC4yNWYgKiAoeDJhICsgeDJiKTsKKyAgICAgICAgZHN0WyAyKmRzdF9zdHJpZGVhXSA9IDAuMjVmICogKHgxYyArIHgxZCk7CisgICAgICAgIGRzdFsgMypkc3Rfc3RyaWRlYV0gPSAwLjcwNzEwNjc4MTE4NjU0N2YgKiAoeDJmIC0geDM3KTsKKyAgICAgICAgZHN0WyA0KmRzdF9zdHJpZGVhXSA9IDAuMzI2NjQwNzQxMjE5MDk0Zip4MWEgKyAwLjEzNTI5OTAyNTAzNjU0OWYqeDFiOworICAgICAgICBkc3RbIDUqZHN0X3N0cmlkZWFdID0gMC43MDcxMDY3ODExODY1NDdmICogKHgyZiArIHgzNyk7CisgICAgICAgIGRzdFsgNipkc3Rfc3RyaWRlYV0gPSAwLjcwNzEwNjc4MTE4NjU0N2YgKiAoeDIwIC0geDIxKTsKKyAgICAgICAgZHN0WyA3KmRzdF9zdHJpZGVhXSA9IDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MmUgKyB4MzUpOworICAgICAgICBkc3RbIDgqZHN0X3N0cmlkZWFdID0gMC4yNWYgKiAoeDE4IC0geDE5KTsKKyAgICAgICAgZHN0WyA5KmRzdF9zdHJpZGVhXSA9IDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MmUgLSB4MzUpOworICAgICAgICBkc3RbMTAqZHN0X3N0cmlkZWFdID0gMC43MDcxMDY3ODExODY1NDdmICogKHgyMCArIHgyMSk7CisgICAgICAgIGRzdFsxMSpkc3Rfc3RyaWRlYV0gPSAwLjcwNzEwNjc4MTE4NjU0N2YgKiAoeDMwIC0geDM2KTsKKyAgICAgICAgZHN0WzEyKmRzdF9zdHJpZGVhXSA9IDAuMTM1Mjk5MDI1MDM2NTQ5Zip4MWEgLSAwLjMyNjY0MDc0MTIxOTA5NGYqeDFiOworICAgICAgICBkc3RbMTMqZHN0X3N0cmlkZWFdID0gMC43MDcxMDY3ODExODY1NDdmICogKHgzMCArIHgzNik7CisgICAgICAgIGRzdFsxNCpkc3Rfc3RyaWRlYV0gPSAwLjI1ZiAqICh4MWUgKyB4MWYpOworICAgICAgICBkc3RbMTUqZHN0X3N0cmlkZWFdID0gMC4yNWYgKiAoeDMxICsgeDMyKTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGViOworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZWI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhdl9hbHdheXNfaW5saW5lIGlkY3QxNl8xZChmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGVhLCBpbnQgZHN0X3N0cmlkZWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZWEsIGludCBzcmNfc3RyaWRlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBjb25zdCBmbG9hdCB4MDAgPSAgMS40MTQyMTM1NjIzNzMxZiAgKnNyY1sgMCpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwMSA9ICAxLjQwNzQwMzczNzUyNjM4ZiAqc3JjWyAxKnNyY19zdHJpZGVhXSArIDAuMTM4NjE3MTY5MTk5MDkxZipzcmNbMTUqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MDIgPSAgMS4zODcwMzk4NDUzMjIxNWYgKnNyY1sgMipzcmNfc3RyaWRlYV0gKyAwLjI3NTg5OTM3OTI4Mjk0M2Yqc3JjWzE0KnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDAzID0gIDEuMzUzMzE4MDAxMTc0MzVmICpzcmNbIDMqc3JjX3N0cmlkZWFdICsgMC40MTA1MjQ1Mjc1MjIzNTdmKnNyY1sxMypzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwNCA9ICAxLjMwNjU2Mjk2NDg3NjM4ZiAqc3JjWyA0KnNyY19zdHJpZGVhXSArIDAuNTQxMTk2MTAwMTQ2MTk3ZipzcmNbMTIqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MDUgPSAgMS4yNDcyMjUwMTI5ODY2N2YgKnNyY1sgNSpzcmNfc3RyaWRlYV0gKyAwLjY2NjY1NTY1ODQ3Nzc0N2Yqc3JjWzExKnNyY19zdHJpZGVhXTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDA2ID0gIDEuMTc1ODc1NjAyNDE5MzZmICpzcmNbIDYqc3JjX3N0cmlkZWFdICsgMC43ODU2OTQ5NTgzODcxMDJmKnNyY1sxMCpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwNyA9ICAxLjA5MzIwMTg2NzAwMTc2ZiAqc3JjWyA3KnNyY19zdHJpZGVhXSArIDAuODk3MTY3NTg2MzQyNjM2ZipzcmNbIDkqc3JjX3N0cmlkZWFdOworICAgICAgICBjb25zdCBmbG9hdCB4MDggPSAgMS40MTQyMTM1NjIzNzMxZiAgKnNyY1sgOCpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwOSA9IC0wLjg5NzE2NzU4NjM0MjYzNmYqc3JjWyA3KnNyY19zdHJpZGVhXSArIDEuMDkzMjAxODY3MDAxNzZmKnNyY1sgOSpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwYSA9ICAwLjc4NTY5NDk1ODM4NzEwMmYqc3JjWyA2KnNyY19zdHJpZGVhXSAtIDEuMTc1ODc1NjAyNDE5MzZmKnNyY1sxMCpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwYiA9IC0wLjY2NjY1NTY1ODQ3Nzc0N2Yqc3JjWyA1KnNyY19zdHJpZGVhXSArIDEuMjQ3MjI1MDEyOTg2NjdmKnNyY1sxMSpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwYyA9ICAwLjU0MTE5NjEwMDE0NjE5N2Yqc3JjWyA0KnNyY19zdHJpZGVhXSAtIDEuMzA2NTYyOTY0ODc2MzhmKnNyY1sxMipzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwZCA9IC0wLjQxMDUyNDUyNzUyMjM1N2Yqc3JjWyAzKnNyY19zdHJpZGVhXSArIDEuMzUzMzE4MDAxMTc0MzVmKnNyY1sxMypzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwZSA9ICAwLjI3NTg5OTM3OTI4Mjk0M2Yqc3JjWyAyKnNyY19zdHJpZGVhXSAtIDEuMzg3MDM5ODQ1MzIyMTVmKnNyY1sxNCpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgwZiA9IC0wLjEzODYxNzE2OTE5OTA5MWYqc3JjWyAxKnNyY19zdHJpZGVhXSArIDEuNDA3NDAzNzM3NTI2MzhmKnNyY1sxNSpzcmNfc3RyaWRlYV07CisgICAgICAgIGNvbnN0IGZsb2F0IHgxMiA9IHgwMCArIHgwODsKKyAgICAgICAgY29uc3QgZmxvYXQgeDEzID0geDAxICsgeDA3OworICAgICAgICBjb25zdCBmbG9hdCB4MTQgPSB4MDIgKyB4MDY7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxNSA9IHgwMyArIHgwNTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDE2ID0gMS40MTQyMTM1NjIzNzMxZip4MDQ7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxNyA9IHgwMCAtIHgwODsKKyAgICAgICAgY29uc3QgZmxvYXQgeDE4ID0geDAxIC0geDA3OworICAgICAgICBjb25zdCBmbG9hdCB4MTkgPSB4MDIgLSB4MDY7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxYSA9IHgwMyAtIHgwNTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDFkID0geDEyICsgeDE2OworICAgICAgICBjb25zdCBmbG9hdCB4MWUgPSB4MTMgKyB4MTU7CisgICAgICAgIGNvbnN0IGZsb2F0IHgxZiA9IDEuNDE0MjEzNTYyMzczMWYqeDE0OworICAgICAgICBjb25zdCBmbG9hdCB4MjAgPSB4MTIgLSB4MTY7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyMSA9IHgxMyAtIHgxNTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDIyID0gMC4yNWYgKiAoeDFkIC0geDFmKTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDIzID0gMC4yNWYgKiAoeDIwICsgeDIxKTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDI0ID0gMC4yNWYgKiAoeDIwIC0geDIxKTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDI1ID0gMS40MTQyMTM1NjIzNzMxZip4MTc7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyNiA9IDEuMzA2NTYyOTY0ODc2MzhmKngxOCArIDAuNTQxMTk2MTAwMTQ2MTk3Zip4MWE7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyNyA9IDEuNDE0MjEzNTYyMzczMWYqeDE5OworICAgICAgICBjb25zdCBmbG9hdCB4MjggPSAtMC41NDExOTYxMDAxNDYxOTdmKngxOCArIDEuMzA2NTYyOTY0ODc2MzhmKngxYTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDI5ID0gMC4xNzY3NzY2OTUyOTY2MzdmICogKHgyNSArIHgyNykgKyAwLjI1Zip4MjY7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyYSA9IDAuMjVmICogKHgyNSAtIHgyNyk7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyYiA9IDAuMTc2Nzc2Njk1Mjk2NjM3ZiAqICh4MjUgKyB4MjcpIC0gMC4yNWYqeDI2OworICAgICAgICBjb25zdCBmbG9hdCB4MmMgPSAwLjM1MzU1MzM5MDU5MzI3NGYqeDI4OworICAgICAgICBjb25zdCBmbG9hdCB4MWIgPSAwLjcwNzEwNjc4MTE4NjU0N2YgKiAoeDJhIC0geDJjKTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDFjID0gMC43MDcxMDY3ODExODY1NDdmICogKHgyYSArIHgyYyk7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyZCA9IDEuNDE0MjEzNTYyMzczMWYqeDBjOworICAgICAgICBjb25zdCBmbG9hdCB4MmUgPSB4MGIgKyB4MGQ7CisgICAgICAgIGNvbnN0IGZsb2F0IHgyZiA9IHgwYSArIHgwZTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDMwID0geDA5ICsgeDBmOworICAgICAgICBjb25zdCBmbG9hdCB4MzEgPSB4MDkgLSB4MGY7CisgICAgICAgIGNvbnN0IGZsb2F0IHgzMiA9IHgwYSAtIHgwZTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDMzID0geDBiIC0geDBkOworICAgICAgICBjb25zdCBmbG9hdCB4MzcgPSAxLjQxNDIxMzU2MjM3MzFmKngyZDsKKyAgICAgICAgY29uc3QgZmxvYXQgeDM4ID0gMS4zMDY1NjI5NjQ4NzYzOGYqeDJlICsgMC41NDExOTYxMDAxNDYxOTdmKngzMDsKKyAgICAgICAgY29uc3QgZmxvYXQgeDM5ID0gMS40MTQyMTM1NjIzNzMxZip4MmY7CisgICAgICAgIGNvbnN0IGZsb2F0IHgzYSA9IC0wLjU0MTE5NjEwMDE0NjE5N2YqeDJlICsgMS4zMDY1NjI5NjQ4NzYzOGYqeDMwOworICAgICAgICBjb25zdCBmbG9hdCB4M2IgPSAwLjE3Njc3NjY5NTI5NjYzN2YgKiAoeDM3ICsgeDM5KSArIDAuMjVmKngzODsKKyAgICAgICAgY29uc3QgZmxvYXQgeDNjID0gMC4yNWYgKiAoeDM3IC0geDM5KTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDNkID0gMC4xNzY3NzY2OTUyOTY2MzdmICogKHgzNyArIHgzOSkgLSAwLjI1Zip4Mzg7CisgICAgICAgIGNvbnN0IGZsb2F0IHgzZSA9IDAuMzUzNTUzMzkwNTkzMjc0Zip4M2E7CisgICAgICAgIGNvbnN0IGZsb2F0IHgzNCA9IDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4M2MgLSB4M2UpOworICAgICAgICBjb25zdCBmbG9hdCB4MzUgPSAwLjcwNzEwNjc4MTE4NjU0N2YgKiAoeDNjICsgeDNlKTsKKyAgICAgICAgY29uc3QgZmxvYXQgeDNmID0gMS40MTQyMTM1NjIzNzMxZip4MzI7CisgICAgICAgIGNvbnN0IGZsb2F0IHg0MCA9IHgzMSArIHgzMzsKKyAgICAgICAgY29uc3QgZmxvYXQgeDQxID0geDMxIC0geDMzOworICAgICAgICBjb25zdCBmbG9hdCB4NDIgPSAwLjI1ZiAqICh4M2YgKyB4NDApOworICAgICAgICBjb25zdCBmbG9hdCB4NDMgPSAwLjI1ZiAqICh4M2YgLSB4NDApOworICAgICAgICBjb25zdCBmbG9hdCB4NDQgPSAwLjM1MzU1MzM5MDU5MzI3NGYqeDQxOworICAgICAgICBkc3RbIDAqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgMCpkc3Rfc3RyaWRlYV0gOiAwKSArIDAuMTc2Nzc2Njk1Mjk2NjM3ZiAqICh4MWQgKyB4MWYpICsgMC4yNWYqeDFlOworICAgICAgICBkc3RbIDEqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgMSpkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MjkgKyB4M2QpOworICAgICAgICBkc3RbIDIqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgMipkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MjkgLSB4M2QpOworICAgICAgICBkc3RbIDMqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgMypkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MjMgLSB4NDMpOworICAgICAgICBkc3RbIDQqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgNCpkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MjMgKyB4NDMpOworICAgICAgICBkc3RbIDUqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgNSpkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MWIgLSB4MzUpOworICAgICAgICBkc3RbIDYqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgNipkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MWIgKyB4MzUpOworICAgICAgICBkc3RbIDcqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgNypkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MjIgKyB4NDQpOworICAgICAgICBkc3RbIDgqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgOCpkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MjIgLSB4NDQpOworICAgICAgICBkc3RbIDkqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsgOSpkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MWMgKyB4MzQpOworICAgICAgICBkc3RbMTAqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsxMCpkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MWMgLSB4MzQpOworICAgICAgICBkc3RbMTEqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsxMSpkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MjQgKyB4NDIpOworICAgICAgICBkc3RbMTIqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsxMipkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MjQgLSB4NDIpOworICAgICAgICBkc3RbMTMqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsxMypkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MmIgLSB4M2IpOworICAgICAgICBkc3RbMTQqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsxNCpkc3Rfc3RyaWRlYV0gOiAwKSArIDAuNzA3MTA2NzgxMTg2NTQ3ZiAqICh4MmIgKyB4M2IpOworICAgICAgICBkc3RbMTUqZHN0X3N0cmlkZWFdID0gKGFkZCA/IGRzdFsxNSpkc3Rfc3RyaWRlYV0gOiAwKSArIDAuMTc2Nzc2Njk1Mjk2NjM3ZiAqICh4MWQgKyB4MWYpIC0gMC4yNWYqeDFlOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZWI7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlYjsKKyAgICB9Cit9CisKKyNkZWZpbmUgREVGX0ZJTFRFUl9GUkVRX0ZVTkNTKGJzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmaWx0ZXJfZnJlcV8jI2JzaXplKGNvbnN0IGZsb2F0ICpzcmMsIGludCBzcmNfbGluZXNpemUsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkV4cHIgKmV4cHIsIGRvdWJsZSAqdmFyX3ZhbHVlcywgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaWdtYV90aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHRtcF9ibG9jazEpW2JzaXplICogYnNpemVdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgdG1wX2Jsb2NrMilbYnNpemUgKiBic2l6ZV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGZvcndhcmQgRENUICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmRjdCMjYnNpemUjI18xZCh0bXBfYmxvY2sxLCBzcmMsIDEsIGJzaXplLCAxLCBzcmNfbGluZXNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZGN0IyNic2l6ZSMjXzFkKHRtcF9ibG9jazIsIHRtcF9ibG9jazEsIGJzaXplLCAxLCBic2l6ZSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGJzaXplKmJzaXplOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmxvYXQgKmIgPSAmdG1wX2Jsb2NrMltpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBmcmVxdWVuY3kgZmlsdGVyaW5nICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChleHByKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZhcl92YWx1ZXNbVkFSX0NdID0gRkZBQlMoKmIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKmIgKj0gYXZfZXhwcl9ldmFsKGV4cHIsIHZhcl92YWx1ZXMsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChGRkFCUygqYikgPCBzaWdtYV90aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpiID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogaW52ZXJzZSBEQ1QgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZGN0IyNic2l6ZSMjXzFkKHRtcF9ibG9jazEsIHRtcF9ibG9jazIsIDEsIGJzaXplLCAxLCBic2l6ZSwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlkY3QjI2JzaXplIyNfMWQoZHN0LCB0bXBfYmxvY2sxLCBkc3RfbGluZXNpemUsIDEsIGJzaXplLCAxLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgZmlsdGVyX2ZyZXFfc2lnbWFfIyNic2l6ZShEQ1Rkbm9pekNvbnRleHQgKnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMsIGludCBzcmNfbGluZXNpemUsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwgaW50IHRocmVhZF9pZCkgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmlsdGVyX2ZyZXFfIyNic2l6ZShzcmMsIHNyY19saW5lc2l6ZSwgZHN0LCBkc3RfbGluZXNpemUsIE5VTEwsIE5VTEwsIHMtPnRoKTsgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBmaWx0ZXJfZnJlcV9leHByXyMjYnNpemUoRENUZG5vaXpDb250ZXh0ICpzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkc3QsIGludCBkc3RfbGluZXNpemUsIGludCB0aHJlYWRfaWQpICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaWx0ZXJfZnJlcV8jI2JzaXplKHNyYywgc3JjX2xpbmVzaXplLCBkc3QsIGRzdF9saW5lc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZXhwclt0aHJlYWRfaWRdLCBzLT52YXJfdmFsdWVzW3RocmVhZF9pZF0sIDApOyAgICAgICAgICAgICAgICAgICBcCit9CisKK0RFRl9GSUxURVJfRlJFUV9GVU5DUyg4KQorREVGX0ZJTFRFUl9GUkVRX0ZVTkNTKDE2KQorCisjZGVmaW5lIERDVDNYM18wXzAgIDAuNTc3MzUwMjY5MTg5NjI1OGYgLyogIDEvc3FydCgzKSAqLworI2RlZmluZSBEQ1QzWDNfMF8xICAwLjU3NzM1MDI2OTE4OTYyNThmIC8qICAxL3NxcnQoMykgKi8KKyNkZWZpbmUgRENUM1gzXzBfMiAgMC41NzczNTAyNjkxODk2MjU4ZiAvKiAgMS9zcXJ0KDMpICovCisjZGVmaW5lIERDVDNYM18xXzAgIDAuNzA3MTA2NzgxMTg2NTQ3NWYgLyogIDEvc3FydCgyKSAqLworI2RlZmluZSBEQ1QzWDNfMV8yIC0wLjcwNzEwNjc4MTE4NjU0NzVmIC8qIC0xL3NxcnQoMikgKi8KKyNkZWZpbmUgRENUM1gzXzJfMCAgMC40MDgyNDgyOTA0NjM4NjMxZiAvKiAgMS9zcXJ0KDYpICovCisjZGVmaW5lIERDVDNYM18yXzEgLTAuODE2NDk2NTgwOTI3NzI2MWYgLyogLTIvc3FydCg2KSAqLworI2RlZmluZSBEQ1QzWDNfMl8yICAwLjQwODI0ODI5MDQ2Mzg2MzFmIC8qICAxL3NxcnQoNikgKi8KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBjb2xvcl9kZWNvcnJlbGF0aW9uKGZsb2F0ICoqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHIsIGludCBnLCBpbnQgYikKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBmbG9hdCAqZHN0cF9yID0gZHN0WzBdOworICAgIGZsb2F0ICpkc3RwX2cgPSBkc3RbMV07CisgICAgZmxvYXQgKmRzdHBfYiA9IGRzdFsyXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCA9IHNyYzsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBkc3RwX3JbeF0gPSBzcmNwW3JdICogRENUM1gzXzBfMCArIHNyY3BbZ10gKiBEQ1QzWDNfMF8xICsgc3JjcFtiXSAqIERDVDNYM18wXzI7CisgICAgICAgICAgICBkc3RwX2dbeF0gPSBzcmNwW3JdICogRENUM1gzXzFfMCArICAgICAgICAgICAgICAgICAgICAgICAgc3JjcFtiXSAqIERDVDNYM18xXzI7CisgICAgICAgICAgICBkc3RwX2JbeF0gPSBzcmNwW3JdICogRENUM1gzXzJfMCArIHNyY3BbZ10gKiBEQ1QzWDNfMl8xICsgc3JjcFtiXSAqIERDVDNYM18yXzI7CisgICAgICAgICAgICBzcmNwICs9IDM7CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgZHN0cF9yICs9IGRzdF9saW5lc2l6ZTsKKyAgICAgICAgZHN0cF9nICs9IGRzdF9saW5lc2l6ZTsKKyAgICAgICAgZHN0cF9iICs9IGRzdF9saW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgY29sb3JfY29ycmVsYXRpb24odWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKnNyYywgaW50IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgciwgaW50IGcsIGludCBiKQoreworICAgIGludCB4LCB5OworICAgIGNvbnN0IGZsb2F0ICpzcmNfciA9IHNyY1swXTsKKyAgICBjb25zdCBmbG9hdCAqc3JjX2cgPSBzcmNbMV07CisgICAgY29uc3QgZmxvYXQgKnNyY19iID0gc3JjWzJdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICB1aW50OF90ICpkc3RwID0gZHN0OworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGRzdHBbcl0gPSBhdl9jbGlwX3VpbnQ4KHNyY19yW3hdICogRENUM1gzXzBfMCArIHNyY19nW3hdICogRENUM1gzXzFfMCArIHNyY19iW3hdICogRENUM1gzXzJfMCk7CisgICAgICAgICAgICBkc3RwW2ddID0gYXZfY2xpcF91aW50OChzcmNfclt4XSAqIERDVDNYM18wXzEgKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYlt4XSAqIERDVDNYM18yXzEpOworICAgICAgICAgICAgZHN0cFtiXSA9IGF2X2NsaXBfdWludDgoc3JjX3JbeF0gKiBEQ1QzWDNfMF8yICsgc3JjX2dbeF0gKiBEQ1QzWDNfMV8yICsgc3JjX2JbeF0gKiBEQ1QzWDNfMl8yKTsKKyAgICAgICAgICAgIGRzdHAgKz0gMzsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gZHN0X2xpbmVzaXplOworICAgICAgICBzcmNfciArPSBzcmNfbGluZXNpemU7CisgICAgICAgIHNyY19nICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgc3JjX2IgKz0gc3JjX2xpbmVzaXplOworICAgIH0KK30KKworI2RlZmluZSBERUNMQVJFX0NPTE9SX0ZVTkNTKG5hbWUsIHIsIGcsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgY29sb3JfZGVjb3JyZWxhdGlvbl8jI25hbWUoZmxvYXQgKipkc3QsIGludCBkc3RfbGluZXNpemUsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbG9yX2RlY29ycmVsYXRpb24oZHN0LCBkc3RfbGluZXNpemUsIHNyYywgc3JjX2xpbmVzaXplLCB3LCBoLCByLCBnLCBiKTsgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgY29sb3JfY29ycmVsYXRpb25fIyNuYW1lKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqc3JjLCBpbnQgc3JjX2xpbmVzaXplLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbG9yX2NvcnJlbGF0aW9uKGRzdCwgZHN0X2xpbmVzaXplLCBzcmMsIHNyY19saW5lc2l6ZSwgdywgaCwgciwgZywgYik7ICAgICAgICAgXAorfQorCitERUNMQVJFX0NPTE9SX0ZVTkNTKHJnYiwgMCwgMSwgMikKK0RFQ0xBUkVfQ09MT1JfRlVOQ1MoYmdyLCAyLCAxLCAwKQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIERDVGRub2l6Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgeCwgeSwgYngsIGJ5LCBsaW5lc2l6ZSwgKml3ZWlnaHRzLCBtYXhfc2xpY2VfaCwgc2xpY2VfaDsKKyAgICBjb25zdCBpbnQgYnNpemUgPSAxIDw8IHMtPm47CisKKyAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorICAgICAgICBzLT5jb2xvcl9kZWNvcnJlbGF0aW9uID0gY29sb3JfZGVjb3JyZWxhdGlvbl9iZ3I7CisgICAgICAgIHMtPmNvbG9yX2NvcnJlbGF0aW9uICAgPSBjb2xvcl9jb3JyZWxhdGlvbl9iZ3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgcy0+Y29sb3JfZGVjb3JyZWxhdGlvbiA9IGNvbG9yX2RlY29ycmVsYXRpb25fcmdiOworICAgICAgICBzLT5jb2xvcl9jb3JyZWxhdGlvbiAgID0gY29sb3JfY29ycmVsYXRpb25fcmdiOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIHMtPnByX3dpZHRoICA9IGlubGluay0+dyAtIChpbmxpbmstPncgLSBic2l6ZSkgJSBzLT5zdGVwOworICAgIHMtPnByX2hlaWdodCA9IGlubGluay0+aCAtIChpbmxpbmstPmggLSBic2l6ZSkgJSBzLT5zdGVwOworICAgIGlmIChzLT5wcl93aWR0aCAhPSBpbmxpbmstPncpCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhlIGxhc3QgJWQgaG9yaXpvbnRhbCBwaXhlbHMgd29uJ3QgYmUgZGVub2lzZWRcbiIsCisgICAgICAgICAgICAgICBpbmxpbmstPncgLSBzLT5wcl93aWR0aCk7CisgICAgaWYgKHMtPnByX2hlaWdodCAhPSBpbmxpbmstPmgpCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhlIGxhc3QgJWQgdmVydGljYWwgcGl4ZWxzIHdvbid0IGJlIGRlbm9pc2VkXG4iLAorICAgICAgICAgICAgICAgaW5saW5rLT5oIC0gcy0+cHJfaGVpZ2h0KTsKKworICAgIG1heF9zbGljZV9oID0gcy0+cHJfaGVpZ2h0IC8gKChzLT5ic2l6ZSAtIDEpICogMik7CisgICAgcy0+bmJfdGhyZWFkcyA9IEZGTUlOMyhNQVhfVEhSRUFEUywgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcywgbWF4X3NsaWNlX2gpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgInRocmVhZHM6IFttYXg9JWQgaG1heD0lZCB1c2VyPSVkXSA9PiAlZFxuIiwKKyAgICAgICAgICAgTUFYX1RIUkVBRFMsIG1heF9zbGljZV9oLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzLCBzLT5uYl90aHJlYWRzKTsKKworICAgIHMtPnBfbGluZXNpemUgPSBsaW5lc2l6ZSA9IEZGQUxJR04ocy0+cHJfd2lkdGgsIDMyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIHMtPmNidWZbaV1bMF0gPSBhdl9tYWxsb2MobGluZXNpemUgKiBzLT5wcl9oZWlnaHQgKiBzaXplb2YoKnMtPmNidWZbaV1bMF0pKTsKKyAgICAgICAgcy0+Y2J1ZltpXVsxXSA9IGF2X21hbGxvYyhsaW5lc2l6ZSAqIHMtPnByX2hlaWdodCAqIHNpemVvZigqcy0+Y2J1ZltpXVsxXSkpOworICAgICAgICBzLT5jYnVmW2ldWzJdID0gYXZfbWFsbG9jKGxpbmVzaXplICogcy0+cHJfaGVpZ2h0ICogc2l6ZW9mKCpzLT5jYnVmW2ldWzJdKSk7CisgICAgICAgIGlmICghcy0+Y2J1ZltpXVswXSB8fCAhcy0+Y2J1ZltpXVsxXSB8fCAhcy0+Y2J1ZltpXVsyXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLyogZXZhbCBleHByZXNzaW9ucyBhcmUgcHJvYmFibHkgbm90IHRocmVhZCBzYWZlIHdoZW4gdGhlIGV2YWwgaW50ZXJuYWwKKyAgICAgKiBzdGF0ZSBjYW4gYmUgY2hhbmdlZCAodHlwaWNhbGx5IHRocm91Z2ggbG9hZCAmIHN0b3JlIG9wZXJhdGlvbnMpICovCisgICAgaWYgKHMtPmV4cHJfc3RyKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl90aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgIGludCByZXQgPSBhdl9leHByX3BhcnNlKCZzLT5leHByW2ldLCBzLT5leHByX3N0ciwgdmFyX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBlYWNoIHNsaWNlIHdpbGwgbmVlZCB0byAocHJlICYgcmUpcHJvY2VzcyB0aGUgdG9wIGFuZCBib3R0b20gYmxvY2sgb2YKKyAgICAgKiB0aGUgcHJldmlvdXMgb25lIGluIGluIGFkZGl0aW9uIHRvIGl0cyBwcm9jZXNzaW5nIGFyZWEuIFRoaXMgaXMgYmVjYXVzZQorICAgICAqIGVhY2ggcGl4ZWwgaXMgYXZlcmFnZWQgYnkgYWxsIHRoZSBzdXJyb3VuZGluZyBibG9ja3MgKi8KKyAgICBzbGljZV9oID0gKGludCljZWlsZihzLT5wcl9oZWlnaHQgLyBzLT5uYl90aHJlYWRzKSArIChzLT5ic2l6ZSAtIDEpICogMjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfdGhyZWFkczsgaSsrKSB7CisgICAgICAgIHMtPnNsaWNlc1tpXSA9IGF2X21hbGxvY19hcnJheShsaW5lc2l6ZSwgc2xpY2VfaCAqIHNpemVvZigqcy0+c2xpY2VzW2ldKSk7CisgICAgICAgIGlmICghcy0+c2xpY2VzW2ldKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBzLT53ZWlnaHRzID0gYXZfbWFsbG9jKHMtPnByX2hlaWdodCAqIGxpbmVzaXplICogc2l6ZW9mKCpzLT53ZWlnaHRzKSk7CisgICAgaWYgKCFzLT53ZWlnaHRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGl3ZWlnaHRzID0gYXZfY2FsbG9jKHMtPnByX2hlaWdodCwgbGluZXNpemUgKiBzaXplb2YoKml3ZWlnaHRzKSk7CisgICAgaWYgKCFpd2VpZ2h0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgcy0+cHJfaGVpZ2h0IC0gYnNpemUgKyAxOyB5ICs9IHMtPnN0ZXApCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5wcl93aWR0aCAtIGJzaXplICsgMTsgeCArPSBzLT5zdGVwKQorICAgICAgICAgICAgZm9yIChieSA9IDA7IGJ5IDwgYnNpemU7IGJ5KyspCisgICAgICAgICAgICAgICAgZm9yIChieCA9IDA7IGJ4IDwgYnNpemU7IGJ4KyspCisgICAgICAgICAgICAgICAgICAgIGl3ZWlnaHRzWyh5ICsgYnkpKmxpbmVzaXplICsgeCArIGJ4XSsrOworICAgIGZvciAoeSA9IDA7IHkgPCBzLT5wcl9oZWlnaHQ7IHkrKykKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPnByX3dpZHRoOyB4KyspCisgICAgICAgICAgICBzLT53ZWlnaHRzW3kqbGluZXNpemUgKyB4XSA9IDEuIC8gaXdlaWdodHNbeSpsaW5lc2l6ZSArIHhdOworICAgIGF2X2ZyZWUoaXdlaWdodHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIERDVGRub2l6Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPmJzaXplID0gMSA8PCBzLT5uOworICAgIGlmIChzLT5vdmVybGFwID09IC0xKQorICAgICAgICBzLT5vdmVybGFwID0gcy0+YnNpemUgLSAxOworCisgICAgaWYgKHMtPm92ZXJsYXAgPiBzLT5ic2l6ZSAtIDEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk92ZXJsYXAgdmFsdWUgY2FuIG5vdCBleGNlcHQgJWQgIgorICAgICAgICAgICAgICAgIndpdGggYSBibG9jayBzaXplIG9mICVkeCVkXG4iLAorICAgICAgICAgICAgICAgcy0+YnNpemUgLSAxLCBzLT5ic2l6ZSwgcy0+YnNpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChzLT5leHByX3N0cikgeworICAgICAgICBzd2l0Y2ggKHMtPm4pIHsKKyAgICAgICAgY2FzZSAzOiBzLT5maWx0ZXJfZnJlcV9mdW5jID0gZmlsdGVyX2ZyZXFfZXhwcl84OyAgYnJlYWs7CisgICAgICAgIGNhc2UgNDogcy0+ZmlsdGVyX2ZyZXFfZnVuYyA9IGZpbHRlcl9mcmVxX2V4cHJfMTY7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKDApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChzLT5uKSB7CisgICAgICAgIGNhc2UgMzogcy0+ZmlsdGVyX2ZyZXFfZnVuYyA9IGZpbHRlcl9mcmVxX3NpZ21hXzg7ICBicmVhazsKKyAgICAgICAgY2FzZSA0OiBzLT5maWx0ZXJfZnJlcV9mdW5jID0gZmlsdGVyX2ZyZXFfc2lnbWFfMTY7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKDApOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+dGggICA9IHMtPnNpZ21hICogMy47CisgICAgcy0+c3RlcCA9IHMtPmJzaXplIC0gcy0+b3ZlcmxhcDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9CR1IyNCwgQVZfUElYX0ZNVF9SR0IyNCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IFRocmVhZERhdGEgeworICAgIGZsb2F0ICpzcmMsICpkc3Q7Cit9IFRocmVhZERhdGE7CisKK3N0YXRpYyBpbnQgZmlsdGVyX3NsaWNlKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIGludCB4LCB5OworICAgIERDVGRub2l6Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBjb25zdCBpbnQgdyA9IHMtPnByX3dpZHRoOworICAgIGNvbnN0IGludCBoID0gcy0+cHJfaGVpZ2h0OworICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChoICogIGpvYm5yICAgKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCAgID0gKGggKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnRfY3R4ID0gRkZNQVgoc2xpY2Vfc3RhcnQgLSBzLT5ic2l6ZSArIDEsIDApOworICAgIGNvbnN0IGludCBzbGljZV9lbmRfY3R4ICAgPSBGRk1JTihzbGljZV9lbmQsIGggLSBzLT5ic2l6ZSArIDEpOworICAgIGNvbnN0IGludCBzbGljZV9oID0gc2xpY2VfZW5kX2N0eCAtIHNsaWNlX3N0YXJ0X2N0eDsKKyAgICBjb25zdCBpbnQgc3JjX2xpbmVzaXplICAgPSBzLT5wX2xpbmVzaXplOworICAgIGNvbnN0IGludCBkc3RfbGluZXNpemUgICA9IHMtPnBfbGluZXNpemU7CisgICAgY29uc3QgaW50IHNsaWNlX2xpbmVzaXplID0gcy0+cF9saW5lc2l6ZTsKKyAgICBmbG9hdCAqZHN0OworICAgIGNvbnN0IGZsb2F0ICpzcmMgPSB0ZC0+c3JjICsgc2xpY2Vfc3RhcnRfY3R4ICogc3JjX2xpbmVzaXplOworICAgIGNvbnN0IGZsb2F0ICp3ZWlnaHRzID0gcy0+d2VpZ2h0cyArIHNsaWNlX3N0YXJ0ICogZHN0X2xpbmVzaXplOworICAgIGZsb2F0ICpzbGljZSA9IHMtPnNsaWNlc1tqb2Jucl07CisKKyAgICAvLyByZXNldCBibG9jayBzdW1zCisgICAgbWVtc2V0KHNsaWNlLCAwLCAoc2xpY2VfaCArIHMtPmJzaXplIC0gMSkgKiBkc3RfbGluZXNpemUgKiBzaXplb2YoKnNsaWNlKSk7CisKKyAgICAvLyBibG9jayBkY3Qgc3VtcworICAgIGZvciAoeSA9IDA7IHkgPCBzbGljZV9oOyB5ICs9IHMtPnN0ZXApIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHcgLSBzLT5ic2l6ZSArIDE7IHggKz0gcy0+c3RlcCkKKyAgICAgICAgICAgIHMtPmZpbHRlcl9mcmVxX2Z1bmMocywgc3JjICsgeCwgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZSArIHgsIHNsaWNlX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2Jucik7CisgICAgICAgIHNyYyArPSBzLT5zdGVwICogc3JjX2xpbmVzaXplOworICAgICAgICBzbGljZSArPSBzLT5zdGVwICogc2xpY2VfbGluZXNpemU7CisgICAgfQorCisgICAgLy8gYXZlcmFnZSBibG9ja3MKKyAgICBzbGljZSA9IHMtPnNsaWNlc1tqb2Jucl0gKyAoc2xpY2Vfc3RhcnQgLSBzbGljZV9zdGFydF9jdHgpICogc2xpY2VfbGluZXNpemU7CisgICAgZHN0ID0gdGQtPmRzdCArIHNsaWNlX3N0YXJ0ICogZHN0X2xpbmVzaXplOworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IHNsaWNlW3hdICogd2VpZ2h0c1t4XTsKKyAgICAgICAgc2xpY2UgKz0gc2xpY2VfbGluZXNpemU7CisgICAgICAgIGRzdCArPSBkc3RfbGluZXNpemU7CisgICAgICAgIHdlaWdodHMgKz0gZHN0X2xpbmVzaXplOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBEQ1Rkbm9pekNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gaW5saW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgaW50IGRpcmVjdCwgcGxhbmU7CisgICAgQVZGcmFtZSAqb3V0OworCisgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgeworICAgICAgICBkaXJlY3QgPSAxOworICAgICAgICBvdXQgPSBpbjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXJlY3QgPSAwOworICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0KKworICAgIHMtPmNvbG9yX2RlY29ycmVsYXRpb24ocy0+Y2J1ZlswXSwgcy0+cF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhWzBdLCBpbi0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcl93aWR0aCwgcy0+cHJfaGVpZ2h0KTsKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisgICAgICAgIFRocmVhZERhdGEgdGQgPSB7CisgICAgICAgICAgICAuc3JjID0gcy0+Y2J1ZlswXVtwbGFuZV0sCisgICAgICAgICAgICAuZHN0ID0gcy0+Y2J1ZlsxXVtwbGFuZV0sCisgICAgICAgIH07CisgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2UsICZ0ZCwgTlVMTCwgcy0+bmJfdGhyZWFkcyk7CisgICAgfQorICAgIHMtPmNvbG9yX2NvcnJlbGF0aW9uKG91dC0+ZGF0YVswXSwgb3V0LT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jYnVmWzFdLCBzLT5wX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByX3dpZHRoLCBzLT5wcl9oZWlnaHQpOworCisgICAgaWYgKCFkaXJlY3QpIHsKKyAgICAgICAgaW50IHk7CisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dC0+ZGF0YVswXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0gaW4tPmRhdGFbMF07CisgICAgICAgIGNvbnN0IGludCBkc3RfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWzBdOworICAgICAgICBjb25zdCBpbnQgc3JjX2xpbmVzaXplID0gaW4tPmxpbmVzaXplWzBdOworICAgICAgICBjb25zdCBpbnQgaHBhZCA9IChpbmxpbmstPncgLSBzLT5wcl93aWR0aCkgKiAzOworICAgICAgICBjb25zdCBpbnQgdnBhZCA9IChpbmxpbmstPmggLSBzLT5wcl9oZWlnaHQpOworCisgICAgICAgIGlmIChocGFkKSB7CisgICAgICAgICAgICB1aW50OF90ICAgICAgICpkc3RwID0gZHN0ICsgcy0+cHJfd2lkdGggKiAzOworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCA9IHNyYyArIHMtPnByX3dpZHRoICogMzsKKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPnByX2hlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdHAsIHNyY3AsIGhwYWQpOworICAgICAgICAgICAgICAgIGRzdHAgKz0gZHN0X2xpbmVzaXplOworICAgICAgICAgICAgICAgIHNyY3AgKz0gc3JjX2xpbmVzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2cGFkKSB7CisgICAgICAgICAgICB1aW50OF90ICAgICAgICpkc3RwID0gZHN0ICsgcy0+cHJfaGVpZ2h0ICogZHN0X2xpbmVzaXplOworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCA9IHNyYyArIHMtPnByX2hlaWdodCAqIHNyY19saW5lc2l6ZTsKKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHZwYWQ7IHkrKykgeworICAgICAgICAgICAgICAgIG1lbWNweShkc3RwLCBzcmNwLCBpbmxpbmstPncgKiAzKTsKKyAgICAgICAgICAgICAgICBkc3RwICs9IGRzdF9saW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBzcmNwICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBpOworICAgIERDVGRub2l6Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyZWUocy0+d2VpZ2h0cyk7CisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBhdl9mcmVlKHMtPmNidWZbaV1bMF0pOworICAgICAgICBhdl9mcmVlKHMtPmNidWZbaV1bMV0pOworICAgICAgICBhdl9mcmVlKHMtPmNidWZbaV1bMl0pOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfdGhyZWFkczsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWUocy0+c2xpY2VzW2ldKTsKKyAgICAgICAgYXZfZXhwcl9mcmVlKHMtPmV4cHJbaV0pOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGRjdGRub2l6X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZGN0ZG5vaXpfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2RjdGRub2l6ID0geworICAgIC5uYW1lICAgICAgICAgID0gImRjdGRub2l6IiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEZW5vaXNlIGZyYW1lcyB1c2luZyAyRCBEQ1QuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRENUZG5vaXpDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gZGN0ZG5vaXpfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gZGN0ZG5vaXpfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZkY3Rkbm9pel9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDIHwgQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9kZWNpbWF0ZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2RlY2ltYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiOTMyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9kZWNpbWF0ZS5jCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEZyZWRyaWsgTWVsbGJpbgorICogQ29weXJpZ2h0IChjKSAyMDEzIENsw6ltZW50IELFk3NjaAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVzdGFtcC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBJTlBVVF9NQUlOICAgICAwCisjZGVmaW5lIElOUFVUX0NMRUFOU1JDIDEKKworc3RydWN0IHFpdGVtIHsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBpbnQ2NF90IG1heGJkaWZmOworICAgIGludDY0X3QgdG90ZGlmZjsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBzdHJ1Y3QgcWl0ZW0gKnF1ZXVlOyAgICAvLy88IHdpbmRvdyBvZiBjeWNsZSBmcmFtZXMgYW5kIHRoZSBhc3NvY2lhdGVkIGRhdGEgZGlmZgorICAgIGludCBmaWQ7ICAgICAgICAgICAgICAgIC8vLzwgY3VycmVudCBmcmFtZSBpZCBpbiB0aGUgcXVldWUKKyAgICBpbnQgZmlsbGVkOyAgICAgICAgICAgICAvLy88IDEgaWYgdGhlIHF1ZXVlIGlzIGZpbGxlZCwgMCBvdGhlcndpc2UKKyAgICBBVkZyYW1lICpsYXN0OyAgICAgICAgICAvLy88IGxhc3QgZnJhbWUgZnJvbSB0aGUgcHJldmlvdXMgcXVldWUKKyAgICBBVkZyYW1lICoqY2xlYW5fc3JjOyAgICAvLy88IGZyYW1lIHF1ZXVlIGZvciB0aGUgY2xlYW4gc291cmNlCisgICAgaW50IGdvdF9mcmFtZVsyXTsgICAgICAgLy8vPCBmcmFtZSByZXF1ZXN0IGZsYWcgZm9yIGVhY2ggaW5wdXQgc3RyZWFtCisgICAgZG91YmxlIHRzX3VuaXQ7ICAgICAgICAgLy8vPCB0aW1lc3RhbXAgdW5pdHMgZm9yIHRoZSBvdXRwdXQgZnJhbWVzCisgICAgaW50NjRfdCBzdGFydF9wdHM7ICAgICAgLy8vPCBiYXNlIGZvciBvdXRwdXQgdGltZXN0YW1wcworICAgIHVpbnQzMl90IGVvZjsgICAgICAgICAgIC8vLzwgYml0bWFzayBmb3IgZW5kIG9mIHN0cmVhbQorICAgIGludCBoc3ViLCB2c3ViOyAgICAgICAgIC8vLzwgY2hyb21hIHN1YnNhbXBsaW5nIHZhbHVlcworICAgIGludCBkZXB0aDsKKyAgICBpbnQgbnhibG9ja3MsIG55YmxvY2tzOworICAgIGludCBiZGlmZnNpemU7CisgICAgaW50NjRfdCAqYmRpZmZzOworCisgICAgLyogb3B0aW9ucyAqLworICAgIGludCBjeWNsZTsKKyAgICBkb3VibGUgZHVwdGhyZXNoX2ZsdDsKKyAgICBkb3VibGUgc2N0aHJlc2hfZmx0OworICAgIGludDY0X3QgZHVwdGhyZXNoOworICAgIGludDY0X3Qgc2N0aHJlc2g7CisgICAgaW50IGJsb2NreCwgYmxvY2t5OworICAgIGludCBwcHNyYzsKKyAgICBpbnQgY2hyb21hOworfSBEZWNpbWF0ZUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKERlY2ltYXRlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBkZWNpbWF0ZV9vcHRpb25zW10gPSB7CisgICAgeyAiY3ljbGUiLCAgICAgInNldCB0aGUgbnVtYmVyIG9mIGZyYW1lIGZyb20gd2hpY2ggb25lIHdpbGwgYmUgZHJvcHBlZCIsIE9GRlNFVChjeWNsZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA1fSwgMiwgMjUsIEZMQUdTIH0sCisgICAgeyAiZHVwdGhyZXNoIiwgInNldCBkdXBsaWNhdGUgdGhyZXNob2xkIiwgICAgT0ZGU0VUKGR1cHRocmVzaF9mbHQpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gIDEuMX0sIDAsIDEwMCwgRkxBR1MgfSwKKyAgICB7ICJzY3RocmVzaCIsICAic2V0IHNjZW5lIGNoYW5nZSB0aHJlc2hvbGQiLCBPRkZTRVQoc2N0aHJlc2hfZmx0KSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmwgPSAxNS4wfSwgMCwgMTAwLCBGTEFHUyB9LAorICAgIHsgImJsb2NreCIsICAgICJzZXQgdGhlIHNpemUgb2YgdGhlIHgtYXhpcyBibG9ja3MgdXNlZCBkdXJpbmcgbWV0cmljIGNhbGN1bGF0aW9ucyIsIE9GRlNFVChibG9ja3gpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMzJ9LCA0LCAxPDw5LCBGTEFHUyB9LAorICAgIHsgImJsb2NreSIsICAgICJzZXQgdGhlIHNpemUgb2YgdGhlIHktYXhpcyBibG9ja3MgdXNlZCBkdXJpbmcgbWV0cmljIGNhbGN1bGF0aW9ucyIsIE9GRlNFVChibG9ja3kpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMzJ9LCA0LCAxPDw5LCBGTEFHUyB9LAorICAgIHsgInBwc3JjIiwgICAgICJtYXJrIG1haW4gaW5wdXQgYXMgYSBwcmUtcHJvY2Vzc2VkIGlucHV0IGFuZCBhY3RpdmF0ZSBjbGVhbiBzb3VyY2UgaW5wdXQgc3RyZWFtIiwgT0ZGU0VUKHBwc3JjKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJjaHJvbWEiLCAgICAic2V0IHdoZXRoZXIgb3Igbm90IGNocm9tYSBpcyBjb25zaWRlcmVkIGluIHRoZSBtZXRyaWMgY2FsY3VsYXRpb25zIiwgT0ZGU0VUKGNocm9tYSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhkZWNpbWF0ZSk7CisKK3N0YXRpYyB2b2lkIGNhbGNfZGlmZnMoY29uc3QgRGVjaW1hdGVDb250ZXh0ICpkbSwgc3RydWN0IHFpdGVtICpxLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmMSwgY29uc3QgQVZGcmFtZSAqZjIpCit7CisgICAgaW50NjRfdCBtYXhkaWZmID0gLTE7CisgICAgaW50NjRfdCAqYmRpZmZzID0gZG0tPmJkaWZmczsKKyAgICBpbnQgcGxhbmUsIGksIGo7CisKKyAgICBtZW1zZXQoYmRpZmZzLCAwLCBkbS0+YmRpZmZzaXplICogc2l6ZW9mKCpiZGlmZnMpKTsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IChkbS0+Y2hyb21hICYmIGYxLT5kYXRhWzJdID8gMyA6IDEpOyBwbGFuZSsrKSB7CisgICAgICAgIGludCB4LCB5LCB4bDsKKyAgICAgICAgY29uc3QgaW50IGxpbmVzaXplMSA9IGYxLT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIGNvbnN0IGludCBsaW5lc2l6ZTIgPSBmMi0+bGluZXNpemVbcGxhbmVdOworICAgICAgICBjb25zdCB1aW50OF90ICpmMXAgPSBmMS0+ZGF0YVtwbGFuZV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmYycCA9IGYyLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgaW50IHdpZHRoICAgID0gcGxhbmUgPyBGRl9DRUlMX1JTSElGVChmMS0+d2lkdGgsICBkbS0+aHN1YikgOiBmMS0+d2lkdGg7CisgICAgICAgIGludCBoZWlnaHQgICA9IHBsYW5lID8gRkZfQ0VJTF9SU0hJRlQoZjEtPmhlaWdodCwgZG0tPnZzdWIpIDogZjEtPmhlaWdodDsKKyAgICAgICAgaW50IGhibG9ja3ggID0gZG0tPmJsb2NreCAvIDI7CisgICAgICAgIGludCBoYmxvY2t5ICA9IGRtLT5ibG9ja3kgLyAyOworCisgICAgICAgIGlmIChwbGFuZSkgeworICAgICAgICAgICAgaGJsb2NreCA+Pj0gZG0tPmhzdWI7CisgICAgICAgICAgICBoYmxvY2t5ID4+PSBkbS0+dnN1YjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgaW50IHlkZXN0ID0geSAvIGhibG9ja3k7CisgICAgICAgICAgICBpbnQgeGRlc3QgPSAwOworCisjZGVmaW5lIENBTENfRElGRihuYml0cykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IGhibG9ja3gpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludDY0X3QgYWNjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBtID0gRkZNSU4od2lkdGgsIHggKyBoYmxvY2t4KTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoeGwgPSB4OyB4bCA8IG07IHhsKyspICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhY2MgKz0gYWJzKCgoY29uc3QgdWludCMjbmJpdHMjI190ICopZjFwKVt4bF0gLSBcCisgICAgICAgICAgICAgICAgICAgICAgICgoY29uc3QgdWludCMjbmJpdHMjI190ICopZjJwKVt4bF0pOyBcCisgICAgICAgIGJkaWZmc1t5ZGVzdCAqIGRtLT5ueGJsb2NrcyArIHhkZXN0XSArPSBhY2M7ICAgICAgICBcCisgICAgICAgIHhkZXN0Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorICAgICAgICAgICAgaWYgKGRtLT5kZXB0aCA9PSA4KSBDQUxDX0RJRkYoOCk7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIENBTENfRElGRigxNik7CisKKyAgICAgICAgICAgIGYxcCArPSBsaW5lc2l6ZTE7CisgICAgICAgICAgICBmMnAgKz0gbGluZXNpemUyOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGRtLT5ueWJsb2NrcyAtIDE7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZG0tPm54YmxvY2tzIC0gMTsgaisrKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRtcCA9IGJkaWZmc1sgICAgICBpICogZG0tPm54YmxvY2tzICsgaiAgICBdCisgICAgICAgICAgICAgICAgICAgICAgICArIGJkaWZmc1sgICAgICBpICogZG0tPm54YmxvY2tzICsgaiArIDFdCisgICAgICAgICAgICAgICAgICAgICAgICArIGJkaWZmc1soaSArIDEpICogZG0tPm54YmxvY2tzICsgaiAgICBdCisgICAgICAgICAgICAgICAgICAgICAgICArIGJkaWZmc1soaSArIDEpICogZG0tPm54YmxvY2tzICsgaiArIDFdOworICAgICAgICAgICAgaWYgKHRtcCA+IG1heGRpZmYpCisgICAgICAgICAgICAgICAgbWF4ZGlmZiA9IHRtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHEtPnRvdGRpZmYgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBkbS0+YmRpZmZzaXplOyBpKyspCisgICAgICAgIHEtPnRvdGRpZmYgKz0gYmRpZmZzW2ldOworICAgIHEtPm1heGJkaWZmID0gbWF4ZGlmZjsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIGludCBzY3BvcyA9IC0xLCBkdXBwb3MgPSAtMTsKKyAgICBpbnQgZHJvcCA9IElOVF9NSU4sIGksIGxvd2VzdCA9IDAsIHJldDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCAgPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgRGVjaW1hdGVDb250ZXh0ICpkbSAgID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKnBydjsKKworICAgIC8qIHVwZGF0ZSBmcmFtZXMgcXVldWUocykgKi8KKyAgICBpZiAoRkZfSU5MSU5LX0lEWChpbmxpbmspID09IElOUFVUX01BSU4pIHsKKyAgICAgICAgZG0tPnF1ZXVlW2RtLT5maWRdLmZyYW1lID0gaW47CisgICAgICAgIGRtLT5nb3RfZnJhbWVbSU5QVVRfTUFJTl0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGRtLT5jbGVhbl9zcmNbZG0tPmZpZF0gPSBpbjsKKyAgICAgICAgZG0tPmdvdF9mcmFtZVtJTlBVVF9DTEVBTlNSQ10gPSAxOworICAgIH0KKyAgICBpZiAoIWRtLT5nb3RfZnJhbWVbSU5QVVRfTUFJTl0gfHwgKGRtLT5wcHNyYyAmJiAhZG0tPmdvdF9mcmFtZVtJTlBVVF9DTEVBTlNSQ10pKQorICAgICAgICByZXR1cm4gMDsKKyAgICBkbS0+Z290X2ZyYW1lW0lOUFVUX01BSU5dID0gZG0tPmdvdF9mcmFtZVtJTlBVVF9DTEVBTlNSQ10gPSAwOworCisgICAgaWYgKGluKSB7CisgICAgICAgIC8qIHVwZGF0ZSBmcmFtZSBtZXRyaWNzICovCisgICAgICAgIHBydiA9IGRtLT5maWQgPyBkbS0+cXVldWVbZG0tPmZpZCAtIDFdLmZyYW1lIDogZG0tPmxhc3Q7CisgICAgICAgIGlmICghcHJ2KQorICAgICAgICAgICAgcHJ2ID0gaW47CisgICAgICAgIGNhbGNfZGlmZnMoZG0sICZkbS0+cXVldWVbZG0tPmZpZF0sIHBydiwgaW4pOworICAgICAgICBpZiAoKytkbS0+ZmlkICE9IGRtLT5jeWNsZSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZkbS0+bGFzdCk7CisgICAgICAgIGRtLT5sYXN0ID0gYXZfZnJhbWVfY2xvbmUoaW4pOworICAgICAgICBkbS0+ZmlkID0gMDsKKworICAgICAgICAvKiB3ZSBoYXZlIGEgY29tcGxldGUgY3ljbGUsIHNlbGVjdCB0aGUgZnJhbWUgdG8gZHJvcCAqLworICAgICAgICBsb3dlc3QgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZG0tPmN5Y2xlOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkbS0+cXVldWVbaV0udG90ZGlmZiA+IGRtLT5zY3RocmVzaCkKKyAgICAgICAgICAgICAgICBzY3BvcyA9IGk7CisgICAgICAgICAgICBpZiAoZG0tPnF1ZXVlW2ldLm1heGJkaWZmIDwgZG0tPnF1ZXVlW2xvd2VzdF0ubWF4YmRpZmYpCisgICAgICAgICAgICAgICAgbG93ZXN0ID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG0tPnF1ZXVlW2xvd2VzdF0ubWF4YmRpZmYgPCBkbS0+ZHVwdGhyZXNoKQorICAgICAgICAgICAgZHVwcG9zID0gbG93ZXN0OworICAgICAgICBkcm9wID0gc2Nwb3MgPj0gMCAmJiBkdXBwb3MgPCAwID8gc2Nwb3MgOiBsb3dlc3Q7CisgICAgfQorCisgICAgLyogbWV0cmljcyBkZWJ1ZyAqLworICAgIGlmIChhdl9sb2dfZ2V0X2xldmVsKCkgPj0gQVZfTE9HX0RFQlVHKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIjEvJWQgZnJhbWUgZHJvcDpcbiIsIGRtLT5jeWNsZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkbS0+Y3ljbGUgJiYgZG0tPnF1ZXVlW2ldLmZyYW1lOyBpKyspIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywiICAjJWQ6IHRvdGRpZmY9JTA4IlBSSXg2NCIgbWF4YmRpZmY9JTA4IlBSSXg2NCIlcyVzJXMlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBpICsgMSwgZG0tPnF1ZXVlW2ldLnRvdGRpZmYsIGRtLT5xdWV1ZVtpXS5tYXhiZGlmZiwKKyAgICAgICAgICAgICAgICAgICBpID09IHNjcG9zICA/ICIgc2MiICAgICA6ICIiLAorICAgICAgICAgICAgICAgICAgIGkgPT0gZHVwcG9zID8gIiBkdXAiICAgIDogIiIsCisgICAgICAgICAgICAgICAgICAgaSA9PSBsb3dlc3QgPyAiIGxvd2VzdCIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICBpID09IGRyb3AgICA/ICIgW0RST1BdIiA6ICIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHB1c2ggYWxsIGZyYW1lcyBleGNlcHQgdGhlIGRyb3AgKi8KKyAgICByZXQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBkbS0+Y3ljbGUgJiYgZG0tPnF1ZXVlW2ldLmZyYW1lOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPT0gZHJvcCkgeworICAgICAgICAgICAgaWYgKGRtLT5wcHNyYykKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZkbS0+Y2xlYW5fc3JjW2ldKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmRtLT5xdWV1ZVtpXS5mcmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSA9IGRtLT5xdWV1ZVtpXS5mcmFtZTsKKyAgICAgICAgICAgIGlmIChmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIGRtLT5zdGFydF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgZG0tPnN0YXJ0X3B0cyA9IGZyYW1lLT5wdHM7CisgICAgICAgICAgICBpZiAoZG0tPnBwc3JjKSB7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgICAgIGZyYW1lID0gZG0tPmNsZWFuX3NyY1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lLT5wdHMgPSBvdXRsaW5rLT5mcmFtZV9jb3VudCAqIGRtLT50c191bml0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZG0tPnN0YXJ0X3B0cyA9PSBBVl9OT1BUU19WQUxVRSA/IDAgOiBkbS0+c3RhcnRfcHRzKTsKKyAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIGludCBtYXhfdmFsdWU7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBEZWNpbWF0ZUNvbnRleHQgKmRtID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBjb25zdCBpbnQgdyA9IGlubGluay0+dzsKKyAgICBjb25zdCBpbnQgaCA9IGlubGluay0+aDsKKworICAgIGRtLT5oc3ViICAgICAgPSBwaXhfZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBkbS0+dnN1YiAgICAgID0gcGl4X2Rlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgZG0tPmRlcHRoICAgICA9IHBpeF9kZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSArIDE7CisgICAgbWF4X3ZhbHVlICAgICA9ICgxIDw8IGRtLT5kZXB0aCkgLSAxOworICAgIGRtLT5zY3RocmVzaCAgPSAoaW50NjRfdCkoKChpbnQ2NF90KW1heF92YWx1ZSAqICAgICAgICAgIHcgKiBoICAgICAgICAgICogZG0tPnNjdGhyZXNoX2ZsdCkgIC8gMTAwKTsKKyAgICBkbS0+ZHVwdGhyZXNoID0gKGludDY0X3QpKCgoaW50NjRfdCltYXhfdmFsdWUgKiBkbS0+YmxvY2t4ICogZG0tPmJsb2NreSAqIGRtLT5kdXB0aHJlc2hfZmx0KSAvIDEwMCk7CisgICAgZG0tPm54YmxvY2tzICA9ICh3ICsgZG0tPmJsb2NreC8yIC0gMSkgLyAoZG0tPmJsb2NreC8yKTsKKyAgICBkbS0+bnlibG9ja3MgID0gKGggKyBkbS0+YmxvY2t5LzIgLSAxKSAvIChkbS0+YmxvY2t5LzIpOworICAgIGRtLT5iZGlmZnNpemUgPSBkbS0+bnhibG9ja3MgKiBkbS0+bnlibG9ja3M7CisgICAgZG0tPmJkaWZmcyAgICA9IGF2X21hbGxvY19hcnJheShkbS0+YmRpZmZzaXplLCBzaXplb2YoKmRtLT5iZGlmZnMpKTsKKyAgICBkbS0+cXVldWUgICAgID0gYXZfY2FsbG9jKGRtLT5jeWNsZSwgc2l6ZW9mKCpkbS0+cXVldWUpKTsKKworICAgIGlmICghZG0tPmJkaWZmcyB8fCAhZG0tPnF1ZXVlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKGRtLT5wcHNyYykgeworICAgICAgICBkbS0+Y2xlYW5fc3JjID0gYXZfY2FsbG9jKGRtLT5jeWNsZSwgc2l6ZW9mKCpkbS0+Y2xlYW5fc3JjKSk7CisgICAgICAgIGlmICghZG0tPmNsZWFuX3NyYykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNpbWF0ZV9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIERlY2ltYXRlQ29udGV4dCAqZG0gPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJQYWQgcGFkID0geworICAgICAgICAubmFtZSAgICAgICAgID0gYXZfc3RyZHVwKCJtYWluIiksCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgfTsKKworICAgIGlmICghcGFkLm5hbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfaW5zZXJ0X2lucGFkKGN0eCwgSU5QVVRfTUFJTiwgJnBhZCk7CisKKyAgICBpZiAoZG0tPnBwc3JjKSB7CisgICAgICAgIHBhZC5uYW1lID0gYXZfc3RyZHVwKCJjbGVhbl9zcmMiKTsKKyAgICAgICAgcGFkLmNvbmZpZ19wcm9wcyA9IE5VTEw7CisgICAgICAgIGlmICghcGFkLm5hbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmZl9pbnNlcnRfaW5wYWQoY3R4LCBJTlBVVF9DTEVBTlNSQywgJnBhZCk7CisgICAgfQorCisgICAgaWYgKChkbS0+YmxvY2t4ICYgKGRtLT5ibG9ja3ggLSAxKSkgfHwKKyAgICAgICAgKGRtLT5ibG9ja3kgJiAoZG0tPmJsb2NreSAtIDEpKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJibG9ja3ggYW5kIGJsb2NreSBzZXR0aW5ncyBtdXN0IGJlIHBvd2VyIG9mIHR3b1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZG0tPnN0YXJ0X3B0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZGVjaW1hdGVfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBpOworICAgIERlY2ltYXRlQ29udGV4dCAqZG0gPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZkbS0+bGFzdCk7CisgICAgYXZfZnJlZXAoJmRtLT5iZGlmZnMpOworICAgIGF2X2ZyZWVwKCZkbS0+cXVldWUpOworICAgIGF2X2ZyZWVwKCZkbS0+Y2xlYW5fc3JjKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9pbnB1dHM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+aW5wdXRfcGFkc1tpXS5uYW1lKTsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2lubGluayhBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IGxpZCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBEZWNpbWF0ZUNvbnRleHQgKmRtID0gY3R4LT5wcml2OworCisgICAgaWYgKCFkbS0+Z290X2ZyYW1lW2xpZF0pIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1tsaWRdOworICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGlubGluayk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpIHsgLy8gZmx1c2hpbmcKKyAgICAgICAgICAgIGRtLT5lb2YgfD0gMSA8PCBsaWQ7CisgICAgICAgICAgICByZXQgPSBmaWx0ZXJfZnJhbWUoaW5saW5rLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIGludCByZXQ7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgRGVjaW1hdGVDb250ZXh0ICpkbSA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCB1aW50MzJfdCBlb2ZfbWFzayA9IDE8PElOUFVUX01BSU4gfCBkbS0+cHBzcmM8PElOUFVUX0NMRUFOU1JDOworCisgICAgaWYgKChkbS0+ZW9mICYgZW9mX21hc2spID09IGVvZl9tYXNrKSAvLyBmbHVzaCBkb25lPworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgaWYgKChyZXQgPSByZXF1ZXN0X2lubGluayhjdHgsIElOUFVUX01BSU4pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKGRtLT5wcHNyYyAmJiAocmV0ID0gcmVxdWVzdF9pbmxpbmsoY3R4LCBJTlBVVF9DTEVBTlNSQykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyNkZWZpbmUgUEZfTk9BTFBIQShzdWYpIEFWX1BJWF9GTVRfWVVWNDIwIyNzdWYsICBBVl9QSVhfRk1UX1lVVjQyMiMjc3VmLCAgQVZfUElYX0ZNVF9ZVVY0NDQjI3N1ZgorI2RlZmluZSBQRl9BTFBIQShzdWYpICAgQVZfUElYX0ZNVF9ZVVZBNDIwIyNzdWYsIEFWX1BJWF9GTVRfWVVWQTQyMiMjc3VmLCBBVl9QSVhfRk1UX1lVVkE0NDQjI3N1ZgorI2RlZmluZSBQRihzdWYpICAgICAgICAgUEZfTk9BTFBIQShzdWYpLCBQRl9BTFBIQShzdWYpCisgICAgICAgIFBGKFApLCBQRihQOSksIFBGKFAxMCksIFBGX05PQUxQSEEoUDEyKSwgUEZfTk9BTFBIQShQMTQpLCBQRihQMTYpLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsIEFWX1BJWF9GTVRfWVVWNDExUCwgQVZfUElYX0ZNVF9ZVVY0MTBQLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgRGVjaW1hdGVDb250ZXh0ICpkbSA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVkZpbHRlckxpbmsgKmlubGluayA9CisgICAgICAgIGN0eC0+aW5wdXRzW2RtLT5wcHNyYyA/IElOUFVUX0NMRUFOU1JDIDogSU5QVVRfTUFJTl07CisgICAgQVZSYXRpb25hbCBmcHMgPSBpbmxpbmstPmZyYW1lX3JhdGU7CisKKyAgICBpZiAoIWZwcy5udW0gfHwgIWZwcy5kZW4pIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVGhlIGlucHV0IG5lZWRzIGEgY29uc3RhbnQgZnJhbWUgcmF0ZTsgIgorICAgICAgICAgICAgICAgImN1cnJlbnQgcmF0ZSBvZiAlZC8lZCBpcyBpbnZhbGlkXG4iLCBmcHMubnVtLCBmcHMuZGVuKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgZnBzID0gYXZfbXVsX3EoZnBzLCAoQVZSYXRpb25hbCl7ZG0tPmN5Y2xlIC0gMSwgZG0tPmN5Y2xlfSk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJGUFM6ICVkLyVkIC0+ICVkLyVkXG4iLAorICAgICAgICAgICBpbmxpbmstPmZyYW1lX3JhdGUubnVtLCBpbmxpbmstPmZyYW1lX3JhdGUuZGVuLCBmcHMubnVtLCBmcHMuZGVuKTsKKyAgICBvdXRsaW5rLT5mbGFncyB8PSBGRl9MSU5LX0ZMQUdfUkVRVUVTVF9MT09QOworICAgIG91dGxpbmstPnRpbWVfYmFzZSAgPSBpbmxpbmstPnRpbWVfYmFzZTsKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gZnBzOworICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgb3V0bGluay0+dyA9IGlubGluay0+dzsKKyAgICBvdXRsaW5rLT5oID0gaW5saW5rLT5oOworICAgIGRtLT50c191bml0ID0gYXZfcTJkKGF2X2ludl9xKGF2X211bF9xKGZwcywgb3V0bGluay0+dGltZV9iYXNlKSkpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZGVjaW1hdGVfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9kZWNpbWF0ZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJkZWNpbWF0ZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGVjaW1hdGUgZnJhbWVzIChwb3N0IGZpZWxkIG1hdGNoaW5nIGZpbHRlcikuIiksCisgICAgLmluaXQgICAgICAgICAgPSBkZWNpbWF0ZV9pbml0LAorICAgIC51bmluaXQgICAgICAgID0gZGVjaW1hdGVfdW5pbml0LAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKERlY2ltYXRlQ29udGV4dCksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gZGVjaW1hdGVfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZkZWNpbWF0ZV9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19JTlBVVFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2RlanVkZGVyLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZGVqdWRkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjUyNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2RlanVkZGVyLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTmljaG9sYXMgUm9iYmlucworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiByZW1vdmUganVkZGVyIGluIHZpZGVvIHN0cmVhbQorICoKKyAqIEFsZ29yaXRobToKKyAqICAgIC0gSWYgdGhlIG9sZCBwYWNrZXRzIGhhZCBQVFMgb2Ygb2xkX3B0c1tpXS4gUmVwbGFjZSB0aGVzZSB3aXRoIG5ldworICogICAgICB2YWx1ZSBiYXNlZCBvbiB0aGUgcnVubmluZyBhdmVyYWdlIG9mIHRoZSBsYXN0IG49Y3ljbGUgZnJhbWVzLiBTbworICoKKyAqICAgICAgbmV3X3B0c1tpXSA9IFN1bShrPWktbisxLCBpLCBvbGRfcHRzW2tdKS9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICsgKG9sZF9wdHNbaV0tb2xkX3B0c1tpLW5dKSoobi0xKS8ybgorICoKKyAqICAgICAgRm9yIGFueSByZXBlYXRpbmcgcGF0dGVybiBvZiBsZW5ndGggbiBvZiBqdWRkZXIgdGhpcyB3aWxsIHByb2R1Y2UKKyAqICAgICAgYW4gZXZlbiBwcm9ncmVzc2lvbiBvZiBQVFMncy4KKyAqCisgKiAgICAtIEluIG9yZGVyIHRvIGF2b2lkIGNhbGN1bGF0aW5nIHRoaXMgc3VtIGV2ZXIgZnJhbWUsIGEgcnVubmluZyB0YWxseQorICogICAgICBpcyBtYWludGFpbmVkIGluIGN0eC0+bmV3X3B0cy4gRWFjaCBmcmFtZSB0aGUgbmV3IHRlcm0gYXQgdGhlIHN0YXJ0CisgKiAgICAgIG9mIHRoZSBzdW0gaXMgYWRkZWQsIHRoZSBvbmUgYW5kIHRoZSBlbmQgaXMgcmVtb3ZlZCwgYW5kIHRoZSBvZmZzZXQKKyAqICAgICAgdGVybXMgKHNlY29uZCBsaW5lIGluIGZvcm11bGEgYWJvdmUpIGFyZSByZWNhbGN1bGF0ZWQuCisgKgorICogICAgLSBUbyBhaWQgaW4gdGhpcyBhIHJpbmdidWZmZXIgb2YgdGhlIGxhc3Qgbi0yIFBUUydzIGlzIG1haW50YWluZWQgaW4KKyAqICAgICAgY3R4LT5yaW5nYnVmZi4gV2l0aCB0aGUgaW5kaWNlcyBvZiB0aGUgZmlyc3QgdHdvIGFuZCBsYXN0IHR3byBlbnRyaWVzCisgKiAgICAgIHN0b3JlZCBpbiBpMSwgaTIsIGkzLCAmIGk0LgorICoKKyAqICAgIC0gVG8gZW5zdXJlIHRoYXQgdGhlIG5ldyBQVFMncyBhcmUgaW50ZWdlcnMsIHRpbWVfYmFzZSBpcyBkaXZpZGVkCisgKiAgICAgIGJ5IDJuLiBUaGlzIHJlbW92ZXMgdGhlIGRpdmlzaW9uIGluIHRoZSBuZXdfcHRzIGNhbGN1bGF0aW9uLgorICoKKyAqICAgIC0gZnJhbWVfcmF0ZSBpcyBhbHNvIG11bHRpcGxpZWQgYnkgMm4gdG8gYWxsb3cgdGhlIGZyYW1lcyB0byBmYWxsCisgKiAgICAgIHdoZXJlIHRoZXkgbWF5IGluIHdoYXQgbWF5IG5vdyBiZSBhIFZGUiBvdXRwdXQuIFRoaXMgcHJvZHVjZXMgbW9yZQorICogICAgICBldmVuIG91dHB1dCB0aGVuIHNldHRpbmcgZnJhbWVfcmF0ZT0xLzAgaW4gcHJhY3RpY2UuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludDY0X3QgKnJpbmdidWZmOworICAgIGludCBpMSwgaTIsIGkzLCBpNDsKKyAgICBpbnQ2NF90IG5ld19wdHM7CisgICAgaW50IHN0YXJ0X2NvdW50OworCisgICAgLyogb3B0aW9ucyAqLworICAgIGludCBjeWNsZTsKK30gRGVqdWRkZXJDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihEZWp1ZGRlckNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSB8IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBkZWp1ZGRlcl9vcHRpb25zW10gPSB7CisgICAgeyJjeWNsZSIsICJzZXQgdGhlIGxlbmd0aCBvZiB0aGUgY3ljbGUgdG8gdXNlIGZvciBkZWp1ZGRlcmluZyIsCisgICAgICAgIE9GRlNFVChjeWNsZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA0fSwgMiwgMjQwLCAuZmxhZ3MgPSBGTEFHU30sCisgICAge05VTEx9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZGVqdWRkZXIpOworCitzdGF0aWMgaW50IGNvbmZpZ19vdXRfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIERlanVkZGVyQ29udGV4dCAqZGogPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBvdXRsaW5rLT5zcmMtPmlucHV0c1swXTsKKworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IGF2X211bF9xKGlubGluay0+dGltZV9iYXNlLCBhdl9tYWtlX3EoMSwgMiAqIGRqLT5jeWNsZSkpOworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBhdl9tdWxfcShpbmxpbmstPmZyYW1lX3JhdGUsIGF2X21ha2VfcSgyICogZGotPmN5Y2xlLCAxKSk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgImN5Y2xlOiVkXG4iLCBkai0+Y3ljbGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWp1ZGRlcl9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIERlanVkZGVyQ29udGV4dCAqZGogPSBjdHgtPnByaXY7CisKKyAgICBkai0+cmluZ2J1ZmYgPSBhdl9tYWxsb2N6X2FycmF5KGRqLT5jeWNsZSsyLCBzaXplb2YoKmRqLT5yaW5nYnVmZikpOworICAgIGlmICghZGotPnJpbmdidWZmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZGotPm5ld19wdHMgPSAwOworICAgIGRqLT5pMSA9IDA7CisgICAgZGotPmkyID0gMTsKKyAgICBkai0+aTMgPSAyOworICAgIGRqLT5pNCA9IDM7CisgICAgZGotPnN0YXJ0X2NvdW50ID0gZGotPmN5Y2xlICsgMjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGRlanVkZGVyX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBEZWp1ZGRlckNvbnRleHQgKmRqID0gY3R4LT5wcml2OworCisgICAgYXZfZnJlZXAoJihkai0+cmluZ2J1ZmYpKTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCBrOworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ICA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBEZWp1ZGRlckNvbnRleHQgKmRqICAgPSBjdHgtPnByaXY7CisgICAgaW50NjRfdCAqanVkYnVmZiAgICAgID0gZGotPnJpbmdidWZmOworICAgIGludDY0X3QgbmV4dF9wdHMgICAgICA9IGZyYW1lLT5wdHM7CisgICAgaW50NjRfdCBvZmZzZXQ7CisKKyAgICBpZiAobmV4dF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZnJhbWUpOworCisgICAgaWYgKGRqLT5zdGFydF9jb3VudCkgeworICAgICAgICBkai0+c3RhcnRfY291bnQtLTsKKyAgICAgICAgZGotPm5ld19wdHMgPSBuZXh0X3B0cyAqIDIgKiBkai0+Y3ljbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG5leHRfcHRzIDwganVkYnVmZltkai0+aTJdKSB7CisgICAgICAgICAgICBvZmZzZXQgPSBuZXh0X3B0cyArIGp1ZGJ1ZmZbZGotPmkzXSAtIGp1ZGJ1ZmZbZGotPmk0XSAtIGp1ZGJ1ZmZbZGotPmkxXTsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBkai0+Y3ljbGUgKyAyOyBrKyspCisgICAgICAgICAgICAgICAganVkYnVmZltrXSArPSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZGotPm5ld19wdHMgKz0gKGRqLT5jeWNsZSAtIDEpICogKGp1ZGJ1ZmZbZGotPmkzXSAtIGp1ZGJ1ZmZbZGotPmkxXSkKKyAgICAgICAgICAgICAgICAgICAgKyAoZGotPmN5Y2xlICsgMSkgKiAobmV4dF9wdHMgLSBqdWRidWZmW2RqLT5pNF0pOworICAgIH0KKworICAgIGp1ZGJ1ZmZbZGotPmkyXSA9IG5leHRfcHRzOworICAgIGRqLT5pMSA9IGRqLT5pMjsKKyAgICBkai0+aTIgPSBkai0+aTM7CisgICAgZGotPmkzID0gZGotPmk0OworICAgIGRqLT5pNCA9IChkai0+aTQgKyAxKSAlIChkai0+Y3ljbGUgKyAyKTsKKworICAgIGZyYW1lLT5wdHMgPSBkai0+bmV3X3B0czsKKworICAgIGZvciAoayA9IDA7IGsgPCBkai0+Y3ljbGUgKyAyOyBrKyspCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiUiUFJJZDY0Ilx0IiwganVkYnVmZltrXSk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAibmV4dD0lIlBSSWQ2NCIsIG5ldz0lIlBSSWQ2NCJcbiIsIG5leHRfcHRzLCBmcmFtZS0+cHRzKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZnJhbWUpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZGVqdWRkZXJfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBkZWp1ZGRlcl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0X3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2RlanVkZGVyID0geworICAgIC5uYW1lICAgICAgICA9ICJkZWp1ZGRlciIsCisgICAgLmRlc2NyaXB0aW9uID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlbW92ZSBqdWRkZXIgcHJvZHVjZWQgYnkgcHVsbHVwLiIpLAorICAgIC5wcml2X3NpemUgICA9IHNpemVvZihEZWp1ZGRlckNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICA9ICZkZWp1ZGRlcl9jbGFzcywKKyAgICAuaW5wdXRzICAgICAgPSBkZWp1ZGRlcl9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgID0gZGVqdWRkZXJfb3V0cHV0cywKKyAgICAuaW5pdCAgICAgICAgPSBkZWp1ZGRlcl9pbml0LAorICAgIC51bmluaXQgICAgICA9IGRlanVkZGVyX3VuaW5pdCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZGVsb2dvLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZGVsb2dvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjZGZiMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9kZWxvZ28uYwpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKaW5kcmljaCBNYWtvdmlja2EgPG1ha292aWNrQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBTdGVmYW5vIFNhYmF0aW5pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQSB2ZXJ5IHNpbXBsZSB0diBzdGF0aW9uIGxvZ28gcmVtb3ZlcgorICogT3JpZ2luYWxseSBpbXBvcnRlZCBmcm9tIE1QbGF5ZXIgbGlibXBjb2RlY3MvdmZfZGVsb2dvLmMsCisgKiB0aGUgYWxnb3JpdGhtIHdhcyBsYXRlciBpbXByb3ZlZC4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworLyoqCisgKiBBcHBseSBhIHNpbXBsZSBkZWxvZ28gYWxnb3JpdGhtIHRvIHRoZSBpbWFnZSBpbiBzcmMgYW5kIHB1dCB0aGUKKyAqIHJlc3VsdCBpbiBkc3QuCisgKgorICogVGhlIGFsZ29yaXRobSBpcyBvbmx5IGFwcGxpZWQgdG8gdGhlIHJlZ2lvbiBzcGVjaWZpZWQgYnkgdGhlIGxvZ28KKyAqIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIHcgICAgICB3aWR0aCBvZiB0aGUgaW5wdXQgaW1hZ2UKKyAqIEBwYXJhbSBoICAgICAgaGVpZ2h0IG9mIHRoZSBpbnB1dCBpbWFnZQorICogQHBhcmFtIGxvZ29feCB4IGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgbG9nbyByZWdpb24KKyAqIEBwYXJhbSBsb2dvX3kgeSBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGxvZ28gcmVnaW9uCisgKiBAcGFyYW0gbG9nb193IHdpZHRoIG9mIHRoZSBsb2dvCisgKiBAcGFyYW0gbG9nb19oIGhlaWdodCBvZiB0aGUgbG9nbworICogQHBhcmFtIGJhbmQgICB0aGUgc2l6ZSBvZiB0aGUgYmFuZCBhcm91bmQgdGhlIHByb2Nlc3NlZCBhcmVhCisgKiBAcGFyYW0gc2hvdyAgIHNob3cgYSByZWN0YW5nbGUgYXJvdW5kIHRoZSBwcm9jZXNzZWQgYXJlYSwgdXNlZnVsIGZvcgorICogICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHR3ZWFraW5nCisgKiBAcGFyYW0gZGlyZWN0IGlmIG5vbi16ZXJvIHBlcmZvcm0gaW4tcGxhY2UgcHJvY2Vzc2luZworICovCitzdGF0aWMgdm9pZCBhcHBseV9kZWxvZ28odWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgaW50IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIEFWUmF0aW9uYWwgc2FyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2dvX3gsIGludCBsb2dvX3ksIGludCBsb2dvX3csIGludCBsb2dvX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJhbmQsIGludCBzaG93LCBpbnQgZGlyZWN0KQoreworICAgIGludCB4LCB5OworICAgIHVpbnQ2NF90IGludGVycCwgd2VpZ2h0bCwgd2VpZ2h0ciwgd2VpZ2h0dCwgd2VpZ2h0YjsKKyAgICB1aW50OF90ICp4ZHN0LCAqeHNyYzsKKworICAgIHVpbnQ4X3QgKnRvcGxlZnQsICpib3RsZWZ0LCAqdG9wcmlnaHQ7CisgICAgdW5zaWduZWQgaW50IGxlZnRfc2FtcGxlLCByaWdodF9zYW1wbGU7CisgICAgaW50IHhjbGlwbCwgeGNsaXByLCB5Y2xpcHQsIHljbGlwYjsKKyAgICBpbnQgbG9nb194MSwgbG9nb194MiwgbG9nb195MSwgbG9nb195MjsKKworICAgIHhjbGlwbCA9IEZGTUFYKC1sb2dvX3gsIDApOworICAgIHhjbGlwciA9IEZGTUFYKGxvZ29feCtsb2dvX3ctdywgMCk7CisgICAgeWNsaXB0ID0gRkZNQVgoLWxvZ29feSwgMCk7CisgICAgeWNsaXBiID0gRkZNQVgobG9nb195K2xvZ29faC1oLCAwKTsKKworICAgIGxvZ29feDEgPSBsb2dvX3ggKyB4Y2xpcGw7CisgICAgbG9nb194MiA9IGxvZ29feCArIGxvZ29fdyAtIHhjbGlwcjsKKyAgICBsb2dvX3kxID0gbG9nb195ICsgeWNsaXB0OworICAgIGxvZ29feTIgPSBsb2dvX3kgKyBsb2dvX2ggLSB5Y2xpcGI7CisKKyAgICB0b3BsZWZ0ICA9IHNyYytsb2dvX3kxICAgICAqIHNyY19saW5lc2l6ZStsb2dvX3gxOworICAgIHRvcHJpZ2h0ID0gc3JjK2xvZ29feTEgICAgICogc3JjX2xpbmVzaXplK2xvZ29feDItMTsKKyAgICBib3RsZWZ0ICA9IHNyYysobG9nb195Mi0xKSAqIHNyY19saW5lc2l6ZStsb2dvX3gxOworCisgICAgaWYgKCFkaXJlY3QpCisgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoZHN0LCBkc3RfbGluZXNpemUsIHNyYywgc3JjX2xpbmVzaXplLCB3LCBoKTsKKworICAgIGRzdCArPSAobG9nb195MSArIDEpICogZHN0X2xpbmVzaXplOworICAgIHNyYyArPSAobG9nb195MSArIDEpICogc3JjX2xpbmVzaXplOworCisgICAgZm9yICh5ID0gbG9nb195MSsxOyB5IDwgbG9nb195Mi0xOyB5KyspIHsKKyAgICAgICAgbGVmdF9zYW1wbGUgPSB0b3BsZWZ0W3NyY19saW5lc2l6ZSooeS1sb2dvX3kxKV0gICArCisgICAgICAgICAgICAgICAgICAgICAgdG9wbGVmdFtzcmNfbGluZXNpemUqKHktbG9nb195MS0xKV0gKworICAgICAgICAgICAgICAgICAgICAgIHRvcGxlZnRbc3JjX2xpbmVzaXplKih5LWxvZ29feTErMSldOworICAgICAgICByaWdodF9zYW1wbGUgPSB0b3ByaWdodFtzcmNfbGluZXNpemUqKHktbG9nb195MSldICAgKworICAgICAgICAgICAgICAgICAgICAgICB0b3ByaWdodFtzcmNfbGluZXNpemUqKHktbG9nb195MS0xKV0gKworICAgICAgICAgICAgICAgICAgICAgICB0b3ByaWdodFtzcmNfbGluZXNpemUqKHktbG9nb195MSsxKV07CisKKyAgICAgICAgZm9yICh4ID0gbG9nb194MSsxLAorICAgICAgICAgICAgIHhkc3QgPSBkc3QrbG9nb194MSsxLAorICAgICAgICAgICAgIHhzcmMgPSBzcmMrbG9nb194MSsxOyB4IDwgbG9nb194Mi0xOyB4KyssIHhkc3QrKywgeHNyYysrKSB7CisKKyAgICAgICAgICAgIC8qIFdlaWdodGVkIGludGVycG9sYXRpb24gYmFzZWQgb24gcmVsYXRpdmUgZGlzdGFuY2VzLCB0YWtpbmcgU0FSIGludG8gYWNjb3VudCAqLworICAgICAgICAgICAgd2VpZ2h0bCA9ICh1aW50NjRfdCkgICAgICAgICAgICAgIChsb2dvX3gyLTEteCkgKiAoeS1sb2dvX3kxKSAqIChsb2dvX3kyLTEteSkgKiBzYXIuZGVuOworICAgICAgICAgICAgd2VpZ2h0ciA9ICh1aW50NjRfdCkoeC1sb2dvX3gxKSAgICAgICAgICAgICAgICAgKiAoeS1sb2dvX3kxKSAqIChsb2dvX3kyLTEteSkgKiBzYXIuZGVuOworICAgICAgICAgICAgd2VpZ2h0dCA9ICh1aW50NjRfdCkoeC1sb2dvX3gxKSAqIChsb2dvX3gyLTEteCkgICAgICAgICAgICAgICAqIChsb2dvX3kyLTEteSkgKiBzYXIubnVtOworICAgICAgICAgICAgd2VpZ2h0YiA9ICh1aW50NjRfdCkoeC1sb2dvX3gxKSAqIChsb2dvX3gyLTEteCkgKiAoeS1sb2dvX3kxKSAgICAgICAgICAgICAgICAgKiBzYXIubnVtOworCisgICAgICAgICAgICBpbnRlcnAgPQorICAgICAgICAgICAgICAgIGxlZnRfc2FtcGxlICogd2VpZ2h0bAorICAgICAgICAgICAgICAgICsKKyAgICAgICAgICAgICAgICByaWdodF9zYW1wbGUgKiB3ZWlnaHRyCisgICAgICAgICAgICAgICAgKworICAgICAgICAgICAgICAgICh0b3BsZWZ0W3gtbG9nb194MV0gICAgKworICAgICAgICAgICAgICAgICB0b3BsZWZ0W3gtbG9nb194MS0xXSAgKworICAgICAgICAgICAgICAgICB0b3BsZWZ0W3gtbG9nb194MSsxXSkgKiB3ZWlnaHR0CisgICAgICAgICAgICAgICAgKworICAgICAgICAgICAgICAgIChib3RsZWZ0W3gtbG9nb194MV0gICAgKworICAgICAgICAgICAgICAgICBib3RsZWZ0W3gtbG9nb194MS0xXSAgKworICAgICAgICAgICAgICAgICBib3RsZWZ0W3gtbG9nb194MSsxXSkgKiB3ZWlnaHRiOworICAgICAgICAgICAgaW50ZXJwIC89ICh3ZWlnaHRsICsgd2VpZ2h0ciArIHdlaWdodHQgKyB3ZWlnaHRiKSAqIDNVOworCisgICAgICAgICAgICBpZiAoeSA+PSBsb2dvX3krYmFuZCAmJiB5IDwgbG9nb195K2xvZ29faC1iYW5kICYmCisgICAgICAgICAgICAgICAgeCA+PSBsb2dvX3grYmFuZCAmJiB4IDwgbG9nb194K2xvZ29fdy1iYW5kKSB7CisgICAgICAgICAgICAgICAgKnhkc3QgPSBpbnRlcnA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRpc3QgPSAwOworCisgICAgICAgICAgICAgICAgaWYgICAgICAoeCA8IGxvZ29feCtiYW5kKQorICAgICAgICAgICAgICAgICAgICBkaXN0ID0gRkZNQVgoZGlzdCwgbG9nb194LXgrYmFuZCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoeCA+PSBsb2dvX3grbG9nb193LWJhbmQpCisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSBGRk1BWChkaXN0LCB4LShsb2dvX3grbG9nb193LTEtYmFuZCkpOworCisgICAgICAgICAgICAgICAgaWYgICAgICAoeSA8IGxvZ29feStiYW5kKQorICAgICAgICAgICAgICAgICAgICBkaXN0ID0gRkZNQVgoZGlzdCwgbG9nb195LXkrYmFuZCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoeSA+PSBsb2dvX3krbG9nb19oLWJhbmQpCisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSBGRk1BWChkaXN0LCB5LShsb2dvX3krbG9nb19oLTEtYmFuZCkpOworCisgICAgICAgICAgICAgICAgKnhkc3QgPSAoKnhzcmMqZGlzdCArIGludGVycCooYmFuZC1kaXN0KSkvYmFuZDsKKyAgICAgICAgICAgICAgICBpZiAoc2hvdyAmJiAoZGlzdCA9PSBiYW5kLTEpKQorICAgICAgICAgICAgICAgICAgICAqeGRzdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkc3QgKz0gZHN0X2xpbmVzaXplOworICAgICAgICBzcmMgKz0gc3JjX2xpbmVzaXplOworICAgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QgRGVsb2dvQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHgsIHksIHcsIGgsIGJhbmQsIHNob3c7Cit9ICBEZWxvZ29Db250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihEZWxvZ29Db250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGRlbG9nb19vcHRpb25zW109IHsKKyAgICB7ICJ4IiwgICAgInNldCBsb2dvIHggcG9zaXRpb24iLCAgICAgICBPRkZTRVQoeCksICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAieSIsICAgICJzZXQgbG9nbyB5IHBvc2l0aW9uIiwgICAgICAgT0ZGU0VUKHkpLCAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInciLCAgICAic2V0IGxvZ28gd2lkdGgiLCAgICAgICAgICAgIE9GRlNFVCh3KSwgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSB9LCAtMSwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJoIiwgICAgInNldCBsb2dvIGhlaWdodCIsICAgICAgICAgICBPRkZTRVQoaCksICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAiYmFuZCIsICJzZXQgZGVsb2dvIGFyZWEgYmFuZCBzaXplIiwgT0ZGU0VUKGJhbmQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9ICA0IH0sICAxLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInQiLCAgICAic2V0IGRlbG9nbyBhcmVhIGJhbmQgc2l6ZSIsIE9GRlNFVChiYW5kKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAgNCB9LCAgMSwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJzaG93IiwgInNob3cgZGVsb2dvIGFyZWEiLCAgICAgICAgICBPRkZTRVQoc2hvdyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gIDAgfSwgIDAsIDEsICAgICAgIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhkZWxvZ28pOworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICBBVl9QSVhfRk1UX1lVVjQyMlAsICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDExUCwgIEFWX1BJWF9GTVRfWVVWNDEwUCwgIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRGVsb2dvQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworI2RlZmluZSBDSEVDS19VTlNFVF9PUFQob3B0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzLT5vcHQgPT0gLTEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk9wdGlvbiAlcyB3YXMgbm90IHNldC5cbiIsICNvcHQpOyBcCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgIENIRUNLX1VOU0VUX09QVCh4KTsKKyAgICBDSEVDS19VTlNFVF9PUFQoeSk7CisgICAgQ0hFQ0tfVU5TRVRfT1BUKHcpOworICAgIENIRUNLX1VOU0VUX09QVChoKTsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAieDolZCB5OiVkLCB3OiVkIGg6JWQgYmFuZDolZCBzaG93OiVkXG4iLAorICAgICAgICAgICBzLT54LCBzLT55LCBzLT53LCBzLT5oLCBzLT5iYW5kLCBzLT5zaG93KTsKKworICAgIHMtPncgKz0gcy0+YmFuZCoyOworICAgIHMtPmggKz0gcy0+YmFuZCoyOworICAgIHMtPnggLT0gcy0+YmFuZDsKKyAgICBzLT55IC09IHMtPmJhbmQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIERlbG9nb0NvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IGhzdWIwID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBpbnQgdnN1YjAgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworICAgIGludCBkaXJlY3QgPSAwOworICAgIGludCBwbGFuZTsKKyAgICBBVlJhdGlvbmFsIHNhcjsKKworICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShpbikpIHsKKyAgICAgICAgZGlyZWN0ID0gMTsKKyAgICAgICAgb3V0ID0gaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICAgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0KKworICAgIHNhciA9IGluLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgIC8qIEFzc3VtZSBzcXVhcmUgcGl4ZWxzIGlmIFNBUiBpcyB1bmtub3duICovCisgICAgaWYgKCFzYXIubnVtKQorICAgICAgICBzYXIubnVtID0gc2FyLmRlbiA9IDE7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCA0ICYmIGluLT5kYXRhW3BsYW5lXSAmJiBpbi0+bGluZXNpemVbcGxhbmVdOyBwbGFuZSsrKSB7CisgICAgICAgIGludCBoc3ViID0gcGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyID8gaHN1YjAgOiAwOworICAgICAgICBpbnQgdnN1YiA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IHZzdWIwIDogMDsKKworICAgICAgICBhcHBseV9kZWxvZ28ob3V0LT5kYXRhW3BsYW5lXSwgb3V0LT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICBpbiAtPmRhdGFbcGxhbmVdLCBpbiAtPmxpbmVzaXplW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgIEZGX0NFSUxfUlNISUZUKGlubGluay0+dywgaHN1YiksCisgICAgICAgICAgICAgICAgICAgICBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpLAorICAgICAgICAgICAgICAgICAgICAgc2FyLCBzLT54Pj5oc3ViLCBzLT55Pj52c3ViLAorICAgICAgICAgICAgICAgICAgICAgLyogVXAgYW5kIGxlZnQgYm9yZGVycyB3ZXJlIHJvdW5kZWQgZG93biwgaW5qZWN0IGxvc3QgYml0cworICAgICAgICAgICAgICAgICAgICAgICogaW50byB3aWR0aCBhbmQgaGVpZ2h0IHRvIGF2b2lkIGVycm9yIGFjY3VtdWxhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgRkZfQ0VJTF9SU0hJRlQocy0+dyArIChzLT54ICYgKCgxPDxoc3ViKS0xKSksIGhzdWIpLAorICAgICAgICAgICAgICAgICAgICAgRkZfQ0VJTF9SU0hJRlQocy0+aCArIChzLT55ICYgKCgxPDx2c3ViKS0xKSksIHZzdWIpLAorICAgICAgICAgICAgICAgICAgICAgcy0+YmFuZD4+RkZNSU4oaHN1YiwgdnN1YiksCisgICAgICAgICAgICAgICAgICAgICBzLT5zaG93LCBkaXJlY3QpOworICAgIH0KKworICAgIGlmICghZGlyZWN0KQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9kZWxvZ29faW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9kZWxvZ29fb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2RlbG9nbyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJkZWxvZ28iLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlbW92ZSBsb2dvIGZyb20gaW5wdXQgdmlkZW8uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRGVsb2dvQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmZGVsb2dvX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl92Zl9kZWxvZ29faW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfdmZfZGVsb2dvX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZGVzaGFrZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2Rlc2hha2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQ1NDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2Rlc2hha2UuYwpAQCAtMCwwICsxLDU3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHZW9yZyBNYXJ0aXVzIDxnZW9yZy5tYXJ0aXVzQHdlYi5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBEYW5pZWwgRy4gVGF5bG9yIDxkYW5AcHJvZ3JhbW1lci1hcnQub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBmYXN0IGRlc2hha2UgLyBkZXBhbiB2aWRlbyBmaWx0ZXIKKyAqCisgKiBTQUQgYmxvY2stbWF0Y2hpbmcgbW90aW9uIGNvbXBlbnNhdGlvbiB0byBmaXggc21hbGwgY2hhbmdlcyBpbgorICogaG9yaXpvbnRhbCBhbmQvb3IgdmVydGljYWwgc2hpZnQuIFRoaXMgZmlsdGVyIGhlbHBzIHJlbW92ZSBjYW1lcmEgc2hha2UKKyAqIGZyb20gaGFuZC1ob2xkaW5nIGEgY2FtZXJhLCBidW1waW5nIGEgdHJpcG9kLCBtb3Zpbmcgb24gYSB2ZWhpY2xlLCBldGMuCisgKgorICogQWxnb3JpdGhtOgorICogICAtIEZvciBlYWNoIGZyYW1lIHdpdGggb25lIHByZXZpb3VzIHJlZmVyZW5jZSBmcmFtZQorICogICAgICAgLSBGb3IgZWFjaCBibG9jayBpbiB0aGUgZnJhbWUKKyAqICAgICAgICAgICAtIElmIGNvbnRyYXN0ID4gdGhyZXNob2xkIHRoZW4gZmluZCBsaWtlbHkgbW90aW9uIHZlY3RvcgorICogICAgICAgLSBGb3IgYWxsIGZvdW5kIG1vdGlvbiB2ZWN0b3JzCisgKiAgICAgICAgICAgLSBGaW5kIG1vc3QgY29tbW9uLCBzdG9yZSBhcyBnbG9iYWwgbW90aW9uIHZlY3RvcgorICogICAgICAgLSBGaW5kIG1vc3QgbGlrZWx5IHJvdGF0aW9uIGFuZ2xlCisgKiAgICAgICAtIFRyYW5zZm9ybSBpbWFnZSBhbG9uZyBnbG9iYWwgbW90aW9uCisgKgorICogVE9ETzoKKyAqICAgLSBGaWxsIGZyYW1lIGVkZ2VzIGJhc2VkIG9uIHByZXZpb3VzL25leHQgcmVmZXJlbmNlIGZyYW1lcworICogICAtIEZpbGwgZnJhbWUgZWRnZXMgYnkgc3RyZXRjaGluZyBpbWFnZSBuZWFyIHRoZSBlZGdlcz8KKyAqICAgICAgIC0gQ2FuIHRoaXMgYmUgZG9uZSBxdWlja2x5IGFuZCBsb29rIGRlY2VudD8KKyAqCisgKiBEYXJrIFNoaWthcmkgbGlua3MgdG8gaHR0cDovL3dpa2kudmlkZW9sYW4ub3JnL1NvQ194MjY0XzIwMTAjR1BVX01vdGlvbl9Fc3RpbWF0aW9uXzIKKyAqIGZvciBhbiBhbGdvcml0aG0gc2ltaWxhciB0byB3aGF0IGNvdWxkIGJlIHVzZWQgaGVyZSB0byBnZXQgdGhlIGdtdgorICogSXQgcmVxdWlyZXMgb25seSBhIGNvdXBsZSBkaWFtb25kIHNlYXJjaGVzICsgZmFzdCBkb3duc2NhbGluZworICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIEphc29uIEtvdGVua28gZm9yIGhpcyBoZWxwIHdpdGggdGhlIGFsZ29yaXRobSBhbmQgbXkKKyAqIGluYWJpbGl0eSB0byBzZWUgc2ltcGxlIGVycm9ycyBpbiBDIGNvZGUuCisgKi8KKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiZGVzaGFrZS5oIgorI2luY2x1ZGUgImRlc2hha2Vfb3BlbmNsLmgiCisKKyNkZWZpbmUgQ0hST01BX1dJRFRIKGxpbmspICAoLSgoLShsaW5rKS0+dykgPj4gYXZfcGl4X2ZtdF9kZXNjX2dldCgobGluayktPmZvcm1hdCktPmxvZzJfY2hyb21hX3cpKQorI2RlZmluZSBDSFJPTUFfSEVJR0hUKGxpbmspICgtKCgtKGxpbmspLT5oKSA+PiBhdl9waXhfZm10X2Rlc2NfZ2V0KChsaW5rKS0+Zm9ybWF0KS0+bG9nMl9jaHJvbWFfaCkpCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKERlc2hha2VDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGRlc2hha2Vfb3B0aW9uc1tdID0geworICAgIHsgIngiLCAic2V0IHggZm9yIHRoZSByZWN0YW5ndWxhciBzZWFyY2ggYXJlYSIsICAgICAgT0ZGU0VUKGN4KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0tMX0sIC0xLCBJTlRfTUFYLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInkiLCAic2V0IHkgZm9yIHRoZSByZWN0YW5ndWxhciBzZWFyY2ggYXJlYSIsICAgICAgT0ZGU0VUKGN5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0tMX0sIC0xLCBJTlRfTUFYLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInciLCAic2V0IHdpZHRoIGZvciB0aGUgcmVjdGFuZ3VsYXIgc2VhcmNoIGFyZWEiLCAgT0ZGU0VUKGN3KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0tMX0sIC0xLCBJTlRfTUFYLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImgiLCAic2V0IGhlaWdodCBmb3IgdGhlIHJlY3Rhbmd1bGFyIHNlYXJjaCBhcmVhIiwgT0ZGU0VUKGNoKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0tMX0sIC0xLCBJTlRfTUFYLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInJ4IiwgInNldCB4IGZvciB0aGUgcmVjdGFuZ3VsYXIgc2VhcmNoIGFyZWEiLCAgICAgT0ZGU0VUKHJ4KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xNn0sIDAsIE1BWF9SLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInJ5IiwgInNldCB5IGZvciB0aGUgcmVjdGFuZ3VsYXIgc2VhcmNoIGFyZWEiLCAgICAgT0ZGU0VUKHJ5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xNn0sIDAsIE1BWF9SLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImVkZ2UiLCAic2V0IGVkZ2UgbW9kZSIsIE9GRlNFVChlZGdlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1GSUxMX01JUlJPUn0sIEZJTExfQkxBTkssIEZJTExfQ09VTlQtMSwgRkxBR1MsICJlZGdlIn0sCisgICAgICAgIHsgImJsYW5rIiwgICAgImZpbGwgemVyb2VzIGF0IGJsYW5rIGxvY2F0aW9ucyIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZJTExfQkxBTkt9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImVkZ2UiIH0sCisgICAgICAgIHsgIm9yaWdpbmFsIiwgIm9yaWdpbmFsIGltYWdlIGF0IGJsYW5rIGxvY2F0aW9ucyIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZJTExfT1JJR0lOQUx9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImVkZ2UiIH0sCisgICAgICAgIHsgImNsYW1wIiwgICAgImV4dHJ1ZGVkIGVkZ2UgdmFsdWUgYXQgYmxhbmsgbG9jYXRpb25zIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZJTExfQ0xBTVB9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImVkZ2UiIH0sCisgICAgICAgIHsgIm1pcnJvciIsICAgIm1pcnJvcmVkIGVkZ2UgYXQgYmxhbmsgbG9jYXRpb25zIiwgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZJTExfTUlSUk9SfSwgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImVkZ2UiIH0sCisgICAgeyAiYmxvY2tzaXplIiwgInNldCBtb3Rpb24gc2VhcmNoIGJsb2Nrc2l6ZSIsICAgICAgIE9GRlNFVChibG9ja3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTh9LCAgIDQsIDEyOCwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJjb250cmFzdCIsICAic2V0IGNvbnRyYXN0IHRocmVzaG9sZCBmb3IgYmxvY2tzIiwgT0ZGU0VUKGNvbnRyYXN0KSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MTI1fSwgMSwgMjU1LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInNlYXJjaCIsICAic2V0IHNlYXJjaCBzdHJhdGVneSIsIE9GRlNFVChzZWFyY2gpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUVYSEFVU1RJVkV9LCBFWEhBVVNUSVZFLCBTRUFSQ0hfQ09VTlQtMSwgRkxBR1MsICJzbW9kZSIgfSwKKyAgICAgICAgeyAiZXhoYXVzdGl2ZSIsICJleGhhdXN0aXZlIHNlYXJjaCIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUVYSEFVU1RJVkV9LCAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInNtb2RlIiB9LAorICAgICAgICB7ICJsZXNzIiwgICAgICAgImxlc3MgZXhoYXVzdGl2ZSBzZWFyY2giLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U01BUlRfRVhIQVVTVElWRX0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAic21vZGUiIH0sCisgICAgeyAiZmlsZW5hbWUiLCAic2V0IG1vdGlvbiBzZWFyY2ggZGV0YWlsZWQgbG9nIGZpbGUgbmFtZSIsIE9GRlNFVChmaWxlbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAib3BlbmNsIiwgInVzZSBPcGVuQ0wgZmlsdGVyaW5nIGNhcGFiaWxpdGllcyIsIE9GRlNFVChvcGVuY2wpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZGVzaGFrZSk7CisKK3N0YXRpYyBpbnQgY21wKGNvbnN0IGRvdWJsZSAqYSwgY29uc3QgZG91YmxlICpiKQoreworICAgIHJldHVybiAqYSA8ICpiID8gLTEgOiAoICphID4gKmIgPyAxIDogMCApOworfQorCisvKioKKyAqIENsZWFuZWQgbWVhbiAoY3V0cyBvZmYgMjAlIG9mIHZhbHVlcyB0byByZW1vdmUgb3V0bGllcnMgYW5kIHRoZW4gYXZlcmFnZXMpCisgKi8KK3N0YXRpYyBkb3VibGUgY2xlYW5fbWVhbihkb3VibGUgKnZhbHVlcywgaW50IGNvdW50KQoreworICAgIGRvdWJsZSBtZWFuID0gMDsKKyAgICBpbnQgY3V0ID0gY291bnQgLyA1OworICAgIGludCB4OworCisgICAgcXNvcnQodmFsdWVzLCBjb3VudCwgc2l6ZW9mKGRvdWJsZSksICh2b2lkKiljbXApOworCisgICAgZm9yICh4ID0gY3V0OyB4IDwgY291bnQgLSBjdXQ7IHgrKykgeworICAgICAgICBtZWFuICs9IHZhbHVlc1t4XTsKKyAgICB9CisKKyAgICByZXR1cm4gbWVhbiAvIChjb3VudCAtIGN1dCAqIDIpOworfQorCisvKioKKyAqIEZpbmQgdGhlIG1vc3QgbGlrZWx5IHNoaWZ0IGluIG1vdGlvbiBiZXR3ZWVuIHR3byBmcmFtZXMgZm9yIGEgZ2l2ZW4KKyAqIG1hY3JvYmxvY2suIFRlc3QgZWFjaCBibG9jayBhZ2FpbnN0IHNldmVyYWwgc2hpZnRzIGdpdmVuIGJ5IHRoZSByeAorICogYW5kIHJ5IGF0dHJpYnV0ZXMuIFNlYXJjaGVzIHVzaW5nIGEgc2ltcGxlIG1hdHJpeCBvZiB0aG9zZSBzaGlmdHMgYW5kCisgKiBjaG9vc2VzIHRoZSBtb3N0IGxpa2VseSBzaGlmdCBieSB0aGUgc21hbGxlc3QgZGlmZmVyZW5jZSBpbiBibG9ja3MuCisgKi8KK3N0YXRpYyB2b2lkIGZpbmRfYmxvY2tfbW90aW9uKERlc2hha2VDb250ZXh0ICpkZXNoYWtlLCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjMiwgaW50IGN4LCBpbnQgY3ksIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRNb3Rpb25WZWN0b3IgKm12KQoreworICAgIGludCB4LCB5OworICAgIGludCBkaWZmOworICAgIGludCBzbWFsbGVzdCA9IElOVF9NQVg7CisgICAgaW50IHRtcCwgdG1wMjsKKworICAgICNkZWZpbmUgQ01QKGksIGopIGRlc2hha2UtPnNhZChzcmMxICsgY3kgICogc3RyaWRlICsgY3gsICBzdHJpZGUsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyICsgKGopICogc3RyaWRlICsgKGkpLCBzdHJpZGUpCisKKyAgICBpZiAoZGVzaGFrZS0+c2VhcmNoID09IEVYSEFVU1RJVkUpIHsKKyAgICAgICAgLy8gQ29tcGFyZSBldmVyeSBwb3NzaWJsZSBwb3NpdGlvbiAtIHRoaXMgaXMgc2xvb29vdyEKKyAgICAgICAgZm9yICh5ID0gLWRlc2hha2UtPnJ5OyB5IDw9IGRlc2hha2UtPnJ5OyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IC1kZXNoYWtlLT5yeDsgeCA8PSBkZXNoYWtlLT5yeDsgeCsrKSB7CisgICAgICAgICAgICAgICAgZGlmZiA9IENNUChjeCAtIHgsIGN5IC0geSk7CisgICAgICAgICAgICAgICAgaWYgKGRpZmYgPCBzbWFsbGVzdCkgeworICAgICAgICAgICAgICAgICAgICBzbWFsbGVzdCA9IGRpZmY7CisgICAgICAgICAgICAgICAgICAgIG12LT54ID0geDsKKyAgICAgICAgICAgICAgICAgICAgbXYtPnkgPSB5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZGVzaGFrZS0+c2VhcmNoID09IFNNQVJUX0VYSEFVU1RJVkUpIHsKKyAgICAgICAgLy8gQ29tcGFyZSBldmVyeSBvdGhlciBwb3NzaWJsZSBwb3NpdGlvbiBhbmQgZmluZCB0aGUgYmVzdCBtYXRjaAorICAgICAgICBmb3IgKHkgPSAtZGVzaGFrZS0+cnkgKyAxOyB5IDwgZGVzaGFrZS0+cnk7IHkgKz0gMikgeworICAgICAgICAgICAgZm9yICh4ID0gLWRlc2hha2UtPnJ4ICsgMTsgeCA8IGRlc2hha2UtPnJ4OyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBkaWZmID0gQ01QKGN4IC0geCwgY3kgLSB5KTsKKyAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IHNtYWxsZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0ID0gZGlmZjsKKyAgICAgICAgICAgICAgICAgICAgbXYtPnggPSB4OworICAgICAgICAgICAgICAgICAgICBtdi0+eSA9IHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSG9uZSBpbiBvbiB0aGUgc3BlY2lmaWMgYmVzdCBtYXRjaCBhcm91bmQgdGhlIG1hdGNoIHdlIGZvdW5kIGFib3ZlCisgICAgICAgIHRtcCA9IG12LT54OworICAgICAgICB0bXAyID0gbXYtPnk7CisKKyAgICAgICAgZm9yICh5ID0gdG1wMiAtIDE7IHkgPD0gdG1wMiArIDE7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gdG1wIC0gMTsgeCA8PSB0bXAgKyAxOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSB0bXAgJiYgeSA9PSB0bXAyKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGRpZmYgPSBDTVAoY3ggLSB4LCBjeSAtIHkpOworICAgICAgICAgICAgICAgIGlmIChkaWZmIDwgc21hbGxlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgc21hbGxlc3QgPSBkaWZmOworICAgICAgICAgICAgICAgICAgICBtdi0+eCA9IHg7CisgICAgICAgICAgICAgICAgICAgIG12LT55ID0geTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc21hbGxlc3QgPiA1MTIpIHsKKyAgICAgICAgbXYtPnggPSAtMTsKKyAgICAgICAgbXYtPnkgPSAtMTsKKyAgICB9CisgICAgZW1tc19jKCk7CisgICAgLy9hdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWRcbiIsIHNtYWxsZXN0KTsKKyAgICAvL2F2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGaW5hbDogKCVkLCAlZCkgPSAlZCB4ICVkXG4iLCBjeCwgY3ksIG12LT54LCBtdi0+eSk7Cit9CisKKy8qKgorICogRmluZCB0aGUgY29udHJhc3Qgb2YgYSBnaXZlbiBibG9jay4gV2hlbiBzZWFyY2hpbmcgZm9yIGdsb2JhbCBtb3Rpb24gd2UKKyAqIHJlYWxseSBvbmx5IGNhcmUgYWJvdXQgdGhlIGhpZ2ggY29udHJhc3QgYmxvY2tzLCBzbyB1c2luZyB0aGlzIG1ldGhvZCB3ZQorICogY2FuIGFjdHVhbGx5IHNraXAgYmxvY2tzIHdlIGRvbid0IGNhcmUgbXVjaCBhYm91dC4KKyAqLworc3RhdGljIGludCBibG9ja19jb250cmFzdCh1aW50OF90ICpzcmMsIGludCB4LCBpbnQgeSwgaW50IHN0cmlkZSwgaW50IGJsb2Nrc2l6ZSkKK3sKKyAgICBpbnQgaGlnaGVzdCA9IDA7CisgICAgaW50IGxvd2VzdCA9IDI1NTsKKyAgICBpbnQgaSwgaiwgcG9zOworCisgICAgZm9yIChpID0gMDsgaSA8PSBibG9ja3NpemUgKiAyOyBpKyspIHsKKyAgICAgICAgLy8gV2UgdXNlIGEgd2lkdGggb2YgMTYgaGVyZSB0byBtYXRjaCB0aGUgc2FkIGZ1bmN0aW9uCisgICAgICAgIGZvciAoaiA9IDA7IGogPD0gMTU7IGorKykgeworICAgICAgICAgICAgcG9zID0gKHkgLSBpKSAqIHN0cmlkZSArICh4IC0gaik7CisgICAgICAgICAgICBpZiAoc3JjW3Bvc10gPCBsb3dlc3QpCisgICAgICAgICAgICAgICAgbG93ZXN0ID0gc3JjW3Bvc107CisgICAgICAgICAgICBlbHNlIGlmIChzcmNbcG9zXSA+IGhpZ2hlc3QpIHsKKyAgICAgICAgICAgICAgICBoaWdoZXN0ID0gc3JjW3Bvc107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaGlnaGVzdCAtIGxvd2VzdDsKK30KKworLyoqCisgKiBGaW5kIHRoZSByb3RhdGlvbiBmb3IgYSBnaXZlbiBibG9jay4KKyAqLworc3RhdGljIGRvdWJsZSBibG9ja19hbmdsZShpbnQgeCwgaW50IHksIGludCBjeCwgaW50IGN5LCBJbnRNb3Rpb25WZWN0b3IgKnNoaWZ0KQoreworICAgIGRvdWJsZSBhMSwgYTIsIGRpZmY7CisKKyAgICBhMSA9IGF0YW4yKHkgLSBjeSwgeCAtIGN4KTsKKyAgICBhMiA9IGF0YW4yKHkgLSBjeSArIHNoaWZ0LT55LCB4IC0gY3ggKyBzaGlmdC0+eCk7CisKKyAgICBkaWZmID0gYTIgLSBhMTsKKworICAgIHJldHVybiAoZGlmZiA+IE1fUEkpICA/IGRpZmYgLSAyICogTV9QSSA6CisgICAgICAgICAgIChkaWZmIDwgLU1fUEkpID8gZGlmZiArIDIgKiBNX1BJIDoKKyAgICAgICAgICAgZGlmZjsKK30KKworLyoqCisgKiBGaW5kIHRoZSBlc3RpbWF0ZWQgZ2xvYmFsIG1vdGlvbiBmb3IgYSBzY2VuZSBnaXZlbiB0aGUgbW9zdCBsaWtlbHkgc2hpZnQKKyAqIGZvciBlYWNoIGJsb2NrIGluIHRoZSBmcmFtZS4gVGhlIGdsb2JhbCBtb3Rpb24gaXMgZXN0aW1hdGVkIHRvIGJlIHRoZQorICogc2FtZSBhcyB0aGUgbW90aW9uIGZyb20gbW9zdCBibG9ja3MgaW4gdGhlIGZyYW1lLCBzbyBpZiBtb3N0IGJsb2NrcworICogbW92ZSBvbmUgcGl4ZWwgdG8gdGhlIHJpZ2h0IGFuZCB0d28gcGl4ZWxzIGRvd24sIHRoaXMgd291bGQgeWllbGQgYQorICogbW90aW9uIHZlY3RvciAoMSwgLTIpLgorICovCitzdGF0aWMgdm9pZCBmaW5kX21vdGlvbihEZXNoYWtlQ29udGV4dCAqZGVzaGFrZSwgdWludDhfdCAqc3JjMSwgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgVHJhbnNmb3JtICp0KQoreworICAgIGludCB4LCB5OworICAgIEludE1vdGlvblZlY3RvciBtdiA9IHswLCAwfTsKKyAgICBpbnQgY291bnRfbWF4X3ZhbHVlID0gMDsKKyAgICBpbnQgY29udHJhc3Q7CisKKyAgICBpbnQgcG9zOworICAgIGludCBjZW50ZXJfeCA9IDAsIGNlbnRlcl95ID0gMDsKKyAgICBkb3VibGUgcF94LCBwX3k7CisKKyAgICBhdl9mYXN0X21hbGxvYygmZGVzaGFrZS0+YW5nbGVzLCAmZGVzaGFrZS0+YW5nbGVzX3NpemUsIHdpZHRoICogaGVpZ2h0IC8gKDE2ICogZGVzaGFrZS0+YmxvY2tzaXplKSAqIHNpemVvZigqZGVzaGFrZS0+YW5nbGVzKSk7CisKKyAgICAvLyBSZXNldCBjb3VudHMgdG8gemVybworICAgIGZvciAoeCA9IDA7IHggPCBkZXNoYWtlLT5yeCAqIDIgKyAxOyB4KyspIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc2hha2UtPnJ5ICogMiArIDE7IHkrKykgeworICAgICAgICAgICAgZGVzaGFrZS0+Y291bnRzW3hdW3ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBvcyA9IDA7CisgICAgLy8gRmluZCBtb3Rpb24gZm9yIGV2ZXJ5IGJsb2NrIGFuZCBzdG9yZSB0aGUgbW90aW9uIHZlY3RvciBpbiB0aGUgY291bnRzCisgICAgZm9yICh5ID0gZGVzaGFrZS0+cnk7IHkgPCBoZWlnaHQgLSBkZXNoYWtlLT5yeSAtIChkZXNoYWtlLT5ibG9ja3NpemUgKiAyKTsgeSArPSBkZXNoYWtlLT5ibG9ja3NpemUgKiAyKSB7CisgICAgICAgIC8vIFdlIHVzZSBhIHdpZHRoIG9mIDE2IGhlcmUgdG8gbWF0Y2ggdGhlIHNhZCBmdW5jdGlvbgorICAgICAgICBmb3IgKHggPSBkZXNoYWtlLT5yeDsgeCA8IHdpZHRoIC0gZGVzaGFrZS0+cnggLSAxNjsgeCArPSAxNikgeworICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRyYXN0IGlzIHRvbyBsb3csIGp1c3Qgc2tpcCB0aGlzIGJsb2NrIGFzIGl0IHByb2JhYmx5CisgICAgICAgICAgICAvLyB3b24ndCBiZSB2ZXJ5IHVzZWZ1bCB0byB1cy4KKyAgICAgICAgICAgIGNvbnRyYXN0ID0gYmxvY2tfY29udHJhc3Qoc3JjMiwgeCwgeSwgc3RyaWRlLCBkZXNoYWtlLT5ibG9ja3NpemUpOworICAgICAgICAgICAgaWYgKGNvbnRyYXN0ID4gZGVzaGFrZS0+Y29udHJhc3QpIHsKKyAgICAgICAgICAgICAgICAvL2F2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZFxuIiwgY29udHJhc3QpOworICAgICAgICAgICAgICAgIGZpbmRfYmxvY2tfbW90aW9uKGRlc2hha2UsIHNyYzEsIHNyYzIsIHgsIHksIHN0cmlkZSwgJm12KTsKKyAgICAgICAgICAgICAgICBpZiAobXYueCAhPSAtMSAmJiBtdi55ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2hha2UtPmNvdW50c1ttdi54ICsgZGVzaGFrZS0+cnhdW212LnkgKyBkZXNoYWtlLT5yeV0gKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPiBkZXNoYWtlLT5yeCAmJiB5ID4gZGVzaGFrZS0+cnkpCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNoYWtlLT5hbmdsZXNbcG9zKytdID0gYmxvY2tfYW5nbGUoeCwgeSwgMCwgMCwgJm12KTsKKworICAgICAgICAgICAgICAgICAgICBjZW50ZXJfeCArPSBtdi54OworICAgICAgICAgICAgICAgICAgICBjZW50ZXJfeSArPSBtdi55OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwb3MpIHsKKyAgICAgICAgIGNlbnRlcl94IC89IHBvczsKKyAgICAgICAgIGNlbnRlcl95IC89IHBvczsKKyAgICAgICAgIHQtPmFuZ2xlID0gY2xlYW5fbWVhbihkZXNoYWtlLT5hbmdsZXMsIHBvcyk7CisgICAgICAgICBpZiAodC0+YW5nbGUgPCAwLjAwMSkKKyAgICAgICAgICAgICAgdC0+YW5nbGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgICB0LT5hbmdsZSA9IDA7CisgICAgfQorCisgICAgLy8gRmluZCB0aGUgbW9zdCBjb21tb24gbW90aW9uIHZlY3RvciBpbiB0aGUgZnJhbWUgYW5kIHVzZSBpdCBhcyB0aGUgZ212CisgICAgZm9yICh5ID0gZGVzaGFrZS0+cnkgKiAyOyB5ID49IDA7IHktLSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzaGFrZS0+cnggKiAyICsgMTsgeCsrKSB7CisgICAgICAgICAgICAvL2F2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlNWQgIiwgZGVzaGFrZS0+Y291bnRzW3hdW3ldKTsKKyAgICAgICAgICAgIGlmIChkZXNoYWtlLT5jb3VudHNbeF1beV0gPiBjb3VudF9tYXhfdmFsdWUpIHsKKyAgICAgICAgICAgICAgICB0LT52ZWMueCA9IHggLSBkZXNoYWtlLT5yeDsKKyAgICAgICAgICAgICAgICB0LT52ZWMueSA9IHkgLSBkZXNoYWtlLT5yeTsKKyAgICAgICAgICAgICAgICBjb3VudF9tYXhfdmFsdWUgPSBkZXNoYWtlLT5jb3VudHNbeF1beV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9hdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiXG4iKTsKKyAgICB9CisKKyAgICBwX3ggPSAoY2VudGVyX3ggLSB3aWR0aCAvIDIuMCk7CisgICAgcF95ID0gKGNlbnRlcl95IC0gaGVpZ2h0IC8gMi4wKTsKKyAgICB0LT52ZWMueCArPSAoY29zKHQtPmFuZ2xlKS0xKSpwX3ggIC0gc2luKHQtPmFuZ2xlKSpwX3k7CisgICAgdC0+dmVjLnkgKz0gc2luKHQtPmFuZ2xlKSpwX3ggICsgKGNvcyh0LT5hbmdsZSktMSkqcF95OworCisgICAgLy8gQ2xhbXAgbWF4IHNoaWZ0ICYgcm90YXRpb24/CisgICAgdC0+dmVjLnggPSBhdl9jbGlwZih0LT52ZWMueCwgLWRlc2hha2UtPnJ4ICogMiwgZGVzaGFrZS0+cnggKiAyKTsKKyAgICB0LT52ZWMueSA9IGF2X2NsaXBmKHQtPnZlYy55LCAtZGVzaGFrZS0+cnkgKiAyLCBkZXNoYWtlLT5yeSAqIDIpOworICAgIHQtPmFuZ2xlID0gYXZfY2xpcGYodC0+YW5nbGUsIC0wLjEsIDAuMSk7CisKKyAgICAvL2F2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZCB4ICVkXG4iLCBhdmctPngsIGF2Zy0+eSk7Cit9CisKK3N0YXRpYyBpbnQgZGVzaGFrZV90cmFuc2Zvcm1fYyhBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGN3LCBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbWF0cml4X3ksIGNvbnN0IGZsb2F0ICptYXRyaXhfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEludGVycG9sYXRlTWV0aG9kIGludGVycG9sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBGaWxsTWV0aG9kIGZpbGwsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQpCit7CisgICAgaW50IGkgPSAwLCByZXQgPSAwOworICAgIGNvbnN0IGZsb2F0ICptYXRyaXhzWzNdOworICAgIGludCBwbGFuZV93WzNdLCBwbGFuZV9oWzNdOworICAgIG1hdHJpeHNbMF0gPSBtYXRyaXhfeTsKKyAgICBtYXRyaXhzWzFdID0gIG1hdHJpeHNbMl0gPSBtYXRyaXhfdXY7CisgICAgcGxhbmVfd1swXSA9IHdpZHRoOworICAgIHBsYW5lX3dbMV0gPSBwbGFuZV93WzJdID0gY3c7CisgICAgcGxhbmVfaFswXSA9IGhlaWdodDsKKyAgICBwbGFuZV9oWzFdID0gcGxhbmVfaFsyXSA9IGNoOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGx1bWEgYW5kIGNocm9tYSBwbGFuZXMKKyAgICAgICAgcmV0ID0gYXZmaWx0ZXJfdHJhbnNmb3JtKGluLT5kYXRhW2ldLCBvdXQtPmRhdGFbaV0sIGluLT5saW5lc2l6ZVtpXSwgb3V0LT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX3dbaV0sIHBsYW5lX2hbaV0sIG1hdHJpeHNbaV0sIGludGVycG9sYXRlLCBmaWxsKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQgcmV0OworICAgIERlc2hha2VDb250ZXh0ICpkZXNoYWtlID0gY3R4LT5wcml2OworCisgICAgZGVzaGFrZS0+c2FkID0gYXZfcGl4ZWx1dGlsc19nZXRfc2FkX2ZuKDQsIDQsIDEsIGRlc2hha2UpOyAvLyAxNngxNiwgMm5kIHNvdXJjZSB1bmFsaWduZWQKKyAgICBpZiAoIWRlc2hha2UtPnNhZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGRlc2hha2UtPnJlZmNvdW50ID0gMjA7IC8vIFhYWDogYWRkIHRvIG9wdGlvbnM/CisgICAgZGVzaGFrZS0+YmxvY2tzaXplIC89IDI7CisgICAgZGVzaGFrZS0+YmxvY2tzaXplID0gYXZfY2xpcChkZXNoYWtlLT5ibG9ja3NpemUsIDQsIDEyOCk7CisKKyAgICBpZiAoZGVzaGFrZS0+cnggJSAxNikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJyeCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTZcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKGRlc2hha2UtPmZpbGVuYW1lKQorICAgICAgICBkZXNoYWtlLT5mcCA9IGZvcGVuKGRlc2hha2UtPmZpbGVuYW1lLCAidyIpOworICAgIGlmIChkZXNoYWtlLT5mcCkKKyAgICAgICAgZndyaXRlKCJPcmkgeCwgQXZnIHgsIEZpbiB4LCBPcmkgeSwgQXZnIHksIEZpbiB5LCBPcmkgYW5nbGUsIEF2ZyBhbmdsZSwgRmluIGFuZ2xlLCBPcmkgem9vbSwgQXZnIHpvb20sIEZpbiB6b29tXG4iLCBzaXplb2YoY2hhciksIDEwNCwgZGVzaGFrZS0+ZnApOworCisgICAgLy8gUXVhZHdvcmQgYWxpZ24gbGVmdCBlZGdlIG9mIGJveCBmb3IgTU1YIGNvZGUsIGFkanVzdCB3aWR0aCBpZiBuZWNlc3NhcnkKKyAgICAvLyB0byBrZWVwIHJpZ2h0IG1hcmdpbgorICAgIGlmIChkZXNoYWtlLT5jeCA+IDApIHsKKyAgICAgICAgZGVzaGFrZS0+Y3cgKz0gZGVzaGFrZS0+Y3ggLSAoZGVzaGFrZS0+Y3ggJiB+MTUpOworICAgICAgICBkZXNoYWtlLT5jeCAmPSB+MTU7CisgICAgfQorICAgIGRlc2hha2UtPnRyYW5zZm9ybSA9IGRlc2hha2VfdHJhbnNmb3JtX2M7CisgICAgaWYgKCFDT05GSUdfT1BFTkNMICYmIGRlc2hha2UtPm9wZW5jbCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPcGVuQ0wgc3VwcG9ydCB3YXMgbm90IGVuYWJsZWQgaW4gdGhpcyBidWlsZCwgY2Fubm90IGJlIHNlbGVjdGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoQ09ORklHX09QRU5DTCAmJiBkZXNoYWtlLT5vcGVuY2wpIHsKKyAgICAgICAgZGVzaGFrZS0+dHJhbnNmb3JtID0gZmZfb3BlbmNsX3RyYW5zZm9ybTsKKyAgICAgICAgcmV0ID0gZmZfb3BlbmNsX2Rlc2hha2VfaW5pdChjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiY3g6ICVkLCBjeTogJWQsIGN3OiAlZCwgY2g6ICVkLCByeDogJWQsIHJ5OiAlZCwgZWRnZTogJWQgYmxvY2tzaXplOiAlZCBjb250cmFzdDogJWQgc2VhcmNoOiAlZFxuIiwKKyAgICAgICAgICAgZGVzaGFrZS0+Y3gsIGRlc2hha2UtPmN5LCBkZXNoYWtlLT5jdywgZGVzaGFrZS0+Y2gsCisgICAgICAgICAgIGRlc2hha2UtPnJ4LCBkZXNoYWtlLT5yeSwgZGVzaGFrZS0+ZWRnZSwgZGVzaGFrZS0+YmxvY2tzaXplICogMiwgZGVzaGFrZS0+Y29udHJhc3QsIGRlc2hha2UtPnNlYXJjaCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgQVZfUElYX0ZNVF9ZVVY0MjJQLCAgQVZfUElYX0ZNVF9ZVVY0NDRQLCAgQVZfUElYX0ZNVF9ZVVY0MTBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsICBBVl9QSVhfRk1UX1lVVjQ0MFAsICBBVl9QSVhfRk1UX1lVVko0MjBQLCBBVl9QSVhfRk1UX1lVVko0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDBQLCBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBEZXNoYWtlQ29udGV4dCAqZGVzaGFrZSA9IGxpbmstPmRzdC0+cHJpdjsKKworICAgIGRlc2hha2UtPnJlZiA9IE5VTEw7CisgICAgZGVzaGFrZS0+bGFzdC52ZWMueCA9IDA7CisgICAgZGVzaGFrZS0+bGFzdC52ZWMueSA9IDA7CisgICAgZGVzaGFrZS0+bGFzdC5hbmdsZSA9IDA7CisgICAgZGVzaGFrZS0+bGFzdC56b29tID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBEZXNoYWtlQ29udGV4dCAqZGVzaGFrZSA9IGN0eC0+cHJpdjsKKyAgICBpZiAoQ09ORklHX09QRU5DTCAmJiBkZXNoYWtlLT5vcGVuY2wpIHsKKyAgICAgICAgZmZfb3BlbmNsX2Rlc2hha2VfdW5pbml0KGN0eCk7CisgICAgfQorICAgIGF2X2ZyYW1lX2ZyZWUoJmRlc2hha2UtPnJlZik7CisgICAgYXZfZnJlZXAoJmRlc2hha2UtPmFuZ2xlcyk7CisgICAgZGVzaGFrZS0+YW5nbGVzX3NpemUgPSAwOworICAgIGlmIChkZXNoYWtlLT5mcCkKKyAgICAgICAgZmNsb3NlKGRlc2hha2UtPmZwKTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBEZXNoYWtlQ29udGV4dCAqZGVzaGFrZSA9IGxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBsaW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0OworICAgIFRyYW5zZm9ybSB0ID0ge3swfSwwfSwgb3JpZyA9IHt7MH0sMH07CisgICAgZmxvYXQgbWF0cml4X3lbOV0sIG1hdHJpeF91dls5XTsKKyAgICBmbG9hdCBhbHBoYSA9IDIuMCAvIGRlc2hha2UtPnJlZmNvdW50OworICAgIGNoYXIgdG1wWzI1Nl07CisgICAgaW50IHJldCA9IDA7CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKworICAgIGlmIChDT05GSUdfT1BFTkNMICYmIGRlc2hha2UtPm9wZW5jbCkgeworICAgICAgICByZXQgPSBmZl9vcGVuY2xfZGVzaGFrZV9wcm9jZXNzX2lub3V0X2J1ZihsaW5rLT5kc3QsaW4sIG91dCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoZGVzaGFrZS0+Y3ggPCAwIHx8IGRlc2hha2UtPmN5IDwgMCB8fCBkZXNoYWtlLT5jdyA8IDAgfHwgZGVzaGFrZS0+Y2ggPCAwKSB7CisgICAgICAgIC8vIEZpbmQgdGhlIG1vc3QgbGlrZWx5IGdsb2JhbCBtb3Rpb24gZm9yIHRoZSBjdXJyZW50IGZyYW1lCisgICAgICAgIGZpbmRfbW90aW9uKGRlc2hha2UsIChkZXNoYWtlLT5yZWYgPT0gTlVMTCkgPyBpbi0+ZGF0YVswXSA6IGRlc2hha2UtPnJlZi0+ZGF0YVswXSwgaW4tPmRhdGFbMF0sIGxpbmstPncsIGxpbmstPmgsIGluLT5saW5lc2l6ZVswXSwgJnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ4X3QgKnNyYzEgPSAoZGVzaGFrZS0+cmVmID09IE5VTEwpID8gaW4tPmRhdGFbMF0gOiBkZXNoYWtlLT5yZWYtPmRhdGFbMF07CisgICAgICAgIHVpbnQ4X3QgKnNyYzIgPSBpbi0+ZGF0YVswXTsKKworICAgICAgICBkZXNoYWtlLT5jeCA9IEZGTUlOKGRlc2hha2UtPmN4LCBsaW5rLT53KTsKKyAgICAgICAgZGVzaGFrZS0+Y3kgPSBGRk1JTihkZXNoYWtlLT5jeSwgbGluay0+aCk7CisKKyAgICAgICAgaWYgKCh1bnNpZ25lZClkZXNoYWtlLT5jeCArICh1bnNpZ25lZClkZXNoYWtlLT5jdyA+IGxpbmstPncpIGRlc2hha2UtPmN3ID0gbGluay0+dyAtIGRlc2hha2UtPmN4OworICAgICAgICBpZiAoKHVuc2lnbmVkKWRlc2hha2UtPmN5ICsgKHVuc2lnbmVkKWRlc2hha2UtPmNoID4gbGluay0+aCkgZGVzaGFrZS0+Y2ggPSBsaW5rLT5oIC0gZGVzaGFrZS0+Y3k7CisKKyAgICAgICAgLy8gUXVhZHdvcmQgYWxpZ24gcmlnaHQgbWFyZ2luCisgICAgICAgIGRlc2hha2UtPmN3ICY9IH4xNTsKKworICAgICAgICBzcmMxICs9IGRlc2hha2UtPmN5ICogaW4tPmxpbmVzaXplWzBdICsgZGVzaGFrZS0+Y3g7CisgICAgICAgIHNyYzIgKz0gZGVzaGFrZS0+Y3kgKiBpbi0+bGluZXNpemVbMF0gKyBkZXNoYWtlLT5jeDsKKworICAgICAgICBmaW5kX21vdGlvbihkZXNoYWtlLCBzcmMxLCBzcmMyLCBkZXNoYWtlLT5jdywgZGVzaGFrZS0+Y2gsIGluLT5saW5lc2l6ZVswXSwgJnQpOworICAgIH0KKworCisgICAgLy8gQ29weSB0cmFuc2Zvcm0gc28gd2UgY2FuIG91dHB1dCBpdCBsYXRlciB0byBjb21wYXJlIHRvIHRoZSBzbW9vdGhlZCB2YWx1ZQorICAgIG9yaWcudmVjLnggPSB0LnZlYy54OworICAgIG9yaWcudmVjLnkgPSB0LnZlYy55OworICAgIG9yaWcuYW5nbGUgPSB0LmFuZ2xlOworICAgIG9yaWcuem9vbSA9IHQuem9vbTsKKworICAgIC8vIEdlbmVyYXRlIGEgb25lLXNpZGVkIG1vdmluZyBleHBvbmVudGlhbCBhdmVyYWdlCisgICAgZGVzaGFrZS0+YXZnLnZlYy54ID0gYWxwaGEgKiB0LnZlYy54ICsgKDEuMCAtIGFscGhhKSAqIGRlc2hha2UtPmF2Zy52ZWMueDsKKyAgICBkZXNoYWtlLT5hdmcudmVjLnkgPSBhbHBoYSAqIHQudmVjLnkgKyAoMS4wIC0gYWxwaGEpICogZGVzaGFrZS0+YXZnLnZlYy55OworICAgIGRlc2hha2UtPmF2Zy5hbmdsZSA9IGFscGhhICogdC5hbmdsZSArICgxLjAgLSBhbHBoYSkgKiBkZXNoYWtlLT5hdmcuYW5nbGU7CisgICAgZGVzaGFrZS0+YXZnLnpvb20gPSBhbHBoYSAqIHQuem9vbSArICgxLjAgLSBhbHBoYSkgKiBkZXNoYWtlLT5hdmcuem9vbTsKKworICAgIC8vIFJlbW92ZSB0aGUgYXZlcmFnZSBmcm9tIHRoZSBjdXJyZW50IG1vdGlvbiB0byBkZXRlY3QgdGhlIG1vdGlvbiB0aGF0CisgICAgLy8gaXMgbm90IG9uIHB1cnBvc2UsIGp1c3QgYXMgaml0dGVyIGZyb20gYnVtcGluZyB0aGUgY2FtZXJhCisgICAgdC52ZWMueCAtPSBkZXNoYWtlLT5hdmcudmVjLng7CisgICAgdC52ZWMueSAtPSBkZXNoYWtlLT5hdmcudmVjLnk7CisgICAgdC5hbmdsZSAtPSBkZXNoYWtlLT5hdmcuYW5nbGU7CisgICAgdC56b29tIC09IGRlc2hha2UtPmF2Zy56b29tOworCisgICAgLy8gSW52ZXJ0IHRoZSBtb3Rpb24gdG8gdW5kbyBpdAorICAgIHQudmVjLnggKj0gLTE7CisgICAgdC52ZWMueSAqPSAtMTsKKyAgICB0LmFuZ2xlICo9IC0xOworCisgICAgLy8gV3JpdGUgc3RhdGlzdGljcyB0byBmaWxlCisgICAgaWYgKGRlc2hha2UtPmZwKSB7CisgICAgICAgIHNucHJpbnRmKHRtcCwgMjU2LCAiJWYsICVmLCAlZiwgJWYsICVmLCAlZiwgJWYsICVmLCAlZiwgJWYsICVmLCAlZlxuIiwgb3JpZy52ZWMueCwgZGVzaGFrZS0+YXZnLnZlYy54LCB0LnZlYy54LCBvcmlnLnZlYy55LCBkZXNoYWtlLT5hdmcudmVjLnksIHQudmVjLnksIG9yaWcuYW5nbGUsIGRlc2hha2UtPmF2Zy5hbmdsZSwgdC5hbmdsZSwgb3JpZy56b29tLCBkZXNoYWtlLT5hdmcuem9vbSwgdC56b29tKTsKKyAgICAgICAgZndyaXRlKHRtcCwgc2l6ZW9mKGNoYXIpLCBzdHJsZW4odG1wKSwgZGVzaGFrZS0+ZnApOworICAgIH0KKworICAgIC8vIFR1cm4gcmVsYXRpdmUgY3VycmVudCBmcmFtZSBtb3Rpb24gaW50byBhYnNvbHV0ZSBieSBhZGRpbmcgaXQgdG8gdGhlCisgICAgLy8gbGFzdCBhYnNvbHV0ZSBtb3Rpb24KKyAgICB0LnZlYy54ICs9IGRlc2hha2UtPmxhc3QudmVjLng7CisgICAgdC52ZWMueSArPSBkZXNoYWtlLT5sYXN0LnZlYy55OworICAgIHQuYW5nbGUgKz0gZGVzaGFrZS0+bGFzdC5hbmdsZTsKKyAgICB0Lnpvb20gKz0gZGVzaGFrZS0+bGFzdC56b29tOworCisgICAgLy8gU2hyaW5rIG1vdGlvbiBieSAxMCUgdG8ga2VlcCB0aGluZ3MgY2VudGVyZWQgaW4gdGhlIGNhbWVyYSBmcmFtZQorICAgIHQudmVjLnggKj0gMC45OworICAgIHQudmVjLnkgKj0gMC45OworICAgIHQuYW5nbGUgKj0gMC45OworCisgICAgLy8gU3RvcmUgdGhlIGxhc3QgYWJzb2x1dGUgbW90aW9uIGluZm9ybWF0aW9uCisgICAgZGVzaGFrZS0+bGFzdC52ZWMueCA9IHQudmVjLng7CisgICAgZGVzaGFrZS0+bGFzdC52ZWMueSA9IHQudmVjLnk7CisgICAgZGVzaGFrZS0+bGFzdC5hbmdsZSA9IHQuYW5nbGU7CisgICAgZGVzaGFrZS0+bGFzdC56b29tID0gdC56b29tOworCisgICAgLy8gR2VuZXJhdGUgYSBsdW1hIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAorICAgIGF2ZmlsdGVyX2dldF9tYXRyaXgodC52ZWMueCwgdC52ZWMueSwgdC5hbmdsZSwgMS4wICsgdC56b29tIC8gMTAwLjAsIG1hdHJpeF95KTsKKyAgICAvLyBHZW5lcmF0ZSBhIGNocm9tYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKKyAgICBhdmZpbHRlcl9nZXRfbWF0cml4KHQudmVjLnggLyAobGluay0+dyAvIENIUk9NQV9XSURUSChsaW5rKSksIHQudmVjLnkgLyAobGluay0+aCAvIENIUk9NQV9IRUlHSFQobGluaykpLCB0LmFuZ2xlLCAxLjAgKyB0Lnpvb20gLyAxMDAuMCwgbWF0cml4X3V2KTsKKyAgICAvLyBUcmFuc2Zvcm0gdGhlIGx1bWEgYW5kIGNocm9tYSBwbGFuZXMKKyAgICByZXQgPSBkZXNoYWtlLT50cmFuc2Zvcm0obGluay0+ZHN0LCBsaW5rLT53LCBsaW5rLT5oLCBDSFJPTUFfV0lEVEgobGluayksIENIUk9NQV9IRUlHSFQobGluayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeF95LCBtYXRyaXhfdXYsIElOVEVSUE9MQVRFX0JJTElORUFSLCBkZXNoYWtlLT5lZGdlLCBpbiwgb3V0KTsKKworICAgIC8vIENsZWFudXAgdGhlIG9sZCByZWZlcmVuY2UgZnJhbWUKKyAgICBhdl9mcmFtZV9mcmVlKCZkZXNoYWtlLT5yZWYpOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvLyBTdG9yZSB0aGUgY3VycmVudCBmcmFtZSBhcyB0aGUgcmVmZXJlbmNlIGZyYW1lIGZvciBjYWxjdWxhdGluZyB0aGUKKyAgICAvLyBtb3Rpb24gb2YgdGhlIG5leHQgZnJhbWUKKyAgICBkZXNoYWtlLT5yZWYgPSBpbjsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGRlc2hha2VfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBkZXNoYWtlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9kZXNoYWtlID0geworICAgIC5uYW1lICAgICAgICAgID0gImRlc2hha2UiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlN0YWJpbGl6ZSBzaGFreSB2aWRlby4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihEZXNoYWtlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGRlc2hha2VfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gZGVzaGFrZV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmRlc2hha2VfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2RyYXdib3guYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9kcmF3Ym94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1ZGY4OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9kcmF3Ym94LmMKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQWZmaW5lIFN5c3RlbXMsIEluYyAoTWljaGFlbCBTdWxsaXZhbiwgQm9iYnkgSW1wb2xsb25pYSkKKyAqIENvcHlyaWdodCAoYykgMjAxMyBBbmRyZXkgVXRraW4gPGFuZHJleS5rcmllZ2VyLnV0a2luIGdtYWlsIGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQm94IGFuZCBncmlkIGRyYXdpbmcgZmlsdGVycy4gQWxzbyBhIG5pY2UgdGVtcGxhdGUgZm9yIGEgZmlsdGVyCisgKiB0aGF0IG5lZWRzIHRvIHdyaXRlIGluIHRoZSBpbnB1dCBmcmFtZS4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbG9yc3BhY2UuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJkYXIiLAorICAgICJoc3ViIiwgInZzdWIiLAorICAgICJpbl9oIiwgImloIiwgICAgICAvLy88IGhlaWdodCBvZiB0aGUgaW5wdXQgdmlkZW8KKyAgICAiaW5fdyIsICJpdyIsICAgICAgLy8vPCB3aWR0aCAgb2YgdGhlIGlucHV0IHZpZGVvCisgICAgInNhciIsCisgICAgIngiLAorICAgICJ5IiwKKyAgICAiaCIsICAgICAgICAgICAgICAvLy88IGhlaWdodCBvZiB0aGUgcmVuZGVyZWQgYm94CisgICAgInciLCAgICAgICAgICAgICAgLy8vPCB3aWR0aCAgb2YgdGhlIHJlbmRlcmVkIGJveAorICAgICJ0IiwKKyAgICBOVUxMCit9OworCitlbnVtIHsgWSwgVSwgViwgQSB9OworCitlbnVtIHZhcl9uYW1lIHsKKyAgICBWQVJfREFSLAorICAgIFZBUl9IU1VCLCBWQVJfVlNVQiwKKyAgICBWQVJfSU5fSCwgVkFSX0lILAorICAgIFZBUl9JTl9XLCBWQVJfSVcsCisgICAgVkFSX1NBUiwKKyAgICBWQVJfWCwKKyAgICBWQVJfWSwKKyAgICBWQVJfSCwKKyAgICBWQVJfVywKKyAgICBWQVJfVCwKKyAgICBWQVJTX05CCit9OworCit0eXBlZGVmIHN0cnVjdCBEcmF3Qm94Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHgsIHksIHcsIGg7CisgICAgaW50IHRoaWNrbmVzczsKKyAgICBjaGFyICpjb2xvcl9zdHI7CisgICAgdW5zaWduZWQgY2hhciB5dXZfY29sb3JbNF07CisgICAgaW50IGludmVydF9jb2xvcjsgLy8vPCBpbnZlcnQgbHVtYSBjb2xvcgorICAgIGludCB2c3ViLCBoc3ViOyAgIC8vLzwgY2hyb21hIHN1YnNhbXBsaW5nCisgICAgY2hhciAqeF9leHByLCAqeV9leHByOyAvLy88IGV4cHJlc3Npb24gZm9yIHggYW5kIHkKKyAgICBjaGFyICp3X2V4cHIsICpoX2V4cHI7IC8vLzwgZXhwcmVzc2lvbiBmb3Igd2lkdGggYW5kIGhlaWdodAorICAgIGNoYXIgKnRfZXhwcjsgICAgICAgICAgLy8vPCBleHByZXNzaW9uIGZvciB0aGlja25lc3MKK30gRHJhd0JveENvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBpbnQgTlVNX0VYUFJfRVZBTFMgPSA1OworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBEcmF3Qm94Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICB1aW50OF90IHJnYmFfY29sb3JbNF07CisKKyAgICBpZiAoIXN0cmNtcChzLT5jb2xvcl9zdHIsICJpbnZlcnQiKSkKKyAgICAgICAgcy0+aW52ZXJ0X2NvbG9yID0gMTsKKyAgICBlbHNlIGlmIChhdl9wYXJzZV9jb2xvcihyZ2JhX2NvbG9yLCBzLT5jb2xvcl9zdHIsIC0xLCBjdHgpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmICghcy0+aW52ZXJ0X2NvbG9yKSB7CisgICAgICAgIHMtPnl1dl9jb2xvcltZXSA9IFJHQl9UT19ZX0NDSVIocmdiYV9jb2xvclswXSwgcmdiYV9jb2xvclsxXSwgcmdiYV9jb2xvclsyXSk7CisgICAgICAgIHMtPnl1dl9jb2xvcltVXSA9IFJHQl9UT19VX0NDSVIocmdiYV9jb2xvclswXSwgcmdiYV9jb2xvclsxXSwgcmdiYV9jb2xvclsyXSwgMCk7CisgICAgICAgIHMtPnl1dl9jb2xvcltWXSA9IFJHQl9UT19WX0NDSVIocmdiYV9jb2xvclswXSwgcmdiYV9jb2xvclsxXSwgcmdiYV9jb2xvclsyXSwgMCk7CisgICAgICAgIHMtPnl1dl9jb2xvcltBXSA9IHJnYmFfY29sb3JbM107CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgIEFWX1BJWF9GTVRfWVVWNDIyUCwgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLCAgQVZfUElYX0ZNVF9ZVVY0MTBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsICBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIERyYXdCb3hDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGRvdWJsZSB2YXJfdmFsdWVzW1ZBUlNfTkJdLCByZXM7CisgICAgY2hhciAqZXhwcjsKKyAgICBpbnQgcmV0OworICAgIGludCBpOworCisgICAgcy0+aHN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgcy0+dnN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisKKyAgICB2YXJfdmFsdWVzW1ZBUl9JTl9IXSA9IHZhcl92YWx1ZXNbVkFSX0lIXSA9IGlubGluay0+aDsKKyAgICB2YXJfdmFsdWVzW1ZBUl9JTl9XXSA9IHZhcl92YWx1ZXNbVkFSX0lXXSA9IGlubGluay0+dzsKKyAgICB2YXJfdmFsdWVzW1ZBUl9TQVJdICA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPyBhdl9xMmQoaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvKSA6IDE7CisgICAgdmFyX3ZhbHVlc1tWQVJfREFSXSAgPSAoZG91YmxlKWlubGluay0+dyAvIGlubGluay0+aCAqIHZhcl92YWx1ZXNbVkFSX1NBUl07CisgICAgdmFyX3ZhbHVlc1tWQVJfSFNVQl0gPSBzLT5oc3ViOworICAgIHZhcl92YWx1ZXNbVkFSX1ZTVUJdID0gcy0+dnN1YjsKKyAgICB2YXJfdmFsdWVzW1ZBUl9YXSA9IE5BTjsKKyAgICB2YXJfdmFsdWVzW1ZBUl9ZXSA9IE5BTjsKKyAgICB2YXJfdmFsdWVzW1ZBUl9IXSA9IE5BTjsKKyAgICB2YXJfdmFsdWVzW1ZBUl9XXSA9IE5BTjsKKyAgICB2YXJfdmFsdWVzW1ZBUl9UXSA9IE5BTjsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gTlVNX0VYUFJfRVZBTFM7IGkrKykgeworICAgICAgICAvKiBldmFsdWF0ZSBleHByZXNzaW9ucywgZmFpbCBvbiBsYXN0IGl0ZXJhdGlvbiAqLworICAgICAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgKGV4cHIgPSBzLT54X2V4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCB2YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwICYmIGkgPT0gTlVNX0VYUFJfRVZBTFMpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHMtPnggPSB2YXJfdmFsdWVzW1ZBUl9YXSA9IHJlczsKKworICAgICAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgKGV4cHIgPSBzLT55X2V4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCB2YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwICYmIGkgPT0gTlVNX0VYUFJfRVZBTFMpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHMtPnkgPSB2YXJfdmFsdWVzW1ZBUl9ZXSA9IHJlczsKKworICAgICAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgKGV4cHIgPSBzLT53X2V4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCB2YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwICYmIGkgPT0gTlVNX0VYUFJfRVZBTFMpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHMtPncgPSB2YXJfdmFsdWVzW1ZBUl9XXSA9IHJlczsKKworICAgICAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgKGV4cHIgPSBzLT5oX2V4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCB2YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwICYmIGkgPT0gTlVNX0VYUFJfRVZBTFMpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHMtPmggPSB2YXJfdmFsdWVzW1ZBUl9IXSA9IHJlczsKKworICAgICAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgKGV4cHIgPSBzLT50X2V4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCB2YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwICYmIGkgPT0gTlVNX0VYUFJfRVZBTFMpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHMtPnRoaWNrbmVzcyA9IHZhcl92YWx1ZXNbVkFSX1RdID0gcmVzOworICAgIH0KKworICAgIC8qIGlmIHcgb3IgaCBhcmUgemVybywgdXNlIHRoZSBpbnB1dCB3L2ggKi8KKyAgICBzLT53ID0gKHMtPncgPiAwKSA/IHMtPncgOiBpbmxpbmstPnc7CisgICAgcy0+aCA9IChzLT5oID4gMCkgPyBzLT5oIDogaW5saW5rLT5oOworCisgICAgLyogc2FuaXR5IGNoZWNrIHdpZHRoIGFuZCBoZWlnaHQgKi8KKyAgICBpZiAocy0+dyA8ICAwIHx8IHMtPmggPCAgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJTaXplIHZhbHVlcyBsZXNzIHRoYW4gMCBhcmUgbm90IGFjY2VwdGFibGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIng6JWQgeTolZCB3OiVkIGg6JWQgY29sb3I6MHglMDJYJTAyWCUwMlglMDJYXG4iLAorICAgICAgICAgICBzLT54LCBzLT55LCBzLT53LCBzLT5oLAorICAgICAgICAgICBzLT55dXZfY29sb3JbWV0sIHMtPnl1dl9jb2xvcltVXSwgcy0+eXV2X2NvbG9yW1ZdLCBzLT55dXZfY29sb3JbQV0pOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAiRXJyb3Igd2hlbiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uICclcycuXG4iLAorICAgICAgICAgICBleHByKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgRHJhd0JveENvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBpbnQgcGxhbmUsIHgsIHksIHhiID0gcy0+eCwgeWIgPSBzLT55OworICAgIHVuc2lnbmVkIGNoYXIgKnJvd1s0XTsKKworICAgIGZvciAoeSA9IEZGTUFYKHliLCAwKTsgeSA8IGZyYW1lLT5oZWlnaHQgJiYgeSA8ICh5YiArIHMtPmgpOyB5KyspIHsKKyAgICAgICAgcm93WzBdID0gZnJhbWUtPmRhdGFbMF0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzBdOworCisgICAgICAgIGZvciAocGxhbmUgPSAxOyBwbGFuZSA8IDM7IHBsYW5lKyspCisgICAgICAgICAgICByb3dbcGxhbmVdID0gZnJhbWUtPmRhdGFbcGxhbmVdICsKKyAgICAgICAgICAgICAgICAgZnJhbWUtPmxpbmVzaXplW3BsYW5lXSAqICh5ID4+IHMtPnZzdWIpOworCisgICAgICAgIGlmIChzLT5pbnZlcnRfY29sb3IpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IEZGTUFYKHhiLCAwKTsgeCA8IHhiICsgcy0+dyAmJiB4IDwgZnJhbWUtPndpZHRoOyB4KyspCisgICAgICAgICAgICAgICAgaWYgKCh5IC0geWIgPCBzLT50aGlja25lc3MpIHx8ICh5YiArIHMtPmggLSAxIC0geSA8IHMtPnRoaWNrbmVzcykgfHwKKyAgICAgICAgICAgICAgICAgICAgKHggLSB4YiA8IHMtPnRoaWNrbmVzcykgfHwgKHhiICsgcy0+dyAtIDEgLSB4IDwgcy0+dGhpY2tuZXNzKSkKKyAgICAgICAgICAgICAgICAgICAgcm93WzBdW3hdID0gMHhmZiAtIHJvd1swXVt4XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoeCA9IEZGTUFYKHhiLCAwKTsgeCA8IHhiICsgcy0+dyAmJiB4IDwgZnJhbWUtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgYWxwaGEgPSAoZG91YmxlKXMtPnl1dl9jb2xvcltBXSAvIDI1NTsKKworICAgICAgICAgICAgICAgIGlmICgoeSAtIHliIDwgcy0+dGhpY2tuZXNzKSB8fCAoeWIgKyBzLT5oIC0gMSAtIHkgPCBzLT50aGlja25lc3MpIHx8CisgICAgICAgICAgICAgICAgICAgICh4IC0geGIgPCBzLT50aGlja25lc3MpIHx8ICh4YiArIHMtPncgLSAxIC0geCA8IHMtPnRoaWNrbmVzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgcm93WzBdW3ggICAgICAgICAgICAgICAgIF0gPSAoMSAtIGFscGhhKSAqIHJvd1swXVt4ICAgICAgICAgICAgICAgICBdICsgYWxwaGEgKiBzLT55dXZfY29sb3JbWV07CisgICAgICAgICAgICAgICAgICAgIHJvd1sxXVt4ID4+IHMtPmhzdWJdID0gKDEgLSBhbHBoYSkgKiByb3dbMV1beCA+PiBzLT5oc3ViXSArIGFscGhhICogcy0+eXV2X2NvbG9yW1VdOworICAgICAgICAgICAgICAgICAgICByb3dbMl1beCA+PiBzLT5oc3ViXSA9ICgxIC0gYWxwaGEpICogcm93WzJdW3ggPj4gcy0+aHN1Yl0gKyBhbHBoYSAqIHMtPnl1dl9jb2xvcltWXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGlubGluay0+ZHN0LT5vdXRwdXRzWzBdLCBmcmFtZSk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKERyYXdCb3hDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworI2lmIENPTkZJR19EUkFXQk9YX0ZJTFRFUgorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZHJhd2JveF9vcHRpb25zW10gPSB7CisgICAgeyAieCIsICAgICAgICAgInNldCBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBsZWZ0IGJveCBlZGdlIiwgT0ZGU0VUKHhfZXhwciksICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSIwIiB9LCAgICAgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAieSIsICAgICAgICAgInNldCB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgdG9wIGJveCBlZGdlIiwgICAgT0ZGU0VUKHlfZXhwciksICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSIwIiB9LCAgICAgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAid2lkdGgiLCAgICAgInNldCB3aWR0aCBvZiB0aGUgYm94IiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHdfZXhwciksICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSIwIiB9LCAgICAgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAidyIsICAgICAgICAgInNldCB3aWR0aCBvZiB0aGUgYm94IiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHdfZXhwciksICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSIwIiB9LCAgICAgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiaGVpZ2h0IiwgICAgInNldCBoZWlnaHQgb2YgdGhlIGJveCIsICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGhfZXhwciksICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSIwIiB9LCAgICAgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiaCIsICAgICAgICAgInNldCBoZWlnaHQgb2YgdGhlIGJveCIsICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGhfZXhwciksICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSIwIiB9LCAgICAgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiY29sb3IiLCAgICAgInNldCBjb2xvciBvZiB0aGUgYm94IiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGNvbG9yX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gImJsYWNrIiB9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiYyIsICAgICAgICAgInNldCBjb2xvciBvZiB0aGUgYm94IiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGNvbG9yX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gImJsYWNrIiB9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAidGhpY2tuZXNzIiwgInNldCB0aGUgYm94IHRoaWNrbmVzcyIsICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHRfZXhwciksICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSIzIiB9LCAgICAgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAidCIsICAgICAgICAgInNldCB0aGUgYm94IHRoaWNrbmVzcyIsICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHRfZXhwciksICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSIzIiB9LCAgICAgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhkcmF3Ym94KTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGRyYXdib3hfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgID0gY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lICAgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5uZWVkc193cml0YWJsZSA9IDEsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGRyYXdib3hfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2RyYXdib3ggPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiZHJhd2JveCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRHJhdyBhIGNvbG9yZWQgYm94IG9uIHRoZSBpbnB1dCB2aWRlby4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihEcmF3Qm94Q29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmZHJhd2JveF9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gZHJhd2JveF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBkcmF3Ym94X291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CisjZW5kaWYgLyogQ09ORklHX0RSQVdCT1hfRklMVEVSICovCisKKyNpZiBDT05GSUdfRFJBV0dSSURfRklMVEVSCitzdGF0aWMgYXZfcHVyZSBhdl9hbHdheXNfaW5saW5lIGludCBwaXhlbF9iZWxvbmdzX3RvX2dyaWQoRHJhd0JveENvbnRleHQgKmRyYXdncmlkLCBpbnQgeCwgaW50IHkpCit7CisgICAgLy8geCBpcyBob3Jpem9udGFsICh3aWR0aCkgY29vcmQsCisgICAgLy8geSBpcyB2ZXJ0aWNhbCAoaGVpZ2h0KSBjb29yZAorICAgIGludCB4X21vZHVsbzsKKyAgICBpbnQgeV9tb2R1bG87CisKKyAgICAvLyBBYnN0cmFjdCBmcm9tIHRoZSBvZmZzZXQKKyAgICB4IC09IGRyYXdncmlkLT54OworICAgIHkgLT0gZHJhd2dyaWQtPnk7CisKKyAgICB4X21vZHVsbyA9IHggJSBkcmF3Z3JpZC0+dzsKKyAgICB5X21vZHVsbyA9IHkgJSBkcmF3Z3JpZC0+aDsKKworICAgIC8vIElmIHggb3IgeSBnb3QgbmVnYXRpdmUsIGZpeCB2YWx1ZXMgdG8gcHJlc2VydmUgbG9naWNzCisgICAgaWYgKHhfbW9kdWxvIDwgMCkKKyAgICAgICAgeF9tb2R1bG8gKz0gZHJhd2dyaWQtPnc7CisgICAgaWYgKHlfbW9kdWxvIDwgMCkKKyAgICAgICAgeV9tb2R1bG8gKz0gZHJhd2dyaWQtPmg7CisKKyAgICByZXR1cm4geF9tb2R1bG8gPCBkcmF3Z3JpZC0+dGhpY2tuZXNzICAvLyBCZWxvbmdzIHRvIHZlcnRpY2FsIGxpbmUKKyAgICAgICAgfHwgeV9tb2R1bG8gPCBkcmF3Z3JpZC0+dGhpY2tuZXNzOyAgLy8gQmVsb25ncyB0byBob3Jpem9udGFsIGxpbmUKK30KKworc3RhdGljIGludCBkcmF3Z3JpZF9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIERyYXdCb3hDb250ZXh0ICpkcmF3Z3JpZCA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGludCBwbGFuZSwgeCwgeTsKKyAgICB1aW50OF90ICpyb3dbNF07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgZnJhbWUtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIHJvd1swXSA9IGZyYW1lLT5kYXRhWzBdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVswXTsKKworICAgICAgICBmb3IgKHBsYW5lID0gMTsgcGxhbmUgPCAzOyBwbGFuZSsrKQorICAgICAgICAgICAgcm93W3BsYW5lXSA9IGZyYW1lLT5kYXRhW3BsYW5lXSArCisgICAgICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVtwbGFuZV0gKiAoeSA+PiBkcmF3Z3JpZC0+dnN1Yik7CisKKyAgICAgICAgaWYgKGRyYXdncmlkLT5pbnZlcnRfY29sb3IpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBmcmFtZS0+d2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICBpZiAocGl4ZWxfYmVsb25nc190b19ncmlkKGRyYXdncmlkLCB4LCB5KSkKKyAgICAgICAgICAgICAgICAgICAgcm93WzBdW3hdID0gMHhmZiAtIHJvd1swXVt4XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBmcmFtZS0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGRvdWJsZSBhbHBoYSA9IChkb3VibGUpZHJhd2dyaWQtPnl1dl9jb2xvcltBXSAvIDI1NTsKKworICAgICAgICAgICAgICAgIGlmIChwaXhlbF9iZWxvbmdzX3RvX2dyaWQoZHJhd2dyaWQsIHgsIHkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJvd1swXVt4ICAgICAgICAgICAgICAgICAgXSA9ICgxIC0gYWxwaGEpICogcm93WzBdW3ggICAgICAgICAgICAgICAgICBdICsgYWxwaGEgKiBkcmF3Z3JpZC0+eXV2X2NvbG9yW1ldOworICAgICAgICAgICAgICAgICAgICByb3dbMV1beCA+PiBkcmF3Z3JpZC0+aHN1Yl0gPSAoMSAtIGFscGhhKSAqIHJvd1sxXVt4ID4+IGRyYXdncmlkLT5oc3ViXSArIGFscGhhICogZHJhd2dyaWQtPnl1dl9jb2xvcltVXTsKKyAgICAgICAgICAgICAgICAgICAgcm93WzJdW3ggPj4gZHJhd2dyaWQtPmhzdWJdID0gKDEgLSBhbHBoYSkgKiByb3dbMl1beCA+PiBkcmF3Z3JpZC0+aHN1Yl0gKyBhbHBoYSAqIGRyYXdncmlkLT55dXZfY29sb3JbVl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShpbmxpbmstPmRzdC0+b3V0cHV0c1swXSwgZnJhbWUpOworfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZHJhd2dyaWRfb3B0aW9uc1tdID0geworICAgIHsgIngiLCAgICAgICAgICJzZXQgaG9yaXpvbnRhbCBvZmZzZXQiLCAgIE9GRlNFVCh4X2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0cj0iMCIgfSwgICAgICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgInkiLCAgICAgICAgICJzZXQgdmVydGljYWwgb2Zmc2V0IiwgICAgIE9GRlNFVCh5X2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0cj0iMCIgfSwgICAgICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgIndpZHRoIiwgICAgICJzZXQgd2lkdGggb2YgZ3JpZCBjZWxsIiwgIE9GRlNFVCh3X2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0cj0iMCIgfSwgICAgICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgInciLCAgICAgICAgICJzZXQgd2lkdGggb2YgZ3JpZCBjZWxsIiwgIE9GRlNFVCh3X2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0cj0iMCIgfSwgICAgICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImhlaWdodCIsICAgICJzZXQgaGVpZ2h0IG9mIGdyaWQgY2VsbCIsIE9GRlNFVChoX2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0cj0iMCIgfSwgICAgICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImgiLCAgICAgICAgICJzZXQgaGVpZ2h0IG9mIGdyaWQgY2VsbCIsIE9GRlNFVChoX2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0cj0iMCIgfSwgICAgICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImNvbG9yIiwgICAgICJzZXQgY29sb3Igb2YgdGhlIGdyaWQiLCAgIE9GRlNFVChjb2xvcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJibGFjayIgfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImMiLCAgICAgICAgICJzZXQgY29sb3Igb2YgdGhlIGdyaWQiLCAgIE9GRlNFVChjb2xvcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJibGFjayIgfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgInRoaWNrbmVzcyIsICJzZXQgZ3JpZCBsaW5lIHRoaWNrbmVzcyIsIE9GRlNFVCh0X2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIxIn0sICAgICAgICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgInQiLCAgICAgICAgICJzZXQgZ3JpZCBsaW5lIHRoaWNrbmVzcyIsIE9GRlNFVCh0X2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIxIn0sICAgICAgICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZHJhd2dyaWQpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZHJhd2dyaWRfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgID0gY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lICAgPSBkcmF3Z3JpZF9maWx0ZXJfZnJhbWUsCisgICAgICAgIC5uZWVkc193cml0YWJsZSA9IDEsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGRyYXdncmlkX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9kcmF3Z3JpZCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJkcmF3Z3JpZCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRHJhdyBhIGNvbG9yZWQgZ3JpZCBvbiB0aGUgaW5wdXQgdmlkZW8uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRHJhd0JveENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmRyYXdncmlkX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBkcmF3Z3JpZF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBkcmF3Z3JpZF9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OworCisjZW5kaWYgIC8qIENPTkZJR19EUkFXR1JJRF9GSUxURVIgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9kcmF3dGV4dC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2RyYXd0ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwZjgwNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9kcmF3dGV4dC5jCkBAIC0wLDAgKzEsMTMzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTdGVmYW5vIFNhYmF0aW5pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUy5OLiBIZW1hbnRoIE1lZW5ha3NoaXN1bmRhcmFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgR3VzdGF2byBTdmVyenV0IEJhcmJpZXJpIDxnc2JhcmJpZXJpQHlhaG9vLmNvbS5icj4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogZHJhd3RleHQgZmlsdGVyLCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgdmhvb2svZHJhd3RleHQuYworICogZmlsdGVyIGJ5IEd1c3Rhdm8gU3Zlcnp1dCBCYXJiaWVyaQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmZW52Lmg+CisKKyNpZiBDT05GSUdfTElCRk9OVENPTkZJRworI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9maWxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhbmRvbV9zZWVkLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZWNvZGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90cmVlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworI2lmIENPTkZJR19MSUJGUklCSURJCisjaW5jbHVkZSA8ZnJpYmlkaS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgRlRfR0xZUEhfSAorI2luY2x1ZGUgRlRfU1RST0tFUl9ICisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsKKyAgICAiZGFyIiwKKyAgICAiaHN1YiIsICJ2c3ViIiwKKyAgICAibGluZV9oIiwgImxoIiwgICAgICAgICAgIC8vLzwgbGluZSBoZWlnaHQsIHNhbWUgYXMgbWF4X2dseXBoX2gKKyAgICAibWFpbl9oIiwgImgiLCAiSCIsICAgICAgIC8vLzwgaGVpZ2h0IG9mIHRoZSBpbnB1dCB2aWRlbworICAgICJtYWluX3ciLCAidyIsICJXIiwgICAgICAgLy8vPCB3aWR0aCAgb2YgdGhlIGlucHV0IHZpZGVvCisgICAgIm1heF9nbHlwaF9hIiwgImFzY2VudCIsICAvLy88IG1heCBnbHlwaCBhc2NlbnQKKyAgICAibWF4X2dseXBoX2QiLCAiZGVzY2VudCIsIC8vLzwgbWluIGdseXBoIGRlc2NlbnQKKyAgICAibWF4X2dseXBoX2giLCAgICAgICAgICAgIC8vLzwgbWF4IGdseXBoIGhlaWdodAorICAgICJtYXhfZ2x5cGhfdyIsICAgICAgICAgICAgLy8vPCBtYXggZ2x5cGggd2lkdGgKKyAgICAibiIsICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGZyYW1lCisgICAgInNhciIsCisgICAgInQiLCAgICAgICAgICAgICAgICAgICAgICAvLy88IHRpbWVzdGFtcCBleHByZXNzZWQgaW4gc2Vjb25kcworICAgICJ0ZXh0X2giLCAidGgiLCAgICAgICAgICAgLy8vPCBoZWlnaHQgb2YgdGhlIHJlbmRlcmVkIHRleHQKKyAgICAidGV4dF93IiwgInR3IiwgICAgICAgICAgIC8vLzwgd2lkdGggIG9mIHRoZSByZW5kZXJlZCB0ZXh0CisgICAgIngiLAorICAgICJ5IiwKKyAgICAicGljdF90eXBlIiwKKyAgICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZnVuMl9uYW1lc1tdID0geworICAgICJyYW5kIgorfTsKKworc3RhdGljIGRvdWJsZSBkcmFuZCh2b2lkICpvcGFxdWUsIGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgpCit7CisgICAgcmV0dXJuIG1pbiArIChtYXgtbWluKSAvIFVJTlRfTUFYICogYXZfbGZnX2dldChvcGFxdWUpOworfQorCit0eXBlZGVmIGRvdWJsZSAoKmV2YWxfZnVuYzIpKHZvaWQgKiwgZG91YmxlIGEsIGRvdWJsZSBiKTsKKworc3RhdGljIGNvbnN0IGV2YWxfZnVuYzIgZnVuMltdID0geworICAgIGRyYW5kLAorICAgIE5VTEwKK307CisKK2VudW0gdmFyX25hbWUgeworICAgIFZBUl9EQVIsCisgICAgVkFSX0hTVUIsIFZBUl9WU1VCLAorICAgIFZBUl9MSU5FX0gsIFZBUl9MSCwKKyAgICBWQVJfTUFJTl9ILCBWQVJfaCwgVkFSX0gsCisgICAgVkFSX01BSU5fVywgVkFSX3csIFZBUl9XLAorICAgIFZBUl9NQVhfR0xZUEhfQSwgVkFSX0FTQ0VOVCwKKyAgICBWQVJfTUFYX0dMWVBIX0QsIFZBUl9ERVNDRU5ULAorICAgIFZBUl9NQVhfR0xZUEhfSCwKKyAgICBWQVJfTUFYX0dMWVBIX1csCisgICAgVkFSX04sCisgICAgVkFSX1NBUiwKKyAgICBWQVJfVCwKKyAgICBWQVJfVEVYVF9ILCBWQVJfVEgsCisgICAgVkFSX1RFWFRfVywgVkFSX1RXLAorICAgIFZBUl9YLAorICAgIFZBUl9ZLAorICAgIFZBUl9QSUNUX1RZUEUsCisgICAgVkFSX1ZBUlNfTkIKK307CisKK2VudW0gZXhwYW5zaW9uX21vZGUgeworICAgIEVYUF9OT05FLAorICAgIEVYUF9OT1JNQUwsCisgICAgRVhQX1NUUkZUSU1FLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgRHJhd1RleHRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBlbnVtIGV4cGFuc2lvbl9tb2RlIGV4cF9tb2RlOyAgIC8vLzwgZXhwYW5zaW9uIG1vZGUgdG8gdXNlIGZvciB0aGUgdGV4dAorICAgIGludCByZWluaXQ7ICAgICAgICAgICAgICAgICAgICAgLy8vPCB0ZWxscyBpZiB0aGUgZmlsdGVyIGlzIGJlaW5nIHJlaW5pdGVkCisjaWYgQ09ORklHX0xJQkZPTlRDT05GSUcKKyAgICB1aW50OF90ICpmb250OyAgICAgICAgICAgICAgLy8vPCBmb250IHRvIGJlIHVzZWQKKyNlbmRpZgorICAgIHVpbnQ4X3QgKmZvbnRmaWxlOyAgICAgICAgICAgICAgLy8vPCBmb250IHRvIGJlIHVzZWQKKyAgICB1aW50OF90ICp0ZXh0OyAgICAgICAgICAgICAgICAgIC8vLzwgdGV4dCB0byBiZSBkcmF3bgorICAgIEFWQlByaW50IGV4cGFuZGVkX3RleHQ7ICAgICAgICAgLy8vPCB1c2VkIHRvIGNvbnRhaW4gdGhlIGV4cGFuZGVkIHRleHQKKyAgICB1aW50OF90ICpmb250Y29sb3JfZXhwcjsgICAgICAgIC8vLzwgZm9udGNvbG9yIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUKKyAgICBBVkJQcmludCBleHBhbmRlZF9mb250Y29sb3I7ICAgIC8vLzwgdXNlZCB0byBjb250YWluIHRoZSBleHBhbmRlZCBmb250Y29sb3Igc3BlYworICAgIGludCBmdF9sb2FkX2ZsYWdzOyAgICAgICAgICAgICAgLy8vPCBmbGFncyB1c2VkIGZvciBsb2FkaW5nIGZvbnRzLCBzZWUgRlRfTE9BRF8qCisgICAgRlRfVmVjdG9yICpwb3NpdGlvbnM7ICAgICAgICAgICAvLy88IHBvc2l0aW9ucyBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSB0ZXh0CisgICAgc2l6ZV90IG5iX3Bvc2l0aW9uczsgICAgICAgICAgICAvLy88IG51bWJlciBvZiBlbGVtZW50cyBvZiBwb3NpdGlvbnMgYXJyYXkKKyAgICBjaGFyICp0ZXh0ZmlsZTsgICAgICAgICAgICAgICAgIC8vLzwgZmlsZSB3aXRoIHRleHQgdG8gYmUgZHJhd24KKyAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgeCBwb3NpdGlvbiB0byBzdGFydCBkcmF3aW5nIHRleHQKKyAgICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgeSBwb3NpdGlvbiB0byBzdGFydCBkcmF3aW5nIHRleHQKKyAgICBpbnQgbWF4X2dseXBoX3c7ICAgICAgICAgICAgICAgIC8vLzwgbWF4IGdseXBoIHdpZHRoCisgICAgaW50IG1heF9nbHlwaF9oOyAgICAgICAgICAgICAgICAvLy88IG1heCBnbHlwaCBoZWlnaHQKKyAgICBpbnQgc2hhZG93eCwgc2hhZG93eTsKKyAgICBpbnQgYm9yZGVydzsgICAgICAgICAgICAgICAgICAgIC8vLzwgYm9yZGVyIHdpZHRoCisgICAgdW5zaWduZWQgaW50IGZvbnRzaXplOyAgICAgICAgICAvLy88IGZvbnQgc2l6ZSB0byB1c2UKKworICAgIHNob3J0IGludCBkcmF3X2JveDsgICAgICAgICAgICAgLy8vPCBkcmF3IGJveCBhcm91bmQgdGV4dCAtIHRydWUgb3IgZmFsc2UKKyAgICBpbnQgdXNlX2tlcm5pbmc7ICAgICAgICAgICAgICAgIC8vLzwgZm9udCBrZXJuaW5nIGlzIHVzZWQgLSB0cnVlL2ZhbHNlCisgICAgaW50IHRhYnNpemU7ICAgICAgICAgICAgICAgICAgICAvLy88IHRhYiBzaXplCisgICAgaW50IGZpeF9ib3VuZHM7ICAgICAgICAgICAgICAgICAvLy88IGRvIHdlIGxldCBpdCBnbyBvdXQgb2YgZnJhbWUgYm91bmRzIC0gdC9mCisKKyAgICBGRkRyYXdDb250ZXh0IGRjOworICAgIEZGRHJhd0NvbG9yIGZvbnRjb2xvcjsgICAgICAgICAgLy8vPCBmb3JlZ3JvdW5kIGNvbG9yCisgICAgRkZEcmF3Q29sb3Igc2hhZG93Y29sb3I7ICAgICAgICAvLy88IHNoYWRvdyBjb2xvcgorICAgIEZGRHJhd0NvbG9yIGJvcmRlcmNvbG9yOyAgICAgICAgLy8vPCBib3JkZXIgY29sb3IKKyAgICBGRkRyYXdDb2xvciBib3hjb2xvcjsgICAgICAgICAgIC8vLzwgYmFja2dyb3VuZCBjb2xvcgorCisgICAgRlRfTGlicmFyeSBsaWJyYXJ5OyAgICAgICAgICAgICAvLy88IGZyZWV0eXBlIGZvbnQgbGlicmFyeSBoYW5kbGUKKyAgICBGVF9GYWNlIGZhY2U7ICAgICAgICAgICAgICAgICAgIC8vLzwgZnJlZXR5cGUgZm9udCBmYWNlIGhhbmRsZQorICAgIEZUX1N0cm9rZXIgc3Ryb2tlcjsgICAgICAgICAgICAgLy8vPCBmcmVldHlwZSBzdHJva2VyIGhhbmRsZQorICAgIHN0cnVjdCBBVlRyZWVOb2RlICpnbHlwaHM7ICAgICAgLy8vPCByZW5kZXJlZCBnbHlwaHMsIHN0b3JlZCB1c2luZyB0aGUgVVRGLTMyIGNoYXIgY29kZQorICAgIGNoYXIgKnhfZXhwcjsgICAgICAgICAgICAgICAgICAgLy8vPCBleHByZXNzaW9uIGZvciB4IHBvc2l0aW9uCisgICAgY2hhciAqeV9leHByOyAgICAgICAgICAgICAgICAgICAvLy88IGV4cHJlc3Npb24gZm9yIHkgcG9zaXRpb24KKyAgICBBVkV4cHIgKnhfcGV4cHIsICp5X3BleHByOyAgICAgIC8vLzwgcGFyc2VkIGV4cHJlc3Npb25zIGZvciB4IGFuZCB5CisgICAgaW50NjRfdCBiYXNldGltZTsgICAgICAgICAgICAgICAvLy88IGJhc2UgcHRzIHRpbWUgaW4gdGhlIHJlYWwgd29ybGQgZm9yIGRpc3BsYXkKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJfVkFSU19OQl07CisgICAgQVZMRkcgIHBybmc7ICAgICAgICAgICAgICAgICAgICAvLy88IHJhbmRvbQorICAgIGNoYXIgICAgICAgKnRjX29wdF9zdHJpbmc7ICAgICAgLy8vPCBzcGVjaWZpZWQgdGltZWNvZGUgb3B0aW9uIHN0cmluZworICAgIEFWUmF0aW9uYWwgIHRjX3JhdGU7ICAgICAgICAgICAgLy8vPCBmcmFtZSByYXRlIGZvciB0aW1lY29kZQorICAgIEFWVGltZWNvZGUgIHRjOyAgICAgICAgICAgICAgICAgLy8vPCB0aW1lY29kZSBjb250ZXh0CisgICAgaW50IHRjMjRobWF4OyAgICAgICAgICAgICAgICAgICAvLy88IDEgaWYgdGltZWNvZGUgaXMgd3JhcHBlZCB0byAyNCBob3VycywgMCBvdGhlcndpc2UKKyAgICBpbnQgcmVsb2FkOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgcmVsb2FkIHRleHQgZmlsZSBmb3IgZWFjaCBmcmFtZQorICAgIGludCBzdGFydF9udW1iZXI7ICAgICAgICAgICAgICAgLy8vPCBzdGFydGluZyBmcmFtZSBudW1iZXIgZm9yIG4vZnJhbWVfbnVtIHZhcgorI2lmIENPTkZJR19MSUJGUklCSURJCisgICAgaW50IHRleHRfc2hhcGluZzsgICAgICAgICAgICAgICAvLy88IDEgdG8gc2hhcGUgdGhlIHRleHQgYmVmb3JlIGRyYXdpbmcgaXQKKyNlbmRpZgorICAgIEFWRGljdGlvbmFyeSAqbWV0YWRhdGE7Cit9IERyYXdUZXh0Q29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRHJhd1RleHRDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGRyYXd0ZXh0X29wdGlvbnNbXT0geworICAgIHsiZm9udGZpbGUiLCAgICAic2V0IGZvbnQgZmlsZSIsICAgICAgICBPRkZTRVQoZm9udGZpbGUpLCAgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1N9LAorICAgIHsidGV4dCIsICAgICAgICAic2V0IHRleHQiLCAgICAgICAgICAgICBPRkZTRVQodGV4dCksICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1N9LAorICAgIHsidGV4dGZpbGUiLCAgICAic2V0IHRleHQgZmlsZSIsICAgICAgICBPRkZTRVQodGV4dGZpbGUpLCAgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1N9LAorICAgIHsiZm9udGNvbG9yIiwgICAic2V0IGZvcmVncm91bmQgY29sb3IiLCBPRkZTRVQoZm9udGNvbG9yLnJnYmEpLCAgICAgQVZfT1BUX1RZUEVfQ09MT1IsICB7LnN0cj0iYmxhY2sifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHU30sCisgICAgeyJmb250Y29sb3JfZXhwciIsICJzZXQgZm9yZWdyb3VuZCBjb2xvciBleHByZXNzaW9uIiwgT0ZGU0VUKGZvbnRjb2xvcl9leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1N9LAorICAgIHsiYm94Y29sb3IiLCAgICAic2V0IGJveCBjb2xvciIsICAgICAgICBPRkZTRVQoYm94Y29sb3IucmdiYSksICAgICAgQVZfT1BUX1RZUEVfQ09MT1IsICB7LnN0cj0id2hpdGUifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHU30sCisgICAgeyJib3JkZXJjb2xvciIsICJzZXQgYm9yZGVyIGNvbG9yIiwgICAgIE9GRlNFVChib3JkZXJjb2xvci5yZ2JhKSwgICBBVl9PUFRfVFlQRV9DT0xPUiwgIHsuc3RyPSJibGFjayJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTfSwKKyAgICB7InNoYWRvd2NvbG9yIiwgInNldCBzaGFkb3cgY29sb3IiLCAgICAgT0ZGU0VUKHNoYWRvd2NvbG9yLnJnYmEpLCAgIEFWX09QVF9UWVBFX0NPTE9SLCAgey5zdHI9ImJsYWNrIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1N9LAorICAgIHsiYm94IiwgICAgICAgICAic2V0IGJveCIsICAgICAgICAgICAgICBPRkZTRVQoZHJhd19ib3gpLCAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND0wfSwgICAgIDAsICAgICAgICAxICAgICAgICwgRkxBR1N9LAorICAgIHsiZm9udHNpemUiLCAgICAic2V0IGZvbnQgc2l6ZSIsICAgICAgICBPRkZTRVQoZm9udHNpemUpLCAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND0wfSwgICAgIDAsICAgICAgICBJTlRfTUFYICwgRkxBR1N9LAorICAgIHsieCIsICAgICAgICAgICAic2V0IHggZXhwcmVzc2lvbiIsICAgICBPRkZTRVQoeF9leHByKSwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iMCJ9LCAgIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1N9LAorICAgIHsieSIsICAgICAgICAgICAic2V0IHkgZXhwcmVzc2lvbiIsICAgICBPRkZTRVQoeV9leHByKSwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iMCJ9LCAgIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1N9LAorICAgIHsic2hhZG93eCIsICAgICAic2V0IHgiLCAgICAgICAgICAgICAgICBPRkZTRVQoc2hhZG93eCksICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND0wfSwgICAgIElOVF9NSU4sICBJTlRfTUFYICwgRkxBR1N9LAorICAgIHsic2hhZG93eSIsICAgICAic2V0IHkiLCAgICAgICAgICAgICAgICBPRkZTRVQoc2hhZG93eSksICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND0wfSwgICAgIElOVF9NSU4sICBJTlRfTUFYICwgRkxBR1N9LAorICAgIHsiYm9yZGVydyIsICAgICAic2V0IGJvcmRlciB3aWR0aCIsICAgICBPRkZTRVQoYm9yZGVydyksICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND0wfSwgICAgIElOVF9NSU4sICBJTlRfTUFYICwgRkxBR1N9LAorICAgIHsidGFic2l6ZSIsICAgICAic2V0IHRhYiBzaXplIiwgICAgICAgICBPRkZTRVQodGFic2l6ZSksICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND00fSwgICAgIDAsICAgICAgICBJTlRfTUFYICwgRkxBR1N9LAorICAgIHsiYmFzZXRpbWUiLCAgICAic2V0IGJhc2UgdGltZSIsICAgICAgICBPRkZTRVQoYmFzZXRpbWUpLCAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5UNjQsICB7Lmk2ND1BVl9OT1BUU19WQUxVRX0sIElOVDY0X01JTiwgSU5UNjRfTUFYICwgRkxBR1N9LAorI2lmIENPTkZJR19MSUJGT05UQ09ORklHCisgICAgeyAiZm9udCIsICAgICAgICAiRm9udCBuYW1lIiwgICAgICAgICAgICBPRkZTRVQoZm9udCksICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiU2FucyIgfSwgICAgICAgICAgIC5mbGFncyA9IEZMQUdTIH0sCisjZW5kaWYKKworICAgIHsiZXhwYW5zaW9uIiwgInNldCB0aGUgZXhwYW5zaW9uIG1vZGUiLCBPRkZTRVQoZXhwX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUVYUF9OT1JNQUx9LCAwLCAyLCBGTEFHUywgImV4cGFuc2lvbiJ9LAorICAgICAgICB7Im5vbmUiLCAgICAgInNldCBubyBleHBhbnNpb24iLCAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGV4cF9tb2RlKSwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUVYUF9OT05FfSwgICAgIDAsIDAsIEZMQUdTLCAiZXhwYW5zaW9uIn0sCisgICAgICAgIHsibm9ybWFsIiwgICAic2V0IG5vcm1hbCBleHBhbnNpb24iLCAgICAgICAgICAgICAgICBPRkZTRVQoZXhwX21vZGUpLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9RVhQX05PUk1BTH0sICAgMCwgMCwgRkxBR1MsICJleHBhbnNpb24ifSwKKyAgICAgICAgeyJzdHJmdGltZSIsICJzZXQgc3RyZnRpbWUgZXhwYW5zaW9uIChkZXByZWNhdGVkKSIsIE9GRlNFVChleHBfbW9kZSksIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1FWFBfU1RSRlRJTUV9LCAwLCAwLCBGTEFHUywgImV4cGFuc2lvbiJ9LAorCisgICAgeyJ0aW1lY29kZSIsICAgICAgICAic2V0IGluaXRpYWwgdGltZWNvZGUiLCAgICAgICAgICAgICBPRkZTRVQodGNfb3B0X3N0cmluZyksIEFWX09QVF9UWVBFX1NUUklORywgICB7LnN0cj1OVUxMfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHU30sCisgICAgeyJ0YzI0aG1heCIsICAgICAgICAic2V0IDI0IGhvdXJzIG1heCAodGltZWNvZGUgb25seSkiLCBPRkZTRVQodGMyNGhtYXgpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7Lmk2ND0wfSwgICAgICAgICAgIDAsICAgICAgICAxLCBGTEFHU30sCisgICAgeyJ0aW1lY29kZV9yYXRlIiwgICAic2V0IHJhdGUgKHRpbWVjb2RlIG9ubHkpIiwgICAgICAgICBPRkZTRVQodGNfcmF0ZSksICAgICAgIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7LmRibD0wfSwgICAgICAgICAgIDAsICBJTlRfTUFYLCBGTEFHU30sCisgICAgeyJyIiwgICAgICAgICAgICAgICAic2V0IHJhdGUgKHRpbWVjb2RlIG9ubHkpIiwgICAgICAgICBPRkZTRVQodGNfcmF0ZSksICAgICAgIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7LmRibD0wfSwgICAgICAgICAgIDAsICBJTlRfTUFYLCBGTEFHU30sCisgICAgeyJyYXRlIiwgICAgICAgICAgICAic2V0IHJhdGUgKHRpbWVjb2RlIG9ubHkpIiwgICAgICAgICBPRkZTRVQodGNfcmF0ZSksICAgICAgIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7LmRibD0wfSwgICAgICAgICAgIDAsICBJTlRfTUFYLCBGTEFHU30sCisgICAgeyJyZWxvYWQiLCAgICAgInJlbG9hZCB0ZXh0IGZpbGUgZm9yIGVhY2ggZnJhbWUiLCAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHJlbG9hZCksICAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHU30sCisgICAgeyJmaXhfYm91bmRzIiwgImlmIHRydWUsIGNoZWNrIGFuZCBmaXggdGV4dCBjb29yZHMgdG8gYXZvaWQgY2xpcHBpbmciLCAgT0ZGU0VUKGZpeF9ib3VuZHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTF9LCAwLCAxLCBGTEFHU30sCisgICAgeyJzdGFydF9udW1iZXIiLCAic3RhcnQgZnJhbWUgbnVtYmVyIGZvciBuL2ZyYW1lX251bSB2YXJpYWJsZSIsIE9GRlNFVChzdGFydF9udW1iZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBJTlRfTUFYLCBGTEFHU30sCisKKyNpZiBDT05GSUdfTElCRlJJQklESQorICAgIHsidGV4dF9zaGFwaW5nIiwgImF0dGVtcHQgdG8gc2hhcGUgdGV4dCBiZWZvcmUgZHJhd2luZyIsIE9GRlNFVCh0ZXh0X3NoYXBpbmcpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTF9LCAwLCAxLCBGTEFHU30sCisjZW5kaWYKKworICAgIC8qIEZUX0xPQURfKiBmbGFncyAqLworICAgIHsgImZ0X2xvYWRfZmxhZ3MiLCAic2V0IGZvbnQgbG9hZGluZyBmbGFncyBmb3IgbGliZnJlZXR5cGUiLCBPRkZTRVQoZnRfbG9hZF9mbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7IC5pNjQgPSBGVF9MT0FEX0RFRkFVTFQgfSwgMCwgSU5UX01BWCwgRkxBR1MsICJmdF9sb2FkX2ZsYWdzIiB9LAorICAgICAgICB7ICJkZWZhdWx0IiwgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRlRfTE9BRF9ERUZBVUxUIH0sICAgICAgICAgICAgICAgICAgICAgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZ0X2xvYWRfZmxhZ3MiIH0sCisgICAgICAgIHsgIm5vX3NjYWxlIiwgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGVF9MT0FEX05PX1NDQUxFIH0sICAgICAgICAgICAgICAgICAgICAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZnRfbG9hZF9mbGFncyIgfSwKKyAgICAgICAgeyAibm9faGludGluZyIsICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZUX0xPQURfTk9fSElOVElORyB9LCAgICAgICAgICAgICAgICAgIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJmdF9sb2FkX2ZsYWdzIiB9LAorICAgICAgICB7ICJyZW5kZXIiLCAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRlRfTE9BRF9SRU5ERVIgfSwgICAgICAgICAgICAgICAgICAgICAgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZ0X2xvYWRfZmxhZ3MiIH0sCisgICAgICAgIHsgIm5vX2JpdG1hcCIsICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGVF9MT0FEX05PX0JJVE1BUCB9LCAgICAgICAgICAgICAgICAgICAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZnRfbG9hZF9mbGFncyIgfSwKKyAgICAgICAgeyAidmVydGljYWxfbGF5b3V0IiwgICAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZUX0xPQURfVkVSVElDQUxfTEFZT1VUIH0sICAgICAgICAgICAgIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJmdF9sb2FkX2ZsYWdzIiB9LAorICAgICAgICB7ICJmb3JjZV9hdXRvaGludCIsICAgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRlRfTE9BRF9GT1JDRV9BVVRPSElOVCB9LCAgICAgICAgICAgICAgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZ0X2xvYWRfZmxhZ3MiIH0sCisgICAgICAgIHsgImNyb3BfYml0bWFwIiwgICAgICAgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGVF9MT0FEX0NST1BfQklUTUFQIH0sICAgICAgICAgICAgICAgICAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZnRfbG9hZF9mbGFncyIgfSwKKyAgICAgICAgeyAicGVkYW50aWMiLCAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZUX0xPQURfUEVEQU5USUMgfSwgICAgICAgICAgICAgICAgICAgIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJmdF9sb2FkX2ZsYWdzIiB9LAorICAgICAgICB7ICJpZ25vcmVfZ2xvYmFsX2FkdmFuY2Vfd2lkdGgiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEggfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZ0X2xvYWRfZmxhZ3MiIH0sCisgICAgICAgIHsgIm5vX3JlY3Vyc2UiLCAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGVF9MT0FEX05PX1JFQ1VSU0UgfSwgICAgICAgICAgICAgICAgICAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZnRfbG9hZF9mbGFncyIgfSwKKyAgICAgICAgeyAiaWdub3JlX3RyYW5zZm9ybSIsICAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSB9LCAgICAgICAgICAgIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJmdF9sb2FkX2ZsYWdzIiB9LAorICAgICAgICB7ICJtb25vY2hyb21lIiwgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRlRfTE9BRF9NT05PQ0hST01FIH0sICAgICAgICAgICAgICAgICAgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZ0X2xvYWRfZmxhZ3MiIH0sCisgICAgICAgIHsgImxpbmVhcl9kZXNpZ24iLCAgICAgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGVF9MT0FEX0xJTkVBUl9ERVNJR04gfSwgICAgICAgICAgICAgICAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZnRfbG9hZF9mbGFncyIgfSwKKyAgICAgICAgeyAibm9fYXV0b2hpbnQiLCAgICAgICAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZUX0xPQURfTk9fQVVUT0hJTlQgfSwgICAgICAgICAgICAgICAgIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJmdF9sb2FkX2ZsYWdzIiB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZHJhd3RleHQpOworCisjdW5kZWYgX19GVEVSUk9SU19IX18KKyNkZWZpbmUgRlRfRVJST1JfU1RBUlRfTElTVCB7CisjZGVmaW5lIEZUX0VSUk9SREVGKGUsIHYsIHMpIHsgKGUpLCAocykgfSwKKyNkZWZpbmUgRlRfRVJST1JfRU5EX0xJU1QgeyAwLCBOVUxMIH0gfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmdF9lcnJvcgoreworICAgIGludCBlcnI7CisgICAgY29uc3QgY2hhciAqZXJyX21zZzsKK30gZnRfZXJyb3JzW10gPQorI2luY2x1ZGUgRlRfRVJST1JTX0gKKworI2RlZmluZSBGVF9FUlJNU0coZSkgZnRfZXJyb3JzW2VdLmVycl9tc2cKKwordHlwZWRlZiBzdHJ1Y3QgR2x5cGggeworICAgIEZUX0dseXBoIGdseXBoOworICAgIEZUX0dseXBoIGJvcmRlcl9nbHlwaDsKKyAgICB1aW50MzJfdCBjb2RlOworICAgIEZUX0JpdG1hcCBiaXRtYXA7IC8vLzwgYXJyYXkgaG9sZGluZyBiaXRtYXBzIG9mIGZvbnQKKyAgICBGVF9CaXRtYXAgYm9yZGVyX2JpdG1hcDsgLy8vPCBhcnJheSBob2xkaW5nIGJpdG1hcHMgb2YgZm9udCBib3JkZXIKKyAgICBGVF9CQm94IGJib3g7CisgICAgaW50IGFkdmFuY2U7CisgICAgaW50IGJpdG1hcF9sZWZ0OworICAgIGludCBiaXRtYXBfdG9wOworfSBHbHlwaDsKKworc3RhdGljIGludCBnbHlwaF9jbXAodm9pZCAqa2V5LCBjb25zdCB2b2lkICpiKQoreworICAgIGNvbnN0IEdseXBoICphID0ga2V5LCAqYmIgPSBiOworICAgIGludDY0X3QgZGlmZiA9IChpbnQ2NF90KWEtPmNvZGUgLSAoaW50NjRfdCliYi0+Y29kZTsKKyAgICByZXR1cm4gZGlmZiA+IDAgPyAxIDogZGlmZiA8IDAgPyAtMSA6IDA7Cit9CisKKy8qKgorICogTG9hZCBnbHlwaHMgY29ycmVzcG9uZGluZyB0byB0aGUgVVRGLTMyIGNvZGVwb2ludCBjb2RlLgorICovCitzdGF0aWMgaW50IGxvYWRfZ2x5cGgoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEdseXBoICoqZ2x5cGhfcHRyLCB1aW50MzJfdCBjb2RlKQoreworICAgIERyYXdUZXh0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBGVF9CaXRtYXBHbHlwaCBiaXRtYXBnbHlwaDsKKyAgICBHbHlwaCAqZ2x5cGg7CisgICAgc3RydWN0IEFWVHJlZU5vZGUgKm5vZGUgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICAvKiBsb2FkIGdseXBoIGludG8gcy0+ZmFjZS0+Z2x5cGggKi8KKyAgICBpZiAoRlRfTG9hZF9DaGFyKHMtPmZhY2UsIGNvZGUsIHMtPmZ0X2xvYWRfZmxhZ3MpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgZ2x5cGggPSBhdl9tYWxsb2N6KHNpemVvZigqZ2x5cGgpKTsKKyAgICBpZiAoIWdseXBoKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgZ2x5cGgtPmNvZGUgID0gY29kZTsKKworICAgIGlmIChGVF9HZXRfR2x5cGgocy0+ZmFjZS0+Z2x5cGgsICZnbHlwaC0+Z2x5cGgpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKHMtPmJvcmRlcncpIHsKKyAgICAgICAgZ2x5cGgtPmJvcmRlcl9nbHlwaCA9IGdseXBoLT5nbHlwaDsKKyAgICAgICAgaWYgKEZUX0dseXBoX1N0cm9rZUJvcmRlcigmZ2x5cGgtPmJvcmRlcl9nbHlwaCwgcy0+c3Ryb2tlciwgMCwgMCkgfHwKKyAgICAgICAgICAgIEZUX0dseXBoX1RvX0JpdG1hcCgmZ2x5cGgtPmJvcmRlcl9nbHlwaCwgRlRfUkVOREVSX01PREVfTk9STUFMLCAwLCAxKSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYml0bWFwZ2x5cGggPSAoRlRfQml0bWFwR2x5cGgpIGdseXBoLT5ib3JkZXJfZ2x5cGg7CisgICAgICAgIGdseXBoLT5ib3JkZXJfYml0bWFwID0gYml0bWFwZ2x5cGgtPmJpdG1hcDsKKyAgICB9CisgICAgaWYgKEZUX0dseXBoX1RvX0JpdG1hcCgmZ2x5cGgtPmdseXBoLCBGVF9SRU5ERVJfTU9ERV9OT1JNQUwsIDAsIDEpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGJpdG1hcGdseXBoID0gKEZUX0JpdG1hcEdseXBoKSBnbHlwaC0+Z2x5cGg7CisKKyAgICBnbHlwaC0+Yml0bWFwICAgICAgPSBiaXRtYXBnbHlwaC0+Yml0bWFwOworICAgIGdseXBoLT5iaXRtYXBfbGVmdCA9IGJpdG1hcGdseXBoLT5sZWZ0OworICAgIGdseXBoLT5iaXRtYXBfdG9wICA9IGJpdG1hcGdseXBoLT50b3A7CisgICAgZ2x5cGgtPmFkdmFuY2UgICAgID0gcy0+ZmFjZS0+Z2x5cGgtPmFkdmFuY2UueCA+PiA2OworCisgICAgLyogbWVhc3VyZSB0ZXh0IGhlaWdodCB0byBjYWxjdWxhdGUgdGV4dF9oZWlnaHQgKG9yIHRoZSBtYXhpbXVtIHRleHQgaGVpZ2h0KSAqLworICAgIEZUX0dseXBoX0dldF9DQm94KGdseXBoLT5nbHlwaCwgZnRfZ2x5cGhfYmJveF9waXhlbHMsICZnbHlwaC0+YmJveCk7CisKKyAgICAvKiBjYWNoZSB0aGUgbmV3bHkgY3JlYXRlZCBnbHlwaCAqLworICAgIGlmICghKG5vZGUgPSBhdl90cmVlX25vZGVfYWxsb2MoKSkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBhdl90cmVlX2luc2VydCgmcy0+Z2x5cGhzLCBnbHlwaCwgZ2x5cGhfY21wLCAmbm9kZSk7CisKKyAgICBpZiAoZ2x5cGhfcHRyKQorICAgICAgICAqZ2x5cGhfcHRyID0gZ2x5cGg7CisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIGlmIChnbHlwaCkKKyAgICAgICAgYXZfZnJlZXAoJmdseXBoLT5nbHlwaCk7CisKKyAgICBhdl9mcmVlcCgmZ2x5cGgpOworICAgIGF2X2ZyZWVwKCZub2RlKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxvYWRfZm9udF9maWxlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpwYXRoLCBpbnQgaW5kZXgpCit7CisgICAgRHJhd1RleHRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBGVF9OZXdfRmFjZShzLT5saWJyYXJ5LCBwYXRoLCBpbmRleCwgJnMtPmZhY2UpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGxvYWQgZm9udCBcIiVzXCI6ICVzXG4iLAorICAgICAgICAgICAgICAgcy0+Zm9udGZpbGUsIEZUX0VSUk1TRyhlcnIpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfTElCRk9OVENPTkZJRworc3RhdGljIGludCBsb2FkX2ZvbnRfZm9udGNvbmZpZyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBEcmF3VGV4dENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgRmNDb25maWcgKmZvbnRjb25maWc7CisgICAgRmNQYXR0ZXJuICpwYXQsICpiZXN0OworICAgIEZjUmVzdWx0IHJlc3VsdCA9IEZjUmVzdWx0TWF0Y2g7CisgICAgRmNDaGFyOCAqZmlsZW5hbWU7CisgICAgaW50IGluZGV4OworICAgIGRvdWJsZSBzaXplOworICAgIGludCBlcnIgPSBBVkVSUk9SKEVOT0VOVCk7CisKKyAgICBmb250Y29uZmlnID0gRmNJbml0TG9hZENvbmZpZ0FuZEZvbnRzKCk7CisgICAgaWYgKCFmb250Y29uZmlnKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImltcG9zc2libGUgdG8gaW5pdCBmb250Y29uZmlnXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgcGF0ID0gRmNOYW1lUGFyc2Uocy0+Zm9udGZpbGUgPyBzLT5mb250ZmlsZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopKGludHB0cl90KSJkZWZhdWx0Iik7CisgICAgaWYgKCFwYXQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IHBhcnNlIGZvbnRjb25maWcgcGF0Iik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgRmNQYXR0ZXJuQWRkU3RyaW5nKHBhdCwgRkNfRkFNSUxZLCBzLT5mb250KTsKKyAgICBpZiAocy0+Zm9udHNpemUpCisgICAgICAgIEZjUGF0dGVybkFkZERvdWJsZShwYXQsIEZDX1NJWkUsIChkb3VibGUpcy0+Zm9udHNpemUpOworCisgICAgRmNEZWZhdWx0U3Vic3RpdHV0ZShwYXQpOworCisgICAgaWYgKCFGY0NvbmZpZ1N1YnN0aXR1dGUoZm9udGNvbmZpZywgcGF0LCBGY01hdGNoUGF0dGVybikpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IHN1YnN0aXR1ZSBmb250Y29uZmlnIG9wdGlvbnMiKTsgLyogdmVyeSB1bmxpa2VseSAqLworICAgICAgICBGY1BhdHRlcm5EZXN0cm95KHBhdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgYmVzdCA9IEZjRm9udE1hdGNoKGZvbnRjb25maWcsIHBhdCwgJnJlc3VsdCk7CisgICAgRmNQYXR0ZXJuRGVzdHJveShwYXQpOworCisgICAgaWYgKCFiZXN0IHx8IHJlc3VsdCAhPSBGY1Jlc3VsdE1hdGNoKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDYW5ub3QgZmluZCBhIHZhbGlkIGZvbnQgZm9yIHRoZSBmYW1pbHkgJXNcbiIsCisgICAgICAgICAgICAgICBzLT5mb250KTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICgKKyAgICAgICAgRmNQYXR0ZXJuR2V0SW50ZWdlcihiZXN0LCBGQ19JTkRFWCwgMCwgJmluZGV4ICAgKSAhPSBGY1Jlc3VsdE1hdGNoIHx8CisgICAgICAgIEZjUGF0dGVybkdldERvdWJsZSAoYmVzdCwgRkNfU0laRSwgIDAsICZzaXplICAgICkgIT0gRmNSZXN1bHRNYXRjaCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbXBvc3NpYmxlIHRvIGZpbmQgZm9udCBpbmZvcm1hdGlvbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChGY1BhdHRlcm5HZXRTdHJpbmcoYmVzdCwgRkNfRklMRSwgMCwgJmZpbGVuYW1lKSAhPSBGY1Jlc3VsdE1hdGNoKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGZpbGUgcGF0aCBmb3IgJXNcbiIsCisgICAgICAgICAgICAgICBzLT5mb250KTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiVXNpbmcgXCIlc1wiXG4iLCBmaWxlbmFtZSk7CisgICAgaWYgKCFzLT5mb250c2l6ZSkKKyAgICAgICAgcy0+Zm9udHNpemUgPSBzaXplICsgMC41OworCisgICAgZXJyID0gbG9hZF9mb250X2ZpbGUoY3R4LCBmaWxlbmFtZSwgaW5kZXgpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgRmNDb25maWdEZXN0cm95KGZvbnRjb25maWcpOworZmFpbDoKKyAgICBGY1BhdHRlcm5EZXN0cm95KGJlc3QpOworICAgIHJldHVybiBlcnI7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBsb2FkX2ZvbnQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRHJhd1RleHRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBlcnI7CisKKyAgICAvKiBsb2FkIHRoZSBmYWNlLCBhbmQgc2V0IHVwIHRoZSBlbmNvZGluZywgd2hpY2ggaXMgYnkgZGVmYXVsdCBVVEYtOCAqLworICAgIGVyciA9IGxvYWRfZm9udF9maWxlKGN0eCwgcy0+Zm9udGZpbGUsIDApOworICAgIGlmICghZXJyKQorICAgICAgICByZXR1cm4gMDsKKyNpZiBDT05GSUdfTElCRk9OVENPTkZJRworICAgIGVyciA9IGxvYWRfZm9udF9mb250Y29uZmlnKGN0eCk7CisgICAgaWYgKCFlcnIpCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsb2FkX3RleHRmaWxlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIERyYXdUZXh0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgZXJyOworICAgIHVpbnQ4X3QgKnRleHRidWY7CisgICAgdWludDhfdCAqdG1wOworICAgIHNpemVfdCB0ZXh0YnVmX3NpemU7CisKKyAgICBpZiAoKGVyciA9IGF2X2ZpbGVfbWFwKHMtPnRleHRmaWxlLCAmdGV4dGJ1ZiwgJnRleHRidWZfc2l6ZSwgMCwgY3R4KSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUaGUgdGV4dCBmaWxlICclcycgY291bGQgbm90IGJlIHJlYWQgb3IgaXMgZW1wdHlcbiIsCisgICAgICAgICAgICAgICBzLT50ZXh0ZmlsZSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHRleHRidWZfc2l6ZSA+IFNJWkVfTUFYIC0gMSB8fCAhKHRtcCA9IGF2X3JlYWxsb2Mocy0+dGV4dCwgdGV4dGJ1Zl9zaXplICsgMSkpKSB7CisgICAgICAgIGF2X2ZpbGVfdW5tYXAodGV4dGJ1ZiwgdGV4dGJ1Zl9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgcy0+dGV4dCA9IHRtcDsKKyAgICBtZW1jcHkocy0+dGV4dCwgdGV4dGJ1ZiwgdGV4dGJ1Zl9zaXplKTsKKyAgICBzLT50ZXh0W3RleHRidWZfc2l6ZV0gPSAwOworICAgIGF2X2ZpbGVfdW5tYXAodGV4dGJ1ZiwgdGV4dGJ1Zl9zaXplKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19uZXdsaW5lKHVpbnQzMl90IGMpCit7CisgICAgcmV0dXJuIGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXGYnIHx8IGMgPT0gJ1x2JzsKK30KKworI2lmIENPTkZJR19MSUJGUklCSURJCitzdGF0aWMgaW50IHNoYXBlX3RleHQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRHJhd1RleHRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHVpbnQ4X3QgKnRtcDsKKyAgICBpbnQgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgIHN0YXRpYyBjb25zdCBGcmlCaWRpRmxhZ3MgZmxhZ3MgPSBGUklCSURJX0ZMQUdTX0RFRkFVTFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUklCSURJX0ZMQUdTX0FSQUJJQzsKKyAgICBGcmlCaWRpQ2hhciAqdW5pY29kZXN0ciA9IE5VTEw7CisgICAgRnJpQmlkaVN0ckluZGV4IGxlbjsKKyAgICBGcmlCaWRpUGFyVHlwZSBkaXJlY3Rpb24gPSBGUklCSURJX1BBUl9MVFI7CisgICAgRnJpQmlkaVN0ckluZGV4IGxpbmVfc3RhcnQgPSAwOworICAgIEZyaUJpZGlTdHJJbmRleCBsaW5lX2VuZCA9IDA7CisgICAgRnJpQmlkaUxldmVsICplbWJlZGRpbmdfbGV2ZWxzID0gTlVMTDsKKyAgICBGcmlCaWRpQXJhYmljUHJvcCAqYXJfcHJvcHMgPSBOVUxMOworICAgIEZyaUJpZGlDaGFyVHlwZSAqYmlkaV90eXBlcyA9IE5VTEw7CisgICAgRnJpQmlkaVN0ckluZGV4IGksajsKKworICAgIGxlbiA9IHN0cmxlbihzLT50ZXh0KTsKKyAgICBpZiAoISh1bmljb2Rlc3RyID0gYXZfbWFsbG9jX2FycmF5KGxlbiwgc2l6ZW9mKCp1bmljb2Rlc3RyKSkpKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBsZW4gPSBmcmliaWRpX2NoYXJzZXRfdG9fdW5pY29kZShGUklCSURJX0NIQVJfU0VUX1VURjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dGV4dCwgbGVuLCB1bmljb2Rlc3RyKTsKKworICAgIGJpZGlfdHlwZXMgPSBhdl9tYWxsb2NfYXJyYXkobGVuLCBzaXplb2YoKmJpZGlfdHlwZXMpKTsKKyAgICBpZiAoIWJpZGlfdHlwZXMpIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZnJpYmlkaV9nZXRfYmlkaV90eXBlcyh1bmljb2Rlc3RyLCBsZW4sIGJpZGlfdHlwZXMpOworCisgICAgZW1iZWRkaW5nX2xldmVscyA9IGF2X21hbGxvY19hcnJheShsZW4sIHNpemVvZigqZW1iZWRkaW5nX2xldmVscykpOworICAgIGlmICghZW1iZWRkaW5nX2xldmVscykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAoIWZyaWJpZGlfZ2V0X3Bhcl9lbWJlZGRpbmdfbGV2ZWxzKGJpZGlfdHlwZXMsIGxlbiwgJmRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGluZ19sZXZlbHMpKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGFyX3Byb3BzID0gYXZfbWFsbG9jX2FycmF5KGxlbiwgc2l6ZW9mKCphcl9wcm9wcykpOworICAgIGlmICghYXJfcHJvcHMpIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZnJpYmlkaV9nZXRfam9pbmluZ190eXBlcyh1bmljb2Rlc3RyLCBsZW4sIGFyX3Byb3BzKTsKKyAgICBmcmliaWRpX2pvaW5fYXJhYmljKGJpZGlfdHlwZXMsIGxlbiwgZW1iZWRkaW5nX2xldmVscywgYXJfcHJvcHMpOworICAgIGZyaWJpZGlfc2hhcGUoZmxhZ3MsIGVtYmVkZGluZ19sZXZlbHMsIGxlbiwgYXJfcHJvcHMsIHVuaWNvZGVzdHIpOworCisgICAgZm9yIChsaW5lX2VuZCA9IDAsIGxpbmVfc3RhcnQgPSAwOyBsaW5lX2VuZCA8IGxlbjsgbGluZV9lbmQrKykgeworICAgICAgICBpZiAoaXNfbmV3bGluZSh1bmljb2Rlc3RyW2xpbmVfZW5kXSkgfHwgbGluZV9lbmQgPT0gbGVuIC0gMSkgeworICAgICAgICAgICAgaWYgKCFmcmliaWRpX3Jlb3JkZXJfbGluZShmbGFncywgYmlkaV90eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9lbmQgLSBsaW5lX3N0YXJ0ICsgMSwgbGluZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uLCBlbWJlZGRpbmdfbGV2ZWxzLCB1bmljb2Rlc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgeworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZV9zdGFydCA9IGxpbmVfZW5kICsgMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlbW92ZSB6ZXJvLXdpZHRoIGZpbGwgY2hhcnMgcHV0IGluIGJ5IGxpYmZyaWJpZGkgKi8KKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICBpZiAodW5pY29kZXN0cltpXSAhPSBGUklCSURJX0NIQVJfRklMTCkKKyAgICAgICAgICAgIHVuaWNvZGVzdHJbaisrXSA9IHVuaWNvZGVzdHJbaV07CisgICAgbGVuID0gajsKKworICAgIGlmICghKHRtcCA9IGF2X3JlYWxsb2Mocy0+dGV4dCwgKGxlbiAqIDQgKyAxKSAqIHNpemVvZigqcy0+dGV4dCkpKSkgeworICAgICAgICAvKiBVc2UgbGVuICogNCwgYXMgYSB1bmljb2RlIGNoYXJhY3RlciBjYW4gYmUgdXAgdG8gNCBieXRlcyBpbiBVVEYtOCAqLworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBzLT50ZXh0ID0gdG1wOworICAgIGxlbiA9IGZyaWJpZGlfdW5pY29kZV90b19jaGFyc2V0KEZSSUJJRElfQ0hBUl9TRVRfVVRGOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2Rlc3RyLCBsZW4sIHMtPnRleHQpOworICAgIHJldCA9IDA7CisKK291dDoKKyAgICBhdl9mcmVlKHVuaWNvZGVzdHIpOworICAgIGF2X2ZyZWUoZW1iZWRkaW5nX2xldmVscyk7CisgICAgYXZfZnJlZShhcl9wcm9wcyk7CisgICAgYXZfZnJlZShiaWRpX3R5cGVzKTsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBlcnI7CisgICAgRHJhd1RleHRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEdseXBoICpnbHlwaDsKKworICAgIGlmICghcy0+Zm9udGZpbGUgJiYgIUNPTkZJR19MSUJGT05UQ09ORklHKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGZvbnQgZmlsZW5hbWUgcHJvdmlkZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChzLT50ZXh0ZmlsZSkgeworICAgICAgICBpZiAocy0+dGV4dCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJCb3RoIHRleHQgYW5kIHRleHQgZmlsZSBwcm92aWRlZC4gUGxlYXNlIHByb3ZpZGUgb25seSBvbmVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGVyciA9IGxvYWRfdGV4dGZpbGUoY3R4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyNpZiBDT05GSUdfTElCRlJJQklESQorICAgIGlmIChzLT50ZXh0X3NoYXBpbmcpCisgICAgICAgIGlmICgoZXJyID0gc2hhcGVfdGV4dChjdHgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworI2VuZGlmCisKKyAgICBpZiAocy0+cmVsb2FkICYmICFzLT50ZXh0ZmlsZSkKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJObyBmaWxlIHRvIHJlbG9hZFxuIik7CisKKyAgICBpZiAocy0+dGNfb3B0X3N0cmluZykgeworICAgICAgICBpbnQgcmV0ID0gYXZfdGltZWNvZGVfaW5pdF9mcm9tX3N0cmluZygmcy0+dGMsIHMtPnRjX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRjX29wdF9zdHJpbmcsIGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHMtPnRjMjRobWF4KQorICAgICAgICAgICAgcy0+dGMuZmxhZ3MgfD0gQVZfVElNRUNPREVfRkxBR18yNEhPVVJTTUFYOworICAgICAgICBpZiAoIXMtPnRleHQpCisgICAgICAgICAgICBzLT50ZXh0ID0gYXZfc3RyZHVwKCIiKTsKKyAgICB9CisKKyAgICBpZiAoIXMtPnRleHQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkVpdGhlciB0ZXh0LCBhIHZhbGlkIGZpbGUgb3IgYSB0aW1lY29kZSBtdXN0IGJlIHByb3ZpZGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IEZUX0luaXRfRnJlZVR5cGUoJihzLT5saWJyYXJ5KSkpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDb3VsZCBub3QgbG9hZCBGcmVlVHlwZTogJXNcbiIsIEZUX0VSUk1TRyhlcnIpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBlcnIgPSBsb2FkX2ZvbnQoY3R4KTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGlmICghcy0+Zm9udHNpemUpCisgICAgICAgIHMtPmZvbnRzaXplID0gMTY7CisgICAgaWYgKChlcnIgPSBGVF9TZXRfUGl4ZWxfU2l6ZXMocy0+ZmFjZSwgMCwgcy0+Zm9udHNpemUpKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgc2V0IGZvbnQgc2l6ZSB0byAlZCBwaXhlbHM6ICVzXG4iLAorICAgICAgICAgICAgICAgcy0+Zm9udHNpemUsIEZUX0VSUk1TRyhlcnIpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAocy0+Ym9yZGVydykgeworICAgICAgICBpZiAoRlRfU3Ryb2tlcl9OZXcocy0+bGlicmFyeSwgJnMtPnN0cm9rZXIpKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsdCBub3QgaW5pdCBGVCBzdHJva2VyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICB9CisgICAgICAgIEZUX1N0cm9rZXJfU2V0KHMtPnN0cm9rZXIsIHMtPmJvcmRlcncgPDwgNiwgRlRfU1RST0tFUl9MSU5FQ0FQX1JPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICBGVF9TVFJPS0VSX0xJTkVKT0lOX1JPVU5ELCAwKTsKKyAgICB9CisKKyAgICBzLT51c2Vfa2VybmluZyA9IEZUX0hBU19LRVJOSU5HKHMtPmZhY2UpOworCisgICAgLyogbG9hZCB0aGUgZmFsbGJhY2sgZ2x5cGggd2l0aCBjb2RlIDAgKi8KKyAgICBsb2FkX2dseXBoKGN0eCwgTlVMTCwgMCk7CisKKyAgICAvKiBzZXQgdGhlIHRhYnNpemUgaW4gcGl4ZWxzICovCisgICAgaWYgKChlcnIgPSBsb2FkX2dseXBoKGN0eCwgJmdseXBoLCAnICcpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHNldCB0YWJzaXplLlxuIik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHMtPnRhYnNpemUgKj0gZ2x5cGgtPmFkdmFuY2U7CisKKyAgICBpZiAocy0+ZXhwX21vZGUgPT0gRVhQX1NUUkZUSU1FICYmCisgICAgICAgIChzdHJjaHIocy0+dGV4dCwgJyUnKSB8fCBzdHJjaHIocy0+dGV4dCwgJ1xcJykpKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgImV4cGFuc2lvbj1zdHJmdGltZSBpcyBkZXByZWNhdGVkLlxuIik7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmcy0+ZXhwYW5kZWRfdGV4dCwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKyAgICBhdl9icHJpbnRfaW5pdCgmcy0+ZXhwYW5kZWRfZm9udGNvbG9yLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9kcmF3X3N1cHBvcnRlZF9waXhlbF9mb3JtYXRzKDApKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnbHlwaF9lbnVfZnJlZSh2b2lkICpvcGFxdWUsIHZvaWQgKmVsZW0pCit7CisgICAgR2x5cGggKmdseXBoID0gZWxlbTsKKworICAgIEZUX0RvbmVfR2x5cGgoZ2x5cGgtPmdseXBoKTsKKyAgICBGVF9Eb25lX0dseXBoKGdseXBoLT5ib3JkZXJfZ2x5cGgpOworICAgIGF2X2ZyZWUoZWxlbSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIERyYXdUZXh0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2V4cHJfZnJlZShzLT54X3BleHByKTsKKyAgICBhdl9leHByX2ZyZWUocy0+eV9wZXhwcik7CisgICAgcy0+eF9wZXhwciA9IHMtPnlfcGV4cHIgPSBOVUxMOworICAgIGF2X2ZyZWVwKCZzLT5wb3NpdGlvbnMpOworICAgIHMtPm5iX3Bvc2l0aW9ucyA9IDA7CisKKworICAgIGF2X3RyZWVfZW51bWVyYXRlKHMtPmdseXBocywgTlVMTCwgTlVMTCwgZ2x5cGhfZW51X2ZyZWUpOworICAgIGF2X3RyZWVfZGVzdHJveShzLT5nbHlwaHMpOworICAgIHMtPmdseXBocyA9IE5VTEw7CisKKyAgICBGVF9Eb25lX0ZhY2Uocy0+ZmFjZSk7CisgICAgRlRfU3Ryb2tlcl9Eb25lKHMtPnN0cm9rZXIpOworICAgIEZUX0RvbmVfRnJlZVR5cGUocy0+bGlicmFyeSk7CisKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJnMtPmV4cGFuZGVkX3RleHQsIE5VTEwpOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmcy0+ZXhwYW5kZWRfZm9udGNvbG9yLCBOVUxMKTsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBEcmF3VGV4dENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIGZmX2RyYXdfaW5pdCgmcy0+ZGMsIGlubGluay0+Zm9ybWF0LCAwKTsKKyAgICBmZl9kcmF3X2NvbG9yKCZzLT5kYywgJnMtPmZvbnRjb2xvciwgICBzLT5mb250Y29sb3IucmdiYSk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZGMsICZzLT5zaGFkb3djb2xvciwgcy0+c2hhZG93Y29sb3IucmdiYSk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZGMsICZzLT5ib3JkZXJjb2xvciwgcy0+Ym9yZGVyY29sb3IucmdiYSk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZGMsICZzLT5ib3hjb2xvciwgICAgcy0+Ym94Y29sb3IucmdiYSk7CisKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl93XSAgICAgPSBzLT52YXJfdmFsdWVzW1ZBUl9XXSAgICAgPSBzLT52YXJfdmFsdWVzW1ZBUl9NQUlOX1ddID0gaW5saW5rLT53OworICAgIHMtPnZhcl92YWx1ZXNbVkFSX2hdICAgICA9IHMtPnZhcl92YWx1ZXNbVkFSX0hdICAgICA9IHMtPnZhcl92YWx1ZXNbVkFSX01BSU5fSF0gPSBpbmxpbmstPmg7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfU0FSXSAgID0gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA/IGF2X3EyZChpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8pIDogMTsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9EQVJdICAgPSAoZG91YmxlKWlubGluay0+dyAvIGlubGluay0+aCAqIHMtPnZhcl92YWx1ZXNbVkFSX1NBUl07CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfSFNVQl0gID0gMSA8PCBzLT5kYy5oc3ViX21heDsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9WU1VCXSAgPSAxIDw8IHMtPmRjLnZzdWJfbWF4OworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1hdICAgICA9IE5BTjsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9ZXSAgICAgPSBOQU47CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfVF0gICAgID0gTkFOOworCisgICAgYXZfbGZnX2luaXQoJnMtPnBybmcsIGF2X2dldF9yYW5kb21fc2VlZCgpKTsKKworICAgIGF2X2V4cHJfZnJlZShzLT54X3BleHByKTsKKyAgICBhdl9leHByX2ZyZWUocy0+eV9wZXhwcik7CisgICAgcy0+eF9wZXhwciA9IHMtPnlfcGV4cHIgPSBOVUxMOworCisgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlKCZzLT54X3BleHByLCBzLT54X2V4cHIsIHZhcl9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgZnVuMl9uYW1lcywgZnVuMiwgMCwgY3R4KSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBhdl9leHByX3BhcnNlKCZzLT55X3BleHByLCBzLT55X2V4cHIsIHZhcl9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgZnVuMl9uYW1lcywgZnVuMiwgMCwgY3R4KSkgPCAwKQorCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21tYW5kKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZywgY2hhciAqcmVzLCBpbnQgcmVzX2xlbiwgaW50IGZsYWdzKQoreworICAgIERyYXdUZXh0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlmICghc3RyY21wKGNtZCwgInJlaW5pdCIpKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIHVuaW5pdChjdHgpOworICAgICAgICBzLT5yZWluaXQgPSAxOworICAgICAgICBpZiAoKHJldCA9IGF2X3NldF9vcHRpb25zX3N0cmluZyhjdHgsIGFyZywgIj0iLCAiOiIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IGluaXQoY3R4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ19pbnB1dChjdHgtPmlucHV0c1swXSk7CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKworc3RhdGljIGludCBmdW5jX3BpY3RfdHlwZShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZCUHJpbnQgKmJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmY3QsIHVuc2lnbmVkIGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgdGFnKQoreworICAgIERyYXdUZXh0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2JwcmludGYoYnAsICIlYyIsIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihzLT52YXJfdmFsdWVzW1ZBUl9QSUNUX1RZUEVdKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnVuY19wdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWQlByaW50ICpicCwKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqZmN0LCB1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndiwgaW50IHRhZykKK3sKKyAgICBEcmF3VGV4dENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgY2hhciAqZm10OworICAgIGRvdWJsZSBwdHMgPSBzLT52YXJfdmFsdWVzW1ZBUl9UXTsKKyAgICBpbnQgcmV0OworCisgICAgZm10ID0gYXJnYyA+PSAxID8gYXJndlswXSA6ICJmbHQiOworICAgIGlmIChhcmdjID49IDIpIHsKKyAgICAgICAgaW50NjRfdCBkZWx0YTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9wYXJzZV90aW1lKCZkZWx0YSwgYXJndlsxXSwgMSkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBkZWx0YSAnJXMnXG4iLCBhcmd2WzFdKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcHRzICs9IChkb3VibGUpZGVsdGEgLyBBVl9USU1FX0JBU0U7CisgICAgfQorICAgIGlmICghc3RyY21wKGZtdCwgImZsdCIpKSB7CisgICAgICAgIGF2X2JwcmludGYoYnAsICIlLjZmIiwgcy0+dmFyX3ZhbHVlc1tWQVJfVF0pOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChmbXQsICJobXMiKSkgeworICAgICAgICBpZiAoaXNuYW4ocHRzKSkgeworICAgICAgICAgICAgYXZfYnByaW50ZihicCwgIiA/Pzo/Pzo/Py4/Pz8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDY0X3QgbXMgPSByb3VuZChwdHMgKiAxMDAwKTsKKyAgICAgICAgICAgIGNoYXIgc2lnbiA9ICcgJzsKKyAgICAgICAgICAgIGlmIChtcyA8IDApIHsKKyAgICAgICAgICAgICAgICBzaWduID0gJy0nOworICAgICAgICAgICAgICAgIG1zID0gLW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfYnByaW50ZihicCwgIiVjJTAyZDolMDJkOiUwMmQuJTAzZCIsIHNpZ24sCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1zIC8gKDYwICogNjAgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1zIC8gKDYwICogMTAwMCkpICUgNjAsCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1zIC8gMTAwMCkgJSA2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludCltcyAlIDEwMDApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmb3JtYXQgJyVzJ1xuIiwgZm10KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnVuY19mcmFtZV9udW0oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWQlByaW50ICpicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmN0LCB1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndiwgaW50IHRhZykKK3sKKyAgICBEcmF3VGV4dENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBhdl9icHJpbnRmKGJwLCAiJWQiLCAoaW50KXMtPnZhcl92YWx1ZXNbVkFSX05dKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdW5jX21ldGFkYXRhKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkJQcmludCAqYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmN0LCB1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndiwgaW50IHRhZykKK3sKKyAgICBEcmF3VGV4dENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmUgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgYXJndlswXSwgTlVMTCwgMCk7CisKKyAgICBpZiAoZSAmJiBlLT52YWx1ZSkKKyAgICAgICAgYXZfYnByaW50ZihicCwgIiVzIiwgZS0+dmFsdWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ1bmNfc3RyZnRpbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWQlByaW50ICpicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmY3QsIHVuc2lnbmVkIGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgdGFnKQoreworICAgIGNvbnN0IGNoYXIgKmZtdCA9IGFyZ2MgPyBhcmd2WzBdIDogIiVZLSVtLSVkICVIOiVNOiVTIjsKKyAgICB0aW1lX3Qgbm93OworICAgIHN0cnVjdCB0bSB0bTsKKworICAgIHRpbWUoJm5vdyk7CisgICAgaWYgKHRhZyA9PSAnTCcpCisgICAgICAgIGxvY2FsdGltZV9yKCZub3csICZ0bSk7CisgICAgZWxzZQorICAgICAgICB0bSA9ICpnbXRpbWVfcigmbm93LCAmdG0pOworICAgIGF2X2JwcmludF9zdHJmdGltZShicCwgZm10LCAmdG0pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ1bmNfZXZhbF9leHByKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkJQcmludCAqYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZjdCwgdW5zaWduZWQgYXJnYywgY2hhciAqKmFyZ3YsIGludCB0YWcpCit7CisgICAgRHJhd1RleHRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGRvdWJsZSByZXM7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgYXJndlswXSwgdmFyX25hbWVzLCBzLT52YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgZnVuMl9uYW1lcywgZnVuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5wcm5nLCAwLCBjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRXhwcmVzc2lvbiAnJXMnIGZvciB0aGUgZXhwciB0ZXh0IGV4cGFuc2lvbiBmdW5jdGlvbiBpcyBub3QgdmFsaWRcbiIsCisgICAgICAgICAgICAgICBhcmd2WzBdKTsKKyAgICBlbHNlCisgICAgICAgIGF2X2JwcmludGYoYnAsICIlZiIsIHJlcyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZ1bmNfZXZhbF9leHByX2ludF9mb3JtYXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWQlByaW50ICpicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmN0LCB1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndiwgaW50IHRhZykKK3sKKyAgICBEcmF3VGV4dENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgZG91YmxlIHJlczsKKyAgICBpbnQgaW50dmFsOworICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgaW50IHBvc2l0aW9ucyA9IDA7CisgICAgY2hhciBmbXRfc3RyWzMwXSA9ICIlIjsKKworICAgIC8qCisgICAgICogYXJndlswXSBleHByZXNzaW9uIHRvIGJlIGNvbnZlcnRlZCB0byBgaW50YAorICAgICAqIGFyZ3ZbMV0gZm9ybWF0OiAneCcsICdYJywgJ2QnIG9yICd1JworICAgICAqIGFyZ3ZbMl0gcG9zaXRpb25zIHByaW50ZWQgKG9wdGlvbmFsKQorICAgICAqLworCisgICAgcmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmcmVzLCBhcmd2WzBdLCB2YXJfbmFtZXMsIHMtPnZhcl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBmdW4yX25hbWVzLCBmdW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnBybmcsIDAsIGN0eCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkV4cHJlc3Npb24gJyVzJyBmb3IgdGhlIGV4cHIgdGV4dCBleHBhbnNpb24gZnVuY3Rpb24gaXMgbm90IHZhbGlkXG4iLAorICAgICAgICAgICAgICAgYXJndlswXSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKCFzdHJjaHIoInhYZHUiLCBhcmd2WzFdWzBdKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGZvcm1hdCAnJWMnIHNwZWNpZmllZCwiCisgICAgICAgICAgICAgICAgIiBhbGxvd2VkIHZhbHVlczogJ3gnLCAnWCcsICdkJywgJ3UnXG4iLCBhcmd2WzFdWzBdKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoYXJnYyA9PSAzKSB7CisgICAgICAgIHJldCA9IHNzY2FuZihhcmd2WzJdLCAiJXUiLCAmcG9zaXRpb25zKTsKKyAgICAgICAgaWYgKHJldCAhPSAxKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJleHByX2ludF9mb3JtYXQoKTogSW52YWxpZCBudW1iZXIgb2YgcG9zaXRpb25zIgorICAgICAgICAgICAgICAgICAgICAiIHRvIHByaW50OiAnJXMnXG4iLCBhcmd2WzJdKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmZWNsZWFyZXhjZXB0KEZFX0FMTF9FWENFUFQpOworICAgIGludHZhbCA9IHJlczsKKyAgICBpZiAoKHJldCA9IGZldGVzdGV4Y2VwdChGRV9JTlZBTElEfEZFX09WRVJGTE9XfEZFX1VOREVSRkxPVykpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvbnZlcnNpb24gb2YgZmxvYXRpbmctcG9pbnQgcmVzdWx0IHRvIGludCBmYWlsZWQuIENvbnRyb2wgcmVnaXN0ZXI6IDB4JTA4eC4gQ29udmVyc2lvbiByZXN1bHQ6ICVkXG4iLCByZXQsIGludHZhbCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGFyZ2MgPT0gMykKKyAgICAgICAgYXZfc3RybGNhdGYoZm10X3N0ciwgc2l6ZW9mKGZtdF9zdHIpLCAiMCV1IiwgcG9zaXRpb25zKTsKKyAgICBhdl9zdHJsY2F0ZihmbXRfc3RyLCBzaXplb2YoZm10X3N0ciksICIlYyIsIGFyZ3ZbMV1bMF0pOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiRm9ybWF0dGluZyB2YWx1ZSAlZiAoZXhwciAnJXMnKSB3aXRoIHNwZWMgJyVzJ1xuIiwKKyAgICAgICAgICAgIHJlcywgYXJndlswXSwgZm10X3N0cik7CisKKyAgICBhdl9icHJpbnRmKGJwLCBmbXRfc3RyLCBpbnR2YWwpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJhd3RleHRfZnVuY3Rpb24geworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgdW5zaWduZWQgYXJnY19taW4sIGFyZ2NfbWF4OworICAgIGludCB0YWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgb3BhcXVlIGFyZ3VtZW50IHRvIGZ1bmMgKi8KKyAgICBpbnQgKCpmdW5jKShBVkZpbHRlckNvbnRleHQgKiwgQVZCUHJpbnQgKiwgY2hhciAqLCB1bnNpZ25lZCwgY2hhciAqKiwgaW50KTsKK30gZnVuY3Rpb25zW10gPSB7CisgICAgeyAiZXhwciIsICAgICAgMSwgMSwgMCwgICBmdW5jX2V2YWxfZXhwciB9LAorICAgIHsgImUiLCAgICAgICAgIDEsIDEsIDAsICAgZnVuY19ldmFsX2V4cHIgfSwKKyAgICB7ICJleHByX2ludF9mb3JtYXQiLCAyLCAzLCAwLCBmdW5jX2V2YWxfZXhwcl9pbnRfZm9ybWF0IH0sCisgICAgeyAiZWlmIiwgICAgICAgMiwgMywgMCwgICBmdW5jX2V2YWxfZXhwcl9pbnRfZm9ybWF0IH0sCisgICAgeyAicGljdF90eXBlIiwgMCwgMCwgMCwgICBmdW5jX3BpY3RfdHlwZSB9LAorICAgIHsgInB0cyIsICAgICAgIDAsIDIsIDAsICAgZnVuY19wdHMgICAgICB9LAorICAgIHsgImdtdGltZSIsICAgIDAsIDEsICdHJywgZnVuY19zdHJmdGltZSB9LAorICAgIHsgImxvY2FsdGltZSIsIDAsIDEsICdMJywgZnVuY19zdHJmdGltZSB9LAorICAgIHsgImZyYW1lX251bSIsIDAsIDAsIDAsICAgZnVuY19mcmFtZV9udW0gfSwKKyAgICB7ICJuIiwgICAgICAgICAwLCAwLCAwLCAgIGZ1bmNfZnJhbWVfbnVtIH0sCisgICAgeyAibWV0YWRhdGEiLCAgMSwgMSwgMCwgICBmdW5jX21ldGFkYXRhIH0sCit9OworCitzdGF0aWMgaW50IGV2YWxfZnVuY3Rpb24oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWQlByaW50ICpicCwgY2hhciAqZmN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIHVuc2lnbmVkIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZnVuY3Rpb25zKTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAoZmN0LCBmdW5jdGlvbnNbaV0ubmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGFyZ2MgPCBmdW5jdGlvbnNbaV0uYXJnY19taW4pIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIiUleyVzfSByZXF1aXJlcyBhdCBsZWFzdCAlZCBhcmd1bWVudHNcbiIsCisgICAgICAgICAgICAgICAgICAgZmN0LCBmdW5jdGlvbnNbaV0uYXJnY19taW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJnYyA+IGZ1bmN0aW9uc1tpXS5hcmdjX21heCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiJSV7JXN9IHJlcXVpcmVzIGF0IG1vc3QgJWQgYXJndW1lbnRzXG4iLAorICAgICAgICAgICAgICAgICAgIGZjdCwgZnVuY3Rpb25zW2ldLmFyZ2NfbWF4KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID49IEZGX0FSUkFZX0VMRU1TKGZ1bmN0aW9ucykpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiJSV7JXN9IGlzIG5vdCBrbm93blxuIiwgZmN0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0dXJuIGZ1bmN0aW9uc1tpXS5mdW5jKGN0eCwgYnAsIGZjdCwgYXJnYywgYXJndiwgZnVuY3Rpb25zW2ldLnRhZyk7Cit9CisKK3N0YXRpYyBpbnQgZXhwYW5kX2Z1bmN0aW9uKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkJQcmludCAqYnAsIGNoYXIgKipydGV4dCkKK3sKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gKnJ0ZXh0OworICAgIGNoYXIgKmFyZ3ZbMTZdID0geyBOVUxMIH07CisgICAgdW5zaWduZWQgYXJnYyA9IDAsIGk7CisgICAgaW50IHJldDsKKworICAgIGlmICgqdGV4dCAhPSAneycpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiU3RyYXkgJSUgbmVhciAnJXMnXG4iLCB0ZXh0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgdGV4dCsrOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGFyZ3ZbYXJnYysrXSA9IGF2X2dldF90b2tlbigmdGV4dCwgIjp9IikpKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoISp0ZXh0KSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnRlcm1pbmF0ZWQgJSV7fSBuZWFyICclcydcbiIsICpydGV4dCk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJnYyA9PSBGRl9BUlJBWV9FTEVNUyhhcmd2KSkKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZhcmd2Wy0tYXJnY10pOyAvKiBlcnJvciB3aWxsIGJlIGNhdWdodCBsYXRlciAqLworICAgICAgICBpZiAoKnRleHQgPT0gJ30nKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHRleHQrKzsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGV2YWxfZnVuY3Rpb24oY3R4LCBicCwgYXJndlswXSwgYXJnYyAtIDEsIGFyZ3YgKyAxKSkgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKyAgICByZXQgPSAwOworICAgICpydGV4dCA9IChjaGFyICopdGV4dCArIDE7CisKK2VuZDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmYXJndltpXSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHBhbmRfdGV4dChBVkZpbHRlckNvbnRleHQgKmN0eCwgY2hhciAqdGV4dCwgQVZCUHJpbnQgKmJwKQoreworICAgIGludCByZXQ7CisKKyAgICBhdl9icHJpbnRfY2xlYXIoYnApOworICAgIHdoaWxlICgqdGV4dCkgeworICAgICAgICBpZiAoKnRleHQgPT0gJ1xcJyAmJiB0ZXh0WzFdKSB7CisgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnAsIHRleHRbMV0sIDEpOworICAgICAgICAgICAgdGV4dCArPSAyOworICAgICAgICB9IGVsc2UgaWYgKCp0ZXh0ID09ICclJykgeworICAgICAgICAgICAgdGV4dCsrOworICAgICAgICAgICAgaWYgKChyZXQgPSBleHBhbmRfZnVuY3Rpb24oY3R4LCBicCwgJnRleHQpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhicCwgKnRleHQsIDEpOworICAgICAgICAgICAgdGV4dCsrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKGJwKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcmF3X2dseXBocyhEcmF3VGV4dENvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIEZGRHJhd0NvbG9yICpjb2xvciwgaW50IHgsIGludCB5LCBpbnQgYm9yZGVydykKK3sKKyAgICBjaGFyICp0ZXh0ID0gcy0+ZXhwYW5kZWRfdGV4dC5zdHI7CisgICAgdWludDMyX3QgY29kZSA9IDA7CisgICAgaW50IGksIHgxLCB5MTsKKyAgICB1aW50OF90ICpwOworICAgIEdseXBoICpnbHlwaCA9IE5VTEw7CisKKyAgICBmb3IgKGkgPSAwLCBwID0gdGV4dDsgKnA7IGkrKykgeworICAgICAgICBGVF9CaXRtYXAgYml0bWFwOworICAgICAgICBHbHlwaCBkdW1teSA9IHsgMCB9OworICAgICAgICBHRVRfVVRGOChjb2RlLCAqcCsrLCBjb250aW51ZTspOworCisgICAgICAgIC8qIHNraXAgbmV3IGxpbmUgY2hhcnMsIGp1c3QgZ28gdG8gbmV3IGxpbmUgKi8KKyAgICAgICAgaWYgKGNvZGUgPT0gJ1xuJyB8fCBjb2RlID09ICdccicgfHwgY29kZSA9PSAnXHQnKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZHVtbXkuY29kZSA9IGNvZGU7CisgICAgICAgIGdseXBoID0gYXZfdHJlZV9maW5kKHMtPmdseXBocywgJmR1bW15LCAodm9pZCAqKWdseXBoX2NtcCwgTlVMTCk7CisKKyAgICAgICAgYml0bWFwID0gYm9yZGVydyA/IGdseXBoLT5ib3JkZXJfYml0bWFwIDogZ2x5cGgtPmJpdG1hcDsKKworICAgICAgICBpZiAoZ2x5cGgtPmJpdG1hcC5waXhlbF9tb2RlICE9IEZUX1BJWEVMX01PREVfTU9OTyAmJgorICAgICAgICAgICAgZ2x5cGgtPmJpdG1hcC5waXhlbF9tb2RlICE9IEZUX1BJWEVMX01PREVfR1JBWSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAgICAgeDEgPSBzLT5wb3NpdGlvbnNbaV0ueCtzLT54K3ggLSBib3JkZXJ3OworICAgICAgICB5MSA9IHMtPnBvc2l0aW9uc1tpXS55K3MtPnkreSAtIGJvcmRlcnc7CisKKyAgICAgICAgZmZfYmxlbmRfbWFzaygmcy0+ZGMsIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5kYXRhLCBmcmFtZS0+bGluZXNpemUsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLmJ1ZmZlciwgYml0bWFwLnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC53aWR0aCwgYml0bWFwLnJvd3MsCisgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLnBpeGVsX21vZGUgPT0gRlRfUElYRUxfTU9ERV9NT05PID8gMCA6IDMsCisgICAgICAgICAgICAgICAgICAgICAgMCwgeDEsIHkxKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcmF3X3RleHQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIERyYXdUZXh0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworCisgICAgdWludDMyX3QgY29kZSA9IDAsIHByZXZfY29kZSA9IDA7CisgICAgaW50IHggPSAwLCB5ID0gMCwgaSA9IDAsIHJldDsKKyAgICBpbnQgbWF4X3RleHRfbGluZV93ID0gMCwgbGVuOworICAgIGludCBib3hfdywgYm94X2g7CisgICAgY2hhciAqdGV4dDsKKyAgICB1aW50OF90ICpwOworICAgIGludCB5X21pbiA9IDMyMDAwLCB5X21heCA9IC0zMjAwMDsKKyAgICBpbnQgeF9taW4gPSAzMjAwMCwgeF9tYXggPSAtMzIwMDA7CisgICAgRlRfVmVjdG9yIGRlbHRhOworICAgIEdseXBoICpnbHlwaCA9IE5VTEwsICpwcmV2X2dseXBoID0gTlVMTDsKKyAgICBHbHlwaCBkdW1teSA9IHsgMCB9OworCisgICAgdGltZV90IG5vdyA9IHRpbWUoMCk7CisgICAgc3RydWN0IHRtIGx0aW1lOworICAgIEFWQlByaW50ICpicCA9ICZzLT5leHBhbmRlZF90ZXh0OworCisgICAgYXZfYnByaW50X2NsZWFyKGJwKTsKKworICAgIGlmKHMtPmJhc2V0aW1lICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBub3c9IGZyYW1lLT5wdHMqYXZfcTJkKGN0eC0+aW5wdXRzWzBdLT50aW1lX2Jhc2UpICsgcy0+YmFzZXRpbWUvMTAwMDAwMDsKKworICAgIHN3aXRjaCAocy0+ZXhwX21vZGUpIHsKKyAgICBjYXNlIEVYUF9OT05FOgorICAgICAgICBhdl9icHJpbnRmKGJwLCAiJXMiLCBzLT50ZXh0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBfTk9STUFMOgorICAgICAgICBpZiAoKHJldCA9IGV4cGFuZF90ZXh0KGN0eCwgcy0+dGV4dCwgJnMtPmV4cGFuZGVkX3RleHQpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYUF9TVFJGVElNRToKKyAgICAgICAgbG9jYWx0aW1lX3IoJm5vdywgJmx0aW1lKTsKKyAgICAgICAgYXZfYnByaW50X3N0cmZ0aW1lKGJwLCBzLT50ZXh0LCAmbHRpbWUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocy0+dGNfb3B0X3N0cmluZykgeworICAgICAgICBjaGFyIHRjYnVmW0FWX1RJTUVDT0RFX1NUUl9TSVpFXTsKKyAgICAgICAgYXZfdGltZWNvZGVfbWFrZV9zdHJpbmcoJnMtPnRjLCB0Y2J1ZiwgaW5saW5rLT5mcmFtZV9jb3VudCk7CisgICAgICAgIGF2X2JwcmludF9jbGVhcihicCk7CisgICAgICAgIGF2X2JwcmludGYoYnAsICIlcyVzIiwgcy0+dGV4dCwgdGNidWYpOworICAgIH0KKworICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKGJwKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB0ZXh0ID0gcy0+ZXhwYW5kZWRfdGV4dC5zdHI7CisgICAgaWYgKChsZW4gPSBzLT5leHBhbmRlZF90ZXh0LmxlbikgPiBzLT5uYl9wb3NpdGlvbnMpIHsKKyAgICAgICAgaWYgKCEocy0+cG9zaXRpb25zID0KKyAgICAgICAgICAgICAgYXZfcmVhbGxvYyhzLT5wb3NpdGlvbnMsIGxlbipzaXplb2YoKnMtPnBvc2l0aW9ucykpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHMtPm5iX3Bvc2l0aW9ucyA9IGxlbjsKKyAgICB9CisKKyAgICBpZiAocy0+Zm9udGNvbG9yX2V4cHJbMF0pIHsKKyAgICAgICAgLyogSWYgZXhwcmVzc2lvbiBpcyBzZXQsIGV2YWx1YXRlIGFuZCByZXBsYWNlIHRoZSBzdGF0aWMgdmFsdWUgKi8KKyAgICAgICAgYXZfYnByaW50X2NsZWFyKCZzLT5leHBhbmRlZF9mb250Y29sb3IpOworICAgICAgICBpZiAoKHJldCA9IGV4cGFuZF90ZXh0KGN0eCwgcy0+Zm9udGNvbG9yX2V4cHIsICZzLT5leHBhbmRlZF9mb250Y29sb3IpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZSgmcy0+ZXhwYW5kZWRfZm9udGNvbG9yKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJFdmFsdWF0ZWQgZm9udGNvbG9yIGlzICclcydcbiIsIHMtPmV4cGFuZGVkX2ZvbnRjb2xvci5zdHIpOworICAgICAgICByZXQgPSBhdl9wYXJzZV9jb2xvcihzLT5mb250Y29sb3IucmdiYSwgcy0+ZXhwYW5kZWRfZm9udGNvbG9yLnN0ciwgLTEsIHMpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZmZfZHJhd19jb2xvcigmcy0+ZGMsICZzLT5mb250Y29sb3IsIHMtPmZvbnRjb2xvci5yZ2JhKTsKKyAgICB9CisKKyAgICB4ID0gMDsKKyAgICB5ID0gMDsKKworICAgIC8qIGxvYWQgYW5kIGNhY2hlIGdseXBocyAqLworICAgIGZvciAoaSA9IDAsIHAgPSB0ZXh0OyAqcDsgaSsrKSB7CisgICAgICAgIEdFVF9VVEY4KGNvZGUsICpwKyssIGNvbnRpbnVlOyk7CisKKyAgICAgICAgLyogZ2V0IGdseXBoICovCisgICAgICAgIGR1bW15LmNvZGUgPSBjb2RlOworICAgICAgICBnbHlwaCA9IGF2X3RyZWVfZmluZChzLT5nbHlwaHMsICZkdW1teSwgZ2x5cGhfY21wLCBOVUxMKTsKKyAgICAgICAgaWYgKCFnbHlwaCkgeworICAgICAgICAgICAgbG9hZF9nbHlwaChjdHgsICZnbHlwaCwgY29kZSk7CisgICAgICAgIH0KKworICAgICAgICB5X21pbiA9IEZGTUlOKGdseXBoLT5iYm94LnlNaW4sIHlfbWluKTsKKyAgICAgICAgeV9tYXggPSBGRk1BWChnbHlwaC0+YmJveC55TWF4LCB5X21heCk7CisgICAgICAgIHhfbWluID0gRkZNSU4oZ2x5cGgtPmJib3gueE1pbiwgeF9taW4pOworICAgICAgICB4X21heCA9IEZGTUFYKGdseXBoLT5iYm94LnhNYXgsIHhfbWF4KTsKKyAgICB9CisgICAgcy0+bWF4X2dseXBoX2ggPSB5X21heCAtIHlfbWluOworICAgIHMtPm1heF9nbHlwaF93ID0geF9tYXggLSB4X21pbjsKKworICAgIC8qIGNvbXB1dGUgYW5kIHNhdmUgcG9zaXRpb24gZm9yIGVhY2ggZ2x5cGggKi8KKyAgICBnbHlwaCA9IE5VTEw7CisgICAgZm9yIChpID0gMCwgcCA9IHRleHQ7ICpwOyBpKyspIHsKKyAgICAgICAgR0VUX1VURjgoY29kZSwgKnArKywgY29udGludWU7KTsKKworICAgICAgICAvKiBza2lwIHRoZSBcbiBpbiB0aGUgc2VxdWVuY2UgXHJcbiAqLworICAgICAgICBpZiAocHJldl9jb2RlID09ICdccicgJiYgY29kZSA9PSAnXG4nKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcHJldl9jb2RlID0gY29kZTsKKyAgICAgICAgaWYgKGlzX25ld2xpbmUoY29kZSkpIHsKKworICAgICAgICAgICAgbWF4X3RleHRfbGluZV93ID0gRkZNQVgobWF4X3RleHRfbGluZV93LCB4KTsKKyAgICAgICAgICAgIHkgKz0gcy0+bWF4X2dseXBoX2g7CisgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogZ2V0IGdseXBoICovCisgICAgICAgIHByZXZfZ2x5cGggPSBnbHlwaDsKKyAgICAgICAgZHVtbXkuY29kZSA9IGNvZGU7CisgICAgICAgIGdseXBoID0gYXZfdHJlZV9maW5kKHMtPmdseXBocywgJmR1bW15LCBnbHlwaF9jbXAsIE5VTEwpOworCisgICAgICAgIC8qIGtlcm5pbmcgKi8KKyAgICAgICAgaWYgKHMtPnVzZV9rZXJuaW5nICYmIHByZXZfZ2x5cGggJiYgZ2x5cGgtPmNvZGUpIHsKKyAgICAgICAgICAgIEZUX0dldF9LZXJuaW5nKHMtPmZhY2UsIHByZXZfZ2x5cGgtPmNvZGUsIGdseXBoLT5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRfa2VybmluZ19kZWZhdWx0LCAmZGVsdGEpOworICAgICAgICAgICAgeCArPSBkZWx0YS54ID4+IDY7CisgICAgICAgIH0KKworICAgICAgICAvKiBzYXZlIHBvc2l0aW9uICovCisgICAgICAgIHMtPnBvc2l0aW9uc1tpXS54ID0geCArIGdseXBoLT5iaXRtYXBfbGVmdDsKKyAgICAgICAgcy0+cG9zaXRpb25zW2ldLnkgPSB5IC0gZ2x5cGgtPmJpdG1hcF90b3AgKyB5X21heDsKKyAgICAgICAgaWYgKGNvZGUgPT0gJ1x0JykgeCAgPSAoeCAvIHMtPnRhYnNpemUgKyAxKSpzLT50YWJzaXplOworICAgICAgICBlbHNlICAgICAgICAgICAgICB4ICs9IGdseXBoLT5hZHZhbmNlOworICAgIH0KKworICAgIG1heF90ZXh0X2xpbmVfdyA9IEZGTUFYKHgsIG1heF90ZXh0X2xpbmVfdyk7CisKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9UV10gPSBzLT52YXJfdmFsdWVzW1ZBUl9URVhUX1ddID0gbWF4X3RleHRfbGluZV93OworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1RIXSA9IHMtPnZhcl92YWx1ZXNbVkFSX1RFWFRfSF0gPSB5ICsgcy0+bWF4X2dseXBoX2g7CisKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9NQVhfR0xZUEhfV10gPSBzLT5tYXhfZ2x5cGhfdzsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9NQVhfR0xZUEhfSF0gPSBzLT5tYXhfZ2x5cGhfaDsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9NQVhfR0xZUEhfQV0gPSBzLT52YXJfdmFsdWVzW1ZBUl9BU0NFTlQgXSA9IHlfbWF4OworICAgIHMtPnZhcl92YWx1ZXNbVkFSX01BWF9HTFlQSF9EXSA9IHMtPnZhcl92YWx1ZXNbVkFSX0RFU0NFTlRdID0geV9taW47CisKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9MSU5FX0hdID0gcy0+dmFyX3ZhbHVlc1tWQVJfTEhdID0gcy0+bWF4X2dseXBoX2g7CisKKyAgICBzLT54ID0gcy0+dmFyX3ZhbHVlc1tWQVJfWF0gPSBhdl9leHByX2V2YWwocy0+eF9wZXhwciwgcy0+dmFyX3ZhbHVlcywgJnMtPnBybmcpOworICAgIHMtPnkgPSBzLT52YXJfdmFsdWVzW1ZBUl9ZXSA9IGF2X2V4cHJfZXZhbChzLT55X3BleHByLCBzLT52YXJfdmFsdWVzLCAmcy0+cHJuZyk7CisgICAgcy0+eCA9IHMtPnZhcl92YWx1ZXNbVkFSX1hdID0gYXZfZXhwcl9ldmFsKHMtPnhfcGV4cHIsIHMtPnZhcl92YWx1ZXMsICZzLT5wcm5nKTsKKworICAgIGJveF93ID0gRkZNSU4od2lkdGggLSAxICwgbWF4X3RleHRfbGluZV93KTsKKyAgICBib3hfaCA9IEZGTUlOKGhlaWdodCAtIDEsIHkgKyBzLT5tYXhfZ2x5cGhfaCk7CisKKyAgICAvKiBkcmF3IGJveCAqLworICAgIGlmIChzLT5kcmF3X2JveCkKKyAgICAgICAgZmZfYmxlbmRfcmVjdGFuZ2xlKCZzLT5kYywgJnMtPmJveGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGEsIGZyYW1lLT5saW5lc2l6ZSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPngsIHMtPnksIGJveF93LCBib3hfaCk7CisKKyAgICBpZiAocy0+c2hhZG93eCB8fCBzLT5zaGFkb3d5KSB7CisgICAgICAgIGlmICgocmV0ID0gZHJhd19nbHlwaHMocywgZnJhbWUsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnNoYWRvd2NvbG9yLCBzLT5zaGFkb3d4LCBzLT5zaGFkb3d5LCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAocy0+Ym9yZGVydykgeworICAgICAgICBpZiAoKHJldCA9IGRyYXdfZ2x5cGhzKHMsIGZyYW1lLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5ib3JkZXJjb2xvciwgMCwgMCwgcy0+Ym9yZGVydykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmICgocmV0ID0gZHJhd19nbHlwaHMocywgZnJhbWUsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Zm9udGNvbG9yLCAwLCAwLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBEcmF3VGV4dENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIGlmIChzLT5yZWxvYWQpIHsKKyAgICAgICAgaWYgKChyZXQgPSBsb2FkX3RleHRmaWxlKGN0eCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisjaWYgQ09ORklHX0xJQkZSSUJJREkKKyAgICAgICAgaWYgKHMtPnRleHRfc2hhcGluZykKKyAgICAgICAgICAgIGlmICgocmV0ID0gc2hhcGVfdGV4dChjdHgpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyNlbmRpZgorICAgIH0KKworICAgIHMtPnZhcl92YWx1ZXNbVkFSX05dID0gaW5saW5rLT5mcmFtZV9jb3VudCtzLT5zdGFydF9udW1iZXI7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfVF0gPSBmcmFtZS0+cHRzID09IEFWX05PUFRTX1ZBTFVFID8KKyAgICAgICAgTkFOIDogZnJhbWUtPnB0cyAqIGF2X3EyZChpbmxpbmstPnRpbWVfYmFzZSk7CisKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9QSUNUX1RZUEVdID0gZnJhbWUtPnBpY3RfdHlwZTsKKyAgICBzLT5tZXRhZGF0YSA9IGF2X2ZyYW1lX2dldF9tZXRhZGF0YShmcmFtZSk7CisKKyAgICBkcmF3X3RleHQoY3R4LCBmcmFtZSwgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0KTsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIm46JWQgdDolZiB0ZXh0X3c6JWQgdGV4dF9oOiVkIHg6JWQgeTolZFxuIiwKKyAgICAgICAgICAgKGludClzLT52YXJfdmFsdWVzW1ZBUl9OXSwgcy0+dmFyX3ZhbHVlc1tWQVJfVF0sCisgICAgICAgICAgIChpbnQpcy0+dmFyX3ZhbHVlc1tWQVJfVEVYVF9XXSwgKGludClzLT52YXJfdmFsdWVzW1ZBUl9URVhUX0hdLAorICAgICAgICAgICBzLT54LCBzLT55KTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZnJhbWUpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfZHJhd3RleHRfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICAgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5uZWVkc193cml0YWJsZSA9IDEsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX2RyYXd0ZXh0X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9kcmF3dGV4dCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJkcmF3dGV4dCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRHJhdyB0ZXh0IG9uIHRvcCBvZiB2aWRlbyBmcmFtZXMgdXNpbmcgbGliZnJlZXR5cGUgbGlicmFyeS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihEcmF3VGV4dENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmRyYXd0ZXh0X2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl92Zl9kcmF3dGV4dF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl92Zl9kcmF3dGV4dF9vdXRwdXRzLAorICAgIC5wcm9jZXNzX2NvbW1hbmQgPSBjb21tYW5kLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2VkZ2VkZXRlY3QuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9lZGdlZGV0ZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxNjQxMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9lZGdlZGV0ZWN0LmMKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBDbMOpbWVudCBCxZNzY2ggPHUgcGtoIG1lPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBFZGdlIGRldGVjdGlvbiBmaWx0ZXIKKyAqCisgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Nhbm55X2VkZ2VfZGV0ZWN0b3IKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworZW51bSBGaWx0ZXJNb2RlIHsKKyAgICBNT0RFX1dJUkVTLAorICAgIE1PREVfQ09MT1JNSVgsCisgICAgTkJfTU9ERQorfTsKKworc3RydWN0IHBsYW5lX2luZm8geworICAgIHVpbnQ4X3QgICp0bXBidWY7CisgICAgdWludDE2X3QgKmdyYWRpZW50czsKKyAgICBjaGFyICAgICAqZGlyZWN0aW9uczsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBzdHJ1Y3QgcGxhbmVfaW5mbyBwbGFuZXNbM107CisgICAgaW50IG5iX3BsYW5lczsKKyAgICBkb3VibGUgICBsb3csIGhpZ2g7CisgICAgdWludDhfdCAgbG93X3U4LCBoaWdoX3U4OworICAgIGVudW0gRmlsdGVyTW9kZSBtb2RlOworfSBFZGdlRGV0ZWN0Q29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRWRnZURldGVjdENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGVkZ2VkZXRlY3Rfb3B0aW9uc1tdID0geworICAgIHsgImhpZ2giLCAic2V0IGhpZ2ggdGhyZXNob2xkIiwgT0ZGU0VUKGhpZ2gpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTUwLzI1NS59LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgImxvdyIsICAic2V0IGxvdyB0aHJlc2hvbGQiLCAgT0ZGU0VUKGxvdyksICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTIwLzI1NS59LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgIm1vZGUiLCAic2V0IG1vZGUiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9TU9ERV9XSVJFU30sIDAsIE5CX01PREUtMSwgRkxBR1MsICJtb2RlIiB9LAorICAgICAgICB7ICJ3aXJlcyIsICAgICJ3aGl0ZS9ncmF5IHdpcmVzIG9uIGJsYWNrIiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT0RFX1dJUkVTfSwgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtb2RlIiB9LAorICAgICAgICB7ICJjb2xvcm1peCIsICJtaXggY29sb3JzIiwgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT0RFX0NPTE9STUlYfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZWRnZWRldGVjdCk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEVkZ2VEZXRlY3RDb250ZXh0ICplZGdlZGV0ZWN0ID0gY3R4LT5wcml2OworCisgICAgZWRnZWRldGVjdC0+bG93X3U4ICA9IGVkZ2VkZXRlY3QtPmxvdyAgKiAyNTUuICsgLjU7CisgICAgZWRnZWRldGVjdC0+aGlnaF91OCA9IGVkZ2VkZXRlY3QtPmhpZ2ggKiAyNTUuICsgLjU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBjb25zdCBFZGdlRGV0ZWN0Q29udGV4dCAqZWRnZWRldGVjdCA9IGN0eC0+cHJpdjsKKworICAgIGlmIChlZGdlZGV0ZWN0LT5tb2RlID09IE1PREVfV0lSRVMpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0ge0FWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfTk9ORX07CisgICAgICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICB9IGVsc2UgaWYgKGVkZ2VkZXRlY3QtPm1vZGUgPT0gTU9ERV9DT0xPUk1JWCkgeworICAgICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7QVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX05PTkV9OworICAgICAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIGludCBwOworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgRWRnZURldGVjdENvbnRleHQgKmVkZ2VkZXRlY3QgPSBjdHgtPnByaXY7CisKKyAgICBlZGdlZGV0ZWN0LT5uYl9wbGFuZXMgPSBpbmxpbmstPmZvcm1hdCA9PSBBVl9QSVhfRk1UX0dSQVk4ID8gMSA6IDM7CisgICAgZm9yIChwID0gMDsgcCA8IGVkZ2VkZXRlY3QtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgIHN0cnVjdCBwbGFuZV9pbmZvICpwbGFuZSA9ICZlZGdlZGV0ZWN0LT5wbGFuZXNbcF07CisKKyAgICAgICAgcGxhbmUtPnRtcGJ1ZiAgICAgPSBhdl9tYWxsb2MoaW5saW5rLT53ICogaW5saW5rLT5oKTsKKyAgICAgICAgcGxhbmUtPmdyYWRpZW50cyAgPSBhdl9jYWxsb2MoaW5saW5rLT53ICogaW5saW5rLT5oLCBzaXplb2YoKnBsYW5lLT5ncmFkaWVudHMpKTsKKyAgICAgICAgcGxhbmUtPmRpcmVjdGlvbnMgPSBhdl9tYWxsb2MoaW5saW5rLT53ICogaW5saW5rLT5oKTsKKyAgICAgICAgaWYgKCFwbGFuZS0+dG1wYnVmIHx8ICFwbGFuZS0+Z3JhZGllbnRzIHx8ICFwbGFuZS0+ZGlyZWN0aW9ucykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnYXVzc2lhbl9ibHVyKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplKQoreworICAgIGludCBpLCBqOworCisgICAgbWVtY3B5KGRzdCwgc3JjLCB3KTsgZHN0ICs9IGRzdF9saW5lc2l6ZTsgc3JjICs9IHNyY19saW5lc2l6ZTsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHcpOyBkc3QgKz0gZHN0X2xpbmVzaXplOyBzcmMgKz0gc3JjX2xpbmVzaXplOworICAgIGZvciAoaiA9IDI7IGogPCBoIC0gMjsgaisrKSB7CisgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgZHN0WzFdID0gc3JjWzFdOworICAgICAgICBmb3IgKGkgPSAyOyBpIDwgdyAtIDI7IGkrKykgeworICAgICAgICAgICAgLyogR2F1c3NpYW4gbWFzayBvZiBzaXplIDV4NSB3aXRoIHNpZ21hID0gMS40ICovCisgICAgICAgICAgICBkc3RbaV0gPSAoKHNyY1stMipzcmNfbGluZXNpemUgKyBpLTJdICsgc3JjWzIqc3JjX2xpbmVzaXplICsgaS0yXSkgKiAyCisgICAgICAgICAgICAgICAgICAgICsgKHNyY1stMipzcmNfbGluZXNpemUgKyBpLTFdICsgc3JjWzIqc3JjX2xpbmVzaXplICsgaS0xXSkgKiA0CisgICAgICAgICAgICAgICAgICAgICsgKHNyY1stMipzcmNfbGluZXNpemUgKyBpICBdICsgc3JjWzIqc3JjX2xpbmVzaXplICsgaSAgXSkgKiA1CisgICAgICAgICAgICAgICAgICAgICsgKHNyY1stMipzcmNfbGluZXNpemUgKyBpKzFdICsgc3JjWzIqc3JjX2xpbmVzaXplICsgaSsxXSkgKiA0CisgICAgICAgICAgICAgICAgICAgICsgKHNyY1stMipzcmNfbGluZXNpemUgKyBpKzJdICsgc3JjWzIqc3JjX2xpbmVzaXplICsgaSsyXSkgKiAyCisKKyAgICAgICAgICAgICAgICAgICAgKyAoc3JjWyAgLXNyY19saW5lc2l6ZSArIGktMl0gKyBzcmNbICBzcmNfbGluZXNpemUgKyBpLTJdKSAqICA0CisgICAgICAgICAgICAgICAgICAgICsgKHNyY1sgIC1zcmNfbGluZXNpemUgKyBpLTFdICsgc3JjWyAgc3JjX2xpbmVzaXplICsgaS0xXSkgKiAgOQorICAgICAgICAgICAgICAgICAgICArIChzcmNbICAtc3JjX2xpbmVzaXplICsgaSAgXSArIHNyY1sgIHNyY19saW5lc2l6ZSArIGkgIF0pICogMTIKKyAgICAgICAgICAgICAgICAgICAgKyAoc3JjWyAgLXNyY19saW5lc2l6ZSArIGkrMV0gKyBzcmNbICBzcmNfbGluZXNpemUgKyBpKzFdKSAqICA5CisgICAgICAgICAgICAgICAgICAgICsgKHNyY1sgIC1zcmNfbGluZXNpemUgKyBpKzJdICsgc3JjWyAgc3JjX2xpbmVzaXplICsgaSsyXSkgKiAgNAorCisgICAgICAgICAgICAgICAgICAgICsgc3JjW2ktMl0gKiAgNQorICAgICAgICAgICAgICAgICAgICArIHNyY1tpLTFdICogMTIKKyAgICAgICAgICAgICAgICAgICAgKyBzcmNbaSAgXSAqIDE1CisgICAgICAgICAgICAgICAgICAgICsgc3JjW2krMV0gKiAxMgorICAgICAgICAgICAgICAgICAgICArIHNyY1tpKzJdICogIDUpIC8gMTU5OworICAgICAgICB9CisgICAgICAgIGRzdFtpICAgIF0gPSBzcmNbaSAgICBdOworICAgICAgICBkc3RbaSArIDFdID0gc3JjW2kgKyAxXTsKKworICAgICAgICBkc3QgKz0gZHN0X2xpbmVzaXplOworICAgICAgICBzcmMgKz0gc3JjX2xpbmVzaXplOworICAgIH0KKyAgICBtZW1jcHkoZHN0LCBzcmMsIHcpOyBkc3QgKz0gZHN0X2xpbmVzaXplOyBzcmMgKz0gc3JjX2xpbmVzaXplOworICAgIG1lbWNweShkc3QsIHNyYywgdyk7Cit9CisKK2VudW0geworICAgIERJUkVDVElPTl80NVVQLAorICAgIERJUkVDVElPTl80NURPV04sCisgICAgRElSRUNUSU9OX0hPUklaT05UQUwsCisgICAgRElSRUNUSU9OX1ZFUlRJQ0FMLAorfTsKKworc3RhdGljIGludCBnZXRfcm91bmRlZF9kaXJlY3Rpb24oaW50IGd4LCBpbnQgZ3kpCit7CisgICAgLyogcmVmZXJlbmNlIGFuZ2xlczoKKyAgICAgKiAgIHRhbiggcGkvOCkgPSBzcXJ0KDIpLTEKKyAgICAgKiAgIHRhbigzcGkvOCkgPSBzcXJ0KDIpKzEKKyAgICAgKiBHeS9HeCBpcyB0aGUgdGFuZ2VudCBvZiB0aGUgYW5nbGUgKHRoZXRhKSwgc28gR3kvR3ggaXMgY29tcGFyZWQgYWdhaW5zdAorICAgICAqIDxyZWYtYW5nbGU+LCBvciBtb3JlIHNpbXBseSBHeSBhZ2FpbnN0IDxyZWYtYW5nbGU+Kkd4CisgICAgICoKKyAgICAgKiBHeCBhbmQgR3kgYm91bmRzID0gWy0xMDIwOzEwMjBdLCB1c2luZyAxNi1iaXQgYXJpdGhtZXRpYzoKKyAgICAgKiAgIHJvdW5kKChzcXJ0KDIpLTEpICogKDE8PDE2KSkgPSAgMjcxNDYKKyAgICAgKiAgIHJvdW5kKChzcXJ0KDIpKzEpICogKDE8PDE2KSkgPSAxNTgyMTgKKyAgICAgKi8KKyAgICBpZiAoZ3gpIHsKKyAgICAgICAgaW50IHRhbnBpOGd4LCB0YW4zcGk4Z3g7CisKKyAgICAgICAgaWYgKGd4IDwgMCkKKyAgICAgICAgICAgIGd4ID0gLWd4LCBneSA9IC1neTsKKyAgICAgICAgZ3kgPDw9IDE2OworICAgICAgICB0YW5waThneCAgPSAgMjcxNDYgKiBneDsKKyAgICAgICAgdGFuM3BpOGd4ID0gMTU4MjE4ICogZ3g7CisgICAgICAgIGlmIChneSA+IC10YW4zcGk4Z3ggJiYgZ3kgPCAtdGFucGk4Z3gpICByZXR1cm4gRElSRUNUSU9OXzQ1VVA7CisgICAgICAgIGlmIChneSA+IC10YW5waThneCAgJiYgZ3kgPCAgdGFucGk4Z3gpICByZXR1cm4gRElSRUNUSU9OX0hPUklaT05UQUw7CisgICAgICAgIGlmIChneSA+ICB0YW5waThneCAgJiYgZ3kgPCAgdGFuM3BpOGd4KSByZXR1cm4gRElSRUNUSU9OXzQ1RE9XTjsKKyAgICB9CisgICAgcmV0dXJuIERJUkVDVElPTl9WRVJUSUNBTDsKK30KKworc3RhdGljIHZvaWQgc29iZWwoaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqZGlyLCBpbnQgZGlyX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChqID0gMTsgaiA8IGggLSAxOyBqKyspIHsKKyAgICAgICAgZHN0ICs9IGRzdF9saW5lc2l6ZTsKKyAgICAgICAgZGlyICs9IGRpcl9saW5lc2l6ZTsKKyAgICAgICAgc3JjICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IHcgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBneCA9CisgICAgICAgICAgICAgICAgLTEqc3JjWy1zcmNfbGluZXNpemUgKyBpLTFdICsgMSpzcmNbLXNyY19saW5lc2l6ZSArIGkrMV0KKyAgICAgICAgICAgICAgICAtMipzcmNbICAgICAgICAgICAgICAgIGktMV0gKyAyKnNyY1sgICAgICAgICAgICAgICAgaSsxXQorICAgICAgICAgICAgICAgIC0xKnNyY1sgc3JjX2xpbmVzaXplICsgaS0xXSArIDEqc3JjWyBzcmNfbGluZXNpemUgKyBpKzFdOworICAgICAgICAgICAgY29uc3QgaW50IGd5ID0KKyAgICAgICAgICAgICAgICAtMSpzcmNbLXNyY19saW5lc2l6ZSArIGktMV0gKyAxKnNyY1sgc3JjX2xpbmVzaXplICsgaS0xXQorICAgICAgICAgICAgICAgIC0yKnNyY1stc3JjX2xpbmVzaXplICsgaSAgXSArIDIqc3JjWyBzcmNfbGluZXNpemUgKyBpICBdCisgICAgICAgICAgICAgICAgLTEqc3JjWy1zcmNfbGluZXNpemUgKyBpKzFdICsgMSpzcmNbIHNyY19saW5lc2l6ZSArIGkrMV07CisKKyAgICAgICAgICAgIGRzdFtpXSA9IEZGQUJTKGd4KSArIEZGQUJTKGd5KTsKKyAgICAgICAgICAgIGRpcltpXSA9IGdldF9yb3VuZGVkX2RpcmVjdGlvbihneCwgZ3kpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBub25fbWF4aW11bV9zdXBwcmVzc2lvbihpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgIGludDhfdCAgKmRpciwgaW50IGRpcl9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMsIGludCBzcmNfbGluZXNpemUpCit7CisgICAgaW50IGksIGo7CisKKyNkZWZpbmUgQ09QWV9NQVhJTUEoYXksIGF4LCBieSwgYngpIGRvIHsgICAgICAgICAgICAgICAgXAorICAgIGlmIChzcmNbaV0gPiBzcmNbKGF5KSpzcmNfbGluZXNpemUgKyBpKyhheCldICYmICAgICBcCisgICAgICAgIHNyY1tpXSA+IHNyY1soYnkpKnNyY19saW5lc2l6ZSArIGkrKGJ4KV0pICAgICAgIFwKKyAgICAgICAgZHN0W2ldID0gYXZfY2xpcF91aW50OChzcmNbaV0pOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworICAgIGZvciAoaiA9IDE7IGogPCBoIC0gMTsgaisrKSB7CisgICAgICAgIGRzdCArPSBkc3RfbGluZXNpemU7CisgICAgICAgIGRpciArPSBkaXJfbGluZXNpemU7CisgICAgICAgIHNyYyArPSBzcmNfbGluZXNpemU7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCB3IC0gMTsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGRpcltpXSkgeworICAgICAgICAgICAgY2FzZSBESVJFQ1RJT05fNDVVUDogICAgICAgIENPUFlfTUFYSU1BKCAxLCAtMSwgLTEsICAxKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJUkVDVElPTl80NURPV046ICAgICAgQ09QWV9NQVhJTUEoLTEsIC0xLCAgMSwgIDEpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElSRUNUSU9OX0hPUklaT05UQUw6ICBDT1BZX01BWElNQSggMCwgLTEsICAwLCAgMSk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBESVJFQ1RJT05fVkVSVElDQUw6ICAgIENPUFlfTUFYSU1BKC0xLCAgMCwgIDEsICAwKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRvdWJsZV90aHJlc2hvbGQoaW50IGxvdywgaW50IGhpZ2gsIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGluZXNpemUpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzcmNbaV0gPiBoaWdoKSB7CisgICAgICAgICAgICAgICAgZHN0W2ldID0gc3JjW2ldOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKCFpIHx8IGkgPT0gdyAtIDEgfHwgIWogfHwgaiA9PSBoIC0gMSkgJiYKKyAgICAgICAgICAgICAgICBzcmNbaV0gPiBsb3cgJiYKKyAgICAgICAgICAgICAgICAoc3JjWy1zcmNfbGluZXNpemUgKyBpLTFdID4gaGlnaCB8fAorICAgICAgICAgICAgICAgICBzcmNbLXNyY19saW5lc2l6ZSArIGkgIF0gPiBoaWdoIHx8CisgICAgICAgICAgICAgICAgIHNyY1stc3JjX2xpbmVzaXplICsgaSsxXSA+IGhpZ2ggfHwKKyAgICAgICAgICAgICAgICAgc3JjWyAgICAgICAgICAgICAgICBpLTFdID4gaGlnaCB8fAorICAgICAgICAgICAgICAgICBzcmNbICAgICAgICAgICAgICAgIGkrMV0gPiBoaWdoIHx8CisgICAgICAgICAgICAgICAgIHNyY1sgc3JjX2xpbmVzaXplICsgaS0xXSA+IGhpZ2ggfHwKKyAgICAgICAgICAgICAgICAgc3JjWyBzcmNfbGluZXNpemUgKyBpICBdID4gaGlnaCB8fAorICAgICAgICAgICAgICAgICBzcmNbIHNyY19saW5lc2l6ZSArIGkrMV0gPiBoaWdoKSkKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBzcmNbaV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZHN0W2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gZHN0X2xpbmVzaXplOworICAgICAgICBzcmMgKz0gc3JjX2xpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29sb3JfbWl4KGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChqID0gMDsgaiA8IGg7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKQorICAgICAgICAgICAgZHN0W2ldID0gKGRzdFtpXSArIHNyY1tpXSkgPj4gMTsKKyAgICAgICAgZHN0ICs9IGRzdF9saW5lc2l6ZTsKKyAgICAgICAgc3JjICs9IHNyY19saW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEVkZ2VEZXRlY3RDb250ZXh0ICplZGdlZGV0ZWN0ID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBpbnQgcCwgZGlyZWN0ID0gMDsKKyAgICBBVkZyYW1lICpvdXQ7CisKKyAgICBpZiAoZWRnZWRldGVjdC0+bW9kZSAhPSBNT0RFX0NPTE9STUlYICYmIGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgeworICAgICAgICBkaXJlY3QgPSAxOworICAgICAgICBvdXQgPSBpbjsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0KKworICAgIGZvciAocCA9IDA7IHAgPCBlZGdlZGV0ZWN0LT5uYl9wbGFuZXM7IHArKykgeworICAgICAgICBzdHJ1Y3QgcGxhbmVfaW5mbyAqcGxhbmUgPSAmZWRnZWRldGVjdC0+cGxhbmVzW3BdOworICAgICAgICB1aW50OF90ICAqdG1wYnVmICAgICA9IHBsYW5lLT50bXBidWY7CisgICAgICAgIHVpbnQxNl90ICpncmFkaWVudHMgID0gcGxhbmUtPmdyYWRpZW50czsKKyAgICAgICAgaW50OF90ICAgKmRpcmVjdGlvbnMgPSBwbGFuZS0+ZGlyZWN0aW9uczsKKworICAgICAgICAvKiBnYXVzc2lhbiBmaWx0ZXIgdG8gcmVkdWNlIG5vaXNlICAqLworICAgICAgICBnYXVzc2lhbl9ibHVyKGN0eCwgaW5saW5rLT53LCBpbmxpbmstPmgsCisgICAgICAgICAgICAgICAgICAgICAgdG1wYnVmLCAgICAgIGlubGluay0+dywKKyAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVtwXSwgaW4tPmxpbmVzaXplW3BdKTsKKworICAgICAgICAvKiBjb21wdXRlIHRoZSAxNi1iaXRzIGdyYWRpZW50cyBhbmQgZGlyZWN0aW9ucyBmb3IgdGhlIG5leHQgc3RlcCAqLworICAgICAgICBzb2JlbChpbmxpbmstPncsIGlubGluay0+aCwKKyAgICAgICAgICAgICAgZ3JhZGllbnRzLCBpbmxpbmstPncsCisgICAgICAgICAgICAgIGRpcmVjdGlvbnMsaW5saW5rLT53LAorICAgICAgICAgICAgICB0bXBidWYsICAgIGlubGluay0+dyk7CisKKyAgICAgICAgLyogbm9uX21heGltdW1fc3VwcHJlc3Npb24oKSB3aWxsIGFjdHVhbGx5IGtlZXAgJiBjbGlwIHdoYXQncyBuZWNlc3NhcnkgYW5kCisgICAgICAgICAqIGlnbm9yZSB0aGUgcmVzdCwgc28gd2UgbmVlZCBhIGNsZWFuIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgbWVtc2V0KHRtcGJ1ZiwgMCwgaW5saW5rLT53ICogaW5saW5rLT5oKTsKKyAgICAgICAgbm9uX21heGltdW1fc3VwcHJlc3Npb24oaW5saW5rLT53LCBpbmxpbmstPmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGJ1ZiwgICAgaW5saW5rLT53LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb25zLGlubGluay0+dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnRzLCBpbmxpbmstPncpOworCisgICAgICAgIC8qIGtlZXAgaGlnaCB2YWx1ZXMsIG9yIGxvdyB2YWx1ZXMgc3Vycm91bmRlZCBieSBoaWdoIHZhbHVlcyAqLworICAgICAgICBkb3VibGVfdGhyZXNob2xkKGVkZ2VkZXRlY3QtPmxvd191OCwgZWRnZWRldGVjdC0+aGlnaF91OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGFbcF0sIG91dC0+bGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdG1wYnVmLCAgICAgICBpbmxpbmstPncpOworCisgICAgICAgIGlmIChlZGdlZGV0ZWN0LT5tb2RlID09IE1PREVfQ09MT1JNSVgpIHsKKyAgICAgICAgICAgIGNvbG9yX21peChpbmxpbmstPncsIGlubGluay0+aCwKKyAgICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGFbcF0sIG91dC0+bGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgaW4tPmRhdGFbcF0sIGluLT5saW5lc2l6ZVtwXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWRpcmVjdCkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IHA7CisgICAgRWRnZURldGVjdENvbnRleHQgKmVkZ2VkZXRlY3QgPSBjdHgtPnByaXY7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgZWRnZWRldGVjdC0+bmJfcGxhbmVzOyBwKyspIHsKKyAgICAgICAgc3RydWN0IHBsYW5lX2luZm8gKnBsYW5lID0gJmVkZ2VkZXRlY3QtPnBsYW5lc1twXTsKKyAgICAgICAgYXZfZnJlZXAoJnBsYW5lLT50bXBidWYpOworICAgICAgICBhdl9mcmVlcCgmcGxhbmUtPmdyYWRpZW50cyk7CisgICAgICAgIGF2X2ZyZWVwKCZwbGFuZS0+ZGlyZWN0aW9ucyk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZWRnZWRldGVjdF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfcHJvcHMsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgIH0sCisgICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZWRnZWRldGVjdF9vdXRwdXRzW10gPSB7CisgICAgIHsKKyAgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgIH0sCisgICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9lZGdlZGV0ZWN0ID0geworICAgIC5uYW1lICAgICAgICAgID0gImVkZ2VkZXRlY3QiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRldGVjdCBhbmQgZHJhdyBlZGdlLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEVkZ2VEZXRlY3RDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gZWRnZWRldGVjdF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBlZGdlZGV0ZWN0X291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmZWRnZWRldGVjdF9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9lbGJnLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZWxiZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMDg4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZWxiZy5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogdmlkZW8gcXVhbnRpemVyIGZpbHRlciBiYXNlZCBvbiBFTEJHCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvZWxiZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYW5kb21fc2VlZC5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJkcmF3dXRpbHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IENvbG9yQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgQVZMRkcgbGZnOworICAgIHVuc2lnbmVkIGludCBsZmdfc2VlZDsKKyAgICBpbnQgbWF4X3N0ZXBzX25iOworICAgIGludCAqY29kZXdvcmQ7CisgICAgaW50IGNvZGV3b3JkX2xlbmd0aDsKKyAgICBpbnQgKmNvZGV3b3JkX2Nsb3Nlc3RfY29kZWJvb2tfaWR4czsKKyAgICBpbnQgKmNvZGVib29rOworICAgIGludCBjb2RlYm9va19sZW5ndGg7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhfZGVzYzsKKyAgICB1aW50OF90IHJnYmFfbWFwWzRdOworfSBFTEJHQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRUxCR0NvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZWxiZ19vcHRpb25zW10gPSB7CisgICAgeyAiY29kZWJvb2tfbGVuZ3RoIiwgInNldCBjb2RlYm9vayBsZW5ndGgiLCBPRkZTRVQoY29kZWJvb2tfbGVuZ3RoKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAyNTYgfSwgMSwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJsIiwgICAgICAgICAgICAgICAic2V0IGNvZGVib29rIGxlbmd0aCIsIE9GRlNFVChjb2RlYm9va19sZW5ndGgpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDI1NiB9LCAxLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgIm5iX3N0ZXBzIiwgInNldCBtYXggbnVtYmVyIG9mIHN0ZXBzIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWFwcGluZyIsIE9GRlNFVChtYXhfc3RlcHNfbmIpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMSwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJuIiwgICAgICAgICJzZXQgbWF4IG51bWJlciBvZiBzdGVwcyB1c2VkIHRvIGNvbXB1dGUgdGhlIG1hcHBpbmciLCBPRkZTRVQobWF4X3N0ZXBzX25iKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDEsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAic2VlZCIsICJzZXQgdGhlIHJhbmRvbSBzZWVkIiwgT0ZGU0VUKGxmZ19zZWVkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFVJTlQzMl9NQVgsIEZMQUdTIH0sCisgICAgeyAicyIsICAgICJzZXQgdGhlIHJhbmRvbSBzZWVkIiwgT0ZGU0VUKGxmZ19zZWVkKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSB9LCAtMSwgVUlOVDMyX01BWCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGVsYmcpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBFTEJHQ29udGV4dCAqZWxiZyA9IGN0eC0+cHJpdjsKKworICAgIGlmIChlbGJnLT5sZmdfc2VlZCA9PSAtMSkKKyAgICAgICAgZWxiZy0+bGZnX3NlZWQgPSBhdl9nZXRfcmFuZG9tX3NlZWQoKTsKKworICAgIGF2X2xmZ19pbml0KCZlbGJnLT5sZmcsIGVsYmctPmxmZ19zZWVkKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIFBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfQVJHQiwgQVZfUElYX0ZNVF9SR0JBLCBBVl9QSVhfRk1UX0FCR1IsIEFWX1BJWF9GTVRfQkdSQSwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9CR1IyNCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE5CX0NPTVBPTkVOVFMgMworCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEVMQkdDb250ZXh0ICplbGJnID0gY3R4LT5wcml2OworCisgICAgZWxiZy0+cGl4X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBlbGJnLT5jb2Rld29yZF9sZW5ndGggPSBpbmxpbmstPncgKiBpbmxpbmstPmg7CisgICAgZWxiZy0+Y29kZXdvcmQgPSBhdl9yZWFsbG9jX2YoZWxiZy0+Y29kZXdvcmQsIGVsYmctPmNvZGV3b3JkX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9DT01QT05FTlRTICogc2l6ZW9mKCplbGJnLT5jb2Rld29yZCkpOworICAgIGlmICghZWxiZy0+Y29kZXdvcmQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBlbGJnLT5jb2Rld29yZF9jbG9zZXN0X2NvZGVib29rX2lkeHMgPQorICAgICAgICBhdl9yZWFsbG9jX2YoZWxiZy0+Y29kZXdvcmRfY2xvc2VzdF9jb2RlYm9va19pZHhzLCBlbGJnLT5jb2Rld29yZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmVsYmctPmNvZGV3b3JkX2Nsb3Nlc3RfY29kZWJvb2tfaWR4cykpOworICAgIGlmICghZWxiZy0+Y29kZXdvcmRfY2xvc2VzdF9jb2RlYm9va19pZHhzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZWxiZy0+Y29kZWJvb2sgPSBhdl9yZWFsbG9jX2YoZWxiZy0+Y29kZWJvb2ssIGVsYmctPmNvZGVib29rX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9DT01QT05FTlRTICogc2l6ZW9mKCplbGJnLT5jb2RlYm9vaykpOworICAgIGlmICghZWxiZy0+Y29kZWJvb2spCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmZl9maWxsX3JnYmFfbWFwKGVsYmctPnJnYmFfbWFwLCBpbmxpbmstPmZvcm1hdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBSIDAKKyNkZWZpbmUgRyAxCisjZGVmaW5lIEIgMgorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgRUxCR0NvbnRleHQgKmVsYmcgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBpbnQgaSwgaiwgazsKKyAgICB1aW50OF90ICpwLCAqcDA7CisKKyAgICBjb25zdCB1aW50OF90IHJfaWR4ICA9IGVsYmctPnJnYmFfbWFwW1JdOworICAgIGNvbnN0IHVpbnQ4X3QgZ19pZHggID0gZWxiZy0+cmdiYV9tYXBbR107CisgICAgY29uc3QgdWludDhfdCBiX2lkeCAgPSBlbGJnLT5yZ2JhX21hcFtCXTsKKworICAgIC8qIGJ1aWxkIHRoZSBjb2Rld29yZCAqLworICAgIHAwID0gZnJhbWUtPmRhdGFbMF07CisgICAgayA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGlubGluay0+aDsgaSsrKSB7CisgICAgICAgIHAgPSBwMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGlubGluay0+dzsgaisrKSB7CisgICAgICAgICAgICBlbGJnLT5jb2Rld29yZFtrKytdID0gcFtyX2lkeF07CisgICAgICAgICAgICBlbGJnLT5jb2Rld29yZFtrKytdID0gcFtnX2lkeF07CisgICAgICAgICAgICBlbGJnLT5jb2Rld29yZFtrKytdID0gcFtiX2lkeF07CisgICAgICAgICAgICBwICs9IGVsYmctPnBpeF9kZXNjLT5uYl9jb21wb25lbnRzOworICAgICAgICB9CisgICAgICAgIHAwICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHRoZSBjb2RlYm9vayAqLworICAgIGF2cHJpdl9pbml0X2VsYmcoZWxiZy0+Y29kZXdvcmQsIE5CX0NPTVBPTkVOVFMsIGVsYmctPmNvZGV3b3JkX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIGVsYmctPmNvZGVib29rLCBlbGJnLT5jb2RlYm9va19sZW5ndGgsIGVsYmctPm1heF9zdGVwc19uYiwKKyAgICAgICAgICAgICAgICAgICAgIGVsYmctPmNvZGV3b3JkX2Nsb3Nlc3RfY29kZWJvb2tfaWR4cywgJmVsYmctPmxmZyk7CisgICAgYXZwcml2X2RvX2VsYmcoZWxiZy0+Y29kZXdvcmQsIE5CX0NPTVBPTkVOVFMsIGVsYmctPmNvZGV3b3JkX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICBlbGJnLT5jb2RlYm9vaywgZWxiZy0+Y29kZWJvb2tfbGVuZ3RoLCBlbGJnLT5tYXhfc3RlcHNfbmIsCisgICAgICAgICAgICAgICAgICAgZWxiZy0+Y29kZXdvcmRfY2xvc2VzdF9jb2RlYm9va19pZHhzLCAmZWxiZy0+bGZnKTsKKworICAgIC8qIGZpbGwgdGhlIG91dHB1dCB3aXRoIHRoZSBjb2RlYm9vayB2YWx1ZXMgKi8KKyAgICBwMCA9IGZyYW1lLT5kYXRhWzBdOworCisgICAgayA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGlubGluay0+aDsgaSsrKSB7CisgICAgICAgIHAgPSBwMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGlubGluay0+dzsgaisrKSB7CisgICAgICAgICAgICBpbnQgY2JfaWR4ID0gTkJfQ09NUE9ORU5UUyAqIGVsYmctPmNvZGV3b3JkX2Nsb3Nlc3RfY29kZWJvb2tfaWR4c1trKytdOworICAgICAgICAgICAgcFtyX2lkeF0gPSBlbGJnLT5jb2RlYm9va1tjYl9pZHhdOworICAgICAgICAgICAgcFtnX2lkeF0gPSBlbGJnLT5jb2RlYm9va1tjYl9pZHgrMV07CisgICAgICAgICAgICBwW2JfaWR4XSA9IGVsYmctPmNvZGVib29rW2NiX2lkeCsyXTsKKyAgICAgICAgICAgIHAgKz0gZWxiZy0+cGl4X2Rlc2MtPm5iX2NvbXBvbmVudHM7CisgICAgICAgIH0KKyAgICAgICAgcDAgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoaW5saW5rLT5kc3QtPm91dHB1dHNbMF0sIGZyYW1lKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRUxCR0NvbnRleHQgKmVsYmcgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmVlcCgmZWxiZy0+Y29kZWJvb2spOworICAgIGF2X2ZyZWVwKCZlbGJnLT5jb2Rld29yZCk7CisgICAgYXZfZnJlZXAoJmVsYmctPmNvZGV3b3JkX2Nsb3Nlc3RfY29kZWJvb2tfaWR4cyk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBlbGJnX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgICA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAubmVlZHNfd3JpdGFibGUgPSAxLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBlbGJnX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9lbGJnID0geworICAgIC5uYW1lICAgICAgICAgID0gImVsYmciLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IHBvc3Rlcml6ZSBlZmZlY3QsIHVzaW5nIHRoZSBFTEJHIGFsZ29yaXRobS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihFTEJHQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmZWxiZ19jbGFzcywKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICAgID0gZWxiZ19pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBlbGJnX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2V4dHJhY3RwbGFuZXMuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9leHRyYWN0cGxhbmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkZDJkZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9leHRyYWN0cGxhbmVzLmMKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImRyYXd1dGlscy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgUExBTkVfUiAweDAxCisjZGVmaW5lIFBMQU5FX0cgMHgwMgorI2RlZmluZSBQTEFORV9CIDB4MDQKKyNkZWZpbmUgUExBTkVfQSAweDA4CisjZGVmaW5lIFBMQU5FX1kgMHgxMAorI2RlZmluZSBQTEFORV9VIDB4MjAKKyNkZWZpbmUgUExBTkVfViAweDQwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgcmVxdWVzdGVkX3BsYW5lczsKKyAgICBpbnQgbWFwWzRdOworICAgIGludCBsaW5lc2l6ZVs0XTsKKyAgICBpbnQgaXNfcGFja2VkX3JnYjsKKyAgICBpbnQgZGVwdGg7CisgICAgaW50IHN0ZXA7Cit9IEV4dHJhY3RQbGFuZXNDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihFeHRyYWN0UGxhbmVzQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZXh0cmFjdHBsYW5lc19vcHRpb25zW10gPSB7CisgICAgeyAicGxhbmVzIiwgInNldCBwbGFuZXMiLCAgT0ZGU0VUKHJlcXVlc3RlZF9wbGFuZXMpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQ9MX0sIDEsIDB4ZmYsIEZMQUdTLCAiZmxhZ3MifSwKKyAgICB7ICAgICAgInkiLCAic2V0IGx1bWEgcGxhbmUiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVBMQU5FX1l9LCAwLCAwLCBGTEFHUywgImZsYWdzIn0sCisgICAgeyAgICAgICJ1IiwgInNldCB1IHBsYW5lIiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1QTEFORV9VfSwgMCwgMCwgRkxBR1MsICJmbGFncyJ9LAorICAgIHsgICAgICAidiIsICJzZXQgdiBwbGFuZSIsICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UExBTkVfVn0sIDAsIDAsIEZMQUdTLCAiZmxhZ3MifSwKKyAgICB7ICAgICAgInIiLCAic2V0IHJlZCBwbGFuZSIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVBMQU5FX1J9LCAwLCAwLCBGTEFHUywgImZsYWdzIn0sCisgICAgeyAgICAgICJnIiwgInNldCBncmVlbiBwbGFuZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1QTEFORV9HfSwgMCwgMCwgRkxBR1MsICJmbGFncyJ9LAorICAgIHsgICAgICAiYiIsICJzZXQgYmx1ZSBwbGFuZSIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UExBTkVfQn0sIDAsIDAsIEZMQUdTLCAiZmxhZ3MifSwKKyAgICB7ICAgICAgImEiLCAic2V0IGFscGhhIHBsYW5lIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVBMQU5FX0F9LCAwLCAwLCBGTEFHUywgImZsYWdzIn0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhleHRyYWN0cGxhbmVzKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgaW5fcGl4Zm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWQTQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQwUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNkxFLCBBVl9QSVhfRk1UX1lVVkE0MjBQMTZMRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTZCRSwgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2QkUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUDE2TEUsIEFWX1BJWF9GTVRfWVVWQTQyMlAxNkxFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxNkJFLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTZCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTZMRSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2TEUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE2QkUsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNkJFLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX0dSQVk4QSwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZMTZMRSwgQVZfUElYX0ZNVF9HUkFZMTZCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9CR1IyNCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0JBLCBBVl9QSVhfRk1UX0JHUkEsCisgICAgICAgIEFWX1BJWF9GTVRfQVJHQiwgQVZfUElYX0ZNVF9BQkdSLAorICAgICAgICBBVl9QSVhfRk1UX1JHQjQ4TEUsIEFWX1BJWF9GTVRfQkdSNDhMRSwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0I0OEJFLCBBVl9QSVhfRk1UX0JHUjQ4QkUsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQTY0TEUsIEFWX1BJWF9GTVRfQkdSQTY0TEUsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQTY0QkUsIEFWX1BJWF9GTVRfQkdSQTY0QkUsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJBUCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTZMRSwgQVZfUElYX0ZNVF9HQlJQMTZCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJBUDE2TEUsIEFWX1BJWF9GTVRfR0JSQVAxNkJFLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUsCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dDhfcGl4Zm10c1tdID0geyBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX05PTkUgfTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dDE2bGVfcGl4Zm10c1tdID0geyBBVl9QSVhfRk1UX0dSQVkxNkxFLCBBVl9QSVhfRk1UX05PTkUgfTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dDE2YmVfcGl4Zm10c1tdID0geyBBVl9QSVhfRk1UX0dSQVkxNkJFLCBBVl9QSVhfRk1UX05PTkUgfTsKKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKm91dF9waXhmbXRzOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmF2ZmY7CisgICAgaW50IGksIGRlcHRoID0gMCwgYmUgPSAwOworCisgICAgaWYgKCFjdHgtPmlucHV0c1swXS0+aW5fZm9ybWF0cyB8fAorICAgICAgICAhY3R4LT5pbnB1dHNbMF0tPmluX2Zvcm1hdHMtPm5iX2Zvcm1hdHMpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKKyAgICBpZiAoIWN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cykKKyAgICAgICAgZmZfZm9ybWF0c19yZWYoZmZfbWFrZV9mb3JtYXRfbGlzdChpbl9waXhmbXRzKSwgJmN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cyk7CisKKyAgICBhdmZmID0gY3R4LT5pbnB1dHNbMF0tPmluX2Zvcm1hdHM7CisgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZmZi0+Zm9ybWF0c1swXSk7CisgICAgZGVwdGggPSBkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMTsKKyAgICBiZSA9IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFOworICAgIGZvciAoaSA9IDE7IGkgPCBhdmZmLT5uYl9mb3JtYXRzOyBpKyspIHsKKyAgICAgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZmZi0+Zm9ybWF0c1tpXSk7CisgICAgICAgIGlmIChkZXB0aCAhPSBkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSB8fAorICAgICAgICAgICAgYmUgICAgIT0gKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKSkgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkZXB0aCA9PSA3KQorICAgICAgICBvdXRfcGl4Zm10cyA9IG91dDhfcGl4Zm10czsKKyAgICBlbHNlIGlmIChiZSkKKyAgICAgICAgb3V0X3BpeGZtdHMgPSBvdXQxNmJlX3BpeGZtdHM7CisgICAgZWxzZQorICAgICAgICBvdXRfcGl4Zm10cyA9IG91dDE2bGVfcGl4Zm10czsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX291dHB1dHM7IGkrKykKKyAgICAgICAgZmZfZm9ybWF0c19yZWYoZmZfbWFrZV9mb3JtYXRfbGlzdChvdXRfcGl4Zm10cyksICZjdHgtPm91dHB1dHNbaV0tPmluX2Zvcm1hdHMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEV4dHJhY3RQbGFuZXNDb250ZXh0ICplID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCBwbGFuZV9hdmFpbCwgcmV0LCBpOworICAgIHVpbnQ4X3QgcmdiYV9tYXBbNF07CisKKyAgICBwbGFuZV9hdmFpbCA9ICgoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUkdCKSA/IFBMQU5FX1J8UExBTkVfR3xQTEFORV9CIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEFORV9ZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChkZXNjLT5uYl9jb21wb25lbnRzID4gMikgPyBQTEFORV9VfFBMQU5FX1YgOiAwKSkgfAorICAgICAgICAgICAgICAgICAgKChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSkgPyBQTEFORV9BIDogMCk7CisgICAgaWYgKGUtPnJlcXVlc3RlZF9wbGFuZXMgJiB+cGxhbmVfYXZhaWwpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUmVxdWVzdGVkIHBsYW5lcyBub3QgYXZhaWxhYmxlLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMoZS0+bGluZXNpemUsIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBlLT5kZXB0aCA9IChkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSArIDEpID4+IDM7CisgICAgZS0+c3RlcCA9IGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoZGVzYykgPj4gMzsKKyAgICBlLT5pc19wYWNrZWRfcmdiID0gIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QTEFOQVIpOworICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpIHsKKyAgICAgICAgZmZfZmlsbF9yZ2JhX21hcChyZ2JhX21hcCwgaW5saW5rLT5mb3JtYXQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgZS0+bWFwW2ldID0gcmdiYV9tYXBbZS0+bWFwW2ldXTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIEV4dHJhY3RQbGFuZXNDb250ZXh0ICplID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGNvbnN0IGludCBvdXRwdXQgPSBvdXRsaW5rLT5zcmNwYWQgLSBjdHgtPm91dHB1dF9wYWRzOworCisgICAgaWYgKGUtPm1hcFtvdXRwdXRdID09IDEgfHwgZS0+bWFwW291dHB1dF0gPT0gMikgeworICAgICAgICBvdXRsaW5rLT5oID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICAgICAgb3V0bGluay0+dyA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+dywgZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4dHJhY3RfZnJvbV9wYWNrZWQodWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoLCBpbnQgc3RlcCwgaW50IGNvbXApCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgc3dpdGNoIChkZXB0aCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBzcmNbeCAqIHN0ZXAgKyBjb21wXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGRzdFt4ICogMiAgICBdID0gc3JjW3ggKiBzdGVwICsgY29tcCAqIDIgICAgXTsKKyAgICAgICAgICAgICAgICBkc3RbeCAqIDIgKyAxXSA9IHNyY1t4ICogc3RlcCArIGNvbXAgKiAyICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gZHN0X2xpbmVzaXplOworICAgICAgICBzcmMgKz0gc3JjX2xpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgRXh0cmFjdFBsYW5lc0NvbnRleHQgKmUgPSBjdHgtPnByaXY7CisgICAgaW50IGksIGVvZiA9IDAsIHJldCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9vdXRwdXRzOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzW2ldOworICAgICAgICBjb25zdCBpbnQgaWR4ID0gZS0+bWFwW2ldOworICAgICAgICBBVkZyYW1lICpvdXQ7CisKKyAgICAgICAgaWYgKG91dGxpbmstPmNsb3NlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgZnJhbWUpOworCisgICAgICAgIGlmIChlLT5pc19wYWNrZWRfcmdiKSB7CisgICAgICAgICAgICBleHRyYWN0X2Zyb21fcGFja2VkKG91dC0+ZGF0YVswXSwgb3V0LT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF0sIGZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+dywgb3V0bGluay0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPnN0ZXAsIGlkeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKG91dC0+ZGF0YVswXSwgb3V0LT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbaWR4XSwgZnJhbWUtPmxpbmVzaXplW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPmxpbmVzaXplW2lkeF0sIG91dGxpbmstPmgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICBlb2YrKzsKKyAgICAgICAgZWxzZSBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisKKyAgICBpZiAoZW9mID09IGN0eC0+bmJfb3V0cHV0cykKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FT0Y7CisgICAgZWxzZSBpZiAocmV0ID09IEFWRVJST1JfRU9GKQorICAgICAgICByZXQgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEV4dHJhY3RQbGFuZXNDb250ZXh0ICplID0gY3R4LT5wcml2OworICAgIGludCBwbGFuZXMgPSAoZS0+cmVxdWVzdGVkX3BsYW5lcyAmIDB4ZikgfCAoZS0+cmVxdWVzdGVkX3BsYW5lcyA+PiA0KTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgY2hhciAqbmFtZTsKKyAgICAgICAgQVZGaWx0ZXJQYWQgcGFkID0geyAwIH07CisKKyAgICAgICAgaWYgKCEocGxhbmVzICYgKDEgPDwgaSkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbmFtZSA9IGF2X2FzcHJpbnRmKCJvdXQlZCIsIGN0eC0+bmJfb3V0cHV0cyk7CisgICAgICAgIGlmICghbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGUtPm1hcFtjdHgtPm5iX291dHB1dHNdID0gaTsKKyAgICAgICAgcGFkLm5hbWUgPSBuYW1lOworICAgICAgICBwYWQudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgcGFkLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19vdXRwdXQ7CisKKyAgICAgICAgZmZfaW5zZXJ0X291dHBhZChjdHgsIGN0eC0+bmJfb3V0cHV0cywgJnBhZCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfb3V0cHV0czsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmY3R4LT5vdXRwdXRfcGFkc1tpXS5uYW1lKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGV4dHJhY3RwbGFuZXNfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2V4dHJhY3RwbGFuZXMgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiZXh0cmFjdHBsYW5lcyIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRXh0cmFjdCBwbGFuZXMgYXMgZ3JheXNjYWxlIGZyYW1lcy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihFeHRyYWN0UGxhbmVzQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmZXh0cmFjdHBsYW5lc19jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gZXh0cmFjdHBsYW5lc19pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBOVUxMLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX09VVFBVVFMsCit9OworCisjaWYgQ09ORklHX0FMUEhBRVhUUkFDVF9GSUxURVIKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXRfYWxwaGFleHRyYWN0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEV4dHJhY3RQbGFuZXNDb250ZXh0ICplID0gY3R4LT5wcml2OworCisgICAgZS0+cmVxdWVzdGVkX3BsYW5lcyA9IFBMQU5FX0E7CisKKyAgICByZXR1cm4gaW5pdChjdHgpOworfQorCitBVkZpbHRlciBmZl92Zl9hbHBoYWV4dHJhY3QgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFscGhhZXh0cmFjdCIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkV4dHJhY3QgYW4gYWxwaGEgY2hhbm5lbCBhcyBhICIKKyAgICAgICAgICAgICAgICAgICAgICAiZ3JheXNjYWxlIGltYWdlIGNvbXBvbmVudC4iKSwKKyAgICAucHJpdl9zaXplICAgICAgPSBzaXplb2YoRXh0cmFjdFBsYW5lc0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGluaXRfYWxwaGFleHRyYWN0LAorICAgIC51bmluaXQgICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyAgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgICA9IGV4dHJhY3RwbGFuZXNfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgICA9IE5VTEwsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX09VVFBVVFMsCit9OworI2VuZGlmICAvKiBDT05GSUdfQUxQSEFFWFRSQUNUX0ZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2ZhZGUuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9mYWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjZTc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9mYWRlLmMKQEAgLTAsMCArMSw0MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJhbmRvbiBNaW50ZXJuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQm9iYnkgQmluZ2hhbQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiB2aWRlbyBmYWRlIGZpbHRlcgorICogYmFzZWQgaGVhdmlseSBvbiB2Zl9uZWdhdGUuYyBieSBCb2JieSBCaW5naGFtCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworI2RlZmluZSBSIDAKKyNkZWZpbmUgRyAxCisjZGVmaW5lIEIgMgorI2RlZmluZSBBIDMKKworI2RlZmluZSBZIDAKKyNkZWZpbmUgVSAxCisjZGVmaW5lIFYgMgorCisjZGVmaW5lIEZBREVfSU4gIDAKKyNkZWZpbmUgRkFERV9PVVQgMQorCit0eXBlZGVmIHN0cnVjdCBGYWRlQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHR5cGU7CisgICAgaW50IGZhY3RvciwgZmFkZV9wZXJfZnJhbWU7CisgICAgaW50IHN0YXJ0X2ZyYW1lLCBuYl9mcmFtZXM7CisgICAgaW50IGhzdWIsIHZzdWIsIGJwcDsKKyAgICB1bnNpZ25lZCBpbnQgYmxhY2tfbGV2ZWwsIGJsYWNrX2xldmVsX3NjYWxlZDsKKyAgICB1aW50OF90IGlzX3BhY2tlZF9yZ2I7CisgICAgdWludDhfdCByZ2JhX21hcFs0XTsKKyAgICBpbnQgYWxwaGE7CisgICAgdWludDY0X3Qgc3RhcnRfdGltZSwgZHVyYXRpb247CisgICAgZW51bSB7VkZfRkFERV9XQUlUSU5HPTAsIFZGX0ZBREVfRkFESU5HLCBWRl9GQURFX0RPTkV9IGZhZGVfc3RhdGU7CisgICAgdWludDhfdCBjb2xvcl9yZ2JhWzRdOyAgLy8vPCBmYWRlIGNvbG9yCisgICAgaW50IGJsYWNrX2ZhZGU7ICAgICAgICAgLy8vPCBpZiBjb2xvcl9yZ2JhIGlzIGJsYWNrCit9IEZhZGVDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBGYWRlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPmZhZGVfcGVyX2ZyYW1lID0gKDEgPDwgMTYpIC8gcy0+bmJfZnJhbWVzOworICAgIHMtPmZhZGVfc3RhdGUgPSBWRl9GQURFX1dBSVRJTkc7CisKKyAgICBpZiAocy0+ZHVyYXRpb24gIT0gMCkgeworICAgICAgICAvLyBJZiBkdXJhdGlvbiAoc2Vjb25kcykgaXMgbm9uLXplcm8sIGFzc3VtZSB0aGF0IHdlIGFyZSBub3QgZmFkaW5nIGJhc2VkIG9uIGZyYW1lcworICAgICAgICBzLT5uYl9mcmFtZXMgPSAwOyAvLyBNb3N0bHkgdG8gY2xlYW4gdXAgbG9nZ2luZworICAgIH0KKworICAgIC8vIENob29zZSB3aGF0IHRvIGxvZy4gSWYgYm90aCB0aW1lLWJhc2VkIGFuZCBmcmFtZS1iYXNlZCBvcHRpb25zLCBib3RoIGxpbmVzIHdpbGwgYmUgaW4gdGhlIGxvZworICAgIGlmIChzLT5zdGFydF9mcmFtZSB8fCBzLT5uYl9mcmFtZXMpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAidHlwZTolcyBzdGFydF9mcmFtZTolZCBuYl9mcmFtZXM6JWQgYWxwaGE6JWRcbiIsCisgICAgICAgICAgICAgICBzLT50eXBlID09IEZBREVfSU4gPyAiaW4iIDogIm91dCIsIHMtPnN0YXJ0X2ZyYW1lLAorICAgICAgICAgICAgICAgcy0+bmJfZnJhbWVzLHMtPmFscGhhKTsKKyAgICB9CisgICAgaWYgKHMtPnN0YXJ0X3RpbWUgfHwgcy0+ZHVyYXRpb24pIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAidHlwZTolcyBzdGFydF90aW1lOiVmIGR1cmF0aW9uOiVmIGFscGhhOiVkXG4iLAorICAgICAgICAgICAgICAgcy0+dHlwZSA9PSBGQURFX0lOID8gImluIiA6ICJvdXQiLCAocy0+c3RhcnRfdGltZSAvIChkb3VibGUpQVZfVElNRV9CQVNFKSwKKyAgICAgICAgICAgICAgIChzLT5kdXJhdGlvbiAvIChkb3VibGUpQVZfVElNRV9CQVNFKSxzLT5hbHBoYSk7CisgICAgfQorCisgICAgcy0+YmxhY2tfZmFkZSA9ICFtZW1jbXAocy0+Y29sb3JfcmdiYSwgIlx4MDBceDAwXHgwMFx4ZmYiLCA0KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGNvbnN0IEZhZGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCAgQVZfUElYX0ZNVF9ZVVY0MjJQLCAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsICBBVl9QSVhfRk1UX1lVVjQxMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCMjQsICAgIEFWX1BJWF9GTVRfQkdSMjQsCisgICAgICAgIEFWX1BJWF9GTVRfQVJHQiwgICAgIEFWX1BJWF9GTVRfQUJHUiwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0JBLCAgICAgQVZfUElYX0ZNVF9CR1JBLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNfcmdiW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfUkdCMjQsICAgIEFWX1BJWF9GTVRfQkdSMjQsCisgICAgICAgIEFWX1BJWF9GTVRfQVJHQiwgICAgIEFWX1BJWF9GTVRfQUJHUiwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0JBLCAgICAgQVZfUElYX0ZNVF9CR1JBLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgaWYgKHMtPmJsYWNrX2ZhZGUpCisgICAgICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICBlbHNlCisgICAgICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHNfcmdiKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0YXRpYyBlbnVtIEFWUGl4ZWxGb3JtYXQgc3R1ZGlvX2xldmVsX3BpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCAgQVZfUElYX0ZNVF9ZVVY0MjJQLCAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfWVVWNDExUCwgIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBGYWRlQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4ZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworCisgICAgcy0+aHN1YiA9IHBpeGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgcy0+dnN1YiA9IHBpeGRlc2MtPmxvZzJfY2hyb21hX2g7CisKKyAgICBzLT5icHAgPSBhdl9nZXRfYml0c19wZXJfcGl4ZWwocGl4ZGVzYykgPj4gMzsKKyAgICBzLT5hbHBoYSAmPSAhIShwaXhkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSk7CisgICAgcy0+aXNfcGFja2VkX3JnYiA9IGZmX2ZpbGxfcmdiYV9tYXAocy0+cmdiYV9tYXAsIGlubGluay0+Zm9ybWF0KSA+PSAwOworCisgICAgLyogdXNlIENDSVI2MDEvNzA5IGJsYWNrIGxldmVsIGZvciBzdHVkaW8tbGV2ZWwgcGl4ZWwgbm9uLWFscGhhIGNvbXBvbmVudHMgKi8KKyAgICBzLT5ibGFja19sZXZlbCA9CisgICAgICAgICAgICBmZl9mbXRfaXNfaW4oaW5saW5rLT5mb3JtYXQsIHN0dWRpb19sZXZlbF9waXhfZm10cykgJiYgIXMtPmFscGhhID8gMTYgOiAwOworICAgIC8qIDMyNzY4ID0gMSA8PCAxNSwgaXQgaXMgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbgorICAgICAqIG9mIDAuNSBhbmQgaXMgZm9yIHJvdW5kaW5nLiAqLworICAgIHMtPmJsYWNrX2xldmVsX3NjYWxlZCA9IChzLT5ibGFja19sZXZlbCA8PCAxNikgKyAzMjc2ODsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmaWx0ZXJfcmdiKEZhZGVDb250ZXh0ICpzLCBjb25zdCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xpY2Vfc3RhcnQsIGludCBzbGljZV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX2FscGhhLCBpbnQgc3RlcCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBjb25zdCB1aW50OF90IHJfaWR4ICA9IHMtPnJnYmFfbWFwW1JdOworICAgIGNvbnN0IHVpbnQ4X3QgZ19pZHggID0gcy0+cmdiYV9tYXBbR107CisgICAgY29uc3QgdWludDhfdCBiX2lkeCAgPSBzLT5yZ2JhX21hcFtCXTsKKyAgICBjb25zdCB1aW50OF90IGFfaWR4ICA9IHMtPnJnYmFfbWFwW0FdOworICAgIGNvbnN0IHVpbnQ4X3QgKmMgPSBzLT5jb2xvcl9yZ2JhOworCisgICAgZm9yIChpID0gc2xpY2Vfc3RhcnQ7IGkgPCBzbGljZV9lbmQ7IGkrKykgeworICAgICAgICB1aW50OF90ICpwID0gZnJhbWUtPmRhdGFbMF0gKyBpICogZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZnJhbWUtPndpZHRoOyBqKyspIHsKKyNkZWZpbmUgSU5URVJQKGNfbmFtZSwgY19pZHgpIGF2X2NsaXBfdWludDgoKChjW2NfaWR4XTw8MTYpICsgKChpbnQpcFtjX25hbWVdIC0gKGludCljW2NfaWR4XSkgKiBzLT5mYWN0b3IgKyAoMTw8MTUpKSA+PiAxNikKKyAgICAgICAgICAgIHBbcl9pZHhdID0gSU5URVJQKHJfaWR4LCAwKTsKKyAgICAgICAgICAgIHBbZ19pZHhdID0gSU5URVJQKGdfaWR4LCAxKTsKKyAgICAgICAgICAgIHBbYl9pZHhdID0gSU5URVJQKGJfaWR4LCAyKTsKKyAgICAgICAgICAgIGlmIChkb19hbHBoYSkKKyAgICAgICAgICAgICAgICBwW2FfaWR4XSA9IElOVEVSUChhX2lkeCwgMyk7CisgICAgICAgICAgICBwICs9IHN0ZXA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX3NsaWNlX3JnYihBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX2pvYnMpCit7CisgICAgRmFkZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBhcmc7CisgICAgaW50IHNsaWNlX3N0YXJ0ID0gKGZyYW1lLT5oZWlnaHQgKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICBpbnQgc2xpY2VfZW5kICAgPSAoZnJhbWUtPmhlaWdodCAqIChqb2JucisxKSkgLyBuYl9qb2JzOworCisgICAgaWYgICAgICAocy0+YWxwaGEpICAgIGZpbHRlcl9yZ2IocywgZnJhbWUsIHNsaWNlX3N0YXJ0LCBzbGljZV9lbmQsIDEsIDQpOworICAgIGVsc2UgaWYgKHMtPmJwcCA9PSAzKSBmaWx0ZXJfcmdiKHMsIGZyYW1lLCBzbGljZV9zdGFydCwgc2xpY2VfZW5kLCAwLCAzKTsKKyAgICBlbHNlIGlmIChzLT5icHAgPT0gNCkgZmlsdGVyX3JnYihzLCBmcmFtZSwgc2xpY2Vfc3RhcnQsIHNsaWNlX2VuZCwgMCwgNCk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfc2xpY2VfbHVtYShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9qb2JzKQoreworICAgIEZhZGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKmZyYW1lID0gYXJnOworICAgIGludCBzbGljZV9zdGFydCA9IChmcmFtZS0+aGVpZ2h0ICogIGpvYm5yICAgKSAvIG5iX2pvYnM7CisgICAgaW50IHNsaWNlX2VuZCAgID0gKGZyYW1lLT5oZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IHNsaWNlX3N0YXJ0OyBpIDwgc2xpY2VfZW5kOyBpKyspIHsKKyAgICAgICAgdWludDhfdCAqcCA9IGZyYW1lLT5kYXRhWzBdICsgaSAqIGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGZyYW1lLT53aWR0aCAqIHMtPmJwcDsgaisrKSB7CisgICAgICAgICAgICAvKiBzLT5mYWN0b3IgaXMgdXNpbmcgMTYgbG93ZXItb3JkZXIgYml0cyBmb3IgZGVjaW1hbAorICAgICAgICAgICAgICogcGxhY2VzLiAzMjc2OCA9IDEgPDwgMTUsIGl0IGlzIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24KKyAgICAgICAgICAgICAqIG9mIDAuNSBhbmQgaXMgZm9yIHJvdW5kaW5nLiAqLworICAgICAgICAgICAgKnAgPSAoKCpwIC0gcy0+YmxhY2tfbGV2ZWwpICogcy0+ZmFjdG9yICsgcy0+YmxhY2tfbGV2ZWxfc2NhbGVkKSA+PiAxNjsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9zbGljZV9jaHJvbWEoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9qb2JzKQoreworICAgIEZhZGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKmZyYW1lID0gYXJnOworICAgIGludCBpLCBqLCBwbGFuZTsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBGRl9DRUlMX1JTSElGVChmcmFtZS0+d2lkdGgsIHMtPmhzdWIpOworICAgIGNvbnN0IGludCBoZWlnaHQ9IEZGX0NFSUxfUlNISUZUKGZyYW1lLT5oZWlnaHQsIHMtPnZzdWIpOworICAgIGludCBzbGljZV9zdGFydCA9IChoZWlnaHQgKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICBpbnQgc2xpY2VfZW5kICAgPSAoaGVpZ2h0ICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisKKyAgICBmb3IgKHBsYW5lID0gMTsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisgICAgICAgIGZvciAoaSA9IHNsaWNlX3N0YXJ0OyBpIDwgc2xpY2VfZW5kOyBpKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnAgPSBmcmFtZS0+ZGF0YVtwbGFuZV0gKyBpICogZnJhbWUtPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgLyogODQyMTM2NyA9ICgoMTI4IDw8IDEpICsgMSkgPDwgMTUuIEl0IGlzIGFuIGludGVnZXIKKyAgICAgICAgICAgICAgICAgKiByZXByZXNlbnRhdGlvbiBvZiAxMjguNS4gVGhlIC41IGlzIGZvciByb3VuZGluZworICAgICAgICAgICAgICAgICAqIHB1cnBvc2VzLiAqLworICAgICAgICAgICAgICAgICpwID0gKCgqcCAtIDEyOCkgKiBzLT5mYWN0b3IgKyA4NDIxMzY3KSA+PiAxNjsKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfc2xpY2VfYWxwaGEoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX2pvYnMpCit7CisgICAgRmFkZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBhcmc7CisgICAgaW50IHBsYW5lID0gcy0+aXNfcGFja2VkX3JnYiA/IDAgOiBBOworICAgIGludCBzbGljZV9zdGFydCA9IChmcmFtZS0+aGVpZ2h0ICogIGpvYm5yICAgKSAvIG5iX2pvYnM7CisgICAgaW50IHNsaWNlX2VuZCAgID0gKGZyYW1lLT5oZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IHNsaWNlX3N0YXJ0OyBpIDwgc2xpY2VfZW5kOyBpKyspIHsKKyAgICAgICAgdWludDhfdCAqcCA9IGZyYW1lLT5kYXRhW3BsYW5lXSArIGkgKiBmcmFtZS0+bGluZXNpemVbcGxhbmVdICsgcy0+aXNfcGFja2VkX3JnYipzLT5yZ2JhX21hcFtBXTsKKyAgICAgICAgaW50IHN0ZXAgPSBzLT5pc19wYWNrZWRfcmdiID8gNCA6IDE7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmcmFtZS0+d2lkdGg7IGorKykgeworICAgICAgICAgICAgLyogcy0+ZmFjdG9yIGlzIHVzaW5nIDE2IGxvd2VyLW9yZGVyIGJpdHMgZm9yIGRlY2ltYWwKKyAgICAgICAgICAgICAqIHBsYWNlcy4gMzI3NjggPSAxIDw8IDE1LCBpdCBpcyBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uCisgICAgICAgICAgICAgKiBvZiAwLjUgYW5kIGlzIGZvciByb3VuZGluZy4gKi8KKyAgICAgICAgICAgICpwID0gKCgqcCAtIHMtPmJsYWNrX2xldmVsKSAqIHMtPmZhY3RvciArIHMtPmJsYWNrX2xldmVsX3NjYWxlZCkgPj4gMTY7CisgICAgICAgICAgICBwICs9IHN0ZXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgRmFkZUNvbnRleHQgKnMgICAgICAgPSBjdHgtPnByaXY7CisgICAgZG91YmxlIGZyYW1lX3RpbWVzdGFtcCA9IGZyYW1lLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgPyAtMSA6IGZyYW1lLT5wdHMgKiBhdl9xMmQoaW5saW5rLT50aW1lX2Jhc2UpOworCisgICAgLy8gQ2FsY3VsYXRlIEZhZGUgYXNzdW1pbmcgdGhpcyBpcyBhIEZhZGUgSW4KKyAgICBpZiAocy0+ZmFkZV9zdGF0ZSA9PSBWRl9GQURFX1dBSVRJTkcpIHsKKyAgICAgICAgcy0+ZmFjdG9yPTA7CisgICAgICAgIGlmIChmcmFtZV90aW1lc3RhbXAgPj0gcy0+c3RhcnRfdGltZS8oZG91YmxlKUFWX1RJTUVfQkFTRQorICAgICAgICAgICAgJiYgaW5saW5rLT5mcmFtZV9jb3VudCA+PSBzLT5zdGFydF9mcmFtZSkgeworICAgICAgICAgICAgLy8gVGltZSB0byBzdGFydCBmYWRpbmcKKyAgICAgICAgICAgIHMtPmZhZGVfc3RhdGUgPSBWRl9GQURFX0ZBRElORzsKKworICAgICAgICAgICAgLy8gU2F2ZSBzdGFydCB0aW1lIGluIGNhc2Ugd2UgYXJlIHN0YXJ0aW5nIGJhc2VkIG9uIGZyYW1lcyBhbmQgZmFkaW5nIGJhc2VkIG9uIHRpbWUKKyAgICAgICAgICAgIGlmIChzLT5zdGFydF90aW1lID09IDAgJiYgcy0+c3RhcnRfZnJhbWUgIT0gMCkgeworICAgICAgICAgICAgICAgIHMtPnN0YXJ0X3RpbWUgPSBmcmFtZV90aW1lc3RhbXAqKGRvdWJsZSlBVl9USU1FX0JBU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNhdmUgc3RhcnQgZnJhbWUgaW4gY2FzZSB3ZSBhcmUgc3RhcnRpbmcgYmFzZWQgb24gdGltZSBhbmQgZmFkaW5nIGJhc2VkIG9uIGZyYW1lcworICAgICAgICAgICAgaWYgKHMtPnN0YXJ0X3RpbWUgIT0gMCAmJiBzLT5zdGFydF9mcmFtZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcy0+c3RhcnRfZnJhbWUgPSBpbmxpbmstPmZyYW1lX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5mYWRlX3N0YXRlID09IFZGX0ZBREVfRkFESU5HKSB7CisgICAgICAgIGlmIChzLT5kdXJhdGlvbiA9PSAwKSB7CisgICAgICAgICAgICAvLyBGYWRpbmcgYmFzZWQgb24gZnJhbWUgY291bnQKKyAgICAgICAgICAgIHMtPmZhY3RvciA9IChpbmxpbmstPmZyYW1lX2NvdW50IC0gcy0+c3RhcnRfZnJhbWUpICogcy0+ZmFkZV9wZXJfZnJhbWU7CisgICAgICAgICAgICBpZiAoaW5saW5rLT5mcmFtZV9jb3VudCA+IHMtPnN0YXJ0X2ZyYW1lICsgcy0+bmJfZnJhbWVzKSB7CisgICAgICAgICAgICAgICAgcy0+ZmFkZV9zdGF0ZSA9IFZGX0ZBREVfRE9ORTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRmFkaW5nIGJhc2VkIG9uIGR1cmF0aW9uCisgICAgICAgICAgICBzLT5mYWN0b3IgPSAoZnJhbWVfdGltZXN0YW1wIC0gcy0+c3RhcnRfdGltZS8oZG91YmxlKUFWX1RJTUVfQkFTRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChmbG9hdCkgVUlOVDE2X01BWCAvIChzLT5kdXJhdGlvbi8oZG91YmxlKUFWX1RJTUVfQkFTRSk7CisgICAgICAgICAgICBpZiAoZnJhbWVfdGltZXN0YW1wID4gcy0+c3RhcnRfdGltZS8oZG91YmxlKUFWX1RJTUVfQkFTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcy0+ZHVyYXRpb24vKGRvdWJsZSlBVl9USU1FX0JBU0UpIHsKKyAgICAgICAgICAgICAgICBzLT5mYWRlX3N0YXRlID0gVkZfRkFERV9ET05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5mYWRlX3N0YXRlID09IFZGX0ZBREVfRE9ORSkgeworICAgICAgICBzLT5mYWN0b3I9VUlOVDE2X01BWDsKKyAgICB9CisKKyAgICBzLT5mYWN0b3IgPSBhdl9jbGlwX3VpbnQxNihzLT5mYWN0b3IpOworCisgICAgLy8gSW52ZXJ0IGZhZGVfZmFjdG9yIGlmIEZhZGluZyBPdXQKKyAgICBpZiAocy0+dHlwZSA9PSBGQURFX09VVCkgeworICAgICAgICBzLT5mYWN0b3I9VUlOVDE2X01BWC1zLT5mYWN0b3I7CisgICAgfQorCisgICAgaWYgKHMtPmZhY3RvciA8IFVJTlQxNl9NQVgpIHsKKyAgICAgICAgaWYgKHMtPmFscGhhKSB7CisgICAgICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlX2FscGhhLCBmcmFtZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oZnJhbWUtPmhlaWdodCwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworICAgICAgICB9IGVsc2UgaWYgKHMtPmlzX3BhY2tlZF9yZ2IgJiYgIXMtPmJsYWNrX2ZhZGUpIHsKKyAgICAgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2VfcmdiLCBmcmFtZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oZnJhbWUtPmhlaWdodCwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogbHVtYSwgb3IgcmdiIHBsYW5lIGluIGNhc2Ugb2YgYmxhY2sgKi8KKyAgICAgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2VfbHVtYSwgZnJhbWUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGZyYW1lLT5oZWlnaHQsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKworICAgICAgICAgICAgaWYgKGZyYW1lLT5kYXRhWzFdICYmIGZyYW1lLT5kYXRhWzJdKSB7CisgICAgICAgICAgICAgICAgLyogY2hyb21hIHBsYW5lcyAqLworICAgICAgICAgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2VfY2hyb21hLCBmcmFtZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGZyYW1lLT5oZWlnaHQsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoaW5saW5rLT5kc3QtPm91dHB1dHNbMF0sIGZyYW1lKTsKK30KKworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGYWRlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBmYWRlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJ0eXBlIiwgIidpbicgb3IgJ291dCcgZm9yIGZhZGUtaW4vZmFkZS1vdXQiLCBPRkZTRVQodHlwZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gRkFERV9JTiB9LCBGQURFX0lOLCBGQURFX09VVCwgRkxBR1MsICJ0eXBlIiB9LAorICAgIHsgInQiLCAgICAiJ2luJyBvciAnb3V0JyBmb3IgZmFkZS1pbi9mYWRlLW91dCIsIE9GRlNFVCh0eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBGQURFX0lOIH0sIEZBREVfSU4sIEZBREVfT1VULCBGTEFHUywgInR5cGUiIH0sCisgICAgICAgIHsgImluIiwgICJmYWRlLWluIiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGQURFX0lOIH0sICAudW5pdCA9ICJ0eXBlIiB9LAorICAgICAgICB7ICJvdXQiLCAiZmFkZS1vdXQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRkFERV9PVVQgfSwgLnVuaXQgPSAidHlwZSIgfSwKKyAgICB7ICJzdGFydF9mcmFtZSIsICJOdW1iZXIgb2YgdGhlIGZpcnN0IGZyYW1lIHRvIHdoaWNoIHRvIGFwcGx5IHRoZSBlZmZlY3QuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3RhcnRfZnJhbWUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJzIiwgICAgICAgICAgICJOdW1iZXIgb2YgdGhlIGZpcnN0IGZyYW1lIHRvIHdoaWNoIHRvIGFwcGx5IHRoZSBlZmZlY3QuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3RhcnRfZnJhbWUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJuYl9mcmFtZXMiLCAgICJOdW1iZXIgb2YgZnJhbWVzIHRvIHdoaWNoIHRoZSBlZmZlY3Qgc2hvdWxkIGJlIGFwcGxpZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQobmJfZnJhbWVzKSwgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDI1IH0sIDAsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAibiIsICAgICAgICAgICAiTnVtYmVyIG9mIGZyYW1lcyB0byB3aGljaCB0aGUgZWZmZWN0IHNob3VsZCBiZSBhcHBsaWVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKG5iX2ZyYW1lcyksICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAyNSB9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgImFscGhhIiwgICAgICAgImZhZGUgYWxwaGEgaWYgaXQgaXMgYXZhaWxhYmxlIG9uIHRoZSBpbnB1dCIsIE9GRlNFVChhbHBoYSksICAgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwICAgIH0sIDAsICAgICAgIDEsIEZMQUdTIH0sCisgICAgeyAic3RhcnRfdGltZSIsICAiTnVtYmVyIG9mIHNlY29uZHMgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHN0YXJ0X3RpbWUpLCAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gMC4gfSwgMCwgSU5UMzJfTUFYLCBGTEFHUyB9LAorICAgIHsgInN0IiwgICAgICAgICAgIk51bWJlciBvZiBzZWNvbmRzIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVmZmVjdC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChzdGFydF90aW1lKSwgIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2NCA9IDAuIH0sIDAsIElOVDMyX01BWCwgRkxBR1MgfSwKKyAgICB7ICJkdXJhdGlvbiIsICAgICJEdXJhdGlvbiBvZiB0aGUgZWZmZWN0IGluIHNlY29uZHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZHVyYXRpb24pLCAgICBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQgPSAwLiB9LCAwLCBJTlQzMl9NQVgsIEZMQUdTIH0sCisgICAgeyAiZCIsICAgICAgICAgICAiRHVyYXRpb24gb2YgdGhlIGVmZmVjdCBpbiBzZWNvbmRzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGR1cmF0aW9uKSwgICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gMC4gfSwgMCwgSU5UMzJfTUFYLCBGTEFHUyB9LAorICAgIHsgImNvbG9yIiwgICAgICAgInNldCBjb2xvciIsICAgICAgICAgICAgICAgICAgIE9GRlNFVChjb2xvcl9yZ2JhKSwgIEFWX09QVF9UWVBFX0NPTE9SLCAgICB7LnN0ciA9ICJibGFjayJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiYyIsICAgICAgICAgICAic2V0IGNvbG9yIiwgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGNvbG9yX3JnYmEpLCAgQVZfT1BUX1RZUEVfQ09MT1IsICAgIHsuc3RyID0gImJsYWNrIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGZhZGUpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfZmFkZV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICAgPSBjb25maWdfcHJvcHMsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLm5lZWRzX3dyaXRhYmxlID0gMSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfZmFkZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfZmFkZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJmYWRlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGYWRlIGluL291dCBpbnB1dCB2aWRlby4iKSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRmFkZUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmZhZGVfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfdmZfZmFkZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl92Zl9mYWRlX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2ZpZWxkLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZmllbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDEyMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2ZpZWxkLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUmljaCBGZWxrZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGZpZWxkIGZpbHRlciwgYmFzZWQgb24gbGlibXBjb2RlY3MvdmZfZmllbGQuYyBieSBSaWNoIEZlbGtlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2VudW0gRmllbGRUeXBlIHsgRklFTERfVFlQRV9UT1AgPSAwLCBGSUVMRF9UWVBFX0JPVFRPTSB9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgZW51bSBGaWVsZFR5cGUgdHlwZTsKKyAgICBpbnQgbmJfcGxhbmVzOyAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgcGxhbmVzIG9mIHRoZSBjdXJyZW50IGZvcm1hdAorfSBGaWVsZENvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZpZWxkQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBmaWVsZF9vcHRpb25zW10gPSB7CisgICAgeyJ0eXBlIiwgInNldCBmaWVsZCB0eXBlICh0b3Agb3IgYm90dG9tKSIsIE9GRlNFVCh0eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1GSUVMRF9UWVBFX1RPUH0sIDAsIDEsIEZMQUdTLCAiZmllbGRfdHlwZSIgfSwKKyAgICB7InRvcCIsICAgICJzZWxlY3QgdG9wIGZpZWxkIiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZJRUxEX1RZUEVfVE9QfSwgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJmaWVsZF90eXBlIn0sCisgICAgeyJib3R0b20iLCAic2VsZWN0IGJvdHRvbSBmaWVsZCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GSUVMRF9UWVBFX0JPVFRPTX0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiZmllbGRfdHlwZSJ9LAorICAgIHtOVUxMfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGZpZWxkKTsKKworc3RhdGljIGludCBjb25maWdfcHJvcHNfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBGaWVsZENvbnRleHQgKmZpZWxkID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisKKyAgICBmaWVsZC0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMob3V0bGluay0+Zm9ybWF0KTsKKworICAgIG91dGxpbmstPncgPSBpbmxpbmstPnc7CisgICAgb3V0bGluay0+aCA9IChpbmxpbmstPmggKyAoZmllbGQtPnR5cGUgPT0gRklFTERfVFlQRV9UT1ApKSAvIDI7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgInc6JWQgaDolZCB0eXBlOiVzIC0+IHc6JWQgaDolZFxuIiwKKyAgICAgICAgICAgaW5saW5rLT53LCBpbmxpbmstPmgsIGZpZWxkLT50eXBlID09IEZJRUxEX1RZUEVfQk9UVE9NID8gImJvdHRvbSIgOiAidG9wIiwKKyAgICAgICAgICAgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnBpY3JlZikKK3sKKyAgICBGaWVsZENvbnRleHQgKmZpZWxkID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gaW5saW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgaW50IGk7CisKKyAgICBpbnBpY3JlZi0+aGVpZ2h0ID0gb3V0bGluay0+aDsKKyAgICBpbnBpY3JlZi0+aW50ZXJsYWNlZF9mcmFtZSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmllbGQtPm5iX3BsYW5lczsgaSsrKSB7CisgICAgICAgIGlmIChmaWVsZC0+dHlwZSA9PSBGSUVMRF9UWVBFX0JPVFRPTSkKKyAgICAgICAgICAgIGlucGljcmVmLT5kYXRhW2ldID0gaW5waWNyZWYtPmRhdGFbaV0gKyBpbnBpY3JlZi0+bGluZXNpemVbaV07CisgICAgICAgIGlucGljcmVmLT5saW5lc2l6ZVtpXSA9IDIgKiBpbnBpY3JlZi0+bGluZXNpemVbaV07CisgICAgfQorICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgaW5waWNyZWYpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZmllbGRfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBmaWVsZF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9maWVsZCA9IHsKKyAgICAubmFtZSAgICAgICAgPSAiZmllbGQiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJFeHRyYWN0IGEgZmllbGQgZnJvbSB0aGUgaW5wdXQgdmlkZW8uIiksCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKEZpZWxkQ29udGV4dCksCisgICAgLmlucHV0cyAgICAgID0gZmllbGRfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IGZpZWxkX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgID0gJmZpZWxkX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9maWVsZG1hdGNoLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZmllbGRtYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYWE2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZmllbGRtYXRjaC5jCkBAIC0wLDAgKzEsOTg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEZyZWRyaWsgTWVsbGJpbgorICogQ29weXJpZ2h0IChjKSAyMDEzIENsw6ltZW50IELFk3NjaAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBGaWVsZG1hdGNoaW5nIGZpbHRlciwgcG9ydGVkIGZyb20gVkZNIGZpbHRlciAoVmFwb3VTc3ludGgpIGJ5IENsw6ltZW50LgorICogRnJlZHJpayBNZWxsYmluIGlzIHRoZSBhdXRob3Igb2YgdGhlIFZJVlRDL1ZGTSBmaWx0ZXIsIHdoaWNoIGlzIGl0c2VsZiBhCisgKiBsaWdodCBjbG9uZSBvZiB0aGUgVElWVEMvVEZNIChBdmlTeW50aCkgZmlsdGVyIHdyaXR0ZW4gYnkgS2V2aW4gU3RvbmUKKyAqICh0cml0aWNhbCksIHRoZSBvcmlnaW5hbCBhdXRob3IuCisgKgorICogQHNlZSBodHRwOi8vYmVuZ2FsLm1pc3NvdXJpLmVkdS9+a2VzMjVjLworICogQHNlZSBodHRwOi8vd3d3LnZhcG91cnN5bnRoLmNvbS9hYm91dC8KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIElOUFVUX01BSU4gICAgIDAKKyNkZWZpbmUgSU5QVVRfQ0xFQU5TUkMgMQorCitlbnVtIGZpZWxkbWF0Y2hfcGFyaXR5IHsKKyAgICBGTV9QQVJJVFlfQVVUTyAgID0gLTEsCisgICAgRk1fUEFSSVRZX0JPVFRPTSA9ICAwLAorICAgIEZNX1BBUklUWV9UT1AgICAgPSAgMSwKK307CisKK2VudW0gbWF0Y2hpbmdfbW9kZSB7CisgICAgTU9ERV9QQywKKyAgICBNT0RFX1BDX04sCisgICAgTU9ERV9QQ19VLAorICAgIE1PREVfUENfTl9VQiwKKyAgICBNT0RFX1BDTiwKKyAgICBNT0RFX1BDTl9VQiwKKyAgICBOQl9NT0RFCit9OworCitlbnVtIGNvbWJfbWF0Y2hpbmdfbW9kZSB7CisgICAgQ09NQk1BVENIX05PTkUsCisgICAgQ09NQk1BVENIX1NDLAorICAgIENPTUJNQVRDSF9GVUxMLAorICAgIE5CX0NPTUJNQVRDSAorfTsKKworZW51bSBjb21iX2RiZyB7CisgICAgQ09NQkRCR19OT05FLAorICAgIENPTUJEQkdfUENOLAorICAgIENPTUJEQkdfUENOVUIsCisgICAgTkJfQ09NQkRCRworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgQVZGcmFtZSAqcHJ2LCAgKnNyYywgICpueHQ7ICAgICAvLy88IG1haW4gc2xpZGluZyB3aW5kb3cgb2YgMyBmcmFtZXMKKyAgICBBVkZyYW1lICpwcnYyLCAqc3JjMiwgKm54dDI7ICAgIC8vLzwgc2xpZGluZyB3aW5kb3cgb2YgdGhlIG9wdGlvbmFsIHNlY29uZCBzdHJlYW0KKyAgICBpbnQgZ290X2ZyYW1lWzJdOyAgICAgICAgICAgICAgIC8vLzwgZnJhbWUgcmVxdWVzdCBmbGFnIGZvciBlYWNoIGlucHV0IHN0cmVhbQorICAgIGludCBoc3ViLCB2c3ViOyAgICAgICAgICAgICAgICAgLy8vPCBjaHJvbWEgc3Vic2FtcGxpbmcgdmFsdWVzCisgICAgdWludDMyX3QgZW9mOyAgICAgICAgICAgICAgICAgICAvLy88IGJpdG1hc2sgZm9yIGVuZCBvZiBzdHJlYW0KKyAgICBpbnQ2NF90IGxhc3RzY2RpZmY7CisgICAgaW50NjRfdCBsYXN0bjsKKworICAgIC8qIG9wdGlvbnMgKi8KKyAgICBpbnQgb3JkZXI7CisgICAgaW50IHBwc3JjOworICAgIGVudW0gbWF0Y2hpbmdfbW9kZSBtb2RlOworICAgIGludCBmaWVsZDsKKyAgICBpbnQgbWNocm9tYTsKKyAgICBpbnQgeTAsIHkxOworICAgIGludDY0X3Qgc2N0aHJlc2g7CisgICAgZG91YmxlIHNjdGhyZXNoX2ZsdDsKKyAgICBlbnVtIGNvbWJfbWF0Y2hpbmdfbW9kZSBjb21ibWF0Y2g7CisgICAgaW50IGNvbWJkYmc7CisgICAgaW50IGN0aHJlc2g7CisgICAgaW50IGNocm9tYTsKKyAgICBpbnQgYmxvY2t4LCBibG9ja3k7CisgICAgaW50IGNvbWJwZWw7CisKKyAgICAvKiBtaXNjIGJ1ZmZlcnMgKi8KKyAgICB1aW50OF90ICptYXBfZGF0YVs0XTsKKyAgICBpbnQgbWFwX2xpbmVzaXplWzRdOworICAgIHVpbnQ4X3QgKmNtYXNrX2RhdGFbNF07CisgICAgaW50IGNtYXNrX2xpbmVzaXplWzRdOworICAgIGludCAqY19hcnJheTsKKyAgICBpbnQgdHBpdGNoeSwgdHBpdGNodXY7CisgICAgdWludDhfdCAqdGJ1ZmZlcjsKK30gRmllbGRNYXRjaENvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZpZWxkTWF0Y2hDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZpZWxkbWF0Y2hfb3B0aW9uc1tdID0geworICAgIHsgIm9yZGVyIiwgInNwZWNpZnkgdGhlIGFzc3VtZWQgZmllbGQgb3JkZXIiLCBPRkZTRVQob3JkZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUZNX1BBUklUWV9BVVRPfSwgLTEsIDEsIEZMQUdTLCAib3JkZXIiIH0sCisgICAgICAgIHsgImF1dG8iLCAiYXV0byBkZXRlY3QgcGFyaXR5IiwgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GTV9QQVJJVFlfQVVUT30sICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAib3JkZXIiIH0sCisgICAgICAgIHsgImJmZiIsICAiYXNzdW1lIGJvdHRvbSBmaWVsZCBmaXJzdCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GTV9QQVJJVFlfQk9UVE9NfSwgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAib3JkZXIiIH0sCisgICAgICAgIHsgInRmZiIsICAiYXNzdW1lIHRvcCBmaWVsZCBmaXJzdCIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GTV9QQVJJVFlfVE9QfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAib3JkZXIiIH0sCisgICAgeyAibW9kZSIsICJzZXQgdGhlIG1hdGNoaW5nIG1vZGUgb3Igc3RyYXRlZ3kgdG8gdXNlIiwgT0ZGU0VUKG1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PU1PREVfUENfTn0sIE1PREVfUEMsIE5CX01PREUtMSwgRkxBR1MsICJtb2RlIiB9LAorICAgICAgICB7ICJwYyIsICAgICAgIjItd2F5IG1hdGNoIChwL2MpIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT0RFX1BDfSwgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUiIH0sCisgICAgICAgIHsgInBjX24iLCAgICAiMi13YXkgbWF0Y2ggKyAzcmQgbWF0Y2ggb24gY29tYmVkIChwL2MgKyB1KSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU1PREVfUENfTn0sICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAicGNfdSIsICAgICIyLXdheSBtYXRjaCArIDNyZCBtYXRjaCAoc2FtZSBvcmRlcikgb24gY29tYmVkIChwL2MgKyB1KSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9QQ19VfSwgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtb2RlIiB9LAorICAgICAgICB7ICJwY19uX3ViIiwgIjItd2F5IG1hdGNoICsgM3JkIG1hdGNoIG9uIGNvbWJlZCArIDR0aC81dGggbWF0Y2hlcyBpZiBzdGlsbCBjb21iZWQgKHAvYyArIHUgKyB1L2IpIiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT0RFX1BDX05fVUJ9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUiIH0sCisgICAgICAgIHsgInBjbiIsICAgICAiMy13YXkgbWF0Y2ggKHAvYy9uKSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU1PREVfUENOfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAicGNuX3ViIiwgICIzLXdheSBtYXRjaCArIDR0aC81dGggbWF0Y2hlcyBvbiBjb21iZWQgKHAvYy9uICsgdS9iKSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9QQ05fVUJ9LCAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgInBwc3JjIiwgIm1hcmsgbWFpbiBpbnB1dCBhcyBhIHByZS1wcm9jZXNzZWQgaW5wdXQgYW5kIGFjdGl2YXRlIGNsZWFuIHNvdXJjZSBpbnB1dCBzdHJlYW0iLCBPRkZTRVQocHBzcmMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgImZpZWxkIiwgInNldCB0aGUgZmllbGQgdG8gbWF0Y2ggZnJvbSIsIE9GRlNFVChmaWVsZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Rk1fUEFSSVRZX0FVVE99LCAtMSwgMSwgRkxBR1MsICJmaWVsZCIgfSwKKyAgICAgICAgeyAiYXV0byIsICAgImF1dG9tYXRpYyAoc2FtZSB2YWx1ZSBhcyAnb3JkZXInKSIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GTV9QQVJJVFlfQVVUT30sICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiZmllbGQiIH0sCisgICAgICAgIHsgImJvdHRvbSIsICJib3R0b20gZmllbGQiLCAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Rk1fUEFSSVRZX0JPVFRPTX0sICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImZpZWxkIiB9LAorICAgICAgICB7ICJ0b3AiLCAgICAidG9wIGZpZWxkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZNX1BBUklUWV9UT1B9LCAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJmaWVsZCIgfSwKKyAgICB7ICJtY2hyb21hIiwgInNldCB3aGV0aGVyIG9yIG5vdCBjaHJvbWEgaXMgaW5jbHVkZWQgZHVyaW5nIHRoZSBtYXRjaCBjb21wYXJpc29ucyIsIE9GRlNFVChtY2hyb21hKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xfSwgMCwgMSwgIEZMQUdTIH0sCisgICAgeyAieTAiLCAiZGVmaW5lIGFuIGV4Y2x1c2lvbiBiYW5kIHdoaWNoIGV4Y2x1ZGVzIHRoZSBsaW5lcyBiZXR3ZWVuIHkwIGFuZCB5MSBmcm9tIHRoZSBmaWVsZCBtYXRjaGluZyBkZWNpc2lvbiIsIE9GRlNFVCh5MCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAieTEiLCAiZGVmaW5lIGFuIGV4Y2x1c2lvbiBiYW5kIHdoaWNoIGV4Y2x1ZGVzIHRoZSBsaW5lcyBiZXR3ZWVuIHkwIGFuZCB5MSBmcm9tIHRoZSBmaWVsZCBtYXRjaGluZyBkZWNpc2lvbiIsIE9GRlNFVCh5MSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAic2N0aHJlc2giLCAic2V0IHNjZW5lIGNoYW5nZSBkZXRlY3Rpb24gdGhyZXNob2xkIiwgT0ZGU0VUKHNjdGhyZXNoX2ZsdCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MTJ9LCAwLCAxMDAsIEZMQUdTIH0sCisgICAgeyAiY29tYm1hdGNoIiwgInNldCBjb21ibWF0Y2hpbmcgbW9kZSIsIE9GRlNFVChjb21ibWF0Y2gpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUNPTUJNQVRDSF9TQ30sIENPTUJNQVRDSF9OT05FLCBOQl9DT01CTUFUQ0gtMSwgRkxBR1MsICJjb21ibWF0Y2hpbmciIH0sCisgICAgICAgIHsgIm5vbmUiLCAiZGlzYWJsZSBjb21ibWF0Y2hpbmciLCAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1DT01CTUFUQ0hfTk9ORX0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiY29tYm1hdGNoaW5nIiB9LAorICAgICAgICB7ICJzYyIsICAgImVuYWJsZSBjb21ibWF0Y2hpbmcgb25seSBvbiBzY2VuZSBjaGFuZ2UiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q09NQk1BVENIX1NDfSwgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImNvbWJtYXRjaGluZyIgfSwKKyAgICAgICAgeyAiZnVsbCIsICJlbmFibGUgY29tYm1hdGNoaW5nIGFsbCB0aGUgdGltZSIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNPTUJNQVRDSF9GVUxMfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJjb21ibWF0Y2hpbmciIH0sCisgICAgeyAiY29tYmRiZyIsICAgImVuYWJsZSBjb21iIGRlYnVnIiwgT0ZGU0VUKGNvbWJkYmcpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUNPTUJEQkdfTk9ORX0sIENPTUJEQkdfTk9ORSwgTkJfQ09NQkRCRy0xLCBGTEFHUywgImRiZ2x2bCIgfSwKKyAgICAgICAgeyAibm9uZSIsICAibm8gZm9yY2VkIGNhbGN1bGF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNPTUJEQkdfTk9ORX0sICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImRiZ2x2bCIgfSwKKyAgICAgICAgeyAicGNuIiwgICAiY2FsY3VsYXRlIHAvYy9uIiwgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNPTUJEQkdfUENOfSwgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImRiZ2x2bCIgfSwKKyAgICAgICAgeyAicGNudWIiLCAiY2FsY3VsYXRlIHAvYy9uL3UvYiIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNPTUJEQkdfUENOVUJ9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImRiZ2x2bCIgfSwKKyAgICB7ICJjdGhyZXNoIiwgInNldCB0aGUgYXJlYSBjb21iaW5nIHRocmVzaG9sZCB1c2VkIGZvciBjb21iZWQgZnJhbWUgZGV0ZWN0aW9uIiwgICAgICAgT0ZGU0VUKGN0aHJlc2gpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PSA5fSwgLTEsIDB4ZmYsIEZMQUdTIH0sCisgICAgeyAiY2hyb21hIiwgICJzZXQgd2hldGhlciBvciBub3QgY2hyb21hIGlzIGNvbnNpZGVyZWQgaW4gdGhlIGNvbWJlZCBmcmFtZSBkZWNpc2lvbiIsIE9GRlNFVChjaHJvbWEpLCAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0gMH0sICAwLCAgICAxLCBGTEFHUyB9LAorICAgIHsgImJsb2NreCIsICAic2V0IHRoZSB4LWF4aXMgc2l6ZSBvZiB0aGUgd2luZG93IHVzZWQgZHVyaW5nIGNvbWJlZCBmcmFtZSBkZXRlY3Rpb24iLCBPRkZTRVQoYmxvY2t4KSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MTZ9LCAgNCwgMTw8OSwgRkxBR1MgfSwKKyAgICB7ICJibG9ja3kiLCAgInNldCB0aGUgeS1heGlzIHNpemUgb2YgdGhlIHdpbmRvdyB1c2VkIGR1cmluZyBjb21iZWQgZnJhbWUgZGV0ZWN0aW9uIiwgT0ZGU0VUKGJsb2NreSksICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTE2fSwgIDQsIDE8PDksIEZMQUdTIH0sCisgICAgeyAiY29tYnBlbCIsICJzZXQgdGhlIG51bWJlciBvZiBjb21iZWQgcGl4ZWxzIGluc2lkZSBhbnkgb2YgdGhlIGJsb2NreSBieSBibG9ja3ggc2l6ZSBibG9ja3Mgb24gdGhlIGZyYW1lIGZvciB0aGUgZnJhbWUgdG8gYmUgZGV0ZWN0ZWQgYXMgY29tYmVkIiwgT0ZGU0VUKGNvbWJwZWwpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTgwfSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGZpZWxkbWF0Y2gpOworCitzdGF0aWMgaW50IGdldF93aWR0aChjb25zdCBGaWVsZE1hdGNoQ29udGV4dCAqZm0sIGNvbnN0IEFWRnJhbWUgKmYsIGludCBwbGFuZSkKK3sKKyAgICByZXR1cm4gcGxhbmUgPyBGRl9DRUlMX1JTSElGVChmLT53aWR0aCwgZm0tPmhzdWIpIDogZi0+d2lkdGg7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2hlaWdodChjb25zdCBGaWVsZE1hdGNoQ29udGV4dCAqZm0sIGNvbnN0IEFWRnJhbWUgKmYsIGludCBwbGFuZSkKK3sKKyAgICByZXR1cm4gcGxhbmUgPyBGRl9DRUlMX1JTSElGVChmLT5oZWlnaHQsIGZtLT52c3ViKSA6IGYtPmhlaWdodDsKK30KKworc3RhdGljIGludDY0X3QgbHVtYV9hYnNfZGlmZihjb25zdCBBVkZyYW1lICpmMSwgY29uc3QgQVZGcmFtZSAqZjIpCit7CisgICAgaW50IHgsIHk7CisgICAgY29uc3QgdWludDhfdCAqc3JjcDEgPSBmMS0+ZGF0YVswXTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNwMiA9IGYyLT5kYXRhWzBdOworICAgIGNvbnN0IGludCBzcmMxX2xpbmVzaXplID0gZjEtPmxpbmVzaXplWzBdOworICAgIGNvbnN0IGludCBzcmMyX2xpbmVzaXplID0gZjItPmxpbmVzaXplWzBdOworICAgIGNvbnN0IGludCB3aWR0aCAgPSBmMS0+d2lkdGg7CisgICAgY29uc3QgaW50IGhlaWdodCA9IGYxLT5oZWlnaHQ7CisgICAgaW50NjRfdCBhY2MgPSAwOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgYWNjICs9IGFicyhzcmNwMVt4XSAtIHNyY3AyW3hdKTsKKyAgICAgICAgc3JjcDEgKz0gc3JjMV9saW5lc2l6ZTsKKyAgICAgICAgc3JjcDIgKz0gc3JjMl9saW5lc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIGFjYzsKK30KKworc3RhdGljIHZvaWQgZmlsbF9idWYodWludDhfdCAqZGF0YSwgaW50IHcsIGludCBoLCBpbnQgbGluZXNpemUsIHVpbnQ4X3QgdikKK3sKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgbWVtc2V0KGRhdGEsIHYsIHcpOworICAgICAgICBkYXRhICs9IGxpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIGludCBjYWxjX2NvbWJlZF9zY29yZShjb25zdCBGaWVsZE1hdGNoQ29udGV4dCAqZm0sIGNvbnN0IEFWRnJhbWUgKnNyYykKK3sKKyAgICBpbnQgeCwgeSwgcGxhbmUsIG1heF92ID0gMDsKKyAgICBjb25zdCBpbnQgY3RocmVzaCA9IGZtLT5jdGhyZXNoOworICAgIGNvbnN0IGludCBjdGhyZXNoNiA9IGN0aHJlc2ggKiA2OworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgKGZtLT5jaHJvbWEgPyAzIDogMSk7IHBsYW5lKyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCA9IHNyYy0+ZGF0YVtwbGFuZV07CisgICAgICAgIGNvbnN0IGludCBzcmNfbGluZXNpemUgPSBzcmMtPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgY29uc3QgaW50IHdpZHRoICA9IGdldF93aWR0aCAoZm0sIHNyYywgcGxhbmUpOworICAgICAgICBjb25zdCBpbnQgaGVpZ2h0ID0gZ2V0X2hlaWdodChmbSwgc3JjLCBwbGFuZSk7CisgICAgICAgIHVpbnQ4X3QgKmNta3AgPSBmbS0+Y21hc2tfZGF0YVtwbGFuZV07CisgICAgICAgIGNvbnN0IGludCBjbWtfbGluZXNpemUgPSBmbS0+Y21hc2tfbGluZXNpemVbcGxhbmVdOworCisgICAgICAgIGlmIChjdGhyZXNoIDwgMCkgeworICAgICAgICAgICAgZmlsbF9idWYoY21rcCwgd2lkdGgsIGhlaWdodCwgY21rX2xpbmVzaXplLCAweGZmKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZpbGxfYnVmKGNta3AsIHdpZHRoLCBoZWlnaHQsIGNta19saW5lc2l6ZSwgMCk7CisKKyAgICAgICAgLyogWzEgLTMgNCAtMyAxXSB2ZXJ0aWNhbCBmaWx0ZXIgKi8KKyNkZWZpbmUgRklMVEVSKHhtMiwgeG0xLCB4cDEsIHhwMikgXAorICAgICAgICBhYnMoICA0ICogc3JjcFt4XSBcCisgICAgICAgICAgICAgLTMgKiAoc3JjcFt4ICsgKHhtMSkqc3JjX2xpbmVzaXplXSArIHNyY3BbeCArICh4cDEpKnNyY19saW5lc2l6ZV0pIFwKKyAgICAgICAgICAgICArICAgIChzcmNwW3ggKyAoeG0yKSpzcmNfbGluZXNpemVdICsgc3JjcFt4ICsgKHhwMikqc3JjX2xpbmVzaXplXSkpID4gY3RocmVzaDYKKworICAgICAgICAvKiBmaXJzdCBsaW5lICovCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgczEgPSBhYnMoc3JjcFt4XSAtIHNyY3BbeCArIHNyY19saW5lc2l6ZV0pOworICAgICAgICAgICAgaWYgKHMxID4gY3RocmVzaCAmJiBGSUxURVIoMiwgMSwgMSwgMikpCisgICAgICAgICAgICAgICAgY21rcFt4XSA9IDB4ZmY7CisgICAgICAgIH0KKyAgICAgICAgc3JjcCArPSBzcmNfbGluZXNpemU7CisgICAgICAgIGNta3AgKz0gY21rX2xpbmVzaXplOworCisgICAgICAgIC8qIHNlY29uZCBsaW5lICovCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgczEgPSBhYnMoc3JjcFt4XSAtIHNyY3BbeCAtIHNyY19saW5lc2l6ZV0pOworICAgICAgICAgICAgY29uc3QgaW50IHMyID0gYWJzKHNyY3BbeF0gLSBzcmNwW3ggKyBzcmNfbGluZXNpemVdKTsKKyAgICAgICAgICAgIGlmIChzMSA+IGN0aHJlc2ggJiYgczIgPiBjdGhyZXNoICYmIEZJTFRFUigyLCAtMSwgMSwgMikpCisgICAgICAgICAgICAgICAgY21rcFt4XSA9IDB4ZmY7CisgICAgICAgIH0KKyAgICAgICAgc3JjcCArPSBzcmNfbGluZXNpemU7CisgICAgICAgIGNta3AgKz0gY21rX2xpbmVzaXplOworCisgICAgICAgIC8qIGFsbCBsaW5lcyBtaW51cyBmaXJzdCB0d28gYW5kIGxhc3QgdHdvICovCisgICAgICAgIGZvciAoeSA9IDI7IHkgPCBoZWlnaHQtMjsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBzMSA9IGFicyhzcmNwW3hdIC0gc3JjcFt4IC0gc3JjX2xpbmVzaXplXSk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHMyID0gYWJzKHNyY3BbeF0gLSBzcmNwW3ggKyBzcmNfbGluZXNpemVdKTsKKyAgICAgICAgICAgICAgICBpZiAoczEgPiBjdGhyZXNoICYmIHMyID4gY3RocmVzaCAmJiBGSUxURVIoLTIsIC0xLCAxLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgY21rcFt4XSA9IDB4ZmY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmNwICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIGNta3AgKz0gY21rX2xpbmVzaXplOworICAgICAgICB9CisKKyAgICAgICAgLyogYmVmb3JlLWxhc3QgbGluZSAqLworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgY29uc3QgaW50IHMxID0gYWJzKHNyY3BbeF0gLSBzcmNwW3ggLSBzcmNfbGluZXNpemVdKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBzMiA9IGFicyhzcmNwW3hdIC0gc3JjcFt4ICsgc3JjX2xpbmVzaXplXSk7CisgICAgICAgICAgICBpZiAoczEgPiBjdGhyZXNoICYmIHMyID4gY3RocmVzaCAmJiBGSUxURVIoLTIsIC0xLCAxLCAtMikpCisgICAgICAgICAgICAgICAgY21rcFt4XSA9IDB4ZmY7CisgICAgICAgIH0KKyAgICAgICAgc3JjcCArPSBzcmNfbGluZXNpemU7CisgICAgICAgIGNta3AgKz0gY21rX2xpbmVzaXplOworCisgICAgICAgIC8qIGxhc3QgbGluZSAqLworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgY29uc3QgaW50IHMxID0gYWJzKHNyY3BbeF0gLSBzcmNwW3ggLSBzcmNfbGluZXNpemVdKTsKKyAgICAgICAgICAgIGlmIChzMSA+IGN0aHJlc2ggJiYgRklMVEVSKC0yLCAtMSwgLTEsIC0yKSkKKyAgICAgICAgICAgICAgICBjbWtwW3hdID0gMHhmZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmbS0+Y2hyb21hKSB7CisgICAgICAgIHVpbnQ4X3QgKmNta3AgID0gZm0tPmNtYXNrX2RhdGFbMF07CisgICAgICAgIHVpbnQ4X3QgKmNta3BVID0gZm0tPmNtYXNrX2RhdGFbMV07CisgICAgICAgIHVpbnQ4X3QgKmNta3BWID0gZm0tPmNtYXNrX2RhdGFbMl07CisgICAgICAgIGNvbnN0IGludCB3aWR0aCAgPSBGRl9DRUlMX1JTSElGVChzcmMtPndpZHRoLCAgZm0tPmhzdWIpOworICAgICAgICBjb25zdCBpbnQgaGVpZ2h0ID0gRkZfQ0VJTF9SU0hJRlQoc3JjLT5oZWlnaHQsIGZtLT52c3ViKTsKKyAgICAgICAgY29uc3QgaW50IGNta19saW5lc2l6ZSAgID0gZm0tPmNtYXNrX2xpbmVzaXplWzBdIDw8IDE7CisgICAgICAgIGNvbnN0IGludCBjbWtfbGluZXNpemVVViA9IGZtLT5jbWFza19saW5lc2l6ZVsyXTsKKyAgICAgICAgdWludDhfdCAqY21rcHAgID0gY21rcCAtIChjbWtfbGluZXNpemU+PjEpOworICAgICAgICB1aW50OF90ICpjbWtwbiAgPSBjbWtwICsgKGNta19saW5lc2l6ZT4+MSk7CisgICAgICAgIHVpbnQ4X3QgKmNta3BubiA9IGNta3AgKyAgY21rX2xpbmVzaXplOworICAgICAgICBmb3IgKHkgPSAxOyB5IDwgaGVpZ2h0IC0gMTsgeSsrKSB7CisgICAgICAgICAgICBjbWtwcCAgKz0gY21rX2xpbmVzaXplOworICAgICAgICAgICAgY21rcCAgICs9IGNta19saW5lc2l6ZTsKKyAgICAgICAgICAgIGNta3BuICArPSBjbWtfbGluZXNpemU7CisgICAgICAgICAgICBjbWtwbm4gKz0gY21rX2xpbmVzaXplOworICAgICAgICAgICAgY21rcFYgICs9IGNta19saW5lc2l6ZVVWOworICAgICAgICAgICAgY21rcFUgICs9IGNta19saW5lc2l6ZVVWOworICAgICAgICAgICAgZm9yICh4ID0gMTsgeCA8IHdpZHRoIC0gMTsgeCsrKSB7CisjZGVmaW5lIEhBU19GRl9BUk9VTkQocCwgbHopIChwW3gtMSAtIGx6XSA9PSAweGZmIHx8IHBbeCAtIGx6XSA9PSAweGZmIHx8IHBbeCsxIC0gbHpdID09IDB4ZmYgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFt4LTEgICAgIF0gPT0gMHhmZiB8fCAgICAgICAgICAgICAgICAgICAgICBwW3grMSAgICAgXSA9PSAweGZmIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbeC0xICsgbHpdID09IDB4ZmYgfHwgcFt4ICsgbHpdID09IDB4ZmYgfHwgcFt4KzEgKyBsel0gPT0gMHhmZikKKyAgICAgICAgICAgICAgICBpZiAoKGNta3BWW3hdID09IDB4ZmYgJiYgSEFTX0ZGX0FST1VORChjbWtwViwgY21rX2xpbmVzaXplVVYpKSB8fAorICAgICAgICAgICAgICAgICAgICAoY21rcFVbeF0gPT0gMHhmZiAmJiBIQVNfRkZfQVJPVU5EKGNta3BVLCBjbWtfbGluZXNpemVVVikpKSB7CisgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QqKWNta3ApW3hdICA9IDB4ZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCopY21rcG4pW3hdID0gMHhmZmZmOworICAgICAgICAgICAgICAgICAgICBpZiAoeSYxKSAoKHVpbnQxNl90KiljbWtwcClbeF0gID0gMHhmZmZmOworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAoKHVpbnQxNl90KiljbWtwbm4pW3hdID0gMHhmZmZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgY29uc3QgaW50IGJsb2NreCA9IGZtLT5ibG9ja3g7CisgICAgICAgIGNvbnN0IGludCBibG9ja3kgPSBmbS0+YmxvY2t5OworICAgICAgICBjb25zdCBpbnQgeGhhbGYgPSBibG9ja3gvMjsKKyAgICAgICAgY29uc3QgaW50IHloYWxmID0gYmxvY2t5LzI7CisgICAgICAgIGNvbnN0IGludCBjbWtfbGluZXNpemUgPSBmbS0+Y21hc2tfbGluZXNpemVbMF07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNta3AgICAgPSBmbS0+Y21hc2tfZGF0YVswXSArIGNta19saW5lc2l6ZTsKKyAgICAgICAgY29uc3QgaW50IHdpZHRoICA9IHNyYy0+d2lkdGg7CisgICAgICAgIGNvbnN0IGludCBoZWlnaHQgPSBzcmMtPmhlaWdodDsKKyAgICAgICAgY29uc3QgaW50IHhibG9ja3MgPSAoKHdpZHRoK3hoYWxmKS9ibG9ja3gpICsgMTsKKyAgICAgICAgY29uc3QgaW50IHhibG9ja3M0ID0geGJsb2Nrczw8MjsKKyAgICAgICAgY29uc3QgaW50IHlibG9ja3MgPSAoKGhlaWdodCt5aGFsZikvYmxvY2t5KSArIDE7CisgICAgICAgIGludCAqY19hcnJheSA9IGZtLT5jX2FycmF5OworICAgICAgICBjb25zdCBpbnQgYXJyYXlzaXplID0gKHhibG9ja3MqeWJsb2Nrcyk8PDI7CisgICAgICAgIGludCAgICAgIGhlaWdodGEgPSAoaGVpZ2h0LyhibG9ja3kvMikpKihibG9ja3kvMik7CisgICAgICAgIGNvbnN0IGludCB3aWR0aGEgPSAod2lkdGggLyhibG9ja3gvMikpKihibG9ja3gvMik7CisgICAgICAgIGlmIChoZWlnaHRhID09IGhlaWdodCkKKyAgICAgICAgICAgIGhlaWdodGEgPSBoZWlnaHQgLSB5aGFsZjsKKyAgICAgICAgbWVtc2V0KGNfYXJyYXksIDAsIGFycmF5c2l6ZSAqIHNpemVvZigqY19hcnJheSkpOworCisjZGVmaW5lIENfQVJSQVlfQUREKHYpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBib3gxID0gKHggLyBibG9ja3gpICogNDsgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYm94MiA9ICgoeCArIHhoYWxmKSAvIGJsb2NreCkgKiA0OyAgICBcCisgICAgY19hcnJheVt0ZW1wMSArIGJveDEgICAgXSArPSB2OyAgICAgICAgICAgICAgICAgXAorICAgIGNfYXJyYXlbdGVtcDEgKyBib3gyICsgMV0gKz0gdjsgICAgICAgICAgICAgICAgIFwKKyAgICBjX2FycmF5W3RlbXAyICsgYm94MSArIDJdICs9IHY7ICAgICAgICAgICAgICAgICBcCisgICAgY19hcnJheVt0ZW1wMiArIGJveDIgKyAzXSArPSB2OyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBWRVJUSUNBTF9IQUxGKHlfc3RhcnQsIHlfZW5kKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSB5X3N0YXJ0OyB5IDwgeV9lbmQ7IHkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCB0ZW1wMSA9ICh5IC8gYmxvY2t5KSAqIHhibG9ja3M0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgdGVtcDIgPSAoKHkgKyB5aGFsZikgLyBibG9ja3kpICogeGJsb2NrczQ7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoY21rcFt4IC0gY21rX2xpbmVzaXplXSA9PSAweGZmICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNta3BbeCAgICAgICAgICAgICAgIF0gPT0gMHhmZiAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjbWtwW3ggKyBjbWtfbGluZXNpemVdID09IDB4ZmYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ19BUlJBWV9BREQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjbWtwICs9IGNta19saW5lc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgICAgIFZFUlRJQ0FMX0hBTEYoMSwgeWhhbGYpOworCisgICAgICAgIGZvciAoeSA9IHloYWxmOyB5IDwgaGVpZ2h0YTsgeSArPSB5aGFsZikgeworICAgICAgICAgICAgY29uc3QgaW50IHRlbXAxID0gKHkgLyBibG9ja3kpICogeGJsb2NrczQ7CisgICAgICAgICAgICBjb25zdCBpbnQgdGVtcDIgPSAoKHkgKyB5aGFsZikgLyBibG9ja3kpICogeGJsb2NrczQ7CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aGE7IHggKz0geGhhbGYpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjbWtwX3RtcCA9IGNta3AgKyB4OworICAgICAgICAgICAgICAgIGludCB1LCB2LCBzdW0gPSAwOworICAgICAgICAgICAgICAgIGZvciAodSA9IDA7IHUgPCB5aGFsZjsgdSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodiA9IDA7IHYgPCB4aGFsZjsgdisrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNta3BfdG1wW3YgLSBjbWtfbGluZXNpemVdID09IDB4ZmYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWtwX3RtcFt2ICAgICAgICAgICAgICAgXSA9PSAweGZmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21rcF90bXBbdiArIGNta19saW5lc2l6ZV0gPT0gMHhmZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0rKzsKKyAgICAgICAgICAgICAgICAgICAgY21rcF90bXAgKz0gY21rX2xpbmVzaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3VtKQorICAgICAgICAgICAgICAgICAgICBDX0FSUkFZX0FERChzdW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHggPSB3aWR0aGE7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY21rcF90bXAgPSBjbWtwICsgeDsKKyAgICAgICAgICAgICAgICBpbnQgdSwgc3VtID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKHUgPSAwOyB1IDwgeWhhbGY7IHUrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY21rcF90bXBbLWNta19saW5lc2l6ZV0gPT0gMHhmZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY21rcF90bXBbICAgICAgICAgICAgMF0gPT0gMHhmZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY21rcF90bXBbIGNta19saW5lc2l6ZV0gPT0gMHhmZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSsrOworICAgICAgICAgICAgICAgICAgICBjbWtwX3RtcCArPSBjbWtfbGluZXNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdW0pCisgICAgICAgICAgICAgICAgICAgIENfQVJSQVlfQUREKHN1bSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNta3AgKz0gY21rX2xpbmVzaXplICogeWhhbGY7CisgICAgICAgIH0KKworICAgICAgICBWRVJUSUNBTF9IQUxGKGhlaWdodGEsIGhlaWdodCAtIDEpOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhcnJheXNpemU7IHgrKykKKyAgICAgICAgICAgIGlmIChjX2FycmF5W3hdID4gbWF4X3YpCisgICAgICAgICAgICAgICAgbWF4X3YgPSBjX2FycmF5W3hdOworICAgIH0KKyAgICByZXR1cm4gbWF4X3Y7Cit9CisKKy8vIHRoZSBzZWNyZXQgaXMgdGhhdCB0YnVmZmVyIGlzIGFuIGludGVybGFjZWQsIG9mZnNldCBzdWJzZXQgb2YgYWxsIHRoZSBsaW5lcworc3RhdGljIHZvaWQgYnVpbGRfYWJzX2RpZmZfbWFzayhjb25zdCB1aW50OF90ICpwcnZwLCBpbnQgcHJ2X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpueHRwLCBpbnQgbnh0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp0YnVmZmVyLCAgICBpbnQgdGJ1Zl9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCB5LCB4OworCisgICAgcHJ2cCAtPSBwcnZfbGluZXNpemU7CisgICAgbnh0cCAtPSBueHRfbGluZXNpemU7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgdGJ1ZmZlclt4XSA9IEZGQUJTKHBydnBbeF0gLSBueHRwW3hdKTsKKyAgICAgICAgcHJ2cCArPSBwcnZfbGluZXNpemU7CisgICAgICAgIG54dHAgKz0gbnh0X2xpbmVzaXplOworICAgICAgICB0YnVmZmVyICs9IHRidWZfbGluZXNpemU7CisgICAgfQorfQorCisvKioKKyAqIEJ1aWxkIGEgbWFwIG92ZXIgd2hpY2ggcGl4ZWxzIGRpZmZlciBhIGxvdC9hIGxpdHRsZQorICovCitzdGF0aWMgdm9pZCBidWlsZF9kaWZmX21hcChGaWVsZE1hdGNoQ29udGV4dCAqZm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwcnZwLCBpbnQgcHJ2X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbnh0cCwgaW50IG54dF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdHAsIGludCBkc3RfbGluZXNpemUsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBwbGFuZSkKK3sKKyAgICBpbnQgeCwgeSwgdSwgZGlmZiwgY291bnQ7CisgICAgaW50IHRwaXRjaCA9IHBsYW5lID8gZm0tPnRwaXRjaHV2IDogZm0tPnRwaXRjaHk7CisgICAgY29uc3QgdWludDhfdCAqZHAgPSBmbS0+dGJ1ZmZlciArIHRwaXRjaDsKKworICAgIGJ1aWxkX2Fic19kaWZmX21hc2socHJ2cCwgcHJ2X2xpbmVzaXplLCBueHRwLCBueHRfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBmbS0+dGJ1ZmZlciwgdHBpdGNoLCB3aWR0aCwgaGVpZ2h0Pj4xKTsKKworICAgIGZvciAoeSA9IDI7IHkgPCBoZWlnaHQgLSAyOyB5ICs9IDIpIHsKKyAgICAgICAgZm9yICh4ID0gMTsgeCA8IHdpZHRoIC0gMTsgeCsrKSB7CisgICAgICAgICAgICBkaWZmID0gZHBbeF07CisgICAgICAgICAgICBpZiAoZGlmZiA+IDMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvdW50ID0gMCwgdSA9IHgtMTsgdSA8IHgrMiAmJiBjb3VudCA8IDI7IHUrKykgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBkcFt1LXRwaXRjaF0gPiAzOworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBkcFt1ICAgICAgIF0gPiAzOworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBkcFt1K3RwaXRjaF0gPiAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdHBbeF0gPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDE5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXBwZXIgPSAwLCBsb3dlciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvdW50ID0gMCwgdSA9IHgtMTsgdSA8IHgrMiAmJiBjb3VudCA8IDY7IHUrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcFt1LXRwaXRjaF0gPiAxOSkgeyBjb3VudCsrOyB1cHBlciA9IDE7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHBbdSAgICAgICBdID4gMTkpICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHBbdSt0cGl0Y2hdID4gMTkpIHsgY291bnQrKzsgbG93ZXIgPSAxOyB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwcGVyICYmIGxvd2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHBbeF0gfD0gMTw8MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXBwZXIyID0gMCwgbG93ZXIyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1ID0gRkZNQVgoeC00LDApOyB1IDwgRkZNSU4oeCs1LHdpZHRoKTsgdSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSAhPSAyICYmICAgICAgICBkcFt1LTIqdHBpdGNoXSA+IDE5KSB1cHBlcjIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAgICAgICAgICAgICAgICAgZHBbdS0gIHRwaXRjaF0gPiAxOSkgdXBwZXIgID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggICAgICAgICAgICAgICAgIGRwW3UrICB0cGl0Y2hdID4gMTkpIGxvd2VyICA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSAhPSBoZWlnaHQtNCAmJiBkcFt1KzIqdHBpdGNoXSA+IDE5KSBsb3dlcjIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodXBwZXIgJiYgKGxvd2VyIHx8IHVwcGVyMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG93ZXIgJiYgKHVwcGVyIHx8IGxvd2VyMikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0cFt4XSB8PSAxPDwxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb3VudCA+IDUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RwW3hdIHw9IDE8PDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRwICs9IHRwaXRjaDsKKyAgICAgICAgZHN0cCArPSBkc3RfbGluZXNpemU7CisgICAgfQorfQorCitlbnVtIHsgbVAsIG1DLCBtTiwgbUIsIG1VIH07CisKK3N0YXRpYyBpbnQgZ2V0X2ZpZWxkX2Jhc2UoaW50IG1hdGNoLCBpbnQgZmllbGQpCit7CisgICAgcmV0dXJuIG1hdGNoIDwgMyA/IDIgLSBmaWVsZCA6IDEgKyBmaWVsZDsKK30KKworc3RhdGljIEFWRnJhbWUgKnNlbGVjdF9mcmFtZShGaWVsZE1hdGNoQ29udGV4dCAqZm0sIGludCBtYXRjaCkKK3sKKyAgICBpZiAgICAgIChtYXRjaCA9PSBtUCB8fCBtYXRjaCA9PSBtQikgcmV0dXJuIGZtLT5wcnY7CisgICAgZWxzZSBpZiAobWF0Y2ggPT0gbU4gfHwgbWF0Y2ggPT0gbVUpIHJldHVybiBmbS0+bnh0OworICAgIGVsc2UgIC8qIG1hdGNoID09IG1DICovICAgICAgICAgICAgICByZXR1cm4gZm0tPnNyYzsKK30KKworc3RhdGljIGludCBjb21wYXJlX2ZpZWxkcyhGaWVsZE1hdGNoQ29udGV4dCAqZm0sIGludCBtYXRjaDEsIGludCBtYXRjaDIsIGludCBmaWVsZCkKK3sKKyAgICBpbnQgcGxhbmUsIHJldDsKKyAgICB1aW50NjRfdCBhY2N1bVBjID0gMCwgYWNjdW1QbSA9IDAsIGFjY3VtUG1sID0gMDsKKyAgICB1aW50NjRfdCBhY2N1bU5jID0gMCwgYWNjdW1ObSA9IDAsIGFjY3VtTm1sID0gMDsKKyAgICBpbnQgbm9ybTEsIG5vcm0yLCBtdG4xLCBtdG4yOworICAgIGZsb2F0IGMxLCBjMiwgbXI7CisgICAgY29uc3QgQVZGcmFtZSAqc3JjID0gZm0tPnNyYzsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IChmbS0+bWNocm9tYSA/IDMgOiAxKTsgcGxhbmUrKykgeworICAgICAgICBpbnQgeCwgeSwgdGVtcDEsIHRlbXAyLCBmYmFzZTsKKyAgICAgICAgY29uc3QgQVZGcmFtZSAqcHJldiwgKm5leHQ7CisgICAgICAgIHVpbnQ4X3QgKm1hcHAgICAgPSBmbS0+bWFwX2RhdGFbcGxhbmVdOworICAgICAgICBpbnQgbWFwX2xpbmVzaXplID0gZm0tPm1hcF9saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3AgPSBzcmMtPmRhdGFbcGxhbmVdOworICAgICAgICBjb25zdCBpbnQgc3JjX2xpbmVzaXplICA9IHNyYy0+bGluZXNpemVbcGxhbmVdOworICAgICAgICBjb25zdCBpbnQgc3JjZl9saW5lc2l6ZSA9IHNyY19saW5lc2l6ZSA8PCAxOworICAgICAgICBpbnQgcHJ2X2xpbmVzaXplLCAgbnh0X2xpbmVzaXplOworICAgICAgICBpbnQgcHJ2Zl9saW5lc2l6ZSwgbnh0Zl9saW5lc2l6ZTsKKyAgICAgICAgY29uc3QgaW50IHdpZHRoICA9IGdldF93aWR0aCAoZm0sIHNyYywgcGxhbmUpOworICAgICAgICBjb25zdCBpbnQgaGVpZ2h0ID0gZ2V0X2hlaWdodChmbSwgc3JjLCBwbGFuZSk7CisgICAgICAgIGNvbnN0IGludCB5MGEgPSBmbS0+eTAgPj4gKHBsYW5lICE9IDApOworICAgICAgICBjb25zdCBpbnQgeTFhID0gZm0tPnkxID4+IChwbGFuZSAhPSAwKTsKKyAgICAgICAgY29uc3QgaW50IHN0YXJ0eCA9IChwbGFuZSA9PSAwID8gOCA6IDQpOworICAgICAgICBjb25zdCBpbnQgc3RvcHggID0gd2lkdGggLSBzdGFydHg7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BmLCAqc3JjZiwgKnNyY25mOworICAgICAgICBjb25zdCB1aW50OF90ICpwcnZwZiwgKnBydm5mLCAqbnh0cGYsICpueHRuZjsKKworICAgICAgICBmaWxsX2J1ZihtYXBwLCB3aWR0aCwgaGVpZ2h0LCBtYXBfbGluZXNpemUsIDApOworCisgICAgICAgIC8qIG1hdGNoMSAqLworICAgICAgICBmYmFzZSA9IGdldF9maWVsZF9iYXNlKG1hdGNoMSwgZmllbGQpOworICAgICAgICBzcmNmICA9IHNyY3AgKyAoZmJhc2UgKyAxKSAqIHNyY19saW5lc2l6ZTsKKyAgICAgICAgc3JjcGYgPSBzcmNmIC0gc3JjZl9saW5lc2l6ZTsKKyAgICAgICAgc3JjbmYgPSBzcmNmICsgc3JjZl9saW5lc2l6ZTsKKyAgICAgICAgbWFwcCAgPSBtYXBwICsgZmJhc2UgKiBtYXBfbGluZXNpemU7CisgICAgICAgIHByZXYgPSBzZWxlY3RfZnJhbWUoZm0sIG1hdGNoMSk7CisgICAgICAgIHBydl9saW5lc2l6ZSAgPSBwcmV2LT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIHBydmZfbGluZXNpemUgPSBwcnZfbGluZXNpemUgPDwgMTsKKyAgICAgICAgcHJ2cGYgPSBwcmV2LT5kYXRhW3BsYW5lXSArIGZiYXNlICogcHJ2X2xpbmVzaXplOyAgIC8vIHByZXZpb3VzIGZyYW1lLCBwcmV2aW91cyBmaWVsZAorICAgICAgICBwcnZuZiA9IHBydnBmICsgcHJ2Zl9saW5lc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgZnJhbWUsIG5leHQgICAgIGZpZWxkCisKKyAgICAgICAgLyogbWF0Y2gyICovCisgICAgICAgIGZiYXNlID0gZ2V0X2ZpZWxkX2Jhc2UobWF0Y2gyLCBmaWVsZCk7CisgICAgICAgIG5leHQgPSBzZWxlY3RfZnJhbWUoZm0sIG1hdGNoMik7CisgICAgICAgIG54dF9saW5lc2l6ZSAgPSBuZXh0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIG54dGZfbGluZXNpemUgPSBueHRfbGluZXNpemUgPDwgMTsKKyAgICAgICAgbnh0cGYgPSBuZXh0LT5kYXRhW3BsYW5lXSArIGZiYXNlICogbnh0X2xpbmVzaXplOyAgIC8vIG5leHQgZnJhbWUsIHByZXZpb3VzIGZpZWxkCisgICAgICAgIG54dG5mID0gbnh0cGYgKyBueHRmX2xpbmVzaXplOyAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGZyYW1lLCBuZXh0ICAgICBmaWVsZAorCisgICAgICAgIG1hcF9saW5lc2l6ZSA8PD0gMTsKKyAgICAgICAgaWYgKChtYXRjaDEgPj0gMyAmJiBmaWVsZCA9PSAxKSB8fCAobWF0Y2gxIDwgMyAmJiBmaWVsZCAhPSAxKSkKKyAgICAgICAgICAgIGJ1aWxkX2RpZmZfbWFwKGZtLCBwcnZwZiwgcHJ2Zl9saW5lc2l6ZSwgbnh0cGYsIG54dGZfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwLCBtYXBfbGluZXNpemUsIGhlaWdodCwgd2lkdGgsIHBsYW5lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVpbGRfZGlmZl9tYXAoZm0sIHBydm5mLCBwcnZmX2xpbmVzaXplLCBueHRuZiwgbnh0Zl9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHAgKyBtYXBfbGluZXNpemUsIG1hcF9saW5lc2l6ZSwgaGVpZ2h0LCB3aWR0aCwgcGxhbmUpOworCisgICAgICAgIGZvciAoeSA9IDI7IHkgPCBoZWlnaHQgLSAyOyB5ICs9IDIpIHsKKyAgICAgICAgICAgIGlmICh5MGEgPT0geTFhIHx8IHkgPCB5MGEgfHwgeSA+IHkxYSkgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IHN0YXJ0eDsgeCA8IHN0b3B4OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBbeF0gPiAwIHx8IG1hcHBbeCArIG1hcF9saW5lc2l6ZV0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IHNyY3BmW3hdICsgKHNyY2ZbeF0gPDwgMikgKyBzcmNuZlt4XTsgLy8gWzEgNCAxXQorCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9IGFicygzICogKHBydnBmW3hdICsgcHJ2bmZbeF0pIC0gdGVtcDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAyID4gMjMgJiYgKChtYXBwW3hdJjEpIHx8IChtYXBwW3ggKyBtYXBfbGluZXNpemVdJjEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bVBjICs9IHRlbXAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAyID4gNDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1hcHBbeF0mMikgfHwgKG1hcHBbeCArIG1hcF9saW5lc2l6ZV0mMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtUG0gKz0gdGVtcDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYXBwW3hdJjQpIHx8IChtYXBwW3ggKyBtYXBfbGluZXNpemVdJjQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bVBtbCArPSB0ZW1wMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSBhYnMoMyAqIChueHRwZlt4XSArIG54dG5mW3hdKSAtIHRlbXAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wMiA+IDIzICYmICgobWFwcFt4XSYxKSB8fCAobWFwcFt4ICsgbWFwX2xpbmVzaXplXSYxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW1OYyArPSB0ZW1wMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wMiA+IDQyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYXBwW3hdJjIpIHx8IChtYXBwW3ggKyBtYXBfbGluZXNpemVdJjIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bU5tICs9IHRlbXAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWFwcFt4XSY0KSB8fCAobWFwcFt4ICsgbWFwX2xpbmVzaXplXSY0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW1ObWwgKz0gdGVtcDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcnZwZiArPSBwcnZmX2xpbmVzaXplOworICAgICAgICAgICAgcHJ2bmYgKz0gcHJ2Zl9saW5lc2l6ZTsKKyAgICAgICAgICAgIHNyY3BmICs9IHNyY2ZfbGluZXNpemU7CisgICAgICAgICAgICBzcmNmICArPSBzcmNmX2xpbmVzaXplOworICAgICAgICAgICAgc3JjbmYgKz0gc3JjZl9saW5lc2l6ZTsKKyAgICAgICAgICAgIG54dHBmICs9IG54dGZfbGluZXNpemU7CisgICAgICAgICAgICBueHRuZiArPSBueHRmX2xpbmVzaXplOworICAgICAgICAgICAgbWFwcCAgKz0gbWFwX2xpbmVzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGFjY3VtUG0gPCA1MDAgJiYgYWNjdW1ObSA8IDUwMCAmJiAoYWNjdW1QbWwgPj0gNTAwIHx8IGFjY3VtTm1sID49IDUwMCkgJiYKKyAgICAgICAgRkZNQVgoYWNjdW1QbWwsYWNjdW1ObWwpID4gMypGRk1JTihhY2N1bVBtbCxhY2N1bU5tbCkpIHsKKyAgICAgICAgYWNjdW1QbSA9IGFjY3VtUG1sOworICAgICAgICBhY2N1bU5tID0gYWNjdW1ObWw7CisgICAgfQorCisgICAgbm9ybTEgPSAoaW50KSgoYWNjdW1QYyAvIDYuMGYpICsgMC41Zik7CisgICAgbm9ybTIgPSAoaW50KSgoYWNjdW1OYyAvIDYuMGYpICsgMC41Zik7CisgICAgbXRuMSAgPSAoaW50KSgoYWNjdW1QbSAvIDYuMGYpICsgMC41Zik7CisgICAgbXRuMiAgPSAoaW50KSgoYWNjdW1ObSAvIDYuMGYpICsgMC41Zik7CisgICAgYzEgPSAoKGZsb2F0KUZGTUFYKG5vcm0xLG5vcm0yKSkgLyAoKGZsb2F0KUZGTUFYKEZGTUlOKG5vcm0xLG5vcm0yKSwxKSk7CisgICAgYzIgPSAoKGZsb2F0KUZGTUFYKG10bjEsIG10bjIpKSAgLyAoKGZsb2F0KUZGTUFYKEZGTUlOKG10bjEsIG10bjIpLCAxKSk7CisgICAgbXIgPSAoKGZsb2F0KUZGTUFYKG10bjEsIG10bjIpKSAgLyAoKGZsb2F0KUZGTUFYKEZGTUFYKG5vcm0xLG5vcm0yKSwxKSk7CisgICAgaWYgKCgobXRuMSA+PSAgNTAwIHx8IG10bjIgPj0gIDUwMCkgJiYgKG10bjEqMiA8IG10bjIqMSB8fCBtdG4yKjIgPCBtdG4xKjEpKSB8fAorICAgICAgICAoKG10bjEgPj0gMTAwMCB8fCBtdG4yID49IDEwMDApICYmIChtdG4xKjMgPCBtdG4yKjIgfHwgbXRuMiozIDwgbXRuMSoyKSkgfHwKKyAgICAgICAgKChtdG4xID49IDIwMDAgfHwgbXRuMiA+PSAyMDAwKSAmJiAobXRuMSo1IDwgbXRuMio0IHx8IG10bjIqNSA8IG10bjEqNCkpIHx8CisgICAgICAgICgobXRuMSA+PSA0MDAwIHx8IG10bjIgPj0gNDAwMCkgJiYgYzIgPiBjMSkpCisgICAgICAgIHJldCA9IG10bjEgPiBtdG4yID8gbWF0Y2gyIDogbWF0Y2gxOworICAgIGVsc2UgaWYgKG1yID4gMC4wMDUgJiYgRkZNQVgobXRuMSwgbXRuMikgPiAxNTAgJiYgKG10bjEqMiA8IG10bjIqMSB8fCBtdG4yKjIgPCBtdG4xKjEpKQorICAgICAgICByZXQgPSBtdG4xID4gbXRuMiA/IG1hdGNoMiA6IG1hdGNoMTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IG5vcm0xID4gbm9ybTIgPyBtYXRjaDIgOiBtYXRjaDE7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY29weV9maWVsZHMoY29uc3QgRmllbGRNYXRjaENvbnRleHQgKmZtLCBBVkZyYW1lICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzcmMsIGludCBmaWVsZCkKK3sKKyAgICBpbnQgcGxhbmU7CisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgNCAmJiBzcmMtPmRhdGFbcGxhbmVdICYmIHNyYy0+bGluZXNpemVbcGxhbmVdOyBwbGFuZSsrKQorICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGRzdC0+ZGF0YVtwbGFuZV0gKyBmaWVsZCpkc3QtPmxpbmVzaXplW3BsYW5lXSwgZHN0LT5saW5lc2l6ZVtwbGFuZV0gPDwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmRhdGFbcGxhbmVdICsgZmllbGQqc3JjLT5saW5lc2l6ZVtwbGFuZV0sIHNyYy0+bGluZXNpemVbcGxhbmVdIDw8IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3dpZHRoKGZtLCBzcmMsIHBsYW5lKSwgZ2V0X2hlaWdodChmbSwgc3JjLCBwbGFuZSkgLyAyKTsKK30KKworc3RhdGljIEFWRnJhbWUgKmNyZWF0ZV93ZWF2ZV9mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IG1hdGNoLCBpbnQgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBydiwgQVZGcmFtZSAqc3JjLCBjb25zdCBBVkZyYW1lICpueHQpCit7CisgICAgQVZGcmFtZSAqZHN0OworICAgIEZpZWxkTWF0Y2hDb250ZXh0ICpmbSA9IGN0eC0+cHJpdjsKKworICAgIGlmIChtYXRjaCA9PSBtQykgeworICAgICAgICBkc3QgPSBhdl9mcmFtZV9jbG9uZShzcmMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKworICAgICAgICBkc3QgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIWRzdCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKGRzdCwgc3JjKTsKKworICAgICAgICBzd2l0Y2ggKG1hdGNoKSB7CisgICAgICAgIGNhc2UgbVA6IGNvcHlfZmllbGRzKGZtLCBkc3QsIHNyYywgMS1maWVsZCk7IGNvcHlfZmllbGRzKGZtLCBkc3QsIHBydiwgICBmaWVsZCk7IGJyZWFrOworICAgICAgICBjYXNlIG1OOiBjb3B5X2ZpZWxkcyhmbSwgZHN0LCBzcmMsIDEtZmllbGQpOyBjb3B5X2ZpZWxkcyhmbSwgZHN0LCBueHQsICAgZmllbGQpOyBicmVhazsKKyAgICAgICAgY2FzZSBtQjogY29weV9maWVsZHMoZm0sIGRzdCwgc3JjLCAgIGZpZWxkKTsgY29weV9maWVsZHMoZm0sIGRzdCwgcHJ2LCAxLWZpZWxkKTsgYnJlYWs7CisgICAgICAgIGNhc2UgbVU6IGNvcHlfZmllbGRzKGZtLCBkc3QsIHNyYywgICBmaWVsZCk7IGNvcHlfZmllbGRzKGZtLCBkc3QsIG54dCwgMS1maWVsZCk7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKDApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkc3Q7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2ttbShBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50ICpjb21icywgaW50IG0xLCBpbnQgbTIsCisgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqKmdlbl9mcmFtZXMsIGludCBmaWVsZCkKK3sKKyAgICBjb25zdCBGaWVsZE1hdGNoQ29udGV4dCAqZm0gPSBjdHgtPnByaXY7CisKKyNkZWZpbmUgTE9BRF9DT01CKG1pZCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjb21ic1ttaWRdIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghZ2VuX2ZyYW1lc1ttaWRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGdlbl9mcmFtZXNbbWlkXSA9IGNyZWF0ZV93ZWF2ZV9mcmFtZShjdHgsIG1pZCwgZmllbGQsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtLT5wcnYsIGZtLT5zcmMsIGZtLT5ueHQpOyAgICBcCisgICAgICAgIGNvbWJzW21pZF0gPSBjYWxjX2NvbWJlZF9zY29yZShmbSwgZ2VuX2ZyYW1lc1ttaWRdKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworICAgIExPQURfQ09NQihtMSk7CisgICAgTE9BRF9DT01CKG0yKTsKKworICAgIGlmICgoY29tYnNbbTJdICogMyA8IGNvbWJzW20xXSB8fCAoY29tYnNbbTJdICogMiA8IGNvbWJzW20xXSAmJiBjb21ic1ttMV0gPiBmbS0+Y29tYnBlbCkpICYmCisgICAgICAgIGFicyhjb21ic1ttMl0gLSBjb21ic1ttMV0pID49IDMwICYmIGNvbWJzW20yXSA8IGZtLT5jb21icGVsKQorICAgICAgICByZXR1cm4gbTI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gbTE7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgZnhvMG1bXSA9IHsgbVAsIG1DLCBtTiwgbUIsIG1VIH07CitzdGF0aWMgY29uc3QgaW50IGZ4bzFtW10gPSB7IG1OLCBtQywgbVAsIG1VLCBtQiB9OworCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEZpZWxkTWF0Y2hDb250ZXh0ICpmbSA9IGN0eC0+cHJpdjsKKyAgICBpbnQgY29tYnNbXSA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xIH07CisgICAgaW50IG9yZGVyLCBmaWVsZCwgaSwgbWF0Y2gsIHNjID0gMDsKKyAgICBjb25zdCBpbnQgKmZ4bzsKKyAgICBBVkZyYW1lICpnZW5fZnJhbWVzW10gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgICBBVkZyYW1lICpkc3Q7CisKKyAgICAvKiB1cGRhdGUgZnJhbWVzIHF1ZXVlKHMpICovCisjZGVmaW5lIFNMSURJTkdfRlJBTUVfV0lORE9XKHBydiwgc3JjLCBueHQpIGRvIHsgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAocHJ2ICE9IHNyYykgLyogMm5kIGxvb3AgZXhjZXB0aW9uICgxc3QgaGFzIHBydj09c3JjIGFuZCB3ZSBkb24ndCB3YW50IHRvIGxvb3NlIHNyYykgKi8gXAorICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcHJ2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJ2ID0gc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNyYyA9IG54dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG54dCA9IGluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghcHJ2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcHJ2ID0gc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFwcnYpIC8qIHJlY2VpdmVkIG9ubHkgb25lIGZyYW1lIGF0IHRoYXQgcG9pbnQgKi8gICBcCisgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9hc3NlcnQwKHBydiAmJiBzcmMgJiYgbnh0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisgICAgaWYgKEZGX0lOTElOS19JRFgoaW5saW5rKSA9PSBJTlBVVF9NQUlOKSB7CisgICAgICAgIFNMSURJTkdfRlJBTUVfV0lORE9XKGZtLT5wcnYsIGZtLT5zcmMsIGZtLT5ueHQpOworICAgICAgICBmbS0+Z290X2ZyYW1lW0lOUFVUX01BSU5dID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBTTElESU5HX0ZSQU1FX1dJTkRPVyhmbS0+cHJ2MiwgZm0tPnNyYzIsIGZtLT5ueHQyKTsKKyAgICAgICAgZm0tPmdvdF9mcmFtZVtJTlBVVF9DTEVBTlNSQ10gPSAxOworICAgIH0KKyAgICBpZiAoIWZtLT5nb3RfZnJhbWVbSU5QVVRfTUFJTl0gfHwgKGZtLT5wcHNyYyAmJiAhZm0tPmdvdF9mcmFtZVtJTlBVVF9DTEVBTlNSQ10pKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmbS0+Z290X2ZyYW1lW0lOUFVUX01BSU5dID0gZm0tPmdvdF9mcmFtZVtJTlBVVF9DTEVBTlNSQ10gPSAwOworICAgIGluID0gZm0tPnNyYzsKKworICAgIC8qIHBhcml0eSAqLworICAgIG9yZGVyID0gZm0tPm9yZGVyICE9IEZNX1BBUklUWV9BVVRPID8gZm0tPm9yZGVyIDogKGluLT5pbnRlcmxhY2VkX2ZyYW1lID8gaW4tPnRvcF9maWVsZF9maXJzdCA6IDEpOworICAgIGZpZWxkID0gZm0tPmZpZWxkICE9IEZNX1BBUklUWV9BVVRPID8gZm0tPmZpZWxkIDogb3JkZXI7CisgICAgYXZfYXNzZXJ0MChvcmRlciA9PSAwIHx8IG9yZGVyID09IDEgfHwgZmllbGQgPT0gMCB8fCBmaWVsZCA9PSAxKTsKKyAgICBmeG8gPSBmaWVsZCBeIG9yZGVyID8gZnhvMW0gOiBmeG8wbTsKKworICAgIC8qIGRlYnVnIG1vZGU6IHdlIGdlbmVyYXRlIGFsbCB0aGUgZmllbGRzIGNvbWJpbmF0aW9ucyBhbmQgdGhlaXIgYXNzb2NpYXRlZAorICAgICAqIGNvbWJlZCBzY29yZS4gWFhYOiBpbmplY3QgYXMgZnJhbWUgbWV0YWRhdGE/ICovCisgICAgaWYgKGZtLT5jb21iZGJnKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjb21icyk7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPiBtTiAmJiBmbS0+Y29tYmRiZyA9PSBDT01CREJHX1BDTikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGdlbl9mcmFtZXNbaV0gPSBjcmVhdGVfd2VhdmVfZnJhbWUoY3R4LCBpLCBmaWVsZCwgZm0tPnBydiwgZm0tPnNyYywgZm0tPm54dCk7CisgICAgICAgICAgICBpZiAoIWdlbl9mcmFtZXNbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGNvbWJzW2ldID0gY2FsY19jb21iZWRfc2NvcmUoZm0sIGdlbl9mcmFtZXNbaV0pOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiQ09NQlM6ICUzZCAlM2QgJTNkICUzZCAlM2RcbiIsCisgICAgICAgICAgICAgICBjb21ic1swXSwgY29tYnNbMV0sIGNvbWJzWzJdLCBjb21ic1szXSwgY29tYnNbNF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGdlbl9mcmFtZXNbbUNdID0gYXZfZnJhbWVfY2xvbmUoZm0tPnNyYyk7CisgICAgICAgIGlmICghZ2VuX2ZyYW1lc1ttQ10pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIC8qIHAvYyBzZWxlY3Rpb24gYW5kIG9wdGlvbmFsIDMtd2F5IHAvYy9uIG1hdGNoZXMgKi8KKyAgICBtYXRjaCA9IGNvbXBhcmVfZmllbGRzKGZtLCBmeG9bbUNdLCBmeG9bbVBdLCBmaWVsZCk7CisgICAgaWYgKGZtLT5tb2RlID09IE1PREVfUENOIHx8IGZtLT5tb2RlID09IE1PREVfUENOX1VCKQorICAgICAgICBtYXRjaCA9IGNvbXBhcmVfZmllbGRzKGZtLCBtYXRjaCwgZnhvW21OXSwgZmllbGQpOworCisgICAgLyogc2NlbmUgY2hhbmdlIGNoZWNrICovCisgICAgaWYgKGZtLT5jb21ibWF0Y2ggPT0gQ09NQk1BVENIX1NDKSB7CisgICAgICAgIGlmIChmbS0+bGFzdG4gPT0gb3V0bGluay0+ZnJhbWVfY291bnQgLSAxKSB7CisgICAgICAgICAgICBpZiAoZm0tPmxhc3RzY2RpZmYgPiBmbS0+c2N0aHJlc2gpCisgICAgICAgICAgICAgICAgc2MgPSAxOworICAgICAgICB9IGVsc2UgaWYgKGx1bWFfYWJzX2RpZmYoZm0tPnBydiwgZm0tPnNyYykgPiBmbS0+c2N0aHJlc2gpIHsKKyAgICAgICAgICAgIHNjID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2MpIHsKKyAgICAgICAgICAgIGZtLT5sYXN0biA9IG91dGxpbmstPmZyYW1lX2NvdW50OworICAgICAgICAgICAgZm0tPmxhc3RzY2RpZmYgPSBsdW1hX2Fic19kaWZmKGZtLT5zcmMsIGZtLT5ueHQpOworICAgICAgICAgICAgc2MgPSBmbS0+bGFzdHNjZGlmZiA+IGZtLT5zY3RocmVzaDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmbS0+Y29tYm1hdGNoID09IENPTUJNQVRDSF9GVUxMIHx8IChmbS0+Y29tYm1hdGNoID09IENPTUJNQVRDSF9TQyAmJiBzYykpIHsKKyAgICAgICAgc3dpdGNoIChmbS0+bW9kZSkgeworICAgICAgICAvKiAyLXdheSBwL2MgbWF0Y2hlcyAqLworICAgICAgICBjYXNlIE1PREVfUEM6CisgICAgICAgICAgICBtYXRjaCA9IGNoZWNrbW0oY3R4LCBjb21icywgbWF0Y2gsIG1hdGNoID09IGZ4b1ttUF0gPyBmeG9bbUNdIDogZnhvW21QXSwgZ2VuX2ZyYW1lcywgZmllbGQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV9QQ19OOgorICAgICAgICAgICAgbWF0Y2ggPSBjaGVja21tKGN0eCwgY29tYnMsIG1hdGNoLCBmeG9bbU5dLCBnZW5fZnJhbWVzLCBmaWVsZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFX1BDX1U6CisgICAgICAgICAgICBtYXRjaCA9IGNoZWNrbW0oY3R4LCBjb21icywgbWF0Y2gsIGZ4b1ttVV0sIGdlbl9mcmFtZXMsIGZpZWxkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfUENfTl9VQjoKKyAgICAgICAgICAgIG1hdGNoID0gY2hlY2ttbShjdHgsIGNvbWJzLCBtYXRjaCwgZnhvW21OXSwgZ2VuX2ZyYW1lcywgZmllbGQpOworICAgICAgICAgICAgbWF0Y2ggPSBjaGVja21tKGN0eCwgY29tYnMsIG1hdGNoLCBmeG9bbVVdLCBnZW5fZnJhbWVzLCBmaWVsZCk7CisgICAgICAgICAgICBtYXRjaCA9IGNoZWNrbW0oY3R4LCBjb21icywgbWF0Y2gsIGZ4b1ttQl0sIGdlbl9mcmFtZXMsIGZpZWxkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiAzLXdheSBwL2MvbiBtYXRjaGVzICovCisgICAgICAgIGNhc2UgTU9ERV9QQ046CisgICAgICAgICAgICBtYXRjaCA9IGNoZWNrbW0oY3R4LCBjb21icywgbWF0Y2gsIG1hdGNoID09IGZ4b1ttUF0gPyBmeG9bbUNdIDogZnhvW21QXSwgZ2VuX2ZyYW1lcywgZmllbGQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV9QQ05fVUI6CisgICAgICAgICAgICBtYXRjaCA9IGNoZWNrbW0oY3R4LCBjb21icywgbWF0Y2gsIGZ4b1ttVV0sIGdlbl9mcmFtZXMsIGZpZWxkKTsKKyAgICAgICAgICAgIG1hdGNoID0gY2hlY2ttbShjdHgsIGNvbWJzLCBtYXRjaCwgZnhvW21CXSwgZ2VuX2ZyYW1lcywgZmllbGQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IG91dHB1dCBmcmFtZSBhbmQgZHJvcCB0aGUgb3RoZXJzICovCisgICAgaWYgKGZtLT5wcHNyYykgeworICAgICAgICAvKiBmaWVsZCBtYXRjaGluZyB3YXMgYmFzZWQgb24gYSBmaWx0ZXJlZC9wb3N0LXByb2Nlc3NlZCBpbnB1dCwgd2Ugbm93CisgICAgICAgICAqIHBpY2sgdGhlIHVudG91Y2hlZCBmaWVsZHMgZnJvbSB0aGUgY2xlYW4gc291cmNlICovCisgICAgICAgIGRzdCA9IGNyZWF0ZV93ZWF2ZV9mcmFtZShjdHgsIG1hdGNoLCBmaWVsZCwgZm0tPnBydjIsIGZtLT5zcmMyLCBmbS0+bnh0Mik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFnZW5fZnJhbWVzW21hdGNoXSkgeyAvLyBYWFg6IGlzIHRoYXQgcG9zc2libGU/CisgICAgICAgICAgICBkc3QgPSBjcmVhdGVfd2VhdmVfZnJhbWUoY3R4LCBtYXRjaCwgZmllbGQsIGZtLT5wcnYsIGZtLT5zcmMsIGZtLT5ueHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0ID0gZ2VuX2ZyYW1lc1ttYXRjaF07CisgICAgICAgICAgICBnZW5fZnJhbWVzW21hdGNoXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFkc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGdlbl9mcmFtZXMpOyBpKyspCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmdlbl9mcmFtZXNbaV0pOworCisgICAgLyogbWFyayB0aGUgZnJhbWUgd2UgYXJlIHVuYWJsZSB0byBtYXRjaCBwcm9wZXJseSBhcyBpbnRlcmxhY2VkIHNvIGEgcHJvcGVyCisgICAgICogZGUtaW50ZXJsYWNlciBjYW4gdGFrZSB0aGUgcmVsYXkgKi8KKyAgICBkc3QtPmludGVybGFjZWRfZnJhbWUgPSBjb21ic1ttYXRjaF0gPj0gZm0tPmNvbWJwZWw7CisgICAgaWYgKGRzdC0+aW50ZXJsYWNlZF9mcmFtZSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIkZyYW1lICMlIlBSSWQ2NCIgYXQgJXMgaXMgc3RpbGwgaW50ZXJsYWNlZFxuIiwKKyAgICAgICAgICAgICAgIG91dGxpbmstPmZyYW1lX2NvdW50LCBhdl90czJ0aW1lc3RyKGluLT5wdHMsICZpbmxpbmstPnRpbWVfYmFzZSkpOworICAgICAgICBkc3QtPnRvcF9maWVsZF9maXJzdCA9IGZpZWxkOworICAgIH0KKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlNDOiVkIHwgQ09NQlM6ICUzZCAlM2QgJTNkICUzZCAlM2QgKGNvbWJwZWw9JWQpIgorICAgICAgICAgICAiIG1hdGNoPSVkIGNvbWJlZD0lc1xuIiwgc2MsIGNvbWJzWzBdLCBjb21ic1sxXSwgY29tYnNbMl0sIGNvbWJzWzNdLCBjb21ic1s0XSwKKyAgICAgICAgICAgZm0tPmNvbWJwZWwsIG1hdGNoLCBkc3QtPmludGVybGFjZWRfZnJhbWUgPyAiWUVTIiA6ICJOTyIpOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBkc3QpOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfaW5saW5rKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgbGlkKQoreworICAgIGludCByZXQgPSAwOworICAgIEZpZWxkTWF0Y2hDb250ZXh0ICpmbSA9IGN0eC0+cHJpdjsKKworICAgIGlmICghZm0tPmdvdF9mcmFtZVtsaWRdKSB7CisgICAgICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbbGlkXTsKKyAgICAgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShpbmxpbmspOworICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GKSB7IC8vIGZsdXNoaW5nCisgICAgICAgICAgICBmbS0+ZW9mIHw9IDEgPDwgbGlkOworICAgICAgICAgICAgcmV0ID0gZmlsdGVyX2ZyYW1lKGlubGluaywgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBpbnQgcmV0OworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEZpZWxkTWF0Y2hDb250ZXh0ICpmbSA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCB1aW50MzJfdCBlb2ZfbWFzayA9IDE8PElOUFVUX01BSU4gfCBmbS0+cHBzcmM8PElOUFVUX0NMRUFOU1JDOworCisgICAgaWYgKChmbS0+ZW9mICYgZW9mX21hc2spID09IGVvZl9tYXNrKSAvLyBmbHVzaCBkb25lPworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgaWYgKChyZXQgPSByZXF1ZXN0X2lubGluayhjdHgsIElOUFVUX01BSU4pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKGZtLT5wcHNyYyAmJiAocmV0ID0gcmVxdWVzdF9pbmxpbmsoY3R4LCBJTlBVVF9DTEVBTlNSQykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIC8vIFRPRE86IHNlY29uZCBpbnB1dCBzb3VyY2UgY2FuIHN1cHBvcnQgPjhiaXQgZGVwdGgKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgIEFWX1BJWF9GTVRfWVVWNDIyUCwgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLCAgQVZfUElYX0ZNVF9ZVVY0MTBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgaW50IHJldDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEZpZWxkTWF0Y2hDb250ZXh0ICpmbSA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgY29uc3QgaW50IHcgPSBpbmxpbmstPnc7CisgICAgY29uc3QgaW50IGggPSBpbmxpbmstPmg7CisKKyAgICBmbS0+c2N0aHJlc2ggPSAoaW50NjRfdCkoKHcgKiBoICogMjU1LjAgKiBmbS0+c2N0aHJlc2hfZmx0KSAvIDEwMC4wKTsKKworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfYWxsb2MoZm0tPm1hcF9kYXRhLCAgIGZtLT5tYXBfbGluZXNpemUsICAgdywgaCwgaW5saW5rLT5mb3JtYXQsIDMyKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBhdl9pbWFnZV9hbGxvYyhmbS0+Y21hc2tfZGF0YSwgZm0tPmNtYXNrX2xpbmVzaXplLCB3LCBoLCBpbmxpbmstPmZvcm1hdCwgMzIpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmbS0+aHN1YiA9IHBpeF9kZXNjLT5sb2cyX2Nocm9tYV93OworICAgIGZtLT52c3ViID0gcGl4X2Rlc2MtPmxvZzJfY2hyb21hX2g7CisKKyAgICBmbS0+dHBpdGNoeSAgPSBGRkFMSUdOKHcsICAgICAgMTYpOworICAgIGZtLT50cGl0Y2h1diA9IEZGQUxJR04odyA+PiAxLCAxNik7CisKKyAgICBmbS0+dGJ1ZmZlciA9IGF2X21hbGxvYyhoLzIgKiBmbS0+dHBpdGNoeSk7CisgICAgZm0tPmNfYXJyYXkgPSBhdl9tYWxsb2MoKCgodyArIGZtLT5ibG9ja3gvMikvZm0tPmJsb2NreCkrMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGggKyBmbS0+YmxvY2t5LzIpL2ZtLT5ibG9ja3kpKzEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICogc2l6ZW9mKCpmbS0+Y19hcnJheSkpOworICAgIGlmICghZm0tPnRidWZmZXIgfHwgIWZtLT5jX2FycmF5KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBmaWVsZG1hdGNoX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgY29uc3QgRmllbGRNYXRjaENvbnRleHQgKmZtID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyUGFkIHBhZCA9IHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9IGF2X3N0cmR1cCgibWFpbiIpLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH07CisKKyAgICBpZiAoIXBhZC5uYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX2luc2VydF9pbnBhZChjdHgsIElOUFVUX01BSU4sICZwYWQpOworCisgICAgaWYgKGZtLT5wcHNyYykgeworICAgICAgICBwYWQubmFtZSA9IGF2X3N0cmR1cCgiY2xlYW5fc3JjIik7CisgICAgICAgIHBhZC5jb25maWdfcHJvcHMgPSBOVUxMOworICAgICAgICBpZiAoIXBhZC5uYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZmZfaW5zZXJ0X2lucGFkKGN0eCwgSU5QVVRfQ0xFQU5TUkMsICZwYWQpOworICAgIH0KKworICAgIGlmICgoZm0tPmJsb2NreCAmIChmbS0+YmxvY2t4IC0gMSkpIHx8CisgICAgICAgIChmbS0+YmxvY2t5ICYgKGZtLT5ibG9ja3kgLSAxKSkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiYmxvY2t4IGFuZCBibG9ja3kgc2V0dGluZ3MgbXVzdCBiZSBwb3dlciBvZiB0d29cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChmbS0+Y29tYnBlbCA+IGZtLT5ibG9ja3ggKiBmbS0+YmxvY2t5KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvbWJlZCBwaXhlbCBzaG91bGQgbm90IGJlIGxhcmdlciB0aGFuIGJsb2NreCB4IGJsb2NreVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZmllbGRtYXRjaF91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGk7CisgICAgRmllbGRNYXRjaENvbnRleHQgKmZtID0gY3R4LT5wcml2OworCisgICAgaWYgKGZtLT5wcnYgIT0gZm0tPnNyYykKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZm0tPnBydik7CisgICAgaWYgKGZtLT5ueHQgIT0gZm0tPnNyYykKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZm0tPm54dCk7CisgICAgYXZfZnJhbWVfZnJlZSgmZm0tPnNyYyk7CisgICAgYXZfZnJlZXAoJmZtLT5tYXBfZGF0YVswXSk7CisgICAgYXZfZnJlZXAoJmZtLT5jbWFza19kYXRhWzBdKTsKKyAgICBhdl9mcmVlcCgmZm0tPnRidWZmZXIpOworICAgIGF2X2ZyZWVwKCZmbS0+Y19hcnJheSk7CisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZjdHgtPmlucHV0X3BhZHNbaV0ubmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggID0gb3V0bGluay0+c3JjOworICAgIGNvbnN0IEZpZWxkTWF0Y2hDb250ZXh0ICpmbSA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVkZpbHRlckxpbmsgKmlubGluayA9CisgICAgICAgIGN0eC0+aW5wdXRzW2ZtLT5wcHNyYyA/IElOUFVUX0NMRUFOU1JDIDogSU5QVVRfTUFJTl07CisKKyAgICBvdXRsaW5rLT5mbGFncyB8PSBGRl9MSU5LX0ZMQUdfUkVRVUVTVF9MT09QOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IGlubGluay0+dGltZV9iYXNlOworICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IGlubGluay0+ZnJhbWVfcmF0ZTsKKyAgICBvdXRsaW5rLT53ID0gaW5saW5rLT53OworICAgIG91dGxpbmstPmggPSBpbmxpbmstPmg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBmaWVsZG1hdGNoX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfZmllbGRtYXRjaCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZmllbGRtYXRjaCIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZpZWxkIG1hdGNoaW5nIGZvciBpbnZlcnNlIHRlbGVjaW5lLiIpLAorICAgIC5xdWVyeV9mb3JtYXRzICA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgID0gc2l6ZW9mKEZpZWxkTWF0Y2hDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmaWVsZG1hdGNoX2luaXQsCisgICAgLnVuaW5pdCAgICAgICAgID0gZmllbGRtYXRjaF91bmluaXQsCisgICAgLmlucHV0cyAgICAgICAgID0gTlVMTCwKKyAgICAub3V0cHV0cyAgICAgICAgPSBmaWVsZG1hdGNoX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmZpZWxkbWF0Y2hfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX0lOUFVUUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZmllbGRvcmRlci5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2ZpZWxkb3JkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2M2MTJjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2ZpZWxkb3JkZXIuYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYXJrIEhpbXNsZXkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogdmlkZW8gZmllbGQgb3JkZXIgZmlsdGVyLCBoZWF2aWx5IGluZmx1ZW5jZWQgYnkgdmZfcGFkLmMKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCBGaWVsZE9yZGVyQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IGRzdF90ZmY7ICAgICAgICAgICAgICAgLy8vPCBvdXRwdXQgYmZmL3RmZgorICAgIGludCAgICAgICAgICBsaW5lX3NpemVbNF07IC8vLzwgYnl0ZXMgb2YgcGl4ZWwgZGF0YSBwZXIgbGluZSBmb3IgZWFjaCBwbGFuZQorfSBGaWVsZE9yZGVyQ29udGV4dDsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyRm9ybWF0cyAgKmZvcm1hdHM7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgaW50ICAgICAgICAgICAgICByZXQ7CisKKyAgICAvKiogYWNjZXB0IGFueSBpbnB1dCBwaXhlbCBmb3JtYXQgdGhhdCBpcyBub3QgaGFyZHdhcmUgYWNjZWxlcmF0ZWQsIG5vdAorICAgICAqICBhIGJpdHN0cmVhbSBmb3JtYXQsIGFuZCBkb2VzIG5vdCBoYXZlIHZlcnRpY2FsbHkgc3ViLXNhbXBsZWQgY2hyb21hICovCisgICAgaWYgKGN0eC0+aW5wdXRzWzBdKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IE5VTEw7CisgICAgICAgIGZvcm1hdHMgPSBOVUxMOworICAgICAgICB3aGlsZSAoKGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfbmV4dChkZXNjKSkpIHsKKyAgICAgICAgICAgIHBpeF9mbXQgPSBhdl9waXhfZm10X2Rlc2NfZ2V0X2lkKGRlc2MpOworICAgICAgICAgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCB8fAorICAgICAgICAgICAgICAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMICAgICB8fAorICAgICAgICAgICAgICAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQklUU1RSRUFNKSAmJgorICAgICAgICAgICAgICAgIGRlc2MtPm5iX2NvbXBvbmVudHMgJiYgIWRlc2MtPmxvZzJfY2hyb21hX2ggJiYKKyAgICAgICAgICAgICAgICAocmV0ID0gZmZfYWRkX2Zvcm1hdCgmZm9ybWF0cywgcGl4X2ZtdCkpIDwgMCkgeworICAgICAgICAgICAgICAgIGZmX2Zvcm1hdHNfdW5yZWYoJmZvcm1hdHMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJmN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cyk7CisgICAgICAgIGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZjdHgtPm91dHB1dHNbMF0tPmluX2Zvcm1hdHMpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgRmllbGRPcmRlckNvbnRleHQgKnMgICA9IGN0eC0+cHJpdjsKKworICAgIHJldHVybiBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhzLT5saW5lX3NpemUsIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncpOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAgKmN0eCAgICAgPSBpbmxpbmstPmRzdDsKKyAgICBGaWVsZE9yZGVyQ29udGV4dCAqcyAgICAgICA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgICAgICAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBpbnQgaCwgcGxhbmUsIHNyY19saW5lX3N0ZXAsIGRzdF9saW5lX3N0ZXAsIGxpbmVfc2l6ZSwgbGluZTsKKyAgICB1aW50OF90ICpkc3QsICpzcmM7CisgICAgQVZGcmFtZSAqb3V0OworCisgICAgaWYgKCFmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSB8fAorICAgICAgICBmcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ID09IHMtPmRzdF90ZmYpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAiU2tpcHBpbmcgJXMuXG4iLAorICAgICAgICAgICAgICAgZnJhbWUtPmludGVybGFjZWRfZnJhbWUgPworICAgICAgICAgICAgICAgImZyYW1lIHdpdGggc2FtZSBmaWVsZCBvcmRlciIgOiAicHJvZ3Jlc3NpdmUgZnJhbWUiKTsKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CisgICAgfQorCisgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGZyYW1lKSkgeworICAgICAgICBvdXQgPSBmcmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgZnJhbWUpOworICAgIH0KKworICAgIGF2X2Rsb2coY3R4LAorICAgICAgICAgICAgInBpY3R1cmUgd2lsbCBtb3ZlICVzIG9uZSBsaW5lXG4iLAorICAgICAgICAgICAgcy0+ZHN0X3RmZiA/ICJ1cCIgOiAiZG93biIpOworICAgIGggPSBmcmFtZS0+aGVpZ2h0OworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQgJiYgZnJhbWUtPmRhdGFbcGxhbmVdICYmIGZyYW1lLT5saW5lc2l6ZVtwbGFuZV07IHBsYW5lKyspIHsKKyAgICAgICAgZHN0X2xpbmVfc3RlcCA9IG91dC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICBzcmNfbGluZV9zdGVwID0gZnJhbWUtPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgbGluZV9zaXplID0gcy0+bGluZV9zaXplW3BsYW5lXTsKKyAgICAgICAgZHN0ID0gb3V0LT5kYXRhW3BsYW5lXTsKKyAgICAgICAgc3JjID0gZnJhbWUtPmRhdGFbcGxhbmVdOworICAgICAgICBpZiAocy0+ZHN0X3RmZikgeworICAgICAgICAgICAgLyoqIE1vdmUgZXZlcnkgbGluZSB1cCBvbmUgbGluZSwgd29ya2luZyBmcm9tCisgICAgICAgICAgICAgKiAgdGhlIHRvcCB0byB0aGUgYm90dG9tIG9mIHRoZSBmcmFtZS4KKyAgICAgICAgICAgICAqICBUaGUgb3JpZ2luYWwgdG9wIGxpbmUgaXMgbG9zdC4KKyAgICAgICAgICAgICAqICBUaGUgbmV3IGxhc3QgbGluZSBpcyBjcmVhdGVkIGFzIGEgY29weSBvZiB0aGUKKyAgICAgICAgICAgICAqICBwZW51bHRpbWF0ZSBsaW5lIGZyb20gdGhhdCBmaWVsZC4gKi8KKyAgICAgICAgICAgIGZvciAobGluZSA9IDA7IGxpbmUgPCBoOyBsaW5lKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoMSArIGxpbmUgPCBmcmFtZS0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYyArIHNyY19saW5lX3N0ZXAsIGxpbmVfc2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjIC0gMiAqIHNyY19saW5lX3N0ZXAsIGxpbmVfc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdCArPSBkc3RfbGluZV9zdGVwOworICAgICAgICAgICAgICAgIHNyYyArPSBzcmNfbGluZV9zdGVwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoqIE1vdmUgZXZlcnkgbGluZSBkb3duIG9uZSBsaW5lLCB3b3JraW5nIGZyb20KKyAgICAgICAgICAgICAqICB0aGUgYm90dG9tIHRvIHRoZSB0b3Agb2YgdGhlIGZyYW1lLgorICAgICAgICAgICAgICogIFRoZSBvcmlnaW5hbCBib3R0b20gbGluZSBpcyBsb3N0LgorICAgICAgICAgICAgICogIFRoZSBuZXcgZmlyc3QgbGluZSBpcyBjcmVhdGVkIGFzIGEgY29weSBvZiB0aGUKKyAgICAgICAgICAgICAqICBzZWNvbmQgbGluZSBmcm9tIHRoYXQgZmllbGQuICovCisgICAgICAgICAgICBkc3QgKz0gKGggLSAxKSAqIGRzdF9saW5lX3N0ZXA7CisgICAgICAgICAgICBzcmMgKz0gKGggLSAxKSAqIHNyY19saW5lX3N0ZXA7CisgICAgICAgICAgICBmb3IgKGxpbmUgPSBoIC0gMTsgbGluZSA+PSAwIDsgbGluZS0tKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYyAtIHNyY19saW5lX3N0ZXAsIGxpbmVfc2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjICsgMiAqIHNyY19saW5lX3N0ZXAsIGxpbmVfc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdCAtPSBkc3RfbGluZV9zdGVwOworICAgICAgICAgICAgICAgIHNyYyAtPSBzcmNfbGluZV9zdGVwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG91dC0+dG9wX2ZpZWxkX2ZpcnN0ID0gcy0+ZHN0X3RmZjsKKworICAgIGlmIChmcmFtZSAhPSBvdXQpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZpZWxkT3JkZXJDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZpZWxkb3JkZXJfb3B0aW9uc1tdID0geworICAgIHsgIm9yZGVyIiwgIm91dHB1dCBmaWVsZCBvcmRlciIsIE9GRlNFVChkc3RfdGZmKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDAsIDEsIEZMQUdTLCAib3JkZXIiIH0sCisgICAgICAgIHsgImJmZiIsICJib3R0b20gZmllbGQgZmlyc3QiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMCB9LCAuZmxhZ3M9RkxBR1MsIC51bml0ID0gIm9yZGVyIiB9LAorICAgICAgICB7ICJ0ZmYiLCAidG9wIGZpZWxkIGZpcnN0IiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDEgfSwgLmZsYWdzPUZMQUdTLCAudW5pdCA9ICJvcmRlciIgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGZpZWxkb3JkZXIpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfZmllbGRvcmRlcl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX2ZpZWxkb3JkZXJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2ZpZWxkb3JkZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiZmllbGRvcmRlciIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2V0IHRoZSBmaWVsZCBvcmRlci4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihGaWVsZE9yZGVyQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmZmllbGRvcmRlcl9jbGFzcywKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl92Zl9maWVsZG9yZGVyX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX3ZmX2ZpZWxkb3JkZXJfb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9mb3JtYXQuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9mb3JtYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmNiN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2Zvcm1hdC5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IEJvYmJ5IEJpbmdoYW0KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogZm9ybWF0IGFuZCBub2Zvcm1hdCB2aWRlbyBmaWx0ZXJzCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCBGb3JtYXRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBjaGFyICpwaXhfZm10czsKKworICAgIC8qKgorICAgICAqIHBpeF9mbXRzIHBhcnNlZCBpbnRvIEFWUGl4ZWxGb3JtYXRzIGFuZCB0ZXJtaW5hdGVkIHdpdGgKKyAgICAgKiBBVl9QSVhfRk1UX05PTkUKKyAgICAgKi8KKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKmZvcm1hdHM7Cit9IEZvcm1hdENvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEZvcm1hdENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgYXZfZnJlZXAoJnMtPmZvcm1hdHMpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBGb3JtYXRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNoYXIgKmN1ciwgKnNlcDsKKyAgICBpbnQgbmJfZm9ybWF0cyA9IDE7CisgICAgaW50IGk7CisgICAgaW50IHJldDsKKworICAgIGlmICghcy0+cGl4X2ZtdHMpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRW1wdHkgb3V0cHV0IGZvcm1hdCBzdHJpbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvKiBjb3VudCB0aGUgZm9ybWF0cyAqLworICAgIGN1ciA9IHMtPnBpeF9mbXRzOworICAgIHdoaWxlICgoY3VyID0gc3RyY2hyKGN1ciwgJ3wnKSkpIHsKKyAgICAgICAgbmJfZm9ybWF0cysrOworICAgICAgICBpZiAoKmN1cikKKyAgICAgICAgICAgIGN1cisrOworICAgIH0KKworICAgIHMtPmZvcm1hdHMgPSBhdl9tYWxsb2NfYXJyYXkobmJfZm9ybWF0cyArIDEsIHNpemVvZigqcy0+Zm9ybWF0cykpOworICAgIGlmICghcy0+Zm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8qIHBhcnNlIHRoZSBsaXN0IG9mIGZvcm1hdHMgKi8KKyAgICBjdXIgPSBzLT5waXhfZm10czsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZm9ybWF0czsgaSsrKSB7CisgICAgICAgIHNlcCA9IHN0cmNocihjdXIsICd8Jyk7CisgICAgICAgIGlmIChzZXApCisgICAgICAgICAgICAqc2VwKysgPSAwOworCisgICAgICAgIGlmICgocmV0ID0gZmZfcGFyc2VfcGl4ZWxfZm9ybWF0KCZzLT5mb3JtYXRzW2ldLCBjdXIsIGN0eCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgY3VyID0gc2VwOworICAgIH0KKyAgICBzLT5mb3JtYXRzW25iX2Zvcm1hdHNdID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgaWYgKCFzdHJjbXAoY3R4LT5maWx0ZXItPm5hbWUsICJub2Zvcm1hdCIpKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IE5VTEw7CisgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqZm9ybWF0c19hbGxvd2VkOworICAgICAgICBpbnQgbmJfZm9ybWF0c19sYXZ1ID0gMCwgbmJfZm9ybWF0c19hbGxvd2VkID0gMDsKKworICAgICAgICAvKiBjb3VudCB0aGUgZm9ybWF0cyBrbm93biB0byBsYXZ1ICovCisgICAgICAgIHdoaWxlICgoZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19uZXh0KGRlc2MpKSkKKyAgICAgICAgICAgIG5iX2Zvcm1hdHNfbGF2dSsrOworCisgICAgICAgIGZvcm1hdHNfYWxsb3dlZCA9IGF2X21hbGxvY19hcnJheShuYl9mb3JtYXRzX2xhdnUgKyAxLCBzaXplb2YoKmZvcm1hdHNfYWxsb3dlZCkpOworICAgICAgICBpZiAoIWZvcm1hdHNfYWxsb3dlZCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgLyogZm9yIGVhY2ggZm9ybWF0IGtub3duIHRvIGxhdnUsIGNoZWNrIGlmIGl0J3MgaW4gdGhlIGxpc3Qgb2YKKyAgICAgICAgICogZm9yYmlkZGVuIGZvcm1hdHMgKi8KKyAgICAgICAgd2hpbGUgKChkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX25leHQoZGVzYykpKSB7CisgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCA9IGF2X3BpeF9mbXRfZGVzY19nZXRfaWQoZGVzYyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9mb3JtYXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+Zm9ybWF0c1tpXSA9PSBwaXhfZm10KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpIDwgbmJfZm9ybWF0cykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgZm9ybWF0c19hbGxvd2VkW25iX2Zvcm1hdHNfYWxsb3dlZCsrXSA9IHBpeF9mbXQ7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0c19hbGxvd2VkW25iX2Zvcm1hdHNfYWxsb3dlZF0gPSBBVl9QSVhfRk1UX05PTkU7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5mb3JtYXRzKTsKKyAgICAgICAgcy0+Zm9ybWF0cyA9IGZvcm1hdHNfYWxsb3dlZDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEZvcm1hdENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzLT5mb3JtYXRzKTsKKworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworICAgIHJldHVybiAwOworfQorCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZvcm1hdENvbnRleHQsIHgpCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInBpeF9mbXRzIiwgIkEgJ3wnLXNlcGFyYXRlZCBsaXN0IG9mIHBpeGVsIGZvcm1hdHMiLCBPRkZTRVQocGl4X2ZtdHMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIC5mbGFncyA9IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNpZiBDT05GSUdfRk9STUFUX0ZJTFRFUgorCisjZGVmaW5lIGZvcm1hdF9vcHRpb25zIG9wdGlvbnMKK0FWRklMVEVSX0RFRklORV9DTEFTUyhmb3JtYXQpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfZm9ybWF0X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZ2V0X3ZpZGVvX2J1ZmZlciA9IGZmX251bGxfZ2V0X3ZpZGVvX2J1ZmZlciwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfZm9ybWF0X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTworICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2Zvcm1hdCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJmb3JtYXQiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvbnZlcnQgdGhlIGlucHV0IHZpZGVvIHRvIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsIGZvcm1hdHMuIiksCisKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihGb3JtYXRDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZmb3JtYXRfY2xhc3MsCisKKyAgICAuaW5wdXRzICAgICAgICA9IGF2ZmlsdGVyX3ZmX2Zvcm1hdF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl92Zl9mb3JtYXRfb3V0cHV0cywKK307CisjZW5kaWYgLyogQ09ORklHX0ZPUk1BVF9GSUxURVIgKi8KKworI2lmIENPTkZJR19OT0ZPUk1BVF9GSUxURVIKKworI2RlZmluZSBub2Zvcm1hdF9vcHRpb25zIG9wdGlvbnMKK0FWRklMVEVSX0RFRklORV9DTEFTUyhub2Zvcm1hdCk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9ub2Zvcm1hdF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmdldF92aWRlb19idWZmZXIgPSBmZl9udWxsX2dldF92aWRlb19idWZmZXIsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX25vZm9ybWF0X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTworICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX25vZm9ybWF0ID0geworICAgIC5uYW1lICAgICAgICAgID0gIm5vZm9ybWF0IiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGb3JjZSBsaWJhdmZpbHRlciBub3QgdG8gdXNlIGFueSBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsIGZvcm1hdHMgZm9yIHRoZSBpbnB1dCB0byB0aGUgbmV4dCBmaWx0ZXIuIiksCisKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihGb3JtYXRDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZub2Zvcm1hdF9jbGFzcywKKworICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfdmZfbm9mb3JtYXRfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfdmZfbm9mb3JtYXRfb3V0cHV0cywKK307CisjZW5kaWYgLyogQ09ORklHX05PRk9STUFUX0ZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2Zwcy5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2Zwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODYzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZnBzLmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBCb2JieSBCaW5naGFtCisgKiBDb3B5cmlnaHQgMjAxMiBSb2JlcnQgTmFneSA8cm9uYWc4OSBnbWFpbCBjb20+CisgKiBDb3B5cmlnaHQgMjAxMiBBbnRvbiBLaGlybm92IDxhbnRvbiBraGlybm92IG5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogYSBmaWx0ZXIgZW5mb3JjaW5nIGdpdmVuIGNvbnN0YW50IGZyYW1lcmF0ZQorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9maWZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgRlBTQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBBVkZpZm9CdWZmZXIgKmZpZm87ICAgICAvLy88IHN0b3JlIGZyYW1lcyB1bnRpbCB3ZSBnZXQgdHdvIHN1Y2Nlc3NpdmUgdGltZXN0YW1wcworCisgICAgLyogdGltZXN0YW1wcyBpbiBpbnB1dCB0aW1lYmFzZSAqLworICAgIGludDY0X3QgZmlyc3RfcHRzOyAgICAgIC8vLzwgcHRzIG9mIHRoZSBmaXJzdCBmcmFtZSB0aGF0IGFycml2ZWQgb24gdGhpcyBmaWx0ZXIKKworICAgIGRvdWJsZSBzdGFydF90aW1lOyAgICAgIC8vLzwgcHRzLCBpbiBzZWNvbmRzLCBvZiB0aGUgZXhwZWN0ZWQgZmlyc3QgZnJhbWUKKworICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOyAgIC8vLzwgdGFyZ2V0IGZyYW1lcmF0ZQorICAgIGludCByb3VuZGluZzsgICAgICAgICAgIC8vLzwgQVZSb3VuZGluZyBtZXRob2QgZm9yIHRpbWVzdGFtcHMKKworICAgIC8qIHN0YXRpc3RpY3MgKi8KKyAgICBpbnQgZnJhbWVzX2luOyAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBmcmFtZXMgb24gaW5wdXQKKyAgICBpbnQgZnJhbWVzX291dDsgICAgICAgICAgICAvLy88IG51bWJlciBvZiBmcmFtZXMgb24gb3V0cHV0CisgICAgaW50IGR1cDsgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgZnJhbWVzIGR1cGxpY2F0ZWQKKyAgICBpbnQgZHJvcDsgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBmcmFtZWQgZHJvcHBlZAorfSBGUFNDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGUFNDb250ZXh0LCB4KQorI2RlZmluZSBWIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisjZGVmaW5lIEYgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZnBzX29wdGlvbnNbXSA9IHsKKyAgICB7ICJmcHMiLCAiQSBzdHJpbmcgZGVzY3JpYmluZyBkZXNpcmVkIG91dHB1dCBmcmFtZXJhdGUiLCBPRkZTRVQoZnJhbWVyYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgeyAuc3RyID0gIjI1IiB9LCAuZmxhZ3MgPSBWfEYgfSwKKyAgICB7ICJzdGFydF90aW1lIiwgIkFzc3VtZSB0aGUgZmlyc3QgUFRTIHNob3VsZCBiZSB0aGlzIHZhbHVlLiIsIE9GRlNFVChzdGFydF90aW1lKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSBEQkxfTUFYfSwgLURCTF9NQVgsIERCTF9NQVgsIFYgfSwKKyAgICB7ICJyb3VuZCIsICJzZXQgcm91bmRpbmcgbWV0aG9kIGZvciB0aW1lc3RhbXBzIiwgT0ZGU0VUKHJvdW5kaW5nKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBBVl9ST1VORF9ORUFSX0lORiB9LCAwLCA1LCBWfEYsICJyb3VuZCIgfSwKKyAgICB7ICJ6ZXJvIiwgInJvdW5kIHRvd2FyZHMgMCIsICAgICAgT0ZGU0VUKHJvdW5kaW5nKSwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX1JPVU5EX1pFUk8gICAgIH0sIDAsIDUsIFZ8RiwgInJvdW5kIiB9LAorICAgIHsgImluZiIsICAicm91bmQgYXdheSBmcm9tIDAiLCAgICBPRkZTRVQocm91bmRpbmcpLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfUk9VTkRfSU5GICAgICAgfSwgMCwgNSwgVnxGLCAicm91bmQiIH0sCisgICAgeyAiZG93biIsICJyb3VuZCB0b3dhcmRzIC1pbmZ0eSIsIE9GRlNFVChyb3VuZGluZyksIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9ST1VORF9ET1dOICAgICB9LCAwLCA1LCBWfEYsICJyb3VuZCIgfSwKKyAgICB7ICJ1cCIsICAgInJvdW5kIHRvd2FyZHMgK2luZnR5IiwgT0ZGU0VUKHJvdW5kaW5nKSwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX1JPVU5EX1VQICAgICAgIH0sIDAsIDUsIFZ8RiwgInJvdW5kIiB9LAorICAgIHsgIm5lYXIiLCAicm91bmQgdG8gbmVhcmVzdCIsICAgICBPRkZTRVQocm91bmRpbmcpLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfUk9VTkRfTkVBUl9JTkYgfSwgMCwgNSwgVnxGLCAicm91bmQiIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhmcHMpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBGUFNDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKCEocy0+ZmlmbyA9IGF2X2ZpZm9fYWxsb2NfYXJyYXkoMiwgc2l6ZW9mKEFWRnJhbWUqKSkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+Zmlyc3RfcHRzICAgID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgImZwcz0lZC8lZFxuIiwgcy0+ZnJhbWVyYXRlLm51bSwgcy0+ZnJhbWVyYXRlLmRlbik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX2ZpZm8oQVZGaWZvQnVmZmVyICpmaWZvKQoreworICAgIHdoaWxlIChhdl9maWZvX3NpemUoZmlmbykpIHsKKyAgICAgICAgQVZGcmFtZSAqdG1wOworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChmaWZvLCAmdG1wLCBzaXplb2YodG1wKSwgTlVMTCk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnRtcCk7CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBGUFNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGlmIChzLT5maWZvKSB7CisgICAgICAgIHMtPmRyb3AgKz0gYXZfZmlmb19zaXplKHMtPmZpZm8pIC8gc2l6ZW9mKEFWRnJhbWUqKTsKKyAgICAgICAgZmx1c2hfZmlmbyhzLT5maWZvKTsKKyAgICAgICAgYXZfZmlmb19mcmVlcCgmcy0+Zmlmbyk7CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIlZCBmcmFtZXMgaW4sICVkIGZyYW1lcyBvdXQ7ICVkIGZyYW1lcyBkcm9wcGVkLCAiCisgICAgICAgICAgICIlZCBmcmFtZXMgZHVwbGljYXRlZC5cbiIsIHMtPmZyYW1lc19pbiwgcy0+ZnJhbWVzX291dCwgcy0+ZHJvcCwgcy0+ZHVwKTsKK30KKworc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rKiBsaW5rKQoreworICAgIEZQU0NvbnRleHQgICAqcyA9IGxpbmstPnNyYy0+cHJpdjsKKworICAgIGxpbmstPnRpbWVfYmFzZSA9IGF2X2ludl9xKHMtPmZyYW1lcmF0ZSk7CisgICAgbGluay0+ZnJhbWVfcmF0ZT0gcy0+ZnJhbWVyYXRlOworICAgIGxpbmstPncgICAgICAgICA9IGxpbmstPnNyYy0+aW5wdXRzWzBdLT53OworICAgIGxpbmstPmggICAgICAgICA9IGxpbmstPnNyYy0+aW5wdXRzWzBdLT5oOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgRlBTQ29udGV4dCAgICAgICAgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGZyYW1lc19vdXQgPSBzLT5mcmFtZXNfb3V0OworICAgIGludCByZXQgPSAwOworCisgICAgd2hpbGUgKHJldCA+PSAwICYmIHMtPmZyYW1lc19vdXQgPT0gZnJhbWVzX291dCkKKyAgICAgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7CisKKyAgICAvKiBmbHVzaCB0aGUgZmlmbyAqLworICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgYXZfZmlmb19zaXplKHMtPmZpZm8pKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBhdl9maWZvX3NpemUocy0+Zmlmbyk7IGkrKykgeworICAgICAgICAgICAgQVZGcmFtZSAqYnVmOworCisgICAgICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzLT5maWZvLCAmYnVmLCBzaXplb2YoYnVmKSwgTlVMTCk7CisgICAgICAgICAgICBidWYtPnB0cyA9IGF2X3Jlc2NhbGVfcShzLT5maXJzdF9wdHMsIGN0eC0+aW5wdXRzWzBdLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UpICsgcy0+ZnJhbWVzX291dDsKKworICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgYnVmKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIHMtPmZyYW1lc19vdXQrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdyaXRlX3RvX2ZpZm8oQVZGaWZvQnVmZmVyICpmaWZvLCBBVkZyYW1lICpidWYpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICghYXZfZmlmb19zcGFjZShmaWZvKSAmJgorICAgICAgICAocmV0ID0gYXZfZmlmb19yZWFsbG9jMihmaWZvLCAyKmF2X2ZpZm9fc2l6ZShmaWZvKSkpKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGZpZm8sICZidWYsIHNpemVvZihidWYpLCBOVUxMKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmJ1ZikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICAgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEZQU0NvbnRleHQgICAgICAgICAgICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAgICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIGludDY0X3QgZGVsdGE7CisgICAgaW50IGksIHJldDsKKworICAgIHMtPmZyYW1lc19pbisrOworICAgIC8qIGRpc2NhcmQgZnJhbWVzIHVudGlsIHdlIGdldCB0aGUgZmlyc3QgdGltZXN0YW1wICovCisgICAgaWYgKHMtPmZpcnN0X3B0cyA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBpZiAoYnVmLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIHJldCA9IHdyaXRlX3RvX2ZpZm8ocy0+ZmlmbywgYnVmKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIGlmIChzLT5zdGFydF90aW1lICE9IERCTF9NQVggJiYgcy0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgICAgIGRvdWJsZSBmaXJzdF9wdHMgPSBzLT5zdGFydF90aW1lICogQVZfVElNRV9CQVNFOworICAgICAgICAgICAgICAgIGZpcnN0X3B0cyA9IEZGTUlOKEZGTUFYKGZpcnN0X3B0cywgSU5UNjRfTUlOKSwgSU5UNjRfTUFYKTsKKyAgICAgICAgICAgICAgICBzLT5maXJzdF9wdHMgPSBhdl9yZXNjYWxlX3EoZmlyc3RfcHRzLCBBVl9USU1FX0JBU0VfUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT50aW1lX2Jhc2UpOworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiU2V0IGZpcnN0IHB0cyB0byAoaW46JSJQUklkNjQiIG91dDolIlBSSWQ2NCIpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5maXJzdF9wdHMsIGF2X3Jlc2NhbGVfcShmaXJzdF9wdHMsIEFWX1RJTUVfQkFTRV9RLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcy0+Zmlyc3RfcHRzID0gYnVmLT5wdHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIkRpc2NhcmRpbmcgaW5pdGlhbCBmcmFtZShzKSB3aXRoIG5vICIKKyAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wLlxuIik7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZidWYpOworICAgICAgICAgICAgcy0+ZHJvcCsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIG5vdyB3YWl0IGZvciB0aGUgbmV4dCB0aW1lc3RhbXAgKi8KKyAgICBpZiAoYnVmLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgfHwgYXZfZmlmb19zaXplKHMtPmZpZm8pIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIHdyaXRlX3RvX2ZpZm8ocy0+ZmlmbywgYnVmKTsKKyAgICB9CisKKyAgICAvKiBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcyAqLworICAgIGRlbHRhID0gYXZfcmVzY2FsZV9xX3JuZChidWYtPnB0cyAtIHMtPmZpcnN0X3B0cywgaW5saW5rLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZSwgcy0+cm91bmRpbmcpIC0gcy0+ZnJhbWVzX291dCA7CisKKyAgICBpZiAoZGVsdGEgPCAxKSB7CisgICAgICAgIC8qIGRyb3AgdGhlIGZyYW1lIGFuZCBldmVyeXRoaW5nIGJ1ZmZlcmVkIGV4Y2VwdCB0aGUgZmlyc3QgKi8KKyAgICAgICAgQVZGcmFtZSAqdG1wOworICAgICAgICBpbnQgZHJvcCA9IGF2X2ZpZm9fc2l6ZShzLT5maWZvKS9zaXplb2YoQVZGcmFtZSopOworCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIkRyb3BwaW5nICVkIGZyYW1lKHMpLlxuIiwgZHJvcCk7CisgICAgICAgIHMtPmRyb3AgKz0gZHJvcDsKKworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzLT5maWZvLCAmdG1wLCBzaXplb2YodG1wKSwgTlVMTCk7CisgICAgICAgIGZsdXNoX2ZpZm8ocy0+Zmlmbyk7CisgICAgICAgIHJldCA9IHdyaXRlX3RvX2ZpZm8ocy0+ZmlmbywgdG1wKTsKKworICAgICAgICBhdl9mcmFtZV9mcmVlKCZidWYpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIGNhbiBvdXRwdXQgPj0gMSBmcmFtZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVsdGE7IGkrKykgeworICAgICAgICBBVkZyYW1lICpidWZfb3V0OworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzLT5maWZvLCAmYnVmX291dCwgc2l6ZW9mKGJ1Zl9vdXQpLCBOVUxMKTsKKworICAgICAgICAvKiBkdXBsaWNhdGUgdGhlIGZyYW1lIGlmIG5lZWRlZCAqLworICAgICAgICBpZiAoIWF2X2ZpZm9fc2l6ZShzLT5maWZvKSAmJiBpIDwgZGVsdGEgLSAxKSB7CisgICAgICAgICAgICBBVkZyYW1lICpkdXAgPSBhdl9mcmFtZV9jbG9uZShidWZfb3V0KTsKKworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiRHVwbGljYXRpbmcgZnJhbWUuXG4iKTsKKyAgICAgICAgICAgIGlmIChkdXApCisgICAgICAgICAgICAgICAgcmV0ID0gd3JpdGVfdG9fZmlmbyhzLT5maWZvLCBkdXApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZidWZfb3V0KTsKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZidWYpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHMtPmR1cCsrOworICAgICAgICB9CisKKyAgICAgICAgYnVmX291dC0+cHRzID0gYXZfcmVzY2FsZV9xKHMtPmZpcnN0X3B0cywgaW5saW5rLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UpICsgcy0+ZnJhbWVzX291dDsKKworICAgICAgICBpZiAoKHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBidWZfb3V0KSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZidWYpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmZyYW1lc19vdXQrKzsKKyAgICB9CisgICAgZmx1c2hfZmlmbyhzLT5maWZvKTsKKworICAgIHJldCA9IHdyaXRlX3RvX2ZpZm8ocy0+ZmlmbywgYnVmKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9mcHNfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9mcHNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX3Byb3BzCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfZnBzID0geworICAgIC5uYW1lICAgICAgICA9ICJmcHMiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGb3JjZSBjb25zdGFudCBmcmFtZXJhdGUuIiksCisgICAgLmluaXQgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgPSB1bmluaXQsCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKEZQU0NvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICA9ICZmcHNfY2xhc3MsCisgICAgLmlucHV0cyAgICAgID0gYXZmaWx0ZXJfdmZfZnBzX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgPSBhdmZpbHRlcl92Zl9mcHNfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZnJhbWVwYWNrLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZnJhbWVwYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3ZDRlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9mcmFtZXBhY2suYwpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBWaXR0b3JpbyBHaW92YXJhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEdlbmVyYXRlIGEgZnJhbWUgcGFja2VkIHZpZGVvLCBieSBjb21iaW5pbmcgdHdvIHZpZXdzIGluIGEgc2luZ2xlIHN1cmZhY2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhdGlvbmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3N0ZXJlbzNkLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKKyNkZWZpbmUgTEVGVCAgMAorI2RlZmluZSBSSUdIVCAxCisKK3R5cGVkZWYgc3RydWN0IEZyYW1lcGFja0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhfZGVzYzsgLy8vPCBhZ3JlZWQgcGl4ZWwgZm9ybWF0CisKKyAgICBlbnVtIEFWU3RlcmVvM0RUeXBlIGZvcm1hdDsgICAgICAgICAvLy88IGZyYW1lIHBhY2sgdHlwZSBvdXRwdXQKKworICAgIEFWRnJhbWUgKmlucHV0X3ZpZXdzWzJdOyAgICAgICAgICAgIC8vLzwgaW5wdXQgZnJhbWVzCisKKyAgICBpbnQ2NF90IGRvdWJsZV9wdHM7ICAgICAgICAgICAgICAgICAvLy88IG5ldyBwdHMgZm9yIGZyYW1lc2VxIG1vZGUKK30gRnJhbWVwYWNrQ29udGV4dDsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXRzX3N1cHBvcnRlZFtdID0geworICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgIEFWX1BJWF9GTVRfWVVWNDIyUCwgIEFWX1BJWF9GTVRfWVVWNDQ0UCwKKyAgICBBVl9QSVhfRk1UX1lVVjQxMFAsICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgLy8gdGhpcyB3aWxsIGVuc3VyZSB0aGF0IGZvcm1hdHMgYXJlIHRoZSBzYW1lIG9uIGFsbCBwYWRzCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChmb3JtYXRzX3N1cHBvcnRlZCkpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGZyYW1lcGFja191bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRnJhbWVwYWNrQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIC8vIGNsZWFuIGFueSBsZWZ0b3ZlciBmcmFtZQorICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmlucHV0X3ZpZXdzW0xFRlRdKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5pbnB1dF92aWV3c1tSSUdIVF0pOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEZyYW1lcGFja0NvbnRleHQgKnMgID0gb3V0bGluay0+c3JjLT5wcml2OworCisgICAgaW50IHdpZHRoICAgICAgICAgICAgPSBjdHgtPmlucHV0c1tMRUZUXS0+dzsKKyAgICBpbnQgaGVpZ2h0ICAgICAgICAgICA9IGN0eC0+aW5wdXRzW0xFRlRdLT5oOworICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlID0gY3R4LT5pbnB1dHNbTEVGVF0tPnRpbWVfYmFzZTsKKworICAgIC8vIGNoZWNrIHNpemUgYW5kIGZwcyBtYXRjaCBvbiB0aGUgb3RoZXIgaW5wdXQKKyAgICBpZiAod2lkdGggICE9IGN0eC0+aW5wdXRzW1JJR0hUXS0+dyB8fAorICAgICAgICBoZWlnaHQgIT0gY3R4LT5pbnB1dHNbUklHSFRdLT5oKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJMZWZ0IGFuZCByaWdodCBzaXplcyBkaWZmZXIgKCVkeCVkIHZzICVkeCVkKS5cbiIsCisgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgY3R4LT5pbnB1dHNbUklHSFRdLT53LCBjdHgtPmlucHV0c1tSSUdIVF0tPmgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9IGVsc2UgaWYgKGF2X2NtcF9xKHRpbWVfYmFzZSwgY3R4LT5pbnB1dHNbUklHSFRdLT50aW1lX2Jhc2UpICE9IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkxlZnQgYW5kIHJpZ2h0IGZyYW1lcmF0ZXMgZGlmZmVyICglZC8lZCB2cyAlZC8lZCkuXG4iLAorICAgICAgICAgICAgICAgdGltZV9iYXNlLm51bSwgdGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgIGN0eC0+aW5wdXRzW1JJR0hUXS0+dGltZV9iYXNlLm51bSwKKyAgICAgICAgICAgICAgIGN0eC0+aW5wdXRzW1JJR0hUXS0+dGltZV9iYXNlLmRlbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChvdXRsaW5rLT5mb3JtYXQpOworICAgIGlmICghcy0+cGl4X2Rlc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKworICAgIC8vIG1vZGlmeSBvdXRwdXQgcHJvcGVydGllcyBhcyBuZWVkZWQKKyAgICBzd2l0Y2ggKHMtPmZvcm1hdCkgeworICAgIGNhc2UgQVZfU1RFUkVPM0RfRlJBTUVTRVFVRU5DRToKKyAgICAgICAgdGltZV9iYXNlLmRlbiAqPSAyOworICAgICAgICBzLT5kb3VibGVfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfQ09MVU1OUzoKKyAgICBjYXNlIEFWX1NURVJFTzNEX1NJREVCWVNJREU6CisgICAgICAgIHdpZHRoICo9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfTElORVM6CisgICAgY2FzZSBBVl9TVEVSRU8zRF9UT1BCT1RUT006CisgICAgICAgIGhlaWdodCAqPSAyOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIHBhY2tpbmcgbW9kZS4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgb3V0bGluay0+dyAgICAgICAgID0gd2lkdGg7CisgICAgb3V0bGluay0+aCAgICAgICAgID0gaGVpZ2h0OworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IHRpbWVfYmFzZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBob3Jpem9udGFsX2ZyYW1lX3BhY2soRnJhbWVwYWNrQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVybGVhdmVkKQoreworICAgIGludCBwbGFuZSwgaTsKKyAgICBpbnQgbGVuZ3RoID0gZHN0LT53aWR0aCAvIDI7CisgICAgaW50IGxpbmVzICA9IGRzdC0+aGVpZ2h0OworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+cGl4X2Rlc2MtPm5iX2NvbXBvbmVudHM7IHBsYW5lKyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqbGVmdHAgID0gcy0+aW5wdXRfdmlld3NbTEVGVF0tPmRhdGFbcGxhbmVdOworICAgICAgICBjb25zdCB1aW50OF90ICpyaWdodHAgPSBzLT5pbnB1dF92aWV3c1tSSUdIVF0tPmRhdGFbcGxhbmVdOworICAgICAgICB1aW50OF90ICpkc3RwICAgICAgICAgPSBkc3QtPmRhdGFbcGxhbmVdOworCisgICAgICAgIGlmIChwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIpIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IC0oLShkc3QtPndpZHRoIC8gMikgPj4gcy0+cGl4X2Rlc2MtPmxvZzJfY2hyb21hX3cpOworICAgICAgICAgICAgbGluZXMgID0gLSgtKGRzdC0+aGVpZ2h0KSAgICA+PiBzLT5waXhfZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW50ZXJsZWF2ZWQpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgaW50IGsgPSAwOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdHBbaysrXSA9IGxlZnRwW2pdOworICAgICAgICAgICAgICAgICAgICBkc3RwW2srK10gPSByaWdodHBbal07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZHN0cCAgICs9IGRzdC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgICAgIGxlZnRwICArPSBzLT5pbnB1dF92aWV3c1tMRUZUXS0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgICAgIHJpZ2h0cCArPSBzLT5pbnB1dF92aWV3c1tSSUdIVF0tPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoZHN0LT5kYXRhW3BsYW5lXSwgZHN0LT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRwLCBzLT5pbnB1dF92aWV3c1tMRUZUXS0+bGluZXNpemVbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIGxpbmVzKTsKKyAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoZHN0LT5kYXRhW3BsYW5lXSArIGxlbmd0aCwgZHN0LT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0cCwgcy0+aW5wdXRfdmlld3NbUklHSFRdLT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgbGluZXMpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2ZXJ0aWNhbF9mcmFtZV9wYWNrKEZyYW1lcGFja0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVybGVhdmVkKQoreworICAgIGludCBwbGFuZSwgb2Zmc2V0OworICAgIGludCBsZW5ndGggPSBkc3QtPndpZHRoOworICAgIGludCBsaW5lcyAgPSBkc3QtPmhlaWdodCAvIDI7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBzLT5waXhfZGVzYy0+bmJfY29tcG9uZW50czsgcGxhbmUrKykgeworICAgICAgICBpZiAocGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyKSB7CisgICAgICAgICAgICBsZW5ndGggPSAtKC0oZHN0LT53aWR0aCkgICAgICA+PiBzLT5waXhfZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgICAgICAgICBsaW5lcyAgPSAtKC0oZHN0LT5oZWlnaHQgLyAyKSA+PiBzLT5waXhfZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgPSBpbnRlcmxlYXZlZCA/IGRzdC0+bGluZXNpemVbcGxhbmVdIDogZHN0LT5saW5lc2l6ZVtwbGFuZV0gKiBsaW5lczsKKworICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGRzdC0+ZGF0YVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5saW5lc2l6ZVtwbGFuZV0gPDwgaW50ZXJsZWF2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfdmlld3NbTEVGVF0tPmRhdGFbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmlucHV0X3ZpZXdzW0xFRlRdLT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBsaW5lcyk7CisgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoZHN0LT5kYXRhW3BsYW5lXSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmxpbmVzaXplW3BsYW5lXSA8PCBpbnRlcmxlYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnB1dF92aWV3c1tSSUdIVF0tPmRhdGFbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmlucHV0X3ZpZXdzW1JJR0hUXS0+bGluZXNpemVbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgbGluZXMpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBzcGF0aWFsX2ZyYW1lX3BhY2soRnJhbWVwYWNrQ29udGV4dCAqcywgQVZGcmFtZSAqZHN0KQoreworICAgIHN3aXRjaCAocy0+Zm9ybWF0KSB7CisgICAgY2FzZSBBVl9TVEVSRU8zRF9TSURFQllTSURFOgorICAgICAgICBob3Jpem9udGFsX2ZyYW1lX3BhY2socywgZHN0LCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TVEVSRU8zRF9DT0xVTU5TOgorICAgICAgICBob3Jpem9udGFsX2ZyYW1lX3BhY2socywgZHN0LCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TVEVSRU8zRF9UT1BCT1RUT006CisgICAgICAgIHZlcnRpY2FsX2ZyYW1lX3BhY2socywgZHN0LCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TVEVSRU8zRF9MSU5FUzoKKyAgICAgICAgdmVydGljYWxfZnJhbWVfcGFjayhzLCBkc3QsIDEpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lX2xlZnQoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEZyYW1lcGFja0NvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBzLT5pbnB1dF92aWV3c1tMRUZUXSA9IGZyYW1lOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZV9yaWdodChBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgRnJhbWVwYWNrQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIHMtPmlucHV0X3ZpZXdzW1JJR0hUXSA9IGZyYW1lOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEZyYW1lcGFja0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZTdGVyZW8zRCAqc3RlcmVvOworICAgIGludCByZXQsIGk7CisKKyAgICAvKiBnZXQgYSBmcmFtZSBvbiB0aGUgZWl0aGVyIGlucHV0LCBzdG9wIGFzIHNvb24gYXMgYSB2aWRlbyBlbmRzICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpZiAoIXMtPmlucHV0X3ZpZXdzW2ldKSB7CisgICAgICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzW2ldKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+Zm9ybWF0ID09IEFWX1NURVJFTzNEX0ZSQU1FU0VRVUVOQ0UpIHsKKyAgICAgICAgaWYgKHMtPmRvdWJsZV9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBzLT5kb3VibGVfcHRzID0gcy0+aW5wdXRfdmlld3NbTEVGVF0tPnB0czsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAvLyBzZXQgY29ycmVjdCB0aW1lc3RhbXBzCisgICAgICAgICAgICBzLT5pbnB1dF92aWV3c1tpXS0+cHRzID0gcy0+ZG91YmxlX3B0cysrOworCisgICAgICAgICAgICAvLyBzZXQgc3RlcmVvM2Qgc2lkZSBkYXRhCisgICAgICAgICAgICBzdGVyZW8gPSBhdl9zdGVyZW8zZF9jcmVhdGVfc2lkZV9kYXRhKHMtPmlucHV0X3ZpZXdzW2ldKTsKKyAgICAgICAgICAgIGlmICghc3RlcmVvKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBzLT5mb3JtYXQ7CisKKyAgICAgICAgICAgIC8vIGZpbHRlciB0aGUgZnJhbWUgYW5kIGltbWVkaWF0ZWx5IHJlbGlucXVpc2ggaXRzIHBvaW50ZXIKKyAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBzLT5pbnB1dF92aWV3c1tpXSk7CisgICAgICAgICAgICBzLT5pbnB1dF92aWV3c1tpXSA9IE5VTEw7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVZGcmFtZSAqZHN0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICAgICAgaWYgKCFkc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHNwYXRpYWxfZnJhbWVfcGFjayhzLCBkc3QpOworCisgICAgICAgIC8vIGdldCBhbnkgcHJvcGVydHkgZnJvbSB0aGUgb3JpZ2luYWwgZnJhbWUKKyAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhkc3QsIHMtPmlucHV0X3ZpZXdzW0xFRlRdKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmRzdCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmlucHV0X3ZpZXdzW2ldKTsKKworICAgICAgICAvLyBzZXQgc3RlcmVvM2Qgc2lkZSBkYXRhCisgICAgICAgIHN0ZXJlbyA9IGF2X3N0ZXJlbzNkX2NyZWF0ZV9zaWRlX2RhdGEoZHN0KTsKKyAgICAgICAgaWYgKCFzdGVyZW8pIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmRzdCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIHN0ZXJlby0+dHlwZSA9IHMtPmZvcm1hdDsKKworICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGRzdCk7CisgICAgfQorfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGcmFtZXBhY2tDb250ZXh0LCB4KQorI2RlZmluZSBWIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImZvcm1hdCIsICJGcmFtZSBwYWNrIG91dHB1dCBmb3JtYXQiLCBPRkZTRVQoZm9ybWF0KSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7IC5pNjQgPSBBVl9TVEVSRU8zRF9TSURFQllTSURFIH0sIDAsIElOVF9NQVgsIC5mbGFncyA9IFYsIC51bml0ID0gImZvcm1hdCIgfSwKKyAgICB7ICJzYnMiLCAiVmlld3MgYXJlIHBhY2tlZCBuZXh0IHRvIGVhY2ggb3RoZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwKKyAgICAgICAgeyAuaTY0ID0gQVZfU1RFUkVPM0RfU0lERUJZU0lERSB9LCBJTlRfTUlOLCBJTlRfTUFYLCAuZmxhZ3MgPSBWLCAudW5pdCA9ICJmb3JtYXQiIH0sCisgICAgeyAidGFiIiwgIlZpZXdzIGFyZSBwYWNrZWQgb24gdG9wIG9mIGVhY2ggb3RoZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwKKyAgICAgICAgeyAuaTY0ID0gQVZfU1RFUkVPM0RfVE9QQk9UVE9NIH0sIElOVF9NSU4sIElOVF9NQVgsIC5mbGFncyA9IFYsIC51bml0ID0gImZvcm1hdCIgfSwKKyAgICB7ICJmcmFtZXNlcSIsICJWaWV3cyBhcmUgb25lIGFmdGVyIHRoZSBvdGhlciIsIDAsIEFWX09QVF9UWVBFX0NPTlNULAorICAgICAgICB7IC5pNjQgPSBBVl9TVEVSRU8zRF9GUkFNRVNFUVVFTkNFIH0sIElOVF9NSU4sIElOVF9NQVgsIC5mbGFncyA9IFYsIC51bml0ID0gImZvcm1hdCIgfSwKKyAgICB7ICJsaW5lcyIsICJWaWV3cyBhcmUgaW50ZXJsZWF2ZWQgYnkgbGluZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwKKyAgICAgICAgeyAuaTY0ID0gQVZfU1RFUkVPM0RfTElORVMgfSwgSU5UX01JTiwgSU5UX01BWCwgLmZsYWdzID0gViwgLnVuaXQgPSAiZm9ybWF0IiB9LAorICAgIHsgImNvbHVtbnMiLCAiVmlld3MgYXJlIGludGVybGVhdmVkIGJ5IGNvbHVtbnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwKKyAgICAgICAgeyAuaTY0ID0gQVZfU1RFUkVPM0RfQ09MVU1OUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCAuZmxhZ3MgPSBWLCAudW5pdCA9ICJmb3JtYXQiIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmcmFtZXBhY2tfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZnJhbWVwYWNrIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBmcmFtZXBhY2tfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImxlZnQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lX2xlZnQsCisgICAgICAgIC5uZWVkc19maWZvICAgPSAxLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gInJpZ2h0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZV9yaWdodCwKKyAgICAgICAgLm5lZWRzX2ZpZm8gICA9IDEsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGZyYW1lcGFja19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJwYWNrZWQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfZnJhbWVwYWNrID0geworICAgIC5uYW1lICAgICAgICAgID0gImZyYW1lcGFjayIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR2VuZXJhdGUgYSBmcmFtZSBwYWNrZWQgc3RlcmVvc2NvcGljIHZpZGVvLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEZyYW1lcGFja0NvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmZyYW1lcGFja19jbGFzcywKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBmcmFtZXBhY2tfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gZnJhbWVwYWNrX291dHB1dHMsCisgICAgLnVuaW5pdCAgICAgICAgPSBmcmFtZXBhY2tfdW5pbml0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9mcmFtZXN0ZXAuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9mcmFtZXN0ZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTk0NWUxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2ZyYW1lc3RlcC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZSBmcmFtZXN0ZXAgZmlsdGVyLCBpbnNwaXJlZCBvbiBsaWJtcGNvZGVjcy92Zl9mcmFtZXN0ZXAuYyBieQorICogRGFuaWVsZSBGb3JuaWdoaWVyaSA8Z3VydSBBVCBkaWdpdGFsZmFudGFzeSBpdD4uCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgTnVsbENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBmcmFtZV9zdGVwOworfSBGcmFtZVN0ZXBDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGcmFtZVN0ZXBDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZyYW1lc3RlcF9vcHRpb25zW10gPSB7CisgICAgeyAic3RlcCIsICJzZXQgZnJhbWUgc3RlcCIsICBPRkZTRVQoZnJhbWVfc3RlcCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MX0sIDEsIElOVF9NQVgsIEZMQUdTfSwKKyAgICB7IE5VTEwgfSwKK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhmcmFtZXN0ZXApOworCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXRfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEZyYW1lU3RlcENvbnRleHQgKmZyYW1lc3RlcCA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworCisgICAgb3V0bGluay0+ZmxhZ3MgfD0gRkZfTElOS19GTEFHX1JFUVVFU1RfTE9PUDsKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0KKyAgICAgICAgYXZfZGl2X3EoaW5saW5rLT5mcmFtZV9yYXRlLCAoQVZSYXRpb25hbCl7ZnJhbWVzdGVwLT5mcmFtZV9zdGVwLCAxfSk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgInN0ZXA6JWQgZnJhbWVfcmF0ZTolZC8lZCglZikgLT4gZnJhbWVfcmF0ZTolZC8lZCglZilcbiIsCisgICAgICAgICAgIGZyYW1lc3RlcC0+ZnJhbWVfc3RlcCwKKyAgICAgICAgICAgaW5saW5rLT5mcmFtZV9yYXRlLm51bSwgaW5saW5rLT5mcmFtZV9yYXRlLmRlbiwgYXZfcTJkKGlubGluay0+ZnJhbWVfcmF0ZSksCisgICAgICAgICAgIG91dGxpbmstPmZyYW1lX3JhdGUubnVtLCBvdXRsaW5rLT5mcmFtZV9yYXRlLmRlbiwgYXZfcTJkKG91dGxpbmstPmZyYW1lX3JhdGUpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKnJlZikKK3sKKyAgICBGcmFtZVN0ZXBDb250ZXh0ICpmcmFtZXN0ZXAgPSBpbmxpbmstPmRzdC0+cHJpdjsKKworICAgIGlmICghKGlubGluay0+ZnJhbWVfY291bnQgJSBmcmFtZXN0ZXAtPmZyYW1lX3N0ZXApKSB7CisgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoaW5saW5rLT5kc3QtPm91dHB1dHNbMF0sIHJlZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcmVmKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZnJhbWVzdGVwX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZnJhbWVzdGVwX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0X3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2ZyYW1lc3RlcCA9IHsKKyAgICAubmFtZSAgICAgICAgPSAiZnJhbWVzdGVwIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2VsZWN0IG9uZSBmcmFtZSBldmVyeSBOIGZyYW1lcy4iKSwKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoRnJhbWVTdGVwQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgID0gJmZyYW1lc3RlcF9jbGFzcywKKyAgICAuaW5wdXRzICAgICAgPSBmcmFtZXN0ZXBfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IGZyYW1lc3RlcF9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9mcmVpMHIuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9mcmVpMHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjg2ODM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2ZyZWkwci5jCkBAIC0wLDAgKzEsNTM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFN0ZWZhbm8gU2FiYXRpbmkKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBmcmVpMHIgd3JhcHBlcgorICovCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGZyZWkwci5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgZjByX2luc3RhbmNlX3QgKCpmMHJfY29uc3RydWN0X2YpKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKCpmMHJfZGVzdHJ1Y3RfZikoZjByX2luc3RhbmNlX3QgaW5zdGFuY2UpOwordHlwZWRlZiB2b2lkICgqZjByX2RlaW5pdF9mKSh2b2lkKTsKK3R5cGVkZWYgaW50ICgqZjByX2luaXRfZikodm9pZCk7Cit0eXBlZGVmIHZvaWQgKCpmMHJfZ2V0X3BsdWdpbl9pbmZvX2YpKGYwcl9wbHVnaW5faW5mb190ICppbmZvKTsKK3R5cGVkZWYgdm9pZCAoKmYwcl9nZXRfcGFyYW1faW5mb19mKShmMHJfcGFyYW1faW5mb190ICppbmZvLCBpbnQgcGFyYW1faW5kZXgpOwordHlwZWRlZiB2b2lkICgqZjByX3VwZGF0ZV9mKShmMHJfaW5zdGFuY2VfdCBpbnN0YW5jZSwgZG91YmxlIHRpbWUsIGNvbnN0IHVpbnQzMl90ICppbmZyYW1lLCB1aW50MzJfdCAqb3V0ZnJhbWUpOwordHlwZWRlZiB2b2lkICgqZjByX3VwZGF0ZTJfZikoZjByX2luc3RhbmNlX3QgaW5zdGFuY2UsIGRvdWJsZSB0aW1lLCBjb25zdCB1aW50MzJfdCAqaW5mcmFtZTEsIGNvbnN0IHVpbnQzMl90ICppbmZyYW1lMiwgY29uc3QgdWludDMyX3QgKmluZnJhbWUzLCB1aW50MzJfdCAqb3V0ZnJhbWUpOwordHlwZWRlZiB2b2lkICgqZjByX3NldF9wYXJhbV92YWx1ZV9mKShmMHJfaW5zdGFuY2VfdCBpbnN0YW5jZSwgZjByX3BhcmFtX3QgcGFyYW0sIGludCBwYXJhbV9pbmRleCk7Cit0eXBlZGVmIHZvaWQgKCpmMHJfZ2V0X3BhcmFtX3ZhbHVlX2YpKGYwcl9pbnN0YW5jZV90IGluc3RhbmNlLCBmMHJfcGFyYW1fdCBwYXJhbSwgaW50IHBhcmFtX2luZGV4KTsKKwordHlwZWRlZiBzdHJ1Y3QgRnJlaTByQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgZjByX3VwZGF0ZV9mIHVwZGF0ZTsKKyAgICB2b2lkICpkbF9oYW5kbGU7ICAgICAgICAgICAgLyogZHluYW1pYyBsaWJyYXJ5IGhhbmRsZSAgICovCisgICAgZjByX2luc3RhbmNlX3QgaW5zdGFuY2U7CisgICAgZjByX3BsdWdpbl9pbmZvX3QgcGx1Z2luX2luZm87CisKKyAgICBmMHJfZ2V0X3BhcmFtX2luZm9fZiAgZ2V0X3BhcmFtX2luZm87CisgICAgZjByX2dldF9wYXJhbV92YWx1ZV9mIGdldF9wYXJhbV92YWx1ZTsKKyAgICBmMHJfc2V0X3BhcmFtX3ZhbHVlX2Ygc2V0X3BhcmFtX3ZhbHVlOworICAgIGYwcl9jb25zdHJ1Y3RfZiAgICAgICBjb25zdHJ1Y3Q7CisgICAgZjByX2Rlc3RydWN0X2YgICAgICAgIGRlc3RydWN0OworICAgIGYwcl9kZWluaXRfZiAgICAgICAgICBkZWluaXQ7CisKKyAgICBjaGFyICpkbF9uYW1lOworICAgIGNoYXIgKnBhcmFtczsKKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZTsKKworICAgIC8qIG9ubHkgdXNlZCBieSB0aGUgc291cmNlICovCisgICAgaW50IHcsIGg7CisgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7CisgICAgdWludDY0X3QgcHRzOworfSBGcmVpMHJDb250ZXh0OworCitzdGF0aWMgdm9pZCAqbG9hZF9zeW0oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKnN5bV9uYW1lKQoreworICAgIEZyZWkwckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgdm9pZCAqc3ltID0gZGxzeW0ocy0+ZGxfaGFuZGxlLCBzeW1fbmFtZSk7CisgICAgaWYgKCFzeW0pCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBmaW5kIHN5bWJvbCAnJXMnIGluIGxvYWRlZCBtb2R1bGUuXG4iLCBzeW1fbmFtZSk7CisgICAgcmV0dXJuIHN5bTsKK30KKworc3RhdGljIGludCBzZXRfcGFyYW0oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGYwcl9wYXJhbV9pbmZvX3QgaW5mbywgaW50IGluZGV4LCBjaGFyICpwYXJhbSkKK3sKKyAgICBGcmVpMHJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHVuaW9uIHsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICAgIGYwcl9wYXJhbV9jb2xvcl90IGNvbDsKKyAgICAgICAgZjByX3BhcmFtX3Bvc2l0aW9uX3QgcG9zOworICAgIH0gdmFsOworICAgIGNoYXIgKnRhaWw7CisgICAgdWludDhfdCByZ2JhWzRdOworCisgICAgc3dpdGNoIChpbmZvLnR5cGUpIHsKKyAgICBjYXNlIEYwUl9QQVJBTV9CT09MOgorICAgICAgICBpZiAgICAgICghc3RyY21wKHBhcmFtLCAieSIpKSB2YWwuZCA9IDEuMDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChwYXJhbSwgIm4iKSkgdmFsLmQgPSAwLjA7CisgICAgICAgIGVsc2UgZ290byBmYWlsOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRjBSX1BBUkFNX0RPVUJMRToKKyAgICAgICAgdmFsLmQgPSBzdHJ0b2QocGFyYW0sICZ0YWlsKTsKKyAgICAgICAgaWYgKCp0YWlsIHx8IHZhbC5kID09IEhVR0VfVkFMKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRjBSX1BBUkFNX0NPTE9SOgorICAgICAgICBpZiAoc3NjYW5mKHBhcmFtLCAiJWYvJWYvJWYiLCAmdmFsLmNvbC5yLCAmdmFsLmNvbC5nLCAmdmFsLmNvbC5iKSAhPSAzKSB7CisgICAgICAgICAgICBpZiAoYXZfcGFyc2VfY29sb3IocmdiYSwgcGFyYW0sIC0xLCBjdHgpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB2YWwuY29sLnIgPSByZ2JhWzBdIC8gMjU1LjA7CisgICAgICAgICAgICB2YWwuY29sLmcgPSByZ2JhWzFdIC8gMjU1LjA7CisgICAgICAgICAgICB2YWwuY29sLmIgPSByZ2JhWzJdIC8gMjU1LjA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEYwUl9QQVJBTV9QT1NJVElPTjoKKyAgICAgICAgaWYgKHNzY2FuZihwYXJhbSwgIiVsZi8lbGYiLCAmdmFsLnBvcy54LCAmdmFsLnBvcy55KSAhPSAyKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzLT5zZXRfcGFyYW1fdmFsdWUocy0+aW5zdGFuY2UsICZ2YWwsIGluZGV4KTsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHZhbHVlICclcycgZm9yIHBhcmFtZXRlciAnJXMnLlxuIiwKKyAgICAgICAgICAgcGFyYW0sIGluZm8ubmFtZSk7CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKworc3RhdGljIGludCBzZXRfcGFyYW1zKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpwYXJhbXMpCit7CisgICAgRnJlaTByQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGlmICghcGFyYW1zKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5wbHVnaW5faW5mby5udW1fcGFyYW1zOyBpKyspIHsKKyAgICAgICAgZjByX3BhcmFtX2luZm9fdCBpbmZvOworICAgICAgICBjaGFyICpwYXJhbTsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBzLT5nZXRfcGFyYW1faW5mbygmaW5mbywgaSk7CisKKyAgICAgICAgaWYgKCpwYXJhbXMpIHsKKyAgICAgICAgICAgIGlmICghKHBhcmFtID0gYXZfZ2V0X3Rva2VuKCZwYXJhbXMsICJ8IikpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBpZiAoKnBhcmFtcykKKyAgICAgICAgICAgICAgICBwYXJhbXMrKzsgICAgICAgICAgICAgICAvKiBza2lwICc6JyAqLworICAgICAgICAgICAgcmV0ID0gc2V0X3BhcmFtKGN0eCwgaW5mbywgaSwgcGFyYW0pOworICAgICAgICAgICAgYXZfZnJlZShwYXJhbSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAiaWR4OiVkIG5hbWU6JyVzJyB0eXBlOiVzIGV4cGxhbmF0aW9uOiclcycgIiwKKyAgICAgICAgICAgICAgIGksIGluZm8ubmFtZSwKKyAgICAgICAgICAgICAgIGluZm8udHlwZSA9PSBGMFJfUEFSQU1fQk9PTCAgICAgPyAiYm9vbCIgICAgIDoKKyAgICAgICAgICAgICAgIGluZm8udHlwZSA9PSBGMFJfUEFSQU1fRE9VQkxFICAgPyAiZG91YmxlIiAgIDoKKyAgICAgICAgICAgICAgIGluZm8udHlwZSA9PSBGMFJfUEFSQU1fQ09MT1IgICAgPyAiY29sb3IiICAgIDoKKyAgICAgICAgICAgICAgIGluZm8udHlwZSA9PSBGMFJfUEFSQU1fUE9TSVRJT04gPyAicG9zaXRpb24iIDoKKyAgICAgICAgICAgICAgIGluZm8udHlwZSA9PSBGMFJfUEFSQU1fU1RSSU5HICAgPyAic3RyaW5nIiAgIDogInVua25vd24iLAorICAgICAgICAgICAgICAgaW5mby5leHBsYW5hdGlvbik7CisKKyNpZmRlZiBERUJVRworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJ2YWx1ZToiKTsKKyAgICAgICAgc3dpdGNoIChpbmZvLnR5cGUpIHsKKyAgICAgICAgICAgIHZvaWQgKnY7CisgICAgICAgICAgICBkb3VibGUgZDsKKyAgICAgICAgICAgIGNoYXIgc1sxMjhdOworICAgICAgICAgICAgZjByX3BhcmFtX2NvbG9yX3QgY29sOworICAgICAgICAgICAgZjByX3BhcmFtX3Bvc2l0aW9uX3QgcG9zOworCisgICAgICAgIGNhc2UgRjBSX1BBUkFNX0JPT0w6CisgICAgICAgICAgICB2ID0gJmQ7CisgICAgICAgICAgICBzLT5nZXRfcGFyYW1fdmFsdWUocy0+aW5zdGFuY2UsIHYsIGkpOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiJXMiLCBkID49IDAuNSAmJiBkIDw9IDEuMCA/ICJ5IiA6ICJuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGMFJfUEFSQU1fRE9VQkxFOgorICAgICAgICAgICAgdiA9ICZkOworICAgICAgICAgICAgcy0+Z2V0X3BhcmFtX3ZhbHVlKHMtPmluc3RhbmNlLCB2LCBpKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiVmIiwgZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGMFJfUEFSQU1fQ09MT1I6CisgICAgICAgICAgICB2ID0gJmNvbDsKKyAgICAgICAgICAgIHMtPmdldF9wYXJhbV92YWx1ZShzLT5pbnN0YW5jZSwgdiwgaSk7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICIlZi8lZi8lZiIsIGNvbC5yLCBjb2wuZywgY29sLmIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRjBSX1BBUkFNX1BPU0lUSU9OOgorICAgICAgICAgICAgdiA9ICZwb3M7CisgICAgICAgICAgICBzLT5nZXRfcGFyYW1fdmFsdWUocy0+aW5zdGFuY2UsIHYsIGkpOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiJWYvJWYiLCBwb3MueCwgcG9zLnkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8qIEYwUl9QQVJBTV9TVFJJTkcgKi8KKyAgICAgICAgICAgIHYgPSBzOworICAgICAgICAgICAgcy0+Z2V0X3BhcmFtX3ZhbHVlKHMtPmluc3RhbmNlLCB2LCBpKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiclcyciLCBzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIuXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsb2FkX3BhdGgoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKipoYW5kbGVfcHRyLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgY2hhciAqcGF0aCA9IGF2X2FzcHJpbnRmKCIlcyVzJXMiLCBwcmVmaXgsIG5hbWUsIFNMSUJTVUYpOworICAgIGlmICghcGF0aCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJMb29raW5nIGZvciBmcmVpMHIgZWZmZWN0IGluICclcycuXG4iLCBwYXRoKTsKKyAgICAqaGFuZGxlX3B0ciA9IGRsb3BlbihwYXRoLCBSVExEX05PV3xSVExEX0xPQ0FMKTsKKyAgICBhdl9mcmVlKHBhdGgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZnJlaTByX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGxfbmFtZSwgaW50IHR5cGUpCit7CisgICAgRnJlaTByQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBmMHJfaW5pdF9mICAgICAgICAgICAgZjByX2luaXQ7CisgICAgZjByX2dldF9wbHVnaW5faW5mb19mIGYwcl9nZXRfcGx1Z2luX2luZm87CisgICAgZjByX3BsdWdpbl9pbmZvX3QgKnBpOworICAgIGNoYXIgKnBhdGg7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGZyZWkwcl9wYXRobGlzdFtdID0geworICAgICAgICAiL3Vzci9sb2NhbC9saWIvZnJlaTByLTEvIiwKKyAgICAgICAgIi91c3IvbGliL2ZyZWkwci0xLyIsCisgICAgICAgICIvdXNyL2xvY2FsL2xpYjY0L2ZyZWkwci0xLyIsCisgICAgICAgICIvdXNyL2xpYjY0L2ZyZWkwci0xLyIKKyAgICB9OworCisgICAgaWYgKCFkbF9uYW1lKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGZpbHRlciBuYW1lIHByb3ZpZGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogc2VlOiBodHRwOi8vZnJlaTByLmR5bmUub3JnL2NvZGVkb2MvaHRtbC9ncm91cF9fcGx1Z2xvY2F0aW9ucy5odG1sICovCisgICAgaWYgKChwYXRoID0gYXZfc3RyZHVwKGdldGVudigiRlJFSTBSX1BBVEgiKSkpKSB7CisjaWZkZWYgX1dJTjMyCisgICAgICAgIGNvbnN0IGNoYXIgKnNlcGFyYXRvciA9ICI7IjsKKyNlbHNlCisgICAgICAgIGNvbnN0IGNoYXIgKnNlcGFyYXRvciA9ICI6IjsKKyNlbmRpZgorICAgICAgICBjaGFyICpwLCAqcHRyID0gTlVMTDsKKyAgICAgICAgZm9yIChwID0gcGF0aDsgcCA9IGF2X3N0cnRvayhwLCBzZXBhcmF0b3IsICZwdHIpOyBwID0gTlVMTCkgeworICAgICAgICAgICAgLyogYWRkIGFkZGl0aW9uYWwgdHJhaWxpbmcgc2xhc2ggaW4gY2FzZSBpdCBpcyBtaXNzaW5nICovCisgICAgICAgICAgICBjaGFyICpwMSA9IGF2X2FzcHJpbnRmKCIlcy8iLCBwKTsKKyAgICAgICAgICAgIGlmICghcDEpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBjaGVja19wYXRoX2VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IGxvYWRfcGF0aChjdHgsICZzLT5kbF9oYW5kbGUsIHAxLCBkbF9uYW1lKTsKKyAgICAgICAgICAgIGF2X2ZyZWUocDEpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBjaGVja19wYXRoX2VuZDsKKyAgICAgICAgICAgIGlmIChzLT5kbF9oYW5kbGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGNoZWNrX3BhdGhfZW5kOgorICAgICAgICBhdl9mcmVlKHBhdGgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmICghcy0+ZGxfaGFuZGxlICYmIChwYXRoID0gZ2V0ZW52KCJIT01FIikpKSB7CisgICAgICAgIGNoYXIgKnByZWZpeCA9IGF2X2FzcHJpbnRmKCIlcy8uZnJlaTByLTEvbGliLyIsIHBhdGgpOworICAgICAgICBpZiAoIXByZWZpeCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHJldCA9IGxvYWRfcGF0aChjdHgsICZzLT5kbF9oYW5kbGUsIHByZWZpeCwgZGxfbmFtZSk7CisgICAgICAgIGF2X2ZyZWUocHJlZml4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBmb3IgKGkgPSAwOyAhcy0+ZGxfaGFuZGxlICYmIGkgPCBGRl9BUlJBWV9FTEVNUyhmcmVpMHJfcGF0aGxpc3QpOyBpKyspIHsKKyAgICAgICAgcmV0ID0gbG9hZF9wYXRoKGN0eCwgJnMtPmRsX2hhbmRsZSwgZnJlaTByX3BhdGhsaXN0W2ldLCBkbF9uYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoIXMtPmRsX2hhbmRsZSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZmluZCBtb2R1bGUgJyVzJy5cbiIsIGRsX25hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICghKGYwcl9pbml0ICAgICAgICAgICAgICAgID0gbG9hZF9zeW0oY3R4LCAiZjByX2luaXQiICAgICAgICAgICApKSB8fAorICAgICAgICAhKGYwcl9nZXRfcGx1Z2luX2luZm8gICAgID0gbG9hZF9zeW0oY3R4LCAiZjByX2dldF9wbHVnaW5faW5mbyIpKSB8fAorICAgICAgICAhKHMtPmdldF9wYXJhbV9pbmZvICA9IGxvYWRfc3ltKGN0eCwgImYwcl9nZXRfcGFyYW1faW5mbyIgKSkgfHwKKyAgICAgICAgIShzLT5nZXRfcGFyYW1fdmFsdWUgPSBsb2FkX3N5bShjdHgsICJmMHJfZ2V0X3BhcmFtX3ZhbHVlIikpIHx8CisgICAgICAgICEocy0+c2V0X3BhcmFtX3ZhbHVlID0gbG9hZF9zeW0oY3R4LCAiZjByX3NldF9wYXJhbV92YWx1ZSIpKSB8fAorICAgICAgICAhKHMtPnVwZGF0ZSAgICAgICAgICA9IGxvYWRfc3ltKGN0eCwgImYwcl91cGRhdGUiICAgICAgICAgKSkgfHwKKyAgICAgICAgIShzLT5jb25zdHJ1Y3QgICAgICAgPSBsb2FkX3N5bShjdHgsICJmMHJfY29uc3RydWN0IiAgICAgICkpIHx8CisgICAgICAgICEocy0+ZGVzdHJ1Y3QgICAgICAgID0gbG9hZF9zeW0oY3R4LCAiZjByX2Rlc3RydWN0IiAgICAgICApKSB8fAorICAgICAgICAhKHMtPmRlaW5pdCAgICAgICAgICA9IGxvYWRfc3ltKGN0eCwgImYwcl9kZWluaXQiICAgICAgICAgKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoZjByX2luaXQoKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGluaXQgdGhlIGZyZWkwciBtb2R1bGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBmMHJfZ2V0X3BsdWdpbl9pbmZvKCZzLT5wbHVnaW5faW5mbyk7CisgICAgcGkgPSAmcy0+cGx1Z2luX2luZm87CisgICAgaWYgKHBpLT5wbHVnaW5fdHlwZSAhPSB0eXBlKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHR5cGUgJyVzJyBmb3IgdGhpcyBwbHVnaW5cbiIsCisgICAgICAgICAgICAgICBwaS0+cGx1Z2luX3R5cGUgPT0gRjBSX1BMVUdJTl9UWVBFX0ZJTFRFUiA/ICJmaWx0ZXIiIDoKKyAgICAgICAgICAgICAgIHBpLT5wbHVnaW5fdHlwZSA9PSBGMFJfUExVR0lOX1RZUEVfU09VUkNFID8gInNvdXJjZSIgOgorICAgICAgICAgICAgICAgcGktPnBsdWdpbl90eXBlID09IEYwUl9QTFVHSU5fVFlQRV9NSVhFUjIgPyAibWl4ZXIyIiA6CisgICAgICAgICAgICAgICBwaS0+cGx1Z2luX3R5cGUgPT0gRjBSX1BMVUdJTl9UWVBFX01JWEVSMyA/ICJtaXhlcjMiIDogInVua25vd24iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgIm5hbWU6JXMgYXV0aG9yOiclcycgZXhwbGFuYXRpb246JyVzJyBjb2xvcl9tb2RlbDolcyAiCisgICAgICAgICAgICJmcmVpMHJfdmVyc2lvbjolZCB2ZXJzaW9uOiVkLiVkIG51bV9wYXJhbXM6JWRcbiIsCisgICAgICAgICAgIHBpLT5uYW1lLCBwaS0+YXV0aG9yLCBwaS0+ZXhwbGFuYXRpb24sCisgICAgICAgICAgIHBpLT5jb2xvcl9tb2RlbCA9PSBGMFJfQ09MT1JfTU9ERUxfQkdSQTg4ODggPyAiYmdyYTg4ODgiIDoKKyAgICAgICAgICAgcGktPmNvbG9yX21vZGVsID09IEYwUl9DT0xPUl9NT0RFTF9SR0JBODg4OCA/ICJyZ2JhODg4OCIgOgorICAgICAgICAgICBwaS0+Y29sb3JfbW9kZWwgPT0gRjBSX0NPTE9SX01PREVMX1BBQ0tFRDMyID8gInBhY2tlZDMyIiA6ICJ1bmtub3duIiwKKyAgICAgICAgICAgcGktPmZyZWkwcl92ZXJzaW9uLCBwaS0+bWFqb3JfdmVyc2lvbiwgcGktPm1pbm9yX3ZlcnNpb24sIHBpLT5udW1fcGFyYW1zKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZmlsdGVyX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRnJlaTByQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHJldHVybiBmcmVpMHJfaW5pdChjdHgsIHMtPmRsX25hbWUsIEYwUl9QTFVHSU5fVFlQRV9GSUxURVIpOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBGcmVpMHJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKHMtPmRlc3RydWN0ICYmIHMtPmluc3RhbmNlKQorICAgICAgICBzLT5kZXN0cnVjdChzLT5pbnN0YW5jZSk7CisgICAgaWYgKHMtPmRlaW5pdCkKKyAgICAgICAgcy0+ZGVpbml0KCk7CisgICAgaWYgKHMtPmRsX2hhbmRsZSkKKyAgICAgICAgZGxjbG9zZShzLT5kbF9oYW5kbGUpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dF9wcm9wcyhBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEZyZWkwckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocy0+ZGVzdHJ1Y3QgJiYgcy0+aW5zdGFuY2UpCisgICAgICAgIHMtPmRlc3RydWN0KHMtPmluc3RhbmNlKTsKKyAgICBpZiAoIShzLT5pbnN0YW5jZSA9IHMtPmNvbnN0cnVjdChpbmxpbmstPncsIGlubGluay0+aCkpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkltcG9zc2libGUgdG8gbG9hZCBmcmVpMHIgaW5zdGFuY2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2V0X3BhcmFtcyhjdHgsIHMtPnBhcmFtcyk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBGcmVpMHJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyA9IE5VTEw7CisKKyAgICBpZiAgICAgICAgKHMtPnBsdWdpbl9pbmZvLmNvbG9yX21vZGVsID09IEYwUl9DT0xPUl9NT0RFTF9CR1JBODg4OCkgeworICAgICAgICBmZl9hZGRfZm9ybWF0KCZmb3JtYXRzLCBBVl9QSVhfRk1UX0JHUkEpOworICAgIH0gZWxzZSBpZiAocy0+cGx1Z2luX2luZm8uY29sb3JfbW9kZWwgPT0gRjBSX0NPTE9SX01PREVMX1JHQkE4ODg4KSB7CisgICAgICAgIGZmX2FkZF9mb3JtYXQoJmZvcm1hdHMsIEFWX1BJWF9GTVRfUkdCQSk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEYwUl9DT0xPUl9NT0RFTF9QQUNLRUQzMiAqLworICAgICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgICAgICBBVl9QSVhfRk1UX0JHUkEsIEFWX1BJWF9GTVRfQVJHQiwgQVZfUElYX0ZNVF9BQkdSLCBBVl9QSVhfRk1UX0FSR0IsIEFWX1BJWF9GTVRfTk9ORQorICAgICAgICB9OworICAgICAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyk7CisgICAgfQorCisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBGcmVpMHJDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gaW5saW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0OworCisgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisKKyAgICBzLT51cGRhdGUocy0+aW5zdGFuY2UsIGluLT5wdHMgKiBhdl9xMmQoaW5saW5rLT50aW1lX2Jhc2UpICogMTAwMCwKKyAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDMyX3QgKilpbi0+ZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKilvdXQtPmRhdGFbMF0pOworCisgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGcmVpMHJDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZyZWkwcl9vcHRpb25zW10gPSB7CisgICAgeyAiZmlsdGVyX25hbWUiLCAgIE5VTEwsIE9GRlNFVChkbF9uYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImZpbHRlcl9wYXJhbXMiLCBOVUxMLCBPRkZTRVQocGFyYW1zKSwgIEFWX09QVF9UWVBFX1NUUklORywgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGZyZWkwcik7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9mcmVpMHJfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0X3Byb3BzLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9mcmVpMHJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2ZyZWkwciA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJmcmVpMHIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IGEgZnJlaTByIGVmZmVjdC4iKSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmluaXQgICAgICAgICAgPSBmaWx0ZXJfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihGcmVpMHJDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZmcmVpMHJfY2xhc3MsCisgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl92Zl9mcmVpMHJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfdmZfZnJlaTByX291dHB1dHMsCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgc291cmNlX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRnJlaTByQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPnRpbWVfYmFzZS5udW0gPSBzLT5mcmFtZXJhdGUuZGVuOworICAgIHMtPnRpbWVfYmFzZS5kZW4gPSBzLT5mcmFtZXJhdGUubnVtOworCisgICAgcmV0dXJuIGZyZWkwcl9pbml0KGN0eCwgcy0+ZGxfbmFtZSwgRjBSX1BMVUdJTl9UWVBFX1NPVVJDRSk7Cit9CisKK3N0YXRpYyBpbnQgc291cmNlX2NvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgRnJlaTByQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlmIChhdl9pbWFnZV9jaGVja19zaXplKHMtPncsIHMtPmgsIDAsIGN0eCkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIG91dGxpbmstPncgPSBzLT53OworICAgIG91dGxpbmstPmggPSBzLT5oOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IHMtPnRpbWVfYmFzZTsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpezEsMX07CisKKyAgICBpZiAocy0+ZGVzdHJ1Y3QgJiYgcy0+aW5zdGFuY2UpCisgICAgICAgIHMtPmRlc3RydWN0KHMtPmluc3RhbmNlKTsKKyAgICBpZiAoIShzLT5pbnN0YW5jZSA9IHMtPmNvbnN0cnVjdChvdXRsaW5rLT53LCBvdXRsaW5rLT5oKSkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW1wb3NzaWJsZSB0byBsb2FkIGZyZWkwciBpbnN0YW5jZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoIXMtPnBhcmFtcykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJmcmVpMHIgZmlsdGVyIHBhcmFtZXRlcnMgbm90IHNldC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiBzZXRfcGFyYW1zKGN0eCwgcy0+cGFyYW1zKTsKK30KKworc3RhdGljIGludCBzb3VyY2VfcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgRnJlaTByQ29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCkgezEsIDF9OworICAgIGZyYW1lLT5wdHMgPSBzLT5wdHMrKzsKKworICAgIHMtPnVwZGF0ZShzLT5pbnN0YW5jZSwgYXZfcmVzY2FsZV9xKGZyYW1lLT5wdHMsIHMtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsMTAwMH0pLAorICAgICAgICAgICAgICAgICAgIE5VTEwsICh1aW50MzJfdCAqKWZyYW1lLT5kYXRhWzBdKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZnJhbWUpOworfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZnJlaTByX3NyY19vcHRpb25zW10gPSB7CisgICAgeyAic2l6ZSIsICAgICAgICAgICJEaW1lbnNpb25zIG9mIHRoZSBnZW5lcmF0ZWQgdmlkZW8uIiwgT0ZGU0VUKHcpLCAgICAgICAgIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsgLnN0ciA9ICIzMjB4MjQwIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImZyYW1lcmF0ZSIsICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7IC5zdHIgPSAiMjUiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiZmlsdGVyX25hbWUiLCAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGRsX25hbWUpLCAgIEFWX09QVF9UWVBFX1NUUklORywgICAgICAgICAgICAgICAgICAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImZpbHRlcl9wYXJhbXMiLCBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChwYXJhbXMpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsICAgICAgICAgICAgICAgICAgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhmcmVpMHJfc3JjKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZzcmNfZnJlaTByX3NyY19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gc291cmNlX3JlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gc291cmNlX2NvbmZpZ19wcm9wcworICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZzcmNfZnJlaTByX3NyYyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJmcmVpMHJfc3JjIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHZW5lcmF0ZSBhIGZyZWkwciBzb3VyY2UuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRnJlaTByQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmZnJlaTByX3NyY19jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IHNvdXJjZV9pbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IE5VTEwsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl92c3JjX2ZyZWkwcl9zcmNfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZ2VxLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZ2VxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhM2U2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9nZXEuYwpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChDKSAyMDEyIENsw6ltZW50IELFk3NjaCA8dSBwa2ggbWU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogR2VuZXJpYyBlcXVhdGlvbiBjaGFuZ2UgZmlsdGVyCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBOaWVkZXJtYXllciBmb3IgdGhlIE1QbGF5ZXIgcHJvamVjdCwgYW5kCisgKiBwb3J0ZWQgYnkgQ2zDqW1lbnQgQsWTc2NoIGZvciBGRm1wZWcuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEFWRXhwciAqZVs0XTsgICAgICAgICAgICAgICAvLy88IGV4cHJlc3Npb25zIGZvciBlYWNoIHBsYW5lCisgICAgY2hhciAqZXhwcl9zdHJbNCszXTsgICAgICAgIC8vLzwgZXhwcmVzc2lvbiBzdHJpbmdzIGZvciBlYWNoIHBsYW5lCisgICAgQVZGcmFtZSAqcGljcmVmOyAgICAgICAgICAgIC8vLzwgY3VycmVudCBpbnB1dCBidWZmZXIKKyAgICBpbnQgaHN1YiwgdnN1YjsgICAgICAgICAgICAgLy8vPCBjaHJvbWEgc3Vic2FtcGxpbmcKKyAgICBpbnQgcGxhbmVzOyAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgcGxhbmVzCisgICAgaW50IGlzX3JnYjsKK30gR0VRQ29udGV4dDsKKworZW51bSB7IFkgPSAwLCBVLCBWLCBBLCBHLCBCLCBSIH07CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEdFUUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZ2VxX29wdGlvbnNbXSA9IHsKKyAgICB7ICJsdW1fZXhwciIsICAgInNldCBsdW1pbmFuY2UgZXhwcmVzc2lvbiIsICAgT0ZGU0VUKGV4cHJfc3RyW1ldKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImx1bSIsICAgICAgICAic2V0IGx1bWluYW5jZSBleHByZXNzaW9uIiwgICBPRkZTRVQoZXhwcl9zdHJbWV0pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiY2JfZXhwciIsICAgICJzZXQgY2hyb21hIGJsdWUgZXhwcmVzc2lvbiIsIE9GRlNFVChleHByX3N0cltVXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJjYiIsICAgICAgICAgInNldCBjaHJvbWEgYmx1ZSBleHByZXNzaW9uIiwgT0ZGU0VUKGV4cHJfc3RyW1VdKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImNyX2V4cHIiLCAgICAic2V0IGNocm9tYSByZWQgZXhwcmVzc2lvbiIsICBPRkZTRVQoZXhwcl9zdHJbVl0pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiY3IiLCAgICAgICAgICJzZXQgY2hyb21hIHJlZCBleHByZXNzaW9uIiwgIE9GRlNFVChleHByX3N0cltWXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJhbHBoYV9leHByIiwgInNldCBhbHBoYSBleHByZXNzaW9uIiwgICAgICAgT0ZGU0VUKGV4cHJfc3RyW0FdKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImEiLCAgICAgICAgICAic2V0IGFscGhhIGV4cHJlc3Npb24iLCAgICAgICBPRkZTRVQoZXhwcl9zdHJbQV0pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAicmVkX2V4cHIiLCAgICJzZXQgcmVkIGV4cHJlc3Npb24iLCAgICAgICAgIE9GRlNFVChleHByX3N0cltSXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJyIiwgICAgICAgICAgInNldCByZWQgZXhwcmVzc2lvbiIsICAgICAgICAgT0ZGU0VUKGV4cHJfc3RyW1JdKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImdyZWVuX2V4cHIiLCAic2V0IGdyZWVuIGV4cHJlc3Npb24iLCAgICAgICBPRkZTRVQoZXhwcl9zdHJbR10pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiZyIsICAgICAgICAgICJzZXQgZ3JlZW4gZXhwcmVzc2lvbiIsICAgICAgIE9GRlNFVChleHByX3N0cltHXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJibHVlX2V4cHIiLCAgInNldCBibHVlIGV4cHJlc3Npb24iLCAgICAgICAgT0ZGU0VUKGV4cHJfc3RyW0JdKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImIiLCAgICAgICAgICAic2V0IGJsdWUgZXhwcmVzc2lvbiIsICAgICAgICBPRkZTRVQoZXhwcl9zdHJbQl0pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAge05VTEx9LAorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGdlcSk7CisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIGdldHBpeCh2b2lkICpwcml2LCBkb3VibGUgeCwgZG91YmxlIHksIGludCBwbGFuZSkKK3sKKyAgICBpbnQgeGksIHlpOworICAgIEdFUUNvbnRleHQgKmdlcSA9IHByaXY7CisgICAgQVZGcmFtZSAqcGljcmVmID0gZ2VxLT5waWNyZWY7CisgICAgY29uc3QgdWludDhfdCAqc3JjID0gcGljcmVmLT5kYXRhW3BsYW5lXTsKKyAgICBjb25zdCBpbnQgbGluZXNpemUgPSBwaWNyZWYtPmxpbmVzaXplW3BsYW5lXTsKKyAgICBjb25zdCBpbnQgdyA9IChwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIpID8gRkZfQ0VJTF9SU0hJRlQocGljcmVmLT53aWR0aCwgIGdlcS0+aHN1YikgOiBwaWNyZWYtPndpZHRoOworICAgIGNvbnN0IGludCBoID0gKHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMikgPyBGRl9DRUlMX1JTSElGVChwaWNyZWYtPmhlaWdodCwgZ2VxLT52c3ViKSA6IHBpY3JlZi0+aGVpZ2h0OworCisgICAgaWYgKCFzcmMpCisgICAgICAgIHJldHVybiAwOworCisgICAgeGkgPSB4ID0gYXZfY2xpcGYoeCwgMCwgdyAtIDIpOworICAgIHlpID0geSA9IGF2X2NsaXBmKHksIDAsIGggLSAyKTsKKworICAgIHggLT0geGk7CisgICAgeSAtPSB5aTsKKworICAgIHJldHVybiAoMS15KSooKDEteCkqc3JjW3hpICsgIHlpICAgICogbGluZXNpemVdICsgeCpzcmNbeGkgKyAxICsgIHlpICAgICogbGluZXNpemVdKQorICAgICAgICAgICsgICB5ICooKDEteCkqc3JjW3hpICsgKHlpKzEpICogbGluZXNpemVdICsgeCpzcmNbeGkgKyAxICsgKHlpKzEpICogbGluZXNpemVdKTsKK30KKworLy9UT0RPOiBjdWJpYyBpbnRlcnBvbGF0ZQorLy9UT0RPOiBrZWVwIHRoZSBsYXN0IGZldyBmcmFtZXMKK3N0YXRpYyBkb3VibGUgbHVtKHZvaWQgKnByaXYsIGRvdWJsZSB4LCBkb3VibGUgeSkgeyByZXR1cm4gZ2V0cGl4KHByaXYsIHgsIHksIDApOyB9CitzdGF0aWMgZG91YmxlICBjYih2b2lkICpwcml2LCBkb3VibGUgeCwgZG91YmxlIHkpIHsgcmV0dXJuIGdldHBpeChwcml2LCB4LCB5LCAxKTsgfQorc3RhdGljIGRvdWJsZSAgY3Iodm9pZCAqcHJpdiwgZG91YmxlIHgsIGRvdWJsZSB5KSB7IHJldHVybiBnZXRwaXgocHJpdiwgeCwgeSwgMik7IH0KK3N0YXRpYyBkb3VibGUgYWxwaGEodm9pZCAqcHJpdiwgZG91YmxlIHgsIGRvdWJsZSB5KSB7IHJldHVybiBnZXRwaXgocHJpdiwgeCwgeSwgMyk7IH0KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geyAgICJYIiwgICAiWSIsICAgIlciLCAgICJIIiwgICAiTiIsICAgIlNXIiwgICAiU0giLCAgICJUIiwgICAgICAgIE5VTEwgfTsKK2VudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgVkFSX1gsIFZBUl9ZLCBWQVJfVywgVkFSX0gsIFZBUl9OLCBWQVJfU1csIFZBUl9TSCwgVkFSX1QsIFZBUl9WQVJTX05CIH07CisKK3N0YXRpYyBhdl9jb2xkIGludCBnZXFfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBHRVFDb250ZXh0ICpnZXEgPSBjdHgtPnByaXY7CisgICAgaW50IHBsYW5lLCByZXQgPSAwOworCisgICAgaWYgKCFnZXEtPmV4cHJfc3RyW1ldICYmICFnZXEtPmV4cHJfc3RyW0ddICYmICFnZXEtPmV4cHJfc3RyW0JdICYmICFnZXEtPmV4cHJfc3RyW1JdKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkEgbHVtaW5hbmNlIG9yIFJHQiBleHByZXNzaW9uIGlzIG1hbmRhdG9yeVxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGdlcS0+aXNfcmdiID0gIWdlcS0+ZXhwcl9zdHJbWV07CisKKyAgICBpZiAoKGdlcS0+ZXhwcl9zdHJbWV0gfHwgZ2VxLT5leHByX3N0cltVXSB8fCBnZXEtPmV4cHJfc3RyW1ZdKSAmJiAoZ2VxLT5leHByX3N0cltHXSB8fCBnZXEtPmV4cHJfc3RyW0JdIHx8IGdlcS0+ZXhwcl9zdHJbUl0pKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVpdGhlciBZQ2JDciBvciBSR0IgYnV0IG5vdCBib3RoIG11c3QgYmUgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAoIWdlcS0+ZXhwcl9zdHJbVV0gJiYgIWdlcS0+ZXhwcl9zdHJbVl0pIHsKKyAgICAgICAgLyogTm8gY2hyb21hIGF0IGFsbDogZmFsbGJhY2sgb24gbHVtYSAqLworICAgICAgICBnZXEtPmV4cHJfc3RyW1VdID0gYXZfc3RyZHVwKGdlcS0+ZXhwcl9zdHJbWV0pOworICAgICAgICBnZXEtPmV4cHJfc3RyW1ZdID0gYXZfc3RyZHVwKGdlcS0+ZXhwcl9zdHJbWV0pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE9uZSBjaHJvbWEgdW5zcGVjaWZpZWQsIGZhbGxiYWNrIG9uIHRoZSBvdGhlciAqLworICAgICAgICBpZiAoIWdlcS0+ZXhwcl9zdHJbVV0pIGdlcS0+ZXhwcl9zdHJbVV0gPSBhdl9zdHJkdXAoZ2VxLT5leHByX3N0cltWXSk7CisgICAgICAgIGlmICghZ2VxLT5leHByX3N0cltWXSkgZ2VxLT5leHByX3N0cltWXSA9IGF2X3N0cmR1cChnZXEtPmV4cHJfc3RyW1VdKTsKKyAgICB9CisKKyAgICBpZiAoIWdlcS0+ZXhwcl9zdHJbQV0pCisgICAgICAgIGdlcS0+ZXhwcl9zdHJbQV0gPSBhdl9zdHJkdXAoIjI1NSIpOworICAgIGlmICghZ2VxLT5leHByX3N0cltHXSkKKyAgICAgICAgZ2VxLT5leHByX3N0cltHXSA9IGF2X3N0cmR1cCgiZyhYLFkpIik7CisgICAgaWYgKCFnZXEtPmV4cHJfc3RyW0JdKQorICAgICAgICBnZXEtPmV4cHJfc3RyW0JdID0gYXZfc3RyZHVwKCJiKFgsWSkiKTsKKyAgICBpZiAoIWdlcS0+ZXhwcl9zdHJbUl0pCisgICAgICAgIGdlcS0+ZXhwcl9zdHJbUl0gPSBhdl9zdHJkdXAoInIoWCxZKSIpOworCisgICAgaWYgKGdlcS0+aXNfcmdiID8KKyAgICAgICAgICAgICghZ2VxLT5leHByX3N0cltHXSB8fCAhZ2VxLT5leHByX3N0cltCXSB8fCAhZ2VxLT5leHByX3N0cltSXSkKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgKCFnZXEtPmV4cHJfc3RyW1VdIHx8ICFnZXEtPmV4cHJfc3RyW1ZdIHx8ICFnZXEtPmV4cHJfc3RyW0FdKSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQ7IHBsYW5lKyspIHsKKyAgICAgICAgc3RhdGljIGRvdWJsZSAoKnBbXSkodm9pZCAqLCBkb3VibGUsIGRvdWJsZSkgPSB7IGx1bSwgY2IsIGNyLCBhbHBoYSB9OworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZnVuYzJfeXV2X25hbWVzW10gICAgPSB7ICJsdW0iLCAiY2IiLCAiY3IiLCAiYWxwaGEiLCAicCIsIE5VTEwgfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZ1bmMyX3JnYl9uYW1lc1tdICAgID0geyAiZyIsICJiIiwgInIiLCAiYWxwaGEiLCAicCIsIE5VTEwgfTsKKyAgICAgICAgY29uc3QgY2hhciAqY29uc3QgKmZ1bmMyX25hbWVzICAgICAgID0gZ2VxLT5pc19yZ2IgPyBmdW5jMl9yZ2JfbmFtZXMgOiBmdW5jMl95dXZfbmFtZXM7CisgICAgICAgIGRvdWJsZSAoKmZ1bmMyW10pKHZvaWQgKiwgZG91YmxlLCBkb3VibGUpID0geyBsdW0sIGNiLCBjciwgYWxwaGEsIHBbcGxhbmVdLCBOVUxMIH07CisKKyAgICAgICAgcmV0ID0gYXZfZXhwcl9wYXJzZSgmZ2VxLT5lW3BsYW5lXSwgZ2VxLT5leHByX3N0cltwbGFuZSA8IDMgJiYgZ2VxLT5pc19yZ2IgPyBwbGFuZSs0IDogcGxhbmVdLCB2YXJfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgZnVuYzJfbmFtZXMsIGZ1bmMyLCAwLCBjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworZW5kOgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2VxX3F1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgR0VRQ29udGV4dCAqZ2VxID0gY3R4LT5wcml2OworICAgIHN0YXRpYyBjb25zdCBlbnVtIFBpeGVsRm9ybWF0IHl1dl9waXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICBBVl9QSVhfRk1UX1lVVjQyMlAsICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDExUCwgIEFWX1BJWF9GTVRfWVVWNDEwUCwgIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBQaXhlbEZvcm1hdCByZ2JfcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUkFQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIGlmIChnZXEtPmlzX3JnYikgeworICAgICAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHJnYl9waXhfZm10cykpOworICAgIH0gZWxzZQorICAgICAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHl1dl9waXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlcV9jb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgR0VRQ29udGV4dCAqZ2VxID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisKKyAgICBnZXEtPmhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIGdlcS0+dnN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgZ2VxLT5wbGFuZXMgPSBkZXNjLT5uYl9jb21wb25lbnRzOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlcV9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIGludCBwbGFuZTsKKyAgICBHRVFDb250ZXh0ICpnZXEgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgZG91YmxlIHZhbHVlc1tWQVJfVkFSU19OQl0gPSB7CisgICAgICAgIFtWQVJfTl0gPSBpbmxpbmstPmZyYW1lX2NvdW50LAorICAgICAgICBbVkFSX1RdID0gaW4tPnB0cyA9PSBBVl9OT1BUU19WQUxVRSA/IE5BTiA6IGluLT5wdHMgKiBhdl9xMmQoaW5saW5rLT50aW1lX2Jhc2UpLAorICAgIH07CisKKyAgICBnZXEtPnBpY3JlZiA9IGluOworICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgZ2VxLT5wbGFuZXMgJiYgb3V0LT5kYXRhW3BsYW5lXTsgcGxhbmUrKykgeworICAgICAgICBpbnQgeCwgeTsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gb3V0LT5kYXRhW3BsYW5lXTsKKyAgICAgICAgY29uc3QgaW50IGxpbmVzaXplID0gb3V0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIGNvbnN0IGludCB3ID0gKHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMikgPyBGRl9DRUlMX1JTSElGVChpbmxpbmstPncsIGdlcS0+aHN1YikgOiBpbmxpbmstPnc7CisgICAgICAgIGNvbnN0IGludCBoID0gKHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMikgPyBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIGdlcS0+dnN1YikgOiBpbmxpbmstPmg7CisKKyAgICAgICAgdmFsdWVzW1ZBUl9XXSAgPSB3OworICAgICAgICB2YWx1ZXNbVkFSX0hdICA9IGg7CisgICAgICAgIHZhbHVlc1tWQVJfU1ddID0gdyAvIChkb3VibGUpaW5saW5rLT53OworICAgICAgICB2YWx1ZXNbVkFSX1NIXSA9IGggLyAoZG91YmxlKWlubGluay0+aDsKKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICB2YWx1ZXNbVkFSX1ldID0geTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbVkFSX1hdID0geDsKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBhdl9leHByX2V2YWwoZ2VxLT5lW3BsYW5lXSwgdmFsdWVzLCBnZXEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICs9IGxpbmVzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmZ2VxLT5waWNyZWYpOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBnZXFfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBpOworICAgIEdFUUNvbnRleHQgKmdlcSA9IGN0eC0+cHJpdjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhnZXEtPmUpOyBpKyspCisgICAgICAgIGF2X2V4cHJfZnJlZShnZXEtPmVbaV0pOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZ2VxX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGdlcV9jb25maWdfcHJvcHMsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBnZXFfZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBnZXFfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2dlcSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJnZXEiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IGdlbmVyaWMgZXF1YXRpb24gdG8gZWFjaCBwaXhlbC4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihHRVFDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGdlcV9pbml0LAorICAgIC51bmluaXQgICAgICAgID0gZ2VxX3VuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IGdlcV9xdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gZ2VxX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGdlcV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmdlcV9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ncmFkZnVuLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZ3JhZGZ1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTllMGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfZ3JhZGZ1bi5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIE5vbGFuIEx1bSA8bm9sODg4QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOSBMb3JlbiBNZXJyaXR0IDxsb3Jlbm1AdS53YXNoaW5ndG9uLmVkdT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogZ3JhZGZ1biBkZWJhbmRpbmcgZmlsdGVyLCBwb3J0ZWQgZnJvbSBNUGxheWVyCisgKiBsaWJtcGNvZGVjcy92Zl9ncmFkZnVuLmMKKyAqCisgKiBBcHBseSBhIGJveGJsdXIgZGViYW5kaW5nIGFsZ29yaXRobSAoYmFzZWQgb24gdGhlIGdyYWRmdW4yZGIKKyAqIEF2aVN5bnRoIGZpbHRlciBieSBwcnVuZWR0cmVlKS4KKyAqIEZvcmVhY2ggcGl4ZWwsIGlmIGl0J3Mgd2l0aGluIHRocmVzaG9sZCBvZiB0aGUgYmx1cnJlZCB2YWx1ZSwgbWFrZSBpdCBjbG9zZXIuCisgKiBTbyBub3cgd2UgaGF2ZSBhIHNtb290aGVkIGFuZCBoaWdoZXIgYml0ZGVwdGggdmVyc2lvbiBvZiBhbGwgdGhlIHNoYWxsb3cKKyAqIGdyYWRpZW50cywgd2hpbGUgbGVhdmluZyBkZXRhaWxlZCBhcmVhcyB1bnRvdWNoZWQuCisgKiBEaXRoZXIgaXQgYmFjayB0byA4Yml0LgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImdyYWRmdW4uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK0RFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGNvbnN0IHVpbnQxNl90LCBkaXRoZXIpWzhdWzhdID0geworICAgIHsweDAwLDB4NjAsMHgxOCwweDc4LDB4MDYsMHg2NiwweDFFLDB4N0V9LAorICAgIHsweDQwLDB4MjAsMHg1OCwweDM4LDB4NDYsMHgyNiwweDVFLDB4M0V9LAorICAgIHsweDEwLDB4NzAsMHgwOCwweDY4LDB4MTYsMHg3NiwweDBFLDB4NkV9LAorICAgIHsweDUwLDB4MzAsMHg0OCwweDI4LDB4NTYsMHgzNiwweDRFLDB4MkV9LAorICAgIHsweDA0LDB4NjQsMHgxQywweDdDLDB4MDIsMHg2MiwweDFBLDB4N0F9LAorICAgIHsweDQ0LDB4MjQsMHg1QywweDNDLDB4NDIsMHgyMiwweDVBLDB4M0F9LAorICAgIHsweDE0LDB4NzQsMHgwQywweDZDLDB4MTIsMHg3MiwweDBBLDB4NkF9LAorICAgIHsweDU0LDB4MzQsMHg0QywweDJDLDB4NTIsMHgzMiwweDRBLDB4MkF9LAorfTsKKwordm9pZCBmZl9ncmFkZnVuX2ZpbHRlcl9saW5lX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQxNl90ICpkYywgaW50IHdpZHRoLCBpbnQgdGhyZXNoLCBjb25zdCB1aW50MTZfdCAqZGl0aGVycykKK3sKKyAgICBpbnQgeDsKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IGRjICs9IHggJiAxLCB4KyspIHsKKyAgICAgICAgaW50IHBpeCA9IHNyY1t4XSA8PCA3OworICAgICAgICBpbnQgZGVsdGEgPSBkY1swXSAtIHBpeDsKKyAgICAgICAgaW50IG0gPSBhYnMoZGVsdGEpICogdGhyZXNoID4+IDE2OworICAgICAgICBtID0gRkZNQVgoMCwgMTI3IC0gbSk7CisgICAgICAgIG0gPSBtICogbSAqIGRlbHRhID4+IDE0OworICAgICAgICBwaXggKz0gbSArIGRpdGhlcnNbeCAmIDddOworICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3VpbnQ4KHBpeCA+PiA3KTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfZ3JhZGZ1bl9ibHVyX2xpbmVfYyh1aW50MTZfdCAqZGMsIHVpbnQxNl90ICpidWYsIGNvbnN0IHVpbnQxNl90ICpidWYxLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGluZXNpemUsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgdiwgb2xkOworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgIHYgPSBidWYxW3hdICsgc3JjWzIgKiB4XSArIHNyY1syICogeCArIDFdICsgc3JjWzIgKiB4ICsgc3JjX2xpbmVzaXplXSArIHNyY1syICogeCArIDEgKyBzcmNfbGluZXNpemVdOworICAgICAgICBvbGQgPSBidWZbeF07CisgICAgICAgIGJ1Zlt4XSA9IHY7CisgICAgICAgIGRjW3hdID0gdiAtIG9sZDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcihHcmFkRnVuQ29udGV4dCAqY3R4LCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZHN0X2xpbmVzaXplLCBpbnQgc3JjX2xpbmVzaXplLCBpbnQgcikKK3sKKyAgICBpbnQgYnN0cmlkZSA9IEZGQUxJR04od2lkdGgsIDE2KSAvIDI7CisgICAgaW50IHk7CisgICAgdWludDMyX3QgZGNfZmFjdG9yID0gKDEgPDwgMjEpIC8gKHIgKiByKTsKKyAgICB1aW50MTZfdCAqZGMgPSBjdHgtPmJ1ZiArIDE2OworICAgIHVpbnQxNl90ICpidWYgPSBjdHgtPmJ1ZiArIGJzdHJpZGUgKyAzMjsKKyAgICBpbnQgdGhyZXNoID0gY3R4LT50aHJlc2g7CisKKyAgICBtZW1zZXQoZGMsIDAsIChic3RyaWRlICsgMTYpICogc2l6ZW9mKCpidWYpKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgcjsgeSsrKQorICAgICAgICBjdHgtPmJsdXJfbGluZShkYywgYnVmICsgeSAqIGJzdHJpZGUsIGJ1ZiArICh5IC0gMSkgKiBic3RyaWRlLCBzcmMgKyAyICogeSAqIHNyY19saW5lc2l6ZSwgc3JjX2xpbmVzaXplLCB3aWR0aCAvIDIpOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKHkgPCBoZWlnaHQgLSByKSB7CisgICAgICAgICAgICBpbnQgbW9kID0gKCh5ICsgcikgLyAyKSAlIHI7CisgICAgICAgICAgICB1aW50MTZfdCAqYnVmMCA9IGJ1ZiArIG1vZCAqIGJzdHJpZGU7CisgICAgICAgICAgICB1aW50MTZfdCAqYnVmMSA9IGJ1ZiArIChtb2QgPyBtb2QgLSAxIDogciAtIDEpICogYnN0cmlkZTsKKyAgICAgICAgICAgIGludCB4LCB2OworICAgICAgICAgICAgY3R4LT5ibHVyX2xpbmUoZGMsIGJ1ZjAsIGJ1ZjEsIHNyYyArICh5ICsgcikgKiBzcmNfbGluZXNpemUsIHNyY19saW5lc2l6ZSwgd2lkdGggLyAyKTsKKyAgICAgICAgICAgIGZvciAoeCA9IHYgPSAwOyB4IDwgcjsgeCsrKQorICAgICAgICAgICAgICAgIHYgKz0gZGNbeF07CisgICAgICAgICAgICBmb3IgKDsgeCA8IHdpZHRoIC8gMjsgeCsrKSB7CisgICAgICAgICAgICAgICAgdiArPSBkY1t4XSAtIGRjW3gtcl07CisgICAgICAgICAgICAgICAgZGNbeC1yXSA9IHYgKiBkY19mYWN0b3IgPj4gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKDsgeCA8ICh3aWR0aCArIHIgKyAxKSAvIDI7IHgrKykKKyAgICAgICAgICAgICAgICBkY1t4LXJdID0gdiAqIGRjX2ZhY3RvciA+PiAxNjsKKyAgICAgICAgICAgIGZvciAoeCA9IC1yIC8gMjsgeCA8IDA7IHgrKykKKyAgICAgICAgICAgICAgICBkY1t4XSA9IGRjWzBdOworICAgICAgICB9CisgICAgICAgIGlmICh5ID09IHIpIHsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCByOyB5KyspCisgICAgICAgICAgICAgICAgY3R4LT5maWx0ZXJfbGluZShkc3QgKyB5ICogZHN0X2xpbmVzaXplLCBzcmMgKyB5ICogc3JjX2xpbmVzaXplLCBkYyAtIHIgLyAyLCB3aWR0aCwgdGhyZXNoLCBkaXRoZXJbeSAmIDddKTsKKyAgICAgICAgfQorICAgICAgICBjdHgtPmZpbHRlcl9saW5lKGRzdCArIHkgKiBkc3RfbGluZXNpemUsIHNyYyArIHkgKiBzcmNfbGluZXNpemUsIGRjIC0gciAvIDIsIHdpZHRoLCB0aHJlc2gsIGRpdGhlclt5ICYgN10pOworICAgICAgICBpZiAoKyt5ID49IGhlaWdodCkgYnJlYWs7CisgICAgICAgIGN0eC0+ZmlsdGVyX2xpbmUoZHN0ICsgeSAqIGRzdF9saW5lc2l6ZSwgc3JjICsgeSAqIHNyY19saW5lc2l6ZSwgZGMgLSByIC8gMiwgd2lkdGgsIHRocmVzaCwgZGl0aGVyW3kgJiA3XSk7CisgICAgICAgIGlmICgrK3kgPj0gaGVpZ2h0KSBicmVhazsKKyAgICB9CisgICAgZW1tc19jKCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEdyYWRGdW5Db250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgcy0+dGhyZXNoICA9ICgxIDw8IDE1KSAvIHMtPnN0cmVuZ3RoOworICAgIHMtPnJhZGl1cyAgPSBhdl9jbGlwKChzLT5yYWRpdXMgKyAxKSAmIH4xLCA0LCAzMik7CisKKyAgICBzLT5ibHVyX2xpbmUgICA9IGZmX2dyYWRmdW5fYmx1cl9saW5lX2M7CisgICAgcy0+ZmlsdGVyX2xpbmUgPSBmZl9ncmFkZnVuX2ZpbHRlcl9saW5lX2M7CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2dyYWRmdW5faW5pdF94ODYocyk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgInRocmVzaG9sZDolLjJmIHJhZGl1czolZFxuIiwgcy0+c3RyZW5ndGgsIHMtPnJhZGl1cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgR3JhZEZ1bkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgYXZfZnJlZXAoJnMtPmJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEdyYWRGdW5Db250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IGhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIGludCB2c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIGF2X2ZyZWVwKCZzLT5idWYpOworICAgIHMtPmJ1ZiA9IGF2X2NhbGxvYygoRkZBTElHTihpbmxpbmstPncsIDE2KSAqIChzLT5yYWRpdXMgKyAxKSAvIDIgKyAzMiksIHNpemVvZigqcy0+YnVmKSk7CisgICAgaWYgKCFzLT5idWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5jaHJvbWFfdyA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+dywgaHN1Yik7CisgICAgcy0+Y2hyb21hX2ggPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpOworICAgIHMtPmNocm9tYV9yID0gYXZfY2xpcCgoKCgocy0+cmFkaXVzID4+IGhzdWIpICsgKHMtPnJhZGl1cyA+PiB2c3ViKSkgLyAyICkgKyAxKSAmIH4xLCA0LCAzMik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEdyYWRGdW5Db250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gaW5saW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludCBwLCBkaXJlY3Q7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIGRpcmVjdCA9IDE7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpcmVjdCA9IDA7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgZm9yIChwID0gMDsgcCA8IDQgJiYgaW4tPmRhdGFbcF0gJiYgaW4tPmxpbmVzaXplW3BdOyBwKyspIHsKKyAgICAgICAgaW50IHcgPSBpbmxpbmstPnc7CisgICAgICAgIGludCBoID0gaW5saW5rLT5oOworICAgICAgICBpbnQgciA9IHMtPnJhZGl1czsKKyAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgIHcgPSBzLT5jaHJvbWFfdzsKKyAgICAgICAgICAgIGggPSBzLT5jaHJvbWFfaDsKKyAgICAgICAgICAgIHIgPSBzLT5jaHJvbWFfcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChGRk1JTih3LCBoKSA+IDIgKiByKQorICAgICAgICAgICAgZmlsdGVyKHMsIG91dC0+ZGF0YVtwXSwgaW4tPmRhdGFbcF0sIHcsIGgsIG91dC0+bGluZXNpemVbcF0sIGluLT5saW5lc2l6ZVtwXSwgcik7CisgICAgICAgIGVsc2UgaWYgKG91dC0+ZGF0YVtwXSAhPSBpbi0+ZGF0YVtwXSkKKyAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUob3V0LT5kYXRhW3BdLCBvdXQtPmxpbmVzaXplW3BdLCBpbi0+ZGF0YVtwXSwgaW4tPmxpbmVzaXplW3BdLCB3LCBoKTsKKyAgICB9CisKKyAgICBpZiAoIWRpcmVjdCkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihHcmFkRnVuQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBncmFkZnVuX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzdHJlbmd0aCIsICJUaGUgbWF4aW11bSBhbW91bnQgYnkgd2hpY2ggdGhlIGZpbHRlciB3aWxsIGNoYW5nZSBhbnkgb25lIHBpeGVsLiIsIE9GRlNFVChzdHJlbmd0aCksIEFWX09QVF9UWVBFX0ZMT0FULCB7IC5kYmwgPSAxLjIgfSwgMC41MSwgNjQsIEZMQUdTIH0sCisgICAgeyAicmFkaXVzIiwgICAiVGhlIG5laWdoYm9yaG9vZCB0byBmaXQgdGhlIGdyYWRpZW50IHRvLiIsICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocmFkaXVzKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMTYgIH0sIDQsICAgIDMyLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZ3JhZGZ1bik7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9ncmFkZnVuX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfZ3JhZGZ1bl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfZ3JhZGZ1biA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJncmFkZnVuIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEZWJhbmRzIHZpZGVvIHF1aWNrbHkgdXNpbmcgZ3JhZGllbnRzLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEdyYWRGdW5Db250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZncmFkZnVuX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl92Zl9ncmFkZnVuX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX3ZmX2dyYWRmdW5fb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9oZmxpcC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2hmbGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5YTYwOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9oZmxpcC5jCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IEJlbm9pdCBGb3VldAorICogQ29weXJpZ2h0IChjKSAyMDEwIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaG9yaXpvbnRhbCBmbGlwIGZpbHRlcgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgRmxpcENvbnRleHQgeworICAgIGludCBtYXhfc3RlcFs0XTsgICAgLy8vPCBtYXggcGl4ZWwgc3RlcCBmb3IgZWFjaCBwbGFuZSwgZXhwcmVzc2VkIGFzIGEgbnVtYmVyIG9mIGJ5dGVzCisgICAgaW50IHBsYW5ld2lkdGhbNF07ICAvLy88IHdpZHRoIG9mIGVhY2ggcGxhbmUKKyAgICBpbnQgcGxhbmVoZWlnaHRbNF07IC8vLzwgaGVpZ2h0IG9mIGVhY2ggcGxhbmUKK30gRmxpcENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKnBpeF9mbXRzID0gTlVMTDsKKyAgICBpbnQgZm10OworCisgICAgZm9yIChmbXQgPSAwOyBhdl9waXhfZm10X2Rlc2NfZ2V0KGZtdCk7IGZtdCsrKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZm10KTsKKyAgICAgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCB8fAorICAgICAgICAgICAgICBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CSVRTVFJFQU0gfHwKKyAgICAgICAgICAgICAgKGRlc2MtPmxvZzJfY2hyb21hX3cgIT0gZGVzYy0+bG9nMl9jaHJvbWFfaCAmJgorICAgICAgICAgICAgICAgZGVzYy0+Y29tcFswXS5wbGFuZSA9PSBkZXNjLT5jb21wWzFdLnBsYW5lKSkpCisgICAgICAgICAgICBmZl9hZGRfZm9ybWF0KCZwaXhfZm10cywgZm10KTsKKyAgICB9CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBwaXhfZm10cyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEZsaXBDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhfZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGNvbnN0IGludCBoc3ViID0gcGl4X2Rlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgY29uc3QgaW50IHZzdWIgPSBwaXhfZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIGF2X2ltYWdlX2ZpbGxfbWF4X3BpeHN0ZXBzKHMtPm1heF9zdGVwLCBOVUxMLCBwaXhfZGVzYyk7CisgICAgcy0+cGxhbmV3aWR0aFswXSAgPSBzLT5wbGFuZXdpZHRoWzNdICA9IGlubGluay0+dzsKKyAgICBzLT5wbGFuZXdpZHRoWzFdICA9IHMtPnBsYW5ld2lkdGhbMl0gID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT53LCBoc3ViKTsKKyAgICBzLT5wbGFuZWhlaWdodFswXSA9IHMtPnBsYW5laGVpZ2h0WzNdID0gaW5saW5rLT5oOworICAgIHMtPnBsYW5laGVpZ2h0WzFdID0gcy0+cGxhbmVoZWlnaHRbMl0gPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IFRocmVhZERhdGEgeworICAgIEFWRnJhbWUgKmluLCAqb3V0OworfSBUaHJlYWREYXRhOworCitzdGF0aWMgaW50IGZpbHRlcl9zbGljZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9iLCBpbnQgbmJfam9icykKK3sKKyAgICBGbGlwQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBBVkZyYW1lICppbiA9IHRkLT5pbjsKKyAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OworICAgIHVpbnQ4X3QgKmlucm93LCAqb3V0cm93OworICAgIGludCBpLCBqLCBwbGFuZSwgc3RlcDsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQgJiYgaW4tPmRhdGFbcGxhbmVdICYmIGluLT5saW5lc2l6ZVtwbGFuZV07IHBsYW5lKyspIHsKKyAgICAgICAgY29uc3QgaW50IHdpZHRoICA9IHMtPnBsYW5ld2lkdGhbcGxhbmVdOworICAgICAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcy0+cGxhbmVoZWlnaHRbcGxhbmVdOworICAgICAgICBjb25zdCBpbnQgc3RhcnQgPSAoaGVpZ2h0ICogIGpvYiAgICkgLyBuYl9qb2JzOworICAgICAgICBjb25zdCBpbnQgZW5kICAgPSAoaGVpZ2h0ICogKGpvYisxKSkgLyBuYl9qb2JzOworCisgICAgICAgIHN0ZXAgPSBzLT5tYXhfc3RlcFtwbGFuZV07CisKKyAgICAgICAgb3V0cm93ID0gb3V0LT5kYXRhW3BsYW5lXSArIHN0YXJ0ICogb3V0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIGlucm93ICA9IGluIC0+ZGF0YVtwbGFuZV0gKyBzdGFydCAqIGluLT5saW5lc2l6ZVtwbGFuZV0gKyAod2lkdGggLSAxKSAqIHN0ZXA7CisgICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RlcCkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICBvdXRyb3dbal0gPSBpbnJvd1stal07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90ICpvdXRyb3cxNiA9ICh1aW50MTZfdCAqKW91dHJvdzsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqIGlucm93MTYgPSAodWludDE2X3QgKikgaW5yb3c7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgICAgICAgICAgICAgIG91dHJvdzE2W2pdID0gaW5yb3cxNlstal07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmluICA9ICBpbnJvdzsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQgPSBvdXRyb3c7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyssIG91dCArPSAzLCBpbiAtPSAzKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdiA9IEFWX1JCMjQoaW4pOworICAgICAgICAgICAgICAgICAgICBBVl9XQjI0KG91dCwgdik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0cm93MzIgPSAodWludDMyX3QgKilvdXRyb3c7CisgICAgICAgICAgICAgICAgdWludDMyX3QgKiBpbnJvdzMyID0gKHVpbnQzMl90ICopIGlucm93OworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICBvdXRyb3czMltqXSA9IGlucm93MzJbLWpdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShvdXRyb3cgKyBqKnN0ZXAsIGlucm93IC0gaipzdGVwLCBzdGVwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5yb3cgICs9IGluIC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgb3V0cm93ICs9IG91dC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCAgPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgVGhyZWFkRGF0YSB0ZDsKKyAgICBBVkZyYW1lICpvdXQ7CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKworICAgIC8qIGNvcHkgcGFsZXR0ZSBpZiByZXF1aXJlZCAqLworICAgIGlmIChhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KS0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMKQorICAgICAgICBtZW1jcHkob3V0LT5kYXRhWzFdLCBpbi0+ZGF0YVsxXSwgQVZQQUxFVFRFX1NJWkUpOworCisgICAgdGQuaW4gPSBpbiwgdGQub3V0ID0gb3V0OworICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2UsICZ0ZCwgTlVMTCwgRkZNSU4ob3V0bGluay0+aCwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworCisgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX2hmbGlwX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfaGZsaXBfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2hmbGlwID0geworICAgIC5uYW1lICAgICAgICAgID0gImhmbGlwIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJIb3Jpem9udGFsbHkgZmxpcCB0aGUgaW5wdXQgdmlkZW8uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRmxpcENvbnRleHQpLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGF2ZmlsdGVyX3ZmX2hmbGlwX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX3ZmX2hmbGlwX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2hpc3RlcS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2hpc3RlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZGI3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfaGlzdGVxLmMKQEAgLTAsMCArMSwyODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSmVyZW15IFRyYW4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBEb25hbGQgQS4gR3JhZnQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBIaXN0b2dyYW0gZXF1YWxpemF0aW9uIGZpbHRlciwgYmFzZWQgb24gdGhlIFZpcnR1YWxEdWIgZmlsdGVyIGJ5CisgKiBEb25hbGQgQS4gR3JhZnQgIDxuZXVyb24yIEFUIGhvbWUgRE9UIGNvbT4uCisgKiBJbXBsZW1lbnRzIGdsb2JhbCBhdXRvbWF0aWMgY29udHJhc3QgYWRqdXN0bWVudCBieSBtZWFucyBvZgorICogaGlzdG9ncmFtIGVxdWFsaXphdGlvbi4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJkcmF3dXRpbHMuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCisvLyAjZGVmaW5lIERFQlVHCisKKy8vIExpbmVhciBDb25ncnVlbnRpYWwgR2VuZXJhdG9yLCBzZWUgIk51bWVyaWNhbCBSZWNpcGVzIgorI2RlZmluZSBMQ0dfQSA0MDk2CisjZGVmaW5lIExDR19DIDE1MDg4OQorI2RlZmluZSBMQ0dfTSA3MTQwMjUKKyNkZWZpbmUgTENHKHgpICgoKHgpICogTENHX0EgKyBMQ0dfQykgJSBMQ0dfTSkKKyNkZWZpbmUgTENHX1NFRUQgNzM5MTg3CisKK2VudW0gSGlzdGVxQW50aWJhbmRpbmcgeworICAgIEhJU1RFUV9BTlRJQkFORElOR19OT05FICAgPSAwLAorICAgIEhJU1RFUV9BTlRJQkFORElOR19XRUFLICAgPSAxLAorICAgIEhJU1RFUV9BTlRJQkFORElOR19TVFJPTkcgPSAyLAorICAgIEhJU1RFUV9BTlRJQkFORElOR19OQiwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBmbG9hdCBzdHJlbmd0aDsKKyAgICBmbG9hdCBpbnRlbnNpdHk7CisgICAgZW51bSBIaXN0ZXFBbnRpYmFuZGluZyBhbnRpYmFuZGluZzsKKyAgICBpbnQgaW5faGlzdG9ncmFtIFsyNTZdOyAgICAgICAgLy8vPCBpbnB1dCBoaXN0b2dyYW0KKyAgICBpbnQgb3V0X2hpc3RvZ3JhbVsyNTZdOyAgICAgICAgLy8vPCBvdXRwdXQgaGlzdG9ncmFtCisgICAgaW50IExVVFsyNTZdOyAgICAgICAgICAgICAgICAgIC8vLzwgbG9va3VwIHRhYmxlIGRlcml2ZWQgZnJvbSBoaXN0b2dyYW1bXQorICAgIHVpbnQ4X3QgcmdiYV9tYXBbNF07ICAgICAgICAgICAvLy88IGNvbXBvbmVudHMgcG9zaXRpb24KKyAgICBpbnQgYnBwOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBieXRlcyBwZXIgcGl4ZWwKK30gSGlzdGVxQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSGlzdGVxQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisjZGVmaW5lIENPTlNUKG5hbWUsIGhlbHAsIHZhbCwgdW5pdCkgeyBuYW1lLCBoZWxwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9dmFsfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsIHVuaXQgfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaGlzdGVxX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzdHJlbmd0aCIsICAgICJzZXQgdGhlIHN0cmVuZ3RoIiwgT0ZGU0VUKHN0cmVuZ3RoKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuMn0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiaW50ZW5zaXR5IiwgICAic2V0IHRoZSBpbnRlbnNpdHkiLCBPRkZTRVQoaW50ZW5zaXR5KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuMjF9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgImFudGliYW5kaW5nIiwgInNldCB0aGUgYW50aWJhbmRpbmcgbGV2ZWwiLCBPRkZTRVQoYW50aWJhbmRpbmcpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUhJU1RFUV9BTlRJQkFORElOR19OT05FfSwgMCwgSElTVEVRX0FOVElCQU5ESU5HX05CLTEsIEZMQUdTLCAiYW50aWJhbmRpbmciIH0sCisgICAgQ09OU1QoIm5vbmUiLCAgICAiYXBwbHkgbm8gYW50aWJhbmRpbmciLCAgICAgSElTVEVRX0FOVElCQU5ESU5HX05PTkUsICAgImFudGliYW5kaW5nIiksCisgICAgQ09OU1QoIndlYWsiLCAgICAiYXBwbHkgd2VhayBhbnRpYmFuZGluZyIsICAgSElTVEVRX0FOVElCQU5ESU5HX1dFQUssICAgImFudGliYW5kaW5nIiksCisgICAgQ09OU1QoInN0cm9uZyIsICAiYXBwbHkgc3Ryb25nIGFudGliYW5kaW5nIiwgSElTVEVRX0FOVElCQU5ESU5HX1NUUk9ORywgImFudGliYW5kaW5nIiksCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhoaXN0ZXEpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBIaXN0ZXFDb250ZXh0ICpoaXN0ZXEgPSBjdHgtPnByaXY7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgInN0cmVuZ3RoOiUwLjNmIGludGVuc2l0eTolMC4zZiBhbnRpYmFuZGluZzolZFxuIiwKKyAgICAgICAgICAgaGlzdGVxLT5zdHJlbmd0aCwgaGlzdGVxLT5pbnRlbnNpdHksIGhpc3RlcS0+YW50aWJhbmRpbmcpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX0FSR0IsIEFWX1BJWF9GTVRfUkdCQSwgQVZfUElYX0ZNVF9BQkdSLCBBVl9QSVhfRk1UX0JHUkEsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCMjQsIEFWX1BJWF9GTVRfQkdSMjQsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgSGlzdGVxQ29udGV4dCAqaGlzdGVxID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKworICAgIGhpc3RlcS0+YnBwID0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKHBpeF9kZXNjKSAvIDg7CisgICAgZmZfZmlsbF9yZ2JhX21hcChoaXN0ZXEtPnJnYmFfbWFwLCBpbmxpbmstPmZvcm1hdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBSIDAKKyNkZWZpbmUgRyAxCisjZGVmaW5lIEIgMgorI2RlZmluZSBBIDMKKworI2RlZmluZSBHRVRfUkdCX1ZBTFVFUyhyLCBnLCBiLCBzcmMsIG1hcCkgZG8geyBcCisgICAgciA9IHNyY1t4ICsgbWFwW1JdXTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnID0gc3JjW3ggKyBtYXBbR11dOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIgPSBzcmNbeCArIG1hcFtCXV07ICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5waWMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAgKmN0eCAgICAgPSBpbmxpbmstPmRzdDsKKyAgICBIaXN0ZXFDb250ZXh0ICAgICAqaGlzdGVxICA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgICAgICAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBpbnQgc3RyZW5ndGggID0gaGlzdGVxLT5zdHJlbmd0aCAgKiAxMDAwOworICAgIGludCBpbnRlbnNpdHkgPSBoaXN0ZXEtPmludGVuc2l0eSAqIDEwMDA7CisgICAgaW50IHgsIHksIGksIGx1dGhpLCBsdXRsbywgbHV0LCBsdW1hLCBvbHVtYSwgbTsKKyAgICBBVkZyYW1lICpvdXRwaWM7CisgICAgdW5zaWduZWQgaW50IHIsIGcsIGIsIGpyYW47CisgICAgdWludDhfdCAqc3JjLCAqZHN0OworCisgICAgb3V0cGljID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dHBpYykgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnBpYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0cGljLCBpbnBpYyk7CisKKyAgICAvKiBTZWVkIHJhbmRvbSBnZW5lcmF0b3IgZm9yIGFudGliYW5kaW5nLiAqLworICAgIGpyYW4gPSBMQ0dfU0VFRDsKKworICAgIC8qIENhbGN1bGF0ZSBhbmQgc3RvcmUgdGhlIGx1bWluYW5jZSBhbmQgY2FsY3VsYXRlIHRoZSBnbG9iYWwgaGlzdG9ncmFtCisgICAgICAgYmFzZWQgb24gdGhlIGx1bWluYW5jZS4gKi8KKyAgICBtZW1zZXQoaGlzdGVxLT5pbl9oaXN0b2dyYW0sIDAsIHNpemVvZihoaXN0ZXEtPmluX2hpc3RvZ3JhbSkpOworICAgIHNyYyA9IGlucGljLT5kYXRhWzBdOworICAgIGRzdCA9IG91dHBpYy0+ZGF0YVswXTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaW5saW5rLT5oOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlubGluay0+dyAqIGhpc3RlcS0+YnBwOyB4ICs9IGhpc3RlcS0+YnBwKSB7CisgICAgICAgICAgICBHRVRfUkdCX1ZBTFVFUyhyLCBnLCBiLCBzcmMsIGhpc3RlcS0+cmdiYV9tYXApOworICAgICAgICAgICAgbHVtYSA9ICg1NSAqIHIgKyAxODIgKiBnICsgMTkgKiBiKSA+PiA4OworICAgICAgICAgICAgZHN0W3ggKyBoaXN0ZXEtPnJnYmFfbWFwW0FdXSA9IGx1bWE7CisgICAgICAgICAgICBoaXN0ZXEtPmluX2hpc3RvZ3JhbVtsdW1hXSsrOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBpbnBpYy0+bGluZXNpemVbMF07CisgICAgICAgIGRzdCArPSBvdXRwaWMtPmxpbmVzaXplWzBdOworICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgZm9yICh4ID0gMDsgeCA8IDI1NjsgeCsrKQorICAgICAgICBhdl9kbG9nKGN0eCwgImluWyVkXTogJXVcbiIsIHgsIGhpc3RlcS0+aW5faGlzdG9ncmFtW3hdKTsKKyNlbmRpZgorCisgICAgLyogQ2FsY3VsYXRlIHRoZSBsb29rdXAgdGFibGUuICovCisgICAgaGlzdGVxLT5MVVRbMF0gPSBoaXN0ZXEtPmluX2hpc3RvZ3JhbVswXTsKKyAgICAvKiBBY2N1bXVsYXRlICovCisgICAgZm9yICh4ID0gMTsgeCA8IDI1NjsgeCsrKQorICAgICAgICBoaXN0ZXEtPkxVVFt4XSA9IGhpc3RlcS0+TFVUW3gtMV0gKyBoaXN0ZXEtPmluX2hpc3RvZ3JhbVt4XTsKKworICAgIC8qIE5vcm1hbGl6ZSAqLworICAgIGZvciAoeCA9IDA7IHggPCAyNTY7IHgrKykKKyAgICAgICAgaGlzdGVxLT5MVVRbeF0gPSAoaGlzdGVxLT5MVVRbeF0gKiBpbnRlbnNpdHkpIC8gKGlubGluay0+aCAqIGlubGluay0+dyk7CisKKyAgICAvKiBBZGp1c3QgdGhlIExVVCBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgc3RyZW5ndGguIFRoaXMgaXMgYW4gYWxwaGEKKyAgICAgICBtaXggb2YgdGhlIGNhbGN1bGF0ZWQgTFVUIGFuZCBhIGxpbmVhciBMVVQgd2l0aCBnYWluIDEuICovCisgICAgZm9yICh4ID0gMDsgeCA8IDI1NjsgeCsrKQorICAgICAgICBoaXN0ZXEtPkxVVFt4XSA9IChzdHJlbmd0aCAqIGhpc3RlcS0+TFVUW3hdKSAvIDI1NSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgyNTUgLSBzdHJlbmd0aCkgKiB4KSAgICAgIC8gMjU1OworCisgICAgLyogT3V0cHV0IHRoZSBlcXVhbGl6ZWQgZnJhbWUuICovCisgICAgbWVtc2V0KGhpc3RlcS0+b3V0X2hpc3RvZ3JhbSwgMCwgc2l6ZW9mKGhpc3RlcS0+b3V0X2hpc3RvZ3JhbSkpOworCisgICAgc3JjID0gaW5waWMtPmRhdGFbMF07CisgICAgZHN0ID0gb3V0cGljLT5kYXRhWzBdOworICAgIGZvciAoeSA9IDA7IHkgPCBpbmxpbmstPmg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW5saW5rLT53ICogaGlzdGVxLT5icHA7IHggKz0gaGlzdGVxLT5icHApIHsKKyAgICAgICAgICAgIGx1bWEgPSBkc3RbeCArIGhpc3RlcS0+cmdiYV9tYXBbQV1dOworICAgICAgICAgICAgaWYgKGx1bWEgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0ZXEtPmJwcDsgKytpKQorICAgICAgICAgICAgICAgICAgICBkc3RbeCArIGldID0gMDsKKyAgICAgICAgICAgICAgICBoaXN0ZXEtPm91dF9oaXN0b2dyYW1bMF0rKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbHV0ID0gaGlzdGVxLT5MVVRbbHVtYV07CisgICAgICAgICAgICAgICAgaWYgKGhpc3RlcS0+YW50aWJhbmRpbmcgIT0gSElTVEVRX0FOVElCQU5ESU5HX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGx1bWEgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsdXRsbyA9IGhpc3RlcS0+YW50aWJhbmRpbmcgPT0gSElTVEVRX0FOVElCQU5ESU5HX1dFQUsgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGlzdGVxLT5MVVRbbHVtYV0gKyBoaXN0ZXEtPkxVVFtsdW1hIC0gMV0pIC8gMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0ZXEtPkxVVFtsdW1hIC0gMV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbHV0bG8gPSBsdXQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGx1bWEgPCAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGx1dGhpID0gKGhpc3RlcS0+YW50aWJhbmRpbmcgPT0gSElTVEVRX0FOVElCQU5ESU5HX1dFQUspID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGlzdGVxLT5MVVRbbHVtYV0gKyBoaXN0ZXEtPkxVVFtsdW1hICsgMV0pIC8gMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RlcS0+TFVUW2x1bWEgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBsdXRoaSA9IGx1dDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobHV0bG8gIT0gbHV0aGkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpyYW4gPSBMQ0coanJhbik7CisgICAgICAgICAgICAgICAgICAgICAgICBsdXQgPSBsdXRsbyArICgobHV0aGkgLSBsdXRsbyArIDEpICoganJhbikgLyBMQ0dfTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEdFVF9SR0JfVkFMVUVTKHIsIGcsIGIsIHNyYywgaGlzdGVxLT5yZ2JhX21hcCk7CisgICAgICAgICAgICAgICAgaWYgKCgobSA9IEZGTUFYMyhyLCBnLCBiKSkgKiBsdXQpIC8gbHVtYSA+IDI1NSkgeworICAgICAgICAgICAgICAgICAgICByID0gKHIgKiAyNTUpIC8gbTsKKyAgICAgICAgICAgICAgICAgICAgZyA9IChnICogMjU1KSAvIG07CisgICAgICAgICAgICAgICAgICAgIGIgPSAoYiAqIDI1NSkgLyBtOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHIgPSAociAqIGx1dCkgLyBsdW1hOworICAgICAgICAgICAgICAgICAgICBnID0gKGcgKiBsdXQpIC8gbHVtYTsKKyAgICAgICAgICAgICAgICAgICAgYiA9IChiICogbHV0KSAvIGx1bWE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdFt4ICsgaGlzdGVxLT5yZ2JhX21hcFtSXV0gPSByOworICAgICAgICAgICAgICAgIGRzdFt4ICsgaGlzdGVxLT5yZ2JhX21hcFtHXV0gPSBnOworICAgICAgICAgICAgICAgIGRzdFt4ICsgaGlzdGVxLT5yZ2JhX21hcFtCXV0gPSBiOworICAgICAgICAgICAgICAgIG9sdW1hID0gYXZfY2xpcF91aW50OCgoNTUgKiByICsgMTgyICogZyArIDE5ICogYikgPj4gOCk7CisgICAgICAgICAgICAgICAgaGlzdGVxLT5vdXRfaGlzdG9ncmFtW29sdW1hXSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNyYyArPSBpbnBpYy0+bGluZXNpemVbMF07CisgICAgICAgIGRzdCArPSBvdXRwaWMtPmxpbmVzaXplWzBdOworICAgIH0KKyNpZmRlZiBERUJVRworICAgIGZvciAoeCA9IDA7IHggPCAyNTY7IHgrKykKKyAgICAgICAgYXZfZGxvZyhjdHgsICJvdXRbJWRdOiAldVxuIiwgeCwgaGlzdGVxLT5vdXRfaGlzdG9ncmFtW3hdKTsKKyNlbmRpZgorCisgICAgYXZfZnJhbWVfZnJlZSgmaW5waWMpOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0cGljKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGhpc3RlcV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGhpc3RlcV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfaGlzdGVxID0geworICAgIC5uYW1lICAgICAgICAgID0gImhpc3RlcSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgZ2xvYmFsIGNvbG9yIGhpc3RvZ3JhbSBlcXVhbGl6YXRpb24uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoSGlzdGVxQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGhpc3RlcV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBoaXN0ZXFfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZoaXN0ZXFfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfaGlzdG9ncmFtLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfaGlzdG9ncmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2NTZiNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9oaXN0b2dyYW0uYwpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK2VudW0gSGlzdG9ncmFtTW9kZSB7CisgICAgTU9ERV9MRVZFTFMsCisgICAgTU9ERV9XQVZFRk9STSwKKyAgICBNT0RFX0NPTE9SLAorICAgIE1PREVfQ09MT1IyLAorICAgIE1PREVfTkIKK307CisKK3R5cGVkZWYgc3RydWN0IEhpc3RvZ3JhbUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOyAgICAgICAgICAgICAgIC8vLzwgQVZDbGFzcyBjb250ZXh0IGZvciBsb2cgYW5kIG9wdGlvbnMgcHVycG9zZQorICAgIGVudW0gSGlzdG9ncmFtTW9kZSBtb2RlOworICAgIHVuc2lnbmVkICAgICAgIGhpc3RvZ3JhbVsyNTZdOworICAgIGludCAgICAgICAgICAgIG5jb21wOworICAgIGNvbnN0IHVpbnQ4X3QgICpiZ19jb2xvcjsKKyAgICBjb25zdCB1aW50OF90ICAqZmdfY29sb3I7CisgICAgaW50ICAgICAgICAgICAgbGV2ZWxfaGVpZ2h0OworICAgIGludCAgICAgICAgICAgIHNjYWxlX2hlaWdodDsKKyAgICBpbnQgICAgICAgICAgICBzdGVwOworICAgIGludCAgICAgICAgICAgIHdhdmVmb3JtX21vZGU7CisgICAgaW50ICAgICAgICAgICAgd2F2ZWZvcm1fbWlycm9yOworICAgIGludCAgICAgICAgICAgIGRpc3BsYXlfbW9kZTsKKyAgICBpbnQgICAgICAgICAgICBsZXZlbHNfbW9kZTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7Cit9IEhpc3RvZ3JhbUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEhpc3RvZ3JhbUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaGlzdG9ncmFtX29wdGlvbnNbXSA9IHsKKyAgICB7ICJtb2RlIiwgInNldCBoaXN0b2dyYW0gbW9kZSIsIE9GRlNFVChtb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1NT0RFX0xFVkVMU30sIDAsIE1PREVfTkItMSwgRkxBR1MsICJtb2RlIn0sCisgICAgeyAibGV2ZWxzIiwgInN0YW5kYXJkIGhpc3RvZ3JhbSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT0RFX0xFVkVMU30sIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJ3YXZlZm9ybSIsICJwZXIgcm93L2NvbHVtbiBsdW1pbmFuY2UgZ3JhcGgiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9XQVZFRk9STX0sIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJjb2xvciIsICJjaHJvbWEgdmFsdWVzIGluIHZlY3RvcnNjb3BlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU1PREVfQ09MT1J9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAiY29sb3IyIiwgImNocm9tYSB2YWx1ZXMgaW4gdmVjdG9yc2NvcGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9DT0xPUjJ9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAibGV2ZWxfaGVpZ2h0IiwgInNldCBsZXZlbCBoZWlnaHQiLCBPRkZTRVQobGV2ZWxfaGVpZ2h0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0yMDB9LCA1MCwgMjA0OCwgRkxBR1N9LAorICAgIHsgInNjYWxlX2hlaWdodCIsICJzZXQgc2NhbGUgaGVpZ2h0IiwgT0ZGU0VUKHNjYWxlX2hlaWdodCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MTJ9LCAwLCA0MCwgRkxBR1N9LAorICAgIHsgInN0ZXAiLCAic2V0IHdhdmVmb3JtIHN0ZXAgdmFsdWUiLCBPRkZTRVQoc3RlcCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MTB9LCAxLCAyNTUsIEZMQUdTfSwKKyAgICB7ICJ3YXZlZm9ybV9tb2RlIiwgInNldCB3YXZlZm9ybSBtb2RlIiwgT0ZGU0VUKHdhdmVmb3JtX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUywgIndhdmVmb3JtX21vZGUifSwKKyAgICB7ICJyb3ciLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgRkxBR1MsICJ3YXZlZm9ybV9tb2RlIiB9LAorICAgIHsgImNvbHVtbiIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgRkxBR1MsICJ3YXZlZm9ybV9tb2RlIiB9LAorICAgIHsgIndhdmVmb3JtX21pcnJvciIsICJzZXQgd2F2ZWZvcm0gbWlycm9yaW5nIiwgT0ZGU0VUKHdhdmVmb3JtX21pcnJvciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTLCAid2F2ZWZvcm1fbWlycm9yIn0sCisgICAgeyAiZGlzcGxheV9tb2RlIiwgInNldCBkaXNwbGF5IG1vZGUiLCBPRkZTRVQoZGlzcGxheV9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xfSwgMCwgMSwgRkxBR1MsICJkaXNwbGF5X21vZGUifSwKKyAgICB7ICJwYXJhZGUiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgImRpc3BsYXlfbW9kZSIgfSwKKyAgICB7ICJvdmVybGF5IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTB9LCAwLCAwLCBGTEFHUywgImRpc3BsYXlfbW9kZSIgfSwKKyAgICB7ICJsZXZlbHNfbW9kZSIsICJzZXQgbGV2ZWxzIG1vZGUiLCBPRkZTRVQobGV2ZWxzX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUywgImxldmVsc19tb2RlIn0sCisgICAgeyAibGluZWFyIiwgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sIDAsIDAsIEZMQUdTLCAibGV2ZWxzX21vZGUiIH0sCisgICAgeyAibG9nYXJpdGhtaWMiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MX0sIDAsIDAsIEZMQUdTLCAibGV2ZWxzX21vZGUiIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhoaXN0b2dyYW0pOworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGNvbG9yX3BpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBsZXZlbHNfcGl4X2ZtdHNbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsCisgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUkFQLCBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgd2F2ZWZvcm1fcGl4X2ZtdHNbXSA9IHsKKyAgICAgQVZfUElYX0ZNVF9HQlJQLCAgICAgQVZfUElYX0ZNVF9HQlJBUCwKKyAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLCAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgIEFWX1BJWF9GTVRfWVVWNDExUCwgIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgQVZfUElYX0ZNVF9ZVVZKNDQwUCwgQVZfUElYX0ZNVF9ZVVZKNDExUCwgQVZfUElYX0ZNVF9ZVVZKNDIwUCwKKyAgICAgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKKyAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICAgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgSGlzdG9ncmFtQ29udGV4dCAqaCA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnBpeF9mbXRzOworCisgICAgc3dpdGNoIChoLT5tb2RlKSB7CisgICAgY2FzZSBNT0RFX1dBVkVGT1JNOgorICAgICAgICBwaXhfZm10cyA9IHdhdmVmb3JtX3BpeF9mbXRzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfTEVWRUxTOgorICAgICAgICBwaXhfZm10cyA9IGxldmVsc19waXhfZm10czsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX0NPTE9SOgorICAgIGNhc2UgTU9ERV9DT0xPUjI6CisgICAgICAgIHBpeF9mbXRzID0gY29sb3JfcGl4X2ZtdHM7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJsYWNrX3l1dmFfY29sb3JbNF0gPSB7IDAsIDEyNywgMTI3LCAyNTUgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGJsYWNrX2dicnBfY29sb3JbNF0gPSB7IDAsIDAsIDAsIDI1NSB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgd2hpdGVfeXV2YV9jb2xvcls0XSA9IHsgMjU1LCAxMjcsIDEyNywgMjU1IH07CitzdGF0aWMgY29uc3QgdWludDhfdCB3aGl0ZV9nYnJwX2NvbG9yWzRdID0geyAyNTUsIDI1NSwgMjU1LCAyNTUgfTsKKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgSGlzdG9ncmFtQ29udGV4dCAqaCA9IGlubGluay0+ZHN0LT5wcml2OworCisgICAgaC0+ZGVzYyAgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBoLT5uY29tcCA9IGgtPmRlc2MtPm5iX2NvbXBvbmVudHM7CisKKyAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOgorICAgICAgICBoLT5iZ19jb2xvciA9IGJsYWNrX2dicnBfY29sb3I7CisgICAgICAgIGgtPmZnX2NvbG9yID0gd2hpdGVfZ2JycF9jb2xvcjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaC0+YmdfY29sb3IgPSBibGFja195dXZhX2NvbG9yOworICAgICAgICBoLT5mZ19jb2xvciA9IHdoaXRlX3l1dmFfY29sb3I7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgSGlzdG9ncmFtQ29udGV4dCAqaCA9IGN0eC0+cHJpdjsKKworICAgIHN3aXRjaCAoaC0+bW9kZSkgeworICAgIGNhc2UgTU9ERV9MRVZFTFM6CisgICAgICAgIG91dGxpbmstPncgPSAyNTY7CisgICAgICAgIG91dGxpbmstPmggPSAoaC0+bGV2ZWxfaGVpZ2h0ICsgaC0+c2NhbGVfaGVpZ2h0KSAqIEZGTUFYKGgtPm5jb21wICogaC0+ZGlzcGxheV9tb2RlLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX1dBVkVGT1JNOgorICAgICAgICBpZiAoaC0+d2F2ZWZvcm1fbW9kZSkKKyAgICAgICAgICAgIG91dGxpbmstPmggPSAyNTYgKiBGRk1BWChoLT5uY29tcCAqIGgtPmRpc3BsYXlfbW9kZSwgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dGxpbmstPncgPSAyNTYgKiBGRk1BWChoLT5uY29tcCAqIGgtPmRpc3BsYXlfbW9kZSwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9DT0xPUjoKKyAgICBjYXNlIE1PREVfQ09MT1IyOgorICAgICAgICBvdXRsaW5rLT5oID0gb3V0bGluay0+dyA9IDI1NjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICB9CisKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpezEsMX07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2VuX3dhdmVmb3JtKEhpc3RvZ3JhbUNvbnRleHQgKmgsIEFWRnJhbWUgKmlucGljcmVmLCBBVkZyYW1lICpvdXRwaWNyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudCwgaW50IGludGVuc2l0eSwgaW50IG9mZnNldCwgaW50IGNvbF9tb2RlKQoreworICAgIGNvbnN0IGludCBwbGFuZSA9IGgtPmRlc2MtPmNvbXBbY29tcG9uZW50XS5wbGFuZTsKKyAgICBjb25zdCBpbnQgbWlycm9yID0gaC0+d2F2ZWZvcm1fbWlycm9yOworICAgIGNvbnN0IGludCBpc19jaHJvbWEgPSAoY29tcG9uZW50ID09IDEgfHwgY29tcG9uZW50ID09IDIpOworICAgIGNvbnN0IGludCBzaGlmdF93ID0gKGlzX2Nocm9tYSA/IGgtPmRlc2MtPmxvZzJfY2hyb21hX3cgOiAwKTsKKyAgICBjb25zdCBpbnQgc2hpZnRfaCA9IChpc19jaHJvbWEgPyBoLT5kZXNjLT5sb2cyX2Nocm9tYV9oIDogMCk7CisgICAgY29uc3QgaW50IHNyY19saW5lc2l6ZSA9IGlucGljcmVmLT5saW5lc2l6ZVtwbGFuZV07CisgICAgY29uc3QgaW50IGRzdF9saW5lc2l6ZSA9IG91dHBpY3JlZi0+bGluZXNpemVbcGxhbmVdOworICAgIGNvbnN0IGludCBkc3Rfc2lnbmVkX2xpbmVzaXplID0gZHN0X2xpbmVzaXplICogKG1pcnJvciA9PSAxID8gLTEgOiAxKTsKKyAgICB1aW50OF90ICpzcmNfZGF0YSA9IGlucGljcmVmLT5kYXRhW3BsYW5lXTsKKyAgICB1aW50OF90ICpkc3RfZGF0YSA9IG91dHBpY3JlZi0+ZGF0YVtwbGFuZV0gKyAoY29sX21vZGUgPyAob2Zmc2V0ID4+IHNoaWZ0X2gpICogZHN0X2xpbmVzaXplIDogb2Zmc2V0ID4+IHNoaWZ0X3cpOworICAgIHVpbnQ4X3QgKiBjb25zdCBkc3RfYm90dG9tX2xpbmUgPSBkc3RfZGF0YSArIGRzdF9saW5lc2l6ZSAqICgoMjU2ID4+IHNoaWZ0X2gpIC0gMSk7CisgICAgdWludDhfdCAqIGNvbnN0IGRzdF9saW5lID0gKG1pcnJvciA/IGRzdF9ib3R0b21fbGluZSA6IGRzdF9kYXRhKTsKKyAgICBjb25zdCB1aW50OF90IG1heCA9IDI1NSAtIGludGVuc2l0eTsKKyAgICBjb25zdCBpbnQgc3JjX2ggPSBGRl9DRUlMX1JTSElGVChpbnBpY3JlZi0+aGVpZ2h0LCBzaGlmdF9oKTsKKyAgICBjb25zdCBpbnQgc3JjX3cgPSBGRl9DRUlMX1JTSElGVChpbnBpY3JlZi0+d2lkdGgsIHNoaWZ0X3cpOworICAgIHVpbnQ4X3QgKmRzdCwgKnA7CisgICAgaW50IHk7CisKKyAgICBpZiAoIWNvbF9tb2RlICYmIG1pcnJvcikKKyAgICAgICAgZHN0X2RhdGEgKz0gMjU2ID4+IHNoaWZ0X3c7CisgICAgZm9yICh5ID0gMDsgeSA8IHNyY19oOyB5KyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX2RhdGFfZW5kID0gc3JjX2RhdGEgKyBzcmNfdzsKKyAgICAgICAgZHN0ID0gZHN0X2xpbmU7CisgICAgICAgIGZvciAocCA9IHNyY19kYXRhOyBwIDwgc3JjX2RhdGFfZW5kOyBwKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnRhcmdldDsKKyAgICAgICAgICAgIGlmIChjb2xfbW9kZSkgeworICAgICAgICAgICAgICAgIHRhcmdldCA9IGRzdCsrICsgZHN0X3NpZ25lZF9saW5lc2l6ZSAqICgqcCA+PiBzaGlmdF9oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1pcnJvcikKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZHN0X2RhdGEgLSAoKnAgPj4gc2hpZnRfdyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkc3RfZGF0YSArICgqcCA+PiBzaGlmdF93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqdGFyZ2V0IDw9IG1heCkKKyAgICAgICAgICAgICAgICAqdGFyZ2V0ICs9IGludGVuc2l0eTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqdGFyZ2V0ID0gMjU1OworICAgICAgICB9CisgICAgICAgIHNyY19kYXRhICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgZHN0X2RhdGEgKz0gZHN0X2xpbmVzaXplOworICAgIH0KK30KKworCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgSGlzdG9ncmFtQ29udGV4dCAqaCAgID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBjb25zdCB1aW50OF90ICpzcmM7CisgICAgdWludDhfdCAqZHN0OworICAgIGludCBpLCBqLCBrLCBsOworCisgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgb3V0LT5wdHMgPSBpbi0+cHRzOworCisgICAgZm9yIChrID0gMDsgayA8IGgtPm5jb21wOyBrKyspIHsKKyAgICAgICAgY29uc3QgaW50IGlzX2Nocm9tYSA9IChrID09IDEgfHwgayA9PSAyKTsKKyAgICAgICAgY29uc3QgaW50IGRzdF9oID0gRkZfQ0VJTF9SU0hJRlQob3V0bGluay0+aCwgKGlzX2Nocm9tYSA/IGgtPmRlc2MtPmxvZzJfY2hyb21hX2ggOiAwKSk7CisgICAgICAgIGNvbnN0IGludCBkc3RfdyA9IEZGX0NFSUxfUlNISUZUKG91dGxpbmstPncsIChpc19jaHJvbWEgPyBoLT5kZXNjLT5sb2cyX2Nocm9tYV93IDogMCkpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0X2ggOyBpKyspCisgICAgICAgICAgICBtZW1zZXQob3V0LT5kYXRhW2gtPmRlc2MtPmNvbXBba10ucGxhbmVdICsKKyAgICAgICAgICAgICAgICAgICBpICogb3V0LT5saW5lc2l6ZVtoLT5kZXNjLT5jb21wW2tdLnBsYW5lXSwKKyAgICAgICAgICAgICAgICAgICBoLT5iZ19jb2xvcltrXSwgZHN0X3cpOworICAgIH0KKworICAgIHN3aXRjaCAoaC0+bW9kZSkgeworICAgIGNhc2UgTU9ERV9MRVZFTFM6CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBoLT5uY29tcDsgaysrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgcCA9IGgtPmRlc2MtPmNvbXBba10ucGxhbmU7CisgICAgICAgICAgICBjb25zdCBpbnQgc3RhcnQgPSBrICogKGgtPmxldmVsX2hlaWdodCArIGgtPnNjYWxlX2hlaWdodCkgKiBoLT5kaXNwbGF5X21vZGU7CisgICAgICAgICAgICBkb3VibGUgbWF4X2h2YWxfbG9nOworICAgICAgICAgICAgdW5zaWduZWQgbWF4X2h2YWwgPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW4tPmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3JjID0gaW4tPmRhdGFbcF0gKyBpICogaW4tPmxpbmVzaXplW3BdOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbi0+d2lkdGg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgaC0+aGlzdG9ncmFtW3NyY1tqXV0rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICAgICAgICAgIG1heF9odmFsID0gRkZNQVgobWF4X2h2YWwsIGgtPmhpc3RvZ3JhbVtpXSk7CisgICAgICAgICAgICBtYXhfaHZhbF9sb2cgPSBsb2cyKG1heF9odmFsICsgMSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRsaW5rLT53OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY29sX2hlaWdodDsKKworICAgICAgICAgICAgICAgIGlmIChoLT5sZXZlbHNfbW9kZSkKKyAgICAgICAgICAgICAgICAgICAgY29sX2hlaWdodCA9IHJvdW5kKGgtPmxldmVsX2hlaWdodCAqICgxLiAtIChsb2cyKGgtPmhpc3RvZ3JhbVtpXSArIDEpIC8gbWF4X2h2YWxfbG9nKSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY29sX2hlaWdodCA9IGgtPmxldmVsX2hlaWdodCAtIChoLT5oaXN0b2dyYW1baV0gKiAoaW50NjRfdCloLT5sZXZlbF9oZWlnaHQgKyBtYXhfaHZhbCAtIDEpIC8gbWF4X2h2YWw7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSBoLT5sZXZlbF9oZWlnaHQgLSAxOyBqID49IGNvbF9oZWlnaHQ7IGotLSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaC0+ZGlzcGxheV9tb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgaC0+bmNvbXA7IGwrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGFbbF1bKGogKyBzdGFydCkgKiBvdXQtPmxpbmVzaXplW2xdICsgaV0gPSBoLT5mZ19jb2xvcltsXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVtwXVsoaiArIHN0YXJ0KSAqIG91dC0+bGluZXNpemVbcF0gKyBpXSA9IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGogPSBoLT5sZXZlbF9oZWlnaHQgKyBoLT5zY2FsZV9oZWlnaHQgLSAxOyBqID49IGgtPmxldmVsX2hlaWdodDsgai0tKQorICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGFbcF1bKGogKyBzdGFydCkgKiBvdXQtPmxpbmVzaXplW3BdICsgaV0gPSBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1zZXQoaC0+aGlzdG9ncmFtLCAwLCAyNTYgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfV0FWRUZPUk06CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBoLT5uY29tcDsgaysrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgb2Zmc2V0ID0gayAqIDI1NiAqIGgtPmRpc3BsYXlfbW9kZTsKKyAgICAgICAgICAgIGdlbl93YXZlZm9ybShoLCBpbiwgb3V0LCBrLCBoLT5zdGVwLCBvZmZzZXQsIGgtPndhdmVmb3JtX21vZGUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9DT0xPUjoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlubGluay0+aDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgaXcxID0gaSAqIGluLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBpdzIgPSBpICogaW4tPmxpbmVzaXplWzJdOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGlubGluay0+dzsgaisrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHBvcyA9IGluLT5kYXRhWzFdW2l3MSArIGpdICogb3V0LT5saW5lc2l6ZVswXSArIGluLT5kYXRhWzJdW2l3MiArIGpdOworICAgICAgICAgICAgICAgIGlmIChvdXQtPmRhdGFbMF1bcG9zXSA8IDI1NSkKKyAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhWzBdW3Bvc10rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICAgIGRzdCA9IG91dC0+ZGF0YVswXSArIGkgKiBvdXQtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkc3Rbal0pIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhWzFdW2kgKiBvdXQtPmxpbmVzaXplWzBdICsgal0gPSBpOworICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGFbMl1baSAqIG91dC0+bGluZXNpemVbMF0gKyBqXSA9IGo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9DT0xPUjI6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmxpbmstPmg7IGkrKykgeworICAgICAgICAgICAgY29uc3QgaW50IGl3MSA9IGkgKiBpbi0+bGluZXNpemVbMV07CisgICAgICAgICAgICBjb25zdCBpbnQgaXcyID0gaSAqIGluLT5saW5lc2l6ZVsyXTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbmxpbmstPnc7IGorKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCB1ID0gaW4tPmRhdGFbMV1baXcxICsgal07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHYgPSBpbi0+ZGF0YVsyXVtpdzIgKyBqXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcG9zID0gdSAqIG91dC0+bGluZXNpemVbMF0gKyB2OworICAgICAgICAgICAgICAgIGlmICghb3V0LT5kYXRhWzBdW3Bvc10pCisgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVswXVtwb3NdID0gRkZBQlMoMTI4IC0gdSkgKyBGRkFCUygxMjggLSB2KTsKKyAgICAgICAgICAgICAgICBvdXQtPmRhdGFbMV1bcG9zXSA9IHU7CisgICAgICAgICAgICAgICAgb3V0LT5kYXRhWzJdW3Bvc10gPSB2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfaGlzdG9ncmFtID0geworICAgIC5uYW1lICAgICAgICAgID0gImhpc3RvZ3JhbSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29tcHV0ZSBhbmQgZHJhdyBhIGhpc3RvZ3JhbS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihIaXN0b2dyYW1Db250ZXh0KSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBpbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBvdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmhpc3RvZ3JhbV9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfaHFkbjNkLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfaHFkbjNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0OGMwZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ocWRuM2QuYwpAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBEYW5pZWwgTW9yZW5vIDxjb21hYyBBVCBjb21hYyBET1QgZGFya3RlY2ggRE9UIG9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBCYXB0aXN0ZSBDb3VkdXJpZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBMb3JlbiBNZXJyaXR0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLCBwb3J0ZWQgZnJvbSBNUGxheWVyLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaGlnaCBxdWFsaXR5IDNkIHZpZGVvIGRlbm9pc2VyLCBwb3J0ZWQgZnJvbSBNUGxheWVyCisgKiBsaWJtcGNvZGVjcy92Zl9ocWRuM2QuYy4KKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJ2Zl9ocWRuM2QuaCIKKworI2RlZmluZSBMVVRfQklUUyAoZGVwdGg9PTE2ID8gOCA6IDQpCisjZGVmaW5lIExPQUQoeCkgKCgoZGVwdGggPT0gOCA/IHNyY1t4XSA6IEFWX1JOMTZBKHNyYyArICh4KSAqIDIpKSA8PCAoMTYgLSBkZXB0aCkpXAorICAgICAgICAgICAgICAgICArICgoKDEgPDwgKDE2IC0gZGVwdGgpKSAtIDEpID4+IDEpKQorI2RlZmluZSBTVE9SRSh4LHZhbCkgKGRlcHRoID09IDggPyBkc3RbeF0gPSAodmFsKSA+PiAoMTYgLSBkZXB0aCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dOMTZBKGRzdCArICh4KSAqIDIsICh2YWwpID4+ICgxNiAtIGRlcHRoKSkpCisKK2F2X2Fsd2F5c19pbmxpbmUKK3N0YXRpYyB1aW50MzJfdCBsb3dwYXNzKGludCBwcmV2LCBpbnQgY3VyLCBpbnQxNl90ICpjb2VmLCBpbnQgZGVwdGgpCit7CisgICAgaW50IGQgPSAocHJldiAtIGN1cikgPj4gKDggLSBMVVRfQklUUyk7CisgICAgcmV0dXJuIGN1ciArIGNvZWZbZF07Cit9CisKK2F2X2Fsd2F5c19pbmxpbmUKK3N0YXRpYyB2b2lkIGRlbm9pc2VfdGVtcG9yYWwodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpmcmFtZV9hbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHNzdHJpZGUsIGludCBkc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICp0ZW1wb3JhbCwgaW50IGRlcHRoKQoreworICAgIGxvbmcgeCwgeTsKKyAgICB1aW50MzJfdCB0bXA7CisKKyAgICB0ZW1wb3JhbCArPSAyNTYgPDwgTFVUX0JJVFM7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGZyYW1lX2FudFt4XSA9IHRtcCA9IGxvd3Bhc3MoZnJhbWVfYW50W3hdLCBMT0FEKHgpLCB0ZW1wb3JhbCwgZGVwdGgpOworICAgICAgICAgICAgU1RPUkUoeCwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gc3N0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdHJpZGU7CisgICAgICAgIGZyYW1lX2FudCArPSB3OworICAgIH0KK30KKworYXZfYWx3YXlzX2lubGluZQorc3RhdGljIHZvaWQgZGVub2lzZV9zcGF0aWFsKEhRRE4zRENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmxpbmVfYW50LCB1aW50MTZfdCAqZnJhbWVfYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHNzdHJpZGUsIGludCBkc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNwYXRpYWwsIGludDE2X3QgKnRlbXBvcmFsLCBpbnQgZGVwdGgpCit7CisgICAgbG9uZyB4LCB5OworICAgIHVpbnQzMl90IHBpeGVsX2FudDsKKyAgICB1aW50MzJfdCB0bXA7CisKKyAgICBzcGF0aWFsICArPSAyNTYgPDwgTFVUX0JJVFM7CisgICAgdGVtcG9yYWwgKz0gMjU2IDw8IExVVF9CSVRTOworCisgICAgLyogRmlyc3QgbGluZSBoYXMgbm8gdG9wIG5laWdoYm9yLiBPbmx5IGxlZnQgb25lIGZvciBlYWNoIHRtcCBhbmQKKyAgICAgKiBsYXN0IGZyYW1lICovCisgICAgcGl4ZWxfYW50ID0gTE9BRCgwKTsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgIGxpbmVfYW50W3hdID0gdG1wID0gcGl4ZWxfYW50ID0gbG93cGFzcyhwaXhlbF9hbnQsIExPQUQoeCksIHNwYXRpYWwsIGRlcHRoKTsKKyAgICAgICAgZnJhbWVfYW50W3hdID0gdG1wID0gbG93cGFzcyhmcmFtZV9hbnRbeF0sIHRtcCwgdGVtcG9yYWwsIGRlcHRoKTsKKyAgICAgICAgU1RPUkUoeCwgdG1wKTsKKyAgICB9CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIHNyYyArPSBzc3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0cmlkZTsKKyAgICAgICAgZnJhbWVfYW50ICs9IHc7CisgICAgICAgIGlmIChzLT5kZW5vaXNlX3Jvd1tkZXB0aF0pIHsKKyAgICAgICAgICAgIHMtPmRlbm9pc2Vfcm93W2RlcHRoXShzcmMsIGRzdCwgbGluZV9hbnQsIGZyYW1lX2FudCwgdywgc3BhdGlhbCwgdGVtcG9yYWwpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcGl4ZWxfYW50ID0gTE9BRCgwKTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHctMTsgeCsrKSB7CisgICAgICAgICAgICBsaW5lX2FudFt4XSA9IHRtcCA9IGxvd3Bhc3MobGluZV9hbnRbeF0sIHBpeGVsX2FudCwgc3BhdGlhbCwgZGVwdGgpOworICAgICAgICAgICAgcGl4ZWxfYW50ID0gbG93cGFzcyhwaXhlbF9hbnQsIExPQUQoeCsxKSwgc3BhdGlhbCwgZGVwdGgpOworICAgICAgICAgICAgZnJhbWVfYW50W3hdID0gdG1wID0gbG93cGFzcyhmcmFtZV9hbnRbeF0sIHRtcCwgdGVtcG9yYWwsIGRlcHRoKTsKKyAgICAgICAgICAgIFNUT1JFKHgsIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgbGluZV9hbnRbeF0gPSB0bXAgPSBsb3dwYXNzKGxpbmVfYW50W3hdLCBwaXhlbF9hbnQsIHNwYXRpYWwsIGRlcHRoKTsKKyAgICAgICAgZnJhbWVfYW50W3hdID0gdG1wID0gbG93cGFzcyhmcmFtZV9hbnRbeF0sIHRtcCwgdGVtcG9yYWwsIGRlcHRoKTsKKyAgICAgICAgU1RPUkUoeCwgdG1wKTsKKyAgICB9Cit9CisKK2F2X2Fsd2F5c19pbmxpbmUKK3N0YXRpYyB2b2lkIGRlbm9pc2VfZGVwdGgoSFFETjNEQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpsaW5lX2FudCwgdWludDE2X3QgKipmcmFtZV9hbnRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzc3RyaWRlLCBpbnQgZHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3BhdGlhbCwgaW50MTZfdCAqdGVtcG9yYWwsIGludCBkZXB0aCkKK3sKKyAgICAvLyBGSVhNRTogRm9yIDE2Yml0IGRlcHRoLCBmcmFtZV9hbnQgY291bGQgYmUgYSBwb2ludGVyIHRvIHRoZSBwcmV2aW91cworICAgIC8vIGZpbHRlcmVkIGZyYW1lIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgYnVmZmVyLgorICAgIGxvbmcgeCwgeTsKKyAgICB1aW50MTZfdCAqZnJhbWVfYW50ID0gKmZyYW1lX2FudF9wdHI7CisgICAgaWYgKCFmcmFtZV9hbnQpIHsKKyAgICAgICAgdWludDhfdCAqZnJhbWVfc3JjID0gc3JjOworICAgICAgICAqZnJhbWVfYW50X3B0ciA9IGZyYW1lX2FudCA9IGF2X21hbGxvY19hcnJheSh3LCBoKnNpemVvZih1aW50MTZfdCkpOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrLCBzcmMgKz0gc3N0cmlkZSwgZnJhbWVfYW50ICs9IHcpCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgICAgIGZyYW1lX2FudFt4XSA9IExPQUQoeCk7CisgICAgICAgIHNyYyA9IGZyYW1lX3NyYzsKKyAgICAgICAgZnJhbWVfYW50ID0gKmZyYW1lX2FudF9wdHI7CisgICAgfQorCisgICAgaWYgKHNwYXRpYWxbMF0pCisgICAgICAgIGRlbm9pc2Vfc3BhdGlhbChzLCBzcmMsIGRzdCwgbGluZV9hbnQsIGZyYW1lX2FudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHcsIGgsIHNzdHJpZGUsIGRzdHJpZGUsIHNwYXRpYWwsIHRlbXBvcmFsLCBkZXB0aCk7CisgICAgZWxzZQorICAgICAgICBkZW5vaXNlX3RlbXBvcmFsKHNyYywgZHN0LCBmcmFtZV9hbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdywgaCwgc3N0cmlkZSwgZHN0cmlkZSwgdGVtcG9yYWwsIGRlcHRoKTsKKyAgICBlbW1zX2MoKTsKK30KKworI2RlZmluZSBkZW5vaXNlKC4uLikgXAorICAgIHN3aXRjaCAocy0+ZGVwdGgpIHtcCisgICAgICAgIGNhc2UgIDg6IGRlbm9pc2VfZGVwdGgoX19WQV9BUkdTX18sICA4KTsgYnJlYWs7XAorICAgICAgICBjYXNlICA5OiBkZW5vaXNlX2RlcHRoKF9fVkFfQVJHU19fLCAgOSk7IGJyZWFrO1wKKyAgICAgICAgY2FzZSAxMDogZGVub2lzZV9kZXB0aChfX1ZBX0FSR1NfXywgMTApOyBicmVhaztcCisgICAgICAgIGNhc2UgMTY6IGRlbm9pc2VfZGVwdGgoX19WQV9BUkdTX18sIDE2KTsgYnJlYWs7XAorICAgIH0KKworc3RhdGljIGludDE2X3QgKnByZWNhbGNfY29lZnMoZG91YmxlIGRpc3QyNSwgaW50IGRlcHRoKQoreworICAgIGludCBpOworICAgIGRvdWJsZSBnYW1tYSwgc2ltaWwsIEM7CisgICAgaW50MTZfdCAqY3QgPSBhdl9tYWxsb2MoKDUxMjw8TFVUX0JJVFMpKnNpemVvZihpbnQxNl90KSk7CisgICAgaWYgKCFjdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBnYW1tYSA9IGxvZygwLjI1KSAvIGxvZygxLjAgLSBGRk1JTihkaXN0MjUsMjUyLjApLzI1NS4wIC0gMC4wMDAwMSk7CisKKyAgICBmb3IgKGkgPSAtMjU1PDxMVVRfQklUUzsgaSA8PSAyNTU8PExVVF9CSVRTOyBpKyspIHsKKyAgICAgICAgZG91YmxlIGYgPSAoKGk8PCg5LUxVVF9CSVRTKSkgKyAoMTw8KDgtTFVUX0JJVFMpKSAtIDEpIC8gNTEyLjA7IC8vIG1pZHBvaW50IG9mIHRoZSBiaW4KKyAgICAgICAgc2ltaWwgPSAxLjAgLSBGRkFCUyhmKSAvIDI1NS4wOworICAgICAgICBDID0gcG93KHNpbWlsLCBnYW1tYSkgKiAyNTYuMCAqIGY7CisgICAgICAgIGN0WygyNTY8PExVVF9CSVRTKStpXSA9IGxyaW50KEMpOworICAgIH0KKworICAgIGN0WzBdID0gISFkaXN0MjU7CisgICAgcmV0dXJuIGN0OworfQorCisjZGVmaW5lIFBBUkFNMV9ERUZBVUxUIDQuMAorI2RlZmluZSBQQVJBTTJfREVGQVVMVCAzLjAKKyNkZWZpbmUgUEFSQU0zX0RFRkFVTFQgNi4wCisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEhRRE4zRENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoIXMtPnN0cmVuZ3RoW0xVTUFfU1BBVElBTF0pCisgICAgICAgIHMtPnN0cmVuZ3RoW0xVTUFfU1BBVElBTF0gPSBQQVJBTTFfREVGQVVMVDsKKyAgICBpZiAoIXMtPnN0cmVuZ3RoW0NIUk9NQV9TUEFUSUFMXSkKKyAgICAgICAgcy0+c3RyZW5ndGhbQ0hST01BX1NQQVRJQUxdID0gUEFSQU0yX0RFRkFVTFQgKiBzLT5zdHJlbmd0aFtMVU1BX1NQQVRJQUxdIC8gUEFSQU0xX0RFRkFVTFQ7CisgICAgaWYgKCFzLT5zdHJlbmd0aFtMVU1BX1RNUF0pCisgICAgICAgIHMtPnN0cmVuZ3RoW0xVTUFfVE1QXSAgID0gUEFSQU0zX0RFRkFVTFQgKiBzLT5zdHJlbmd0aFtMVU1BX1NQQVRJQUxdIC8gUEFSQU0xX0RFRkFVTFQ7CisgICAgaWYgKCFzLT5zdHJlbmd0aFtDSFJPTUFfVE1QXSkKKyAgICAgICAgcy0+c3RyZW5ndGhbQ0hST01BX1RNUF0gPSBzLT5zdHJlbmd0aFtMVU1BX1RNUF0gKiBzLT5zdHJlbmd0aFtDSFJPTUFfU1BBVElBTF0gLyBzLT5zdHJlbmd0aFtMVU1BX1NQQVRJQUxdOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJsczolZiBjczolZiBsdDolZiBjdDolZlxuIiwKKyAgICAgICAgICAgcy0+c3RyZW5ndGhbTFVNQV9TUEFUSUFMXSwgcy0+c3RyZW5ndGhbQ0hST01BX1NQQVRJQUxdLAorICAgICAgICAgICBzLT5zdHJlbmd0aFtMVU1BX1RNUF0sIHMtPnN0cmVuZ3RoW0NIUk9NQV9UTVBdKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBIUUROM0RDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfZnJlZXAoJnMtPmNvZWZzWzBdKTsKKyAgICBhdl9mcmVlcCgmcy0+Y29lZnNbMV0pOworICAgIGF2X2ZyZWVwKCZzLT5jb2Vmc1syXSk7CisgICAgYXZfZnJlZXAoJnMtPmNvZWZzWzNdKTsKKyAgICBhdl9mcmVlcCgmcy0+bGluZSk7CisgICAgYXZfZnJlZXAoJnMtPmZyYW1lX3ByZXZbMF0pOworICAgIGF2X2ZyZWVwKCZzLT5mcmFtZV9wcmV2WzFdKTsKKyAgICBhdl9mcmVlcCgmcy0+ZnJhbWVfcHJldlsyXSk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgSFFETjNEQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCBpOworCisgICAgdW5pbml0KGlubGluay0+ZHN0KTsKKworICAgIHMtPmhzdWIgID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBzLT52c3ViICA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgcy0+ZGVwdGggPSBkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSsxOworCisgICAgcy0+bGluZSA9IGF2X21hbGxvY19hcnJheShpbmxpbmstPncsIHNpemVvZigqcy0+bGluZSkpOworICAgIGlmICghcy0+bGluZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgcy0+Y29lZnNbaV0gPSBwcmVjYWxjX2NvZWZzKHMtPnN0cmVuZ3RoW2ldLCBzLT5kZXB0aCk7CisgICAgICAgIGlmICghcy0+Y29lZnNbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfaHFkbjNkX2luaXRfeDg2KHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCAgPSBpbmxpbmstPmRzdDsKKyAgICBIUUROM0RDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKworICAgIEFWRnJhbWUgKm91dDsKKyAgICBpbnQgZGlyZWN0LCBjOworCisgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSAmJiAhY3R4LT5pc19kaXNhYmxlZCkgeworICAgICAgICBkaXJlY3QgPSAxOworICAgICAgICBvdXQgPSBpbjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXJlY3QgPSAwOworICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgZm9yIChjID0gMDsgYyA8IDM7IGMrKykgeworICAgICAgICBkZW5vaXNlKHMsIGluLT5kYXRhW2NdLCBvdXQtPmRhdGFbY10sCisgICAgICAgICAgICAgICAgcy0+bGluZSwgJnMtPmZyYW1lX3ByZXZbY10sCisgICAgICAgICAgICAgICAgRkZfQ0VJTF9SU0hJRlQoaW4tPndpZHRoLCAgKCEhYyAqIHMtPmhzdWIpKSwKKyAgICAgICAgICAgICAgICBGRl9DRUlMX1JTSElGVChpbi0+aGVpZ2h0LCAoISFjICogcy0+dnN1YikpLAorICAgICAgICAgICAgICAgIGluLT5saW5lc2l6ZVtjXSwgb3V0LT5saW5lc2l6ZVtjXSwKKyAgICAgICAgICAgICAgICBzLT5jb2Vmc1tjID8gQ0hST01BX1NQQVRJQUwgOiBMVU1BX1NQQVRJQUxdLAorICAgICAgICAgICAgICAgIHMtPmNvZWZzW2MgPyBDSFJPTUFfVE1QICAgICA6IExVTUFfVE1QXSk7CisgICAgfQorCisgICAgaWYgKGN0eC0+aXNfZGlzYWJsZWQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBpbik7CisgICAgfQorCisgICAgaWYgKCFkaXJlY3QpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSFFETjNEQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBocWRuM2Rfb3B0aW9uc1tdID0geworICAgIHsgImx1bWFfc3BhdGlhbCIsICAgInNwYXRpYWwgbHVtYSBzdHJlbmd0aCIsICAgIE9GRlNFVChzdHJlbmd0aFtMVU1BX1NQQVRJQUxdKSwgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDAuMCB9LCAwLCBEQkxfTUFYLCBGTEFHUyB9LAorICAgIHsgImNocm9tYV9zcGF0aWFsIiwgInNwYXRpYWwgY2hyb21hIHN0cmVuZ3RoIiwgIE9GRlNFVChzdHJlbmd0aFtDSFJPTUFfU1BBVElBTF0pLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDAuMCB9LCAwLCBEQkxfTUFYLCBGTEFHUyB9LAorICAgIHsgImx1bWFfdG1wIiwgICAgICAgInRlbXBvcmFsIGx1bWEgc3RyZW5ndGgiLCAgIE9GRlNFVChzdHJlbmd0aFtMVU1BX1RNUF0pLCAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDAuMCB9LCAwLCBEQkxfTUFYLCBGTEFHUyB9LAorICAgIHsgImNocm9tYV90bXAiLCAgICAgInRlbXBvcmFsIGNocm9tYSBzdHJlbmd0aCIsIE9GRlNFVChzdHJlbmd0aFtDSFJPTUFfVE1QXSksICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDAuMCB9LCAwLCBEQkxfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoaHFkbjNkKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX2hxZG4zZF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfaHFkbjNkX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTworICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2hxZG4zZCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJocWRuM2QiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IGEgSGlnaCBRdWFsaXR5IDNEIERlbm9pc2VyLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEhRRE4zRENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmhxZG4zZF9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfdmZfaHFkbjNkX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX3ZmX2hxZG4zZF9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0lOVEVSTkFMLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ocWRuM2QuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ocWRuM2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTU1NDAwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2hxZG4zZC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRGFuaWVsIE1vcmVubyA8Y29tYWMgQVQgY29tYWMgRE9UIGRhcmt0ZWNoIERPVCBvcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQmFwdGlzdGUgQ291ZHVyaWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTG9yZW4gTWVycml0dAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZywgcG9ydGVkIGZyb20gTVBsYXllci4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgQVZGSUxURVJfVkZfSFFETjNEX0gKKyNkZWZpbmUgQVZGSUxURVJfVkZfSFFETjNEX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCit0eXBlZGVmIHN0cnVjdCBIUUROM0RDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQxNl90ICpjb2Vmc1s0XTsKKyAgICB1aW50MTZfdCAqbGluZTsKKyAgICB1aW50MTZfdCAqZnJhbWVfcHJldlszXTsKKyAgICBkb3VibGUgc3RyZW5ndGhbNF07CisgICAgaW50IGhzdWIsIHZzdWI7CisgICAgaW50IGRlcHRoOworICAgIHZvaWQgKCpkZW5vaXNlX3Jvd1sxN10pKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCB1aW50MTZfdCAqbGluZV9hbnQsIHVpbnQxNl90ICpmcmFtZV9hbnQsIHB0cmRpZmZfdCB3LCBpbnQxNl90ICpzcGF0aWFsLCBpbnQxNl90ICp0ZW1wb3JhbCk7Cit9IEhRRE4zRENvbnRleHQ7CisKKyNkZWZpbmUgTFVNQV9TUEFUSUFMICAgMAorI2RlZmluZSBMVU1BX1RNUCAgICAgICAxCisjZGVmaW5lIENIUk9NQV9TUEFUSUFMIDIKKyNkZWZpbmUgQ0hST01BX1RNUCAgICAgMworCit2b2lkIGZmX2hxZG4zZF9pbml0X3g4NihIUUROM0RDb250ZXh0ICpocWRuM2QpOworCisjZW5kaWYgLyogQVZGSUxURVJfVkZfSFFETjNEX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ocXguYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ocXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzgzMzgxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2hxeC5jCkBAIC0wLDAgKzEsNTYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IENsw6ltZW50IELFk3NjaAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBocXggbWFnbmlmaWNhdGlvbiBmaWx0ZXJzIChocTJ4LCBocTN4LCBocTR4KQorICoKKyAqIE9yaWdpbmFsbHkgZGVzaWduZWQgYnkgTWF4aW0gU3RlcGhpbi4KKyAqCisgKiBAc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHF4CisgKiBAc2VlIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTMxMTE0MTQzNjAyL2h0dHA6Ly93d3cuaGllbmQzZC5jb20vaHEzeC5odG1sCisgKiBAc2VlIGh0dHA6Ly9ibG9nLnBraC5tZS9wLzE5LWJ1dGNoZXJpbmctaHF4LXNjYWxpbmctZmlsdGVycy5odG1sCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgaW50ICgqaHF4ZnVuY190KShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBuOworICAgIGhxeGZ1bmNfdCBmdW5jOworICAgIHVpbnQzMl90IHJnYnRveXV2WzE8PDI0XTsKK30gSFFYQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgVGhyZWFkRGF0YSB7CisgICAgQVZGcmFtZSAqaW4sICpvdXQ7CisgICAgY29uc3QgdWludDMyX3QgKnJnYnRveXV2OworfSBUaHJlYWREYXRhOworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihIUVhDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBocXhfb3B0aW9uc1tdID0geworICAgIHsgIm4iLCAic2V0IHNjYWxlIGZhY3RvciIsIE9GRlNFVChuKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDN9LCAyLCA0LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoaHF4KTsKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3QgcmdiMnl1dihjb25zdCB1aW50MzJfdCAqcjJ5LCB1aW50MzJfdCBjKQoreworICAgIHJldHVybiByMnlbYyAmIDB4ZmZmZmZmXTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHl1dl9kaWZmKHVpbnQzMl90IHl1djEsIHVpbnQzMl90IHl1djIpCit7CisjZGVmaW5lIFlNQVNLIDB4ZmYwMDAwCisjZGVmaW5lIFVNQVNLIDB4MDBmZjAwCisjZGVmaW5lIFZNQVNLIDB4MDAwMGZmCisgICAgcmV0dXJuIGFicygoeXV2MSAmIFlNQVNLKSAtICh5dXYyICYgWU1BU0spKSA+ICg0OCA8PCAxNikgfHwKKyAgICAgICAgICAgYWJzKCh5dXYxICYgVU1BU0spIC0gKHl1djIgJiBVTUFTSykpID4gKCA3IDw8ICA4KSB8fAorICAgICAgICAgICBhYnMoKHl1djEgJiBWTUFTSykgLSAoeXV2MiAmIFZNQVNLKSkgPiAoIDYgPDwgIDApOworfQorCisvKiAoYzEqdzEgKyBjMip3MikgPj4gcyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3QgaW50ZXJwXzJweCh1aW50MzJfdCBjMSwgaW50IHcxLCB1aW50MzJfdCBjMiwgaW50IHcyLCBpbnQgcykKK3sKKyAgICByZXR1cm4gKCgoKChjMSAmIDB4ZmYwMGZmMDApID4+IDgpICogdzEgKyAoKGMyICYgMHhmZjAwZmYwMCkgPj4gOCkgKiB3MikgPDwgKDggLSBzKSkgJiAweGZmMDBmZjAwKSB8CisgICAgICAgICAgICgoKCgoYzEgJiAweDAwZmYwMGZmKSAgICAgKSAqIHcxICsgKChjMiAmIDB4MDBmZjAwZmYpICAgICApICogdzIpID4+ICAgICAgcyApICYgMHgwMGZmMDBmZik7Cit9CisKKy8qIChjMSp3MSArIGMyKncyICsgYzMqdzMpID4+IHMgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQzMl90IGludGVycF8zcHgodWludDMyX3QgYzEsIGludCB3MSwgdWludDMyX3QgYzIsIGludCB3MiwgdWludDMyX3QgYzMsIGludCB3MywgaW50IHMpCit7CisgICAgcmV0dXJuICgoKCgoYzEgJiAweGZmMDBmZjAwKSA+PiA4KSAqIHcxICsgKChjMiAmIDB4ZmYwMGZmMDApID4+IDgpICogdzIgKyAoKGMzICYgMHhmZjAwZmYwMCkgPj4gOCkgKiB3MykgPDwgKDggLSBzKSkgJiAweGZmMDBmZjAwKSB8CisgICAgICAgICAgICgoKCgoYzEgJiAweDAwZmYwMGZmKSAgICAgKSAqIHcxICsgKChjMiAmIDB4MDBmZjAwZmYpICAgICApICogdzIgKyAoKGMzICYgMHgwMGZmMDBmZikgICAgICkgKiB3MykgPj4gICAgICBzICkgJiAweDAwZmYwMGZmKTsKK30KKworLyogbSBpcyB0aGUgbWFzayBvZiBkaWZmIHdpdGggdGhlIGNlbnRlciBwaXhlbCB0aGF0IG1hdHRlcnMgaW4gdGhlIHBhdHRlcm4sIGFuZAorICogciBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0IChiaXQgc2V0IHRvIDEgaWYgdGhlcmUgaXMgZGlmZmVyZW5jZSB3aXRoIHRoZQorICogY2VudGVyLCAwIG90aGVyd2lzZSkgKi8KKyNkZWZpbmUgUChtLCByKSAoKGtfc2h1ZmZsZWQgJiAobSkpID09IChyKSkKKworLyogYWRqdXN0IDAxMjM0NTY3OCB0byAwMTIzNTY3ODogdGhlIG1hc2sgZG9lc24ndCBjb250YWluIHRoZSAobnVsbCkgZGlmZgorICogYmV0d2VlbiB0aGUgY2VudGVyL2N1cnJlbnQgcGl4ZWwgYW5kIGl0c2VsZiAqLworI2RlZmluZSBEUk9QNCh6KSAoKHopID4gNCA/ICh6KS0xIDogKHopKQorCisvKiBzaHVmZmxlIHRoZSBpbnB1dCBtYXNrOiBtb3ZlIGJpdCBuICg0LWFkanVzdGVkKSB0byBwb3NpdGlvbiBzdG9yZWQgaW4gcDxuPiAqLworI2RlZmluZSBTSEYoeCwgcm90LCBuKSAoKCh4KSA+PiAoKHJvdCkgPyA3LURST1A0KG4pIDogRFJPUDQobikpICYgMSkgPDwgRFJPUDQocCMjbikpCisKKy8qIHVzZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgWVVWIGRpZmZlcmVuY2UgYmV0d2VlbiAyIHBpeGVscyAqLworI2RlZmluZSBXRElGRihjMSwgYzIpIHl1dl9kaWZmKHJnYjJ5dXYocjJ5LCBjMSksIHJnYjJ5dXYocjJ5LCBjMikpCisKKy8qIGJvb3RzdHJhcCB0ZW1wbGF0ZSBmb3IgZXZlcnkgaW50ZXJwb2xhdGlvbiBjb2RlLiBJdCBkZWZpbmVzIHRoZSBzaHVmZmxlZAorICogbWFza3MgYW5kIHN1cnJvdW5kaW5nIHBpeGVscy4gVGhlIHJvdCBmbGFnIGlzIHVzZWQgdG8gaW5kaWNhdGUgaWYgaXQncyBhCisgKiByb3RhdGlvbjsgaXRzIGJhc2ljIGVmZmVjdCBpcyB0byBzaHVmZmxlIGsgdXNpbmcgcDguLnAwIGluc3RlYWQgb2YgcDAuLnA4ICovCisjZGVmaW5lIElOVEVSUF9CT09UU1RSQVAocm90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGtfc2h1ZmZsZWQgPSBTSEYoayxyb3QsMCkgfCBTSEYoayxyb3QsMSkgfCBTSEYoayxyb3QsMikgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBTSEYoayxyb3QsMykgfCAgICAgICAwICAgICAgfCBTSEYoayxyb3QsNSkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBTSEYoayxyb3QsNikgfCBTSEYoayxyb3QsNykgfCBTSEYoayxyb3QsOCk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdzAgPSB3W3AwXSwgdzEgPSB3W3AxXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgdzMgPSB3W3AzXSwgdzQgPSB3W3A0XSwgdzUgPSB3W3A1XSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzcgPSB3W3A3XQorCisvKiBBc3N1bWluZyBwMC4ucDggaXMgbWFwcGVkIHRvIHBpeGVscyAwLi44LCB0aGlzIGZ1bmN0aW9uIGludGVycG9sYXRlcyB0aGUKKyAqIHRvcC1sZWZ0IHBpeGVsIGluIHRoZSB0b3RhbCBvZiB0aGUgMngyIHBpeGVscyB0byBpbnRlcnBvbGF0ZXMuIFRoZSBmdW5jdGlvbgorICogaXMgYWxzbyB1c2VkIGZvciB0aGUgMyBvdGhlciBwaXhlbHMgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQzMl90IGhxMnhfaW50ZXJwXzF4MShjb25zdCB1aW50MzJfdCAqcjJ5LCBpbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcDAsIGludCBwMSwgaW50IHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwMywgaW50IHA0LCBpbnQgcDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHA2LCBpbnQgcDcsIGludCBwOCkKK3sKKyAgICBJTlRFUlBfQk9PVFNUUkFQKDApOworCisgICAgaWYgKChQKDB4YmYsMHgzNykgfHwgUCgweGRiLDB4MTMpKSAmJiBXRElGRih3MSwgdzUpKQorICAgICAgICByZXR1cm4gaW50ZXJwXzJweCh3NCwgMywgdzMsIDEsIDIpOworICAgIGlmICgoUCgweGRiLDB4NDkpIHx8IFAoMHhlZiwweDZkKSkgJiYgV0RJRkYodzcsIHczKSkKKyAgICAgICAgcmV0dXJuIGludGVycF8ycHgodzQsIDMsIHcxLCAxLCAyKTsKKyAgICBpZiAoKFAoMHgwYiwweDBiKSB8fCBQKDB4ZmUsMHg0YSkgfHwgUCgweGZlLDB4MWEpKSAmJiBXRElGRih3MywgdzEpKQorICAgICAgICByZXR1cm4gdzQ7CisgICAgaWYgKChQKDB4NmYsMHgyYSkgfHwgUCgweDViLDB4MGEpIHx8IFAoMHhiZiwweDNhKSB8fCBQKDB4ZGYsMHg1YSkgfHwKKyAgICAgICAgIFAoMHg5ZiwweDhhKSB8fCBQKDB4Y2YsMHg4YSkgfHwgUCgweGVmLDB4NGUpIHx8IFAoMHgzZiwweDBlKSB8fAorICAgICAgICAgUCgweGZiLDB4NWEpIHx8IFAoMHhiYiwweDhhKSB8fCBQKDB4N2YsMHg1YSkgfHwgUCgweGFmLDB4OGEpIHx8CisgICAgICAgICBQKDB4ZWIsMHg4YSkpICYmIFdESUZGKHczLCB3MSkpCisgICAgICAgIHJldHVybiBpbnRlcnBfMnB4KHc0LCAzLCB3MCwgMSwgMik7CisgICAgaWYgKFAoMHgwYiwweDA4KSkKKyAgICAgICAgcmV0dXJuIGludGVycF8zcHgodzQsIDIsIHcwLCAxLCB3MSwgMSwgMik7CisgICAgaWYgKFAoMHgwYiwweDAyKSkKKyAgICAgICAgcmV0dXJuIGludGVycF8zcHgodzQsIDIsIHcwLCAxLCB3MywgMSwgMik7CisgICAgaWYgKFAoMHgyZiwweDJmKSkKKyAgICAgICAgcmV0dXJuIGludGVycF8zcHgodzQsIDE0LCB3MywgMSwgdzEsIDEsIDQpOworICAgIGlmIChQKDB4YmYsMHgzNykgfHwgUCgweGRiLDB4MTMpKQorICAgICAgICByZXR1cm4gaW50ZXJwXzNweCh3NCwgNSwgdzEsIDIsIHczLCAxLCAzKTsKKyAgICBpZiAoUCgweGRiLDB4NDkpIHx8IFAoMHhlZiwweDZkKSkKKyAgICAgICAgcmV0dXJuIGludGVycF8zcHgodzQsIDUsIHczLCAyLCB3MSwgMSwgMyk7CisgICAgaWYgKFAoMHgxYiwweDAzKSB8fCBQKDB4NGYsMHg0MykgfHwgUCgweDhiLDB4ODMpIHx8IFAoMHg2YiwweDQzKSkKKyAgICAgICAgcmV0dXJuIGludGVycF8ycHgodzQsIDMsIHczLCAxLCAyKTsKKyAgICBpZiAoUCgweDRiLDB4MDkpIHx8IFAoMHg4YiwweDg5KSB8fCBQKDB4MWYsMHgxOSkgfHwgUCgweDNiLDB4MTkpKQorICAgICAgICByZXR1cm4gaW50ZXJwXzJweCh3NCwgMywgdzEsIDEsIDIpOworICAgIGlmIChQKDB4N2UsMHgyYSkgfHwgUCgweGVmLDB4YWIpIHx8IFAoMHhiZiwweDhmKSB8fCBQKDB4N2UsMHgwZSkpCisgICAgICAgIHJldHVybiBpbnRlcnBfM3B4KHc0LCAyLCB3MywgMywgdzEsIDMsIDMpOworICAgIGlmIChQKDB4ZmIsMHg2YSkgfHwgUCgweDZmLDB4NmUpIHx8IFAoMHgzZiwweDNlKSB8fCBQKDB4ZmIsMHhmYSkgfHwKKyAgICAgICAgUCgweGRmLDB4ZGUpIHx8IFAoMHhkZiwweDFlKSkKKyAgICAgICAgcmV0dXJuIGludGVycF8ycHgodzQsIDMsIHcwLCAxLCAyKTsKKyAgICBpZiAoUCgweDBhLDB4MDApIHx8IFAoMHg0ZiwweDRiKSB8fCBQKDB4OWYsMHgxYikgfHwgUCgweDJmLDB4MGIpIHx8CisgICAgICAgIFAoMHhiZSwweDBhKSB8fCBQKDB4ZWUsMHgwYSkgfHwgUCgweDdlLDB4MGEpIHx8IFAoMHhlYiwweDRiKSB8fAorICAgICAgICBQKDB4M2IsMHgxYikpCisgICAgICAgIHJldHVybiBpbnRlcnBfM3B4KHc0LCAyLCB3MywgMSwgdzEsIDEsIDIpOworICAgIHJldHVybiBpbnRlcnBfM3B4KHc0LCA2LCB3MywgMSwgdzEsIDEsIDMpOworfQorCisvKiBBc3N1bWluZyBwMC4ucDggaXMgbWFwcGVkIHRvIHBpeGVscyAwLi44LCB0aGlzIGZ1bmN0aW9uIGludGVycG9sYXRlcyB0aGUKKyAqIHRvcC1sZWZ0IGFuZCB0b3AtY2VudGVyIHBpeGVsIGluIHRoZSB0b3RhbCBvZiB0aGUgM3gzIHBpeGVscyB0bworICogaW50ZXJwb2xhdGVzLiBUaGUgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGZvciB0aGUgMyBvdGhlciBjb3VwbGVzIG9mIHBpeGVscworICogZGVmaW5pbmcgdGhlIG91dGxpbmUuIFRoZSBjZW50ZXIgcGl4ZWwgaXMgbm90IGRlZmluZWQgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLAorICogc2luY2UgaXQncyBqdXN0IHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCB2YWx1ZS4gKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgaHEzeF9pbnRlcnBfMngxKHVpbnQzMl90ICpkc3QsIGludCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqcjJ5LCBpbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICp3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvczAwLCBpbnQgcG9zMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcDAsIGludCBwMSwgaW50IHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHAzLCBpbnQgcDQsIGludCBwNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwNiwgaW50IHA3LCBpbnQgcDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlKQoreworICAgIElOVEVSUF9CT09UU1RSQVAocm90YXRlKTsKKworICAgIHVpbnQzMl90ICpkc3QwMCA9ICZkc3RbZHN0X2xpbmVzaXplKihwb3MwMD4+MSkgKyAocG9zMDAmMSldOworICAgIHVpbnQzMl90ICpkc3QwMSA9ICZkc3RbZHN0X2xpbmVzaXplKihwb3MwMT4+MSkgKyAocG9zMDEmMSldOworCisgICAgaWYgKChQKDB4ZGIsMHg0OSkgfHwgUCgweGVmLDB4NmQpKSAmJiBXRElGRih3NywgdzMpKQorICAgICAgICAqZHN0MDAgPSBpbnRlcnBfMnB4KHc0LCAzLCB3MSwgMSwgMik7CisgICAgZWxzZSBpZiAoKFAoMHhiZiwweDM3KSB8fCBQKDB4ZGIsMHgxMykpICYmIFdESUZGKHcxLCB3NSkpCisgICAgICAgICpkc3QwMCA9IGludGVycF8ycHgodzQsIDMsIHczLCAxLCAyKTsKKyAgICBlbHNlIGlmICgoUCgweDBiLDB4MGIpIHx8IFAoMHhmZSwweDRhKSB8fCBQKDB4ZmUsMHgxYSkpICYmIFdESUZGKHczLCB3MSkpCisgICAgICAgICpkc3QwMCA9IHc0OworICAgIGVsc2UgaWYgKChQKDB4NmYsMHgyYSkgfHwgUCgweDViLDB4MGEpIHx8IFAoMHhiZiwweDNhKSB8fCBQKDB4ZGYsMHg1YSkgfHwKKyAgICAgICAgICAgICAgUCgweDlmLDB4OGEpIHx8IFAoMHhjZiwweDhhKSB8fCBQKDB4ZWYsMHg0ZSkgfHwgUCgweDNmLDB4MGUpIHx8CisgICAgICAgICAgICAgIFAoMHhmYiwweDVhKSB8fCBQKDB4YmIsMHg4YSkgfHwgUCgweDdmLDB4NWEpIHx8IFAoMHhhZiwweDhhKSB8fAorICAgICAgICAgICAgICBQKDB4ZWIsMHg4YSkpICYmIFdESUZGKHczLCB3MSkpCisgICAgICAgICpkc3QwMCA9IGludGVycF8ycHgodzQsIDMsIHcwLCAxLCAyKTsKKyAgICBlbHNlIGlmIChQKDB4NGIsMHgwOSkgfHwgUCgweDhiLDB4ODkpIHx8IFAoMHgxZiwweDE5KSB8fCBQKDB4M2IsMHgxOSkpCisgICAgICAgICpkc3QwMCA9IGludGVycF8ycHgodzQsIDMsIHcxLCAxLCAyKTsKKyAgICBlbHNlIGlmIChQKDB4MWIsMHgwMykgfHwgUCgweDRmLDB4NDMpIHx8IFAoMHg4YiwweDgzKSB8fCBQKDB4NmIsMHg0MykpCisgICAgICAgICpkc3QwMCA9IGludGVycF8ycHgodzQsIDMsIHczLCAxLCAyKTsKKyAgICBlbHNlIGlmIChQKDB4N2UsMHgyYSkgfHwgUCgweGVmLDB4YWIpIHx8IFAoMHhiZiwweDhmKSB8fCBQKDB4N2UsMHgwZSkpCisgICAgICAgICpkc3QwMCA9IGludGVycF8ycHgodzMsIDEsIHcxLCAxLCAxKTsKKyAgICBlbHNlIGlmIChQKDB4NGYsMHg0YikgfHwgUCgweDlmLDB4MWIpIHx8IFAoMHgyZiwweDBiKSB8fCBQKDB4YmUsMHgwYSkgfHwKKyAgICAgICAgICAgICBQKDB4ZWUsMHgwYSkgfHwgUCgweDdlLDB4MGEpIHx8IFAoMHhlYiwweDRiKSB8fCBQKDB4M2IsMHgxYikpCisgICAgICAgICpkc3QwMCA9IGludGVycF8zcHgodzQsIDIsIHczLCA3LCB3MSwgNywgNCk7CisgICAgZWxzZSBpZiAoUCgweDBiLDB4MDgpIHx8IFAoMHhmOSwweDY4KSB8fCBQKDB4ZjMsMHg2MikgfHwgUCgweDZkLDB4NmMpIHx8CisgICAgICAgICAgICAgUCgweDY3LDB4NjYpIHx8IFAoMHgzZCwweDNjKSB8fCBQKDB4MzcsMHgzNikgfHwgUCgweGY5LDB4ZjgpIHx8CisgICAgICAgICAgICAgUCgweGRkLDB4ZGMpIHx8IFAoMHhmMywweGYyKSB8fCBQKDB4ZDcsMHhkNikgfHwgUCgweGRkLDB4MWMpIHx8CisgICAgICAgICAgICAgUCgweGQ3LDB4MTYpIHx8IFAoMHgwYiwweDAyKSkKKyAgICAgICAgKmRzdDAwID0gaW50ZXJwXzJweCh3NCwgMywgdzAsIDEsIDIpOworICAgIGVsc2UKKyAgICAgICAgKmRzdDAwID0gaW50ZXJwXzNweCh3NCwgMiwgdzMsIDEsIHcxLCAxLCAyKTsKKworICAgIGlmICgoUCgweGZlLDB4ZGUpIHx8IFAoMHg5ZSwweDE2KSB8fCBQKDB4ZGEsMHgxMikgfHwgUCgweDE3LDB4MTYpIHx8CisgICAgICAgICBQKDB4NWIsMHgxMikgfHwgUCgweGJiLDB4MTIpKSAmJiBXRElGRih3MSwgdzUpKQorICAgICAgICAqZHN0MDEgPSB3NDsKKyAgICBlbHNlIGlmICgoUCgweDBmLDB4MGIpIHx8IFAoMHg1ZSwweDBhKSB8fCBQKDB4ZmIsMHg3YikgfHwgUCgweDNiLDB4MGIpIHx8CisgICAgICAgICAgICAgIFAoMHhiZSwweDBhKSB8fCBQKDB4N2EsMHgwYSkpICYmIFdESUZGKHczLCB3MSkpCisgICAgICAgICpkc3QwMSA9IHc0OworICAgIGVsc2UgaWYgKFAoMHhiZiwweDhmKSB8fCBQKDB4N2UsMHgwZSkgfHwgUCgweGJmLDB4MzcpIHx8IFAoMHhkYiwweDEzKSkKKyAgICAgICAgKmRzdDAxID0gaW50ZXJwXzJweCh3MSwgMywgdzQsIDEsIDIpOworICAgIGVsc2UgaWYgKFAoMHgwMiwweDAwKSB8fCBQKDB4N2MsMHgyOCkgfHwgUCgweGVkLDB4YTkpIHx8IFAoMHhmNSwweGI0KSB8fAorICAgICAgICAgICAgIFAoMHhkOSwweDkwKSkKKyAgICAgICAgKmRzdDAxID0gaW50ZXJwXzJweCh3NCwgMywgdzEsIDEsIDIpOworICAgIGVsc2UgaWYgKFAoMHg0ZiwweDRiKSB8fCBQKDB4ZmIsMHg3YikgfHwgUCgweGZlLDB4N2UpIHx8IFAoMHg5ZiwweDFiKSB8fAorICAgICAgICAgICAgIFAoMHgyZiwweDBiKSB8fCBQKDB4YmUsMHgwYSkgfHwgUCgweDdlLDB4MGEpIHx8IFAoMHhmYiwweDRiKSB8fAorICAgICAgICAgICAgIFAoMHhmYiwweGRiKSB8fCBQKDB4ZmUsMHhkZSkgfHwgUCgweGZlLDB4NTYpIHx8IFAoMHg1NywweDU2KSB8fAorICAgICAgICAgICAgIFAoMHg5NywweDE2KSB8fCBQKDB4M2YsMHgxZSkgfHwgUCgweGRiLDB4MTIpIHx8IFAoMHhiYiwweDEyKSkKKyAgICAgICAgKmRzdDAxID0gaW50ZXJwXzJweCh3NCwgNywgdzEsIDEsIDMpOworICAgIGVsc2UKKyAgICAgICAgKmRzdDAxID0gdzQ7Cit9CisKKy8qIEFzc3VtaW5nIHAwLi5wOCBpcyBtYXBwZWQgdG8gcGl4ZWxzIDAuLjgsIHRoaXMgZnVuY3Rpb24gaW50ZXJwb2xhdGVzIHRoZQorICogdG9wLWxlZnQgYmxvY2sgb2YgMngyIHBpeGVscyBpbiB0aGUgdG90YWwgb2YgdGhlIDR4NCBwaXhlbHMgKG9yIDQgYmxvY2tzKSB0bworICogaW50ZXJwb2xhdGVzLiBUaGUgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGZvciB0aGUgMyBvdGhlciBibG9ja3Mgb2YgMngyCisgKiBwaXhlbHMuICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGhxNHhfaW50ZXJwXzJ4Mih1aW50MzJfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKnIyeSwgaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3MwMCwgaW50IHBvczAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvczEwLCBpbnQgcG9zMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcDAsIGludCBwMSwgaW50IHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHAzLCBpbnQgcDQsIGludCBwNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwNiwgaW50IHA3LCBpbnQgcDgpCit7CisgICAgSU5URVJQX0JPT1RTVFJBUCgwKTsKKworICAgIHVpbnQzMl90ICpkc3QwMCA9ICZkc3RbZHN0X2xpbmVzaXplKihwb3MwMD4+MSkgKyAocG9zMDAmMSldOworICAgIHVpbnQzMl90ICpkc3QwMSA9ICZkc3RbZHN0X2xpbmVzaXplKihwb3MwMT4+MSkgKyAocG9zMDEmMSldOworICAgIHVpbnQzMl90ICpkc3QxMCA9ICZkc3RbZHN0X2xpbmVzaXplKihwb3MxMD4+MSkgKyAocG9zMTAmMSldOworICAgIHVpbnQzMl90ICpkc3QxMSA9ICZkc3RbZHN0X2xpbmVzaXplKihwb3MxMT4+MSkgKyAocG9zMTEmMSldOworCisgICAgY29uc3QgaW50IGNvbmQwMCA9IChQKDB4YmYsMHgzNykgfHwgUCgweGRiLDB4MTMpKSAmJiBXRElGRih3MSwgdzUpOworICAgIGNvbnN0IGludCBjb25kMDEgPSAoUCgweGRiLDB4NDkpIHx8IFAoMHhlZiwweDZkKSkgJiYgV0RJRkYodzcsIHczKTsKKyAgICBjb25zdCBpbnQgY29uZDAyID0gKFAoMHg2ZiwweDJhKSB8fCBQKDB4NWIsMHgwYSkgfHwgUCgweGJmLDB4M2EpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBQKDB4ZGYsMHg1YSkgfHwgUCgweDlmLDB4OGEpIHx8IFAoMHhjZiwweDhhKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgUCgweGVmLDB4NGUpIHx8IFAoMHgzZiwweDBlKSB8fCBQKDB4ZmIsMHg1YSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFAoMHhiYiwweDhhKSB8fCBQKDB4N2YsMHg1YSkgfHwgUCgweGFmLDB4OGEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBQKDB4ZWIsMHg4YSkpICYmIFdESUZGKHczLCB3MSk7CisgICAgY29uc3QgaW50IGNvbmQwMyA9IFAoMHhkYiwweDQ5KSB8fCBQKDB4ZWYsMHg2ZCk7CisgICAgY29uc3QgaW50IGNvbmQwNCA9IFAoMHhiZiwweDM3KSB8fCBQKDB4ZGIsMHgxMyk7CisgICAgY29uc3QgaW50IGNvbmQwNSA9IFAoMHgxYiwweDAzKSB8fCBQKDB4NGYsMHg0MykgfHwgUCgweDhiLDB4ODMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIFAoMHg2YiwweDQzKTsKKyAgICBjb25zdCBpbnQgY29uZDA2ID0gUCgweDRiLDB4MDkpIHx8IFAoMHg4YiwweDg5KSB8fCBQKDB4MWYsMHgxOSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgUCgweDNiLDB4MTkpOworICAgIGNvbnN0IGludCBjb25kMDcgPSBQKDB4MGIsMHgwOCkgfHwgUCgweGY5LDB4NjgpIHx8IFAoMHhmMywweDYyKSB8fAorICAgICAgICAgICAgICAgICAgICAgICBQKDB4NmQsMHg2YykgfHwgUCgweDY3LDB4NjYpIHx8IFAoMHgzZCwweDNjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICBQKDB4MzcsMHgzNikgfHwgUCgweGY5LDB4ZjgpIHx8IFAoMHhkZCwweGRjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICBQKDB4ZjMsMHhmMikgfHwgUCgweGQ3LDB4ZDYpIHx8IFAoMHhkZCwweDFjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICBQKDB4ZDcsMHgxNikgfHwgUCgweDBiLDB4MDIpOworICAgIGNvbnN0IGludCBjb25kMDggPSAoUCgweDBmLDB4MGIpIHx8IFAoMHgyYiwweDBiKSB8fCBQKDB4ZmUsMHg0YSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFAoMHhmZSwweDFhKSkgJiYgV0RJRkYodzMsIHcxKTsKKyAgICBjb25zdCBpbnQgY29uZDA5ID0gUCgweDJmLDB4MmYpOworICAgIGNvbnN0IGludCBjb25kMTAgPSBQKDB4MGEsMHgwMCk7CisgICAgY29uc3QgaW50IGNvbmQxMSA9IFAoMHgwYiwweDA5KTsKKyAgICBjb25zdCBpbnQgY29uZDEyID0gUCgweDdlLDB4MmEpIHx8IFAoMHhlZiwweGFiKTsKKyAgICBjb25zdCBpbnQgY29uZDEzID0gUCgweGJmLDB4OGYpIHx8IFAoMHg3ZSwweDBlKTsKKyAgICBjb25zdCBpbnQgY29uZDE0ID0gUCgweDRmLDB4NGIpIHx8IFAoMHg5ZiwweDFiKSB8fCBQKDB4MmYsMHgwYikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgUCgweGJlLDB4MGEpIHx8IFAoMHhlZSwweDBhKSB8fCBQKDB4N2UsMHgwYSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgUCgweGViLDB4NGIpIHx8IFAoMHgzYiwweDFiKTsKKyAgICBjb25zdCBpbnQgY29uZDE1ID0gUCgweDBiLDB4MDMpOworCisgICAgaWYgKGNvbmQwMCkKKyAgICAgICAgKmRzdDAwID0gaW50ZXJwXzJweCh3NCwgNSwgdzMsIDMsIDMpOworICAgIGVsc2UgaWYgKGNvbmQwMSkKKyAgICAgICAgKmRzdDAwID0gaW50ZXJwXzJweCh3NCwgNSwgdzEsIDMsIDMpOworICAgIGVsc2UgaWYgKChQKDB4MGIsMHgwYikgfHwgUCgweGZlLDB4NGEpIHx8IFAoMHhmZSwweDFhKSkgJiYgV0RJRkYodzMsIHcxKSkKKyAgICAgICAgKmRzdDAwID0gdzQ7CisgICAgZWxzZSBpZiAoY29uZDAyKQorICAgICAgICAqZHN0MDAgPSBpbnRlcnBfMnB4KHc0LCA1LCB3MCwgMywgMyk7CisgICAgZWxzZSBpZiAoY29uZDAzKQorICAgICAgICAqZHN0MDAgPSBpbnRlcnBfMnB4KHc0LCAzLCB3MywgMSwgMik7CisgICAgZWxzZSBpZiAoY29uZDA0KQorICAgICAgICAqZHN0MDAgPSBpbnRlcnBfMnB4KHc0LCAzLCB3MSwgMSwgMik7CisgICAgZWxzZSBpZiAoY29uZDA1KQorICAgICAgICAqZHN0MDAgPSBpbnRlcnBfMnB4KHc0LCA1LCB3MywgMywgMyk7CisgICAgZWxzZSBpZiAoY29uZDA2KQorICAgICAgICAqZHN0MDAgPSBpbnRlcnBfMnB4KHc0LCA1LCB3MSwgMywgMyk7CisgICAgZWxzZSBpZiAoUCgweDBmLDB4MGIpIHx8IFAoMHg1ZSwweDBhKSB8fCBQKDB4MmIsMHgwYikgfHwgUCgweGJlLDB4MGEpIHx8CisgICAgICAgICAgICAgUCgweDdhLDB4MGEpIHx8IFAoMHhlZSwweDBhKSkKKyAgICAgICAgKmRzdDAwID0gaW50ZXJwXzJweCh3MSwgMSwgdzMsIDEsIDEpOworICAgIGVsc2UgaWYgKGNvbmQwNykKKyAgICAgICAgKmRzdDAwID0gaW50ZXJwXzJweCh3NCwgNSwgdzAsIDMsIDMpOworICAgIGVsc2UKKyAgICAgICAgKmRzdDAwID0gaW50ZXJwXzNweCh3NCwgMiwgdzEsIDEsIHczLCAxLCAyKTsKKworICAgIGlmIChjb25kMDApCisgICAgICAgICpkc3QwMSA9IGludGVycF8ycHgodzQsIDcsIHczLCAxLCAzKTsKKyAgICBlbHNlIGlmIChjb25kMDgpCisgICAgICAgICpkc3QwMSA9IHc0OworICAgIGVsc2UgaWYgKGNvbmQwMikKKyAgICAgICAgKmRzdDAxID0gaW50ZXJwXzJweCh3NCwgMywgdzAsIDEsIDIpOworICAgIGVsc2UgaWYgKGNvbmQwOSkKKyAgICAgICAgKmRzdDAxID0gdzQ7CisgICAgZWxzZSBpZiAoY29uZDEwKQorICAgICAgICAqZHN0MDEgPSBpbnRlcnBfM3B4KHc0LCA1LCB3MSwgMiwgdzMsIDEsIDMpOworICAgIGVsc2UgaWYgKFAoMHgwYiwweDA4KSkKKyAgICAgICAgKmRzdDAxID0gaW50ZXJwXzNweCh3NCwgNSwgdzEsIDIsIHcwLCAxLCAzKTsKKyAgICBlbHNlIGlmIChjb25kMTEpCisgICAgICAgICpkc3QwMSA9IGludGVycF8ycHgodzQsIDUsIHcxLCAzLCAzKTsKKyAgICBlbHNlIGlmIChjb25kMDQpCisgICAgICAgICpkc3QwMSA9IGludGVycF8ycHgodzEsIDMsIHc0LCAxLCAyKTsKKyAgICBlbHNlIGlmIChjb25kMTIpCisgICAgICAgICpkc3QwMSA9IGludGVycF8zcHgodzEsIDIsIHc0LCAxLCB3MywgMSwgMik7CisgICAgZWxzZSBpZiAoY29uZDEzKQorICAgICAgICAqZHN0MDEgPSBpbnRlcnBfMnB4KHcxLCA1LCB3MywgMywgMyk7CisgICAgZWxzZSBpZiAoY29uZDA1KQorICAgICAgICAqZHN0MDEgPSBpbnRlcnBfMnB4KHc0LCA3LCB3MywgMSwgMyk7CisgICAgZWxzZSBpZiAoUCgweGYzLDB4NjIpIHx8IFAoMHg2NywweDY2KSB8fCBQKDB4MzcsMHgzNikgfHwgUCgweGYzLDB4ZjIpIHx8CisgICAgICAgICAgICAgUCgweGQ3LDB4ZDYpIHx8IFAoMHhkNywweDE2KSB8fCBQKDB4MGIsMHgwMikpCisgICAgICAgICpkc3QwMSA9IGludGVycF8ycHgodzQsIDMsIHcwLCAxLCAyKTsKKyAgICBlbHNlIGlmIChjb25kMTQpCisgICAgICAgICpkc3QwMSA9IGludGVycF8ycHgodzEsIDEsIHc0LCAxLCAxKTsKKyAgICBlbHNlCisgICAgICAgICpkc3QwMSA9IGludGVycF8ycHgodzQsIDMsIHcxLCAxLCAyKTsKKworICAgIGlmIChjb25kMDEpCisgICAgICAgICpkc3QxMCA9IGludGVycF8ycHgodzQsIDcsIHcxLCAxLCAzKTsKKyAgICBlbHNlIGlmIChjb25kMDgpCisgICAgICAgICpkc3QxMCA9IHc0OworICAgIGVsc2UgaWYgKGNvbmQwMikKKyAgICAgICAgKmRzdDEwID0gaW50ZXJwXzJweCh3NCwgMywgdzAsIDEsIDIpOworICAgIGVsc2UgaWYgKGNvbmQwOSkKKyAgICAgICAgKmRzdDEwID0gdzQ7CisgICAgZWxzZSBpZiAoY29uZDEwKQorICAgICAgICAqZHN0MTAgPSBpbnRlcnBfM3B4KHc0LCA1LCB3MywgMiwgdzEsIDEsIDMpOworICAgIGVsc2UgaWYgKFAoMHgwYiwweDAyKSkKKyAgICAgICAgKmRzdDEwID0gaW50ZXJwXzNweCh3NCwgNSwgdzMsIDIsIHcwLCAxLCAzKTsKKyAgICBlbHNlIGlmIChjb25kMTUpCisgICAgICAgICpkc3QxMCA9IGludGVycF8ycHgodzQsIDUsIHczLCAzLCAzKTsKKyAgICBlbHNlIGlmIChjb25kMDMpCisgICAgICAgICpkc3QxMCA9IGludGVycF8ycHgodzMsIDMsIHc0LCAxLCAyKTsKKyAgICBlbHNlIGlmIChjb25kMTMpCisgICAgICAgICpkc3QxMCA9IGludGVycF8zcHgodzMsIDIsIHc0LCAxLCB3MSwgMSwgMik7CisgICAgZWxzZSBpZiAoY29uZDEyKQorICAgICAgICAqZHN0MTAgPSBpbnRlcnBfMnB4KHczLCA1LCB3MSwgMywgMyk7CisgICAgZWxzZSBpZiAoY29uZDA2KQorICAgICAgICAqZHN0MTAgPSBpbnRlcnBfMnB4KHc0LCA3LCB3MSwgMSwgMyk7CisgICAgZWxzZSBpZiAoUCgweDBiLDB4MDgpIHx8IFAoMHhmOSwweDY4KSB8fCBQKDB4NmQsMHg2YykgfHwgUCgweDNkLDB4M2MpIHx8CisgICAgICAgICAgICAgUCgweGY5LDB4ZjgpIHx8IFAoMHhkZCwweGRjKSB8fCBQKDB4ZGQsMHgxYykpCisgICAgICAgICpkc3QxMCA9IGludGVycF8ycHgodzQsIDMsIHcwLCAxLCAyKTsKKyAgICBlbHNlIGlmIChjb25kMTQpCisgICAgICAgICpkc3QxMCA9IGludGVycF8ycHgodzMsIDEsIHc0LCAxLCAxKTsKKyAgICBlbHNlCisgICAgICAgICpkc3QxMCA9IGludGVycF8ycHgodzQsIDMsIHczLCAxLCAyKTsKKworICAgIGlmICgoUCgweDdmLDB4MmIpIHx8IFAoMHhlZiwweGFiKSB8fCBQKDB4YmYsMHg4ZikgfHwgUCgweDdmLDB4MGYpKSAmJgorICAgICAgICAgV0RJRkYodzMsIHcxKSkKKyAgICAgICAgKmRzdDExID0gdzQ7CisgICAgZWxzZSBpZiAoY29uZDAyKQorICAgICAgICAqZHN0MTEgPSBpbnRlcnBfMnB4KHc0LCA3LCB3MCwgMSwgMyk7CisgICAgZWxzZSBpZiAoY29uZDE1KQorICAgICAgICAqZHN0MTEgPSBpbnRlcnBfMnB4KHc0LCA3LCB3MywgMSwgMyk7CisgICAgZWxzZSBpZiAoY29uZDExKQorICAgICAgICAqZHN0MTEgPSBpbnRlcnBfMnB4KHc0LCA3LCB3MSwgMSwgMyk7CisgICAgZWxzZSBpZiAoUCgweDBhLDB4MDApIHx8IFAoMHg3ZSwweDJhKSB8fCBQKDB4ZWYsMHhhYikgfHwgUCgweGJmLDB4OGYpIHx8CisgICAgICAgICAgICAgUCgweDdlLDB4MGUpKQorICAgICAgICAqZHN0MTEgPSBpbnRlcnBfM3B4KHc0LCA2LCB3MywgMSwgdzEsIDEsIDMpOworICAgIGVsc2UgaWYgKGNvbmQwNykKKyAgICAgICAgKmRzdDExID0gaW50ZXJwXzJweCh3NCwgNywgdzAsIDEsIDMpOworICAgIGVsc2UKKyAgICAgICAgKmRzdDExID0gdzQ7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgaHF4X2ZpbHRlcihjb25zdCBUaHJlYWREYXRhICp0ZCwgaW50IGpvYm5yLCBpbnQgbmJfam9icywgaW50IG4pCit7CisgICAgaW50IHgsIHk7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW4sICpvdXQgPSB0ZC0+b3V0OworICAgIGNvbnN0IHVpbnQzMl90ICpyMnkgPSB0ZC0+cmdidG95dXY7CisgICAgY29uc3QgaW50IGhlaWdodCA9IGluLT5oZWlnaHQ7CisgICAgY29uc3QgaW50IHdpZHRoICA9IGluLT53aWR0aDsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoaGVpZ2h0ICogIGpvYm5yICAgKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCAgID0gKGhlaWdodCAqIChqb2JucisxKSkgLyBuYl9qb2JzOworICAgIGNvbnN0IGludCBkc3RfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWzBdOworICAgIGNvbnN0IGludCBzcmNfbGluZXNpemUgPSAgaW4tPmxpbmVzaXplWzBdOworICAgIHVpbnQ4X3QgICAgICAgKmRzdCA9IG91dC0+ZGF0YVswXSArIHNsaWNlX3N0YXJ0ICogZHN0X2xpbmVzaXplICogbjsKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSAgaW4tPmRhdGFbMF0gKyBzbGljZV9zdGFydCAqIHNyY19saW5lc2l6ZTsKKworICAgIGNvbnN0IGludCBkc3QzMl9saW5lc2l6ZSA9IGRzdF9saW5lc2l6ZSA+PiAyOworICAgIGNvbnN0IGludCBzcmMzMl9saW5lc2l6ZSA9IHNyY19saW5lc2l6ZSA+PiAyOworCisgICAgZm9yICh5ID0gc2xpY2Vfc3RhcnQ7IHkgPCBzbGljZV9lbmQ7IHkrKykgeworICAgICAgICBjb25zdCB1aW50MzJfdCAqc3JjMzIgPSAoY29uc3QgdWludDMyX3QgKilzcmM7CisgICAgICAgIHVpbnQzMl90ICAgICAgICpkc3QzMiA9ICh1aW50MzJfdCAqKWRzdDsKKyAgICAgICAgY29uc3QgaW50IHByZXZsaW5lID0geSA+IDAgICAgICAgICAgPyAtc3JjMzJfbGluZXNpemUgOiAwOworICAgICAgICBjb25zdCBpbnQgbmV4dGxpbmUgPSB5IDwgaGVpZ2h0IC0gMSA/ICBzcmMzMl9saW5lc2l6ZSA6IDA7CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBwcmV2Y29sID0geCA+IDAgICAgICAgID8gLTEgOiAwOworICAgICAgICAgICAgY29uc3QgaW50IG5leHRjb2wgPSB4IDwgd2lkdGggLTEgPyAgMSA6IDA7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB3WzMqM10gPSB7CisgICAgICAgICAgICAgICAgc3JjMzJbcHJldmNvbCArIHByZXZsaW5lXSwgc3JjMzJbcHJldmxpbmVdLCBzcmMzMltwcmV2bGluZSArIG5leHRjb2xdLAorICAgICAgICAgICAgICAgIHNyYzMyW3ByZXZjb2wgICAgICAgICAgIF0sIHNyYzMyWyAgICAgICAwXSwgc3JjMzJbICAgICAgICAgICBuZXh0Y29sXSwKKyAgICAgICAgICAgICAgICBzcmMzMltwcmV2Y29sICsgbmV4dGxpbmVdLCBzcmMzMltuZXh0bGluZV0sIHNyYzMyW25leHRsaW5lICsgbmV4dGNvbF0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB5dXYxID0gcmdiMnl1dihyMnksIHdbNF0pOworICAgICAgICAgICAgY29uc3QgaW50IHBhdHRlcm4gPSAod1s0XSAhPSB3WzBdID8gKHl1dl9kaWZmKHl1djEsIHJnYjJ5dXYocjJ5LCB3WzBdKSkpIDogMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHdbNF0gIT0gd1sxXSA/ICh5dXZfZGlmZih5dXYxLCByZ2IyeXV2KHIyeSwgd1sxXSkpKSA6IDApIDw8IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHdbNF0gIT0gd1syXSA/ICh5dXZfZGlmZih5dXYxLCByZ2IyeXV2KHIyeSwgd1syXSkpKSA6IDApIDw8IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHdbNF0gIT0gd1szXSA/ICh5dXZfZGlmZih5dXYxLCByZ2IyeXV2KHIyeSwgd1szXSkpKSA6IDApIDw8IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHdbNF0gIT0gd1s1XSA/ICh5dXZfZGlmZih5dXYxLCByZ2IyeXV2KHIyeSwgd1s1XSkpKSA6IDApIDw8IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHdbNF0gIT0gd1s2XSA/ICh5dXZfZGlmZih5dXYxLCByZ2IyeXV2KHIyeSwgd1s2XSkpKSA6IDApIDw8IDUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHdbNF0gIT0gd1s3XSA/ICh5dXZfZGlmZih5dXYxLCByZ2IyeXV2KHIyeSwgd1s3XSkpKSA6IDApIDw8IDYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHdbNF0gIT0gd1s4XSA/ICh5dXZfZGlmZih5dXYxLCByZ2IyeXV2KHIyeSwgd1s4XSkpKSA6IDApIDw8IDc7CisKKyAgICAgICAgICAgIGlmIChuID09IDIpIHsKKyAgICAgICAgICAgICAgICBkc3QzMltkc3QzMl9saW5lc2l6ZSowICsgMF0gPSBocTJ4X2ludGVycF8xeDEocjJ5LCBwYXR0ZXJuLCB3LCAwLDEsMiwzLDQsNSw2LDcsOCk7ICAvLyAwMAorICAgICAgICAgICAgICAgIGRzdDMyW2RzdDMyX2xpbmVzaXplKjAgKyAxXSA9IGhxMnhfaW50ZXJwXzF4MShyMnksIHBhdHRlcm4sIHcsIDIsMSwwLDUsNCwzLDgsNyw2KTsgIC8vIDAxICh2ZXJ0IG1pcnJvcmVkKQorICAgICAgICAgICAgICAgIGRzdDMyW2RzdDMyX2xpbmVzaXplKjEgKyAwXSA9IGhxMnhfaW50ZXJwXzF4MShyMnksIHBhdHRlcm4sIHcsIDYsNyw4LDMsNCw1LDAsMSwyKTsgIC8vIDEwIChob3JpeiBtaXJyb3JlZCkKKyAgICAgICAgICAgICAgICBkc3QzMltkc3QzMl9saW5lc2l6ZSoxICsgMV0gPSBocTJ4X2ludGVycF8xeDEocjJ5LCBwYXR0ZXJuLCB3LCA4LDcsNiw1LDQsMywyLDEsMCk7ICAvLyAxMSAoY2VudGVyIG1pcnJvcmVkKQorICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDMpIHsKKyAgICAgICAgICAgICAgICBocTN4X2ludGVycF8yeDEoZHN0MzIsICAgICAgICAgICAgICAgICAgICAgICAgZHN0MzJfbGluZXNpemUsIHIyeSwgcGF0dGVybiwgdywgMCwxLCAwLDEsMiwzLDQsNSw2LDcsOCwgMCk7ICAvLyAwMCAwMQorICAgICAgICAgICAgICAgIGhxM3hfaW50ZXJwXzJ4MShkc3QzMiArIDEsICAgICAgICAgICAgICAgICAgICBkc3QzMl9saW5lc2l6ZSwgcjJ5LCBwYXR0ZXJuLCB3LCAxLDMsIDIsNSw4LDEsNCw3LDAsMyw2LCAxKTsgIC8vIDAyIDEyIChyb3RhdGVkIHRvIHRoZSByaWdodCkKKyAgICAgICAgICAgICAgICBocTN4X2ludGVycF8yeDEoZHN0MzIgKyAxKmRzdDMyX2xpbmVzaXplLCAgICAgZHN0MzJfbGluZXNpemUsIHIyeSwgcGF0dGVybiwgdywgMiwwLCA2LDMsMCw3LDQsMSw4LDUsMiwgMSk7ICAvLyAyMCAxMCAocm90YXRlZCB0byB0aGUgbGVmdCkKKyAgICAgICAgICAgICAgICBocTN4X2ludGVycF8yeDEoZHN0MzIgKyAxKmRzdDMyX2xpbmVzaXplICsgMSwgZHN0MzJfbGluZXNpemUsIHIyeSwgcGF0dGVybiwgdywgMywyLCA4LDcsNiw1LDQsMywyLDEsMCwgMCk7ICAvLyAyMiAyMSAoY2VudGVyIG1pcnJvcmVkKQorICAgICAgICAgICAgICAgIGRzdDMyW2RzdDMyX2xpbmVzaXplICsgMV0gPSB3WzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExCisgICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gNCkgeworICAgICAgICAgICAgICAgIGhxNHhfaW50ZXJwXzJ4Mihkc3QzMiwgICAgICAgICAgICAgICAgICAgICAgICBkc3QzMl9saW5lc2l6ZSwgcjJ5LCBwYXR0ZXJuLCB3LCAwLDEsMiwzLCAwLDEsMiwzLDQsNSw2LDcsOCk7IC8vIDAwIDAxIDEwIDExCisgICAgICAgICAgICAgICAgaHE0eF9pbnRlcnBfMngyKGRzdDMyICsgMiwgICAgICAgICAgICAgICAgICAgIGRzdDMyX2xpbmVzaXplLCByMnksIHBhdHRlcm4sIHcsIDEsMCwzLDIsIDIsMSwwLDUsNCwzLDgsNyw2KTsgLy8gMDIgMDMgMTIgMTMgKHZlcnQgbWlycm9yZWQpCisgICAgICAgICAgICAgICAgaHE0eF9pbnRlcnBfMngyKGRzdDMyICsgMipkc3QzMl9saW5lc2l6ZSwgICAgIGRzdDMyX2xpbmVzaXplLCByMnksIHBhdHRlcm4sIHcsIDIsMywwLDEsIDYsNyw4LDMsNCw1LDAsMSwyKTsgLy8gMjAgMjEgMzAgMzEgKGhvcml6IG1pcnJvcmVkKQorICAgICAgICAgICAgICAgIGhxNHhfaW50ZXJwXzJ4Mihkc3QzMiArIDIqZHN0MzJfbGluZXNpemUgKyAyLCBkc3QzMl9saW5lc2l6ZSwgcjJ5LCBwYXR0ZXJuLCB3LCAzLDIsMSwwLCA4LDcsNiw1LDQsMywyLDEsMCk7IC8vIDIyIDIzIDMyIDMzIChjZW50ZXIgbWlycm9yZWQpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNyYzMyICs9IDE7CisgICAgICAgICAgICBkc3QzMiArPSBuOworICAgICAgICB9CisKKyAgICAgICAgc3JjICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgZHN0ICs9IGRzdF9saW5lc2l6ZSAqIG47CisgICAgfQorfQorCisjZGVmaW5lIEhRWF9GVU5DKHNpemUpIFwKK3N0YXRpYyBpbnQgaHEjI3NpemUjI3goQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykgXAoreyBcCisgICAgaHF4X2ZpbHRlcihhcmcsIGpvYm5yLCBuYl9qb2JzLCBzaXplKTsgXAorICAgIHJldHVybiAwOyBcCit9CisKK0hRWF9GVU5DKDIpCitIUVhfRlVOQygzKQorSFFYX0ZVTkMoNCkKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHtBVl9QSVhfRk1UX1JHQjMyLCBBVl9QSVhfRk1UX05PTkV9OworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBIUVhDb250ZXh0ICpocXggPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKworICAgIG91dGxpbmstPncgPSBpbmxpbmstPncgKiBocXgtPm47CisgICAgb3V0bGluay0+aCA9IGlubGluay0+aCAqIGhxeC0+bjsKKyAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19WRVJCT1NFLCAiZm10OiVzIHNpemU6JWR4JWQgLT4gc2l6ZTolZHglZFxuIiwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbmxpbmstPmZvcm1hdCksCisgICAgICAgICAgIGlubGluay0+dywgaW5saW5rLT5oLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEhRWENvbnRleHQgKmhxeCA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhIHRkOworICAgIEFWRnJhbWUgKm91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIG91dC0+d2lkdGggID0gb3V0bGluay0+dzsKKyAgICBvdXQtPmhlaWdodCA9IG91dGxpbmstPmg7CisKKyAgICB0ZC5pbiA9IGluOworICAgIHRkLm91dCA9IG91dDsKKyAgICB0ZC5yZ2J0b3l1diA9IGhxeC0+cmdidG95dXY7CisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGhxeC0+ZnVuYywgJnRkLCBOVUxMLCBGRk1JTihpbmxpbmstPmgsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEhRWENvbnRleHQgKmhxeCA9IGN0eC0+cHJpdjsKKyAgICBzdGF0aWMgY29uc3QgaHF4ZnVuY190IGhxeGZ1bmNzW10gPSB7aHEyeCwgaHEzeCwgaHE0eH07CisKKyAgICB1aW50MzJfdCBjOworICAgIGludCBiZywgcmcsIGc7CisKKyAgICBmb3IgKGJnPS0yNTU7IGJnPDI1NjsgYmcrKykgeworICAgICAgICBmb3IgKHJnPS0yNTU7IHJnPDI1NjsgcmcrKykgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdSA9ICh1aW50MzJfdCkoKC0xNjkqcmcgKyA1MDAqYmcpLzEwMDApICsgMTI4OworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdiA9ICh1aW50MzJfdCkoKCA1MDAqcmcgLSAgODEqYmcpLzEwMDApICsgMTI4OworICAgICAgICAgICAgaW50IHN0YXJ0ZyA9IEZGTUFYMygtYmcsIC1yZywgMCk7CisgICAgICAgICAgICBpbnQgZW5kZyA9IEZGTUlOMygyNTUtYmcsIDI1NS1yZywgMjU1KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHkgPSAodWludDMyX3QpKCggMjk5KnJnICsgMTAwMCpzdGFydGcgKyAxMTQqYmcpLzEwMDApOworICAgICAgICAgICAgYyA9IGJnICsgKHJnPDwxNikgKyAweDAxMDEwMSAqIHN0YXJ0ZzsKKyAgICAgICAgICAgIGZvciAoZyA9IHN0YXJ0ZzsgZyA8PSBlbmRnOyBnKyspIHsKKyAgICAgICAgICAgICAgICBocXgtPnJnYnRveXV2W2NdID0gKCh5KyspIDw8IDE2KSArICh1IDw8IDgpICsgdjsKKyAgICAgICAgICAgICAgICBjKz0gMHgwMTAxMDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBocXgtPmZ1bmMgPSBocXhmdW5jc1tocXgtPm4gLSAyXTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGhxeF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGhxeF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9ocXggPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiaHF4IiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTY2FsZSB0aGUgaW5wdXQgYnkgMiwgMyBvciA0IHVzaW5nIHRoZSBocSp4IG1hZ25pZmljYXRpb24gYWxnb3JpdGhtLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEhRWENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBocXhfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gaHF4X291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmaHF4X2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9odWUuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9odWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODQzNjczCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2h1ZS5jCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBKZXJlbXkgVHJhbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBcHBseSBhIGh1ZS9zYXR1cmF0aW9uIGZpbHRlciB0byB0aGUgaW5wdXQgdmlkZW8KKyAqIFBvcnRlZCBmcm9tIE1QbGF5ZXIgbGlibXBjb2RlY3MvdmZfaHVlLmMuCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworI2RlZmluZSBTQVRfTUlOX1ZBTCAtMTAKKyNkZWZpbmUgU0FUX01BWF9WQUwgMTAKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJuIiwgICAvLyBmcmFtZSBjb3VudAorICAgICJwdHMiLCAvLyBwcmVzZW50YXRpb24gdGltZXN0YW1wIGV4cHJlc3NlZCBpbiBBVl9USU1FX0JBU0UgdW5pdHMKKyAgICAiciIsICAgLy8gZnJhbWUgcmF0ZQorICAgICJ0IiwgICAvLyB0aW1lc3RhbXAgZXhwcmVzc2VkIGluIHNlY29uZHMKKyAgICAidGIiLCAgLy8gdGltZWJhc2UKKyAgICBOVUxMCit9OworCitlbnVtIHZhcl9uYW1lIHsKKyAgICBWQVJfTiwKKyAgICBWQVJfUFRTLAorICAgIFZBUl9SLAorICAgIFZBUl9ULAorICAgIFZBUl9UQiwKKyAgICBWQVJfTkIKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCAgICBBVkNsYXNzICpjbGFzczsKKyAgICBmbG9hdCAgICBodWVfZGVnOyAvKiBodWUgZXhwcmVzc2VkIGluIGRlZ3JlZXMgKi8KKyAgICBmbG9hdCAgICBodWU7IC8qIGh1ZSBleHByZXNzZWQgaW4gcmFkaWFucyAqLworICAgIGNoYXIgICAgICpodWVfZGVnX2V4cHI7CisgICAgY2hhciAgICAgKmh1ZV9leHByOworICAgIEFWRXhwciAgICpodWVfZGVnX3BleHByOworICAgIEFWRXhwciAgICpodWVfcGV4cHI7CisgICAgZmxvYXQgICAgc2F0dXJhdGlvbjsKKyAgICBjaGFyICAgICAqc2F0dXJhdGlvbl9leHByOworICAgIEFWRXhwciAgICpzYXR1cmF0aW9uX3BleHByOworICAgIGZsb2F0ICAgIGJyaWdodG5lc3M7CisgICAgY2hhciAgICAgKmJyaWdodG5lc3NfZXhwcjsKKyAgICBBVkV4cHIgICAqYnJpZ2h0bmVzc19wZXhwcjsKKyAgICBpbnQgICAgICBoc3ViOworICAgIGludCAgICAgIHZzdWI7CisgICAgaW50IGlzX2ZpcnN0OworICAgIGludDMyX3QgaHVlX3NpbjsKKyAgICBpbnQzMl90IGh1ZV9jb3M7CisgICAgZG91YmxlICAgdmFyX3ZhbHVlc1tWQVJfTkJdOworICAgIHVpbnQ4X3QgIGx1dF9sWzI1Nl07CisgICAgdWludDhfdCAgbHV0X3VbMjU2XVsyNTZdOworICAgIHVpbnQ4X3QgIGx1dF92WzI1Nl1bMjU2XTsKK30gSHVlQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSHVlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaHVlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJoIiwgInNldCB0aGUgaHVlIGFuZ2xlIGRlZ3JlZXMgZXhwcmVzc2lvbiIsIE9GRlNFVChodWVfZGVnX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsCisgICAgICB7IC5zdHIgPSBOVUxMIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAicyIsICJzZXQgdGhlIHNhdHVyYXRpb24gZXhwcmVzc2lvbiIsIE9GRlNFVChzYXR1cmF0aW9uX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsCisgICAgICB7IC5zdHIgPSAiMSIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJIIiwgInNldCB0aGUgaHVlIGFuZ2xlIHJhZGlhbnMgZXhwcmVzc2lvbiIsIE9GRlNFVChodWVfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywKKyAgICAgIHsgLnN0ciA9IE5VTEwgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJiIiwgInNldCB0aGUgYnJpZ2h0bmVzcyBleHByZXNzaW9uIiwgT0ZGU0VUKGJyaWdodG5lc3NfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywKKyAgICAgIHsgLnN0ciA9ICIwIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoaHVlKTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvbXB1dGVfc2luX2FuZF9jb3MoSHVlQ29udGV4dCAqaHVlKQoreworICAgIC8qCisgICAgICogU2NhbGUgdGhlIHZhbHVlIHRvIHRoZSBub3JtIG9mIHRoZSByZXN1bHRpbmcgKFUsVikgdmVjdG9yLCB0aGF0IGlzCisgICAgICogdGhlIHNhdHVyYXRpb24uCisgICAgICogVGhpcyB3aWxsIGJlIHVzZWZ1bCBpbiB0aGUgYXBwbHlfbHV0IGZ1bmN0aW9uLgorICAgICAqLworICAgIGh1ZS0+aHVlX3NpbiA9IHJpbnQoc2luKGh1ZS0+aHVlKSAqICgxIDw8IDE2KSAqIGh1ZS0+c2F0dXJhdGlvbik7CisgICAgaHVlLT5odWVfY29zID0gcmludChjb3MoaHVlLT5odWUpICogKDEgPDwgMTYpICogaHVlLT5zYXR1cmF0aW9uKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyZWF0ZV9sdW1hX2x1dChIdWVDb250ZXh0ICpoKQoreworICAgIGNvbnN0IGZsb2F0IGIgPSBoLT5icmlnaHRuZXNzOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGgtPmx1dF9sW2ldID0gYXZfY2xpcF91aW50OChpICsgYiAqIDI1LjUpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyZWF0ZV9jaHJvbWluYW5jZV9sdXQoSHVlQ29udGV4dCAqaCwgY29uc3QgaW50MzJfdCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzKQoreworICAgIGludDMyX3QgaSwgaiwgdSwgdiwgbmV3X3UsIG5ld192OworCisgICAgLyoKKyAgICAgKiBJZiB3ZSBjb25zaWRlciBVIGFuZCBWIGFzIHRoZSBjb21wb25lbnRzIG9mIGEgMkQgdmVjdG9yIHRoZW4gaXRzIGFuZ2xlCisgICAgICogaXMgdGhlIGh1ZSBhbmQgdGhlIG5vcm0gaXMgdGhlIHNhdHVyYXRpb24KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CisgICAgICAgICAgICAvKiBOb3JtYWxpemUgdGhlIGNvbXBvbmVudHMgZnJvbSByYW5nZSBbMTY7MTQwXSB0byBbLTExMjsxMTJdICovCisgICAgICAgICAgICB1ID0gaSAtIDEyODsKKyAgICAgICAgICAgIHYgPSBqIC0gMTI4OworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRoZSByb3RhdGlvbiBvZiB0aGUgdmVjdG9yIDogKGMgKiB1KSAtIChzICogdikKKyAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMgKiB1KSArIChjICogdikKKyAgICAgICAgICAgICAqIERlLW5vcm1hbGl6ZSB0aGUgY29tcG9uZW50cyAod2l0aG91dCBmb3JnZXR0aW5nIHRvIHNjYWxlIDEyOAorICAgICAgICAgICAgICogYnkgPDwgMTYpCisgICAgICAgICAgICAgKiBGaW5hbGx5IHNjYWxlIGJhY2sgdGhlIHJlc3VsdCBieSA+PiAxNgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuZXdfdSA9ICgoYyAqIHUpIC0gKHMgKiB2KSArICgxIDw8IDE1KSArICgxMjggPDwgMTYpKSA+PiAxNjsKKyAgICAgICAgICAgIG5ld192ID0gKChzICogdSkgKyAoYyAqIHYpICsgKDEgPDwgMTUpICsgKDEyOCA8PCAxNikpID4+IDE2OworCisgICAgICAgICAgICAvKiBQcmV2ZW50IGEgcG90ZW50aWFsIG92ZXJmbG93ICovCisgICAgICAgICAgICBoLT5sdXRfdVtpXVtqXSA9IGF2X2NsaXBfdWludDgobmV3X3UpOworICAgICAgICAgICAgaC0+bHV0X3ZbaV1bal0gPSBhdl9jbGlwX3VpbnQ4KG5ld192KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBzZXRfZXhwcihBVkV4cHIgKipwZXhwcl9wdHIsIGNoYXIgKipleHByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXhwciwgY29uc3QgY2hhciAqb3B0aW9uLCB2b2lkICpsb2dfY3R4KQoreworICAgIGludCByZXQ7CisgICAgQVZFeHByICpuZXdfcGV4cHI7CisgICAgY2hhciAqbmV3X2V4cHI7CisKKyAgICBuZXdfZXhwciA9IGF2X3N0cmR1cChleHByKTsKKyAgICBpZiAoIW5ld19leHByKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldCA9IGF2X2V4cHJfcGFyc2UoJm5ld19wZXhwciwgZXhwciwgdmFyX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbG9nX2N0eCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJFcnJvciB3aGVuIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gJyVzJyBmb3IgJXNcbiIsCisgICAgICAgICAgICAgICBleHByLCBvcHRpb24pOworICAgICAgICBhdl9mcmVlKG5ld19leHByKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoKnBleHByX3B0cikKKyAgICAgICAgYXZfZXhwcl9mcmVlKCpwZXhwcl9wdHIpOworICAgICpwZXhwcl9wdHIgPSBuZXdfcGV4cHI7CisgICAgYXZfZnJlZXAoZXhwcl9wdHIpOworICAgICpleHByX3B0ciA9IG5ld19leHByOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEh1ZUNvbnRleHQgKmh1ZSA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGh1ZS0+aHVlX2V4cHIgJiYgaHVlLT5odWVfZGVnX2V4cHIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkggYW5kIGggb3B0aW9ucyBhcmUgaW5jb21wYXRpYmxlIGFuZCBjYW5ub3QgYmUgc3BlY2lmaWVkICIKKyAgICAgICAgICAgICAgICJhdCB0aGUgc2FtZSB0aW1lXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyNkZWZpbmUgU0VUX0VYUFIoZXhwciwgb3B0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoaHVlLT5leHByIyNfZXhwcikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0ID0gc2V0X2V4cHIoJmh1ZS0+ZXhwciMjX3BleHByLCAmaHVlLT5leHByIyNfZXhwciwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgaHVlLT5leHByIyNfZXhwciwgb3B0aW9uLCBjdHgpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHJldCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorICAgIFNFVF9FWFBSKGJyaWdodG5lc3MsICJiIik7CisgICAgU0VUX0VYUFIoc2F0dXJhdGlvbiwgInMiKTsKKyAgICBTRVRfRVhQUihodWVfZGVnLCAgICAiaCIpOworICAgIFNFVF9FWFBSKGh1ZSwgICAgICAgICJIIik7CisjdW5kZWYgU0VUX0VYUFIKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAiSF9leHByOiVzIGhfZGVnX2V4cHI6JXMgc19leHByOiVzIGJfZXhwcjolc1xuIiwKKyAgICAgICAgICAgaHVlLT5odWVfZXhwciwgaHVlLT5odWVfZGVnX2V4cHIsIGh1ZS0+c2F0dXJhdGlvbl9leHByLCBodWUtPmJyaWdodG5lc3NfZXhwcik7CisgICAgY29tcHV0ZV9zaW5fYW5kX2NvcyhodWUpOworICAgIGh1ZS0+aXNfZmlyc3QgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEh1ZUNvbnRleHQgKmh1ZSA9IGN0eC0+cHJpdjsKKworICAgIGF2X2V4cHJfZnJlZShodWUtPmJyaWdodG5lc3NfcGV4cHIpOworICAgIGF2X2V4cHJfZnJlZShodWUtPmh1ZV9kZWdfcGV4cHIpOworICAgIGF2X2V4cHJfZnJlZShodWUtPmh1ZV9wZXhwcik7CisgICAgYXZfZXhwcl9mcmVlKGh1ZS0+c2F0dXJhdGlvbl9wZXhwcik7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsICAgICBBVl9QSVhfRk1UX1lVVkE0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEh1ZUNvbnRleHQgKmh1ZSA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworCisgICAgaHVlLT5oc3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBodWUtPnZzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgaHVlLT52YXJfdmFsdWVzW1ZBUl9OXSAgPSAwOworICAgIGh1ZS0+dmFyX3ZhbHVlc1tWQVJfVEJdID0gYXZfcTJkKGlubGluay0+dGltZV9iYXNlKTsKKyAgICBodWUtPnZhcl92YWx1ZXNbVkFSX1JdICA9IGlubGluay0+ZnJhbWVfcmF0ZS5udW0gPT0gMCB8fCBpbmxpbmstPmZyYW1lX3JhdGUuZGVuID09IDAgPworICAgICAgICBOQU4gOiBhdl9xMmQoaW5saW5rLT5mcmFtZV9yYXRlKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcHBseV9sdW1hX2x1dChIdWVDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbGRzdCwgY29uc3QgaW50IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmxzcmMsIGNvbnN0IGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpCit7CisgICAgaW50IGk7CisKKyAgICB3aGlsZSAoaC0tKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspCisgICAgICAgICAgICBsZHN0W2ldID0gcy0+bHV0X2xbbHNyY1tpXV07CisKKyAgICAgICAgbHNyYyArPSBzcmNfbGluZXNpemU7CisgICAgICAgIGxkc3QgKz0gZHN0X2xpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYXBwbHlfbHV0KEh1ZUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdWRzdCwgdWludDhfdCAqdmRzdCwgY29uc3QgaW50IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp1c3JjLCB1aW50OF90ICp2c3JjLCBjb25zdCBpbnQgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgaTsKKworICAgIHdoaWxlIChoLS0pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICAgICAgY29uc3QgaW50IHUgPSB1c3JjW2ldOworICAgICAgICAgICAgY29uc3QgaW50IHYgPSB2c3JjW2ldOworCisgICAgICAgICAgICB1ZHN0W2ldID0gcy0+bHV0X3VbdV1bdl07CisgICAgICAgICAgICB2ZHN0W2ldID0gcy0+bHV0X3ZbdV1bdl07CisgICAgICAgIH0KKworICAgICAgICB1c3JjICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgdnNyYyArPSBzcmNfbGluZXNpemU7CisgICAgICAgIHVkc3QgKz0gZHN0X2xpbmVzaXplOworICAgICAgICB2ZHN0ICs9IGRzdF9saW5lc2l6ZTsKKyAgICB9Cit9CisKKyNkZWZpbmUgVFMyRCh0cykgKCh0cykgPT0gQVZfTk9QVFNfVkFMVUUgPyBOQU4gOiAoZG91YmxlKSh0cykpCisjZGVmaW5lIFRTMlQodHMsIHRiKSAoKHRzKSA9PSBBVl9OT1BUU19WQUxVRSA/IE5BTiA6IChkb3VibGUpKHRzKSAqIGF2X3EyZCh0YikpCisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnBpYykKK3sKKyAgICBIdWVDb250ZXh0ICpodWUgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXRwaWM7CisgICAgY29uc3QgaW50MzJfdCBvbGRfaHVlX3NpbiA9IGh1ZS0+aHVlX3Npbiwgb2xkX2h1ZV9jb3MgPSBodWUtPmh1ZV9jb3M7CisgICAgY29uc3QgZmxvYXQgb2xkX2JyaWdodG5lc3MgPSBodWUtPmJyaWdodG5lc3M7CisgICAgaW50IGRpcmVjdCA9IDA7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW5waWMpKSB7CisgICAgICAgIGRpcmVjdCA9IDE7CisgICAgICAgIG91dHBpYyA9IGlucGljOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dHBpYyA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0cGljKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnBpYyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0cGljLCBpbnBpYyk7CisgICAgfQorCisgICAgaHVlLT52YXJfdmFsdWVzW1ZBUl9OXSAgID0gaW5saW5rLT5mcmFtZV9jb3VudDsKKyAgICBodWUtPnZhcl92YWx1ZXNbVkFSX1RdICAgPSBUUzJUKGlucGljLT5wdHMsIGlubGluay0+dGltZV9iYXNlKTsKKyAgICBodWUtPnZhcl92YWx1ZXNbVkFSX1BUU10gPSBUUzJEKGlucGljLT5wdHMpOworCisgICAgaWYgKGh1ZS0+c2F0dXJhdGlvbl9leHByKSB7CisgICAgICAgIGh1ZS0+c2F0dXJhdGlvbiA9IGF2X2V4cHJfZXZhbChodWUtPnNhdHVyYXRpb25fcGV4cHIsIGh1ZS0+dmFyX3ZhbHVlcywgTlVMTCk7CisKKyAgICAgICAgaWYgKGh1ZS0+c2F0dXJhdGlvbiA8IFNBVF9NSU5fVkFMIHx8IGh1ZS0+c2F0dXJhdGlvbiA+IFNBVF9NQVhfVkFMKSB7CisgICAgICAgICAgICBodWUtPnNhdHVyYXRpb24gPSBhdl9jbGlwKGh1ZS0+c2F0dXJhdGlvbiwgU0FUX01JTl9WQUwsIFNBVF9NQVhfVkFMKTsKKyAgICAgICAgICAgIGF2X2xvZyhpbmxpbmstPmRzdCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIlNhdHVyYXRpb24gdmFsdWUgbm90IGluIHJhbmdlIFslZCwlZF06IGNsaXBwaW5nIHZhbHVlIHRvICUwLjFmXG4iLAorICAgICAgICAgICAgICAgICAgIFNBVF9NSU5fVkFMLCBTQVRfTUFYX1ZBTCwgaHVlLT5zYXR1cmF0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChodWUtPmJyaWdodG5lc3NfZXhwcikgeworICAgICAgICBodWUtPmJyaWdodG5lc3MgPSBhdl9leHByX2V2YWwoaHVlLT5icmlnaHRuZXNzX3BleHByLCBodWUtPnZhcl92YWx1ZXMsIE5VTEwpOworCisgICAgICAgIGlmIChodWUtPmJyaWdodG5lc3MgPCAtMTAgfHwgaHVlLT5icmlnaHRuZXNzID4gMTApIHsKKyAgICAgICAgICAgIGh1ZS0+YnJpZ2h0bmVzcyA9IGF2X2NsaXBmKGh1ZS0+YnJpZ2h0bmVzcywgLTEwLCAxMCk7CisgICAgICAgICAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJCcmlnaHRuZXNzIHZhbHVlIG5vdCBpbiByYW5nZSBbJWQsJWRdOiBjbGlwcGluZyB2YWx1ZSB0byAlMC4xZlxuIiwKKyAgICAgICAgICAgICAgICAgICAtMTAsIDEwLCBodWUtPmJyaWdodG5lc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGh1ZS0+aHVlX2RlZ19leHByKSB7CisgICAgICAgIGh1ZS0+aHVlX2RlZyA9IGF2X2V4cHJfZXZhbChodWUtPmh1ZV9kZWdfcGV4cHIsIGh1ZS0+dmFyX3ZhbHVlcywgTlVMTCk7CisgICAgICAgIGh1ZS0+aHVlID0gaHVlLT5odWVfZGVnICogTV9QSSAvIDE4MDsKKyAgICB9IGVsc2UgaWYgKGh1ZS0+aHVlX2V4cHIpIHsKKyAgICAgICAgaHVlLT5odWUgPSBhdl9leHByX2V2YWwoaHVlLT5odWVfcGV4cHIsIGh1ZS0+dmFyX3ZhbHVlcywgTlVMTCk7CisgICAgICAgIGh1ZS0+aHVlX2RlZyA9IGh1ZS0+aHVlICogMTgwIC8gTV9QSTsKKyAgICB9CisKKyAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgIkg6JTAuMWYqUEkgaDolMC4xZiBzOiUwLjFmIGI6JTAuZiB0OiUwLjFmIG46JWRcbiIsCisgICAgICAgICAgIGh1ZS0+aHVlL01fUEksIGh1ZS0+aHVlX2RlZywgaHVlLT5zYXR1cmF0aW9uLCBodWUtPmJyaWdodG5lc3MsCisgICAgICAgICAgIGh1ZS0+dmFyX3ZhbHVlc1tWQVJfVF0sIChpbnQpaHVlLT52YXJfdmFsdWVzW1ZBUl9OXSk7CisKKyAgICBjb21wdXRlX3Npbl9hbmRfY29zKGh1ZSk7CisgICAgaWYgKGh1ZS0+aXNfZmlyc3QgfHwgKG9sZF9odWVfc2luICE9IGh1ZS0+aHVlX3NpbiB8fCBvbGRfaHVlX2NvcyAhPSBodWUtPmh1ZV9jb3MpKQorICAgICAgICBjcmVhdGVfY2hyb21pbmFuY2VfbHV0KGh1ZSwgaHVlLT5odWVfY29zLCBodWUtPmh1ZV9zaW4pOworCisgICAgaWYgKGh1ZS0+aXNfZmlyc3QgfHwgKG9sZF9icmlnaHRuZXNzICE9IGh1ZS0+YnJpZ2h0bmVzcyAmJiBodWUtPmJyaWdodG5lc3MpKQorICAgICAgICBjcmVhdGVfbHVtYV9sdXQoaHVlKTsKKworICAgIGlmICghZGlyZWN0KSB7CisgICAgICAgIGlmICghaHVlLT5icmlnaHRuZXNzKQorICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXRwaWMtPmRhdGFbMF0sIG91dHBpYy0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucGljLT5kYXRhWzBdLCAgaW5waWMtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCk7CisgICAgICAgIGlmIChpbnBpYy0+ZGF0YVszXSkKKyAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUob3V0cGljLT5kYXRhWzNdLCBvdXRwaWMtPmxpbmVzaXplWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnBpYy0+ZGF0YVszXSwgIGlucGljLT5saW5lc2l6ZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT53LCBpbmxpbmstPmgpOworICAgIH0KKworICAgIGFwcGx5X2x1dChodWUsIG91dHBpYy0+ZGF0YVsxXSwgb3V0cGljLT5kYXRhWzJdLCBvdXRwaWMtPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICBpbnBpYy0+ZGF0YVsxXSwgIGlucGljLT5kYXRhWzJdLCAgaW5waWMtPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICBGRl9DRUlMX1JTSElGVChpbmxpbmstPncsIGh1ZS0+aHN1YiksCisgICAgICAgICAgICAgIEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwgaHVlLT52c3ViKSk7CisgICAgaWYgKGh1ZS0+YnJpZ2h0bmVzcykKKyAgICAgICAgYXBwbHlfbHVtYV9sdXQoaHVlLCBvdXRwaWMtPmRhdGFbMF0sIG91dHBpYy0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIGlucGljLT5kYXRhWzBdLCBpbnBpYy0+bGluZXNpemVbMF0sIGlubGluay0+dywgaW5saW5rLT5oKTsKKworICAgIGlmICghZGlyZWN0KQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnBpYyk7CisKKyAgICBodWUtPmlzX2ZpcnN0ID0gMDsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dHBpYyk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19jb21tYW5kKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZXMsIGludCByZXNfbGVuLCBpbnQgZmxhZ3MpCit7CisgICAgSHVlQ29udGV4dCAqaHVlID0gY3R4LT5wcml2OworICAgIGludCByZXQ7CisKKyNkZWZpbmUgU0VUX0VYUFIoZXhwciwgb3B0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0ID0gc2V0X2V4cHIoJmh1ZS0+ZXhwciMjX3BleHByLCAmaHVlLT5leHByIyNfZXhwciwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgYXJncywgb3B0aW9uLCBjdHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHJldCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgaWYgKCFzdHJjbXAoY21kLCAiaCIpKSB7CisgICAgICAgIFNFVF9FWFBSKGh1ZV9kZWcsICJoIik7CisgICAgICAgIGF2X2ZyZWVwKCZodWUtPmh1ZV9leHByKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiSCIpKSB7CisgICAgICAgIFNFVF9FWFBSKGh1ZSwgIkgiKTsKKyAgICAgICAgYXZfZnJlZXAoJmh1ZS0+aHVlX2RlZ19leHByKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAicyIpKSB7CisgICAgICAgIFNFVF9FWFBSKHNhdHVyYXRpb24sICJzIik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGNtZCwgImIiKSkgeworICAgICAgICBTRVRfRVhQUihicmlnaHRuZXNzLCAiYiIpOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBodWVfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBodWVfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2h1ZSA9IHsKKyAgICAubmFtZSAgICAgICAgICAgID0gImh1ZSIsCisgICAgLmRlc2NyaXB0aW9uICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBZGp1c3QgdGhlIGh1ZSBhbmQgc2F0dXJhdGlvbiBvZiB0aGUgaW5wdXQgdmlkZW8uIiksCisgICAgLnByaXZfc2l6ZSAgICAgICA9IHNpemVvZihIdWVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzICAgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcm9jZXNzX2NvbW1hbmQgPSBwcm9jZXNzX2NvbW1hbmQsCisgICAgLmlucHV0cyAgICAgICAgICA9IGh1ZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgICA9IGh1ZV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgICAgPSAmaHVlX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfaWRldC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2lkZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTI1MDQyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2lkZXQuYwpAQCAtMCwwICsxLDQwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4gLyogRkxUX01BWCAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2Zl9pZGV0LmgiCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKElERVRDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGlkZXRfb3B0aW9uc1tdID0geworICAgIHsgImludGxfdGhyZXMiLCAic2V0IGludGVybGFjaW5nIHRocmVzaG9sZCIsIE9GRlNFVChpbnRlcmxhY2VfdGhyZXNob2xkKSwgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAxLjA0fSwgLTEsIEZMVF9NQVgsIEZMQUdTIH0sCisgICAgeyAicHJvZ190aHJlcyIsICJzZXQgcHJvZ3Jlc3NpdmUgdGhyZXNob2xkIiwgT0ZGU0VUKHByb2dyZXNzaXZlX3RocmVzaG9sZCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IDEuNX0sICAtMSwgRkxUX01BWCwgRkxBR1MgfSwKKyAgICB7ICJyZXBfdGhyZXMiLCAgInNldCByZXBlYXQgdGhyZXNob2xkIiwgICAgICBPRkZTRVQocmVwZWF0X3RocmVzaG9sZCksICAgICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMy4wfSwgIC0xLCBGTFRfTUFYLCBGTEFHUyB9LAorICAgIHsgImhhbGZfbGlmZSIsICJoYWxmIGxpZmUgb2YgY3VtdWxhdGl2ZSBzdGF0aXN0aWNzIiwgT0ZGU0VUKGhhbGZfbGlmZSksICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAwLjB9LCAgLTEsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhpZGV0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnR5cGUyc3RyKFR5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIFRGRiAgICAgICAgICA6IHJldHVybiAidGZmIjsKKyAgICAgICAgY2FzZSBCRkYgICAgICAgICAgOiByZXR1cm4gImJmZiI7CisgICAgICAgIGNhc2UgUFJPR1JFU1NJVkUgIDogcmV0dXJuICJwcm9ncmVzc2l2ZSI7CisgICAgICAgIGNhc2UgVU5ERVRFUk1JTkVEIDogcmV0dXJuICJ1bmRldGVybWluZWQiOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBQUkVDSVNJT04gMTA0ODU3NgorCitzdGF0aWMgdWludDY0X3QgdWludHBvdyh1aW50NjRfdCBiLHVuc2lnbmVkIGludCBlKQoreworICAgIHVpbnQ2NF90IHI9MTsKKyAgICB3aGlsZShlLS0pIHIqPWI7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgYXZfZGljdF9zZXRfZnhwKEFWRGljdGlvbmFyeSAqKnBtLCBjb25zdCBjaGFyICprZXksIHVpbnQ2NF90IHZhbHVlLCB1bnNpZ25lZCBpbnQgZGlnaXRzLAorICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBjaGFyIHZhbHVlc3RyWzQ0XTsKKyAgICB1aW50NjRfdCBwcmludF9wcmVjaXNpb24gPSB1aW50cG93KDEwLCBkaWdpdHMpOworCisgICAgdmFsdWUgPSBhdl9yZXNjYWxlKHZhbHVlLCBwcmludF9wcmVjaXNpb24sIFBSRUNJU0lPTik7CisKKyAgICBzbnByaW50Zih2YWx1ZXN0ciwgc2l6ZW9mKHZhbHVlc3RyKSwgIiUiUFJJZDY0Ii4lMCoiUFJJZDY0LAorICAgICAgICAgICAgIHZhbHVlIC8gcHJpbnRfcHJlY2lzaW9uLCBkaWdpdHMsIHZhbHVlICUgcHJpbnRfcHJlY2lzaW9uKTsKKworICAgIHJldHVybiBhdl9kaWN0X3NldChwbSwga2V5LCB2YWx1ZXN0ciwgZmxhZ3MpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcmVwMnN0cihSZXBlYXRlZEZpZWxkIHJlcGVhdGVkX2ZpZWxkKQoreworICAgIHN3aXRjaChyZXBlYXRlZF9maWVsZCkgeworICAgICAgICBjYXNlIFJFUEVBVF9OT05FICAgIDogcmV0dXJuICJuZWl0aGVyIjsKKyAgICAgICAgY2FzZSBSRVBFQVRfVE9QICAgICA6IHJldHVybiAidG9wIjsKKyAgICAgICAgY2FzZSBSRVBFQVRfQk9UVE9NICA6IHJldHVybiAiYm90dG9tIjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBmZl9pZGV0X2ZpbHRlcl9saW5lX2MoY29uc3QgdWludDhfdCAqYSwgY29uc3QgdWludDhfdCAqYiwgY29uc3QgdWludDhfdCAqYywgaW50IHcpCit7CisgICAgaW50IHg7CisgICAgaW50IHJldD0wOworCisgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICBpbnQgdiA9ICgqYSsrICsgKmMrKykgLSAyICogKmIrKzsKKyAgICAgICAgcmV0ICs9IEZGQUJTKHYpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9pZGV0X2ZpbHRlcl9saW5lX2NfMTZiaXQoY29uc3QgdWludDE2X3QgKmEsIGNvbnN0IHVpbnQxNl90ICpiLCBjb25zdCB1aW50MTZfdCAqYywgaW50IHcpCit7CisgICAgaW50IHg7CisgICAgaW50IHJldD0wOworCisgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICBpbnQgdiA9ICgqYSsrICsgKmMrKykgLSAyICogKmIrKzsKKyAgICAgICAgcmV0ICs9IEZGQUJTKHYpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcihBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBJREVUQ29udGV4dCAqaWRldCA9IGN0eC0+cHJpdjsKKyAgICBpbnQgeSwgaTsKKyAgICBpbnQ2NF90IGFscGhhWzJdPXswfTsKKyAgICBpbnQ2NF90IGRlbHRhPTA7CisgICAgaW50NjRfdCBnYW1tYVsyXT17MH07CisgICAgVHlwZSB0eXBlLCBiZXN0X3R5cGU7CisgICAgUmVwZWF0ZWRGaWVsZCByZXBlYXQ7CisgICAgaW50IG1hdGNoID0gMDsKKyAgICBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSA9IGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKGlkZXQtPmN1cik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWRldC0+Y3NwLT5uYl9jb21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgaW50IHcgPSBpZGV0LT5jdXItPndpZHRoOworICAgICAgICBpbnQgaCA9IGlkZXQtPmN1ci0+aGVpZ2h0OworICAgICAgICBpbnQgcmVmcyA9IGlkZXQtPmN1ci0+bGluZXNpemVbaV07CisKKyAgICAgICAgaWYgKGkgJiYgaTwzKSB7CisgICAgICAgICAgICB3ID0gRkZfQ0VJTF9SU0hJRlQodywgaWRldC0+Y3NwLT5sb2cyX2Nocm9tYV93KTsKKyAgICAgICAgICAgIGggPSBGRl9DRUlMX1JTSElGVChoLCBpZGV0LT5jc3AtPmxvZzJfY2hyb21hX2gpOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMjsgeSA8IGggLSAyOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnByZXYgPSAmaWRldC0+cHJldi0+ZGF0YVtpXVt5KnJlZnNdOworICAgICAgICAgICAgdWludDhfdCAqY3VyICA9ICZpZGV0LT5jdXIgLT5kYXRhW2ldW3kqcmVmc107CisgICAgICAgICAgICB1aW50OF90ICpuZXh0ID0gJmlkZXQtPm5leHQtPmRhdGFbaV1beSpyZWZzXTsKKyAgICAgICAgICAgIGFscGhhWyB5ICAgJjFdICs9IGlkZXQtPmZpbHRlcl9saW5lKGN1ci1yZWZzLCBwcmV2LCBjdXIrcmVmcywgdyk7CisgICAgICAgICAgICBhbHBoYVsoeV4xKSYxXSArPSBpZGV0LT5maWx0ZXJfbGluZShjdXItcmVmcywgbmV4dCwgY3VyK3JlZnMsIHcpOworICAgICAgICAgICAgZGVsdGEgICAgICAgICAgKz0gaWRldC0+ZmlsdGVyX2xpbmUoY3VyLXJlZnMsICBjdXIsIGN1cityZWZzLCB3KTsKKyAgICAgICAgICAgIGdhbW1hWyh5XjEpJjFdICs9IGlkZXQtPmZpbHRlcl9saW5lKGN1ciAgICAgLCBwcmV2LCBjdXIgICAgICwgdyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAgICAgIChhbHBoYVswXSA+IGlkZXQtPmludGVybGFjZV90aHJlc2hvbGQgKiBhbHBoYVsxXSl7CisgICAgICAgIHR5cGUgPSBURkY7CisgICAgfWVsc2UgaWYoYWxwaGFbMV0gPiBpZGV0LT5pbnRlcmxhY2VfdGhyZXNob2xkICogYWxwaGFbMF0peworICAgICAgICB0eXBlID0gQkZGOworICAgIH1lbHNlIGlmKGFscGhhWzFdID4gaWRldC0+cHJvZ3Jlc3NpdmVfdGhyZXNob2xkICogZGVsdGEpeworICAgICAgICB0eXBlID0gUFJPR1JFU1NJVkU7CisgICAgfWVsc2V7CisgICAgICAgIHR5cGUgPSBVTkRFVEVSTUlORUQ7CisgICAgfQorCisgICAgaWYgKCBnYW1tYVswXSA+IGlkZXQtPnJlcGVhdF90aHJlc2hvbGQgKiBnYW1tYVsxXSApeworICAgICAgICByZXBlYXQgPSBSRVBFQVRfVE9QOworICAgIH0gZWxzZSBpZiAoIGdhbW1hWzFdID4gaWRldC0+cmVwZWF0X3RocmVzaG9sZCAqIGdhbW1hWzBdICl7CisgICAgICAgIHJlcGVhdCA9IFJFUEVBVF9CT1RUT007CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVwZWF0ID0gUkVQRUFUX05PTkU7CisgICAgfQorCisgICAgbWVtbW92ZShpZGV0LT5oaXN0b3J5KzEsIGlkZXQtPmhpc3RvcnksIEhJU1RfU0laRS0xKTsKKyAgICBpZGV0LT5oaXN0b3J5WzBdID0gdHlwZTsKKyAgICBiZXN0X3R5cGUgPSBVTkRFVEVSTUlORUQ7CisgICAgZm9yKGk9MDsgaTxISVNUX1NJWkU7IGkrKyl7CisgICAgICAgIGlmKGlkZXQtPmhpc3RvcnlbaV0gIT0gVU5ERVRFUk1JTkVEKXsKKyAgICAgICAgICAgIGlmKGJlc3RfdHlwZSA9PSBVTkRFVEVSTUlORUQpCisgICAgICAgICAgICAgICAgYmVzdF90eXBlID0gaWRldC0+aGlzdG9yeVtpXTsKKworICAgICAgICAgICAgaWYoaWRldC0+aGlzdG9yeVtpXSA9PSBiZXN0X3R5cGUpIHsKKyAgICAgICAgICAgICAgICBtYXRjaCsrOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgbWF0Y2g9MDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZihpZGV0LT5sYXN0X3R5cGUgPT0gVU5ERVRFUk1JTkVEKXsKKyAgICAgICAgaWYobWF0Y2ggICkgaWRldC0+bGFzdF90eXBlID0gYmVzdF90eXBlOworICAgIH1lbHNleworICAgICAgICBpZihtYXRjaD4yKSBpZGV0LT5sYXN0X3R5cGUgPSBiZXN0X3R5cGU7CisgICAgfQorCisgICAgaWYgICAgICAoaWRldC0+bGFzdF90eXBlID09IFRGRil7CisgICAgICAgIGlkZXQtPmN1ci0+dG9wX2ZpZWxkX2ZpcnN0ID0gMTsKKyAgICAgICAgaWRldC0+Y3VyLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICB9ZWxzZSBpZihpZGV0LT5sYXN0X3R5cGUgPT0gQkZGKXsKKyAgICAgICAgaWRldC0+Y3VyLT50b3BfZmllbGRfZmlyc3QgPSAwOworICAgICAgICBpZGV0LT5jdXItPmludGVybGFjZWRfZnJhbWUgPSAxOworICAgIH1lbHNlIGlmKGlkZXQtPmxhc3RfdHlwZSA9PSBQUk9HUkVTU0lWRSl7CisgICAgICAgIGlkZXQtPmN1ci0+aW50ZXJsYWNlZF9mcmFtZSA9IDA7CisgICAgfQorCisgICAgZm9yKGk9MDsgaTwzOyBpKyspCisgICAgICAgIGlkZXQtPnJlcGVhdHNbaV0gID0gYXZfcmVzY2FsZShpZGV0LT5yZXBlYXRzIFtpXSwgaWRldC0+ZGVjYXlfY29lZmZpY2llbnQsIFBSRUNJU0lPTik7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7CisgICAgICAgIGlkZXQtPnByZXN0YXQgW2ldID0gYXZfcmVzY2FsZShpZGV0LT5wcmVzdGF0IFtpXSwgaWRldC0+ZGVjYXlfY29lZmZpY2llbnQsIFBSRUNJU0lPTik7CisgICAgICAgIGlkZXQtPnBvc3RzdGF0W2ldID0gYXZfcmVzY2FsZShpZGV0LT5wb3N0c3RhdFtpXSwgaWRldC0+ZGVjYXlfY29lZmZpY2llbnQsIFBSRUNJU0lPTik7CisgICAgfQorCisgICAgaWRldC0+dG90YWxfcmVwZWF0cyBbICAgICAgICAgcmVwZWF0XSArKzsKKyAgICBpZGV0LT5yZXBlYXRzICAgICAgIFsgICAgICAgICByZXBlYXRdICs9IFBSRUNJU0lPTjsKKworICAgIGlkZXQtPnRvdGFsX3ByZXN0YXQgWyAgICAgICAgICAgdHlwZV0gKys7CisgICAgaWRldC0+cHJlc3RhdCAgICAgICBbICAgICAgICAgICB0eXBlXSArPSBQUkVDSVNJT047CisKKyAgICBpZGV0LT50b3RhbF9wb3N0c3RhdFtpZGV0LT5sYXN0X3R5cGVdICsrOworICAgIGlkZXQtPnBvc3RzdGF0ICAgICAgW2lkZXQtPmxhc3RfdHlwZV0gKz0gUFJFQ0lTSU9OOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiUmVwZWF0ZWQgRmllbGQ6JTEycywgU2luZ2xlIGZyYW1lOiUxMnMsIE11bHRpIGZyYW1lOiUxMnNcbiIsCisgICAgICAgICAgIHJlcDJzdHIocmVwZWF0KSwgdHlwZTJzdHIodHlwZSksIHR5cGUyc3RyKGlkZXQtPmxhc3RfdHlwZSkpOworCisgICAgYXZfZGljdF9zZXQgICAgKG1ldGFkYXRhLCAibGF2ZmkuaWRldC5yZXBlYXRlZC5jdXJyZW50X2ZyYW1lIiwgcmVwMnN0cihyZXBlYXQpLCAwKTsKKyAgICBhdl9kaWN0X3NldF9meHAobWV0YWRhdGEsICJsYXZmaS5pZGV0LnJlcGVhdGVkLm5laXRoZXIiLCAgICAgICBpZGV0LT5yZXBlYXRzW1JFUEVBVF9OT05FXSwgMiwgMCk7CisgICAgYXZfZGljdF9zZXRfZnhwKG1ldGFkYXRhLCAibGF2ZmkuaWRldC5yZXBlYXRlZC50b3AiLCAgICAgICAgICAgaWRldC0+cmVwZWF0c1tSRVBFQVRfVE9QXSwgMiwgMCk7CisgICAgYXZfZGljdF9zZXRfZnhwKG1ldGFkYXRhLCAibGF2ZmkuaWRldC5yZXBlYXRlZC5ib3R0b20iLCAgICAgICAgaWRldC0+cmVwZWF0c1tSRVBFQVRfQk9UVE9NXSwgMiwgMCk7CisKKyAgICBhdl9kaWN0X3NldCAgICAobWV0YWRhdGEsICJsYXZmaS5pZGV0LnNpbmdsZS5jdXJyZW50X2ZyYW1lIiwgICB0eXBlMnN0cih0eXBlKSwgMCk7CisgICAgYXZfZGljdF9zZXRfZnhwKG1ldGFkYXRhLCAibGF2ZmkuaWRldC5zaW5nbGUudGZmIiwgICAgICAgICAgICAgaWRldC0+cHJlc3RhdFtURkZdLCAyICwgMCk7CisgICAgYXZfZGljdF9zZXRfZnhwKG1ldGFkYXRhLCAibGF2ZmkuaWRldC5zaW5nbGUuYmZmIiwgICAgICAgICAgICAgaWRldC0+cHJlc3RhdFtCRkZdLCAyLCAwKTsKKyAgICBhdl9kaWN0X3NldF9meHAobWV0YWRhdGEsICJsYXZmaS5pZGV0LnNpbmdsZS5wcm9ncmVzc2l2ZSIsICAgICBpZGV0LT5wcmVzdGF0W1BST0dSRVNTSVZFXSwgMiwgMCk7CisgICAgYXZfZGljdF9zZXRfZnhwKG1ldGFkYXRhLCAibGF2ZmkuaWRldC5zaW5nbGUudW5kZXRlcm1pbmVkIiwgICAgaWRldC0+cHJlc3RhdFtVTkRFVEVSTUlORURdLCAyLCAwKTsKKworICAgIGF2X2RpY3Rfc2V0ICAgIChtZXRhZGF0YSwgImxhdmZpLmlkZXQubXVsdGlwbGUuY3VycmVudF9mcmFtZSIsIHR5cGUyc3RyKGlkZXQtPmxhc3RfdHlwZSksIDApOworICAgIGF2X2RpY3Rfc2V0X2Z4cChtZXRhZGF0YSwgImxhdmZpLmlkZXQubXVsdGlwbGUudGZmIiwgICAgICAgICAgIGlkZXQtPnBvc3RzdGF0W1RGRl0sIDIsIDApOworICAgIGF2X2RpY3Rfc2V0X2Z4cChtZXRhZGF0YSwgImxhdmZpLmlkZXQubXVsdGlwbGUuYmZmIiwgICAgICAgICAgIGlkZXQtPnBvc3RzdGF0W0JGRl0sIDIsIDApOworICAgIGF2X2RpY3Rfc2V0X2Z4cChtZXRhZGF0YSwgImxhdmZpLmlkZXQubXVsdGlwbGUucHJvZ3Jlc3NpdmUiLCAgIGlkZXQtPnBvc3RzdGF0W1BST0dSRVNTSVZFXSwgMiwgMCk7CisgICAgYXZfZGljdF9zZXRfZnhwKG1ldGFkYXRhLCAibGF2ZmkuaWRldC5tdWx0aXBsZS51bmRldGVybWluZWQiLCAgaWRldC0+cG9zdHN0YXRbVU5ERVRFUk1JTkVEXSwgMiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqcGljcmVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+ZHN0OworICAgIElERVRDb250ZXh0ICppZGV0ID0gY3R4LT5wcml2OworCisgICAgaWYgKGlkZXQtPnByZXYpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlkZXQtPnByZXYpOworICAgIGlkZXQtPnByZXYgPSBpZGV0LT5jdXI7CisgICAgaWRldC0+Y3VyICA9IGlkZXQtPm5leHQ7CisgICAgaWRldC0+bmV4dCA9IHBpY3JlZjsKKworICAgIGlmICghaWRldC0+Y3VyICYmCisgICAgICAgICEoaWRldC0+Y3VyID0gYXZfZnJhbWVfY2xvbmUoaWRldC0+bmV4dCkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKCFpZGV0LT5wcmV2KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghaWRldC0+Y3NwKQorICAgICAgICBpZGV0LT5jc3AgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGxpbmstPmZvcm1hdCk7CisgICAgaWYgKGlkZXQtPmNzcC0+Y29tcFswXS5kZXB0aF9taW51czEgLyA4ID09IDEpeworICAgICAgICBpZGV0LT5maWx0ZXJfbGluZSA9IChmZl9pZGV0X2ZpbHRlcl9mdW5jKWZmX2lkZXRfZmlsdGVyX2xpbmVfY18xNmJpdDsKKyAgICAgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICAgICAgZmZfaWRldF9pbml0X3g4NihpZGV0LCAxKTsKKyAgICB9CisKKyAgICBmaWx0ZXIoY3R4KTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBhdl9mcmFtZV9jbG9uZShpZGV0LT5jdXIpKTsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGxpbmstPnNyYzsKKyAgICBJREVUQ29udGV4dCAqaWRldCA9IGN0eC0+cHJpdjsKKworICAgIGRvIHsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAoaWRldC0+ZW9mKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUobGluay0+c3JjLT5pbnB1dHNbMF0pOworCisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgaWRldC0+Y3VyKSB7CisgICAgICAgICAgICBBVkZyYW1lICpuZXh0ID0gYXZfZnJhbWVfY2xvbmUoaWRldC0+bmV4dCk7CisKKyAgICAgICAgICAgIGlmICghbmV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBmaWx0ZXJfZnJhbWUobGluay0+c3JjLT5pbnB1dHNbMF0sIG5leHQpOworICAgICAgICAgICAgaWRldC0+ZW9mID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfSB3aGlsZSAoIWlkZXQtPnByZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIElERVRDb250ZXh0ICppZGV0ID0gY3R4LT5wcml2OworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJSZXBlYXRlZCBGaWVsZHM6IE5laXRoZXI6JTYiUFJJZDY0IiBUb3A6JTYiUFJJZDY0IiBCb3R0b206JTYiUFJJZDY0IlxuIiwKKyAgICAgICAgICAgaWRldC0+dG90YWxfcmVwZWF0c1tSRVBFQVRfTk9ORV0sCisgICAgICAgICAgIGlkZXQtPnRvdGFsX3JlcGVhdHNbUkVQRUFUX1RPUF0sCisgICAgICAgICAgIGlkZXQtPnRvdGFsX3JlcGVhdHNbUkVQRUFUX0JPVFRPTV0KKyAgICAgICAgKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlNpbmdsZSBmcmFtZSBkZXRlY3Rpb246IFRGRjolNiJQUklkNjQiIEJGRjolNiJQUklkNjQiIFByb2dyZXNzaXZlOiU2IlBSSWQ2NCIgVW5kZXRlcm1pbmVkOiU2IlBSSWQ2NCJcbiIsCisgICAgICAgICAgIGlkZXQtPnRvdGFsX3ByZXN0YXRbVEZGXSwKKyAgICAgICAgICAgaWRldC0+dG90YWxfcHJlc3RhdFtCRkZdLAorICAgICAgICAgICBpZGV0LT50b3RhbF9wcmVzdGF0W1BST0dSRVNTSVZFXSwKKyAgICAgICAgICAgaWRldC0+dG90YWxfcHJlc3RhdFtVTkRFVEVSTUlORURdCisgICAgICAgICk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJNdWx0aSBmcmFtZSBkZXRlY3Rpb246IFRGRjolNiJQUklkNjQiIEJGRjolNiJQUklkNjQiIFByb2dyZXNzaXZlOiU2IlBSSWQ2NCIgVW5kZXRlcm1pbmVkOiU2IlBSSWQ2NCJcbiIsCisgICAgICAgICAgIGlkZXQtPnRvdGFsX3Bvc3RzdGF0W1RGRl0sCisgICAgICAgICAgIGlkZXQtPnRvdGFsX3Bvc3RzdGF0W0JGRl0sCisgICAgICAgICAgIGlkZXQtPnRvdGFsX3Bvc3RzdGF0W1BST0dSRVNTSVZFXSwKKyAgICAgICAgICAgaWRldC0+dG90YWxfcG9zdHN0YXRbVU5ERVRFUk1JTkVEXQorICAgICAgICApOworCisgICAgYXZfZnJhbWVfZnJlZSgmaWRldC0+cHJldik7CisgICAgYXZfZnJhbWVfZnJlZSgmaWRldC0+Y3VyICk7CisgICAgYXZfZnJhbWVfZnJlZSgmaWRldC0+bmV4dCk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE2LAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgb3V0bGluay0+ZmxhZ3MgfD0gRkZfTElOS19GTEFHX1JFUVVFU1RfTE9PUDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgSURFVENvbnRleHQgKmlkZXQgPSBjdHgtPnByaXY7CisKKyAgICBpZGV0LT5lb2YgPSAwOworICAgIGlkZXQtPmxhc3RfdHlwZSA9IFVOREVURVJNSU5FRDsKKyAgICBtZW1zZXQoaWRldC0+aGlzdG9yeSwgVU5ERVRFUk1JTkVELCBISVNUX1NJWkUpOworCisgICAgaWYoIGlkZXQtPmhhbGZfbGlmZSA+IDAgKQorICAgICAgICBpZGV0LT5kZWNheV9jb2VmZmljaWVudCA9ICh1aW50NjRfdCkgcm91bmQoIFBSRUNJU0lPTiAqIGV4cDIoLTEuMCAvIGlkZXQtPmhhbGZfbGlmZSkgKTsKKyAgICBlbHNlCisgICAgICAgIGlkZXQtPmRlY2F5X2NvZWZmaWNpZW50ID0gUFJFQ0lTSU9OOworCisgICAgaWRldC0+ZmlsdGVyX2xpbmUgPSBmZl9pZGV0X2ZpbHRlcl9saW5lX2M7CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2lkZXRfaW5pdF94ODYoaWRldCwgMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlkZXRfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpZGV0X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9pZGV0ID0geworICAgIC5uYW1lICAgICAgICAgID0gImlkZXQiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkludGVybGFjZSBkZXRlY3QgRmlsdGVyLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKElERVRDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gaWRldF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBpZGV0X291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmaWRldF9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfaWRldC5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2lkZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc1OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2lkZXQuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfSURFVF9ICisjZGVmaW5lIEFWRklMVEVSX0lERVRfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorCisjZGVmaW5lIEhJU1RfU0laRSA0CisKK3R5cGVkZWYgaW50ICgqZmZfaWRldF9maWx0ZXJfZnVuYykoY29uc3QgdWludDhfdCAqYSwgY29uc3QgdWludDhfdCAqYiwgY29uc3QgdWludDhfdCAqYywgaW50IHcpOworCit0eXBlZGVmIGVudW0geworICAgIFRGRiwKKyAgICBCRkYsCisgICAgUFJPR1JFU1NJVkUsCisgICAgVU5ERVRFUk1JTkVELAorfSBUeXBlOworCit0eXBlZGVmIGVudW0geworICAgIFJFUEVBVF9OT05FLAorICAgIFJFUEVBVF9UT1AsCisgICAgUkVQRUFUX0JPVFRPTSwKK30gUmVwZWF0ZWRGaWVsZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGZsb2F0IGludGVybGFjZV90aHJlc2hvbGQ7CisgICAgZmxvYXQgcHJvZ3Jlc3NpdmVfdGhyZXNob2xkOworICAgIGZsb2F0IHJlcGVhdF90aHJlc2hvbGQ7CisgICAgZmxvYXQgaGFsZl9saWZlOworICAgIHVpbnQ2NF90IGRlY2F5X2NvZWZmaWNpZW50OworCisgICAgVHlwZSBsYXN0X3R5cGU7CisKKyAgICB1aW50NjRfdCByZXBlYXRzWzNdOworICAgIHVpbnQ2NF90IHByZXN0YXRbNF07CisgICAgdWludDY0X3QgcG9zdHN0YXRbNF07CisgICAgdWludDY0X3QgdG90YWxfcmVwZWF0c1szXTsKKyAgICB1aW50NjRfdCB0b3RhbF9wcmVzdGF0WzRdOworICAgIHVpbnQ2NF90IHRvdGFsX3Bvc3RzdGF0WzRdOworCisgICAgdWludDhfdCBoaXN0b3J5W0hJU1RfU0laRV07CisKKyAgICBBVkZyYW1lICpjdXI7CisgICAgQVZGcmFtZSAqbmV4dDsKKyAgICBBVkZyYW1lICpwcmV2OworICAgIGZmX2lkZXRfZmlsdGVyX2Z1bmMgZmlsdGVyX2xpbmU7CisKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmNzcDsKKyAgICBpbnQgZW9mOworfSBJREVUQ29udGV4dDsKKwordm9pZCBmZl9pZGV0X2luaXRfeDg2KElERVRDb250ZXh0ICppZGV0LCBpbnQgZm9yXzE2Yik7CisKKy8qIG1haW4gZmFsbC1iYWNrIGZvciBsZWZ0LW92ZXIgKi8KK2ludCBmZl9pZGV0X2ZpbHRlcl9saW5lX2MoY29uc3QgdWludDhfdCAqYSwgY29uc3QgdWludDhfdCAqYiwgY29uc3QgdWludDhfdCAqYywgaW50IHcpOworaW50IGZmX2lkZXRfZmlsdGVyX2xpbmVfY18xNmJpdChjb25zdCB1aW50MTZfdCAqYSwgY29uc3QgdWludDE2X3QgKmIsIGNvbnN0IHVpbnQxNl90ICpjLCBpbnQgdyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2lsLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfaWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTlmZWExCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2lsLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogKGRlKWludGVybGVhdmUgZmllbGRzIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2VudW0gRmlsdGVyTW9kZSB7CisgICAgTU9ERV9OT05FLAorICAgIE1PREVfSU5URVJMRUFWRSwKKyAgICBNT0RFX0RFSU5URVJMRUFWRQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGVudW0gRmlsdGVyTW9kZSBsdW1hX21vZGUsIGNocm9tYV9tb2RlLCBhbHBoYV9tb2RlOworICAgIGludCBsdW1hX3N3YXAsIGNocm9tYV9zd2FwLCBhbHBoYV9zd2FwOworICAgIGludCBuYl9wbGFuZXM7CisgICAgaW50IGxpbmVzaXplWzRdLCBjaHJvbWFfaGVpZ2h0OworICAgIGludCBoYXNfYWxwaGE7Cit9IElsQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSWxDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGlsX29wdGlvbnNbXSA9IHsKKyAgICB7Imx1bWFfbW9kZSIsICAgInNlbGVjdCBsdW1hIG1vZGUiLCBPRkZTRVQobHVtYV9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1NT0RFX05PTkV9LCBNT0RFX05PTkUsIE1PREVfREVJTlRFUkxFQVZFLCBGTEFHUywgImx1bWFfbW9kZSJ9LAorICAgIHsibCIsICAgICAgICAgICAic2VsZWN0IGx1bWEgbW9kZSIsIE9GRlNFVChsdW1hX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PU1PREVfTk9ORX0sIE1PREVfTk9ORSwgTU9ERV9ERUlOVEVSTEVBVkUsIEZMQUdTLCAibHVtYV9tb2RlIn0sCisgICAgeyJub25lIiwgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9OT05FfSwgICAgICAgICAwLCAwLCBGTEFHUywgImx1bWFfbW9kZSJ9LAorICAgIHsiaW50ZXJsZWF2ZSIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU1PREVfSU5URVJMRUFWRX0sICAgMCwgMCwgRkxBR1MsICJsdW1hX21vZGUifSwKKyAgICB7ImkiLCAgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT0RFX0lOVEVSTEVBVkV9LCAgIDAsIDAsIEZMQUdTLCAibHVtYV9tb2RlIn0sCisgICAgeyJkZWludGVybGVhdmUiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9ERUlOVEVSTEVBVkV9LCAwLCAwLCBGTEFHUywgImx1bWFfbW9kZSJ9LAorICAgIHsiZCIsICAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU1PREVfREVJTlRFUkxFQVZFfSwgMCwgMCwgRkxBR1MsICJsdW1hX21vZGUifSwKKyAgICB7ImNocm9tYV9tb2RlIiwgInNlbGVjdCBjaHJvbWEgbW9kZSIsIE9GRlNFVChjaHJvbWFfbW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9TU9ERV9OT05FfSwgTU9ERV9OT05FLCBNT0RFX0RFSU5URVJMRUFWRSwgRkxBR1MsICJjaHJvbWFfbW9kZSJ9LAorICAgIHsiYyIsICAgICAgICAgICAic2VsZWN0IGNocm9tYSBtb2RlIiwgT0ZGU0VUKGNocm9tYV9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1NT0RFX05PTkV9LCBNT0RFX05PTkUsIE1PREVfREVJTlRFUkxFQVZFLCBGTEFHUywgImNocm9tYV9tb2RlIn0sCisgICAgeyJub25lIiwgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9OT05FfSwgICAgICAgICAwLCAwLCBGTEFHUywgImNocm9tYV9tb2RlIn0sCisgICAgeyJpbnRlcmxlYXZlIiwgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9JTlRFUkxFQVZFfSwgICAwLCAwLCBGTEFHUywgImNocm9tYV9tb2RlIn0sCisgICAgeyJpIiwgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9JTlRFUkxFQVZFfSwgICAwLCAwLCBGTEFHUywgImNocm9tYV9tb2RlIn0sCisgICAgeyJkZWludGVybGVhdmUiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9ERUlOVEVSTEVBVkV9LCAwLCAwLCBGTEFHUywgImNocm9tYV9tb2RlIn0sCisgICAgeyJkIiwgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9ERUlOVEVSTEVBVkV9LCAwLCAwLCBGTEFHUywgImNocm9tYV9tb2RlIn0sCisgICAgeyJhbHBoYV9tb2RlIiwgInNlbGVjdCBhbHBoYSBtb2RlIiwgT0ZGU0VUKGFscGhhX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PU1PREVfTk9ORX0sIE1PREVfTk9ORSwgTU9ERV9ERUlOVEVSTEVBVkUsIEZMQUdTLCAiYWxwaGFfbW9kZSJ9LAorICAgIHsiYSIsICAgICAgICAgICJzZWxlY3QgYWxwaGEgbW9kZSIsIE9GRlNFVChhbHBoYV9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1NT0RFX05PTkV9LCBNT0RFX05PTkUsIE1PREVfREVJTlRFUkxFQVZFLCBGTEFHUywgImFscGhhX21vZGUifSwKKyAgICB7Im5vbmUiLCAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT0RFX05PTkV9LCAgICAgICAgIDAsIDAsIEZMQUdTLCAiYWxwaGFfbW9kZSJ9LAorICAgIHsiaW50ZXJsZWF2ZSIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU1PREVfSU5URVJMRUFWRX0sICAgMCwgMCwgRkxBR1MsICJhbHBoYV9tb2RlIn0sCisgICAgeyJpIiwgICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9JTlRFUkxFQVZFfSwgICAwLCAwLCBGTEFHUywgImFscGhhX21vZGUifSwKKyAgICB7ImRlaW50ZXJsZWF2ZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT0RFX0RFSU5URVJMRUFWRX0sIDAsIDAsIEZMQUdTLCAiYWxwaGFfbW9kZSJ9LAorICAgIHsiZCIsICAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU1PREVfREVJTlRFUkxFQVZFfSwgMCwgMCwgRkxBR1MsICJhbHBoYV9tb2RlIn0sCisgICAgeyJsdW1hX3N3YXAiLCAgICJzd2FwIGx1bWEgZmllbGRzIiwgICBPRkZTRVQobHVtYV9zd2FwKSwgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHU30sCisgICAgeyJscyIsICAgICAgICAgICJzd2FwIGx1bWEgZmllbGRzIiwgICBPRkZTRVQobHVtYV9zd2FwKSwgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHU30sCisgICAgeyJjaHJvbWFfc3dhcCIsICJzd2FwIGNocm9tYSBmaWVsZHMiLCBPRkZTRVQoY2hyb21hX3N3YXApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHU30sCisgICAgeyJjcyIsICAgICAgICAgICJzd2FwIGNocm9tYSBmaWVsZHMiLCBPRkZTRVQoY2hyb21hX3N3YXApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHU30sCisgICAgeyJhbHBoYV9zd2FwIiwgICJzd2FwIGFscGhhIGZpZWxkcyIsICBPRkZTRVQoYWxwaGFfc3dhcCksICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHU30sCisgICAgeyJhcyIsICAgICAgICAgICJzd2FwIGFscGhhIGZpZWxkcyIsICBPRkZTRVQoYWxwaGFfc3dhcCksICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHU30sCisgICAge05VTEx9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoaWwpOworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gTlVMTDsKKyAgICBpbnQgZm10OworCisgICAgZm9yIChmbXQgPSAwOyBhdl9waXhfZm10X2Rlc2NfZ2V0KGZtdCk7IGZtdCsrKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZm10KTsKKyAgICAgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMKSAmJiAhKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpKQorICAgICAgICAgICAgZmZfYWRkX2Zvcm1hdCgmZm9ybWF0cywgZm10KTsKKyAgICB9CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgSWxDb250ZXh0ICppbCA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCByZXQ7CisKKyAgICBpbC0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgaWwtPmhhc19hbHBoYSA9ICEhKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBKTsKKyAgICBpZiAoKHJldCA9IGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKGlsLT5saW5lc2l6ZSwgaW5saW5rLT5mb3JtYXQsIGlubGluay0+dykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlsLT5jaHJvbWFfaGVpZ2h0ID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbnRlcmxlYXZlKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfbGluZXNpemUsIGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGVudW0gRmlsdGVyTW9kZSBtb2RlLCBpbnQgc3dhcCkKK3sKKyAgICBjb25zdCBpbnQgYSA9IHN3YXA7CisgICAgY29uc3QgaW50IGIgPSAxIC0gYTsKKyAgICBjb25zdCBpbnQgbSA9IGggPj4gMTsKKyAgICBpbnQgeTsKKworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgTU9ERV9ERUlOVEVSTEVBVkU6CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBtOyB5KyspIHsKKyAgICAgICAgICAgIG1lbWNweShkc3QgKyBkc3RfbGluZXNpemUgKiAgeSAgICAgLCBzcmMgKyBzcmNfbGluZXNpemUgKiAoeSAqIDIgKyBhKSwgdyk7CisgICAgICAgICAgICBtZW1jcHkoZHN0ICsgZHN0X2xpbmVzaXplICogKHkgKyBtKSwgc3JjICsgc3JjX2xpbmVzaXplICogKHkgKiAyICsgYiksIHcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9OT05FOgorICAgICAgICBmb3IgKHkgPSAwOyB5IDwgbTsgeSsrKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0ICsgZHN0X2xpbmVzaXplICogIHkgKiAyICAgICAsIHNyYyArIHNyY19saW5lc2l6ZSAqICh5ICogMiArIGEpLCB3KTsKKyAgICAgICAgICAgIG1lbWNweShkc3QgKyBkc3RfbGluZXNpemUgKiAoeSAqIDIgKyAxKSwgc3JjICsgc3JjX2xpbmVzaXplICogKHkgKiAyICsgYiksIHcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9JTlRFUkxFQVZFOgorICAgICAgICBmb3IgKHkgPSAwOyB5IDwgbTsgeSsrKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0ICsgZHN0X2xpbmVzaXplICogKHkgKiAyICsgYSksIHNyYyArIHNyY19saW5lc2l6ZSAqICB5ICAgICAsIHcpOworICAgICAgICAgICAgbWVtY3B5KGRzdCArIGRzdF9saW5lc2l6ZSAqICh5ICogMiArIGIpLCBzcmMgKyBzcmNfbGluZXNpemUgKiAoeSArIG0pLCB3KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnBpY3JlZikKK3sKKyAgICBJbENvbnRleHQgKmlsID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gaW5saW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludCBjb21wOworCisgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnBpY3JlZik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbnBpY3JlZik7CisKKyAgICBpbnRlcmxlYXZlKG91dC0+ZGF0YVswXSwgaW5waWNyZWYtPmRhdGFbMF0sCisgICAgICAgICAgICAgICBpbC0+bGluZXNpemVbMF0sIGlubGluay0+aCwKKyAgICAgICAgICAgICAgIG91dC0+bGluZXNpemVbMF0sIGlucGljcmVmLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgIGlsLT5sdW1hX21vZGUsIGlsLT5sdW1hX3N3YXApOworCisgICAgZm9yIChjb21wID0gMTsgY29tcCA8IChpbC0+bmJfcGxhbmVzIC0gaWwtPmhhc19hbHBoYSk7IGNvbXArKykgeworICAgICAgICBpbnRlcmxlYXZlKG91dC0+ZGF0YVtjb21wXSwgaW5waWNyZWYtPmRhdGFbY29tcF0sCisgICAgICAgICAgICAgICAgICAgaWwtPmxpbmVzaXplW2NvbXBdLCBpbC0+Y2hyb21hX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICBvdXQtPmxpbmVzaXplW2NvbXBdLCBpbnBpY3JlZi0+bGluZXNpemVbY29tcF0sCisgICAgICAgICAgICAgICAgICAgaWwtPmNocm9tYV9tb2RlLCBpbC0+Y2hyb21hX3N3YXApOworICAgIH0KKworICAgIGlmIChpbC0+aGFzX2FscGhhKSB7CisgICAgICAgIGNvbXAgPSBpbC0+bmJfcGxhbmVzIC0gMTsKKyAgICAgICAgaW50ZXJsZWF2ZShvdXQtPmRhdGFbY29tcF0sIGlucGljcmVmLT5kYXRhW2NvbXBdLAorICAgICAgICAgICAgICAgICAgIGlsLT5saW5lc2l6ZVtjb21wXSwgaW5saW5rLT5oLAorICAgICAgICAgICAgICAgICAgIG91dC0+bGluZXNpemVbY29tcF0sIGlucGljcmVmLT5saW5lc2l6ZVtjb21wXSwKKyAgICAgICAgICAgICAgICAgICBpbC0+YWxwaGFfbW9kZSwgaWwtPmFscGhhX3N3YXApOworICAgIH0KKworICAgIGF2X2ZyYW1lX2ZyZWUoJmlucGljcmVmKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9pbCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJpbCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGVpbnRlcmxlYXZlIG9yIGludGVybGVhdmUgZmllbGRzLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKElsQ29udGV4dCksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZpbF9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9pbnRlcmxhY2UuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9pbnRlcmxhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODI4ZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2ludGVybGFjZS5jCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgWnVjY2hpIDxub3R6ZWRAeGltaWFuLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBCYXB0aXN0ZSBDb3VkdXJpZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTdGVmYW5vIFNhYmF0aW5pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgVml0dG9yaW8gR2lvdmFyYSA8dml0dG9yaW8uZ2lvdmFyYUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogcHJvZ3Jlc3NpdmUgdG8gaW50ZXJsYWNlZCBjb250ZW50IGZpbHRlciwgaW5zcGlyZWQgYnkgaGVhdnkgZGVidWdnaW5nIG9mIHRpbnRlcmxhY2UgZmlsdGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcmxhY2UuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEludGVybGFjZUNvbnRleHQsIHgpCisjZGVmaW5lIFYgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBpbnRlcmxhY2Vfb3B0aW9uc1tdID0geworICAgIHsgInNjYW4iLCAic2Nhbm5pbmcgbW9kZSIsIE9GRlNFVChzY2FuKSwKKyAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0ID0gTU9ERV9URkYgfSwgMCwgMSwgLmZsYWdzID0gViwgLnVuaXQgPSAic2NhbiIgfSwKKyAgICB7ICJ0ZmYiLCAidG9wIGZpZWxkIGZpcnN0IiwgMCwKKyAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTU9ERV9URkYgfSwgSU5UX01JTiwgSU5UX01BWCwgLmZsYWdzID0gViwgLnVuaXQgPSAic2NhbiIgfSwKKyAgICB7ICJiZmYiLCAiYm90dG9tIGZpZWxkIGZpcnN0IiwgMCwKKyAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTU9ERV9CRkYgfSwgSU5UX01JTiwgSU5UX01BWCwgLmZsYWdzID0gViwgLnVuaXQgPSAic2NhbiIgfSwKKyAgICB7ICJsb3dwYXNzIiwgImVuYWJsZSB2ZXJ0aWNhbCBsb3ctcGFzcyBmaWx0ZXIiLCBPRkZTRVQobG93cGFzcyksCisgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2NCA9IDEgfSwgICAgICAgIDAsIDEsIC5mbGFncyA9IFYgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGludGVybGFjZSk7CisKK3N0YXRpYyB2b2lkIGxvd3Bhc3NfbGluZV9jKHVpbnQ4X3QgKmRzdHAsIHB0cmRpZmZfdCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwX2Fib3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9iZWxvdykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXNpemU7IGkrKykgeworICAgICAgICAvLyB0aGlzIGNhbGN1bGF0aW9uIGlzIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YKKyAgICAgICAgLy8gJzAuNSAqIGN1cnJlbnQgKyAwLjI1ICogYWJvdmUgKyAwLjI1ICogYmVsb3cnCisgICAgICAgIC8vICcxICsnIGlzIGZvciByb3VuZGluZy4KKyAgICAgICAgZHN0cFtpXSA9ICgxICsgc3JjcFtpXSArIHNyY3BbaV0gKyBzcmNwX2Fib3ZlW2ldICsgc3JjcF9iZWxvd1tpXSkgPj4gMjsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgZm9ybWF0c19zdXBwb3J0ZWRbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAsICBBVl9QSVhfRk1UX1lVVjQyMlAsICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCAgQVZfUElYX0ZNVF9ZVVY0MTBQLCAgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICBBVl9QSVhfRk1UX0dSQVk4LCAgICBBVl9QSVhfRk1UX1lVVko0MjBQLCBBVl9QSVhfRk1UX1lVVko0MjJQLAorICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsIEFWX1BJWF9GTVRfTk9ORQorfTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QoZm9ybWF0c19zdXBwb3J0ZWQpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgSW50ZXJsYWNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmN1cik7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+bmV4dCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dF9wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBvdXRsaW5rLT5zcmMtPmlucHV0c1swXTsKKyAgICBJbnRlcmxhY2VDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKGlubGluay0+aCA8IDIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW5wdXQgdmlkZW8gaGVpZ2h0IGlzIHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICghcy0+bG93cGFzcykKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICIqKip3YXJuaW5nKioqIExvd3Bhc3MgZmlsdGVyIGlzIGRpc2FibGVkLCAiCisgICAgICAgICAgICAgICAidGhlIHJlc3VsdGluZyB2aWRlbyB3aWxsIGJlIGFsaWFzZWQgcmF0aGVyIHRoYW4gaW50ZXJsYWNlZC5cbiIpOworCisgICAgLy8gc2FtZSBpbnB1dCBzaXplCisgICAgb3V0bGluay0+dyA9IGlubGluay0+dzsKKyAgICBvdXRsaW5rLT5oID0gaW5saW5rLT5oOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IGlubGluay0+dGltZV9iYXNlOworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBpbmxpbmstPmZyYW1lX3JhdGU7CisgICAgLy8gaGFsZiBmcmFtZXJhdGUKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UubnVtICo9IDI7CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZS5kZW4gKj0gMjsKKyAgICBvdXRsaW5rLT5mbGFncyB8PSBGRl9MSU5LX0ZMQUdfUkVRVUVTVF9MT09QOworCisKKyAgICBpZiAocy0+bG93cGFzcykgeworICAgICAgICBzLT5sb3dwYXNzX2xpbmUgPSBsb3dwYXNzX2xpbmVfYzsKKyAgICAgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICAgICAgZmZfaW50ZXJsYWNlX2luaXRfeDg2KHMpOworICAgIH0KKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiJXMgaW50ZXJsYWNpbmcgJXMgbG93cGFzcyBmaWx0ZXJcbiIsCisgICAgICAgICAgIHMtPnNjYW4gPT0gTU9ERV9URkYgPyAidGZmIiA6ICJiZmYiLCAocy0+bG93cGFzcykgPyAid2l0aCIgOiAid2l0aG91dCIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfcGljdHVyZV9maWVsZChJbnRlcmxhY2VDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKnNyY19mcmFtZSwgQVZGcmFtZSAqZHN0X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyTGluayAqaW5saW5rLCBlbnVtIEZpZWxkVHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dwYXNzKQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCB2c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICBpbnQgcGxhbmUsIGo7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBkZXNjLT5uYl9jb21wb25lbnRzOyBwbGFuZSsrKSB7CisgICAgICAgIGludCBsaW5lcyA9IChwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIpID8gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCB2c3ViKSA6IGlubGluay0+aDsKKyAgICAgICAgcHRyZGlmZl90IGxpbmVzaXplID0gYXZfaW1hZ2VfZ2V0X2xpbmVzaXplKGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncsIHBsYW5lKTsKKyAgICAgICAgdWludDhfdCAqZHN0cCA9IGRzdF9mcmFtZS0+ZGF0YVtwbGFuZV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3AgPSBzcmNfZnJhbWUtPmRhdGFbcGxhbmVdOworCisgICAgICAgIGF2X2Fzc2VydDAobGluZXNpemUgPj0gMCk7CisKKyAgICAgICAgbGluZXMgPSAobGluZXMgKyAoZmllbGRfdHlwZSA9PSBGSUVMRF9VUFBFUikpIC8gMjsKKyAgICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gRklFTERfTE9XRVIpCisgICAgICAgICAgICBzcmNwICs9IHNyY19mcmFtZS0+bGluZXNpemVbcGxhbmVdOworICAgICAgICBpZiAoZmllbGRfdHlwZSA9PSBGSUVMRF9MT1dFUikKKyAgICAgICAgICAgIGRzdHAgKz0gZHN0X2ZyYW1lLT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIGlmIChsb3dwYXNzKSB7CisgICAgICAgICAgICBpbnQgc3JjcF9saW5lc2l6ZSA9IHNyY19mcmFtZS0+bGluZXNpemVbcGxhbmVdICogMjsKKyAgICAgICAgICAgIGludCBkc3RwX2xpbmVzaXplID0gZHN0X2ZyYW1lLT5saW5lc2l6ZVtwbGFuZV0gKiAyOworICAgICAgICAgICAgZm9yIChqID0gbGluZXM7IGogPiAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwX2Fib3ZlID0gc3JjcCAtIHNyY19mcmFtZS0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYmVsb3cgPSBzcmNwICsgc3JjX2ZyYW1lLT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgICAgICAgICAgaWYgKGogPT0gbGluZXMpCisgICAgICAgICAgICAgICAgICAgIHNyY3BfYWJvdmUgPSBzcmNwOyAvLyB0aGVyZSBpcyBubyBsaW5lIGFib3ZlCisgICAgICAgICAgICAgICAgaWYgKGogPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgc3JjcF9iZWxvdyA9IHNyY3A7IC8vIHRoZXJlIGlzIG5vIGxpbmUgYmVsb3cKKyAgICAgICAgICAgICAgICBzLT5sb3dwYXNzX2xpbmUoZHN0cCwgbGluZXNpemUsIHNyY3AsIHNyY3BfYWJvdmUsIHNyY3BfYmVsb3cpOworICAgICAgICAgICAgICAgIGRzdHAgKz0gZHN0cF9saW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBzcmNwICs9IHNyY3BfbGluZXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGRzdHAsIGRzdF9mcmFtZS0+bGluZXNpemVbcGxhbmVdICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjcCwgc3JjX2ZyYW1lLT5saW5lc2l6ZVtwbGFuZV0gKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwgbGluZXMpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqYnVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEludGVybGFjZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludCB0ZmYsIHJldDsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmN1cik7CisgICAgcy0+Y3VyICA9IHMtPm5leHQ7CisgICAgcy0+bmV4dCA9IGJ1ZjsKKworICAgIC8qIHdlIG5lZWQgYXQgbGVhc3QgdHdvIGZyYW1lcyAqLworICAgIGlmICghcy0+Y3VyIHx8ICFzLT5uZXh0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzLT5jdXItPmludGVybGFjZWRfZnJhbWUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAidmlkZW8gaXMgYWxyZWFkeSBpbnRlcmxhY2VkLCBhZGp1c3RpbmcgZnJhbWVyYXRlIG9ubHlcbiIpOworICAgICAgICBvdXQgPSBhdl9mcmFtZV9jbG9uZShzLT5jdXIpOworICAgICAgICBpZiAoIW91dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG91dC0+cHRzIC89IDI7ICAvLyBhZGp1c3QgcHRzIHRvIG5ldyBmcmFtZXJhdGUKKyAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgdGZmID0gKHMtPnNjYW4gPT0gTU9ERV9URkYpOworICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgcy0+Y3VyKTsKKyAgICBvdXQtPmludGVybGFjZWRfZnJhbWUgPSAxOworICAgIG91dC0+dG9wX2ZpZWxkX2ZpcnN0ICA9IHRmZjsKKyAgICBvdXQtPnB0cyAgICAgICAgICAgICAvPSAyOyAgLy8gYWRqdXN0IHB0cyB0byBuZXcgZnJhbWVyYXRlCisKKyAgICAvKiBjb3B5IHVwcGVyL2xvd2VyIGZpZWxkIGZyb20gY3VyICovCisgICAgY29weV9waWN0dXJlX2ZpZWxkKHMsIHMtPmN1ciwgb3V0LCBpbmxpbmssIHRmZiA/IEZJRUxEX1VQUEVSIDogRklFTERfTE9XRVIsIHMtPmxvd3Bhc3MpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmN1cik7CisKKyAgICAvKiBjb3B5IGxvd2VyL3VwcGVyIGZpZWxkIGZyb20gbmV4dCAqLworICAgIGNvcHlfcGljdHVyZV9maWVsZChzLCBzLT5uZXh0LCBvdXQsIGlubGluaywgdGZmID8gRklFTERfTE9XRVIgOiBGSUVMRF9VUFBFUiwgcy0+bG93cGFzcyk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+bmV4dCk7CisKKyAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0X3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2ludGVybGFjZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJpbnRlcmxhY2UiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvbnZlcnQgcHJvZ3Jlc3NpdmUgdmlkZW8gaW50byBpbnRlcmxhY2VkLiIpLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5wcml2X2NsYXNzICAgID0gJmludGVybGFjZV9jbGFzcywKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihJbnRlcmxhY2VDb250ZXh0KSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBpbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBvdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9rZXJuZGVpbnQuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9rZXJuZGVpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTMwMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2tlcm5kZWludC5jCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEplcmVteSBUcmFuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9iaWFzIERpZWRyaWNoCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRG9uYWxkIEEuIEdyYWZ0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogS2VybmVsIERlaW50ZXJsYWNlcgorICogUG9ydGVkIGZyb20gTVBsYXllciBsaWJtcGNvZGVjcy92Zl9rZXJuZGVpbnQuYy4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCAgICAgICAgICAgZnJhbWU7IC8vLzwgZnJhbWUgY291bnQsIHN0YXJ0aW5nIGZyb20gMAorICAgIGludCAgICAgICAgICAgdGhyZXNoLCBtYXAsIG9yZGVyLCBzaGFycCwgdHdvd2F5OworICAgIGludCAgICAgICAgICAgdnN1YjsKKyAgICBpbnQgICAgICAgICAgIGlzX3BhY2tlZF9yZ2I7CisgICAgdWludDhfdCAgICAgICAqdG1wX2RhdGEgICAgWzRdOyAgLy8vPCB0ZW1wb3JhcnkgcGxhbmUgZGF0YSBidWZmZXIKKyAgICBpbnQgICAgICAgICAgICB0bXBfbGluZXNpemVbNF07ICAvLy88IHRlbXBvcmFyeSBwbGFuZSBieXRlIGxpbmVzaXplCisgICAgaW50ICAgICAgICAgICAgdG1wX2J3aWR0aCAgWzRdOyAgLy8vPCB0ZW1wb3JhcnkgcGxhbmUgYnl0ZSB3aWR0aAorfSBLZXJuZGVpbnRDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihLZXJuZGVpbnRDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBrZXJuZGVpbnRfb3B0aW9uc1tdID0geworICAgIHsgInRocmVzaCIsICJzZXQgdGhlIHRocmVzaG9sZCIsIE9GRlNFVCh0aHJlc2gpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTEwfSwgMCwgMjU1LCBGTEFHUyB9LAorICAgIHsgIm1hcCIsICAgICJzZXQgdGhlIG1hcCIsIE9GRlNFVChtYXApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgIm9yZGVyIiwgICJzZXQgdGhlIG9yZGVyIiwgT0ZGU0VUKG9yZGVyKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJzaGFycCIsICAiZW5hYmxlIHNoYXJwZW5pbmciLCBPRkZTRVQoc2hhcnApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInR3b3dheSIsICJlbmFibGUgdHdvd2F5IiwgT0ZGU0VUKHR3b3dheSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhrZXJuZGVpbnQpOworCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBLZXJuZGVpbnRDb250ZXh0ICprZXJuZGVpbnQgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmVlKGtlcm5kZWludC0+dG1wX2RhdGFbMF0pOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVWVY0MjIsCisgICAgICAgIEFWX1BJWF9GTVRfQVJHQiwgQVZfUElYX0ZNVF8wUkdCLAorICAgICAgICBBVl9QSVhfRk1UX0FCR1IsIEFWX1BJWF9GTVRfMEJHUiwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0JBLCBBVl9QSVhfRk1UX1JHQjAsCisgICAgICAgIEFWX1BJWF9GTVRfQkdSQSwgQVZfUElYX0ZNVF9CR1IwLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEtlcm5kZWludENvbnRleHQgKmtlcm5kZWludCA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCByZXQ7CisKKyAgICBrZXJuZGVpbnQtPmlzX3BhY2tlZF9yZ2IgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KS0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUkdCOworICAgIGtlcm5kZWludC0+dnN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisKKyAgICByZXQgPSBhdl9pbWFnZV9hbGxvYyhrZXJuZGVpbnQtPnRtcF9kYXRhLCBrZXJuZGVpbnQtPnRtcF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCwgaW5saW5rLT5mb3JtYXQsIDE2KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBtZW1zZXQoa2VybmRlaW50LT50bXBfZGF0YVswXSwgMCwgcmV0KTsKKworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMoa2VybmRlaW50LT50bXBfYndpZHRoLCBpbmxpbmstPmZvcm1hdCwgaW5saW5rLT53KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnBpYykKK3sKKyAgICBLZXJuZGVpbnRDb250ZXh0ICprZXJuZGVpbnQgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXRwaWM7CisgICAgY29uc3QgdWludDhfdCAqcHJ2cDsgICAvLy88IFByZXZpb3VzIGZpZWxkJ3MgcGl4ZWwgbGluZSBudW1iZXIgbgorICAgIGNvbnN0IHVpbnQ4X3QgKnBydnBwOyAgLy8vPCBQcmV2aW91cyBmaWVsZCdzIHBpeGVsIGxpbmUgbnVtYmVyIChuIC0gMSkKKyAgICBjb25zdCB1aW50OF90ICpwcnZwbjsgIC8vLzwgUHJldmlvdXMgZmllbGQncyBwaXhlbCBsaW5lIG51bWJlciAobiArIDEpCisgICAgY29uc3QgdWludDhfdCAqcHJ2cHBwOyAvLy88IFByZXZpb3VzIGZpZWxkJ3MgcGl4ZWwgbGluZSBudW1iZXIgKG4gLSAyKQorICAgIGNvbnN0IHVpbnQ4X3QgKnBydnBubjsgLy8vPCBQcmV2aW91cyBmaWVsZCdzIHBpeGVsIGxpbmUgbnVtYmVyIChuICsgMikKKyAgICBjb25zdCB1aW50OF90ICpwcnZwNHA7IC8vLzwgUHJldmlvdXMgZmllbGQncyBwaXhlbCBsaW5lIG51bWJlciAobiAtIDQpCisgICAgY29uc3QgdWludDhfdCAqcHJ2cDRuOyAvLy88IFByZXZpb3VzIGZpZWxkJ3MgcGl4ZWwgbGluZSBudW1iZXIgKG4gKyA0KQorCisgICAgY29uc3QgdWludDhfdCAqc3JjcDsgICAvLy88IEN1cnJlbnQgZmllbGQncyBwaXhlbCBsaW5lIG51bWJlciBuCisgICAgY29uc3QgdWludDhfdCAqc3JjcHA7ICAvLy88IEN1cnJlbnQgZmllbGQncyBwaXhlbCBsaW5lIG51bWJlciAobiAtIDEpCisgICAgY29uc3QgdWludDhfdCAqc3JjcG47ICAvLy88IEN1cnJlbnQgZmllbGQncyBwaXhlbCBsaW5lIG51bWJlciAobiArIDEpCisgICAgY29uc3QgdWludDhfdCAqc3JjcHBwOyAvLy88IEN1cnJlbnQgZmllbGQncyBwaXhlbCBsaW5lIG51bWJlciAobiAtIDIpCisgICAgY29uc3QgdWludDhfdCAqc3JjcG5uOyAvLy88IEN1cnJlbnQgZmllbGQncyBwaXhlbCBsaW5lIG51bWJlciAobiArIDIpCisgICAgY29uc3QgdWludDhfdCAqc3JjcDNwOyAvLy88IEN1cnJlbnQgZmllbGQncyBwaXhlbCBsaW5lIG51bWJlciAobiAtIDMpCisgICAgY29uc3QgdWludDhfdCAqc3JjcDNuOyAvLy88IEN1cnJlbnQgZmllbGQncyBwaXhlbCBsaW5lIG51bWJlciAobiArIDMpCisgICAgY29uc3QgdWludDhfdCAqc3JjcDRwOyAvLy88IEN1cnJlbnQgZmllbGQncyBwaXhlbCBsaW5lIG51bWJlciAobiAtIDQpCisgICAgY29uc3QgdWludDhfdCAqc3JjcDRuOyAvLy88IEN1cnJlbnQgZmllbGQncyBwaXhlbCBsaW5lIG51bWJlciAobiArIDQpCisKKyAgICB1aW50OF90ICpkc3RwLCAqZHN0cF9zYXZlZDsKKyAgICBjb25zdCB1aW50OF90ICpzcmNwX3NhdmVkOworCisgICAgaW50IHNyY19saW5lc2l6ZSwgcHNyY19saW5lc2l6ZSwgZHN0X2xpbmVzaXplLCBid2lkdGg7CisgICAgaW50IHgsIHksIHBsYW5lLCB2YWwsIGhpLCBsbywgZywgaCwgbiA9IGtlcm5kZWludC0+ZnJhbWUrKzsKKyAgICBkb3VibGUgdmFsZjsKKworICAgIGNvbnN0IGludCB0aHJlc2ggPSBrZXJuZGVpbnQtPnRocmVzaDsKKyAgICBjb25zdCBpbnQgb3JkZXIgID0ga2VybmRlaW50LT5vcmRlcjsKKyAgICBjb25zdCBpbnQgbWFwICAgID0ga2VybmRlaW50LT5tYXA7CisgICAgY29uc3QgaW50IHNoYXJwICA9IGtlcm5kZWludC0+c2hhcnA7CisgICAgY29uc3QgaW50IHR3b3dheSA9IGtlcm5kZWludC0+dHdvd2F5OworCisgICAgY29uc3QgaW50IGlzX3BhY2tlZF9yZ2IgPSBrZXJuZGVpbnQtPmlzX3BhY2tlZF9yZ2I7CisKKyAgICBvdXRwaWMgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0cGljKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlucGljKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXRwaWMsIGlucGljKTsKKyAgICBvdXRwaWMtPmludGVybGFjZWRfZnJhbWUgPSAwOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgNCAmJiBpbnBpYy0+ZGF0YVtwbGFuZV0gJiYgaW5waWMtPmxpbmVzaXplW3BsYW5lXTsgcGxhbmUrKykgeworICAgICAgICBoID0gcGxhbmUgPT0gMCA/IGlubGluay0+aCA6IEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwga2VybmRlaW50LT52c3ViKTsKKyAgICAgICAgYndpZHRoID0ga2VybmRlaW50LT50bXBfYndpZHRoW3BsYW5lXTsKKworICAgICAgICBzcmNwX3NhdmVkICAgICAgICA9IGlucGljLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgc3JjX2xpbmVzaXplICAgICAgPSBpbnBpYy0+bGluZXNpemVbcGxhbmVdOworICAgICAgICBwc3JjX2xpbmVzaXplICAgICA9IGtlcm5kZWludC0+dG1wX2xpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgZHN0cF9zYXZlZCAgICAgICAgPSBvdXRwaWMtPmRhdGFbcGxhbmVdOworICAgICAgICBkc3RfbGluZXNpemUgICAgICA9IG91dHBpYy0+bGluZXNpemVbcGxhbmVdOworICAgICAgICBzcmNwICAgICAgICAgICAgICA9IHNyY3Bfc2F2ZWQgKyAoMSAtIG9yZGVyKSAqIHNyY19saW5lc2l6ZTsKKyAgICAgICAgZHN0cCAgICAgICAgICAgICAgPSBkc3RwX3NhdmVkICsgKDEgLSBvcmRlcikgKiBkc3RfbGluZXNpemU7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkgKz0gMikgeworICAgICAgICAgICAgbWVtY3B5KGRzdHAsIHNyY3AsIGJ3aWR0aCk7CisgICAgICAgICAgICBzcmNwICs9IDIgKiBzcmNfbGluZXNpemU7CisgICAgICAgICAgICBkc3RwICs9IDIgKiBkc3RfbGluZXNpemU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5IHRocm91Z2ggdGhlIGxpbmVzIHRoYXQgd2lsbCBiZSBtaXNzZWQgYmVsb3cuCisgICAgICAgIG1lbWNweShkc3RwX3NhdmVkICsgb3JkZXIgICAgICAgICAgICAqIGRzdF9saW5lc2l6ZSwgc3JjcF9zYXZlZCArICgxIC0gICAgIG9yZGVyKSAqIHNyY19saW5lc2l6ZSwgYndpZHRoKTsKKyAgICAgICAgbWVtY3B5KGRzdHBfc2F2ZWQgKyAoMiArIG9yZGVyICAgICkgICogZHN0X2xpbmVzaXplLCBzcmNwX3NhdmVkICsgKDMgLSAgICAgb3JkZXIpICogc3JjX2xpbmVzaXplLCBid2lkdGgpOworICAgICAgICBtZW1jcHkoZHN0cF9zYXZlZCArIChoIC0gMiArIG9yZGVyKSAgKiBkc3RfbGluZXNpemUsIHNyY3Bfc2F2ZWQgKyAoaCAtIDEgLSBvcmRlcikgKiBzcmNfbGluZXNpemUsIGJ3aWR0aCk7CisgICAgICAgIG1lbWNweShkc3RwX3NhdmVkICsgKGggLSA0ICsgb3JkZXIpICAqIGRzdF9saW5lc2l6ZSwgc3JjcF9zYXZlZCArIChoIC0gMyAtIG9yZGVyKSAqIHNyY19saW5lc2l6ZSwgYndpZHRoKTsKKworICAgICAgICAvKiBGb3IgdGhlIG90aGVyIGZpZWxkIGNob29zZSBhZGFwdGl2ZWx5IGJldHdlZW4gdXNpbmcgdGhlIHByZXZpb3VzIGZpZWxkCisgICAgICAgICAgIG9yIHRoZSBpbnRlcnBvbGFudCBmcm9tIHRoZSBjdXJyZW50IGZpZWxkLiAqLworICAgICAgICBwcnZwICAgPSBrZXJuZGVpbnQtPnRtcF9kYXRhW3BsYW5lXSArIDUgKiBwc3JjX2xpbmVzaXplIC0gKDEgLSBvcmRlcikgKiBwc3JjX2xpbmVzaXplOworICAgICAgICBwcnZwcCAgPSBwcnZwIC0gcHNyY19saW5lc2l6ZTsKKyAgICAgICAgcHJ2cHBwID0gcHJ2cCAtIDIgKiBwc3JjX2xpbmVzaXplOworICAgICAgICBwcnZwNHAgPSBwcnZwIC0gNCAqIHBzcmNfbGluZXNpemU7CisgICAgICAgIHBydnBuICA9IHBydnAgKyBwc3JjX2xpbmVzaXplOworICAgICAgICBwcnZwbm4gPSBwcnZwICsgMiAqIHBzcmNfbGluZXNpemU7CisgICAgICAgIHBydnA0biA9IHBydnAgKyA0ICogcHNyY19saW5lc2l6ZTsKKworICAgICAgICBzcmNwICAgPSBzcmNwX3NhdmVkICsgNSAqIHNyY19saW5lc2l6ZSAtICgxIC0gb3JkZXIpICogc3JjX2xpbmVzaXplOworICAgICAgICBzcmNwcCAgPSBzcmNwIC0gc3JjX2xpbmVzaXplOworICAgICAgICBzcmNwcHAgPSBzcmNwIC0gMiAqIHNyY19saW5lc2l6ZTsKKyAgICAgICAgc3JjcDNwID0gc3JjcCAtIDMgKiBzcmNfbGluZXNpemU7CisgICAgICAgIHNyY3A0cCA9IHNyY3AgLSA0ICogc3JjX2xpbmVzaXplOworCisgICAgICAgIHNyY3BuICA9IHNyY3AgKyBzcmNfbGluZXNpemU7CisgICAgICAgIHNyY3BubiA9IHNyY3AgKyAyICogc3JjX2xpbmVzaXplOworICAgICAgICBzcmNwM24gPSBzcmNwICsgMyAqIHNyY19saW5lc2l6ZTsKKyAgICAgICAgc3JjcDRuID0gc3JjcCArIDQgKiBzcmNfbGluZXNpemU7CisKKyAgICAgICAgZHN0cCAgID0gZHN0cF9zYXZlZCArIDUgKiBkc3RfbGluZXNpemUgLSAoMSAtIG9yZGVyKSAqIGRzdF9saW5lc2l6ZTsKKworICAgICAgICBmb3IgKHkgPSA1IC0gKDEgLSBvcmRlcik7IHkgPD0gaCAtIDUgLSAoMSAtIG9yZGVyKTsgeSArPSAyKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpZiAodGhyZXNoID09IDAgfHwgbiA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIChhYnMoKGludClwcnZwW3hdICAtIChpbnQpc3JjcFt4XSkgID4gdGhyZXNoKSB8fAorICAgICAgICAgICAgICAgICAgICAoYWJzKChpbnQpcHJ2cHBbeF0gLSAoaW50KXNyY3BwW3hdKSA+IHRocmVzaCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGFicygoaW50KXBydnBuW3hdIC0gKGludClzcmNwblt4XSkgPiB0aHJlc2gpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGcgPSB4ICYgfjM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19wYWNrZWRfcmdiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfV0IzMihkc3RwICsgZywgMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGcgKyAzOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmxpbmstPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVWVY0MjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB5IDwtIDIzNSwgdSA8LSAxMjgsIHkgPC0gMjM1LCB2IDwtIDEyOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dCMzIoZHN0cCArIGcsIDB4ZWI4MGViODApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBnICsgMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0cFt4XSA9IHBsYW5lID09IDAgPyAyMzUgOiAxMjg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfcGFja2VkX3JnYikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpID0gMjU1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5saW5rLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVlWNDIyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGkgPSB4ICYgMSA/IDI0MCA6IDIzNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbyA9IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaSA9IHBsYW5lID09IDAgPyAyMzUgOiAyNDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG8gPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXJwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR3b3dheSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxmID0gKyAwLjUyNiAqICgoaW50KXNyY3BwW3hdICsgKGludClzcmNwblt4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4xNzAgKiAoKGludClzcmNwW3hdICsgKGludClwcnZwW3hdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwLjExNiAqICgoaW50KXNyY3BwcFt4XSArIChpbnQpc3JjcG5uW3hdICsgKGludClwcnZwcHBbeF0gKyAoaW50KXBydnBublt4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMC4wMjYgKiAoKGludClzcmNwM3BbeF0gKyAoaW50KXNyY3Azblt4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4wMzEgKiAoKGludClzcmNwNHBbeF0gKyAoaW50KXNyY3A0blt4XSArIChpbnQpcHJ2cDRwW3hdICsgKGludClwcnZwNG5beF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGYgPSArIDAuNTI2ICogKChpbnQpc3JjcHBbeF0gKyAoaW50KXNyY3BuW3hdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjE3MCAqICgoaW50KXBydnBbeF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAuMTE2ICogKChpbnQpcHJ2cHBwW3hdICsgKGludClwcnZwbm5beF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAuMDI2ICogKChpbnQpc3JjcDNwW3hdICsgKGludClzcmNwM25beF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMDMxICogKChpbnQpcHJ2cDRwW3hdICsgKGludClwcnZwNHBbeF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RwW3hdID0gYXZfY2xpcCh2YWxmLCBsbywgaGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHdvd2F5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9ICg4ICogKChpbnQpc3JjcHBbeF0gKyAoaW50KXNyY3BuW3hdKSArIDIgKiAoKGludClzcmNwW3hdICsgKGludClwcnZwW3hdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoaW50KShzcmNwcHBbeF0pIC0gKGludCkoc3JjcG5uW3hdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoaW50KShwcnZwcHBbeF0pIC0gKGludCkocHJ2cG5uW3hdKSkgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAoOCAqICgoaW50KXNyY3BwW3hdICsgKGludClzcmNwblt4XSkgKyAyICogKChpbnQpcHJ2cFt4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKGludCkocHJ2cHBwW3hdKSAtIChpbnQpKHBydnBublt4XSkpID4+IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHBbeF0gPSBhdl9jbGlwKHZhbCwgbG8sIGhpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRzdHBbeF0gPSBzcmNwW3hdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBydnAgICArPSAyICogcHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIHBydnBwICArPSAyICogcHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIHBydnBwcCArPSAyICogcHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIHBydnBuICArPSAyICogcHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIHBydnBubiArPSAyICogcHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIHBydnA0cCArPSAyICogcHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIHBydnA0biArPSAyICogcHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIHNyY3AgICArPSAyICogc3JjX2xpbmVzaXplOworICAgICAgICAgICAgc3JjcHAgICs9IDIgKiBzcmNfbGluZXNpemU7CisgICAgICAgICAgICBzcmNwcHAgKz0gMiAqIHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIHNyY3AzcCArPSAyICogc3JjX2xpbmVzaXplOworICAgICAgICAgICAgc3JjcDRwICs9IDIgKiBzcmNfbGluZXNpemU7CisgICAgICAgICAgICBzcmNwbiAgKz0gMiAqIHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIHNyY3BubiArPSAyICogc3JjX2xpbmVzaXplOworICAgICAgICAgICAgc3JjcDNuICs9IDIgKiBzcmNfbGluZXNpemU7CisgICAgICAgICAgICBzcmNwNG4gKz0gMiAqIHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIGRzdHAgICArPSAyICogZHN0X2xpbmVzaXplOworICAgICAgICB9CisKKyAgICAgICAgc3JjcCA9IGlucGljLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgZHN0cCA9IGtlcm5kZWludC0+dG1wX2RhdGFbcGxhbmVdOworICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGRzdHAsIHBzcmNfbGluZXNpemUsIHNyY3AsIHNyY19saW5lc2l6ZSwgYndpZHRoLCBoKTsKKyAgICB9CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnBpYyk7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXRwaWMpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQga2VybmRlaW50X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQga2VybmRlaW50X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCisKK0FWRmlsdGVyIGZmX3ZmX2tlcm5kZWludCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJrZXJuZGVpbnQiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IGtlcm5lbCBkZWludGVybGFjaW5nIHRvIHRoZSBpbnB1dC4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihLZXJuZGVpbnRDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZrZXJuZGVpbnRfY2xhc3MsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0ga2VybmRlaW50X2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGtlcm5kZWludF9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9sZW5zY29ycmVjdGlvbi5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2xlbnNjb3JyZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiMTQyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9sZW5zY29ycmVjdGlvbi5jCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJpY2hhcmQgU3BpbmRsZXIgKGF1dGhvciBvZiBmcmVpMHIgcGx1Z2luIGZyb20gd2hpY2ggdGhpcyB3YXMgZGVyaXZlZCkKKyAqIENvcHlyaWdodCAoQykgMjAxNCBEYW5pZWwgT2JlcmhvZmYKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTGVuc2NvcnJlY3Rpb24gZmlsdGVyLCBhbGdvcml0aG0gZnJvbSB0aGUgZnJlaTByIHBsdWdpbiB3aXRoIHRoZSBzYW1lIG5hbWUKKyovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IExlbnNjb3JyZWN0aW9uQ3R4IHsKKyAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGg7CisgICAgdW5zaWduZWQgaW50IGhlaWdodDsKKyAgICBpbnQgaHN1YiwgdnN1YjsKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGRvdWJsZSBjeCwgY3ksIGsxLCBrMjsKKyAgICBpbnQzMl90ICpjb3JyZWN0aW9uWzRdOworfSBMZW5zY29ycmVjdGlvbkN0eDsKKworI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBsZW5zY29ycmVjdGlvbl9vcHRpb25zW10gPSB7CisgICAgeyAiY3giLCAgICAgInNldCByZWxhdGl2ZSBjZW50ZXIgeCIsIG9mZnNldG9mKExlbnNjb3JyZWN0aW9uQ3R4LCBjeCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC41fSwgMCwgMSwgLmZsYWdzPUZMQUdTIH0sCisgICAgeyAiY3kiLCAgICAgInNldCByZWxhdGl2ZSBjZW50ZXIgeSIsIG9mZnNldG9mKExlbnNjb3JyZWN0aW9uQ3R4LCBjeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC41fSwgMCwgMSwgLmZsYWdzPUZMQUdTIH0sCisgICAgeyAiazEiLCAgICAgInNldCBxdWFkcmF0aWMgZGlzdG9ydGlvbiBmYWN0b3IiLCBvZmZzZXRvZihMZW5zY29ycmVjdGlvbkN0eCwgazEpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuMH0sIC0xLCAxLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7ICJrMiIsICAgICAic2V0IGRvdWJsZSBxdWFkcmF0aWMgZGlzdG9ydGlvbiBmYWN0b3IiLCBvZmZzZXRvZihMZW5zY29ycmVjdGlvbkN0eCwgazIpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuMH0sIC0xLCAxLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGxlbnNjb3JyZWN0aW9uKTsKKwordHlwZWRlZiBzdHJ1Y3QgVGhyZWFkRGF0YSB7CisgICAgQVZGcmFtZSAqaW4sICpvdXQ7CisgICAgaW50IHcsIGg7CisgICAgaW50IHBsYW5lOworICAgIGludCB4Y2VudGVyLCB5Y2VudGVyOworICAgIGludDMyX3QgKmNvcnJlY3Rpb247Cit9IFRocmVhZERhdGE7CisKK3N0YXRpYyBpbnQgZmlsdGVyX3NsaWNlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2IsIGludCBuYl9qb2JzKQoreworICAgIFRocmVhZERhdGEgKnRkID0gKFRocmVhZERhdGEqKWFyZzsKKyAgICBBVkZyYW1lICppbiA9IHRkLT5pbjsKKyAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OworCisgICAgY29uc3QgaW50IHcgPSB0ZC0+dywgaCA9IHRkLT5oOworICAgIGNvbnN0IGludCB4Y2VudGVyID0gdGQtPnhjZW50ZXI7CisgICAgY29uc3QgaW50IHljZW50ZXIgPSB0ZC0+eWNlbnRlcjsKKyAgICBjb25zdCBpbnQgc3RhcnQgPSAoaCAqICBqb2IgICApIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgZW5kICAgPSAoaCAqIChqb2IrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgcGxhbmUgPSB0ZC0+cGxhbmU7CisgICAgY29uc3QgaW50IGlubGluZXNpemUgPSBpbi0+bGluZXNpemVbcGxhbmVdOworICAgIGNvbnN0IGludCBvdXRsaW5lc2l6ZSA9IG91dC0+bGluZXNpemVbcGxhbmVdOworICAgIGNvbnN0IHVpbnQ4X3QgKmluZGF0YSA9IGluLT5kYXRhW3BsYW5lXTsKKyAgICB1aW50OF90ICpvdXRyb3cgPSBvdXQtPmRhdGFbcGxhbmVdICsgc3RhcnQgKiBvdXRsaW5lc2l6ZTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrLCBvdXRyb3cgKz0gb3V0bGluZXNpemUpIHsKKyAgICAgICAgY29uc3QgaW50IG9mZl95ID0gaSAtIHljZW50ZXI7CisgICAgICAgIHVpbnQ4X3QgKm91dCA9IG91dHJvdzsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBvZmZfeCA9IGogLSB4Y2VudGVyOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCByYWRpdXNfbXVsdCA9IHRkLT5jb3JyZWN0aW9uW2ogKyBpKnddOworICAgICAgICAgICAgY29uc3QgaW50IHggPSB4Y2VudGVyICsgKChyYWRpdXNfbXVsdCAqIG9mZl94ICsgKDE8PDIzKSk+PjI0KTsKKyAgICAgICAgICAgIGNvbnN0IGludCB5ID0geWNlbnRlciArICgocmFkaXVzX211bHQgKiBvZmZfeSArICgxPDwyMykpPj4yNCk7CisgICAgICAgICAgICBjb25zdCBjaGFyIGlzdmFsaWQgPSB4ID4gMCAmJiB4IDwgdyAtIDEgJiYgeSA+IDAgJiYgeSA8IGggLSAxOworICAgICAgICAgICAgKm91dCsrID0gIGlzdmFsaWQgPyBpbmRhdGFbeSAqIGlubGluZXNpemUgKyB4XSA6IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBMZW5zY29ycmVjdGlvbkN0eCAqcmVjdCA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhyZWN0LT5jb3JyZWN0aW9uKTsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWVwKCZyZWN0LT5jb3JyZWN0aW9uW2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBMZW5zY29ycmVjdGlvbkN0eCAqcmVjdCA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4ZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIHJlY3QtPmhzdWIgPSBwaXhkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHJlY3QtPnZzdWIgPSBwaXhkZXNjLT5sb2cyX2Nocm9tYV9oOworICAgIG91dGxpbmstPncgPSByZWN0LT53aWR0aCA9IGlubGluay0+dzsKKyAgICBvdXRsaW5rLT5oID0gcmVjdC0+aGVpZ2h0ID0gaW5saW5rLT5oOworICAgIHJlY3QtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIExlbnNjb3JyZWN0aW9uQ3R4ICpyZWN0ID0gKExlbnNjb3JyZWN0aW9uQ3R4KiljdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpbnQgcGxhbmU7CisKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHJlY3QtPm5iX3BsYW5lczsgKytwbGFuZSkgeworICAgICAgICBpbnQgaHN1YiA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IHJlY3QtPmhzdWIgOiAwOworICAgICAgICBpbnQgdnN1YiA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IHJlY3QtPnZzdWIgOiAwOworICAgICAgICBpbnQgaGRpdiA9IDEgPDwgaHN1YjsKKyAgICAgICAgaW50IHZkaXYgPSAxIDw8IHZzdWI7CisgICAgICAgIGludCB3ID0gcmVjdC0+d2lkdGggLyBoZGl2OworICAgICAgICBpbnQgaCA9IHJlY3QtPmhlaWdodCAvIHZkaXY7CisgICAgICAgIGludCB4Y2VudGVyID0gcmVjdC0+Y3ggKiB3OworICAgICAgICBpbnQgeWNlbnRlciA9IHJlY3QtPmN5ICogaDsKKyAgICAgICAgaW50IGsxID0gcmVjdC0+azEgKiAoMTw8MjQpOworICAgICAgICBpbnQgazIgPSByZWN0LT5rMiAqICgxPDwyNCk7CisgICAgICAgIFRocmVhZERhdGEgdGQgPSB7CisgICAgICAgICAgICAuaW4gPSBpbiwKKyAgICAgICAgICAgIC5vdXQgID0gb3V0LAorICAgICAgICAgICAgLncgID0gdywKKyAgICAgICAgICAgIC5oICA9IGgsCisgICAgICAgICAgICAueGNlbnRlciA9IHhjZW50ZXIsCisgICAgICAgICAgICAueWNlbnRlciA9IHljZW50ZXIsCisgICAgICAgICAgICAucGxhbmUgPSBwbGFuZX07CisKKyAgICAgICAgaWYgKCFyZWN0LT5jb3JyZWN0aW9uW3BsYW5lXSkgeworICAgICAgICAgICAgaW50IGksajsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcjJpbnYgPSAoNExMPDw2MCkgLyAodyAqIHcgKyBoICogaCk7CisKKyAgICAgICAgICAgIHJlY3QtPmNvcnJlY3Rpb25bcGxhbmVdID0gYXZfbWFsbG9jX2FycmF5KHcsIGggKiBzaXplb2YoKipyZWN0LT5jb3JyZWN0aW9uKSk7CisgICAgICAgICAgICBpZiAoIXJlY3QtPmNvcnJlY3Rpb25bcGxhbmVdKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IG9mZl95ID0gaiAtIHljZW50ZXI7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IG9mZl95MiA9IG9mZl95ICogb2ZmX3k7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb2ZmX3ggPSBpIC0geGNlbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCByMiA9ICgob2ZmX3ggKiBvZmZfeCArIG9mZl95MikgKiByMmludiArICgxTEw8PDMxKSkgPj4gMzI7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcjQgPSAocjIgKiByMiArICgxPDwyNykpID4+IDI4OworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcmFkaXVzX211bHQgPSAocjIgKiBrMSArIHI0ICogazIgKyAoMUxMPDwyNykgKyAoMUxMPDw1MikpPj4yODsKKyAgICAgICAgICAgICAgICAgICAgcmVjdC0+Y29ycmVjdGlvbltwbGFuZV1baiAqIHcgKyBpXSA9IHJhZGl1c19tdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRkLmNvcnJlY3Rpb24gPSByZWN0LT5jb3JyZWN0aW9uW3BsYW5lXTsKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9zbGljZSwgJnRkLCBOVUxMLCBGRk1JTihoLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGxlbnNjb3JyZWN0aW9uX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbGVuc2NvcnJlY3Rpb25fb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9sZW5zY29ycmVjdGlvbiA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJsZW5zY29ycmVjdGlvbiIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVjdGlmeSB0aGUgaW1hZ2UgYnkgY29ycmVjdGluZyBmb3IgbGVucyBkaXN0b3J0aW9uLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKExlbnNjb3JyZWN0aW9uQ3R4KSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBsZW5zY29ycmVjdGlvbl9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBsZW5zY29ycmVjdGlvbl9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmxlbnNjb3JyZWN0aW9uX2NsYXNzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9saWJvcGVuY3YuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9saWJvcGVuY3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTVmNTUyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2xpYm9wZW5jdi5jCkBAIC0wLDAgKzEsNDE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbGlib3BlbmN2IHdyYXBwZXIgZnVuY3Rpb25zCisgKi8KKworI2luY2x1ZGUgPG9wZW5jdi9jdi5oPgorI2luY2x1ZGUgPG9wZW5jdi9jeGNvcmUuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpbGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCitzdGF0aWMgdm9pZCBmaWxsX2lwbGltYWdlX2Zyb21fZnJhbWUoSXBsSW1hZ2UgKmltZywgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhmbXQpCit7CisgICAgSXBsSW1hZ2UgKnRtcGltZzsKKyAgICBpbnQgZGVwdGgsIGNoYW5uZWxzX25iOworCisgICAgaWYgICAgICAocGl4Zm10ID09IEFWX1BJWF9GTVRfR1JBWTgpIHsgZGVwdGggPSBJUExfREVQVEhfOFU7ICBjaGFubmVsc19uYiA9IDE7IH0KKyAgICBlbHNlIGlmIChwaXhmbXQgPT0gQVZfUElYX0ZNVF9CR1JBKSAgeyBkZXB0aCA9IElQTF9ERVBUSF84VTsgIGNoYW5uZWxzX25iID0gNDsgfQorICAgIGVsc2UgaWYgKHBpeGZtdCA9PSBBVl9QSVhfRk1UX0JHUjI0KSB7IGRlcHRoID0gSVBMX0RFUFRIXzhVOyAgY2hhbm5lbHNfbmIgPSAzOyB9CisgICAgZWxzZSByZXR1cm47CisKKyAgICB0bXBpbWcgPSBjdkNyZWF0ZUltYWdlSGVhZGVyKChDdlNpemUpe2ZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodH0sIGRlcHRoLCBjaGFubmVsc19uYik7CisgICAgKmltZyA9ICp0bXBpbWc7CisgICAgaW1nLT5pbWFnZURhdGEgPSBpbWctPmltYWdlRGF0YU9yaWdpbiA9IGZyYW1lLT5kYXRhWzBdOworICAgIGltZy0+ZGF0YU9yZGVyID0gSVBMX0RBVEFfT1JERVJfUElYRUw7CisgICAgaW1nLT5vcmlnaW4gICAgPSBJUExfT1JJR0lOX1RMOworICAgIGltZy0+d2lkdGhTdGVwID0gZnJhbWUtPmxpbmVzaXplWzBdOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2ZyYW1lX2Zyb21faXBsaW1hZ2UoQVZGcmFtZSAqZnJhbWUsIGNvbnN0IElwbEltYWdlICppbWcsIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhmbXQpCit7CisgICAgZnJhbWUtPmxpbmVzaXplWzBdID0gaW1nLT53aWR0aFN0ZXA7CisgICAgZnJhbWUtPmRhdGFbMF0gICAgID0gaW1nLT5pbWFnZURhdGE7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfQkdSMjQsIEFWX1BJWF9GTVRfQkdSQSwgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgT0NWQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICpwYXJhbXM7CisgICAgaW50ICgqaW5pdCkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmFyZ3MpOworICAgIHZvaWQgKCp1bmluaXQpKEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKKyAgICB2b2lkICgqZW5kX2ZyYW1lX2ZpbHRlcikoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIElwbEltYWdlICppbmltZywgSXBsSW1hZ2UgKm91dGltZyk7CisgICAgdm9pZCAqcHJpdjsKK30gT0NWQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgU21vb3RoQ29udGV4dCB7CisgICAgaW50IHR5cGU7CisgICAgaW50ICAgIHBhcmFtMSwgcGFyYW0yOworICAgIGRvdWJsZSBwYXJhbTMsIHBhcmFtNDsKK30gU21vb3RoQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IHNtb290aF9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICphcmdzKQoreworICAgIE9DVkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgU21vb3RoQ29udGV4dCAqc21vb3RoID0gcy0+cHJpdjsKKyAgICBjaGFyIHR5cGVfc3RyWzEyOF0gPSAiZ2F1c3NpYW4iOworCisgICAgc21vb3RoLT5wYXJhbTEgPSAzOworICAgIHNtb290aC0+cGFyYW0yID0gMDsKKyAgICBzbW9vdGgtPnBhcmFtMyA9IDAuMDsKKyAgICBzbW9vdGgtPnBhcmFtNCA9IDAuMDsKKworICAgIGlmIChhcmdzKQorICAgICAgICBzc2NhbmYoYXJncywgIiUxMjdbXnxdfCVkfCVkfCVsZnwlbGYiLCB0eXBlX3N0ciwgJnNtb290aC0+cGFyYW0xLCAmc21vb3RoLT5wYXJhbTIsICZzbW9vdGgtPnBhcmFtMywgJnNtb290aC0+cGFyYW00KTsKKworICAgIGlmICAgICAgKCFzdHJjbXAodHlwZV9zdHIsICJibHVyIiAgICAgICAgICkpIHNtb290aC0+dHlwZSA9IENWX0JMVVI7CisgICAgZWxzZSBpZiAoIXN0cmNtcCh0eXBlX3N0ciwgImJsdXJfbm9fc2NhbGUiKSkgc21vb3RoLT50eXBlID0gQ1ZfQkxVUl9OT19TQ0FMRTsKKyAgICBlbHNlIGlmICghc3RyY21wKHR5cGVfc3RyLCAibWVkaWFuIiAgICAgICApKSBzbW9vdGgtPnR5cGUgPSBDVl9NRURJQU47CisgICAgZWxzZSBpZiAoIXN0cmNtcCh0eXBlX3N0ciwgImdhdXNzaWFuIiAgICAgKSkgc21vb3RoLT50eXBlID0gQ1ZfR0FVU1NJQU47CisgICAgZWxzZSBpZiAoIXN0cmNtcCh0eXBlX3N0ciwgImJpbGF0ZXJhbCIgICAgKSkgc21vb3RoLT50eXBlID0gQ1ZfQklMQVRFUkFMOworICAgIGVsc2UgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJTbW9vdGhpbmcgdHlwZSAnJXMnIHVua25vd24uXG4iLCB0eXBlX3N0cik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKHNtb290aC0+cGFyYW0xIDwgMCB8fCAhKHNtb290aC0+cGFyYW0xJTIpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlICclZCcgZm9yIHBhcmFtMSwgaXQgaGFzIHRvIGJlIGEgcG9zaXRpdmUgb2RkIG51bWJlclxuIiwKKyAgICAgICAgICAgICAgIHNtb290aC0+cGFyYW0xKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKChzbW9vdGgtPnR5cGUgPT0gQ1ZfQkxVUiB8fCBzbW9vdGgtPnR5cGUgPT0gQ1ZfQkxVUl9OT19TQ0FMRSB8fCBzbW9vdGgtPnR5cGUgPT0gQ1ZfR0FVU1NJQU4pICYmCisgICAgICAgIChzbW9vdGgtPnBhcmFtMiA8IDAgfHwgKHNtb290aC0+cGFyYW0yICYmICEoc21vb3RoLT5wYXJhbTIlMikpKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSAnJWQnIGZvciBwYXJhbTIsIGl0IGhhcyB0byBiZSB6ZXJvIG9yIGEgcG9zaXRpdmUgb2RkIG51bWJlclxuIiwKKyAgICAgICAgICAgICAgIHNtb290aC0+cGFyYW0yKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgInR5cGU6JXMgcGFyYW0xOiVkIHBhcmFtMjolZCBwYXJhbTM6JWYgcGFyYW00OiVmXG4iLAorICAgICAgICAgICB0eXBlX3N0ciwgc21vb3RoLT5wYXJhbTEsIHNtb290aC0+cGFyYW0yLCBzbW9vdGgtPnBhcmFtMywgc21vb3RoLT5wYXJhbTQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbW9vdGhfZW5kX2ZyYW1lX2ZpbHRlcihBVkZpbHRlckNvbnRleHQgKmN0eCwgSXBsSW1hZ2UgKmluaW1nLCBJcGxJbWFnZSAqb3V0aW1nKQoreworICAgIE9DVkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgU21vb3RoQ29udGV4dCAqc21vb3RoID0gcy0+cHJpdjsKKyAgICBjdlNtb290aChpbmltZywgb3V0aW1nLCBzbW9vdGgtPnR5cGUsIHNtb290aC0+cGFyYW0xLCBzbW9vdGgtPnBhcmFtMiwgc21vb3RoLT5wYXJhbTMsIHNtb290aC0+cGFyYW00KTsKK30KKworc3RhdGljIGludCByZWFkX3NoYXBlX2Zyb21fZmlsZShpbnQgKmNvbHMsIGludCAqcm93cywgaW50ICoqdmFsdWVzLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICB1aW50OF90ICpidWYsICpwLCAqcGVuZDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpbnQgcmV0LCBpLCBqLCB3OworCisgICAgaWYgKChyZXQgPSBhdl9maWxlX21hcChmaWxlbmFtZSwgJmJ1ZiwgJnNpemUsIDAsIGxvZ19jdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBwcmVzY2FuIGZpbGUgdG8gZ2V0IHRoZSBudW1iZXIgb2YgbGluZXMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoICovCisgICAgdyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAoYnVmW2ldID09ICdcbicpIHsKKyAgICAgICAgICAgIGlmICgqcm93cyA9PSBJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIk92ZXJmbG93IG9uIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZmlsZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArKygqcm93cyk7CisgICAgICAgICAgICAqY29scyA9IEZGTUFYKCpjb2xzLCB3KTsKKyAgICAgICAgICAgIHcgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHcgPT0gSU5UX01BWCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIk92ZXJmbG93IG9uIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZmlsZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICB3Kys7CisgICAgfQorICAgIGlmICgqcm93cyA+IChTSVpFX01BWCAvIHNpemVvZihpbnQpIC8gKmNvbHMpKSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJGaWxlIHdpdGggc2l6ZSAlZHglZCBpcyB0b28gYmlnXG4iLAorICAgICAgICAgICAgICAgKnJvd3MsICpjb2xzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICghKCp2YWx1ZXMgPSBhdl9tYWxsb2N6X2FycmF5KHNpemVvZihpbnQpICogKnJvd3MsICpjb2xzKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBmaWxsICp2YWx1ZXMgKi8KKyAgICBwICAgID0gYnVmOworICAgIHBlbmQgPSBidWYgKyBzaXplLTE7CisgICAgZm9yIChpID0gMDsgaSA8ICpyb3dzOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDs7IGorKykgeworICAgICAgICAgICAgaWYgKHAgPiBwZW5kIHx8ICpwID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAoKnZhbHVlcylbKmNvbHMqaSArIGpdID0gISFhdl9pc2dyYXBoKCoocCsrKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZmlsZV91bm1hcChidWYsIHNpemUpOworCisjaWZkZWYgREVCVUcKKyAgICB7CisgICAgICAgIGNoYXIgKmxpbmU7CisgICAgICAgIGlmICghKGxpbmUgPSBhdl9tYWxsb2MoKmNvbHMgKyAxKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKnJvd3M7IGkrKykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8ICpjb2xzOyBqKyspCisgICAgICAgICAgICAgICAgbGluZVtqXSA9ICgqdmFsdWVzKVtpICogKmNvbHMgKyBqXSA/ICdAJyA6ICcgJzsKKyAgICAgICAgICAgIGxpbmVbal0gPSAwOworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19ERUJVRywgIiUzZDogJXNcbiIsIGksIGxpbmUpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWUobGluZSk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9pcGxjb252a2VybmVsKElwbENvbnZLZXJuZWwgKiprZXJuZWwsIGNoYXIgKmJ1Ziwgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBjaGFyIHNoYXBlX2ZpbGVuYW1lWzEyOF0gPSAiIiwgc2hhcGVfc3RyWzMyXSA9ICJyZWN0IjsKKyAgICBpbnQgY29scyA9IDAsIHJvd3MgPSAwLCBhbmNob3JfeCA9IDAsIGFuY2hvcl95ID0gMCwgc2hhcGUgPSBDVl9TSEFQRV9SRUNUOworICAgIGludCAqdmFsdWVzID0gTlVMTCwgcmV0OworCisgICAgc3NjYW5mKGJ1ZiwgIiVkeCVkKyVkeCVkLyUzMltePV09JTEyN3MiLCAmY29scywgJnJvd3MsICZhbmNob3JfeCwgJmFuY2hvcl95LCBzaGFwZV9zdHIsIHNoYXBlX2ZpbGVuYW1lKTsKKworICAgIGlmICAgICAgKCFzdHJjbXAoc2hhcGVfc3RyLCAicmVjdCIgICApKSBzaGFwZSA9IENWX1NIQVBFX1JFQ1Q7CisgICAgZWxzZSBpZiAoIXN0cmNtcChzaGFwZV9zdHIsICJjcm9zcyIgICkpIHNoYXBlID0gQ1ZfU0hBUEVfQ1JPU1M7CisgICAgZWxzZSBpZiAoIXN0cmNtcChzaGFwZV9zdHIsICJlbGxpcHNlIikpIHNoYXBlID0gQ1ZfU0hBUEVfRUxMSVBTRTsKKyAgICBlbHNlIGlmICghc3RyY21wKHNoYXBlX3N0ciwgImN1c3RvbSIgKSkgeworICAgICAgICBzaGFwZSA9IENWX1NIQVBFX0NVU1RPTTsKKyAgICAgICAgaWYgKChyZXQgPSByZWFkX3NoYXBlX2Zyb21fZmlsZSgmY29scywgJnJvd3MsICZ2YWx1ZXMsIHNoYXBlX2ZpbGVuYW1lLCBsb2dfY3R4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlNoYXBlIHVuc3BlY2lmaWVkIG9yIHR5cGUgJyVzJyB1bmtub3duLlxuIiwgc2hhcGVfc3RyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAocm93cyA8PSAwIHx8IGNvbHMgPD0gMCkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkludmFsaWQgbm9uLXBvc2l0aXZlIHZhbHVlcyBmb3Igc2hhcGUgc2l6ZSAlZHglZFxuIiwgY29scywgcm93cyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGFuY2hvcl94IDwgMCB8fCBhbmNob3JfeSA8IDAgfHwgYW5jaG9yX3ggPj0gY29scyB8fCBhbmNob3JfeSA+PSByb3dzKSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiU2hhcGUgYW5jaG9yICVkeCVkIGlzIG5vdCBpbnNpZGUgdGhlIHJlY3RhbmdsZSB3aXRoIHNpemUgJWR4JWQuXG4iLAorICAgICAgICAgICAgICAgYW5jaG9yX3gsIGFuY2hvcl95LCBjb2xzLCByb3dzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAqa2VybmVsID0gY3ZDcmVhdGVTdHJ1Y3R1cmluZ0VsZW1lbnRFeChjb2xzLCByb3dzLCBhbmNob3JfeCwgYW5jaG9yX3ksIHNoYXBlLCB2YWx1ZXMpOworICAgIGF2X2ZyZWVwKCZ2YWx1ZXMpOworICAgIGlmICghKmtlcm5lbCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlN0cnVjdHVyaW5nIGVsZW1lbnQ6IHc6JWQgaDolZCB4OiVkIHk6JWQgc2hhcGU6JXNcbiIsCisgICAgICAgICAgIHJvd3MsIGNvbHMsIGFuY2hvcl94LCBhbmNob3JfeSwgc2hhcGVfc3RyKTsKKyAgICByZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgRGlsYXRlQ29udGV4dCB7CisgICAgaW50IG5iX2l0ZXJhdGlvbnM7CisgICAgSXBsQ29udktlcm5lbCAqa2VybmVsOworfSBEaWxhdGVDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgZGlsYXRlX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmFyZ3MpCit7CisgICAgT0NWQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBEaWxhdGVDb250ZXh0ICpkaWxhdGUgPSBzLT5wcml2OworICAgIGNoYXIgZGVmYXVsdF9rZXJuZWxfc3RyW10gPSAiM3gzKzB4MC9yZWN0IjsKKyAgICBjaGFyICprZXJuZWxfc3RyOworICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IGFyZ3M7CisgICAgaW50IHJldDsKKworICAgIGlmIChhcmdzKQorICAgICAgICBrZXJuZWxfc3RyID0gYXZfZ2V0X3Rva2VuKCZidWYsICJ8Iik7CisgICAgZWxzZQorICAgICAgICBrZXJuZWxfc3RyID0gYXZfc3RyZHVwKGRlZmF1bHRfa2VybmVsX3N0cik7CisgICAgaWYgKCFrZXJuZWxfc3RyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmICgocmV0ID0gcGFyc2VfaXBsY29udmtlcm5lbCgmZGlsYXRlLT5rZXJuZWwsIGtlcm5lbF9zdHIsIGN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBhdl9mcmVlKGtlcm5lbF9zdHIpOworCisgICAgaWYgKCFidWYgfHwgc3NjYW5mKGJ1ZiwgInwlZCIsICZkaWxhdGUtPm5iX2l0ZXJhdGlvbnMpICE9IDEpCisgICAgICAgIGRpbGF0ZS0+bmJfaXRlcmF0aW9ucyA9IDE7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJpdGVyYXRpb25zX25iOiVkXG4iLCBkaWxhdGUtPm5iX2l0ZXJhdGlvbnMpOworICAgIGlmIChkaWxhdGUtPm5iX2l0ZXJhdGlvbnMgPD0gMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG5vbi1wb3NpdGl2ZSB2YWx1ZSAnJWQnIGZvciBuYl9pdGVyYXRpb25zXG4iLAorICAgICAgICAgICAgICAgZGlsYXRlLT5uYl9pdGVyYXRpb25zKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZGlsYXRlX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBPQ1ZDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIERpbGF0ZUNvbnRleHQgKmRpbGF0ZSA9IHMtPnByaXY7CisKKyAgICBjdlJlbGVhc2VTdHJ1Y3R1cmluZ0VsZW1lbnQoJmRpbGF0ZS0+a2VybmVsKTsKK30KKworc3RhdGljIHZvaWQgZGlsYXRlX2VuZF9mcmFtZV9maWx0ZXIoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIElwbEltYWdlICppbmltZywgSXBsSW1hZ2UgKm91dGltZykKK3sKKyAgICBPQ1ZDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIERpbGF0ZUNvbnRleHQgKmRpbGF0ZSA9IHMtPnByaXY7CisgICAgY3ZEaWxhdGUoaW5pbWcsIG91dGltZywgZGlsYXRlLT5rZXJuZWwsIGRpbGF0ZS0+bmJfaXRlcmF0aW9ucyk7Cit9CisKK3N0YXRpYyB2b2lkIGVyb2RlX2VuZF9mcmFtZV9maWx0ZXIoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIElwbEltYWdlICppbmltZywgSXBsSW1hZ2UgKm91dGltZykKK3sKKyAgICBPQ1ZDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIERpbGF0ZUNvbnRleHQgKmRpbGF0ZSA9IHMtPnByaXY7CisgICAgY3ZFcm9kZShpbmltZywgb3V0aW1nLCBkaWxhdGUtPmtlcm5lbCwgZGlsYXRlLT5uYl9pdGVyYXRpb25zKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgT0NWRmlsdGVyRW50cnkgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgc2l6ZV90IHByaXZfc2l6ZTsKKyAgICBpbnQgICgqaW5pdCkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmFyZ3MpOworICAgIHZvaWQgKCp1bmluaXQpKEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKKyAgICB2b2lkICgqZW5kX2ZyYW1lX2ZpbHRlcikoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIElwbEltYWdlICppbmltZywgSXBsSW1hZ2UgKm91dGltZyk7Cit9IE9DVkZpbHRlckVudHJ5OworCitzdGF0aWMgT0NWRmlsdGVyRW50cnkgb2N2X2ZpbHRlcl9lbnRyaWVzW10gPSB7CisgICAgeyAiZGlsYXRlIiwgc2l6ZW9mKERpbGF0ZUNvbnRleHQpLCBkaWxhdGVfaW5pdCwgZGlsYXRlX3VuaW5pdCwgZGlsYXRlX2VuZF9mcmFtZV9maWx0ZXIgfSwKKyAgICB7ICJlcm9kZSIsICBzaXplb2YoRGlsYXRlQ29udGV4dCksIGRpbGF0ZV9pbml0LCBkaWxhdGVfdW5pbml0LCBlcm9kZV9lbmRfZnJhbWVfZmlsdGVyICB9LAorICAgIHsgInNtb290aCIsIHNpemVvZihTbW9vdGhDb250ZXh0KSwgc21vb3RoX2luaXQsIE5VTEwsIHNtb290aF9lbmRfZnJhbWVfZmlsdGVyIH0sCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBPQ1ZDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgaWYgKCFzLT5uYW1lKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGxpYm9wZW5jdiBmaWx0ZXIgbmFtZSBzcGVjaWZpZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMob2N2X2ZpbHRlcl9lbnRyaWVzKTsgaSsrKSB7CisgICAgICAgIE9DVkZpbHRlckVudHJ5ICplbnRyeSA9ICZvY3ZfZmlsdGVyX2VudHJpZXNbaV07CisgICAgICAgIGlmICghc3RyY21wKHMtPm5hbWUsIGVudHJ5LT5uYW1lKSkgeworICAgICAgICAgICAgcy0+aW5pdCAgICAgICAgICAgICA9IGVudHJ5LT5pbml0OworICAgICAgICAgICAgcy0+dW5pbml0ICAgICAgICAgICA9IGVudHJ5LT51bmluaXQ7CisgICAgICAgICAgICBzLT5lbmRfZnJhbWVfZmlsdGVyID0gZW50cnktPmVuZF9mcmFtZV9maWx0ZXI7CisKKyAgICAgICAgICAgIGlmICghKHMtPnByaXYgPSBhdl9tYWxsb2N6KGVudHJ5LT5wcml2X3NpemUpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgcmV0dXJuIHMtPmluaXQoY3R4LCBzLT5wYXJhbXMpOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gbGlib3BlbmN2IGZpbHRlciBuYW1lZCAnJXMnXG4iLCBzLT5uYW1lKTsKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBPQ1ZDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKHMtPnVuaW5pdCkKKyAgICAgICAgcy0+dW5pbml0KGN0eCk7CisgICAgYXZfZnJlZShzLT5wcml2KTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgT0NWQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbms9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBJcGxJbWFnZSBpbmltZywgb3V0aW1nOworCisgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisKKyAgICBmaWxsX2lwbGltYWdlX2Zyb21fZnJhbWUoJmluaW1nICwgaW4gLCBpbmxpbmstPmZvcm1hdCk7CisgICAgZmlsbF9pcGxpbWFnZV9mcm9tX2ZyYW1lKCZvdXRpbWcsIG91dCwgaW5saW5rLT5mb3JtYXQpOworICAgIHMtPmVuZF9mcmFtZV9maWx0ZXIoY3R4LCAmaW5pbWcsICZvdXRpbWcpOworICAgIGZpbGxfZnJhbWVfZnJvbV9pcGxpbWFnZShvdXQsICZvdXRpbWcsIGlubGluay0+Zm9ybWF0KTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoT0NWQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvY3Zfb3B0aW9uc1tdID0geworICAgIHsgImZpbHRlcl9uYW1lIiwgICBOVUxMLCBPRkZTRVQobmFtZSksICAgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImZpbHRlcl9wYXJhbXMiLCBOVUxMLCBPRkZTRVQocGFyYW1zKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Mob2N2KTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX29jdl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX29jdl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfb2N2ID0geworICAgIC5uYW1lICAgICAgICAgID0gIm9jdiIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgdHJhbnNmb3JtIHVzaW5nIGxpYm9wZW5jdi4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihPQ1ZDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZvY3ZfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAuaW5wdXRzICAgICAgICA9IGF2ZmlsdGVyX3ZmX29jdl9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl92Zl9vY3Zfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfbHV0LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfbHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3YTJjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9sdXQuYwpAQCAtMCwwICsxLDQ1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENvbXB1dGUgYSBsb29rLXVwIHRhYmxlIGZvciBiaW5kaW5nIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUgb3V0cHV0CisgKiB2YWx1ZSwgYW5kIGFwcGx5IGl0IHRvIGlucHV0IHZpZGVvLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJ3IiwgICAgICAgIC8vLzwgd2lkdGggb2YgdGhlIGlucHV0IHZpZGVvCisgICAgImgiLCAgICAgICAgLy8vPCBoZWlnaHQgb2YgdGhlIGlucHV0IHZpZGVvCisgICAgInZhbCIsICAgICAgLy8vPCBpbnB1dCB2YWx1ZSBmb3IgdGhlIHBpeGVsCisgICAgIm1heHZhbCIsICAgLy8vPCBtYXggdmFsdWUgZm9yIHRoZSBwaXhlbAorICAgICJtaW52YWwiLCAgIC8vLzwgbWluIHZhbHVlIGZvciB0aGUgcGl4ZWwKKyAgICAibmVndmFsIiwgICAvLy88IG5lZ2F0ZWQgdmFsdWUKKyAgICAiY2xpcHZhbCIsCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX1csCisgICAgVkFSX0gsCisgICAgVkFSX1ZBTCwKKyAgICBWQVJfTUFYVkFMLAorICAgIFZBUl9NSU5WQUwsCisgICAgVkFSX05FR1ZBTCwKKyAgICBWQVJfQ0xJUFZBTCwKKyAgICBWQVJfVkFSU19OQgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgTHV0Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgdWludDhfdCBsdXRbNF1bMjU2XTsgIC8vLzwgbG9va3VwIHRhYmxlIGZvciBlYWNoIGNvbXBvbmVudAorICAgIGNoYXIgICAqY29tcF9leHByX3N0cls0XTsKKyAgICBBVkV4cHIgKmNvbXBfZXhwcls0XTsKKyAgICBpbnQgaHN1YiwgdnN1YjsKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJfVkFSU19OQl07CisgICAgaW50IGlzX3JnYiwgaXNfeXV2OworICAgIGludCBzdGVwOworICAgIGludCBuZWdhdGVfYWxwaGE7IC8qIG9ubHkgdXNlZCBieSBuZWdhdGUgKi8KK30gTHV0Q29udGV4dDsKKworI2RlZmluZSBZIDAKKyNkZWZpbmUgVSAxCisjZGVmaW5lIFYgMgorI2RlZmluZSBSIDAKKyNkZWZpbmUgRyAxCisjZGVmaW5lIEIgMgorI2RlZmluZSBBIDMKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTHV0Q29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiYzAiLCAic2V0IGNvbXBvbmVudCAjMCBleHByZXNzaW9uIiwgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbMF0pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAidmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImMxIiwgInNldCBjb21wb25lbnQgIzEgZXhwcmVzc2lvbiIsIE9GRlNFVChjb21wX2V4cHJfc3RyWzFdKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gInZhbCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJjMiIsICJzZXQgY29tcG9uZW50ICMyIGV4cHJlc3Npb24iLCBPRkZTRVQoY29tcF9leHByX3N0clsyXSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJ2YWwiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiYzMiLCAic2V0IGNvbXBvbmVudCAjMyBleHByZXNzaW9uIiwgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbM10pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAidmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInkiLCAgInNldCBZIGV4cHJlc3Npb24iLCAgICAgICAgICAgIE9GRlNFVChjb21wX2V4cHJfc3RyW1ldKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gInZhbCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJ1IiwgICJzZXQgVSBleHByZXNzaW9uIiwgICAgICAgICAgICBPRkZTRVQoY29tcF9leHByX3N0cltVXSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJ2YWwiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAidiIsICAic2V0IFYgZXhwcmVzc2lvbiIsICAgICAgICAgICAgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbVl0pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAidmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInIiLCAgInNldCBSIGV4cHJlc3Npb24iLCAgICAgICAgICAgIE9GRlNFVChjb21wX2V4cHJfc3RyW1JdKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gInZhbCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJnIiwgICJzZXQgRyBleHByZXNzaW9uIiwgICAgICAgICAgICBPRkZTRVQoY29tcF9leHByX3N0cltHXSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJ2YWwiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiYiIsICAic2V0IEIgZXhwcmVzc2lvbiIsICAgICAgICAgICAgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbQl0pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAidmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImEiLCAgInNldCBBIGV4cHJlc3Npb24iLCAgICAgICAgICAgIE9GRlNFVChjb21wX2V4cHJfc3RyW0FdKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gInZhbCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTHV0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgYXZfZXhwcl9mcmVlKHMtPmNvbXBfZXhwcltpXSk7CisgICAgICAgIHMtPmNvbXBfZXhwcltpXSA9IE5VTEw7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5jb21wX2V4cHJfc3RyW2ldKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgWVVWX0ZPUk1BVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICBBVl9QSVhfRk1UX1lVVjQyMlAsICBBVl9QSVhfRk1UX1lVVjQyMFAsICAgIFwKKyAgICBBVl9QSVhfRk1UX1lVVjQxMVAsICBBVl9QSVhfRk1UX1lVVjQxMFAsICBBVl9QSVhfRk1UX1lVVjQ0MFAsICAgIFwKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLCAgIFwKKyAgICBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLCAgIFwKKyAgICBBVl9QSVhfRk1UX1lVVko0NDBQCisKKyNkZWZpbmUgUkdCX0ZPUk1BVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBVl9QSVhfRk1UX0FSR0IsICAgICAgICAgQVZfUElYX0ZNVF9SR0JBLCAgICAgICAgIFwKKyAgICBBVl9QSVhfRk1UX0FCR1IsICAgICAgICAgQVZfUElYX0ZNVF9CR1JBLCAgICAgICAgIFwKKyAgICBBVl9QSVhfRk1UX1JHQjI0LCAgICAgICAgQVZfUElYX0ZNVF9CR1IyNAorCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHl1dl9waXhfZm10c1tdID0geyBZVVZfRk9STUFUUywgQVZfUElYX0ZNVF9OT05FIH07CitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHJnYl9waXhfZm10c1tdID0geyBSR0JfRk9STUFUUywgQVZfUElYX0ZNVF9OT05FIH07CitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGFsbF9waXhfZm10c1tdID0geyBSR0JfRk9STUFUUywgWVVWX0ZPUk1BVFMsIEFWX1BJWF9GTVRfTk9ORSB9OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTHV0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcGl4X2ZtdHMgPSBzLT5pc19yZ2IgPyByZ2JfcGl4X2ZtdHMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pc195dXYgPyB5dXZfcGl4X2ZtdHMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfcGl4X2ZtdHM7CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ2xpcCB2YWx1ZSB2YWwgaW4gdGhlIG1pbnZhbCAtIG1heHZhbCByYW5nZS4KKyAqLworc3RhdGljIGRvdWJsZSBjbGlwKHZvaWQgKm9wYXF1ZSwgZG91YmxlIHZhbCkKK3sKKyAgICBMdXRDb250ZXh0ICpzID0gb3BhcXVlOworICAgIGRvdWJsZSBtaW52YWwgPSBzLT52YXJfdmFsdWVzW1ZBUl9NSU5WQUxdOworICAgIGRvdWJsZSBtYXh2YWwgPSBzLT52YXJfdmFsdWVzW1ZBUl9NQVhWQUxdOworCisgICAgcmV0dXJuIGF2X2NsaXAodmFsLCBtaW52YWwsIG1heHZhbCk7Cit9CisKKy8qKgorICogQ29tcHV0ZSBnYW1tYSBjb3JyZWN0aW9uIGZvciB2YWx1ZSB2YWwsIGFzc3VtaW5nIHRoZSBtaW52YWwtbWF4dmFsCisgKiByYW5nZSwgdmFsIGlzIGNsaXBwZWQgdG8gYSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHNhbWUgaW50ZXJ2YWwuCisgKi8KK3N0YXRpYyBkb3VibGUgY29tcHV0ZV9nYW1tYXZhbCh2b2lkICpvcGFxdWUsIGRvdWJsZSBnYW1tYSkKK3sKKyAgICBMdXRDb250ZXh0ICpzID0gb3BhcXVlOworICAgIGRvdWJsZSB2YWwgICAgPSBzLT52YXJfdmFsdWVzW1ZBUl9DTElQVkFMXTsKKyAgICBkb3VibGUgbWludmFsID0gcy0+dmFyX3ZhbHVlc1tWQVJfTUlOVkFMXTsKKyAgICBkb3VibGUgbWF4dmFsID0gcy0+dmFyX3ZhbHVlc1tWQVJfTUFYVkFMXTsKKworICAgIHJldHVybiBwb3coKHZhbC1taW52YWwpLyhtYXh2YWwtbWludmFsKSwgZ2FtbWEpICogKG1heHZhbC1taW52YWwpK21pbnZhbDsKK30KKworLyoqCisgKiBDb21wdXRlIFJlYy43MDkgZ2FtYSBjb3JyZWN0aW9uIG9mIHZhbHVlIHZhbAorICovCitzdGF0aWMgZG91YmxlIGNvbXB1dGVfZ2FtbWF2YWw3MDkodm9pZCAqb3BhcXVlLCBkb3VibGUgZ2FtbWEpCit7CisgICAgTHV0Q29udGV4dCAqcyA9IG9wYXF1ZTsKKyAgICBkb3VibGUgdmFsICAgID0gcy0+dmFyX3ZhbHVlc1tWQVJfQ0xJUFZBTF07CisgICAgZG91YmxlIG1pbnZhbCA9IHMtPnZhcl92YWx1ZXNbVkFSX01JTlZBTF07CisgICAgZG91YmxlIG1heHZhbCA9IHMtPnZhcl92YWx1ZXNbVkFSX01BWFZBTF07CisgICAgZG91YmxlIGxldmVsID0gKHZhbCAtIG1pbnZhbCkgLyAobWF4dmFsIC0gbWludmFsKTsKKyAgICBsZXZlbCA9IGxldmVsIDwgMC4wMTggPyA0LjUgKiBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICA6IDEuMDk5ICogcG93KGxldmVsLCAxLjAgLyBnYW1tYSkgLSAwLjA5OTsKKyAgICByZXR1cm4gbGV2ZWwgKiAobWF4dmFsIC0gbWludmFsKSArIG1pbnZhbDsKK30KKworc3RhdGljIGRvdWJsZSAoKiBjb25zdCBmdW5jczFbXSkodm9pZCAqLCBkb3VibGUpID0geworICAgICh2b2lkICopY2xpcCwKKyAgICAodm9pZCAqKWNvbXB1dGVfZ2FtbWF2YWwsCisgICAgKHZvaWQgKiljb21wdXRlX2dhbW1hdmFsNzA5LAorICAgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZnVuY3MxX25hbWVzW10gPSB7CisgICAgImNsaXAiLAorICAgICJnYW1tYXZhbCIsCisgICAgImdhbW1hdmFsNzA5IiwKKyAgICBOVUxMCit9OworCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEx1dENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgdWludDhfdCByZ2JhX21hcFs0XTsgLyogY29tcG9uZW50IGluZGV4IC0+IFJHQkEgY29sb3IgaW5kZXggbWFwICovCisgICAgaW50IG1pbls0XSwgbWF4WzRdOworICAgIGludCB2YWwsIGNvbG9yLCByZXQ7CisKKyAgICBzLT5oc3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBzLT52c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1ddID0gaW5saW5rLT53OworICAgIHMtPnZhcl92YWx1ZXNbVkFSX0hdID0gaW5saW5rLT5oOworCisgICAgc3dpdGNoIChpbmxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MTBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MTFQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOgorICAgICAgICBtaW5bWV0gPSBtaW5bVV0gPSBtaW5bVl0gPSAxNjsKKyAgICAgICAgbWF4W1ldID0gMjM1OworICAgICAgICBtYXhbVV0gPSBtYXhbVl0gPSAyNDA7CisgICAgICAgIG1pbltBXSA9IDA7IG1heFtBXSA9IDI1NTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgbWluWzBdID0gbWluWzFdID0gbWluWzJdID0gbWluWzNdID0gMDsKKyAgICAgICAgbWF4WzBdID0gbWF4WzFdID0gbWF4WzJdID0gbWF4WzNdID0gMjU1OworICAgIH0KKworICAgIHMtPmlzX3l1diA9IHMtPmlzX3JnYiA9IDA7CisgICAgaWYgICAgICAoZmZfZm10X2lzX2luKGlubGluay0+Zm9ybWF0LCB5dXZfcGl4X2ZtdHMpKSBzLT5pc195dXYgPSAxOworICAgIGVsc2UgaWYgKGZmX2ZtdF9pc19pbihpbmxpbmstPmZvcm1hdCwgcmdiX3BpeF9mbXRzKSkgcy0+aXNfcmdiID0gMTsKKworICAgIGlmIChzLT5pc19yZ2IpIHsKKyAgICAgICAgZmZfZmlsbF9yZ2JhX21hcChyZ2JhX21hcCwgaW5saW5rLT5mb3JtYXQpOworICAgICAgICBzLT5zdGVwID0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGRlc2MpID4+IDM7CisgICAgfQorCisgICAgZm9yIChjb2xvciA9IDA7IGNvbG9yIDwgZGVzYy0+bmJfY29tcG9uZW50czsgY29sb3IrKykgeworICAgICAgICBkb3VibGUgcmVzOworICAgICAgICBpbnQgY29tcCA9IHMtPmlzX3JnYiA/IHJnYmFfbWFwW2NvbG9yXSA6IGNvbG9yOworCisgICAgICAgIC8qIGNyZWF0ZSB0aGUgcGFyc2VkIGV4cHJlc3Npb24gKi8KKyAgICAgICAgYXZfZXhwcl9mcmVlKHMtPmNvbXBfZXhwcltjb2xvcl0pOworICAgICAgICBzLT5jb21wX2V4cHJbY29sb3JdID0gTlVMTDsKKyAgICAgICAgcmV0ID0gYXZfZXhwcl9wYXJzZSgmcy0+Y29tcF9leHByW2NvbG9yXSwgcy0+Y29tcF9leHByX3N0cltjb2xvcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCBmdW5jczFfbmFtZXMsIGZ1bmNzMSwgTlVMTCwgTlVMTCwgMCwgY3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hlbiBwYXJzaW5nIHRoZSBleHByZXNzaW9uICclcycgZm9yIHRoZSBjb21wb25lbnQgJWQgYW5kIGNvbG9yICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5jb21wX2V4cHJfc3RyW2NvbXBdLCBjb21wLCBjb2xvcik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgbHV0ICovCisgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX01BWFZBTF0gPSBtYXhbY29sb3JdOworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9NSU5WQUxdID0gbWluW2NvbG9yXTsKKworICAgICAgICBmb3IgKHZhbCA9IDA7IHZhbCA8IDI1NjsgdmFsKyspIHsKKyAgICAgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1ZBTF0gPSB2YWw7CisgICAgICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9DTElQVkFMXSA9IGF2X2NsaXAodmFsLCBtaW5bY29sb3JdLCBtYXhbY29sb3JdKTsKKyAgICAgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX05FR1ZBTF0gPQorICAgICAgICAgICAgICAgIGF2X2NsaXAobWluW2NvbG9yXSArIG1heFtjb2xvcl0gLSBzLT52YXJfdmFsdWVzW1ZBUl9WQUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgbWluW2NvbG9yXSwgbWF4W2NvbG9yXSk7CisKKyAgICAgICAgICAgIHJlcyA9IGF2X2V4cHJfZXZhbChzLT5jb21wX2V4cHJbY29sb3JdLCBzLT52YXJfdmFsdWVzLCBzKTsKKyAgICAgICAgICAgIGlmIChpc25hbihyZXMpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hlbiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uICclcycgZm9yIHRoZSB2YWx1ZSAlZCBmb3IgdGhlIGNvbXBvbmVudCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbXBfZXhwcl9zdHJbY29sb3JdLCB2YWwsIGNvbXApOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5sdXRbY29tcF1bdmFsXSA9IGF2X2NsaXAoKGludClyZXMsIG1pbltjb2xvcl0sIG1heFtjb2xvcl0pOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAidmFsWyVkXVslZF0gPSAlZFxuIiwgY29tcCwgdmFsLCBzLT5sdXRbY29tcF1bdmFsXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgTHV0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0OworICAgIHVpbnQ4X3QgKmlucm93LCAqb3V0cm93LCAqaW5yb3cwLCAqb3V0cm93MDsKKyAgICBpbnQgaSwgaiwgcGxhbmUsIGRpcmVjdCA9IDA7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIGRpcmVjdCA9IDE7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgaWYgKHMtPmlzX3JnYikgeworICAgICAgICAvKiBwYWNrZWQgKi8KKyAgICAgICAgaW5yb3cwICA9IGluIC0+ZGF0YVswXTsKKyAgICAgICAgb3V0cm93MCA9IG91dC0+ZGF0YVswXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW4tPmhlaWdodDsgaSArKykgeworICAgICAgICAgICAgaW50IHcgPSBpbmxpbmstPnc7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICgqdGFiKVsyNTZdID0gKGNvbnN0IHVpbnQ4X3QgKCopWzI1Nl0pcy0+bHV0OworICAgICAgICAgICAgaW5yb3cgID0gaW5yb3cwOworICAgICAgICAgICAgb3V0cm93ID0gb3V0cm93MDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHMtPnN0ZXApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6ICBvdXRyb3dbM10gPSB0YWJbM11baW5yb3dbM11dOyAvLyBGYWxsLXRocm91Z2gKKyAgICAgICAgICAgICAgICBjYXNlIDM6ICBvdXRyb3dbMl0gPSB0YWJbMl1baW5yb3dbMl1dOyAvLyBGYWxsLXRocm91Z2gKKyAgICAgICAgICAgICAgICBjYXNlIDI6ICBvdXRyb3dbMV0gPSB0YWJbMV1baW5yb3dbMV1dOyAvLyBGYWxsLXRocm91Z2gKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBvdXRyb3dbMF0gPSB0YWJbMF1baW5yb3dbMF1dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRyb3cgKz0gcy0+c3RlcDsKKyAgICAgICAgICAgICAgICBpbnJvdyAgKz0gcy0+c3RlcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucm93MCAgKz0gaW4gLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIG91dHJvdzAgKz0gb3V0LT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHBsYW5hciAqLworICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCA0ICYmIGluLT5kYXRhW3BsYW5lXSAmJiBpbi0+bGluZXNpemVbcGxhbmVdOyBwbGFuZSsrKSB7CisgICAgICAgICAgICBpbnQgdnN1YiA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IHMtPnZzdWIgOiAwOworICAgICAgICAgICAgaW50IGhzdWIgPSBwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIgPyBzLT5oc3ViIDogMDsKKyAgICAgICAgICAgIGludCBoID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCB2c3ViKTsKKyAgICAgICAgICAgIGludCB3ID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT53LCBoc3ViKTsKKworICAgICAgICAgICAgaW5yb3cgID0gaW4gLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgICAgIG91dHJvdyA9IG91dC0+ZGF0YVtwbGFuZV07CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0YWIgPSBzLT5sdXRbcGxhbmVdOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspCisgICAgICAgICAgICAgICAgICAgIG91dHJvd1tqXSA9IHRhYltpbnJvd1tqXV07CisgICAgICAgICAgICAgICAgaW5yb3cgICs9IGluIC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgICAgIG91dHJvdyArPSBvdXQtPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZGlyZWN0KQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7IC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdXRwdXRzW10gPSB7CisgICAgeyAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNkZWZpbmUgREVGSU5FX0xVVF9GSUxURVIobmFtZV8sIGRlc2NyaXB0aW9uXykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBVkZpbHRlciBmZl92Zl8jI25hbWVfID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAjbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChkZXNjcmlwdGlvbl8pLCAgICAgICAgICAgIFwKKyAgICAgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTHV0Q29udGV4dCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLnByaXZfY2xhc3MgICAgPSAmbmFtZV8gIyMgX2NsYXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLmluaXQgICAgICAgICAgPSBuYW1lXyMjX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLmlucHV0cyAgICAgICAgPSBpbnB1dHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLm91dHB1dHMgICAgICAgPSBvdXRwdXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywgICAgICAgIFwKKyAgICB9CisKKyNpZiBDT05GSUdfTFVUX0ZJTFRFUgorCisjZGVmaW5lIGx1dF9vcHRpb25zIG9wdGlvbnMKK0FWRklMVEVSX0RFRklORV9DTEFTUyhsdXQpOworCitzdGF0aWMgaW50IGx1dF9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHJldHVybiAwOworfQorCitERUZJTkVfTFVUX0ZJTFRFUihsdXQsICJDb21wdXRlIGFuZCBhcHBseSBhIGxvb2t1cCB0YWJsZSB0byB0aGUgUkdCL1lVViBpbnB1dCB2aWRlby4iKTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0xVVFlVVl9GSUxURVIKKworI2RlZmluZSBsdXR5dXZfb3B0aW9ucyBvcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MobHV0eXV2KTsKKworc3RhdGljIGF2X2NvbGQgaW50IGx1dHl1dl9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEx1dENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzLT5pc195dXYgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK0RFRklORV9MVVRfRklMVEVSKGx1dHl1diwgIkNvbXB1dGUgYW5kIGFwcGx5IGEgbG9va3VwIHRhYmxlIHRvIHRoZSBZVVYgaW5wdXQgdmlkZW8uIik7CisjZW5kaWYKKworI2lmIENPTkZJR19MVVRSR0JfRklMVEVSCisKKyNkZWZpbmUgbHV0cmdiX29wdGlvbnMgb3B0aW9ucworQVZGSUxURVJfREVGSU5FX0NMQVNTKGx1dHJnYik7CisKK3N0YXRpYyBhdl9jb2xkIGludCBsdXRyZ2JfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBMdXRDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgcy0+aXNfcmdiID0gMTsKKworICAgIHJldHVybiAwOworfQorCitERUZJTkVfTFVUX0ZJTFRFUihsdXRyZ2IsICJDb21wdXRlIGFuZCBhcHBseSBhIGxvb2t1cCB0YWJsZSB0byB0aGUgUkdCIGlucHV0IHZpZGVvLiIpOworI2VuZGlmCisKKyNpZiBDT05GSUdfTkVHQVRFX0ZJTFRFUgorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbmVnYXRlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJuZWdhdGVfYWxwaGEiLCBOVUxMLCBPRkZTRVQobmVnYXRlX2FscGhhKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhuZWdhdGUpOworCitzdGF0aWMgYXZfY29sZCBpbnQgbmVnYXRlX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTHV0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIm5lZ2F0ZV9hbHBoYTolZFxuIiwgcy0+bmVnYXRlX2FscGhhKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgcy0+Y29tcF9leHByX3N0cltpXSA9IGF2X3N0cmR1cCgoaSA9PSAzICYmICFzLT5uZWdhdGVfYWxwaGEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWwiIDogIm5lZ3ZhbCIpOworICAgICAgICBpZiAoIXMtPmNvbXBfZXhwcl9zdHJbaV0pIHsKKyAgICAgICAgICAgIHVuaW5pdChjdHgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitERUZJTkVfTFVUX0ZJTFRFUihuZWdhdGUsICJOZWdhdGUgaW5wdXQgdmlkZW8uIik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2x1dDNkLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfbHV0M2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjJkZGRlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX2x1dDNkLmMKQEAgLTAsMCArMSw4MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2zDqW1lbnQgQsWTc2NoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIDNEIExvb2t1cCB0YWJsZSBmaWx0ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9maWxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJkcmF3dXRpbHMuaCIKKyNpbmNsdWRlICJkdWFsaW5wdXQuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCisjZGVmaW5lIFIgMAorI2RlZmluZSBHIDEKKyNkZWZpbmUgQiAyCisjZGVmaW5lIEEgMworCitlbnVtIGludGVycF9tb2RlIHsKKyAgICBJTlRFUlBPTEFURV9ORUFSRVNULAorICAgIElOVEVSUE9MQVRFX1RSSUxJTkVBUiwKKyAgICBJTlRFUlBPTEFURV9URVRSQUhFRFJBTCwKKyAgICBOQl9JTlRFUlBfTU9ERQorfTsKKworc3RydWN0IHJnYnZlYyB7CisgICAgZmxvYXQgciwgZywgYjsKK307CisKKy8qIDNEIExVVCBkb24ndCBvZnRlbiBnbyB1cCB0byBsZXZlbCAzMiwgYnV0IGl0IGlzIGNvbW1vbiB0byBoYXZlIGEgSGFsZCBDTFVUCisgKiBvZiA1MTJ4NTEyICg2NHg2NHg2NCkgKi8KKyNkZWZpbmUgTUFYX0xFVkVMIDY0CisKK3R5cGVkZWYgc3RydWN0IExVVDNEQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgZW51bSBpbnRlcnBfbW9kZSBpbnRlcnBvbGF0aW9uOworICAgIGNoYXIgKmZpbGU7CisgICAgdWludDhfdCByZ2JhX21hcFs0XTsKKyAgICBpbnQgc3RlcDsKKyAgICBhdmZpbHRlcl9hY3Rpb25fZnVuYyAqaW50ZXJwOworICAgIHN0cnVjdCByZ2J2ZWMgbHV0W01BWF9MRVZFTF1bTUFYX0xFVkVMXVtNQVhfTEVWRUxdOworICAgIGludCBsdXRzaXplOworI2lmIENPTkZJR19IQUxEQ0xVVF9GSUxURVIKKyAgICB1aW50OF90IGNsdXRfcmdiYV9tYXBbNF07CisgICAgaW50IGNsdXRfc3RlcDsKKyAgICBpbnQgY2x1dF9pczE2Yml0OworICAgIGludCBjbHV0X3dpZHRoOworICAgIEZGRHVhbElucHV0Q29udGV4dCBkaW5wdXQ7CisjZW5kaWYKK30gTFVUM0RDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBUaHJlYWREYXRhIHsKKyAgICBBVkZyYW1lICppbiwgKm91dDsKK30gVGhyZWFkRGF0YTsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTFVUM0RDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKyNkZWZpbmUgQ09NTU9OX09QVElPTlMgXAorICAgIHsgImludGVycCIsICJzZWxlY3QgaW50ZXJwb2xhdGlvbiBtb2RlIiwgT0ZGU0VUKGludGVycG9sYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUlOVEVSUE9MQVRFX1RFVFJBSEVEUkFMfSwgMCwgTkJfSU5URVJQX01PREUtMSwgRkxBR1MsICJpbnRlcnBfbW9kZSIgfSwgXAorICAgICAgICB7ICJuZWFyZXN0IiwgICAgICJ1c2UgdmFsdWVzIGZyb20gdGhlIG5lYXJlc3QgZGVmaW5lZCBwb2ludHMiLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1JTlRFUlBPTEFURV9ORUFSRVNUfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiaW50ZXJwX21vZGUiIH0sIFwKKyAgICAgICAgeyAidHJpbGluZWFyIiwgICAiaW50ZXJwb2xhdGUgdmFsdWVzIHVzaW5nIHRoZSA4IHBvaW50cyBkZWZpbmluZyBhIGN1YmUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9SU5URVJQT0xBVEVfVFJJTElORUFSfSwgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImludGVycF9tb2RlIiB9LCBcCisgICAgICAgIHsgInRldHJhaGVkcmFsIiwgImludGVycG9sYXRlIHZhbHVlcyB1c2luZyBhIHRldHJhaGVkcm9uIiwgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUlOVEVSUE9MQVRFX1RFVFJBSEVEUkFMfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJpbnRlcnBfbW9kZSIgfSwgXAorICAgIHsgTlVMTCB9CisKK3N0YXRpYyBpbmxpbmUgZmxvYXQgbGVycGYoZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCBmKQoreworICAgIHJldHVybiB2MCArICh2MSAtIHYwKSAqIGY7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJnYnZlYyBsZXJwKGNvbnN0IHN0cnVjdCByZ2J2ZWMgKnYwLCBjb25zdCBzdHJ1Y3QgcmdidmVjICp2MSwgZmxvYXQgZikKK3sKKyAgICBzdHJ1Y3QgcmdidmVjIHYgPSB7CisgICAgICAgIGxlcnBmKHYwLT5yLCB2MS0+ciwgZiksIGxlcnBmKHYwLT5nLCB2MS0+ZywgZiksIGxlcnBmKHYwLT5iLCB2MS0+YiwgZikKKyAgICB9OworICAgIHJldHVybiB2OworfQorCisjZGVmaW5lIE5FQVIoeCkgKChpbnQpKCh4KSArIC41KSkKKyNkZWZpbmUgUFJFVih4KSAoKGludCkoeCkpCisjZGVmaW5lIE5FWFQoeCkgKEZGTUlOKChpbnQpKHgpICsgMSwgbHV0M2QtPmx1dHNpemUgLSAxKSkKKworLyoqCisgKiBHZXQgdGhlIG5lYXJlc3QgZGVmaW5lZCBwb2ludAorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZ2J2ZWMgaW50ZXJwX25lYXJlc3QoY29uc3QgTFVUM0RDb250ZXh0ICpsdXQzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmdidmVjICpzKQoreworICAgIHJldHVybiBsdXQzZC0+bHV0W05FQVIocy0+cildW05FQVIocy0+ZyldW05FQVIocy0+YildOworfQorCisvKioKKyAqIEludGVycG9sYXRlIHVzaW5nIHRoZSA4IHZlcnRpY2VzIG9mIGEgY3ViZQorICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UcmlsaW5lYXJfaW50ZXJwb2xhdGlvbgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZ2J2ZWMgaW50ZXJwX3RyaWxpbmVhcihjb25zdCBMVVQzRENvbnRleHQgKmx1dDNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJnYnZlYyAqcykKK3sKKyAgICBjb25zdCBpbnQgcHJldltdID0ge1BSRVYocy0+ciksIFBSRVYocy0+ZyksIFBSRVYocy0+Yil9OworICAgIGNvbnN0IGludCBuZXh0W10gPSB7TkVYVChzLT5yKSwgTkVYVChzLT5nKSwgTkVYVChzLT5iKX07CisgICAgY29uc3Qgc3RydWN0IHJnYnZlYyBkID0ge3MtPnIgLSBwcmV2WzBdLCBzLT5nIC0gcHJldlsxXSwgcy0+YiAtIHByZXZbMl19OworICAgIGNvbnN0IHN0cnVjdCByZ2J2ZWMgYzAwMCA9IGx1dDNkLT5sdXRbcHJldlswXV1bcHJldlsxXV1bcHJldlsyXV07CisgICAgY29uc3Qgc3RydWN0IHJnYnZlYyBjMDAxID0gbHV0M2QtPmx1dFtwcmV2WzBdXVtwcmV2WzFdXVtuZXh0WzJdXTsKKyAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMwMTAgPSBsdXQzZC0+bHV0W3ByZXZbMF1dW25leHRbMV1dW3ByZXZbMl1dOworICAgIGNvbnN0IHN0cnVjdCByZ2J2ZWMgYzAxMSA9IGx1dDNkLT5sdXRbcHJldlswXV1bbmV4dFsxXV1bbmV4dFsyXV07CisgICAgY29uc3Qgc3RydWN0IHJnYnZlYyBjMTAwID0gbHV0M2QtPmx1dFtuZXh0WzBdXVtwcmV2WzFdXVtwcmV2WzJdXTsKKyAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMxMDEgPSBsdXQzZC0+bHV0W25leHRbMF1dW3ByZXZbMV1dW25leHRbMl1dOworICAgIGNvbnN0IHN0cnVjdCByZ2J2ZWMgYzExMCA9IGx1dDNkLT5sdXRbbmV4dFswXV1bbmV4dFsxXV1bcHJldlsyXV07CisgICAgY29uc3Qgc3RydWN0IHJnYnZlYyBjMTExID0gbHV0M2QtPmx1dFtuZXh0WzBdXVtuZXh0WzFdXVtuZXh0WzJdXTsKKyAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMwMCAgPSBsZXJwKCZjMDAwLCAmYzEwMCwgZC5yKTsKKyAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMxMCAgPSBsZXJwKCZjMDEwLCAmYzExMCwgZC5yKTsKKyAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMwMSAgPSBsZXJwKCZjMDAxLCAmYzEwMSwgZC5yKTsKKyAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMxMSAgPSBsZXJwKCZjMDExLCAmYzExMSwgZC5yKTsKKyAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMwICAgPSBsZXJwKCZjMDAsICAmYzEwLCAgZC5nKTsKKyAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMxICAgPSBsZXJwKCZjMDEsICAmYzExLCAgZC5nKTsKKyAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMgICAgPSBsZXJwKCZjMCwgICAmYzEsICAgZC5iKTsKKyAgICByZXR1cm4gYzsKK30KKworLyoqCisgKiBUZXRyYWhlZHJhbCBpbnRlcnBvbGF0aW9uLiBCYXNlZCBvbiBjb2RlIGZvdW5kIGluIFRydWVsaWdodCBTb2Z0d2FyZSBMaWJyYXJ5IHBhcGVyLgorICogQHNlZSBodHRwOi8vd3d3LmZpbG1saWdodC5sdGQudWsvcGRmL3doaXRlcGFwZXJzL0ZMLVRMLVROLTAwNTctU29mdHdhcmVMaWIucGRmCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJnYnZlYyBpbnRlcnBfdGV0cmFoZWRyYWwoY29uc3QgTFVUM0RDb250ZXh0ICpsdXQzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJnYnZlYyAqcykKK3sKKyAgICBjb25zdCBpbnQgcHJldltdID0ge1BSRVYocy0+ciksIFBSRVYocy0+ZyksIFBSRVYocy0+Yil9OworICAgIGNvbnN0IGludCBuZXh0W10gPSB7TkVYVChzLT5yKSwgTkVYVChzLT5nKSwgTkVYVChzLT5iKX07CisgICAgY29uc3Qgc3RydWN0IHJnYnZlYyBkID0ge3MtPnIgLSBwcmV2WzBdLCBzLT5nIC0gcHJldlsxXSwgcy0+YiAtIHByZXZbMl19OworICAgIGNvbnN0IHN0cnVjdCByZ2J2ZWMgYzAwMCA9IGx1dDNkLT5sdXRbcHJldlswXV1bcHJldlsxXV1bcHJldlsyXV07CisgICAgY29uc3Qgc3RydWN0IHJnYnZlYyBjMTExID0gbHV0M2QtPmx1dFtuZXh0WzBdXVtuZXh0WzFdXVtuZXh0WzJdXTsKKyAgICBzdHJ1Y3QgcmdidmVjIGM7CisgICAgaWYgKGQuciA+IGQuZykgeworICAgICAgICBpZiAoZC5nID4gZC5iKSB7CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMxMDAgPSBsdXQzZC0+bHV0W25leHRbMF1dW3ByZXZbMV1dW3ByZXZbMl1dOworICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJnYnZlYyBjMTEwID0gbHV0M2QtPmx1dFtuZXh0WzBdXVtuZXh0WzFdXVtwcmV2WzJdXTsKKyAgICAgICAgICAgIGMuciA9ICgxLWQucikgKiBjMDAwLnIgKyAoZC5yLWQuZykgKiBjMTAwLnIgKyAoZC5nLWQuYikgKiBjMTEwLnIgKyAoZC5iKSAqIGMxMTEucjsKKyAgICAgICAgICAgIGMuZyA9ICgxLWQucikgKiBjMDAwLmcgKyAoZC5yLWQuZykgKiBjMTAwLmcgKyAoZC5nLWQuYikgKiBjMTEwLmcgKyAoZC5iKSAqIGMxMTEuZzsKKyAgICAgICAgICAgIGMuYiA9ICgxLWQucikgKiBjMDAwLmIgKyAoZC5yLWQuZykgKiBjMTAwLmIgKyAoZC5nLWQuYikgKiBjMTEwLmIgKyAoZC5iKSAqIGMxMTEuYjsKKyAgICAgICAgfSBlbHNlIGlmIChkLnIgPiBkLmIpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByZ2J2ZWMgYzEwMCA9IGx1dDNkLT5sdXRbbmV4dFswXV1bcHJldlsxXV1bcHJldlsyXV07CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMxMDEgPSBsdXQzZC0+bHV0W25leHRbMF1dW3ByZXZbMV1dW25leHRbMl1dOworICAgICAgICAgICAgYy5yID0gKDEtZC5yKSAqIGMwMDAuciArIChkLnItZC5iKSAqIGMxMDAuciArIChkLmItZC5nKSAqIGMxMDEuciArIChkLmcpICogYzExMS5yOworICAgICAgICAgICAgYy5nID0gKDEtZC5yKSAqIGMwMDAuZyArIChkLnItZC5iKSAqIGMxMDAuZyArIChkLmItZC5nKSAqIGMxMDEuZyArIChkLmcpICogYzExMS5nOworICAgICAgICAgICAgYy5iID0gKDEtZC5yKSAqIGMwMDAuYiArIChkLnItZC5iKSAqIGMxMDAuYiArIChkLmItZC5nKSAqIGMxMDEuYiArIChkLmcpICogYzExMS5iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJnYnZlYyBjMDAxID0gbHV0M2QtPmx1dFtwcmV2WzBdXVtwcmV2WzFdXVtuZXh0WzJdXTsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByZ2J2ZWMgYzEwMSA9IGx1dDNkLT5sdXRbbmV4dFswXV1bcHJldlsxXV1bbmV4dFsyXV07CisgICAgICAgICAgICBjLnIgPSAoMS1kLmIpICogYzAwMC5yICsgKGQuYi1kLnIpICogYzAwMS5yICsgKGQuci1kLmcpICogYzEwMS5yICsgKGQuZykgKiBjMTExLnI7CisgICAgICAgICAgICBjLmcgPSAoMS1kLmIpICogYzAwMC5nICsgKGQuYi1kLnIpICogYzAwMS5nICsgKGQuci1kLmcpICogYzEwMS5nICsgKGQuZykgKiBjMTExLmc7CisgICAgICAgICAgICBjLmIgPSAoMS1kLmIpICogYzAwMC5iICsgKGQuYi1kLnIpICogYzAwMS5iICsgKGQuci1kLmcpICogYzEwMS5iICsgKGQuZykgKiBjMTExLmI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZC5iID4gZC5nKSB7CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMwMDEgPSBsdXQzZC0+bHV0W3ByZXZbMF1dW3ByZXZbMV1dW25leHRbMl1dOworICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJnYnZlYyBjMDExID0gbHV0M2QtPmx1dFtwcmV2WzBdXVtuZXh0WzFdXVtuZXh0WzJdXTsKKyAgICAgICAgICAgIGMuciA9ICgxLWQuYikgKiBjMDAwLnIgKyAoZC5iLWQuZykgKiBjMDAxLnIgKyAoZC5nLWQucikgKiBjMDExLnIgKyAoZC5yKSAqIGMxMTEucjsKKyAgICAgICAgICAgIGMuZyA9ICgxLWQuYikgKiBjMDAwLmcgKyAoZC5iLWQuZykgKiBjMDAxLmcgKyAoZC5nLWQucikgKiBjMDExLmcgKyAoZC5yKSAqIGMxMTEuZzsKKyAgICAgICAgICAgIGMuYiA9ICgxLWQuYikgKiBjMDAwLmIgKyAoZC5iLWQuZykgKiBjMDAxLmIgKyAoZC5nLWQucikgKiBjMDExLmIgKyAoZC5yKSAqIGMxMTEuYjsKKyAgICAgICAgfSBlbHNlIGlmIChkLmIgPiBkLnIpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByZ2J2ZWMgYzAxMCA9IGx1dDNkLT5sdXRbcHJldlswXV1bbmV4dFsxXV1bcHJldlsyXV07CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmdidmVjIGMwMTEgPSBsdXQzZC0+bHV0W3ByZXZbMF1dW25leHRbMV1dW25leHRbMl1dOworICAgICAgICAgICAgYy5yID0gKDEtZC5nKSAqIGMwMDAuciArIChkLmctZC5iKSAqIGMwMTAuciArIChkLmItZC5yKSAqIGMwMTEuciArIChkLnIpICogYzExMS5yOworICAgICAgICAgICAgYy5nID0gKDEtZC5nKSAqIGMwMDAuZyArIChkLmctZC5iKSAqIGMwMTAuZyArIChkLmItZC5yKSAqIGMwMTEuZyArIChkLnIpICogYzExMS5nOworICAgICAgICAgICAgYy5iID0gKDEtZC5nKSAqIGMwMDAuYiArIChkLmctZC5iKSAqIGMwMTAuYiArIChkLmItZC5yKSAqIGMwMTEuYiArIChkLnIpICogYzExMS5iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJnYnZlYyBjMDEwID0gbHV0M2QtPmx1dFtwcmV2WzBdXVtuZXh0WzFdXVtwcmV2WzJdXTsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByZ2J2ZWMgYzExMCA9IGx1dDNkLT5sdXRbbmV4dFswXV1bbmV4dFsxXV1bcHJldlsyXV07CisgICAgICAgICAgICBjLnIgPSAoMS1kLmcpICogYzAwMC5yICsgKGQuZy1kLnIpICogYzAxMC5yICsgKGQuci1kLmIpICogYzExMC5yICsgKGQuYikgKiBjMTExLnI7CisgICAgICAgICAgICBjLmcgPSAoMS1kLmcpICogYzAwMC5nICsgKGQuZy1kLnIpICogYzAxMC5nICsgKGQuci1kLmIpICogYzExMC5nICsgKGQuYikgKiBjMTExLmc7CisgICAgICAgICAgICBjLmIgPSAoMS1kLmcpICogYzAwMC5iICsgKGQuZy1kLnIpICogYzAxMC5iICsgKGQuci1kLmIpICogYzExMC5iICsgKGQuYikgKiBjMTExLmI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGM7Cit9CisKKyNkZWZpbmUgREVGSU5FX0lOVEVSUF9GVU5DKG5hbWUsIG5iaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IGludGVycF8jI25iaXRzIyNfIyNuYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeCwgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgTFVUM0RDb250ZXh0ICpsdXQzZCA9IGN0eC0+cHJpdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IFRocmVhZERhdGEgKnRkID0gYXJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBBVkZyYW1lICppbiAgPSB0ZC0+aW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBkaXJlY3QgPSBvdXQgPT0gaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgc3RlcCA9IGx1dDNkLT5zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCByID0gbHV0M2QtPnJnYmFfbWFwW1JdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4X3QgZyA9IGx1dDNkLT5yZ2JhX21hcFtHXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OF90IGIgPSBsdXQzZC0+cmdiYV9tYXBbQl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCBhID0gbHV0M2QtPnJnYmFfbWFwW0FdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChpbi0+aGVpZ2h0ICogIGpvYm5yICAgKSAvIG5iX2pvYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kICAgPSAoaW4tPmhlaWdodCAqIChqb2JucisxKSkgLyBuYl9qb2JzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCAgICAgICAqZHN0cm93ID0gb3V0LT5kYXRhWzBdICsgc2xpY2Vfc3RhcnQgKiBvdXQtPmxpbmVzaXplWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3JvdyA9IGluIC0+ZGF0YVswXSArIHNsaWNlX3N0YXJ0ICogaW4gLT5saW5lc2l6ZVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBmbG9hdCBzY2FsZSA9ICgxLiAvICgoMTw8bmJpdHMpIC0gMSkpICogKGx1dDNkLT5sdXRzaXplIC0gMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludCMjbmJpdHMjI190ICpkc3QgPSAodWludCMjbmJpdHMjI190ICopZHN0cm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQjI25iaXRzIyNfdCAqc3JjID0gKGNvbnN0IHVpbnQjI25iaXRzIyNfdCAqKXNyY3JvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW4tPndpZHRoICogc3RlcDsgeCArPSBzdGVwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByZ2J2ZWMgc2NhbGVkX3JnYiA9IHtzcmNbeCArIHJdICogc2NhbGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3ggKyBnXSAqIHNjYWxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1t4ICsgYl0gKiBzY2FsZX07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0cnVjdCByZ2J2ZWMgdmVjID0gaW50ZXJwXyMjbmFtZShsdXQzZCwgJnNjYWxlZF9yZ2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbeCArIHJdID0gYXZfY2xpcF91aW50IyNuYml0cyh2ZWMuciAqIChmbG9hdCkoKDE8PG5iaXRzKSAtIDEpKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W3ggKyBnXSA9IGF2X2NsaXBfdWludCMjbmJpdHModmVjLmcgKiAoZmxvYXQpKCgxPDxuYml0cykgLSAxKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4ICsgYl0gPSBhdl9jbGlwX3VpbnQjI25iaXRzKHZlYy5iICogKGZsb2F0KSgoMTw8bmJpdHMpIC0gMSkpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIWRpcmVjdCAmJiBzdGVwID09IDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFt4ICsgYV0gPSBzcmNbeCArIGFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdHJvdyArPSBvdXQtPmxpbmVzaXplWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmNyb3cgKz0gaW4gLT5saW5lc2l6ZVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitERUZJTkVfSU5URVJQX0ZVTkMobmVhcmVzdCwgICAgIDgpCitERUZJTkVfSU5URVJQX0ZVTkModHJpbGluZWFyLCAgIDgpCitERUZJTkVfSU5URVJQX0ZVTkModGV0cmFoZWRyYWwsIDgpCisKK0RFRklORV9JTlRFUlBfRlVOQyhuZWFyZXN0LCAgICAgMTYpCitERUZJTkVfSU5URVJQX0ZVTkModHJpbGluZWFyLCAgIDE2KQorREVGSU5FX0lOVEVSUF9GVU5DKHRldHJhaGVkcmFsLCAxNikKKworI2RlZmluZSBNQVhfTElORV9TSVpFIDUxMgorCitzdGF0aWMgaW50IHNraXBfbGluZShjb25zdCBjaGFyICpwKQoreworICAgIHdoaWxlICgqcCAmJiBhdl9pc3NwYWNlKCpwKSkKKyAgICAgICAgcCsrOworICAgIHJldHVybiAhKnAgfHwgKnAgPT0gJyMnOworfQorCisjZGVmaW5lIE5FWFRfTElORShsb29wX2NvbmQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuZXhwZWN0ZWQgRU9GXG4iKTsgICAgICBcCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlIChsb29wX2NvbmQpCisKKy8qIEJhc2ljYWxseSByIGcgYW5kIGIgZmxvYXQgdmFsdWVzIG9uIGVhY2ggbGluZSwgd2l0aCBhIGZhY3VsdGF0aXZlIDNETFVUU0laRQorICogZGlyZWN0aXZlOyBzZWVtcyB0byBiZSBnZW5lcmF0ZWQgYnkgRGF2aW5jaSAqLworc3RhdGljIGludCBwYXJzZV9kYXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEZJTEUgKmYpCit7CisgICAgTFVUM0RDb250ZXh0ICpsdXQzZCA9IGN0eC0+cHJpdjsKKyAgICBjaGFyIGxpbmVbTUFYX0xJTkVfU0laRV07CisgICAgaW50IGksIGosIGssIHNpemU7CisKKyAgICBsdXQzZC0+bHV0c2l6ZSA9IHNpemUgPSAzMzsKKworICAgIE5FWFRfTElORShza2lwX2xpbmUobGluZSkpOworICAgIGlmICghc3RybmNtcChsaW5lLCAiM0RMVVRTSVpFICIsIDEwKSkgeworICAgICAgICBzaXplID0gc3RydG9sKGxpbmUgKyAxMCwgTlVMTCwgMCk7CisgICAgICAgIGlmIChzaXplIDwgMiB8fCBzaXplID4gTUFYX0xFVkVMKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb28gbGFyZ2Ugb3IgaW52YWxpZCAzRCBMVVQgc2l6ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGx1dDNkLT5sdXRzaXplID0gc2l6ZTsKKyAgICAgICAgTkVYVF9MSU5FKHNraXBfbGluZShsaW5lKSk7CisgICAgfQorICAgIGZvciAoayA9IDA7IGsgPCBzaXplOyBrKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHN0cnVjdCByZ2J2ZWMgKnZlYyA9ICZsdXQzZC0+bHV0W2tdW2pdW2ldOworICAgICAgICAgICAgICAgIGlmIChrICE9IDAgfHwgaiAhPSAwIHx8IGkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9MSU5FKHNraXBfbGluZShsaW5lKSk7CisgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiJWYgJWYgJWYiLCAmdmVjLT5yLCAmdmVjLT5nLCAmdmVjLT5iKSAhPSAzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogSXJpZGFzIGZvcm1hdCAqLworc3RhdGljIGludCBwYXJzZV9jdWJlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBGSUxFICpmKQoreworICAgIExVVDNEQ29udGV4dCAqbHV0M2QgPSBjdHgtPnByaXY7CisgICAgY2hhciBsaW5lW01BWF9MSU5FX1NJWkVdOworICAgIGZsb2F0IG1pblszXSA9IHswLjAsIDAuMCwgMC4wfTsKKyAgICBmbG9hdCBtYXhbM10gPSB7MS4wLCAxLjAsIDEuMH07CisKKyAgICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkgeworICAgICAgICBpZiAoIXN0cm5jbXAobGluZSwgIkxVVF8zRF9TSVpFICIsIDEyKSkgeworICAgICAgICAgICAgaW50IGksIGosIGs7CisgICAgICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IHN0cnRvbChsaW5lICsgMTIsIE5VTEwsIDApOworCisgICAgICAgICAgICBpZiAoc2l6ZSA8IDIgfHwgc2l6ZSA+IE1BWF9MRVZFTCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBsYXJnZSBvciBpbnZhbGlkIDNEIExVVCBzaXplXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHV0M2QtPmx1dHNpemUgPSBzaXplOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNpemU7IGsrKykgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJnYnZlYyAqdmVjID0gJmx1dDNkLT5sdXRbaV1bal1ba107CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVhUX0xJTkUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKGxpbmUsICJET01BSU5fIiwgNykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnZhbHMgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAgICAgICghc3RybmNtcChsaW5lICsgNywgIk1JTiAiLCA0KSkgdmFscyA9IG1pbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAobGluZSArIDcsICJNQVggIiwgNCkpIHZhbHMgPSBtYXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYobGluZSArIDExLCAiJWYgJWYgJWYiLCB2YWxzLCB2YWxzICsgMSwgdmFscyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJtaW46ICVmICVmICVmIHwgbWF4OiAlZiAlZiAlZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblswXSwgbWluWzFdLCBtaW5bMl0sIG1heFswXSwgbWF4WzFdLCBtYXhbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChza2lwX2xpbmUobGluZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiJWYgJWYgJWYiLCAmdmVjLT5yLCAmdmVjLT5nLCAmdmVjLT5iKSAhPSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgdmVjLT5yICo9IG1heFswXSAtIG1pblswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlYy0+ZyAqPSBtYXhbMV0gLSBtaW5bMV07CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWMtPmIgKj0gbWF4WzJdIC0gbWluWzJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEFzc3VtZSAxN3gxN3gxNyBMVVQgd2l0aCBhIDE2LWJpdCBkZXB0aAorICogRklYTUU6IGl0IHNlZW1zIHRoZXJlIGFyZSB2YXJpb3VzIDNkbCBmb3JtYXRzICovCitzdGF0aWMgaW50IHBhcnNlXzNkbChBVkZpbHRlckNvbnRleHQgKmN0eCwgRklMRSAqZikKK3sKKyAgICBjaGFyIGxpbmVbTUFYX0xJTkVfU0laRV07CisgICAgTFVUM0RDb250ZXh0ICpsdXQzZCA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgaiwgazsKKyAgICBjb25zdCBpbnQgc2l6ZSA9IDE3OworICAgIGNvbnN0IGZsb2F0IHNjYWxlID0gMTYqMTYqMTY7CisKKyAgICBsdXQzZC0+bHV0c2l6ZSA9IHNpemU7CisgICAgTkVYVF9MSU5FKHNraXBfbGluZShsaW5lKSk7CisgICAgZm9yIChrID0gMDsgayA8IHNpemU7IGsrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHIsIGcsIGI7CisgICAgICAgICAgICAgICAgc3RydWN0IHJnYnZlYyAqdmVjID0gJmx1dDNkLT5sdXRba11bal1baV07CisKKyAgICAgICAgICAgICAgICBORVhUX0xJTkUoc2tpcF9saW5lKGxpbmUpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKGxpbmUsICIlZCAlZCAlZCIsICZyLCAmZywgJmIpICE9IDMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHZlYy0+ciA9IHIgLyBzY2FsZTsKKyAgICAgICAgICAgICAgICB2ZWMtPmcgPSBnIC8gc2NhbGU7CisgICAgICAgICAgICAgICAgdmVjLT5iID0gYiAvIHNjYWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBQYW5kb3JhIGZvcm1hdCAqLworc3RhdGljIGludCBwYXJzZV9tM2QoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEZJTEUgKmYpCit7CisgICAgTFVUM0RDb250ZXh0ICpsdXQzZCA9IGN0eC0+cHJpdjsKKyAgICBmbG9hdCBzY2FsZTsKKyAgICBpbnQgaSwgaiwgaywgc2l6ZSwgaW4gPSAtMSwgb3V0ID0gLTE7CisgICAgY2hhciBsaW5lW01BWF9MSU5FX1NJWkVdOworICAgIHVpbnQ4X3QgcmdiX21hcFszXSA9IHswLCAxLCAyfTsKKworICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpKSB7CisgICAgICAgIGlmICAgICAgKCFzdHJuY21wKGxpbmUsICJpbiIsICAyKSkgaW4gID0gc3RydG9sKGxpbmUgKyAyLCBOVUxMLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAobGluZSwgIm91dCIsIDMpKSBvdXQgPSBzdHJ0b2wobGluZSArIDMsIE5VTEwsIDApOworICAgICAgICBlbHNlIGlmICghc3RybmNtcChsaW5lLCAidmFsdWVzIiwgNikpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBsaW5lICsgNjsKKyNkZWZpbmUgU0VUX0NPTE9SKGlkKSBkbyB7ICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlIChhdl9pc3NwYWNlKCpwKSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHArKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzd2l0Y2ggKCpwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgJ3InOiByZ2JfbWFwW2lkXSA9IDA7IGJyZWFrOyAgICAgICBcCisgICAgY2FzZSAnZyc6IHJnYl9tYXBbaWRdID0gMTsgYnJlYWs7ICAgICAgIFwKKyAgICBjYXNlICdiJzogcmdiX21hcFtpZF0gPSAyOyBicmVhazsgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKCpwICYmICFhdl9pc3NwYWNlKCpwKSkgICAgICAgICAgIFwKKyAgICAgICAgcCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyAgICAgICAgICAgIFNFVF9DT0xPUigwKTsKKyAgICAgICAgICAgIFNFVF9DT0xPUigxKTsKKyAgICAgICAgICAgIFNFVF9DT0xPUigyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluID09IC0xIHx8IG91dCA9PSAtMSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbiBhbmQgb3V0IG11c3QgYmUgZGVmaW5lZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoaW4gPCAyIHx8IG91dCA8IDIgfHwKKyAgICAgICAgaW4gID4gTUFYX0xFVkVMKk1BWF9MRVZFTCpNQVhfTEVWRUwgfHwKKyAgICAgICAgb3V0ID4gTUFYX0xFVkVMKk1BWF9MRVZFTCpNQVhfTEVWRUwpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBpbiAoJWQpIG9yIG91dCAoJWQpXG4iLCBpbiwgb3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGZvciAoc2l6ZSA9IDE7IHNpemUqc2l6ZSpzaXplIDwgaW47IHNpemUrKyk7CisgICAgbHV0M2QtPmx1dHNpemUgPSBzaXplOworICAgIHNjYWxlID0gMS4gLyAob3V0IC0gMSk7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcmdidmVjICp2ZWMgPSAmbHV0M2QtPmx1dFtrXVtqXVtpXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB2YWxbM107CisKKyAgICAgICAgICAgICAgICBORVhUX0xJTkUoMCk7CisgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiJWYgJWYgJWYiLCB2YWwsIHZhbCArIDEsIHZhbCArIDIpICE9IDMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHZlYy0+ciA9IHZhbFtyZ2JfbWFwWzBdXSAqIHNjYWxlOworICAgICAgICAgICAgICAgIHZlYy0+ZyA9IHZhbFtyZ2JfbWFwWzFdXSAqIHNjYWxlOworICAgICAgICAgICAgICAgIHZlYy0+YiA9IHZhbFtyZ2JfbWFwWzJdXSAqIHNjYWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfaWRlbnRpdHlfbWF0cml4KExVVDNEQ29udGV4dCAqbHV0M2QsIGludCBzaXplKQoreworICAgIGludCBpLCBqLCBrOworICAgIGNvbnN0IGZsb2F0IGMgPSAxLiAvIChzaXplIC0gMSk7CisKKyAgICBsdXQzZC0+bHV0c2l6ZSA9IHNpemU7CisgICAgZm9yIChrID0gMDsgayA8IHNpemU7IGsrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHJnYnZlYyAqdmVjID0gJmx1dDNkLT5sdXRba11bal1baV07CisgICAgICAgICAgICAgICAgdmVjLT5yID0gayAqIGM7CisgICAgICAgICAgICAgICAgdmVjLT5nID0gaiAqIGM7CisgICAgICAgICAgICAgICAgdmVjLT5iID0gaSAqIGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfUkdCMjQsICBBVl9QSVhfRk1UX0JHUjI0LAorICAgICAgICBBVl9QSVhfRk1UX1JHQkEsICAgQVZfUElYX0ZNVF9CR1JBLAorICAgICAgICBBVl9QSVhfRk1UX0FSR0IsICAgQVZfUElYX0ZNVF9BQkdSLAorICAgICAgICBBVl9QSVhfRk1UXzBSR0IsICAgQVZfUElYX0ZNVF8wQkdSLAorICAgICAgICBBVl9QSVhfRk1UX1JHQjAsICAgQVZfUElYX0ZNVF9CR1IwLAorICAgICAgICBBVl9QSVhfRk1UX1JHQjQ4LCAgQVZfUElYX0ZNVF9CR1I0OCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0JBNjQsIEFWX1BJWF9GTVRfQkdSQTY0LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgaW50IGlzMTZiaXQgPSAwOworICAgIExVVDNEQ29udGV4dCAqbHV0M2QgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKworICAgIHN3aXRjaCAoaW5saW5rLT5mb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDg6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE2NDoKKyAgICAgICAgaXMxNmJpdCA9IDE7CisgICAgfQorCisgICAgZmZfZmlsbF9yZ2JhX21hcChsdXQzZC0+cmdiYV9tYXAsIGlubGluay0+Zm9ybWF0KTsKKyAgICBsdXQzZC0+c3RlcCA9IGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoZGVzYykgPj4gKDMgKyBpczE2Yml0KTsKKworI2RlZmluZSBTRVRfRlVOQyhuYW1lKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGlzMTZiaXQpIGx1dDNkLT5pbnRlcnAgPSBpbnRlcnBfMTZfIyNuYW1lOyAgICAgIFwKKyAgICBlbHNlICAgICAgICAgbHV0M2QtPmludGVycCA9IGludGVycF84XyMjbmFtZTsgICAgICAgXAorfSB3aGlsZSAoMCkKKworICAgIHN3aXRjaCAobHV0M2QtPmludGVycG9sYXRpb24pIHsKKyAgICBjYXNlIElOVEVSUE9MQVRFX05FQVJFU1Q6ICAgICBTRVRfRlVOQyhuZWFyZXN0KTsgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URVJQT0xBVEVfVFJJTElORUFSOiAgIFNFVF9GVU5DKHRyaWxpbmVhcik7ICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFUlBPTEFURV9URVRSQUhFRFJBTDogU0VUX0ZVTkModGV0cmFoZWRyYWwpOyAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQVZGcmFtZSAqYXBwbHlfbHV0KEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIExVVDNEQ29udGV4dCAqbHV0M2QgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gaW5saW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0OworICAgIFRocmVhZERhdGEgdGQ7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0KKworICAgIHRkLmluICA9IGluOworICAgIHRkLm91dCA9IG91dDsKKyAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgbHV0M2QtPmludGVycCwgJnRkLCBOVUxMLCBGRk1JTihvdXRsaW5rLT5oLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisKKyAgICBpZiAob3V0ICE9IGluKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gaW5saW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0ID0gYXBwbHlfbHV0KGlubGluaywgaW4pOworICAgIGlmICghb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworI2lmIENPTkZJR19MVVQzRF9GSUxURVIKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBsdXQzZF9vcHRpb25zW10gPSB7CisgICAgeyAiZmlsZSIsICJzZXQgM0QgTFVUIGZpbGUgbmFtZSIsIE9GRlNFVChmaWxlKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICBDT01NT05fT1BUSU9OUworfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGx1dDNkKTsKKworc3RhdGljIGF2X2NvbGQgaW50IGx1dDNkX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IHJldDsKKyAgICBGSUxFICpmOworICAgIGNvbnN0IGNoYXIgKmV4dDsKKyAgICBMVVQzRENvbnRleHQgKmx1dDNkID0gY3R4LT5wcml2OworCisgICAgaWYgKCFsdXQzZC0+ZmlsZSkgeworICAgICAgICBzZXRfaWRlbnRpdHlfbWF0cml4KGx1dDNkLCAzMik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGYgPSBmb3BlbihsdXQzZC0+ZmlsZSwgInIiKTsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIiVzOiAlc1xuIiwgbHV0M2QtPmZpbGUsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZXh0ID0gc3RycmNocihsdXQzZC0+ZmlsZSwgJy4nKTsKKyAgICBpZiAoIWV4dCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gZ3Vlc3MgdGhlIGZvcm1hdCBmcm9tIHRoZSBleHRlbnNpb25cbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZXh0Kys7CisKKyAgICBpZiAoIWF2X3N0cmNhc2VjbXAoZXh0LCAiZGF0IikpIHsKKyAgICAgICAgcmV0ID0gcGFyc2VfZGF0KGN0eCwgZik7CisgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChleHQsICIzZGwiKSkgeworICAgICAgICByZXQgPSBwYXJzZV8zZGwoY3R4LCBmKTsKKyAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGV4dCwgImN1YmUiKSkgeworICAgICAgICByZXQgPSBwYXJzZV9jdWJlKGN0eCwgZik7CisgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChleHQsICJtM2QiKSkgeworICAgICAgICByZXQgPSBwYXJzZV9tM2QoY3R4LCBmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnJlY29nbml6ZWQgJy4lcycgZmlsZSB0eXBlXG4iLCBleHQpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKCFyZXQgJiYgIWx1dDNkLT5sdXRzaXplKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIjNEIExVVCBpcyBlbXB0eVxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCitlbmQ6CisgICAgZmNsb3NlKGYpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBsdXQzZF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGx1dDNkX291dHB1dHNbXSA9IHsKKyAgICAgeworICAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgfSwKKyAgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2x1dDNkID0geworICAgIC5uYW1lICAgICAgICAgID0gImx1dDNkIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBZGp1c3QgY29sb3JzIHVzaW5nIGEgM0QgTFVULiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKExVVDNEQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSBsdXQzZF9pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGx1dDNkX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGx1dDNkX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmbHV0M2RfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQyB8IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19IQUxEQ0xVVF9GSUxURVIKKworc3RhdGljIHZvaWQgdXBkYXRlX2NsdXQoTFVUM0RDb250ZXh0ICpsdXQzZCwgY29uc3QgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGZyYW1lLT5kYXRhWzBdOworICAgIGNvbnN0IGludCBsaW5lc2l6ZSAgPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgY29uc3QgaW50IHcgPSBsdXQzZC0+Y2x1dF93aWR0aDsKKyAgICBjb25zdCBpbnQgc3RlcCA9IGx1dDNkLT5jbHV0X3N0ZXA7CisgICAgY29uc3QgdWludDhfdCAqcmdiYV9tYXAgPSBsdXQzZC0+Y2x1dF9yZ2JhX21hcDsKKyAgICBjb25zdCBpbnQgbGV2ZWwgPSBsdXQzZC0+bHV0c2l6ZTsKKworI2RlZmluZSBMT0FEX0NMVVQobmJpdHMpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBqLCBrLCB4ID0gMCwgeSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoayA9IDA7IGsgPCBsZXZlbDsgaysrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGV2ZWw7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxldmVsOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQjI25iaXRzIyNfdCAqc3JjID0gKGNvbnN0IHVpbnQjI25iaXRzIyNfdCAqKSAgXAorICAgICAgICAgICAgICAgICAgICAoZGF0YSArIHkqbGluZXNpemUgKyB4KnN0ZXApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCByZ2J2ZWMgKnZlYyA9ICZsdXQzZC0+bHV0W2ldW2pdW2tdOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHZlYy0+ciA9IHNyY1tyZ2JhX21hcFswXV0gLyAoZmxvYXQpKCgxPDwobmJpdHMpKSAtIDEpOyAgXAorICAgICAgICAgICAgICAgIHZlYy0+ZyA9IHNyY1tyZ2JhX21hcFsxXV0gLyAoZmxvYXQpKCgxPDwobmJpdHMpKSAtIDEpOyAgXAorICAgICAgICAgICAgICAgIHZlYy0+YiA9IHNyY1tyZ2JhX21hcFsyXV0gLyAoZmxvYXQpKCgxPDwobmJpdHMpKSAtIDEpOyAgXAorICAgICAgICAgICAgICAgIGlmICgrK3ggPT0gdykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB5Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworICAgIGlmICghbHV0M2QtPmNsdXRfaXMxNmJpdCkgTE9BRF9DTFVUKDgpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgTE9BRF9DTFVUKDE2KTsKK30KKworCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIExVVDNEQ29udGV4dCAqbHV0M2QgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIG91dGxpbmstPncgPSBjdHgtPmlucHV0c1swXS0+dzsKKyAgICBvdXRsaW5rLT5oID0gY3R4LT5pbnB1dHNbMF0tPmg7CisgICAgb3V0bGluay0+dGltZV9iYXNlID0gY3R4LT5pbnB1dHNbMF0tPnRpbWVfYmFzZTsKKyAgICBpZiAoKHJldCA9IGZmX2R1YWxpbnB1dF9pbml0KGN0eCwgJmx1dDNkLT5kaW5wdXQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lX2hhbGQoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucGljcmVmKQoreworICAgIExVVDNEQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIHJldHVybiBmZl9kdWFsaW5wdXRfZmlsdGVyX2ZyYW1lKCZzLT5kaW5wdXQsIGlubGluaywgaW5waWNyZWYpOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIExVVDNEQ29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKKyAgICByZXR1cm4gZmZfZHVhbGlucHV0X3JlcXVlc3RfZnJhbWUoJnMtPmRpbnB1dCwgb3V0bGluayk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2NsdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgaW50IHNpemUsIGxldmVsLCB3LCBoOworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgTFVUM0RDb250ZXh0ICpsdXQzZCA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKworICAgIGx1dDNkLT5jbHV0X2lzMTZiaXQgPSAwOworICAgIHN3aXRjaCAoaW5saW5rLT5mb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDg6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE2NDoKKyAgICAgICAgbHV0M2QtPmNsdXRfaXMxNmJpdCA9IDE7CisgICAgfQorCisgICAgbHV0M2QtPmNsdXRfc3RlcCA9IGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoZGVzYykgPj4gMzsKKyAgICBmZl9maWxsX3JnYmFfbWFwKGx1dDNkLT5jbHV0X3JnYmFfbWFwLCBpbmxpbmstPmZvcm1hdCk7CisKKyAgICBpZiAoaW5saW5rLT53ID4gaW5saW5rLT5oKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlBhZGRpbmcgb24gdGhlIHJpZ2h0ICglZHB4KSBvZiB0aGUgIgorICAgICAgICAgICAgICAgIkhhbGQgQ0xVVCB3aWxsIGJlIGlnbm9yZWRcbiIsIGlubGluay0+dyAtIGlubGluay0+aCk7CisgICAgZWxzZSBpZiAoaW5saW5rLT53IDwgaW5saW5rLT5oKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlBhZGRpbmcgYXQgdGhlIGJvdHRvbSAoJWRweCkgb2YgdGhlICIKKyAgICAgICAgICAgICAgICJIYWxkIENMVVQgd2lsbCBiZSBpZ25vcmVkXG4iLCBpbmxpbmstPmggLSBpbmxpbmstPncpOworICAgIGx1dDNkLT5jbHV0X3dpZHRoID0gdyA9IGggPSBGRk1JTihpbmxpbmstPncsIGlubGluay0+aCk7CisKKyAgICBmb3IgKGxldmVsID0gMTsgbGV2ZWwqbGV2ZWwqbGV2ZWwgPCB3OyBsZXZlbCsrKTsKKyAgICBzaXplID0gbGV2ZWwqbGV2ZWwqbGV2ZWw7CisgICAgaWYgKHNpemUgIT0gdykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIlRoZSBIYWxkIENMVVQgd2lkdGggZG9lcyBub3QgbWF0Y2ggdGhlIGxldmVsXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2X2Fzc2VydDAodyA9PSBoICYmIHcgPT0gc2l6ZSk7CisgICAgbGV2ZWwgKj0gbGV2ZWw7CisgICAgaWYgKGxldmVsID4gTUFYX0xFVkVMKSB7CisgICAgICAgIGNvbnN0IGludCBtYXhfY2x1dF9sZXZlbCA9IHNxcnQoTUFYX0xFVkVMKTsKKyAgICAgICAgY29uc3QgaW50IG1heF9jbHV0X3NpemUgID0gbWF4X2NsdXRfbGV2ZWwqbWF4X2NsdXRfbGV2ZWwqbWF4X2NsdXRfbGV2ZWw7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBsYXJnZSBIYWxkIENMVVQgIgorICAgICAgICAgICAgICAgIihtYXhpbXVtIGxldmVsIGlzICVkLCBvciAlZHglZCBDTFVUKVxuIiwKKyAgICAgICAgICAgICAgIG1heF9jbHV0X2xldmVsLCBtYXhfY2x1dF9zaXplLCBtYXhfY2x1dF9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgbHV0M2QtPmx1dHNpemUgPSBsZXZlbDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQVZGcmFtZSAqdXBkYXRlX2FwcGx5X2NsdXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKm1haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqc2Vjb25kKQoreworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgdXBkYXRlX2NsdXQoY3R4LT5wcml2LCBzZWNvbmQpOworICAgIHJldHVybiBhcHBseV9sdXQoaW5saW5rLCBtYWluKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGhhbGRjbHV0X2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTFVUM0RDb250ZXh0ICpsdXQzZCA9IGN0eC0+cHJpdjsKKyAgICBsdXQzZC0+ZGlucHV0LnByb2Nlc3MgPSB1cGRhdGVfYXBwbHlfY2x1dDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBoYWxkY2x1dF91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTFVUM0RDb250ZXh0ICpsdXQzZCA9IGN0eC0+cHJpdjsKKyAgICBmZl9kdWFsaW5wdXRfdW5pbml0KCZsdXQzZC0+ZGlucHV0KTsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGhhbGRjbHV0X29wdGlvbnNbXSA9IHsKKyAgICB7ICJzaG9ydGVzdCIsICAgImZvcmNlIHRlcm1pbmF0aW9uIHdoZW4gdGhlIHNob3J0ZXN0IGlucHV0IHRlcm1pbmF0ZXMiLCBPRkZTRVQoZGlucHV0LnNob3J0ZXN0KSwgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJyZXBlYXRsYXN0IiwgImNvbnRpbnVlIGFwcGx5aW5nIHRoZSBsYXN0IGNsdXQgYWZ0ZXIgZW9zIiwgICAgICAgICAgICBPRkZTRVQoZGlucHV0LnJlcGVhdGxhc3QpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgMSwgRkxBR1MgfSwKKyAgICBDT01NT05fT1BUSU9OUworfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGhhbGRjbHV0KTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGhhbGRjbHV0X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJtYWluIiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZV9oYWxkLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0seworICAgICAgICAubmFtZSAgICAgICAgID0gImNsdXQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lX2hhbGQsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfY2x1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgaGFsZGNsdXRfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9oYWxkY2x1dCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJoYWxkY2x1dCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQWRqdXN0IGNvbG9ycyB1c2luZyBhIEhhbGQgQ0xVVC4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihMVVQzRENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgID0gaGFsZGNsdXRfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IGhhbGRjbHV0X3VuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBoYWxkY2x1dF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBoYWxkY2x1dF9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmhhbGRjbHV0X2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0lOVEVSTkFMIHwgQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX21jZGVpbnQuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9tY2RlaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhMmUyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9tY2RlaW50LmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1vdGlvbiBDb21wZW5zYXRpb24gRGVpbnRlcmxhY2VyCisgKiBQb3J0ZWQgZnJvbSBNUGxheWVyIGxpYm1wY29kZWNzL3ZmX21jZGVpbnQuYy4KKyAqCisgKiBLbm93biBJc3N1ZXM6CisgKgorICogVGhlIG1vdGlvbiBlc3RpbWF0aW9uIGlzIHNvbWV3aGF0IGF0IHRoZSBtZXJjeSBvZiB0aGUgaW5wdXQsIGlmIHRoZQorICogaW5wdXQgZnJhbWVzIGFyZSBjcmVhdGVkIHB1cmVseSBiYXNlZCBvbiBzcGF0aWFsIGludGVycG9sYXRpb24gdGhlbgorICogZm9yIGV4YW1wbGUgYSB0aGluIGJsYWNrIGxpbmUgb3IgYW5vdGhlciByYW5kb20gYW5kIG5vdAorICogaW50ZXJwb2xhdGVhYmxlIHBhdHRlcm4gd2lsbCBjYXVzZSBwcm9ibGVtcy4KKyAqIE5vdGU6IGNvbXBsZXRlbHkgaWdub3JpbmcgdGhlICJ1bmF2YWlsYWJsZSIgbGluZXMgZHVyaW5nIG1vdGlvbgorICogZXN0aW1hdGlvbiBkaWQgbm90IGxvb2sgYW55IGJldHRlciwgc28gdGhlIG1vc3Qgb2J2aW91cyBzb2x1dGlvbgorICogd291bGQgYmUgdG8gaW1wcm92ZSB0ZmllbGRzIG9yIHBlbmFsaXplIHByb2JsZW1hdGljIG1vdGlvbiB2ZWN0b3JzLgorICoKKyAqIElmIG5vbiBpdGVyYXRpdmUgTUUgaXMgdXNlZCB0aGVuIHNub3cgY3VycmVudGx5IGlnbm9yZXMgdGhlIE9CTUMKKyAqIHdpbmRvdyBhbmQgYXMgYSByZXN1bHQgc29tZXRpbWVzIGNyZWF0ZXMgYXJ0aWZhY3RzLgorICoKKyAqIE9ubHkgcGFzdCBmcmFtZXMgYXJlIHVzZWQsIHdlIHNob3VsZCBpZGVhbGx5IHVzZSBmdXR1cmUgZnJhbWVzIHRvbywKKyAqIHNvbWV0aGluZyBsaWtlIGZpbHRlcmluZyB0aGUgd2hvbGUgbW92aWUgaW4gZm9yd2FyZCBhbmQgdGhlbgorICogYmFja3dhcmQgZGlyZWN0aW9uIHNlZW1zIGxpa2UgYSBpbnRlcmVzdGluZyBpZGVhIGJ1dCB0aGUgY3VycmVudAorICogZmlsdGVyIGZyYW1ld29yayBpcyBGQVIgZnJvbSBzdXBwb3J0aW5nIHN1Y2ggdGhpbmdzLgorICoKKyAqIENvbWJpbmluZyB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGltYWdlIHdpdGggdGhlIGlucHV0IGltYWdlIGFsc28gaXMKKyAqIG5vdCBhcyB0cml2aWFsIGFzIGl0IHNlZW1zLCBzaW1wbGUgYmxpbmRseSB0YWtpbmcgZXZlbiBsaW5lcyBmcm9tCisgKiBvbmUgYW5kIG9kZCBvbmVzIGZyb20gdGhlIG90aGVyIGRvZXMgbm90IHdvcmsgYXQgYWxsIGFzIE1FL01DCisgKiBzb21ldGltZXMgaGFzIG5vdGhpbmcgaW4gdGhlIHByZXZpb3VzIGZyYW1lcyB3aGljaCBtYXRjaGVzIHRoZQorICogY3VycmVudC4gVGhlIGN1cnJlbnQgYWxnb3JpdGhtIGhhcyBiZWVuIGZvdW5kIGJ5IHRyaWFsIGFuZCBlcnJvcgorICogYW5kIGFsbW9zdCBjZXJ0YWlubHkgY2FuIGJlIGltcHJvdmVkLi4uCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2VudW0gTUNEZWludE1vZGUgeworICAgIE1PREVfRkFTVCA9IDAsCisgICAgTU9ERV9NRURJVU0sCisgICAgTU9ERV9TTE9XLAorICAgIE1PREVfRVhUUkFfU0xPVywKKyAgICBNT0RFX05CLAorfTsKKworZW51bSBNQ0RlaW50UGFyaXR5IHsKKyAgICBQQVJJVFlfVEZGICA9ICAwLCAvLy88IHRvcCBmaWVsZCBmaXJzdAorICAgIFBBUklUWV9CRkYgID0gIDEsIC8vLzwgYm90dG9tIGZpZWxkIGZpcnN0Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgZW51bSBNQ0RlaW50TW9kZSBtb2RlOworICAgIGVudW0gTUNEZWludFBhcml0eSBwYXJpdHk7CisgICAgaW50IHFwOworICAgIEFWQ29kZWNDb250ZXh0ICplbmNfY3R4OworfSBNQ0RlaW50Q29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTUNEZWludENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorI2RlZmluZSBDT05TVChuYW1lLCBoZWxwLCB2YWwsIHVuaXQpIHsgbmFtZSwgaGVscCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PXZhbH0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCB1bml0IH0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG1jZGVpbnRfb3B0aW9uc1tdID0geworICAgIHsgIm1vZGUiLCAic2V0IG1vZGUiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9TU9ERV9GQVNUfSwgMCwgTU9ERV9OQi0xLCBGTEFHUywgLnVuaXQ9Im1vZGUiIH0sCisgICAgQ09OU1QoImZhc3QiLCAgICAgICBOVUxMLCBNT0RFX0ZBU1QsICAgICAgICJtb2RlIiksCisgICAgQ09OU1QoIm1lZGl1bSIsICAgICBOVUxMLCBNT0RFX01FRElVTSwgICAgICJtb2RlIiksCisgICAgQ09OU1QoInNsb3ciLCAgICAgICBOVUxMLCBNT0RFX1NMT1csICAgICAgICJtb2RlIiksCisgICAgQ09OU1QoImV4dHJhX3Nsb3ciLCBOVUxMLCBNT0RFX0VYVFJBX1NMT1csICJtb2RlIiksCisKKyAgICB7ICJwYXJpdHkiLCAic2V0IHRoZSBhc3N1bWVkIHBpY3R1cmUgZmllbGQgcGFyaXR5IiwgT0ZGU0VUKHBhcml0eSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UEFSSVRZX0JGRn0sIC0xLCAxLCBGTEFHUywgInBhcml0eSIgfSwKKyAgICBDT05TVCgidGZmIiwgImFzc3VtZSB0b3AgZmllbGQgZmlyc3QiLCAgICBQQVJJVFlfVEZGLCAicGFyaXR5IiksCisgICAgQ09OU1QoImJmZiIsICJhc3N1bWUgYm90dG9tIGZpZWxkIGZpcnN0IiwgUEFSSVRZX0JGRiwgInBhcml0eSIpLAorCisgICAgeyAicXAiLCAic2V0IHFwIiwgT0ZGU0VUKHFwKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKG1jZGVpbnQpOworCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIE1DRGVpbnRDb250ZXh0ICptY2RlaW50ID0gY3R4LT5wcml2OworICAgIEFWQ29kZWMgKmVuYzsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jX2N0eDsKKyAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIShlbmMgPSBhdmNvZGVjX2ZpbmRfZW5jb2RlcihBVl9DT0RFQ19JRF9TTk9XKSkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiU25vdyBlbmNvZGVyIGlzIG5vdCBlbmFibGVkIGluIGxpYmF2Y29kZWNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG1jZGVpbnQtPmVuY19jdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGVuYyk7CisgICAgaWYgKCFtY2RlaW50LT5lbmNfY3R4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGVuY19jdHggPSBtY2RlaW50LT5lbmNfY3R4OworICAgIGVuY19jdHgtPndpZHRoICA9IGlubGluay0+dzsKKyAgICBlbmNfY3R4LT5oZWlnaHQgPSBpbmxpbmstPmg7CisgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gKEFWUmF0aW9uYWwpezEsMjV9OyAgLy8gbWVhbmluZ2xlc3MKKyAgICBlbmNfY3R4LT5nb3Bfc2l6ZSA9IDMwMDsKKyAgICBlbmNfY3R4LT5tYXhfYl9mcmFtZXMgPSAwOworICAgIGVuY19jdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgZW5jX2N0eC0+ZmxhZ3MgPSBDT0RFQ19GTEFHX1FTQ0FMRSB8IENPREVDX0ZMQUdfTE9XX0RFTEFZOworICAgIGVuY19jdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA9IEZGX0NPTVBMSUFOQ0VfRVhQRVJJTUVOVEFMOworICAgIGVuY19jdHgtPmdsb2JhbF9xdWFsaXR5ID0gMTsKKyAgICBlbmNfY3R4LT5tZV9jbXAgPSBlbmNfY3R4LT5tZV9zdWJfY21wID0gRkZfQ01QX1NBRDsKKyAgICBlbmNfY3R4LT5tYl9jbXAgPSBGRl9DTVBfU1NFOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibWVtY19vbmx5IiwgIjEiLCAwKTsKKworICAgIHN3aXRjaCAobWNkZWludC0+bW9kZSkgeworICAgIGNhc2UgTU9ERV9FWFRSQV9TTE9XOgorICAgICAgICBlbmNfY3R4LT5yZWZzID0gMzsKKyAgICBjYXNlIE1PREVfU0xPVzoKKyAgICAgICAgZW5jX2N0eC0+bWVfbWV0aG9kID0gTUVfSVRFUjsKKyAgICBjYXNlIE1PREVfTUVESVVNOgorICAgICAgICBlbmNfY3R4LT5mbGFncyB8PSBDT0RFQ19GTEFHXzRNVjsKKyAgICAgICAgZW5jX2N0eC0+ZGlhX3NpemUgPSAyOworICAgIGNhc2UgTU9ERV9GQVNUOgorICAgICAgICBlbmNfY3R4LT5mbGFncyB8PSBDT0RFQ19GTEFHX1FQRUw7CisgICAgfQorCisgICAgcmV0ID0gYXZjb2RlY19vcGVuMihlbmNfY3R4LCBlbmMsICZvcHRzKTsKKyAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIE1DRGVpbnRDb250ZXh0ICptY2RlaW50ID0gY3R4LT5wcml2OworCisgICAgaWYgKG1jZGVpbnQtPmVuY19jdHgpIHsKKyAgICAgICAgYXZjb2RlY19jbG9zZShtY2RlaW50LT5lbmNfY3R4KTsKKyAgICAgICAgYXZfZnJlZXAoJm1jZGVpbnQtPmVuY19jdHgpOworICAgIH0KK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIFBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5waWMpCit7CisgICAgTUNEZWludENvbnRleHQgKm1jZGVpbnQgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXRwaWMsICpmcmFtZV9kZWM7CisgICAgQVZQYWNrZXQgcGt0OworICAgIGludCB4LCB5LCBpLCByZXQsIGdvdF9mcmFtZSA9IDA7CisKKyAgICBvdXRwaWMgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0cGljKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlucGljKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXRwaWMsIGlucGljKTsKKyAgICBpbnBpYy0+cXVhbGl0eSA9IG1jZGVpbnQtPnFwICogRkZfUVAyTEFNQkRBOworCisgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7CisgICAgcGt0LmRhdGEgPSBOVUxMOyAgICAvLyBwYWNrZXQgZGF0YSB3aWxsIGJlIGFsbG9jYXRlZCBieSB0aGUgZW5jb2RlcgorICAgIHBrdC5zaXplID0gMDsKKworICAgIHJldCA9IGF2Y29kZWNfZW5jb2RlX3ZpZGVvMihtY2RlaW50LT5lbmNfY3R4LCAmcGt0LCBpbnBpYywgJmdvdF9mcmFtZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgZnJhbWVfZGVjID0gbWNkZWludC0+ZW5jX2N0eC0+Y29kZWRfZnJhbWU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGludCBpc19jaHJvbWEgPSAhIWk7CisgICAgICAgIGludCB3ID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT53LCBpc19jaHJvbWEpOworICAgICAgICBpbnQgaCA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwgaXNfY2hyb21hKTsKKyAgICAgICAgaW50IGZpbHMgPSBmcmFtZV9kZWMtPmxpbmVzaXplW2ldOworICAgICAgICBpbnQgc3JjcyA9IGlucGljICAgIC0+bGluZXNpemVbaV07CisgICAgICAgIGludCBkc3RzID0gb3V0cGljICAgLT5saW5lc2l6ZVtpXTsKKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBpZiAoKHkgXiBtY2RlaW50LT5wYXJpdHkpICYgMSkgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZmlscCA9ICZmcmFtZV9kZWMtPmRhdGFbaV1beCArIHkqZmlsc107CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyY3AgPSAmaW5waWMgICAgLT5kYXRhW2ldW3ggKyB5KnNyY3NdOworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RwID0gJm91dHBpYyAgIC0+ZGF0YVtpXVt4ICsgeSpkc3RzXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoeSA+IDAgJiYgeSA8IGgtMSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfZWRnZSA9IHggPCAzIHx8IHggPiB3LTQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlmZjAgPSBmaWxwWy1maWxzXSAtIHNyY3BbLXNyY3NdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpZmYxID0gZmlscFsrZmlsc10gLSBzcmNwWytzcmNzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZW1wID0gZmlscFswXTsKKworI2RlZmluZSBERUxUQShqKSBhdl9jbGlwKGosIC14LCB3LTEteCkKKworI2RlZmluZSBHRVRfU0NPUkVfRURHRShqKVwKKyAgIEZGQUJTKHNyY3BbLXNyY3MrREVMVEEoLTErKGopKV0gLSBzcmNwWytzcmNzK0RFTFRBKC0xLShqKSldKStcCisgICBGRkFCUyhzcmNwWy1zcmNzK0RFTFRBKGopICAgICBdIC0gc3JjcFsrc3JjcytERUxUQSggIC0oaikpXSkrXAorICAgRkZBQlMoc3JjcFstc3JjcytERUxUQSgxKyhqKSkgXSAtIHNyY3BbK3NyY3MrREVMVEEoIDEtKGopKV0pCisKKyNkZWZpbmUgR0VUX1NDT1JFKGopXAorICAgRkZBQlMoc3JjcFstc3Jjcy0xKyhqKV0gLSBzcmNwWytzcmNzLTEtKGopXSkrXAorICAgRkZBQlMoc3JjcFstc3JjcyAgKyhqKV0gLSBzcmNwWytzcmNzICAtKGopXSkrXAorICAgRkZBQlMoc3JjcFstc3JjcysxKyhqKV0gLSBzcmNwWytzcmNzKzEtKGopXSkKKworI2RlZmluZSBDSEVDS19FREdFKGopXAorICAgIHsgICBpbnQgc2NvcmUgPSBHRVRfU0NPUkVfRURHRShqKTtcCisgICAgICAgIGlmIChzY29yZSA8IHNwYXRpYWxfc2NvcmUpe1wKKyAgICAgICAgICAgIHNwYXRpYWxfc2NvcmUgPSBzY29yZTtcCisgICAgICAgICAgICBkaWZmMCA9IGZpbHBbLWZpbHMrREVMVEEoaildICAgIC0gc3JjcFstc3JjcytERUxUQShqKV07XAorICAgICAgICAgICAgZGlmZjEgPSBmaWxwWytmaWxzK0RFTFRBKC0oaikpXSAtIHNyY3BbK3NyY3MrREVMVEEoLShqKSldO1wKKworI2RlZmluZSBDSEVDSyhqKVwKKyAgICB7ICAgaW50IHNjb3JlID0gR0VUX1NDT1JFKGopO1wKKyAgICAgICAgaWYgKHNjb3JlIDwgc3BhdGlhbF9zY29yZSl7XAorICAgICAgICAgICAgc3BhdGlhbF9zY29yZT0gc2NvcmU7XAorICAgICAgICAgICAgZGlmZjAgPSBmaWxwWy1maWxzKyhqKV0gLSBzcmNwWy1zcmNzKyhqKV07XAorICAgICAgICAgICAgZGlmZjEgPSBmaWxwWytmaWxzLShqKV0gLSBzcmNwWytzcmNzLShqKV07XAorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZWRnZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGF0aWFsX3Njb3JlID0gR0VUX1NDT1JFX0VER0UoMCkgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VER0UoLTEpIENIRUNLX0VER0UoLTIpIH19IH19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRURHRSggMSkgQ0hFQ0tfRURHRSggMikgfX0gfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYXRpYWxfc2NvcmUgPSBHRVRfU0NPUkUoMCkgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKC0xKSBDSEVDSygtMikgfX0gfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyggMSkgQ0hFQ0soIDIpIH19IH19CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYwICsgZGlmZjEgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgLT0gKGRpZmYwICsgZGlmZjEgLSBGRkFCUyhGRkFCUyhkaWZmMCkgLSBGRkFCUyhkaWZmMSkpIC8gMikgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgLT0gKGRpZmYwICsgZGlmZjEgKyBGRkFCUyhGRkFCUyhkaWZmMCkgLSBGRkFCUyhkaWZmMSkpIC8gMikgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgKmZpbHAgPSAqZHN0cCA9IHRlbXAgPiAyNTVVID8gfih0ZW1wPj4zMSkgOiB0ZW1wOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRzdHAgPSAqZmlscDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGlmICghKCh5IF4gbWNkZWludC0+cGFyaXR5KSAmIDEpKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBmcmFtZV9kZWMtPmRhdGFbaV1beCArIHkqZmlsc10gPQorICAgICAgICAgICAgICAgICAgICBvdXRwaWMgICAtPmRhdGFbaV1beCArIHkqZHN0c10gPSBpbnBpYy0+ZGF0YVtpXVt4ICsgeSpzcmNzXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbWNkZWludC0+cGFyaXR5IF49IDE7CisKK2VuZDoKKyAgICBhdl9mcmVlX3BhY2tldCgmcGt0KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnBpYyk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0cGljKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXRwaWMpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbWNkZWludF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG1jZGVpbnRfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX21jZGVpbnQgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAibWNkZWludCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgbW90aW9uIGNvbXBlbnNhdGluZyBkZWludGVybGFjaW5nLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKE1DRGVpbnRDb250ZXh0KSwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBtY2RlaW50X2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IG1jZGVpbnRfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZtY2RlaW50X2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9tZXJnZXBsYW5lcy5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX21lcmdlcGxhbmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2ZTgyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9tZXJnZXBsYW5lcy5jCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImZyYW1lc3luYy5oIgorCit0eXBlZGVmIHN0cnVjdCBJbnB1dFBhcmFtIHsKKyAgICBpbnQgZGVwdGhbNF07CisgICAgaW50IG5iX3BsYW5lczsKKyAgICBpbnQgcGxhbmV3aWR0aFs0XTsKKyAgICBpbnQgcGxhbmVoZWlnaHRbNF07Cit9IElucHV0UGFyYW07CisKK3R5cGVkZWYgc3RydWN0IE1lcmdlUGxhbmVzQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50NjRfdCBtYXBwaW5nOworICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBvdXRfZm10OworICAgIGludCBuYl9pbnB1dHM7CisgICAgaW50IG5iX3BsYW5lczsKKyAgICBpbnQgcGxhbmV3aWR0aFs0XTsKKyAgICBpbnQgcGxhbmVoZWlnaHRbNF07CisgICAgaW50IG1hcFs0XVsyXTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKm91dGRlc2M7CisKKyAgICBGRkZyYW1lU3luYyBmczsKKyAgICBGRkZyYW1lU3luY0luIGZzaW5bM107IC8qIG11c3QgYmUgaW1tZWRpYXRlbHkgYWZ0ZXIgZnMgKi8KK30gTWVyZ2VQbGFuZXNDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihNZXJnZVBsYW5lc0NvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG1lcmdlcGxhbmVzX29wdGlvbnNbXSA9IHsKKyAgICB7ICJtYXBwaW5nIiwgInNldCBpbnB1dCB0byBvdXRwdXQgcGxhbmUgbWFwcGluZyIsIE9GRlNFVChtYXBwaW5nKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMHgzMzMzMzMzMywgRkxBR1MgfSwKKyAgICB7ICJmb3JtYXQiLCAic2V0IG91dHB1dCBwaXhlbCBmb3JtYXQiLCBPRkZTRVQob3V0X2ZtdCksIEFWX09QVF9UWVBFX1BJWEVMX0ZNVCwgey5pNjQ9QVZfUElYX0ZNVF9ZVVZBNDQ0UH0sIDAsIElOVF9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MobWVyZ2VwbGFuZXMpOworCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgTWVyZ2VQbGFuZXNDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19maWx0ZXJfZnJhbWUoJnMtPmZzLCBpbmxpbmssIGluKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTWVyZ2VQbGFuZXNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludDY0X3QgbSA9IHMtPm1hcHBpbmc7CisgICAgaW50IGksIHJldDsKKworICAgIHMtPm91dGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHMtPm91dF9mbXQpOworICAgIGlmICghKHMtPm91dGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUikgfHwKKyAgICAgICAgcy0+b3V0ZGVzYy0+bmJfY29tcG9uZW50cyA8IDIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBwbGFuYXIgZm9ybWF0cyB3aXRoIG1vcmUgdGhhbiBvbmUgY29tcG9uZW50IGFyZSBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMocy0+b3V0X2ZtdCk7CisKKyAgICBmb3IgKGkgPSBzLT5uYl9wbGFuZXMgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBzLT5tYXBbaV1bMF0gPSBtICYgMHhmOworICAgICAgICBtID4+PSA0OworICAgICAgICBzLT5tYXBbaV1bMV0gPSBtICYgMHhmOworICAgICAgICBtID4+PSA0OworCisgICAgICAgIGlmIChzLT5tYXBbaV1bMF0gPiAzIHx8IHMtPm1hcFtpXVsxXSA+IDMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk1hcHBpbmcgd2l0aCBvdXQgb2YgcmFuZ2UgaW5wdXQgYW5kL29yIHBsYW5lIG51bWJlci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPm5iX2lucHV0cyA9IEZGTUFYKHMtPm5iX2lucHV0cywgcy0+bWFwW2ldWzFdICsgMSk7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MChzLT5uYl9pbnB1dHMgJiYgcy0+bmJfaW5wdXRzIDw9IDQpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIEFWRmlsdGVyUGFkIHBhZCA9IHsgMCB9OworCisgICAgICAgIHBhZC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICBwYWQubmFtZSA9IGF2X2FzcHJpbnRmKCJpbiVkIiwgaSk7CisgICAgICAgIGlmICghcGFkLm5hbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBwYWQuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lOworCisgICAgICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X2lucGFkKGN0eCwgaSwgJnBhZCkpIDwgMCl7CisgICAgICAgICAgICBhdl9mcmVlcCgmcGFkLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTWVyZ2VQbGFuZXNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICBzLT5vdXRkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzLT5vdXRfZm10KTsKKyAgICBmb3IgKGkgPSAwOyBhdl9waXhfZm10X2Rlc2NfZ2V0KGkpOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpKTsKKyAgICAgICAgaWYgKGRlc2MtPmNvbXBbMF0uZGVwdGhfbWludXMxID09IHMtPm91dGRlc2MtPmNvbXBbMF0uZGVwdGhfbWludXMxICYmCisgICAgICAgICAgICBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhpKSA9PSBkZXNjLT5uYl9jb21wb25lbnRzKQorICAgICAgICAgICAgZmZfYWRkX2Zvcm1hdCgmZm9ybWF0cywgaSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2lucHV0czsgaSsrKQorICAgICAgICBmZl9mb3JtYXRzX3JlZihmb3JtYXRzLCAmY3R4LT5pbnB1dHNbaV0tPm91dF9mb3JtYXRzKTsKKworICAgIGZvcm1hdHMgPSBOVUxMOworICAgIGZmX2FkZF9mb3JtYXQoJmZvcm1hdHMsIHMtPm91dF9mbXQpOworICAgIGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZjdHgtPm91dHB1dHNbMF0tPmluX2Zvcm1hdHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19mcmFtZShGRkZyYW1lU3luYyAqZnMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBmcy0+cGFyZW50OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBNZXJnZVBsYW5lc0NvbnRleHQgKnMgPSBmcy0+b3BhcXVlOworICAgIEFWRnJhbWUgKmluWzRdID0geyBOVUxMIH07CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludCBpLCByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZzLT5mcywgaSwgJmluW2ldLCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG91dC0+cHRzID0gYXZfcmVzY2FsZV9xKHMtPmZzLnB0cywgcy0+ZnMudGltZV9iYXNlLCBvdXRsaW5rLT50aW1lX2Jhc2UpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3BsYW5lczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBpbnB1dCA9IHMtPm1hcFtpXVsxXTsKKyAgICAgICAgY29uc3QgaW50IHBsYW5lID0gcy0+bWFwW2ldWzBdOworCisgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUob3V0LT5kYXRhW2ldLCBvdXQtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluW2lucHV0XS0+ZGF0YVtwbGFuZV0sIGluW2lucHV0XS0+bGluZXNpemVbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBsYW5ld2lkdGhbaV0sIHMtPnBsYW5laGVpZ2h0W2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgTWVyZ2VQbGFuZXNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIElucHV0UGFyYW0gaW5wdXRzcFs0XTsKKyAgICBGRkZyYW1lU3luY0luICppbjsKKyAgICBpbnQgaTsKKworICAgIGZmX2ZyYW1lc3luY19pbml0KCZzLT5mcywgY3R4LCBzLT5uYl9pbnB1dHMpOworICAgIGluID0gcy0+ZnMuaW47CisgICAgcy0+ZnMub3BhcXVlID0gczsKKyAgICBzLT5mcy5vbl9ldmVudCA9IHByb2Nlc3NfZnJhbWU7CisKKyAgICBvdXRsaW5rLT53ID0gY3R4LT5pbnB1dHNbMF0tPnc7CisgICAgb3V0bGluay0+aCA9IGN0eC0+aW5wdXRzWzBdLT5oOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IGN0eC0+aW5wdXRzWzBdLT50aW1lX2Jhc2U7CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IGN0eC0+aW5wdXRzWzBdLT5mcmFtZV9yYXRlOworICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBjdHgtPmlucHV0c1swXS0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKworICAgIHMtPnBsYW5ld2lkdGhbMV0gID0KKyAgICBzLT5wbGFuZXdpZHRoWzJdICA9IEZGX0NFSUxfUlNISUZUKG91dGxpbmstPncsIHMtPm91dGRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgIHMtPnBsYW5ld2lkdGhbMF0gID0KKyAgICBzLT5wbGFuZXdpZHRoWzNdICA9IG91dGxpbmstPnc7CisgICAgcy0+cGxhbmVoZWlnaHRbMV0gPQorICAgIHMtPnBsYW5laGVpZ2h0WzJdID0gRkZfQ0VJTF9SU0hJRlQob3V0bGluay0+aCwgcy0+b3V0ZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgcy0+cGxhbmVoZWlnaHRbMF0gPQorICAgIHMtPnBsYW5laGVpZ2h0WzNdID0gb3V0bGluay0+aDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBJbnB1dFBhcmFtICppbnB1dHAgPSAmaW5wdXRzcFtpXTsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1tpXTsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICppbmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgaWYgKG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICE9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gfHwKKyAgICAgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuICE9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImlucHV0ICMlZCBsaW5rICVzIFNBUiAlZDolZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb2VzIG5vdCBtYXRjaCBvdXRwdXQgbGluayAlcyBTQVIgJWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGN0eC0+aW5wdXRfcGFkc1tpXS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm91dHB1dF9wYWRzWzBdLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgaW5wdXRwLT5wbGFuZXdpZHRoWzFdICA9CisgICAgICAgIGlucHV0cC0+cGxhbmV3aWR0aFsyXSAgPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPncsIGluZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgICAgIGlucHV0cC0+cGxhbmV3aWR0aFswXSAgPQorICAgICAgICBpbnB1dHAtPnBsYW5ld2lkdGhbM10gID0gaW5saW5rLT53OworICAgICAgICBpbnB1dHAtPnBsYW5laGVpZ2h0WzFdID0KKyAgICAgICAgaW5wdXRwLT5wbGFuZWhlaWdodFsyXSA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwgaW5kZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICAgICAgaW5wdXRwLT5wbGFuZWhlaWdodFswXSA9CisgICAgICAgIGlucHV0cC0+cGxhbmVoZWlnaHRbM10gPSBpbmxpbmstPmg7CisgICAgICAgIGlucHV0cC0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbnB1dHAtPm5iX3BsYW5lczsgaisrKQorICAgICAgICAgICAgaW5wdXRwLT5kZXB0aFtqXSA9IGluZGVzYy0+Y29tcFtqXS5kZXB0aF9taW51czEgKyAxOworCisgICAgICAgIGluW2ldLnRpbWVfYmFzZSA9IGlubGluay0+dGltZV9iYXNlOworICAgICAgICBpbltpXS5zeW5jICAgPSAxOworICAgICAgICBpbltpXS5iZWZvcmUgPSBFWFRfU1RPUDsKKyAgICAgICAgaW5baV0uYWZ0ZXIgID0gRVhUX1NUT1A7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3BsYW5lczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBpbnB1dCA9IHMtPm1hcFtpXVsxXTsKKyAgICAgICAgY29uc3QgaW50IHBsYW5lID0gcy0+bWFwW2ldWzBdOworICAgICAgICBJbnB1dFBhcmFtICppbnB1dHAgPSAmaW5wdXRzcFtpbnB1dF07CisKKyAgICAgICAgaWYgKHBsYW5lICsgMSA+IGlucHV0cC0+bmJfcGxhbmVzKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dCAlZCBkb2VzIG5vdCBoYXZlICVkIHBsYW5lXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgcGxhbmUpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5vdXRkZXNjLT5jb21wW2ldLmRlcHRoX21pbnVzMSArIDEgIT0gaW5wdXRwLT5kZXB0aFtwbGFuZV0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIm91dHB1dCBwbGFuZSAlZCBkZXB0aCAlZCBkb2VzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRjaCBpbnB1dCAlZCBwbGFuZSAlZCBkZXB0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcy0+b3V0ZGVzYy0+Y29tcFtpXS5kZXB0aF9taW51czEgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgcGxhbmUsIGlucHV0cC0+ZGVwdGhbcGxhbmVdKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+cGxhbmV3aWR0aFtpXSAhPSBpbnB1dHAtPnBsYW5ld2lkdGhbcGxhbmVdKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJvdXRwdXQgcGxhbmUgJWQgd2lkdGggJWQgZG9lcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2ggaW5wdXQgJWQgcGxhbmUgJWQgd2lkdGggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHMtPnBsYW5ld2lkdGhbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBwbGFuZSwgaW5wdXRwLT5wbGFuZXdpZHRoW3BsYW5lXSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnBsYW5laGVpZ2h0W2ldICE9IGlucHV0cC0+cGxhbmVoZWlnaHRbcGxhbmVdKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJvdXRwdXQgcGxhbmUgJWQgaGVpZ2h0ICVkIGRvZXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoIGlucHV0ICVkIHBsYW5lICVkIGhlaWdodCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcy0+cGxhbmVoZWlnaHRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBwbGFuZSwgaW5wdXRwLT5wbGFuZWhlaWdodFtwbGFuZV0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19jb25maWd1cmUoJnMtPmZzKTsKK2ZhaWw6CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBNZXJnZVBsYW5lc0NvbnRleHQgKnMgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19yZXF1ZXN0X2ZyYW1lKCZzLT5mcywgb3V0bGluayk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIE1lcmdlUGxhbmVzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZmX2ZyYW1lc3luY191bmluaXQoJnMtPmZzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmY3R4LT5pbnB1dF9wYWRzW2ldLm5hbWUpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbWVyZ2VwbGFuZXNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9tZXJnZXBsYW5lcyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJtZXJnZXBsYW5lcyIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWVyZ2UgcGxhbmVzLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKE1lcmdlUGxhbmVzQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmbWVyZ2VwbGFuZXNfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IE5VTEwsCisgICAgLm91dHB1dHMgICAgICAgPSBtZXJnZXBsYW5lc19vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX0lOUFVUUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfbXAuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9tcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjRlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfbXAuYwpAQCAtMCwwICsxLDc5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBQYXJ0cyBvZiB0aGlzIGZpbGUgaGF2ZSBiZWVuIHN0b2xlbiBmcm9tIG1wbGF5ZXIKKyAqLworCisvKioKKyAqIEBmaWxlCisgKi8KKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJsaWJtcGNvZGVjcy92Zi5oIgorI2luY2x1ZGUgImxpYm1wY29kZWNzL2ltZ19mb3JtYXQuaCIKKyNpbmNsdWRlICJsaWJtcGNvZGVjcy9jcHVkZXRlY3QuaCIKKyNpbmNsdWRlICJsaWJtcGNvZGVjcy9hdl9oZWxwZXJzLmgiCisjaW5jbHVkZSAibGlibXBjb2RlY3MvbGlidm8vZmFzdG1lbWNweS5oIgorCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCisKKworLy9GSVhNRSBtYXliZSBsaW5rIHRoZSBvcmlnIGluCisvL1hYWDogaWRlbnRpY2FsIHBpeF9mbXQgbXVzdCBiZSBmb2xsb3dpbmcgd2l0aCBlYWNoIG90aGVycworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgaW50IGZtdDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKK30gY29udmVyc2lvbl9tYXBbXSA9IHsKKyAgICB7SU1HRk1UX0FSR0IsIEFWX1BJWF9GTVRfQVJHQn0sCisgICAge0lNR0ZNVF9CR1JBLCBBVl9QSVhfRk1UX0JHUkF9LAorICAgIHtJTUdGTVRfQkdSMjQsIEFWX1BJWF9GTVRfQkdSMjR9LAorICAgIHtJTUdGTVRfQkdSMTZCRSwgQVZfUElYX0ZNVF9SR0I1NjVCRX0sCisgICAge0lNR0ZNVF9CR1IxNkxFLCBBVl9QSVhfRk1UX1JHQjU2NUxFfSwKKyAgICB7SU1HRk1UX0JHUjE1QkUsIEFWX1BJWF9GTVRfUkdCNTU1QkV9LAorICAgIHtJTUdGTVRfQkdSMTVMRSwgQVZfUElYX0ZNVF9SR0I1NTVMRX0sCisgICAge0lNR0ZNVF9CR1IxMkJFLCBBVl9QSVhfRk1UX1JHQjQ0NEJFfSwKKyAgICB7SU1HRk1UX0JHUjEyTEUsIEFWX1BJWF9GTVRfUkdCNDQ0TEV9LAorICAgIHtJTUdGTVRfQkdSOCwgIEFWX1BJWF9GTVRfUkdCOH0sCisgICAge0lNR0ZNVF9CR1I0LCAgQVZfUElYX0ZNVF9SR0I0fSwKKyAgICB7SU1HRk1UX0JHUjEsICBBVl9QSVhfRk1UX01PTk9CTEFDS30sCisgICAge0lNR0ZNVF9SR0IxLCAgQVZfUElYX0ZNVF9NT05PQkxBQ0t9LAorICAgIHtJTUdGTVRfUkc0QiwgIEFWX1BJWF9GTVRfQkdSNF9CWVRFfSwKKyAgICB7SU1HRk1UX0JHNEIsICBBVl9QSVhfRk1UX1JHQjRfQllURX0sCisgICAge0lNR0ZNVF9SR0I0OExFLCBBVl9QSVhfRk1UX1JHQjQ4TEV9LAorICAgIHtJTUdGTVRfUkdCNDhCRSwgQVZfUElYX0ZNVF9SR0I0OEJFfSwKKyAgICB7SU1HRk1UX0FCR1IsIEFWX1BJWF9GTVRfQUJHUn0sCisgICAge0lNR0ZNVF9SR0JBLCBBVl9QSVhfRk1UX1JHQkF9LAorICAgIHtJTUdGTVRfUkdCMjQsIEFWX1BJWF9GTVRfUkdCMjR9LAorICAgIHtJTUdGTVRfUkdCMTZCRSwgQVZfUElYX0ZNVF9CR1I1NjVCRX0sCisgICAge0lNR0ZNVF9SR0IxNkxFLCBBVl9QSVhfRk1UX0JHUjU2NUxFfSwKKyAgICB7SU1HRk1UX1JHQjE1QkUsIEFWX1BJWF9GTVRfQkdSNTU1QkV9LAorICAgIHtJTUdGTVRfUkdCMTVMRSwgQVZfUElYX0ZNVF9CR1I1NTVMRX0sCisgICAge0lNR0ZNVF9SR0IxMkJFLCBBVl9QSVhfRk1UX0JHUjQ0NEJFfSwKKyAgICB7SU1HRk1UX1JHQjEyTEUsIEFWX1BJWF9GTVRfQkdSNDQ0TEV9LAorICAgIHtJTUdGTVRfUkdCOCwgIEFWX1BJWF9GTVRfQkdSOH0sCisgICAge0lNR0ZNVF9SR0I0LCAgQVZfUElYX0ZNVF9CR1I0fSwKKyAgICB7SU1HRk1UX0JHUjgsICBBVl9QSVhfRk1UX1BBTDh9LAorICAgIHtJTUdGTVRfWVVZMiwgIEFWX1BJWF9GTVRfWVVZVjQyMn0sCisgICAge0lNR0ZNVF9VWVZZLCAgQVZfUElYX0ZNVF9VWVZZNDIyfSwKKyAgICB7SU1HRk1UX05WMTIsICBBVl9QSVhfRk1UX05WMTJ9LAorICAgIHtJTUdGTVRfTlYyMSwgIEFWX1BJWF9GTVRfTlYyMX0sCisgICAge0lNR0ZNVF9ZODAwLCAgQVZfUElYX0ZNVF9HUkFZOH0sCisgICAge0lNR0ZNVF9ZOCwgICAgQVZfUElYX0ZNVF9HUkFZOH0sCisgICAge0lNR0ZNVF9ZVlU5LCAgQVZfUElYX0ZNVF9ZVVY0MTBQfSwKKyAgICB7SU1HRk1UX0lGMDksICBBVl9QSVhfRk1UX1lVVjQxMFB9LAorICAgIHtJTUdGTVRfWVYxMiwgIEFWX1BJWF9GTVRfWVVWNDIwUH0sCisgICAge0lNR0ZNVF9JNDIwLCAgQVZfUElYX0ZNVF9ZVVY0MjBQfSwKKyAgICB7SU1HRk1UX0lZVVYsICBBVl9QSVhfRk1UX1lVVjQyMFB9LAorICAgIHtJTUdGTVRfNDExUCwgIEFWX1BJWF9GTVRfWVVWNDExUH0sCisgICAge0lNR0ZNVF80MjJQLCAgQVZfUElYX0ZNVF9ZVVY0MjJQfSwKKyAgICB7SU1HRk1UXzQ0NFAsICBBVl9QSVhfRk1UX1lVVjQ0NFB9LAorICAgIHtJTUdGTVRfNDQwUCwgIEFWX1BJWF9GTVRfWVVWNDQwUH0sCisKKyAgICB7SU1HRk1UXzQyMEEsICBBVl9QSVhfRk1UX1lVVkE0MjBQfSwKKworICAgIHtJTUdGTVRfNDIwUDE2X0xFLCAgQVZfUElYX0ZNVF9ZVVY0MjBQMTZMRX0sCisgICAge0lNR0ZNVF80MjBQMTZfQkUsICBBVl9QSVhfRk1UX1lVVjQyMFAxNkJFfSwKKyAgICB7SU1HRk1UXzQyMlAxNl9MRSwgIEFWX1BJWF9GTVRfWVVWNDIyUDE2TEV9LAorICAgIHtJTUdGTVRfNDIyUDE2X0JFLCAgQVZfUElYX0ZNVF9ZVVY0MjJQMTZCRX0sCisgICAge0lNR0ZNVF80NDRQMTZfTEUsICBBVl9QSVhfRk1UX1lVVjQ0NFAxNkxFfSwKKyAgICB7SU1HRk1UXzQ0NFAxNl9CRSwgIEFWX1BJWF9GTVRfWVVWNDQ0UDE2QkV9LAorCisgICAgLy8gWVVWSiBhcmUgWVVWIGZvcm1hdHMgdGhhdCB1c2UgdGhlIGZ1bGwgWSByYW5nZSBhbmQgbm90IGp1c3QKKyAgICAvLyAxNiAtIDIzNSAoc2VlIGNvbG9yc3BhY2VzLnR4dCkuCisgICAgLy8gQ3VycmVudGx5IHRoZXkgYXJlIGFsbCB0cmVhdGVkIHRoZSBzYW1lIHdheS4KKyAgICB7SU1HRk1UX1lWMTIsICBBVl9QSVhfRk1UX1lVVko0MjBQfSwKKyAgICB7SU1HRk1UXzQyMlAsICBBVl9QSVhfRk1UX1lVVko0MjJQfSwKKyAgICB7SU1HRk1UXzQ0NFAsICBBVl9QSVhfRk1UX1lVVko0NDRQfSwKKyAgICB7SU1HRk1UXzQ0MFAsICBBVl9QSVhfRk1UX1lVVko0NDBQfSwKKworI2lmIEZGX0FQSV9YVk1DCisgICAge0lNR0ZNVF9YVk1DX01PQ09fTVBFRzIsIEFWX1BJWF9GTVRfWFZNQ19NUEVHMl9NQ30sCisgICAge0lNR0ZNVF9YVk1DX0lEQ1RfTVBFRzIsIEFWX1BJWF9GTVRfWFZNQ19NUEVHMl9JRENUfSwKKyNlbmRpZiAvKiBGRl9BUElfWFZNQyAqLworCisgICAge0lNR0ZNVF9WRFBBVV9NUEVHMSwgICAgIEFWX1BJWF9GTVRfVkRQQVVfTVBFRzF9LAorICAgIHtJTUdGTVRfVkRQQVVfTVBFRzIsICAgICBBVl9QSVhfRk1UX1ZEUEFVX01QRUcyfSwKKyAgICB7SU1HRk1UX1ZEUEFVX0gyNjQsICAgICAgQVZfUElYX0ZNVF9WRFBBVV9IMjY0fSwKKyAgICB7SU1HRk1UX1ZEUEFVX1dNVjMsICAgICAgQVZfUElYX0ZNVF9WRFBBVV9XTVYzfSwKKyAgICB7SU1HRk1UX1ZEUEFVX1ZDMSwgICAgICAgQVZfUElYX0ZNVF9WRFBBVV9WQzF9LAorICAgIHtJTUdGTVRfVkRQQVVfTVBFRzQsICAgICBBVl9QSVhfRk1UX1ZEUEFVX01QRUc0fSwKKyAgICB7MCwgQVZfUElYX0ZNVF9OT05FfQorfTsKKworZXh0ZXJuIGNvbnN0IHZmX2luZm9fdCBmZl92Zl9pbmZvX2VxMjsKK2V4dGVybiBjb25zdCB2Zl9pbmZvX3QgZmZfdmZfaW5mb19lcTsKK2V4dGVybiBjb25zdCB2Zl9pbmZvX3QgZmZfdmZfaW5mb19mc3BwOworZXh0ZXJuIGNvbnN0IHZmX2luZm9fdCBmZl92Zl9pbmZvX2lscGFjazsKK2V4dGVybiBjb25zdCB2Zl9pbmZvX3QgZmZfdmZfaW5mb19wcDc7CitleHRlcm4gY29uc3QgdmZfaW5mb190IGZmX3ZmX2luZm9fc29mdHB1bGxkb3duOworZXh0ZXJuIGNvbnN0IHZmX2luZm9fdCBmZl92Zl9pbmZvX3VzcHA7CisKKworc3RhdGljIGNvbnN0IHZmX2luZm9fdCogY29uc3QgZmlsdGVyc1tdPXsKKyAgICAmZmZfdmZfaW5mb19lcTIsCisgICAgJmZmX3ZmX2luZm9fZXEsCisgICAgJmZmX3ZmX2luZm9fZnNwcCwKKyAgICAmZmZfdmZfaW5mb19pbHBhY2ssCisgICAgJmZmX3ZmX2luZm9fcHA3LAorICAgICZmZl92Zl9pbmZvX3NvZnRwdWxsZG93biwKKyAgICAmZmZfdmZfaW5mb191c3BwLAorCisgICAgTlVMTAorfTsKKworLyoKK1Vuc3VwcG9ydGVkIGZpbHRlcnMKKzFicHAKK2FzcworYm1vdmwKK2Nyb3AKK2R2YnNjYWxlCitmbGlwCitleHBhbmQKK2Zvcm1hdAoraGFsZnBhY2sKK2xhdmMKK2xhdmNkZWludAorbm9mb3JtYXQKK3BwCitzY2FsZQordGZpZWxkcwordm8KK3lhZGlmCit6cm1qcGVnCisqLworCitDcHVDYXBzIGZmX2dDcHVDYXBzOyAvL0ZJWE1FIGluaXRpYWxpemUgdGhpcyBzbyBvcHRpbXMgd29yaworCitlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfbXAyZmZfcGl4X2ZtdChpbnQgbXApeworICAgIGludCBpOworICAgIGZvcihpPTA7IGNvbnZlcnNpb25fbWFwW2ldLmZtdCAmJiBtcCAhPSBjb252ZXJzaW9uX21hcFtpXS5mbXQ7IGkrKykKKyAgICAgICAgOworICAgIHJldHVybiBtcCA9PSBjb252ZXJzaW9uX21hcFtpXS5mbXQgPyBjb252ZXJzaW9uX21hcFtpXS5waXhfZm10IDogQVZfUElYX0ZNVF9OT05FOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgdmZfaW5zdGFuY2VfdCB2ZjsKKyAgICB2Zl9pbnN0YW5jZV90IG5leHRfdmY7CisgICAgQVZGaWx0ZXJDb250ZXh0ICphdmZjdHg7CisgICAgaW50IGZyYW1lX3JldHVybmVkOworICAgIGNoYXIgKmZpbHRlcjsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgaW5fcGl4X2ZtdDsKK30gTVBDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihNUENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG1wX29wdGlvbnNbXSA9IHsKKyAgICB7ICJmaWx0ZXIiLCAic2V0IE1QbGF5ZXIgZmlsdGVyIG5hbWUgYW5kIHBhcmFtZXRlcnMiLCBPRkZTRVQoZmlsdGVyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKG1wKTsKKwordm9pZCBmZl9tcF9tc2coaW50IG1vZCwgaW50IGxldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4gKXsKKyAgICB2YV9saXN0IHZhOworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIC8vRklYTUUgY29udmVydCBsZXYvbW9kCisgICAgYXZfdmxvZyhOVUxMLCBBVl9MT0dfREVCVUcsIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7Cit9CisKK2ludCBmZl9tcF9tc2dfdGVzdChpbnQgbW9kLCBpbnQgbGV2KXsKKyAgICByZXR1cm4gMTIzOworfQorCit2b2lkIGZmX2luaXRfYXZjb2RlYyh2b2lkKQoreworICAgIC8vd2UgbWF5YmUgc2hvdWxkIGluaXQgYnV0IGl0cyBraW5kYSAxLiB1bm5lZWRlZCAyLiBhIGJpdCBpbXBvbGl0ZSBmcm9tIGhlcmUKK30KKworLy9FeGFjdCBjb3B5IG9mIHZmLmMKK3ZvaWQgZmZfdmZfY2xvbmVfbXBpX2F0dHJpYnV0ZXMobXBfaW1hZ2VfdCogZHN0LCBtcF9pbWFnZV90KiBzcmMpeworICAgIGRzdC0+cGljdF90eXBlPSBzcmMtPnBpY3RfdHlwZTsKKyAgICBkc3QtPmZpZWxkcyA9IHNyYy0+ZmllbGRzOworICAgIGRzdC0+cXNjYWxlX3R5cGU9IHNyYy0+cXNjYWxlX3R5cGU7CisgICAgaWYoZHN0LT53aWR0aCA9PSBzcmMtPndpZHRoICYmIGRzdC0+aGVpZ2h0ID09IHNyYy0+aGVpZ2h0KXsKKyAgICAgICAgZHN0LT5xc3RyaWRlPSBzcmMtPnFzdHJpZGU7CisgICAgICAgIGRzdC0+cXNjYWxlPSBzcmMtPnFzY2FsZTsKKyAgICB9Cit9CisKKy8vRXhhY3QgY29weSBvZiB2Zi5jCit2b2lkIGZmX3ZmX25leHRfZHJhd19zbGljZShzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLHVuc2lnbmVkIGNoYXIqKiBzcmMsIGludCAqIHN0cmlkZSxpbnQgdywgaW50IGgsIGludCB4LCBpbnQgeSl7CisgICAgaWYgKHZmLT5uZXh0LT5kcmF3X3NsaWNlKSB7CisgICAgICAgIHZmLT5uZXh0LT5kcmF3X3NsaWNlKHZmLT5uZXh0LHNyYyxzdHJpZGUsdyxoLHgseSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF2Zi0+ZG1waSkgeworICAgICAgICBmZl9tcF9tc2coTVNHVF9WRklMVEVSLE1TR0xfRVJSLCJkcmF3X3NsaWNlOiBkbXBpIG5vdCBzdG9yZWQgYnkgdmZfJXNcbiIsIHZmLT5pbmZvLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoISh2Zi0+ZG1waS0+ZmxhZ3MgJiBNUF9JTUdGTEFHX1BMQU5BUikpIHsKKyAgICAgICAgbWVtY3B5X3BpYyh2Zi0+ZG1waS0+cGxhbmVzWzBdK3kqdmYtPmRtcGktPnN0cmlkZVswXSt2Zi0+ZG1waS0+YnBwLzgqeCwKKyAgICAgICAgICAgIHNyY1swXSwgdmYtPmRtcGktPmJwcC84KncsIGgsIHZmLT5kbXBpLT5zdHJpZGVbMF0sIHN0cmlkZVswXSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtY3B5X3BpYyh2Zi0+ZG1waS0+cGxhbmVzWzBdK3kqdmYtPmRtcGktPnN0cmlkZVswXSt4LCBzcmNbMF0sCisgICAgICAgIHcsIGgsIHZmLT5kbXBpLT5zdHJpZGVbMF0sIHN0cmlkZVswXSk7CisgICAgbWVtY3B5X3BpYyh2Zi0+ZG1waS0+cGxhbmVzWzFdKyh5Pj52Zi0+ZG1waS0+Y2hyb21hX3lfc2hpZnQpKnZmLT5kbXBpLT5zdHJpZGVbMV0rKHg+PnZmLT5kbXBpLT5jaHJvbWFfeF9zaGlmdCksCisgICAgICAgIHNyY1sxXSwgdz4+dmYtPmRtcGktPmNocm9tYV94X3NoaWZ0LCBoPj52Zi0+ZG1waS0+Y2hyb21hX3lfc2hpZnQsIHZmLT5kbXBpLT5zdHJpZGVbMV0sIHN0cmlkZVsxXSk7CisgICAgbWVtY3B5X3BpYyh2Zi0+ZG1waS0+cGxhbmVzWzJdKyh5Pj52Zi0+ZG1waS0+Y2hyb21hX3lfc2hpZnQpKnZmLT5kbXBpLT5zdHJpZGVbMl0rKHg+PnZmLT5kbXBpLT5jaHJvbWFfeF9zaGlmdCksCisgICAgICAgIHNyY1syXSwgdz4+dmYtPmRtcGktPmNocm9tYV94X3NoaWZ0LCBoPj52Zi0+ZG1waS0+Y2hyb21hX3lfc2hpZnQsIHZmLT5kbXBpLT5zdHJpZGVbMl0sIHN0cmlkZVsyXSk7Cit9CisKKy8vRXhhY3QgY29weSBvZiB2Zi5jCit2b2lkIGZmX3ZmX21waV9jbGVhcihtcF9pbWFnZV90KiBtcGksaW50IHgwLGludCB5MCxpbnQgdyxpbnQgaCl7CisgICAgaW50IHk7CisgICAgaWYobXBpLT5mbGFncyZNUF9JTUdGTEFHX1BMQU5BUil7CisgICAgICAgIHkwJj1+MTtoKz1oJjE7CisgICAgICAgIGlmKHgwPT0wICYmIHc9PW1waS0+d2lkdGgpeworICAgICAgICAgICAgLy8gZnVsbCB3aWR0aCBjbGVhcjoKKyAgICAgICAgICAgIG1lbXNldChtcGktPnBsYW5lc1swXSttcGktPnN0cmlkZVswXSp5MCwwLG1waS0+c3RyaWRlWzBdKmgpOworICAgICAgICAgICAgbWVtc2V0KG1waS0+cGxhbmVzWzFdK21waS0+c3RyaWRlWzFdKih5MD4+bXBpLT5jaHJvbWFfeV9zaGlmdCksMTI4LG1waS0+c3RyaWRlWzFdKihoPj5tcGktPmNocm9tYV95X3NoaWZ0KSk7CisgICAgICAgICAgICBtZW1zZXQobXBpLT5wbGFuZXNbMl0rbXBpLT5zdHJpZGVbMl0qKHkwPj5tcGktPmNocm9tYV95X3NoaWZ0KSwxMjgsbXBpLT5zdHJpZGVbMl0qKGg+Pm1waS0+Y2hyb21hX3lfc2hpZnQpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIGZvcih5PXkwO3k8eTAraDt5Kz0yKXsKKyAgICAgICAgICAgIG1lbXNldChtcGktPnBsYW5lc1swXSt4MCttcGktPnN0cmlkZVswXSp5LDAsdyk7CisgICAgICAgICAgICBtZW1zZXQobXBpLT5wbGFuZXNbMF0reDArbXBpLT5zdHJpZGVbMF0qKHkrMSksMCx3KTsKKyAgICAgICAgICAgIG1lbXNldChtcGktPnBsYW5lc1sxXSsoeDA+Pm1waS0+Y2hyb21hX3hfc2hpZnQpK21waS0+c3RyaWRlWzFdKih5Pj5tcGktPmNocm9tYV95X3NoaWZ0KSwxMjgsKHc+Pm1waS0+Y2hyb21hX3hfc2hpZnQpKTsKKyAgICAgICAgICAgIG1lbXNldChtcGktPnBsYW5lc1syXSsoeDA+Pm1waS0+Y2hyb21hX3hfc2hpZnQpK21waS0+c3RyaWRlWzJdKih5Pj5tcGktPmNocm9tYV95X3NoaWZ0KSwxMjgsKHc+Pm1waS0+Y2hyb21hX3hfc2hpZnQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIHBhY2tlZDoKKyAgICBmb3IoeT15MDt5PHkwK2g7eSsrKXsKKyAgICAgICAgdW5zaWduZWQgY2hhciogZHN0PW1waS0+cGxhbmVzWzBdK21waS0+c3RyaWRlWzBdKnkrKG1waS0+YnBwPj4zKSp4MDsKKyAgICAgICAgaWYobXBpLT5mbGFncyZNUF9JTUdGTEFHX1lVVil7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIHA9KHVuc2lnbmVkIGludCopIGRzdDsKKyAgICAgICAgICAgIGludCBzaXplPShtcGktPmJwcD4+Mykqdy80OworICAgICAgICAgICAgaW50IGk7CisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgQ0xFQVJfUEFDS0VEWVVWX1BBVFRFUk4gMHgwMDgwMDA4MAorI2RlZmluZSBDTEVBUl9QQUNLRURZVVZfUEFUVEVSTl9TV0FQUEVEIDB4ODAwMDgwMDAKKyNlbHNlCisjZGVmaW5lIENMRUFSX1BBQ0tFRFlVVl9QQVRURVJOIDB4ODAwMDgwMDAKKyNkZWZpbmUgQ0xFQVJfUEFDS0VEWVVWX1BBVFRFUk5fU1dBUFBFRCAweDAwODAwMDgwCisjZW5kaWYKKyAgICAgICAgICAgIGlmKG1waS0+ZmxhZ3MmTVBfSU1HRkxBR19TV0FQUEVEKXsKKyAgICAgICAgICAgICAgICBmb3IoaT0wO2k8c2l6ZS0zO2krPTQpIHBbaV09cFtpKzFdPXBbaSsyXT1wW2krM109Q0xFQVJfUEFDS0VEWVVWX1BBVFRFUk5fU1dBUFBFRDsKKyAgICAgICAgICAgICAgICBmb3IoO2k8c2l6ZTtpKyspIHBbaV09Q0xFQVJfUEFDS0VEWVVWX1BBVFRFUk5fU1dBUFBFRDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPHNpemUtMztpKz00KSBwW2ldPXBbaSsxXT1wW2krMl09cFtpKzNdPUNMRUFSX1BBQ0tFRFlVVl9QQVRURVJOOworICAgICAgICAgICAgICAgIGZvcig7aTxzaXplO2krKykgcFtpXT1DTEVBUl9QQUNLRURZVVZfUEFUVEVSTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtZW1zZXQoZHN0LDAsKG1waS0+YnBwPj4zKSp3KTsKKyAgICB9Cit9CisKK2ludCBmZl92Zl9uZXh0X3F1ZXJ5X2Zvcm1hdChzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLCB1bnNpZ25lZCBpbnQgZm10KXsKKyAgICByZXR1cm4gMTsKK30KKworLy91c2VkIGJ5IGRlbG9nbwordW5zaWduZWQgaW50IGZmX3ZmX21hdGNoX2NzcCh2Zl9pbnN0YW5jZV90KiogdmZwLGNvbnN0IHVuc2lnbmVkIGludCogbGlzdCx1bnNpZ25lZCBpbnQgcHJlZmVycmVkKXsKKyAgICByZXR1cm4gcHJlZmVycmVkOworfQorCittcF9pbWFnZV90KiBmZl92Zl9nZXRfaW1hZ2UodmZfaW5zdGFuY2VfdCogdmYsIHVuc2lnbmVkIGludCBvdXRmbXQsIGludCBtcF9pbWd0eXBlLCBpbnQgbXBfaW1nZmxhZywgaW50IHcsIGludCBoKXsKKyAgICBNUENvbnRleHQgKm09IChNUENvbnRleHQqKSgoKHVpbnQ4X3QqKXZmKSAtIG9mZnNldG9mKE1QQ29udGV4dCwgbmV4dF92ZikpOworICBtcF9pbWFnZV90KiBtcGk9TlVMTDsKKyAgaW50IHcyOworICBpbnQgbnVtYmVyID0gbXBfaW1ndHlwZSA+PiAxNjsKKworICBhdl9hc3NlcnQwKHZmLT5uZXh0ID09IE5VTEwpOyAvLyBhbGwgZXhpc3RpbmcgZmlsdGVycyBjYWxsIHRoaXMganVzdCBvbiBuZXh0CisKKyAgLy92Zl9kaW50IG5lZWRzIHRoZXNlIGFzIGl0IGNhbGxzIGZmX3ZmX2dldF9pbWFnZSgpIGJlZm9yZSBjb25maWd1cmluZyB0aGUgb3V0cHV0CisgIGlmKHZmLT53PT0wICYmIHc+MCkgdmYtPnc9dzsKKyAgaWYodmYtPmg9PTAgJiYgaD4wKSB2Zi0+aD1oOworCisgIGF2X2Fzc2VydDAodyA9PSAtMSB8fCB3ID49IHZmLT53KTsKKyAgYXZfYXNzZXJ0MChoID09IC0xIHx8IGggPj0gdmYtPmgpOworICBhdl9hc3NlcnQwKHZmLT53ID4gMCk7CisgIGF2X2Fzc2VydDAodmYtPmggPiAwKTsKKworICBhdl9sb2cobS0+YXZmY3R4LCBBVl9MT0dfREVCVUcsICJnZXRfaW1hZ2U6ICVkOiVkLCB2ZjogJWQ6JWRcbiIsIHcsaCx2Zi0+dyx2Zi0+aCk7CisKKyAgaWYgKHcgPT0gLTEpIHcgPSB2Zi0+dzsKKyAgaWYgKGggPT0gLTEpIGggPSB2Zi0+aDsKKworICB3Mj0obXBfaW1nZmxhZyZNUF9JTUdGTEFHX0FDQ0VQVF9BTElHTkVEX1NUUklERSk/KCh3KzE1KSYofjE1KSk6dzsKKworICAvLyBOb3RlOiB3ZSBzaG91bGQgY2FsbCBsaWJ2byBmaXJzdCB0byBjaGVjayBpZiBpdCBzdXBwb3J0cyBkaXJlY3QgcmVuZGVyaW5nCisgIC8vIGFuZCBpZiBub3QsIHRoZW4gZmFsbGJhY2sgdG8gc29mdHdhcmUgYnVmZmVyczoKKyAgc3dpdGNoKG1wX2ltZ3R5cGUgJiAweGZmKXsKKyAgY2FzZSBNUF9JTUdUWVBFX0VYUE9SVDoKKyAgICBpZighdmYtPmltZ2N0eC5leHBvcnRfaW1hZ2VzWzBdKSB2Zi0+aW1nY3R4LmV4cG9ydF9pbWFnZXNbMF09ZmZfbmV3X21wX2ltYWdlKHcyLGgpOworICAgIG1waT12Zi0+aW1nY3R4LmV4cG9ydF9pbWFnZXNbMF07CisgICAgYnJlYWs7CisgIGNhc2UgTVBfSU1HVFlQRV9TVEFUSUM6CisgICAgaWYoIXZmLT5pbWdjdHguc3RhdGljX2ltYWdlc1swXSkgdmYtPmltZ2N0eC5zdGF0aWNfaW1hZ2VzWzBdPWZmX25ld19tcF9pbWFnZSh3MixoKTsKKyAgICBtcGk9dmYtPmltZ2N0eC5zdGF0aWNfaW1hZ2VzWzBdOworICAgIGJyZWFrOworICBjYXNlIE1QX0lNR1RZUEVfVEVNUDoKKyAgICBpZighdmYtPmltZ2N0eC50ZW1wX2ltYWdlc1swXSkgdmYtPmltZ2N0eC50ZW1wX2ltYWdlc1swXT1mZl9uZXdfbXBfaW1hZ2UodzIsaCk7CisgICAgbXBpPXZmLT5pbWdjdHgudGVtcF9pbWFnZXNbMF07CisgICAgYnJlYWs7CisgIGNhc2UgTVBfSU1HVFlQRV9JUEI6CisgICAgaWYoIShtcF9pbWdmbGFnJk1QX0lNR0ZMQUdfUkVBREFCTEUpKXsgLy8gQiBmcmFtZToKKyAgICAgIGlmKCF2Zi0+aW1nY3R4LnRlbXBfaW1hZ2VzWzBdKSB2Zi0+aW1nY3R4LnRlbXBfaW1hZ2VzWzBdPWZmX25ld19tcF9pbWFnZSh3MixoKTsKKyAgICAgIG1waT12Zi0+aW1nY3R4LnRlbXBfaW1hZ2VzWzBdOworICAgICAgYnJlYWs7CisgICAgfQorICBjYXNlIE1QX0lNR1RZUEVfSVA6CisgICAgaWYoIXZmLT5pbWdjdHguc3RhdGljX2ltYWdlc1t2Zi0+aW1nY3R4LnN0YXRpY19pZHhdKSB2Zi0+aW1nY3R4LnN0YXRpY19pbWFnZXNbdmYtPmltZ2N0eC5zdGF0aWNfaWR4XT1mZl9uZXdfbXBfaW1hZ2UodzIsaCk7CisgICAgbXBpPXZmLT5pbWdjdHguc3RhdGljX2ltYWdlc1t2Zi0+aW1nY3R4LnN0YXRpY19pZHhdOworICAgIHZmLT5pbWdjdHguc3RhdGljX2lkeF49MTsKKyAgICBicmVhazsKKyAgY2FzZSBNUF9JTUdUWVBFX05VTUJFUkVEOgorICAgIGlmIChudW1iZXIgPT0gLTEpIHsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9OVU1CRVJFRF9NUEk7IGkrKykKKyAgICAgICAgaWYgKCF2Zi0+aW1nY3R4Lm51bWJlcmVkX2ltYWdlc1tpXSB8fCAhdmYtPmltZ2N0eC5udW1iZXJlZF9pbWFnZXNbaV0tPnVzYWdlX2NvdW50KQorICAgICAgICAgIGJyZWFrOworICAgICAgbnVtYmVyID0gaTsKKyAgICB9CisgICAgaWYgKG51bWJlciA8IDAgfHwgbnVtYmVyID49IE5VTV9OVU1CRVJFRF9NUEkpIHJldHVybiBOVUxMOworICAgIGlmICghdmYtPmltZ2N0eC5udW1iZXJlZF9pbWFnZXNbbnVtYmVyXSkgdmYtPmltZ2N0eC5udW1iZXJlZF9pbWFnZXNbbnVtYmVyXSA9IGZmX25ld19tcF9pbWFnZSh3MixoKTsKKyAgICBtcGkgPSB2Zi0+aW1nY3R4Lm51bWJlcmVkX2ltYWdlc1tudW1iZXJdOworICAgIG1waS0+bnVtYmVyID0gbnVtYmVyOworICAgIGJyZWFrOworICB9CisgIGlmKG1waSl7CisgICAgbXBpLT50eXBlPW1wX2ltZ3R5cGU7CisgICAgbXBpLT53PXZmLT53OyBtcGktPmg9dmYtPmg7CisgICAgLy8ga2VlcCBidWZmZXIgYWxsb2NhdGlvbiBzdGF0dXMgJiBjb2xvciBmbGFncyBvbmx5OgorLy8gICAgbXBpLT5mbGFncyY9fihNUF9JTUdGTEFHX1BSRVNFUlZFfE1QX0lNR0ZMQUdfUkVBREFCTEV8TVBfSU1HRkxBR19ESVJFQ1QpOworICAgIG1waS0+ZmxhZ3MmPU1QX0lNR0ZMQUdfQUxMT0NBVEVEfE1QX0lNR0ZMQUdfVFlQRV9ESVNQTEFZRUR8TVBfSU1HRkxBR01BU0tfQ09MT1JTOworICAgIC8vIGFjY2VwdCByZXN0cmljdGlvbnMsIGRyYXdfc2xpY2UgYW5kIHBhbGV0dGUgZmxhZ3Mgb25seToKKyAgICBtcGktPmZsYWdzfD1tcF9pbWdmbGFnJihNUF9JTUdGTEFHTUFTS19SRVNUUklDVElPTlN8TVBfSU1HRkxBR19EUkFXX0NBTExCQUNLfE1QX0lNR0ZMQUdfUkdCX1BBTEVUVEUpOworICAgIGlmKCF2Zi0+ZHJhd19zbGljZSkgbXBpLT5mbGFncyY9fk1QX0lNR0ZMQUdfRFJBV19DQUxMQkFDSzsKKyAgICBpZihtcGktPndpZHRoIT13MiB8fCBtcGktPmhlaWdodCE9aCl7CisvLyAgICAgIHByaW50ZigidmYuYzogTVBJIHBhcmFtZXRlcnMgY2hhbmdlZCEgICVkeCVkIC0+ICVkeCVkICAgXG4iLCBtcGktPndpZHRoLG1waS0+aGVpZ2h0LHcyLGgpOworICAgICAgICBpZihtcGktPmZsYWdzJk1QX0lNR0ZMQUdfQUxMT0NBVEVEKXsKKyAgICAgICAgICAgIGlmKG1waS0+d2lkdGg8dzIgfHwgbXBpLT5oZWlnaHQ8aCl7CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byByZS1hbGxvY2F0ZSBidWZmZXIgbWVtb3J5OgorICAgICAgICAgICAgICAgIGF2X2ZyZWUobXBpLT5wbGFuZXNbMF0pOworICAgICAgICAgICAgICAgIG1waS0+ZmxhZ3MmPX5NUF9JTUdGTEFHX0FMTE9DQVRFRDsKKyAgICAgICAgICAgICAgICBmZl9tcF9tc2coTVNHVF9WRklMVEVSLE1TR0xfViwidmYuYzogaGF2ZSB0byBSRUFMTE9DQVRFIGJ1ZmZlciBtZW1vcnkgOihcbiIpOworICAgICAgICAgICAgfQorLy8gICAgICB9IGVsc2UgeworICAgICAgICB9IHsKKyAgICAgICAgICAgIG1waS0+d2lkdGg9dzI7IG1waS0+Y2hyb21hX3dpZHRoPSh3MiArICgxPDxtcGktPmNocm9tYV94X3NoaWZ0KSAtIDEpPj5tcGktPmNocm9tYV94X3NoaWZ0OworICAgICAgICAgICAgbXBpLT5oZWlnaHQ9aDsgbXBpLT5jaHJvbWFfaGVpZ2h0PShoICsgKDE8PG1waS0+Y2hyb21hX3lfc2hpZnQpIC0gMSk+Pm1waS0+Y2hyb21hX3lfc2hpZnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoIW1waS0+YnBwKSBmZl9tcF9pbWFnZV9zZXRmbXQobXBpLG91dGZtdCk7CisgICAgaWYoIShtcGktPmZsYWdzJk1QX0lNR0ZMQUdfQUxMT0NBVEVEKSAmJiBtcGktPnR5cGU+TVBfSU1HVFlQRV9FWFBPUlQpeworCisgICAgICAgIGF2X2Fzc2VydDAoIXZmLT5nZXRfaW1hZ2UpOworICAgICAgICAvLyBjaGVjayBsaWJ2byBmaXJzdCEKKyAgICAgICAgaWYodmYtPmdldF9pbWFnZSkgdmYtPmdldF9pbWFnZSh2ZixtcGkpOworCisgICAgICAgIGlmKCEobXBpLT5mbGFncyZNUF9JTUdGTEFHX0RJUkVDVCkpeworICAgICAgICAgIC8vIG5vbi1kaXJlY3QgYW5kIG5vdCB5ZXQgYWxsb2NhdGVkIGltYWdlLiBhbGxvY2F0ZSBpdCEKKyAgICAgICAgICBpZiAoIW1waS0+YnBwKSB7IC8vIG5vIHdheSB3ZSBjYW4gYWxsb2NhdGUgdGhpcworICAgICAgICAgICAgICBmZl9tcF9tc2coTVNHVF9ERUNWSURFTywgTVNHTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgICJmZl92Zl9nZXRfaW1hZ2U6IFRyaWVkIHRvIGFsbG9jYXRlIGEgZm9ybWF0IHRoYXQgY2FuIG5vdCBiZSBhbGxvY2F0ZWQhXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gY2hlY2sgaWYgY29kZWMgcHJlZmVyIGFsaWduZWQgc3RyaWRlOgorICAgICAgICAgIGlmKG1wX2ltZ2ZsYWcmTVBfSU1HRkxBR19QUkVGRVJfQUxJR05FRF9TVFJJREUpeworICAgICAgICAgICAgICBpbnQgYWxpZ249KG1waS0+ZmxhZ3MmTVBfSU1HRkxBR19QTEFOQVIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBtcGktPmZsYWdzJk1QX0lNR0ZMQUdfWVVWKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgKDg8PG1waS0+Y2hyb21hX3hfc2hpZnQpLTEgOiAxNTsgLy8gLS0gbWF5YmUgRklYTUUKKyAgICAgICAgICAgICAgdzI9KCh3K2FsaWduKSYofmFsaWduKSk7CisgICAgICAgICAgICAgIGlmKG1waS0+d2lkdGghPXcyKXsKKyNpZiAwCisgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGNoYW5nZSB3aWR0aC4uLiBjaGVjayBpZiB3ZSBDQU4gY28gaXQ6CisgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3M9dmYtPnF1ZXJ5X2Zvcm1hdCh2ZixvdXRmbXQpOyAvLyBzaG91bGQgbm90IGZhaWwKKyAgICAgICAgICAgICAgICAgIGlmKCEoZmxhZ3MmMykpIGZmX21wX21zZyhNU0dUX0RFQ1ZJREVPLE1TR0xfV0FSTiwiPz8/IGZmX3ZmX2dldF9pbWFnZXt2Zi0+cXVlcnlfZm9ybWF0KG91dGZtdCl9IGZhaWxlZCFcbiIpOworLy8gICAgICAgICAgICAgICAgcHJpbnRmKCJxdWVyeSAtPiAweCVYICAgIFxuIixmbGFncyk7CisgICAgICAgICAgICAgICAgICBpZihmbGFncyZWRkNBUF9BQ0NFUFRfU1RSSURFKXsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgIG1waS0+d2lkdGg9dzI7CisgICAgICAgICAgICAgICAgICAgICAgbXBpLT5jaHJvbWFfd2lkdGg9KHcyICsgKDE8PG1waS0+Y2hyb21hX3hfc2hpZnQpIC0gMSk+Pm1waS0+Y2hyb21hX3hfc2hpZnQ7CisvLyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGZmX21wX2ltYWdlX2FsbG9jX3BsYW5lcyhtcGkpOworLy8gICAgICAgIHByaW50ZigiY2xlYXJpbmcgaW1nIVxuIik7CisgICAgICAgICAgZmZfdmZfbXBpX2NsZWFyKG1waSwwLDAsbXBpLT53aWR0aCxtcGktPmhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfYXNzZXJ0MCghdmYtPnN0YXJ0X3NsaWNlKTsKKyAgICBpZihtcGktPmZsYWdzJk1QX0lNR0ZMQUdfRFJBV19DQUxMQkFDSykKKyAgICAgICAgaWYodmYtPnN0YXJ0X3NsaWNlKSB2Zi0+c3RhcnRfc2xpY2UodmYsbXBpKTsKKyAgICBpZighKG1waS0+ZmxhZ3MmTVBfSU1HRkxBR19UWVBFX0RJU1BMQVlFRCkpeworICAgICAgICAgICAgZmZfbXBfbXNnKE1TR1RfREVDVklERU8sTVNHTF9WLCIqKiogWyVzXSAlcyVzIG1wX2ltYWdlX3QsICVkeCVkeCVkYnBwICVzICVzLCAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICJOVUxMIi8qdmYtPmluZm8tPm5hbWUqLywKKyAgICAgICAgICAgICAgICAgIChtcGktPnR5cGU9PU1QX0lNR1RZUEVfRVhQT1JUKT8iRXhwb3J0aW5nIjoKKyAgICAgICAgICAgICAgICAgICgobXBpLT5mbGFncyZNUF9JTUdGTEFHX0RJUkVDVCk/IkRpcmVjdCBSZW5kZXJpbmciOiJBbGxvY2F0aW5nIiksCisgICAgICAgICAgICAgICAgICAobXBpLT5mbGFncyZNUF9JTUdGTEFHX0RSQVdfQ0FMTEJBQ0spPyIgKHNsaWNlcykiOiIiLAorICAgICAgICAgICAgICAgICAgbXBpLT53aWR0aCxtcGktPmhlaWdodCxtcGktPmJwcCwKKyAgICAgICAgICAgICAgICAgIChtcGktPmZsYWdzJk1QX0lNR0ZMQUdfWVVWKT8iWVVWIjooKG1waS0+ZmxhZ3MmTVBfSU1HRkxBR19TV0FQUEVEKT8iQkdSIjoiUkdCIiksCisgICAgICAgICAgICAgICAgICAobXBpLT5mbGFncyZNUF9JTUdGTEFHX1BMQU5BUik/InBsYW5hciI6InBhY2tlZCIsCisgICAgICAgICAgICAgICAgICBtcGktPmJwcCptcGktPndpZHRoKm1waS0+aGVpZ2h0LzgpOworICAgICAgICAgICAgZmZfbXBfbXNnKE1TR1RfREVDVklERU8sTVNHTF9EQkcyLCIoaW1nZm10OiAleCwgcGxhbmVzOiAlcCwlcCwlcCBzdHJpZGVzOiAlZCwlZCwlZCwgY2hyb21hOiAlZHglZCwgc2hpZnQ6IGg6JWQsdjolZClcbiIsCisgICAgICAgICAgICAgICAgbXBpLT5pbWdmbXQsIG1waS0+cGxhbmVzWzBdLCBtcGktPnBsYW5lc1sxXSwgbXBpLT5wbGFuZXNbMl0sCisgICAgICAgICAgICAgICAgbXBpLT5zdHJpZGVbMF0sIG1waS0+c3RyaWRlWzFdLCBtcGktPnN0cmlkZVsyXSwKKyAgICAgICAgICAgICAgICBtcGktPmNocm9tYV93aWR0aCwgbXBpLT5jaHJvbWFfaGVpZ2h0LCBtcGktPmNocm9tYV94X3NoaWZ0LCBtcGktPmNocm9tYV95X3NoaWZ0KTsKKyAgICAgICAgICAgIG1waS0+ZmxhZ3N8PU1QX0lNR0ZMQUdfVFlQRV9ESVNQTEFZRUQ7CisgICAgfQorCisgIG1waS0+cXNjYWxlID0gTlVMTDsKKyAgbXBpLT51c2FnZV9jb3VudCsrOworICB9CisvLyAgICBwcmludGYoIlxyVkZfTVBJOiAlcCAlcCAlcCAlZCAlZCAlZCAgICBcbiIsCisvLyAgICAgIG1waS0+cGxhbmVzWzBdLG1waS0+cGxhbmVzWzFdLG1waS0+cGxhbmVzWzJdLAorLy8gICAgICBtcGktPnN0cmlkZVswXSxtcGktPnN0cmlkZVsxXSxtcGktPnN0cmlkZVsyXSk7CisgIHJldHVybiBtcGk7Cit9CisKK2ludCBmZl92Zl9uZXh0X3B1dF9pbWFnZShzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLG1wX2ltYWdlX3QgKm1waSwgZG91YmxlIHB0cyl7CisgICAgTVBDb250ZXh0ICptPSAoTVBDb250ZXh0KikoKCh1aW50OF90Kil2ZikgLSBvZmZzZXRvZihNUENvbnRleHQsIHZmKSk7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rICAgICA9IG0tPmF2ZmN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpwaWNyZWYgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGludCBpOworCisgICAgYXZfYXNzZXJ0MCh2Zi0+bmV4dCk7CisKKyAgICBhdl9sb2cobS0+YXZmY3R4LCBBVl9MT0dfREVCVUcsICJmZl92Zl9uZXh0X3B1dF9pbWFnZVxuIik7CisKKyAgICBpZiAoIXBpY3JlZikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcGljcmVmLT53aWR0aCAgPSBtcGktPnc7CisgICAgcGljcmVmLT5oZWlnaHQgPSBtcGktPmg7CisKKyAgICBmb3IoaT0wOyBjb252ZXJzaW9uX21hcFtpXS5mbXQgJiYgbXBpLT5pbWdmbXQgIT0gY29udmVyc2lvbl9tYXBbaV0uZm10OyBpKyspOworICAgIHBpY3JlZi0+Zm9ybWF0ID0gY29udmVyc2lvbl9tYXBbaV0ucGl4X2ZtdDsKKworICAgIGZvcihpPTA7IGNvbnZlcnNpb25fbWFwW2ldLmZtdCAmJiBtLT5pbl9waXhfZm10ICE9IGNvbnZlcnNpb25fbWFwW2ldLnBpeF9mbXQ7IGkrKyk7CisgICAgaWYgKG1waS0+aW1nZm10ID09IGNvbnZlcnNpb25fbWFwW2ldLmZtdCkKKyAgICAgICAgcGljcmVmLT5mb3JtYXQgPSBjb252ZXJzaW9uX21hcFtpXS5waXhfZm10OworCisgICAgbWVtY3B5KHBpY3JlZi0+bGluZXNpemUsIG1waS0+c3RyaWRlLCBGRk1JTihzaXplb2YocGljcmVmLT5saW5lc2l6ZSksIHNpemVvZihtcGktPnN0cmlkZSkpKTsKKworICAgIGZvcihpPTA7IGk8NCAmJiBtcGktPnN0cmlkZVtpXTsgaSsrKXsKKyAgICAgICAgcGljcmVmLT5kYXRhW2ldID0gbXBpLT5wbGFuZXNbaV07CisgICAgfQorCisgICAgaWYocHRzICE9IE1QX05PUFRTX1ZBTFVFKQorICAgICAgICBwaWNyZWYtPnB0cz0gcHRzICogYXZfcTJkKG91dGxpbmstPnRpbWVfYmFzZSk7CisKKyAgICBpZigxKSB7IC8vIG1wIGJ1ZmZlcnMgYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBpbiBsaWJhdmZpbHRlciwgd2UgdGh1cyBtdXN0IGNvcHkKKyAgICAgICAgQVZGcmFtZSAqdG9mcmVlID0gcGljcmVmOworICAgICAgICBwaWNyZWYgPSBhdl9mcmFtZV9jbG9uZShwaWNyZWYpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZ0b2ZyZWUpOworICAgIH0KKworICAgIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBwaWNyZWYpOworICAgIG0tPmZyYW1lX3JldHVybmVkKys7CisKKyAgICByZXR1cm4gMTsKK2ZhaWw6CisgICAgYXZfZnJhbWVfZnJlZSgmcGljcmVmKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3ZmX25leHRfY29uZmlnKHN0cnVjdCB2Zl9pbnN0YW5jZSAqdmYsCisgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRfd2lkdGgsIGludCBkX2hlaWdodCwKKyAgICAgICAgdW5zaWduZWQgaW50IHZvZmxhZ3MsIHVuc2lnbmVkIGludCBvdXRmbXQpeworCisgICAgYXZfYXNzZXJ0MCh3aWR0aD4wICYmIGhlaWdodD4wKTsKKyAgICB2Zi0+bmV4dC0+dyA9IHdpZHRoOyB2Zi0+bmV4dC0+aCA9IGhlaWdodDsKKworICAgIHJldHVybiAxOworI2lmIDAKKyAgICBpbnQgZmxhZ3M9dmYtPm5leHQtPnF1ZXJ5X2Zvcm1hdCh2Zi0+bmV4dCxvdXRmbXQpOworICAgIGlmKCFmbGFncyl7CisgICAgICAgIC8vIGhtbS4gY29sb3JzcGFjZSBtaXNtYXRjaCEhIQorICAgICAgICAvL3RoaXMgaXMgZmF0YWwgZm9yIHVzIEFUTQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZmZfbXBfbXNnKE1TR1RfVkZJTFRFUixNU0dMX1YsIlJFUTogZmxhZ3M9MHglWCAgcmVxPTB4JVggIFxuIixmbGFncyx2Zi0+ZGVmYXVsdF9yZXFzKTsKKyAgICBtaXNzPXZmLT5kZWZhdWx0X3JlcXMgLSAoZmxhZ3MmdmYtPmRlZmF1bHRfcmVxcyk7CisgICAgaWYobWlzcyZWRkNBUF9BQ0NFUFRfU1RSSURFKXsKKyAgICAgICAgLy8gdmYgcmVxdWlyZXMgc3RyaWRlIHN1cHBvcnQgYnV0IHZmLT5uZXh0IGRvZXNuJ3Qgc3VwcG9ydCBpdCEKKyAgICAgICAgLy8gbGV0J3MgaW5zZXJ0IHRoZSAnZXhwYW5kJyBmaWx0ZXIsIGl0IGRvZXMgdGhlIGpvYiBmb3IgdXM6CisgICAgICAgIHZmX2luc3RhbmNlX3QqIHZmMj12Zl9vcGVuX2ZpbHRlcih2Zi0+bmV4dCwiZXhwYW5kIixOVUxMKTsKKyAgICAgICAgaWYoIXZmMikgcmV0dXJuIDA7IC8vIHNob3VsZG4ndCBoYXBwZW4hCisgICAgICAgIHZmLT5uZXh0PXZmMjsKKyAgICB9CisgICAgdmYtPm5leHQtPncgPSB3aWR0aDsgdmYtPm5leHQtPmggPSBoZWlnaHQ7CisgICAgcmV0dXJuIDE7CisjZW5kaWYKK30KKworaW50IGZmX3ZmX25leHRfY29udHJvbChzdHJ1Y3QgdmZfaW5zdGFuY2UgKnZmLCBpbnQgcmVxdWVzdCwgdm9pZCogZGF0YSl7CisgICAgTVBDb250ZXh0ICptPSAoTVBDb250ZXh0KikoKCh1aW50OF90Kil2ZikgLSBvZmZzZXRvZihNUENvbnRleHQsIHZmKSk7CisgICAgYXZfbG9nKG0tPmF2ZmN0eCwgQVZfTE9HX0RFQlVHLCAiUmVjZWl2ZWQgY29udHJvbCAlZFxuIiwgcmVxdWVzdCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmZfZGVmYXVsdF9xdWVyeV9mb3JtYXQoc3RydWN0IHZmX2luc3RhbmNlICp2ZiwgdW5zaWduZWQgaW50IGZtdCl7CisgICAgTVBDb250ZXh0ICptPSAoTVBDb250ZXh0KikoKCh1aW50OF90Kil2ZikgLSBvZmZzZXRvZihNUENvbnRleHQsIHZmKSk7CisgICAgaW50IGk7CisgICAgYXZfbG9nKG0tPmF2ZmN0eCwgQVZfTE9HX0RFQlVHLCAicXVlcnkgJVhcbiIsIGZtdCk7CisKKyAgICBmb3IoaT0wOyBjb252ZXJzaW9uX21hcFtpXS5mbXQ7IGkrKyl7CisgICAgICAgIGlmKGZtdD09Y29udmVyc2lvbl9tYXBbaV0uZm10KQorICAgICAgICAgICAgcmV0dXJuIDE7IC8vd2Ugc3Vwb3J0IGFsbAorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBNUENvbnRleHQgKm0gPSBjdHgtPnByaXY7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKyAgICBjaGFyIG5hbWVbMjU2XTsKKyAgICBjb25zdCBjaGFyICphcmdzOworICAgIGludCBpOworCisgICAgZmZfZ0NwdUNhcHMuaGFzTU1YICAgICAgPSBjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19NTVg7CisgICAgZmZfZ0NwdUNhcHMuaGFzTU1YMiAgICAgPSBjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19NTVgyOworICAgIGZmX2dDcHVDYXBzLmhhc1NTRSAgICAgID0gY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfU1NFOworICAgIGZmX2dDcHVDYXBzLmhhc1NTRTIgICAgID0gY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfU1NFMjsKKyAgICBmZl9nQ3B1Q2Fwcy5oYXNTU0UzICAgICA9IGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX1NTRTM7CisgICAgZmZfZ0NwdUNhcHMuaGFzU1NTRTMgICAgPSBjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19TU1NFMzsKKyAgICBmZl9nQ3B1Q2Fwcy5oYXNTU0U0ICAgICA9IGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX1NTRTQ7CisgICAgZmZfZ0NwdUNhcHMuaGFzU1NFNDIgICAgPSBjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19TU0U0MjsKKyAgICBmZl9nQ3B1Q2Fwcy5oYXNBVlggICAgICA9IGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX0FWWDsKKyAgICBmZl9nQ3B1Q2Fwcy5oYXMzRE5vdyAgICA9IGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHXzNETk9XOworICAgIGZmX2dDcHVDYXBzLmhhczNETm93RXh0ID0gY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfM0ROT1dFWFQ7CisKKyAgICBtLT5hdmZjdHg9IGN0eDsKKworICAgIGFyZ3MgPSBtLT5maWx0ZXI7CisgICAgaWYoIWFyZ3MgfHwgMSE9c3NjYW5mKGFyZ3MsICIlMjU1W146PV0iLCBuYW1lKSl7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGFyYW1ldGVyLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGFyZ3MgKz0gc3RybGVuKG5hbWUpOworICAgIGlmIChhcmdzWzBdID09ICc9JykKKyAgICAgICAgYXJncysrOworCisgICAgZm9yKGk9MDsgO2krKyl7CisgICAgICAgIGlmKCFmaWx0ZXJzW2ldIHx8ICFzdHJjbXAobmFtZSwgZmlsdGVyc1tpXS0+bmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZighZmlsdGVyc1tpXSl7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gZmlsdGVyICVzXG4iLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgIiclcycgaXMgYSB3cmFwcGVkIE1QbGF5ZXIgZmlsdGVyIChsaWJtcGNvZGVjcykuIFRoaXMgZmlsdGVyIG1heSBiZSByZW1vdmVkXG4iCisgICAgICAgICAgICJvbmNlIGl0IGhhcyBiZWVuIHBvcnRlZCB0byBhIG5hdGl2ZSBsaWJhdmZpbHRlci5cbiIsIG5hbWUpOworCisgICAgbWVtc2V0KCZtLT52ZiwwLHNpemVvZihtLT52ZikpOworICAgIG0tPnZmLmluZm89IGZpbHRlcnNbaV07CisKKyAgICBtLT52Zi5uZXh0ICAgICAgICA9ICZtLT5uZXh0X3ZmOworICAgIG0tPnZmLnB1dF9pbWFnZSAgID0gZmZfdmZfbmV4dF9wdXRfaW1hZ2U7CisgICAgbS0+dmYuY29uZmlnICAgICAgPSBmZl92Zl9uZXh0X2NvbmZpZzsKKyAgICBtLT52Zi5xdWVyeV9mb3JtYXQ9IHZmX2RlZmF1bHRfcXVlcnlfZm9ybWF0OworICAgIG0tPnZmLmNvbnRyb2wgICAgID0gZmZfdmZfbmV4dF9jb250cm9sOworICAgIG0tPnZmLmRlZmF1bHRfY2Fwcz1WRkNBUF9BQ0NFUFRfU1RSSURFOworICAgIG0tPnZmLmRlZmF1bHRfcmVxcz0wOworICAgIGlmKG0tPnZmLmluZm8tPm9wdHMpCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIm9wdHMgLyBtX3N0cnVjdF9zZXQgaXMgdW5zdXBwb3J0ZWRcbiIpOworI2lmIDAKKyAgICBpZih2Zi0+aW5mby0+b3B0cykgeyAvLyB2Zl92byBnZXQgc29tZSBzcGVjaWFsIGFyZ3VtZW50CisgICAgICBjb25zdCBtX3N0cnVjdF90KiBzdCA9IHZmLT5pbmZvLT5vcHRzOworICAgICAgdm9pZCogdmZfcHJpdiA9IG1fc3RydWN0X2FsbG9jKHN0KTsKKyAgICAgIGludCBuOworICAgICAgZm9yKG4gPSAwIDsgYXJncyAmJiBhcmdzWzIqbl0gOyBuKyspCisgICAgICAgIG1fc3RydWN0X3NldChzdCx2Zl9wcml2LGFyZ3NbMipuXSxhcmdzWzIqbisxXSk7CisgICAgICB2Zi0+cHJpdiA9IHZmX3ByaXY7CisgICAgICBhcmdzID0gTlVMTDsKKyAgICB9IGVsc2UgLy8gT3RoZXJ3aXNlIHdlIHNob3VsZCBoYXZlIHRoZSAnX29sZGFyZ3NfJworICAgICAgaWYoYXJncyAmJiAhc3RyY21wKGFyZ3NbMF0sIl9vbGRhcmdzXyIpKQorICAgICAgICBhcmdzID0gKGNoYXIqKilhcmdzWzFdOworICAgICAgZWxzZQorICAgICAgICBhcmdzID0gTlVMTDsKKyNlbmRpZgorICAgIGlmKG0tPnZmLmluZm8tPnZmX29wZW4oJm0tPnZmLCAoY2hhciopYXJncyk8PTApeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJ2Zl9vcGVuKCkgb2YgJXMgd2l0aCBhcmc9JXMgZmFpbGVkXG4iLCBuYW1lLCBhcmdzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBNUENvbnRleHQgKm0gPSBjdHgtPnByaXY7CisgICAgdmZfaW5zdGFuY2VfdCAqdmYgPSAmbS0+dmY7CisKKyAgICB3aGlsZSh2Zil7CisgICAgICAgIHZmX2luc3RhbmNlX3QgKm5leHQgPSB2Zi0+bmV4dDsKKyAgICAgICAgaWYodmYtPnVuaW5pdCkKKyAgICAgICAgICAgIHZmLT51bmluaXQodmYpOworICAgICAgICBmZl9mcmVlX21wX2ltYWdlKHZmLT5pbWdjdHguc3RhdGljX2ltYWdlc1swXSk7CisgICAgICAgIGZmX2ZyZWVfbXBfaW1hZ2UodmYtPmltZ2N0eC5zdGF0aWNfaW1hZ2VzWzFdKTsKKyAgICAgICAgZmZfZnJlZV9tcF9pbWFnZSh2Zi0+aW1nY3R4LnRlbXBfaW1hZ2VzWzBdKTsKKyAgICAgICAgZmZfZnJlZV9tcF9pbWFnZSh2Zi0+aW1nY3R4LmV4cG9ydF9pbWFnZXNbMF0pOworICAgICAgICB2ZiA9IG5leHQ7CisgICAgfQorfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICphdmZtdHM9TlVMTDsKKyAgICBNUENvbnRleHQgKm0gPSBjdHgtPnByaXY7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGxhc3RwaXhmbXQgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT0wOyBjb252ZXJzaW9uX21hcFtpXS5mbXQ7IGkrKyl7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgInF1ZXJ5OiAlWFxuIiwgY29udmVyc2lvbl9tYXBbaV0uZm10KTsKKyAgICAgICAgaWYobS0+dmYucXVlcnlfZm9ybWF0KCZtLT52ZiwgY29udmVyc2lvbl9tYXBbaV0uZm10KSl7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJzdXBwb3J0ZWQsYWRkaW5nXG4iKTsKKyAgICAgICAgICAgIGlmIChjb252ZXJzaW9uX21hcFtpXS5waXhfZm10ICE9IGxhc3RwaXhmbXQpIHsKKyAgICAgICAgICAgICAgICBmZl9hZGRfZm9ybWF0KCZhdmZtdHMsIGNvbnZlcnNpb25fbWFwW2ldLnBpeF9mbXQpOworICAgICAgICAgICAgICAgIGxhc3RwaXhmbXQgPSBjb252ZXJzaW9uX21hcFtpXS5waXhfZm10OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFhdmZtdHMpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vV2UgYXNzdW1lIGFsbCBhbGxvd2VkIGlucHV0IGZvcm1hdHMgYXJlIGFsc28gYWxsb3dlZCBvdXRwdXQgZm9ybWF0cworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGF2Zm10cyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHJvcHMoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgTVBDb250ZXh0ICptID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgaW50IGk7CisgICAgZm9yKGk9MDsgY29udmVyc2lvbl9tYXBbaV0uZm10ICYmIGNvbnZlcnNpb25fbWFwW2ldLnBpeF9mbXQgIT0gaW5saW5rLT5mb3JtYXQ7IGkrKyk7CisKKyAgICBhdl9hc3NlcnQwKGNvbnZlcnNpb25fbWFwW2ldLmZtdCAmJiBpbmxpbmstPncgJiYgaW5saW5rLT5oKTsKKworICAgIG0tPnZmLmZtdC5oYXZlX2NvbmZpZ3VyZWQgPSAxOworICAgIG0tPnZmLmZtdC5vcmlnX2hlaWdodCAgICAgPSBpbmxpbmstPmg7CisgICAgbS0+dmYuZm10Lm9yaWdfd2lkdGggICAgICA9IGlubGluay0+dzsKKyAgICBtLT52Zi5mbXQub3JpZ19mbXQgICAgICAgID0gY29udmVyc2lvbl9tYXBbaV0uZm10OworCisgICAgaWYobS0+dmYuY29uZmlnKCZtLT52ZiwgaW5saW5rLT53LCBpbmxpbmstPmgsIGlubGluay0+dywgaW5saW5rLT5oLCAwLCBjb252ZXJzaW9uX21hcFtpXS5mbXQpPD0wKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIE1QQ29udGV4dCAqbSA9IG91dGxpbmstPnNyYy0+cHJpdjsKKworICAgIG91dGxpbmstPncgPSBtLT5uZXh0X3ZmLnc7CisgICAgb3V0bGluay0+aCA9IG0tPm5leHRfdmYuaDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIE1QQ29udGV4dCAqbSA9IG91dGxpbmstPnNyYy0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgYXZfbG9nKG0tPmF2ZmN0eCwgQVZfTE9HX0RFQlVHLCAibXAgcmVxdWVzdF9mcmFtZVxuIik7CisKKyAgICBmb3IobS0+ZnJhbWVfcmV0dXJuZWQ9MDsgIW0tPmZyYW1lX3JldHVybmVkOyl7CisgICAgICAgIHJldD1mZl9yZXF1ZXN0X2ZyYW1lKG91dGxpbmstPnNyYy0+aW5wdXRzWzBdKTsKKyAgICAgICAgaWYocmV0PDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBhdl9sb2cobS0+YXZmY3R4LCBBVl9MT0dfREVCVUcsICJtcCByZXF1ZXN0X2ZyYW1lIHJldD0lZFxuIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5waWMpCit7CisgICAgTVBDb250ZXh0ICptID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgaW50IGk7CisgICAgZG91YmxlIHB0cz0gTVBfTk9QVFNfVkFMVUU7CisgICAgbXBfaW1hZ2VfdCogbXBpID0gZmZfbmV3X21wX2ltYWdlKGlucGljLT53aWR0aCwgaW5waWMtPmhlaWdodCk7CisKKyAgICBpZihpbnBpYy0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBwdHM9IGlucGljLT5wdHMgLyBhdl9xMmQoaW5saW5rLT50aW1lX2Jhc2UpOworCisgICAgZm9yKGk9MDsgY29udmVyc2lvbl9tYXBbaV0uZm10ICYmIGNvbnZlcnNpb25fbWFwW2ldLnBpeF9mbXQgIT0gaW5saW5rLT5mb3JtYXQ7IGkrKyk7CisgICAgZmZfbXBfaW1hZ2Vfc2V0Zm10KG1waSxjb252ZXJzaW9uX21hcFtpXS5mbXQpOworICAgIG0tPmluX3BpeF9mbXQgPSBpbmxpbmstPmZvcm1hdDsKKworICAgIG1lbWNweShtcGktPnBsYW5lcywgaW5waWMtPmRhdGEsICAgICBGRk1JTihzaXplb2YoaW5waWMtPmRhdGEpICAgICwgc2l6ZW9mKG1waS0+cGxhbmVzKSkpOworICAgIG1lbWNweShtcGktPnN0cmlkZSwgaW5waWMtPmxpbmVzaXplLCBGRk1JTihzaXplb2YoaW5waWMtPmxpbmVzaXplKSwgc2l6ZW9mKG1waS0+c3RyaWRlKSkpOworCisgICAgaWYgKGlucGljLT5pbnRlcmxhY2VkX2ZyYW1lKQorICAgICAgICBtcGktPmZpZWxkcyB8PSBNUF9JTUdGSUVMRF9JTlRFUkxBQ0VEOworICAgIGlmIChpbnBpYy0+dG9wX2ZpZWxkX2ZpcnN0KQorICAgICAgICBtcGktPmZpZWxkcyB8PSBNUF9JTUdGSUVMRF9UT1BfRklSU1Q7CisgICAgaWYgKGlucGljLT5yZXBlYXRfcGljdCkKKyAgICAgICAgbXBpLT5maWVsZHMgfD0gTVBfSU1HRklFTERfUkVQRUFUX0ZJUlNUOworCisgICAgLy8gbXBpLT5mbGFnc3w9TVBfSU1HRkxBR19BTExPQ0FURUQ7ID8KKyAgICBtcGktPmZsYWdzIHw9IE1QX0lNR0ZMQUdfUkVBREFCTEU7CisgICAgaWYoIWF2X2ZyYW1lX2lzX3dyaXRhYmxlKGlucGljKSkKKyAgICAgICAgbXBpLT5mbGFncyB8PSBNUF9JTUdGTEFHX1BSRVNFUlZFOworICAgIGlmKG0tPnZmLnB1dF9pbWFnZSgmbS0+dmYsIG1waSwgcHRzKSA9PSAwKXsKKyAgICAgICAgYXZfbG9nKG0tPmF2ZmN0eCwgQVZfTE9HX0RFQlVHLCAicHV0X2ltYWdlKCkgc2F5cyBza2lwXG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5waWMpOworICAgIH0KKyAgICBmZl9mcmVlX21wX2ltYWdlKG1waSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBtcF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbXBfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHByb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX21wID0geworICAgIC5uYW1lICAgICAgICAgID0gIm1wIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBseSBhIGxpYm1wY29kZWNzIGZpbHRlciB0byB0aGUgaW5wdXQgdmlkZW8uIiksCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKE1QQ29udGV4dCksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gbXBfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gbXBfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZtcF9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfbXBkZWNpbWF0ZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX21wZGVjaW1hdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWQ5NjAyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX21wZGVjaW1hdGUuYwpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBSaWNoIEZlbGtlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisvKioKKyAqIEBmaWxlIG1wZGVjaW1hdGUgZmlsdGVyLCBwb3J0ZWQgZnJvbSBsaWJtcGNvZGVjcy92Zl9kZWNpbWF0ZS5jIGJ5CisgKiBSaWNoIEZlbGtlci4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGVsdXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IGxvLCBoaTsgICAgICAgICAgICAgICAgICAgIC8vLzwgbG93ZXIgYW5kIGhpZ2hlciB0aHJlc2hvbGQgbnVtYmVyIG9mIGRpZmZlcmVuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdmFsdWVzIGZvciA4eDggYmxvY2tzCisKKyAgICBmbG9hdCBmcmFjOyAgICAgICAgICAgICAgICAgICAgLy8vPCB0aHJlc2hvbGQgb2YgY2hhbmdlZCBwaXhlbHMgb3ZlciB0aGUgdG90YWwgZnJhY3Rpb24KKworICAgIGludCBtYXhfZHJvcF9jb3VudDsgICAgICAgICAgICAvLy88IGlmIHBvc2l0aXZlOiBtYXhpbXVtIG51bWJlciBvZiBzZXF1ZW50aWFsIGZyYW1lcyB0byBkcm9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaWYgbmVnYXRpdmU6IG1pbmltdW0gbnVtYmVyIG9mIGZyYW1lcyBiZXR3ZWVuIHR3byBkcm9wcworCisgICAgaW50IGRyb3BfY291bnQ7ICAgICAgICAgICAgICAgIC8vLzwgaWYgcG9zaXRpdmU6IG51bWJlciBvZiBmcmFtZXMgc2VxdWVudGlhbGx5IGRyb3BwZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpZiBuZWdhdGl2ZTogbnVtYmVyIG9mIHNlcXVlbnRpYWwgZnJhbWVzIHdoaWNoIHdlcmUgbm90IGRyb3BwZWQKKworICAgIGludCBoc3ViLCB2c3ViOyAgICAgICAgICAgICAgICAvLy88IGNocm9tYSBzdWJzYW1wbGluZyB2YWx1ZXMKKyAgICBBVkZyYW1lICpyZWY7ICAgICAgICAgICAgICAgICAgLy8vPCByZWZlcmVuY2UgcGljdHVyZQorICAgIGF2X3BpeGVsdXRpbHNfc2FkX2ZuIHNhZDsgICAgICAvLy88IHN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlIGZ1bmN0aW9uCit9IERlY2ltYXRlQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRGVjaW1hdGVDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG1wZGVjaW1hdGVfb3B0aW9uc1tdID0geworICAgIHsgIm1heCIsICAic2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zZWN1dGl2ZSBkcm9wcGVkIGZyYW1lcyAocG9zaXRpdmUpLCBvciB0aGUgbWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIGRyb3BwZWQgZnJhbWVzIChuZWdhdGl2ZSkiLAorICAgICAgT0ZGU0VUKG1heF9kcm9wX2NvdW50KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJoaSIsICAgInNldCBoaWdoIGRyb3BwaW5nIHRocmVzaG9sZCIsIE9GRlNFVChoaSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9NjQqMTJ9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgImxvIiwgICAic2V0IGxvdyBkcm9wcGluZyB0aHJlc2hvbGQiLCBPRkZTRVQobG8pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTY0KjV9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgImZyYWMiLCAic2V0IGZyYWN0aW9uIGRyb3BwaW5nIHRocmVzaG9sZCIsICBPRkZTRVQoZnJhYyksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjMzfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKG1wZGVjaW1hdGUpOworCisvKioKKyAqIFJldHVybiAxIGlmIHRoZSB0d28gcGxhbmVzIGFyZSBkaWZmZXJlbnQsIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGRpZmZfcGxhbmVzKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpjdXIsIGludCBjdXJfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJlZiwgaW50IHJlZl9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKQoreworICAgIERlY2ltYXRlQ29udGV4dCAqZGVjaW1hdGUgPSBjdHgtPnByaXY7CisKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgZCwgYyA9IDA7CisgICAgaW50IHQgPSAody8xNikqKGgvMTYpKmRlY2ltYXRlLT5mcmFjOworCisgICAgLyogY29tcHV0ZSBkaWZmZXJlbmNlIGZvciBibG9ja3Mgb2YgOHg4IGJ5dGVzICovCisgICAgZm9yICh5ID0gMDsgeSA8IGgtNzsgeSArPSA0KSB7CisgICAgICAgIGZvciAoeCA9IDg7IHggPCB3LTc7IHggKz0gNCkgeworICAgICAgICAgICAgZCA9IGRlY2ltYXRlLT5zYWQoY3VyICsgeSpjdXJfbGluZXNpemUgKyB4LCBjdXJfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYgKyB5KnJlZl9saW5lc2l6ZSArIHgsIHJlZl9saW5lc2l6ZSk7CisgICAgICAgICAgICBpZiAoZCA+IGRlY2ltYXRlLT5oaSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGlmIChkID4gZGVjaW1hdGUtPmxvKSB7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgICAgIGlmIChjID4gdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogVGVsbCBpZiB0aGUgZnJhbWUgc2hvdWxkIGJlIGRlY2ltYXRlZCwgZm9yIGV4YW1wbGUgaWYgaXQgaXMgbm8gbXVjaAorICogZGlmZmVyZW50IHdpdGggcmVzcGVjdCB0byB0aGUgcmVmZXJlbmNlIGZyYW1lIHJlZi4KKyAqLworc3RhdGljIGludCBkZWNpbWF0ZV9mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqY3VyLCBBVkZyYW1lICpyZWYpCit7CisgICAgRGVjaW1hdGVDb250ZXh0ICpkZWNpbWF0ZSA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcGxhbmU7CisKKyAgICBpZiAoZGVjaW1hdGUtPm1heF9kcm9wX2NvdW50ID4gMCAmJgorICAgICAgICBkZWNpbWF0ZS0+ZHJvcF9jb3VudCA+PSBkZWNpbWF0ZS0+bWF4X2Ryb3BfY291bnQpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChkZWNpbWF0ZS0+bWF4X2Ryb3BfY291bnQgPCAwICYmCisgICAgICAgIChkZWNpbWF0ZS0+ZHJvcF9jb3VudC0xKSA+IGRlY2ltYXRlLT5tYXhfZHJvcF9jb3VudCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcmVmLT5kYXRhW3BsYW5lXSAmJiByZWYtPmxpbmVzaXplW3BsYW5lXTsgcGxhbmUrKykgeworICAgICAgICBpbnQgdnN1YiA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IGRlY2ltYXRlLT52c3ViIDogMDsKKyAgICAgICAgaW50IGhzdWIgPSBwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIgPyBkZWNpbWF0ZS0+aHN1YiA6IDA7CisgICAgICAgIGlmIChkaWZmX3BsYW5lcyhjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXItPmRhdGFbcGxhbmVdLCBjdXItPmxpbmVzaXplW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+ZGF0YVtwbGFuZV0sIHJlZi0+bGluZXNpemVbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgRkZfQ0VJTF9SU0hJRlQocmVmLT53aWR0aCwgIGhzdWIpLAorICAgICAgICAgICAgICAgICAgICAgICAgRkZfQ0VJTF9SU0hJRlQocmVmLT5oZWlnaHQsIHZzdWIpKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBEZWNpbWF0ZUNvbnRleHQgKmRlY2ltYXRlID0gY3R4LT5wcml2OworCisgICAgZGVjaW1hdGUtPnNhZCA9IGF2X3BpeGVsdXRpbHNfZ2V0X3NhZF9mbigzLCAzLCAwLCBkZWNpbWF0ZSk7IC8vIDh4OCwgbm90IGFsaWduZWQgb24gYmxvY2tzaXplCisgICAgaWYgKCFkZWNpbWF0ZS0+c2FkKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJtYXhfZHJvcF9jb3VudDolZCBoaTolZCBsbzolZCBmcmFjOiVmXG4iLAorICAgICAgICAgICBkZWNpbWF0ZS0+bWF4X2Ryb3BfY291bnQsIGRlY2ltYXRlLT5oaSwgZGVjaW1hdGUtPmxvLCBkZWNpbWF0ZS0+ZnJhYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRGVjaW1hdGVDb250ZXh0ICpkZWNpbWF0ZSA9IGN0eC0+cHJpdjsKKyAgICBhdl9mcmFtZV9mcmVlKCZkZWNpbWF0ZS0+cmVmKTsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgICAgIEFWX1BJWF9GTVRfWVVWNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTBQLCAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMFAsICAgICBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgRGVjaW1hdGVDb250ZXh0ICpkZWNpbWF0ZSA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgZGVjaW1hdGUtPmhzdWIgPSBwaXhfZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBkZWNpbWF0ZS0+dnN1YiA9IHBpeF9kZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpjdXIpCit7CisgICAgRGVjaW1hdGVDb250ZXh0ICpkZWNpbWF0ZSA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIGludCByZXQ7CisKKyAgICBpZiAoZGVjaW1hdGUtPnJlZiAmJiBkZWNpbWF0ZV9mcmFtZShpbmxpbmstPmRzdCwgY3VyLCBkZWNpbWF0ZS0+cmVmKSkgeworICAgICAgICBkZWNpbWF0ZS0+ZHJvcF9jb3VudCA9IEZGTUFYKDEsIGRlY2ltYXRlLT5kcm9wX2NvdW50KzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmRlY2ltYXRlLT5yZWYpOworICAgICAgICBkZWNpbWF0ZS0+cmVmID0gY3VyOworICAgICAgICBkZWNpbWF0ZS0+ZHJvcF9jb3VudCA9IEZGTUlOKC0xLCBkZWNpbWF0ZS0+ZHJvcF9jb3VudC0xKTsKKworICAgICAgICBpZiAocmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGF2X2ZyYW1lX2Nsb25lKGN1cikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXZfbG9nKGlubGluay0+ZHN0LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICIlcyBwdHM6JXMgcHRzX3RpbWU6JXMgZHJvcF9jb3VudDolZFxuIiwKKyAgICAgICAgICAgZGVjaW1hdGUtPmRyb3BfY291bnQgPiAwID8gImRyb3AiIDogImtlZXAiLAorICAgICAgICAgICBhdl90czJzdHIoY3VyLT5wdHMpLCBhdl90czJ0aW1lc3RyKGN1ci0+cHRzLCAmaW5saW5rLT50aW1lX2Jhc2UpLAorICAgICAgICAgICBkZWNpbWF0ZS0+ZHJvcF9jb3VudCk7CisKKyAgICBpZiAoZGVjaW1hdGUtPmRyb3BfY291bnQgPiAwKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZjdXIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgRGVjaW1hdGVDb250ZXh0ICpkZWNpbWF0ZSA9IG91dGxpbmstPnNyYy0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IG91dGxpbmstPnNyYy0+aW5wdXRzWzBdOworICAgIGludCByZXQ7CisKKyAgICBkbyB7CisgICAgICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoaW5saW5rKTsKKyAgICB9IHdoaWxlIChkZWNpbWF0ZS0+ZHJvcF9jb3VudCA+IDAgJiYgcmV0ID49IDApOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG1wZGVjaW1hdGVfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBtcGRlY2ltYXRlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX21wZGVjaW1hdGUgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAibXBkZWNpbWF0ZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVtb3ZlIG5lYXItZHVwbGljYXRlIGZyYW1lcy4iKSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRGVjaW1hdGVDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZtcGRlY2ltYXRlX2NsYXNzLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IG1wZGVjaW1hdGVfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gbXBkZWNpbWF0ZV9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ub2lzZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX25vaXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjYWQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ub2lzZS5jCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIG5vaXNlIGdlbmVyYXRvcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZmX25vaXNlLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgVGhyZWFkRGF0YSB7CisgICAgQVZGcmFtZSAqaW4sICpvdXQ7Cit9IFRocmVhZERhdGE7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE5vaXNlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKKyNkZWZpbmUgTk9JU0VfUEFSQU1TKG5hbWUsIHgsIHBhcmFtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7I25hbWUiX3NlZWQiLCAic2V0IGNvbXBvbmVudCAjIiN4IiBub2lzZSBzZWVkIiwgT0ZGU0VUKHBhcmFtLnNlZWQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PS0xfSwgLTEsIElOVF9NQVgsIEZMQUdTfSwgICAgICAgIFwKKyAgICB7I25hbWUiX3N0cmVuZ3RoIiwgInNldCBjb21wb25lbnQgIyIjeCIgc3RyZW5ndGgiLCBPRkZTRVQocGFyYW0uc3RyZW5ndGgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxMDAsIEZMQUdTfSwgICAgICAgIFwKKyAgICB7I25hbWUicyIsICAgICAgICAgInNldCBjb21wb25lbnQgIyIjeCIgc3RyZW5ndGgiLCBPRkZTRVQocGFyYW0uc3RyZW5ndGgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxMDAsIEZMQUdTfSwgICAgICAgIFwKKyAgICB7I25hbWUiX2ZsYWdzIiwgInNldCBjb21wb25lbnQgIyIjeCIgZmxhZ3MiLCBPRkZTRVQocGFyYW0uZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQ9MH0sIDAsIDMxLCBGTEFHUywgI25hbWUiX2ZsYWdzIn0sIFwKKyAgICB7I25hbWUiZiIsICJzZXQgY29tcG9uZW50ICMiI3giIGZsYWdzIiwgT0ZGU0VUKHBhcmFtLmZsYWdzKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0PTB9LCAwLCAzMSwgRkxBR1MsICNuYW1lIl9mbGFncyJ9LCAgICAgIFwKKyAgICB7ImEiLCAiYXZlcmFnZWQgbm9pc2UiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Tk9JU0VfQVZFUkFHRUR9LCAwLCAwLCBGTEFHUywgI25hbWUiX2ZsYWdzIn0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7InAiLCAiKHNlbWkpcmVndWxhciBwYXR0ZXJuIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU5PSVNFX1BBVFRFUk59LCAgMCwgMCwgRkxBR1MsICNuYW1lIl9mbGFncyJ9LCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7InQiLCAidGVtcG9yYWwgbm9pc2UiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Tk9JU0VfVEVNUE9SQUx9LCAwLCAwLCBGTEFHUywgI25hbWUiX2ZsYWdzIn0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7InUiLCAidW5pZm9ybSBub2lzZSIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Tk9JU0VfVU5JRk9STX0sICAwLCAwLCBGTEFHUywgI25hbWUiX2ZsYWdzIn0sCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBub2lzZV9vcHRpb25zW10gPSB7CisgICAgTk9JU0VfUEFSQU1TKGFsbCwgMCwgYWxsKQorICAgIE5PSVNFX1BBUkFNUyhjMCwgIDAsIHBhcmFtWzBdKQorICAgIE5PSVNFX1BBUkFNUyhjMSwgIDEsIHBhcmFtWzFdKQorICAgIE5PSVNFX1BBUkFNUyhjMiwgIDIsIHBhcmFtWzJdKQorICAgIE5PSVNFX1BBUkFNUyhjMywgIDMsIHBhcmFtWzNdKQorICAgIHtOVUxMfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKG5vaXNlKTsKKworc3RhdGljIGNvbnN0IGludDhfdCBwYXR0WzRdID0geyAtMSwgMCwgMSwgMCB9OworCisjZGVmaW5lIFJBTkRfTihyYW5nZSkgKChpbnQpICgoZG91YmxlKSByYW5nZSAqIGF2X2xmZ19nZXQobGZnKSAvIChVSU5UX01BWCArIDEuMCkpKQorc3RhdGljIGF2X2NvbGQgaW50IGluaXRfbm9pc2UoTm9pc2VDb250ZXh0ICpuLCBpbnQgY29tcCkKK3sKKyAgICBpbnQ4X3QgKm5vaXNlID0gYXZfbWFsbG9jKE1BWF9OT0lTRSAqIHNpemVvZihpbnQ4X3QpKTsKKyAgICBGaWx0ZXJQYXJhbXMgKmZwID0gJm4tPnBhcmFtW2NvbXBdOworICAgIEFWTEZHICpsZmcgPSAmbi0+cGFyYW1bY29tcF0ubGZnOworICAgIGludCBzdHJlbmd0aCA9IGZwLT5zdHJlbmd0aDsKKyAgICBpbnQgZmxhZ3MgPSBmcC0+ZmxhZ3M7CisgICAgaW50IGksIGo7CisKKyAgICBpZiAoIW5vaXNlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZfbGZnX2luaXQoJmZwLT5sZmcsIGZwLT5zZWVkICsgY29tcCozMTQxNVUpOworCisgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBNQVhfTk9JU0U7IGkrKywgaisrKSB7CisgICAgICAgIGlmIChmbGFncyAmIE5PSVNFX1VOSUZPUk0pIHsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIE5PSVNFX0FWRVJBR0VEKSB7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgTk9JU0VfUEFUVEVSTikgeworICAgICAgICAgICAgICAgICAgICBub2lzZVtpXSA9IChSQU5EX04oc3RyZW5ndGgpIC0gc3RyZW5ndGggLyAyKSAvIDYKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcGF0dFtqICUgNF0gKiBzdHJlbmd0aCAqIDAuMjUgLyAzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5vaXNlW2ldID0gKFJBTkRfTihzdHJlbmd0aCkgLSBzdHJlbmd0aCAvIDIpIC8gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIE5PSVNFX1BBVFRFUk4pIHsKKyAgICAgICAgICAgICAgICAgICAgbm9pc2VbaV0gPSAoUkFORF9OKHN0cmVuZ3RoKSAtIHN0cmVuZ3RoIC8gMikgLyAyCisgICAgICAgICAgICAgICAgICAgICAgICArIHBhdHRbaiAlIDRdICogc3RyZW5ndGggKiAwLjI1OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5vaXNlW2ldID0gUkFORF9OKHN0cmVuZ3RoKSAtIHN0cmVuZ3RoIC8gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb3VibGUgeDEsIHgyLCB3LCB5MTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB4MSA9IDIuMCAqIGF2X2xmZ19nZXQobGZnKSAvIChmbG9hdClVSU5UX01BWCAtIDEuMDsKKyAgICAgICAgICAgICAgICB4MiA9IDIuMCAqIGF2X2xmZ19nZXQobGZnKSAvIChmbG9hdClVSU5UX01BWCAtIDEuMDsKKyAgICAgICAgICAgICAgICB3ID0geDEgKiB4MSArIHgyICogeDI7CisgICAgICAgICAgICB9IHdoaWxlICh3ID49IDEuMCk7CisKKyAgICAgICAgICAgIHcgICA9IHNxcnQoKC0yLjAgKiBsb2codykpIC8gdyk7CisgICAgICAgICAgICB5MSAgPSB4MSAqIHc7CisgICAgICAgICAgICB5MSAqPSBzdHJlbmd0aCAvIHNxcnQoMy4wKTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIE5PSVNFX1BBVFRFUk4pIHsKKyAgICAgICAgICAgICAgICB5MSAvPSAyOworICAgICAgICAgICAgICAgIHkxICs9IHBhdHRbaiAlIDRdICogc3RyZW5ndGggKiAwLjM1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgeTEgPSBhdl9jbGlwZih5MSwgLTEyOCwgMTI3KTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIE5PSVNFX0FWRVJBR0VEKQorICAgICAgICAgICAgICAgIHkxIC89IDMuMDsKKyAgICAgICAgICAgIG5vaXNlW2ldID0gKGludCl5MTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUkFORF9OKDYpID09IDApCisgICAgICAgICAgICBqLS07CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9SRVM7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKKyAgICAgICAgICAgIGZwLT5wcmV2X3NoaWZ0W2ldW2pdID0gbm9pc2UgKyAoYXZfbGZnX2dldChsZmcpICYgKE1BWF9TSElGVCAtIDEpKTsKKworICAgIGZwLT5ub2lzZSA9IG5vaXNlOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gTlVMTDsKKyAgICBpbnQgZm10OworCisgICAgZm9yIChmbXQgPSAwOyBhdl9waXhfZm10X2Rlc2NfZ2V0KGZtdCk7IGZtdCsrKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZm10KTsKKyAgICAgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiAmJiAhKChkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSArIDEpICYgNykpCisgICAgICAgICAgICBmZl9hZGRfZm9ybWF0KCZmb3JtYXRzLCBmbXQpOworICAgIH0KKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBOb2lzZUNvbnRleHQgKm4gPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBpbnQgcmV0OworCisgICAgbi0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhuLT5ieXRld2lkdGgsIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBuLT5oZWlnaHRbMV0gPSBuLT5oZWlnaHRbMl0gPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgIG4tPmhlaWdodFswXSA9IG4tPmhlaWdodFszXSA9IGlubGluay0+aDsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX2xpbmVfbm9pc2VfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgaW50OF90ICpub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBzaGlmdCkKK3sKKyAgICBpbnQgaTsKKworICAgIG5vaXNlICs9IHNoaWZ0OworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpbnQgdiA9IHNyY1tpXSArIG5vaXNlW2ldOworCisgICAgICAgIGRzdFtpXSA9IGF2X2NsaXBfdWludDgodik7CisgICAgfQorfQorCit2b2lkIGZmX2xpbmVfbm9pc2VfYXZnX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgY29uc3QgaW50OF90ICogY29uc3QgKnNoaWZ0KQoreworICAgIGludCBpOworICAgIGNvbnN0IGludDhfdCAqc3JjMiA9IChjb25zdCBpbnQ4X3QqKXNyYzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBjb25zdCBpbnQgbiA9IHNoaWZ0WzBdW2ldICsgc2hpZnRbMV1baV0gKyBzaGlmdFsyXVtpXTsKKyAgICAgICAgZHN0W2ldID0gc3JjMltpXSArICgobiAqIHNyYzJbaV0pID4+IDcpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbm9pc2UodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICBpbnQgZHN0X2xpbmVzaXplLCBpbnQgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgc3RhcnQsIGludCBlbmQsIE5vaXNlQ29udGV4dCAqbiwgaW50IGNvbXApCit7CisgICAgRmlsdGVyUGFyYW1zICpwID0gJm4tPnBhcmFtW2NvbXBdOworICAgIGludDhfdCAqbm9pc2UgPSBwLT5ub2lzZTsKKyAgICBjb25zdCBpbnQgZmxhZ3MgPSBwLT5mbGFnczsKKyAgICBpbnQgeTsKKworICAgIGlmICghbm9pc2UpIHsKKyAgICAgICAgaWYgKGRzdCAhPSBzcmMpCisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGRzdCwgZHN0X2xpbmVzaXplLCBzcmMsIHNyY19saW5lc2l6ZSwgd2lkdGgsIGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kOyB5KyspIHsKKyAgICAgICAgY29uc3QgaW50IGl4ID0geSAmIChNQVhfUkVTIC0gMSk7CisgICAgICAgIGludCB4OworICAgICAgICBmb3IgKHg9MDsgeCA8IHdpZHRoOyB4Kz0gTUFYX1JFUykgeworICAgICAgICAgICAgaW50IHcgPSBGRk1JTih3aWR0aCAtIHgsIE1BWF9SRVMpOworICAgICAgICAgICAgaW50IHNoaWZ0ID0gcC0+cmFuZF9zaGlmdFtpeF07CisKKyAgICAgICAgICAgIGlmIChmbGFncyAmIE5PSVNFX0FWRVJBR0VEKSB7CisgICAgICAgICAgICAgICAgbi0+bGluZV9ub2lzZV9hdmcoZHN0ICsgeCwgc3JjICsgeCwgdywgKGNvbnN0IGludDhfdCoqKXAtPnByZXZfc2hpZnRbaXhdKTsKKyAgICAgICAgICAgICAgICBwLT5wcmV2X3NoaWZ0W2l4XVtzaGlmdCAmIDNdID0gbm9pc2UgKyBzaGlmdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbi0+bGluZV9ub2lzZShkc3QgKyB4LCBzcmMgKyB4LCBub2lzZSwgdywgc2hpZnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRzdCArPSBkc3RfbGluZXNpemU7CisgICAgICAgIHNyYyArPSBzcmNfbGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGZpbHRlcl9zbGljZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIE5vaXNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBpbnQgcGxhbmU7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBzLT5uYl9wbGFuZXM7IHBsYW5lKyspIHsKKyAgICAgICAgY29uc3QgaW50IGhlaWdodCA9IHMtPmhlaWdodFtwbGFuZV07CisgICAgICAgIGNvbnN0IGludCBzdGFydCAgPSAoaGVpZ2h0ICogIGpvYm5yICAgKSAvIG5iX2pvYnM7CisgICAgICAgIGNvbnN0IGludCBlbmQgICAgPSAoaGVpZ2h0ICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgICAgIG5vaXNlKHRkLT5vdXQtPmRhdGFbcGxhbmVdICsgc3RhcnQgKiB0ZC0+b3V0LT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgIHRkLT5pbi0+ZGF0YVtwbGFuZV0gICsgc3RhcnQgKiB0ZC0+aW4tPmxpbmVzaXplW3BsYW5lXSwKKyAgICAgICAgICAgICAgdGQtPm91dC0+bGluZXNpemVbcGxhbmVdLCB0ZC0+aW4tPmxpbmVzaXplW3BsYW5lXSwKKyAgICAgICAgICAgICAgcy0+Ynl0ZXdpZHRoW3BsYW5lXSwgc3RhcnQsIGVuZCwgcywgcGxhbmUpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucGljcmVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIE5vaXNlQ29udGV4dCAqbiA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhIHRkOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBpbnQgY29tcCwgaTsKKworICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShpbnBpY3JlZikpIHsKKyAgICAgICAgb3V0ID0gaW5waWNyZWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICAgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlucGljcmVmKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGlucGljcmVmKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNDsgY29tcCsrKSB7CisgICAgICAgIEZpbHRlclBhcmFtcyAqZnAgPSAmbi0+cGFyYW1bY29tcF07CisKKyAgICAgICAgaWYgKCghZnAtPnJhbmRfc2hpZnRfaW5pdCB8fCAoZnAtPmZsYWdzICYgTk9JU0VfVEVNUE9SQUwpKSAmJiBmcC0+c3RyZW5ndGgpIHsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9SRVM7IGkrKykgeworICAgICAgICAgICAgICAgIGZwLT5yYW5kX3NoaWZ0W2ldID0gYXZfbGZnX2dldCgmZnAtPmxmZykgJiAoTUFYX1NISUZUIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcC0+cmFuZF9zaGlmdF9pbml0ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRkLmluID0gaW5waWNyZWY7IHRkLm91dCA9IG91dDsKKyAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlLCAmdGQsIE5VTEwsIEZGTUlOKG4tPmhlaWdodFswXSwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworICAgIGVtbXNfYygpOworCisgICAgaWYgKGlucGljcmVmICE9IG91dCkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5waWNyZWYpOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTm9pc2VDb250ZXh0ICpuID0gY3R4LT5wcml2OworICAgIGludCByZXQsIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGlmIChuLT5hbGwuc2VlZCA+PSAwKQorICAgICAgICAgICAgbi0+cGFyYW1baV0uc2VlZCA9IG4tPmFsbC5zZWVkOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuLT5wYXJhbVtpXS5zZWVkID0gMTIzNDU3OworICAgICAgICBpZiAobi0+YWxsLnN0cmVuZ3RoKQorICAgICAgICAgICAgbi0+cGFyYW1baV0uc3RyZW5ndGggPSBuLT5hbGwuc3RyZW5ndGg7CisgICAgICAgIGlmIChuLT5hbGwuZmxhZ3MpCisgICAgICAgICAgICBuLT5wYXJhbVtpXS5mbGFncyA9IG4tPmFsbC5mbGFnczsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGlmIChuLT5wYXJhbVtpXS5zdHJlbmd0aCAmJiAoKHJldCA9IGluaXRfbm9pc2UobiwgaSkpIDwgMCkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG4tPmxpbmVfbm9pc2UgICAgID0gZmZfbGluZV9ub2lzZV9jOworICAgIG4tPmxpbmVfbm9pc2VfYXZnID0gZmZfbGluZV9ub2lzZV9hdmdfYzsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfbm9pc2VfaW5pdF94ODYobik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTm9pc2VDb250ZXh0ICpuID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJm4tPnBhcmFtW2ldLm5vaXNlKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG5vaXNlX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbm9pc2Vfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX25vaXNlID0geworICAgIC5uYW1lICAgICAgICAgID0gIm5vaXNlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBZGQgbm9pc2UuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTm9pc2VDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gbm9pc2VfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gbm9pc2Vfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZub2lzZV9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDIHwgQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ub2lzZS5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX25vaXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwN2VkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9ub2lzZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9OT0lTRV9ICisjZGVmaW5lIEFWRklMVEVSX05PSVNFX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorCisjZGVmaW5lIE1BWF9OT0lTRSA1MTIwCisjZGVmaW5lIE1BWF9TSElGVCAxMDI0CisjZGVmaW5lIE1BWF9SRVMgKE1BWF9OT0lTRS1NQVhfU0hJRlQpCisKKyNkZWZpbmUgTk9JU0VfVU5JRk9STSAgMQorI2RlZmluZSBOT0lTRV9URU1QT1JBTCAyCisjZGVmaW5lIE5PSVNFX0FWRVJBR0VEIDgKKyNkZWZpbmUgTk9JU0VfUEFUVEVSTiAgMTYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBzdHJlbmd0aDsKKyAgICB1bnNpZ25lZCBmbGFnczsKKyAgICBBVkxGRyBsZmc7CisgICAgaW50IHNlZWQ7CisgICAgaW50OF90ICpub2lzZTsKKyAgICBpbnQ4X3QgKnByZXZfc2hpZnRbTUFYX1JFU11bM107CisgICAgaW50IHJhbmRfc2hpZnRbTUFYX1JFU107CisgICAgaW50IHJhbmRfc2hpZnRfaW5pdDsKK30gRmlsdGVyUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IG5iX3BsYW5lczsKKyAgICBpbnQgYnl0ZXdpZHRoWzRdOworICAgIGludCBoZWlnaHRbNF07CisgICAgRmlsdGVyUGFyYW1zIGFsbDsKKyAgICBGaWx0ZXJQYXJhbXMgcGFyYW1bNF07CisgICAgdm9pZCAoKmxpbmVfbm9pc2UpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCBpbnQ4X3QgKm5vaXNlLCBpbnQgbGVuLCBpbnQgc2hpZnQpOworICAgIHZvaWQgKCpsaW5lX25vaXNlX2F2ZykodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4sIGNvbnN0IGludDhfdCAqIGNvbnN0ICpzaGlmdCk7Cit9IE5vaXNlQ29udGV4dDsKKwordm9pZCBmZl9saW5lX25vaXNlX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IGludDhfdCAqbm9pc2UsIGludCBsZW4sIGludCBzaGlmdCk7Cit2b2lkIGZmX2xpbmVfbm9pc2VfYXZnX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4sIGNvbnN0IGludDhfdCAqIGNvbnN0ICpzaGlmdCk7CisKK3ZvaWQgZmZfbm9pc2VfaW5pdF94ODYoTm9pc2VDb250ZXh0ICpuKTsKKworI2VuZGlmIC8qIEFWRklMVEVSX05PSVNFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9udWxsLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfbnVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTU2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfbnVsbC5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbnVsbCB2aWRlbyBmaWx0ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9udWxsX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9udWxsX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9udWxsID0geworICAgIC5uYW1lICAgICAgICA9ICJudWxsIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUGFzcyB0aGUgc291cmNlIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0LiIpLAorICAgIC5pbnB1dHMgICAgICA9IGF2ZmlsdGVyX3ZmX251bGxfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IGF2ZmlsdGVyX3ZmX251bGxfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfb3ZlcmxheS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX292ZXJsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ5OWJkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX292ZXJsYXkuYwpAQCAtMCwwICsxLDY3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTdGVmYW5vIFNhYmF0aW5pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQmFwdGlzdGUgQ291ZHVyaWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQm9iYnkgQmluZ2hhbQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBvdmVybGF5IG9uZSB2aWRlbyBvbiB0b3Agb2YgYW5vdGhlcgorICovCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkdWFsaW5wdXQuaCIKKyNpbmNsdWRlICJkcmF3dXRpbHMuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFyX25hbWVzW10gPSB7CisgICAgIm1haW5fdyIsICAgICJXIiwgLy8vPCB3aWR0aCAgb2YgdGhlIG1haW4gICAgdmlkZW8KKyAgICAibWFpbl9oIiwgICAgIkgiLCAvLy88IGhlaWdodCBvZiB0aGUgbWFpbiAgICB2aWRlbworICAgICJvdmVybGF5X3ciLCAidyIsIC8vLzwgd2lkdGggIG9mIHRoZSBvdmVybGF5IHZpZGVvCisgICAgIm92ZXJsYXlfaCIsICJoIiwgLy8vPCBoZWlnaHQgb2YgdGhlIG92ZXJsYXkgdmlkZW8KKyAgICAiaHN1YiIsCisgICAgInZzdWIiLAorICAgICJ4IiwKKyAgICAieSIsCisgICAgIm4iLCAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGZyYW1lCisgICAgInBvcyIsICAgICAgICAgIC8vLzwgcG9zaXRpb24gaW4gdGhlIGZpbGUKKyAgICAidCIsICAgICAgICAgICAgLy8vPCB0aW1lc3RhbXAgZXhwcmVzc2VkIGluIHNlY29uZHMKKyAgICBOVUxMCit9OworCitlbnVtIHZhcl9uYW1lIHsKKyAgICBWQVJfTUFJTl9XLCAgICBWQVJfTVcsCisgICAgVkFSX01BSU5fSCwgICAgVkFSX01ILAorICAgIFZBUl9PVkVSTEFZX1csIFZBUl9PVywKKyAgICBWQVJfT1ZFUkxBWV9ILCBWQVJfT0gsCisgICAgVkFSX0hTVUIsCisgICAgVkFSX1ZTVUIsCisgICAgVkFSX1gsCisgICAgVkFSX1ksCisgICAgVkFSX04sCisgICAgVkFSX1BPUywKKyAgICBWQVJfVCwKKyAgICBWQVJfVkFSU19OQgorfTsKKworZW51bSBFT0ZBY3Rpb24geworICAgIEVPRl9BQ1RJT05fUkVQRUFULAorICAgIEVPRl9BQ1RJT05fRU5EQUxMLAorICAgIEVPRl9BQ1RJT05fUEFTUworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlb2ZfYWN0aW9uX3N0cltdID0geworICAgICJyZXBlYXQiLCAiZW5kYWxsIiwgInBhc3MiCit9OworCisjZGVmaW5lIE1BSU4gICAgMAorI2RlZmluZSBPVkVSTEFZIDEKKworI2RlZmluZSBSIDAKKyNkZWZpbmUgRyAxCisjZGVmaW5lIEIgMgorI2RlZmluZSBBIDMKKworI2RlZmluZSBZIDAKKyNkZWZpbmUgVSAxCisjZGVmaW5lIFYgMgorCit0eXBlZGVmIHN0cnVjdCBPdmVybGF5Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHgsIHk7ICAgICAgICAgICAgICAgICAgIC8vLzwgcG9zaXRpb24gb2Ygb3ZlcmxheWVkIHBpY3R1cmUKKworICAgIGludCBhbGxvd19wYWNrZWRfcmdiOworICAgIHVpbnQ4X3QgbWFpbl9pc19wYWNrZWRfcmdiOworICAgIHVpbnQ4X3QgbWFpbl9yZ2JhX21hcFs0XTsKKyAgICB1aW50OF90IG1haW5faGFzX2FscGhhOworICAgIHVpbnQ4X3Qgb3ZlcmxheV9pc19wYWNrZWRfcmdiOworICAgIHVpbnQ4X3Qgb3ZlcmxheV9yZ2JhX21hcFs0XTsKKyAgICB1aW50OF90IG92ZXJsYXlfaGFzX2FscGhhOworICAgIGVudW0gT3ZlcmxheUZvcm1hdCB7IE9WRVJMQVlfRk9STUFUX1lVVjQyMCwgT1ZFUkxBWV9GT1JNQVRfWVVWNDIyLCBPVkVSTEFZX0ZPUk1BVF9ZVVY0NDQsIE9WRVJMQVlfRk9STUFUX1JHQiwgT1ZFUkxBWV9GT1JNQVRfTkJ9IGZvcm1hdDsKKyAgICBlbnVtIEV2YWxNb2RlIHsgRVZBTF9NT0RFX0lOSVQsIEVWQUxfTU9ERV9GUkFNRSwgRVZBTF9NT0RFX05CIH0gZXZhbF9tb2RlOworCisgICAgRkZEdWFsSW5wdXRDb250ZXh0IGRpbnB1dDsKKworICAgIGludCBtYWluX3BpeF9zdGVwWzRdOyAgICAgICAvLy88IHN0ZXBzIHBlciBwaXhlbCBmb3IgZWFjaCBwbGFuZSBvZiB0aGUgbWFpbiBvdXRwdXQKKyAgICBpbnQgb3ZlcmxheV9waXhfc3RlcFs0XTsgICAgLy8vPCBzdGVwcyBwZXIgcGl4ZWwgZm9yIGVhY2ggcGxhbmUgb2YgdGhlIG92ZXJsYXkKKyAgICBpbnQgaHN1YiwgdnN1YjsgICAgICAgICAgICAgLy8vPCBjaHJvbWEgc3Vic2FtcGxpbmcgdmFsdWVzCisKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJfVkFSU19OQl07CisgICAgY2hhciAqeF9leHByLCAqeV9leHByOworCisgICAgZW51bSBFT0ZBY3Rpb24gZW9mX2FjdGlvbjsgIC8vLzwgYWN0aW9uIHRvIHRha2Ugb24gRU9GIGZyb20gc291cmNlCisKKyAgICBBVkV4cHIgKnhfcGV4cHIsICp5X3BleHByOworfSBPdmVybGF5Q29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgT3ZlcmxheUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBmZl9kdWFsaW5wdXRfdW5pbml0KCZzLT5kaW5wdXQpOworICAgIGF2X2V4cHJfZnJlZShzLT54X3BleHByKTsgcy0+eF9wZXhwciA9IE5VTEw7CisgICAgYXZfZXhwcl9mcmVlKHMtPnlfcGV4cHIpOyBzLT55X3BleHByID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbm9ybWFsaXplX3h5KGRvdWJsZSBkLCBpbnQgY2hyb21hX3N1YikKK3sKKyAgICBpZiAoaXNuYW4oZCkpCisgICAgICAgIHJldHVybiBJTlRfTUFYOworICAgIHJldHVybiAoaW50KWQgJiB+KCgxIDw8IGNocm9tYV9zdWIpIC0gMSk7Cit9CisKK3N0YXRpYyB2b2lkIGV2YWxfZXhwcihBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBPdmVybGF5Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1hdID0gYXZfZXhwcl9ldmFsKHMtPnhfcGV4cHIsIHMtPnZhcl92YWx1ZXMsIE5VTEwpOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1ldID0gYXZfZXhwcl9ldmFsKHMtPnlfcGV4cHIsIHMtPnZhcl92YWx1ZXMsIE5VTEwpOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1hdID0gYXZfZXhwcl9ldmFsKHMtPnhfcGV4cHIsIHMtPnZhcl92YWx1ZXMsIE5VTEwpOworICAgIHMtPnggPSBub3JtYWxpemVfeHkocy0+dmFyX3ZhbHVlc1tWQVJfWF0sIHMtPmhzdWIpOworICAgIHMtPnkgPSBub3JtYWxpemVfeHkocy0+dmFyX3ZhbHVlc1tWQVJfWV0sIHMtPnZzdWIpOworfQorCitzdGF0aWMgaW50IHNldF9leHByKEFWRXhwciAqKnBleHByLCBjb25zdCBjaGFyICpleHByLCBjb25zdCBjaGFyICpvcHRpb24sIHZvaWQgKmxvZ19jdHgpCit7CisgICAgaW50IHJldDsKKyAgICBBVkV4cHIgKm9sZCA9IE5VTEw7CisKKyAgICBpZiAoKnBleHByKQorICAgICAgICBvbGQgPSAqcGV4cHI7CisgICAgcmV0ID0gYXZfZXhwcl9wYXJzZShwZXhwciwgZXhwciwgdmFyX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbG9nX2N0eCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJFcnJvciB3aGVuIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gJyVzJyBmb3IgJXNcbiIsCisgICAgICAgICAgICAgICBleHByLCBvcHRpb24pOworICAgICAgICAqcGV4cHIgPSBvbGQ7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXZfZXhwcl9mcmVlKG9sZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19jb21tYW5kKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZXMsIGludCByZXNfbGVuLCBpbnQgZmxhZ3MpCit7CisgICAgT3ZlcmxheUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIGlmICAgICAgKCFzdHJjbXAoY21kLCAieCIpKQorICAgICAgICByZXQgPSBzZXRfZXhwcigmcy0+eF9wZXhwciwgYXJncywgY21kLCBjdHgpOworICAgIGVsc2UgaWYgKCFzdHJjbXAoY21kLCAieSIpKQorICAgICAgICByZXQgPSBzZXRfZXhwcigmcy0+eV9wZXhwciwgYXJncywgY21kLCBjdHgpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9TWVMpOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+ZXZhbF9tb2RlID09IEVWQUxfTU9ERV9JTklUKSB7CisgICAgICAgIGV2YWxfZXhwcihjdHgpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIng6JWYgeGk6JWQgeTolZiB5aTolZFxuIiwKKyAgICAgICAgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1hdLCBzLT54LAorICAgICAgICAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfWV0sIHMtPnkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgT3ZlcmxheUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICAvKiBvdmVybGF5IGZvcm1hdHMgY29udGFpbnMgYWxwaGEsIGZvciBhdm9pZGluZyBjb252ZXJzaW9uIHdpdGggYWxwaGEgaW5mb3JtYXRpb24gbG9zcyAqLworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbWFpbl9waXhfZm10c195dXY0MjBbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3ZlcmxheV9waXhfZm10c195dXY0MjBbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbWFpbl9waXhfZm10c195dXY0MjJbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLCBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3ZlcmxheV9waXhfZm10c195dXY0MjJbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbWFpbl9waXhfZm10c195dXY0NDRbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3ZlcmxheV9waXhfZm10c195dXY0NDRbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbWFpbl9waXhfZm10c19yZ2JbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9BUkdCLCAgQVZfUElYX0ZNVF9SR0JBLAorICAgICAgICBBVl9QSVhfRk1UX0FCR1IsICBBVl9QSVhfRk1UX0JHUkEsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCMjQsIEFWX1BJWF9GTVRfQkdSMjQsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBvdmVybGF5X3BpeF9mbXRzX3JnYltdID0geworICAgICAgICBBVl9QSVhfRk1UX0FSR0IsICBBVl9QSVhfRk1UX1JHQkEsCisgICAgICAgIEFWX1BJWF9GTVRfQUJHUiwgIEFWX1BJWF9GTVRfQkdSQSwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIEFWRmlsdGVyRm9ybWF0cyAqbWFpbl9mb3JtYXRzOworICAgIEFWRmlsdGVyRm9ybWF0cyAqb3ZlcmxheV9mb3JtYXRzOworCisgICAgc3dpdGNoIChzLT5mb3JtYXQpIHsKKyAgICBjYXNlIE9WRVJMQVlfRk9STUFUX1lVVjQyMDoKKyAgICAgICAgbWFpbl9mb3JtYXRzICAgID0gZmZfbWFrZV9mb3JtYXRfbGlzdChtYWluX3BpeF9mbXRzX3l1djQyMCk7CisgICAgICAgIG92ZXJsYXlfZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qob3ZlcmxheV9waXhfZm10c195dXY0MjApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9WRVJMQVlfRk9STUFUX1lVVjQyMjoKKyAgICAgICAgbWFpbl9mb3JtYXRzICAgID0gZmZfbWFrZV9mb3JtYXRfbGlzdChtYWluX3BpeF9mbXRzX3l1djQyMik7CisgICAgICAgIG92ZXJsYXlfZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qob3ZlcmxheV9waXhfZm10c195dXY0MjIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9WRVJMQVlfRk9STUFUX1lVVjQ0NDoKKyAgICAgICAgbWFpbl9mb3JtYXRzICAgID0gZmZfbWFrZV9mb3JtYXRfbGlzdChtYWluX3BpeF9mbXRzX3l1djQ0NCk7CisgICAgICAgIG92ZXJsYXlfZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qob3ZlcmxheV9waXhfZm10c195dXY0NDQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9WRVJMQVlfRk9STUFUX1JHQjoKKyAgICAgICAgbWFpbl9mb3JtYXRzICAgID0gZmZfbWFrZV9mb3JtYXRfbGlzdChtYWluX3BpeF9mbXRzX3JnYik7CisgICAgICAgIG92ZXJsYXlfZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qob3ZlcmxheV9waXhfZm10c19yZ2IpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIGZmX2Zvcm1hdHNfcmVmKG1haW5fZm9ybWF0cywgICAgJmN0eC0+aW5wdXRzIFtNQUlOICAgXS0+b3V0X2Zvcm1hdHMpOworICAgIGZmX2Zvcm1hdHNfcmVmKG92ZXJsYXlfZm9ybWF0cywgJmN0eC0+aW5wdXRzIFtPVkVSTEFZXS0+b3V0X2Zvcm1hdHMpOworICAgIGZmX2Zvcm1hdHNfcmVmKG1haW5fZm9ybWF0cywgICAgJmN0eC0+b3V0cHV0c1tNQUlOICAgXS0+aW5fZm9ybWF0cyApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgYWxwaGFfcGl4X2ZtdHNbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLAorICAgIEFWX1BJWF9GTVRfQVJHQiwgQVZfUElYX0ZNVF9BQkdSLCBBVl9QSVhfRk1UX1JHQkEsCisgICAgQVZfUElYX0ZNVF9CR1JBLCBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0X21haW4oQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgT3ZlcmxheUNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisKKyAgICBhdl9pbWFnZV9maWxsX21heF9waXhzdGVwcyhzLT5tYWluX3BpeF9zdGVwLCAgICBOVUxMLCBwaXhfZGVzYyk7CisKKyAgICBzLT5oc3ViID0gcGl4X2Rlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgcy0+dnN1YiA9IHBpeF9kZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgcy0+bWFpbl9pc19wYWNrZWRfcmdiID0KKyAgICAgICAgZmZfZmlsbF9yZ2JhX21hcChzLT5tYWluX3JnYmFfbWFwLCBpbmxpbmstPmZvcm1hdCkgPj0gMDsKKyAgICBzLT5tYWluX2hhc19hbHBoYSA9IGZmX2ZtdF9pc19pbihpbmxpbmstPmZvcm1hdCwgYWxwaGFfcGl4X2ZtdHMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dF9vdmVybGF5KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ICA9IGlubGluay0+ZHN0OworICAgIE92ZXJsYXlDb250ZXh0ICAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGludCByZXQ7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhfZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworCisgICAgYXZfaW1hZ2VfZmlsbF9tYXhfcGl4c3RlcHMocy0+b3ZlcmxheV9waXhfc3RlcCwgTlVMTCwgcGl4X2Rlc2MpOworCisgICAgLyogRmluaXNoIHRoZSBjb25maWd1cmF0aW9uIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zCisgICAgICAgbm93IHdoZW4gYm90aCBpbnB1dHMgYXJlIGNvbmZpZ3VyZWQuICovCisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfTUFJTl9XICAgXSA9IHMtPnZhcl92YWx1ZXNbVkFSX01XXSA9IGN0eC0+aW5wdXRzW01BSU4gICBdLT53OworICAgIHMtPnZhcl92YWx1ZXNbVkFSX01BSU5fSCAgIF0gPSBzLT52YXJfdmFsdWVzW1ZBUl9NSF0gPSBjdHgtPmlucHV0c1tNQUlOICAgXS0+aDsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9PVkVSTEFZX1ddID0gcy0+dmFyX3ZhbHVlc1tWQVJfT1ddID0gY3R4LT5pbnB1dHNbT1ZFUkxBWV0tPnc7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfT1ZFUkxBWV9IXSA9IHMtPnZhcl92YWx1ZXNbVkFSX09IXSA9IGN0eC0+aW5wdXRzW09WRVJMQVldLT5oOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX0hTVUJdICA9IDE8PHBpeF9kZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1ZTVUJdICA9IDE8PHBpeF9kZXNjLT5sb2cyX2Nocm9tYV9oOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1hdICAgICA9IE5BTjsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9ZXSAgICAgPSBOQU47CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfTl0gICAgID0gMDsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9UXSAgICAgPSBOQU47CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfUE9TXSAgID0gTkFOOworCisgICAgaWYgKChyZXQgPSBzZXRfZXhwcigmcy0+eF9wZXhwciwgICAgICBzLT54X2V4cHIsICAgICAgIngiLCAgICAgIGN0eCkpIDwgMCB8fAorICAgICAgICAocmV0ID0gc2V0X2V4cHIoJnMtPnlfcGV4cHIsICAgICAgcy0+eV9leHByLCAgICAgICJ5IiwgICAgICBjdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5vdmVybGF5X2lzX3BhY2tlZF9yZ2IgPQorICAgICAgICBmZl9maWxsX3JnYmFfbWFwKHMtPm92ZXJsYXlfcmdiYV9tYXAsIGlubGluay0+Zm9ybWF0KSA+PSAwOworICAgIHMtPm92ZXJsYXlfaGFzX2FscGhhID0gZmZfZm10X2lzX2luKGlubGluay0+Zm9ybWF0LCBhbHBoYV9waXhfZm10cyk7CisKKyAgICBpZiAocy0+ZXZhbF9tb2RlID09IEVWQUxfTU9ERV9JTklUKSB7CisgICAgICAgIGV2YWxfZXhwcihjdHgpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIng6JWYgeGk6JWQgeTolZiB5aTolZFxuIiwKKyAgICAgICAgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1hdLCBzLT54LAorICAgICAgICAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfWV0sIHMtPnkpOworICAgIH0KKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAibWFpbiB3OiVkIGg6JWQgZm10OiVzIG92ZXJsYXkgdzolZCBoOiVkIGZtdDolcyBlb2ZfYWN0aW9uOiVzXG4iLAorICAgICAgICAgICBjdHgtPmlucHV0c1tNQUlOXS0+dywgY3R4LT5pbnB1dHNbTUFJTl0tPmgsCisgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoY3R4LT5pbnB1dHNbTUFJTl0tPmZvcm1hdCksCisgICAgICAgICAgIGN0eC0+aW5wdXRzW09WRVJMQVldLT53LCBjdHgtPmlucHV0c1tPVkVSTEFZXS0+aCwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShjdHgtPmlucHV0c1tPVkVSTEFZXS0+Zm9ybWF0KSwKKyAgICAgICAgICAgZW9mX2FjdGlvbl9zdHJbcy0+ZW9mX2FjdGlvbl0pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIE92ZXJsYXlDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2R1YWxpbnB1dF9pbml0KGN0eCwgJnMtPmRpbnB1dCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG91dGxpbmstPncgPSBjdHgtPmlucHV0c1tNQUlOXS0+dzsKKyAgICBvdXRsaW5rLT5oID0gY3R4LT5pbnB1dHNbTUFJTl0tPmg7CisgICAgb3V0bGluay0+dGltZV9iYXNlID0gY3R4LT5pbnB1dHNbTUFJTl0tPnRpbWVfYmFzZTsKKworICAgIHJldHVybiAwOworfQorCisvLyBkaXZpZGUgYnkgMjU1IGFuZCByb3VuZCB0byBuZWFyZXN0CisvLyBhcHBseSBhIGZhc3QgdmFyaWFudDogKFgrMTI3KS8yNTUgPSAoKFgrMTI3KSoyNTcrMjU3KT4+MTYgPSAoKFgrMTI4KSoyNTcpPj4xNgorI2RlZmluZSBGQVNUX0RJVjI1NSh4KSAoKCgoeCkgKyAxMjgpICogMjU3KSA+PiAxNikKKworLy8gY2FsY3VsYXRlIHRoZSB1bnByZW11bHRpcGxpZWQgYWxwaGEsIGFwcGx5aW5nIHRoZSBnZW5lcmFsIGVxdWF0aW9uOgorLy8gYWxwaGEgPSBhbHBoYV9vdmVybGF5IC8gKCAoYWxwaGFfbWFpbiArIGFscGhhX292ZXJsYXkpIC0gKGFscGhhX21haW4gKiBhbHBoYV9vdmVybGF5KSApCisvLyAoKCh4KSA8PCAxNikgLSAoKHgpIDw8IDkpICsgKHgpKSBpcyBhIGZhc3RlciB2ZXJzaW9uIG9mOiAyNTUgKiAyNTUgKiB4CisvLyAoKCgoeCkgKyAoeSkpIDw8IDgpIC0gKCh4KSArICh5KSkgLSAoeSkgKiAoeCkpIGlzIGEgZmFzdGVyIHZlcnNpb24gb2Y6IDI1NSAqICh4ICsgeSkKKyNkZWZpbmUgVU5QUkVNVUxUSVBMWV9BTFBIQSh4LCB5KSAoKCgoeCkgPDwgMTYpIC0gKCh4KSA8PCA5KSArICh4KSkgLyAoKCgoeCkgKyAoeSkpIDw8IDgpIC0gKCh4KSArICh5KSkgLSAoeSkgKiAoeCkpKQorCisvKioKKyAqIEJsZW5kIGltYWdlIGluIHNyYyB0byBkZXN0aW5hdGlvbiBidWZmZXIgZHN0IGF0IHBvc2l0aW9uICh4LCB5KS4KKyAqLworc3RhdGljIHZvaWQgYmxlbmRfaW1hZ2UoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSkKK3sKKyAgICBPdmVybGF5Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgaW1heCwgaiwgam1heCwgaywga21heDsKKyAgICBjb25zdCBpbnQgc3JjX3cgPSBzcmMtPndpZHRoOworICAgIGNvbnN0IGludCBzcmNfaCA9IHNyYy0+aGVpZ2h0OworICAgIGNvbnN0IGludCBkc3RfdyA9IGRzdC0+d2lkdGg7CisgICAgY29uc3QgaW50IGRzdF9oID0gZHN0LT5oZWlnaHQ7CisKKyAgICBpZiAoeCA+PSBkc3RfdyB8fCB4K3NyY193IDwgMCB8fAorICAgICAgICB5ID49IGRzdF9oIHx8IHkrc3JjX2ggPCAwKQorICAgICAgICByZXR1cm47IC8qIG5vIGludGVyc2VjdGlvbiAqLworCisgICAgaWYgKHMtPm1haW5faXNfcGFja2VkX3JnYikgeworICAgICAgICB1aW50OF90IGFscGhhOyAgICAgICAgICAvLy88IHRoZSBhbW91bnQgb2Ygb3ZlcmxheSB0byBibGVuZCBvbiB0byBtYWluCisgICAgICAgIGNvbnN0IGludCBkciA9IHMtPm1haW5fcmdiYV9tYXBbUl07CisgICAgICAgIGNvbnN0IGludCBkZyA9IHMtPm1haW5fcmdiYV9tYXBbR107CisgICAgICAgIGNvbnN0IGludCBkYiA9IHMtPm1haW5fcmdiYV9tYXBbQl07CisgICAgICAgIGNvbnN0IGludCBkYSA9IHMtPm1haW5fcmdiYV9tYXBbQV07CisgICAgICAgIGNvbnN0IGludCBkc3RlcCA9IHMtPm1haW5fcGl4X3N0ZXBbMF07CisgICAgICAgIGNvbnN0IGludCBzciA9IHMtPm92ZXJsYXlfcmdiYV9tYXBbUl07CisgICAgICAgIGNvbnN0IGludCBzZyA9IHMtPm92ZXJsYXlfcmdiYV9tYXBbR107CisgICAgICAgIGNvbnN0IGludCBzYiA9IHMtPm92ZXJsYXlfcmdiYV9tYXBbQl07CisgICAgICAgIGNvbnN0IGludCBzYSA9IHMtPm92ZXJsYXlfcmdiYV9tYXBbQV07CisgICAgICAgIGNvbnN0IGludCBzc3RlcCA9IHMtPm92ZXJsYXlfcGl4X3N0ZXBbMF07CisgICAgICAgIGNvbnN0IGludCBtYWluX2hhc19hbHBoYSA9IHMtPm1haW5faGFzX2FscGhhOworICAgICAgICB1aW50OF90ICpzLCAqc3AsICpkLCAqZHA7CisKKyAgICAgICAgaSA9IEZGTUFYKC15LCAwKTsKKyAgICAgICAgc3AgPSBzcmMtPmRhdGFbMF0gKyBpICAgICAqIHNyYy0+bGluZXNpemVbMF07CisgICAgICAgIGRwID0gZHN0LT5kYXRhWzBdICsgKHkraSkgKiBkc3QtPmxpbmVzaXplWzBdOworCisgICAgICAgIGZvciAoaW1heCA9IEZGTUlOKC15ICsgZHN0X2gsIHNyY19oKTsgaSA8IGltYXg7IGkrKykgeworICAgICAgICAgICAgaiA9IEZGTUFYKC14LCAwKTsKKyAgICAgICAgICAgIHMgPSBzcCArIGogICAgICogc3N0ZXA7CisgICAgICAgICAgICBkID0gZHAgKyAoeCtqKSAqIGRzdGVwOworCisgICAgICAgICAgICBmb3IgKGptYXggPSBGRk1JTigteCArIGRzdF93LCBzcmNfdyk7IGogPCBqbWF4OyBqKyspIHsKKyAgICAgICAgICAgICAgICBhbHBoYSA9IHNbc2FdOworCisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG1haW4gY2hhbm5lbCBoYXMgYW4gYWxwaGEgY2hhbm5lbCwgYWxwaGEgaGFzIHRvIGJlIGNhbGN1bGF0ZWQKKyAgICAgICAgICAgICAgICAvLyB0byBjcmVhdGUgYW4gdW4tcHJlbXVsdGlwbGllZCAoc3RyYWlnaHQpIGFscGhhIHZhbHVlCisgICAgICAgICAgICAgICAgaWYgKG1haW5faGFzX2FscGhhICYmIGFscGhhICE9IDAgJiYgYWxwaGEgIT0gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWxwaGFfZCA9IGRbZGFdOworICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IFVOUFJFTVVMVElQTFlfQUxQSEEoYWxwaGEsIGFscGhhX2QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWxwaGEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjU1OgorICAgICAgICAgICAgICAgICAgICBkW2RyXSA9IHNbc3JdOworICAgICAgICAgICAgICAgICAgICBkW2RnXSA9IHNbc2ddOworICAgICAgICAgICAgICAgICAgICBkW2RiXSA9IHNbc2JdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBtYWluX3ZhbHVlID0gbWFpbl92YWx1ZSAqICgxIC0gYWxwaGEpICsgb3ZlcmxheV92YWx1ZSAqIGFscGhhCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGFscGhhIGlzIGluIHRoZSByYW5nZSAwLTI1NSwgdGhlIHJlc3VsdCBtdXN0IGRpdmlkZWQgYnkgMjU1CisgICAgICAgICAgICAgICAgICAgIGRbZHJdID0gRkFTVF9ESVYyNTUoZFtkcl0gKiAoMjU1IC0gYWxwaGEpICsgc1tzcl0gKiBhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIGRbZGddID0gRkFTVF9ESVYyNTUoZFtkZ10gKiAoMjU1IC0gYWxwaGEpICsgc1tzZ10gKiBhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIGRbZGJdID0gRkFTVF9ESVYyNTUoZFtkYl0gKiAoMjU1IC0gYWxwaGEpICsgc1tzYl0gKiBhbHBoYSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtYWluX2hhc19hbHBoYSkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFscGhhKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI1NToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbZGFdID0gc1tzYV07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IGFscGhhIGNvbXBvc2l0aW5nOiBtYWluX2FscGhhICs9ICgxLW1haW5fYWxwaGEpICogb3ZlcmxheV9hbHBoYQorICAgICAgICAgICAgICAgICAgICAgICAgZFtkYV0gKz0gRkFTVF9ESVYyNTUoKDI1NSAtIGRbZGFdKSAqIHNbc2FdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkICs9IGRzdGVwOworICAgICAgICAgICAgICAgIHMgKz0gc3N0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkcCArPSBkc3QtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgc3AgKz0gc3JjLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBtYWluX2hhc19hbHBoYSA9IHMtPm1haW5faGFzX2FscGhhOworICAgICAgICBpZiAobWFpbl9oYXNfYWxwaGEpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgYWxwaGE7ICAgICAgICAgIC8vLzwgdGhlIGFtb3VudCBvZiBvdmVybGF5IHRvIGJsZW5kIG9uIHRvIG1haW4KKyAgICAgICAgICAgIHVpbnQ4X3QgKnMsICpzYSwgKmQsICpkYTsKKworICAgICAgICAgICAgaSA9IEZGTUFYKC15LCAwKTsKKyAgICAgICAgICAgIHNhID0gc3JjLT5kYXRhWzNdICsgaSAgICAgKiBzcmMtPmxpbmVzaXplWzNdOworICAgICAgICAgICAgZGEgPSBkc3QtPmRhdGFbM10gKyAoeStpKSAqIGRzdC0+bGluZXNpemVbM107CisKKyAgICAgICAgICAgIGZvciAoaW1heCA9IEZGTUlOKC15ICsgZHN0X2gsIHNyY19oKTsgaSA8IGltYXg7IGkrKykgeworICAgICAgICAgICAgICAgIGogPSBGRk1BWCgteCwgMCk7CisgICAgICAgICAgICAgICAgcyA9IHNhICsgajsKKyAgICAgICAgICAgICAgICBkID0gZGEgKyB4K2o7CisKKyAgICAgICAgICAgICAgICBmb3IgKGptYXggPSBGRk1JTigteCArIGRzdF93LCBzcmNfdyk7IGogPCBqbWF4OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAqczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhICE9IDAgJiYgYWxwaGEgIT0gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFscGhhX2QgPSAqZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gVU5QUkVNVUxUSVBMWV9BTFBIQShhbHBoYSwgYWxwaGFfZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHBoYSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTU6CisgICAgICAgICAgICAgICAgICAgICAgICAqZCA9ICpzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBhbHBoYSBjb21wb3NpdGluZzogbWFpbl9hbHBoYSArPSAoMS1tYWluX2FscGhhKSAqIG92ZXJsYXlfYWxwaGEKKyAgICAgICAgICAgICAgICAgICAgICAgICpkICs9IEZBU1RfRElWMjU1KCgyNTUgLSAqZCkgKiAqcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZCArPSAxOworICAgICAgICAgICAgICAgICAgICBzICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRhICs9IGRzdC0+bGluZXNpemVbM107CisgICAgICAgICAgICAgICAgc2EgKz0gc3JjLT5saW5lc2l6ZVszXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaHN1YiA9IGkgPyBzLT5oc3ViIDogMDsKKyAgICAgICAgICAgIGludCB2c3ViID0gaSA/IHMtPnZzdWIgOiAwOworICAgICAgICAgICAgaW50IHNyY193cCA9IEZGX0NFSUxfUlNISUZUKHNyY193LCBoc3ViKTsKKyAgICAgICAgICAgIGludCBzcmNfaHAgPSBGRl9DRUlMX1JTSElGVChzcmNfaCwgdnN1Yik7CisgICAgICAgICAgICBpbnQgZHN0X3dwID0gRkZfQ0VJTF9SU0hJRlQoZHN0X3csIGhzdWIpOworICAgICAgICAgICAgaW50IGRzdF9ocCA9IEZGX0NFSUxfUlNISUZUKGRzdF9oLCB2c3ViKTsKKyAgICAgICAgICAgIGludCB5cCA9IHk+PnZzdWI7CisgICAgICAgICAgICBpbnQgeHAgPSB4Pj5oc3ViOworICAgICAgICAgICAgdWludDhfdCAqcywgKnNwLCAqZCwgKmRwLCAqYSwgKmFwOworCisgICAgICAgICAgICBqID0gRkZNQVgoLXlwLCAwKTsKKyAgICAgICAgICAgIHNwID0gc3JjLT5kYXRhW2ldICsgaiAgICAgICAgICogc3JjLT5saW5lc2l6ZVtpXTsKKyAgICAgICAgICAgIGRwID0gZHN0LT5kYXRhW2ldICsgKHlwK2opICAgICogZHN0LT5saW5lc2l6ZVtpXTsKKyAgICAgICAgICAgIGFwID0gc3JjLT5kYXRhWzNdICsgKGo8PHZzdWIpICogc3JjLT5saW5lc2l6ZVszXTsKKworICAgICAgICAgICAgZm9yIChqbWF4ID0gRkZNSU4oLXlwICsgZHN0X2hwLCBzcmNfaHApOyBqIDwgam1heDsgaisrKSB7CisgICAgICAgICAgICAgICAgayA9IEZGTUFYKC14cCwgMCk7CisgICAgICAgICAgICAgICAgZCA9IGRwICsgeHArazsKKyAgICAgICAgICAgICAgICBzID0gc3AgKyBrOworICAgICAgICAgICAgICAgIGEgPSBhcCArIChrPDxoc3ViKTsKKworICAgICAgICAgICAgICAgIGZvciAoa21heCA9IEZGTUlOKC14cCArIGRzdF93cCwgc3JjX3dwKTsgayA8IGttYXg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfdiwgYWxwaGFfaCwgYWxwaGE7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYXZlcmFnZSBhbHBoYSBmb3IgY29sb3IgY29tcG9uZW50cywgaW1wcm92ZSBxdWFsaXR5CisgICAgICAgICAgICAgICAgICAgIGlmIChoc3ViICYmIHZzdWIgJiYgaisxIDwgc3JjX2hwICYmIGsrMSA8IHNyY193cCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAoYVswXSArIGFbc3JjLT5saW5lc2l6ZVszXV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVsxXSArIGFbc3JjLT5saW5lc2l6ZVszXSsxXSkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoc3ViIHx8IHZzdWIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ggPSBoc3ViICYmIGsrMSA8IHNyY193cCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFbMF0gKyBhWzFdKSA+PiAxIDogYVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX3YgPSB2c3ViICYmIGorMSA8IHNyY19ocCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFbMF0gKyBhW3NyYy0+bGluZXNpemVbM11dKSA+PiAxIDogYVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gKGFscGhhX3YgKyBhbHBoYV9oKSA+PiAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gYVswXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG1haW4gY2hhbm5lbCBoYXMgYW4gYWxwaGEgY2hhbm5lbCwgYWxwaGEgaGFzIHRvIGJlIGNhbGN1bGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gY3JlYXRlIGFuIHVuLXByZW11bHRpcGxpZWQgKHN0cmFpZ2h0KSBhbHBoYSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBpZiAobWFpbl9oYXNfYWxwaGEgJiYgYWxwaGEgIT0gMCAmJiBhbHBoYSAhPSAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2ZXJhZ2UgYWxwaGEgZm9yIGNvbG9yIGNvbXBvbmVudHMsIGltcHJvdmUgcXVhbGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhbHBoYV9kOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhzdWIgJiYgdnN1YiAmJiBqKzEgPCBzcmNfaHAgJiYgaysxIDwgc3JjX3dwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZCA9IChkWzBdICsgZFtzcmMtPmxpbmVzaXplWzNdXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWzFdICsgZFtzcmMtPmxpbmVzaXplWzNdKzFdKSA+PiAyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoc3ViIHx8IHZzdWIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9oID0gaHN1YiAmJiBrKzEgPCBzcmNfd3AgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZFswXSArIGRbMV0pID4+IDEgOiBkWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX3YgPSB2c3ViICYmIGorMSA8IHNyY19ocCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkWzBdICsgZFtzcmMtPmxpbmVzaXplWzNdXSkgPj4gMSA6IGRbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZCA9IChhbHBoYV92ICsgYWxwaGFfaCkgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2QgPSBkWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBVTlBSRU1VTFRJUExZX0FMUEhBKGFscGhhLCBhbHBoYV9kKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqZCA9IEZBU1RfRElWMjU1KCpkICogKDI1NSAtIGFscGhhKSArICpzICogYWxwaGEpOworICAgICAgICAgICAgICAgICAgICBzKys7CisgICAgICAgICAgICAgICAgICAgIGQrKzsKKyAgICAgICAgICAgICAgICAgICAgYSArPSAxIDw8IGhzdWI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRwICs9IGRzdC0+bGluZXNpemVbaV07CisgICAgICAgICAgICAgICAgc3AgKz0gc3JjLT5saW5lc2l6ZVtpXTsKKyAgICAgICAgICAgICAgICBhcCArPSAoMSA8PCB2c3ViKSAqIHNyYy0+bGluZXNpemVbM107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBBVkZyYW1lICpkb19ibGVuZChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqbWFpbnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzZWNvbmQpCit7CisgICAgT3ZlcmxheUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKworICAgIGlmIChzLT5ldmFsX21vZGUgPT0gRVZBTF9NT0RFX0ZSQU1FKSB7CisgICAgICAgIGludDY0X3QgcG9zID0gYXZfZnJhbWVfZ2V0X3BrdF9wb3MobWFpbnBpYyk7CisKKyAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfTl0gPSBpbmxpbmstPmZyYW1lX2NvdW50OworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9UXSA9IG1haW5waWMtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSA/CisgICAgICAgICAgICBOQU4gOiBtYWlucGljLT5wdHMgKiBhdl9xMmQoaW5saW5rLT50aW1lX2Jhc2UpOworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9QT1NdID0gcG9zID09IC0xID8gTkFOIDogcG9zOworCisgICAgICAgIGV2YWxfZXhwcihjdHgpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJuOiVmIHQ6JWYgcG9zOiVmIHg6JWYgeGk6JWQgeTolZiB5aTolZFxuIiwKKyAgICAgICAgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX05dLCBzLT52YXJfdmFsdWVzW1ZBUl9UXSwgcy0+dmFyX3ZhbHVlc1tWQVJfUE9TXSwKKyAgICAgICAgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1hdLCBzLT54LAorICAgICAgICAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfWV0sIHMtPnkpOworICAgIH0KKworICAgIGJsZW5kX2ltYWdlKGN0eCwgbWFpbnBpYywgc2Vjb25kLCBzLT54LCBzLT55KTsKKyAgICByZXR1cm4gbWFpbnBpYzsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucGljcmVmKQoreworICAgIE92ZXJsYXlDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgYXZfbG9nKGlubGluay0+ZHN0LCBBVl9MT0dfREVCVUcsICJJbmNvbWluZyBmcmFtZSAodGltZTolcykgZnJvbSBsaW5rICMlZFxuIiwgYXZfdHMydGltZXN0cihpbnBpY3JlZi0+cHRzLCAmaW5saW5rLT50aW1lX2Jhc2UpLCBGRl9JTkxJTktfSURYKGlubGluaykpOworICAgIHJldHVybiBmZl9kdWFsaW5wdXRfZmlsdGVyX2ZyYW1lKCZzLT5kaW5wdXQsIGlubGluaywgaW5waWNyZWYpOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIE92ZXJsYXlDb250ZXh0ICpzID0gb3V0bGluay0+c3JjLT5wcml2OworICAgIHJldHVybiBmZl9kdWFsaW5wdXRfcmVxdWVzdF9mcmFtZSgmcy0+ZGlucHV0LCBvdXRsaW5rKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgT3ZlcmxheUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocy0+YWxsb3dfcGFja2VkX3JnYikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJUaGUgcmdiIG9wdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBpcyBvdmVycmlkaW5nIHRoZSBmb3JtYXQgb3B0aW9uLCB1c2UgZm9ybWF0IGluc3RlYWRcbiIpOworICAgICAgICBzLT5mb3JtYXQgPSBPVkVSTEFZX0ZPUk1BVF9SR0I7CisgICAgfQorICAgIGlmICghcy0+ZGlucHV0LnJlcGVhdGxhc3QgfHwgcy0+ZW9mX2FjdGlvbiA9PSBFT0ZfQUNUSU9OX1BBU1MpIHsKKyAgICAgICAgcy0+ZGlucHV0LnJlcGVhdGxhc3QgPSAwOworICAgICAgICBzLT5lb2ZfYWN0aW9uID0gRU9GX0FDVElPTl9QQVNTOworICAgIH0KKyAgICBpZiAocy0+ZGlucHV0LnNob3J0ZXN0IHx8IHMtPmVvZl9hY3Rpb24gPT0gRU9GX0FDVElPTl9FTkRBTEwpIHsKKyAgICAgICAgcy0+ZGlucHV0LnNob3J0ZXN0ID0gMTsKKyAgICAgICAgcy0+ZW9mX2FjdGlvbiA9IEVPRl9BQ1RJT05fRU5EQUxMOworICAgIH0KKworICAgIHMtPmRpbnB1dC5wcm9jZXNzID0gZG9fYmxlbmQ7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE92ZXJsYXlDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG92ZXJsYXlfb3B0aW9uc1tdID0geworICAgIHsgIngiLCAic2V0IHRoZSB4IGV4cHJlc3Npb24iLCBPRkZTRVQoeF9leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICIwIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJ5IiwgInNldCB0aGUgeSBleHByZXNzaW9uIiwgT0ZGU0VUKHlfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiMCJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiZW9mX2FjdGlvbiIsICJBY3Rpb24gdG8gdGFrZSB3aGVuIGVuY291bnRlcmluZyBFT0YgZnJvbSBzZWNvbmRhcnkgaW5wdXQgIiwKKyAgICAgICAgT0ZGU0VUKGVvZl9hY3Rpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IEVPRl9BQ1RJT05fUkVQRUFUIH0sCisgICAgICAgIEVPRl9BQ1RJT05fUkVQRUFULCBFT0ZfQUNUSU9OX1BBU1MsIC5mbGFncyA9IEZMQUdTLCAiZW9mX2FjdGlvbiIgfSwKKyAgICAgICAgeyAicmVwZWF0IiwgIlJlcGVhdCB0aGUgcHJldmlvdXMgZnJhbWUuIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRU9GX0FDVElPTl9SRVBFQVQgfSwgLmZsYWdzID0gRkxBR1MsICJlb2ZfYWN0aW9uIiB9LAorICAgICAgICB7ICJlbmRhbGwiLCAiRW5kIGJvdGggc3RyZWFtcy4iLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBFT0ZfQUNUSU9OX0VOREFMTCB9LCAuZmxhZ3MgPSBGTEFHUywgImVvZl9hY3Rpb24iIH0sCisgICAgICAgIHsgInBhc3MiLCAgICJQYXNzIHRocm91Z2ggdGhlIG1haW4gaW5wdXQuIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEVPRl9BQ1RJT05fUEFTUyB9LCAgIC5mbGFncyA9IEZMQUdTLCAiZW9mX2FjdGlvbiIgfSwKKyAgICB7ICJldmFsIiwgInNwZWNpZnkgd2hlbiB0byBldmFsdWF0ZSBleHByZXNzaW9ucyIsIE9GRlNFVChldmFsX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gRVZBTF9NT0RFX0ZSQU1FfSwgMCwgRVZBTF9NT0RFX05CLTEsIEZMQUdTLCAiZXZhbCIgfSwKKyAgICAgICAgIHsgImluaXQiLCAgImV2YWwgZXhwcmVzc2lvbnMgb25jZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9RVZBTF9NT0RFX0lOSVR9LCAgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImV2YWwiIH0sCisgICAgICAgICB7ICJmcmFtZSIsICJldmFsIGV4cHJlc3Npb25zIHBlci1mcmFtZSIsICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUVWQUxfTU9ERV9GUkFNRX0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJldmFsIiB9LAorICAgIHsgInJnYiIsICJmb3JjZSBwYWNrZWQgUkdCIGluIGlucHV0IGFuZCBvdXRwdXQgKGRlcHJlY2F0ZWQpIiwgT0ZGU0VUKGFsbG93X3BhY2tlZF9yZ2IpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInNob3J0ZXN0IiwgImZvcmNlIHRlcm1pbmF0aW9uIHdoZW4gdGhlIHNob3J0ZXN0IGlucHV0IHRlcm1pbmF0ZXMiLCBPRkZTRVQoZGlucHV0LnNob3J0ZXN0KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiZm9ybWF0IiwgInNldCBvdXRwdXQgZm9ybWF0IiwgT0ZGU0VUKGZvcm1hdCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9T1ZFUkxBWV9GT1JNQVRfWVVWNDIwfSwgMCwgT1ZFUkxBWV9GT1JNQVRfTkItMSwgRkxBR1MsICJmb3JtYXQiIH0sCisgICAgICAgIHsgInl1djQyMCIsICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9T1ZFUkxBWV9GT1JNQVRfWVVWNDIwfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZvcm1hdCIgfSwKKyAgICAgICAgeyAieXV2NDIyIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1PVkVSTEFZX0ZPUk1BVF9ZVVY0MjJ9LCAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZm9ybWF0IiB9LAorICAgICAgICB7ICJ5dXY0NDQiLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9WRVJMQVlfRk9STUFUX1lVVjQ0NH0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJmb3JtYXQiIH0sCisgICAgICAgIHsgInJnYiIsICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9T1ZFUkxBWV9GT1JNQVRfUkdCfSwgICAgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZvcm1hdCIgfSwKKyAgICB7ICJyZXBlYXRsYXN0IiwgInJlcGVhdCBvdmVybGF5IG9mIHRoZSBsYXN0IG92ZXJsYXkgZnJhbWUiLCBPRkZTRVQoZGlucHV0LnJlcGVhdGxhc3QpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTF9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Mob3ZlcmxheSk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9vdmVybGF5X2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJtYWluIiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dF9tYWluLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAubmVlZHNfd3JpdGFibGUgPSAxLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gIm92ZXJsYXkiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0X292ZXJsYXksCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX292ZXJsYXlfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9vdmVybGF5ID0geworICAgIC5uYW1lICAgICAgICAgID0gIm92ZXJsYXkiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk92ZXJsYXkgYSB2aWRlbyBzb3VyY2Ugb24gdG9wIG9mIHRoZSBpbnB1dC4iKSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoT3ZlcmxheUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJm92ZXJsYXlfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcm9jZXNzX2NvbW1hbmQgPSBwcm9jZXNzX2NvbW1hbmQsCisgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl92Zl9vdmVybGF5X2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX3ZmX292ZXJsYXlfb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9JTlRFUk5BTCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfb3dkZW5vaXNlLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfb3dkZW5vaXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0N2Y3NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9vd2Rlbm9pc2UuYwpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDEzIENsw6ltZW50IELFk3NjaCA8dSBwa2ggbWU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAdG9kbyB0cnkgdG8gY2hhbmdlIHRvIGludAorICogQHRvZG8gdHJ5IGxpZnRpbmcgYmFzZWQgaW1wbGVtZW50YXRpb24KKyAqIEB0b2RvIG9wdGltaXplIG9wdGltaXplIG9wdGltaXplCisgKiBAdG9kbyBoYXJkIHRocmVzaG9sZGluZworICogQHRvZG8gdXNlIFFQIHRvIGRlY2lkZSBmaWx0ZXIgc3RyZW5ndGgKKyAqIEB0b2RvIHdhdmVsZXQgbm9ybWFsaXphdGlvbiAvIGxlYXN0IHNxdWFyZXMgb3B0aW1hbCBzaWduYWwgdnMuIG5vaXNlIHRocmVzaG9sZHMKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgZG91YmxlIGx1bWFfc3RyZW5ndGg7CisgICAgZG91YmxlIGNocm9tYV9zdHJlbmd0aDsKKyAgICBpbnQgZGVwdGg7CisgICAgZmxvYXQgKnBsYW5lWzE2KzFdWzRdOworICAgIGludCBsaW5lc2l6ZTsKKyAgICBpbnQgaHN1YiwgdnN1YjsKK30gT1dEZW5vaXNlQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoT1dEZW5vaXNlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3dkZW5vaXNlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJkZXB0aCIsICAgICAgICAgICAic2V0IGRlcHRoIiwgICAgICAgICAgIE9GRlNFVChkZXB0aCksICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gICA4fSwgOCwgICAxNiwgRkxBR1MgfSwKKyAgICB7ICJsdW1hX3N0cmVuZ3RoIiwgICAic2V0IGx1bWEgc3RyZW5ndGgiLCAgIE9GRlNFVChsdW1hX3N0cmVuZ3RoKSwgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gMS4wfSwgMCwgMTAwMCwgRkxBR1MgfSwKKyAgICB7ICJscyIsICAgICAgICAgICAgICAic2V0IGx1bWEgc3RyZW5ndGgiLCAgIE9GRlNFVChsdW1hX3N0cmVuZ3RoKSwgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gMS4wfSwgMCwgMTAwMCwgRkxBR1MgfSwKKyAgICB7ICJjaHJvbWFfc3RyZW5ndGgiLCAic2V0IGNocm9tYSBzdHJlbmd0aCIsIE9GRlNFVChjaHJvbWFfc3RyZW5ndGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gMS4wfSwgMCwgMTAwMCwgRkxBR1MgfSwKKyAgICB7ICJjcyIsICAgICAgICAgICAgICAic2V0IGNocm9tYSBzdHJlbmd0aCIsIE9GRlNFVChjaHJvbWFfc3RyZW5ndGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gMS4wfSwgMCwgMTAwMCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKG93ZGVub2lzZSk7CisKK0RFQ0xBUkVfQUxJR05FRCg4LCBzdGF0aWMgY29uc3QgdWludDhfdCwgZGl0aGVyKVs4XVs4XSA9IHsKKyAgICB7ICAwLCAgNDgsICAxMiwgIDYwLCAgIDMsICA1MSwgIDE1LCAgNjMgfSwKKyAgICB7IDMyLCAgMTYsICA0NCwgIDI4LCAgMzUsICAxOSwgIDQ3LCAgMzEgfSwKKyAgICB7ICA4LCAgNTYsICAgNCwgIDUyLCAgMTEsICA1OSwgICA3LCAgNTUgfSwKKyAgICB7IDQwLCAgMjQsICAzNiwgIDIwLCAgNDMsICAyNywgIDM5LCAgMjMgfSwKKyAgICB7ICAyLCAgNTAsICAxNCwgIDYyLCAgIDEsICA0OSwgIDEzLCAgNjEgfSwKKyAgICB7IDM0LCAgMTgsICA0NiwgIDMwLCAgMzMsICAxNywgIDQ1LCAgMjkgfSwKKyAgICB7IDEwLCAgNTgsICAgNiwgIDU0LCAgIDksICA1NywgICA1LCAgNTMgfSwKKyAgICB7IDQyLCAgMjYsICAzOCwgIDIyLCAgNDEsICAyNSwgIDM3LCAgMjEgfSwKK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgY29lZmZbMl1bNV0gPSB7CisgICAgeworICAgICAgICAgMC42MDI5NDkwMTgyMzYzNTc5ICAqIE1fU1FSVDIsCisgICAgICAgICAwLjI2Njg2NDExODQ0Mjg3MjMgICogTV9TUVJUMiwKKyAgICAgICAgLTAuMDc4MjIzMjY2NTI4OTg3ODUgKiBNX1NRUlQyLAorICAgICAgICAtMC4wMTY4NjQxMTg0NDI4NzQ5NSAqIE1fU1FSVDIsCisgICAgICAgICAwLjAyNjc0ODc1NzQxMDgwOTc2ICogTV9TUVJUMiwKKyAgICB9LHsKKyAgICAgICAgIDEuMTE1MDg3MDUyNDU2OTk0ICAgLyBNX1NRUlQyLAorICAgICAgICAtMC41OTEyNzE3NjMxMTQyNDcwICAvIE1fU1FSVDIsCisgICAgICAgIC0wLjA1NzU0MzUyNjIyODQ5OTU3IC8gTV9TUVJUMiwKKyAgICAgICAgIDAuMDkxMjcxNzYzMTE0MjQ5NDggLyBNX1NRUlQyLAorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgaWNvZWZmWzJdWzVdID0geworICAgIHsKKyAgICAgICAgIDEuMTE1MDg3MDUyNDU2OTk0ICAgLyBNX1NRUlQyLAorICAgICAgICAgMC41OTEyNzE3NjMxMTQyNDcwICAvIE1fU1FSVDIsCisgICAgICAgIC0wLjA1NzU0MzUyNjIyODQ5OTU3IC8gTV9TUVJUMiwKKyAgICAgICAgLTAuMDkxMjcxNzYzMTE0MjQ5NDggLyBNX1NRUlQyLAorICAgIH0seworICAgICAgICAgMC42MDI5NDkwMTgyMzYzNTc5ICAqIE1fU1FSVDIsCisgICAgICAgIC0wLjI2Njg2NDExODQ0Mjg3MjMgICogTV9TUVJUMiwKKyAgICAgICAgLTAuMDc4MjIzMjY2NTI4OTg3ODUgKiBNX1NRUlQyLAorICAgICAgICAgMC4wMTY4NjQxMTg0NDI4NzQ5NSAqIE1fU1FSVDIsCisgICAgICAgICAwLjAyNjc0ODc1NzQxMDgwOTc2ICogTV9TUVJUMiwKKyAgICB9Cit9OworCitzdGF0aWMgaW5saW5lIGludCBtaXJyb3IoaW50IHgsIGludCB3KQoreworICAgIHdoaWxlICgodW5zaWduZWQpeCA+ICh1bnNpZ25lZCl3KSB7CisgICAgICAgIHggPSAteDsKKyAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgeCArPSAyICogdzsKKyAgICB9CisgICAgcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNvbXBvc2UoZmxvYXQgKmRzdF9sLCBmbG9hdCAqZHN0X2gsIGNvbnN0IGZsb2F0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50IHcpCit7CisgICAgaW50IHgsIGk7CisgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICBkb3VibGUgc3VtX2wgPSBzcmNbeCAqIGxpbmVzaXplXSAqIGNvZWZmWzBdWzBdOworICAgICAgICBkb3VibGUgc3VtX2ggPSBzcmNbeCAqIGxpbmVzaXplXSAqIGNvZWZmWzFdWzBdOworICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IDQ7IGkrKykgeworICAgICAgICAgICAgY29uc3QgZG91YmxlIHMgPSBzcmNbbWlycm9yKHggLSBpLCB3IC0gMSkgKiBsaW5lc2l6ZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3JjW21pcnJvcih4ICsgaSwgdyAtIDEpICogbGluZXNpemVdOworCisgICAgICAgICAgICBzdW1fbCArPSBjb2VmZlswXVtpXSAqIHM7CisgICAgICAgICAgICBzdW1faCArPSBjb2VmZlsxXVtpXSAqIHM7CisgICAgICAgIH0KKyAgICAgICAgZHN0X2xbeCAqIGxpbmVzaXplXSA9IHN1bV9sOworICAgICAgICBkc3RfaFt4ICogbGluZXNpemVdID0gc3VtX2g7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29tcG9zZShmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjX2wsIGNvbnN0IGZsb2F0ICpzcmNfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50IHcpCit7CisgICAgaW50IHgsIGk7CisgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICBkb3VibGUgc3VtX2wgPSBzcmNfbFt4ICogbGluZXNpemVdICogaWNvZWZmWzBdWzBdOworICAgICAgICBkb3VibGUgc3VtX2ggPSBzcmNfaFt4ICogbGluZXNpemVdICogaWNvZWZmWzFdWzBdOworICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IDQ7IGkrKykgeworICAgICAgICAgICAgY29uc3QgaW50IHgwID0gbWlycm9yKHggLSBpLCB3IC0gMSkgKiBsaW5lc2l6ZTsKKyAgICAgICAgICAgIGNvbnN0IGludCB4MSA9IG1pcnJvcih4ICsgaSwgdyAtIDEpICogbGluZXNpemU7CisKKyAgICAgICAgICAgIHN1bV9sICs9IGljb2VmZlswXVtpXSAqIChzcmNfbFt4MF0gKyBzcmNfbFt4MV0pOworICAgICAgICAgICAgc3VtX2ggKz0gaWNvZWZmWzFdW2ldICogKHNyY19oW3gwXSArIHNyY19oW3gxXSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0W3ggKiBsaW5lc2l6ZV0gPSAoc3VtX2wgKyBzdW1faCkgKiAwLjU7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb21wb3NlMkQoZmxvYXQgKmRzdF9sLCBmbG9hdCAqZHN0X2gsIGNvbnN0IGZsb2F0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhsaW5lc2l6ZSwgaW50IHlsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHcsIGludCBoKQoreworICAgIGludCB5LCB4OworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzdGVwOyB4KyspCisgICAgICAgICAgICBkZWNvbXBvc2UoZHN0X2wgKyB5bGluZXNpemUqeSArIHhsaW5lc2l6ZSp4LAorICAgICAgICAgICAgICAgICAgICAgIGRzdF9oICsgeWxpbmVzaXplKnkgKyB4bGluZXNpemUqeCwKKyAgICAgICAgICAgICAgICAgICAgICBzcmMgICArIHlsaW5lc2l6ZSp5ICsgeGxpbmVzaXplKngsCisgICAgICAgICAgICAgICAgICAgICAgc3RlcCAqIHhsaW5lc2l6ZSwgKHcgLSB4ICsgc3RlcCAtIDEpIC8gc3RlcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21wb3NlMkQoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyY19sLCBjb25zdCBmbG9hdCAqc3JjX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4bGluZXNpemUsIGludCB5bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgdywgaW50IGgpCit7CisgICAgaW50IHksIHg7CisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHN0ZXA7IHgrKykKKyAgICAgICAgICAgIGNvbXBvc2UoZHN0ICAgKyB5bGluZXNpemUqeSArIHhsaW5lc2l6ZSp4LAorICAgICAgICAgICAgICAgICAgICBzcmNfbCArIHlsaW5lc2l6ZSp5ICsgeGxpbmVzaXplKngsCisgICAgICAgICAgICAgICAgICAgIHNyY19oICsgeWxpbmVzaXplKnkgKyB4bGluZXNpemUqeCwKKyAgICAgICAgICAgICAgICAgICAgc3RlcCAqIHhsaW5lc2l6ZSwgKHcgLSB4ICsgc3RlcCAtIDEpIC8gc3RlcCk7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29tcG9zZTJEMihmbG9hdCAqZHN0WzRdLCBmbG9hdCAqc3JjLCBmbG9hdCAqdGVtcFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZXNpemUsIGludCBzdGVwLCBpbnQgdywgaW50IGgpCit7CisgICAgZGVjb21wb3NlMkQodGVtcFswXSwgdGVtcFsxXSwgc3JjLCAgICAgMSwgbGluZXNpemUsIHN0ZXAsIHcsIGgpOworICAgIGRlY29tcG9zZTJEKCBkc3RbMF0sICBkc3RbMV0sIHRlbXBbMF0sIGxpbmVzaXplLCAxLCBzdGVwLCBoLCB3KTsKKyAgICBkZWNvbXBvc2UyRCggZHN0WzJdLCAgZHN0WzNdLCB0ZW1wWzFdLCBsaW5lc2l6ZSwgMSwgc3RlcCwgaCwgdyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXBvc2UyRDIoZmxvYXQgKmRzdCwgZmxvYXQgKnNyY1s0XSwgZmxvYXQgKnRlbXBbMl0sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50IHN0ZXAsIGludCB3LCBpbnQgaCkKK3sKKyAgICBjb21wb3NlMkQodGVtcFswXSwgIHNyY1swXSwgIHNyY1sxXSwgbGluZXNpemUsIDEsIHN0ZXAsIGgsIHcpOworICAgIGNvbXBvc2UyRCh0ZW1wWzFdLCAgc3JjWzJdLCAgc3JjWzNdLCBsaW5lc2l6ZSwgMSwgc3RlcCwgaCwgdyk7CisgICAgY29tcG9zZTJEKGRzdCwgICAgIHRlbXBbMF0sIHRlbXBbMV0sIDEsIGxpbmVzaXplLCBzdGVwLCB3LCBoKTsKK30KKworc3RhdGljIHZvaWQgZmlsdGVyKE9XRGVub2lzZUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGRvdWJsZSBzdHJlbmd0aCkKK3sKKyAgICBpbnQgeCwgeSwgaSwgaiwgZGVwdGggPSBzLT5kZXB0aDsKKworICAgIHdoaWxlICgxPDxkZXB0aCA+IHdpZHRoIHx8IDE8PGRlcHRoID4gaGVpZ2h0KQorICAgICAgICBkZXB0aC0tOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorICAgICAgICBmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgcy0+cGxhbmVbMF1bMF1beSpzLT5saW5lc2l6ZSArIHhdID0gc3JjW3kqc3JjX2xpbmVzaXplICsgeF07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKKyAgICAgICAgZGVjb21wb3NlMkQyKHMtPnBsYW5lW2kgKyAxXSwgcy0+cGxhbmVbaV1bMF0sIHMtPnBsYW5lWzBdICsgMSwgcy0+bGluZXNpemUsIDE8PGksIHdpZHRoLCBoZWlnaHQpOworCisgICAgZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMTsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHYgPSBzLT5wbGFuZVtpICsgMV1bal1beSpzLT5saW5lc2l6ZSArIHhdOworICAgICAgICAgICAgICAgICAgICBpZiAgICAgICh2ID4gIHN0cmVuZ3RoKSB2IC09IHN0cmVuZ3RoOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2IDwgLXN0cmVuZ3RoKSB2ICs9IHN0cmVuZ3RoOworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICB2ICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHMtPnBsYW5lW2kgKyAxXVtqXVt4ICsgeSpzLT5saW5lc2l6ZV0gPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSBkZXB0aC0xOyBpID49IDA7IGktLSkKKyAgICAgICAgY29tcG9zZTJEMihzLT5wbGFuZVtpXVswXSwgcy0+cGxhbmVbaSArIDFdLCBzLT5wbGFuZVswXSArIDEsIHMtPmxpbmVzaXplLCAxPDxpLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaSA9IHMtPnBsYW5lWzBdWzBdW3kqcy0+bGluZXNpemUgKyB4XSArIGRpdGhlclt4JjddW3kmN10qKDEuMC82NCkgKyAxLjAvMTI4OyAvLyB5ZXMgdGhlIHJvdW5kaW5nIGlzIGluc2FuZSBidXQgb3B0aW1hbCA6KQorICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClpID4gMjU1VSkgaSA9IH4oaSA+PiAzMSk7CisgICAgICAgICAgICBkc3RbeSpkc3RfbGluZXNpemUgKyB4XSA9IGk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBpbnQgZGlyZWN0ID0gMDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIE9XRGVub2lzZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBjb25zdCBpbnQgY3cgPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPncsIHMtPmhzdWIpOworICAgIGNvbnN0IGludCBjaCA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwgcy0+dnN1Yik7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIGRpcmVjdCA9IDE7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgZmlsdGVyKHMsIG91dC0+ZGF0YVswXSwgb3V0LT5saW5lc2l6ZVswXSwgaW4tPmRhdGFbMF0sIGluLT5saW5lc2l6ZVswXSwgaW5saW5rLT53LCBpbmxpbmstPmgsIHMtPmx1bWFfc3RyZW5ndGgpOworICAgIGZpbHRlcihzLCBvdXQtPmRhdGFbMV0sIG91dC0+bGluZXNpemVbMV0sIGluLT5kYXRhWzFdLCBpbi0+bGluZXNpemVbMV0sIGN3LCAgICAgICAgY2gsICAgICAgICBzLT5jaHJvbWFfc3RyZW5ndGgpOworICAgIGZpbHRlcihzLCBvdXQtPmRhdGFbMl0sIG91dC0+bGluZXNpemVbMl0sIGluLT5kYXRhWzJdLCBpbi0+bGluZXNpemVbMl0sIGN3LCAgICAgICAgY2gsICAgICAgICBzLT5jaHJvbWFfc3RyZW5ndGgpOworCisgICAgaWYgKCFkaXJlY3QpIHsKKyAgICAgICAgaWYgKGluLT5kYXRhWzNdKQorICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQtPmRhdGFbM10sIG91dC0+bGluZXNpemVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIC0+ZGF0YVszXSwgaW4gLT5saW5lc2l6ZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT53LCBpbmxpbmstPmgpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgfQorCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsICAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMFAsICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCAgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIGludCBpLCBqOworICAgIE9XRGVub2lzZUNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBjb25zdCBpbnQgaCA9IEZGQUxJR04oaW5saW5rLT5oLCAxNik7CisKKyAgICBzLT5oc3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBzLT52c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIHMtPmxpbmVzaXplID0gRkZBTElHTihpbmxpbmstPncsIDE2KTsKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gcy0+ZGVwdGg7IGkrKykgeworICAgICAgICAgICAgcy0+cGxhbmVbaV1bal0gPSBhdl9tYWxsb2NfYXJyYXkocy0+bGluZXNpemUsIGggKiBzaXplb2Yocy0+cGxhbmVbMF1bMF1bMF0pKTsKKyAgICAgICAgICAgIGlmICghcy0+cGxhbmVbaV1bal0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGksIGo7CisgICAgT1dEZW5vaXNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gcy0+ZGVwdGg7IGkrKykKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5wbGFuZVtpXVtqXSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvd2Rlbm9pc2VfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvd2Rlbm9pc2Vfb3V0cHV0c1tdID0geworICAgICB7CisgICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICB9LAorICAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfb3dkZW5vaXNlID0geworICAgIC5uYW1lICAgICAgICAgID0gIm93ZGVub2lzZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGVub2lzZSB1c2luZyB3YXZlbGV0cy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihPV0Rlbm9pc2VDb250ZXh0KSwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBvd2Rlbm9pc2VfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gb3dkZW5vaXNlX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmb3dkZW5vaXNlX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3BhZC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3BhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOWI5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfcGFkLmMKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggdm1yc3NzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiB2aWRlbyBwYWRkaW5nIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29sb3JzcGFjZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsKKyAgICAiaW5fdyIsICAgIml3IiwKKyAgICAiaW5faCIsICAgImloIiwKKyAgICAib3V0X3ciLCAgIm93IiwKKyAgICAib3V0X2giLCAgIm9oIiwKKyAgICAieCIsCisgICAgInkiLAorICAgICJhIiwKKyAgICAic2FyIiwKKyAgICAiZGFyIiwKKyAgICAiaHN1YiIsCisgICAgInZzdWIiLAorICAgIE5VTEwKK307CisKK2VudW0gdmFyX25hbWUgeworICAgIFZBUl9JTl9XLCAgIFZBUl9JVywKKyAgICBWQVJfSU5fSCwgICBWQVJfSUgsCisgICAgVkFSX09VVF9XLCAgVkFSX09XLAorICAgIFZBUl9PVVRfSCwgIFZBUl9PSCwKKyAgICBWQVJfWCwKKyAgICBWQVJfWSwKKyAgICBWQVJfQSwKKyAgICBWQVJfU0FSLAorICAgIFZBUl9EQVIsCisgICAgVkFSX0hTVUIsCisgICAgVkFSX1ZTVUIsCisgICAgVkFSU19OQgorfTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX2RyYXdfc3VwcG9ydGVkX3BpeGVsX2Zvcm1hdHMoMCkpOworICAgIHJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCBQYWRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgdywgaDsgICAgICAgICAgICAgICAvLy88IG91dHB1dCBkaW1lbnNpb25zLCBhIHZhbHVlIG9mIDAgd2lsbCByZXN1bHQgaW4gdGhlIGlucHV0IHNpemUKKyAgICBpbnQgeCwgeTsgICAgICAgICAgICAgICAvLy88IG9mZnNldHMgb2YgdGhlIGlucHV0IGFyZWEgd2l0aCByZXNwZWN0IHRvIHRoZSBwYWRkZWQgYXJlYQorICAgIGludCBpbl93LCBpbl9oOyAgICAgICAgIC8vLzwgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhlIHBhZGRlZCBpbnB1dCB2aWRlbywgd2hpY2ggaGFzIHRvIGJlIGFsaWduZWQgdG8gdGhlIGNocm9tYSB2YWx1ZXMgaW4gb3JkZXIgdG8gYXZvaWQgY2hyb21hIGlzc3VlcworCisgICAgY2hhciAqd19leHByOyAgICAgICAgICAgLy8vPCB3aWR0aCAgZXhwcmVzc2lvbiBzdHJpbmcKKyAgICBjaGFyICpoX2V4cHI7ICAgICAgICAgICAvLy88IGhlaWdodCBleHByZXNzaW9uIHN0cmluZworICAgIGNoYXIgKnhfZXhwcjsgICAgICAgICAgIC8vLzwgd2lkdGggIGV4cHJlc3Npb24gc3RyaW5nCisgICAgY2hhciAqeV9leHByOyAgICAgICAgICAgLy8vPCBoZWlnaHQgZXhwcmVzc2lvbiBzdHJpbmcKKyAgICB1aW50OF90IHJnYmFfY29sb3JbNF07ICAvLy88IGNvbG9yIGZvciB0aGUgcGFkZGluZyBhcmVhCisgICAgRkZEcmF3Q29udGV4dCBkcmF3OworICAgIEZGRHJhd0NvbG9yIGNvbG9yOworfSBQYWRDb250ZXh0OworCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFBhZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJTX05CXSwgcmVzOworICAgIGNoYXIgKmV4cHI7CisKKyAgICBmZl9kcmF3X2luaXQoJnMtPmRyYXcsIGlubGluay0+Zm9ybWF0LCAwKTsKKyAgICBmZl9kcmF3X2NvbG9yKCZzLT5kcmF3LCAmcy0+Y29sb3IsIHMtPnJnYmFfY29sb3IpOworCisgICAgdmFyX3ZhbHVlc1tWQVJfSU5fV10gID0gdmFyX3ZhbHVlc1tWQVJfSVddID0gaW5saW5rLT53OworICAgIHZhcl92YWx1ZXNbVkFSX0lOX0hdICA9IHZhcl92YWx1ZXNbVkFSX0lIXSA9IGlubGluay0+aDsKKyAgICB2YXJfdmFsdWVzW1ZBUl9PVVRfV10gPSB2YXJfdmFsdWVzW1ZBUl9PV10gPSBOQU47CisgICAgdmFyX3ZhbHVlc1tWQVJfT1VUX0hdID0gdmFyX3ZhbHVlc1tWQVJfT0hdID0gTkFOOworICAgIHZhcl92YWx1ZXNbVkFSX0FdICAgICA9IChkb3VibGUpIGlubGluay0+dyAvIGlubGluay0+aDsKKyAgICB2YXJfdmFsdWVzW1ZBUl9TQVJdICAgPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID8KKyAgICAgICAgKGRvdWJsZSkgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAvIGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gOiAxOworICAgIHZhcl92YWx1ZXNbVkFSX0RBUl0gICA9IHZhcl92YWx1ZXNbVkFSX0FdICogdmFyX3ZhbHVlc1tWQVJfU0FSXTsKKyAgICB2YXJfdmFsdWVzW1ZBUl9IU1VCXSAgPSAxIDw8IHMtPmRyYXcuaHN1Yl9tYXg7CisgICAgdmFyX3ZhbHVlc1tWQVJfVlNVQl0gID0gMSA8PCBzLT5kcmF3LnZzdWJfbWF4OworCisgICAgLyogZXZhbHVhdGUgd2lkdGggYW5kIGhlaWdodCAqLworICAgIGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgKGV4cHIgPSBzLT53X2V4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCB2YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KTsKKyAgICBzLT53ID0gdmFyX3ZhbHVlc1tWQVJfT1VUX1ddID0gdmFyX3ZhbHVlc1tWQVJfT1ddID0gcmVzOworICAgIGlmICgocmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmcmVzLCAoZXhwciA9IHMtPmhfZXhwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgdmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwKQorICAgICAgICBnb3RvIGV2YWxfZmFpbDsKKyAgICBzLT5oID0gdmFyX3ZhbHVlc1tWQVJfT1VUX0hdID0gdmFyX3ZhbHVlc1tWQVJfT0hdID0gcmVzOworICAgIC8qIGV2YWx1YXRlIHRoZSB3aWR0aCBhZ2FpbiwgYXMgaXQgbWF5IGRlcGVuZCBvbiB0aGUgZXZhbHVhdGVkIG91dHB1dCBoZWlnaHQgKi8KKyAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgKGV4cHIgPSBzLT53X2V4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIHZhcl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCkpIDwgMCkKKyAgICAgICAgZ290byBldmFsX2ZhaWw7CisgICAgcy0+dyA9IHZhcl92YWx1ZXNbVkFSX09VVF9XXSA9IHZhcl92YWx1ZXNbVkFSX09XXSA9IHJlczsKKworICAgIC8qIGV2YWx1YXRlIHggYW5kIHkgKi8KKyAgICBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZyZXMsIChleHByID0gcy0+eF9leHByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgdmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCk7CisgICAgcy0+eCA9IHZhcl92YWx1ZXNbVkFSX1hdID0gcmVzOworICAgIGlmICgocmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmcmVzLCAoZXhwciA9IHMtPnlfZXhwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgdmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwKQorICAgICAgICBnb3RvIGV2YWxfZmFpbDsKKyAgICBzLT55ID0gdmFyX3ZhbHVlc1tWQVJfWV0gPSByZXM7CisgICAgLyogZXZhbHVhdGUgeCBhZ2FpbiwgYXMgaXQgbWF5IGRlcGVuZCBvbiB0aGUgZXZhbHVhdGVkIHkgdmFsdWUgKi8KKyAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgKGV4cHIgPSBzLT54X2V4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIHZhcl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCkpIDwgMCkKKyAgICAgICAgZ290byBldmFsX2ZhaWw7CisgICAgcy0+eCA9IHZhcl92YWx1ZXNbVkFSX1hdID0gcmVzOworCisgICAgLyogc2FuaXR5IGNoZWNrIHBhcmFtcyAqLworICAgIGlmIChzLT53IDwgMCB8fCBzLT5oIDwgMCB8fCBzLT54IDwgMCB8fCBzLT55IDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJOZWdhdGl2ZSB2YWx1ZXMgYXJlIG5vdCBhY2NlcHRhYmxlLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKCFzLT53KQorICAgICAgICBzLT53ID0gaW5saW5rLT53OworICAgIGlmICghcy0+aCkKKyAgICAgICAgcy0+aCA9IGlubGluay0+aDsKKworICAgIHMtPncgICAgPSBmZl9kcmF3X3JvdW5kX3RvX3N1Yigmcy0+ZHJhdywgMCwgLTEsIHMtPncpOworICAgIHMtPmggICAgPSBmZl9kcmF3X3JvdW5kX3RvX3N1Yigmcy0+ZHJhdywgMSwgLTEsIHMtPmgpOworICAgIHMtPnggICAgPSBmZl9kcmF3X3JvdW5kX3RvX3N1Yigmcy0+ZHJhdywgMCwgLTEsIHMtPngpOworICAgIHMtPnkgICAgPSBmZl9kcmF3X3JvdW5kX3RvX3N1Yigmcy0+ZHJhdywgMSwgLTEsIHMtPnkpOworICAgIHMtPmluX3cgPSBmZl9kcmF3X3JvdW5kX3RvX3N1Yigmcy0+ZHJhdywgMCwgLTEsIGlubGluay0+dyk7CisgICAgcy0+aW5faCA9IGZmX2RyYXdfcm91bmRfdG9fc3ViKCZzLT5kcmF3LCAxLCAtMSwgaW5saW5rLT5oKTsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAidzolZCBoOiVkIC0+IHc6JWQgaDolZCB4OiVkIHk6JWQgY29sb3I6MHglMDJYJTAyWCUwMlglMDJYXG4iLAorICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCwgcy0+dywgcy0+aCwgcy0+eCwgcy0+eSwKKyAgICAgICAgICAgcy0+cmdiYV9jb2xvclswXSwgcy0+cmdiYV9jb2xvclsxXSwgcy0+cmdiYV9jb2xvclsyXSwgcy0+cmdiYV9jb2xvclszXSk7CisKKyAgICBpZiAocy0+eCA8ICAwIHx8IHMtPnkgPCAgMCAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICBzLT53IDw9IDAgfHwgcy0+aCA8PSAwICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICh1bnNpZ25lZClzLT54ICsgKHVuc2lnbmVkKWlubGluay0+dyA+IHMtPncgfHwKKyAgICAgICAgKHVuc2lnbmVkKXMtPnkgKyAodW5zaWduZWQpaW5saW5rLT5oID4gcy0+aCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW5wdXQgYXJlYSAlZDolZDolZDolZCBub3Qgd2l0aGluIHRoZSBwYWRkZWQgYXJlYSAwOjA6JWQ6JWQgb3IgemVyby1zaXplZFxuIiwKKyAgICAgICAgICAgICAgIHMtPngsIHMtPnksIHMtPnggKyBpbmxpbmstPncsIHMtPnkgKyBpbmxpbmstPmgsIHMtPncsIHMtPmgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiAwOworCitldmFsX2ZhaWw6CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgIkVycm9yIHdoZW4gZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiAnJXMnXG4iLCBleHByKTsKKyAgICByZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgUGFkQ29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKKworICAgIG91dGxpbmstPncgPSBzLT53OworICAgIG91dGxpbmstPmggPSBzLT5oOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQVZGcmFtZSAqZ2V0X3ZpZGVvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmlubGluaywgaW50IHcsIGludCBoKQoreworICAgIFBhZENvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKworICAgIEFWRnJhbWUgKmZyYW1lID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihpbmxpbmstPmRzdC0+b3V0cHV0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArIChzLT53IC0gcy0+aW5fdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKyAocy0+aCAtIHMtPmluX2gpKTsKKyAgICBpbnQgcGxhbmU7CisKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZyYW1lLT53aWR0aCAgPSB3OworICAgIGZyYW1lLT5oZWlnaHQgPSBoOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgNCAmJiBmcmFtZS0+ZGF0YVtwbGFuZV0gJiYgZnJhbWUtPmxpbmVzaXplW3BsYW5lXTsgcGxhbmUrKykgeworICAgICAgICBpbnQgaHN1YiA9IHMtPmRyYXcuaHN1YltwbGFuZV07CisgICAgICAgIGludCB2c3ViID0gcy0+ZHJhdy52c3ViW3BsYW5lXTsKKyAgICAgICAgZnJhbWUtPmRhdGFbcGxhbmVdICs9IChzLT54ID4+IGhzdWIpICogcy0+ZHJhdy5waXhlbHN0ZXBbcGxhbmVdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT55ID4+IHZzdWIpICogZnJhbWUtPmxpbmVzaXplW3BsYW5lXTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWU7Cit9CisKKy8qIGNoZWNrIHdoZXRoZXIgZWFjaCBwbGFuZSBpbiB0aGlzIGJ1ZmZlciBjYW4gYmUgcGFkZGVkIHdpdGhvdXQgY29weWluZyAqLworc3RhdGljIGludCBidWZmZXJfbmVlZHNfY29weShQYWRDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgQVZCdWZmZXJSZWYgKmJ1ZikKK3sKKyAgICBpbnQgcGxhbmVzWzRdID0geyAtMSwgLTEsIC0xLCAtMX0sICpwID0gcGxhbmVzOworICAgIGludCBpLCBqOworCisgICAgLyogZ2V0IGFsbCBwbGFuZXMgaW4gdGhpcyBidWZmZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocGxhbmVzKSAmJiBmcmFtZS0+ZGF0YVtpXTsgaSsrKSB7CisgICAgICAgIGlmIChhdl9mcmFtZV9nZXRfcGxhbmVfYnVmZmVyKGZyYW1lLCBpKSA9PSBidWYpCisgICAgICAgICAgICAqcCsrID0gaTsKKyAgICB9CisKKyAgICAvKiBmb3IgZWFjaCBwbGFuZSBpbiB0aGlzIGJ1ZmZlciwgY2hlY2sgdGhhdCBpdCBjYW4gYmUgcGFkZGVkIHdpdGhvdXQKKyAgICAgKiBnb2luZyBvdmVyIGJ1ZmZlciBib3VuZHMgb3Igb3RoZXIgcGxhbmVzICovCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHBsYW5lcykgJiYgcGxhbmVzW2ldID49IDA7IGkrKykgeworICAgICAgICBpbnQgaHN1YiA9IHMtPmRyYXcuaHN1YltwbGFuZXNbaV1dOworICAgICAgICBpbnQgdnN1YiA9IHMtPmRyYXcudnN1YltwbGFuZXNbaV1dOworCisgICAgICAgIHVpbnQ4X3QgKnN0YXJ0ID0gZnJhbWUtPmRhdGFbcGxhbmVzW2ldXTsKKyAgICAgICAgdWludDhfdCAqZW5kICAgPSBzdGFydCArIChmcmFtZS0+aGVpZ2h0ID4+IHZzdWIpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVtwbGFuZXNbaV1dOworCisgICAgICAgIC8qIGFtb3VudCBvZiBmcmVlIHNwYWNlIG5lZWRlZCBiZWZvcmUgdGhlIHN0YXJ0IGFuZCBhZnRlciB0aGUgZW5kCisgICAgICAgICAqIG9mIHRoZSBwbGFuZSAqLworICAgICAgICBwdHJkaWZmX3QgcmVxX3N0YXJ0ID0gKHMtPnggPj4gaHN1YikgKiBzLT5kcmF3LnBpeGVsc3RlcFtwbGFuZXNbaV1dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT55ID4+IHZzdWIpICogZnJhbWUtPmxpbmVzaXplW3BsYW5lc1tpXV07CisgICAgICAgIHB0cmRpZmZfdCByZXFfZW5kICAgPSAoKHMtPncgLSBzLT54IC0gZnJhbWUtPndpZHRoKSA+PiBoc3ViKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kcmF3LnBpeGVsc3RlcFtwbGFuZXNbaV1dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocy0+aCAtIHMtPnkgLSBmcmFtZS0+aGVpZ2h0KSA+PiB2c3ViKSAqIGZyYW1lLT5saW5lc2l6ZVtwbGFuZXNbaV1dOworCisgICAgICAgIGlmIChmcmFtZS0+bGluZXNpemVbcGxhbmVzW2ldXSA8IChzLT53ID4+IGhzdWIpICogcy0+ZHJhdy5waXhlbHN0ZXBbcGxhbmVzW2ldXSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBpZiAoc3RhcnQgLSBidWYtPmRhdGEgPCByZXFfc3RhcnQgfHwKKyAgICAgICAgICAgIChidWYtPmRhdGEgKyBidWYtPnNpemUpIC0gZW5kIDwgcmVxX2VuZCkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBGRl9BUlJBWV9FTEVNUyhwbGFuZXMpICYmIHBsYW5lc1tqXSA+PSAwOyBqKyspIHsKKyAgICAgICAgICAgIGludCB2c3ViMSA9IHMtPmRyYXcudnN1YltwbGFuZXNbal1dOworICAgICAgICAgICAgdWludDhfdCAqc3RhcnQxID0gZnJhbWUtPmRhdGFbcGxhbmVzW2pdXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmVuZDEgICA9IHN0YXJ0MSArIChmcmFtZS0+aGVpZ2h0ID4+IHZzdWIxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbcGxhbmVzW2pdXTsKKyAgICAgICAgICAgIGlmIChpID09IGopCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChGRlNJR04oc3RhcnQgLSBlbmQxKSAhPSBGRlNJR04oc3RhcnQgLSBlbmQxIC0gcmVxX3N0YXJ0KSB8fAorICAgICAgICAgICAgICAgIEZGU0lHTihlbmQgLSBzdGFydDEpICE9IEZGU0lHTihlbmQgLSBzdGFydDEgKyByZXFfZW5kKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZyYW1lX25lZWRzX2NvcHkoUGFkQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoIWF2X2ZyYW1lX2lzX3dyaXRhYmxlKGZyYW1lKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBmcmFtZS0+YnVmW2ldOyBpKyspCisgICAgICAgIGlmIChidWZmZXJfbmVlZHNfY29weShzLCBmcmFtZSwgZnJhbWUtPmJ1ZltpXSkpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIFBhZENvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IG5lZWRzX2NvcHkgPSBmcmFtZV9uZWVkc19jb3B5KHMsIGluKTsKKworICAgIGlmIChuZWVkc19jb3B5KSB7CisgICAgICAgIGF2X2xvZyhpbmxpbmstPmRzdCwgQVZfTE9HX0RFQlVHLCAiRGlyZWN0IHBhZGRpbmcgaW1wb3NzaWJsZSBhbGxvY2F0aW5nIG5ldyBmcmFtZVxuIik7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIoaW5saW5rLT5kc3QtPm91dHB1dHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNQVgoaW5saW5rLT53LCBzLT53KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1BWChpbmxpbmstPmgsIHMtPmgpKTsKKyAgICAgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIG91dCA9IGluOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBvdXQtPmRhdGFbaV0gJiYgb3V0LT5saW5lc2l6ZVtpXTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaHN1YiA9IHMtPmRyYXcuaHN1YltpXTsKKyAgICAgICAgICAgIGludCB2c3ViID0gcy0+ZHJhdy52c3ViW2ldOworICAgICAgICAgICAgb3V0LT5kYXRhW2ldIC09IChzLT54ID4+IGhzdWIpICogcy0+ZHJhdy5waXhlbHN0ZXBbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT55ID4+IHZzdWIpICogb3V0LT5saW5lc2l6ZVtpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHRvcCBiYXIgKi8KKyAgICBpZiAocy0+eSkgeworICAgICAgICBmZl9maWxsX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIHMtPncsIHMtPnkpOworICAgIH0KKworICAgIC8qIGJvdHRvbSBiYXIgKi8KKyAgICBpZiAocy0+aCA+IHMtPnkgKyBzLT5pbl9oKSB7CisgICAgICAgIGZmX2ZpbGxfcmVjdGFuZ2xlKCZzLT5kcmF3LCAmcy0+Y29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcy0+eSArIHMtPmluX2gsIHMtPncsIHMtPmggLSBzLT55IC0gcy0+aW5faCk7CisgICAgfQorCisgICAgLyogbGVmdCBib3JkZXIgKi8KKyAgICBmZl9maWxsX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmNvbG9yLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgMCwgcy0+eSwgcy0+eCwgaW4tPmhlaWdodCk7CisKKyAgICBpZiAobmVlZHNfY29weSkgeworICAgICAgICBmZl9jb3B5X3JlY3RhbmdsZTIoJnMtPmRyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwgaW4tPmRhdGEsIGluLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+eCwgcy0+eSwgMCwgMCwgaW4tPndpZHRoLCBpbi0+aGVpZ2h0KTsKKyAgICB9CisKKyAgICAvKiByaWdodCBib3JkZXIgKi8KKyAgICBmZl9maWxsX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmNvbG9yLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgcy0+eCArIHMtPmluX3csIHMtPnksIHMtPncgLSBzLT54IC0gcy0+aW5fdywKKyAgICAgICAgICAgICAgICAgICAgICBpbi0+aGVpZ2h0KTsKKworICAgIG91dC0+d2lkdGggID0gcy0+dzsKKyAgICBvdXQtPmhlaWdodCA9IHMtPmg7CisKKyAgICBpZiAoaW4gIT0gb3V0KQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShpbmxpbmstPmRzdC0+b3V0cHV0c1swXSwgb3V0KTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUGFkQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBwYWRfb3B0aW9uc1tdID0geworICAgIHsgIndpZHRoIiwgICJzZXQgdGhlIHBhZCBhcmVhIHdpZHRoIGV4cHJlc3Npb24iLCAgICAgICBPRkZTRVQod19leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJpdyJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAidyIsICAgICAgInNldCB0aGUgcGFkIGFyZWEgd2lkdGggZXhwcmVzc2lvbiIsICAgICAgIE9GRlNFVCh3X2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIml3In0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJoZWlnaHQiLCAic2V0IHRoZSBwYWQgYXJlYSBoZWlnaHQgZXhwcmVzc2lvbiIsICAgICAgT0ZGU0VUKGhfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiaWgifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImgiLCAgICAgICJzZXQgdGhlIHBhZCBhcmVhIGhlaWdodCBleHByZXNzaW9uIiwgICAgICBPRkZTRVQoaF9leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJpaCJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAieCIsICAgICAgInNldCB0aGUgeCBvZmZzZXQgZXhwcmVzc2lvbiBmb3IgdGhlIGlucHV0IGltYWdlIHBvc2l0aW9uIiwgT0ZGU0VUKHhfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiMCJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAieSIsICAgICAgInNldCB0aGUgeSBvZmZzZXQgZXhwcmVzc2lvbiBmb3IgdGhlIGlucHV0IGltYWdlIHBvc2l0aW9uIiwgT0ZGU0VUKHlfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiMCJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiY29sb3IiLCAgInNldCB0aGUgY29sb3Igb2YgdGhlIHBhZGRlZCBhcmVhIGJvcmRlciIsIE9GRlNFVChyZ2JhX2NvbG9yKSwgQVZfT1BUX1RZUEVfQ09MT1IsIHsuc3RyID0gImJsYWNrIn0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhwYWQpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfcGFkX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICAgICA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmdldF92aWRlb19idWZmZXIgPSBnZXRfdmlkZW9fYnVmZmVyLAorICAgICAgICAuZmlsdGVyX2ZyYW1lICAgICA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfcGFkX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3BhZCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJwYWQiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBhZCB0aGUgaW5wdXQgdmlkZW8uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoUGFkQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmcGFkX2NsYXNzLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGF2ZmlsdGVyX3ZmX3BhZF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl92Zl9wYWRfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfcGVyc3BlY3RpdmUuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9wZXJzcGVjdGl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDZkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfcGVyc3BlY3RpdmUuYwpAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDEzIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCisjZGVmaW5lIFNVQl9QSVhFTF9CSVRTICA4CisjZGVmaW5lIFNVQl9QSVhFTFMgICAgICAoMSA8PCBTVUJfUElYRUxfQklUUykKKyNkZWZpbmUgQ09FRkZfQklUUyAgICAgIDExCisKKyNkZWZpbmUgTElORUFSIDAKKyNkZWZpbmUgQ1VCSUMgIDEKKwordHlwZWRlZiBzdHJ1Y3QgUGVyc3BlY3RpdmVDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBjaGFyICpleHByX3N0cls0XVsyXTsKKyAgICBkb3VibGUgcmVmWzRdWzJdOworICAgIGludDMyX3QgKCpwdilbMl07CisgICAgaW50MzJfdCBjb2VmZltTVUJfUElYRUxTXVs0XTsKKyAgICBpbnQgaW50ZXJwb2xhdGlvbjsKKyAgICBpbnQgbGluZXNpemVbNF07CisgICAgaW50IGhlaWdodFs0XTsKKyAgICBpbnQgaHN1YiwgdnN1YjsKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCBzZW5zZTsKKworICAgIGludCAoKnBlcnNwZWN0aXZlKShBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnLCBpbnQgam9iLCBpbnQgbmJfam9icyk7Cit9IFBlcnNwZWN0aXZlQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUGVyc3BlY3RpdmVDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworZW51bSBQRVJTUEVDVElWRVNlbnNlIHsKKyAgICBQRVJTUEVDVElWRV9TRU5TRV9TT1VSQ0UgICAgICA9IDAsIC8vLzwgY29vcmRpbmF0ZXMgZ2l2ZSBsb2NhdGlvbnMgaW4gc291cmNlIG9mIGNvcm5lcnMgb2YgZGVzdGluYXRpb24uCisgICAgUEVSU1BFQ1RJVkVfU0VOU0VfREVTVElOQVRJT04gPSAxLCAvLy88IGNvb3JkaW5hdGVzIGdpdmUgbG9jYXRpb25zIGluIGRlc3RpbmF0aW9uIG9mIGNvcm5lcnMgb2Ygc291cmNlLgorfTsKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHBlcnNwZWN0aXZlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJ4MCIsICJzZXQgdG9wIGxlZnQgeCBjb29yZGluYXRlIiwgICAgIE9GRlNFVChleHByX3N0clswXVswXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjAifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJ5MCIsICJzZXQgdG9wIGxlZnQgeSBjb29yZGluYXRlIiwgICAgIE9GRlNFVChleHByX3N0clswXVsxXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjAifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJ4MSIsICJzZXQgdG9wIHJpZ2h0IHggY29vcmRpbmF0ZSIsICAgIE9GRlNFVChleHByX3N0clsxXVswXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IlcifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJ5MSIsICJzZXQgdG9wIHJpZ2h0IHkgY29vcmRpbmF0ZSIsICAgIE9GRlNFVChleHByX3N0clsxXVsxXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjAifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJ4MiIsICJzZXQgYm90dG9tIGxlZnQgeCBjb29yZGluYXRlIiwgIE9GRlNFVChleHByX3N0clsyXVswXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjAifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJ5MiIsICJzZXQgYm90dG9tIGxlZnQgeSBjb29yZGluYXRlIiwgIE9GRlNFVChleHByX3N0clsyXVsxXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IkgifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJ4MyIsICJzZXQgYm90dG9tIHJpZ2h0IHggY29vcmRpbmF0ZSIsIE9GRlNFVChleHByX3N0clszXVswXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IlcifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJ5MyIsICJzZXQgYm90dG9tIHJpZ2h0IHkgY29vcmRpbmF0ZSIsIE9GRlNFVChleHByX3N0clszXVsxXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IkgifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJpbnRlcnBvbGF0aW9uIiwgInNldCBpbnRlcnBvbGF0aW9uIiwgT0ZGU0VUKGludGVycG9sYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUxJTkVBUn0sIDAsIDEsIEZMQUdTLCAiaW50ZXJwb2xhdGlvbiIgfSwKKyAgICB7ICAgICAgImxpbmVhciIsICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TElORUFSfSwgMCwgMCwgRkxBR1MsICJpbnRlcnBvbGF0aW9uIiB9LAorICAgIHsgICAgICAgImN1YmljIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1DVUJJQ30sICAwLCAwLCBGTEFHUywgImludGVycG9sYXRpb24iIH0sCisgICAgeyAic2Vuc2UiLCAgICJzcGVjaWZ5IHRoZSBzZW5zZSBvZiB0aGUgY29vcmRpbmF0ZXMiLCBPRkZTRVQoc2Vuc2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVBFUlNQRUNUSVZFX1NFTlNFX1NPVVJDRX0sIDAsIDEsIEZMQUdTLCAic2Vuc2UifSwKKyAgICB7ICAgICAgICJzb3VyY2UiLCAic3BlY2lmeSBsb2NhdGlvbnMgaW4gc291cmNlIHRvIHNlbmQgdG8gY29ybmVycyBpbiBkZXN0aW5hdGlvbiIsCisgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVBFUlNQRUNUSVZFX1NFTlNFX1NPVVJDRX0sIDAsIDAsIEZMQUdTLCAic2Vuc2UifSwKKyAgICB7ICAgICAgICJkZXN0aW5hdGlvbiIsICJzcGVjaWZ5IGxvY2F0aW9ucyBpbiBkZXN0aW5hdGlvbiB0byBzZW5kIGNvcm5lcnMgb2Ygc291cmNlIiwKKyAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UEVSU1BFQ1RJVkVfU0VOU0VfREVTVElOQVRJT059LCAwLCAwLCBGTEFHUywgInNlbnNlIn0sCisKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHBlcnNwZWN0aXZlKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDQwUCwgQVZfUElYX0ZNVF9ZVVZKNDIyUCxBVl9QSVhfRk1UX1lVVko0MjBQLCBBVl9QSVhfRk1UX1lVVko0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWNDQwUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDExUCwgQVZfUElYX0ZNVF9ZVVY0MTBQLAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAsIEFWX1BJWF9GTVRfR0JSQVAsIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIGdldF9jb2VmZihkb3VibGUgZCkKK3sKKyAgICBkb3VibGUgY29lZmYsIEEgPSAtMC42MDsKKworICAgIGQgPSBmYWJzKGQpOworCisgICAgaWYgKGQgPCAxLjApCisgICAgICAgIGNvZWZmID0gKDEuMCAtIChBICsgMy4wKSAqIGQgKiBkICsgKEEgKyAyLjApICogZCAqIGQgKiBkKTsKKyAgICBlbHNlIGlmIChkIDwgMi4wKQorICAgICAgICBjb2VmZiA9ICgtNC4wICogQSArIDguMCAqIEEgKiBkIC0gNS4wICogQSAqIGQgKiBkICsgQSAqIGQgKiBkICogZCk7CisgICAgZWxzZQorICAgICAgICBjb2VmZiA9IDAuMDsKKworICAgIHJldHVybiBjb2VmZjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geyAgICJXIiwgICAiSCIsICAgICAgICBOVUxMIH07CitlbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFZBUl9XLCBWQVJfSCwgVkFSX1ZBUlNfTkIgfTsKKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgZG91YmxlIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDgsIHE7CisgICAgZG91YmxlIHQwLCB0MSwgdDIsIHQzOworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgUGVyc3BlY3RpdmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGRvdWJsZSAoKnJlZilbMl0gPSBzLT5yZWY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgZG91YmxlIHZhbHVlc1tWQVJfVkFSU19OQl0gPSB7IFtWQVJfV10gPSBpbmxpbmstPncsIFtWQVJfSF0gPSBpbmxpbmstPmggfTsKKyAgICBpbnQgaCA9IGlubGluay0+aDsKKyAgICBpbnQgdyA9IGlubGluay0+dzsKKyAgICBpbnQgeCwgeSwgaSwgaiwgcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICBpZiAoIXMtPmV4cHJfc3RyW2ldW2pdKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICByZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZzLT5yZWZbaV1bal0sIHMtPmV4cHJfc3RyW2ldW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsICZ2YWx1ZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGN0eCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcy0+aHN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgcy0+dnN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMocy0+bGluZXNpemUsIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5oZWlnaHRbMV0gPSBzLT5oZWlnaHRbMl0gPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgIHMtPmhlaWdodFswXSA9IHMtPmhlaWdodFszXSA9IGlubGluay0+aDsKKworICAgIHMtPnB2ID0gYXZfcmVhbGxvY19mKHMtPnB2LCB3ICogaCwgMiAqIHNpemVvZigqcy0+cHYpKTsKKyAgICBpZiAoIXMtPnB2KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3dpdGNoIChzLT5zZW5zZSkgeworICAgIGNhc2UgUEVSU1BFQ1RJVkVfU0VOU0VfU09VUkNFOgorICAgICAgICB4NiA9ICgocmVmWzBdWzBdIC0gcmVmWzFdWzBdIC0gcmVmWzJdWzBdICsgcmVmWzNdWzBdKSAqCisgICAgICAgICAgICAgIChyZWZbMl1bMV0gLSByZWZbM11bMV0pIC0KKyAgICAgICAgICAgICAoIHJlZlswXVsxXSAtIHJlZlsxXVsxXSAtIHJlZlsyXVsxXSArIHJlZlszXVsxXSkgKgorICAgICAgICAgICAgICAocmVmWzJdWzBdIC0gcmVmWzNdWzBdKSkgKiBoOworICAgICAgICB4NyA9ICgocmVmWzBdWzFdIC0gcmVmWzFdWzFdIC0gcmVmWzJdWzFdICsgcmVmWzNdWzFdKSAqCisgICAgICAgICAgICAgIChyZWZbMV1bMF0gLSByZWZbM11bMF0pIC0KKyAgICAgICAgICAgICAoIHJlZlswXVswXSAtIHJlZlsxXVswXSAtIHJlZlsyXVswXSArIHJlZlszXVswXSkgKgorICAgICAgICAgICAgICAocmVmWzFdWzFdIC0gcmVmWzNdWzFdKSkgKiB3OworICAgICAgICBxID0gICggcmVmWzFdWzBdIC0gcmVmWzNdWzBdKSAqIChyZWZbMl1bMV0gLSByZWZbM11bMV0pIC0KKyAgICAgICAgICAgICAoIHJlZlsyXVswXSAtIHJlZlszXVswXSkgKiAocmVmWzFdWzFdIC0gcmVmWzNdWzFdKTsKKworICAgICAgICB4MCA9IHEgKiAocmVmWzFdWzBdIC0gcmVmWzBdWzBdKSAqIGggKyB4NiAqIHJlZlsxXVswXTsKKyAgICAgICAgeDEgPSBxICogKHJlZlsyXVswXSAtIHJlZlswXVswXSkgKiB3ICsgeDcgKiByZWZbMl1bMF07CisgICAgICAgIHgyID0gcSAqICByZWZbMF1bMF0gKiB3ICogaDsKKyAgICAgICAgeDMgPSBxICogKHJlZlsxXVsxXSAtIHJlZlswXVsxXSkgKiBoICsgeDYgKiByZWZbMV1bMV07CisgICAgICAgIHg0ID0gcSAqIChyZWZbMl1bMV0gLSByZWZbMF1bMV0pICogdyArIHg3ICogcmVmWzJdWzFdOworICAgICAgICB4NSA9IHEgKiAgcmVmWzBdWzFdICogdyAqIGg7CisgICAgICAgIHg4ID0gcSAqIHcgKiBoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBFUlNQRUNUSVZFX1NFTlNFX0RFU1RJTkFUSU9OOgorICAgICAgICB0MCA9IHJlZlswXVswXSAqIChyZWZbM11bMV0gLSByZWZbMV1bMV0pICsKKyAgICAgICAgICAgICByZWZbMV1bMF0gKiAocmVmWzBdWzFdIC0gcmVmWzNdWzFdKSArCisgICAgICAgICAgICAgcmVmWzNdWzBdICogKHJlZlsxXVsxXSAtIHJlZlswXVsxXSk7CisgICAgICAgIHQxID0gcmVmWzFdWzBdICogKHJlZlsyXVsxXSAtIHJlZlszXVsxXSkgKworICAgICAgICAgICAgIHJlZlsyXVswXSAqIChyZWZbM11bMV0gLSByZWZbMV1bMV0pICsKKyAgICAgICAgICAgICByZWZbM11bMF0gKiAocmVmWzFdWzFdIC0gcmVmWzJdWzFdKTsKKyAgICAgICAgdDIgPSByZWZbMF1bMF0gKiAocmVmWzNdWzFdIC0gcmVmWzJdWzFdKSArCisgICAgICAgICAgICAgcmVmWzJdWzBdICogKHJlZlswXVsxXSAtIHJlZlszXVsxXSkgKworICAgICAgICAgICAgIHJlZlszXVswXSAqIChyZWZbMl1bMV0gLSByZWZbMF1bMV0pOworICAgICAgICB0MyA9IHJlZlswXVswXSAqIChyZWZbMV1bMV0gLSByZWZbMl1bMV0pICsKKyAgICAgICAgICAgICByZWZbMV1bMF0gKiAocmVmWzJdWzFdIC0gcmVmWzBdWzFdKSArCisgICAgICAgICAgICAgcmVmWzJdWzBdICogKHJlZlswXVsxXSAtIHJlZlsxXVsxXSk7CisKKyAgICAgICAgeDAgPSB0MCAqIHQxICogdyAqIChyZWZbMl1bMV0gLSByZWZbMF1bMV0pOworICAgICAgICB4MSA9IHQwICogdDEgKiB3ICogKHJlZlswXVswXSAtIHJlZlsyXVswXSk7CisgICAgICAgIHgyID0gdDAgKiB0MSAqIHcgKiAocmVmWzBdWzFdICogcmVmWzJdWzBdIC0gcmVmWzBdWzBdICogcmVmWzJdWzFdKTsKKyAgICAgICAgeDMgPSB0MSAqIHQyICogaCAqIChyZWZbMV1bMV0gLSByZWZbMF1bMV0pOworICAgICAgICB4NCA9IHQxICogdDIgKiBoICogKHJlZlswXVswXSAtIHJlZlsxXVswXSk7CisgICAgICAgIHg1ID0gdDEgKiB0MiAqIGggKiAocmVmWzBdWzFdICogcmVmWzFdWzBdIC0gcmVmWzBdWzBdICogcmVmWzFdWzFdKTsKKyAgICAgICAgeDYgPSB0MSAqIHQyICogKHJlZlsxXVsxXSAtIHJlZlswXVsxXSkgKworICAgICAgICAgICAgIHQwICogdDMgKiAocmVmWzJdWzFdIC0gcmVmWzNdWzFdKTsKKyAgICAgICAgeDcgPSB0MSAqIHQyICogKHJlZlswXVswXSAtIHJlZlsxXVswXSkgKworICAgICAgICAgICAgIHQwICogdDMgKiAocmVmWzNdWzBdIC0gcmVmWzJdWzBdKTsKKyAgICAgICAgeDggPSB0MSAqIHQyICogKHJlZlswXVsxXSAqIHJlZlsxXVswXSAtIHJlZlswXVswXSAqIHJlZlsxXVsxXSkgKworICAgICAgICAgICAgIHQwICogdDMgKiAocmVmWzJdWzBdICogcmVmWzNdWzFdIC0gcmVmWzJdWzFdICogcmVmWzNdWzBdKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKyl7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspeworICAgICAgICAgICAgaW50IHUsIHY7CisKKyAgICAgICAgICAgIHUgPSAoaW50KWZsb29yKFNVQl9QSVhFTFMgKiAoeDAgKiB4ICsgeDEgKiB5ICsgeDIpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeDYgKiB4ICsgeDcgKiB5ICsgeDgpICsgMC41KTsKKyAgICAgICAgICAgIHYgPSAoaW50KWZsb29yKFNVQl9QSVhFTFMgKiAoeDMgKiB4ICsgeDQgKiB5ICsgeDUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeDYgKiB4ICsgeDcgKiB5ICsgeDgpICsgMC41KTsKKworICAgICAgICAgICAgcy0+cHZbeCArIHkgKiB3XVswXSA9IHU7CisgICAgICAgICAgICBzLT5wdlt4ICsgeSAqIHddWzFdID0gdjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBTVUJfUElYRUxTOyBpKyspeworICAgICAgICBkb3VibGUgZCA9IGkgLyAoZG91YmxlKVNVQl9QSVhFTFM7CisgICAgICAgIGRvdWJsZSB0ZW1wWzRdOworICAgICAgICBkb3VibGUgc3VtID0gMDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgdGVtcFtqXSA9IGdldF9jb2VmZihqIC0gZCAtIDEpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICBzdW0gKz0gdGVtcFtqXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgcy0+Y29lZmZbaV1bal0gPSAoaW50KWZsb29yKCgxIDw8IENPRUZGX0JJVFMpICogdGVtcFtqXSAvIHN1bSArIDAuNSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IFRocmVhZERhdGEgeworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBpbnQgZHN0X2xpbmVzaXplOworICAgIHVpbnQ4X3QgKnNyYzsKKyAgICBpbnQgc3JjX2xpbmVzaXplOworICAgIGludCB3LCBoOworICAgIGludCBoc3ViLCB2c3ViOworfSBUaHJlYWREYXRhOworCitzdGF0aWMgaW50IHJlc2FtcGxlX2N1YmljKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqb2IsIGludCBuYl9qb2JzKQoreworICAgIFBlcnNwZWN0aXZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICB1aW50OF90ICpkc3QgPSB0ZC0+ZHN0OworICAgIGludCBkc3RfbGluZXNpemUgPSB0ZC0+ZHN0X2xpbmVzaXplOworICAgIHVpbnQ4X3QgKnNyYyA9IHRkLT5zcmM7CisgICAgaW50IHNyY19saW5lc2l6ZSA9IHRkLT5zcmNfbGluZXNpemU7CisgICAgaW50IHcgPSB0ZC0+dzsKKyAgICBpbnQgaCA9IHRkLT5oOworICAgIGludCBoc3ViID0gdGQtPmhzdWI7CisgICAgaW50IHZzdWIgPSB0ZC0+dnN1YjsKKyAgICBpbnQgc3RhcnQgPSAoaCAqIGpvYikgLyBuYl9qb2JzOworICAgIGludCBlbmQgICA9IChoICogKGpvYisxKSkgLyBuYl9qb2JzOworICAgIGNvbnN0IGludCBsaW5lc2l6ZSA9IHMtPmxpbmVzaXplWzBdOworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQ7IHkrKykgeworICAgICAgICBpbnQgc3kgPSB5IDw8IHZzdWI7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCB1LCB2LCBzdWJVLCBzdWJWLCBzdW0sIHN4OworCisgICAgICAgICAgICBzeCAgID0geCA8PCBoc3ViOworICAgICAgICAgICAgdSAgICA9IHMtPnB2W3N4ICsgc3kgKiBsaW5lc2l6ZV1bMF0gPj4gaHN1YjsKKyAgICAgICAgICAgIHYgICAgPSBzLT5wdltzeCArIHN5ICogbGluZXNpemVdWzFdID4+IHZzdWI7CisgICAgICAgICAgICBzdWJVID0gdSAmIChTVUJfUElYRUxTIC0gMSk7CisgICAgICAgICAgICBzdWJWID0gdiAmIChTVUJfUElYRUxTIC0gMSk7CisgICAgICAgICAgICB1ICA+Pj0gU1VCX1BJWEVMX0JJVFM7CisgICAgICAgICAgICB2ICA+Pj0gU1VCX1BJWEVMX0JJVFM7CisKKyAgICAgICAgICAgIGlmICh1ID4gMCAmJiB2ID4gMCAmJiB1IDwgdyAtIDIgJiYgdiA8IGggLSAyKXsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXggPSB1ICsgdipzcmNfbGluZXNpemU7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGEgPSBzLT5jb2VmZltzdWJVXVswXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYiA9IHMtPmNvZWZmW3N1YlVdWzFdOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjID0gcy0+Y29lZmZbc3ViVV1bMl07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGQgPSBzLT5jb2VmZltzdWJVXVszXTsKKworICAgICAgICAgICAgICAgIHN1bSA9IHMtPmNvZWZmW3N1YlZdWzBdICogKGEgKiBzcmNbaW5kZXggLSAxIC0gICAgIHNyY19saW5lc2l6ZV0gKyBiICogc3JjW2luZGV4IC0gMCAtICAgICBzcmNfbGluZXNpemVdICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgKiAgICAgIHNyY1tpbmRleCArIDEgLSAgICAgc3JjX2xpbmVzaXplXSArIGQgKiBzcmNbaW5kZXggKyAyIC0gICAgIHNyY19saW5lc2l6ZV0pICsKKyAgICAgICAgICAgICAgICAgICAgICBzLT5jb2VmZltzdWJWXVsxXSAqIChhICogc3JjW2luZGV4IC0gMSAgICAgICAgICAgICAgICAgICBdICsgYiAqIHNyY1tpbmRleCAtIDAgICAgICAgICAgICAgICAgICAgXSAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICogICAgICBzcmNbaW5kZXggKyAxICAgICAgICAgICAgICAgICAgIF0gKyBkICogc3JjW2luZGV4ICsgMiAgICAgICAgICAgICAgICAgICBdKSArCisgICAgICAgICAgICAgICAgICAgICAgcy0+Y29lZmZbc3ViVl1bMl0gKiAoYSAqIHNyY1tpbmRleCAtIDEgKyAgICAgc3JjX2xpbmVzaXplXSArIGIgKiBzcmNbaW5kZXggLSAwICsgICAgIHNyY19saW5lc2l6ZV0gICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAqICAgICAgc3JjW2luZGV4ICsgMSArICAgICBzcmNfbGluZXNpemVdICsgZCAqIHNyY1tpbmRleCArIDIgKyAgICAgc3JjX2xpbmVzaXplXSkgKworICAgICAgICAgICAgICAgICAgICAgIHMtPmNvZWZmW3N1YlZdWzNdICogKGEgKiBzcmNbaW5kZXggLSAxICsgMiAqIHNyY19saW5lc2l6ZV0gKyBiICogc3JjW2luZGV4IC0gMCArIDIgKiBzcmNfbGluZXNpemVdICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgKiAgICAgIHNyY1tpbmRleCArIDEgKyAyICogc3JjX2xpbmVzaXplXSArIGQgKiBzcmNbaW5kZXggKyAyICsgMiAqIHNyY19saW5lc2l6ZV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgZHgsIGR5OworCisgICAgICAgICAgICAgICAgc3VtID0gMDsKKworICAgICAgICAgICAgICAgIGZvciAoZHkgPSAwOyBkeSA8IDQ7IGR5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGl5ID0gdiArIGR5IC0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaXkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgaXkgPSAwOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpeSA+PSBoKQorICAgICAgICAgICAgICAgICAgICAgICAgaXkgPSBoLTE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZHggPSAwOyBkeCA8IDQ7IGR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpeCA9IHUgKyBkeCAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpeCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXggPj0gdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpeCA9IHcgLSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gcy0+Y29lZmZbc3ViVV1bZHhdICogcy0+Y29lZmZbc3ViVl1bZHldICogc3JjWyBpeCArIGl5ICogc3JjX2xpbmVzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3VtID0gKHN1bSArICgxPDwoQ09FRkZfQklUUyAqIDIgLSAxKSkpID4+IChDT0VGRl9CSVRTICogMik7CisgICAgICAgICAgICBzdW0gPSBhdl9jbGlwKHN1bSwgMCwgMjU1KTsKKyAgICAgICAgICAgIGRzdFt4ICsgeSAqIGRzdF9saW5lc2l6ZV0gPSBzdW07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVzYW1wbGVfbGluZWFyKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgam9iLCBpbnQgbmJfam9icykKK3sKKyAgICBQZXJzcGVjdGl2ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgdWludDhfdCAqZHN0ID0gdGQtPmRzdDsKKyAgICBpbnQgZHN0X2xpbmVzaXplID0gdGQtPmRzdF9saW5lc2l6ZTsKKyAgICB1aW50OF90ICpzcmMgPSB0ZC0+c3JjOworICAgIGludCBzcmNfbGluZXNpemUgPSB0ZC0+c3JjX2xpbmVzaXplOworICAgIGludCB3ID0gdGQtPnc7CisgICAgaW50IGggPSB0ZC0+aDsKKyAgICBpbnQgaHN1YiA9IHRkLT5oc3ViOworICAgIGludCB2c3ViID0gdGQtPnZzdWI7CisgICAgaW50IHN0YXJ0ID0gKGggKiBqb2IpIC8gbmJfam9iczsKKyAgICBpbnQgZW5kICAgPSAoaCAqIChqb2IrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgbGluZXNpemUgPSBzLT5saW5lc2l6ZVswXTsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kOyB5KyspeworICAgICAgICBpbnQgc3kgPSB5IDw8IHZzdWI7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspeworICAgICAgICAgICAgaW50IHUsIHYsIHN1YlUsIHN1YlYsIHN1bSwgc3gsIGluZGV4LCBzdWJVSSwgc3ViVkk7CisKKyAgICAgICAgICAgIHN4ICAgPSB4IDw8IGhzdWI7CisgICAgICAgICAgICB1ICAgID0gcy0+cHZbc3ggKyBzeSAqIGxpbmVzaXplXVswXSA+PiBoc3ViOworICAgICAgICAgICAgdiAgICA9IHMtPnB2W3N4ICsgc3kgKiBsaW5lc2l6ZV1bMV0gPj4gdnN1YjsKKyAgICAgICAgICAgIHN1YlUgPSB1ICYgKFNVQl9QSVhFTFMgLSAxKTsKKyAgICAgICAgICAgIHN1YlYgPSB2ICYgKFNVQl9QSVhFTFMgLSAxKTsKKyAgICAgICAgICAgIHUgID4+PSBTVUJfUElYRUxfQklUUzsKKyAgICAgICAgICAgIHYgID4+PSBTVUJfUElYRUxfQklUUzsKKworICAgICAgICAgICAgaW5kZXggPSB1ICsgdiAqIHNyY19saW5lc2l6ZTsKKyAgICAgICAgICAgIHN1YlVJID0gU1VCX1BJWEVMUyAtIHN1YlU7CisgICAgICAgICAgICBzdWJWSSA9IFNVQl9QSVhFTFMgLSBzdWJWOworCisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXUgPCAodW5zaWduZWQpKHcgLSAxKSl7CisgICAgICAgICAgICAgICAgaWYoKHVuc2lnbmVkKXYgPCAodW5zaWduZWQpKGggLSAxKSl7CisgICAgICAgICAgICAgICAgICAgIHN1bSA9IHN1YlZJICogKHN1YlVJICogc3JjW2luZGV4XSArIHN1YlUgKiBzcmNbaW5kZXggKyAxXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJWICAqIChzdWJVSSAqIHNyY1tpbmRleCArIHNyY19saW5lc2l6ZV0gKyBzdWJVICogc3JjW2luZGV4ICsgc3JjX2xpbmVzaXplICsgMV0pOworICAgICAgICAgICAgICAgICAgICBzdW0gPSAoc3VtICsgKDEgPDwgKFNVQl9QSVhFTF9CSVRTICogMiAtIDEpKSk+PiAoU1VCX1BJWEVMX0JJVFMgKiAyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodiA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGggLSAxOworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHUgKyB2ICogc3JjX2xpbmVzaXplOworICAgICAgICAgICAgICAgICAgICBzdW0gICA9IHN1YlVJICogc3JjW2luZGV4XSArIHN1YlUgKiBzcmNbaW5kZXggKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgc3VtICAgPSAoc3VtICsgKDEgPDwgKFNVQl9QSVhFTF9CSVRTIC0gMSkpKSA+PiBTVUJfUElYRUxfQklUUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh1IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgdSA9IDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB1ID0gdyAtIDE7CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCl2IDwgKHVuc2lnbmVkKShoIC0gMSkpeworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHUgKyB2ICogc3JjX2xpbmVzaXplOworICAgICAgICAgICAgICAgICAgICBzdW0gICA9IHN1YlZJICogc3JjW2luZGV4XSArIHN1YlYgKiBzcmNbaW5kZXggKyBzcmNfbGluZXNpemVdOworICAgICAgICAgICAgICAgICAgICBzdW0gICA9IChzdW0gKyAoMSA8PCAoU1VCX1BJWEVMX0JJVFMgLSAxKSkpID4+IFNVQl9QSVhFTF9CSVRTOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAwOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gaCAtIDE7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gdSArIHYgKiBzcmNfbGluZXNpemU7CisgICAgICAgICAgICAgICAgICAgIHN1bSAgID0gc3JjW2luZGV4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN1bSA9IGF2X2NsaXAoc3VtLCAwLCAyNTUpOworICAgICAgICAgICAgZHN0W3ggKyB5ICogZHN0X2xpbmVzaXplXSA9IHN1bTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUGVyc3BlY3RpdmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgc3dpdGNoIChzLT5pbnRlcnBvbGF0aW9uKSB7CisgICAgY2FzZSBMSU5FQVI6IHMtPnBlcnNwZWN0aXZlID0gcmVzYW1wbGVfbGluZWFyOyBicmVhazsKKyAgICBjYXNlIENVQklDOiAgcy0+cGVyc3BlY3RpdmUgPSByZXNhbXBsZV9jdWJpYzsgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgUGVyc3BlY3RpdmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKm91dDsKKyAgICBpbnQgcGxhbmU7CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGZyYW1lKTsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPm5iX3BsYW5lczsgcGxhbmUrKykgeworICAgICAgICBpbnQgaHN1YiA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IHMtPmhzdWIgOiAwOworICAgICAgICBpbnQgdnN1YiA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IHMtPnZzdWIgOiAwOworICAgICAgICBUaHJlYWREYXRhIHRkID0gey5kc3QgPSBvdXQtPmRhdGFbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgIC5kc3RfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc3JjID0gZnJhbWUtPmRhdGFbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgIC5zcmNfbGluZXNpemUgPSBmcmFtZS0+bGluZXNpemVbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgIC53ID0gcy0+bGluZXNpemVbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgIC5oID0gcy0+aGVpZ2h0W3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAuaHN1YiA9IGhzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgLnZzdWIgPSB2c3ViIH07CisgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBzLT5wZXJzcGVjdGl2ZSwgJnRkLCBOVUxMLCBGRk1JTih0ZC5oLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUGVyc3BlY3RpdmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfZnJlZXAoJnMtPnB2KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHBlcnNwZWN0aXZlX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgcGVyc3BlY3RpdmVfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3BlcnNwZWN0aXZlID0geworICAgIC5uYW1lICAgICAgICAgID0gInBlcnNwZWN0aXZlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDb3JyZWN0IHRoZSBwZXJzcGVjdGl2ZSBvZiB2aWRlby4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihQZXJzcGVjdGl2ZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBwZXJzcGVjdGl2ZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBwZXJzcGVjdGl2ZV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnBlcnNwZWN0aXZlX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMgfCBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3BoYXNlLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfcGhhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmRjNjAzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3BoYXNlLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVmlsbGUgU2FhcmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK2VudW0gUGhhc2VNb2RlIHsKKyAgICBQUk9HUkVTU0lWRSwKKyAgICBUT1BfRklSU1QsCisgICAgQk9UVE9NX0ZJUlNULAorICAgIFRPUF9GSVJTVF9BTkFMWVpFLAorICAgIEJPVFRPTV9GSVJTVF9BTkFMWVpFLAorICAgIEFOQUxZWkUsCisgICAgRlVMTF9BTkFMWVpFLAorICAgIEFVVE8sCisgICAgQVVUT19BTkFMWVpFCit9OworCit0eXBlZGVmIHN0cnVjdCBQaGFzZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGVudW0gUGhhc2VNb2RlIG1vZGU7CisgICAgQVZGcmFtZSAqZnJhbWU7IC8qIHByZXZpb3VzIGZyYW1lICovCisgICAgaW50IG5iX3BsYW5lczsKKyAgICBpbnQgcGxhbmVoZWlnaHRbNF07CisgICAgaW50IGxpbmVzaXplWzRdOworfSBQaGFzZUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFBoYXNlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisjZGVmaW5lIENPTlNUKG5hbWUsIGhlbHAsIHZhbCwgdW5pdCkgeyBuYW1lLCBoZWxwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9dmFsfSwgMCwgMCwgRkxBR1MsIHVuaXQgfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gcGhhc2Vfb3B0aW9uc1tdID0geworICAgIHsgIm1vZGUiLCAic2V0IHBoYXNlIG1vZGUiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9QVVUT19BTkFMWVpFfSwgUFJPR1JFU1NJVkUsIEFVVE9fQU5BTFlaRSwgRkxBR1MsICJtb2RlIiB9LAorICAgIENPTlNUKCJwIiwgInByb2dyZXNzaXZlIiwgICAgICAgICAgUFJPR1JFU1NJVkUsICAgICAgICAgICJtb2RlIiksCisgICAgQ09OU1QoInQiLCAidG9wIGZpcnN0IiwgICAgICAgICAgICBUT1BfRklSU1QsICAgICAgICAgICAgIm1vZGUiKSwKKyAgICBDT05TVCgiYiIsICJib3R0b20gZmlyc3QiLCAgICAgICAgIEJPVFRPTV9GSVJTVCwgICAgICAgICAibW9kZSIpLAorICAgIENPTlNUKCJUIiwgInRvcCBmaXJzdCBhbmFseXplIiwgICAgVE9QX0ZJUlNUX0FOQUxZWkUsICAgICJtb2RlIiksCisgICAgQ09OU1QoIkIiLCAiYm90dG9tIGZpcnN0IGFuYWx5emUiLCBCT1RUT01fRklSU1RfQU5BTFlaRSwgIm1vZGUiKSwKKyAgICBDT05TVCgidSIsICJhbmFseXplIiwgICAgICAgICAgICAgIEFOQUxZWkUsICAgICAgICAgICAgICAibW9kZSIpLAorICAgIENPTlNUKCJVIiwgImZ1bGwgYW5hbHl6ZSIsICAgICAgICAgRlVMTF9BTkFMWVpFLCAgICAgICAgICJtb2RlIiksCisgICAgQ09OU1QoImEiLCAiYXV0byIsICAgICAgICAgICAgICAgICBBVVRPLCAgICAgICAgICAgICAgICAgIm1vZGUiKSwKKyAgICBDT05TVCgiQSIsICJhdXRvIGFuYWx5emUiLCAgICAgICAgIEFVVE9fQU5BTFlaRSwgICAgICAgICAibW9kZSIpLAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MocGhhc2UpOworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDBQLCBBVl9QSVhfRk1UX1lVVko0MjJQLEFWX1BJWF9GTVRfWVVWSjQyMFAsIEFWX1BJWF9GTVRfWVVWSjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9ZVVY0NDBQLCBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLCBBVl9QSVhfRk1UX1lVVjQxMFAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgUGhhc2VDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMocy0+bGluZXNpemUsIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5wbGFuZWhlaWdodFsxXSA9IHMtPnBsYW5laGVpZ2h0WzJdID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBzLT5wbGFuZWhlaWdodFswXSA9IHMtPnBsYW5laGVpZ2h0WzNdID0gaW5saW5rLT5oOworCisgICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIG1hY3JvIGludGVycG9sYXRlcyB0aGUgdmFsdWUgb2YgYm90aCBmaWVsZHMgYXQgYSBwb2ludCBoYWxmd2F5CisgKiBiZXR3ZWVuIGxpbmVzIGFuZCB0YWtlcyB0aGUgc3F1YXJlZCBkaWZmZXJlbmNlLiBJbiBmaWVsZCByZXNvbHV0aW9uCisgKiB0aGUgcG9pbnQgaXMgYSBxdWFydGVyIHBpeGVsIGJlbG93IGEgbGluZSBpbiBvbmUgZmllbGQgYW5kIGEgcXVhcnRlcgorICogcGl4ZWwgYWJvdmUgYSBsaW5lIGluIG90aGVyLgorICoKKyAqIChUaGUgcmVzdWx0IGlzIGFjdHVhbGx5IG11bHRpcGxpZWQgYnkgMjUpCisgKi8KKyNkZWZpbmUgRElGRihhLCBhcywgYiwgYnMpICh0ID0gKCgqYSAtIGJbYnNdKSA8PCAyKSArIGFbYXMgPDwgMV0gLSBiWy1ic10sIHQgKiB0KQorCisvKgorICogRmluZCB3aGljaCBmaWVsZCBjb21iaW5hdGlvbiBoYXMgdGhlIHNtYWxsZXN0IGF2ZXJhZ2Ugc3F1YXJlZCBkaWZmZXJlbmNlCisgKiBiZXR3ZWVuIHRoZSBmaWVsZHMuCisgKi8KK3N0YXRpYyBlbnVtIFBoYXNlTW9kZSBhbmFseXplX3BsYW5lKHZvaWQgKmN0eCwgZW51bSBQaGFzZU1vZGUgbW9kZSwgQVZGcmFtZSAqb2xkLCBBVkZyYW1lICpuZXcpCit7CisgICAgZG91YmxlIGJkaWZmLCB0ZGlmZiwgcGRpZmYsIHNjYWxlOworICAgIGNvbnN0IGludCBucyA9IG5ldy0+bGluZXNpemVbMF07CisgICAgY29uc3QgaW50IG9zID0gb2xkLT5saW5lc2l6ZVswXTsKKyAgICBjb25zdCB1aW50OF90ICpucHRyID0gbmV3LT5kYXRhWzBdOworICAgIGNvbnN0IHVpbnQ4X3QgKm9wdHIgPSBvbGQtPmRhdGFbMF07CisgICAgY29uc3QgaW50IGggPSBuZXctPmhlaWdodDsKKyAgICBjb25zdCBpbnQgdyA9IG5ldy0+d2lkdGg7CisgICAgaW50IGJkaWYsIHRkaWYsIHBkaWY7CisKKyAgICBpZiAobW9kZSA9PSBBVVRPKSB7CisgICAgICAgIG1vZGUgPSBuZXctPmludGVybGFjZWRfZnJhbWUgPyBuZXctPnRvcF9maWVsZF9maXJzdCA/CisgICAgICAgICAgICAgICBUT1BfRklSU1QgOiBCT1RUT01fRklSU1QgOiBQUk9HUkVTU0lWRTsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gQVVUT19BTkFMWVpFKSB7CisgICAgICAgIG1vZGUgPSBuZXctPmludGVybGFjZWRfZnJhbWUgPyBuZXctPnRvcF9maWVsZF9maXJzdCA/CisgICAgICAgICAgICAgICBUT1BfRklSU1RfQU5BTFlaRSA6IEJPVFRPTV9GSVJTVF9BTkFMWVpFIDogRlVMTF9BTkFMWVpFOworICAgIH0KKworICAgIGlmIChtb2RlIDw9IEJPVFRPTV9GSVJTVCkgeworICAgICAgICBiZGlmZiA9IHBkaWZmID0gdGRpZmYgPSA2NTUzNi4wOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCB0b3AgPSAwLCB0OworICAgICAgICBjb25zdCB1aW50OF90ICpyZW5kLCAqZW5kID0gbnB0ciArIChoIC0gMikgKiBuczsKKworICAgICAgICBiZGlmZiA9IHBkaWZmID0gdGRpZmYgPSAwLjA7CisKKyAgICAgICAgbnB0ciArPSBuczsKKyAgICAgICAgb3B0ciArPSBvczsKKyAgICAgICAgd2hpbGUgKG5wdHIgPCBlbmQpIHsKKyAgICAgICAgICAgIHBkaWYgPSB0ZGlmID0gYmRpZiA9IDA7CisKKyAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgY2FzZSBUT1BfRklSU1RfQU5BTFlaRToKKyAgICAgICAgICAgICAgICBpZiAodG9wKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAocmVuZCA9IG5wdHIgKyB3OyBucHRyIDwgcmVuZDsgbnB0cisrLCBvcHRyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBkaWYgKz0gRElGRihucHRyLCBucywgbnB0ciwgbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGRpZiArPSBESUZGKG5wdHIsIG5zLCBvcHRyLCBvcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHJlbmQgPSBucHRyICsgdzsgbnB0ciA8IHJlbmQ7IG5wdHIrKywgb3B0cisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwZGlmICs9IERJRkYobnB0ciwgbnMsIG5wdHIsIG5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRkaWYgKz0gRElGRihvcHRyLCBvcywgbnB0ciwgbnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCT1RUT01fRklSU1RfQU5BTFlaRToKKyAgICAgICAgICAgICAgICBpZiAodG9wKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAocmVuZCA9IG5wdHIgKyB3OyBucHRyIDwgcmVuZDsgbnB0cisrLCBvcHRyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBkaWYgKz0gRElGRihucHRyLCBucywgbnB0ciwgbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgYmRpZiArPSBESUZGKG9wdHIsIG9zLCBucHRyLCBucyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHJlbmQgPSBucHRyICsgdzsgbnB0ciA8IHJlbmQ7IG5wdHIrKywgb3B0cisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwZGlmICs9IERJRkYobnB0ciwgbnMsIG5wdHIsIG5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJkaWYgKz0gRElGRihucHRyLCBucywgb3B0ciwgb3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkFMWVpFOgorICAgICAgICAgICAgICAgIGlmICh0b3ApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChyZW5kID0gbnB0ciArIHc7IG5wdHIgPCByZW5kOyBucHRyKyssIG9wdHIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGRpZiArPSBESUZGKG5wdHIsIG5zLCBvcHRyLCBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGlmICs9IERJRkYob3B0ciwgb3MsIG5wdHIsIG5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAocmVuZCA9IG5wdHIgKyB3OyBucHRyIDwgcmVuZDsgbnB0cisrLCBvcHRyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJkaWYgKz0gRElGRihucHRyLCBucywgb3B0ciwgb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgdGRpZiArPSBESUZGKG9wdHIsIG9zLCBucHRyLCBucyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZVTExfQU5BTFlaRToKKyAgICAgICAgICAgICAgICBpZiAodG9wKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAocmVuZCA9IG5wdHIgKyB3OyBucHRyIDwgcmVuZDsgbnB0cisrLCBvcHRyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBkaWYgKz0gRElGRihucHRyLCBucywgbnB0ciwgbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGRpZiArPSBESUZGKG5wdHIsIG5zLCBvcHRyLCBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGlmICs9IERJRkYob3B0ciwgb3MsIG5wdHIsIG5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAocmVuZCA9IG5wdHIgKyB3OyBucHRyIDwgcmVuZDsgbnB0cisrLCBvcHRyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBkaWYgKz0gRElGRihucHRyLCBucywgbnB0ciwgbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgYmRpZiArPSBESUZGKG5wdHIsIG5zLCBvcHRyLCBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZGlmICs9IERJRkYob3B0ciwgb3MsIG5wdHIsIG5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGRpZmYgKz0gKGRvdWJsZSlwZGlmOworICAgICAgICAgICAgdGRpZmYgKz0gKGRvdWJsZSl0ZGlmOworICAgICAgICAgICAgYmRpZmYgKz0gKGRvdWJsZSliZGlmOworICAgICAgICAgICAgbnB0ciArPSBucyAtIHc7CisgICAgICAgICAgICBvcHRyICs9IG9zIC0gdzsKKyAgICAgICAgICAgIHRvcCBePSAxOworICAgICAgICB9CisKKyAgICAgICAgc2NhbGUgPSAxLjAgLyAodyAqIChoIC0gMykpIC8gMjUuMDsKKyAgICAgICAgcGRpZmYgKj0gc2NhbGU7CisgICAgICAgIHRkaWZmICo9IHNjYWxlOworICAgICAgICBiZGlmZiAqPSBzY2FsZTsKKworICAgICAgICBpZiAobW9kZSA9PSBUT1BfRklSU1RfQU5BTFlaRSkgeworICAgICAgICAgICAgYmRpZmYgPSA2NTUzNi4wOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gQk9UVE9NX0ZJUlNUX0FOQUxZWkUpIHsKKyAgICAgICAgICAgIHRkaWZmID0gNjU1MzYuMDsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IEFOQUxZWkUpIHsKKyAgICAgICAgICAgIHBkaWZmID0gNjU1MzYuMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiZGlmZiA8IHBkaWZmICYmIGJkaWZmIDwgdGRpZmYpIHsKKyAgICAgICAgICAgIG1vZGUgPSBCT1RUT01fRklSU1Q7CisgICAgICAgIH0gZWxzZSBpZiAodGRpZmYgPCBwZGlmZiAmJiB0ZGlmZiA8IGJkaWZmKSB7CisgICAgICAgICAgICBtb2RlID0gVE9QX0ZJUlNUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbW9kZSA9IFBST0dSRVNTSVZFOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAibW9kZT0lYyB0ZGlmZj0lZiBiZGlmZj0lZiBwZGlmZj0lZlxuIiwKKyAgICAgICAgICAgbW9kZSA9PSBCT1RUT01fRklSU1QgPyAnYicgOiBtb2RlID09IFRPUF9GSVJTVCA/ICd0JyA6ICdwJywKKyAgICAgICAgICAgdGRpZmYsIGJkaWZmLCBwZGlmZik7CisgICAgcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBQaGFzZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgZW51bSBQaGFzZU1vZGUgbW9kZTsKKyAgICBpbnQgcGxhbmUsIHRvcCwgeTsKKyAgICBBVkZyYW1lICpvdXQ7CisKKyAgICBpZiAoY3R4LT5pc19kaXNhYmxlZCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZSk7CisgICAgICAgIC8qIHdlIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIGZyYW1lIHNvIHRoZSBmaWx0ZXIgY2FuIHN0YXJ0CisgICAgICAgICAqIGJlaW5nIHVzZWZ1bCBhcyBzb29uIGFzIGl0J3Mgbm90IGRpc2FibGVkLCBhdm9pZGluZyB0aGUgMS1mcmFtZQorICAgICAgICAgKiBkZWxheS4gKi8KKyAgICAgICAgcy0+ZnJhbWUgPSBhdl9mcmFtZV9jbG9uZShpbik7CisgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgaW4pOworICAgIH0KKworICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworCisgICAgaWYgKCFzLT5mcmFtZSkgeworICAgICAgICBzLT5mcmFtZSA9IGluOworICAgICAgICBtb2RlID0gUFJPR1JFU1NJVkU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kZSA9IGFuYWx5emVfcGxhbmUoY3R4LCBzLT5tb2RlLCBzLT5mcmFtZSwgaW4pOworICAgIH0KKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPm5iX3BsYW5lczsgcGxhbmUrKykgeworICAgICAgICBjb25zdCB1aW50OF90ICpidWYgPSBzLT5mcmFtZS0+ZGF0YVtwbGFuZV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZyb20gPSBpbi0+ZGF0YVtwbGFuZV07CisgICAgICAgIHVpbnQ4X3QgKnRvID0gb3V0LT5kYXRhW3BsYW5lXTsKKworICAgICAgICBmb3IgKHkgPSAwLCB0b3AgPSAxOyB5IDwgcy0+cGxhbmVoZWlnaHRbcGxhbmVdOyB5KyssIHRvcCBePSAxKSB7CisgICAgICAgICAgICBtZW1jcHkodG8sIG1vZGUgPT0gKHRvcCA/IEJPVFRPTV9GSVJTVCA6IFRPUF9GSVJTVCkgPyBidWYgOiBmcm9tLCBzLT5saW5lc2l6ZVtwbGFuZV0pOworCisgICAgICAgICAgICBidWYgKz0gcy0+ZnJhbWUtPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgIGZyb20gKz0gaW4tPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgIHRvICs9IG91dC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluICE9IHMtPmZyYW1lKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZSk7CisgICAgcy0+ZnJhbWUgPSBpbjsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFBoYXNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHBoYXNlX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgcGhhc2Vfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3BoYXNlID0geworICAgIC5uYW1lICAgICAgICAgID0gInBoYXNlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQaGFzZSBzaGlmdCBmaWVsZHMuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoUGhhc2VDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZwaGFzZV9jbGFzcywKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBwaGFzZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBwaGFzZV9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0lOVEVSTkFMLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9waXhkZXNjdGVzdC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3BpeGRlc2N0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwZGQwZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9waXhkZXNjdGVzdC5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogcGl4ZGVzYyB0ZXN0IGZpbHRlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgUGl4ZGVzY1Rlc3RDb250ZXh0IHsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjOworICAgIHVpbnQxNl90ICpsaW5lOworfSBQaXhkZXNjVGVzdENvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFBpeGRlc2NUZXN0Q29udGV4dCAqcHJpdiA9IGN0eC0+cHJpdjsKKyAgICBhdl9mcmVlcCgmcHJpdi0+bGluZSk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIFBpeGRlc2NUZXN0Q29udGV4dCAqcHJpdiA9IGlubGluay0+ZHN0LT5wcml2OworCisgICAgcHJpdi0+cGl4X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKworICAgIGF2X2ZyZWVwKCZwcml2LT5saW5lKTsKKyAgICBpZiAoIShwcml2LT5saW5lID0gYXZfbWFsbG9jX2FycmF5KHNpemVvZigqcHJpdi0+bGluZSksIGlubGluay0+dykpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBQaXhkZXNjVGVzdENvbnRleHQgKnByaXYgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgICAgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IGksIGMsIHcgPSBpbmxpbmstPncsIGggPSBpbmxpbmstPmg7CisgICAgY29uc3QgaW50IGN3ID0gRkZfQ0VJTF9SU0hJRlQodywgcHJpdi0+cGl4X2Rlc2MtPmxvZzJfY2hyb21hX3cpOworICAgIGNvbnN0IGludCBjaCA9IEZGX0NFSUxfUlNISUZUKGgsIHByaXYtPnBpeF9kZXNjLT5sb2cyX2Nocm9tYV9oKTsKKworICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBoMSA9IGkgPT0gMSB8fCBpID09IDIgPyBjaCA6IGg7CisgICAgICAgIGlmIChvdXQtPmRhdGFbaV0pIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBvdXQtPmRhdGFbaV0gKworICAgICAgICAgICAgICAgIChvdXQtPmxpbmVzaXplW2ldID4gMCA/IDAgOiBvdXQtPmxpbmVzaXplW2ldICogKGgxLTEpKTsKKyAgICAgICAgICAgIG1lbXNldChkYXRhLCAwLCBGRkFCUyhvdXQtPmxpbmVzaXplW2ldKSAqIGgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvcHkgcGFsZXR0ZSAqLworICAgIGlmIChwcml2LT5waXhfZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8CisgICAgICAgIHByaXYtPnBpeF9kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwpCisgICAgICAgIG1lbWNweShvdXQtPmRhdGFbMV0sIGluLT5kYXRhWzFdLCBBVlBBTEVUVEVfU0laRSk7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgcHJpdi0+cGl4X2Rlc2MtPm5iX2NvbXBvbmVudHM7IGMrKykgeworICAgICAgICBjb25zdCBpbnQgdzEgPSBjID09IDEgfHwgYyA9PSAyID8gY3cgOiB3OworICAgICAgICBjb25zdCBpbnQgaDEgPSBjID09IDEgfHwgYyA9PSAyID8gY2ggOiBoOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoMTsgaSsrKSB7CisgICAgICAgICAgICBhdl9yZWFkX2ltYWdlX2xpbmUocHJpdi0+bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopaW4tPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPnBpeF9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGksIGMsIHcxLCAwKTsKKworICAgICAgICAgICAgYXZfd3JpdGVfaW1hZ2VfbGluZShwcml2LT5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPnBpeF9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBpLCBjLCB3MSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfcGl4ZGVzY3Rlc3RfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9waXhkZXNjdGVzdF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfcGl4ZGVzY3Rlc3QgPSB7CisgICAgLm5hbWUgICAgICAgID0gInBpeGRlc2N0ZXN0IiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVGVzdCBwaXhlbCBmb3JtYXQgZGVmaW5pdGlvbnMuIiksCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFBpeGRlc2NUZXN0Q29udGV4dCksCisgICAgLnVuaW5pdCAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICA9IGF2ZmlsdGVyX3ZmX3BpeGRlc2N0ZXN0X2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgPSBhdmZpbHRlcl92Zl9waXhkZXNjdGVzdF9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9wcC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3BwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzYWM0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9wcC5jCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEEncnBpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQ2zDqW1lbnQgQsWTc2NoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbGlicG9zdHByb2MgZmlsdGVyLCBwb3J0ZWQgZnJvbSBNUGxheWVyLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgImxpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBjaGFyICpzdWJmaWx0ZXJzOworICAgIGludCBtb2RlX2lkOworICAgIHBwX21vZGUgKm1vZGVzW1BQX1FVQUxJVFlfTUFYICsgMV07CisgICAgdm9pZCAqcHBfY3R4OworfSBQUEZpbHRlckNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFBQRmlsdGVyQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gcHBfb3B0aW9uc1tdID0geworICAgIHsgInN1YmZpbHRlcnMiLCAic2V0IHBvc3Rwcm9jZXNzIHN1YmZpbHRlcnMiLCBPRkZTRVQoc3ViZmlsdGVycyksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9ImRlIn0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhwcCk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBwcF9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBpOworICAgIFBQRmlsdGVyQ29udGV4dCAqcHAgPSBjdHgtPnByaXY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IFBQX1FVQUxJVFlfTUFYOyBpKyspIHsKKyAgICAgICAgcHAtPm1vZGVzW2ldID0gcHBfZ2V0X21vZGVfYnlfbmFtZV9hbmRfcXVhbGl0eShwcC0+c3ViZmlsdGVycywgaSk7CisgICAgICAgIGlmICghcHAtPm1vZGVzW2ldKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorICAgIHBwLT5tb2RlX2lkID0gUFBfUVVBTElUWV9NQVg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHBfcHJvY2Vzc19jb21tYW5kKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZXMsIGludCByZXNfbGVuLCBpbnQgZmxhZ3MpCit7CisgICAgUFBGaWx0ZXJDb250ZXh0ICpwcCA9IGN0eC0+cHJpdjsKKworICAgIGlmICghc3RyY21wKGNtZCwgInF1YWxpdHkiKSkgeworICAgICAgICBwcC0+bW9kZV9pZCA9IGF2X2NsaXAoc3RydG9sKGFyZ3MsIE5VTEwsIDEwKSwgMCwgUFBfUVVBTElUWV9NQVgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKworc3RhdGljIGludCBwcF9xdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIFBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBwX2NvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBpbnQgZmxhZ3MgPSBQUF9DUFVfQ0FQU19BVVRPOworICAgIFBQRmlsdGVyQ29udGV4dCAqcHAgPSBpbmxpbmstPmRzdC0+cHJpdjsKKworICAgIHN3aXRjaCAoaW5saW5rLT5mb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOiBmbGFncyB8PSBQUF9GT1JNQVRfNDIwOyBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQyMlA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6IGZsYWdzIHw9IFBQX0ZPUk1BVF80MjI7IGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MTFQOiBmbGFncyB8PSBQUF9GT1JNQVRfNDExOyBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQ0NFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6IGZsYWdzIHw9IFBQX0ZPUk1BVF80NDQ7IGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDQwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDogZmxhZ3MgfD0gUFBfRk9STUFUXzQ0MDsgYnJlYWs7CisgICAgZGVmYXVsdDogYXZfYXNzZXJ0MCgwKTsKKyAgICB9CisKKyAgICBwcC0+cHBfY3R4ID0gcHBfZ2V0X2NvbnRleHQoaW5saW5rLT53LCBpbmxpbmstPmgsIGZsYWdzKTsKKyAgICBpZiAoIXBwLT5wcF9jdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHBfZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbmJ1ZikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFBQRmlsdGVyQ29udGV4dCAqcHAgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIGNvbnN0IGludCBhbGlnbmVkX3cgPSBGRkFMSUdOKG91dGxpbmstPncsIDgpOworICAgIGNvbnN0IGludCBhbGlnbmVkX2ggPSBGRkFMSUdOKG91dGxpbmstPmgsIDgpOworICAgIEFWRnJhbWUgKm91dGJ1ZjsKKyAgICBpbnQgcXN0cmlkZSwgcXBfdHlwZTsKKyAgICBpbnQ4X3QgKnFwX3RhYmxlIDsKKworICAgIG91dGJ1ZiA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgYWxpZ25lZF93LCBhbGlnbmVkX2gpOworICAgIGlmICghb3V0YnVmKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluYnVmKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXRidWYsIGluYnVmKTsKKyAgICBvdXRidWYtPndpZHRoICA9IGluYnVmLT53aWR0aDsKKyAgICBvdXRidWYtPmhlaWdodCA9IGluYnVmLT5oZWlnaHQ7CisgICAgcXBfdGFibGUgPSBhdl9mcmFtZV9nZXRfcXBfdGFibGUoaW5idWYsICZxc3RyaWRlLCAmcXBfdHlwZSk7CisKKyAgICBwcF9wb3N0cHJvY2VzcygoY29uc3QgdWludDhfdCAqKilpbmJ1Zi0+ZGF0YSwgaW5idWYtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgIG91dGJ1Zi0+ZGF0YSwgICAgICAgICAgICAgICAgIG91dGJ1Zi0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgYWxpZ25lZF93LCBvdXRsaW5rLT5oLAorICAgICAgICAgICAgICAgICAgIHFwX3RhYmxlLAorICAgICAgICAgICAgICAgICAgIHFzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgcHAtPm1vZGVzW3BwLT5tb2RlX2lkXSwKKyAgICAgICAgICAgICAgICAgICBwcC0+cHBfY3R4LAorICAgICAgICAgICAgICAgICAgIG91dGJ1Zi0+cGljdF90eXBlIHwgKHFwX3R5cGUgPyBQUF9QSUNUX1RZUEVfUVAyIDogMCkpOworCisgICAgYXZfZnJhbWVfZnJlZSgmaW5idWYpOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0YnVmKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBwcF91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGk7CisgICAgUFBGaWx0ZXJDb250ZXh0ICpwcCA9IGN0eC0+cHJpdjsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gUFBfUVVBTElUWV9NQVg7IGkrKykKKyAgICAgICAgcHBfZnJlZV9tb2RlKHBwLT5tb2Rlc1tpXSk7CisgICAgaWYgKHBwLT5wcF9jdHgpCisgICAgICAgIHBwX2ZyZWVfY29udGV4dChwcC0+cHBfY3R4KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHBwX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IHBwX2NvbmZpZ19wcm9wcywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IHBwX2ZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgcHBfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3BwID0geworICAgIC5uYW1lICAgICAgICAgICAgPSAicHAiLAorICAgIC5kZXNjcmlwdGlvbiAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmlsdGVyIHZpZGVvIHVzaW5nIGxpYnBvc3Rwcm9jLiIpLAorICAgIC5wcml2X3NpemUgICAgICAgPSBzaXplb2YoUFBGaWx0ZXJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgID0gcHBfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgID0gcHBfdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzICAgPSBwcF9xdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgICAgPSBwcF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgICA9IHBwX291dHB1dHMsCisgICAgLnByb2Nlc3NfY29tbWFuZCA9IHBwX3Byb2Nlc3NfY29tbWFuZCwKKyAgICAucHJpdl9jbGFzcyAgICAgID0gJnBwX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfcHNuci5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3BzbnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODI2MTJhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3BzbnIuYwpAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBSb2dlciBQYXUgTW9ubukgPHJvZ2VyLnBhdUBlbnRlbC51cGMuZWR1PgorICogQ29weXJpZ2h0IChjKSAyMDExIFN0ZWZhbm8gU2FiYXRpbmkKKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ2FjdWxhdGUgdGhlIFBTTlIgYmV0d2VlbiB0d28gaW5wdXQgdmlkZW9zLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImR1YWxpbnB1dC5oIgorI2luY2x1ZGUgImRyYXd1dGlscy5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IFBTTlJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBGRkR1YWxJbnB1dENvbnRleHQgZGlucHV0OworICAgIGRvdWJsZSBtc2UsIG1pbl9tc2UsIG1heF9tc2U7CisgICAgdWludDY0X3QgbmJfZnJhbWVzOworICAgIEZJTEUgKnN0YXRzX2ZpbGU7CisgICAgY2hhciAqc3RhdHNfZmlsZV9zdHI7CisgICAgaW50IG1heFs0XSwgYXZlcmFnZV9tYXg7CisgICAgaW50IGlzX3JnYjsKKyAgICB1aW50OF90IHJnYmFfbWFwWzRdOworICAgIGNoYXIgY29tcHNbNF07CisgICAgaW50IG5iX2NvbXBvbmVudHM7CisgICAgaW50IHBsYW5ld2lkdGhbNF07CisgICAgaW50IHBsYW5laGVpZ2h0WzRdOworCisgICAgdm9pZCAoKmNvbXB1dGVfbXNlKShzdHJ1Y3QgUFNOUkNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptWzRdLCBjb25zdCBpbnQgbWxbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyWzRdLCBjb25zdCBpbnQgcmxbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGRvdWJsZSBtc2VbNF0pOworfSBQU05SQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUFNOUkNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gcHNucl9vcHRpb25zW10gPSB7CisgICAgeyJzdGF0c19maWxlIiwgIlNldCBmaWxlIHdoZXJlIHRvIHN0b3JlIHBlci1mcmFtZSBkaWZmZXJlbmNlIGluZm9ybWF0aW9uIiwgT0ZGU0VUKHN0YXRzX2ZpbGVfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ImYiLCAgICAgICAgICAiU2V0IGZpbGUgd2hlcmUgdG8gc3RvcmUgcGVyLWZyYW1lIGRpZmZlcmVuY2UgaW5mb3JtYXRpb24iLCBPRkZTRVQoc3RhdHNfZmlsZV9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MocHNucik7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgcG93Mih1bnNpZ25lZCBiYXNlKQoreworICAgIHJldHVybiBiYXNlKmJhc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIGdldF9wc25yKGRvdWJsZSBtc2UsIHVpbnQ2NF90IG5iX2ZyYW1lcywgaW50IG1heCkKK3sKKyAgICByZXR1cm4gMTAuMCAqIGxvZyhwb3cyKG1heCkgLyAobXNlIC8gbmJfZnJhbWVzKSkgLyBsb2coMTAuMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgY29tcHV0ZV9pbWFnZXNfbXNlKFBTTlJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFpbl9kYXRhWzRdLCBjb25zdCBpbnQgbWFpbl9saW5lc2l6ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWZfZGF0YVs0XSwgY29uc3QgaW50IHJlZl9saW5lc2l6ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGRvdWJsZSBtc2VbNF0pCit7CisgICAgaW50IGksIGMsIGo7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmJfY29tcG9uZW50czsgYysrKSB7CisgICAgICAgIGNvbnN0IGludCBvdXR3ID0gcy0+cGxhbmV3aWR0aFtjXTsKKyAgICAgICAgY29uc3QgaW50IG91dGggPSBzLT5wbGFuZWhlaWdodFtjXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqbWFpbl9saW5lID0gbWFpbl9kYXRhW2NdOworICAgICAgICBjb25zdCB1aW50OF90ICpyZWZfbGluZSA9IHJlZl9kYXRhW2NdOworICAgICAgICBjb25zdCBpbnQgcmVmX2xpbmVzaXplID0gcmVmX2xpbmVzaXplc1tjXTsKKyAgICAgICAgY29uc3QgaW50IG1haW5fbGluZXNpemUgPSBtYWluX2xpbmVzaXplc1tjXTsKKyAgICAgICAgdWludDY0X3QgbSA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dGg7IGkrKykgeworICAgICAgICAgICAgaW50IG0yID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXR3OyBqKyspCisgICAgICAgICAgICAgICAgbTIgKz0gcG93MihtYWluX2xpbmVbal0gLSByZWZfbGluZVtqXSk7CisgICAgICAgICAgICBtICs9IG0yOworICAgICAgICAgICAgcmVmX2xpbmUgKz0gcmVmX2xpbmVzaXplOworICAgICAgICAgICAgbWFpbl9saW5lICs9IG1haW5fbGluZXNpemU7CisgICAgICAgIH0KKyAgICAgICAgbXNlW2NdID0gbSAvIChkb3VibGUpKG91dHcgKiBvdXRoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgY29tcHV0ZV9pbWFnZXNfbXNlXzE2Yml0KFBTTlJDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFpbl9kYXRhWzRdLCBjb25zdCBpbnQgbWFpbl9saW5lc2l6ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWZfZGF0YVs0XSwgY29uc3QgaW50IHJlZl9saW5lc2l6ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGRvdWJsZSBtc2VbNF0pCit7CisgICAgaW50IGksIGMsIGo7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmJfY29tcG9uZW50czsgYysrKSB7CisgICAgICAgIGNvbnN0IGludCBvdXR3ID0gcy0+cGxhbmV3aWR0aFtjXTsKKyAgICAgICAgY29uc3QgaW50IG91dGggPSBzLT5wbGFuZWhlaWdodFtjXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKm1haW5fbGluZSA9ICh1aW50MTZfdCAqKW1haW5fZGF0YVtjXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnJlZl9saW5lID0gKHVpbnQxNl90ICopcmVmX2RhdGFbY107CisgICAgICAgIGNvbnN0IGludCByZWZfbGluZXNpemUgPSByZWZfbGluZXNpemVzW2NdIC8gMjsKKyAgICAgICAgY29uc3QgaW50IG1haW5fbGluZXNpemUgPSBtYWluX2xpbmVzaXplc1tjXSAvIDI7CisgICAgICAgIHVpbnQ2NF90IG0gPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRoOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXR3OyBqKyspCisgICAgICAgICAgICAgICAgbSArPSBwb3cyKG1haW5fbGluZVtqXSAtIHJlZl9saW5lW2pdKTsKKyAgICAgICAgICAgIHJlZl9saW5lICs9IHJlZl9saW5lc2l6ZTsKKyAgICAgICAgICAgIG1haW5fbGluZSArPSBtYWluX2xpbmVzaXplOworICAgICAgICB9CisgICAgICAgIG1zZVtjXSA9IG0gLyAoZG91YmxlKShvdXR3ICogb3V0aCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfbWV0YShBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSwgY29uc3QgY2hhciAqa2V5LCBjaGFyIGNvbXAsIGZsb2F0IGQpCit7CisgICAgY2hhciB2YWx1ZVsxMjhdOworICAgIHNucHJpbnRmKHZhbHVlLCBzaXplb2YodmFsdWUpLCAiJTAuMmYiLCBkKTsKKyAgICBpZiAoY29tcCkgeworICAgICAgICBjaGFyIGtleTJbMTI4XTsKKyAgICAgICAgc25wcmludGYoa2V5Miwgc2l6ZW9mKGtleTIpLCAiJXMlYyIsIGtleSwgY29tcCk7CisgICAgICAgIGF2X2RpY3Rfc2V0KG1ldGFkYXRhLCBrZXkyLCB2YWx1ZSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsIGtleSwgdmFsdWUsIDApOworICAgIH0KK30KKworc3RhdGljIEFWRnJhbWUgKmRvX3BzbnIoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKm1haW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpyZWYpCit7CisgICAgUFNOUkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgZG91YmxlIGNvbXBfbXNlWzRdLCBtc2UgPSAwOworICAgIGludCBqLCBjOworICAgIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhID0gYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAobWFpbik7CisKKyAgICBzLT5jb21wdXRlX21zZShzLCAoY29uc3QgdWludDhfdCAqKiltYWluLT5kYXRhLCBtYWluLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKilyZWYtPmRhdGEsIHJlZi0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIG1haW4tPndpZHRoLCBtYWluLT5oZWlnaHQsIGNvbXBfbXNlKTsKKworICAgIGZvciAoaiA9IDA7IGogPCBzLT5uYl9jb21wb25lbnRzOyBqKyspCisgICAgICAgIG1zZSArPSBjb21wX21zZVtqXTsKKyAgICBtc2UgLz0gcy0+bmJfY29tcG9uZW50czsKKworICAgIHMtPm1pbl9tc2UgPSBGRk1JTihzLT5taW5fbXNlLCBtc2UpOworICAgIHMtPm1heF9tc2UgPSBGRk1BWChzLT5tYXhfbXNlLCBtc2UpOworCisgICAgcy0+bXNlICs9IG1zZTsKKyAgICBzLT5uYl9mcmFtZXMrKzsKKworICAgIGZvciAoaiA9IDA7IGogPCBzLT5uYl9jb21wb25lbnRzOyBqKyspIHsKKyAgICAgICAgYyA9IHMtPmlzX3JnYiA/IHMtPnJnYmFfbWFwW2pdIDogajsKKyAgICAgICAgc2V0X21ldGEobWV0YWRhdGEsICJsYXZmaS5wc25yLm1zZS4iLCBzLT5jb21wc1tqXSwgY29tcF9tc2VbY10pOworICAgICAgICBzZXRfbWV0YShtZXRhZGF0YSwgImxhdmZpLnBzbnIubXNlX2F2ZyIsIDAsIG1zZSk7CisgICAgICAgIHNldF9tZXRhKG1ldGFkYXRhLCAibGF2ZmkucHNuci5wc25yLiIsIHMtPmNvbXBzW2pdLCBnZXRfcHNucihjb21wX21zZVtjXSwgMSwgcy0+bWF4W2NdKSk7CisgICAgICAgIHNldF9tZXRhKG1ldGFkYXRhLCAibGF2ZmkucHNuci5wc25yX2F2ZyIsIDAsIGdldF9wc25yKG1zZSwgMSwgcy0+YXZlcmFnZV9tYXgpKTsKKyAgICB9CisKKyAgICBpZiAocy0+c3RhdHNfZmlsZSkgeworICAgICAgICBmcHJpbnRmKHMtPnN0YXRzX2ZpbGUsICJuOiUiUFJJZDY0IiBtc2VfYXZnOiUwLjJmICIsIHMtPm5iX2ZyYW1lcywgbXNlKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPm5iX2NvbXBvbmVudHM7IGorKykgeworICAgICAgICAgICAgYyA9IHMtPmlzX3JnYiA/IHMtPnJnYmFfbWFwW2pdIDogajsKKyAgICAgICAgICAgIGZwcmludGYocy0+c3RhdHNfZmlsZSwgIm1zZV8lYzolMC4yZiAiLCBzLT5jb21wc1tqXSwgY29tcF9tc2VbY10pOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5uYl9jb21wb25lbnRzOyBqKyspIHsKKyAgICAgICAgICAgIGMgPSBzLT5pc19yZ2IgPyBzLT5yZ2JhX21hcFtqXSA6IGo7CisgICAgICAgICAgICBmcHJpbnRmKHMtPnN0YXRzX2ZpbGUsICJwc25yXyVjOiUwLjJmICIsIHMtPmNvbXBzW2pdLAorICAgICAgICAgICAgICAgICAgICBnZXRfcHNucihjb21wX21zZVtjXSwgMSwgcy0+bWF4W2NdKSk7CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAiXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWFpbjsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUFNOUkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzLT5taW5fbXNlID0gK0lORklOSVRZOworICAgIHMtPm1heF9tc2UgPSAtSU5GSU5JVFk7CisKKyAgICBpZiAocy0+c3RhdHNfZmlsZV9zdHIpIHsKKyAgICAgICAgcy0+c3RhdHNfZmlsZSA9IGZvcGVuKHMtPnN0YXRzX2ZpbGVfc3RyLCAidyIpOworICAgICAgICBpZiAoIXMtPnN0YXRzX2ZpbGUpIHsKKyAgICAgICAgICAgIGludCBlcnIgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICAgICAgICBhdl9zdHJlcnJvcihlcnIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gc3RhdHMgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+c3RhdHNfZmlsZV9zdHIsIGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+ZGlucHV0LnByb2Nlc3MgPSBkb19wc25yOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZMTYsCisjZGVmaW5lIFBGX05PQUxQSEEoc3VmKSBBVl9QSVhfRk1UX1lVVjQyMCMjc3VmLCAgQVZfUElYX0ZNVF9ZVVY0MjIjI3N1ZiwgIEFWX1BJWF9GTVRfWVVWNDQ0IyNzdWYKKyNkZWZpbmUgUEZfQUxQSEEoc3VmKSAgIEFWX1BJWF9GTVRfWVVWQTQyMCMjc3VmLCBBVl9QSVhfRk1UX1lVVkE0MjIjI3N1ZiwgQVZfUElYX0ZNVF9ZVVZBNDQ0IyNzdWYKKyNkZWZpbmUgUEYoc3VmKSAgICAgICAgIFBGX05PQUxQSEEoc3VmKSwgUEZfQUxQSEEoc3VmKQorICAgICAgICBQRihQKSwgUEYoUDkpLCBQRihQMTApLCBQRl9OT0FMUEhBKFAxMiksIFBGX05PQUxQSEEoUDE0KSwgUEYoUDE2KSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLCBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDExUCwgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQwUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LCBBVl9QSVhfRk1UX0dCUlAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HQlJBUDE2LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dF9yZWYoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggID0gaW5saW5rLT5kc3Q7CisgICAgUFNOUkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGo7CisKKyAgICBzLT5uYl9jb21wb25lbnRzID0gZGVzYy0+bmJfY29tcG9uZW50czsKKyAgICBpZiAoY3R4LT5pbnB1dHNbMF0tPncgIT0gY3R4LT5pbnB1dHNbMV0tPncgfHwKKyAgICAgICAgY3R4LT5pbnB1dHNbMF0tPmggIT0gY3R4LT5pbnB1dHNbMV0tPmgpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiV2lkdGggYW5kIGhlaWdodCBvZiBpbnB1dCB2aWRlb3MgbXVzdCBiZSBzYW1lLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmIChjdHgtPmlucHV0c1swXS0+Zm9ybWF0ICE9IGN0eC0+aW5wdXRzWzFdLT5mb3JtYXQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW5wdXRzIG11c3QgYmUgb2Ygc2FtZSBwaXhlbCBmb3JtYXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE0OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDE2OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDExUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQyMFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0MjJQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDQwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQ0NFA6CisgICAgICAgIHMtPm1heFswXSA9ICgxIDw8IChkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSArIDEpKSAtIDE7CisgICAgICAgIHMtPm1heFsxXSA9ICgxIDw8IChkZXNjLT5jb21wWzFdLmRlcHRoX21pbnVzMSArIDEpKSAtIDE7CisgICAgICAgIHMtPm1heFsyXSA9ICgxIDw8IChkZXNjLT5jb21wWzJdLmRlcHRoX21pbnVzMSArIDEpKSAtIDE7CisgICAgICAgIHMtPm1heFszXSA9ICgxIDw8IChkZXNjLT5jb21wWzNdLmRlcHRoX21pbnVzMSArIDEpKSAtIDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHMtPm1heFswXSA9IDIzNSAqICgxIDw8IChkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSAtIDcpKTsKKyAgICAgICAgcy0+bWF4WzFdID0gMjQwICogKDEgPDwgKGRlc2MtPmNvbXBbMV0uZGVwdGhfbWludXMxIC0gNykpOworICAgICAgICBzLT5tYXhbMl0gPSAyNDAgKiAoMSA8PCAoZGVzYy0+Y29tcFsyXS5kZXB0aF9taW51czEgLSA3KSk7CisgICAgICAgIHMtPm1heFszXSA9ICgxIDw8IChkZXNjLT5jb21wWzNdLmRlcHRoX21pbnVzMSArIDEpKSAtIDE7CisgICAgfQorCisgICAgcy0+aXNfcmdiID0gZmZfZmlsbF9yZ2JhX21hcChzLT5yZ2JhX21hcCwgaW5saW5rLT5mb3JtYXQpID49IDA7CisgICAgcy0+Y29tcHNbMF0gPSBzLT5pc19yZ2IgPyAncicgOiAneScgOworICAgIHMtPmNvbXBzWzFdID0gcy0+aXNfcmdiID8gJ2cnIDogJ3UnIDsKKyAgICBzLT5jb21wc1syXSA9IHMtPmlzX3JnYiA/ICdiJyA6ICd2JyA7CisgICAgcy0+Y29tcHNbM10gPSAnYSc7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgcy0+bmJfY29tcG9uZW50czsgaisrKQorICAgICAgICBzLT5hdmVyYWdlX21heCArPSBzLT5tYXhbal07CisgICAgcy0+YXZlcmFnZV9tYXggLz0gcy0+bmJfY29tcG9uZW50czsKKworICAgIHMtPnBsYW5laGVpZ2h0WzFdID0gcy0+cGxhbmVoZWlnaHRbMl0gPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgIHMtPnBsYW5laGVpZ2h0WzBdID0gcy0+cGxhbmVoZWlnaHRbM10gPSBpbmxpbmstPmg7CisgICAgcy0+cGxhbmV3aWR0aFsxXSAgPSBzLT5wbGFuZXdpZHRoWzJdICA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+dywgZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgcy0+cGxhbmV3aWR0aFswXSAgPSBzLT5wbGFuZXdpZHRoWzNdICA9IGlubGluay0+dzsKKworICAgIHMtPmNvbXB1dGVfbXNlID0gZGVzYy0+Y29tcFswXS5kZXB0aF9taW51czEgPiA3ID8gY29tcHV0ZV9pbWFnZXNfbXNlXzE2Yml0IDogY29tcHV0ZV9pbWFnZXNfbXNlOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgUFNOUkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICptYWlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIGludCByZXQ7CisKKyAgICBvdXRsaW5rLT53ID0gbWFpbmxpbmstPnc7CisgICAgb3V0bGluay0+aCA9IG1haW5saW5rLT5oOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IG1haW5saW5rLT50aW1lX2Jhc2U7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IG1haW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBtYWlubGluay0+ZnJhbWVfcmF0ZTsKKyAgICBpZiAoKHJldCA9IGZmX2R1YWxpbnB1dF9pbml0KGN0eCwgJnMtPmRpbnB1dCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5waWNyZWYpCit7CisgICAgUFNOUkNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICByZXR1cm4gZmZfZHVhbGlucHV0X2ZpbHRlcl9mcmFtZSgmcy0+ZGlucHV0LCBpbmxpbmssIGlucGljcmVmKTsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBQU05SQ29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKKyAgICByZXR1cm4gZmZfZHVhbGlucHV0X3JlcXVlc3RfZnJhbWUoJnMtPmRpbnB1dCwgb3V0bGluayk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFBTTlJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKHMtPm5iX2ZyYW1lcyA+IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJQU05SIGF2ZXJhZ2U6JTAuMmYgbWluOiUwLjJmIG1heDolMC4yZlxuIiwKKyAgICAgICAgICAgICAgIGdldF9wc25yKHMtPm1zZSwgcy0+bmJfZnJhbWVzLCBzLT5hdmVyYWdlX21heCksCisgICAgICAgICAgICAgICBnZXRfcHNucihzLT5tYXhfbXNlLCAxLCBzLT5hdmVyYWdlX21heCksCisgICAgICAgICAgICAgICBnZXRfcHNucihzLT5taW5fbXNlLCAxLCBzLT5hdmVyYWdlX21heCkpOworICAgIH0KKworICAgIGZmX2R1YWxpbnB1dF91bmluaXQoJnMtPmRpbnB1dCk7CisKKyAgICBpZiAocy0+c3RhdHNfZmlsZSkKKyAgICAgICAgZmNsb3NlKHMtPnN0YXRzX2ZpbGUpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgcHNucl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAibWFpbiIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSx7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAicmVmZXJlbmNlIiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dF9yZWYsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHBzbnJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9wc25yID0geworICAgIC5uYW1lICAgICAgICAgID0gInBzbnIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNhbGN1bGF0ZSB0aGUgUFNOUiBiZXR3ZWVuIHR3byB2aWRlbyBzdHJlYW1zLiIpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoUFNOUkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnBzbnJfY2xhc3MsCisgICAgLmlucHV0cyAgICAgICAgPSBwc25yX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHBzbnJfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfcHVsbHVwLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfcHVsbHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4ZDBiYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9wdWxsdXAuYwpAQCAtMCwwICsxLDc4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBSaWNoIEZlbGtlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJ2Zl9wdWxsdXAuaCIKKworI2RlZmluZSBGX0hBVkVfQlJFQUtTICAgMQorI2RlZmluZSBGX0hBVkVfQUZGSU5JVFkgMgorCisjZGVmaW5lIEJSRUFLX0xFRlQgIDEKKyNkZWZpbmUgQlJFQUtfUklHSFQgMgorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihQdWxsdXBDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHB1bGx1cF9vcHRpb25zW10gPSB7CisgICAgeyAiamwiLCAic2V0IGxlZnQganVuayBzaXplIiwgIE9GRlNFVChqdW5rX2xlZnQpLCAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xfSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJqciIsICJzZXQgcmlnaHQganVuayBzaXplIiwgT0ZGU0VUKGp1bmtfcmlnaHQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTF9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgImp0IiwgInNldCB0b3AganVuayBzaXplIiwgICBPRkZTRVQoanVua190b3ApLCAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9NH0sIDEsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAiamIiLCAic2V0IGJvdHRvbSBqdW5rIHNpemUiLCBPRkZTRVQoanVua19ib3R0b20pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTR9LCAxLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInNiIiwgInNldCBzdHJpY3QgYnJlYWtzIiwgT0ZGU0VUKHN0cmljdF9icmVha3MpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LC0xLCAxLCBGTEFHUyB9LAorICAgIHsgIm1wIiwgInNldCBtZXRyaWMgcGxhbmUiLCAgT0ZGU0VUKG1ldHJpY19wbGFuZSksICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAyLCBGTEFHUywgIm1wIiB9LAorICAgIHsgInkiLCAibHVtYSIsICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sIDAsIDAsIEZMQUdTLCAibXAiIH0sCisgICAgeyAidSIsICJjaHJvbWEgYmx1ZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgRkxBR1MsICJtcCIgfSwKKyAgICB7ICJ2IiwgImNocm9tYSByZWQiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTJ9LCAwLCAwLCBGTEFHUywgIm1wIiB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MocHVsbHVwKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgQVZfUElYX0ZNVF9ZVVZKNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCAgQVZfUElYX0ZNVF9ZVVY0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAsICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDExUCwgIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDExUCwgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQUJTKGEpICgoKGEpIF4gKChhKSA+PiAzMSkpIC0gKChhKSA+PiAzMSkpCisKK3N0YXRpYyBpbnQgZGlmZl9jKGNvbnN0IHVpbnQ4X3QgKmEsIGNvbnN0IHVpbnQ4X3QgKmIsIHB0cmRpZmZfdCBzKQoreworICAgIGludCBpLCBqLCBkaWZmID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgIGRpZmYgKz0gQUJTKGFbal0gLSBiW2pdKTsKKyAgICAgICAgYSArPSBzOworICAgICAgICBiICs9IHM7CisgICAgfQorCisgICAgcmV0dXJuIGRpZmY7Cit9CisKK3N0YXRpYyBpbnQgY29tYl9jKGNvbnN0IHVpbnQ4X3QgKmEsIGNvbnN0IHVpbnQ4X3QgKmIsIHB0cmRpZmZfdCBzKQoreworICAgIGludCBpLCBqLCBjb21iID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgIGNvbWIgKz0gQUJTKChhW2pdIDw8IDEpIC0gYltqIC0gc10gLSBiW2ogICAgXSkgKworICAgICAgICAgICAgICAgICAgICBBQlMoKGJbal0gPDwgMSkgLSBhW2ogICAgXSAtIGFbaiArIHNdKTsKKyAgICAgICAgYSArPSBzOworICAgICAgICBiICs9IHM7CisgICAgfQorCisgICAgcmV0dXJuIGNvbWI7Cit9CisKK3N0YXRpYyBpbnQgdmFyX2MoY29uc3QgdWludDhfdCAqYSwgY29uc3QgdWludDhfdCAqYiwgcHRyZGlmZl90IHMpCit7CisgICAgaW50IGksIGosIHZhciA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICB2YXIgKz0gQUJTKGFbal0gLSBhW2ogKyBzXSk7CisgICAgICAgIGEgKz0gczsKKyAgICB9CisKKyAgICByZXR1cm4gNCAqIHZhcjsgLyogbWF0Y2ggY29tYiBzY2FsaW5nICovCit9CisKK3N0YXRpYyBpbnQgYWxsb2NfbWV0cmljcyhQdWxsdXBDb250ZXh0ICpzLCBQdWxsdXBGaWVsZCAqZikKK3sKKyAgICBmLT5kaWZmcyA9IGF2X2NhbGxvYyhGRkFMSUdOKHMtPm1ldHJpY19sZW5ndGgsIDE2KSwgc2l6ZW9mKCpmLT5kaWZmcykpOworICAgIGYtPmNvbWJzID0gYXZfY2FsbG9jKEZGQUxJR04ocy0+bWV0cmljX2xlbmd0aCwgMTYpLCBzaXplb2YoKmYtPmNvbWJzKSk7CisgICAgZi0+dmFycyAgPSBhdl9jYWxsb2MoRkZBTElHTihzLT5tZXRyaWNfbGVuZ3RoLCAxNiksIHNpemVvZigqZi0+dmFycykpOworCisgICAgaWYgKCFmLT5kaWZmcyB8fCAhZi0+Y29tYnMgfHwgIWYtPnZhcnMpIHsKKyAgICAgICAgYXZfZnJlZXAoJmYtPmRpZmZzKTsKKyAgICAgICAgYXZfZnJlZXAoJmYtPmNvbWJzKTsKKyAgICAgICAgYXZfZnJlZXAoJmYtPnZhcnMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9maWVsZF9xdWV1ZShQdWxsdXBGaWVsZCAqaGVhZCkKK3sKKyAgICBQdWxsdXBGaWVsZCAqZiA9IGhlYWQ7CisgICAgZG8geworICAgICAgICBQdWxsdXBGaWVsZCAqbmV4dDsKKyAgICAgICAgaWYgKCFmKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGF2X2ZyZWUoZi0+ZGlmZnMpOworICAgICAgICBhdl9mcmVlKGYtPmNvbWJzKTsKKyAgICAgICAgYXZfZnJlZShmLT52YXJzKTsKKyAgICAgICAgbmV4dCA9IGYtPm5leHQ7CisgICAgICAgIG1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsgLy8gY2xlYXIgYWxsIHBvaW50ZXJzIHRvIGF2b2lkIHN0YWxlIG9uZXMKKyAgICAgICAgYXZfZnJlZShmKTsKKyAgICAgICAgZiA9IG5leHQ7CisgICAgfSB3aGlsZSAoZiAhPSBoZWFkKTsKK30KKworc3RhdGljIFB1bGx1cEZpZWxkICptYWtlX2ZpZWxkX3F1ZXVlKFB1bGx1cENvbnRleHQgKnMsIGludCBsZW4pCit7CisgICAgUHVsbHVwRmllbGQgKmhlYWQsICpmOworCisgICAgZiA9IGhlYWQgPSBhdl9tYWxsb2N6KHNpemVvZigqaGVhZCkpOworICAgIGlmICghZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoYWxsb2NfbWV0cmljcyhzLCBmKSA8IDApIHsKKyAgICAgICAgYXZfZnJlZShmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yICg7IGxlbiA+IDA7IGxlbi0tKSB7CisgICAgICAgIGYtPm5leHQgPSBhdl9tYWxsb2N6KHNpemVvZigqZi0+bmV4dCkpOworICAgICAgICBpZiAoIWYtPm5leHQpIHsKKyAgICAgICAgICAgIGZyZWVfZmllbGRfcXVldWUoaGVhZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGYtPm5leHQtPnByZXYgPSBmOworICAgICAgICBmID0gZi0+bmV4dDsKKyAgICAgICAgaWYgKGFsbG9jX21ldHJpY3MocywgZikgPCAwKSB7CisgICAgICAgICAgICBmcmVlX2ZpZWxkX3F1ZXVlKGhlYWQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmLT5uZXh0ID0gaGVhZDsKKyAgICBoZWFkLT5wcmV2ID0gZjsKKworICAgIHJldHVybiBoZWFkOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFB1bGx1cENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IG1wID0gcy0+bWV0cmljX3BsYW5lOworCisgICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgaWYgKG1wICsgMSA+IHMtPm5iX3BsYW5lcykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dCBmb3JtYXQgZG9lcyBub3QgaGF2ZSBzdWNoIHBsYW5lXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzLT5wbGFuZWhlaWdodFsxXSA9IHMtPnBsYW5laGVpZ2h0WzJdID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBzLT5wbGFuZWhlaWdodFswXSA9IHMtPnBsYW5laGVpZ2h0WzNdID0gaW5saW5rLT5oOworICAgIHMtPnBsYW5ld2lkdGhbMV0gID0gcy0+cGxhbmV3aWR0aFsyXSAgPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPncsIGRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgIHMtPnBsYW5ld2lkdGhbMF0gID0gcy0+cGxhbmV3aWR0aFszXSAgPSBpbmxpbmstPnc7CisKKyAgICBzLT5tZXRyaWNfdyAgICAgID0gKHMtPnBsYW5ld2lkdGhbbXBdICAtICgocy0+anVua19sZWZ0ICsgcy0+anVua19yaWdodCkgIDw8IDMpKSA+PiAzOworICAgIHMtPm1ldHJpY19oICAgICAgPSAocy0+cGxhbmVoZWlnaHRbbXBdIC0gKChzLT5qdW5rX3RvcCAgKyBzLT5qdW5rX2JvdHRvbSkgPDwgMSkpID4+IDM7CisgICAgcy0+bWV0cmljX29mZnNldCA9IChzLT5qdW5rX2xlZnQgPDwgMykgKyAocy0+anVua190b3AgPDwgMSkgKiBzLT5wbGFuZXdpZHRoW21wXTsKKyAgICBzLT5tZXRyaWNfbGVuZ3RoID0gcy0+bWV0cmljX3cgKiBzLT5tZXRyaWNfaDsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgInc6ICVkIGg6ICVkXG4iLCBzLT5tZXRyaWNfdywgcy0+bWV0cmljX2gpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIm9mZnNldDogJWQgbGVuZ3RoOiAlZFxuIiwgcy0+bWV0cmljX29mZnNldCwgcy0+bWV0cmljX2xlbmd0aCk7CisKKyAgICBzLT5oZWFkID0gbWFrZV9maWVsZF9xdWV1ZShzLCA4KTsKKyAgICBpZiAoIXMtPmhlYWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5kaWZmID0gZGlmZl9jOworICAgIHMtPmNvbWIgPSBjb21iX2M7CisgICAgcy0+dmFyICA9IHZhcl9jOworCisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9wdWxsdXBfaW5pdF94ODYocyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgb3V0bGluay0+ZmxhZ3MgfD0gRkZfTElOS19GTEFHX1JFUVVFU1RfTE9PUDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFB1bGx1cEJ1ZmZlciAqcHVsbHVwX2xvY2tfYnVmZmVyKFB1bGx1cEJ1ZmZlciAqYiwgaW50IHBhcml0eSkKK3sKKyAgICBpZiAoIWIpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKChwYXJpdHkgKyAxKSAmIDEpCisgICAgICAgIGItPmxvY2tbMF0rKzsKKyAgICBpZiAoKHBhcml0eSArIDEpICYgMikKKyAgICAgICAgYi0+bG9ja1sxXSsrOworCisgICAgcmV0dXJuIGI7Cit9CisKK3N0YXRpYyB2b2lkIHB1bGx1cF9yZWxlYXNlX2J1ZmZlcihQdWxsdXBCdWZmZXIgKmIsIGludCBwYXJpdHkpCit7CisgICAgaWYgKCFiKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoKHBhcml0eSArIDEpICYgMSkKKyAgICAgICAgYi0+bG9ja1swXS0tOworICAgIGlmICgocGFyaXR5ICsgMSkgJiAyKQorICAgICAgICBiLT5sb2NrWzFdLS07Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfYnVmZmVyKFB1bGx1cENvbnRleHQgKnMsIFB1bGx1cEJ1ZmZlciAqYikKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChiLT5wbGFuZXNbMF0pCisgICAgICAgIHJldHVybiAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9wbGFuZXM7IGkrKykgeworICAgICAgICBiLT5wbGFuZXNbaV0gPSBhdl9tYWxsb2Mocy0+cGxhbmVoZWlnaHRbaV0gKiBzLT5wbGFuZXdpZHRoW2ldKTsKKyAgICB9CisgICAgaWYgKHMtPm5iX3BsYW5lcyA9PSAxKQorICAgICAgICBiLT5wbGFuZXNbMV0gPSBhdl9tYWxsb2MoNCoyNTYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBQdWxsdXBCdWZmZXIgKnB1bGx1cF9nZXRfYnVmZmVyKFB1bGx1cENvbnRleHQgKnMsIGludCBwYXJpdHkpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBUcnkgZmlyc3QgdG8gZ2V0IHRoZSBzaXN0ZXIgYnVmZmVyIGZvciB0aGUgcHJldmlvdXMgZmllbGQgKi8KKyAgICBpZiAocGFyaXR5IDwgMiAmJiBzLT5sYXN0ICYmIHBhcml0eSAhPSBzLT5sYXN0LT5wYXJpdHkKKyAgICAgICAgJiYgIXMtPmxhc3QtPmJ1ZmZlci0+bG9ja1twYXJpdHldKSB7CisgICAgICAgIGFsbG9jX2J1ZmZlcihzLCBzLT5sYXN0LT5idWZmZXIpOworICAgICAgICByZXR1cm4gcHVsbHVwX2xvY2tfYnVmZmVyKHMtPmxhc3QtPmJ1ZmZlciwgcGFyaXR5KTsKKyAgICB9CisKKyAgICAvKiBQcmVmZXIgYSBidWZmZXIgd2l0aCBib3RoIGZpZWxkcyBvcGVuICovCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPmJ1ZmZlcnMpOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPmJ1ZmZlcnNbaV0ubG9ja1swXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocy0+YnVmZmVyc1tpXS5sb2NrWzFdKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGFsbG9jX2J1ZmZlcihzLCAmcy0+YnVmZmVyc1tpXSk7CisgICAgICAgIHJldHVybiBwdWxsdXBfbG9ja19idWZmZXIoJnMtPmJ1ZmZlcnNbaV0sIHBhcml0eSk7CisgICAgfQorCisgICAgaWYgKHBhcml0eSA9PSAyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIFNlYXJjaCBmb3IgYW55IGhhbGYtZnJlZSBidWZmZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+YnVmZmVycyk7IGkrKykgeworICAgICAgICBpZiAoKChwYXJpdHkgKyAxKSAmIDEpICYmIHMtPmJ1ZmZlcnNbaV0ubG9ja1swXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoKChwYXJpdHkgKyAxKSAmIDIpICYmIHMtPmJ1ZmZlcnNbaV0ubG9ja1sxXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBhbGxvY19idWZmZXIocywgJnMtPmJ1ZmZlcnNbaV0pOworICAgICAgICByZXR1cm4gcHVsbHVwX2xvY2tfYnVmZmVyKCZzLT5idWZmZXJzW2ldLCBwYXJpdHkpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHF1ZXVlX2xlbmd0aChQdWxsdXBGaWVsZCAqYmVnaW4sIFB1bGx1cEZpZWxkICplbmQpCit7CisgICAgUHVsbHVwRmllbGQgKmY7CisgICAgaW50IGNvdW50ID0gMTsKKworICAgIGlmICghYmVnaW4gfHwgIWVuZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGYgPSBiZWdpbjsgZiAhPSBlbmQ7IGYgPSBmLT5uZXh0KQorICAgICAgICBjb3VudCsrOworCisgICAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGZpbmRfZmlyc3RfYnJlYWsoUHVsbHVwRmllbGQgKmYsIGludCBtYXgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKyAgICAgICAgaWYgKGYtPmJyZWFrcyAmIEJSRUFLX1JJR0hUIHx8IGYtPm5leHQtPmJyZWFrcyAmIEJSRUFLX0xFRlQpCisgICAgICAgICAgICByZXR1cm4gaSArIDE7CisgICAgICAgIGYgPSBmLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb21wdXRlX2JyZWFrcyhQdWxsdXBDb250ZXh0ICpzLCBQdWxsdXBGaWVsZCAqZjApCit7CisgICAgUHVsbHVwRmllbGQgKmYxID0gZjAtPm5leHQ7CisgICAgUHVsbHVwRmllbGQgKmYyID0gZjEtPm5leHQ7CisgICAgUHVsbHVwRmllbGQgKmYzID0gZjItPm5leHQ7CisgICAgaW50IGksIGwsIG1heF9sID0gMCwgbWF4X3IgPSAwOworCisgICAgaWYgKGYwLT5mbGFncyAmIEZfSEFWRV9CUkVBS1MpCisgICAgICAgIHJldHVybjsKKworICAgIGYwLT5mbGFncyB8PSBGX0hBVkVfQlJFQUtTOworCisgICAgLyogU3BlY2lhbCBjYXNlIHdoZW4gZmllbGRzIGFyZSAxMDAlIGlkZW50aWNhbCAqLworICAgIGlmIChmMC0+YnVmZmVyID09IGYyLT5idWZmZXIgJiYgZjEtPmJ1ZmZlciAhPSBmMy0+YnVmZmVyKSB7CisgICAgICAgIGYyLT5icmVha3MgfD0gQlJFQUtfUklHSFQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZjAtPmJ1ZmZlciAhPSBmMi0+YnVmZmVyICYmIGYxLT5idWZmZXIgPT0gZjMtPmJ1ZmZlcikgeworICAgICAgICBmMS0+YnJlYWtzIHw9IEJSRUFLX0xFRlQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bWV0cmljX2xlbmd0aDsgaSsrKSB7CisgICAgICAgIGwgPSBmMi0+ZGlmZnNbaV0gLSBmMy0+ZGlmZnNbaV07CisKKyAgICAgICAgaWYgKCBsID4gbWF4X2wpCisgICAgICAgICAgICBtYXhfbCA9ICBsOworICAgICAgICBpZiAoLWwgPiBtYXhfcikKKyAgICAgICAgICAgIG1heF9yID0gLWw7CisgICAgfQorCisgICAgLyogRG9uJ3QgZ2V0IHRyaXBwZWQgdXAgd2hlbiBkaWZmZXJlbmNlcyBhcmUgbW9zdGx5IHF1YW50IGVycm9yICovCisgICAgaWYgKG1heF9sICsgbWF4X3IgPCAxMjgpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAobWF4X2wgPiA0ICogbWF4X3IpCisgICAgICAgIGYxLT5icmVha3MgfD0gQlJFQUtfTEVGVDsKKyAgICBpZiAobWF4X3IgPiA0ICogbWF4X2wpCisgICAgICAgIGYyLT5icmVha3MgfD0gQlJFQUtfUklHSFQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXB1dGVfYWZmaW5pdHkoUHVsbHVwQ29udGV4dCAqcywgUHVsbHVwRmllbGQgKmYpCit7CisgICAgaW50IGksIG1heF9sID0gMCwgbWF4X3IgPSAwLCBsOworCisgICAgaWYgKGYtPmZsYWdzICYgRl9IQVZFX0FGRklOSVRZKQorICAgICAgICByZXR1cm47CisKKyAgICBmLT5mbGFncyB8PSBGX0hBVkVfQUZGSU5JVFk7CisKKyAgICBpZiAoZi0+YnVmZmVyID09IGYtPm5leHQtPm5leHQtPmJ1ZmZlcikgeworICAgICAgICBmLT5hZmZpbml0eSAgICAgICAgICAgICA9ICAxOworICAgICAgICBmLT5uZXh0LT5hZmZpbml0eSAgICAgICA9ICAwOworICAgICAgICBmLT5uZXh0LT5uZXh0LT5hZmZpbml0eSA9IC0xOworICAgICAgICBmLT5uZXh0LT5mbGFncyAgICAgICAgIHw9IEZfSEFWRV9BRkZJTklUWTsKKyAgICAgICAgZi0+bmV4dC0+bmV4dC0+ZmxhZ3MgICB8PSBGX0hBVkVfQUZGSU5JVFk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bWV0cmljX2xlbmd0aDsgaSsrKSB7CisgICAgICAgIGludCB2ICA9IGYtPnZhcnNbaV07CisgICAgICAgIGludCBsdiA9IGYtPnByZXYtPnZhcnNbaV07CisgICAgICAgIGludCBydiA9IGYtPm5leHQtPnZhcnNbaV07CisgICAgICAgIGludCBsYyA9IGYtPiAgICAgIGNvbWJzW2ldIC0gMioodiA8IGx2ID8gdiA6IGx2KTsKKyAgICAgICAgaW50IHJjID0gZi0+bmV4dC0+Y29tYnNbaV0gLSAyKih2IDwgcnYgPyB2IDogcnYpOworCisgICAgICAgIGxjID0gRkZNQVgobGMsIDApOworICAgICAgICByYyA9IEZGTUFYKHJjLCAwKTsKKyAgICAgICAgbCAgPSBsYyAtIHJjOworCisgICAgICAgIGlmICggbCA+IG1heF9sKQorICAgICAgICAgICAgbWF4X2wgPSAgbDsKKyAgICAgICAgaWYgKC1sID4gbWF4X3IpCisgICAgICAgICAgICBtYXhfciA9IC1sOworICAgIH0KKworICAgIGlmIChtYXhfbCArIG1heF9yIDwgNjQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtYXhfciA+IDYgKiBtYXhfbCkKKyAgICAgICAgZi0+YWZmaW5pdHkgPSAtMTsKKyAgICBlbHNlIGlmIChtYXhfbCA+IDYgKiBtYXhfcikKKyAgICAgICAgZi0+YWZmaW5pdHkgPSAgMTsKK30KKworc3RhdGljIGludCBkZWNpZGVfZnJhbWVfbGVuZ3RoKFB1bGx1cENvbnRleHQgKnMpCit7CisgICAgUHVsbHVwRmllbGQgKmYwID0gcy0+Zmlyc3Q7CisgICAgUHVsbHVwRmllbGQgKmYxID0gZjAtPm5leHQ7CisgICAgUHVsbHVwRmllbGQgKmYyID0gZjEtPm5leHQ7CisgICAgUHVsbHVwRmllbGQgKmY7CisgICAgaW50IGksIGwsIG47CisKKyAgICBpZiAocXVldWVfbGVuZ3RoKHMtPmZpcnN0LCBzLT5sYXN0KSA8IDQpCisgICAgICAgIHJldHVybiAwOworCisgICAgZiA9IHMtPmZpcnN0OworICAgIG4gPSBxdWV1ZV9sZW5ndGgoZiwgcy0+bGFzdCk7CisgICAgZm9yIChpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPCBuIC0gMykKKyAgICAgICAgICAgIGNvbXB1dGVfYnJlYWtzKHMsIGYpOworCisgICAgICAgIGNvbXB1dGVfYWZmaW5pdHkocywgZik7CisKKyAgICAgICAgZiA9IGYtPm5leHQ7CisgICAgfQorCisgICAgaWYgKGYwLT5hZmZpbml0eSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBsID0gZmluZF9maXJzdF9icmVhayhmMCwgMyk7CisKKyAgICBpZiAobCA9PSAxICYmIHMtPnN0cmljdF9icmVha3MgPCAwKQorICAgICAgICBsID0gMDsKKworICAgIHN3aXRjaCAobCkgeworICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuIDEgKyAocy0+c3RyaWN0X2JyZWFrcyA8IDEgJiYgZjAtPmFmZmluaXR5ID09IDEgJiYgZjEtPmFmZmluaXR5ID09IC0xKTsKKyAgICBjYXNlIDI6CisgICAgICAgIC8qIEZJWE1FOiBzdHJpY3RseSBzcGVha2luZywgZjAtPnByZXYgaXMgbm8gbG9uZ2VyIHZhbGlkLi4uIDopICovCisgICAgICAgIGlmIChzLT5zdHJpY3RfcGFpcnMKKyAgICAgICAgICAgICYmIChmMC0+cHJldi0+YnJlYWtzICYgQlJFQUtfUklHSFQpICYmIChmMi0+YnJlYWtzICYgQlJFQUtfTEVGVCkKKyAgICAgICAgICAgICYmIChmMC0+YWZmaW5pdHkgIT0gMSB8fCBmMS0+YWZmaW5pdHkgIT0gLTEpICkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gMSArIChmMS0+YWZmaW5pdHkgIT0gMSk7CisgICAgY2FzZSAzOgorICAgICAgICByZXR1cm4gMiArIChmMi0+YWZmaW5pdHkgIT0gMSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogOSBwb3NzaWJpbGl0aWVzIGNvdmVyZWQgYmVmb3JlIHN3aXRjaCAqLworICAgICAgICBpZiAoZjEtPmFmZmluaXR5ID09IDEpCisgICAgICAgICAgICByZXR1cm4gMTsgLyogY292ZXJzIDYgKi8KKyAgICAgICAgZWxzZSBpZiAoZjEtPmFmZmluaXR5ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIDI7IC8qIGNvdmVycyA2ICovCisgICAgICAgIGVsc2UgaWYgKGYyLT5hZmZpbml0eSA9PSAtMSkgeyAvKiBjb3ZlcnMgMiAqLworICAgICAgICAgICAgcmV0dXJuIChmMC0+YWZmaW5pdHkgPT0gMSkgPyAzIDogMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAyOyAvKiB0aGUgcmVtYWluaW5nIDYgKi8KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIFB1bGx1cEZyYW1lICpwdWxsdXBfZ2V0X2ZyYW1lKFB1bGx1cENvbnRleHQgKnMpCit7CisgICAgUHVsbHVwRnJhbWUgKmZyID0gJnMtPmZyYW1lOworICAgIGludCBpLCBuID0gZGVjaWRlX2ZyYW1lX2xlbmd0aChzKTsKKyAgICBpbnQgYWZmID0gcy0+Zmlyc3QtPm5leHQtPmFmZmluaXR5OworCisgICAgYXZfYXNzZXJ0MShuIDwgRkZfQVJSQVlfRUxFTVMoZnItPmlmaWVsZHMpKTsKKyAgICBpZiAoIW4gfHwgZnItPmxvY2spCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZnItPmxvY2srKzsKKyAgICBmci0+bGVuZ3RoID0gbjsKKyAgICBmci0+cGFyaXR5ID0gcy0+Zmlyc3QtPnBhcml0eTsKKyAgICBmci0+YnVmZmVyID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgLyogV2UgY2hlYXQgYW5kIHN0ZWFsIHRoZSBidWZmZXIgd2l0aG91dCByZWxlYXNlK3JlbG9jayAqLworICAgICAgICBmci0+aWZpZWxkc1tpXSAgID0gcy0+Zmlyc3QtPmJ1ZmZlcjsKKyAgICAgICAgcy0+Zmlyc3QtPmJ1ZmZlciA9IDA7CisgICAgICAgIHMtPmZpcnN0ICAgICAgICAgPSBzLT5maXJzdC0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAobiA9PSAxKSB7CisgICAgICAgIGZyLT5vZmllbGRzW2ZyLT5wYXJpdHkgICAgXSA9IGZyLT5pZmllbGRzWzBdOworICAgICAgICBmci0+b2ZpZWxkc1tmci0+cGFyaXR5IF4gMV0gPSAwOworICAgIH0gZWxzZSBpZiAobiA9PSAyKSB7CisgICAgICAgIGZyLT5vZmllbGRzW2ZyLT5wYXJpdHkgICAgXSA9IGZyLT5pZmllbGRzWzBdOworICAgICAgICBmci0+b2ZpZWxkc1tmci0+cGFyaXR5IF4gMV0gPSBmci0+aWZpZWxkc1sxXTsKKyAgICB9IGVsc2UgaWYgKG4gPT0gMykgeworICAgICAgICBpZiAoIWFmZikKKyAgICAgICAgICAgIGFmZiA9IChmci0+aWZpZWxkc1swXSA9PSBmci0+aWZpZWxkc1sxXSkgPyAtMSA6IDE7CisgICAgICAgIGZyLT5vZmllbGRzW2ZyLT5wYXJpdHkgICAgXSA9IGZyLT5pZmllbGRzWzEgKyBhZmZdOworICAgICAgICBmci0+b2ZpZWxkc1tmci0+cGFyaXR5IF4gMV0gPSBmci0+aWZpZWxkc1sxICAgICAgXTsKKyAgICB9CisKKyAgICBwdWxsdXBfbG9ja19idWZmZXIoZnItPm9maWVsZHNbMF0sIDApOworICAgIHB1bGx1cF9sb2NrX2J1ZmZlcihmci0+b2ZpZWxkc1sxXSwgMSk7CisKKyAgICBpZiAoZnItPm9maWVsZHNbMF0gPT0gZnItPm9maWVsZHNbMV0pIHsKKyAgICAgICAgZnItPmJ1ZmZlciA9IGZyLT5vZmllbGRzWzBdOworICAgICAgICBwdWxsdXBfbG9ja19idWZmZXIoZnItPmJ1ZmZlciwgMik7CisgICAgICAgIHJldHVybiBmcjsKKyAgICB9CisKKyAgICByZXR1cm4gZnI7Cit9CisKK3N0YXRpYyB2b2lkIHB1bGx1cF9yZWxlYXNlX2ZyYW1lKFB1bGx1cEZyYW1lICpmKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGYtPmxlbmd0aDsgaSsrKQorICAgICAgICBwdWxsdXBfcmVsZWFzZV9idWZmZXIoZi0+aWZpZWxkc1tpXSwgZi0+cGFyaXR5IF4gKGkgJiAxKSk7CisKKyAgICBwdWxsdXBfcmVsZWFzZV9idWZmZXIoZi0+b2ZpZWxkc1swXSwgMCk7CisgICAgcHVsbHVwX3JlbGVhc2VfYnVmZmVyKGYtPm9maWVsZHNbMV0sIDEpOworCisgICAgaWYgKGYtPmJ1ZmZlcikKKyAgICAgICAgcHVsbHVwX3JlbGVhc2VfYnVmZmVyKGYtPmJ1ZmZlciwgMik7CisgICAgZi0+bG9jay0tOworfQorCitzdGF0aWMgdm9pZCBjb21wdXRlX21ldHJpYyhQdWxsdXBDb250ZXh0ICpzLCBpbnQgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQdWxsdXBGaWVsZCAqZmEsIGludCBwYSwgUHVsbHVwRmllbGQgKmZiLCBpbnQgcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpmdW5jKShjb25zdCB1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgcHRyZGlmZl90KSkKK3sKKyAgICBpbnQgbXAgPSBzLT5tZXRyaWNfcGxhbmU7CisgICAgaW50IHhzdGVwID0gODsKKyAgICBpbnQgeXN0ZXAgPSBzLT5wbGFuZXdpZHRoW21wXSA8PCAzOworICAgIGludCBzdHJpZGUgPSBzLT5wbGFuZXdpZHRoW21wXSA8PCAxOyAvKiBmaWVsZCBzdHJpZGUgKi8KKyAgICBpbnQgdyA9IHMtPm1ldHJpY193ICogeHN0ZXA7CisgICAgdWludDhfdCAqYSwgKmI7CisgICAgaW50IHgsIHk7CisKKyAgICBpZiAoIWZhLT5idWZmZXIgfHwgIWZiLT5idWZmZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIFNob3J0Y3V0IGZvciBkdXBsaWNhdGUgZmllbGRzIChlLmcuIGZyb20gUkZGIGZsYWcpICovCisgICAgaWYgKGZhLT5idWZmZXIgPT0gZmItPmJ1ZmZlciAmJiBwYSA9PSBwYikgeworICAgICAgICBtZW1zZXQoZGVzdCwgMCwgcy0+bWV0cmljX2xlbmd0aCAqIHNpemVvZigqZGVzdCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYSA9IGZhLT5idWZmZXItPnBsYW5lc1ttcF0gKyBwYSAqIHMtPnBsYW5ld2lkdGhbbXBdICsgcy0+bWV0cmljX29mZnNldDsKKyAgICBiID0gZmItPmJ1ZmZlci0+cGxhbmVzW21wXSArIHBiICogcy0+cGxhbmV3aWR0aFttcF0gKyBzLT5tZXRyaWNfb2Zmc2V0OworCisgICAgZm9yICh5ID0gMDsgeSA8IHMtPm1ldHJpY19oOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0geHN0ZXApCisgICAgICAgICAgICAqZGVzdCsrID0gZnVuYyhhICsgeCwgYiArIHgsIHN0cmlkZSk7CisgICAgICAgIGEgKz0geXN0ZXA7IGIgKz0geXN0ZXA7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNoZWNrX2ZpZWxkX3F1ZXVlKFB1bGx1cENvbnRleHQgKnMpCit7CisgICAgaW50IHJldDsKKworICAgIGlmIChzLT5oZWFkLT5uZXh0ID09IHMtPmZpcnN0KSB7CisgICAgICAgIFB1bGx1cEZpZWxkICpmID0gYXZfbWFsbG9jeihzaXplb2YoKmYpKTsKKworICAgICAgICBpZiAoIWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGlmICgocmV0ID0gYWxsb2NfbWV0cmljcyhzLCBmKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlKGYpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGYtPnByZXYgICAgICAgID0gcy0+aGVhZDsKKyAgICAgICAgZi0+bmV4dCAgICAgICAgPSBzLT5maXJzdDsKKyAgICAgICAgcy0+aGVhZC0+bmV4dCAgPSBmOworICAgICAgICBzLT5maXJzdC0+cHJldiA9IGY7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1bGx1cF9zdWJtaXRfZmllbGQoUHVsbHVwQ29udGV4dCAqcywgUHVsbHVwQnVmZmVyICpiLCBpbnQgcGFyaXR5KQoreworICAgIFB1bGx1cEZpZWxkICpmOworCisgICAgLyogR3JvdyB0aGUgY2lyY3VsYXIgbGlzdCBpZiBuZWVkZWQgKi8KKyAgICBpZiAoY2hlY2tfZmllbGRfcXVldWUocykgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBDYW5ub3QgaGF2ZSB0d28gZmllbGRzIG9mIHNhbWUgcGFyaXR5IGluIGEgcm93OyBkcm9wIHRoZSBuZXcgb25lICovCisgICAgaWYgKHMtPmxhc3QgJiYgcy0+bGFzdC0+cGFyaXR5ID09IHBhcml0eSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZiA9IHMtPmhlYWQ7CisgICAgZi0+cGFyaXR5ICAgPSBwYXJpdHk7CisgICAgZi0+YnVmZmVyICAgPSBwdWxsdXBfbG9ja19idWZmZXIoYiwgcGFyaXR5KTsKKyAgICBmLT5mbGFncyAgICA9IDA7CisgICAgZi0+YnJlYWtzICAgPSAwOworICAgIGYtPmFmZmluaXR5ID0gMDsKKworICAgIGNvbXB1dGVfbWV0cmljKHMsIGYtPmRpZmZzLCBmLCBwYXJpdHksIGYtPnByZXYtPnByZXYsIHBhcml0eSwgcy0+ZGlmZik7CisgICAgY29tcHV0ZV9tZXRyaWMocywgZi0+Y29tYnMsIHBhcml0eSA/IGYtPnByZXYgOiBmLCAwLCBwYXJpdHkgPyBmIDogZi0+cHJldiwgMSwgcy0+Y29tYik7CisgICAgY29tcHV0ZV9tZXRyaWMocywgZi0+dmFycywgZiwgcGFyaXR5LCBmLCAtMSwgcy0+dmFyKTsKKyAgICBlbW1zX2MoKTsKKworICAgIC8qIEFkdmFuY2UgdGhlIGNpcmN1bGFyIGxpc3QgKi8KKyAgICBpZiAoIXMtPmZpcnN0KQorICAgICAgICBzLT5maXJzdCA9IHMtPmhlYWQ7CisKKyAgICBzLT5sYXN0ID0gcy0+aGVhZDsKKyAgICBzLT5oZWFkID0gcy0+aGVhZC0+bmV4dDsKK30KKworc3RhdGljIHZvaWQgY29weV9maWVsZChQdWxsdXBDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICBQdWxsdXBCdWZmZXIgKmRzdCwgUHVsbHVwQnVmZmVyICpzcmMsIGludCBwYXJpdHkpCit7CisgICAgdWludDhfdCAqZGQsICpzczsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9wbGFuZXM7IGkrKykgeworICAgICAgICBzcyA9IHNyYy0+cGxhbmVzW2ldICsgcGFyaXR5ICogcy0+cGxhbmV3aWR0aFtpXTsKKyAgICAgICAgZGQgPSBkc3QtPnBsYW5lc1tpXSArIHBhcml0eSAqIHMtPnBsYW5ld2lkdGhbaV07CisKKyAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShkZCwgcy0+cGxhbmV3aWR0aFtpXSA8PCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzLCBzLT5wbGFuZXdpZHRoW2ldIDw8IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmV3aWR0aFtpXSwgcy0+cGxhbmVoZWlnaHRbaV0gPj4gMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwdWxsdXBfcGFja19mcmFtZShQdWxsdXBDb250ZXh0ICpzLCBQdWxsdXBGcmFtZSAqZnIpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoZnItPmJ1ZmZlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGZyLT5sZW5ndGggPCAyKQorICAgICAgICByZXR1cm47IC8qIEZJWE1FOiBkZWFsIHdpdGggdGhpcyAqLworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpZiAoZnItPm9maWVsZHNbaV0tPmxvY2tbaV4xXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZyLT5idWZmZXIgPSBmci0+b2ZpZWxkc1tpXTsKKyAgICAgICAgcHVsbHVwX2xvY2tfYnVmZmVyKGZyLT5idWZmZXIsIDIpOworICAgICAgICBjb3B5X2ZpZWxkKHMsIGZyLT5idWZmZXIsIGZyLT5vZmllbGRzW2leMV0sIGleMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmci0+YnVmZmVyID0gcHVsbHVwX2dldF9idWZmZXIocywgMik7CisKKyAgICBjb3B5X2ZpZWxkKHMsIGZyLT5idWZmZXIsIGZyLT5vZmllbGRzWzBdLCAwKTsKKyAgICBjb3B5X2ZpZWxkKHMsIGZyLT5idWZmZXIsIGZyLT5vZmllbGRzWzFdLCAxKTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIFB1bGx1cENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgUHVsbHVwQnVmZmVyICpiOworICAgIFB1bGx1cEZyYW1lICpmOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBpbnQgcCwgcmV0ID0gMDsKKworICAgIGIgPSBwdWxsdXBfZ2V0X2J1ZmZlcihzLCAyKTsKKyAgICBpZiAoIWIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJDb3VsZCBub3QgZ2V0IGJ1ZmZlciFcbiIpOworICAgICAgICBmID0gcHVsbHVwX2dldF9mcmFtZShzKTsKKyAgICAgICAgcHVsbHVwX3JlbGVhc2VfZnJhbWUoZik7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGF2X2ltYWdlX2NvcHkoYi0+cGxhbmVzLCBzLT5wbGFuZXdpZHRoLAorICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKilpbi0+ZGF0YSwgaW4tPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgaW5saW5rLT5mb3JtYXQsIGlubGluay0+dywgaW5saW5rLT5oKTsKKworICAgIHAgPSBpbi0+aW50ZXJsYWNlZF9mcmFtZSA/ICFpbi0+dG9wX2ZpZWxkX2ZpcnN0IDogMDsKKyAgICBwdWxsdXBfc3VibWl0X2ZpZWxkKHMsIGIsIHAgICk7CisgICAgcHVsbHVwX3N1Ym1pdF9maWVsZChzLCBiLCBwXjEpOworCisgICAgaWYgKGluLT5yZXBlYXRfcGljdCkKKyAgICAgICAgcHVsbHVwX3N1Ym1pdF9maWVsZChzLCBiLCBwKTsKKworICAgIHB1bGx1cF9yZWxlYXNlX2J1ZmZlcihiLCAyKTsKKworICAgIGYgPSBwdWxsdXBfZ2V0X2ZyYW1lKHMpOworICAgIGlmICghZikKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBpZiAoZi0+bGVuZ3RoIDwgMikgeworICAgICAgICBwdWxsdXBfcmVsZWFzZV9mcmFtZShmKTsKKyAgICAgICAgZiA9IHB1bGx1cF9nZXRfZnJhbWUocyk7CisgICAgICAgIGlmICghZikKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBpZiAoZi0+bGVuZ3RoIDwgMikgeworICAgICAgICAgICAgcHVsbHVwX3JlbGVhc2VfZnJhbWUoZik7CisgICAgICAgICAgICBpZiAoIWluLT5yZXBlYXRfcGljdCkKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIGYgPSBwdWxsdXBfZ2V0X2ZyYW1lKHMpOworICAgICAgICAgICAgaWYgKCFmKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgaWYgKGYtPmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgICAgICBwdWxsdXBfcmVsZWFzZV9mcmFtZShmKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIHRoZSBmcmFtZSBpc24ndCBhbHJlYWR5IGV4cG9ydGFibGUuLi4gKi8KKyAgICBpZiAoIWYtPmJ1ZmZlcikKKyAgICAgICAgcHVsbHVwX3BhY2tfZnJhbWUocywgZik7CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisKKyAgICBhdl9pbWFnZV9jb3B5KG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KiopZi0+YnVmZmVyLT5wbGFuZXMsIHMtPnBsYW5ld2lkdGgsCisgICAgICAgICAgICAgICAgICBpbmxpbmstPmZvcm1hdCwgaW5saW5rLT53LCBpbmxpbmstPmgpOworCisgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CisgICAgcHVsbHVwX3JlbGVhc2VfZnJhbWUoZik7CitlbmQ6CisgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFB1bGx1cENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBmcmVlX2ZpZWxkX3F1ZXVlKHMtPmhlYWQpOworICAgIHMtPmxhc3QgPSBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPmJ1ZmZlcnMpOyBpKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmJ1ZmZlcnNbaV0ucGxhbmVzWzBdKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmJ1ZmZlcnNbaV0ucGxhbmVzWzFdKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmJ1ZmZlcnNbaV0ucGxhbmVzWzJdKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBwdWxsdXBfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBwdWxsdXBfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfcHVsbHVwID0geworICAgIC5uYW1lICAgICAgICAgID0gInB1bGx1cCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUHVsbHVwIGZyb20gZmllbGQgc2VxdWVuY2UgdG8gZnJhbWVzLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFB1bGx1cENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnB1bGx1cF9jbGFzcywKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBwdWxsdXBfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gcHVsbHVwX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3B1bGx1cC5oIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3B1bGx1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNTkzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfcHVsbHVwLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9QVUxMVVBfSAorI2RlZmluZSBBVkZJTFRFUl9QVUxMVVBfSAorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUHVsbHVwQnVmZmVyIHsKKyAgICBpbnQgbG9ja1syXTsKKyAgICB1aW50OF90ICpwbGFuZXNbNF07Cit9IFB1bGx1cEJ1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgUHVsbHVwRmllbGQgeworICAgIGludCBwYXJpdHk7CisgICAgUHVsbHVwQnVmZmVyICpidWZmZXI7CisgICAgdW5zaWduZWQgZmxhZ3M7CisgICAgaW50IGJyZWFrczsKKyAgICBpbnQgYWZmaW5pdHk7CisgICAgaW50ICpkaWZmczsKKyAgICBpbnQgKmNvbWJzOworICAgIGludCAqdmFyczsKKyAgICBzdHJ1Y3QgUHVsbHVwRmllbGQgKnByZXYsICpuZXh0OworfSBQdWxsdXBGaWVsZDsKKwordHlwZWRlZiBzdHJ1Y3QgUHVsbHVwRnJhbWUgeworICAgIGludCBsb2NrOworICAgIGludCBsZW5ndGg7CisgICAgaW50IHBhcml0eTsKKyAgICBQdWxsdXBCdWZmZXIgKmlmaWVsZHNbNF0sICpvZmllbGRzWzJdOworICAgIFB1bGx1cEJ1ZmZlciAqYnVmZmVyOworfSBQdWxsdXBGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgUHVsbHVwQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IGp1bmtfbGVmdCwganVua19yaWdodCwganVua190b3AsIGp1bmtfYm90dG9tOworICAgIGludCBtZXRyaWNfcGxhbmU7CisgICAgaW50IHN0cmljdF9icmVha3M7CisgICAgaW50IHN0cmljdF9wYWlyczsKKyAgICBpbnQgbWV0cmljX3csIG1ldHJpY19oLCBtZXRyaWNfbGVuZ3RoOworICAgIGludCBtZXRyaWNfb2Zmc2V0OworICAgIGludCBuYl9wbGFuZXM7CisgICAgaW50IHBsYW5ld2lkdGhbNF07CisgICAgaW50IHBsYW5laGVpZ2h0WzRdOworICAgIFB1bGx1cEZpZWxkICpmaXJzdCwgKmxhc3QsICpoZWFkOworICAgIFB1bGx1cEJ1ZmZlciBidWZmZXJzWzEwXTsKKyAgICBQdWxsdXBGcmFtZSBmcmFtZTsKKworICAgIGludCAoKmRpZmYpKGNvbnN0IHVpbnQ4X3QgKmEsIGNvbnN0IHVpbnQ4X3QgKmIsIHB0cmRpZmZfdCBzKTsKKyAgICBpbnQgKCpjb21iKShjb25zdCB1aW50OF90ICphLCBjb25zdCB1aW50OF90ICpiLCBwdHJkaWZmX3Qgcyk7CisgICAgaW50ICgqdmFyICkoY29uc3QgdWludDhfdCAqYSwgY29uc3QgdWludDhfdCAqYiwgcHRyZGlmZl90IHMpOworfSBQdWxsdXBDb250ZXh0OworCit2b2lkIGZmX3B1bGx1cF9pbml0X3g4NihQdWxsdXBDb250ZXh0ICpzKTsKKworI2VuZGlmIC8qIEFWRklMVEVSX1BVTExVUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfcmVtb3ZlbG9nby5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3JlbW92ZWxvZ28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU1MTdmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3JlbW92ZWxvZ28uYwpAQCAtMCwwICsxLDU4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBSb2JlcnQgRWRlbGUgPHlhcnRyZWJvQGVhcnRobGluay5uZXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBZHZhbmNlZCBibHVyLWJhc2VkIGxvZ28gcmVtb3ZpbmcgZmlsdGVyCisgKgorICogVGhpcyBmaWx0ZXIgbG9hZHMgYW4gaW1hZ2UgbWFzayBmaWxlIHNob3dpbmcgd2hlcmUgYSBsb2dvIGlzIGFuZAorICogdXNlcyBhIGJsdXIgdHJhbnNmb3JtIHRvIHJlbW92ZSB0aGUgbG9nby4KKyAqCisgKiBCYXNlZCBvbiB0aGUgbGlibXBjb2RlY3MgcmVtb3ZlLWxvZ28gZmlsdGVyIGJ5IFJvYmVydCBFZGVsZS4KKyAqLworCisvKioKKyAqIFRoaXMgY29kZSBpbXBsZW1lbnRzIGEgZmlsdGVyIHRvIHJlbW92ZSBhbm5veWluZyBUViBsb2dvcyBhbmQgb3RoZXIgYW5ub3lpbmcKKyAqIGltYWdlcyBwbGFjZWQgb250byBhIHZpZGVvIHN0cmVhbS4gSXQgd29ya3MgYnkgZmlsbGluZyBpbiB0aGUgcGl4ZWxzIHRoYXQKKyAqIGNvbXByaXNlIHRoZSBsb2dvIHdpdGggbmVpZ2hib3JpbmcgcGl4ZWxzLiBUaGUgdHJhbnNmb3JtIGlzIHZlcnkgbG9vc2VseQorICogYmFzZWQgb24gYSBnYXVzc2lhbiBibHVyLCBidXQgaXQgaXMgZGlmZmVyZW50IGVub3VnaCB0byBtZXJpdCBpdHMgb3duCisgKiBwYXJhZ3JhcGggbGF0ZXIgb24uIEl0IGlzIGEgbWFqb3IgaW1wcm92ZW1lbnQgb24gdGhlIG9sZCBkZWxvZ28gZmlsdGVyIGFzIGl0CisgKiBib3RoIHVzZXMgYSBiZXR0ZXIgYmx1cnJpbmcgYWxnb3JpdGhtIGFuZCB1c2VzIGEgYml0bWFwIHRvIHVzZSBhbiBhcmJpdHJhcnkKKyAqIGFuZCBnZW5lcmFsbHkgbXVjaCB0aWdodGVyIGZpdHRpbmcgc2hhcGUgdGhhbiBhIHJlY3RhbmdsZS4KKyAqCisgKiBUaGUgbG9nbyByZW1vdmFsIGFsZ29yaXRobSBoYXMgdHdvIGtleSBwb2ludHMuIFRoZSBmaXJzdCBpcyB0aGF0IGl0CisgKiBkaXN0aW5ndWlzaGVzIGJldHdlZW4gcGl4ZWxzIGluIHRoZSBsb2dvIGFuZCB0aG9zZSBub3QgaW4gdGhlIGxvZ28gYnkgdXNpbmcKKyAqIHRoZSBwYXNzZWQtaW4gYml0bWFwLiBQaXhlbHMgbm90IGluIHRoZSBsb2dvIGFyZSBjb3BpZWQgb3ZlciBkaXJlY3RseSB3aXRob3V0CisgKiBiZWluZyBtb2RpZmllZCBhbmQgdGhleSBhbHNvIHNlcnZlIGFzIHNvdXJjZSBwaXhlbHMgZm9yIHRoZSBsb2dvCisgKiBmaWxsLWluLiBQaXhlbHMgaW5zaWRlIHRoZSBsb2dvIGhhdmUgdGhlIG1hc2sgYXBwbGllZC4KKyAqCisgKiBBdCBpbml0LXRpbWUgdGhlIGJpdG1hcCBpcyByZXByb2Nlc3NlZCBpbnRlcm5hbGx5LCBhbmQgdGhlIGRpc3RhbmNlIHRvIHRoZQorICogbmVhcmVzdCBlZGdlIG9mIHRoZSBsb2dvIChNYW5oYXR0YW4gZGlzdGFuY2UpLCBhbG9uZyB3aXRoIGEgbGl0dGxlIGV4dHJhIHRvCisgKiByZW1vdmUgcm91Z2ggZWRnZXMsIGlzIHN0b3JlZCBpbiBlYWNoIHBpeGVsLiBUaGlzIGlzIGRvbmUgdXNpbmcgYW4gaW4tcGxhY2UKKyAqIGVyb3Npb24gYWxnb3JpdGhtLCBhbmQgaW5jcmVtZW50aW5nIGVhY2ggcGl4ZWwgdGhhdCBzdXJ2aXZlcyBhbnkgZ2l2ZW4KKyAqIGVyb3Npb24uICBPbmNlIGV2ZXJ5IHBpeGVsIGlzIGVyb2RlZCwgdGhlIG1heGltdW0gdmFsdWUgaXMgcmVjb3JkZWQsIGFuZCBhCisgKiBzZXQgb2YgbWFza3MgZnJvbSBzaXplIDAgdG8gdGhpcyBzaXplIGFyZSBnZW5lcmFnZWQuIFRoZSBtYXNrcyBhcmUgY2lyY3VsYXIKKyAqIGJpbmFyeSBtYXNrcywgd2hlcmUgZWFjaCBwaXhlbCB3aXRoaW4gYSByYWRpdXMgTiAod2hlcmUgTiBpcyB0aGUgc2l6ZSBvZiB0aGUKKyAqIG1hc2spIGlzIGEgMSwgYW5kIGFsbCBvdGhlciBwaXhlbHMgYXJlIGEgMC4gQWx0aG91Z2ggYSBnYXVzc2lhbiBtYXNrIHdvdWxkIGJlCisgKiBtb3JlIG1hdGhlbWF0aWNhbGx5IGFjY3VyYXRlLCBhIGJpbmFyeSBtYXNrIHdvcmtzIGJldHRlciBpbiBwcmFjdGljZSBiZWNhdXNlCisgKiB3ZSBnZW5lcmFsbHkgZG8gbm90IHVzZSB0aGUgY2VudHJhbCBwaXhlbHMgaW4gdGhlIG1hc2sgKGJlY2F1c2UgdGhleSBhcmUgaW4KKyAqIHRoZSBsb2dvIHJlZ2lvbiksIGFuZCB0aHVzIGEgZ2F1c3NpYW4gbWFzayB3aWxsIGNhdXNlIHRvbyBsaXR0bGUgYmx1ciBhbmQKKyAqIHRodXMgYSB2ZXJ5IHVuc3RhYmxlIGltYWdlLgorICoKKyAqIFRoZSBtYXNrIGlzIGFwcGxpZWQgaW4gYSBzcGVjaWFsIHdheS4gTmFtZWx5LCBvbmx5IHBpeGVscyBpbiB0aGUgbWFzayB0aGF0CisgKiBsaW5lIHVwIHRvIHBpeGVscyBvdXRzaWRlIHRoZSBsb2dvIGFyZSB1c2VkLiBUaGUgZHluYW1pYyBtYXNrIHNpemUgbWVhbnMgdGhhdAorICogdGhlIG1hc2sgaXMganVzdCBiaWcgZW5vdWdoIHNvIHRoYXQgdGhlIGVkZ2VzIHRvdWNoIHBpeGVscyBvdXRzaWRlIHRoZSBsb2dvLAorICogc28gdGhlIGJsdXJyaW5nIGlzIGtlcHQgdG8gYSBtaW5pbXVtIGFuZCBhdCBsZWFzdCB0aGUgZmlyc3QgYm91bmRhcnkKKyAqIGNvbmRpdGlvbiBpcyBtZXQgKHRoYXQgdGhlIGltYWdlIGZ1bmN0aW9uIGl0c2VsZiBpcyBjb250aW51b3VzKSwgZXZlbiBpZiB0aGUKKyAqIHNlY29uZCBib3VuZGFyeSBjb25kaXRpb24gKHRoYXQgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGltYWdlIGZ1bmN0aW9uIGlzCisgKiBjb250aW51b3VzKSBpcyBub3QgbWV0LiBBIG1hc2tpbmcgYWxnb3JpdGhtIHRoYXQgZG9lcyBwcmVzZXJ2ZSB0aGUgc2Vjb25kCisgKiBib3VuZGFyeSBjb3VuZGl0aW9uIChwZXJoYXBzIHNvbWV0aGluZyBiYXNlZCBvbiBhIGhpZ2hseS1tb2RpZmllZCBiaS1jdWJpYworICogYWxnb3JpdGhtKSBzaG91bGQgb2ZmZXIgZXZlbiBiZXR0ZXIgcmVzdWx0cyBvbiBwYXBlciwgYnV0IHRoZSBub2lzZSBpbiBhCisgKiB0eXBpY2FsIFRWIHNpZ25hbCBzaG91bGQgbWFrZSBhbnl0aGluZyBiYXNlZCBvbiBkZXJpdmF0aXZlcyBob3BlbGVzc2x5IG5vaXN5LgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorI2luY2x1ZGUgImJib3guaCIKKyNpbmNsdWRlICJsYXZmdXRpbHMuaCIKKyNpbmNsdWRlICJsc3dzdXRpbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGNoYXIgKmZpbGVuYW1lOworICAgIC8qIFN0b3JlcyBvdXIgY29sbGVjdGlvbiBvZiBtYXNrcy4gVGhlIGZpcnN0IGlzIGZvciBhbiBhcnJheSBvZgorICAgICAgIHRoZSBzZWNvbmQgZm9yIHRoZSB5IGF4aXMsIGFuZCB0aGUgdGhpcmQgZm9yIHRoZSB4IGF4aXMuICovCisgICAgaW50ICoqKm1hc2s7CisgICAgaW50IG1heF9tYXNrX3NpemU7CisgICAgaW50IG1hc2tfdywgbWFza19oOworCisgICAgdWludDhfdCAgICAgICpmdWxsX21hc2tfZGF0YTsKKyAgICBGRkJvdW5kaW5nQm94IGZ1bGxfbWFza19iYm94OworICAgIHVpbnQ4X3QgICAgICAqaGFsZl9tYXNrX2RhdGE7CisgICAgRkZCb3VuZGluZ0JveCBoYWxmX21hc2tfYmJveDsKK30gUmVtb3ZlbG9nb0NvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFJlbW92ZWxvZ29Db250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiByZW1vdmVsb2dvX29wdGlvbnNbXSA9IHsKKyAgICB7ICJmaWxlbmFtZSIsICJzZXQgYml0bWFwIGZpbGVuYW1lIiwgT0ZGU0VUKGZpbGVuYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJmIiwgICAgICAgICJzZXQgYml0bWFwIGZpbGVuYW1lIiwgT0ZGU0VUKGZpbGVuYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHJlbW92ZWxvZ28pOworCisvKioKKyAqIENob29zZSBhIHNsaWdodGx5IGxhcmdlciBtYXNrIHNpemUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1hcHMgdGhlIGFic29sdXRlIG1pbmltdW0gbWFzayBzaXplIG5lZWRlZCB0byB0aGUKKyAqIG1hc2sgc2l6ZSB3ZSdsbCBhY3R1YWxseSB1c2UuIGYoeCkgPSB4ICh0aGUgc21hbGxlc3QgdGhhdCB3aWxsCisgKiB3b3JrKSB3aWxsIHByb2R1Y2UgdGhlIHNoYXJwZXN0IHJlc3VsdHMsIGJ1dCB3aWxsIGJlIHF1aXRlCisgKiBqaXR0ZXJ5LiBmKHgpID0gMS4yNXggKHdoYXQgSSdtIHVzaW5nKSBpcyBhIGdvb2QgdHJhZGVvZmYgaW4gbXkKKyAqIG9waW5pb24uIFRoaXMgd2lsbCBjYWxjdWxhdGUgb25seSBhdCBpbml0LXRpbWUsIHNvIHlvdSBjYW4gcHV0IGEKKyAqIGxvbmcgZXhwcmVzc2lvbiBoZXJlIHdpdGhvdXQgZWZmZWN0aW5nIHBlcmZvcm1hbmNlLgorICovCisjZGVmaW5lIGFwcGx5X21hc2tfZnVkZ2VfZmFjdG9yKHgpICgoKHgpID4+IDIpICsgeCkKKworLyoqCisgKiBQcmUtcHJvY2VzcyBhbiBpbWFnZSB0byBnaXZlIGRpc3RhbmNlIGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBiaXRtYXAgaW1hZ2UgYW5kIGNvbnZlcnRzIGl0IGluIHBsYWNlIGludG8gYQorICogZGlzdGFuY2UgaW1hZ2UuIEEgZGlzdGFuY2UgaW1hZ2UgaXMgemVybyBmb3IgcGl4ZWxzIG91dHNpZGUgb2YgdGhlCisgKiBsb2dvIGFuZCBpcyB0aGUgTWFuaGF0dGFuIGRpc3RhbmNlICh8ZHh8ICsgfGR5fCkgZnJvbSB0aGUgbG9nbyBlZGdlCisgKiBmb3IgcGl4ZWxzIGluc2lkZSBvZiB0aGUgbG9nby4gVGhpcyB3aWxsIG92ZXJlc3RpbWF0ZSB0aGUgZGlzdGFuY2UsCisgKiBidXQgdGhhdCBpcyBzYWZlLCBhbmQgaXMgZmFyIGVhc2llciB0byBpbXBsZW1lbnQgdGhhbiBhIHByb3BlcgorICogcHl0aGFnb3JlYW4gZGlzdGFuY2Ugc2luY2UgSSdtIHVzaW5nIGEgbW9kaWZpZWQgZXJvc2lvbiBhbGdvcml0aG0KKyAqIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlcy4KKyAqCisgKiBAcGFyYW0gbWFzayBpbWFnZSB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCBmcm9tIGEgZ3JleXNjYWxlIGltYWdlCisgKiBpbnRvIGEgZGlzdGFuY2UgaW1hZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGNvbnZlcnRfbWFza190b19zdHJlbmd0aF9tYXNrKHVpbnQ4X3QgKmRhdGEsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG1pbl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm1heF9tYXNrX3NpemUpCit7CisgICAgaW50IHgsIHk7CisKKyAgICAvKiBIb3cgbWFueSB0aW1lcyB3ZSd2ZSBnb25lIHRocm91Z2ggdGhlIGxvb3AuIFVzZWQgaW4gdGhlCisgICAgICAgaW4tcGxhY2UgZXJvc2lvbiBhbGdvcml0aG0gYW5kIHRvIGdldCB1cyBtYXhfbWFza19zaXplIGxhdGVyIG9uLiAqLworICAgIGludCBjdXJyZW50X3Bhc3MgPSAwOworCisgICAgLyogc2V0IGFsbCBub24temVybyB2YWx1ZXMgdG8gMSAqLworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICBkYXRhW3kqbGluZXNpemUgKyB4XSA9IGRhdGFbeSpsaW5lc2l6ZSArIHhdID4gbWluX3ZhbDsKKworICAgIC8qIEZvciBlYWNoIHBhc3MsIGlmIGEgcGl4ZWwgaXMgaXRzZWxmIHRoZSBzYW1lIHZhbHVlIGFzIHRoZQorICAgICAgIGN1cnJlbnQgcGFzcywgYW5kIGl0cyBmb3VyIG5laWdoYm9ycyBhcmUgdG9vLCB0aGVuIGl0IGlzCisgICAgICAgaW5jcmVtZW50ZWQuIElmIG5vIHBpeGVscyBhcmUgaW5jcmVtZW50ZWQgYnkgdGhlIGVuZCBvZiB0aGUKKyAgICAgICBwYXNzLCB0aGVuIHdlIGdvIGFnYWluLiBFZGdlIHBpeGVscyBhcmUgY291bnRlZCBhcyBhbHdheXMKKyAgICAgICBleGNsdWRlZCAodGhpcyBzaG91bGQgYmUgdHJ1ZSBhbnl3YXkgZm9yIGFueSBzYW5lIG1hc2ssIGJ1dCBpZgorICAgICAgIGl0IGlzbid0IHRoaXMgd2lsbCBlbnN1cmUgdGhhdCB3ZSBldmVudHVhbGx5IGV4aXQpLiAqLworICAgIHdoaWxlICgxKSB7CisgICAgICAgIC8qIElmIHRoaXMgZG9lc24ndCBnZXQgc2V0IGJ5IHRoZSBlbmQgb2YgdGhpcyBwYXNzLCB0aGVuIHdlJ3JlIGRvbmUuICovCisgICAgICAgIGludCBoYXNfYW55dGhpbmdfY2hhbmdlZCA9IDA7CisgICAgICAgIHVpbnQ4X3QgKmN1cnJlbnRfcGl4ZWwwID0gZGF0YSArIDEgKyBsaW5lc2l6ZSwgKmN1cnJlbnRfcGl4ZWw7CisgICAgICAgIGN1cnJlbnRfcGFzcysrOworCisgICAgICAgIGZvciAoeSA9IDE7IHkgPCBoLTE7IHkrKykgeworICAgICAgICAgICAgY3VycmVudF9waXhlbCA9IGN1cnJlbnRfcGl4ZWwwOworICAgICAgICAgICAgZm9yICh4ID0gMTsgeCA8IHctMTsgeCsrKSB7CisgICAgICAgICAgICAgICAgLyogQXBwbHkgdGhlIGluLXBsYWNlIGVyb3Npb24gdHJhbnNmb3JtLiBJdCBpcyBiYXNlZAorICAgICAgICAgICAgICAgICAgIG9uIHRoZSBmb2xsb3dpbmcgdHdvIHByZW1pc2VzOgorICAgICAgICAgICAgICAgICAgIDEgLSBBbnkgcGl4ZWwgdGhhdCBmYWlscyAxIGVyb3Npb24gd2lsbCBmYWlsIGFsbAorICAgICAgICAgICAgICAgICAgICAgICBmdXR1cmUgZXJvc2lvbnMuCisKKyAgICAgICAgICAgICAgICAgICAyIC0gT25seSBwaXhlbHMgaGF2aW5nIHN1cnZpdmVkIGFsbCBlcm9zaW9ucyB1cCB0bworICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJlc2VudCB3aWxsIGJlID49IHRvIGN1cnJlbnRfcGFzcy4KKyAgICAgICAgICAgICAgICAgICBJdCBkb2Vzbid0IG1hdHRlciBpZiBpdCBzdXJ2aXZlZCB0aGUgY3VycmVudCBwYXNzLAorICAgICAgICAgICAgICAgICAgIGZhaWxlZCBpdCwgb3IgaGFzbid0IGJlZW4gdGVzdGVkIHlldC4gIEJ5IHVzaW5nID49CisgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiA9PSwgd2UgYWxsb3cgdGhlIGFsZ29yaXRobSB0byB3b3JrIGluCisgICAgICAgICAgICAgICAgICAgcGxhY2UuICovCisgICAgICAgICAgICAgICAgaWYgKCAqY3VycmVudF9waXhlbCAgICAgID49IGN1cnJlbnRfcGFzcyAmJgorICAgICAgICAgICAgICAgICAgICAqKGN1cnJlbnRfcGl4ZWwgKyAxKSA+PSBjdXJyZW50X3Bhc3MgJiYKKyAgICAgICAgICAgICAgICAgICAgKihjdXJyZW50X3BpeGVsIC0gMSkgPj0gY3VycmVudF9wYXNzICYmCisgICAgICAgICAgICAgICAgICAgICooY3VycmVudF9waXhlbCArIGxpbmVzaXplKSA+PSBjdXJyZW50X3Bhc3MgJiYKKyAgICAgICAgICAgICAgICAgICAgKihjdXJyZW50X3BpeGVsIC0gbGluZXNpemUpID49IGN1cnJlbnRfcGFzcykgeworICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIHZhbHVlIHNpbmNlIGl0IHN0aWxsIGhhcyBub3QgYmVlbgorICAgICAgICAgICAgICAgICAgICAgKiBlcm9kZWQsIGFzIGV2aWRlbmNlZCBieSB0aGUgaWYgc3RhdGVtZW50IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICoganVzdCBldmFsdWF0ZWQgdG8gdHJ1ZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgKCpjdXJyZW50X3BpeGVsKSsrOworICAgICAgICAgICAgICAgICAgICBoYXNfYW55dGhpbmdfY2hhbmdlZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN1cnJlbnRfcGl4ZWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnRfcGl4ZWwwICs9IGxpbmVzaXplOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzX2FueXRoaW5nX2NoYW5nZWQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBBcHBseSB0aGUgZnVkZ2UgZmFjdG9yLCB3aGljaCB3aWxsIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZQorICAgICAqIG1hc2sgYSBsaXR0bGUgdG8gcmVkdWNlIGppdHRlciBhdCB0aGUgY29zdCBvZiBtb3JlIGJsdXIuICovCisgICAgZm9yICh5ID0gMTsgeSA8IGggLSAxOyB5KyspCisgICAgICAgIGZvciAoeCA9IDE7IHggPCB3IC0gMTsgeCsrKQorICAgICAgICAgICAgZGF0YVsoeSAqIGxpbmVzaXplKSArIHhdID0gYXBwbHlfbWFza19mdWRnZV9mYWN0b3IoZGF0YVsoeSAqIGxpbmVzaXplKSArIHhdKTsKKworICAgIC8qIEFzIGEgc2lkZS1lZmZlY3QsIHdlIG5vdyBrbm93IHRoZSBtYXhpbXVtIG1hc2sgc2l6ZSwgd2hpY2gKKyAgICAgKiB3ZSdsbCB1c2UgdG8gZ2VuZXJhdGUgb3VyIG1hc2tzLiAqLworICAgIC8qIEFwcGx5IHRoZSBmdWRnZSBmYWN0b3IgdG8gdGhpcyBudW1iZXIgdG9vLCBzaW5jZSB3ZSBtdXN0IGVuc3VyZQorICAgICAqIHRoYXQgZW5vdWdoIG1hc2tzIGFyZSBnZW5lcmF0ZWQuICovCisgICAgKm1heF9tYXNrX3NpemUgPSBhcHBseV9tYXNrX2Z1ZGdlX2ZhY3RvcihjdXJyZW50X3Bhc3MgKyAxKTsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX05PTkUgfTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG9hZF9tYXNrKHVpbnQ4X3QgKiptYXNrLCBpbnQgKncsIGludCAqaCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpsb2dfY3R4KQoreworICAgIGludCByZXQ7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgdWludDhfdCAqc3JjX2RhdGFbNF0sICpncmF5X2RhdGFbNF07CisgICAgaW50IHNyY19saW5lc2l6ZVs0XSwgZ3JheV9saW5lc2l6ZVs0XTsKKworICAgIC8qIGxvYWQgaW1hZ2UgZnJvbSBmaWxlICovCisgICAgaWYgKChyZXQgPSBmZl9sb2FkX2ltYWdlKHNyY19kYXRhLCBzcmNfbGluZXNpemUsIHcsIGgsICZwaXhfZm10LCBmaWxlbmFtZSwgbG9nX2N0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGNvbnZlcnQgdGhlIGltYWdlIHRvIEdSQVk4ICovCisgICAgaWYgKChyZXQgPSBmZl9zY2FsZV9pbWFnZShncmF5X2RhdGEsIGdyYXlfbGluZXNpemUsICp3LCAqaCwgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kYXRhLCBzcmNfbGluZXNpemUsICp3LCAqaCwgcGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19jdHgpKSA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgLyogY29weSBtYXNrIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGFycmF5ICovCisgICAgKm1hc2sgPSBhdl9tYWxsb2MoKncgKiAqaCk7CisgICAgaWYgKCEqbWFzaykKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoKm1hc2ssICp3LCBncmF5X2RhdGFbMF0sIGdyYXlfbGluZXNpemVbMF0sICp3LCAqaCk7CisKK2VuZDoKKyAgICBhdl9mcmVlcCgmc3JjX2RhdGFbMF0pOworICAgIGF2X2ZyZWVwKCZncmF5X2RhdGFbMF0pOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBzY2FsZWQgZG93biBpbWFnZSB3aXRoIGhhbGYgd2lkdGgsIGhlaWdodCwgYW5kIGludGVuc2l0eS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG5vdCBvbmx5IHNjYWxlcyBkb3duIGFuIGltYWdlLCBidXQgaGFsdmVzIHRoZSB2YWx1ZQorICogaW4gZWFjaCBwaXhlbCB0b28uIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gcHJvZHVjZSBhIGNocm9tYQorICogZmlsdGVyIGltYWdlIG91dCBvZiBhIGx1bWEgZmlsdGVyIGltYWdlLiBUaGUgcGl4ZWwgdmFsdWVzIHN0b3JlIHRoZQorICogZGlzdGFuY2UgdG8gdGhlIGVkZ2Ugb2YgdGhlIGxvZ28gYW5kIGhhbHZpbmcgdGhlIGRpbWVuc2lvbnMgaGFsdmVzCisgKiB0aGUgZGlzdGFuY2UuIFRoaXMgZnVuY3Rpb24gcm91bmRzIHVwLCBiZWNhdXNlIGEgZG93bndhcmRzIHJvdW5kaW5nCisgKiBlcnJvciBjb3VsZCBjYXVzZSB0aGUgZmlsdGVyIHRvIGZhaWwsIGJ1dCBhbiB1cHdhcmRzIHJvdW5kaW5nIGVycm9yCisgKiB3aWxsIG9ubHkgY2F1c2UgYSBtaW5vciBhbW91bnQgb2YgZXhjZXNzIGJsdXIgaW4gdGhlIGNocm9tYSBwbGFuZXMuCisgKi8KK3N0YXRpYyB2b2lkIGdlbmVyYXRlX2hhbGZfc2l6ZV9pbWFnZShjb25zdCB1aW50OF90ICpzcmNfZGF0YSwgaW50IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RfZGF0YSwgaW50IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3csIGludCBzcmNfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm1heF9tYXNrX3NpemUpCit7CisgICAgaW50IHgsIHk7CisKKyAgICAvKiBDb3B5IG92ZXIgdGhlIGltYWdlIGRhdGEsIHVzaW5nIHRoZSBhdmVyYWdlIG9mIDQgcGl4ZWxzIGZvciB0bworICAgICAqIGNhbGN1bGF0ZSBlYWNoIGRvd25zYW1wbGVkIHBpeGVsLiAqLworICAgIGZvciAoeSA9IDA7IHkgPCBzcmNfaC8yOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNyY193LzI7IHgrKykgeworICAgICAgICAgICAgLyogU2V0IHRoZSBwaXhlbCBpZiB0aGVyZSBleGlzdHMgYSBub24temVybyB2YWx1ZSBpbiB0aGUKKyAgICAgICAgICAgICAqIHNvdXJjZSBwaXhlbHMsIGVsc2UgY2xlYXIgaXQuICovCisgICAgICAgICAgICBkc3RfZGF0YVsoeSAqIGRzdF9saW5lc2l6ZSkgKyB4XSA9CisgICAgICAgICAgICAgICAgc3JjX2RhdGFbKCh5IDw8IDEpICogc3JjX2xpbmVzaXplKSArICh4IDw8IDEpXSB8fAorICAgICAgICAgICAgICAgIHNyY19kYXRhWygoeSA8PCAxKSAqIHNyY19saW5lc2l6ZSkgKyAoeCA8PCAxKSArIDFdIHx8CisgICAgICAgICAgICAgICAgc3JjX2RhdGFbKCgoeSA8PCAxKSArIDEpICogc3JjX2xpbmVzaXplKSArICh4IDw8IDEpXSB8fAorICAgICAgICAgICAgICAgIHNyY19kYXRhWygoKHkgPDwgMSkgKyAxKSAqIHNyY19saW5lc2l6ZSkgKyAoeCA8PCAxKSArIDFdOworICAgICAgICAgICAgZHN0X2RhdGFbKHkgKiBkc3RfbGluZXNpemUpICsgeF0gPSBGRk1JTigxLCBkc3RfZGF0YVsoeSAqIGRzdF9saW5lc2l6ZSkgKyB4XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb252ZXJ0X21hc2tfdG9fc3RyZW5ndGhfbWFzayhkc3RfZGF0YSwgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY193LzIsIHNyY19oLzIsIDAsIG1heF9tYXNrX3NpemUpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBSZW1vdmVsb2dvQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgKioqbWFzazsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgYSwgYiwgYywgdywgaDsKKyAgICBpbnQgZnVsbF9tYXhfbWFza19zaXplLCBoYWxmX21heF9tYXNrX3NpemU7CisKKyAgICBpZiAoIXMtPmZpbGVuYW1lKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlRoZSBiaXRtYXAgZmlsZSBuYW1lIGlzIG1hbmRhdG9yeVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogTG9hZCBvdXIgbWFzayBpbWFnZS4gKi8KKyAgICBpZiAoKHJldCA9IGxvYWRfbWFzaygmcy0+ZnVsbF9tYXNrX2RhdGEsICZ3LCAmaCwgcy0+ZmlsZW5hbWUsIGN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzLT5tYXNrX3cgPSB3OworICAgIHMtPm1hc2tfaCA9IGg7CisKKyAgICBjb252ZXJ0X21hc2tfdG9fc3RyZW5ndGhfbWFzayhzLT5mdWxsX21hc2tfZGF0YSwgdywgdywgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgJmZ1bGxfbWF4X21hc2tfc2l6ZSk7CisKKyAgICAvKiBDcmVhdGUgdGhlIHNjYWxlZCBkb3duIG1hc2sgaW1hZ2UgZm9yIHRoZSBjaHJvbWEgcGxhbmVzLiAqLworICAgIGlmICghKHMtPmhhbGZfbWFza19kYXRhID0gYXZfbWFsbG9jeih3LzIgKiBoLzIpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBnZW5lcmF0ZV9oYWxmX3NpemVfaW1hZ2Uocy0+ZnVsbF9tYXNrX2RhdGEsIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhhbGZfbWFza19kYXRhLCB3LzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIGgsICZoYWxmX21heF9tYXNrX3NpemUpOworCisgICAgcy0+bWF4X21hc2tfc2l6ZSA9IEZGTUFYKGZ1bGxfbWF4X21hc2tfc2l6ZSwgaGFsZl9tYXhfbWFza19zaXplKTsKKworICAgIC8qIENyZWF0ZSBhIGNpcmN1bGFyIG1hc2sgZm9yIGVhY2ggc2l6ZSB1cCB0byBtYXhfbWFza19zaXplLiBXaGVuCisgICAgICAgdGhlIGZpbHRlciBpcyBhcHBsaWVkLCB0aGUgbWFzayBzaXplIGlzIGRldGVybWluZWQgb24gYSBwaXhlbAorICAgICAgIGJ5IHBpeGVsIGJhc2lzLCB3aXRoIHBpeGVscyBuZWFyZXIgdGhlIGVkZ2Ugb2YgdGhlIGxvZ28gZ2V0dGluZworICAgICAgIHNtYWxsZXIgbWFzayBzaXplcy4gKi8KKyAgICBtYXNrID0gKGludCAqKiopYXZfbWFsbG9jX2FycmF5KHMtPm1heF9tYXNrX3NpemUgKyAxLCBzaXplb2YoaW50ICoqKSk7CisgICAgaWYgKCFtYXNrKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChhID0gMDsgYSA8PSBzLT5tYXhfbWFza19zaXplOyBhKyspIHsKKyAgICAgICAgbWFza1thXSA9IChpbnQgKiopYXZfbWFsbG9jX2FycmF5KChhICogMikgKyAxLCBzaXplb2YoaW50ICopKTsKKyAgICAgICAgaWYgKCFtYXNrW2FdKSB7CisgICAgICAgICAgICBhdl9mcmVlKG1hc2spOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGIgPSAtYTsgYiA8PSBhOyBiKyspIHsKKyAgICAgICAgICAgIG1hc2tbYV1bYiArIGFdID0gKGludCAqKWF2X21hbGxvY19hcnJheSgoYSAqIDIpICsgMSwgc2l6ZW9mKGludCkpOworICAgICAgICAgICAgaWYgKCFtYXNrW2FdW2IgKyBhXSkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUobWFzayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoYyA9IC1hOyBjIDw9IGE7IGMrKykgeworICAgICAgICAgICAgICAgIGlmICgoYiAqIGIpICsgKGMgKiBjKSA8PSAoYSAqIGEpKSAvKiBDaXJjdWxhciAwLzEgbWFzay4gKi8KKyAgICAgICAgICAgICAgICAgICAgbWFza1thXVtiICsgYV1bYyArIGFdID0gMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1hc2tbYV1bYiArIGFdW2MgKyBhXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+bWFzayA9IG1hc2s7CisKKyAgICAvKiBDYWxjdWxhdGUgb3VyIGJvdW5kaW5nIHJlY3RhbmdsZXMsIHdoaWNoIGRldGVybWluZSBpbiB3aGF0CisgICAgICogcmVnaW9uIHRoZSBsb2dvIHJlc2lkZXMgZm9yIGZhc3RlciBwcm9jZXNzaW5nLiAqLworICAgIGZmX2NhbGN1bGF0ZV9ib3VuZGluZ19ib3goJnMtPmZ1bGxfbWFza19iYm94LCBzLT5mdWxsX21hc2tfZGF0YSwgdywgdywgaCwgMCk7CisgICAgZmZfY2FsY3VsYXRlX2JvdW5kaW5nX2JveCgmcy0+aGFsZl9tYXNrX2Jib3gsIHMtPmhhbGZfbWFza19kYXRhLCB3LzIsIHcvMiwgaC8yLCAwKTsKKworI2RlZmluZSBTSE9XX0xPR09fSU5GTyhtYXNrX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAjbWFza190eXBlICIgeDE6JWQgeDI6JWQgeTE6JWQgeTI6JWQgbWF4X21hc2tfc2l6ZTolZFxuIiwgXAorICAgICAgICAgICBzLT5tYXNrX3R5cGUjI19tYXNrX2Jib3gueDEsIHMtPm1hc2tfdHlwZSMjX21hc2tfYmJveC54MiwgXAorICAgICAgICAgICBzLT5tYXNrX3R5cGUjI19tYXNrX2Jib3gueTEsIHMtPm1hc2tfdHlwZSMjX21hc2tfYmJveC55MiwgXAorICAgICAgICAgICBtYXNrX3R5cGUjI19tYXhfbWFza19zaXplKTsKKyAgICBTSE9XX0xPR09fSU5GTyhmdWxsKTsKKyAgICBTSE9XX0xPR09fSU5GTyhoYWxmKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wc19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFJlbW92ZWxvZ29Db250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKGlubGluay0+dyAhPSBzLT5tYXNrX3cgfHwgaW5saW5rLT5oICE9IHMtPm1hc2tfaCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICJNYXNrIGltYWdlIHNpemUgJWR4JWQgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgaW5wdXQgdmlkZW8gc2l6ZSAlZHglZFxuIiwKKyAgICAgICAgICAgICAgIHMtPm1hc2tfdywgcy0+bWFza19oLCBpbmxpbmstPncsIGlubGluay0+aCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQmx1ciBpbWFnZS4KKyAqCisgKiBJdCB0YWtlcyBhIHBpeGVsIHRoYXQgaXMgaW5zaWRlIHRoZSBtYXNrIGFuZCBibHVycyBpdC4gSXQgZG9lcyBzbworICogYnkgZmluZGluZyB0aGUgYXZlcmFnZSBvZiBhbGwgdGhlIHBpeGVscyB3aXRoaW4gdGhlIG1hc2sgYW5kCisgKiBvdXRzaWRlIG9mIHRoZSBtYXNrLgorICoKKyAqIEBwYXJhbSBtYXNrX2RhdGEgIHRoZSBtYXNrIHBsYW5lIHRvIHVzZSBmb3IgYXZlcmFnaW5nCisgKiBAcGFyYW0gaW1hZ2VfZGF0YSB0aGUgaW1hZ2UgcGxhbmUgdG8gYmx1cgorICogQHBhcmFtIHcgd2lkdGggb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gaCBoZWlnaHQgb2YgdGhlIGltYWdlCisgKiBAcGFyYW0geCB4LWNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsIHRvIGJsdXIKKyAqIEBwYXJhbSB5IHktY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwgdG8gYmx1cgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGJsdXJfcGl4ZWwoaW50ICoqKm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFza19kYXRhLCBpbnQgbWFza19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICppbWFnZV9kYXRhLCBpbnQgaW1hZ2VfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgeCwgaW50IHkpCit7CisgICAgLyogTWFzayBzaXplIHRlbGxzIGhvdyBsYXJnZSBhIGNpcmNsZSB0byB1c2UuIFRoZSByYWRpdXMgaXMgYWJvdXQKKyAgICAgKiAoc2xpZ2h0bHkgbGFyZ2VyIHRoYW4pIG1hc2sgc2l6ZS4gKi8KKyAgICBpbnQgbWFza19zaXplOworICAgIGludCBzdGFydF9wb3N4LCBzdGFydF9wb3N5LCBlbmRfcG9zeCwgZW5kX3Bvc3k7CisgICAgaW50IGksIGo7CisgICAgdW5zaWduZWQgaW50IGFjY3VtdWxhdG9yID0gMCwgZGl2aXNvciA9IDA7CisgICAgLyogV2hhdCBwaXhlbCB3ZSBhcmUgcmVhZGluZyBvdXQgb2YgdGhlIGNpcmN1bGFyIGJsdXIgbWFzay4gKi8KKyAgICBjb25zdCB1aW50OF90ICppbWFnZV9yZWFkX3Bvc2l0aW9uOworICAgIC8qIFdoYXQgcGl4ZWwgd2UgYXJlIHJlYWRpbmcgb3V0IG9mIHRoZSBmaWx0ZXIgaW1hZ2UuICovCisgICAgY29uc3QgdWludDhfdCAqbWFza19yZWFkX3Bvc2l0aW9uOworCisgICAgLyogUHJlcGFyZSBvdXIgYm91bmRpbmcgcmVjdGFuZ2xlIGFuZCBjbGlwIGl0IGlmIG5lZWQgYmUuICovCisgICAgbWFza19zaXplICA9IG1hc2tfZGF0YVt5ICogbWFza19saW5lc2l6ZSArIHhdOworICAgIHN0YXJ0X3Bvc3ggPSBGRk1BWCgwLCB4IC0gbWFza19zaXplKTsKKyAgICBzdGFydF9wb3N5ID0gRkZNQVgoMCwgeSAtIG1hc2tfc2l6ZSk7CisgICAgZW5kX3Bvc3ggICA9IEZGTUlOKHcgLSAxLCB4ICsgbWFza19zaXplKTsKKyAgICBlbmRfcG9zeSAgID0gRkZNSU4oaCAtIDEsIHkgKyBtYXNrX3NpemUpOworCisgICAgaW1hZ2VfcmVhZF9wb3NpdGlvbiA9IGltYWdlX2RhdGEgKyBpbWFnZV9saW5lc2l6ZSAqIHN0YXJ0X3Bvc3kgKyBzdGFydF9wb3N4OworICAgIG1hc2tfcmVhZF9wb3NpdGlvbiAgPSBtYXNrX2RhdGEgICsgbWFza19saW5lc2l6ZSAgKiBzdGFydF9wb3N5ICsgc3RhcnRfcG9zeDsKKworICAgIGZvciAoaiA9IHN0YXJ0X3Bvc3k7IGogPD0gZW5kX3Bvc3k7IGorKykgeworICAgICAgICBmb3IgKGkgPSBzdGFydF9wb3N4OyBpIDw9IGVuZF9wb3N4OyBpKyspIHsKKyAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoaXMgcGl4ZWwgaXMgaW4gdGhlIG1hc2sgb3Igbm90LiBPbmx5IHVzZSB0aGUKKyAgICAgICAgICAgICAqIHBpeGVsIGlmIGl0IGlzIG5vdC4gKi8KKyAgICAgICAgICAgIGlmICghKCptYXNrX3JlYWRfcG9zaXRpb24pICYmIG1hc2tbbWFza19zaXplXVtpIC0gc3RhcnRfcG9zeF1baiAtIHN0YXJ0X3Bvc3ldKSB7CisgICAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKz0gKmltYWdlX3JlYWRfcG9zaXRpb247CisgICAgICAgICAgICAgICAgZGl2aXNvcisrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbWFnZV9yZWFkX3Bvc2l0aW9uKys7CisgICAgICAgICAgICBtYXNrX3JlYWRfcG9zaXRpb24rKzsKKyAgICAgICAgfQorCisgICAgICAgIGltYWdlX3JlYWRfcG9zaXRpb24gKz0gKGltYWdlX2xpbmVzaXplIC0gKChlbmRfcG9zeCArIDEpIC0gc3RhcnRfcG9zeCkpOworICAgICAgICBtYXNrX3JlYWRfcG9zaXRpb24gICs9IChtYXNrX2xpbmVzaXplIC0gKChlbmRfcG9zeCArIDEpIC0gc3RhcnRfcG9zeCkpOworICAgIH0KKworICAgIC8qIElmIGRpdmlzb3IgaXMgMCwgaXQgbWVhbnMgdGhhdCBub3QgYSBzaW5nbGUgcGl4ZWwgaXMgb3V0c2lkZSBvZgorICAgICAgIHRoZSBsb2dvLCBzbyB3ZSBoYXZlIG5vIGRhdGEuICBFbHNlIHdlIG5lZWQgdG8gbm9ybWFsaXNlIHRoZQorICAgICAgIGRhdGEgdXNpbmcgdGhlIGRpdmlzb3IuICovCisgICAgcmV0dXJuIGRpdmlzb3IgPT0gMCA/IDI1NToKKyAgICAgICAgKGFjY3VtdWxhdG9yICsgKGRpdmlzb3IgLyAyKSkgLyBkaXZpc29yOyAgLyogZGl2aWRlLCB0YWtpbmcgaW50byBhY2NvdW50IGF2ZXJhZ2Ugcm91bmRpbmcgZXJyb3IgKi8KK30KKworLyoqCisgKiBCbHVyIGltYWdlIHBsYW5lIHVzaW5nIGEgbWFzay4KKyAqCisgKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byBoYXZlIGl0J3MgbG9nbyByZW1vdmVkLgorICogQHBhcmFtIGRlc3RpbmF0aW9uIFdoZXJlIHRoZSBvdXRwdXQgaW1hZ2Ugd2lsbCBiZSBzdG9yZWQuCisgKiBAcGFyYW0gc291cmNlX3N0cmlkZSBIb3cgZmFyIGFwYXJ0IChpbiBtZW1vcnkpIHR3byBjb25zZWN1dGl2ZSBsaW5lcyBhcmUuCisgKiBAcGFyYW0gZGVzdGluYXRpb24gU2FtZSBhcyBzb3VyY2Vfc3RyaWRlLCBidXQgZm9yIHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyAqIEBwYXJhbSB3aWR0aCBXaWR0aCBvZiB0aGUgaW1hZ2UuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIHNvdXJjZSBhbmQgZGVzdGluYXRpb24uCisgKiBAcGFyYW0gaGVpZ2h0IEhlaWdodCBvZiB0aGUgaW1hZ2UuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIHNvdXJjZSBhbmQgZGVzdGluYXRpb24uCisgKiBAcGFyYW0gaXNfaW1hZ2VfZGlyZWN0IElmIHRoZSBpbWFnZSBpcyBkaXJlY3QsIHRoZW4gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUKKyAqICAgICAgICB0aGUgc2FtZSBhbmQgd2UgY2FuIHNhdmUgYSBsb3Qgb2YgdGltZSBieSBub3QgY29weWluZyBwaXhlbHMgdGhhdAorICogICAgICAgIGhhdmVuJ3QgY2hhbmdlZC4KKyAqIEBwYXJhbSBmaWx0ZXIgVGhlIGltYWdlIHRoYXQgc3RvcmVzIHRoZSBkaXN0YW5jZSB0byB0aGUgZWRnZSBvZiB0aGUgbG9nbyBmb3IKKyAqICAgICAgICBlYWNoIHBpeGVsLgorICogQHBhcmFtIGxvZ29fc3RhcnRfeCBzbWFsbGVzdCB4LWNvb3JkaW5hdGUgdGhhdCBjb250YWlucyBhdCBsZWFzdCAxIGxvZ28gcGl4ZWwuCisgKiBAcGFyYW0gbG9nb19zdGFydF95IHNtYWxsZXN0IHktY29vcmRpbmF0ZSB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IDEgbG9nbyBwaXhlbC4KKyAqIEBwYXJhbSBsb2dvX2VuZF94ICAgbGFyZ2VzdCB4LWNvb3JkaW5hdGUgdGhhdCBjb250YWlucyBhdCBsZWFzdCAxIGxvZ28gcGl4ZWwuCisgKiBAcGFyYW0gbG9nb19lbmRfeSAgIGxhcmdlc3QgeS1jb29yZGluYXRlIHRoYXQgY29udGFpbnMgYXQgbGVhc3QgMSBsb2dvIHBpeGVsLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGFuIGVudGlyZSBwbGFuZS4gUGl4ZWxzIG91dHNpZGUgb2YgdGhlIGxvZ28gYXJlIGNvcGllZAorICogdG8gdGhlIG91dHB1dCB3aXRob3V0IGNoYW5nZSwgYW5kIHBpeGVscyBpbnNpZGUgdGhlIGxvZ28gaGF2ZSB0aGUgZGUtYmx1cnJpbmcKKyAqIGZ1bmN0aW9uIGFwcGxpZWQuCisgKi8KK3N0YXRpYyB2b2lkIGJsdXJfaW1hZ2UoaW50ICoqKm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19kYXRhLCAgaW50IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0X2RhdGEsICBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptYXNrX2RhdGEsIGludCBtYXNrX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBkaXJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIEZGQm91bmRpbmdCb3ggKmJib3gpCit7CisgICAgaW50IHgsIHk7CisgICAgdWludDhfdCAqZHN0X2xpbmU7CisgICAgY29uc3QgdWludDhfdCAqc3JjX2xpbmU7CisKKyAgICBpZiAoIWRpcmVjdCkKKyAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShkc3RfZGF0YSwgZHN0X2xpbmVzaXplLCBzcmNfZGF0YSwgc3JjX2xpbmVzaXplLCB3LCBoKTsKKworICAgIGZvciAoeSA9IGJib3gtPnkxOyB5IDw9IGJib3gtPnkyOyB5KyspIHsKKyAgICAgICAgc3JjX2xpbmUgPSBzcmNfZGF0YSArIHNyY19saW5lc2l6ZSAqIHk7CisgICAgICAgIGRzdF9saW5lID0gZHN0X2RhdGEgKyBkc3RfbGluZXNpemUgKiB5OworCisgICAgICAgIGZvciAoeCA9IGJib3gtPngxOyB4IDw9IGJib3gtPngyOyB4KyspIHsKKyAgICAgICAgICAgICBpZiAobWFza19kYXRhW3kgKiBtYXNrX2xpbmVzaXplICsgeF0pIHsKKyAgICAgICAgICAgICAgICAvKiBPbmx5IHByb2Nlc3MgaWYgd2UgYXJlIGluIHRoZSBtYXNrLiAqLworICAgICAgICAgICAgICAgICBkc3RfbGluZVt4XSA9IGJsdXJfcGl4ZWwobWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfZGF0YSwgbWFza19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoLCB4LCB5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogRWxzZSBqdXN0IGNvcHkgdGhlIGRhdGEuICovCisgICAgICAgICAgICAgICAgaWYgKCFkaXJlY3QpCisgICAgICAgICAgICAgICAgICAgIGRzdF9saW5lW3hdID0gc3JjX2xpbmVbeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnBpY3JlZikKK3sKKyAgICBSZW1vdmVsb2dvQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dHBpY3JlZjsKKyAgICBpbnQgZGlyZWN0ID0gMDsKKworICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShpbnBpY3JlZikpIHsKKyAgICAgICAgZGlyZWN0ID0gMTsKKyAgICAgICAgb3V0cGljcmVmID0gaW5waWNyZWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cGljcmVmID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICAgICAgaWYgKCFvdXRwaWNyZWYpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlucGljcmVmKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXRwaWNyZWYsIGlucGljcmVmKTsKKyAgICB9CisKKyAgICBibHVyX2ltYWdlKHMtPm1hc2ssCisgICAgICAgICAgICAgICBpbnBpY3JlZiAtPmRhdGFbMF0sIGlucGljcmVmIC0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICBvdXRwaWNyZWYtPmRhdGFbMF0sIG91dHBpY3JlZi0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICBzLT5mdWxsX21hc2tfZGF0YSwgaW5saW5rLT53LAorICAgICAgICAgICAgICAgaW5saW5rLT53LCBpbmxpbmstPmgsIGRpcmVjdCwgJnMtPmZ1bGxfbWFza19iYm94KTsKKyAgICBibHVyX2ltYWdlKHMtPm1hc2ssCisgICAgICAgICAgICAgICBpbnBpY3JlZiAtPmRhdGFbMV0sIGlucGljcmVmIC0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICBvdXRwaWNyZWYtPmRhdGFbMV0sIG91dHBpY3JlZi0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICBzLT5oYWxmX21hc2tfZGF0YSwgaW5saW5rLT53LzIsCisgICAgICAgICAgICAgICBpbmxpbmstPncvMiwgaW5saW5rLT5oLzIsIGRpcmVjdCwgJnMtPmhhbGZfbWFza19iYm94KTsKKyAgICBibHVyX2ltYWdlKHMtPm1hc2ssCisgICAgICAgICAgICAgICBpbnBpY3JlZiAtPmRhdGFbMl0sIGlucGljcmVmIC0+bGluZXNpemVbMl0sCisgICAgICAgICAgICAgICBvdXRwaWNyZWYtPmRhdGFbMl0sIG91dHBpY3JlZi0+bGluZXNpemVbMl0sCisgICAgICAgICAgICAgICBzLT5oYWxmX21hc2tfZGF0YSwgaW5saW5rLT53LzIsCisgICAgICAgICAgICAgICBpbmxpbmstPncvMiwgaW5saW5rLT5oLzIsIGRpcmVjdCwgJnMtPmhhbGZfbWFza19iYm94KTsKKworICAgIGlmICghZGlyZWN0KQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnBpY3JlZik7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dHBpY3JlZik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFJlbW92ZWxvZ29Db250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBhLCBiOworCisgICAgYXZfZnJlZXAoJnMtPmZ1bGxfbWFza19kYXRhKTsKKyAgICBhdl9mcmVlcCgmcy0+aGFsZl9tYXNrX2RhdGEpOworCisgICAgaWYgKHMtPm1hc2spIHsKKyAgICAgICAgLyogTG9vcCB0aHJvdWdoIGVhY2ggbWFzay4gKi8KKyAgICAgICAgZm9yIChhID0gMDsgYSA8PSBzLT5tYXhfbWFza19zaXplOyBhKyspIHsKKyAgICAgICAgICAgIC8qIExvb3AgdGhyb3VnaCBlYWNoIHNjYW5saW5lIGluIGEgbWFzay4gKi8KKyAgICAgICAgICAgIGZvciAoYiA9IC1hOyBiIDw9IGE7IGIrKykgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5tYXNrW2FdW2IgKyBhXSk7IC8qIEZyZWUgYSBzY2FubGluZS4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5tYXNrW2FdKTsKKyAgICAgICAgfQorICAgICAgICAvKiBGcmVlIHRoZSBhcnJheSBvZiBwb2ludGVycyBwb2ludGluZyB0byB0aGUgbWFza3MuICovCisgICAgICAgIGF2X2ZyZWVwKCZzLT5tYXNrKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCByZW1vdmVsb2dvX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19wcm9wc19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgcmVtb3ZlbG9nb19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfcmVtb3ZlbG9nbyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJyZW1vdmVsb2dvIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZW1vdmUgYSBUViBsb2dvIGJhc2VkIG9uIGEgbWFzayBpbWFnZS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihSZW1vdmVsb2dvQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IHJlbW92ZWxvZ29faW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gcmVtb3ZlbG9nb19vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnJlbW92ZWxvZ29fY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfcm90YXRlLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfcm90YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlYzc0MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9yb3RhdGUuYwpAQCAtMCwwICsxLDU2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBTdGVmYW5vIFNhYmF0aW5pCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVml0b3IgU2Vzc2FrCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHJvdGF0aW9uIGZpbHRlciwgcGFydGlhbGx5IGJhc2VkIG9uIHRoZSB0ZXN0cy9yb3Rvem9vbS5jIHByb2dyYW0KKyovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJkcmF3dXRpbHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJpbl93IiAsICJpdyIsICAvLy88IHdpZHRoIG9mIHRoZSBpbnB1dCB2aWRlbworICAgICJpbl9oIiAsICJpaCIsICAvLy88IGhlaWdodCBvZiB0aGUgaW5wdXQgdmlkZW8KKyAgICAib3V0X3ciLCAib3ciLCAgLy8vPCB3aWR0aCBvZiB0aGUgaW5wdXQgdmlkZW8KKyAgICAib3V0X2giLCAib2giLCAgLy8vPCBoZWlnaHQgb2YgdGhlIGlucHV0IHZpZGVvCisgICAgImhzdWIiLCAidnN1YiIsCisgICAgIm4iLCAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGZyYW1lCisgICAgInQiLCAgICAgICAgICAgIC8vLzwgdGltZXN0YW1wIGV4cHJlc3NlZCBpbiBzZWNvbmRzCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX0lOX1cgLCBWQVJfSVcsCisgICAgVkFSX0lOX0ggLCBWQVJfSUgsCisgICAgVkFSX09VVF9XLCBWQVJfT1csCisgICAgVkFSX09VVF9ILCBWQVJfT0gsCisgICAgVkFSX0hTVUIsIFZBUl9WU1VCLAorICAgIFZBUl9OLAorICAgIFZBUl9ULAorICAgIFZBUl9WQVJTX05CCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgZG91YmxlIGFuZ2xlOworICAgIGNoYXIgKmFuZ2xlX2V4cHJfc3RyOyAgIC8vLzwgZXhwcmVzc2lvbiBmb3IgdGhlIGFuZ2xlCisgICAgQVZFeHByICphbmdsZV9leHByOyAgICAgLy8vPCBwYXJzZWQgZXhwcmVzc2lvbiBmb3IgdGhlIGFuZ2xlCisgICAgY2hhciAqb3V0d19leHByX3N0ciwgKm91dGhfZXhwcl9zdHI7CisgICAgaW50IG91dGgsIG91dHc7CisgICAgdWludDhfdCBmaWxsY29sb3JbNF07ICAgLy8vPCBjb2xvciBleHByZXNzZWQgZWl0aGVyIGluIFlVVkEgb3IgUkdCQSBjb2xvcnNwYWNlIGZvciB0aGUgcGFkZGluZyBhcmVhCisgICAgY2hhciAqZmlsbGNvbG9yX3N0cjsKKyAgICBpbnQgZmlsbGNvbG9yX2VuYWJsZTsKKyAgICBpbnQgaHN1YiwgdnN1YjsKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCB1c2VfYmlsaW5lYXI7CisgICAgZmxvYXQgc2lueCwgY29zeDsKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJfVkFSU19OQl07CisgICAgRkZEcmF3Q29udGV4dCBkcmF3OworICAgIEZGRHJhd0NvbG9yIGNvbG9yOworfSBSb3RDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBUaHJlYWREYXRhIHsKKyAgICBBVkZyYW1lICppbiwgKm91dDsKKyAgICBpbnQgaW53LCAgaW5oOworICAgIGludCBvdXR3LCBvdXRoOworICAgIGludCBwbGFuZTsKKyAgICBpbnQgeGksIHlpOworICAgIGludCB4cHJpbWUsIHlwcmltZTsKKyAgICBpbnQgYywgczsKK30gVGhyZWFkRGF0YTsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUm90Q29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiByb3RhdGVfb3B0aW9uc1tdID0geworICAgIHsgImFuZ2xlIiwgICAgICJzZXQgYW5nbGUgKGluIHJhZGlhbnMpIiwgICAgICAgT0ZGU0VUKGFuZ2xlX2V4cHJfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iMCJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgImEiLCAgICAgICAgICJzZXQgYW5nbGUgKGluIHJhZGlhbnMpIiwgICAgICAgT0ZGU0VUKGFuZ2xlX2V4cHJfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iMCJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgIm91dF93IiwgICAgICJzZXQgb3V0cHV0IHdpZHRoIGV4cHJlc3Npb24iLCAgT0ZGU0VUKG91dHdfZXhwcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJpdyJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgIm93IiwgICAgICAgICJzZXQgb3V0cHV0IHdpZHRoIGV4cHJlc3Npb24iLCAgT0ZGU0VUKG91dHdfZXhwcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJpdyJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgIm91dF9oIiwgICAgICJzZXQgb3V0cHV0IGhlaWdodCBleHByZXNzaW9uIiwgT0ZGU0VUKG91dGhfZXhwcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJpaCJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgIm9oIiwgICAgICAgICJzZXQgb3V0cHV0IGhlaWdodCBleHByZXNzaW9uIiwgT0ZGU0VUKG91dGhfZXhwcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJpaCJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgImZpbGxjb2xvciIsICJzZXQgYmFja2dyb3VuZCBmaWxsIGNvbG9yIiwgICAgT0ZGU0VUKGZpbGxjb2xvcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJibGFjayJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgImMiLCAgICAgICAgICJzZXQgYmFja2dyb3VuZCBmaWxsIGNvbG9yIiwgICAgT0ZGU0VUKGZpbGxjb2xvcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJibGFjayJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgImJpbGluZWFyIiwgICJ1c2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiIsICAgT0ZGU0VUKHVzZV9iaWxpbmVhciksICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTF9LCAwLCAxLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHJvdGF0ZSk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFJvdENvbnRleHQgKnJvdCA9IGN0eC0+cHJpdjsKKworICAgIGlmICghc3RyY21wKHJvdC0+ZmlsbGNvbG9yX3N0ciwgIm5vbmUiKSkKKyAgICAgICAgcm90LT5maWxsY29sb3JfZW5hYmxlID0gMDsKKyAgICBlbHNlIGlmIChhdl9wYXJzZV9jb2xvcihyb3QtPmZpbGxjb2xvciwgcm90LT5maWxsY29sb3Jfc3RyLCAtMSwgY3R4KSA+PSAwKQorICAgICAgICByb3QtPmZpbGxjb2xvcl9lbmFibGUgPSAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUm90Q29udGV4dCAqcm90ID0gY3R4LT5wcml2OworCisgICAgYXZfZXhwcl9mcmVlKHJvdC0+YW5nbGVfZXhwcik7CisgICAgcm90LT5hbmdsZV9leHByID0gTlVMTDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIFBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgICBBVl9QSVhfRk1UX0dCUkFQLAorICAgICAgICBBVl9QSVhfRk1UX0FSR0IsICAgQVZfUElYX0ZNVF9SR0JBLAorICAgICAgICBBVl9QSVhfRk1UX0FCR1IsICAgQVZfUElYX0ZNVF9CR1JBLAorICAgICAgICBBVl9QSVhfRk1UXzBSR0IsICAgQVZfUElYX0ZNVF9SR0IwLAorICAgICAgICBBVl9QSVhfRk1UXzBCR1IsICAgQVZfUElYX0ZNVF9CR1IwLAorICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCAgQVZfUElYX0ZNVF9CR1IyNCwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsICBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgZG91YmxlIGdldF9yb3RhdGVkX3codm9pZCAqb3BhcXVlLCBkb3VibGUgYW5nbGUpCit7CisgICAgUm90Q29udGV4dCAqcm90ID0gb3BhcXVlOworICAgIGRvdWJsZSBpbncgPSByb3QtPnZhcl92YWx1ZXNbVkFSX0lOX1ddOworICAgIGRvdWJsZSBpbmggPSByb3QtPnZhcl92YWx1ZXNbVkFSX0lOX0hdOworICAgIGZsb2F0IHNpbnggPSBzaW4oYW5nbGUpOworICAgIGZsb2F0IGNvc3ggPSBjb3MoYW5nbGUpOworCisgICAgcmV0dXJuIEZGTUFYKDAsIGluaCAqIHNpbngpICsgRkZNQVgoMCwgLWludyAqIGNvc3gpICsKKyAgICAgICAgICAgRkZNQVgoMCwgaW53ICogY29zeCkgKyBGRk1BWCgwLCAtaW5oICogc2lueCk7Cit9CisKK3N0YXRpYyBkb3VibGUgZ2V0X3JvdGF0ZWRfaCh2b2lkICpvcGFxdWUsIGRvdWJsZSBhbmdsZSkKK3sKKyAgICBSb3RDb250ZXh0ICpyb3QgPSBvcGFxdWU7CisgICAgZG91YmxlIGludyA9IHJvdC0+dmFyX3ZhbHVlc1tWQVJfSU5fV107CisgICAgZG91YmxlIGluaCA9IHJvdC0+dmFyX3ZhbHVlc1tWQVJfSU5fSF07CisgICAgZmxvYXQgc2lueCA9IHNpbihhbmdsZSk7CisgICAgZmxvYXQgY29zeCA9IGNvcyhhbmdsZSk7CisKKyAgICByZXR1cm4gRkZNQVgoMCwgLWluaCAqIGNvc3gpICsgRkZNQVgoMCwgLWludyAqIHNpbngpICsKKyAgICAgICAgICAgRkZNQVgoMCwgIGluaCAqIGNvc3gpICsgRkZNQVgoMCwgIGludyAqIHNpbngpOworfQorCitzdGF0aWMgZG91YmxlICgqIGNvbnN0IGZ1bmMxW10pKHZvaWQgKiwgZG91YmxlKSA9IHsKKyAgICBnZXRfcm90YXRlZF93LAorICAgIGdldF9yb3RhdGVkX2gsCisgICAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmdW5jMV9uYW1lc1tdID0geworICAgICJyb3R3IiwKKyAgICAicm90aCIsCisgICAgTlVMTAorfTsKKworc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIFJvdENvbnRleHQgKnJvdCA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4ZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCByZXQ7CisgICAgZG91YmxlIHJlczsKKyAgICBjaGFyICpleHByOworCisgICAgZmZfZHJhd19pbml0KCZyb3QtPmRyYXcsIGlubGluay0+Zm9ybWF0LCAwKTsKKyAgICBmZl9kcmF3X2NvbG9yKCZyb3QtPmRyYXcsICZyb3QtPmNvbG9yLCByb3QtPmZpbGxjb2xvcik7CisKKyAgICByb3QtPmhzdWIgPSBwaXhkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHJvdC0+dnN1YiA9IHBpeGRlc2MtPmxvZzJfY2hyb21hX2g7CisKKyAgICByb3QtPnZhcl92YWx1ZXNbVkFSX0lOX1ddID0gcm90LT52YXJfdmFsdWVzW1ZBUl9JV10gPSBpbmxpbmstPnc7CisgICAgcm90LT52YXJfdmFsdWVzW1ZBUl9JTl9IXSA9IHJvdC0+dmFyX3ZhbHVlc1tWQVJfSUhdID0gaW5saW5rLT5oOworICAgIHJvdC0+dmFyX3ZhbHVlc1tWQVJfSFNVQl0gPSAxPDxyb3QtPmhzdWI7CisgICAgcm90LT52YXJfdmFsdWVzW1ZBUl9WU1VCXSA9IDE8PHJvdC0+dnN1YjsKKyAgICByb3QtPnZhcl92YWx1ZXNbVkFSX05dID0gTkFOOworICAgIHJvdC0+dmFyX3ZhbHVlc1tWQVJfVF0gPSBOQU47CisgICAgcm90LT52YXJfdmFsdWVzW1ZBUl9PVVRfV10gPSByb3QtPnZhcl92YWx1ZXNbVkFSX09XXSA9IE5BTjsKKyAgICByb3QtPnZhcl92YWx1ZXNbVkFSX09VVF9IXSA9IHJvdC0+dmFyX3ZhbHVlc1tWQVJfT0hdID0gTkFOOworCisgICAgYXZfZXhwcl9mcmVlKHJvdC0+YW5nbGVfZXhwcik7CisgICAgcm90LT5hbmdsZV9leHByID0gTlVMTDsKKyAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2UoJnJvdC0+YW5nbGVfZXhwciwgZXhwciA9IHJvdC0+YW5nbGVfZXhwcl9zdHIsIHZhcl9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzFfbmFtZXMsIGZ1bmMxLCBOVUxMLCBOVUxMLCAwLCBjdHgpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkVycm9yIG9jY3VycmVkIHBhcnNpbmcgYW5nbGUgZXhwcmVzc2lvbiAnJXMnXG4iLCByb3QtPmFuZ2xlX2V4cHJfc3RyKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyNkZWZpbmUgU0VUX1NJWkVfRVhQUihuYW1lLCBvcHRfbmFtZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgZXhwciA9IHJvdC0+bmFtZSMjX2V4cHJfc3RyLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIHJvdC0+dmFyX3ZhbHVlcywgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMxX25hbWVzLCBmdW5jMSwgTlVMTCwgTlVMTCwgcm90LCAwLCBjdHgpOyAgICAgXAorICAgIGlmIChyZXQgPCAwIHx8IGlzbmFuKHJlcykgfHwgaXNpbmYocmVzKSB8fCByZXMgPD0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIG9yIGV2YWx1YXRpbmcgZXhwcmVzc2lvbiBmb3Igb3B0aW9uICVzOiAiICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgImludmFsaWQgZXhwcmVzc2lvbiAnJXMnIG9yIG5vbi1wb3NpdGl2ZSBvciBpbmRlZmluaXRlIHZhbHVlICVmXG4iLCBcCisgICAgICAgICAgICAgICBvcHRfbmFtZSwgZXhwciwgcmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgLyogZXZhbHVhdGUgd2lkdGggYW5kIGhlaWdodCAqLworICAgIGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgZXhwciA9IHJvdC0+b3V0d19leHByX3N0ciwgdmFyX25hbWVzLCByb3QtPnZhcl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jMV9uYW1lcywgZnVuYzEsIE5VTEwsIE5VTEwsIHJvdCwgMCwgY3R4KTsKKyAgICByb3QtPnZhcl92YWx1ZXNbVkFSX09VVF9XXSA9IHJvdC0+dmFyX3ZhbHVlc1tWQVJfT1ddID0gcmVzOworICAgIHJvdC0+b3V0dyA9IHJlcyArIDAuNTsKKyAgICBTRVRfU0laRV9FWFBSKG91dGgsICJvdXRfdyIpOworICAgIHJvdC0+dmFyX3ZhbHVlc1tWQVJfT1VUX0hdID0gcm90LT52YXJfdmFsdWVzW1ZBUl9PSF0gPSByZXM7CisgICAgcm90LT5vdXRoID0gcmVzICsgMC41OworCisgICAgLyogZXZhbHVhdGUgdGhlIHdpZHRoIGFnYWluLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHRoZSBldmFsdWF0ZWQgb3V0cHV0IGhlaWdodCAqLworICAgIFNFVF9TSVpFX0VYUFIob3V0dywgIm91dF9oIik7CisgICAgcm90LT52YXJfdmFsdWVzW1ZBUl9PVVRfV10gPSByb3QtPnZhcl92YWx1ZXNbVkFSX09XXSA9IHJlczsKKyAgICByb3QtPm91dHcgPSByZXMgKyAwLjU7CisKKyAgICAvKiBjb21wdXRlIG51bWJlciBvZiBwbGFuZXMgKi8KKyAgICByb3QtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKyAgICBvdXRsaW5rLT53ID0gcm90LT5vdXR3OworICAgIG91dGxpbmstPmggPSByb3QtPm91dGg7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRklYUCAoMTw8MTYpCisjZGVmaW5lIEZJWFAyICgxPDwyMCkKKyNkZWZpbmUgSU5UX1BJIDMyOTQxOTkgLy8oTV9QSSAqIEZJWFAyKQorCisvKioKKyAqIENvbXB1dGUgdGhlIHNpbiBvZiBhIHVzaW5nIGludGVnZXIgdmFsdWVzLgorICogSW5wdXQgaXMgc2NhbGVkIGJ5IEZJWFAyIGFuZCBvdXRwdXQgdmFsdWVzIGFyZSBzY2FsZWQgYnkgRklYUC4KKyAqLworc3RhdGljIGludDY0X3QgaW50X3NpbihpbnQ2NF90IGEpCit7CisgICAgaW50NjRfdCBhMiwgcmVzID0gMDsKKyAgICBpbnQgaTsKKyAgICBpZiAoYSA8IDApIGEgPSBJTlRfUEktYTsgLy8gMC4uaW5mCisgICAgYSAlPSAyICogSU5UX1BJOyAgICAgICAgIC8vIDAuLjJQSQorCisgICAgaWYgKGEgPj0gSU5UX1BJKjMvMikgYSAtPSAyKklOVF9QSTsgIC8vIC1QSS8yIC4uIDNQSS8yCisgICAgaWYgKGEgPj0gSU5UX1BJLzIgICkgYSA9IElOVF9QSSAtIGE7IC8vIC1QSS8yIC4uICBQSS8yCisKKyAgICAvKiBjb21wdXRlIHNpbiB1c2luZyBUYXlsb3Igc2VyaWVzIGFwcHJveGltYXRlZCB0byB0aGUgZmlmdGggdGVybSAqLworICAgIGEyID0gKGEqYSkvKEZJWFAyKTsKKyAgICBmb3IgKGkgPSAyOyBpIDwgMTE7IGkgKz0gMikgeworICAgICAgICByZXMgKz0gYTsKKyAgICAgICAgYSA9IC1hKmEyIC8gKEZJWFAyKmkqKGkrMSkpOworICAgIH0KKyAgICByZXR1cm4gKHJlcyArIDgpPj40OworfQorCisvKioKKyAqIEludGVycG9sYXRlIHRoZSBjb2xvciBpbiBzcmMgYXQgcG9zaXRpb24geCBhbmQgeSB1c2luZyBiaWxpbmVhcgorICogaW50ZXJwb2xhdGlvbi4KKyAqLworc3RhdGljIHVpbnQ4X3QgKmludGVycG9sYXRlX2JpbGluZWFyKHVpbnQ4X3QgKmRzdF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGluZXNpemUsIGludCBzcmNfbGluZXN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgbWF4X3gsIGludCBtYXhfeSkKK3sKKyAgICBpbnQgaW50X3ggPSBhdl9jbGlwKHg+PjE2LCAwLCBtYXhfeCk7CisgICAgaW50IGludF95ID0gYXZfY2xpcCh5Pj4xNiwgMCwgbWF4X3kpOworICAgIGludCBmcmFjX3ggPSB4JjB4RkZGRjsKKyAgICBpbnQgZnJhY195ID0geSYweEZGRkY7CisgICAgaW50IGk7CisgICAgaW50IGludF94MSA9IEZGTUlOKGludF94KzEsIG1heF94KTsKKyAgICBpbnQgaW50X3kxID0gRkZNSU4oaW50X3krMSwgbWF4X3kpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNyY19saW5lc3RlcDsgaSsrKSB7CisgICAgICAgIGludCBzMDAgPSBzcmNbc3JjX2xpbmVzdGVwICogaW50X3ggICsgaSArIHNyY19saW5lc2l6ZSAqIGludF95IF07CisgICAgICAgIGludCBzMDEgPSBzcmNbc3JjX2xpbmVzdGVwICogaW50X3gxICsgaSArIHNyY19saW5lc2l6ZSAqIGludF95IF07CisgICAgICAgIGludCBzMTAgPSBzcmNbc3JjX2xpbmVzdGVwICogaW50X3ggICsgaSArIHNyY19saW5lc2l6ZSAqIGludF95MV07CisgICAgICAgIGludCBzMTEgPSBzcmNbc3JjX2xpbmVzdGVwICogaW50X3gxICsgaSArIHNyY19saW5lc2l6ZSAqIGludF95MV07CisgICAgICAgIGludCBzMCA9ICgoKDE8PDE2KSAtIGZyYWNfeCkqczAwICsgZnJhY194KnMwMSk7CisgICAgICAgIGludCBzMSA9ICgoKDE8PDE2KSAtIGZyYWNfeCkqczEwICsgZnJhY194KnMxMSk7CisKKyAgICAgICAgZHN0X2NvbG9yW2ldID0gKChpbnQ2NF90KSgoMTw8MTYpIC0gZnJhY195KSpzMCArIChpbnQ2NF90KWZyYWNfeSpzMSkgPj4gMzI7CisgICAgfQorCisgICAgcmV0dXJuIGRzdF9jb2xvcjsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBjb3B5X2VsZW0odWludDhfdCAqcG91dCwgY29uc3QgdWludDhfdCAqcGluLCBpbnQgZWxlbV9zaXplKQoreworICAgIGludCB2OworICAgIHN3aXRjaCAoZWxlbV9zaXplKSB7CisgICAgY2FzZSAxOgorICAgICAgICAqcG91dCA9ICpwaW47CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgKigodWludDE2X3QgKilwb3V0KSA9ICooKHVpbnQxNl90ICopcGluKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICB2ID0gQVZfUkIyNChwaW4pOworICAgICAgICBBVl9XQjI0KHBvdXQsIHYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgICooKHVpbnQzMl90ICopcG91dCkgPSAqKCh1aW50MzJfdCAqKXBpbik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG1lbWNweShwb3V0LCBwaW4sIGVsZW1fc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBzaW1wbGVfcm90YXRlX2ludGVybmFsKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLCBpbnQgYW5nbGUsIGludCBlbGVtX3NpemUsIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgc3dpdGNoKGFuZ2xlKSB7CisgICAgY2FzZSAwOgorICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGVsZW1fc2l6ZSAqIGxlbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZm9yIChpID0gMDsgaTxsZW47IGkrKykKKyAgICAgICAgICAgIGNvcHlfZWxlbShkc3QgKyBpKmVsZW1fc2l6ZSwgc3JjICsgKGxlbi1pLTEpKnNyY19saW5lc2l6ZSwgZWxlbV9zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBmb3IgKGkgPSAwOyBpPGxlbjsgaSsrKQorICAgICAgICAgICAgY29weV9lbGVtKGRzdCArIGkqZWxlbV9zaXplLCBzcmMgKyAobGVuLWktMSkqZWxlbV9zaXplLCBlbGVtX3NpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGZvciAoaSA9IDA7IGk8bGVuOyBpKyspCisgICAgICAgICAgICBjb3B5X2VsZW0oZHN0ICsgaSplbGVtX3NpemUsIHNyYyArIGkqc3JjX2xpbmVzaXplLCBlbGVtX3NpemUpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgc2ltcGxlX3JvdGF0ZSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19saW5lc2l6ZSwgaW50IGFuZ2xlLCBpbnQgZWxlbV9zaXplLCBpbnQgbGVuKQoreworICAgIHN3aXRjaChlbGVtX3NpemUpIHsKKyAgICBjYXNlIDEgOiBzaW1wbGVfcm90YXRlX2ludGVybmFsKGRzdCwgc3JjLCBzcmNfbGluZXNpemUsIGFuZ2xlLCAxLCBsZW4pOyBicmVhazsKKyAgICBjYXNlIDIgOiBzaW1wbGVfcm90YXRlX2ludGVybmFsKGRzdCwgc3JjLCBzcmNfbGluZXNpemUsIGFuZ2xlLCAyLCBsZW4pOyBicmVhazsKKyAgICBjYXNlIDMgOiBzaW1wbGVfcm90YXRlX2ludGVybmFsKGRzdCwgc3JjLCBzcmNfbGluZXNpemUsIGFuZ2xlLCAzLCBsZW4pOyBicmVhazsKKyAgICBjYXNlIDQgOiBzaW1wbGVfcm90YXRlX2ludGVybmFsKGRzdCwgc3JjLCBzcmNfbGluZXNpemUsIGFuZ2xlLCA0LCBsZW4pOyBicmVhazsKKyAgICBkZWZhdWx0OiBzaW1wbGVfcm90YXRlX2ludGVybmFsKGRzdCwgc3JjLCBzcmNfbGluZXNpemUsIGFuZ2xlLCBlbGVtX3NpemUsIGxlbik7IGJyZWFrOworICAgIH0KK30KKworI2RlZmluZSBUUzJUKHRzLCB0YikgKCh0cykgPT0gQVZfTk9QVFNfVkFMVUUgPyBOQU4gOiAoZG91YmxlKSh0cykqYXZfcTJkKHRiKSkKKworc3RhdGljIGludCBmaWx0ZXJfc2xpY2UoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYiwgaW50IG5iX2pvYnMpCit7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBSb3RDb250ZXh0ICpyb3QgPSBjdHgtPnByaXY7CisgICAgY29uc3QgaW50IG91dHcgPSB0ZC0+b3V0dywgb3V0aCA9IHRkLT5vdXRoOworICAgIGNvbnN0IGludCBpbncgPSB0ZC0+aW53LCBpbmggPSB0ZC0+aW5oOworICAgIGNvbnN0IGludCBwbGFuZSA9IHRkLT5wbGFuZTsKKyAgICBjb25zdCBpbnQgeGkgPSB0ZC0+eGksIHlpID0gdGQtPnlpOworICAgIGNvbnN0IGludCBjID0gdGQtPmMsIHMgPSB0ZC0+czsKKyAgICBjb25zdCBpbnQgc3RhcnQgPSAob3V0aCAqICBqb2IgICApIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgZW5kICAgPSAob3V0aCAqIChqb2IrMSkpIC8gbmJfam9iczsKKyAgICBpbnQgeHByaW1lID0gdGQtPnhwcmltZSArIHN0YXJ0ICogczsKKyAgICBpbnQgeXByaW1lID0gdGQtPnlwcmltZSArIHN0YXJ0ICogYzsKKyAgICBpbnQgaSwgaiwgeCwgeTsKKworICAgIGZvciAoaiA9IHN0YXJ0OyBqIDwgZW5kOyBqKyspIHsKKyAgICAgICAgeCA9IHhwcmltZSArIHhpICsgRklYUCooaW53LTEpLzI7CisgICAgICAgIHkgPSB5cHJpbWUgKyB5aSArIEZJWFAqKGluaC0xKS8yOworCisgICAgICAgIGlmIChmYWJzKHJvdC0+YW5nbGUgLSAwKSA8IEZMVF9FUFNJTE9OICYmIG91dHcgPT0gaW53ICYmIG91dGggPT0gaW5oKSB7CisgICAgICAgICAgICBzaW1wbGVfcm90YXRlKG91dC0+ZGF0YVtwbGFuZV0gKyBqICogb3V0LT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVtwbGFuZV0gKyBqICogIGluLT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5saW5lc2l6ZVtwbGFuZV0sIDAsIHJvdC0+ZHJhdy5waXhlbHN0ZXBbcGxhbmVdLCBvdXR3KTsKKyAgICAgICAgfSBlbHNlIGlmIChmYWJzKHJvdC0+YW5nbGUgLSBNX1BJLzIpIDwgRkxUX0VQU0lMT04gJiYgb3V0dyA9PSBpbmggJiYgb3V0aCA9PSBpbncpIHsKKyAgICAgICAgICAgIHNpbXBsZV9yb3RhdGUob3V0LT5kYXRhW3BsYW5lXSArIGogKiBvdXQtPmxpbmVzaXplW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhW3BsYW5lXSArIGogKiByb3QtPmRyYXcucGl4ZWxzdGVwW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmxpbmVzaXplW3BsYW5lXSwgMSwgcm90LT5kcmF3LnBpeGVsc3RlcFtwbGFuZV0sIG91dHcpOworICAgICAgICB9IGVsc2UgaWYgKGZhYnMocm90LT5hbmdsZSAtIE1fUEkpIDwgRkxUX0VQU0lMT04gJiYgb3V0dyA9PSBpbncgJiYgb3V0aCA9PSBpbmgpIHsKKyAgICAgICAgICAgIHNpbXBsZV9yb3RhdGUob3V0LT5kYXRhW3BsYW5lXSArIGogKiBvdXQtPmxpbmVzaXplW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhW3BsYW5lXSArIChvdXRoLWotMSkgKiAgaW4tPmxpbmVzaXplW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmxpbmVzaXplW3BsYW5lXSwgMiwgcm90LT5kcmF3LnBpeGVsc3RlcFtwbGFuZV0sIG91dHcpOworICAgICAgICB9IGVsc2UgaWYgKGZhYnMocm90LT5hbmdsZSAtIDMqTV9QSS8yKSA8IEZMVF9FUFNJTE9OICYmIG91dHcgPT0gaW5oICYmIG91dGggPT0gaW53KSB7CisgICAgICAgICAgICBzaW1wbGVfcm90YXRlKG91dC0+ZGF0YVtwbGFuZV0gKyBqICogb3V0LT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVtwbGFuZV0gKyAob3V0aC1qLTEpICogcm90LT5kcmF3LnBpeGVsc3RlcFtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5saW5lc2l6ZVtwbGFuZV0sIDMsIHJvdC0+ZHJhdy5waXhlbHN0ZXBbcGxhbmVdLCBvdXR3KTsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0dzsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IHY7CisgICAgICAgICAgICBpbnQgeDEsIHkxOworICAgICAgICAgICAgdWludDhfdCAqcGluLCAqcG91dDsKKyAgICAgICAgICAgIHgxID0geD4+MTY7CisgICAgICAgICAgICB5MSA9IHk+PjE2OworCisgICAgICAgICAgICAvKiB0aGUgb3V0LW9mLXJhbmdlIHZhbHVlcyBhdm9pZCBib3JkZXIgYXJ0aWZhY3RzICovCisgICAgICAgICAgICBpZiAoeDEgPj0gLTEgJiYgeDEgPD0gaW53ICYmIHkxID49IC0xICYmIHkxIDw9IGluaCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5wX2ludls0XTsgLyogaW50ZXJwb2xhdGVkIGlucHV0IHZhbHVlICovCisgICAgICAgICAgICAgICAgcG91dCA9IG91dC0+ZGF0YVtwbGFuZV0gKyBqICogb3V0LT5saW5lc2l6ZVtwbGFuZV0gKyBpICogcm90LT5kcmF3LnBpeGVsc3RlcFtwbGFuZV07CisgICAgICAgICAgICAgICAgaWYgKHJvdC0+dXNlX2JpbGluZWFyKSB7CisgICAgICAgICAgICAgICAgICAgIHBpbiA9IGludGVycG9sYXRlX2JpbGluZWFyKGlucF9pbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhW3BsYW5lXSwgaW4tPmxpbmVzaXplW3BsYW5lXSwgcm90LT5kcmF3LnBpeGVsc3RlcFtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGludy0xLCBpbmgtMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHgyID0gYXZfY2xpcCh4MSwgMCwgaW53LTEpOworICAgICAgICAgICAgICAgICAgICBpbnQgeTIgPSBhdl9jbGlwKHkxLCAwLCBpbmgtMSk7CisgICAgICAgICAgICAgICAgICAgIHBpbiA9IGluLT5kYXRhW3BsYW5lXSArIHkyICogaW4tPmxpbmVzaXplW3BsYW5lXSArIHgyICogcm90LT5kcmF3LnBpeGVsc3RlcFtwbGFuZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAocm90LT5kcmF3LnBpeGVsc3RlcFtwbGFuZV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICpwb3V0ID0gKnBpbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAqKCh1aW50MTZfdCAqKXBvdXQpID0gKigodWludDE2X3QgKilwaW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIHYgPSBBVl9SQjI0KHBpbik7CisgICAgICAgICAgICAgICAgICAgIEFWX1dCMjQocG91dCwgdik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgKigodWludDMyX3QgKilwb3V0KSA9ICooKHVpbnQzMl90ICopcGluKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBvdXQsIHBpbiwgcm90LT5kcmF3LnBpeGVsc3RlcFtwbGFuZV0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4ICs9IGM7CisgICAgICAgICAgICB5IC09IHM7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB4cHJpbWUgKz0gczsKKyAgICAgICAgeXByaW1lICs9IGM7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgUm90Q29udGV4dCAqcm90ID0gY3R4LT5wcml2OworICAgIGludCBhbmdsZV9pbnQsIHMsIGMsIHBsYW5lOworICAgIGRvdWJsZSByZXM7CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKworICAgIHJvdC0+dmFyX3ZhbHVlc1tWQVJfTl0gPSBpbmxpbmstPmZyYW1lX2NvdW50OworICAgIHJvdC0+dmFyX3ZhbHVlc1tWQVJfVF0gPSBUUzJUKGluLT5wdHMsIGlubGluay0+dGltZV9iYXNlKTsKKyAgICByb3QtPmFuZ2xlID0gcmVzID0gYXZfZXhwcl9ldmFsKHJvdC0+YW5nbGVfZXhwciwgcm90LT52YXJfdmFsdWVzLCByb3QpOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAibjolZiB0aW1lOiVmIGFuZ2xlOiVmL1BJXG4iLAorICAgICAgICAgICByb3QtPnZhcl92YWx1ZXNbVkFSX05dLCByb3QtPnZhcl92YWx1ZXNbVkFSX1RdLCByb3QtPmFuZ2xlL01fUEkpOworCisgICAgYW5nbGVfaW50ID0gcmVzICogRklYUCAqIDE2OworICAgIHMgPSBpbnRfc2luKGFuZ2xlX2ludCk7CisgICAgYyA9IGludF9zaW4oYW5nbGVfaW50ICsgSU5UX1BJLzIpOworCisgICAgLyogZmlsbCBiYWNrZ3JvdW5kICovCisgICAgaWYgKHJvdC0+ZmlsbGNvbG9yX2VuYWJsZSkKKyAgICAgICAgZmZfZmlsbF9yZWN0YW5nbGUoJnJvdC0+ZHJhdywgJnJvdC0+Y29sb3IsIG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCByb3QtPm5iX3BsYW5lczsgcGxhbmUrKykgeworICAgICAgICBpbnQgaHN1YiA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IHJvdC0+aHN1YiA6IDA7CisgICAgICAgIGludCB2c3ViID0gcGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyID8gcm90LT52c3ViIDogMDsKKyAgICAgICAgY29uc3QgaW50IG91dHcgPSBGRl9DRUlMX1JTSElGVChvdXRsaW5rLT53LCBoc3ViKTsKKyAgICAgICAgY29uc3QgaW50IG91dGggPSBGRl9DRUlMX1JTSElGVChvdXRsaW5rLT5oLCB2c3ViKTsKKyAgICAgICAgVGhyZWFkRGF0YSB0ZCA9IHsgLmluID0gaW4sICAgLm91dCAgPSBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbncgID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT53LCBoc3ViKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaCAgPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAub3V0aCA9IG91dGgsIC5vdXR3ID0gb3V0dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnhpID0gLShvdXR3LTEpICogYyAvIDIsIC55aSA9ICAob3V0dy0xKSAqIHMgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAueHByaW1lID0gLShvdXRoLTEpICogcyAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC55cHJpbWUgPSAtKG91dGgtMSkgKiBjIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnBsYW5lID0gcGxhbmUsIC5jID0gYywgLnMgPSBzIH07CisKKworICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlLCAmdGQsIE5VTEwsIEZGTUlOKG91dGgsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICB9CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfY29tbWFuZChBVkZpbHRlckNvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqY21kLCBjb25zdCBjaGFyICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcmVzLCBpbnQgcmVzX2xlbiwgaW50IGZsYWdzKQoreworICAgIFJvdENvbnRleHQgKnJvdCA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFzdHJjbXAoY21kLCAiYW5nbGUiKSB8fCAhc3RyY21wKGNtZCwgImEiKSkgeworICAgICAgICBBVkV4cHIgKm9sZCA9IHJvdC0+YW5nbGVfZXhwcjsKKyAgICAgICAgcmV0ID0gYXZfZXhwcl9wYXJzZSgmcm90LT5hbmdsZV9leHByLCBhcmdzLCB2YXJfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hlbiBwYXJzaW5nIHRoZSBleHByZXNzaW9uICclcycgZm9yIGFuZ2xlIGNvbW1hbmRcbiIsIGFyZ3MpOworICAgICAgICAgICAgcm90LT5hbmdsZV9leHByID0gb2xkOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBhdl9leHByX2ZyZWUob2xkKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9TWVMpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHJvdGF0ZV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHJvdGF0ZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3JvdGF0ZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJyb3RhdGUiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJvdGF0ZSB0aGUgaW5wdXQgaW1hZ2UuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoUm90Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAucHJvY2Vzc19jb21tYW5kID0gcHJvY2Vzc19jb21tYW5kLAorICAgIC5pbnB1dHMgICAgICAgID0gcm90YXRlX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHJvdGF0ZV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnJvdGF0ZV9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDIHwgQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zYWIuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zYWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTM4YjUzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3NhYi5jCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU2hhcGUgQWRhcHRpdmUgQmx1ciBmaWx0ZXIsIHBvcnRlZCBmcm9tIE1QbGF5ZXIgbGlibXBjb2RlY3MvdmZfc2FiLmMKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgcmFkaXVzOworICAgIGZsb2F0IHByZV9maWx0ZXJfcmFkaXVzOworICAgIGZsb2F0IHN0cmVuZ3RoOworICAgIGZsb2F0IHF1YWxpdHk7CisgICAgc3RydWN0IFN3c0NvbnRleHQgKnByZV9maWx0ZXJfY29udGV4dDsKKyAgICB1aW50OF90ICpwcmVfZmlsdGVyX2J1ZjsKKyAgICBpbnQgcHJlX2ZpbHRlcl9saW5lc2l6ZTsKKyAgICBpbnQgZGlzdF93aWR0aDsKKyAgICBpbnQgZGlzdF9saW5lc2l6ZTsKKyAgICBpbnQgKmRpc3RfY29lZmY7CisjZGVmaW5lIENPTE9SX0RJRkZfQ09FRkZfU0laRSA1MTIKKyAgICBpbnQgY29sb3JfZGlmZl9jb2VmZltDT0xPUl9ESUZGX0NPRUZGX1NJWkVdOworfSBGaWx0ZXJQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEZpbHRlclBhcmFtICBsdW1hOworICAgIEZpbHRlclBhcmFtICBjaHJvbWE7CisgICAgaW50ICAgICAgICAgIGhzdWI7CisgICAgaW50ICAgICAgICAgIHZzdWI7CisgICAgdW5zaWduZWQgaW50IHN3c19mbGFnczsKK30gU2FiQ29udGV4dDsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUkFESVVTX01JTiAwLjEKKyNkZWZpbmUgUkFESVVTX01BWCA0LjAKKworI2RlZmluZSBQUkVfRklMVEVSX1JBRElVU19NSU4gMC4xCisjZGVmaW5lIFBSRV9GSUxURVJfUkFESVVTX01BWCAyLjAKKworI2RlZmluZSBTVFJFTkdUSF9NSU4gMC4xCisjZGVmaW5lIFNUUkVOR1RIX01BWCAxMDAuMAorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTYWJDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHNhYl9vcHRpb25zW10gPSB7CisgICAgeyAibHVtYV9yYWRpdXMiLCAgICAgICAgICAgICJzZXQgbHVtYSByYWRpdXMiLCBPRkZTRVQobHVtYS5yYWRpdXMpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MS4wfSwgUkFESVVTX01JTiwgUkFESVVTX01BWCwgLmZsYWdzPUZMQUdTIH0sCisgICAgeyAibHIiICAgICAgICAgLCAgICAgICAgICAgICJzZXQgbHVtYSByYWRpdXMiLCBPRkZTRVQobHVtYS5yYWRpdXMpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MS4wfSwgUkFESVVTX01JTiwgUkFESVVTX01BWCwgLmZsYWdzPUZMQUdTIH0sCisgICAgeyAibHVtYV9wcmVfZmlsdGVyX3JhZGl1cyIsICJzZXQgbHVtYSBwcmUtZmlsdGVyIHJhZGl1cyIsIE9GRlNFVChsdW1hLnByZV9maWx0ZXJfcmFkaXVzKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTEuMH0sIFBSRV9GSUxURVJfUkFESVVTX01JTiwgUFJFX0ZJTFRFUl9SQURJVVNfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7ICJscGZyIiwgICAgICAgICAgICAgICAgICAgInNldCBsdW1hIHByZS1maWx0ZXIgcmFkaXVzIiwgT0ZGU0VUKGx1bWEucHJlX2ZpbHRlcl9yYWRpdXMpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MS4wfSwgUFJFX0ZJTFRFUl9SQURJVVNfTUlOLCBQUkVfRklMVEVSX1JBRElVU19NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgImx1bWFfc3RyZW5ndGgiLCAgICAgICAgICAic2V0IGx1bWEgc3RyZW5ndGgiLCBPRkZTRVQobHVtYS5zdHJlbmd0aCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xLjB9LCBTVFJFTkdUSF9NSU4sIFNUUkVOR1RIX01BWCwgLmZsYWdzPUZMQUdTIH0sCisgICAgeyAibHMiLCAgICAgICAgICAgICAgICAgICAgICJzZXQgbHVtYSBzdHJlbmd0aCIsIE9GRlNFVChsdW1hLnN0cmVuZ3RoKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTEuMH0sIFNUUkVOR1RIX01JTiwgU1RSRU5HVEhfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKworICAgIHsgImNocm9tYV9yYWRpdXMiLCAgICAgICAgICAgICJzZXQgY2hyb21hIHJhZGl1cyIsIE9GRlNFVChjaHJvbWEucmFkaXVzKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPVJBRElVU19NSU4tMX0sIFJBRElVU19NSU4tMSwgUkFESVVTX01BWCwgLmZsYWdzPUZMQUdTIH0sCisgICAgeyAiY3IiLCAgICAgICAgICAgICAgICAgICAgICAgInNldCBjaHJvbWEgcmFkaXVzIiwgT0ZGU0VUKGNocm9tYS5yYWRpdXMpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9UkFESVVTX01JTi0xfSwgUkFESVVTX01JTi0xLCBSQURJVVNfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7ICJjaHJvbWFfcHJlX2ZpbHRlcl9yYWRpdXMiLCAic2V0IGNocm9tYSBwcmUtZmlsdGVyIHJhZGl1cyIsICBPRkZTRVQoY2hyb21hLnByZV9maWx0ZXJfcmFkaXVzKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPVBSRV9GSUxURVJfUkFESVVTX01JTi0xfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVfRklMVEVSX1JBRElVU19NSU4tMSwgUFJFX0ZJTFRFUl9SQURJVVNfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7ICJjcGZyIiwgICAgICAgICAgICAgICAgICAgICAic2V0IGNocm9tYSBwcmUtZmlsdGVyIHJhZGl1cyIsICBPRkZTRVQoY2hyb21hLnByZV9maWx0ZXJfcmFkaXVzKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPVBSRV9GSUxURVJfUkFESVVTX01JTi0xfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVfRklMVEVSX1JBRElVU19NSU4tMSwgUFJFX0ZJTFRFUl9SQURJVVNfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7ICJjaHJvbWFfc3RyZW5ndGgiLCAgICAgICAgICAic2V0IGNocm9tYSBzdHJlbmd0aCIsIE9GRlNFVChjaHJvbWEuc3RyZW5ndGgpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9U1RSRU5HVEhfTUlOLTF9LCBTVFJFTkdUSF9NSU4tMSwgU1RSRU5HVEhfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7ICJjcyIsICAgICAgICAgICAgICAgICAgICAgICAic2V0IGNocm9tYSBzdHJlbmd0aCIsIE9GRlNFVChjaHJvbWEuc3RyZW5ndGgpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9U1RSRU5HVEhfTUlOLTF9LCBTVFJFTkdUSF9NSU4tMSwgU1RSRU5HVEhfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKworICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moc2FiKTsKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU2FiQ29udGV4dCAqc2FiID0gY3R4LT5wcml2OworCisgICAgLyogbWFrZSBjaHJvbWEgZGVmYXVsdCB0byBsdW1hIHZhbHVlcywgaWYgbm90IGV4cGxpY2l0bHkgc2V0ICovCisgICAgaWYgKHNhYi0+Y2hyb21hLnJhZGl1cyA8IFJBRElVU19NSU4pCisgICAgICAgIHNhYi0+Y2hyb21hLnJhZGl1cyA9IHNhYi0+bHVtYS5yYWRpdXM7CisgICAgaWYgKHNhYi0+Y2hyb21hLnByZV9maWx0ZXJfcmFkaXVzIDwgUFJFX0ZJTFRFUl9SQURJVVNfTUlOKQorICAgICAgICBzYWItPmNocm9tYS5wcmVfZmlsdGVyX3JhZGl1cyA9IHNhYi0+bHVtYS5wcmVfZmlsdGVyX3JhZGl1czsKKyAgICBpZiAoc2FiLT5jaHJvbWEuc3RyZW5ndGggPCBTVFJFTkdUSF9NSU4pCisgICAgICAgIHNhYi0+Y2hyb21hLnN0cmVuZ3RoID0gc2FiLT5sdW1hLnN0cmVuZ3RoOworCisgICAgc2FiLT5sdW1hLnF1YWxpdHkgPSBzYWItPmNocm9tYS5xdWFsaXR5ID0gMy4wOworICAgIHNhYi0+c3dzX2ZsYWdzID0gU1dTX1BPSU5UOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICJsdW1hX3JhZGl1czolZiBsdW1hX3ByZV9maWx0ZXJfcmFkaXVzOjolZiBsdW1hX3N0cmVuZ3RoOiVmICIKKyAgICAgICAgICAgImNocm9tYV9yYWRpdXM6JWYgY2hyb21hX3ByZV9maWx0ZXJfcmFkaXVzOiVmIGNocm9tYV9zdHJlbmd0aDolZlxuIiwKKyAgICAgICAgICAgc2FiLT5sdW1hICAucmFkaXVzLCBzYWItPmx1bWEgIC5wcmVfZmlsdGVyX3JhZGl1cywgc2FiLT5sdW1hICAuc3RyZW5ndGgsCisgICAgICAgICAgIHNhYi0+Y2hyb21hLnJhZGl1cywgc2FiLT5jaHJvbWEucHJlX2ZpbHRlcl9yYWRpdXMsIHNhYi0+Y2hyb21hLnN0cmVuZ3RoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xvc2VfZmlsdGVyX3BhcmFtKEZpbHRlclBhcmFtICpmKQoreworICAgIGlmIChmLT5wcmVfZmlsdGVyX2NvbnRleHQpIHsKKyAgICAgICAgc3dzX2ZyZWVDb250ZXh0KGYtPnByZV9maWx0ZXJfY29udGV4dCk7CisgICAgICAgIGYtPnByZV9maWx0ZXJfY29udGV4dCA9IE5VTEw7CisgICAgfQorICAgIGF2X2ZyZWVwKCZmLT5wcmVfZmlsdGVyX2J1Zik7CisgICAgYXZfZnJlZXAoJmYtPmRpc3RfY29lZmYpOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTYWJDb250ZXh0ICpzYWIgPSBjdHgtPnByaXY7CisKKyAgICBjbG9zZV9maWx0ZXJfcGFyYW0oJnNhYi0+bHVtYSk7CisgICAgY2xvc2VfZmlsdGVyX3BhcmFtKCZzYWItPmNocm9tYSk7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9maWx0ZXJfcGFyYW0oRmlsdGVyUGFyYW0gKmYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IHN3c19mbGFncykKK3sKKyAgICBTd3NWZWN0b3IgKnZlYzsKKyAgICBTd3NGaWx0ZXIgc3dzX2Y7CisgICAgaW50IGksIHgsIHk7CisgICAgaW50IGxpbmVzaXplID0gRkZBTElHTih3aWR0aCwgOCk7CisKKyAgICBmLT5wcmVfZmlsdGVyX2J1ZiA9IGF2X21hbGxvYyhsaW5lc2l6ZSAqIGhlaWdodCk7CisgICAgaWYgKCFmLT5wcmVfZmlsdGVyX2J1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGYtPnByZV9maWx0ZXJfbGluZXNpemUgPSBsaW5lc2l6ZTsKKyAgICB2ZWMgPSBzd3NfZ2V0R2F1c3NpYW5WZWMoZi0+cHJlX2ZpbHRlcl9yYWRpdXMsIGYtPnF1YWxpdHkpOworICAgIHN3c19mLmx1bUggPSBzd3NfZi5sdW1WID0gdmVjOworICAgIHN3c19mLmNockggPSBzd3NfZi5jaHJWID0gTlVMTDsKKyAgICBmLT5wcmVfZmlsdGVyX2NvbnRleHQgPSBzd3NfZ2V0Q29udGV4dCh3aWR0aCwgaGVpZ2h0LCBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dzX2ZsYWdzLCAmc3dzX2YsIE5VTEwsIE5VTEwpOworICAgIHN3c19mcmVlVmVjKHZlYyk7CisKKyAgICB2ZWMgPSBzd3NfZ2V0R2F1c3NpYW5WZWMoZi0+c3RyZW5ndGgsIDUuMCk7CisgICAgZm9yIChpID0gMDsgaSA8IENPTE9SX0RJRkZfQ09FRkZfU0laRTsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgICBpbnQgaW5kZXggPSBpLUNPTE9SX0RJRkZfQ09FRkZfU0laRS8yICsgdmVjLT5sZW5ndGgvMjsKKworICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHZlYy0+bGVuZ3RoKSBkID0gMC4wOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gdmVjLT5jb2VmZltpbmRleF07CisKKyAgICAgICAgZi0+Y29sb3JfZGlmZl9jb2VmZltpXSA9IChpbnQpKGQvdmVjLT5jb2VmZlt2ZWMtPmxlbmd0aC8yXSooMTw8MTIpICsgMC41KTsKKyAgICB9CisgICAgc3dzX2ZyZWVWZWModmVjKTsKKworICAgIHZlYyA9IHN3c19nZXRHYXVzc2lhblZlYyhmLT5yYWRpdXMsIGYtPnF1YWxpdHkpOworICAgIGYtPmRpc3Rfd2lkdGggICAgPSB2ZWMtPmxlbmd0aDsKKyAgICBmLT5kaXN0X2xpbmVzaXplID0gRkZBTElHTih2ZWMtPmxlbmd0aCwgOCk7CisgICAgZi0+ZGlzdF9jb2VmZiAgICA9IGF2X21hbGxvY19hcnJheShmLT5kaXN0X3dpZHRoLCBmLT5kaXN0X2xpbmVzaXplICogc2l6ZW9mKCpmLT5kaXN0X2NvZWZmKSk7CisgICAgaWYgKCFmLT5kaXN0X2NvZWZmKSB7CisgICAgICAgIHN3c19mcmVlVmVjKHZlYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZm9yICh5ID0gMDsgeSA8IHZlYy0+bGVuZ3RoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHZlYy0+bGVuZ3RoOyB4KyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gdmVjLT5jb2VmZlt4XSAqIHZlYy0+Y29lZmZbeV07CisgICAgICAgICAgICBmLT5kaXN0X2NvZWZmW3ggKyB5KmYtPmRpc3RfbGluZXNpemVdID0gKGludCkoZCooMTw8MTApICsgMC41KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzd3NfZnJlZVZlYyh2ZWMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIFNhYkNvbnRleHQgKnNhYiA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCByZXQ7CisKKyAgICBzYWItPmhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHNhYi0+dnN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisKKyAgICBjbG9zZV9maWx0ZXJfcGFyYW0oJnNhYi0+bHVtYSk7CisgICAgcmV0ID0gb3Blbl9maWx0ZXJfcGFyYW0oJnNhYi0+bHVtYSwgaW5saW5rLT53LCBpbmxpbmstPmgsIHNhYi0+c3dzX2ZsYWdzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGNsb3NlX2ZpbHRlcl9wYXJhbSgmc2FiLT5jaHJvbWEpOworICAgIHJldCA9IG9wZW5fZmlsdGVyX3BhcmFtKCZzYWItPmNocm9tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9DRUlMX1JTSElGVChpbmxpbmstPncsIHNhYi0+aHN1YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBzYWItPnZzdWIpLCBzYWItPnN3c19mbGFncyk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBOQl9QTEFORVMgNAorCitzdGF0aWMgdm9pZCBibHVyKHVpbnQ4X3QgICAgICAgKmRzdCwgY29uc3QgaW50IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCBpbnQgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdywgY29uc3QgaW50IGgsIEZpbHRlclBhcmFtICpmcCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBGaWx0ZXJQYXJhbSBmID0gKmZwOworICAgIGNvbnN0IGludCByYWRpdXMgPSBmLmRpc3Rfd2lkdGgvMjsKKworICAgIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCBzcmMyW05CX1BMQU5FU10gPSB7IHNyYyB9OworICAgIGludCAgICAgICAgICBzcmMyX2xpbmVzaXplW05CX1BMQU5FU10gPSB7IHNyY19saW5lc2l6ZSB9OworICAgIHVpbnQ4X3QgICAgICpkc3QyW05CX1BMQU5FU10gPSB7IGYucHJlX2ZpbHRlcl9idWYgfTsKKyAgICBpbnQgZHN0Ml9saW5lc2l6ZVtOQl9QTEFORVNdID0geyBmLnByZV9maWx0ZXJfbGluZXNpemUgfTsKKworICAgIHN3c19zY2FsZShmLnByZV9maWx0ZXJfY29udGV4dCwgc3JjMiwgc3JjMl9saW5lc2l6ZSwgMCwgaCwgZHN0MiwgZHN0Ml9saW5lc2l6ZSk7CisKKyNkZWZpbmUgVVBEQVRFX0ZBQ1RPUiBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmFjdG9yID0gZi5jb2xvcl9kaWZmX2NvZWZmW0NPTE9SX0RJRkZfQ09FRkZfU0laRS8yICsgcHJlX3ZhbCAtIFwKKyAgICAgICAgICAgICAgICAgZi5wcmVfZmlsdGVyX2J1ZltpeCArIGl5KmYucHJlX2ZpbHRlcl9saW5lc2l6ZV1dICogZi5kaXN0X2NvZWZmW2R4ICsgZHkqZi5kaXN0X2xpbmVzaXplXTsgXAorICAgICAgICBzdW0gKz0gc3JjW2l4ICsgaXkqc3JjX2xpbmVzaXplXSAqIGZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkaXYgKz0gZmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICAgICAgaW50IGRpdiA9IDA7CisgICAgICAgICAgICBpbnQgZHk7CisgICAgICAgICAgICBjb25zdCBpbnQgcHJlX3ZhbCA9IGYucHJlX2ZpbHRlcl9idWZbeCArIHkqZi5wcmVfZmlsdGVyX2xpbmVzaXplXTsKKyAgICAgICAgICAgIGlmICh4ID49IHJhZGl1cyAmJiB4IDwgdyAtIHJhZGl1cykgeworICAgICAgICAgICAgICAgIGZvciAoZHkgPSAwOyBkeSA8IHJhZGl1cyoyICsgMTsgZHkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgZHg7CisgICAgICAgICAgICAgICAgICAgIGludCBpeSA9IHkrZHkgLSByYWRpdXM7CisgICAgICAgICAgICAgICAgICAgIGlmICAgICAgKGl5IDwgMCkgIGl5ID0gLWl5OworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpeSA+PSBoKSBpeSA9IGgraC1peS0xOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoZHggPSAwOyBkeCA8IHJhZGl1cyoyICsgMTsgZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGl4ID0geCtkeCAtIHJhZGl1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURV9GQUNUT1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoZHkgPSAwOyBkeSA8IHJhZGl1cyoyKzE7IGR5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGR4OworICAgICAgICAgICAgICAgICAgICBpbnQgaXkgPSB5K2R5IC0gcmFkaXVzOworICAgICAgICAgICAgICAgICAgICBpZiAgICAgIChpeSA8ICAwKSBpeSA9IC1peTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXkgPj0gaCkgaXkgPSBoK2gtaXktMTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGR4ID0gMDsgZHggPCByYWRpdXMqMiArIDE7IGR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpeCA9IHgrZHggLSByYWRpdXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAgICAgIChpeCA8IDApICBpeCA9IC1peDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl4ID49IHcpIGl4ID0gdyt3LWl4LTE7CisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEVfRkFDVE9SOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0W3ggKyB5KmRzdF9saW5lc2l6ZV0gPSAoc3VtICsgZGl2LzIpIC8gZGl2OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5waWMpCit7CisgICAgU2FiQ29udGV4dCAgKnNhYiA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dHBpYzsKKworICAgIG91dHBpYyA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXRwaWMpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5waWMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHBpYywgaW5waWMpOworCisgICAgYmx1cihvdXRwaWMtPmRhdGFbMF0sIG91dHBpYy0+bGluZXNpemVbMF0sIGlucGljLT5kYXRhWzBdLCAgaW5waWMtPmxpbmVzaXplWzBdLAorICAgICAgICAgaW5saW5rLT53LCBpbmxpbmstPmgsICZzYWItPmx1bWEpOworICAgIGlmIChpbnBpYy0+ZGF0YVsyXSkgeworICAgICAgICBpbnQgY3cgPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPncsIHNhYi0+aHN1Yik7CisgICAgICAgIGludCBjaCA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwgc2FiLT52c3ViKTsKKyAgICAgICAgYmx1cihvdXRwaWMtPmRhdGFbMV0sIG91dHBpYy0+bGluZXNpemVbMV0sIGlucGljLT5kYXRhWzFdLCBpbnBpYy0+bGluZXNpemVbMV0sIGN3LCBjaCwgJnNhYi0+Y2hyb21hKTsKKyAgICAgICAgYmx1cihvdXRwaWMtPmRhdGFbMl0sIG91dHBpYy0+bGluZXNpemVbMl0sIGlucGljLT5kYXRhWzJdLCBpbnBpYy0+bGluZXNpemVbMl0sIGN3LCBjaCwgJnNhYi0+Y2hyb21hKTsKKyAgICB9CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnBpYyk7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXRwaWMpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc2FiX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc2FiX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9zYWIgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAic2FiIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBseSBzaGFwZSBhZGFwdGl2ZSBibHVyLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFNhYkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBzYWJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gc2FiX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmc2FiX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3NjYWxlLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc2NhbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI4OGMyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3NjYWxlLmMKQEAgLTAsMCArMSw2MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQm9iYnkgQmluZ2hhbQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBzY2FsZSB2aWRlbyBmaWx0ZXIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsKKyAgICAiaW5fdyIsICAgIml3IiwKKyAgICAiaW5faCIsICAgImloIiwKKyAgICAib3V0X3ciLCAgIm93IiwKKyAgICAib3V0X2giLCAgIm9oIiwKKyAgICAiYSIsCisgICAgInNhciIsCisgICAgImRhciIsCisgICAgImhzdWIiLAorICAgICJ2c3ViIiwKKyAgICAib2hzdWIiLAorICAgICJvdnN1YiIsCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX0lOX1csICAgVkFSX0lXLAorICAgIFZBUl9JTl9ILCAgIFZBUl9JSCwKKyAgICBWQVJfT1VUX1csICBWQVJfT1csCisgICAgVkFSX09VVF9ILCAgVkFSX09ILAorICAgIFZBUl9BLAorICAgIFZBUl9TQVIsCisgICAgVkFSX0RBUiwKKyAgICBWQVJfSFNVQiwKKyAgICBWQVJfVlNVQiwKKyAgICBWQVJfT0hTVUIsCisgICAgVkFSX09WU1VCLAorICAgIFZBUlNfTkIKK307CisKK3R5cGVkZWYgc3RydWN0IFNjYWxlQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgc3RydWN0IFN3c0NvbnRleHQgKnN3czsgICAgIC8vLzwgc29mdHdhcmUgc2NhbGVyIGNvbnRleHQKKyAgICBzdHJ1Y3QgU3dzQ29udGV4dCAqaXN3c1syXTsgLy8vPCBzb2Z0d2FyZSBzY2FsZXIgY29udGV4dCBmb3IgaW50ZXJsYWNlZCBtYXRlcmlhbAorICAgIEFWRGljdGlvbmFyeSAqb3B0czsKKworICAgIC8qKgorICAgICAqIE5ldyBkaW1lbnNpb25zLiBTcGVjaWFsIHZhbHVlcyBhcmU6CisgICAgICogICAwID0gb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CisgICAgICogIC0xID0ga2VlcCBvcmlnaW5hbCBhc3BlY3QKKyAgICAgKiAgLU4gPSB0cnkgdG8ga2VlcCBhc3BlY3QgYnV0IG1ha2Ugc3VyZSBpdCBpcyBkaXZpc2libGUgYnkgTgorICAgICAqLworICAgIGludCB3LCBoOworICAgIGNoYXIgKnNpemVfc3RyOworICAgIHVuc2lnbmVkIGludCBmbGFnczsgICAgICAgICAvLy9zd3MgZmxhZ3MKKworICAgIGludCBoc3ViLCB2c3ViOyAgICAgICAgICAgICAvLy88IGNocm9tYSBzdWJzYW1wbGluZworICAgIGludCBzbGljZV95OyAgICAgICAgICAgICAgICAvLy88IHRvcCBvZiBjdXJyZW50IG91dHB1dCBzbGljZQorICAgIGludCBpbnB1dF9pc19wYWw7ICAgICAgICAgICAvLy88IHNldCB0byAxIGlmIHRoZSBpbnB1dCBmb3JtYXQgaXMgcGFsZXR0ZWQKKyAgICBpbnQgb3V0cHV0X2lzX3BhbDsgICAgICAgICAgLy8vPCBzZXQgdG8gMSBpZiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBwYWxldHRlZAorICAgIGludCBpbnRlcmxhY2VkOworCisgICAgY2hhciAqd19leHByOyAgICAgICAgICAgICAgIC8vLzwgd2lkdGggIGV4cHJlc3Npb24gc3RyaW5nCisgICAgY2hhciAqaF9leHByOyAgICAgICAgICAgICAgIC8vLzwgaGVpZ2h0IGV4cHJlc3Npb24gc3RyaW5nCisgICAgY2hhciAqZmxhZ3Nfc3RyOworCisgICAgY2hhciAqaW5fY29sb3JfbWF0cml4OworICAgIGNoYXIgKm91dF9jb2xvcl9tYXRyaXg7CisKKyAgICBpbnQgaW5fcmFuZ2U7CisgICAgaW50IG91dF9yYW5nZTsKKworICAgIGludCBvdXRfaF9jaHJfcG9zOworICAgIGludCBvdXRfdl9jaHJfcG9zOworICAgIGludCBpbl9oX2Nocl9wb3M7CisgICAgaW50IGluX3ZfY2hyX3BvczsKKworICAgIGludCBmb3JjZV9vcmlnaW5hbF9hc3BlY3RfcmF0aW87Cit9IFNjYWxlQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXRfZGljdChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZEaWN0aW9uYXJ5ICoqb3B0cykKK3sKKyAgICBTY2FsZUNvbnRleHQgKnNjYWxlID0gY3R4LT5wcml2OworICAgIGludCByZXQ7CisKKyAgICBpZiAoc2NhbGUtPnNpemVfc3RyICYmIChzY2FsZS0+d19leHByIHx8IHNjYWxlLT5oX2V4cHIpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJTaXplIGFuZCB3aWR0aC9oZWlnaHQgZXhwcmVzc2lvbnMgY2Fubm90IGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChzY2FsZS0+d19leHByICYmICFzY2FsZS0+aF9leHByKQorICAgICAgICBGRlNXQVAoY2hhciAqLCBzY2FsZS0+d19leHByLCBzY2FsZS0+c2l6ZV9zdHIpOworCisgICAgaWYgKHNjYWxlLT5zaXplX3N0cikgeworICAgICAgICBjaGFyIGJ1ZlszMl07CisgICAgICAgIGlmICgocmV0ID0gYXZfcGFyc2VfdmlkZW9fc2l6ZSgmc2NhbGUtPncsICZzY2FsZS0+aCwgc2NhbGUtPnNpemVfc3RyKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgc2l6ZSAnJXMnXG4iLCBzY2FsZS0+c2l6ZV9zdHIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLTEsICIlZCIsIHNjYWxlLT53KTsKKyAgICAgICAgYXZfb3B0X3NldChzY2FsZSwgInciLCBidWYsIDApOworICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLTEsICIlZCIsIHNjYWxlLT5oKTsKKyAgICAgICAgYXZfb3B0X3NldChzY2FsZSwgImgiLCBidWYsIDApOworICAgIH0KKyAgICBpZiAoIXNjYWxlLT53X2V4cHIpCisgICAgICAgIGF2X29wdF9zZXQoc2NhbGUsICJ3IiwgIml3IiwgMCk7CisgICAgaWYgKCFzY2FsZS0+aF9leHByKQorICAgICAgICBhdl9vcHRfc2V0KHNjYWxlLCAiaCIsICJpaCIsIDApOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJ3OiVzIGg6JXMgZmxhZ3M6JyVzJyBpbnRlcmw6JWRcbiIsCisgICAgICAgICAgIHNjYWxlLT53X2V4cHIsIHNjYWxlLT5oX2V4cHIsIChjaGFyICopYXZfeF9pZl9udWxsKHNjYWxlLT5mbGFnc19zdHIsICIiKSwgc2NhbGUtPmludGVybGFjZWQpOworCisgICAgc2NhbGUtPmZsYWdzID0gMDsKKworICAgIGlmIChzY2FsZS0+ZmxhZ3Nfc3RyKSB7CisgICAgICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzID0gc3dzX2dldF9jbGFzcygpOworICAgICAgICBjb25zdCBBVk9wdGlvbiAgICAqbyA9IGF2X29wdF9maW5kKCZjbGFzcywgInN3c19mbGFncyIsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1NFQVJDSF9GQUtFX09CSik7CisgICAgICAgIGludCByZXQgPSBhdl9vcHRfZXZhbF9mbGFncygmY2xhc3MsIG8sIHNjYWxlLT5mbGFnc19zdHIsICZzY2FsZS0+ZmxhZ3MpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHNjYWxlLT5vcHRzID0gKm9wdHM7CisgICAgKm9wdHMgPSBOVUxMOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFNjYWxlQ29udGV4dCAqc2NhbGUgPSBjdHgtPnByaXY7CisgICAgc3dzX2ZyZWVDb250ZXh0KHNjYWxlLT5zd3MpOworICAgIHN3c19mcmVlQ29udGV4dChzY2FsZS0+aXN3c1swXSk7CisgICAgc3dzX2ZyZWVDb250ZXh0KHNjYWxlLT5pc3dzWzFdKTsKKyAgICBzY2FsZS0+c3dzID0gTlVMTDsKKyAgICBhdl9kaWN0X2ZyZWUoJnNjYWxlLT5vcHRzKTsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0czsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGN0eC0+aW5wdXRzWzBdKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IE5VTEw7CisgICAgICAgIGZvcm1hdHMgPSBOVUxMOworICAgICAgICB3aGlsZSAoKGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfbmV4dChkZXNjKSkpIHsKKyAgICAgICAgICAgIHBpeF9mbXQgPSBhdl9waXhfZm10X2Rlc2NfZ2V0X2lkKGRlc2MpOworICAgICAgICAgICAgaWYgKChzd3NfaXNTdXBwb3J0ZWRJbnB1dChwaXhfZm10KSB8fAorICAgICAgICAgICAgICAgICBzd3NfaXNTdXBwb3J0ZWRFbmRpYW5uZXNzQ29udmVyc2lvbihwaXhfZm10KSkKKyAgICAgICAgICAgICAgICAmJiAocmV0ID0gZmZfYWRkX2Zvcm1hdCgmZm9ybWF0cywgcGl4X2ZtdCkpIDwgMCkgeworICAgICAgICAgICAgICAgIGZmX2Zvcm1hdHNfdW5yZWYoJmZvcm1hdHMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJmN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cyk7CisgICAgfQorICAgIGlmIChjdHgtPm91dHB1dHNbMF0pIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gTlVMTDsKKyAgICAgICAgZm9ybWF0cyA9IE5VTEw7CisgICAgICAgIHdoaWxlICgoZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19uZXh0KGRlc2MpKSkgeworICAgICAgICAgICAgcGl4X2ZtdCA9IGF2X3BpeF9mbXRfZGVzY19nZXRfaWQoZGVzYyk7CisgICAgICAgICAgICBpZiAoKHN3c19pc1N1cHBvcnRlZE91dHB1dChwaXhfZm10KSB8fCBwaXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCB8fAorICAgICAgICAgICAgICAgICBzd3NfaXNTdXBwb3J0ZWRFbmRpYW5uZXNzQ29udmVyc2lvbihwaXhfZm10KSkKKyAgICAgICAgICAgICAgICAmJiAocmV0ID0gZmZfYWRkX2Zvcm1hdCgmZm9ybWF0cywgcGl4X2ZtdCkpIDwgMCkgeworICAgICAgICAgICAgICAgIGZmX2Zvcm1hdHNfdW5yZWYoJmZvcm1hdHMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJmN0eC0+b3V0cHV0c1swXS0+aW5fZm9ybWF0cyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgKnBhcnNlX3l1dl90eXBlKGNvbnN0IGNoYXIgKnMsIGVudW0gQVZDb2xvclNwYWNlIGNvbG9yc3BhY2UpCit7CisgICAgaWYgKCFzKQorICAgICAgICBzID0gImJ0NjAxIjsKKworICAgIGlmIChzICYmIHN0cnN0cihzLCAiYnQ3MDkiKSkgeworICAgICAgICBjb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNzA5OworICAgIH0gZWxzZSBpZiAocyAmJiBzdHJzdHIocywgImZjYyIpKSB7CisgICAgICAgIGNvbG9yc3BhY2UgPSBBVkNPTF9TUENfRkNDOworICAgIH0gZWxzZSBpZiAocyAmJiBzdHJzdHIocywgInNtcHRlMjQwbSIpKSB7CisgICAgICAgIGNvbG9yc3BhY2UgPSBBVkNPTF9TUENfU01QVEUyNDBNOworICAgIH0gZWxzZSBpZiAocyAmJiAoc3Ryc3RyKHMsICJidDYwMSIpIHx8IHN0cnN0cihzLCAiYnQ0NzAiKSB8fCBzdHJzdHIocywgInNtcHRlMTcwbSIpKSkgeworICAgICAgICBjb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNDcwQkc7CisgICAgfQorCisgICAgaWYgKGNvbG9yc3BhY2UgPCAxIHx8IGNvbG9yc3BhY2UgPiA3KSB7CisgICAgICAgIGNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ0NzBCRzsKKyAgICB9CisKKyAgICByZXR1cm4gc3dzX2dldENvZWZmaWNpZW50cyhjb2xvcnNwYWNlKTsKK30KKworc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IG91dGZtdCA9IG91dGxpbmstPmZvcm1hdDsKKyAgICBTY2FsZUNvbnRleHQgKnNjYWxlID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqb3V0X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CisgICAgaW50NjRfdCB3LCBoOworICAgIGRvdWJsZSB2YXJfdmFsdWVzW1ZBUlNfTkJdLCByZXM7CisgICAgY2hhciAqZXhwcjsKKyAgICBpbnQgcmV0OworICAgIGludCBmYWN0b3JfdywgZmFjdG9yX2g7CisKKyAgICB2YXJfdmFsdWVzW1ZBUl9JTl9XXSAgPSB2YXJfdmFsdWVzW1ZBUl9JV10gPSBpbmxpbmstPnc7CisgICAgdmFyX3ZhbHVlc1tWQVJfSU5fSF0gID0gdmFyX3ZhbHVlc1tWQVJfSUhdID0gaW5saW5rLT5oOworICAgIHZhcl92YWx1ZXNbVkFSX09VVF9XXSA9IHZhcl92YWx1ZXNbVkFSX09XXSA9IE5BTjsKKyAgICB2YXJfdmFsdWVzW1ZBUl9PVVRfSF0gPSB2YXJfdmFsdWVzW1ZBUl9PSF0gPSBOQU47CisgICAgdmFyX3ZhbHVlc1tWQVJfQV0gICAgID0gKGRvdWJsZSkgaW5saW5rLT53IC8gaW5saW5rLT5oOworICAgIHZhcl92YWx1ZXNbVkFSX1NBUl0gICA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPworICAgICAgICAoZG91YmxlKSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtIC8gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA6IDE7CisgICAgdmFyX3ZhbHVlc1tWQVJfREFSXSAgID0gdmFyX3ZhbHVlc1tWQVJfQV0gKiB2YXJfdmFsdWVzW1ZBUl9TQVJdOworICAgIHZhcl92YWx1ZXNbVkFSX0hTVUJdICA9IDEgPDwgZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICB2YXJfdmFsdWVzW1ZBUl9WU1VCXSAgPSAxIDw8IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgdmFyX3ZhbHVlc1tWQVJfT0hTVUJdID0gMSA8PCBvdXRfZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICB2YXJfdmFsdWVzW1ZBUl9PVlNVQl0gPSAxIDw8IG91dF9kZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgLyogZXZhbHVhdGUgd2lkdGggYW5kIGhlaWdodCAqLworICAgIGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgKGV4cHIgPSBzY2FsZS0+d19leHByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgdmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCk7CisgICAgc2NhbGUtPncgPSB2YXJfdmFsdWVzW1ZBUl9PVVRfV10gPSB2YXJfdmFsdWVzW1ZBUl9PV10gPSByZXM7CisgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZyZXMsIChleHByID0gc2NhbGUtPmhfZXhwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgdmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgc2NhbGUtPmggPSB2YXJfdmFsdWVzW1ZBUl9PVVRfSF0gPSB2YXJfdmFsdWVzW1ZBUl9PSF0gPSByZXM7CisgICAgLyogZXZhbHVhdGUgYWdhaW4gdGhlIHdpZHRoLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHRoZSBvdXRwdXQgaGVpZ2h0ICovCisgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZyZXMsIChleHByID0gc2NhbGUtPndfZXhwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgdmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgc2NhbGUtPncgPSByZXM7CisKKyAgICB3ID0gc2NhbGUtPnc7CisgICAgaCA9IHNjYWxlLT5oOworCisgICAgLyogQ2hlY2sgaWYgaXQgaXMgcmVxdWVzdGVkIHRoYXQgdGhlIHJlc3VsdCBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IGEgc29tZQorICAgICAqIGZhY3RvciAodyBvciBoID0gLW4gd2l0aCBuIGJlaW5nIHRoZSBmYWN0b3IpLiAqLworICAgIGZhY3Rvcl93ID0gMTsKKyAgICBmYWN0b3JfaCA9IDE7CisgICAgaWYgKHcgPCAtMSkgeworICAgICAgICBmYWN0b3JfdyA9IC13OworICAgIH0KKyAgICBpZiAoaCA8IC0xKSB7CisgICAgICAgIGZhY3Rvcl9oID0gLWg7CisgICAgfQorCisgICAgaWYgKHcgPCAwICYmIGggPCAwKQorICAgICAgICBzY2FsZS0+dyA9IHNjYWxlLT5oID0gMDsKKworICAgIGlmICghKHcgPSBzY2FsZS0+dykpCisgICAgICAgIHcgPSBpbmxpbmstPnc7CisgICAgaWYgKCEoaCA9IHNjYWxlLT5oKSkKKyAgICAgICAgaCA9IGlubGluay0+aDsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHQgaXMgZGl2aXNpYmxlIGJ5IHRoZSBmYWN0b3Igd2UgZGV0ZXJtaW5lZAorICAgICAqIGVhcmxpZXIuIElmIG5vIGZhY3RvciB3YXMgc2V0LCBpdCBpcyBub3RoaW5nIHdpbGwgaGFwcGVuIGFzIHRoZSBkZWZhdWx0CisgICAgICogZmFjdG9yIGlzIDEgKi8KKyAgICBpZiAodyA8IDApCisgICAgICAgIHcgPSBhdl9yZXNjYWxlKGgsIGlubGluay0+dywgaW5saW5rLT5oICogZmFjdG9yX3cpICogZmFjdG9yX3c7CisgICAgaWYgKGggPCAwKQorICAgICAgICBoID0gYXZfcmVzY2FsZSh3LCBpbmxpbmstPmgsIGlubGluay0+dyAqIGZhY3Rvcl9oKSAqIGZhY3Rvcl9oOworCisgICAgLyogTm90ZSB0aGF0IGZvcmNlX29yaWdpbmFsX2FzcGVjdF9yYXRpbyBtYXkgb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBzZXQKKyAgICAgKiBkaW1lbnNpb25zIHNvIHRoYXQgaXQgaXMgbm90IGRpdmlzaWJsZSBieSB0aGUgc2V0IGZhY3RvcnMgYW55bW9yZS4gKi8KKyAgICBpZiAoc2NhbGUtPmZvcmNlX29yaWdpbmFsX2FzcGVjdF9yYXRpbykgeworICAgICAgICBpbnQgdG1wX3cgPSBhdl9yZXNjYWxlKGgsIGlubGluay0+dywgaW5saW5rLT5oKTsKKyAgICAgICAgaW50IHRtcF9oID0gYXZfcmVzY2FsZSh3LCBpbmxpbmstPmgsIGlubGluay0+dyk7CisKKyAgICAgICAgaWYgKHNjYWxlLT5mb3JjZV9vcmlnaW5hbF9hc3BlY3RfcmF0aW8gPT0gMSkgeworICAgICAgICAgICAgIHcgPSBGRk1JTih0bXBfdywgdyk7CisgICAgICAgICAgICAgaCA9IEZGTUlOKHRtcF9oLCBoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICB3ID0gRkZNQVgodG1wX3csIHcpOworICAgICAgICAgICAgIGggPSBGRk1BWCh0bXBfaCwgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodyA+IElOVF9NQVggfHwgaCA+IElOVF9NQVggfHwKKyAgICAgICAgKGggKiBpbmxpbmstPncpID4gSU5UX01BWCAgfHwKKyAgICAgICAgKHcgKiBpbmxpbmstPmgpID4gSU5UX01BWCkKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUmVzY2FsZWQgdmFsdWUgZm9yIHdpZHRoIG9yIGhlaWdodCBpcyB0b28gYmlnLlxuIik7CisKKyAgICBvdXRsaW5rLT53ID0gdzsKKyAgICBvdXRsaW5rLT5oID0gaDsKKworICAgIC8qIFRPRE86IG1ha2UgYWxnb3JpdGhtIGNvbmZpZ3VyYWJsZSAqLworCisgICAgc2NhbGUtPmlucHV0X2lzX3BhbCA9IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUw7CisgICAgaWYgKG91dGZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpIG91dGZtdCA9IEFWX1BJWF9GTVRfQkdSODsKKyAgICBzY2FsZS0+b3V0cHV0X2lzX3BhbCA9IGF2X3BpeF9mbXRfZGVzY19nZXQob3V0Zm10KS0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGZtdCktPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTDsKKworICAgIGlmIChzY2FsZS0+c3dzKQorICAgICAgICBzd3NfZnJlZUNvbnRleHQoc2NhbGUtPnN3cyk7CisgICAgaWYgKHNjYWxlLT5pc3dzWzBdKQorICAgICAgICBzd3NfZnJlZUNvbnRleHQoc2NhbGUtPmlzd3NbMF0pOworICAgIGlmIChzY2FsZS0+aXN3c1sxXSkKKyAgICAgICAgc3dzX2ZyZWVDb250ZXh0KHNjYWxlLT5pc3dzWzFdKTsKKyAgICBzY2FsZS0+aXN3c1swXSA9IHNjYWxlLT5pc3dzWzFdID0gc2NhbGUtPnN3cyA9IE5VTEw7CisgICAgaWYgKGlubGluay0+dyA9PSBvdXRsaW5rLT53ICYmIGlubGluay0+aCA9PSBvdXRsaW5rLT5oICYmCisgICAgICAgIGlubGluay0+Zm9ybWF0ID09IG91dGxpbmstPmZvcm1hdCkKKyAgICAgICAgOworICAgIGVsc2UgeworICAgICAgICBzdHJ1Y3QgU3dzQ29udGV4dCAqKnN3c2NzWzNdID0geyZzY2FsZS0+c3dzLCAmc2NhbGUtPmlzd3NbMF0sICZzY2FsZS0+aXN3c1sxXX07CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIHN0cnVjdCBTd3NDb250ZXh0ICoqcyA9IHN3c2NzW2ldOworICAgICAgICAgICAgKnMgPSBzd3NfYWxsb2NfY29udGV4dCgpOworICAgICAgICAgICAgaWYgKCEqcykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBpZiAoc2NhbGUtPm9wdHMpIHsKKyAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGUgPSBhdl9kaWN0X2dldChzY2FsZS0+b3B0cywgIiIsIGUsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZfb3B0X3NldCgqcywgZS0+a2V5LCBlLT52YWx1ZSwgMCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9vcHRfc2V0X2ludCgqcywgInNyY3ciLCBpbmxpbmsgLT53LCAwKTsKKyAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KCpzLCAic3JjaCIsIGlubGluayAtPmggPj4gISFpLCAwKTsKKyAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KCpzLCAic3JjX2Zvcm1hdCIsIGlubGluay0+Zm9ybWF0LCAwKTsKKyAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KCpzLCAiZHN0dyIsIG91dGxpbmstPncsIDApOworICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQoKnMsICJkc3RoIiwgb3V0bGluay0+aCA+PiAhIWksIDApOworICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQoKnMsICJkc3RfZm9ybWF0Iiwgb3V0Zm10LCAwKTsKKyAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KCpzLCAic3dzX2ZsYWdzIiwgc2NhbGUtPmZsYWdzLCAwKTsKKworICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQoKnMsICJzcmNfaF9jaHJfcG9zIiwgc2NhbGUtPmluX2hfY2hyX3BvcywgMCk7CisgICAgICAgICAgICBhdl9vcHRfc2V0X2ludCgqcywgInNyY192X2Nocl9wb3MiLCBzY2FsZS0+aW5fdl9jaHJfcG9zLCAwKTsKKyAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KCpzLCAiZHN0X2hfY2hyX3BvcyIsIHNjYWxlLT5vdXRfaF9jaHJfcG9zLCAwKTsKKyAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KCpzLCAiZHN0X3ZfY2hyX3BvcyIsIHNjYWxlLT5vdXRfdl9jaHJfcG9zLCAwKTsKKworICAgICAgICAgICAgaWYgKChyZXQgPSBzd3NfaW5pdF9jb250ZXh0KCpzLCBOVUxMLCBOVUxMKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAoIXNjYWxlLT5pbnRlcmxhY2VkKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0peworICAgICAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfbXVsX3EoKEFWUmF0aW9uYWwpe291dGxpbmstPmggKiBpbmxpbmstPncsIG91dGxpbmstPncgKiBpbmxpbmstPmh9LCBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworICAgIH0gZWxzZQorICAgICAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJ3OiVkIGg6JWQgZm10OiVzIHNhcjolZC8lZCAtPiB3OiVkIGg6JWQgZm10OiVzIHNhcjolZC8lZCBmbGFnczoweCUweFxuIiwKKyAgICAgICAgICAgaW5saW5rIC0+dywgaW5saW5rIC0+aCwgYXZfZ2V0X3BpeF9mbXRfbmFtZSggaW5saW5rLT5mb3JtYXQpLAorICAgICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAorICAgICAgICAgICBvdXRsaW5rLT53LCBvdXRsaW5rLT5oLCBhdl9nZXRfcGl4X2ZtdF9uYW1lKG91dGxpbmstPmZvcm1hdCksCisgICAgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgc2NhbGUtPmZsYWdzKTsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAiRXJyb3Igd2hlbiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uICclcycuXG4iCisgICAgICAgICAgICJNYXliZSB0aGUgZXhwcmVzc2lvbiBmb3Igb3V0X3c6JyVzJyBvciBmb3Igb3V0X2g6JyVzJyBpcyBzZWxmLXJlZmVyZW5jaW5nLlxuIiwKKyAgICAgICAgICAgZXhwciwgc2NhbGUtPndfZXhwciwgc2NhbGUtPmhfZXhwcik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzY2FsZV9zbGljZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKm91dF9idWYsIEFWRnJhbWUgKmN1cl9waWMsIHN0cnVjdCBTd3NDb250ZXh0ICpzd3MsIGludCB5LCBpbnQgaCwgaW50IG11bCwgaW50IGZpZWxkKQoreworICAgIFNjYWxlQ29udGV4dCAqc2NhbGUgPSBsaW5rLT5kc3QtPnByaXY7CisgICAgY29uc3QgdWludDhfdCAqaW5bNF07CisgICAgdWludDhfdCAqb3V0WzRdOworICAgIGludCBpbl9zdHJpZGVbNF0sb3V0X3N0cmlkZVs0XTsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgaW50IHZzdWI9ICgoaSsxKSYyKSA/IHNjYWxlLT52c3ViIDogMDsKKyAgICAgICAgIGluX3N0cmlkZVtpXSA9IGN1cl9waWMtPmxpbmVzaXplW2ldICogbXVsOworICAgICAgICBvdXRfc3RyaWRlW2ldID0gb3V0X2J1Zi0+bGluZXNpemVbaV0gKiBtdWw7CisgICAgICAgICBpbltpXSA9IGN1cl9waWMtPmRhdGFbaV0gKyAoKHk+PnZzdWIpK2ZpZWxkKSAqIGN1cl9waWMtPmxpbmVzaXplW2ldOworICAgICAgICBvdXRbaV0gPSBvdXRfYnVmLT5kYXRhW2ldICsgICAgICAgICAgICBmaWVsZCAgKiBvdXRfYnVmLT5saW5lc2l6ZVtpXTsKKyAgICB9CisgICAgaWYoc2NhbGUtPmlucHV0X2lzX3BhbCkKKyAgICAgICAgIGluWzFdID0gY3VyX3BpYy0+ZGF0YVsxXTsKKyAgICBpZihzY2FsZS0+b3V0cHV0X2lzX3BhbCkKKyAgICAgICAgb3V0WzFdID0gb3V0X2J1Zi0+ZGF0YVsxXTsKKworICAgIHJldHVybiBzd3Nfc2NhbGUoc3dzLCBpbiwgaW5fc3RyaWRlLCB5L211bCwgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQsb3V0X3N0cmlkZSk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgU2NhbGVDb250ZXh0ICpzY2FsZSA9IGxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBsaW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQobGluay0+Zm9ybWF0KTsKKyAgICBjaGFyIGJ1ZlszMl07CisgICAgaW50IGluX3JhbmdlOworCisgICAgaWYoICAgaW4tPndpZHRoICAhPSBsaW5rLT53CisgICAgICAgfHwgaW4tPmhlaWdodCAhPSBsaW5rLT5oCisgICAgICAgfHwgaW4tPmZvcm1hdCAhPSBsaW5rLT5mb3JtYXQpIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKS0xLCAiJWQiLCBvdXRsaW5rLT53KTsKKyAgICAgICAgYXZfb3B0X3NldChzY2FsZSwgInciLCBidWYsIDApOworICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLTEsICIlZCIsIG91dGxpbmstPmgpOworICAgICAgICBhdl9vcHRfc2V0KHNjYWxlLCAiaCIsIGJ1ZiwgMCk7CisKKyAgICAgICAgbGluay0+ZHN0LT5pbnB1dHNbMF0tPmZvcm1hdCA9IGluLT5mb3JtYXQ7CisgICAgICAgIGxpbmstPmRzdC0+aW5wdXRzWzBdLT53ICAgICAgPSBpbi0+d2lkdGg7CisgICAgICAgIGxpbmstPmRzdC0+aW5wdXRzWzBdLT5oICAgICAgPSBpbi0+aGVpZ2h0OworCisgICAgICAgIGlmICgocmV0ID0gY29uZmlnX3Byb3BzKG91dGxpbmspKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICghc2NhbGUtPnN3cykKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBpbik7CisKKyAgICBzY2FsZS0+aHN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgc2NhbGUtPnZzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICBvdXQtPndpZHRoICA9IG91dGxpbmstPnc7CisgICAgb3V0LT5oZWlnaHQgPSBvdXRsaW5rLT5oOworCisgICAgaWYoc2NhbGUtPm91dHB1dF9pc19wYWwpCisgICAgICAgIGF2cHJpdl9zZXRfc3lzdGVtYXRpY19wYWwyKCh1aW50MzJfdCopb3V0LT5kYXRhWzFdLCBvdXRsaW5rLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9QQUw4ID8gQVZfUElYX0ZNVF9CR1I4IDogb3V0bGluay0+Zm9ybWF0KTsKKworICAgIGluX3JhbmdlID0gYXZfZnJhbWVfZ2V0X2NvbG9yX3JhbmdlKGluKTsKKworICAgIGlmICggICBzY2FsZS0+aW5fY29sb3JfbWF0cml4CisgICAgICAgIHx8IHNjYWxlLT5vdXRfY29sb3JfbWF0cml4CisgICAgICAgIHx8IHNjYWxlLT4gaW5fcmFuZ2UgIT0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQKKyAgICAgICAgfHwgaW5fcmFuZ2UgIT0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQKKyAgICAgICAgfHwgc2NhbGUtPm91dF9yYW5nZSAhPSBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRCkgeworICAgICAgICBpbnQgaW5fZnVsbCwgb3V0X2Z1bGwsIGJyaWdodG5lc3MsIGNvbnRyYXN0LCBzYXR1cmF0aW9uOworICAgICAgICBjb25zdCBpbnQgKmludl90YWJsZSwgKnRhYmxlOworCisgICAgICAgIHN3c19nZXRDb2xvcnNwYWNlRGV0YWlscyhzY2FsZS0+c3dzLCAoaW50ICoqKSZpbnZfdGFibGUsICZpbl9mdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCAqKikmdGFibGUsICZvdXRfZnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZicmlnaHRuZXNzLCAmY29udHJhc3QsICZzYXR1cmF0aW9uKTsKKworICAgICAgICBpZiAoc2NhbGUtPmluX2NvbG9yX21hdHJpeCkKKyAgICAgICAgICAgIGludl90YWJsZSA9IHBhcnNlX3l1dl90eXBlKHNjYWxlLT5pbl9jb2xvcl9tYXRyaXgsIGF2X2ZyYW1lX2dldF9jb2xvcnNwYWNlKGluKSk7CisgICAgICAgIGlmIChzY2FsZS0+b3V0X2NvbG9yX21hdHJpeCkKKyAgICAgICAgICAgIHRhYmxlICAgICA9IHBhcnNlX3l1dl90eXBlKHNjYWxlLT5vdXRfY29sb3JfbWF0cml4LCBBVkNPTF9TUENfVU5TUEVDSUZJRUQpOworCisgICAgICAgIGlmIChzY2FsZS0+IGluX3JhbmdlICE9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgaW5fZnVsbCAgPSAoc2NhbGUtPiBpbl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9KUEVHKTsKKyAgICAgICAgZWxzZSBpZiAoaW5fcmFuZ2UgIT0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQpCisgICAgICAgICAgICBpbl9mdWxsICA9IChpbl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9KUEVHKTsKKyAgICAgICAgaWYgKHNjYWxlLT5vdXRfcmFuZ2UgIT0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQpCisgICAgICAgICAgICBvdXRfZnVsbCA9IChzY2FsZS0+b3V0X3JhbmdlID09IEFWQ09MX1JBTkdFX0pQRUcpOworCisgICAgICAgIHN3c19zZXRDb2xvcnNwYWNlRGV0YWlscyhzY2FsZS0+c3dzLCBpbnZfdGFibGUsIGluX2Z1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwgb3V0X2Z1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzLCBjb250cmFzdCwgc2F0dXJhdGlvbik7CisgICAgICAgIGlmIChzY2FsZS0+aXN3c1swXSkKKyAgICAgICAgICAgIHN3c19zZXRDb2xvcnNwYWNlRGV0YWlscyhzY2FsZS0+aXN3c1swXSwgaW52X3RhYmxlLCBpbl9mdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLCBvdXRfZnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzLCBjb250cmFzdCwgc2F0dXJhdGlvbik7CisgICAgICAgIGlmIChzY2FsZS0+aXN3c1sxXSkKKyAgICAgICAgICAgIHN3c19zZXRDb2xvcnNwYWNlRGV0YWlscyhzY2FsZS0+aXN3c1sxXSwgaW52X3RhYmxlLCBpbl9mdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLCBvdXRfZnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzLCBjb250cmFzdCwgc2F0dXJhdGlvbik7CisgICAgfQorCisgICAgYXZfcmVkdWNlKCZvdXQtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCAmb3V0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgKGludDY0X3QpaW4tPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICogb3V0bGluay0+aCAqIGxpbmstPncsCisgICAgICAgICAgICAgIChpbnQ2NF90KWluLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAqIG91dGxpbmstPncgKiBsaW5rLT5oLAorICAgICAgICAgICAgICBJTlRfTUFYKTsKKworICAgIGlmKHNjYWxlLT5pbnRlcmxhY2VkPjAgfHwgKHNjYWxlLT5pbnRlcmxhY2VkPDAgJiYgaW4tPmludGVybGFjZWRfZnJhbWUpKXsKKyAgICAgICAgc2NhbGVfc2xpY2UobGluaywgb3V0LCBpbiwgc2NhbGUtPmlzd3NbMF0sIDAsIChsaW5rLT5oKzEpLzIsIDIsIDApOworICAgICAgICBzY2FsZV9zbGljZShsaW5rLCBvdXQsIGluLCBzY2FsZS0+aXN3c1sxXSwgMCwgIGxpbmstPmggICAvMiwgMiwgMSk7CisgICAgfWVsc2V7CisgICAgICAgIHNjYWxlX3NsaWNlKGxpbmssIG91dCwgaW4sIHNjYWxlLT5zd3MsIDAsIGxpbmstPmgsIDEsIDApOworICAgIH0KKworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzICpjaGlsZF9jbGFzc19uZXh0KGNvbnN0IEFWQ2xhc3MgKnByZXYpCit7CisgICAgcmV0dXJuIHByZXYgPyBOVUxMIDogc3dzX2dldF9jbGFzcygpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTY2FsZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gc2NhbGVfb3B0aW9uc1tdID0geworICAgIHsgInciLCAgICAgIk91dHB1dCB2aWRlbyB3aWR0aCIsICAgICAgICAgIE9GRlNFVCh3X2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsICAgICAgICAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgIndpZHRoIiwgIk91dHB1dCB2aWRlbyB3aWR0aCIsICAgICAgICAgIE9GRlNFVCh3X2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsICAgICAgICAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImgiLCAgICAgIk91dHB1dCB2aWRlbyBoZWlnaHQiLCAgICAgICAgIE9GRlNFVChoX2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsICAgICAgICAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImhlaWdodCIsIk91dHB1dCB2aWRlbyBoZWlnaHQiLCAgICAgICAgIE9GRlNFVChoX2V4cHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsICAgICAgICAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImZsYWdzIiwgIkZsYWdzIHRvIHBhc3MgdG8gbGlic3dzY2FsZSIsIE9GRlNFVChmbGFnc19zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJiaWxpbmVhciIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJpbnRlcmwiLCAic2V0IGludGVybGFjaW5nIiwgT0ZGU0VUKGludGVybGFjZWQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAtMSwgMSwgRkxBR1MgfSwKKyAgICB7ICJzaXplIiwgICAic2V0IHZpZGVvIHNpemUiLCAgICAgICAgICBPRkZTRVQoc2l6ZV9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIEZMQUdTIH0sCisgICAgeyAicyIsICAgICAgInNldCB2aWRlbyBzaXplIiwgICAgICAgICAgT0ZGU0VUKHNpemVfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAwLCBGTEFHUyB9LAorICAgIHsgICJpbl9jb2xvcl9tYXRyaXgiLCAic2V0IGlucHV0IFlDYkNyIHR5cGUiLCAgIE9GRlNFVChpbl9jb2xvcl9tYXRyaXgpLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiYXV0byIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJvdXRfY29sb3JfbWF0cml4IiwgInNldCBvdXRwdXQgWUNiQ3IgdHlwZSIsICBPRkZTRVQob3V0X2NvbG9yX21hdHJpeCksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgICJpbl9yYW5nZSIsICJzZXQgaW5wdXQgY29sb3IgcmFuZ2UiLCAgT0ZGU0VUKCBpbl9yYW5nZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRCB9LCAwLCAyLCBGTEFHUywgInJhbmdlIiB9LAorICAgIHsgIm91dF9yYW5nZSIsICJzZXQgb3V0cHV0IGNvbG9yIHJhbmdlIiwgT0ZGU0VUKG91dF9yYW5nZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRCB9LCAwLCAyLCBGTEFHUywgInJhbmdlIiB9LAorICAgIHsgImF1dG8iLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEIH0sIDAsIDAsIEZMQUdTLCAicmFuZ2UiIH0sCisgICAgeyAiZnVsbCIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfUkFOR0VfSlBFR30sIDAsIDAsIEZMQUdTLCAicmFuZ2UiIH0sCisgICAgeyAianBlZyIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfUkFOR0VfSlBFR30sIDAsIDAsIEZMQUdTLCAicmFuZ2UiIH0sCisgICAgeyAibXBlZyIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfUkFOR0VfTVBFR30sIDAsIDAsIEZMQUdTLCAicmFuZ2UiIH0sCisgICAgeyAidHYiLCAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfUkFOR0VfTVBFR30sIDAsIDAsIEZMQUdTLCAicmFuZ2UiIH0sCisgICAgeyAicGMiLCAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfUkFOR0VfSlBFR30sIDAsIDAsIEZMQUdTLCAicmFuZ2UiIH0sCisgICAgeyAiaW5fdl9jaHJfcG9zIiwgICAiaW5wdXQgdmVydGljYWwgY2hyb21hIHBvc2l0aW9uIGluIGx1bWEgZ3JpZC8yNTYiICAsICAgT0ZGU0VUKGluX3ZfY2hyX3BvcyksICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC01MTN9LCAtNTEzLCA1MTIsIEZMQUdTIH0sCisgICAgeyAiaW5faF9jaHJfcG9zIiwgICAiaW5wdXQgaG9yaXpvbnRhbCBjaHJvbWEgcG9zaXRpb24gaW4gbHVtYSBncmlkLzI1NiIsICAgT0ZGU0VUKGluX2hfY2hyX3BvcyksICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC01MTN9LCAtNTEzLCA1MTIsIEZMQUdTIH0sCisgICAgeyAib3V0X3ZfY2hyX3BvcyIsICAgIm91dHB1dCB2ZXJ0aWNhbCBjaHJvbWEgcG9zaXRpb24gaW4gbHVtYSBncmlkLzI1NiIgICwgT0ZGU0VUKG91dF92X2Nocl9wb3MpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC01MTN9LCAtNTEzLCA1MTIsIEZMQUdTIH0sCisgICAgeyAib3V0X2hfY2hyX3BvcyIsICAgIm91dHB1dCBob3Jpem9udGFsIGNocm9tYSBwb3NpdGlvbiBpbiBsdW1hIGdyaWQvMjU2IiwgT0ZGU0VUKG91dF9oX2Nocl9wb3MpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC01MTN9LCAtNTEzLCA1MTIsIEZMQUdTIH0sCisgICAgeyAiZm9yY2Vfb3JpZ2luYWxfYXNwZWN0X3JhdGlvIiwgImRlY3JlYXNlIG9yIGluY3JlYXNlIHcvaCBpZiBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgb3JpZ2luYWwgQVIiLCBPRkZTRVQoZm9yY2Vfb3JpZ2luYWxfYXNwZWN0X3JhdGlvKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwfSwgMCwgMiwgRkxBR1MsICJmb3JjZV9vYXIiIH0sCisgICAgeyAiZGlzYWJsZSIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAwIH0sIDAsIDAsIEZMQUdTLCAiZm9yY2Vfb2FyIiB9LAorICAgIHsgImRlY3JlYXNlIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMSB9LCAwLCAwLCBGTEFHUywgImZvcmNlX29hciIgfSwKKyAgICB7ICJpbmNyZWFzZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IDIgfSwgMCwgMCwgRkxBR1MsICJmb3JjZV9vYXIiIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHNjYWxlX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICAgID0gInNjYWxlIiwKKyAgICAuaXRlbV9uYW1lICAgICAgICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgICAgICAgID0gc2NhbGVfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICAgICAgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0ZJTFRFUiwKKyAgICAuY2hpbGRfY2xhc3NfbmV4dCA9IGNoaWxkX2NsYXNzX25leHQsCit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfc2NhbGVfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9zY2FsZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3NjYWxlID0geworICAgIC5uYW1lICAgICAgICAgID0gInNjYWxlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTY2FsZSB0aGUgaW5wdXQgdmlkZW8gc2l6ZSBhbmQvb3IgY29udmVydCB0aGUgaW1hZ2UgZm9ybWF0LiIpLAorICAgIC5pbml0X2RpY3QgICAgID0gaW5pdF9kaWN0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihTY2FsZUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnNjYWxlX2NsYXNzLAorICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfdmZfc2NhbGVfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfdmZfc2NhbGVfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc2VwYXJhdGVmaWVsZHMuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zZXBhcmF0ZWZpZWxkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyY2U2ODIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc2VwYXJhdGVmaWVsZHMuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IG5iX3BsYW5lczsKKyAgICBBVkZyYW1lICpzZWNvbmQ7Cit9IFNlcGFyYXRlRmllbGRzQ29udGV4dDsKKworc3RhdGljIGludCBjb25maWdfcHJvcHNfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBTZXBhcmF0ZUZpZWxkc0NvbnRleHQgKnNmID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisKKyAgICBzZi0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgaWYgKGlubGluay0+aCAmIDEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaGVpZ2h0IG11c3QgYmUgZXZlblxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIG91dGxpbmstPnRpbWVfYmFzZS5udW0gPSBpbmxpbmstPnRpbWVfYmFzZS5udW07CisgICAgb3V0bGluay0+dGltZV9iYXNlLmRlbiA9IGlubGluay0+dGltZV9iYXNlLmRlbiAqIDI7CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZS5udW0gPSBpbmxpbmstPmZyYW1lX3JhdGUubnVtICogMjsKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlLmRlbiA9IGlubGluay0+ZnJhbWVfcmF0ZS5kZW47CisgICAgb3V0bGluay0+dyA9IGlubGluay0+dzsKKyAgICBvdXRsaW5rLT5oID0gaW5saW5rLT5oIC8gMjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHRyYWN0X2ZpZWxkKEFWRnJhbWUgKmZyYW1lLCBpbnQgbmJfcGxhbmVzLCBpbnQgdHlwZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9wbGFuZXM7IGkrKykgeworICAgICAgICBpZiAodHlwZSkKKyAgICAgICAgICAgIGZyYW1lLT5kYXRhW2ldID0gZnJhbWUtPmRhdGFbaV0gKyBmcmFtZS0+bGluZXNpemVbaV07CisgICAgICAgIGZyYW1lLT5saW5lc2l6ZVtpXSAqPSAyOworICAgIH0KK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucGljcmVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgU2VwYXJhdGVGaWVsZHNDb250ZXh0ICpzZiA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgaW50IHJldDsKKworICAgIGlucGljcmVmLT5oZWlnaHQgPSBvdXRsaW5rLT5oOworICAgIGlucGljcmVmLT5pbnRlcmxhY2VkX2ZyYW1lID0gMDsKKworICAgIGlmICghc2YtPnNlY29uZCkgeworICAgICAgICBnb3RvIGNsb25lOworICAgIH0gZWxzZSB7CisgICAgICAgIEFWRnJhbWUgKnNlY29uZCA9IHNmLT5zZWNvbmQ7CisKKyAgICAgICAgZXh0cmFjdF9maWVsZChzZWNvbmQsIHNmLT5uYl9wbGFuZXMsIHNlY29uZC0+dG9wX2ZpZWxkX2ZpcnN0KTsKKworICAgICAgICBpZiAoc2Vjb25kLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgICAgIGlucGljcmVmLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBzZWNvbmQtPnB0cyArPSBpbnBpY3JlZi0+cHRzOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWNvbmQtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBzZWNvbmQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CitjbG9uZToKKyAgICAgICAgc2YtPnNlY29uZCA9IGF2X2ZyYW1lX2Nsb25lKGlucGljcmVmKTsKKyAgICAgICAgaWYgKCFzZi0+c2Vjb25kKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBleHRyYWN0X2ZpZWxkKGlucGljcmVmLCBzZi0+bmJfcGxhbmVzLCAhaW5waWNyZWYtPnRvcF9maWVsZF9maXJzdCk7CisKKyAgICBpZiAoaW5waWNyZWYtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgaW5waWNyZWYtPnB0cyAqPSAyOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBpbnBpY3JlZik7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgU2VwYXJhdGVGaWVsZHNDb250ZXh0ICpzZiA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7CisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBzZi0+c2Vjb25kKSB7CisgICAgICAgIHNmLT5zZWNvbmQtPnB0cyAqPSAyOworICAgICAgICBleHRyYWN0X2ZpZWxkKHNmLT5zZWNvbmQsIHNmLT5uYl9wbGFuZXMsIHNmLT5zZWNvbmQtPnRvcF9maWVsZF9maXJzdCk7CisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBzZi0+c2Vjb25kKTsKKyAgICAgICAgc2YtPnNlY29uZCA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNlcGFyYXRlZmllbGRzX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc2VwYXJhdGVmaWVsZHNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19wcm9wc19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9zZXBhcmF0ZWZpZWxkcyA9IHsKKyAgICAubmFtZSAgICAgICAgPSAic2VwYXJhdGVmaWVsZHMiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTcGxpdCBpbnB1dCB2aWRlbyBmcmFtZXMgaW50byBmaWVsZHMuIiksCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFNlcGFyYXRlRmllbGRzQ29udGV4dCksCisgICAgLmlucHV0cyAgICAgID0gc2VwYXJhdGVmaWVsZHNfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IHNlcGFyYXRlZmllbGRzX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3NldGZpZWxkLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc2V0ZmllbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjRkZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3NldGZpZWxkLmMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHNldCBmaWVsZCBvcmRlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK2VudW0gU2V0RmllbGRNb2RlIHsKKyAgICBNT0RFX0FVVE8gPSAtMSwKKyAgICBNT0RFX0JGRiwKKyAgICBNT0RFX1RGRiwKKyAgICBNT0RFX1BST0csCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgZW51bSBTZXRGaWVsZE1vZGUgbW9kZTsKK30gU2V0RmllbGRDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTZXRGaWVsZENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gc2V0ZmllbGRfb3B0aW9uc1tdID0geworICAgIHsibW9kZSIsICJzZWxlY3QgaW50ZXJsYWNlIG1vZGUiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9TU9ERV9BVVRPfSwgLTEsIE1PREVfUFJPRywgRkxBR1MsICJtb2RlIn0sCisgICAgeyJhdXRvIiwgImtlZXAgdGhlIHNhbWUgaW5wdXQgZmllbGQiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU1PREVfQVVUT30sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSJ9LAorICAgIHsiYmZmIiwgICJtYXJrIGFzIGJvdHRvbS1maWVsZC1maXJzdCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT0RFX0JGRn0sICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUifSwKKyAgICB7InRmZiIsICAibWFyayBhcyB0b3AtZmllbGQtZmlyc3QiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9URkZ9LCAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtb2RlIn0sCisgICAgeyJwcm9nIiwgIm1hcmsgYXMgcHJvZ3Jlc3NpdmUiLCAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU1PREVfUFJPR30sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSJ9LAorICAgIHtOVUxMfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHNldGZpZWxkKTsKKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKnBpY3JlZikKK3sKKyAgICBTZXRGaWVsZENvbnRleHQgKnNldGZpZWxkID0gaW5saW5rLT5kc3QtPnByaXY7CisKKyAgICBpZiAoc2V0ZmllbGQtPm1vZGUgPT0gTU9ERV9QUk9HKSB7CisgICAgICAgIHBpY3JlZi0+aW50ZXJsYWNlZF9mcmFtZSA9IDA7CisgICAgfSBlbHNlIGlmIChzZXRmaWVsZC0+bW9kZSAhPSBNT0RFX0FVVE8pIHsKKyAgICAgICAgcGljcmVmLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICAgICAgcGljcmVmLT50b3BfZmllbGRfZmlyc3QgPSBzZXRmaWVsZC0+bW9kZTsKKyAgICB9CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShpbmxpbmstPmRzdC0+b3V0cHV0c1swXSwgcGljcmVmKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNldGZpZWxkX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc2V0ZmllbGRfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3NldGZpZWxkID0geworICAgIC5uYW1lICAgICAgICA9ICJzZXRmaWVsZCIsCisgICAgLmRlc2NyaXB0aW9uID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZvcmNlIGZpZWxkIGZvciB0aGUgb3V0cHV0IHZpZGVvIGZyYW1lLiIpLAorICAgIC5wcml2X3NpemUgICA9IHNpemVvZihTZXRGaWVsZENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICA9ICZzZXRmaWVsZF9jbGFzcywKKyAgICAuaW5wdXRzICAgICAgPSBzZXRmaWVsZF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgID0gc2V0ZmllbGRfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc2hvd2luZm8uYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zaG93aW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhM2JjODMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc2hvd2luZm8uYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTdGVmYW5vIFNhYmF0aW5pCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogZmlsdGVyIGZvciBzaG93aW5nIHRleHR1YWwgdmlkZW8gZnJhbWUgaW5mb3JtYXRpb24KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hZGxlcjMyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Rpc3BsYXkuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zdGVyZW8zZC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lc3RhbXAuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCitzdGF0aWMgdm9pZCBkdW1wX3N0ZXJlbzNkKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lU2lkZURhdGEgKnNkKQoreworICAgIEFWU3RlcmVvM0QgKnN0ZXJlbzsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAic3RlcmVvc2NvcGljIGluZm9ybWF0aW9uOiAiKTsKKyAgICBpZiAoc2QtPnNpemUgPCBzaXplb2YoKnN0ZXJlbykpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJpbnZhbGlkIGRhdGEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZXJlbyA9IChBVlN0ZXJlbzNEICopc2QtPmRhdGE7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgInR5cGUgLSAiKTsKKyAgICBzd2l0Y2ggKHN0ZXJlby0+dHlwZSkgeworICAgIGNhc2UgQVZfU1RFUkVPM0RfMkQ6ICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIyRCIpOyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfU0lERUJZU0lERTogICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJzaWRlIGJ5IHNpZGUiKTsgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfVE9QQk9UVE9NOiAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJ0b3AgYW5kIGJvdHRvbSIpOyAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfRlJBTUVTRVFVRU5DRTogICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJmcmFtZSBhbHRlcm5hdGUiKTsgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfQ0hFQ0tFUkJPQVJEOiAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJjaGVja2VyYm9hcmQiKTsgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfTElORVM6ICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJpbnRlcmxlYXZlZCBsaW5lcyIpOyAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfQ09MVU1OUzogICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJpbnRlcmxlYXZlZCBjb2x1bW5zIik7ICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfU0lERUJZU0lERV9RVUlOQ1VOWDogYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJzaWRlIGJ5IHNpZGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIocXVpbmN1bnggc3Vic2FtcGxpbmcpIik7IGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJ1bmtub3duIik7ICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChzdGVyZW8tPmZsYWdzICYgQVZfU1RFUkVPM0RfRkxBR19JTlZFUlQpCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiIChpbnZlcnRlZCkiKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3NhbXBsZV9zdGF0cyhjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4sIGludDY0X3QgKnN1bSwgaW50NjRfdCAqc3VtMikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAqc3VtICs9IHNyY1tpXTsKKyAgICAgICAgKnN1bTIgKz0gc3JjW2ldICogc3JjW2ldOworICAgIH0KK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgdWludDMyX3QgcGxhbmVfY2hlY2tzdW1bNF0gPSB7MH0sIGNoZWNrc3VtID0gMDsKKyAgICBpbnQ2NF90IHN1bVs0XSA9IHswfSwgc3VtMls0XSA9IHswfTsKKyAgICBpbnQzMl90IHBpeGVsY291bnRbNF0gPSB7MH07CisgICAgaW50IGksIHBsYW5lLCB2c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQgJiYgZnJhbWUtPmRhdGFbcGxhbmVdICYmIGZyYW1lLT5saW5lc2l6ZVtwbGFuZV07IHBsYW5lKyspIHsKKyAgICAgICAgdWludDhfdCAqZGF0YSA9IGZyYW1lLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgaW50IGggPSBwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIgPyBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpIDogaW5saW5rLT5oOworICAgICAgICBpbnQgbGluZXNpemUgPSBhdl9pbWFnZV9nZXRfbGluZXNpemUoZnJhbWUtPmZvcm1hdCwgZnJhbWUtPndpZHRoLCBwbGFuZSk7CisKKyAgICAgICAgaWYgKGxpbmVzaXplIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBsaW5lc2l6ZTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgICAgICBwbGFuZV9jaGVja3N1bVtwbGFuZV0gPSBhdl9hZGxlcjMyX3VwZGF0ZShwbGFuZV9jaGVja3N1bVtwbGFuZV0sIGRhdGEsIGxpbmVzaXplKTsKKyAgICAgICAgICAgIGNoZWNrc3VtID0gYXZfYWRsZXIzMl91cGRhdGUoY2hlY2tzdW0sIGRhdGEsIGxpbmVzaXplKTsKKworICAgICAgICAgICAgdXBkYXRlX3NhbXBsZV9zdGF0cyhkYXRhLCBsaW5lc2l6ZSwgc3VtK3BsYW5lLCBzdW0yK3BsYW5lKTsKKyAgICAgICAgICAgIHBpeGVsY291bnRbcGxhbmVdICs9IGxpbmVzaXplOworICAgICAgICAgICAgZGF0YSArPSBmcmFtZS0+bGluZXNpemVbcGxhbmVdOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICJuOiUiUFJJZDY0IiBwdHM6JXMgcHRzX3RpbWU6JXMgcG9zOiUiUFJJZDY0IiAiCisgICAgICAgICAgICJmbXQ6JXMgc2FyOiVkLyVkIHM6JWR4JWQgaTolYyBpc2tleTolZCB0eXBlOiVjICIKKyAgICAgICAgICAgImNoZWNrc3VtOiUwOCJQUklYMzIiIHBsYW5lX2NoZWNrc3VtOlslMDgiUFJJWDMyLAorICAgICAgICAgICBpbmxpbmstPmZyYW1lX2NvdW50LAorICAgICAgICAgICBhdl90czJzdHIoZnJhbWUtPnB0cyksIGF2X3RzMnRpbWVzdHIoZnJhbWUtPnB0cywgJmlubGluay0+dGltZV9iYXNlKSwgYXZfZnJhbWVfZ2V0X3BrdF9wb3MoZnJhbWUpLAorICAgICAgICAgICBkZXNjLT5uYW1lLAorICAgICAgICAgICBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0LAorICAgICAgICAgICAhZnJhbWUtPmludGVybGFjZWRfZnJhbWUgPyAnUCcgOiAgICAgICAgIC8qIFByb2dyZXNzaXZlICAqLworICAgICAgICAgICBmcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ICAgPyAnVCcgOiAnQicsICAgIC8qIFRvcCAvIEJvdHRvbSAqLworICAgICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lLAorICAgICAgICAgICBhdl9nZXRfcGljdHVyZV90eXBlX2NoYXIoZnJhbWUtPnBpY3RfdHlwZSksCisgICAgICAgICAgIGNoZWNrc3VtLCBwbGFuZV9jaGVja3N1bVswXSk7CisKKyAgICBmb3IgKHBsYW5lID0gMTsgcGxhbmUgPCA0ICYmIGZyYW1lLT5kYXRhW3BsYW5lXSAmJiBmcmFtZS0+bGluZXNpemVbcGxhbmVdOyBwbGFuZSsrKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiAlMDgiUFJJWDMyLCBwbGFuZV9jaGVja3N1bVtwbGFuZV0pOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiXSBtZWFuOlsiKTsKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCA0ICYmIGZyYW1lLT5kYXRhW3BsYW5lXSAmJiBmcmFtZS0+bGluZXNpemVbcGxhbmVdOyBwbGFuZSsrKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiUiUFJJZDY0IiAiLCAoc3VtW3BsYW5lXSArIHBpeGVsY291bnRbcGxhbmVdLzIpIC8gcGl4ZWxjb3VudFtwbGFuZV0pOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiXGJdIHN0ZGV2OlsiKTsKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCA0ICYmIGZyYW1lLT5kYXRhW3BsYW5lXSAmJiBmcmFtZS0+bGluZXNpemVbcGxhbmVdOyBwbGFuZSsrKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiUzLjFmICIsCisgICAgICAgICAgICAgICBzcXJ0KChzdW0yW3BsYW5lXSAtIHN1bVtwbGFuZV0qKGRvdWJsZSlzdW1bcGxhbmVdL3BpeGVsY291bnRbcGxhbmVdKS9waXhlbGNvdW50W3BsYW5lXSkpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiXGJdXG4iKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+bmJfc2lkZV9kYXRhOyBpKyspIHsKKyAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZCA9IGZyYW1lLT5zaWRlX2RhdGFbaV07CisKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgIHNpZGUgZGF0YSAtICIpOworICAgICAgICBzd2l0Y2ggKHNkLT50eXBlKSB7CisgICAgICAgIGNhc2UgQVZfRlJBTUVfREFUQV9QQU5TQ0FOOgorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJwYW4vc2NhbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfRlJBTUVfREFUQV9BNTNfQ0M6CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkEvNTMgY2xvc2VkIGNhcHRpb25zICglZCBieXRlcykiLCBzZC0+c2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9GUkFNRV9EQVRBX1NURVJFTzNEOgorICAgICAgICAgICAgZHVtcF9zdGVyZW8zZChjdHgsIHNkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0ZSQU1FX0RBVEFfRElTUExBWU1BVFJJWDoKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiZGlzcGxheW1hdHJpeDogcm90YXRpb24gb2YgJS4yZiBkZWdyZWVzIiwKKyAgICAgICAgICAgICAgICAgICBhdl9kaXNwbGF5X3JvdGF0aW9uX2dldCgoaW50MzJfdCAqKXNkLT5kYXRhKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9GUkFNRV9EQVRBX0FGRDoKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiYWZkOiB2YWx1ZSBvZiAlIlBSSXU4LCBzZC0+ZGF0YVswXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAidW5rbm93biBzaWRlIGRhdGEgdHlwZSAlZCAoJWQgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICAgICBzZC0+dHlwZSwgc2QtPnNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShpbmxpbmstPmRzdC0+b3V0cHV0c1swXSwgZnJhbWUpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfc2hvd2luZm9faW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9zaG93aW5mb19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8KKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9zaG93aW5mbyA9IHsKKyAgICAubmFtZSAgICAgICAgPSAic2hvd2luZm8iLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTaG93IHRleHR1YWwgaW5mb3JtYXRpb24gZm9yIGVhY2ggdmlkZW8gZnJhbWUuIiksCisgICAgLmlucHV0cyAgICAgID0gYXZmaWx0ZXJfdmZfc2hvd2luZm9faW5wdXRzLAorICAgIC5vdXRwdXRzICAgICA9IGF2ZmlsdGVyX3ZmX3Nob3dpbmZvX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3NodWZmbGVwbGFuZXMuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zaHVmZmxlcGxhbmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwODVjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zaHVmZmxlcGxhbmVzLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgU2h1ZmZsZVBsYW5lc0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgLyogbnVtYmVyIG9mIHBsYW5lcyBpbiB0aGUgc2VsZWN0ZWQgcGl4ZWwgZm9ybWF0ICovCisgICAgaW50IHBsYW5lczsKKworICAgIC8qIG1hcHBpbmcgaW5kaWNlcyAqLworICAgIGludCBtYXBbNF07CisKKyAgICAvKiBzZXQgdG8gMSBpZiBzb21lIHBsYW5lIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UsIHNvIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkgKi8KKyAgICBpbnQgY29weTsKK30gU2h1ZmZsZVBsYW5lc0NvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBzaHVmZmxlcGxhbmVzX2NvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICAgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFNodWZmbGVQbGFuZXNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKKyAgICBpbnQgdXNlZFs0XSA9IHsgMCB9OworICAgIGludCBpOworCisgICAgcy0+Y29weSAgID0gMDsKKyAgICBzLT5wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhpbmxpbmstPmZvcm1hdCk7CisgICAgZGVzYyAgICAgID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cGxhbmVzOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPm1hcFtpXSA+PSBzLT5wbGFuZXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTm9uLWV4aXN0aW5nIGlucHV0IHBsYW5lICMlZCBtYXBwZWQgdG8gb3V0cHV0IHBsYW5lICMlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgcy0+bWFwW2ldLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGRlc2MtPmxvZzJfY2hyb21hX2ggfHwgZGVzYy0+bG9nMl9jaHJvbWFfdykgJiYKKyAgICAgICAgICAgIChpID09IDEgfHwgaSA9PSAyKSAhPSAocy0+bWFwW2ldID09IDEgfHwgcy0+bWFwW2ldID09IDIpKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBtYXAgYmV0d2VlbiBhIHN1YnNhbXBsZWQgY2hyb21hIHBsYW5lIGFuZCBhIGx1bWEgIgorICAgICAgICAgICAgICAgICAgICJvciBhbHBoYSBwbGFuZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8CisgICAgICAgICAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKSAmJgorICAgICAgICAgICAgKGkgPT0gMSkgIT0gKHMtPm1hcFtpXSA9PSAxKSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDYW5ub3QgbWFwIGJldHdlZW4gYSBwYWxldHRlIHBsYW5lIGFuZCBhIGRhdGEgcGxhbmUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzZWRbcy0+bWFwW2ldXSkKKyAgICAgICAgICAgIHMtPmNvcHkgPSAxOworICAgICAgICB1c2VkW3MtPm1hcFtpXV0rKzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaHVmZmxlcGxhbmVzX2ZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAgICAgICAgICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBTaHVmZmxlUGxhbmVzQ29udGV4dCAgICAgICAqcyA9IGN0eC0+cHJpdjsKKyAgICB1aW50OF90ICpzaHVmZmxlZF9kYXRhWzRdICAgICA9IHsgTlVMTCB9OworICAgIGludCAgICAgIHNodWZmbGVkX2xpbmVzaXplWzRdID0geyAwIH07CisgICAgaW50IGksIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5wbGFuZXM7IGkrKykgeworICAgICAgICBzaHVmZmxlZF9kYXRhW2ldICAgICA9IGZyYW1lLT5kYXRhW3MtPm1hcFtpXV07CisgICAgICAgIHNodWZmbGVkX2xpbmVzaXplW2ldID0gZnJhbWUtPmxpbmVzaXplW3MtPm1hcFtpXV07CisgICAgfQorICAgIG1lbWNweShmcmFtZS0+ZGF0YSwgICAgIHNodWZmbGVkX2RhdGEsICAgICBzaXplb2Yoc2h1ZmZsZWRfZGF0YSkpOworICAgIG1lbWNweShmcmFtZS0+bGluZXNpemUsIHNodWZmbGVkX2xpbmVzaXplLCBzaXplb2Yoc2h1ZmZsZWRfbGluZXNpemUpKTsKKworICAgIGlmIChzLT5jb3B5KSB7CisgICAgICAgIEFWRnJhbWUgKmNvcHkgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKGN0eC0+b3V0cHV0c1swXSwgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0KTsKKworICAgICAgICBpZiAoIWNvcHkpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyYW1lX2NvcHkoY29weSwgZnJhbWUpOworCisgICAgICAgIHJldCA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMoY29weSwgZnJhbWUpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmY29weSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgIGZyYW1lID0gY29weTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgZnJhbWUpOworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU2h1ZmZsZVBsYW5lc0NvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzaHVmZmxlcGxhbmVzX29wdGlvbnNbXSA9IHsKKyAgICB7ICJtYXAwIiwgIkluZGV4IG9mIHRoZSBpbnB1dCBwbGFuZSB0byBiZSB1c2VkIGFzIHRoZSBmaXJzdCBvdXRwdXQgcGxhbmUgIiwgIE9GRlNFVChtYXBbMF0pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgNCwgRkxBR1MgfSwKKyAgICB7ICJtYXAxIiwgIkluZGV4IG9mIHRoZSBpbnB1dCBwbGFuZSB0byBiZSB1c2VkIGFzIHRoZSBzZWNvbmQgb3V0cHV0IHBsYW5lICIsIE9GRlNFVChtYXBbMV0pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgNCwgRkxBR1MgfSwKKyAgICB7ICJtYXAyIiwgIkluZGV4IG9mIHRoZSBpbnB1dCBwbGFuZSB0byBiZSB1c2VkIGFzIHRoZSB0aGlyZCBvdXRwdXQgcGxhbmUgIiwgIE9GRlNFVChtYXBbMl0pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDIgfSwgMCwgNCwgRkxBR1MgfSwKKyAgICB7ICJtYXAzIiwgIkluZGV4IG9mIHRoZSBpbnB1dCBwbGFuZSB0byBiZSB1c2VkIGFzIHRoZSBmb3VydGggb3V0cHV0IHBsYW5lICIsIE9GRlNFVChtYXBbM10pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDMgfSwgMCwgNCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHNodWZmbGVwbGFuZXNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAic2h1ZmZsZXBsYW5lcyIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IHNodWZmbGVwbGFuZXNfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzaHVmZmxlcGxhbmVzX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICAgICA9IHNodWZmbGVwbGFuZXNfY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lICAgICA9IHNodWZmbGVwbGFuZXNfZmlsdGVyX2ZyYW1lLAorICAgICAgICAuZ2V0X3ZpZGVvX2J1ZmZlciA9IGZmX251bGxfZ2V0X3ZpZGVvX2J1ZmZlciwKKyAgICB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNodWZmbGVwbGFuZXNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkZpbHRlciBmZl92Zl9zaHVmZmxlcGxhbmVzID0geworICAgIC5uYW1lICAgICAgICAgPSAic2h1ZmZsZXBsYW5lcyIsCisgICAgLmRlc2NyaXB0aW9uICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTaHVmZmxlIHZpZGVvIHBsYW5lcyIpLAorCisgICAgLnByaXZfc2l6ZSAgICA9IHNpemVvZihTaHVmZmxlUGxhbmVzQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICA9ICZzaHVmZmxlcGxhbmVzX2NsYXNzLAorCisgICAgLmlucHV0cyAgICAgICA9IHNodWZmbGVwbGFuZXNfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgPSBzaHVmZmxlcGxhbmVzX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3NpZ25hbHN0YXRzLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc2lnbmFsc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI3OTJmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3NpZ25hbHN0YXRzLmMKQEAgLTAsMCArMSw1OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFyayBIZWF0aCBtanBlZzAgQCBzaWxpY29udHJpcCBkb3Qgb3JnCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2zDqW1lbnQgQsWTc2NoCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgRGF2ZSBSaWNlIEBkZXJpY2VkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitlbnVtIEZpbHRlck1vZGUgeworICAgIEZJTFRFUl9OT05FID0gLTEsCisgICAgRklMVEVSX1RPVVQsCisgICAgRklMVEVSX1ZSRVAsCisgICAgRklMVEVSX0JSTkcsCisgICAgRklMVF9OVU1CCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IGNocm9tYWg7ICAgIC8vIGhlaWdodCBvZiBjaHJvbWEgcGxhbmUKKyAgICBpbnQgY2hyb21hdzsgICAgLy8gd2lkdGggb2YgY2hyb21hIHBsYW5lCisgICAgaW50IGhzdWI7ICAgICAgIC8vIGhvcml6b250YWwgc3Vic2FtcGxpbmcKKyAgICBpbnQgdnN1YjsgICAgICAgLy8gdmVydGljYWwgc3Vic2FtcGxpbmcKKyAgICBpbnQgZnM7ICAgICAgICAgLy8gcGl4ZWwgY291bnQgcGVyIGZyYW1lCisgICAgaW50IGNmczsgICAgICAgIC8vIHBpeGVsIGNvdW50IHBlciBmcmFtZSBvZiBjaHJvbWEgcGxhbmVzCisgICAgZW51bSBGaWx0ZXJNb2RlIG91dGZpbHRlcjsKKyAgICBpbnQgZmlsdGVyczsKKyAgICBBVkZyYW1lICpmcmFtZV9wcmV2OworICAgIHVpbnQ4X3QgcmdiYV9jb2xvcls0XTsKKyAgICBpbnQgeXV2X2NvbG9yWzNdOworICAgIGludCBuYl9qb2JzOworICAgIGludCAqam9ic19yZXRzOworCisgICAgQVZGcmFtZSAqZnJhbWVfc2F0OworICAgIEFWRnJhbWUgKmZyYW1lX2h1ZTsKK30gU2lnbmFsc3RhdHNDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBUaHJlYWREYXRhIHsKKyAgICBjb25zdCBBVkZyYW1lICppbjsKKyAgICBBVkZyYW1lICpvdXQ7Cit9IFRocmVhZERhdGE7CisKK3R5cGVkZWYgc3RydWN0IFRocmVhZERhdGFIdWVTYXRNZXRyaWNzIHsKKyAgICBjb25zdCBBVkZyYW1lICpzcmM7CisgICAgQVZGcmFtZSAqZHN0X3NhdCwgKmRzdF9odWU7Cit9IFRocmVhZERhdGFIdWVTYXRNZXRyaWNzOworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTaWduYWxzdGF0c0NvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gc2lnbmFsc3RhdHNfb3B0aW9uc1tdID0geworICAgIHsic3RhdCIsICJzZXQgc3RhdGlzdGljcyBmaWx0ZXJzIiwgT0ZGU0VUKGZpbHRlcnMpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQ9MH0sIDAsIElOVF9NQVgsIEZMQUdTLCAiZmlsdGVycyJ9LAorICAgICAgICB7InRvdXQiLCAiYW5hbHl6ZSBwaXhlbHMgZm9yIHRlbXBvcmFsIG91dGxpZXJzIiwgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTE8PEZJTFRFUl9UT1VUfSwgMCwgMCwgRkxBR1MsICJmaWx0ZXJzIn0sCisgICAgICAgIHsidnJlcCIsICJhbmFseXplIHZpZGVvIGxpbmVzIGZvciB2ZXJ0aWNhbCBsaW5lIHJlcGV0aXRpb24iLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MTw8RklMVEVSX1ZSRVB9LCAwLCAwLCBGTEFHUywgImZpbHRlcnMifSwKKyAgICAgICAgeyJicm5nIiwgImFuYWx5emUgZm9yIHBpeGVscyBvdXRzaWRlIG9mIGJyb2FkY2FzdCByYW5nZSIsICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xPDxGSUxURVJfQlJOR30sIDAsIDAsIEZMQUdTLCAiZmlsdGVycyJ9LAorICAgIHsib3V0IiwgInNldCB2aWRlbyBmaWx0ZXIiLCBPRkZTRVQob3V0ZmlsdGVyKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1GSUxURVJfTk9ORX0sIC0xLCBGSUxUX05VTUItMSwgRkxBR1MsICJvdXQifSwKKyAgICAgICAgeyJ0b3V0IiwgImhpZ2hsaWdodCBwaXhlbHMgdGhhdCBkZXBpY3QgdGVtcG9yYWwgb3V0bGllcnMiLCAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZJTFRFUl9UT1VUfSwgMCwgMCwgRkxBR1MsICJvdXQifSwKKyAgICAgICAgeyJ2cmVwIiwgImhpZ2hsaWdodCB2aWRlbyBsaW5lcyB0aGF0IGRlcGljdCB2ZXJ0aWNhbCBsaW5lIHJlcGV0aXRpb24iLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZJTFRFUl9WUkVQfSwgMCwgMCwgRkxBR1MsICJvdXQifSwKKyAgICAgICAgeyJicm5nIiwgImhpZ2hsaWdodCBwaXhlbHMgdGhhdCBhcmUgb3V0c2lkZSBvZiBicm9hZGNhc3QgcmFuZ2UiLCAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZJTFRFUl9CUk5HfSwgMCwgMCwgRkxBR1MsICJvdXQifSwKKyAgICB7ImMiLCAgICAgInNldCBoaWdobGlnaHQgY29sb3IiLCBPRkZTRVQocmdiYV9jb2xvciksIEFWX09QVF9UWVBFX0NPTE9SLCB7LnN0cj0ieWVsbG93In0sIC5mbGFncz1GTEFHU30sCisgICAgeyJjb2xvciIsICJzZXQgaGlnaGxpZ2h0IGNvbG9yIiwgT0ZGU0VUKHJnYmFfY29sb3IpLCBBVl9PUFRfVFlQRV9DT0xPUiwgey5zdHI9InllbGxvdyJ9LCAuZmxhZ3M9RkxBR1N9LAorICAgIHtOVUxMfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHNpZ25hbHN0YXRzKTsKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgdWludDhfdCByLCBnLCBiOworICAgIFNpZ25hbHN0YXRzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlmIChzLT5vdXRmaWx0ZXIgIT0gRklMVEVSX05PTkUpCisgICAgICAgIHMtPmZpbHRlcnMgfD0gMSA8PCBzLT5vdXRmaWx0ZXI7CisKKyAgICByID0gcy0+cmdiYV9jb2xvclswXTsKKyAgICBnID0gcy0+cmdiYV9jb2xvclsxXTsKKyAgICBiID0gcy0+cmdiYV9jb2xvclsyXTsKKyAgICBzLT55dXZfY29sb3JbMF0gPSAoKCA2NipyICsgMTI5KmcgKyAgMjUqYiArICgxPDw3KSkgPj4gOCkgKyAgMTY7CisgICAgcy0+eXV2X2NvbG9yWzFdID0gKCgtMzgqciArIC03NCpnICsgMTEyKmIgKyAoMTw8NykpID4+IDgpICsgMTI4OworICAgIHMtPnl1dl9jb2xvclsyXSA9ICgoMTEyKnIgKyAtOTQqZyArIC0xOCpiICsgKDE8PDcpKSA+PiA4KSArIDEyODsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU2lnbmFsc3RhdHNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lX3ByZXYpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lX3NhdCk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWVfaHVlKTsKKyAgICBhdl9mcmVlcCgmcy0+am9ic19yZXRzKTsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIC8vIFRPRE86IGFkZCBtb3JlCisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEFWRnJhbWUgKmFsbG9jX2ZyYW1lKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhmbXQsIGludCB3LCBpbnQgaCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmcmFtZS0+Zm9ybWF0ID0gcGl4Zm10OworICAgIGZyYW1lLT53aWR0aCAgPSB3OworICAgIGZyYW1lLT5oZWlnaHQgPSBoOworCisgICAgaWYgKGF2X2ZyYW1lX2dldF9idWZmZXIoZnJhbWUsIDMyKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGZyYW1lOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgU2lnbmFsc3RhdHNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChvdXRsaW5rLT5mb3JtYXQpOworICAgIHMtPmhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHMtPnZzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgb3V0bGluay0+dyA9IGlubGluay0+dzsKKyAgICBvdXRsaW5rLT5oID0gaW5saW5rLT5oOworCisgICAgcy0+Y2hyb21hdyA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+dywgcy0+aHN1Yik7CisgICAgcy0+Y2hyb21haCA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwgcy0+dnN1Yik7CisKKyAgICBzLT5mcyA9IGlubGluay0+dyAqIGlubGluay0+aDsKKyAgICBzLT5jZnMgPSBzLT5jaHJvbWF3ICogcy0+Y2hyb21haDsKKworICAgIHMtPm5iX2pvYnMgICA9IEZGTUFYKDEsIEZGTUlOKGlubGluay0+aCwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworICAgIHMtPmpvYnNfcmV0cyA9IGF2X21hbGxvY19hcnJheShzLT5uYl9qb2JzLCBzaXplb2YoKnMtPmpvYnNfcmV0cykpOworICAgIGlmICghcy0+am9ic19yZXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+ZnJhbWVfc2F0ID0gYWxsb2NfZnJhbWUoQVZfUElYX0ZNVF9HUkFZOCwgIGlubGluay0+dywgaW5saW5rLT5oKTsKKyAgICBzLT5mcmFtZV9odWUgPSBhbGxvY19mcmFtZShBVl9QSVhfRk1UX0dSQVkxNiwgaW5saW5rLT53LCBpbmxpbmstPmgpOworICAgIGlmICghcy0+ZnJhbWVfc2F0IHx8ICFzLT5mcmFtZV9odWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnVybl9mcmFtZShjb25zdCBTaWduYWxzdGF0c0NvbnRleHQgKnMsIEFWRnJhbWUgKmYsIGludCB4LCBpbnQgeSkKK3sKKyAgICBjb25zdCBpbnQgY2hyb21heCA9IHggPj4gcy0+aHN1YjsKKyAgICBjb25zdCBpbnQgY2hyb21heSA9IHkgPj4gcy0+dnN1YjsKKyAgICBmLT5kYXRhWzBdW3kgICAgICAgKiBmLT5saW5lc2l6ZVswXSArICAgICAgIHhdID0gcy0+eXV2X2NvbG9yWzBdOworICAgIGYtPmRhdGFbMV1bY2hyb21heSAqIGYtPmxpbmVzaXplWzFdICsgY2hyb21heF0gPSBzLT55dXZfY29sb3JbMV07CisgICAgZi0+ZGF0YVsyXVtjaHJvbWF5ICogZi0+bGluZXNpemVbMl0gKyBjaHJvbWF4XSA9IHMtPnl1dl9jb2xvclsyXTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfYnJuZyhBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIFRocmVhZERhdGEgKnRkID0gYXJnOworICAgIGNvbnN0IFNpZ25hbHN0YXRzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVkZyYW1lICppbiA9IHRkLT5pbjsKKyAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OworICAgIGNvbnN0IGludCB3ID0gaW4tPndpZHRoOworICAgIGNvbnN0IGludCBoID0gaW4tPmhlaWdodDsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoaCAqICBqb2JuciAgICkgLyBuYl9qb2JzOworICAgIGNvbnN0IGludCBzbGljZV9lbmQgICA9IChoICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgaW50IHgsIHksIHNjb3JlID0gMDsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgY29uc3QgaW50IHljID0geSA+PiBzLT52c3ViOworICAgICAgICBjb25zdCB1aW50OF90ICpwbHVtYSAgICA9ICZpbi0+ZGF0YVswXVt5ICAqIGluLT5saW5lc2l6ZVswXV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBjaHJvbWF1ID0gJmluLT5kYXRhWzFdW3ljICogaW4tPmxpbmVzaXplWzFdXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcGNocm9tYXYgPSAmaW4tPmRhdGFbMl1beWMgKiBpbi0+bGluZXNpemVbMl1dOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB4YyA9IHggPj4gcy0+aHN1YjsKKyAgICAgICAgICAgIGNvbnN0IGludCBsdW1hICAgID0gcGx1bWFbeF07CisgICAgICAgICAgICBjb25zdCBpbnQgY2hyb21hdSA9IHBjaHJvbWF1W3hjXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBjaHJvbWF2ID0gcGNocm9tYXZbeGNdOworICAgICAgICAgICAgY29uc3QgaW50IGZpbHQgPSBsdW1hICAgIDwgMTYgfHwgbHVtYSAgICA+IDIzNSB8fAorICAgICAgICAgICAgICAgIGNocm9tYXUgPCAxNiB8fCBjaHJvbWF1ID4gMjQwIHx8CisgICAgICAgICAgICAgICAgY2hyb21hdiA8IDE2IHx8IGNocm9tYXYgPiAyNDA7CisgICAgICAgICAgICBzY29yZSArPSBmaWx0OworICAgICAgICAgICAgaWYgKG91dCAmJiBmaWx0KQorICAgICAgICAgICAgICAgIGJ1cm5fZnJhbWUocywgb3V0LCB4LCB5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2NvcmU7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX3RvdXRfb3V0bGllcih1aW50OF90IHgsIHVpbnQ4X3QgeSwgdWludDhfdCB6KQoreworICAgIHJldHVybiAoKGFicyh4IC0geSkgKyBhYnMgKHogLSB5KSkgLyAyKSAtIGFicyh6IC0geCkgPiA0OyAvLyBtYWtlIDQgY29uZmlndXJhYmxlPworfQorCitzdGF0aWMgaW50IGZpbHRlcl90b3V0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgY29uc3QgU2lnbmFsc3RhdHNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWRnJhbWUgKmluID0gdGQtPmluOworICAgIEFWRnJhbWUgKm91dCA9IHRkLT5vdXQ7CisgICAgY29uc3QgaW50IHcgPSBpbi0+d2lkdGg7CisgICAgY29uc3QgaW50IGggPSBpbi0+aGVpZ2h0OworICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChoICogIGpvYm5yICAgKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCAgID0gKGggKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCB1aW50OF90ICpwID0gaW4tPmRhdGFbMF07CisgICAgaW50IGx3ID0gaW4tPmxpbmVzaXplWzBdOworICAgIGludCB4LCB5LCBzY29yZSA9IDAsIGZpbHQ7CisKKyAgICBmb3IgKHkgPSBzbGljZV9zdGFydDsgeSA8IHNsaWNlX2VuZDsgeSsrKSB7CisKKyAgICAgICAgaWYgKHkgLSAxIDwgMCB8fCB5ICsgMSA+PSBoKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gZGV0ZWN0IHR3byBwaXhlbHMgYWJvdmUgYW5kIGJlbG93ICh0byBlbGltaW5hdGUgaW50ZXJsYWNlIGFydGVmYWN0cykKKyAgICAgICAgLy8gc2hvdWxkIGNoZWNrIHRoYXQgdmlkZW8gZm9ybWF0IGlzIGluZmFjdCBpbnRlcmxhY2VkLgorCisjZGVmaW5lIEZJTFRFUihpLCBqKSBcCisgICAgICAgIGZpbHRlcl90b3V0X291dGxpZXIocFsoeS1qKSAqIGx3ICsgeCArIGldLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFsgICAgeSAqIGx3ICsgeCArIGldLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFsoeStqKSAqIGx3ICsgeCArIGldKQorCisjZGVmaW5lIEZJTFRFUjMoaikgKEZJTFRFUigtMSwgaikgJiYgRklMVEVSKDAsIGopICYmIEZJTFRFUigxLCBqKSkKKworICAgICAgICBpZiAoeSAtIDIgPj0gMCAmJiB5ICsgMiA8IGgpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDE7IHggPCB3IC0gMTsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmlsdCA9IEZJTFRFUjMoMikgJiYgRklMVEVSMygxKTsKKyAgICAgICAgICAgICAgICBzY29yZSArPSBmaWx0OworICAgICAgICAgICAgICAgIGlmIChmaWx0ICYmIG91dCkKKyAgICAgICAgICAgICAgICAgICAgYnVybl9mcmFtZShzLCBvdXQsIHgsIHkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh4ID0gMTsgeCA8IHcgLSAxOyB4KyspIHsKKyAgICAgICAgICAgICAgICBmaWx0ID0gRklMVEVSMygxKTsKKyAgICAgICAgICAgICAgICBzY29yZSArPSBmaWx0OworICAgICAgICAgICAgICAgIGlmIChmaWx0ICYmIG91dCkKKyAgICAgICAgICAgICAgICAgICAgYnVybl9mcmFtZShzLCBvdXQsIHgsIHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzY29yZTsKK30KKworI2RlZmluZSBWUkVQX1NUQVJUIDQKKworc3RhdGljIGludCBmaWx0ZXJfdnJlcChBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIFRocmVhZERhdGEgKnRkID0gYXJnOworICAgIGNvbnN0IFNpZ25hbHN0YXRzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVkZyYW1lICppbiA9IHRkLT5pbjsKKyAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OworICAgIGNvbnN0IGludCB3ID0gaW4tPndpZHRoOworICAgIGNvbnN0IGludCBoID0gaW4tPmhlaWdodDsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoaCAqICBqb2JuciAgICkgLyBuYl9qb2JzOworICAgIGNvbnN0IGludCBzbGljZV9lbmQgICA9IChoICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgY29uc3QgdWludDhfdCAqcCA9IGluLT5kYXRhWzBdOworICAgIGNvbnN0IGludCBsdyA9IGluLT5saW5lc2l6ZVswXTsKKyAgICBpbnQgeCwgeSwgc2NvcmUgPSAwOworCisgICAgZm9yICh5ID0gc2xpY2Vfc3RhcnQ7IHkgPCBzbGljZV9lbmQ7IHkrKykgeworICAgICAgICBjb25zdCBpbnQgeTJsdyA9ICh5IC0gVlJFUF9TVEFSVCkgKiBsdzsKKyAgICAgICAgY29uc3QgaW50IHlsdyAgPSAgeSAgICAgICAgICAgICAgICogbHc7CisgICAgICAgIGludCBmaWx0LCB0b3RkaWZmID0gMDsKKworICAgICAgICBpZiAoeSA8IFZSRVBfU1RBUlQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgdG90ZGlmZiArPSBhYnMocFt5Mmx3ICsgeF0gLSBwW3lsdyArIHhdKTsKKyAgICAgICAgZmlsdCA9IHRvdGRpZmYgPCB3OworCisgICAgICAgIHNjb3JlICs9IGZpbHQ7CisgICAgICAgIGlmIChmaWx0ICYmIG91dCkKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICAgICAgYnVybl9mcmFtZShzLCBvdXQsIHgsIHkpOworICAgIH0KKyAgICByZXR1cm4gc2NvcmUgKiB3OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCAoKnByb2Nlc3MpKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpOworfSBmaWx0ZXJzX2RlZltdID0geworICAgIHsiVE9VVCIsIGZpbHRlcl90b3V0fSwKKyAgICB7IlZSRVAiLCBmaWx0ZXJfdnJlcH0sCisgICAgeyJCUk5HIiwgZmlsdGVyX2Jybmd9LAorICAgIHtOVUxMfQorfTsKKworI2RlZmluZSBERVBUSCAyNTYKKworc3RhdGljIGludCBjb21wdXRlX3NhdF9odWVfbWV0cmljcyhBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIGludCBpLCBqOworICAgIFRocmVhZERhdGFIdWVTYXRNZXRyaWNzICp0ZCA9IGFyZzsKKyAgICBjb25zdCBTaWduYWxzdGF0c0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZGcmFtZSAqc3JjID0gdGQtPnNyYzsKKyAgICBBVkZyYW1lICpkc3Rfc2F0ID0gdGQtPmRzdF9zYXQ7CisgICAgQVZGcmFtZSAqZHN0X2h1ZSA9IHRkLT5kc3RfaHVlOworCisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKHMtPmNocm9tYWggKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kICAgPSAocy0+Y2hyb21haCAqIChqb2JucisxKSkgLyBuYl9qb2JzOworCisgICAgY29uc3QgaW50IGxzel91ID0gc3JjLT5saW5lc2l6ZVsxXTsKKyAgICBjb25zdCBpbnQgbHN6X3YgPSBzcmMtPmxpbmVzaXplWzJdOworICAgIGNvbnN0IHVpbnQ4X3QgKnBfdSA9IHNyYy0+ZGF0YVsxXSArIHNsaWNlX3N0YXJ0ICogbHN6X3U7CisgICAgY29uc3QgdWludDhfdCAqcF92ID0gc3JjLT5kYXRhWzJdICsgc2xpY2Vfc3RhcnQgKiBsc3pfdjsKKworICAgIGNvbnN0IGludCBsc3pfc2F0ID0gZHN0X3NhdC0+bGluZXNpemVbMF07CisgICAgY29uc3QgaW50IGxzel9odWUgPSBkc3RfaHVlLT5saW5lc2l6ZVswXTsKKyAgICB1aW50OF90ICpwX3NhdCA9IGRzdF9zYXQtPmRhdGFbMF0gKyBzbGljZV9zdGFydCAqIGxzel9zYXQ7CisgICAgdWludDhfdCAqcF9odWUgPSBkc3RfaHVlLT5kYXRhWzBdICsgc2xpY2Vfc3RhcnQgKiBsc3pfaHVlOworCisgICAgZm9yIChqID0gc2xpY2Vfc3RhcnQ7IGogPCBzbGljZV9lbmQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hyb21hdzsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgeXV2dSA9IHBfdVtpXTsKKyAgICAgICAgICAgIGNvbnN0IGludCB5dXZ2ID0gcF92W2ldOworICAgICAgICAgICAgcF9zYXRbaV0gPSBoeXBvdCh5dXZ1IC0gMTI4LCB5dXZ2IC0gMTI4KTsgLy8gaW50IG9yIHJvdW5kPworICAgICAgICAgICAgKChpbnQxNl90KilwX2h1ZSlbaV0gPSBmbG9vcigoMTgwIC8gTV9QSSkgKiBhdGFuMmYoeXV2dS0xMjgsIHl1dnYtMTI4KSArIDE4MCk7CisgICAgICAgIH0KKyAgICAgICAgcF91ICAgKz0gbHN6X3U7CisgICAgICAgIHBfdiAgICs9IGxzel92OworICAgICAgICBwX3NhdCArPSBsc3pfc2F0OworICAgICAgICBwX2h1ZSArPSBsc3pfaHVlOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+ZHN0OworICAgIFNpZ25hbHN0YXRzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0ID0gaW47CisgICAgaW50IGksIGo7CisgICAgaW50ICB3ID0gMCwgIGN3ID0gMCwgLy8gaW4KKyAgICAgICAgcHcgPSAwLCBjcHcgPSAwOyAvLyBwcmV2CisgICAgaW50IGZpbDsKKyAgICBjaGFyIG1ldGFidWZbMTI4XTsKKyAgICB1bnNpZ25lZCBpbnQgaGlzdHlbREVQVEhdID0gezB9LAorICAgICAgICAgICAgICAgICBoaXN0dVtERVBUSF0gPSB7MH0sCisgICAgICAgICAgICAgICAgIGhpc3R2W0RFUFRIXSA9IHswfSwKKyAgICAgICAgICAgICAgICAgaGlzdGh1ZVszNjBdID0gezB9LAorICAgICAgICAgICAgICAgICBoaXN0c2F0W0RFUFRIXSA9IHswfTsgLy8gbGltaXRlZCB0byA4IGJpdCBkYXRhLgorICAgIGludCBtaW55ICA9IC0xLCBtaW51ICA9IC0xLCBtaW52ICA9IC0xOworICAgIGludCBtYXh5ICA9IC0xLCBtYXh1ICA9IC0xLCBtYXh2ICA9IC0xOworICAgIGludCBsb3d5ICA9IC0xLCBsb3d1ICA9IC0xLCBsb3d2ICA9IC0xOworICAgIGludCBoaWdoeSA9IC0xLCBoaWdodSA9IC0xLCBoaWdodiA9IC0xOworICAgIGludCBtaW5zYXQgPSAtMSwgbWF4c2F0ID0gLTEsIGxvd3NhdCA9IC0xLCBoaWdoc2F0ID0gLTE7CisgICAgaW50IGxvd3AsIGhpZ2hwLCBjbG93cCwgY2hpZ2hwOworICAgIGludCBhY2N5LCBhY2N1LCBhY2N2OworICAgIGludCBhY2NzYXQsIGFjY2h1ZSA9IDA7CisgICAgaW50IG1lZGh1ZSwgbWF4aHVlOworICAgIGludCB0b3R5ID0gMCwgdG90dSA9IDAsIHRvdHYgPSAwLCB0b3RzYXQ9MDsKKyAgICBpbnQgdG90aHVlID0gMDsKKyAgICBpbnQgZGlmeSA9IDAsIGRpZnUgPSAwLCBkaWZ2ID0gMDsKKworICAgIGludCBmaWx0b3RbRklMVF9OVU1CXSA9IHswfTsKKyAgICBBVkZyYW1lICpwcmV2OworCisgICAgQVZGcmFtZSAqc2F0ID0gcy0+ZnJhbWVfc2F0OworICAgIEFWRnJhbWUgKmh1ZSA9IHMtPmZyYW1lX2h1ZTsKKyAgICBjb25zdCB1aW50OF90ICpwX3NhdCA9IHNhdC0+ZGF0YVswXTsKKyAgICBjb25zdCB1aW50OF90ICpwX2h1ZSA9IGh1ZS0+ZGF0YVswXTsKKyAgICBjb25zdCBpbnQgbHN6X3NhdCA9IHNhdC0+bGluZXNpemVbMF07CisgICAgY29uc3QgaW50IGxzel9odWUgPSBodWUtPmxpbmVzaXplWzBdOworICAgIFRocmVhZERhdGFIdWVTYXRNZXRyaWNzIHRkX2h1ZXNhdCA9IHsKKyAgICAgICAgLnNyYyAgICAgPSBpbiwKKyAgICAgICAgLmRzdF9zYXQgPSBzYXQsCisgICAgICAgIC5kc3RfaHVlID0gaHVlLAorICAgIH07CisKKyAgICBpZiAoIXMtPmZyYW1lX3ByZXYpCisgICAgICAgIHMtPmZyYW1lX3ByZXYgPSBhdl9mcmFtZV9jbG9uZShpbik7CisKKyAgICBwcmV2ID0gcy0+ZnJhbWVfcHJldjsKKworICAgIGlmIChzLT5vdXRmaWx0ZXIgIT0gRklMVEVSX05PTkUpIHsKKyAgICAgICAgb3V0ID0gYXZfZnJhbWVfY2xvbmUoaW4pOworICAgICAgICBhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKG91dCk7CisgICAgfQorCisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGNvbXB1dGVfc2F0X2h1ZV9tZXRyaWNzLCAmdGRfaHVlc2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgRkZNSU4ocy0+Y2hyb21haCwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworCisgICAgLy8gQ2FsY3VsYXRlIGx1bWEgaGlzdG9ncmFtIGFuZCBkaWZmZXJlbmNlIHdpdGggcHJldmlvdXMgZnJhbWUgb3IgZmllbGQuCisgICAgZm9yIChqID0gMDsgaiA8IGxpbmstPmg7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluay0+dzsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgeXV2ID0gaW4tPmRhdGFbMF1bdyArIGldOworICAgICAgICAgICAgaGlzdHlbeXV2XSsrOworICAgICAgICAgICAgZGlmeSArPSBhYnMoeXV2IC0gcHJldi0+ZGF0YVswXVtwdyArIGldKTsKKyAgICAgICAgfQorICAgICAgICB3ICArPSBpbi0+bGluZXNpemVbMF07CisgICAgICAgIHB3ICs9IHByZXYtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSBjaHJvbWEgaGlzdG9ncmFtIGFuZCBkaWZmZXJlbmNlIHdpdGggcHJldmlvdXMgZnJhbWUgb3IgZmllbGQuCisgICAgZm9yIChqID0gMDsgaiA8IHMtPmNocm9tYWg7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y2hyb21hdzsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgeXV2dSA9IGluLT5kYXRhWzFdW2N3K2ldOworICAgICAgICAgICAgY29uc3QgaW50IHl1dnYgPSBpbi0+ZGF0YVsyXVtjdytpXTsKKyAgICAgICAgICAgIGhpc3R1W3l1dnVdKys7CisgICAgICAgICAgICBkaWZ1ICs9IGFicyh5dXZ1IC0gcHJldi0+ZGF0YVsxXVtjcHcraV0pOworICAgICAgICAgICAgaGlzdHZbeXV2dl0rKzsKKyAgICAgICAgICAgIGRpZnYgKz0gYWJzKHl1dnYgLSBwcmV2LT5kYXRhWzJdW2NwdytpXSk7CisKKyAgICAgICAgICAgIGhpc3RzYXRbcF9zYXRbaV1dKys7CisgICAgICAgICAgICBoaXN0aHVlWygoaW50MTZfdCopcF9odWUpW2ldXSsrOworICAgICAgICB9CisgICAgICAgIGN3ICArPSBpbi0+bGluZXNpemVbMV07CisgICAgICAgIGNwdyArPSBwcmV2LT5saW5lc2l6ZVsxXTsKKyAgICAgICAgcF9zYXQgKz0gbHN6X3NhdDsKKyAgICAgICAgcF9odWUgKz0gbHN6X2h1ZTsKKyAgICB9CisKKyAgICBmb3IgKGZpbCA9IDA7IGZpbCA8IEZJTFRfTlVNQjsgZmlsICsrKSB7CisgICAgICAgIGlmIChzLT5maWx0ZXJzICYgMTw8ZmlsKSB7CisgICAgICAgICAgICBUaHJlYWREYXRhIHRkID0geworICAgICAgICAgICAgICAgIC5pbiA9IGluLAorICAgICAgICAgICAgICAgIC5vdXQgPSBvdXQgIT0gaW4gJiYgcy0+b3V0ZmlsdGVyID09IGZpbCA/IG91dCA6IE5VTEwsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgbWVtc2V0KHMtPmpvYnNfcmV0cywgMCwgcy0+bmJfam9icyAqIHNpemVvZigqcy0+am9ic19yZXRzKSk7CisgICAgICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyc19kZWZbZmlsXS5wcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGQsIHMtPmpvYnNfcmV0cywgcy0+bmJfam9icyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfam9iczsgaSsrKQorICAgICAgICAgICAgICAgIGZpbHRvdFtmaWxdICs9IHMtPmpvYnNfcmV0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGZpbmQgbG93IC8gaGlnaCBiYXNlZCBvbiBoaXN0b2dyYW0gcGVyY2VudGlsZQorICAgIC8vIHRoZXNlIG9ubHkgbmVlZCB0byBiZSBjYWxjdWxhdGVkIG9uY2UuCisKKyAgICBsb3dwICAgPSBscmludChzLT5mcyAgKiAxMCAvIDEwMC4pOworICAgIGhpZ2hwICA9IGxyaW50KHMtPmZzICAqIDkwIC8gMTAwLik7CisgICAgY2xvd3AgID0gbHJpbnQocy0+Y2ZzICogMTAgLyAxMDAuKTsKKyAgICBjaGlnaHAgPSBscmludChzLT5jZnMgKiA5MCAvIDEwMC4pOworCisgICAgYWNjeSA9IGFjY3UgPSBhY2N2ID0gYWNjc2F0ID0gMDsKKyAgICBmb3IgKGZpbCA9IDA7IGZpbCA8IERFUFRIOyBmaWwrKykgeworICAgICAgICBpZiAobWlueSAgIDwgMCAmJiBoaXN0eVtmaWxdKSAgIG1pbnkgPSBmaWw7CisgICAgICAgIGlmIChtaW51ICAgPCAwICYmIGhpc3R1W2ZpbF0pICAgbWludSA9IGZpbDsKKyAgICAgICAgaWYgKG1pbnYgICA8IDAgJiYgaGlzdHZbZmlsXSkgICBtaW52ID0gZmlsOworICAgICAgICBpZiAobWluc2F0IDwgMCAmJiBoaXN0c2F0W2ZpbF0pIG1pbnNhdCA9IGZpbDsKKworICAgICAgICBpZiAoaGlzdHlbZmlsXSkgICBtYXh5ICAgPSBmaWw7CisgICAgICAgIGlmIChoaXN0dVtmaWxdKSAgIG1heHUgICA9IGZpbDsKKyAgICAgICAgaWYgKGhpc3R2W2ZpbF0pICAgbWF4diAgID0gZmlsOworICAgICAgICBpZiAoaGlzdHNhdFtmaWxdKSBtYXhzYXQgPSBmaWw7CisKKyAgICAgICAgdG90eSAgICs9IGhpc3R5W2ZpbF0gICAqIGZpbDsKKyAgICAgICAgdG90dSAgICs9IGhpc3R1W2ZpbF0gICAqIGZpbDsKKyAgICAgICAgdG90diAgICs9IGhpc3R2W2ZpbF0gICAqIGZpbDsKKyAgICAgICAgdG90c2F0ICs9IGhpc3RzYXRbZmlsXSAqIGZpbDsKKworICAgICAgICBhY2N5ICAgKz0gaGlzdHlbZmlsXTsKKyAgICAgICAgYWNjdSAgICs9IGhpc3R1W2ZpbF07CisgICAgICAgIGFjY3YgICArPSBoaXN0dltmaWxdOworICAgICAgICBhY2NzYXQgKz0gaGlzdHNhdFtmaWxdOworCisgICAgICAgIGlmIChsb3d5ICAgPT0gLTEgJiYgYWNjeSAgID49ICBsb3dwKSBsb3d5ICAgPSBmaWw7CisgICAgICAgIGlmIChsb3d1ICAgPT0gLTEgJiYgYWNjdSAgID49IGNsb3dwKSBsb3d1ICAgPSBmaWw7CisgICAgICAgIGlmIChsb3d2ICAgPT0gLTEgJiYgYWNjdiAgID49IGNsb3dwKSBsb3d2ICAgPSBmaWw7CisgICAgICAgIGlmIChsb3dzYXQgPT0gLTEgJiYgYWNjc2F0ID49IGNsb3dwKSBsb3dzYXQgPSBmaWw7CisKKyAgICAgICAgaWYgKGhpZ2h5ICAgPT0gLTEgJiYgYWNjeSAgID49ICBoaWdocCkgaGlnaHkgICA9IGZpbDsKKyAgICAgICAgaWYgKGhpZ2h1ICAgPT0gLTEgJiYgYWNjdSAgID49IGNoaWdocCkgaGlnaHUgICA9IGZpbDsKKyAgICAgICAgaWYgKGhpZ2h2ICAgPT0gLTEgJiYgYWNjdiAgID49IGNoaWdocCkgaGlnaHYgICA9IGZpbDsKKyAgICAgICAgaWYgKGhpZ2hzYXQgPT0gLTEgJiYgYWNjc2F0ID49IGNoaWdocCkgaGlnaHNhdCA9IGZpbDsKKyAgICB9CisKKyAgICBtYXhodWUgPSBoaXN0aHVlWzBdOworICAgIG1lZGh1ZSA9IC0xOworICAgIGZvciAoZmlsID0gMDsgZmlsIDwgMzYwOyBmaWwrKykgeworICAgICAgICB0b3RodWUgKz0gaGlzdGh1ZVtmaWxdICogZmlsOworICAgICAgICBhY2NodWUgKz0gaGlzdGh1ZVtmaWxdOworCisgICAgICAgIGlmIChtZWRodWUgPT0gLTEgJiYgYWNjaHVlID4gcy0+Y2ZzIC8gMikKKyAgICAgICAgICAgIG1lZGh1ZSA9IGZpbDsKKyAgICAgICAgaWYgKGhpc3RodWVbZmlsXSA+IG1heGh1ZSkgeworICAgICAgICAgICAgbWF4aHVlID0gaGlzdGh1ZVtmaWxdOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWVfcHJldik7CisgICAgcy0+ZnJhbWVfcHJldiA9IGF2X2ZyYW1lX2Nsb25lKGluKTsKKworI2RlZmluZSBTRVRfTUVUQShrZXksIGZtdCwgdmFsKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc25wcmludGYobWV0YWJ1Ziwgc2l6ZW9mKG1ldGFidWYpLCBmbXQsIHZhbCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdl9kaWN0X3NldCgmb3V0LT5tZXRhZGF0YSwgImxhdmZpLnNpZ25hbHN0YXRzLiIga2V5LCBtZXRhYnVmLCAwKTsgICBcCit9IHdoaWxlICgwKQorCisgICAgU0VUX01FVEEoIllNSU4iLCAgICAiJWQiLCBtaW55KTsKKyAgICBTRVRfTUVUQSgiWUxPVyIsICAgICIlZCIsIGxvd3kpOworICAgIFNFVF9NRVRBKCJZQVZHIiwgICAgIiVnIiwgMS4wICogdG90eSAvIHMtPmZzKTsKKyAgICBTRVRfTUVUQSgiWUhJR0giLCAgICIlZCIsIGhpZ2h5KTsKKyAgICBTRVRfTUVUQSgiWU1BWCIsICAgICIlZCIsIG1heHkpOworCisgICAgU0VUX01FVEEoIlVNSU4iLCAgICAiJWQiLCBtaW51KTsKKyAgICBTRVRfTUVUQSgiVUxPVyIsICAgICIlZCIsIGxvd3UpOworICAgIFNFVF9NRVRBKCJVQVZHIiwgICAgIiVnIiwgMS4wICogdG90dSAvIHMtPmNmcyk7CisgICAgU0VUX01FVEEoIlVISUdIIiwgICAiJWQiLCBoaWdodSk7CisgICAgU0VUX01FVEEoIlVNQVgiLCAgICAiJWQiLCBtYXh1KTsKKworICAgIFNFVF9NRVRBKCJWTUlOIiwgICAgIiVkIiwgbWludik7CisgICAgU0VUX01FVEEoIlZMT1ciLCAgICAiJWQiLCBsb3d2KTsKKyAgICBTRVRfTUVUQSgiVkFWRyIsICAgICIlZyIsIDEuMCAqIHRvdHYgLyBzLT5jZnMpOworICAgIFNFVF9NRVRBKCJWSElHSCIsICAgIiVkIiwgaGlnaHYpOworICAgIFNFVF9NRVRBKCJWTUFYIiwgICAgIiVkIiwgbWF4dik7CisKKyAgICBTRVRfTUVUQSgiU0FUTUlOIiwgICIlZCIsIG1pbnNhdCk7CisgICAgU0VUX01FVEEoIlNBVExPVyIsICAiJWQiLCBsb3dzYXQpOworICAgIFNFVF9NRVRBKCJTQVRBVkciLCAgIiVnIiwgMS4wICogdG90c2F0IC8gcy0+Y2ZzKTsKKyAgICBTRVRfTUVUQSgiU0FUSElHSCIsICIlZCIsIGhpZ2hzYXQpOworICAgIFNFVF9NRVRBKCJTQVRNQVgiLCAgIiVkIiwgbWF4c2F0KTsKKworICAgIFNFVF9NRVRBKCJIVUVNRUQiLCAgIiVkIiwgbWVkaHVlKTsKKyAgICBTRVRfTUVUQSgiSFVFQVZHIiwgICIlZyIsIDEuMCAqIHRvdGh1ZSAvIHMtPmNmcyk7CisKKyAgICBTRVRfTUVUQSgiWURJRiIsICAgICIlZyIsIDEuMCAqIGRpZnkgLyBzLT5mcyk7CisgICAgU0VUX01FVEEoIlVESUYiLCAgICAiJWciLCAxLjAgKiBkaWZ1IC8gcy0+Y2ZzKTsKKyAgICBTRVRfTUVUQSgiVkRJRiIsICAgICIlZyIsIDEuMCAqIGRpZnYgLyBzLT5jZnMpOworCisgICAgZm9yIChmaWwgPSAwOyBmaWwgPCBGSUxUX05VTUI7IGZpbCArKykgeworICAgICAgICBpZiAocy0+ZmlsdGVycyAmIDE8PGZpbCkgeworICAgICAgICAgICAgY2hhciBtZXRhbmFtZVsxMjhdOworICAgICAgICAgICAgc25wcmludGYobWV0YWJ1ZiwgIHNpemVvZihtZXRhYnVmKSwgICIlZyIsIDEuMCAqIGZpbHRvdFtmaWxdIC8gcy0+ZnMpOworICAgICAgICAgICAgc25wcmludGYobWV0YW5hbWUsIHNpemVvZihtZXRhbmFtZSksICJsYXZmaS5zaWduYWxzdGF0cy4lcyIsIGZpbHRlcnNfZGVmW2ZpbF0ubmFtZSk7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3V0LT5tZXRhZGF0YSwgbWV0YW5hbWUsIG1ldGFidWYsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluICE9IG91dCkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNpZ25hbHN0YXRzX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc2lnbmFsc3RhdHNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAuY29uZmlnX3Byb3BzICAgPSBjb25maWdfcHJvcHMsCisgICAgICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9zaWduYWxzdGF0cyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJzaWduYWxzdGF0cyIsCisgICAgLmRlc2NyaXB0aW9uICAgPSAiR2VuZXJhdGUgc3RhdGlzdGljcyBmcm9tIHZpZGVvIGFuYWx5c2lzLiIsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihTaWduYWxzdGF0c0NvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICAgID0gc2lnbmFsc3RhdHNfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gc2lnbmFsc3RhdHNfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZzaWduYWxzdGF0c19jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc21hcnRibHVyLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc21hcnRibHVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5ZWM5MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zbWFydGJsdXIuYwpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDEyIEplcmVteSBUcmFuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQXBwbHkgYSBzbWFydGJsdXIgZmlsdGVyIHRvIHRoZSBpbnB1dCB2aWRlbworICogUG9ydGVkIGZyb20gTVBsYXllciBsaWJtcGNvZGVjcy92Zl9zbWFydGJsdXIuYyBieSBNaWNoYWVsIE5pZWRlcm1heWVyLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3N3c2NhbGUuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgUkFESVVTX01JTiAwLjEKKyNkZWZpbmUgUkFESVVTX01BWCA1LjAKKworI2RlZmluZSBTVFJFTkdUSF9NSU4gLTEuMAorI2RlZmluZSBTVFJFTkdUSF9NQVggMS4wCisKKyNkZWZpbmUgVEhSRVNIT0xEX01JTiAtMzAKKyNkZWZpbmUgVEhSRVNIT0xEX01BWCAzMAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgICAgICAgICAgICAgIHJhZGl1czsKKyAgICBmbG9hdCAgICAgICAgICAgICAgc3RyZW5ndGg7CisgICAgaW50ICAgICAgICAgICAgICAgIHRocmVzaG9sZDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgcXVhbGl0eTsKKyAgICBzdHJ1Y3QgU3dzQ29udGV4dCAqZmlsdGVyX2NvbnRleHQ7Cit9IEZpbHRlclBhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgRmlsdGVyUGFyYW0gIGx1bWE7CisgICAgRmlsdGVyUGFyYW0gIGNocm9tYTsKKyAgICBpbnQgICAgICAgICAgaHN1YjsKKyAgICBpbnQgICAgICAgICAgdnN1YjsKKyAgICB1bnNpZ25lZCBpbnQgc3dzX2ZsYWdzOworfSBTbWFydGJsdXJDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTbWFydGJsdXJDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHNtYXJ0Ymx1cl9vcHRpb25zW10gPSB7CisgICAgeyAibHVtYV9yYWRpdXMiLCAgICAic2V0IGx1bWEgcmFkaXVzIiwgICAgT0ZGU0VUKGx1bWEucmFkaXVzKSwgICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTEuMH0sIFJBRElVU19NSU4sIFJBRElVU19NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgImxyIiAgICAgICAgICwgICAgInNldCBsdW1hIHJhZGl1cyIsICAgIE9GRlNFVChsdW1hLnJhZGl1cyksICAgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xLjB9LCBSQURJVVNfTUlOLCBSQURJVVNfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7ICJsdW1hX3N0cmVuZ3RoIiwgICJzZXQgbHVtYSBzdHJlbmd0aCIsICBPRkZTRVQobHVtYS5zdHJlbmd0aCksICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MS4wfSwgU1RSRU5HVEhfTUlOLCBTVFJFTkdUSF9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgImxzIiwgICAgICAgICAgICAgInNldCBsdW1hIHN0cmVuZ3RoIiwgIE9GRlNFVChsdW1hLnN0cmVuZ3RoKSwgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xLjB9LCBTVFJFTkdUSF9NSU4sIFNUUkVOR1RIX01BWCwgLmZsYWdzPUZMQUdTIH0sCisgICAgeyAibHVtYV90aHJlc2hvbGQiLCAic2V0IGx1bWEgdGhyZXNob2xkIiwgT0ZGU0VUKGx1bWEudGhyZXNob2xkKSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0PTB9LCBUSFJFU0hPTERfTUlOLCBUSFJFU0hPTERfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7ICJsdCIsICAgICAgICAgICAgICJzZXQgbHVtYSB0aHJlc2hvbGQiLCBPRkZTRVQobHVtYS50aHJlc2hvbGQpLCBBVl9PUFRfVFlQRV9JTlQsICAgey5pNjQ9MH0sIFRIUkVTSE9MRF9NSU4sIFRIUkVTSE9MRF9NQVgsIC5mbGFncz1GTEFHUyB9LAorCisgICAgeyAiY2hyb21hX3JhZGl1cyIsICAgICJzZXQgY2hyb21hIHJhZGl1cyIsICAgIE9GRlNFVChjaHJvbWEucmFkaXVzKSwgICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPVJBRElVU19NSU4tMX0sICAgUkFESVVTX01JTi0xLCBSQURJVVNfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7ICJjciIsICAgICAgICAgICAgICAgInNldCBjaHJvbWEgcmFkaXVzIiwgICAgT0ZGU0VUKGNocm9tYS5yYWRpdXMpLCAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9UkFESVVTX01JTi0xfSwgICBSQURJVVNfTUlOLTEsIFJBRElVU19NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgImNocm9tYV9zdHJlbmd0aCIsICAic2V0IGNocm9tYSBzdHJlbmd0aCIsICBPRkZTRVQoY2hyb21hLnN0cmVuZ3RoKSwgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD1TVFJFTkdUSF9NSU4tMX0sIFNUUkVOR1RIX01JTi0xLCBTVFJFTkdUSF9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgImNzIiwgICAgICAgICAgICAgICAic2V0IGNocm9tYSBzdHJlbmd0aCIsICBPRkZTRVQoY2hyb21hLnN0cmVuZ3RoKSwgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD1TVFJFTkdUSF9NSU4tMX0sIFNUUkVOR1RIX01JTi0xLCBTVFJFTkdUSF9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgImNocm9tYV90aHJlc2hvbGQiLCAic2V0IGNocm9tYSB0aHJlc2hvbGQiLCBPRkZTRVQoY2hyb21hLnRocmVzaG9sZCksIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2ND1USFJFU0hPTERfTUlOLTF9LCBUSFJFU0hPTERfTUlOLTEsIFRIUkVTSE9MRF9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgImN0IiwgICAgICAgICAgICAgICAic2V0IGNocm9tYSB0aHJlc2hvbGQiLCBPRkZTRVQoY2hyb21hLnRocmVzaG9sZCksIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2ND1USFJFU0hPTERfTUlOLTF9LCBUSFJFU0hPTERfTUlOLTEsIFRIUkVTSE9MRF9NQVgsIC5mbGFncz1GTEFHUyB9LAorCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzbWFydGJsdXIpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTbWFydGJsdXJDb250ZXh0ICpzYmx1ciA9IGN0eC0+cHJpdjsKKworICAgIC8qIG1ha2UgY2hyb21hIGRlZmF1bHQgdG8gbHVtYSB2YWx1ZXMsIGlmIG5vdCBleHBsaWNpdGx5IHNldCAqLworICAgIGlmIChzYmx1ci0+Y2hyb21hLnJhZGl1cyA8IFJBRElVU19NSU4pCisgICAgICAgIHNibHVyLT5jaHJvbWEucmFkaXVzID0gc2JsdXItPmx1bWEucmFkaXVzOworICAgIGlmIChzYmx1ci0+Y2hyb21hLnN0cmVuZ3RoIDwgU1RSRU5HVEhfTUlOKQorICAgICAgICBzYmx1ci0+Y2hyb21hLnN0cmVuZ3RoICA9IHNibHVyLT5sdW1hLnN0cmVuZ3RoOworICAgIGlmIChzYmx1ci0+Y2hyb21hLnRocmVzaG9sZCA8IFRIUkVTSE9MRF9NSU4pCisgICAgICAgIHNibHVyLT5jaHJvbWEudGhyZXNob2xkID0gc2JsdXItPmx1bWEudGhyZXNob2xkOworCisgICAgc2JsdXItPmx1bWEucXVhbGl0eSA9IHNibHVyLT5jaHJvbWEucXVhbGl0eSA9IDMuMDsKKyAgICBzYmx1ci0+c3dzX2ZsYWdzID0gU1dTX0JJQ1VCSUM7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgImx1bWFfcmFkaXVzOiVmIGx1bWFfc3RyZW5ndGg6JWYgbHVtYV90aHJlc2hvbGQ6JWQgIgorICAgICAgICAgICAiY2hyb21hX3JhZGl1czolZiBjaHJvbWFfc3RyZW5ndGg6JWYgY2hyb21hX3RocmVzaG9sZDolZFxuIiwKKyAgICAgICAgICAgc2JsdXItPmx1bWEucmFkaXVzLCBzYmx1ci0+bHVtYS5zdHJlbmd0aCwgc2JsdXItPmx1bWEudGhyZXNob2xkLAorICAgICAgICAgICBzYmx1ci0+Y2hyb21hLnJhZGl1cywgc2JsdXItPmNocm9tYS5zdHJlbmd0aCwgc2JsdXItPmNocm9tYS50aHJlc2hvbGQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFNtYXJ0Ymx1ckNvbnRleHQgKnNibHVyID0gY3R4LT5wcml2OworCisgICAgc3dzX2ZyZWVDb250ZXh0KHNibHVyLT5sdW1hLmZpbHRlcl9jb250ZXh0KTsKKyAgICBzd3NfZnJlZUNvbnRleHQoc2JsdXItPmNocm9tYS5maWx0ZXJfY29udGV4dCk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGxvY19zd3NfY29udGV4dChGaWx0ZXJQYXJhbSAqZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgICAgU3dzVmVjdG9yICp2ZWM7CisgICAgU3dzRmlsdGVyIHN3c19maWx0ZXI7CisKKyAgICB2ZWMgPSBzd3NfZ2V0R2F1c3NpYW5WZWMoZi0+cmFkaXVzLCBmLT5xdWFsaXR5KTsKKworICAgIGlmICghdmVjKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgc3dzX3NjYWxlVmVjKHZlYywgZi0+c3RyZW5ndGgpOworICAgIHZlYy0+Y29lZmZbdmVjLT5sZW5ndGggLyAyXSArPSAxLjAgLSBmLT5zdHJlbmd0aDsKKyAgICBzd3NfZmlsdGVyLmx1bUggPSBzd3NfZmlsdGVyLmx1bVYgPSB2ZWM7CisgICAgc3dzX2ZpbHRlci5jaHJIID0gc3dzX2ZpbHRlci5jaHJWID0gTlVMTDsKKyAgICBmLT5maWx0ZXJfY29udGV4dCA9IHN3c19nZXRDYWNoZWRDb250ZXh0KE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc3dzX2ZpbHRlciwgTlVMTCwgTlVMTCk7CisKKyAgICBzd3NfZnJlZVZlYyh2ZWMpOworCisgICAgaWYgKCFmLT5maWx0ZXJfY29udGV4dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBTbWFydGJsdXJDb250ZXh0ICpzYmx1ciA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworCisgICAgc2JsdXItPmhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHNibHVyLT52c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIGFsbG9jX3N3c19jb250ZXh0KCZzYmx1ci0+bHVtYSwgaW5saW5rLT53LCBpbmxpbmstPmgsIHNibHVyLT5zd3NfZmxhZ3MpOworICAgIGFsbG9jX3N3c19jb250ZXh0KCZzYmx1ci0+Y2hyb21hLAorICAgICAgICAgICAgICAgICAgICAgIEZGX0NFSUxfUlNISUZUKGlubGluay0+dywgc2JsdXItPmhzdWIpLAorICAgICAgICAgICAgICAgICAgICAgIEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwgc2JsdXItPnZzdWIpLAorICAgICAgICAgICAgICAgICAgICAgIHNibHVyLT5zd3NfZmxhZ3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJsdXIodWludDhfdCAgICAgICAqZHN0LCBjb25zdCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29uc3QgaW50IHRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgc3RydWN0IFN3c0NvbnRleHQgKmZpbHRlcl9jb250ZXh0KQoreworICAgIGludCB4LCB5OworICAgIGludCBvcmlnLCBmaWx0ZXJlZDsKKyAgICBpbnQgZGlmZjsKKyAgICAvKiBEZWNsYXJlIGFycmF5cyBvZiA0IHRvIGdldCBhbGlnbmVkIGRhdGEgKi8KKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmNfYXJyYXlbNF0gPSB7c3JjfTsKKyAgICB1aW50OF90ICpkc3RfYXJyYXlbNF0gICAgICAgICAgICAgPSB7ZHN0fTsKKyAgICBpbnQgc3JjX2xpbmVzaXplX2FycmF5WzRdID0ge3NyY19saW5lc2l6ZX07CisgICAgaW50IGRzdF9saW5lc2l6ZV9hcnJheVs0XSA9IHtkc3RfbGluZXNpemV9OworCisgICAgc3dzX3NjYWxlKGZpbHRlcl9jb250ZXh0LCBzcmNfYXJyYXksIHNyY19saW5lc2l6ZV9hcnJheSwKKyAgICAgICAgICAgICAgMCwgaCwgZHN0X2FycmF5LCBkc3RfbGluZXNpemVfYXJyYXkpOworCisgICAgaWYgKHRocmVzaG9sZCA+IDApIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgICAgICAgICAgIG9yaWcgICAgID0gc3JjW3ggKyB5ICogc3JjX2xpbmVzaXplXTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZCA9IGRzdFt4ICsgeSAqIGRzdF9saW5lc2l6ZV07CisgICAgICAgICAgICAgICAgZGlmZiAgICAgPSBvcmlnIC0gZmlsdGVyZWQ7CisKKyAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAyICogdGhyZXNob2xkKQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyB5ICogZHN0X2xpbmVzaXplXSA9IG9yaWc7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpZmYgPiB0aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgJ2RpZmYnIGFuZCBzdWJ0cmFjdCAndGhyZXNob2xkJyBmcm9tICdmaWx0ZXJlZCcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSAqIGRzdF9saW5lc2l6ZV0gPSBvcmlnIC0gdGhyZXNob2xkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgtZGlmZiA+IDIgKiB0aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeCArIHkgKiBkc3RfbGluZXNpemVdID0gb3JpZzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoLWRpZmYgPiB0aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgJ2RpZmYnIGFuZCAndGhyZXNob2xkJyB0byAnZmlsdGVyZWQnICovCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeCArIHkgKiBkc3RfbGluZXNpemVdID0gb3JpZyArIHRocmVzaG9sZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRocmVzaG9sZCA8IDApIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgICAgICAgICAgIG9yaWcgICAgID0gc3JjW3ggKyB5ICogc3JjX2xpbmVzaXplXTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZCA9IGRzdFt4ICsgeSAqIGRzdF9saW5lc2l6ZV07CisgICAgICAgICAgICAgICAgZGlmZiAgICAgPSBvcmlnIC0gZmlsdGVyZWQ7CisKKyAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPD0gLXRocmVzaG9sZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSAqIGRzdF9saW5lc2l6ZV0gPSBvcmlnOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkaWZmIDw9IC0yICogdGhyZXNob2xkKQorICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VidHJhY3QgJ2RpZmYnIGFuZCAndGhyZXNob2xkJyBmcm9tICdvcmlnJyAqLworICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyB5ICogZHN0X2xpbmVzaXplXSA9IGZpbHRlcmVkIC0gdGhyZXNob2xkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID49IHRocmVzaG9sZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSAqIGRzdF9saW5lc2l6ZV0gPSBvcmlnOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkaWZmID49IDIgKiB0aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgJ3RocmVzaG9sZCcgYW5kIHN1YnRyYWN0ICdkaWZmJyBmcm9tICdvcmlnJyAqLworICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyB5ICogZHN0X2xpbmVzaXplXSA9IGZpbHRlcmVkICsgdGhyZXNob2xkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucGljKQoreworICAgIFNtYXJ0Ymx1ckNvbnRleHQgICpzYmx1ciAgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgICAgID0gaW5saW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0cGljOworICAgIGludCBjdyA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+dywgc2JsdXItPmhzdWIpOworICAgIGludCBjaCA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwgc2JsdXItPnZzdWIpOworCisgICAgb3V0cGljID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dHBpYykgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnBpYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0cGljLCBpbnBpYyk7CisKKyAgICBibHVyKG91dHBpYy0+ZGF0YVswXSwgb3V0cGljLT5saW5lc2l6ZVswXSwKKyAgICAgICAgIGlucGljLT5kYXRhWzBdLCAgaW5waWMtPmxpbmVzaXplWzBdLAorICAgICAgICAgaW5saW5rLT53LCBpbmxpbmstPmgsIHNibHVyLT5sdW1hLnRocmVzaG9sZCwKKyAgICAgICAgIHNibHVyLT5sdW1hLmZpbHRlcl9jb250ZXh0KTsKKworICAgIGlmIChpbnBpYy0+ZGF0YVsyXSkgeworICAgICAgICBibHVyKG91dHBpYy0+ZGF0YVsxXSwgb3V0cGljLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICBpbnBpYy0+ZGF0YVsxXSwgIGlucGljLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICBjdywgY2gsIHNibHVyLT5jaHJvbWEudGhyZXNob2xkLAorICAgICAgICAgICAgIHNibHVyLT5jaHJvbWEuZmlsdGVyX2NvbnRleHQpOworICAgICAgICBibHVyKG91dHBpYy0+ZGF0YVsyXSwgb3V0cGljLT5saW5lc2l6ZVsyXSwKKyAgICAgICAgICAgICBpbnBpYy0+ZGF0YVsyXSwgIGlucGljLT5saW5lc2l6ZVsyXSwKKyAgICAgICAgICAgICBjdywgY2gsIHNibHVyLT5jaHJvbWEudGhyZXNob2xkLAorICAgICAgICAgICAgIHNibHVyLT5jaHJvbWEuZmlsdGVyX2NvbnRleHQpOworICAgIH0KKworICAgIGF2X2ZyYW1lX2ZyZWUoJmlucGljKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dHBpYyk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzbWFydGJsdXJfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzbWFydGJsdXJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3NtYXJ0Ymx1ciA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJzbWFydGJsdXIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJsdXIgdGhlIGlucHV0IHZpZGVvIHdpdGhvdXQgaW1wYWN0aW5nIHRoZSBvdXRsaW5lcy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihTbWFydGJsdXJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gc21hcnRibHVyX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHNtYXJ0Ymx1cl9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnNtYXJ0Ymx1cl9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zcHAuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODllMjgzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3NwcC5jCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2zDqW1lbnQgQsWTc2NoIDx1IHBraCBtZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTaW1wbGUgcG9zdCBwcm9jZXNzaW5nIGZpbHRlcgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gYW4gYWxnb3JpdGhtIGRlc2NyaWJlZCBpbgorICogIkFyaWEgTm9zcmF0aW5pYSBFbWJlZGRlZCBQb3N0LVByb2Nlc3NpbmcgZm9yCisgKiBFbmhhbmNlbWVudCBvZiBDb21wcmVzc2VkIEltYWdlcyAoMTk5OSkiCisgKgorICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IE1pY2hhZWwgTmllZGVybWF5ZXIgZm9yIHRoZSBNUGxheWVyIHByb2plY3QsIGFuZAorICogcG9ydGVkIGJ5IENsw6ltZW50IELFk3NjaCBmb3IgRkZtcGVnLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZmX3NwcC5oIgorCitlbnVtIG1vZGUgeworICAgIE1PREVfSEFSRCwKKyAgICBNT0RFX1NPRlQsCisgICAgTkJfTU9ERVMKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzICpjaGlsZF9jbGFzc19uZXh0KGNvbnN0IEFWQ2xhc3MgKnByZXYpCit7CisgICAgcmV0dXJuIHByZXYgPyBOVUxMIDogYXZjb2RlY19kY3RfZ2V0X2NsYXNzKCk7Cit9CisKK3N0YXRpYyB2b2lkICpjaGlsZF9uZXh0KHZvaWQgKm9iaiwgdm9pZCAqcHJldikKK3sKKyAgICBTUFBDb250ZXh0ICpzID0gb2JqOworICAgIHJldHVybiBwcmV2ID8gTlVMTCA6IHMtPmRjdDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU1BQQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gc3BwX29wdGlvbnNbXSA9IHsKKyAgICB7ICJxdWFsaXR5IiwgInNldCBxdWFsaXR5IiwgT0ZGU0VUKGxvZzJfY291bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gM30sIDAsIE1BWF9MRVZFTCwgRkxBR1MgfSwKKyAgICB7ICJxcCIsICJmb3JjZSBhIGNvbnN0YW50IHF1YW50aXplciBwYXJhbWV0ZXIiLCBPRkZTRVQocXApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDYzLCBGTEFHUyB9LAorICAgIHsgIm1vZGUiLCAic2V0IHRocmVzaG9sZGluZyBtb2RlIiwgT0ZGU0VUKG1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gTU9ERV9IQVJEfSwgMCwgTkJfTU9ERVMgLSAxLCBGTEFHUywgIm1vZGUiIH0sCisgICAgICAgIHsgImhhcmQiLCAiaGFyZCB0aHJlc2hvbGRpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNT0RFX0hBUkR9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUiIH0sCisgICAgICAgIHsgInNvZnQiLCAic29mdCB0aHJlc2hvbGRpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNT0RFX1NPRlR9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAidXNlX2JmcmFtZV9xcCIsICJ1c2UgQi1mcmFtZXMnIFFQIiwgT0ZGU0VUKHVzZV9iZnJhbWVfcXApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHNwcF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgICA9ICJzcHAiLAorICAgIC5pdGVtX25hbWUgICAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgICAgPSBzcHBfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICAgICAgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0ZJTFRFUiwKKyAgICAuY2hpbGRfY2xhc3NfbmV4dCA9IGNoaWxkX2NsYXNzX25leHQsCisgICAgLmNoaWxkX25leHQgICAgICAgPSBjaGlsZF9uZXh0LAorfTsKKworLy8gWFhYOiBzaGFyZSBiZXR3ZWVuIGZpbHRlcnM/CitERUNMQVJFX0FMSUdORUQoOCwgc3RhdGljIGNvbnN0IHVpbnQ4X3QsIGxkaXRoZXIpWzhdWzhdID0geworICAgIHsgIDAsICA0OCwgIDEyLCAgNjAsICAgMywgIDUxLCAgMTUsICA2MyB9LAorICAgIHsgMzIsICAxNiwgIDQ0LCAgMjgsICAzNSwgIDE5LCAgNDcsICAzMSB9LAorICAgIHsgIDgsICA1NiwgICA0LCAgNTIsICAxMSwgIDU5LCAgIDcsICA1NSB9LAorICAgIHsgNDAsICAyNCwgIDM2LCAgMjAsICA0MywgIDI3LCAgMzksICAyMyB9LAorICAgIHsgIDIsICA1MCwgIDE0LCAgNjIsICAgMSwgIDQ5LCAgMTMsICA2MSB9LAorICAgIHsgMzQsICAxOCwgIDQ2LCAgMzAsICAzMywgIDE3LCAgNDUsICAyOSB9LAorICAgIHsgMTAsICA1OCwgICA2LCAgNTQsICAgOSwgIDU3LCAgIDUsICA1MyB9LAorICAgIHsgNDIsICAyNiwgIDM4LCAgMjIsICA0MSwgIDI1LCAgMzcsICAyMSB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb2Zmc2V0WzEyN11bMl0gPSB7CisgICAgezAsMH0sCisgICAgezAsMH0sIHs0LDR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWFsaXR5ID0gMQorICAgIHswLDB9LCB7MiwyfSwgezYsNH0sIHs0LDZ9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVhbGl0eSA9IDIKKyAgICB7MCwwfSwgezUsMX0sIHsyLDJ9LCB7NywzfSwgezQsNH0sIHsxLDV9LCB7Niw2fSwgezMsN30sIC8vIHF1YWxpdHkgPSAzCisKKyAgICB7MCwwfSwgezQsMH0sIHsxLDF9LCB7NSwxfSwgezMsMn0sIHs3LDJ9LCB7MiwzfSwgezYsM30sIC8vIHF1YWxpdHkgPSA0CisgICAgezAsNH0sIHs0LDR9LCB7MSw1fSwgezUsNX0sIHszLDZ9LCB7Nyw2fSwgezIsN30sIHs2LDd9LAorCisgICAgezAsMH0sIHswLDJ9LCB7MCw0fSwgezAsNn0sIHsxLDF9LCB7MSwzfSwgezEsNX0sIHsxLDd9LCAvLyBxdWFsaXR5ID0gNQorICAgIHsyLDB9LCB7MiwyfSwgezIsNH0sIHsyLDZ9LCB7MywxfSwgezMsM30sIHszLDV9LCB7Myw3fSwKKyAgICB7NCwwfSwgezQsMn0sIHs0LDR9LCB7NCw2fSwgezUsMX0sIHs1LDN9LCB7NSw1fSwgezUsN30sCisgICAgezYsMH0sIHs2LDJ9LCB7Niw0fSwgezYsNn0sIHs3LDF9LCB7NywzfSwgezcsNX0sIHs3LDd9LAorCisgICAgezAsMH0sIHs0LDR9LCB7MCw0fSwgezQsMH0sIHsyLDJ9LCB7Niw2fSwgezIsNn0sIHs2LDJ9LCAvLyBxdWFsaXR5ID0gNgorICAgIHswLDJ9LCB7NCw2fSwgezAsNn0sIHs0LDJ9LCB7MiwwfSwgezYsNH0sIHsyLDR9LCB7NiwwfSwKKyAgICB7MSwxfSwgezUsNX0sIHsxLDV9LCB7NSwxfSwgezMsM30sIHs3LDd9LCB7Myw3fSwgezcsM30sCisgICAgezEsM30sIHs1LDd9LCB7MSw3fSwgezUsM30sIHszLDF9LCB7Nyw1fSwgezMsNX0sIHs3LDF9LAorICAgIHswLDF9LCB7NCw1fSwgezAsNX0sIHs0LDF9LCB7MiwzfSwgezYsN30sIHsyLDd9LCB7NiwzfSwKKyAgICB7MCwzfSwgezQsN30sIHswLDd9LCB7NCwzfSwgezIsMX0sIHs2LDV9LCB7Miw1fSwgezYsMX0sCisgICAgezEsMH0sIHs1LDR9LCB7MSw0fSwgezUsMH0sIHszLDJ9LCB7Nyw2fSwgezMsNn0sIHs3LDJ9LAorICAgIHsxLDJ9LCB7NSw2fSwgezEsNn0sIHs1LDJ9LCB7MywwfSwgezcsNH0sIHszLDR9LCB7NywwfSwKK307CisKK3N0YXRpYyB2b2lkIGhhcmR0aHJlc2hfYyhpbnQxNl90IGRzdFs2NF0sIGNvbnN0IGludDE2X3Qgc3JjWzY0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXAsIGNvbnN0IHVpbnQ4X3QgKnBlcm11dGF0aW9uKQoreworICAgIGludCBpOworICAgIGludCBiaWFzID0gMDsgLy8gRklYTUUKKworICAgIHVuc2lnbmVkIHRocmVzaG9sZDEgPSBxcCAqICgoMTw8NCkgLSBiaWFzKSAtIDE7CisgICAgdW5zaWduZWQgdGhyZXNob2xkMiA9IHRocmVzaG9sZDEgPDwgMTsKKworICAgIG1lbXNldChkc3QsIDAsIDY0ICogc2l6ZW9mKGRzdFswXSkpOworICAgIGRzdFswXSA9IChzcmNbMF0gKyA0KSA+PiAzOworCisgICAgZm9yIChpID0gMTsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgaW50IGxldmVsID0gc3JjW2ldOworICAgICAgICBpZiAoKCh1bnNpZ25lZCkobGV2ZWwgKyB0aHJlc2hvbGQxKSkgPiB0aHJlc2hvbGQyKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgaiA9IHBlcm11dGF0aW9uW2ldOworICAgICAgICAgICAgZHN0W2pdID0gKGxldmVsICsgNCkgPj4gMzsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc29mdHRocmVzaF9jKGludDE2X3QgZHN0WzY0XSwgY29uc3QgaW50MTZfdCBzcmNbNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxcCwgY29uc3QgdWludDhfdCAqcGVybXV0YXRpb24pCit7CisgICAgaW50IGk7CisgICAgaW50IGJpYXMgPSAwOyAvL0ZJWE1FCisKKyAgICB1bnNpZ25lZCB0aHJlc2hvbGQxID0gcXAgKiAoKDE8PDQpIC0gYmlhcykgLSAxOworICAgIHVuc2lnbmVkIHRocmVzaG9sZDIgPSB0aHJlc2hvbGQxIDw8IDE7CisKKyAgICBtZW1zZXQoZHN0LCAwLCA2NCAqIHNpemVvZihkc3RbMF0pKTsKKyAgICBkc3RbMF0gPSAoc3JjWzBdICsgNCkgPj4gMzsKKworICAgIGZvciAoaSA9IDE7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIGludCBsZXZlbCA9IHNyY1tpXTsKKyAgICAgICAgaWYgKCgodW5zaWduZWQpKGxldmVsICsgdGhyZXNob2xkMSkpID4gdGhyZXNob2xkMikgeworICAgICAgICAgICAgY29uc3QgaW50IGogPSBwZXJtdXRhdGlvbltpXTsKKyAgICAgICAgICAgIGlmIChsZXZlbCA+IDApIGRzdFtqXSA9IChsZXZlbCAtIHRocmVzaG9sZDEgKyA0KSA+PiAzOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgZHN0W2pdID0gKGxldmVsICsgdGhyZXNob2xkMSArIDQpID4+IDM7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlX3NsaWNlX2ModWludDhfdCAqZHN0LCBjb25zdCBpbnQxNl90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfbGluZXNpemUsIGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxvZzJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgZGl0aGVyWzhdWzhdKQoreworICAgIGludCB5LCB4OworCisjZGVmaW5lIFNUT1JFKHBvcykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAgPSAoKHNyY1t4ICsgeSpzcmNfbGluZXNpemUgKyBwb3NdIDw8IGxvZzJfc2NhbGUpICsgZFtwb3NdKSA+PiA2OyAgIFwKKyAgICBpZiAodGVtcCAmIDB4MTAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXAgPSB+KHRlbXAgPj4gMzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFt4ICsgeSpkc3RfbGluZXNpemUgKyBwb3NdID0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZCA9IGRpdGhlclt5XTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDgpIHsKKyAgICAgICAgICAgIGludCB0ZW1wOworICAgICAgICAgICAgU1RPUkUoMCk7CisgICAgICAgICAgICBTVE9SRSgxKTsKKyAgICAgICAgICAgIFNUT1JFKDIpOworICAgICAgICAgICAgU1RPUkUoMyk7CisgICAgICAgICAgICBTVE9SRSg0KTsKKyAgICAgICAgICAgIFNUT1JFKDUpOworICAgICAgICAgICAgU1RPUkUoNik7CisgICAgICAgICAgICBTVE9SRSg3KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkZF9ibG9jayhpbnQxNl90ICpkc3QsIGludCBsaW5lc2l6ZSwgY29uc3QgaW50MTZfdCBibG9ja1s2NF0pCit7CisgICAgaW50IHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgICoodWludDMyX3QgKikmZHN0WzAgKyB5KmxpbmVzaXplXSArPSAqKHVpbnQzMl90ICopJmJsb2NrWzAgKyB5KjhdOworICAgICAgICAqKHVpbnQzMl90ICopJmRzdFsyICsgeSpsaW5lc2l6ZV0gKz0gKih1aW50MzJfdCAqKSZibG9ja1syICsgeSo4XTsKKyAgICAgICAgKih1aW50MzJfdCAqKSZkc3RbNCArIHkqbGluZXNpemVdICs9ICoodWludDMyX3QgKikmYmxvY2tbNCArIHkqOF07CisgICAgICAgICoodWludDMyX3QgKikmZHN0WzYgKyB5KmxpbmVzaXplXSArPSAqKHVpbnQzMl90ICopJmJsb2NrWzYgKyB5KjhdOworICAgIH0KK30KKworLy8gWFhYOiBleHBvcnQgdGhlIGZ1bmN0aW9uPworc3RhdGljIGlubGluZSBpbnQgbm9ybV9xc2NhbGUoaW50IHFzY2FsZSwgaW50IHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBGRl9RU0NBTEVfVFlQRV9NUEVHMTogcmV0dXJuIHFzY2FsZTsKKyAgICBjYXNlIEZGX1FTQ0FMRV9UWVBFX01QRUcyOiByZXR1cm4gcXNjYWxlID4+IDE7CisgICAgY2FzZSBGRl9RU0NBTEVfVFlQRV9IMjY0OiAgcmV0dXJuIHFzY2FsZSA+PiAyOworICAgIGNhc2UgRkZfUVNDQUxFX1RZUEVfVlA1NjogIHJldHVybiAoNjMgLSBxc2NhbGUgKyAyKSA+PiAyOworICAgIH0KKyAgICByZXR1cm4gcXNjYWxlOworfQorCitzdGF0aWMgdm9pZCBmaWx0ZXIoU1BQQ29udGV4dCAqcCwgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgaW50IGRzdF9saW5lc2l6ZSwgaW50IHNyY19saW5lc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnFwX3RhYmxlLCBpbnQgcXBfc3RyaWRlLCBpbnQgaXNfbHVtYSkKK3sKKyAgICBpbnQgeCwgeSwgaTsKKyAgICBjb25zdCBpbnQgY291bnQgPSAxIDw8IHAtPmxvZzJfY291bnQ7CisgICAgY29uc3QgaW50IGxpbmVzaXplID0gaXNfbHVtYSA/IHAtPnRlbXBfbGluZXNpemUgOiBGRkFMSUdOKHdpZHRoKzE2LCAxNik7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50NjRfdCwgYmxvY2tfYWxpZ24pWzMyXTsKKyAgICBpbnQxNl90ICpibG9jayAgPSAoaW50MTZfdCAqKWJsb2NrX2FsaWduOworICAgIGludDE2X3QgKmJsb2NrMiA9IChpbnQxNl90ICopKGJsb2NrX2FsaWduICsgMTYpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGludCBpbmRleCA9IDggKyA4KmxpbmVzaXplICsgeSpsaW5lc2l6ZTsKKyAgICAgICAgbWVtY3B5KHAtPnNyYyArIGluZGV4LCBzcmMgKyB5KnNyY19saW5lc2l6ZSwgd2lkdGgpOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7CisgICAgICAgICAgICBwLT5zcmNbaW5kZXggICAgICAgICAtIHggLSAxXSA9IHAtPnNyY1tpbmRleCArICAgICAgICAgeCAgICBdOworICAgICAgICAgICAgcC0+c3JjW2luZGV4ICsgd2lkdGggKyB4ICAgIF0gPSBwLT5zcmNbaW5kZXggKyB3aWR0aCAtIHggLSAxXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgIG1lbWNweShwLT5zcmMgKyAoICAgICAgIDcteSkqbGluZXNpemUsIHAtPnNyYyArICggICAgICAgeSs4KSpsaW5lc2l6ZSwgbGluZXNpemUpOworICAgICAgICBtZW1jcHkocC0+c3JjICsgKGhlaWdodCs4K3kpKmxpbmVzaXplLCBwLT5zcmMgKyAoaGVpZ2h0LXkrNykqbGluZXNpemUsIGxpbmVzaXplKTsKKyAgICB9CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0ICsgODsgeSArPSA4KSB7CisgICAgICAgIG1lbXNldChwLT50ZW1wICsgKDggKyB5KSAqIGxpbmVzaXplLCAwLCA4ICogbGluZXNpemUgKiBzaXplb2YoKnAtPnRlbXApKTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoICsgODsgeCArPSA4KSB7CisgICAgICAgICAgICBpbnQgcXA7CisKKyAgICAgICAgICAgIGlmIChwLT5xcCkgeworICAgICAgICAgICAgICAgIHFwID0gcC0+cXA7CisgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHFwcyA9IDMgKyBpc19sdW1hOworICAgICAgICAgICAgICAgIHFwID0gcXBfdGFibGVbKEZGTUlOKHgsIHdpZHRoIC0gMSkgPj4gcXBzKSArIChGRk1JTih5LCBoZWlnaHQgLSAxKSA+PiBxcHMpICogcXBfc3RyaWRlXTsKKyAgICAgICAgICAgICAgICBxcCA9IEZGTUFYKDEsIG5vcm1fcXNjYWxlKHFwLCBwLT5xc2NhbGVfdHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgeDEgPSB4ICsgb2Zmc2V0W2kgKyBjb3VudCAtIDFdWzBdOworICAgICAgICAgICAgICAgIGNvbnN0IGludCB5MSA9IHkgKyBvZmZzZXRbaSArIGNvdW50IC0gMV1bMV07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGluZGV4ID0geDEgKyB5MSpsaW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBwLT5kY3QtPmdldF9waXhlbHMoYmxvY2ssIHAtPnNyYyArIGluZGV4LCBsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgcC0+ZGN0LT5mZGN0KGJsb2NrKTsKKyAgICAgICAgICAgICAgICBwLT5yZXF1YW50aXplKGJsb2NrMiwgYmxvY2ssIHFwLCBwLT5kY3QtPmlkY3RfcGVybXV0YXRpb24pOworICAgICAgICAgICAgICAgIHAtPmRjdC0+aWRjdChibG9jazIpOworICAgICAgICAgICAgICAgIGFkZF9ibG9jayhwLT50ZW1wICsgaW5kZXgsIGxpbmVzaXplLCBibG9jazIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh5KQorICAgICAgICAgICAgcC0+c3RvcmVfc2xpY2UoZHN0ICsgKHkgLSA4KSAqIGRzdF9saW5lc2l6ZSwgcC0+dGVtcCArIDggKyB5KmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2xpbmVzaXplLCBsaW5lc2l6ZSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTig4LCBoZWlnaHQgKyA4IC0geSksIE1BWF9MRVZFTCAtIHAtPmxvZzJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGl0aGVyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgIEFWX1BJWF9GTVRfWVVWNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTBQLCAgQVZfUElYX0ZNVF9ZVVY0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjBQLCBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgU1BQQ29udGV4dCAqc3BwID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgY29uc3QgaW50IGggPSBGRkFMSUdOKGlubGluay0+aCArIDE2LCAxNik7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisKKyAgICBzcHAtPmhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHNwcC0+dnN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgc3BwLT50ZW1wX2xpbmVzaXplID0gRkZBTElHTihpbmxpbmstPncgKyAxNiwgMTYpOworICAgIHNwcC0+dGVtcCA9IGF2X21hbGxvY19hcnJheShzcHAtPnRlbXBfbGluZXNpemUsIGggKiBzaXplb2YoKnNwcC0+dGVtcCkpOworICAgIHNwcC0+c3JjICA9IGF2X21hbGxvY19hcnJheShzcHAtPnRlbXBfbGluZXNpemUsIGggKiBzaXplb2YoKnNwcC0+c3JjKSk7CisgICAgaWYgKCFzcHAtPnVzZV9iZnJhbWVfcXApIHsKKyAgICAgICAgLyogd2UgYXJlIGFzc3VtaW5nIGhlcmUgdGhlIHFwIGJsb2NrcyB3aWxsIG5vdCBiZSBzbWFsbGVyIHRoYXQgMTZ4MTYgKi8KKyAgICAgICAgc3BwLT5ub25fYl9xcF9hbGxvY19zaXplID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT53LCA0KSAqIEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwgNCk7CisgICAgICAgIHNwcC0+bm9uX2JfcXBfdGFibGUgPSBhdl9jYWxsb2Moc3BwLT5ub25fYl9xcF9hbGxvY19zaXplLCBzaXplb2YoKnNwcC0+bm9uX2JfcXBfdGFibGUpKTsKKyAgICAgICAgaWYgKCFzcHAtPm5vbl9iX3FwX3RhYmxlKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgaWYgKCFzcHAtPnRlbXAgfHwgIXNwcC0+c3JjKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBTUFBDb250ZXh0ICpzcHAgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dCA9IGluOworICAgIGludCBxcF9zdHJpZGUgPSAwOworICAgIGNvbnN0IGludDhfdCAqcXBfdGFibGUgPSBOVUxMOworCisgICAgLyogaWYgd2UgYXJlIG5vdCBpbiBhIGNvbnN0YW50IHVzZXIgcXVhbnRpemVyIG1vZGUgYW5kIHdlIGRvbid0IHdhbnQgdG8gdXNlCisgICAgICogdGhlIHF1YW50aXplcnMgZnJvbSB0aGUgQi1mcmFtZXMgKEItZnJhbWVzIG9mdGVuIGhhdmUgYSBoaWdoZXIgUVApLCB3ZQorICAgICAqIG5lZWQgdG8gc2F2ZSB0aGUgcXAgdGFibGUgZnJvbSB0aGUgbGFzdCBub24gQi1mcmFtZTsgdGhpcyBpcyB3aGF0IHRoZQorICAgICAqIGZvbGxvd2luZyBjb2RlIGJsb2NrIGRvZXMgKi8KKyAgICBpZiAoIXNwcC0+cXApIHsKKyAgICAgICAgcXBfdGFibGUgPSBhdl9mcmFtZV9nZXRfcXBfdGFibGUoaW4sICZxcF9zdHJpZGUsICZzcHAtPnFzY2FsZV90eXBlKTsKKworICAgICAgICBpZiAocXBfdGFibGUgJiYgIXNwcC0+dXNlX2JmcmFtZV9xcCAmJiBpbi0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgICAgICBpbnQgdywgaDsKKworICAgICAgICAgICAgLyogaWYgdGhlIHFwIHN0cmlkZSBpcyBub3Qgc2V0LCBpdCBtZWFucyB0aGUgUVAgYXJlIG9ubHkgZGVmaW5lZCBvbgorICAgICAgICAgICAgICogYSBsaW5lIGJhc2lzICovCisgICAgICAgICAgICBpZiAoIXFwX3N0cmlkZSkgeworICAgICAgICAgICAgICAgIHcgPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPncsIDQpOworICAgICAgICAgICAgICAgIGggPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3ID0gRkZfQ0VJTF9SU0hJRlQocXBfc3RyaWRlLCA0KTsKKyAgICAgICAgICAgICAgICBoID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2Fzc2VydDAodyAqIGggPD0gc3BwLT5ub25fYl9xcF9hbGxvY19zaXplKTsKKyAgICAgICAgICAgIG1lbWNweShzcHAtPm5vbl9iX3FwX3RhYmxlLCBxcF90YWJsZSwgdyAqIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNwcC0+bG9nMl9jb3VudCAmJiAhY3R4LT5pc19kaXNhYmxlZCkgeworICAgICAgICBpZiAoIXNwcC0+dXNlX2JmcmFtZV9xcCAmJiBzcHAtPm5vbl9iX3FwX3RhYmxlKQorICAgICAgICAgICAgcXBfdGFibGUgPSBzcHAtPm5vbl9iX3FwX3RhYmxlOworCisgICAgICAgIGlmIChxcF90YWJsZSB8fCBzcHAtPnFwKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgY3cgPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPncsIHNwcC0+aHN1Yik7CisgICAgICAgICAgICBjb25zdCBpbnQgY2ggPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHNwcC0+dnN1Yik7CisKKyAgICAgICAgICAgIC8qIGdldCBhIG5ldyBmcmFtZSBpZiBpbi1wbGFjZSBpcyBub3QgcG9zc2libGUgb3IgaWYgdGhlIGRpbWVuc2lvbnMKKyAgICAgICAgICAgICAqIGFyZSBub3QgbXVsdGlwbGUgb2YgOCAqLworICAgICAgICAgICAgaWYgKCFhdl9mcmFtZV9pc193cml0YWJsZShpbikgfHwgKGlubGluay0+dyAmIDcpIHx8IChpbmxpbmstPmggJiA3KSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBhbGlnbmVkX3cgPSBGRkFMSUdOKGlubGluay0+dywgOCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGFsaWduZWRfaCA9IEZGQUxJR04oaW5saW5rLT5oLCA4KTsKKworICAgICAgICAgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgYWxpZ25lZF93LCBhbGlnbmVkX2gpOworICAgICAgICAgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICAgICAgICAgICAgICBvdXQtPndpZHRoICA9IGluLT53aWR0aDsKKyAgICAgICAgICAgICAgICBvdXQtPmhlaWdodCA9IGluLT5oZWlnaHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbHRlcihzcHAsIG91dC0+ZGF0YVswXSwgaW4tPmRhdGFbMF0sIG91dC0+bGluZXNpemVbMF0sIGluLT5saW5lc2l6ZVswXSwgaW5saW5rLT53LCBpbmxpbmstPmgsIHFwX3RhYmxlLCBxcF9zdHJpZGUsIDEpOworICAgICAgICAgICAgZmlsdGVyKHNwcCwgb3V0LT5kYXRhWzFdLCBpbi0+ZGF0YVsxXSwgb3V0LT5saW5lc2l6ZVsxXSwgaW4tPmxpbmVzaXplWzFdLCBjdywgICAgICAgIGNoLCAgICAgICAgcXBfdGFibGUsIHFwX3N0cmlkZSwgMCk7CisgICAgICAgICAgICBmaWx0ZXIoc3BwLCBvdXQtPmRhdGFbMl0sIGluLT5kYXRhWzJdLCBvdXQtPmxpbmVzaXplWzJdLCBpbi0+bGluZXNpemVbMl0sIGN3LCAgICAgICAgY2gsICAgICAgICBxcF90YWJsZSwgcXBfc3RyaWRlLCAwKTsKKyAgICAgICAgICAgIGVtbXNfYygpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluICE9IG91dCkgeworICAgICAgICBpZiAoaW4tPmRhdGFbM10pCisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKG91dC0+ZGF0YVszXSwgb3V0LT5saW5lc2l6ZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gLT5kYXRhWzNdLCBpbiAtPmxpbmVzaXplWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICB9CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfY29tbWFuZChBVkZpbHRlckNvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqY21kLCBjb25zdCBjaGFyICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcmVzLCBpbnQgcmVzX2xlbiwgaW50IGZsYWdzKQoreworICAgIFNQUENvbnRleHQgKnNwcCA9IGN0eC0+cHJpdjsKKworICAgIGlmICghc3RyY21wKGNtZCwgImxldmVsIikpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJncywgIm1heCIpKQorICAgICAgICAgICAgc3BwLT5sb2cyX2NvdW50ID0gTUFYX0xFVkVMOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcHAtPmxvZzJfY291bnQgPSBhdl9jbGlwKHN0cnRvbChhcmdzLCBOVUxMLCAxMCksIDAsIE1BWF9MRVZFTCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdF9kaWN0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkRpY3Rpb25hcnkgKipvcHRzKQoreworICAgIFNQUENvbnRleHQgKnNwcCA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgc3BwLT5hdmN0eCA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoTlVMTCk7CisgICAgc3BwLT5kY3QgPSBhdmNvZGVjX2RjdF9hbGxvYygpOworICAgIGlmICghc3BwLT5hdmN0eCB8fCAhc3BwLT5kY3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAob3B0cykgeworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IE5VTEw7CisKKyAgICAgICAgd2hpbGUgKChlID0gYXZfZGljdF9nZXQoKm9wdHMsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0KHNwcC0+ZGN0LCBlLT5rZXksIGUtPnZhbHVlLCAwKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYXZfZGljdF9mcmVlKG9wdHMpOworICAgIH0KKworICAgIGF2Y29kZWNfZGN0X2luaXQoc3BwLT5kY3QpOworICAgIHNwcC0+c3RvcmVfc2xpY2UgPSBzdG9yZV9zbGljZV9jOworICAgIHN3aXRjaCAoc3BwLT5tb2RlKSB7CisgICAgY2FzZSBNT0RFX0hBUkQ6IHNwcC0+cmVxdWFudGl6ZSA9IGhhcmR0aHJlc2hfYzsgYnJlYWs7CisgICAgY2FzZSBNT0RFX1NPRlQ6IHNwcC0+cmVxdWFudGl6ZSA9IHNvZnR0aHJlc2hfYzsgYnJlYWs7CisgICAgfQorICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfc3BwX2luaXRfeDg2KHNwcCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFNQUENvbnRleHQgKnNwcCA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyZWVwKCZzcHAtPnRlbXApOworICAgIGF2X2ZyZWVwKCZzcHAtPnNyYyk7CisgICAgaWYgKHNwcC0+YXZjdHgpIHsKKyAgICAgICAgYXZjb2RlY19jbG9zZShzcHAtPmF2Y3R4KTsKKyAgICAgICAgYXZfZnJlZXAoJnNwcC0+YXZjdHgpOworICAgIH0KKyAgICBhdl9mcmVlcCgmc3BwLT5kY3QpOworICAgIGF2X2ZyZWVwKCZzcHAtPm5vbl9iX3FwX3RhYmxlKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNwcF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNwcF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfc3BwID0geworICAgIC5uYW1lICAgICAgICAgICAgPSAic3BwIiwKKyAgICAuZGVzY3JpcHRpb24gICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IGEgc2ltcGxlIHBvc3QgcHJvY2Vzc2luZyBmaWx0ZXIuIiksCisgICAgLnByaXZfc2l6ZSAgICAgICA9IHNpemVvZihTUFBDb250ZXh0KSwKKyAgICAuaW5pdF9kaWN0ICAgICAgID0gaW5pdF9kaWN0LAorICAgIC51bmluaXQgICAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgICA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgICA9IHNwcF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgICA9IHNwcF9vdXRwdXRzLAorICAgIC5wcm9jZXNzX2NvbW1hbmQgPSBwcm9jZXNzX2NvbW1hbmQsCisgICAgLnByaXZfY2xhc3MgICAgICA9ICZzcHBfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9JTlRFUk5BTCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc3BwLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc3BwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3ZTIyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zcHAuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2zDqW1lbnQgQsWTc2NoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9TUFBfSAorI2RlZmluZSBBVkZJTFRFUl9TUFBfSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmRjdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisKKyNkZWZpbmUgTUFYX0xFVkVMIDYgLyogcXVhbGl0eSBsZXZlbHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmF2X2NsYXNzOworCisgICAgaW50IGxvZzJfY291bnQ7CisgICAgaW50IHFwOworICAgIGludCBtb2RlOworICAgIGludCBxc2NhbGVfdHlwZTsKKyAgICBpbnQgdGVtcF9saW5lc2l6ZTsKKyAgICB1aW50OF90ICpzcmM7CisgICAgaW50MTZfdCAqdGVtcDsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZEQ1QgKmRjdDsKKyAgICBpbnQ4X3QgKm5vbl9iX3FwX3RhYmxlOworICAgIGludCBub25fYl9xcF9hbGxvY19zaXplOworICAgIGludCB1c2VfYmZyYW1lX3FwOworICAgIGludCBoc3ViLCB2c3ViOworCisgICAgdm9pZCAoKnN0b3JlX3NsaWNlKSh1aW50OF90ICpkc3QsIGNvbnN0IGludDE2X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxvZzJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGRpdGhlcls4XVs4XSk7CisKKyAgICB2b2lkICgqcmVxdWFudGl6ZSkoaW50MTZfdCBkc3RbNjRdLCBjb25zdCBpbnQxNl90IHNyY1s2NF0sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBxcCwgY29uc3QgdWludDhfdCAqcGVybXV0YXRpb24pOworfSBTUFBDb250ZXh0OworCit2b2lkIGZmX3NwcF9pbml0X3g4NihTUFBDb250ZXh0ICpzKTsKKworI2VuZGlmIC8qIEFWRklMVEVSX1NQUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc3RlcmVvM2QuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zdGVyZW8zZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDAxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc3RlcmVvM2QuYwpAQCAtMCwwICsxLDY2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBHb3Jkb24gU2NobWlkdCA8Z29yZG9uLnNjaG1pZHQgPGF0PiBzMjAwMC50dS1jaGVtbml0ei5kZT4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworZW51bSBTdGVyZW9Db2RlIHsKKyAgICBBTkFHTFlQSF9SQ19HUkFZLCAgIC8vIGFuYWdseXBoIHJlZC9jeWFuIGdyYXkKKyAgICBBTkFHTFlQSF9SQ19IQUxGLCAgIC8vIGFuYWdseXBoIHJlZC9jeWFuIGhhbGYgY29sb3JlZAorICAgIEFOQUdMWVBIX1JDX0NPTE9SLCAgLy8gYW5hZ2x5cGggcmVkL2N5YW4gY29sb3JlZAorICAgIEFOQUdMWVBIX1JDX0RVQk9JUywgLy8gYW5hZ2x5cGggcmVkL2N5YW4gZHVib2lzCisgICAgQU5BR0xZUEhfR01fR1JBWSwgICAvLyBhbmFnbHlwaCBncmVlbi9tYWdlbnRhIGdyYXkKKyAgICBBTkFHTFlQSF9HTV9IQUxGLCAgIC8vIGFuYWdseXBoIGdyZWVuL21hZ2VudGEgaGFsZiBjb2xvcmVkCisgICAgQU5BR0xZUEhfR01fQ09MT1IsICAvLyBhbmFnbHlwaCBncmVlbi9tYWdlbnRhIGNvbG9yZWQKKyAgICBBTkFHTFlQSF9HTV9EVUJPSVMsIC8vIGFuYWdseXBoIGdyZWVuL21hZ2VudGEgZHVib2lzCisgICAgQU5BR0xZUEhfWUJfR1JBWSwgICAvLyBhbmFnbHlwaCB5ZWxsb3cvYmx1ZSBncmF5CisgICAgQU5BR0xZUEhfWUJfSEFMRiwgICAvLyBhbmFnbHlwaCB5ZWxsb3cvYmx1ZSBoYWxmIGNvbG9yZWQKKyAgICBBTkFHTFlQSF9ZQl9DT0xPUiwgIC8vIGFuYWdseXBoIHllbGxvdy9ibHVlIGNvbG9yZWQKKyAgICBBTkFHTFlQSF9ZQl9EVUJPSVMsIC8vIGFuYWdseXBoIHllbGxvdy9ibHVlIGR1Ym9pcworICAgIEFOQUdMWVBIX1JCX0dSQVksICAgLy8gYW5hZ2x5cGggcmVkL2JsdWUgZ3JheQorICAgIEFOQUdMWVBIX1JHX0dSQVksICAgLy8gYW5hZ2x5cGggcmVkL2dyZWVuIGdyYXkKKyAgICBNT05PX0wsICAgICAgICAgICAgIC8vIG1vbm8gb3V0cHV0IGZvciBkZWJ1Z2dpbmcgKGxlZnQgZXllIG9ubHkpCisgICAgTU9OT19SLCAgICAgICAgICAgICAvLyBtb25vIG91dHB1dCBmb3IgZGVidWdnaW5nIChyaWdodCBleWUgb25seSkKKyAgICBJTlRFUkxFQVZFX1JPV1NfTFIsIC8vIHJvdy1pbnRlcmxlYXZlIChsZWZ0IGV5ZSBoYXMgdG9wIHJvdykKKyAgICBJTlRFUkxFQVZFX1JPV1NfUkwsIC8vIHJvdy1pbnRlcmxlYXZlIChyaWdodCBleWUgaGFzIHRvcCByb3cpCisgICAgU0lERV9CWV9TSURFX0xSLCAgICAvLyBzaWRlIGJ5IHNpZGUgcGFyYWxsZWwgKGxlZnQgZXllIGxlZnQsIHJpZ2h0IGV5ZSByaWdodCkKKyAgICBTSURFX0JZX1NJREVfUkwsICAgIC8vIHNpZGUgYnkgc2lkZSBjcm9zc2V5ZSAocmlnaHQgZXllIGxlZnQsIGxlZnQgZXllIHJpZ2h0KQorICAgIFNJREVfQllfU0lERV8yX0xSLCAgLy8gc2lkZSBieSBzaWRlIHBhcmFsbGVsIHdpdGggaGFsZiB3aWR0aCByZXNvbHV0aW9uCisgICAgU0lERV9CWV9TSURFXzJfUkwsICAvLyBzaWRlIGJ5IHNpZGUgY3Jvc3NleWUgd2l0aCBoYWxmIHdpZHRoIHJlc29sdXRpb24KKyAgICBBQk9WRV9CRUxPV19MUiwgICAgIC8vIGFib3ZlLWJlbG93IChsZWZ0IGV5ZSBhYm92ZSwgcmlnaHQgZXllIGJlbG93KQorICAgIEFCT1ZFX0JFTE9XX1JMLCAgICAgLy8gYWJvdmUtYmVsb3cgKHJpZ2h0IGV5ZSBhYm92ZSwgbGVmdCBleWUgYmVsb3cpCisgICAgQUJPVkVfQkVMT1dfMl9MUiwgICAvLyBhYm92ZS1iZWxvdyB3aXRoIGhhbGYgaGVpZ2h0IHJlc29sdXRpb24KKyAgICBBQk9WRV9CRUxPV18yX1JMLCAgIC8vIGFib3ZlLWJlbG93IHdpdGggaGFsZiBoZWlnaHQgcmVzb2x1dGlvbgorICAgIEFMVEVSTkFUSU5HX0xSLCAgICAgLy8gYWx0ZXJuYXRpbmcgZnJhbWVzIChsZWZ0IGV5ZSBmaXJzdCwgcmlnaHQgZXllIHNlY29uZCkKKyAgICBBTFRFUk5BVElOR19STCwgICAgIC8vIGFsdGVybmF0aW5nIGZyYW1lcyAocmlnaHQgZXllIGZpcnN0LCBsZWZ0IGV5ZSBzZWNvbmQpCisgICAgU1RFUkVPX0NPREVfQ09VTlQgICAvLyBUT0RPOiBuZWVkcyBhdXRvZGV0ZWN0aW9uCit9OworCit0eXBlZGVmIHN0cnVjdCBTdGVyZW9Db21wb25lbnQgeworICAgIGVudW0gU3RlcmVvQ29kZSBmb3JtYXQ7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IG9mZl9sZWZ0LCBvZmZfcmlnaHQ7CisgICAgaW50IG9mZl9sc3RlcCwgb2ZmX3JzdGVwOworICAgIGludCByb3dfbGVmdCwgcm93X3JpZ2h0OworfSBTdGVyZW9Db21wb25lbnQ7CisKK3N0YXRpYyBjb25zdCBpbnQgYW5hX2NvZWZmW11bM11bNl0gPSB7CisgIFtBTkFHTFlQSF9SQl9HUkFZXSAgID0KKyAgICB7ezE5NTk1LCAzODQ3MCwgIDc0NzEsICAgICAwLCAgICAgMCwgICAgIDB9LAorICAgICB7ICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMH0sCisgICAgIHsgICAgMCwgICAgIDAsICAgICAwLCAxOTU5NSwgMzg0NzAsICA3NDcxfX0sCisgIFtBTkFHTFlQSF9SR19HUkFZXSAgID0KKyAgICB7ezE5NTk1LCAzODQ3MCwgIDc0NzEsICAgICAwLCAgICAgMCwgICAgIDB9LAorICAgICB7ICAgIDAsICAgICAwLCAgICAgMCwgMTk1OTUsIDM4NDcwLCAgNzQ3MX0sCisgICAgIHsgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwfX0sCisgIFtBTkFHTFlQSF9SQ19HUkFZXSAgID0KKyAgICB7ezE5NTk1LCAzODQ3MCwgIDc0NzEsICAgICAwLCAgICAgMCwgICAgIDB9LAorICAgICB7ICAgIDAsICAgICAwLCAgICAgMCwgMTk1OTUsIDM4NDcwLCAgNzQ3MX0sCisgICAgIHsgICAgMCwgICAgIDAsICAgICAwLCAxOTU5NSwgMzg0NzAsICA3NDcxfX0sCisgIFtBTkFHTFlQSF9SQ19IQUxGXSAgID0KKyAgICB7ezE5NTk1LCAzODQ3MCwgIDc0NzEsICAgICAwLCAgICAgMCwgICAgIDB9LAorICAgICB7ICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIDY1NTM2LCAgICAgMH0sCisgICAgIHsgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIDY1NTM2fX0sCisgIFtBTkFHTFlQSF9SQ19DT0xPUl0gID0KKyAgICB7ezY1NTM2LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDB9LAorICAgICB7ICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIDY1NTM2LCAgICAgMH0sCisgICAgIHsgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIDY1NTM2fX0sCisgIFtBTkFHTFlQSF9SQ19EVUJPSVNdID0KKyAgICB7ezI5ODkxLCAzMjgwMCwgMTE1NTksIC0yODQ5LCAtNTc2MywgIC0xMDJ9LAorICAgICB7LTI2MjcsIC0yNDc5LCAtMTAzMywgMjQ4MDQsIDQ4MDgwLCAtMTIwOX0sCisgICAgIHsgLTk5NywgLTEzNTAsICAtMzU4LCAtNDcyOSwgLTc0MDMsIDgwMzczfX0sCisgIFtBTkFHTFlQSF9HTV9HUkFZXSAgID0KKyAgICB7eyAgICAwLCAgICAgMCwgICAgIDAsIDE5NTk1LCAzODQ3MCwgIDc0NzF9LAorICAgICB7MTk1OTUsIDM4NDcwLCAgNzQ3MSwgICAgIDAsICAgICAwLCAgICAgMH0sCisgICAgIHsgICAgMCwgICAgIDAsICAgICAwLCAxOTU5NSwgMzg0NzAsICA3NDcxfX0sCisgIFtBTkFHTFlQSF9HTV9IQUxGXSAgID0KKyAgICB7eyAgICAwLCAgICAgMCwgICAgIDAsIDY1NTM2LCAgICAgMCwgICAgIDB9LAorICAgICB7MTk1OTUsIDM4NDcwLCAgNzQ3MSwgICAgIDAsICAgICAwLCAgICAgMH0sCisgICAgIHsgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIDY1NTM2fX0sCisgIFtBTkFHTFlQSF9HTV9DT0xPUl0gID0KKyAgICB7eyAgICAwLCAgICAgMCwgICAgIDAsIDY1NTM2LCAgICAgMCwgICAgIDB9LAorICAgICB7ICAgIDAsIDY1NTM2LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMH0sCisgICAgIHsgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIDY1NTM2fX0sCisgIFtBTkFHTFlQSF9HTV9EVUJPSVNdICA9CisgICAge3stNDA2MywtMTAzNTQsIC0yNTU2LCAzNDY2OSwgNDYyMDMsICAxNTczfSwKKyAgICAgezE4NjEyLCA0Mzc3OCwgIDkzNzIsIC0xMDQ5LCAgLTk4MywgLTQyNjB9LAorICAgICB7IC05ODMsIC0xNzY5LCAgMTM3NiwgICA1OTAsICA0OTE1LCA2MTQwN319LAorICBbQU5BR0xZUEhfWUJfR1JBWV0gICA9CisgICAge3sgICAgMCwgICAgIDAsICAgICAwLCAxOTU5NSwgMzg0NzAsICA3NDcxfSwKKyAgICAgeyAgICAwLCAgICAgMCwgICAgIDAsIDE5NTk1LCAzODQ3MCwgIDc0NzF9LAorICAgICB7MTk1OTUsIDM4NDcwLCAgNzQ3MSwgICAgIDAsICAgICAwLCAgICAgMH19LAorICBbQU5BR0xZUEhfWUJfSEFMRl0gICA9CisgICAge3sgICAgMCwgICAgIDAsICAgICAwLCA2NTUzNiwgICAgIDAsICAgICAwfSwKKyAgICAgeyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCA2NTUzNiwgICAgIDB9LAorICAgICB7MTk1OTUsIDM4NDcwLCAgNzQ3MSwgICAgIDAsICAgICAwLCAgICAgMH19LAorICBbQU5BR0xZUEhfWUJfQ09MT1JdICA9CisgICAge3sgICAgMCwgICAgIDAsICAgICAwLCA2NTUzNiwgICAgIDAsICAgICAwfSwKKyAgICAgeyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCA2NTUzNiwgICAgIDB9LAorICAgICB7ICAgIDAsICAgICAwLCA2NTUzNiwgICAgIDAsICAgICAwLCAgICAgMH19LAorICBbQU5BR0xZUEhfWUJfRFVCT0lTXSA9CisgICAge3s2NTUzNSwtMTI2NTAsMTg0NTEsICAgLTk4NywgLTc1OTAsIC0xMDQ5fSwKKyAgICAgey0xNjA0LCA1NjAzMiwgNDE5NiwgICAgMzcwLCAgMzgyNiwgLTEwNDl9LAorICAgICB7LTIzNDUsLTEwNjc2LCAxMzU4LCAgIDU4MDEsIDExNDE2LCA1NjIxN319LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgU3RlcmVvM0RDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBTdGVyZW9Db21wb25lbnQgaW4sIG91dDsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgcm93X3N0ZXA7CisgICAgY29uc3QgaW50ICphbmFfbWF0cml4WzNdOworICAgIGludCBuYl9wbGFuZXM7CisgICAgaW50IGxpbmVzaXplWzRdOworICAgIGludCBwaGVpZ2h0WzRdOworICAgIGludCBoc3ViLCB2c3ViOworICAgIGludCBwaXhzdGVwWzRdOworICAgIEFWRnJhbWUgKnByZXY7CisgICAgZG91YmxlIHRzX3VuaXQ7Cit9IFN0ZXJlbzNEQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU3RlcmVvM0RDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHN0ZXJlbzNkX29wdGlvbnNbXSA9IHsKKyAgICB7ICJpbiIsICAgICJzZXQgaW5wdXQgZm9ybWF0IiwgIE9GRlNFVChpbi5mb3JtYXQpLCAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1TSURFX0JZX1NJREVfTFJ9LCBTSURFX0JZX1NJREVfTFIsIFNURVJFT19DT0RFX0NPVU5ULTEsIEZMQUdTLCAiaW4ifSwKKyAgICB7ICJhYjJsIiwgICJhYm92ZSBiZWxvdyBoYWxmIGhlaWdodCBsZWZ0IGZpcnN0IiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BQk9WRV9CRUxPV18yX0xSfSwgIDAsIDAsIEZMQUdTLCAiaW4iIH0sCisgICAgeyAiYWIyciIsICAiYWJvdmUgYmVsb3cgaGFsZiBoZWlnaHQgcmlnaHQgZmlyc3QiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QUJPVkVfQkVMT1dfMl9STH0sICAwLCAwLCBGTEFHUywgImluIiB9LAorICAgIHsgImFibCIsICAgImFib3ZlIGJlbG93IGxlZnQgZmlyc3QiLCAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUFCT1ZFX0JFTE9XX0xSfSwgICAgMCwgMCwgRkxBR1MsICJpbiIgfSwKKyAgICB7ICJhYnIiLCAgICJhYm92ZSBiZWxvdyByaWdodCBmaXJzdCIsICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BQk9WRV9CRUxPV19STH0sICAgIDAsIDAsIEZMQUdTLCAiaW4iIH0sCisgICAgeyAiYWwiLCAgICAiYWx0ZXJuYXRpbmcgZnJhbWVzIGxlZnQgZmlyc3QiLCAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QUxURVJOQVRJTkdfTFJ9LCAgICAwLCAwLCBGTEFHUywgImluIiB9LAorICAgIHsgImFyIiwgICAgImFsdGVybmF0aW5nIGZyYW1lcyByaWdodCBmaXJzdCIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUFMVEVSTkFUSU5HX1JMfSwgICAgMCwgMCwgRkxBR1MsICJpbiIgfSwKKyAgICB7ICJzYnMybCIsICJzaWRlIGJ5IHNpZGUgaGFsZiB3aWR0aCBsZWZ0IGZpcnN0IiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TSURFX0JZX1NJREVfMl9MUn0sIDAsIDAsIEZMQUdTLCAiaW4iIH0sCisgICAgeyAic2JzMnIiLCAic2lkZSBieSBzaWRlIGhhbGYgd2lkdGggcmlnaHQgZmlyc3QiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U0lERV9CWV9TSURFXzJfUkx9LCAwLCAwLCBGTEFHUywgImluIiB9LAorICAgIHsgInNic2wiLCAgInNpZGUgYnkgc2lkZSBsZWZ0IGZpcnN0IiwgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNJREVfQllfU0lERV9MUn0sICAgMCwgMCwgRkxBR1MsICJpbiIgfSwKKyAgICB7ICJzYnNyIiwgICJzaWRlIGJ5IHNpZGUgcmlnaHQgZmlyc3QiLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TSURFX0JZX1NJREVfUkx9LCAgIDAsIDAsIEZMQUdTLCAiaW4iIH0sCisgICAgeyAib3V0IiwgICAic2V0IG91dHB1dCBmb3JtYXQiLCBPRkZTRVQob3V0LmZvcm1hdCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9QU5BR0xZUEhfUkNfRFVCT0lTfSwgMCwgU1RFUkVPX0NPREVfQ09VTlQtMSwgRkxBR1MsICJvdXQifSwKKyAgICB7ICJhYjJsIiwgICJhYm92ZSBiZWxvdyBoYWxmIGhlaWdodCBsZWZ0IGZpcnN0IiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BQk9WRV9CRUxPV18yX0xSfSwgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhYjJyIiwgICJhYm92ZSBiZWxvdyBoYWxmIGhlaWdodCByaWdodCBmaXJzdCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BQk9WRV9CRUxPV18yX1JMfSwgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhYmwiLCAgICJhYm92ZSBiZWxvdyBsZWZ0IGZpcnN0IiwgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BQk9WRV9CRUxPV19MUn0sICAgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhYnIiLCAgICJhYm92ZSBiZWxvdyByaWdodCBmaXJzdCIsICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BQk9WRV9CRUxPV19STH0sICAgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhZ21jIiwgICJhbmFnbHlwaCBncmVlbiBtYWdlbnRhIGNvbG9yIiwgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9HTV9DT0xPUn0sICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhZ21kIiwgICJhbmFnbHlwaCBncmVlbiBtYWdlbnRhIGR1Ym9pcyIsICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9HTV9EVUJPSVN9LCAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhZ21nIiwgICJhbmFnbHlwaCBncmVlbiBtYWdlbnRhIGdyYXkiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9HTV9HUkFZfSwgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhZ21oIiwgICJhbmFnbHlwaCBncmVlbiBtYWdlbnRhIGhhbGYgY29sb3IiLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9HTV9IQUxGfSwgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhbCIsICAgICJhbHRlcm5hdGluZyBmcmFtZXMgbGVmdCBmaXJzdCIsICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTFRFUk5BVElOR19MUn0sICAgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhciIsICAgICJhbHRlcm5hdGluZyBmcmFtZXMgcmlnaHQgZmlyc3QiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTFRFUk5BVElOR19STH0sICAgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhcmJnIiwgICJhbmFnbHlwaCByZWQgYmx1ZSBncmF5IiwgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9SQl9HUkFZfSwgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhcmNjIiwgICJhbmFnbHlwaCByZWQgY3lhbiBjb2xvciIsICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9SQ19DT0xPUn0sICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhcmNkIiwgICJhbmFnbHlwaCByZWQgY3lhbiBkdWJvaXMiLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9SQ19EVUJPSVN9LCAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhcmNnIiwgICJhbmFnbHlwaCByZWQgY3lhbiBncmF5IiwgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9SQ19HUkFZfSwgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhcmNoIiwgICJhbmFnbHlwaCByZWQgY3lhbiBoYWxmIGNvbG9yIiwgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9SQ19IQUxGfSwgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJhcmdnIiwgICJhbmFnbHlwaCByZWQgZ3JlZW4gZ3JheSIsICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9SR19HUkFZfSwgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJheWJjIiwgICJhbmFnbHlwaCB5ZWxsb3cgYmx1ZSBjb2xvciIsICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9ZQl9DT0xPUn0sICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJheWJkIiwgICJhbmFnbHlwaCB5ZWxsb3cgYmx1ZSBkdWJvaXMiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9ZQl9EVUJPSVN9LCAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJheWJnIiwgICJhbmFnbHlwaCB5ZWxsb3cgYmx1ZSBncmF5IiwgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9ZQl9HUkFZfSwgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJheWJoIiwgICJhbmFnbHlwaCB5ZWxsb3cgYmx1ZSBoYWxmIGNvbG9yIiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BTkFHTFlQSF9ZQl9IQUxGfSwgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJpcmwiLCAgICJpbnRlcmxlYXZlIHJvd3MgbGVmdCBmaXJzdCIsICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1JTlRFUkxFQVZFX1JPV1NfTFJ9LCAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJpcnIiLCAgICJpbnRlcmxlYXZlIHJvd3MgcmlnaHQgZmlyc3QiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1JTlRFUkxFQVZFX1JPV1NfUkx9LCAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJtbCIsICAgICJtb25vIGxlZnQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT05PX0x9LCAgICAgICAgICAgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJtciIsICAgICJtb25vIHJpZ2h0IiwgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT05PX1J9LCAgICAgICAgICAgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJzYnMybCIsICJzaWRlIGJ5IHNpZGUgaGFsZiB3aWR0aCBsZWZ0IGZpcnN0IiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TSURFX0JZX1NJREVfMl9MUn0sICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJzYnMyciIsICJzaWRlIGJ5IHNpZGUgaGFsZiB3aWR0aCByaWdodCBmaXJzdCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TSURFX0JZX1NJREVfMl9STH0sICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJzYnNsIiwgICJzaWRlIGJ5IHNpZGUgbGVmdCBmaXJzdCIsICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TSURFX0JZX1NJREVfTFJ9LCAgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7ICJzYnNyIiwgICJzaWRlIGJ5IHNpZGUgcmlnaHQgZmlyc3QiLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TSURFX0JZX1NJREVfUkx9LCAgICAwLCAwLCBGTEFHUywgIm91dCIgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHN0ZXJlbzNkKTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBhbmFnbHlwaF9waXhfZm10c1tdID0geworICAgIEFWX1BJWF9GTVRfUkdCMjQsIEFWX1BJWF9GTVRfQkdSMjQsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG90aGVyX3BpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9CR1IyNCwKKyAgICBBVl9QSVhfRk1UX1JHQjQ4QkUsIEFWX1BJWF9GTVRfQkdSNDhCRSwKKyAgICBBVl9QSVhfRk1UX1JHQjQ4TEUsIEFWX1BJWF9GTVRfQkdSNDhMRSwKKyAgICBBVl9QSVhfRk1UX1JHQkE2NEJFLCBBVl9QSVhfRk1UX0JHUkE2NEJFLAorICAgIEFWX1BJWF9GTVRfUkdCQTY0TEUsIEFWX1BJWF9GTVRfQkdSQTY0TEUsCisgICAgQVZfUElYX0ZNVF9SR0JBLCAgQVZfUElYX0ZNVF9CR1JBLAorICAgIEFWX1BJWF9GTVRfQVJHQiwgIEFWX1BJWF9GTVRfQUJHUiwKKyAgICBBVl9QSVhfRk1UX1JHQjAsICBBVl9QSVhfRk1UX0JHUjAsCisgICAgQVZfUElYX0ZNVF8wUkdCLCAgQVZfUElYX0ZNVF8wQkdSLAorICAgIEFWX1BJWF9GTVRfR0JSUCwKKyAgICBBVl9QSVhfRk1UX0dCUlA5QkUsICBBVl9QSVhfRk1UX0dCUlA5TEUsCisgICAgQVZfUElYX0ZNVF9HQlJQMTBCRSwgQVZfUElYX0ZNVF9HQlJQMTBMRSwKKyAgICBBVl9QSVhfRk1UX0dCUlAxMkJFLCBBVl9QSVhfRk1UX0dCUlAxMkxFLAorICAgIEFWX1BJWF9GTVRfR0JSUDE0QkUsIEFWX1BJWF9GTVRfR0JSUDE0TEUsCisgICAgQVZfUElYX0ZNVF9HQlJQMTZCRSwgQVZfUElYX0ZNVF9HQlJQMTZMRSwKKyAgICBBVl9QSVhfRk1UX1lVVjQxMFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwKKyAgICBBVl9QSVhfRk1UX1lVVko0MTFQLAorICAgIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgQVZfUElYX0ZNVF9ZVVZKNDIyUCwKKyAgICBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOUxFLCAgQVZfUElYX0ZNVF9ZVVZBNDIwUDlMRSwKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFA5QkUsICBBVl9QSVhfRk1UX1lVVkE0MjBQOUJFLAorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDlMRSwgIEFWX1BJWF9GTVRfWVVWQTQyMlA5TEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQOUJFLCAgQVZfUElYX0ZNVF9ZVVZBNDIyUDlCRSwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5TEUsICBBVl9QSVhfRk1UX1lVVkE0NDRQOUxFLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDlCRSwgIEFWX1BJWF9GTVRfWVVWQTQ0NFA5QkUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRSwgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwTEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTBCRSwgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwQkUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTBMRSwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwTEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTBCRSwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwQkUsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTBMRSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwTEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTBCRSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwQkUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTJCRSwgIEFWX1BJWF9GTVRfWVVWNDIwUDEyTEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTJCRSwgIEFWX1BJWF9GTVRfWVVWNDIyUDEyTEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTJCRSwgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyTEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTRCRSwgIEFWX1BJWF9GTVRfWVVWNDIwUDE0TEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTRCRSwgIEFWX1BJWF9GTVRfWVVWNDIyUDE0TEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTRCRSwgIEFWX1BJWF9GTVRfWVVWNDQ0UDE0TEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTZMRSwgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2TEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTZCRSwgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2QkUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTZMRSwgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2TEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTZCRSwgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2QkUsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTZMRSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2TEUsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTZCRSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2QkUsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU3RlcmVvM0RDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcGl4X2ZtdHM7CisKKyAgICBzd2l0Y2ggKHMtPm91dC5mb3JtYXQpIHsKKyAgICBjYXNlIEFOQUdMWVBIX0dNX0NPTE9SOgorICAgIGNhc2UgQU5BR0xZUEhfR01fRFVCT0lTOgorICAgIGNhc2UgQU5BR0xZUEhfR01fR1JBWToKKyAgICBjYXNlIEFOQUdMWVBIX0dNX0hBTEY6CisgICAgY2FzZSBBTkFHTFlQSF9SQl9HUkFZOgorICAgIGNhc2UgQU5BR0xZUEhfUkNfQ09MT1I6CisgICAgY2FzZSBBTkFHTFlQSF9SQ19EVUJPSVM6CisgICAgY2FzZSBBTkFHTFlQSF9SQ19HUkFZOgorICAgIGNhc2UgQU5BR0xZUEhfUkNfSEFMRjoKKyAgICBjYXNlIEFOQUdMWVBIX1JHX0dSQVk6CisgICAgY2FzZSBBTkFHTFlQSF9ZQl9DT0xPUjoKKyAgICBjYXNlIEFOQUdMWVBIX1lCX0RVQk9JUzoKKyAgICBjYXNlIEFOQUdMWVBIX1lCX0dSQVk6CisgICAgY2FzZSBBTkFHTFlQSF9ZQl9IQUxGOgorICAgICAgICBwaXhfZm10cyA9IGFuYWdseXBoX3BpeF9mbXRzOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwaXhfZm10cyA9IG90aGVyX3BpeF9mbXRzOworICAgIH0KKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgU3RlcmVvM0RDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWUmF0aW9uYWwgYXNwZWN0ID0gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgIEFWUmF0aW9uYWwgZnBzID0gaW5saW5rLT5mcmFtZV9yYXRlOworICAgIEFWUmF0aW9uYWwgdGIgPSBpbmxpbmstPnRpbWVfYmFzZTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CisgICAgaW50IHJldDsKKworICAgIHN3aXRjaCAocy0+aW4uZm9ybWF0KSB7CisgICAgY2FzZSBTSURFX0JZX1NJREVfMl9MUjoKKyAgICBjYXNlIFNJREVfQllfU0lERV9MUjoKKyAgICBjYXNlIFNJREVfQllfU0lERV8yX1JMOgorICAgIGNhc2UgU0lERV9CWV9TSURFX1JMOgorICAgICAgICBpZiAoaW5saW5rLT53ICYgMSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAid2lkdGggbXVzdCBiZSBldmVuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUJPVkVfQkVMT1dfMl9MUjoKKyAgICBjYXNlIEFCT1ZFX0JFTE9XX0xSOgorICAgIGNhc2UgQUJPVkVfQkVMT1dfMl9STDoKKyAgICBjYXNlIEFCT1ZFX0JFTE9XX1JMOgorICAgICAgICBpZiAocy0+b3V0LmZvcm1hdCA9PSBJTlRFUkxFQVZFX1JPV1NfTFIgfHwKKyAgICAgICAgICAgIHMtPm91dC5mb3JtYXQgPT0gSU5URVJMRUFWRV9ST1dTX1JMKSB7CisgICAgICAgICAgICBpZiAoaW5saW5rLT5oICYgMykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImhlaWdodCBtdXN0IGJlIG11bHRpcGxlIG9mIDRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbmxpbmstPmggJiAxKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJoZWlnaHQgbXVzdCBiZSBldmVuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHMtPmluLndpZHRoICAgICA9CisgICAgcy0+d2lkdGggICAgICAgID0gaW5saW5rLT53OworICAgIHMtPmluLmhlaWdodCAgICA9CisgICAgcy0+aGVpZ2h0ICAgICAgID0gaW5saW5rLT5oOworICAgIHMtPnJvd19zdGVwICAgICA9IDE7CisgICAgcy0+aW4ub2ZmX2xzdGVwID0KKyAgICBzLT5pbi5vZmZfcnN0ZXAgPQorICAgIHMtPmluLm9mZl9sZWZ0ICA9CisgICAgcy0+aW4ub2ZmX3JpZ2h0ID0KKyAgICBzLT5pbi5yb3dfbGVmdCAgPQorICAgIHMtPmluLnJvd19yaWdodCA9IDA7CisKKyAgICBzd2l0Y2ggKHMtPmluLmZvcm1hdCkgeworICAgIGNhc2UgU0lERV9CWV9TSURFXzJfTFI6CisgICAgICAgIGFzcGVjdC5udW0gICAgICo9IDI7CisgICAgY2FzZSBTSURFX0JZX1NJREVfTFI6CisgICAgICAgIHMtPndpZHRoICAgICAgICA9IGlubGluay0+dyAvIDI7CisgICAgICAgIHMtPmluLm9mZl9yaWdodCA9IHMtPndpZHRoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNJREVfQllfU0lERV8yX1JMOgorICAgICAgICBhc3BlY3QubnVtICAgICAqPSAyOworICAgIGNhc2UgU0lERV9CWV9TSURFX1JMOgorICAgICAgICBzLT53aWR0aCAgICAgICAgPSBpbmxpbmstPncgLyAyOworICAgICAgICBzLT5pbi5vZmZfbGVmdCAgPSBzLT53aWR0aDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQk9WRV9CRUxPV18yX0xSOgorICAgICAgICBhc3BlY3QuZGVuICAgICAqPSAyOworICAgIGNhc2UgQUJPVkVfQkVMT1dfTFI6CisgICAgICAgIHMtPmluLnJvd19yaWdodCA9CisgICAgICAgIHMtPmhlaWdodCAgICAgICA9IGlubGluay0+aCAvIDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUJPVkVfQkVMT1dfMl9STDoKKyAgICAgICAgYXNwZWN0LmRlbiAgICAgKj0gMjsKKyAgICBjYXNlIEFCT1ZFX0JFTE9XX1JMOgorICAgICAgICBzLT5pbi5yb3dfbGVmdCAgPQorICAgICAgICBzLT5oZWlnaHQgICAgICAgPSBpbmxpbmstPmggLyAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFMVEVSTkFUSU5HX1JMOgorICAgIGNhc2UgQUxURVJOQVRJTkdfTFI6CisgICAgICAgIG91dGxpbmstPmZsYWdzIHw9IEZGX0xJTktfRkxBR19SRVFVRVNUX0xPT1A7CisgICAgICAgIGZwcy5kZW4gICAgICAgICo9IDI7CisgICAgICAgIHRiLm51bSAgICAgICAgICo9IDI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImlucHV0IGZvcm1hdCAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBzLT5pbi5mb3JtYXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPm91dC53aWR0aCAgICAgPSBzLT53aWR0aDsKKyAgICBzLT5vdXQuaGVpZ2h0ICAgID0gcy0+aGVpZ2h0OworICAgIHMtPm91dC5vZmZfbHN0ZXAgPQorICAgIHMtPm91dC5vZmZfcnN0ZXAgPQorICAgIHMtPm91dC5vZmZfbGVmdCAgPQorICAgIHMtPm91dC5vZmZfcmlnaHQgPQorICAgIHMtPm91dC5yb3dfbGVmdCAgPQorICAgIHMtPm91dC5yb3dfcmlnaHQgPSAwOworCisgICAgc3dpdGNoIChzLT5vdXQuZm9ybWF0KSB7CisgICAgY2FzZSBBTkFHTFlQSF9SQl9HUkFZOgorICAgIGNhc2UgQU5BR0xZUEhfUkdfR1JBWToKKyAgICBjYXNlIEFOQUdMWVBIX1JDX0dSQVk6CisgICAgY2FzZSBBTkFHTFlQSF9SQ19IQUxGOgorICAgIGNhc2UgQU5BR0xZUEhfUkNfQ09MT1I6CisgICAgY2FzZSBBTkFHTFlQSF9SQ19EVUJPSVM6CisgICAgY2FzZSBBTkFHTFlQSF9HTV9HUkFZOgorICAgIGNhc2UgQU5BR0xZUEhfR01fSEFMRjoKKyAgICBjYXNlIEFOQUdMWVBIX0dNX0NPTE9SOgorICAgIGNhc2UgQU5BR0xZUEhfR01fRFVCT0lTOgorICAgIGNhc2UgQU5BR0xZUEhfWUJfR1JBWToKKyAgICBjYXNlIEFOQUdMWVBIX1lCX0hBTEY6CisgICAgY2FzZSBBTkFHTFlQSF9ZQl9DT0xPUjoKKyAgICBjYXNlIEFOQUdMWVBIX1lCX0RVQk9JUzogeworICAgICAgICB1aW50OF90IHJnYmFfbWFwWzRdOworCisgICAgICAgIGZmX2ZpbGxfcmdiYV9tYXAocmdiYV9tYXAsIG91dGxpbmstPmZvcm1hdCk7CisgICAgICAgIHMtPmFuYV9tYXRyaXhbcmdiYV9tYXBbMF1dID0gJmFuYV9jb2VmZltzLT5vdXQuZm9ybWF0XVswXVswXTsKKyAgICAgICAgcy0+YW5hX21hdHJpeFtyZ2JhX21hcFsxXV0gPSAmYW5hX2NvZWZmW3MtPm91dC5mb3JtYXRdWzFdWzBdOworICAgICAgICBzLT5hbmFfbWF0cml4W3JnYmFfbWFwWzJdXSA9ICZhbmFfY29lZmZbcy0+b3V0LmZvcm1hdF1bMl1bMF07CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFNJREVfQllfU0lERV8yX0xSOgorICAgICAgICBhc3BlY3QuZGVuICAgICAgKj0gMjsKKyAgICBjYXNlIFNJREVfQllfU0lERV9MUjoKKyAgICAgICAgcy0+b3V0LndpZHRoICAgICA9IHMtPndpZHRoICogMjsKKyAgICAgICAgcy0+b3V0Lm9mZl9yaWdodCA9IHMtPndpZHRoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNJREVfQllfU0lERV8yX1JMOgorICAgICAgICBhc3BlY3QuZGVuICAgICAgKj0gMjsKKyAgICBjYXNlIFNJREVfQllfU0lERV9STDoKKyAgICAgICAgcy0+b3V0LndpZHRoICAgICA9IHMtPndpZHRoICogMjsKKyAgICAgICAgcy0+b3V0Lm9mZl9sZWZ0ICA9IHMtPndpZHRoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFCT1ZFX0JFTE9XXzJfTFI6CisgICAgICAgIGFzcGVjdC5udW0gICAgICAqPSAyOworICAgIGNhc2UgQUJPVkVfQkVMT1dfTFI6CisgICAgICAgIHMtPm91dC5oZWlnaHQgICAgPSBzLT5oZWlnaHQgKiAyOworICAgICAgICBzLT5vdXQucm93X3JpZ2h0ID0gcy0+aGVpZ2h0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFCT1ZFX0JFTE9XXzJfUkw6CisgICAgICAgIGFzcGVjdC5udW0gICAgICAqPSAyOworICAgIGNhc2UgQUJPVkVfQkVMT1dfUkw6CisgICAgICAgIHMtPm91dC5oZWlnaHQgICAgPSBzLT5oZWlnaHQgKiAyOworICAgICAgICBzLT5vdXQucm93X2xlZnQgID0gcy0+aGVpZ2h0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVSTEVBVkVfUk9XU19MUjoKKyAgICAgICAgcy0+cm93X3N0ZXAgICAgICA9IDI7CisgICAgICAgIHMtPmhlaWdodCAgICAgICAgPSBzLT5oZWlnaHQgLyAyOworICAgICAgICBzLT5vdXQub2ZmX3JzdGVwID0KKyAgICAgICAgcy0+aW4ub2ZmX3JzdGVwICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URVJMRUFWRV9ST1dTX1JMOgorICAgICAgICBzLT5yb3dfc3RlcCAgICAgID0gMjsKKyAgICAgICAgcy0+aGVpZ2h0ICAgICAgICA9IHMtPmhlaWdodCAvIDI7CisgICAgICAgIHMtPm91dC5vZmZfbHN0ZXAgPQorICAgICAgICBzLT5pbi5vZmZfbHN0ZXAgID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT05PX1I6CisgICAgICAgIHMtPmluLm9mZl9sZWZ0ICAgPSBzLT5pbi5vZmZfcmlnaHQ7CisgICAgICAgIHMtPmluLnJvd19sZWZ0ICAgPSBzLT5pbi5yb3dfcmlnaHQ7CisgICAgY2FzZSBNT05PX0w6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUxURVJOQVRJTkdfUkw6CisgICAgY2FzZSBBTFRFUk5BVElOR19MUjoKKyAgICAgICAgZnBzLm51bSAgICAgICAgICo9IDI7CisgICAgICAgIHRiLmRlbiAgICAgICAgICAqPSAyOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJvdXRwdXQgZm9ybWF0ICVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIHMtPm91dC5mb3JtYXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG91dGxpbmstPncgPSBzLT5vdXQud2lkdGg7CisgICAgb3V0bGluay0+aCA9IHMtPm91dC5oZWlnaHQ7CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IGZwczsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSB0YjsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXNwZWN0OworCisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhzLT5saW5lc2l6ZSwgb3V0bGluay0+Zm9ybWF0LCBzLT53aWR0aCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBzLT5uYl9wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhvdXRsaW5rLT5mb3JtYXQpOworICAgIGF2X2ltYWdlX2ZpbGxfbWF4X3BpeHN0ZXBzKHMtPnBpeHN0ZXAsIE5VTEwsIGRlc2MpOworICAgIHMtPnRzX3VuaXQgPSBhdl9xMmQoYXZfaW52X3EoYXZfbXVsX3Eob3V0bGluay0+ZnJhbWVfcmF0ZSwgb3V0bGluay0+dGltZV9iYXNlKSkpOworICAgIHMtPnBoZWlnaHRbMV0gPSBzLT5waGVpZ2h0WzJdID0gRkZfQ0VJTF9SU0hJRlQocy0+aGVpZ2h0LCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBzLT5waGVpZ2h0WzBdID0gcy0+cGhlaWdodFszXSA9IHMtPmhlaWdodDsKKyAgICBzLT5oc3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBzLT52c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgYW5hX2NvbnZlcnQoY29uc3QgaW50ICpjb2VmZiwgY29uc3QgdWludDhfdCAqbGVmdCwgY29uc3QgdWludDhfdCAqcmlnaHQpCit7CisgICAgaW50IHN1bTsKKworICAgIHN1bSAgPSBjb2VmZlswXSAqIGxlZnRbMF0gKyBjb2VmZlszXSAqIHJpZ2h0WzBdOyAvL3JlZCBpbgorICAgIHN1bSArPSBjb2VmZlsxXSAqIGxlZnRbMV0gKyBjb2VmZls0XSAqIHJpZ2h0WzFdOyAvL2dyZWVuIGluCisgICAgc3VtICs9IGNvZWZmWzJdICogbGVmdFsyXSArIGNvZWZmWzVdICogcmlnaHRbMl07IC8vYmx1ZSBpbgorCisgICAgcmV0dXJuIGF2X2NsaXBfdWludDgoc3VtID4+IDE2KTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucGljcmVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ICA9IGlubGluay0+ZHN0OworICAgIFN0ZXJlbzNEQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0LCAqb2xlZnQsICpvcmlnaHQsICppbGVmdCwgKmlyaWdodDsKKyAgICBpbnQgb3V0X29mZl9sZWZ0WzRdLCBvdXRfb2ZmX3JpZ2h0WzRdOworICAgIGludCBpbl9vZmZfbGVmdFs0XSwgaW5fb2ZmX3JpZ2h0WzRdOworICAgIGludCBpOworCisgICAgc3dpdGNoIChzLT5pbi5mb3JtYXQpIHsKKyAgICBjYXNlIEFMVEVSTkFUSU5HX0xSOgorICAgIGNhc2UgQUxURVJOQVRJTkdfUkw6CisgICAgICAgIGlmICghcy0+cHJldikgeworICAgICAgICAgICAgcy0+cHJldiA9IGlucGljcmVmOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWxlZnQgID0gcy0+cHJldjsKKyAgICAgICAgaXJpZ2h0ID0gaW5waWNyZWY7CisgICAgICAgIGlmIChzLT5pbi5mb3JtYXQgPT0gQUxURVJOQVRJTkdfUkwpCisgICAgICAgICAgICBGRlNXQVAoQVZGcmFtZSAqLCBpbGVmdCwgaXJpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWxlZnQgPSBpcmlnaHQgPSBpbnBpY3JlZjsKKyAgICB9OworCisgICAgb3V0ID0gb2xlZnQgPSBvcmlnaHQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnByZXYpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnBpY3JlZik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbnBpY3JlZik7CisKKyAgICBpZiAocy0+b3V0LmZvcm1hdCA9PSBBTFRFUk5BVElOR19MUiB8fAorICAgICAgICBzLT5vdXQuZm9ybWF0ID09IEFMVEVSTkFUSU5HX1JMKSB7CisgICAgICAgIG9yaWdodCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3JpZ2h0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvbGVmdCk7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2KTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlucGljcmVmKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvcmlnaHQsIGlucGljcmVmKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGludCBoc3ViID0gaSA9PSAxIHx8IGkgPT0gMiA/IHMtPmhzdWIgOiAwOworICAgICAgICBpbnQgdnN1YiA9IGkgPT0gMSB8fCBpID09IDIgPyBzLT52c3ViIDogMDsKKyAgICAgICAgaW5fb2ZmX2xlZnRbaV0gICA9IChGRl9DRUlMX1JTSElGVChzLT5pbi5yb3dfbGVmdCwgICB2c3ViKSArIHMtPmluLm9mZl9sc3RlcCkgICogaWxlZnQtPmxpbmVzaXplW2ldICArIEZGX0NFSUxfUlNISUZUKHMtPmluLm9mZl9sZWZ0ICAgKiBzLT5waXhzdGVwW2ldLCBoc3ViKTsKKyAgICAgICAgaW5fb2ZmX3JpZ2h0W2ldICA9IChGRl9DRUlMX1JTSElGVChzLT5pbi5yb3dfcmlnaHQsICB2c3ViKSArIHMtPmluLm9mZl9yc3RlcCkgICogaXJpZ2h0LT5saW5lc2l6ZVtpXSArIEZGX0NFSUxfUlNISUZUKHMtPmluLm9mZl9yaWdodCAgKiBzLT5waXhzdGVwW2ldLCBoc3ViKTsKKyAgICAgICAgb3V0X29mZl9sZWZ0W2ldICA9IChGRl9DRUlMX1JTSElGVChzLT5vdXQucm93X2xlZnQsICB2c3ViKSArIHMtPm91dC5vZmZfbHN0ZXApICogb2xlZnQtPmxpbmVzaXplW2ldICArIEZGX0NFSUxfUlNISUZUKHMtPm91dC5vZmZfbGVmdCAgKiBzLT5waXhzdGVwW2ldLCBoc3ViKTsKKyAgICAgICAgb3V0X29mZl9yaWdodFtpXSA9IChGRl9DRUlMX1JTSElGVChzLT5vdXQucm93X3JpZ2h0LCB2c3ViKSArIHMtPm91dC5vZmZfcnN0ZXApICogb3JpZ2h0LT5saW5lc2l6ZVtpXSArIEZGX0NFSUxfUlNISUZUKHMtPm91dC5vZmZfcmlnaHQgKiBzLT5waXhzdGVwW2ldLCBoc3ViKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHMtPm91dC5mb3JtYXQpIHsKKyAgICBjYXNlIEFMVEVSTkFUSU5HX0xSOgorICAgIGNhc2UgQUxURVJOQVRJTkdfUkw6CisgICAgY2FzZSBTSURFX0JZX1NJREVfTFI6CisgICAgY2FzZSBTSURFX0JZX1NJREVfUkw6CisgICAgY2FzZSBTSURFX0JZX1NJREVfMl9MUjoKKyAgICBjYXNlIFNJREVfQllfU0lERV8yX1JMOgorICAgIGNhc2UgQUJPVkVfQkVMT1dfTFI6CisgICAgY2FzZSBBQk9WRV9CRUxPV19STDoKKyAgICBjYXNlIEFCT1ZFX0JFTE9XXzJfTFI6CisgICAgY2FzZSBBQk9WRV9CRUxPV18yX1JMOgorICAgIGNhc2UgSU5URVJMRUFWRV9ST1dTX0xSOgorICAgIGNhc2UgSU5URVJMRUFWRV9ST1dTX1JMOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUob2xlZnQtPmRhdGFbaV0gKyBvdXRfb2ZmX2xlZnRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZWZ0LT5saW5lc2l6ZVtpXSAqIHMtPnJvd19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbGVmdC0+ZGF0YVtpXSArIGluX29mZl9sZWZ0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbGVmdC0+bGluZXNpemVbaV0gKiBzLT5yb3dfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemVbaV0sIHMtPnBoZWlnaHRbaV0pOworICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvcmlnaHQtPmRhdGFbaV0gKyBvdXRfb2ZmX3JpZ2h0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaHQtPmxpbmVzaXplW2ldICogcy0+cm93X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyaWdodC0+ZGF0YVtpXSArIGluX29mZl9yaWdodFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJpZ2h0LT5saW5lc2l6ZVtpXSAqIHMtPnJvd19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lc2l6ZVtpXSwgcy0+cGhlaWdodFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT05PX0w6CisgICAgICAgIGlyaWdodCA9IGlsZWZ0OworICAgIGNhc2UgTU9OT19SOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUob3V0LT5kYXRhW2ldLCBvdXQtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcmlnaHQtPmRhdGFbaV0gKyBpbl9vZmZfbGVmdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJpZ2h0LT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemVbaV0sIHMtPnBoZWlnaHRbaV0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU5BR0xZUEhfUkJfR1JBWToKKyAgICBjYXNlIEFOQUdMWVBIX1JHX0dSQVk6CisgICAgY2FzZSBBTkFHTFlQSF9SQ19HUkFZOgorICAgIGNhc2UgQU5BR0xZUEhfUkNfSEFMRjoKKyAgICBjYXNlIEFOQUdMWVBIX1JDX0NPTE9SOgorICAgIGNhc2UgQU5BR0xZUEhfUkNfRFVCT0lTOgorICAgIGNhc2UgQU5BR0xZUEhfR01fR1JBWToKKyAgICBjYXNlIEFOQUdMWVBIX0dNX0hBTEY6CisgICAgY2FzZSBBTkFHTFlQSF9HTV9DT0xPUjoKKyAgICBjYXNlIEFOQUdMWVBIX0dNX0RVQk9JUzoKKyAgICBjYXNlIEFOQUdMWVBIX1lCX0dSQVk6CisgICAgY2FzZSBBTkFHTFlQSF9ZQl9IQUxGOgorICAgIGNhc2UgQU5BR0xZUEhfWUJfQ09MT1I6CisgICAgY2FzZSBBTkFHTFlQSF9ZQl9EVUJPSVM6IHsKKyAgICAgICAgaW50IHgsIHksIGlsLCBpciwgbzsKKyAgICAgICAgY29uc3QgdWludDhfdCAqbHNyYyA9IGlsZWZ0LT5kYXRhWzBdOworICAgICAgICBjb25zdCB1aW50OF90ICpyc3JjID0gaXJpZ2h0LT5kYXRhWzBdOworICAgICAgICB1aW50OF90ICpkc3QgPSBvdXQtPmRhdGFbMF07CisgICAgICAgIGludCBvdXRfd2lkdGggPSBzLT5vdXQud2lkdGg7CisgICAgICAgIGNvbnN0IGludCAqKmFuYV9tYXRyaXggPSBzLT5hbmFfbWF0cml4OworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzLT5vdXQuaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIG8gICA9IG91dC0+bGluZXNpemVbMF0gKiB5OworICAgICAgICAgICAgaWwgID0gaW5fb2ZmX2xlZnRbMF0gICsgeSAqIGlsZWZ0LT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIGlyICA9IGluX29mZl9yaWdodFswXSArIHkgKiBpcmlnaHQtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG91dF93aWR0aDsgeCsrLCBpbCArPSAzLCBpciArPSAzLCBvKz0gMykgeworICAgICAgICAgICAgICAgIGRzdFtvICAgIF0gPSBhbmFfY29udmVydChhbmFfbWF0cml4WzBdLCBsc3JjICsgaWwsIHJzcmMgKyBpcik7CisgICAgICAgICAgICAgICAgZHN0W28gKyAxXSA9IGFuYV9jb252ZXJ0KGFuYV9tYXRyaXhbMV0sIGxzcmMgKyBpbCwgcnNyYyArIGlyKTsKKyAgICAgICAgICAgICAgICBkc3RbbyArIDJdID0gYW5hX2NvbnZlcnQoYW5hX21hdHJpeFsyXSwgbHNyYyArIGlsLCByc3JjICsgaXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIGF2X2ZyYW1lX2ZyZWUoJmlucGljcmVmKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2KTsKKyAgICBpZiAob3JpZ2h0ICE9IG9sZWZ0KSB7CisgICAgICAgIGlmIChzLT5vdXQuZm9ybWF0ID09IEFMVEVSTkFUSU5HX0xSKQorICAgICAgICAgICAgRkZTV0FQKEFWRnJhbWUgKiwgb2xlZnQsIG9yaWdodCk7CisgICAgICAgIG9yaWdodC0+cHRzID0gb3V0bGluay0+ZnJhbWVfY291bnQgKiBzLT50c191bml0OworICAgICAgICBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3JpZ2h0KTsKKyAgICAgICAgb3V0ID0gb2xlZnQ7CisgICAgICAgIG9sZWZ0LT5wdHMgPSBvdXRsaW5rLT5mcmFtZV9jb3VudCAqIHMtPnRzX3VuaXQ7CisgICAgfSBlbHNlIGlmIChzLT5pbi5mb3JtYXQgPT0gQUxURVJOQVRJTkdfTFIgfHwKKyAgICAgICAgICAgICAgIHMtPmluLmZvcm1hdCA9PSBBTFRFUk5BVElOR19STCkgeworICAgICAgICBvdXQtPnB0cyA9IG91dGxpbmstPmZyYW1lX2NvdW50ICogcy0+dHNfdW5pdDsKKyAgICB9CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTdGVyZW8zRENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHN0ZXJlbzNkX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc3RlcmVvM2Rfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfc3RlcmVvM2QgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAic3RlcmVvM2QiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvbnZlcnQgdmlkZW8gc3RlcmVvc2NvcGljIDNEIHZpZXcuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoU3RlcmVvM0RDb250ZXh0KSwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBzdGVyZW8zZF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBzdGVyZW8zZF9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnN0ZXJlbzNkX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zdWJ0aXRsZXMuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zdWJ0aXRsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTRjNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3N1YnRpdGxlcy5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEJhcHRpc3RlIENvdWR1cmllcgorICogQ29weXJpZ2h0IChjKSAyMDExIFN0ZWZhbm8gU2FiYXRpbmkKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTGliYXNzIHN1YnRpdGxlcyBidXJuaW5nIGZpbHRlci4KKyAqCisgKiBAc2Vle2h0dHA6Ly93d3cubWF0cm9za2Eub3JnL3RlY2huaWNhbC9zcGVjcy9zdWJ0aXRsZXMvc3NhLmh0bWx9CisgKi8KKworI2luY2x1ZGUgPGFzcy9hc3MuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIENPTkZJR19TVUJUSVRMRVNfRklMVEVSCisjIGluY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorIyBpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2VuZGlmCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgQVNTX0xpYnJhcnkgICpsaWJyYXJ5OworICAgIEFTU19SZW5kZXJlciAqcmVuZGVyZXI7CisgICAgQVNTX1RyYWNrICAgICp0cmFjazsKKyAgICBjaGFyICpmaWxlbmFtZTsKKyAgICBjaGFyICpjaGFyZW5jOworICAgIGludCBzdHJlYW1faW5kZXg7CisgICAgdWludDhfdCByZ2JhX21hcFs0XTsKKyAgICBpbnQgICAgIHBpeF9zdGVwWzRdOyAgICAgICAvLy88IHN0ZXBzIHBlciBwaXhlbCBmb3IgZWFjaCBwbGFuZSBvZiB0aGUgbWFpbiBvdXRwdXQKKyAgICBpbnQgb3JpZ2luYWxfdywgb3JpZ2luYWxfaDsKKyAgICBpbnQgc2hhcGluZzsKKyAgICBGRkRyYXdDb250ZXh0IGRyYXc7Cit9IEFzc0NvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFzc0NvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCisjZGVmaW5lIENPTU1PTl9PUFRJT05TIFwKKyAgICB7ImZpbGVuYW1lIiwgICAgICAgInNldCB0aGUgZmlsZW5hbWUgb2YgZmlsZSB0byByZWFkIiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGZpbGVuYW1lKSwgICBBVl9PUFRfVFlQRV9TVFJJTkcsICAgICB7LnN0ciA9IE5VTEx9LCAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LCBcCisgICAgeyJmIiwgICAgICAgICAgICAgICJzZXQgdGhlIGZpbGVuYW1lIG9mIGZpbGUgdG8gcmVhZCIsICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChmaWxlbmFtZSksICAgQVZfT1BUX1RZUEVfU1RSSU5HLCAgICAgey5zdHIgPSBOVUxMfSwgIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwgXAorICAgIHsib3JpZ2luYWxfc2l6ZSIsICAic2V0IHRoZSBzaXplIG9mIHRoZSBvcmlnaW5hbCB2aWRlbyAodXNlZCB0byBzY2FsZSBmb250cykiLCBPRkZTRVQob3JpZ2luYWxfdyksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyID0gTlVMTH0sICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sIFwKKworLyogbGliYXNzIHN1cHBvcnRzIGEgbG9nIGxldmVsIHJhbmdpbmcgZnJvbSAwIHRvIDcgKi8KK3N0YXRpYyBjb25zdCBpbnQgYXNzX2xpYmF2ZmlsdGVyX2xvZ19sZXZlbF9tYXBbXSA9IHsKKyAgICBbMF0gPSBBVl9MT0dfRkFUQUwsICAgICAvKiBNU0dMX0ZBVEFMICovCisgICAgWzFdID0gQVZfTE9HX0VSUk9SLCAgICAgLyogTVNHTF9FUlIgKi8KKyAgICBbMl0gPSBBVl9MT0dfV0FSTklORywgICAvKiBNU0dMX1dBUk4gKi8KKyAgICBbM10gPSBBVl9MT0dfV0FSTklORywgICAvKiA8dW5kZWZpbmVkPiAqLworICAgIFs0XSA9IEFWX0xPR19JTkZPLCAgICAgIC8qIE1TR0xfSU5GTyAqLworICAgIFs1XSA9IEFWX0xPR19JTkZPLCAgICAgIC8qIDx1bmRlZmluZWQ+ICovCisgICAgWzZdID0gQVZfTE9HX1ZFUkJPU0UsICAgLyogTVNHTF9WICovCisgICAgWzddID0gQVZfTE9HX0RFQlVHLCAgICAgLyogTVNHTF9EQkcyICovCit9OworCitzdGF0aWMgdm9pZCBhc3NfbG9nKGludCBhc3NfbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzLCB2b2lkICpjdHgpCit7CisgICAgY29uc3QgaW50IGFzc19sZXZlbF9jbGlwID0gYXZfY2xpcChhc3NfbGV2ZWwsIDAsCisgICAgICAgIEZGX0FSUkFZX0VMRU1TKGFzc19saWJhdmZpbHRlcl9sb2dfbGV2ZWxfbWFwKSAtIDEpOworICAgIGNvbnN0IGludCBsZXZlbCA9IGFzc19saWJhdmZpbHRlcl9sb2dfbGV2ZWxfbWFwW2Fzc19sZXZlbF9jbGlwXTsKKworICAgIGF2X3Zsb2coY3R4LCBsZXZlbCwgZm10LCBhcmdzKTsKKyAgICBhdl9sb2coY3R4LCBsZXZlbCwgIlxuIik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFzc0NvbnRleHQgKmFzcyA9IGN0eC0+cHJpdjsKKworICAgIGlmICghYXNzLT5maWxlbmFtZSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJObyBmaWxlbmFtZSBwcm92aWRlZCFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGFzcy0+bGlicmFyeSA9IGFzc19saWJyYXJ5X2luaXQoKTsKKyAgICBpZiAoIWFzcy0+bGlicmFyeSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBsaWJhc3MuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXNzX3NldF9tZXNzYWdlX2NiKGFzcy0+bGlicmFyeSwgYXNzX2xvZywgY3R4KTsKKworICAgIGFzcy0+cmVuZGVyZXIgPSBhc3NfcmVuZGVyZXJfaW5pdChhc3MtPmxpYnJhcnkpOworICAgIGlmICghYXNzLT5yZW5kZXJlcikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBsaWJhc3MgcmVuZGVyZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQXNzQ29udGV4dCAqYXNzID0gY3R4LT5wcml2OworCisgICAgaWYgKGFzcy0+dHJhY2spCisgICAgICAgIGFzc19mcmVlX3RyYWNrKGFzcy0+dHJhY2spOworICAgIGlmIChhc3MtPnJlbmRlcmVyKQorICAgICAgICBhc3NfcmVuZGVyZXJfZG9uZShhc3MtPnJlbmRlcmVyKTsKKyAgICBpZiAoYXNzLT5saWJyYXJ5KQorICAgICAgICBhc3NfbGlicmFyeV9kb25lKGFzcy0+bGlicmFyeSk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9kcmF3X3N1cHBvcnRlZF9waXhlbF9mb3JtYXRzKDApKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQXNzQ29udGV4dCAqYXNzID0gaW5saW5rLT5kc3QtPnByaXY7CisKKyAgICBmZl9kcmF3X2luaXQoJmFzcy0+ZHJhdywgaW5saW5rLT5mb3JtYXQsIDApOworCisgICAgYXNzX3NldF9mcmFtZV9zaXplICAoYXNzLT5yZW5kZXJlciwgaW5saW5rLT53LCBpbmxpbmstPmgpOworICAgIGlmIChhc3MtPm9yaWdpbmFsX3cgJiYgYXNzLT5vcmlnaW5hbF9oKQorICAgICAgICBhc3Nfc2V0X2FzcGVjdF9yYXRpbyhhc3MtPnJlbmRlcmVyLCAoZG91YmxlKWlubGluay0+dyAvIGlubGluay0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlhc3MtPm9yaWdpbmFsX3cgLyBhc3MtPm9yaWdpbmFsX2gpOworICAgIGlmIChhc3MtPnNoYXBpbmcgIT0gLTEpCisgICAgICAgIGFzc19zZXRfc2hhcGVyKGFzcy0+cmVuZGVyZXIsIGFzcy0+c2hhcGluZyk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogbGliYXNzIHN0b3JlcyBhbiBSR0JBIGNvbG9yIGluIHRoZSBmb3JtYXQgUlJHR0JCVFQsIHdoZXJlIFRUIGlzIHRoZSB0cmFuc3BhcmVuY3kgbGV2ZWwgKi8KKyNkZWZpbmUgQVIoYykgICggKGMpPj4yNCkKKyNkZWZpbmUgQUcoYykgICgoKGMpPj4xNikmMHhGRikKKyNkZWZpbmUgQUIoYykgICgoKGMpPj44KSAmMHhGRikKKyNkZWZpbmUgQUEoYykgICgoMHhGRi1jKSAmMHhGRikKKworc3RhdGljIHZvaWQgb3ZlcmxheV9hc3NfaW1hZ2UoQXNzQ29udGV4dCAqYXNzLCBBVkZyYW1lICpwaWNyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU1NfSW1hZ2UgKmltYWdlKQoreworICAgIGZvciAoOyBpbWFnZTsgaW1hZ2UgPSBpbWFnZS0+bmV4dCkgeworICAgICAgICB1aW50OF90IHJnYmFfY29sb3JbXSA9IHtBUihpbWFnZS0+Y29sb3IpLCBBRyhpbWFnZS0+Y29sb3IpLCBBQihpbWFnZS0+Y29sb3IpLCBBQShpbWFnZS0+Y29sb3IpfTsKKyAgICAgICAgRkZEcmF3Q29sb3IgY29sb3I7CisgICAgICAgIGZmX2RyYXdfY29sb3IoJmFzcy0+ZHJhdywgJmNvbG9yLCByZ2JhX2NvbG9yKTsKKyAgICAgICAgZmZfYmxlbmRfbWFzaygmYXNzLT5kcmF3LCAmY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgcGljcmVmLT5kYXRhLCBwaWNyZWYtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHBpY3JlZi0+d2lkdGgsIHBpY3JlZi0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5iaXRtYXAsIGltYWdlLT5zdHJpZGUsIGltYWdlLT53LCBpbWFnZS0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAzLCAwLCBpbWFnZS0+ZHN0X3gsIGltYWdlLT5kc3RfeSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqcGljcmVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFzc0NvbnRleHQgKmFzcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgZGV0ZWN0X2NoYW5nZSA9IDA7CisgICAgZG91YmxlIHRpbWVfbXMgPSBwaWNyZWYtPnB0cyAqIGF2X3EyZChpbmxpbmstPnRpbWVfYmFzZSkgKiAxMDAwOworICAgIEFTU19JbWFnZSAqaW1hZ2UgPSBhc3NfcmVuZGVyX2ZyYW1lKGFzcy0+cmVuZGVyZXIsIGFzcy0+dHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9tcywgJmRldGVjdF9jaGFuZ2UpOworCisgICAgaWYgKGRldGVjdF9jaGFuZ2UpCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIkNoYW5nZSBoYXBwZW5lZCBhdCB0aW1lIG1zOiVmXG4iLCB0aW1lX21zKTsKKworICAgIG92ZXJsYXlfYXNzX2ltYWdlKGFzcywgcGljcmVmLCBpbWFnZSk7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIHBpY3JlZik7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhc3NfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgICAgID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICAgICA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLm5lZWRzX3dyaXRhYmxlICAgPSAxLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhc3Nfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNpZiBDT05GSUdfQVNTX0ZJTFRFUgorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYXNzX29wdGlvbnNbXSA9IHsKKyAgICBDT01NT05fT1BUSU9OUworICAgIHsic2hhcGluZyIsICJzZXQgc2hhcGluZyBlbmdpbmUiLCBPRkZTRVQoc2hhcGluZyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIEZMQUdTLCAic2hhcGluZ19tb2RlIn0sCisgICAgICAgIHsiYXV0byIsIE5VTEwsICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAtMX0sICAgICAgICAgICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJzaGFwaW5nX21vZGUifSwKKyAgICAgICAgeyJzaW1wbGUiLCAgInNpbXBsZSBzaGFwaW5nIiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFTU19TSEFQSU5HX1NJTVBMRX0sICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInNoYXBpbmdfbW9kZSJ9LAorICAgICAgICB7ImNvbXBsZXgiLCAiY29tcGxleCBzaGFwaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVNTX1NIQVBJTkdfQ09NUExFWH0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAic2hhcGluZ19tb2RlIn0sCisgICAge05VTEx9LAorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGFzcyk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0X2FzcyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBc3NDb250ZXh0ICphc3MgPSBjdHgtPnByaXY7CisgICAgaW50IHJldCA9IGluaXQoY3R4KTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogSW5pdGlhbGl6ZSBmb250cyAqLworICAgIGFzc19zZXRfZm9udHMoYXNzLT5yZW5kZXJlciwgTlVMTCwgTlVMTCwgMSwgTlVMTCwgMSk7CisKKyAgICBhc3MtPnRyYWNrID0gYXNzX3JlYWRfZmlsZShhc3MtPmxpYnJhcnksIGFzcy0+ZmlsZW5hbWUsIE5VTEwpOworICAgIGlmICghYXNzLT50cmFjaykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBhIGxpYmFzcyB0cmFjayB3aGVuIHJlYWRpbmcgZmlsZSAnJXMnXG4iLAorICAgICAgICAgICAgICAgYXNzLT5maWxlbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitBVkZpbHRlciBmZl92Zl9hc3MgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYXNzIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZW5kZXIgQVNTIHN1YnRpdGxlcyBvbnRvIGlucHV0IHZpZGVvIHVzaW5nIHRoZSBsaWJhc3MgbGlicmFyeS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihBc3NDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXRfYXNzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGFzc19pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhc3Nfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZhc3NfY2xhc3MsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfU1VCVElUTEVTX0ZJTFRFUgorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gc3VidGl0bGVzX29wdGlvbnNbXSA9IHsKKyAgICBDT01NT05fT1BUSU9OUworICAgIHsiY2hhcmVuYyIsICAgICAgInNldCBpbnB1dCBjaGFyYWN0ZXIgZW5jb2RpbmciLCBPRkZTRVQoY2hhcmVuYyksICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTfSwKKyAgICB7InN0cmVhbV9pbmRleCIsICJzZXQgc3RyZWFtIGluZGV4IiwgICAgICAgICAgICAgT0ZGU0VUKHN0cmVhbV9pbmRleCksIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gLTEgfSwgLTEsICAgICAgIElOVF9NQVgsICBGTEFHU30sCisgICAgeyJzaSIsICAgICAgICAgICAic2V0IHN0cmVhbSBpbmRleCIsICAgICAgICAgICAgIE9GRlNFVChzdHJlYW1faW5kZXgpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IC0xIH0sIC0xLCAgICAgICBJTlRfTUFYLCAgRkxBR1N9LAorICAgIHtOVUxMfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZm9udF9taW1ldHlwZXNbXSA9IHsKKyAgICAiYXBwbGljYXRpb24veC10cnVldHlwZS1mb250IiwKKyAgICAiYXBwbGljYXRpb24vdm5kLm1zLW9wZW50eXBlIiwKKyAgICAiYXBwbGljYXRpb24veC1mb250LXR0ZiIsCisgICAgTlVMTAorfTsKKworc3RhdGljIGludCBhdHRhY2htZW50X2lzX2ZvbnQoQVZTdHJlYW0gKiBzdCkKK3sKKyAgICBjb25zdCBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnID0gTlVMTDsKKyAgICBpbnQgbjsKKworICAgIHRhZyA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgIm1pbWV0eXBlIiwgTlVMTCwgQVZfRElDVF9NQVRDSF9DQVNFKTsKKworICAgIGlmICh0YWcpIHsKKyAgICAgICAgZm9yIChuID0gMDsgZm9udF9taW1ldHlwZXNbbl07IG4rKykgeworICAgICAgICAgICAgaWYgKGF2X3N0cmNhc2VjbXAoZm9udF9taW1ldHlwZXNbbl0sIHRhZy0+dmFsdWUpID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzdWJ0aXRsZXMpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdF9zdWJ0aXRsZXMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGosIHJldCwgc2lkOworICAgIGludCBrID0gMDsKKyAgICBBVkRpY3Rpb25hcnkgKmNvZGVjX29wdHMgPSBOVUxMOworICAgIEFWRm9ybWF0Q29udGV4dCAqZm10ID0gTlVMTDsKKyAgICBBVkNvZGVjQ29udGV4dCAqZGVjX2N0eCA9IE5VTEw7CisgICAgQVZDb2RlYyAqZGVjID0gTlVMTDsKKyAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqZGVjX2Rlc2M7CisgICAgQVZTdHJlYW0gKnN0OworICAgIEFWUGFja2V0IHBrdDsKKyAgICBBc3NDb250ZXh0ICphc3MgPSBjdHgtPnByaXY7CisKKyAgICAvKiBJbml0IGxpYmFzcyAqLworICAgIHJldCA9IGluaXQoY3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBhc3MtPnRyYWNrID0gYXNzX25ld190cmFjayhhc3MtPmxpYnJhcnkpOworICAgIGlmICghYXNzLT50cmFjaykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIGEgbGliYXNzIHRyYWNrXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvKiBPcGVuIHN1YnRpdGxlcyBmaWxlICovCisgICAgcmV0ID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmZm10LCBhc3MtPmZpbGVuYW1lLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiAlc1xuIiwgYXNzLT5maWxlbmFtZSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICByZXQgPSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKGZtdCwgTlVMTCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgLyogTG9jYXRlIHN1YnRpdGxlcyBzdHJlYW0gKi8KKyAgICBpZiAoYXNzLT5zdHJlYW1faW5kZXggPCAwKQorICAgICAgICByZXQgPSBhdl9maW5kX2Jlc3Rfc3RyZWFtKGZtdCwgQVZNRURJQV9UWVBFX1NVQlRJVExFLCAtMSwgLTEsIE5VTEwsIDApOworICAgIGVsc2UgeworICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgaWYgKGFzcy0+c3RyZWFtX2luZGV4IDwgZm10LT5uYl9zdHJlYW1zKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZm10LT5uYl9zdHJlYW1zOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZm10LT5zdHJlYW1zW2pdLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFzcy0+c3RyZWFtX2luZGV4ID09IGspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGxvY2F0ZSBzdWJ0aXRsZSBzdHJlYW0gaW4gJXNcbiIsCisgICAgICAgICAgICAgICBhc3MtPmZpbGVuYW1lKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIHNpZCA9IHJldDsKKyAgICBzdCA9IGZtdC0+c3RyZWFtc1tzaWRdOworCisgICAgLyogTG9hZCBhdHRhY2hlZCBmb250cyAqLworICAgIGZvciAoaiA9IDA7IGogPCBmbXQtPm5iX3N0cmVhbXM7IGorKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBmbXQtPnN0cmVhbXNbal07CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQgJiYKKyAgICAgICAgICAgIGF0dGFjaG1lbnRfaXNfZm9udChzdCkpIHsKKyAgICAgICAgICAgIGNvbnN0IEFWRGljdGlvbmFyeUVudHJ5ICp0YWcgPSBOVUxMOworICAgICAgICAgICAgdGFnID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAiZmlsZW5hbWUiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRElDVF9NQVRDSF9DQVNFKTsKKworICAgICAgICAgICAgaWYgKHRhZykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIkxvYWRpbmcgYXR0YWNoZWQgZm9udDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRhZy0+dmFsdWUpOworICAgICAgICAgICAgICAgIGFzc19hZGRfZm9udChhc3MtPmxpYnJhcnksIHRhZy0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJGb250IGF0dGFjaG1lbnQgaGFzIG5vIGZpbGVuYW1lLCBpZ25vcmVkLlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGZvbnRzICovCisgICAgYXNzX3NldF9mb250cyhhc3MtPnJlbmRlcmVyLCBOVUxMLCBOVUxMLCAxLCBOVUxMLCAxKTsKKworICAgIC8qIE9wZW4gZGVjb2RlciAqLworICAgIGRlY19jdHggPSBzdC0+Y29kZWM7CisgICAgZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoZGVjX2N0eC0+Y29kZWNfaWQpOworICAgIGlmICghZGVjKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBmaW5kIHN1YnRpdGxlIGNvZGVjICVzXG4iLAorICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShkZWNfY3R4LT5jb2RlY19pZCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBkZWNfZGVzYyA9IGF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoZGVjX2N0eC0+Y29kZWNfaWQpOworICAgIGlmIChkZWNfZGVzYyAmJiAhKGRlY19kZXNjLT5wcm9wcyAmIEFWX0NPREVDX1BST1BfVEVYVF9TVUIpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJPbmx5IHRleHQgYmFzZWQgc3VidGl0bGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAoYXNzLT5jaGFyZW5jKQorICAgICAgICBhdl9kaWN0X3NldCgmY29kZWNfb3B0cywgInN1Yl9jaGFyZW5jIiwgYXNzLT5jaGFyZW5jLCAwKTsKKyAgICByZXQgPSBhdmNvZGVjX29wZW4yKGRlY19jdHgsIGRlYywgJmNvZGVjX29wdHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIC8qIERlY29kZSBzdWJ0aXRsZXMgYW5kIHB1c2ggdGhlbSBpbnRvIHRoZSByZW5kZXJlciAobGliYXNzKSAqLworICAgIGlmIChkZWNfY3R4LT5zdWJ0aXRsZV9oZWFkZXIpCisgICAgICAgIGFzc19wcm9jZXNzX2NvZGVjX3ByaXZhdGUoYXNzLT50cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNfY3R4LT5zdWJ0aXRsZV9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjX2N0eC0+c3VidGl0bGVfaGVhZGVyX3NpemUpOworICAgIGF2X2luaXRfcGFja2V0KCZwa3QpOworICAgIHBrdC5kYXRhID0gTlVMTDsKKyAgICBwa3Quc2l6ZSA9IDA7CisgICAgd2hpbGUgKGF2X3JlYWRfZnJhbWUoZm10LCAmcGt0KSA+PSAwKSB7CisgICAgICAgIGludCBpLCBnb3Rfc3VidGl0bGU7CisgICAgICAgIEFWU3VidGl0bGUgc3ViID0gezB9OworCisgICAgICAgIGlmIChwa3Quc3RyZWFtX2luZGV4ID09IHNpZCkgeworICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfc3VidGl0bGUyKGRlY19jdHgsICZzdWIsICZnb3Rfc3VidGl0bGUsICZwa3QpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIkVycm9yIGRlY29kaW5nOiAlcyAoaWdub3JlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGdvdF9zdWJ0aXRsZSkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdWIubnVtX3JlY3RzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqYXNzX2xpbmUgPSBzdWIucmVjdHNbaV0tPmFzczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhc3NfbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBhc3NfcHJvY2Vzc19kYXRhKGFzcy0+dHJhY2ssIGFzc19saW5lLCBzdHJsZW4oYXNzX2xpbmUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZV9wYWNrZXQoJnBrdCk7CisgICAgICAgIGF2c3VidGl0bGVfZnJlZSgmc3ViKTsKKyAgICB9CisKK2VuZDoKKyAgICBhdl9kaWN0X2ZyZWUoJmNvZGVjX29wdHMpOworICAgIGlmIChkZWNfY3R4KQorICAgICAgICBhdmNvZGVjX2Nsb3NlKGRlY19jdHgpOworICAgIGlmIChmbXQpCisgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZmbXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK0FWRmlsdGVyIGZmX3ZmX3N1YnRpdGxlcyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJzdWJ0aXRsZXMiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlbmRlciB0ZXh0IHN1YnRpdGxlcyBvbnRvIGlucHV0IHZpZGVvIHVzaW5nIHRoZSBsaWJhc3MgbGlicmFyeS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihBc3NDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXRfc3VidGl0bGVzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGFzc19pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhc3Nfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZzdWJ0aXRsZXNfY2xhc3MsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfc3VwZXIyeHNhaS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3N1cGVyMnhzYWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODZkYWMxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3N1cGVyMnhzYWkuYwpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBOaWVsIHZhbiBkZXIgV2VzdGh1aXplbiA8bmllbGtpZUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgQSdycGkKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAxIFpTTkVTIFRlYW0gKCB6c2tuaWdodEB6c25lcy5jb20gLyBfZGVtb19AenNuZXMuY29tICkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTdXBlciAyeFNhSSB2aWRlbyBmaWx0ZXIKKyAqIFBvcnRlZCBmcm9tIE1QbGF5ZXIgbGlibXBjb2RlY3MvdmZfMnhzYWkuYy4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogbWFza3MgdXNlZCBmb3IgdHdvIHBpeGVscyBpbnRlcnBvbGF0aW9uICovCisgICAgdWludDMyX3QgaGlfcGl4ZWxfbWFzazsKKyAgICB1aW50MzJfdCBsb19waXhlbF9tYXNrOworCisgICAgLyogbWFza3MgdXNlZCBmb3IgZm91ciBwaXhlbHMgaW50ZXJwb2xhdGlvbiAqLworICAgIHVpbnQzMl90IHFfaGlfcGl4ZWxfbWFzazsKKyAgICB1aW50MzJfdCBxX2xvX3BpeGVsX21hc2s7CisKKyAgICBpbnQgYnBwOyAvLy88IGJ5dGVzIHBlciBwaXhlbCwgcGl4ZWwgc3RyaWRlIGZvciBlYWNoIChwYWNrZWQpIHBpeGVsCisgICAgaW50IGlzX2JlOworfSBTdXBlcjJ4U2FJQ29udGV4dDsKKworI2RlZmluZSBHRVRfUkVTVUxUKEEsIEIsIEMsIEQpICgoQSAhPSBDIHx8IEEgIT0gRCkgLSAoQiAhPSBDIHx8IEIgIT0gRCkpCisKKyNkZWZpbmUgSU5URVJQT0xBVEUoQSwgQikgKCgoQSAmIGhpX3BpeGVsX21hc2spID4+IDEpICsgKChCICYgaGlfcGl4ZWxfbWFzaykgPj4gMSkgKyAoQSAmIEIgJiBsb19waXhlbF9tYXNrKSkKKworI2RlZmluZSBRX0lOVEVSUE9MQVRFKEEsIEIsIEMsIEQpICgoQSAmIHFfaGlfcGl4ZWxfbWFzaykgPj4gMikgKyAoKEIgJiBxX2hpX3BpeGVsX21hc2spID4+IDIpICsgKChDICYgcV9oaV9waXhlbF9tYXNrKSA+PiAyKSArICgoRCAmIHFfaGlfcGl4ZWxfbWFzaykgPj4gMikgXAorICAgICsgKCgoKEEgJiBxX2xvX3BpeGVsX21hc2spICsgKEIgJiBxX2xvX3BpeGVsX21hc2spICsgKEMgJiBxX2xvX3BpeGVsX21hc2spICsgKEQgJiBxX2xvX3BpeGVsX21hc2spKSA+PiAyKSAmIHFfbG9fcGl4ZWxfbWFzaykKKworc3RhdGljIHZvaWQgc3VwZXIyeHNhaShBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBTdXBlcjJ4U2FJQ29udGV4dCAqc2FpID0gY3R4LT5wcml2OworICAgIHVuc2lnbmVkIGludCB4LCB5OworICAgIHVpbnQzMl90IGNvbG9yWzRdWzRdOworICAgIHVuc2lnbmVkIGNoYXIgKnNyY19saW5lWzRdOworICAgIGNvbnN0IGludCBicHAgPSBzYWktPmJwcDsKKyAgICBjb25zdCB1aW50MzJfdCBoaV9waXhlbF9tYXNrID0gc2FpLT5oaV9waXhlbF9tYXNrOworICAgIGNvbnN0IHVpbnQzMl90IGxvX3BpeGVsX21hc2sgPSBzYWktPmxvX3BpeGVsX21hc2s7CisgICAgY29uc3QgdWludDMyX3QgcV9oaV9waXhlbF9tYXNrID0gc2FpLT5xX2hpX3BpeGVsX21hc2s7CisgICAgY29uc3QgdWludDMyX3QgcV9sb19waXhlbF9tYXNrID0gc2FpLT5xX2xvX3BpeGVsX21hc2s7CisKKyAgICAvKiBQb2ludCB0byB0aGUgZmlyc3QgNCBsaW5lcywgZmlyc3QgbGluZSBpcyBkdXBsaWNhdGVkICovCisgICAgc3JjX2xpbmVbMF0gPSBzcmM7CisgICAgc3JjX2xpbmVbMV0gPSBzcmM7CisgICAgc3JjX2xpbmVbMl0gPSBzcmMgKyBzcmNfbGluZXNpemUqRkZNSU4oMSwgaGVpZ2h0LTEpOworICAgIHNyY19saW5lWzNdID0gc3JjICsgc3JjX2xpbmVzaXplKkZGTUlOKDIsIGhlaWdodC0xKTsKKworI2RlZmluZSBSRUFEX0NPTE9SNChkc3QsIHNyY19saW5lLCBvZmYpIGRzdCA9ICooKGNvbnN0IHVpbnQzMl90ICopc3JjX2xpbmUgKyBvZmYpCisjZGVmaW5lIFJFQURfQ09MT1IzKGRzdCwgc3JjX2xpbmUsIG9mZikgZHN0ID0gQVZfUkwyNCAoc3JjX2xpbmUgKyAzKm9mZikKKyNkZWZpbmUgUkVBRF9DT0xPUjIoZHN0LCBzcmNfbGluZSwgb2ZmKSBkc3QgPSBzYWktPmlzX2JlID8gQVZfUkIxNihzcmNfbGluZSArIDIgKiBvZmYpIDogQVZfUkwxNihzcmNfbGluZSArIDIgKiBvZmYpCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgdWludDhfdCAqZHN0X2xpbmVbMl07CisKKyAgICAgICAgZHN0X2xpbmVbMF0gPSBkc3QgKyBkc3RfbGluZXNpemUqMip5OworICAgICAgICBkc3RfbGluZVsxXSA9IGRzdCArIGRzdF9saW5lc2l6ZSooMip5KzEpOworCisgICAgICAgIHN3aXRjaCAoYnBwKSB7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIFJFQURfQ09MT1I0KGNvbG9yWzBdWzBdLCBzcmNfbGluZVswXSwgMCk7IGNvbG9yWzBdWzFdID0gY29sb3JbMF1bMF07IFJFQURfQ09MT1I0KGNvbG9yWzBdWzJdLCBzcmNfbGluZVswXSwgMSk7IFJFQURfQ09MT1I0KGNvbG9yWzBdWzNdLCBzcmNfbGluZVswXSwgMik7CisgICAgICAgICAgICBSRUFEX0NPTE9SNChjb2xvclsxXVswXSwgc3JjX2xpbmVbMV0sIDApOyBjb2xvclsxXVsxXSA9IGNvbG9yWzFdWzBdOyBSRUFEX0NPTE9SNChjb2xvclsxXVsyXSwgc3JjX2xpbmVbMV0sIDEpOyBSRUFEX0NPTE9SNChjb2xvclsxXVszXSwgc3JjX2xpbmVbMV0sIDIpOworICAgICAgICAgICAgUkVBRF9DT0xPUjQoY29sb3JbMl1bMF0sIHNyY19saW5lWzJdLCAwKTsgY29sb3JbMl1bMV0gPSBjb2xvclsyXVswXTsgUkVBRF9DT0xPUjQoY29sb3JbMl1bMl0sIHNyY19saW5lWzJdLCAxKTsgUkVBRF9DT0xPUjQoY29sb3JbMl1bM10sIHNyY19saW5lWzJdLCAyKTsKKyAgICAgICAgICAgIFJFQURfQ09MT1I0KGNvbG9yWzNdWzBdLCBzcmNfbGluZVszXSwgMCk7IGNvbG9yWzNdWzFdID0gY29sb3JbM11bMF07IFJFQURfQ09MT1I0KGNvbG9yWzNdWzJdLCBzcmNfbGluZVszXSwgMSk7IFJFQURfQ09MT1I0KGNvbG9yWzNdWzNdLCBzcmNfbGluZVszXSwgMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgUkVBRF9DT0xPUjMoY29sb3JbMF1bMF0sIHNyY19saW5lWzBdLCAwKTsgY29sb3JbMF1bMV0gPSBjb2xvclswXVswXTsgUkVBRF9DT0xPUjMoY29sb3JbMF1bMl0sIHNyY19saW5lWzBdLCAxKTsgUkVBRF9DT0xPUjMoY29sb3JbMF1bM10sIHNyY19saW5lWzBdLCAyKTsKKyAgICAgICAgICAgIFJFQURfQ09MT1IzKGNvbG9yWzFdWzBdLCBzcmNfbGluZVsxXSwgMCk7IGNvbG9yWzFdWzFdID0gY29sb3JbMV1bMF07IFJFQURfQ09MT1IzKGNvbG9yWzFdWzJdLCBzcmNfbGluZVsxXSwgMSk7IFJFQURfQ09MT1IzKGNvbG9yWzFdWzNdLCBzcmNfbGluZVsxXSwgMik7CisgICAgICAgICAgICBSRUFEX0NPTE9SMyhjb2xvclsyXVswXSwgc3JjX2xpbmVbMl0sIDApOyBjb2xvclsyXVsxXSA9IGNvbG9yWzJdWzBdOyBSRUFEX0NPTE9SMyhjb2xvclsyXVsyXSwgc3JjX2xpbmVbMl0sIDEpOyBSRUFEX0NPTE9SMyhjb2xvclsyXVszXSwgc3JjX2xpbmVbMl0sIDIpOworICAgICAgICAgICAgUkVBRF9DT0xPUjMoY29sb3JbM11bMF0sIHNyY19saW5lWzNdLCAwKTsgY29sb3JbM11bMV0gPSBjb2xvclszXVswXTsgUkVBRF9DT0xPUjMoY29sb3JbM11bMl0sIHNyY19saW5lWzNdLCAxKTsgUkVBRF9DT0xPUjMoY29sb3JbM11bM10sIHNyY19saW5lWzNdLCAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUkVBRF9DT0xPUjIoY29sb3JbMF1bMF0sIHNyY19saW5lWzBdLCAwKTsgY29sb3JbMF1bMV0gPSBjb2xvclswXVswXTsgUkVBRF9DT0xPUjIoY29sb3JbMF1bMl0sIHNyY19saW5lWzBdLCAxKTsgUkVBRF9DT0xPUjIoY29sb3JbMF1bM10sIHNyY19saW5lWzBdLCAyKTsKKyAgICAgICAgICAgIFJFQURfQ09MT1IyKGNvbG9yWzFdWzBdLCBzcmNfbGluZVsxXSwgMCk7IGNvbG9yWzFdWzFdID0gY29sb3JbMV1bMF07IFJFQURfQ09MT1IyKGNvbG9yWzFdWzJdLCBzcmNfbGluZVsxXSwgMSk7IFJFQURfQ09MT1IyKGNvbG9yWzFdWzNdLCBzcmNfbGluZVsxXSwgMik7CisgICAgICAgICAgICBSRUFEX0NPTE9SMihjb2xvclsyXVswXSwgc3JjX2xpbmVbMl0sIDApOyBjb2xvclsyXVsxXSA9IGNvbG9yWzJdWzBdOyBSRUFEX0NPTE9SMihjb2xvclsyXVsyXSwgc3JjX2xpbmVbMl0sIDEpOyBSRUFEX0NPTE9SMihjb2xvclsyXVszXSwgc3JjX2xpbmVbMl0sIDIpOworICAgICAgICAgICAgUkVBRF9DT0xPUjIoY29sb3JbM11bMF0sIHNyY19saW5lWzNdLCAwKTsgY29sb3JbM11bMV0gPSBjb2xvclszXVswXTsgUkVBRF9DT0xPUjIoY29sb3JbM11bMl0sIHNyY19saW5lWzNdLCAxKTsgUkVBRF9DT0xPUjIoY29sb3JbM11bM10sIHNyY19saW5lWzNdLCAyKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBwcm9kdWN0MWEsIHByb2R1Y3QxYiwgcHJvZHVjdDJhLCBwcm9kdWN0MmI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBCMCBCMSBCMiBCMyAgICAwICAxICAyICAzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgNSogNiAgUzIgLT4gNCAgNSogNiAgNworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIDIgIDMgIFMxICAgIDggIDkgMTAgMTEKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMCBBMSBBMiBBMyAgIDEyIDEzIDE0IDE1CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBpZiAoY29sb3JbMl1bMV0gPT0gY29sb3JbMV1bMl0gJiYgY29sb3JbMV1bMV0gIT0gY29sb3JbMl1bMl0pIHsKKyAgICAgICAgICAgICAgICBwcm9kdWN0MmIgPSBjb2xvclsyXVsxXTsKKyAgICAgICAgICAgICAgICBwcm9kdWN0MWIgPSBwcm9kdWN0MmI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbG9yWzFdWzFdID09IGNvbG9yWzJdWzJdICYmIGNvbG9yWzJdWzFdICE9IGNvbG9yWzFdWzJdKSB7CisgICAgICAgICAgICAgICAgcHJvZHVjdDJiID0gY29sb3JbMV1bMV07CisgICAgICAgICAgICAgICAgcHJvZHVjdDFiID0gcHJvZHVjdDJiOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xvclsxXVsxXSA9PSBjb2xvclsyXVsyXSAmJiBjb2xvclsyXVsxXSA9PSBjb2xvclsxXVsyXSkgeworICAgICAgICAgICAgICAgIGludCByID0gMDsKKworICAgICAgICAgICAgICAgIHIgKz0gR0VUX1JFU1VMVChjb2xvclsxXVsyXSwgY29sb3JbMV1bMV0sIGNvbG9yWzFdWzBdLCBjb2xvclszXVsxXSk7CisgICAgICAgICAgICAgICAgciArPSBHRVRfUkVTVUxUKGNvbG9yWzFdWzJdLCBjb2xvclsxXVsxXSwgY29sb3JbMl1bMF0sIGNvbG9yWzBdWzFdKTsKKyAgICAgICAgICAgICAgICByICs9IEdFVF9SRVNVTFQoY29sb3JbMV1bMl0sIGNvbG9yWzFdWzFdLCBjb2xvclszXVsyXSwgY29sb3JbMl1bM10pOworICAgICAgICAgICAgICAgIHIgKz0gR0VUX1JFU1VMVChjb2xvclsxXVsyXSwgY29sb3JbMV1bMV0sIGNvbG9yWzBdWzJdLCBjb2xvclsxXVszXSk7CisKKyAgICAgICAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QxYiA9IGNvbG9yWzFdWzJdOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHIgPCAwKQorICAgICAgICAgICAgICAgICAgICBwcm9kdWN0MWIgPSBjb2xvclsxXVsxXTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QxYiA9IElOVEVSUE9MQVRFKGNvbG9yWzFdWzFdLCBjb2xvclsxXVsyXSk7CisKKyAgICAgICAgICAgICAgICBwcm9kdWN0MmIgPSBwcm9kdWN0MWI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjb2xvclsxXVsyXSA9PSBjb2xvclsyXVsyXSAmJiBjb2xvclsyXVsyXSA9PSBjb2xvclszXVsxXSAmJiBjb2xvclsyXVsxXSAhPSBjb2xvclszXVsyXSAmJiBjb2xvclsyXVsyXSAhPSBjb2xvclszXVswXSkKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdDJiID0gUV9JTlRFUlBPTEFURShjb2xvclsyXVsyXSwgY29sb3JbMl1bMl0sIGNvbG9yWzJdWzJdLCBjb2xvclsyXVsxXSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sb3JbMV1bMV0gPT0gY29sb3JbMl1bMV0gJiYgY29sb3JbMl1bMV0gPT0gY29sb3JbM11bMl0gJiYgY29sb3JbM11bMV0gIT0gY29sb3JbMl1bMl0gJiYgY29sb3JbMl1bMV0gIT0gY29sb3JbM11bM10pCisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QyYiA9IFFfSU5URVJQT0xBVEUoY29sb3JbMl1bMV0sIGNvbG9yWzJdWzFdLCBjb2xvclsyXVsxXSwgY29sb3JbMl1bMl0pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdDJiID0gSU5URVJQT0xBVEUoY29sb3JbMl1bMV0sIGNvbG9yWzJdWzJdKTsKKworICAgICAgICAgICAgICAgIGlmIChjb2xvclsxXVsyXSA9PSBjb2xvclsyXVsyXSAmJiBjb2xvclsxXVsyXSA9PSBjb2xvclswXVsxXSAmJiBjb2xvclsxXVsxXSAhPSBjb2xvclswXVsyXSAmJiBjb2xvclsxXVsyXSAhPSBjb2xvclswXVswXSkKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdDFiID0gUV9JTlRFUlBPTEFURShjb2xvclsxXVsyXSwgY29sb3JbMV1bMl0sIGNvbG9yWzFdWzJdLCBjb2xvclsxXVsxXSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sb3JbMV1bMV0gPT0gY29sb3JbMl1bMV0gJiYgY29sb3JbMV1bMV0gPT0gY29sb3JbMF1bMl0gJiYgY29sb3JbMF1bMV0gIT0gY29sb3JbMV1bMl0gJiYgY29sb3JbMV1bMV0gIT0gY29sb3JbMF1bM10pCisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QxYiA9IFFfSU5URVJQT0xBVEUoY29sb3JbMV1bMl0sIGNvbG9yWzFdWzFdLCBjb2xvclsxXVsxXSwgY29sb3JbMV1bMV0pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdDFiID0gSU5URVJQT0xBVEUoY29sb3JbMV1bMV0sIGNvbG9yWzFdWzJdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbG9yWzFdWzFdID09IGNvbG9yWzJdWzJdICYmIGNvbG9yWzJdWzFdICE9IGNvbG9yWzFdWzJdICYmIGNvbG9yWzFdWzBdID09IGNvbG9yWzFdWzFdICYmIGNvbG9yWzFdWzFdICE9IGNvbG9yWzNdWzJdKQorICAgICAgICAgICAgICAgIHByb2R1Y3QyYSA9IElOVEVSUE9MQVRFKGNvbG9yWzJdWzFdLCBjb2xvclsxXVsxXSk7CisgICAgICAgICAgICBlbHNlIGlmIChjb2xvclsxXVsxXSA9PSBjb2xvclsyXVswXSAmJiBjb2xvclsxXVsyXSA9PSBjb2xvclsxXVsxXSAmJiBjb2xvclsxXVswXSAhPSBjb2xvclsyXVsxXSAmJiBjb2xvclsxXVsxXSAhPSBjb2xvclszXVswXSkKKyAgICAgICAgICAgICAgICBwcm9kdWN0MmEgPSBJTlRFUlBPTEFURShjb2xvclsyXVsxXSwgY29sb3JbMV1bMV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByb2R1Y3QyYSA9IGNvbG9yWzJdWzFdOworCisgICAgICAgICAgICBpZiAoY29sb3JbMl1bMV0gPT0gY29sb3JbMV1bMl0gJiYgY29sb3JbMV1bMV0gIT0gY29sb3JbMl1bMl0gJiYgY29sb3JbMl1bMF0gPT0gY29sb3JbMl1bMV0gJiYgY29sb3JbMl1bMV0gIT0gY29sb3JbMF1bMl0pCisgICAgICAgICAgICAgICAgcHJvZHVjdDFhID0gSU5URVJQT0xBVEUoY29sb3JbMl1bMV0sIGNvbG9yWzFdWzFdKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNvbG9yWzFdWzBdID09IGNvbG9yWzJdWzFdICYmIGNvbG9yWzJdWzJdID09IGNvbG9yWzJdWzFdICYmIGNvbG9yWzJdWzBdICE9IGNvbG9yWzFdWzFdICYmIGNvbG9yWzJdWzFdICE9IGNvbG9yWzBdWzBdKQorICAgICAgICAgICAgICAgIHByb2R1Y3QxYSA9IElOVEVSUE9MQVRFKGNvbG9yWzJdWzFdLCBjb2xvclsxXVsxXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJvZHVjdDFhID0gY29sb3JbMV1bMV07CisKKyAgICAgICAgICAgIC8qIFNldCB0aGUgY2FsY3VsYXRlZCBwaXhlbHMgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoYnBwKSB7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgQVZfV04zMkEoZHN0X2xpbmVbMF0gKyB4ICogOCwgICAgIHByb2R1Y3QxYSk7CisgICAgICAgICAgICAgICAgQVZfV04zMkEoZHN0X2xpbmVbMF0gKyB4ICogOCArIDQsIHByb2R1Y3QxYik7CisgICAgICAgICAgICAgICAgQVZfV04zMkEoZHN0X2xpbmVbMV0gKyB4ICogOCwgICAgIHByb2R1Y3QyYSk7CisgICAgICAgICAgICAgICAgQVZfV04zMkEoZHN0X2xpbmVbMV0gKyB4ICogOCArIDQsIHByb2R1Y3QyYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgQVZfV0wyNChkc3RfbGluZVswXSArIHggKiA2LCAgICAgcHJvZHVjdDFhKTsKKyAgICAgICAgICAgICAgICBBVl9XTDI0KGRzdF9saW5lWzBdICsgeCAqIDYgKyAzLCBwcm9kdWN0MWIpOworICAgICAgICAgICAgICAgIEFWX1dMMjQoZHN0X2xpbmVbMV0gKyB4ICogNiwgICAgIHByb2R1Y3QyYSk7CisgICAgICAgICAgICAgICAgQVZfV0wyNChkc3RfbGluZVsxXSArIHggKiA2ICsgMywgcHJvZHVjdDJiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIGJwcCA9IDIKKyAgICAgICAgICAgICAgICBpZiAoc2FpLT5pc19iZSkgeworICAgICAgICAgICAgICAgICAgICBBVl9XQjMyKGRzdF9saW5lWzBdICsgeCAqIDQsIHByb2R1Y3QxYSB8IChwcm9kdWN0MWIgPDwgMTYpKTsKKyAgICAgICAgICAgICAgICAgICAgQVZfV0IzMihkc3RfbGluZVsxXSArIHggKiA0LCBwcm9kdWN0MmEgfCAocHJvZHVjdDJiIDw8IDE2KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfV0wzMihkc3RfbGluZVswXSArIHggKiA0LCBwcm9kdWN0MWEgfCAocHJvZHVjdDFiIDw8IDE2KSk7CisgICAgICAgICAgICAgICAgICAgIEFWX1dMMzIoZHN0X2xpbmVbMV0gKyB4ICogNCwgcHJvZHVjdDJhIHwgKHByb2R1Y3QyYiA8PCAxNikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTW92ZSBjb2xvciBtYXRyaXggZm9yd2FyZCAqLworICAgICAgICAgICAgY29sb3JbMF1bMF0gPSBjb2xvclswXVsxXTsgY29sb3JbMF1bMV0gPSBjb2xvclswXVsyXTsgY29sb3JbMF1bMl0gPSBjb2xvclswXVszXTsKKyAgICAgICAgICAgIGNvbG9yWzFdWzBdID0gY29sb3JbMV1bMV07IGNvbG9yWzFdWzFdID0gY29sb3JbMV1bMl07IGNvbG9yWzFdWzJdID0gY29sb3JbMV1bM107CisgICAgICAgICAgICBjb2xvclsyXVswXSA9IGNvbG9yWzJdWzFdOyBjb2xvclsyXVsxXSA9IGNvbG9yWzJdWzJdOyBjb2xvclsyXVsyXSA9IGNvbG9yWzJdWzNdOworICAgICAgICAgICAgY29sb3JbM11bMF0gPSBjb2xvclszXVsxXTsgY29sb3JbM11bMV0gPSBjb2xvclszXVsyXTsgY29sb3JbM11bMl0gPSBjb2xvclszXVszXTsKKworICAgICAgICAgICAgaWYgKHggPCB3aWR0aCAtIDMpIHsKKyAgICAgICAgICAgICAgICB4ICs9IDM7CisgICAgICAgICAgICAgICAgc3dpdGNoIChicHApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIFJFQURfQ09MT1I0KGNvbG9yWzBdWzNdLCBzcmNfbGluZVswXSwgeCk7CisgICAgICAgICAgICAgICAgICAgIFJFQURfQ09MT1I0KGNvbG9yWzFdWzNdLCBzcmNfbGluZVsxXSwgeCk7CisgICAgICAgICAgICAgICAgICAgIFJFQURfQ09MT1I0KGNvbG9yWzJdWzNdLCBzcmNfbGluZVsyXSwgeCk7CisgICAgICAgICAgICAgICAgICAgIFJFQURfQ09MT1I0KGNvbG9yWzNdWzNdLCBzcmNfbGluZVszXSwgeCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgUkVBRF9DT0xPUjMoY29sb3JbMF1bM10sIHNyY19saW5lWzBdLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgUkVBRF9DT0xPUjMoY29sb3JbMV1bM10sIHNyY19saW5lWzFdLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgUkVBRF9DT0xPUjMoY29sb3JbMl1bM10sIHNyY19saW5lWzJdLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgUkVBRF9DT0xPUjMoY29sb3JbM11bM10sIHNyY19saW5lWzNdLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgIC8qIGNhc2UgMiAqLworICAgICAgICAgICAgICAgICAgICBSRUFEX0NPTE9SMihjb2xvclswXVszXSwgc3JjX2xpbmVbMF0sIHgpOworICAgICAgICAgICAgICAgICAgICBSRUFEX0NPTE9SMihjb2xvclsxXVszXSwgc3JjX2xpbmVbMV0sIHgpOworICAgICAgICAgICAgICAgICAgICBSRUFEX0NPTE9SMihjb2xvclsyXVszXSwgc3JjX2xpbmVbMl0sIHgpOworICAgICAgICAgICAgICAgICAgICBSRUFEX0NPTE9SMihjb2xvclszXVszXSwgc3JjX2xpbmVbM10sIHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4IC09IDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSdyZSBkb25lIHdpdGggb25lIGxpbmUsIHNvIHdlIHNoaWZ0IHRoZSBzb3VyY2UgbGluZXMgdXAgKi8KKyAgICAgICAgc3JjX2xpbmVbMF0gPSBzcmNfbGluZVsxXTsKKyAgICAgICAgc3JjX2xpbmVbMV0gPSBzcmNfbGluZVsyXTsKKyAgICAgICAgc3JjX2xpbmVbMl0gPSBzcmNfbGluZVszXTsKKworICAgICAgICAvKiBSZWFkIG5leHQgbGluZSAqLworICAgICAgICBzcmNfbGluZVszXSA9IHNyY19saW5lWzJdOworICAgICAgICBpZiAoeSA8IGhlaWdodCAtIDMpCisgICAgICAgICAgICBzcmNfbGluZVszXSArPSBzcmNfbGluZXNpemU7CisgICAgfSAvLyB5IGxvb3AKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9SR0JBLCBBVl9QSVhfRk1UX0JHUkEsIEFWX1BJWF9GTVRfQVJHQiwgQVZfUElYX0ZNVF9BQkdSLAorICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX0JHUjI0LAorICAgICAgICBBVl9QSVhfRk1UX1JHQjU2NUJFLCBBVl9QSVhfRk1UX0JHUjU2NUJFLCBBVl9QSVhfRk1UX1JHQjU1NUJFLCBBVl9QSVhfRk1UX0JHUjU1NUJFLAorICAgICAgICBBVl9QSVhfRk1UX1JHQjU2NUxFLCBBVl9QSVhfRk1UX0JHUjU2NUxFLCBBVl9QSVhfRk1UX1JHQjU1NUxFLCBBVl9QSVhfRk1UX0JHUjU1NUxFLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBTdXBlcjJ4U2FJQ29udGV4dCAqc2FpID0gaW5saW5rLT5kc3QtPnByaXY7CisKKyAgICBzYWktPmhpX3BpeGVsX21hc2sgICA9IDB4RkVGRUZFRkU7CisgICAgc2FpLT5sb19waXhlbF9tYXNrICAgPSAweDAxMDEwMTAxOworICAgIHNhaS0+cV9oaV9waXhlbF9tYXNrID0gMHhGQ0ZDRkNGQzsKKyAgICBzYWktPnFfbG9fcGl4ZWxfbWFzayA9IDB4MDMwMzAzMDM7CisgICAgc2FpLT5icHAgID0gNDsKKworICAgIHN3aXRjaCAoaW5saW5rLT5mb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorICAgICAgICBzYWktPmJwcCA9IDM7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU2NUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I1NjVCRToKKyAgICAgICAgc2FpLT5pc19iZSA9IDE7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU2NUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I1NjVMRToKKyAgICAgICAgc2FpLT5oaV9waXhlbF9tYXNrICAgPSAweEY3REVGN0RFOworICAgICAgICBzYWktPmxvX3BpeGVsX21hc2sgICA9IDB4MDgyMTA4MjE7CisgICAgICAgIHNhaS0+cV9oaV9waXhlbF9tYXNrID0gMHhFNzlDRTc5QzsKKyAgICAgICAgc2FpLT5xX2xvX3BpeGVsX21hc2sgPSAweDE4NjMxODYzOworICAgICAgICBzYWktPmJwcCA9IDI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjU1NUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NTVCRToKKyAgICAgICAgc2FpLT5pc19iZSA9IDE7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjU1NUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NTVMRToKKyAgICAgICAgc2FpLT5oaV9waXhlbF9tYXNrICAgPSAweDdCREU3QkRFOworICAgICAgICBzYWktPmxvX3BpeGVsX21hc2sgICA9IDB4MDQyMTA0MjE7CisgICAgICAgIHNhaS0+cV9oaV9waXhlbF9tYXNrID0gMHg3MzlDNzM5QzsKKyAgICAgICAgc2FpLT5xX2xvX3BpeGVsX21hc2sgPSAweDBDNjMwQzYzOworICAgICAgICBzYWktPmJwcCA9IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisKKyAgICBvdXRsaW5rLT53ID0gaW5saW5rLT53KjI7CisgICAgb3V0bGluay0+aCA9IGlubGluay0+aCoyOworCisgICAgYXZfbG9nKGlubGluay0+ZHN0LCBBVl9MT0dfVkVSQk9TRSwgImZtdDolcyBzaXplOiVkeCVkIC0+IHNpemU6JWR4JWRcbiIsCisgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoaW5saW5rLT5mb3JtYXQpLAorICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCwgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucGljcmVmKQoreworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dHBpY3JlZiA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXRwaWNyZWYpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5waWNyZWYpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHBpY3JlZiwgaW5waWNyZWYpOworICAgIG91dHBpY3JlZi0+d2lkdGggID0gb3V0bGluay0+dzsKKyAgICBvdXRwaWNyZWYtPmhlaWdodCA9IG91dGxpbmstPmg7CisKKyAgICBzdXBlcjJ4c2FpKGlubGluay0+ZHN0LCBpbnBpY3JlZi0+ZGF0YVswXSwgaW5waWNyZWYtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgb3V0cGljcmVmLT5kYXRhWzBdLCBvdXRwaWNyZWYtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgaW5saW5rLT53LCBpbmxpbmstPmgpOworCisgICAgYXZfZnJhbWVfZnJlZSgmaW5waWNyZWYpOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0cGljcmVmKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHN1cGVyMnhzYWlfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzdXBlcjJ4c2FpX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3N1cGVyMnhzYWkgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAic3VwZXIyeHNhaSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2NhbGUgdGhlIGlucHV0IGJ5IDJ4IHVzaW5nIHRoZSBTdXBlcjJ4U2FJIHBpeGVsIGFydCBhbGdvcml0aG0uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoU3VwZXIyeFNhSUNvbnRleHQpLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IHN1cGVyMnhzYWlfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gc3VwZXIyeHNhaV9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zd2FwdXYuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl9zd2FwdXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzVlMzljCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3N3YXB1di5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHN3YXAgVVYgZmlsdGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCitzdGF0aWMgdm9pZCBkb19zd2FwKEFWRnJhbWUgKmZyYW1lKQoreworICAgIEZGU1dBUCh1aW50OF90KiwgICAgIGZyYW1lLT5kYXRhWzFdLCAgICAgZnJhbWUtPmRhdGFbMl0pOworICAgIEZGU1dBUChpbnQsICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVsxXSwgZnJhbWUtPmxpbmVzaXplWzJdKTsKKyAgICBGRlNXQVAodWludDY0X3QsICAgICBmcmFtZS0+ZXJyb3JbMV0sICAgIGZyYW1lLT5lcnJvclsyXSk7CisgICAgRkZTV0FQKEFWQnVmZmVyUmVmKiwgZnJhbWUtPmJ1ZlsxXSwgICAgICBmcmFtZS0+YnVmWzJdKTsKK30KKworc3RhdGljIEFWRnJhbWUgKmdldF92aWRlb19idWZmZXIoQVZGaWx0ZXJMaW5rICpsaW5rLCBpbnQgdywgaW50IGgpCit7CisgICAgQVZGcmFtZSAqcGljcmVmID0gZmZfZGVmYXVsdF9nZXRfdmlkZW9fYnVmZmVyKGxpbmssIHcsIGgpOworICAgIGRvX3N3YXAocGljcmVmKTsKKyAgICByZXR1cm4gcGljcmVmOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmlucGljcmVmKQoreworICAgIGRvX3N3YXAoaW5waWNyZWYpOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUobGluay0+ZHN0LT5vdXRwdXRzWzBdLCBpbnBpY3JlZik7Cit9CisKK3N0YXRpYyBpbnQgaXNfcGxhbmFyX3l1dihjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoZGVzYy0+ZmxhZ3MgJiB+KEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEpIHx8CisgICAgICAgIGRlc2MtPm5iX2NvbXBvbmVudHMgPCAzIHx8CisgICAgICAgIChkZXNjLT5jb21wWzFdLmRlcHRoX21pbnVzMSAhPSBkZXNjLT5jb21wWzJdLmRlcHRoX21pbnVzMSkpCisgICAgICAgIHJldHVybiAwOworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5uYl9jb21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgaWYgKGRlc2MtPmNvbXBbaV0ub2Zmc2V0X3BsdXMxICE9IDEgfHwKKyAgICAgICAgICAgIGRlc2MtPmNvbXBbaV0uc2hpZnQgIT0gMCB8fAorICAgICAgICAgICAgZGVzYy0+Y29tcFtpXS5wbGFuZSAhPSBpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIGludCBmbXQ7CisKKyAgICBmb3IgKGZtdCA9IDA7IGF2X3BpeF9mbXRfZGVzY19nZXQoZm10KTsgZm10KyspIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChmbXQpOworICAgICAgICBpZiAoaXNfcGxhbmFyX3l1dihkZXNjKSkKKyAgICAgICAgICAgIGZmX2FkZF9mb3JtYXQoJmZvcm1hdHMsIGZtdCk7CisgICAgfQorCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzd2FwdXZfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5nZXRfdmlkZW9fYnVmZmVyID0gZ2V0X3ZpZGVvX2J1ZmZlciwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgICAgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHN3YXB1dl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfc3dhcHV2ID0geworICAgIC5uYW1lICAgICAgICAgID0gInN3YXB1diIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3dhcCBVIGFuZCBWIGNvbXBvbmVudHMuIiksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gc3dhcHV2X2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHN3YXB1dl9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl90ZWxlY2luZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3RlbGVjaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhNjNhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl90ZWxlY2luZS5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFJ1ZG9sZiBQb2x6ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZSB0ZWxlY2luZSBmaWx0ZXIsIGhlYXZpbHkgYmFzZWQgZnJvbSBtcHYtcGxheWVyOlRPT0xTL3ZmX2Rsb3Blbi90ZWxlY2luZS5jIGJ5CisgKiBSdWRvbGYgUG9semVyLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgZmlyc3RfZmllbGQ7CisgICAgY2hhciAqcGF0dGVybjsKKyAgICB1bnNpZ25lZCBpbnQgcGF0dGVybl9wb3M7CisKKyAgICBBVlJhdGlvbmFsIHB0czsKKyAgICBkb3VibGUgdHNfdW5pdDsKKyAgICBpbnQgb3V0X2NudDsKKyAgICBpbnQgb2NjdXBpZWQ7CisKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCBwbGFuZWhlaWdodFs0XTsKKyAgICBpbnQgc3RyaWRlWzRdOworCisgICAgQVZGcmFtZSAqZnJhbWVbNV07CisgICAgQVZGcmFtZSAqdGVtcDsKK30gVGVsZWNpbmVDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihUZWxlY2luZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdGVsZWNpbmVfb3B0aW9uc1tdID0geworICAgIHsiZmlyc3RfZmllbGQiLCAic2VsZWN0IGZpcnN0IGZpZWxkIiwgT0ZGU0VUKGZpcnN0X2ZpZWxkKSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0PTB9LCAwLCAxLCBGTEFHUywgImZpZWxkIn0sCisgICAgICAgIHsidG9wIiwgICAgInNlbGVjdCB0b3AgZmllbGQgZmlyc3QiLCAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sIDAsIDAsIEZMQUdTLCAiZmllbGQifSwKKyAgICAgICAgeyJ0IiwgICAgICAic2VsZWN0IHRvcCBmaWVsZCBmaXJzdCIsICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgRkxBR1MsICJmaWVsZCJ9LAorICAgICAgICB7ImJvdHRvbSIsICJzZWxlY3QgYm90dG9tIGZpZWxkIGZpcnN0IiwgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgImZpZWxkIn0sCisgICAgICAgIHsiYiIsICAgICAgInNlbGVjdCBib3R0b20gZmllbGQgZmlyc3QiLCAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MX0sIDAsIDAsIEZMQUdTLCAiZmllbGQifSwKKyAgICB7InBhdHRlcm4iLCAicGF0dGVybiB0aGF0IGRlc2NyaWJlIGZvciBob3cgbWFueSBmaWVsZHMgYSBmcmFtZSBpcyB0byBiZSBkaXNwbGF5ZWQiLCBPRkZTRVQocGF0dGVybiksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjIzIn0sIDAsIDAsIEZMQUdTfSwKKyAgICB7TlVMTH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyh0ZWxlY2luZSk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFRlbGVjaW5lQ29udGV4dCAqdGMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBpbnQgbWF4ID0gMDsKKworICAgIGlmICghc3RybGVuKHRjLT5wYXR0ZXJuKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJObyBwYXR0ZXJuIHByb3ZpZGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZvciAocCA9IHRjLT5wYXR0ZXJuOyAqcDsgcCsrKSB7CisgICAgICAgIGlmICghYXZfaXNkaWdpdCgqcCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlByb3ZpZGVkIHBhdHRlcm4gaW5jbHVkZXMgbm9uLW51bWVyaWMgY2hhcmFjdGVycy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBtYXggPSBGRk1BWCgqcCAtICcwJywgbWF4KTsKKyAgICAgICAgdGMtPnB0cy5udW0gKz0gMjsKKyAgICAgICAgdGMtPnB0cy5kZW4gKz0gKnAgLSAnMCc7CisgICAgfQorCisgICAgdGMtPm91dF9jbnQgPSAobWF4ICsgMSkgLyAyOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiVGVsZWNpbmUgcGF0dGVybiAlcyB5aWVsZHMgdXAgdG8gJWQgZnJhbWVzIHBlciBmcmFtZSwgcHRzIGFkdmFuY2UgZmFjdG9yOiAlZC8lZFxuIiwKKyAgICAgICAgICAgdGMtPnBhdHRlcm4sIHRjLT5vdXRfY250LCB0Yy0+cHRzLm51bSwgdGMtPnB0cy5kZW4pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKnBpeF9mbXRzID0gTlVMTDsKKyAgICBpbnQgZm10OworCisgICAgZm9yIChmbXQgPSAwOyBhdl9waXhfZm10X2Rlc2NfZ2V0KGZtdCk7IGZtdCsrKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZm10KTsKKyAgICAgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCB8fAorICAgICAgICAgICAgICBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgICAgIHx8CisgICAgICAgICAgICAgIGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JJVFNUUkVBTSkpCisgICAgICAgICAgICBmZl9hZGRfZm9ybWF0KCZwaXhfZm10cywgZm10KTsKKyAgICB9CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBwaXhfZm10cyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIFRlbGVjaW5lQ29udGV4dCAqdGMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBpbnQgaSwgcmV0OworCisgICAgdGMtPnRlbXAgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKGlubGluaywgaW5saW5rLT53LCBpbmxpbmstPmgpOworICAgIGlmICghdGMtPnRlbXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZm9yIChpID0gMDsgaSA8IHRjLT5vdXRfY250OyBpKyspIHsKKyAgICAgICAgdGMtPmZyYW1lW2ldID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihpbmxpbmssIGlubGluay0+dywgaW5saW5rLT5oKTsKKyAgICAgICAgaWYgKCF0Yy0+ZnJhbWVbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXModGMtPnN0cmlkZSwgaW5saW5rLT5mb3JtYXQsIGlubGluay0+dykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHRjLT5wbGFuZWhlaWdodFsxXSA9IHRjLT5wbGFuZWhlaWdodFsyXSA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwgZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgdGMtPnBsYW5laGVpZ2h0WzBdID0gdGMtPnBsYW5laGVpZ2h0WzNdID0gaW5saW5rLT5oOworCisgICAgdGMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIFRlbGVjaW5lQ29udGV4dCAqdGMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBBVlJhdGlvbmFsIGZwcyA9IGlubGluay0+ZnJhbWVfcmF0ZTsKKworICAgIGlmICghZnBzLm51bSB8fCAhZnBzLmRlbikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUaGUgaW5wdXQgbmVlZHMgYSBjb25zdGFudCBmcmFtZSByYXRlOyAiCisgICAgICAgICAgICAgICAiY3VycmVudCByYXRlIG9mICVkLyVkIGlzIGludmFsaWRcbiIsIGZwcy5udW0sIGZwcy5kZW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBmcHMgPSBhdl9tdWxfcShmcHMsIGF2X2ludl9xKHRjLT5wdHMpKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkZQUzogJWQvJWQgLT4gJWQvJWRcbiIsCisgICAgICAgICAgIGlubGluay0+ZnJhbWVfcmF0ZS5udW0sIGlubGluay0+ZnJhbWVfcmF0ZS5kZW4sIGZwcy5udW0sIGZwcy5kZW4pOworCisgICAgb3V0bGluay0+ZmxhZ3MgfD0gRkZfTElOS19GTEFHX1JFUVVFU1RfTE9PUDsKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gZnBzOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IGF2X211bF9xKGlubGluay0+dGltZV9iYXNlLCB0Yy0+cHRzKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlRCOiAlZC8lZCAtPiAlZC8lZFxuIiwKKyAgICAgICAgICAgaW5saW5rLT50aW1lX2Jhc2UubnVtLCBpbmxpbmstPnRpbWVfYmFzZS5kZW4sIG91dGxpbmstPnRpbWVfYmFzZS5udW0sIG91dGxpbmstPnRpbWVfYmFzZS5kZW4pOworCisgICAgdGMtPnRzX3VuaXQgPSBhdl9xMmQoYXZfaW52X3EoYXZfbXVsX3EoZnBzLCBvdXRsaW5rLT50aW1lX2Jhc2UpKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucGljcmVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIFRlbGVjaW5lQ29udGV4dCAqdGMgPSBjdHgtPnByaXY7CisgICAgaW50IGksIGxlbiwgcmV0ID0gMCwgbm91dCA9IDA7CisKKyAgICBsZW4gPSB0Yy0+cGF0dGVyblt0Yy0+cGF0dGVybl9wb3NdIC0gJzAnOworCisgICAgdGMtPnBhdHRlcm5fcG9zKys7CisgICAgaWYgKCF0Yy0+cGF0dGVyblt0Yy0+cGF0dGVybl9wb3NdKQorICAgICAgICB0Yy0+cGF0dGVybl9wb3MgPSAwOworCisgICAgaWYgKCFsZW4pIHsgLy8gZG8gbm90IG91dHB1dCBhbnkgZmllbGQgZnJvbSB0aGlzIGZyYW1lCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlucGljcmVmKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHRjLT5vY2N1cGllZCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGMtPm5iX3BsYW5lczsgaSsrKSB7CisgICAgICAgICAgICAvLyBmaWxsIGluIHRoZSBFQVJMSUVSIGZpZWxkIGZyb20gdGhlIGJ1ZmZlcmVkIHBpYworICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZSh0Yy0+ZnJhbWVbbm91dF0tPmRhdGFbaV0gKyB0Yy0+ZnJhbWVbbm91dF0tPmxpbmVzaXplW2ldICogdGMtPmZpcnN0X2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yy0+ZnJhbWVbbm91dF0tPmxpbmVzaXplW2ldICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMtPnRlbXAtPmRhdGFbaV0gKyB0Yy0+dGVtcC0+bGluZXNpemVbaV0gKiB0Yy0+Zmlyc3RfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLT50ZW1wLT5saW5lc2l6ZVtpXSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLT5zdHJpZGVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0Yy0+cGxhbmVoZWlnaHRbaV0gLSB0Yy0+Zmlyc3RfZmllbGQgKyAxKSAvIDIpOworICAgICAgICAgICAgLy8gZmlsbCBpbiB0aGUgTEFURVIgZmllbGQgZnJvbSB0aGUgbmV3IHBpYworICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZSh0Yy0+ZnJhbWVbbm91dF0tPmRhdGFbaV0gKyB0Yy0+ZnJhbWVbbm91dF0tPmxpbmVzaXplW2ldICogIXRjLT5maXJzdF9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMtPmZyYW1lW25vdXRdLT5saW5lc2l6ZVtpXSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucGljcmVmLT5kYXRhW2ldICsgaW5waWNyZWYtPmxpbmVzaXplW2ldICogIXRjLT5maXJzdF9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5waWNyZWYtPmxpbmVzaXplW2ldICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMtPnN0cmlkZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRjLT5wbGFuZWhlaWdodFtpXSAtICF0Yy0+Zmlyc3RfZmllbGQgKyAxKSAvIDIpOworICAgICAgICB9CisgICAgICAgIG5vdXQrKzsKKyAgICAgICAgbGVuLS07CisgICAgICAgIHRjLT5vY2N1cGllZCA9IDA7CisgICAgfQorCisgICAgd2hpbGUgKGxlbiA+PSAyKSB7CisgICAgICAgIC8vIG91dHB1dCBUSElTIGltYWdlIGFzLWlzCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0Yy0+bmJfcGxhbmVzOyBpKyspCisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKHRjLT5mcmFtZVtub3V0XS0+ZGF0YVtpXSwgdGMtPmZyYW1lW25vdXRdLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5waWNyZWYtPmRhdGFbaV0sIGlucGljcmVmLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMtPnN0cmlkZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMtPnBsYW5laGVpZ2h0W2ldKTsKKyAgICAgICAgbm91dCsrOworICAgICAgICBsZW4gLT0gMjsKKyAgICB9CisKKyAgICBpZiAobGVuID49IDEpIHsKKyAgICAgICAgLy8gY29weSBUSElTIGltYWdlIHRvIHRoZSBidWZmZXIsIHdlIG5lZWQgaXQgbGF0ZXIKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRjLT5uYl9wbGFuZXM7IGkrKykKKyAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUodGMtPnRlbXAtPmRhdGFbaV0sIHRjLT50ZW1wLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5waWNyZWYtPmRhdGFbaV0sIGlucGljcmVmLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMtPnN0cmlkZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMtPnBsYW5laGVpZ2h0W2ldKTsKKyAgICAgICAgdGMtPm9jY3VwaWVkID0gMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbm91dDsgaSsrKSB7CisgICAgICAgIEFWRnJhbWUgKmZyYW1lID0gYXZfZnJhbWVfY2xvbmUodGMtPmZyYW1lW2ldKTsKKworICAgICAgICBpZiAoIWZyYW1lKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnBpY3JlZik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgZnJhbWUtPnB0cyA9IG91dGxpbmstPmZyYW1lX2NvdW50ICogdGMtPnRzX3VuaXQ7CisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CisgICAgfQorICAgIGF2X2ZyYW1lX2ZyZWUoJmlucGljcmVmKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFRlbGVjaW5lQ29udGV4dCAqdGMgPSBjdHgtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZ0Yy0+dGVtcCk7CisgICAgZm9yIChpID0gMDsgaSA8IHRjLT5vdXRfY250OyBpKyspCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnRjLT5mcmFtZVtpXSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB0ZWxlY2luZV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB0ZWxlY2luZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl90ZWxlY2luZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJ0ZWxlY2luZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgYSB0ZWxlY2luZSBwYXR0ZXJuLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFRlbGVjaW5lQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmdGVsZWNpbmVfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IHRlbGVjaW5lX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHRlbGVjaW5lX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3RodW1ibmFpbC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3RodW1ibmFpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODMxNTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdGh1bWJuYWlsLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU21hcnRqb2cgUy5BLlMsIENsw6ltZW50IELFk3NjaCA8Y2xlbWVudC5ib2VzY2hAc21hcnRqb2cuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBQb3RlbnRpYWwgdGh1bWJuYWlsIGxvb2t1cCBmaWx0ZXIgdG8gcmVkdWNlIHRoZSByaXNrIG9mIGFuIGluYXBwcm9wcmlhdGUKKyAqIHNlbGVjdGlvbiAoc3VjaCBhcyBhIGJsYWNrIGZyYW1lKSB3ZSBjb3VsZCBnZXQgd2l0aCBhbiBhYnNvbHV0ZSBzZWVrLgorICoKKyAqIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBhbGdvcml0aG0gYnkgVmFkaW0gWmFsaXZhIDxsb3JkQGNyb2NvZGlsZS5vcmc+LgorICogQHNlZSBodHRwOi8vbm90YnJhaW5zdXJnZXJ5LmxpdmVqb3VybmFsLmNvbS8yOTc3My5odG1sCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgSElTVF9TSVpFICgzKjI1NikKKworc3RydWN0IHRodW1iX2ZyYW1lIHsKKyAgICBBVkZyYW1lICpidWY7ICAgICAgICAgICAgICAgLy8vPCBjYWNoZWQgZnJhbWUKKyAgICBpbnQgaGlzdG9ncmFtW0hJU1RfU0laRV07ICAgLy8vPCBSR0IgY29sb3IgZGlzdHJpYnV0aW9uIGhpc3RvZ3JhbSBvZiB0aGUgZnJhbWUKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGZyYW1lCisgICAgaW50IG5fZnJhbWVzOyAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGZyYW1lcyBmb3IgYW5hbHlzaXMKKyAgICBzdHJ1Y3QgdGh1bWJfZnJhbWUgKmZyYW1lczsgLy8vPCB0aGUgbl9mcmFtZXMgZnJhbWVzCisgICAgQVZSYXRpb25hbCB0YjsgICAgICAgICAgICAgIC8vLzwgY29weSBvZiB0aGUgaW5wdXQgdGltZWJhc2UgdG8gZWFzZSBhY2Nlc3MKK30gVGh1bWJDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihUaHVtYkNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdGh1bWJuYWlsX29wdGlvbnNbXSA9IHsKKyAgICB7ICJuIiwgInNldCB0aGUgZnJhbWVzIGJhdGNoIHNpemUiLCBPRkZTRVQobl9mcmFtZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTEwMH0sIDIsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyh0aHVtYm5haWwpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBUaHVtYkNvbnRleHQgKnRodW1iID0gY3R4LT5wcml2OworCisgICAgdGh1bWItPmZyYW1lcyA9IGF2X2NhbGxvYyh0aHVtYi0+bl9mcmFtZXMsIHNpemVvZigqdGh1bWItPmZyYW1lcykpOworICAgIGlmICghdGh1bWItPmZyYW1lcykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBmYWlsdXJlLCB0cnkgdG8gbG93ZXIgdGhlIG51bWJlciBvZiBmcmFtZXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgImJhdGNoIHNpemU6ICVkIGZyYW1lc1xuIiwgdGh1bWItPm5fZnJhbWVzKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBAYnJpZWYgICAgICAgIENvbXB1dGUgU3VtLXNxdWFyZSBkZXZpYXRpb24gdG8gZXN0aW1hdGUgImNsb3NlbmVzcyIuCisgKiBAcGFyYW0gaGlzdCAgIGNvbG9yIGRpc3RyaWJ1dGlvbiBoaXN0b2dyYW0KKyAqIEBwYXJhbSBtZWRpYW4gYXZlcmFnZSBjb2xvciBkaXN0cmlidXRpb24gaGlzdG9ncmFtCisgKiBAcmV0dXJuICAgICAgIHN1bSBvZiBzcXVhcmVkIGVycm9ycworICovCitzdGF0aWMgZG91YmxlIGZyYW1lX3N1bV9zcXVhcmVfZXJyKGNvbnN0IGludCAqaGlzdCwgY29uc3QgZG91YmxlICptZWRpYW4pCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIGVyciwgc3VtX3NxX2VyciA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSElTVF9TSVpFOyBpKyspIHsKKyAgICAgICAgZXJyID0gbWVkaWFuW2ldIC0gKGRvdWJsZSloaXN0W2ldOworICAgICAgICBzdW1fc3FfZXJyICs9IGVyciplcnI7CisgICAgfQorICAgIHJldHVybiBzdW1fc3FfZXJyOworfQorCitzdGF0aWMgQVZGcmFtZSAqZ2V0X2Jlc3RfZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGcmFtZSAqcGljcmVmOworICAgIFRodW1iQ29udGV4dCAqdGh1bWIgPSBjdHgtPnByaXY7CisgICAgaW50IGksIGosIGJlc3RfZnJhbWVfaWR4ID0gMDsKKyAgICBpbnQgbmJfZnJhbWVzID0gdGh1bWItPm47CisgICAgZG91YmxlIGF2Z19oaXN0W0hJU1RfU0laRV0gPSB7MH0sIHNxX2VyciwgbWluX3NxX2VyciA9IC0xOworCisgICAgLy8gYXZlcmFnZSBoaXN0b2dyYW0gb2YgdGhlIE4gZnJhbWVzCisgICAgZm9yIChqID0gMDsgaiA8IEZGX0FSUkFZX0VMRU1TKGF2Z19oaXN0KTsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9mcmFtZXM7IGkrKykKKyAgICAgICAgICAgIGF2Z19oaXN0W2pdICs9IChkb3VibGUpdGh1bWItPmZyYW1lc1tpXS5oaXN0b2dyYW1bal07CisgICAgICAgIGF2Z19oaXN0W2pdIC89IG5iX2ZyYW1lczsKKyAgICB9CisKKyAgICAvLyBmaW5kIHRoZSBmcmFtZSBjbG9zZXIgdG8gdGhlIGF2ZXJhZ2UgdXNpbmcgdGhlIHN1bSBvZiBzcXVhcmVkIGVycm9ycworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9mcmFtZXM7IGkrKykgeworICAgICAgICBzcV9lcnIgPSBmcmFtZV9zdW1fc3F1YXJlX2Vycih0aHVtYi0+ZnJhbWVzW2ldLmhpc3RvZ3JhbSwgYXZnX2hpc3QpOworICAgICAgICBpZiAoaSA9PSAwIHx8IHNxX2VyciA8IG1pbl9zcV9lcnIpCisgICAgICAgICAgICBiZXN0X2ZyYW1lX2lkeCA9IGksIG1pbl9zcV9lcnIgPSBzcV9lcnI7CisgICAgfQorCisgICAgLy8gZnJlZSBhbmQgcmVzZXQgZXZlcnl0aGluZyAoZXhjZXB0IHRoZSBiZXN0IGZyYW1lIGJ1ZmZlcikKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgbWVtc2V0KHRodW1iLT5mcmFtZXNbaV0uaGlzdG9ncmFtLCAwLCBzaXplb2YodGh1bWItPmZyYW1lc1tpXS5oaXN0b2dyYW0pKTsKKyAgICAgICAgaWYgKGkgIT0gYmVzdF9mcmFtZV9pZHgpCisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZ0aHVtYi0+ZnJhbWVzW2ldLmJ1Zik7CisgICAgfQorICAgIHRodW1iLT5uID0gMDsKKworICAgIC8vIHJhaXNlIHRoZSBjaG9zZW4gb25lCisgICAgcGljcmVmID0gdGh1bWItPmZyYW1lc1tiZXN0X2ZyYW1lX2lkeF0uYnVmOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiZnJhbWUgaWQgIyVkIChwdHNfdGltZT0lZikgc2VsZWN0ZWQgIgorICAgICAgICAgICAiZnJvbSBhIHNldCBvZiAlZCBpbWFnZXNcbiIsIGJlc3RfZnJhbWVfaWR4LAorICAgICAgICAgICBwaWNyZWYtPnB0cyAqIGF2X3EyZCh0aHVtYi0+dGIpLCBuYl9mcmFtZXMpOworICAgIHRodW1iLT5mcmFtZXNbYmVzdF9mcmFtZV9pZHhdLmJ1ZiA9IE5VTEw7CisKKyAgICByZXR1cm4gcGljcmVmOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IGksIGo7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggID0gaW5saW5rLT5kc3Q7CisgICAgVGh1bWJDb250ZXh0ICp0aHVtYiAgID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBpbnQgKmhpc3QgPSB0aHVtYi0+ZnJhbWVzW3RodW1iLT5uXS5oaXN0b2dyYW07CisgICAgY29uc3QgdWludDhfdCAqcCA9IGZyYW1lLT5kYXRhWzBdOworCisgICAgLy8ga2VlcCBhIHJlZmVyZW5jZSBvZiBlYWNoIGZyYW1lCisgICAgdGh1bWItPmZyYW1lc1t0aHVtYi0+bl0uYnVmID0gZnJhbWU7CisKKyAgICAvLyB1cGRhdGUgY3VycmVudCBmcmFtZSBSR0IgaGlzdG9ncmFtCisgICAgZm9yIChqID0gMDsgaiA8IGlubGluay0+aDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmxpbmstPnc7IGkrKykgeworICAgICAgICAgICAgaGlzdFswKjI1NiArIHBbaSozICAgIF1dKys7CisgICAgICAgICAgICBoaXN0WzEqMjU2ICsgcFtpKjMgKyAxXV0rKzsKKyAgICAgICAgICAgIGhpc3RbMioyNTYgKyBwW2kqMyArIDJdXSsrOworICAgICAgICB9CisgICAgICAgIHAgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIC8vIG5vIHNlbGVjdGlvbiB1bnRpbCB0aGUgYnVmZmVyIG9mIE4gZnJhbWVzIGlzIGZpbGxlZCB1cAorICAgIHRodW1iLT5uKys7CisgICAgaWYgKHRodW1iLT5uIDwgdGh1bWItPm5fZnJhbWVzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZ2V0X2Jlc3RfZnJhbWUoY3R4KSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBpOworICAgIFRodW1iQ29udGV4dCAqdGh1bWIgPSBjdHgtPnByaXY7CisgICAgZm9yIChpID0gMDsgaSA8IHRodW1iLT5uX2ZyYW1lcyAmJiB0aHVtYi0+ZnJhbWVzW2ldLmJ1ZjsgaSsrKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZ0aHVtYi0+ZnJhbWVzW2ldLmJ1Zik7CisgICAgYXZfZnJlZXAoJnRodW1iLT5mcmFtZXMpOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+c3JjOworICAgIFRodW1iQ29udGV4dCAqdGh1bWIgPSBjdHgtPnByaXY7CisKKyAgICAvKiBsb29wIHVudGlsIGEgZnJhbWUgdGh1bWJuYWlsIGlzIGF2YWlsYWJsZSAod2hlbiBhIGZyYW1lIGlzIHF1ZXVlZCwKKyAgICAgKiB0aHVtYi0+biBpcyByZXNldCB0byB6ZXJvKSAqLworICAgIGRvIHsKKyAgICAgICAgaW50IHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIHRodW1iLT5uKSB7CisgICAgICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUobGluaywgZ2V0X2Jlc3RfZnJhbWUoY3R4KSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gd2hpbGUgKHRodW1iLT5uKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBUaHVtYkNvbnRleHQgKnRodW1iID0gY3R4LT5wcml2OworCisgICAgdGh1bWItPnRiID0gaW5saW5rLT50aW1lX2Jhc2U7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfUkdCMjQsIEFWX1BJWF9GTVRfQkdSMjQsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgdGh1bWJuYWlsX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19wcm9wcywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgdGh1bWJuYWlsX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3RodW1ibmFpbCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJ0aHVtYm5haWwiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNlbGVjdCB0aGUgbW9zdCByZXByZXNlbnRhdGl2ZSBmcmFtZSBpbiBhIGdpdmVuIHNlcXVlbmNlIG9mIGNvbnNlY3V0aXZlIGZyYW1lcy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihUaHVtYkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSB0aHVtYm5haWxfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gdGh1bWJuYWlsX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmdGh1bWJuYWlsX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl90aWxlLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdGlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OWFlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdGlsZS5jCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHRpbGUgdmlkZW8gZmlsdGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIHVuc2lnbmVkIHcsIGg7CisgICAgdW5zaWduZWQgbWFyZ2luOworICAgIHVuc2lnbmVkIHBhZGRpbmc7CisgICAgdW5zaWduZWQgY3VycmVudDsKKyAgICB1bnNpZ25lZCBuYl9mcmFtZXM7CisgICAgRkZEcmF3Q29udGV4dCBkcmF3OworICAgIEZGRHJhd0NvbG9yIGJsYW5rOworICAgIEFWRnJhbWUgKm91dF9yZWY7CisgICAgdWludDhfdCByZ2JhX2NvbG9yWzRdOworfSBUaWxlQ29udGV4dDsKKworI2RlZmluZSBSRUFTT05BQkxFX1NJWkUgMTAyNAorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihUaWxlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiB0aWxlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJsYXlvdXQiLCAic2V0IGdyaWQgc2l6ZSIsIE9GRlNFVCh3KSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwKKyAgICAgICAgey5zdHIgPSAiNng1In0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAibmJfZnJhbWVzIiwgInNldCBtYXhpbXVtIG51bWJlciBvZiBmcmFtZSB0byByZW5kZXIiLCBPRkZTRVQobmJfZnJhbWVzKSwKKyAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgIm1hcmdpbiIsICAic2V0IG91dGVyIGJvcmRlciBtYXJnaW4gaW4gcGl4ZWxzIiwgICAgT0ZGU0VUKG1hcmdpbiksCisgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMTAyNCwgRkxBR1MgfSwKKyAgICB7ICJwYWRkaW5nIiwgInNldCBpbm5lciBib3JkZXIgdGhpY2tuZXNzIGluIHBpeGVscyIsIE9GRlNFVChwYWRkaW5nKSwKKyAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxMDI0LCBGTEFHUyB9LAorICAgIHsgImNvbG9yIiwgICAic2V0IHRoZSBjb2xvciBvZiB0aGUgdW51c2VkIGFyZWEiLCBPRkZTRVQocmdiYV9jb2xvciksIEFWX09QVF9UWVBFX0NPTE9SLCB7LnN0ciA9ICJibGFjayJ9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1ModGlsZSk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFRpbGVDb250ZXh0ICp0aWxlID0gY3R4LT5wcml2OworCisgICAgaWYgKHRpbGUtPncgPiBSRUFTT05BQkxFX1NJWkUgfHwgdGlsZS0+aCA+IFJFQVNPTkFCTEVfU0laRSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUaWxlIHNpemUgJXV4JXUgaXMgaW5zYW5lLlxuIiwKKyAgICAgICAgICAgICAgIHRpbGUtPncsIHRpbGUtPmgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICh0aWxlLT5uYl9mcmFtZXMgPT0gMCkgeworICAgICAgICB0aWxlLT5uYl9mcmFtZXMgPSB0aWxlLT53ICogdGlsZS0+aDsKKyAgICB9IGVsc2UgaWYgKHRpbGUtPm5iX2ZyYW1lcyA+IHRpbGUtPncgKiB0aWxlLT5oKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIm5iX2ZyYW1lcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlZHglZD0lZFxuIiwKKyAgICAgICAgICAgICAgIHRpbGUtPncsIHRpbGUtPmgsIHRpbGUtPncgKiB0aWxlLT5oKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX2RyYXdfc3VwcG9ydGVkX3BpeGVsX2Zvcm1hdHMoMCkpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgVGlsZUNvbnRleHQgKnRpbGUgICAgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBjb25zdCB1bnNpZ25lZCB0b3RhbF9tYXJnaW5fdyA9ICh0aWxlLT53IC0gMSkgKiB0aWxlLT5wYWRkaW5nICsgMip0aWxlLT5tYXJnaW47CisgICAgY29uc3QgdW5zaWduZWQgdG90YWxfbWFyZ2luX2ggPSAodGlsZS0+aCAtIDEpICogdGlsZS0+cGFkZGluZyArIDIqdGlsZS0+bWFyZ2luOworCisgICAgaWYgKGlubGluay0+dyA+IChJTlRfTUFYIC0gdG90YWxfbWFyZ2luX3cpIC8gdGlsZS0+dykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb3RhbCB3aWR0aCAldXgldSBpcyB0b28gbXVjaC5cbiIsCisgICAgICAgICAgICAgICB0aWxlLT53LCBpbmxpbmstPncpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoaW5saW5rLT5oID4gKElOVF9NQVggLSB0b3RhbF9tYXJnaW5faCkgLyB0aWxlLT5oKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlRvdGFsIGhlaWdodCAldXgldSBpcyB0b28gbXVjaC5cbiIsCisgICAgICAgICAgICAgICB0aWxlLT5oLCBpbmxpbmstPmgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBvdXRsaW5rLT53ID0gdGlsZS0+dyAqIGlubGluay0+dyArIHRvdGFsX21hcmdpbl93OworICAgIG91dGxpbmstPmggPSB0aWxlLT5oICogaW5saW5rLT5oICsgdG90YWxfbWFyZ2luX2g7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gYXZfbXVsX3EoaW5saW5rLT5mcmFtZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9tYWtlX3EoMSwgdGlsZS0+bmJfZnJhbWVzKSk7CisgICAgZmZfZHJhd19pbml0KCZ0aWxlLT5kcmF3LCBpbmxpbmstPmZvcm1hdCwgMCk7CisgICAgZmZfZHJhd19jb2xvcigmdGlsZS0+ZHJhdywgJnRpbGUtPmJsYW5rLCB0aWxlLT5yZ2JhX2NvbG9yKTsKKworICAgIG91dGxpbmstPmZsYWdzIHw9IEZGX0xJTktfRkxBR19SRVFVRVNUX0xPT1A7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2N1cnJlbnRfdGlsZV9wb3MoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHVuc2lnbmVkICp4LCB1bnNpZ25lZCAqeSkKK3sKKyAgICBUaWxlQ29udGV4dCAqdGlsZSAgICA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIGNvbnN0IHVuc2lnbmVkIHR4ID0gdGlsZS0+Y3VycmVudCAlIHRpbGUtPnc7CisgICAgY29uc3QgdW5zaWduZWQgdHkgPSB0aWxlLT5jdXJyZW50IC8gdGlsZS0+dzsKKworICAgICp4ID0gdGlsZS0+bWFyZ2luICsgKGlubGluay0+dyArIHRpbGUtPnBhZGRpbmcpICogdHg7CisgICAgKnkgPSB0aWxlLT5tYXJnaW4gKyAoaW5saW5rLT5oICsgdGlsZS0+cGFkZGluZykgKiB0eTsKK30KKworc3RhdGljIHZvaWQgZHJhd19ibGFua19mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqb3V0X2J1ZikKK3sKKyAgICBUaWxlQ29udGV4dCAqdGlsZSAgICA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIHVuc2lnbmVkIHgwLCB5MDsKKworICAgIGdldF9jdXJyZW50X3RpbGVfcG9zKGN0eCwgJngwLCAmeTApOworICAgIGZmX2ZpbGxfcmVjdGFuZ2xlKCZ0aWxlLT5kcmF3LCAmdGlsZS0+YmxhbmssCisgICAgICAgICAgICAgICAgICAgICAgb3V0X2J1Zi0+ZGF0YSwgb3V0X2J1Zi0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgeDAsIHkwLCBpbmxpbmstPncsIGlubGluay0+aCk7CisgICAgdGlsZS0+Y3VycmVudCsrOworfQorc3RhdGljIGludCBlbmRfbGFzdF9mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBUaWxlQ29udGV4dCAqdGlsZSAgICAgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dF9idWYgPSB0aWxlLT5vdXRfcmVmOworICAgIGludCByZXQ7CisKKyAgICB3aGlsZSAodGlsZS0+Y3VycmVudCA8IHRpbGUtPm5iX2ZyYW1lcykKKyAgICAgICAgZHJhd19ibGFua19mcmFtZShjdHgsIG91dF9idWYpOworICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXRfYnVmKTsKKyAgICB0aWxlLT5jdXJyZW50ID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBOb3RlOiBkaXJlY3QgcmVuZGVyaW5nIGlzIG5vdCBwb3NzaWJsZSBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAorICogYnVmZmVycyBhcmUgZmVkIHRvIGZpbHRlcl9mcmFtZSBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIG9idGFpbmVkIGZyb20KKyAqIGdldF9idWZmZXIgKHRoaW5rIEItZnJhbWVzKS4gKi8KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKnBpY3JlZikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCAgPSBpbmxpbmstPmRzdDsKKyAgICBUaWxlQ29udGV4dCAqdGlsZSAgICAgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIHVuc2lnbmVkIHgwLCB5MDsKKworICAgIGlmICghdGlsZS0+Y3VycmVudCkgeworICAgICAgICB0aWxlLT5vdXRfcmVmID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICAgICAgaWYgKCF0aWxlLT5vdXRfcmVmKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZwaWNyZWYpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKHRpbGUtPm91dF9yZWYsIHBpY3JlZik7CisgICAgICAgIHRpbGUtPm91dF9yZWYtPndpZHRoICA9IG91dGxpbmstPnc7CisgICAgICAgIHRpbGUtPm91dF9yZWYtPmhlaWdodCA9IG91dGxpbmstPmg7CisKKyAgICAgICAgLyogZmlsbCBzdXJmYWNlIG9uY2UgZm9yIG1hcmdpbi9wYWRkaW5nICovCisgICAgICAgIGlmICh0aWxlLT5tYXJnaW4gfHwgdGlsZS0+cGFkZGluZykKKyAgICAgICAgICAgIGZmX2ZpbGxfcmVjdGFuZ2xlKCZ0aWxlLT5kcmF3LCAmdGlsZS0+YmxhbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlLT5vdXRfcmVmLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZS0+b3V0X3JlZi0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICB9CisKKyAgICBnZXRfY3VycmVudF90aWxlX3BvcyhjdHgsICZ4MCwgJnkwKTsKKyAgICBmZl9jb3B5X3JlY3RhbmdsZTIoJnRpbGUtPmRyYXcsCisgICAgICAgICAgICAgICAgICAgICAgIHRpbGUtPm91dF9yZWYtPmRhdGEsIHRpbGUtPm91dF9yZWYtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBwaWNyZWYtPmRhdGEsIHBpY3JlZi0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHgwLCB5MCwgMCwgMCwgaW5saW5rLT53LCBpbmxpbmstPmgpOworCisgICAgYXZfZnJhbWVfZnJlZSgmcGljcmVmKTsKKyAgICBpZiAoKyt0aWxlLT5jdXJyZW50ID09IHRpbGUtPm5iX2ZyYW1lcykKKyAgICAgICAgcmV0dXJuIGVuZF9sYXN0X2ZyYW1lKGN0eCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBUaWxlQ29udGV4dCAqdGlsZSAgICA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIGludCByOworCisgICAgciA9IGZmX3JlcXVlc3RfZnJhbWUoaW5saW5rKTsKKyAgICBpZiAociA9PSBBVkVSUk9SX0VPRiAmJiB0aWxlLT5jdXJyZW50KQorICAgICAgICByID0gZW5kX2xhc3RfZnJhbWUoY3R4KTsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHRpbGVfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB0aWxlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfcHJvcHMsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl90aWxlID0geworICAgIC5uYW1lICAgICAgICAgID0gInRpbGUiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRpbGUgc2V2ZXJhbCBzdWNjZXNzaXZlIGZyYW1lcyB0b2dldGhlci4iKSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFRpbGVDb250ZXh0KSwKKyAgICAuaW5wdXRzICAgICAgICA9IHRpbGVfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gdGlsZV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnRpbGVfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3RpbnRlcmxhY2UuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl90aW50ZXJsYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0NDg5NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl90aW50ZXJsYWNlLmMKQEAgLTAsMCArMSw0MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU3RlZmFubyBTYWJhdGluaQorICogQ29weXJpZ2h0IChjKSAyMDEwIEJhcHRpc3RlIENvdWR1cmllcgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgWnVjY2hpIDxub3R6ZWRAeGltaWFuLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIHRlbXBvcmFsIGZpZWxkIGludGVybGFjZSBmaWx0ZXIsIHBvcnRlZCBmcm9tIE1QbGF5ZXIvbGlibXBjb2RlY3MKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0aW50ZXJsYWNlLmgiCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFRJbnRlcmxhY2VDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKyNkZWZpbmUgVElOVEVSTEFDRV9GTEFHX1ZMUEYgMDEKKyNkZWZpbmUgVElOVEVSTEFDRV9GTEFHX0VYQUNUX1RCIDIKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHRpbnRlcmxhY2Vfb3B0aW9uc1tdID0geworICAgIHsibW9kZSIsICAgICAgICAgICAgICAic2VsZWN0IGludGVybGFjZSBtb2RlIiwgT0ZGU0VUKG1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PU1PREVfTUVSR0V9LCAwLCBNT0RFX05CLTEsIEZMQUdTLCAibW9kZSJ9LAorICAgIHsibWVyZ2UiLCAgICAgICAgICAgICAibWVyZ2UgZmllbGRzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9NRVJHRX0sICAgICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSJ9LAorICAgIHsiZHJvcF9ldmVuIiwgICAgICAgICAiZHJvcCBldmVuIGZpZWxkcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9EUk9QX0VWRU59LCAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSJ9LAorICAgIHsiZHJvcF9vZGQiLCAgICAgICAgICAiZHJvcCBvZGQgZmllbGRzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9EUk9QX09ERH0sICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSJ9LAorICAgIHsicGFkIiwgICAgICAgICAgICAgICAicGFkIGFsdGVybmF0ZSBsaW5lcyB3aXRoIGJsYWNrIiwgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9QQUR9LCAgICAgICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSJ9LAorICAgIHsiaW50ZXJsZWF2ZV90b3AiLCAgICAiaW50ZXJsZWF2ZSB0b3AgYW5kIGJvdHRvbSBmaWVsZHMiLCAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9JTlRFUkxFQVZFX1RPUH0sICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSJ9LAorICAgIHsiaW50ZXJsZWF2ZV9ib3R0b20iLCAiaW50ZXJsZWF2ZSBib3R0b20gYW5kIHRvcCBmaWVsZHMiLCAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9JTlRFUkxFQVZFX0JPVFRPTX0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSJ9LAorICAgIHsiaW50ZXJsYWNleDIiLCAgICAgICAiaW50ZXJsYWNlIGZpZWxkcyBmcm9tIHR3byBjb25zZWN1dGl2ZSBmcmFtZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TU9ERV9JTlRFUkxBQ0VYMn0sICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSJ9LAorCisgICAgeyJmbGFncyIsICAgICAgICAgICAgICJzZXQgZmxhZ3MiLCBPRkZTRVQoZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgMCwgImZsYWdzIiB9LAorICAgIHsibG93X3Bhc3NfZmlsdGVyIiwgICAiZW5hYmxlIHZlcnRpY2FsIGxvdy1wYXNzIGZpbHRlciIsICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBUSU5URVJMQUNFX0ZMQUdfVkxQRn0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiZmxhZ3MiIH0sCisgICAgeyJ2bHBmIiwgICAgICAgICAgICAgICJlbmFibGUgdmVydGljYWwgbG93LXBhc3MgZmlsdGVyIiwgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFRJTlRFUkxBQ0VfRkxBR19WTFBGfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJmbGFncyIgfSwKKyAgICB7ImV4YWN0X3RiIiwgICAgICAgICAgImZvcmNlIGEgdGltZWJhc2Ugd2hpY2ggY2FuIHJlcHJlc2VudCB0aW1lc3RhbXBzIGV4YWN0bHkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBUSU5URVJMQUNFX0ZMQUdfRVhBQ1RfVEJ9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImZsYWdzIiB9LAorCisgICAge05VTEx9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1ModGludGVybGFjZSk7CisKKyNkZWZpbmUgRlVMTF9TQ0FMRV9ZVVZKX0ZPUk1BVFMgXAorICAgIEFWX1BJWF9GTVRfWVVWSjQyMFAsIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBmdWxsX3NjYWxlX3l1dmpfcGl4X2ZtdHNbXSA9IHsKKyAgICBGVUxMX1NDQUxFX1lVVkpfRk9STUFUUywgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgQVZSYXRpb25hbCBzdGFuZGFyZF90YnNbXSA9IHsKKyAgICB7MSwgMjV9LAorICAgIHsxLCAzMH0sCisgICAgezEwMDEsIDMwMDAwfSwKK307CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEZVTExfU0NBTEVfWVVWSl9GT1JNQVRTLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsb3dwYXNzX2xpbmVfYyh1aW50OF90ICpkc3RwLCBwdHJkaWZmX3Qgd2lkdGgsIGNvbnN0IHVpbnQ4X3QgKnNyY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwX2Fib3ZlLCBjb25zdCB1aW50OF90ICpzcmNwX2JlbG93KQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIC8vIHRoaXMgY2FsY3VsYXRpb24gaXMgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZgorICAgICAgICAvLyAnMC41ICogY3VycmVudCArIDAuMjUgKiBhYm92ZSArIDAuMjUgKiBiZWxvdycKKyAgICAgICAgLy8gJzEgKycgaXMgZm9yIHJvdW5kaW5nLgorICAgICAgICBkc3RwW2ldID0gKDEgKyBzcmNwW2ldICsgc3JjcFtpXSArIHNyY3BfYWJvdmVbaV0gKyBzcmNwX2JlbG93W2ldKSA+PiAyOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVEludGVybGFjZUNvbnRleHQgKnRpbnRlcmxhY2UgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZ0aW50ZXJsYWNlLT5jdXIgKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZ0aW50ZXJsYWNlLT5uZXh0KTsKKyAgICBhdl9mcmVlcCgmdGludGVybGFjZS0+YmxhY2tfZGF0YVswXSk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dF9wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBvdXRsaW5rLT5zcmMtPmlucHV0c1swXTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CisgICAgVEludGVybGFjZUNvbnRleHQgKnRpbnRlcmxhY2UgPSBjdHgtPnByaXY7CisgICAgaW50IGk7CisKKyAgICB0aW50ZXJsYWNlLT52c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICBvdXRsaW5rLT5mbGFncyB8PSBGRl9MSU5LX0ZMQUdfUkVRVUVTVF9MT09QOworICAgIG91dGxpbmstPncgPSBpbmxpbmstPnc7CisgICAgb3V0bGluay0+aCA9IHRpbnRlcmxhY2UtPm1vZGUgPT0gTU9ERV9NRVJHRSB8fCB0aW50ZXJsYWNlLT5tb2RlID09IE1PREVfUEFEID8KKyAgICAgICAgaW5saW5rLT5oKjIgOiBpbmxpbmstPmg7CisKKyAgICBpZiAodGludGVybGFjZS0+bW9kZSA9PSBNT0RFX1BBRCkgeworICAgICAgICB1aW50OF90IGJsYWNrWzRdID0geyAxNiwgMTI4LCAxMjgsIDE2IH07CisgICAgICAgIGludCBpLCByZXQ7CisgICAgICAgIGlmIChmZl9mbXRfaXNfaW4ob3V0bGluay0+Zm9ybWF0LCBmdWxsX3NjYWxlX3l1dmpfcGl4X2ZtdHMpKQorICAgICAgICAgICAgYmxhY2tbMF0gPSBibGFja1szXSA9IDA7CisgICAgICAgIHJldCA9IGF2X2ltYWdlX2FsbG9jKHRpbnRlcmxhY2UtPmJsYWNrX2RhdGEsIHRpbnRlcmxhY2UtPmJsYWNrX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT53LCBvdXRsaW5rLT5oLCBvdXRsaW5rLT5mb3JtYXQsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgLyogZmlsbCBibGFjayBwaWN0dXJlIHdpdGggYmxhY2sgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgdGludGVybGFjZS0+YmxhY2tfZGF0YVtpXTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaCA9IGkgPT0gMSB8fCBpID09IDIgPyBGRl9DRUlMX1JTSElGVChvdXRsaW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKSA6IG91dGxpbmstPmg7CisgICAgICAgICAgICBtZW1zZXQodGludGVybGFjZS0+YmxhY2tfZGF0YVtpXSwgYmxhY2tbaV0sCisgICAgICAgICAgICAgICAgICAgdGludGVybGFjZS0+YmxhY2tfbGluZXNpemVbaV0gKiBoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHRpbnRlcmxhY2UtPmZsYWdzICYgVElOVEVSTEFDRV9GTEFHX1ZMUEYpCisgICAgICAgICAgICAmJiAhKHRpbnRlcmxhY2UtPm1vZGUgPT0gTU9ERV9JTlRFUkxFQVZFX1RPUAorICAgICAgICAgICAgICB8fCB0aW50ZXJsYWNlLT5tb2RlID09IE1PREVfSU5URVJMRUFWRV9CT1RUT00pKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAibG93X3Bhc3NfZmlsdGVyIGZsYWcgaWdub3JlZCB3aXRoIG1vZGUgJWRcbiIsCisgICAgICAgICAgICAgICAgdGludGVybGFjZS0+bW9kZSk7CisgICAgICAgIHRpbnRlcmxhY2UtPmZsYWdzICY9IH5USU5URVJMQUNFX0ZMQUdfVkxQRjsKKyAgICB9CisgICAgdGludGVybGFjZS0+cHJlb3V0X3RpbWVfYmFzZSA9IGlubGluay0+dGltZV9iYXNlOworICAgIGlmICh0aW50ZXJsYWNlLT5tb2RlID09IE1PREVfSU5URVJMQUNFWDIpIHsKKyAgICAgICAgdGludGVybGFjZS0+cHJlb3V0X3RpbWVfYmFzZS5kZW4gKj0gMjsKKyAgICAgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IGF2X211bF9xKGlubGluay0+ZnJhbWVfcmF0ZSwgKEFWUmF0aW9uYWwpezIsMX0pOworICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UgID0gYXZfbXVsX3EoaW5saW5rLT50aW1lX2Jhc2UgLCAoQVZSYXRpb25hbCl7MSwyfSk7CisgICAgfSBlbHNlIGlmICh0aW50ZXJsYWNlLT5tb2RlICE9IE1PREVfUEFEKSB7CisgICAgICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBhdl9tdWxfcShpbmxpbmstPmZyYW1lX3JhdGUsIChBVlJhdGlvbmFsKXsxLDJ9KTsKKyAgICAgICAgb3V0bGluay0+dGltZV9iYXNlICA9IGF2X211bF9xKGlubGluay0+dGltZV9iYXNlICwgKEFWUmF0aW9uYWwpezIsMX0pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGk8RkZfQVJSQVlfRUxFTVMoc3RhbmRhcmRfdGJzKTsgaSsrKXsKKyAgICAgICAgaWYgKCFhdl9jbXBfcShzdGFuZGFyZF90YnNbaV0sIG91dGxpbmstPnRpbWVfYmFzZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gRkZfQVJSQVlfRUxFTVMoc3RhbmRhcmRfdGJzKSB8fAorICAgICAgICAodGludGVybGFjZS0+ZmxhZ3MgJiBUSU5URVJMQUNFX0ZMQUdfRVhBQ1RfVEIpKQorICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSB0aW50ZXJsYWNlLT5wcmVvdXRfdGltZV9iYXNlOworCisgICAgaWYgKHRpbnRlcmxhY2UtPmZsYWdzICYgVElOVEVSTEFDRV9GTEFHX1ZMUEYpIHsKKyAgICAgICAgdGludGVybGFjZS0+bG93cGFzc19saW5lID0gbG93cGFzc19saW5lX2M7CisgICAgICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgICAgIGZmX3RpbnRlcmxhY2VfaW5pdF94ODYodGludGVybGFjZSk7CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJtb2RlOiVkIGZpbHRlcjolcyBoOiVkIC0+IGg6JWRcbiIsCisgICAgICAgICAgIHRpbnRlcmxhY2UtPm1vZGUsICh0aW50ZXJsYWNlLT5mbGFncyAmIFRJTlRFUkxBQ0VfRkxBR19WTFBGKSA/ICJvbiIgOiAib2ZmIiwKKyAgICAgICAgICAgaW5saW5rLT5oLCBvdXRsaW5rLT5oKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEZJRUxEX1VQUEVSICAgICAgICAgICAwCisjZGVmaW5lIEZJRUxEX0xPV0VSICAgICAgICAgICAxCisjZGVmaW5lIEZJRUxEX1VQUEVSX0FORF9MT1dFUiAyCisKKy8qKgorICogQ29weSBwaWN0dXJlIGZpZWxkIGZyb20gc3JjIHRvIGRzdC4KKyAqCisgKiBAcGFyYW0gc3JjX2ZpZWxkIGNvcHkgZnJvbSB1cHBlciwgbG93ZXIgZmllbGQgb3IgYm90aAorICogQHBhcmFtIGludGVybGVhdmUgbGVhdmUgYSBwYWRkaW5nIGxpbmUgYmV0d2VlbiBlYWNoIGNvcGllZCBsaW5lCisgKiBAcGFyYW0gZHN0X2ZpZWxkIGNvcHkgdG8gdXBwZXIgb3IgbG93ZXIgZmllbGQsCisgKiAgICAgICAgb25seSBtZWFuaW5nZnVsIHdoZW4gaW50ZXJsZWF2ZSBpcyBzZWxlY3RlZAorICogQHBhcmFtIGZsYWdzIGNvbnRleHQgZmxhZ3MKKyAqLworc3RhdGljIGlubGluZQordm9pZCBjb3B5X3BpY3R1cmVfZmllbGQoVEludGVybGFjZUNvbnRleHQgKnRpbnRlcmxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RbNF0sIGludCBkc3RfbGluZXNpemVbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNbNF0sIGludCBzcmNfbGluZXNpemVbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZm9ybWF0LCBpbnQgdywgaW50IHNyY19oLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19maWVsZCwgaW50IGludGVybGVhdmUsIGludCBkc3RfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChmb3JtYXQpOworICAgIGludCBwbGFuZSwgdnN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgaW50IGsgPSBzcmNfZmllbGQgPT0gRklFTERfVVBQRVJfQU5EX0xPV0VSID8gMSA6IDI7CisgICAgaW50IGg7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBkZXNjLT5uYl9jb21wb25lbnRzOyBwbGFuZSsrKSB7CisgICAgICAgIGludCBsaW5lcyA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IEZGX0NFSUxfUlNISUZUKHNyY19oLCB2c3ViKSA6IHNyY19oOworICAgICAgICBpbnQgY29scyAgPSBwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIgPyBGRl9DRUlMX1JTSElGVCggICAgdywgZGVzYy0+bG9nMl9jaHJvbWFfdykgOiB3OworICAgICAgICBpbnQgbGluZXNpemUgPSBhdl9pbWFnZV9nZXRfbGluZXNpemUoZm9ybWF0LCB3LCBwbGFuZSk7CisgICAgICAgIHVpbnQ4X3QgKmRzdHAgPSBkc3RbcGxhbmVdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwID0gc3JjW3BsYW5lXTsKKworICAgICAgICBpZiAobGluZXNpemUgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGxpbmVzID0gKGxpbmVzICsgKHNyY19maWVsZCA9PSBGSUVMRF9VUFBFUikpIC8gazsKKyAgICAgICAgaWYgKHNyY19maWVsZCA9PSBGSUVMRF9MT1dFUikKKyAgICAgICAgICAgIHNyY3AgKz0gc3JjX2xpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgaWYgKGludGVybGVhdmUgJiYgZHN0X2ZpZWxkID09IEZJRUxEX0xPV0VSKQorICAgICAgICAgICAgZHN0cCArPSBkc3RfbGluZXNpemVbcGxhbmVdOworICAgICAgICBpZiAoZmxhZ3MgJiBUSU5URVJMQUNFX0ZMQUdfVkxQRikgeworICAgICAgICAgICAgLy8gTG93LXBhc3MgZmlsdGVyaW5nIGlzIHJlcXVpcmVkIHdoZW4gY3JlYXRpbmcgYW4gaW50ZXJsYWNlZCBkZXN0aW5hdGlvbiBmcm9tCisgICAgICAgICAgICAvLyBhIHByb2dyZXNzaXZlIHNvdXJjZSB3aGljaCBjb250YWlucyBoaWdoLWZyZXF1ZW5jeSB2ZXJ0aWNhbCBkZXRhaWwuCisgICAgICAgICAgICAvLyBGaWx0ZXJpbmcgd2lsbCByZWR1Y2UgaW50ZXJsYWNlICd0d2l0dGVyJyBhbmQgTW9pcmUgcGF0dGVybmluZy4KKyAgICAgICAgICAgIGludCBzcmNwX2xpbmVzaXplID0gc3JjX2xpbmVzaXplW3BsYW5lXSAqIGs7CisgICAgICAgICAgICBpbnQgZHN0cF9saW5lc2l6ZSA9IGRzdF9saW5lc2l6ZVtwbGFuZV0gKiAoaW50ZXJsZWF2ZSA/IDIgOiAxKTsKKyAgICAgICAgICAgIGZvciAoaCA9IGxpbmVzOyBoID4gMDsgaC0tKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9hYm92ZSA9IHNyY3AgLSBzcmNfbGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYmVsb3cgPSBzcmNwICsgc3JjX2xpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgICAgICBpZiAoaCA9PSBsaW5lcykgc3JjcF9hYm92ZSA9IHNyY3A7IC8vIHRoZXJlIGlzIG5vIGxpbmUgYWJvdmUKKyAgICAgICAgICAgICAgICBpZiAoaCA9PSAxKSBzcmNwX2JlbG93ID0gc3JjcDsgICAgIC8vIHRoZXJlIGlzIG5vIGxpbmUgYmVsb3cKKworICAgICAgICAgICAgICAgIHRpbnRlcmxhY2UtPmxvd3Bhc3NfbGluZShkc3RwLCBjb2xzLCBzcmNwLCBzcmNwX2Fib3ZlLCBzcmNwX2JlbG93KTsKKyAgICAgICAgICAgICAgICBkc3RwICs9IGRzdHBfbGluZXNpemU7CisgICAgICAgICAgICAgICAgc3JjcCArPSBzcmNwX2xpbmVzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShkc3RwLCBkc3RfbGluZXNpemVbcGxhbmVdICogKGludGVybGVhdmUgPyAyIDogMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjcCwgc3JjX2xpbmVzaXplW3BsYW5lXSprLCBsaW5lc2l6ZSwgbGluZXMpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqcGljcmVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIFRJbnRlcmxhY2VDb250ZXh0ICp0aW50ZXJsYWNlID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKmN1ciwgKm5leHQsICpvdXQ7CisgICAgaW50IGZpZWxkLCB0ZmYsIHJldDsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnRpbnRlcmxhY2UtPmN1cik7CisgICAgdGludGVybGFjZS0+Y3VyICA9IHRpbnRlcmxhY2UtPm5leHQ7CisgICAgdGludGVybGFjZS0+bmV4dCA9IHBpY3JlZjsKKworICAgIGN1ciA9IHRpbnRlcmxhY2UtPmN1cjsKKyAgICBuZXh0ID0gdGludGVybGFjZS0+bmV4dDsKKyAgICAvKiB3ZSBuZWVkIGF0IGxlYXN0IHR3byBmcmFtZXMgKi8KKyAgICBpZiAoIXRpbnRlcmxhY2UtPmN1cikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzd2l0Y2ggKHRpbnRlcmxhY2UtPm1vZGUpIHsKKyAgICBjYXNlIE1PREVfTUVSR0U6IC8qIG1vdmUgdGhlIG9kZCBmcmFtZSBpbnRvIHRoZSB1cHBlciBmaWVsZCBvZiB0aGUgbmV3IGltYWdlLCBldmVuIGludG8KKyAgICAgICAgICAgICAqIHRoZSBsb3dlciBmaWVsZCwgZ2VuZXJhdGluZyBhIGRvdWJsZS1oZWlnaHQgdmlkZW8gYXQgaGFsZiBmcmFtZXJhdGUgKi8KKyAgICAgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICAgICAgaWYgKCFvdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgY3VyKTsKKyAgICAgICAgb3V0LT5oZWlnaHQgPSBvdXRsaW5rLT5oOworICAgICAgICBvdXQtPmludGVybGFjZWRfZnJhbWUgPSAxOworICAgICAgICBvdXQtPnRvcF9maWVsZF9maXJzdCA9IDE7CisKKyAgICAgICAgLyogd3JpdGUgb2RkIGZyYW1lIGxpbmVzIGludG8gdGhlIHVwcGVyIGZpZWxkIG9mIHRoZSBuZXcgZnJhbWUgKi8KKyAgICAgICAgY29weV9waWN0dXJlX2ZpZWxkKHRpbnRlcmxhY2UsIG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICoqKWN1ci0+ZGF0YSwgY3VyLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncsIGlubGluay0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEX1VQUEVSX0FORF9MT1dFUiwgMSwgRklFTERfVVBQRVIsIHRpbnRlcmxhY2UtPmZsYWdzKTsKKyAgICAgICAgLyogd3JpdGUgZXZlbiBmcmFtZSBsaW5lcyBpbnRvIHRoZSBsb3dlciBmaWVsZCBvZiB0aGUgbmV3IGZyYW1lICovCisgICAgICAgIGNvcHlfcGljdHVyZV9maWVsZCh0aW50ZXJsYWNlLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKiluZXh0LT5kYXRhLCBuZXh0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncsIGlubGluay0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEX1VQUEVSX0FORF9MT1dFUiwgMSwgRklFTERfTE9XRVIsIHRpbnRlcmxhY2UtPmZsYWdzKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmdGludGVybGFjZS0+bmV4dCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNT0RFX0RST1BfT0REOiAgLyogb25seSBvdXRwdXQgZXZlbiBmcmFtZXMsIG9kZCAgZnJhbWVzIGFyZSBkcm9wcGVkOyBoZWlnaHQgdW5jaGFuZ2VkLCBoYWxmIGZyYW1lcmF0ZSAqLworICAgIGNhc2UgTU9ERV9EUk9QX0VWRU46IC8qIG9ubHkgb3V0cHV0IG9kZCAgZnJhbWVzLCBldmVuIGZyYW1lcyBhcmUgZHJvcHBlZDsgaGVpZ2h0IHVuY2hhbmdlZCwgaGFsZiBmcmFtZXJhdGUgKi8KKyAgICAgICAgb3V0ID0gYXZfZnJhbWVfY2xvbmUodGludGVybGFjZS0+bW9kZSA9PSBNT0RFX0RST1BfRVZFTiA/IGN1ciA6IG5leHQpOworICAgICAgICBpZiAoIW91dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnRpbnRlcmxhY2UtPm5leHQpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTU9ERV9QQUQ6IC8qIGV4cGFuZCBlYWNoIGZyYW1lIHRvIGRvdWJsZSBoZWlnaHQsIGJ1dCBwYWQgYWx0ZXJuYXRlCisgICAgICAgICAgICAgICAgICAgICogbGluZXMgd2l0aCBibGFjazsgZnJhbWVyYXRlIHVuY2hhbmdlZCAqLworICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIW91dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBjdXIpOworICAgICAgICBvdXQtPmhlaWdodCA9IG91dGxpbmstPmg7CisKKyAgICAgICAgZmllbGQgPSAoMSArIHRpbnRlcmxhY2UtPmZyYW1lKSAmIDEgPyBGSUVMRF9VUFBFUiA6IEZJRUxEX0xPV0VSOworICAgICAgICAvKiBjb3B5IHVwcGVyIGFuZCBsb3dlciBmaWVsZHMgKi8KKyAgICAgICAgY29weV9waWN0dXJlX2ZpZWxkKHRpbnRlcmxhY2UsIG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICoqKWN1ci0+ZGF0YSwgY3VyLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncsIGlubGluay0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEX1VQUEVSX0FORF9MT1dFUiwgMSwgZmllbGQsIHRpbnRlcmxhY2UtPmZsYWdzKTsKKyAgICAgICAgLyogcGFkIHdpdGggYmxhY2sgdGhlIG90aGVyIGZpZWxkICovCisgICAgICAgIGNvcHlfcGljdHVyZV9maWVsZCh0aW50ZXJsYWNlLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKil0aW50ZXJsYWNlLT5ibGFja19kYXRhLCB0aW50ZXJsYWNlLT5ibGFja19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncsIGlubGluay0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEX1VQUEVSX0FORF9MT1dFUiwgMSwgIWZpZWxkLCB0aW50ZXJsYWNlLT5mbGFncyk7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGludGVybGVhdmUgdXBwZXIvbG93ZXIgbGluZXMgZnJvbSBvZGQgZnJhbWVzIHdpdGggbG93ZXIvdXBwZXIgbGluZXMgZnJvbSBldmVuIGZyYW1lcywKKyAgICAgICAgICogaGFsdmluZyB0aGUgZnJhbWUgcmF0ZSBhbmQgcHJlc2VydmluZyBpbWFnZSBoZWlnaHQgKi8KKyAgICBjYXNlIE1PREVfSU5URVJMRUFWRV9UT1A6ICAgIC8qIHRvcCAgICBmaWVsZCBmaXJzdCAqLworICAgIGNhc2UgTU9ERV9JTlRFUkxFQVZFX0JPVFRPTTogLyogYm90dG9tIGZpZWxkIGZpcnN0ICovCisgICAgICAgIHRmZiA9IHRpbnRlcmxhY2UtPm1vZGUgPT0gTU9ERV9JTlRFUkxFQVZFX1RPUDsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICAgICAgaWYgKCFvdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgY3VyKTsKKyAgICAgICAgb3V0LT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICAgICAgb3V0LT50b3BfZmllbGRfZmlyc3QgPSB0ZmY7CisKKyAgICAgICAgLyogY29weSB1cHBlci9sb3dlciBmaWVsZCBmcm9tIGN1ciAqLworICAgICAgICBjb3B5X3BpY3R1cmVfZmllbGQodGludGVybGFjZSwgb3V0LT5kYXRhLCBvdXQtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiopY3VyLT5kYXRhLCBjdXItPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5mb3JtYXQsIGlubGluay0+dywgaW5saW5rLT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZmID8gRklFTERfVVBQRVIgOiBGSUVMRF9MT1dFUiwgMSwgdGZmID8gRklFTERfVVBQRVIgOiBGSUVMRF9MT1dFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbnRlcmxhY2UtPmZsYWdzKTsKKyAgICAgICAgLyogY29weSBsb3dlci91cHBlciBmaWVsZCBmcm9tIG5leHQgKi8KKyAgICAgICAgY29weV9waWN0dXJlX2ZpZWxkKHRpbnRlcmxhY2UsIG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICoqKW5leHQtPmRhdGEsIG5leHQtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5mb3JtYXQsIGlubGluay0+dywgaW5saW5rLT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZmID8gRklFTERfTE9XRVIgOiBGSUVMRF9VUFBFUiwgMSwgdGZmID8gRklFTERfTE9XRVIgOiBGSUVMRF9VUFBFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbnRlcmxhY2UtPmZsYWdzKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmdGludGVybGFjZS0+bmV4dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9JTlRFUkxBQ0VYMjogLyogcmUtaW50ZXJsYWNlIHByZXNlcnZpbmcgaW1hZ2UgaGVpZ2h0LCBkb3VibGUgZnJhbWUgcmF0ZSAqLworICAgICAgICAvKiBvdXRwdXQgY3VycmVudCBmcmFtZSBmaXJzdCAqLworICAgICAgICBvdXQgPSBhdl9mcmFtZV9jbG9uZShjdXIpOworICAgICAgICBpZiAoIW91dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG91dC0+aW50ZXJsYWNlZF9mcmFtZSA9IDE7CisgICAgICAgIGlmIChjdXItPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIG91dC0+cHRzID0gY3VyLT5wdHMqMjsKKworICAgICAgICBvdXQtPnB0cyA9IGF2X3Jlc2NhbGVfcShvdXQtPnB0cywgdGludGVybGFjZS0+cHJlb3V0X3RpbWVfYmFzZSwgb3V0bGluay0+dGltZV9iYXNlKTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAvKiBvdXRwdXQgbWl4IG9mIGN1cnJlbnQgYW5kIG5leHQgZnJhbWUgKi8KKyAgICAgICAgdGZmID0gbmV4dC0+dG9wX2ZpZWxkX2ZpcnN0OworICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIW91dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBuZXh0KTsKKyAgICAgICAgb3V0LT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICAgICAgb3V0LT50b3BfZmllbGRfZmlyc3QgPSAhdGZmOworCisgICAgICAgIGlmIChuZXh0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgY3VyLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBvdXQtPnB0cyA9IGN1ci0+cHRzICsgbmV4dC0+cHRzOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAvKiB3cml0ZSBjdXJyZW50IGZyYW1lIHNlY29uZCBmaWVsZCBsaW5lcyBpbnRvIHRoZSBzZWNvbmQgZmllbGQgb2YgdGhlIG5ldyBmcmFtZSAqLworICAgICAgICBjb3B5X3BpY3R1cmVfZmllbGQodGludGVybGFjZSwgb3V0LT5kYXRhLCBvdXQtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiopY3VyLT5kYXRhLCBjdXItPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5mb3JtYXQsIGlubGluay0+dywgaW5saW5rLT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZmID8gRklFTERfTE9XRVIgOiBGSUVMRF9VUFBFUiwgMSwgdGZmID8gRklFTERfTE9XRVIgOiBGSUVMRF9VUFBFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbnRlcmxhY2UtPmZsYWdzKTsKKyAgICAgICAgLyogd3JpdGUgbmV4dCBmcmFtZSBmaXJzdCBmaWVsZCBsaW5lcyBpbnRvIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgbmV3IGZyYW1lICovCisgICAgICAgIGNvcHlfcGljdHVyZV9maWVsZCh0aW50ZXJsYWNlLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKiluZXh0LT5kYXRhLCBuZXh0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncsIGlubGluay0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmZiA/IEZJRUxEX1VQUEVSIDogRklFTERfTE9XRVIsIDEsIHRmZiA/IEZJRUxEX1VQUEVSIDogRklFTERfTE9XRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW50ZXJsYWNlLT5mbGFncyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorCisgICAgb3V0LT5wdHMgPSBhdl9yZXNjYWxlX3Eob3V0LT5wdHMsIHRpbnRlcmxhY2UtPnByZW91dF90aW1lX2Jhc2UsIG91dGxpbmstPnRpbWVfYmFzZSk7CisgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CisgICAgdGludGVybGFjZS0+ZnJhbWUrKzsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB0aW50ZXJsYWNlX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgdGludGVybGFjZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX291dF9wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl90aW50ZXJsYWNlID0geworICAgIC5uYW1lICAgICAgICAgID0gInRpbnRlcmxhY2UiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBlcmZvcm0gdGVtcG9yYWwgZmllbGQgaW50ZXJsYWNpbmcuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoVEludGVybGFjZUNvbnRleHQpLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IHRpbnRlcmxhY2VfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gdGludGVybGFjZV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnRpbnRlcmxhY2VfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3RyYW5zcG9zZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3RyYW5zcG9zZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjE2NWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdHJhbnNwb3NlLmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU3RlZmFubyBTYWJhdGluaQorICogQ29weXJpZ2h0IChjKSAyMDA4IFZpdG9yIFNlc3NhaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiB0cmFuc3Bvc2l0aW9uIGZpbHRlcgorICogQmFzZWQgb24gTVBsYXllciBsaWJtcGNvZGVjcy92Zl9yb3RhdGUuYy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBUUkFOU1BPU0VfUFRfVFlQRV9OT05FLAorICAgIFRSQU5TUE9TRV9QVF9UWVBFX0xBTkRTQ0FQRSwKKyAgICBUUkFOU1BPU0VfUFRfVFlQRV9QT1JUUkFJVCwKK30gUGFzc3Rocm91Z2hUeXBlOworCitlbnVtIFRyYW5zcG9zZURpciB7CisgICAgVFJBTlNQT1NFX0NDTE9DS19GTElQLAorICAgIFRSQU5TUE9TRV9DTE9DSywKKyAgICBUUkFOU1BPU0VfQ0NMT0NLLAorICAgIFRSQU5TUE9TRV9DTE9DS19GTElQLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgVHJhbnNDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgaHN1YiwgdnN1YjsKKyAgICBpbnQgcGl4c3RlcHNbNF07CisKKyAgICBQYXNzdGhyb3VnaFR5cGUgcGFzc3Rocm91Z2g7IC8vLzwgbGFuZHNjYXBlIHBhc3N0aHJvdWdoIG1vZGUgZW5hYmxlZAorICAgIGVudW0gVHJhbnNwb3NlRGlyIGRpcjsKK30gVHJhbnNDb250ZXh0OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpwaXhfZm10cyA9IE5VTEw7CisgICAgaW50IGZtdDsKKworICAgIGZvciAoZm10ID0gMDsgYXZfcGl4X2ZtdF9kZXNjX2dldChmbXQpOyBmbXQrKykgeworICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGZtdCk7CisgICAgICAgIGlmICghKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCB8fAorICAgICAgICAgICAgICBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMIHx8CisgICAgICAgICAgICAgIGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JJVFNUUkVBTSB8fAorICAgICAgICAgICAgICBkZXNjLT5sb2cyX2Nocm9tYV93ICE9IGRlc2MtPmxvZzJfY2hyb21hX2gpKQorICAgICAgICAgICAgZmZfYWRkX2Zvcm1hdCgmcGl4X2ZtdHMsIGZtdCk7CisgICAgfQorCisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBwaXhfZm10cyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgVHJhbnNDb250ZXh0ICp0cmFucyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzY19vdXQgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjX2luICA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworCisgICAgaWYgKHRyYW5zLT5kaXImNCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJkaXIgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzIGFyZSBkZXByZWNhdGVkLCB1c2UgdGhlIHBhc3N0aHJvdWdoIG9wdGlvbiBpbnN0ZWFkXG4iKTsKKyAgICAgICAgdHJhbnMtPmRpciAmPSAzOworICAgICAgICB0cmFucy0+cGFzc3Rocm91Z2ggPSBUUkFOU1BPU0VfUFRfVFlQRV9MQU5EU0NBUEU7CisgICAgfQorCisgICAgaWYgKChpbmxpbmstPncgPj0gaW5saW5rLT5oICYmIHRyYW5zLT5wYXNzdGhyb3VnaCA9PSBUUkFOU1BPU0VfUFRfVFlQRV9MQU5EU0NBUEUpIHx8CisgICAgICAgIChpbmxpbmstPncgPD0gaW5saW5rLT5oICYmIHRyYW5zLT5wYXNzdGhyb3VnaCA9PSBUUkFOU1BPU0VfUFRfVFlQRV9QT1JUUkFJVCkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAidzolZCBoOiVkIC0+IHc6JWQgaDolZCAocGFzc3Rocm91Z2ggbW9kZSlcbiIsCisgICAgICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCwgaW5saW5rLT53LCBpbmxpbmstPmgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmFucy0+cGFzc3Rocm91Z2ggPSBUUkFOU1BPU0VfUFRfVFlQRV9OT05FOworICAgIH0KKworICAgIHRyYW5zLT5oc3ViID0gZGVzY19pbi0+bG9nMl9jaHJvbWFfdzsKKyAgICB0cmFucy0+dnN1YiA9IGRlc2NfaW4tPmxvZzJfY2hyb21hX2g7CisKKyAgICBhdl9pbWFnZV9maWxsX21heF9waXhzdGVwcyh0cmFucy0+cGl4c3RlcHMsIE5VTEwsIGRlc2Nfb3V0KTsKKworICAgIG91dGxpbmstPncgPSBpbmxpbmstPmg7CisgICAgb3V0bGluay0+aCA9IGlubGluay0+dzsKKworICAgIGlmIChpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKQorICAgICAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfZGl2X3EoKEFWUmF0aW9uYWwpIHsgMSwgMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvKTsKKyAgICBlbHNlCisgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgInc6JWQgaDolZCBkaXI6JWQgLT4gdzolZCBoOiVkIHJvdGF0aW9uOiVzIHZmbGlwOiVkXG4iLAorICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCwgdHJhbnMtPmRpciwgb3V0bGluay0+dywgb3V0bGluay0+aCwKKyAgICAgICAgICAgdHJhbnMtPmRpciA9PSAxIHx8IHRyYW5zLT5kaXIgPT0gMyA/ICJjbG9ja3dpc2UiIDogImNvdW50ZXJjbG9ja3dpc2UiLAorICAgICAgICAgICB0cmFucy0+ZGlyID09IDAgfHwgdHJhbnMtPmRpciA9PSAzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEFWRnJhbWUgKmdldF92aWRlb19idWZmZXIoQVZGaWx0ZXJMaW5rICppbmxpbmssIGludCB3LCBpbnQgaCkKK3sKKyAgICBUcmFuc0NvbnRleHQgKnRyYW5zID0gaW5saW5rLT5kc3QtPnByaXY7CisKKyAgICByZXR1cm4gdHJhbnMtPnBhc3N0aHJvdWdoID8KKyAgICAgICAgZmZfbnVsbF9nZXRfdmlkZW9fYnVmZmVyICAgKGlubGluaywgdywgaCkgOgorICAgICAgICBmZl9kZWZhdWx0X2dldF92aWRlb19idWZmZXIoaW5saW5rLCB3LCBoKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgVGhyZWFkRGF0YSB7CisgICAgQVZGcmFtZSAqaW4sICpvdXQ7Cit9IFRocmVhZERhdGE7CisKK3N0YXRpYyBpbnQgZmlsdGVyX3NsaWNlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9qb2JzKQoreworICAgIFRyYW5zQ29udGV4dCAqdHJhbnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBBVkZyYW1lICppbiA9IHRkLT5pbjsKKyAgICBpbnQgcGxhbmU7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgb3V0LT5kYXRhW3BsYW5lXTsgcGxhbmUrKykgeworICAgICAgICBpbnQgaHN1YiAgICA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IHRyYW5zLT5oc3ViIDogMDsKKyAgICAgICAgaW50IHZzdWIgICAgPSBwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIgPyB0cmFucy0+dnN1YiA6IDA7CisgICAgICAgIGludCBwaXhzdGVwID0gdHJhbnMtPnBpeHN0ZXBzW3BsYW5lXTsKKyAgICAgICAgaW50IGluaCAgICAgPSBpbi0+aGVpZ2h0ICA+PiB2c3ViOworICAgICAgICBpbnQgb3V0dyAgICA9IEZGX0NFSUxfUlNISUZUKG91dC0+d2lkdGgsICBoc3ViKTsKKyAgICAgICAgaW50IG91dGggICAgPSBGRl9DRUlMX1JTSElGVChvdXQtPmhlaWdodCwgdnN1Yik7CisgICAgICAgIGludCBzdGFydCAgID0gKG91dGggKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICAgICAgaW50IGVuZCAgICAgPSAob3V0aCAqIChqb2JucisxKSkgLyBuYl9qb2JzOworICAgICAgICB1aW50OF90ICpkc3QsICpzcmM7CisgICAgICAgIGludCBkc3RsaW5lc2l6ZSwgc3JjbGluZXNpemU7CisgICAgICAgIGludCB4LCB5OworCisgICAgICAgIGRzdGxpbmVzaXplID0gb3V0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIGRzdCAgICAgICAgID0gb3V0LT5kYXRhW3BsYW5lXSArIHN0YXJ0ICogZHN0bGluZXNpemU7CisgICAgICAgIHNyYyAgICAgICAgID0gaW4tPmRhdGFbcGxhbmVdOworICAgICAgICBzcmNsaW5lc2l6ZSA9IGluLT5saW5lc2l6ZVtwbGFuZV07CisKKyAgICAgICAgaWYgKHRyYW5zLT5kaXIgJiAxKSB7CisgICAgICAgICAgICBzcmMgICAgICAgICArPSBpbi0+bGluZXNpemVbcGxhbmVdICogKGluaCAtIDEpOworICAgICAgICAgICAgc3JjbGluZXNpemUgKj0gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhbnMtPmRpciAmIDIpIHsKKyAgICAgICAgICAgIGRzdCAgICAgICAgICA9IG91dC0+ZGF0YVtwbGFuZV0gKyBkc3RsaW5lc2l6ZSAqIChvdXRoIC0gc3RhcnQgLSAxKTsKKyAgICAgICAgICAgIGRzdGxpbmVzaXplICo9IC0xOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChwaXhzdGVwKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kOyB5KyssIGRzdCArPSBkc3RsaW5lc2l6ZSkKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgb3V0dzsgeCsrKQorICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSBzcmNbeCAqIHNyY2xpbmVzaXplICsgeV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQ7IHkrKywgZHN0ICs9IGRzdGxpbmVzaXplKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG91dHc7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgKigodWludDE2X3QgKikoZHN0ICsgMiAqIHgpKSA9CisgICAgICAgICAgICAgICAgICAgICAgICAqKCh1aW50MTZfdCAqKShzcmMgKyB4ICogc3JjbGluZXNpemUgKyB5ICogMikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kOyB5KyssIGRzdCArPSBkc3RsaW5lc2l6ZSkgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBvdXR3OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ID0gQVZfUkIyNChzcmMgKyB4ICogc3JjbGluZXNpemUgKyB5ICogMyk7CisgICAgICAgICAgICAgICAgICAgIEFWX1dCMjQoZHN0ICsgMyAqIHgsIHYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBmb3IgKHkgPSBzdGFydDsgeSA8IGVuZDsgeSsrLCBkc3QgKz0gZHN0bGluZXNpemUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgb3V0dzsgeCsrKQorICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCAqKShkc3QgKyA0ICogeCkpID0KKyAgICAgICAgICAgICAgICAgICAgICAgICooKHVpbnQzMl90ICopKHNyYyArIHggKiBzcmNsaW5lc2l6ZSArIHkgKiA0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQ7IHkrKywgZHN0ICs9IGRzdGxpbmVzaXplKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG91dHc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHYgPSBBVl9SQjQ4KHNyYyArIHggKiBzcmNsaW5lc2l6ZSArIHkqNik7CisgICAgICAgICAgICAgICAgICAgIEFWX1dCNDgoZHN0ICsgNip4LCB2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQ7IHkrKywgZHN0ICs9IGRzdGxpbmVzaXplKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG91dHc7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgKigodWludDY0X3QgKikoZHN0ICsgOCp4KSkgPSAqKCh1aW50NjRfdCAqKShzcmMgKyB4ICogc3JjbGluZXNpemUgKyB5KjgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFRyYW5zQ29udGV4dCAqdHJhbnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIFRocmVhZERhdGEgdGQ7CisgICAgQVZGcmFtZSAqb3V0OworCisgICAgaWYgKHRyYW5zLT5wYXNzdGhyb3VnaCkKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBpbik7CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKworICAgIGlmIChpbi0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPT0gMCkgeworICAgICAgICBvdXQtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpbi0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXQtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID0gaW4tPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuOworICAgICAgICBvdXQtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gaW4tPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtOworICAgIH0KKworICAgIHRkLmluID0gaW4sIHRkLm91dCA9IG91dDsKKyAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlLCAmdGQsIE5VTEwsIEZGTUlOKG91dGxpbmstPmgsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihUcmFuc0NvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdHJhbnNwb3NlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJkaXIiLCAic2V0IHRyYW5zcG9zZSBkaXJlY3Rpb24iLCBPRkZTRVQoZGlyKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBUUkFOU1BPU0VfQ0NMT0NLX0ZMSVAgfSwgMCwgNywgRkxBR1MsICJkaXIiIH0sCisgICAgICAgIHsgImNjbG9ja19mbGlwIiwgInJvdGF0ZSBjb3VudGVyLWNsb2Nrd2lzZSB3aXRoIHZlcnRpY2FsIGZsaXAiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gVFJBTlNQT1NFX0NDTE9DS19GTElQIH0sIC51bml0ID0gImRpciIgfSwKKyAgICAgICAgeyAiY2xvY2siLCAgICAgICAicm90YXRlIGNsb2Nrd2lzZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBUUkFOU1BPU0VfQ0xPQ0sgICAgICAgfSwgLnVuaXQgPSAiZGlyIiB9LAorICAgICAgICB7ICJjY2xvY2siLCAgICAgICJyb3RhdGUgY291bnRlci1jbG9ja3dpc2UiLCAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFRSQU5TUE9TRV9DQ0xPQ0sgICAgICB9LCAudW5pdCA9ICJkaXIiIH0sCisgICAgICAgIHsgImNsb2NrX2ZsaXAiLCAgInJvdGF0ZSBjbG9ja3dpc2Ugd2l0aCB2ZXJ0aWNhbCBmbGlwIiwgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gVFJBTlNQT1NFX0NMT0NLX0ZMSVAgIH0sIC51bml0ID0gImRpciIgfSwKKworICAgIHsgInBhc3N0aHJvdWdoIiwgImRvIG5vdCBhcHBseSB0cmFuc3Bvc2l0aW9uIGlmIHRoZSBpbnB1dCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgZ2VvbWV0cnkiLAorICAgICAgT0ZGU0VUKHBhc3N0aHJvdWdoKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1UUkFOU1BPU0VfUFRfVFlQRV9OT05FfSwgIDAsIElOVF9NQVgsIEZMQUdTLCAicGFzc3Rocm91Z2giIH0sCisgICAgICAgIHsgIm5vbmUiLCAgICAgICJhbHdheXMgYXBwbHkgdHJhbnNwb3NpdGlvbiIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVRSQU5TUE9TRV9QVF9UWVBFX05PTkV9LCAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAicGFzc3Rocm91Z2giIH0sCisgICAgICAgIHsgInBvcnRyYWl0IiwgICJwcmVzZXJ2ZSBwb3J0cmFpdCBnZW9tZXRyeSIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVRSQU5TUE9TRV9QVF9UWVBFX1BPUlRSQUlUfSwgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAicGFzc3Rocm91Z2giIH0sCisgICAgICAgIHsgImxhbmRzY2FwZSIsICJwcmVzZXJ2ZSBsYW5kc2NhcGUgZ2VvbWV0cnkiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVRSQU5TUE9TRV9QVF9UWVBFX0xBTkRTQ0FQRX0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAicGFzc3Rocm91Z2giIH0sCisKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHRyYW5zcG9zZSk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl90cmFuc3Bvc2VfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZ2V0X3ZpZGVvX2J1ZmZlciA9IGdldF92aWRlb19idWZmZXIsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX3RyYW5zcG9zZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzX291dHB1dCwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl90cmFuc3Bvc2UgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAidHJhbnNwb3NlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUcmFuc3Bvc2UgaW5wdXQgdmlkZW8uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoVHJhbnNDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZ0cmFuc3Bvc2VfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfdmZfdHJhbnNwb3NlX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX3ZmX3RyYW5zcG9zZV9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl91bnNoYXJwLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdW5zaGFycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDUzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdW5zaGFycC5jCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogT3JpZ2luYWwgY29weXJpZ2h0IChjKSAyMDAyIFJlbWkgR3V5b21hcmNoIDxyZ3V5b21AcG9ib3guY29tPgorICogUG9ydCBjb3B5cmlnaHQgKGMpIDIwMTAgRGFuaWVsIEcuIFRheWxvciA8ZGFuQHByb2dyYW1tZXItYXJ0Lm9yZz4KKyAqIFJlbGljZW5zZWQgdG8gdGhlIExHUEwgd2l0aCBwZXJtaXNzaW9uIGZyb20gUmVtaSBHdXlvbWFyY2guCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGJsdXIgLyBzaGFycGVuIGZpbHRlciwgcG9ydGVkIHRvIEZGbXBlZyBmcm9tIE1QbGF5ZXIKKyAqIGxpYm1wY29kZWNzL3Vuc2hhcnAuYy4KKyAqCisgKiBUaGlzIGNvZGUgaXMgYmFzZWQgb246CisgKgorICogQW4gRWZmaWNpZW50IGFsZ29yaXRobSBmb3IgR2F1c3NpYW4gYmx1ciB1c2luZyBmaW5pdGUtc3RhdGUgbWFjaGluZXMKKyAqIEZyZWRlcmljayBNLiBXYWx0eiBhbmQgSm9obiBXLiBWLiBNaWxsZXIKKyAqCisgKiBTUElFIENvbmYuIG9uIE1hY2hpbmUgVmlzaW9uIFN5c3RlbXMgZm9yIEluc3BlY3Rpb24gYW5kIE1ldHJvbG9neSBWSUkKKyAqIE9yaWdpbmFsbHkgcHVibGlzaGVkIEJvc3RvbiwgTm92IDk4CisgKgorICogaHR0cDovL3d3dy5lbmdpbi51bWQudW1pY2guZWR1L35qd3ZtL2VjZTU4MS8yMV9HQmx1ci5wZGYKKyAqLworCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAidW5zaGFycC5oIgorI2luY2x1ZGUgInVuc2hhcnBfb3BlbmNsLmgiCisKK3N0YXRpYyB2b2lkIGFwcGx5X3Vuc2hhcnAoICAgICAgdWludDhfdCAqZHN0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBVbnNoYXJwRmlsdGVyUGFyYW0gKmZwKQoreworICAgIHVpbnQzMl90ICoqc2MgPSBmcC0+c2M7CisgICAgdWludDMyX3Qgc3JbTUFYX01BVFJJWF9TSVpFIC0gMV0sIHRtcDEsIHRtcDI7CisKKyAgICBpbnQzMl90IHJlczsKKyAgICBpbnQgeCwgeSwgejsKKyAgICBjb25zdCB1aW50OF90ICpzcmMyID0gTlVMTDsgIC8vc2lsZW5jZSBhIHdhcm5pbmcKKyAgICBjb25zdCBpbnQgYW1vdW50ID0gZnAtPmFtb3VudDsKKyAgICBjb25zdCBpbnQgc3RlcHNfeCA9IGZwLT5zdGVwc194OworICAgIGNvbnN0IGludCBzdGVwc195ID0gZnAtPnN0ZXBzX3k7CisgICAgY29uc3QgaW50IHNjYWxlYml0cyA9IGZwLT5zY2FsZWJpdHM7CisgICAgY29uc3QgaW50MzJfdCBoYWxmc2NhbGUgPSBmcC0+aGFsZnNjYWxlOworCisgICAgaWYgKCFhbW91bnQpIHsKKyAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShkc3QsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgMiAqIHN0ZXBzX3k7IHkrKykKKyAgICAgICAgbWVtc2V0KHNjW3ldLCAwLCBzaXplb2Yoc2NbeV1bMF0pICogKHdpZHRoICsgMiAqIHN0ZXBzX3gpKTsKKworICAgIGZvciAoeSA9IC1zdGVwc195OyB5IDwgaGVpZ2h0ICsgc3RlcHNfeTsgeSsrKSB7CisgICAgICAgIGlmICh5IDwgaGVpZ2h0KQorICAgICAgICAgICAgc3JjMiA9IHNyYzsKKworICAgICAgICBtZW1zZXQoc3IsIDAsIHNpemVvZihzclswXSkgKiAoMiAqIHN0ZXBzX3ggLSAxKSk7CisgICAgICAgIGZvciAoeCA9IC1zdGVwc194OyB4IDwgd2lkdGggKyBzdGVwc194OyB4KyspIHsKKyAgICAgICAgICAgIHRtcDEgPSB4IDw9IDAgPyBzcmMyWzBdIDogeCA+PSB3aWR0aCA/IHNyYzJbd2lkdGgtMV0gOiBzcmMyW3hdOworICAgICAgICAgICAgZm9yICh6ID0gMDsgeiA8IHN0ZXBzX3ggKiAyOyB6ICs9IDIpIHsKKyAgICAgICAgICAgICAgICB0bXAyID0gc3JbeiArIDBdICsgdG1wMTsgc3JbeiArIDBdID0gdG1wMTsKKyAgICAgICAgICAgICAgICB0bXAxID0gc3JbeiArIDFdICsgdG1wMjsgc3JbeiArIDFdID0gdG1wMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoeiA9IDA7IHogPCBzdGVwc195ICogMjsgeiArPSAyKSB7CisgICAgICAgICAgICAgICAgdG1wMiA9IHNjW3ogKyAwXVt4ICsgc3RlcHNfeF0gKyB0bXAxOyBzY1t6ICsgMF1beCArIHN0ZXBzX3hdID0gdG1wMTsKKyAgICAgICAgICAgICAgICB0bXAxID0gc2NbeiArIDFdW3ggKyBzdGVwc194XSArIHRtcDI7IHNjW3ogKyAxXVt4ICsgc3RlcHNfeF0gPSB0bXAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHggPj0gc3RlcHNfeCAmJiB5ID49IHN0ZXBzX3kpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcnggPSBzcmMgLSBzdGVwc195ICogc3JjX3N0cmlkZSArIHggLSBzdGVwc194OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzeCAgICAgICA9IGRzdCAtIHN0ZXBzX3kgKiBkc3Rfc3RyaWRlICsgeCAtIHN0ZXBzX3g7CisKKyAgICAgICAgICAgICAgICByZXMgPSAoaW50MzJfdCkqc3J4ICsgKCgoKGludDMyX3QpICogc3J4IC0gKGludDMyX3QpKCh0bXAxICsgaGFsZnNjYWxlKSA+PiBzY2FsZWJpdHMpKSAqIGFtb3VudCkgPj4gMTYpOworICAgICAgICAgICAgICAgICpkc3ggPSBhdl9jbGlwX3VpbnQ4KHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHkgPj0gMCkgeworICAgICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBhcHBseV91bnNoYXJwX2MoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQpCit7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBVbnNoYXJwQ29udGV4dCAqdW5zaGFycCA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgcGxhbmVfd1szXSwgcGxhbmVfaFszXTsKKyAgICBVbnNoYXJwRmlsdGVyUGFyYW0gKmZwWzNdOworICAgIHBsYW5lX3dbMF0gPSBpbmxpbmstPnc7CisgICAgcGxhbmVfd1sxXSA9IHBsYW5lX3dbMl0gPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPncsIHVuc2hhcnAtPmhzdWIpOworICAgIHBsYW5lX2hbMF0gPSBpbmxpbmstPmg7CisgICAgcGxhbmVfaFsxXSA9IHBsYW5lX2hbMl0gPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHVuc2hhcnAtPnZzdWIpOworICAgIGZwWzBdID0gJnVuc2hhcnAtPmx1bWE7CisgICAgZnBbMV0gPSBmcFsyXSA9ICZ1bnNoYXJwLT5jaHJvbWE7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBhcHBseV91bnNoYXJwKG91dC0+ZGF0YVtpXSwgb3V0LT5saW5lc2l6ZVtpXSwgaW4tPmRhdGFbaV0sIGluLT5saW5lc2l6ZVtpXSwgcGxhbmVfd1tpXSwgcGxhbmVfaFtpXSwgZnBbaV0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2ZpbHRlcl9wYXJhbShVbnNoYXJwRmlsdGVyUGFyYW0gKmZwLCBpbnQgbXNpemVfeCwgaW50IG1zaXplX3ksIGZsb2F0IGFtb3VudCkKK3sKKyAgICBmcC0+bXNpemVfeCA9IG1zaXplX3g7CisgICAgZnAtPm1zaXplX3kgPSBtc2l6ZV95OworICAgIGZwLT5hbW91bnQgPSBhbW91bnQgKiA2NTUzNi4wOworCisgICAgZnAtPnN0ZXBzX3ggPSBtc2l6ZV94IC8gMjsKKyAgICBmcC0+c3RlcHNfeSA9IG1zaXplX3kgLyAyOworICAgIGZwLT5zY2FsZWJpdHMgPSAoZnAtPnN0ZXBzX3ggKyBmcC0+c3RlcHNfeSkgKiAyOworICAgIGZwLT5oYWxmc2NhbGUgPSAxIDw8IChmcC0+c2NhbGViaXRzIC0gMSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCByZXQgPSAwOworICAgIFVuc2hhcnBDb250ZXh0ICp1bnNoYXJwID0gY3R4LT5wcml2OworCisKKyAgICBzZXRfZmlsdGVyX3BhcmFtKCZ1bnNoYXJwLT5sdW1hLCAgIHVuc2hhcnAtPmxtc2l6ZV94LCB1bnNoYXJwLT5sbXNpemVfeSwgdW5zaGFycC0+bGFtb3VudCk7CisgICAgc2V0X2ZpbHRlcl9wYXJhbSgmdW5zaGFycC0+Y2hyb21hLCB1bnNoYXJwLT5jbXNpemVfeCwgdW5zaGFycC0+Y21zaXplX3ksIHVuc2hhcnAtPmNhbW91bnQpOworCisgICAgdW5zaGFycC0+YXBwbHlfdW5zaGFycCA9IGFwcGx5X3Vuc2hhcnBfYzsKKyAgICBpZiAoIUNPTkZJR19PUEVOQ0wgJiYgdW5zaGFycC0+b3BlbmNsKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBzdXBwb3J0IHdhcyBub3QgZW5hYmxlZCBpbiB0aGlzIGJ1aWxkLCBjYW5ub3QgYmUgc2VsZWN0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoQ09ORklHX09QRU5DTCAmJiB1bnNoYXJwLT5vcGVuY2wpIHsKKyAgICAgICAgdW5zaGFycC0+YXBwbHlfdW5zaGFycCA9IGZmX29wZW5jbF9hcHBseV91bnNoYXJwOworICAgICAgICByZXQgPSBmZl9vcGVuY2xfdW5zaGFycF9pbml0KGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgIEFWX1BJWF9GTVRfWVVWNDIyUCwgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLCAgQVZfUElYX0ZNVF9ZVVY0NDBQLCAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDQwUCwgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfZmlsdGVyX3BhcmFtKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBVbnNoYXJwRmlsdGVyUGFyYW0gKmZwLCBjb25zdCBjaGFyICplZmZlY3RfdHlwZSwgaW50IHdpZHRoKQoreworICAgIGludCB6OworICAgIGNvbnN0IGNoYXIgKmVmZmVjdCA9IGZwLT5hbW91bnQgPT0gMCA/ICJub25lIiA6IGZwLT5hbW91bnQgPCAwID8gImJsdXIiIDogInNoYXJwZW4iOworCisgICAgaWYgICghKGZwLT5tc2l6ZV94ICYgZnAtPm1zaXplX3kgJiAxKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBldmVuIHNpemUgZm9yICVzIG1hdHJpeCBzaXplICVkeCVkXG4iLAorICAgICAgICAgICAgICAgZWZmZWN0X3R5cGUsIGZwLT5tc2l6ZV94LCBmcC0+bXNpemVfeSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJlZmZlY3Q6JXMgdHlwZTolcyBtc2l6ZV94OiVkIG1zaXplX3k6JWQgYW1vdW50OiUwLjJmXG4iLAorICAgICAgICAgICBlZmZlY3QsIGVmZmVjdF90eXBlLCBmcC0+bXNpemVfeCwgZnAtPm1zaXplX3ksIGZwLT5hbW91bnQgLyA2NTUzNS4wKTsKKworICAgIGZvciAoeiA9IDA7IHogPCAyICogZnAtPnN0ZXBzX3k7IHorKykKKyAgICAgICAgaWYgKCEoZnAtPnNjW3pdID0gYXZfbWFsbG9jX2FycmF5KHdpZHRoICsgMiAqIGZwLT5zdGVwc194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCooZnAtPnNjW3pdKSkpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIFVuc2hhcnBDb250ZXh0ICp1bnNoYXJwID0gbGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQobGluay0+Zm9ybWF0KTsKKyAgICBpbnQgcmV0OworCisgICAgdW5zaGFycC0+aHN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgdW5zaGFycC0+dnN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisKKyAgICByZXQgPSBpbml0X2ZpbHRlcl9wYXJhbShsaW5rLT5kc3QsICZ1bnNoYXJwLT5sdW1hLCAgICJsdW1hIiwgICBsaW5rLT53KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXQgPSBpbml0X2ZpbHRlcl9wYXJhbShsaW5rLT5kc3QsICZ1bnNoYXJwLT5jaHJvbWEsICJjaHJvbWEiLCBGRl9DRUlMX1JTSElGVChsaW5rLT53LCB1bnNoYXJwLT5oc3ViKSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9maWx0ZXJfcGFyYW0oVW5zaGFycEZpbHRlclBhcmFtICpmcCkKK3sKKyAgICBpbnQgejsKKworICAgIGZvciAoeiA9IDA7IHogPCAyICogZnAtPnN0ZXBzX3k7IHorKykKKyAgICAgICAgYXZfZnJlZShmcC0+c2Nbel0pOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBVbnNoYXJwQ29udGV4dCAqdW5zaGFycCA9IGN0eC0+cHJpdjsKKworICAgIGlmIChDT05GSUdfT1BFTkNMICYmIHVuc2hhcnAtPm9wZW5jbCkgeworICAgICAgICBmZl9vcGVuY2xfdW5zaGFycF91bmluaXQoY3R4KTsKKyAgICB9CisKKyAgICBmcmVlX2ZpbHRlcl9wYXJhbSgmdW5zaGFycC0+bHVtYSk7CisgICAgZnJlZV9maWx0ZXJfcGFyYW0oJnVuc2hhcnAtPmNocm9tYSk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgVW5zaGFycENvbnRleHQgKnVuc2hhcnAgPSBsaW5rLT5kc3QtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rICAgPSBsaW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludCByZXQgPSAwOworCisgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgaWYgKENPTkZJR19PUEVOQ0wgJiYgdW5zaGFycC0+b3BlbmNsKSB7CisgICAgICAgIHJldCA9IGZmX29wZW5jbF91bnNoYXJwX3Byb2Nlc3NfaW5vdXRfYnVmKGxpbmstPmRzdCwgaW4sIG91dCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgcmV0ID0gdW5zaGFycC0+YXBwbHlfdW5zaGFycChsaW5rLT5kc3QsIGluLCBvdXQpOworZW5kOgorICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVW5zaGFycENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorI2RlZmluZSBNSU5fU0laRSAzCisjZGVmaW5lIE1BWF9TSVpFIDYzCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdW5zaGFycF9vcHRpb25zW10gPSB7CisgICAgeyAibHVtYV9tc2l6ZV94IiwgICAic2V0IGx1bWEgbWF0cml4IGhvcml6b250YWwgc2l6ZSIsICAgT0ZGU0VUKGxtc2l6ZV94KSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDUgfSwgTUlOX1NJWkUsIE1BWF9TSVpFLCBGTEFHUyB9LAorICAgIHsgImx4IiwgICAgICAgICAgICAgInNldCBsdW1hIG1hdHJpeCBob3Jpem9udGFsIHNpemUiLCAgIE9GRlNFVChsbXNpemVfeCksIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSA1IH0sIE1JTl9TSVpFLCBNQVhfU0laRSwgRkxBR1MgfSwKKyAgICB7ICJsdW1hX21zaXplX3kiLCAgICJzZXQgbHVtYSBtYXRyaXggdmVydGljYWwgc2l6ZSIsICAgICBPRkZTRVQobG1zaXplX3kpLCBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gNSB9LCBNSU5fU0laRSwgTUFYX1NJWkUsIEZMQUdTIH0sCisgICAgeyAibHkiLCAgICAgICAgICAgICAic2V0IGx1bWEgbWF0cml4IHZlcnRpY2FsIHNpemUiLCAgICAgT0ZGU0VUKGxtc2l6ZV95KSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDUgfSwgTUlOX1NJWkUsIE1BWF9TSVpFLCBGTEFHUyB9LAorICAgIHsgImx1bWFfYW1vdW50IiwgICAgInNldCBsdW1hIGVmZmVjdCBzdHJlbmd0aCIsICAgICAgICAgIE9GRlNFVChsYW1vdW50KSwgIEFWX09QVF9UWVBFX0ZMT0FULCB7IC5kYmwgPSAxIH0sICAgICAgIC0yLCAgICAgICAgNSwgRkxBR1MgfSwKKyAgICB7ICJsYSIsICAgICAgICAgICAgICJzZXQgbHVtYSBlZmZlY3Qgc3RyZW5ndGgiLCAgICAgICAgICBPRkZTRVQobGFtb3VudCksICBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gMSB9LCAgICAgICAtMiwgICAgICAgIDUsIEZMQUdTIH0sCisgICAgeyAiY2hyb21hX21zaXplX3giLCAic2V0IGNocm9tYSBtYXRyaXggaG9yaXpvbnRhbCBzaXplIiwgT0ZGU0VUKGNtc2l6ZV94KSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDUgfSwgTUlOX1NJWkUsIE1BWF9TSVpFLCBGTEFHUyB9LAorICAgIHsgImN4IiwgICAgICAgICAgICAgInNldCBjaHJvbWEgbWF0cml4IGhvcml6b250YWwgc2l6ZSIsIE9GRlNFVChjbXNpemVfeCksIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSA1IH0sIE1JTl9TSVpFLCBNQVhfU0laRSwgRkxBR1MgfSwKKyAgICB7ICJjaHJvbWFfbXNpemVfeSIsICJzZXQgY2hyb21hIG1hdHJpeCB2ZXJ0aWNhbCBzaXplIiwgICBPRkZTRVQoY21zaXplX3kpLCBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gNSB9LCBNSU5fU0laRSwgTUFYX1NJWkUsIEZMQUdTIH0sCisgICAgeyAiY3kiLCAgICAgICAgICAgICAic2V0IGNocm9tYSBtYXRyaXggdmVydGljYWwgc2l6ZSIsICAgT0ZGU0VUKGNtc2l6ZV95KSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDUgfSwgTUlOX1NJWkUsIE1BWF9TSVpFLCBGTEFHUyB9LAorICAgIHsgImNocm9tYV9hbW91bnQiLCAgInNldCBjaHJvbWEgZWZmZWN0IHN0cmVuZ3RoIiwgICAgICAgIE9GRlNFVChjYW1vdW50KSwgIEFWX09QVF9UWVBFX0ZMT0FULCB7IC5kYmwgPSAwIH0sICAgICAgIC0yLCAgICAgICAgNSwgRkxBR1MgfSwKKyAgICB7ICJjYSIsICAgICAgICAgICAgICJzZXQgY2hyb21hIGVmZmVjdCBzdHJlbmd0aCIsICAgICAgICBPRkZTRVQoY2Ftb3VudCksICBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gMCB9LCAgICAgICAtMiwgICAgICAgIDUsIEZMQUdTIH0sCisgICAgeyAib3BlbmNsIiwgICAgICAgICAidXNlIE9wZW5DTCBmaWx0ZXJpbmcgY2FwYWJpbGl0aWVzIiwgT0ZGU0VUKG9wZW5jbCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAgICAgICAgMCwgICAgICAgIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyh1bnNoYXJwKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX3Vuc2hhcnBfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl91bnNoYXJwX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl91bnNoYXJwID0geworICAgIC5uYW1lICAgICAgICAgID0gInVuc2hhcnAiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNoYXJwZW4gb3IgYmx1ciB0aGUgaW5wdXQgdmlkZW8uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoVW5zaGFycENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnVuc2hhcnBfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGF2ZmlsdGVyX3ZmX3Vuc2hhcnBfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfdmZfdW5zaGFycF9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3ZmbGlwLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdmZsaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTRhZTBlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3ZmbGlwLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQm9iYnkgQmluZ2hhbQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiB2aWRlbyB2ZXJ0aWNhbCBmbGlwIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCBGbGlwQ29udGV4dCB7CisgICAgaW50IHZzdWI7ICAgLy8vPCB2ZXJ0aWNhbCBjaHJvbWEgc3Vic2FtcGxpbmcKK30gRmxpcENvbnRleHQ7CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBGbGlwQ29udGV4dCAqZmxpcCA9IGxpbmstPmRzdC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGxpbmstPmZvcm1hdCk7CisKKyAgICBmbGlwLT52c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQVZGcmFtZSAqZ2V0X3ZpZGVvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmxpbmssIGludCB3LCBpbnQgaCkKK3sKKyAgICBGbGlwQ29udGV4dCAqZmxpcCA9IGxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBpbnQgaTsKKworICAgIGZyYW1lID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihsaW5rLT5kc3QtPm91dHB1dHNbMF0sIHcsIGgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKyspIHsKKyAgICAgICAgaW50IHZzdWIgPSBpID09IDEgfHwgaSA9PSAyID8gZmxpcC0+dnN1YiA6IDA7CisgICAgICAgIGludCBoZWlnaHQgPSBGRl9DRUlMX1JTSElGVChoLCB2c3ViKTsKKworICAgICAgICBpZiAoZnJhbWUtPmRhdGFbaV0pIHsKKyAgICAgICAgICAgIGZyYW1lLT5kYXRhW2ldICs9IChoZWlnaHQgLSAxKSAqIGZyYW1lLT5saW5lc2l6ZVtpXTsKKyAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVtpXSA9IC1mcmFtZS0+bGluZXNpemVbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWU7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgRmxpcENvbnRleHQgKmZsaXAgPSBsaW5rLT5kc3QtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArKykgeworICAgICAgICBpbnQgdnN1YiA9IGkgPT0gMSB8fCBpID09IDIgPyBmbGlwLT52c3ViIDogMDsKKyAgICAgICAgaW50IGhlaWdodCA9IEZGX0NFSUxfUlNISUZUKGxpbmstPmgsIHZzdWIpOworCisgICAgICAgIGlmIChmcmFtZS0+ZGF0YVtpXSkgeworICAgICAgICAgICAgZnJhbWUtPmRhdGFbaV0gKz0gKGhlaWdodCAtIDEpICogZnJhbWUtPmxpbmVzaXplW2ldOworICAgICAgICAgICAgZnJhbWUtPmxpbmVzaXplW2ldID0gLWZyYW1lLT5saW5lc2l6ZVtpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUobGluay0+ZHN0LT5vdXRwdXRzWzBdLCBmcmFtZSk7Cit9CitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfdmZsaXBfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5nZXRfdmlkZW9fYnVmZmVyID0gZ2V0X3ZpZGVvX2J1ZmZlciwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgICAgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgICAgID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl92ZmxpcF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfdmZsaXAgPSB7CisgICAgLm5hbWUgICAgICAgID0gInZmbGlwIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmxpcCB0aGUgaW5wdXQgdmlkZW8gdmVydGljYWxseS4iKSwKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoRmxpcENvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICA9IGF2ZmlsdGVyX3ZmX3ZmbGlwX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgPSBhdmZpbHRlcl92Zl92ZmxpcF9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl92aWRzdGFiZGV0ZWN0LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdmlkc3RhYmRldGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZjZmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdmlkc3RhYmRldGVjdC5jCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIEdlb3JnIE1hcnRpdXMgPGdlb3JnIGRvdCBtYXJ0aXVzIGF0IHdlYiBkb3QgZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgREVGQVVMVF9SRVNVTFRfTkFNRSAgICAgInRyYW5zZm9ybXMudHJmIgorCisjaW5jbHVkZSA8dmlkLnN0YWIvbGlidmlkc3RhYi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJ2aWRzdGFidXRpbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgVlNNb3Rpb25EZXRlY3QgbWQ7CisgICAgVlNNb3Rpb25EZXRlY3RDb25maWcgY29uZjsKKworICAgIGNoYXIgKnJlc3VsdDsKKyAgICBGSUxFICpmOworfSBTdGFiRGF0YTsKKworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTdGFiRGF0YSwgeCkKKyNkZWZpbmUgT0ZGU0VUQyh4KSAob2Zmc2V0b2YoU3RhYkRhdGEsIGNvbmYpK29mZnNldG9mKFZTTW90aW9uRGV0ZWN0Q29uZmlnLCB4KSkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiB2aWRzdGFiZGV0ZWN0X29wdGlvbnNbXSA9IHsKKyAgICB7InJlc3VsdCIsICAgICAgInBhdGggdG8gdGhlIGZpbGUgdXNlZCB0byB3cml0ZSB0aGUgdHJhbnNmb3JtcyIsICAgICAgICAgICAgICAgICBPRkZTRVQocmVzdWx0KSwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IERFRkFVTFRfUkVTVUxUX05BTUV9LCAuZmxhZ3MgPSBGTEFHU30sCisgICAgeyJzaGFraW5lc3MiLCAgICJob3cgc2hha3kgaXMgdGhlIHZpZGVvIGFuZCBob3cgcXVpY2sgaXMgdGhlIGNhbWVyYT8iCisgICAgICAgICAgICAgICAgICAgICIgMTogbGl0dGxlIChmYXN0KSAxMDogdmVyeSBzdHJvbmcvcXVpY2sgKHNsb3cpIiwgICAgICAgICAgICAgICAgT0ZGU0VUQyhzaGFraW5lc3MpLCAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSA1fSwgICAgICAxLCAgMTAsIEZMQUdTfSwKKyAgICB7ImFjY3VyYWN5IiwgICAgIig+PXNoYWtpbmVzcykgMTogbG93IDE1OiBoaWdoIChzbG93KSIsICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVRDKGFjY3VyYWN5KSwgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDE1fSwgICAgIDEsICAxNSwgRkxBR1N9LAorICAgIHsic3RlcHNpemUiLCAgICAicmVnaW9uIGFyb3VuZCBtaW5pbXVtIGlzIHNjYW5uZWQgd2l0aCAxIHBpeGVsIHJlc29sdXRpb24iLCAgICAgIE9GRlNFVEMoc3RlcFNpemUpLCAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gNn0sICAgICAgMSwgIDMyLCBGTEFHU30sCisgICAgeyJtaW5jb250cmFzdCIsICJiZWxvdyB0aGlzIGNvbnRyYXN0IGEgZmllbGQgaXMgZGlzY2FyZGVkICgwLTEpIiwgICAgICAgICAgICAgICAgT0ZGU0VUQyhjb250cmFzdFRocmVzaG9sZCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmwgPSAwLjI1fSwgMC4wLCAxLjAsIEZMQUdTfSwKKyAgICB7InNob3ciLCAgICAgICAgIjA6IGRyYXcgbm90aGluZzsgMSwyOiBzaG93IGZpZWxkcyBhbmQgdHJhbnNmb3JtcyIsICAgICAgICAgICAgICBPRkZTRVRDKHNob3cpLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDB9LCAgICAgIDAsICAgMiwgRkxBR1N9LAorICAgIHsidHJpcG9kIiwgICAgICAidmlydHVhbCB0cmlwb2QgbW9kZSAoaWYgPjApOiBtb3Rpb24gaXMgY29tcGFyZWQgdG8gYSByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgICAgICIgcmVmZXJlbmNlIGZyYW1lIChmcmFtZSAjIGlzIHRoZSB2YWx1ZSkiLCAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUQyh2aXJ0dWFsVHJpcG9kKSwgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgRkxBR1N9LAorICAgIHtOVUxMfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHZpZHN0YWJkZXRlY3QpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTdGFiRGF0YSAqc2QgPSBjdHgtPnByaXY7CisgICAgZmZfdnNfaW5pdCgpOworICAgIHNkLT5jbGFzcyA9ICZ2aWRzdGFiZGV0ZWN0X2NsYXNzOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAidmlkc3RhYmRldGVjdCBmaWx0ZXI6IGluaXQgJXNcbiIsIExJQlZJRFNUQUJfVkVSU0lPTik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFN0YWJEYXRhICpzZCA9IGN0eC0+cHJpdjsKKyAgICBWU01vdGlvbkRldGVjdCAqbWQgPSAmKHNkLT5tZCk7CisKKyAgICBpZiAoc2QtPmYpIHsKKyAgICAgICAgZmNsb3NlKHNkLT5mKTsKKyAgICAgICAgc2QtPmYgPSBOVUxMOworICAgIH0KKworICAgIHZzTW90aW9uRGV0ZWN0aW9uQ2xlYW51cChtZCk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICAvLyBJZiB5b3UgYWRkIHNvbWV0aGluZyBoZXJlIGFsc28gYWRkIGl0IGluIHZpZHN0YWJ1dGlscy5jCisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLCAgQVZfUElYX0ZNVF9ZVVY0MTBQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsICBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX0JHUjI0LCBBVl9QSVhfRk1UX1JHQkEsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgU3RhYkRhdGEgKnNkID0gY3R4LT5wcml2OworCisgICAgVlNNb3Rpb25EZXRlY3QqIG1kID0gJihzZC0+bWQpOworICAgIFZTRnJhbWVJbmZvIGZpOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworCisgICAgdnNGcmFtZUluZm9Jbml0KCZmaSwgaW5saW5rLT53LCBpbmxpbmstPmgsCisgICAgICAgICAgICAgICAgICAgIGZmX2F2MnZzX3BpeGZtdChjdHgsIGlubGluay0+Zm9ybWF0KSk7CisgICAgaWYgKGZpLmJ5dGVzUGVyUGl4ZWwgIT0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGRlc2MpLzgpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAicGl4ZWwtZm9ybWF0IGVycm9yOiB3cm9uZyBiaXRzL3Blci9waXhlbCwgcGxlYXNlIHJlcG9ydCBhIEJVRyIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoZmkubG9nMkNocm9tYVcgIT0gZGVzYy0+bG9nMl9jaHJvbWFfdykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJwaXhlbC1mb3JtYXQgZXJyb3I6IGxvZzJfY2hyb21hX3csIHBsZWFzZSByZXBvcnQgYSBCVUciKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoZmkubG9nMkNocm9tYUggIT0gZGVzYy0+bG9nMl9jaHJvbWFfaCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJwaXhlbC1mb3JtYXQgZXJyb3I6IGxvZzJfY2hyb21hX2gsIHBsZWFzZSByZXBvcnQgYSBCVUciKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvLyBzZXQgdmFsdWVzIHRoYXQgYXJlIG5vdCBpbml0aWFsaXplZCBieSB0aGUgb3B0aW9ucworICAgIHNkLT5jb25mLmFsZ28gICAgID0gMTsKKyAgICBzZC0+Y29uZi5tb2ROYW1lICA9ICJ2aWRzdGFiZGV0ZWN0IjsKKyAgICBpZiAodnNNb3Rpb25EZXRlY3RJbml0KG1kLCAmc2QtPmNvbmYsICZmaSkgIT0gVlNfT0spIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW5pdGlhbGl6YXRpb24gb2YgTW90aW9uIERldGVjdGlvbiBmYWlsZWQsIHBsZWFzZSByZXBvcnQgYSBCVUciKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICB2c01vdGlvbkRldGVjdEdldENvbmZpZygmc2QtPmNvbmYsIG1kKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlZpZGVvIHN0YWJpbGl6YXRpb24gc2V0dGluZ3MgKHBhc3MgMS8yKTpcbiIpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiICAgICBzaGFraW5lc3MgPSAlZFxuIiwgc2QtPmNvbmYuc2hha2luZXNzKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiAgICAgIGFjY3VyYWN5ID0gJWRcbiIsIHNkLT5jb25mLmFjY3VyYWN5KTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiAgICAgIHN0ZXBzaXplID0gJWRcbiIsIHNkLT5jb25mLnN0ZXBTaXplKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiAgIG1pbmNvbnRyYXN0ID0gJWZcbiIsIHNkLT5jb25mLmNvbnRyYXN0VGhyZXNob2xkKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiAgICAgICAgdHJpcG9kID0gJWRcbiIsIHNkLT5jb25mLnZpcnR1YWxUcmlwb2QpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiICAgICAgICAgIHNob3cgPSAlZFxuIiwgc2QtPmNvbmYuc2hvdyk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgICAgICAgIHJlc3VsdCA9ICVzXG4iLCBzZC0+cmVzdWx0KTsKKworICAgIHNkLT5mID0gZm9wZW4oc2QtPnJlc3VsdCwgInciKTsKKyAgICBpZiAoc2QtPmYgPT0gTlVMTCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJjYW5ub3Qgb3BlbiB0cmFuc2Zvcm0gZmlsZSAlc1xuIiwgc2QtPnJlc3VsdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHZzUHJlcGFyZUZpbGUobWQsIHNkLT5mKSAhPSBWU19PSykgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiY2Fubm90IHdyaXRlIHRvIHRyYW5zZm9ybSBmaWxlICVzXG4iLCBzZC0+cmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFN0YWJEYXRhICpzZCA9IGN0eC0+cHJpdjsKKyAgICBWU01vdGlvbkRldGVjdCAqbWQgPSAmKHNkLT5tZCk7CisgICAgTG9jYWxNb3Rpb25zIGxvY2FsbW90aW9uczsKKworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworICAgIFZTRnJhbWUgZnJhbWU7CisgICAgaW50IHBsYW5lOworCisgICAgaWYgKHNkLT5jb25mLnNob3cgPiAwICYmICFhdl9mcmFtZV9pc193cml0YWJsZShpbikpCisgICAgICAgIGF2X2ZyYW1lX21ha2Vfd3JpdGFibGUoaW4pOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgbWQtPmZpLnBsYW5lczsgcGxhbmUrKykgeworICAgICAgICBmcmFtZS5kYXRhW3BsYW5lXSA9IGluLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgZnJhbWUubGluZXNpemVbcGxhbmVdID0gaW4tPmxpbmVzaXplW3BsYW5lXTsKKyAgICB9CisgICAgaWYgKHZzTW90aW9uRGV0ZWN0aW9uKG1kLCAmbG9jYWxtb3Rpb25zLCAmZnJhbWUpICE9IFZTX09LKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIm1vdGlvbiBkZXRlY3Rpb24gZmFpbGVkIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEFWRVJST1JfRVhURVJOQUwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh2c1dyaXRlVG9GaWxlKG1kLCBzZC0+ZiwgJmxvY2FsbW90aW9ucykgIT0gVlNfT0spIHsKKyAgICAgICAgICAgIGludCByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImNhbm5vdCB3cml0ZSB0byB0cmFuc2Zvcm0gZmlsZSIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICB2c192ZWN0b3JfZGVsKCZsb2NhbG1vdGlvbnMpOworICAgIH0KKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgaW4pOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfdmlkc3RhYmRldGVjdF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX3ZpZHN0YWJkZXRlY3Rfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3ZpZHN0YWJkZXRlY3QgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAidmlkc3RhYmRldGVjdCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRXh0cmFjdCByZWxhdGl2ZSB0cmFuc2Zvcm1hdGlvbnMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXNzIDEgb2YgMiBmb3Igc3RhYmlsaXphdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHNlZSB2aWRzdGFidHJhbnNmb3JtIGZvciBwYXNzIDIpLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFN0YWJEYXRhKSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfdmZfdmlkc3RhYmRldGVjdF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl92Zl92aWRzdGFiZGV0ZWN0X291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmdmlkc3RhYmRldGVjdF9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdmlkc3RhYnRyYW5zZm9ybS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3ZpZHN0YWJ0cmFuc2Zvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI2YTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3ZpZHN0YWJ0cmFuc2Zvcm0uYwpAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBHZW9yZyBNYXJ0aXVzIDxnZW9yZyBkb3QgbWFydGl1cyBhdCB3ZWIgZG90IGRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIERFRkFVTFRfSU5QVVRfTkFNRSAgICAgInRyYW5zZm9ybXMudHJmIgorCisjaW5jbHVkZSA8dmlkLnN0YWIvbGlidmlkc3RhYi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJ2aWRzdGFidXRpbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgVlNUcmFuc2Zvcm1EYXRhIHRkOworICAgIFZTVHJhbnNmb3JtQ29uZmlnIGNvbmY7CisKKyAgICBWU1RyYW5zZm9ybWF0aW9ucyB0cmFuczsgICAgLy8gdHJhbnNmb3JtYXRpb25zCisgICAgY2hhciAqaW5wdXQ7ICAgICAgICAgICAgICAgIC8vIG5hbWUgb2YgdHJhbnNmb3JtIGZpbGUKKyAgICBpbnQgdHJpcG9kOworICAgIGludCBkZWJ1ZzsKK30gVHJhbnNmb3JtQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVHJhbnNmb3JtQ29udGV4dCwgeCkKKyNkZWZpbmUgT0ZGU0VUQyh4KSAob2Zmc2V0b2YoVHJhbnNmb3JtQ29udGV4dCwgY29uZikrb2Zmc2V0b2YoVlNUcmFuc2Zvcm1Db25maWcsIHgpKQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHZpZHN0YWJ0cmFuc2Zvcm1fb3B0aW9uc1tdID0geworICAgIHsiaW5wdXQiLCAgICAgInNldCBwYXRoIHRvIHRoZSBmaWxlIHN0b3JpbmcgdGhlIHRyYW5zZm9ybXMiLCBPRkZTRVQoaW5wdXQpLAorICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBERUZBVUxUX0lOUFVUX05BTUV9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsic21vb3RoaW5nIiwgInNldCBudW1iZXIgb2YgZnJhbWVzKjIgKyAxIHVzZWQgZm9yIGxvd3Bhc3MgZmlsdGVyaW5nIiwgT0ZGU0VUQyhzbW9vdGhpbmcpLAorICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAxNX0sICAgICAgIDAsIDEwMDAsIEZMQUdTfSwKKworICAgIHsib3B0YWxnbyIsICAgInNldCBjYW1lcmEgcGF0aCBvcHRpbWl6YXRpb24gYWxnbyIsIE9GRlNFVEMoY2FtUGF0aEFsZ28pLAorICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSBWU09wdGltYWxMMX0sIFZTT3B0aW1hbEwxLCBWU0F2ZywgRkxBR1MsICJvcHRhbGdvIn0sCisgICAgeyAgIm9wdCIsICAgICAiZ2xvYmFsIG9wdGltaXphdGlvbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvLyBmcm9tIHZlcnNpb24gMS4wIG9uCisgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IFZTT3B0aW1hbEwxIH0sIDAsIDAsIEZMQUdTLCAib3B0YWxnbyJ9LAorICAgIHsgICJnYXVzcyIsICAgImdhdXNzaWFuIGtlcm5lbCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gVlNHYXVzc2lhbiB9LCAwLCAwLCBGTEFHUywgICJvcHRhbGdvIn0sCisgICAgeyAgImF2ZyIsICAgICAic2ltcGxlIGF2ZXJhZ2luZyBvbiBtb3Rpb24iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBWU0F2ZyB9LCAgICAgIDAsIDAsIEZMQUdTLCAgIm9wdGFsZ28ifSwKKworICAgIHsibWF4c2hpZnQiLCAgInNldCBtYXhpbWFsIG51bWJlciBvZiBwaXhlbHMgdG8gdHJhbnNsYXRlIGltYWdlIiwgT0ZGU0VUQyhtYXhTaGlmdCksCisgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IC0xfSwgICAgICAtMSwgNTAwLCAgRkxBR1N9LAorICAgIHsibWF4YW5nbGUiLCAgInNldCBtYXhpbWFsIGFuZ2xlIGluIHJhZCB0byByb3RhdGUgaW1hZ2UiLCBPRkZTRVRDKG1heEFuZ2xlKSwKKyAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gLTEuMH0sICAtMS4wLCAzLjE0LCBGTEFHU30sCisKKyAgICB7ImNyb3AiLCAgICAgICJzZXQgY3JvcHBpbmcgbW9kZSIsIE9GRlNFVEMoY3JvcCksCisgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDB9LCAgICAgICAgMCwgMSwgICAgRkxBR1MsICJjcm9wIn0sCisgICAgeyAgImtlZXAiLCAgICAia2VlcCBib3JkZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBWU0tlZXBCb3JkZXIgfSwgMCwgMCwgRkxBR1MsICJjcm9wIn0sCisgICAgeyAgImJsYWNrIiwgICAiYmxhY2sgYm9yZGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBWU0Nyb3BCb3JkZXIgfSwgMCwgMCwgRkxBR1MsICJjcm9wIn0sCisKKyAgICB7ImludmVydCIsICAgICJpbnZlcnQgdHJhbnNmb3JtcyIsIE9GRlNFVEMoaW52ZXJ0KSwKKyAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMH0sICAgICAgICAwLCAxLCAgICBGTEFHU30sCisgICAgeyJyZWxhdGl2ZSIsICAiY29uc2lkZXIgdHJhbnNmb3JtcyBhcyByZWxhdGl2ZSIsIE9GRlNFVEMocmVsYXRpdmUpLAorICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAxfSwgICAgICAgIDAsIDEsICAgIEZMQUdTfSwKKyAgICB7Inpvb20iLCAgICAgICJzZXQgcGVyY2VudGFnZSB0byB6b29tICg+MDogem9vbSBpbiwgPDA6IHpvb20gb3V0IiwgT0ZGU0VUQyh6b29tKSwKKyAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gMH0sICAgICAtMTAwLCAxMDAsICBGTEFHU30sCisgICAgeyJvcHR6b29tIiwgICAic2V0IG9wdGltYWwgem9vbSAoMDogbm90aGluZywgMTogb3B0aW1hbCBzdGF0aWMgem9vbSwgMjogb3B0aW1hbCBkeW5hbWljIHpvb20pIiwgT0ZGU0VUQyhvcHRab29tKSwKKyAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMX0sICAgICAgICAwLCAyLCAgICBGTEFHU30sCisgICAgeyJ6b29tc3BlZWQiLCAiZm9yIGFkYXRpdmUgem9vbTogcGVyY2VudCB0byB6b29tIG1heGltYWxseSBlYWNoIGZyYW1lIiwgICAgICAgICBPRkZTRVRDKHpvb21TcGVlZCksCisgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibCA9IDAuMjV9LCAgICAgMCwgNSwgICAgRkxBR1N9LAorCisgICAgeyJpbnRlcnBvbCIsICAic2V0IHR5cGUgb2YgaW50ZXJwb2xhdGlvbiIsIE9GRlNFVEMoaW50ZXJwb2xUeXBlKSwKKyAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMn0sICAgICAgICAwLCAzLCAgICBGTEFHUywgImludGVycG9sIn0sCisgICAgeyAgIm5vIiwgICAgICAibm8gaW50ZXJwb2xhdGlvbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBWU19aZXJvICB9LCAgMCwgMCwgIEZMQUdTLCAiaW50ZXJwb2wifSwKKyAgICB7ICAibGluZWFyIiwgICJsaW5lYXIgKGhvcml6b250YWwpIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IFZTX0xpbmVhciB9LCAwLCAwLCAgRkxBR1MsICJpbnRlcnBvbCJ9LAorICAgIHsgICJiaWxpbmVhciIsImJpLWxpbmVhciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gVlNfQmlMaW5lYXJ9LDAsIDAsICBGTEFHUywgImludGVycG9sIn0sCisgICAgeyAgImJpY3ViaWMiLCAiYmktY3ViaWMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBWU19CaUN1YmljIH0sMCwgMCwgIEZMQUdTLCAiaW50ZXJwb2wifSwKKworICAgIHsidHJpcG9kIiwgICAgImVuYWJsZSB2aXJ0dWFsIHRyaXBvZCBtb2RlIChzYW1lIGFzIHJlbGF0aXZlPTA6c21vb3RoaW5nPTApIiwgT0ZGU0VUKHRyaXBvZCksCisgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDB9LCAgICAgICAgMCwgMSwgICAgRkxBR1N9LAorICAgIHsiZGVidWciLCAgICAgImVuYWJsZSBkZWJ1ZyBtb2RlIGFuZCB3cml0ZXIgZ2xvYmFsIG1vdGlvbnMgaW5mb3JtYXRpb24gdG8gZmlsZSIsIE9GRlNFVChkZWJ1ZyksCisgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDB9LCAgICAgICAgMCwgMSwgICAgRkxBR1N9LAorICAgIHtOVUxMfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHZpZHN0YWJ0cmFuc2Zvcm0pOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBUcmFuc2Zvcm1Db250ZXh0ICp0YyA9IGN0eC0+cHJpdjsKKyAgICBmZl92c19pbml0KCk7CisgICAgdGMtPmNsYXNzID0gJnZpZHN0YWJ0cmFuc2Zvcm1fY2xhc3M7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJ2aWRzdGFidHJhbnNmb3JtIGZpbHRlcjogaW5pdCAlc1xuIiwgTElCVklEU1RBQl9WRVJTSU9OKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVHJhbnNmb3JtQ29udGV4dCAqdGMgPSBjdHgtPnByaXY7CisKKyAgICB2c1RyYW5zZm9ybURhdGFDbGVhbnVwKCZ0Yy0+dGQpOworICAgIHZzVHJhbnNmb3JtYXRpb25zQ2xlYW51cCgmdGMtPnRyYW5zKTsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIC8vIElmIHlvdSBhZGQgc29tZXRoaW5nIGhlcmUgYWxzbyBhZGQgaXQgaW4gdmlkc3RhYnV0aWxzLmMKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsICBBVl9QSVhfRk1UX1lVVjQxMFAsIEFWX1BJWF9GTVRfWVVWQTQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCMjQsIEFWX1BJWF9GTVRfQkdSMjQsIEFWX1BJWF9GTVRfUkdCQSwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFRyYW5zZm9ybUNvbnRleHQgKnRjID0gY3R4LT5wcml2OworICAgIEZJTEUgKmY7CisKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKworICAgIFZTVHJhbnNmb3JtRGF0YSAqdGQgPSAmKHRjLT50ZCk7CisKKyAgICBWU0ZyYW1lSW5mbyBmaV9zcmM7CisgICAgVlNGcmFtZUluZm8gZmlfZGVzdDsKKworICAgIGlmICghdnNGcmFtZUluZm9Jbml0KCZmaV9zcmMsIGlubGluay0+dywgaW5saW5rLT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2F2MnZzX3BpeGZtdChjdHgsIGlubGluay0+Zm9ybWF0KSkgfHwKKyAgICAgICAgIXZzRnJhbWVJbmZvSW5pdCgmZmlfZGVzdCwgaW5saW5rLT53LCBpbmxpbmstPmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmZfYXYydnNfcGl4Zm10KGN0eCwgaW5saW5rLT5mb3JtYXQpKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJ1bmtub3duIHBpeGVsIGZvcm1hdDogJWkgKCVzKSIsCisgICAgICAgICAgICAgICBpbmxpbmstPmZvcm1hdCwgZGVzYy0+bmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGZpX3NyYy5ieXRlc1BlclBpeGVsICE9IGF2X2dldF9iaXRzX3Blcl9waXhlbChkZXNjKS84IHx8CisgICAgICAgIGZpX3NyYy5sb2cyQ2hyb21hVyAhPSBkZXNjLT5sb2cyX2Nocm9tYV93IHx8CisgICAgICAgIGZpX3NyYy5sb2cyQ2hyb21hSCAhPSBkZXNjLT5sb2cyX2Nocm9tYV9oKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgInBpeGVsLWZvcm1hdCBlcnJvcjogYnBwICVpPD4laSAgIiwKKyAgICAgICAgICAgICAgIGZpX3NyYy5ieXRlc1BlclBpeGVsLCBhdl9nZXRfYml0c19wZXJfcGl4ZWwoZGVzYykvOCk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImNocm9tYV9zdWJzYW1wbDogdzogJWk8PiVpICBoOiAlaTw+JWlcbiIsCisgICAgICAgICAgICAgICBmaV9zcmMubG9nMkNocm9tYVcsIGRlc2MtPmxvZzJfY2hyb21hX3csCisgICAgICAgICAgICAgICBmaV9zcmMubG9nMkNocm9tYUgsIGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8vIHNldCB2YWx1ZXMgdGhhdCBhcmUgbm90IGluaXRpYWxpemVzIGJ5IHRoZSBvcHRpb25zCisgICAgdGMtPmNvbmYubW9kTmFtZSA9ICJ2aWRzdGFidHJhbnNmb3JtIjsKKyAgICB0Yy0+Y29uZi52ZXJib3NlID0gMSArIHRjLT5kZWJ1ZzsKKyAgICBpZiAodGMtPnRyaXBvZCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlZpcnR1YWwgdHJpcG9kIG1vZGU6IHJlbGF0aXZlPTAsIHNtb290aGluZz0wXG4iKTsKKyAgICAgICAgdGMtPmNvbmYucmVsYXRpdmUgID0gMDsKKyAgICAgICAgdGMtPmNvbmYuc21vb3RoaW5nID0gMDsKKyAgICB9CisgICAgdGMtPmNvbmYuc2ltcGxlTW90aW9uQ2FsY3VsYXRpb24gPSAwOworICAgIHRjLT5jb25mLnN0b3JlVHJhbnNmb3JtcyAgICAgICAgID0gdGMtPmRlYnVnOworICAgIHRjLT5jb25mLnNtb290aFpvb20gICAgICAgICAgICAgID0gMDsKKworICAgIGlmICh2c1RyYW5zZm9ybURhdGFJbml0KHRkLCAmdGMtPmNvbmYsICZmaV9zcmMsICZmaV9kZXN0KSAhPSBWU19PSykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbml0aWFsaXphdGlvbiBvZiB2aWQuc3RhYiB0cmFuc2Zvcm0gZmFpbGVkLCBwbGVhc2UgcmVwb3J0IGEgQlVHXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICB2c1RyYW5zZm9ybUdldENvbmZpZygmdGMtPmNvbmYsIHRkKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlZpZGVvIHRyYW5zZm9ybWF0aW9uL3N0YWJpbGl6YXRpb24gc2V0dGluZ3MgKHBhc3MgMi8yKTpcbiIpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiICAgIGlucHV0ICAgICA9ICVzXG4iLCB0Yy0+aW5wdXQpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiICAgIHNtb290aGluZyA9ICVkXG4iLCB0Yy0+Y29uZi5zbW9vdGhpbmcpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiICAgIG9wdGFsZ28gICA9ICVzXG4iLAorICAgICAgICAgICB0Yy0+Y29uZi5jYW1QYXRoQWxnbyA9PSBWU09wdGltYWxMMSA/ICJvcHQiIDoKKyAgICAgICAgICAgKHRjLT5jb25mLmNhbVBhdGhBbGdvID09IFZTR2F1c3NpYW4gPyAiZ2F1c3MiIDogImF2ZyIpKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiAgICBtYXhzaGlmdCAgPSAlZFxuIiwgdGMtPmNvbmYubWF4U2hpZnQpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiICAgIG1heGFuZ2xlICA9ICVmXG4iLCB0Yy0+Y29uZi5tYXhBbmdsZSk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgICAgY3JvcCAgICAgID0gJXNcbiIsIHRjLT5jb25mLmNyb3AgPyAiQmxhY2siIDogIktlZXAiKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiAgICByZWxhdGl2ZSAgPSAlc1xuIiwgdGMtPmNvbmYucmVsYXRpdmUgPyAiVHJ1ZSI6ICJGYWxzZSIpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiICAgIGludmVydCAgICA9ICVzXG4iLCB0Yy0+Y29uZi5pbnZlcnQgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiAgICB6b29tICAgICAgPSAlZlxuIiwgdGMtPmNvbmYuem9vbSk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgICAgb3B0em9vbSAgID0gJXNcbiIsCisgICAgICAgICAgIHRjLT5jb25mLm9wdFpvb20gPT0gMSA/ICJTdGF0aWMgKDEpIiA6ICh0Yy0+Y29uZi5vcHRab29tID09IDIgPyAiRHluYW1pYyAoMikiIDogIk9mZiAoMCkiKSk7CisgICAgaWYgKHRjLT5jb25mLm9wdFpvb20gPT0gMikKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgICAgem9vbXNwZWVkID0gJWdcbiIsIHRjLT5jb25mLnpvb21TcGVlZCk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgICAgaW50ZXJwb2wgID0gJXNcbiIsIGdldEludGVycG9sYXRpb25UeXBlTmFtZSh0Yy0+Y29uZi5pbnRlcnBvbFR5cGUpKTsKKworICAgIGYgPSBmb3Blbih0Yy0+aW5wdXQsICJyIik7CisgICAgaWYgKCFmKSB7CisgICAgICAgIGludCByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiY2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgdGMtPmlucHV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBWU01hbnlMb2NhbE1vdGlvbnMgbWxtczsKKyAgICAgICAgaWYgKHZzUmVhZExvY2FsTW90aW9uc0ZpbGUoZiwgJm1sbXMpID09IFZTX09LKSB7CisgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGFjdHVhbCB0cmFuc2Zvcm1zIGZyb20gdGhlIGxvY2FsIG1vdGlvbnMKKyAgICAgICAgICAgIGlmICh2c0xvY2FsbW90aW9uczJUcmFuc2Zvcm1zKHRkLCAmbWxtcywgJnRjLT50cmFucykgIT0gVlNfT0spIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJjYWxjdWxhdGluZyB0cmFuc2Zvcm1hdGlvbnMgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyB0cnkgdG8gcmVhZCBvbGQgZm9ybWF0CisgICAgICAgICAgICBpZiAoIXZzUmVhZE9sZFRyYW5zZm9ybXModGQsIGYsICZ0Yy0+dHJhbnMpKSB7IC8qIHJlYWQgaW5wdXQgZmlsZSAqLworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIHBhcnNpbmcgaW5wdXQgZmlsZSAlc1xuIiwgdGMtPmlucHV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmKTsKKworICAgIGlmICh2c1ByZXByb2Nlc3NUcmFuc2Zvcm1zKHRkLCAmdGMtPnRyYW5zKSAhPSBWU19PSykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciB3aGlsZSBwcmVwcm9jZXNzaW5nIHRyYW5zZm9ybXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8vIFRPRE86IGFkZCBzaGFycGVuaW5nLCBzbyBmYXIgdGhlIHVzZXIgbmVlZHMgdG8gY2FsbCB0aGUgdW5zaGFycCBmaWx0ZXIgbWFudWFsbHkKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBUcmFuc2Zvcm1Db250ZXh0ICp0YyA9IGN0eC0+cHJpdjsKKyAgICBWU1RyYW5zZm9ybURhdGEqIHRkID0gJih0Yy0+dGQpOworCisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gaW5saW5rLT5kc3QtPm91dHB1dHNbMF07CisgICAgaW50IGRpcmVjdCA9IDA7CisgICAgQVZGcmFtZSAqb3V0OworICAgIFZTRnJhbWUgaW5mcmFtZTsKKyAgICBpbnQgcGxhbmU7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIGRpcmVjdCA9IDE7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgdnNUcmFuc2Zvcm1HZXRTcmNGcmFtZUluZm8odGQpLT5wbGFuZXM7IHBsYW5lKyspIHsKKyAgICAgICAgaW5mcmFtZS5kYXRhW3BsYW5lXSA9IGluLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgaW5mcmFtZS5saW5lc2l6ZVtwbGFuZV0gPSBpbi0+bGluZXNpemVbcGxhbmVdOworICAgIH0KKyAgICBpZiAoZGlyZWN0KSB7CisgICAgICAgIHZzVHJhbnNmb3JtUHJlcGFyZSh0ZCwgJmluZnJhbWUsICZpbmZyYW1lKTsKKyAgICB9IGVsc2UgeyAvLyBzZXBhcmF0ZSBmcmFtZXMKKyAgICAgICAgVlNGcmFtZSBvdXRmcmFtZTsKKyAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgdnNUcmFuc2Zvcm1HZXREZXN0RnJhbWVJbmZvKHRkKS0+cGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgICAgICBvdXRmcmFtZS5kYXRhW3BsYW5lXSA9IG91dC0+ZGF0YVtwbGFuZV07CisgICAgICAgICAgICBvdXRmcmFtZS5saW5lc2l6ZVtwbGFuZV0gPSBvdXQtPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgfQorICAgICAgICB2c1RyYW5zZm9ybVByZXBhcmUodGQsICZpbmZyYW1lLCAmb3V0ZnJhbWUpOworICAgIH0KKworICAgIHZzRG9UcmFuc2Zvcm0odGQsIHZzR2V0TmV4dFRyYW5zZm9ybSh0ZCwgJnRjLT50cmFucykpOworCisgICAgdnNUcmFuc2Zvcm1GaW5pc2godGQpOworCisgICAgaWYgKCFkaXJlY3QpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX3ZpZHN0YWJ0cmFuc2Zvcm1faW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl92aWRzdGFidHJhbnNmb3JtX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl92aWRzdGFidHJhbnNmb3JtID0geworICAgIC5uYW1lICAgICAgICAgID0gInZpZHN0YWJ0cmFuc2Zvcm0iLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRyYW5zZm9ybSB0aGUgZnJhbWVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFzcyAyIG9mIDIgZm9yIHN0YWJpbGl6YXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzZWUgdmlkc3RhYmRldGVjdCBmb3IgcGFzcyAxKS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihUcmFuc2Zvcm1Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfdmZfdmlkc3RhYnRyYW5zZm9ybV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl92Zl92aWRzdGFidHJhbnNmb3JtX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmdmlkc3RhYnRyYW5zZm9ybV9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdmlnbmV0dGUuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl92aWduZXR0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNmJkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdmlnbmV0dGUuYwpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+ICAvKiBEQkxfTUFYICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJ3IiwgICAgLy8gc3RyZWFtIHdpZHRoCisgICAgImgiLCAgICAvLyBzdHJlYW0gaGVpZ2h0CisgICAgIm4iLCAgICAvLyBmcmFtZSBjb3VudAorICAgICJwdHMiLCAgLy8gcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBleHByZXNzZWQgaW4gQVZfVElNRV9CQVNFIHVuaXRzCisgICAgInIiLCAgICAvLyBmcmFtZSByYXRlCisgICAgInQiLCAgICAvLyB0aW1lc3RhbXAgZXhwcmVzc2VkIGluIHNlY29uZHMKKyAgICAidGIiLCAgIC8vIHRpbWViYXNlCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX1csCisgICAgVkFSX0gsCisgICAgVkFSX04sCisgICAgVkFSX1BUUywKKyAgICBWQVJfUiwKKyAgICBWQVJfVCwKKyAgICBWQVJfVEIsCisgICAgVkFSX05CCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworICAgIGludCBiYWNrd2FyZDsKKyAgICBlbnVtIEV2YWxNb2RlIHsgRVZBTF9NT0RFX0lOSVQsIEVWQUxfTU9ERV9GUkFNRSwgRVZBTF9NT0RFX05CIH0gZXZhbF9tb2RlOworI2RlZmluZSBERUZfRVhQUl9GSUVMRFMobmFtZSkgQVZFeHByICpuYW1lIyNfcGV4cHI7IGNoYXIgKm5hbWUjI19leHByOyBkb3VibGUgbmFtZQorICAgIERFRl9FWFBSX0ZJRUxEUyhhbmdsZSk7CisgICAgREVGX0VYUFJfRklFTERTKHgwKTsKKyAgICBERUZfRVhQUl9GSUVMRFMoeTApOworICAgIGRvdWJsZSB2YXJfdmFsdWVzW1ZBUl9OQl07CisgICAgZmxvYXQgKmZtYXA7CisgICAgaW50IGZtYXBfbGluZXNpemU7CisgICAgZG91YmxlIGRtYXg7CisgICAgZmxvYXQgeHNjYWxlLCB5c2NhbGU7CisgICAgdWludDMyX3QgZGl0aGVyOworICAgIGludCBkb19kaXRoZXI7CisgICAgQVZSYXRpb25hbCBhc3BlY3Q7CisgICAgQVZSYXRpb25hbCBzY2FsZTsKK30gVmlnbmV0dGVDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihWaWduZXR0ZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIHZpZ25ldHRlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJhbmdsZSIsICJzZXQgbGVucyBhbmdsZSIsIE9GRlNFVChhbmdsZV9leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iUEkvNSJ9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImEiLCAgICAgInNldCBsZW5zIGFuZ2xlIiwgT0ZGU0VUKGFuZ2xlX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJQSS81In0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAieDAiLCAic2V0IGNpcmNsZSBjZW50ZXIgcG9zaXRpb24gb24geC1heGlzIiwgT0ZGU0VUKHgwX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJ3LzIifSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJ5MCIsICJzZXQgY2lyY2xlIGNlbnRlciBwb3NpdGlvbiBvbiB5LWF4aXMiLCBPRkZTRVQoeTBfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9ImgvMiJ9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgIm1vZGUiLCAic2V0IGZvcndhcmQvYmFja3dhcmQgbW9kZSIsIE9GRlNFVChiYWNrd2FyZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMSwgRkxBR1MsICJtb2RlIiB9LAorICAgICAgICB7ICJmb3J3YXJkIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IDB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUifSwKKyAgICAgICAgeyAiYmFja3dhcmQiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAxfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtb2RlIn0sCisgICAgeyAiZXZhbCIsICJzcGVjaWZ5IHdoZW4gdG8gZXZhbHVhdGUgZXhwcmVzc2lvbnMiLCBPRkZTRVQoZXZhbF9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEVWQUxfTU9ERV9JTklUfSwgMCwgRVZBTF9NT0RFX05CLTEsIEZMQUdTLCAiZXZhbCIgfSwKKyAgICAgICAgIHsgImluaXQiLCAgImV2YWwgZXhwcmVzc2lvbnMgb25jZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9RVZBTF9NT0RFX0lOSVR9LCAgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImV2YWwiIH0sCisgICAgICAgICB7ICJmcmFtZSIsICJldmFsIGV4cHJlc3Npb25zIGZvciBlYWNoIGZyYW1lIiwgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUVWQUxfTU9ERV9GUkFNRX0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJldmFsIiB9LAorICAgIHsgImRpdGhlciIsICJzZXQgZGl0aGVyaW5nIiwgT0ZGU0VUKGRvX2RpdGhlciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJhc3BlY3QiLCAic2V0IGFzcGVjdCByYXRpbyIsIE9GRlNFVChhc3BlY3QpLCBBVl9PUFRfVFlQRV9SQVRJT05BTCwgey5kYmwgPSAxfSwgMCwgREJMX01BWCwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHZpZ25ldHRlKTsKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVmlnbmV0dGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisjZGVmaW5lIFBBUlNFX0VYUFIobmFtZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCByZXQgPSBhdl9leHByX3BhcnNlKCZzLT5uYW1lIyNfcGV4cHIsICBzLT5uYW1lIyNfZXhwciwgdmFyX25hbWVzLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpOyAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJldCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcGFyc2UgZXhwcmVzc2lvbiBmb3IgJyIgICAgICAgIFwKKyAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShuYW1lKSAiJ1xuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyAgICBQQVJTRV9FWFBSKGFuZ2xlKTsKKyAgICBQQVJTRV9FWFBSKHgwKTsKKyAgICBQQVJTRV9FWFBSKHkwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVmlnbmV0dGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGF2X2ZyZWVwKCZzLT5mbWFwKTsKKyAgICBhdl9leHByX2ZyZWUocy0+YW5nbGVfcGV4cHIpOworICAgIGF2X2V4cHJfZnJlZShzLT54MF9wZXhwcik7CisgICAgYXZfZXhwcl9mcmVlKHMtPnkwX3BleHByKTsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMFAsIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgICBBVl9QSVhfRk1UX0JHUjI0LAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGRvdWJsZSBnZXRfbmF0dXJhbF9mYWN0b3IoY29uc3QgVmlnbmV0dGVDb250ZXh0ICpzLCBpbnQgeCwgaW50IHkpCit7CisgICAgY29uc3QgaW50IHh4ID0gKHggLSBzLT54MCkgKiBzLT54c2NhbGU7CisgICAgY29uc3QgaW50IHl5ID0gKHkgLSBzLT55MCkgKiBzLT55c2NhbGU7CisgICAgY29uc3QgZG91YmxlIGRub3JtID0gaHlwb3QoeHgsIHl5KSAvIHMtPmRtYXg7CisgICAgaWYgKGRub3JtID4gMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBkb3VibGUgYyA9IGNvcyhzLT5hbmdsZSAqIGRub3JtKTsKKyAgICAgICAgcmV0dXJuIChjKmMpKihjKmMpOyAvLyBkbyBub3QgcmVtb3ZlIGJyYWNlcywgaXQgaGVscHMgY29tcGlsZXJzCisgICAgfQorfQorCisjZGVmaW5lIFRTMkQodHMpICAgICAoKHRzKSA9PSBBVl9OT1BUU19WQUxVRSA/IE5BTiA6IChkb3VibGUpKHRzKSkKKyNkZWZpbmUgVFMyVCh0cywgdGIpICgodHMpID09IEFWX05PUFRTX1ZBTFVFID8gTkFOIDogKGRvdWJsZSkodHMpICogYXZfcTJkKHRiKSkKKworc3RhdGljIHZvaWQgdXBkYXRlX2NvbnRleHQoVmlnbmV0dGVDb250ZXh0ICpzLCBBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHgsIHk7CisgICAgZmxvYXQgKmRzdCA9IHMtPmZtYXA7CisgICAgaW50IGRzdF9saW5lc2l6ZSA9IHMtPmZtYXBfbGluZXNpemU7CisKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfTl0gICA9IGlubGluay0+ZnJhbWVfY291bnQ7CisgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1RdICAgPSBUUzJUKGZyYW1lLT5wdHMsIGlubGluay0+dGltZV9iYXNlKTsKKyAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfUFRTXSA9IFRTMkQoZnJhbWUtPnB0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfTl0gICA9IDA7CisgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1RdICAgPSBOQU47CisgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1BUU10gPSBOQU47CisgICAgfQorCisgICAgcy0+YW5nbGUgPSBhdl9jbGlwZihhdl9leHByX2V2YWwocy0+YW5nbGVfcGV4cHIsIHMtPnZhcl92YWx1ZXMsIE5VTEwpLCAwLCBNX1BJXzIpOworICAgIHMtPngwID0gYXZfZXhwcl9ldmFsKHMtPngwX3BleHByLCBzLT52YXJfdmFsdWVzLCBOVUxMKTsKKyAgICBzLT55MCA9IGF2X2V4cHJfZXZhbChzLT55MF9wZXhwciwgcy0+dmFyX3ZhbHVlcywgTlVMTCk7CisKKyAgICBpZiAocy0+YmFja3dhcmQpIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGlubGluay0+aDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW5saW5rLT53OyB4KyspCisgICAgICAgICAgICAgICAgZHN0W3hdID0gMS4gLyBnZXRfbmF0dXJhbF9mYWN0b3IocywgeCwgeSk7CisgICAgICAgICAgICBkc3QgKz0gZHN0X2xpbmVzaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGlubGluay0+aDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW5saW5rLT53OyB4KyspCisgICAgICAgICAgICAgICAgZHN0W3hdID0gZ2V0X25hdHVyYWxfZmFjdG9yKHMsIHgsIHkpOworICAgICAgICAgICAgZHN0ICs9IGRzdF9saW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSBkb3VibGUgZ2V0X2RpdGhlcl92YWx1ZShWaWduZXR0ZUNvbnRleHQgKnMpCit7CisgICAgZG91YmxlIGR2ID0gMDsKKyAgICBpZiAocy0+ZG9fZGl0aGVyKSB7CisgICAgICAgIGR2ID0gcy0+ZGl0aGVyIC8gKGRvdWJsZSkoMUxMPDwzMik7CisgICAgICAgIHMtPmRpdGhlciA9IHMtPmRpdGhlciAqIDE2NjQ1MjUgKyAxMDEzOTA0MjIzOworICAgIH0KKyAgICByZXR1cm4gZHY7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICB1bnNpZ25lZCB4LCB5LCBkaXJlY3QgPSAwOworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgVmlnbmV0dGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQ7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIGRpcmVjdCA9IDE7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgaWYgKHMtPmV2YWxfbW9kZSA9PSBFVkFMX01PREVfRlJBTUUpCisgICAgICAgIHVwZGF0ZV9jb250ZXh0KHMsIGlubGluaywgaW4pOworCisgICAgaWYgKHMtPmRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQikgeworICAgICAgICB1aW50OF90ICAgICAgICpkc3QgPSBvdXQtPmRhdGFbMF07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IGluIC0+ZGF0YVswXTsKKyAgICAgICAgY29uc3QgZmxvYXQgKmZtYXAgPSBzLT5mbWFwOworICAgICAgICBjb25zdCBpbnQgZHN0X2xpbmVzaXplID0gb3V0LT5saW5lc2l6ZVswXTsKKyAgICAgICAgY29uc3QgaW50IHNyY19saW5lc2l6ZSA9IGluIC0+bGluZXNpemVbMF07CisgICAgICAgIGNvbnN0IGludCBmbWFwX2xpbmVzaXplID0gcy0+Zm1hcF9saW5lc2l6ZTsKKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaW5saW5rLT5oOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgKmRzdHAgPSBkc3Q7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwID0gc3JjOworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW5saW5rLT53OyB4KyssIGRzdHAgKz0gMywgc3JjcCArPSAzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgZiA9IGZtYXBbeF07CisKKyAgICAgICAgICAgICAgICBkc3RwWzBdID0gYXZfY2xpcF91aW50OChzcmNwWzBdICogZiArIGdldF9kaXRoZXJfdmFsdWUocykpOworICAgICAgICAgICAgICAgIGRzdHBbMV0gPSBhdl9jbGlwX3VpbnQ4KHNyY3BbMV0gKiBmICsgZ2V0X2RpdGhlcl92YWx1ZShzKSk7CisgICAgICAgICAgICAgICAgZHN0cFsyXSA9IGF2X2NsaXBfdWludDgoc3JjcFsyXSAqIGYgKyBnZXRfZGl0aGVyX3ZhbHVlKHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCArPSBkc3RfbGluZXNpemU7CisgICAgICAgICAgICBzcmMgKz0gc3JjX2xpbmVzaXplOworICAgICAgICAgICAgZm1hcCArPSBmbWFwX2xpbmVzaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHBsYW5lOworCisgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQgJiYgaW4tPmRhdGFbcGxhbmVdICYmIGluLT5saW5lc2l6ZVtwbGFuZV07IHBsYW5lKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgKmRzdCA9IG91dC0+ZGF0YVtwbGFuZV07CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSBpbiAtPmRhdGFbcGxhbmVdOworICAgICAgICAgICAgY29uc3QgZmxvYXQgKmZtYXAgPSBzLT5mbWFwOworICAgICAgICAgICAgY29uc3QgaW50IGRzdF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgY29uc3QgaW50IHNyY19saW5lc2l6ZSA9IGluIC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgY29uc3QgaW50IGZtYXBfbGluZXNpemUgPSBzLT5mbWFwX2xpbmVzaXplOworICAgICAgICAgICAgY29uc3QgaW50IGNocm9tYSA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMjsKKyAgICAgICAgICAgIGNvbnN0IGludCBoc3ViID0gY2hyb21hID8gcy0+ZGVzYy0+bG9nMl9jaHJvbWFfdyA6IDA7CisgICAgICAgICAgICBjb25zdCBpbnQgdnN1YiA9IGNocm9tYSA/IHMtPmRlc2MtPmxvZzJfY2hyb21hX2ggOiAwOworICAgICAgICAgICAgY29uc3QgaW50IHcgPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPncsIGhzdWIpOworICAgICAgICAgICAgY29uc3QgaW50IGggPSBGRl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpOworCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0cCA9IGRzdDsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwID0gc3JjOworCisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgZHYgPSBnZXRfZGl0aGVyX3ZhbHVlKHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hyb21hKSAqZHN0cCsrID0gYXZfY2xpcF91aW50OChmbWFwW3ggPDwgaHN1Yl0gKiAoKnNyY3ArKyAtIDEyNykgKyAxMjcgKyBkdik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICpkc3RwKysgPSBhdl9jbGlwX3VpbnQ4KGZtYXBbeCAgICAgICAgXSAqICAqc3JjcCsrICAgICAgICAgICAgICArIGR2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHN0ICs9IGRzdF9saW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBzcmMgKz0gc3JjX2xpbmVzaXplOworICAgICAgICAgICAgICAgIGZtYXAgKz0gZm1hcF9saW5lc2l6ZSA8PCB2c3ViOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFkaXJlY3QpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIFZpZ25ldHRlQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWUmF0aW9uYWwgc2FyID0gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworCisgICAgcy0+ZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1ddICA9IGlubGluay0+dzsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9IXSAgPSBpbmxpbmstPmg7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfVEJdID0gYXZfcTJkKGlubGluay0+dGltZV9iYXNlKTsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9SXSAgPSBpbmxpbmstPmZyYW1lX3JhdGUubnVtID09IDAgfHwgaW5saW5rLT5mcmFtZV9yYXRlLmRlbiA9PSAwID8KKyAgICAgICAgTkFOIDogYXZfcTJkKGlubGluay0+ZnJhbWVfcmF0ZSk7CisKKyAgICBpZiAoIXNhci5udW0gfHwgIXNhci5kZW4pCisgICAgICAgIHNhci5udW0gPSBzYXIuZGVuID0gMTsKKyAgICBpZiAoc2FyLm51bSA+IHNhci5kZW4pIHsKKyAgICAgICAgcy0+eHNjYWxlID0gYXZfcTJkKGF2X2Rpdl9xKHNhciwgcy0+YXNwZWN0KSk7CisgICAgICAgIHMtPnlzY2FsZSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+eXNjYWxlID0gYXZfcTJkKGF2X2Rpdl9xKHMtPmFzcGVjdCwgc2FyKSk7CisgICAgICAgIHMtPnhzY2FsZSA9IDE7CisgICAgfQorICAgIHMtPmRtYXggPSBoeXBvdChpbmxpbmstPncgLyAyLiwgaW5saW5rLT5oIC8gMi4pOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJ4c2NhbGU9JWYgeXNjYWxlPSVmIGRtYXg9JWZcbiIsCisgICAgICAgICAgIHMtPnhzY2FsZSwgcy0+eXNjYWxlLCBzLT5kbWF4KTsKKworICAgIHMtPmZtYXBfbGluZXNpemUgPSBGRkFMSUdOKGlubGluay0+dywgMzIpOworICAgIHMtPmZtYXAgPSBhdl9tYWxsb2NfYXJyYXkocy0+Zm1hcF9saW5lc2l6ZSwgaW5saW5rLT5oICogc2l6ZW9mKCpzLT5mbWFwKSk7CisgICAgaWYgKCFzLT5mbWFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKHMtPmV2YWxfbW9kZSA9PSBFVkFMX01PREVfSU5JVCkKKyAgICAgICAgdXBkYXRlX2NvbnRleHQocywgaW5saW5rLCBOVUxMKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgdmlnbmV0dGVfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB2aWduZXR0ZV9vdXRwdXRzW10gPSB7CisgICAgIHsKKyAgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgIH0sCisgICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl92aWduZXR0ZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJ2aWduZXR0ZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWFrZSBvciByZXZlcnNlIGEgdmlnbmV0dGUgZWZmZWN0LiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFZpZ25ldHRlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IHZpZ25ldHRlX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHZpZ25ldHRlX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmdmlnbmV0dGVfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdzNmZGlmLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfdzNmZGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNzM5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl93M2ZkaWYuYwpAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBCcml0aXNoIEJyb2FkY2FzdGluZyBDb3Jwb3JhdGlvbiwgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogQXV0aG9yIG9mIGRlLWludGVybGFjZSBhbGdvcml0aG06IEppbSBFYXN0ZXJicm9vayBmb3IgQkJDIFImRAorICogQmFzZWQgb24gdGhlIHByb2Nlc3MgZGVzY3JpYmVkIGJ5IE1hcnRpbiBXZXN0b24gZm9yIEJCQyBSJkQKKyAqIEF1dGhvciBvZiBGRm1wZWcgZmlsdGVyOiBNYXJrIEhpbXNsZXkgZm9yIEJCQyBCcm9hZGNhc3QgU3lzdGVtcyBEZXZlbG9wbWVudAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgVzNGRElGQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IGZpbHRlcjsgICAgICAgICAgIC8vLzwgMCBpcyBzaW1wbGUsIDEgaXMgbW9yZSBjb21wbGV4CisgICAgaW50IGRlaW50OyAgICAgICAgICAgIC8vLzwgd2hpY2ggZnJhbWVzIHRvIGRlaW50ZXJsYWNlCisgICAgaW50IGxpbmVzaXplWzRdOyAgICAgIC8vLzwgYnl0ZXMgb2YgcGl4ZWwgZGF0YSBwZXIgbGluZSBmb3IgZWFjaCBwbGFuZQorICAgIGludCBwbGFuZWhlaWdodFs0XTsgICAvLy88IGhlaWdodCBvZiBlYWNoIHBsYW5lCisgICAgaW50IGZpZWxkOyAgICAgICAgICAgIC8vLzwgd2hpY2ggZmllbGQgYXJlIHdlIG9uLCAwIG9yIDEKKyAgICBpbnQgZW9mOworICAgIGludCBuYl9wbGFuZXM7CisgICAgQVZGcmFtZSAqcHJldiwgKmN1ciwgKm5leHQ7ICAvLy88IHByZXZpb3VzLCBjdXJyZW50LCBuZXh0IGZyYW1lcworICAgIGludDMyX3QgKndvcmtfbGluZTsgICAvLy88IGxpbmUgd2UgYXJlIGNhbGN1bGF0aW5nCit9IFczRkRJRkNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFczRkRJRkNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorI2RlZmluZSBDT05TVChuYW1lLCBoZWxwLCB2YWwsIHVuaXQpIHsgbmFtZSwgaGVscCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PXZhbH0sIDAsIDAsIEZMQUdTLCB1bml0IH0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHczZmRpZl9vcHRpb25zW10gPSB7CisgICAgeyAiZmlsdGVyIiwgInNwZWNpZnkgdGhlIGZpbHRlciIsIE9GRlNFVChmaWx0ZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTF9LCAwLCAxLCBGTEFHUywgImZpbHRlciIgfSwKKyAgICBDT05TVCgic2ltcGxlIiwgIE5VTEwsIDAsICJmaWx0ZXIiKSwKKyAgICBDT05TVCgiY29tcGxleCIsIE5VTEwsIDEsICJmaWx0ZXIiKSwKKyAgICB7ICJkZWludCIsICAic3BlY2lmeSB3aGljaCBmcmFtZXMgdG8gZGVpbnRlcmxhY2UiLCBPRkZTRVQoZGVpbnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUywgImRlaW50IiB9LAorICAgIENPTlNUKCJhbGwiLCAgICAgICAgImRlaW50ZXJsYWNlIGFsbCBmcmFtZXMiLCAgICAgICAgICAgICAgICAgICAgICAgMCwgImRlaW50IiksCisgICAgQ09OU1QoImludGVybGFjZWQiLCAib25seSBkZWludGVybGFjZSBmcmFtZXMgbWFya2VkIGFzIGludGVybGFjZWQiLCAxLCAiZGVpbnQiKSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHczZmRpZik7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJBUCwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBXM0ZESUZDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMocy0+bGluZXNpemUsIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5wbGFuZWhlaWdodFsxXSA9IHMtPnBsYW5laGVpZ2h0WzJdID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBzLT5wbGFuZWhlaWdodFswXSA9IHMtPnBsYW5laGVpZ2h0WzNdID0gaW5saW5rLT5oOworCisgICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworICAgIHMtPndvcmtfbGluZSA9IGF2X2NhbGxvYyhzLT5saW5lc2l6ZVswXSwgc2l6ZW9mKCpzLT53b3JrX2xpbmUpKTsKKyAgICBpZiAoIXMtPndvcmtfbGluZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UubnVtID0gaW5saW5rLT50aW1lX2Jhc2UubnVtOworICAgIG91dGxpbmstPnRpbWVfYmFzZS5kZW4gPSBpbmxpbmstPnRpbWVfYmFzZS5kZW4gKiAyOworICAgIG91dGxpbmstPmZyYW1lX3JhdGUubnVtID0gaW5saW5rLT5mcmFtZV9yYXRlLm51bSAqIDI7CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZS5kZW4gPSBpbmxpbmstPmZyYW1lX3JhdGUuZGVuOworICAgIG91dGxpbmstPmZsYWdzIHw9IEZGX0xJTktfRkxBR19SRVFVRVNUX0xPT1A7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZpbHRlciBjb2VmZmljaWVudHMgZnJvbSBQSC0yMDcxLCBzY2FsZWQgYnkgMjU2ICogMjU2LgorICogRWFjaCBzZXQgb2YgY29lZmZpY2llbnRzIGhhcyBhIHNldCBmb3IgbG93LWZyZXF1ZW5jaWVzIGFuZCBoaWdoLWZyZXF1ZW5jaWVzLgorICogbl9jb2VmX2xmW10gYW5kIG5fY29lZl9oZltdIGFyZSB0aGUgbnVtYmVyIG9mIGNvZWZzIGZvciBzaW1wbGUgYW5kIG1vcmUtY29tcGxleC4KKyAqIEl0IGlzIGltcG9ydGFudCBmb3IgbGF0ZXIgdGhhdCBuX2NvZWZfbGZbXSBpcyBldmVuIGFuZCBuX2NvZWZfaGZbXSBpcyBvZGQuCisgKiBjb2VmX2xmW11bXSBhbmQgY29lZl9oZltdW10gYXJlIHRoZSBjb2VmZmljaWVudHMgZm9yIGxvdy1mcmVxdWVuY2llcworICogYW5kIGhpZ2gtZnJlcXVlbmNpZXMgZm9yIHNpbXBsZSBhbmQgbW9yZS1jb21wbGV4IG1vZGUuCisgKi8KK3N0YXRpYyBjb25zdCBpbnQ4X3QgICBuX2NvZWZfbGZbMl0gPSB7IDIsIDQgfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGNvZWZfbGZbMl1bNF0gPSB7eyAzMjc2OCwgMzI3NjgsICAgICAwLCAgICAgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLTE3MDQsIDM0NDcyLCAzNDQ3MiwgLTE3MDR9fTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgICBuX2NvZWZfaGZbMl0gPSB7IDMsIDUgfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGNvZWZfaGZbMl1bNV0gPSB7eyAtNDA5NiwgIDgxOTIsIC00MDk2LCAgICAgMCwgICAgIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAyMDMyLCAtNzYwMiwgMTExNDAsIC03NjAyLCAgMjAzMn19OworCitzdGF0aWMgdm9pZCBkZWludGVybGFjZV9wbGFuZShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqY3VyLCBjb25zdCBBVkZyYW1lICphZGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZmlsdGVyLCBjb25zdCBpbnQgcGxhbmUpCit7CisgICAgVzNGRElGQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICB1aW50OF90ICppbl9saW5lLCAqaW5fbGluZXNfY3VyWzVdLCAqaW5fbGluZXNfYWRqWzVdOworICAgIHVpbnQ4X3QgKm91dF9saW5lLCAqb3V0X3BpeGVsOworICAgIGludDMyX3QgKndvcmtfbGluZSwgKndvcmtfcGl4ZWw7CisgICAgdWludDhfdCAqY3VyX2RhdGEgPSBjdXItPmRhdGFbcGxhbmVdOworICAgIHVpbnQ4X3QgKmFkal9kYXRhID0gYWRqLT5kYXRhW3BsYW5lXTsKKyAgICB1aW50OF90ICpkc3RfZGF0YSA9IG91dC0+ZGF0YVtwbGFuZV07CisgICAgY29uc3QgaW50IGxpbmVzaXplID0gcy0+bGluZXNpemVbcGxhbmVdOworICAgIGNvbnN0IGludCBoZWlnaHQgICA9IHMtPnBsYW5laGVpZ2h0W3BsYW5lXTsKKyAgICBjb25zdCBpbnQgY3VyX2xpbmVfc3RyaWRlID0gY3VyLT5saW5lc2l6ZVtwbGFuZV07CisgICAgY29uc3QgaW50IGFkal9saW5lX3N0cmlkZSA9IGFkai0+bGluZXNpemVbcGxhbmVdOworICAgIGNvbnN0IGludCBkc3RfbGluZV9zdHJpZGUgPSBvdXQtPmxpbmVzaXplW3BsYW5lXTsKKyAgICBpbnQgaSwgaiwgeV9pbiwgeV9vdXQ7CisKKyAgICAvKiBjb3B5IHVuY2hhbmdlZCB0aGUgbGluZXMgb2YgdGhlIGZpZWxkICovCisgICAgeV9vdXQgPSBzLT5maWVsZCA9PSBjdXItPnRvcF9maWVsZF9maXJzdDsKKworICAgIGluX2xpbmUgID0gY3VyX2RhdGEgKyAoeV9vdXQgKiBjdXJfbGluZV9zdHJpZGUpOworICAgIG91dF9saW5lID0gZHN0X2RhdGEgKyAoeV9vdXQgKiBkc3RfbGluZV9zdHJpZGUpOworCisgICAgd2hpbGUgKHlfb3V0IDwgaGVpZ2h0KSB7CisgICAgICAgIG1lbWNweShvdXRfbGluZSwgaW5fbGluZSwgbGluZXNpemUpOworICAgICAgICB5X291dCArPSAyOworICAgICAgICBpbl9saW5lICArPSBjdXJfbGluZV9zdHJpZGUgKiAyOworICAgICAgICBvdXRfbGluZSArPSBkc3RfbGluZV9zdHJpZGUgKiAyOworICAgIH0KKworICAgIC8qIGludGVycG9sYXRlIG90aGVyIGxpbmVzIG9mIHRoZSBmaWVsZCAqLworICAgIHlfb3V0ID0gcy0+ZmllbGQgIT0gY3VyLT50b3BfZmllbGRfZmlyc3Q7CisKKyAgICBvdXRfbGluZSA9IGRzdF9kYXRhICsgKHlfb3V0ICogZHN0X2xpbmVfc3RyaWRlKTsKKworICAgIHdoaWxlICh5X291dCA8IGhlaWdodCkgeworICAgICAgICAvKiBjbGVhciB3b3Jrc3BhY2UgKi8KKyAgICAgICAgbWVtc2V0KHMtPndvcmtfbGluZSwgMCwgc2l6ZW9mKCpzLT53b3JrX2xpbmUpICogbGluZXNpemUpOworCisgICAgICAgIC8qIGdldCBsb3cgdmVydGljYWwgZnJlcXVlbmNpZXMgZnJvbSBjdXJyZW50IGZpZWxkICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuX2NvZWZfbGZbZmlsdGVyXTsgaisrKSB7CisgICAgICAgICAgICB5X2luID0gKHlfb3V0ICsgMSkgKyAoaiAqIDIpIC0gbl9jb2VmX2xmW2ZpbHRlcl07CisKKyAgICAgICAgICAgIHdoaWxlICh5X2luIDwgMCkKKyAgICAgICAgICAgICAgICB5X2luICs9IDI7CisgICAgICAgICAgICB3aGlsZSAoeV9pbiA+PSBoZWlnaHQpCisgICAgICAgICAgICAgICAgeV9pbiAtPSAyOworCisgICAgICAgICAgICBpbl9saW5lc19jdXJbal0gPSBjdXJfZGF0YSArICh5X2luICogY3VyX2xpbmVfc3RyaWRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHdvcmtfbGluZSA9IHMtPndvcmtfbGluZTsKKyAgICAgICAgc3dpdGNoIChuX2NvZWZfbGZbZmlsdGVyXSkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfY3VyWzBdKysgKiBjb2VmX2xmW2ZpbHRlcl1bMF07CisgICAgICAgICAgICAgICAgKndvcmtfbGluZSsrICs9ICppbl9saW5lc19jdXJbMV0rKyAqIGNvZWZfbGZbZmlsdGVyXVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfY3VyWzBdKysgKiBjb2VmX2xmW2ZpbHRlcl1bMF07CisgICAgICAgICAgICAgICAgKndvcmtfbGluZSAgICs9ICppbl9saW5lc19jdXJbMV0rKyAqIGNvZWZfbGZbZmlsdGVyXVsxXTsKKyAgICAgICAgICAgICAgICAqd29ya19saW5lICAgKz0gKmluX2xpbmVzX2N1clsyXSsrICogY29lZl9sZltmaWx0ZXJdWzJdOworICAgICAgICAgICAgICAgICp3b3JrX2xpbmUrKyArPSAqaW5fbGluZXNfY3VyWzNdKysgKiBjb2VmX2xmW2ZpbHRlcl1bM107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgaGlnaCB2ZXJ0aWNhbCBmcmVxdWVuY2llcyBmcm9tIGFkamFjZW50IGZpZWxkcyAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbl9jb2VmX2hmW2ZpbHRlcl07IGorKykgeworICAgICAgICAgICAgeV9pbiA9ICh5X291dCArIDEpICsgKGogKiAyKSAtIG5fY29lZl9oZltmaWx0ZXJdOworCisgICAgICAgICAgICB3aGlsZSAoeV9pbiA8IDApCisgICAgICAgICAgICAgICAgeV9pbiArPSAyOworICAgICAgICAgICAgd2hpbGUgKHlfaW4gPj0gaGVpZ2h0KQorICAgICAgICAgICAgICAgIHlfaW4gLT0gMjsKKworICAgICAgICAgICAgaW5fbGluZXNfY3VyW2pdID0gY3VyX2RhdGEgKyAoeV9pbiAqIGN1cl9saW5lX3N0cmlkZSk7CisgICAgICAgICAgICBpbl9saW5lc19hZGpbal0gPSBhZGpfZGF0YSArICh5X2luICogYWRqX2xpbmVfc3RyaWRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHdvcmtfbGluZSA9IHMtPndvcmtfbGluZTsKKyAgICAgICAgc3dpdGNoIChuX2NvZWZfaGZbZmlsdGVyXSkgeworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfY3VyWzBdKysgKiBjb2VmX2hmW2ZpbHRlcl1bMF07CisgICAgICAgICAgICAgICAgKndvcmtfbGluZSAgICs9ICppbl9saW5lc19hZGpbMF0rKyAqIGNvZWZfaGZbZmlsdGVyXVswXTsKKyAgICAgICAgICAgICAgICAqd29ya19saW5lICAgKz0gKmluX2xpbmVzX2N1clsxXSsrICogY29lZl9oZltmaWx0ZXJdWzFdOworICAgICAgICAgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfYWRqWzFdKysgKiBjb2VmX2hmW2ZpbHRlcl1bMV07CisgICAgICAgICAgICAgICAgKndvcmtfbGluZSAgICs9ICppbl9saW5lc19jdXJbMl0rKyAqIGNvZWZfaGZbZmlsdGVyXVsyXTsKKyAgICAgICAgICAgICAgICAqd29ya19saW5lKysgKz0gKmluX2xpbmVzX2FkalsyXSsrICogY29lZl9oZltmaWx0ZXJdWzJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgKndvcmtfbGluZSAgICs9ICppbl9saW5lc19jdXJbMF0rKyAqIGNvZWZfaGZbZmlsdGVyXVswXTsKKyAgICAgICAgICAgICAgICAqd29ya19saW5lICAgKz0gKmluX2xpbmVzX2FkalswXSsrICogY29lZl9oZltmaWx0ZXJdWzBdOworICAgICAgICAgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfY3VyWzFdKysgKiBjb2VmX2hmW2ZpbHRlcl1bMV07CisgICAgICAgICAgICAgICAgKndvcmtfbGluZSAgICs9ICppbl9saW5lc19hZGpbMV0rKyAqIGNvZWZfaGZbZmlsdGVyXVsxXTsKKyAgICAgICAgICAgICAgICAqd29ya19saW5lICAgKz0gKmluX2xpbmVzX2N1clsyXSsrICogY29lZl9oZltmaWx0ZXJdWzJdOworICAgICAgICAgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfYWRqWzJdKysgKiBjb2VmX2hmW2ZpbHRlcl1bMl07CisgICAgICAgICAgICAgICAgKndvcmtfbGluZSAgICs9ICppbl9saW5lc19jdXJbM10rKyAqIGNvZWZfaGZbZmlsdGVyXVszXTsKKyAgICAgICAgICAgICAgICAqd29ya19saW5lICAgKz0gKmluX2xpbmVzX2FkalszXSsrICogY29lZl9oZltmaWx0ZXJdWzNdOworICAgICAgICAgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfY3VyWzRdKysgKiBjb2VmX2hmW2ZpbHRlcl1bNF07CisgICAgICAgICAgICAgICAgKndvcmtfbGluZSsrICs9ICppbl9saW5lc19hZGpbNF0rKyAqIGNvZWZfaGZbZmlsdGVyXVs0XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHNhdmUgc2NhbGVkIHJlc3VsdCB0byB0aGUgb3V0cHV0IGZyYW1lLCBzY2FsaW5nIGRvd24gYnkgMjU2ICogMjU2ICovCisgICAgICAgIHdvcmtfcGl4ZWwgPSBzLT53b3JrX2xpbmU7CisgICAgICAgIG91dF9waXhlbCA9IG91dF9saW5lOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsaW5lc2l6ZTsgaisrLCBvdXRfcGl4ZWwrKywgd29ya19waXhlbCsrKQorICAgICAgICAgICAgICpvdXRfcGl4ZWwgPSBhdl9jbGlwKCp3b3JrX3BpeGVsLCAwLCAyNTUgKiAyNTYgKiAyNTYpID4+IDE2OworCisgICAgICAgIC8qIG1vdmUgb24gdG8gbmV4dCBsaW5lICovCisgICAgICAgIHlfb3V0ICs9IDI7CisgICAgICAgIG91dF9saW5lICs9IGRzdF9saW5lX3N0cmlkZSAqIDI7CisgICAgfQorfQorCitzdGF0aWMgaW50IGZpbHRlcihBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IGlzX3NlY29uZCkKK3sKKyAgICBXM0ZESUZDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQsICphZGo7CisgICAgaW50IHBsYW5lOworCisgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgcy0+Y3VyKTsKKyAgICBvdXQtPmludGVybGFjZWRfZnJhbWUgPSAwOworCisgICAgaWYgKCFpc19zZWNvbmQpIHsKKyAgICAgICAgaWYgKG91dC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgb3V0LT5wdHMgKj0gMjsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IGN1cl9wdHMgID0gcy0+Y3VyLT5wdHM7CisgICAgICAgIGludDY0X3QgbmV4dF9wdHMgPSBzLT5uZXh0LT5wdHM7CisKKyAgICAgICAgaWYgKG5leHRfcHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIGN1cl9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIG91dC0+cHRzID0gY3VyX3B0cyArIG5leHRfcHRzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LT5wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFkaiA9IHMtPmZpZWxkID8gcy0+bmV4dCA6IHMtPnByZXY7CisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+bmJfcGxhbmVzOyBwbGFuZSsrKQorICAgICAgICBkZWludGVybGFjZV9wbGFuZShjdHgsIG91dCwgcy0+Y3VyLCBhZGosIHMtPmZpbHRlciwgcGxhbmUpOworCisgICAgcy0+ZmllbGQgPSAhcy0+ZmllbGQ7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFczRkRJRkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnByZXYpOworICAgIHMtPnByZXYgPSBzLT5jdXI7CisgICAgcy0+Y3VyICA9IHMtPm5leHQ7CisgICAgcy0+bmV4dCA9IGZyYW1lOworCisgICAgaWYgKCFzLT5jdXIpIHsKKyAgICAgICAgcy0+Y3VyID0gYXZfZnJhbWVfY2xvbmUocy0+bmV4dCk7CisgICAgICAgIGlmICghcy0+Y3VyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBpZiAoKHMtPmRlaW50ICYmICFzLT5jdXItPmludGVybGFjZWRfZnJhbWUpIHx8IGN0eC0+aXNfZGlzYWJsZWQpIHsKKyAgICAgICAgQVZGcmFtZSAqb3V0ID0gYXZfZnJhbWVfY2xvbmUocy0+Y3VyKTsKKyAgICAgICAgaWYgKCFvdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnByZXYpOworICAgICAgICBpZiAob3V0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBvdXQtPnB0cyAqPSAyOworICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgb3V0KTsKKyAgICB9CisKKyAgICBpZiAoIXMtPnByZXYpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0ID0gZmlsdGVyKGN0eCwgMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gZmlsdGVyKGN0eCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgVzNGRElGQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGRvIHsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAocy0+ZW9mKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworCisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgcy0+Y3VyKSB7CisgICAgICAgICAgICBBVkZyYW1lICpuZXh0ID0gYXZfZnJhbWVfY2xvbmUocy0+bmV4dCk7CisgICAgICAgICAgICBpZiAoIW5leHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG5leHQtPnB0cyA9IHMtPm5leHQtPnB0cyAqIDIgLSBzLT5jdXItPnB0czsKKyAgICAgICAgICAgIGZpbHRlcl9mcmFtZShjdHgtPmlucHV0c1swXSwgbmV4dCk7CisgICAgICAgICAgICBzLT5lb2YgPSAxOworICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICghcy0+Y3VyKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBXM0ZESUZDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+cHJldik7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+Y3VyICk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+bmV4dCk7CisgICAgYXZfZnJlZXAoJnMtPndvcmtfbGluZSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB3M2ZkaWZfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgdzNmZGlmX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfdzNmZGlmID0geworICAgIC5uYW1lICAgICAgICAgID0gInczZmRpZiIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgTWFydGluIFdlc3RvbiB0aHJlZSBmaWVsZCBkZWludGVybGFjZS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihXM0ZESUZDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZ3M2ZkaWZfY2xhc3MsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gdzNmZGlmX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHczZmRpZl9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0lOVEVSTkFMLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92Zl94YnIuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl94YnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2U0Yjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3hici5jCkBAIC0wLDAgKzEsNDQwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBIeWxsaWFuL0phcmFyYWNhIDxzZXJnaW9nZGJAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDE0IEFyd2EgQXJpZiA8YXJ3YWFyaWYxOTk0QGdtYWlsLmNvbT4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBYQlIgRmlsdGVyIGlzIHVzZWQgZm9yIGRlcGl4ZWxpemF0aW9uIG9mIGltYWdlLgorICogVGhpcyBpcyBiYXNlZCBvbiBIeWxsaWFuJ3MgeEJSIHNoYWRlci4KKyAqCisgKiBAc2VlIGh0dHA6Ly93d3cubGlicmV0cm8uY29tL2ZvcnVtcy92aWV3dG9waWMucGhwP2Y9NiZ0PTEzNAorICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20veW95b2ZyL2lGQkEvYmxvYi9tYXN0ZXIvZmJhX3NyYy9zcmMvaW50Zi92aWRlby9zY2FsZXJzL3hici5jcHAKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBSR0JfTUFTSyAgICAgIDB4MDBGRkZGRkYKKyNkZWZpbmUgTEJfTUFTSyAgICAgICAweDAwRkVGRUZFCisjZGVmaW5lIFJFRF9CTFVFX01BU0sgMHgwMEZGMDBGRgorI2RlZmluZSBHUkVFTl9NQVNLICAgIDB4MDAwMEZGMDAKKwordHlwZWRlZiBpbnQgKCp4YnJmdW5jX3QpKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IG47CisgICAgeGJyZnVuY190IGZ1bmM7CisgICAgdWludDMyX3QgcmdidG95dXZbMTw8MjRdOworfSBYQlJDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBUaHJlYWREYXRhIHsKKyAgICBBVkZyYW1lICppbiwgKm91dDsKKyAgICBjb25zdCB1aW50MzJfdCAqcmdidG95dXY7Cit9IFRocmVhZERhdGE7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFhCUkNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIHhicl9vcHRpb25zW10gPSB7CisgICAgeyAibiIsICJzZXQgc2NhbGUgZmFjdG9yIiwgT0ZGU0VUKG4pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gM30sIDIsIDQsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyh4YnIpOworCitzdGF0aWMgdWludDMyX3QgcGl4ZWxfZGlmZih1aW50MzJfdCB4LCB1aW50MzJfdCB5LCBjb25zdCB1aW50MzJfdCAqcjJ5KQoreworI2RlZmluZSBZTUFTSyAweGZmMDAwMAorI2RlZmluZSBVTUFTSyAweDAwZmYwMAorI2RlZmluZSBWTUFTSyAweDAwMDBmZgorCisgICAgdWludDMyX3QgeXV2MSA9IHIyeVt4ICYgMHhmZmZmZmZdOworICAgIHVpbnQzMl90IHl1djIgPSByMnlbeSAmIDB4ZmZmZmZmXTsKKworICAgIHJldHVybiAoYWJzKCh5dXYxICYgWU1BU0spIC0gKHl1djIgJiBZTUFTSykpID4+IDE2KSArCisgICAgICAgICAgIChhYnMoKHl1djEgJiBVTUFTSykgLSAoeXV2MiAmIFVNQVNLKSkgPj4gIDgpICsKKyAgICAgICAgICAgYWJzKCh5dXYxICYgVk1BU0spIC0gKHl1djIgJiBWTUFTSykpOworfQorCisjZGVmaW5lIEFMUEhBX0JMRU5EXzEyOF9XKGRzdCwgc3JjKSBkc3QgPSAoKHNyYyAmIExCX01BU0spID4+IDEpICsgKChkc3QgJiBMQl9NQVNLKSA+PiAxKQorCisjZGVmaW5lIEFMUEhBX0JMRU5EXzMyX1coZHN0LCBzcmMpIFwKKyAgICBkc3QgPSAoKFJFRF9CTFVFX01BU0sgJiAoKGRzdCAmIFJFRF9CTFVFX01BU0spICsgKCgoKHNyYyAmIFJFRF9CTFVFX01BU0spIC0gXAorICAgICAgICAgIChkc3QgJiBSRURfQkxVRV9NQVNLKSkpID4+IDMpKSkgfCAoR1JFRU5fTUFTSyAmICgoZHN0ICYgR1JFRU5fTUFTSykgKyBcCisgICAgICAgICAgKCgoKHNyYyAmIEdSRUVOX01BU0spIC0gKGRzdCAmIEdSRUVOX01BU0spKSkgPj4gMykpKSkKKworI2RlZmluZSBBTFBIQV9CTEVORF82NF9XKGRzdCwgc3JjKSBcCisgICAgZHN0ID0gKChSRURfQkxVRV9NQVNLICYgKChkc3QgJiBSRURfQkxVRV9NQVNLKSArICgoKChzcmMgJiBSRURfQkxVRV9NQVNLKSAtIFwKKyAgICAgICAgICAoZHN0ICYgUkVEX0JMVUVfTUFTSykpKSA+PiAyKSkpIHwgKEdSRUVOX01BU0sgJiAoKGRzdCAmIEdSRUVOX01BU0spICsgXAorICAgICAgICAgICgoKChzcmMgJiBHUkVFTl9NQVNLKSAtIChkc3QgJiBHUkVFTl9NQVNLKSkpID4+IDIpKSkpCisKKyNkZWZpbmUgQUxQSEFfQkxFTkRfMTkyX1coZHN0LCBzcmMpIFwKKyAgICBkc3QgPSAoKFJFRF9CTFVFX01BU0sgJiAoKGRzdCAmIFJFRF9CTFVFX01BU0spICsgKCgoKHNyYyAmIFJFRF9CTFVFX01BU0spIC0gXAorICAgICAgICAgIChkc3QgJiBSRURfQkxVRV9NQVNLKSkgKiAzKSA+PiAyKSkpIHwgKEdSRUVOX01BU0sgJiAoKGRzdCAmIEdSRUVOX01BU0spICsgXAorICAgICAgICAgICgoKChzcmMgJiBHUkVFTl9NQVNLKSAtIChkc3QgJiBHUkVFTl9NQVNLKSkgKiAzKSA+PiAyKSkpKQorCisjZGVmaW5lIEFMUEhBX0JMRU5EXzIyNF9XKGRzdCwgc3JjKSBcCisgICAgZHN0ID0gKChSRURfQkxVRV9NQVNLICYgKChkc3QgJiBSRURfQkxVRV9NQVNLKSArICgoKChzcmMgJiBSRURfQkxVRV9NQVNLKSAtIFwKKyAgICAgICAgICAoZHN0ICYgUkVEX0JMVUVfTUFTSykpICogNykgPj4gMykpKSB8IChHUkVFTl9NQVNLICYgKChkc3QgJiBHUkVFTl9NQVNLKSArIFwKKyAgICAgICAgICAoKCgoc3JjICYgR1JFRU5fTUFTSykgLSAoZHN0ICYgR1JFRU5fTUFTSykpICogNykgPj4gMykpKSkKKworI2RlZmluZSBkZihBLCBCKSBwaXhlbF9kaWZmKEEsIEIsIHIyeSkKKyNkZWZpbmUgZXEoQSwgQikgKGRmKEEsIEIpIDwgMTU1KQorCisjZGVmaW5lIEZJTFQyKFBFLCBQSSwgUEgsIFBGLCBQRywgUEMsIFBELCBQQiwgUEEsIEc1LCBDNCwgRzAsIEQwLCBDMSwgQjEsIEY0LCBJNCwgSDUsIEk1LCBBMCwgQTEsICAgXAorICAgICAgICAgICAgICBOMCwgTjEsIE4yLCBOMykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoUEUgIT0gUEggJiYgUEUgIT0gUEYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGUgPSBkZihQRSxQQykgKyBkZihQRSxQRykgKyBkZihQSSxINSkgKyBkZihQSSxGNCkgKyAoZGYoUEgsUEYpPDwyKTsgICAgICAgICAgXAorICAgICAgICBjb25zdCB1bnNpZ25lZCBpID0gZGYoUEgsUEQpICsgZGYoUEgsSTUpICsgZGYoUEYsSTQpICsgZGYoUEYsUEIpICsgKGRmKFBFLFBJKTw8Mik7ICAgICAgICAgIFwKKyAgICAgICAgaWYgKGUgPCBpICYmICghZXEoUEYsUEIpICYmICFlcShQSCxQRCkgfHwgZXEoUEUsUEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJiYgKCFlcShQRixJNCkgJiYgIWVxKFBILEk1KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHx8IGVxKFBFLFBHKSB8fCBlcShQRSxQQykpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGtlID0gZGYoUEYsUEcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBraSA9IGRmKFBILFBDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgaW50IGxlZnQgICAgPSBrZTw8MSA8PSBraSAmJiBQRSAhPSBQRyAmJiBQRCAhPSBQRzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGludCB1cCAgICAgID0ga2UgPj0ga2k8PDEgJiYgUEUgIT0gUEMgJiYgUEIgIT0gUEM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBweCA9IGRmKFBFLFBGKSA8PSBkZihQRSxQSCkgPyBQRiA6IFBIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGxlZnQgJiYgdXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTFBIQV9CTEVORF8yMjRfVyhFW04zXSwgcHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkRfNjRfVyggRVtOMl0sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEVbTjFdID0gRVtOMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkRfMTkyX1coRVtOM10sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMUEhBX0JMRU5EXzY0X1coIEVbTjJdLCBweCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkRfMTkyX1coRVtOM10sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMUEhBX0JMRU5EXzY0X1coIEVbTjFdLCBweCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7IC8qIGRpYWdvbmFsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkRfMTI4X1coRVtOM10sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIGlmIChlIDw9IGkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTFBIQV9CTEVORF8xMjhfVyggRVtOM10sICgoZGYoUEUsUEYpIDw9IGRmKFBFLFBIKSkgPyBQRiA6IFBIKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZJTFQzKFBFLCBQSSwgUEgsIFBGLCBQRywgUEMsIFBELCBQQiwgUEEsIEc1LCBDNCwgRzAsIEQwLCBDMSwgQjEsIEY0LCBJNCwgSDUsIEk1LCBBMCwgQTEsICAgXAorICAgICAgICAgICAgICBOMCwgTjEsIE4yLCBOMywgTjQsIE41LCBONiwgTjcsIE44KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoUEUgIT0gUEggJiYgUEUgIT0gUEYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGUgPSBkZihQRSxQQykgKyBkZihQRSxQRykgKyBkZihQSSxINSkgKyBkZihQSSxGNCkgKyAoZGYoUEgsUEYpPDwyKTsgICAgICAgICAgXAorICAgICAgICBjb25zdCB1bnNpZ25lZCBpID0gZGYoUEgsUEQpICsgZGYoUEgsSTUpICsgZGYoUEYsSTQpICsgZGYoUEYsUEIpICsgKGRmKFBFLFBJKTw8Mik7ICAgICAgICAgIFwKKyAgICAgICAgaWYgKGUgPCBpICYmICghZXEoUEYsUEIpICYmICFlcShQRixQQykgfHwgIWVxKFBILFBEKSAmJiAhZXEoUEgsUEcpIHx8IGVxKFBFLFBJKSAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJiYgKCFlcShQRixGNCkgJiYgIWVxKFBGLEk0KSB8fCAhZXEoUEgsSDUpICYmICFlcShQSCxJNSkpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHx8IGVxKFBFLFBHKSB8fCBlcShQRSxQQykpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGtlID0gZGYoUEYsUEcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBraSA9IGRmKFBILFBDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgaW50IGxlZnQgICAgPSBrZTw8MSA8PSBraSAmJiBQRSAhPSBQRyAmJiBQRCAhPSBQRzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGludCB1cCAgICAgID0ga2UgPj0ga2k8PDEgJiYgUEUgIT0gUEMgJiYgUEIgIT0gUEM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBweCA9IGRmKFBFLFBGKSA8PSBkZihQRSxQSCkgPyBQRiA6IFBIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGxlZnQgJiYgdXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTFBIQV9CTEVORF8xOTJfVyhFW043XSwgcHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkRfNjRfVyggRVtONl0sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEVbTjVdID0gRVtON107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBFW04yXSA9IEVbTjZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgRVtOOF0gPSBweDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTFBIQV9CTEVORF8xOTJfVyhFW043XSwgcHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkRfNjRfVyggRVtONV0sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMUEhBX0JMRU5EXzY0X1coIEVbTjZdLCBweCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBFW044XSA9IHB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgaWYgKHVwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMUEhBX0JMRU5EXzE5Ml9XKEVbTjVdLCBweCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTFBIQV9CTEVORF82NF9XKCBFW043XSwgcHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkRfNjRfVyggRVtOMl0sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEVbTjhdID0gcHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7IC8qIGRpYWdvbmFsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkRfMjI0X1coRVtOOF0sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMUEhBX0JMRU5EXzMyX1coIEVbTjVdLCBweCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTFBIQV9CTEVORF8zMl9XKCBFW043XSwgcHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKGUgPD0gaSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMUEhBX0JMRU5EXzEyOF9XKEVbTjhdLCAoKGRmKFBFLFBGKSA8PSBkZihQRSxQSCkpID8gUEYgOiBQSCkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRklMVDQoUEUsIFBJLCBQSCwgUEYsIFBHLCBQQywgUEQsIFBCLCBQQSwgRzUsIEM0LCBHMCwgRDAsIEMxLCBCMSwgRjQsIEk0LCBINSwgSTUsIEEwLCBBMSwgICBcCisgICAgICAgICAgICAgIE4xNSwgTjE0LCBOMTEsIE4zLCBONywgTjEwLCBOMTMsIE4xMiwgTjksIE42LCBOMiwgTjEsIE41LCBOOCwgTjQsIE4wKSBkbyB7ICAgICAgICAgICAgXAorICAgIGlmIChQRSAhPSBQSCAmJiBQRSAhPSBQRikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdW5zaWduZWQgZSA9IGRmKFBFLFBDKSArIGRmKFBFLFBHKSArIGRmKFBJLEg1KSArIGRmKFBJLEY0KSArIChkZihQSCxQRik8PDIpOyAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGkgPSBkZihQSCxQRCkgKyBkZihQSCxJNSkgKyBkZihQRixJNCkgKyBkZihQRixQQikgKyAoZGYoUEUsUEkpPDwyKTsgICAgICAgICAgXAorICAgICAgICBpZiAoZSA8IGkgJiYgKCFlcShQRixQQikgJiYgIWVxKFBILFBEKSB8fCBlcShQRSxQSSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoIWVxKFBGLEk0KSAmJiAhZXEoUEgsSTUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfHwgZXEoUEUsUEcpIHx8IGVxKFBFLFBDKSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgdW5zaWduZWQga2UgPSBkZihQRixQRyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGtpID0gZGYoUEgsUEMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBpbnQgbGVmdCAgICA9IGtlPDwxIDw9IGtpICYmIFBFICE9IFBHICYmIFBEICE9IFBHOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgaW50IHVwICAgICAgPSBrZSA+PSBraTw8MSAmJiBQRSAhPSBQQyAmJiBQQiAhPSBQQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHB4ID0gZGYoUEUsUEYpIDw9IGRmKFBFLFBIKSA/IFBGIDogUEg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobGVmdCAmJiB1cCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMUEhBX0JMRU5EXzE5Ml9XKEVbTjEzXSwgcHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTFBIQV9CTEVORF82NF9XKCBFW04xMl0sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgRVtOMTVdID0gRVtOMTRdID0gRVtOMTFdID0gcHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEVbTjEwXSA9IEVbTjNdICA9IEVbTjEyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBFW043XSAgPSBFW04xM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMUEhBX0JMRU5EXzE5Ml9XKEVbTjExXSwgcHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTFBIQV9CTEVORF8xOTJfVyhFW04xM10sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkRfNjRfVyggRVtOMTBdLCBweCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMUEhBX0JMRU5EXzY0X1coIEVbTjEyXSwgcHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBFW04xNF0gPSBweDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgRVtOMTVdID0gcHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIGlmICh1cCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTFBIQV9CTEVORF8xOTJfVyhFW04xNF0sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkRfMTkyX1coRVtONyBdLCBweCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMUEhBX0JMRU5EXzY0X1coIEVbTjEwXSwgcHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTFBIQV9CTEVORF82NF9XKCBFW04zIF0sIHB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgRVtOMTFdID0gcHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEVbTjE1XSA9IHB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7IC8qIGRpYWdvbmFsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkRfMTI4X1coRVtOMTFdLCBweCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMUEhBX0JMRU5EXzEyOF9XKEVbTjE0XSwgcHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBFW04xNV0gPSBweDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKGUgPD0gaSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMUEhBX0JMRU5EXzEyOF9XKCBFW04xNV0sICgoZGYoUEUsUEYpIDw9IGRmKFBFLFBIKSkgPyBQRiA6IFBIKSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgeGJyX2ZpbHRlcihjb25zdCBUaHJlYWREYXRhICp0ZCwgaW50IGpvYm5yLCBpbnQgbmJfam9icywgaW50IG4pCit7CisgICAgaW50IHgsIHk7CisgICAgY29uc3QgQVZGcmFtZSAqaW5wdXQgPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0cHV0ID0gdGQtPm91dDsKKyAgICBjb25zdCB1aW50MzJfdCAqcjJ5ID0gdGQtPnJnYnRveXV2OworICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChpbnB1dC0+aGVpZ2h0ICogIGpvYm5yICAgKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCAgID0gKGlucHV0LT5oZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgbmwgPSBvdXRwdXQtPmxpbmVzaXplWzBdID4+IDI7CisgICAgY29uc3QgaW50IG5sMSA9IG5sICsgbmw7CisgICAgY29uc3QgaW50IG5sMiA9IG5sMSArIG5sOworCisgICAgZm9yICh5ID0gc2xpY2Vfc3RhcnQ7IHkgPCBzbGljZV9lbmQ7IHkrKykgeworCisgICAgICAgIHVpbnQzMl90ICpFID0gKHVpbnQzMl90ICopKG91dHB1dC0+ZGF0YVswXSArIHkgKiBvdXRwdXQtPmxpbmVzaXplWzBdICogbik7CisgICAgICAgIGNvbnN0IHVpbnQzMl90ICpzYTIgPSAodWludDMyX3QgKikoaW5wdXQtPmRhdGFbMF0gKyB5ICogaW5wdXQtPmxpbmVzaXplWzBdIC0gOCk7IC8qIGNlbnRlciAqLworICAgICAgICBjb25zdCB1aW50MzJfdCAqc2ExID0gc2EyIC0gKGlucHV0LT5saW5lc2l6ZVswXT4+Mik7IC8qIHVwIHgxICovCisgICAgICAgIGNvbnN0IHVpbnQzMl90ICpzYTAgPSBzYTEgLSAoaW5wdXQtPmxpbmVzaXplWzBdPj4yKTsgLyogdXAgeDIgKi8KKyAgICAgICAgY29uc3QgdWludDMyX3QgKnNhMyA9IHNhMiArIChpbnB1dC0+bGluZXNpemVbMF0+PjIpOyAvKiBkb3duIHgxICovCisgICAgICAgIGNvbnN0IHVpbnQzMl90ICpzYTQgPSBzYTMgKyAoaW5wdXQtPmxpbmVzaXplWzBdPj4yKTsgLyogZG93biB4MiAqLworCisgICAgICAgIGlmICh5IDw9IDEpIHsKKyAgICAgICAgICAgIHNhMCA9IHNhMTsKKyAgICAgICAgICAgIGlmICh5ID09IDApIHsKKyAgICAgICAgICAgICAgICBzYTAgPSBzYTEgPSBzYTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoeSA+PSBpbnB1dC0+aGVpZ2h0IC0gMikgeworICAgICAgICAgICAgc2E0ID0gc2EzOworICAgICAgICAgICAgaWYgKHkgPT0gaW5wdXQtPmhlaWdodCAtIDEpIHsKKyAgICAgICAgICAgICAgICBzYTQgPSBzYTMgPSBzYTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW5wdXQtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IEIxID0gc2EwWzJdOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgUEIgPSBzYTFbMl07CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBQRSA9IHNhMlsyXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IFBIID0gc2EzWzJdOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgSDUgPSBzYTRbMl07CisKKyAgICAgICAgICAgIGNvbnN0IGludCBwcHJldiA9IDIgLSAoeCA+IDApOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgQTEgPSBzYTBbcHByZXZdOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgUEEgPSBzYTFbcHByZXZdOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgUEQgPSBzYTJbcHByZXZdOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgUEcgPSBzYTNbcHByZXZdOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgRzUgPSBzYTRbcHByZXZdOworCisgICAgICAgICAgICBjb25zdCBpbnQgcHByZXYyID0gcHByZXYgLSAoeCA+IDEpOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgQTAgPSBzYTFbcHByZXYyXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IEQwID0gc2EyW3BwcmV2Ml07CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBHMCA9IHNhM1twcHJldjJdOworCisgICAgICAgICAgICBjb25zdCBpbnQgcG5leHQgPSAzIC0gKHggPT0gaW5wdXQtPndpZHRoIC0gMSk7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBDMSA9IHNhMFtwbmV4dF07CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBQQyA9IHNhMVtwbmV4dF07CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBQRiA9IHNhMltwbmV4dF07CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBQSSA9IHNhM1twbmV4dF07CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBJNSA9IHNhNFtwbmV4dF07CisKKyAgICAgICAgICAgIGNvbnN0IGludCBwbmV4dDIgPSBwbmV4dCArIDEgLSAoeCA+PSBpbnB1dC0+d2lkdGggLSAyKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IEM0ID0gc2ExW3BuZXh0Ml07CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBGNCA9IHNhMltwbmV4dDJdOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgSTQgPSBzYTNbcG5leHQyXTsKKworICAgICAgICAgICAgaWYgKG4gPT0gMikgeworICAgICAgICAgICAgICAgIEVbMF0gID0gRVsxXSAgICAgID0gICAgIC8vIDAsIDEKKyAgICAgICAgICAgICAgICBFW25sXSA9IEVbbmwgKyAxXSA9IFBFOyAvLyAyLCAzCisKKyAgICAgICAgICAgICAgICBGSUxUMihQRSwgUEksIFBILCBQRiwgUEcsIFBDLCBQRCwgUEIsIFBBLCBHNSwgQzQsIEcwLCBEMCwgQzEsIEIxLCBGNCwgSTQsIEg1LCBJNSwgQTAsIEExLCAwLCAxLCBubCwgbmwrMSk7CisgICAgICAgICAgICAgICAgRklMVDIoUEUsIFBDLCBQRiwgUEIsIFBJLCBQQSwgUEgsIFBELCBQRywgSTQsIEExLCBJNSwgSDUsIEEwLCBEMCwgQjEsIEMxLCBGNCwgQzQsIEc1LCBHMCwgbmwsIDAsIG5sKzEsIDEpOworICAgICAgICAgICAgICAgIEZJTFQyKFBFLCBQQSwgUEIsIFBELCBQQywgUEcsIFBGLCBQSCwgUEksIEMxLCBHMCwgQzQsIEY0LCBHNSwgSDUsIEQwLCBBMCwgQjEsIEExLCBJNCwgSTUsIG5sKzEsIG5sLCAxLCAwKTsKKyAgICAgICAgICAgICAgICBGSUxUMihQRSwgUEcsIFBELCBQSCwgUEEsIFBJLCBQQiwgUEYsIFBDLCBBMCwgSTUsIEExLCBCMSwgSTQsIEY0LCBINSwgRzUsIEQwLCBHMCwgQzEsIEM0LCAxLCBubCsxLCAwLCBubCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMykgeworICAgICAgICAgICAgICAgIEVbMF0gICA9IEVbMV0gICAgID0gRVsyXSAgICAgPSAgICAgLy8gMCwgMSwgMgorICAgICAgICAgICAgICAgIEVbbmxdICA9IEVbbmwrMV0gID0gRVtubCsyXSAgPSAgICAgLy8gMywgNCwgNQorICAgICAgICAgICAgICAgIEVbbmwxXSA9IEVbbmwxKzFdID0gRVtubDErMl0gPSBQRTsgLy8gNiwgNywgOAorCisgICAgICAgICAgICAgICAgRklMVDMoUEUsIFBJLCBQSCwgUEYsIFBHLCBQQywgUEQsIFBCLCBQQSwgRzUsIEM0LCBHMCwgRDAsIEMxLCBCMSwgRjQsIEk0LCBINSwgSTUsIEEwLCBBMSwgMCwgMSwgMiwgbmwsIG5sKzEsIG5sKzIsIG5sMSwgbmwxKzEsIG5sMSsyKTsKKyAgICAgICAgICAgICAgICBGSUxUMyhQRSwgUEMsIFBGLCBQQiwgUEksIFBBLCBQSCwgUEQsIFBHLCBJNCwgQTEsIEk1LCBINSwgQTAsIEQwLCBCMSwgQzEsIEY0LCBDNCwgRzUsIEcwLCBubDEsIG5sLCAwLCBubDErMSwgbmwrMSwgMSwgbmwxKzIsIG5sKzIsIDIpOworICAgICAgICAgICAgICAgIEZJTFQzKFBFLCBQQSwgUEIsIFBELCBQQywgUEcsIFBGLCBQSCwgUEksIEMxLCBHMCwgQzQsIEY0LCBHNSwgSDUsIEQwLCBBMCwgQjEsIEExLCBJNCwgSTUsIG5sMSsyLCBubDErMSwgbmwxLCBubCsyLCBubCsxLCBubCwgMiwgMSwgMCk7CisgICAgICAgICAgICAgICAgRklMVDMoUEUsIFBHLCBQRCwgUEgsIFBBLCBQSSwgUEIsIFBGLCBQQywgQTAsIEk1LCBBMSwgQjEsIEk0LCBGNCwgSDUsIEc1LCBEMCwgRzAsIEMxLCBDNCwgMiwgbmwrMiwgbmwxKzIsIDEsIG5sKzEsIG5sMSsxLCAwLCBubCwgbmwxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSA0KSB7CisgICAgICAgICAgICAgICAgRVswXSAgID0gRVsxXSAgICAgPSBFWzJdICAgICA9IEVbM10gICAgID0gICAgIC8vICAwLCAgMSwgIDIsICAzCisgICAgICAgICAgICAgICAgRVtubF0gID0gRVtubCsxXSAgPSBFW25sKzJdICA9IEVbbmwrM10gID0gICAgIC8vICA0LCAgNSwgIDYsICA3CisgICAgICAgICAgICAgICAgRVtubDFdID0gRVtubDErMV0gPSBFW25sMSsyXSA9IEVbbmwxKzNdID0gICAgIC8vICA4LCAgOSwgMTAsIDExCisgICAgICAgICAgICAgICAgRVtubDJdID0gRVtubDIrMV0gPSBFW25sMisyXSA9IEVbbmwyKzNdID0gUEU7IC8vIDEyLCAxMywgMTQsIDE1CisKKyAgICAgICAgICAgICAgICBGSUxUNChQRSwgUEksIFBILCBQRiwgUEcsIFBDLCBQRCwgUEIsIFBBLCBHNSwgQzQsIEcwLCBEMCwgQzEsIEIxLCBGNCwgSTQsIEg1LCBJNSwgQTAsIEExLCBubDIrMywgbmwyKzIsIG5sMSszLCAzLCBubCszLCBubDErMiwgbmwyKzEsIG5sMiwgbmwxKzEsIG5sKzIsIDIsIDEsIG5sKzEsIG5sMSwgbmwsIDApOworICAgICAgICAgICAgICAgIEZJTFQ0KFBFLCBQQywgUEYsIFBCLCBQSSwgUEEsIFBILCBQRCwgUEcsIEk0LCBBMSwgSTUsIEg1LCBBMCwgRDAsIEIxLCBDMSwgRjQsIEM0LCBHNSwgRzAsIDMsIG5sKzMsIDIsIDAsIDEsIG5sKzIsIG5sMSszLCBubDIrMywgbmwxKzIsIG5sKzEsIG5sLCBubDEsIG5sMSsxLCBubDIrMiwgbmwyKzEsIG5sMik7CisgICAgICAgICAgICAgICAgRklMVDQoUEUsIFBBLCBQQiwgUEQsIFBDLCBQRywgUEYsIFBILCBQSSwgQzEsIEcwLCBDNCwgRjQsIEc1LCBINSwgRDAsIEEwLCBCMSwgQTEsIEk0LCBJNSwgMCwgMSwgbmwsIG5sMiwgbmwxLCBubCsxLCAyLCAzLCBubCsyLCBubDErMSwgbmwyKzEsIG5sMisyLCBubDErMiwgbmwrMywgbmwxKzMsIG5sMiszKTsKKyAgICAgICAgICAgICAgICBGSUxUNChQRSwgUEcsIFBELCBQSCwgUEEsIFBJLCBQQiwgUEYsIFBDLCBBMCwgSTUsIEExLCBCMSwgSTQsIEY0LCBINSwgRzUsIEQwLCBHMCwgQzEsIEM0LCBubDIsIG5sMSwgbmwyKzEsIG5sMiszLCBubDIrMiwgbmwxKzEsIG5sLCAwLCBubCsxLCBubDErMiwgbmwxKzMsIG5sKzMsIG5sKzIsIDEsIDIsIDMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzYTAgKz0gMTsKKyAgICAgICAgICAgIHNhMSArPSAxOworICAgICAgICAgICAgc2EyICs9IDE7CisgICAgICAgICAgICBzYTMgKz0gMTsKKyAgICAgICAgICAgIHNhNCArPSAxOworCisgICAgICAgICAgICBFICs9IG47CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNkZWZpbmUgWEJSX0ZVTkMoc2l6ZSkgXAorc3RhdGljIGludCB4YnIjI3NpemUjI3goQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykgXAoreyBcCisgICAgeGJyX2ZpbHRlcihhcmcsIGpvYm5yLCBuYl9qb2JzLCBzaXplKTsgXAorICAgIHJldHVybiAwOyBcCit9CisKK1hCUl9GVU5DKDIpCitYQlJfRlVOQygzKQorWEJSX0ZVTkMoNCkKKworCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIFhCUkNvbnRleHQgKnhiciA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworCisgICAgb3V0bGluay0+dyA9IGlubGluay0+dyAqIHhici0+bjsKKyAgICBvdXRsaW5rLT5oID0gaW5saW5rLT5oICogeGJyLT5uOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UXzBSR0IzMiwgQVZfUElYX0ZNVF9OT05FLAorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBYQlJDb250ZXh0ICp4YnIgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSB0ZDsKKworICAgIEFWRnJhbWUgKm91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisKKyAgICB0ZC5pbiA9IGluOworICAgIHRkLm91dCA9IG91dDsKKyAgICB0ZC5yZ2J0b3l1diA9IHhici0+cmdidG95dXY7CisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHhici0+ZnVuYywgJnRkLCBOVUxMLCBGRk1JTihpbmxpbmstPmgsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKworICAgIG91dC0+d2lkdGggID0gb3V0bGluay0+dzsKKyAgICBvdXQtPmhlaWdodCA9IG91dGxpbmstPmg7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgWEJSQ29udGV4dCAqeGJyID0gY3R4LT5wcml2OworICAgIHN0YXRpYyBjb25zdCB4YnJmdW5jX3QgeGJyZnVuY3NbXSA9IHt4YnIyeCwgeGJyM3gsIHhicjR4fTsKKworICAgIHVpbnQzMl90IGM7CisgICAgaW50IGJnLCByZywgZzsKKworICAgIGZvciAoYmcgPSAtMjU1OyBiZyA8IDI1NjsgYmcrKykgeworICAgICAgICBmb3IgKHJnID0gLTI1NTsgcmcgPCAyNTY7IHJnKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHUgPSAodWludDMyX3QpKCgtMTY5KnJnICsgNTAwKmJnKS8xMDAwKSArIDEyODsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHYgPSAodWludDMyX3QpKCggNTAwKnJnIC0gIDgxKmJnKS8xMDAwKSArIDEyODsKKyAgICAgICAgICAgIGludCBzdGFydGcgPSBGRk1BWDMoLWJnLCAtcmcsIDApOworICAgICAgICAgICAgaW50IGVuZGcgPSBGRk1JTjMoMjU1LWJnLCAyNTUtcmcsIDI1NSk7CisgICAgICAgICAgICB1aW50MzJfdCB5ID0gKHVpbnQzMl90KSgoIDI5OSpyZyArIDEwMDAqc3RhcnRnICsgMTE0KmJnKS8xMDAwKTsKKyAgICAgICAgICAgIGMgPSBiZyArIChyZzw8MTYpICsgMHgwMTAxMDEgKiBzdGFydGc7CisgICAgICAgICAgICBmb3IgKGcgPSBzdGFydGc7IGcgPD0gZW5kZzsgZysrKSB7CisgICAgICAgICAgICAgICAgeGJyLT5yZ2J0b3l1dltjXSA9ICgoeSsrKSA8PCAxNikgKyAodSA8PCA4KSArIHY7CisgICAgICAgICAgICAgICAgYys9IDB4MDEwMTAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeGJyLT5mdW5jID0geGJyZnVuY3NbeGJyLT5uIC0gMl07CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB4YnJfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB4YnJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfeGJyID0geworICAgIC5uYW1lICAgICAgICAgID0gInhiciIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2NhbGUgdGhlIGlucHV0IHVzaW5nIHhCUiBhbGdvcml0aG0uIiksCisgICAgLmlucHV0cyAgICAgICAgPSB4YnJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0geGJyX291dHB1dHMsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFhCUkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnhicl9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3lhZGlmLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmZfeWFkaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTZlZTcwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3lhZGlmLmMKQEAgLTAsMCArMSw1NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogICAgICAgICAgICAgICAyMDEwICAgICAgSmFtZXMgRGFybmxleSA8amFtZXMuZGFybmxleUBnbWFpbC5jb20+CisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorI2luY2x1ZGUgInlhZGlmLmgiCisKK3R5cGVkZWYgc3RydWN0IFRocmVhZERhdGEgeworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIGludCBwbGFuZTsKKyAgICBpbnQgdywgaDsKKyAgICBpbnQgcGFyaXR5OworICAgIGludCB0ZmY7Cit9IFRocmVhZERhdGE7CisKKyNkZWZpbmUgQ0hFQ0soailcCisgICAgeyAgIGludCBzY29yZSA9IEZGQUJTKGN1clttcmVmcyAtIDEgKyAoaildIC0gY3VyW3ByZWZzIC0gMSAtIChqKV0pXAorICAgICAgICAgICAgICAgICAgKyBGRkFCUyhjdXJbbXJlZnMgICsoaildIC0gY3VyW3ByZWZzICAtKGopXSlcCisgICAgICAgICAgICAgICAgICArIEZGQUJTKGN1clttcmVmcyArIDEgKyAoaildIC0gY3VyW3ByZWZzICsgMSAtIChqKV0pO1wKKyAgICAgICAgaWYgKHNjb3JlIDwgc3BhdGlhbF9zY29yZSkge1wKKyAgICAgICAgICAgIHNwYXRpYWxfc2NvcmU9IHNjb3JlO1wKKyAgICAgICAgICAgIHNwYXRpYWxfcHJlZD0gKGN1clttcmVmcyAgKyhqKV0gKyBjdXJbcHJlZnMgIC0oaildKT4+MTtcCisKKy8qIFRoZSBpc19ub3RfZWRnZSBhcmd1bWVudCBoZXJlIGNvbnRyb2xzIHdoZW4gdGhlIGNvZGUgd2lsbCBlbnRlciBhIGJyYW5jaAorICogd2hpY2ggcmVhZHMgdXAgdG8gYW5kIGluY2x1ZGluZyB4LTMgYW5kIHgrMy4gKi8KKworI2RlZmluZSBGSUxURVIoc3RhcnQsIGVuZCwgaXNfbm90X2VkZ2UpIFwKKyAgICBmb3IgKHggPSBzdGFydDsgIHggPCBlbmQ7IHgrKykgeyBcCisgICAgICAgIGludCBjID0gY3VyW21yZWZzXTsgXAorICAgICAgICBpbnQgZCA9IChwcmV2MlswXSArIG5leHQyWzBdKT4+MTsgXAorICAgICAgICBpbnQgZSA9IGN1cltwcmVmc107IFwKKyAgICAgICAgaW50IHRlbXBvcmFsX2RpZmYwID0gRkZBQlMocHJldjJbMF0gLSBuZXh0MlswXSk7IFwKKyAgICAgICAgaW50IHRlbXBvcmFsX2RpZmYxID0oRkZBQlMocHJldlttcmVmc10gLSBjKSArIEZGQUJTKHByZXZbcHJlZnNdIC0gZSkgKT4+MTsgXAorICAgICAgICBpbnQgdGVtcG9yYWxfZGlmZjIgPShGRkFCUyhuZXh0W21yZWZzXSAtIGMpICsgRkZBQlMobmV4dFtwcmVmc10gLSBlKSApPj4xOyBcCisgICAgICAgIGludCBkaWZmID0gRkZNQVgzKHRlbXBvcmFsX2RpZmYwID4+IDEsIHRlbXBvcmFsX2RpZmYxLCB0ZW1wb3JhbF9kaWZmMik7IFwKKyAgICAgICAgaW50IHNwYXRpYWxfcHJlZCA9IChjK2UpID4+IDE7IFwKKyBcCisgICAgICAgIGlmIChpc19ub3RfZWRnZSkge1wKKyAgICAgICAgICAgIGludCBzcGF0aWFsX3Njb3JlID0gRkZBQlMoY3VyW21yZWZzIC0gMV0gLSBjdXJbcHJlZnMgLSAxXSkgKyBGRkFCUyhjLWUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRkZBQlMoY3VyW21yZWZzICsgMV0gLSBjdXJbcHJlZnMgKyAxXSkgLSAxOyBcCisgICAgICAgICAgICBDSEVDSygtMSkgQ0hFQ0soLTIpIH19IH19IFwKKyAgICAgICAgICAgIENIRUNLKCAxKSBDSEVDSyggMikgfX0gfX0gXAorICAgICAgICB9XAorIFwKKyAgICAgICAgaWYgKCEobW9kZSYyKSkgeyBcCisgICAgICAgICAgICBpbnQgYiA9IChwcmV2MlsyICogbXJlZnNdICsgbmV4dDJbMiAqIG1yZWZzXSk+PjE7IFwKKyAgICAgICAgICAgIGludCBmID0gKHByZXYyWzIgKiBwcmVmc10gKyBuZXh0MlsyICogcHJlZnNdKT4+MTsgXAorICAgICAgICAgICAgaW50IG1heCA9IEZGTUFYMyhkIC0gZSwgZCAtIGMsIEZGTUlOKGIgLSBjLCBmIC0gZSkpOyBcCisgICAgICAgICAgICBpbnQgbWluID0gRkZNSU4zKGQgLSBlLCBkIC0gYywgRkZNQVgoYiAtIGMsIGYgLSBlKSk7IFwKKyBcCisgICAgICAgICAgICBkaWZmID0gRkZNQVgzKGRpZmYsIG1pbiwgLW1heCk7IFwKKyAgICAgICAgfSBcCisgXAorICAgICAgICBpZiAoc3BhdGlhbF9wcmVkID4gZCArIGRpZmYpIFwKKyAgICAgICAgICAgc3BhdGlhbF9wcmVkID0gZCArIGRpZmY7IFwKKyAgICAgICAgZWxzZSBpZiAoc3BhdGlhbF9wcmVkIDwgZCAtIGRpZmYpIFwKKyAgICAgICAgICAgc3BhdGlhbF9wcmVkID0gZCAtIGRpZmY7IFwKKyBcCisgICAgICAgIGRzdFswXSA9IHNwYXRpYWxfcHJlZDsgXAorIFwKKyAgICAgICAgZHN0Kys7IFwKKyAgICAgICAgY3VyKys7IFwKKyAgICAgICAgcHJldisrOyBcCisgICAgICAgIG5leHQrKzsgXAorICAgICAgICBwcmV2MisrOyBcCisgICAgICAgIG5leHQyKys7IFwKKyAgICB9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9saW5lX2Modm9pZCAqZHN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHJldjEsIHZvaWQgKmN1cjEsIHZvaWQgKm5leHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IHByZWZzLCBpbnQgbXJlZnMsIGludCBwYXJpdHksIGludCBtb2RlKQoreworICAgIHVpbnQ4X3QgKmRzdCAgPSBkc3QxOworICAgIHVpbnQ4X3QgKnByZXYgPSBwcmV2MTsKKyAgICB1aW50OF90ICpjdXIgID0gY3VyMTsKKyAgICB1aW50OF90ICpuZXh0ID0gbmV4dDE7CisgICAgaW50IHg7CisgICAgdWludDhfdCAqcHJldjIgPSBwYXJpdHkgPyBwcmV2IDogY3VyIDsKKyAgICB1aW50OF90ICpuZXh0MiA9IHBhcml0eSA/IGN1ciAgOiBuZXh0OworCisgICAgLyogVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBwb2ludGVycyBhbHJlYWR5IHBvaW50aW5nIHRvIGRhdGFbM10gYW5kCisgICAgICogd2l0aCA2IHN1YnRyYWN0ZWQgZnJvbSB0aGUgd2lkdGguICBUaGlzIGFsbG93cyB0aGUgRklMVEVSIG1hY3JvIHRvIGJlCisgICAgICogY2FsbGVkIHNvIHRoYXQgaXQgcHJvY2Vzc2VzIGFsbCB0aGUgcGl4ZWxzIG5vcm1hbGx5LiAgQSBjb25zdGFudCB2YWx1ZSBvZgorICAgICAqIHRydWUgZm9yIGlzX25vdF9lZGdlIGxldHMgdGhlIGNvbXBpbGVyIGlnbm9yZSB0aGUgaWYgc3RhdGVtZW50LiAqLworICAgIEZJTFRFUigwLCB3LCAxKQorfQorCisjZGVmaW5lIE1BWF9BTElHTiA4CitzdGF0aWMgdm9pZCBmaWx0ZXJfZWRnZXModm9pZCAqZHN0MSwgdm9pZCAqcHJldjEsIHZvaWQgKmN1cjEsIHZvaWQgKm5leHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgcHJlZnMsIGludCBtcmVmcywgaW50IHBhcml0eSwgaW50IG1vZGUpCit7CisgICAgdWludDhfdCAqZHN0ICA9IGRzdDE7CisgICAgdWludDhfdCAqcHJldiA9IHByZXYxOworICAgIHVpbnQ4X3QgKmN1ciAgPSBjdXIxOworICAgIHVpbnQ4X3QgKm5leHQgPSBuZXh0MTsKKyAgICBpbnQgeDsKKyAgICB1aW50OF90ICpwcmV2MiA9IHBhcml0eSA/IHByZXYgOiBjdXIgOworICAgIHVpbnQ4X3QgKm5leHQyID0gcGFyaXR5ID8gY3VyICA6IG5leHQ7CisKKyAgICAvKiBPbmx5IGVkZ2UgcGl4ZWxzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGhlcmUuICBBIGNvbnN0YW50IHZhbHVlIG9mIGZhbHNlCisgICAgICogZm9yIGlzX25vdF9lZGdlIHNob3VsZCBsZXQgdGhlIGNvbXBpbGVyIGlnbm9yZSB0aGUgd2hvbGUgYnJhbmNoLiAqLworICAgIEZJTFRFUigwLCAzLCAwKQorCisgICAgZHN0ICA9ICh1aW50OF90Kilkc3QxICArIHcgLSAoTUFYX0FMSUdOLTEpOworICAgIHByZXYgPSAodWludDhfdCopcHJldjEgKyB3IC0gKE1BWF9BTElHTi0xKTsKKyAgICBjdXIgID0gKHVpbnQ4X3QqKWN1cjEgICsgdyAtIChNQVhfQUxJR04tMSk7CisgICAgbmV4dCA9ICh1aW50OF90KiluZXh0MSArIHcgLSAoTUFYX0FMSUdOLTEpOworICAgIHByZXYyID0gKHVpbnQ4X3QqKShwYXJpdHkgPyBwcmV2IDogY3VyKTsKKyAgICBuZXh0MiA9ICh1aW50OF90KikocGFyaXR5ID8gY3VyICA6IG5leHQpOworCisgICAgRklMVEVSKHcgLSAoTUFYX0FMSUdOLTEpLCB3IC0gMywgMSkKKyAgICBGSUxURVIodyAtIDMsIHcsIDApCit9CisKKworc3RhdGljIHZvaWQgZmlsdGVyX2xpbmVfY18xNmJpdCh2b2lkICpkc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwcmV2MSwgdm9pZCAqY3VyMSwgdm9pZCAqbmV4dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgcHJlZnMsIGludCBtcmVmcywgaW50IHBhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUpCit7CisgICAgdWludDE2X3QgKmRzdCAgPSBkc3QxOworICAgIHVpbnQxNl90ICpwcmV2ID0gcHJldjE7CisgICAgdWludDE2X3QgKmN1ciAgPSBjdXIxOworICAgIHVpbnQxNl90ICpuZXh0ID0gbmV4dDE7CisgICAgaW50IHg7CisgICAgdWludDE2X3QgKnByZXYyID0gcGFyaXR5ID8gcHJldiA6IGN1ciA7CisgICAgdWludDE2X3QgKm5leHQyID0gcGFyaXR5ID8gY3VyICA6IG5leHQ7CisgICAgbXJlZnMgLz0gMjsKKyAgICBwcmVmcyAvPSAyOworCisgICAgRklMVEVSKDAsIHcsIDEpCit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9lZGdlc18xNmJpdCh2b2lkICpkc3QxLCB2b2lkICpwcmV2MSwgdm9pZCAqY3VyMSwgdm9pZCAqbmV4dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBwcmVmcywgaW50IG1yZWZzLCBpbnQgcGFyaXR5LCBpbnQgbW9kZSkKK3sKKyAgICB1aW50MTZfdCAqZHN0ICA9IGRzdDE7CisgICAgdWludDE2X3QgKnByZXYgPSBwcmV2MTsKKyAgICB1aW50MTZfdCAqY3VyICA9IGN1cjE7CisgICAgdWludDE2X3QgKm5leHQgPSBuZXh0MTsKKyAgICBpbnQgeDsKKyAgICB1aW50MTZfdCAqcHJldjIgPSBwYXJpdHkgPyBwcmV2IDogY3VyIDsKKyAgICB1aW50MTZfdCAqbmV4dDIgPSBwYXJpdHkgPyBjdXIgIDogbmV4dDsKKyAgICBtcmVmcyAvPSAyOworICAgIHByZWZzIC89IDI7CisKKyAgICBGSUxURVIoMCwgMywgMCkKKworICAgIGRzdCAgID0gKHVpbnQxNl90Kilkc3QxICArIHcgLSAoTUFYX0FMSUdOLzItMSk7CisgICAgcHJldiAgPSAodWludDE2X3QqKXByZXYxICsgdyAtIChNQVhfQUxJR04vMi0xKTsKKyAgICBjdXIgICA9ICh1aW50MTZfdCopY3VyMSAgKyB3IC0gKE1BWF9BTElHTi8yLTEpOworICAgIG5leHQgID0gKHVpbnQxNl90KiluZXh0MSArIHcgLSAoTUFYX0FMSUdOLzItMSk7CisgICAgcHJldjIgPSAodWludDE2X3QqKShwYXJpdHkgPyBwcmV2IDogY3VyKTsKKyAgICBuZXh0MiA9ICh1aW50MTZfdCopKHBhcml0eSA/IGN1ciAgOiBuZXh0KTsKKworICAgIEZJTFRFUih3IC0gKE1BWF9BTElHTi8yLTEpLCB3IC0gMywgMSkKKyAgICBGSUxURVIodyAtIDMsIHcsIDApCit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX3NsaWNlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgWUFESUZDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIFRocmVhZERhdGEgKnRkICA9IGFyZzsKKyAgICBpbnQgcmVmcyA9IHMtPmN1ci0+bGluZXNpemVbdGQtPnBsYW5lXTsKKyAgICBpbnQgZGYgPSAocy0+Y3NwLT5jb21wW3RkLT5wbGFuZV0uZGVwdGhfbWludXMxICsgOCkgLyA4OworICAgIGludCBwaXhfMyA9IDMgKiBkZjsKKyAgICBpbnQgc2xpY2Vfc3RhcnQgPSAodGQtPmggKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICBpbnQgc2xpY2VfZW5kICAgPSAodGQtPmggKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBpbnQgeTsKKworICAgIC8qIGZpbHRlcmluZyByZWFkcyAzIHBpeGVscyB0byB0aGUgbGVmdC9yaWdodDsgdG8gYXZvaWQgaW52YWxpZCByZWFkcywKKyAgICAgKiB3ZSBuZWVkIHRvIGNhbGwgdGhlIGMgdmFyaWFudCB3aGljaCBhdm9pZHMgdGhpcyBmb3IgYm9yZGVyIHBpeGVscworICAgICAqLworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgaWYgKCh5IF4gdGQtPnBhcml0eSkgJiAxKSB7CisgICAgICAgICAgICB1aW50OF90ICpwcmV2ID0gJnMtPnByZXYtPmRhdGFbdGQtPnBsYW5lXVt5ICogcmVmc107CisgICAgICAgICAgICB1aW50OF90ICpjdXIgID0gJnMtPmN1ciAtPmRhdGFbdGQtPnBsYW5lXVt5ICogcmVmc107CisgICAgICAgICAgICB1aW50OF90ICpuZXh0ID0gJnMtPm5leHQtPmRhdGFbdGQtPnBsYW5lXVt5ICogcmVmc107CisgICAgICAgICAgICB1aW50OF90ICpkc3QgID0gJnRkLT5mcmFtZS0+ZGF0YVt0ZC0+cGxhbmVdW3kgKiB0ZC0+ZnJhbWUtPmxpbmVzaXplW3RkLT5wbGFuZV1dOworICAgICAgICAgICAgaW50ICAgICBtb2RlICA9IHkgPT0gMSB8fCB5ICsgMiA9PSB0ZC0+aCA/IDIgOiBzLT5tb2RlOworICAgICAgICAgICAgcy0+ZmlsdGVyX2xpbmUoZHN0ICsgcGl4XzMsIHByZXYgKyBwaXhfMywgY3VyICsgcGl4XzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ICsgcGl4XzMsIHRkLT53IC0gKDMgKyBNQVhfQUxJR04vZGYtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICsgMSA8IHRkLT5oID8gcmVmcyA6IC1yZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA/IC1yZWZzIDogcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5wYXJpdHkgXiB0ZC0+dGZmLCBtb2RlKTsKKyAgICAgICAgICAgIHMtPmZpbHRlcl9lZGdlcyhkc3QsIHByZXYsIGN1ciwgbmV4dCwgdGQtPncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSArIDEgPCB0ZC0+aCA/IHJlZnMgOiAtcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID8gLXJlZnMgOiByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5wYXJpdHkgXiB0ZC0+dGZmLCBtb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweSgmdGQtPmZyYW1lLT5kYXRhW3RkLT5wbGFuZV1beSAqIHRkLT5mcmFtZS0+bGluZXNpemVbdGQtPnBsYW5lXV0sCisgICAgICAgICAgICAgICAgICAgJnMtPmN1ci0+ZGF0YVt0ZC0+cGxhbmVdW3kgKiByZWZzXSwgdGQtPncgKiBkZik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcihBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0cGljLAorICAgICAgICAgICAgICAgICAgIGludCBwYXJpdHksIGludCB0ZmYpCit7CisgICAgWUFESUZDb250ZXh0ICp5YWRpZiA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhIHRkID0geyAuZnJhbWUgPSBkc3RwaWMsIC5wYXJpdHkgPSBwYXJpdHksIC50ZmYgPSB0ZmYgfTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB5YWRpZi0+Y3NwLT5uYl9jb21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgaW50IHcgPSBkc3RwaWMtPndpZHRoOworICAgICAgICBpbnQgaCA9IGRzdHBpYy0+aGVpZ2h0OworCisgICAgICAgIGlmIChpID09IDEgfHwgaSA9PSAyKSB7CisgICAgICAgICAgICB3ID0gRkZfQ0VJTF9SU0hJRlQodywgeWFkaWYtPmNzcC0+bG9nMl9jaHJvbWFfdyk7CisgICAgICAgICAgICBoID0gRkZfQ0VJTF9SU0hJRlQoaCwgeWFkaWYtPmNzcC0+bG9nMl9jaHJvbWFfaCk7CisgICAgICAgIH0KKworCisgICAgICAgIHRkLncgICAgICAgPSB3OworICAgICAgICB0ZC5oICAgICAgID0gaDsKKyAgICAgICAgdGQucGxhbmUgICA9IGk7CisKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9zbGljZSwgJnRkLCBOVUxMLCBGRk1JTihoLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisgICAgfQorCisgICAgZW1tc19jKCk7Cit9CisKK3N0YXRpYyBpbnQgcmV0dXJuX2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgaXNfc2Vjb25kKQoreworICAgIFlBRElGQ29udGV4dCAqeWFkaWYgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpsaW5rICA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBpbnQgdGZmLCByZXQ7CisKKyAgICBpZiAoeWFkaWYtPnBhcml0eSA9PSAtMSkgeworICAgICAgICB0ZmYgPSB5YWRpZi0+Y3VyLT5pbnRlcmxhY2VkX2ZyYW1lID8KKyAgICAgICAgICAgICAgeWFkaWYtPmN1ci0+dG9wX2ZpZWxkX2ZpcnN0IDogMTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZmYgPSB5YWRpZi0+cGFyaXR5IF4gMTsKKyAgICB9CisKKyAgICBpZiAoaXNfc2Vjb25kKSB7CisgICAgICAgIHlhZGlmLT5vdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKGxpbmssIGxpbmstPncsIGxpbmstPmgpOworICAgICAgICBpZiAoIXlhZGlmLT5vdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMoeWFkaWYtPm91dCwgeWFkaWYtPmN1cik7CisgICAgICAgIHlhZGlmLT5vdXQtPmludGVybGFjZWRfZnJhbWUgPSAwOworICAgIH0KKworICAgIGZpbHRlcihjdHgsIHlhZGlmLT5vdXQsIHRmZiBeICFpc19zZWNvbmQsIHRmZik7CisKKyAgICBpZiAoaXNfc2Vjb25kKSB7CisgICAgICAgIGludDY0X3QgY3VyX3B0cyAgPSB5YWRpZi0+Y3VyLT5wdHM7CisgICAgICAgIGludDY0X3QgbmV4dF9wdHMgPSB5YWRpZi0+bmV4dC0+cHRzOworCisgICAgICAgIGlmIChuZXh0X3B0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBjdXJfcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICB5YWRpZi0+b3V0LT5wdHMgPSBjdXJfcHRzICsgbmV4dF9wdHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB5YWRpZi0+b3V0LT5wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCB5YWRpZi0+b3V0KTsKKworICAgIHlhZGlmLT5mcmFtZV9wZW5kaW5nID0gKHlhZGlmLT5tb2RlJjEpICYmICFpc19zZWNvbmQ7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjaGVja3N0cmlkZShZQURJRkNvbnRleHQgKnlhZGlmLCBjb25zdCBBVkZyYW1lICphLCBjb25zdCBBVkZyYW1lICpiKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB5YWRpZi0+Y3NwLT5uYl9jb21wb25lbnRzOyBpKyspCisgICAgICAgIGlmIChhLT5saW5lc2l6ZVtpXSAhPSBiLT5saW5lc2l6ZVtpXSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmaXhzdHJpZGUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmKQoreworICAgIEFWRnJhbWUgKmRzdCA9IGZmX2RlZmF1bHRfZ2V0X3ZpZGVvX2J1ZmZlcihsaW5rLCBmLT53aWR0aCwgZi0+aGVpZ2h0KTsKKyAgICBpZighZHN0KQorICAgICAgICByZXR1cm47CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhkc3QsIGYpOworICAgIGF2X2ltYWdlX2NvcHkoZHN0LT5kYXRhLCBkc3QtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiopZi0+ZGF0YSwgZi0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICBkc3QtPmZvcm1hdCwgZHN0LT53aWR0aCwgZHN0LT5oZWlnaHQpOworICAgIGF2X2ZyYW1lX3VucmVmKGYpOworICAgIGF2X2ZyYW1lX21vdmVfcmVmKGYsIGRzdCk7CisgICAgYXZfZnJhbWVfZnJlZSgmZHN0KTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGxpbmstPmRzdDsKKyAgICBZQURJRkNvbnRleHQgKnlhZGlmID0gY3R4LT5wcml2OworCisgICAgYXZfYXNzZXJ0MChmcmFtZSk7CisKKyAgICBpZiAoeWFkaWYtPmZyYW1lX3BlbmRpbmcpCisgICAgICAgIHJldHVybl9mcmFtZShjdHgsIDEpOworCisgICAgaWYgKHlhZGlmLT5wcmV2KQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZ5YWRpZi0+cHJldik7CisgICAgeWFkaWYtPnByZXYgPSB5YWRpZi0+Y3VyOworICAgIHlhZGlmLT5jdXIgID0geWFkaWYtPm5leHQ7CisgICAgeWFkaWYtPm5leHQgPSBmcmFtZTsKKworICAgIGlmICgheWFkaWYtPmN1ciAmJgorICAgICAgICAhKHlhZGlmLT5jdXIgPSBhdl9mcmFtZV9jbG9uZSh5YWRpZi0+bmV4dCkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKGNoZWNrc3RyaWRlKHlhZGlmLCB5YWRpZi0+bmV4dCwgeWFkaWYtPmN1cikpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJSZWFsbG9jYXRpbmcgZnJhbWUgZHVlIHRvIGRpZmZlcmluZyBzdHJpZGVcbiIpOworICAgICAgICBmaXhzdHJpZGUobGluaywgeWFkaWYtPm5leHQpOworICAgIH0KKyAgICBpZiAoY2hlY2tzdHJpZGUoeWFkaWYsIHlhZGlmLT5uZXh0LCB5YWRpZi0+Y3VyKSkKKyAgICAgICAgZml4c3RyaWRlKGxpbmssIHlhZGlmLT5jdXIpOworICAgIGlmICh5YWRpZi0+cHJldiAmJiBjaGVja3N0cmlkZSh5YWRpZiwgeWFkaWYtPm5leHQsIHlhZGlmLT5wcmV2KSkKKyAgICAgICAgZml4c3RyaWRlKGxpbmssIHlhZGlmLT5wcmV2KTsKKyAgICBpZiAoY2hlY2tzdHJpZGUoeWFkaWYsIHlhZGlmLT5uZXh0LCB5YWRpZi0+Y3VyKSB8fCAoeWFkaWYtPnByZXYgJiYgY2hlY2tzdHJpZGUoeWFkaWYsIHlhZGlmLT5uZXh0LCB5YWRpZi0+cHJldikpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWFsbG9jYXRlIGZyYW1lXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICgheWFkaWYtPnByZXYpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCh5YWRpZi0+ZGVpbnQgJiYgIXlhZGlmLT5jdXItPmludGVybGFjZWRfZnJhbWUpIHx8IGN0eC0+aXNfZGlzYWJsZWQpIHsKKyAgICAgICAgeWFkaWYtPm91dCAgPSBhdl9mcmFtZV9jbG9uZSh5YWRpZi0+Y3VyKTsKKyAgICAgICAgaWYgKCF5YWRpZi0+b3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBhdl9mcmFtZV9mcmVlKCZ5YWRpZi0+cHJldik7CisgICAgICAgIGlmICh5YWRpZi0+b3V0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICB5YWRpZi0+b3V0LT5wdHMgKj0gMjsKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIHlhZGlmLT5vdXQpOworICAgIH0KKworICAgIHlhZGlmLT5vdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKGN0eC0+b3V0cHV0c1swXSwgbGluay0+dywgbGluay0+aCk7CisgICAgaWYgKCF5YWRpZi0+b3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZfZnJhbWVfY29weV9wcm9wcyh5YWRpZi0+b3V0LCB5YWRpZi0+Y3VyKTsKKyAgICB5YWRpZi0+b3V0LT5pbnRlcmxhY2VkX2ZyYW1lID0gMDsKKworICAgIGlmICh5YWRpZi0+b3V0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHlhZGlmLT5vdXQtPnB0cyAqPSAyOworCisgICAgcmV0dXJuIHJldHVybl9mcmFtZShjdHgsIDApOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+c3JjOworICAgIFlBRElGQ29udGV4dCAqeWFkaWYgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoeWFkaWYtPmZyYW1lX3BlbmRpbmcpIHsKKyAgICAgICAgcmV0dXJuX2ZyYW1lKGN0eCwgMSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGRvIHsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAoeWFkaWYtPmVvZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgICAgICByZXQgID0gZmZfcmVxdWVzdF9mcmFtZShsaW5rLT5zcmMtPmlucHV0c1swXSk7CisKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiB5YWRpZi0+Y3VyKSB7CisgICAgICAgICAgICBBVkZyYW1lICpuZXh0ID0gYXZfZnJhbWVfY2xvbmUoeWFkaWYtPm5leHQpOworCisgICAgICAgICAgICBpZiAoIW5leHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgbmV4dC0+cHRzID0geWFkaWYtPm5leHQtPnB0cyAqIDIgLSB5YWRpZi0+Y3VyLT5wdHM7CisKKyAgICAgICAgICAgIGZpbHRlcl9mcmFtZShsaW5rLT5zcmMtPmlucHV0c1swXSwgbmV4dCk7CisgICAgICAgICAgICB5YWRpZi0+ZW9mID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfSB3aGlsZSAoIXlhZGlmLT5wcmV2KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBZQURJRkNvbnRleHQgKnlhZGlmID0gY3R4LT5wcml2OworCisgICAgYXZfZnJhbWVfZnJlZSgmeWFkaWYtPnByZXYpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnlhZGlmLT5jdXIgKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZ5YWRpZi0+bmV4dCk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE0LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE2LAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSQVAsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+c3JjOworICAgIFlBRElGQ29udGV4dCAqcyA9IGxpbmstPnNyYy0+cHJpdjsKKworICAgIGxpbmstPnRpbWVfYmFzZS5udW0gPSBsaW5rLT5zcmMtPmlucHV0c1swXS0+dGltZV9iYXNlLm51bTsKKyAgICBsaW5rLT50aW1lX2Jhc2UuZGVuID0gbGluay0+c3JjLT5pbnB1dHNbMF0tPnRpbWVfYmFzZS5kZW4gKiAyOworICAgIGxpbmstPncgICAgICAgICAgICAgPSBsaW5rLT5zcmMtPmlucHV0c1swXS0+dzsKKyAgICBsaW5rLT5oICAgICAgICAgICAgID0gbGluay0+c3JjLT5pbnB1dHNbMF0tPmg7CisKKyAgICBpZihzLT5tb2RlJjEpCisgICAgICAgIGxpbmstPmZyYW1lX3JhdGUgPSBhdl9tdWxfcShsaW5rLT5zcmMtPmlucHV0c1swXS0+ZnJhbWVfcmF0ZSwgKEFWUmF0aW9uYWwpezIsMX0pOworCisgICAgaWYgKGxpbmstPncgPCAzIHx8IGxpbmstPmggPCAzKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlZpZGVvIG9mIGxlc3MgdGhhbiAzIGNvbHVtbnMgb3IgbGluZXMgaXMgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcy0+Y3NwID0gYXZfcGl4X2ZtdF9kZXNjX2dldChsaW5rLT5mb3JtYXQpOworICAgIGlmIChzLT5jc3AtPmNvbXBbMF0uZGVwdGhfbWludXMxIC8gOCA9PSAxKSB7CisgICAgICAgIHMtPmZpbHRlcl9saW5lICA9IGZpbHRlcl9saW5lX2NfMTZiaXQ7CisgICAgICAgIHMtPmZpbHRlcl9lZGdlcyA9IGZpbHRlcl9lZGdlc18xNmJpdDsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5maWx0ZXJfbGluZSAgPSBmaWx0ZXJfbGluZV9jOworICAgICAgICBzLT5maWx0ZXJfZWRnZXMgPSBmaWx0ZXJfZWRnZXM7CisgICAgfQorCisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl95YWRpZl9pbml0X3g4NihzKTsKKworICAgIHJldHVybiAwOworfQorCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFlBRElGQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKKyNkZWZpbmUgQ09OU1QobmFtZSwgaGVscCwgdmFsLCB1bml0KSB7IG5hbWUsIGhlbHAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND12YWx9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgdW5pdCB9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiB5YWRpZl9vcHRpb25zW10gPSB7CisgICAgeyAibW9kZSIsICAgInNwZWNpZnkgdGhlIGludGVybGFjaW5nIG1vZGUiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9WUFESUZfTU9ERV9TRU5EX0ZSQU1FfSwgMCwgMywgRkxBR1MsICJtb2RlIn0sCisgICAgQ09OU1QoInNlbmRfZnJhbWUiLCAgICAgICAgICAgInNlbmQgb25lIGZyYW1lIGZvciBlYWNoIGZyYW1lIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUFESUZfTU9ERV9TRU5EX0ZSQU1FLCAgICAgICAgICAgIm1vZGUiKSwKKyAgICBDT05TVCgic2VuZF9maWVsZCIsICAgICAgICAgICAic2VuZCBvbmUgZnJhbWUgZm9yIGVhY2ggZmllbGQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQURJRl9NT0RFX1NFTkRfRklFTEQsICAgICAgICAgICAibW9kZSIpLAorICAgIENPTlNUKCJzZW5kX2ZyYW1lX25vc3BhdGlhbCIsICJzZW5kIG9uZSBmcmFtZSBmb3IgZWFjaCBmcmFtZSwgYnV0IHNraXAgc3BhdGlhbCBpbnRlcmxhY2luZyBjaGVjayIsIFlBRElGX01PREVfU0VORF9GUkFNRV9OT1NQQVRJQUwsICJtb2RlIiksCisgICAgQ09OU1QoInNlbmRfZmllbGRfbm9zcGF0aWFsIiwgInNlbmQgb25lIGZyYW1lIGZvciBlYWNoIGZpZWxkLCBidXQgc2tpcCBzcGF0aWFsIGludGVybGFjaW5nIGNoZWNrIiwgWUFESUZfTU9ERV9TRU5EX0ZJRUxEX05PU1BBVElBTCwgIm1vZGUiKSwKKworICAgIHsgInBhcml0eSIsICJzcGVjaWZ5IHRoZSBhc3N1bWVkIHBpY3R1cmUgZmllbGQgcGFyaXR5IiwgT0ZGU0VUKHBhcml0eSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9WUFESUZfUEFSSVRZX0FVVE99LCAtMSwgMSwgRkxBR1MsICJwYXJpdHkiIH0sCisgICAgQ09OU1QoInRmZiIsICAiYXNzdW1lIHRvcCBmaWVsZCBmaXJzdCIsICAgIFlBRElGX1BBUklUWV9URkYsICAicGFyaXR5IiksCisgICAgQ09OU1QoImJmZiIsICAiYXNzdW1lIGJvdHRvbSBmaWVsZCBmaXJzdCIsIFlBRElGX1BBUklUWV9CRkYsICAicGFyaXR5IiksCisgICAgQ09OU1QoImF1dG8iLCAiYXV0byBkZXRlY3QgcGFyaXR5IiwgICAgICAgIFlBRElGX1BBUklUWV9BVVRPLCAicGFyaXR5IiksCisKKyAgICB7ICJkZWludCIsICJzcGVjaWZ5IHdoaWNoIGZyYW1lcyB0byBkZWludGVybGFjZSIsIE9GRlNFVChkZWludCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9WUFESUZfREVJTlRfQUxMfSwgMCwgMSwgRkxBR1MsICJkZWludCIgfSwKKyAgICBDT05TVCgiYWxsIiwgICAgICAgICJkZWludGVybGFjZSBhbGwgZnJhbWVzIiwgICAgICAgICAgICAgICAgICAgICAgIFlBRElGX0RFSU5UX0FMTCwgICAgICAgICAiZGVpbnQiKSwKKyAgICBDT05TVCgiaW50ZXJsYWNlZCIsICJvbmx5IGRlaW50ZXJsYWNlIGZyYW1lcyBtYXJrZWQgYXMgaW50ZXJsYWNlZCIsIFlBRElGX0RFSU5UX0lOVEVSTEFDRUQsICAiZGVpbnQiKSwKKworICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoeWFkaWYpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfeWFkaWZfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl95YWRpZl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfeWFkaWYgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAieWFkaWYiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRlaW50ZXJsYWNlIHRoZSBpbnB1dCBpbWFnZS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihZQURJRkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnlhZGlmX2NsYXNzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGF2ZmlsdGVyX3ZmX3lhZGlmX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX3ZmX3lhZGlmX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfSU5URVJOQUwgfCBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZmX3pvb21wYW4uYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl96b29tcGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxNzllNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92Zl96b29tcGFuLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3N3c2NhbGUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJpbl93IiwgICAiaXciLAorICAgICJpbl9oIiwgICAiaWgiLAorICAgICJvdXRfdyIsICAib3ciLAorICAgICJvdXRfaCIsICAib2giLAorICAgICJpbiIsCisgICAgIm9uIiwKKyAgICAiZHVyYXRpb24iLAorICAgICJwZHVyYXRpb24iLAorICAgICJ0aW1lIiwKKyAgICAiZnJhbWUiLAorICAgICJ6b29tIiwKKyAgICAicHpvb20iLAorICAgICJ4IiwgInB4IiwKKyAgICAieSIsICJweSIsCisgICAgImEiLAorICAgICJzYXIiLAorICAgICJkYXIiLAorICAgICJoc3ViIiwKKyAgICAidnN1YiIsCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX0lOX1csICAgVkFSX0lXLAorICAgIFZBUl9JTl9ILCAgIFZBUl9JSCwKKyAgICBWQVJfT1VUX1csICBWQVJfT1csCisgICAgVkFSX09VVF9ILCAgVkFSX09ILAorICAgIFZBUl9JTiwKKyAgICBWQVJfT04sCisgICAgVkFSX0RVUkFUSU9OLAorICAgIFZBUl9QRFVSQVRJT04sCisgICAgVkFSX1RJTUUsCisgICAgVkFSX0ZSQU1FLAorICAgIFZBUl9aT09NLAorICAgIFZBUl9QWk9PTSwKKyAgICBWQVJfWCwgVkFSX1BYLAorICAgIFZBUl9ZLCBWQVJfUFksCisgICAgVkFSX0EsCisgICAgVkFSX1NBUiwKKyAgICBWQVJfREFSLAorICAgIFZBUl9IU1VCLAorICAgIFZBUl9WU1VCLAorICAgIFZBUlNfTkIKK307CisKK3R5cGVkZWYgc3RydWN0IFpQY29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgY2hhciAqem9vbV9leHByX3N0cjsKKyAgICBjaGFyICp4X2V4cHJfc3RyOworICAgIGNoYXIgKnlfZXhwcl9zdHI7CisgICAgY2hhciAqZHVyYXRpb25fZXhwcl9zdHI7CisgICAgaW50IHcsIGg7CisgICAgZG91YmxlIHgsIHk7CisgICAgZG91YmxlIHByZXZfem9vbTsKKyAgICBpbnQgcHJldl9uYl9mcmFtZXM7CisgICAgc3RydWN0IFN3c0NvbnRleHQgKnN3czsKKyAgICBpbnQ2NF90IGZyYW1lX2NvdW50OworfSBaUENvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFpQQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gem9vbXBhbl9vcHRpb25zW10gPSB7CisgICAgeyAiem9vbSIsICJzZXQgdGhlIHpvb20gZXhwcmVzc2lvbiIsIE9GRlNFVCh6b29tX2V4cHJfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICIxIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInoiLCAic2V0IHRoZSB6b29tIGV4cHJlc3Npb24iLCBPRkZTRVQoem9vbV9leHByX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiMSIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJ4IiwgInNldCB0aGUgeCBleHByZXNzaW9uIiwgT0ZGU0VUKHhfZXhwcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIwIn0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAieSIsICJzZXQgdGhlIHkgZXhwcmVzc2lvbiIsIE9GRlNFVCh5X2V4cHJfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iMCJ9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImQiLCAic2V0IHRoZSBkdXJhdGlvbiBleHByZXNzaW9uIiwgT0ZGU0VUKGR1cmF0aW9uX2V4cHJfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iOTAifSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJzIiwgInNldCB0aGUgb3V0cHV0IGltYWdlIHNpemUiLCBPRkZTRVQodyksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyPSJoZDcyMCJ9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moem9vbXBhbik7CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFpQQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPnByZXZfem9vbSA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgWlBDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgb3V0bGluay0+dyA9IHMtPnc7CisgICAgb3V0bGluay0+aCA9IHMtPmg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIFpQQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJTX05CXSwgbmJfZnJhbWVzLCB6b29tLCBkeCwgZHk7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbi0+Zm9ybWF0KTsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IGksIGssIHgsIHksIHcsIGgsIHJldCA9IDA7CisKKyAgICB2YXJfdmFsdWVzW1ZBUl9JTl9XXSAgPSB2YXJfdmFsdWVzW1ZBUl9JV10gPSBpbi0+d2lkdGg7CisgICAgdmFyX3ZhbHVlc1tWQVJfSU5fSF0gID0gdmFyX3ZhbHVlc1tWQVJfSUhdID0gaW4tPmhlaWdodDsKKyAgICB2YXJfdmFsdWVzW1ZBUl9PVVRfV10gPSB2YXJfdmFsdWVzW1ZBUl9PV10gPSBzLT53OworICAgIHZhcl92YWx1ZXNbVkFSX09VVF9IXSA9IHZhcl92YWx1ZXNbVkFSX09IXSA9IHMtPmg7CisgICAgdmFyX3ZhbHVlc1tWQVJfSU5dICAgID0gaW5saW5rLT5mcmFtZV9jb3VudCArIDE7CisgICAgdmFyX3ZhbHVlc1tWQVJfT05dICAgID0gb3V0bGluay0+ZnJhbWVfY291bnQgKyAxOworICAgIHZhcl92YWx1ZXNbVkFSX1BYXSAgICA9IHMtPng7CisgICAgdmFyX3ZhbHVlc1tWQVJfUFldICAgID0gcy0+eTsKKyAgICB2YXJfdmFsdWVzW1ZBUl9YXSAgICAgPSAwOworICAgIHZhcl92YWx1ZXNbVkFSX1ldICAgICA9IDA7CisgICAgdmFyX3ZhbHVlc1tWQVJfUFpPT01dID0gcy0+cHJldl96b29tOworICAgIHZhcl92YWx1ZXNbVkFSX1pPT01dICA9IDE7CisgICAgdmFyX3ZhbHVlc1tWQVJfUERVUkFUSU9OXSA9IHMtPnByZXZfbmJfZnJhbWVzOworICAgIHZhcl92YWx1ZXNbVkFSX0FdICAgICA9IChkb3VibGUpIGluLT53aWR0aCAvIGluLT5oZWlnaHQ7CisgICAgdmFyX3ZhbHVlc1tWQVJfU0FSXSAgID0gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA/CisgICAgICAgIChkb3VibGUpIGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gLyBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuIDogMTsKKyAgICB2YXJfdmFsdWVzW1ZBUl9EQVJdICAgPSB2YXJfdmFsdWVzW1ZBUl9BXSAqIHZhcl92YWx1ZXNbVkFSX1NBUl07CisgICAgdmFyX3ZhbHVlc1tWQVJfSFNVQl0gID0gMSA8PCBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHZhcl92YWx1ZXNbVkFSX1ZTVUJdICA9IDEgPDwgZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIGlmICgocmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmbmJfZnJhbWVzLCBzLT5kdXJhdGlvbl9leHByX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCB2YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHZhcl92YWx1ZXNbVkFSX0RVUkFUSU9OXSA9IG5iX2ZyYW1lczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgaW50IHB4WzRdOworICAgICAgICBpbnQgcHlbNF07CisgICAgICAgIHVpbnQ4X3QgKmlucHV0WzRdOworICAgICAgICBpbnQ2NF90IHB0cyA9IGF2X3Jlc2NhbGVfcShpbi0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+dGltZV9iYXNlKSArIHMtPmZyYW1lX2NvdW50OworCisgICAgICAgIHZhcl92YWx1ZXNbVkFSX1RJTUVdID0gcHRzICogYXZfcTJkKG91dGxpbmstPnRpbWVfYmFzZSk7CisgICAgICAgIHZhcl92YWx1ZXNbVkFSX0ZSQU1FXSA9IGk7CisgICAgICAgIHZhcl92YWx1ZXNbVkFSX09OXSA9IG91dGxpbmstPmZyYW1lX2NvdW50ICsgMTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZ6b29tLCBzLT56b29tX2V4cHJfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCB2YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIHpvb20gPSBhdl9jbGlwZCh6b29tLCAxLCAxMCk7CisgICAgICAgIHZhcl92YWx1ZXNbVkFSX1pPT01dID0gem9vbTsKKyAgICAgICAgdyA9IGluLT53aWR0aCAqICgxLjAgLyB6b29tKTsKKyAgICAgICAgaCA9IGluLT5oZWlnaHQgKiAoMS4wIC8gem9vbSk7CisKKyAgICAgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZkeCwgcy0+eF9leHByX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgdmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgeCA9IGR4ID0gYXZfY2xpcGQoZHgsIDAsIEZGTUFYKGluLT53aWR0aCAtIHcsIDApKTsKKyAgICAgICAgdmFyX3ZhbHVlc1tWQVJfWF0gPSBkeDsKKyAgICAgICAgeCAmPSB+KCgxIDw8IGRlc2MtPmxvZzJfY2hyb21hX3cpIC0gMSk7CisKKyAgICAgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZkeSwgcy0+eV9leHByX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgdmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgeSA9IGR5ID0gYXZfY2xpcGQoZHksIDAsIEZGTUFYKGluLT5oZWlnaHQgLSBoLCAwKSk7CisgICAgICAgIHZhcl92YWx1ZXNbVkFSX1ldID0gZHk7CisgICAgICAgIHkgJj0gfigoMSA8PCBkZXNjLT5sb2cyX2Nocm9tYV9oKSAtIDEpOworCisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBweFsxXSA9IHB4WzJdID0gRkZfQ0VJTF9SU0hJRlQoeCwgZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgICAgIHB4WzBdID0gcHhbM10gPSB4OworCisgICAgICAgIHB5WzFdID0gcHlbMl0gPSBGRl9DRUlMX1JTSElGVCh5LCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICAgICAgcHlbMF0gPSBweVszXSA9IHk7CisKKyAgICAgICAgcy0+c3dzID0gc3dzX2FsbG9jX2NvbnRleHQoKTsKKyAgICAgICAgaWYgKCFzLT5zd3MpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoayA9IDA7IGluLT5kYXRhW2tdOyBrKyspCisgICAgICAgICAgICBpbnB1dFtrXSA9IGluLT5kYXRhW2tdICsgcHlba10gKiBpbi0+bGluZXNpemVba10gKyBweFtrXTsKKworICAgICAgICBhdl9vcHRfc2V0X2ludChzLT5zd3MsICJzcmN3IiwgdywgMCk7CisgICAgICAgIGF2X29wdF9zZXRfaW50KHMtPnN3cywgInNyY2giLCBoLCAwKTsKKyAgICAgICAgYXZfb3B0X3NldF9pbnQocy0+c3dzLCAic3JjX2Zvcm1hdCIsIGluLT5mb3JtYXQsIDApOworICAgICAgICBhdl9vcHRfc2V0X2ludChzLT5zd3MsICJkc3R3Iiwgb3V0bGluay0+dywgMCk7CisgICAgICAgIGF2X29wdF9zZXRfaW50KHMtPnN3cywgImRzdGgiLCBvdXRsaW5rLT5oLCAwKTsKKyAgICAgICAgYXZfb3B0X3NldF9pbnQocy0+c3dzLCAiZHN0X2Zvcm1hdCIsIG91dGxpbmstPmZvcm1hdCwgMCk7CisgICAgICAgIGF2X29wdF9zZXRfaW50KHMtPnN3cywgInN3c19mbGFncyIsIFNXU19CSUNVQklDLCAwKTsKKworICAgICAgICBpZiAoKHJldCA9IHN3c19pbml0X2NvbnRleHQocy0+c3dzLCBOVUxMLCBOVUxMKSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIHN3c19zY2FsZShzLT5zd3MsIChjb25zdCB1aW50OF90ICpjb25zdCAqKSZpbnB1dCwgaW4tPmxpbmVzaXplLCAwLCBoLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUpOworCisgICAgICAgIG91dC0+cHRzID0gcHRzOworICAgICAgICBzLT5mcmFtZV9jb3VudCsrOworCisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHN3c19mcmVlQ29udGV4dChzLT5zd3MpOworICAgICAgICBzLT5zd3MgPSBOVUxMOworICAgIH0KKworICAgIHMtPnggPSBkeDsKKyAgICBzLT55ID0gZHk7CisgICAgcy0+cHJldl96b29tID0gem9vbTsKKyAgICBzLT5wcmV2X25iX2ZyYW1lcyA9IG5iX2ZyYW1lczsKKworZmFpbDoKKyAgICBzd3NfZnJlZUNvbnRleHQocy0+c3dzKTsKKyAgICBzLT5zd3MgPSBOVUxMOworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgIEFWX1BJWF9GTVRfWVVWNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTBQLCAgQVZfUElYX0ZNVF9ZVVY0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFpQQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHN3c19mcmVlQ29udGV4dChzLT5zd3MpOworICAgIHMtPnN3cyA9IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3pvb21wYW4gPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiem9vbXBhbiIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgWm9vbSAmIFBhbiBlZmZlY3QuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoWlBDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZ6b29tcGFuX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBpbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBvdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZpZGVvLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTU1NDgzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZpZGVvLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBCb2JieSBCaW5naGFtCisgKiBDb3B5cmlnaHQgU3RlZmFubyBTYWJhdGluaSA8c3RlZmFzYWIgZ21haWwgY29tPgorICogQ29weXJpZ2h0IFZpdG9yIFNlc3NhayA8dml0b3IxMDAxIGdtYWlsIGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK0FWRnJhbWUgKmZmX251bGxfZ2V0X3ZpZGVvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmxpbmssIGludCB3LCBpbnQgaCkKK3sKKyAgICByZXR1cm4gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihsaW5rLT5kc3QtPm91dHB1dHNbMF0sIHcsIGgpOworfQorCisvKiBUT0RPOiBzZXQgdGhlIGJ1ZmZlcidzIHByaXYgbWVtYmVyIHRvIGEgY29udGV4dCBzdHJ1Y3R1cmUgZm9yIHRoZSB3aG9sZQorICogZmlsdGVyIGNoYWluLiAgVGhpcyB3aWxsIGFsbG93IGZvciBhIGJ1ZmZlciBwb29sIGluc3RlYWQgb2YgdGhlIGNvbnN0YW50CisgKiBhbGxvYyAmIGZyZWUgY3ljbGUgY3VycmVudGx5IGltcGxlbWVudGVkLiAqLworQVZGcmFtZSAqZmZfZGVmYXVsdF9nZXRfdmlkZW9fYnVmZmVyKEFWRmlsdGVyTGluayAqbGluaywgaW50IHcsIGludCBoKQoreworICAgIEFWRnJhbWUgKmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmcmFtZS0+d2lkdGggID0gdzsKKyAgICBmcmFtZS0+aGVpZ2h0ID0gaDsKKyAgICBmcmFtZS0+Zm9ybWF0ID0gbGluay0+Zm9ybWF0OworCisgICAgcmV0ID0gYXZfZnJhbWVfZ2V0X2J1ZmZlcihmcmFtZSwgMzIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisKKyAgICByZXR1cm4gZnJhbWU7Cit9CisKKyNpZiBGRl9BUElfQVZGSUxURVJCVUZGRVIKK0FWRmlsdGVyQnVmZmVyUmVmICoKK2F2ZmlsdGVyX2dldF92aWRlb19idWZmZXJfcmVmX2Zyb21fYXJyYXlzKHVpbnQ4X3QgKiBjb25zdCBkYXRhWzRdLCBjb25zdCBpbnQgbGluZXNpemVbNF0sIGludCBwZXJtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdCkKK3sKKyAgICBBVkZpbHRlckJ1ZmZlciAqcGljID0gYXZfbWFsbG9jeihzaXplb2YoQVZGaWx0ZXJCdWZmZXIpKTsKKyAgICBBVkZpbHRlckJ1ZmZlclJlZiAqcGljcmVmID0gYXZfbWFsbG9jeihzaXplb2YoQVZGaWx0ZXJCdWZmZXJSZWYpKTsKKworICAgIGlmICghcGljIHx8ICFwaWNyZWYpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHBpY3JlZi0+YnVmID0gcGljOworICAgIHBpY3JlZi0+YnVmLT5mcmVlID0gZmZfYXZmaWx0ZXJfZGVmYXVsdF9mcmVlX2J1ZmZlcjsKKyAgICBpZiAoIShwaWNyZWYtPnZpZGVvID0gYXZfbWFsbG9jeihzaXplb2YoQVZGaWx0ZXJCdWZmZXJSZWZWaWRlb1Byb3BzKSkpKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBwaWMtPncgPSBwaWNyZWYtPnZpZGVvLT53ID0gdzsKKyAgICBwaWMtPmggPSBwaWNyZWYtPnZpZGVvLT5oID0gaDsKKworICAgIC8qIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGdldHMgcmVhZCBwZXJtaXNzaW9uIG9yIGl0J3MgdXNlbGVzcyBmb3Igb3V0cHV0ICovCisgICAgcGljcmVmLT5wZXJtcyA9IHBlcm1zIHwgQVZfUEVSTV9SRUFEOworCisgICAgcGljLT5yZWZjb3VudCA9IDE7CisgICAgcGljcmVmLT50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHBpYy0+Zm9ybWF0ID0gcGljcmVmLT5mb3JtYXQgPSBmb3JtYXQ7CisKKyAgICBtZW1jcHkocGljLT5kYXRhLCAgICAgICAgZGF0YSwgICAgICAgICAgNCpzaXplb2YoZGF0YVswXSkpOworICAgIG1lbWNweShwaWMtPmxpbmVzaXplLCAgICBsaW5lc2l6ZSwgICAgICA0KnNpemVvZihsaW5lc2l6ZVswXSkpOworICAgIG1lbWNweShwaWNyZWYtPmRhdGEsICAgICBwaWMtPmRhdGEsICAgICBzaXplb2YocGljcmVmLT5kYXRhKSk7CisgICAgbWVtY3B5KHBpY3JlZi0+bGluZXNpemUsIHBpYy0+bGluZXNpemUsIHNpemVvZihwaWNyZWYtPmxpbmVzaXplKSk7CisKKyAgICBwaWMtPiAgIGV4dGVuZGVkX2RhdGEgPSBwaWMtPmRhdGE7CisgICAgcGljcmVmLT5leHRlbmRlZF9kYXRhID0gcGljcmVmLT5kYXRhOworCisgICAgcGljcmVmLT5wdHMgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIHJldHVybiBwaWNyZWY7CisKK2ZhaWw6CisgICAgaWYgKHBpY3JlZiAmJiBwaWNyZWYtPnZpZGVvKQorICAgICAgICBhdl9mcmVlKHBpY3JlZi0+dmlkZW8pOworICAgIGF2X2ZyZWUocGljcmVmKTsKKyAgICBhdl9mcmVlKHBpYyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworQVZGcmFtZSAqZmZfZ2V0X3ZpZGVvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmxpbmssIGludCB3LCBpbnQgaCkKK3sKKyAgICBBVkZyYW1lICpyZXQgPSBOVUxMOworCisgICAgRkZfVFBSSU5URl9TVEFSVChOVUxMLCBnZXRfdmlkZW9fYnVmZmVyKTsgZmZfdGxvZ19saW5rKE5VTEwsIGxpbmssIDApOworCisgICAgaWYgKGxpbmstPmRzdHBhZC0+Z2V0X3ZpZGVvX2J1ZmZlcikKKyAgICAgICAgcmV0ID0gbGluay0+ZHN0cGFkLT5nZXRfdmlkZW9fYnVmZmVyKGxpbmssIHcsIGgpOworCisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldCA9IGZmX2RlZmF1bHRfZ2V0X3ZpZGVvX2J1ZmZlcihsaW5rLCB3LCBoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmlkZW8uaCBiL2ZmbXBlZy9saWJhdmZpbHRlci92aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzU4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmlkZW8uaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IEJvYmJ5IEJpbmdoYW0KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9WSURFT19ICisjZGVmaW5lIEFWRklMVEVSX1ZJREVPX0gKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisKK0FWRnJhbWUgKmZmX2RlZmF1bHRfZ2V0X3ZpZGVvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmxpbmssIGludCB3LCBpbnQgaCk7CitBVkZyYW1lICpmZl9udWxsX2dldF92aWRlb19idWZmZXIoQVZGaWx0ZXJMaW5rICpsaW5rLCBpbnQgdywgaW50IGgpOworCisvKioKKyAqIFJlcXVlc3QgYSBwaWN0dXJlIGJ1ZmZlciB3aXRoIGEgc3BlY2lmaWMgc2V0IG9mIHBlcm1pc3Npb25zLgorICoKKyAqIEBwYXJhbSBsaW5rICB0aGUgb3V0cHV0IGxpbmsgdG8gdGhlIGZpbHRlciBmcm9tIHdoaWNoIHRoZSBidWZmZXIgd2lsbAorICogICAgICAgICAgICAgIGJlIHJlcXVlc3RlZAorICogQHBhcmFtIHcgICAgIHRoZSBtaW5pbXVtIHdpZHRoIG9mIHRoZSBidWZmZXIgdG8gYWxsb2NhdGUKKyAqIEBwYXJhbSBoICAgICB0aGUgbWluaW11bSBoZWlnaHQgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZQorICogQHJldHVybiAgICAgIEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIuIFRoaXMgbXVzdCBiZSB1bnJlZmVyZW5jZWQgd2l0aAorICogICAgICAgICAgICAgIGF2ZmlsdGVyX3VucmVmX2J1ZmZlciB3aGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCBpdC4KKyAqLworQVZGcmFtZSAqZmZfZ2V0X3ZpZGVvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmxpbmssIGludCB3LCBpbnQgaCk7CisKKyNlbmRpZiAvKiBBVkZJTFRFUl9WSURFT19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmlkc3RhYnV0aWxzLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmlkc3RhYnV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1NDRjZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92aWRzdGFidXRpbHMuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIEdlb3JnIE1hcnRpdXMgPGdlb3JnIGRvdCBtYXJ0aXVzIGF0IHdlYiBkb3QgZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ2aWRzdGFidXRpbHMuaCIKKworLyoqIGNvbnZlcnQgQVYncyBwaXhlbGZvcm1hdCB0byB2aWQuc3RhYiBwaXhlbGZvcm1hdCAqLworVlNQaXhlbEZvcm1hdCBmZl9hdjJ2c19waXhmbXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGVudW0gQVZQaXhlbEZvcm1hdCBwZikKK3sKKyAgICBzd2l0Y2ggKHBmKSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6ICByZXR1cm4gUEZfWVVWNDIwUDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDogIHJldHVybiBQRl9ZVVY0MjJQOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOiAgcmV0dXJuIFBGX1lVVjQ0NFA7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQxMFA6ICByZXR1cm4gUEZfWVVWNDEwUDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDExUDogIHJldHVybiBQRl9ZVVY0MTFQOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDBQOiAgcmV0dXJuIFBGX1lVVjQ0MFA7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOiByZXR1cm4gUEZfWVVWQTQyMFA7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OiAgICByZXR1cm4gUEZfR1JBWTg7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OiAgICByZXR1cm4gUEZfUkdCMjQ7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OiAgICByZXR1cm4gUEZfQkdSMjQ7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6ICAgICByZXR1cm4gUEZfUkdCQTsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJjYW5ub3QgZGVhbCB3aXRoIHBpeGVsIGZvcm1hdCAlaVxuIiwgcGYpOworICAgICAgICByZXR1cm4gUEZfTk9ORTsKKyAgICB9Cit9CisKKy8qKiBzdHJ1Y3QgdG8gaG9sZCBhIHZhbGlkIGNvbnRleHQgZm9yIGxvZ2dpbmcgZnJvbSB3aXRoaW4gdmlkLnN0YWIgbGliICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7Cit9IFZTMkFWTG9nQ3R4OworCisvKiogd3JhcHBlciB0byBsb2cgdnNfbG9nIGludG8gYXZfbG9nICovCitzdGF0aWMgaW50IHZzMmF2X2xvZyhpbnQgdHlwZSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworICAgIFZTMkFWTG9nQ3R4IGN0eDsKKyAgICBBVkNsYXNzIGNsYXNzID0geworICAgICAgICAuY2xhc3NfbmFtZSA9IHRhZywKKyAgICAgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAgICAgLm9wdGlvbiAgICAgPSAwLAorICAgICAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9GSUxURVIsCisgICAgfTsKKyAgICBjdHguY2xhc3MgPSAmY2xhc3M7CisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgYXZfdmxvZygmY3R4LCB0eXBlLCBmb3JtYXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIHJldHVybiBWU19PSzsKK30KKworLyoqIHNldHMgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uIGFuZCBsb2dnaW5nIGNvbnN0YW50cyB0byBhdiB2ZXJzaW9ucyAqLwordm9pZCBmZl92c19pbml0KHZvaWQpCit7CisgICAgdnNfbWFsbG9jICA9IGF2X21hbGxvYzsKKyAgICB2c196YWxsb2MgID0gYXZfbWFsbG9jejsKKyAgICB2c19yZWFsbG9jID0gYXZfcmVhbGxvYzsKKyAgICB2c19mcmVlICAgID0gYXZfZnJlZTsKKworICAgIFZTX0VSUk9SX1RZUEUgPSBBVl9MT0dfRVJST1I7CisgICAgVlNfV0FSTl9UWVBFICA9IEFWX0xPR19XQVJOSU5HOworICAgIFZTX0lORk9fVFlQRSAgPSBBVl9MT0dfSU5GTzsKKyAgICBWU19NU0dfVFlQRSAgID0gQVZfTE9HX1ZFUkJPU0U7CisKKyAgICB2c19sb2cgICA9IHZzMmF2X2xvZzsKKworICAgIFZTX0VSUk9SID0gMDsKKyAgICBWU19PSyAgICA9IDE7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdmlkc3RhYnV0aWxzLmggYi9mZm1wZWcvbGliYXZmaWx0ZXIvdmlkc3RhYnV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkNmNlZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92aWRzdGFidXRpbHMuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIEdlb3JnIE1hcnRpdXMgPGdlb3JnIGRvdCBtYXJ0aXVzIGF0IHdlYiBkb3QgZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfVklEU1RBQlVUSUxTX0gKKyNkZWZpbmUgQVZGSUxURVJfVklEU1RBQlVUSUxTX0gKKworI2luY2x1ZGUgPHZpZC5zdGFiL2xpYnZpZHN0YWIuaD4KKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisKKy8qIENvbnZlcnNpb24gcm91dGluZXMgYmV0d2VlbiBsaWJhdiogYW5kIHZpZC5zdGFiICovCisKKy8qKgorICogQ29udmVydHMgYW4gQVZQaXhlbEZvcm1hdCB0byBhIFZTUGl4ZWxGb3JtYXQuCisgKgorICogQHBhcmFtW2luXSBjdHggQVZGaWx0ZXJDb250ZXh0IHVzZWQgZm9yIGxvZ2dpbmcKKyAqIEBwYXJhbVtpbl0gcGYgIEFWUGl4ZWxGb3JtYXQKKyAqIEByZXR1cm4gICAgYSBjb3JyZXNwb25kaW5nIFZTUGl4ZWxGb3JtYXQKKyAqLworVlNQaXhlbEZvcm1hdCBmZl9hdjJ2c19waXhmbXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGVudW0gQVZQaXhlbEZvcm1hdCBwZik7CisKKy8qKgorICogSW5pdGlhbGl6ZSBsaWJ2aWRzdGFiCisgKgorICogU2V0cyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGFuZCBsb2dnaW5nIGNvbnN0YW50cyB0byBjb3JyZXNwb25kaW5nCisgKiBhdiogdmVyc2lvbnMuCisgKi8KK3ZvaWQgZmZfdnNfaW5pdCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdnNpbmtfbnVsbHNpbmsuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92c2lua19udWxsc2luay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MTcyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdnNpbmtfbnVsbHNpbmsuYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdnNpbmtfbnVsbHNpbmtfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9LAorfTsKKworQVZGaWx0ZXIgZmZfdnNpbmtfbnVsbHNpbmsgPSB7CisgICAgLm5hbWUgICAgICAgID0gIm51bGxzaW5rIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRG8gYWJzb2x1dGVseSBub3RoaW5nIHdpdGggdGhlIGlucHV0IHZpZGVvLiIpLAorCisgICAgLnByaXZfc2l6ZSA9IDAsCisKKyAgICAuaW5wdXRzICAgID0gYXZmaWx0ZXJfdnNpbmtfbnVsbHNpbmtfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci92c3JjX2NlbGxhdXRvLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdnNyY19jZWxsYXV0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMmRmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdnNyY19jZWxsYXV0by5jCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSBTdGVmYW5vIFNhYmF0aW5pIDIwMTEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogY2VsbHVsYXIgYXV0b21hdG9uIHZpZGVvIHNvdXJjZSwgYmFzZWQgb24gU3RlcGhlbiBXb2xmcmFtICJleHBlcmltZW50dXMgY3J1Y2lzIgorICovCisKKy8qICNkZWZpbmUgREVCVUcgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9maWxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYW5kb21fc2VlZC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCB3LCBoOworICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGNoYXIgKnJ1bGVfc3RyOworICAgIHVpbnQ4X3QgKmZpbGVfYnVmOworICAgIHNpemVfdCBmaWxlX2J1ZnNpemU7CisgICAgdWludDhfdCAqYnVmOworICAgIGludCBidWZfcHJldl9yb3dfaWR4LCBidWZfcm93X2lkeDsKKyAgICB1aW50OF90IHJ1bGU7CisgICAgdWludDY0X3QgcHRzOworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZTsKKyAgICBkb3VibGUgICByYW5kb21fZmlsbF9yYXRpbzsKKyAgICB1aW50MzJfdCByYW5kb21fc2VlZDsKKyAgICBpbnQgc3RpdGNoLCBzY3JvbGwsIHN0YXJ0X2Z1bGw7CisgICAgaW50NjRfdCBnZW5lcmF0aW9uOyAgICAgICAgIC8vLzwgdGhlIGdlbmVyYXRpb24gbnVtYmVyLCBzdGFydGluZyBmcm9tIDAKKyAgICBBVkxGRyBsZmc7CisgICAgY2hhciAqcGF0dGVybjsKK30gQ2VsbEF1dG9Db250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDZWxsQXV0b0NvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gY2VsbGF1dG9fb3B0aW9uc1tdID0geworICAgIHsgImZpbGVuYW1lIiwgInJlYWQgaW5pdGlhbCBwYXR0ZXJuIGZyb20gZmlsZSIsIE9GRlNFVChmaWxlbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJmIiwgICAgICAgICJyZWFkIGluaXRpYWwgcGF0dGVybiBmcm9tIGZpbGUiLCBPRkZTRVQoZmlsZW5hbWUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAicGF0dGVybiIsICAic2V0IGluaXRpYWwgcGF0dGVybiIsIE9GRlNFVChwYXR0ZXJuKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInAiLCAgICAgICAgInNldCBpbml0aWFsIHBhdHRlcm4iLCBPRkZTRVQocGF0dGVybiksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJyYXRlIiwgICAgICJzZXQgdmlkZW8gcmF0ZSIsIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJyIiwgICAgICAgICJzZXQgdmlkZW8gcmF0ZSIsIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJzaXplIiwgICAgICJzZXQgdmlkZW8gc2l6ZSIsIE9GRlNFVCh3KSwgICAgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJzIiwgICAgICAgICJzZXQgdmlkZW8gc2l6ZSIsIE9GRlNFVCh3KSwgICAgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJydWxlIiwgICAgICJzZXQgcnVsZSIsICAgICAgIE9GRlNFVChydWxlKSwgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDExMH0sICAwLCAyNTUsIEZMQUdTIH0sCisgICAgeyAicmFuZG9tX2ZpbGxfcmF0aW8iLCAic2V0IGZpbGwgcmF0aW8gZm9yIGZpbGxpbmcgaW5pdGlhbCBncmlkIHJhbmRvbWx5IiwgT0ZGU0VUKHJhbmRvbV9maWxsX3JhdGlvKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibCA9IDEvTV9QSEl9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInJhdGlvIiwgICAgICAgICAgICAgInNldCBmaWxsIHJhdGlvIGZvciBmaWxsaW5nIGluaXRpYWwgZ3JpZCByYW5kb21seSIsIE9GRlNFVChyYW5kb21fZmlsbF9yYXRpbyksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmwgPSAxL01fUEhJfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJyYW5kb21fc2VlZCIsICJzZXQgdGhlIHNlZWQgZm9yIGZpbGxpbmcgdGhlIGluaXRpYWwgZ3JpZCByYW5kb21seSIsIE9GRlNFVChyYW5kb21fc2VlZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBVSU5UMzJfTUFYLCBGTEFHUyB9LAorICAgIHsgInNlZWQiLCAgICAgICAgInNldCB0aGUgc2VlZCBmb3IgZmlsbGluZyB0aGUgaW5pdGlhbCBncmlkIHJhbmRvbWx5IiwgT0ZGU0VUKHJhbmRvbV9zZWVkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFVJTlQzMl9NQVgsIEZMQUdTIH0sCisgICAgeyAic2Nyb2xsIiwgICAgICAic2Nyb2xsIHBhdHRlcm4gZG93bndhcmQiLCBPRkZTRVQoc2Nyb2xsKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDF9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInN0YXJ0X2Z1bGwiLCAgInN0YXJ0IGZpbGxpbmcgdGhlIHdob2xlIHZpZGVvIiwgT0ZGU0VUKHN0YXJ0X2Z1bGwpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiZnVsbCIsICAgICAgICAic3RhcnQgZmlsbGluZyB0aGUgd2hvbGUgdmlkZW8iLCBPRkZTRVQoc3RhcnRfZnVsbCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJzdGl0Y2giLCAgICAgICJzdGl0Y2ggYm91bmRhcmllcyIsIE9GRlNFVChzdGl0Y2gpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMX0sICAgMCwgMSwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGNlbGxhdXRvKTsKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBzaG93X2NlbGxhdXRvX3JvdyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDZWxsQXV0b0NvbnRleHQgKmNlbGxhdXRvID0gY3R4LT5wcml2OworICAgIGludCBpOworICAgIHVpbnQ4X3QgKnJvdyA9IGNlbGxhdXRvLT5idWYgKyBjZWxsYXV0by0+dyAqIGNlbGxhdXRvLT5idWZfcm93X2lkeDsKKyAgICBjaGFyICpsaW5lID0gYXZfbWFsbG9jKGNlbGxhdXRvLT53ICsgMSk7CisgICAgaWYgKCFsaW5lKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2VsbGF1dG8tPnc7IGkrKykKKyAgICAgICAgbGluZVtpXSA9IHJvd1tpXSA/ICdAJyA6ICcgJzsKKyAgICBsaW5lW2ldID0gMDsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJnZW5lcmF0aW9uOiUiUFJJZDY0IiByb3c6JXN8XG4iLCBjZWxsYXV0by0+Z2VuZXJhdGlvbiwgbGluZSk7CisgICAgYXZfZnJlZShsaW5lKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGluaXRfcGF0dGVybl9mcm9tX3N0cmluZyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDZWxsQXV0b0NvbnRleHQgKmNlbGxhdXRvID0gY3R4LT5wcml2OworICAgIGNoYXIgKnA7CisgICAgaW50IGksIHcgPSAwOworCisgICAgdyA9IHN0cmxlbihjZWxsYXV0by0+cGF0dGVybik7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAidzolZFxuIiwgdyk7CisKKyAgICBpZiAoY2VsbGF1dG8tPncpIHsKKyAgICAgICAgaWYgKHcgPiBjZWxsYXV0by0+dykgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJUaGUgc3BlY2lmaWVkIHdpZHRoIGlzICVkIHdoaWNoIGNhbm5vdCBjb250YWluIHRoZSBwcm92aWRlZCBzdHJpbmcgd2lkdGggb2YgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgY2VsbGF1dG8tPncsIHcpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHdpZHRoIHdhcyBub3Qgc3BlY2lmaWVkLCBzZXQgaXQgdG8gd2lkdGggb2YgdGhlIHByb3ZpZGVkIHJvdyAqLworICAgICAgICBjZWxsYXV0by0+dyA9IHc7CisgICAgICAgIGNlbGxhdXRvLT5oID0gKGRvdWJsZSljZWxsYXV0by0+dyAqIE1fUEhJOworICAgIH0KKworICAgIGNlbGxhdXRvLT5idWYgPSBhdl9tYWxsb2N6X2FycmF5KHNpemVvZih1aW50OF90KSAqIGNlbGxhdXRvLT53LCBjZWxsYXV0by0+aCk7CisgICAgaWYgKCFjZWxsYXV0by0+YnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogZmlsbCBidWYgKi8KKyAgICBwID0gY2VsbGF1dG8tPnBhdHRlcm47CisgICAgZm9yIChpID0gKGNlbGxhdXRvLT53IC0gdykvMjs7IGkrKykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICIlZCAlY1xuIiwgaSwgKnAgPT0gJ1xuJyA/ICdOJyA6ICpwKTsKKyAgICAgICAgaWYgKCpwID09ICdcbicgfHwgISpwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNlbGxhdXRvLT5idWZbaV0gPSAhIWF2X2lzZ3JhcGgoKihwKyspKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X3BhdHRlcm5fZnJvbV9maWxlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIENlbGxBdXRvQ29udGV4dCAqY2VsbGF1dG8gPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGF2X2ZpbGVfbWFwKGNlbGxhdXRvLT5maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAmY2VsbGF1dG8tPmZpbGVfYnVmLCAmY2VsbGF1dG8tPmZpbGVfYnVmc2l6ZSwgMCwgY3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGNyZWF0ZSBhIHN0cmluZyBiYXNlZCBvbiB0aGUgcmVhZCBmaWxlICovCisgICAgY2VsbGF1dG8tPnBhdHRlcm4gPSBhdl9tYWxsb2MoY2VsbGF1dG8tPmZpbGVfYnVmc2l6ZSArIDEpOworICAgIGlmICghY2VsbGF1dG8tPnBhdHRlcm4pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWVtY3B5KGNlbGxhdXRvLT5wYXR0ZXJuLCBjZWxsYXV0by0+ZmlsZV9idWYsIGNlbGxhdXRvLT5maWxlX2J1ZnNpemUpOworICAgIGNlbGxhdXRvLT5wYXR0ZXJuW2NlbGxhdXRvLT5maWxlX2J1ZnNpemVdID0gMDsKKworICAgIHJldHVybiBpbml0X3BhdHRlcm5fZnJvbV9zdHJpbmcoY3R4KTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQ2VsbEF1dG9Db250ZXh0ICpjZWxsYXV0byA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFjZWxsYXV0by0+dyAmJiAhY2VsbGF1dG8tPmZpbGVuYW1lICYmICFjZWxsYXV0by0+cGF0dGVybikKKyAgICAgICAgYXZfb3B0X3NldChjZWxsYXV0bywgInNpemUiLCAiMzIweDUxOCIsIDApOworCisgICAgaWYgKGNlbGxhdXRvLT5maWxlbmFtZSAmJiBjZWxsYXV0by0+cGF0dGVybikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IG9uZSBvZiB0aGUgZmlsZW5hbWUgb3IgcGF0dGVybiBvcHRpb25zIGNhbiBiZSB1c2VkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoY2VsbGF1dG8tPmZpbGVuYW1lKSB7CisgICAgICAgIGlmICgocmV0ID0gaW5pdF9wYXR0ZXJuX2Zyb21fZmlsZShjdHgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSBpZiAoY2VsbGF1dG8tPnBhdHRlcm4pIHsKKyAgICAgICAgaWYgKChyZXQgPSBpbml0X3BhdHRlcm5fZnJvbV9zdHJpbmcoY3R4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBmaWxsIHRoZSBmaXJzdCByb3cgcmFuZG9tbHkgKi8KKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgY2VsbGF1dG8tPmJ1ZiA9IGF2X21hbGxvY3pfYXJyYXkoc2l6ZW9mKHVpbnQ4X3QpICogY2VsbGF1dG8tPncsIGNlbGxhdXRvLT5oKTsKKyAgICAgICAgaWYgKCFjZWxsYXV0by0+YnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKGNlbGxhdXRvLT5yYW5kb21fc2VlZCA9PSAtMSkKKyAgICAgICAgICAgIGNlbGxhdXRvLT5yYW5kb21fc2VlZCA9IGF2X2dldF9yYW5kb21fc2VlZCgpOworCisgICAgICAgIGF2X2xmZ19pbml0KCZjZWxsYXV0by0+bGZnLCBjZWxsYXV0by0+cmFuZG9tX3NlZWQpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjZWxsYXV0by0+dzsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgciA9IChkb3VibGUpYXZfbGZnX2dldCgmY2VsbGF1dG8tPmxmZykgLyBVSU5UMzJfTUFYOworICAgICAgICAgICAgaWYgKHIgPD0gY2VsbGF1dG8tPnJhbmRvbV9maWxsX3JhdGlvKQorICAgICAgICAgICAgICAgIGNlbGxhdXRvLT5idWZbaV0gPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICJzOiVkeCVkIHI6JWQvJWQgcnVsZTolZCBzdGl0Y2g6JWQgc2Nyb2xsOiVkIGZ1bGw6JWQgc2VlZDoldVxuIiwKKyAgICAgICAgICAgY2VsbGF1dG8tPncsIGNlbGxhdXRvLT5oLCBjZWxsYXV0by0+ZnJhbWVfcmF0ZS5udW0sIGNlbGxhdXRvLT5mcmFtZV9yYXRlLmRlbiwKKyAgICAgICAgICAgY2VsbGF1dG8tPnJ1bGUsIGNlbGxhdXRvLT5zdGl0Y2gsIGNlbGxhdXRvLT5zY3JvbGwsIGNlbGxhdXRvLT5zdGFydF9mdWxsLAorICAgICAgICAgICBjZWxsYXV0by0+cmFuZG9tX3NlZWQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDZWxsQXV0b0NvbnRleHQgKmNlbGxhdXRvID0gY3R4LT5wcml2OworCisgICAgYXZfZmlsZV91bm1hcChjZWxsYXV0by0+ZmlsZV9idWYsIGNlbGxhdXRvLT5maWxlX2J1ZnNpemUpOworICAgIGF2X2ZyZWVwKCZjZWxsYXV0by0+YnVmKTsKKyAgICBhdl9mcmVlcCgmY2VsbGF1dG8tPnBhdHRlcm4pOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQ2VsbEF1dG9Db250ZXh0ICpjZWxsYXV0byA9IG91dGxpbmstPnNyYy0+cHJpdjsKKworICAgIG91dGxpbmstPncgPSBjZWxsYXV0by0+dzsKKyAgICBvdXRsaW5rLT5oID0gY2VsbGF1dG8tPmg7CisgICAgb3V0bGluay0+dGltZV9iYXNlID0gYXZfaW52X3EoY2VsbGF1dG8tPmZyYW1lX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV2b2x2ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDZWxsQXV0b0NvbnRleHQgKmNlbGxhdXRvID0gY3R4LT5wcml2OworICAgIGludCBpLCB2LCBwb3NbM107CisgICAgdWludDhfdCAqcm93LCAqcHJldl9yb3cgPSBjZWxsYXV0by0+YnVmICsgY2VsbGF1dG8tPmJ1Zl9yb3dfaWR4ICogY2VsbGF1dG8tPnc7CisgICAgZW51bSB7IE5XLCBOLCBORSB9OworCisgICAgY2VsbGF1dG8tPmJ1Zl9wcmV2X3Jvd19pZHggPSBjZWxsYXV0by0+YnVmX3Jvd19pZHg7CisgICAgY2VsbGF1dG8tPmJ1Zl9yb3dfaWR4ICAgICAgPSBjZWxsYXV0by0+YnVmX3Jvd19pZHggPT0gY2VsbGF1dG8tPmgtMSA/IDAgOiBjZWxsYXV0by0+YnVmX3Jvd19pZHgrMTsKKyAgICByb3cgPSBjZWxsYXV0by0+YnVmICsgY2VsbGF1dG8tPncgKiBjZWxsYXV0by0+YnVmX3Jvd19pZHg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2VsbGF1dG8tPnc7IGkrKykgeworICAgICAgICBpZiAoY2VsbGF1dG8tPnN0aXRjaCkgeworICAgICAgICAgICAgcG9zW05XXSA9IGktMSA8IDAgPyBjZWxsYXV0by0+dy0xIDogaS0xOworICAgICAgICAgICAgcG9zW05dICA9IGk7CisgICAgICAgICAgICBwb3NbTkVdID0gaSsxID09IGNlbGxhdXRvLT53ID8gMCAgOiBpKzE7CisgICAgICAgICAgICB2ID0gcHJldl9yb3dbcG9zW05XXV08PDIgfCBwcmV2X3Jvd1twb3NbTl1dPDwxIHwgcHJldl9yb3dbcG9zW05FXV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ID0gMDsKKyAgICAgICAgICAgIHZ8PSBpLTEgPj0gMCAgICAgICAgICA/IHByZXZfcm93W2ktMV08PDIgOiAwOworICAgICAgICAgICAgdnw9ICAgICAgICAgICAgICAgICAgICAgcHJldl9yb3dbaSAgXTw8MSAgICA7CisgICAgICAgICAgICB2fD0gaSsxIDwgY2VsbGF1dG8tPncgPyBwcmV2X3Jvd1tpKzFdICAgIDogMDsKKyAgICAgICAgfQorICAgICAgICByb3dbaV0gPSAhIShjZWxsYXV0by0+cnVsZSAmICgxPDx2KSk7CisgICAgICAgIGF2X2Rsb2coY3R4LCAiaTolZCBjb250ZXh0OiVjJWMlYyAtPiBjZWxsOiVkXG4iLCBpLAorICAgICAgICAgICAgICAgIHYmND8nQCc6JyAnLCB2JjI/J0AnOicgJywgdiYxPydAJzonICcsIHJvd1tpXSk7CisgICAgfQorCisgICAgY2VsbGF1dG8tPmdlbmVyYXRpb24rKzsKK30KKworc3RhdGljIHZvaWQgZmlsbF9waWN0dXJlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpwaWNyZWYpCit7CisgICAgQ2VsbEF1dG9Db250ZXh0ICpjZWxsYXV0byA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgaiwgaywgcm93X2lkeCA9IDA7CisgICAgdWludDhfdCAqcDAgPSBwaWNyZWYtPmRhdGFbMF07CisKKyAgICBpZiAoY2VsbGF1dG8tPnNjcm9sbCAmJiBjZWxsYXV0by0+Z2VuZXJhdGlvbiA+PSBjZWxsYXV0by0+aCkKKyAgICAgICAgLyogc2hvdyBvbiB0b3AgdGhlIG9sZGVzdCByb3cgKi8KKyAgICAgICAgcm93X2lkeCA9IChjZWxsYXV0by0+YnVmX3Jvd19pZHggKyAxKSAlIGNlbGxhdXRvLT5oOworCisgICAgLyogZmlsbCB0aGUgb3V0cHV0IHBpY3R1cmUgd2l0aCB0aGUgd2hvbGUgYnVmZmVyICovCisgICAgZm9yIChpID0gMDsgaSA8IGNlbGxhdXRvLT5oOyBpKyspIHsKKyAgICAgICAgdWludDhfdCBieXRlID0gMDsKKyAgICAgICAgdWludDhfdCAqcm93ID0gY2VsbGF1dG8tPmJ1ZiArIHJvd19pZHgqY2VsbGF1dG8tPnc7CisgICAgICAgIHVpbnQ4X3QgKnAgPSBwMDsKKyAgICAgICAgZm9yIChrID0gMCwgaiA9IDA7IGogPCBjZWxsYXV0by0+dzsgaisrKSB7CisgICAgICAgICAgICBieXRlIHw9IHJvd1tqXTw8KDctaysrKTsKKyAgICAgICAgICAgIGlmIChrPT04IHx8IGogPT0gY2VsbGF1dG8tPnctMSkgeworICAgICAgICAgICAgICAgIGsgPSAwOworICAgICAgICAgICAgICAgICpwKysgPSBieXRlOworICAgICAgICAgICAgICAgIGJ5dGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJvd19pZHggPSAocm93X2lkeCArIDEpICUgY2VsbGF1dG8tPmg7CisgICAgICAgIHAwICs9IHBpY3JlZi0+bGluZXNpemVbMF07CisgICAgfQorfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIENlbGxBdXRvQ29udGV4dCAqY2VsbGF1dG8gPSBvdXRsaW5rLT5zcmMtPnByaXY7CisgICAgQVZGcmFtZSAqcGljcmVmID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBjZWxsYXV0by0+dywgY2VsbGF1dG8tPmgpOworICAgIGlmICghcGljcmVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHBpY3JlZi0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKSB7MSwgMX07CisgICAgaWYgKGNlbGxhdXRvLT5nZW5lcmF0aW9uID09IDAgJiYgY2VsbGF1dG8tPnN0YXJ0X2Z1bGwpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjZWxsYXV0by0+aC0xOyBpKyspCisgICAgICAgICAgICBldm9sdmUob3V0bGluay0+c3JjKTsKKyAgICB9CisgICAgZmlsbF9waWN0dXJlKG91dGxpbmstPnNyYywgcGljcmVmKTsKKyAgICBldm9sdmUob3V0bGluay0+c3JjKTsKKworICAgIHBpY3JlZi0+cHRzID0gY2VsbGF1dG8tPnB0cysrOworCisjaWZkZWYgREVCVUcKKyAgICBzaG93X2NlbGxhdXRvX3JvdyhvdXRsaW5rLT5zcmMpOworI2VuZGlmCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBwaWNyZWYpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geyBBVl9QSVhfRk1UX01PTk9CTEFDSywgQVZfUElYX0ZNVF9OT05FIH07CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgY2VsbGF1dG9fb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZzcmNfY2VsbGF1dG8gPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiY2VsbGF1dG8iLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNyZWF0ZSBwYXR0ZXJuIGdlbmVyYXRlZCBieSBhbiBlbGVtZW50YXJ5IGNlbGx1bGFyIGF1dG9tYXRvbi4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihDZWxsQXV0b0NvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmNlbGxhdXRvX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgID0gY2VsbGF1dG9fb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdnNyY19saWZlLmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdnNyY19saWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5ZTFiYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92c3JjX2xpZmUuYwpAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgU3RlZmFubyBTYWJhdGluaSAyMDEwCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGxpZmUgdmlkZW8gc291cmNlLCBiYXNlZCBvbiBKb2huIENvbndheXMnIExpZmUgR2FtZQorICovCisKKy8qICNkZWZpbmUgREVCVUcgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9maWxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmFuZG9tX3NlZWQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgdywgaDsKKyAgICBjaGFyICpmaWxlbmFtZTsKKyAgICBjaGFyICpydWxlX3N0cjsKKyAgICB1aW50OF90ICpmaWxlX2J1ZjsKKyAgICBzaXplX3QgZmlsZV9idWZzaXplOworCisgICAgLyoqCisgICAgICogVGhlIHR3byBncmlkIHN0YXRlIGJ1ZmZlcnMuCisgICAgICoKKyAgICAgKiBBIDB4RkYgKEFMSVZFX0NFTEwpIHZhbHVlIG1lYW5zIHRoZSBjZWxsIGlzIGFsaXZlIChvciBuZXcgYm9ybiksIHdoaWxlCisgICAgICogdGhlIGRlY3JlYXNpbmcgdmFsdWVzIGZyb20gMHhGRSB0byAwIG1lYW5zIHRoZSBjZWxsIGlzIGRlYWQ7IHRoZSByYW5nZQorICAgICAqIG9mIHZhbHVlcyBpcyB1c2VkIGZvciB0aGUgc2xvdyBkZWF0aCBlZmZlY3QsIG9yIG1vbGQgKDB4RkUgbWVhbnMgZGVhZCwKKyAgICAgKiAweEZEIG1lYW5zIHZlcnkgZGVhZCwgMHhGQyBtZWFucyB2ZXJ5IHZlcnkgZGVhZC4uLiBhbmQgMHgwMCBtZWFucworICAgICAqIGRlZmluaXRlbHkgZGVhZC9tb2xkKS4KKyAgICAgKi8KKyAgICB1aW50OF90ICpidWZbMl07CisKKyAgICB1aW50OF90ICBidWZfaWR4OworICAgIHVpbnQxNl90IHN0YXlfcnVsZTsgICAgICAgICAvLy88IGVuY29kZSB0aGUgYmVoYXZpb3IgZm9yIGZpbGxlZCBjZWxscworICAgIHVpbnQxNl90IGJvcm5fcnVsZTsgICAgICAgICAvLy88IGVuY29kZSB0aGUgYmVoYXZpb3IgZm9yIGVtcHR5IGNlbGxzCisgICAgdWludDY0X3QgcHRzOworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZTsKKyAgICBkb3VibGUgICByYW5kb21fZmlsbF9yYXRpbzsKKyAgICB1aW50MzJfdCByYW5kb21fc2VlZDsKKyAgICBpbnQgc3RpdGNoOworICAgIGludCBtb2xkOworICAgIHVpbnQ4X3QgIGxpZmVfY29sb3JbNF07CisgICAgdWludDhfdCBkZWF0aF9jb2xvcls0XTsKKyAgICB1aW50OF90ICBtb2xkX2NvbG9yWzRdOworICAgIEFWTEZHIGxmZzsKKyAgICB2b2lkICgqZHJhdykoQVZGaWx0ZXJDb250ZXh0KiwgQVZGcmFtZSopOworfSBMaWZlQ29udGV4dDsKKworI2RlZmluZSBBTElWRV9DRUxMIDB4RkYKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKExpZmVDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGxpZmVfb3B0aW9uc1tdID0geworICAgIHsgImZpbGVuYW1lIiwgInNldCBzb3VyY2UgZmlsZSIsICBPRkZTRVQoZmlsZW5hbWUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAiZiIsICAgICAgICAic2V0IHNvdXJjZSBmaWxlIiwgIE9GRlNFVChmaWxlbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJzaXplIiwgICAgICJzZXQgdmlkZW8gc2l6ZSIsICAgT0ZGU0VUKHcpLCAgICAgICAgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJzIiwgICAgICAgICJzZXQgdmlkZW8gc2l6ZSIsICAgT0ZGU0VUKHcpLCAgICAgICAgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJyYXRlIiwgICAgICJzZXQgdmlkZW8gcmF0ZSIsICAgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInIiLCAgICAgICAgInNldCB2aWRlbyByYXRlIiwgICBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAicnVsZSIsICAgICAic2V0IHJ1bGUiLCAgICAgICAgIE9GRlNFVChydWxlX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiQjMvUzIzIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJyYW5kb21fZmlsbF9yYXRpbyIsICJzZXQgZmlsbCByYXRpbyBmb3IgZmlsbGluZyBpbml0aWFsIGdyaWQgcmFuZG9tbHkiLCBPRkZTRVQocmFuZG9tX2ZpbGxfcmF0aW8pLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTEvTV9QSEl9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInJhdGlvIiwgICAgICAgICAgICAgInNldCBmaWxsIHJhdGlvIGZvciBmaWxsaW5nIGluaXRpYWwgZ3JpZCByYW5kb21seSIsIE9GRlNFVChyYW5kb21fZmlsbF9yYXRpbyksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MS9NX1BISX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAicmFuZG9tX3NlZWQiLCAic2V0IHRoZSBzZWVkIGZvciBmaWxsaW5nIHRoZSBpbml0aWFsIGdyaWQgcmFuZG9tbHkiLCBPRkZTRVQocmFuZG9tX3NlZWQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PS0xfSwgLTEsIFVJTlQzMl9NQVgsIEZMQUdTIH0sCisgICAgeyAic2VlZCIsICAgICAgICAic2V0IHRoZSBzZWVkIGZvciBmaWxsaW5nIHRoZSBpbml0aWFsIGdyaWQgcmFuZG9tbHkiLCBPRkZTRVQocmFuZG9tX3NlZWQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PS0xfSwgLTEsIFVJTlQzMl9NQVgsIEZMQUdTIH0sCisgICAgeyAic3RpdGNoIiwgICAgICAic3RpdGNoIGJvdW5kYXJpZXMiLCBPRkZTRVQoc3RpdGNoKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJtb2xkIiwgICAgICAgICJzZXQgbW9sZCBzcGVlZCBmb3IgZGVhZCBjZWxscyIsIE9GRlNFVChtb2xkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMHhGRiwgRkxBR1MgfSwKKyAgICB7ICJsaWZlX2NvbG9yIiwgICJzZXQgbGlmZSBjb2xvciIsICBPRkZTRVQoIGxpZmVfY29sb3IpLCBBVl9PUFRfVFlQRV9DT0xPUiwgey5zdHI9IndoaXRlIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJkZWF0aF9jb2xvciIsICJzZXQgZGVhdGggY29sb3IiLCBPRkZTRVQoZGVhdGhfY29sb3IpLCBBVl9PUFRfVFlQRV9DT0xPUiwgey5zdHI9ImJsYWNrIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJtb2xkX2NvbG9yIiwgICJzZXQgbW9sZCBjb2xvciIsICBPRkZTRVQoIG1vbGRfY29sb3IpLCBBVl9PUFRfVFlQRV9DT0xPUiwgey5zdHI9ImJsYWNrIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGxpZmUpOworCitzdGF0aWMgaW50IHBhcnNlX3J1bGUodWludDE2X3QgKmJvcm5fcnVsZSwgdWludDE2X3QgKnN0YXlfcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpydWxlX3N0ciwgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBjaGFyICp0YWlsOworICAgIGNvbnN0IGNoYXIgKnAgPSBydWxlX3N0cjsKKyAgICAqYm9ybl9ydWxlID0gMDsKKyAgICAqc3RheV9ydWxlID0gMDsKKworICAgIGlmIChzdHJjaHIoImJCc1MiLCAqcCkpIHsKKyAgICAgICAgLyogcGFyc2UgcnVsZSBhcyBhIEJvcm4gLyBTdGF5IEFsaXZlIGNvZGUsIHNlZQorICAgICAgICAgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbndheSUyN3NfR2FtZV9vZl9MaWZlICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICpydWxlID0gKCpwID09ICdiJyB8fCAqcCA9PSAnQicpID8gYm9ybl9ydWxlIDogc3RheV9ydWxlOworICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgd2hpbGUgKCpwID49ICcwJyAmJiAqcCA8PSAnOCcpIHsKKyAgICAgICAgICAgICAgICAqcnVsZSArPSAxPDwoKnAgLSAnMCcpOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqcCAhPSAnLycpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0gd2hpbGUgKHN0cmNocigiYkJzUyIsICpwKSk7CisKKyAgICAgICAgaWYgKCpwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBwYXJzZSBydWxlIGFzIGEgbnVtYmVyLCBleHByZXNzZWQgaW4gdGhlIGZvcm0gU1RBWXwoQk9STjw8OSksCisgICAgICAgICAqIHdoZXJlIFNUQVkgYW5kIEJPUk4gZW5jb2RlIHRoZSBjb3JyZXNwb25kaW5nIDktYml0cyBydWxlICovCisgICAgICAgIGxvbmcgaW50IHJ1bGUgPSBzdHJ0b2wocnVsZV9zdHIsICZ0YWlsLCAxMCk7CisgICAgICAgIGlmICgqdGFpbCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICpib3JuX3J1bGUgID0gKCgxPDw5KS0xKSAmIHJ1bGU7CisgICAgICAgICpzdGF5X3J1bGUgPSBydWxlID4+IDk7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHJ1bGUgY29kZSAnJXMnIHByb3ZpZGVkXG4iLCBydWxlX3N0cik7CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBzaG93X2xpZmVfZ3JpZChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBMaWZlQ29udGV4dCAqbGlmZSA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgajsKKworICAgIGNoYXIgKmxpbmUgPSBhdl9tYWxsb2MobGlmZS0+dyArIDEpOworICAgIGlmICghbGluZSkKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAoaSA9IDA7IGkgPCBsaWZlLT5oOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGxpZmUtPnc7IGorKykKKyAgICAgICAgICAgIGxpbmVbal0gPSBsaWZlLT5idWZbbGlmZS0+YnVmX2lkeF1baSpsaWZlLT53ICsgal0gPT0gQUxJVkVfQ0VMTCA/ICdAJyA6ICcgJzsKKyAgICAgICAgbGluZVtqXSA9IDA7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiUzZDogJXNcbiIsIGksIGxpbmUpOworICAgIH0KKyAgICBhdl9mcmVlKGxpbmUpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5pdF9wYXR0ZXJuX2Zyb21fZmlsZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBMaWZlQ29udGV4dCAqbGlmZSA9IGN0eC0+cHJpdjsKKyAgICBjaGFyICpwOworICAgIGludCByZXQsIGksIGkwLCBqLCBoID0gMCwgdywgbWF4X3cgPSAwOworCisgICAgaWYgKChyZXQgPSBhdl9maWxlX21hcChsaWZlLT5maWxlbmFtZSwgJmxpZmUtPmZpbGVfYnVmLCAmbGlmZS0+ZmlsZV9idWZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgY3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGF2X2ZyZWVwKCZsaWZlLT5maWxlbmFtZSk7CisKKyAgICAvKiBwcmVzY2FuIGZpbGUgdG8gZ2V0IHRoZSBudW1iZXIgb2YgbGluZXMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoICovCisgICAgdyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGxpZmUtPmZpbGVfYnVmc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmIChsaWZlLT5maWxlX2J1ZltpXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBoKys7IG1heF93ID0gRkZNQVgodywgbWF4X3cpOyB3ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHcrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJoOiVkIG1heF93OiVkXG4iLCBoLCBtYXhfdyk7CisKKyAgICBpZiAobGlmZS0+dykgeworICAgICAgICBpZiAobWF4X3cgPiBsaWZlLT53IHx8IGggPiBsaWZlLT5oKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlRoZSBzcGVjaWZpZWQgc2l6ZSBpcyAlZHglZCB3aGljaCBjYW5ub3QgY29udGFpbiB0aGUgcHJvdmlkZWQgZmlsZSBzaXplIG9mICVkeCVkXG4iLAorICAgICAgICAgICAgICAgICAgIGxpZmUtPncsIGxpZmUtPmgsIG1heF93LCBoKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBzaXplIHdhcyBub3Qgc3BlY2lmaWVkLCBzZXQgaXQgdG8gc2l6ZSBvZiB0aGUgZ3JpZCAqLworICAgICAgICBsaWZlLT53ID0gbWF4X3c7CisgICAgICAgIGxpZmUtPmggPSBoOworICAgIH0KKworICAgIGlmICghKGxpZmUtPmJ1ZlswXSA9IGF2X2NhbGxvYyhsaWZlLT5oICogbGlmZS0+dywgc2l6ZW9mKCpsaWZlLT5idWZbMF0pKSkgfHwKKyAgICAgICAgIShsaWZlLT5idWZbMV0gPSBhdl9jYWxsb2MobGlmZS0+aCAqIGxpZmUtPncsIHNpemVvZigqbGlmZS0+YnVmWzFdKSkpKSB7CisgICAgICAgIGF2X2ZyZWUobGlmZS0+YnVmWzBdKTsKKyAgICAgICAgYXZfZnJlZShsaWZlLT5idWZbMV0pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIC8qIGZpbGwgYnVmWzBdICovCisgICAgcCA9IGxpZmUtPmZpbGVfYnVmOworICAgIGZvciAoaTAgPSAwLCBpID0gKGxpZmUtPmggLSBoKS8yOyBpMCA8IGg7IGkwKyssIGkrKykgeworICAgICAgICBmb3IgKGogPSAobGlmZS0+dyAtIG1heF93KS8yOzsgaisrKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICIlZDolZCAlY1xuIiwgaSwgaiwgKnAgPT0gJ1xuJyA/ICdOJyA6ICpwKTsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgcCsrOyBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGxpZmUtPmJ1ZlswXVtpKmxpZmUtPncgKyBqXSA9IGF2X2lzZ3JhcGgoKihwKyspKSA/IEFMSVZFX0NFTEwgOiAwOworICAgICAgICB9CisgICAgfQorICAgIGxpZmUtPmJ1Zl9pZHggPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIExpZmVDb250ZXh0ICpsaWZlID0gY3R4LT5wcml2OworICAgIGludCByZXQ7CisKKyAgICBpZiAoIWxpZmUtPncgJiYgIWxpZmUtPmZpbGVuYW1lKQorICAgICAgICBhdl9vcHRfc2V0KGxpZmUsICJzaXplIiwgIjMyMHgyNDAiLCAwKTsKKworICAgIGlmICgocmV0ID0gcGFyc2VfcnVsZSgmbGlmZS0+Ym9ybl9ydWxlLCAmbGlmZS0+c3RheV9ydWxlLCBsaWZlLT5ydWxlX3N0ciwgY3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCFsaWZlLT5tb2xkICYmIG1lbWNtcChsaWZlLT5tb2xkX2NvbG9yLCAiXHgwMFx4MDBceDAwIiwgMykpCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIk1vbGQgY29sb3IgaXMgc2V0IHdoaWxlIG1vbGQgaXNuJ3QsIGlnbm9yaW5nIHRoZSBjb2xvci5cbiIpOworCisgICAgaWYgKCFsaWZlLT5maWxlbmFtZSkgeworICAgICAgICAvKiBmaWxsIHRoZSBncmlkIHJhbmRvbWx5ICovCisgICAgICAgIGludCBpOworCisgICAgICAgIGlmICghKGxpZmUtPmJ1ZlswXSA9IGF2X2NhbGxvYyhsaWZlLT5oICogbGlmZS0+dywgc2l6ZW9mKCpsaWZlLT5idWZbMF0pKSkgfHwKKyAgICAgICAgICAgICEobGlmZS0+YnVmWzFdID0gYXZfY2FsbG9jKGxpZmUtPmggKiBsaWZlLT53LCBzaXplb2YoKmxpZmUtPmJ1ZlsxXSkpKSkgeworICAgICAgICAgICAgYXZfZnJlZShsaWZlLT5idWZbMF0pOworICAgICAgICAgICAgYXZfZnJlZShsaWZlLT5idWZbMV0pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlmZS0+cmFuZG9tX3NlZWQgPT0gLTEpCisgICAgICAgICAgICBsaWZlLT5yYW5kb21fc2VlZCA9IGF2X2dldF9yYW5kb21fc2VlZCgpOworCisgICAgICAgIGF2X2xmZ19pbml0KCZsaWZlLT5sZmcsIGxpZmUtPnJhbmRvbV9zZWVkKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGlmZS0+dyAqIGxpZmUtPmg7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIHIgPSAoZG91YmxlKWF2X2xmZ19nZXQoJmxpZmUtPmxmZykgLyBVSU5UMzJfTUFYOworICAgICAgICAgICAgaWYgKHIgPD0gbGlmZS0+cmFuZG9tX2ZpbGxfcmF0aW8pCisgICAgICAgICAgICAgICAgbGlmZS0+YnVmWzBdW2ldID0gQUxJVkVfQ0VMTDsKKyAgICAgICAgfQorICAgICAgICBsaWZlLT5idWZfaWR4ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHJldCA9IGluaXRfcGF0dGVybl9mcm9tX2ZpbGUoY3R4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgInM6JWR4JWQgcjolZC8lZCBydWxlOiVzIHN0YXlfcnVsZTolZCBib3JuX3J1bGU6JWQgc3RpdGNoOiVkIHNlZWQ6JXVcbiIsCisgICAgICAgICAgIGxpZmUtPncsIGxpZmUtPmgsIGxpZmUtPmZyYW1lX3JhdGUubnVtLCBsaWZlLT5mcmFtZV9yYXRlLmRlbiwKKyAgICAgICAgICAgbGlmZS0+cnVsZV9zdHIsIGxpZmUtPnN0YXlfcnVsZSwgbGlmZS0+Ym9ybl9ydWxlLCBsaWZlLT5zdGl0Y2gsCisgICAgICAgICAgIGxpZmUtPnJhbmRvbV9zZWVkKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTGlmZUNvbnRleHQgKmxpZmUgPSBjdHgtPnByaXY7CisKKyAgICBhdl9maWxlX3VubWFwKGxpZmUtPmZpbGVfYnVmLCBsaWZlLT5maWxlX2J1ZnNpemUpOworICAgIGF2X2ZyZWVwKCZsaWZlLT5ydWxlX3N0cik7CisgICAgYXZfZnJlZXAoJmxpZmUtPmJ1ZlswXSk7CisgICAgYXZfZnJlZXAoJmxpZmUtPmJ1ZlsxXSk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBMaWZlQ29udGV4dCAqbGlmZSA9IG91dGxpbmstPnNyYy0+cHJpdjsKKworICAgIG91dGxpbmstPncgPSBsaWZlLT53OworICAgIG91dGxpbmstPmggPSBsaWZlLT5oOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IGF2X2ludl9xKGxpZmUtPmZyYW1lX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV2b2x2ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBMaWZlQ29udGV4dCAqbGlmZSA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgajsKKyAgICB1aW50OF90ICpvbGRidWYgPSBsaWZlLT5idWZbIGxpZmUtPmJ1Zl9pZHhdOworICAgIHVpbnQ4X3QgKm5ld2J1ZiA9IGxpZmUtPmJ1ZlshbGlmZS0+YnVmX2lkeF07CisKKyAgICBlbnVtIHsgTlcsIE4sIE5FLCBXLCBFLCBTVywgUywgU0UgfTsKKworICAgIC8qIGV2b2x2ZSB0aGUgZ3JpZCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsaWZlLT5oOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGxpZmUtPnc7IGorKykgeworICAgICAgICAgICAgaW50IHBvc1s4XVsyXSwgbiwgYWxpdmUsIGNlbGw7CisgICAgICAgICAgICBpZiAobGlmZS0+c3RpdGNoKSB7CisgICAgICAgICAgICAgICAgcG9zW05XXVswXSA9IChpLTEpIDwgMCA/IGxpZmUtPmgtMSA6IGktMTsgcG9zW05XXVsxXSA9IChqLTEpIDwgMCA/IGxpZmUtPnctMSA6IGotMTsKKyAgICAgICAgICAgICAgICBwb3NbTiBdWzBdID0gKGktMSkgPCAwID8gbGlmZS0+aC0xIDogaS0xOyBwb3NbTiBdWzFdID0gICAgICAgICAgICAgICAgICAgICAgICAgaiAgOworICAgICAgICAgICAgICAgIHBvc1tORV1bMF0gPSAoaS0xKSA8IDAgPyBsaWZlLT5oLTEgOiBpLTE7IHBvc1tORV1bMV0gPSAoaisxKSA9PSBsaWZlLT53ID8gIDAgOiBqKzE7CisgICAgICAgICAgICAgICAgcG9zW1cgXVswXSA9ICAgICAgICAgICAgICAgICAgICAgICAgIGkgIDsgcG9zW1cgXVsxXSA9IChqLTEpIDwgMCA/IGxpZmUtPnctMSA6IGotMTsKKyAgICAgICAgICAgICAgICBwb3NbRSBdWzBdID0gICAgICAgICAgICAgICAgICAgICAgICAgaSAgOyBwb3NbRSBdWzFdID0gKGorMSkgPT0gbGlmZS0+dyA/IDAgIDogaisxOworICAgICAgICAgICAgICAgIHBvc1tTV11bMF0gPSAoaSsxKSA9PSBsaWZlLT5oID8gIDAgOiBpKzE7IHBvc1tTV11bMV0gPSAoai0xKSA8IDAgPyBsaWZlLT53LTEgOiBqLTE7CisgICAgICAgICAgICAgICAgcG9zW1MgXVswXSA9IChpKzEpID09IGxpZmUtPmggPyAgMCA6IGkrMTsgcG9zW1MgXVsxXSA9ICAgICAgICAgICAgICAgICAgICAgICAgIGogIDsKKyAgICAgICAgICAgICAgICBwb3NbU0VdWzBdID0gKGkrMSkgPT0gbGlmZS0+aCA/ICAwIDogaSsxOyBwb3NbU0VdWzFdID0gKGorMSkgPT0gbGlmZS0+dyA/ICAwIDogaisxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwb3NbTlddWzBdID0gKGktMSkgPCAwID8gLTEgICAgICAgIDogaS0xOyBwb3NbTlddWzFdID0gKGotMSkgPCAwID8gLTEgICAgICAgIDogai0xOworICAgICAgICAgICAgICAgIHBvc1tOIF1bMF0gPSAoaS0xKSA8IDAgPyAtMSAgICAgICAgOiBpLTE7IHBvc1tOIF1bMV0gPSAgICAgICAgICAgICAgICAgICAgICAgICBqICA7CisgICAgICAgICAgICAgICAgcG9zW05FXVswXSA9IChpLTEpIDwgMCA/IC0xICAgICAgICA6IGktMTsgcG9zW05FXVsxXSA9IChqKzEpID09IGxpZmUtPncgPyAtMSA6IGorMTsKKyAgICAgICAgICAgICAgICBwb3NbVyBdWzBdID0gICAgICAgICAgICAgICAgICAgICAgICAgaSAgOyBwb3NbVyBdWzFdID0gKGotMSkgPCAwID8gLTEgICAgICAgIDogai0xOworICAgICAgICAgICAgICAgIHBvc1tFIF1bMF0gPSAgICAgICAgICAgICAgICAgICAgICAgICBpICA7IHBvc1tFIF1bMV0gPSAoaisxKSA9PSBsaWZlLT53ID8gLTEgOiBqKzE7CisgICAgICAgICAgICAgICAgcG9zW1NXXVswXSA9IChpKzEpID09IGxpZmUtPmggPyAtMSA6IGkrMTsgcG9zW1NXXVsxXSA9IChqLTEpIDwgMCA/IC0xICAgICAgICA6IGotMTsKKyAgICAgICAgICAgICAgICBwb3NbUyBdWzBdID0gKGkrMSkgPT0gbGlmZS0+aCA/IC0xIDogaSsxOyBwb3NbUyBdWzFdID0gICAgICAgICAgICAgICAgICAgICAgICAgaiAgOworICAgICAgICAgICAgICAgIHBvc1tTRV1bMF0gPSAoaSsxKSA9PSBsaWZlLT5oID8gLTEgOiBpKzE7IHBvc1tTRV1bMV0gPSAoaisxKSA9PSBsaWZlLT53ID8gLTEgOiBqKzE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNvbXB1dGUgdGhlIG51bWJlciBvZiBsaXZlIG5laWdoYm9yIGNlbGxzICovCisgICAgICAgICAgICBuID0gKHBvc1tOV11bMF0gPT0gLTEgfHwgcG9zW05XXVsxXSA9PSAtMSA/IDAgOiBvbGRidWZbcG9zW05XXVswXSpsaWZlLT53ICsgcG9zW05XXVsxXV0gPT0gQUxJVkVfQ0VMTCkgKworICAgICAgICAgICAgICAgIChwb3NbTiBdWzBdID09IC0xIHx8IHBvc1tOIF1bMV0gPT0gLTEgPyAwIDogb2xkYnVmW3Bvc1tOIF1bMF0qbGlmZS0+dyArIHBvc1tOIF1bMV1dID09IEFMSVZFX0NFTEwpICsKKyAgICAgICAgICAgICAgICAocG9zW05FXVswXSA9PSAtMSB8fCBwb3NbTkVdWzFdID09IC0xID8gMCA6IG9sZGJ1Zltwb3NbTkVdWzBdKmxpZmUtPncgKyBwb3NbTkVdWzFdXSA9PSBBTElWRV9DRUxMKSArCisgICAgICAgICAgICAgICAgKHBvc1tXIF1bMF0gPT0gLTEgfHwgcG9zW1cgXVsxXSA9PSAtMSA/IDAgOiBvbGRidWZbcG9zW1cgXVswXSpsaWZlLT53ICsgcG9zW1cgXVsxXV0gPT0gQUxJVkVfQ0VMTCkgKworICAgICAgICAgICAgICAgIChwb3NbRSBdWzBdID09IC0xIHx8IHBvc1tFIF1bMV0gPT0gLTEgPyAwIDogb2xkYnVmW3Bvc1tFIF1bMF0qbGlmZS0+dyArIHBvc1tFIF1bMV1dID09IEFMSVZFX0NFTEwpICsKKyAgICAgICAgICAgICAgICAocG9zW1NXXVswXSA9PSAtMSB8fCBwb3NbU1ddWzFdID09IC0xID8gMCA6IG9sZGJ1Zltwb3NbU1ddWzBdKmxpZmUtPncgKyBwb3NbU1ddWzFdXSA9PSBBTElWRV9DRUxMKSArCisgICAgICAgICAgICAgICAgKHBvc1tTIF1bMF0gPT0gLTEgfHwgcG9zW1MgXVsxXSA9PSAtMSA/IDAgOiBvbGRidWZbcG9zW1MgXVswXSpsaWZlLT53ICsgcG9zW1MgXVsxXV0gPT0gQUxJVkVfQ0VMTCkgKworICAgICAgICAgICAgICAgIChwb3NbU0VdWzBdID09IC0xIHx8IHBvc1tTRV1bMV0gPT0gLTEgPyAwIDogb2xkYnVmW3Bvc1tTRV1bMF0qbGlmZS0+dyArIHBvc1tTRV1bMV1dID09IEFMSVZFX0NFTEwpOworICAgICAgICAgICAgY2VsbCAgPSBvbGRidWZbaSpsaWZlLT53ICsgal07CisgICAgICAgICAgICBhbGl2ZSA9IDE8PG4gJiAoY2VsbCA9PSBBTElWRV9DRUxMID8gbGlmZS0+c3RheV9ydWxlIDogbGlmZS0+Ym9ybl9ydWxlKTsKKyAgICAgICAgICAgIGlmIChhbGl2ZSkgICAgICpuZXdidWYgPSBBTElWRV9DRUxMOyAvLyBuZXcgY2VsbCBpcyBhbGl2ZQorICAgICAgICAgICAgZWxzZSBpZiAoY2VsbCkgKm5ld2J1ZiA9IGNlbGwgLSAxOyAgIC8vIG5ldyBjZWxsIGlzIGRlYWQgYW5kIGluIHRoZSBwcm9jZXNzIG9mIG1vbGQKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICpuZXdidWYgPSAwOyAgICAgICAgICAvLyBuZXcgY2VsbCBpcyBkZWZpbml0ZWx5IGRlYWQKKyAgICAgICAgICAgIGF2X2Rsb2coY3R4LCAiaTolZCBqOiVkIGxpdmVfbmVpZ2hib3JzOiVkIGNlbGw6JWQgLT4gY2VsbDolZFxuIiwgaSwgaiwgbiwgY2VsbCwgKm5ld2J1Zik7CisgICAgICAgICAgICBuZXdidWYrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxpZmUtPmJ1Zl9pZHggPSAhbGlmZS0+YnVmX2lkeDsKK30KKworc3RhdGljIHZvaWQgZmlsbF9waWN0dXJlX21vbm9ibGFjayhBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqcGljcmVmKQoreworICAgIExpZmVDb250ZXh0ICpsaWZlID0gY3R4LT5wcml2OworICAgIHVpbnQ4X3QgKmJ1ZiA9IGxpZmUtPmJ1ZltsaWZlLT5idWZfaWR4XTsKKyAgICBpbnQgaSwgaiwgazsKKworICAgIC8qIGZpbGwgdGhlIG91dHB1dCBwaWN0dXJlIHdpdGggdGhlIG9sZCBncmlkIGJ1ZmZlciAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsaWZlLT5oOyBpKyspIHsKKyAgICAgICAgdWludDhfdCBieXRlID0gMDsKKyAgICAgICAgdWludDhfdCAqcCA9IHBpY3JlZi0+ZGF0YVswXSArIGkgKiBwaWNyZWYtPmxpbmVzaXplWzBdOworICAgICAgICBmb3IgKGsgPSAwLCBqID0gMDsgaiA8IGxpZmUtPnc7IGorKykgeworICAgICAgICAgICAgYnl0ZSB8PSAoYnVmW2kqbGlmZS0+dytqXSA9PSBBTElWRV9DRUxMKTw8KDctaysrKTsKKyAgICAgICAgICAgIGlmIChrPT04IHx8IGogPT0gbGlmZS0+dy0xKSB7CisgICAgICAgICAgICAgICAgayA9IDA7CisgICAgICAgICAgICAgICAgKnArKyA9IGJ5dGU7CisgICAgICAgICAgICAgICAgYnl0ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIGRpdmlkZSBieSAyNTUgYW5kIHJvdW5kIHRvIG5lYXJlc3QKKy8vIGFwcGx5IGEgZmFzdCB2YXJpYW50OiAoWCsxMjcpLzI1NSA9ICgoWCsxMjcpKjI1NysyNTcpPj4xNiA9ICgoWCsxMjgpKjI1Nyk+PjE2CisjZGVmaW5lIEZBU1RfRElWMjU1KHgpICgoKCh4KSArIDEyOCkgKiAyNTcpID4+IDE2KQorCitzdGF0aWMgdm9pZCBmaWxsX3BpY3R1cmVfcmdiKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpwaWNyZWYpCit7CisgICAgTGlmZUNvbnRleHQgKmxpZmUgPSBjdHgtPnByaXY7CisgICAgdWludDhfdCAqYnVmID0gbGlmZS0+YnVmW2xpZmUtPmJ1Zl9pZHhdOworICAgIGludCBpLCBqOworCisgICAgLyogZmlsbCB0aGUgb3V0cHV0IHBpY3R1cmUgd2l0aCB0aGUgb2xkIGdyaWQgYnVmZmVyICovCisgICAgZm9yIChpID0gMDsgaSA8IGxpZmUtPmg7IGkrKykgeworICAgICAgICB1aW50OF90ICpwID0gcGljcmVmLT5kYXRhWzBdICsgaSAqIHBpY3JlZi0+bGluZXNpemVbMF07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsaWZlLT53OyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdiA9IGJ1ZltpKmxpZmUtPncgKyBqXTsKKyAgICAgICAgICAgIGlmIChsaWZlLT5tb2xkICYmIHYgIT0gQUxJVkVfQ0VMTCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmMxID0gbGlmZS0+IG1vbGRfY29sb3I7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYzIgPSBsaWZlLT5kZWF0aF9jb2xvcjsKKyAgICAgICAgICAgICAgICBpbnQgZGVhdGhfYWdlID0gRkZNSU4oKDB4ZmYgLSB2KSAqIGxpZmUtPm1vbGQsIDB4ZmYpOworICAgICAgICAgICAgICAgICpwKysgPSBGQVNUX0RJVjI1NSgoYzJbMF0gPDwgOCkgKyAoKGludCljMVswXSAtIChpbnQpYzJbMF0pICogZGVhdGhfYWdlKTsKKyAgICAgICAgICAgICAgICAqcCsrID0gRkFTVF9ESVYyNTUoKGMyWzFdIDw8IDgpICsgKChpbnQpYzFbMV0gLSAoaW50KWMyWzFdKSAqIGRlYXRoX2FnZSk7CisgICAgICAgICAgICAgICAgKnArKyA9IEZBU1RfRElWMjU1KChjMlsyXSA8PCA4KSArICgoaW50KWMxWzJdIC0gKGludCljMlsyXSkgKiBkZWF0aF9hZ2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjID0gdiA9PSBBTElWRV9DRUxMID8gbGlmZS0+bGlmZV9jb2xvciA6IGxpZmUtPmRlYXRoX2NvbG9yOworICAgICAgICAgICAgICAgIEFWX1dCMjQocCwgY1swXTw8MTYgfCBjWzFdPDw4IHwgY1syXSk7CisgICAgICAgICAgICAgICAgcCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIExpZmVDb250ZXh0ICpsaWZlID0gb3V0bGluay0+c3JjLT5wcml2OworICAgIEFWRnJhbWUgKnBpY3JlZiA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgbGlmZS0+dywgbGlmZS0+aCk7CisgICAgaWYgKCFwaWNyZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcGljcmVmLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpIHsxLCAxfTsKKyAgICBwaWNyZWYtPnB0cyA9IGxpZmUtPnB0cysrOworCisgICAgbGlmZS0+ZHJhdyhvdXRsaW5rLT5zcmMsIHBpY3JlZik7CisgICAgZXZvbHZlKG91dGxpbmstPnNyYyk7CisjaWZkZWYgREVCVUcKKyAgICBzaG93X2xpZmVfZ3JpZChvdXRsaW5rLT5zcmMpOworI2VuZGlmCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBwaWNyZWYpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTGlmZUNvbnRleHQgKmxpZmUgPSBjdHgtPnByaXY7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7IEFWX1BJWF9GTVRfTk9ORSwgQVZfUElYX0ZNVF9OT05FIH07CisgICAgaWYgKGxpZmUtPm1vbGQgfHwgbWVtY21wKGxpZmUtPiBsaWZlX2NvbG9yLCAiXHhmZlx4ZmZceGZmIiwgMykKKyAgICAgICAgICAgICAgICAgICB8fCBtZW1jbXAobGlmZS0+ZGVhdGhfY29sb3IsICJceDAwXHgwMFx4MDAiLCAzKSkgeworICAgICAgICBwaXhfZm10c1swXSA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIGxpZmUtPmRyYXcgPSBmaWxsX3BpY3R1cmVfcmdiOworICAgIH0gZWxzZSB7CisgICAgICAgIHBpeF9mbXRzWzBdID0gQVZfUElYX0ZNVF9NT05PQkxBQ0s7CisgICAgICAgIGxpZmUtPmRyYXcgPSBmaWxsX3BpY3R1cmVfbW9ub2JsYWNrOworICAgIH0KKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBsaWZlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTH0KK307CisKK0FWRmlsdGVyIGZmX3ZzcmNfbGlmZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJsaWZlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDcmVhdGUgbGlmZS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihMaWZlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmbGlmZV9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gTlVMTCwKKyAgICAub3V0cHV0cyAgICAgICA9IGxpZmVfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdnNyY19tYW5kZWxicm90LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdnNyY19tYW5kZWxicm90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1ZjJkYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci92c3JjX21hbmRlbGJyb3QuYwpAQCAtMCwwICsxLDQzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICoKKyAqIFRoZSB2c3JjX2NvbG9yIGZpbHRlciBmcm9tIFN0ZWZhbm8gU2FiYXRpbmkgd2FzIHVzZWQgYXMgdGVtcGxhdGUgdG8gY3JlYXRlCisgKiB0aGlzCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTWFuZGVsYnJvdCBmcmFrdGFsIHJlbmRlcmVyCisgKi8KKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2RlZmluZSBTUVIoYSkgKChhKSooYSkpCisKK2VudW0gT3V0ZXJ7CisgICAgSVRFUkFUSU9OX0NPVU5ULAorICAgIE5PUk1BTElaRURfSVRFUkFUSU9OX0NPVU5ULAorICAgIFdISVRFLAorICAgIE9VVFosCit9OworCitlbnVtIElubmVyeworICAgIEJMQUNLLAorICAgIFBFUklPRCwKKyAgICBDT05WVElNRSwKKyAgICBNSU5DT0wsCit9OworCit0eXBlZGVmIHN0cnVjdCBQb2ludCB7CisgICAgZG91YmxlIHBbMl07CisgICAgdWludDMyX3QgdmFsOworfSBQb2ludDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCB3LCBoOworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZTsKKyAgICB1aW50NjRfdCBwdHM7CisgICAgaW50IG1heGl0ZXI7CisgICAgZG91YmxlIHN0YXJ0X3g7CisgICAgZG91YmxlIHN0YXJ0X3k7CisgICAgZG91YmxlIHN0YXJ0X3NjYWxlOworICAgIGRvdWJsZSBlbmRfc2NhbGU7CisgICAgZG91YmxlIGVuZF9wdHM7CisgICAgZG91YmxlIGJhaWxvdXQ7CisgICAgZW51bSBPdXRlciBvdXRlcjsKKyAgICBlbnVtIElubmVyIGlubmVyOworICAgIGludCBjYWNoZV9hbGxvY2F0ZWQ7CisgICAgaW50IGNhY2hlX3VzZWQ7CisgICAgUG9pbnQgKnBvaW50X2NhY2hlOworICAgIFBvaW50ICpuZXh0X2NhY2hlOworICAgIGRvdWJsZSAoKnp5a2x1cylbMl07CisgICAgdWludDMyX3QgZGl0aGVyOworCisgICAgZG91YmxlIG1vcnBoeGY7CisgICAgZG91YmxlIG1vcnBoeWY7CisgICAgZG91YmxlIG1vcnBoYW1wOworfSBNQkNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE1CQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBtYW5kZWxicm90X29wdGlvbnNbXSA9IHsKKyAgICB7InNpemUiLCAgICAgICAgInNldCBmcmFtZSBzaXplIiwgICAgICAgICAgICAgICAgT0ZGU0VUKHcpLCAgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0cj0iNjQweDQ4MCJ9LCAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsicyIsICAgICAgICAgICAic2V0IGZyYW1lIHNpemUiLCAgICAgICAgICAgICAgICBPRkZTRVQodyksICAgICAgIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyPSI2NDB4NDgwIn0sICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyJyYXRlIiwgICAgICAgICJzZXQgZnJhbWUgcmF0ZSIsICAgICAgICAgICAgICAgIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHI9IjI1In0sICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyJyIiwgICAgICAgICAgICJzZXQgZnJhbWUgcmF0ZSIsICAgICAgICAgICAgICAgIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHI9IjI1In0sICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyJtYXhpdGVyIiwgICAgICJzZXQgbWF4IGl0ZXJhdGlvbnMgbnVtYmVyIiwgICAgIE9GRlNFVChtYXhpdGVyKSwgQVZfT1BUX1RZUEVfSU5ULCAgICAgICAgey5pNjQ9NzE4OX0sICAxLCAgICAgICAgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7InN0YXJ0X3giLCAgICAgInNldCB0aGUgaW5pdGlhbCB4IHBvc2l0aW9uIiwgICAgT0ZGU0VUKHN0YXJ0X3gpLCBBVl9PUFRfVFlQRV9ET1VCTEUsICAgICB7LmRibD0tMC43NDM2NDM4ODcwMzcxNTg3MDQ3NTIxOTE1MDYxMTQ3NzR9LCAtMTAwLCAxMDAsIEZMQUdTIH0sCisgICAgeyJzdGFydF95IiwgICAgICJzZXQgdGhlIGluaXRpYWwgeSBwb3NpdGlvbiIsICAgIE9GRlNFVChzdGFydF95KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCAgICAgey5kYmw9LTAuMTMxODI1OTA0MjA1MzExOTcwNDkzMTMyMDU2Mzg1MTM5fSwgLTEwMCwgMTAwLCBGTEFHUyB9LAorICAgIHsic3RhcnRfc2NhbGUiLCAic2V0IHRoZSBpbml0aWFsIHNjYWxlIHZhbHVlIiwgICBPRkZTRVQoc3RhcnRfc2NhbGUpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTMuMH0sICAwLCBGTFRfTUFYLCBGTEFHUyB9LAorICAgIHsiZW5kX3NjYWxlIiwgICAic2V0IHRoZSB0ZXJtaW5hbCBzY2FsZSB2YWx1ZSIsICBPRkZTRVQoZW5kX3NjYWxlKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCAgIHsuZGJsPTAuM30sICAwLCBGTFRfTUFYLCBGTEFHUyB9LAorICAgIHsiZW5kX3B0cyIsICAgICAic2V0IHRoZSB0ZXJtaW5hbCBwdHMgdmFsdWUiLCAgICBPRkZTRVQoZW5kX3B0cyksIEFWX09QVF9UWVBFX0RPVUJMRSwgICAgIHsuZGJsPTQwMH0sICAwLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisgICAgeyJiYWlsb3V0IiwgICAgICJzZXQgdGhlIGJhaWxvdXQgdmFsdWUiLCAgICAgICAgIE9GRlNFVChiYWlsb3V0KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCAgICAgey5kYmw9MTB9LCAgIDAsIEZMVF9NQVgsIEZMQUdTIH0sCisgICAgeyJtb3JwaHhmIiwgICAgICJzZXQgbW9ycGggeCBmcmVxdWVuY3kiLCAgICAgICAgIE9GRlNFVChtb3JwaHhmKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCAgICAgey5kYmw9MC4wMX0sICAgLUZMVF9NQVgsIEZMVF9NQVgsIEZMQUdTIH0sCisgICAgeyJtb3JwaHlmIiwgICAgICJzZXQgbW9ycGggeSBmcmVxdWVuY3kiLCAgICAgICAgIE9GRlNFVChtb3JwaHlmKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCAgICAgey5kYmw9MC4wMTIzfSwgLUZMVF9NQVgsIEZMVF9NQVgsIEZMQUdTIH0sCisgICAgeyJtb3JwaGFtcCIsICAgICJzZXQgbW9ycGggYW1wbGl0dWRlIiwgICAgICAgICAgIE9GRlNFVChtb3JwaGFtcCksIEFWX09QVF9UWVBFX0RPVUJMRSwgICAgey5kYmw9MH0sICAgICAgLUZMVF9NQVgsIEZMVF9NQVgsIEZMQUdTIH0sCisKKyAgICB7Im91dGVyIiwgICAgICAgInNldCBvdXRlciBjb2xvcmluZyBtb2RlIiwgICAgICAgT0ZGU0VUKG91dGVyKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1OT1JNQUxJWkVEX0lURVJBVElPTl9DT1VOVH0sIDAsIElOVF9NQVgsIEZMQUdTLCAib3V0ZXIiIH0sCisgICAgeyJpdGVyYXRpb25fY291bnQiLCAic2V0IGl0ZXJhdGlvbiBjb3VudCBtb2RlIiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1JVEVSQVRJT05fQ09VTlR9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm91dGVyIiB9LAorICAgIHsibm9ybWFsaXplZF9pdGVyYXRpb25fY291bnQiLCAic2V0IG5vcm1hbGl6ZWQgaXRlcmF0aW9uIGNvdW50IG1vZGUiLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1OT1JNQUxJWkVEX0lURVJBVElPTl9DT1VOVH0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAib3V0ZXIiIH0sCisgICAgeyJ3aGl0ZSIsICJzZXQgd2hpdGUgbW9kZSIsICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XSElURX0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAib3V0ZXIiIH0sCisgICAgeyJvdXR6IiwgICAgICAgICJzZXQgb3V0eiBtb2RlIiwgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1PVVRafSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJvdXRlciIgfSwKKworICAgIHsiaW5uZXIiLCAgICAgICAic2V0IGlubmVyIGNvbG9yaW5nIG1vZGUiLCAgICAgICBPRkZTRVQoaW5uZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PU1JTkNPTH0sIDAsIElOVF9NQVgsIEZMQUdTLCAiaW5uZXIiIH0sCisgICAgeyJibGFjayIsICAgICAgICJzZXQgYmxhY2sgbW9kZSIsICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1CTEFDS30sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiaW5uZXIifSwKKyAgICB7InBlcmlvZCIsICAgICAgInNldCBwZXJpb2QgbW9kZSIsICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVBFUklPRH0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiaW5uZXIifSwKKyAgICB7ImNvbnZlcmdlbmNlIiwgInNob3cgdGltZSB1bnRpbCBjb252ZXJnZW5jZSIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNPTlZUSU1FfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJpbm5lciJ9LAorICAgIHsibWluY29sIiwgICAgICAiY29sb3IgYmFzZWQgb24gcG9pbnQgY2xvc2VzdCB0byB0aGUgb3JpZ2luIG9mIHRoZSBpdGVyYXRpb25zIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TUlOQ09MfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJpbm5lciJ9LAorCisgICAge05VTEx9LAorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKG1hbmRlbGJyb3QpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBNQkNvbnRleHQgKm1iID0gY3R4LT5wcml2OworCisgICAgbWItPmJhaWxvdXQgKj0gbWItPmJhaWxvdXQ7CisKKyAgICBtYi0+c3RhcnRfc2NhbGUgLz1tYi0+aDsKKyAgICBtYi0+ZW5kX3NjYWxlIC89bWItPmg7CisKKyAgICBtYi0+Y2FjaGVfYWxsb2NhdGVkID0gbWItPncgKiBtYi0+aCAqIDM7CisgICAgbWItPmNhY2hlX3VzZWQgPSAwOworICAgIG1iLT5wb2ludF9jYWNoZT0gYXZfbWFsbG9jX2FycmF5KG1iLT5jYWNoZV9hbGxvY2F0ZWQsIHNpemVvZigqbWItPnBvaW50X2NhY2hlKSk7CisgICAgbWItPiBuZXh0X2NhY2hlPSBhdl9tYWxsb2NfYXJyYXkobWItPmNhY2hlX2FsbG9jYXRlZCwgc2l6ZW9mKCptYi0+IG5leHRfY2FjaGUpKTsKKyAgICBtYi0+IHp5a2x1cyAgICA9IGF2X21hbGxvY19hcnJheShtYi0+bWF4aXRlciArIDE2LCBzaXplb2YoKm1iLT56eWtsdXMpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBNQkNvbnRleHQgKm1iID0gY3R4LT5wcml2OworCisgICAgYXZfZnJlZXAoJm1iLT5wb2ludF9jYWNoZSk7CisgICAgYXZfZnJlZXAoJm1iLT4gbmV4dF9jYWNoZSk7CisgICAgYXZfZnJlZXAoJm1iLT56eWtsdXMpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX0JHUjMyLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+c3JjOworICAgIE1CQ29udGV4dCAqbWIgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZShtYi0+dywgbWItPmgsIDAsIGN0eCkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaW5saW5rLT53ID0gbWItPnc7CisgICAgaW5saW5rLT5oID0gbWItPmg7CisgICAgaW5saW5rLT50aW1lX2Jhc2UgPSBhdl9pbnZfcShtYi0+ZnJhbWVfcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmlsbF9mcm9tX2NhY2hlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB1aW50MzJfdCAqY29sb3IsIGludCAqaW5fY2lkeCwgaW50ICpvdXRfY2lkeCwgZG91YmxlIHB5LCBkb3VibGUgc2NhbGUpeworICAgIE1CQ29udGV4dCAqbWIgPSBjdHgtPnByaXY7CisgICAgaWYobWItPm1vcnBoYW1wKQorICAgICAgICByZXR1cm47CisgICAgZm9yKDsgKmluX2NpZHggPCBtYi0+Y2FjaGVfdXNlZDsgKCppbl9jaWR4KSsrKXsKKyAgICAgICAgUG9pbnQgKnA9ICZtYi0+cG9pbnRfY2FjaGVbKmluX2NpZHhdOworICAgICAgICBpbnQgeDsKKyAgICAgICAgaWYocC0+cFsxXSA+IHB5KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHg9IHJvdW5kKChwLT5wWzBdIC0gbWItPnN0YXJ0X3gpIC8gc2NhbGUgKyBtYi0+dy8yKTsKKyAgICAgICAgaWYoeDwwIHx8IHggPj0gbWItPncpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYoY29sb3IpIGNvbG9yW3hdID0gcC0+dmFsOworICAgICAgICBpZihvdXRfY2lkeCAmJiAqb3V0X2NpZHggPCBtYi0+Y2FjaGVfYWxsb2NhdGVkKQorICAgICAgICAgICAgbWItPm5leHRfY2FjaGVbKCpvdXRfY2lkeCkrK109ICpwOworICAgIH0KK30KKworc3RhdGljIGludCBpbnRlcnBvbChNQkNvbnRleHQgKm1iLCB1aW50MzJfdCAqY29sb3IsIGludCB4LCBpbnQgeSwgaW50IGxpbmVzaXplKQoreworICAgIHVpbnQzMl90IGEsYixjLGQsIGk7CisgICAgdWludDMyX3QgaXBvbD0weEZGMDAwMDAwOworICAgIGludCBkaXN0OworCisgICAgaWYoIXggfHwgIXkgfHwgeCsxPT1tYi0+dyB8fCB5KzE9PW1iLT5oKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGRpc3Q9IEZGTUFYKEZGQUJTKHgtKG1iLT53Pj4xKSkqbWItPmgsIEZGQUJTKHktKG1iLT5oPj4xKSkqbWItPncpOworCisgICAgaWYoZGlzdDwobWItPncqbWItPmg+PjMpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGE9Y29sb3JbKHgrMSkgKyAoeSswKSpsaW5lc2l6ZV07CisgICAgYj1jb2xvclsoeC0xKSArICh5KzEpKmxpbmVzaXplXTsKKyAgICBjPWNvbG9yWyh4KzApICsgKHkrMSkqbGluZXNpemVdOworICAgIGQ9Y29sb3JbKHgrMSkgKyAoeSsxKSpsaW5lc2l6ZV07CisKKyAgICBpZihhJiZjKXsKKyAgICAgICAgYj0gY29sb3JbKHgtMSkgKyAoeSswKSpsaW5lc2l6ZV07CisgICAgICAgIGQ9IGNvbG9yWyh4KzApICsgKHktMSkqbGluZXNpemVdOworICAgIH1lbHNlIGlmKGImJmQpeworICAgICAgICBhPSBjb2xvclsoeCsxKSArICh5LTEpKmxpbmVzaXplXTsKKyAgICAgICAgYz0gY29sb3JbKHgtMSkgKyAoeS0xKSpsaW5lc2l6ZV07CisgICAgfWVsc2UgaWYoYyl7CisgICAgICAgIGQ9IGNvbG9yWyh4KzApICsgKHktMSkqbGluZXNpemVdOworICAgICAgICBhPSBjb2xvclsoeC0xKSArICh5KzApKmxpbmVzaXplXTsKKyAgICAgICAgYj0gY29sb3JbKHgrMSkgKyAoeS0xKSpsaW5lc2l6ZV07CisgICAgfWVsc2UgaWYoZCl7CisgICAgICAgIGM9IGNvbG9yWyh4LTEpICsgKHktMSkqbGluZXNpemVdOworICAgICAgICBhPSBjb2xvclsoeC0xKSArICh5KzApKmxpbmVzaXplXTsKKyAgICAgICAgYj0gY29sb3JbKHgrMSkgKyAoeS0xKSpsaW5lc2l6ZV07CisgICAgfWVsc2UKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IoaT0wOyBpPDM7IGkrKyl7CisgICAgICAgIGludCBzPSA4Kmk7CisgICAgICAgIHVpbnQ4X3QgYWM9IGE+PnM7CisgICAgICAgIHVpbnQ4X3QgYmM9IGI+PnM7CisgICAgICAgIHVpbnQ4X3QgY2M9IGM+PnM7CisgICAgICAgIHVpbnQ4X3QgZGM9IGQ+PnM7CisgICAgICAgIGludCBpcG9sYWI9IChhYyArIGJjKTsKKyAgICAgICAgaW50IGlwb2xjZD0gKGNjICsgZGMpOworICAgICAgICBpZihGRkFCUyhpcG9sYWIgLSBpcG9sY2QpID4gNSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZihGRkFCUyhhYy1iYykrRkZBQlMoY2MtZGMpID4gMjApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaXBvbCB8PSAoKGlwb2xhYiArIGlwb2xjZCArIDIpLzQpPDxzOworICAgIH0KKyAgICBjb2xvclt4ICsgeSpsaW5lc2l6ZV09IGlwb2w7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfbWFuZGVsYnJvdChBVkZpbHRlckNvbnRleHQgKmN0eCwgdWludDMyX3QgKmNvbG9yLCBpbnQgbGluZXNpemUsIGludDY0X3QgcHRzKQoreworICAgIE1CQ29udGV4dCAqbWIgPSBjdHgtPnByaXY7CisgICAgaW50IHgseSxpLCBpbl9jaWR4PTAsIG5leHRfY2lkeD0wLCB0bXBfY2lkeDsKKyAgICBkb3VibGUgc2NhbGU9IG1iLT5zdGFydF9zY2FsZSpwb3cobWItPmVuZF9zY2FsZS9tYi0+c3RhcnRfc2NhbGUsIHB0cy9tYi0+ZW5kX3B0cyk7CisgICAgaW50IHVzZV96eWtsdXM9MDsKKyAgICBmaWxsX2Zyb21fY2FjaGUoY3R4LCBOVUxMLCAmaW5fY2lkeCwgTlVMTCwgbWItPnN0YXJ0X3krc2NhbGUqKC1tYi0+aC8yLTAuNSksIHNjYWxlKTsKKyAgICB0bXBfY2lkeD0gaW5fY2lkeDsKKyAgICBtZW1zZXQoY29sb3IsIDAsIHNpemVvZigqY29sb3IpKm1iLT53KTsKKyAgICBmb3IoeT0wOyB5PG1iLT5oOyB5KyspeworICAgICAgICBpbnQgeTE9IHkrMTsKKyAgICAgICAgY29uc3QgZG91YmxlIGNpPW1iLT5zdGFydF95K3NjYWxlKih5LW1iLT5oLzIpOworICAgICAgICBmaWxsX2Zyb21fY2FjaGUoY3R4LCBOVUxMLCAmaW5fY2lkeCwgJm5leHRfY2lkeCwgY2ksIHNjYWxlKTsKKyAgICAgICAgaWYoeTE8bWItPmgpeworICAgICAgICAgICAgbWVtc2V0KGNvbG9yK2xpbmVzaXplKnkxLCAwLCBzaXplb2YoKmNvbG9yKSptYi0+dyk7CisgICAgICAgICAgICBmaWxsX2Zyb21fY2FjaGUoY3R4LCBjb2xvcitsaW5lc2l6ZSp5MSwgJnRtcF9jaWR4LCBOVUxMLCBjaSArIDMqc2NhbGUvMiwgc2NhbGUpOworICAgICAgICB9CisKKyAgICAgICAgZm9yKHg9MDsgeDxtYi0+dzsgeCsrKXsKKyAgICAgICAgICAgIGZsb2F0IGF2X3VuaW5pdChlcHNpbG9uKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBjcj1tYi0+c3RhcnRfeCtzY2FsZSooeC1tYi0+dy8yKTsKKyAgICAgICAgICAgIGRvdWJsZSB6cj1jcjsKKyAgICAgICAgICAgIGRvdWJsZSB6aT1jaTsKKyAgICAgICAgICAgIHVpbnQzMl90IGM9MDsKKyAgICAgICAgICAgIGRvdWJsZSBkdj0gbWItPmRpdGhlciAvIChkb3VibGUpKDFMTDw8MzIpOworICAgICAgICAgICAgbWItPmRpdGhlcj0gbWItPmRpdGhlcioxNjY0NTI1KzEwMTM5MDQyMjM7CisKKyAgICAgICAgICAgIGlmKGNvbG9yW3ggKyB5KmxpbmVzaXplXSAmIDB4RkYwMDAwMDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZighbWItPm1vcnBoYW1wKXsKKyAgICAgICAgICAgICAgICBpZihpbnRlcnBvbChtYiwgY29sb3IsIHgsIHksIGxpbmVzaXplKSl7CisgICAgICAgICAgICAgICAgICAgIGlmKG5leHRfY2lkeCA8IG1iLT5jYWNoZV9hbGxvY2F0ZWQpeworICAgICAgICAgICAgICAgICAgICAgICAgbWItPm5leHRfY2FjaGVbbmV4dF9jaWR4ICBdLnBbMF09IGNyOworICAgICAgICAgICAgICAgICAgICAgICAgbWItPm5leHRfY2FjaGVbbmV4dF9jaWR4ICBdLnBbMV09IGNpOworICAgICAgICAgICAgICAgICAgICAgICAgbWItPm5leHRfY2FjaGVbbmV4dF9jaWR4KytdLnZhbCA9IGNvbG9yW3ggKyB5KmxpbmVzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICB6ciArPSBjb3MocHRzICogbWItPm1vcnBoeGYpICogbWItPm1vcnBoYW1wOworICAgICAgICAgICAgICAgIHppICs9IHNpbihwdHMgKiBtYi0+bW9ycGh5ZikgKiBtYi0+bW9ycGhhbXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVzZV96eWtsdXM9ICh4PT0wIHx8IG1iLT5pbm5lciE9QkxBQ0sgfHxjb2xvclt4LTEgKyB5KmxpbmVzaXplXSA9PSAweEZGMDAwMDAwKTsKKyAgICAgICAgICAgIGlmKHVzZV96eWtsdXMpCisgICAgICAgICAgICAgICAgZXBzaWxvbj0gc2NhbGUqMSpzcXJ0KFNRUih4LW1iLT53LzIpICsgU1FSKHktbWItPmgvMikpL21iLT53OworCisjZGVmaW5lIFpfWjJfQyhvdXRyLG91dGksaW5yLGluaSlcCisgICAgICAgICAgICBvdXRyPSBpbnIqaW5yIC0gaW5pKmluaSArIGNyO1wKKyAgICAgICAgICAgIG91dGk9IDIqaW5yKmluaSArIGNpOworCisjZGVmaW5lIFpfWjJfQ19aWUtMVVMob3V0cixvdXRpLGlucixpbmksIFopXAorICAgICAgICAgICAgWl9aMl9DKG91dHIsb3V0aSxpbnIsaW5pKVwKKyAgICAgICAgICAgIGlmKHVzZV96eWtsdXMpe1wKKyAgICAgICAgICAgICAgICBpZihaICYmIGZhYnMobWItPnp5a2x1c1tpPj4xXVswXS1vdXRyKStmYWJzKG1iLT56eWtsdXNbaT4+MV1bMV0tb3V0aSkgPD0gZXBzaWxvbilcCisgICAgICAgICAgICAgICAgICAgIGJyZWFrO1wKKyAgICAgICAgICAgIH1cCisgICAgICAgICAgICBtYi0+enlrbHVzW2ldWzBdPSBvdXRyO1wKKyAgICAgICAgICAgIG1iLT56eWtsdXNbaV1bMV09IG91dGk7XAorCisKKworICAgICAgICAgICAgZm9yKGk9MDsgaTxtYi0+bWF4aXRlci04OyBpKyspeworICAgICAgICAgICAgICAgIGRvdWJsZSB0OworICAgICAgICAgICAgICAgIFpfWjJfQ19aWUtMVVModCwgemksIHpyLCB6aSwgMCkKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgWl9aMl9DX1pZS0xVUyh6ciwgemksIHQsIHppLCAxKQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBaX1oyX0NfWllLTFVTKHQsIHppLCB6ciwgemksIDApCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIFpfWjJfQ19aWUtMVVMoenIsIHppLCB0LCB6aSwgMSkKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgWl9aMl9DX1pZS0xVUyh0LCB6aSwgenIsIHppLCAwKQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBaX1oyX0NfWllLTFVTKHpyLCB6aSwgdCwgemksIDEpCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIFpfWjJfQ19aWUtMVVModCwgemksIHpyLCB6aSwgMCkKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgWl9aMl9DX1pZS0xVUyh6ciwgemksIHQsIHppLCAxKQorICAgICAgICAgICAgICAgIGlmKHpyKnpyICsgemkqemkgPiBtYi0+YmFpbG91dCl7CisgICAgICAgICAgICAgICAgICAgIGktPSBGRk1JTig3LCBpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKDsgaTxtYi0+bWF4aXRlcjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpyPSBtYi0+enlrbHVzW2ldWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgemk9IG1iLT56eWtsdXNbaV1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZih6cip6ciArIHppKnppID4gbWItPmJhaWxvdXQpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtYi0+b3V0ZXIpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgICAgICAgICAgICBJVEVSQVRJT05fQ09VTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpyID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGxyaW50Zigoc2luKHpyKSsxKSoxMjcpICsgbHJpbnRmKChzaW4oenIvMS4yMzQpKzEpKjEyNykqMjU2KjI1NiArIGxyaW50Zigoc2luKHpyLzEwMCkrMSkqMTI3KSoyNTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTk9STUFMSVpFRF9JVEVSQVRJT05fQ09VTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpyID0gaSArIGxvZzIobG9nKG1iLT5iYWlsb3V0KSAvIGxvZyh6cip6ciArIHppKnppKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBscmludGYoKHNpbih6cikrMSkqMTI3KSArIGxyaW50Zigoc2luKHpyLzEuMjM0KSsxKSoxMjcpKjI1NioyNTYgKyBscmludGYoKHNpbih6ci8xMDApKzEpKjEyNykqMjU2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICAgICAgICAgICAgICAgICAgICAgIFdISVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMHhGRkZGRkY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgICAgICAgICAgICAgICAgICAgICAgT1VUWjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenIgLz0gbWItPmJhaWxvdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppIC89IG1iLT5iYWlsb3V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKCgoaW50KSh6cioxMjgrMTI4KSkmMHhGRikqMjU2ICsgKCgoaW50KSh6aSoxMjgrMTI4KSkmMHhGRik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFjKXsKKyAgICAgICAgICAgICAgICBpZihtYi0+aW5uZXI9PVBFUklPRCl7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgZm9yKGo9aS0xOyBqOyBqLS0pCisgICAgICAgICAgICAgICAgICAgIGlmKFNRUihtYi0+enlrbHVzW2pdWzBdLXpyKSArIFNRUihtYi0+enlrbHVzW2pdWzFdLXppKSA8IGVwc2lsb24qZXBzaWxvbioxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmKGopeworICAgICAgICAgICAgICAgICAgICBjPSBpLWo7CisgICAgICAgICAgICAgICAgICAgIGM9ICgoYzw8NSkmMHhFMCkgKyAoKGM8PDEwKSYweEUwMDApICsgKChjPDwxNSkmMHhFMDAwMDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ZWxzZSBpZihtYi0+aW5uZXI9PUNPTlZUSU1FKXsKKyAgICAgICAgICAgICAgICAgICAgYz0gZmxvb3IoaSoyNTUuMC9tYi0+bWF4aXRlcitkdikqMHgwMTAxMDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKG1iLT5pbm5lcj09TUlOQ09MKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjbG9zZXN0PTk5OTk7CisgICAgICAgICAgICAgICAgICAgIGludCBjbG9zZXN0X2luZGV4PTA7CisgICAgICAgICAgICAgICAgICAgIGZvcihqPWktMTsgaj49MDsgai0tKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoU1FSKG1iLT56eWtsdXNbal1bMF0pICsgU1FSKG1iLT56eWtsdXNbal1bMV0pIDwgY2xvc2VzdCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdD0gU1FSKG1iLT56eWtsdXNbal1bMF0pICsgU1FSKG1iLT56eWtsdXNbal1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RfaW5kZXg9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3QgPSBzcXJ0KGNsb3Nlc3QpOworICAgICAgICAgICAgICAgICAgICBjPSBscmludGYoKG1iLT56eWtsdXNbY2xvc2VzdF9pbmRleF1bMF0vY2xvc2VzdCsxKSoxMjcrZHYpICsgbHJpbnRmKChtYi0+enlrbHVzW2Nsb3Nlc3RfaW5kZXhdWzFdL2Nsb3Nlc3QrMSkqMTI3K2R2KSoyNTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYyB8PSAweEZGMDAwMDAwOworICAgICAgICAgICAgY29sb3JbeCArIHkqbGluZXNpemVdPSBjOworICAgICAgICAgICAgaWYobmV4dF9jaWR4IDwgbWItPmNhY2hlX2FsbG9jYXRlZCl7CisgICAgICAgICAgICAgICAgbWItPm5leHRfY2FjaGVbbmV4dF9jaWR4ICBdLnBbMF09IGNyOworICAgICAgICAgICAgICAgIG1iLT5uZXh0X2NhY2hlW25leHRfY2lkeCAgXS5wWzFdPSBjaTsKKyAgICAgICAgICAgICAgICBtYi0+bmV4dF9jYWNoZVtuZXh0X2NpZHgrK10udmFsID0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaWxsX2Zyb21fY2FjaGUoY3R4LCBOVUxMLCAmaW5fY2lkeCwgJm5leHRfY2lkeCwgY2kgKyBzY2FsZS8yLCBzY2FsZSk7CisgICAgfQorICAgIEZGU1dBUCh2b2lkKiwgbWItPm5leHRfY2FjaGUsIG1iLT5wb2ludF9jYWNoZSk7CisgICAgbWItPmNhY2hlX3VzZWQgPSBuZXh0X2NpZHg7CisgICAgaWYobWItPmNhY2hlX3VzZWQgPT0gbWItPmNhY2hlX2FsbG9jYXRlZCkKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJNYW5kZWxicm90IGNhY2hlIGlzIHRvbyBzbWFsbCFcbiIpOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIE1CQ29udGV4dCAqbWIgPSBsaW5rLT5zcmMtPnByaXY7CisgICAgQVZGcmFtZSAqcGljcmVmID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihsaW5rLCBtYi0+dywgbWItPmgpOworICAgIGlmICghcGljcmVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcGljcmVmLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpIHsxLCAxfTsKKyAgICBwaWNyZWYtPnB0cyA9IG1iLT5wdHMrKzsKKworICAgIGRyYXdfbWFuZGVsYnJvdChsaW5rLT5zcmMsICh1aW50MzJfdCopcGljcmVmLT5kYXRhWzBdLCBwaWNyZWYtPmxpbmVzaXplWzBdLzQsIHBpY3JlZi0+cHRzKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGxpbmssIHBpY3JlZik7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBtYW5kZWxicm90X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92c3JjX21hbmRlbGJyb3QgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAibWFuZGVsYnJvdCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVuZGVyIGEgTWFuZGVsYnJvdCBmcmFjdGFsLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKE1CQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmbWFuZGVsYnJvdF9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gTlVMTCwKKyAgICAub3V0cHV0cyAgICAgICA9IG1hbmRlbGJyb3Rfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIvdnNyY19tcHRlc3RzcmMuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci92c3JjX21wdGVzdHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDU3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdnNyY19tcHRlc3RzcmMuYwpAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1QIHRlc3Qgc291cmNlLCBwb3J0ZWQgZnJvbSBNUGxheWVyIGxpYm1wY29kZWNzL3ZmX3Rlc3QuYworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworI2RlZmluZSBXSURUSCA1MTIKKyNkZWZpbmUgSEVJR0hUIDUxMgorCitlbnVtIHRlc3RfdHlwZSB7CisgICAgVEVTVF9EQ19MVU1BLAorICAgIFRFU1RfRENfQ0hST01BLAorICAgIFRFU1RfRlJFUV9MVU1BLAorICAgIFRFU1RfRlJFUV9DSFJPTUEsCisgICAgVEVTVF9BTVBfTFVNQSwKKyAgICBURVNUX0FNUF9DSFJPTUEsCisgICAgVEVTVF9DQlAsCisgICAgVEVTVF9NViwKKyAgICBURVNUX1JJTkcxLAorICAgIFRFU1RfUklORzIsCisgICAgVEVTVF9BTEwsCisgICAgVEVTVF9OQgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgTVBUZXN0Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgQVZSYXRpb25hbCBmcmFtZV9yYXRlOworICAgIGludDY0X3QgcHRzLCBtYXhfcHRzLCBkdXJhdGlvbjsKKyAgICBpbnQgaHN1YiwgdnN1YjsKKyAgICBlbnVtIHRlc3RfdHlwZSB0ZXN0OworfSBNUFRlc3RDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihNUFRlc3RDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBtcHRlc3RzcmNfb3B0aW9uc1tdPSB7CisgICAgeyAicmF0ZSIsICAgICAic2V0IHZpZGVvIHJhdGUiLCAgICAgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInIiLCAgICAgICAgInNldCB2aWRlbyByYXRlIiwgICAgIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJkdXJhdGlvbiIsICJzZXQgdmlkZW8gZHVyYXRpb24iLCBPRkZTRVQoZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQgPSAtMX0sIC0xLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisgICAgeyAiZCIsICAgICAgICAic2V0IHZpZGVvIGR1cmF0aW9uIiwgT0ZGU0VUKGR1cmF0aW9uKSwgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gLTF9LCAtMSwgSU5UNjRfTUFYLCBGTEFHUyB9LAorCisgICAgeyAidGVzdCIsICJzZXQgdGVzdCB0byBwZXJmb3JtIiwgT0ZGU0VUKHRlc3QpLCAgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0PVRFU1RfQUxMfSwgMCwgSU5UX01BWCwgRkxBR1MsICJ0ZXN0IiB9LAorICAgIHsgInQiLCAgICAic2V0IHRlc3QgdG8gcGVyZm9ybSIsIE9GRlNFVCh0ZXN0KSwgIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2ND1URVNUX0FMTH0sIDAsIElOVF9NQVgsIEZMQUdTLCAidGVzdCIgfSwKKyAgICAgICAgeyAiZGNfbHVtYSIsICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVRFU1RfRENfTFVNQX0sICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInRlc3QiIH0sCisgICAgICAgIHsgImRjX2Nocm9tYSIsICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1URVNUX0RDX0NIUk9NQX0sICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJ0ZXN0IiB9LAorICAgICAgICB7ICJmcmVxX2x1bWEiLCAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9VEVTVF9GUkVRX0xVTUF9LCAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAidGVzdCIgfSwKKyAgICAgICAgeyAiZnJlcV9jaHJvbWEiLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVRFU1RfRlJFUV9DSFJPTUF9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInRlc3QiIH0sCisgICAgICAgIHsgImFtcF9sdW1hIiwgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1URVNUX0FNUF9MVU1BfSwgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJ0ZXN0IiB9LAorICAgICAgICB7ICJhbXBfY2hyb21hIiwgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9VEVTVF9BTVBfQ0hST01BfSwgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAidGVzdCIgfSwKKyAgICAgICAgeyAiY2JwIiwgICAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVRFU1RfQ0JQfSwgICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInRlc3QiIH0sCisgICAgICAgIHsgIm12IiwgICAgICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1URVNUX01WfSwgICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJ0ZXN0IiB9LAorICAgICAgICB7ICJyaW5nMSIsICAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9VEVTVF9SSU5HMX0sICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAidGVzdCIgfSwKKyAgICAgICAgeyAicmluZzIiLCAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVRFU1RfUklORzJ9LCAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInRlc3QiIH0sCisgICAgICAgIHsgImFsbCIsICAgICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1URVNUX0FMTH0sICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJ0ZXN0IiB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MobXB0ZXN0c3JjKTsKKworc3RhdGljIGRvdWJsZSBjWzY0XTsKKworc3RhdGljIHZvaWQgaW5pdF9pZGN0KHZvaWQpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBzID0gaSA9PSAwID8gc3FydCgwLjEyNSkgOiAwLjU7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgIGNbaSo4K2pdID0gcypjb3MoKE1fUEkvOC4wKSppKihqKzAuNSkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaWRjdCh1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsIGludCBzcmNbNjRdKQoreworICAgIGludCBpLCBqLCBrOworICAgIGRvdWJsZSB0bXBbNjRdOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgICAgICBkb3VibGUgc3VtID0gMC4wOworCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKQorICAgICAgICAgICAgICAgIHN1bSArPSBjW2sqOCtqXSAqIHNyY1s4Kmkra107CisKKyAgICAgICAgICAgIHRtcFs4Kmkral0gPSBzdW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBzdW0gPSAwLjA7CisKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgc3VtICs9IGNbayo4K2ldKnRtcFs4Kmsral07CisKKyAgICAgICAgICAgIGRzdFtkc3RfbGluZXNpemUqaSArIGpdID0gYXZfY2xpcCgoaW50KWZsb29yKHN1bSswLjUpLCAwLCAyNTUpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkcmF3X2RjKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwgaW50IGNvbG9yLCBpbnQgdywgaW50IGgpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgZHN0W3ggKyB5KmRzdF9saW5lc2l6ZV0gPSBjb2xvcjsKK30KKworc3RhdGljIHZvaWQgZHJhd19iYXNpcyh1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsIGludCBhbXAsIGludCBmcmVxLCBpbnQgZGMpCit7CisgICAgaW50IHNyY1s2NF07CisKKyAgICBtZW1zZXQoc3JjLCAwLCA2NCpzaXplb2YoaW50KSk7CisgICAgc3JjWzBdID0gZGM7CisgICAgaWYgKGFtcCkKKyAgICAgICAgc3JjW2ZyZXFdID0gYW1wOworICAgIGlkY3QoZHN0LCBkc3RfbGluZXNpemUsIHNyYyk7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfY2JwKHVpbnQ4X3QgKmRzdFszXSwgaW50IGRzdF9saW5lc2l6ZVszXSwgaW50IGNicCwgaW50IGFtcCwgaW50IGRjKQoreworICAgIGlmIChjYnAmMSkgIGRyYXdfYmFzaXMoZHN0WzBdICAgICAgICAgICAgICAgICAgICAsIGRzdF9saW5lc2l6ZVswXSwgYW1wLCAxLCBkYyk7CisgICAgaWYgKGNicCYyKSAgZHJhd19iYXNpcyhkc3RbMF0rOCAgICAgICAgICAgICAgICAgICwgZHN0X2xpbmVzaXplWzBdLCBhbXAsIDEsIGRjKTsKKyAgICBpZiAoY2JwJjQpICBkcmF3X2Jhc2lzKGRzdFswXSsgIDgqZHN0X2xpbmVzaXplWzBdLCBkc3RfbGluZXNpemVbMF0sIGFtcCwgMSwgZGMpOworICAgIGlmIChjYnAmOCkgIGRyYXdfYmFzaXMoZHN0WzBdKzgrOCpkc3RfbGluZXNpemVbMF0sIGRzdF9saW5lc2l6ZVswXSwgYW1wLCAxLCBkYyk7CisgICAgaWYgKGNicCYxNikgZHJhd19iYXNpcyhkc3RbMV0gICAgICAgICAgICAgICAgICAgICwgZHN0X2xpbmVzaXplWzFdLCBhbXAsIDEsIGRjKTsKKyAgICBpZiAoY2JwJjMyKSBkcmF3X2Jhc2lzKGRzdFsyXSAgICAgICAgICAgICAgICAgICAgLCBkc3RfbGluZXNpemVbMl0sIGFtcCwgMSwgZGMpOworfQorCitzdGF0aWMgdm9pZCBkY190ZXN0KHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwgaW50IHcsIGludCBoLCBpbnQgb2ZmKQoreworICAgIGNvbnN0IGludCBzdGVwID0gRkZNQVgoMjU2Lyh3KmgvMjU2KSwgMSk7CisgICAgaW50IHgsIHksIGNvbG9yID0gb2ZmOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkgKz0gMTYpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMTYpIHsKKyAgICAgICAgICAgIGRyYXdfZGMoZHN0ICsgeCArIHkqZHN0X2xpbmVzaXplLCBkc3RfbGluZXNpemUsIGNvbG9yLCA4LCA4KTsKKyAgICAgICAgICAgIGNvbG9yICs9IHN0ZXA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZyZXFfdGVzdCh1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsIGludCBvZmYpCit7CisgICAgaW50IHgsIHksIGZyZXEgPSAwOworCisgICAgZm9yICh5ID0gMDsgeSA8IDgqMTY7IHkgKz0gMTYpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDgqMTY7IHggKz0gMTYpIHsKKyAgICAgICAgICAgIGRyYXdfYmFzaXMoZHN0ICsgeCArIHkqZHN0X2xpbmVzaXplLCBkc3RfbGluZXNpemUsIDQqKDk2K29mZiksIGZyZXEsIDEyOCo4KTsKKyAgICAgICAgICAgIGZyZXErKzsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgYW1wX3Rlc3QodWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLCBpbnQgb2ZmKQoreworICAgIGludCB4LCB5LCBhbXAgPSBvZmY7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgMTYqMTY7IHkgKz0gMTYpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDE2KjE2OyB4ICs9IDE2KSB7CisgICAgICAgICAgICBkcmF3X2Jhc2lzKGRzdCArIHggKyB5KmRzdF9saW5lc2l6ZSwgZHN0X2xpbmVzaXplLCA0KmFtcCwgMSwgMTI4KjgpOworICAgICAgICAgICAgYW1wKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNicF90ZXN0KHVpbnQ4X3QgKmRzdFszXSwgaW50IGRzdF9saW5lc2l6ZVszXSwgaW50IG9mZikKK3sKKyAgICBpbnQgeCwgeSwgY2JwID0gMDsKKworICAgIGZvciAoeSA9IDA7IHkgPCAxNio4OyB5ICs9IDE2KSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNio4OyB4ICs9IDE2KSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QxWzNdOworICAgICAgICAgICAgZHN0MVswXSA9IGRzdFswXSArIHgqMiArIHkqMipkc3RfbGluZXNpemVbMF07CisgICAgICAgICAgICBkc3QxWzFdID0gZHN0WzFdICsgeCAgICsgeSogIGRzdF9saW5lc2l6ZVsxXTsKKyAgICAgICAgICAgIGRzdDFbMl0gPSBkc3RbMl0gKyB4ICAgKyB5KiAgZHN0X2xpbmVzaXplWzJdOworCisgICAgICAgICAgICBkcmF3X2NicChkc3QxLCBkc3RfbGluZXNpemUsIGNicCwgKDY0K29mZikqNCwgMTI4KjgpOworICAgICAgICAgICAgY2JwKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG12X3Rlc3QodWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLCBpbnQgb2ZmKQoreworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDE2KjE2OyB5KyspIHsKKyAgICAgICAgaWYgKHkmMTYpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDE2KjE2OyB4KyspCisgICAgICAgICAgICBkc3RbeCArIHkqZHN0X2xpbmVzaXplXSA9IHggKyBvZmYqOC8oeS8zMisxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJpbmcxX3Rlc3QodWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLCBpbnQgb2ZmKQoreworICAgIGludCB4LCB5LCBjb2xvciA9IDA7CisKKyAgICBmb3IgKHkgPSBvZmY7IHkgPCAxNioxNjsgeSArPSAxNikgeworICAgICAgICBmb3IgKHggPSBvZmY7IHggPCAxNioxNjsgeCArPSAxNikgeworICAgICAgICAgICAgZHJhd19kYyhkc3QgKyB4ICsgeSpkc3RfbGluZXNpemUsIGRzdF9saW5lc2l6ZSwgKCh4K3kpJjE2KSA/IGNvbG9yIDogLWNvbG9yLCAxNiwgMTYpOworICAgICAgICAgICAgY29sb3IrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcmluZzJfdGVzdCh1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsIGludCBvZmYpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgMTYqMTY7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTYqMTY7IHgrKykgeworICAgICAgICAgICAgZG91YmxlIGQgPSBzcXJ0KCh4LTgqMTYpKih4LTgqMTYpICsgKHktOCoxNikqKHktOCoxNikpOworICAgICAgICAgICAgZG91YmxlIHIgPSBkLzIwIC0gKGludCkoZC8yMCk7CisgICAgICAgICAgICBpZiAociA8IG9mZi8zMC4wKSB7CisgICAgICAgICAgICAgICAgZHN0W3ggKyB5KmRzdF9saW5lc2l6ZV0gICAgID0gMjU1OworICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpkc3RfbGluZXNpemUrMjU2XSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpkc3RfbGluZXNpemVdICAgICA9IHg7CisgICAgICAgICAgICAgICAgZHN0W3ggKyB5KmRzdF9saW5lc2l6ZSsyNTZdID0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTVBUZXN0Q29udGV4dCAqdGVzdCA9IGN0eC0+cHJpdjsKKworICAgIHRlc3QtPm1heF9wdHMgPSB0ZXN0LT5kdXJhdGlvbiA+PSAwID8KKyAgICAgICAgYXZfcmVzY2FsZV9xKHRlc3QtPmR1cmF0aW9uLCBBVl9USU1FX0JBU0VfUSwgYXZfaW52X3EodGVzdC0+ZnJhbWVfcmF0ZSkpIDogLTE7CisgICAgdGVzdC0+cHRzID0gMDsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAicmF0ZTolZC8lZCBkdXJhdGlvbjolZlxuIiwKKyAgICAgICAgICAgdGVzdC0+ZnJhbWVfcmF0ZS5udW0sIHRlc3QtPmZyYW1lX3JhdGUuZGVuLAorICAgICAgICAgICB0ZXN0LT5kdXJhdGlvbiA8IDAgPyAtMSA6IHRlc3QtPm1heF9wdHMgKiBhdl9xMmQoYXZfaW52X3EodGVzdC0+ZnJhbWVfcmF0ZSkpKTsKKyAgICBpbml0X2lkY3QoKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgTVBUZXN0Q29udGV4dCAqdGVzdCA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChvdXRsaW5rLT5mb3JtYXQpOworCisgICAgdGVzdC0+aHN1YiA9IHBpeF9kZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHRlc3QtPnZzdWIgPSBwaXhfZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIG91dGxpbmstPncgPSBXSURUSDsKKyAgICBvdXRsaW5rLT5oID0gSEVJR0hUOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IGF2X2ludl9xKHRlc3QtPmZyYW1lX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBNUFRlc3RDb250ZXh0ICp0ZXN0ID0gb3V0bGluay0+c3JjLT5wcml2OworICAgIEFWRnJhbWUgKnBpY3JlZjsKKyAgICBpbnQgdyA9IFdJRFRILCBoID0gSEVJR0hULAorICAgICAgICBjdyA9IEZGX0NFSUxfUlNISUZUKHcsIHRlc3QtPmhzdWIpLCBjaCA9IEZGX0NFSUxfUlNISUZUKGgsIHRlc3QtPnZzdWIpOworICAgIHVuc2lnbmVkIGludCBmcmFtZSA9IG91dGxpbmstPmZyYW1lX2NvdW50OworICAgIGVudW0gdGVzdF90eXBlIHR0ID0gdGVzdC0+dGVzdDsKKyAgICBpbnQgaTsKKworICAgIGlmICh0ZXN0LT5tYXhfcHRzID49IDAgJiYgdGVzdC0+cHRzID4gdGVzdC0+bWF4X3B0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIHBpY3JlZiA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgdywgaCk7CisgICAgaWYgKCFwaWNyZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcGljcmVmLT5wdHMgPSB0ZXN0LT5wdHMrKzsKKworICAgIC8vIGNsZWFuIGltYWdlCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykKKyAgICAgICAgbWVtc2V0KHBpY3JlZi0+ZGF0YVswXSArIGkqcGljcmVmLT5saW5lc2l6ZVswXSwgMCwgdyk7CisgICAgZm9yIChpID0gMDsgaSA8IGNoOyBpKyspIHsKKyAgICAgICAgbWVtc2V0KHBpY3JlZi0+ZGF0YVsxXSArIGkqcGljcmVmLT5saW5lc2l6ZVsxXSwgMTI4LCBjdyk7CisgICAgICAgIG1lbXNldChwaWNyZWYtPmRhdGFbMl0gKyBpKnBpY3JlZi0+bGluZXNpemVbMl0sIDEyOCwgY3cpOworICAgIH0KKworICAgIGlmICh0dCA9PSBURVNUX0FMTCAmJiBmcmFtZSUzMCkgLyogZHJhdyBhIGJsYWNrIGZyYW1lIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCB0ZXN0ICovCisgICAgICAgIHR0ID0gKGZyYW1lLzMwKSUoVEVTVF9OQi0xKTsKKworICAgIHN3aXRjaCAodHQpIHsKKyAgICBjYXNlIFRFU1RfRENfTFVNQTogICAgICAgZGNfdGVzdChwaWNyZWYtPmRhdGFbMF0sIHBpY3JlZi0+bGluZXNpemVbMF0sIDI1NiwgMjU2LCBmcmFtZSUzMCk7IGJyZWFrOworICAgIGNhc2UgVEVTVF9EQ19DSFJPTUE6ICAgICBkY190ZXN0KHBpY3JlZi0+ZGF0YVsxXSwgcGljcmVmLT5saW5lc2l6ZVsxXSwgMjU2LCAyNTYsIGZyYW1lJTMwKTsgYnJlYWs7CisgICAgY2FzZSBURVNUX0ZSRVFfTFVNQTogICBmcmVxX3Rlc3QocGljcmVmLT5kYXRhWzBdLCBwaWNyZWYtPmxpbmVzaXplWzBdLCBmcmFtZSUzMCk7IGJyZWFrOworICAgIGNhc2UgVEVTVF9GUkVRX0NIUk9NQTogZnJlcV90ZXN0KHBpY3JlZi0+ZGF0YVsxXSwgcGljcmVmLT5saW5lc2l6ZVsxXSwgZnJhbWUlMzApOyBicmVhazsKKyAgICBjYXNlIFRFU1RfQU1QX0xVTUE6ICAgICBhbXBfdGVzdChwaWNyZWYtPmRhdGFbMF0sIHBpY3JlZi0+bGluZXNpemVbMF0sIGZyYW1lJTMwKTsgYnJlYWs7CisgICAgY2FzZSBURVNUX0FNUF9DSFJPTUE6ICAgYW1wX3Rlc3QocGljcmVmLT5kYXRhWzFdLCBwaWNyZWYtPmxpbmVzaXplWzFdLCBmcmFtZSUzMCk7IGJyZWFrOworICAgIGNhc2UgVEVTVF9DQlA6ICAgICAgICAgIGNicF90ZXN0KHBpY3JlZi0+ZGF0YSAgICwgcGljcmVmLT5saW5lc2l6ZSAgICwgZnJhbWUlMzApOyBicmVhazsKKyAgICBjYXNlIFRFU1RfTVY6ICAgICAgICAgICAgbXZfdGVzdChwaWNyZWYtPmRhdGFbMF0sIHBpY3JlZi0+bGluZXNpemVbMF0sIGZyYW1lJTMwKTsgYnJlYWs7CisgICAgY2FzZSBURVNUX1JJTkcxOiAgICAgIHJpbmcxX3Rlc3QocGljcmVmLT5kYXRhWzBdLCBwaWNyZWYtPmxpbmVzaXplWzBdLCBmcmFtZSUzMCk7IGJyZWFrOworICAgIGNhc2UgVEVTVF9SSU5HMjogICAgICByaW5nMl90ZXN0KHBpY3JlZi0+ZGF0YVswXSwgcGljcmVmLT5saW5lc2l6ZVswXSwgZnJhbWUlMzApOyBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIHBpY3JlZik7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBtcHRlc3RzcmNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZzcmNfbXB0ZXN0c3JjID0geworICAgIC5uYW1lICAgICAgICAgID0gIm1wdGVzdHNyYyIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR2VuZXJhdGUgdmFyaW91cyB0ZXN0IHBhdHRlcm4uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTVBUZXN0Q29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmbXB0ZXN0c3JjX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgID0gbXB0ZXN0c3JjX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZzcmNfdGVzdHNyYy5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3ZzcmNfdGVzdHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTQ0NDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIvdnNyY190ZXN0c3JjLmMKQEAgLTAsMCArMSwxMDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IE5pY29sYXMgR2VvcmdlIDxuaWNvbGFzLmdlb3JnZUBub3JtYWxlc3VwLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBTdGVmYW5vIFNhYmF0aW5pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1pc2MgdGVzdCBzb3VyY2VzLgorICoKKyAqIHRlc3RzcmMgaXMgYmFzZWQgb24gdGhlIHRlc3QgcGF0dGVybiBnZW5lcmF0b3IgZGVtdXhlciBieSBOaWNvbGFzIEdlb3JnZToKKyAqIGh0dHA6Ly9saXN0cy5mZm1wZWcub3JnL3BpcGVybWFpbC9mZm1wZWctZGV2ZWwvMjAwNy1PY3RvYmVyLzAzNzg0NS5odG1sCisgKgorICogcmdidGVzdHNyYyBpcyBwb3J0ZWQgZnJvbSBNUGxheWVyIGxpYm1wY29kZWNzL3ZmX3JnYnRlc3QuYyBieQorICogTWljaGFlbCBOaWVkZXJtYXllci4KKyAqCisgKiBzbXB0ZWJhcnMgYW5kIHNtcHRlaGRiYXJzIGFyZSBieSBQYXVsIEIgTWFob2wuCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgVGVzdFNvdXJjZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCB3LCBoOworICAgIHVuc2lnbmVkIGludCBuYl9mcmFtZTsKKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZSwgZnJhbWVfcmF0ZTsKKyAgICBpbnQ2NF90IHB0czsKKyAgICBpbnQ2NF90IGR1cmF0aW9uOyAgICAgICAgICAgLy8vPCBkdXJhdGlvbiBleHByZXNzZWQgaW4gbWljcm9zZWNvbmRzCisgICAgQVZSYXRpb25hbCBzYXI7ICAgICAgICAgICAgIC8vLzwgc2FtcGxlIGFzcGVjdCByYXRpbworICAgIGludCBkcmF3X29uY2U7ICAgICAgICAgICAgICAvLy88IGRyYXcgb25seSB0aGUgZmlyc3QgZnJhbWUsIGFsd2F5cyBwdXQgb3V0IHRoZSBzYW1lIHBpY3R1cmUKKyAgICBpbnQgZHJhd19vbmNlX3Jlc2V0OyAgICAgICAgLy8vPCBkcmF3IG9ubHkgdGhlIGZpcnN0IGZyYW1lIG9yIGluIGNhc2Ugb2YgcmVzZXQKKyAgICBBVkZyYW1lICpwaWNyZWY7ICAgICAgICAgICAgLy8vPCBjYWNoZWQgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIHBhaW50ZWQgcGljdHVyZQorCisgICAgdm9pZCAoKiBmaWxsX3BpY3R1cmVfZm4pKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSk7CisKKyAgICAvKiBvbmx5IHVzZWQgYnkgdGVzdHNyYyAqLworICAgIGludCBuYl9kZWNpbWFsczsKKworICAgIC8qIG9ubHkgdXNlZCBieSBjb2xvciAqLworICAgIEZGRHJhd0NvbnRleHQgZHJhdzsKKyAgICBGRkRyYXdDb2xvciBjb2xvcjsKKyAgICB1aW50OF90IGNvbG9yX3JnYmFbNF07CisKKyAgICAvKiBvbmx5IHVzZWQgYnkgcmdidGVzdCAqLworICAgIHVpbnQ4X3QgcmdiYV9tYXBbNF07CisKKyAgICAvKiBvbmx5IHVzZWQgYnkgaGFsZGNsdXQgKi8KKyAgICBpbnQgbGV2ZWw7Cit9IFRlc3RTb3VyY2VDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihUZXN0U291cmNlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKKyNkZWZpbmUgU0laRV9PUFRJT05TIFwKKyAgICB7ICJzaXplIiwgICAgICJzZXQgdmlkZW8gc2l6ZSIsICAgICBPRkZTRVQodyksICAgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9ICIzMjB4MjQwIn0sIDAsIDAsIEZMQUdTIH0sXAorICAgIHsgInMiLCAgICAgICAgInNldCB2aWRlbyBzaXplIiwgICAgIE9GRlNFVCh3KSwgICAgICAgIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyID0gIjMyMHgyNDAifSwgMCwgMCwgRkxBR1MgfSxcCisKKyNkZWZpbmUgQ09NTU9OX09QVElPTlNfTk9TSVpFIFwKKyAgICB7ICJyYXRlIiwgICAgICJzZXQgdmlkZW8gcmF0ZSIsICAgICBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIDAsIEZMQUdTIH0sXAorICAgIHsgInIiLCAgICAgICAgInNldCB2aWRlbyByYXRlIiwgICAgIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgRkxBR1MgfSxcCisgICAgeyAiZHVyYXRpb24iLCAic2V0IHZpZGVvIGR1cmF0aW9uIiwgT0ZGU0VUKGR1cmF0aW9uKSwgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gLTF9LCAtMSwgSU5UNjRfTUFYLCBGTEFHUyB9LFwKKyAgICB7ICJkIiwgICAgICAgICJzZXQgdmlkZW8gZHVyYXRpb24iLCBPRkZTRVQoZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQgPSAtMX0sIC0xLCBJTlQ2NF9NQVgsIEZMQUdTIH0sXAorICAgIHsgInNhciIsICAgICAgInNldCB2aWRlbyBzYW1wbGUgYXNwZWN0IHJhdGlvIiwgT0ZGU0VUKHNhciksIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7LmRibD0gMX0sICAwLCBJTlRfTUFYLCBGTEFHUyB9LAorCisjZGVmaW5lIENPTU1PTl9PUFRJT05TIFNJWkVfT1BUSU9OUyBDT01NT05fT1BUSU9OU19OT1NJWkUKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICBDT01NT05fT1BUSU9OUworICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBUZXN0U291cmNlQ29udGV4dCAqdGVzdCA9IGN0eC0+cHJpdjsKKworICAgIHRlc3QtPnRpbWVfYmFzZSA9IGF2X2ludl9xKHRlc3QtPmZyYW1lX3JhdGUpOworICAgIHRlc3QtPm5iX2ZyYW1lID0gMDsKKyAgICB0ZXN0LT5wdHMgPSAwOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJzaXplOiVkeCVkIHJhdGU6JWQvJWQgZHVyYXRpb246JWYgc2FyOiVkLyVkXG4iLAorICAgICAgICAgICB0ZXN0LT53LCB0ZXN0LT5oLCB0ZXN0LT5mcmFtZV9yYXRlLm51bSwgdGVzdC0+ZnJhbWVfcmF0ZS5kZW4sCisgICAgICAgICAgIHRlc3QtPmR1cmF0aW9uIDwgMCA/IC0xIDogKGRvdWJsZSl0ZXN0LT5kdXJhdGlvbi8xMDAwMDAwLAorICAgICAgICAgICB0ZXN0LT5zYXIubnVtLCB0ZXN0LT5zYXIuZGVuKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVGVzdFNvdXJjZUNvbnRleHQgKnRlc3QgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZ0ZXN0LT5waWNyZWYpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgVGVzdFNvdXJjZUNvbnRleHQgKnRlc3QgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisKKyAgICBvdXRsaW5rLT53ID0gdGVzdC0+dzsKKyAgICBvdXRsaW5rLT5oID0gdGVzdC0+aDsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gdGVzdC0+c2FyOworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSB0ZXN0LT5mcmFtZV9yYXRlOworICAgIG91dGxpbmstPnRpbWVfYmFzZSAgPSB0ZXN0LT50aW1lX2Jhc2U7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBUZXN0U291cmNlQ29udGV4dCAqdGVzdCA9IG91dGxpbmstPnNyYy0+cHJpdjsKKyAgICBBVkZyYW1lICpmcmFtZTsKKworICAgIGlmICh0ZXN0LT5kdXJhdGlvbiA+PSAwICYmCisgICAgICAgIGF2X3Jlc2NhbGVfcSh0ZXN0LT5wdHMsIHRlc3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpID49IHRlc3QtPmR1cmF0aW9uKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBpZiAodGVzdC0+ZHJhd19vbmNlKSB7CisgICAgICAgIGlmICh0ZXN0LT5kcmF3X29uY2VfcmVzZXQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnRlc3QtPnBpY3JlZik7CisgICAgICAgICAgICB0ZXN0LT5kcmF3X29uY2VfcmVzZXQgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICghdGVzdC0+cGljcmVmKSB7CisgICAgICAgICAgICB0ZXN0LT5waWNyZWYgPQorICAgICAgICAgICAgICAgIGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgdGVzdC0+dywgdGVzdC0+aCk7CisgICAgICAgICAgICBpZiAoIXRlc3QtPnBpY3JlZikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgdGVzdC0+ZmlsbF9waWN0dXJlX2ZuKG91dGxpbmstPnNyYywgdGVzdC0+cGljcmVmKTsKKyAgICAgICAgfQorICAgICAgICBmcmFtZSA9IGF2X2ZyYW1lX2Nsb25lKHRlc3QtPnBpY3JlZik7CisgICAgfSBlbHNlCisgICAgICAgIGZyYW1lID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCB0ZXN0LT53LCB0ZXN0LT5oKTsKKworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZnJhbWUtPnB0cyAgICAgICAgICAgICAgICAgPSB0ZXN0LT5wdHM7CisgICAgZnJhbWUtPmtleV9mcmFtZSAgICAgICAgICAgPSAxOworICAgIGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lICAgID0gMDsKKyAgICBmcmFtZS0+cGljdF90eXBlICAgICAgICAgICA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gdGVzdC0+c2FyOworICAgIGlmICghdGVzdC0+ZHJhd19vbmNlKQorICAgICAgICB0ZXN0LT5maWxsX3BpY3R1cmVfZm4ob3V0bGluay0+c3JjLCBmcmFtZSk7CisKKyAgICB0ZXN0LT5wdHMrKzsKKyAgICB0ZXN0LT5uYl9mcmFtZSsrOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7Cit9CisKKyNpZiBDT05GSUdfQ09MT1JfRklMVEVSCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjb2xvcl9vcHRpb25zW10gPSB7CisgICAgeyAiY29sb3IiLCAic2V0IGNvbG9yIiwgT0ZGU0VUKGNvbG9yX3JnYmEpLCBBVl9PUFRfVFlQRV9DT0xPUiwgey5zdHIgPSAiYmxhY2sifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImMiLCAgICAgInNldCBjb2xvciIsIE9GRlNFVChjb2xvcl9yZ2JhKSwgQVZfT1BUX1RZUEVfQ09MT1IsIHsuc3RyID0gImJsYWNrIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICBDT01NT05fT1BUSU9OUworICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoY29sb3IpOworCitzdGF0aWMgdm9pZCBjb2xvcl9maWxsX3BpY3R1cmUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKnBpY3JlZikKK3sKKyAgICBUZXN0U291cmNlQ29udGV4dCAqdGVzdCA9IGN0eC0+cHJpdjsKKyAgICBmZl9maWxsX3JlY3RhbmdsZSgmdGVzdC0+ZHJhdywgJnRlc3QtPmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgIHBpY3JlZi0+ZGF0YSwgcGljcmVmLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAwLCB0ZXN0LT53LCB0ZXN0LT5oKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGNvbG9yX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVGVzdFNvdXJjZUNvbnRleHQgKnRlc3QgPSBjdHgtPnByaXY7CisgICAgdGVzdC0+ZmlsbF9waWN0dXJlX2ZuID0gY29sb3JfZmlsbF9waWN0dXJlOworICAgIHRlc3QtPmRyYXdfb25jZSA9IDE7CisgICAgcmV0dXJuIGluaXQoY3R4KTsKK30KKworc3RhdGljIGludCBjb2xvcl9xdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX2RyYXdfc3VwcG9ydGVkX3BpeGVsX2Zvcm1hdHMoMCkpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbG9yX2NvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+c3JjOworICAgIFRlc3RTb3VyY2VDb250ZXh0ICp0ZXN0ID0gY3R4LT5wcml2OworICAgIGludCByZXQ7CisKKyAgICBmZl9kcmF3X2luaXQoJnRlc3QtPmRyYXcsIGlubGluay0+Zm9ybWF0LCAwKTsKKyAgICBmZl9kcmF3X2NvbG9yKCZ0ZXN0LT5kcmF3LCAmdGVzdC0+Y29sb3IsIHRlc3QtPmNvbG9yX3JnYmEpOworCisgICAgdGVzdC0+dyA9IGZmX2RyYXdfcm91bmRfdG9fc3ViKCZ0ZXN0LT5kcmF3LCAwLCAtMSwgdGVzdC0+dyk7CisgICAgdGVzdC0+aCA9IGZmX2RyYXdfcm91bmRfdG9fc3ViKCZ0ZXN0LT5kcmF3LCAxLCAtMSwgdGVzdC0+aCk7CisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUodGVzdC0+dywgdGVzdC0+aCwgMCwgY3R4KSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoKHJldCA9IGNvbmZpZ19wcm9wcyhpbmxpbmspKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb2xvcl9wcm9jZXNzX2NvbW1hbmQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmNtZCwgY29uc3QgY2hhciAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnJlcywgaW50IHJlc19sZW4sIGludCBmbGFncykKK3sKKyAgICBUZXN0U291cmNlQ29udGV4dCAqdGVzdCA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFzdHJjbXAoY21kLCAiY29sb3IiKSB8fCAhc3RyY21wKGNtZCwgImMiKSkgeworICAgICAgICB1aW50OF90IGNvbG9yX3JnYmFbNF07CisKKyAgICAgICAgcmV0ID0gYXZfcGFyc2VfY29sb3IoY29sb3JfcmdiYSwgYXJncywgLTEsIGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBtZW1jcHkodGVzdC0+Y29sb3JfcmdiYSwgY29sb3JfcmdiYSwgc2l6ZW9mKGNvbG9yX3JnYmEpKTsKKyAgICAgICAgZmZfZHJhd19jb2xvcigmdGVzdC0+ZHJhdywgJnRlc3QtPmNvbG9yLCB0ZXN0LT5jb2xvcl9yZ2JhKTsKKyAgICAgICAgdGVzdC0+ZHJhd19vbmNlX3Jlc2V0ID0gMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGNvbG9yX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbG9yX2NvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgIE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdnNyY19jb2xvciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgID0gImNvbG9yIiwKKyAgICAuZGVzY3JpcHRpb24gICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlByb3ZpZGUgYW4gdW5pZm9ybWx5IGNvbG9yZWQgaW5wdXQuIiksCisgICAgLnByaXZfY2xhc3MgICAgICA9ICZjb2xvcl9jbGFzcywKKyAgICAucHJpdl9zaXplICAgICAgID0gc2l6ZW9mKFRlc3RTb3VyY2VDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgID0gY29sb3JfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzICAgPSBjb2xvcl9xdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgICAgPSBjb2xvcl9vdXRwdXRzLAorICAgIC5wcm9jZXNzX2NvbW1hbmQgPSBjb2xvcl9wcm9jZXNzX2NvbW1hbmQsCit9OworCisjZW5kaWYgLyogQ09ORklHX0NPTE9SX0ZJTFRFUiAqLworCisjaWYgQ09ORklHX0hBTERDTFVUU1JDX0ZJTFRFUgorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaGFsZGNsdXRzcmNfb3B0aW9uc1tdID0geworICAgIHsgImxldmVsIiwgInNldCBsZXZlbCIsIE9GRlNFVChsZXZlbCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA2fSwgMiwgOCwgRkxBR1MgfSwKKyAgICBDT01NT05fT1BUSU9OU19OT1NJWkUKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGhhbGRjbHV0c3JjKTsKKworc3RhdGljIHZvaWQgaGFsZGNsdXRzcmNfZmlsbF9waWN0dXJlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgaSwgaiwgaywgeCA9IDAsIHkgPSAwLCBpczE2Yml0ID0gMCwgc3RlcDsKKyAgICB1aW50MzJfdCBhbHBoYSA9IDA7CisgICAgY29uc3QgVGVzdFNvdXJjZUNvbnRleHQgKmhjID0gY3R4LT5wcml2OworICAgIGludCBsZXZlbCA9IGhjLT5sZXZlbDsKKyAgICBmbG9hdCBzY2FsZTsKKyAgICBjb25zdCBpbnQgdyA9IGZyYW1lLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaCA9IGZyYW1lLT5oZWlnaHQ7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGZyYW1lLT5kYXRhWzBdOworICAgIGNvbnN0IGludCBsaW5lc2l6ZSAgPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChmcmFtZS0+Zm9ybWF0KTsKKyAgICB1aW50OF90IHJnYmFfbWFwWzRdOworCisgICAgYXZfYXNzZXJ0MCh3ID09IGggJiYgdyA9PSBsZXZlbCpsZXZlbCpsZXZlbCk7CisKKyAgICBmZl9maWxsX3JnYmFfbWFwKHJnYmFfbWFwLCBmcmFtZS0+Zm9ybWF0KTsKKworICAgIHN3aXRjaCAoZnJhbWUtPmZvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0ODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDg6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQTY0OgorICAgICAgICBpczE2Yml0ID0gMTsKKyAgICAgICAgYWxwaGEgPSAweGZmZmY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBOgorICAgIGNhc2UgQVZfUElYX0ZNVF9BUkdCOgorICAgIGNhc2UgQVZfUElYX0ZNVF9BQkdSOgorICAgICAgICBhbHBoYSA9IDB4ZmY7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0ZXAgID0gYXZfZ2V0X3BhZGRlZF9iaXRzX3Blcl9waXhlbChkZXNjKSA+PiAoMyArIGlzMTZiaXQpOworICAgIHNjYWxlID0gKChmbG9hdCkoMSA8PCAoOCooaXMxNmJpdCsxKSkpIC0gMSkgLyAobGV2ZWwqbGV2ZWwgLSAxKTsKKworI2RlZmluZSBMT0FEX0NMVVQobmJpdHMpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludCMjbmJpdHMjI190ICpkc3QgPSAoKHVpbnQjI25iaXRzIyNfdCAqKShkYXRhICsgeSpsaW5lc2l6ZSkpICsgeCpzdGVwOyAgIFwKKyAgICBkc3RbcmdiYV9tYXBbMF1dID0gYXZfY2xpcF91aW50IyNuYml0cyhpICogc2NhbGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtyZ2JhX21hcFsxXV0gPSBhdl9jbGlwX3VpbnQjI25iaXRzKGogKiBzY2FsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W3JnYmFfbWFwWzJdXSA9IGF2X2NsaXBfdWludCMjbmJpdHMoayAqIHNjYWxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3RlcCA9PSA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbcmdiYV9tYXBbM11dID0gYWxwaGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgbGV2ZWwgKj0gbGV2ZWw7CisgICAgZm9yIChrID0gMDsgayA8IGxldmVsOyBrKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGxldmVsOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpczE2Yml0KQorICAgICAgICAgICAgICAgICAgICBMT0FEX0NMVVQoOCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBMT0FEX0NMVVQoMTYpOworICAgICAgICAgICAgICAgIGlmICgrK3ggPT0gdykgeworICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgeSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGhhbGRjbHV0c3JjX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVGVzdFNvdXJjZUNvbnRleHQgKmhjID0gY3R4LT5wcml2OworICAgIGhjLT5maWxsX3BpY3R1cmVfZm4gPSBoYWxkY2x1dHNyY19maWxsX3BpY3R1cmU7CisgICAgaGMtPmRyYXdfb25jZSA9IDE7CisgICAgcmV0dXJuIGluaXQoY3R4KTsKK30KKworc3RhdGljIGludCBoYWxkY2x1dHNyY19xdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgIEFWX1BJWF9GTVRfQkdSMjQsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQSwgICBBVl9QSVhfRk1UX0JHUkEsCisgICAgICAgIEFWX1BJWF9GTVRfQVJHQiwgICBBVl9QSVhfRk1UX0FCR1IsCisgICAgICAgIEFWX1BJWF9GTVRfMFJHQiwgICBBVl9QSVhfRk1UXzBCR1IsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCMCwgICBBVl9QSVhfRk1UX0JHUjAsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCNDgsICBBVl9QSVhfRk1UX0JHUjQ4LAorICAgICAgICBBVl9QSVhfRk1UX1JHQkE2NCwgQVZfUElYX0ZNVF9CR1JBNjQsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9OworICAgIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYWxkY2x1dHNyY19jb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIFRlc3RTb3VyY2VDb250ZXh0ICpoYyA9IGN0eC0+cHJpdjsKKworICAgIGhjLT53ID0gaGMtPmggPSBoYy0+bGV2ZWwgKiBoYy0+bGV2ZWwgKiBoYy0+bGV2ZWw7CisgICAgcmV0dXJuIGNvbmZpZ19wcm9wcyhvdXRsaW5rKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGhhbGRjbHV0c3JjX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGhhbGRjbHV0c3JjX2NvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgIE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdnNyY19oYWxkY2x1dHNyYyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJoYWxkY2x1dHNyYyIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUHJvdmlkZSBhbiBpZGVudGl0eSBIYWxkIENMVVQuIiksCisgICAgLnByaXZfY2xhc3MgICAgPSAmaGFsZGNsdXRzcmNfY2xhc3MsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoVGVzdFNvdXJjZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgID0gaGFsZGNsdXRzcmNfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IGhhbGRjbHV0c3JjX3F1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgID0gaGFsZGNsdXRzcmNfb3V0cHV0cywKK307CisjZW5kaWYgLyogQ09ORklHX0hBTERDTFVUU1JDX0ZJTFRFUiAqLworCisjaWYgQ09ORklHX05VTExTUkNfRklMVEVSCisKKyNkZWZpbmUgbnVsbHNyY19vcHRpb25zIG9wdGlvbnMKK0FWRklMVEVSX0RFRklORV9DTEFTUyhudWxsc3JjKTsKKworc3RhdGljIHZvaWQgbnVsbHNyY19maWxsX3BpY3R1cmUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKnBpY3JlZikgeyB9CisKK3N0YXRpYyBhdl9jb2xkIGludCBudWxsc3JjX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVGVzdFNvdXJjZUNvbnRleHQgKnRlc3QgPSBjdHgtPnByaXY7CisKKyAgICB0ZXN0LT5maWxsX3BpY3R1cmVfZm4gPSBudWxsc3JjX2ZpbGxfcGljdHVyZTsKKyAgICByZXR1cm4gaW5pdChjdHgpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbnVsbHNyY19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK0FWRmlsdGVyIGZmX3ZzcmNfbnVsbHNyYyA9IHsKKyAgICAubmFtZSAgICAgICAgPSAibnVsbHNyYyIsCisgICAgLmRlc2NyaXB0aW9uID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk51bGwgdmlkZW8gc291cmNlLCByZXR1cm4gdW5wcm9jZXNzZWQgdmlkZW8gZnJhbWVzLiIpLAorICAgIC5pbml0ICAgICAgICA9IG51bGxzcmNfaW5pdCwKKyAgICAudW5pbml0ICAgICAgPSB1bmluaXQsCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFRlc3RTb3VyY2VDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgPSAmbnVsbHNyY19jbGFzcywKKyAgICAuaW5wdXRzICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICA9IG51bGxzcmNfb3V0cHV0cywKK307CisKKyNlbmRpZiAvKiBDT05GSUdfTlVMTFNSQ19GSUxURVIgKi8KKworI2lmIENPTkZJR19URVNUU1JDX0ZJTFRFUgorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdGVzdHNyY19vcHRpb25zW10gPSB7CisgICAgQ09NTU9OX09QVElPTlMKKyAgICB7ICJkZWNpbWFscyIsICJzZXQgbnVtYmVyIG9mIGRlY2ltYWxzIHRvIHNob3ciLCBPRkZTRVQobmJfZGVjaW1hbHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAgMCwgMTcsIEZMQUdTIH0sCisgICAgeyAibiIsICAgICAgICAic2V0IG51bWJlciBvZiBkZWNpbWFscyB0byBzaG93IiwgT0ZGU0VUKG5iX2RlY2ltYWxzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgIDAsIDE3LCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1ModGVzdHNyYyk7CisKKy8qKgorICogRmlsbCBhIHJlY3RhbmdsZSB3aXRoIHZhbHVlIHZhbC4KKyAqCisgKiBAcGFyYW0gdmFsIHRoZSBSR0IgdmFsdWUgdG8gc2V0CisgKiBAcGFyYW0gZHN0IHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byBmaWxsCisgKiBAcGFyYW0gZHN0X2xpbmVzaXplIGxpbmVzaXplIG9mIGRlc3RpbmF0aW9uCisgKiBAcGFyYW0gc2VnbWVudF93aWR0aCB3aWR0aCBvZiB0aGUgc2VnbWVudAorICogQHBhcmFtIHggaG9yaXpvbnRhbCBjb29yZGluYXRlIHdoZXJlIHRvIGRyYXcgdGhlIHJlY3RhbmdsZSBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW0geSBob3Jpem9udGFsIGNvb3JkaW5hdGUgd2hlcmUgdG8gZHJhdyB0aGUgcmVjdGFuZ2xlIGluIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBwYXJhbSB3IHdpZHRoICBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRyYXcsIGV4cHJlc3NlZCBhcyBhIG51bWJlciBvZiBzZWdtZW50X3dpZHRoIHVuaXRzCisgKiBAcGFyYW0gaCBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0byBkcmF3LCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2Ygc2VnbWVudF93aWR0aCB1bml0cworICovCitzdGF0aWMgdm9pZCBkcmF3X3JlY3RhbmdsZSh1bnNpZ25lZCB2YWwsIHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwgaW50IHNlZ21lbnRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgc3RlcCA9IDM7CisKKyAgICBkc3QgKz0gc2VnbWVudF93aWR0aCAqIChzdGVwICogeCArIHkgKiBkc3RfbGluZXNpemUpOworICAgIHcgKj0gc2VnbWVudF93aWR0aCAqIHN0ZXA7CisgICAgaCAqPSBzZWdtZW50X3dpZHRoOworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgbWVtc2V0KGRzdCwgdmFsLCB3KTsKKyAgICAgICAgZHN0ICs9IGRzdF9saW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfZGlnaXQoaW50IGRpZ2l0LCB1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWdtZW50X3dpZHRoKQoreworI2RlZmluZSBUT1BfSEJBUiAgICAgICAgMQorI2RlZmluZSBNSURfSEJBUiAgICAgICAgMgorI2RlZmluZSBCT1RfSEJBUiAgICAgICAgNAorI2RlZmluZSBMRUZUX1RPUF9WQkFSICAgOAorI2RlZmluZSBMRUZUX0JPVF9WQkFSICAxNgorI2RlZmluZSBSSUdIVF9UT1BfVkJBUiAzMgorI2RlZmluZSBSSUdIVF9CT1RfVkJBUiA2NAorICAgIHN0cnVjdCBzZWdtZW50cyB7CisgICAgICAgIGludCB4LCB5LCB3LCBoOworICAgIH0gc2VnbWVudHNbXSA9IHsKKyAgICAgICAgeyAxLCAgMCwgNSwgMSB9LCAvKiBUT1BfSEJBUiAqLworICAgICAgICB7IDEsICA2LCA1LCAxIH0sIC8qIE1JRF9IQkFSICovCisgICAgICAgIHsgMSwgMTIsIDUsIDEgfSwgLyogQk9UX0hCQVIgKi8KKyAgICAgICAgeyAwLCAgMSwgMSwgNSB9LCAvKiBMRUZUX1RPUF9WQkFSICovCisgICAgICAgIHsgMCwgIDcsIDEsIDUgfSwgLyogTEVGVF9CT1RfVkJBUiAqLworICAgICAgICB7IDYsICAxLCAxLCA1IH0sIC8qIFJJR0hUX1RPUF9WQkFSICovCisgICAgICAgIHsgNiwgIDcsIDEsIDUgfSAgLyogUklHSFRfQk9UX1ZCQVIgKi8KKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1hc2tzWzEwXSA9IHsKKyAgICAgICAgLyogMCAqLyBUT1BfSEJBUiAgICAgICAgIHxCT1RfSEJBUnxMRUZUX1RPUF9WQkFSfExFRlRfQk9UX1ZCQVJ8UklHSFRfVE9QX1ZCQVJ8UklHSFRfQk9UX1ZCQVIsCisgICAgICAgIC8qIDEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX1RPUF9WQkFSfFJJR0hUX0JPVF9WQkFSLAorICAgICAgICAvKiAyICovIFRPUF9IQkFSfE1JRF9IQkFSfEJPVF9IQkFSfExFRlRfQk9UX1ZCQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxSSUdIVF9UT1BfVkJBUiwKKyAgICAgICAgLyogMyAqLyBUT1BfSEJBUnxNSURfSEJBUnxCT1RfSEJBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8UklHSFRfVE9QX1ZCQVJ8UklHSFRfQk9UX1ZCQVIsCisgICAgICAgIC8qIDQgKi8gICAgICAgICAgTUlEX0hCQVIgICAgICAgICB8TEVGVF9UT1BfVkJBUiAgICAgICAgICAgICAgfFJJR0hUX1RPUF9WQkFSfFJJR0hUX0JPVF9WQkFSLAorICAgICAgICAvKiA1ICovIFRPUF9IQkFSfEJPVF9IQkFSfE1JRF9IQkFSfExFRlRfVE9QX1ZCQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxSSUdIVF9CT1RfVkJBUiwKKyAgICAgICAgLyogNiAqLyBUT1BfSEJBUnxCT1RfSEJBUnxNSURfSEJBUnxMRUZUX1RPUF9WQkFSfExFRlRfQk9UX1ZCQVIgICAgICAgICAgICAgICB8UklHSFRfQk9UX1ZCQVIsCisgICAgICAgIC8qIDcgKi8gVE9QX0hCQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFJJR0hUX1RPUF9WQkFSfFJJR0hUX0JPVF9WQkFSLAorICAgICAgICAvKiA4ICovIFRPUF9IQkFSfEJPVF9IQkFSfE1JRF9IQkFSfExFRlRfVE9QX1ZCQVJ8TEVGVF9CT1RfVkJBUnxSSUdIVF9UT1BfVkJBUnxSSUdIVF9CT1RfVkJBUiwKKyAgICAgICAgLyogOSAqLyBUT1BfSEJBUnxCT1RfSEJBUnxNSURfSEJBUnxMRUZUX1RPUF9WQkFSICAgICAgICAgICAgICB8UklHSFRfVE9QX1ZCQVJ8UklHSFRfQk9UX1ZCQVIsCisgICAgfTsKKyAgICB1bnNpZ25lZCBtYXNrID0gbWFza3NbZGlnaXRdOworICAgIGludCBpOworCisgICAgZHJhd19yZWN0YW5nbGUoMCwgZHN0LCBkc3RfbGluZXNpemUsIHNlZ21lbnRfd2lkdGgsIDAsIDAsIDgsIDEzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoc2VnbWVudHMpOyBpKyspCisgICAgICAgIGlmIChtYXNrICYgKDE8PGkpKQorICAgICAgICAgICAgZHJhd19yZWN0YW5nbGUoMjU1LCBkc3QsIGRzdF9saW5lc2l6ZSwgc2VnbWVudF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzW2ldLngsIHNlZ21lbnRzW2ldLnksIHNlZ21lbnRzW2ldLncsIHNlZ21lbnRzW2ldLmgpOworfQorCisjZGVmaW5lIEdSQURJRU5UX1NJWkUgKDYgKiAyNTYpCisKK3N0YXRpYyB2b2lkIHRlc3RfZmlsbF9waWN0dXJlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBUZXN0U291cmNlQ29udGV4dCAqdGVzdCA9IGN0eC0+cHJpdjsKKyAgICB1aW50OF90ICpwLCAqcDA7CisgICAgaW50IHgsIHk7CisgICAgaW50IGNvbG9yLCBjb2xvcl9yZXN0OworICAgIGludCBpY29sb3I7CisgICAgaW50IHJhZGl1czsKKyAgICBpbnQgcXVhZDAsIHF1YWQ7CisgICAgaW50IGRxdWFkX3gsIGRxdWFkX3k7CisgICAgaW50IGdyYWQsIGRncmFkLCByZ3JhZCwgZHJncmFkOworICAgIGludCBzZWdfc2l6ZTsKKyAgICBpbnQgc2Vjb25kOworICAgIGludCBpOworICAgIHVpbnQ4X3QgKmRhdGEgPSBmcmFtZS0+ZGF0YVswXTsKKyAgICBpbnQgd2lkdGggID0gZnJhbWUtPndpZHRoOworICAgIGludCBoZWlnaHQgPSBmcmFtZS0+aGVpZ2h0OworCisgICAgLyogZHJhdyBjb2xvcmVkIGJhcnMgYW5kIGNpcmNsZSAqLworICAgIHJhZGl1cyA9ICh3aWR0aCArIGhlaWdodCkgLyA0OworICAgIHF1YWQwID0gd2lkdGggKiB3aWR0aCAvIDQgKyBoZWlnaHQgKiBoZWlnaHQgLyA0IC0gcmFkaXVzICogcmFkaXVzOworICAgIGRxdWFkX3kgPSAxIC0gaGVpZ2h0OworICAgIHAwID0gZGF0YTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgcCA9IHAwOworICAgICAgICBjb2xvciA9IDA7CisgICAgICAgIGNvbG9yX3Jlc3QgPSAwOworICAgICAgICBxdWFkID0gcXVhZDA7CisgICAgICAgIGRxdWFkX3ggPSAxIC0gd2lkdGg7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpY29sb3IgPSBjb2xvcjsKKyAgICAgICAgICAgIGlmIChxdWFkIDwgMCkKKyAgICAgICAgICAgICAgICBpY29sb3IgXj0gNzsKKyAgICAgICAgICAgIHF1YWQgKz0gZHF1YWRfeDsKKyAgICAgICAgICAgIGRxdWFkX3ggKz0gMjsKKyAgICAgICAgICAgICoocCsrKSA9IGljb2xvciAmIDEgPyAyNTUgOiAwOworICAgICAgICAgICAgKihwKyspID0gaWNvbG9yICYgMiA/IDI1NSA6IDA7CisgICAgICAgICAgICAqKHArKykgPSBpY29sb3IgJiA0ID8gMjU1IDogMDsKKyAgICAgICAgICAgIGNvbG9yX3Jlc3QgKz0gODsKKyAgICAgICAgICAgIGlmIChjb2xvcl9yZXN0ID49IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgY29sb3JfcmVzdCAtPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBjb2xvcisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHF1YWQwICs9IGRxdWFkX3k7CisgICAgICAgIGRxdWFkX3kgKz0gMjsKKyAgICAgICAgcDAgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIC8qIGRyYXcgc2xpZGluZyBjb2xvciBsaW5lICovCisgICAgcDAgPSBwID0gZGF0YSArIGZyYW1lLT5saW5lc2l6ZVswXSAqIChoZWlnaHQgKiAzLzQpOworICAgIGdyYWQgPSAoMjU2ICogdGVzdC0+bmJfZnJhbWUgKiB0ZXN0LT50aW1lX2Jhc2UubnVtIC8gdGVzdC0+dGltZV9iYXNlLmRlbikgJQorICAgICAgICBHUkFESUVOVF9TSVpFOworICAgIHJncmFkID0gMDsKKyAgICBkZ3JhZCA9IEdSQURJRU5UX1NJWkUgLyB3aWR0aDsKKyAgICBkcmdyYWQgPSBHUkFESUVOVF9TSVpFICUgd2lkdGg7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgKihwKyspID0KKyAgICAgICAgICAgIGdyYWQgPCAyNTYgfHwgZ3JhZCA+PSA1ICogMjU2ID8gMjU1IDoKKyAgICAgICAgICAgIGdyYWQgPj0gMiAqIDI1NiAmJiBncmFkIDwgNCAqIDI1NiA/IDAgOgorICAgICAgICAgICAgZ3JhZCA8IDIgKiAyNTYgPyAyICogMjU2IC0gMSAtIGdyYWQgOiBncmFkIC0gNCAqIDI1NjsKKyAgICAgICAgKihwKyspID0KKyAgICAgICAgICAgIGdyYWQgPj0gNCAqIDI1NiA/IDAgOgorICAgICAgICAgICAgZ3JhZCA+PSAxICogMjU2ICYmIGdyYWQgPCAzICogMjU2ID8gMjU1IDoKKyAgICAgICAgICAgIGdyYWQgPCAxICogMjU2ID8gZ3JhZCA6IDQgKiAyNTYgLSAxIC0gZ3JhZDsKKyAgICAgICAgKihwKyspID0KKyAgICAgICAgICAgIGdyYWQgPCAyICogMjU2ID8gMCA6CisgICAgICAgICAgICBncmFkID49IDMgKiAyNTYgJiYgZ3JhZCA8IDUgKiAyNTYgPyAyNTUgOgorICAgICAgICAgICAgZ3JhZCA8IDMgKiAyNTYgPyBncmFkIC0gMiAqIDI1NiA6IDYgKiAyNTYgLSAxIC0gZ3JhZDsKKyAgICAgICAgZ3JhZCArPSBkZ3JhZDsKKyAgICAgICAgcmdyYWQgKz0gZHJncmFkOworICAgICAgICBpZiAocmdyYWQgPj0gR1JBRElFTlRfU0laRSkgeworICAgICAgICAgICAgZ3JhZCsrOworICAgICAgICAgICAgcmdyYWQgLT0gR1JBRElFTlRfU0laRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ3JhZCA+PSBHUkFESUVOVF9TSVpFKQorICAgICAgICAgICAgZ3JhZCAtPSBHUkFESUVOVF9TSVpFOworICAgIH0KKyAgICBwID0gcDA7CisgICAgZm9yICh5ID0gaGVpZ2h0IC8gODsgeSA+IDA7IHktLSkgeworICAgICAgICBtZW1jcHkocCtmcmFtZS0+bGluZXNpemVbMF0sIHAsIDMgKiB3aWR0aCk7CisgICAgICAgIHAgKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIC8qIGRyYXcgZGlnaXRzICovCisgICAgc2VnX3NpemUgPSB3aWR0aCAvIDgwOworICAgIGlmIChzZWdfc2l6ZSA+PSAxICYmIGhlaWdodCA+PSAxMyAqIHNlZ19zaXplKSB7CisgICAgICAgIGludDY0X3QgcDEwZGVjaW1hbHMgPSAxOworICAgICAgICBkb3VibGUgdGltZSA9IGF2X3EyZCh0ZXN0LT50aW1lX2Jhc2UpICogdGVzdC0+bmJfZnJhbWUgKgorICAgICAgICAgICAgICAgICAgICAgIHBvdygxMCwgdGVzdC0+bmJfZGVjaW1hbHMpOworICAgICAgICBpZiAodGltZSA+PSBJTlRfTUFYKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB0ZXN0LT5uYl9kZWNpbWFsczsgeCsrKQorICAgICAgICAgICAgcDEwZGVjaW1hbHMgKj0gMTA7CisKKyAgICAgICAgc2Vjb25kID0gYXZfcmVzY2FsZV9ybmQodGVzdC0+bmJfZnJhbWUgKiB0ZXN0LT50aW1lX2Jhc2UubnVtLCBwMTBkZWNpbWFscywgdGVzdC0+dGltZV9iYXNlLmRlbiwgQVZfUk9VTkRfWkVSTyk7CisgICAgICAgIHggPSB3aWR0aCAtICh3aWR0aCAtIHNlZ19zaXplICogNjQpIC8gMjsKKyAgICAgICAgeSA9IChoZWlnaHQgLSBzZWdfc2l6ZSAqIDEzKSAvIDI7CisgICAgICAgIHAgPSBkYXRhICsgKHgqMyArIHkgKiBmcmFtZS0+bGluZXNpemVbMF0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBwIC09IDMgKiA4ICogc2VnX3NpemU7CisgICAgICAgICAgICBkcmF3X2RpZ2l0KHNlY29uZCAlIDEwLCBwLCBmcmFtZS0+bGluZXNpemVbMF0sIHNlZ19zaXplKTsKKyAgICAgICAgICAgIHNlY29uZCAvPSAxMDsKKyAgICAgICAgICAgIGlmIChzZWNvbmQgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IHRlc3RfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBUZXN0U291cmNlQ29udGV4dCAqdGVzdCA9IGN0eC0+cHJpdjsKKworICAgIHRlc3QtPmZpbGxfcGljdHVyZV9mbiA9IHRlc3RfZmlsbF9waWN0dXJlOworICAgIHJldHVybiBpbml0KGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9xdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92c3JjX3Rlc3RzcmNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZzcmNfdGVzdHNyYyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJ0ZXN0c3JjIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHZW5lcmF0ZSB0ZXN0IHBhdHRlcm4uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoVGVzdFNvdXJjZUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnRlc3RzcmNfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgPSB0ZXN0X2luaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSB0ZXN0X3F1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfdnNyY190ZXN0c3JjX291dHB1dHMsCit9OworCisjZW5kaWYgLyogQ09ORklHX1RFU1RTUkNfRklMVEVSICovCisKKyNpZiBDT05GSUdfUkdCVEVTVFNSQ19GSUxURVIKKworI2RlZmluZSByZ2J0ZXN0c3JjX29wdGlvbnMgb3B0aW9ucworQVZGSUxURVJfREVGSU5FX0NMQVNTKHJnYnRlc3RzcmMpOworCisjZGVmaW5lIFIgMAorI2RlZmluZSBHIDEKKyNkZWZpbmUgQiAyCisjZGVmaW5lIEEgMworCitzdGF0aWMgdm9pZCByZ2J0ZXN0X3B1dF9waXhlbCh1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCByLCBpbnQgZywgaW50IGIsIGVudW0gQVZQaXhlbEZvcm1hdCBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJnYmFfbWFwWzRdKQoreworICAgIGludDMyX3QgdjsKKyAgICB1aW50OF90ICpwOworCisgICAgc3dpdGNoIChmbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDQ0OiAoKHVpbnQxNl90KikoZHN0ICsgeSpkc3RfbGluZXNpemUpKVt4XSA9ICgociA+PiA0KSA8PCA4KSB8ICgoZyA+PiA0KSA8PCA0KSB8IChiID4+IDQpOyBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDQ0OiAoKHVpbnQxNl90KikoZHN0ICsgeSpkc3RfbGluZXNpemUpKVt4XSA9ICgoYiA+PiA0KSA8PCA4KSB8ICgoZyA+PiA0KSA8PCA0KSB8IChyID4+IDQpOyBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNTU1OiAoKHVpbnQxNl90KikoZHN0ICsgeSpkc3RfbGluZXNpemUpKVt4XSA9ICgocj4+Myk8PDEwKSB8ICgoZz4+Myk8PDUpIHwgKGI+PjMpOyBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTU1OiAoKHVpbnQxNl90KikoZHN0ICsgeSpkc3RfbGluZXNpemUpKVt4XSA9ICgoYj4+Myk8PDEwKSB8ICgoZz4+Myk8PDUpIHwgKHI+PjMpOyBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNTY1OiAoKHVpbnQxNl90KikoZHN0ICsgeSpkc3RfbGluZXNpemUpKVt4XSA9ICgocj4+Myk8PDExKSB8ICgoZz4+Mik8PDUpIHwgKGI+PjMpOyBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTY1OiAoKHVpbnQxNl90KikoZHN0ICsgeSpkc3RfbGluZXNpemUpKVt4XSA9ICgoYj4+Myk8PDExKSB8ICgoZz4+Mik8PDUpIHwgKHI+PjMpOyBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorICAgICAgICB2ID0gKHIgPDwgKHJnYmFfbWFwW1JdKjgpKSArIChnIDw8IChyZ2JhX21hcFtHXSo4KSkgKyAoYiA8PCAocmdiYV9tYXBbQl0qOCkpOworICAgICAgICBwID0gZHN0ICsgMyp4ICsgeSpkc3RfbGluZXNpemU7CisgICAgICAgIEFWX1dMMjQocCwgdik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBOgorICAgIGNhc2UgQVZfUElYX0ZNVF9BUkdCOgorICAgIGNhc2UgQVZfUElYX0ZNVF9BQkdSOgorICAgICAgICB2ID0gKHIgPDwgKHJnYmFfbWFwW1JdKjgpKSArIChnIDw8IChyZ2JhX21hcFtHXSo4KSkgKyAoYiA8PCAocmdiYV9tYXBbQl0qOCkpICsgKDI1NSA8PCAocmdiYV9tYXBbQV0qOCkpOworICAgICAgICBwID0gZHN0ICsgNCp4ICsgeSpkc3RfbGluZXNpemU7CisgICAgICAgIEFWX1dMMzIocCwgdik7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmdidGVzdF9maWxsX3BpY3R1cmUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIFRlc3RTb3VyY2VDb250ZXh0ICp0ZXN0ID0gY3R4LT5wcml2OworICAgIGludCB4LCB5LCB3ID0gZnJhbWUtPndpZHRoLCBoID0gZnJhbWUtPmhlaWdodDsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICBpbnQgYyA9IDI1Nip4L3c7CisgICAgICAgICAgICAgaW50IHIgPSAwLCBnID0gMCwgYiA9IDA7CisKKyAgICAgICAgICAgICBpZiAgICAgICgzKnkgPCBoICApIHIgPSBjOworICAgICAgICAgICAgIGVsc2UgaWYgKDMqeSA8IDIqaCkgZyA9IGM7CisgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICBiID0gYzsKKworICAgICAgICAgICAgIHJnYnRlc3RfcHV0X3BpeGVsKGZyYW1lLT5kYXRhWzBdLCBmcmFtZS0+bGluZXNpemVbMF0sIHgsIHksIHIsIGcsIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5vdXRwdXRzWzBdLT5mb3JtYXQsIHRlc3QtPnJnYmFfbWFwKTsKKyAgICAgICAgIH0KKyAgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcmdidGVzdF9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFRlc3RTb3VyY2VDb250ZXh0ICp0ZXN0ID0gY3R4LT5wcml2OworCisgICAgdGVzdC0+ZHJhd19vbmNlID0gMTsKKyAgICB0ZXN0LT5maWxsX3BpY3R1cmVfZm4gPSByZ2J0ZXN0X2ZpbGxfcGljdHVyZTsKKyAgICByZXR1cm4gaW5pdChjdHgpOworfQorCitzdGF0aWMgaW50IHJnYnRlc3RfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfUkdCQSwgQVZfUElYX0ZNVF9BUkdCLCBBVl9QSVhfRk1UX0JHUkEsIEFWX1BJWF9GTVRfQUJHUiwKKyAgICAgICAgQVZfUElYX0ZNVF9CR1IyNCwgQVZfUElYX0ZNVF9SR0IyNCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0I0NDQsIEFWX1BJWF9GTVRfQkdSNDQ0LAorICAgICAgICBBVl9QSVhfRk1UX1JHQjU2NSwgQVZfUElYX0ZNVF9CR1I1NjUsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCNTU1LCBBVl9QSVhfRk1UX0JHUjU1NSwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmdidGVzdF9jb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIFRlc3RTb3VyY2VDb250ZXh0ICp0ZXN0ID0gb3V0bGluay0+c3JjLT5wcml2OworCisgICAgZmZfZmlsbF9yZ2JhX21hcCh0ZXN0LT5yZ2JhX21hcCwgb3V0bGluay0+Zm9ybWF0KTsKKyAgICByZXR1cm4gY29uZmlnX3Byb3BzKG91dGxpbmspOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdnNyY19yZ2J0ZXN0c3JjX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IHJnYnRlc3RfY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZzcmNfcmdidGVzdHNyYyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJyZ2J0ZXN0c3JjIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHZW5lcmF0ZSBSR0IgdGVzdCBwYXR0ZXJuLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFRlc3RTb3VyY2VDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZyZ2J0ZXN0c3JjX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gcmdidGVzdF9pbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcmdidGVzdF9xdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gTlVMTCwKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX3ZzcmNfcmdidGVzdHNyY19vdXRwdXRzLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19SR0JURVNUU1JDX0ZJTFRFUiAqLworCisjaWYgQ09ORklHX1NNUFRFQkFSU19GSUxURVIgfHwgQ09ORklHX1NNUFRFSERCQVJTX0ZJTFRFUgorCitzdGF0aWMgY29uc3QgdWludDhfdCByYWluYm93WzddWzRdID0geworICAgIHsgMTgwLCAxMjgsIDEyOCwgMjU1IH0sICAgICAvKiBncmF5ICovCisgICAgeyAxNjgsICA0NCwgMTM2LCAyNTUgfSwgICAgIC8qIHllbGxvdyAqLworICAgIHsgMTQ1LCAxNDcsICA0NCwgMjU1IH0sICAgICAvKiBjeWFuICovCisgICAgeyAxMzMsICA2MywgIDUyLCAyNTUgfSwgICAgIC8qIGdyZWVuICovCisgICAgeyAgNjMsIDE5MywgMjA0LCAyNTUgfSwgICAgIC8qIG1hZ2VudGEgKi8KKyAgICB7ICA1MSwgMTA5LCAyMTIsIDI1NSB9LCAgICAgLyogcmVkICovCisgICAgeyAgMjgsIDIxMiwgMTIwLCAyNTUgfSwgICAgIC8qIGJsdWUgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHdvYm5haXJbN11bNF0gPSB7CisgICAgeyAgMzIsIDI0MCwgMTE4LCAyNTUgfSwgICAgIC8qIGJsdWUgKi8KKyAgICB7ICAxOSwgMTI4LCAxMjgsIDI1NSB9LCAgICAgLyogNy41JSBpbnRlbnNpdHkgYmxhY2sgKi8KKyAgICB7ICA1NCwgMTg0LCAxOTgsIDI1NSB9LCAgICAgLyogbWFnZW50YSAqLworICAgIHsgIDE5LCAxMjgsIDEyOCwgMjU1IH0sICAgICAvKiA3LjUlIGludGVuc2l0eSBibGFjayAqLworICAgIHsgMTg4LCAxNTQsICAxNiwgMjU1IH0sICAgICAvKiBjeWFuICovCisgICAgeyAgMTksIDEyOCwgMTI4LCAyNTUgfSwgICAgIC8qIDcuNSUgaW50ZW5zaXR5IGJsYWNrICovCisgICAgeyAxOTEsIDEyOCwgMTI4LCAyNTUgfSwgICAgIC8qIGdyYXkgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHdoaXRlWzRdID0geyAyMzUsIDEyOCwgMTI4LCAyNTUgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGJsYWNrWzRdID0geyAgMTksIDEyOCwgMTI4LCAyNTUgfTsgLyogNy41JSBpbnRlbnNpdHkgYmxhY2sgKi8KKworLyogcGx1Z2UgcHVsc2VzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBuZWc0aXJlWzRdID0geyAgOSwgMTI4LCAxMjgsIDI1NSB9OyAvKiAgMy41JSBpbnRlbnNpdHkgYmxhY2sgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHBvczRpcmVbNF0gPSB7IDI5LCAxMjgsIDEyOCwgMjU1IH07IC8qIDExLjUlIGludGVuc2l0eSBibGFjayAqLworCisvKiBmdWRnZWQgUS8tSSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaV9waXhlbFs0XSA9IHsgNjEsIDE1MywgIDk5LCAyNTUgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHFfcGl4ZWxbNF0gPSB7IDM1LCAxNzQsIDE1MiwgMjU1IH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGdyYXk0MFs0XSA9IHsgMTA0LCAxMjgsIDEyOCwgMjU1IH07CitzdGF0aWMgY29uc3QgdWludDhfdCBncmF5MTVbNF0gPSB7ICA0OSwgMTI4LCAxMjgsIDI1NSB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgICBjeWFuWzRdID0geyAxODgsIDE1NCwgIDE2LCAyNTUgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHllbGxvd1s0XSA9IHsgMjE5LCAgMTYsIDEzOCwgMjU1IH07CitzdGF0aWMgY29uc3QgdWludDhfdCAgIGJsdWVbNF0gPSB7ICAzMiwgMjQwLCAxMTgsIDI1NSB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgICAgcmVkWzRdID0geyAgNjMsIDEwMiwgMjQwLCAyNTUgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGJsYWNrMFs0XSA9IHsgIDE2LCAxMjgsIDEyOCwgMjU1IH07CitzdGF0aWMgY29uc3QgdWludDhfdCBibGFjazJbNF0gPSB7ICAyMCwgMTI4LCAxMjgsIDI1NSB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmxhY2s0WzRdID0geyAgMjUsIDEyOCwgMTI4LCAyNTUgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90ICAgbmVnMls0XSA9IHsgIDEyLCAxMjgsIDEyOCwgMjU1IH07CisKK3N0YXRpYyB2b2lkIGRyYXdfYmFyKFRlc3RTb3VyY2VDb250ZXh0ICp0ZXN0LCBjb25zdCB1aW50OF90IGNvbG9yWzRdLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgeCwgdW5zaWduZWQgeSwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwKKyAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZnJhbWUtPmZvcm1hdCk7CisgICAgdWludDhfdCAqcCwgKnAwOworICAgIGludCBwbGFuZTsKKworICAgIHggPSBGRk1JTih4LCB0ZXN0LT53IC0gMSk7CisgICAgeSA9IEZGTUlOKHksIHRlc3QtPmggLSAxKTsKKyAgICB3ID0gRkZNSU4odywgdGVzdC0+dyAtIHgpOworICAgIGggPSBGRk1JTihoLCB0ZXN0LT5oIC0geSk7CisKKyAgICBhdl9hc3NlcnQwKHggKyB3IDw9IHRlc3QtPncpOworICAgIGF2X2Fzc2VydDAoeSArIGggPD0gdGVzdC0+aCk7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgZnJhbWUtPmRhdGFbcGxhbmVdOyBwbGFuZSsrKSB7CisgICAgICAgIGNvbnN0IGludCBjID0gY29sb3JbcGxhbmVdOworICAgICAgICBjb25zdCBpbnQgbGluZXNpemUgPSBmcmFtZS0+bGluZXNpemVbcGxhbmVdOworICAgICAgICBpbnQgaSwgcHgsIHB5LCBwdywgcGg7CisKKyAgICAgICAgaWYgKHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMikgeworICAgICAgICAgICAgcHggPSB4ID4+IGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgICAgICAgICBwdyA9IHcgPj4gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICAgICAgICAgIHB5ID0geSA+PiBkZXNjLT5sb2cyX2Nocm9tYV9oOworICAgICAgICAgICAgcGggPSBoID4+IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBweCA9IHg7CisgICAgICAgICAgICBwdyA9IHc7CisgICAgICAgICAgICBweSA9IHk7CisgICAgICAgICAgICBwaCA9IGg7CisgICAgICAgIH0KKworICAgICAgICBwMCA9IHAgPSBmcmFtZS0+ZGF0YVtwbGFuZV0gKyBweSAqIGxpbmVzaXplICsgcHg7CisgICAgICAgIG1lbXNldChwLCBjLCBwdyk7CisgICAgICAgIHAgKz0gbGluZXNpemU7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBwaDsgaSsrLCBwICs9IGxpbmVzaXplKQorICAgICAgICAgICAgbWVtY3B5KHAsIHAwLCBwdyk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHNtcHRlYmFyc19xdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMFAsIEFWX1BJWF9GTVRfWVVWNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FLAorICAgIH07CisgICAgZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc21wdGViYXJzX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCisjaWYgQ09ORklHX1NNUFRFQkFSU19GSUxURVIKKworI2RlZmluZSBzbXB0ZWJhcnNfb3B0aW9ucyBvcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moc21wdGViYXJzKTsKKworc3RhdGljIHZvaWQgc21wdGViYXJzX2ZpbGxfcGljdHVyZShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqcGljcmVmKQoreworICAgIFRlc3RTb3VyY2VDb250ZXh0ICp0ZXN0ID0gY3R4LT5wcml2OworICAgIGludCByX3csIHJfaCwgd19oLCBwX3csIHBfaCwgaSwgdG1wLCB4ID0gMDsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpY3JlZi0+Zm9ybWF0KTsKKworICAgIGF2X2ZyYW1lX3NldF9jb2xvcnNwYWNlKHBpY3JlZiwgQVZDT0xfU1BDX0JUNDcwQkcpOworCisgICAgcl93ID0gRkZBTElHTigodGVzdC0+dyArIDYpIC8gNywgMSA8PCBwaXhkZXNjLT5sb2cyX2Nocm9tYV93KTsKKyAgICByX2ggPSBGRkFMSUdOKHRlc3QtPmggKiAyIC8gMywgMSA8PCBwaXhkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICB3X2ggPSBGRkFMSUdOKHRlc3QtPmggKiAzIC8gNCAtIHJfaCwgIDEgPDwgcGl4ZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgcF93ID0gRkZBTElHTihyX3cgKiA1IC8gNCwgMSA8PCBwaXhkZXNjLT5sb2cyX2Nocm9tYV93KTsKKyAgICBwX2ggPSB0ZXN0LT5oIC0gd19oIC0gcl9oOworCisgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworICAgICAgICBkcmF3X2Jhcih0ZXN0LCByYWluYm93W2ldLCB4LCAwLCAgIHJfdywgcl9oLCBwaWNyZWYpOworICAgICAgICBkcmF3X2Jhcih0ZXN0LCB3b2JuYWlyW2ldLCB4LCByX2gsIHJfdywgd19oLCBwaWNyZWYpOworICAgICAgICB4ICs9IHJfdzsKKyAgICB9CisgICAgeCA9IDA7CisgICAgZHJhd19iYXIodGVzdCwgaV9waXhlbCwgeCwgcl9oICsgd19oLCBwX3csIHBfaCwgcGljcmVmKTsKKyAgICB4ICs9IHBfdzsKKyAgICBkcmF3X2Jhcih0ZXN0LCB3aGl0ZSwgeCwgcl9oICsgd19oLCBwX3csIHBfaCwgcGljcmVmKTsKKyAgICB4ICs9IHBfdzsKKyAgICBkcmF3X2Jhcih0ZXN0LCBxX3BpeGVsLCB4LCByX2ggKyB3X2gsIHBfdywgcF9oLCBwaWNyZWYpOworICAgIHggKz0gcF93OworICAgIHRtcCA9IEZGQUxJR04oNSAqIHJfdyAtIHgsICAxIDw8IHBpeGRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgIGRyYXdfYmFyKHRlc3QsIGJsYWNrLCB4LCByX2ggKyB3X2gsIHRtcCwgcF9oLCBwaWNyZWYpOworICAgIHggKz0gdG1wOworICAgIHRtcCA9IEZGQUxJR04ocl93IC8gMywgIDEgPDwgcGl4ZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgZHJhd19iYXIodGVzdCwgbmVnNGlyZSwgeCwgcl9oICsgd19oLCB0bXAsIHBfaCwgcGljcmVmKTsKKyAgICB4ICs9IHRtcDsKKyAgICBkcmF3X2Jhcih0ZXN0LCBibGFjaywgeCwgcl9oICsgd19oLCB0bXAsIHBfaCwgcGljcmVmKTsKKyAgICB4ICs9IHRtcDsKKyAgICBkcmF3X2Jhcih0ZXN0LCBwb3M0aXJlLCB4LCByX2ggKyB3X2gsIHRtcCwgcF9oLCBwaWNyZWYpOworICAgIHggKz0gdG1wOworICAgIGRyYXdfYmFyKHRlc3QsIGJsYWNrLCB4LCByX2ggKyB3X2gsIHRlc3QtPncgLSB4LCBwX2gsIHBpY3JlZik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBzbXB0ZWJhcnNfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBUZXN0U291cmNlQ29udGV4dCAqdGVzdCA9IGN0eC0+cHJpdjsKKworICAgIHRlc3QtPmZpbGxfcGljdHVyZV9mbiA9IHNtcHRlYmFyc19maWxsX3BpY3R1cmU7CisgICAgdGVzdC0+ZHJhd19vbmNlID0gMTsKKyAgICByZXR1cm4gaW5pdChjdHgpOworfQorCitBVkZpbHRlciBmZl92c3JjX3NtcHRlYmFycyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJzbXB0ZWJhcnMiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdlbmVyYXRlIFNNUFRFIGNvbG9yIGJhcnMuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoVGVzdFNvdXJjZUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnNtcHRlYmFyc19jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IHNtcHRlYmFyc19pbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gc21wdGViYXJzX3F1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgID0gc21wdGViYXJzX291dHB1dHMsCit9OworCisjZW5kaWYgIC8qIENPTkZJR19TTVBURUJBUlNfRklMVEVSICovCisKKyNpZiBDT05GSUdfU01QVEVIREJBUlNfRklMVEVSCisKKyNkZWZpbmUgc21wdGVoZGJhcnNfb3B0aW9ucyBvcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moc21wdGVoZGJhcnMpOworCitzdGF0aWMgdm9pZCBzbXB0ZWhkYmFyc19maWxsX3BpY3R1cmUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKnBpY3JlZikKK3sKKyAgICBUZXN0U291cmNlQ29udGV4dCAqdGVzdCA9IGN0eC0+cHJpdjsKKyAgICBpbnQgZF93LCByX3csIHJfaCwgbF93LCBpLCB0bXAsIHggPSAwLCB5ID0gMDsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpY3JlZi0+Zm9ybWF0KTsKKworICAgIGF2X2ZyYW1lX3NldF9jb2xvcnNwYWNlKHBpY3JlZiwgQVZDT0xfU1BDX0JUNzA5KTsKKworICAgIGRfdyA9IEZGQUxJR04odGVzdC0+dyAvIDgsIDEgPDwgcGl4ZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgcl9oID0gRkZBTElHTih0ZXN0LT5oICogNyAvIDEyLCAxIDw8IHBpeGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgIGRyYXdfYmFyKHRlc3QsIGdyYXk0MCwgeCwgMCwgZF93LCByX2gsIHBpY3JlZik7CisgICAgeCArPSBkX3c7CisKKyAgICByX3cgPSBGRkFMSUdOKCgoKHRlc3QtPncgKyAzKSAvIDQpICogMykgLyA3LCAxIDw8IHBpeGRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKyAgICAgICAgZHJhd19iYXIodGVzdCwgcmFpbmJvd1tpXSwgeCwgMCwgcl93LCByX2gsIHBpY3JlZik7CisgICAgICAgIHggKz0gcl93OworICAgIH0KKyAgICBkcmF3X2Jhcih0ZXN0LCBncmF5NDAsIHgsIDAsIHRlc3QtPncgLSB4LCByX2gsIHBpY3JlZik7CisgICAgeSA9IHJfaDsKKyAgICByX2ggPSBGRkFMSUdOKHRlc3QtPmggLyAxMiwgMSA8PCBwaXhkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBkcmF3X2Jhcih0ZXN0LCBjeWFuLCAwLCB5LCBkX3csIHJfaCwgcGljcmVmKTsKKyAgICB4ID0gZF93OworICAgIGRyYXdfYmFyKHRlc3QsIGlfcGl4ZWwsIHgsIHksIHJfdywgcl9oLCBwaWNyZWYpOworICAgIHggKz0gcl93OworICAgIHRtcCA9IHJfdyAqIDY7CisgICAgZHJhd19iYXIodGVzdCwgcmFpbmJvd1swXSwgeCwgeSwgdG1wLCByX2gsIHBpY3JlZik7CisgICAgeCArPSB0bXA7CisgICAgbF93ID0geDsKKyAgICBkcmF3X2Jhcih0ZXN0LCBibHVlLCB4LCB5LCB0ZXN0LT53IC0geCwgcl9oLCBwaWNyZWYpOworICAgIHkgKz0gcl9oOworICAgIGRyYXdfYmFyKHRlc3QsIHllbGxvdywgMCwgeSwgZF93LCByX2gsIHBpY3JlZik7CisgICAgeCA9IGRfdzsKKyAgICBkcmF3X2Jhcih0ZXN0LCBxX3BpeGVsLCB4LCB5LCByX3csIHJfaCwgcGljcmVmKTsKKyAgICB4ICs9IHJfdzsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0bXA7IGkgKz0gMSA8PCBwaXhkZXNjLT5sb2cyX2Nocm9tYV93KSB7CisgICAgICAgIHVpbnQ4X3QgeXJhbXBbNF0gPSB7MH07CisKKyAgICAgICAgeXJhbXBbMF0gPSBpICogMjU1IC8gdG1wOworICAgICAgICB5cmFtcFsxXSA9IDEyODsKKyAgICAgICAgeXJhbXBbMl0gPSAxMjg7CisgICAgICAgIHlyYW1wWzNdID0gMjU1OworCisgICAgICAgIGRyYXdfYmFyKHRlc3QsIHlyYW1wLCB4LCB5LCAxIDw8IHBpeGRlc2MtPmxvZzJfY2hyb21hX3csIHJfaCwgcGljcmVmKTsKKyAgICAgICAgeCArPSAxIDw8IHBpeGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgfQorICAgIGRyYXdfYmFyKHRlc3QsIHJlZCwgeCwgeSwgdGVzdC0+dyAtIHgsIHJfaCwgcGljcmVmKTsKKyAgICB5ICs9IHJfaDsKKyAgICBkcmF3X2Jhcih0ZXN0LCBncmF5MTUsIDAsIHksIGRfdywgdGVzdC0+aCAtIHksIHBpY3JlZik7CisgICAgeCA9IGRfdzsKKyAgICB0bXAgPSBGRkFMSUdOKHJfdyAqIDMgLyAyLCAxIDw8IHBpeGRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgIGRyYXdfYmFyKHRlc3QsIGJsYWNrMCwgeCwgeSwgdG1wLCB0ZXN0LT5oIC0geSwgcGljcmVmKTsKKyAgICB4ICs9IHRtcDsKKyAgICB0bXAgPSBGRkFMSUdOKHJfdyAqIDIsIDEgPDwgcGl4ZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgZHJhd19iYXIodGVzdCwgd2hpdGUsIHgsIHksIHRtcCwgdGVzdC0+aCAtIHksIHBpY3JlZik7CisgICAgeCArPSB0bXA7CisgICAgdG1wID0gRkZBTElHTihyX3cgKiA1IC8gNiwgMSA8PCBwaXhkZXNjLT5sb2cyX2Nocm9tYV93KTsKKyAgICBkcmF3X2Jhcih0ZXN0LCBibGFjazAsIHgsIHksIHRtcCwgdGVzdC0+aCAtIHksIHBpY3JlZik7CisgICAgeCArPSB0bXA7CisgICAgdG1wID0gRkZBTElHTihyX3cgLyAzLCAxIDw8IHBpeGRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgIGRyYXdfYmFyKHRlc3QsICAgbmVnMiwgeCwgeSwgdG1wLCB0ZXN0LT5oIC0geSwgcGljcmVmKTsKKyAgICB4ICs9IHRtcDsKKyAgICBkcmF3X2Jhcih0ZXN0LCBibGFjazAsIHgsIHksIHRtcCwgdGVzdC0+aCAtIHksIHBpY3JlZik7CisgICAgeCArPSB0bXA7CisgICAgZHJhd19iYXIodGVzdCwgYmxhY2syLCB4LCB5LCB0bXAsIHRlc3QtPmggLSB5LCBwaWNyZWYpOworICAgIHggKz0gdG1wOworICAgIGRyYXdfYmFyKHRlc3QsIGJsYWNrMCwgeCwgeSwgdG1wLCB0ZXN0LT5oIC0geSwgcGljcmVmKTsKKyAgICB4ICs9IHRtcDsKKyAgICBkcmF3X2Jhcih0ZXN0LCBibGFjazQsIHgsIHksIHRtcCwgdGVzdC0+aCAtIHksIHBpY3JlZik7CisgICAgeCArPSB0bXA7CisgICAgcl93ID0gbF93IC0geDsKKyAgICBkcmF3X2Jhcih0ZXN0LCBibGFjazAsIHgsIHksIHJfdywgdGVzdC0+aCAtIHksIHBpY3JlZik7CisgICAgeCArPSByX3c7CisgICAgZHJhd19iYXIodGVzdCwgZ3JheTE1LCB4LCB5LCB0ZXN0LT53IC0geCwgdGVzdC0+aCAtIHksIHBpY3JlZik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBzbXB0ZWhkYmFyc19pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFRlc3RTb3VyY2VDb250ZXh0ICp0ZXN0ID0gY3R4LT5wcml2OworCisgICAgdGVzdC0+ZmlsbF9waWN0dXJlX2ZuID0gc21wdGVoZGJhcnNfZmlsbF9waWN0dXJlOworICAgIHRlc3QtPmRyYXdfb25jZSA9IDE7CisgICAgcmV0dXJuIGluaXQoY3R4KTsKK30KKworQVZGaWx0ZXIgZmZfdnNyY19zbXB0ZWhkYmFycyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJzbXB0ZWhkYmFycyIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR2VuZXJhdGUgU01QVEUgSEQgY29sb3IgYmFycy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihUZXN0U291cmNlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmc21wdGVoZGJhcnNfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgPSBzbXB0ZWhkYmFyc19pbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gc21wdGViYXJzX3F1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgID0gc21wdGViYXJzX291dHB1dHMsCit9OworCisjZW5kaWYgIC8qIENPTkZJR19TTVBURUhEQkFSU19GSUxURVIgKi8KKyNlbmRpZiAgLyogQ09ORklHX1NNUFRFQkFSU19GSUxURVIgfHwgQ09ORklHX1NNUFRFSERCQVJTX0ZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni9NYWtlZmlsZSBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3NjVkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorT0JKUy0kKENPTkZJR19HUkFERlVOX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0geDg2L3ZmX2dyYWRmdW5faW5pdC5vCitPQkpTLSQoQ09ORklHX0hRRE4zRF9GSUxURVIpICAgICAgICAgICAgICAgICArPSB4ODYvdmZfaHFkbjNkX2luaXQubworT0JKUy0kKENPTkZJR19JREVUX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0geDg2L3ZmX2lkZXRfaW5pdC5vCitPQkpTLSQoQ09ORklHX0lOVEVSTEFDRV9GSUxURVIpICAgICAgICAgICAgICArPSB4ODYvdmZfaW50ZXJsYWNlX2luaXQubworT0JKUy0kKENPTkZJR19OT0lTRV9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0geDg2L3ZmX25vaXNlLm8KK09CSlMtJChDT05GSUdfUFVMTFVQX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHg4Ni92Zl9wdWxsdXBfaW5pdC5vCitPQkpTLSQoQ09ORklHX1NQUF9GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB4ODYvdmZfc3BwLm8KK09CSlMtJChDT05GSUdfVElOVEVSTEFDRV9GSUxURVIpICAgICAgICAgICAgICs9IHg4Ni92Zl90aW50ZXJsYWNlX2luaXQubworT0JKUy0kKENPTkZJR19WT0xVTUVfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0geDg2L2FmX3ZvbHVtZV9pbml0Lm8KK09CSlMtJChDT05GSUdfWUFESUZfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHg4Ni92Zl95YWRpZl9pbml0Lm8KKworWUFTTS1PQkpTLSQoQ09ORklHX0dSQURGVU5fRklMVEVSKSAgICAgICAgICAgKz0geDg2L3ZmX2dyYWRmdW4ubworWUFTTS1PQkpTLSQoQ09ORklHX0hRRE4zRF9GSUxURVIpICAgICAgICAgICAgKz0geDg2L3ZmX2hxZG4zZC5vCitZQVNNLU9CSlMtJChDT05GSUdfSURFVF9GSUxURVIpICAgICAgICAgICAgICArPSB4ODYvdmZfaWRldC5vCitZQVNNLU9CSlMtJChDT05GSUdfSU5URVJMQUNFX0ZJTFRFUikgICAgICAgICArPSB4ODYvdmZfaW50ZXJsYWNlLm8KK1lBU00tT0JKUy0kKENPTkZJR19QVUxMVVBfRklMVEVSKSAgICAgICAgICAgICs9IHg4Ni92Zl9wdWxsdXAubworWUFTTS1PQkpTLSQoQ09ORklHX1RJTlRFUkxBQ0VfRklMVEVSKSAgICAgICAgKz0geDg2L3ZmX2ludGVybGFjZS5vCitZQVNNLU9CSlMtJChDT05GSUdfVk9MVU1FX0ZJTFRFUikgICAgICAgICAgICArPSB4ODYvYWZfdm9sdW1lLm8KK1lBU00tT0JKUy0kKENPTkZJR19ZQURJRl9GSUxURVIpICAgICAgICAgICAgICs9IHg4Ni92Zl95YWRpZi5vIHg4Ni95YWRpZi0xNi5vIHg4Ni95YWRpZi0xMC5vCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L2FmX3ZvbHVtZS5hc20gYi9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L2FmX3ZvbHVtZS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjYmNiYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvYWZfdm9sdW1lLmFzbQpAQCAtMCwwICsxLDE0MCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiB4ODYtb3B0aW1pemVkIGZ1bmN0aW9ucyBmb3Igdm9sdW1lIGZpbHRlcgorOyogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEgMzIKKworcGRfMV8yNTY6ICAgICB0aW1lcyA0IGRxIDB4M0Y3MDAwMDAwMDAwMDAwMAorcGRfaW50MzJfbWF4OiB0aW1lcyA0IGRxIDB4NDFERkZGRkZGRkMwMDAwMAorcHdfMTogICAgICAgICB0aW1lcyA4IGR3IDEKK3B3XzEyODogICAgICAgdGltZXMgOCBkdyAxMjgKK3BxXzEyODogICAgICAgdGltZXMgMiBkcSAxMjgKKworU0VDVElPTl9URVhUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9zY2FsZV9zYW1wbGVzX3MxNih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdm9sdW1lKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTklUX1hNTSBzc2UyCitjZ2xvYmFsIHNjYWxlX3NhbXBsZXNfczE2LCA0LDQsNCwgZHN0LCBzcmMsIGxlbiwgdm9sdW1lCisgICAgbW92ZCAgICAgICAgbTAsIHZvbHVtZW0KKyAgICBwc2h1Zmx3ICAgICBtMCwgbTAsIDAKKyAgICBwdW5wY2tsd2QgICBtMCwgW3B3XzFdCisgICAgbW92YSAgICAgICAgbTEsIFtwd18xMjhdCisgICAgbGVhICAgICAgIGxlbnEsIFtsZW5kKjItbW1zaXplXQorLmxvb3A6CisgICAgOyBkc3RbaV0gPSBhdl9jbGlwX2ludDE2KChzcmNbaV0gKiB2b2x1bWUgKyAxMjgpID4+IDgpOworICAgIG1vdmEgICAgICAgIG0yLCBbc3JjcStsZW5xXQorICAgIHB1bnBja2x3ZCAgIG0zLCBtMiwgbTEKKyAgICBwdW5wY2tod2QgICBtMiwgbTEKKyAgICBwbWFkZHdkICAgICBtMywgbTAKKyAgICBwbWFkZHdkICAgICBtMiwgbTAKKyAgICBwc3JhZCAgICAgICBtMywgOAorICAgIHBzcmFkICAgICAgIG0yLCA4CisgICAgcGFja3NzZHcgICAgbTMsIG0yCisgICAgbW92YSAgW2RzdHErbGVucV0sIG0zCisgICAgc3ViICAgICAgIGxlbnEsIG1tc2l6ZQorICAgIGpnZSAubG9vcAorICAgIFJFUF9SRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3NjYWxlX3NhbXBsZXNfczMyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgbGVuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2b2x1bWUpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBTQ0FMRV9TQU1QTEVTX1MzMiAwCitjZ2xvYmFsIHNjYWxlX3NhbXBsZXNfczMyLCA0LDQsNCwgZHN0LCBzcmMsIGxlbiwgdm9sdW1lCislaWYgQVJDSF9YODZfMzIgJiYgY3B1ZmxhZyhhdngpCisgICAgdmJyb2FkY2FzdHNzICAgeG1tMiwgdm9sdW1lbQorJWVsc2UKKyAgICBtb3ZkICAgICAgICAgICB4bW0yLCB2b2x1bWVkCisgICAgcHNodWZkICAgICAgICAgeG1tMiwgeG1tMiwgMAorJWVuZGlmCisgICAgQ1ZURFEyUEQgICAgICAgICBtMiwgeG1tMgorICAgIG11bHBkICAgICAgICAgICAgbTIsIG0yLCBbcGRfMV8yNTZdCisgICAgbW92YSAgICAgICAgICAgICBtMywgW3BkX2ludDMyX21heF0KKyAgICBsZWEgICAgICAgICAgICBsZW5xLCBbbGVuZCo0LW1tc2l6ZV0KKy5sb29wOgorICAgIENWVERRMlBEICAgICAgICAgbTAsIFtzcmNxK2xlbnEgICAgICAgICBdCisgICAgQ1ZURFEyUEQgICAgICAgICBtMSwgW3NyY3ErbGVucSttbXNpemUvMl0KKyAgICBtdWxwZCAgICAgICAgICAgIG0wLCBtMCwgbTIKKyAgICBtdWxwZCAgICAgICAgICAgIG0xLCBtMSwgbTIKKyAgICBtaW5wZCAgICAgICAgICAgIG0wLCBtMCwgbTMKKyAgICBtaW5wZCAgICAgICAgICAgIG0xLCBtMSwgbTMKKyAgICBjdnRwZDJkcSAgICAgICB4bW0wLCBtMAorICAgIGN2dHBkMmRxICAgICAgIHhtbTEsIG0xCislaWYgY3B1ZmxhZyhhdngpCisgICAgdm1vdmRxYSBbZHN0cStsZW5xICAgICAgICAgXSwgeG1tMAorICAgIHZtb3ZkcWEgW2RzdHErbGVucSttbXNpemUvMl0sIHhtbTEKKyVlbHNlCisgICAgbW92cSAgICBbZHN0cStsZW5xICAgICAgICAgXSwgeG1tMAorICAgIG1vdnEgICAgW2RzdHErbGVucSttbXNpemUvMl0sIHhtbTEKKyVlbmRpZgorICAgIHN1YiAgICAgICAgICAgIGxlbnEsIG1tc2l6ZQorICAgIGpnZSAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCislZGVmaW5lIENWVERRMlBEIGN2dGRxMnBkCitTQ0FMRV9TQU1QTEVTX1MzMgorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCislZGVmaW5lIENWVERRMlBEIHZjdnRkcTJwZAorSU5JVF9ZTU0gYXZ4CitTQ0FMRV9TQU1QTEVTX1MzMgorJWVuZGlmCisldW5kZWYgQ1ZURFEyUEQKKworOyBOT1RFOiBUaGlzIGlzIG5vdCBiaXQtaWRlbnRpY2FsIHdpdGggdGhlIEMgdmVyc2lvbiBiZWNhdXNlIGl0IGNsaXBzIHRvCis7ICAgICAgIFstSU5UX01BWCwgSU5UX01BWF0gaW5zdGVhZCBvZiBbSU5UX01JTiwgSU5UX01BWF0KKworSU5JVF9YTU0gc3NzZTMsIGF0b20KK2NnbG9iYWwgc2NhbGVfc2FtcGxlc19zMzIsIDQsNCw4LCBkc3QsIHNyYywgbGVuLCB2b2x1bWUKKyAgICBtb3ZkICAgICAgICBtNCwgdm9sdW1lbQorICAgIHBzaHVmZCAgICAgIG00LCBtNCwgMAorICAgIG1vdmEgICAgICAgIG01LCBbcHFfMTI4XQorICAgIHB4b3IgICAgICAgIG02LCBtNgorICAgIGxlYSAgICAgICBsZW5xLCBbbGVuZCo0LW1tc2l6ZV0KKy5sb29wOgorICAgIDsgc3JjW2ldID0gYXZfY2xpcGxfaW50MzIoKHNyY1tpXSAqIHZvbHVtZSArIDEyOCkgPj4gOCk7CisgICAgbW92YSAgICAgICAgbTcsIFtzcmNxK2xlbnFdCisgICAgcGFic2QgICAgICAgbTMsIG03CisgICAgcHNodWZkICAgICAgbTAsIG0zLCBxMDEwMAorICAgIHBzaHVmZCAgICAgIG0xLCBtMywgcTAzMDIKKyAgICBwbXVsdWRxICAgICBtMCwgbTQKKyAgICBwbXVsdWRxICAgICBtMSwgbTQKKyAgICBwYWRkcSAgICAgICBtMCwgbTUKKyAgICBwYWRkcSAgICAgICBtMSwgbTUKKyAgICBwc3JscSAgICAgICBtMCwgNworICAgIHBzcmxxICAgICAgIG0xLCA3CisgICAgc2h1ZnBzICAgICAgbTIsIG0wLCBtMSwgcTMxMzEKKyAgICBzaHVmcHMgICAgICBtMCwgbTAsIG0xLCBxMjAyMAorICAgIHBjbXBndGQgICAgIG0yLCBtNgorICAgIHBvciAgICAgICAgIG0wLCBtMgorICAgIHBzcmxkICAgICAgIG0wLCAxCisgICAgcHNpZ25kICAgICAgbTAsIG03CisgICAgbW92YSAgW2RzdHErbGVucV0sIG0wCisgICAgc3ViICAgICAgIGxlbnEsIG1tc2l6ZQorICAgIGpnZSAubG9vcAorICAgIFJFUF9SRVQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvYWZfdm9sdW1lX2luaXQuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvYWZfdm9sdW1lX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2M3ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni9hZl92b2x1bWVfaW5pdC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2FmX3ZvbHVtZS5oIgorCit2b2lkIGZmX3NjYWxlX3NhbXBsZXNfczE2X3NzZTIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZvbHVtZSk7CisKK3ZvaWQgZmZfc2NhbGVfc2FtcGxlc19zMzJfc3NlMih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdm9sdW1lKTsKK3ZvaWQgZmZfc2NhbGVfc2FtcGxlc19zMzJfc3NzZTNfYXRvbSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdm9sdW1lKTsKK3ZvaWQgZmZfc2NhbGVfc2FtcGxlc19zMzJfYXZ4KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZvbHVtZSk7CisKK2F2X2NvbGQgdm9pZCBmZl92b2x1bWVfaW5pdF94ODYoVm9sdW1lQ29udGV4dCAqdm9sKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10ID0gYXZfZ2V0X3BhY2tlZF9zYW1wbGVfZm10KHZvbC0+c2FtcGxlX2ZtdCk7CisKKyAgICBpZiAoc2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNikgeworICAgICAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpICYmIHZvbC0+dm9sdW1lX2kgPCAzMjc2OCkgeworICAgICAgICAgICAgdm9sLT5zY2FsZV9zYW1wbGVzID0gZmZfc2NhbGVfc2FtcGxlc19zMTZfc3NlMjsKKyAgICAgICAgICAgIHZvbC0+c2FtcGxlc19hbGlnbiA9IDg7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIpIHsKKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgdm9sLT5zY2FsZV9zYW1wbGVzID0gZmZfc2NhbGVfc2FtcGxlc19zMzJfc3NlMjsKKyAgICAgICAgICAgIHZvbC0+c2FtcGxlc19hbGlnbiA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykgJiYgY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfQVRPTSkgeworICAgICAgICAgICAgdm9sLT5zY2FsZV9zYW1wbGVzID0gZmZfc2NhbGVfc2FtcGxlc19zMzJfc3NzZTNfYXRvbTsKKyAgICAgICAgICAgIHZvbC0+c2FtcGxlc19hbGlnbiA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX0FWWChjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICB2b2wtPnNjYWxlX3NhbXBsZXMgPSBmZl9zY2FsZV9zYW1wbGVzX3MzMl9hdng7CisgICAgICAgICAgICB2b2wtPnNhbXBsZXNfYWxpZ24gPSA4OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl9ncmFkZnVuLmFzbSBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfZ3JhZGZ1bi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4MWY4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfZ3JhZGZ1bi5hc20KQEAgLTAsMCArMSwxMTAgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIHg4Ni1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciBncmFkZnVuIGZpbHRlcgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK3B3XzdmOiB0aW1lcyA4IGR3IDB4N0YKK3B3X2ZmOiB0aW1lcyA4IGR3IDB4RkYKKworU0VDVElPTiAudGV4dAorCislbWFjcm8gRklMVEVSX0xJTkUgMQorICAgIG1vdmggICAgICAgbTAsIFtyMityMF0KKyAgICBtb3ZoICAgICAgIG0xLCBbcjMrcjBdCisgICAgcHVucGNrbGJ3ICBtMCwgbTcKKyAgICBwdW5wY2tsd2QgIG0xLCBtMQorICAgIHBzbGx3ICAgICAgbTAsIDcKKyAgICBwc3VidyAgICAgIG0xLCBtMAorICAgIFBBQlNXICAgICAgbTIsIG0xCisgICAgcG11bGh1dyAgICBtMiwgbTUKKyAgICBwc3VidyAgICAgIG0yLCBtNgorICAgIHBtaW5zdyAgICAgbTIsIG03CisgICAgcG11bGx3ICAgICBtMiwgbTIKKyAgICBwc2xsdyAgICAgIG0xLCAyCisgICAgcGFkZHcgICAgICBtMCwgJTEKKyAgICBwbXVsaHcgICAgIG0xLCBtMgorICAgIHBhZGR3ICAgICAgbTAsIG0xCisgICAgcHNyYXcgICAgICBtMCwgNworICAgIHBhY2t1c3diICAgbTAsIG0wCisgICAgbW92aCAgW3IxK3IwXSwgbTAKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgZ3JhZGZ1bl9maWx0ZXJfbGluZSwgNiwgNgorICAgIG1vdmggICAgICBtNSwgcjRkCisgICAgcHhvciAgICAgIG03LCBtNworICAgIHBzaHVmdyAgICBtNSwgbTUsMAorICAgIG1vdmEgICAgICBtNiwgW3B3XzdmXQorICAgIG1vdmEgICAgICBtMywgW3I1XQorICAgIG1vdmEgICAgICBtNCwgW3I1KzhdCisubG9vcDoKKyAgICBGSUxURVJfTElORSBtMworICAgIGFkZCAgICAgICByMCwgNAorICAgIGpnZSAuZW5kCisgICAgRklMVEVSX0xJTkUgbTQKKyAgICBhZGQgICAgICAgcjAsIDQKKyAgICBqbCAubG9vcAorLmVuZDoKKyAgICBSRVBfUkVUCisKK0lOSVRfWE1NIHNzc2UzCitjZ2xvYmFsIGdyYWRmdW5fZmlsdGVyX2xpbmUsIDYsIDYsIDgKKyAgICBtb3ZkICAgICAgIG01LCByNGQKKyAgICBweG9yICAgICAgIG03LCBtNworICAgIHBzaHVmbHcgICAgbTUsIG01LCAwCisgICAgbW92YSAgICAgICBtNiwgW3B3XzdmXQorICAgIHB1bnBja2xxZHEgbTUsIG01CisgICAgbW92YSAgICAgICBtNCwgW3I1XQorLmxvb3A6CisgICAgRklMVEVSX0xJTkUgbTQKKyAgICBhZGQgICAgICAgIHIwLCA4CisgICAgamwgLmxvb3AKKyAgICBSRVBfUkVUCisKKyVtYWNybyBCTFVSX0xJTkUgMQorY2dsb2JhbCBncmFkZnVuX2JsdXJfbGluZV8lMSwgNiwgNiwgOAorICAgIG1vdmEgICAgICAgIG03LCBbcHdfZmZdCisubG9vcDoKKyAgICAlMSAgICAgICAgICBtMCwgW3I0K3IwXQorICAgICUxICAgICAgICAgIG0xLCBbcjUrcjBdCisgICAgbW92YSAgICAgICAgbTIsIG0wCisgICAgbW92YSAgICAgICAgbTMsIG0xCisgICAgcHNybHcgICAgICAgbTAsIDgKKyAgICBwc3JsdyAgICAgICBtMSwgOAorICAgIHBhbmQgICAgICAgIG0yLCBtNworICAgIHBhbmQgICAgICAgIG0zLCBtNworICAgIHBhZGR3ICAgICAgIG0wLCBtMQorICAgIHBhZGR3ICAgICAgIG0yLCBtMworICAgIHBhZGR3ICAgICAgIG0wLCBtMgorICAgIHBhZGR3ICAgICAgIG0wLCBbcjIrcjBdCisgICAgbW92YSAgICAgICAgbTEsIFtyMStyMF0KKyAgICBtb3ZhICAgW3IxK3IwXSwgbTAKKyAgICBwc3VidyAgICAgICBtMCwgbTEKKyAgICBtb3ZhICAgW3IzK3IwXSwgbTAKKyAgICBhZGQgICAgICAgICByMCwgMTYKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitCTFVSX0xJTkUgbW92ZHFhCitCTFVSX0xJTkUgbW92ZHF1CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX2dyYWRmdW5faW5pdC5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl9ncmFkZnVuX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjM4YTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl9ncmFkZnVuX2luaXQuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBMb3JlbiBNZXJyaXR0IDxsb3Jlbm1AdS53YXNoaW5ndG9uLmVkdT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvZ3JhZGZ1bi5oIgorCit2b2lkIGZmX2dyYWRmdW5fZmlsdGVyX2xpbmVfbW14ZXh0KGludHB0cl90IHgsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqZGMsIGludCB0aHJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpkaXRoZXJzKTsKK3ZvaWQgZmZfZ3JhZGZ1bl9maWx0ZXJfbGluZV9zc3NlMyhpbnRwdHJfdCB4LCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqZGMsIGludCB0aHJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKmRpdGhlcnMpOworCit2b2lkIGZmX2dyYWRmdW5fYmx1cl9saW5lX21vdmRxYV9zc2UyKGludHB0cl90IHgsIHVpbnQxNl90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpidWYxLCB1aW50MTZfdCAqZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIpOwordm9pZCBmZl9ncmFkZnVuX2JsdXJfbGluZV9tb3ZkcXVfc3NlMihpbnRwdHJfdCB4LCB1aW50MTZfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqYnVmMSwgdWludDE2X3QgKmRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyKTsKKworI2lmIEhBVkVfWUFTTQorc3RhdGljIHZvaWQgZ3JhZGZ1bl9maWx0ZXJfbGluZV9tbXhleHQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCB0aHJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqZGl0aGVycykKK3sKKyAgICBpbnRwdHJfdCB4OworICAgIGlmICh3aWR0aCAmIDMpIHsKKyAgICAgICAgeCA9IHdpZHRoICYgfjM7CisgICAgICAgIGZmX2dyYWRmdW5fZmlsdGVyX2xpbmVfYyhkc3QgKyB4LCBzcmMgKyB4LCBkYyArIHggLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggLSB4LCB0aHJlc2gsIGRpdGhlcnMpOworICAgICAgICB3aWR0aCA9IHg7CisgICAgfQorICAgIHggPSAtd2lkdGg7CisgICAgZmZfZ3JhZGZ1bl9maWx0ZXJfbGluZV9tbXhleHQoeCwgZHN0ICsgd2lkdGgsIHNyYyArIHdpZHRoLCBkYyArIHdpZHRoIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsIGRpdGhlcnMpOworfQorCitzdGF0aWMgdm9pZCBncmFkZnVuX2ZpbHRlcl9saW5lX3Nzc2UzKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50MTZfdCAqZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IHRocmVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKmRpdGhlcnMpCit7CisgICAgaW50cHRyX3QgeDsKKyAgICBpZiAod2lkdGggJiA3KSB7CisgICAgICAgIC8vIGNvdWxkIGJlIDEwJSBmYXN0ZXIgaWYgSSBzb21laG93IGVsaW1pbmF0ZWQgdGhpcworICAgICAgICB4ID0gd2lkdGggJiB+NzsKKyAgICAgICAgZmZfZ3JhZGZ1bl9maWx0ZXJfbGluZV9jKGRzdCArIHgsIHNyYyArIHgsIGRjICsgeCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAtIHgsIHRocmVzaCwgZGl0aGVycyk7CisgICAgICAgIHdpZHRoID0geDsKKyAgICB9CisgICAgeCA9IC13aWR0aDsKKyAgICBmZl9ncmFkZnVuX2ZpbHRlcl9saW5lX3Nzc2UzKHgsIGRzdCArIHdpZHRoLCBzcmMgKyB3aWR0aCwgZGMgKyB3aWR0aCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2gsIGRpdGhlcnMpOworfQorCitzdGF0aWMgdm9pZCBncmFkZnVuX2JsdXJfbGluZV9zc2UyKHVpbnQxNl90ICpkYywgdWludDE2X3QgKmJ1ZiwgY29uc3QgdWludDE2X3QgKmJ1ZjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19saW5lc2l6ZSwgaW50IHdpZHRoKQoreworICAgIGludHB0cl90IHggPSAtMiAqIHdpZHRoOworICAgIGlmICgoKGludHB0cl90KSBzcmMgfCBzcmNfbGluZXNpemUpICYgMTUpCisgICAgICAgIGZmX2dyYWRmdW5fYmx1cl9saW5lX21vdmRxdV9zc2UyKHgsIGJ1ZiArIHdpZHRoLCBidWYxICsgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjICsgd2lkdGgsIHNyYyArIHdpZHRoICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgd2lkdGggKiAyICsgc3JjX2xpbmVzaXplKTsKKyAgICBlbHNlCisgICAgICAgIGZmX2dyYWRmdW5fYmx1cl9saW5lX21vdmRxYV9zc2UyKHgsIGJ1ZiArIHdpZHRoLCBidWYxICsgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjICsgd2lkdGgsIHNyYyArIHdpZHRoICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgd2lkdGggKiAyICsgc3JjX2xpbmVzaXplKTsKK30KKyNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKworYXZfY29sZCB2b2lkIGZmX2dyYWRmdW5faW5pdF94ODYoR3JhZEZ1bkNvbnRleHQgKmdmKQoreworI2lmIEhBVkVfWUFTTQorICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpCisgICAgICAgIGdmLT5maWx0ZXJfbGluZSA9IGdyYWRmdW5fZmlsdGVyX2xpbmVfbW14ZXh0OworICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKQorICAgICAgICBnZi0+ZmlsdGVyX2xpbmUgPSBncmFkZnVuX2ZpbHRlcl9saW5lX3Nzc2UzOworCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgZ2YtPmJsdXJfbGluZSA9IGdyYWRmdW5fYmx1cl9saW5lX3NzZTI7CisjZW5kaWYgLyogSEFWRV9ZQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX2hxZG4zZC5hc20gYi9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX2hxZG4zZC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxMTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfaHFkbjNkLmFzbQpAQCAtMCwwICsxLDEwNiBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogQ29weXJpZ2h0IChjKSAyMDEyIExvcmVuIE1lcnJpdHQKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OIC50ZXh0CisKKyVtYWNybyBMT1dQQVNTIDMgOyBwcmV2c2FtcGxlLCBjdXJzYW1wbGUsIGx1dAorICAgIHN1YiAgICAlMXEsICUycQorJWlmIGx1dF9iaXRzICE9IDgKKyAgICBzYXIgICAgJTFxLCA4LWx1dF9iaXRzCislZW5kaWYKKyAgICBtb3ZzeCAgJTFkLCB3b3JkIFslM3ErJTFxKjJdCisgICAgYWRkICAgICUxZCwgJTJkCislZW5kbWFjcm8KKworJW1hY3JvIExPQUQgMyA7IGRzdHJlZywgeCwgYml0ZGVwdGgKKyVpZiAlMyA9PSA4CisgICAgbW92enggICUxLCBieXRlIFtzcmNxKyUyXQorJWVsc2UKKyAgICBtb3Z6eCAgJTEsIHdvcmQgW3NyY3ErKCUyKSoyXQorJWVuZGlmCislaWYgJTMgIT0gMTYKKyAgICBzaGwgICAgJTEsIDE2LSUzCisgICAgYWRkICAgICUxLCAoMTw8KDE1LSUzKSktMQorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEhRRE4zRF9ST1cgMSA7IGJpdGRlcHRoCislaWYgQVJDSF9YODZfNjQKK2NnbG9iYWwgaHFkbjNkX3Jvd18lMV94ODYsIDcsMTAsMCwgc3JjLCBkc3QsIGxpbmVhbnQsIGZyYW1lYW50LCB3aWR0aCwgc3BhdGlhbCwgdGVtcG9yYWwsIHBpeGVsYW50LCB0MCwgdDEKKyVlbHNlCitjZ2xvYmFsIGhxZG4zZF9yb3dfJTFfeDg2LCA3LDcsMCwgc3JjLCBkc3QsIGxpbmVhbnQsIGZyYW1lYW50LCB3aWR0aCwgc3BhdGlhbCwgdGVtcG9yYWwKKyVlbmRpZgorICAgICVhc3NpZ24gYnl0ZWRlcHRoICglMSs3KT4+MworICAgICVhc3NpZ24gbHV0X2JpdHMgNCs0KiglMS8xNikKKyAgICBkZWMgICAgd2lkdGhxCisgICAgbGVhICAgIHNyY3EsIFtzcmNxK3dpZHRocSpieXRlZGVwdGhdCisgICAgbGVhICAgIGRzdHEsIFtkc3RxK3dpZHRocSpieXRlZGVwdGhdCisgICAgbGVhICAgIGZyYW1lYW50cSwgW2ZyYW1lYW50cSt3aWR0aHEqMl0KKyAgICBsZWEgICAgbGluZWFudHEsICBbbGluZWFudHErd2lkdGhxKjJdCisgICAgbmVnICAgIHdpZHRocQorICAgICVkZWZpbmUgeHEgd2lkdGhxCislaWYgQVJDSF9YODZfMzIKKyAgICBtb3YgICAgZHN0bXAsIGRzdHEKKyAgICBtb3YgICAgc3JjbXAsIHNyY3EKKyAgICBtb3YgICAgZnJhbWVhbnRtcCwgZnJhbWVhbnRxCisgICAgbW92ICAgIGxpbmVhbnRtcCwgIGxpbmVhbnRxCisgICAgJWRlZmluZSBkc3RxIHIwCisgICAgJWRlZmluZSBmcmFtZWFudHEgcjAKKyAgICAlZGVmaW5lIGxpbmVhbnRxICByMAorICAgICVkZWZpbmUgcGl4ZWxhbnRxIHIxCisgICAgJWRlZmluZSBwaXhlbGFudGQgcjFkCisgICAgREVDTEFSRV9SRUdfVE1QIDIsMworJWVuZGlmCisgICAgTE9BRCAgIHBpeGVsYW50ZCwgeHEsICUxCitBTElHTiAxNgorLmxvb3A6CisgICAgbW92aWZuaWRuIHNyY3EsIHNyY21wCisgICAgTE9BRCAgICAgIHQwZCwgeHErMSwgJTEgOyBza2lwIG9uIHRoZSBsYXN0IGl0ZXJhdGlvbiB0byBhdm9pZCBvdmVycmVhZAorLmxvb3AyOgorICAgIG1vdmlmbmlkbiBsaW5lYW50cSwgbGluZWFudG1wCisgICAgbW92enggICAgIHQxZCwgd29yZCBbbGluZWFudHEreHEqMl0KKyAgICBMT1dQQVNTICAgdDEsIHBpeGVsYW50LCBzcGF0aWFsCisgICAgbW92ICAgICAgIFtsaW5lYW50cSt4cSoyXSwgdDF3CisgICAgTE9XUEFTUyAgIHBpeGVsYW50LCB0MCwgc3BhdGlhbAorICAgIG1vdmlmbmlkbiBmcmFtZWFudHEsIGZyYW1lYW50bXAKKyAgICBtb3Z6eCAgICAgdDBkLCB3b3JkIFtmcmFtZWFudHEreHEqMl0KKyAgICBMT1dQQVNTICAgdDAsIHQxLCB0ZW1wb3JhbAorICAgIG1vdiAgICAgICBbZnJhbWVhbnRxK3hxKjJdLCB0MHcKKyAgICBtb3ZpZm5pZG4gZHN0cSwgZHN0bXAKKyVpZiAlMSAhPSAxNgorICAgIHNociAgICB0MGQsIDE2LSUxIDsgY291bGQgZWxpbWluYXRlIHRoaXMgYnkgc3RvcmluZyBmcm9tIHQwaCwgYnV0IG9ubHkgd2l0aCBzb21lIGNvbnRyYWludHMgb24gcmVnaXN0ZXIgYWxsb2NhdGlvbgorJWVuZGlmCislaWYgJTEgPT0gOAorICAgIG1vdiAgICBbZHN0cSt4cV0sIHQwYgorJWVsc2UKKyAgICBtb3YgICAgW2RzdHEreHEqMl0sIHQwdworJWVuZGlmCisgICAgaW5jICAgIHhxCisgICAgamwgLmxvb3AKKyAgICBqZSAubG9vcDIKKyAgICBSRVBfUkVUCislZW5kbWFjcm8gOyBIUUROM0RfUk9XCisKK0hRRE4zRF9ST1cgOAorSFFETjNEX1JPVyA5CitIUUROM0RfUk9XIDEwCitIUUROM0RfUk9XIDE2CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX2hxZG4zZF9pbml0LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX2hxZG4zZF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzOTE2YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfaHFkbjNkX2luaXQuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIExvcmVuIE1lcnJpdHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2ZmlsdGVyL3ZmX2hxZG4zZC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCit2b2lkIGZmX2hxZG4zZF9yb3dfOF94ODYodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIHVpbnQxNl90ICpsaW5lX2FudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZnJhbWVfYW50LCBwdHJkaWZmX3QgdywgaW50MTZfdCAqc3BhdGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICp0ZW1wb3JhbCk7Cit2b2lkIGZmX2hxZG4zZF9yb3dfOV94ODYodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIHVpbnQxNl90ICpsaW5lX2FudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZnJhbWVfYW50LCBwdHJkaWZmX3QgdywgaW50MTZfdCAqc3BhdGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICp0ZW1wb3JhbCk7Cit2b2lkIGZmX2hxZG4zZF9yb3dfMTBfeDg2KHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCB1aW50MTZfdCAqbGluZV9hbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpmcmFtZV9hbnQsIHB0cmRpZmZfdCB3LCBpbnQxNl90ICpzcGF0aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICp0ZW1wb3JhbCk7Cit2b2lkIGZmX2hxZG4zZF9yb3dfMTZfeDg2KHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCB1aW50MTZfdCAqbGluZV9hbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpmcmFtZV9hbnQsIHB0cmRpZmZfdCB3LCBpbnQxNl90ICpzcGF0aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICp0ZW1wb3JhbCk7CisKK2F2X2NvbGQgdm9pZCBmZl9ocWRuM2RfaW5pdF94ODYoSFFETjNEQ29udGV4dCAqaHFkbjNkKQoreworI2lmIEhBVkVfWUFTTQorICAgIGhxZG4zZC0+ZGVub2lzZV9yb3dbOF0gID0gZmZfaHFkbjNkX3Jvd184X3g4NjsKKyAgICBocWRuM2QtPmRlbm9pc2Vfcm93WzldICA9IGZmX2hxZG4zZF9yb3dfOV94ODY7CisgICAgaHFkbjNkLT5kZW5vaXNlX3Jvd1sxMF0gPSBmZl9ocWRuM2Rfcm93XzEwX3g4NjsKKyAgICBocWRuM2QtPmRlbm9pc2Vfcm93WzE2XSA9IGZmX2hxZG4zZF9yb3dfMTZfeDg2OworI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl9pZGV0LmFzbSBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfaWRldC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3ZTYzZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfaWRldC5hc20KQEAgLTAsMCArMSwxNzAgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2LW9wdGltaXplZCBmdW5jdGlvbnMgZm9yIGlkZXQgZmlsdGVyCis7KgorOyogQ29weXJpZ2h0IChDKSAyMDE0IFBhc2NhbCBNYXNzaW1pbm8gKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorOyogQ29weXJpZ2h0IChjKSAyMDE0IE5laWwgQmlya2JlY2sgKGJpcmtiZWNrQGdvb2dsZS5jb20pCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9URVhUCisKKzsgSW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIDgtYnl0ZXMgYXQgYSB0aW1lIHVzaW5nIHNpbmdsZS13b3JkIG9wZXJhdGlvbnMuCislbWFjcm8gSURFVF9GSUxURVJfTElORSAxCitJTklUX01NWCAlMQorY2dsb2JhbCBpZGV0X2ZpbHRlcl9saW5lLCA0LCA1LCAwLCBhLCBiLCBjLCB3aWR0aCwgaW5kZXgKKyAgICB4b3IgICAgICAgaW5kZXhxLCBpbmRleHEKKyVkZWZpbmUgICBtX3plcm8gbTIKKyVkZWZpbmUgICBtX3N1bSAgbTUKKyAgICBweG9yICAgICAgbV9zdW0sIG1fc3VtCisgICAgcHhvciAgICAgIG1femVybywgbV96ZXJvCisKKy5sb29wOgorICAgIG1vdnUgICAgICBtMCwgW2FxICsgaW5kZXhxKjFdCisgICAgcHVucGNraGJ3IG0xLCBtMCwgbV96ZXJvCisgICAgcHVucGNrbGJ3IG0wLCBtX3plcm8KKworICAgIG1vdnUgICAgICBtMywgW2NxICsgaW5kZXhxKjFdCisgICAgcHVucGNraGJ3IG00LCBtMywgbV96ZXJvCisgICAgcHVucGNrbGJ3IG0zLCBtX3plcm8KKworICAgIHBhZGRzdyAgICBtMSwgbTQKKyAgICBwYWRkc3cgICAgbTAsIG0zCisKKyAgICBtb3Z1ICAgICAgbTMsIFticSArIGluZGV4cSoxXQorICAgIHB1bnBja2hidyBtNCwgbTMsIG1femVybworICAgIHB1bnBja2xidyBtMywgbV96ZXJvCisKKyAgICBwYWRkdyAgICAgbTQsIG00CisgICAgcGFkZHcgICAgIG0zLCBtMworICAgIHBzdWJzdyAgICBtMSwgbTQKKyAgICBwc3Vic3cgICAgbTAsIG0zCisKKyAgICBBQlMyICAgICAgbTEsIG0wLCBtNCwgbTMKKworICAgIHBhZGR3ICAgICBtMCwgbTEKKyAgICBwdW5wY2tod2QgbTEsIG0wLCBtX3plcm8KKyAgICBwdW5wY2tsd2QgbTAsIG1femVybworCisgICAgcGFkZGQgICAgIG0wLCBtMQorICAgIHBhZGRkICAgICBtX3N1bSwgbTAKKworICAgIGFkZCAgICAgICBpbmRleHEsIDB4OAorICAgIENNUCAgICAgICB3aWR0aGQsIGluZGV4ZAorICAgIGpnICAgICAgICAubG9vcAorCisgICAgSEFEREQgICAgIG1fc3VtLCBtMAorICAgIG1vdmQgICAgICBlYXgsIG1fc3VtCisgICAgUkVUCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzMyCitJREVUX0ZJTFRFUl9MSU5FIG1teGV4dAorSURFVF9GSUxURVJfTElORSBtbXgKKyVlbmRpZgorCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IDE2Yml0IGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyA0LzgtcGl4ZWxzIGF0IGEgdGltZQorCislbWFjcm8gUEFCU19ESUZGX1dEIDMgICAgOyBhLCBiLCBqdW5rICAgLCBvdXRwdXQ9YQorICBwc3VidXN3ICAgJTMsICUyLCAlMQorICBwc3VidXN3ICAgJTEsICUyCisgIHBvciAgICAgICAlMSwgJTMKKworICBtb3ZhICAgICAgJTIsICUxCisgIHB1bnBja2x3ZCAlMSwgbV96ZXJvCisgIHB1bnBja2h3ZCAlMiwgbV96ZXJvCisgIHBhZGRkICAgICAlMSwgJTIKKyVlbmRtYWNybworCislbWFjcm8gSURFVF9GSUxURVJfTElORV8xNkJJVCAxICAgOyAlMT1pbmNyZW1lbnQgKDQgb3IgOCB3b3JkcykKK2NnbG9iYWwgaWRldF9maWx0ZXJfbGluZV8xNmJpdCwgNCwgNSwgOCwgYSwgYiwgYywgd2lkdGgsIGluZGV4CisgICAgeG9yICAgICAgIGluZGV4cSwgaW5kZXhxCislZGVmaW5lIG1femVybyBtMQorJWRlZmluZSBtX3N1bSAgbTAKKyAgICBweG9yICAgICAgbV9zdW0sIG1fc3VtCisgICAgcHhvciAgICAgIG1femVybywgbV96ZXJvCisKKy5sb29wXzE2Yml0OgorICAgIG1vdnUgICAgICBtMiwgW2JxICsgaW5kZXhxICogMl0gIDsgQgorICAgIG1vdnUgICAgICBtMywgW2FxICsgaW5kZXhxICogMl0gIDsgQQorICAgIG1vdmEgICAgICBtNiwgbTIKKyAgICBwc3VidXN3ICAgbTUsIG0yLCBtMyAgICAgICAgICAgICA7IGJhCisKKyAgICBtb3Z1ICAgICAgbTQsIFtjcSArIGluZGV4cSAqIDJdICA7IEMKKyAgICBhZGQgICAgICAgaW5kZXhxLCAlMQorICAgIHBzdWJ1c3cgICBtMywgbTIgICAgICAgICAgICAgICAgIDsgYWIKKyAgICBDTVAgICAgICAgaW5kZXhkLCB3aWR0aGQKKworICAgIHBzdWJ1c3cgICBtNiwgbTQgICAgICAgICAgICAgICAgIDsgYmMKKyAgICBwc3VidXN3ICAgbTQsIG0yICAgICAgICAgICAgICAgICA7IGNiCisKKyAgICBQQUJTX0RJRkZfV0QgICBtMywgbTYsIG03ICAgICAgICA7IHxhYiAtIGJjfAorICAgIFBBQlNfRElGRl9XRCAgIG01LCBtNCwgbTcgICAgICAgIDsgfGJhIC0gY2J8CisgICAgcGFkZGQgICAgICAgICAgbV9zdW0sIG0zCisgICAgcGFkZGQgICAgICAgICAgbV9zdW0sIG01CisgICAgamwgICAgICAgIC5sb29wXzE2Yml0CisKKyAgICBIQURERCAgICAgbV9zdW0sIG0yCisgICAgbW92ZCAgICAgIGVheCwgbV9zdW0KKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitJREVUX0ZJTFRFUl9MSU5FXzE2QklUIDgKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggbW14CitJREVUX0ZJTFRFUl9MSU5FXzE2QklUIDQKKyVlbmRpZgorCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IFNTRTIgOC1iaXQgaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIDE2LWJ5dGVzIGF0IGEgdGltZToKKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBpZGV0X2ZpbHRlcl9saW5lLCA0LCA2LCA3LCBhLCBiLCBjLCB3aWR0aCwgaW5kZXgsIHRvdGFsCisgICAgeG9yICAgICAgIGluZGV4cSwgaW5kZXhxCisgICAgcHhvciAgICAgIG0wLCBtMAorICAgIHB4b3IgICAgICBtMSwgbTEKKworLnNzZTJfbG9vcDoKKyAgICBtb3Z1ICAgICAgbTIsIFticSArIGluZGV4cSoxXSAgOyBCCisgICAgbW92dSAgICAgIG0zLCBbYXEgKyBpbmRleHEqMV0gIDsgQQorICAgIG1vdmEgICAgICBtNiwgbTIKKyAgICBtb3ZhICAgICAgbTQsIG0zCisgICAgcHN1YnVzYiAgIG01LCBtMiwgbTMgICAgICAgICAgIDsgYmEKKworICAgIG1vdnUgICAgICBtMywgW2NxICsgaW5kZXhxKjFdICA7IEMKKyAgICBhZGQgICAgICAgaW5kZXhxLCAweDEwCisgICAgcHN1YnVzYiAgIG00LCBtMiAgICAgICAgICAgICAgIDsgYWIKKyAgICBDTVAgICAgICAgaW5kZXhkLCB3aWR0aGQKKworICAgIHBzdWJ1c2IgICBtNiwgbTMgICAgICAgICAgICAgICA7IGJjCisgICAgcHN1YnVzYiAgIG0zLCBtMiAgICAgICAgICAgICAgIDsgY2IKKworICAgIHBzYWRidyAgICBtNCwgbTYgICAgICAgICAgICAgICA7IHxhYiAtIGJjfAorICAgIHBhZGRxICAgICBtMCwgbTQKKyAgICBwc2FkYncgICAgbTUsIG0zICAgICAgICAgICAgICAgOyB8YmEgLSBjYnwKKyAgICBwYWRkcSAgICAgbTEsIG01CisgICAgamwgICAgICAgLnNzZTJfbG9vcAorCisgICAgcGFkZHEgICAgIG0wLCBtMQorICAgIG1vdmhscHMgICBtMSwgbTAKKyAgICBwYWRkcSAgICAgbTAsIG0xCisgICAgbW92ZCAgICAgIGVheCwgbTAKKyAgICBSRVQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfaWRldF9pbml0LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX2lkZXRfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNDdjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX2lkZXRfaW5pdC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvdmZfaWRldC5oIgorCisjaWYgSEFWRV9ZQVNNCisKKy8qIGRlY2xhcmVzIG1haW4gY2FsbGFibGUgaWRldF9maWx0ZXJfbGluZV97bW14LG1teGV4dCxzc2UyfSgpICovCisjZGVmaW5lIEZVTkNfTUFJTl9ERUNMKEtJTkQsIFNQQU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ludCBmZl9pZGV0X2ZpbHRlcl9saW5lXyMjS0lORChjb25zdCB1aW50OF90ICphLCBjb25zdCB1aW50OF90ICpiLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmMsIGludCB3KTsgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IGlkZXRfZmlsdGVyX2xpbmVfIyNLSU5EKGNvbnN0IHVpbnQ4X3QgKmEsIGNvbnN0IHVpbnQ4X3QgKmIsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYywgaW50IHcpIHsgICAgICAgICAgICAgXAorICAgIGludCBzdW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGxlZnRfb3ZlciA9IHcgJiAoU1BBTiAtIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3IC09IGxlZnRfb3ZlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh3ID4gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN1bSArPSBmZl9pZGV0X2ZpbHRlcl9saW5lXyMjS0lORChhLCBiLCBjLCB3KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobGVmdF9vdmVyID4gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdW0gKz0gZmZfaWRldF9maWx0ZXJfbGluZV9jKGEgKyB3LCBiICsgdywgYyArIHcsIGxlZnRfb3Zlcik7ICAgICBcCisgICAgcmV0dXJuIHN1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIEZVTkNfTUFJTl9ERUNMXzE2Yml0KEtJTkQsIFNQQU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50IGZmX2lkZXRfZmlsdGVyX2xpbmVfMTZiaXRfIyNLSU5EKGNvbnN0IHVpbnQxNl90ICphLCBjb25zdCB1aW50MTZfdCAqYiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqYywgaW50IHcpOyAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IGlkZXRfZmlsdGVyX2xpbmVfMTZiaXRfIyNLSU5EKGNvbnN0IHVpbnQxNl90ICphLCBjb25zdCB1aW50MTZfdCAqYiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqYywgaW50IHcpIHsgICAgICAgICAgIFwKKyAgICBpbnQgc3VtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGxlZnRfb3ZlciA9IHcgJiAoU1BBTiAtIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHcgLT0gbGVmdF9vdmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodyA+IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN1bSArPSBmZl9pZGV0X2ZpbHRlcl9saW5lXzE2Yml0XyMjS0lORChhLCBiLCBjLCB3KTsgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChsZWZ0X292ZXIgPiAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3VtICs9IGZmX2lkZXRfZmlsdGVyX2xpbmVfY18xNmJpdChhICsgdywgYiArIHcsIGMgKyB3LCBsZWZ0X292ZXIpOyAgICBcCisgICAgcmV0dXJuIHN1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitGVU5DX01BSU5fREVDTChzc2UyLCAxNikKK0ZVTkNfTUFJTl9ERUNMXzE2Yml0KHNzZTIsIDgpCisjaWYgQVJDSF9YODZfMzIKK0ZVTkNfTUFJTl9ERUNMKG1teCwgOCkKK0ZVTkNfTUFJTl9ERUNMKG1teGV4dCwgOCkKK0ZVTkNfTUFJTl9ERUNMXzE2Yml0KG1teCwgNCkKKyNlbmRpZgorCisjZW5kaWYKK2F2X2NvbGQgdm9pZCBmZl9pZGV0X2luaXRfeDg2KElERVRDb250ZXh0ICppZGV0LCBpbnQgZm9yXzE2YikKK3sKKyNpZiBIQVZFX1lBU00KKyAgICBjb25zdCBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisjaWYgQVJDSF9YODZfMzIKKyAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgaWRldC0+ZmlsdGVyX2xpbmUgPSBmb3JfMTZiID8gKGZmX2lkZXRfZmlsdGVyX2Z1bmMpaWRldF9maWx0ZXJfbGluZV8xNmJpdF9tbXggOiBpZGV0X2ZpbHRlcl9saW5lX21teDsKKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlkZXQtPmZpbHRlcl9saW5lID0gZm9yXzE2YiA/IChmZl9pZGV0X2ZpbHRlcl9mdW5jKWlkZXRfZmlsdGVyX2xpbmVfMTZiaXRfbW14IDogaWRldF9maWx0ZXJfbGluZV9tbXhleHQ7CisgICAgfQorI2VuZGlmIC8vIEFSQ0hfeDg2XzMyCisKKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlkZXQtPmZpbHRlcl9saW5lID0gZm9yXzE2YiA/IChmZl9pZGV0X2ZpbHRlcl9mdW5jKWlkZXRfZmlsdGVyX2xpbmVfMTZiaXRfc3NlMiA6IGlkZXRfZmlsdGVyX2xpbmVfc3NlMjsKKyAgICB9CisjZW5kaWYgLy8gSEFWRV9ZQVNNCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX2ludGVybGFjZS5hc20gYi9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX2ludGVybGFjZS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzZGQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfaW50ZXJsYWNlLmFzbQpAQCAtMCwwICsxLDY1IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIHg4Ni1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciBpbnRlcmxhY2UgZmlsdGVyCis7KgorOyogQ29weXJpZ2h0IChDKSAyMDE0IEtpZXJhbiBLdW5oeWEgPGtpZXJhbmtAb2JlLnR2PgorOyogQ29weXJpZ2h0IChjKSAyMDE0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzsqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorOyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworOyogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzsqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorCitTRUNUSU9OIC50ZXh0CisKKyVtYWNybyBMT1dQQVNTX0xJTkUgMAorY2dsb2JhbCBsb3dwYXNzX2xpbmUsIDUsIDUsIDcKKyAgICBhZGQgcjAsIHIxCisgICAgYWRkIHIyLCByMQorICAgIGFkZCByMywgcjEKKyAgICBhZGQgcjQsIHIxCisgICAgbmVnIHIxCisKKyAgICBwY21wZXFiIG02LCBtNgorCisubG9vcAorICAgIG1vdmEgbTAsIFtyMytyMV0KKyAgICBtb3ZhIG0xLCBbcjMrcjErbW1zaXplXQorICAgIHBhdmdiIG0wLCBbcjQrcjFdCisgICAgcGF2Z2IgbTEsIFtyNCtyMSttbXNpemVdCisgICAgcHhvciBtMCwgbTYKKyAgICBweG9yIG0xLCBtNgorICAgIHB4b3IgbTIsIG02LCBbcjIrcjFdCisgICAgcHhvciBtMywgbTYsIFtyMityMSttbXNpemVdCisgICAgcGF2Z2IgbTAsIG0yCisgICAgcGF2Z2IgbTEsIG0zCisgICAgcHhvciBtMCwgbTYKKyAgICBweG9yIG0xLCBtNgorICAgIG1vdmEgW3IwK3IxXSwgbTAKKyAgICBtb3ZhIFtyMCtyMSttbXNpemVdLCBtMQorCisgICAgYWRkIHIxLCAyKm1tc2l6ZQorICAgIGpsIC5sb29wCitSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorTE9XUEFTU19MSU5FCisKK0lOSVRfWE1NIGF2eAorTE9XUEFTU19MSU5FCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX2ludGVybGFjZV9pbml0LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX2ludGVybGFjZV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlZTQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfaW50ZXJsYWNlX2luaXQuYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEtpZXJhbiBLdW5oeWEgPGtpZXJhbmtAb2JlLnR2PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKworI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2ludGVybGFjZS5oIgorCit2b2lkIGZmX2xvd3Bhc3NfbGluZV9zc2UyKHVpbnQ4X3QgKmRzdHAsIHB0cmRpZmZfdCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9hYm92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9iZWxvdyk7Cit2b2lkIGZmX2xvd3Bhc3NfbGluZV9hdnggKHVpbnQ4X3QgKmRzdHAsIHB0cmRpZmZfdCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9hYm92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9iZWxvdyk7CisKK2F2X2NvbGQgdm9pZCBmZl9pbnRlcmxhY2VfaW5pdF94ODYoSW50ZXJsYWNlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgcy0+bG93cGFzc19saW5lID0gZmZfbG93cGFzc19saW5lX3NzZTI7CisgICAgaWYgKEVYVEVSTkFMX0FWWChjcHVfZmxhZ3MpKQorICAgICAgICBzLT5sb3dwYXNzX2xpbmUgPSBmZl9sb3dwYXNzX2xpbmVfYXZ4OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl9ub2lzZS5jIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl9ub2lzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhODZjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX25vaXNlLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2ZmlsdGVyL3ZmX25vaXNlLmgiCisKKyNpZiBIQVZFX0lOTElORV9BU00KK3N0YXRpYyB2b2lkIGxpbmVfbm9pc2VfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpub2lzZSwgaW50IGxlbiwgaW50IHNoaWZ0KQoreworICAgIHg4Nl9yZWcgbW14X2xlbj0gbGVuICYgKH43KTsKKyAgICBub2lzZSArPSBzaGlmdDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibW92ICUzLCAlJSJSRUdfYSIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBjbXBlcWIgJSVtbTcsICUlbW03ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsdyAkMTUsICUlbW03ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Nzd2IgJSVtbTcsICUlbW03ICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAoJTAsICUlIlJFR19hIiksICUlbW0wICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMSAgICAgXG5cdCIKKyAgICAgICAgICAgICJweG9yICUlbW03LCAlJW1tMCAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHNiICUlbW0xLCAlJW1tMCAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB4b3IgJSVtbTcsICUlbW0wICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUlbW0wLCAoJTIsICUlIlJFR19hIikgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICQ4LCAlJSJSRUdfYSIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIiBqcyAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6ICJyIiAoc3JjK21teF9sZW4pLCAiciIgKG5vaXNlK21teF9sZW4pLCAiciIgKGRzdCttbXhfbGVuKSwgImciICgtbW14X2xlbikKKyAgICAgICAgICAgIDogIiUiUkVHX2EKKyAgICApOworICAgIGlmIChtbXhfbGVuICE9IGxlbikKKyAgICAgICAgZmZfbGluZV9ub2lzZV9jKGRzdCttbXhfbGVuLCBzcmMrbW14X2xlbiwgbm9pc2UrbW14X2xlbiwgbGVuLW1teF9sZW4sIDApOworfQorCisjaWYgSEFWRV82UkVHUworc3RhdGljIHZvaWQgbGluZV9ub2lzZV9hdmdfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBjb25zdCBpbnQ4X3QgKiBjb25zdCAqc2hpZnQpCit7CisgICAgeDg2X3JlZyBtbXhfbGVuID0gbGVuICYgKH43KTsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibW92ICU1LCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAoJTEsICUlIlJFR19hIiksICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAoJTAsICUlIlJFR19hIiksICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGIgKCUyLCAlJSJSRUdfYSIpLCAlJW1tMSAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGIgKCUzLCAlJSJSRUdfYSIpLCAlJW1tMSAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMSwgJSVtbTMgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW0wLCAlJW1tMCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJ3ICUlbW0yLCAlJW1tMiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW0xLCAlJW1tMSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJ3ICUlbW0zLCAlJW1tMyAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGh3ICUlbW0wLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGh3ICUlbW0yLCAlJW1tMyAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHcgJSVtbTEsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0zICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHcgJSVtbTAsICUlbW0xICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHcgJSVtbTIsICUlbW0zICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHcgJDgsICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHcgJDgsICUlbW0zICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Vzd2IgJSVtbTMsICUlbW0xICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMSwgKCU0LCAlJSJSRUdfYSIpICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICQ4LCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiIGpzIDFiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6OiAiciIgKHNyYyttbXhfbGVuKSwgInIiIChzaGlmdFswXSttbXhfbGVuKSwgInIiIChzaGlmdFsxXSttbXhfbGVuKSwgInIiIChzaGlmdFsyXSttbXhfbGVuKSwKKyAgICAgICAgICAgICAgICJyIiAoZHN0K21teF9sZW4pLCAiZyIgKC1tbXhfbGVuKQorICAgICAgICAgICAgOiAiJSJSRUdfYQorICAgICAgICApOworCisgICAgaWYgKG1teF9sZW4gIT0gbGVuKXsKKyAgICAgICAgY29uc3QgaW50OF90ICpzaGlmdDJbM10gPSB7IHNoaWZ0WzBdK21teF9sZW4sIHNoaWZ0WzFdK21teF9sZW4sIHNoaWZ0WzJdK21teF9sZW4gfTsKKyAgICAgICAgZmZfbGluZV9ub2lzZV9hdmdfYyhkc3QrbW14X2xlbiwgc3JjK21teF9sZW4sIGxlbi1tbXhfbGVuLCBzaGlmdDIpOworICAgIH0KK30KKyNlbmRpZiAvKiBIQVZFXzZSRUdTICovCisKK3N0YXRpYyB2b2lkIGxpbmVfbm9pc2VfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpub2lzZSwgaW50IGxlbiwgaW50IHNoaWZ0KQoreworICAgIHg4Nl9yZWcgbW14X2xlbiA9IGxlbiAmICh+Nyk7CisgICAgbm9pc2UgKz0gc2hpZnQ7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgIm1vdiAlMywgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGNtcGVxYiAlJW1tNywgJSVtbTcgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsdyAkMTUsICUlbW03ICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2tzc3diICUlbW03LCAlJW1tNyAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIpLCAlJW1tMCAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAoJTEsICUlIlJFR19hIiksICUlbW0xICAgICAgXG5cdCIKKyAgICAgICAgICAgICJweG9yICUlbW03LCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRzYiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHhvciAlJW1tNywgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZudHEgJSVtbTAsICglMiwgJSUiUkVHX2EiKSAgICBcblx0IgorICAgICAgICAgICAgImFkZCAkOCwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiIGpzIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6ICJyIiAoc3JjK21teF9sZW4pLCAiciIgKG5vaXNlK21teF9sZW4pLCAiciIgKGRzdCttbXhfbGVuKSwgImciICgtbW14X2xlbikKKyAgICAgICAgICAgIDogIiUiUkVHX2EKKyAgICAgICAgICAgICk7CisgICAgaWYgKG1teF9sZW4gIT0gbGVuKQorICAgICAgICBmZl9saW5lX25vaXNlX2MoZHN0K21teF9sZW4sIHNyYyttbXhfbGVuLCBub2lzZSttbXhfbGVuLCBsZW4tbW14X2xlbiwgMCk7Cit9CisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCisKK2F2X2NvbGQgdm9pZCBmZl9ub2lzZV9pbml0X3g4NihOb2lzZUNvbnRleHQgKm4pCit7CisjaWYgSEFWRV9JTkxJTkVfQVNNCisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChJTkxJTkVfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgbi0+bGluZV9ub2lzZSAgICAgPSBsaW5lX25vaXNlX21teDsKKyNpZiBIQVZFXzZSRUdTCisgICAgICAgIG4tPmxpbmVfbm9pc2VfYXZnID0gbGluZV9ub2lzZV9hdmdfbW14OworI2VuZGlmCisgICAgfQorICAgIGlmIChJTkxJTkVfTU1YRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgbi0+bGluZV9ub2lzZSAgICAgPSBsaW5lX25vaXNlX21teGV4dDsKKyAgICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfcHVsbHVwLmFzbSBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfcHVsbHVwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2ExOTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl9wdWxsdXAuYXNtCkBAIC0wLDAgKzEsMTc4IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIHg4Ni1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciBwdWxsdXAgZmlsdGVyCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzsqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorOyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworOyogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzsqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1RFWFQKKworSU5JVF9NTVggbW14CitjZ2xvYmFsIHB1bGx1cF9maWx0ZXJfZGlmZiwgMywgNSwgOCwgZmlyc3QsIHNlY29uZCwgc2l6ZQorICAgIG1vdiAgICAgICAgcjMsIDQKKyAgICBweG9yICAgICAgIG00LCBtNAorICAgIHB4b3IgICAgICAgbTcsIG03CisKKy5sb29wOgorICAgIG1vdnEgICAgICAgbTAsIFtmaXJzdHFdCisgICAgbW92cSAgICAgICBtMiwgW2ZpcnN0cV0KKyAgICBhZGQgICAgICAgIGZpcnN0cSwgc2l6ZXEKKyAgICBtb3ZxICAgICAgIG0xLCBbc2Vjb25kcV0KKyAgICBhZGQgICAgICAgIHNlY29uZHEsIHNpemVxCisgICAgcHN1YnVzYiAgICBtMiwgbTEKKyAgICBwc3VidXNiICAgIG0xLCBtMAorICAgIG1vdnEgICAgICAgbTAsIG0yCisgICAgbW92cSAgICAgICBtMywgbTEKKyAgICBwdW5wY2tsYncgIG0wLCBtNworICAgIHB1bnBja2xidyAgbTEsIG03CisgICAgcHVucGNraGJ3ICBtMiwgbTcKKyAgICBwdW5wY2toYncgIG0zLCBtNworICAgIHBhZGR3ICAgICAgbTQsIG0wCisgICAgcGFkZHcgICAgICBtNCwgbTEKKyAgICBwYWRkdyAgICAgIG00LCBtMgorICAgIHBhZGR3ICAgICAgbTQsIG0zCisKKyAgICBkZWMgICAgICAgIHIzCisgICAgam56IC5sb29wCisKKyAgICBtb3ZxICAgICAgIG0zLCBtNAorICAgIHB1bnBja2x3ZCAgbTQsIG03CisgICAgcHVucGNraHdkICBtMywgbTcKKyAgICBwYWRkZCAgICAgIG0zLCBtNAorICAgIG1vdmQgICAgICBlYXgsIG0zCisgICAgcHNybHEgICAgICBtMywgMzIKKyAgICBtb3ZkICAgICAgcjRkLCBtMworICAgIGFkZCAgICAgICBlYXgsIHI0ZAorICAgIFJFVAorCitJTklUX01NWCBtbXgKK2NnbG9iYWwgcHVsbHVwX2ZpbHRlcl9jb21iLCAzLCA1LCA4LCBmaXJzdCwgc2Vjb25kLCBzaXplCisgICAgbW92ICAgICAgICByMywgNAorICAgIHB4b3IgICAgICAgbTYsIG02CisgICAgcHhvciAgICAgICBtNywgbTcKKyAgICBzdWIgICAgICAgIHNlY29uZHEsIHNpemVxCisKKy5sb29wOgorICAgIG1vdnEgICAgICAgbTAsIFtmaXJzdHFdCisgICAgbW92cSAgICAgICBtMSwgW3NlY29uZHFdCisgICAgcHVucGNrbGJ3ICBtMCwgbTcKKyAgICBtb3ZxICAgICAgIG0yLCBbc2Vjb25kcStzaXplcV0KKyAgICBwdW5wY2tsYncgIG0xLCBtNworICAgIHB1bnBja2xidyAgbTIsIG03CisgICAgcGFkZHcgICAgICBtMCwgbTAKKyAgICBwYWRkdyAgICAgIG0xLCBtMgorICAgIG1vdnEgICAgICAgbTIsIG0wCisgICAgcHN1YnVzdyAgICBtMCwgbTEKKyAgICBwc3VidXN3ICAgIG0xLCBtMgorICAgIHBhZGR3ICAgICAgbTYsIG0wCisgICAgcGFkZHcgICAgICBtNiwgbTEKKworICAgIG1vdnEgICAgICAgbTAsIFtmaXJzdHFdCisgICAgbW92cSAgICAgICBtMSwgW3NlY29uZHFdCisgICAgcHVucGNraGJ3ICBtMCwgbTcKKyAgICBtb3ZxICAgICAgIG0yLCBbc2Vjb25kcStzaXplcV0KKyAgICBwdW5wY2toYncgIG0xLCBtNworICAgIHB1bnBja2hidyAgbTIsIG03CisgICAgcGFkZHcgICAgICBtMCwgbTAKKyAgICBwYWRkdyAgICAgIG0xLCBtMgorICAgIG1vdnEgICAgICAgbTIsIG0wCisgICAgcHN1YnVzdyAgICBtMCwgbTEKKyAgICBwc3VidXN3ICAgIG0xLCBtMgorICAgIHBhZGR3ICAgICAgbTYsIG0wCisgICAgcGFkZHcgICAgICBtNiwgbTEKKworICAgIG1vdnEgICAgICAgbTAsIFtzZWNvbmRxK3NpemVxXQorICAgIG1vdnEgICAgICAgbTEsIFtmaXJzdHFdCisgICAgcHVucGNrbGJ3ICBtMCwgbTcKKyAgICBtb3ZxICAgICAgIG0yLCBbZmlyc3RxK3NpemVxXQorICAgIHB1bnBja2xidyAgbTEsIG03CisgICAgcHVucGNrbGJ3ICBtMiwgbTcKKyAgICBwYWRkdyAgICAgIG0wLCBtMAorICAgIHBhZGR3ICAgICAgbTEsIG0yCisgICAgbW92cSAgICAgICBtMiwgbTAKKyAgICBwc3VidXN3ICAgIG0wLCBtMQorICAgIHBzdWJ1c3cgICAgbTEsIG0yCisgICAgcGFkZHcgICAgICBtNiwgbTAKKyAgICBwYWRkdyAgICAgIG02LCBtMQorCisgICAgbW92cSAgICAgICBtMCwgW3NlY29uZHErc2l6ZXFdCisgICAgbW92cSAgICAgICBtMSwgW2ZpcnN0cV0KKyAgICBwdW5wY2toYncgIG0wLCBtNworICAgIG1vdnEgICAgICAgbTIsIFtmaXJzdHErc2l6ZXFdCisgICAgcHVucGNraGJ3ICBtMSwgbTcKKyAgICBwdW5wY2toYncgIG0yLCBtNworICAgIHBhZGR3ICAgICAgbTAsIG0wCisgICAgcGFkZHcgICAgICBtMSwgbTIKKyAgICBtb3ZxICAgICAgIG0yLCBtMAorICAgIHBzdWJ1c3cgICAgbTAsIG0xCisgICAgcHN1YnVzdyAgICBtMSwgbTIKKyAgICBwYWRkdyAgICAgIG02LCBtMAorICAgIHBhZGR3ICAgICAgbTYsIG0xCisKKyAgICBhZGQgICAgICAgIGZpcnN0cSwgc2l6ZXEKKyAgICBhZGQgICAgICAgIHNlY29uZHEsIHNpemVxCisgICAgZGVjICAgICAgICByMworICAgIGpueiAubG9vcAorCisgICAgbW92cSAgICAgICBtNSwgbTYKKyAgICBwdW5wY2tsd2QgIG02LCBtNworICAgIHB1bnBja2h3ZCAgbTUsIG03CisgICAgcGFkZGQgICAgICBtNSwgbTYKKyAgICBtb3ZkICAgICAgZWF4LCBtNQorICAgIHBzcmxxICAgICAgbTUsIDMyCisgICAgbW92ZCAgICAgIHI0ZCwgbTUKKyAgICBhZGQgICAgICAgZWF4LCByNGQKKyAgICBSRVQKKworSU5JVF9NTVggbW14CitjZ2xvYmFsIHB1bGx1cF9maWx0ZXJfdmFyLCAzLCA1LCA4LCBmaXJzdCwgc2Vjb25kLCBzaXplCisgICAgbW92ICAgICAgICByMywgMworICAgIHB4b3IgICAgICAgbTQsIG00CisgICAgcHhvciAgICAgICBtNywgbTcKKworLmxvb3A6CisgICAgbW92cSAgICAgICBtMCwgW2ZpcnN0cV0KKyAgICBtb3ZxICAgICAgIG0yLCBbZmlyc3RxXQorICAgIG1vdnEgICAgICAgbTEsIFtmaXJzdHErc2l6ZXFdCisgICAgYWRkICAgICAgICBmaXJzdHEsIHNpemVxCisgICAgcHN1YnVzYiAgICBtMiwgbTEKKyAgICBwc3VidXNiICAgIG0xLCBtMAorICAgIG1vdnEgICAgICAgbTAsIG0yCisgICAgbW92cSAgICAgICBtMywgbTEKKyAgICBwdW5wY2tsYncgIG0wLCBtNworICAgIHB1bnBja2xidyAgbTEsIG03CisgICAgcHVucGNraGJ3ICBtMiwgbTcKKyAgICBwdW5wY2toYncgIG0zLCBtNworICAgIHBhZGR3ICAgICAgbTQsIG0wCisgICAgcGFkZHcgICAgICBtNCwgbTEKKyAgICBwYWRkdyAgICAgIG00LCBtMgorICAgIHBhZGR3ICAgICAgbTQsIG0zCisKKyAgICBkZWMgICAgICAgIHIzCisgICAgam56IC5sb29wCisKKyAgICBtb3ZxICAgICAgIG0zLCBtNAorICAgIHB1bnBja2x3ZCAgbTQsIG03CisgICAgcHVucGNraHdkICBtMywgbTcKKyAgICBwYWRkZCAgICAgIG0zLCBtNAorICAgIG1vdmQgICAgICBlYXgsIG0zCisgICAgcHNybHEgICAgICBtMywgMzIKKyAgICBtb3ZkICAgICAgcjRkLCBtMworICAgIGFkZCAgICAgICBlYXgsIHI0ZAorICAgIHNobCAgICAgICBlYXgsIDIKKyAgICBSRVQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfcHVsbHVwX2luaXQuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfcHVsbHVwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjM2YjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl9wdWxsdXBfaW5pdC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvdmZfcHVsbHVwLmgiCisKK2ludCBmZl9wdWxsdXBfZmlsdGVyX2RpZmZfbW14KGNvbnN0IHVpbnQ4X3QgKmEsIGNvbnN0IHVpbnQ4X3QgKmIsIHB0cmRpZmZfdCBzKTsKK2ludCBmZl9wdWxsdXBfZmlsdGVyX2NvbWJfbW14KGNvbnN0IHVpbnQ4X3QgKmEsIGNvbnN0IHVpbnQ4X3QgKmIsIHB0cmRpZmZfdCBzKTsKK2ludCBmZl9wdWxsdXBfZmlsdGVyX3Zhcl9tbXggKGNvbnN0IHVpbnQ4X3QgKmEsIGNvbnN0IHVpbnQ4X3QgKmIsIHB0cmRpZmZfdCBzKTsKKworYXZfY29sZCB2b2lkIGZmX3B1bGx1cF9pbml0X3g4NihQdWxsdXBDb250ZXh0ICpzKQoreworI2lmIEhBVkVfWUFTTQorICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+ZGlmZiA9IGZmX3B1bGx1cF9maWx0ZXJfZGlmZl9tbXg7CisgICAgICAgIHMtPmNvbWIgPSBmZl9wdWxsdXBfZmlsdGVyX2NvbWJfbW14OworICAgICAgICBzLT52YXIgID0gZmZfcHVsbHVwX2ZpbHRlcl92YXJfbW14OworICAgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl9zcHAuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfc3BwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0NmRkYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfc3BwLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci92Zl9zcHAuaCIKKworI2lmIEhBVkVfTU1YX0lOTElORQorc3RhdGljIHZvaWQgaGFyZHRocmVzaF9tbXgoaW50MTZfdCBkc3RbNjRdLCBjb25zdCBpbnQxNl90IHNyY1s2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXAsIGNvbnN0IHVpbnQ4X3QgKnBlcm11dGF0aW9uKQoreworICAgIGludCBiaWFzID0gMDsgLy9GSVhNRQorICAgIHVuc2lnbmVkIGludCB0aHJlc2hvbGQxOworCisgICAgdGhyZXNob2xkMSA9IHFwICogKCgxPDw0KSAtIGJpYXMpIC0gMTsKKworI2RlZmluZSBSRVFVQU5UX0NPUkUoZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMykgICAgXAorICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTEgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICIgI3NyYzIgIiwgJSVtbTIgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICIgI3NyYzMgIiwgJSVtbTMgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidyAlJW1tNCwgJSVtbTAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidyAlJW1tNCwgJSVtbTEgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidyAlJW1tNCwgJSVtbTIgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidyAlJW1tNCwgJSVtbTMgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdXN3ICUlbW01LCAlJW1tMCAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdXN3ICUlbW01LCAlJW1tMSAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdXN3ICUlbW01LCAlJW1tMiAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdXN3ICUlbW01LCAlJW1tMyAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdyAlJW1tNiwgJSVtbTAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdyAlJW1tNiwgJSVtbTEgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdyAlJW1tNiwgJSVtbTIgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkdyAlJW1tNiwgJSVtbTMgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXN3ICUlbW02LCAlJW1tMCAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXN3ICUlbW02LCAlJW1tMSAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXN3ICUlbW02LCAlJW1tMiAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXN3ICUlbW02LCAlJW1tMyAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3JhdyAkMywgJSVtbTAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3JhdyAkMywgJSVtbTEgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3JhdyAkMywgJSVtbTIgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3JhdyAkMywgJSVtbTMgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICUlbW0wLCAlJW1tNyAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tsd2QgJSVtbTIsICUlbW0wICAgICBcbiIgLypBKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tod2QgJSVtbTIsICUlbW03ICAgICBcbiIgLypDKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICUlbW0xLCAlJW1tMiAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tsd2QgJSVtbTMsICUlbW0xICAgICBcbiIgLypCKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tod2QgJSVtbTMsICUlbW0yICAgICBcbiIgLypEKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICUlbW0wLCAlJW1tMyAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tsd2QgJSVtbTEsICUlbW0wICAgICBcbiIgLypBKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tod2QgJSVtbTcsICUlbW0zICAgICBcbiIgLypDKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tsd2QgJSVtbTIsICUlbW03ICAgICBcbiIgLypCKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tod2QgJSVtbTIsICUlbW0xICAgICBcbiIgLypEKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICUlbW0wLCAiICNkc3QwICIgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICUlbW03LCAiICNkc3QxICIgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICUlbW0zLCAiICNkc3QyICIgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICUlbW0xLCAiICNkc3QzICIgICAgICBcbiIKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZkICUyLCAlJW1tNCAgICAgICAgICAgICBcbiIKKyAgICAgICAgIm1vdmQgJTMsICUlbW01ICAgICAgICAgICAgIFxuIgorICAgICAgICAibW92ZCAlNCwgJSVtbTYgICAgICAgICAgICAgXG4iCisgICAgICAgICJwYWNrc3NkdyAlJW1tNCwgJSVtbTQgICAgICBcbiIKKyAgICAgICAgInBhY2tzc2R3ICUlbW01LCAlJW1tNSAgICAgIFxuIgorICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgXG4iCisgICAgICAgICJwYWNrc3NkdyAlJW1tNCwgJSVtbTQgICAgICBcbiIKKyAgICAgICAgInBhY2tzc2R3ICUlbW01LCAlJW1tNSAgICAgIFxuIgorICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgXG4iCisgICAgICAgIFJFUVVBTlRfQ09SRSggICglMSksICA4KCUxKSwgMTYoJTEpLCAyNCglMSksICAoJTApLCA4KCUwKSwgNjQoJTApLCA3MiglMCkpCisgICAgICAgIFJFUVVBTlRfQ09SRSgzMiglMSksIDQwKCUxKSwgNDgoJTEpLCA1NiglMSksMTYoJTApLDI0KCUwKSwgNDgoJTApLCA1NiglMCkpCisgICAgICAgIFJFUVVBTlRfQ09SRSg2NCglMSksIDcyKCUxKSwgODAoJTEpLCA4OCglMSksMzIoJTApLDQwKCUwKSwgOTYoJTApLDEwNCglMCkpCisgICAgICAgIFJFUVVBTlRfQ09SRSg5NiglMSksMTA0KCUxKSwxMTIoJTEpLDEyMCglMSksODAoJTApLDg4KCUwKSwxMTIoJTApLDEyMCglMCkpCisgICAgICAgIDogOiAiciIgKHNyYyksICJyIiAoZHN0KSwgImciICh0aHJlc2hvbGQxKzEpLCAiZyIgKHRocmVzaG9sZDErNSksICJnIiAodGhyZXNob2xkMS00KSAvL0ZJWE1FIG1heWJlIG1vcmUgYWNjdXJhdGUgdGhlbiBuZWVkZWQ/CisgICAgKTsKKyAgICBkc3RbMF0gPSAoc3JjWzBdICsgNCkgPj4gMzsKK30KKworc3RhdGljIHZvaWQgc29mdHRocmVzaF9tbXgoaW50MTZfdCBkc3RbNjRdLCBjb25zdCBpbnQxNl90IHNyY1s2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXAsIGNvbnN0IHVpbnQ4X3QgKnBlcm11dGF0aW9uKQoreworICAgIGludCBiaWFzID0gMDsgLy9GSVhNRQorICAgIHVuc2lnbmVkIGludCB0aHJlc2hvbGQxOworCisgICAgdGhyZXNob2xkMSA9IHFwKigoMTw8NCkgLSBiaWFzKSAtIDE7CisKKyN1bmRlZiBSRVFVQU5UX0NPUkUKKyNkZWZpbmUgUkVRVUFOVF9DT1JFKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpICAgIFwKKyAgICAibW92cSAiICNzcmMwICIsICUlbW0wICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAiICNzcmMxICIsICUlbW0xICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNiwgJSVtbTYgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNywgJSVtbTcgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGNtcGd0dyAlJW1tMCwgJSVtbTYgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGNtcGd0dyAlJW1tMSwgJSVtbTcgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNiwgJSVtbTAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNywgJSVtbTEgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YnVzdyAlJW1tNCwgJSVtbTAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YnVzdyAlJW1tNCwgJSVtbTEgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNiwgJSVtbTAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNywgJSVtbTEgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAiICNzcmMyICIsICUlbW0yICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAiICNzcmMzICIsICUlbW0zICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNiwgJSVtbTYgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNywgJSVtbTcgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGNtcGd0dyAlJW1tMiwgJSVtbTYgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGNtcGd0dyAlJW1tMywgJSVtbTcgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNiwgJSVtbTIgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNywgJSVtbTMgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YnVzdyAlJW1tNCwgJSVtbTIgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YnVzdyAlJW1tNCwgJSVtbTMgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNiwgJSVtbTIgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHhvciAlJW1tNywgJSVtbTMgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICUlbW01LCAlJW1tMCAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICUlbW01LCAlJW1tMSAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICUlbW01LCAlJW1tMiAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICUlbW01LCAlJW1tMyAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNyYXcgJDMsICUlbW0wICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNyYXcgJDMsICUlbW0xICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNyYXcgJDMsICUlbW0yICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHNyYXcgJDMsICUlbW0zICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAlJW1tMCwgJSVtbTcgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNrbHdkICUlbW0yLCAlJW1tMCAgICAgXG4iIC8qQSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNraHdkICUlbW0yLCAlJW1tNyAgICAgXG4iIC8qQyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAlJW1tMSwgJSVtbTIgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNrbHdkICUlbW0zLCAlJW1tMSAgICAgXG4iIC8qQiovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNraHdkICUlbW0zLCAlJW1tMiAgICAgXG4iIC8qRCovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAlJW1tMCwgJSVtbTMgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNrbHdkICUlbW0xLCAlJW1tMCAgICAgXG4iIC8qQSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNraHdkICUlbW03LCAlJW1tMyAgICAgXG4iIC8qQyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNrbHdkICUlbW0yLCAlJW1tNyAgICAgXG4iIC8qQiovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNraHdkICUlbW0yLCAlJW1tMSAgICAgXG4iIC8qRCovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAlJW1tMCwgIiAjZHN0MCAiICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAlJW1tNywgIiAjZHN0MSAiICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAlJW1tMywgIiAjZHN0MiAiICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAlJW1tMSwgIiAjZHN0MyAiICAgICAgXG4iCisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92ZCAlMiwgJSVtbTQgICAgICAgICAgICAgXG4iCisgICAgICAgICJtb3ZkICUzLCAlJW1tNSAgICAgICAgICAgICBcbiIKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgIFxuIgorICAgICAgICAicGFja3NzZHcgJSVtbTUsICUlbW01ICAgICAgXG4iCisgICAgICAgICJwYWNrc3NkdyAlJW1tNCwgJSVtbTQgICAgICBcbiIKKyAgICAgICAgInBhY2tzc2R3ICUlbW01LCAlJW1tNSAgICAgIFxuIgorICAgICAgICBSRVFVQU5UX0NPUkUoICAoJTEpLCAgOCglMSksIDE2KCUxKSwgMjQoJTEpLCAgKCUwKSwgOCglMCksIDY0KCUwKSwgNzIoJTApKQorICAgICAgICBSRVFVQU5UX0NPUkUoMzIoJTEpLCA0MCglMSksIDQ4KCUxKSwgNTYoJTEpLDE2KCUwKSwyNCglMCksIDQ4KCUwKSwgNTYoJTApKQorICAgICAgICBSRVFVQU5UX0NPUkUoNjQoJTEpLCA3MiglMSksIDgwKCUxKSwgODgoJTEpLDMyKCUwKSw0MCglMCksIDk2KCUwKSwxMDQoJTApKQorICAgICAgICBSRVFVQU5UX0NPUkUoOTYoJTEpLDEwNCglMSksMTEyKCUxKSwxMjAoJTEpLDgwKCUwKSw4OCglMCksMTEyKCUwKSwxMjAoJTApKQorICAgICAgICA6IDogInIiIChzcmMpLCAiciIgKGRzdCksICJnIiAodGhyZXNob2xkMSksICJybSIgKDQpIC8vRklYTUUgbWF5YmUgbW9yZSBhY2N1cmF0ZSB0aGVuIG5lZWRlZD8KKyAgICApOworCisgICAgZHN0WzBdID0gKHNyY1swXSArIDQpID4+IDM7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlX3NsaWNlX21teCh1aW50OF90ICpkc3QsIGNvbnN0IGludDE2X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGRpdGhlcls4XVs4XSkKK3sKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICB1aW50OF90ICpkc3QxID0gZHN0OworICAgICAgICBjb25zdCBpbnQxNl90ICpzcmMxID0gc3JjOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgIm1vdnEgKCUzKSwgJSVtbTMgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIm1vdnEgKCUzKSwgJSVtbTQgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIm1vdmQgJTQsICUlbW0yICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgInB4b3IgJSVtbTAsICUlbW0wICAgICAgICAgIFxuIgorICAgICAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTMgICAgIFxuIgorICAgICAgICAgICAgInB1bnBja2hidyAlJW1tMCwgJSVtbTQgICAgIFxuIgorICAgICAgICAgICAgInBzcmF3ICUlbW0yLCAlJW1tMyAgICAgICAgIFxuIgorICAgICAgICAgICAgInBzcmF3ICUlbW0yLCAlJW1tNCAgICAgICAgIFxuIgorICAgICAgICAgICAgIm1vdmQgJTUsICUlbW0yICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIm1vdnEgOCglMCksICUlbW0xICAgICAgICAgIFxuIgorICAgICAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tMCAgICAgICAgIFxuIgorICAgICAgICAgICAgInBhZGR3ICUlbW00LCAlJW1tMSAgICAgICAgIFxuIgorICAgICAgICAgICAgInBzcmF3ICUlbW0yLCAlJW1tMCAgICAgICAgIFxuIgorICAgICAgICAgICAgInBzcmF3ICUlbW0yLCAlJW1tMSAgICAgICAgIFxuIgorICAgICAgICAgICAgInBhY2t1c3diICUlbW0xLCAlJW1tMCAgICAgIFxuIgorICAgICAgICAgICAgIm1vdnEgJSVtbTAsICglMSkgICAgICAgICAgIFxuIgorICAgICAgICAgICAgImFkZCAkMTYsICUwICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgImFkZCAkOCwgJTEgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgImNtcCAlMiwgJTEgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIiBqYiAxYiAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgOiAiK3IiIChzcmMxKSwgIityIihkc3QxKQorICAgICAgICAgICAgOiAiciIoZHN0ICsgd2lkdGgpLCAiciIoZGl0aGVyW3ldKSwgImciKGxvZzJfc2NhbGUpLCAiZyIoTUFYX0xFVkVMIC0gbG9nMl9zY2FsZSkKKyAgICAgICAgKTsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIH0KK30KKworI2VuZGlmIC8qIEhBVkVfTU1YX0lOTElORSAqLworCithdl9jb2xkIHZvaWQgZmZfc3BwX2luaXRfeDg2KFNQUENvbnRleHQgKnMpCit7CisjaWYgSEFWRV9NTVhfSU5MSU5FCisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19NTVgpIHsKKyAgICAgICAgcy0+c3RvcmVfc2xpY2UgPSBzdG9yZV9zbGljZV9tbXg7CisgICAgICAgIHN3aXRjaCAocy0+bW9kZSkgeworICAgICAgICBjYXNlIDA6IHMtPnJlcXVhbnRpemUgPSBoYXJkdGhyZXNoX21teDsgYnJlYWs7CisgICAgICAgIGNhc2UgMTogcy0+cmVxdWFudGl6ZSA9IHNvZnR0aHJlc2hfbW14OyBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl90aW50ZXJsYWNlX2luaXQuYyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfdGludGVybGFjZV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiMGNjZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYvdmZfdGludGVybGFjZV9pbml0LmMKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBLaWVyYW4gS3VuaHlhIDxraWVyYW5rQG9iZS50dj4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKworI2luY2x1ZGUgImxpYmF2ZmlsdGVyL3RpbnRlcmxhY2UuaCIKKwordm9pZCBmZl9sb3dwYXNzX2xpbmVfc3NlMih1aW50OF90ICpkc3RwLCBwdHJkaWZmX3QgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYWJvdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYmVsb3cpOwordm9pZCBmZl9sb3dwYXNzX2xpbmVfYXZ4ICh1aW50OF90ICpkc3RwLCBwdHJkaWZmX3QgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYWJvdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYmVsb3cpOworCithdl9jb2xkIHZvaWQgZmZfdGludGVybGFjZV9pbml0X3g4NihUSW50ZXJsYWNlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgcy0+bG93cGFzc19saW5lID0gZmZfbG93cGFzc19saW5lX3NzZTI7CisgICAgaWYgKEVYVEVSTkFMX0FWWChjcHVfZmxhZ3MpKQorICAgICAgICBzLT5sb3dwYXNzX2xpbmUgPSBmZl9sb3dwYXNzX2xpbmVfYXZ4OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl95YWRpZi5hc20gYi9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX3lhZGlmLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjk2MjBjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl95YWRpZi5hc20KQEAgLTAsMCArMSwyNDMgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2LW9wdGltaXplZCBmdW5jdGlvbnMgZm9yIHlhZGlmIGZpbHRlcgorOyoKKzsqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorOyogQ29weXJpZ2h0IChjKSAyMDEzIERhbmllbCBLYW5nIDxkYW5pZWwuZC5rYW5nQGdtYWlsLmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorCitwYl8xOiB0aW1lcyAxNiBkYiAxCitwd18xOiB0aW1lcyAgOCBkdyAxCisKK1NFQ1RJT04gLnRleHQKKworJW1hY3JvIENIRUNLIDIKKyAgICBtb3Z1ICAgICAgbTIsIFtjdXJxK3QxKyUxXQorICAgIG1vdnUgICAgICBtMywgW2N1cnErdDArJTJdCisgICAgbW92YSAgICAgIG00LCBtMgorICAgIG1vdmEgICAgICBtNSwgbTIKKyAgICBweG9yICAgICAgbTQsIG0zCisgICAgcGF2Z2IgICAgIG01LCBtMworICAgIHBhbmQgICAgICBtNCwgW3BiXzFdCisgICAgcHN1YnVzYiAgIG01LCBtNAorICAgIFJTSElGVCAgICBtNSwgMQorICAgIHB1bnBja2xidyBtNSwgbTcKKyAgICBtb3ZhICAgICAgbTQsIG0yCisgICAgcHN1YnVzYiAgIG0yLCBtMworICAgIHBzdWJ1c2IgICBtMywgbTQKKyAgICBwbWF4dWIgICAgbTIsIG0zCisgICAgbW92YSAgICAgIG0zLCBtMgorICAgIG1vdmEgICAgICBtNCwgbTIKKyAgICBSU0hJRlQgICAgbTMsIDEKKyAgICBSU0hJRlQgICAgbTQsIDIKKyAgICBwdW5wY2tsYncgbTIsIG03CisgICAgcHVucGNrbGJ3IG0zLCBtNworICAgIHB1bnBja2xidyBtNCwgbTcKKyAgICBwYWRkdyAgICAgbTIsIG0zCisgICAgcGFkZHcgICAgIG0yLCBtNAorJWVuZG1hY3JvCisKKyVtYWNybyBDSEVDSzEgMAorICAgIG1vdmEgICAgbTMsIG0wCisgICAgcGNtcGd0dyBtMywgbTIKKyAgICBwbWluc3cgIG0wLCBtMgorICAgIG1vdmEgICAgbTYsIG0zCisgICAgcGFuZCAgICBtNSwgbTMKKyAgICBwYW5kbiAgIG0zLCBtMQorICAgIHBvciAgICAgbTMsIG01CisgICAgbW92YSAgICBtMSwgbTMKKyVlbmRtYWNybworCislbWFjcm8gQ0hFQ0syIDAKKyAgICBwYWRkdyAgIG02LCBbcHdfMV0KKyAgICBwc2xsdyAgIG02LCAxNAorICAgIHBhZGRzdyAgbTIsIG02CisgICAgbW92YSAgICBtMywgbTAKKyAgICBwY21wZ3R3IG0zLCBtMgorICAgIHBtaW5zdyAgbTAsIG0yCisgICAgcGFuZCAgICBtNSwgbTMKKyAgICBwYW5kbiAgIG0zLCBtMQorICAgIHBvciAgICAgbTMsIG01CisgICAgbW92YSAgICBtMSwgbTMKKyVlbmRtYWNybworCislbWFjcm8gTE9BRCAyCisgICAgbW92aCAgICAgICUxLCAlMgorICAgIHB1bnBja2xidyAlMSwgbTcKKyVlbmRtYWNybworCislbWFjcm8gRklMVEVSIDMKKy5sb29wJTE6CisgICAgcHhvciAgICAgICAgIG03LCBtNworICAgIExPQUQgICAgICAgICBtMCwgW2N1cnErdDFdCisgICAgTE9BRCAgICAgICAgIG0xLCBbY3VycSt0MF0KKyAgICBMT0FEICAgICAgICAgbTIsIFslMl0KKyAgICBMT0FEICAgICAgICAgbTMsIFslM10KKyAgICBtb3ZhICAgICAgICAgbTQsIG0zCisgICAgcGFkZHcgICAgICAgIG0zLCBtMgorICAgIHBzcmF3ICAgICAgICBtMywgMQorICAgIG1vdmEgICBbcnNwKyAwXSwgbTAKKyAgICBtb3ZhICAgW3JzcCsxNl0sIG0zCisgICAgbW92YSAgIFtyc3ArMzJdLCBtMQorICAgIHBzdWJ3ICAgICAgICBtMiwgbTQKKyAgICBBQlMxICAgICAgICAgbTIsIG00CisgICAgTE9BRCAgICAgICAgIG0zLCBbcHJldnErdDFdCisgICAgTE9BRCAgICAgICAgIG00LCBbcHJldnErdDBdCisgICAgcHN1YncgICAgICAgIG0zLCBtMAorICAgIHBzdWJ3ICAgICAgICBtNCwgbTEKKyAgICBBQlMxICAgICAgICAgbTMsIG01CisgICAgQUJTMSAgICAgICAgIG00LCBtNQorICAgIHBhZGR3ICAgICAgICBtMywgbTQKKyAgICBwc3JsdyAgICAgICAgbTIsIDEKKyAgICBwc3JsdyAgICAgICAgbTMsIDEKKyAgICBwbWF4c3cgICAgICAgbTIsIG0zCisgICAgTE9BRCAgICAgICAgIG0zLCBbbmV4dHErdDFdCisgICAgTE9BRCAgICAgICAgIG00LCBbbmV4dHErdDBdCisgICAgcHN1YncgICAgICAgIG0zLCBtMAorICAgIHBzdWJ3ICAgICAgICBtNCwgbTEKKyAgICBBQlMxICAgICAgICAgbTMsIG01CisgICAgQUJTMSAgICAgICAgIG00LCBtNQorICAgIHBhZGR3ICAgICAgICBtMywgbTQKKyAgICBwc3JsdyAgICAgICAgbTMsIDEKKyAgICBwbWF4c3cgICAgICAgbTIsIG0zCisgICAgbW92YSAgIFtyc3ArNDhdLCBtMgorCisgICAgcGFkZHcgICAgICAgIG0xLCBtMAorICAgIHBhZGR3ICAgICAgICBtMCwgbTAKKyAgICBwc3VidyAgICAgICAgbTAsIG0xCisgICAgcHNybHcgICAgICAgIG0xLCAxCisgICAgQUJTMSAgICAgICAgIG0wLCBtMgorCisgICAgbW92dSAgICAgICAgIG0yLCBbY3VycSt0MS0xXQorICAgIG1vdnUgICAgICAgICBtMywgW2N1cnErdDAtMV0KKyAgICBtb3ZhICAgICAgICAgbTQsIG0yCisgICAgcHN1YnVzYiAgICAgIG0yLCBtMworICAgIHBzdWJ1c2IgICAgICBtMywgbTQKKyAgICBwbWF4dWIgICAgICAgbTIsIG0zCislaWYgbW1zaXplID09IDE2CisgICAgbW92YSAgICAgICAgIG0zLCBtMgorICAgIHBzcmxkcSAgICAgICBtMywgMgorJWVsc2UKKyAgICBwc2h1ZncgICAgICAgbTMsIG0yLCBxMDAyMQorJWVuZGlmCisgICAgcHVucGNrbGJ3ICAgIG0yLCBtNworICAgIHB1bnBja2xidyAgICBtMywgbTcKKyAgICBwYWRkdyAgICAgICAgbTAsIG0yCisgICAgcGFkZHcgICAgICAgIG0wLCBtMworICAgIHBzdWJ3ICAgICAgICBtMCwgW3B3XzFdCisKKyAgICBDSEVDSyAtMiwgMAorICAgIENIRUNLMQorICAgIENIRUNLIC0zLCAxCisgICAgQ0hFQ0syCisgICAgQ0hFQ0sgMCwgLTIKKyAgICBDSEVDSzEKKyAgICBDSEVDSyAxLCAtMworICAgIENIRUNLMgorCisgICAgbW92YSAgICAgICAgIG02LCBbcnNwKzQ4XQorICAgIGNtcCAgIERXT1JEIHI4bSwgMgorICAgIGpnZSAuZW5kJTEKKyAgICBMT0FEICAgICAgICAgbTIsIFslMit0MSoyXQorICAgIExPQUQgICAgICAgICBtNCwgWyUzK3QxKjJdCisgICAgTE9BRCAgICAgICAgIG0zLCBbJTIrdDAqMl0KKyAgICBMT0FEICAgICAgICAgbTUsIFslMyt0MCoyXQorICAgIHBhZGR3ICAgICAgICBtMiwgbTQKKyAgICBwYWRkdyAgICAgICAgbTMsIG01CisgICAgcHNybHcgICAgICAgIG0yLCAxCisgICAgcHNybHcgICAgICAgIG0zLCAxCisgICAgbW92YSAgICAgICAgIG00LCBbcnNwKyAwXQorICAgIG1vdmEgICAgICAgICBtNSwgW3JzcCsxNl0KKyAgICBtb3ZhICAgICAgICAgbTcsIFtyc3ArMzJdCisgICAgcHN1YncgICAgICAgIG0yLCBtNAorICAgIHBzdWJ3ICAgICAgICBtMywgbTcKKyAgICBtb3ZhICAgICAgICAgbTAsIG01CisgICAgcHN1YncgICAgICAgIG01LCBtNAorICAgIHBzdWJ3ICAgICAgICBtMCwgbTcKKyAgICBtb3ZhICAgICAgICAgbTQsIG0yCisgICAgcG1pbnN3ICAgICAgIG0yLCBtMworICAgIHBtYXhzdyAgICAgICBtMywgbTQKKyAgICBwbWF4c3cgICAgICAgbTIsIG01CisgICAgcG1pbnN3ICAgICAgIG0zLCBtNQorICAgIHBtYXhzdyAgICAgICBtMiwgbTAKKyAgICBwbWluc3cgICAgICAgbTMsIG0wCisgICAgcHhvciAgICAgICAgIG00LCBtNAorICAgIHBtYXhzdyAgICAgICBtNiwgbTMKKyAgICBwc3VidyAgICAgICAgbTQsIG0yCisgICAgcG1heHN3ICAgICAgIG02LCBtNAorCisuZW5kJTE6CisgICAgbW92YSAgICAgICAgIG0yLCBbcnNwKzE2XQorICAgIG1vdmEgICAgICAgICBtMywgbTIKKyAgICBwc3VidyAgICAgICAgbTIsIG02CisgICAgcGFkZHcgICAgICAgIG0zLCBtNgorICAgIHBtYXhzdyAgICAgICBtMSwgbTIKKyAgICBwbWluc3cgICAgICAgbTEsIG0zCisgICAgcGFja3Vzd2IgICAgIG0xLCBtMQorCisgICAgbW92aCAgICAgW2RzdHFdLCBtMQorICAgIGFkZCAgICAgICAgZHN0cSwgbW1zaXplLzIKKyAgICBhZGQgICAgICAgcHJldnEsIG1tc2l6ZS8yCisgICAgYWRkICAgICAgICBjdXJxLCBtbXNpemUvMgorICAgIGFkZCAgICAgICBuZXh0cSwgbW1zaXplLzIKKyAgICBzdWIgICBEV09SRCByNG0sIG1tc2l6ZS8yCisgICAgamcgLmxvb3AlMQorJWVuZG1hY3JvCisKKyVtYWNybyBZQURJRiAwCislaWYgQVJDSF9YODZfMzIKK2NnbG9iYWwgeWFkaWZfZmlsdGVyX2xpbmUsIDQsIDYsIDgsIDgwLCBkc3QsIHByZXYsIGN1ciwgbmV4dCwgdywgcHJlZnMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcmVmcywgcGFyaXR5LCBtb2RlCislZWxzZQorY2dsb2JhbCB5YWRpZl9maWx0ZXJfbGluZSwgNCwgNywgOCwgODAsIGRzdCwgcHJldiwgY3VyLCBuZXh0LCB3LCBwcmVmcywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yZWZzLCBwYXJpdHksIG1vZGUKKyVlbmRpZgorJWlmIEFSQ0hfWDg2XzMyCisgICAgbW92ICAgICAgICAgICAgcjQsIHI1bXAKKyAgICBtb3YgICAgICAgICAgICByNSwgcjZtcAorICAgIERFQ0xBUkVfUkVHX1RNUCA0LDUKKyVlbHNlCisgICAgbW92c3hkICAgICAgICAgcjUsIERXT1JEIHI1bQorICAgIG1vdnN4ZCAgICAgICAgIHI2LCBEV09SRCByNm0KKyAgICBERUNMQVJFX1JFR19UTVAgNSw2CislZW5kaWYKKworICAgIGNtcCBEV09SRCBwYXJpdHltLCAwCisgICAgamUgLnBhcml0eTAKKyAgICBGSUxURVIgMSwgcHJldnEsIGN1cnEKKyAgICBqbXAgLnJldAorCisucGFyaXR5MDoKKyAgICBGSUxURVIgMCwgY3VycSwgbmV4dHEKKworLnJldDoKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc3NlMworWUFESUYKK0lOSVRfWE1NIHNzZTIKK1lBRElGCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIG1teGV4dAorWUFESUYKKyVlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl95YWRpZl9pbml0LmMgYi9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3ZmX3lhZGlmX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDYwYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni92Zl95YWRpZl9pbml0LmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci95YWRpZi5oIgorCit2b2lkIGZmX3lhZGlmX2ZpbHRlcl9saW5lX21teGV4dCh2b2lkICpkc3QsIHZvaWQgKnByZXYsIHZvaWQgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm5leHQsIGludCB3LCBpbnQgcHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXJlZnMsIGludCBwYXJpdHksIGludCBtb2RlKTsKK3ZvaWQgZmZfeWFkaWZfZmlsdGVyX2xpbmVfc3NlMih2b2lkICpkc3QsIHZvaWQgKnByZXYsIHZvaWQgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpuZXh0LCBpbnQgdywgaW50IHByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtcmVmcywgaW50IHBhcml0eSwgaW50IG1vZGUpOwordm9pZCBmZl95YWRpZl9maWx0ZXJfbGluZV9zc3NlMyh2b2lkICpkc3QsIHZvaWQgKnByZXYsIHZvaWQgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbmV4dCwgaW50IHcsIGludCBwcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1yZWZzLCBpbnQgcGFyaXR5LCBpbnQgbW9kZSk7CisKK3ZvaWQgZmZfeWFkaWZfZmlsdGVyX2xpbmVfMTZiaXRfbW14ZXh0KHZvaWQgKmRzdCwgdm9pZCAqcHJldiwgdm9pZCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbmV4dCwgaW50IHcsIGludCBwcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtcmVmcywgaW50IHBhcml0eSwgaW50IG1vZGUpOwordm9pZCBmZl95YWRpZl9maWx0ZXJfbGluZV8xNmJpdF9zc2UyKHZvaWQgKmRzdCwgdm9pZCAqcHJldiwgdm9pZCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm5leHQsIGludCB3LCBpbnQgcHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1yZWZzLCBpbnQgcGFyaXR5LCBpbnQgbW9kZSk7Cit2b2lkIGZmX3lhZGlmX2ZpbHRlcl9saW5lXzE2Yml0X3Nzc2UzKHZvaWQgKmRzdCwgdm9pZCAqcHJldiwgdm9pZCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpuZXh0LCBpbnQgdywgaW50IHByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXJlZnMsIGludCBwYXJpdHksIGludCBtb2RlKTsKK3ZvaWQgZmZfeWFkaWZfZmlsdGVyX2xpbmVfMTZiaXRfc3NlNCh2b2lkICpkc3QsIHZvaWQgKnByZXYsIHZvaWQgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpuZXh0LCBpbnQgdywgaW50IHByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtcmVmcywgaW50IHBhcml0eSwgaW50IG1vZGUpOworCit2b2lkIGZmX3lhZGlmX2ZpbHRlcl9saW5lXzEwYml0X21teGV4dCh2b2lkICpkc3QsIHZvaWQgKnByZXYsIHZvaWQgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm5leHQsIGludCB3LCBpbnQgcHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXJlZnMsIGludCBwYXJpdHksIGludCBtb2RlKTsKK3ZvaWQgZmZfeWFkaWZfZmlsdGVyX2xpbmVfMTBiaXRfc3NlMih2b2lkICpkc3QsIHZvaWQgKnByZXYsIHZvaWQgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpuZXh0LCBpbnQgdywgaW50IHByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtcmVmcywgaW50IHBhcml0eSwgaW50IG1vZGUpOwordm9pZCBmZl95YWRpZl9maWx0ZXJfbGluZV8xMGJpdF9zc3NlMyh2b2lkICpkc3QsIHZvaWQgKnByZXYsIHZvaWQgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbmV4dCwgaW50IHcsIGludCBwcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1yZWZzLCBpbnQgcGFyaXR5LCBpbnQgbW9kZSk7CisKK2F2X2NvbGQgdm9pZCBmZl95YWRpZl9pbml0X3g4NihZQURJRkNvbnRleHQgKnlhZGlmKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisgICAgaW50IGJpdF9kZXB0aCA9ICgheWFkaWYtPmNzcCkgPyA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB5YWRpZi0+Y3NwLT5jb21wWzBdLmRlcHRoX21pbnVzMSArIDE7CisKKyAgICBpZiAoYml0X2RlcHRoID49IDE1KSB7CisjaWYgQVJDSF9YODZfMzIKKyAgICAgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKQorICAgICAgICAgICAgeWFkaWYtPmZpbHRlcl9saW5lID0gZmZfeWFkaWZfZmlsdGVyX2xpbmVfMTZiaXRfbW14ZXh0OworI2VuZGlmIC8qIEFSQ0hfWDg2XzMyICovCisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpCisgICAgICAgICAgICB5YWRpZi0+ZmlsdGVyX2xpbmUgPSBmZl95YWRpZl9maWx0ZXJfbGluZV8xNmJpdF9zc2UyOworICAgICAgICBpZiAoRVhURVJOQUxfU1NTRTMoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIHlhZGlmLT5maWx0ZXJfbGluZSA9IGZmX3lhZGlmX2ZpbHRlcl9saW5lXzE2Yml0X3Nzc2UzOworICAgICAgICBpZiAoRVhURVJOQUxfU1NFNChjcHVfZmxhZ3MpKQorICAgICAgICAgICAgeWFkaWYtPmZpbHRlcl9saW5lID0gZmZfeWFkaWZfZmlsdGVyX2xpbmVfMTZiaXRfc3NlNDsKKyAgICB9IGVsc2UgaWYgKCBiaXRfZGVwdGggPj0gOSAmJiBiaXRfZGVwdGggPD0gMTQpIHsKKyNpZiBBUkNIX1g4Nl8zMgorICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpCisgICAgICAgICAgICB5YWRpZi0+ZmlsdGVyX2xpbmUgPSBmZl95YWRpZl9maWx0ZXJfbGluZV8xMGJpdF9tbXhleHQ7CisjZW5kaWYgLyogQVJDSF9YODZfMzIgKi8KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIHlhZGlmLT5maWx0ZXJfbGluZSA9IGZmX3lhZGlmX2ZpbHRlcl9saW5lXzEwYml0X3NzZTI7CisgICAgICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKQorICAgICAgICAgICAgeWFkaWYtPmZpbHRlcl9saW5lID0gZmZfeWFkaWZfZmlsdGVyX2xpbmVfMTBiaXRfc3NzZTM7CisgICAgfSBlbHNlIHsKKyNpZiBBUkNIX1g4Nl8zMgorICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpCisgICAgICAgICAgICB5YWRpZi0+ZmlsdGVyX2xpbmUgPSBmZl95YWRpZl9maWx0ZXJfbGluZV9tbXhleHQ7CisjZW5kaWYgLyogQVJDSF9YODZfMzIgKi8KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIHlhZGlmLT5maWx0ZXJfbGluZSA9IGZmX3lhZGlmX2ZpbHRlcl9saW5lX3NzZTI7CisgICAgICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKQorICAgICAgICAgICAgeWFkaWYtPmZpbHRlcl9saW5lID0gZmZfeWFkaWZfZmlsdGVyX2xpbmVfc3NzZTM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni95YWRpZi0xMC5hc20gYi9mZm1wZWcvbGliYXZmaWx0ZXIveDg2L3lhZGlmLTEwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODUzZTBkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni95YWRpZi0xMC5hc20KQEAgLTAsMCArMSwyNTUgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2LW9wdGltaXplZCBmdW5jdGlvbnMgZm9yIHlhZGlmIGZpbHRlcgorOyoKKzsqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorOyogQ29weXJpZ2h0IChjKSAyMDEzIERhbmllbCBLYW5nIDxkYW5pZWwuZC5rYW5nQGdtYWlsLmNvbT4KKzsqIENvcHlyaWdodCAoYykgMjAxMS0yMDEzIEphbWVzIERhcm5sZXkgPGphbWVzLmRhcm5sZXlAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK3B3XzE6IHRpbWVzIDggZHcgMQorCitTRUNUSU9OIC50ZXh0CisKKyVtYWNybyBQTUFYVVcgMgorJWlmIGNwdWZsYWcoc3NlNCkKKyAgICBwbWF4dXcgJTEsICUyCislZWxzZQorICAgIHBzdWJ1c3cgJTEsICUyCisgICAgcGFkZHVzdyAlMSwgJTIKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBDSEVDSyAyCisgICAgbW92dSAgICAgIG0yLCBbY3VycSt0MSslMSoyXQorICAgIG1vdnUgICAgICBtMywgW2N1cnErdDArJTIqMl0KKyAgICBtb3ZhICAgICAgbTQsIG0yCisgICAgbW92YSAgICAgIG01LCBtMgorICAgIHB4b3IgICAgICBtNCwgbTMKKyAgICBwYXZndyAgICAgbTUsIG0zCisgICAgcGFuZCAgICAgIG00LCBbcHdfMV0KKyAgICBwc3VidXN3ICAgbTUsIG00CisgICAgUlNISUZUICAgIG01LCAyCisgICAgbW92YSAgICAgIG00LCBtMgorICAgIHBzdWJ1c3cgICBtMiwgbTMKKyAgICBwc3VidXN3ICAgbTMsIG00CisgICAgUE1BWFVXICAgIG0yLCBtMworICAgIG1vdmEgICAgICBtMywgbTIKKyAgICBtb3ZhICAgICAgbTQsIG0yCisgICAgUlNISUZUICAgIG0zLCAyCisgICAgUlNISUZUICAgIG00LCA0CisgICAgcGFkZHcgICAgIG0yLCBtMworICAgIHBhZGR3ICAgICBtMiwgbTQKKyVlbmRtYWNybworCislbWFjcm8gQ0hFQ0sxIDAKKyAgICBtb3ZhICAgIG0zLCBtMAorICAgIHBjbXBndHcgbTMsIG0yCisgICAgcG1pbnN3ICBtMCwgbTIKKyAgICBtb3ZhICAgIG02LCBtMworICAgIHBhbmQgICAgbTUsIG0zCisgICAgcGFuZG4gICBtMywgbTEKKyAgICBwb3IgICAgIG0zLCBtNQorICAgIG1vdmEgICAgbTEsIG0zCislZW5kbWFjcm8KKworOyAlbWFjcm8gQ0hFQ0syIDAKKzsgICAgIHBhZGR3ICAgbTYsIFtwd18xXQorOyAgICAgcHNsbHcgICBtNiwgMTQKKzsgICAgIHBhZGRzdyAgbTIsIG02Cis7ICAgICBtb3ZhICAgIG0zLCBtMAorOyAgICAgcGNtcGd0dyBtMywgbTIKKzsgICAgIHBtaW5zdyAgbTAsIG0yCis7ICAgICBwYW5kICAgIG01LCBtMworOyAgICAgcGFuZG4gICBtMywgbTEKKzsgICAgIHBvciAgICAgbTMsIG01Cis7ICAgICBtb3ZhICAgIG0xLCBtMworOyAlZW5kbWFjcm8KKworOyBUaGlzIHZlcnNpb24gb2YgQ0hFQ0syIGlzIHJlcXVpcmVkIGZvciAxNC1iaXQgc2FtcGxlcy4gIFRoZSBsZWZ0LXNoaWZ0IHRyaWNrCis7IGluIHRoZSBvbGQgY29kZSBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGNvcnJlY3RseSBzZWxlY3QgcGl4ZWxzIG9yIHNjb3Jlcy4KKworJW1hY3JvIENIRUNLMiAwCisgICAgbW92YSAgICBtMywgbTAKKyAgICBwY21wZ3R3IG0wLCBtMgorICAgIHBhbmQgICAgbTAsIG02CisgICAgbW92YSAgICBtNiwgbTAKKyAgICBwYW5kICAgIG01LCBtNgorICAgIHBhbmQgICAgbTIsIG0wCisgICAgcGFuZG4gICBtNiwgbTEKKyAgICBwYW5kbiAgIG0wLCBtMworICAgIHBvciAgICAgbTYsIG01CisgICAgcG9yICAgICBtMCwgbTIKKyAgICBtb3ZhICAgIG0xLCBtNgorJWVuZG1hY3JvCisKKyVtYWNybyBMT0FEIDIKKyAgICBtb3Z1ICAgICAgJTEsICUyCislZW5kbWFjcm8KKworJW1hY3JvIEZJTFRFUiAzCisubG9vcCUxOgorICAgIHB4b3IgICAgICAgICBtNywgbTcKKyAgICBMT0FEICAgICAgICAgbTAsIFtjdXJxK3QxXQorICAgIExPQUQgICAgICAgICBtMSwgW2N1cnErdDBdCisgICAgTE9BRCAgICAgICAgIG0yLCBbJTJdCisgICAgTE9BRCAgICAgICAgIG0zLCBbJTNdCisgICAgbW92YSAgICAgICAgIG00LCBtMworICAgIHBhZGR3ICAgICAgICBtMywgbTIKKyAgICBwc3JhdyAgICAgICAgbTMsIDEKKyAgICBtb3ZhICAgW3JzcCsgMF0sIG0wCisgICAgbW92YSAgIFtyc3ArMTZdLCBtMworICAgIG1vdmEgICBbcnNwKzMyXSwgbTEKKyAgICBwc3VidyAgICAgICAgbTIsIG00CisgICAgQUJTMSAgICAgICAgIG0yLCBtNAorICAgIExPQUQgICAgICAgICBtMywgW3ByZXZxK3QxXQorICAgIExPQUQgICAgICAgICBtNCwgW3ByZXZxK3QwXQorICAgIHBzdWJ3ICAgICAgICBtMywgbTAKKyAgICBwc3VidyAgICAgICAgbTQsIG0xCisgICAgQUJTMiAgICAgICAgIG0zLCBtNCwgbTUsIG02CisgICAgcGFkZHcgICAgICAgIG0zLCBtNAorICAgIHBzcmx3ICAgICAgICBtMiwgMQorICAgIHBzcmx3ICAgICAgICBtMywgMQorICAgIHBtYXhzdyAgICAgICBtMiwgbTMKKyAgICBMT0FEICAgICAgICAgbTMsIFtuZXh0cSt0MV0KKyAgICBMT0FEICAgICAgICAgbTQsIFtuZXh0cSt0MF0KKyAgICBwc3VidyAgICAgICAgbTMsIG0wCisgICAgcHN1YncgICAgICAgIG00LCBtMQorICAgIEFCUzIgICAgICAgICBtMywgbTQsIG01LCBtNgorICAgIHBhZGR3ICAgICAgICBtMywgbTQKKyAgICBwc3JsdyAgICAgICAgbTMsIDEKKyAgICBwbWF4c3cgICAgICAgbTIsIG0zCisgICAgbW92YSAgIFtyc3ArNDhdLCBtMgorCisgICAgcGFkZHcgICAgICAgIG0xLCBtMAorICAgIHBhZGR3ICAgICAgICBtMCwgbTAKKyAgICBwc3VidyAgICAgICAgbTAsIG0xCisgICAgcHNybHcgICAgICAgIG0xLCAxCisgICAgQUJTMSAgICAgICAgIG0wLCBtMgorCisgICAgbW92dSAgICAgICAgIG0yLCBbY3VycSt0MS0xKjJdCisgICAgbW92dSAgICAgICAgIG0zLCBbY3VycSt0MC0xKjJdCisgICAgbW92YSAgICAgICAgIG00LCBtMgorICAgIHBzdWJ1c3cgICAgICBtMiwgbTMKKyAgICBwc3VidXN3ICAgICAgbTMsIG00CisgICAgUE1BWFVXICAgICAgIG0yLCBtMworICAgIG1vdmEgICAgICAgICBtMywgbTIKKyAgICBSU0hJRlQgICAgICAgbTMsIDQKKyAgICBwYWRkdyAgICAgICAgbTAsIG0yCisgICAgcGFkZHcgICAgICAgIG0wLCBtMworICAgIHBzdWJ3ICAgICAgICBtMCwgW3B3XzFdCisKKyAgICBDSEVDSyAtMiwgMAorICAgIENIRUNLMQorICAgIENIRUNLIC0zLCAxCisgICAgQ0hFQ0syCisgICAgQ0hFQ0sgMCwgLTIKKyAgICBDSEVDSzEKKyAgICBDSEVDSyAxLCAtMworICAgIENIRUNLMgorCisgICAgbW92YSAgICAgICAgIG02LCBbcnNwKzQ4XQorICAgIGNtcCAgIERXT1JEIHI4bSwgMgorICAgIGpnZSAuZW5kJTEKKyAgICBMT0FEICAgICAgICAgbTIsIFslMit0MSoyXQorICAgIExPQUQgICAgICAgICBtNCwgWyUzK3QxKjJdCisgICAgTE9BRCAgICAgICAgIG0zLCBbJTIrdDAqMl0KKyAgICBMT0FEICAgICAgICAgbTUsIFslMyt0MCoyXQorICAgIHBhZGR3ICAgICAgICBtMiwgbTQKKyAgICBwYWRkdyAgICAgICAgbTMsIG01CisgICAgcHNybHcgICAgICAgIG0yLCAxCisgICAgcHNybHcgICAgICAgIG0zLCAxCisgICAgbW92YSAgICAgICAgIG00LCBbcnNwKyAwXQorICAgIG1vdmEgICAgICAgICBtNSwgW3JzcCsxNl0KKyAgICBtb3ZhICAgICAgICAgbTcsIFtyc3ArMzJdCisgICAgcHN1YncgICAgICAgIG0yLCBtNAorICAgIHBzdWJ3ICAgICAgICBtMywgbTcKKyAgICBtb3ZhICAgICAgICAgbTAsIG01CisgICAgcHN1YncgICAgICAgIG01LCBtNAorICAgIHBzdWJ3ICAgICAgICBtMCwgbTcKKyAgICBtb3ZhICAgICAgICAgbTQsIG0yCisgICAgcG1pbnN3ICAgICAgIG0yLCBtMworICAgIHBtYXhzdyAgICAgICBtMywgbTQKKyAgICBwbWF4c3cgICAgICAgbTIsIG01CisgICAgcG1pbnN3ICAgICAgIG0zLCBtNQorICAgIHBtYXhzdyAgICAgICBtMiwgbTAKKyAgICBwbWluc3cgICAgICAgbTMsIG0wCisgICAgcHhvciAgICAgICAgIG00LCBtNAorICAgIHBtYXhzdyAgICAgICBtNiwgbTMKKyAgICBwc3VidyAgICAgICAgbTQsIG0yCisgICAgcG1heHN3ICAgICAgIG02LCBtNAorCisuZW5kJTE6CisgICAgbW92YSAgICAgICAgIG0yLCBbcnNwKzE2XQorICAgIG1vdmEgICAgICAgICBtMywgbTIKKyAgICBwc3VidyAgICAgICAgbTIsIG02CisgICAgcGFkZHcgICAgICAgIG0zLCBtNgorICAgIHBtYXhzdyAgICAgICBtMSwgbTIKKyAgICBwbWluc3cgICAgICAgbTEsIG0zCisKKyAgICBtb3Z1ICAgICBbZHN0cV0sIG0xCisgICAgYWRkICAgICAgICBkc3RxLCBtbXNpemUtNAorICAgIGFkZCAgICAgICBwcmV2cSwgbW1zaXplLTQKKyAgICBhZGQgICAgICAgIGN1cnEsIG1tc2l6ZS00CisgICAgYWRkICAgICAgIG5leHRxLCBtbXNpemUtNAorICAgIHN1YiAgIERXT1JEIHI0bSwgbW1zaXplLzItMgorICAgIGpnIC5sb29wJTEKKyVlbmRtYWNybworCislbWFjcm8gWUFESUYgMAorJWlmIEFSQ0hfWDg2XzMyCitjZ2xvYmFsIHlhZGlmX2ZpbHRlcl9saW5lXzEwYml0LCA0LCA2LCA4LCA4MCwgZHN0LCBwcmV2LCBjdXIsIG5leHQsIHcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmcywgbXJlZnMsIHBhcml0eSwgbW9kZQorJWVsc2UKK2NnbG9iYWwgeWFkaWZfZmlsdGVyX2xpbmVfMTBiaXQsIDQsIDcsIDgsIDgwLCBkc3QsIHByZXYsIGN1ciwgbmV4dCwgdywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZzLCBtcmVmcywgcGFyaXR5LCBtb2RlCislZW5kaWYKKyVpZiBBUkNIX1g4Nl8zMgorICAgIG1vdiAgICAgICAgICAgIHI0LCByNW1wCisgICAgbW92ICAgICAgICAgICAgcjUsIHI2bXAKKyAgICBERUNMQVJFX1JFR19UTVAgNCw1CislZWxzZQorICAgIG1vdnN4ZCAgICAgICAgIHI1LCBEV09SRCByNW0KKyAgICBtb3ZzeGQgICAgICAgICByNiwgRFdPUkQgcjZtCisgICAgREVDTEFSRV9SRUdfVE1QIDUsNgorJWVuZGlmCisKKyAgICBjbXAgRFdPUkQgcGFyaXR5bSwgMAorICAgIGplIC5wYXJpdHkwCisgICAgRklMVEVSIDEsIHByZXZxLCBjdXJxCisgICAgam1wIC5yZXQKKworLnBhcml0eTA6CisgICAgRklMVEVSIDAsIGN1cnEsIG5leHRxCisKKy5yZXQ6CisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NzZTMKK1lBRElGCitJTklUX1hNTSBzc2UyCitZQURJRgorJWlmIEFSQ0hfWDg2XzMyCitJTklUX01NWCBtbXhleHQKK1lBRElGCislZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZpbHRlci94ODYveWFkaWYtMTYuYXNtIGIvZmZtcGVnL2xpYmF2ZmlsdGVyL3g4Ni95YWRpZi0xNi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkMTI3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZpbHRlci94ODYveWFkaWYtMTYuYXNtCkBAIC0wLDAgKzEsMzE3IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIHg4Ni1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciB5YWRpZiBmaWx0ZXIKKzsqCis7KiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKzsqIENvcHlyaWdodCAoYykgMjAxMyBEYW5pZWwgS2FuZyA8ZGFuaWVsLmQua2FuZ0BnbWFpbC5jb20+Cis7KiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMyBKYW1lcyBEYXJubGV5IDxqYW1lcy5kYXJubGV5QGdtYWlsLmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorCitwd18xOiAgICB0aW1lcyA4IGR3IDEKK3B3XzgwMDA6IHRpbWVzIDggZHcgMHg4MDAwCitwZF8xOiAgICB0aW1lcyA0IGRkIDEKK3BkXzgwMDA6IHRpbWVzIDQgZGQgMHg4MDAwCisKK1NFQ1RJT04gLnRleHQKKworJW1hY3JvIFBBQlMgMgorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgcGFic2QgJTEsICUxCislZWxzZQorICAgIHB4b3IgICAgJTIsICUyCisgICAgcGNtcGd0ZCAlMiwgJTEKKyAgICBweG9yICAgICUxLCAlMgorICAgIHBzdWJkICAgJTEsICUyCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gUEFDSyAxCislaWYgY3B1ZmxhZyhzc2U0KQorICAgIHBhY2t1c2R3ICUxLCAlMQorJWVsc2UKKyAgICBwc3ViZCAgICAlMSwgW3BkXzgwMDBdCisgICAgcGFja3NzZHcgJTEsICUxCisgICAgcGFkZHcgICAgJTEsIFtwd184MDAwXQorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFBNSU5TRCAzCislaWYgY3B1ZmxhZyhzc2U0KQorICAgIHBtaW5zZCAlMSwgJTIKKyVlbHNlCisgICAgbW92YSAgICAlMywgJTIKKyAgICBwY21wZ3RkICUzLCAlMQorICAgIHBhbmQgICAgJTEsICUzCisgICAgcGFuZG4gICAlMywgJTIKKyAgICBwb3IgICAgICUxLCAlMworJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFBNQVhTRCAzCislaWYgY3B1ZmxhZyhzc2U0KQorICAgIHBtYXhzZCAlMSwgJTIKKyVlbHNlCisgICAgbW92YSAgICAlMywgJTEKKyAgICBwY21wZ3RkICUzLCAlMgorICAgIHBhbmQgICAgJTEsICUzCisgICAgcGFuZG4gICAlMywgJTIKKyAgICBwb3IgICAgICUxLCAlMworJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFBNQVhVVyAyCislaWYgY3B1ZmxhZyhzc2U0KQorICAgIHBtYXh1dyAlMSwgJTIKKyVlbHNlCisgICAgcHN1YnVzdyAlMSwgJTIKKyAgICBwYWRkdXN3ICUxLCAlMgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIENIRUNLIDIKKyAgICBtb3Z1ICAgICAgbTIsIFtjdXJxK3QxKyUxKjJdCisgICAgbW92dSAgICAgIG0zLCBbY3VycSt0MCslMioyXQorICAgIG1vdmEgICAgICBtNCwgbTIKKyAgICBtb3ZhICAgICAgbTUsIG0yCisgICAgcHhvciAgICAgIG00LCBtMworICAgIHBhdmd3ICAgICBtNSwgbTMKKyAgICBwYW5kICAgICAgbTQsIFtwd18xXQorICAgIHBzdWJ1c3cgICBtNSwgbTQKKyAgICBSU0hJRlQgICAgbTUsIDIKKyAgICBwdW5wY2tsd2QgbTUsIG03CisgICAgbW92YSAgICAgIG00LCBtMgorICAgIHBzdWJ1c3cgICBtMiwgbTMKKyAgICBwc3VidXN3ICAgbTMsIG00CisgICAgUE1BWFVXICAgIG0yLCBtMworICAgIG1vdmEgICAgICBtMywgbTIKKyAgICBtb3ZhICAgICAgbTQsIG0yCisgICAgUlNISUZUICAgIG0zLCAyCisgICAgUlNISUZUICAgIG00LCA0CisgICAgcHVucGNrbHdkIG0yLCBtNworICAgIHB1bnBja2x3ZCBtMywgbTcKKyAgICBwdW5wY2tsd2QgbTQsIG03CisgICAgcGFkZGQgICAgIG0yLCBtMworICAgIHBhZGRkICAgICBtMiwgbTQKKyVlbmRtYWNybworCislbWFjcm8gQ0hFQ0sxIDAKKyAgICBtb3ZhICAgIG0zLCBtMAorICAgIHBjbXBndGQgbTMsIG0yCisgICAgUE1JTlNEICBtMCwgbTIsIG02CisgICAgbW92YSAgICBtNiwgbTMKKyAgICBwYW5kICAgIG01LCBtMworICAgIHBhbmRuICAgbTMsIG0xCisgICAgcG9yICAgICBtMywgbTUKKyAgICBtb3ZhICAgIG0xLCBtMworJWVuZG1hY3JvCisKKyVtYWNybyBDSEVDSzIgMAorICAgIHBhZGRkICAgbTYsIFtwZF8xXQorICAgIHBzbGxkICAgbTYsIDMwCisgICAgcGFkZGQgICBtMiwgbTYKKyAgICBtb3ZhICAgIG0zLCBtMAorICAgIHBjbXBndGQgbTMsIG0yCisgICAgUE1JTlNEICBtMCwgbTIsIG00CisgICAgcGFuZCAgICBtNSwgbTMKKyAgICBwYW5kbiAgIG0zLCBtMQorICAgIHBvciAgICAgbTMsIG01CisgICAgbW92YSAgICBtMSwgbTMKKyVlbmRtYWNybworCis7IFRoaXMgdmVyc2lvbiBvZiBDSEVDSzIgaGFzIDMgZmV3ZXIgaW5zdHJ1Y3Rpb25zIG9uIHNldHMgb2xkZXIgdGhhbiBTU0U0IGJ1dCBJCis7IGFtIG5vdCBzdXJlIHdoZXRoZXIgaXQgaXMgYW55IGZhc3Rlci4gIEEgcmV3cml0ZSBvciByZWZhY3RvciBvZiB0aGUgZmlsdGVyCis7IGNvZGUgc2hvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8gZWxpbWluYXRlIHRoZSBtb3ZlIGluc3RydWN0aW9uIGF0IHRoZSBlbmQuICBJdAorOyBleGlzdHMgdG8gc2F0aXNmeSB0aGUgZXhwZWN0YXRpb24gdGhhdCB0aGUgInNjb3JlIiB2YWx1ZXMgYXJlIGluIG0xLgorCis7ICVtYWNybyBDSEVDSzIgMAorOyAgICAgbW92YSAgICBtMywgbTAKKzsgICAgIHBjbXBndGQgbTAsIG0yCis7ICAgICBwYW5kICAgIG0wLCBtNgorOyAgICAgbW92YSAgICBtNiwgbTAKKzsgICAgIHBhbmQgICAgbTUsIG02Cis7ICAgICBwYW5kICAgIG0yLCBtMAorOyAgICAgcGFuZG4gICBtNiwgbTEKKzsgICAgIHBhbmRuICAgbTAsIG0zCis7ICAgICBwb3IgICAgIG02LCBtNQorOyAgICAgcG9yICAgICBtMCwgbTIKKzsgICAgIG1vdmEgICAgbTEsIG02Cis7ICVlbmRtYWNybworCislbWFjcm8gTE9BRCAyCisgICAgbW92aCAgICAgICUxLCAlMgorICAgIHB1bnBja2x3ZCAlMSwgbTcKKyVlbmRtYWNybworCislbWFjcm8gRklMVEVSIDMKKy5sb29wJTE6CisgICAgcHhvciAgICAgICAgIG03LCBtNworICAgIExPQUQgICAgICAgICBtMCwgW2N1cnErdDFdCisgICAgTE9BRCAgICAgICAgIG0xLCBbY3VycSt0MF0KKyAgICBMT0FEICAgICAgICAgbTIsIFslMl0KKyAgICBMT0FEICAgICAgICAgbTMsIFslM10KKyAgICBtb3ZhICAgICAgICAgbTQsIG0zCisgICAgcGFkZGQgICAgICAgIG0zLCBtMgorICAgIHBzcmFkICAgICAgICBtMywgMQorICAgIG1vdmEgICBbcnNwKyAwXSwgbTAKKyAgICBtb3ZhICAgW3JzcCsxNl0sIG0zCisgICAgbW92YSAgIFtyc3ArMzJdLCBtMQorICAgIHBzdWJkICAgICAgICBtMiwgbTQKKyAgICBQQUJTICAgICAgICAgbTIsIG00CisgICAgTE9BRCAgICAgICAgIG0zLCBbcHJldnErdDFdCisgICAgTE9BRCAgICAgICAgIG00LCBbcHJldnErdDBdCisgICAgcHN1YmQgICAgICAgIG0zLCBtMAorICAgIHBzdWJkICAgICAgICBtNCwgbTEKKyAgICBQQUJTICAgICAgICAgbTMsIG01CisgICAgUEFCUyAgICAgICAgIG00LCBtNQorICAgIHBhZGRkICAgICAgICBtMywgbTQKKyAgICBwc3JsZCAgICAgICAgbTIsIDEKKyAgICBwc3JsZCAgICAgICAgbTMsIDEKKyAgICBQTUFYU0QgICAgICAgbTIsIG0zLCBtNgorICAgIExPQUQgICAgICAgICBtMywgW25leHRxK3QxXQorICAgIExPQUQgICAgICAgICBtNCwgW25leHRxK3QwXQorICAgIHBzdWJkICAgICAgICBtMywgbTAKKyAgICBwc3ViZCAgICAgICAgbTQsIG0xCisgICAgUEFCUyAgICAgICAgIG0zLCBtNQorICAgIFBBQlMgICAgICAgICBtNCwgbTUKKyAgICBwYWRkZCAgICAgICAgbTMsIG00CisgICAgcHNybGQgICAgICAgIG0zLCAxCisgICAgUE1BWFNEICAgICAgIG0yLCBtMywgbTYKKyAgICBtb3ZhICAgW3JzcCs0OF0sIG0yCisKKyAgICBwYWRkZCAgICAgICAgbTEsIG0wCisgICAgcGFkZGQgICAgICAgIG0wLCBtMAorICAgIHBzdWJkICAgICAgICBtMCwgbTEKKyAgICBwc3JsZCAgICAgICAgbTEsIDEKKyAgICBQQUJTICAgICAgICAgbTAsIG0yCisKKyAgICBtb3Z1ICAgICAgICAgbTIsIFtjdXJxK3QxLTEqMl0KKyAgICBtb3Z1ICAgICAgICAgbTMsIFtjdXJxK3QwLTEqMl0KKyAgICBtb3ZhICAgICAgICAgbTQsIG0yCisgICAgcHN1YnVzdyAgICAgIG0yLCBtMworICAgIHBzdWJ1c3cgICAgICBtMywgbTQKKyAgICBQTUFYVVcgICAgICAgbTIsIG0zCisgICAgbW92YSAgICAgICAgIG0zLCBtMgorICAgIFJTSElGVCAgICAgICBtMywgNAorICAgIHB1bnBja2x3ZCAgICBtMiwgbTcKKyAgICBwdW5wY2tsd2QgICAgbTMsIG03CisgICAgcGFkZGQgICAgICAgIG0wLCBtMgorICAgIHBhZGRkICAgICAgICBtMCwgbTMKKyAgICBwc3ViZCAgICAgICAgbTAsIFtwZF8xXQorCisgICAgQ0hFQ0sgLTIsIDAKKyAgICBDSEVDSzEKKyAgICBDSEVDSyAtMywgMQorICAgIENIRUNLMgorICAgIENIRUNLIDAsIC0yCisgICAgQ0hFQ0sxCisgICAgQ0hFQ0sgMSwgLTMKKyAgICBDSEVDSzIKKworICAgIG1vdmEgICAgICAgICBtNiwgW3JzcCs0OF0KKyAgICBjbXAgICBEV09SRCByOG0sIDIKKyAgICBqZ2UgLmVuZCUxCisgICAgTE9BRCAgICAgICAgIG0yLCBbJTIrdDEqMl0KKyAgICBMT0FEICAgICAgICAgbTQsIFslMyt0MSoyXQorICAgIExPQUQgICAgICAgICBtMywgWyUyK3QwKjJdCisgICAgTE9BRCAgICAgICAgIG01LCBbJTMrdDAqMl0KKyAgICBwYWRkZCAgICAgICAgbTIsIG00CisgICAgcGFkZGQgICAgICAgIG0zLCBtNQorICAgIHBzcmxkICAgICAgICBtMiwgMQorICAgIHBzcmxkICAgICAgICBtMywgMQorICAgIG1vdmEgICAgICAgICBtNCwgW3JzcCsgMF0KKyAgICBtb3ZhICAgICAgICAgbTUsIFtyc3ArMTZdCisgICAgbW92YSAgICAgICAgIG03LCBbcnNwKzMyXQorICAgIHBzdWJkICAgICAgICBtMiwgbTQKKyAgICBwc3ViZCAgICAgICAgbTMsIG03CisgICAgbW92YSAgICAgICAgIG0wLCBtNQorICAgIHBzdWJkICAgICAgICBtNSwgbTQKKyAgICBwc3ViZCAgICAgICAgbTAsIG03CisgICAgbW92YSAgICAgICAgIG00LCBtMgorICAgIFBNSU5TRCAgICAgICBtMiwgbTMsIG03CisgICAgUE1BWFNEICAgICAgIG0zLCBtNCwgbTcKKyAgICBQTUFYU0QgICAgICAgbTIsIG01LCBtNworICAgIFBNSU5TRCAgICAgICBtMywgbTUsIG03CisgICAgUE1BWFNEICAgICAgIG0yLCBtMCwgbTcKKyAgICBQTUlOU0QgICAgICAgbTMsIG0wLCBtNworICAgIHB4b3IgICAgICAgICBtNCwgbTQKKyAgICBQTUFYU0QgICAgICAgbTYsIG0zLCBtNworICAgIHBzdWJkICAgICAgICBtNCwgbTIKKyAgICBQTUFYU0QgICAgICAgbTYsIG00LCBtNworCisuZW5kJTE6CisgICAgbW92YSAgICAgICAgIG0yLCBbcnNwKzE2XQorICAgIG1vdmEgICAgICAgICBtMywgbTIKKyAgICBwc3ViZCAgICAgICAgbTIsIG02CisgICAgcGFkZGQgICAgICAgIG0zLCBtNgorICAgIFBNQVhTRCAgICAgICBtMSwgbTIsIG03CisgICAgUE1JTlNEICAgICAgIG0xLCBtMywgbTcKKyAgICBQQUNLICAgICAgICAgbTEKKworICAgIG1vdmggICAgIFtkc3RxXSwgbTEKKyAgICBhZGQgICAgICAgIGRzdHEsIG1tc2l6ZS8yCisgICAgYWRkICAgICAgIHByZXZxLCBtbXNpemUvMgorICAgIGFkZCAgICAgICAgY3VycSwgbW1zaXplLzIKKyAgICBhZGQgICAgICAgbmV4dHEsIG1tc2l6ZS8yCisgICAgc3ViICAgRFdPUkQgcjRtLCBtbXNpemUvNAorICAgIGpnIC5sb29wJTEKKyVlbmRtYWNybworCislbWFjcm8gWUFESUYgMAorJWlmIEFSQ0hfWDg2XzMyCitjZ2xvYmFsIHlhZGlmX2ZpbHRlcl9saW5lXzE2Yml0LCA0LCA2LCA4LCA4MCwgZHN0LCBwcmV2LCBjdXIsIG5leHQsIHcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmcywgbXJlZnMsIHBhcml0eSwgbW9kZQorJWVsc2UKK2NnbG9iYWwgeWFkaWZfZmlsdGVyX2xpbmVfMTZiaXQsIDQsIDcsIDgsIDgwLCBkc3QsIHByZXYsIGN1ciwgbmV4dCwgdywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZzLCBtcmVmcywgcGFyaXR5LCBtb2RlCislZW5kaWYKKyVpZiBBUkNIX1g4Nl8zMgorICAgIG1vdiAgICAgICAgICAgIHI0LCByNW1wCisgICAgbW92ICAgICAgICAgICAgcjUsIHI2bXAKKyAgICBERUNMQVJFX1JFR19UTVAgNCw1CislZWxzZQorICAgIG1vdnN4ZCAgICAgICAgIHI1LCBEV09SRCByNW0KKyAgICBtb3ZzeGQgICAgICAgICByNiwgRFdPUkQgcjZtCisgICAgREVDTEFSRV9SRUdfVE1QIDUsNgorJWVuZGlmCisKKyAgICBjbXAgRFdPUkQgcGFyaXR5bSwgMAorICAgIGplIC5wYXJpdHkwCisgICAgRklMVEVSIDEsIHByZXZxLCBjdXJxCisgICAgam1wIC5yZXQKKworLnBhcml0eTA6CisgICAgRklMVEVSIDAsIGN1cnEsIG5leHRxCisKKy5yZXQ6CisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlNAorWUFESUYKK0lOSVRfWE1NIHNzc2UzCitZQURJRgorSU5JVF9YTU0gc3NlMgorWUFESUYKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggbW14ZXh0CitZQURJRgorJWVuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmaWx0ZXIveWFkaWYuaCBiL2ZmbXBlZy9saWJhdmZpbHRlci95YWRpZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjJjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmaWx0ZXIveWFkaWYuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfWUFESUZfSAorI2RlZmluZSBBVkZJTFRFUl9ZQURJRl9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisKK2VudW0gWUFESUZNb2RlIHsKKyAgICBZQURJRl9NT0RFX1NFTkRfRlJBTUUgICAgICAgICAgID0gMCwgLy8vPCBzZW5kIDEgZnJhbWUgZm9yIGVhY2ggZnJhbWUKKyAgICBZQURJRl9NT0RFX1NFTkRfRklFTEQgICAgICAgICAgID0gMSwgLy8vPCBzZW5kIDEgZnJhbWUgZm9yIGVhY2ggZmllbGQKKyAgICBZQURJRl9NT0RFX1NFTkRfRlJBTUVfTk9TUEFUSUFMID0gMiwgLy8vPCBzZW5kIDEgZnJhbWUgZm9yIGVhY2ggZnJhbWUgYnV0IHNraXBzIHNwYXRpYWwgaW50ZXJsYWNpbmcgY2hlY2sKKyAgICBZQURJRl9NT0RFX1NFTkRfRklFTERfTk9TUEFUSUFMID0gMywgLy8vPCBzZW5kIDEgZnJhbWUgZm9yIGVhY2ggZmllbGQgYnV0IHNraXBzIHNwYXRpYWwgaW50ZXJsYWNpbmcgY2hlY2sKK307CisKK2VudW0gWUFESUZQYXJpdHkgeworICAgIFlBRElGX1BBUklUWV9URkYgID0gIDAsIC8vLzwgdG9wIGZpZWxkIGZpcnN0CisgICAgWUFESUZfUEFSSVRZX0JGRiAgPSAgMSwgLy8vPCBib3R0b20gZmllbGQgZmlyc3QKKyAgICBZQURJRl9QQVJJVFlfQVVUTyA9IC0xLCAvLy88IGF1dG8gZGV0ZWN0aW9uCit9OworCitlbnVtIFlBRElGRGVpbnQgeworICAgIFlBRElGX0RFSU5UX0FMTCAgICAgICAgPSAwLCAvLy88IGRlaW50ZXJsYWNlIGFsbCBmcmFtZXMKKyAgICBZQURJRl9ERUlOVF9JTlRFUkxBQ0VEID0gMSwgLy8vPCBvbmx5IGRlaW50ZXJsYWNlIGZyYW1lcyBtYXJrZWQgYXMgaW50ZXJsYWNlZAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgWUFESUZDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGVudW0gWUFESUZNb2RlICAgbW9kZTsKKyAgICBlbnVtIFlBRElGUGFyaXR5IHBhcml0eTsKKyAgICBlbnVtIFlBRElGRGVpbnQgIGRlaW50OworCisgICAgaW50IGZyYW1lX3BlbmRpbmc7CisKKyAgICBBVkZyYW1lICpjdXI7CisgICAgQVZGcmFtZSAqbmV4dDsKKyAgICBBVkZyYW1lICpwcmV2OworICAgIEFWRnJhbWUgKm91dDsKKworICAgIC8qKgorICAgICAqIFJlcXVpcmVkIGFsaWdubWVudCBmb3IgZmlsdGVyX2xpbmUKKyAgICAgKi8KKyAgICB2b2lkICgqZmlsdGVyX2xpbmUpKHZvaWQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnByZXYsIHZvaWQgKmN1ciwgdm9pZCAqbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgcHJlZnMsIGludCBtcmVmcywgaW50IHBhcml0eSwgaW50IG1vZGUpOworICAgIHZvaWQgKCpmaWx0ZXJfZWRnZXMpKHZvaWQgKmRzdCwgdm9pZCAqcHJldiwgdm9pZCAqY3VyLCB2b2lkICpuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgcHJlZnMsIGludCBtcmVmcywgaW50IHBhcml0eSwgaW50IG1vZGUpOworCisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpjc3A7CisgICAgaW50IGVvZjsKKyAgICB1aW50OF90ICp0ZW1wX2xpbmU7CisgICAgaW50IHRlbXBfbGluZV9zaXplOworfSBZQURJRkNvbnRleHQ7CisKK3ZvaWQgZmZfeWFkaWZfaW5pdF94ODYoWUFESUZDb250ZXh0ICp5YWRpZik7CisKKyNlbmRpZiAvKiBBVkZJTFRFUl9ZQURJRl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvNHhtLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvNHhtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwZTVhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC80eG0uYwpAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqIDRYIFRlY2hub2xvZ2llcyAuNHhtIEZpbGUgRGVtdXhlciAobm8gbXV4ZXIpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiA0WCBUZWNobm9sb2dpZXMgZmlsZSBkZW11eGVyCisgKiBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQorICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIC40eG0gZmlsZSBmb3JtYXQsIHZpc2l0OgorICogICBodHRwOi8vd3d3LnBjaXN5cy5uZXQvfm1lbGFuc29uL2NvZGVjcy8KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSAgICAgUklGRl9UQUcgTUtUQUcoJ1InLCAnSScsICdGJywgJ0YnKQorI2RlZmluZSAgRk9VUlhNVl9UQUcgTUtUQUcoJzQnLCAnWCcsICdNJywgJ1YnKQorI2RlZmluZSAgICAgTElTVF9UQUcgTUtUQUcoJ0wnLCAnSScsICdTJywgJ1QnKQorI2RlZmluZSAgICAgSEVBRF9UQUcgTUtUQUcoJ0gnLCAnRScsICdBJywgJ0QnKQorI2RlZmluZSAgICAgVFJLX19UQUcgTUtUQUcoJ1QnLCAnUicsICdLJywgJ18nKQorI2RlZmluZSAgICAgTU9WSV9UQUcgTUtUQUcoJ00nLCAnTycsICdWJywgJ0knKQorI2RlZmluZSAgICAgVlRSS19UQUcgTUtUQUcoJ1YnLCAnVCcsICdSJywgJ0snKQorI2RlZmluZSAgICAgU1RSS19UQUcgTUtUQUcoJ1MnLCAnVCcsICdSJywgJ0snKQorI2RlZmluZSAgICAgc3RkX19UQUcgTUtUQUcoJ3MnLCAndCcsICdkJywgJ18nKQorI2RlZmluZSAgICAgbmFtZV9UQUcgTUtUQUcoJ24nLCAnYScsICdtJywgJ2UnKQorI2RlZmluZSAgICAgdnRya19UQUcgTUtUQUcoJ3YnLCAndCcsICdyJywgJ2snKQorI2RlZmluZSAgICAgc3Rya19UQUcgTUtUQUcoJ3MnLCAndCcsICdyJywgJ2snKQorI2RlZmluZSAgICAgaWZybV9UQUcgTUtUQUcoJ2knLCAnZicsICdyJywgJ20nKQorI2RlZmluZSAgICAgcGZybV9UQUcgTUtUQUcoJ3AnLCAnZicsICdyJywgJ20nKQorI2RlZmluZSAgICAgY2ZybV9UQUcgTUtUQUcoJ2MnLCAnZicsICdyJywgJ20nKQorI2RlZmluZSAgICAgaWZyMl9UQUcgTUtUQUcoJ2knLCAnZicsICdyJywgJzInKQorI2RlZmluZSAgICAgcGZyMl9UQUcgTUtUQUcoJ3AnLCAnZicsICdyJywgJzInKQorI2RlZmluZSAgICAgY2ZyMl9UQUcgTUtUQUcoJ2MnLCAnZicsICdyJywgJzInKQorI2RlZmluZSAgICAgc25kX19UQUcgTUtUQUcoJ3MnLCAnbicsICdkJywgJ18nKQorCisjZGVmaW5lIHZ0cmtfU0laRSAweDQ0CisjZGVmaW5lIHN0cmtfU0laRSAweDI4CisKKyNkZWZpbmUgR0VUX0xJU1RfSEVBREVSKCkgXAorICAgIGZvdXJjY190YWcgPSBhdmlvX3JsMzIocGIpOyBcCisgICAgc2l6ZSAgICAgICA9IGF2aW9fcmwzMihwYik7IFwKKyAgICBpZiAoZm91cmNjX3RhZyAhPSBMSVNUX1RBRykgXAorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgXAorICAgIGZvdXJjY190YWcgPSBhdmlvX3JsMzIocGIpOworCit0eXBlZGVmIHN0cnVjdCBBdWRpb1RyYWNrIHsKKyAgICBpbnQgc2FtcGxlX3JhdGU7CisgICAgaW50IGJpdHM7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBzdHJlYW1faW5kZXg7CisgICAgaW50IGFkcGNtOworICAgIGludDY0X3QgYXVkaW9fcHRzOworfSBBdWRpb1RyYWNrOworCit0eXBlZGVmIHN0cnVjdCBGb3VyeG1EZW11eENvbnRleHQgeworICAgIGludCB2aWRlb19zdHJlYW1faW5kZXg7CisgICAgaW50IHRyYWNrX2NvdW50OworICAgIEF1ZGlvVHJhY2sgKnRyYWNrczsKKworICAgIGludDY0X3QgdmlkZW9fcHRzOworICAgIGZsb2F0IGZwczsKK30gRm91cnhtRGVtdXhDb250ZXh0OworCitzdGF0aWMgaW50IGZvdXJ4bV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoKEFWX1JMMzIoJnAtPmJ1ZlswXSkgIT0gUklGRl9UQUcpIHx8CisgICAgICAgIChBVl9STDMyKCZwLT5idWZbOF0pICE9IEZPVVJYTVZfVEFHKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdnRyayhBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgRm91cnhtRGVtdXhDb250ZXh0ICpmb3VyeG0sIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQpCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIGRhdGEgKi8KKyAgICBpZiAoc2l6ZSAhPSB2dHJrX1NJWkUgfHwgbGVmdCA8IHNpemUgKyA4KSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIGEgbmV3IEFWU3RyZWFtICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2MCwgMSwgZm91cnhtLT5mcHMpOworCisgICAgZm91cnhtLT52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF80WE07CisKKyAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSAgICAgID0gYXZfbWFsbG9jeig0ICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gNDsKKyAgICBBVl9XTDMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBBVl9STDMyKGJ1ZiArIDE2KSk7CisgICAgc3QtPmNvZGVjLT53aWR0aCAgPSBBVl9STDMyKGJ1ZiArIDM2KTsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IEFWX1JMMzIoYnVmICsgNDApOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwYXJzZV9zdHJrKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICBGb3VyeG1EZW11eENvbnRleHQgKmZvdXJ4bSwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IHRyYWNrOworICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIGRhdGEgKi8KKyAgICBpZiAoc2l6ZSAhPSBzdHJrX1NJWkUgfHwgbGVmdCA8IHNpemUgKyA4KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHRyYWNrID0gQVZfUkwzMihidWYgKyA4KTsKKyAgICBpZiAoKHVuc2lnbmVkKXRyYWNrID49IFVJTlRfTUFYIC8gc2l6ZW9mKEF1ZGlvVHJhY2spIC0gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY3VycmVudF90cmFjayB0b28gbGFyZ2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAodHJhY2sgKyAxID4gZm91cnhtLT50cmFja19jb3VudCkgeworICAgICAgICBpZiAoYXZfcmVhbGxvY3BfYXJyYXkoJmZvdXJ4bS0+dHJhY2tzLCB0cmFjayArIDEsIHNpemVvZihBdWRpb1RyYWNrKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBtZW1zZXQoJmZvdXJ4bS0+dHJhY2tzW2ZvdXJ4bS0+dHJhY2tfY291bnRdLCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKEF1ZGlvVHJhY2spICogKHRyYWNrICsgMSAtIGZvdXJ4bS0+dHJhY2tfY291bnQpKTsKKyAgICAgICAgZm91cnhtLT50cmFja19jb3VudCA9IHRyYWNrICsgMTsKKyAgICB9CisgICAgZm91cnhtLT50cmFja3NbdHJhY2tdLmFkcGNtICAgICAgID0gQVZfUkwzMihidWYgKyAxMik7CisgICAgZm91cnhtLT50cmFja3NbdHJhY2tdLmNoYW5uZWxzICAgID0gQVZfUkwzMihidWYgKyAzNik7CisgICAgZm91cnhtLT50cmFja3NbdHJhY2tdLnNhbXBsZV9yYXRlID0gQVZfUkwzMihidWYgKyA0MCk7CisgICAgZm91cnhtLT50cmFja3NbdHJhY2tdLmJpdHMgICAgICAgID0gQVZfUkwzMihidWYgKyA0NCk7CisgICAgZm91cnhtLT50cmFja3NbdHJhY2tdLmF1ZGlvX3B0cyAgID0gMDsKKworICAgIGlmIChmb3VyeG0tPnRyYWNrc1t0cmFja10uY2hhbm5lbHMgICAgPD0gMCB8fAorICAgICAgICBmb3VyeG0tPnRyYWNrc1t0cmFja10uc2FtcGxlX3JhdGUgPD0gMCB8fAorICAgICAgICBmb3VyeG0tPnRyYWNrc1t0cmFja10uYml0cyAgICAgICAgPD0gMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiYXVkaW8gaGVhZGVyIGludmFsaWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKCFmb3VyeG0tPnRyYWNrc1t0cmFja10uYWRwY20gJiYgZm91cnhtLT50cmFja3NbdHJhY2tdLmJpdHM8OCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiYml0cyB1bnNwZWNpZmllZCBmb3Igbm9uIEFEUENNXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgYSBuZXcgQVZTdHJlYW0gKi8KKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5pZCA9IHRyYWNrOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDYwLCAxLCBmb3VyeG0tPnRyYWNrc1t0cmFja10uc2FtcGxlX3JhdGUpOworCisgICAgZm91cnhtLT50cmFja3NbdHJhY2tdLnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgICAgICAgICAgID0gMDsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICAgICAgICA9IGZvdXJ4bS0+dHJhY2tzW3RyYWNrXS5jaGFubmVsczsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgICAgICAgICA9IGZvdXJ4bS0+dHJhY2tzW3RyYWNrXS5zYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGZvdXJ4bS0+dHJhY2tzW3RyYWNrXS5iaXRzOworICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICAgICAgICAgICAgID0gc3QtPmNvZGVjLT5jaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gICAgICAgICAgID0gc3QtPmNvZGVjLT5jaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKworICAgIGlmIChmb3VyeG0tPnRyYWNrc1t0cmFja10uYWRwY20peworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fNFhNOworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gOCkgeworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgIH0gZWxzZQorICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm91cnhtX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1bnNpZ25lZCBpbnQgZm91cmNjX3RhZzsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICBpbnQgaGVhZGVyX3NpemU7CisgICAgRm91cnhtRGVtdXhDb250ZXh0ICpmb3VyeG0gPSBzLT5wcml2X2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqaGVhZGVyOworICAgIGludCBpLCByZXQ7CisKKyAgICBmb3VyeG0tPnRyYWNrX2NvdW50ID0gMDsKKyAgICBmb3VyeG0tPnRyYWNrcyAgICAgID0gTlVMTDsKKyAgICBmb3VyeG0tPmZwcyAgICAgICAgID0gMS4wOworCisgICAgLyogc2tpcCB0aGUgZmlyc3QgMyAzMi1iaXQgbnVtYmVycyAqLworICAgIGF2aW9fc2tpcChwYiwgMTIpOworCisgICAgLyogY2hlY2sgZm9yIExJU1QtSEVBRCAqLworICAgIEdFVF9MSVNUX0hFQURFUigpOworICAgIGhlYWRlcl9zaXplID0gc2l6ZSAtIDQ7CisgICAgaWYgKGZvdXJjY190YWcgIT0gSEVBRF9UQUcgfHwgaGVhZGVyX3NpemUgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgaGVhZGVyIGFuZCBsb2FkIHRoZSB3aG9sZSB0aGluZyAqLworICAgIGhlYWRlciA9IGF2X21hbGxvYyhoZWFkZXJfc2l6ZSk7CisgICAgaWYgKCFoZWFkZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaWYgKGF2aW9fcmVhZChwYiwgaGVhZGVyLCBoZWFkZXJfc2l6ZSkgIT0gaGVhZGVyX3NpemUpIHsKKyAgICAgICAgYXZfZnJlZShoZWFkZXIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIC8qIHRha2UgdGhlIGxhenkgYXBwcm9hY2ggYW5kIHNlYXJjaCBmb3IgYW55IGFuZCBhbGwgdnRyayBhbmQgc3RyayBjaHVua3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVhZGVyX3NpemUgLSA4OyBpKyspIHsKKyAgICAgICAgZm91cmNjX3RhZyA9IEFWX1JMMzIoJmhlYWRlcltpXSk7CisgICAgICAgIHNpemUgICAgICAgPSBBVl9STDMyKCZoZWFkZXJbaSArIDRdKTsKKyAgICAgICAgaWYgKHNpemUgPiBoZWFkZXJfc2l6ZSAtIGkgLSA4ICYmIChmb3VyY2NfdGFnID09IHZ0cmtfVEFHIHx8IGZvdXJjY190YWcgPT0gc3Rya19UQUcpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY2h1bmsgbGFyZ2VyIHRoYW4gYXJyYXkgJWQ+JWRcbiIsIHNpemUsIGhlYWRlcl9zaXplIC0gaSAtIDgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91cmNjX3RhZyA9PSBzdGRfX1RBRykgeworICAgICAgICAgICAgaWYgKGhlYWRlcl9zaXplIC0gaSA8IDE2KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInN0ZCBUQUcgdHJ1bmNhdGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvdXJ4bS0+ZnBzID0gYXZfaW50MmZsb2F0KEFWX1JMMzIoJmhlYWRlcltpICsgMTJdKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZm91cmNjX3RhZyA9PSB2dHJrX1RBRykgeworICAgICAgICAgICAgaWYgKChyZXQgPSBwYXJzZV92dHJrKHMsIGZvdXJ4bSwgaGVhZGVyICsgaSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfc2l6ZSAtIGkpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgICAgICBpICs9IDggKyBzaXplOworICAgICAgICB9IGVsc2UgaWYgKGZvdXJjY190YWcgPT0gc3Rya19UQUcpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gcGFyc2Vfc3RyayhzLCBmb3VyeG0sIGhlYWRlciArIGksIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX3NpemUgLSBpKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICAgICAgaSArPSA4ICsgc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNraXAgb3ZlciB0aGUgTElTVC1NT1ZJIGNodW5rICh3aGljaCBpcyB3aGVyZSB0aGUgc3RyZWFtIHNob3VsZCBiZSAqLworICAgIEdFVF9MSVNUX0hFQURFUigpOworICAgIGlmIChmb3VyY2NfdGFnICE9IE1PVklfVEFHKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdl9mcmVlKGhlYWRlcik7CisgICAgLyogaW5pdGlhbGl6ZSBjb250ZXh0IG1lbWJlcnMgKi8KKyAgICBmb3VyeG0tPnZpZGVvX3B0cyA9IC0xOyAgLyogZmlyc3QgZnJhbWUgd2lsbCBwdXNoIHRvIDAgKi8KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBhdl9mcmVlcCgmZm91cnhtLT50cmFja3MpOworICAgIGF2X2ZyZWUoaGVhZGVyKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZvdXJ4bV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIEZvdXJ4bURlbXV4Q29udGV4dCAqZm91cnhtID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiAgICAgICAgICAgID0gcy0+cGI7CisgICAgdW5zaWduZWQgaW50IGZvdXJjY190YWc7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgaW50IHJldCA9IDA7CisgICAgdW5zaWduZWQgaW50IHRyYWNrX251bWJlcjsKKyAgICBpbnQgcGFja2V0X3JlYWQgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyWzhdOworICAgIGludCBhdWRpb19mcmFtZV9jb3VudDsKKworICAgIHdoaWxlICghcGFja2V0X3JlYWQpIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX3JlYWQocy0+cGIsIGhlYWRlciwgOCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGZvdXJjY190YWcgPSBBVl9STDMyKCZoZWFkZXJbMF0pOworICAgICAgICBzaXplICAgICAgID0gQVZfUkwzMigmaGVhZGVyWzRdKTsKKyAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICBzd2l0Y2ggKGZvdXJjY190YWcpIHsKKyAgICAgICAgY2FzZSBMSVNUX1RBRzoKKyAgICAgICAgICAgIC8qIHRoaXMgaXMgYSBnb29kIHRpbWUgdG8gYnVtcCB0aGUgdmlkZW8gcHRzICovCisgICAgICAgICAgICBmb3VyeG0tPnZpZGVvX3B0cysrOworCisgICAgICAgICAgICAvKiBza2lwIHRoZSBMSVNULSogdGFnIGFuZCBtb3ZlIG9uIHRvIHRoZSBuZXh0IGZvdXJjYyAqLworICAgICAgICAgICAgYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgaWZybV9UQUc6CisgICAgICAgIGNhc2UgcGZybV9UQUc6CisgICAgICAgIGNhc2UgY2ZybV9UQUc6CisgICAgICAgIGNhc2UgaWZyMl9UQUc6CisgICAgICAgIGNhc2UgcGZyMl9UQUc6CisgICAgICAgIGNhc2UgY2ZyMl9UQUc6CisgICAgICAgICAgICAvKiBhbGxvY2F0ZSA4IG1vcmUgYnl0ZXMgdGhhbiAnc2l6ZScgdG8gYWNjb3VudCBmb3IgZm91cmNjCisgICAgICAgICAgICAgKiBhbmQgc2l6ZSAqLworICAgICAgICAgICAgaWYgKHNpemUgKyA4IDwgc2l6ZSB8fCBhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSArIDgpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGZvdXJ4bS0+dmlkZW9fc3RyZWFtX2luZGV4OworICAgICAgICAgICAgcGt0LT5wdHMgICAgICAgICAgPSBmb3VyeG0tPnZpZGVvX3B0czsKKyAgICAgICAgICAgIHBrdC0+cG9zICAgICAgICAgID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIGhlYWRlciwgOCk7CisgICAgICAgICAgICByZXQgPSBhdmlvX3JlYWQocy0+cGIsICZwa3QtPmRhdGFbOF0sIHNpemUpOworCisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhY2tldF9yZWFkID0gMTsKKyAgICAgICAgICAgICAgICBhdl9zaHJpbmtfcGFja2V0KHBrdCwgcmV0ICsgOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHNuZF9fVEFHOgorICAgICAgICAgICAgdHJhY2tfbnVtYmVyID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgICAgICAgICBzaXplIC09IDg7CisKKyAgICAgICAgICAgIGlmICh0cmFja19udW1iZXIgPCBmb3VyeG0tPnRyYWNrX2NvdW50ICYmCisgICAgICAgICAgICAgICAgZm91cnhtLT50cmFja3NbdHJhY2tfbnVtYmVyXS5jaGFubmVscyA+IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgZm91cnhtLT50cmFja3NbdHJhY2tfbnVtYmVyXS5zdHJlYW1faW5kZXg7CisgICAgICAgICAgICAgICAgcGt0LT5wdHMgICAgPSBmb3VyeG0tPnRyYWNrc1t0cmFja19udW1iZXJdLmF1ZGlvX3B0czsKKyAgICAgICAgICAgICAgICBwYWNrZXRfcmVhZCA9IDE7CisKKyAgICAgICAgICAgICAgICAvKiBwdHMgYWNjb3VudGluZyAqLworICAgICAgICAgICAgICAgIGF1ZGlvX2ZyYW1lX2NvdW50ID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoZm91cnhtLT50cmFja3NbdHJhY2tfbnVtYmVyXS5hZHBjbSkKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fZnJhbWVfY291bnQgLT0gMiAqIChmb3VyeG0tPnRyYWNrc1t0cmFja19udW1iZXJdLmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBhdWRpb19mcmFtZV9jb3VudCAvPSBmb3VyeG0tPnRyYWNrc1t0cmFja19udW1iZXJdLmNoYW5uZWxzOworICAgICAgICAgICAgICAgIGlmIChmb3VyeG0tPnRyYWNrc1t0cmFja19udW1iZXJdLmFkcGNtKSB7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2ZyYW1lX2NvdW50ICo9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2ZyYW1lX2NvdW50IC89CisgICAgICAgICAgICAgICAgICAgICAgICAoZm91cnhtLT50cmFja3NbdHJhY2tfbnVtYmVyXS5iaXRzIC8gOCk7CisgICAgICAgICAgICAgICAgZm91cnhtLT50cmFja3NbdHJhY2tfbnVtYmVyXS5hdWRpb19wdHMgKz0gYXVkaW9fZnJhbWVfY291bnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZm91cnhtX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEZvdXJ4bURlbXV4Q29udGV4dCAqZm91cnhtID0gcy0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmZvdXJ4bS0+dHJhY2tzKTsKKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2ZvdXJ4bV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICI0eG0iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCI0WCBUZWNobm9sb2dpZXMiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRm91cnhtRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBmb3VyeG1fcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZm91cnhtX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZvdXJ4bV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBmb3VyeG1fcmVhZF9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvTWFrZWZpbGUgYi9mZm1wZWcvbGliYXZmb3JtYXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5MDBjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9NYWtlZmlsZQpAQCAtMCwwICsxLDU0MiBAQAoraW5jbHVkZSAkKFNVQkRJUikuLi9jb25maWcubWFrCisKK05BTUUgPSBhdmZvcm1hdAorCitIRUFERVJTID0gYXZmb3JtYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYXZpby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdmVyc2lvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK09CSlMgPSBhbGxmb3JtYXRzLm8gICAgICAgICBcCisgICAgICAgYXZpby5vICAgICAgICAgICAgICAgXAorICAgICAgIGF2aW9idWYubyAgICAgICAgICAgIFwKKyAgICAgICBjdXRpbHMubyAgICAgICAgICAgICBcCisgICAgICAgZHVtcC5vICAgICAgICAgICAgICAgXAorICAgICAgIGZvcm1hdC5vICAgICAgICAgICAgIFwKKyAgICAgICBpZDN2MS5vICAgICAgICAgICAgICBcCisgICAgICAgaWQzdjIubyAgICAgICAgICAgICAgXAorICAgICAgIG1ldGFkYXRhLm8gICAgICAgICAgIFwKKyAgICAgICBtdXgubyAgICAgICAgICAgICAgICBcCisgICAgICAgb3B0aW9ucy5vICAgICAgICAgICAgXAorICAgICAgIG9zX3N1cHBvcnQubyAgICAgICAgIFwKKyAgICAgICByaWZmLm8gICAgICAgICAgICAgICBcCisgICAgICAgc2RwLm8gICAgICAgICAgICAgICAgXAorICAgICAgIHNlZWsubyAgICAgICAgICAgICAgIFwKKyAgICAgICB1cmwubyAgICAgICAgICAgICAgICBcCisgICAgICAgdXRpbHMubyAgICAgICAgICAgICAgXAorCitPQkpTLSQoQ09ORklHX05FVFdPUkspICAgICAgICAgICAgICAgICAgICs9IG5ldHdvcmsubworT0JKUy0kKENPTkZJR19SSUZGREVDKSAgICAgICAgICAgICAgICAgICArPSByaWZmZGVjLm8KK09CSlMtJChDT05GSUdfUklGRkVOQykgICAgICAgICAgICAgICAgICAgKz0gcmlmZmVuYy5vCitPQkpTLSQoQ09ORklHX1JUUERFQykgICAgICAgICAgICAgICAgICAgICs9IHJkdC5vICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cC5vICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlYy5vICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19hbXIubyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19hc2YubyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19nNzI2Lm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19oMjYxLm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19oMjYzLm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19oMjYzX3JmYzIxOTAubyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19oMjY0Lm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19oZXZjLm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19pbGJjLm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19qcGVnLm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19sYXRtLm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19tcGVnMTIubyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19tcGVnNC5vICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19tcGVndHMubyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19xY2VscC5vICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19xZG0yLm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19xdC5vICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY19zdnEzLm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY192cDgubyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGRlY194aXBoLm8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNydHAubworT0JKUy0kKENPTkZJR19SVFBFTkNfQ0hBSU4pICAgICAgICAgICAgICArPSBydHBlbmNfY2hhaW4ubyBydHAubworT0JKUy0kKENPTkZJR19TSEFSRUQpICAgICAgICAgICAgICAgICAgICArPSBsb2cyX3RhYi5vIGdvbG9tYl90YWIubworCisjIG11eGVycy9kZW11eGVycworT0JKUy0kKENPTkZJR19BNjRfTVVYRVIpICAgICAgICAgICAgICAgICArPSBhNjQubyByYXdlbmMubworT0JKUy0kKENPTkZJR19BQUNfREVNVVhFUikgICAgICAgICAgICAgICArPSBhYWNkZWMubyBhcGV0YWcubyBpbWcyLm8gcmF3ZGVjLm8KK09CSlMtJChDT05GSUdfQUMzX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYWMzZGVjLm8gcmF3ZGVjLm8KK09CSlMtJChDT05GSUdfQUMzX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfQUNUX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYWN0Lm8KK09CSlMtJChDT05GSUdfQURGX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYmludGV4dC5vIHNhdWNlLm8KK09CSlMtJChDT05GSUdfQURQX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYWRwLm8KK09CSlMtJChDT05GSUdfQURYX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYWR4ZGVjLm8KK09CSlMtJChDT05GSUdfQURYX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfQURUU19NVVhFUikgICAgICAgICAgICAgICAgKz0gYWR0c2VuYy5vIGFwZXRhZy5vIGltZzIubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkM3YyZW5jLm8KK09CSlMtJChDT05GSUdfQUVBX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYWVhLm8gcGNtLm8KK09CSlMtJChDT05GSUdfQUZDX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYWZjLm8KK09CSlMtJChDT05GSUdfQUlGRl9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gYWlmZmRlYy5vIHBjbS5vIGlzb20ubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdl9jaGFuLm8KK09CSlMtJChDT05GSUdfQUlGRl9NVVhFUikgICAgICAgICAgICAgICAgKz0gYWlmZmVuYy5vIGlzb20ubyBpZDN2MmVuYy5vCitPQkpTLSQoQ09ORklHX0FNUl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGFtci5vCitPQkpTLSQoQ09ORklHX0FNUl9NVVhFUikgICAgICAgICAgICAgICAgICs9IGFtci5vCitPQkpTLSQoQ09ORklHX0FOTV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGFubS5vCitPQkpTLSQoQ09ORklHX0FQQ19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGFwYy5vCitPQkpTLSQoQ09ORklHX0FQRV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGFwZS5vIGFwZXRhZy5vIGltZzIubworT0JKUy0kKENPTkZJR19BUE5HX0RFTVVYRVIpICAgICAgICAgICAgICArPSBhcG5nZGVjLm8KK09CSlMtJChDT05GSUdfQVFUSVRMRV9ERU1VWEVSKSAgICAgICAgICAgKz0gYXF0aXRsZWRlYy5vIHN1YnRpdGxlcy5vCitPQkpTLSQoQ09ORklHX0FTRl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGFzZmRlYy5vIGFzZi5vIGFzZmNyeXB0Lm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmxhbmd1YWdlLm8KK09CSlMtJChDT05GSUdfQVNGX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gYXNmZW5jLm8gYXNmLm8KK09CSlMtJChDT05GSUdfQVNTX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYXNzZGVjLm8gc3VidGl0bGVzLm8KK09CSlMtJChDT05GSUdfQVNTX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gYXNzZW5jLm8KK09CSlMtJChDT05GSUdfQVNUX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYXN0Lm8gYXN0ZGVjLm8KK09CSlMtJChDT05GSUdfQVNUX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gYXN0Lm8gYXN0ZW5jLm8KK09CSlMtJChDT05GSUdfQVVfREVNVVhFUikgICAgICAgICAgICAgICAgKz0gYXUubyBwY20ubworT0JKUy0kKENPTkZJR19BVV9NVVhFUikgICAgICAgICAgICAgICAgICArPSBhdS5vIHJhd2VuYy5vCitPQkpTLSQoQ09ORklHX0FWSV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGF2aWRlYy5vCitPQkpTLSQoQ09ORklHX0FWSV9NVVhFUikgICAgICAgICAgICAgICAgICs9IGF2aWVuYy5vIG1wZWd0c2VuYy5vIGF2bGFuZ3VhZ2UubworT0JKUy0kKENPTkZJR19BVklTWU5USCkgICAgICAgICAgICAgICAgICArPSBhdmlzeW50aC5vCitPQkpTLSQoQ09ORklHX0FWTTJfTVVYRVIpICAgICAgICAgICAgICAgICs9IHN3ZmVuYy5vIHN3Zi5vCitPQkpTLSQoQ09ORklHX0FWUl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGF2ci5vIHBjbS5vCitPQkpTLSQoQ09ORklHX0FWU19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGF2cy5vIHZvY2RlYy5vIHZvYy5vCitPQkpTLSQoQ09ORklHX0JFVEhTT0ZUVklEX0RFTVVYRVIpICAgICAgICs9IGJldGhzb2Z0dmlkLm8KK09CSlMtJChDT05GSUdfQkZJX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYmZpLm8KK09CSlMtJChDT05GSUdfQklOS19ERU1VWEVSKSAgICAgICAgICAgICAgKz0gYmluay5vCitPQkpTLSQoQ09ORklHX0JJTlRFWFRfREVNVVhFUikgICAgICAgICAgICs9IGJpbnRleHQubyBzYXVjZS5vCitPQkpTLSQoQ09ORklHX0JJVF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGJpdC5vCitPQkpTLSQoQ09ORklHX0JJVF9NVVhFUikgICAgICAgICAgICAgICAgICs9IGJpdC5vCitPQkpTLSQoQ09ORklHX0JNVl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGJtdi5vCitPQkpTLSQoQ09ORklHX0JPQV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGJvYWRlYy5vCitPQkpTLSQoQ09ORklHX0JSU1RNX0RFTVVYRVIpICAgICAgICAgICAgICs9IGJyc3RtLm8KK09CSlMtJChDT05GSUdfQzkzX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYzkzLm8gdm9jZGVjLm8gdm9jLm8KK09CSlMtJChDT05GSUdfQ0FGX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gY2FmZGVjLm8gY2FmLm8gbW92Lm8gbW92X2NoYW4ubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb20ubyByZXBsYXlnYWluLm8KK09CSlMtJChDT05GSUdfQ0FGX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gY2FmZW5jLm8gY2FmLm8gcmlmZi5vIGlzb20ubworT0JKUy0kKENPTkZJR19DQVZTVklERU9fREVNVVhFUikgICAgICAgICArPSBjYXZzdmlkZW9kZWMubyByYXdkZWMubworT0JKUy0kKENPTkZJR19DQVZTVklERU9fTVVYRVIpICAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19DREdfREVNVVhFUikgICAgICAgICAgICAgICArPSBjZGcubworT0JKUy0kKENPTkZJR19DRFhMX0RFTVVYRVIpICAgICAgICAgICAgICArPSBjZHhsLm8KK09CSlMtJChDT05GSUdfQ0lORV9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gY2luZWRlYy5vCitPQkpTLSQoQ09ORklHX0NPTkNBVF9ERU1VWEVSKSAgICAgICAgICAgICs9IGNvbmNhdGRlYy5vCitPQkpTLSQoQ09ORklHX0NSQ19NVVhFUikgICAgICAgICAgICAgICAgICs9IGNyY2VuYy5vCitPQkpTLSQoQ09ORklHX0RBVEFfREVNVVhFUikgICAgICAgICAgICAgICs9IHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX0RBVEFfTVVYRVIpICAgICAgICAgICAgICAgICs9IHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX0RBU0hfTVVYRVIpICAgICAgICAgICAgICAgICs9IGRhc2hlbmMubyBpc29tLm8KK09CSlMtJChDT05GSUdfREFVRF9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gZGF1ZGRlYy5vCitPQkpTLSQoQ09ORklHX0RBVURfTVVYRVIpICAgICAgICAgICAgICAgICs9IGRhdWRlbmMubworT0JKUy0kKENPTkZJR19ERkFfREVNVVhFUikgICAgICAgICAgICAgICArPSBkZmEubworT0JKUy0kKENPTkZJR19ESVJBQ19ERU1VWEVSKSAgICAgICAgICAgICArPSBkaXJhY2RlYy5vIHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX0RJUkFDX01VWEVSKSAgICAgICAgICAgICAgICs9IHJhd2VuYy5vCitPQkpTLSQoQ09ORklHX0ROWEhEX0RFTVVYRVIpICAgICAgICAgICAgICs9IGRueGhkZGVjLm8gcmF3ZGVjLm8KK09CSlMtJChDT05GSUdfRE5YSERfTVVYRVIpICAgICAgICAgICAgICAgKz0gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfRFNGX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gZHNmZGVjLm8KK09CSlMtJChDT05GSUdfRFNJQ0lOX0RFTVVYRVIpICAgICAgICAgICAgKz0gZHNpY2luLm8KK09CSlMtJChDT05GSUdfRFRTSERfREVNVVhFUikgICAgICAgICAgICAgKz0gZHRzaGRkZWMubworT0JKUy0kKENPTkZJR19EVFNfREVNVVhFUikgICAgICAgICAgICAgICArPSBkdHNkZWMubyByYXdkZWMubworT0JKUy0kKENPTkZJR19EVFNfTVVYRVIpICAgICAgICAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19EVl9ERU1VWEVSKSAgICAgICAgICAgICAgICArPSBkdi5vCitPQkpTLSQoQ09ORklHX0RWX01VWEVSKSAgICAgICAgICAgICAgICAgICs9IGR2ZW5jLm8KK09CSlMtJChDT05GSUdfRFhBX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gZHhhLm8KK09CSlMtJChDT05GSUdfRUFfQ0RBVEFfREVNVVhFUikgICAgICAgICAgKz0gZWFjZGF0YS5vCitPQkpTLSQoQ09ORklHX0VBX0RFTVVYRVIpICAgICAgICAgICAgICAgICs9IGVsZWN0cm9uaWNhcnRzLm8KK09CSlMtJChDT05GSUdfRUFDM19ERU1VWEVSKSAgICAgICAgICAgICAgKz0gYWMzZGVjLm8gcmF3ZGVjLm8KK09CSlMtJChDT05GSUdfRUFDM19NVVhFUikgICAgICAgICAgICAgICAgKz0gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfRVBBRl9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gZXBhZmRlYy5vIHBjbS5vCitPQkpTLSQoQ09ORklHX0ZGTV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGZmbWRlYy5vCitPQkpTLSQoQ09ORklHX0ZGTV9NVVhFUikgICAgICAgICAgICAgICAgICs9IGZmbWVuYy5vCitPQkpTLSQoQ09ORklHX0ZGTUVUQURBVEFfREVNVVhFUikgICAgICAgICs9IGZmbWV0YWRlYy5vCitPQkpTLSQoQ09ORklHX0ZGTUVUQURBVEFfTVVYRVIpICAgICAgICAgICs9IGZmbWV0YWVuYy5vCitPQkpTLSQoQ09ORklHX0ZJTE1TVFJJUF9ERU1VWEVSKSAgICAgICAgICs9IGZpbG1zdHJpcGRlYy5vCitPQkpTLSQoQ09ORklHX0ZJTE1TVFJJUF9NVVhFUikgICAgICAgICAgICs9IGZpbG1zdHJpcGVuYy5vCitPQkpTLSQoQ09ORklHX0ZMQUNfREVNVVhFUikgICAgICAgICAgICAgICs9IGZsYWNkZWMubyByYXdkZWMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWNfcGljdHVyZS5vICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZ2dwYXJzZXZvcmJpcy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5Z2Fpbi5vICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc2NvbW1lbnQubworT0JKUy0kKENPTkZJR19GTEFDX01VWEVSKSAgICAgICAgICAgICAgICArPSBmbGFjZW5jLm8gZmxhY2VuY19oZWFkZXIubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc2NvbW1lbnQubworT0JKUy0kKENPTkZJR19GTElDX0RFTVVYRVIpICAgICAgICAgICAgICArPSBmbGljLm8KK09CSlMtJChDT05GSUdfRkxWX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gZmx2ZGVjLm8KK09CSlMtJChDT05GSUdfTElWRV9GTFZfREVNVVhFUikgICAgICAgICAgKz0gZmx2ZGVjLm8KK09CSlMtJChDT05GSUdfRkxWX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gZmx2ZW5jLm8gYXZjLm8KK09CSlMtJChDT05GSUdfRk9VUlhNX0RFTVVYRVIpICAgICAgICAgICAgKz0gNHhtLm8KK09CSlMtJChDT05GSUdfRlJBTUVDUkNfTVVYRVIpICAgICAgICAgICAgKz0gZnJhbWVjcmNlbmMubyBmcmFtZWhhc2gubworT0JKUy0kKENPTkZJR19GUkFNRU1ENV9NVVhFUikgICAgICAgICAgICArPSBtZDVlbmMubyBmcmFtZWhhc2gubworT0JKUy0kKENPTkZJR19GUk1fREVNVVhFUikgICAgICAgICAgICAgICArPSBmcm1kZWMubworT0JKUy0kKENPTkZJR19HSUZfTVVYRVIpICAgICAgICAgICAgICAgICArPSBnaWYubworT0JKUy0kKENPTkZJR19HSUZfREVNVVhFUikgICAgICAgICAgICAgICArPSBnaWZkZWMubworT0JKUy0kKENPTkZJR19HU01fREVNVVhFUikgICAgICAgICAgICAgICArPSBnc21kZWMubworT0JKUy0kKENPTkZJR19HWEZfREVNVVhFUikgICAgICAgICAgICAgICArPSBneGYubworT0JKUy0kKENPTkZJR19HWEZfTVVYRVIpICAgICAgICAgICAgICAgICArPSBneGZlbmMubyBhdWRpb2ludGVybGVhdmUubworT0JKUy0kKENPTkZJR19HNzIyX0RFTVVYRVIpICAgICAgICAgICAgICArPSBnNzIyLm8gcmF3ZGVjLm8KK09CSlMtJChDT05GSUdfRzcyMl9NVVhFUikgICAgICAgICAgICAgICAgKz0gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfRzcyM18xX0RFTVVYRVIpICAgICAgICAgICAgKz0gZzcyM18xLm8KK09CSlMtJChDT05GSUdfRzcyM18xX01VWEVSKSAgICAgICAgICAgICAgKz0gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfRzcyOV9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gZzcyOWRlYy5vCitPQkpTLSQoQ09ORklHX0gyNjFfREVNVVhFUikgICAgICAgICAgICAgICs9IGgyNjFkZWMubyByYXdkZWMubworT0JKUy0kKENPTkZJR19IMjYxX01VWEVSKSAgICAgICAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19IMjYzX0RFTVVYRVIpICAgICAgICAgICAgICArPSBoMjYzZGVjLm8gcmF3ZGVjLm8KK09CSlMtJChDT05GSUdfSDI2M19NVVhFUikgICAgICAgICAgICAgICAgKz0gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfSDI2NF9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gaDI2NGRlYy5vIHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX0gyNjRfTVVYRVIpICAgICAgICAgICAgICAgICs9IHJhd2VuYy5vCitPQkpTLSQoQ09ORklHX0hEU19NVVhFUikgICAgICAgICAgICAgICAgICs9IGhkc2VuYy5vCitPQkpTLSQoQ09ORklHX0hFVkNfREVNVVhFUikgICAgICAgICAgICAgICs9IGhldmNkZWMubyByYXdkZWMubworT0JKUy0kKENPTkZJR19IRVZDX01VWEVSKSAgICAgICAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19ITFNfREVNVVhFUikgICAgICAgICAgICAgICArPSBobHMubworT0JKUy0kKENPTkZJR19ITFNfTVVYRVIpICAgICAgICAgICAgICAgICArPSBobHNlbmMubworT0JKUy0kKENPTkZJR19ITk1fREVNVVhFUikgICAgICAgICAgICAgICArPSBobm0ubworT0JKUy0kKENPTkZJR19JQ09fREVNVVhFUikgICAgICAgICAgICAgICArPSBpY29kZWMubworT0JKUy0kKENPTkZJR19JQ09fTVVYRVIpICAgICAgICAgICAgICAgICArPSBpY29lbmMubworT0JKUy0kKENPTkZJR19JRENJTl9ERU1VWEVSKSAgICAgICAgICAgICArPSBpZGNpbi5vCitPQkpTLSQoQ09ORklHX0lERl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGJpbnRleHQubyBzYXVjZS5vCitPQkpTLSQoQ09ORklHX0lGRl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGlmZi5vCitPQkpTLSQoQ09ORklHX0lMQkNfREVNVVhFUikgICAgICAgICAgICAgICs9IGlsYmMubworT0JKUy0kKENPTkZJR19JTEJDX01VWEVSKSAgICAgICAgICAgICAgICArPSBpbGJjLm8KK09CSlMtJChDT05GSUdfSU1BR0UyX0RFTVVYRVIpICAgICAgICAgICAgKz0gaW1nMmRlYy5vIGltZzIubworT0JKUy0kKENPTkZJR19JTUFHRTJfTVVYRVIpICAgICAgICAgICAgICArPSBpbWcyZW5jLm8gaW1nMi5vCitPQkpTLSQoQ09ORklHX0lNQUdFMlBJUEVfREVNVVhFUikgICAgICAgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0UyUElQRV9NVVhFUikgICAgICAgICAgKz0gaW1nMmVuYy5vIGltZzIubworT0JKUy0kKENPTkZJR19JTUFHRTJfQUxJQVNfUElYX0RFTVVYRVIpICArPSBpbWcyX2FsaWFzX3BpeC5vCitPQkpTLSQoQ09ORklHX0lNQUdFMl9CUkVOREVSX1BJWF9ERU1VWEVSKSArPSBpbWcyX2JyZW5kZXJfcGl4Lm8KK09CSlMtJChDT05GSUdfSU1BR0VfQk1QX1BJUEVfREVNVVhFUikgICAgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0VfRFBYX1BJUEVfREVNVVhFUikgICAgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0VfRVhSX1BJUEVfREVNVVhFUikgICAgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0VfSjJLX1BJUEVfREVNVVhFUikgICAgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0VfSlBFR19QSVBFX0RFTVVYRVIpICAgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0VfSlBFR0xTX1BJUEVfREVNVVhFUikgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0VfUElDVE9SX1BJUEVfREVNVVhFUikgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0VfUE5HX1BJUEVfREVNVVhFUikgICAgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0VfU0dJX1BJUEVfREVNVVhFUikgICAgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0VfU1VOUkFTVF9QSVBFX0RFTVVYRVIpICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0VfVElGRl9QSVBFX0RFTVVYRVIpICAgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1BR0VfV0VCUF9QSVBFX0RFTVVYRVIpICAgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU5HRU5JRU5UX0RFTVVYRVIpICAgICAgICAgKz0gaW5nZW5pZW50ZGVjLm8gcmF3ZGVjLm8KK09CSlMtJChDT05GSUdfSVBNT1ZJRV9ERU1VWEVSKSAgICAgICAgICAgKz0gaXBtb3ZpZS5vCitPQkpTLSQoQ09ORklHX0lSQ0FNX0RFTVVYRVIpICAgICAgICAgICAgICs9IGlyY2FtZGVjLm8gaXJjYW0ubyBwY20ubworT0JKUy0kKENPTkZJR19JUkNBTV9NVVhFUikgICAgICAgICAgICAgICArPSBpcmNhbWVuYy5vIGlyY2FtLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfSVNTX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gaXNzLm8KK09CSlMtJChDT05GSUdfSVY4X0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gaXY4Lm8KK09CSlMtJChDT05GSUdfSVZGX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gaXZmZGVjLm8KK09CSlMtJChDT05GSUdfSVZGX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gaXZmZW5jLm8KK09CSlMtJChDT05GSUdfSkFDT1NVQl9ERU1VWEVSKSAgICAgICAgICAgKz0gamFjb3N1YmRlYy5vIHN1YnRpdGxlcy5vCitPQkpTLSQoQ09ORklHX0pBQ09TVUJfTVVYRVIpICAgICAgICAgICAgICs9IGphY29zdWJlbmMubyByYXdlbmMubworT0JKUy0kKENPTkZJR19KVl9ERU1VWEVSKSAgICAgICAgICAgICAgICArPSBqdmRlYy5vCitPQkpTLSQoQ09ORklHX0xBVE1fREVNVVhFUikgICAgICAgICAgICAgICs9IHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX0xBVE1fTVVYRVIpICAgICAgICAgICAgICAgICs9IGxhdG1lbmMubyByYXdlbmMubworT0JKUy0kKENPTkZJR19MTUxNNF9ERU1VWEVSKSAgICAgICAgICAgICArPSBsbWxtNC5vCitPQkpTLSQoQ09ORklHX0xPQVNfREVNVVhFUikgICAgICAgICAgICAgICs9IGxvYXNkZWMubyByYXdkZWMubworT0JKUy0kKENPTkZJR19MUkNfREVNVVhFUikgICAgICAgICAgICAgICArPSBscmNkZWMubyBscmMubyBzdWJ0aXRsZXMubworT0JKUy0kKENPTkZJR19MUkNfTVVYRVIpICAgICAgICAgICAgICAgICArPSBscmNlbmMubyBscmMubworT0JKUy0kKENPTkZJR19MVkZfREVNVVhFUikgICAgICAgICAgICAgICArPSBsdmZkZWMubworT0JKUy0kKENPTkZJR19MWEZfREVNVVhFUikgICAgICAgICAgICAgICArPSBseGZkZWMubworT0JKUy0kKENPTkZJR19NNFZfREVNVVhFUikgICAgICAgICAgICAgICArPSBtNHZkZWMubyByYXdkZWMubworT0JKUy0kKENPTkZJR19NNFZfTVVYRVIpICAgICAgICAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19NQVRST1NLQV9ERU1VWEVSKSAgICAgICAgICArPSBtYXRyb3NrYWRlYy5vIG1hdHJvc2thLm8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbS5vIHJtc2lwci5vIGZsYWNfcGljdHVyZS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2dncGFyc2V2b3JiaXMubyB2b3JiaXNjb21tZW50Lm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFjX3BpY3R1cmUubyByZXBsYXlnYWluLm8KK09CSlMtJChDT05GSUdfTUFUUk9TS0FfTVVYRVIpICAgICAgICAgICAgKz0gbWF0cm9za2FlbmMubyBtYXRyb3NrYS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbS5vIGF2Yy5vIGhldmMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWNlbmNfaGVhZGVyLm8gYXZsYW5ndWFnZS5vIHZvcmJpc2NvbW1lbnQubyB3di5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VibWRhc2hlbmMubworT0JKUy0kKENPTkZJR19NRDVfTVVYRVIpICAgICAgICAgICAgICAgICArPSBtZDVlbmMubworT0JKUy0kKENPTkZJR19NR1NUU19ERU1VWEVSKSAgICAgICAgICAgICArPSBtZ3N0cy5vCitPQkpTLSQoQ09ORklHX01JQ1JPRFZEX0RFTVVYRVIpICAgICAgICAgICs9IG1pY3JvZHZkZGVjLm8gc3VidGl0bGVzLm8KK09CSlMtJChDT05GSUdfTUlDUk9EVkRfTVVYRVIpICAgICAgICAgICAgKz0gbWljcm9kdmRlbmMubworT0JKUy0kKENPTkZJR19NSlBFR19ERU1VWEVSKSAgICAgICAgICAgICArPSByYXdkZWMubworT0JKUy0kKENPTkZJR19NSlBFR19NVVhFUikgICAgICAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19NTFBfREVNVVhFUikgICAgICAgICAgICAgICArPSByYXdkZWMubworT0JKUy0kKENPTkZJR19NTFBfTVVYRVIpICAgICAgICAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19NTFZfREVNVVhFUikgICAgICAgICAgICAgICArPSBtbHZkZWMubyByaWZmZGVjLm8KK09CSlMtJChDT05GSUdfTU1fREVNVVhFUikgICAgICAgICAgICAgICAgKz0gbW0ubworT0JKUy0kKENPTkZJR19NTUZfREVNVVhFUikgICAgICAgICAgICAgICArPSBtbWYubworT0JKUy0kKENPTkZJR19NTUZfTVVYRVIpICAgICAgICAgICAgICAgICArPSBtbWYubyByYXdlbmMubworT0JKUy0kKENPTkZJR19NT1ZfREVNVVhFUikgICAgICAgICAgICAgICArPSBtb3YubyBpc29tLm8gbW92X2NoYW4ubyByZXBsYXlnYWluLm8KK09CSlMtJChDT05GSUdfTU9WX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gbW92ZW5jLm8gaXNvbS5vIGF2Yy5vIGhldmMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVuY2hpbnQubyBtb3ZfY2hhbi5vIHJ0cC5vCitPQkpTLSQoQ09ORklHX01QMl9NVVhFUikgICAgICAgICAgICAgICAgICs9IG1wM2VuYy5vIHJhd2VuYy5vIGlkM3YyZW5jLm8KK09CSlMtJChDT05GSUdfTVAzX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gbXAzZGVjLm8gcmVwbGF5Z2Fpbi5vCitPQkpTLSQoQ09ORklHX01QM19NVVhFUikgICAgICAgICAgICAgICAgICs9IG1wM2VuYy5vIHJhd2VuYy5vIGlkM3YyZW5jLm8KK09CSlMtJChDT05GSUdfTVBDX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gbXBjLm8gYXBldGFnLm8gaW1nMi5vCitPQkpTLSQoQ09ORklHX01QQzhfREVNVVhFUikgICAgICAgICAgICAgICs9IG1wYzgubyBhcGV0YWcubyBpbWcyLm8KK09CSlMtJChDT05GSUdfTVBFRzFTWVNURU1fTVVYRVIpICAgICAgICAgKz0gbXBlZ2VuYy5vCitPQkpTLSQoQ09ORklHX01QRUcxVkNEX01VWEVSKSAgICAgICAgICAgICs9IG1wZWdlbmMubworT0JKUy0kKENPTkZJR19NUEVHMkRWRF9NVVhFUikgICAgICAgICAgICArPSBtcGVnZW5jLm8KK09CSlMtJChDT05GSUdfTVBFRzJWT0JfTVVYRVIpICAgICAgICAgICAgKz0gbXBlZ2VuYy5vCitPQkpTLSQoQ09ORklHX01QRUcyU1ZDRF9NVVhFUikgICAgICAgICAgICs9IG1wZWdlbmMubworT0JKUy0kKENPTkZJR19NUEVHMVZJREVPX01VWEVSKSAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19NUEVHMlZJREVPX01VWEVSKSAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19NUEVHUFNfREVNVVhFUikgICAgICAgICAgICArPSBtcGVnLm8KK09CSlMtJChDT05GSUdfTVBFR1RTX0RFTVVYRVIpICAgICAgICAgICAgKz0gbXBlZ3RzLm8gaXNvbS5vCitPQkpTLSQoQ09ORklHX01QRUdUU19NVVhFUikgICAgICAgICAgICAgICs9IG1wZWd0c2VuYy5vCitPQkpTLSQoQ09ORklHX01QRUdWSURFT19ERU1VWEVSKSAgICAgICAgICs9IG1wZWd2aWRlb2RlYy5vIHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX01QSlBFR19NVVhFUikgICAgICAgICAgICAgICs9IG1wanBlZy5vCitPQkpTLSQoQ09ORklHX01QTDJfREVNVVhFUikgICAgICAgICAgICAgICs9IG1wbDJkZWMubyBzdWJ0aXRsZXMubworT0JKUy0kKENPTkZJR19NUFNVQl9ERU1VWEVSKSAgICAgICAgICAgICArPSBtcHN1YmRlYy5vIHN1YnRpdGxlcy5vCitPQkpTLSQoQ09ORklHX01TTldDX1RDUF9ERU1VWEVSKSAgICAgICAgICs9IG1zbndjX3RjcC5vCitPQkpTLSQoQ09ORklHX01UVl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IG10di5vCitPQkpTLSQoQ09ORklHX01WX0RFTVVYRVIpICAgICAgICAgICAgICAgICs9IG12ZGVjLm8KK09CSlMtJChDT05GSUdfTVZJX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gbXZpLm8KK09CSlMtJChDT05GSUdfTVhGX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gbXhmZGVjLm8gbXhmLm8KK09CSlMtJChDT05GSUdfTVhGX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gbXhmZW5jLm8gbXhmLm8gYXVkaW9pbnRlcmxlYXZlLm8KK09CSlMtJChDT05GSUdfTVhHX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gbXhnLm8KK09CSlMtJChDT05GSUdfTkNfREVNVVhFUikgICAgICAgICAgICAgICAgKz0gbmNkZWMubworT0JKUy0kKENPTkZJR19OSVNUU1BIRVJFX0RFTVVYRVIpICAgICAgICArPSBuaXN0c3BoZXJlZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfTlNWX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gbnN2ZGVjLm8KK09CSlMtJChDT05GSUdfTlVMTF9NVVhFUikgICAgICAgICAgICAgICAgKz0gbnVsbGVuYy5vCitPQkpTLSQoQ09ORklHX05VVF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IG51dGRlYy5vIG51dC5vCitPQkpTLSQoQ09ORklHX05VVF9NVVhFUikgICAgICAgICAgICAgICAgICs9IG51dGVuYy5vIG51dC5vCitPQkpTLSQoQ09ORklHX05VVl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IG51di5vCitPQkpTLSQoQ09ORklHX09HR19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IG9nZ2RlYy5vICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZ2dwYXJzZWNlbHQubyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2dncGFyc2VkaXJhYy5vICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9nZ3BhcnNlZmxhYy5vICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZ2dwYXJzZW9nbS5vICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2dncGFyc2VvcHVzLm8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9nZ3BhcnNlc2tlbGV0b24ubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9nZ3BhcnNlc3BlZXgubyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZ2dwYXJzZXRoZW9yYS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2dncGFyc2V2b3JiaXMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9nZ3BhcnNldnA4Lm8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlnYWluLm8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzY29tbWVudC5vICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWNfcGljdHVyZS5vCitPQkpTLSQoQ09ORklHX09HQV9NVVhFUikgICAgICAgICAgICAgICAgICs9IG9nZ2VuYy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzY29tbWVudC5vCitPQkpTLSQoQ09ORklHX09HR19NVVhFUikgICAgICAgICAgICAgICAgICs9IG9nZ2VuYy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzY29tbWVudC5vCitPQkpTLSQoQ09ORklHX09NQV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IG9tYWRlYy5vIHBjbS5vIG9tYS5vCitPQkpTLSQoQ09ORklHX09NQV9NVVhFUikgICAgICAgICAgICAgICAgICs9IG9tYWVuYy5vIHJhd2VuYy5vIG9tYS5vIGlkM3YyZW5jLm8KK09CSlMtJChDT05GSUdfT1BVU19NVVhFUikgICAgICAgICAgICAgICAgKz0gb2dnZW5jLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNjb21tZW50Lm8KK09CSlMtJChDT05GSUdfUEFGX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gcGFmLm8KK09CSlMtJChDT05GSUdfUENNX0FMQVdfREVNVVhFUikgICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX0FMQVdfTVVYRVIpICAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX0YzMkJFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX0YzMkJFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX0YzMkxFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX0YzMkxFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX0Y2NEJFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX0Y2NEJFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX0Y2NExFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX0Y2NExFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX01VTEFXX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX01VTEFXX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1MxNkJFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MxNkJFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1MxNkxFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MxNkxFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1MyNEJFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MyNEJFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1MyNExFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MyNExFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1MzMkJFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MzMkJFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1MzMkxFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1MzMkxFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1M4X0RFTVVYRVIpICAgICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1M4X01VWEVSKSAgICAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1UxNkJFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1UxNkJFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1UxNkxFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1UxNkxFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1UyNEJFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1UyNEJFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1UyNExFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1UyNExFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1UzMkJFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1UzMkJFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1UzMkxFX0RFTVVYRVIpICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1UzMkxFX01VWEVSKSAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUENNX1U4X0RFTVVYRVIpICAgICAgICAgICAgKz0gcGNtZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1U4X01VWEVSKSAgICAgICAgICAgICAgKz0gcGNtZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUEpTX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gcGpzZGVjLm8gc3VidGl0bGVzLm8KK09CSlMtJChDT05GSUdfUE1QX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gcG1wZGVjLm8KK09CSlMtJChDT05GSUdfUFZBX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gcHZhLm8KK09CSlMtJChDT05GSUdfUFZGX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gcHZmZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUUNQX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gcWNwLm8KK09CSlMtJChDT05GSUdfUjNEX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gcjNkLm8KK09CSlMtJChDT05GSUdfUkFXVklERU9fREVNVVhFUikgICAgICAgICAgKz0gcmF3dmlkZW9kZWMubworT0JKUy0kKENPTkZJR19SQVdWSURFT19NVVhFUikgICAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19SRUFMVEVYVF9ERU1VWEVSKSAgICAgICAgICArPSByZWFsdGV4dGRlYy5vIHN1YnRpdGxlcy5vCitPQkpTLSQoQ09ORklHX1JFRFNQQVJLX0RFTVVYRVIpICAgICAgICAgICs9IHJlZHNwYXJrLm8KK09CSlMtJChDT05GSUdfUkwyX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gcmwyLm8KK09CSlMtJChDT05GSUdfUk1fREVNVVhFUikgICAgICAgICAgICAgICAgKz0gcm1kZWMubyBybS5vIHJtc2lwci5vCitPQkpTLSQoQ09ORklHX1JNX01VWEVSKSAgICAgICAgICAgICAgICAgICs9IHJtZW5jLm8gcm0ubworT0JKUy0kKENPTkZJR19ST1FfREVNVVhFUikgICAgICAgICAgICAgICArPSBpZHJvcWRlYy5vCitPQkpTLSQoQ09ORklHX1JPUV9NVVhFUikgICAgICAgICAgICAgICAgICs9IGlkcm9xZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfUlNEX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gcnNkLm8KK09CSlMtJChDT05GSUdfUlNPX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gcnNvZGVjLm8gcnNvLm8gcGNtLm8KK09CSlMtJChDT05GSUdfUlNPX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gcnNvZW5jLm8gcnNvLm8KK09CSlMtJChDT05GSUdfUlBMX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gcnBsLm8KK09CSlMtJChDT05GSUdfUlRQX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gcnRwLm8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGVuY19hYWMubyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBlbmNfbGF0bS5vICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwZW5jX2Ftci5vICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGVuY19oMjYxLm8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBlbmNfaDI2My5vICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwZW5jX2gyNjNfcmZjMjE5MC5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwZW5jX2hldmMubyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGVuY19qcGVnLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBlbmNfbXB2Lm8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwZW5jLm8gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGVuY19oMjY0Lm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBlbmNfdnA4Lm8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwZW5jX3hpcGgubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Yy5vCitPQkpTLSQoQ09ORklHX1JUU1BfREVNVVhFUikgICAgICAgICAgICAgICs9IHJ0c3AubyBydHNwZGVjLm8gaHR0cGF1dGgubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGRlY29kZS5vCitPQkpTLSQoQ09ORklHX1JUU1BfTVVYRVIpICAgICAgICAgICAgICAgICs9IHJ0c3AubyBydHNwZW5jLm8gaHR0cGF1dGgubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGRlY29kZS5vCitPQkpTLSQoQ09ORklHX1NBTUlfREVNVVhFUikgICAgICAgICAgICAgICs9IHNhbWlkZWMubyBzdWJ0aXRsZXMubworT0JKUy0kKENPTkZJR19TQVBfREVNVVhFUikgICAgICAgICAgICAgICArPSBzYXBkZWMubworT0JKUy0kKENPTkZJR19TQVBfTVVYRVIpICAgICAgICAgICAgICAgICArPSBzYXBlbmMubworT0JKUy0kKENPTkZJR19TQkdfREVNVVhFUikgICAgICAgICAgICAgICArPSBzYmdkZWMubworT0JKUy0kKENPTkZJR19TRFBfREVNVVhFUikgICAgICAgICAgICAgICArPSBydHNwLm8KK09CSlMtJChDT05GSUdfU0RSMl9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gc2RyMi5vCitPQkpTLSQoQ09ORklHX1NFR0FGSUxNX0RFTVVYRVIpICAgICAgICAgICs9IHNlZ2FmaWxtLm8KK09CSlMtJChDT05GSUdfU0VHTUVOVF9NVVhFUikgICAgICAgICAgICAgKz0gc2VnbWVudC5vCitPQkpTLSQoQ09ORklHX1NIT1JURU5fREVNVVhFUikgICAgICAgICAgICs9IHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX1NJRkZfREVNVVhFUikgICAgICAgICAgICAgICs9IHNpZmYubworT0JKUy0kKENPTkZJR19TTUFDS0VSX0RFTVVYRVIpICAgICAgICAgICArPSBzbWFja2VyLm8KK09CSlMtJChDT05GSUdfU01KUEVHX0RFTVVYRVIpICAgICAgICAgICAgKz0gc21qcGVnZGVjLm8gc21qcGVnLm8KK09CSlMtJChDT05GSUdfU01KUEVHX01VWEVSKSAgICAgICAgICAgICAgKz0gc21qcGVnZW5jLm8gc21qcGVnLm8KK09CSlMtJChDT05GSUdfU01PT1RIU1RSRUFNSU5HX01VWEVSKSAgICAgKz0gc21vb3Roc3RyZWFtaW5nZW5jLm8gaXNvbS5vCitPQkpTLSQoQ09ORklHX1NNVVNIX0RFTVVYRVIpICAgICAgICAgICAgICs9IHNtdXNoLm8KK09CSlMtJChDT05GSUdfU09MX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gc29sLm8gcGNtLm8KK09CSlMtJChDT05GSUdfU09YX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gc294ZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfU09YX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gc294ZW5jLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfU1BESUZfREVNVVhFUikgICAgICAgICAgICAgKz0gc3BkaWYubyBzcGRpZmRlYy5vCitPQkpTLSQoQ09ORklHX1NQRElGX01VWEVSKSAgICAgICAgICAgICAgICs9IHNwZGlmLm8gc3BkaWZlbmMubworT0JKUy0kKENPTkZJR19TUEVFWF9NVVhFUikgICAgICAgICAgICAgICArPSBvZ2dlbmMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc2NvbW1lbnQubworT0JKUy0kKENPTkZJR19TUlRfREVNVVhFUikgICAgICAgICAgICAgICArPSBzcnRkZWMubyBzdWJ0aXRsZXMubworT0JKUy0kKENPTkZJR19TUlRfTVVYRVIpICAgICAgICAgICAgICAgICArPSBzcnRlbmMubworT0JKUy0kKENPTkZJR19TVExfREVNVVhFUikgICAgICAgICAgICAgICArPSBzdGxkZWMubyBzdWJ0aXRsZXMubworT0JKUy0kKENPTkZJR19TVFJfREVNVVhFUikgICAgICAgICAgICAgICArPSBwc3hzdHIubworT0JKUy0kKENPTkZJR19TVUJWSUVXRVIxX0RFTVVYRVIpICAgICAgICArPSBzdWJ2aWV3ZXIxZGVjLm8gc3VidGl0bGVzLm8KK09CSlMtJChDT05GSUdfU1VCVklFV0VSX0RFTVVYRVIpICAgICAgICAgKz0gc3Vidmlld2VyZGVjLm8gc3VidGl0bGVzLm8KK09CSlMtJChDT05GSUdfU1VQX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gc3VwZGVjLm8KK09CSlMtJChDT05GSUdfU1dGX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gc3dmZGVjLm8gc3dmLm8KK09CSlMtJChDT05GSUdfU1dGX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gc3dmZW5jLm8gc3dmLm8KK09CSlMtJChDT05GSUdfVEFLX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gdGFrZGVjLm8gYXBldGFnLm8gaW1nMi5vIHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX1RFRENBUFRJT05TX0RFTVVYRVIpICAgICAgICs9IHRlZGNhcHRpb25zZGVjLm8gc3VidGl0bGVzLm8KK09CSlMtJChDT05GSUdfVEVFX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gdGVlLm8KK09CSlMtJChDT05GSUdfVEhQX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gdGhwLm8KK09CSlMtJChDT05GSUdfVElFUlRFWFNFUV9ERU1VWEVSKSAgICAgICAgKz0gdGllcnRleHNlcS5vCitPQkpTLSQoQ09ORklHX01LVlRJTUVTVEFNUF9WMl9NVVhFUikgICAgICs9IG1rdnRpbWVzdGFtcF92Mi5vCitPQkpTLSQoQ09ORklHX1RNVl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHRtdi5vCitPQkpTLSQoQ09ORklHX1RSVUVIRF9ERU1VWEVSKSAgICAgICAgICAgICs9IHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX1RSVUVIRF9NVVhFUikgICAgICAgICAgICAgICs9IHJhd2VuYy5vCitPQkpTLSQoQ09ORklHX1RUQV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHR0YS5vIGFwZXRhZy5vIGltZzIubworT0JKUy0kKENPTkZJR19UVFlfREVNVVhFUikgICAgICAgICAgICAgICArPSB0dHkubyBzYXVjZS5vCitPQkpTLSQoQ09ORklHX1RYRF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHR4ZC5vCitPQkpTLSQoQ09ORklHX1VOQ09ERURGUkFNRUNSQ19NVVhFUikgICAgICs9IHVuY29kZWRmcmFtZWNyY2VuYy5vIGZyYW1laGFzaC5vCitPQkpTLSQoQ09ORklHX1ZDMV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX1ZDMV9NVVhFUikgICAgICAgICAgICAgICAgICs9IHJhd2VuYy5vCitPQkpTLSQoQ09ORklHX1ZDMVRfREVNVVhFUikgICAgICAgICAgICAgICs9IHZjMXRlc3QubworT0JKUy0kKENPTkZJR19WQzFUX01VWEVSKSAgICAgICAgICAgICAgICArPSB2YzF0ZXN0ZW5jLm8KK09CSlMtJChDT05GSUdfVklWT19ERU1VWEVSKSAgICAgICAgICAgICAgKz0gdml2by5vCitPQkpTLSQoQ09ORklHX1ZNRF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHNpZXJyYXZtZC5vCitPQkpTLSQoQ09ORklHX1ZPQlNVQl9ERU1VWEVSKSAgICAgICAgICAgICs9IHN1YnRpdGxlcy5vICMgbXBlZyBkZW11eGVyIGlzIGluIHRoZSBkZXBlbmRlbmNpZXMKK09CSlMtJChDT05GSUdfVk9DX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gdm9jZGVjLm8gdm9jLm8KK09CSlMtJChDT05GSUdfVk9DX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gdm9jZW5jLm8gdm9jLm8KK09CSlMtJChDT05GSUdfVlBMQVlFUl9ERU1VWEVSKSAgICAgICAgICAgKz0gdnBsYXllcmRlYy5vIHN1YnRpdGxlcy5vCitPQkpTLSQoQ09ORklHX1ZRRl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHZxZi5vCitPQkpTLSQoQ09ORklHX1c2NF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHdhdmRlYy5vIHc2NC5vIHBjbS5vCitPQkpTLSQoQ09ORklHX1c2NF9NVVhFUikgICAgICAgICAgICAgICAgICs9IHdhdmVuYy5vIHc2NC5vCitPQkpTLSQoQ09ORklHX1dBVl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHdhdmRlYy5vIHBjbS5vCitPQkpTLSQoQ09ORklHX1dBVl9NVVhFUikgICAgICAgICAgICAgICAgICs9IHdhdmVuYy5vCitPQkpTLSQoQ09ORklHX1dDM19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHdjM21vdmllLm8KK09CSlMtJChDT05GSUdfV0VCTV9NVVhFUikgICAgICAgICAgICAgICAgKz0gbWF0cm9za2FlbmMubyBtYXRyb3NrYS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbS5vIGF2Yy5vIGhldmMubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWNlbmNfaGVhZGVyLm8gYXZsYW5ndWFnZS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3YubyB2b3JiaXNjb21tZW50Lm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJtZGFzaGVuYy5vCitPQkpTLSQoQ09ORklHX1dFQk1fREFTSF9NQU5JRkVTVF9ERU1VWEVSKSs9IG1hdHJvc2thZGVjLm8gbWF0cm9za2EubyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29tLm8gcm1zaXByLm8gZmxhY19waWN0dXJlLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZ2dwYXJzZXZvcmJpcy5vIHZvcmJpc2NvbW1lbnQubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWNfcGljdHVyZS5vIHJlcGxheWdhaW4ubworT0JKUy0kKENPTkZJR19XRUJNX0RBU0hfTUFOSUZFU1RfTVVYRVIpICArPSB3ZWJtZGFzaGVuYy5vIG1hdHJvc2thLm8KK09CSlMtJChDT05GSUdfV0VCUF9NVVhFUikgICAgICAgICAgICAgICAgKz0gd2VicGVuYy5vCitPQkpTLSQoQ09ORklHX1dFQlZUVF9ERU1VWEVSKSAgICAgICAgICAgICs9IHdlYnZ0dGRlYy5vIHN1YnRpdGxlcy5vCitPQkpTLSQoQ09ORklHX1dFQlZUVF9NVVhFUikgICAgICAgICAgICAgICs9IHdlYnZ0dGVuYy5vCitPQkpTLSQoQ09ORklHX1dTQVVEX0RFTVVYRVIpICAgICAgICAgICAgICs9IHdlc3R3b29kX2F1ZC5vCitPQkpTLSQoQ09ORklHX1dTVlFBX0RFTVVYRVIpICAgICAgICAgICAgICs9IHdlc3R3b29kX3ZxYS5vCitPQkpTLSQoQ09ORklHX1dUVl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHd0dmRlYy5vIHd0dl9jb21tb24ubyBhc2ZkZWMubyBhc2YubyBhc2ZjcnlwdC5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZsYW5ndWFnZS5vIG1wZWd0cy5vIGlzb20ubworT0JKUy0kKENPTkZJR19XVFZfTVVYRVIpICAgICAgICAgICAgICAgICArPSB3dHZlbmMubyB3dHZfY29tbW9uLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVndHNlbmMubyBhc2YubworT0JKUy0kKENPTkZJR19XVl9ERU1VWEVSKSAgICAgICAgICAgICAgICArPSB3dmRlYy5vIHd2Lm8gYXBldGFnLm8gaW1nMi5vCitPQkpTLSQoQ09ORklHX1dWX01VWEVSKSAgICAgICAgICAgICAgICAgICs9IHd2ZW5jLm8gd3YubyBhcGV0YWcubyBpbWcyLm8KK09CSlMtJChDT05GSUdfWEFfREVNVVhFUikgICAgICAgICAgICAgICAgKz0geGEubworT0JKUy0kKENPTkZJR19YQklOX0RFTVVYRVIpICAgICAgICAgICAgICArPSBiaW50ZXh0Lm8gc2F1Y2UubworT0JKUy0kKENPTkZJR19YTVZfREVNVVhFUikgICAgICAgICAgICAgICArPSB4bXYubworT0JKUy0kKENPTkZJR19YV01BX0RFTVVYRVIpICAgICAgICAgICAgICArPSB4d21hLm8KK09CSlMtJChDT05GSUdfWU9QX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0geW9wLm8KK09CSlMtJChDT05GSUdfWVVWNE1QRUdQSVBFX01VWEVSKSAgICAgICAgKz0geXV2NG1wZWdlbmMubworT0JKUy0kKENPTkZJR19ZVVY0TVBFR1BJUEVfREVNVVhFUikgICAgICArPSB5dXY0bXBlZ2RlYy5vCisKKyMgZXh0ZXJuYWwgbGlicmFyaWVzCitPQkpTLSQoQ09ORklHX0xJQkdNRV9ERU1VWEVSKSAgICAgICAgICAgICs9IGxpYmdtZS5vCitPQkpTLSQoQ09ORklHX0xJQk1PRFBMVUdfREVNVVhFUikgICAgICAgICs9IGxpYm1vZHBsdWcubworT0JKUy0kKENPTkZJR19MSUJOVVRfREVNVVhFUikgICAgICAgICAgICArPSBsaWJudXQubworT0JKUy0kKENPTkZJR19MSUJOVVRfTVVYRVIpICAgICAgICAgICAgICArPSBsaWJudXQubworT0JKUy0kKENPTkZJR19MSUJRVVZJX0RFTVVYRVIpICAgICAgICAgICArPSBsaWJxdXZpLm8KK09CSlMtJChDT05GSUdfTElCUlRNUCkgICAgICAgICAgICAgICAgICAgKz0gbGlicnRtcC5vCitPQkpTLSQoQ09ORklHX0xJQlNTSF9QUk9UT0NPTCkgICAgICAgICAgICs9IGxpYnNzaC5vCitPQkpTLSQoQ09ORklHX0xJQlNNQkNMSUVOVF9QUk9UT0NPTCkgICAgICs9IGxpYnNtYmNsaWVudC5vCisKKyMgcHJvdG9jb2xzIEkvTworT0JKUy0kKENPTkZJR19BUFBMRUhUVFBfUFJPVE9DT0wpICAgICAgICArPSBobHNwcm90by5vCitPQkpTLSQoQ09ORklHX0JMVVJBWV9QUk9UT0NPTCkgICAgICAgICAgICs9IGJsdXJheS5vCitPQkpTLSQoQ09ORklHX0NBQ0hFX1BST1RPQ09MKSAgICAgICAgICAgICs9IGNhY2hlLm8KK09CSlMtJChDT05GSUdfQ09OQ0FUX1BST1RPQ09MKSAgICAgICAgICAgKz0gY29uY2F0Lm8KK09CSlMtJChDT05GSUdfQ1JZUFRPX1BST1RPQ09MKSAgICAgICAgICAgKz0gY3J5cHRvLm8KK09CSlMtJChDT05GSUdfREFUQV9QUk9UT0NPTCkgICAgICAgICAgICAgKz0gZGF0YV91cmkubworT0JKUy0kKENPTkZJR19GRlJUTVBDUllQVF9QUk9UT0NPTCkgICAgICArPSBydG1wY3J5cHQubyBydG1wZGgubworT0JKUy0kKENPTkZJR19GRlJUTVBIVFRQX1BST1RPQ09MKSAgICAgICArPSBydG1waHR0cC5vCitPQkpTLSQoQ09ORklHX0ZJTEVfUFJPVE9DT0wpICAgICAgICAgICAgICs9IGZpbGUubworT0JKUy0kKENPTkZJR19GVFBfUFJPVE9DT0wpICAgICAgICAgICAgICArPSBmdHAubworT0JKUy0kKENPTkZJR19HT1BIRVJfUFJPVE9DT0wpICAgICAgICAgICArPSBnb3BoZXIubworT0JKUy0kKENPTkZJR19ITFNfUFJPVE9DT0wpICAgICAgICAgICAgICArPSBobHNwcm90by5vCitPQkpTLSQoQ09ORklHX0hUVFBfUFJPVE9DT0wpICAgICAgICAgICAgICs9IGh0dHAubyBodHRwYXV0aC5vIHVybGRlY29kZS5vCitPQkpTLSQoQ09ORklHX0hUVFBQUk9YWV9QUk9UT0NPTCkgICAgICAgICs9IGh0dHAubyBodHRwYXV0aC5vIHVybGRlY29kZS5vCitPQkpTLSQoQ09ORklHX0hUVFBTX1BST1RPQ09MKSAgICAgICAgICAgICs9IGh0dHAubyBodHRwYXV0aC5vIHVybGRlY29kZS5vCitPQkpTLSQoQ09ORklHX0lDRUNBU1RfUFJPVE9DT0wpICAgICAgICAgICs9IGljZWNhc3QubworT0JKUy0kKENPTkZJR19NTVNIX1BST1RPQ09MKSAgICAgICAgICAgICArPSBtbXNoLm8gbW1zLm8gYXNmLm8KK09CSlMtJChDT05GSUdfTU1TVF9QUk9UT0NPTCkgICAgICAgICAgICAgKz0gbW1zdC5vIG1tcy5vIGFzZi5vCitPQkpTLSQoQ09ORklHX01ENV9QUk9UT0NPTCkgICAgICAgICAgICAgICs9IG1kNXByb3RvLm8KK09CSlMtJChDT05GSUdfUElQRV9QUk9UT0NPTCkgICAgICAgICAgICAgKz0gZmlsZS5vCitPQkpTLSQoQ09ORklHX1JUTVBfUFJPVE9DT0wpICAgICAgICAgICAgICs9IHJ0bXBwcm90by5vIHJ0bXBwa3QubworT0JKUy0kKENPTkZJR19SVE1QRV9QUk9UT0NPTCkgICAgICAgICAgICArPSBydG1wcHJvdG8ubyBydG1wcGt0Lm8KK09CSlMtJChDT05GSUdfUlRNUFNfUFJPVE9DT0wpICAgICAgICAgICAgKz0gcnRtcHByb3RvLm8gcnRtcHBrdC5vCitPQkpTLSQoQ09ORklHX1JUTVBUX1BST1RPQ09MKSAgICAgICAgICAgICs9IHJ0bXBwcm90by5vIHJ0bXBwa3QubworT0JKUy0kKENPTkZJR19SVE1QVEVfUFJPVE9DT0wpICAgICAgICAgICArPSBydG1wcHJvdG8ubyBydG1wcGt0Lm8KK09CSlMtJChDT05GSUdfUlRNUFRTX1BST1RPQ09MKSAgICAgICAgICAgKz0gcnRtcHByb3RvLm8gcnRtcHBrdC5vCitPQkpTLSQoQ09ORklHX1JUUF9QUk9UT0NPTCkgICAgICAgICAgICAgICs9IHJ0cHByb3RvLm8KK09CSlMtJChDT05GSUdfU0NUUF9QUk9UT0NPTCkgICAgICAgICAgICAgKz0gc2N0cC5vCitPQkpTLSQoQ09ORklHX1NSVFBfUFJPVE9DT0wpICAgICAgICAgICAgICs9IHNydHBwcm90by5vIHNydHAubworT0JKUy0kKENPTkZJR19TVUJGSUxFX1BST1RPQ09MKSAgICAgICAgICArPSBzdWJmaWxlLm8KK09CSlMtJChDT05GSUdfVENQX1BST1RPQ09MKSAgICAgICAgICAgICAgKz0gdGNwLm8KK09CSlMtJChDT05GSUdfVExTX1BST1RPQ09MKSAgICAgICAgICAgICAgKz0gdGxzLm8KK09CSlMtJChDT05GSUdfVURQX1BST1RPQ09MKSAgICAgICAgICAgICAgKz0gdWRwLm8KK09CSlMtJChDT05GSUdfVU5JWF9QUk9UT0NPTCkgICAgICAgICAgICAgKz0gdW5peC5vCisKK09CSlMtJChIQVZFX0xJQkNfTVNWQ1JUKSAgICAgICAgICAgICAgICAgKz0gZmlsZV9vcGVuLm8KKworIyBsaWJhdmRldmljZSBkZXBlbmRlbmNpZXMKK09CSlMtJChDT05GSUdfSUVDNjE4ODNfSU5ERVYpICAgICAgICAgICAgKz0gZHYubworCisjIFdpbmRvd3MgcmVzb3VyY2UgZmlsZQorU0xJQk9CSlMtJChIQVZFX0dOVV9XSU5EUkVTKSAgICAgICAgICAgICArPSBhdmZvcm1hdHJlcy5vCisKK1NLSVBIRUFERVJTLSQoQ09ORklHX0ZGUlRNUENSWVBUX1BST1RPQ09MKSArPSBydG1wZGguaAorU0tJUEhFQURFUlMtJChDT05GSUdfTkVUV09SSykgICAgICAgICAgICArPSBuZXR3b3JrLmggcnRzcC5oCisKK1RFU1RQUk9HUyA9IHNlZWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNydHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVybCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworVEVTVFBST0dTLSQoQ09ORklHX05FVFdPUkspICAgICAgICAgICAgICArPSBub3Byb3h5CisKK1RPT0xTICAgICA9IGF2aW9jYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlzbWluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHBrdGR1bXBlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHByb2JldGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNlZWtfcHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpZHhpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hNjQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2Y5M2EyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2E2NC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBhNjQgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBUb2JpYXMgQmluZGhhbW1lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJyYXdlbmMuaCIKKworc3RhdGljIGludCBhNjRfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICB1aW50OF90IGhlYWRlcls1XSA9IHsKKyAgICAgICAgMHgwMCwgLy9sb2FkCisgICAgICAgIDB4NDAsIC8vYWRkcmVzcworICAgICAgICAweDAwLCAvL21vZGUKKyAgICAgICAgMHgwMCwgLy9jaGFyc2V0X2xpZmV0aW1lIChtdWx0aSBvbmx5KQorICAgICAgICAweDAwICAvL2ZwcyBpbiA1MC9mcHM7CisgICAgfTsKKworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCA0KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIGV4dHJhZGF0YVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BNjRfTVVMVEk6CisgICAgICAgIGhlYWRlclsyXSA9IDB4MDA7CisgICAgICAgIGhlYWRlclszXSA9IEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSswKTsKKyAgICAgICAgaGVhZGVyWzRdID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BNjRfTVVMVEk1OgorICAgICAgICBoZWFkZXJbMl0gPSAweDAxOworICAgICAgICBoZWFkZXJbM10gPSBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGErMCk7CisgICAgICAgIGhlYWRlcls0XSA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBoZWFkZXIsIDIpOworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9hNjRfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImE2NCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImE2NCAtIHZpZGVvIGZvciBDb21tb2RvcmUgNjQiKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiYTY0LCBBNjQiLAorICAgIC52aWRlb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX0E2NF9NVUxUSSwKKyAgICAud3JpdGVfaGVhZGVyICAgPSBhNjRfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2FhY2RlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FhY2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOThlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYWFjZGVjLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiByYXcgQURUUyBBQUMgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUm9iZXJ0IFN3YWluICggcm9iIG9wZW5kb3QgY2wgKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyYXdkZWMuaCIKKyNpbmNsdWRlICJpZDN2MS5oIgorI2luY2x1ZGUgImFwZXRhZy5oIgorCitzdGF0aWMgaW50IGFkdHNfYWFjX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGludCBtYXhfZnJhbWVzID0gMCwgZmlyc3RfZnJhbWVzID0gMDsKKyAgICBpbnQgZnNpemUsIGZyYW1lczsKKyAgICBjb25zdCB1aW50OF90ICpidWYwID0gcC0+YnVmOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZjI7CisgICAgY29uc3QgdWludDhfdCAqYnVmOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IGJ1ZjAgKyBwLT5idWZfc2l6ZSAtIDc7CisKKyAgICBidWYgPSBidWYwOworCisgICAgZm9yICg7IGJ1ZiA8IGVuZDsgYnVmID0gYnVmMiArIDEpIHsKKyAgICAgICAgYnVmMiA9IGJ1ZjsKKworICAgICAgICBmb3IgKGZyYW1lcyA9IDA7IGJ1ZjIgPCBlbmQ7IGZyYW1lcysrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBoZWFkZXIgPSBBVl9SQjE2KGJ1ZjIpOworICAgICAgICAgICAgaWYgKChoZWFkZXIgJiAweEZGRjYpICE9IDB4RkZGMCkgeworICAgICAgICAgICAgICAgIGlmIChidWYgIT0gYnVmMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCBzb21ldGhpbmcgdGhhdCBpc24ndCBhbiBBRFRTIGhlYWRlciwgc3RhcnRpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBhIHBvc2l0aW9uIG90aGVyIHRoYW4gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgdGhlIGNvdW50IHdlJ3ZlIGFjY3VtdWxhdGVkIHNvIGZhciBzaW5jZSBpdAorICAgICAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSB3YXMgYSBmYWxzZSBwb3NpdGl2ZS4KKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmc2l6ZSA9IChBVl9SQjMyKGJ1ZjIgKyAzKSA+PiAxMykgJiAweDFGRkY7CisgICAgICAgICAgICBpZiAoZnNpemUgPCA3KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZnNpemUgPSBGRk1JTihmc2l6ZSwgZW5kIC0gYnVmMik7CisgICAgICAgICAgICBidWYyICs9IGZzaXplOworICAgICAgICB9CisgICAgICAgIG1heF9mcmFtZXMgPSBGRk1BWChtYXhfZnJhbWVzLCBmcmFtZXMpOworICAgICAgICBpZiAoYnVmID09IGJ1ZjApCisgICAgICAgICAgICBmaXJzdF9mcmFtZXMgPSBmcmFtZXM7CisgICAgfQorCisgICAgaWYgKGZpcnN0X2ZyYW1lcyA+PSAzKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAxOworICAgIGVsc2UgaWYgKG1heF9mcmFtZXMgPiAxMDApCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKKyAgICBlbHNlIGlmIChtYXhfZnJhbWVzID49IDMpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDI7CisgICAgZWxzZSBpZiAobWF4X2ZyYW1lcyA+PSAxKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdHNfYWFjX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBzLT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CisgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CisKKyAgICBmZl9pZDN2MV9yZWFkKHMpOworICAgIGlmIChzLT5wYi0+c2Vla2FibGUgJiYKKyAgICAgICAgIWF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiIiwgTlVMTCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkgeworICAgICAgICBpbnQ2NF90IGN1ciA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgIGZmX2FwZV9wYXJzZV90YWcocyk7CisgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgY3VyLCBTRUVLX1NFVCk7CisgICAgfQorCisgICAgLy8gTENNIG9mIGFsbCBwb3NzaWJsZSBBRFRTIHNhbXBsZSByYXRlcworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAyODIyNDAwMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9hYWNfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gImFhYyIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgQURUUyBBQUMgKEFkdmFuY2VkIEF1ZGlvIENvZGluZykiKSwKKyAgICAucmVhZF9wcm9iZSAgID0gYWR0c19hYWNfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICA9IGFkdHNfYWFjX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgPSBmZl9yYXdfcmVhZF9wYXJ0aWFsX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKKyAgICAuZXh0ZW5zaW9ucyAgID0gImFhYyIsCisgICAgLm1pbWVfdHlwZSAgICA9ICJhdWRpby9hYWMsYXVkaW8vYWFjcCxhdWRpby94LWFhYyIsCisgICAgLnJhd19jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FBQywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYWMzZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYWMzZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlZjQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hYzNkZWMuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIFJBVyBBQy0zIGFuZCBFLUFDLTMgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYzNfcGFyc2VyLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJyYXdkZWMuaCIKKworc3RhdGljIGludCBhYzNfZWFjM19wcm9iZShBVlByb2JlRGF0YSAqcCwgZW51bSBBVkNvZGVjSUQgZXhwZWN0ZWRfY29kZWNfaWQpCit7CisgICAgaW50IG1heF9mcmFtZXMsIGZpcnN0X2ZyYW1lcyA9IDAsIGZyYW1lczsKKyAgICBjb25zdCB1aW50OF90ICpidWYsICpidWYyLCAqZW5kOworICAgIEFDM0hlYWRlckluZm8gKnBoZHIgPSBOVUxMOworICAgIEdldEJpdENvbnRleHQgZ2JjOworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfQUMzOworCisgICAgbWF4X2ZyYW1lcyA9IDA7CisgICAgYnVmID0gcC0+YnVmOworICAgIGVuZCA9IGJ1ZiArIHAtPmJ1Zl9zaXplOworCisgICAgZm9yKDsgYnVmIDwgZW5kOyBidWYrKykgeworICAgICAgICBpZihidWYgPiBwLT5idWYgJiYgIShidWZbMF0gPT0gMHgwQiAmJiBidWZbMV0gPT0gMHg3NykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICEoYnVmWzBdID09IDB4NzcgJiYgYnVmWzFdID09IDB4MEIpICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBidWYyID0gYnVmOworCisgICAgICAgIGZvcihmcmFtZXMgPSAwOyBidWYyIDwgZW5kOyBmcmFtZXMrKykgeworICAgICAgICAgICAgdWludDhfdCBidWYzWzQwOTZdOworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpZighbWVtY21wKGJ1ZjIsICJceDFceDEwXDBcMFwwXDBcMFwwIiwgOCkpCisgICAgICAgICAgICAgICAgYnVmMis9MTY7CisgICAgICAgICAgICBpZiAoYnVmWzBdID09IDB4NzcgJiYgYnVmWzFdID09IDB4MEIpIHsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDg7IGkrPTIpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmM1tpICBdID0gYnVmW2krMV07CisgICAgICAgICAgICAgICAgICAgIGJ1ZjNbaSsxXSA9IGJ1ZltpICBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYmMsIGJ1ZjMsIDU0KTsKKyAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmZ2JjLCBidWYyLCA1NCk7CisgICAgICAgICAgICBpZihhdnByaXZfYWMzX3BhcnNlX2hlYWRlcjIoJmdiYywgJnBoZHIpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmKGJ1ZjIgKyBwaGRyLT5mcmFtZV9zaXplID4gZW5kKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGJ1ZlswXSA9PSAweDc3ICYmIGJ1ZlsxXSA9PSAweDBCKSB7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChwaGRyLT5mcmFtZV9zaXplIDw9IHNpemVvZihidWYzKSk7CisgICAgICAgICAgICAgICAgZm9yKGk9ODsgaTxwaGRyLT5mcmFtZV9zaXplOyBpKz0yKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZjNbaSAgXSA9IGJ1ZltpKzFdOworICAgICAgICAgICAgICAgICAgICBidWYzW2krMV0gPSBidWZbaSAgXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMTZfQU5TSSksIDAsIGdiYy5idWZmZXIgKyAyLCBwaGRyLT5mcmFtZV9zaXplIC0gMikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocGhkci0+Yml0c3RyZWFtX2lkID4gMTApCisgICAgICAgICAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9FQUMzOworICAgICAgICAgICAgYnVmMiArPSBwaGRyLT5mcmFtZV9zaXplOworICAgICAgICB9CisgICAgICAgIG1heF9mcmFtZXMgPSBGRk1BWChtYXhfZnJhbWVzLCBmcmFtZXMpOworICAgICAgICBpZihidWYgPT0gcC0+YnVmKQorICAgICAgICAgICAgZmlyc3RfZnJhbWVzID0gZnJhbWVzOworICAgIH0KKyAgICBhdl9mcmVlcCgmcGhkcik7CisgICAgaWYoY29kZWNfaWQgIT0gZXhwZWN0ZWRfY29kZWNfaWQpIHJldHVybiAwOworICAgIC8vIGtlZXAgdGhpcyBpbiBzeW5jIHdpdGggbXAzIHByb2JlLCBib3RoIG5lZWQgdG8gYXZvaWQKKyAgICAvLyBpc3N1ZXMgd2l0aCBNUEVHLWZpbGVzIQorICAgIGlmICAgKGZpcnN0X2ZyYW1lcz49NCkgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMTsKKyAgICBlbHNlIGlmKG1heF9mcmFtZXM+MjAwKXJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKKyAgICBlbHNlIGlmKG1heF9mcmFtZXM+PTQpIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTi8yOworICAgIGVsc2UgaWYobWF4X2ZyYW1lcz49MSkgcmV0dXJuIDE7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19BQzNfREVNVVhFUgorc3RhdGljIGludCBhYzNfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgcmV0dXJuIGFjM19lYWMzX3Byb2JlKHAsIEFWX0NPREVDX0lEX0FDMyk7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYWMzX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFjMyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBBQy0zIiksCisgICAgLnJlYWRfcHJvYmUgICAgID0gYWMzX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGZmX3Jhd19hdWRpb19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmZl9yYXdfcmVhZF9wYXJ0aWFsX3BhY2tldCwKKyAgICAuZmxhZ3M9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCisgICAgLmV4dGVuc2lvbnMgPSAiYWMzIiwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BQzMsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfRUFDM19ERU1VWEVSCitzdGF0aWMgaW50IGVhYzNfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgcmV0dXJuIGFjM19lYWMzX3Byb2JlKHAsIEFWX0NPREVDX0lEX0VBQzMpOworfQorCitBVklucHV0Rm9ybWF0IGZmX2VhYzNfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZWFjMyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBFLUFDLTMiKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBlYWMzX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGZmX3Jhd19hdWRpb19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmZl9yYXdfcmVhZF9wYXJ0aWFsX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5leHRlbnNpb25zICAgICA9ICJlYWMzIiwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9FQUMzLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2FjdC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjIzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYWN0LmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBBQ1QgZmlsZSBmb3JtYXQgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicmlmZi5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorCisjZGVmaW5lIENIVU5LX1NJWkUgNTEyCisjZGVmaW5lIFJJRkZfVEFHIE1LVEFHKCdSJywnSScsJ0YnLCdGJykKKyNkZWZpbmUgV0FWRV9UQUcgTUtUQUcoJ1cnLCdBJywnVicsJ0UnKQorCit0eXBlZGVmIHN0cnVjdHsKKyAgICBpbnQgYnl0ZXNfbGVmdF9pbl9jaHVuazsKKyAgICB1aW50OF90IGF1ZGlvX2J1ZmZlclsyMl07Ly8vPCB0ZW1wb3JhcnkgYnVmZmVyIGZvciBBQ1QgZnJhbWUKKyAgICBjaGFyIHNlY29uZF9wYWNrZXQ7ICAgICAgLy8vPCAxIC0gaWYgdGVtcG9yYXJ5IGJ1ZmZlciBjb250YWlucyB2YWxpZCAoc2Vjb25kKSBHLjcyOSBwYWNrZXQKK30gQUNUQ29udGV4dDsKKworc3RhdGljIGludCBwcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmICgoQVZfUkwzMigmcC0+YnVmWzBdKSAhPSBSSUZGX1RBRykgfHwKKyAgICAgICAgKEFWX1JMMzIoJnAtPmJ1Zls4XSkgIT0gV0FWRV9UQUcpIHx8CisgICAgICAgIChBVl9STDMyKCZwLT5idWZbMTZdKSAhPSAxNikpCisgICAgcmV0dXJuIDA7CisKKyAgICAvL1dlIGNhbid0IGJlIHN1cmUgdGhhdCB0aGlzIGlzIEFDVCBhbmQgbm90IHJlZ3VsYXIgV0FWCisgICAgaWYgKHAtPmJ1Zl9zaXplPDUxMikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IoaT00NDsgaTwyNTY7IGkrKykKKyAgICAgICAgaWYocC0+YnVmW2ldKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZihwLT5idWZbMjU2XSE9MHg4NCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IoaT0yNjQ7IGk8NTEyOyBpKyspCisgICAgICAgIGlmKHAtPmJ1ZltpXSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBQ1RDb250ZXh0KiBjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHNpemU7CisgICAgQVZTdHJlYW0qIHN0OworCisgICAgaW50IG1pbixzZWMsbXNlYzsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZpb19za2lwKHBiLCAxNik7CisgICAgc2l6ZT1hdmlvX3JsMzIocGIpOworICAgIGZmX2dldF93YXZfaGVhZGVyKHBiLCBzdC0+Y29kZWMsIHNpemUpOworCisgICAgLyoKKyAgICAgIDgwMDBIeiAoRmluZS1yZWMpIGZpbGUgZm9ybWF0IGhhcyAxMCBieXRlcyBsb25nCisgICAgICBwYWNrZXRzIHdpdGggMTBtcyBvZiBzb3VuZCBkYXRhIGluIHRoZW0KKyAgICAqLworICAgIGlmIChzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICE9IDgwMDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlNhbXBsZSByYXRlICVkIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3QtPmNvZGVjLT5mcmFtZV9zaXplPTgwOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHM9MTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwKTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQ9QVZfQ09ERUNfSURfRzcyOTsKKworICAgIGF2aW9fc2VlayhwYiwgMjU3LCBTRUVLX1NFVCk7CisgICAgbXNlYz1hdmlvX3JsMTYocGIpOworICAgIHNlYz1hdmlvX3I4KHBiKTsKKyAgICBtaW49YXZpb19ybDMyKHBiKTsKKworICAgIHN0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGUoMTAwMCoobWluKjYwK3NlYykrbXNlYywgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSwgMTAwMCAqIHN0LT5jb2RlYy0+ZnJhbWVfc2l6ZSk7CisKKyAgICBjdHgtPmJ5dGVzX2xlZnRfaW5fY2h1bms9Q0hVTktfU0laRTsKKworICAgIGF2aW9fc2VlayhwYiwgNTEyLCBTRUVLX1NFVCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBQ1RDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHJldDsKKyAgICBpbnQgZnJhbWVfc2l6ZT1zLT5zdHJlYW1zWzBdLT5jb2RlYy0+c2FtcGxlX3JhdGU9PTgwMDA/MTA6MjI7CisKKworICAgIGlmKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5zYW1wbGVfcmF0ZT09ODAwMCkKKyAgICAgICAgcmV0PWF2X25ld19wYWNrZXQocGt0LCAxMCk7CisgICAgZWxzZQorICAgICAgICByZXQ9YXZfbmV3X3BhY2tldChwa3QsIDExKTsKKworICAgIGlmKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5zYW1wbGVfcmF0ZT09NDQwMCAmJiAhY3R4LT5zZWNvbmRfcGFja2V0KQorICAgIHsKKyAgICAgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBjdHgtPmF1ZGlvX2J1ZmZlciwgZnJhbWVfc2l6ZSk7CisKKyAgICAgICAgaWYocmV0PDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZihyZXQhPWZyYW1lX3NpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgICAgIHBrdC0+ZGF0YVswXT1jdHgtPmF1ZGlvX2J1ZmZlclsxMV07CisgICAgICAgIHBrdC0+ZGF0YVsxXT1jdHgtPmF1ZGlvX2J1ZmZlclswXTsKKyAgICAgICAgcGt0LT5kYXRhWzJdPWN0eC0+YXVkaW9fYnVmZmVyWzEyXTsKKyAgICAgICAgcGt0LT5kYXRhWzNdPWN0eC0+YXVkaW9fYnVmZmVyWzFdOworICAgICAgICBwa3QtPmRhdGFbNF09Y3R4LT5hdWRpb19idWZmZXJbMTNdOworICAgICAgICBwa3QtPmRhdGFbNV09Y3R4LT5hdWRpb19idWZmZXJbMl07CisgICAgICAgIHBrdC0+ZGF0YVs2XT1jdHgtPmF1ZGlvX2J1ZmZlclsxNF07CisgICAgICAgIHBrdC0+ZGF0YVs3XT1jdHgtPmF1ZGlvX2J1ZmZlclszXTsKKyAgICAgICAgcGt0LT5kYXRhWzhdPWN0eC0+YXVkaW9fYnVmZmVyWzE1XTsKKyAgICAgICAgcGt0LT5kYXRhWzldPWN0eC0+YXVkaW9fYnVmZmVyWzRdOworICAgICAgICBwa3QtPmRhdGFbMTBdPWN0eC0+YXVkaW9fYnVmZmVyWzE2XTsKKworICAgICAgICBjdHgtPnNlY29uZF9wYWNrZXQ9MTsKKyAgICB9CisgICAgZWxzZSBpZihzLT5zdHJlYW1zWzBdLT5jb2RlYy0+c2FtcGxlX3JhdGU9PTQ0MDAgJiYgY3R4LT5zZWNvbmRfcGFja2V0KQorICAgIHsKKyAgICAgICAgcGt0LT5kYXRhWzBdPWN0eC0+YXVkaW9fYnVmZmVyWzVdOworICAgICAgICBwa3QtPmRhdGFbMV09Y3R4LT5hdWRpb19idWZmZXJbMTddOworICAgICAgICBwa3QtPmRhdGFbMl09Y3R4LT5hdWRpb19idWZmZXJbNl07CisgICAgICAgIHBrdC0+ZGF0YVszXT1jdHgtPmF1ZGlvX2J1ZmZlclsxOF07CisgICAgICAgIHBrdC0+ZGF0YVs0XT1jdHgtPmF1ZGlvX2J1ZmZlcls3XTsKKyAgICAgICAgcGt0LT5kYXRhWzVdPWN0eC0+YXVkaW9fYnVmZmVyWzE5XTsKKyAgICAgICAgcGt0LT5kYXRhWzZdPWN0eC0+YXVkaW9fYnVmZmVyWzhdOworICAgICAgICBwa3QtPmRhdGFbN109Y3R4LT5hdWRpb19idWZmZXJbMjBdOworICAgICAgICBwa3QtPmRhdGFbOF09Y3R4LT5hdWRpb19idWZmZXJbOV07CisgICAgICAgIHBrdC0+ZGF0YVs5XT1jdHgtPmF1ZGlvX2J1ZmZlclsyMV07CisgICAgICAgIHBrdC0+ZGF0YVsxMF09Y3R4LT5hdWRpb19idWZmZXJbMTBdOworCisgICAgICAgIGN0eC0+c2Vjb25kX3BhY2tldD0wOworICAgIH0KKyAgICBlbHNlIC8vIDgwMDAgSHoKKyAgICB7CisgICAgICAgIHJldCA9IGF2aW9fcmVhZChwYiwgY3R4LT5hdWRpb19idWZmZXIsIGZyYW1lX3NpemUpOworCisgICAgICAgIGlmKHJldDwwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYocmV0IT1mcmFtZV9zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgICAgICBwa3QtPmRhdGFbMF09Y3R4LT5hdWRpb19idWZmZXJbNV07CisgICAgICAgIHBrdC0+ZGF0YVsxXT1jdHgtPmF1ZGlvX2J1ZmZlclswXTsKKyAgICAgICAgcGt0LT5kYXRhWzJdPWN0eC0+YXVkaW9fYnVmZmVyWzZdOworICAgICAgICBwa3QtPmRhdGFbM109Y3R4LT5hdWRpb19idWZmZXJbMV07CisgICAgICAgIHBrdC0+ZGF0YVs0XT1jdHgtPmF1ZGlvX2J1ZmZlcls3XTsKKyAgICAgICAgcGt0LT5kYXRhWzVdPWN0eC0+YXVkaW9fYnVmZmVyWzJdOworICAgICAgICBwa3QtPmRhdGFbNl09Y3R4LT5hdWRpb19idWZmZXJbOF07CisgICAgICAgIHBrdC0+ZGF0YVs3XT1jdHgtPmF1ZGlvX2J1ZmZlclszXTsKKyAgICAgICAgcGt0LT5kYXRhWzhdPWN0eC0+YXVkaW9fYnVmZmVyWzldOworICAgICAgICBwa3QtPmRhdGFbOV09Y3R4LT5hdWRpb19idWZmZXJbNF07CisgICAgfQorCisgICAgY3R4LT5ieXRlc19sZWZ0X2luX2NodW5rIC09IGZyYW1lX3NpemU7CisKKyAgICBpZihjdHgtPmJ5dGVzX2xlZnRfaW5fY2h1bmsgPCBmcmFtZV9zaXplKQorICAgIHsKKyAgICAgICAgYXZpb19za2lwKHBiLCBjdHgtPmJ5dGVzX2xlZnRfaW5fY2h1bmspOworICAgICAgICBjdHgtPmJ5dGVzX2xlZnRfaW5fY2h1bms9Q0hVTktfU0laRTsKKyAgICB9CisKKyAgICBwa3QtPmR1cmF0aW9uPTE7CisKKyAgICByZXR1cm4gcmV0OworfQorCitBVklucHV0Rm9ybWF0IGZmX2FjdF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhY3QiLAorICAgIC5sb25nX25hbWUgICAgICA9ICJBQ1QgVm9pY2UgZmlsZSBmb3JtYXQiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBQ1RDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBwcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSByZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSByZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYWRwLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYWRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzNjYxYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hZHAuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICogQURQIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMyBKYW1lcyBBbG1lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIGludCBhZHBfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IGksIGNoYW5nZXMgPSAwOworICAgIGNoYXIgbGFzdCA9IDA7CisKKyAgICBpZiAocC0+YnVmX3NpemUgPCAzMikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+YnVmX3NpemUgLSAzOyBpKz0zMikgeworICAgICAgICBpZiAocC0+YnVmW2ldICE9IHAtPmJ1ZltpKzJdIHx8IHAtPmJ1ZltpKzFdICE9IHAtPmJ1ZltpKzNdKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChwLT5idWZbaV0gIT0gbGFzdCkKKyAgICAgICAgICAgIGNoYW5nZXMrKzsKKyAgICAgICAgbGFzdCA9IHAtPmJ1ZltpXTsKKyAgICB9CisgICAgaWYgKGNoYW5nZXMgPD0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gcC0+YnVmX3NpemUgPCAyNjAgPyAxIDogQVZQUk9CRV9TQ09SRV9NQVggLyA0OworfQorCitzdGF0aWMgaW50IGFkcF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9EVEs7CisgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDI7CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICA9IDQ4MDAwOworICAgIHN0LT5zdGFydF90aW1lICAgICAgICAgICAgPSAwOworICAgIGlmIChzLT5wYi0+c2Vla2FibGUpCisgICAgICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihzdC0+Y29kZWMsIGF2aW9fc2l6ZShzLT5wYikpOworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRwX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0LCBzaXplID0gMTAyNDsKKworICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOworCisgICAgaWYgKHJldCAhPSBzaXplKSB7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBhdl9zaHJpbmtfcGFja2V0KHBrdCwgcmV0KTsKKyAgICB9CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworCisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9hZHBfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYWRwIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQIiksCisgICAgLnJlYWRfcHJvYmUgICAgID0gYWRwX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGFkcF9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBhZHBfcmVhZF9wYWNrZXQsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImFkcCxkdGsiLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hZHRzZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYWR0c2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Yzg4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYWR0c2VuYy5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogQURUUyBtdXhlci4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlLmNvdWR1cmllckBzbWFydGpvZy5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9wdXRfYml0cy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZzRhdWRpby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImFwZXRhZy5oIgorI2luY2x1ZGUgImlkM3YyLmgiCisKKyNkZWZpbmUgQURUU19IRUFERVJfU0laRSA3CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgd3JpdGVfYWR0czsKKyAgICBpbnQgb2JqZWN0dHlwZTsKKyAgICBpbnQgc2FtcGxlX3JhdGVfaW5kZXg7CisgICAgaW50IGNoYW5uZWxfY29uZjsKKyAgICBpbnQgcGNlX3NpemU7CisgICAgaW50IGFwZXRhZzsKKyAgICBpbnQgaWQzdjJ0YWc7CisgICAgdWludDhfdCBwY2VfZGF0YVtNQVhfUENFX1NJWkVdOworfSBBRFRTQ29udGV4dDsKKworI2RlZmluZSBBRFRTX01BWF9GUkFNRV9CWVRFUyAoKDEgPDwgMTMpIC0gMSkKKworc3RhdGljIGludCBhZHRzX2RlY29kZV9leHRyYWRhdGEoQVZGb3JtYXRDb250ZXh0ICpzLCBBRFRTQ29udGV4dCAqYWR0cywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIFB1dEJpdENvbnRleHQgcGI7CisgICAgTVBFRzRBdWRpb0NvbmZpZyBtNGFjOworICAgIGludCBvZmY7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCBzaXplICogOCk7CisgICAgb2ZmID0gYXZwcml2X21wZWc0YXVkaW9fZ2V0X2NvbmZpZygmbTRhYywgYnVmLCBzaXplICogOCwgMSk7CisgICAgaWYgKG9mZiA8IDApCisgICAgICAgIHJldHVybiBvZmY7CisgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCBvZmYpOworICAgIGFkdHMtPm9iamVjdHR5cGUgICAgICAgID0gbTRhYy5vYmplY3RfdHlwZSAtIDE7CisgICAgYWR0cy0+c2FtcGxlX3JhdGVfaW5kZXggPSBtNGFjLnNhbXBsaW5nX2luZGV4OworICAgIGFkdHMtPmNoYW5uZWxfY29uZiAgICAgID0gbTRhYy5jaGFuX2NvbmZpZzsKKworICAgIGlmIChhZHRzLT5vYmplY3R0eXBlID4gM1UpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk1QRUctNCBBT1QgJWQgaXMgbm90IGFsbG93ZWQgaW4gQURUU1xuIiwgYWR0cy0+b2JqZWN0dHlwZSsxKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChhZHRzLT5zYW1wbGVfcmF0ZV9pbmRleCA9PSAxNSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXNjYXBlIHNhbXBsZSByYXRlIGluZGV4IGlsbGVnYWwgaW4gQURUU1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoZ2V0X2JpdHMoJmdiLCAxKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiOTYwLzEyMCBNRENUIHdpbmRvdyBpcyBub3QgYWxsb3dlZCBpbiBBRFRTXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChnZXRfYml0cygmZ2IsIDEpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTY2FsYWJsZSBjb25maWd1cmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gQURUU1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoZ2V0X2JpdHMoJmdiLCAxKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXh0ZW5zaW9uIGZsYWcgaXMgbm90IGFsbG93ZWQgaW4gQURUU1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoIWFkdHMtPmNoYW5uZWxfY29uZikgeworICAgICAgICBpbml0X3B1dF9iaXRzKCZwYiwgYWR0cy0+cGNlX2RhdGEsIE1BWF9QQ0VfU0laRSk7CisKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAzLCA1KTsgLy9JRF9QQ0UKKyAgICAgICAgYWR0cy0+cGNlX3NpemUgPSAoYXZwcml2X2NvcHlfcGNlX2RhdGEoJnBiLCAmZ2IpICsgMykgLyA4OworICAgICAgICBmbHVzaF9wdXRfYml0cygmcGIpOworICAgIH0KKworICAgIGFkdHMtPndyaXRlX2FkdHMgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR0c193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFEVFNDb250ZXh0ICphZHRzID0gcy0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNDb250ZXh0ICphdmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKworICAgIGlmIChhZHRzLT5pZDN2MnRhZykKKyAgICAgICAgZmZfaWQzdjJfd3JpdGVfc2ltcGxlKHMsIDQsIElEM3YyX0RFRkFVTFRfTUFHSUMpOworICAgIGlmIChhdmMtPmV4dHJhZGF0YV9zaXplID4gMCkKKyAgICAgICAgcmV0dXJuIGFkdHNfZGVjb2RlX2V4dHJhZGF0YShzLCBhZHRzLCBhdmMtPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmMtPmV4dHJhZGF0YV9zaXplKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdHNfd3JpdGVfZnJhbWVfaGVhZGVyKEFEVFNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsIGludCBwY2Vfc2l6ZSkKK3sKKyAgICBQdXRCaXRDb250ZXh0IHBiOworCisgICAgdW5zaWduZWQgZnVsbF9mcmFtZV9zaXplID0gKHVuc2lnbmVkKUFEVFNfSEVBREVSX1NJWkUgKyBzaXplICsgcGNlX3NpemU7CisgICAgaWYgKGZ1bGxfZnJhbWVfc2l6ZSA+IEFEVFNfTUFYX0ZSQU1FX0JZVEVTKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJBRFRTIGZyYW1lIHNpemUgdG9vIGxhcmdlOiAldSAobWF4ICVkKVxuIiwKKyAgICAgICAgICAgICAgIGZ1bGxfZnJhbWVfc2l6ZSwgQURUU19NQVhfRlJBTUVfQllURVMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgYnVmLCBBRFRTX0hFQURFUl9TSVpFKTsKKworICAgIC8qIGFkdHNfZml4ZWRfaGVhZGVyICovCisgICAgcHV0X2JpdHMoJnBiLCAxMiwgMHhmZmYpOyAgIC8qIHN5bmN3b3JkICovCisgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgICAgICAgIC8qIElEICovCisgICAgcHV0X2JpdHMoJnBiLCAyLCAwKTsgICAgICAgIC8qIGxheWVyICovCisgICAgcHV0X2JpdHMoJnBiLCAxLCAxKTsgICAgICAgIC8qIHByb3RlY3Rpb25fYWJzZW50ICovCisgICAgcHV0X2JpdHMoJnBiLCAyLCBjdHgtPm9iamVjdHR5cGUpOyAvKiBwcm9maWxlX29iamVjdHR5cGUgKi8KKyAgICBwdXRfYml0cygmcGIsIDQsIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXgpOworICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7ICAgICAgICAvKiBwcml2YXRlX2JpdCAqLworICAgIHB1dF9iaXRzKCZwYiwgMywgY3R4LT5jaGFubmVsX2NvbmYpOyAvKiBjaGFubmVsX2NvbmZpZ3VyYXRpb24gKi8KKyAgICBwdXRfYml0cygmcGIsIDEsIDApOyAgICAgICAgLyogb3JpZ2luYWxfY29weSAqLworICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7ICAgICAgICAvKiBob21lICovCisKKyAgICAvKiBhZHRzX3ZhcmlhYmxlX2hlYWRlciAqLworICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7ICAgICAgICAvKiBjb3B5cmlnaHRfaWRlbnRpZmljYXRpb25fYml0ICovCisgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgICAgICAgIC8qIGNvcHlyaWdodF9pZGVudGlmaWNhdGlvbl9zdGFydCAqLworICAgIHB1dF9iaXRzKCZwYiwgMTMsIGZ1bGxfZnJhbWVfc2l6ZSk7IC8qIGFhY19mcmFtZV9sZW5ndGggKi8KKyAgICBwdXRfYml0cygmcGIsIDExLCAweDdmZik7ICAgLyogYWR0c19idWZmZXJfZnVsbG5lc3MgKi8KKyAgICBwdXRfYml0cygmcGIsIDIsIDApOyAgICAgICAgLyogbnVtYmVyX29mX3Jhd19kYXRhX2Jsb2Nrc19pbl9mcmFtZSAqLworCisgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdHNfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBRFRTQ29udGV4dCAqYWR0cyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1aW50OF90IGJ1ZltBRFRTX0hFQURFUl9TSVpFXTsKKworICAgIGlmICghcGt0LT5zaXplKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYWR0cy0+d3JpdGVfYWR0cykgeworICAgICAgICBpbnQgZXJyID0gYWR0c193cml0ZV9mcmFtZV9oZWFkZXIoYWR0cywgYnVmLCBwa3QtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHRzLT5wY2Vfc2l6ZSk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgYXZpb193cml0ZShwYiwgYnVmLCBBRFRTX0hFQURFUl9TSVpFKTsKKyAgICAgICAgaWYgKGFkdHMtPnBjZV9zaXplKSB7CisgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBhZHRzLT5wY2VfZGF0YSwgYWR0cy0+cGNlX3NpemUpOworICAgICAgICAgICAgYWR0cy0+cGNlX3NpemUgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGF2aW9fd3JpdGUocGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdHNfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQURUU0NvbnRleHQgKmFkdHMgPSBzLT5wcml2X2RhdGE7CisKKyAgICBpZiAoYWR0cy0+YXBldGFnKQorICAgICAgICBmZl9hcGVfd3JpdGVfdGFnKHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRU5DIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCisjZGVmaW5lIE9GRlNFVChvYmopIG9mZnNldG9mKEFEVFNDb250ZXh0LCBvYmopCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgIndyaXRlX2lkM3YyIiwgIkVuYWJsZSBJRDN2MiB0YWcgd3JpdGluZyIsIE9GRlNFVChpZDN2MnRhZyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMSwgRU5DfSwKKyAgICB7ICJ3cml0ZV9hcGV0YWciLCAiRW5hYmxlIEFQRSB0YWcgd3JpdGluZyIsIE9GRlNFVChhcGV0YWcpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIEVOQ30sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBhZHRzX211eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICA9ICJBRFRTIG11eGVyIiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWT3V0cHV0Rm9ybWF0IGZmX2FkdHNfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImFkdHMiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBRFRTIEFBQyAoQWR2YW5jZWQgQXVkaW8gQ29kaW5nKSIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhdWRpby9hYWMiLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJhYWMsYWR0cyIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKEFEVFNDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9BQUMsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBhZHRzX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBhZHRzX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBhZHRzX3dyaXRlX3RyYWlsZXIsCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJmFkdHNfbXV4ZXJfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hZHhkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hZHhkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGFhMjAxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FkeGRlYy5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEp1c3RpbiBSdWdnbGVzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENSSSBBRFggZGVtdXhlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIEJMT0NLX1NJWkUgICAgMTgKKyNkZWZpbmUgQkxPQ0tfU0FNUExFUyAzMgorCit0eXBlZGVmIHN0cnVjdCBBRFhEZW11eGVyQ29udGV4dCB7CisgICAgaW50IGhlYWRlcl9zaXplOworfSBBRFhEZW11eGVyQ29udGV4dDsKKworc3RhdGljIGludCBhZHhfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFEWERlbXV4ZXJDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIGludCByZXQsIHNpemU7CisKKyAgICBzaXplID0gQkxPQ0tfU0laRSAqIGF2Y3R4LT5jaGFubmVsczsKKworICAgIHBrdC0+cG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOworICAgIGlmIChyZXQgIT0gc2l6ZSkgeworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgaWYgKEFWX1JCMTYocGt0LT5kYXRhKSAmIDB4ODAwMCkgeworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQorICAgIHBrdC0+c2l6ZSAgICAgPSBzaXplOworICAgIHBrdC0+ZHVyYXRpb24gPSAxOworICAgIHBrdC0+cHRzICAgICAgPSAocGt0LT5wb3MgLSBjLT5oZWFkZXJfc2l6ZSkgLyBzaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR4X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBRFhEZW11eGVyQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZjdHggPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKworICAgIGlmIChhdmlvX3JiMTYocy0+cGIpICE9IDB4ODAwMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgYy0+aGVhZGVyX3NpemUgPSBhdmlvX3JiMTYocy0+cGIpICsgNDsKKyAgICBhdmlvX3NlZWsocy0+cGIsIC00LCBTRUVLX0NVUik7CisKKyAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShhdmN0eCwgcy0+cGIsIGMtPmhlYWRlcl9zaXplKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMTIpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZXh0cmFkYXRhIHNpemUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDgpOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gcy0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIEJMT0NLX1NBTVBMRVMsIGF2Y3R4LT5zYW1wbGVfcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9hZHhfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYWR4IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ1JJIEFEWCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBRFhEZW11eGVyQ29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgID0gYWR4X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGFkeF9yZWFkX3BhY2tldCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiYWR4IiwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9BRFgsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYWVhLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYWVhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViOWIxYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hZWEuYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIE1EIFNUVURJTyBhdWRpbyBkZW11eGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEJlbmphbWluIExhcnNzb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInBjbS5oIgorCisjZGVmaW5lIEFUMV9TVV9TSVpFICAgICAyMTIKKworc3RhdGljIGludCBhZWFfcmVhZF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAocC0+YnVmX3NpemUgPD0gMjA0OCsyMTIpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogTWFnaWMgaXMgJzAwIDA4IDAwIDAwJyBpbiBMaXR0bGUgRW5kaWFuKi8KKyAgICBpZiAoQVZfUkwzMihwLT5idWYpPT0weDgwMCkgeworICAgICAgICBpbnQgYnNtX3MsIGJzbV9lLCBpbmJfcywgaW5iX2UsIGNoOworICAgICAgICBjaCAgICA9IHAtPmJ1ZlsyNjRdOworICAgICAgICBic21fcyA9IHAtPmJ1ZlsyMDQ4XTsKKyAgICAgICAgaW5iX3MgPSBwLT5idWZbMjA0OCsxXTsKKyAgICAgICAgaW5iX2UgPSBwLT5idWZbMjA0OCsyMTBdOworICAgICAgICBic21fZSA9IHAtPmJ1ZlsyMDQ4KzIxMV07CisKKyAgICAgICAgaWYgKGNoICE9IDEgJiYgY2ggIT0gMikKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIC8qIENoZWNrIHNvIHRoYXQgdGhlIHJlZHVuZGFudCBic20gYnl0ZXMgYW5kIGluZm8gYnl0ZXMgYXJlIHZhbGlkCisgICAgICAgICAqIHRoZSBibG9jayBzaXplIG1vZGUgYnl0ZXMgaGF2ZSB0byBiZSB0aGUgc2FtZQorICAgICAgICAgKiB0aGUgaW5mbyBieXRlcyBoYXZlIHRvIGJlIHRoZSBzYW1lCisgICAgICAgICAqLworICAgICAgICBpZiAoYnNtX3MgPT0gYnNtX2UgJiYgaW5iX3MgPT0gaW5iX2UpCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLyA0ICsgMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWVhX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBQYXJzZSB0aGUgYW1vdW50IG9mIGNoYW5uZWxzIGFuZCBza2lwIHRvIHBvcyAyMDQ4KDB4ODAwKSAqLworICAgIGF2aW9fc2tpcChzLT5wYiwgMjY0KTsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gYXZpb19yOChzLT5wYik7CisgICAgYXZpb19za2lwKHMtPnBiLCAxNzgzKTsKKworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgICAgID0gQVZfQ09ERUNfSURfQVRSQUMxOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgPSA0NDEwMDsKKyAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgICAgID0gMjkyMDAwOworCisgICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgIT0gMSAmJiBzdC0+Y29kZWMtPmNoYW5uZWxzICE9IDIpIHsKKyAgICAgICAgYXZfbG9nKHMsQVZfTE9HX0VSUk9SLCJDaGFubmVscyAlZCBub3Qgc3VwcG9ydGVkIVxuIixzdC0+Y29kZWMtPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSAoc3QtPmNvZGVjLT5jaGFubmVscyA9PSAxKSA/IEFWX0NIX0xBWU9VVF9NT05PIDogQVZfQ0hfTEFZT1VUX1NURVJFTzsKKworICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBBVDFfU1VfU0laRSAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWVhX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+YmxvY2tfYWxpZ24pOworCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIGlmIChyZXQgPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYWVhX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFlYSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1EIFNUVURJTyBhdWRpbyIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGFlYV9yZWFkX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGFlYV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBhZWFfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlayAgICAgID0gZmZfcGNtX3JlYWRfc2VlaywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5leHRlbnNpb25zICAgICA9ICJhZWEiLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hZmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hZmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGJkMjMyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FmYy5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBBRkMgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBBRkNEZW11eENvbnRleHQgeworICAgIGludDY0X3QgICAgZGF0YV9lbmQ7Cit9IEFGQ0RlbXV4Q29udGV4dDsKKworc3RhdGljIGludCBhZmNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFGQ0RlbXV4Q29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQURQQ01fQUZDOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICA9IDI7CisgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgMSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbMF0gPSA4ICogc3QtPmNvZGVjLT5jaGFubmVsczsKKworICAgIGMtPmRhdGFfZW5kID0gYXZpb19yYjMyKHMtPnBiKSArIDMyTEw7CisgICAgc3QtPmR1cmF0aW9uID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjE2KHMtPnBiKTsKKyAgICBhdmlvX3NraXAocy0+cGIsIDIyKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZmNfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFGQ0RlbXV4Q29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IHNpemU7CisgICAgaW50IHJldDsKKworICAgIHNpemUgPSBGRk1JTihjLT5kYXRhX2VuZCAtIGF2aW9fdGVsbChzLT5wYiksIDE4ICogMTI4KTsKKyAgICBpZiAoc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCitBVklucHV0Rm9ybWF0IGZmX2FmY19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhZmMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBRkMiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQUZDRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhZmNfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gYWZjX3JlYWRfcGFja2V0LAorICAgIC5leHRlbnNpb25zICAgICA9ICJhZmMiLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PQklOU0VBUkNIIHwgQVZGTVRfTk9HRU5TRUFSQ0ggfCBBVkZNVF9OT19CWVRFX1NFRUssCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2FpZmYuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9haWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3MDI1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9haWZmLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIEFJRkYvQUlGRi1DIG11eGVyL2RlbXV4ZXIgY29tbW9uIGhlYWRlcgorICogQ29weXJpZ2h0IChjKSAyMDA2ICBQYXRyaWNrIEd1aW1vbmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogY29tbW9uIGhlYWRlciBmb3IgQUlGRiBtdXhlciBhbmQgZGVtdXhlcgorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfQUlGRl9ICisjZGVmaW5lIEFWRk9STUFUX0FJRkZfSAorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgY29uc3QgQVZDb2RlY1RhZyBmZl9jb2RlY19haWZmX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMTZCRSwgICAgTUtUQUcoJ04nLCdPJywnTicsJ0UnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1M4LCAgICAgICBNS1RBRygnTicsJ08nLCdOJywnRScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fVTgsICAgICAgIE1LVEFHKCdyJywnYScsJ3cnLCcgJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMjRCRSwgICAgTUtUQUcoJ04nLCdPJywnTicsJ0UnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MzMkJFLCAgICBNS1RBRygnTicsJ08nLCdOJywnRScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjMyQkUsICAgIE1LVEFHKCdmJywnbCcsJzMnLCcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9GNjRCRSwgICAgTUtUQUcoJ2YnLCdsJywnNicsJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX0FMQVcsICAgICBNS1RBRygnYScsJ2wnLCdhJywndycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fTVVMQVcsICAgIE1LVEFHKCd1JywnbCcsJ2EnLCd3JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMjRCRSwgICAgTUtUQUcoJ2knLCduJywnMicsJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MzMkJFLCAgICBNS1RBRygnaScsJ24nLCczJywnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NQUNFMywgICAgICAgIE1LVEFHKCdNJywnQScsJ0MnLCczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BQ0U2LCAgICAgICAgTUtUQUcoJ00nLCdBJywnQycsJzYnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfR1NNLCAgICAgICAgICBNS1RBRygnRycsJ1MnLCdNJywnICcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9HNzIyLCAgIE1LVEFHKCdHJywnNycsJzInLCcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FEUENNX0c3MjZMRSwgTUtUQUcoJ0cnLCc3JywnMicsJzYnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MxNkJFLCAgICBNS1RBRygndCcsJ3cnLCdvJywncycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsICAgIE1LVEFHKCdzJywnbycsJ3cnLCd0JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVCwgTUtUQUcoJ2knLCdtJywnYScsJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUURNMiwgICAgICAgICBNS1RBRygnUScsJ0QnLCdNJywnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9RQ0VMUCwgICAgICAgIE1LVEFHKCdRJywnYycsJ2wnLCdwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX05PTkUsICAgICAgICAgMCB9LAorfTsKKworI2VuZGlmIC8qIEFWRk9STUFUX0FJRkZfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2FpZmZkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9haWZmZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlZjJhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9haWZmZGVjLmMKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBBSUZGL0FJRkYtQyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIFBhdHJpY2sgR3VpbW9uZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInBjbS5oIgorI2luY2x1ZGUgImFpZmYuaCIKKyNpbmNsdWRlICJpc29tLmgiCisjaW5jbHVkZSAiaWQzdjIuaCIKKyNpbmNsdWRlICJtb3ZfY2hhbi5oIgorCisjZGVmaW5lIEFJRkYgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUlGRl9DX1ZFUlNJT04xICAgICAgICAgMHhBMjgwNTE0MAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50NjRfdCBkYXRhX2VuZDsKKyAgICBpbnQgYmxvY2tfZHVyYXRpb247Cit9IEFJRkZJbnB1dENvbnRleHQ7CisKK3N0YXRpYyBlbnVtIEFWQ29kZWNJRCBhaWZmX2NvZGVjX2dldF9pZChpbnQgYnBzKQoreworICAgIGlmIChicHMgPD0gOCkKKyAgICAgICAgcmV0dXJuIEFWX0NPREVDX0lEX1BDTV9TODsKKyAgICBpZiAoYnBzIDw9IDE2KQorICAgICAgICByZXR1cm4gQVZfQ09ERUNfSURfUENNX1MxNkJFOworICAgIGlmIChicHMgPD0gMjQpCisgICAgICAgIHJldHVybiBBVl9DT0RFQ19JRF9QQ01fUzI0QkU7CisgICAgaWYgKGJwcyA8PSAzMikKKyAgICAgICAgcmV0dXJuIEFWX0NPREVDX0lEX1BDTV9TMzJCRTsKKworICAgIC8qIGJpZ2dlciB0aGFuIDMyIGlzbid0IGFsbG93ZWQgICovCisgICAgcmV0dXJuIEFWX0NPREVDX0lEX05PTkU7Cit9CisKKy8qIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZvdW5kIHRhZyAqLworc3RhdGljIGludCBnZXRfdGFnKEFWSU9Db250ZXh0ICpwYiwgdWludDMyX3QgKiB0YWcpCit7CisgICAgaW50IHNpemU7CisKKyAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgICp0YWcgPSBhdmlvX3JsMzIocGIpOworICAgIHNpemUgPSBhdmlvX3JiMzIocGIpOworCisgICAgaWYgKHNpemUgPCAwKQorICAgICAgICBzaXplID0gMHg3ZmZmZmZmZjsKKworICAgIHJldHVybiBzaXplOworfQorCisvKiBNZXRhZGF0YSBzdHJpbmcgcmVhZCAqLworc3RhdGljIHZvaWQgZ2V0X21ldGEoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICprZXksIGludCBzaXplKQoreworICAgIHVpbnQ4X3QgKnN0ciA9IGF2X21hbGxvYyhzaXplKzEpOworCisgICAgaWYgKHN0cikgeworICAgICAgICBpbnQgcmVzID0gYXZpb19yZWFkKHMtPnBiLCBzdHIsIHNpemUpOworICAgICAgICBpZiAocmVzIDwgMCl7CisgICAgICAgICAgICBhdl9mcmVlKHN0cik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSArPSAoc2l6ZSYxKS1yZXM7CisgICAgICAgIHN0cltyZXNdID0gMDsKKyAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBrZXksIHN0ciwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgIH1lbHNlCisgICAgICAgIHNpemUrPSBzaXplJjE7CisKKyAgICBhdmlvX3NraXAocy0+cGIsIHNpemUpOworfQorCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc291bmQgZGF0YSBmcmFtZXMgb3IgbmVnYXRpdmUgb24gZXJyb3IgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2FpZmZfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB2ZXJzaW9uKQoreworICAgIEFWSU9Db250ZXh0ICpwYiAgICAgICAgPSBzLT5wYjsKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQUlGRklucHV0Q29udGV4dCAqYWlmZiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgZXhwOworICAgIHVpbnQ2NF90IHZhbDsKKyAgICBkb3VibGUgc2FtcGxlX3JhdGU7CisgICAgdW5zaWduZWQgaW50IG51bV9mcmFtZXM7CisKKyAgICBpZiAoc2l6ZSAmIDEpCisgICAgICAgIHNpemUrKzsKKyAgICBjb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBjb2RlYy0+Y2hhbm5lbHMgPSBhdmlvX3JiMTYocGIpOworICAgIG51bV9mcmFtZXMgPSBhdmlvX3JiMzIocGIpOworICAgIGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JiMTYocGIpOworCisgICAgZXhwID0gYXZpb19yYjE2KHBiKTsKKyAgICB2YWwgPSBhdmlvX3JiNjQocGIpOworICAgIHNhbXBsZV9yYXRlID0gbGRleHAodmFsLCBleHAgLSAxNjM4MyAtIDYzKTsKKyAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKyAgICBzaXplIC09IDE4OworCisgICAgLyogZ2V0IGNvZGVjIGlkIGZvciBBSUZGLUMgKi8KKyAgICBpZiAodmVyc2lvbiA9PSBBSUZGX0NfVkVSU0lPTjEpIHsKKyAgICAgICAgY29kZWMtPmNvZGVjX3RhZyA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGNvZGVjLT5jb2RlY19pZCAgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYWlmZl90YWdzLCBjb2RlYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgc2l6ZSAtPSA0OworICAgIH0KKworICAgIGlmICh2ZXJzaW9uICE9IEFJRkZfQ19WRVJTSU9OMSB8fCBjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFKSB7CisgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IGFpZmZfY29kZWNfZ2V0X2lkKGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICBjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShjb2RlYy0+Y29kZWNfaWQpOworICAgICAgICBhaWZmLT5ibG9ja19kdXJhdGlvbiA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChjb2RlYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjMyQkU6CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NEJFOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRToKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fQUxBVzoKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc6CisgICAgICAgICAgICBhaWZmLT5ibG9ja19kdXJhdGlvbiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQ6CisgICAgICAgICAgICBjb2RlYy0+YmxvY2tfYWxpZ24gPSAzNCpjb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NQUNFMzoKKyAgICAgICAgICAgIGNvZGVjLT5ibG9ja19hbGlnbiA9IDIqY29kZWMtPmNoYW5uZWxzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRzcyNkxFOgorICAgICAgICAgICAgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDU7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRzcyMjoKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NQUNFNjoKKyAgICAgICAgICAgIGNvZGVjLT5ibG9ja19hbGlnbiA9IDEqY29kZWMtPmNoYW5uZWxzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfR1NNOgorICAgICAgICAgICAgY29kZWMtPmJsb2NrX2FsaWduID0gMzM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFpZmYtPmJsb2NrX2R1cmF0aW9uID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlYy0+YmxvY2tfYWxpZ24gPiAwKQorICAgICAgICAgICAgYWlmZi0+YmxvY2tfZHVyYXRpb24gPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy0+YmxvY2tfYWxpZ24pOworICAgIH0KKworICAgIC8qIEJsb2NrIGFsaWduIG5lZWRzIHRvIGJlIGNvbXB1dGVkIGluIGFsbCBjYXNlcywgYXMgdGhlIGRlZmluaXRpb24KKyAgICAgKiBpcyBzcGVjaWZpYyB0byBhcHBsaWNhdGlvbnMgLT4gaGVyZSB3ZSB1c2UgdGhlIFdBVkUgZm9ybWF0IGRlZmluaXRpb24gKi8KKyAgICBpZiAoIWNvZGVjLT5ibG9ja19hbGlnbikKKyAgICAgICAgY29kZWMtPmJsb2NrX2FsaWduID0gKGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoY29kZWMtPmNvZGVjX2lkKSAqIGNvZGVjLT5jaGFubmVscykgPj4gMzsKKworICAgIGlmIChhaWZmLT5ibG9ja19kdXJhdGlvbikgeworICAgICAgICBjb2RlYy0+Yml0X3JhdGUgPSBjb2RlYy0+c2FtcGxlX3JhdGUgKiAoY29kZWMtPmJsb2NrX2FsaWduIDw8IDMpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWlmZi0+YmxvY2tfZHVyYXRpb247CisgICAgfQorCisgICAgLyogQ2h1bmsgaXMgb3ZlciAqLworICAgIGlmIChzaXplKQorICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworCisgICAgcmV0dXJuIG51bV9mcmFtZXM7Cit9CisKK3N0YXRpYyBpbnQgYWlmZl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICAvKiBjaGVjayBmaWxlIGhlYWRlciAqLworICAgIGlmIChwLT5idWZbMF0gPT0gJ0YnICYmIHAtPmJ1ZlsxXSA9PSAnTycgJiYKKyAgICAgICAgcC0+YnVmWzJdID09ICdSJyAmJiBwLT5idWZbM10gPT0gJ00nICYmCisgICAgICAgIHAtPmJ1Zls4XSA9PSAnQScgJiYgcC0+YnVmWzldID09ICdJJyAmJgorICAgICAgICBwLT5idWZbMTBdID09ICdGJyAmJiAocC0+YnVmWzExXSA9PSAnRicgfHwgcC0+YnVmWzExXSA9PSAnQycpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworLyogYWlmZiBpbnB1dCAqLworc3RhdGljIGludCBhaWZmX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgcmV0LCBzaXplLCBmaWxlc2l6ZTsKKyAgICBpbnQ2NF90IG9mZnNldCA9IDAsIHBvc2l0aW9uOworICAgIHVpbnQzMl90IHRhZzsKKyAgICB1bnNpZ25lZCB2ZXJzaW9uID0gQUlGRl9DX1ZFUlNJT04xOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICogc3Q7CisgICAgQUlGRklucHV0Q29udGV4dCAqYWlmZiA9IHMtPnByaXZfZGF0YTsKKyAgICBJRDN2MkV4dHJhTWV0YSAqaWQzdjJfZXh0cmFfbWV0YSA9IE5VTEw7CisKKyAgICAvKiBjaGVjayBGT1JNIGhlYWRlciAqLworICAgIGZpbGVzaXplID0gZ2V0X3RhZyhwYiwgJnRhZyk7CisgICAgaWYgKGZpbGVzaXplIDwgMCB8fCB0YWcgIT0gTUtUQUcoJ0YnLCAnTycsICdSJywgJ00nKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiBBSUZGIGRhdGEgdHlwZSAqLworICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKHRhZyA9PSBNS1RBRygnQScsICdJJywgJ0YnLCAnRicpKSAgICAgICAvKiBHb3QgYW4gQUlGRiBmaWxlICovCisgICAgICAgIHZlcnNpb24gPSBBSUZGOworICAgIGVsc2UgaWYgKHRhZyAhPSBNS1RBRygnQScsICdJJywgJ0YnLCAnQycpKSAgLyogQW4gQUlGRi1DIGZpbGUgdGhlbiAqLworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGZpbGVzaXplIC09IDQ7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHdoaWxlIChmaWxlc2l6ZSA+IDApIHsKKyAgICAgICAgLyogcGFyc2UgZGlmZmVyZW50IGNodW5rcyAqLworICAgICAgICBzaXplID0gZ2V0X3RhZyhwYiwgJnRhZyk7CisgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBzaXplOworCisgICAgICAgIGZpbGVzaXplIC09IHNpemUgKyA4OworCisgICAgICAgIHN3aXRjaCAodGFnKSB7CisgICAgICAgIGNhc2UgTUtUQUcoJ0MnLCAnTycsICdNJywgJ00nKTogICAgIC8qIENvbW1vbiBjaHVuayAqLworICAgICAgICAgICAgLyogVGhlbiBmb3IgdGhlIGNvbXBsZXRlIGhlYWRlciBpbmZvICovCisgICAgICAgICAgICBzdC0+bmJfZnJhbWVzID0gZ2V0X2FpZmZfaGVhZGVyKHMsIHNpemUsIHZlcnNpb24pOworICAgICAgICAgICAgaWYgKHN0LT5uYl9mcmFtZXMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBzdC0+bmJfZnJhbWVzOworICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApIC8vIENPTU0gaXMgYWZ0ZXIgU1NORAorICAgICAgICAgICAgICAgIGdvdG8gZ290X3NvdW5kOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ0knLCAnRCcsICczJywgJyAnKToKKyAgICAgICAgICAgIHBvc2l0aW9uID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgICAgIGZmX2lkM3YyX3JlYWQocywgSUQzdjJfREVGQVVMVF9NQUdJQywgJmlkM3YyX2V4dHJhX21ldGEsIHNpemUpOworICAgICAgICAgICAgaWYgKGlkM3YyX2V4dHJhX21ldGEpCisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9pZDN2Ml9wYXJzZV9hcGljKHMsICZpZDN2Ml9leHRyYV9tZXRhKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZmX2lkM3YyX2ZyZWVfZXh0cmFfbWV0YSgmaWQzdjJfZXh0cmFfbWV0YSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZmZfaWQzdjJfZnJlZV9leHRyYV9tZXRhKCZpZDN2Ml9leHRyYV9tZXRhKTsKKyAgICAgICAgICAgIGlmIChwb3NpdGlvbiArIHNpemUgPiBhdmlvX3RlbGwocGIpKQorICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgcG9zaXRpb24gKyBzaXplIC0gYXZpb190ZWxsKHBiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnRicsICdWJywgJ0UnLCAnUicpOiAgICAgLyogVmVyc2lvbiBjaHVuayAqLworICAgICAgICAgICAgdmVyc2lvbiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnTicsICdBJywgJ00nLCAnRScpOiAgICAgLyogU2FtcGxlIG5hbWUgY2h1bmsgKi8KKyAgICAgICAgICAgIGdldF9tZXRhKHMsICJ0aXRsZSIgICAgLCBzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdBJywgJ1UnLCAnVCcsICdIJyk6ICAgICAvKiBBdXRob3IgY2h1bmsgKi8KKyAgICAgICAgICAgIGdldF9tZXRhKHMsICJhdXRob3IiICAgLCBzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCcoJywgJ2MnLCAnKScsICcgJyk6ICAgICAvKiBDb3B5cmlnaHQgY2h1bmsgKi8KKyAgICAgICAgICAgIGdldF9tZXRhKHMsICJjb3B5cmlnaHQiLCBzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdBJywgJ04nLCAnTicsICdPJyk6ICAgICAvKiBBbm5vdGF0aW9uIGNodW5rICovCisgICAgICAgICAgICBnZXRfbWV0YShzLCAiY29tbWVudCIgICwgc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnUycsICdTJywgJ04nLCAnRCcpOiAgICAgLyogU2FtcGxlZCBzb3VuZCBjaHVuayAqLworICAgICAgICAgICAgYWlmZi0+ZGF0YV9lbmQgPSBhdmlvX3RlbGwocGIpICsgc2l6ZTsKKyAgICAgICAgICAgIG9mZnNldCA9IGF2aW9fcmIzMihwYik7ICAgICAgLyogT2Zmc2V0IG9mIHNvdW5kIGRhdGEgKi8KKyAgICAgICAgICAgIGF2aW9fcmIzMihwYik7ICAgICAgICAgICAgICAgLyogQmxvY2tTaXplLi4uIGRvbid0IGNhcmUgKi8KKyAgICAgICAgICAgIG9mZnNldCArPSBhdmlvX3RlbGwocGIpOyAgICAvKiBDb21wdXRlIGFic29sdXRlIGRhdGEgb2Zmc2V0ICovCisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5ibG9ja19hbGlnbiAmJiAhcGItPnNlZWthYmxlKSAgICAvKiBBc3N1bWUgQ09NTSBhbHJlYWR5IHBhcnNlZCAqLworICAgICAgICAgICAgICAgIGdvdG8gZ290X3NvdW5kOworICAgICAgICAgICAgaWYgKCFwYi0+c2Vla2FibGUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZmlsZSBpcyBub3Qgc2Vla2FibGVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSAtIDgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ3cnLCAnYScsICd2JywgJ2UnKToKKyAgICAgICAgICAgIGlmICgodWludDY0X3Qpc2l6ZSA+ICgxPDwzMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE0yICYmIHNpemU+PTEyKjQgJiYgIXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gQVZfUkIzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSsxMSo0KTsKKyAgICAgICAgICAgICAgICBhaWZmLT5ibG9ja19kdXJhdGlvbiA9IEFWX1JCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGErOSo0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RQ0VMUCkgeworICAgICAgICAgICAgICAgIGNoYXIgcmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gMjUpCisgICAgICAgICAgICAgICAgICAgIHJhdGUgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YVsyNF07CisgICAgICAgICAgICAgICAgc3dpdGNoIChyYXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnSCc6IC8vIFJBVEVfSEFMRgorICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMTc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0YnOiAvLyBSQVRFX0ZVTEwKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMzU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFpZmYtPmJsb2NrX2R1cmF0aW9uID0gMTYwOworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICogKHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPDwgMykgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWZmLT5ibG9ja19kdXJhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdDJywnSCcsJ0EnLCdOJyk6CisgICAgICAgICAgICBpZihmZl9tb3ZfcmVhZF9jaGFuKHMsIHBiLCBzdCwgc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8qIEp1bXAgKi8KKyAgICAgICAgICAgIGlmIChzaXplICYgMSkgICAvKiBBbHdheXMgZXZlbiBhbGlnbmVkICovCisgICAgICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgfQorICAgIH0KKworZ290X3NvdW5kOgorICAgIGlmICghc3QtPmNvZGVjLT5ibG9ja19hbGlnbikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IGZpbmQgQ09NTSB0YWcgb3IgaW52YWxpZCBibG9ja19hbGlnbiB2YWx1ZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBOb3cgcG9zaXRpb25lZCwgZ2V0IHRoZSBzb3VuZCBkYXRhIHN0YXJ0IGFuZCBlbmQgKi8KKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOworICAgIHN0LT5kdXJhdGlvbiA9IHN0LT5uYl9mcmFtZXMgKiBhaWZmLT5ibG9ja19kdXJhdGlvbjsKKworICAgIC8qIFBvc2l0aW9uIHRoZSBzdHJlYW0gYXQgdGhlIGZpcnN0IGJsb2NrICovCisgICAgYXZpb19zZWVrKHBiLCBvZmZzZXQsIFNFRUtfU0VUKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9TSVpFIDQwOTYKKworc3RhdGljIGludCBhaWZmX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgQUlGRklucHV0Q29udGV4dCAqYWlmZiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IG1heF9zaXplOworICAgIGludCByZXMsIHNpemU7CisKKyAgICAvKiBjYWxjdWxhdGUgc2l6ZSBvZiByZW1haW5pbmcgZGF0YSAqLworICAgIG1heF9zaXplID0gYWlmZi0+ZGF0YV9lbmQgLSBhdmlvX3RlbGwocy0+cGIpOworICAgIGlmIChtYXhfc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICAvKiBOb3cgZm9yIHRoYXQgcGFja2V0ICovCisgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQ6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9HU006CisgICAgY2FzZSBBVl9DT0RFQ19JRF9RRE0yOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUUNFTFA6CisgICAgICAgIHNpemUgPSBzdC0+Y29kZWMtPmJsb2NrX2FsaWduOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzaXplID0gKE1BWF9TSVpFIC8gc3QtPmNvZGVjLT5ibG9ja19hbGlnbikgKiBzdC0+Y29kZWMtPmJsb2NrX2FsaWduOworICAgIH0KKyAgICBzaXplID0gRkZNSU4obWF4X3NpemUsIHNpemUpOworICAgIHJlcyA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICBpZiAoc2l6ZSA+PSBzdC0+Y29kZWMtPmJsb2NrX2FsaWduKQorICAgICAgICBwa3QtPmZsYWdzICY9IH5BVl9QS1RfRkxBR19DT1JSVVBUOworICAgIC8qIE9ubHkgb25lIHN0cmVhbSBpbiBhbiBBSUZGIGZpbGUgKi8KKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcGt0LT5kdXJhdGlvbiAgICAgPSAocmVzIC8gc3QtPmNvZGVjLT5ibG9ja19hbGlnbikgKiBhaWZmLT5ibG9ja19kdXJhdGlvbjsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9haWZmX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFpZmYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdWRpbyBJRkYiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQUlGRklucHV0Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gYWlmZl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhaWZmX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGFpZmZfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlayAgICAgID0gZmZfcGNtX3JlYWRfc2VlaywKKyAgICAuY29kZWNfdGFnICAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyogY29uc3QgW10peyBmZl9jb2RlY19haWZmX3RhZ3MsIDAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYWlmZmVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FpZmZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGZjNDMzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FpZmZlbmMuYwpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqIEFJRkYvQUlGRi1DIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIFBhdHJpY2sgR3VpbW9uZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImFpZmYuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaXNvbS5oIgorI2luY2x1ZGUgImlkM3YyLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQ2NF90IGZvcm07CisgICAgaW50NjRfdCBmcmFtZXM7CisgICAgaW50NjRfdCBzc25kOworICAgIGludCBhdWRpb19zdHJlYW1faWR4OworICAgIEFWUGFja2V0TGlzdCAqcGljdF9saXN0OworICAgIGludCB3cml0ZV9pZDN2MjsKKyAgICBpbnQgaWQzdjJfdmVyc2lvbjsKK30gQUlGRk91dHB1dENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcHV0X2lkM3YyX3RhZ3MoQVZGb3JtYXRDb250ZXh0ICpzLCBBSUZGT3V0cHV0Q29udGV4dCAqYWlmZikKK3sKKyAgICBpbnQgcmV0OworICAgIHVpbnQ2NF90IHBvcywgZW5kLCBzaXplOworICAgIElEM3YyRW5jQ29udGV4dCBpZDN2MiA9IHsgMCB9OworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWUGFja2V0TGlzdCAqcGljdF9saXN0ID0gYWlmZi0+cGljdF9saXN0OworCisgICAgaWYgKCFwYi0+c2Vla2FibGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFzLT5tZXRhZGF0YSAmJiAhYWlmZi0+cGljdF9saXN0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF2aW9fd2wzMihwYiwgTUtUQUcoJ0knLCAnRCcsICczJywgJyAnKSk7CisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgZmZfaWQzdjJfc3RhcnQoJmlkM3YyLCBwYiwgYWlmZi0+aWQzdjJfdmVyc2lvbiwgSUQzdjJfREVGQVVMVF9NQUdJQyk7CisgICAgZmZfaWQzdjJfd3JpdGVfbWV0YWRhdGEocywgJmlkM3YyKTsKKyAgICB3aGlsZSAocGljdF9saXN0KSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfaWQzdjJfd3JpdGVfYXBpYyhzLCAmaWQzdjIsICZwaWN0X2xpc3QtPnBrdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHBpY3RfbGlzdCA9IHBpY3RfbGlzdC0+bmV4dDsKKyAgICB9CisgICAgZmZfaWQzdjJfZmluaXNoKCZpZDN2MiwgcGIsIHMtPm1ldGFkYXRhX2hlYWRlcl9wYWRkaW5nKTsKKworICAgIGVuZCA9IGF2aW9fdGVsbChwYik7CisgICAgc2l6ZSA9IGVuZCAtIHBvczsKKworICAgIC8qIFVwZGF0ZSBjaHVuayBzaXplICovCisgICAgYXZpb19zZWVrKHBiLCBwb3MgLSA0LCBTRUVLX1NFVCk7CisgICAgYXZpb193YjMyKHBiLCBzaXplKTsKKyAgICBhdmlvX3NlZWsocGIsIGVuZCwgU0VFS19TRVQpOworCisgICAgaWYgKHNpemUgJiAxKQorICAgICAgICBhdmlvX3c4KHBiLCAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdXRfbWV0YShBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKmtleSwgdWludDMyX3QgaWQpCit7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnRhZzsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKworICAgIGlmICh0YWcgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwga2V5LCBOVUxMLCAwKSkgeworICAgICAgICBpbnQgc2l6ZSA9IHN0cmxlbih0YWctPnZhbHVlKTsKKworICAgICAgICBhdmlvX3dsMzIocGIsIGlkKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBGRkFMSUdOKHNpemUsIDIpKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgdGFnLT52YWx1ZSwgc2l6ZSk7CisgICAgICAgIGlmIChzaXplICYgMSkKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIDApOworICAgIH0KK30KKworc3RhdGljIGludCBhaWZmX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQUlGRk91dHB1dENvbnRleHQgKmFpZmYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYzsKKyAgICB1aW50NjRfdCBzYW1wbGVfcmF0ZTsKKyAgICBpbnQgaSwgYWlmYyA9IDA7CisKKyAgICBhaWZmLT5hdWRpb19zdHJlYW1faWR4ID0gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoYWlmZi0+YXVkaW9fc3RyZWFtX2lkeCA8IDAgJiYgc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgYWlmZi0+YXVkaW9fc3RyZWFtX2lkeCA9IGk7CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk9ubHkgYXVkaW8gc3RyZWFtcyBhbmQgcGljdHVyZXMgYXJlIGFsbG93ZWQgaW4gQUlGRi5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYWlmZi0+YXVkaW9fc3RyZWFtX2lkeCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vIGF1ZGlvIHN0cmVhbSBwcmVzZW50LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZW5jID0gcy0+c3RyZWFtc1thaWZmLT5hdWRpb19zdHJlYW1faWR4XS0+Y29kZWM7CisKKyAgICAvKiBGaXJzdCB2ZXJpZnkgaWYgZm9ybWF0IGlzIG9rICovCisgICAgaWYgKCFlbmMtPmNvZGVjX3RhZykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChlbmMtPmNvZGVjX3RhZyAhPSBNS1RBRygnTicsJ08nLCdOJywnRScpKQorICAgICAgICBhaWZjID0gMTsKKworICAgIC8qIEZPUk0gQUlGRiBoZWFkZXIgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJGT1JNIik7CisgICAgYWlmZi0+Zm9ybSA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgICAgICAgICAgIC8qIGZpbGUgbGVuZ3RoICovCisgICAgZmZpb193Zm91cmNjKHBiLCBhaWZjID8gIkFJRkMiIDogIkFJRkYiKTsKKworICAgIGlmIChhaWZjKSB7IC8vIGNvbXByZXNzZWQgYXVkaW8KKyAgICAgICAgaWYgKCFlbmMtPmJsb2NrX2FsaWduKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiYmxvY2sgYWxpZ24gbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgLyogVmVyc2lvbiBjaHVuayAqLworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJGVkVSIik7CisgICAgICAgIGF2aW9fd2IzMihwYiwgNCk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgMHhBMjgwNTE0MCk7CisgICAgfQorCisgICAgaWYgKGVuYy0+Y2hhbm5lbHMgPiAyICYmIGVuYy0+Y2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiQ0hBTiIpOworICAgICAgICBhdmlvX3diMzIocGIsIDEyKTsKKyAgICAgICAgZmZfbW92X3dyaXRlX2NoYW4ocGIsIGVuYy0+Y2hhbm5lbF9sYXlvdXQpOworICAgIH0KKworICAgIHB1dF9tZXRhKHMsICJ0aXRsZSIsICAgICBNS1RBRygnTicsICdBJywgJ00nLCAnRScpKTsKKyAgICBwdXRfbWV0YShzLCAiYXV0aG9yIiwgICAgTUtUQUcoJ0EnLCAnVScsICdUJywgJ0gnKSk7CisgICAgcHV0X21ldGEocywgImNvcHlyaWdodCIsIE1LVEFHKCcoJywgJ2MnLCAnKScsICcgJykpOworICAgIHB1dF9tZXRhKHMsICJjb21tZW50IiwgICBNS1RBRygnQScsICdOJywgJ04nLCAnTycpKTsKKworICAgIC8qIENvbW1vbiBjaHVuayAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkNPTU0iKTsKKyAgICBhdmlvX3diMzIocGIsIGFpZmMgPyAyNCA6IDE4KTsgLyogc2l6ZSAqLworICAgIGF2aW9fd2IxNihwYiwgZW5jLT5jaGFubmVscyk7ICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKworICAgIGFpZmYtPmZyYW1lcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKworICAgIGlmICghZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpCisgICAgICAgIGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShlbmMtPmNvZGVjX2lkKTsKKyAgICBpZiAoIWVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgY29tcHV0ZSBiaXRzIHBlciBzYW1wbGVcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghZW5jLT5ibG9ja19hbGlnbikKKyAgICAgICAgZW5jLT5ibG9ja19hbGlnbiA9IChlbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqIGVuYy0+Y2hhbm5lbHMpID4+IDM7CisKKyAgICBhdmlvX3diMTYocGIsIGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsgLyogU2FtcGxlIHNpemUgKi8KKworICAgIHNhbXBsZV9yYXRlID0gYXZfZG91YmxlMmludChlbmMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdmlvX3diMTYocGIsIChzYW1wbGVfcmF0ZSA+PiA1MikgKyAoMTYzODMgLSAxMDIzKSk7CisgICAgYXZpb193YjY0KHBiLCBVSU5UNjRfQygxKSA8PCA2MyB8IHNhbXBsZV9yYXRlIDw8IDExKTsKKworICAgIGlmIChhaWZjKSB7CisgICAgICAgIGF2aW9fd2wzMihwYiwgZW5jLT5jb2RlY190YWcpOworICAgICAgICBhdmlvX3diMTYocGIsIDApOworICAgIH0KKworICAgIGlmIChlbmMtPmNvZGVjX3RhZyA9PSBNS1RBRygnUScsJ0QnLCdNJywnMicpICYmIGVuYy0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAid2F2ZSIpOworICAgICAgICBhdmlvX3diMzIocGIsIGVuYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCBlbmMtPmV4dHJhZGF0YSwgZW5jLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgfQorCisgICAgLyogU291bmQgZGF0YSBjaHVuayAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIlNTTkQiKTsKKyAgICBhaWZmLT5zc25kID0gYXZpb190ZWxsKHBiKTsgICAgICAgICAvKiBTb3VuZCBjaHVuayBzaXplICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgICAgICAgICAgIC8qIFNvdW5kIHNhbXBsZXMgZGF0YSBzaXplICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgb2Zmc2V0ICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrLXNpemUgKGJsb2NrIGFsaWduKSAqLworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzLT5zdHJlYW1zW2FpZmYtPmF1ZGlvX3N0cmVhbV9pZHhdLCA2NCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbYWlmZi0+YXVkaW9fc3RyZWFtX2lkeF0tPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKKyAgICAvKiBEYXRhIGlzIHN0YXJ0aW5nIGhlcmUgKi8KKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpZmZfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBSUZGT3V0cHV0Q29udGV4dCAqYWlmZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpZiAocGt0LT5zdHJlYW1faW5kZXggPT0gYWlmZi0+YXVkaW9fc3RyZWFtX2lkeCkKKyAgICAgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIGVsc2UgeworICAgICAgICBpbnQgcmV0OworICAgICAgICBBVlBhY2tldExpc3QgKnBpY3RfbGlzdCwgKmxhc3Q7CisKKyAgICAgICAgaWYgKHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAvKiB3YXJuIG9ubHkgb25jZSBmb3IgZWFjaCBzdHJlYW0gKi8KKyAgICAgICAgaWYgKHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5uYl9mcmFtZXMgPT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiR290IG1vcmUgdGhhbiBvbmUgcGljdHVyZSBpbiBzdHJlYW0gJWQsIgorICAgICAgICAgICAgICAgICAgICIgaWdub3JpbmcuXG4iLCBwa3QtPnN0cmVhbV9pbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5uYl9mcmFtZXMgPj0gMSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHBpY3RfbGlzdCA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWUGFja2V0TGlzdCkpOworICAgICAgICBpZiAoIXBpY3RfbGlzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgaWYgKChyZXQgPSBhdl9jb3B5X3BhY2tldCgmcGljdF9saXN0LT5wa3QsIHBrdCkpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnBpY3RfbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhaWZmLT5waWN0X2xpc3QpCisgICAgICAgICAgICBhaWZmLT5waWN0X2xpc3QgPSBwaWN0X2xpc3Q7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbGFzdCA9IGFpZmYtPnBpY3RfbGlzdDsKKyAgICAgICAgICAgIHdoaWxlIChsYXN0LT5uZXh0KQorICAgICAgICAgICAgICAgIGxhc3QgPSBsYXN0LT5uZXh0OworICAgICAgICAgICAgbGFzdC0+bmV4dCA9IHBpY3RfbGlzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpZmZfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IHJldDsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBSUZGT3V0cHV0Q29udGV4dCAqYWlmZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlBhY2tldExpc3QgKnBpY3RfbGlzdCA9IGFpZmYtPnBpY3RfbGlzdDsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1thaWZmLT5hdWRpb19zdHJlYW1faWR4XS0+Y29kZWM7CisKKyAgICAvKiBDaHVua3Mgc2l6ZXMgbXVzdCBiZSBldmVuICovCisgICAgaW50NjRfdCBmaWxlX3NpemUsIGVuZF9zaXplOworICAgIGVuZF9zaXplID0gZmlsZV9zaXplID0gYXZpb190ZWxsKHBiKTsKKyAgICBpZiAoZmlsZV9zaXplICYgMSkgeworICAgICAgICBhdmlvX3c4KHBiLCAwKTsKKyAgICAgICAgZW5kX3NpemUrKzsKKyAgICB9CisKKyAgICBpZiAocy0+cGItPnNlZWthYmxlKSB7CisgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGUgZnJhbWVzICovCisgICAgICAgIGF2aW9fc2VlayhwYiwgYWlmZi0+ZnJhbWVzLCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgKGZpbGVfc2l6ZS1haWZmLT5zc25kLTEyKS9lbmMtPmJsb2NrX2FsaWduKTsKKworICAgICAgICAvKiBTb3VuZCBEYXRhIGNodW5rIHNpemUgKi8KKyAgICAgICAgYXZpb19zZWVrKHBiLCBhaWZmLT5zc25kLCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgZmlsZV9zaXplIC0gYWlmZi0+c3NuZCAtIDQpOworCisgICAgICAgIC8qIHJldHVybiB0byB0aGUgZW5kICovCisgICAgICAgIGF2aW9fc2VlayhwYiwgZW5kX3NpemUsIFNFRUtfU0VUKTsKKworICAgICAgICAvKiBXcml0ZSBJRDMgdGFncyAqLworICAgICAgICBpZiAoYWlmZi0+d3JpdGVfaWQzdjIpCisgICAgICAgICAgICBpZiAoKHJldCA9IHB1dF9pZDN2Ml90YWdzKHMsIGFpZmYpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAvKiBGaWxlIGxlbmd0aCAqLworICAgICAgICBmaWxlX3NpemUgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBhdmlvX3NlZWsocGIsIGFpZmYtPmZvcm0sIFNFRUtfU0VUKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBmaWxlX3NpemUgLSBhaWZmLT5mb3JtIC0gNCk7CisKKyAgICAgICAgYXZpb19mbHVzaChwYik7CisgICAgfQorCisgICAgd2hpbGUgKHBpY3RfbGlzdCkgeworICAgICAgICBBVlBhY2tldExpc3QgKm5leHQgPSBwaWN0X2xpc3QtPm5leHQ7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZwaWN0X2xpc3QtPnBrdCk7CisgICAgICAgIGF2X2ZyZWVwKCZwaWN0X2xpc3QpOworICAgICAgICBwaWN0X2xpc3QgPSBuZXh0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBSUZGT3V0cHV0Q29udGV4dCwgeCkKKyNkZWZpbmUgRU5DIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgIndyaXRlX2lkM3YyIiwgIkVuYWJsZSBJRDMgdGFncyB3cml0aW5nLiIsCisgICAgICBPRkZTRVQod3JpdGVfaWQzdjIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIEVOQyB9LAorICAgIHsgImlkM3YyX3ZlcnNpb24iLCAiU2VsZWN0IElEM3YyIHZlcnNpb24gdG8gd3JpdGUuIEN1cnJlbnRseSAzIGFuZCA0IGFyZSBzdXBwb3J0ZWQuIiwKKyAgICAgIE9GRlNFVChpZDN2Ml92ZXJzaW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDR9LCAzLCA0LCBFTkMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGFpZmZfbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgICAgID0gIkFJRkYgbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgICAgICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfYWlmZl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAiYWlmZiIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkF1ZGlvIElGRiIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhdWRpby9haWZmIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAiYWlmLGFpZmYsYWZjLGFpZmMiLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihBSUZGT3V0cHV0Q29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkJFLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1BORywKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBhaWZmX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBhaWZmX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBhaWZmX3dyaXRlX3RyYWlsZXIsCisgICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgZmZfY29kZWNfYWlmZl90YWdzLCAwIH0sCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJmFpZmZfbXV4ZXJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2FsbGZvcm1hdHMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hbGxmb3JtYXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhYWI1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hbGxmb3JtYXRzLmMKQEAgLTAsMCArMSwzOTEgQEAKKy8qCisgKiBSZWdpc3RlciBhbGwgdGhlIGZvcm1hdHMgYW5kIHByb3RvY29scworICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJydHAuaCIKKyNpbmNsdWRlICJyZHQuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNkZWZpbmUgUkVHSVNURVJfTVVYRVIoWCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmXyMjeCMjX211eGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKENPTkZJR18jI1gjI19NVVhFUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2X3JlZ2lzdGVyX291dHB1dF9mb3JtYXQoJmZmXyMjeCMjX211eGVyKTsgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgUkVHSVNURVJfREVNVVhFUihYLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZXh0ZXJuIEFWSW5wdXRGb3JtYXQgZmZfIyN4IyNfZGVtdXhlcjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKENPTkZJR18jI1gjI19ERU1VWEVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2X3JlZ2lzdGVyX2lucHV0X2Zvcm1hdCgmZmZfIyN4IyNfZGVtdXhlcik7ICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgUkVHSVNURVJfTVVYREVNVVgoWCwgeCkgUkVHSVNURVJfTVVYRVIoWCwgeCk7IFJFR0lTVEVSX0RFTVVYRVIoWCwgeCkKKworI2RlZmluZSBSRUdJU1RFUl9QUk9UT0NPTChYLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBleHRlcm4gVVJMUHJvdG9jb2wgZmZfIyN4IyNfcHJvdG9jb2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoQ09ORklHXyMjWCMjX1BST1RPQ09MKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmZ1cmxfcmVnaXN0ZXJfcHJvdG9jb2woJmZmXyMjeCMjX3Byb3RvY29sKTsgICAgICAgICAgICAgICAgXAorICAgIH0KKwordm9pZCBhdl9yZWdpc3Rlcl9hbGwodm9pZCkKK3sKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkOworCisgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisgICAgaW5pdGlhbGl6ZWQgPSAxOworCisgICAgYXZjb2RlY19yZWdpc3Rlcl9hbGwoKTsKKworICAgIC8qIChkZSltdXhlcnMgKi8KKyAgICBSRUdJU1RFUl9NVVhFUiAgIChBNjQsICAgICAgICAgICAgICBhNjQpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFBQywgICAgICAgICAgICAgIGFhYyk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoQUMzLCAgICAgICAgICAgICAgYWMzKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChBQ1QsICAgICAgICAgICAgICBhY3QpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFERiwgICAgICAgICAgICAgIGFkZik7CisgICAgUkVHSVNURVJfREVNVVhFUiAoQURQLCAgICAgICAgICAgICAgYWRwKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChBRFRTLCAgICAgICAgICAgICBhZHRzKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChBRFgsICAgICAgICAgICAgICBhZHgpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFFQSwgICAgICAgICAgICAgIGFlYSk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoQUZDLCAgICAgICAgICAgICAgYWZjKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChBSUZGLCAgICAgICAgICAgICBhaWZmKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChBTVIsICAgICAgICAgICAgICBhbXIpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFOTSwgICAgICAgICAgICAgIGFubSk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoQVBDLCAgICAgICAgICAgICAgYXBjKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChBUEUsICAgICAgICAgICAgICBhcGUpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFQTkcsICAgICAgICAgICAgIGFwbmcpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFRVElUTEUsICAgICAgICAgIGFxdGl0bGUpOworICAgIFJFR0lTVEVSX01VWERFTVVYKEFTRiwgICAgICAgICAgICAgIGFzZik7CisgICAgUkVHSVNURVJfTVVYREVNVVgoQVNTLCAgICAgICAgICAgICAgYXNzKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChBU1QsICAgICAgICAgICAgICBhc3QpOworICAgIFJFR0lTVEVSX01VWEVSICAgKEFTRl9TVFJFQU0sICAgICAgIGFzZl9zdHJlYW0pOworICAgIFJFR0lTVEVSX01VWERFTVVYKEFVLCAgICAgICAgICAgICAgIGF1KTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChBVkksICAgICAgICAgICAgICBhdmkpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFWSVNZTlRILCAgICAgICAgIGF2aXN5bnRoKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChBVk0yLCAgICAgICAgICAgICBhdm0yKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChBVlIsICAgICAgICAgICAgICBhdnIpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFWUywgICAgICAgICAgICAgIGF2cyk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoQkVUSFNPRlRWSUQsICAgICAgYmV0aHNvZnR2aWQpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEJGSSwgICAgICAgICAgICAgIGJmaSk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoQklOVEVYVCwgICAgICAgICAgYmludGV4dCk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoQklOSywgICAgICAgICAgICAgYmluayk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoQklULCAgICAgICAgICAgICAgYml0KTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChCTVYsICAgICAgICAgICAgICBibXYpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEJSU1RNLCAgICAgICAgICAgIGJyc3RtKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChCT0EsICAgICAgICAgICAgICBib2EpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEM5MywgICAgICAgICAgICAgIGM5Myk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoQ0FGLCAgICAgICAgICAgICAgY2FmKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChDQVZTVklERU8sICAgICAgICBjYXZzdmlkZW8pOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKENERywgICAgICAgICAgICAgIGNkZyk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoQ0RYTCwgICAgICAgICAgICAgY2R4bCk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoQ0lORSwgICAgICAgICAgICAgY2luZSk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoQ09OQ0FULCAgICAgICAgICAgY29uY2F0KTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChDUkMsICAgICAgICAgICAgICBjcmMpOworICAgIFJFR0lTVEVSX01VWEVSICAgKERBU0gsICAgICAgICAgICAgIGRhc2gpOworICAgIFJFR0lTVEVSX01VWERFTVVYKERBVEEsICAgICAgICAgICAgIGRhdGEpOworICAgIFJFR0lTVEVSX01VWERFTVVYKERBVUQsICAgICAgICAgICAgIGRhdWQpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKERGQSwgICAgICAgICAgICAgIGRmYSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoRElSQUMsICAgICAgICAgICAgZGlyYWMpOworICAgIFJFR0lTVEVSX01VWERFTVVYKEROWEhELCAgICAgICAgICAgIGRueGhkKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChEU0YsICAgICAgICAgICAgICBkc2YpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKERTSUNJTiwgICAgICAgICAgIGRzaWNpbik7CisgICAgUkVHSVNURVJfTVVYREVNVVgoRFRTLCAgICAgICAgICAgICAgZHRzKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChEVFNIRCwgICAgICAgICAgICBkdHNoZCk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoRFYsICAgICAgICAgICAgICAgZHYpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKERYQSwgICAgICAgICAgICAgIGR4YSk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoRUEsICAgICAgICAgICAgICAgZWEpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEVBX0NEQVRBLCAgICAgICAgIGVhX2NkYXRhKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChFQUMzLCAgICAgICAgICAgICBlYWMzKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChFUEFGLCAgICAgICAgICAgICBlcGFmKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChGNFYsICAgICAgICAgICAgICBmNHYpOworICAgIFJFR0lTVEVSX01VWERFTVVYKEZGTSwgICAgICAgICAgICAgIGZmbSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoRkZNRVRBREFUQSwgICAgICAgZmZtZXRhZGF0YSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoRklMTVNUUklQLCAgICAgICAgZmlsbXN0cmlwKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChGTEFDLCAgICAgICAgICAgICBmbGFjKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChGTElDLCAgICAgICAgICAgICBmbGljKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChGTFYsICAgICAgICAgICAgICBmbHYpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKExJVkVfRkxWLCAgICAgICAgIGxpdmVfZmx2KTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChGT1VSWE0sICAgICAgICAgICBmb3VyeG0pOworICAgIFJFR0lTVEVSX01VWEVSICAgKEZSQU1FQ1JDLCAgICAgICAgIGZyYW1lY3JjKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChGUkFNRU1ENSwgICAgICAgICBmcmFtZW1kNSk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoRlJNLCAgICAgICAgICAgICAgZnJtKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChHNzIyLCAgICAgICAgICAgICBnNzIyKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChHNzIzXzEsICAgICAgICAgICBnNzIzXzEpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKEc3MjksICAgICAgICAgICAgIGc3MjkpOworICAgIFJFR0lTVEVSX01VWERFTVVYKEdJRiwgICAgICAgICAgICAgIGdpZik7CisgICAgUkVHSVNURVJfREVNVVhFUiAoR1NNLCAgICAgICAgICAgICAgZ3NtKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChHWEYsICAgICAgICAgICAgICBneGYpOworICAgIFJFR0lTVEVSX01VWERFTVVYKEgyNjEsICAgICAgICAgICAgIGgyNjEpOworICAgIFJFR0lTVEVSX01VWERFTVVYKEgyNjMsICAgICAgICAgICAgIGgyNjMpOworICAgIFJFR0lTVEVSX01VWERFTVVYKEgyNjQsICAgICAgICAgICAgIGgyNjQpOworICAgIFJFR0lTVEVSX01VWEVSICAgKEhEUywgICAgICAgICAgICAgIGhkcyk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoSEVWQywgICAgICAgICAgICAgaGV2Yyk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoSExTLCAgICAgICAgICAgICAgaGxzKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChITk0sICAgICAgICAgICAgICBobm0pOworICAgIFJFR0lTVEVSX01VWERFTVVYKElDTywgICAgICAgICAgICAgIGljbyk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoSURDSU4sICAgICAgICAgICAgaWRjaW4pOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKElERiwgICAgICAgICAgICAgIGlkZik7CisgICAgUkVHSVNURVJfREVNVVhFUiAoSUZGLCAgICAgICAgICAgICAgaWZmKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChJTEJDLCAgICAgICAgICAgICBpbGJjKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChJTUFHRTIsICAgICAgICAgICBpbWFnZTIpOworICAgIFJFR0lTVEVSX01VWERFTVVYKElNQUdFMlBJUEUsICAgICAgIGltYWdlMnBpcGUpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKElNQUdFMl9BTElBU19QSVgsIGltYWdlMl9hbGlhc19waXgpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKElNQUdFMl9CUkVOREVSX1BJWCwgaW1hZ2UyX2JyZW5kZXJfcGl4KTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChJTkdFTklFTlQsICAgICAgICBpbmdlbmllbnQpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKElQTU9WSUUsICAgICAgICAgIGlwbW92aWUpOworICAgIFJFR0lTVEVSX01VWEVSICAgKElQT0QsICAgICAgICAgICAgIGlwb2QpOworICAgIFJFR0lTVEVSX01VWERFTVVYKElSQ0FNLCAgICAgICAgICAgIGlyY2FtKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChJU01WLCAgICAgICAgICAgICBpc212KTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChJU1MsICAgICAgICAgICAgICBpc3MpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKElWOCwgICAgICAgICAgICAgIGl2OCk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoSVZGLCAgICAgICAgICAgICAgaXZmKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChKQUNPU1VCLCAgICAgICAgICBqYWNvc3ViKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChKViwgICAgICAgICAgICAgICBqdik7CisgICAgUkVHSVNURVJfTVVYREVNVVgoTEFUTSwgICAgICAgICAgICAgbGF0bSk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoTE1MTTQsICAgICAgICAgICAgbG1sbTQpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKExPQVMsICAgICAgICAgICAgIGxvYXMpOworICAgIFJFR0lTVEVSX01VWERFTVVYKExSQywgICAgICAgICAgICAgIGxyYyk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoTFZGLCAgICAgICAgICAgICAgbHZmKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChMWEYsICAgICAgICAgICAgICBseGYpOworICAgIFJFR0lTVEVSX01VWERFTVVYKE00ViwgICAgICAgICAgICAgIG00dik7CisgICAgUkVHSVNURVJfTVVYRVIgICAoTUQ1LCAgICAgICAgICAgICAgbWQ1KTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChNQVRST1NLQSwgICAgICAgICBtYXRyb3NrYSk7CisgICAgUkVHSVNURVJfTVVYRVIgICAoTUFUUk9TS0FfQVVESU8sICAgbWF0cm9za2FfYXVkaW8pOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKE1HU1RTLCAgICAgICAgICAgIG1nc3RzKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChNSUNST0RWRCwgICAgICAgICBtaWNyb2R2ZCk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoTUpQRUcsICAgICAgICAgICAgbWpwZWcpOworICAgIFJFR0lTVEVSX01VWERFTVVYKE1MUCwgICAgICAgICAgICAgIG1scCk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoTUxWLCAgICAgICAgICAgICAgbWx2KTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChNTSwgICAgICAgICAgICAgICBtbSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoTU1GLCAgICAgICAgICAgICAgbW1mKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChNT1YsICAgICAgICAgICAgICBtb3YpOworICAgIFJFR0lTVEVSX01VWEVSICAgKE1QMiwgICAgICAgICAgICAgIG1wMik7CisgICAgUkVHSVNURVJfTVVYREVNVVgoTVAzLCAgICAgICAgICAgICAgbXAzKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChNUDQsICAgICAgICAgICAgICBtcDQpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKE1QQywgICAgICAgICAgICAgIG1wYyk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoTVBDOCwgICAgICAgICAgICAgbXBjOCk7CisgICAgUkVHSVNURVJfTVVYRVIgICAoTVBFRzFTWVNURU0sICAgICAgbXBlZzFzeXN0ZW0pOworICAgIFJFR0lTVEVSX01VWEVSICAgKE1QRUcxVkNELCAgICAgICAgIG1wZWcxdmNkKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChNUEVHMVZJREVPLCAgICAgICBtcGVnMXZpZGVvKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChNUEVHMkRWRCwgICAgICAgICBtcGVnMmR2ZCk7CisgICAgUkVHSVNURVJfTVVYRVIgICAoTVBFRzJTVkNELCAgICAgICAgbXBlZzJzdmNkKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChNUEVHMlZJREVPLCAgICAgICBtcGVnMnZpZGVvKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChNUEVHMlZPQiwgICAgICAgICBtcGVnMnZvYik7CisgICAgUkVHSVNURVJfREVNVVhFUiAoTVBFR1BTLCAgICAgICAgICAgbXBlZ3BzKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChNUEVHVFMsICAgICAgICAgICBtcGVndHMpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKE1QRUdUU1JBVywgICAgICAgIG1wZWd0c3Jhdyk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoTVBFR1ZJREVPLCAgICAgICAgbXBlZ3ZpZGVvKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChNUEpQRUcsICAgICAgICAgICBtcGpwZWcpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKE1QTDIsICAgICAgICAgICAgIG1wbDIpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKE1QU1VCLCAgICAgICAgICAgIG1wc3ViKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChNU05XQ19UQ1AsICAgICAgICBtc253Y190Y3ApOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKE1UViwgICAgICAgICAgICAgIG10dik7CisgICAgUkVHSVNURVJfREVNVVhFUiAoTVYsICAgICAgICAgICAgICAgbXYpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKE1WSSwgICAgICAgICAgICAgIG12aSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoTVhGLCAgICAgICAgICAgICAgbXhmKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChNWEZfRDEwLCAgICAgICAgICBteGZfZDEwKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChNWEcsICAgICAgICAgICAgICBteGcpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKE5DLCAgICAgICAgICAgICAgIG5jKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChOSVNUU1BIRVJFLCAgICAgICBuaXN0c3BoZXJlKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChOU1YsICAgICAgICAgICAgICBuc3YpOworICAgIFJFR0lTVEVSX01VWEVSICAgKE5VTEwsICAgICAgICAgICAgIG51bGwpOworICAgIFJFR0lTVEVSX01VWERFTVVYKE5VVCwgICAgICAgICAgICAgIG51dCk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoTlVWLCAgICAgICAgICAgICAgbnV2KTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChPR0EsICAgICAgICAgICAgICBvZ2EpOworICAgIFJFR0lTVEVSX01VWERFTVVYKE9HRywgICAgICAgICAgICAgIG9nZyk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoT01BLCAgICAgICAgICAgICAgb21hKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChPUFVTLCAgICAgICAgICAgICBvcHVzKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChQQUYsICAgICAgICAgICAgICBwYWYpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9BTEFXLCAgICAgICAgIHBjbV9hbGF3KTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fTVVMQVcsICAgICAgICBwY21fbXVsYXcpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9GNjRCRSwgICAgICAgIHBjbV9mNjRiZSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoUENNX0Y2NExFLCAgICAgICAgcGNtX2Y2NGxlKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fRjMyQkUsICAgICAgICBwY21fZjMyYmUpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9GMzJMRSwgICAgICAgIHBjbV9mMzJsZSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoUENNX1MzMkJFLCAgICAgICAgcGNtX3MzMmJlKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fUzMyTEUsICAgICAgICBwY21fczMybGUpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9TMjRCRSwgICAgICAgIHBjbV9zMjRiZSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoUENNX1MyNExFLCAgICAgICAgcGNtX3MyNGxlKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fUzE2QkUsICAgICAgICBwY21fczE2YmUpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9TMTZMRSwgICAgICAgIHBjbV9zMTZsZSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoUENNX1M4LCAgICAgICAgICAgcGNtX3M4KTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fVTMyQkUsICAgICAgICBwY21fdTMyYmUpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9VMzJMRSwgICAgICAgIHBjbV91MzJsZSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoUENNX1UyNEJFLCAgICAgICAgcGNtX3UyNGJlKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fVTI0TEUsICAgICAgICBwY21fdTI0bGUpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9VMTZCRSwgICAgICAgIHBjbV91MTZiZSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoUENNX1UxNkxFLCAgICAgICAgcGNtX3UxNmxlKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fVTgsICAgICAgICAgICBwY21fdTgpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFBKUywgICAgICAgICAgICAgIHBqcyk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoUE1QLCAgICAgICAgICAgICAgcG1wKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChQU1AsICAgICAgICAgICAgICBwc3ApOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFBWQSwgICAgICAgICAgICAgIHB2YSk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoUFZGLCAgICAgICAgICAgICAgcHZmKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChRQ1AsICAgICAgICAgICAgICBxY3ApOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFIzRCwgICAgICAgICAgICAgIHIzZCk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoUkFXVklERU8sICAgICAgICAgcmF3dmlkZW8pOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFJFQUxURVhULCAgICAgICAgIHJlYWx0ZXh0KTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChSRURTUEFSSywgICAgICAgICByZWRzcGFyayk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoUkwyLCAgICAgICAgICAgICAgcmwyKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChSTSwgICAgICAgICAgICAgICBybSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoUk9RLCAgICAgICAgICAgICAgcm9xKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChSUEwsICAgICAgICAgICAgICBycGwpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFJTRCwgICAgICAgICAgICAgIHJzZCk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoUlNPLCAgICAgICAgICAgICAgcnNvKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChSVFAsICAgICAgICAgICAgICBydHApOworICAgIFJFR0lTVEVSX01VWERFTVVYKFJUU1AsICAgICAgICAgICAgIHJ0c3ApOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFNBTUksICAgICAgICAgICAgIHNhbWkpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFNBUCwgICAgICAgICAgICAgIHNhcCk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoU0JHLCAgICAgICAgICAgICAgc2JnKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChTRFAsICAgICAgICAgICAgICBzZHApOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFNEUjIsICAgICAgICAgICAgIHNkcjIpOworI2lmIENPTkZJR19SVFBERUMKKyAgICBmZl9yZWdpc3Rlcl9ydHBfZHluYW1pY19wYXlsb2FkX2hhbmRsZXJzKCk7CisgICAgZmZfcmVnaXN0ZXJfcmR0X2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVycygpOworI2VuZGlmCisgICAgUkVHSVNURVJfREVNVVhFUiAoU0VHQUZJTE0sICAgICAgICAgc2VnYWZpbG0pOworICAgIFJFR0lTVEVSX01VWEVSICAgKFNFR01FTlQsICAgICAgICAgIHNlZ21lbnQpOworICAgIFJFR0lTVEVSX01VWEVSICAgKFNFR01FTlQsICAgICAgICAgIHN0cmVhbV9zZWdtZW50KTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChTSE9SVEVOLCAgICAgICAgICBzaG9ydGVuKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChTSUZGLCAgICAgICAgICAgICBzaWZmKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChTTE4sICAgICAgICAgICAgICBzbG4pOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFNNQUNLRVIsICAgICAgICAgIHNtYWNrZXIpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFNNSlBFRywgICAgICAgICAgIHNtanBlZyk7CisgICAgUkVHSVNURVJfTVVYRVIgICAoU01PT1RIU1RSRUFNSU5HLCAgc21vb3Roc3RyZWFtaW5nKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChTTVVTSCwgICAgICAgICAgICBzbXVzaCk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoU09MLCAgICAgICAgICAgICAgc29sKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChTT1gsICAgICAgICAgICAgICBzb3gpOworICAgIFJFR0lTVEVSX01VWEVSICAgKFNQWCwgICAgICAgICAgICAgIHNweCk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoU1BESUYsICAgICAgICAgICAgc3BkaWYpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFNSVCwgICAgICAgICAgICAgIHNydCk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoU1RSLCAgICAgICAgICAgICAgc3RyKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChTVEwsICAgICAgICAgICAgICBzdGwpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFNVQlZJRVdFUjEsICAgICAgIHN1YnZpZXdlcjEpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFNVQlZJRVdFUiwgICAgICAgIHN1YnZpZXdlcik7CisgICAgUkVHSVNURVJfREVNVVhFUiAoU1VQLCAgICAgICAgICAgICAgc3VwKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChTV0YsICAgICAgICAgICAgICBzd2YpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFRBSywgICAgICAgICAgICAgIHRhayk7CisgICAgUkVHSVNURVJfTVVYRVIgICAoVEVFLCAgICAgICAgICAgICAgdGVlKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChURURDQVBUSU9OUywgICAgICB0ZWRjYXB0aW9ucyk7CisgICAgUkVHSVNURVJfTVVYRVIgICAoVEcyLCAgICAgICAgICAgICAgdGcyKTsKKyAgICBSRUdJU1RFUl9NVVhFUiAgIChUR1AsICAgICAgICAgICAgICB0Z3ApOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFRIUCwgICAgICAgICAgICAgIHRocCk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoVElFUlRFWFNFUSwgICAgICAgdGllcnRleHNlcSk7CisgICAgUkVHSVNURVJfTVVYRVIgICAoTUtWVElNRVNUQU1QX1YyLCAgbWt2dGltZXN0YW1wX3YyKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChUTVYsICAgICAgICAgICAgICB0bXYpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFRSVUVIRCwgICAgICAgICAgIHRydWVoZCk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoVFRBLCAgICAgICAgICAgICAgdHRhKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChUWEQsICAgICAgICAgICAgICB0eGQpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFRUWSwgICAgICAgICAgICAgIHR0eSk7CisgICAgUkVHSVNURVJfTVVYRVIgICAoVU5DT0RFREZSQU1FQ1JDLCAgdW5jb2RlZGZyYW1lY3JjKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChWQzEsICAgICAgICAgICAgICB2YzEpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFZDMVQsICAgICAgICAgICAgIHZjMXQpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFZJVk8sICAgICAgICAgICAgIHZpdm8pOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFZNRCwgICAgICAgICAgICAgIHZtZCk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoVk9CU1VCLCAgICAgICAgICAgdm9ic3ViKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChWT0MsICAgICAgICAgICAgICB2b2MpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFZQTEFZRVIsICAgICAgICAgIHZwbGF5ZXIpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFZRRiwgICAgICAgICAgICAgIHZxZik7CisgICAgUkVHSVNURVJfTVVYREVNVVgoVzY0LCAgICAgICAgICAgICAgdzY0KTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChXQVYsICAgICAgICAgICAgICB3YXYpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFdDMywgICAgICAgICAgICAgIHdjMyk7CisgICAgUkVHSVNURVJfTVVYRVIgICAoV0VCTSwgICAgICAgICAgICAgd2VibSk7CisgICAgUkVHSVNURVJfTVVYREVNVVgoV0VCTV9EQVNIX01BTklGRVNULCB3ZWJtX2Rhc2hfbWFuaWZlc3QpOworICAgIFJFR0lTVEVSX01VWEVSICAgKFdFQlAsICAgICAgICAgICAgIHdlYnApOworICAgIFJFR0lTVEVSX01VWERFTVVYKFdFQlZUVCwgICAgICAgICAgIHdlYnZ0dCk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoV1NBVUQsICAgICAgICAgICAgd3NhdWQpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKFdTVlFBLCAgICAgICAgICAgIHdzdnFhKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChXVFYsICAgICAgICAgICAgICB3dHYpOworICAgIFJFR0lTVEVSX01VWERFTVVYKFdWLCAgICAgICAgICAgICAgIHd2KTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChYQSwgICAgICAgICAgICAgICB4YSk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoWEJJTiwgICAgICAgICAgICAgeGJpbik7CisgICAgUkVHSVNURVJfREVNVVhFUiAoWE1WLCAgICAgICAgICAgICAgeG12KTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChYV01BLCAgICAgICAgICAgICB4d21hKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChZT1AsICAgICAgICAgICAgICB5b3ApOworICAgIFJFR0lTVEVSX01VWERFTVVYKFlVVjRNUEVHUElQRSwgICAgIHl1djRtcGVncGlwZSk7CisKKyAgICAvKiBpbWFnZSBkZW11eGVycyAqLworICAgIFJFR0lTVEVSX0RFTVVYRVIgKElNQUdFX0JNUF9QSVBFLCAgICAgICAgaW1hZ2VfYm1wX3BpcGUpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKElNQUdFX0RQWF9QSVBFLCAgICAgICAgaW1hZ2VfZHB4X3BpcGUpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKElNQUdFX0VYUl9QSVBFLCAgICAgICAgaW1hZ2VfZXhyX3BpcGUpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKElNQUdFX0oyS19QSVBFLCAgICAgICAgaW1hZ2VfajJrX3BpcGUpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKElNQUdFX0pQRUdfUElQRSwgICAgICAgaW1hZ2VfanBlZ19waXBlKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9KUEVHTFNfUElQRSwgICAgIGltYWdlX2pwZWdsc19waXBlKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9QSUNUT1JfUElQRSwgICAgIGltYWdlX3BpY3Rvcl9waXBlKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9QTkdfUElQRSwgICAgICAgIGltYWdlX3BuZ19waXBlKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9TR0lfUElQRSwgICAgICAgIGltYWdlX3NnaV9waXBlKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9TVU5SQVNUX1BJUEUsICAgIGltYWdlX3N1bnJhc3RfcGlwZSk7CisgICAgUkVHSVNURVJfREVNVVhFUiAoSU1BR0VfVElGRl9QSVBFLCAgICAgICBpbWFnZV90aWZmX3BpcGUpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKElNQUdFX1dFQlBfUElQRSwgICAgICAgaW1hZ2Vfd2VicF9waXBlKTsKKworCisgICAgLyogcHJvdG9jb2xzICovCisgICAgUkVHSVNURVJfUFJPVE9DT0woQkxVUkFZLCAgICAgICAgICAgYmx1cmF5KTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChDQUNIRSwgICAgICAgICAgICBjYWNoZSk7CisgICAgUkVHSVNURVJfUFJPVE9DT0woQ09OQ0FULCAgICAgICAgICAgY29uY2F0KTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChDUllQVE8sICAgICAgICAgICBjcnlwdG8pOworICAgIFJFR0lTVEVSX1BST1RPQ09MKERBVEEsICAgICAgICAgICAgIGRhdGEpOworICAgIFJFR0lTVEVSX1BST1RPQ09MKEZGUlRNUENSWVBULCAgICAgIGZmcnRtcGNyeXB0KTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChGRlJUTVBIVFRQLCAgICAgICBmZnJ0bXBodHRwKTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChGSUxFLCAgICAgICAgICAgICBmaWxlKTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChGVFAsICAgICAgICAgICAgICBmdHApOworICAgIFJFR0lTVEVSX1BST1RPQ09MKEdPUEhFUiwgICAgICAgICAgIGdvcGhlcik7CisgICAgUkVHSVNURVJfUFJPVE9DT0woSExTLCAgICAgICAgICAgICAgaGxzKTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChIVFRQLCAgICAgICAgICAgICBodHRwKTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChIVFRQUFJPWFksICAgICAgICBodHRwcHJveHkpOworICAgIFJFR0lTVEVSX1BST1RPQ09MKEhUVFBTLCAgICAgICAgICAgIGh0dHBzKTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChJQ0VDQVNULCAgICAgICAgICBpY2VjYXN0KTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChNTVNILCAgICAgICAgICAgICBtbXNoKTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChNTVNULCAgICAgICAgICAgICBtbXN0KTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChNRDUsICAgICAgICAgICAgICBtZDUpOworICAgIFJFR0lTVEVSX1BST1RPQ09MKFBJUEUsICAgICAgICAgICAgIHBpcGUpOworICAgIFJFR0lTVEVSX1BST1RPQ09MKFJUTVAsICAgICAgICAgICAgIHJ0bXApOworICAgIFJFR0lTVEVSX1BST1RPQ09MKFJUTVBFLCAgICAgICAgICAgIHJ0bXBlKTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChSVE1QUywgICAgICAgICAgICBydG1wcyk7CisgICAgUkVHSVNURVJfUFJPVE9DT0woUlRNUFQsICAgICAgICAgICAgcnRtcHQpOworICAgIFJFR0lTVEVSX1BST1RPQ09MKFJUTVBURSwgICAgICAgICAgIHJ0bXB0ZSk7CisgICAgUkVHSVNURVJfUFJPVE9DT0woUlRNUFRTLCAgICAgICAgICAgcnRtcHRzKTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChSVFAsICAgICAgICAgICAgICBydHApOworICAgIFJFR0lTVEVSX1BST1RPQ09MKFNDVFAsICAgICAgICAgICAgIHNjdHApOworICAgIFJFR0lTVEVSX1BST1RPQ09MKFNSVFAsICAgICAgICAgICAgIHNydHApOworICAgIFJFR0lTVEVSX1BST1RPQ09MKFNVQkZJTEUsICAgICAgICAgIHN1YmZpbGUpOworICAgIFJFR0lTVEVSX1BST1RPQ09MKFRDUCwgICAgICAgICAgICAgIHRjcCk7CisgICAgUkVHSVNURVJfUFJPVE9DT0woVExTLCAgICAgICAgICAgICAgdGxzKTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChVRFAsICAgICAgICAgICAgICB1ZHApOworICAgIFJFR0lTVEVSX1BST1RPQ09MKFVEUExJVEUsICAgICAgICAgIHVkcGxpdGUpOworICAgIFJFR0lTVEVSX1BST1RPQ09MKFVOSVgsICAgICAgICAgICAgIHVuaXgpOworCisgICAgLyogZXh0ZXJuYWwgbGlicmFyaWVzICovCisgICAgUkVHSVNURVJfREVNVVhFUiAoTElCR01FLCAgICAgICAgICAgbGliZ21lKTsKKyAgICBSRUdJU1RFUl9ERU1VWEVSIChMSUJNT0RQTFVHLCAgICAgICBsaWJtb2RwbHVnKTsKKyAgICBSRUdJU1RFUl9NVVhERU1VWChMSUJOVVQsICAgICAgICAgICBsaWJudXQpOworICAgIFJFR0lTVEVSX0RFTVVYRVIgKExJQlFVVkksICAgICAgICAgIGxpYnF1dmkpOworICAgIFJFR0lTVEVSX1BST1RPQ09MKExJQlJUTVAsICAgICAgICAgIGxpYnJ0bXApOworICAgIFJFR0lTVEVSX1BST1RPQ09MKExJQlJUTVBFLCAgICAgICAgIGxpYnJ0bXBlKTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChMSUJSVE1QUywgICAgICAgICBsaWJydG1wcyk7CisgICAgUkVHSVNURVJfUFJPVE9DT0woTElCUlRNUFQsICAgICAgICAgbGlicnRtcHQpOworICAgIFJFR0lTVEVSX1BST1RPQ09MKExJQlJUTVBURSwgICAgICAgIGxpYnJ0bXB0ZSk7CisgICAgUkVHSVNURVJfUFJPVE9DT0woTElCU1NILCAgICAgICAgICAgbGlic3NoKTsKKyAgICBSRUdJU1RFUl9QUk9UT0NPTChMSUJTTUJDTElFTlQsICAgICBsaWJzbWJjbGllbnQpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2Ftci5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2Ftci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDRkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYW1yLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBhbXIgZmlsZSBmb3JtYXQKKyAqIENvcHlyaWdodCAoYykgMjAwMSBmZm1wZWcgcHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorV3JpdGUgYW5kIHJlYWQgYW1yIGRhdGEgYWNjb3JkaW5nIHRvIFJGQzMyNjcsIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMyNjcudHh0P251bWJlcj0zMjY3CisKK09ubHkgbW9ubyBmaWxlcyBhcmUgc3VwcG9ydGVkLgorCisqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgY3VtdWxhdGVkX3NpemU7CisgICAgdWludDY0X3QgYmxvY2tfY291bnQ7Cit9IEFNUkNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBjaGFyIEFNUl9oZWFkZXJbXSAgID0gIiMhQU1SXG4iOworc3RhdGljIGNvbnN0IGNoYXIgQU1SV0JfaGVhZGVyW10gPSAiIyFBTVItV0JcbiI7CisKKyNpZiBDT05GSUdfQU1SX01VWEVSCitzdGF0aWMgaW50IGFtcl93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICAgICpwYiAgPSBzLT5wYjsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisKKyAgICBzLT5wcml2X2RhdGEgPSBOVUxMOworCisgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX05CKSB7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIEFNUl9oZWFkZXIsICAgc2l6ZW9mKEFNUl9oZWFkZXIpICAgLSAxKTsgLyogbWFnaWMgbnVtYmVyICovCisgICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9XQikgeworICAgICAgICBhdmlvX3dyaXRlKHBiLCBBTVJXQl9oZWFkZXIsIHNpemVvZihBTVJXQl9oZWFkZXIpIC0gMSk7IC8qIG1hZ2ljIG51bWJlciAqLworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXZpb19mbHVzaChwYik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1yX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgYXZpb193cml0ZShzLT5wYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19BTVJfTVVYRVIgKi8KKworc3RhdGljIGludCBhbXJfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgLy8gT25seSBjaGVjayBmb3IgIiMhQU1SIiB3aGljaCBjb3VsZCBiZSBhbXItd2IsIGFtci1uYi4KKyAgICAvLyBUaGlzIHdpbGwgYWxzbyB0cmlnZ2VyIG11bHRpY2hhbm5lbCBmaWxlczogIiMhQU1SX01DMS4wXG4iIGFuZAorICAgIC8vICIjIUFNUi1XQl9NQzEuMFxuIiAobm90IHN1cHBvcnRlZCkKKworICAgIGlmICghbWVtY21wKHAtPmJ1ZiwgQU1SX2hlYWRlciwgNSkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisvKiBhbXIgaW5wdXQgKi8KK3N0YXRpYyBpbnQgYW1yX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgdWludDhfdCBoZWFkZXJbOV07CisKKyAgICBhdmlvX3JlYWQocGIsIGhlYWRlciwgNik7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpZiAobWVtY21wKGhlYWRlciwgQU1SX2hlYWRlciwgNikpIHsKKyAgICAgICAgYXZpb19yZWFkKHBiLCBoZWFkZXIgKyA2LCAzKTsKKyAgICAgICAgaWYgKG1lbWNtcChoZWFkZXIsIEFNUldCX2hlYWRlciwgOSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgPSBNS1RBRygncycsICdhJywgJ3cnLCAnYicpOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQU1SX1dCOworICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gMTYwMDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IE1LVEFHKCdzJywgJ2EnLCAnbScsICdyJyk7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BTVJfTkI7CisgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSA4MDAwOworICAgIH0KKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgPSAxOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1yX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgaW50IHJlYWQsIHNpemUgPSAwLCB0b2MsIG1vZGU7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIEFNUkNvbnRleHQgKmFtciA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgLy8gRklYTUUgdGhpcyBpcyB3cm9uZywgdGhpcyBzaG91bGQgcmF0aGVyIGJlIGluIGEgQVZQYXJzZXIKKyAgICB0b2MgID0gYXZpb19yOChzLT5wYik7CisgICAgbW9kZSA9ICh0b2MgPj4gMykgJiAweDBGOworCisgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX05CKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHBhY2tlZF9zaXplWzE2XSA9IHsKKyAgICAgICAgICAgIDEyLCAxMywgMTUsIDE3LCAxOSwgMjAsIDI2LCAzMSwgNSwgMCwgMCwgMCwgMCwgMCwgMCwgMAorICAgICAgICB9OworCisgICAgICAgIHNpemUgPSBwYWNrZWRfc2l6ZVttb2RlXSArIDE7CisgICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9XQikgeworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBwYWNrZWRfc2l6ZVsxNl0gPSB7CisgICAgICAgICAgICAxOCwgMjQsIDMzLCAzNywgNDEsIDQ3LCA1MSwgNTksIDYxLCA2LCA2LCAwLCAwLCAwLCAxLCAxCisgICAgICAgIH07CisKKyAgICAgICAgc2l6ZSA9IHBhY2tlZF9zaXplW21vZGVdOworICAgIH0KKworICAgIGlmICghc2l6ZSB8fCBhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBpZiAoYW1yLT5jdW11bGF0ZWRfc2l6ZSA8IFVJTlQ2NF9NQVggLSBzaXplKSB7CisgICAgICAgIGFtci0+Y3VtdWxhdGVkX3NpemUgKz0gc2l6ZTsKKyAgICAgICAgLyogQm90aCBBTVIgZm9ybWF0cyBoYXZlIDUwIGZyYW1lcyBwZXIgc2Vjb25kICovCisgICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5iaXRfcmF0ZSA9IGFtci0+Y3VtdWxhdGVkX3NpemUgLyArK2Ftci0+YmxvY2tfY291bnQgKiA4ICogNTA7CisgICAgfQorCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIHBrdC0+cG9zICAgICAgICAgID0gcG9zOworICAgIHBrdC0+ZGF0YVswXSAgICAgID0gdG9jOworICAgIHBrdC0+ZHVyYXRpb24gICAgID0gZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTVJfTkIgPyAxNjAgOiAzMjA7CisgICAgcmVhZCAgICAgICAgICAgICAgPSBhdmlvX3JlYWQocy0+cGIsIHBrdC0+ZGF0YSArIDEsIHNpemUgLSAxKTsKKworICAgIGlmIChyZWFkICE9IHNpemUgLSAxKSB7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfQU1SX0RFTVVYRVIKK0FWSW5wdXRGb3JtYXQgZmZfYW1yX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFtciIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIjNHUFAgQU1SIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFNUkNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGFtcl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhbXJfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gYW1yX3JlYWRfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfQU1SX01VWEVSCitBVk91dHB1dEZvcm1hdCBmZl9hbXJfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImFtciIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIjNHUFAgQU1SIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImF1ZGlvL2FtciIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gImFtciIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQU1SX05CLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gYW1yX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBhbXJfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hbm0uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hbm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTk2Y2I4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FubS5jCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogRGVsdXhlIFBhaW50IEFuaW1hdGlvbiBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUGV0ZXIgUm9zcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBEZWx1eGUgUGFpbnQgQW5pbWF0aW9uIGRlbXV4ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBiYXNlX3JlY29yZDsKKyAgICB1bnNpZ25lZCBpbnQgbmJfcmVjb3JkczsKKyAgICBpbnQgc2l6ZTsKK30gUGFnZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBuYl9wYWdlczsgICAgLyoqPCB0b3RhbCBwYWdlcyBpbiBmaWxlICovCisgICAgdW5zaWduZWQgaW50IG5iX3JlY29yZHM7ICAvKio8IHRvdGFsIHJlY29yZHMgaW4gZmlsZSAqLworICAgIGludCBwYWdlX3RhYmxlX29mZnNldDsKKyNkZWZpbmUgTUFYX1BBR0VTICAyNTYgICAgICAgIC8qKjwgRGVsdXhlIFBhaW50IGhhcmRjb2RlZCB2YWx1ZSAqLworICAgIFBhZ2UgcHRbTUFYX1BBR0VTXTsgICAgICAgLyoqPCBwYWdlIHRhYmxlICovCisgICAgaW50IHBhZ2U7ICAgICAgICAgICAgICAgICAvKio8IGN1cnJlbnQgcGFnZSAob3IgQVZFUlJPUl94eHggY29kZSkgKi8KKyAgICBpbnQgcmVjb3JkOyAgICAgICAgICAgICAgIC8qKjwgY3VycmVudCByZWNvcmQgKHdpdGggaW4gcGFnZSkgKi8KK30gQW5tRGVtdXhDb250ZXh0OworCisjZGVmaW5lIExQRl9UQUcgIE1LVEFHKCdMJywnUCcsJ0YnLCcgJykKKyNkZWZpbmUgQU5JTV9UQUcgTUtUQUcoJ0EnLCdOJywnSScsJ00nKQorCitzdGF0aWMgaW50IHByb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIC8qIHZlcmlmeSB0YWdzIGFuZCB2aWRlbyBkaW1lbnNpb25zICovCisgICAgaWYgKEFWX1JMMzIoJnAtPmJ1ZlswXSkgID09IExQRl9UQUcgJiYKKyAgICAgICAgQVZfUkwzMigmcC0+YnVmWzE2XSkgPT0gQU5JTV9UQUcgJiYKKyAgICAgICAgQVZfUkwxNigmcC0+YnVmWzIwXSkgJiYgQVZfUkwxNigmcC0+YnVmWzIyXSkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBAcmV0dXJuIHBhZ2UgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIHJlY29yZCBvciBBVkVSUk9SX1hYWAorICovCitzdGF0aWMgaW50IGZpbmRfcmVjb3JkKGNvbnN0IEFubURlbXV4Q29udGV4dCAqYW5tLCBpbnQgcmVjb3JkKQoreworICAgIGludCBpOworCisgICAgaWYgKHJlY29yZCA+PSBhbm0tPm5iX3JlY29yZHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUEFHRVM7IGkrKykgeworICAgICAgICBjb25zdCBQYWdlICpwID0gJmFubS0+cHRbaV07CisgICAgICAgIGlmIChwLT5uYl9yZWNvcmRzID4gMCAmJiByZWNvcmQgPj0gcC0+YmFzZV9yZWNvcmQgJiYgcmVjb3JkIDwgcC0+YmFzZV9yZWNvcmQgKyBwLT5uYl9yZWNvcmRzKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFubURlbXV4Q29udGV4dCAqYW5tID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgaSwgcmV0OworCisgICAgYXZpb19za2lwKHBiLCA0KTsgLyogbWFnaWMgbnVtYmVyICovCisgICAgaWYgKGF2aW9fcmwxNihwYikgIT0gTUFYX1BBR0VTKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAibWF4X3BhZ2VzICE9ICIgQVZfU1RSSU5HSUZZKE1BWF9QQUdFUykpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgYW5tLT5uYl9wYWdlcyAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBhbm0tPm5iX3JlY29yZHMgPSBhdmlvX3JsMzIocGIpOworICAgIGF2aW9fc2tpcChwYiwgMik7IC8qIG1heCByZWNvcmRzIHBlciBwYWdlICovCisgICAgYW5tLT5wYWdlX3RhYmxlX29mZnNldCA9IGF2aW9fcmwxNihwYik7CisgICAgaWYgKGF2aW9fcmwzMihwYikgIT0gQU5JTV9UQUcpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLyogdmlkZW8gc3RyZWFtICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0FOTTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSAwOyAvKiBubyBmb3VyY2MgKi8KKyAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgaWYgKGF2aW9fcjgocGIpICE9IDApCisgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICBhdmlvX3NraXAocGIsIDEpOyAvKiBmcmFtZSByYXRlIG11bHRpcGxpZXIgaW5mbyAqLworCisgICAgLyogaWdub3JlIGxhc3QgZGVsdGEgcmVjb3JkICh1c2VkIGZvciBsb29waW5nKSAqLworICAgIGlmIChhdmlvX3I4KHBiKSkgIC8qIGhhc19sYXN0X2RlbHRhICovCisgICAgICAgIGFubS0+bmJfcmVjb3JkcyA9IEZGTUFYKGFubS0+bmJfcmVjb3JkcyAtIDEsIDApOworCisgICAgYXZpb19za2lwKHBiLCAxKTsgLyogbGFzdF9kZWx0YV92YWxpZCAqLworCisgICAgaWYgKGF2aW9fcjgocGIpICE9IDApCisgICAgICAgIGdvdG8gaW52YWxpZDsKKworICAgIGlmIChhdmlvX3I4KHBiKSAhPSAxKQorICAgICAgICBnb3RvIGludmFsaWQ7CisKKyAgICBhdmlvX3NraXAocGIsIDEpOyAvKiBvdGhlciByZWNzIHBlciBmcmFtZSAqLworCisgICAgaWYgKGF2aW9fcjgocGIpICE9IDEpCisgICAgICAgIGdvdG8gaW52YWxpZDsKKworICAgIGF2aW9fc2tpcChwYiwgMzIpOyAvKiByZWNvcmRfdHlwZXMgKi8KKyAgICBzdC0+bmJfZnJhbWVzID0gYXZpb19ybDMyKHBiKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgYXZpb19ybDE2KHBiKSk7CisgICAgYXZpb19za2lwKHBiLCA1OCk7CisKKyAgICAvKiBjb2xvciBjeWNsaW5nIGFuZCBwYWxldHRlIGRhdGEgKi8KKyAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMTYqOCArIDQqMjU2OworICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICAgICAgPSBhdl9tYWxsb2N6KHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHJldCA9IGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogcmVhZCBwYWdlIHRhYmxlICovCisgICAgcmV0ID0gYXZpb19zZWVrKHBiLCBhbm0tPnBhZ2VfdGFibGVfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BBR0VTOyBpKyspIHsKKyAgICAgICAgUGFnZSAqcCA9ICZhbm0tPnB0W2ldOworICAgICAgICBwLT5iYXNlX3JlY29yZCA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIHAtPm5iX3JlY29yZHMgID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgcC0+c2l6ZSAgICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIH0KKworICAgIC8qIGZpbmQgcGFnZSBvZiBmaXJzdCBmcmFtZSAqLworICAgIGFubS0+cGFnZSA9IGZpbmRfcmVjb3JkKGFubSwgMCk7CisgICAgaWYgKGFubS0+cGFnZSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGFubS0+cGFnZTsKKyAgICB9CisKKyAgICBhbm0tPnJlY29yZCA9IC0xOworICAgIHJldHVybiAwOworCitpbnZhbGlkOgorICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiSW52YWxpZCBoZWFkZXIgZWxlbWVudCIpOworICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKK30KKworc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgQW5tRGVtdXhDb250ZXh0ICphbm0gPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgUGFnZSAqcDsKKyAgICBpbnQgdG1wLCByZWNvcmRfc2l6ZTsKKworICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgaWYgKGFubS0+cGFnZSA8IDApCisgICAgICAgIHJldHVybiBhbm0tPnBhZ2U7CisKK3JlcGVhdDoKKyAgICBwID0gJmFubS0+cHRbYW5tLT5wYWdlXTsKKworICAgIC8qIHBhcnNlIHBhZ2UgaGVhZGVyICovCisgICAgaWYgKGFubS0+cmVjb3JkIDwgMCkgeworICAgICAgICBhdmlvX3NlZWsocGIsIGFubS0+cGFnZV90YWJsZV9vZmZzZXQgKyBNQVhfUEFHRVMqNiArIChhbm0tPnBhZ2U8PDE2KSwgU0VFS19TRVQpOworICAgICAgICBhdmlvX3NraXAocGIsIDggKyAyKnAtPm5iX3JlY29yZHMpOworICAgICAgICBhbm0tPnJlY29yZCA9IDA7CisgICAgfQorCisgICAgLyogaWYgd2UgaGF2ZSBmZXRjaGVkIGFsbCByZWNvcmRzIGluIHRoaXMgcGFnZSwgdGhlbiBmaW5kIHRoZQorICAgICAgIG5leHQgcGFnZSBhbmQgcmVwZWF0ICovCisgICAgaWYgKGFubS0+cmVjb3JkID49IHAtPm5iX3JlY29yZHMpIHsKKyAgICAgICAgYW5tLT5wYWdlID0gZmluZF9yZWNvcmQoYW5tLCBwLT5iYXNlX3JlY29yZCArIHAtPm5iX3JlY29yZHMpOworICAgICAgICBpZiAoYW5tLT5wYWdlIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBhbm0tPnBhZ2U7CisgICAgICAgIGFubS0+cmVjb3JkID0gLTE7CisgICAgICAgIGdvdG8gcmVwZWF0OworICAgIH0KKworICAgIC8qIGZldGNoIHJlY29yZCBzaXplICovCisgICAgdG1wID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3NlZWsocGIsIGFubS0+cGFnZV90YWJsZV9vZmZzZXQgKyBNQVhfUEFHRVMqNiArIChhbm0tPnBhZ2U8PDE2KSArCisgICAgICAgICAgICAgIDggKyBhbm0tPnJlY29yZCAqIDIsIFNFRUtfU0VUKTsKKyAgICByZWNvcmRfc2l6ZSA9IGF2aW9fcmwxNihwYik7CisgICAgYXZpb19zZWVrKHBiLCB0bXAsIFNFRUtfU0VUKTsKKworICAgIC8qIGZldGNoIHJlY29yZCAqLworICAgIHBrdC0+c2l6ZSA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgcmVjb3JkX3NpemUpOworICAgIGlmIChwa3QtPnNpemUgPCAwKQorICAgICAgICByZXR1cm4gcGt0LT5zaXplOworICAgIGlmIChwLT5iYXNlX3JlY29yZCArIGFubS0+cmVjb3JkID09IDApCisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgYW5tLT5yZWNvcmQrKzsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9hbm1fZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYW5tIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGVsdXhlIFBhaW50IEFuaW1hdGlvbiIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBbm1EZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHByb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hcGMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJiNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FwYy5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDUllPIEFQQyBhdWRpbyBmb3JtYXQgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgYXBjX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmICghc3RybmNtcChwLT5idWYsICJDUllPX0FQQyIsIDgpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcGNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIGF2aW9fcmwzMihwYik7IC8qIENSWU8gKi8KKyAgICBhdmlvX3JsMzIocGIpOyAvKiBfQVBDICovCisgICAgYXZpb19ybDMyKHBiKTsgLyogMS4yMCAqLworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9BUEM7CisKKyAgICBhdmlvX3JsMzIocGIpOyAvKiBudW1iZXIgb2Ygc2FtcGxlcyAqLworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocGIpOworCisgICAgLyogaW5pdGlhbCBwcmVkaWN0b3IgdmFsdWVzIGZvciBhZHBjbSBkZWNvZGVyICovCisgICAgaWYgKGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgMiAqIDQpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChhdmlvX3JsMzIocGIpKSB7CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICB9IGVsc2UgeworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIH0KKworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gNDsKKyAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWMtPmNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9SRUFEX1NJWkUgNDA5NgorCitzdGF0aWMgaW50IGFwY19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaWYgKGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgTUFYX1JFQURfU0laRSkgPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICBwa3QtPmZsYWdzICY9IH5BVl9QS1RfRkxBR19DT1JSVVBUOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9hcGNfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXBjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ1JZTyBBUEMiKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBhcGNfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gYXBjX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGFwY19yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXBlLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmYzFkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hcGUuYwpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqIE1vbmtleSdzIEF1ZGlvIEFQRSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQmVuamFtaW4gWm9yZXMgPGJlbkBnZWV4Ym94Lm9yZz4KKyAqICBiYXNlZCB1cG9uIGxpYmRlbWFjIGZyb20gRGF2ZSBDaGFwbWFuLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXBldGFnLmgiCisKKy8qIFRoZSBlYXJsaWVzdCBhbmQgbGF0ZXN0IGZpbGUgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhpcyBsaWJyYXJ5ICovCisjZGVmaW5lIEFQRV9NSU5fVkVSU0lPTiAzODAwCisjZGVmaW5lIEFQRV9NQVhfVkVSU0lPTiAzOTkwCisKKyNkZWZpbmUgTUFDX0ZPUk1BVF9GTEFHXzhfQklUICAgICAgICAgICAgICAgICAxIC8vIGlzIDgtYml0IFtPQlNPTEVURV0KKyNkZWZpbmUgTUFDX0ZPUk1BVF9GTEFHX0NSQyAgICAgICAgICAgICAgICAgICAyIC8vIHVzZXMgdGhlIG5ldyBDUkMzMiBlcnJvciBkZXRlY3Rpb24gW09CU09MRVRFXQorI2RlZmluZSBNQUNfRk9STUFUX0ZMQUdfSEFTX1BFQUtfTEVWRUwgICAgICAgIDQgLy8gdWludDMyIG5QZWFrTGV2ZWwgYWZ0ZXIgdGhlIGhlYWRlciBbT0JTT0xFVEVdCisjZGVmaW5lIE1BQ19GT1JNQVRfRkxBR18yNF9CSVQgICAgICAgICAgICAgICAgOCAvLyBpcyAyNC1iaXQgW09CU09MRVRFXQorI2RlZmluZSBNQUNfRk9STUFUX0ZMQUdfSEFTX1NFRUtfRUxFTUVOVFMgICAgMTYgLy8gaGFzIHRoZSBudW1iZXIgb2Ygc2VlayBlbGVtZW50cyBhZnRlciB0aGUgcGVhayBsZXZlbAorI2RlZmluZSBNQUNfRk9STUFUX0ZMQUdfQ1JFQVRFX1dBVl9IRUFERVIgICAgMzIgLy8gY3JlYXRlIHRoZSB3YXZlIGhlYWRlciBvbiBkZWNvbXByZXNzaW9uIChub3Qgc3RvcmVkKQorCisjZGVmaW5lIEFQRV9FWFRSQURBVEFfU0laRSA2CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQ2NF90IHBvczsKKyAgICBpbnQgbmJsb2NrczsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgc2tpcDsKKyAgICBpbnQ2NF90IHB0czsKK30gQVBFRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBEZXJpdmVkIGZpZWxkcyAqLworICAgIHVpbnQzMl90IGp1bmtsZW5ndGg7CisgICAgdWludDMyX3QgZmlyc3RmcmFtZTsKKyAgICB1aW50MzJfdCB0b3RhbHNhbXBsZXM7CisgICAgaW50IGN1cnJlbnRmcmFtZTsKKyAgICBBUEVGcmFtZSAqZnJhbWVzOworCisgICAgLyogSW5mbyBmcm9tIERlc2NyaXB0b3IgQmxvY2sgKi8KKyAgICBjaGFyIG1hZ2ljWzRdOworICAgIGludDE2X3QgZmlsZXZlcnNpb247CisgICAgaW50MTZfdCBwYWRkaW5nMTsKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9ybGVuZ3RoOworICAgIHVpbnQzMl90IGhlYWRlcmxlbmd0aDsKKyAgICB1aW50MzJfdCBzZWVrdGFibGVsZW5ndGg7CisgICAgdWludDMyX3Qgd2F2aGVhZGVybGVuZ3RoOworICAgIHVpbnQzMl90IGF1ZGlvZGF0YWxlbmd0aDsKKyAgICB1aW50MzJfdCBhdWRpb2RhdGFsZW5ndGhfaGlnaDsKKyAgICB1aW50MzJfdCB3YXZ0YWlsbGVuZ3RoOworICAgIHVpbnQ4X3QgbWQ1WzE2XTsKKworICAgIC8qIEluZm8gZnJvbSBIZWFkZXIgQmxvY2sgKi8KKyAgICB1aW50MTZfdCBjb21wcmVzc2lvbnR5cGU7CisgICAgdWludDE2X3QgZm9ybWF0ZmxhZ3M7CisgICAgdWludDMyX3QgYmxvY2tzcGVyZnJhbWU7CisgICAgdWludDMyX3QgZmluYWxmcmFtZWJsb2NrczsKKyAgICB1aW50MzJfdCB0b3RhbGZyYW1lczsKKyAgICB1aW50MTZfdCBicHM7CisgICAgdWludDE2X3QgY2hhbm5lbHM7CisgICAgdWludDMyX3Qgc2FtcGxlcmF0ZTsKKworICAgIC8qIFNlZWt0YWJsZSAqLworICAgIHVpbnQzMl90ICpzZWVrdGFibGU7CisgICAgdWludDhfdCAgKmJpdHRhYmxlOworfSBBUEVDb250ZXh0OworCitzdGF0aWMgaW50IGFwZV9wcm9iZShBVlByb2JlRGF0YSAqIHApCit7CisgICAgaW50IHZlcnNpb24gPSBBVl9STDE2KHAtPmJ1Zis0KTsKKyAgICBpZiAoQVZfUkwzMihwLT5idWYpICE9IE1LVEFHKCdNJywgJ0EnLCAnQycsICcgJykpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHZlcnNpb24gPCBBUEVfTUlOX1ZFUlNJT04gfHwgdmVyc2lvbiA+IEFQRV9NQVhfVkVSU0lPTikKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYLzQ7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyB2b2lkIGFwZV9kdW1waW5mbyhBVkZvcm1hdENvbnRleHQgKiBzLCBBUEVDb250ZXh0ICogYXBlX2N0eCkKK3sKKyNpZmRlZiBERUJVRworICAgIGludCBpOworCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkRlc2NyaXB0b3IgQmxvY2s6XG5cbiIpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJtYWdpYyAgICAgICAgICAgICAgICA9IFwiJWMlYyVjJWNcIlxuIiwgYXBlX2N0eC0+bWFnaWNbMF0sIGFwZV9jdHgtPm1hZ2ljWzFdLCBhcGVfY3R4LT5tYWdpY1syXSwgYXBlX2N0eC0+bWFnaWNbM10pOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJmaWxldmVyc2lvbiAgICAgICAgICA9ICUiUFJJZDE2IlxuIiwgYXBlX2N0eC0+ZmlsZXZlcnNpb24pOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJkZXNjcmlwdG9ybGVuZ3RoICAgICA9ICUiUFJJdTMyIlxuIiwgYXBlX2N0eC0+ZGVzY3JpcHRvcmxlbmd0aCk7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImhlYWRlcmxlbmd0aCAgICAgICAgID0gJSJQUkl1MzIiXG4iLCBhcGVfY3R4LT5oZWFkZXJsZW5ndGgpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJzZWVrdGFibGVsZW5ndGggICAgICA9ICUiUFJJdTMyIlxuIiwgYXBlX2N0eC0+c2Vla3RhYmxlbGVuZ3RoKTsKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAid2F2aGVhZGVybGVuZ3RoICAgICAgPSAlIlBSSXUzMiJcbiIsIGFwZV9jdHgtPndhdmhlYWRlcmxlbmd0aCk7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImF1ZGlvZGF0YWxlbmd0aCAgICAgID0gJSJQUkl1MzIiXG4iLCBhcGVfY3R4LT5hdWRpb2RhdGFsZW5ndGgpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJhdWRpb2RhdGFsZW5ndGhfaGlnaCA9ICUiUFJJdTMyIlxuIiwgYXBlX2N0eC0+YXVkaW9kYXRhbGVuZ3RoX2hpZ2gpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJ3YXZ0YWlsbGVuZ3RoICAgICAgICA9ICUiUFJJdTMyIlxuIiwgYXBlX2N0eC0+d2F2dGFpbGxlbmd0aCk7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIm1kNSAgICAgICAgICAgICAgICAgID0gIik7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiJTAyeCIsIGFwZV9jdHgtPm1kNVtpXSk7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIlxuIik7CisKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiXG5IZWFkZXIgQmxvY2s6XG5cbiIpOworCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImNvbXByZXNzaW9udHlwZSAgICAgID0gJSJQUkl1MTYiXG4iLCBhcGVfY3R4LT5jb21wcmVzc2lvbnR5cGUpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJmb3JtYXRmbGFncyAgICAgICAgICA9ICUiUFJJdTE2IlxuIiwgYXBlX2N0eC0+Zm9ybWF0ZmxhZ3MpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJibG9ja3NwZXJmcmFtZSAgICAgICA9ICUiUFJJdTMyIlxuIiwgYXBlX2N0eC0+YmxvY2tzcGVyZnJhbWUpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJmaW5hbGZyYW1lYmxvY2tzICAgICA9ICUiUFJJdTMyIlxuIiwgYXBlX2N0eC0+ZmluYWxmcmFtZWJsb2Nrcyk7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInRvdGFsZnJhbWVzICAgICAgICAgID0gJSJQUkl1MzIiXG4iLCBhcGVfY3R4LT50b3RhbGZyYW1lcyk7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImJwcyAgICAgICAgICAgICAgICAgID0gJSJQUkl1MTYiXG4iLCBhcGVfY3R4LT5icHMpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJjaGFubmVscyAgICAgICAgICAgICA9ICUiUFJJdTE2IlxuIiwgYXBlX2N0eC0+Y2hhbm5lbHMpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJzYW1wbGVyYXRlICAgICAgICAgICA9ICUiUFJJdTMyIlxuIiwgYXBlX2N0eC0+c2FtcGxlcmF0ZSk7CisKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiXG5TZWVrdGFibGVcblxuIik7CisgICAgaWYgKChhcGVfY3R4LT5zZWVrdGFibGVsZW5ndGggLyBzaXplb2YodWludDMyX3QpKSAhPSBhcGVfY3R4LT50b3RhbGZyYW1lcykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiTm8gc2Vla3RhYmxlXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXBlX2N0eC0+c2Vla3RhYmxlbGVuZ3RoIC8gc2l6ZW9mKHVpbnQzMl90KTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA8IGFwZV9jdHgtPnRvdGFsZnJhbWVzIC0gMSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICIlOGQgICAlIlBSSXUzMiIgKCUiUFJJdTMyIiBieXRlcykiLAorICAgICAgICAgICAgICAgICAgICAgICBpLCBhcGVfY3R4LT5zZWVrdGFibGVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgIGFwZV9jdHgtPnNlZWt0YWJsZVtpICsgMV0gLSBhcGVfY3R4LT5zZWVrdGFibGVbaV0pOworICAgICAgICAgICAgICAgIGlmIChhcGVfY3R4LT5iaXR0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIiArICUyZCBiaXRzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBlX2N0eC0+Yml0dGFibGVbaV0pOworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiJThkICAgJSJQUkl1MzIiXG4iLCBpLCBhcGVfY3R4LT5zZWVrdGFibGVbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIlxuRnJhbWVzXG5cbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBhcGVfY3R4LT50b3RhbGZyYW1lczsgaSsrKQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiJThkICAgJTgiUFJJZDY0IiAlOGQgKCVkIHNhbXBsZXMpXG4iLCBpLAorICAgICAgICAgICAgICAgYXBlX2N0eC0+ZnJhbWVzW2ldLnBvcywgYXBlX2N0eC0+ZnJhbWVzW2ldLnNpemUsCisgICAgICAgICAgICAgICBhcGVfY3R4LT5mcmFtZXNbaV0ubmJsb2Nrcyk7CisKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiXG5DYWxjdWxhdGVkIGluZm9ybWF0aW9uOlxuXG4iKTsKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAianVua2xlbmd0aCAgICAgICAgICAgPSAlIlBSSXUzMiJcbiIsIGFwZV9jdHgtPmp1bmtsZW5ndGgpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJmaXJzdGZyYW1lICAgICAgICAgICA9ICUiUFJJdTMyIlxuIiwgYXBlX2N0eC0+Zmlyc3RmcmFtZSk7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInRvdGFsc2FtcGxlcyAgICAgICAgID0gJSJQUkl1MzIiXG4iLCBhcGVfY3R4LT50b3RhbHNhbXBsZXMpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgYXBlX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqIHMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVBFQ29udGV4dCAqYXBlID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgaW50IGk7CisgICAgaW50IHRvdGFsX2Jsb2NrcywgZmluYWxfc2l6ZSA9IDA7CisgICAgaW50NjRfdCBwdHMsIGZpbGVfc2l6ZTsKKworICAgIC8qIFNraXAgYW55IGxlYWRpbmcganVuayBzdWNoIGFzIGlkM3YyIHRhZ3MgKi8KKyAgICBhcGUtPmp1bmtsZW5ndGggPSBhdmlvX3RlbGwocGIpOworCisgICAgdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZiAodGFnICE9IE1LVEFHKCdNJywgJ0EnLCAnQycsICcgJykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYXBlLT5maWxldmVyc2lvbiA9IGF2aW9fcmwxNihwYik7CisKKyAgICBpZiAoYXBlLT5maWxldmVyc2lvbiA8IEFQRV9NSU5fVkVSU0lPTiB8fCBhcGUtPmZpbGV2ZXJzaW9uID4gQVBFX01BWF9WRVJTSU9OKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBmaWxlIHZlcnNpb24gLSAlZC4lMDJkXG4iLAorICAgICAgICAgICAgICAgYXBlLT5maWxldmVyc2lvbiAvIDEwMDAsIChhcGUtPmZpbGV2ZXJzaW9uICUgMTAwMCkgLyAxMCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoYXBlLT5maWxldmVyc2lvbiA+PSAzOTgwKSB7CisgICAgICAgIGFwZS0+cGFkZGluZzEgICAgICAgICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICBhcGUtPmRlc2NyaXB0b3JsZW5ndGggICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgYXBlLT5oZWFkZXJsZW5ndGggICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGFwZS0+c2Vla3RhYmxlbGVuZ3RoICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBhcGUtPndhdmhlYWRlcmxlbmd0aCAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgYXBlLT5hdWRpb2RhdGFsZW5ndGggICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGFwZS0+YXVkaW9kYXRhbGVuZ3RoX2hpZ2ggPSBhdmlvX3JsMzIocGIpOworICAgICAgICBhcGUtPndhdnRhaWxsZW5ndGggICAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgYXZpb19yZWFkKHBiLCBhcGUtPm1kNSwgMTYpOworCisgICAgICAgIC8qIFNraXAgYW55IHVua25vd24gYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgZGVzY3JpcHRvci4KKyAgICAgICAgICAgVGhpcyBpcyBmb3IgZnV0dXJlIGNvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgaWYgKGFwZS0+ZGVzY3JpcHRvcmxlbmd0aCA+IDUyKQorICAgICAgICAgICAgYXZpb19za2lwKHBiLCBhcGUtPmRlc2NyaXB0b3JsZW5ndGggLSA1Mik7CisKKyAgICAgICAgLyogUmVhZCBoZWFkZXIgZGF0YSAqLworICAgICAgICBhcGUtPmNvbXByZXNzaW9udHlwZSAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgYXBlLT5mb3JtYXRmbGFncyAgICAgICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIGFwZS0+YmxvY2tzcGVyZnJhbWUgICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBhcGUtPmZpbmFsZnJhbWVibG9ja3MgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgYXBlLT50b3RhbGZyYW1lcyAgICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGFwZS0+YnBzICAgICAgICAgICAgICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICBhcGUtPmNoYW5uZWxzICAgICAgICAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgYXBlLT5zYW1wbGVyYXRlICAgICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXBlLT5kZXNjcmlwdG9ybGVuZ3RoID0gMDsKKyAgICAgICAgYXBlLT5oZWFkZXJsZW5ndGggPSAzMjsKKworICAgICAgICBhcGUtPmNvbXByZXNzaW9udHlwZSAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgYXBlLT5mb3JtYXRmbGFncyAgICAgICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIGFwZS0+Y2hhbm5lbHMgICAgICAgICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICBhcGUtPnNhbXBsZXJhdGUgICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgYXBlLT53YXZoZWFkZXJsZW5ndGggICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGFwZS0+d2F2dGFpbGxlbmd0aCAgICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBhcGUtPnRvdGFsZnJhbWVzICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgYXBlLT5maW5hbGZyYW1lYmxvY2tzICAgICA9IGF2aW9fcmwzMihwYik7CisKKyAgICAgICAgaWYgKGFwZS0+Zm9ybWF0ZmxhZ3MgJiBNQUNfRk9STUFUX0ZMQUdfSEFTX1BFQUtfTEVWRUwpIHsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7IC8qIFNraXAgdGhlIHBlYWsgbGV2ZWwgKi8KKyAgICAgICAgICAgIGFwZS0+aGVhZGVybGVuZ3RoICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXBlLT5mb3JtYXRmbGFncyAmIE1BQ19GT1JNQVRfRkxBR19IQVNfU0VFS19FTEVNRU5UUykgeworICAgICAgICAgICAgYXBlLT5zZWVrdGFibGVsZW5ndGggPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgYXBlLT5oZWFkZXJsZW5ndGggKz0gNDsKKyAgICAgICAgICAgIGFwZS0+c2Vla3RhYmxlbGVuZ3RoICo9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhcGUtPnNlZWt0YWJsZWxlbmd0aCA9IGFwZS0+dG90YWxmcmFtZXMgKiBzaXplb2YoaW50MzJfdCk7CisKKyAgICAgICAgaWYgKGFwZS0+Zm9ybWF0ZmxhZ3MgJiBNQUNfRk9STUFUX0ZMQUdfOF9CSVQpCisgICAgICAgICAgICBhcGUtPmJwcyA9IDg7CisgICAgICAgIGVsc2UgaWYgKGFwZS0+Zm9ybWF0ZmxhZ3MgJiBNQUNfRk9STUFUX0ZMQUdfMjRfQklUKQorICAgICAgICAgICAgYXBlLT5icHMgPSAyNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXBlLT5icHMgPSAxNjsKKworICAgICAgICBpZiAoYXBlLT5maWxldmVyc2lvbiA+PSAzOTUwKQorICAgICAgICAgICAgYXBlLT5ibG9ja3NwZXJmcmFtZSA9IDczNzI4ICogNDsKKyAgICAgICAgZWxzZSBpZiAoYXBlLT5maWxldmVyc2lvbiA+PSAzOTAwIHx8IChhcGUtPmZpbGV2ZXJzaW9uID49IDM4MDAgICYmIGFwZS0+Y29tcHJlc3Npb250eXBlID49IDQwMDApKQorICAgICAgICAgICAgYXBlLT5ibG9ja3NwZXJmcmFtZSA9IDczNzI4OworICAgICAgICBlbHNlCisgICAgICAgICAgICBhcGUtPmJsb2Nrc3BlcmZyYW1lID0gOTIxNjsKKworICAgICAgICAvKiBTa2lwIGFueSBzdG9yZWQgd2F2IGhlYWRlciAqLworICAgICAgICBpZiAoIShhcGUtPmZvcm1hdGZsYWdzICYgTUFDX0ZPUk1BVF9GTEFHX0NSRUFURV9XQVZfSEVBREVSKSkKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgYXBlLT53YXZoZWFkZXJsZW5ndGgpOworICAgIH0KKworICAgIGlmKCFhcGUtPnRvdGFsZnJhbWVzKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vIGZyYW1lcyBpbiB0aGUgZmlsZSFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZihhcGUtPnRvdGFsZnJhbWVzID4gVUlOVF9NQVggLyBzaXplb2YoQVBFRnJhbWUpKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IGZyYW1lczogJSJQUkl1MzIiXG4iLAorICAgICAgICAgICAgICAgYXBlLT50b3RhbGZyYW1lcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoYXBlLT5zZWVrdGFibGVsZW5ndGggLyBzaXplb2YoKmFwZS0+c2Vla3RhYmxlKSA8IGFwZS0+dG90YWxmcmFtZXMpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJOdW1iZXIgb2Ygc2VlayBlbnRyaWVzIGlzIGxlc3MgdGhhbiBudW1iZXIgb2YgZnJhbWVzOiAlIlNJWkVfU1BFQ0lGSUVSIiB2cy4gJSJQUkl1MzIiXG4iLAorICAgICAgICAgICAgICAgYXBlLT5zZWVrdGFibGVsZW5ndGggLyBzaXplb2YoKmFwZS0+c2Vla3RhYmxlKSwgYXBlLT50b3RhbGZyYW1lcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhcGUtPmZyYW1lcyAgICAgICA9IGF2X21hbGxvYyhhcGUtPnRvdGFsZnJhbWVzICogc2l6ZW9mKEFQRUZyYW1lKSk7CisgICAgaWYoIWFwZS0+ZnJhbWVzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGFwZS0+Zmlyc3RmcmFtZSAgID0gYXBlLT5qdW5rbGVuZ3RoICsgYXBlLT5kZXNjcmlwdG9ybGVuZ3RoICsgYXBlLT5oZWFkZXJsZW5ndGggKyBhcGUtPnNlZWt0YWJsZWxlbmd0aCArIGFwZS0+d2F2aGVhZGVybGVuZ3RoOworICAgIGlmIChhcGUtPmZpbGV2ZXJzaW9uIDwgMzgxMCkKKyAgICAgICAgYXBlLT5maXJzdGZyYW1lICs9IGFwZS0+dG90YWxmcmFtZXM7CisgICAgYXBlLT5jdXJyZW50ZnJhbWUgPSAwOworCisKKyAgICBhcGUtPnRvdGFsc2FtcGxlcyA9IGFwZS0+ZmluYWxmcmFtZWJsb2NrczsKKyAgICBpZiAoYXBlLT50b3RhbGZyYW1lcyA+IDEpCisgICAgICAgIGFwZS0+dG90YWxzYW1wbGVzICs9IGFwZS0+YmxvY2tzcGVyZnJhbWUgKiAoYXBlLT50b3RhbGZyYW1lcyAtIDEpOworCisgICAgaWYgKGFwZS0+c2Vla3RhYmxlbGVuZ3RoID4gMCkgeworICAgICAgICBhcGUtPnNlZWt0YWJsZSA9IGF2X21hbGxvY3ooYXBlLT5zZWVrdGFibGVsZW5ndGgpOworICAgICAgICBpZiAoIWFwZS0+c2Vla3RhYmxlKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFwZS0+c2Vla3RhYmxlbGVuZ3RoIC8gc2l6ZW9mKHVpbnQzMl90KSAmJiAhcGItPmVvZl9yZWFjaGVkOyBpKyspCisgICAgICAgICAgICBhcGUtPnNlZWt0YWJsZVtpXSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGlmIChhcGUtPmZpbGV2ZXJzaW9uIDwgMzgxMCkgeworICAgICAgICAgICAgYXBlLT5iaXR0YWJsZSA9IGF2X21hbGxvY3ooYXBlLT50b3RhbGZyYW1lcyk7CisgICAgICAgICAgICBpZiAoIWFwZS0+Yml0dGFibGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcGUtPnRvdGFsZnJhbWVzICYmICFwYi0+ZW9mX3JlYWNoZWQ7IGkrKykKKyAgICAgICAgICAgICAgICBhcGUtPmJpdHRhYmxlW2ldID0gYXZpb19yOChwYik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkZpbGUgdHJ1bmNhdGVkXG4iKTsKKyAgICB9CisKKyAgICBhcGUtPmZyYW1lc1swXS5wb3MgICAgID0gYXBlLT5maXJzdGZyYW1lOworICAgIGFwZS0+ZnJhbWVzWzBdLm5ibG9ja3MgPSBhcGUtPmJsb2Nrc3BlcmZyYW1lOworICAgIGFwZS0+ZnJhbWVzWzBdLnNraXAgICAgPSAwOworICAgIGZvciAoaSA9IDE7IGkgPCBhcGUtPnRvdGFsZnJhbWVzOyBpKyspIHsKKyAgICAgICAgYXBlLT5mcmFtZXNbaV0ucG9zICAgICAgPSBhcGUtPnNlZWt0YWJsZVtpXSArIGFwZS0+anVua2xlbmd0aDsKKyAgICAgICAgYXBlLT5mcmFtZXNbaV0ubmJsb2NrcyAgPSBhcGUtPmJsb2Nrc3BlcmZyYW1lOworICAgICAgICBhcGUtPmZyYW1lc1tpIC0gMV0uc2l6ZSA9IGFwZS0+ZnJhbWVzW2ldLnBvcyAtIGFwZS0+ZnJhbWVzW2kgLSAxXS5wb3M7CisgICAgICAgIGFwZS0+ZnJhbWVzW2ldLnNraXAgICAgID0gKGFwZS0+ZnJhbWVzW2ldLnBvcyAtIGFwZS0+ZnJhbWVzWzBdLnBvcykgJiAzOworICAgIH0KKyAgICBhcGUtPmZyYW1lc1thcGUtPnRvdGFsZnJhbWVzIC0gMV0ubmJsb2NrcyA9IGFwZS0+ZmluYWxmcmFtZWJsb2NrczsKKyAgICAvKiBjYWxjdWxhdGUgZmluYWwgcGFja2V0IHNpemUgZnJvbSB0b3RhbCBmaWxlIHNpemUsIGlmIGF2YWlsYWJsZSAqLworICAgIGZpbGVfc2l6ZSA9IGF2aW9fc2l6ZShwYik7CisgICAgaWYgKGZpbGVfc2l6ZSA+IDApIHsKKyAgICAgICAgZmluYWxfc2l6ZSA9IGZpbGVfc2l6ZSAtIGFwZS0+ZnJhbWVzW2FwZS0+dG90YWxmcmFtZXMgLSAxXS5wb3MgLQorICAgICAgICAgICAgICAgICAgICAgYXBlLT53YXZ0YWlsbGVuZ3RoOworICAgICAgICBmaW5hbF9zaXplIC09IGZpbmFsX3NpemUgJiAzOworICAgIH0KKyAgICBpZiAoZmlsZV9zaXplIDw9IDAgfHwgZmluYWxfc2l6ZSA8PSAwKQorICAgICAgICBmaW5hbF9zaXplID0gYXBlLT5maW5hbGZyYW1lYmxvY2tzICogODsKKyAgICBhcGUtPmZyYW1lc1thcGUtPnRvdGFsZnJhbWVzIC0gMV0uc2l6ZSA9IGZpbmFsX3NpemU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXBlLT50b3RhbGZyYW1lczsgaSsrKSB7CisgICAgICAgIGlmKGFwZS0+ZnJhbWVzW2ldLnNraXApeworICAgICAgICAgICAgYXBlLT5mcmFtZXNbaV0ucG9zICAtPSBhcGUtPmZyYW1lc1tpXS5za2lwOworICAgICAgICAgICAgYXBlLT5mcmFtZXNbaV0uc2l6ZSArPSBhcGUtPmZyYW1lc1tpXS5za2lwOworICAgICAgICB9CisgICAgICAgIGFwZS0+ZnJhbWVzW2ldLnNpemUgPSAoYXBlLT5mcmFtZXNbaV0uc2l6ZSArIDMpICYgfjM7CisgICAgfQorICAgIGlmIChhcGUtPmZpbGV2ZXJzaW9uIDwgMzgxMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXBlLT50b3RhbGZyYW1lczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA8IGFwZS0+dG90YWxmcmFtZXMgLSAxICYmIGFwZS0+Yml0dGFibGVbaSArIDFdKQorICAgICAgICAgICAgICAgIGFwZS0+ZnJhbWVzW2ldLnNpemUgKz0gNDsKKyAgICAgICAgICAgIGFwZS0+ZnJhbWVzW2ldLnNraXAgPDw9IDM7CisgICAgICAgICAgICBhcGUtPmZyYW1lc1tpXS5za2lwICArPSBhcGUtPmJpdHRhYmxlW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgYXBlX2R1bXBpbmZvKHMsIGFwZSk7CisKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiRGVjb2RpbmcgZmlsZSAtIHYlZC4lMDJkLCBjb21wcmVzc2lvbiBsZXZlbCAlIlBSSXUxNiJcbiIsCisgICAgICAgICAgIGFwZS0+ZmlsZXZlcnNpb24gLyAxMDAwLCAoYXBlLT5maWxldmVyc2lvbiAlIDEwMDApIC8gMTAsCisgICAgICAgICAgIGFwZS0+Y29tcHJlc3Npb250eXBlKTsKKworICAgIC8qIG5vdyB3ZSBhcmUgcmVhZHk6IGJ1aWxkIGZvcm1hdCBzdHJlYW1zICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB0b3RhbF9ibG9ja3MgPSAoYXBlLT50b3RhbGZyYW1lcyA9PSAwKSA/IDAgOiAoKGFwZS0+dG90YWxmcmFtZXMgLSAxKSAqIGFwZS0+YmxvY2tzcGVyZnJhbWUpICsgYXBlLT5maW5hbGZyYW1lYmxvY2tzOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BUEU7CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICAgICAgPSBNS1RBRygnQScsICdQJywgJ0UnLCAnICcpOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgID0gYXBlLT5jaGFubmVsczsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgICA9IGFwZS0+c2FtcGxlcmF0ZTsKKyAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGFwZS0+YnBzOworCisgICAgc3QtPm5iX2ZyYW1lcyA9IGFwZS0+dG90YWxmcmFtZXM7CisgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOworICAgIHN0LT5kdXJhdGlvbiAgPSB0b3RhbF9ibG9ja3M7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGFwZS0+c2FtcGxlcmF0ZSk7CisKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgQVBFX0VYVFJBREFUQV9TSVpFKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBBVl9XTDE2KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMCwgYXBlLT5maWxldmVyc2lvbik7CisgICAgQVZfV0wxNihzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIsIGFwZS0+Y29tcHJlc3Npb250eXBlKTsKKyAgICBBVl9XTDE2KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgNCwgYXBlLT5mb3JtYXRmbGFncyk7CisKKyAgICBwdHMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBhcGUtPnRvdGFsZnJhbWVzOyBpKyspIHsKKyAgICAgICAgYXBlLT5mcmFtZXNbaV0ucHRzID0gcHRzOworICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIGFwZS0+ZnJhbWVzW2ldLnBvcywgYXBlLT5mcmFtZXNbaV0ucHRzLCAwLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKKyAgICAgICAgcHRzICs9IGFwZS0+YmxvY2tzcGVyZnJhbWU7CisgICAgfQorCisgICAgLyogdHJ5IHRvIHJlYWQgQVBFIHRhZ3MgKi8KKyAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIGZmX2FwZV9wYXJzZV90YWcocyk7CisgICAgICAgIGF2aW9fc2VlayhwYiwgMCwgU0VFS19TRVQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwZV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKiBzLCBBVlBhY2tldCAqIHBrdCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCBuYmxvY2tzOworICAgIEFQRUNvbnRleHQgKmFwZSA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50MzJfdCBleHRyYV9zaXplID0gODsKKworICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgaWYgKGFwZS0+Y3VycmVudGZyYW1lID49IGFwZS0+dG90YWxmcmFtZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGlmIChhdmlvX3NlZWsocy0+cGIsIGFwZS0+ZnJhbWVzW2FwZS0+Y3VycmVudGZyYW1lXS5wb3MsIFNFRUtfU0VUKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAvKiBDYWxjdWxhdGUgaG93IG1hbnkgYmxvY2tzIHRoZXJlIGFyZSBpbiB0aGlzIGZyYW1lICovCisgICAgaWYgKGFwZS0+Y3VycmVudGZyYW1lID09IChhcGUtPnRvdGFsZnJhbWVzIC0gMSkpCisgICAgICAgIG5ibG9ja3MgPSBhcGUtPmZpbmFsZnJhbWVibG9ja3M7CisgICAgZWxzZQorICAgICAgICBuYmxvY2tzID0gYXBlLT5ibG9ja3NwZXJmcmFtZTsKKworICAgIGlmIChhcGUtPmZyYW1lc1thcGUtPmN1cnJlbnRmcmFtZV0uc2l6ZSA8PSAwIHx8CisgICAgICAgIGFwZS0+ZnJhbWVzW2FwZS0+Y3VycmVudGZyYW1lXS5zaXplID4gSU5UX01BWCAtIGV4dHJhX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgcGFja2V0IHNpemU6ICVkXG4iLAorICAgICAgICAgICAgICAgYXBlLT5mcmFtZXNbYXBlLT5jdXJyZW50ZnJhbWVdLnNpemUpOworICAgICAgICBhcGUtPmN1cnJlbnRmcmFtZSsrOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgIGFwZS0+ZnJhbWVzW2FwZS0+Y3VycmVudGZyYW1lXS5zaXplICsgZXh0cmFfc2l6ZSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgQVZfV0wzMihwa3QtPmRhdGEgICAgLCBuYmxvY2tzKTsKKyAgICBBVl9XTDMyKHBrdC0+ZGF0YSArIDQsIGFwZS0+ZnJhbWVzW2FwZS0+Y3VycmVudGZyYW1lXS5za2lwKTsKKyAgICByZXQgPSBhdmlvX3JlYWQocy0+cGIsIHBrdC0+ZGF0YSArIGV4dHJhX3NpemUsIGFwZS0+ZnJhbWVzW2FwZS0+Y3VycmVudGZyYW1lXS5zaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHBrdC0+cHRzID0gYXBlLT5mcmFtZXNbYXBlLT5jdXJyZW50ZnJhbWVdLnB0czsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisKKyAgICAvKiBub3RlOiB3ZSBuZWVkIHRvIG1vZGlmeSB0aGUgcGFja2V0IHNpemUgaGVyZSB0byBoYW5kbGUgdGhlIGxhc3QKKyAgICAgICBwYWNrZXQgKi8KKyAgICBwa3QtPnNpemUgPSByZXQgKyBleHRyYV9zaXplOworCisgICAgYXBlLT5jdXJyZW50ZnJhbWUrKzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwZV9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqIHMpCit7CisgICAgQVBFQ29udGV4dCAqYXBlID0gcy0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmFwZS0+ZnJhbWVzKTsKKyAgICBhdl9mcmVlcCgmYXBlLT5zZWVrdGFibGUpOworICAgIGF2X2ZyZWVwKCZhcGUtPmJpdHRhYmxlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcGVfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgQVBFQ29udGV4dCAqYXBlID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpbmRleCA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QsIHRpbWVzdGFtcCwgZmxhZ3MpOworCisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgc3QtPmluZGV4X2VudHJpZXNbaW5kZXhdLnBvcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGFwZS0+Y3VycmVudGZyYW1lID0gaW5kZXg7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYXBlX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFwZSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1vbmtleSdzIEF1ZGlvIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFQRUNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGFwZV9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhcGVfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gYXBlX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGFwZV9yZWFkX2Nsb3NlLAorICAgIC5yZWFkX3NlZWsgICAgICA9IGFwZV9yZWFkX3NlZWssCisgICAgLmV4dGVuc2lvbnMgICAgID0gImFwZSxhcGwsbWFjIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXBldGFnLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXBldGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkMWJkYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hcGV0YWcuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIEFQRSB0YWcgaGFuZGxpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCZW5qYW1pbiBab3JlcyA8YmVuQGdlZXhib3gub3JnPgorICogIGJhc2VkIHVwb24gbGliZGVtYWMgZnJvbSBEYXZlIENoYXBtYW4uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXBldGFnLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBBUEVfVEFHX0ZMQUdfQ09OVEFJTlNfSEVBREVSICAoMSA8PCAzMSkKKyNkZWZpbmUgQVBFX1RBR19GTEFHX0NPTlRBSU5TX0ZPT1RFUiAgKDEgPDwgMzApCisjZGVmaW5lIEFQRV9UQUdfRkxBR19JU19IRUFERVIgICAgICAgICgxIDw8IDI5KQorI2RlZmluZSBBUEVfVEFHX0ZMQUdfSVNfQklOQVJZICAgICAgICAoMSA8PCAxKQorCitzdGF0aWMgaW50IGFwZV90YWdfcmVhZF9maWVsZChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgdWludDhfdCBrZXlbMTAyNF0sICp2YWx1ZTsKKyAgICB1aW50MzJfdCBzaXplLCBmbGFnczsKKyAgICBpbnQgaSwgYzsKKworICAgIHNpemUgPSBhdmlvX3JsMzIocGIpOyAgLyogZmllbGQgc2l6ZSAqLworICAgIGZsYWdzID0gYXZpb19ybDMyKHBiKTsgLyogZmllbGQgZmxhZ3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGtleSkgLSAxOyBpKyspIHsKKyAgICAgICAgYyA9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAoYyA8IDB4MjAgfHwgYyA+IDB4N0UpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAga2V5W2ldID0gYzsKKyAgICB9CisgICAga2V5W2ldID0gMDsKKyAgICBpZiAoYyAhPSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgQVBFIHRhZyBrZXkgJyVzJy5cbiIsIGtleSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHNpemUgPiBJTlQzMl9NQVggLSBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBUEUgdGFnIHNpemUgdG9vIGxhcmdlLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBBUEVfVEFHX0ZMQUdfSVNfQklOQVJZKSB7CisgICAgICAgIHVpbnQ4X3QgZmlsZW5hbWVbMTAyNF07CisgICAgICAgIGVudW0gQVZDb2RlY0lEIGlkOworICAgICAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBzaXplIC09IGF2aW9fZ2V0X3N0cihwYiwgc2l6ZSwgZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSkpOworICAgICAgICBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJTa2lwcGluZyBiaW5hcnkgdGFnICclcycuXG4iLCBrZXkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCBrZXksIGZpbGVuYW1lLCAwKTsKKworICAgICAgICBpZiAoKGlkID0gZmZfZ3Vlc3NfaW1hZ2UyX2NvZGVjKGZpbGVuYW1lKSkgIT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgQVZQYWNrZXQgcGt0OworICAgICAgICAgICAgaW50IHJldDsKKworICAgICAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgJnBrdCwgc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFcnJvciByZWFkaW5nIGNvdmVyIGFydC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiAgICAgIHw9IEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQzsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGlkOworCisgICAgICAgICAgICBzdC0+YXR0YWNoZWRfcGljICAgICAgICAgICAgICA9IHBrdDsKKyAgICAgICAgICAgIHN0LT5hdHRhY2hlZF9waWMuc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgICAgICAgICAgc3QtPmF0dGFjaGVkX3BpYy5mbGFncyAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzdC0+Y29kZWMsIHMtPnBiLCBzaXplKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWUgPSBhdl9tYWxsb2Moc2l6ZSsxKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGMgPSBhdmlvX3JlYWQocGIsIHZhbHVlLCBzaXplKTsKKyAgICAgICAgaWYgKGMgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgICAgIHZhbHVlW2NdID0gMDsKKyAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBrZXksIHZhbHVlLCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQ2NF90IGZmX2FwZV9wYXJzZV90YWcoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludDY0X3QgZmlsZV9zaXplID0gYXZpb19zaXplKHBiKTsKKyAgICB1aW50MzJfdCB2YWwsIGZpZWxkcywgdGFnX2J5dGVzOworICAgIHVpbnQ4X3QgYnVmWzhdOworICAgIGludDY0X3QgdGFnX3N0YXJ0OworICAgIGludCBpOworCisgICAgaWYgKGZpbGVfc2l6ZSA8IEFQRV9UQUdfRk9PVEVSX0JZVEVTKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF2aW9fc2VlayhwYiwgZmlsZV9zaXplIC0gQVBFX1RBR19GT09URVJfQllURVMsIFNFRUtfU0VUKTsKKworICAgIGF2aW9fcmVhZChwYiwgYnVmLCA4KTsgICAgIC8qIEFQRVRBR0VYICovCisgICAgaWYgKHN0cm5jbXAoYnVmLCBBUEVfVEFHX1BSRUFNQkxFLCA4KSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2YWwgPSBhdmlvX3JsMzIocGIpOyAgICAgICAvKiBBUEUgdGFnIHZlcnNpb24gKi8KKyAgICBpZiAodmFsID4gQVBFX1RBR19WRVJTSU9OKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCB0YWcgdmVyc2lvbi4gKD49JWQpXG4iLCBBUEVfVEFHX1ZFUlNJT04pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB0YWdfYnl0ZXMgPSBhdmlvX3JsMzIocGIpOyAvKiB0YWcgc2l6ZSAqLworICAgIGlmICh0YWdfYnl0ZXMgLSBBUEVfVEFHX0ZPT1RFUl9CWVRFUyA+ICgxMDI0ICogMTAyNCAqIDE2KSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVGFnIHNpemUgaXMgd2F5IHRvbyBiaWdcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAodGFnX2J5dGVzID4gZmlsZV9zaXplIC0gQVBFX1RBR19GT09URVJfQllURVMpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdGFnIHNpemUgJSJQUkl1MzIiLlxuIiwgdGFnX2J5dGVzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHRhZ19zdGFydCA9IGZpbGVfc2l6ZSAtIHRhZ19ieXRlcyAtIEFQRV9UQUdfRk9PVEVSX0JZVEVTOworCisgICAgZmllbGRzID0gYXZpb19ybDMyKHBiKTsgICAgLyogbnVtYmVyIG9mIGZpZWxkcyAqLworICAgIGlmIChmaWVsZHMgPiA2NTUzNikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgdGFnIGZpZWxkcyAoJSJQUkl1MzIiKVxuIiwgZmllbGRzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmFsID0gYXZpb19ybDMyKHBiKTsgICAgICAgLyogZmxhZ3MgKi8KKyAgICBpZiAodmFsICYgQVBFX1RBR19GTEFHX0lTX0hFQURFUikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQVBFIFRhZyBpcyBhIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGF2aW9fc2VlayhwYiwgZmlsZV9zaXplIC0gdGFnX2J5dGVzLCBTRUVLX1NFVCk7CisKKyAgICBmb3IgKGk9MDsgaTxmaWVsZHM7IGkrKykKKyAgICAgICAgaWYgKGFwZV90YWdfcmVhZF9maWVsZChzKSA8IDApIGJyZWFrOworCisgICAgcmV0dXJuIHRhZ19zdGFydDsKK30KKworc3RhdGljIGludCBzdHJpbmdfaXNfYXNjaWkoY29uc3QgdWludDhfdCAqc3RyKQoreworICAgIHdoaWxlICgqc3RyICYmICpzdHIgPj0gMHgyMCAmJiAqc3RyIDw9IDB4N2UgKSBzdHIrKzsKKyAgICByZXR1cm4gISpzdHI7Cit9CisKK2ludCBmZl9hcGVfd3JpdGVfdGFnKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IE5VTEw7CisgICAgaW50IHNpemUsIHJldCwgY291bnQgPSAwOworICAgIEFWSU9Db250ZXh0ICpkeW5fYmMgPSBOVUxMOworICAgIHVpbnQ4X3QgKmR5bl9idWYgPSBOVUxMOworCisgICAgaWYgKChyZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmZHluX2JjKSkgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIC8vIGZsYWdzCisgICAgYXZpb193bDMyKGR5bl9iYywgQVBFX1RBR19GTEFHX0NPTlRBSU5TX0hFQURFUiB8IEFQRV9UQUdfRkxBR19DT05UQUlOU19GT09URVIgfAorICAgICAgICAgICAgICAgICAgICAgQVBFX1RBR19GTEFHX0lTX0hFQURFUik7CisgICAgZmZpb19maWxsKGR5bl9iYywgMCwgOCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCisKKyAgICB3aGlsZSAoKGUgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgIiIsIGUsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgIGludCB2YWxfbGVuOworCisgICAgICAgIGlmICghc3RyaW5nX2lzX2FzY2lpKGUtPmtleSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIk5vbiBBU0NJSSBrZXlzIGFyZSBub3QgYWxsb3dlZFxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbF9sZW4gPSBzdHJsZW4oZS0+dmFsdWUpOworICAgICAgICBhdmlvX3dsMzIoZHluX2JjLCB2YWxfbGVuKTsgICAgICAgICAgICAvLyB2YWx1ZSBsZW5ndGgKKyAgICAgICAgYXZpb193bDMyKGR5bl9iYywgMCk7ICAgICAgICAgICAgICAgICAgLy8gaXRlbSBmbGFncworICAgICAgICBhdmlvX3B1dF9zdHIoZHluX2JjLCBlLT5rZXkpOyAgICAgICAgICAvLyBrZXkKKyAgICAgICAgYXZpb193cml0ZShkeW5fYmMsIGUtPnZhbHVlLCB2YWxfbGVuKTsgLy8gdmFsdWUKKyAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgaWYgKCFjb3VudCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBzaXplID0gYXZpb19jbG9zZV9keW5fYnVmKGR5bl9iYywgJmR5bl9idWYpOworICAgIGlmIChzaXplIDw9IDApCisgICAgICAgIGdvdG8gZW5kOworICAgIHNpemUgKz0gMjA7CisKKyAgICAvLyBoZWFkZXIKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCAiQVBFVEFHRVgiLCA4KTsgICAvLyBpZAorICAgIGF2aW9fd2wzMihzLT5wYiwgQVBFX1RBR19WRVJTSU9OKTsgIC8vIHZlcnNpb24KKyAgICBhdmlvX3dsMzIocy0+cGIsIHNpemUpOworICAgIGF2aW9fd2wzMihzLT5wYiwgY291bnQpOworCisgICAgYXZpb193cml0ZShzLT5wYiwgZHluX2J1Ziwgc2l6ZSAtIDIwKTsKKworICAgIC8vIGZvb3RlcgorICAgIGF2aW9fd3JpdGUocy0+cGIsICJBUEVUQUdFWCIsIDgpOyAgIC8vIGlkCisgICAgYXZpb193bDMyKHMtPnBiLCBBUEVfVEFHX1ZFUlNJT04pOyAgLy8gdmVyc2lvbgorICAgIGF2aW9fd2wzMihzLT5wYiwgc2l6ZSk7ICAgICAgICAgICAgIC8vIHNpemUKKyAgICBhdmlvX3dsMzIocy0+cGIsIGNvdW50KTsgICAgICAgICAgICAvLyB0YWcgY291bnQKKworICAgIC8vIGZsYWdzCisgICAgYXZpb193bDMyKHMtPnBiLCBBUEVfVEFHX0ZMQUdfQ09OVEFJTlNfSEVBREVSIHwgQVBFX1RBR19GTEFHX0NPTlRBSU5TX0ZPT1RFUik7CisgICAgZmZpb19maWxsKHMtPnBiLCAwLCA4KTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKworZW5kOgorICAgIGlmIChkeW5fYmMgJiYgIWR5bl9idWYpCisgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1ZihkeW5fYmMsICZkeW5fYnVmKTsKKyAgICBhdl9mcmVlcCgmZHluX2J1Zik7CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2FwZXRhZy5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FwZXRhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmE1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXBldGFnLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIEFQRSB0YWcgaGFuZGxpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCZW5qYW1pbiBab3JlcyA8YmVuQGdlZXhib3gub3JnPgorICogIGJhc2VkIHVwb24gbGliZGVtYWMgZnJvbSBEYXZlIENoYXBtYW4uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfQVBFVEFHX0gKKyNkZWZpbmUgQVZGT1JNQVRfQVBFVEFHX0gKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisKKyNkZWZpbmUgQVBFX1RBR19QUkVBTUJMRSAgICAgICAgIkFQRVRBR0VYIgorI2RlZmluZSBBUEVfVEFHX1ZFUlNJT04gICAgICAgICAyMDAwCisjZGVmaW5lIEFQRV9UQUdfRk9PVEVSX0JZVEVTICAgIDMyCisKKy8qKgorICogUmVhZCBhbmQgcGFyc2UgYW4gQVBFIHRhZworICoKKyAqIEByZXR1cm4gb2Zmc2V0IG9mIHRoZSB0YWcgc3RhcnQgaW4gdGhlIGZpbGUKKyAqLworaW50NjRfdCBmZl9hcGVfcGFyc2VfdGFnKEFWRm9ybWF0Q29udGV4dCAqcyk7CisKKy8qKgorICogV3JpdGUgYW4gQVBFIHRhZyBpbnRvIGEgZmlsZS4KKyAqLworaW50IGZmX2FwZV93cml0ZV90YWcoQVZGb3JtYXRDb250ZXh0ICpzKTsKKworI2VuZGlmIC8qIEFWRk9STUFUX0FQRVRBR19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXBuZ2RlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FwbmdkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTdiMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FwbmdkZWMuYwpAQCAtMCwwICsxLDQ0NiBAQAorLyoKKyAqIEFQTkcgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDE0IEJlbm9pdCBGb3VldAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBUE5HIGRlbXV4ZXIuCisgKiBAc2VlIGh0dHBzOi8vd2lraS5tb3ppbGxhLm9yZy9BUE5HX1NwZWNpZmljYXRpb24KKyAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvUE5HCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2FwbmcuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3BuZy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorCisjZGVmaW5lIERFRkFVTFRfQVBOR19GUFMgMTUKKwordHlwZWRlZiBzdHJ1Y3QgQVBOR0RlbXV4Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBpbnQgbWF4X2ZwczsKKyAgICBpbnQgZGVmYXVsdF9mcHM7CisKKyAgICBpbnQ2NF90IHBrdF9wdHM7CisgICAgaW50IHBrdF9kdXJhdGlvbjsKKworICAgIGludCBpc19rZXlfZnJhbWU7CisKKyAgICAvKgorICAgICAqIGxvb3Agb3B0aW9ucworICAgICAqLworICAgIGludCBpZ25vcmVfbG9vcDsKKyAgICB1aW50MzJfdCBudW1fZnJhbWVzOworICAgIHVpbnQzMl90IG51bV9wbGF5OworICAgIHVpbnQzMl90IGN1cl9sb29wOworfSBBUE5HRGVtdXhDb250ZXh0OworCisvKgorICogVG8gYmUgYSB2YWxpZCBBUE5HIGZpbGUsIHdlIG1hbmRhdGUsIGluIHRoaXMgb3JkZXI6CisgKiAgICAgUE5HU0lHCisgKiAgICAgSUhEUgorICogICAgIC4uLgorICogICAgIGFjVEwKKyAqICAgICAuLi4KKyAqICAgICBJREFUCisgKi8KK3N0YXRpYyBpbnQgYXBuZ19wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBpbnQgc3RhdGUgPSAwOworICAgIHVpbnQzMl90IGxlbiwgdGFnOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIHAtPmJ1ZiwgcC0+YnVmX3NpemUpOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9iZTY0KCZnYikgIT0gUE5HU0lHKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgbGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKyAgICAgICAgaWYgKGxlbiA+IDB4N2ZmZmZmZmYpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICB0YWcgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2IpOworICAgICAgICAvKiB3ZSBkb24ndCBjaGVjayBJREFUIHNpemUsIGFzIHRoaXMgaXMgdGhlIGxhc3QgdGFnCisgICAgICAgICAqIHdlIGNoZWNrLCBhbmQgaXQgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBwcm9iZSBidWZmZXIgKi8KKyAgICAgICAgaWYgKHRhZyAhPSBNS1RBRygnSScsICdEJywgJ0EnLCAnVCcpICYmCisgICAgICAgICAgICBsZW4gKyA0ID4gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHN3aXRjaCAodGFnKSB7CisgICAgICAgIGNhc2UgTUtUQUcoJ0knLCAnSCcsICdEJywgJ1InKToKKyAgICAgICAgICAgIGlmIChsZW4gIT0gMTMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZShieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpLCBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpLCAwLCBOVUxMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCA5KTsKKyAgICAgICAgICAgIHN0YXRlKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnYScsICdjJywgJ1QnLCAnTCcpOgorICAgICAgICAgICAgaWYgKHN0YXRlICE9IDEgfHwKKyAgICAgICAgICAgICAgICBsZW4gIT0gOCB8fAorICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYikgPT0gMCkgLyogMCBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgbnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDgpOworICAgICAgICAgICAgc3RhdGUrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdJJywgJ0QnLCAnQScsICdUJyk6CisgICAgICAgICAgICBpZiAoc3RhdGUgIT0gMikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogc2tpcCBvdGhlciB0YWdzICovCisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgbGVuICsgNCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworZW5kOgorICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKK30KKworc3RhdGljIGludCBhcHBlbmRfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIGludCBsZW4pCit7CisgICAgaW50IHByZXZpb3VzX3NpemUgPSBzLT5leHRyYWRhdGFfc2l6ZTsKKyAgICBpbnQgbmV3X3NpemUsIHJldDsKKyAgICB1aW50OF90ICpuZXdfZXh0cmFkYXRhOworCisgICAgaWYgKHByZXZpb3VzX3NpemUgPiBJTlRfTUFYIC0gbGVuKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIG5ld19zaXplID0gcHJldmlvdXNfc2l6ZSArIGxlbjsKKyAgICBuZXdfZXh0cmFkYXRhID0gYXZfcmVhbGxvYyhzLT5leHRyYWRhdGEsIG5ld19zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFuZXdfZXh0cmFkYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHMtPmV4dHJhZGF0YSA9IG5ld19leHRyYWRhdGE7CisgICAgcy0+ZXh0cmFkYXRhX3NpemUgPSBuZXdfc2l6ZTsKKworICAgIGlmICgocmV0ID0gYXZpb19yZWFkKHBiLCBzLT5leHRyYWRhdGEgKyBwcmV2aW91c19zaXplLCBsZW4pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gcHJldmlvdXNfc2l6ZTsKK30KKworc3RhdGljIGludCBhcG5nX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBUE5HRGVtdXhDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgdWludDMyX3QgbGVuLCB0YWc7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBLCBhY1RMX2ZvdW5kID0gMDsKKworICAgIC8qIHZlcmlmeSBQTkdTSUcgKi8KKyAgICBpZiAoYXZpb19yYjY0KHBiKSAhPSBQTkdTSUcpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBwYXJzZSBJSERSIChtdXN0IGJlIGZpcnN0IGNodW5rKSAqLworICAgIGxlbiA9IGF2aW9fcmIzMihwYik7CisgICAgdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZiAobGVuICE9IDEzIHx8IHRhZyAhPSBNS1RBRygnSScsICdIJywgJ0QnLCAnUicpKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBzZXQgdGhlIHRpbWViYXNlIHRvIHNvbWV0aGluZyBsYXJnZSBlbm91Z2ggKDEvMTAwLDAwMCBvZiBzZWNvbmQpCisgICAgICogdG8gaG9wZWZ1bGx5IGNvcGUgd2l0aCBhbGwgc2FuZSBmcmFtZSBkdXJhdGlvbnMgKi8KKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMDAwKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQVBORzsKKyAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSBhdmlvX3JiMzIocGIpOworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcmIzMihwYik7CisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKHN0LT5jb2RlYy0+d2lkdGgsIHN0LT5jb2RlYy0+aGVpZ2h0LCAwLCBzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogZXh0cmFkYXRhIHdpbGwgY29udGFpbiBldmVyeSBjaHVuayB1cCB0byB0aGUgZmlyc3QgZmNUTCAoZXhjbHVkZWQpICovCisgICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgPSBhdl9tYWxsb2MobGVuICsgMTIgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBsZW4gKyAxMjsKKyAgICBBVl9XQjMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCAgICBsZW4pOworICAgIEFWX1dMMzIoc3QtPmNvZGVjLT5leHRyYWRhdGErNCwgIHRhZyk7CisgICAgQVZfV0IzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSs4LCAgc3QtPmNvZGVjLT53aWR0aCk7CisgICAgQVZfV0IzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSsxMiwgc3QtPmNvZGVjLT5oZWlnaHQpOworICAgIGlmICgocmV0ID0gYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSsxNiwgOSkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgd2hpbGUgKCFhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgIGlmIChhY1RMX2ZvdW5kICYmIGN0eC0+bnVtX3BsYXkgIT0gMSkgeworICAgICAgICAgICAgaW50NjRfdCBzaXplICAgPSBhdmlvX3NpemUocGIpOworICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfSBlbHNlIGlmICgocmV0ID0gZmZpb19lbnN1cmVfc2Vla2JhY2socGIsIHNpemUgLSBvZmZzZXQpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJDb3VsZCBub3QgZW5zdXJlIHNlZWtiYWNrLCB3aWxsIG5vdCBsb29wXG4iKTsKKyAgICAgICAgICAgICAgICBjdHgtPm51bV9wbGF5ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGN0eC0+bnVtX3BsYXkgPT0gMSB8fCAhYWNUTF9mb3VuZCkgJiYKKyAgICAgICAgICAgICgocmV0ID0gZmZpb19lbnN1cmVfc2Vla2JhY2socGIsIDQgLyogbGVuICovICsgNCAvKiB0YWcgKi8pKSA8IDApKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIGxlbiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGlmIChsZW4gPiAweDdmZmZmZmZmKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgY2FzZSBNS1RBRygnYScsICdjJywgJ1QnLCAnTCcpOgorICAgICAgICAgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocGIsIC04LCBTRUVLX0NVUikpIDwgMCB8fAorICAgICAgICAgICAgICAgIChyZXQgPSBhcHBlbmRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIGxlbiArIDEyKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGFjVExfZm91bmQgPSAxOworICAgICAgICAgICAgY3R4LT5udW1fZnJhbWVzID0gQVZfUkIzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSArIHJldCArIDgpOworICAgICAgICAgICAgY3R4LT5udW1fcGxheSAgID0gQVZfUkIzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSArIHJldCArIDEyKTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJudW1fZnJhbWVzOiAlIlBSSXUzMiIsIG51bV9wbGF5OiAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm51bV9mcmFtZXMsIGN0eC0+bnVtX3BsYXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ2YnLCAnYycsICdUJywgJ0wnKToKKyAgICAgICAgICAgIGlmICghYWNUTF9mb3VuZCkgeworICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZpb19zZWVrKHBiLCAtOCwgU0VFS19DVVIpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2aW9fc2VlayhwYiwgLTgsIFNFRUtfQ1VSKSkgPCAwIHx8CisgICAgICAgICAgICAgICAgKHJldCA9IGFwcGVuZF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgbGVuICsgMTIpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCitmYWlsOgorICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSk7CisgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRlY29kZV9mY3RsX2NodW5rKEFWRm9ybWF0Q29udGV4dCAqcywgQVBOR0RlbXV4Q29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIHVpbnQzMl90IHNlcXVlbmNlX251bWJlciwgd2lkdGgsIGhlaWdodCwgeF9vZmZzZXQsIHlfb2Zmc2V0OworICAgIHVpbnQxNl90IGRlbGF5X251bSwgZGVsYXlfZGVuOworICAgIHVpbnQ4X3QgZGlzcG9zZV9vcCwgYmxlbmRfb3A7CisKKyAgICBzZXF1ZW5jZV9udW1iZXIgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIHdpZHRoICAgICAgICAgICA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgaGVpZ2h0ICAgICAgICAgID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICB4X29mZnNldCAgICAgICAgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIHlfb2Zmc2V0ICAgICAgICA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgZGVsYXlfbnVtICAgICAgID0gYXZpb19yYjE2KHMtPnBiKTsKKyAgICBkZWxheV9kZW4gICAgICAgPSBhdmlvX3JiMTYocy0+cGIpOworICAgIGRpc3Bvc2Vfb3AgICAgICA9IGF2aW9fcjgocy0+cGIpOworICAgIGJsZW5kX29wICAgICAgICA9IGF2aW9fcjgocy0+cGIpOworICAgIGF2aW9fc2tpcChzLT5wYiwgNCk7IC8qIGNyYyAqLworCisgICAgLyogZGVmYXVsdCBpcyBodW5kcmVkdGhzIG9mIHNlY29uZHMgKi8KKyAgICBpZiAoIWRlbGF5X2RlbikKKyAgICAgICAgZGVsYXlfZGVuID0gMTAwOworICAgIGlmICghZGVsYXlfbnVtIHx8IGRlbGF5X2RlbiAvIGRlbGF5X251bSA+IGN0eC0+bWF4X2ZwcykgeworICAgICAgICBkZWxheV9udW0gPSAxOworICAgICAgICBkZWxheV9kZW4gPSBjdHgtPmRlZmF1bHRfZnBzOworICAgIH0KKyAgICBjdHgtPnBrdF9kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShkZWxheV9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyAxLCBkZWxheV9kZW4gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UpOworCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIiVzOiAiCisgICAgICAgICAgICAic2VxdWVuY2VfbnVtYmVyOiAlIlBSSWQzMiIsICIKKyAgICAgICAgICAgICJ3aWR0aDogJSJQUkl1MzIiLCAiCisgICAgICAgICAgICAiaGVpZ2h0OiAlIlBSSXUzMiIsICIKKyAgICAgICAgICAgICJ4X29mZnNldDogJSJQUkl1MzIiLCAiCisgICAgICAgICAgICAieV9vZmZzZXQ6ICUiUFJJdTMyIiwgIgorICAgICAgICAgICAgImRlbGF5X251bTogJSJQUkl1MTYiLCAiCisgICAgICAgICAgICAiZGVsYXlfZGVuOiAlIlBSSXUxNiIsICIKKyAgICAgICAgICAgICJkaXNwb3NlX29wOiAlZCwgIgorICAgICAgICAgICAgImJsZW5kX29wOiAlZFxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIHNlcXVlbmNlX251bWJlciwKKyAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgeF9vZmZzZXQsCisgICAgICAgICAgICB5X29mZnNldCwKKyAgICAgICAgICAgIGRlbGF5X251bSwKKyAgICAgICAgICAgIGRlbGF5X2RlbiwKKyAgICAgICAgICAgIGRpc3Bvc2Vfb3AsCisgICAgICAgICAgICBibGVuZF9vcCk7CisKKyAgICBpZiAod2lkdGggIT0gcy0+c3RyZWFtc1swXS0+Y29kZWMtPndpZHRoIHx8CisgICAgICAgIGhlaWdodCAhPSBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+aGVpZ2h0IHx8CisgICAgICAgIHhfb2Zmc2V0ICE9IDAgfHwKKyAgICAgICAgeV9vZmZzZXQgIT0gMCkgeworICAgICAgICBpZiAoc2VxdWVuY2VfbnVtYmVyID09IDAgfHwKKyAgICAgICAgICAgIHhfb2Zmc2V0ID49IHMtPnN0cmVhbXNbMF0tPmNvZGVjLT53aWR0aCB8fAorICAgICAgICAgICAgd2lkdGggPiBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+d2lkdGggLSB4X29mZnNldCB8fAorICAgICAgICAgICAgeV9vZmZzZXQgPj0gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmhlaWdodCB8fAorICAgICAgICAgICAgaGVpZ2h0ID4gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmhlaWdodCAtIHlfb2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGN0eC0+aXNfa2V5X2ZyYW1lID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2VxdWVuY2VfbnVtYmVyID09IDAgJiYgZGlzcG9zZV9vcCA9PSBBUE5HX0RJU1BPU0VfT1BfUFJFVklPVVMpCisgICAgICAgICAgICBkaXNwb3NlX29wID0gQVBOR19ESVNQT1NFX09QX0JBQ0tHUk9VTkQ7CisgICAgICAgIGN0eC0+aXNfa2V5X2ZyYW1lID0gZGlzcG9zZV9vcCA9PSBBUE5HX0RJU1BPU0VfT1BfQkFDS0dST1VORCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX29wICAgPT0gQVBOR19CTEVORF9PUF9TT1VSQ0U7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBuZ19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVBOR0RlbXV4Q29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisgICAgaW50NjRfdCBzaXplOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVpbnQzMl90IGxlbiwgdGFnOworCisgICAgLyoKKyAgICAgKiBmY1RMIGNodW5rIGxlbmd0aCwgaW4gYnl0ZXM6CisgICAgICogIDQgKGxlbmd0aCkKKyAgICAgKiAgNCAodGFnKQorICAgICAqIDI2IChhY3R1YWwgY2h1bmspCisgICAgICogIDQgKGNyYykgYnl0ZXMKKyAgICAgKiBhbmQgbmVlZGVkIG5leHQ6CisgICAgICogIDQgKGxlbmd0aCkKKyAgICAgKiAgNCAodGFnIChtdXN0IGJlIGZkQVQgb3IgSURBVCkpCisgICAgICovCisgICAgLyogaWYgbnVtX3BsYXkgaXMgbm90IDEsIHRoZW4gdGhlIHNlZWtiYWNrIGlzIGFscmVhZHkgZ3VhcmFudGVlZCAqLworICAgIGlmIChjdHgtPm51bV9wbGF5ID09IDEgJiYgKHJldCA9IGZmaW9fZW5zdXJlX3NlZWtiYWNrKHBiLCA0NikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGxlbiA9IGF2aW9fcmIzMihwYik7CisgICAgdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICBzd2l0Y2ggKHRhZykgeworICAgIGNhc2UgTUtUQUcoJ2YnLCAnYycsICdUJywgJ0wnKToKKyAgICAgICAgaWYgKGxlbiAhPSAyNikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2ZjdGxfY2h1bmsocywgY3R4LCBwa3QpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIC8qIGZjVEwgbXVzdCBwcmVjZWRlIGZkQVQgb3IgSURBVCAqLworICAgICAgICBsZW4gPSBhdmlvX3JiMzIocGIpOworICAgICAgICB0YWcgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAobGVuID4gMHg3ZmZmZmZmZiB8fAorICAgICAgICAgICAgdGFnICE9IE1LVEFHKCdmJywgJ2QnLCAnQScsICdUJykgJiYKKyAgICAgICAgICAgIHRhZyAhPSBNS1RBRygnSScsICdEJywgJ0EnLCAnVCcpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgc2l6ZSA9IDM4IC8qIGZjVEwgKi8gKyA4IC8qIGxlbiwgdGFnICovICsgbGVuICsgNCAvKiBjcmMgKi87CisgICAgICAgIGlmIChzaXplID4gSU5UX01BWCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocGIsIC00NiwgU0VFS19DVVIpKSA8IDAgfHwKKyAgICAgICAgICAgIChyZXQgPSBhdl9hcHBlbmRfcGFja2V0KHBiLCBwa3QsIHNpemUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmIChjdHgtPm51bV9wbGF5ID09IDEgJiYgKHJldCA9IGZmaW9fZW5zdXJlX3NlZWtiYWNrKHBiLCA4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBsZW4gPSBhdmlvX3JiMzIocGIpOworICAgICAgICB0YWcgPSBhdmlvX3JsMzIocGIpOworICAgICAgICB3aGlsZSAodGFnICYmCisgICAgICAgICAgICAgICB0YWcgIT0gTUtUQUcoJ2YnLCAnYycsICdUJywgJ0wnKSAmJgorICAgICAgICAgICAgICAgdGFnICE9IE1LVEFHKCdJJywgJ0UnLCAnTicsICdEJykpIHsKKyAgICAgICAgICAgIGlmIChsZW4gPiAweDdmZmZmZmZmKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocGIsIC04LCBTRUVLX0NVUikpIDwgMCB8fAorICAgICAgICAgICAgICAgIChyZXQgPSBhdl9hcHBlbmRfcGFja2V0KHBiLCBwa3QsIGxlbiArIDEyKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAoY3R4LT5udW1fcGxheSA9PSAxICYmIChyZXQgPSBmZmlvX2Vuc3VyZV9zZWVrYmFjayhwYiwgOCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgbGVuID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocGIsIC04LCBTRUVLX0NVUikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKGN0eC0+aXNfa2V5X2ZyYW1lKQorICAgICAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgICAgIHBrdC0+cHRzID0gY3R4LT5wa3RfcHRzOworICAgICAgICBwa3QtPmR1cmF0aW9uID0gY3R4LT5wa3RfZHVyYXRpb247CisgICAgICAgIGN0eC0+cGt0X3B0cyArPSBjdHgtPnBrdF9kdXJhdGlvbjsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBjYXNlIE1LVEFHKCdJJywgJ0UnLCAnTicsICdEJyk6CisgICAgICAgIGN0eC0+Y3VyX2xvb3ArKzsKKyAgICAgICAgaWYgKGN0eC0+aWdub3JlX2xvb3AgfHwgY3R4LT5udW1fcGxheSA+PSAxICYmIGN0eC0+Y3VyX2xvb3AgPT0gY3R4LT5udW1fcGxheSkgeworICAgICAgICAgICAgYXZpb19zZWVrKHBiLCAtOCwgU0VFS19DVVIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICB9CisgICAgICAgIGlmICgocmV0ID0gYXZpb19zZWVrKHBiLCBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgKyA4LCBTRUVLX1NFVCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgY2hhciB0YWdfYnVmWzVdOworCisgICAgICAgIGF2X2dldF9jb2RlY190YWdfc3RyaW5nKHRhZ19idWYsIHNpemVvZih0YWdfYnVmKSwgdGFnKTsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJJbi1zdHJlYW0gdGFnPSVzICgweCUwOFgpIGxlbj0lIlBSSXUzMiwgdGFnX2J1ZiwgdGFnLCBsZW4pOworICAgICAgICBhdmlvX3NraXAocGIsIGxlbiArIDQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSGFuZGxlIHRoZSB1bnN1cHBvcnRlZCB5ZXQgY2FzZXMgKi8KKyAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiaWdub3JlX2xvb3AiLCAiaWdub3JlIGxvb3Agc2V0dGluZyIgICAgICAgICAgICAgICAgICAgICAgICAgLCBvZmZzZXRvZihBUE5HRGVtdXhDb250ZXh0LCBpZ25vcmVfbG9vcCksCisgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSAgICAgICAgICAgICAgICwgMCwgMSAgICAgICwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJtYXhfZnBzIiAgICAsICJtYXhpbXVtIGZyYW1lcmF0ZSAoMCBpcyBubyBsaW1pdCkiICAgICAgICAgICAsIG9mZnNldG9mKEFQTkdEZW11eENvbnRleHQsIG1heF9mcHMpLAorICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBERUZBVUxUX0FQTkdfRlBTIH0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiZGVmYXVsdF9mcHMiLCAiZGVmYXVsdCBmcmFtZXJhdGUgKDAgaXMgYXMgZmFzdCBhcyBwb3NzaWJsZSkiLCBvZmZzZXRvZihBUE5HRGVtdXhDb250ZXh0LCBkZWZhdWx0X2ZwcyksCisgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IERFRkFVTFRfQVBOR19GUFMgfSwgMCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGRlbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiQVBORyBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFTVVYRVIsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2FwbmdfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXBuZyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFuaW1hdGVkIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVBOR0RlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gYXBuZ19wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhcG5nX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGFwbmdfcmVhZF9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZGVtdXhlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXF0aXRsZWRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FxdGl0bGVkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTA4NzY2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FxdGl0bGVkZWMuYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQVFUaXRsZSBzdWJ0aXRsZXMgZm9ybWF0IGRlbXV4ZXIKKyAqCisgKiBAc2VlIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMDcwMjEwMDk1NzIxL2h0dHA6Ly93d3cudm9sbnkuY3ovYWJlcmthL2N6ZWNoL2FxdC5odG1sCisgKiBAc2VlIGh0dHBzOi8vdHJhYy5hbm5vZGV4Lm5ldC93aWtpL0FRVGl0bGUKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInN1YnRpdGxlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSBxOworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZTsKK30gQVFUaXRsZUNvbnRleHQ7CisKK3N0YXRpYyBpbnQgYXF0X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGludCBmcmFtZTsKKyAgICBjb25zdCBjaGFyICpwdHIgPSBwLT5idWY7CisKKyAgICBpZiAoc3NjYW5mKHB0ciwgIi0tPj4gJWQiLCAmZnJhbWUpID09IDEpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcXRfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFRVGl0bGVDb250ZXh0ICphcXQgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpbnQgbmV3X2V2ZW50ID0gMTsKKyAgICBpbnQ2NF90IHBvcyA9IDAsIGZyYW1lID0gQVZfTk9QVFNfVkFMVUU7CisgICAgQVZQYWNrZXQgKnN1YiA9IE5VTEw7CisKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBhcXQtPmZyYW1lX3JhdGUuZGVuLCBhcXQtPmZyYW1lX3JhdGUubnVtKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVEVYVDsKKworICAgIHdoaWxlICghYXZpb19mZW9mKHMtPnBiKSkgeworICAgICAgICBjaGFyIGxpbmVbNDA5Nl07CisgICAgICAgIGludCBsZW4gPSBmZl9nZXRfbGluZShzLT5wYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKworICAgICAgICBpZiAoIWxlbikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGxpbmVbc3RyY3NwbihsaW5lLCAiXHJcbiIpXSA9IDA7CisKKyAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiLS0+PiAlIlNDTmQ2NCwgJmZyYW1lKSA9PSAxKSB7CisgICAgICAgICAgICBuZXdfZXZlbnQgPSAxOworICAgICAgICAgICAgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICAgICAgICAgIGlmIChzdWIpIHsKKyAgICAgICAgICAgICAgICBzdWItPmR1cmF0aW9uID0gZnJhbWUgLSBzdWItPnB0czsKKyAgICAgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCpsaW5lKSB7CisgICAgICAgICAgICBpZiAoIW5ld19ldmVudCkgeworICAgICAgICAgICAgICAgIHN1YiA9IGZmX3N1YnRpdGxlc19xdWV1ZV9pbnNlcnQoJmFxdC0+cSwgIlxuIiwgMSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKCFzdWIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdWIgPSBmZl9zdWJ0aXRsZXNfcXVldWVfaW5zZXJ0KCZhcXQtPnEsIGxpbmUsIHN0cmxlbihsaW5lKSwgIW5ld19ldmVudCk7CisgICAgICAgICAgICBpZiAoIXN1YikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgaWYgKG5ld19ldmVudCkgeworICAgICAgICAgICAgICAgIHN1Yi0+cHRzID0gZnJhbWU7CisgICAgICAgICAgICAgICAgc3ViLT5kdXJhdGlvbiA9IC0xOworICAgICAgICAgICAgICAgIHN1Yi0+cG9zID0gcG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3X2V2ZW50ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9maW5hbGl6ZSgmYXF0LT5xKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcXRfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFRVGl0bGVDb250ZXh0ICphcXQgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3N1YnRpdGxlc19xdWV1ZV9yZWFkX3BhY2tldCgmYXF0LT5xLCBwa3QpOworfQorCitzdGF0aWMgaW50IGFxdF9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3RzLCBpbnQ2NF90IHRzLCBpbnQ2NF90IG1heF90cywgaW50IGZsYWdzKQoreworICAgIEFRVGl0bGVDb250ZXh0ICphcXQgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3N1YnRpdGxlc19xdWV1ZV9zZWVrKCZhcXQtPnEsIHMsIHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYXF0X3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFRVGl0bGVDb250ZXh0ICphcXQgPSBzLT5wcml2X2RhdGE7CisgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2NsZWFuKCZhcXQtPnEpOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBUVRpdGxlQ29udGV4dCwgeCkKKyNkZWZpbmUgU0QgQVZfT1BUX0ZMQUdfU1VCVElUTEVfUEFSQU18QVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhcXRfb3B0aW9uc1tdID0geworICAgIHsgInN1YmZwcyIsICJzZXQgdGhlIG1vdmllIGZyYW1lIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7LmRibD0yNX0sIDAsIElOVF9NQVgsIFNEIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGFxdF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJhcXRkZWMiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBhcXRfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfYXF0aXRsZV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhcXRpdGxlIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVFUaXRsZSBzdWJ0aXRsZXMiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVFUaXRsZUNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGFxdF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhcXRfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gYXF0X3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsyICAgICA9IGFxdF9yZWFkX3NlZWssCisgICAgLnJlYWRfY2xvc2UgICAgID0gYXF0X3JlYWRfY2xvc2UsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImFxdCIsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmFxdF9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXNmLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkMjRkYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hc2YuYwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImFzZi5oIgorCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfaGVhZGVyID0geworICAgIDB4MzAsIDB4MjYsIDB4QjIsIDB4NzUsIDB4OEUsIDB4NjYsIDB4Q0YsIDB4MTEsIDB4QTYsIDB4RDksIDB4MDAsIDB4QUEsIDB4MDAsIDB4NjIsIDB4Q0UsIDB4NkMKK307CisKK2NvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9maWxlX2hlYWRlciA9IHsKKyAgICAweEExLCAweERDLCAweEFCLCAweDhDLCAweDQ3LCAweEE5LCAweENGLCAweDExLCAweDhFLCAweEU0LCAweDAwLCAweEMwLCAweDBDLCAweDIwLCAweDUzLCAweDY1Cit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2Zfc3RyZWFtX2hlYWRlciA9IHsKKyAgICAweDkxLCAweDA3LCAweERDLCAweEI3LCAweEI3LCAweEE5LCAweENGLCAweDExLCAweDhFLCAweEU2LCAweDAwLCAweEMwLCAweDBDLCAweDIwLCAweDUzLCAweDY1Cit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfZXh0X3N0cmVhbV9oZWFkZXIgPSB7CisgICAgMHhDQiwgMHhBNSwgMHhFNiwgMHgxNCwgMHg3MiwgMHhDNiwgMHgzMiwgMHg0MywgMHg4MywgMHg5OSwgMHhBOSwgMHg2OSwgMHg1MiwgMHgwNiwgMHg1QiwgMHg1QQorfTsKKworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2F1ZGlvX3N0cmVhbSA9IHsKKyAgICAweDQwLCAweDlFLCAweDY5LCAweEY4LCAweDRELCAweDVCLCAweENGLCAweDExLCAweEE4LCAweEZELCAweDAwLCAweDgwLCAweDVGLCAweDVDLCAweDQ0LCAweDJCCit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfYXVkaW9fY29uY2VhbF9ub25lID0geworICAgIC8vIDB4NDAsIDB4YTQsIDB4ZjEsIDB4NDksIDB4NGVjZSwgMHgxMWQwLCAweGEzLCAweGFjLCAweDAwLCAweGEwLCAweGM5LCAweDAzLCAweDQ4LCAweGY2CisgICAgLy8gTmV3IHZhbHVlIGxpZnRlZCBmcm9tIGF2aWZpbGUKKyAgICAweDAwLCAweDU3LCAweGZiLCAweDIwLCAweDU1LCAweDVCLCAweENGLCAweDExLCAweGE4LCAweGZkLCAweDAwLCAweDgwLCAweDVmLCAweDVjLCAweDQ0LCAweDJiCit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfYXVkaW9fY29uY2VhbF9zcHJlYWQgPSB7CisgICAgMHg1MCwgMHhDRCwgMHhDMywgMHhCRiwgMHg4RiwgMHg2MSwgMHhDRiwgMHgxMSwgMHg4QiwgMHhCMiwgMHgwMCwgMHhBQSwgMHgwMCwgMHhCNCwgMHhFMiwgMHgyMAorfTsKKworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX3ZpZGVvX3N0cmVhbSA9IHsKKyAgICAweEMwLCAweEVGLCAweDE5LCAweEJDLCAweDRELCAweDVCLCAweENGLCAweDExLCAweEE4LCAweEZELCAweDAwLCAweDgwLCAweDVGLCAweDVDLCAweDQ0LCAweDJCCit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfamZpZl9tZWRpYSA9IHsKKyAgICAweDAwLCAweEUxLCAweDFCLCAweEI2LCAweDRFLCAweDVCLCAweENGLCAweDExLCAweEE4LCAweEZELCAweDAwLCAweDgwLCAweDVGLCAweDVDLCAweDQ0LCAweDJCCit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfdmlkZW9fY29uY2VhbF9ub25lID0geworICAgIDB4MDAsIDB4NTcsIDB4RkIsIDB4MjAsIDB4NTUsIDB4NUIsIDB4Q0YsIDB4MTEsIDB4QTgsIDB4RkQsIDB4MDAsIDB4ODAsIDB4NUYsIDB4NUMsIDB4NDQsIDB4MkIKK307CisKK2NvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9jb21tYW5kX3N0cmVhbSA9IHsKKyAgICAweEMwLCAweENGLCAweERBLCAweDU5LCAweEU2LCAweDU5LCAweEQwLCAweDExLCAweEEzLCAweEFDLCAweDAwLCAweEEwLCAweEM5LCAweDAzLCAweDQ4LCAweEY2Cit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfY29tbWVudF9oZWFkZXIgPSB7CisgICAgMHgzMywgMHgyNiwgMHhiMiwgMHg3NSwgMHg4RSwgMHg2NiwgMHhDRiwgMHgxMSwgMHhhNiwgMHhkOSwgMHgwMCwgMHhhYSwgMHgwMCwgMHg2MiwgMHhjZSwgMHg2YworfTsKKworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2NvZGVjX2NvbW1lbnRfaGVhZGVyID0geworICAgIDB4NDAsIDB4NTIsIDB4RDEsIDB4ODYsIDB4MUQsIDB4MzEsIDB4RDAsIDB4MTEsIDB4QTMsIDB4QTQsIDB4MDAsIDB4QTAsIDB4QzksIDB4MDMsIDB4NDgsIDB4RjYKK307Citjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfY29kZWNfY29tbWVudDFfaGVhZGVyID0geworICAgIDB4NDEsIDB4NTIsIDB4ZDEsIDB4ODYsIDB4MUQsIDB4MzEsIDB4RDAsIDB4MTEsIDB4YTMsIDB4YTQsIDB4MDAsIDB4YTAsIDB4YzksIDB4MDMsIDB4NDgsIDB4ZjYKK307CisKK2NvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9kYXRhX2hlYWRlciA9IHsKKyAgICAweDM2LCAweDI2LCAweGIyLCAweDc1LCAweDhFLCAweDY2LCAweENGLCAweDExLCAweGE2LCAweGQ5LCAweDAwLCAweGFhLCAweDAwLCAweDYyLCAweGNlLCAweDZjCit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfaGVhZDFfZ3VpZCA9IHsKKyAgICAweGI1LCAweDAzLCAweGJmLCAweDVmLCAweDJFLCAweEE5LCAweENGLCAweDExLCAweDhlLCAweGUzLCAweDAwLCAweGMwLCAweDBjLCAweDIwLCAweDUzLCAweDY1Cit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfaGVhZDJfZ3VpZCA9IHsKKyAgICAweDExLCAweGQyLCAweGQzLCAweGFiLCAweEJBLCAweEE5LCAweENGLCAweDExLCAweDhlLCAweGU2LCAweDAwLCAweGMwLCAweDBjLCAweDIwLCAweDUzLCAweDY1Cit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfZXh0ZW5kZWRfY29udGVudF9oZWFkZXIgPSB7CisgICAgMHg0MCwgMHhBNCwgMHhEMCwgMHhEMiwgMHgwNywgMHhFMywgMHhEMiwgMHgxMSwgMHg5NywgMHhGMCwgMHgwMCwgMHhBMCwgMHhDOSwgMHg1RSwgMHhBOCwgMHg1MAorfTsKKworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX3NpbXBsZV9pbmRleF9oZWFkZXIgPSB7CisgICAgMHg5MCwgMHgwOCwgMHgwMCwgMHgzMywgMHhCMSwgMHhFNSwgMHhDRiwgMHgxMSwgMHg4OSwgMHhGNCwgMHgwMCwgMHhBMCwgMHhDOSwgMHgwMywgMHg0OSwgMHhDQgorfTsKKworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2V4dF9zdHJlYW1fZW1iZWRfc3RyZWFtX2hlYWRlciA9IHsKKyAgICAweGUyLCAweDY1LCAweGZiLCAweDNhLCAweEVGLCAweDQ3LCAweEYyLCAweDQwLCAweGFjLCAweDJjLCAweDcwLCAweGE5LCAweDBkLCAweDcxLCAweGQzLCAweDQzCit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfZXh0X3N0cmVhbV9hdWRpb19zdHJlYW0gPSB7CisgICAgMHg5ZCwgMHg4YywgMHgxNywgMHgzMSwgMHhFMSwgMHgwMywgMHgyOCwgMHg0NSwgMHhiNSwgMHg4MiwgMHgzZCwgMHhmOSwgMHhkYiwgMHgyMiwgMHhmNSwgMHgwMworfTsKKworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX21ldGFkYXRhX2hlYWRlciA9IHsKKyAgICAweGVhLCAweGNiLCAweGY4LCAweGM1LCAweGFmLCAweDViLCAweDc3LCAweDQ4LCAweDg0LCAweDY3LCAweGFhLCAweDhjLCAweDQ0LCAweGZhLCAweDRjLCAweGNhCit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfbWV0YWRhdGFfbGlicmFyeV9oZWFkZXIgPSB7CisgICAgMHg5NCwgMHgxYywgMHgyMywgMHg0NCwgMHg5OCwgMHg5NCwgMHhkMSwgMHg0OSwgMHhhMSwgMHg0MSwgMHgxZCwgMHgxMywgMHg0ZSwgMHg0NSwgMHg3MCwgMHg1NAorfTsKKworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX21hcmtlcl9oZWFkZXIgPSB7CisgICAgMHgwMSwgMHhDRCwgMHg4NywgMHhGNCwgMHg1MSwgMHhBOSwgMHhDRiwgMHgxMSwgMHg4RSwgMHhFNiwgMHgwMCwgMHhDMCwgMHgwQywgMHgyMCwgMHg1MywgMHg2NQorfTsKKworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX3Jlc2VydmVkXzQgPSB7CisgICAgICAgIDB4MjAsIDB4ZGIsIDB4ZmUsIDB4NGMsIDB4ZjYsIDB4NzUsIDB4Q0YsIDB4MTEsIDB4OWMsIDB4MGYsIDB4MDAsIDB4YTAsIDB4YzksIDB4MDMsIDB4NDksIDB4Y2IKK307CisKKy8qIEkgYW0gbm90IGEgbnVtYmVyICEhISBUaGlzIEdVSUQgaXMgdGhlIG9uZSBmb3VuZCBvbiB0aGUgUEMgdXNlZCB0bworICogZ2VuZXJhdGUgdGhlIHN0cmVhbSAqLworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX215X2d1aWQgPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKKworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2xhbmd1YWdlX2d1aWQgPSB7CisgICAgMHhhOSwgMHg0NiwgMHg0MywgMHg3YywgMHhlMCwgMHhlZiwgMHhmYywgMHg0YiwgMHhiMiwgMHgyOSwgMHgzOSwgMHgzZSwgMHhkZSwgMHg0MSwgMHg1YywgMHg4NQorfTsKKworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2NvbnRlbnRfZW5jcnlwdGlvbiA9IHsKKyAgICAweGZiLCAweGIzLCAweDExLCAweDIyLCAweDIzLCAweGJkLCAweGQyLCAweDExLCAweGI0LCAweGI3LCAweDAwLCAweGEwLCAweGM5LCAweDU1LCAweGZjLCAweDZlCit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfZXh0X2NvbnRlbnRfZW5jcnlwdGlvbiA9IHsKKyAgICAweDE0LCAweGU2LCAweDhhLCAweDI5LCAweDIyLCAweDI2LCAweDE3LCAweDRjLCAweGI5LCAweDM1LCAweGRhLCAweGUwLCAweDdlLCAweGU5LCAweDI4LCAweDljCit9OworCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfZGlnaXRhbF9zaWduYXR1cmUgPSB7CisgICAgMHhmYywgMHhiMywgMHgxMSwgMHgyMiwgMHgyMywgMHhiZCwgMHhkMiwgMHgxMSwgMHhiNCwgMHhiNywgMHgwMCwgMHhhMCwgMHhjOSwgMHg1NSwgMHhmYywgMHg2ZQorfTsKKworLyogTGlzdCBvZiBvZmZpY2lhbCB0YWdzIGF0IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDc0MzA2NihWUy44NSkuYXNweCAqLworY29uc3QgQVZNZXRhZGF0YUNvbnYgZmZfYXNmX21ldGFkYXRhX2NvbnZbXSA9IHsKKyAgICB7ICJXTS9BbGJ1bUFydGlzdCIsICAgICAgICAgICJhbGJ1bV9hcnRpc3QiICAgICB9LAorICAgIHsgIldNL0FsYnVtVGl0bGUiLCAgICAgICAgICAgImFsYnVtIiAgICAgICAgICAgIH0sCisgICAgeyAiQXV0aG9yIiwgICAgICAgICAgICAgICAgICAiYXJ0aXN0IiAgICAgICAgICAgfSwKKyAgICB7ICJEZXNjcmlwdGlvbiIsICAgICAgICAgICAgICJjb21tZW50IiAgICAgICAgICB9LAorICAgIHsgIldNL0NvbXBvc2VyIiwgICAgICAgICAgICAgImNvbXBvc2VyIiAgICAgICAgIH0sCisgICAgeyAiV00vRW5jb2RlZEJ5IiwgICAgICAgICAgICAiZW5jb2RlZF9ieSIgICAgICAgfSwKKyAgICB7ICJXTS9FbmNvZGluZ1NldHRpbmdzIiwgICAgICJlbmNvZGVyIiAgICAgICAgICB9LAorICAgIHsgIldNL0dlbnJlIiwgICAgICAgICAgICAgICAgImdlbnJlIiAgICAgICAgICAgIH0sCisgICAgeyAiV00vTGFuZ3VhZ2UiLCAgICAgICAgICAgICAibGFuZ3VhZ2UiICAgICAgICAgfSwKKyAgICB7ICJXTS9PcmlnaW5hbEZpbGVuYW1lIiwgICAgICJmaWxlbmFtZSIgICAgICAgICB9LAorICAgIHsgIldNL1BhcnRPZlNldCIsICAgICAgICAgICAgImRpc2MiICAgICAgICAgICAgIH0sCisgICAgeyAiV00vUHVibGlzaGVyIiwgICAgICAgICAgICAicHVibGlzaGVyIiAgICAgICAgfSwKKyAgICB7ICJXTS9Ub29sIiwgICAgICAgICAgICAgICAgICJlbmNvZGVyIiAgICAgICAgICB9LAorICAgIHsgIldNL1RyYWNrTnVtYmVyIiwgICAgICAgICAgInRyYWNrIiAgICAgICAgICAgIH0sCisgICAgeyAiV00vTWVkaWFTdGF0aW9uQ2FsbFNpZ24iLCAic2VydmljZV9wcm92aWRlciIgfSwKKyAgICB7ICJXTS9NZWRpYVN0YXRpb25OYW1lIiwgICAgICJzZXJ2aWNlX25hbWUiICAgICB9LAorLy8gIHsgIlllYXIiICAgICAgICAgICAgICAgLCAiZGF0ZSIgICAgICAgIH0sIFRPRE86IGNvbnZlcnNpb24geWVhcjwtPmRhdGUKKyAgICB7IDAgfQorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hc2YuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hc2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzk1OThhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FzZi5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX0FTRl9ICisjZGVmaW5lIEFWRk9STUFUX0FTRl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAicmlmZi5oIgorCisjZGVmaW5lIFBBQ0tFVF9TSVpFIDMyMDAKKwordHlwZWRlZiBzdHJ1Y3QgQVNGUGF5bG9hZCB7CisgICAgdWludDhfdCB0eXBlOworICAgIHVpbnQxNl90IHNpemU7Cit9IEFTRlBheWxvYWQ7CisKK3R5cGVkZWYgc3RydWN0IEFTRlN0cmVhbSB7CisgICAgaW50IG51bTsKKyAgICB1bnNpZ25lZCBjaGFyIHNlcTsKKyAgICAvKiB1c2UgZm9yIHJlYWRpbmcgKi8KKyAgICBBVlBhY2tldCBwa3Q7CisgICAgaW50IGZyYWdfb2Zmc2V0OworICAgIGludCBwYWNrZXRfb2JqX3NpemU7CisgICAgaW50IHRpbWVzdGFtcDsKKyAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgIGludCBza2lwX3RvX2tleTsKKyAgICBpbnQgcGt0X2NsZWFuOworCisgICAgaW50IGRzX3NwYW47ICAgICAgICAgICAgICAgIC8qIGRlc2NyYW1ibGluZyAgKi8KKyAgICBpbnQgZHNfcGFja2V0X3NpemU7CisgICAgaW50IGRzX2NodW5rX3NpemU7CisKKyAgICBpbnQ2NF90IHBhY2tldF9wb3M7CisKKyAgICB1aW50MTZfdCBzdHJlYW1fbGFuZ3VhZ2VfaW5kZXg7CisKKyAgICBpbnQgICAgICBwYWxldHRlX2NoYW5nZWQ7CisgICAgdWludDMyX3QgcGFsZXR0ZVsyNTZdOworCisgICAgaW50IHBheWxvYWRfZXh0X2N0OworICAgIEFTRlBheWxvYWQgcGF5bG9hZFs4XTsKK30gQVNGU3RyZWFtOworCit0eXBlZGVmIHN0cnVjdCBBU0ZNYWluSGVhZGVyIHsKKyAgICBmZl9hc2ZfZ3VpZCBndWlkOyAgICAgICAgICAgICAgICAgIC8vLzwgZ2VuZXJhdGVkIGJ5IGNsaWVudCBjb21wdXRlcgorICAgIHVpbnQ2NF90IGZpbGVfc2l6ZTsgICAgICAgICAvKio8IGluIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW52YWxpZCBpZiBicm9hZGNhc3RpbmcgKi8KKyAgICB1aW50NjRfdCBjcmVhdGVfdGltZTsgICAgICAgLyoqPCB0aW1lIG9mIGNyZWF0aW9uLCBpbiAxMDAtbmFub3NlY29uZCB1bml0cyBzaW5jZSAxLjEuMTYwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGludmFsaWQgaWYgYnJvYWRjYXN0aW5nICovCisgICAgdWludDY0X3QgcGxheV90aW1lOyAgICAgICAgIC8qKjwgcGxheSB0aW1lLCBpbiAxMDAtbmFub3NlY29uZCB1bml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnZhbGlkIGlmIGJyb2FkY2FzdGluZyAqLworICAgIHVpbnQ2NF90IHNlbmRfdGltZTsgICAgICAgICAvKio8IHRpbWUgdG8gc2VuZCBmaWxlLCBpbiAxMDAtbmFub3NlY29uZCB1bml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGludmFsaWQgaWYgYnJvYWRjYXN0aW5nIChjb3VsZCBiZSBpZ25vcmVkKSAqLworICAgIHVpbnQzMl90IHByZXJvbGw7ICAgICAgICAgICAvKio8IHRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgcGFja2V0LCBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpZiBub256ZXJvIC0gc3VidHJhY3QgZnJvbSB0aW1lICovCisgICAgdWludDMyX3QgaWdub3JlOyAgICAgICAgICAgIC8vLzwgcHJlcm9sbCBpcyA2NGJpdCAtIGJ1dCBsZXQncyBqdXN0IGlnbm9yZSBpdAorICAgIHVpbnQzMl90IGZsYWdzOyAgICAgICAgICAgICAvKio8IDB4MDEgLSBicm9hZGNhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAweDAyIC0gc2Vla2FibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXN0IGlzIHJlc2VydmVkIHNob3VsZCBiZSAwICovCisgICAgdWludDMyX3QgbWluX3BrdHNpemU7ICAgICAgIC8qKjwgc2l6ZSBvZiBhIGRhdGEgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW52YWxpZCBpZiBicm9hZGNhc3RpbmcgKi8KKyAgICB1aW50MzJfdCBtYXhfcGt0c2l6ZTsgICAgICAgLyoqPCBzaGFsbCBiZSB0aGUgc2FtZSBhcyBmb3IgbWluX3BrdHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbnZhbGlkIGlmIGJyb2FkY2FzdGluZyAqLworICAgIHVpbnQzMl90IG1heF9iaXRyYXRlOyAgICAgICAvKio8IGJhbmR3aWR0aCBvZiBzdHJlYW0gaW4gYnBzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgc2hvdWxkIGJlIHRoZSBzdW0gb2YgYml0cmF0ZXMgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW5kaXZpZHVhbCBtZWRpYSBzdHJlYW1zICovCit9IEFTRk1haW5IZWFkZXI7CisKKwordHlwZWRlZiBzdHJ1Y3QgQVNGSW5kZXggeworICAgIHVpbnQzMl90IHBhY2tldF9udW1iZXI7CisgICAgdWludDE2X3QgcGFja2V0X2NvdW50OworICAgIHVpbnQ2NF90IHNlbmRfdGltZTsKKyAgICB1aW50NjRfdCBvZmZzZXQ7Cit9IEFTRkluZGV4OworCitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2hlYWRlcjsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfZmlsZV9oZWFkZXI7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX3N0cmVhbV9oZWFkZXI7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2V4dF9zdHJlYW1faGVhZGVyOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9hdWRpb19zdHJlYW07CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2F1ZGlvX2NvbmNlYWxfbm9uZTsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfYXVkaW9fY29uY2VhbF9zcHJlYWQ7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX3ZpZGVvX3N0cmVhbTsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfamZpZl9tZWRpYTsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfdmlkZW9fY29uY2VhbF9ub25lOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9jb21tYW5kX3N0cmVhbTsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfY29tbWVudF9oZWFkZXI7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2NvZGVjX2NvbW1lbnRfaGVhZGVyOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9jb2RlY19jb21tZW50MV9oZWFkZXI7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2RhdGFfaGVhZGVyOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9oZWFkMV9ndWlkOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9oZWFkMl9ndWlkOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9leHRlbmRlZF9jb250ZW50X2hlYWRlcjsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2Zfc2ltcGxlX2luZGV4X2hlYWRlcjsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfZXh0X3N0cmVhbV9lbWJlZF9zdHJlYW1faGVhZGVyOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9leHRfc3RyZWFtX2F1ZGlvX3N0cmVhbTsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfbWV0YWRhdGFfaGVhZGVyOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9tZXRhZGF0YV9saWJyYXJ5X2hlYWRlcjsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfbWFya2VyX2hlYWRlcjsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfcmVzZXJ2ZWRfNDsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfbXlfZ3VpZDsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfbGFuZ3VhZ2VfZ3VpZDsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfY29udGVudF9lbmNyeXB0aW9uOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9leHRfY29udGVudF9lbmNyeXB0aW9uOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9kaWdpdGFsX3NpZ25hdHVyZTsKKworZXh0ZXJuIGNvbnN0IEFWTWV0YWRhdGFDb252IGZmX2FzZl9tZXRhZGF0YV9jb252W107CisKKyNkZWZpbmUgQVNGX1BBQ0tFVF9GTEFHX0VSUk9SX0NPUlJFQ1RJT05fUFJFU0VOVCAweDgwIC8vMTAwMCAwMDAwCisKKworLy8gICBBU0YgZGF0YSBwYWNrZXQgc3RydWN0dXJlCisvLyAgID09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLworLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB8IEVycm9yIENvcnJlY3Rpb24gRGF0YSAgICAgICAgICAgICB8ICBPcHRpb25hbAorLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB8IFBheWxvYWQgUGFyc2luZyBJbmZvcm1hdGlvbiAoUFBJKSB8CisvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHwgUGF5bG9hZCBEYXRhICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gfCBQYWRkaW5nIERhdGEgICAgICAgICAgICAgICAgICAgICAgfAorLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworLy8gUFBJX0ZMQUcgLSBQYXlsb2FkIHBhcnNpbmcgaW5mb3JtYXRpb24gZmxhZ3MKKyNkZWZpbmUgQVNGX1BQSV9GTEFHX01VTFRJUExFX1BBWUxPQURTX1BSRVNFTlQgMQorCisjZGVmaW5lIEFTRl9QUElfRkxBR19TRVFVRU5DRV9GSUVMRF9JU19CWVRFICAweDAyIC8vMDAwMCAwMDEwCisjZGVmaW5lIEFTRl9QUElfRkxBR19TRVFVRU5DRV9GSUVMRF9JU19XT1JEICAweDA0IC8vMDAwMCAwMTAwCisjZGVmaW5lIEFTRl9QUElfRkxBR19TRVFVRU5DRV9GSUVMRF9JU19EV09SRCAweDA2IC8vMDAwMCAwMTEwCisjZGVmaW5lIEFTRl9QUElfTUFTS19TRVFVRU5DRV9GSUVMRF9TSVpFICAgICAweDA2IC8vMDAwMCAwMTEwCisKKyNkZWZpbmUgQVNGX1BQSV9GTEFHX1BBRERJTkdfTEVOR1RIX0ZJRUxEX0lTX0JZVEUgIDB4MDggLy8wMDAwIDEwMDAKKyNkZWZpbmUgQVNGX1BQSV9GTEFHX1BBRERJTkdfTEVOR1RIX0ZJRUxEX0lTX1dPUkQgIDB4MTAgLy8wMDAxIDAwMDAKKyNkZWZpbmUgQVNGX1BQSV9GTEFHX1BBRERJTkdfTEVOR1RIX0ZJRUxEX0lTX0RXT1JEIDB4MTggLy8wMDAxIDEwMDAKKyNkZWZpbmUgQVNGX1BQSV9NQVNLX1BBRERJTkdfTEVOR1RIX0ZJRUxEX1NJWkUgICAgIDB4MTggLy8wMDAxIDEwMDAKKworI2RlZmluZSBBU0ZfUFBJX0ZMQUdfUEFDS0VUX0xFTkdUSF9GSUVMRF9JU19CWVRFICAweDIwIC8vMDAxMCAwMDAwCisjZGVmaW5lIEFTRl9QUElfRkxBR19QQUNLRVRfTEVOR1RIX0ZJRUxEX0lTX1dPUkQgIDB4NDAgLy8wMTAwIDAwMDAKKyNkZWZpbmUgQVNGX1BQSV9GTEFHX1BBQ0tFVF9MRU5HVEhfRklFTERfSVNfRFdPUkQgMHg2MCAvLzAxMTAgMDAwMAorI2RlZmluZSBBU0ZfUFBJX01BU0tfUEFDS0VUX0xFTkdUSF9GSUVMRF9TSVpFICAgICAweDYwIC8vMDExMCAwMDAwCisKKy8vIFBMX0ZMQUcgLSBQYXlsb2FkIGZsYWdzCisjZGVmaW5lIEFTRl9QTF9GTEFHX1JFUExJQ0FURURfREFUQV9MRU5HVEhfRklFTERfSVNfQllURSAgIDB4MDEgLy8wMDAwIDAwMDEKKyNkZWZpbmUgQVNGX1BMX0ZMQUdfUkVQTElDQVRFRF9EQVRBX0xFTkdUSF9GSUVMRF9JU19XT1JEICAgMHgwMiAvLzAwMDAgMDAxMAorI2RlZmluZSBBU0ZfUExfRkxBR19SRVBMSUNBVEVEX0RBVEFfTEVOR1RIX0ZJRUxEX0lTX0RXT1JEICAweDAzIC8vMDAwMCAwMDExCisjZGVmaW5lIEFTRl9QTF9NQVNLX1JFUExJQ0FURURfREFUQV9MRU5HVEhfRklFTERfU0laRSAgICAgIDB4MDMgLy8wMDAwIDAwMTEKKworI2RlZmluZSBBU0ZfUExfRkxBR19PRkZTRVRfSU5UT19NRURJQV9PQkpFQ1RfTEVOR1RIX0ZJRUxEX0lTX0JZVEUgIDB4MDQgLy8wMDAwIDAxMDAKKyNkZWZpbmUgQVNGX1BMX0ZMQUdfT0ZGU0VUX0lOVE9fTUVESUFfT0JKRUNUX0xFTkdUSF9GSUVMRF9JU19XT1JEICAweDA4IC8vMDAwMCAxMDAwCisjZGVmaW5lIEFTRl9QTF9GTEFHX09GRlNFVF9JTlRPX01FRElBX09CSkVDVF9MRU5HVEhfRklFTERfSVNfRFdPUkQgMHgwYyAvLzAwMDAgMTEwMAorI2RlZmluZSBBU0ZfUExfTUFTS19PRkZTRVRfSU5UT19NRURJQV9PQkpFQ1RfTEVOR1RIX0ZJRUxEX1NJWkUgICAgIDB4MGMgLy8wMDAwIDExMDAKKworI2RlZmluZSBBU0ZfUExfRkxBR19NRURJQV9PQkpFQ1RfTlVNQkVSX0xFTkdUSF9GSUVMRF9JU19CWVRFICAweDEwIC8vMDAwMSAwMDAwCisjZGVmaW5lIEFTRl9QTF9GTEFHX01FRElBX09CSkVDVF9OVU1CRVJfTEVOR1RIX0ZJRUxEX0lTX1dPUkQgIDB4MjAgLy8wMDEwIDAwMDAKKyNkZWZpbmUgQVNGX1BMX0ZMQUdfTUVESUFfT0JKRUNUX05VTUJFUl9MRU5HVEhfRklFTERfSVNfRFdPUkQgMHgzMCAvLzAwMTEgMDAwMAorI2RlZmluZSBBU0ZfUExfTUFTS19NRURJQV9PQkpFQ1RfTlVNQkVSX0xFTkdUSF9GSUVMRF9TSVpFICAgICAweDMwIC8vMDAxMSAwMDAwCisKKyNkZWZpbmUgQVNGX1BMX0ZMQUdfU1RSRUFNX05VTUJFUl9MRU5HVEhfRklFTERfSVNfQllURSAgMHg0MCAvLzAxMDAgMDAwMAorI2RlZmluZSBBU0ZfUExfTUFTS19TVFJFQU1fTlVNQkVSX0xFTkdUSF9GSUVMRF9TSVpFICAgICAweGMwIC8vMTEwMCAwMDAwCisKKyNkZWZpbmUgQVNGX1BMX0ZMQUdfUEFZTE9BRF9MRU5HVEhfRklFTERfSVNfQllURSAgMHg0MCAvLzAxMDAgMDAwMAorI2RlZmluZSBBU0ZfUExfRkxBR19QQVlMT0FEX0xFTkdUSF9GSUVMRF9JU19XT1JEICAweDgwIC8vMTAwMCAwMDAwCisjZGVmaW5lIEFTRl9QTF9NQVNLX1BBWUxPQURfTEVOR1RIX0ZJRUxEX1NJWkUgICAgIDB4YzAgLy8xMTAwIDAwMDAKKworI2RlZmluZSBBU0ZfUExfRkxBR19LRVlfRlJBTUUgMHg4MCAvLzEwMDAgMDAwMAorCitleHRlcm4gQVZJbnB1dEZvcm1hdCBmZl9hc2ZfZGVtdXhlcjsKKworI2VuZGlmIC8qIEFWRk9STUFUX0FTRl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXNmY3J5cHQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hc2ZjcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDI3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXNmY3J5cHQuYwpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIEFTRiBkZWNyeXB0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgUmVpbWFyIERvZWZmaW5nZXIKKyAqIFRoaXMgaXMgYSByZXdyaXRlIG9mIGNvZGUgY29udGFpbmVkIGluIGZyZWVtZS9mcmVlbWUyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Rlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmM0LmgiCisjaW5jbHVkZSAiYXNmY3J5cHQuaCIKKworLyoqCisgKiBAYnJpZWYgZmluZCBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG1vZHVsbyAyIF4gMzIKKyAqIEBwYXJhbSB2IG51bWJlciB0byBpbnZlcnQsIG11c3QgYmUgb2RkIQorICogQHJldHVybiBudW1iZXIgc28gdGhhdCByZXN1bHQgKiB2ID0gMSAobW9kIDJeMzIpCisgKi8KK3N0YXRpYyB1aW50MzJfdCBpbnZlcnNlKHVpbnQzMl90IHYpCit7CisgICAgLy8gdiBeIDMgZ2l2ZXMgdGhlIGludmVyc2UgKG1vZCAxNiksIGNvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQKKyAgICAvLyBhcyB0YWJsZSBldGMuIChvbmx5IGxvd2VzdCA0IGJpdHMgbWF0dGVyISkKKyAgICB1aW50MzJfdCBpbnZlcnNlID0gdiAqIHYgKiB2OworICAgIC8vIHVzZXMgYSBmaXhwb2ludC1pdGVyYXRpb24gdGhhdCBkb3VibGVzIHRoZSBudW1iZXIKKyAgICAvLyBvZiBjb3JyZWN0IGxvd2VzdCBiaXRzIGVhY2ggdGltZQorICAgIGludmVyc2UgKj0gMiAtIHYgKiBpbnZlcnNlOworICAgIGludmVyc2UgKj0gMiAtIHYgKiBpbnZlcnNlOworICAgIGludmVyc2UgKj0gMiAtIHYgKiBpbnZlcnNlOworICAgIHJldHVybiBpbnZlcnNlOworfQorCisvKioKKyAqIEBicmllZiByZWFkIGtleXMgZnJvbSBrZXlidWYgaW50byBrZXlzCisgKiBAcGFyYW0ga2V5YnVmIGJ1ZmZlciBjb250YWluaW5nIHRoZSBrZXlzCisgKiBAcGFyYW0ga2V5cyBvdXRwdXQga2V5IGFycmF5IGNvbnRhaW5pbmcgdGhlIGtleXMgZm9yIGVuY3J5cHRpb24gaW4KKyAqICAgICAgICAgICAgIG5hdGl2ZSBlbmRpYW5uZXNzCisgKi8KK3N0YXRpYyB2b2lkIG11bHRpc3dhcF9pbml0KGNvbnN0IHVpbnQ4X3Qga2V5YnVmWzQ4XSwgdWludDMyX3Qga2V5c1sxMl0pCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisgICAgICAgIGtleXNbaV0gPSBBVl9STDMyKGtleWJ1ZiArIChpIDw8IDIpKSB8IDE7Cit9CisKKy8qKgorICogQGJyaWVmIGludmVydCB0aGUga2V5cyBzbyB0aGF0IGVuY3J5cHRpb24gYmVjb21lIGRlY3J5cHRpb24ga2V5cyBhbmQKKyAqICAgICAgICB0aGUgb3RoZXIgd2F5IHJvdW5kLgorICogQHBhcmFtIGtleXMga2V5IGFycmF5IG9mIGludHMgdG8gaW52ZXJ0CisgKi8KK3N0YXRpYyB2b2lkIG11bHRpc3dhcF9pbnZlcnRfa2V5cyh1aW50MzJfdCBrZXlzWzEyXSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICBrZXlzW2ldID0gaW52ZXJzZShrZXlzW2ldKTsKKyAgICBmb3IgKGkgPSA2OyBpIDwgMTE7IGkrKykKKyAgICAgICAga2V5c1tpXSA9IGludmVyc2Uoa2V5c1tpXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBtdWx0aXN3YXBfc3RlcChjb25zdCB1aW50MzJfdCBrZXlzWzEyXSwgdWludDMyX3QgdikKK3sKKyAgICBpbnQgaTsKKyAgICB2ICo9IGtleXNbMF07CisgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgICB2ICA9ICh2ID4+IDE2KSB8ICh2IDw8IDE2KTsKKyAgICAgICAgdiAqPSBrZXlzW2ldOworICAgIH0KKyAgICB2ICs9IGtleXNbNV07CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBtdWx0aXN3YXBfaW52X3N0ZXAoY29uc3QgdWludDMyX3Qga2V5c1sxMl0sIHVpbnQzMl90IHYpCit7CisgICAgaW50IGk7CisgICAgdiAtPSBrZXlzWzVdOworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgdiAqPSBrZXlzW2ldOworICAgICAgICB2ICA9ICh2ID4+IDE2KSB8ICh2IDw8IDE2KTsKKyAgICB9CisgICAgdiAqPSBrZXlzWzBdOworICAgIHJldHVybiB2OworfQorCisvKioKKyAqIEBicmllZiAiTXVsdGlTd2FwIiBlbmNyeXB0aW9uCisgKiBAcGFyYW0ga2V5cyAzMiBiaXQgbnVtYmVycyBpbiBtYWNoaW5lIGVuZGlhbm5lc3MsCisgKiAgICAgICAgICAgICAwLTQgYW5kIDYtMTAgbXVzdCBiZSBpbnZlcnRlZCBmcm9tIGRlY3J5cHRpb24KKyAqIEBwYXJhbSBrZXkgYW5vdGhlciBrZXksIHRoaXMgb25lIG11c3QgYmUgdGhlIHNhbWUgZm9yIHRoZSBkZWNyeXB0aW9uCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIGVuY3J5cHQKKyAqIEByZXR1cm4gZW5jcnlwdGVkIGRhdGEKKyAqLworc3RhdGljIHVpbnQ2NF90IG11bHRpc3dhcF9lbmMoY29uc3QgdWludDMyX3Qga2V5c1sxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBrZXksIHVpbnQ2NF90IGRhdGEpCit7CisgICAgdWludDMyX3QgYSA9IGRhdGE7CisgICAgdWludDMyX3QgYiA9IGRhdGEgPj4gMzI7CisgICAgdWludDMyX3QgYzsKKyAgICB1aW50MzJfdCB0bXA7CisgICAgYSAgKz0ga2V5OworICAgIHRtcCA9IG11bHRpc3dhcF9zdGVwKGtleXMsIGEpOworICAgIGIgICs9IHRtcDsKKyAgICBjICAgPSAoa2V5ID4+IDMyKSArIHRtcDsKKyAgICB0bXAgPSBtdWx0aXN3YXBfc3RlcChrZXlzICsgNiwgYik7CisgICAgYyAgKz0gdG1wOworICAgIHJldHVybiAoKHVpbnQ2NF90KWMgPDwgMzIpIHwgdG1wOworfQorCisvKioKKyAqIEBicmllZiAiTXVsdGlTd2FwIiBkZWNyeXB0aW9uCisgKiBAcGFyYW0ga2V5cyAzMiBiaXQgbnVtYmVycyBpbiBtYWNoaW5lIGVuZGlhbm5lc3MsCisgKiAgICAgICAgICAgICAwLTQgYW5kIDYtMTAgbXVzdCBiZSBpbnZlcnRlZCBmcm9tIGVuY3J5cHRpb24KKyAqIEBwYXJhbSBrZXkgYW5vdGhlciBrZXksIHRoaXMgb25lIG11c3QgYmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBlbmNyeXB0aW9uCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIGRlY3J5cHQKKyAqIEByZXR1cm4gZGVjcnlwdGVkIGRhdGEKKyAqLworc3RhdGljIHVpbnQ2NF90IG11bHRpc3dhcF9kZWMoY29uc3QgdWludDMyX3Qga2V5c1sxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBrZXksIHVpbnQ2NF90IGRhdGEpCit7CisgICAgdWludDMyX3QgYTsKKyAgICB1aW50MzJfdCBiOworICAgIHVpbnQzMl90IGMgICA9IGRhdGEgPj4gMzI7CisgICAgdWludDMyX3QgdG1wID0gZGF0YTsKKyAgICBjICAtPSB0bXA7CisgICAgYiAgID0gbXVsdGlzd2FwX2ludl9zdGVwKGtleXMgKyA2LCB0bXApOworICAgIHRtcCA9IGMgLSAoa2V5ID4+IDMyKTsKKyAgICBiICAtPSB0bXA7CisgICAgYSAgID0gbXVsdGlzd2FwX2ludl9zdGVwKGtleXMsIHRtcCk7CisgICAgYSAgLT0ga2V5OworICAgIHJldHVybiAoKHVpbnQ2NF90KWIgPDwgMzIpIHwgYTsKK30KKwordm9pZCBmZl9hc2ZjcnlwdF9kZWMoY29uc3QgdWludDhfdCBrZXlbMjBdLCB1aW50OF90ICpkYXRhLCBpbnQgbGVuKQoreworICAgIHN0cnVjdCBBVkRFUyBkZXM7CisgICAgc3RydWN0IEFWUkM0IHJjNDsKKyAgICBpbnQgbnVtX3F3b3JkcyAgICAgID0gbGVuID4+IDM7CisgICAgdWludDhfdCAqcXdvcmRzICAgICA9IGRhdGE7CisgICAgdWludDY0X3QgcmM0YnVmZls4XSA9IHsgMCB9OworICAgIHVpbnQ2NF90IHBhY2tldGtleTsKKyAgICB1aW50MzJfdCBtc19rZXlzWzEyXTsKKyAgICB1aW50NjRfdCBtc19zdGF0ZTsKKyAgICBpbnQgaTsKKyAgICBpZiAobGVuIDwgMTYpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgZGF0YVtpXSBePSBrZXlbaV07CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdl9yYzRfaW5pdCgmcmM0LCBrZXksIDEyICogOCwgMSk7CisgICAgYXZfcmM0X2NyeXB0KCZyYzQsICh1aW50OF90ICopcmM0YnVmZiwgTlVMTCwgc2l6ZW9mKHJjNGJ1ZmYpLCBOVUxMLCAxKTsKKyAgICBtdWx0aXN3YXBfaW5pdCgodWludDhfdCAqKXJjNGJ1ZmYsIG1zX2tleXMpOworCisgICAgcGFja2V0a2V5ICA9IEFWX1JONjQoJnF3b3Jkc1tudW1fcXdvcmRzICogOCAtIDhdKTsKKyAgICBwYWNrZXRrZXkgXj0gcmM0YnVmZls3XTsKKyAgICBhdl9kZXNfaW5pdCgmZGVzLCBrZXkgKyAxMiwgNjQsIDEpOworICAgIGF2X2Rlc19jcnlwdCgmZGVzLCAodWludDhfdCAqKSZwYWNrZXRrZXksICh1aW50OF90ICopJnBhY2tldGtleSwgMSwgTlVMTCwgMSk7CisgICAgcGFja2V0a2V5IF49IHJjNGJ1ZmZbNl07CisKKyAgICBhdl9yYzRfaW5pdCgmcmM0LCAodWludDhfdCAqKSZwYWNrZXRrZXksIDY0LCAxKTsKKyAgICBhdl9yYzRfY3J5cHQoJnJjNCwgZGF0YSwgZGF0YSwgbGVuLCBOVUxMLCAxKTsKKworICAgIG1zX3N0YXRlID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3F3b3JkcyAtIDE7IGkrKywgcXdvcmRzICs9IDgpCisgICAgICAgIG1zX3N0YXRlID0gbXVsdGlzd2FwX2VuYyhtc19rZXlzLCBtc19zdGF0ZSwgQVZfUkw2NChxd29yZHMpKTsKKyAgICBtdWx0aXN3YXBfaW52ZXJ0X2tleXMobXNfa2V5cyk7CisgICAgcGFja2V0a2V5ID0gKHBhY2tldGtleSA8PCAzMikgfCAocGFja2V0a2V5ID4+IDMyKTsKKyAgICBwYWNrZXRrZXkgPSBhdl9sZTJuZTY0KHBhY2tldGtleSk7CisgICAgcGFja2V0a2V5ID0gbXVsdGlzd2FwX2RlYyhtc19rZXlzLCBtc19zdGF0ZSwgcGFja2V0a2V5KTsKKyAgICBBVl9XTDY0KHF3b3JkcywgcGFja2V0a2V5KTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hc2ZjcnlwdC5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FzZmNyeXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4MGQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hc2ZjcnlwdC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBBU0YgZGVjcnlwdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA3IFJlaW1hciBEb2VmZmluZ2VyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfQVNGQ1JZUFRfSAorI2RlZmluZSBBVkZPUk1BVF9BU0ZDUllQVF9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCit2b2lkIGZmX2FzZmNyeXB0X2RlYyhjb25zdCB1aW50OF90IGtleVsyMF0sIHVpbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCisjZW5kaWYgLyogQVZGT1JNQVRfQVNGQ1JZUFRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2FzZmRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FzZmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmN2JiNGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXNmZGVjLmMKQEAgLTAsMCArMSwxNjEyIEBACisvKgorICogQVNGIGNvbXBhdGlibGUgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2bGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJpZDN2Mi5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicmlmZi5oIgorI2luY2x1ZGUgImFzZi5oIgorI2luY2x1ZGUgImFzZmNyeXB0LmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgYXNmaWQyYXZpZFsxMjhdOyAgICAgICAgICAgICAgICAgLy8vPCBjb252ZXJzaW9uIHRhYmxlIGZyb20gYXNmIElEIDIgQVZTdHJlYW0gSUQKKyAgICBBU0ZTdHJlYW0gc3RyZWFtc1sxMjhdOyAgICAgICAgICAgICAgLy8vPCBpdCdzIG1heCBudW1iZXIgYW5kIGl0J3Mgbm90IHRoYXQgYmlnCisgICAgdWludDMyX3Qgc3RyZWFtX2JpdHJhdGVzWzEyOF07ICAgICAgIC8vLzwgbWF4IG51bWJlciBvZiBzdHJlYW1zLCBiaXRyYXRlIGZvciBlYWNoIChmb3Igc3RyZWFtaW5nKQorICAgIEFWUmF0aW9uYWwgZGFyWzEyOF07CisgICAgY2hhciBzdHJlYW1fbGFuZ3VhZ2VzWzEyOF1bNl07ICAgICAgIC8vLzwgbWF4IG51bWJlciBvZiBzdHJlYW1zLCBsYW5ndWFnZSBmb3IgZWFjaCAoUkZDMTc2NiwgZS5nLiBlbi1VUykKKyAgICAvKiBub24gc3RyZWFtZWQgYWRkaXRvbm5hbCBpbmZvICovCisgICAgLyogcGFja2V0IGZpbGxpbmcgKi8KKyAgICBpbnQgcGFja2V0X3NpemVfbGVmdDsKKyAgICAvKiBvbmx5IGZvciByZWFkaW5nICovCisgICAgdWludDY0X3QgZGF0YV9vZmZzZXQ7ICAgICAgICAgICAgICAgIC8vLzwgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCBkYXRhIHBhY2tldAorICAgIHVpbnQ2NF90IGRhdGFfb2JqZWN0X29mZnNldDsgICAgICAgICAvLy88IGRhdGEgb2JqZWN0IG9mZnNldCAoZXhjbC4gR1VJRCAmIHNpemUpCisgICAgdWludDY0X3QgZGF0YV9vYmplY3Rfc2l6ZTsgICAgICAgICAgIC8vLzwgc2l6ZSBvZiB0aGUgZGF0YSBvYmplY3QKKyAgICBpbnQgaW5kZXhfcmVhZDsKKworICAgIEFTRk1haW5IZWFkZXIgaGRyOworCisgICAgaW50IHBhY2tldF9mbGFnczsKKyAgICBpbnQgcGFja2V0X3Byb3BlcnR5OworICAgIGludCBwYWNrZXRfdGltZXN0YW1wOworICAgIGludCBwYWNrZXRfc2Vnc2l6ZXR5cGU7CisgICAgaW50IHBhY2tldF9zZWdtZW50czsKKyAgICBpbnQgcGFja2V0X3NlcTsKKyAgICBpbnQgcGFja2V0X3JlcGxpY19zaXplOworICAgIGludCBwYWNrZXRfa2V5X2ZyYW1lOworICAgIGludCBwYWNrZXRfcGFkc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgcGFja2V0X2ZyYWdfb2Zmc2V0OworICAgIHVuc2lnbmVkIGludCBwYWNrZXRfZnJhZ19zaXplOworICAgIGludDY0X3QgcGFja2V0X2ZyYWdfdGltZXN0YW1wOworICAgIGludCB0c19pc19wdHM7CisgICAgaW50IHBhY2tldF9tdWx0aV9zaXplOworICAgIGludCBwYWNrZXRfdGltZV9kZWx0YTsKKyAgICBpbnQgcGFja2V0X3RpbWVfc3RhcnQ7CisgICAgaW50NjRfdCBwYWNrZXRfcG9zOworCisgICAgaW50IHN0cmVhbV9pbmRleDsKKworICAgIEFTRlN0cmVhbSAqYXNmX3N0OyAgICAgICAgICAgICAgICAgICAvLy88IGN1cnJlbnRseSBkZWNvZGVkIHN0cmVhbQorCisgICAgaW50IG5vX3Jlc3luY19zZWFyY2g7Cit9IEFTRkNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAibm9fcmVzeW5jX3NlYXJjaCIsICJEb24ndCB0cnkgdG8gcmVzeW5jaHJvbml6ZSBieSBsb29raW5nIGZvciBhIGNlcnRhaW4gb3B0aW9uYWwgc3RhcnQgY29kZSIsIG9mZnNldG9mKEFTRkNvbnRleHQsIG5vX3Jlc3luY19zZWFyY2gpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGFzZl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJhc2YgZGVtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCisjdW5kZWYgTkRFQlVHCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNkZWZpbmUgQVNGX01BWF9TVFJFQU1TIDEyNworI2RlZmluZSBGUkFNRV9IRUFERVJfU0laRSAxNgorLy8gRml4IE1lISBGUkFNRV9IRUFERVJfU0laRSBtYXkgYmUgZGlmZmVyZW50LiAoMTcgaXMga25vd24gdG8gYmUgdG9vIGxhcmdlKQorCisjaWZkZWYgREVCVUcKK3N0YXRpYyBjb25zdCBmZl9hc2ZfZ3VpZCBzdHJlYW1fYml0cmF0ZV9ndWlkID0geyAvKiAoaHR0cDovL2dldC50by9zZHApICovCisgICAgMHhjZSwgMHg3NSwgMHhmOCwgMHg3YiwgMHg4ZCwgMHg0NiwgMHhkMSwgMHgxMSwgMHg4ZCwgMHg4MiwgMHgwMCwgMHg2MCwgMHg5NywgMHhjOSwgMHhhMiwgMHhiMgorfTsKKworI2RlZmluZSBQUklOVF9JRl9HVUlEKGcsIGNtcCkgXAorICAgIGlmICghZmZfZ3VpZGNtcChnLCAmY21wKSkgXAorICAgICAgICBhdl9kbG9nKE5VTEwsICIoR1VJRDogJXMpICIsICMgY21wKQorCitzdGF0aWMgdm9pZCBwcmludF9ndWlkKGZmX2FzZl9ndWlkICpnKQoreworICAgIGludCBpOworICAgIFBSSU5UX0lGX0dVSUQoZywgZmZfYXNmX2hlYWRlcik7CisgICAgZWxzZSBQUklOVF9JRl9HVUlEKGcsIGZmX2FzZl9maWxlX2hlYWRlcik7CisgICAgZWxzZSBQUklOVF9JRl9HVUlEKGcsIGZmX2FzZl9zdHJlYW1faGVhZGVyKTsKKyAgICBlbHNlIFBSSU5UX0lGX0dVSUQoZywgZmZfYXNmX2F1ZGlvX3N0cmVhbSk7CisgICAgZWxzZSBQUklOVF9JRl9HVUlEKGcsIGZmX2FzZl9hdWRpb19jb25jZWFsX25vbmUpOworICAgIGVsc2UgUFJJTlRfSUZfR1VJRChnLCBmZl9hc2ZfdmlkZW9fc3RyZWFtKTsKKyAgICBlbHNlIFBSSU5UX0lGX0dVSUQoZywgZmZfYXNmX3ZpZGVvX2NvbmNlYWxfbm9uZSk7CisgICAgZWxzZSBQUklOVF9JRl9HVUlEKGcsIGZmX2FzZl9jb21tYW5kX3N0cmVhbSk7CisgICAgZWxzZSBQUklOVF9JRl9HVUlEKGcsIGZmX2FzZl9jb21tZW50X2hlYWRlcik7CisgICAgZWxzZSBQUklOVF9JRl9HVUlEKGcsIGZmX2FzZl9jb2RlY19jb21tZW50X2hlYWRlcik7CisgICAgZWxzZSBQUklOVF9JRl9HVUlEKGcsIGZmX2FzZl9jb2RlY19jb21tZW50MV9oZWFkZXIpOworICAgIGVsc2UgUFJJTlRfSUZfR1VJRChnLCBmZl9hc2ZfZGF0YV9oZWFkZXIpOworICAgIGVsc2UgUFJJTlRfSUZfR1VJRChnLCBmZl9hc2Zfc2ltcGxlX2luZGV4X2hlYWRlcik7CisgICAgZWxzZSBQUklOVF9JRl9HVUlEKGcsIGZmX2FzZl9oZWFkMV9ndWlkKTsKKyAgICBlbHNlIFBSSU5UX0lGX0dVSUQoZywgZmZfYXNmX2hlYWQyX2d1aWQpOworICAgIGVsc2UgUFJJTlRfSUZfR1VJRChnLCBmZl9hc2ZfbXlfZ3VpZCk7CisgICAgZWxzZSBQUklOVF9JRl9HVUlEKGcsIGZmX2FzZl9leHRfc3RyZWFtX2hlYWRlcik7CisgICAgZWxzZSBQUklOVF9JRl9HVUlEKGcsIGZmX2FzZl9leHRlbmRlZF9jb250ZW50X2hlYWRlcik7CisgICAgZWxzZSBQUklOVF9JRl9HVUlEKGcsIGZmX2FzZl9leHRfc3RyZWFtX2VtYmVkX3N0cmVhbV9oZWFkZXIpOworICAgIGVsc2UgUFJJTlRfSUZfR1VJRChnLCBmZl9hc2ZfZXh0X3N0cmVhbV9hdWRpb19zdHJlYW0pOworICAgIGVsc2UgUFJJTlRfSUZfR1VJRChnLCBmZl9hc2ZfbWV0YWRhdGFfaGVhZGVyKTsKKyAgICBlbHNlIFBSSU5UX0lGX0dVSUQoZywgZmZfYXNmX21ldGFkYXRhX2xpYnJhcnlfaGVhZGVyKTsKKyAgICBlbHNlIFBSSU5UX0lGX0dVSUQoZywgZmZfYXNmX21hcmtlcl9oZWFkZXIpOworICAgIGVsc2UgUFJJTlRfSUZfR1VJRChnLCBzdHJlYW1fYml0cmF0ZV9ndWlkKTsKKyAgICBlbHNlIFBSSU5UX0lGX0dVSUQoZywgZmZfYXNmX2xhbmd1YWdlX2d1aWQpOworICAgIGVsc2UKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiKEdVSUQ6IHVua25vd24pICIpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICBhdl9kbG9nKE5VTEwsICIgMHglMDJ4LCIsICgqZylbaV0pOworICAgIGF2X2Rsb2coTlVMTCwgIn1cbiIpOworfQorI3VuZGVmIFBSSU5UX0lGX0dVSUQKKyNlbHNlCisjZGVmaW5lIHByaW50X2d1aWQoZykKKyNlbmRpZgorCitzdGF0aWMgaW50IGFzZl9wcm9iZShBVlByb2JlRGF0YSAqcGQpCit7CisgICAgLyogY2hlY2sgZmlsZSBoZWFkZXIgKi8KKyAgICBpZiAoIWZmX2d1aWRjbXAocGQtPmJ1ZiwgJmZmX2FzZl9oZWFkZXIpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworLyogc2l6ZSBvZiB0eXBlIDIgKEJPT0wpIGlzIDMyYml0IGZvciAiRXh0ZW5kZWQgQ29udGVudCBEZXNjcmlwdGlvbiBPYmplY3QiCisgKiBidXQgMTYgYml0IGZvciAiTWV0YWRhdGEgT2JqZWN0IiBhbmQgIk1ldGFkYXRhIExpYnJhcnkgT2JqZWN0IiAqLworc3RhdGljIGludCBnZXRfdmFsdWUoQVZJT0NvbnRleHQgKnBiLCBpbnQgdHlwZSwgaW50IHR5cGUyX3NpemUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAyOgorICAgICAgICByZXR1cm4gKHR5cGUyX3NpemUgPT0gMzIpID8gYXZpb19ybDMyKHBiKSA6IGF2aW9fcmwxNihwYik7CisgICAgY2FzZSAzOgorICAgICAgICByZXR1cm4gYXZpb19ybDMyKHBiKTsKKyAgICBjYXNlIDQ6CisgICAgICAgIHJldHVybiBhdmlvX3JsNjQocGIpOworICAgIGNhc2UgNToKKyAgICAgICAgcmV0dXJuIGF2aW9fcmwxNihwYik7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIElOVF9NSU47CisgICAgfQorfQorCisvKiBNU0ROIGNsYWltcyB0aGF0IHRoaXMgc2hvdWxkIGJlICJjb21wYXRpYmxlIHdpdGggdGhlIElEMyBmcmFtZSwgQVBJQyIsCisgKiBidXQgaW4gcmVhbGl0eSB0aGlzIGlzIG9ubHkgbG9vc2VseSBzaW1pbGFyICovCitzdGF0aWMgaW50IGFzZl9yZWFkX3BpY3R1cmUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgbGVuKQoreworICAgIEFWUGFja2V0IHBrdCAgICAgICAgICA9IHsgMCB9OworICAgIGNvbnN0IENvZGVjTWltZSAqbWltZSA9IGZmX2lkM3YyX21pbWVfdGFnczsKKyAgICBlbnVtICBBVkNvZGVjSUQgaWQgICAgPSBBVl9DT0RFQ19JRF9OT05FOworICAgIGNoYXIgbWltZXR5cGVbNjRdOworICAgIHVpbnQ4X3QgICpkZXNjID0gTlVMTDsKKyAgICBBVlN0cmVhbSAgICpzdCA9IE5VTEw7CisgICAgaW50IHJldCwgdHlwZSwgcGljc2l6ZSwgZGVzY19sZW47CisKKyAgICAvKiB0eXBlICsgcGljc2l6ZSArIG1pbWUgKyBkZXNjICovCisgICAgaWYgKGxlbiA8IDEgKyA0ICsgMiArIDIpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYXR0YWNoZWQgcGljdHVyZSBzaXplOiAlZC5cbiIsIGxlbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIHBpY3R1cmUgdHlwZSAqLworICAgIHR5cGUgPSBhdmlvX3I4KHMtPnBiKTsKKyAgICBsZW4tLTsKKyAgICBpZiAodHlwZSA+PSBGRl9BUlJBWV9FTEVNUyhmZl9pZDN2Ml9waWN0dXJlX3R5cGVzKSB8fCB0eXBlIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIGF0dGFjaGVkIHBpY3R1cmUgdHlwZTogJWQuXG4iLCB0eXBlKTsKKyAgICAgICAgdHlwZSA9IDA7CisgICAgfQorCisgICAgLyogcGljdHVyZSBkYXRhIHNpemUgKi8KKyAgICBwaWNzaXplID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBsZW4gICAgLT0gNDsKKworICAgIC8qIHBpY3R1cmUgTUlNRSB0eXBlICovCisgICAgbGVuIC09IGF2aW9fZ2V0X3N0cjE2bGUocy0+cGIsIGxlbiwgbWltZXR5cGUsIHNpemVvZihtaW1ldHlwZSkpOworICAgIHdoaWxlIChtaW1lLT5pZCAhPSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgIGlmICghc3RybmNtcChtaW1lLT5zdHIsIG1pbWV0eXBlLCBzaXplb2YobWltZXR5cGUpKSkgeworICAgICAgICAgICAgaWQgPSBtaW1lLT5pZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1pbWUrKzsKKyAgICB9CisgICAgaWYgKGlkID09IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVua25vd24gYXR0YWNoZWQgcGljdHVyZSBtaW1ldHlwZTogJXMuXG4iLAorICAgICAgICAgICAgICAgbWltZXR5cGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAocGljc2l6ZSA+PSBsZW4pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYXR0YWNoZWQgcGljdHVyZSBkYXRhIHNpemU6ICVkID49ICVkLlxuIiwKKyAgICAgICAgICAgICAgIHBpY3NpemUsIGxlbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIHBpY3R1cmUgZGVzY3JpcHRpb24gKi8KKyAgICBkZXNjX2xlbiA9IChsZW4gLSBwaWNzaXplKSAqIDIgKyAxOworICAgIGRlc2MgICAgID0gYXZfbWFsbG9jKGRlc2NfbGVuKTsKKyAgICBpZiAoIWRlc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbGVuIC09IGF2aW9fZ2V0X3N0cjE2bGUocy0+cGIsIGxlbiAtIHBpY3NpemUsIGRlc2MsIGRlc2NfbGVuKTsKKworICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsICZwa3QsIHBpY3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzdCAgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHN0LT5kaXNwb3NpdGlvbiAgICAgICAgICAgICAgfD0gQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgICAgID0gaWQ7CisgICAgc3QtPmF0dGFjaGVkX3BpYyAgICAgICAgICAgICAgPSBwa3Q7CisgICAgc3QtPmF0dGFjaGVkX3BpYy5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgc3QtPmF0dGFjaGVkX3BpYy5mbGFncyAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICBpZiAoKmRlc2MpCisgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJ0aXRsZSIsIGRlc2MsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKKyAgICBlbHNlCisgICAgICAgIGF2X2ZyZWVwKCZkZXNjKTsKKworICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJjb21tZW50IiwgZmZfaWQzdjJfcGljdHVyZV90eXBlc1t0eXBlXSwgMCk7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9mcmVlcCgmZGVzYyk7CisgICAgYXZfZnJlZV9wYWNrZXQoJnBrdCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2lkM190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgbGVuKQoreworICAgIElEM3YyRXh0cmFNZXRhICppZDN2Ml9leHRyYV9tZXRhID0gTlVMTDsKKworICAgIGZmX2lkM3YyX3JlYWQocywgSUQzdjJfREVGQVVMVF9NQUdJQywgJmlkM3YyX2V4dHJhX21ldGEsIGxlbik7CisgICAgaWYgKGlkM3YyX2V4dHJhX21ldGEpCisgICAgICAgIGZmX2lkM3YyX3BhcnNlX2FwaWMocywgJmlkM3YyX2V4dHJhX21ldGEpOworICAgIGZmX2lkM3YyX2ZyZWVfZXh0cmFfbWV0YSgmaWQzdjJfZXh0cmFfbWV0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF90YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICprZXksIGludCB0eXBlLCBpbnQgbGVuLCBpbnQgdHlwZTJfc2l6ZSkKK3sKKyAgICBjaGFyICp2YWx1ZTsKKyAgICBpbnQ2NF90IG9mZiA9IGF2aW9fdGVsbChzLT5wYik7CisjZGVmaW5lIExFTiAyMgorCisgICAgaWYgKCh1bnNpZ25lZClsZW4gPj0gKFVJTlRfTUFYIC0gTEVOKSAvIDIpCisgICAgICAgIHJldHVybjsKKworICAgIHZhbHVlID0gYXZfbWFsbG9jKDIgKiBsZW4gKyBMRU4pOworICAgIGlmICghdmFsdWUpCisgICAgICAgIGdvdG8gZmluaXNoOworCisgICAgaWYgKHR5cGUgPT0gMCkgeyAgICAgICAgIC8vIFVURjE2LUxFCisgICAgICAgIGF2aW9fZ2V0X3N0cjE2bGUocy0+cGIsIGxlbiwgdmFsdWUsIDIgKiBsZW4gKyAxKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gLTEpIHsgLy8gQVNDSUkKKyAgICAgICAgYXZpb19yZWFkKHMtPnBiLCB2YWx1ZSwgbGVuKTsKKyAgICAgICAgdmFsdWVbbGVuXT0wOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSAxKSB7ICAvLyBieXRlIGFycmF5CisgICAgICAgIGlmICghc3RyY21wKGtleSwgIldNL1BpY3R1cmUiKSkgeyAvLyBoYW5kbGUgY292ZXIgYXJ0CisgICAgICAgICAgICBhc2ZfcmVhZF9waWN0dXJlKHMsIGxlbik7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJJRDMiKSkgeyAvLyBoYW5kbGUgSUQzIHRhZworICAgICAgICAgICAgZ2V0X2lkM190YWcocywgbGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgIlVuc3VwcG9ydGVkIGJ5dGUgYXJyYXkgaW4gdGFnICVzLlxuIiwga2V5KTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPiAxICYmIHR5cGUgPD0gNSkgeyAgLy8gYm9vbGVhbiBvciBEV09SRCBvciBRV09SRCBvciBXT1JECisgICAgICAgIHVpbnQ2NF90IG51bSA9IGdldF92YWx1ZShzLT5wYiwgdHlwZSwgdHlwZTJfc2l6ZSk7CisgICAgICAgIHNucHJpbnRmKHZhbHVlLCBMRU4sICIlIlBSSXU2NCwgbnVtKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gNikgeyAvLyAoZG9uJ3QpIGhhbmRsZSBHVUlECisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJVbnN1cHBvcnRlZCBHVUlEIHZhbHVlIGluIHRhZyAlcy5cbiIsIGtleSk7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgdmFsdWUgdHlwZSAlZCBpbiB0YWcgJXMuXG4iLCB0eXBlLCBrZXkpOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisgICAgaWYgKCp2YWx1ZSkKKyAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBrZXksIHZhbHVlLCAwKTsKKworZmluaXNoOgorICAgIGF2X2ZyZWVwKCZ2YWx1ZSk7CisgICAgYXZpb19zZWVrKHMtPnBiLCBvZmYgKyBsZW4sIFNFRUtfU0VUKTsKK30KKworc3RhdGljIGludCBhc2ZfcmVhZF9maWxlX3Byb3BlcnRpZXMoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IHNpemUpCit7CisgICAgQVNGQ29udGV4dCAqYXNmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworCisgICAgZmZfZ2V0X2d1aWQocGIsICZhc2YtPmhkci5ndWlkKTsKKyAgICBhc2YtPmhkci5maWxlX3NpemUgICA9IGF2aW9fcmw2NChwYik7CisgICAgYXNmLT5oZHIuY3JlYXRlX3RpbWUgPSBhdmlvX3JsNjQocGIpOworICAgIGF2aW9fcmw2NChwYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwYWNrZXRzICovCisgICAgYXNmLT5oZHIucGxheV90aW1lICAgPSBhdmlvX3JsNjQocGIpOworICAgIGFzZi0+aGRyLnNlbmRfdGltZSAgID0gYXZpb19ybDY0KHBiKTsKKyAgICBhc2YtPmhkci5wcmVyb2xsICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgYXNmLT5oZHIuaWdub3JlICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgIGFzZi0+aGRyLmZsYWdzICAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICBhc2YtPmhkci5taW5fcGt0c2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgYXNmLT5oZHIubWF4X3BrdHNpemUgPSBhdmlvX3JsMzIocGIpOworICAgIGlmIChhc2YtPmhkci5taW5fcGt0c2l6ZSA+PSAoMVUgPDwgMjkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBhc2YtPmhkci5tYXhfYml0cmF0ZSA9IGF2aW9fcmwzMihwYik7CisgICAgcy0+cGFja2V0X3NpemUgICAgICAgPSBhc2YtPmhkci5tYXhfcGt0c2l6ZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzZl9yZWFkX3N0cmVhbV9wcm9wZXJ0aWVzKEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCBzaXplKQoreworICAgIEFTRkNvbnRleHQgKmFzZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgQVNGU3RyZWFtICphc2Zfc3Q7CisgICAgZmZfYXNmX2d1aWQgZzsKKyAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGU7CisgICAgaW50IHR5cGVfc3BlY2lmaWNfc2l6ZSwgc2l6ZVg7CisgICAgdW5zaWduZWQgaW50IHRhZzE7CisgICAgaW50NjRfdCBwb3MxLCBwb3MyLCBzdGFydF90aW1lOworICAgIGludCB0ZXN0X2Zvcl9leHRfc3RyZWFtX2F1ZGlvLCBpc19kdnJfbXNfYXVkaW8gPSAwOworCisgICAgaWYgKHMtPm5iX3N0cmVhbXMgPT0gQVNGX01BWF9TVFJFQU1TKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0b28gbWFueSBzdHJlYW1zXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBwb3MxID0gYXZpb190ZWxsKHBiKTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCAxMDAwKTsgLyogMzIgYml0IHB0cyBpbiBtcyAqLworICAgIHN0YXJ0X3RpbWUgICAgID0gYXNmLT5oZHIucHJlcm9sbDsKKworICAgIGlmICghKGFzZi0+aGRyLmZsYWdzICYgMHgwMSkpIHsgLy8gaWYgd2UgYXJlbid0IHN0cmVhbWluZy4uLgorICAgICAgICBpbnQ2NF90IGZzaXplID0gYXZpb19zaXplKHBiKTsKKyAgICAgICAgaWYgKGZzaXplIDw9IDAgfHwgKGludDY0X3QpYXNmLT5oZHIuZmlsZV9zaXplIDw9IDAgfHwKKyAgICAgICAgICAgIEZGQUJTKGZzaXplIC0gKGludDY0X3QpYXNmLT5oZHIuZmlsZV9zaXplKSAvIChmbG9hdClGRk1JTihmc2l6ZSwgYXNmLT5oZHIuZmlsZV9zaXplKSA8IDAuMDUpCisgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSBhc2YtPmhkci5wbGF5X3RpbWUgLworICAgICAgICAgICAgICAgICAgICAgICAoMTAwMDAwMDAgLyAxMDAwKSAtIHN0YXJ0X3RpbWU7CisgICAgfQorICAgIGZmX2dldF9ndWlkKHBiLCAmZyk7CisKKyAgICB0ZXN0X2Zvcl9leHRfc3RyZWFtX2F1ZGlvID0gMDsKKyAgICBpZiAoIWZmX2d1aWRjbXAoJmcsICZmZl9hc2ZfYXVkaW9fc3RyZWFtKSkgeworICAgICAgICB0eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIH0gZWxzZSBpZiAoIWZmX2d1aWRjbXAoJmcsICZmZl9hc2ZfdmlkZW9fc3RyZWFtKSkgeworICAgICAgICB0eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIH0gZWxzZSBpZiAoIWZmX2d1aWRjbXAoJmcsICZmZl9hc2ZfamZpZl9tZWRpYSkpIHsKKyAgICAgICAgdHlwZSAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01KUEVHOworICAgIH0gZWxzZSBpZiAoIWZmX2d1aWRjbXAoJmcsICZmZl9hc2ZfY29tbWFuZF9zdHJlYW0pKSB7CisgICAgICAgIHR5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKKyAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKCZnLCAmZmZfYXNmX2V4dF9zdHJlYW1fZW1iZWRfc3RyZWFtX2hlYWRlcikpIHsKKyAgICAgICAgdGVzdF9mb3JfZXh0X3N0cmVhbV9hdWRpbyA9IDE7CisgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVU5LTk9XTjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZmX2dldF9ndWlkKHBiLCAmZyk7CisgICAgYXZpb19za2lwKHBiLCA4KTsgLyogdG90YWxfc2l6ZSAqLworICAgIHR5cGVfc3BlY2lmaWNfc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgYXZpb19ybDMyKHBiKTsKKyAgICBzdC0+aWQgPSBhdmlvX3JsMTYocGIpICYgMHg3ZjsgLyogc3RyZWFtIGlkICovCisgICAgLy8gbWFwcGluZyBvZiBhc2YgSUQgdG8gQVYgc3RyZWFtIElEOworICAgIGFzZi0+YXNmaWQyYXZpZFtzdC0+aWRdID0gcy0+bmJfc3RyZWFtcyAtIDE7CisgICAgYXNmX3N0ID0gJmFzZi0+c3RyZWFtc1tzdC0+aWRdOworCisgICAgYXZpb19ybDMyKHBiKTsKKworICAgIGlmICh0ZXN0X2Zvcl9leHRfc3RyZWFtX2F1ZGlvKSB7CisgICAgICAgIGZmX2dldF9ndWlkKHBiLCAmZyk7CisgICAgICAgIGlmICghZmZfZ3VpZGNtcCgmZywgJmZmX2FzZl9leHRfc3RyZWFtX2F1ZGlvX3N0cmVhbSkpIHsKKyAgICAgICAgICAgIHR5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgIGlzX2R2cl9tc19hdWRpbyA9IDE7CisgICAgICAgICAgICBmZl9nZXRfZ3VpZChwYiwgJmcpOworICAgICAgICAgICAgYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgZmZfZ2V0X2d1aWQocGIsICZnKTsKKyAgICAgICAgICAgIGF2aW9fcmwzMihwYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSB0eXBlOworICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBpbnQgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocGIsIHN0LT5jb2RlYywgdHlwZV9zcGVjaWZpY19zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoaXNfZHZyX21zX2F1ZGlvKSB7CisgICAgICAgICAgICAvLyBjb2RlY19pZCBhbmQgY29kZWNfdGFnIGFyZSB1bnJlbGlhYmxlIGluIGR2cl9tcworICAgICAgICAgICAgLy8gZmlsZXMuIFNldCB0aGVtIGxhdGVyIGJ5IHByb2Jpbmcgc3RyZWFtLgorICAgICAgICAgICAgc3QtPnJlcXVlc3RfcHJvYmUgICAgPSAxOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykKKyAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9OT05FOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICAgICAgLyogV2UgaGF2ZSB0byBpbml0IHRoZSBmcmFtZSBzaXplIGF0IHNvbWUgcG9pbnQgLi4uLiAqLworICAgICAgICBwb3MyID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgaWYgKHNpemUgPj0gKHBvczIgKyA4IC0gcG9zMSArIDI0KSkgeworICAgICAgICAgICAgYXNmX3N0LT5kc19zcGFuICAgICAgICA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgYXNmX3N0LT5kc19wYWNrZXRfc2l6ZSA9IGF2aW9fcmwxNihwYik7CisgICAgICAgICAgICBhc2Zfc3QtPmRzX2NodW5rX3NpemUgID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgICAgIGF2aW9fcmwxNihwYik7ICAvLyBkc19kYXRhX3NpemUKKyAgICAgICAgICAgIGF2aW9fcjgocGIpOyAgICAvLyBkc19zaWxlbmNlX2RhdGEKKyAgICAgICAgfQorICAgICAgICBpZiAoYXNmX3N0LT5kc19zcGFuID4gMSkgeworICAgICAgICAgICAgaWYgKCFhc2Zfc3QtPmRzX2NodW5rX3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgKGFzZl9zdC0+ZHNfcGFja2V0X3NpemUgLyBhc2Zfc3QtPmRzX2NodW5rX3NpemUgPD0gMSkgfHwKKyAgICAgICAgICAgICAgICBhc2Zfc3QtPmRzX3BhY2tldF9zaXplICUgYXNmX3N0LT5kc19jaHVua19zaXplKQorICAgICAgICAgICAgICAgIGFzZl9zdC0+ZHNfc3BhbiA9IDA7ICAvLyBkaXNhYmxlIGRlc2NyYW1ibGluZworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgICAgICAgICAgICAgc2l6ZSAtIChhdmlvX3RlbGwocGIpIC0gcG9zMSArIDI0KSA+PSA1MSkgeworICAgICAgICBhdmlvX3JsMzIocGIpOworICAgICAgICBhdmlvX3JsMzIocGIpOworICAgICAgICBhdmlvX3I4KHBiKTsKKyAgICAgICAgYXZpb19ybDE2KHBiKTsgICAgICAgIC8qIHNpemUgKi8KKyAgICAgICAgc2l6ZVggICAgICAgICAgICAgPSBhdmlvX3JsMzIocGIpOyAvKiBzaXplICovCisgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAvKiBub3QgYXZhaWxhYmxlIGZvciBhc2YgKi8KKyAgICAgICAgYXZpb19ybDE2KHBiKTsgLyogcGFuZXMgKi8KKyAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JsMTYocGIpOyAvKiBkZXB0aCAqLworICAgICAgICB0YWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGF2aW9fc2tpcChwYiwgMjApOworICAgICAgICBpZiAoc2l6ZVggPiA0MCkgeworICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IGZmaW9fbGltaXQocGIsIHNpemVYIC0gNDApOworICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgICAgICA9IGF2X21hbGxvY3ooc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgLyogRXh0cmFjdCBwYWxldHRlIGZyb20gZXh0cmFkYXRhIGlmIGJwcCA8PSA4ICovCisgICAgICAgIC8qIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgZXh0cmFkYXRhIGNvbnRhaW5zIG9ubHkgcGFsZXR0ZSAqLworICAgICAgICAvKiBUaGlzIGlzIHRydWUgZm9yIGFsbCBwYWxldHRlZCBjb2RlY3MgaW1wbGVtZW50ZWQgaW4gbGliYXZjb2RlYyAqLworICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAmJiAoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPD0gOCkpIHsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZNSU4oc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSwgQVZQQUxFVFRFX1NJWkUpIC8gNDsgaSsrKQorICAgICAgICAgICAgICAgIGFzZl9zdC0+cGFsZXR0ZVtpXSA9IGF2X2Jzd2FwMzIoKCh1aW50MzJfdCAqKXN0LT5jb2RlYy0+ZXh0cmFkYXRhKVtpXSk7CisjZWxzZQorICAgICAgICAgICAgbWVtY3B5KGFzZl9zdC0+cGFsZXR0ZSwgc3QtPmNvZGVjLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgRkZNSU4oc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSwgQVZQQUxFVFRFX1NJWkUpKTsKKyNlbmRpZgorICAgICAgICAgICAgYXNmX3N0LT5wYWxldHRlX2NoYW5nZWQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSB0YWcxOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywgdGFnMSk7CisgICAgICAgIGlmICh0YWcxID09IE1LVEFHKCdEJywgJ1YnLCAnUicsICcgJykpIHsKKyAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworICAgICAgICAgICAgLyogaXNzdWU2NTggY29udGFpbnMgd3Jvbmcgdy9oIGFuZCBNUyBldmVuIHB1dHMgYSBmYWtlIHNlcSBoZWFkZXIKKyAgICAgICAgICAgICAqIHdpdGggd3Jvbmcgdy9oIGluIGV4dHJhZGF0YSB3aGlsZSBhIGNvcnJlY3Qgb25lIGlzIGluIHRoZSBzdHJlYW0uCisgICAgICAgICAgICAgKiBtYXhpbXVtIGxhbWVuZXNzICovCisgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSk7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQorICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfT05DRTsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpCisgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9PTkNFOworICAgIH0KKyAgICBwb3MyID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3NraXAocGIsIHNpemUgLSAocG9zMiAtIHBvczEgKyAyNCkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNmX3JlYWRfZXh0X3N0cmVhbV9wcm9wZXJ0aWVzKEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCBzaXplKQoreworICAgIEFTRkNvbnRleHQgKmFzZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBmZl9hc2ZfZ3VpZCBnOworICAgIGludCBleHRfbGVuLCBwYXlsb2FkX2V4dF9jdCwgc3RyZWFtX2N0LCBpOworICAgIHVpbnQzMl90IGxlYWtfcmF0ZSwgc3RyZWFtX251bTsKKyAgICB1bnNpZ25lZCBpbnQgc3RyZWFtX2xhbmd1YWdlaWRfaW5kZXg7CisKKyAgICBhdmlvX3JsNjQocGIpOyAvLyBzdGFydHRpbWUKKyAgICBhdmlvX3JsNjQocGIpOyAvLyBlbmR0aW1lCisgICAgbGVha19yYXRlID0gYXZpb19ybDMyKHBiKTsgLy8gbGVhay1kYXRhcmF0ZQorICAgIGF2aW9fcmwzMihwYik7IC8vIGJ1Y2tldC1kYXRhc2l6ZQorICAgIGF2aW9fcmwzMihwYik7IC8vIGluaXQtYnVja2V0LWZ1bGxuZXNzCisgICAgYXZpb19ybDMyKHBiKTsgLy8gYWx0LWxlYWstZGF0YXJhdGUKKyAgICBhdmlvX3JsMzIocGIpOyAvLyBhbHQtYnVja2V0LWRhdGFzaXplCisgICAgYXZpb19ybDMyKHBiKTsgLy8gYWx0LWluaXQtYnVja2V0LWZ1bGxuZXNzCisgICAgYXZpb19ybDMyKHBiKTsgLy8gbWF4LW9iamVjdC1zaXplCisgICAgYXZpb19ybDMyKHBiKTsgLy8gZmxhZ3MgKHJlbGlhYmxlLHNlZWthYmxlLG5vX2NsZWFucG9pbnRzPyxyZXNlbmQtbGl2ZS1jbGVhbnBvaW50cywgcmVzdCBvZiBiaXRzIHJlc2VydmVkKQorICAgIHN0cmVhbV9udW0gPSBhdmlvX3JsMTYocGIpOyAvLyBzdHJlYW0tbnVtCisKKyAgICBzdHJlYW1fbGFuZ3VhZ2VpZF9pbmRleCA9IGF2aW9fcmwxNihwYik7IC8vIHN0cmVhbS1sYW5ndWFnZS1pZC1pbmRleAorICAgIGlmIChzdHJlYW1fbnVtIDwgMTI4KQorICAgICAgICBhc2YtPnN0cmVhbXNbc3RyZWFtX251bV0uc3RyZWFtX2xhbmd1YWdlX2luZGV4ID0gc3RyZWFtX2xhbmd1YWdlaWRfaW5kZXg7CisKKyAgICBhdmlvX3JsNjQocGIpOyAvLyBhdmcgZnJhbWV0aW1lIGluIDEwMG5zIHVuaXRzCisgICAgc3RyZWFtX2N0ICAgICAgPSBhdmlvX3JsMTYocGIpOyAvLyBzdHJlYW0tbmFtZS1jb3VudAorICAgIHBheWxvYWRfZXh0X2N0ID0gYXZpb19ybDE2KHBiKTsgLy8gcGF5bG9hZC1leHRlbnNpb24tc3lzdGVtLWNvdW50CisKKyAgICBpZiAoc3RyZWFtX251bSA8IDEyOCkgeworICAgICAgICBhc2YtPnN0cmVhbV9iaXRyYXRlc1tzdHJlYW1fbnVtXSA9IGxlYWtfcmF0ZTsKKyAgICAgICAgYXNmLT5zdHJlYW1zW3N0cmVhbV9udW1dLnBheWxvYWRfZXh0X2N0ID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3RyZWFtX2N0OyBpKyspIHsKKyAgICAgICAgYXZpb19ybDE2KHBiKTsKKyAgICAgICAgZXh0X2xlbiA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIGF2aW9fc2tpcChwYiwgZXh0X2xlbik7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHBheWxvYWRfZXh0X2N0OyBpKyspIHsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGZmX2dldF9ndWlkKHBiLCAmZyk7CisgICAgICAgIHNpemUgPSBhdmlvX3JsMTYocGIpOworICAgICAgICBleHRfbGVuID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgYXZpb19za2lwKHBiLCBleHRfbGVuKTsKKyAgICAgICAgaWYgKHN0cmVhbV9udW0gPCAxMjggJiYgaSA8IEZGX0FSUkFZX0VMRU1TKGFzZi0+c3RyZWFtc1tzdHJlYW1fbnVtXS5wYXlsb2FkKSkgeworICAgICAgICAgICAgQVNGUGF5bG9hZCAqcCA9ICZhc2YtPnN0cmVhbXNbc3RyZWFtX251bV0ucGF5bG9hZFtpXTsKKyAgICAgICAgICAgIHAtPnR5cGUgPSBnWzBdOworICAgICAgICAgICAgcC0+c2l6ZSA9IHNpemU7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiUGF5bG9hZCBleHRlbnNpb24gJXggJWRcbiIsIGdbMF0sIHAtPnNpemUgKTsKKyAgICAgICAgICAgIGFzZi0+c3RyZWFtc1tzdHJlYW1fbnVtXS5wYXlsb2FkX2V4dF9jdCArKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzZl9yZWFkX2NvbnRlbnRfZGVzYyhBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3Qgc2l6ZSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgbGVuMSwgbGVuMiwgbGVuMywgbGVuNCwgbGVuNTsKKworICAgIGxlbjEgPSBhdmlvX3JsMTYocGIpOworICAgIGxlbjIgPSBhdmlvX3JsMTYocGIpOworICAgIGxlbjMgPSBhdmlvX3JsMTYocGIpOworICAgIGxlbjQgPSBhdmlvX3JsMTYocGIpOworICAgIGxlbjUgPSBhdmlvX3JsMTYocGIpOworICAgIGdldF90YWcocywgInRpdGxlIiwgMCwgbGVuMSwgMzIpOworICAgIGdldF90YWcocywgImF1dGhvciIsIDAsIGxlbjIsIDMyKTsKKyAgICBnZXRfdGFnKHMsICJjb3B5cmlnaHQiLCAwLCBsZW4zLCAzMik7CisgICAgZ2V0X3RhZyhzLCAiY29tbWVudCIsIDAsIGxlbjQsIDMyKTsKKyAgICBhdmlvX3NraXAocGIsIGxlbjUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNmX3JlYWRfZXh0X2NvbnRlbnRfZGVzYyhBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3Qgc2l6ZSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBU0ZDb250ZXh0ICphc2YgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGRlc2NfY291bnQsIGksIHJldDsKKworICAgIGRlc2NfY291bnQgPSBhdmlvX3JsMTYocGIpOworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjX2NvdW50OyBpKyspIHsKKyAgICAgICAgaW50IG5hbWVfbGVuLCB2YWx1ZV90eXBlLCB2YWx1ZV9sZW47CisgICAgICAgIGNoYXIgbmFtZVsxMDI0XTsKKworICAgICAgICBuYW1lX2xlbiA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIGlmIChuYW1lX2xlbiAlIDIpICAgLy8gbXVzdCBiZSBldmVuLCBicm9rZW4gbGF2ZiB2ZXJzaW9ucyB3cm90ZSBsZW4tMQorICAgICAgICAgICAgbmFtZV9sZW4gKz0gMTsKKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX2dldF9zdHIxNmxlKHBiLCBuYW1lX2xlbiwgbmFtZSwgc2l6ZW9mKG5hbWUpKSkgPCBuYW1lX2xlbikKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgbmFtZV9sZW4gLSByZXQpOworICAgICAgICB2YWx1ZV90eXBlID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgdmFsdWVfbGVuICA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIGlmICghdmFsdWVfdHlwZSAmJiB2YWx1ZV9sZW4gJSAyKQorICAgICAgICAgICAgdmFsdWVfbGVuICs9IDE7CisgICAgICAgIC8qIE15IHNhbXBsZSBoYXMgdGhhdCBzdHJlYW0gc2V0IHRvIDAgbWF5YmUgdGhhdCBtZWFuIHRoZSBjb250YWluZXIuCisgICAgICAgICAqIEFTRiBzdHJlYW0gY291bnQgc3RhcnRzIGF0IDEuIEkgYW0gdXNpbmcgMCB0byB0aGUgY29udGFpbmVyIHZhbHVlCisgICAgICAgICAqIHNpbmNlIGl0J3MgdW51c2VkLiAqLworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiQXNwZWN0UmF0aW9YIikpCisgICAgICAgICAgICBhc2YtPmRhclswXS5udW0gPSBnZXRfdmFsdWUocy0+cGIsIHZhbHVlX3R5cGUsIDMyKTsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiQXNwZWN0UmF0aW9ZIikpCisgICAgICAgICAgICBhc2YtPmRhclswXS5kZW4gPSBnZXRfdmFsdWUocy0+cGIsIHZhbHVlX3R5cGUsIDMyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ2V0X3RhZyhzLCBuYW1lLCB2YWx1ZV90eXBlLCB2YWx1ZV9sZW4sIDMyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc2ZfcmVhZF9sYW5ndWFnZV9saXN0KEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCBzaXplKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFTRkNvbnRleHQgKmFzZiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaiwgcmV0OworICAgIGludCBzdHJlYW1fY291bnQgPSBhdmlvX3JsMTYocGIpOworICAgIGZvciAoaiA9IDA7IGogPCBzdHJlYW1fY291bnQ7IGorKykgeworICAgICAgICBjaGFyIGxhbmdbNl07CisgICAgICAgIHVuc2lnbmVkIGludCBsYW5nX2xlbiA9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAoKHJldCA9IGF2aW9fZ2V0X3N0cjE2bGUocGIsIGxhbmdfbGVuLCBsYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhbmcpKSkgPCBsYW5nX2xlbikKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgbGFuZ19sZW4gLSByZXQpOworICAgICAgICBpZiAoaiA8IDEyOCkKKyAgICAgICAgICAgIGF2X3N0cmxjcHkoYXNmLT5zdHJlYW1fbGFuZ3VhZ2VzW2pdLCBsYW5nLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmFzZi0+c3RyZWFtX2xhbmd1YWdlcykpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzZl9yZWFkX21ldGFkYXRhKEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCBzaXplKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFTRkNvbnRleHQgKmFzZiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgbiwgc3RyZWFtX251bSwgbmFtZV9sZW4sIHZhbHVlX2xlbjsKKyAgICBpbnQgcmV0LCBpOworICAgIG4gPSBhdmlvX3JsMTYocGIpOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBjaGFyIG5hbWVbMTAyNF07CisgICAgICAgIGludCB2YWx1ZV90eXBlOworCisgICAgICAgIGF2aW9fcmwxNihwYik7ICAvLyBsYW5nX2xpc3RfaW5kZXgKKyAgICAgICAgc3RyZWFtX251bSA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIG5hbWVfbGVuICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICB2YWx1ZV90eXBlID0gYXZpb19ybDE2KHBiKTsgLyogdmFsdWVfdHlwZSAqLworICAgICAgICB2YWx1ZV9sZW4gID0gYXZpb19ybDMyKHBiKTsKKworICAgICAgICBpZiAoKHJldCA9IGF2aW9fZ2V0X3N0cjE2bGUocGIsIG5hbWVfbGVuLCBuYW1lLCBzaXplb2YobmFtZSkpKSA8IG5hbWVfbGVuKQorICAgICAgICAgICAgYXZpb19za2lwKHBiLCBuYW1lX2xlbiAtIHJldCk7CisgICAgICAgIGF2X2Rsb2cocywgIiVkIHN0cmVhbSAlZCBuYW1lX2xlbiAlMmQgdHlwZSAlZCBsZW4gJTRkIDwlcz5cbiIsCisgICAgICAgICAgICAgICAgaSwgc3RyZWFtX251bSwgbmFtZV9sZW4sIHZhbHVlX3R5cGUsIHZhbHVlX2xlbiwgbmFtZSk7CisKKyAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIkFzcGVjdFJhdGlvWCIpKXsKKyAgICAgICAgICAgIGludCBhc3BlY3RfeCA9IGdldF92YWx1ZShzLT5wYiwgdmFsdWVfdHlwZSwgMTYpOworICAgICAgICAgICAgaWYoc3RyZWFtX251bSA8IDEyOCkKKyAgICAgICAgICAgICAgICBhc2YtPmRhcltzdHJlYW1fbnVtXS5udW0gPSBhc3BlY3RfeDsKKyAgICAgICAgfSBlbHNlIGlmKCFzdHJjbXAobmFtZSwgIkFzcGVjdFJhdGlvWSIpKXsKKyAgICAgICAgICAgIGludCBhc3BlY3RfeSA9IGdldF92YWx1ZShzLT5wYiwgdmFsdWVfdHlwZSwgMTYpOworICAgICAgICAgICAgaWYoc3RyZWFtX251bSA8IDEyOCkKKyAgICAgICAgICAgICAgICBhc2YtPmRhcltzdHJlYW1fbnVtXS5kZW4gPSBhc3BlY3RfeTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldF90YWcocywgbmFtZSwgdmFsdWVfdHlwZSwgdmFsdWVfbGVuLCAxNik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc2ZfcmVhZF9tYXJrZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IHNpemUpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVNGQ29udGV4dCAqYXNmID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpLCBjb3VudCwgbmFtZV9sZW4sIHJldDsKKyAgICBjaGFyIG5hbWVbMTAyNF07CisKKyAgICBhdmlvX3JsNjQocGIpOyAgICAgICAgICAgIC8vIHJlc2VydmVkIDE2IGJ5dGVzCisgICAgYXZpb19ybDY0KHBiKTsgICAgICAgICAgICAvLyAuLi4KKyAgICBjb3VudCA9IGF2aW9fcmwzMihwYik7ICAgIC8vIG1hcmtlcnMgY291bnQKKyAgICBhdmlvX3JsMTYocGIpOyAgICAgICAgICAgIC8vIHJlc2VydmVkIDIgYnl0ZXMKKyAgICBuYW1lX2xlbiA9IGF2aW9fcmwxNihwYik7IC8vIG5hbWUgbGVuZ3RoCisgICAgZm9yIChpID0gMDsgaSA8IG5hbWVfbGVuOyBpKyspCisgICAgICAgIGF2aW9fcjgocGIpOyAvLyBza2lwIHRoZSBuYW1lCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBpbnQ2NF90IHByZXNfdGltZTsKKyAgICAgICAgaW50IG5hbWVfbGVuOworCisgICAgICAgIGF2aW9fcmw2NChwYik7ICAgICAgICAgICAgIC8vIG9mZnNldCwgOCBieXRlcworICAgICAgICBwcmVzX3RpbWUgPSBhdmlvX3JsNjQocGIpOyAvLyBwcmVzZW50YXRpb24gdGltZQorICAgICAgICBwcmVzX3RpbWUgLT0gYXNmLT5oZHIucHJlcm9sbCAqIDEwMDAwOworICAgICAgICBhdmlvX3JsMTYocGIpOyAgICAgICAgICAgICAvLyBlbnRyeSBsZW5ndGgKKyAgICAgICAgYXZpb19ybDMyKHBiKTsgICAgICAgICAgICAgLy8gc2VuZCB0aW1lCisgICAgICAgIGF2aW9fcmwzMihwYik7ICAgICAgICAgICAgIC8vIGZsYWdzCisgICAgICAgIG5hbWVfbGVuID0gYXZpb19ybDMyKHBiKTsgIC8vIG5hbWUgbGVuZ3RoCisgICAgICAgIGlmICgocmV0ID0gYXZpb19nZXRfc3RyMTZsZShwYiwgbmFtZV9sZW4gKiAyLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWUpKSkgPCBuYW1lX2xlbikKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgbmFtZV9sZW4gLSByZXQpOworICAgICAgICBhdnByaXZfbmV3X2NoYXB0ZXIocywgaSwgKEFWUmF0aW9uYWwpIHsgMSwgMTAwMDAwMDAgfSwgcHJlc190aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTk9QVFNfVkFMVUUsIG5hbWUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzZl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVNGQ29udGV4dCAqYXNmID0gcy0+cHJpdl9kYXRhOworICAgIGZmX2FzZl9ndWlkIGc7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGk7CisgICAgaW50NjRfdCBnc2l6ZTsKKworICAgIGZmX2dldF9ndWlkKHBiLCAmZyk7CisgICAgaWYgKGZmX2d1aWRjbXAoJmcsICZmZl9hc2ZfaGVhZGVyKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgYXZpb19ybDY0KHBiKTsKKyAgICBhdmlvX3JsMzIocGIpOworICAgIGF2aW9fcjgocGIpOworICAgIGF2aW9fcjgocGIpOworICAgIG1lbXNldCgmYXNmLT5hc2ZpZDJhdmlkLCAtMSwgc2l6ZW9mKGFzZi0+YXNmaWQyYXZpZCkpOworCisgICAgZm9yIChpID0gMDsgaTwxMjg7IGkrKykKKyAgICAgICAgYXNmLT5zdHJlYW1zW2ldLnN0cmVhbV9sYW5ndWFnZV9pbmRleCA9IDEyODsgLy8gaW52YWxpZCBzdHJlYW0gaW5kZXggbWVhbnMgbm8gbGFuZ3VhZ2UgaW5mbworCisgICAgZm9yICg7OykgeworICAgICAgICB1aW50NjRfdCBncG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgZmZfZ2V0X2d1aWQocGIsICZnKTsKKyAgICAgICAgZ3NpemUgPSBhdmlvX3JsNjQocGIpOworICAgICAgICBwcmludF9ndWlkKCZnKTsKKyAgICAgICAgaWYgKCFmZl9ndWlkY21wKCZnLCAmZmZfYXNmX2RhdGFfaGVhZGVyKSkgeworICAgICAgICAgICAgYXNmLT5kYXRhX29iamVjdF9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgLyogSWYgbm90IHN0cmVhbWluZywgZ3NpemUgaXMgbm90IHVubGltaXRlZCAoaG93PyksCisgICAgICAgICAgICAgKiBhbmQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGluIHRoZSBmaWxlLi4gKi8KKyAgICAgICAgICAgIGlmICghKGFzZi0+aGRyLmZsYWdzICYgMHgwMSkgJiYgZ3NpemUgPj0gMTAwKQorICAgICAgICAgICAgICAgIGFzZi0+ZGF0YV9vYmplY3Rfc2l6ZSA9IGdzaXplIC0gMjQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXNmLT5kYXRhX29iamVjdF9zaXplID0gKHVpbnQ2NF90KS0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdzaXplIDwgMjQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKCFmZl9ndWlkY21wKCZnLCAmZmZfYXNmX2ZpbGVfaGVhZGVyKSkgeworICAgICAgICAgICAgaW50IHJldCA9IGFzZl9yZWFkX2ZpbGVfcHJvcGVydGllcyhzLCBnc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKCZnLCAmZmZfYXNmX3N0cmVhbV9oZWFkZXIpKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gYXNmX3JlYWRfc3RyZWFtX3Byb3BlcnRpZXMocywgZ3NpemUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcCgmZywgJmZmX2FzZl9jb21tZW50X2hlYWRlcikpIHsKKyAgICAgICAgICAgIGFzZl9yZWFkX2NvbnRlbnRfZGVzYyhzLCBnc2l6ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIWZmX2d1aWRjbXAoJmcsICZmZl9hc2ZfbGFuZ3VhZ2VfZ3VpZCkpIHsKKyAgICAgICAgICAgIGFzZl9yZWFkX2xhbmd1YWdlX2xpc3QocywgZ3NpemUpOworICAgICAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKCZnLCAmZmZfYXNmX2V4dGVuZGVkX2NvbnRlbnRfaGVhZGVyKSkgeworICAgICAgICAgICAgYXNmX3JlYWRfZXh0X2NvbnRlbnRfZGVzYyhzLCBnc2l6ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIWZmX2d1aWRjbXAoJmcsICZmZl9hc2ZfbWV0YWRhdGFfaGVhZGVyKSkgeworICAgICAgICAgICAgYXNmX3JlYWRfbWV0YWRhdGEocywgZ3NpemUpOworICAgICAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKCZnLCAmZmZfYXNmX21ldGFkYXRhX2xpYnJhcnlfaGVhZGVyKSkgeworICAgICAgICAgICAgYXNmX3JlYWRfbWV0YWRhdGEocywgZ3NpemUpOworICAgICAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKCZnLCAmZmZfYXNmX2V4dF9zdHJlYW1faGVhZGVyKSkgeworICAgICAgICAgICAgYXNmX3JlYWRfZXh0X3N0cmVhbV9wcm9wZXJ0aWVzKHMsIGdzaXplKTsKKworICAgICAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgYSBvcHRpb25hbCBzdHJlYW0gcHJvcGVydGllcyBvYmplY3QgdG8gZm9sbG93CisgICAgICAgICAgICAvLyBpZiBzbyB0aGUgbmV4dCBpdGVyYXRpb24gd2lsbCBwaWNrIGl0IHVwCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcCgmZywgJmZmX2FzZl9oZWFkMV9ndWlkKSkgeworICAgICAgICAgICAgZmZfZ2V0X2d1aWQocGIsICZnKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcCgmZywgJmZmX2FzZl9tYXJrZXJfaGVhZGVyKSkgeworICAgICAgICAgICAgYXNmX3JlYWRfbWFya2VyKHMsIGdzaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXMtPmtleWxlbikgeworICAgICAgICAgICAgICAgIGlmICghZmZfZ3VpZGNtcCgmZywgJmZmX2FzZl9jb250ZW50X2VuY3J5cHRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0IHBrdDsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRSTSBwcm90ZWN0ZWQgc3RyZWFtIGRldGVjdGVkLCBkZWNvZGluZyB3aWxsIGxpa2VseSBmYWlsIVxuIik7CisgICAgICAgICAgICAgICAgICAgIGxlbj0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIlNlY3JldCBkYXRhOlxuIik7CisgICAgICAgICAgICAgICAgICAgIGF2X2dldF9wYWNrZXQocGIsICZwa3QsIGxlbik7IGF2X2hleF9kdW1wX2xvZyhzLCBBVl9MT0dfREVCVUcsIHBrdC5kYXRhLCBwa3Quc2l6ZSk7IGF2X2ZyZWVfcGFja2V0KCZwa3QpOworICAgICAgICAgICAgICAgICAgICBsZW49IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICAgICAgICAgIGdldF90YWcocywgIkFTRl9Qcm90ZWN0aW9uX1R5cGUiLCAtMSwgbGVuLCAzMik7CisgICAgICAgICAgICAgICAgICAgIGxlbj0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3RhZyhzLCAiQVNGX0tleV9JRCIsIC0xLCBsZW4sIDMyKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgICAgICBnZXRfdGFnKHMsICJBU0ZfTGljZW5zZV9VUkwiLCAtMSwgbGVuLCAzMik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcCgmZywgJmZmX2FzZl9leHRfY29udGVudF9lbmNyeXB0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0IERSTSBwcm90ZWN0ZWQgc3RyZWFtIGRldGVjdGVkLCBkZWNvZGluZyB3aWxsIGxpa2VseSBmYWlsIVxuIik7CisgICAgICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgImVuY3J5cHRpb24iLCAiQVNGIEV4dGVuZGVkIENvbnRlbnQgRW5jcnlwdGlvbiIsIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZmX2d1aWRjbXAoJmcsICZmZl9hc2ZfZGlnaXRhbF9zaWduYXR1cmUpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIkRpZ2l0YWwgc2lnbmF0dXJlIGRldGVjdGVkIVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhdmlvX3RlbGwocGIpICE9IGdwb3MgKyBnc2l6ZSkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgImdwb3MgbWlzbWF0Y2ggb3VyIHBvcz0lIlBSSXU2NCIsIGVuZD0lIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgYXZpb190ZWxsKHBiKSAtIGdwb3MsIGdzaXplKTsKKyAgICAgICAgYXZpb19zZWVrKHBiLCBncG9zICsgZ3NpemUsIFNFRUtfU0VUKTsKKyAgICB9CisgICAgZmZfZ2V0X2d1aWQocGIsICZnKTsKKyAgICBhdmlvX3JsNjQocGIpOworICAgIGF2aW9fcjgocGIpOworICAgIGF2aW9fcjgocGIpOworICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgYXNmLT5kYXRhX29mZnNldCAgICAgID0gYXZpb190ZWxsKHBiKTsKKyAgICBhc2YtPnBhY2tldF9zaXplX2xlZnQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgIGludCBzdHJlYW1fbnVtID0gYXNmLT5hc2ZpZDJhdmlkW2ldOworICAgICAgICBpZiAoc3RyZWFtX251bSA+PSAwKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9udW1dOworICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmJpdF9yYXRlKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBhc2YtPnN0cmVhbV9iaXRyYXRlc1tpXTsKKyAgICAgICAgICAgIGlmIChhc2YtPmRhcltpXS5udW0gPiAwICYmIGFzZi0+ZGFyW2ldLmRlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBhdl9yZWR1Y2UoJnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXNmLT5kYXJbaV0ubnVtLCBhc2YtPmRhcltpXS5kZW4sIElOVF9NQVgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYXNmLT5kYXJbMF0ubnVtID4gMCkgJiYgKGFzZi0+ZGFyWzBdLmRlbiA+IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBBU0YgY29udGFpbmVyIHZhbHVlIGlmIHRoZSBzdHJlYW0gZG9lc24ndCBzZXQgQVIuCisgICAgICAgICAgICAgICAgICAgICAgIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSkKKyAgICAgICAgICAgICAgICBhdl9yZWR1Y2UoJnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXNmLT5kYXJbMF0ubnVtLCBhc2YtPmRhclswXS5kZW4sIElOVF9NQVgpOworCisgICAgICAgICAgICBhdl9kbG9nKHMsICJpPSVkLCBzdC0+Y29kZWMtPmNvZGVjX3R5cGU6JWQsIGFzZi0+ZGFyICVkOiVkIHNhcj0lZDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgc3QtPmNvZGVjLT5jb2RlY190eXBlLCBhc2YtPmRhcltpXS5udW0sIGFzZi0+ZGFyW2ldLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworCisgICAgICAgICAgICAvLyBjb3B5IGFuZCBjb252ZXJ0IGxhbmd1YWdlIGNvZGVzIHRvIHRoZSBmcm9udGVuZAorICAgICAgICAgICAgaWYgKGFzZi0+c3RyZWFtc1tpXS5zdHJlYW1fbGFuZ3VhZ2VfaW5kZXggPCAxMjgpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZmMxNzY2ID0gYXNmLT5zdHJlYW1fbGFuZ3VhZ2VzW2FzZi0+c3RyZWFtc1tpXS5zdHJlYW1fbGFuZ3VhZ2VfaW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChyZmMxNzY2ICYmIHN0cmxlbihyZmMxNzY2KSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBwcmltYXJ5X3RhZ1szXSA9IHsgcmZjMTc2NlswXSwgcmZjMTc2NlsxXSwgJ1wwJyB9OyAvLyBpZ25vcmUgY291bnRyeSBjb2RlIGlmIGFueQorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppc282MzkyICAgICAgID0gYXZfY29udmVydF9sYW5nX3RvKHByaW1hcnlfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0xBTkdfSVNPNjM5XzJfQklCTCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc282MzkyKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgImxhbmd1YWdlIiwgaXNvNjM5MiwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZmZfbWV0YWRhdGFfY29udigmcy0+bWV0YWRhdGEsIE5VTEwsIGZmX2FzZl9tZXRhZGF0YV9jb252KTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIERPXzJCSVRTKGJpdHMsIHZhciwgZGVmdmFsKSAgICAgICAgICAgICBcCisgICAgc3dpdGNoIChiaXRzICYgMykgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhciA9IGF2aW9fcmwzMihwYik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJzaXplICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhciA9IGF2aW9fcmwxNihwYik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJzaXplICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhciA9IGF2aW9fcjgocGIpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJzaXplKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhciA9IGRlZnZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvKioKKyAqIExvYWQgYSBzaW5nbGUgQVNGIHBhY2tldCBpbnRvIHRoZSBkZW11eGVyLgorICogQHBhcmFtIHMgZGVtdXggY29udGV4dAorICogQHBhcmFtIHBiIGNvbnRleHQgdG8gcmVhZCBkYXRhIGZyb20KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IGFzZl9nZXRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiKQoreworICAgIEFTRkNvbnRleHQgKmFzZiA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50MzJfdCBwYWNrZXRfbGVuZ3RoLCBwYWRzaXplOworICAgIGludCByc2l6ZSA9IDg7CisgICAgaW50IGMsIGQsIGUsIG9mZjsKKworICAgIC8vIGlmIHdlIGRvIG5vdCBrbm93IHBhY2tldCBzaXplLCBhbGxvdyBza2lwcGluZyB1cCB0byAzMiBrQgorICAgIG9mZiA9IDMyNzY4OworICAgIGlmIChhc2YtPm5vX3Jlc3luY19zZWFyY2gpCisgICAgICAgIG9mZiA9IDM7CisgICAgZWxzZSBpZiAocy0+cGFja2V0X3NpemUgPiAwKQorICAgICAgICBvZmYgPSAoYXZpb190ZWxsKHBiKSAtIHMtPmRhdGFfb2Zmc2V0KSAlIHMtPnBhY2tldF9zaXplICsgMzsKKworICAgIGMgPSBkID0gZSA9IC0xOworICAgIHdoaWxlIChvZmYtLSA+IDApIHsKKyAgICAgICAgYyA9IGQ7CisgICAgICAgIGQgPSBlOworICAgICAgICBlID0gYXZpb19yOChwYik7CisgICAgICAgIGlmIChjID09IDB4ODIgJiYgIWQgJiYgIWUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoYyAhPSAweDgyKSB7CisgICAgICAgIC8qIFRoaXMgY29kZSBhbGxvd3MgaGFuZGxpbmcgb2YgLUVBR0FJTiBhdCBwYWNrZXQgYm91bmRhcmllcyAoaS5lLgorICAgICAgICAgKiBpZiB0aGUgcGFja2V0IHN5bmMgY29kZSBhYm92ZSB0cmlnZ2VycyAtRUFHQUlOKS4gVGhpcyBkb2VzIG5vdAorICAgICAgICAgKiBpbXBseSBjb21wbGV0ZSAtRUFHQUlOIGhhbmRsaW5nIHN1cHBvcnQgYXQgcmFuZG9tIHBvc2l0aW9ucyBpbgorICAgICAgICAgKiB0aGUgc3RyZWFtLiAqLworICAgICAgICBpZiAocGItPmVycm9yID09IEFWRVJST1IoRUFHQUlOKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIGlmICghYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImZmIGFzZiBiYWQgaGVhZGVyICV4ICBhdDolIlBSSWQ2NCJcbiIsIGMsIGF2aW9fdGVsbChwYikpOworICAgIH0KKyAgICBpZiAoKGMgJiAweDhmKSA9PSAweDgyKSB7CisgICAgICAgIGlmIChkIHx8IGUpIHsKKyAgICAgICAgICAgIGlmICghYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZmYgYXNmIGJhZCBub24gemVyb1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBjICAgICAgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgZCAgICAgID0gYXZpb19yOChwYik7CisgICAgICAgIHJzaXplICs9IDM7CisgICAgfSBlbHNlIGlmKCFhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgIGF2aW9fc2VlayhwYiwgLTEsIFNFRUtfQ1VSKTsgLy8gRklYTUUKKyAgICB9CisKKyAgICBhc2YtPnBhY2tldF9mbGFncyAgICA9IGM7CisgICAgYXNmLT5wYWNrZXRfcHJvcGVydHkgPSBkOworCisgICAgRE9fMkJJVFMoYXNmLT5wYWNrZXRfZmxhZ3MgPj4gNSwgcGFja2V0X2xlbmd0aCwgcy0+cGFja2V0X3NpemUpOworICAgIERPXzJCSVRTKGFzZi0+cGFja2V0X2ZsYWdzID4+IDEsIHBhZHNpemUsIDApOyAvLyBzZXF1ZW5jZSBpZ25vcmVkCisgICAgRE9fMkJJVFMoYXNmLT5wYWNrZXRfZmxhZ3MgPj4gMywgcGFkc2l6ZSwgMCk7IC8vIHBhZGRpbmcgbGVuZ3RoCisKKyAgICAvLyB0aGUgZm9sbG93aW5nIGNoZWNrcyBwcmV2ZW50IG92ZXJmbG93cyBhbmQgaW5maW5pdGUgbG9vcHMKKyAgICBpZiAoIXBhY2tldF9sZW5ndGggfHwgcGFja2V0X2xlbmd0aCA+PSAoMVUgPDwgMjkpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiaW52YWxpZCBwYWNrZXRfbGVuZ3RoICUiUFJJdTMyIiBhdDolIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICBwYWNrZXRfbGVuZ3RoLCBhdmlvX3RlbGwocGIpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChwYWRzaXplID49IHBhY2tldF9sZW5ndGgpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJpbnZhbGlkIHBhZHNpemUgJSJQUkl1MzIiIGF0OiUiUFJJZDY0IlxuIiwgcGFkc2l6ZSwgYXZpb190ZWxsKHBiKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGFzZi0+cGFja2V0X3RpbWVzdGFtcCA9IGF2aW9fcmwzMihwYik7CisgICAgYXZpb19ybDE2KHBiKTsgLyogZHVyYXRpb24gKi8KKyAgICAvLyByc2l6ZSBoYXMgYXQgbGVhc3QgMTEgYnl0ZXMgd2hpY2ggaGF2ZSB0byBiZSBwcmVzZW50CisKKyAgICBpZiAoYXNmLT5wYWNrZXRfZmxhZ3MgJiAweDAxKSB7CisgICAgICAgIGFzZi0+cGFja2V0X3NlZ3NpemV0eXBlID0gYXZpb19yOChwYik7CisgICAgICAgIHJzaXplKys7CisgICAgICAgIGFzZi0+cGFja2V0X3NlZ21lbnRzID0gYXNmLT5wYWNrZXRfc2Vnc2l6ZXR5cGUgJiAweDNmOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzZi0+cGFja2V0X3NlZ21lbnRzICAgID0gMTsKKyAgICAgICAgYXNmLT5wYWNrZXRfc2Vnc2l6ZXR5cGUgPSAweDgwOworICAgIH0KKyAgICBpZiAocnNpemUgPiBwYWNrZXRfbGVuZ3RoIC0gcGFkc2l6ZSkgeworICAgICAgICBhc2YtPnBhY2tldF9zaXplX2xlZnQgPSAwOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImludmFsaWQgcGFja2V0IGhlYWRlciBsZW5ndGggJWQgZm9yIHBrdGxlbiAlIlBSSXUzMiItJSJQUkl1MzIiIGF0ICUiUFJJZDY0IlxuIiwKKyAgICAgICAgICAgICAgIHJzaXplLCBwYWNrZXRfbGVuZ3RoLCBwYWRzaXplLCBhdmlvX3RlbGwocGIpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGFzZi0+cGFja2V0X3NpemVfbGVmdCA9IHBhY2tldF9sZW5ndGggLSBwYWRzaXplIC0gcnNpemU7CisgICAgaWYgKHBhY2tldF9sZW5ndGggPCBhc2YtPmhkci5taW5fcGt0c2l6ZSkKKyAgICAgICAgcGFkc2l6ZSArPSBhc2YtPmhkci5taW5fcGt0c2l6ZSAtIHBhY2tldF9sZW5ndGg7CisgICAgYXNmLT5wYWNrZXRfcGFkc2l6ZSA9IHBhZHNpemU7CisgICAgYXZfZGxvZyhzLCAicGFja2V0OiBzaXplPSVkIHBhZHNpemU9JWQgIGxlZnQ9JWRcbiIsCisgICAgICAgICAgICBzLT5wYWNrZXRfc2l6ZSwgYXNmLT5wYWNrZXRfcGFkc2l6ZSwgYXNmLT5wYWNrZXRfc2l6ZV9sZWZ0KTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKgorICogQHJldHVybiA8MCBpZiBlcnJvcgorICovCitzdGF0aWMgaW50IGFzZl9yZWFkX2ZyYW1lX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYikKK3sKKyAgICBBU0ZDb250ZXh0ICphc2YgPSBzLT5wcml2X2RhdGE7CisgICAgQVNGU3RyZWFtICphc2ZzdDsKKyAgICBpbnQgcnNpemUgICAgICAgPSAxOworICAgIGludCBudW0gICAgICAgICA9IGF2aW9fcjgocGIpOworICAgIGludCBpOworICAgIGludDY0X3QgdHMwLCB0czEgYXZfdW51c2VkOworCisgICAgYXNmLT5wYWNrZXRfc2VnbWVudHMtLTsKKyAgICBhc2YtPnBhY2tldF9rZXlfZnJhbWUgPSBudW0gPj4gNzsKKyAgICBhc2YtPnN0cmVhbV9pbmRleCAgICAgPSBhc2YtPmFzZmlkMmF2aWRbbnVtICYgMHg3Zl07CisgICAgYXNmc3QgICAgICAgICAgICAgICAgID0gJmFzZi0+c3RyZWFtc1tudW0gJiAweDdmXTsKKyAgICAvLyBzZXF1ZW5jZSBzaG91bGQgYmUgaWdub3JlZCEKKyAgICBET18yQklUUyhhc2YtPnBhY2tldF9wcm9wZXJ0eSA+PiA0LCBhc2YtPnBhY2tldF9zZXEsIDApOworICAgIERPXzJCSVRTKGFzZi0+cGFja2V0X3Byb3BlcnR5ID4+IDIsIGFzZi0+cGFja2V0X2ZyYWdfb2Zmc2V0LCAwKTsKKyAgICBET18yQklUUyhhc2YtPnBhY2tldF9wcm9wZXJ0eSwgYXNmLT5wYWNrZXRfcmVwbGljX3NpemUsIDApOworICAgIGF2X2Rsb2coYXNmLCAia2V5OiVkIHN0cmVhbTolZCBzZXE6JWQgb2Zmc2V0OiVkIHJlcGxpY19zaXplOiVkXG4iLAorICAgICAgICAgICAgYXNmLT5wYWNrZXRfa2V5X2ZyYW1lLCBhc2YtPnN0cmVhbV9pbmRleCwgYXNmLT5wYWNrZXRfc2VxLAorICAgICAgICAgICAgYXNmLT5wYWNrZXRfZnJhZ19vZmZzZXQsIGFzZi0+cGFja2V0X3JlcGxpY19zaXplKTsKKyAgICBpZiAocnNpemUrKGludDY0X3QpYXNmLT5wYWNrZXRfcmVwbGljX3NpemUgPiBhc2YtPnBhY2tldF9zaXplX2xlZnQpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInBhY2tldF9yZXBsaWNfc2l6ZSAlZCBpcyBpbnZhbGlkXG4iLCBhc2YtPnBhY2tldF9yZXBsaWNfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoYXNmLT5wYWNrZXRfcmVwbGljX3NpemUgPj0gOCkgeworICAgICAgICBpbnQ2NF90IGVuZCA9IGF2aW9fdGVsbChwYikgKyBhc2YtPnBhY2tldF9yZXBsaWNfc2l6ZTsKKyAgICAgICAgQVZSYXRpb25hbCBhc3BlY3Q7CisgICAgICAgIGFzZnN0LT5wYWNrZXRfb2JqX3NpemUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAoYXNmc3QtPnBhY2tldF9vYmpfc2l6ZSA+PSAoMSA8PCAyNCkgfHwgYXNmc3QtPnBhY2tldF9vYmpfc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicGFja2V0X29ial9zaXplIGludmFsaWRcbiIpOworICAgICAgICAgICAgYXNmc3QtPnBhY2tldF9vYmpfc2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBhc2YtPnBhY2tldF9mcmFnX3RpbWVzdGFtcCA9IGF2aW9fcmwzMihwYik7IC8vIHRpbWVzdGFtcAorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhc2ZzdC0+cGF5bG9hZF9leHRfY3Q7IGkrKykgeworICAgICAgICAgICAgQVNGUGF5bG9hZCAqcCA9ICZhc2ZzdC0+cGF5bG9hZFtpXTsKKyAgICAgICAgICAgIGludCBzaXplID0gcC0+c2l6ZTsKKyAgICAgICAgICAgIGludDY0X3QgcGF5ZW5kOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMHhGRkZGKQorICAgICAgICAgICAgICAgIHNpemUgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgcGF5ZW5kID0gYXZpb190ZWxsKHBiKSArIHNpemU7CisgICAgICAgICAgICBpZiAocGF5ZW5kID4gZW5kKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInRvbyBsb25nIHBheWxvYWRcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChwLT50eXBlKSB7CisgICAgICAgICAgICBjYXNlIDB4NTA6CisvLyAgICAgICAgICAgICAgZHVyYXRpb24gPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDU0OgorICAgICAgICAgICAgICAgIGFzcGVjdC5udW0gPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgICAgICBhc3BlY3QuZGVuID0gYXZpb19yOChwYik7CisgICAgICAgICAgICAgICAgaWYgKGFzcGVjdC5udW0gPiAwICYmIGFzcGVjdC5kZW4gPiAwICYmIGFzZi0+c3RyZWFtX2luZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1thc2YtPnN0cmVhbV9pbmRleF0tPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhc3BlY3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDJBOgorICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgICAgICAgICAgICAgdHMwID0gYXZpb19ybDY0KHBiKTsKKyAgICAgICAgICAgICAgICB0czEgPSBhdmlvX3JsNjQocGIpOworICAgICAgICAgICAgICAgIGlmICh0czAhPSAtMSkgYXNmLT5wYWNrZXRfZnJhZ190aW1lc3RhbXAgPSB0czAvMTAwMDA7CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICBhc2YtPnBhY2tldF9mcmFnX3RpbWVzdGFtcCA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgICAgIGFzZi0+dHNfaXNfcHRzID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg1QjoKKyAgICAgICAgICAgIGNhc2UgMHhCNzoKKyAgICAgICAgICAgIGNhc2UgMHhDQzoKKyAgICAgICAgICAgIGNhc2UgMHhDMDoKKyAgICAgICAgICAgIGNhc2UgMHhBMDoKKyAgICAgICAgICAgICAgICAvL3Vua25vd24KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgcGF5ZW5kLCBTRUVLX1NFVCk7CisgICAgICAgIH0KKworICAgICAgICBhdmlvX3NlZWsocGIsIGVuZCwgU0VFS19TRVQpOworICAgICAgICByc2l6ZSArPSBhc2YtPnBhY2tldF9yZXBsaWNfc2l6ZTsgLy8gRklYTUUgLSBjaGVjayB2YWxpZGl0eQorICAgIH0gZWxzZSBpZiAoYXNmLT5wYWNrZXRfcmVwbGljX3NpemUgPT0gMSkgeworICAgICAgICAvLyBtdWx0aXBhY2tldCAtIGZyYWdfb2Zmc2V0IGlzIGJlZ2lubmluZyB0aW1lc3RhbXAKKyAgICAgICAgYXNmLT5wYWNrZXRfdGltZV9zdGFydCAgICAgPSBhc2YtPnBhY2tldF9mcmFnX29mZnNldDsKKyAgICAgICAgYXNmLT5wYWNrZXRfZnJhZ19vZmZzZXQgICAgPSAwOworICAgICAgICBhc2YtPnBhY2tldF9mcmFnX3RpbWVzdGFtcCA9IGFzZi0+cGFja2V0X3RpbWVzdGFtcDsKKworICAgICAgICBhc2YtPnBhY2tldF90aW1lX2RlbHRhID0gYXZpb19yOChwYik7CisgICAgICAgIHJzaXplKys7CisgICAgfSBlbHNlIGlmIChhc2YtPnBhY2tldF9yZXBsaWNfc2l6ZSAhPSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmV4cGVjdGVkIHBhY2tldF9yZXBsaWNfc2l6ZSBvZiAlZFxuIiwKKyAgICAgICAgICAgICAgIGFzZi0+cGFja2V0X3JlcGxpY19zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChhc2YtPnBhY2tldF9mbGFncyAmIDB4MDEpIHsKKyAgICAgICAgRE9fMkJJVFMoYXNmLT5wYWNrZXRfc2Vnc2l6ZXR5cGUgPj4gNiwgYXNmLT5wYWNrZXRfZnJhZ19zaXplLCAwKTsgLy8gMCBpcyBpbGxlZ2FsCisgICAgICAgIGlmIChyc2l6ZSA+IGFzZi0+cGFja2V0X3NpemVfbGVmdCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInBhY2tldF9yZXBsaWNfc2l6ZSBpcyBpbnZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9IGVsc2UgaWYgKGFzZi0+cGFja2V0X2ZyYWdfc2l6ZSA+IGFzZi0+cGFja2V0X3NpemVfbGVmdCAtIHJzaXplKSB7CisgICAgICAgICAgICBpZiAoYXNmLT5wYWNrZXRfZnJhZ19zaXplID4gYXNmLT5wYWNrZXRfc2l6ZV9sZWZ0IC0gcnNpemUgKyBhc2YtPnBhY2tldF9wYWRzaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInBhY2tldF9mcmFnX3NpemUgaXMgaW52YWxpZCAoJWQtJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhc2YtPnBhY2tldF9zaXplX2xlZnQsIHJzaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGRpZmYgPSBhc2YtPnBhY2tldF9mcmFnX3NpemUgLSAoYXNmLT5wYWNrZXRfc2l6ZV9sZWZ0IC0gcnNpemUpOworICAgICAgICAgICAgICAgIGFzZi0+cGFja2V0X3NpemVfbGVmdCArPSBkaWZmOworICAgICAgICAgICAgICAgIGFzZi0+cGFja2V0X3BhZHNpemUgICAtPSBkaWZmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNmLT5wYWNrZXRfZnJhZ19zaXplID0gYXNmLT5wYWNrZXRfc2l6ZV9sZWZ0IC0gcnNpemU7CisgICAgfQorICAgIGlmIChhc2YtPnBhY2tldF9yZXBsaWNfc2l6ZSA9PSAxKSB7CisgICAgICAgIGFzZi0+cGFja2V0X211bHRpX3NpemUgPSBhc2YtPnBhY2tldF9mcmFnX3NpemU7CisgICAgICAgIGlmIChhc2YtPnBhY2tldF9tdWx0aV9zaXplID4gYXNmLT5wYWNrZXRfc2l6ZV9sZWZ0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGFzZi0+cGFja2V0X3NpemVfbGVmdCAtPSByc2l6ZTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFBhcnNlIGRhdGEgZnJvbSBpbmRpdmlkdWFsIEFTRiBwYWNrZXRzICh3aGljaCB3ZXJlIHByZXZpb3VzbHkgbG9hZGVkCisgKiB3aXRoIGFzZl9nZXRfcGFja2V0KCkpLgorICogQHBhcmFtIHMgZGVtdXggY29udGV4dAorICogQHBhcmFtIHBiIGNvbnRleHQgdG8gcmVhZCBkYXRhIGZyb20KKyAqIEBwYXJhbSBwa3QgcG9pbnRlciB0byBzdG9yZSBwYWNrZXQgZGF0YSBpbnRvCisgKiBAcmV0dXJuIDAgaWYgZGF0YSB3YXMgc3RvcmVkIGluIHBrdCwgPDAgb24gZXJyb3Igb3IgMSBpZiBtb3JlIEFTRgorICogICAgICAgICAgcGFja2V0cyBuZWVkIHRvIGJlIGxvYWRlZCAodGhyb3VnaCBhc2ZfZ2V0X3BhY2tldCgpKQorICovCitzdGF0aWMgaW50IGFzZl9wYXJzZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVNGQ29udGV4dCAqYXNmICAgPSBzLT5wcml2X2RhdGE7CisgICAgQVNGU3RyZWFtICphc2Zfc3QgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIGlmIChhc2YtPnBhY2tldF9zaXplX2xlZnQgPCBGUkFNRV9IRUFERVJfU0laRSB8fAorICAgICAgICAgICAgYXNmLT5wYWNrZXRfc2VnbWVudHMgPCAxICYmIGFzZi0+cGFja2V0X3RpbWVfc3RhcnQgPT0gMCkgeworICAgICAgICAgICAgaW50IHJldCA9IGFzZi0+cGFja2V0X3NpemVfbGVmdCArIGFzZi0+cGFja2V0X3BhZHNpemU7CisKKyAgICAgICAgICAgIGFzc2VydChyZXQgPj0gMCk7CisgICAgICAgICAgICAvKiBmYWlsIHNhZmUgKi8KKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgcmV0KTsKKworICAgICAgICAgICAgYXNmLT5wYWNrZXRfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgICAgIGlmIChhc2YtPmRhdGFfb2JqZWN0X3NpemUgIT0gKHVpbnQ2NF90KS0xICYmCisgICAgICAgICAgICAgICAgKGFzZi0+cGFja2V0X3BvcyAtIGFzZi0+ZGF0YV9vYmplY3Rfb2Zmc2V0ID49IGFzZi0+ZGF0YV9vYmplY3Rfc2l6ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOyAgLyogRG8gbm90IGV4Y2VlZCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBvYmplY3QgKi8KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmIChhc2YtPnBhY2tldF90aW1lX3N0YXJ0ID09IDApIHsKKyAgICAgICAgICAgIGlmIChhc2ZfcmVhZF9mcmFtZV9oZWFkZXIocywgcGIpIDwgMCkgeworICAgICAgICAgICAgICAgIGFzZi0+cGFja2V0X3RpbWVfc3RhcnQgPSBhc2YtPnBhY2tldF9zZWdtZW50cyA9IDA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXNmLT5zdHJlYW1faW5kZXggPCAwIHx8CisgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1thc2YtPnN0cmVhbV9pbmRleF0tPmRpc2NhcmQgPj0gQVZESVNDQVJEX0FMTCB8fAorICAgICAgICAgICAgICAgICghYXNmLT5wYWNrZXRfa2V5X2ZyYW1lICYmCisgICAgICAgICAgICAgICAgIChzLT5zdHJlYW1zW2FzZi0+c3RyZWFtX2luZGV4XS0+ZGlzY2FyZCA+PSBBVkRJU0NBUkRfTk9OS0VZIHx8IGFzZi0+c3RyZWFtc1tzLT5zdHJlYW1zW2FzZi0+c3RyZWFtX2luZGV4XS0+aWRdLnNraXBfdG9fa2V5KSkpIHsKKyAgICAgICAgICAgICAgICBhc2YtPnBhY2tldF90aW1lX3N0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICAvKiB1bmhhbmRsZWQgcGFja2V0IChzaG91bGQgbm90IGhhcHBlbikgKi8KKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIGFzZi0+cGFja2V0X2ZyYWdfc2l6ZSk7CisgICAgICAgICAgICAgICAgYXNmLT5wYWNrZXRfc2l6ZV9sZWZ0IC09IGFzZi0+cGFja2V0X2ZyYWdfc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoYXNmLT5zdHJlYW1faW5kZXggPCAwKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZmYgYXNmIHNraXAgJWQgKHVua25vd24gc3RyZWFtKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZi0+cGFja2V0X2ZyYWdfc2l6ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc2YtPmFzZl9zdCA9ICZhc2YtPnN0cmVhbXNbcy0+c3RyZWFtc1thc2YtPnN0cmVhbV9pbmRleF0tPmlkXTsKKyAgICAgICAgICAgIGFzZi0+YXNmX3N0LT5za2lwX3RvX2tleSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYXNmX3N0ID0gYXNmLT5hc2Zfc3Q7CisgICAgICAgIGF2X2Fzc2VydDAoYXNmX3N0KTsKKworICAgICAgICBpZiAoIWFzZl9zdC0+ZnJhZ19vZmZzZXQgJiYgYXNmLT5wYWNrZXRfZnJhZ19vZmZzZXQpIHsKKyAgICAgICAgICAgIGF2X2Rsb2cocywgInNraXBwaW5nIGFzZiBkYXRhIHBrdCB3aXRoIGZyYWdtZW50IG9mZnNldCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAic3RyZWFtOiVkLCBleHBlY3RlZDolZCBidXQgZ290ICVkIGZyb20gcGt0KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgYXNmLT5zdHJlYW1faW5kZXgsIGFzZl9zdC0+ZnJhZ19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGFzZi0+cGFja2V0X2ZyYWdfb2Zmc2V0KTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgYXNmLT5wYWNrZXRfZnJhZ19zaXplKTsKKyAgICAgICAgICAgIGFzZi0+cGFja2V0X3NpemVfbGVmdCAtPSBhc2YtPnBhY2tldF9mcmFnX3NpemU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhc2YtPnBhY2tldF9yZXBsaWNfc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICAvLyBmcmFnX29mZnNldCBpcyBoZXJlIHVzZWQgYXMgdGhlIGJlZ2lubmluZyB0aW1lc3RhbXAKKyAgICAgICAgICAgIGFzZi0+cGFja2V0X2ZyYWdfdGltZXN0YW1wID0gYXNmLT5wYWNrZXRfdGltZV9zdGFydDsKKyAgICAgICAgICAgIGFzZi0+cGFja2V0X3RpbWVfc3RhcnQgICAgKz0gYXNmLT5wYWNrZXRfdGltZV9kZWx0YTsKKyAgICAgICAgICAgIGFzZl9zdC0+cGFja2V0X29ial9zaXplICAgID0gYXNmLT5wYWNrZXRfZnJhZ19zaXplID0gYXZpb19yOChwYik7CisgICAgICAgICAgICBhc2YtPnBhY2tldF9zaXplX2xlZnQtLTsKKyAgICAgICAgICAgIGFzZi0+cGFja2V0X211bHRpX3NpemUtLTsKKyAgICAgICAgICAgIGlmIChhc2YtPnBhY2tldF9tdWx0aV9zaXplIDwgYXNmX3N0LT5wYWNrZXRfb2JqX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhc2YtPnBhY2tldF90aW1lX3N0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIGFzZi0+cGFja2V0X211bHRpX3NpemUpOworICAgICAgICAgICAgICAgIGFzZi0+cGFja2V0X3NpemVfbGVmdCAtPSBhc2YtPnBhY2tldF9tdWx0aV9zaXplOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNmLT5wYWNrZXRfbXVsdGlfc2l6ZSAtPSBhc2Zfc3QtPnBhY2tldF9vYmpfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhc2Zfc3QtPnBrdC5zaXplICE9IGFzZl9zdC0+cGFja2V0X29ial9zaXplIHx8CisgICAgICAgICAgICAvLyBGSVhNRSBpcyB0aGlzIGNvbmRpdGlvbiBzdWZmaWNpZW50PworICAgICAgICAgICAgYXNmX3N0LT5mcmFnX29mZnNldCArIGFzZi0+cGFja2V0X2ZyYWdfc2l6ZSA+IGFzZl9zdC0+cGt0LnNpemUpIHsKKyAgICAgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgICAgIGlmIChhc2Zfc3QtPnBrdC5kYXRhKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAiZnJlZWluZyBpbmNvbXBsZXRlIHBhY2tldCBzaXplICVkLCBuZXcgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGFzZl9zdC0+cGt0LnNpemUsIGFzZl9zdC0+cGFja2V0X29ial9zaXplKTsKKyAgICAgICAgICAgICAgICBhc2Zfc3QtPmZyYWdfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBhdl9mcmVlX3BhY2tldCgmYXNmX3N0LT5wa3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogbmV3IHBhY2tldCAqLworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9uZXdfcGFja2V0KCZhc2Zfc3QtPnBrdCwgYXNmX3N0LT5wYWNrZXRfb2JqX3NpemUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGFzZl9zdC0+c2VxICAgICAgICAgICAgICA9IGFzZi0+cGFja2V0X3NlcTsKKyAgICAgICAgICAgIGlmIChhc2YtPnRzX2lzX3B0cykgeworICAgICAgICAgICAgICAgIGFzZl9zdC0+cGt0LnB0cyAgICAgICAgICA9IGFzZi0+cGFja2V0X2ZyYWdfdGltZXN0YW1wIC0gYXNmLT5oZHIucHJlcm9sbDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGFzZl9zdC0+cGt0LmR0cyAgICAgICAgICA9IGFzZi0+cGFja2V0X2ZyYWdfdGltZXN0YW1wIC0gYXNmLT5oZHIucHJlcm9sbDsKKyAgICAgICAgICAgIGFzZl9zdC0+cGt0LnN0cmVhbV9pbmRleCA9IGFzZi0+c3RyZWFtX2luZGV4OworICAgICAgICAgICAgYXNmX3N0LT5wa3QucG9zICAgICAgICAgID0gYXNmX3N0LT5wYWNrZXRfcG9zID0gYXNmLT5wYWNrZXRfcG9zOworICAgICAgICAgICAgYXNmX3N0LT5wa3RfY2xlYW4gICAgICAgID0gMDsKKworICAgICAgICAgICAgaWYgKGFzZl9zdC0+cGt0LmRhdGEgJiYgYXNmX3N0LT5wYWxldHRlX2NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpwYWw7CisgICAgICAgICAgICAgICAgcGFsID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEoJmFzZl9zdC0+cGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBhbCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFwcGVuZCBwYWxldHRlIHRvIHBhY2tldFxuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBhbCwgYXNmX3N0LT5wYWxldHRlLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgICAgICAgICAgICAgIGFzZl9zdC0+cGFsZXR0ZV9jaGFuZ2VkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9kbG9nKGFzZiwgIm5ldyBwYWNrZXQ6IHN0cmVhbTolZCBrZXk6JWQgcGFja2V0X2tleTolZCBhdWRpbzolZCBzaXplOiVkXG4iLAorICAgICAgICAgICAgICAgICAgICBhc2YtPnN0cmVhbV9pbmRleCwgYXNmLT5wYWNrZXRfa2V5X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICBhc2Zfc3QtPnBrdC5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSwKKyAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1thc2YtPnN0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgICAgICAgICAgICAgYXNmX3N0LT5wYWNrZXRfb2JqX3NpemUpOworICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbYXNmLT5zdHJlYW1faW5kZXhdLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgICAgICAgICAgYXNmLT5wYWNrZXRfa2V5X2ZyYW1lID0gMTsKKyAgICAgICAgICAgIGlmIChhc2YtPnBhY2tldF9rZXlfZnJhbWUpCisgICAgICAgICAgICAgICAgYXNmX3N0LT5wa3QuZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVhZCBkYXRhICovCisgICAgICAgIGF2X2Rsb2coYXNmLCAiUkVBRCBQQUNLRVQgczolZCAgb3M6JWQgIG86JWQsJWQgIGw6JWQgICBEQVRBOiVwXG4iLAorICAgICAgICAgICAgICAgIHMtPnBhY2tldF9zaXplLCBhc2Zfc3QtPnBrdC5zaXplLCBhc2YtPnBhY2tldF9mcmFnX29mZnNldCwKKyAgICAgICAgICAgICAgICBhc2Zfc3QtPmZyYWdfb2Zmc2V0LCBhc2YtPnBhY2tldF9mcmFnX3NpemUsIGFzZl9zdC0+cGt0LmRhdGEpOworICAgICAgICBhc2YtPnBhY2tldF9zaXplX2xlZnQgLT0gYXNmLT5wYWNrZXRfZnJhZ19zaXplOworICAgICAgICBpZiAoYXNmLT5wYWNrZXRfc2l6ZV9sZWZ0IDwgMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChhc2YtPnBhY2tldF9mcmFnX29mZnNldCA+PSBhc2Zfc3QtPnBrdC5zaXplIHx8CisgICAgICAgICAgICBhc2YtPnBhY2tldF9mcmFnX3NpemUgPiBhc2Zfc3QtPnBrdC5zaXplIC0gYXNmLT5wYWNrZXRfZnJhZ19vZmZzZXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgInBhY2tldCBmcmFnbWVudCBwb3NpdGlvbiBpbnZhbGlkICV1LCV1IG5vdCBpbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICBhc2YtPnBhY2tldF9mcmFnX29mZnNldCwgYXNmLT5wYWNrZXRfZnJhZ19zaXplLAorICAgICAgICAgICAgICAgICAgIGFzZl9zdC0+cGt0LnNpemUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXNmLT5wYWNrZXRfZnJhZ19vZmZzZXQgIT0gYXNmX3N0LT5mcmFnX29mZnNldCAmJiAhYXNmX3N0LT5wa3RfY2xlYW4pIHsKKyAgICAgICAgICAgIG1lbXNldChhc2Zfc3QtPnBrdC5kYXRhICsgYXNmX3N0LT5mcmFnX29mZnNldCwgMCwgYXNmX3N0LT5wa3Quc2l6ZSAtIGFzZl9zdC0+ZnJhZ19vZmZzZXQpOworICAgICAgICAgICAgYXNmX3N0LT5wa3RfY2xlYW4gPSAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBhc2Zfc3QtPnBrdC5kYXRhICsgYXNmLT5wYWNrZXRfZnJhZ19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBhc2YtPnBhY2tldF9mcmFnX3NpemUpOworICAgICAgICBpZiAocmV0ICE9IGFzZi0+cGFja2V0X2ZyYWdfc2l6ZSkgeworICAgICAgICAgICAgaWYgKHJldCA8IDAgfHwgYXNmLT5wYWNrZXRfZnJhZ19vZmZzZXQgKyByZXQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1JfRU9GOworCisgICAgICAgICAgICBpZiAoYXNmX3N0LT5kc19zcGFuID4gMSkgeworICAgICAgICAgICAgICAgIC8vIHNjcmFtYmxpbmcsIHdlIGNhbiBlaXRoZXIgZHJvcCBpdCBjb21wbGV0ZWx5IG9yIGZpbGwgdGhlIHJlbWFpbmRlcgorICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBmaWxsIHRoZSB3aG9sZSBwYWNrZXQgaW5zdGVhZCBvZiBqdXN0IHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgLy8gZnJhZ21lbnQ/CisgICAgICAgICAgICAgICAgbWVtc2V0KGFzZl9zdC0+cGt0LmRhdGEgKyBhc2YtPnBhY2tldF9mcmFnX29mZnNldCArIHJldCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgYXNmLT5wYWNrZXRfZnJhZ19zaXplIC0gcmV0KTsKKyAgICAgICAgICAgICAgICByZXQgPSBhc2YtPnBhY2tldF9mcmFnX3NpemU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG5vIHNjcmFtYmxpbmcsIHNvIHdlIGNhbiByZXR1cm4gcGFydGlhbCBwYWNrZXRzCisgICAgICAgICAgICAgICAgYXZfc2hyaW5rX3BhY2tldCgmYXNmX3N0LT5wa3QsIGFzZi0+cGFja2V0X2ZyYWdfb2Zmc2V0ICsgcmV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocy0+a2V5ICYmIHMtPmtleWxlbiA9PSAyMCkKKyAgICAgICAgICAgIGZmX2FzZmNyeXB0X2RlYyhzLT5rZXksIGFzZl9zdC0+cGt0LmRhdGEgKyBhc2YtPnBhY2tldF9mcmFnX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQpOworICAgICAgICBhc2Zfc3QtPmZyYWdfb2Zmc2V0ICs9IHJldDsKKyAgICAgICAgLyogdGVzdCBpZiB3aG9sZSBwYWNrZXQgaXMgcmVhZCAqLworICAgICAgICBpZiAoYXNmX3N0LT5mcmFnX29mZnNldCA9PSBhc2Zfc3QtPnBrdC5zaXplKSB7CisgICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBtYWNyb3NoaXQgcmFkaW8gRFZSLU1TIGZpbGVzCisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1thc2YtPnN0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICYmCisgICAgICAgICAgICAgICAgYXNmX3N0LT5wa3Quc2l6ZSA+IDEwMCkgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhc2Zfc3QtPnBrdC5zaXplICYmICFhc2Zfc3QtPnBrdC5kYXRhW2ldOyBpKyspCisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBhc2Zfc3QtPnBrdC5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJkaXNjYXJkaW5nIG1zIGZhcnRcbiIpOworICAgICAgICAgICAgICAgICAgICBhc2Zfc3QtPmZyYWdfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQoJmFzZl9zdC0+cGt0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiByZXR1cm4gcGFja2V0ICovCisgICAgICAgICAgICBpZiAoYXNmX3N0LT5kc19zcGFuID4gMSkgeworICAgICAgICAgICAgICAgIGlmIChhc2Zfc3QtPnBrdC5zaXplICE9IGFzZl9zdC0+ZHNfcGFja2V0X3NpemUgKiBhc2Zfc3QtPmRzX3NwYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwa3Quc2l6ZSAhPSBkc19wYWNrZXRfc2l6ZSAqIGRzX3NwYW4gKCVkICVkICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZl9zdC0+cGt0LnNpemUsIGFzZl9zdC0+ZHNfcGFja2V0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2Zfc3QtPmRzX3NwYW4pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHBhY2tldCBkZXNjcmFtYmxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmJ1ZiA9IGF2X2J1ZmZlcl9hbGxvYyhhc2Zfc3QtPnBrdC5zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbmV3ZGF0YSA9IGJ1Zi0+ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG5ld2RhdGEgKyBhc2Zfc3QtPnBrdC5zaXplLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IGFzZl9zdC0+cGt0LnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2ZmID0gb2Zmc2V0IC8gYXNmX3N0LT5kc19jaHVua19zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3cgPSBvZmYgLyBhc2Zfc3QtPmRzX3NwYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbCA9IG9mZiAlIGFzZl9zdC0+ZHNfc3BhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcm93ICsgY29sICogYXNmX3N0LT5kc19wYWNrZXRfc2l6ZSAvIGFzZl9zdC0+ZHNfY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQob2Zmc2V0ICsgYXNmX3N0LT5kc19jaHVua19zaXplIDw9IGFzZl9zdC0+cGt0LnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChpZHggKyAxIDw9IGFzZl9zdC0+cGt0LnNpemUgLyBhc2Zfc3QtPmRzX2NodW5rX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShuZXdkYXRhICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2Zfc3QtPnBrdC5kYXRhICsgaWR4ICogYXNmX3N0LT5kc19jaHVua19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2Zfc3QtPmRzX2NodW5rX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBhc2Zfc3QtPmRzX2NodW5rX3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmFzZl9zdC0+cGt0LmJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2Zfc3QtPnBrdC5idWYgID0gYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgYXNmX3N0LT5wa3QuZGF0YSA9IGJ1Zi0+ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzZl9zdC0+ZnJhZ19vZmZzZXQgICAgICAgICA9IDA7CisgICAgICAgICAgICAqcGt0ICAgICAgICAgICAgICAgICAgICAgICAgPSBhc2Zfc3QtPnBrdDsKKyNpZiBGRl9BUElfREVTVFJVQ1RfUEFDS0VUCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICBhc2Zfc3QtPnBrdC5kZXN0cnVjdCAgICAgICAgPSBOVUxMOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICAgICAgICAgIGFzZl9zdC0+cGt0LmJ1ZiAgICAgICAgICAgICA9IDA7CisgICAgICAgICAgICBhc2Zfc3QtPnBrdC5zaXplICAgICAgICAgICAgPSAwOworICAgICAgICAgICAgYXNmX3N0LT5wa3QuZGF0YSAgICAgICAgICAgID0gMDsKKyAgICAgICAgICAgIGFzZl9zdC0+cGt0LnNpZGVfZGF0YV9lbGVtcyA9IDA7CisgICAgICAgICAgICBhc2Zfc3QtPnBrdC5zaWRlX2RhdGEgICAgICAgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7IC8vIHBhY2tldCBjb21wbGV0ZWQKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc2ZfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFTRkNvbnRleHQgKmFzZiA9IHMtPnByaXZfZGF0YTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICAvKiBwYXJzZSBjYWNoZWQgcGFja2V0cywgaWYgYW55ICovCisgICAgICAgIGlmICgocmV0ID0gYXNmX3BhcnNlX3BhY2tldChzLCBzLT5wYiwgcGt0KSkgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmICgocmV0ID0gYXNmX2dldF9wYWNrZXQocywgcy0+cGIpKSA8IDApCisgICAgICAgICAgICBhc3NlcnQoYXNmLT5wYWNrZXRfc2l6ZV9sZWZ0IDwgRlJBTUVfSEVBREVSX1NJWkUgfHwKKyAgICAgICAgICAgICAgICAgICBhc2YtPnBhY2tldF9zZWdtZW50cyA8IDEpOworICAgICAgICBhc2YtPnBhY2tldF90aW1lX3N0YXJ0ID0gMDsKKyAgICB9Cit9CisKKy8vIEFkZGVkIHRvIHN1cHBvcnQgc2Vla2luZyBhZnRlciBwYWNrZXRzIGhhdmUgYmVlbiByZWFkCisvLyBJZiBpbmZvcm1hdGlvbiBpcyBub3QgcmVzZXQsIHJlYWRfcGFja2V0IGZhaWxzIGR1ZSB0bworLy8gbGVmdG92ZXIgaW5mb3JtYXRpb24gZnJvbSBwcmV2aW91cyByZWFkcworc3RhdGljIHZvaWQgYXNmX3Jlc2V0X2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVNGQ29udGV4dCAqYXNmID0gcy0+cHJpdl9kYXRhOworICAgIEFTRlN0cmVhbSAqYXNmX3N0OworICAgIGludCBpOworCisgICAgYXNmLT5wYWNrZXRfc2l6ZV9sZWZ0ICAgICAgPSAwOworICAgIGFzZi0+cGFja2V0X2ZsYWdzICAgICAgICAgID0gMDsKKyAgICBhc2YtPnBhY2tldF9wcm9wZXJ0eSAgICAgICA9IDA7CisgICAgYXNmLT5wYWNrZXRfdGltZXN0YW1wICAgICAgPSAwOworICAgIGFzZi0+cGFja2V0X3NlZ3NpemV0eXBlICAgID0gMDsKKyAgICBhc2YtPnBhY2tldF9zZWdtZW50cyAgICAgICA9IDA7CisgICAgYXNmLT5wYWNrZXRfc2VxICAgICAgICAgICAgPSAwOworICAgIGFzZi0+cGFja2V0X3JlcGxpY19zaXplICAgID0gMDsKKyAgICBhc2YtPnBhY2tldF9rZXlfZnJhbWUgICAgICA9IDA7CisgICAgYXNmLT5wYWNrZXRfcGFkc2l6ZSAgICAgICAgPSAwOworICAgIGFzZi0+cGFja2V0X2ZyYWdfb2Zmc2V0ICAgID0gMDsKKyAgICBhc2YtPnBhY2tldF9mcmFnX3NpemUgICAgICA9IDA7CisgICAgYXNmLT5wYWNrZXRfZnJhZ190aW1lc3RhbXAgPSAwOworICAgIGFzZi0+cGFja2V0X211bHRpX3NpemUgICAgID0gMDsKKyAgICBhc2YtPnBhY2tldF90aW1lX2RlbHRhICAgICA9IDA7CisgICAgYXNmLT5wYWNrZXRfdGltZV9zdGFydCAgICAgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgIGFzZl9zdCA9ICZhc2YtPnN0cmVhbXNbaV07CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZhc2Zfc3QtPnBrdCk7CisgICAgICAgIGFzZl9zdC0+cGFja2V0X29ial9zaXplID0gMDsKKyAgICAgICAgYXNmX3N0LT5mcmFnX29mZnNldCA9IDA7CisgICAgICAgIGFzZl9zdC0+c2VxICAgICAgICAgPSAwOworICAgIH0KKyAgICBhc2YtPmFzZl9zdCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNraXBfdG9fa2V5KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBU0ZDb250ZXh0ICphc2YgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKyAgICAgICAgaW50IGogPSBhc2YtPmFzZmlkMmF2aWRbaV07CisgICAgICAgIEFTRlN0cmVhbSAqYXNmX3N0ID0gJmFzZi0+c3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKGogPCAwIHx8IHMtPnN0cmVhbXNbal0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGFzZl9zdC0+c2tpcF90b19rZXkgPSAxOworICAgIH0KK30KKworc3RhdGljIGludCBhc2ZfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgYXNmX3Jlc2V0X2hlYWRlcihzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50NjRfdCBhc2ZfcmVhZF9wdHMoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnBwb3MsIGludDY0X3QgcG9zX2xpbWl0KQoreworICAgIEFTRkNvbnRleHQgKmFzZiAgICAgPSBzLT5wcml2X2RhdGE7CisgICAgQVZQYWNrZXQgcGt0MSwgKnBrdCA9ICZwa3QxOworICAgIEFTRlN0cmVhbSAqYXNmX3N0OworICAgIGludDY0X3QgcHRzOworICAgIGludDY0X3QgcG9zID0gKnBwb3M7CisgICAgaW50IGk7CisgICAgaW50NjRfdCBzdGFydF9wb3NbQVNGX01BWF9TVFJFQU1TXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIHN0YXJ0X3Bvc1tpXSA9IHBvczsKKworICAgIGlmIChzLT5wYWNrZXRfc2l6ZSA+IDApCisgICAgICAgIHBvcyA9IChwb3MgKyBzLT5wYWNrZXRfc2l6ZSAtIDEgLSBzLT5kYXRhX29mZnNldCkgLworICAgICAgICAgICAgICBzLT5wYWNrZXRfc2l6ZSAqIHMtPnBhY2tldF9zaXplICsKKyAgICAgICAgICAgICAgcy0+ZGF0YV9vZmZzZXQ7CisgICAgKnBwb3MgPSBwb3M7CisgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCkgPCAwKQorICAgICAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBmZl9yZWFkX2ZyYW1lX2ZsdXNoKHMpOworICAgIGFzZl9yZXNldF9oZWFkZXIocyk7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoYXZfcmVhZF9mcmFtZShzLCBwa3QpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiYXNmX3JlYWRfcHRzIGZhaWxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBwdHMgPSBwa3QtPmR0czsKKworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICBpZiAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkgeworICAgICAgICAgICAgaSA9IHBrdC0+c3RyZWFtX2luZGV4OworCisgICAgICAgICAgICBhc2Zfc3QgPSAmYXNmLT5zdHJlYW1zW3MtPnN0cmVhbXNbaV0tPmlkXTsKKworLy8gICAgICAgICAgICBhc3NlcnQoKGFzZl9zdC0+cGFja2V0X3BvcyAtIHMtPmRhdGFfb2Zmc2V0KSAlIHMtPnBhY2tldF9zaXplID09IDApOworICAgICAgICAgICAgcG9zID0gYXNmX3N0LT5wYWNrZXRfcG9zOworCisgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkocy0+c3RyZWFtc1tpXSwgcG9zLCBwdHMsIHBrdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgLSBzdGFydF9wb3NbaV0gKyAxLCBBVklOREVYX0tFWUZSQU1FKTsKKyAgICAgICAgICAgIHN0YXJ0X3Bvc1tpXSA9IGFzZl9zdC0+cGFja2V0X3BvcyArIDE7CisKKyAgICAgICAgICAgIGlmIChwa3QtPnN0cmVhbV9pbmRleCA9PSBzdHJlYW1faW5kZXgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcHBvcyA9IHBvczsKKyAgICByZXR1cm4gcHRzOworfQorCitzdGF0aWMgaW50IGFzZl9idWlsZF9zaW1wbGVfaW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4KQoreworICAgIGZmX2FzZl9ndWlkIGc7CisgICAgQVNGQ29udGV4dCAqYXNmICAgICA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IGN1cnJlbnRfcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmKChyZXQgPSBhdmlvX3NlZWsocy0+cGIsIGFzZi0+ZGF0YV9vYmplY3Rfb2Zmc2V0ICsgYXNmLT5kYXRhX29iamVjdF9zaXplLCBTRUVLX1NFVCkpIDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2d1aWQocy0+cGIsICZnKSkgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIC8qIHRoZSBkYXRhIG9iamVjdCBjYW4gYmUgZm9sbG93ZWQgYnkgb3RoZXIgdG9wLWxldmVsIG9iamVjdHMsCisgICAgICogc2tpcCB0aGVtIHVudGlsIHRoZSBzaW1wbGUgaW5kZXggb2JqZWN0IGlzIHJlYWNoZWQgKi8KKyAgICB3aGlsZSAoZmZfZ3VpZGNtcCgmZywgJmZmX2FzZl9zaW1wbGVfaW5kZXhfaGVhZGVyKSkgeworICAgICAgICBpbnQ2NF90IGdzaXplID0gYXZpb19ybDY0KHMtPnBiKTsKKyAgICAgICAgaWYgKGdzaXplIDwgMjQgfHwgYXZpb19mZW9mKHMtPnBiKSkgeworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19za2lwKHMtPnBiLCBnc2l6ZSAtIDI0KTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfZ3VpZChzLT5wYiwgJmcpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGludDY0X3QgaXRpbWUsIGxhc3RfcG9zID0gLTE7CisgICAgICAgIGludCBwY3QsIGljdDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludDY0X3QgYXZfdW51c2VkIGdzaXplID0gYXZpb19ybDY0KHMtPnBiKTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfZ3VpZChzLT5wYiwgJmcpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgaXRpbWUgPSBhdmlvX3JsNjQocy0+cGIpOworICAgICAgICBwY3QgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgIGljdCAgID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJpdGltZToweCUiUFJJeDY0IiwgcGN0OiVkLCBpY3Q6JWRcbiIsIGl0aW1lLCBwY3QsIGljdCk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGljdDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgcGt0bnVtICAgICAgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgICAgICBpbnQgcGt0Y3QgICAgICAgICA9IGF2aW9fcmwxNihzLT5wYik7CisgICAgICAgICAgICBpbnQ2NF90IHBvcyAgICAgICA9IHMtPmRhdGFfb2Zmc2V0ICsgcy0+cGFja2V0X3NpemUgKiAoaW50NjRfdClwa3RudW07CisgICAgICAgICAgICBpbnQ2NF90IGluZGV4X3B0cyA9IEZGTUFYKGF2X3Jlc2NhbGUoaXRpbWUsIGksIDEwMDAwKSAtIGFzZi0+aGRyLnByZXJvbGwsIDApOworCisgICAgICAgICAgICBpZiAocG9zICE9IGxhc3RfcG9zKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInBrdG51bTolZCwgcGt0Y3Q6JWQgIHB0czogJSJQUklkNjQiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwa3RudW0sIHBrdGN0LCBpbmRleF9wdHMpOworICAgICAgICAgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeShzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0sIHBvcywgaW5kZXhfcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wYWNrZXRfc2l6ZSwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgICAgICAgICAgICAgbGFzdF9wb3MgPSBwb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNmLT5pbmRleF9yZWFkID0gaWN0ID4gMTsKKyAgICB9CitlbmQ6CisvLyAgICAgaWYgKGF2aW9fZmVvZihzLT5wYikpIHsKKy8vICAgICAgICAgcmV0ID0gMDsKKy8vICAgICB9CisgICAgYXZpb19zZWVrKHMtPnBiLCBjdXJyZW50X3BvcywgU0VFS19TRVQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXNmX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMsIGludCBmbGFncykKK3sKKyAgICBBU0ZDb250ZXh0ICphc2YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ICAgID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKHMtPnBhY2tldF9zaXplIDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIFRyeSB1c2luZyB0aGUgcHJvdG9jb2wncyByZWFkX3NlZWsgaWYgYXZhaWxhYmxlICovCisgICAgaWYgKHMtPnBiKSB7CisgICAgICAgIGludCByZXQgPSBhdmlvX3NlZWtfdGltZShzLT5wYiwgc3RyZWFtX2luZGV4LCBwdHMsIGZsYWdzKTsKKyAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgYXNmX3Jlc2V0X2hlYWRlcihzKTsKKyAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SKEVOT1NZUykpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIGV4cGxpY2l0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIHNlZWtpbmcgdG8gMCAqLworICAgIGlmICghcHRzKSB7CisgICAgICAgIGFzZl9yZXNldF9oZWFkZXIocyk7CisgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgcy0+ZGF0YV9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFhc2YtPmluZGV4X3JlYWQpIHsKKyAgICAgICAgcmV0ID0gYXNmX2J1aWxkX3NpbXBsZV9pbmRleChzLCBzdHJlYW1faW5kZXgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGFzZi0+aW5kZXhfcmVhZCA9IC0xOworICAgIH0KKworICAgIGlmIChhc2YtPmluZGV4X3JlYWQgPiAwICYmIHN0LT5pbmRleF9lbnRyaWVzKSB7CisgICAgICAgIGludCBpbmRleCA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QsIHB0cywgZmxhZ3MpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgLyogZmluZCB0aGUgcG9zaXRpb24gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHBvcyA9IHN0LT5pbmRleF9lbnRyaWVzW2luZGV4XS5wb3M7CisKKyAgICAgICAgICAgIC8qIGRvIHRoZSBzZWVrICovCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiU0VFS1RPOiAlIlBSSWQ2NCJcbiIsIHBvcyk7CisgICAgICAgICAgICBpZihhdmlvX3NlZWsocy0+cGIsIHBvcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBhc2ZfcmVzZXRfaGVhZGVyKHMpOworICAgICAgICAgICAgc2tpcF90b19rZXkocyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBubyBpbmRleCBvciBzZWVraW5nIGJ5IGluZGV4IGZhaWxlZCAqLworICAgIGlmIChmZl9zZWVrX2ZyYW1lX2JpbmFyeShzLCBzdHJlYW1faW5kZXgsIHB0cywgZmxhZ3MpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGFzZl9yZXNldF9oZWFkZXIocyk7CisgICAgc2tpcF90b19rZXkocyk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYXNmX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFzZiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTRiAoQWR2YW5jZWQgLyBBY3RpdmUgU3RyZWFtaW5nIEZvcm1hdCkiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVNGQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gYXNmX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGFzZl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBhc2ZfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gYXNmX3JlYWRfY2xvc2UsCisgICAgLnJlYWRfc2VlayAgICAgID0gYXNmX3JlYWRfc2VlaywKKyAgICAucmVhZF90aW1lc3RhbXAgPSBhc2ZfcmVhZF9wdHMsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9CSU5TRUFSQ0ggfCBBVkZNVF9OT0dFTlNFQVJDSCwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmYXNmX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hc2ZlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hc2ZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmY2MTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FzZmVuYy5jCkBAIC0wLDAgKzEsMTA0MSBAQAorLyoKKyAqIEFTRiBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInJpZmYuaCIKKyNpbmNsdWRlICJhc2YuaCIKKworI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGFzc2VydC5oPgorCisKKyNkZWZpbmUgQVNGX0lOREVYRURfSU5URVJWQUwgICAgMTAwMDAwMDAKKyNkZWZpbmUgQVNGX0lOREVYX0JMT0NLICAgICAgICAgKDE8PDkpCisjZGVmaW5lIEFTRl9QQVlMT0FEU19QRVJfUEFDS0VUIDYzCisKKyNkZWZpbmUgQVNGX1BBQ0tFVF9FUlJPUl9DT1JSRUNUSU9OX0RBVEFfU0laRSAweDIKKyNkZWZpbmUgQVNGX1BBQ0tFVF9FUlJPUl9DT1JSRUNUSU9OX0ZMQUdTICAgICAgICAgIFwKKyAgICAoQVNGX1BBQ0tFVF9GTEFHX0VSUk9SX0NPUlJFQ1RJT05fUFJFU0VOVCB8ICAgIFwKKyAgICAgQVNGX1BBQ0tFVF9FUlJPUl9DT1JSRUNUSU9OX0RBVEFfU0laRSkKKworI2lmIChBU0ZfUEFDS0VUX0VSUk9SX0NPUlJFQ1RJT05fRkxBR1MgIT0gMCkKKyMgICBkZWZpbmUgQVNGX1BBQ0tFVF9FUlJPUl9DT1JSRUNUSU9OX0ZMQUdTX0ZJRUxEX1NJWkUgMQorI2Vsc2UKKyMgICBkZWZpbmUgQVNGX1BBQ0tFVF9FUlJPUl9DT1JSRUNUSU9OX0ZMQUdTX0ZJRUxEX1NJWkUgMAorI2VuZGlmCisKKyNkZWZpbmUgQVNGX1BQSV9QUk9QRVJUWV9GTEFHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoQVNGX1BMX0ZMQUdfUkVQTElDQVRFRF9EQVRBX0xFTkdUSF9GSUVMRF9JU19CWVRFICAgICAgICAgICB8ICAgIFwKKyAgICAgQVNGX1BMX0ZMQUdfT0ZGU0VUX0lOVE9fTUVESUFfT0JKRUNUX0xFTkdUSF9GSUVMRF9JU19EV09SRCB8ICAgIFwKKyAgICAgQVNGX1BMX0ZMQUdfTUVESUFfT0JKRUNUX05VTUJFUl9MRU5HVEhfRklFTERfSVNfQllURSAgICAgICB8ICAgIFwKKyAgICAgQVNGX1BMX0ZMQUdfU1RSRUFNX05VTUJFUl9MRU5HVEhfRklFTERfSVNfQllURSkKKworI2RlZmluZSBBU0ZfUFBJX0xFTkdUSF9UWVBFX0ZMQUdTIDAKKworI2RlZmluZSBBU0ZfUEFZTE9BRF9GTEFHUyBBU0ZfUExfRkxBR19QQVlMT0FEX0xFTkdUSF9GSUVMRF9JU19XT1JECisKKyNpZiAoQVNGX1BQSV9GTEFHX1NFUVVFTkNFX0ZJRUxEX0lTX0JZVEUgPT0gKEFTRl9QUElfTEVOR1RIX1RZUEVfRkxBR1MgJiBBU0ZfUFBJX01BU0tfU0VRVUVOQ0VfRklFTERfU0laRSkpCisjICAgZGVmaW5lIEFTRl9QUElfU0VRVUVOQ0VfRklFTERfU0laRSAxCisjZW5kaWYKKyNpZiAoQVNGX1BQSV9GTEFHX1NFUVVFTkNFX0ZJRUxEX0lTX1dPUkQgPT0gKEFTRl9QUElfTEVOR1RIX1RZUEVfRkxBR1MgJiBBU0ZfUFBJX01BU0tfU0VRVUVOQ0VfRklFTERfU0laRSkpCisjICAgZGVmaW5lIEFTRl9QUElfU0VRVUVOQ0VfRklFTERfU0laRSAyCisjZW5kaWYKKyNpZiAoQVNGX1BQSV9GTEFHX1NFUVVFTkNFX0ZJRUxEX0lTX0RXT1JEID09IChBU0ZfUFBJX0xFTkdUSF9UWVBFX0ZMQUdTICYgQVNGX1BQSV9NQVNLX1NFUVVFTkNFX0ZJRUxEX1NJWkUpKQorIyAgIGRlZmluZSBBU0ZfUFBJX1NFUVVFTkNFX0ZJRUxEX1NJWkUgNAorI2VuZGlmCisjaWZuZGVmIEFTRl9QUElfU0VRVUVOQ0VfRklFTERfU0laRQorIyAgIGRlZmluZSBBU0ZfUFBJX1NFUVVFTkNFX0ZJRUxEX1NJWkUgMAorI2VuZGlmCisKKyNpZiAoQVNGX1BQSV9GTEFHX1BBQ0tFVF9MRU5HVEhfRklFTERfSVNfQllURSA9PSAoQVNGX1BQSV9MRU5HVEhfVFlQRV9GTEFHUyAmIEFTRl9QUElfTUFTS19QQUNLRVRfTEVOR1RIX0ZJRUxEX1NJWkUpKQorIyAgIGRlZmluZSBBU0ZfUFBJX1BBQ0tFVF9MRU5HVEhfRklFTERfU0laRSAxCisjZW5kaWYKKyNpZiAoQVNGX1BQSV9GTEFHX1BBQ0tFVF9MRU5HVEhfRklFTERfSVNfV09SRCA9PSAoQVNGX1BQSV9MRU5HVEhfVFlQRV9GTEFHUyAmIEFTRl9QUElfTUFTS19QQUNLRVRfTEVOR1RIX0ZJRUxEX1NJWkUpKQorIyAgIGRlZmluZSBBU0ZfUFBJX1BBQ0tFVF9MRU5HVEhfRklFTERfU0laRSAyCisjZW5kaWYKKyNpZiAoQVNGX1BQSV9GTEFHX1BBQ0tFVF9MRU5HVEhfRklFTERfSVNfRFdPUkQgPT0gKEFTRl9QUElfTEVOR1RIX1RZUEVfRkxBR1MgJiBBU0ZfUFBJX01BU0tfUEFDS0VUX0xFTkdUSF9GSUVMRF9TSVpFKSkKKyMgICBkZWZpbmUgQVNGX1BQSV9QQUNLRVRfTEVOR1RIX0ZJRUxEX1NJWkUgNAorI2VuZGlmCisjaWZuZGVmIEFTRl9QUElfUEFDS0VUX0xFTkdUSF9GSUVMRF9TSVpFCisjICAgZGVmaW5lIEFTRl9QUElfUEFDS0VUX0xFTkdUSF9GSUVMRF9TSVpFIDAKKyNlbmRpZgorCisjaWYgKEFTRl9QUElfRkxBR19QQURESU5HX0xFTkdUSF9GSUVMRF9JU19CWVRFID09IChBU0ZfUFBJX0xFTkdUSF9UWVBFX0ZMQUdTICYgQVNGX1BQSV9NQVNLX1BBRERJTkdfTEVOR1RIX0ZJRUxEX1NJWkUpKQorIyAgIGRlZmluZSBBU0ZfUFBJX1BBRERJTkdfTEVOR1RIX0ZJRUxEX1NJWkUgMQorI2VuZGlmCisjaWYgKEFTRl9QUElfRkxBR19QQURESU5HX0xFTkdUSF9GSUVMRF9JU19XT1JEID09IChBU0ZfUFBJX0xFTkdUSF9UWVBFX0ZMQUdTICYgQVNGX1BQSV9NQVNLX1BBRERJTkdfTEVOR1RIX0ZJRUxEX1NJWkUpKQorIyAgIGRlZmluZSBBU0ZfUFBJX1BBRERJTkdfTEVOR1RIX0ZJRUxEX1NJWkUgMgorI2VuZGlmCisjaWYgKEFTRl9QUElfRkxBR19QQURESU5HX0xFTkdUSF9GSUVMRF9JU19EV09SRCA9PSAoQVNGX1BQSV9MRU5HVEhfVFlQRV9GTEFHUyAmIEFTRl9QUElfTUFTS19QQURESU5HX0xFTkdUSF9GSUVMRF9TSVpFKSkKKyMgICBkZWZpbmUgQVNGX1BQSV9QQURESU5HX0xFTkdUSF9GSUVMRF9TSVpFIDQKKyNlbmRpZgorI2lmbmRlZiBBU0ZfUFBJX1BBRERJTkdfTEVOR1RIX0ZJRUxEX1NJWkUKKyMgICBkZWZpbmUgQVNGX1BQSV9QQURESU5HX0xFTkdUSF9GSUVMRF9TSVpFIDAKKyNlbmRpZgorCisjaWYgKEFTRl9QTF9GTEFHX1JFUExJQ0FURURfREFUQV9MRU5HVEhfRklFTERfSVNfQllURSA9PSAoQVNGX1BQSV9QUk9QRVJUWV9GTEFHUyAmIEFTRl9QTF9NQVNLX1JFUExJQ0FURURfREFUQV9MRU5HVEhfRklFTERfU0laRSkpCisjICAgZGVmaW5lIEFTRl9QQVlMT0FEX1JFUExJQ0FURURfREFUQV9MRU5HVEhfRklFTERfU0laRSAxCisjZW5kaWYKKyNpZiAoQVNGX1BMX0ZMQUdfUkVQTElDQVRFRF9EQVRBX0xFTkdUSF9GSUVMRF9JU19XT1JEID09IChBU0ZfUFBJX1BST1BFUlRZX0ZMQUdTICYgQVNGX1BMX01BU0tfUkVQTElDQVRFRF9EQVRBX0xFTkdUSF9GSUVMRF9TSVpFKSkKKyMgICBkZWZpbmUgQVNGX1BBWUxPQURfUkVQTElDQVRFRF9EQVRBX0xFTkdUSF9GSUVMRF9TSVpFIDIKKyNlbmRpZgorI2lmIChBU0ZfUExfRkxBR19SRVBMSUNBVEVEX0RBVEFfTEVOR1RIX0ZJRUxEX0lTX0RXT1JEID09IChBU0ZfUFBJX1BST1BFUlRZX0ZMQUdTICYgQVNGX1BMX01BU0tfUkVQTElDQVRFRF9EQVRBX0xFTkdUSF9GSUVMRF9TSVpFKSkKKyMgICBkZWZpbmUgQVNGX1BBWUxPQURfUkVQTElDQVRFRF9EQVRBX0xFTkdUSF9GSUVMRF9TSVpFIDQKKyNlbmRpZgorI2lmbmRlZiBBU0ZfUEFZTE9BRF9SRVBMSUNBVEVEX0RBVEFfTEVOR1RIX0ZJRUxEX1NJWkUKKyMgICBkZWZpbmUgQVNGX1BBWUxPQURfUkVQTElDQVRFRF9EQVRBX0xFTkdUSF9GSUVMRF9TSVpFIDAKKyNlbmRpZgorCisjaWYgKEFTRl9QTF9GTEFHX09GRlNFVF9JTlRPX01FRElBX09CSkVDVF9MRU5HVEhfRklFTERfSVNfQllURSA9PSAoQVNGX1BQSV9QUk9QRVJUWV9GTEFHUyAmIEFTRl9QTF9NQVNLX09GRlNFVF9JTlRPX01FRElBX09CSkVDVF9MRU5HVEhfRklFTERfU0laRSkpCisjICAgZGVmaW5lIEFTRl9QQVlMT0FEX09GRlNFVF9JTlRPX01FRElBX09CSkVDVF9GSUVMRF9TSVpFIDEKKyNlbmRpZgorI2lmIChBU0ZfUExfRkxBR19PRkZTRVRfSU5UT19NRURJQV9PQkpFQ1RfTEVOR1RIX0ZJRUxEX0lTX1dPUkQgPT0gKEFTRl9QUElfUFJPUEVSVFlfRkxBR1MgJiBBU0ZfUExfTUFTS19PRkZTRVRfSU5UT19NRURJQV9PQkpFQ1RfTEVOR1RIX0ZJRUxEX1NJWkUpKQorIyAgIGRlZmluZSBBU0ZfUEFZTE9BRF9PRkZTRVRfSU5UT19NRURJQV9PQkpFQ1RfRklFTERfU0laRSAyCisjZW5kaWYKKyNpZiAoQVNGX1BMX0ZMQUdfT0ZGU0VUX0lOVE9fTUVESUFfT0JKRUNUX0xFTkdUSF9GSUVMRF9JU19EV09SRCA9PSAoQVNGX1BQSV9QUk9QRVJUWV9GTEFHUyAmIEFTRl9QTF9NQVNLX09GRlNFVF9JTlRPX01FRElBX09CSkVDVF9MRU5HVEhfRklFTERfU0laRSkpCisjICAgZGVmaW5lIEFTRl9QQVlMT0FEX09GRlNFVF9JTlRPX01FRElBX09CSkVDVF9GSUVMRF9TSVpFIDQKKyNlbmRpZgorI2lmbmRlZiBBU0ZfUEFZTE9BRF9PRkZTRVRfSU5UT19NRURJQV9PQkpFQ1RfRklFTERfU0laRQorIyAgIGRlZmluZSBBU0ZfUEFZTE9BRF9PRkZTRVRfSU5UT19NRURJQV9PQkpFQ1RfRklFTERfU0laRSAwCisjZW5kaWYKKworI2lmIChBU0ZfUExfRkxBR19NRURJQV9PQkpFQ1RfTlVNQkVSX0xFTkdUSF9GSUVMRF9JU19CWVRFID09IChBU0ZfUFBJX1BST1BFUlRZX0ZMQUdTICYgQVNGX1BMX01BU0tfTUVESUFfT0JKRUNUX05VTUJFUl9MRU5HVEhfRklFTERfU0laRSkpCisjICAgZGVmaW5lIEFTRl9QQVlMT0FEX01FRElBX09CSkVDVF9OVU1CRVJfRklFTERfU0laRSAxCisjZW5kaWYKKyNpZiAoQVNGX1BMX0ZMQUdfTUVESUFfT0JKRUNUX05VTUJFUl9MRU5HVEhfRklFTERfSVNfV09SRCA9PSAoQVNGX1BQSV9QUk9QRVJUWV9GTEFHUyAmIEFTRl9QTF9NQVNLX01FRElBX09CSkVDVF9OVU1CRVJfTEVOR1RIX0ZJRUxEX1NJWkUpKQorIyAgIGRlZmluZSBBU0ZfUEFZTE9BRF9NRURJQV9PQkpFQ1RfTlVNQkVSX0ZJRUxEX1NJWkUgMgorI2VuZGlmCisjaWYgKEFTRl9QTF9GTEFHX01FRElBX09CSkVDVF9OVU1CRVJfTEVOR1RIX0ZJRUxEX0lTX0RXT1JEID09IChBU0ZfUFBJX1BST1BFUlRZX0ZMQUdTICYgQVNGX1BMX01BU0tfTUVESUFfT0JKRUNUX05VTUJFUl9MRU5HVEhfRklFTERfU0laRSkpCisjICAgZGVmaW5lIEFTRl9QQVlMT0FEX01FRElBX09CSkVDVF9OVU1CRVJfRklFTERfU0laRSA0CisjZW5kaWYKKyNpZm5kZWYgQVNGX1BBWUxPQURfTUVESUFfT0JKRUNUX05VTUJFUl9GSUVMRF9TSVpFCisjICAgZGVmaW5lIEFTRl9QQVlMT0FEX01FRElBX09CSkVDVF9OVU1CRVJfRklFTERfU0laRSAwCisjZW5kaWYKKworI2lmIChBU0ZfUExfRkxBR19QQVlMT0FEX0xFTkdUSF9GSUVMRF9JU19CWVRFID09IChBU0ZfUEFZTE9BRF9GTEFHUyAmIEFTRl9QTF9NQVNLX1BBWUxPQURfTEVOR1RIX0ZJRUxEX1NJWkUpKQorIyAgIGRlZmluZSBBU0ZfUEFZTE9BRF9MRU5HVEhfRklFTERfU0laRSAxCisjZW5kaWYKKyNpZiAoQVNGX1BMX0ZMQUdfUEFZTE9BRF9MRU5HVEhfRklFTERfSVNfV09SRCA9PSAoQVNGX1BBWUxPQURfRkxBR1MgJiBBU0ZfUExfTUFTS19QQVlMT0FEX0xFTkdUSF9GSUVMRF9TSVpFKSkKKyMgICBkZWZpbmUgQVNGX1BBWUxPQURfTEVOR1RIX0ZJRUxEX1NJWkUgMgorI2VuZGlmCisjaWZuZGVmIEFTRl9QQVlMT0FEX0xFTkdUSF9GSUVMRF9TSVpFCisjICAgZGVmaW5lIEFTRl9QQVlMT0FEX0xFTkdUSF9GSUVMRF9TSVpFIDAKKyNlbmRpZgorCisjZGVmaW5lIFBBQ0tFVF9IRUFERVJfTUlOX1NJWkUgXAorICAgIChBU0ZfUEFDS0VUX0VSUk9SX0NPUlJFQ1RJT05fRkxBR1NfRklFTERfU0laRSArICAgICAgIFwKKyAgICAgQVNGX1BBQ0tFVF9FUlJPUl9DT1JSRUNUSU9OX0RBVEFfU0laRSArICAgICAgICAgICAgICBcCisgICAgIDEgKyAgICAgICAgLyogTGVuZ3RoIFR5cGUgRmxhZ3MgKi8gICAgICAgICAgICAgICAgICAgXAorICAgICAxICsgICAgICAgIC8qIFByb3BlcnR5IEZsYWdzICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgQVNGX1BQSV9QQUNLRVRfTEVOR1RIX0ZJRUxEX1NJWkUgKyAgICAgICAgICAgICAgICAgICBcCisgICAgIEFTRl9QUElfU0VRVUVOQ0VfRklFTERfU0laRSArICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBBU0ZfUFBJX1BBRERJTkdfTEVOR1RIX0ZJRUxEX1NJWkUgKyAgICAgICAgICAgICAgICAgIFwKKyAgICAgNCArICAgICAgICAvKiBTZW5kIFRpbWUgRmllbGQgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgIDIpICAgICAgICAgLyogRHVyYXRpb24gRmllbGQgKi8KKworLy8gUmVwbGljYXRlZCBEYXRhIHNoYWxsIGJlIGF0IGxlYXN0IDggYnl0ZXMgbG9uZy4KKyNkZWZpbmUgQVNGX1BBWUxPQURfUkVQTElDQVRFRF9EQVRBX0xFTkdUSCAweDA4CisKKyNkZWZpbmUgUEFZTE9BRF9IRUFERVJfU0laRV9TSU5HTEVfUEFZTE9BRCAgICAgICAgICAgICAgICBcCisgICAgKDEgKyAgICAgLyogU3RyZWFtIE51bWJlciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBBU0ZfUEFZTE9BRF9NRURJQV9PQkpFQ1RfTlVNQkVSX0ZJRUxEX1NJWkUgKyAgICAgICAgIFwKKyAgICAgQVNGX1BBWUxPQURfT0ZGU0VUX0lOVE9fTUVESUFfT0JKRUNUX0ZJRUxEX1NJWkUgKyAgICBcCisgICAgIEFTRl9QQVlMT0FEX1JFUExJQ0FURURfREFUQV9MRU5HVEhfRklFTERfU0laRSArICAgICAgXAorICAgICBBU0ZfUEFZTE9BRF9SRVBMSUNBVEVEX0RBVEFfTEVOR1RIKQorCisjZGVmaW5lIFBBWUxPQURfSEVBREVSX1NJWkVfTVVMVElQTEVfUEFZTE9BRFMgICAgICAgICAgICAgXAorICAgICgxICsgICAgICAgIC8qIFN0cmVhbSBOdW1iZXIgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgQVNGX1BBWUxPQURfTUVESUFfT0JKRUNUX05VTUJFUl9GSUVMRF9TSVpFICsgICAgICAgICBcCisgICAgIEFTRl9QQVlMT0FEX09GRlNFVF9JTlRPX01FRElBX09CSkVDVF9GSUVMRF9TSVpFICsgICAgXAorICAgICBBU0ZfUEFZTE9BRF9SRVBMSUNBVEVEX0RBVEFfTEVOR1RIX0ZJRUxEX1NJWkUgKyAgICAgIFwKKyAgICAgQVNGX1BBWUxPQURfUkVQTElDQVRFRF9EQVRBX0xFTkdUSCArICAgICAgICAgICAgICAgICBcCisgICAgIEFTRl9QQVlMT0FEX0xFTkdUSF9GSUVMRF9TSVpFKQorCisjZGVmaW5lIFNJTkdMRV9QQVlMT0FEX0RBVEFfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChQQUNLRVRfU0laRSAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgUEFDS0VUX0hFQURFUl9NSU5fU0laRSAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIFBBWUxPQURfSEVBREVSX1NJWkVfU0lOR0xFX1BBWUxPQUQpCisKKyNkZWZpbmUgTVVMVElfUEFZTE9BRF9DT05TVEFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKFBBQ0tFVF9TSVpFIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBQQUNLRVRfSEVBREVSX01JTl9TSVpFIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgMSAtICAgICAgICAgLyogUGF5bG9hZCBGbGFncyAqLyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIDIgKiBQQVlMT0FEX0hFQURFUl9TSVpFX01VTFRJUExFX1BBWUxPQURTKQorCisjZGVmaW5lIERBVEFfSEVBREVSX1NJWkUgNTAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IHNlcW5vOworICAgIGludCBpc19zdHJlYW1lZDsKKyAgICBBU0ZTdHJlYW0gc3RyZWFtc1sxMjhdOyAgICAgICAgICAgICAgLy8vPCBpdCdzIG1heCBudW1iZXIgYW5kIGl0J3Mgbm90IHRoYXQgYmlnCisgICAgLyogbm9uIHN0cmVhbWVkIGFkZGl0b25uYWwgaW5mbyAqLworICAgIHVpbnQ2NF90IG5iX3BhY2tldHM7ICAgICAgICAgICAgICAgICAvLy88IGhvdyBtYW55IHBhY2tldHMgYXJlIHRoZXJlIGluIHRoZSBmaWxlLCBpbnZhbGlkIGlmIGJyb2FkY2FzdGluZworICAgIGludDY0X3QgZHVyYXRpb247ICAgICAgICAgICAgICAgICAgICAvLy88IGluIDEwMG5zIHVuaXRzCisgICAgLyogcGFja2V0IGZpbGxpbmcgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG11bHRpX3BheWxvYWRzX3ByZXNlbnQ7CisgICAgaW50IHBhY2tldF9zaXplX2xlZnQ7CisgICAgaW50NjRfdCBwYWNrZXRfdGltZXN0YW1wX3N0YXJ0OworICAgIGludDY0X3QgcGFja2V0X3RpbWVzdGFtcF9lbmQ7CisgICAgdW5zaWduZWQgaW50IHBhY2tldF9uYl9wYXlsb2FkczsKKyAgICB1aW50OF90IHBhY2tldF9idWZbUEFDS0VUX1NJWkVdOworICAgIEFWSU9Db250ZXh0IHBiOworICAgIC8qIG9ubHkgZm9yIHJlYWRpbmcgKi8KKyAgICB1aW50NjRfdCBkYXRhX29mZnNldDsgICAgICAgICAgICAgICAgLy8vPCBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IGRhdGEgcGFja2V0CisKKyAgICBBU0ZJbmRleCAqaW5kZXhfcHRyOworICAgIHVpbnQzMl90IG5iX2luZGV4X21lbW9yeV9hbGxvYzsKKyAgICB1aW50MTZfdCBtYXhpbXVtX3BhY2tldDsKKyAgICB1aW50MzJfdCBuZXh0X3BhY2tldF9udW1iZXI7CisgICAgdWludDE2X3QgbmV4dF9wYWNrZXRfY291bnQ7CisgICAgdWludDY0X3QgbmV4dF9wYWNrZXRfb2Zmc2V0OworICAgIGludCAgICAgIG5leHRfc3RhcnRfc2VjOworICAgIGludCAgICAgIGVuZF9zZWM7Cit9IEFTRkNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjVGFnIGNvZGVjX2FzZl9ibXBfdGFnc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICBNS1RBRygnTScsICc0JywgJ1MnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgIE1LVEFHKCdNJywgJ1AnLCAnNCcsICdTJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01TTVBFRzRWMywgTUtUQUcoJ00nLCAnUCcsICc0JywgJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgICAwIH0sCit9OworCisjZGVmaW5lIFBSRVJPTExfVElNRSAzMTAwCisKK3N0YXRpYyB2b2lkIHB1dF9zdHIxNihBVklPQ29udGV4dCAqcywgY29uc3QgY2hhciAqdGFnKQoreworICAgIGludCBsZW47CisgICAgdWludDhfdCAqcGI7CisgICAgQVZJT0NvbnRleHQgKmR5bl9idWY7CisgICAgaWYgKGF2aW9fb3Blbl9keW5fYnVmKCZkeW5fYnVmKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIGF2aW9fcHV0X3N0cjE2bGUoZHluX2J1ZiwgdGFnKTsKKyAgICBsZW4gPSBhdmlvX2Nsb3NlX2R5bl9idWYoZHluX2J1ZiwgJnBiKTsKKyAgICBhdmlvX3dsMTYocywgbGVuKTsKKyAgICBhdmlvX3dyaXRlKHMsIHBiLCBsZW4pOworICAgIGF2X2ZyZWVwKCZwYik7Cit9CisKK3N0YXRpYyBpbnQ2NF90IHB1dF9oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCBjb25zdCBmZl9hc2ZfZ3VpZCAqZykKK3sKKyAgICBpbnQ2NF90IHBvczsKKworICAgIHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgZmZfcHV0X2d1aWQocGIsIGcpOworICAgIGF2aW9fd2w2NChwYiwgMjQpOworICAgIHJldHVybiBwb3M7Cit9CisKKy8qIHVwZGF0ZSBoZWFkZXIgc2l6ZSAqLworc3RhdGljIHZvaWQgZW5kX2hlYWRlcihBVklPQ29udGV4dCAqcGIsIGludDY0X3QgcG9zKQoreworICAgIGludDY0X3QgcG9zMTsKKworICAgIHBvczEgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fc2VlayhwYiwgcG9zICsgMTYsIFNFRUtfU0VUKTsKKyAgICBhdmlvX3dsNjQocGIsIHBvczEgLSBwb3MpOworICAgIGF2aW9fc2VlayhwYiwgcG9zMSwgU0VFS19TRVQpOworfQorCisvKiB3cml0ZSBhbiBhc2YgY2h1bmsgKG9ubHkgdXNlZCBpbiBzdHJlYW1pbmcgY2FzZSkgKi8KK3N0YXRpYyB2b2lkIHB1dF9jaHVuayhBVkZvcm1hdENvbnRleHQgKnMsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBwYXlsb2FkX2xlbmd0aCwgaW50IGZsYWdzKQoreworICAgIEFTRkNvbnRleHQgKmFzZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgbGVuZ3RoOworCisgICAgbGVuZ3RoID0gcGF5bG9hZF9sZW5ndGggKyA4OworICAgIGF2aW9fd2wxNihwYiwgdHlwZSk7CisgICAgYXZpb193bDE2KHBiLCBsZW5ndGgpOyAgICAgIC8vIHNpemUKKyAgICBhdmlvX3dsMzIocGIsIGFzZi0+c2Vxbm8pOyAgLy8gc2VxdWVuY2UgbnVtYmVyCisgICAgYXZpb193bDE2KHBiLCBmbGFncyk7ICAgICAgIC8vIHVua25vd24gYnl0ZXMKKyAgICBhdmlvX3dsMTYocGIsIGxlbmd0aCk7ICAgICAgLy8gc2l6ZV9jb25maXJtCisgICAgYXNmLT5zZXFubysrOworfQorCisvKiBjb252ZXJ0IGZyb20gdW5peCB0byB3aW5kb3dzIHRpbWUgKi8KK3N0YXRpYyBpbnQ2NF90IHVuaXhfdG9fZmlsZV90aW1lKGludCB0aSkKK3sKKyAgICBpbnQ2NF90IHQ7CisKKyAgICB0ICA9IHRpICogSU5UNjRfQygxMDAwMDAwMCk7CisgICAgdCArPSBJTlQ2NF9DKDExNjQ0NDczNjAwMDAwMDAwMCk7CisgICAgcmV0dXJuIHQ7Cit9CisKK3N0YXRpYyBpbnQzMl90IGdldF9zZW5kX3RpbWUoQVNGQ29udGV4dCAqYXNmLCBpbnQ2NF90IHByZXNfdGltZSwgdWludDY0X3QgKm9mZnNldCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQzMl90IHNlbmRfdGltZSA9IDA7CisgICAgKm9mZnNldCA9IGFzZi0+ZGF0YV9vZmZzZXQgKyBEQVRBX0hFQURFUl9TSVpFOworICAgIGZvciAoaSA9IDA7IGkgPCBhc2YtPm5leHRfc3RhcnRfc2VjOyBpKyspIHsKKyAgICAgICAgaWYgKHByZXNfdGltZSA8PSBhc2YtPmluZGV4X3B0cltpXS5zZW5kX3RpbWUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2VuZF90aW1lID0gYXNmLT5pbmRleF9wdHJbaV0uc2VuZF90aW1lOworICAgICAgICAqb2Zmc2V0ICAgPSBhc2YtPmluZGV4X3B0cltpXS5vZmZzZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlbmRfdGltZSAvIDEwMDAwOworfQorCitzdGF0aWMgaW50IGFzZl93cml0ZV9tYXJrZXJzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBU0ZDb250ZXh0ICphc2YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGk7CisgICAgQVZSYXRpb25hbCBzY2FsZSA9IHsxLCAxMDAwMDAwMH07CisgICAgaW50NjRfdCBocG9zID0gcHV0X2hlYWRlcihwYiwgJmZmX2FzZl9tYXJrZXJfaGVhZGVyKTsKKworICAgIGZmX3B1dF9ndWlkKHBiLCAmZmZfYXNmX3Jlc2VydmVkXzQpOy8vIEFTRiBzcGVjIG1hbmRhdGVzIHRoaXMgcmVzZXJ2ZWQgdmFsdWUKKyAgICBhdmlvX3dsMzIocGIsIHMtPm5iX2NoYXB0ZXJzKTsgICAgIC8vIG1hcmtlcnMgY291bnQKKyAgICBhdmlvX3dsMTYocGIsIDApOyAgICAgICAgICAgICAgICAgIC8vIEFTRiBzcGVjIG1hbmRhdGVzIDAgZm9yIHRoaXMKKyAgICBhdmlvX3dsMTYocGIsIDApOyAgICAgICAgICAgICAgICAgIC8vIG5hbWUgbGVuZ3RoIDAsIG5vIG5hbWUgZ2l2ZW4KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFwdGVyczsgaSsrKSB7CisgICAgICAgIEFWQ2hhcHRlciAqYyA9IHMtPmNoYXB0ZXJzW2ldOworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IGF2X2RpY3RfZ2V0KGMtPm1ldGFkYXRhLCAidGl0bGUiLCBOVUxMLCAwKTsKKyAgICAgICAgaW50NjRfdCBwcmVzX3RpbWUgPSBhdl9yZXNjYWxlX3EoYy0+c3RhcnQsIGMtPnRpbWVfYmFzZSwgc2NhbGUpOworICAgICAgICB1aW50NjRfdCBvZmZzZXQ7CisgICAgICAgIGludDMyX3Qgc2VuZF90aW1lID0gZ2V0X3NlbmRfdGltZShhc2YsIHByZXNfdGltZSwgJm9mZnNldCk7CisgICAgICAgIGludCBsZW4gPSAwOworICAgICAgICB1aW50OF90ICpidWY7CisgICAgICAgIEFWSU9Db250ZXh0ICpkeW5fYnVmOworICAgICAgICBpZiAodCkgeworICAgICAgICAgICAgaWYgKGF2aW9fb3Blbl9keW5fYnVmKCZkeW5fYnVmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGF2aW9fcHV0X3N0cjE2bGUoZHluX2J1ZiwgdC0+dmFsdWUpOworICAgICAgICAgICAgbGVuID0gYXZpb19jbG9zZV9keW5fYnVmKGR5bl9idWYsICZidWYpOworICAgICAgICB9CisgICAgICAgIGF2aW9fd2w2NChwYiwgb2Zmc2V0KTsgICAgICAgICAgICAvLyBvZmZzZXQgb2YgdGhlIHBhY2tldCB3aXRoIHNlbmRfdGltZQorICAgICAgICBhdmlvX3dsNjQocGIsIHByZXNfdGltZSArIFBSRVJPTExfVElNRSAqIDEwMDAwKTsgLy8gcHJlc2VudGF0aW9uIHRpbWUKKyAgICAgICAgYXZpb193bDE2KHBiLCAxMiArIGxlbik7ICAgICAgICAgIC8vIGVudHJ5IGxlbmd0aAorICAgICAgICBhdmlvX3dsMzIocGIsIHNlbmRfdGltZSk7ICAgICAgICAgLy8gc2VuZCB0aW1lCisgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7ICAgICAgICAgICAgICAgICAvLyBmbGFncywgc2hvdWxkIGJlIDAKKyAgICAgICAgYXZpb193bDMyKHBiLCBsZW4gLyAyKTsgICAgICAgICAgIC8vIG1hcmtlciBkZXNjIGxlbmd0aCBpbiBXQ0hBUlMhCisgICAgICAgIGlmICh0KSB7CisgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBidWYsIGxlbik7ICAgICAvLyBtYXJrZXIgZGVzYworICAgICAgICAgICAgYXZfZnJlZXAoJmJ1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgZW5kX2hlYWRlcihwYiwgaHBvcyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHdyaXRlIHRoZSBoZWFkZXIgKHVzZWQgdHdvIHRpbWVzIGlmIG5vbiBzdHJlYW1lZCkgKi8KK3N0YXRpYyBpbnQgYXNmX3dyaXRlX2hlYWRlcjEoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IGZpbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkYXRhX2NodW5rX3NpemUpCit7CisgICAgQVNGQ29udGV4dCAqYXNmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0YWdzWzVdOworICAgIGludCBoZWFkZXJfc2l6ZSwgbiwgZXh0cmFfc2l6ZSwgZXh0cmFfc2l6ZTIsIHdhdl9leHRyYV9zaXplLCBmaWxlX3RpbWU7CisgICAgaW50IGhhc190aXRsZSwgaGFzX2FzcGVjdF9yYXRpbyA9IDA7CisgICAgaW50IG1ldGFkYXRhX2NvdW50OworICAgIEFWQ29kZWNDb250ZXh0ICplbmM7CisgICAgaW50NjRfdCBoZWFkZXJfb2Zmc2V0LCBjdXJfcG9zLCBocG9zOworICAgIGludCBiaXRfcmF0ZTsKKyAgICBpbnQ2NF90IGR1cmF0aW9uOworCisgICAgZmZfbWV0YWRhdGFfY29udigmcy0+bWV0YWRhdGEsIGZmX2FzZl9tZXRhZGF0YV9jb252LCBOVUxMKTsKKworICAgIHRhZ3NbMF0gPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInRpdGxlIiwgTlVMTCwgMCk7CisgICAgdGFnc1sxXSA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiYXV0aG9yIiwgTlVMTCwgMCk7CisgICAgdGFnc1syXSA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiY29weXJpZ2h0IiwgTlVMTCwgMCk7CisgICAgdGFnc1szXSA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiY29tbWVudCIsIE5VTEwsIDApOworICAgIHRhZ3NbNF0gPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInJhdGluZyIsIE5VTEwsIDApOworCisgICAgZHVyYXRpb24gICAgICAgPSBhc2YtPmR1cmF0aW9uICsgUFJFUk9MTF9USU1FICogMTAwMDA7CisgICAgaGFzX3RpdGxlICAgICAgPSB0YWdzWzBdIHx8IHRhZ3NbMV0gfHwgdGFnc1syXSB8fCB0YWdzWzNdIHx8IHRhZ3NbNF07CisgICAgbWV0YWRhdGFfY291bnQgPSBhdl9kaWN0X2NvdW50KHMtPm1ldGFkYXRhKTsKKworICAgIGJpdF9yYXRlID0gMDsKKyAgICBmb3IgKG4gPSAwOyBuIDwgcy0+bmJfc3RyZWFtczsgbisrKSB7CisgICAgICAgIGVuYyA9IHMtPnN0cmVhbXNbbl0tPmNvZGVjOworCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1tuXSwgMzIsIDEsIDEwMDApOyAvKiAzMiBiaXQgcHRzIGluIG1zICovCisKKyAgICAgICAgYml0X3JhdGUgKz0gZW5jLT5iaXRfcmF0ZTsKKyAgICAgICAgaWYgKCAgIGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8KKyAgICAgICAgICAgICYmIGVuYy0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPiAwCisgICAgICAgICAgICAmJiBlbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID4gMCkKKyAgICAgICAgICAgIGhhc19hc3BlY3RfcmF0aW8rKzsKKyAgICB9CisKKyAgICBpZiAoYXNmLT5pc19zdHJlYW1lZCkgeworICAgICAgICBwdXRfY2h1bmsocywgMHg0ODI0LCAwLCAweGMwMCk7IC8qIHN0YXJ0IG9mIHN0cmVhbSAobGVuZ3RoIHdpbGwgYmUgcGF0Y2hlZCBsYXRlcikgKi8KKyAgICB9CisKKyAgICBmZl9wdXRfZ3VpZChwYiwgJmZmX2FzZl9oZWFkZXIpOworICAgIGF2aW9fd2w2NChwYiwgLTEpOyAvKiBoZWFkZXIgbGVuZ3RoLCB3aWxsIGJlIHBhdGNoZWQgYWZ0ZXIgKi8KKyAgICBhdmlvX3dsMzIocGIsIDMgKyBoYXNfdGl0bGUgKyAhIW1ldGFkYXRhX2NvdW50ICsgcy0+bmJfc3RyZWFtcyk7IC8qIG51bWJlciBvZiBjaHVua3MgaW4gaGVhZGVyICovCisgICAgYXZpb193OChwYiwgMSk7IC8qID8/PyAqLworICAgIGF2aW9fdzgocGIsIDIpOyAvKiA/Pz8gKi8KKworICAgIC8qIGZpbGUgaGVhZGVyICovCisgICAgaGVhZGVyX29mZnNldCA9IGF2aW9fdGVsbChwYik7CisgICAgaHBvcyAgICAgICAgICA9IHB1dF9oZWFkZXIocGIsICZmZl9hc2ZfZmlsZV9oZWFkZXIpOworICAgIGZmX3B1dF9ndWlkKHBiLCAmZmZfYXNmX215X2d1aWQpOworICAgIGF2aW9fd2w2NChwYiwgZmlsZV9zaXplKTsKKyAgICBmaWxlX3RpbWUgPSAwOworICAgIGF2aW9fd2w2NChwYiwgdW5peF90b19maWxlX3RpbWUoZmlsZV90aW1lKSk7CisgICAgYXZpb193bDY0KHBiLCBhc2YtPm5iX3BhY2tldHMpOyAvKiBudW1iZXIgb2YgcGFja2V0cyAqLworICAgIGF2aW9fd2w2NChwYiwgZHVyYXRpb24pOyAvKiBlbmQgdGltZSBzdGFtcCAoaW4gMTAwbnMgdW5pdHMpICovCisgICAgYXZpb193bDY0KHBiLCBhc2YtPmR1cmF0aW9uKTsgLyogZHVyYXRpb24gKGluIDEwMG5zIHVuaXRzKSAqLworICAgIGF2aW9fd2w2NChwYiwgUFJFUk9MTF9USU1FKTsgLyogc3RhcnQgdGltZSBzdGFtcCAqLworICAgIGF2aW9fd2wzMihwYiwgKGFzZi0+aXNfc3RyZWFtZWQgfHwgIXBiLT5zZWVrYWJsZSkgPyAzIDogMik7ICAvKiA/Pz8gKi8KKyAgICBhdmlvX3dsMzIocGIsIHMtPnBhY2tldF9zaXplKTsgLyogcGFja2V0IHNpemUgKi8KKyAgICBhdmlvX3dsMzIocGIsIHMtPnBhY2tldF9zaXplKTsgLyogcGFja2V0IHNpemUgKi8KKyAgICBhdmlvX3dsMzIocGIsIGJpdF9yYXRlID8gYml0X3JhdGUgOiAtMSk7IC8qIE1heGltdW0gZGF0YSByYXRlIGluIGJwcyAqLworICAgIGVuZF9oZWFkZXIocGIsIGhwb3MpOworCisgICAgLyogdW5rbm93biBoZWFkZXJzICovCisgICAgaHBvcyA9IHB1dF9oZWFkZXIocGIsICZmZl9hc2ZfaGVhZDFfZ3VpZCk7CisgICAgZmZfcHV0X2d1aWQocGIsICZmZl9hc2ZfaGVhZDJfZ3VpZCk7CisgICAgYXZpb193bDE2KHBiLCA2KTsKKyAgICBpZiAoaGFzX2FzcGVjdF9yYXRpbykgeworICAgICAgICBpbnQ2NF90IGhwb3MyOworICAgICAgICBhdmlvX3dsMzIocGIsIDI2ICsgaGFzX2FzcGVjdF9yYXRpbyAqIDg0KTsKKyAgICAgICAgaHBvczIgPSBwdXRfaGVhZGVyKHBiLCAmZmZfYXNmX21ldGFkYXRhX2hlYWRlcik7CisgICAgICAgIGF2aW9fd2wxNihwYiwgMiAqIGhhc19hc3BlY3RfcmF0aW8pOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgcy0+bmJfc3RyZWFtczsgbisrKSB7CisgICAgICAgICAgICBlbmMgPSBzLT5zdHJlYW1zW25dLT5jb2RlYzsKKyAgICAgICAgICAgIGlmICggICBlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPCisgICAgICAgICAgICAgICAgJiYgZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA+IDAKKyAgICAgICAgICAgICAgICAmJiBlbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID4gMCkgeworICAgICAgICAgICAgICAgIEFWUmF0aW9uYWwgc2FyID0gZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMCk7CisgICAgICAgICAgICAgICAgLy8gdGhlIHN0cmVhbSBudW1iZXIgaXMgc2V0IGxpa2UgdGhpcyBiZWxvdworICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgbiArIDEpOworICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMjYpOyAvLyBuYW1lX2xlbgorICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgIDMpOyAvLyB2YWx1ZV90eXBlCisgICAgICAgICAgICAgICAgYXZpb193bDMyKHBiLCAgNCk7IC8vIHZhbHVlX2xlbgorICAgICAgICAgICAgICAgIGF2aW9fcHV0X3N0cjE2bGUocGIsICJBc3BlY3RSYXRpb1giKTsKKyAgICAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHNhci5udW0pOworICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMCk7CisgICAgICAgICAgICAgICAgLy8gdGhlIHN0cmVhbSBudW1iZXIgaXMgc2V0IGxpa2UgdGhpcyBiZWxvdworICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgbiArIDEpOworICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMjYpOyAvLyBuYW1lX2xlbgorICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgIDMpOyAvLyB2YWx1ZV90eXBlCisgICAgICAgICAgICAgICAgYXZpb193bDMyKHBiLCAgNCk7IC8vIHZhbHVlX2xlbgorICAgICAgICAgICAgICAgIGF2aW9fcHV0X3N0cjE2bGUocGIsICJBc3BlY3RSYXRpb1kiKTsKKyAgICAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHNhci5kZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVuZF9oZWFkZXIocGIsIGhwb3MyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3dsMzIocGIsIDApOworICAgIH0KKyAgICBlbmRfaGVhZGVyKHBiLCBocG9zKTsKKworICAgIC8qIHRpdGxlIGFuZCBvdGhlciBpbmZvcyAqLworICAgIGlmIChoYXNfdGl0bGUpIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgdWludDhfdCAqYnVmOworICAgICAgICBBVklPQ29udGV4dCAqZHluX2J1ZjsKKworICAgICAgICBpZiAoYXZpb19vcGVuX2R5bl9idWYoJmR5bl9idWYpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgaHBvcyA9IHB1dF9oZWFkZXIocGIsICZmZl9hc2ZfY29tbWVudF9oZWFkZXIpOworCisgICAgICAgIGZvciAobiA9IDA7IG4gPCBGRl9BUlJBWV9FTEVNUyh0YWdzKTsgbisrKSB7CisgICAgICAgICAgICBsZW4gPSB0YWdzW25dID8gYXZpb19wdXRfc3RyMTZsZShkeW5fYnVmLCB0YWdzW25dLT52YWx1ZSkgOiAwOworICAgICAgICAgICAgYXZpb193bDE2KHBiLCBsZW4pOworICAgICAgICB9CisgICAgICAgIGxlbiA9IGF2aW9fY2xvc2VfZHluX2J1ZihkeW5fYnVmLCAmYnVmKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgYnVmLCBsZW4pOworICAgICAgICBhdl9mcmVlcCgmYnVmKTsKKyAgICAgICAgZW5kX2hlYWRlcihwYiwgaHBvcyk7CisgICAgfQorICAgIGlmIChtZXRhZGF0YV9jb3VudCkgeworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnID0gTlVMTDsKKyAgICAgICAgaHBvcyA9IHB1dF9oZWFkZXIocGIsICZmZl9hc2ZfZXh0ZW5kZWRfY29udGVudF9oZWFkZXIpOworICAgICAgICBhdmlvX3dsMTYocGIsIG1ldGFkYXRhX2NvdW50KTsKKyAgICAgICAgd2hpbGUgKCh0YWcgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgIiIsIHRhZywgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgICAgIHB1dF9zdHIxNihwYiwgdGFnLT5rZXkpOworICAgICAgICAgICAgYXZpb193bDE2KHBiLCAwKTsKKyAgICAgICAgICAgIHB1dF9zdHIxNihwYiwgdGFnLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZW5kX2hlYWRlcihwYiwgaHBvcyk7CisgICAgfQorICAgIC8qIGNoYXB0ZXJzIHVzaW5nIEFTRiBtYXJrZXJzICovCisgICAgaWYgKCFhc2YtPmlzX3N0cmVhbWVkICYmIHMtPm5iX2NoYXB0ZXJzKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIGlmIChyZXQgPSBhc2Zfd3JpdGVfbWFya2VycyhzKSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIC8qIHN0cmVhbSBoZWFkZXJzICovCisgICAgZm9yIChuID0gMDsgbiA8IHMtPm5iX3N0cmVhbXM7IG4rKykgeworICAgICAgICBpbnQ2NF90IGVzX3BvczsKKyAgICAgICAgLy8gICAgICAgIEFTRlN0cmVhbSAqc3RyZWFtID0gJmFzZi0+c3RyZWFtc1tuXTsKKworICAgICAgICBlbmMgICAgICAgICAgICAgICAgID0gcy0+c3RyZWFtc1tuXS0+Y29kZWM7CisgICAgICAgIGFzZi0+c3RyZWFtc1tuXS5udW0gPSBuICsgMTsKKyAgICAgICAgYXNmLT5zdHJlYW1zW25dLnNlcSA9IDE7CisKKyAgICAgICAgc3dpdGNoIChlbmMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICB3YXZfZXh0cmFfc2l6ZSA9IDA7CisgICAgICAgICAgICBleHRyYV9zaXplICAgICA9IDE4ICsgd2F2X2V4dHJhX3NpemU7CisgICAgICAgICAgICBleHRyYV9zaXplMiAgICA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICB3YXZfZXh0cmFfc2l6ZSA9IGVuYy0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgICAgICBleHRyYV9zaXplICAgICA9IDB4MzMgKyB3YXZfZXh0cmFfc2l6ZTsKKyAgICAgICAgICAgIGV4dHJhX3NpemUyICAgID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaHBvcyA9IHB1dF9oZWFkZXIocGIsICZmZl9hc2Zfc3RyZWFtX2hlYWRlcik7CisgICAgICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBmZl9wdXRfZ3VpZChwYiwgJmZmX2FzZl9hdWRpb19zdHJlYW0pOworICAgICAgICAgICAgZmZfcHV0X2d1aWQocGIsICZmZl9hc2ZfYXVkaW9fY29uY2VhbF9zcHJlYWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmZfcHV0X2d1aWQocGIsICZmZl9hc2ZfdmlkZW9fc3RyZWFtKTsKKyAgICAgICAgICAgIGZmX3B1dF9ndWlkKHBiLCAmZmZfYXNmX3ZpZGVvX2NvbmNlYWxfbm9uZSk7CisgICAgICAgIH0KKyAgICAgICAgYXZpb193bDY0KHBiLCAwKTsgLyogPz8/ICovCisgICAgICAgIGVzX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGF2aW9fd2wzMihwYiwgZXh0cmFfc2l6ZSk7IC8qIHdhdiBoZWFkZXIgbGVuICovCisgICAgICAgIGF2aW9fd2wzMihwYiwgZXh0cmFfc2l6ZTIpOyAvKiBhZGRpdGlvbmFsIGRhdGEgbGVuICovCisgICAgICAgIGF2aW9fd2wxNihwYiwgbiArIDEpOyAvKiBzdHJlYW0gbnVtYmVyICovCisgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7IC8qID8/PyAqLworCisgICAgICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICAvKiBXQVZFRk9STUFURVggaGVhZGVyICovCisgICAgICAgICAgICBpbnQgd2F2c2l6ZSA9IGZmX3B1dF93YXZfaGVhZGVyKHBiLCBlbmMsIEZGX1BVVF9XQVZfSEVBREVSX0ZPUkNFX1dBVkVGT1JNQVRFWCk7CisKKyAgICAgICAgICAgIGlmICh3YXZzaXplIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAod2F2c2l6ZSAhPSBleHRyYV9zaXplKSB7CisgICAgICAgICAgICAgICAgY3VyX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBlc19wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHdhdnNpemUpOyAvKiB3YXYgaGVhZGVyIGxlbiAqLworICAgICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgY3VyX3BvcywgU0VFS19TRVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRVJST1IgQ29ycmVjdGlvbiAqLworICAgICAgICAgICAgYXZpb193OChwYiwgMHgwMSk7CisgICAgICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2IHx8ICFlbmMtPmJsb2NrX2FsaWduKSB7CisgICAgICAgICAgICAgICAgYXZpb193bDE2KHBiLCAweDAxOTApOworICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMHgwMTkwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZpb193bDE2KHBiLCBlbmMtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgICAgICAgICBhdmlvX3dsMTYocGIsIGVuYy0+YmxvY2tfYWxpZ24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb193bDE2KHBiLCAweDAxKTsKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIDB4MDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZpb193bDMyKHBiLCBlbmMtPndpZHRoKTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgZW5jLT5oZWlnaHQpOworICAgICAgICAgICAgYXZpb193OChwYiwgMik7IC8qID8/PyAqLworICAgICAgICAgICAgYXZpb193bDE2KHBiLCA0MCArIGVuYy0+ZXh0cmFkYXRhX3NpemUpOyAvKiBzaXplICovCisKKyAgICAgICAgICAgIC8qIEJJVE1BUElORk9IRUFERVIgaGVhZGVyICovCisgICAgICAgICAgICBmZl9wdXRfYm1wX2hlYWRlcihwYiwgZW5jLCBmZl9jb2RlY19ibXBfdGFncywgMSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZW5kX2hlYWRlcihwYiwgaHBvcyk7CisgICAgfQorCisgICAgLyogbWVkaWEgY29tbWVudHMgKi8KKworICAgIGhwb3MgPSBwdXRfaGVhZGVyKHBiLCAmZmZfYXNmX2NvZGVjX2NvbW1lbnRfaGVhZGVyKTsKKyAgICBmZl9wdXRfZ3VpZChwYiwgJmZmX2FzZl9jb2RlY19jb21tZW50MV9oZWFkZXIpOworICAgIGF2aW9fd2wzMihwYiwgcy0+bmJfc3RyZWFtcyk7CisgICAgZm9yIChuID0gMDsgbiA8IHMtPm5iX3N0cmVhbXM7IG4rKykgeworICAgICAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqY29kZWNfZGVzYzsKKyAgICAgICAgY29uc3QgY2hhciAqZGVzYzsKKworICAgICAgICBlbmMgID0gcy0+c3RyZWFtc1tuXS0+Y29kZWM7CisgICAgICAgIGNvZGVjX2Rlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGVuYy0+Y29kZWNfaWQpOworCisgICAgICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICAgICAgYXZpb193bDE2KHBiLCAyKTsKKyAgICAgICAgZWxzZSBpZiAoZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgLTEpOworCisgICAgICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNQVYyKQorICAgICAgICAgICAgZGVzYyA9ICJXaW5kb3dzIE1lZGlhIEF1ZGlvIFY4IjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGVzYyA9IGNvZGVjX2Rlc2MgPyBjb2RlY19kZXNjLT5uYW1lIDogTlVMTDsKKworICAgICAgICBpZiAoZGVzYykgeworICAgICAgICAgICAgQVZJT0NvbnRleHQgKmR5bl9idWY7CisgICAgICAgICAgICB1aW50OF90ICpidWY7CisgICAgICAgICAgICBpbnQgbGVuOworCisgICAgICAgICAgICBpZiAoYXZpb19vcGVuX2R5bl9idWYoJmR5bl9idWYpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBhdmlvX3B1dF9zdHIxNmxlKGR5bl9idWYsIGRlc2MpOworICAgICAgICAgICAgbGVuID0gYXZpb19jbG9zZV9keW5fYnVmKGR5bl9idWYsICZidWYpOworICAgICAgICAgICAgYXZpb193bDE2KHBiLCBsZW4gLyAyKTsgLy8gIm51bWJlciBvZiBjaGFyYWN0ZXJzIiA9IGxlbmd0aCBpbiBieXRlcyAvIDIKKworICAgICAgICAgICAgYXZpb193cml0ZShwYiwgYnVmLCBsZW4pOworICAgICAgICAgICAgYXZfZnJlZXAoJmJ1Zik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYXZpb193bDE2KHBiLCAwKTsKKworICAgICAgICBhdmlvX3dsMTYocGIsIDApOyAvKiBubyBwYXJhbWV0ZXJzICovCisKKyAgICAgICAgLyogaWQgKi8KKyAgICAgICAgaWYgKGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMik7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIGVuYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgNCk7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWVuYy0+Y29kZWNfdGFnKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbmRfaGVhZGVyKHBiLCBocG9zKTsKKworICAgIC8qIHBhdGNoIHRoZSBoZWFkZXIgc2l6ZSBmaWVsZHMgKi8KKworICAgIGN1cl9wb3MgICAgID0gYXZpb190ZWxsKHBiKTsKKyAgICBoZWFkZXJfc2l6ZSA9IGN1cl9wb3MgLSBoZWFkZXJfb2Zmc2V0OworICAgIGlmIChhc2YtPmlzX3N0cmVhbWVkKSB7CisgICAgICAgIGhlYWRlcl9zaXplICs9IDggKyAzMCArIERBVEFfSEVBREVSX1NJWkU7CisKKyAgICAgICAgYXZpb19zZWVrKHBiLCBoZWFkZXJfb2Zmc2V0IC0gMTAgLSAzMCwgU0VFS19TRVQpOworICAgICAgICBhdmlvX3dsMTYocGIsIGhlYWRlcl9zaXplKTsKKyAgICAgICAgYXZpb19zZWVrKHBiLCBoZWFkZXJfb2Zmc2V0IC0gMiAtIDMwLCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fd2wxNihwYiwgaGVhZGVyX3NpemUpOworCisgICAgICAgIGhlYWRlcl9zaXplIC09IDggKyAzMCArIERBVEFfSEVBREVSX1NJWkU7CisgICAgfQorICAgIGhlYWRlcl9zaXplICs9IDI0ICsgNjsKKyAgICBhdmlvX3NlZWsocGIsIGhlYWRlcl9vZmZzZXQgLSAxNCwgU0VFS19TRVQpOworICAgIGF2aW9fd2w2NChwYiwgaGVhZGVyX3NpemUpOworICAgIGF2aW9fc2VlayhwYiwgY3VyX3BvcywgU0VFS19TRVQpOworCisgICAgLyogbW92aWUgY2h1bmssIGZvbGxvd2VkIGJ5IHBhY2tldHMgb2YgcGFja2V0X3NpemUgKi8KKyAgICBhc2YtPmRhdGFfb2Zmc2V0ID0gY3VyX3BvczsKKyAgICBmZl9wdXRfZ3VpZChwYiwgJmZmX2FzZl9kYXRhX2hlYWRlcik7CisgICAgYXZpb193bDY0KHBiLCBkYXRhX2NodW5rX3NpemUpOworICAgIGZmX3B1dF9ndWlkKHBiLCAmZmZfYXNmX215X2d1aWQpOworICAgIGF2aW9fd2w2NChwYiwgYXNmLT5uYl9wYWNrZXRzKTsgLyogbmIgcGFja2V0cyAqLworICAgIGF2aW9fdzgocGIsIDEpOyAvKiA/Pz8gKi8KKyAgICBhdmlvX3c4KHBiLCAxKTsgLyogPz8/ICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNmX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVNGQ29udGV4dCAqYXNmID0gcy0+cHJpdl9kYXRhOworCisgICAgcy0+cGFja2V0X3NpemUgID0gUEFDS0VUX1NJWkU7CisgICAgcy0+bWF4X2ludGVybGVhdmVfZGVsdGEgPSAwOworICAgIGFzZi0+bmJfcGFja2V0cyA9IDA7CisKKyAgICBhc2YtPmluZGV4X3B0ciAgICAgICAgICAgICA9IGF2X21hbGxvYyhzaXplb2YoQVNGSW5kZXgpICogQVNGX0lOREVYX0JMT0NLKTsKKyAgICBhc2YtPm5iX2luZGV4X21lbW9yeV9hbGxvYyA9IEFTRl9JTkRFWF9CTE9DSzsKKyAgICBhc2YtPm1heGltdW1fcGFja2V0ICAgICAgICA9IDA7CisKKyAgICAvKiB0aGUgZGF0YS1jaHVuay1zaXplIGhhcyB0byBiZSA1MCAoREFUQV9IRUFERVJfU0laRSksIHdoaWNoIGlzCisgICAgICogZGF0YV9zaXplIC0gYXNmLT5kYXRhX29mZnNldCBhdCB0aGUgbW9tZW50IHRoaXMgZnVuY3Rpb24gaXMgZG9uZS4KKyAgICAgKiBJdCBpcyBuZWVkZWQgdG8gdXNlIGFzZiBhcyBhIHN0cmVhbWFibGUgZm9ybWF0LiAqLworICAgIGlmIChhc2Zfd3JpdGVfaGVhZGVyMShzLCAwLCBEQVRBX0hFQURFUl9TSVpFKSA8IDApIHsKKyAgICAgICAgLy9hdl9mcmVlKGFzZik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKworICAgIGFzZi0+cGFja2V0X25iX3BheWxvYWRzICAgICA9IDA7CisgICAgYXNmLT5wYWNrZXRfdGltZXN0YW1wX3N0YXJ0ID0gLTE7CisgICAgYXNmLT5wYWNrZXRfdGltZXN0YW1wX2VuZCAgID0gLTE7CisgICAgZmZpb19pbml0X2NvbnRleHQoJmFzZi0+cGIsIGFzZi0+cGFja2V0X2J1Ziwgcy0+cGFja2V0X3NpemUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICBpZiAocy0+YXZvaWRfbmVnYXRpdmVfdHMgPCAwKQorICAgICAgICBzLT5hdm9pZF9uZWdhdGl2ZV90cyA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc2Zfd3JpdGVfc3RyZWFtX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVNGQ29udGV4dCAqYXNmID0gcy0+cHJpdl9kYXRhOworCisgICAgYXNmLT5pc19zdHJlYW1lZCA9IDE7CisKKyAgICByZXR1cm4gYXNmX3dyaXRlX2hlYWRlcihzKTsKK30KKworc3RhdGljIGludCBwdXRfcGF5bG9hZF9wYXJzaW5nX2luZm8oQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2VuZHRpbWUsIHVuc2lnbmVkIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3BheWxvYWRzLCBpbnQgcGFkc2l6ZSkKK3sKKyAgICBBU0ZDb250ZXh0ICphc2YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHBwaV9zaXplLCBpOworICAgIGludDY0X3Qgc3RhcnQgPSBhdmlvX3RlbGwocGIpOworCisgICAgaW50IGlMZW5ndGhUeXBlRmxhZ3MgPSBBU0ZfUFBJX0xFTkdUSF9UWVBFX0ZMQUdTOworCisgICAgcGFkc2l6ZSAtPSBQQUNLRVRfSEVBREVSX01JTl9TSVpFOworICAgIGlmIChhc2YtPm11bHRpX3BheWxvYWRzX3ByZXNlbnQpCisgICAgICAgIHBhZHNpemUtLTsKKyAgICBhdl9hc3NlcnQwKHBhZHNpemUgPj0gMCk7CisKKyAgICBhdmlvX3c4KHBiLCBBU0ZfUEFDS0VUX0VSUk9SX0NPUlJFQ1RJT05fRkxBR1MpOworICAgIGZvciAoaSA9IDA7IGkgPCBBU0ZfUEFDS0VUX0VSUk9SX0NPUlJFQ1RJT05fREFUQV9TSVpFOyBpKyspCisgICAgICAgIGF2aW9fdzgocGIsIDB4MCk7CisKKyAgICBpZiAoYXNmLT5tdWx0aV9wYXlsb2Fkc19wcmVzZW50KQorICAgICAgICBpTGVuZ3RoVHlwZUZsYWdzIHw9IEFTRl9QUElfRkxBR19NVUxUSVBMRV9QQVlMT0FEU19QUkVTRU5UOworCisgICAgaWYgKHBhZHNpemUgPiAwKSB7CisgICAgICAgIGlmIChwYWRzaXplIDwgMjU2KQorICAgICAgICAgICAgaUxlbmd0aFR5cGVGbGFncyB8PSBBU0ZfUFBJX0ZMQUdfUEFERElOR19MRU5HVEhfRklFTERfSVNfQllURTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaUxlbmd0aFR5cGVGbGFncyB8PSBBU0ZfUFBJX0ZMQUdfUEFERElOR19MRU5HVEhfRklFTERfSVNfV09SRDsKKyAgICB9CisgICAgYXZpb193OChwYiwgaUxlbmd0aFR5cGVGbGFncyk7CisKKyAgICBhdmlvX3c4KHBiLCBBU0ZfUFBJX1BST1BFUlRZX0ZMQUdTKTsKKworICAgIGlmIChpTGVuZ3RoVHlwZUZsYWdzICYgQVNGX1BQSV9GTEFHX1BBRERJTkdfTEVOR1RIX0ZJRUxEX0lTX1dPUkQpCisgICAgICAgIGF2aW9fd2wxNihwYiwgcGFkc2l6ZSAtIDIpOworICAgIGlmIChpTGVuZ3RoVHlwZUZsYWdzICYgQVNGX1BQSV9GTEFHX1BBRERJTkdfTEVOR1RIX0ZJRUxEX0lTX0JZVEUpCisgICAgICAgIGF2aW9fdzgocGIsIHBhZHNpemUgLSAxKTsKKworICAgIGF2aW9fd2wzMihwYiwgc2VuZHRpbWUpOworICAgIGF2aW9fd2wxNihwYiwgZHVyYXRpb24pOworICAgIGlmIChhc2YtPm11bHRpX3BheWxvYWRzX3ByZXNlbnQpCisgICAgICAgIGF2aW9fdzgocGIsIG5iX3BheWxvYWRzIHwgQVNGX1BBWUxPQURfRkxBR1MpOworCisgICAgcHBpX3NpemUgPSBhdmlvX3RlbGwocGIpIC0gc3RhcnQ7CisKKyAgICByZXR1cm4gcHBpX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVNGQ29udGV4dCAqYXNmID0gcy0+cHJpdl9kYXRhOworICAgIGludCBwYWNrZXRfaGRyX3NpemUsIHBhY2tldF9maWxsZWRfc2l6ZTsKKworICAgIGF2X2Fzc2VydDAoYXNmLT5wYWNrZXRfdGltZXN0YW1wX2VuZCA+PSBhc2YtPnBhY2tldF90aW1lc3RhbXBfc3RhcnQpOworCisgICAgaWYgKGFzZi0+aXNfc3RyZWFtZWQpCisgICAgICAgIHB1dF9jaHVuayhzLCAweDQ0MjQsIHMtPnBhY2tldF9zaXplLCAwKTsKKworICAgIHBhY2tldF9oZHJfc2l6ZSA9IHB1dF9wYXlsb2FkX3BhcnNpbmdfaW5mbyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2YtPnBhY2tldF90aW1lc3RhbXBfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZi0+cGFja2V0X3RpbWVzdGFtcF9lbmQgLSBhc2YtPnBhY2tldF90aW1lc3RhbXBfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZi0+cGFja2V0X25iX3BheWxvYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2YtPnBhY2tldF9zaXplX2xlZnQpOworCisgICAgcGFja2V0X2ZpbGxlZF9zaXplID0gUEFDS0VUX1NJWkUgLSBhc2YtPnBhY2tldF9zaXplX2xlZnQ7CisgICAgYXZfYXNzZXJ0MChwYWNrZXRfaGRyX3NpemUgPD0gYXNmLT5wYWNrZXRfc2l6ZV9sZWZ0KTsKKyAgICBtZW1zZXQoYXNmLT5wYWNrZXRfYnVmICsgcGFja2V0X2ZpbGxlZF9zaXplLCAwLCBhc2YtPnBhY2tldF9zaXplX2xlZnQpOworCisgICAgYXZpb193cml0ZShzLT5wYiwgYXNmLT5wYWNrZXRfYnVmLCBzLT5wYWNrZXRfc2l6ZSAtIHBhY2tldF9oZHJfc2l6ZSk7CisKKyAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKyAgICBhc2YtPm5iX3BhY2tldHMrKzsKKyAgICBhc2YtPnBhY2tldF9uYl9wYXlsb2FkcyAgICAgPSAwOworICAgIGFzZi0+cGFja2V0X3RpbWVzdGFtcF9zdGFydCA9IC0xOworICAgIGFzZi0+cGFja2V0X3RpbWVzdGFtcF9lbmQgICA9IC0xOworICAgIGZmaW9faW5pdF9jb250ZXh0KCZhc2YtPnBiLCBhc2YtPnBhY2tldF9idWYsIHMtPnBhY2tldF9zaXplLCAxLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBwdXRfcGF5bG9hZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBBU0ZTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHByZXNlbnRhdGlvbl90aW1lLCBpbnQgbV9vYmpfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbV9vYmpfb2Zmc2V0LCBpbnQgcGF5bG9hZF9sZW4sIGludCBmbGFncykKK3sKKyAgICBBU0ZDb250ZXh0ICphc2YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gJmFzZi0+cGI7CisgICAgaW50IHZhbDsKKworICAgIHZhbCA9IHN0cmVhbS0+bnVtOworICAgIGlmIChmbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkKKyAgICAgICAgdmFsIHw9IEFTRl9QTF9GTEFHX0tFWV9GUkFNRTsKKyAgICBhdmlvX3c4KHBiLCB2YWwpOworCisgICAgYXZpb193OChwYiwgc3RyZWFtLT5zZXEpOyAgICAgLy8gTWVkaWEgb2JqZWN0IG51bWJlcgorICAgIGF2aW9fd2wzMihwYiwgbV9vYmpfb2Zmc2V0KTsgIC8vIE9mZnNldCBJbnRvIE1lZGlhIE9iamVjdAorCisgICAgLy8gUmVwbGljYXRlZCBEYXRhIHNoYWxsIGJlIGF0IGxlYXN0IDggYnl0ZXMgbG9uZy4KKyAgICAvLyBUaGUgZmlyc3QgNCBieXRlcyBvZiBkYXRhIHNoYWxsIGNvbnRhaW4gdGhlCisgICAgLy8gU2l6ZSBvZiB0aGUgTWVkaWEgT2JqZWN0IHRoYXQgdGhlIHBheWxvYWQgYmVsb25ncyB0by4KKyAgICAvLyBUaGUgbmV4dCA0IGJ5dGVzIG9mIGRhdGEgc2hhbGwgY29udGFpbiB0aGUKKyAgICAvLyBQcmVzZW50YXRpb24gVGltZSBmb3IgdGhlIG1lZGlhIG9iamVjdCB0aGF0IHRoZSBwYXlsb2FkIGJlbG9uZ3MgdG8uCisgICAgYXZpb193OChwYiwgQVNGX1BBWUxPQURfUkVQTElDQVRFRF9EQVRBX0xFTkdUSCk7CisKKyAgICBhdmlvX3dsMzIocGIsIG1fb2JqX3NpemUpOyAgICAgICAgLy8gUmVwbGljYXRlZCBEYXRhIC0gTWVkaWEgT2JqZWN0IFNpemUKKyAgICBhdmlvX3dsMzIocGIsICh1aW50MzJfdCkgcHJlc2VudGF0aW9uX3RpbWUpOyAvLyBSZXBsaWNhdGVkIERhdGEgLSBQcmVzZW50YXRpb24gVGltZQorCisgICAgaWYgKGFzZi0+bXVsdGlfcGF5bG9hZHNfcHJlc2VudCkgeworICAgICAgICBhdmlvX3dsMTYocGIsIHBheWxvYWRfbGVuKTsgICAvLyBwYXlsb2FkIGxlbmd0aAorICAgIH0KK30KKworc3RhdGljIHZvaWQgcHV0X2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqcywgQVNGU3RyZWFtICpzdHJlYW0sIEFWU3RyZWFtICphdnN0LAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG1fb2JqX3NpemUsIGludCBmbGFncykKK3sKKyAgICBBU0ZDb250ZXh0ICphc2YgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IG1fb2JqX29mZnNldCwgcGF5bG9hZF9sZW4sIGZyYWdfbGVuMTsKKworICAgIG1fb2JqX29mZnNldCA9IDA7CisgICAgd2hpbGUgKG1fb2JqX29mZnNldCA8IG1fb2JqX3NpemUpIHsKKyAgICAgICAgcGF5bG9hZF9sZW4gPSBtX29ial9zaXplIC0gbV9vYmpfb2Zmc2V0OworICAgICAgICBpZiAoYXNmLT5wYWNrZXRfdGltZXN0YW1wX3N0YXJ0ID09IC0xKSB7CisgICAgICAgICAgICBhc2YtPm11bHRpX3BheWxvYWRzX3ByZXNlbnQgPSAocGF5bG9hZF9sZW4gPCBNVUxUSV9QQVlMT0FEX0NPTlNUQU5UKTsKKworICAgICAgICAgICAgYXNmLT5wYWNrZXRfc2l6ZV9sZWZ0ID0gUEFDS0VUX1NJWkU7CisgICAgICAgICAgICBpZiAoYXNmLT5tdWx0aV9wYXlsb2Fkc19wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgZnJhZ19sZW4xID0gTVVMVElfUEFZTE9BRF9DT05TVEFOVCAtIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZyYWdfbGVuMSA9IFNJTkdMRV9QQVlMT0FEX0RBVEFfTEVOR1RIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNmLT5wYWNrZXRfdGltZXN0YW1wX3N0YXJ0ID0gdGltZXN0YW1wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbXVsdGkgcGF5bG9hZHMKKyAgICAgICAgICAgIGZyYWdfbGVuMSA9IGFzZi0+cGFja2V0X3NpemVfbGVmdCAtCisgICAgICAgICAgICAgICAgICAgICAgICBQQVlMT0FEX0hFQURFUl9TSVpFX01VTFRJUExFX1BBWUxPQURTIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tFVF9IRUFERVJfTUlOX1NJWkUgLSAxOworCisgICAgICAgICAgICBpZiAoZnJhZ19sZW4xIDwgcGF5bG9hZF9sZW4gJiYKKyAgICAgICAgICAgICAgICBhdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgICAgICBmbHVzaF9wYWNrZXQocyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdfbGVuMSA+IDApIHsKKyAgICAgICAgICAgIGlmIChwYXlsb2FkX2xlbiA+IGZyYWdfbGVuMSkKKyAgICAgICAgICAgICAgICBwYXlsb2FkX2xlbiA9IGZyYWdfbGVuMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBheWxvYWRfbGVuID09IChmcmFnX2xlbjEgLSAxKSkKKyAgICAgICAgICAgICAgICBwYXlsb2FkX2xlbiA9IGZyYWdfbGVuMSAtIDI7ICAvLyBhZGRpdGlvbmFsIGJ5dGUgbmVlZCB0byBwdXQgcGFkZGluZyBsZW5ndGgKKworICAgICAgICAgICAgcHV0X3BheWxvYWRfaGVhZGVyKHMsIHN0cmVhbSwgdGltZXN0YW1wICsgUFJFUk9MTF9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb2JqX3NpemUsIG1fb2JqX29mZnNldCwgcGF5bG9hZF9sZW4sIGZsYWdzKTsKKyAgICAgICAgICAgIGF2aW9fd3JpdGUoJmFzZi0+cGIsIGJ1ZiwgcGF5bG9hZF9sZW4pOworCisgICAgICAgICAgICBpZiAoYXNmLT5tdWx0aV9wYXlsb2Fkc19wcmVzZW50KQorICAgICAgICAgICAgICAgIGFzZi0+cGFja2V0X3NpemVfbGVmdCAtPSAocGF5bG9hZF9sZW4gKyBQQVlMT0FEX0hFQURFUl9TSVpFX01VTFRJUExFX1BBWUxPQURTKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhc2YtPnBhY2tldF9zaXplX2xlZnQgLT0gKHBheWxvYWRfbGVuICsgUEFZTE9BRF9IRUFERVJfU0laRV9TSU5HTEVfUEFZTE9BRCk7CisgICAgICAgICAgICBhc2YtPnBhY2tldF90aW1lc3RhbXBfZW5kID0gdGltZXN0YW1wOworCisgICAgICAgICAgICBhc2YtPnBhY2tldF9uYl9wYXlsb2FkcysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGF5bG9hZF9sZW4gPSAwOworICAgICAgICB9CisgICAgICAgIG1fb2JqX29mZnNldCArPSBwYXlsb2FkX2xlbjsKKyAgICAgICAgYnVmICAgICAgICAgICs9IHBheWxvYWRfbGVuOworCisgICAgICAgIGlmICghYXNmLT5tdWx0aV9wYXlsb2Fkc19wcmVzZW50KQorICAgICAgICAgICAgZmx1c2hfcGFja2V0KHMpOworICAgICAgICBlbHNlIGlmIChhc2YtPnBhY2tldF9zaXplX2xlZnQgPD0gKFBBWUxPQURfSEVBREVSX1NJWkVfTVVMVElQTEVfUEFZTE9BRFMgKyBQQUNLRVRfSEVBREVSX01JTl9TSVpFICsgMSkpCisgICAgICAgICAgICBmbHVzaF9wYWNrZXQocyk7CisgICAgICAgIGVsc2UgaWYgKGFzZi0+cGFja2V0X25iX3BheWxvYWRzID09IEFTRl9QQVlMT0FEU19QRVJfUEFDS0VUKQorICAgICAgICAgICAgZmx1c2hfcGFja2V0KHMpOworICAgIH0KKyAgICBzdHJlYW0tPnNlcSsrOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9pbmRleChBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdGFydF9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFja2V0X251bWJlciwgdWludDE2X3QgcGFja2V0X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBhY2tldF9vZmZzZXQpCit7CisgICAgQVNGQ29udGV4dCAqYXNmID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKHN0YXJ0X3NlYyA+IGFzZi0+bmV4dF9zdGFydF9zZWMpIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYgKCFhc2YtPm5leHRfc3RhcnRfc2VjKSB7CisgICAgICAgICAgICBhc2YtPm5leHRfcGFja2V0X251bWJlciA9IHBhY2tldF9udW1iZXI7CisgICAgICAgICAgICBhc2YtPm5leHRfcGFja2V0X2NvdW50ICA9IHBhY2tldF9jb3VudDsKKyAgICAgICAgICAgIGFzZi0+bmV4dF9wYWNrZXRfb2Zmc2V0ID0gcGFja2V0X29mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGFydF9zZWMgPiBhc2YtPm5iX2luZGV4X21lbW9yeV9hbGxvYykgeworICAgICAgICAgICAgaW50IGVycjsKKyAgICAgICAgICAgIGFzZi0+bmJfaW5kZXhfbWVtb3J5X2FsbG9jID0gKHN0YXJ0X3NlYyArIEFTRl9JTkRFWF9CTE9DSykgJiB+KEFTRl9JTkRFWF9CTE9DSyAtIDEpOworICAgICAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcF9hcnJheSgmYXNmLT5pbmRleF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZi0+bmJfaW5kZXhfbWVtb3J5X2FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmFzZi0+aW5kZXhfcHRyKSkpIDwgMCkgeworICAgICAgICAgICAgICAgIGFzZi0+bmJfaW5kZXhfbWVtb3J5X2FsbG9jID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IGFzZi0+bmV4dF9zdGFydF9zZWM7IGkgPCBzdGFydF9zZWM7IGkrKykgeworICAgICAgICAgICAgYXNmLT5pbmRleF9wdHJbaV0ucGFja2V0X251bWJlciA9IGFzZi0+bmV4dF9wYWNrZXRfbnVtYmVyOworICAgICAgICAgICAgYXNmLT5pbmRleF9wdHJbaV0ucGFja2V0X2NvdW50ICA9IGFzZi0+bmV4dF9wYWNrZXRfY291bnQ7CisgICAgICAgICAgICBhc2YtPmluZGV4X3B0cltpXS5zZW5kX3RpbWUgICAgID0gYXNmLT5uZXh0X3N0YXJ0X3NlYyAqIElOVDY0X0MoMTAwMDAwMDApOworICAgICAgICAgICAgYXNmLT5pbmRleF9wdHJbaV0ub2Zmc2V0ICAgICAgICA9IGFzZi0+bmV4dF9wYWNrZXRfb2Zmc2V0OworCisgICAgICAgIH0KKyAgICB9CisgICAgYXNmLT5tYXhpbXVtX3BhY2tldCAgICAgPSBGRk1BWChhc2YtPm1heGltdW1fcGFja2V0LCBwYWNrZXRfY291bnQpOworICAgIGFzZi0+bmV4dF9wYWNrZXRfbnVtYmVyID0gcGFja2V0X251bWJlcjsKKyAgICBhc2YtPm5leHRfcGFja2V0X2NvdW50ICA9IHBhY2tldF9jb3VudDsKKyAgICBhc2YtPm5leHRfcGFja2V0X29mZnNldCA9IHBhY2tldF9vZmZzZXQ7CisgICAgYXNmLT5uZXh0X3N0YXJ0X3NlYyAgICAgPSBzdGFydF9zZWM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc2Zfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBU0ZDb250ZXh0ICphc2YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVNGU3RyZWFtICpzdHJlYW07CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjOworICAgIHVpbnQzMl90IHBhY2tldF9udW1iZXI7CisgICAgaW50NjRfdCBwdHM7CisgICAgaW50IHN0YXJ0X3NlYzsKKyAgICBpbnQgZmxhZ3MgPSBwa3QtPmZsYWdzOworICAgIGludCByZXQ7CisgICAgdWludDY0X3Qgb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKKworICAgIGNvZGVjICA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYzsKKyAgICBzdHJlYW0gPSAmYXNmLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKworICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgIGZsYWdzICY9IH5BVl9QS1RfRkxBR19LRVk7CisKKyAgICBwdHMgPSAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpID8gcGt0LT5wdHMgOiBwa3QtPmR0czsKKyAgICBhdl9hc3NlcnQwKHB0cyAhPSBBVl9OT1BUU19WQUxVRSk7CisgICAgcHRzICo9IDEwMDAwOworICAgIGFzZi0+ZHVyYXRpb24gPSBGRk1BWChhc2YtPmR1cmF0aW9uLCBwdHMgKyBwa3QtPmR1cmF0aW9uICogMTAwMDApOworCisgICAgcGFja2V0X251bWJlciA9IGFzZi0+bmJfcGFja2V0czsKKyAgICBwdXRfZnJhbWUocywgc3RyZWFtLCBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XSwKKyAgICAgICAgICAgICAgcGt0LT5kdHMsIHBrdC0+ZGF0YSwgcGt0LT5zaXplLCBmbGFncyk7CisKKyAgICBzdGFydF9zZWMgPSAoaW50KSgoUFJFUk9MTF9USU1FICogMTAwMDAgKyBwdHMgKyBBU0ZfSU5ERVhFRF9JTlRFUlZBTCAtIDEpCisgICAgICAgICAgICAgIC8gQVNGX0lOREVYRURfSU5URVJWQUwpOworCisgICAgLyogY2hlY2sgaW5kZXggKi8KKyAgICBpZiAoKCFhc2YtPmlzX3N0cmVhbWVkKSAmJiAoZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKSB7CisgICAgICAgIHVpbnQxNl90IHBhY2tldF9jb3VudCA9IGFzZi0+bmJfcGFja2V0cyAtIHBhY2tldF9udW1iZXI7CisgICAgICAgIHJldCA9IHVwZGF0ZV9pbmRleChzLCBzdGFydF9zZWMsIHBhY2tldF9udW1iZXIsIHBhY2tldF9jb3VudCwgb2Zmc2V0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBhc2YtPmVuZF9zZWMgPSBzdGFydF9zZWM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc2Zfd3JpdGVfaW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBBU0ZJbmRleCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXgsIHVpbnQzMl90IGNvdW50KQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCBpOworCisgICAgZmZfcHV0X2d1aWQocGIsICZmZl9hc2Zfc2ltcGxlX2luZGV4X2hlYWRlcik7CisgICAgYXZpb193bDY0KHBiLCAyNCArIDE2ICsgOCArIDQgKyA0ICsgKDQgKyAyKSAqIGNvdW50KTsKKyAgICBmZl9wdXRfZ3VpZChwYiwgJmZmX2FzZl9teV9ndWlkKTsKKyAgICBhdmlvX3dsNjQocGIsIEFTRl9JTkRFWEVEX0lOVEVSVkFMKTsKKyAgICBhdmlvX3dsMzIocGIsIG1heCk7CisgICAgYXZpb193bDMyKHBiLCBjb3VudCk7CisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgYXZpb193bDMyKHBiLCBpbmRleFtpXS5wYWNrZXRfbnVtYmVyKTsKKyAgICAgICAgYXZpb193bDE2KHBiLCBpbmRleFtpXS5wYWNrZXRfY291bnQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzZl93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBU0ZDb250ZXh0ICphc2YgPSBzLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBmaWxlX3NpemUsIGRhdGFfc2l6ZTsKKyAgICBpbnQgcmV0OworCisgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgcGFja2V0ICovCisgICAgaWYgKGFzZi0+cGIuYnVmX3B0ciA+IGFzZi0+cGIuYnVmZmVyKQorICAgICAgICBmbHVzaF9wYWNrZXQocyk7CisKKyAgICAvKiB3cml0ZSBpbmRleCAqLworICAgIGRhdGFfc2l6ZSA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgaWYgKCFhc2YtPmlzX3N0cmVhbWVkICYmIGFzZi0+bmV4dF9zdGFydF9zZWMpIHsKKyAgICAgICAgaWYgKChyZXQgPSB1cGRhdGVfaW5kZXgocywgYXNmLT5lbmRfc2VjICsgMSwgMCwgMCwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGFzZl93cml0ZV9pbmRleChzLCBhc2YtPmluZGV4X3B0ciwgYXNmLT5tYXhpbXVtX3BhY2tldCwgYXNmLT5uZXh0X3N0YXJ0X3NlYyk7CisgICAgfQorICAgIGF2aW9fZmx1c2gocy0+cGIpOworCisgICAgaWYgKGFzZi0+aXNfc3RyZWFtZWQgfHwgIXMtPnBiLT5zZWVrYWJsZSkgeworICAgICAgICBwdXRfY2h1bmsocywgMHg0NTI0LCAwLCAwKTsgLyogZW5kIG9mIHN0cmVhbSAqLworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHJld3JpdGUgYW4gdXBkYXRlZCBoZWFkZXIgKi8KKyAgICAgICAgZmlsZV9zaXplID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICAgICAgYXZpb19zZWVrKHMtPnBiLCAwLCBTRUVLX1NFVCk7CisgICAgICAgIGFzZl93cml0ZV9oZWFkZXIxKHMsIGZpbGVfc2l6ZSwgZGF0YV9zaXplIC0gYXNmLT5kYXRhX29mZnNldCk7CisgICAgfQorCisgICAgYXZfZnJlZXAoJmFzZi0+aW5kZXhfcHRyKTsKKyAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19BU0ZfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX2FzZl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXNmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVNGIChBZHZhbmNlZCAvIEFjdGl2ZSBTdHJlYW1pbmcgRm9ybWF0KSIpLAorICAgIC5taW1lX3R5cGUgICAgICA9ICJ2aWRlby94LW1zLWFzZiIsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImFzZix3bXYsd21hIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVNGQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfV01BVjIsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfTVNNUEVHNFYzLAorICAgIC53cml0ZV9oZWFkZXIgICA9IGFzZl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gYXNmX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgPSBhc2Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIsCisgICAgLmNvZGVjX3RhZyAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcgKiBjb25zdCBbXSkgeworICAgICAgICBjb2RlY19hc2ZfYm1wX3RhZ3MsIGZmX2NvZGVjX2JtcF90YWdzLCBmZl9jb2RlY193YXZfdGFncywgMAorICAgIH0sCit9OworI2VuZGlmIC8qIENPTkZJR19BU0ZfTVVYRVIgKi8KKworI2lmIENPTkZJR19BU0ZfU1RSRUFNX01VWEVSCitBVk91dHB1dEZvcm1hdCBmZl9hc2Zfc3RyZWFtX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhc2Zfc3RyZWFtIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVNGIChBZHZhbmNlZCAvIEFjdGl2ZSBTdHJlYW1pbmcgRm9ybWF0KSIpLAorICAgIC5taW1lX3R5cGUgICAgICA9ICJ2aWRlby94LW1zLWFzZiIsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImFzZix3bXYsd21hIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVNGQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfV01BVjIsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfTVNNUEVHNFYzLAorICAgIC53cml0ZV9oZWFkZXIgICA9IGFzZl93cml0ZV9zdHJlYW1faGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IGFzZl93cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gYXNmX3dyaXRlX3RyYWlsZXIsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0xPQkFMSEVBREVSLAorICAgIC5jb2RlY190YWcgICAgICA9IChjb25zdCBBVkNvZGVjVGFnICogY29uc3QgW10pIHsKKyAgICAgICAgY29kZWNfYXNmX2JtcF90YWdzLCBmZl9jb2RlY19ibXBfdGFncywgZmZfY29kZWNfd2F2X3RhZ3MsIDAKKyAgICB9LAorfTsKKyNlbmRpZiAvKiBDT05GSUdfQVNGX1NUUkVBTV9NVVhFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2Fzc2RlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2Fzc2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MmU3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXNzZGVjLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBTU0EvQVNTIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2zDqW1lbnQgQsWTc2NoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdWJ0aXRsZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorCit0eXBlZGVmIHN0cnVjdCBBU1NDb250ZXh0IHsKKyAgICBGRkRlbXV4U3VidGl0bGVzUXVldWUgcTsKKyAgICB1bnNpZ25lZCByZWFkb3JkZXI7Cit9IEFTU0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgYXNzX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNoYXIgYnVmWzEzXTsKKyAgICBGRlRleHRSZWFkZXIgdHI7CisgICAgZmZfdGV4dF9pbml0X2J1ZigmdHIsIHAtPmJ1ZiwgcC0+YnVmX3NpemUpOworCisgICAgZmZfdGV4dF9yZWFkKCZ0ciwgYnVmLCBzaXplb2YoYnVmKSk7CisKKyAgICBpZiAoIW1lbWNtcChidWYsICJbU2NyaXB0IEluZm9dIiwgMTMpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3NfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVNTQ29udGV4dCAqYXNzID0gcy0+cHJpdl9kYXRhOworICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9jbGVhbigmYXNzLT5xKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2RpYWxvZ3VlKEFTU0NvbnRleHQgKmFzcywgQVZCUHJpbnQgKmRzdCwgY29uc3QgdWludDhfdCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpzdGFydCwgaW50ICpkdXJhdGlvbikKK3sKKyAgICBpbnQgcG9zID0gMDsKKyAgICBpbnQ2NF90IGVuZDsKKyAgICBpbnQgaGgxLCBtbTEsIHNzMSwgbXMxOworICAgIGludCBoaDIsIG1tMiwgc3MyLCBtczI7CisKKyAgICBpZiAoc3NjYW5mKHAsICJEaWFsb2d1ZTogJSpbXixdLCVkOiVkOiVkJSpjJWQsJWQ6JWQ6JWQlKmMlZCwlbiIsCisgICAgICAgICAgICAgICAmaGgxLCAmbW0xLCAmc3MxLCAmbXMxLAorICAgICAgICAgICAgICAgJmhoMiwgJm1tMiwgJnNzMiwgJm1zMiwgJnBvcykgPj0gOCAmJiBwb3MgPiAwKSB7CisKKyAgICAgICAgLyogVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgc3NjYW5mIGl0c2VsZiBpbiBvcmRlciB0byBoYW5kbGUgYW4gYWN0dWFsCisgICAgICAgICAqIG51bWJlciAod2hpY2ggd291bGQgYmUgdGhlIExheWVyKSBvciB0aGUgZm9ybSAiTWFya2VkPU4iICh3aGljaCBpcworICAgICAgICAgKiB0aGUgb2xkIFNTQSBmaWVsZCwgbm93IHJlcGxhY2VkIGJ5IExheWVyLCBhbmQgd2lsbCBsZWFkIHRvIExheWVyCisgICAgICAgICAqIGJlaW5nIDAgaGVyZSkuICovCisgICAgICAgIGNvbnN0IGludCBsYXllciA9IGF0b2kocCArIDEwKTsKKworICAgICAgICBlbmQgICAgPSAoaGgyKjM2MDBMTCArIG1tMio2MExMICsgc3MyKSAqIDEwMExMICsgbXMyOworICAgICAgICAqc3RhcnQgPSAoaGgxKjM2MDBMTCArIG1tMSo2MExMICsgc3MxKSAqIDEwMExMICsgbXMxOworICAgICAgICAqZHVyYXRpb24gPSBlbmQgLSAqc3RhcnQ7CisKKyAgICAgICAgYXZfYnByaW50X2NsZWFyKGRzdCk7CisgICAgICAgIGF2X2JwcmludGYoZHN0LCAiJXUsJWQsJXMiLCBhc3MtPnJlYWRvcmRlcisrLCBsYXllciwgcCArIHBvcyk7CisKKyAgICAgICAgLyogcmlnaHQgc3RyaXAgdGhlIGJ1ZmZlciAqLworICAgICAgICB3aGlsZSAoZHN0LT5sZW4gPiAwICYmCisgICAgICAgICAgICAgICBkc3QtPnN0cltkc3QtPmxlbiAtIDFdID09ICdccicgfHwKKyAgICAgICAgICAgICAgIGRzdC0+c3RyW2RzdC0+bGVuIC0gMV0gPT0gJ1xuJykKKyAgICAgICAgICAgIGRzdC0+c3RyWy0tZHN0LT5sZW5dID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludDY0X3QgZ2V0X2xpbmUoQVZCUHJpbnQgKmJ1ZiwgRkZUZXh0UmVhZGVyICp0cikKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGZmX3RleHRfcG9zKHRyKTsKKworICAgIGF2X2JwcmludF9jbGVhcihidWYpOworICAgIGZvciAoOzspIHsKKyAgICAgICAgY2hhciBjID0gZmZfdGV4dF9yOCh0cik7CisgICAgICAgIGlmICghYykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnVmLCBjLCAxKTsKKyAgICAgICAgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcG9zOworfQorCitzdGF0aWMgaW50IGFzc19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVNTQ29udGV4dCAqYXNzID0gcy0+cHJpdl9kYXRhOworICAgIEFWQlByaW50IGhlYWRlciwgbGluZSwgcmxpbmU7CisgICAgaW50IHJlcyA9IDA7CisgICAgQVZTdHJlYW0gKnN0OworICAgIEZGVGV4dFJlYWRlciB0cjsKKyAgICBmZl90ZXh0X2luaXRfYXZpbyhzLCAmdHIsIHMtPnBiKTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDApOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BU1M7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmaGVhZGVyLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgIGF2X2JwcmludF9pbml0KCZsaW5lLCAgIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgYXZfYnByaW50X2luaXQoJnJsaW5lLCAgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50NjRfdCBwb3MgPSBnZXRfbGluZSgmbGluZSwgJnRyKTsKKyAgICAgICAgaW50NjRfdCB0c19zdGFydCA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBpbnQgZHVyYXRpb24gPSAtMTsKKyAgICAgICAgQVZQYWNrZXQgKnN1YjsKKworICAgICAgICBpZiAoIWxpbmUuc3RyWzBdKSAvLyBFT0YKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChyZWFkX2RpYWxvZ3VlKGFzcywgJnJsaW5lLCBsaW5lLnN0ciwgJnRzX3N0YXJ0LCAmZHVyYXRpb24pIDwgMCkgeworICAgICAgICAgICAgYXZfYnByaW50ZigmaGVhZGVyLCAiJXMiLCBsaW5lLnN0cik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdWIgPSBmZl9zdWJ0aXRsZXNfcXVldWVfaW5zZXJ0KCZhc3MtPnEsIHJsaW5lLnN0ciwgcmxpbmUubGVuLCAwKTsKKyAgICAgICAgaWYgKCFzdWIpIHsKKyAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIHN1Yi0+cG9zID0gcG9zOworICAgICAgICBzdWItPnB0cyA9IHRzX3N0YXJ0OworICAgICAgICBzdWItPmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgfQorCisgICAgcmVzID0gYXZwcml2X2JwcmludF90b19leHRyYWRhdGEoc3QtPmNvZGVjLCAmaGVhZGVyKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfZmluYWxpemUoJmFzcy0+cSk7CisKK2VuZDoKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmhlYWRlciwgTlVMTCk7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZsaW5lLCAgIE5VTEwpOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmcmxpbmUsICBOVUxMKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGFzc19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVNTQ29udGV4dCAqYXNzID0gcy0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl9zdWJ0aXRsZXNfcXVldWVfcmVhZF9wYWNrZXQoJmFzcy0+cSwgcGt0KTsKK30KKworc3RhdGljIGludCBhc3NfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncykKK3sKKyAgICBBU1NDb250ZXh0ICphc3MgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3N1YnRpdGxlc19xdWV1ZV9zZWVrKCZhc3MtPnEsIHMsIHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncyk7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYXNzX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFzcyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNTQSAoU3ViU3RhdGlvbiBBbHBoYSkgc3VidGl0bGUiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVNTQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gYXNzX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGFzc19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBhc3NfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gYXNzX3JlYWRfY2xvc2UsCisgICAgLnJlYWRfc2VlazIgICAgID0gYXNzX3JlYWRfc2VlaywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXNzZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXNzZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlMTA5NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hc3NlbmMuYwpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIFNTQS9BU1MgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKK3R5cGVkZWYgc3RydWN0IERpYWxvZ3VlTGluZSB7CisgICAgaW50IHJlYWRvcmRlcjsKKyAgICBjaGFyICpsaW5lOworICAgIHN0cnVjdCBEaWFsb2d1ZUxpbmUgKnByZXYsICpuZXh0OworfSBEaWFsb2d1ZUxpbmU7CisKK3R5cGVkZWYgc3RydWN0IEFTU0NvbnRleHR7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHdyaXRlX3RzOyAvLyAwOiBzc2EgKHRpbWluZyBpbiBwYXlsb2FkKSwgMTogYXNzIChtYXRyb3NrYSBsaWtlKQorICAgIGludCBleHBlY3RlZF9yZWFkb3JkZXI7CisgICAgRGlhbG9ndWVMaW5lICpkaWFsb2d1ZV9jYWNoZTsKKyAgICBEaWFsb2d1ZUxpbmUgKmxhc3RfYWRkZWRfZGlhbG9ndWU7CisgICAgaW50IGNhY2hlX3NpemU7CisgICAgaW50IHNzYV9tb2RlOworICAgIGludCBpZ25vcmVfcmVhZG9yZGVyOworfUFTU0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBU1NDb250ZXh0ICphc3MgPSBzLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4PSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKworICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEgfHwgKGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9TU0EgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQVNTKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXhhY3RseSBvbmUgQVNTL1NTQSBzdHJlYW0gaXMgbmVlZGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGFzcy0+d3JpdGVfdHMgPSBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVNTOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1swXSwgNjQsIDEsIDEwMCk7CisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+IDApIHsKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFbYXZjdHgtPmV4dHJhZGF0YV9zaXplIC0gMV0gIT0gJ1xuJykKKyAgICAgICAgICAgIGF2aW9fd3JpdGUocy0+cGIsICJcclxuIiwgMik7CisgICAgICAgIGFzcy0+c3NhX21vZGUgPSAhc3Ryc3RyKGF2Y3R4LT5leHRyYWRhdGEsICJcbltWNCsgU3R5bGVzXSIpOworICAgICAgICBpZiAoIXN0cnN0cihhdmN0eC0+ZXh0cmFkYXRhLCAiXG5bRXZlbnRzXSIpKQorICAgICAgICAgICAgYXZpb19wcmludGYocy0+cGIsICJbRXZlbnRzXVxyXG5Gb3JtYXQ6ICVzLCBTdGFydCwgRW5kLCBTdHlsZSwgTmFtZSwgTWFyZ2luTCwgTWFyZ2luUiwgTWFyZ2luViwgRWZmZWN0LCBUZXh0XHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhc3MtPnNzYV9tb2RlID8gIk1hcmtlZCIgOiAiTGF5ZXIiKTsKKyAgICB9CisgICAgYXZpb19mbHVzaChzLT5wYik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHVyZ2VfZGlhbG9ndWVzKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGZvcmNlKQoreworICAgIGludCBuID0gMDsKKyAgICBBU1NDb250ZXh0ICphc3MgPSBzLT5wcml2X2RhdGE7CisgICAgRGlhbG9ndWVMaW5lICpkaWFsb2d1ZSA9IGFzcy0+ZGlhbG9ndWVfY2FjaGU7CisKKyAgICB3aGlsZSAoZGlhbG9ndWUgJiYgKGRpYWxvZ3VlLT5yZWFkb3JkZXIgPT0gYXNzLT5leHBlY3RlZF9yZWFkb3JkZXIgfHwgZm9yY2UpKSB7CisgICAgICAgIERpYWxvZ3VlTGluZSAqbmV4dCA9IGRpYWxvZ3VlLT5uZXh0OworICAgICAgICBpZiAoZGlhbG9ndWUtPnJlYWRvcmRlciAhPSBhc3MtPmV4cGVjdGVkX3JlYWRvcmRlcikgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiUmVhZE9yZGVyIGdhcCBmb3VuZCBiZXR3ZWVuICVkIGFuZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBhc3MtPmV4cGVjdGVkX3JlYWRvcmRlciwgZGlhbG9ndWUtPnJlYWRvcmRlcik7CisgICAgICAgICAgICBhc3MtPmV4cGVjdGVkX3JlYWRvcmRlciA9IGRpYWxvZ3VlLT5yZWFkb3JkZXI7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19wcmludGYocy0+cGIsICJEaWFsb2d1ZTogJXNcclxuIiwgZGlhbG9ndWUtPmxpbmUpOworICAgICAgICBpZiAoZGlhbG9ndWUgPT0gYXNzLT5sYXN0X2FkZGVkX2RpYWxvZ3VlKQorICAgICAgICAgICAgYXNzLT5sYXN0X2FkZGVkX2RpYWxvZ3VlID0gbmV4dDsKKyAgICAgICAgYXZfZnJlZShkaWFsb2d1ZS0+bGluZSk7CisgICAgICAgIGF2X2ZyZWUoZGlhbG9ndWUpOworICAgICAgICBpZiAobmV4dCkKKyAgICAgICAgICAgIG5leHQtPnByZXYgPSBOVUxMOworICAgICAgICBkaWFsb2d1ZSA9IGFzcy0+ZGlhbG9ndWVfY2FjaGUgPSBuZXh0OworICAgICAgICBhc3MtPmV4cGVjdGVkX3JlYWRvcmRlcisrOworICAgICAgICBuKys7CisgICAgfQorICAgIGFzcy0+Y2FjaGVfc2l6ZSAtPSBuOworICAgIGlmIChuID4gMSkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIndyb3RlICVkIEFTUyBsaW5lcywgY2FjaGVkIGRpYWxvZ3VlczogJWQsIHdhaXRpbmcgZm9yIGV2ZW50IGlkICVkXG4iLAorICAgICAgICAgICAgICAgbiwgYXNzLT5jYWNoZV9zaXplLCBhc3MtPmV4cGVjdGVkX3JlYWRvcmRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9kaWFsb2d1ZShBU1NDb250ZXh0ICphc3MsIERpYWxvZ3VlTGluZSAqZGlhbG9ndWUpCit7CisgICAgRGlhbG9ndWVMaW5lICpjdXIsICpuZXh0ID0gTlVMTCwgKnByZXYgPSBOVUxMOworCisgICAgLyogZnJvbSB0aGUgbGFzdCBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCisgICAgaWYgKGFzcy0+bGFzdF9hZGRlZF9kaWFsb2d1ZSkgeworICAgICAgICBmb3IgKGN1ciA9IGFzcy0+bGFzdF9hZGRlZF9kaWFsb2d1ZTsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgICAgIGlmIChjdXItPnJlYWRvcmRlciA+IGRpYWxvZ3VlLT5yZWFkb3JkZXIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwcmV2ID0gY3VyOworICAgICAgICAgICAgbmV4dCA9IGN1ci0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGZyb20gdGhlIGJlZ2lubmluZyB0byB0aGUgbGFzdCBvbmUgYWRkZWQgKi8KKyAgICBpZiAoIXByZXYpIHsKKyAgICAgICAgbmV4dCA9IGFzcy0+ZGlhbG9ndWVfY2FjaGU7CisgICAgICAgIGZvciAoY3VyID0gbmV4dDsgY3VyICE9IGFzcy0+bGFzdF9hZGRlZF9kaWFsb2d1ZTsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAoY3VyLT5yZWFkb3JkZXIgPiBkaWFsb2d1ZS0+cmVhZG9yZGVyKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcHJldiA9IGN1cjsKKyAgICAgICAgICAgIG5leHQgPSBjdXItPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJldikgeworICAgICAgICBwcmV2LT5uZXh0ID0gZGlhbG9ndWU7CisgICAgICAgIGRpYWxvZ3VlLT5wcmV2ID0gcHJldjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWFsb2d1ZS0+cHJldiA9IGFzcy0+ZGlhbG9ndWVfY2FjaGU7CisgICAgICAgIGFzcy0+ZGlhbG9ndWVfY2FjaGUgPSBkaWFsb2d1ZTsKKyAgICB9CisgICAgaWYgKG5leHQpIHsKKyAgICAgICAgbmV4dC0+cHJldiA9IGRpYWxvZ3VlOworICAgICAgICBkaWFsb2d1ZS0+bmV4dCA9IG5leHQ7CisgICAgfQorICAgIGFzcy0+Y2FjaGVfc2l6ZSsrOworICAgIGFzcy0+bGFzdF9hZGRlZF9kaWFsb2d1ZSA9IGRpYWxvZ3VlOworfQorCitzdGF0aWMgaW50IHdyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVNTQ29udGV4dCAqYXNzID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKGFzcy0+d3JpdGVfdHMpIHsKKyAgICAgICAgbG9uZyBpbnQgbGF5ZXI7CisgICAgICAgIGNoYXIgKnAgPSBwa3QtPmRhdGE7CisgICAgICAgIGludDY0X3Qgc3RhcnQgPSBwa3QtPnB0czsKKyAgICAgICAgaW50NjRfdCBlbmQgICA9IHN0YXJ0ICsgcGt0LT5kdXJhdGlvbjsKKyAgICAgICAgaW50IGhoMSwgbW0xLCBzczEsIG1zMTsKKyAgICAgICAgaW50IGhoMiwgbW0yLCBzczIsIG1zMjsKKyAgICAgICAgRGlhbG9ndWVMaW5lICpkaWFsb2d1ZSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpkaWFsb2d1ZSkpOworCisgICAgICAgIGlmICghZGlhbG9ndWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGRpYWxvZ3VlLT5yZWFkb3JkZXIgPSBzdHJ0b2wocCwgJnAsIDEwKTsKKyAgICAgICAgaWYgKGRpYWxvZ3VlLT5yZWFkb3JkZXIgPCBhc3MtPmV4cGVjdGVkX3JlYWRvcmRlcikKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVuZXhwZWN0ZWQgUmVhZE9yZGVyICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGRpYWxvZ3VlLT5yZWFkb3JkZXIpOworICAgICAgICBpZiAoKnAgPT0gJywnKQorICAgICAgICAgICAgcCsrOworCisgICAgICAgIGlmIChhc3MtPnNzYV9tb2RlICYmICFzdHJuY21wKHAsICJNYXJrZWQ9IiwgNykpCisgICAgICAgICAgICBwICs9IDc7CisKKyAgICAgICAgbGF5ZXIgPSBzdHJ0b2wocCwgJnAsIDEwKTsKKyAgICAgICAgaWYgKCpwID09ICcsJykKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgaGgxID0gKGludCkoc3RhcnQgLyAzNjAwMDApOyAgICBtbTEgPSAoaW50KShzdGFydCAvIDYwMDApICUgNjA7CisgICAgICAgIGhoMiA9IChpbnQpKGVuZCAgIC8gMzYwMDAwKTsgICAgbW0yID0gKGludCkoZW5kICAgLyA2MDAwKSAlIDYwOworICAgICAgICBzczEgPSAoaW50KShzdGFydCAvIDEwMCkgJSA2MDsgIG1zMSA9IChpbnQpKHN0YXJ0ICUgMTAwKTsKKyAgICAgICAgc3MyID0gKGludCkoZW5kICAgLyAxMDApICUgNjA7ICBtczIgPSAoaW50KShlbmQgICAlIDEwMCk7CisgICAgICAgIGlmIChoaDEgPiA5KSBoaDEgPSA5LCBtbTEgPSA1OSwgc3MxID0gNTksIG1zMSA9IDk5OworICAgICAgICBpZiAoaGgyID4gOSkgaGgyID0gOSwgbW0yID0gNTksIHNzMiA9IDU5LCBtczIgPSA5OTsKKworICAgICAgICBkaWFsb2d1ZS0+bGluZSA9IGF2X2FzcHJpbnRmKCIlcyVsZCwlZDolMDJkOiUwMmQuJTAyZCwlZDolMDJkOiUwMmQuJTAyZCwlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzLT5zc2FfbW9kZSA/ICJNYXJrZWQ9IiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLCBoaDEsIG1tMSwgc3MxLCBtczEsIGhoMiwgbW0yLCBzczIsIG1zMiwgcCk7CisgICAgICAgIGlmICghZGlhbG9ndWUtPmxpbmUpIHsKKyAgICAgICAgICAgIGF2X2ZyZWUoZGlhbG9ndWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBpbnNlcnRfZGlhbG9ndWUoYXNzLCBkaWFsb2d1ZSk7CisgICAgICAgIHB1cmdlX2RpYWxvZ3VlcyhzLCBhc3MtPmlnbm9yZV9yZWFkb3JkZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2aW9fd3JpdGUocy0+cGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBwdXJnZV9kaWFsb2d1ZXMocywgMSk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFTU0NvbnRleHQsIHgpCisjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiaWdub3JlX3JlYWRvcmRlciIsICJ3cml0ZSBldmVudHMgaW1tZWRpYXRlbHksIGV2ZW4gaWYgdGhleSdyZSBvdXQtb2Ytb3JkZXIiLCBPRkZTRVQoaWdub3JlX3JlYWRvcmRlciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMSwgRSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYXNzX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImFzcyBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9hc3NfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFzcyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNTQSAoU3ViU3RhdGlvbiBBbHBoYSkgc3VidGl0bGUiKSwKKyAgICAubWltZV90eXBlICAgICAgPSAidGV4dC94LXNzYSIsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImFzcyxzc2EiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBU1NDb250ZXh0KSwKKyAgICAuc3VidGl0bGVfY29kZWMgPSBBVl9DT0RFQ19JRF9TU0EsCisgICAgLndyaXRlX2hlYWRlciAgID0gd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IHdyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgPSB3cml0ZV90cmFpbGVyLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dMT0JBTEhFQURFUiB8IEFWRk1UX05PVElNRVNUQU1QUyB8IEFWRk1UX1RTX05PTlNUUklDVCwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmYXNzX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hc3QuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGU3NGFhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FzdC5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBBU1QgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAxMiBKYW1lcyBBbG1lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX2FzdF90YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9BRkMsICAgICAgICAgIDAgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMTZCRV9QTEFOQVIsICAgMSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgICAgICAgICAgICAwIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2FzdC5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMzk5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXN0LmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIEFTVCBjb21tb24gY29kZQorICogQ29weXJpZ2h0IChjKSAyMDEyIEphbWVzIEFsbWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfQVNUX0gKKyNkZWZpbmUgQVZGT1JNQVRfQVNUX0gKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZXh0ZXJuIGNvbnN0IEFWQ29kZWNUYWcgZmZfY29kZWNfYXN0X3RhZ3NbXTsKKworI2VuZGlmIC8qIEFWRk9STUFUX0FTVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXN0ZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXN0ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjMjA4ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hc3RkZWMuYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIEFTVCBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImFzdC5oIgorCitzdGF0aWMgaW50IGFzdF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoQVZfUkwzMihwLT5idWYpICE9IE1LVEFHKCdTJywnVCcsJ1InLCdNJykpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFBVl9SQjE2KHAtPmJ1ZiArIDEwKSB8fAorICAgICAgICAhQVZfUkIxNihwLT5idWYgKyAxMikgfHwgQVZfUkIxNihwLT5idWYgKyAxMikgPiAyNTYgfHwKKyAgICAgICAgIUFWX1JCMzIocC0+YnVmICsgMTYpIHx8IEFWX1JCMzIocC0+YnVmICsgMTYpID4gOCo0ODAwMCkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gODsKKworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDMgKiAyOworfQorCitzdGF0aWMgaW50IGFzdF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGRlcHRoOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZpb19za2lwKHMtPnBiLCA4KTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2FzdF90YWdzLCBhdmlvX3JiMTYocy0+cGIpKTsKKworICAgIGRlcHRoID0gYXZpb19yYjE2KHMtPnBiKTsKKyAgICBpZiAoZGVwdGggIT0gMTYpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJkZXB0aCAlZCIsIGRlcHRoKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IGF2aW9fcmIxNihzLT5wYik7CisgICAgaWYgKCFzdC0+Y29kZWMtPmNoYW5uZWxzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID09IDIpCisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPT0gNCkKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF80UE9JTlQwOworCisgICAgYXZpb19za2lwKHMtPnBiLCAyKTsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBpZiAoc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA8PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBzdC0+c3RhcnRfdGltZSAgICAgICAgID0gMDsKKyAgICBzdC0+ZHVyYXRpb24gICAgICAgICAgID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBhdmlvX3NraXAocy0+cGIsIDQwKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3RfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIHVpbnQzMl90IHR5cGUsIHNpemU7CisgICAgaW50NjRfdCBwb3M7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBwb3MgID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICB0eXBlID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBzaXplID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBpZiAoc2l6ZSA+IElOVF9NQVggLyBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y2hhbm5lbHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc2l6ZSAqPSBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgaWYgKChyZXQgPSBhdmlvX3NraXAocy0+cGIsIDI0KSkgPCAwKSAvLyBwYWRkaW5nCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAodHlwZSA9PSBNS1RBRygnQicsJ0wnLCdDJywnSycpKSB7CisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICAgICAgcGt0LT5wb3MgPSBwb3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVua25vd24gY2h1bmsgJXhcbiIsIHR5cGUpOworICAgICAgICBhdmlvX3NraXAocy0+cGIsIHNpemUpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYXN0X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFzdCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTVCAoQXVkaW8gU3RyZWFtKSIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGFzdF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhc3RfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gYXN0X3JlYWRfcGFja2V0LAorICAgIC5leHRlbnNpb25zICAgICA9ICJhc3QiLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCisgICAgLmNvZGVjX3RhZyAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXtmZl9jb2RlY19hc3RfdGFncywgMH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2FzdGVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2FzdGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmN2ExMmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXN0ZW5jLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBBU1QgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBKYW1lcyBBbG1lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhc3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKK3R5cGVkZWYgc3RydWN0IEFTVE11eENvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIGludDY0X3QgIHNpemU7CisgICAgaW50NjRfdCAgc2FtcGxlczsKKyAgICBpbnQ2NF90ICBsb29wc3RhcnQ7CisgICAgaW50NjRfdCAgbG9vcGVuZDsKKyAgICBpbnQgICAgICBmYnM7Cit9IEFTVE11eENvbnRleHQ7CisKKyNkZWZpbmUgQ0hFQ0tfTE9PUCh0eXBlKSBcCisgICAgaWYgKGFzdC0+bG9vcCAjIyB0eXBlID4gMCkgeyBcCisgICAgICAgIGFzdC0+bG9vcCAjIyB0eXBlID0gYXZfcmVzY2FsZV9ybmQoYXN0LT5sb29wICMjIHR5cGUsIGVuYy0+c2FtcGxlX3JhdGUsIDEwMDAsIEFWX1JPVU5EX0RPV04pOyBcCisgICAgICAgIGlmIChhc3QtPmxvb3AgIyMgdHlwZSA8IDAgfHwgYXN0LT5sb29wICMjIHR5cGUgPiBVSU5UX01BWCkgeyBcCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBsb29wIiAjdHlwZSAiIHZhbHVlXG4iKTsgXAorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsgIFwKKyAgICAgICAgfSBcCisgICAgfQorCitzdGF0aWMgaW50IGFzdF93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFTVE11eENvbnRleHQgKmFzdCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jOworICAgIHVuc2lnbmVkIGludCBjb2RlY190YWc7CisKKyAgICBpZiAocy0+bmJfc3RyZWFtcyA9PSAxKSB7CisgICAgICAgIGVuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJvbmx5IG9uZSBzdHJlYW0gaXMgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9BRkMpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm11eGluZyBBRFBDTSBBRkMgaXMgbm90IGltcGxlbWVudGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGNvZGVjX3RhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfYXN0X3RhZ3MsIGVuYy0+Y29kZWNfaWQpOworICAgIGlmICghY29kZWNfdGFnKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBjb2RlY1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGFzdC0+bG9vcGVuZCA+IDAgJiYgYXN0LT5sb29wc3RhcnQgPj0gYXN0LT5sb29wZW5kKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJsb29wZW5kIGNhbid0IGJlIGxlc3Mgb3IgZXF1YWwgdG8gbG9vcHN0YXJ0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvKiBDb252ZXJ0IG1pbGxpc2Vjb25kcyB0byBzYW1wbGVzICovCisgICAgQ0hFQ0tfTE9PUChzdGFydCkKKyAgICBDSEVDS19MT09QKGVuZCkKKworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIlNUUk0iKTsKKworICAgIGFzdC0+c2l6ZSA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogRmlsZSBzaXplIG1pbnVzIGhlYWRlciAqLworICAgIGF2aW9fd2IxNihwYiwgY29kZWNfdGFnKTsKKyAgICBhdmlvX3diMTYocGIsIDE2KTsgLyogQml0IGRlcHRoICovCisgICAgYXZpb193YjE2KHBiLCBlbmMtPmNoYW5uZWxzKTsKKyAgICBhdmlvX3diMTYocGIsIDApOyAvKiBMb29wIGZsYWcgKi8KKyAgICBhdmlvX3diMzIocGIsIGVuYy0+c2FtcGxlX3JhdGUpOworCisgICAgYXN0LT5zYW1wbGVzID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIExvb3BzdGFydCAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIExvb3BlbmQgKi8KKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBTaXplIG9mIGZpcnN0IGJsb2NrICovCisKKyAgICAvKiBVbmtub3duICovCisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBhdmlvX3dsMzIocGIsIDB4N0YpOworICAgIGF2aW9fd2I2NChwYiwgMCk7CisgICAgYXZpb193YjY0KHBiLCAwKTsKKyAgICBhdmlvX3diMzIocGIsIDApOworCisgICAgYXZpb19mbHVzaChwYik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3Rfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBU1RNdXhDb250ZXh0ICphc3QgPSBzLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIGludCBzaXplID0gcGt0LT5zaXplIC8gZW5jLT5jaGFubmVsczsKKworICAgIGlmIChzLT5zdHJlYW1zWzBdLT5uYl9mcmFtZXMgPT0gMCkKKyAgICAgICAgYXN0LT5mYnMgPSBzaXplOworCisgICAgZmZpb193Zm91cmNjKHBiLCAiQkxDSyIpOworICAgIGF2aW9fd2IzMihwYiwgc2l6ZSk7IC8qIEJsb2NrIHNpemUgKi8KKworICAgIC8qIHBhZGRpbmcgKi8KKyAgICBhdmlvX3diNjQocGIsIDApOworICAgIGF2aW9fd2I2NChwYiwgMCk7CisgICAgYXZpb193YjY0KHBiLCAwKTsKKworICAgIGF2aW9fd3JpdGUocGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzdF93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBU1RNdXhDb250ZXh0ICphc3QgPSBzLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIGludDY0X3QgZmlsZV9zaXplID0gYXZpb190ZWxsKHBiKTsKKyAgICBpbnQ2NF90IHNhbXBsZXMgPSAoZmlsZV9zaXplIC0gNjQgLSAoMzIgKiBzLT5zdHJlYW1zWzBdLT5uYl9mcmFtZXMpKSAvIGVuYy0+YmxvY2tfYWxpZ247IC8qIFBDTV9TMTZCRV9QTEFOQVIgKi8KKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJ0b3RhbCBzYW1wbGVzOiAlIlBSSWQ2NCJcbiIsIHNhbXBsZXMpOworCisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSkgeworICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworICAgICAgICBhdmlvX3NlZWsocGIsIGFzdC0+c2FtcGxlcywgU0VFS19TRVQpOworICAgICAgICBhdmlvX3diMzIocGIsIHNhbXBsZXMpOworCisgICAgICAgIC8qIExvb3BzdGFydCBpZiBwcm92aWRlZCAqLworICAgICAgICBpZiAoYXN0LT5sb29wc3RhcnQgPiAwKSB7CisgICAgICAgIGlmIChhc3QtPmxvb3BzdGFydCA+PSBzYW1wbGVzKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJMb29wc3RhcnQgdmFsdWUgaXMgb3V0IG9mIHJhbmdlIGFuZCB3aWxsIGJlIGlnbm9yZWRcbiIpOworICAgICAgICAgICAgYXN0LT5sb29wc3RhcnQgPSAtMTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICBhdmlvX3diMzIocGIsIGFzdC0+bG9vcHN0YXJ0KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDQpOworCisgICAgICAgIC8qIExvb3BlbmQgaWYgcHJvdmlkZWQuIE90aGVyd2lzZSBudW1iZXIgb2Ygc2FtcGxlcyBhZ2FpbiAqLworICAgICAgICBpZiAoYXN0LT5sb29wZW5kICYmIGFzdC0+bG9vcHN0YXJ0ID49IDApIHsKKyAgICAgICAgICAgIGlmIChhc3QtPmxvb3BlbmQgPiBzYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiTG9vcGVuZCB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UgYW5kIHdpbGwgYmUgaWdub3JlZFxuIik7CisgICAgICAgICAgICAgICAgYXN0LT5sb29wZW5kID0gc2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgYXN0LT5sb29wZW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgc2FtcGxlcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTaXplIG9mIGZpcnN0IGJsb2NrICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgYXN0LT5mYnMpOworCisgICAgICAgIC8qIEZpbGUgc2l6ZSBtaW51cyBoZWFkZXIgKi8KKyAgICAgICAgYXZpb19zZWVrKHBiLCBhc3QtPnNpemUsIFNFRUtfU0VUKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBmaWxlX3NpemUgLSA2NCk7CisKKyAgICAgICAgLyogTG9vcCBmbGFnICovCisgICAgICAgIGlmIChhc3QtPmxvb3BzdGFydCA+PSAwKSB7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDYpOworICAgICAgICAgICAgYXZpb193YjE2KHBiLCAweEZGRkYpOworICAgICAgICB9CisKKyAgICAgICAgYXZpb19zZWVrKHBiLCBmaWxlX3NpemUsIFNFRUtfU0VUKTsKKyAgICAgICAgYXZpb19mbHVzaChwYik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVChvYmopIG9mZnNldG9mKEFTVE11eENvbnRleHQsIG9iaikKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgIHsgImxvb3BzdGFydCIsICJMb29wc3RhcnQgcG9zaXRpb24gaW4gbWlsbGlzZWNvbmRzLiIsIE9GRlNFVChsb29wc3RhcnQpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgeyAuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgIHsgImxvb3BlbmQiLCAgICJMb29wZW5kIHBvc2l0aW9uIGluIG1pbGxpc2Vjb25kcy4iLCAgIE9GRlNFVChsb29wZW5kKSwgICBBVl9PUFRfVFlQRV9JTlQ2NCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGFzdF9tdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJBU1QgbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfYXN0X211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJhc3QiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBU1QgKEF1ZGlvIFN0cmVhbSkiKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAiYXN0IiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoQVNUTXV4Q29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkJFX1BMQU5BUiwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGFzdF93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gYXN0X3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBhc3Rfd3JpdGVfdHJhaWxlciwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmYXN0X211eGVyX2NsYXNzLAorICAgIC5jb2RlY190YWcgICAgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7ZmZfY29kZWNfYXN0X3RhZ3MsIDB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hdS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3MDJiYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hdS5jCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQVUgbXV4ZXIgYW5kIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBmaXJzdCB2ZXJzaW9uIGJ5IEZyYW5jb2lzIFJldm9sIDxyZXZvbEBmcmVlLmZyPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogUmVmZXJlbmNlIGRvY3VtZW50czoKKyAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9wdWJsaWMvcHVicy9leHRlcm5hbC9hdWZvcm1hdC5odG1sCisgKiBodHRwOi8vd3d3LmdvaWNlLmNvLmpwL21lbWJlci9tby9mb3JtYXRzL2F1Lmh0bWwKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwY20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworLyogaWYgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBpbiBhZHZhbmNlICovCisjZGVmaW5lIEFVX1VOS05PV05fU0laRSAoKHVpbnQzMl90KSh+MCkpCisvKiB0aGUgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBhbiBhbm5vdGF0aW9uIGZpZWxkIG9mIGF0IGxlYXN0IGVpZ2h0IGJ5dGVzICovCisjZGVmaW5lIEFVX0hFQURFUl9TSVpFICgyNCs4KQorCitzdGF0aWMgY29uc3QgQVZDb2RlY1RhZyBjb2RlY19hdV90YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9QQ01fTVVMQVcsICAxIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzgsICAgICAyIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2QkUsICAzIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzI0QkUsICA0IH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzMyQkUsICA1IH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjMyQkUsICA2IH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjY0QkUsICA3IH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2TEUsIDIzIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9HNzIyLDI0IH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2TEUsIDI1IH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2TEUsIDI2IH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fQUxBVywgIDI3IH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2TEUsIE1LQkVUQUcoJzcnLCcyJywnNicsJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgICAgMCB9LAorfTsKKworI2lmIENPTkZJR19BVV9ERU1VWEVSCisKK3N0YXRpYyBpbnQgYXVfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKHAtPmJ1ZlswXSA9PSAnLicgJiYgcC0+YnVmWzFdID09ICdzJyAmJgorICAgICAgICBwLT5idWZbMl0gPT0gJ24nICYmIHAtPmJ1ZlszXSA9PSAnZCcpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEJMT0NLX1NJWkUgMTAyNAorCitzdGF0aWMgaW50IGF1X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgc2l6ZSwgZGF0YV9zaXplID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdGFnOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVuc2lnbmVkIGludCBpZCwgY2hhbm5lbHMsIHJhdGU7CisgICAgaW50IGJwczsKKyAgICBlbnVtIEFWQ29kZWNJRCBjb2RlYzsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICB0YWcgPSBhdmlvX3JsMzIocGIpOworICAgIGlmICh0YWcgIT0gTUtUQUcoJy4nLCAncycsICduJywgJ2QnKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgc2l6ZSA9IGF2aW9fcmIzMihwYik7IC8qIGhlYWRlciBzaXplICovCisgICAgZGF0YV9zaXplID0gYXZpb19yYjMyKHBiKTsgLyogZGF0YSBzaXplIGluIGJ5dGVzICovCisKKyAgICBpZiAoZGF0YV9zaXplIDwgMCAmJiBkYXRhX3NpemUgIT0gQVVfVU5LTk9XTl9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG5lZ2F0aXZlIGRhdGEgc2l6ZSAnJWQnIGZvdW5kXG4iLCBkYXRhX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZCAgICAgICA9IGF2aW9fcmIzMihwYik7CisgICAgcmF0ZSAgICAgPSBhdmlvX3JiMzIocGIpOworICAgIGNoYW5uZWxzID0gYXZpb19yYjMyKHBiKTsKKworICAgIGlmIChzaXplID4gMjQpIHsKKyAgICAgICAgLyogc2tpcCB1bnVzZWQgZGF0YSAqLworICAgICAgICBhdmlvX3NraXAocGIsIHNpemUgLSAyNCk7CisgICAgfQorCisgICAgY29kZWMgPSBmZl9jb2RlY19nZXRfaWQoY29kZWNfYXVfdGFncywgaWQpOworCisgICAgaWYgKGNvZGVjID09IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJ1bmtub3duIG9yIHVuc3VwcG9ydGVkIGNvZGVjIHRhZzogJXUiLCBpZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBicHMgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGNvZGVjKTsKKyAgICBpZiAoY29kZWMgPT0gQVZfQ09ERUNfSURfQURQQ01fRzcyNkxFKSB7CisgICAgICAgIGlmIChpZCA9PSBNS0JFVEFHKCc3JywnMicsJzYnLCcyJykpIHsKKyAgICAgICAgICAgIGJwcyA9IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90IGJwY3NzW10gPSB7NCwgMCwgMywgNX07CisgICAgICAgICAgICBhdl9hc3NlcnQwKGlkID49IDIzICYmIGlkIDwgMjMgKyA0KTsKKyAgICAgICAgICAgIGJwcyA9IGJwY3NzW2lkIC0gMjNdOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghYnBzKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiVW5rbm93biBiaXRzIHBlciBzYW1wbGUiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGlmIChjaGFubmVscyA9PSAwIHx8IGNoYW5uZWxzID49IElOVF9NQVggLyAoQkxPQ0tfU0laRSAqIGJwcyA+PiAzKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMgJXVcbiIsIGNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHJhdGUgPT0gMCB8fCByYXRlID4gSU5UX01BWCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1wbGUgcmF0ZTogJXVcbiIsIHJhdGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgPSBpZDsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gY29kZWM7CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IGNoYW5uZWxzOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSByYXRlOworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYnBzOworICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICAgPSBjaGFubmVscyAqIHJhdGUgKiBicHM7CisgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IEZGTUFYKGJwcyAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMgLyA4LCAxKTsKKyAgICBpZiAoZGF0YV9zaXplICE9IEFVX1VOS05PV05fU0laRSkKKyAgICBzdC0+ZHVyYXRpb24gPSAoKChpbnQ2NF90KWRhdGFfc2l6ZSk8PDMpIC8gKHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiAoaW50NjRfdClicHMpOworCisgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCByYXRlKTsKKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2F1X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgID0gImF1IiwKKyAgICAubG9uZ19uYW1lICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3VuIEFVIiksCisgICAgLnJlYWRfcHJvYmUgID0gYXVfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyID0gYXVfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ID0gZmZfcGNtX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICA9IGZmX3BjbV9yZWFkX3NlZWssCisgICAgLmNvZGVjX3RhZyAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKSB7IGNvZGVjX2F1X3RhZ3MsIDAgfSwKK307CisKKyNlbmRpZiAvKiBDT05GSUdfQVVfREVNVVhFUiAqLworCisjaWYgQ09ORklHX0FVX01VWEVSCisKKyNpbmNsdWRlICJyYXdlbmMuaCIKKworc3RhdGljIGludCBhdV93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKworICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm9ubHkgb25lIHN0cmVhbSBpcyBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGVuYy0+Y29kZWNfdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhjb2RlY19hdV90YWdzLCBlbmMtPmNvZGVjX2lkKTsKKyAgICBpZiAoIWVuYy0+Y29kZWNfdGFnKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBjb2RlY1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZmZpb193Zm91cmNjKHBiLCAiLnNuZCIpOyAgICAgICAgICAgICAgICAgICAvKiBtYWdpYyBudW1iZXIgKi8KKyAgICBhdmlvX3diMzIocGIsIEFVX0hFQURFUl9TSVpFKTsgICAgICAgICAgICAgIC8qIGhlYWRlciBzaXplICovCisgICAgYXZpb193YjMyKHBiLCBBVV9VTktOT1dOX1NJWkUpOyAgICAgICAgICAgICAvKiBkYXRhIHNpemUgKi8KKyAgICBhdmlvX3diMzIocGIsIGVuYy0+Y29kZWNfdGFnKTsgICAgICAgICAgICAgIC8qIGNvZGVjIElEICovCisgICAgYXZpb193YjMyKHBiLCBlbmMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdmlvX3diMzIocGIsIGVuYy0+Y2hhbm5lbHMpOworICAgIGF2aW9fd2I2NChwYiwgMCk7IC8qIGFubm90YXRpb24gZmllbGQgKi8KKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1X3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludDY0X3QgZmlsZV9zaXplID0gYXZpb190ZWxsKHBiKTsKKworICAgIGlmIChzLT5wYi0+c2Vla2FibGUgJiYgZmlsZV9zaXplIDwgSU5UMzJfTUFYKSB7CisgICAgICAgIC8qIHVwZGF0ZSBmaWxlIHNpemUgKi8KKyAgICAgICAgYXZpb19zZWVrKHBiLCA4LCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgKHVpbnQzMl90KShmaWxlX3NpemUgLSBBVV9IRUFERVJfU0laRSkpOworICAgICAgICBhdmlvX3NlZWsocGIsIGZpbGVfc2l6ZSwgU0VFS19TRVQpOworICAgICAgICBhdmlvX2ZsdXNoKHBiKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfYXVfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYXUiLAorICAgIC5sb25nX25hbWUgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlN1biBBVSIpLAorICAgIC5taW1lX3R5cGUgICAgID0gImF1ZGlvL2Jhc2ljIiwKKyAgICAuZXh0ZW5zaW9ucyAgICA9ICJhdSIsCisgICAgLmF1ZGlvX2NvZGVjICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2QkUsCisgICAgLnZpZGVvX2NvZGVjICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC53cml0ZV9oZWFkZXIgID0gYXVfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciA9IGF1X3dyaXRlX3RyYWlsZXIsCisgICAgLmNvZGVjX3RhZyAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyogY29uc3QgW10pIHsgY29kZWNfYXVfdGFncywgMCB9LAorICAgIC5mbGFncyAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19BVV9NVVhFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2F1ZGlvaW50ZXJsZWF2ZS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F1ZGlvaW50ZXJsZWF2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NDAxMGYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXVkaW9pbnRlcmxlYXZlLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBBdWRpbyBJbnRlcmxlYXZpbmcgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEJhcHRpc3RlIENvdWR1cmllciA8YmFwdGlzdGUgZG90IGNvdWR1cmllciBhdCBnbWFpbCBkb3QgY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpZm8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF1ZGlvaW50ZXJsZWF2ZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3ZvaWQgZmZfYXVkaW9faW50ZXJsZWF2ZV9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBBdWRpb0ludGVybGVhdmVDb250ZXh0ICphaWMgPSBzdC0+cHJpdl9kYXRhOworCisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICAgICAgYXZfZmlmb19mcmVlcCgmYWljLT5maWZvKTsKKyAgICB9Cit9CisKK2ludCBmZl9hdWRpb19pbnRlcmxlYXZlX2luaXQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKnNhbXBsZXNfcGVyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmICghc2FtcGxlc19wZXJfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoIXRpbWVfYmFzZS5udW0pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInRpbWViYXNlIG5vdCBzZXQgZm9yIGF1ZGlvIGludGVybGVhdmVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIEF1ZGlvSW50ZXJsZWF2ZUNvbnRleHQgKmFpYyA9IHN0LT5wcml2X2RhdGE7CisKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGFpYy0+c2FtcGxlX3NpemUgPSAoc3QtPmNvZGVjLT5jaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCkpIC8gODsKKyAgICAgICAgICAgIGlmICghYWljLT5zYW1wbGVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgY29tcHV0ZSBzYW1wbGUgc2l6ZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFpYy0+c2FtcGxlc19wZXJfZnJhbWUgPSBzYW1wbGVzX3Blcl9mcmFtZTsKKyAgICAgICAgICAgIGFpYy0+c2FtcGxlcyA9IGFpYy0+c2FtcGxlc19wZXJfZnJhbWU7CisgICAgICAgICAgICBhaWMtPnRpbWVfYmFzZSA9IHRpbWVfYmFzZTsKKworICAgICAgICAgICAgYWljLT5maWZvX3NpemUgPSAxMDAqICphaWMtPnNhbXBsZXM7CisgICAgICAgICAgICBpZiAoIShhaWMtPmZpZm89IGF2X2ZpZm9fYWxsb2NfYXJyYXkoMTAwLCAqYWljLT5zYW1wbGVzKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVybGVhdmVfbmV3X2F1ZGlvX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX2luZGV4LCBpbnQgZmx1c2gpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgIEF1ZGlvSW50ZXJsZWF2ZUNvbnRleHQgKmFpYyA9IHN0LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKyAgICBpbnQgc2l6ZSA9IEZGTUlOKGF2X2ZpZm9fc2l6ZShhaWMtPmZpZm8pLCAqYWljLT5zYW1wbGVzICogYWljLT5zYW1wbGVfc2l6ZSk7CisgICAgaWYgKCFzaXplIHx8ICghZmx1c2ggJiYgc2l6ZSA9PSBhdl9maWZvX3NpemUoYWljLT5maWZvKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIHNpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKGFpYy0+ZmlmbywgcGt0LT5kYXRhLCBzaXplLCBOVUxMKTsKKworICAgIHBrdC0+ZHRzID0gcGt0LT5wdHMgPSBhaWMtPmR0czsKKyAgICBwa3QtPmR1cmF0aW9uID0gYXZfcmVzY2FsZV9xKCphaWMtPnNhbXBsZXMsIHN0LT50aW1lX2Jhc2UsIGFpYy0+dGltZV9iYXNlKTsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0cmVhbV9pbmRleDsKKyAgICBhaWMtPmR0cyArPSBwa3QtPmR1cmF0aW9uOworCisgICAgYWljLT5zYW1wbGVzKys7CisgICAgaWYgKCEqYWljLT5zYW1wbGVzKQorICAgICAgICBhaWMtPnNhbXBsZXMgPSBhaWMtPnNhbXBsZXNfcGVyX2ZyYW1lOworCisgICAgcmV0dXJuIHNpemU7Cit9CisKK2ludCBmZl9hdWRpb19yZWNodW5rX2ludGVybGVhdmUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqb3V0LCBBVlBhY2tldCAqcGt0LCBpbnQgZmx1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpnZXRfcGFja2V0KShBVkZvcm1hdENvbnRleHQgKiwgQVZQYWNrZXQgKiwgQVZQYWNrZXQgKiwgaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNvbXBhcmVfdHMpKEFWRm9ybWF0Q29udGV4dCAqLCBBVlBhY2tldCAqLCBBVlBhY2tldCAqKSkKK3sKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKHBrdCkgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICAgICAgQXVkaW9JbnRlcmxlYXZlQ29udGV4dCAqYWljID0gc3QtPnByaXZfZGF0YTsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG5ld19zaXplID0gYXZfZmlmb19zaXplKGFpYy0+ZmlmbykgKyBwa3QtPnNpemU7CisgICAgICAgICAgICBpZiAobmV3X3NpemUgPiBhaWMtPmZpZm9fc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChhdl9maWZvX3JlYWxsb2MyKGFpYy0+ZmlmbywgbmV3X3NpemUpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBhaWMtPmZpZm9fc2l6ZSA9IG5ld19zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGFpYy0+ZmlmbywgcGt0LT5kYXRhLCBwa3QtPnNpemUsIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmV3cml0ZSBwdHMgYW5kIGR0cyB0byBiZSBkZWNvZGVkIHRpbWUgbGluZSBwb3NpdGlvbgorICAgICAgICAgICAgcGt0LT5wdHMgPSBwa3QtPmR0cyA9IGFpYy0+ZHRzOworICAgICAgICAgICAgYWljLT5kdHMgKz0gcGt0LT5kdXJhdGlvbjsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfaW50ZXJsZWF2ZV9hZGRfcGFja2V0KHMsIHBrdCwgY29tcGFyZV90cykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHBrdCA9IE5VTEw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgQVZQYWNrZXQgbmV3X3BrdDsKKyAgICAgICAgICAgIHdoaWxlICgocmV0ID0gaW50ZXJsZWF2ZV9uZXdfYXVkaW9fcGFja2V0KHMsICZuZXdfcGt0LCBpLCBmbHVzaCkpID4gMCkgeworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmZfaW50ZXJsZWF2ZV9hZGRfcGFja2V0KHMsICZuZXdfcGt0LCBjb21wYXJlX3RzKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBnZXRfcGFja2V0KHMsIG91dCwgTlVMTCwgZmx1c2gpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2F1ZGlvaW50ZXJsZWF2ZS5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F1ZGlvaW50ZXJsZWF2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzc4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXVkaW9pbnRlcmxlYXZlLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIGF1ZGlvIGludGVybGVhdmluZyBwcm90b3R5cGVzIGFuZCBkZWNsYXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZSBkb3QgY291ZHVyaWVyIGF0IGdtYWlsIGRvdCBjb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfQVVESU9JTlRFUkxFQVZFX0gKKyNkZWZpbmUgQVZGT1JNQVRfQVVESU9JTlRFUkxFQVZFX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9maWZvLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQXVkaW9JbnRlcmxlYXZlQ29udGV4dCB7CisgICAgQVZGaWZvQnVmZmVyICpmaWZvOworICAgIHVuc2lnbmVkIGZpZm9fc2l6ZTsgICAgICAgICAgIC8vLzwgc2l6ZSBvZiBjdXJyZW50bHkgYWxsb2NhdGVkIEZJRk8KKyAgICB1aW50NjRfdCBkdHM7ICAgICAgICAgICAgICAgICAvLy88IGN1cnJlbnQgZHRzCisgICAgaW50IHNhbXBsZV9zaXplOyAgICAgICAgICAgICAgLy8vPCBzaXplIG9mIG9uZSBzYW1wbGUgYWxsIGNoYW5uZWxzIGluY2x1ZGVkCisgICAgY29uc3QgaW50ICpzYW1wbGVzX3Blcl9mcmFtZTsgLy8vPCBtdXN0IGJlIDAtdGVybWluYXRlZAorICAgIGNvbnN0IGludCAqc2FtcGxlczsgICAgICAgICAgIC8vLzwgY3VycmVudCBzYW1wbGVzIHBlciBmcmFtZSwgcG9pbnRlciB0byBzYW1wbGVzX3Blcl9mcmFtZQorICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlOyAgICAgICAgIC8vLzwgdGltZSBiYXNlIG9mIG91dHB1dCBhdWRpbyBwYWNrZXRzCit9IEF1ZGlvSW50ZXJsZWF2ZUNvbnRleHQ7CisKK2ludCBmZl9hdWRpb19pbnRlcmxlYXZlX2luaXQoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBpbnQgKnNhbXBsZXNfcGVyX2ZyYW1lLCBBVlJhdGlvbmFsIHRpbWVfYmFzZSk7Cit2b2lkIGZmX2F1ZGlvX2ludGVybGVhdmVfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKTsKKworLyoqCisgKiBSZWNodW5rIGF1ZGlvIFBDTSBwYWNrZXRzIHBlciBBdWRpb0ludGVybGVhdmVDb250ZXh0LT5zYW1wbGVzX3Blcl9mcmFtZQorICogYW5kIGludGVybGVhdmUgdGhlbSBjb3JyZWN0bHkuCisgKiBUaGUgZmlyc3QgZWxlbWVudCBvZiBBVlN0cmVhbS0+cHJpdl9kYXRhIG11c3QgYmUgQXVkaW9JbnRlcmxlYXZlQ29udGV4dAorICogd2hlbiB1c2luZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBnZXRfcGFja2V0IGZ1bmN0aW9uIHdpbGwgb3V0cHV0IGEgcGFja2V0IHdoZW4gc3RyZWFtcyBhcmUgY29ycmVjdGx5IGludGVybGVhdmVkLgorICogQHBhcmFtIGNvbXBhcmVfdHMgZnVuY3Rpb24gd2lsbCBjb21wYXJlIEFWUGFja2V0cyBhbmQgZGVjaWRlIGludGVybGVhdmluZyBvcmRlci4KKyAqLworaW50IGZmX2F1ZGlvX3JlY2h1bmtfaW50ZXJsZWF2ZShBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpvdXQsIEFWUGFja2V0ICpwa3QsIGludCBmbHVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmdldF9wYWNrZXQpKEFWRm9ybWF0Q29udGV4dCAqLCBBVlBhY2tldCAqLCBBVlBhY2tldCAqLCBpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY29tcGFyZV90cykoQVZGb3JtYXRDb250ZXh0ICosIEFWUGFja2V0ICosIEFWUGFja2V0ICopKTsKKworI2VuZGlmIC8qIEFWRk9STUFUX0FVRElPSU5URVJMRUFWRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXZjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyN2I0NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmMuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIEFWQyBoZWxwZXIgZnVuY3Rpb25zIGZvciBtdXhlcnMKKyAqIENvcHlyaWdodCAoYykgMjAwNiBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlLmNvdWR1cmllckBzbWFydGpvZy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvLmgiCisjaW5jbHVkZSAiYXZjLmgiCisKK3N0YXRpYyBjb25zdCB1aW50OF90ICpmZl9hdmNfZmluZF9zdGFydGNvZGVfaW50ZXJuYWwoY29uc3QgdWludDhfdCAqcCwgY29uc3QgdWludDhfdCAqZW5kKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmEgPSBwICsgNCAtICgoaW50cHRyX3QpcCAmIDMpOworCisgICAgZm9yIChlbmQgLT0gMzsgcCA8IGEgJiYgcCA8IGVuZDsgcCsrKSB7CisgICAgICAgIGlmIChwWzBdID09IDAgJiYgcFsxXSA9PSAwICYmIHBbMl0gPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIGZvciAoZW5kIC09IDM7IHAgPCBlbmQ7IHAgKz0gNCkgeworICAgICAgICB1aW50MzJfdCB4ID0gKihjb25zdCB1aW50MzJfdCopcDsKKy8vICAgICAgaWYgKCh4IC0gMHgwMTAwMDEwMCkgJiAofngpICYgMHg4MDAwODAwMCkgLy8gbGl0dGxlIGVuZGlhbgorLy8gICAgICBpZiAoKHggLSAweDAwMDEwMDAxKSAmICh+eCkgJiAweDAwODAwMDgwKSAvLyBiaWcgZW5kaWFuCisgICAgICAgIGlmICgoeCAtIDB4MDEwMTAxMDEpICYgKH54KSAmIDB4ODA4MDgwODApIHsgLy8gZ2VuZXJpYworICAgICAgICAgICAgaWYgKHBbMV0gPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwWzBdID09IDAgJiYgcFsyXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgICAgICBpZiAocFsyXSA9PSAwICYmIHBbM10gPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHArMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwWzNdID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocFsyXSA9PSAwICYmIHBbNF0gPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHArMjsKKyAgICAgICAgICAgICAgICBpZiAocFs0XSA9PSAwICYmIHBbNV0gPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHArMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoZW5kICs9IDM7IHAgPCBlbmQ7IHArKykgeworICAgICAgICBpZiAocFswXSA9PSAwICYmIHBbMV0gPT0gMCAmJiBwWzJdID09IDEpCisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICByZXR1cm4gZW5kICsgMzsKK30KKworY29uc3QgdWludDhfdCAqZmZfYXZjX2ZpbmRfc3RhcnRjb2RlKGNvbnN0IHVpbnQ4X3QgKnAsIGNvbnN0IHVpbnQ4X3QgKmVuZCl7CisgICAgY29uc3QgdWludDhfdCAqb3V0PSBmZl9hdmNfZmluZF9zdGFydGNvZGVfaW50ZXJuYWwocCwgZW5kKTsKKyAgICBpZihwPG91dCAmJiBvdXQ8ZW5kICYmICFvdXRbLTFdKSBvdXQtLTsKKyAgICByZXR1cm4gb3V0OworfQorCitpbnQgZmZfYXZjX3BhcnNlX25hbF91bml0cyhBVklPQ29udGV4dCAqcGIsIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9pbiwgaW50IHNpemUpCit7CisgICAgY29uc3QgdWludDhfdCAqcCA9IGJ1Zl9pbjsKKyAgICBjb25zdCB1aW50OF90ICplbmQgPSBwICsgc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpuYWxfc3RhcnQsICpuYWxfZW5kOworCisgICAgc2l6ZSA9IDA7CisgICAgbmFsX3N0YXJ0ID0gZmZfYXZjX2ZpbmRfc3RhcnRjb2RlKHAsIGVuZCk7CisgICAgZm9yICg7OykgeworICAgICAgICB3aGlsZSAobmFsX3N0YXJ0IDwgZW5kICYmICEqKG5hbF9zdGFydCsrKSk7CisgICAgICAgIGlmIChuYWxfc3RhcnQgPT0gZW5kKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbmFsX2VuZCA9IGZmX2F2Y19maW5kX3N0YXJ0Y29kZShuYWxfc3RhcnQsIGVuZCk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgbmFsX2VuZCAtIG5hbF9zdGFydCk7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIG5hbF9zdGFydCwgbmFsX2VuZCAtIG5hbF9zdGFydCk7CisgICAgICAgIHNpemUgKz0gNCArIG5hbF9lbmQgLSBuYWxfc3RhcnQ7CisgICAgICAgIG5hbF9zdGFydCA9IG5hbF9lbmQ7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCitpbnQgZmZfYXZjX3BhcnNlX25hbF91bml0c19idWYoY29uc3QgdWludDhfdCAqYnVmX2luLCB1aW50OF90ICoqYnVmLCBpbnQgKnNpemUpCit7CisgICAgQVZJT0NvbnRleHQgKnBiOworICAgIGludCByZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmcGIpOworICAgIGlmKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZl9hdmNfcGFyc2VfbmFsX3VuaXRzKHBiLCBidWZfaW4sICpzaXplKTsKKworICAgIGF2X2ZyZWVwKGJ1Zik7CisgICAgKnNpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYocGIsIGJ1Zik7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9pc29tX3dyaXRlX2F2Y2MoQVZJT0NvbnRleHQgKnBiLCBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgbGVuKQoreworICAgIGlmIChsZW4gPiA2KSB7CisgICAgICAgIC8qIGNoZWNrIGZvciBoMjY0IHN0YXJ0IGNvZGUgKi8KKyAgICAgICAgaWYgKEFWX1JCMzIoZGF0YSkgPT0gMHgwMDAwMDAwMSB8fAorICAgICAgICAgICAgQVZfUkIyNChkYXRhKSA9PSAweDAwMDAwMSkgeworICAgICAgICAgICAgdWludDhfdCAqYnVmPU5VTEwsICplbmQsICpzdGFydDsKKyAgICAgICAgICAgIHVpbnQzMl90IHNwc19zaXplPTAsIHBwc19zaXplPTA7CisgICAgICAgICAgICB1aW50OF90ICpzcHM9MCwgKnBwcz0wOworCisgICAgICAgICAgICBpbnQgcmV0ID0gZmZfYXZjX3BhcnNlX25hbF91bml0c19idWYoZGF0YSwgJmJ1ZiwgJmxlbik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgc3RhcnQgPSBidWY7CisgICAgICAgICAgICBlbmQgPSBidWYgKyBsZW47CisKKyAgICAgICAgICAgIC8qIGxvb2sgZm9yIHNwcyBhbmQgcHBzICovCisgICAgICAgICAgICB3aGlsZSAoZW5kIC0gYnVmID4gNCkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemU7CisgICAgICAgICAgICAgICAgdWludDhfdCBuYWxfdHlwZTsKKyAgICAgICAgICAgICAgICBzaXplID0gRkZNSU4oQVZfUkIzMihidWYpLCBlbmQgLSBidWYgLSA0KTsKKyAgICAgICAgICAgICAgICBidWYgKz0gNDsKKyAgICAgICAgICAgICAgICBuYWxfdHlwZSA9IGJ1ZlswXSAmIDB4MWY7CisKKyAgICAgICAgICAgICAgICBpZiAobmFsX3R5cGUgPT0gNykgeyAvKiBTUFMgKi8KKyAgICAgICAgICAgICAgICAgICAgc3BzID0gYnVmOworICAgICAgICAgICAgICAgICAgICBzcHNfc2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYWxfdHlwZSA9PSA4KSB7IC8qIFBQUyAqLworICAgICAgICAgICAgICAgICAgICBwcHMgPSBidWY7CisgICAgICAgICAgICAgICAgICAgIHBwc19zaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBidWYgKz0gc2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzcHMgfHwgIXBwcyB8fCBzcHNfc2l6ZSA8IDQgfHwgc3BzX3NpemUgPiBVSU5UMTZfTUFYIHx8IHBwc19zaXplID4gVUlOVDE2X01BWCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgYXZpb193OChwYiwgMSk7IC8qIHZlcnNpb24gKi8KKyAgICAgICAgICAgIGF2aW9fdzgocGIsIHNwc1sxXSk7IC8qIHByb2ZpbGUgKi8KKyAgICAgICAgICAgIGF2aW9fdzgocGIsIHNwc1syXSk7IC8qIHByb2ZpbGUgY29tcGF0ICovCisgICAgICAgICAgICBhdmlvX3c4KHBiLCBzcHNbM10pOyAvKiBsZXZlbCAqLworICAgICAgICAgICAgYXZpb193OChwYiwgMHhmZik7IC8qIDYgYml0cyByZXNlcnZlZCAoMTExMTExKSArIDIgYml0cyBuYWwgc2l6ZSBsZW5ndGggLSAxICgxMSkgKi8KKyAgICAgICAgICAgIGF2aW9fdzgocGIsIDB4ZTEpOyAvKiAzIGJpdHMgcmVzZXJ2ZWQgKDExMSkgKyA1IGJpdHMgbnVtYmVyIG9mIHNwcyAoMDAwMDEpICovCisKKyAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgc3BzX3NpemUpOworICAgICAgICAgICAgYXZpb193cml0ZShwYiwgc3BzLCBzcHNfc2l6ZSk7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCAxKTsgLyogbnVtYmVyIG9mIHBwcyAqLworICAgICAgICAgICAgYXZpb193YjE2KHBiLCBwcHNfc2l6ZSk7CisgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBwcHMsIHBwc19zaXplKTsKKyAgICAgICAgICAgIGF2X2ZyZWUoc3RhcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZpb193cml0ZShwYiwgZGF0YSwgbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2F2Y193cml0ZV9hbm5leGJfZXh0cmFkYXRhKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICoqYnVmLCBpbnQgKnNpemUpCit7CisgICAgdWludDE2X3Qgc3BzX3NpemUsIHBwc19zaXplOworICAgIHVpbnQ4X3QgKm91dDsKKyAgICBpbnQgb3V0X3NpemU7CisKKyAgICAqYnVmID0gTlVMTDsKKyAgICBpZiAoKnNpemUgPj0gNCAmJiAoQVZfUkIzMihpbikgPT0gMHgwMDAwMDAwMSB8fCBBVl9SQjI0KGluKSA9PSAweDAwMDAwMSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICgqc2l6ZSA8IDExIHx8IGluWzBdICE9IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3BzX3NpemUgPSBBVl9SQjE2KCZpbls2XSk7CisgICAgaWYgKDExICsgc3BzX3NpemUgPiAqc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgcHBzX3NpemUgPSBBVl9SQjE2KCZpbls5ICsgc3BzX3NpemVdKTsKKyAgICBpZiAoMTEgKyBzcHNfc2l6ZSArIHBwc19zaXplID4gKnNpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIG91dF9zaXplID0gOCArIHNwc19zaXplICsgcHBzX3NpemU7CisgICAgb3V0ID0gYXZfbWFsbG9jeihvdXRfc2l6ZSk7CisgICAgaWYgKCFvdXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgQVZfV0IzMigmb3V0WzBdLCAweDAwMDAwMDAxKTsKKyAgICBtZW1jcHkob3V0ICsgNCwgJmluWzhdLCBzcHNfc2l6ZSk7CisgICAgQVZfV0IzMigmb3V0WzQgKyBzcHNfc2l6ZV0sIDB4MDAwMDAwMDEpOworICAgIG1lbWNweShvdXQgKyA4ICsgc3BzX3NpemUsICZpblsxMSArIHNwc19zaXplXSwgcHBzX3NpemUpOworICAgICpidWYgPSBvdXQ7CisgICAgKnNpemUgPSBvdXRfc2l6ZTsKKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgdWludDhfdCAqZmZfYXZjX21wNF9maW5kX3N0YXJ0Y29kZShjb25zdCB1aW50OF90ICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmFsX2xlbmd0aF9zaXplKQoreworICAgIHVuc2lnbmVkIGludCByZXMgPSAwOworCisgICAgaWYgKGVuZCAtIHN0YXJ0IDwgbmFsX2xlbmd0aF9zaXplKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aGlsZSAobmFsX2xlbmd0aF9zaXplLS0pCisgICAgICAgIHJlcyA9IChyZXMgPDwgOCkgfCAqc3RhcnQrKzsKKworICAgIGlmIChyZXMgPiBlbmQgLSBzdGFydCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gc3RhcnQgKyByZXM7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXZjLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvYXZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlODBmZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmMuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQVZDIGhlbHBlciBmdW5jdGlvbnMgZm9yIG11eGVycworICogQ29weXJpZ2h0IChjKSAyMDA4IEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9BVkNfSAorI2RlZmluZSBBVkZPUk1BVF9BVkNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiYXZpby5oIgorCitpbnQgZmZfYXZjX3BhcnNlX25hbF91bml0cyhBVklPQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSk7CitpbnQgZmZfYXZjX3BhcnNlX25hbF91bml0c19idWYoY29uc3QgdWludDhfdCAqYnVmX2luLCB1aW50OF90ICoqYnVmLCBpbnQgKnNpemUpOworaW50IGZmX2lzb21fd3JpdGVfYXZjYyhBVklPQ29udGV4dCAqcGIsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBsZW4pOworY29uc3QgdWludDhfdCAqZmZfYXZjX2ZpbmRfc3RhcnRjb2RlKGNvbnN0IHVpbnQ4X3QgKnAsIGNvbnN0IHVpbnQ4X3QgKmVuZCk7CitpbnQgZmZfYXZjX3dyaXRlX2FubmV4Yl9leHRyYWRhdGEoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKipidWYsIGludCAqc2l6ZSk7Citjb25zdCB1aW50OF90ICpmZl9hdmNfbXA0X2ZpbmRfc3RhcnRjb2RlKGNvbnN0IHVpbnQ4X3QgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYWxfbGVuZ3RoX3NpemUpOworCisjZW5kaWYgLyogQVZGT1JNQVRfQVZDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmZvcm1hdC5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1NGVkMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmZvcm1hdC5oCkBAIC0wLDAgKzEsMjY4NyBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9BVkZPUk1BVF9ICisjZGVmaW5lIEFWRk9STUFUX0FWRk9STUFUX0gKKworLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbGliYXZmCisgKiBNYWluIGxpYmF2Zm9ybWF0IHB1YmxpYyBBUEkgaGVhZGVyCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGliYXZmIEkvTyBhbmQgTXV4aW5nL0RlbXV4aW5nIExpYnJhcnkKKyAqIEB7CisgKgorICogTGliYXZmb3JtYXQgKGxhdmYpIGlzIGEgbGlicmFyeSBmb3IgZGVhbGluZyB3aXRoIHZhcmlvdXMgbWVkaWEgY29udGFpbmVyCisgKiBmb3JtYXRzLiBJdHMgbWFpbiB0d28gcHVycG9zZXMgYXJlIGRlbXV4aW5nIC0gaS5lLiBzcGxpdHRpbmcgYSBtZWRpYSBmaWxlCisgKiBpbnRvIGNvbXBvbmVudCBzdHJlYW1zLCBhbmQgdGhlIHJldmVyc2UgcHJvY2VzcyBvZiBtdXhpbmcgLSB3cml0aW5nIHN1cHBsaWVkCisgKiBkYXRhIGluIGEgc3BlY2lmaWVkIGNvbnRhaW5lciBmb3JtYXQuIEl0IGFsc28gaGFzIGFuIEByZWYgbGF2Zl9pbworICogIkkvTyBtb2R1bGUiIHdoaWNoIHN1cHBvcnRzIGEgbnVtYmVyIG9mIHByb3RvY29scyBmb3IgYWNjZXNzaW5nIHRoZSBkYXRhIChlLmcuCisgKiBmaWxlLCB0Y3AsIGh0dHAgYW5kIG90aGVycykuIEJlZm9yZSB1c2luZyBsYXZmLCB5b3UgbmVlZCB0byBjYWxsCisgKiBhdl9yZWdpc3Rlcl9hbGwoKSB0byByZWdpc3RlciBhbGwgY29tcGlsZWQgbXV4ZXJzLCBkZW11eGVycyBhbmQgcHJvdG9jb2xzLgorICogVW5sZXNzIHlvdSBhcmUgYWJzb2x1dGVseSBzdXJlIHlvdSB3b24ndCB1c2UgbGliYXZmb3JtYXQncyBuZXR3b3JrCisgKiBjYXBhYmlsaXRpZXMsIHlvdSBzaG91bGQgYWxzbyBjYWxsIGF2Zm9ybWF0X25ldHdvcmtfaW5pdCgpLgorICoKKyAqIEEgc3VwcG9ydGVkIGlucHV0IGZvcm1hdCBpcyBkZXNjcmliZWQgYnkgYW4gQVZJbnB1dEZvcm1hdCBzdHJ1Y3QsIGNvbnZlcnNlbHkKKyAqIGFuIG91dHB1dCBmb3JtYXQgaXMgZGVzY3JpYmVkIGJ5IEFWT3V0cHV0Rm9ybWF0LiBZb3UgY2FuIGl0ZXJhdGUgb3ZlciBhbGwKKyAqIHJlZ2lzdGVyZWQgaW5wdXQvb3V0cHV0IGZvcm1hdHMgdXNpbmcgdGhlIGF2X2lmb3JtYXRfbmV4dCgpIC8KKyAqIGF2X29mb3JtYXRfbmV4dCgpIGZ1bmN0aW9ucy4gVGhlIHByb3RvY29scyBsYXllciBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljCisgKiBBUEksIHNvIHlvdSBjYW4gb25seSBnZXQgdGhlIG5hbWVzIG9mIHN1cHBvcnRlZCBwcm90b2NvbHMgd2l0aCB0aGUKKyAqIGF2aW9fZW51bV9wcm90b2NvbHMoKSBmdW5jdGlvbi4KKyAqCisgKiBNYWluIGxhdmYgc3RydWN0dXJlIHVzZWQgZm9yIGJvdGggbXV4aW5nIGFuZCBkZW11eGluZyBpcyBBVkZvcm1hdENvbnRleHQsCisgKiB3aGljaCBleHBvcnRzIGFsbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSBiZWluZyByZWFkIG9yIHdyaXR0ZW4uIEFzIHdpdGgKKyAqIG1vc3QgTGliYXZmb3JtYXQgc3RydWN0dXJlcywgaXRzIHNpemUgaXMgbm90IHBhcnQgb2YgcHVibGljIEFCSSwgc28gaXQgY2Fubm90IGJlCisgKiBhbGxvY2F0ZWQgb24gc3RhY2sgb3IgZGlyZWN0bHkgd2l0aCBhdl9tYWxsb2MoKS4gVG8gY3JlYXRlIGFuCisgKiBBVkZvcm1hdENvbnRleHQsIHVzZSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCkgKHNvbWUgZnVuY3Rpb25zLCBsaWtlCisgKiBhdmZvcm1hdF9vcGVuX2lucHV0KCkgbWlnaHQgZG8gdGhhdCBmb3IgeW91KS4KKyAqCisgKiBNb3N0IGltcG9ydGFudGx5IGFuIEFWRm9ybWF0Q29udGV4dCBjb250YWluczoKKyAqIEBsaSB0aGUgQHJlZiBBVkZvcm1hdENvbnRleHQuaWZvcm1hdCAiaW5wdXQiIG9yIEByZWYgQVZGb3JtYXRDb250ZXh0Lm9mb3JtYXQKKyAqICJvdXRwdXQiIGZvcm1hdC4gSXQgaXMgZWl0aGVyIGF1dG9kZXRlY3RlZCBvciBzZXQgYnkgdXNlciBmb3IgaW5wdXQ7CisgKiBhbHdheXMgc2V0IGJ5IHVzZXIgZm9yIG91dHB1dC4KKyAqIEBsaSBhbiBAcmVmIEFWRm9ybWF0Q29udGV4dC5zdHJlYW1zICJhcnJheSIgb2YgQVZTdHJlYW1zLCB3aGljaCBkZXNjcmliZSBhbGwKKyAqIGVsZW1lbnRhcnkgc3RyZWFtcyBzdG9yZWQgaW4gdGhlIGZpbGUuIEFWU3RyZWFtcyBhcmUgdHlwaWNhbGx5IHJlZmVycmVkIHRvCisgKiB1c2luZyB0aGVpciBpbmRleCBpbiB0aGlzIGFycmF5LgorICogQGxpIGFuIEByZWYgQVZGb3JtYXRDb250ZXh0LnBiICJJL08gY29udGV4dCIuIEl0IGlzIGVpdGhlciBvcGVuZWQgYnkgbGF2ZiBvcgorICogc2V0IGJ5IHVzZXIgZm9yIGlucHV0LCBhbHdheXMgc2V0IGJ5IHVzZXIgZm9yIG91dHB1dCAodW5sZXNzIHlvdSBhcmUgZGVhbGluZworICogd2l0aCBhbiBBVkZNVF9OT0ZJTEUgZm9ybWF0KS4KKyAqCisgKiBAc2VjdGlvbiBsYXZmX29wdGlvbnMgUGFzc2luZyBvcHRpb25zIHRvIChkZSltdXhlcnMKKyAqIExhdmYgYWxsb3dzIHRvIGNvbmZpZ3VyZSBtdXhlcnMgYW5kIGRlbXV4ZXJzIHVzaW5nIHRoZSBAcmVmIGF2b3B0aW9ucworICogbWVjaGFuaXNtLiBHZW5lcmljIChmb3JtYXQtaW5kZXBlbmRlbnQpIGxpYmF2Zm9ybWF0IG9wdGlvbnMgYXJlIHByb3ZpZGVkIGJ5CisgKiBBVkZvcm1hdENvbnRleHQsIHRoZXkgY2FuIGJlIGV4YW1pbmVkIGZyb20gYSB1c2VyIHByb2dyYW0gYnkgY2FsbGluZworICogYXZfb3B0X25leHQoKSAvIGF2X29wdF9maW5kKCkgb24gYW4gYWxsb2NhdGVkIEFWRm9ybWF0Q29udGV4dCAob3IgaXRzIEFWQ2xhc3MKKyAqIGZyb20gYXZmb3JtYXRfZ2V0X2NsYXNzKCkpLiBQcml2YXRlIChmb3JtYXQtc3BlY2lmaWMpIG9wdGlvbnMgYXJlIHByb3ZpZGVkIGJ5CisgKiBBVkZvcm1hdENvbnRleHQucHJpdl9kYXRhIGlmIGFuZCBvbmx5IGlmIEFWSW5wdXRGb3JtYXQucHJpdl9jbGFzcyAvCisgKiBBVk91dHB1dEZvcm1hdC5wcml2X2NsYXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hdCBzdHJ1Y3QgaXMgbm9uLU5VTEwuCisgKiBGdXJ0aGVyIG9wdGlvbnMgbWF5IGJlIHByb3ZpZGVkIGJ5IHRoZSBAcmVmIEFWRm9ybWF0Q29udGV4dC5wYiAiSS9PIGNvbnRleHQiLAorICogaWYgaXRzIEFWQ2xhc3MgaXMgbm9uLU5VTEwsIGFuZCB0aGUgcHJvdG9jb2xzIGxheWVyLiBTZWUgdGhlIGRpc2N1c3Npb24gb24KKyAqIG5lc3RpbmcgaW4gQHJlZiBhdm9wdGlvbnMgZG9jdW1lbnRhdGlvbiB0byBsZWFybiBob3cgdG8gYWNjZXNzIHRob3NlLgorICoKKyAqIEBkZWZncm91cCBsYXZmX2RlY29kaW5nIERlbXV4aW5nCisgKiBAeworICogRGVtdXhlcnMgcmVhZCBhIG1lZGlhIGZpbGUgYW5kIHNwbGl0IGl0IGludG8gY2h1bmtzIG9mIGRhdGEgKEBlbSBwYWNrZXRzKS4gQQorICogQHJlZiBBVlBhY2tldCAicGFja2V0IiBjb250YWlucyBvbmUgb3IgbW9yZSBlbmNvZGVkIGZyYW1lcyB3aGljaCBiZWxvbmdzIHRvIGEKKyAqIHNpbmdsZSBlbGVtZW50YXJ5IHN0cmVhbS4gSW4gdGhlIGxhdmYgQVBJIHRoaXMgcHJvY2VzcyBpcyByZXByZXNlbnRlZCBieSB0aGUKKyAqIGF2Zm9ybWF0X29wZW5faW5wdXQoKSBmdW5jdGlvbiBmb3Igb3BlbmluZyBhIGZpbGUsIGF2X3JlYWRfZnJhbWUoKSBmb3IKKyAqIHJlYWRpbmcgYSBzaW5nbGUgcGFja2V0IGFuZCBmaW5hbGx5IGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCksIHdoaWNoIGRvZXMgdGhlCisgKiBjbGVhbnVwLgorICoKKyAqIEBzZWN0aW9uIGxhdmZfZGVjb2Rpbmdfb3BlbiBPcGVuaW5nIGEgbWVkaWEgZmlsZQorICogVGhlIG1pbmltdW0gaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gb3BlbiBhIGZpbGUgaXMgaXRzIFVSTCBvciBmaWxlbmFtZSwgd2hpY2gKKyAqIGlzIHBhc3NlZCB0byBhdmZvcm1hdF9vcGVuX2lucHV0KCksIGFzIGluIHRoZSBmb2xsb3dpbmcgY29kZToKKyAqIEBjb2RlCisgKiBjb25zdCBjaGFyICAgICp1cmwgPSAiaW4ubXAzIjsKKyAqIEFWRm9ybWF0Q29udGV4dCAqcyA9IE5VTEw7CisgKiBpbnQgcmV0ID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmcywgdXJsLCBOVUxMLCBOVUxMKTsKKyAqIGlmIChyZXQgPCAwKQorICogICAgIGFib3J0KCk7CisgKiBAZW5kY29kZQorICogVGhlIGFib3ZlIGNvZGUgYXR0ZW1wdHMgdG8gYWxsb2NhdGUgYW4gQVZGb3JtYXRDb250ZXh0LCBvcGVuIHRoZQorICogc3BlY2lmaWVkIGZpbGUgKGF1dG9kZXRlY3RpbmcgdGhlIGZvcm1hdCkgYW5kIHJlYWQgdGhlIGhlYWRlciwgZXhwb3J0aW5nIHRoZQorICogaW5mb3JtYXRpb24gc3RvcmVkIHRoZXJlIGludG8gcy4gU29tZSBmb3JtYXRzIGRvIG5vdCBoYXZlIGEgaGVhZGVyIG9yIGRvIG5vdAorICogc3RvcmUgZW5vdWdoIGluZm9ybWF0aW9uIHRoZXJlLCBzbyBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBjYWxsIHRoZQorICogYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbygpIGZ1bmN0aW9uIHdoaWNoIHRyaWVzIHRvIHJlYWQgYW5kIGRlY29kZSBhIGZldworICogZnJhbWVzIHRvIGZpbmQgbWlzc2luZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBJbiBzb21lIGNhc2VzIHlvdSBtaWdodCB3YW50IHRvIHByZWFsbG9jYXRlIGFuIEFWRm9ybWF0Q29udGV4dCB5b3Vyc2VsZiB3aXRoCisgKiBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCkgYW5kIGRvIHNvbWUgdHdlYWtpbmcgb24gaXQgYmVmb3JlIHBhc3NpbmcgaXQgdG8KKyAqIGF2Zm9ybWF0X29wZW5faW5wdXQoKS4gT25lIHN1Y2ggY2FzZSBpcyB3aGVuIHlvdSB3YW50IHRvIHVzZSBjdXN0b20gZnVuY3Rpb25zCisgKiBmb3IgcmVhZGluZyBpbnB1dCBkYXRhIGluc3RlYWQgb2YgbGF2ZiBpbnRlcm5hbCBJL08gbGF5ZXIuCisgKiBUbyBkbyB0aGF0LCBjcmVhdGUgeW91ciBvd24gQVZJT0NvbnRleHQgd2l0aCBhdmlvX2FsbG9jX2NvbnRleHQoKSwgcGFzc2luZworICogeW91ciByZWFkaW5nIGNhbGxiYWNrcyB0byBpdC4gVGhlbiBzZXQgdGhlIEBlbSBwYiBmaWVsZCBvZiB5b3VyCisgKiBBVkZvcm1hdENvbnRleHQgdG8gbmV3bHkgY3JlYXRlZCBBVklPQ29udGV4dC4KKyAqCisgKiBTaW5jZSB0aGUgZm9ybWF0IG9mIHRoZSBvcGVuZWQgZmlsZSBpcyBpbiBnZW5lcmFsIG5vdCBrbm93biB1bnRpbCBhZnRlcgorICogYXZmb3JtYXRfb3Blbl9pbnB1dCgpIGhhcyByZXR1cm5lZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNldCBkZW11eGVyIHByaXZhdGUKKyAqIG9wdGlvbnMgb24gYSBwcmVhbGxvY2F0ZWQgY29udGV4dC4gSW5zdGVhZCwgdGhlIG9wdGlvbnMgc2hvdWxkIGJlIHBhc3NlZCB0bworICogYXZmb3JtYXRfb3Blbl9pbnB1dCgpIHdyYXBwZWQgaW4gYW4gQVZEaWN0aW9uYXJ5OgorICogQGNvZGUKKyAqIEFWRGljdGlvbmFyeSAqb3B0aW9ucyA9IE5VTEw7CisgKiBhdl9kaWN0X3NldCgmb3B0aW9ucywgInZpZGVvX3NpemUiLCAiNjQweDQ4MCIsIDApOworICogYXZfZGljdF9zZXQoJm9wdGlvbnMsICJwaXhlbF9mb3JtYXQiLCAicmdiMjQiLCAwKTsKKyAqCisgKiBpZiAoYXZmb3JtYXRfb3Blbl9pbnB1dCgmcywgdXJsLCBOVUxMLCAmb3B0aW9ucykgPCAwKQorICogICAgIGFib3J0KCk7CisgKiBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOworICogQGVuZGNvZGUKKyAqIFRoaXMgY29kZSBwYXNzZXMgdGhlIHByaXZhdGUgb3B0aW9ucyAndmlkZW9fc2l6ZScgYW5kICdwaXhlbF9mb3JtYXQnIHRvIHRoZQorICogZGVtdXhlci4gVGhleSB3b3VsZCBiZSBuZWNlc3NhcnkgZm9yIGUuZy4gdGhlIHJhd3ZpZGVvIGRlbXV4ZXIsIHNpbmNlIGl0CisgKiBjYW5ub3Qga25vdyBob3cgdG8gaW50ZXJwcmV0IHJhdyB2aWRlbyBkYXRhIG90aGVyd2lzZS4gSWYgdGhlIGZvcm1hdCB0dXJucworICogb3V0IHRvIGJlIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiByYXcgdmlkZW8sIHRob3NlIG9wdGlvbnMgd2lsbCBub3QgYmUKKyAqIHJlY29nbml6ZWQgYnkgdGhlIGRlbXV4ZXIgYW5kIHRoZXJlZm9yZSB3aWxsIG5vdCBiZSBhcHBsaWVkLiBTdWNoIHVucmVjb2duaXplZAorICogb3B0aW9ucyBhcmUgdGhlbiByZXR1cm5lZCBpbiB0aGUgb3B0aW9ucyBkaWN0aW9uYXJ5IChyZWNvZ25pemVkIG9wdGlvbnMgYXJlCisgKiBjb25zdW1lZCkuIFRoZSBjYWxsaW5nIHByb2dyYW0gY2FuIGhhbmRsZSBzdWNoIHVucmVjb2duaXplZCBvcHRpb25zIGFzIGl0CisgKiB3aXNoZXMsIGUuZy4KKyAqIEBjb2RlCisgKiBBVkRpY3Rpb25hcnlFbnRyeSAqZTsKKyAqIGlmIChlID0gYXZfZGljdF9nZXQob3B0aW9ucywgIiIsIE5VTEwsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpIHsKKyAqICAgICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbiAlcyBub3QgcmVjb2duaXplZCBieSB0aGUgZGVtdXhlci5cbiIsIGUtPmtleSk7CisgKiAgICAgYWJvcnQoKTsKKyAqIH0KKyAqIEBlbmRjb2RlCisgKgorICogQWZ0ZXIgeW91IGhhdmUgZmluaXNoZWQgcmVhZGluZyB0aGUgZmlsZSwgeW91IG11c3QgY2xvc2UgaXQgd2l0aAorICogYXZmb3JtYXRfY2xvc2VfaW5wdXQoKS4gSXQgd2lsbCBmcmVlIGV2ZXJ5dGhpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlLgorICoKKyAqIEBzZWN0aW9uIGxhdmZfZGVjb2RpbmdfcmVhZCBSZWFkaW5nIGZyb20gYW4gb3BlbmVkIGZpbGUKKyAqIFJlYWRpbmcgZGF0YSBmcm9tIGFuIG9wZW5lZCBBVkZvcm1hdENvbnRleHQgaXMgZG9uZSBieSByZXBlYXRlZGx5IGNhbGxpbmcKKyAqIGF2X3JlYWRfZnJhbWUoKSBvbiBpdC4gRWFjaCBjYWxsLCBpZiBzdWNjZXNzZnVsLCB3aWxsIHJldHVybiBhbiBBVlBhY2tldAorICogY29udGFpbmluZyBlbmNvZGVkIGRhdGEgZm9yIG9uZSBBVlN0cmVhbSwgaWRlbnRpZmllZCBieQorICogQVZQYWNrZXQuc3RyZWFtX2luZGV4LiBUaGlzIHBhY2tldCBtYXkgYmUgcGFzc2VkIHN0cmFpZ2h0IGludG8gdGhlIGxpYmF2Y29kZWMKKyAqIGRlY29kaW5nIGZ1bmN0aW9ucyBhdmNvZGVjX2RlY29kZV92aWRlbzIoKSwgYXZjb2RlY19kZWNvZGVfYXVkaW80KCkgb3IKKyAqIGF2Y29kZWNfZGVjb2RlX3N1YnRpdGxlMigpIGlmIHRoZSBjYWxsZXIgd2lzaGVzIHRvIGRlY29kZSB0aGUgZGF0YS4KKyAqCisgKiBBVlBhY2tldC5wdHMsIEFWUGFja2V0LmR0cyBhbmQgQVZQYWNrZXQuZHVyYXRpb24gdGltaW5nIGluZm9ybWF0aW9uIHdpbGwgYmUKKyAqIHNldCBpZiBrbm93bi4gVGhleSBtYXkgYWxzbyBiZSB1bnNldCAoaS5lLiBBVl9OT1BUU19WQUxVRSBmb3IKKyAqIHB0cy9kdHMsIDAgZm9yIGR1cmF0aW9uKSBpZiB0aGUgc3RyZWFtIGRvZXMgbm90IHByb3ZpZGUgdGhlbS4gVGhlIHRpbWluZworICogaW5mb3JtYXRpb24gd2lsbCBiZSBpbiBBVlN0cmVhbS50aW1lX2Jhc2UgdW5pdHMsIGkuZS4gaXQgaGFzIHRvIGJlCisgKiBtdWx0aXBsaWVkIGJ5IHRoZSB0aW1lYmFzZSB0byBjb252ZXJ0IHRoZW0gdG8gc2Vjb25kcy4KKyAqCisgKiBJZiBBVlBhY2tldC5idWYgaXMgc2V0IG9uIHRoZSByZXR1cm5lZCBwYWNrZXQsIHRoZW4gdGhlIHBhY2tldCBpcworICogYWxsb2NhdGVkIGR5bmFtaWNhbGx5IGFuZCB0aGUgdXNlciBtYXkga2VlcCBpdCBpbmRlZmluaXRlbHkuCisgKiBPdGhlcndpc2UsIGlmIEFWUGFja2V0LmJ1ZiBpcyBOVUxMLCB0aGUgcGFja2V0IGRhdGEgaXMgYmFja2VkIGJ5IGEKKyAqIHN0YXRpYyBzdG9yYWdlIHNvbWV3aGVyZSBpbnNpZGUgdGhlIGRlbXV4ZXIgYW5kIHRoZSBwYWNrZXQgaXMgb25seSB2YWxpZAorICogdW50aWwgdGhlIG5leHQgYXZfcmVhZF9mcmFtZSgpIGNhbGwgb3IgY2xvc2luZyB0aGUgZmlsZS4gSWYgdGhlIGNhbGxlcgorICogcmVxdWlyZXMgYSBsb25nZXIgbGlmZXRpbWUsIGF2X2R1cF9wYWNrZXQoKSB3aWxsIG1ha2UgYW4gYXZfbWFsbG9jKCllZCBjb3B5CisgKiBvZiBpdC4KKyAqIEluIGJvdGggY2FzZXMsIHRoZSBwYWNrZXQgbXVzdCBiZSBmcmVlZCB3aXRoIGF2X2ZyZWVfcGFja2V0KCkgd2hlbiBpdCBpcyBubworICogbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBAc2VjdGlvbiBsYXZmX2RlY29kaW5nX3NlZWsgU2Vla2luZworICogQH0KKyAqCisgKiBAZGVmZ3JvdXAgbGF2Zl9lbmNvZGluZyBNdXhpbmcKKyAqIEB7CisgKiBNdXhlcnMgdGFrZSBlbmNvZGVkIGRhdGEgaW4gdGhlIGZvcm0gb2YgQHJlZiBBVlBhY2tldCAiQVZQYWNrZXRzIiBhbmQgd3JpdGUKKyAqIGl0IGludG8gZmlsZXMgb3Igb3RoZXIgb3V0cHV0IGJ5dGVzdHJlYW1zIGluIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIGZvcm1hdC4KKyAqCisgKiBUaGUgbWFpbiBBUEkgZnVuY3Rpb25zIGZvciBtdXhpbmcgYXJlIGF2Zm9ybWF0X3dyaXRlX2hlYWRlcigpIGZvciB3cml0aW5nIHRoZQorICogZmlsZSBoZWFkZXIsIGF2X3dyaXRlX2ZyYW1lKCkgLyBhdl9pbnRlcmxlYXZlZF93cml0ZV9mcmFtZSgpIGZvciB3cml0aW5nIHRoZQorICogcGFja2V0cyBhbmQgYXZfd3JpdGVfdHJhaWxlcigpIGZvciBmaW5hbGl6aW5nIHRoZSBmaWxlLgorICoKKyAqIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG11eGluZyBwcm9jZXNzLCB0aGUgY2FsbGVyIG11c3QgZmlyc3QgY2FsbAorICogYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpIHRvIGNyZWF0ZSBhIG11eGluZyBjb250ZXh0LiBUaGUgY2FsbGVyIHRoZW4gc2V0cyB1cAorICogdGhlIG11eGVyIGJ5IGZpbGxpbmcgdGhlIHZhcmlvdXMgZmllbGRzIGluIHRoaXMgY29udGV4dDoKKyAqCisgKiAtIFRoZSBAcmVmIEFWRm9ybWF0Q29udGV4dC5vZm9ybWF0ICJvZm9ybWF0IiBmaWVsZCBtdXN0IGJlIHNldCB0byBzZWxlY3QgdGhlCisgKiAgIG11eGVyIHRoYXQgd2lsbCBiZSB1c2VkLgorICogLSBVbmxlc3MgdGhlIGZvcm1hdCBpcyBvZiB0aGUgQVZGTVRfTk9GSUxFIHR5cGUsIHRoZSBAcmVmIEFWRm9ybWF0Q29udGV4dC5wYgorICogICAicGIiIGZpZWxkIG11c3QgYmUgc2V0IHRvIGFuIG9wZW5lZCBJTyBjb250ZXh0LCBlaXRoZXIgcmV0dXJuZWQgZnJvbQorICogICBhdmlvX29wZW4yKCkgb3IgYSBjdXN0b20gb25lLgorICogLSBVbmxlc3MgdGhlIGZvcm1hdCBpcyBvZiB0aGUgQVZGTVRfTk9TVFJFQU1TIHR5cGUsIGF0IGxlYXN0IG9uZSBzdHJlYW0gbXVzdAorICogICBiZSBjcmVhdGVkIHdpdGggdGhlIGF2Zm9ybWF0X25ld19zdHJlYW0oKSBmdW5jdGlvbi4gVGhlIGNhbGxlciBzaG91bGQgZmlsbAorICogICB0aGUgQHJlZiBBVlN0cmVhbS5jb2RlYyAic3RyZWFtIGNvZGVjIGNvbnRleHQiIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZQorICogICBjb2RlYyBAcmVmIEFWQ29kZWNDb250ZXh0LmNvZGVjX3R5cGUgInR5cGUiLCBAcmVmIEFWQ29kZWNDb250ZXh0LmNvZGVjX2lkCisgKiAgICJpZCIgYW5kIG90aGVyIHBhcmFtZXRlcnMgKGUuZy4gd2lkdGggLyBoZWlnaHQsIHRoZSBwaXhlbCBvciBzYW1wbGUgZm9ybWF0LAorICogICBldGMuKSBhcyBrbm93bi4gVGhlIEByZWYgQVZTdHJlYW0udGltZV9iYXNlICJzdHJlYW0gdGltZWJhc2UiIHNob3VsZAorICogICBiZSBzZXQgdG8gdGhlIHRpbWViYXNlIHRoYXQgdGhlIGNhbGxlciBkZXNpcmVzIHRvIHVzZSBmb3IgdGhpcyBzdHJlYW0gKG5vdGUKKyAqICAgdGhhdCB0aGUgdGltZWJhc2UgYWN0dWFsbHkgdXNlZCBieSB0aGUgbXV4ZXIgY2FuIGJlIGRpZmZlcmVudCwgYXMgd2lsbCBiZQorICogICBkZXNjcmliZWQgbGF0ZXIpLgorICogLSBUaGUgY2FsbGVyIG1heSBmaWxsIGluIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHN1Y2ggYXMgQHJlZgorICogICBBVkZvcm1hdENvbnRleHQubWV0YWRhdGEgImdsb2JhbCIgb3IgQHJlZiBBVlN0cmVhbS5tZXRhZGF0YSAicGVyLXN0cmVhbSIKKyAqICAgbWV0YWRhdGEsIEByZWYgQVZGb3JtYXRDb250ZXh0LmNoYXB0ZXJzICJjaGFwdGVycyIsIEByZWYKKyAqICAgQVZGb3JtYXRDb250ZXh0LnByb2dyYW1zICJwcm9ncmFtcyIsIGV0Yy4gYXMgZGVzY3JpYmVkIGluIHRoZQorICogICBBVkZvcm1hdENvbnRleHQgZG9jdW1lbnRhdGlvbi4gV2hldGhlciBzdWNoIGluZm9ybWF0aW9uIHdpbGwgYWN0dWFsbHkgYmUKKyAqICAgc3RvcmVkIGluIHRoZSBvdXRwdXQgZGVwZW5kcyBvbiB3aGF0IHRoZSBjb250YWluZXIgZm9ybWF0IGFuZCB0aGUgbXV4ZXIKKyAqICAgc3VwcG9ydC4KKyAqCisgKiBXaGVuIHRoZSBtdXhpbmcgY29udGV4dCBpcyBmdWxseSBzZXQgdXAsIHRoZSBjYWxsZXIgbXVzdCBjYWxsCisgKiBhdmZvcm1hdF93cml0ZV9oZWFkZXIoKSB0byBpbml0aWFsaXplIHRoZSBtdXhlciBpbnRlcm5hbHMgYW5kIHdyaXRlIHRoZSBmaWxlCisgKiBoZWFkZXIuIFdoZXRoZXIgYW55dGhpbmcgYWN0dWFsbHkgaXMgd3JpdHRlbiB0byB0aGUgSU8gY29udGV4dCBhdCB0aGlzIHN0ZXAKKyAqIGRlcGVuZHMgb24gdGhlIG11eGVyLCBidXQgdGhpcyBmdW5jdGlvbiBtdXN0IGFsd2F5cyBiZSBjYWxsZWQuIEFueSBtdXhlcgorICogcHJpdmF0ZSBvcHRpb25zIG11c3QgYmUgcGFzc2VkIGluIHRoZSBvcHRpb25zIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFRoZSBkYXRhIGlzIHRoZW4gc2VudCB0byB0aGUgbXV4ZXIgYnkgcmVwZWF0ZWRseSBjYWxsaW5nIGF2X3dyaXRlX2ZyYW1lKCkgb3IKKyAqIGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKCkgKGNvbnN1bHQgdGhvc2UgZnVuY3Rpb25zJyBkb2N1bWVudGF0aW9uIGZvcgorICogZGlzY3Vzc2lvbiBvbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW07IG9ubHkgb25lIG9mIHRoZW0gbWF5IGJlIHVzZWQgd2l0aAorICogYSBzaW5nbGUgbXV4aW5nIGNvbnRleHQsIHRoZXkgc2hvdWxkIG5vdCBiZSBtaXhlZCkuIERvIG5vdGUgdGhhdCB0aGUgdGltaW5nCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgcGFja2V0cyBzZW50IHRvIHRoZSBtdXhlciBtdXN0IGJlIGluIHRoZSBjb3JyZXNwb25kaW5nCisgKiBBVlN0cmVhbSdzIHRpbWViYXNlLiBUaGF0IHRpbWViYXNlIGlzIHNldCBieSB0aGUgbXV4ZXIgKGluIHRoZQorICogYXZmb3JtYXRfd3JpdGVfaGVhZGVyKCkgc3RlcCkgYW5kIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdGltZWJhc2UKKyAqIHJlcXVlc3RlZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIE9uY2UgYWxsIHRoZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4sIHRoZSBjYWxsZXIgbXVzdCBjYWxsIGF2X3dyaXRlX3RyYWlsZXIoKQorICogdG8gZmx1c2ggYW55IGJ1ZmZlcmVkIHBhY2tldHMgYW5kIGZpbmFsaXplIHRoZSBvdXRwdXQgZmlsZSwgdGhlbiBjbG9zZSB0aGUgSU8KKyAqIGNvbnRleHQgKGlmIGFueSkgYW5kIGZpbmFsbHkgZnJlZSB0aGUgbXV4aW5nIGNvbnRleHQgd2l0aAorICogYXZmb3JtYXRfZnJlZV9jb250ZXh0KCkuCisgKiBAfQorICoKKyAqIEBkZWZncm91cCBsYXZmX2lvIEkvTyBSZWFkL1dyaXRlCisgKiBAeworICogQH0KKyAqCisgKiBAZGVmZ3JvdXAgbGF2Zl9jb2RlYyBEZW11eGVycworICogQHsKKyAqIEBkZWZncm91cCBsYXZmX2NvZGVjX25hdGl2ZSBOYXRpdmUgRGVtdXhlcnMKKyAqIEB7CisgKiBAfQorICogQGRlZmdyb3VwIGxhdmZfY29kZWNfd3JhcHBlcnMgRXh0ZXJuYWwgbGlicmFyeSB3cmFwcGVycworICogQHsKKyAqIEB9CisgKiBAfQorICogQGRlZmdyb3VwIGxhdmZfcHJvdG9zIEkvTyBQcm90b2NvbHMKKyAqIEB7CisgKiBAfQorICogQGRlZmdyb3VwIGxhdmZfaW50ZXJuYWwgSW50ZXJuYWwKKyAqIEB7CisgKiBAfQorICogQH0KKyAqCisgKi8KKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogRklMRSAqLworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorCisjaW5jbHVkZSAiYXZpby5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L3ZlcnNpb24uaCIKKworc3RydWN0IEFWRm9ybWF0Q29udGV4dDsKKworc3RydWN0IEFWRGV2aWNlSW5mb0xpc3Q7CitzdHJ1Y3QgQVZEZXZpY2VDYXBhYmlsaXRpZXNRdWVyeTsKKworLyoqCisgKiBAZGVmZ3JvdXAgbWV0YWRhdGFfYXBpIFB1YmxpYyBNZXRhZGF0YSBBUEkKKyAqIEB7CisgKiBAaW5ncm91cCBsaWJhdmYKKyAqIFRoZSBtZXRhZGF0YSBBUEkgYWxsb3dzIGxpYmF2Zm9ybWF0IHRvIGV4cG9ydCBtZXRhZGF0YSB0YWdzIHRvIGEgY2xpZW50CisgKiBhcHBsaWNhdGlvbiB3aGVuIGRlbXV4aW5nLiBDb252ZXJzZWx5IGl0IGFsbG93cyBhIGNsaWVudCBhcHBsaWNhdGlvbiB0bworICogc2V0IG1ldGFkYXRhIHdoZW4gbXV4aW5nLgorICoKKyAqIE1ldGFkYXRhIGlzIGV4cG9ydGVkIG9yIHNldCBhcyBwYWlycyBvZiBrZXkvdmFsdWUgc3RyaW5ncyBpbiB0aGUgJ21ldGFkYXRhJworICogZmllbGRzIG9mIHRoZSBBVkZvcm1hdENvbnRleHQsIEFWU3RyZWFtLCBBVkNoYXB0ZXIgYW5kIEFWUHJvZ3JhbSBzdHJ1Y3RzCisgKiB1c2luZyB0aGUgQHJlZiBsYXZ1X2RpY3QgIkFWRGljdGlvbmFyeSIgQVBJLiBMaWtlIGFsbCBzdHJpbmdzIGluIEZGbXBlZywKKyAqIG1ldGFkYXRhIGlzIGFzc3VtZWQgdG8gYmUgVVRGLTggZW5jb2RlZCBVbmljb2RlLiBOb3RlIHRoYXQgbWV0YWRhdGEKKyAqIGV4cG9ydGVkIGJ5IGRlbXV4ZXJzIGlzbid0IGNoZWNrZWQgdG8gYmUgdmFsaWQgVVRGLTggaW4gbW9zdCBjYXNlcy4KKyAqCisgKiBJbXBvcnRhbnQgY29uY2VwdHMgdG8ga2VlcCBpbiBtaW5kOgorICogLSAgS2V5cyBhcmUgdW5pcXVlOyB0aGVyZSBjYW4gbmV2ZXIgYmUgMiB0YWdzIHdpdGggdGhlIHNhbWUga2V5LiBUaGlzIGlzCisgKiAgICBhbHNvIG1lYW50IHNlbWFudGljYWxseSwgaS5lLiwgYSBkZW11eGVyIHNob3VsZCBub3Qga25vd2luZ2x5IHByb2R1Y2UKKyAqICAgIHNldmVyYWwga2V5cyB0aGF0IGFyZSBsaXRlcmFsbHkgZGlmZmVyZW50IGJ1dCBzZW1hbnRpY2FsbHkgaWRlbnRpY2FsLgorICogICAgRS5nLiwga2V5PUF1dGhvcjUsIGtleT1BdXRob3I2LiBJbiB0aGlzIGV4YW1wbGUsIGFsbCBhdXRob3JzIG11c3QgYmUKKyAqICAgIHBsYWNlZCBpbiB0aGUgc2FtZSB0YWcuCisgKiAtICBNZXRhZGF0YSBpcyBmbGF0LCBub3QgaGllcmFyY2hpY2FsOyB0aGVyZSBhcmUgbm8gc3VidGFncy4gSWYgeW91CisgKiAgICB3YW50IHRvIHN0b3JlLCBlLmcuLCB0aGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgY2hpbGQgb2YgcHJvZHVjZXIgQWxpY2UKKyAqICAgIGFuZCBhY3RvciBCb2IsIHRoYXQgY291bGQgaGF2ZSBrZXk9YWxpY2VfYW5kX2JvYnNfY2hpbGRzX2VtYWlsX2FkZHJlc3MuCisgKiAtICBTZXZlcmFsIG1vZGlmaWVycyBjYW4gYmUgYXBwbGllZCB0byB0aGUgdGFnIG5hbWUuIFRoaXMgaXMgZG9uZSBieQorICogICAgYXBwZW5kaW5nIGEgZGFzaCBjaGFyYWN0ZXIgKCctJykgYW5kIHRoZSBtb2RpZmllciBuYW1lIGluIHRoZSBvcmRlcgorICogICAgdGhleSBhcHBlYXIgaW4gdGhlIGxpc3QgYmVsb3cgLS0gZS5nLiBmb28tZW5nLXNvcnQsIG5vdCBmb28tc29ydC1lbmcuCisgKiAgICAtICBsYW5ndWFnZSAtLSBhIHRhZyB3aG9zZSB2YWx1ZSBpcyBsb2NhbGl6ZWQgZm9yIGEgcGFydGljdWxhciBsYW5ndWFnZQorICogICAgICAgaXMgYXBwZW5kZWQgd2l0aCB0aGUgSVNPIDYzOS0yL0IgMy1sZXR0ZXIgbGFuZ3VhZ2UgY29kZS4KKyAqICAgICAgIEZvciBleGFtcGxlOiBBdXRob3ItZ2VyPU1pY2hhZWwsIEF1dGhvci1lbmc9TWlrZQorICogICAgICAgVGhlIG9yaWdpbmFsL2RlZmF1bHQgbGFuZ3VhZ2UgaXMgaW4gdGhlIHVucXVhbGlmaWVkICJBdXRob3IiIHRhZy4KKyAqICAgICAgIEEgZGVtdXhlciBzaG91bGQgc2V0IGEgZGVmYXVsdCBpZiBpdCBzZXRzIGFueSB0cmFuc2xhdGVkIHRhZy4KKyAqICAgIC0gIHNvcnRpbmcgIC0tIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBhIHRhZyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvcgorICogICAgICAgc29ydGluZyB3aWxsIGhhdmUgJy1zb3J0JyBhcHBlbmRlZC4gRS5nLiBhcnRpc3Q9IlRoZSBCZWF0bGVzIiwKKyAqICAgICAgIGFydGlzdC1zb3J0PSJCZWF0bGVzLCBUaGUiLgorICogLSBTb21lIHByb3RvY29scyBhbmQgZGVtdXhlcnMgc3VwcG9ydCBtZXRhZGF0YSB1cGRhdGVzLiBBZnRlciBhIHN1Y2Nlc3NmdWwKKyAqICAgY2FsbCB0byBhdl9yZWFkX3BhY2tldCgpLCBBVkZvcm1hdENvbnRleHQuZXZlbnRfZmxhZ3Mgb3IgQVZTdHJlYW0uZXZlbnRfZmxhZ3MKKyAqICAgd2lsbCBiZSB1cGRhdGVkIHRvIGluZGljYXRlIGlmIG1ldGFkYXRhIGNoYW5nZWQuIEluIG9yZGVyIHRvIGRldGVjdCBtZXRhZGF0YQorICogICBjaGFuZ2VzIG9uIGEgc3RyZWFtLCB5b3UgbmVlZCB0byBsb29wIHRocm91Z2ggYWxsIHN0cmVhbXMgaW4gdGhlIEFWRm9ybWF0Q29udGV4dAorICogICBhbmQgY2hlY2sgdGhlaXIgaW5kaXZpZHVhbCBldmVudF9mbGFncy4KKyAqCisgKiAtICBEZW11eGVycyBhdHRlbXB0IHRvIGV4cG9ydCBtZXRhZGF0YSBpbiBhIGdlbmVyaWMgZm9ybWF0LCBob3dldmVyIHRhZ3MKKyAqICAgIHdpdGggbm8gZ2VuZXJpYyBlcXVpdmFsZW50cyBhcmUgbGVmdCBhcyB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIGNvbnRhaW5lci4KKyAqICAgIEZvbGxvd3MgYSBsaXN0IG9mIGdlbmVyaWMgdGFnIG5hbWVzOgorICoKKyBAdmVyYmF0aW0KKyBhbGJ1bSAgICAgICAgLS0gbmFtZSBvZiB0aGUgc2V0IHRoaXMgd29yayBiZWxvbmdzIHRvCisgYWxidW1fYXJ0aXN0IC0tIG1haW4gY3JlYXRvciBvZiB0aGUgc2V0L2FsYnVtLCBpZiBkaWZmZXJlbnQgZnJvbSBhcnRpc3QuCisgICAgICAgICAgICAgICAgIGUuZy4gIlZhcmlvdXMgQXJ0aXN0cyIgZm9yIGNvbXBpbGF0aW9uIGFsYnVtcy4KKyBhcnRpc3QgICAgICAgLS0gbWFpbiBjcmVhdG9yIG9mIHRoZSB3b3JrCisgY29tbWVudCAgICAgIC0tIGFueSBhZGRpdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWxlLgorIGNvbXBvc2VyICAgICAtLSB3aG8gY29tcG9zZWQgdGhlIHdvcmssIGlmIGRpZmZlcmVudCBmcm9tIGFydGlzdC4KKyBjb3B5cmlnaHQgICAgLS0gbmFtZSBvZiBjb3B5cmlnaHQgaG9sZGVyLgorIGNyZWF0aW9uX3RpbWUtLSBkYXRlIHdoZW4gdGhlIGZpbGUgd2FzIGNyZWF0ZWQsIHByZWZlcmFibHkgaW4gSVNPIDg2MDEuCisgZGF0ZSAgICAgICAgIC0tIGRhdGUgd2hlbiB0aGUgd29yayB3YXMgY3JlYXRlZCwgcHJlZmVyYWJseSBpbiBJU08gODYwMS4KKyBkaXNjICAgICAgICAgLS0gbnVtYmVyIG9mIGEgc3Vic2V0LCBlLmcuIGRpc2MgaW4gYSBtdWx0aS1kaXNjIGNvbGxlY3Rpb24uCisgZW5jb2RlciAgICAgIC0tIG5hbWUvc2V0dGluZ3Mgb2YgdGhlIHNvZnR3YXJlL2hhcmR3YXJlIHRoYXQgcHJvZHVjZWQgdGhlIGZpbGUuCisgZW5jb2RlZF9ieSAgIC0tIHBlcnNvbi9ncm91cCB3aG8gY3JlYXRlZCB0aGUgZmlsZS4KKyBmaWxlbmFtZSAgICAgLS0gb3JpZ2luYWwgbmFtZSBvZiB0aGUgZmlsZS4KKyBnZW5yZSAgICAgICAgLS0gPHNlbGYtZXZpZGVudD4uCisgbGFuZ3VhZ2UgICAgIC0tIG1haW4gbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIHdvcmsgaXMgcGVyZm9ybWVkLCBwcmVmZXJhYmx5CisgICAgICAgICAgICAgICAgIGluIElTTyA2MzktMiBmb3JtYXQuIE11bHRpcGxlIGxhbmd1YWdlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgIHNlcGFyYXRpbmcgdGhlbSB3aXRoIGNvbW1hcy4KKyBwZXJmb3JtZXIgICAgLS0gYXJ0aXN0IHdobyBwZXJmb3JtZWQgdGhlIHdvcmssIGlmIGRpZmZlcmVudCBmcm9tIGFydGlzdC4KKyAgICAgICAgICAgICAgICAgRS5nIGZvciAiQWxzbyBzcHJhY2ggWmFyYXRodXN0cmEiLCBhcnRpc3Qgd291bGQgYmUgIlJpY2hhcmQKKyAgICAgICAgICAgICAgICAgU3RyYXVzcyIgYW5kIHBlcmZvcm1lciAiTG9uZG9uIFBoaWxoYXJtb25pYyBPcmNoZXN0cmEiLgorIHB1Ymxpc2hlciAgICAtLSBuYW1lIG9mIHRoZSBsYWJlbC9wdWJsaXNoZXIuCisgc2VydmljZV9uYW1lICAgICAtLSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGluIGJyb2FkY2FzdGluZyAoY2hhbm5lbCBuYW1lKS4KKyBzZXJ2aWNlX3Byb3ZpZGVyIC0tIG5hbWUgb2YgdGhlIHNlcnZpY2UgcHJvdmlkZXIgaW4gYnJvYWRjYXN0aW5nLgorIHRpdGxlICAgICAgICAtLSBuYW1lIG9mIHRoZSB3b3JrLgorIHRyYWNrICAgICAgICAtLSBudW1iZXIgb2YgdGhpcyB3b3JrIGluIHRoZSBzZXQsIGNhbiBiZSBpbiBmb3JtIGN1cnJlbnQvdG90YWwuCisgdmFyaWFudF9iaXRyYXRlIC0tIHRoZSB0b3RhbCBiaXRyYXRlIG9mIHRoZSBiaXRyYXRlIHZhcmlhbnQgdGhhdCB0aGUgY3VycmVudCBzdHJlYW0gaXMgcGFydCBvZgorIEBlbmR2ZXJiYXRpbQorICoKKyAqIExvb2sgaW4gdGhlIGV4YW1wbGVzIHNlY3Rpb24gZm9yIGFuIGFwcGxpY2F0aW9uIGV4YW1wbGUgaG93IHRvIHVzZSB0aGUgTWV0YWRhdGEgQVBJLgorICoKKyAqIEB9CisgKi8KKworLyogcGFja2V0IGZ1bmN0aW9ucyAqLworCisKKy8qKgorICogQWxsb2NhdGUgYW5kIHJlYWQgdGhlIHBheWxvYWQgb2YgYSBwYWNrZXQgYW5kIGluaXRpYWxpemUgaXRzCisgKiBmaWVsZHMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gcyAgICBhc3NvY2lhdGVkIElPIGNvbnRleHQKKyAqIEBwYXJhbSBwa3QgcGFja2V0CisgKiBAcGFyYW0gc2l6ZSBkZXNpcmVkIHBheWxvYWQgc2l6ZQorICogQHJldHVybiA+MCAocmVhZCBzaXplKSBpZiBPSywgQVZFUlJPUl94eHggb3RoZXJ3aXNlCisgKi8KK2ludCBhdl9nZXRfcGFja2V0KEFWSU9Db250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LCBpbnQgc2l6ZSk7CisKKworLyoqCisgKiBSZWFkIGRhdGEgYW5kIGFwcGVuZCBpdCB0byB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBBVlBhY2tldC4KKyAqIElmIHBrdC0+c2l6ZSBpcyAwIHRoaXMgaXMgaWRlbnRpY2FsIHRvIGF2X2dldF9wYWNrZXQuCisgKiBOb3RlIHRoYXQgdGhpcyB1c2VzIGF2X2dyb3dfcGFja2V0IGFuZCB0aHVzIGludm9sdmVzIGEgcmVhbGxvYworICogd2hpY2ggaXMgaW5lZmZpY2llbnQuIFRodXMgdGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkCisgKiB3aGVuIHRoZXJlIGlzIG5vIHJlYXNvbmFibGUgd2F5IHRvIGtub3cgKGFuIHVwcGVyIGJvdW5kIG9mKQorICogdGhlIGZpbmFsIHNpemUuCisgKgorICogQHBhcmFtIHMgICAgYXNzb2NpYXRlZCBJTyBjb250ZXh0CisgKiBAcGFyYW0gcGt0IHBhY2tldAorICogQHBhcmFtIHNpemUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICogQHJldHVybiA+MCAocmVhZCBzaXplKSBpZiBPSywgQVZFUlJPUl94eHggb3RoZXJ3aXNlLCBwcmV2aW91cyBkYXRhCisgKiAgICAgICAgIHdpbGwgbm90IGJlIGxvc3QgZXZlbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgKi8KK2ludCBhdl9hcHBlbmRfcGFja2V0KEFWSU9Db250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LCBpbnQgc2l6ZSk7CisKKyNpZiBGRl9BUElfTEFWRl9GUkFDCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZyYWN0aW9uYWwgbnVtYmVycyBmb3IgZXhhY3QgcHRzIGhhbmRsaW5nICovCisKKy8qKgorICogVGhlIGV4YWN0IHZhbHVlIG9mIHRoZSBmcmFjdGlvbmFsIG51bWJlciBpczogJ3ZhbCArIG51bSAvIGRlbicuCisgKiBudW0gaXMgYXNzdW1lZCB0byBiZSAwIDw9IG51bSA8IGRlbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZGcmFjIHsKKyAgICBpbnQ2NF90IHZhbCwgbnVtLCBkZW47Cit9IEFWRnJhYzsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGlucHV0L291dHB1dCBmb3JtYXRzICovCisKK3N0cnVjdCBBVkNvZGVjVGFnOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBkYXRhIGEgZm9ybWF0IGhhcyB0byBwcm9iZSBhIGZpbGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWUHJvYmVEYXRhIHsKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICB1bnNpZ25lZCBjaGFyICpidWY7IC8qKjwgQnVmZmVyIG11c3QgaGF2ZSBBVlBST0JFX1BBRERJTkdfU0laRSBvZiBleHRyYSBhbGxvY2F0ZWQgYnl0ZXMgZmlsbGVkIHdpdGggemVyby4gKi8KKyAgICBpbnQgYnVmX3NpemU7ICAgICAgIC8qKjwgU2l6ZSBvZiBidWYgZXhjZXB0IGV4dHJhIGFsbG9jYXRlZCBieXRlcyAqLworICAgIGNvbnN0IGNoYXIgKm1pbWVfdHlwZTsgLyoqPCBtaW1lX3R5cGUsIHdoZW4ga25vd24uICovCit9IEFWUHJvYmVEYXRhOworCisjZGVmaW5lIEFWUFJPQkVfU0NPUkVfUkVUUlkgKEFWUFJPQkVfU0NPUkVfTUFYLzQpCisjZGVmaW5lIEFWUFJPQkVfU0NPUkVfU1RSRUFNX1JFVFJZIChBVlBST0JFX1NDT1JFX01BWC80LTEpCisKKyNkZWZpbmUgQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gIDUwIC8vLzwgc2NvcmUgZm9yIGZpbGUgZXh0ZW5zaW9uCisjZGVmaW5lIEFWUFJPQkVfU0NPUkVfTUlNRSAgICAgICA3NSAvLy88IHNjb3JlIGZvciBmaWxlIG1pbWUgdHlwZQorI2RlZmluZSBBVlBST0JFX1NDT1JFX01BWCAgICAgICAxMDAgLy8vPCBtYXhpbXVtIHNjb3JlCisKKyNkZWZpbmUgQVZQUk9CRV9QQURESU5HX1NJWkUgMzIgICAgICAgICAgICAgLy8vPCBleHRyYSBhbGxvY2F0ZWQgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgcHJvYmUgYnVmZmVyCisKKy8vLyBEZW11eGVyIHdpbGwgdXNlIGF2aW9fb3Blbiwgbm8gb3BlbmVkIGZpbGUgc2hvdWxkIGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuCisjZGVmaW5lIEFWRk1UX05PRklMRSAgICAgICAgMHgwMDAxCisjZGVmaW5lIEFWRk1UX05FRUROVU1CRVIgICAgMHgwMDAyIC8qKjwgTmVlZHMgJyVkJyBpbiBmaWxlbmFtZS4gKi8KKyNkZWZpbmUgQVZGTVRfU0hPV19JRFMgICAgICAweDAwMDggLyoqPCBTaG93IGZvcm1hdCBzdHJlYW0gSURzIG51bWJlcnMuICovCisjZGVmaW5lIEFWRk1UX1JBV1BJQ1RVUkUgICAgMHgwMDIwIC8qKjwgRm9ybWF0IHdhbnRzIEFWUGljdHVyZSBzdHJ1Y3R1cmUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdyBwaWN0dXJlIGRhdGEuICovCisjZGVmaW5lIEFWRk1UX0dMT0JBTEhFQURFUiAgMHgwMDQwIC8qKjwgRm9ybWF0IHdhbnRzIGdsb2JhbCBoZWFkZXIuICovCisjZGVmaW5lIEFWRk1UX05PVElNRVNUQU1QUyAgMHgwMDgwIC8qKjwgRm9ybWF0IGRvZXMgbm90IG5lZWQgLyBoYXZlIGFueSB0aW1lc3RhbXBzLiAqLworI2RlZmluZSBBVkZNVF9HRU5FUklDX0lOREVYIDB4MDEwMCAvKio8IFVzZSBnZW5lcmljIGluZGV4IGJ1aWxkaW5nIGNvZGUuICovCisjZGVmaW5lIEFWRk1UX1RTX0RJU0NPTlQgICAgMHgwMjAwIC8qKjwgRm9ybWF0IGFsbG93cyB0aW1lc3RhbXAgZGlzY29udGludWl0aWVzLiBOb3RlLCBtdXhlcnMgYWx3YXlzIHJlcXVpcmUgdmFsaWQgKG1vbm90b25lKSB0aW1lc3RhbXBzICovCisjZGVmaW5lIEFWRk1UX1ZBUklBQkxFX0ZQUyAgMHgwNDAwIC8qKjwgRm9ybWF0IGFsbG93cyB2YXJpYWJsZSBmcHMuICovCisjZGVmaW5lIEFWRk1UX05PRElNRU5TSU9OUyAgMHgwODAwIC8qKjwgRm9ybWF0IGRvZXMgbm90IG5lZWQgd2lkdGgvaGVpZ2h0ICovCisjZGVmaW5lIEFWRk1UX05PU1RSRUFNUyAgICAgMHgxMDAwIC8qKjwgRm9ybWF0IGRvZXMgbm90IHJlcXVpcmUgYW55IHN0cmVhbXMgKi8KKyNkZWZpbmUgQVZGTVRfTk9CSU5TRUFSQ0ggICAweDIwMDAgLyoqPCBGb3JtYXQgZG9lcyBub3QgYWxsb3cgdG8gZmFsbCBiYWNrIG9uIGJpbmFyeSBzZWFyY2ggdmlhIHJlYWRfdGltZXN0YW1wICovCisjZGVmaW5lIEFWRk1UX05PR0VOU0VBUkNIICAgMHg0MDAwIC8qKjwgRm9ybWF0IGRvZXMgbm90IGFsbG93IHRvIGZhbGwgYmFjayBvbiBnZW5lcmljIHNlYXJjaCAqLworI2RlZmluZSBBVkZNVF9OT19CWVRFX1NFRUsgIDB4ODAwMCAvKio8IEZvcm1hdCBkb2VzIG5vdCBhbGxvdyBzZWVraW5nIGJ5IGJ5dGVzICovCisjZGVmaW5lIEFWRk1UX0FMTE9XX0ZMVVNIICAweDEwMDAwIC8qKjwgRm9ybWF0IGFsbG93cyBmbHVzaGluZy4gSWYgbm90IHNldCwgdGhlIG11eGVyIHdpbGwgbm90IHJlY2VpdmUgYSBOVUxMIHBhY2tldCBpbiB0aGUgd3JpdGVfcGFja2V0IGZ1bmN0aW9uLiAqLworI2lmIExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPD0gNTQKKyNkZWZpbmUgQVZGTVRfVFNfTk9OU1RSSUNUIDB4ODAyMDAwMCAvL3dlIHRyeSB0byBiZSBjb21wYXRpYmxlIHRvIHRoZSBBQklzIG9mIGZmbXBlZyBhbmQgbWFqb3IgZm9ya3MKKyNlbHNlCisjZGVmaW5lIEFWRk1UX1RTX05PTlNUUklDVCAweDIwMDAwCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGb3JtYXQgZG9lcyBub3QgcmVxdWlyZSBzdHJpY3RseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlYXNpbmcgdGltZXN0YW1wcywgYnV0IHRoZXkgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIGJlIG1vbm90b25pYyAqLworI2RlZmluZSBBVkZNVF9UU19ORUdBVElWRSAgMHg0MDAwMCAvKio8IEZvcm1hdCBhbGxvd3MgbXV4aW5nIG5lZ2F0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wcy4gSWYgbm90IHNldCB0aGUgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzaGlmdGVkIGluIGF2X3dyaXRlX2ZyYW1lIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lIHNvIHRoZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCBmcm9tIDAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHVzZXIgb3IgbXV4ZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRm9ybWF0Q29udGV4dC5hdm9pZF9uZWdhdGl2ZV90cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQVZGTVRfU0VFS19UT19QVFMgICAweDQwMDAwMDAgLyoqPCBTZWVraW5nIGlzIGJhc2VkIG9uIFBUUyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIGxhdmZfZW5jb2RpbmcKKyAqIEB7CisgKi8KK3R5cGVkZWYgc3RydWN0IEFWT3V0cHV0Rm9ybWF0IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBmb3JtYXQsIG1lYW50IHRvIGJlIG1vcmUgaHVtYW4tcmVhZGFibGUKKyAgICAgKiB0aGFuIG5hbWUuIFlvdSBzaG91bGQgdXNlIHRoZSBOVUxMX0lGX0NPTkZJR19TTUFMTCgpIG1hY3JvCisgICAgICogdG8gZGVmaW5lIGl0LgorICAgICAqLworICAgIGNvbnN0IGNoYXIgKmxvbmdfbmFtZTsKKyAgICBjb25zdCBjaGFyICptaW1lX3R5cGU7CisgICAgY29uc3QgY2hhciAqZXh0ZW5zaW9uczsgLyoqPCBjb21tYS1zZXBhcmF0ZWQgZmlsZW5hbWUgZXh0ZW5zaW9ucyAqLworICAgIC8qIG91dHB1dCBzdXBwb3J0ICovCisgICAgZW51bSBBVkNvZGVjSUQgYXVkaW9fY29kZWM7ICAgIC8qKjwgZGVmYXVsdCBhdWRpbyBjb2RlYyAqLworICAgIGVudW0gQVZDb2RlY0lEIHZpZGVvX2NvZGVjOyAgICAvKio8IGRlZmF1bHQgdmlkZW8gY29kZWMgKi8KKyAgICBlbnVtIEFWQ29kZWNJRCBzdWJ0aXRsZV9jb2RlYzsgLyoqPCBkZWZhdWx0IHN1YnRpdGxlIGNvZGVjICovCisgICAgLyoqCisgICAgICogY2FuIHVzZSBmbGFnczogQVZGTVRfTk9GSUxFLCBBVkZNVF9ORUVETlVNQkVSLCBBVkZNVF9SQVdQSUNUVVJFLAorICAgICAqIEFWRk1UX0dMT0JBTEhFQURFUiwgQVZGTVRfTk9USU1FU1RBTVBTLCBBVkZNVF9WQVJJQUJMRV9GUFMsCisgICAgICogQVZGTVRfTk9ESU1FTlNJT05TLCBBVkZNVF9OT1NUUkVBTVMsIEFWRk1UX0FMTE9XX0ZMVVNILAorICAgICAqIEFWRk1UX1RTX05PTlNUUklDVAorICAgICAqLworICAgIGludCBmbGFnczsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2Ygc3VwcG9ydGVkIGNvZGVjX2lkLWNvZGVjX3RhZyBwYWlycywgb3JkZXJlZCBieSAiYmV0dGVyCisgICAgICogY2hvaWNlIGZpcnN0Ii4gVGhlIGFycmF5cyBhcmUgYWxsIHRlcm1pbmF0ZWQgYnkgQVZfQ09ERUNfSURfTk9ORS4KKyAgICAgKi8KKyAgICBjb25zdCBzdHJ1Y3QgQVZDb2RlY1RhZyAqIGNvbnN0ICpjb2RlY190YWc7CisKKworICAgIGNvbnN0IEFWQ2xhc3MgKnByaXZfY2xhc3M7IC8vLzwgQVZDbGFzcyBmb3IgdGhlIHByaXZhdGUgY29udGV4dAorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogTm8gZmllbGRzIGJlbG93IHRoaXMgbGluZSBhcmUgcGFydCBvZiB0aGUgcHVibGljIEFQSS4gVGhleQorICAgICAqIG1heSBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGxpYmF2Zm9ybWF0IGFuZCBjYW4gYmUgY2hhbmdlZCBhbmQKKyAgICAgKiByZW1vdmVkIGF0IHdpbGwuCisgICAgICogTmV3IHB1YmxpYyBmaWVsZHMgc2hvdWxkIGJlIGFkZGVkIHJpZ2h0IGFib3ZlLgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworICAgIHN0cnVjdCBBVk91dHB1dEZvcm1hdCAqbmV4dDsKKyAgICAvKioKKyAgICAgKiBzaXplIG9mIHByaXZhdGUgZGF0YSBzbyB0aGF0IGl0IGNhbiBiZSBhbGxvY2F0ZWQgaW4gdGhlIHdyYXBwZXIKKyAgICAgKi8KKyAgICBpbnQgcHJpdl9kYXRhX3NpemU7CisKKyAgICBpbnQgKCp3cml0ZV9oZWFkZXIpKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKik7CisgICAgLyoqCisgICAgICogV3JpdGUgYSBwYWNrZXQuIElmIEFWRk1UX0FMTE9XX0ZMVVNIIGlzIHNldCBpbiBmbGFncywKKyAgICAgKiBwa3QgY2FuIGJlIE5VTEwgaW4gb3JkZXIgdG8gZmx1c2ggZGF0YSBidWZmZXJlZCBpbiB0aGUgbXV4ZXIuCisgICAgICogV2hlbiBmbHVzaGluZywgcmV0dXJuIDAgaWYgdGhlcmUgc3RpbGwgaXMgbW9yZSBkYXRhIHRvIGZsdXNoLAorICAgICAqIG9yIDEgaWYgZXZlcnl0aGluZyB3YXMgZmx1c2hlZCBhbmQgdGhlcmUgaXMgbm8gbW9yZSBidWZmZXJlZAorICAgICAqIGRhdGEuCisgICAgICovCisgICAgaW50ICgqd3JpdGVfcGFja2V0KShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICosIEFWUGFja2V0ICpwa3QpOworICAgIGludCAoKndyaXRlX3RyYWlsZXIpKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKik7CisgICAgLyoqCisgICAgICogQ3VycmVudGx5IG9ubHkgdXNlZCB0byBzZXQgcGl4ZWwgZm9ybWF0IGlmIG5vdCBZVVY0MjBQLgorICAgICAqLworICAgIGludCAoKmludGVybGVhdmVfcGFja2V0KShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICosIEFWUGFja2V0ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICppbiwgaW50IGZsdXNoKTsKKyAgICAvKioKKyAgICAgKiBUZXN0IGlmIHRoZSBnaXZlbiBjb2RlYyBjYW4gYmUgc3RvcmVkIGluIHRoaXMgY29udGFpbmVyLgorICAgICAqCisgICAgICogQHJldHVybiAxIGlmIHRoZSBjb2RlYyBpcyBzdXBwb3J0ZWQsIDAgaWYgaXQgaXMgbm90LgorICAgICAqICAgICAgICAgQSBuZWdhdGl2ZSBudW1iZXIgaWYgdW5rbm93bi4KKyAgICAgKiAgICAgICAgIE1LVEFHKCdBJywgJ1AnLCAnSScsICdDJykgaWYgdGhlIGNvZGVjIGlzIG9ubHkgc3VwcG9ydGVkIGFzIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQworICAgICAqLworICAgIGludCAoKnF1ZXJ5X2NvZGVjKShlbnVtIEFWQ29kZWNJRCBpZCwgaW50IHN0ZF9jb21wbGlhbmNlKTsKKworICAgIHZvaWQgKCpnZXRfb3V0cHV0X3RpbWVzdGFtcCkoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmR0cywgaW50NjRfdCAqd2FsbCk7CisgICAgLyoqCisgICAgICogQWxsb3dzIHNlbmRpbmcgbWVzc2FnZXMgZnJvbSBhcHBsaWNhdGlvbiB0byBkZXZpY2UuCisgICAgICovCisgICAgaW50ICgqY29udHJvbF9tZXNzYWdlKShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpOworCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gdW5jb2RlZCBBVkZyYW1lLgorICAgICAqCisgICAgICogU2VlIGF2X3dyaXRlX3VuY29kZWRfZnJhbWUoKSBmb3IgZGV0YWlscy4KKyAgICAgKgorICAgICAqIFRoZSBsaWJyYXJ5IHdpbGwgZnJlZSAqZnJhbWUgYWZ0ZXJ3YXJkcywgYnV0IHRoZSBtdXhlciBjYW4gcHJldmVudCBpdAorICAgICAqIGJ5IHNldHRpbmcgdGhlIHBvaW50ZXIgdG8gTlVMTC4KKyAgICAgKi8KKyAgICBpbnQgKCp3cml0ZV91bmNvZGVkX2ZyYW1lKShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICosIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqKmZyYW1lLCB1bnNpZ25lZCBmbGFncyk7CisgICAgLyoqCisgICAgICogUmV0dXJucyBkZXZpY2UgbGlzdCB3aXRoIGl0IHByb3BlcnRpZXMuCisgICAgICogQHNlZSBhdmRldmljZV9saXN0X2RldmljZXMoKSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqLworICAgIGludCAoKmdldF9kZXZpY2VfbGlzdCkoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgc3RydWN0IEFWRGV2aWNlSW5mb0xpc3QgKmRldmljZV9saXN0KTsKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGRldmljZSBjYXBhYmlsaXRpZXMgc3VibW9kdWxlLgorICAgICAqIEBzZWUgYXZkZXZpY2VfY2FwYWJpbGl0aWVzX2NyZWF0ZSgpIGZvciBtb3JlIGRldGFpbHMuCisgICAgICovCisgICAgaW50ICgqY3JlYXRlX2RldmljZV9jYXBhYmlsaXRpZXMpKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIHN0cnVjdCBBVkRldmljZUNhcGFiaWxpdGllc1F1ZXJ5ICpjYXBzKTsKKyAgICAvKioKKyAgICAgKiBGcmVlIGRldmljZSBjYXBhYmlsaXRpZXMgc3VibW9kdWxlLgorICAgICAqIEBzZWUgYXZkZXZpY2VfY2FwYWJpbGl0aWVzX2ZyZWUoKSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqLworICAgIGludCAoKmZyZWVfZGV2aWNlX2NhcGFiaWxpdGllcykoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgc3RydWN0IEFWRGV2aWNlQ2FwYWJpbGl0aWVzUXVlcnkgKmNhcHMpOworfSBBVk91dHB1dEZvcm1hdDsKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIGxhdmZfZGVjb2RpbmcKKyAqIEB7CisgKi8KK3R5cGVkZWYgc3RydWN0IEFWSW5wdXRGb3JtYXQgeworICAgIC8qKgorICAgICAqIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc2hvcnQgbmFtZXMgZm9yIHRoZSBmb3JtYXQuIE5ldyBuYW1lcworICAgICAqIG1heSBiZSBhcHBlbmRlZCB3aXRoIGEgbWlub3IgYnVtcC4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIGZvcm1hdCwgbWVhbnQgdG8gYmUgbW9yZSBodW1hbi1yZWFkYWJsZQorICAgICAqIHRoYW4gbmFtZS4gWW91IHNob3VsZCB1c2UgdGhlIE5VTExfSUZfQ09ORklHX1NNQUxMKCkgbWFjcm8KKyAgICAgKiB0byBkZWZpbmUgaXQuCisgICAgICovCisgICAgY29uc3QgY2hhciAqbG9uZ19uYW1lOworCisgICAgLyoqCisgICAgICogQ2FuIHVzZSBmbGFnczogQVZGTVRfTk9GSUxFLCBBVkZNVF9ORUVETlVNQkVSLCBBVkZNVF9TSE9XX0lEUywKKyAgICAgKiBBVkZNVF9HRU5FUklDX0lOREVYLCBBVkZNVF9UU19ESVNDT05ULCBBVkZNVF9OT0JJTlNFQVJDSCwKKyAgICAgKiBBVkZNVF9OT0dFTlNFQVJDSCwgQVZGTVRfTk9fQllURV9TRUVLLCBBVkZNVF9TRUVLX1RPX1BUUy4KKyAgICAgKi8KKyAgICBpbnQgZmxhZ3M7CisKKyAgICAvKioKKyAgICAgKiBJZiBleHRlbnNpb25zIGFyZSBkZWZpbmVkLCB0aGVuIG5vIHByb2JlIGlzIGRvbmUuIFlvdSBzaG91bGQKKyAgICAgKiB1c3VhbGx5IG5vdCB1c2UgZXh0ZW5zaW9uIGZvcm1hdCBndWVzc2luZyBiZWNhdXNlIGl0IGlzIG5vdAorICAgICAqIHJlbGlhYmxlIGVub3VnaAorICAgICAqLworICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnM7CisKKyAgICBjb25zdCBzdHJ1Y3QgQVZDb2RlY1RhZyAqIGNvbnN0ICpjb2RlY190YWc7CisKKyAgICBjb25zdCBBVkNsYXNzICpwcml2X2NsYXNzOyAvLy88IEFWQ2xhc3MgZm9yIHRoZSBwcml2YXRlIGNvbnRleHQKKworICAgIC8qKgorICAgICAqIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1pbWUgdHlwZXMuCisgICAgICogSXQgaXMgdXNlZCBjaGVjayBmb3IgbWF0Y2hpbmcgbWltZSB0eXBlcyB3aGlsZSBwcm9iaW5nLgorICAgICAqIEBzZWUgYXZfcHJvYmVfaW5wdXRfZm9ybWF0MgorICAgICAqLworICAgIGNvbnN0IGNoYXIgKm1pbWVfdHlwZTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIE5vIGZpZWxkcyBiZWxvdyB0aGlzIGxpbmUgYXJlIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuIFRoZXkKKyAgICAgKiBtYXkgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiBsaWJhdmZvcm1hdCBhbmQgY2FuIGJlIGNoYW5nZWQgYW5kCisgICAgICogcmVtb3ZlZCBhdCB3aWxsLgorICAgICAqIE5ldyBwdWJsaWMgZmllbGRzIHNob3VsZCBiZSBhZGRlZCByaWdodCBhYm92ZS4KKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKyAgICBzdHJ1Y3QgQVZJbnB1dEZvcm1hdCAqbmV4dDsKKworICAgIC8qKgorICAgICAqIFJhdyBkZW11eGVycyBzdG9yZSB0aGVpciBjb2RlYyBJRCBoZXJlLgorICAgICAqLworICAgIGludCByYXdfY29kZWNfaWQ7CisKKyAgICAvKioKKyAgICAgKiBTaXplIG9mIHByaXZhdGUgZGF0YSBzbyB0aGF0IGl0IGNhbiBiZSBhbGxvY2F0ZWQgaW4gdGhlIHdyYXBwZXIuCisgICAgICovCisgICAgaW50IHByaXZfZGF0YV9zaXplOworCisgICAgLyoqCisgICAgICogVGVsbCBpZiBhIGdpdmVuIGZpbGUgaGFzIGEgY2hhbmNlIG9mIGJlaW5nIHBhcnNlZCBhcyB0aGlzIGZvcm1hdC4KKyAgICAgKiBUaGUgYnVmZmVyIHByb3ZpZGVkIGlzIGd1YXJhbnRlZWQgdG8gYmUgQVZQUk9CRV9QQURESU5HX1NJWkUgYnl0ZXMKKyAgICAgKiBiaWcgc28geW91IGRvIG5vdCBoYXZlIHRvIGNoZWNrIGZvciB0aGF0IHVubGVzcyB5b3UgbmVlZCBtb3JlLgorICAgICAqLworICAgIGludCAoKnJlYWRfcHJvYmUpKEFWUHJvYmVEYXRhICopOworCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgZm9ybWF0IGhlYWRlciBhbmQgaW5pdGlhbGl6ZSB0aGUgQVZGb3JtYXRDb250ZXh0CisgICAgICogc3RydWN0dXJlLiBSZXR1cm4gMCBpZiBPSy4gT25seSB1c2VkIGluIHJhdyBmb3JtYXQgcmlnaHQKKyAgICAgKiBub3cuICdhdmZvcm1hdF9uZXdfc3RyZWFtJyBzaG91bGQgYmUgY2FsbGVkIHRvIGNyZWF0ZSBuZXcgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBpbnQgKCpyZWFkX2hlYWRlcikoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqKTsKKworICAgIC8qKgorICAgICAqIFJlYWQgb25lIHBhY2tldCBhbmQgcHV0IGl0IGluICdwa3QnLiBwdHMgYW5kIGZsYWdzIGFyZSBhbHNvCisgICAgICogc2V0LiAnYXZmb3JtYXRfbmV3X3N0cmVhbScgY2FuIGJlIGNhbGxlZCBvbmx5IGlmIHRoZSBmbGFnCisgICAgICogQVZGTVRDVFhfTk9IRUFERVIgaXMgdXNlZCBhbmQgb25seSBpbiB0aGUgY2FsbGluZyB0aHJlYWQgKG5vdCBpbiBhCisgICAgICogYmFja2dyb3VuZCB0aHJlYWQpLgorICAgICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8IDAgb24gZXJyb3IuCisgICAgICogICAgICAgICBXaGVuIHJldHVybmluZyBhbiBlcnJvciwgcGt0IG11c3Qgbm90IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKyAgICAgKiAgICAgICAgIG9yIG11c3QgYmUgZnJlZWQgYmVmb3JlIHJldHVybmluZworICAgICAqLworICAgIGludCAoKnJlYWRfcGFja2V0KShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICosIEFWUGFja2V0ICpwa3QpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHN0cmVhbS4gVGhlIEFWRm9ybWF0Q29udGV4dCBhbmQgQVZTdHJlYW1zIGFyZSBub3QKKyAgICAgKiBmcmVlZCBieSB0aGlzIGZ1bmN0aW9uCisgICAgICovCisgICAgaW50ICgqcmVhZF9jbG9zZSkoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqKTsKKworICAgIC8qKgorICAgICAqIFNlZWsgdG8gYSBnaXZlbiB0aW1lc3RhbXAgcmVsYXRpdmUgdG8gdGhlIGZyYW1lcyBpbgorICAgICAqIHN0cmVhbSBjb21wb25lbnQgc3RyZWFtX2luZGV4LgorICAgICAqIEBwYXJhbSBzdHJlYW1faW5kZXggTXVzdCBub3QgYmUgLTEuCisgICAgICogQHBhcmFtIGZsYWdzIFNlbGVjdHMgd2hpY2ggZGlyZWN0aW9uIHNob3VsZCBiZSBwcmVmZXJyZWQgaWYgbm8gZXhhY3QKKyAgICAgKiAgICAgICAgICAgICAgbWF0Y2ggaXMgYXZhaWxhYmxlLgorICAgICAqIEByZXR1cm4gPj0gMCBvbiBzdWNjZXNzIChidXQgbm90IG5lY2Vzc2FyaWx5IHRoZSBuZXcgb2Zmc2V0KQorICAgICAqLworICAgIGludCAoKnJlYWRfc2Vlaykoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5leHQgdGltZXN0YW1wIGluIHN0cmVhbVtzdHJlYW1faW5kZXhdLnRpbWVfYmFzZSB1bml0cy4KKyAgICAgKiBAcmV0dXJuIHRoZSB0aW1lc3RhbXAgb3IgQVZfTk9QVFNfVkFMVUUgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgICAgKi8KKyAgICBpbnQ2NF90ICgqcmVhZF90aW1lc3RhbXApKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpwb3MsIGludDY0X3QgcG9zX2xpbWl0KTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0L3Jlc3VtZSBwbGF5aW5nIC0gb25seSBtZWFuaW5nZnVsIGlmIHVzaW5nIGEgbmV0d29yay1iYXNlZCBmb3JtYXQKKyAgICAgKiAoUlRTUCkuCisgICAgICovCisgICAgaW50ICgqcmVhZF9wbGF5KShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICopOworCisgICAgLyoqCisgICAgICogUGF1c2UgcGxheWluZyAtIG9ubHkgbWVhbmluZ2Z1bCBpZiB1c2luZyBhIG5ldHdvcmstYmFzZWQgZm9ybWF0CisgICAgICogKFJUU1ApLgorICAgICAqLworICAgIGludCAoKnJlYWRfcGF1c2UpKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKik7CisKKyAgICAvKioKKyAgICAgKiBTZWVrIHRvIHRpbWVzdGFtcCB0cy4KKyAgICAgKiBTZWVraW5nIHdpbGwgYmUgZG9uZSBzbyB0aGF0IHRoZSBwb2ludCBmcm9tIHdoaWNoIGFsbCBhY3RpdmUgc3RyZWFtcworICAgICAqIGNhbiBiZSBwcmVzZW50ZWQgc3VjY2Vzc2Z1bGx5IHdpbGwgYmUgY2xvc2VzdCB0byB0cyBhbmQgd2l0aGluIG1pbi9tYXhfdHMuCisgICAgICogQWN0aXZlIHN0cmVhbXMgYXJlIGFsbCBzdHJlYW1zIHRoYXQgaGF2ZSBBVlN0cmVhbS5kaXNjYXJkIDwgQVZESVNDQVJEX0FMTC4KKyAgICAgKi8KKyAgICBpbnQgKCpyZWFkX3NlZWsyKShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LCBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRldmljZSBsaXN0IHdpdGggaXQgcHJvcGVydGllcy4KKyAgICAgKiBAc2VlIGF2ZGV2aWNlX2xpc3RfZGV2aWNlcygpIGZvciBtb3JlIGRldGFpbHMuCisgICAgICovCisgICAgaW50ICgqZ2V0X2RldmljZV9saXN0KShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBzdHJ1Y3QgQVZEZXZpY2VJbmZvTGlzdCAqZGV2aWNlX2xpc3QpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBkZXZpY2UgY2FwYWJpbGl0aWVzIHN1Ym1vZHVsZS4KKyAgICAgKiBAc2VlIGF2ZGV2aWNlX2NhcGFiaWxpdGllc19jcmVhdGUoKSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqLworICAgIGludCAoKmNyZWF0ZV9kZXZpY2VfY2FwYWJpbGl0aWVzKShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBzdHJ1Y3QgQVZEZXZpY2VDYXBhYmlsaXRpZXNRdWVyeSAqY2Fwcyk7CisKKyAgICAvKioKKyAgICAgKiBGcmVlIGRldmljZSBjYXBhYmlsaXRpZXMgc3VibW9kdWxlLgorICAgICAqIEBzZWUgYXZkZXZpY2VfY2FwYWJpbGl0aWVzX2ZyZWUoKSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqLworICAgIGludCAoKmZyZWVfZGV2aWNlX2NhcGFiaWxpdGllcykoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgc3RydWN0IEFWRGV2aWNlQ2FwYWJpbGl0aWVzUXVlcnkgKmNhcHMpOworfSBBVklucHV0Rm9ybWF0OworLyoqCisgKiBAfQorICovCisKK2VudW0gQVZTdHJlYW1QYXJzZVR5cGUgeworICAgIEFWU1RSRUFNX1BBUlNFX05PTkUsCisgICAgQVZTVFJFQU1fUEFSU0VfRlVMTCwgICAgICAgLyoqPCBmdWxsIHBhcnNpbmcgYW5kIHJlcGFjayAqLworICAgIEFWU1RSRUFNX1BBUlNFX0hFQURFUlMsICAgIC8qKjwgT25seSBwYXJzZSBoZWFkZXJzLCBkbyBub3QgcmVwYWNrLiAqLworICAgIEFWU1RSRUFNX1BBUlNFX1RJTUVTVEFNUFMsIC8qKjwgZnVsbCBwYXJzaW5nIGFuZCBpbnRlcnBvbGF0aW9uIG9mIHRpbWVzdGFtcHMgZm9yIGZyYW1lcyBub3Qgc3RhcnRpbmcgb24gYSBwYWNrZXQgYm91bmRhcnkgKi8KKyAgICBBVlNUUkVBTV9QQVJTRV9GVUxMX09OQ0UsICAvKio8IGZ1bGwgcGFyc2luZyBhbmQgcmVwYWNrIG9mIHRoZSBmaXJzdCBmcmFtZSBvbmx5LCBvbmx5IGltcGxlbWVudGVkIGZvciBILjI2NCBjdXJyZW50bHkgKi8KKyAgICBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVz1NS1RBRygwLCdSJywnQScsJ1cnKSwgICAgICAgLyoqPCBmdWxsIHBhcnNpbmcgYW5kIHJlcGFjayB3aXRoIHRpbWVzdGFtcCBhbmQgcG9zaXRpb24gZ2VuZXJhdGlvbiBieSBwYXJzZXIgZm9yIHJhdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYXNzdW1lcyB0aGF0IGVhY2ggcGFja2V0IGluIHRoZSBmaWxlIGNvbnRhaW5zIG5vIGRlbXV4ZXIgbGV2ZWwgaGVhZGVycyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IGNvZGVjIGxldmVsIGRhdGEsIG90aGVyd2lzZSBwb3NpdGlvbiBnZW5lcmF0aW9uIHdvdWxkIGZhaWwgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IEFWSW5kZXhFbnRyeSB7CisgICAgaW50NjRfdCBwb3M7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7ICAgICAgICAvKio8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaW1lc3RhbXAgaW4gQVZTdHJlYW0udGltZV9iYXNlIHVuaXRzLCBwcmVmZXJhYmx5IHRoZSB0aW1lIGZyb20gd2hpY2ggb24gY29ycmVjdGx5IGRlY29kZWQgZnJhbWVzIGFyZSBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZW4gc2Vla2luZyB0byB0aGlzIGVudHJ5LiBUaGF0IG1lYW5zIHByZWZlcmFibGUgUFRTIG9uIGtleWZyYW1lIGJhc2VkIGZvcm1hdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBCdXQgZGVtdXhlcnMgY2FuIGNob29zZSB0byBzdG9yZSBhIGRpZmZlcmVudCB0aW1lc3RhbXAsIGlmIGl0IGlzIG1vcmUgY29udmVuaWVudCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9yIG5vdGhpbmcgYmV0dGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBrbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFWSU5ERVhfS0VZRlJBTUUgMHgwMDAxCisgICAgaW50IGZsYWdzOjI7CisgICAgaW50IHNpemU6MzA7IC8vWWVhaCwgdHJ5aW5nIHRvIGtlZXAgdGhlIHNpemUgb2YgdGhpcyBzbWFsbCB0byByZWR1Y2UgbWVtb3J5IHJlcXVpcmVtZW50cyAoaXQgaXMgMjQgdnMuIDMyIGJ5dGVzIGR1ZSB0byBwb3NzaWJsZSA4LWJ5dGUgYWxpZ25tZW50KS4KKyAgICBpbnQgbWluX2Rpc3RhbmNlOyAgICAgICAgIC8qKjwgTWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHRoZSBwcmV2aW91cyBrZXlmcmFtZSwgdXNlZCB0byBhdm9pZCB1bm5lZWRlZCBzZWFyY2hpbmcuICovCit9IEFWSW5kZXhFbnRyeTsKKworI2RlZmluZSBBVl9ESVNQT1NJVElPTl9ERUZBVUxUICAgMHgwMDAxCisjZGVmaW5lIEFWX0RJU1BPU0lUSU9OX0RVQiAgICAgICAweDAwMDIKKyNkZWZpbmUgQVZfRElTUE9TSVRJT05fT1JJR0lOQUwgIDB4MDAwNAorI2RlZmluZSBBVl9ESVNQT1NJVElPTl9DT01NRU5UICAgMHgwMDA4CisjZGVmaW5lIEFWX0RJU1BPU0lUSU9OX0xZUklDUyAgICAweDAwMTAKKyNkZWZpbmUgQVZfRElTUE9TSVRJT05fS0FSQU9LRSAgIDB4MDAyMAorCisvKioKKyAqIFRyYWNrIHNob3VsZCBiZSB1c2VkIGR1cmluZyBwbGF5YmFjayBieSBkZWZhdWx0LgorICogVXNlZnVsIGZvciBzdWJ0aXRsZSB0cmFjayB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQKKyAqIGV2ZW4gd2hlbiB1c2VyIGRpZCBub3QgZXhwbGljaXRseSBhc2sgZm9yIHN1YnRpdGxlcy4KKyAqLworI2RlZmluZSBBVl9ESVNQT1NJVElPTl9GT1JDRUQgICAgMHgwMDQwCisjZGVmaW5lIEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQgIDB4MDA4MCAgLyoqPCBzdHJlYW0gZm9yIGhlYXJpbmcgaW1wYWlyZWQgYXVkaWVuY2VzICovCisjZGVmaW5lIEFWX0RJU1BPU0lUSU9OX1ZJU1VBTF9JTVBBSVJFRCAgIDB4MDEwMCAgLyoqPCBzdHJlYW0gZm9yIHZpc3VhbCBpbXBhaXJlZCBhdWRpZW5jZXMgKi8KKyNkZWZpbmUgQVZfRElTUE9TSVRJT05fQ0xFQU5fRUZGRUNUUyAgICAgMHgwMjAwICAvKio8IHN0cmVhbSB3aXRob3V0IHZvaWNlICovCisvKioKKyAqIFRoZSBzdHJlYW0gaXMgc3RvcmVkIGluIHRoZSBmaWxlIGFzIGFuIGF0dGFjaGVkIHBpY3R1cmUvImNvdmVyIGFydCIgKGUuZy4KKyAqIEFQSUMgZnJhbWUgaW4gSUQzdjIpLiBUaGUgc2luZ2xlIHBhY2tldCBhc3NvY2lhdGVkIHdpdGggaXQgd2lsbCBiZSByZXR1cm5lZAorICogYW1vbmcgdGhlIGZpcnN0IGZldyBwYWNrZXRzIHJlYWQgZnJvbSB0aGUgZmlsZSB1bmxlc3Mgc2Vla2luZyB0YWtlcyBwbGFjZS4KKyAqIEl0IGNhbiBhbHNvIGJlIGFjY2Vzc2VkIGF0IGFueSB0aW1lIGluIEFWU3RyZWFtLmF0dGFjaGVkX3BpYy4KKyAqLworI2RlZmluZSBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUMgICAgICAweDA0MDAKKworLyoqCisgKiBUbyBzcGVjaWZ5IHRleHQgdHJhY2sga2luZCAoZGlmZmVyZW50IGZyb20gc3VidGl0bGVzIGRlZmF1bHQpLgorICovCisjZGVmaW5lIEFWX0RJU1BPU0lUSU9OX0NBUFRJT05TICAgICAweDEwMDAwCisjZGVmaW5lIEFWX0RJU1BPU0lUSU9OX0RFU0NSSVBUSU9OUyAweDIwMDAwCisjZGVmaW5lIEFWX0RJU1BPU0lUSU9OX01FVEFEQVRBICAgICAweDQwMDAwCisKKy8qKgorICogT3B0aW9ucyBmb3IgYmVoYXZpb3Igb24gdGltZXN0YW1wIHdyYXAgZGV0ZWN0aW9uLgorICovCisjZGVmaW5lIEFWX1BUU19XUkFQX0lHTk9SRSAgICAgIDAgICAvLy88IGlnbm9yZSB0aGUgd3JhcAorI2RlZmluZSBBVl9QVFNfV1JBUF9BRERfT0ZGU0VUICAxICAgLy8vPCBhZGQgdGhlIGZvcm1hdCBzcGVjaWZpYyBvZmZzZXQgb24gd3JhcCBkZXRlY3Rpb24KKyNkZWZpbmUgQVZfUFRTX1dSQVBfU1VCX09GRlNFVCAgLTEgIC8vLzwgc3VidHJhY3QgdGhlIGZvcm1hdCBzcGVjaWZpYyBvZmZzZXQgb24gd3JhcCBkZXRlY3Rpb24KKworLyoqCisgKiBTdHJlYW0gc3RydWN0dXJlLgorICogTmV3IGZpZWxkcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGVuZCB3aXRoIG1pbm9yIHZlcnNpb24gYnVtcHMuCisgKiBSZW1vdmFsLCByZW9yZGVyaW5nIGFuZCBjaGFuZ2VzIHRvIGV4aXN0aW5nIGZpZWxkcyByZXF1aXJlIGEgbWFqb3IKKyAqIHZlcnNpb24gYnVtcC4KKyAqIHNpemVvZihBVlN0cmVhbSkgbXVzdCBub3QgYmUgdXNlZCBvdXRzaWRlIGxpYmF2Ki4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZTdHJlYW0geworICAgIGludCBpbmRleDsgICAgLyoqPCBzdHJlYW0gaW5kZXggaW4gQVZGb3JtYXRDb250ZXh0ICovCisgICAgLyoqCisgICAgICogRm9ybWF0LXNwZWNpZmljIHN0cmVhbSBJRC4KKyAgICAgKiBkZWNvZGluZzogc2V0IGJ5IGxpYmF2Zm9ybWF0CisgICAgICogZW5jb2Rpbmc6IHNldCBieSB0aGUgdXNlciwgcmVwbGFjZWQgYnkgbGliYXZmb3JtYXQgaWYgbGVmdCB1bnNldAorICAgICAqLworICAgIGludCBpZDsKKyAgICAvKioKKyAgICAgKiBDb2RlYyBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmVhbS4gQWxsb2NhdGVkIGFuZCBmcmVlZCBieQorICAgICAqIGxpYmF2Zm9ybWF0LgorICAgICAqCisgICAgICogLSBkZWNvZGluZzogVGhlIGRlbXV4ZXIgZXhwb3J0cyBjb2RlYyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGhlYWRlcnMKKyAgICAgKiAgICAgICAgICAgICBoZXJlLgorICAgICAqIC0gZW5jb2Rpbmc6IFRoZSB1c2VyIHNldHMgY29kZWMgaW5mb3JtYXRpb24sIHRoZSBtdXhlciB3cml0ZXMgaXQgdG8gdGhlCisgICAgICogICAgICAgICAgICAgb3V0cHV0LiBNYW5kYXRvcnkgZmllbGRzIGFzIHNwZWNpZmllZCBpbiBBVkNvZGVjQ29udGV4dAorICAgICAqICAgICAgICAgICAgIGRvY3VtZW50YXRpb24gbXVzdCBiZSBzZXQgZXZlbiBpZiB0aGlzIEFWQ29kZWNDb250ZXh0IGlzCisgICAgICogICAgICAgICAgICAgbm90IGFjdHVhbGx5IHVzZWQgZm9yIGVuY29kaW5nLgorICAgICAqLworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYzsKKyAgICB2b2lkICpwcml2X2RhdGE7CisKKyNpZiBGRl9BUElfTEFWRl9GUkFDCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdGhpcyBmaWVsZCBpcyB1bnVzZWQKKyAgICAgKi8KKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorICAgIHN0cnVjdCBBVkZyYWMgcHRzOworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBmdW5kYW1lbnRhbCB1bml0IG9mIHRpbWUgKGluIHNlY29uZHMpIGluIHRlcm1zCisgICAgICogb2Ygd2hpY2ggZnJhbWUgdGltZXN0YW1wcyBhcmUgcmVwcmVzZW50ZWQuCisgICAgICoKKyAgICAgKiBkZWNvZGluZzogc2V0IGJ5IGxpYmF2Zm9ybWF0CisgICAgICogZW5jb2Rpbmc6IE1heSBiZSBzZXQgYnkgdGhlIGNhbGxlciBiZWZvcmUgYXZmb3JtYXRfd3JpdGVfaGVhZGVyKCkgdG8KKyAgICAgKiAgICAgICAgICAgcHJvdmlkZSBhIGhpbnQgdG8gdGhlIG11eGVyIGFib3V0IHRoZSBkZXNpcmVkIHRpbWViYXNlLiBJbgorICAgICAqICAgICAgICAgICBhdmZvcm1hdF93cml0ZV9oZWFkZXIoKSwgdGhlIG11eGVyIHdpbGwgb3ZlcndyaXRlIHRoaXMgZmllbGQKKyAgICAgKiAgICAgICAgICAgd2l0aCB0aGUgdGltZWJhc2UgdGhhdCB3aWxsIGFjdHVhbGx5IGJlIHVzZWQgZm9yIHRoZSB0aW1lc3RhbXBzCisgICAgICogICAgICAgICAgIHdyaXR0ZW4gaW50byB0aGUgZmlsZSAod2hpY2ggbWF5IG9yIG1heSBub3QgYmUgcmVsYXRlZCB0byB0aGUKKyAgICAgKiAgICAgICAgICAgdXNlci1wcm92aWRlZCBvbmUsIGRlcGVuZGluZyBvbiB0aGUgZm9ybWF0KS4KKyAgICAgKi8KKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsKKworICAgIC8qKgorICAgICAqIERlY29kaW5nOiBwdHMgb2YgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSBzdHJlYW0gaW4gcHJlc2VudGF0aW9uIG9yZGVyLCBpbiBzdHJlYW0gdGltZSBiYXNlLgorICAgICAqIE9ubHkgc2V0IHRoaXMgaWYgeW91IGFyZSBhYnNvbHV0ZWx5IDEwMCUgc3VyZSB0aGF0IHRoZSB2YWx1ZSB5b3Ugc2V0CisgICAgICogaXQgdG8gcmVhbGx5IGlzIHRoZSBwdHMgb2YgdGhlIGZpcnN0IGZyYW1lLgorICAgICAqIFRoaXMgbWF5IGJlIHVuZGVmaW5lZCAoQVZfTk9QVFNfVkFMVUUpLgorICAgICAqIEBub3RlIFRoZSBBU0YgaGVhZGVyIGRvZXMgTk9UIGNvbnRhaW4gYSBjb3JyZWN0IHN0YXJ0X3RpbWUgdGhlIEFTRgorICAgICAqIGRlbXV4ZXIgbXVzdCBOT1Qgc2V0IHRoaXMuCisgICAgICovCisgICAgaW50NjRfdCBzdGFydF90aW1lOworCisgICAgLyoqCisgICAgICogRGVjb2Rpbmc6IGR1cmF0aW9uIG9mIHRoZSBzdHJlYW0sIGluIHN0cmVhbSB0aW1lIGJhc2UuCisgICAgICogSWYgYSBzb3VyY2UgZmlsZSBkb2VzIG5vdCBzcGVjaWZ5IGEgZHVyYXRpb24sIGJ1dCBkb2VzIHNwZWNpZnkKKyAgICAgKiBhIGJpdHJhdGUsIHRoaXMgdmFsdWUgd2lsbCBiZSBlc3RpbWF0ZWQgZnJvbSBiaXRyYXRlIGFuZCBmaWxlIHNpemUuCisgICAgICovCisgICAgaW50NjRfdCBkdXJhdGlvbjsKKworICAgIGludDY0X3QgbmJfZnJhbWVzOyAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgZnJhbWVzIGluIHRoaXMgc3RyZWFtIGlmIGtub3duIG9yIDAKKworICAgIGludCBkaXNwb3NpdGlvbjsgLyoqPCBBVl9ESVNQT1NJVElPTl8qIGJpdCBmaWVsZCAqLworCisgICAgZW51bSBBVkRpc2NhcmQgZGlzY2FyZDsgLy8vPCBTZWxlY3RzIHdoaWNoIHBhY2tldHMgY2FuIGJlIGRpc2NhcmRlZCBhdCB3aWxsIGFuZCBkbyBub3QgbmVlZCB0byBiZSBkZW11eGVkLgorCisgICAgLyoqCisgICAgICogc2FtcGxlIGFzcGVjdCByYXRpbyAoMCBpZiB1bmtub3duKQorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmZvcm1hdC4KKyAgICAgKi8KKyAgICBBVlJhdGlvbmFsIHNhbXBsZV9hc3BlY3RfcmF0aW87CisKKyAgICBBVkRpY3Rpb25hcnkgKm1ldGFkYXRhOworCisgICAgLyoqCisgICAgICogQXZlcmFnZSBmcmFtZXJhdGUKKyAgICAgKgorICAgICAqIC0gZGVtdXhpbmc6IE1heSBiZSBzZXQgYnkgbGliYXZmb3JtYXQgd2hlbiBjcmVhdGluZyB0aGUgc3RyZWFtIG9yIGluCisgICAgICogICAgICAgICAgICAgYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbygpLgorICAgICAqIC0gbXV4aW5nOiBNYXkgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgYmVmb3JlIGF2Zm9ybWF0X3dyaXRlX2hlYWRlcigpLgorICAgICAqLworICAgIEFWUmF0aW9uYWwgYXZnX2ZyYW1lX3JhdGU7CisKKyAgICAvKioKKyAgICAgKiBGb3Igc3RyZWFtcyB3aXRoIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQyBkaXNwb3NpdGlvbiwgdGhpcyBwYWNrZXQKKyAgICAgKiB3aWxsIGNvbnRhaW4gdGhlIGF0dGFjaGVkIHBpY3R1cmUuCisgICAgICoKKyAgICAgKiBkZWNvZGluZzogc2V0IGJ5IGxpYmF2Zm9ybWF0LCBtdXN0IG5vdCBiZSBtb2RpZmllZCBieSB0aGUgY2FsbGVyLgorICAgICAqIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBBVlBhY2tldCBhdHRhY2hlZF9waWM7CisKKyAgICAvKioKKyAgICAgKiBBbiBhcnJheSBvZiBzaWRlIGRhdGEgdGhhdCBhcHBsaWVzIHRvIHRoZSB3aG9sZSBzdHJlYW0gKGkuZS4gdGhlCisgICAgICogY29udGFpbmVyIGRvZXMgbm90IGFsbG93IGl0IHRvIGNoYW5nZSBiZXR3ZWVuIHBhY2tldHMpLgorICAgICAqCisgICAgICogVGhlcmUgbWF5IGJlIG5vIG92ZXJsYXAgYmV0d2VlbiB0aGUgc2lkZSBkYXRhIGluIHRoaXMgYXJyYXkgYW5kIHNpZGUgZGF0YQorICAgICAqIGluIHRoZSBwYWNrZXRzLiBJLmUuIGEgZ2l2ZW4gc2lkZSBkYXRhIGlzIGVpdGhlciBleHBvcnRlZCBieSB0aGUgbXV4ZXIKKyAgICAgKiAoZGVtdXhpbmcpIC8gc2V0IGJ5IHRoZSBjYWxsZXIgKG11eGluZykgaW4gdGhpcyBhcnJheSwgdGhlbiBpdCBuZXZlcgorICAgICAqIGFwcGVhcnMgaW4gdGhlIHBhY2tldHMsIG9yIHRoZSBzaWRlIGRhdGEgaXMgZXhwb3J0ZWQgLyBzZW50IHRocm91Z2gKKyAgICAgKiB0aGUgcGFja2V0cyAoYWx3YXlzIGluIHRoZSBmaXJzdCBwYWNrZXQgd2hlcmUgdGhlIHZhbHVlIGJlY29tZXMga25vd24gb3IKKyAgICAgKiBjaGFuZ2VzKSwgdGhlbiBpdCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhpcyBhcnJheS4KKyAgICAgKgorICAgICAqIC0gZGVtdXhpbmc6IFNldCBieSBsaWJhdmZvcm1hdCB3aGVuIHRoZSBzdHJlYW0gaXMgY3JlYXRlZC4KKyAgICAgKiAtIG11eGluZzogTWF5IGJlIHNldCBieSB0aGUgY2FsbGVyIGJlZm9yZSBhdmZvcm1hdF93cml0ZV9oZWFkZXIoKS4KKyAgICAgKgorICAgICAqIEZyZWVkIGJ5IGxpYmF2Zm9ybWF0IGluIGF2Zm9ybWF0X2ZyZWVfY29udGV4dCgpLgorICAgICAqCisgICAgICogQHNlZSBhdl9mb3JtYXRfaW5qZWN0X2dsb2JhbF9zaWRlX2RhdGEoKQorICAgICAqLworICAgIEFWUGFja2V0U2lkZURhdGEgKnNpZGVfZGF0YTsKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBBVlN0cmVhbS5zaWRlX2RhdGEgYXJyYXkuCisgICAgICovCisgICAgaW50ICAgICAgICAgICAgbmJfc2lkZV9kYXRhOworCisgICAgLyoqCisgICAgICogRmxhZ3MgZm9yIHRoZSB1c2VyIHRvIGRldGVjdCBldmVudHMgaGFwcGVuaW5nIG9uIHRoZSBzdHJlYW0uIEZsYWdzIG11c3QKKyAgICAgKiBiZSBjbGVhcmVkIGJ5IHRoZSB1c2VyIG9uY2UgdGhlIGV2ZW50IGhhcyBiZWVuIGhhbmRsZWQuCisgICAgICogQSBjb21iaW5hdGlvbiBvZiBBVlNUUkVBTV9FVkVOVF9GTEFHXyouCisgICAgICovCisgICAgaW50IGV2ZW50X2ZsYWdzOworI2RlZmluZSBBVlNUUkVBTV9FVkVOVF9GTEFHX01FVEFEQVRBX1VQREFURUQgMHgwMDAxIC8vLzwgVGhlIGNhbGwgcmVzdWx0ZWQgaW4gdXBkYXRlZCBtZXRhZGF0YS4KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEFsbCBmaWVsZHMgYmVsb3cgdGhpcyBsaW5lIGFyZSBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSS4gVGhleQorICAgICAqIG1heSBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGxpYmF2Zm9ybWF0IGFuZCBjYW4gYmUgY2hhbmdlZCBhbmQKKyAgICAgKiByZW1vdmVkIGF0IHdpbGwuCisgICAgICogTmV3IHB1YmxpYyBmaWVsZHMgc2hvdWxkIGJlIGFkZGVkIHJpZ2h0IGFib3ZlLgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworCisgICAgLyoqCisgICAgICogU3RyZWFtIGluZm9ybWF0aW9uIHVzZWQgaW50ZXJuYWxseSBieSBhdl9maW5kX3N0cmVhbV9pbmZvKCkKKyAgICAgKi8KKyNkZWZpbmUgTUFYX1NURF9USU1FQkFTRVMgKDMwKjEyKzcrNikKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQ2NF90IGxhc3RfZHRzOworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uX2djZDsKKyAgICAgICAgaW50IGR1cmF0aW9uX2NvdW50OworICAgICAgICBpbnQ2NF90IHJmcHNfZHVyYXRpb25fc3VtOworICAgICAgICBkb3VibGUgKCpkdXJhdGlvbl9lcnJvcilbMl1bTUFYX1NURF9USU1FQkFTRVNdOworICAgICAgICBpbnQ2NF90IGNvZGVjX2luZm9fZHVyYXRpb247CisgICAgICAgIGludDY0X3QgY29kZWNfaW5mb19kdXJhdGlvbl9maWVsZHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDAgIC0+IGRlY29kZXIgaGFzIG5vdCBiZWVuIHNlYXJjaGVkIGZvciB5ZXQuCisgICAgICAgICAqID4wIC0+IGRlY29kZXIgZm91bmQKKyAgICAgICAgICogPDAgLT4gZGVjb2RlciB3aXRoIGNvZGVjX2lkID09IC1mb3VuZF9kZWNvZGVyIGhhcyBub3QgYmVlbiBmb3VuZAorICAgICAgICAgKi8KKyAgICAgICAgaW50IGZvdW5kX2RlY29kZXI7CisKKyAgICAgICAgaW50NjRfdCBsYXN0X2R1cmF0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaG9zZSBhcmUgdXNlZCBmb3IgYXZlcmFnZSBmcmFtZXJhdGUgZXN0aW1hdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGludDY0X3QgZnBzX2ZpcnN0X2R0czsKKyAgICAgICAgaW50ICAgICBmcHNfZmlyc3RfZHRzX2lkeDsKKyAgICAgICAgaW50NjRfdCBmcHNfbGFzdF9kdHM7CisgICAgICAgIGludCAgICAgZnBzX2xhc3RfZHRzX2lkeDsKKworICAgIH0gKmluZm87CisKKyAgICBpbnQgcHRzX3dyYXBfYml0czsgLyoqPCBudW1iZXIgb2YgYml0cyBpbiBwdHMgKHVzZWQgZm9yIHdyYXBwaW5nIGNvbnRyb2wpICovCisKKyAgICAvLyBUaW1lc3RhbXAgZ2VuZXJhdGlvbiBzdXBwb3J0OgorICAgIC8qKgorICAgICAqIFRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0IGR0cyBzeW5jIHBvaW50LgorICAgICAqCisgICAgICogSW5pdGlhbGl6ZWQgd2hlbiBBVkNvZGVjUGFyc2VyQ29udGV4dC5kdHNfc3luY19wb2ludCA+PSAwIGFuZAorICAgICAqIGEgRFRTIGlzIHJlY2VpdmVkIGZyb20gdGhlIHVuZGVybHlpbmcgY29udGFpbmVyLiBPdGhlcndpc2Ugc2V0IHRvCisgICAgICogQVZfTk9QVFNfVkFMVUUgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBpbnQ2NF90IGZpcnN0X2R0czsKKyAgICBpbnQ2NF90IGN1cl9kdHM7CisgICAgaW50NjRfdCBsYXN0X0lQX3B0czsKKyAgICBpbnQgbGFzdF9JUF9kdXJhdGlvbjsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBwYWNrZXRzIHRvIGJ1ZmZlciBmb3IgY29kZWMgcHJvYmluZworICAgICAqLworI2RlZmluZSBNQVhfUFJPQkVfUEFDS0VUUyAyNTAwCisgICAgaW50IHByb2JlX3BhY2tldHM7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgZnJhbWVzIHRoYXQgaGF2ZSBiZWVuIGRlbXV4ZWQgZHVyaW5nIGF2X2ZpbmRfc3RyZWFtX2luZm8oKQorICAgICAqLworICAgIGludCBjb2RlY19pbmZvX25iX2ZyYW1lczsKKworICAgIC8qIGF2X3JlYWRfZnJhbWUoKSBzdXBwb3J0ICovCisgICAgZW51bSBBVlN0cmVhbVBhcnNlVHlwZSBuZWVkX3BhcnNpbmc7CisgICAgc3RydWN0IEFWQ29kZWNQYXJzZXJDb250ZXh0ICpwYXJzZXI7CisKKyAgICAvKioKKyAgICAgKiBsYXN0IHBhY2tldCBpbiBwYWNrZXRfYnVmZmVyIGZvciB0aGlzIHN0cmVhbSB3aGVuIG11eGluZy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQVZQYWNrZXRMaXN0ICpsYXN0X2luX3BhY2tldF9idWZmZXI7CisgICAgQVZQcm9iZURhdGEgcHJvYmVfZGF0YTsKKyNkZWZpbmUgTUFYX1JFT1JERVJfREVMQVkgMTYKKyAgICBpbnQ2NF90IHB0c19idWZmZXJbTUFYX1JFT1JERVJfREVMQVkrMV07CisKKyAgICBBVkluZGV4RW50cnkgKmluZGV4X2VudHJpZXM7IC8qKjwgT25seSB1c2VkIGlmIHRoZSBmb3JtYXQgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgc2Vla2luZyBuYXRpdmVseS4gKi8KKyAgICBpbnQgbmJfaW5kZXhfZW50cmllczsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXhfZW50cmllc19hbGxvY2F0ZWRfc2l6ZTsKKworICAgIC8qKgorICAgICAqIFJlYWwgYmFzZSBmcmFtZXJhdGUgb2YgdGhlIHN0cmVhbS4KKyAgICAgKiBUaGlzIGlzIHRoZSBsb3dlc3QgZnJhbWVyYXRlIHdpdGggd2hpY2ggYWxsIHRpbWVzdGFtcHMgY2FuIGJlCisgICAgICogcmVwcmVzZW50ZWQgYWNjdXJhdGVseSAoaXQgaXMgdGhlIGxlYXN0IGNvbW1vbiBtdWx0aXBsZSBvZiBhbGwKKyAgICAgKiBmcmFtZXJhdGVzIGluIHRoZSBzdHJlYW0pLiBOb3RlLCB0aGlzIHZhbHVlIGlzIGp1c3QgYSBndWVzcyEKKyAgICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRpbWUgYmFzZSBpcyAxLzkwMDAwIGFuZCBhbGwgZnJhbWVzIGhhdmUgZWl0aGVyCisgICAgICogYXBwcm94aW1hdGVseSAzNjAwIG9yIDE4MDAgdGltZXIgdGlja3MsIHRoZW4gcl9mcmFtZV9yYXRlIHdpbGwgYmUgNTAvMS4KKyAgICAgKgorICAgICAqIENvZGUgb3V0c2lkZSBhdmZvcm1hdCBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmc6CisgICAgICogYXZfc3RyZWFtX2dldC9zZXRfcl9mcmFtZV9yYXRlKHN0cmVhbSkKKyAgICAgKi8KKyAgICBBVlJhdGlvbmFsIHJfZnJhbWVfcmF0ZTsKKworICAgIC8qKgorICAgICAqIFN0cmVhbSBJZGVudGlmaWVyCisgICAgICogVGhpcyBpcyB0aGUgTVBFRy1UUyBzdHJlYW0gaWRlbnRpZmllciArMQorICAgICAqIDAgbWVhbnMgdW5rbm93bgorICAgICAqLworICAgIGludCBzdHJlYW1faWRlbnRpZmllcjsKKworICAgIGludDY0X3QgaW50ZXJsZWF2ZXJfY2h1bmtfc2l6ZTsKKyAgICBpbnQ2NF90IGludGVybGVhdmVyX2NodW5rX2R1cmF0aW9uOworCisgICAgLyoqCisgICAgICogc3RyZWFtIHByb2Jpbmcgc3RhdGUKKyAgICAgKiAtMSAgIC0+IHByb2JpbmcgZmluaXNoZWQKKyAgICAgKiAgMCAgIC0+IG5vIHByb2JpbmcgcmVxdWVzdGVkCisgICAgICogcmVzdCAtPiBwZXJmb3JtIHByb2Jpbmcgd2l0aCByZXF1ZXN0X3Byb2JlIGJlaW5nIHRoZSBtaW5pbXVtIHNjb3JlIHRvIGFjY2VwdC4KKyAgICAgKiBOT1QgUEFSVCBPRiBQVUJMSUMgQVBJCisgICAgICovCisgICAgaW50IHJlcXVlc3RfcHJvYmU7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgZXZlcnl0aGluZyB1cCB0byB0aGUgbmV4dCBrZXlmcmFtZQorICAgICAqIHNob3VsZCBiZSBkaXNjYXJkZWQuCisgICAgICovCisgICAgaW50IHNraXBfdG9fa2V5ZnJhbWU7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBza2lwIGF0IHRoZSBzdGFydCBvZiB0aGUgZnJhbWUgZGVjb2RlZCBmcm9tIHRoZSBuZXh0IHBhY2tldC4KKyAgICAgKi8KKyAgICBpbnQgc2tpcF9zYW1wbGVzOworCisgICAgLyoqCisgICAgICogSWYgbm90IDAsIHRoZSBmaXJzdCBhdWRpbyBzYW1wbGUgdGhhdCBzaG91bGQgYmUgZGlzY2FyZGVkIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgKiBUaGlzIGlzIGJyb2tlbiBieSBkZXNpZ24gKG5lZWRzIGdsb2JhbCBzYW1wbGUgY291bnQpLCBidXQgY2FuJ3QgYmUKKyAgICAgKiBhdm9pZGVkIGZvciBicm9rZW4gYnkgZGVzaWduIGZvcm1hdHMgc3VjaCBhcyBtcDMgd2l0aCBhZC1ob2MgZ2FwbGVzcworICAgICAqIGF1ZGlvIHN1cHBvcnQuCisgICAgICovCisgICAgaW50NjRfdCBmaXJzdF9kaXNjYXJkX3NhbXBsZTsKKworICAgIC8qKgorICAgICAqIFRoZSBzYW1wbGUgYWZ0ZXIgbGFzdCBzYW1wbGUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNjYXJkZWQgYWZ0ZXIKKyAgICAgKiBmaXJzdF9kaXNjYXJkX3NhbXBsZS4gV29ya3Mgb24gZnJhbWUgYm91bmRhcmllcyBvbmx5LiBVc2VkIHRvIHByZXZlbnQKKyAgICAgKiBlYXJseSBFT0YgaWYgdGhlIGdhcGxlc3MgaW5mbyBpcyBicm9rZW4gKGNvbnNpZGVyZWQgY29uY2F0ZW5hdGVkIG1wM3MpLgorICAgICAqLworICAgIGludDY0X3QgbGFzdF9kaXNjYXJkX3NhbXBsZTsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBpbnRlcm5hbGx5IGRlY29kZWQgZnJhbWVzLCB1c2VkIGludGVybmFsbHkgaW4gbGliYXZmb3JtYXQsIGRvIG5vdCBhY2Nlc3MKKyAgICAgKiBpdHMgbGlmZXRpbWUgZGlmZmVycyBmcm9tIGluZm8gd2hpY2ggaXMgd2h5IGl0IGlzIG5vdCBpbiB0aGF0IHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBpbnQgbmJfZGVjb2RlZF9mcmFtZXM7CisKKyAgICAvKioKKyAgICAgKiBUaW1lc3RhbXAgb2Zmc2V0IGFkZGVkIHRvIHRpbWVzdGFtcHMgYmVmb3JlIG11eGluZworICAgICAqIE5PVCBQQVJUIE9GIFBVQkxJQyBBUEkKKyAgICAgKi8KKyAgICBpbnQ2NF90IG11eF90c19vZmZzZXQ7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBkYXRhIHRvIGNoZWNrIGZvciB3cmFwcGluZyBvZiB0aGUgdGltZSBzdGFtcAorICAgICAqLworICAgIGludDY0X3QgcHRzX3dyYXBfcmVmZXJlbmNlOworCisgICAgLyoqCisgICAgICogT3B0aW9ucyBmb3IgYmVoYXZpb3IsIHdoZW4gYSB3cmFwIGlzIGRldGVjdGVkLgorICAgICAqCisgICAgICogRGVmaW5lZCBieSBBVl9QVFNfV1JBUF8gdmFsdWVzLgorICAgICAqCisgICAgICogSWYgY29ycmVjdGlvbiBpcyBlbmFibGVkLCB0aGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXM6CisgICAgICogSWYgdGhlIGZpcnN0IHRpbWUgc3RhbXAgaXMgbmVhciB0aGUgd3JhcCBwb2ludCwgdGhlIHdyYXAgb2Zmc2V0CisgICAgICogd2lsbCBiZSBzdWJ0cmFjdGVkLCB3aGljaCB3aWxsIGNyZWF0ZSBuZWdhdGl2ZSB0aW1lIHN0YW1wcy4KKyAgICAgKiBPdGhlcndpc2UgdGhlIG9mZnNldCB3aWxsIGJlIGFkZGVkLgorICAgICAqLworICAgIGludCBwdHNfd3JhcF9iZWhhdmlvcjsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIGRhdGEgdG8gcHJldmVudCBkb2luZyB1cGRhdGVfaW5pdGlhbF9kdXJhdGlvbnMoKSB0d2ljZQorICAgICAqLworICAgIGludCB1cGRhdGVfaW5pdGlhbF9kdXJhdGlvbnNfZG9uZTsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIGRhdGEgdG8gZ2VuZXJhdGUgZHRzIGZyb20gcHRzCisgICAgICovCisgICAgaW50NjRfdCBwdHNfcmVvcmRlcl9lcnJvcltNQVhfUkVPUkRFUl9ERUxBWSsxXTsKKyAgICB1aW50OF90IHB0c19yZW9yZGVyX2Vycm9yX2NvdW50W01BWF9SRU9SREVSX0RFTEFZKzFdOworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZGF0YSB0byBhbmFseXplIERUUyBhbmQgZGV0ZWN0IGZhdWx0eSBtcGVnIHN0cmVhbXMKKyAgICAgKi8KKyAgICBpbnQ2NF90IGxhc3RfZHRzX2Zvcl9vcmRlcl9jaGVjazsKKyAgICB1aW50OF90IGR0c19vcmRlcmVkOworICAgIHVpbnQ4X3QgZHRzX21pc29yZGVyZWQ7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBkYXRhIHRvIGluamVjdCBnbG9iYWwgc2lkZSBkYXRhCisgICAgICovCisgICAgaW50IGluamVjdF9nbG9iYWxfc2lkZV9kYXRhOworCisgICAgLyoqCisgICAgICogU3RyaW5nIGNvbnRhaW5pbmcgcGFyaXMgb2Yga2V5IGFuZCB2YWx1ZXMgZGVzY3JpYmluZyByZWNvbW1lbmRlZCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24uCisgICAgICogUGFyaXMgYXJlIHNlcGFyYXRlZCBieSAnLCcuCisgICAgICogS2V5cyBhcmUgc2VwYXJhdGVkIGZyb20gdmFsdWVzIGJ5ICc9Jy4KKyAgICAgKi8KKyAgICBjaGFyICpyZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb247CisKKyAgICAvKioKKyAgICAgKiBkaXNwbGF5IGFzcGVjdCByYXRpbyAoMCBpZiB1bmtub3duKQorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmZvcm1hdCB0byBjYWxjdWxhdGUgc2FtcGxlX2FzcGVjdF9yYXRpbyBpbnRlcm5hbGx5CisgICAgICovCisgICAgQVZSYXRpb25hbCBkaXNwbGF5X2FzcGVjdF9yYXRpbzsKK30gQVZTdHJlYW07CisKK0FWUmF0aW9uYWwgYXZfc3RyZWFtX2dldF9yX2ZyYW1lX3JhdGUoY29uc3QgQVZTdHJlYW0gKnMpOwordm9pZCAgICAgICBhdl9zdHJlYW1fc2V0X3JfZnJhbWVfcmF0ZShBVlN0cmVhbSAqcywgQVZSYXRpb25hbCByKTsKK3N0cnVjdCBBVkNvZGVjUGFyc2VyQ29udGV4dCAqYXZfc3RyZWFtX2dldF9wYXJzZXIoY29uc3QgQVZTdHJlYW0gKnMpOworY2hhciogYXZfc3RyZWFtX2dldF9yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24oY29uc3QgQVZTdHJlYW0gKnMpOwordm9pZCAgYXZfc3RyZWFtX3NldF9yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24oQVZTdHJlYW0gKnMsIGNoYXIgKmNvbmZpZ3VyYXRpb24pOworCisvKioKKyAqIFJldHVybnMgdGhlIHB0cyBvZiB0aGUgbGFzdCBtdXhlZCBwYWNrZXQgKyBpdHMgZHVyYXRpb24KKyAqCisgKiB0aGUgcmV0dW5lZCB2YWx1ZSBpcyB1bmRlZmluZWQgd2hlbiB1c2VkIHdpdGggYSBkZW11eGVyLgorICovCitpbnQ2NF90ICAgIGF2X3N0cmVhbV9nZXRfZW5kX3B0cyhjb25zdCBBVlN0cmVhbSAqc3QpOworCisjZGVmaW5lIEFWX1BST0dSQU1fUlVOTklORyAxCisKKy8qKgorICogTmV3IGZpZWxkcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGVuZCB3aXRoIG1pbm9yIHZlcnNpb24gYnVtcHMuCisgKiBSZW1vdmFsLCByZW9yZGVyaW5nIGFuZCBjaGFuZ2VzIHRvIGV4aXN0aW5nIGZpZWxkcyByZXF1aXJlIGEgbWFqb3IKKyAqIHZlcnNpb24gYnVtcC4KKyAqIHNpemVvZihBVlByb2dyYW0pIG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSBsaWJhdiouCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWUHJvZ3JhbSB7CisgICAgaW50ICAgICAgICAgICAgaWQ7CisgICAgaW50ICAgICAgICAgICAgZmxhZ3M7CisgICAgZW51bSBBVkRpc2NhcmQgZGlzY2FyZDsgICAgICAgIC8vLzwgc2VsZWN0cyB3aGljaCBwcm9ncmFtIHRvIGRpc2NhcmQgYW5kIHdoaWNoIHRvIGZlZWQgdG8gdGhlIGNhbGxlcgorICAgIHVuc2lnbmVkIGludCAgICpzdHJlYW1faW5kZXg7CisgICAgdW5zaWduZWQgaW50ICAgbmJfc3RyZWFtX2luZGV4ZXM7CisgICAgQVZEaWN0aW9uYXJ5ICptZXRhZGF0YTsKKworICAgIGludCBwcm9ncmFtX251bTsKKyAgICBpbnQgcG10X3BpZDsKKyAgICBpbnQgcGNyX3BpZDsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEFsbCBmaWVsZHMgYmVsb3cgdGhpcyBsaW5lIGFyZSBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSS4gVGhleQorICAgICAqIG1heSBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGxpYmF2Zm9ybWF0IGFuZCBjYW4gYmUgY2hhbmdlZCBhbmQKKyAgICAgKiByZW1vdmVkIGF0IHdpbGwuCisgICAgICogTmV3IHB1YmxpYyBmaWVsZHMgc2hvdWxkIGJlIGFkZGVkIHJpZ2h0IGFib3ZlLgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworICAgIGludDY0X3Qgc3RhcnRfdGltZTsKKyAgICBpbnQ2NF90IGVuZF90aW1lOworCisgICAgaW50NjRfdCBwdHNfd3JhcF9yZWZlcmVuY2U7ICAgIC8vLzwgcmVmZXJlbmNlIGR0cyBmb3Igd3JhcCBkZXRlY3Rpb24KKyAgICBpbnQgcHRzX3dyYXBfYmVoYXZpb3I7ICAgICAgICAgLy8vPCBiZWhhdmlvciBvbiB3cmFwIGRldGVjdGlvbgorfSBBVlByb2dyYW07CisKKyNkZWZpbmUgQVZGTVRDVFhfTk9IRUFERVIgICAgICAweDAwMDEgLyoqPCBzaWduYWwgdGhhdCBubyBoZWFkZXIgaXMgcHJlc2VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtcyBhcmUgYWRkZWQgZHluYW1pY2FsbHkpICovCisKK3R5cGVkZWYgc3RydWN0IEFWQ2hhcHRlciB7CisgICAgaW50IGlkOyAgICAgICAgICAgICAgICAgLy8vPCB1bmlxdWUgSUQgdG8gaWRlbnRpZnkgdGhlIGNoYXB0ZXIKKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsgICAvLy88IHRpbWUgYmFzZSBpbiB3aGljaCB0aGUgc3RhcnQvZW5kIHRpbWVzdGFtcHMgYXJlIHNwZWNpZmllZAorICAgIGludDY0X3Qgc3RhcnQsIGVuZDsgICAgIC8vLzwgY2hhcHRlciBzdGFydC9lbmQgdGltZSBpbiB0aW1lX2Jhc2UgdW5pdHMKKyAgICBBVkRpY3Rpb25hcnkgKm1ldGFkYXRhOworfSBBVkNoYXB0ZXI7CisKKworLyoqCisgKiBDYWxsYmFjayB1c2VkIGJ5IGRldmljZXMgdG8gY29tbXVuaWNhdGUgd2l0aCBhcHBsaWNhdGlvbi4KKyAqLwordHlwZWRlZiBpbnQgKCphdl9mb3JtYXRfY29udHJvbF9tZXNzYWdlKShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKworLyoqCisgKiBUaGUgZHVyYXRpb24gb2YgYSB2aWRlbyBjYW4gYmUgZXN0aW1hdGVkIHRocm91Z2ggdmFyaW91cyB3YXlzLCBhbmQgdGhpcyBlbnVtIGNhbiBiZSB1c2VkCisgKiB0byBrbm93IGhvdyB0aGUgZHVyYXRpb24gd2FzIGVzdGltYXRlZC4KKyAqLworZW51bSBBVkR1cmF0aW9uRXN0aW1hdGlvbk1ldGhvZCB7CisgICAgQVZGTVRfRFVSQVRJT05fRlJPTV9QVFMsICAgIC8vLzwgRHVyYXRpb24gYWNjdXJhdGVseSBlc3RpbWF0ZWQgZnJvbSBQVFNlcworICAgIEFWRk1UX0RVUkFUSU9OX0ZST01fU1RSRUFNLCAvLy88IER1cmF0aW9uIGVzdGltYXRlZCBmcm9tIGEgc3RyZWFtIHdpdGggYSBrbm93biBkdXJhdGlvbgorICAgIEFWRk1UX0RVUkFUSU9OX0ZST01fQklUUkFURSAvLy88IER1cmF0aW9uIGVzdGltYXRlZCBmcm9tIGJpdHJhdGUgKGxlc3MgYWNjdXJhdGUpCit9OworCit0eXBlZGVmIHN0cnVjdCBBVkZvcm1hdEludGVybmFsIEFWRm9ybWF0SW50ZXJuYWw7CisKKy8qKgorICogRm9ybWF0IEkvTyBjb250ZXh0LgorICogTmV3IGZpZWxkcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGVuZCB3aXRoIG1pbm9yIHZlcnNpb24gYnVtcHMuCisgKiBSZW1vdmFsLCByZW9yZGVyaW5nIGFuZCBjaGFuZ2VzIHRvIGV4aXN0aW5nIGZpZWxkcyByZXF1aXJlIGEgbWFqb3IKKyAqIHZlcnNpb24gYnVtcC4KKyAqIHNpemVvZihBVkZvcm1hdENvbnRleHQpIG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSBsaWJhdiosIHVzZQorICogYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpIHRvIGNyZWF0ZSBhbiBBVkZvcm1hdENvbnRleHQuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWRm9ybWF0Q29udGV4dCB7CisgICAgLyoqCisgICAgICogQSBjbGFzcyBmb3IgbG9nZ2luZyBhbmQgQHJlZiBhdm9wdGlvbnMuIFNldCBieSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCkuCisgICAgICogRXhwb3J0cyAoZGUpbXV4ZXIgcHJpdmF0ZSBvcHRpb25zIGlmIHRoZXkgZXhpc3QuCisgICAgICovCisgICAgY29uc3QgQVZDbGFzcyAqYXZfY2xhc3M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5wdXQgY29udGFpbmVyIGZvcm1hdC4KKyAgICAgKgorICAgICAqIERlbXV4aW5nIG9ubHksIHNldCBieSBhdmZvcm1hdF9vcGVuX2lucHV0KCkuCisgICAgICovCisgICAgc3RydWN0IEFWSW5wdXRGb3JtYXQgKmlmb3JtYXQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3V0cHV0IGNvbnRhaW5lciBmb3JtYXQuCisgICAgICoKKyAgICAgKiBNdXhpbmcgb25seSwgbXVzdCBiZSBzZXQgYnkgdGhlIGNhbGxlciBiZWZvcmUgYXZmb3JtYXRfd3JpdGVfaGVhZGVyKCkuCisgICAgICovCisgICAgc3RydWN0IEFWT3V0cHV0Rm9ybWF0ICpvZm9ybWF0OworCisgICAgLyoqCisgICAgICogRm9ybWF0IHByaXZhdGUgZGF0YS4gVGhpcyBpcyBhbiBBVk9wdGlvbnMtZW5hYmxlZCBzdHJ1Y3QKKyAgICAgKiBpZiBhbmQgb25seSBpZiBpZm9ybWF0L29mb3JtYXQucHJpdl9jbGFzcyBpcyBub3QgTlVMTC4KKyAgICAgKgorICAgICAqIC0gbXV4aW5nOiBzZXQgYnkgYXZmb3JtYXRfd3JpdGVfaGVhZGVyKCkKKyAgICAgKiAtIGRlbXV4aW5nOiBzZXQgYnkgYXZmb3JtYXRfb3Blbl9pbnB1dCgpCisgICAgICovCisgICAgdm9pZCAqcHJpdl9kYXRhOworCisgICAgLyoqCisgICAgICogSS9PIGNvbnRleHQuCisgICAgICoKKyAgICAgKiAtIGRlbXV4aW5nOiBlaXRoZXIgc2V0IGJ5IHRoZSB1c2VyIGJlZm9yZSBhdmZvcm1hdF9vcGVuX2lucHV0KCkgKHRoZW4KKyAgICAgKiAgICAgICAgICAgICB0aGUgdXNlciBtdXN0IGNsb3NlIGl0IG1hbnVhbGx5KSBvciBzZXQgYnkgYXZmb3JtYXRfb3Blbl9pbnB1dCgpLgorICAgICAqIC0gbXV4aW5nOiBzZXQgYnkgdGhlIHVzZXIgYmVmb3JlIGF2Zm9ybWF0X3dyaXRlX2hlYWRlcigpLiBUaGUgY2FsbGVyIG11c3QKKyAgICAgKiAgICAgICAgICAgdGFrZSBjYXJlIG9mIGNsb3NpbmcgLyBmcmVlaW5nIHRoZSBJTyBjb250ZXh0LgorICAgICAqCisgICAgICogRG8gTk9UIHNldCB0aGlzIGZpZWxkIGlmIEFWRk1UX05PRklMRSBmbGFnIGlzIHNldCBpbgorICAgICAqIGlmb3JtYXQvb2Zvcm1hdC5mbGFncy4gSW4gc3VjaCBhIGNhc2UsIHRoZSAoZGUpbXV4ZXIgd2lsbCBoYW5kbGUKKyAgICAgKiBJL08gaW4gc29tZSBvdGhlciB3YXkgYW5kIHRoaXMgZmllbGQgd2lsbCBiZSBOVUxMLgorICAgICAqLworICAgIEFWSU9Db250ZXh0ICpwYjsKKworICAgIC8qIHN0cmVhbSBpbmZvICovCisgICAgLyoqCisgICAgICogRmxhZ3Mgc2lnbmFsbGluZyBzdHJlYW0gcHJvcGVydGllcy4gQSBjb21iaW5hdGlvbiBvZiBBVkZNVENUWF8qLgorICAgICAqIFNldCBieSBsaWJhdmZvcm1hdC4KKyAgICAgKi8KKyAgICBpbnQgY3R4X2ZsYWdzOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGVsZW1lbnRzIGluIEFWRm9ybWF0Q29udGV4dC5zdHJlYW1zLgorICAgICAqCisgICAgICogU2V0IGJ5IGF2Zm9ybWF0X25ld19zdHJlYW0oKSwgbXVzdCBub3QgYmUgbW9kaWZpZWQgYnkgYW55IG90aGVyIGNvZGUuCisgICAgICovCisgICAgdW5zaWduZWQgaW50IG5iX3N0cmVhbXM7CisgICAgLyoqCisgICAgICogQSBsaXN0IG9mIGFsbCBzdHJlYW1zIGluIHRoZSBmaWxlLiBOZXcgc3RyZWFtcyBhcmUgY3JlYXRlZCB3aXRoCisgICAgICogYXZmb3JtYXRfbmV3X3N0cmVhbSgpLgorICAgICAqCisgICAgICogLSBkZW11eGluZzogc3RyZWFtcyBhcmUgY3JlYXRlZCBieSBsaWJhdmZvcm1hdCBpbiBhdmZvcm1hdF9vcGVuX2lucHV0KCkuCisgICAgICogICAgICAgICAgICAgSWYgQVZGTVRDVFhfTk9IRUFERVIgaXMgc2V0IGluIGN0eF9mbGFncywgdGhlbiBuZXcgc3RyZWFtcyBtYXkgYWxzbworICAgICAqICAgICAgICAgICAgIGFwcGVhciBpbiBhdl9yZWFkX2ZyYW1lKCkuCisgICAgICogLSBtdXhpbmc6IHN0cmVhbXMgYXJlIGNyZWF0ZWQgYnkgdGhlIHVzZXIgYmVmb3JlIGF2Zm9ybWF0X3dyaXRlX2hlYWRlcigpLgorICAgICAqCisgICAgICogRnJlZWQgYnkgbGliYXZmb3JtYXQgaW4gYXZmb3JtYXRfZnJlZV9jb250ZXh0KCkuCisgICAgICovCisgICAgQVZTdHJlYW0gKipzdHJlYW1zOworCisgICAgLyoqCisgICAgICogaW5wdXQgb3Igb3V0cHV0IGZpbGVuYW1lCisgICAgICoKKyAgICAgKiAtIGRlbXV4aW5nOiBzZXQgYnkgYXZmb3JtYXRfb3Blbl9pbnB1dCgpCisgICAgICogLSBtdXhpbmc6IG1heSBiZSBzZXQgYnkgdGhlIGNhbGxlciBiZWZvcmUgYXZmb3JtYXRfd3JpdGVfaGVhZGVyKCkKKyAgICAgKi8KKyAgICBjaGFyIGZpbGVuYW1lWzEwMjRdOworCisgICAgLyoqCisgICAgICogUG9zaXRpb24gb2YgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSBjb21wb25lbnQsIGluCisgICAgICogQVZfVElNRV9CQVNFIGZyYWN0aW9uYWwgc2Vjb25kcy4gTkVWRVIgc2V0IHRoaXMgdmFsdWUgZGlyZWN0bHk6CisgICAgICogSXQgaXMgZGVkdWNlZCBmcm9tIHRoZSBBVlN0cmVhbSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBEZW11eGluZyBvbmx5LCBzZXQgYnkgbGliYXZmb3JtYXQuCisgICAgICovCisgICAgaW50NjRfdCBzdGFydF90aW1lOworCisgICAgLyoqCisgICAgICogRHVyYXRpb24gb2YgdGhlIHN0cmVhbSwgaW4gQVZfVElNRV9CQVNFIGZyYWN0aW9uYWwKKyAgICAgKiBzZWNvbmRzLiBPbmx5IHNldCB0aGlzIHZhbHVlIGlmIHlvdSBrbm93IG5vbmUgb2YgdGhlIGluZGl2aWR1YWwgc3RyZWFtCisgICAgICogZHVyYXRpb25zIGFuZCBhbHNvIGRvIG5vdCBzZXQgYW55IG9mIHRoZW0uIFRoaXMgaXMgZGVkdWNlZCBmcm9tIHRoZQorICAgICAqIEFWU3RyZWFtIHZhbHVlcyBpZiBub3Qgc2V0LgorICAgICAqCisgICAgICogRGVtdXhpbmcgb25seSwgc2V0IGJ5IGxpYmF2Zm9ybWF0LgorICAgICAqLworICAgIGludDY0X3QgZHVyYXRpb247CisKKyAgICAvKioKKyAgICAgKiBUb3RhbCBzdHJlYW0gYml0cmF0ZSBpbiBiaXQvcywgMCBpZiBub3QKKyAgICAgKiBhdmFpbGFibGUuIE5ldmVyIHNldCBpdCBkaXJlY3RseSBpZiB0aGUgZmlsZV9zaXplIGFuZCB0aGUKKyAgICAgKiBkdXJhdGlvbiBhcmUga25vd24gYXMgRkZtcGVnIGNhbiBjb21wdXRlIGl0IGF1dG9tYXRpY2FsbHkuCisgICAgICovCisgICAgaW50IGJpdF9yYXRlOworCisgICAgdW5zaWduZWQgaW50IHBhY2tldF9zaXplOworICAgIGludCBtYXhfZGVsYXk7CisKKyAgICAvKioKKyAgICAgKiBGbGFncyBtb2RpZnlpbmcgdGhlIChkZSltdXhlciBiZWhhdmlvdXIuIEEgY29tYmluYXRpb24gb2YgQVZGTVRfRkxBR18qLgorICAgICAqIFNldCBieSB0aGUgdXNlciBiZWZvcmUgYXZmb3JtYXRfb3Blbl9pbnB1dCgpIC8gYXZmb3JtYXRfd3JpdGVfaGVhZGVyKCkuCisgICAgICovCisgICAgaW50IGZsYWdzOworI2RlZmluZSBBVkZNVF9GTEFHX0dFTlBUUyAgICAgICAweDAwMDEgLy8vPCBHZW5lcmF0ZSBtaXNzaW5nIHB0cyBldmVuIGlmIGl0IHJlcXVpcmVzIHBhcnNpbmcgZnV0dXJlIGZyYW1lcy4KKyNkZWZpbmUgQVZGTVRfRkxBR19JR05JRFggICAgICAgMHgwMDAyIC8vLzwgSWdub3JlIGluZGV4LgorI2RlZmluZSBBVkZNVF9GTEFHX05PTkJMT0NLICAgICAweDAwMDQgLy8vPCBEbyBub3QgYmxvY2sgd2hlbiByZWFkaW5nIHBhY2tldHMgZnJvbSBpbnB1dC4KKyNkZWZpbmUgQVZGTVRfRkxBR19JR05EVFMgICAgICAgMHgwMDA4IC8vLzwgSWdub3JlIERUUyBvbiBmcmFtZXMgdGhhdCBjb250YWluIGJvdGggRFRTICYgUFRTCisjZGVmaW5lIEFWRk1UX0ZMQUdfTk9GSUxMSU4gICAgIDB4MDAxMCAvLy88IERvIG5vdCBpbmZlciBhbnkgdmFsdWVzIGZyb20gb3RoZXIgdmFsdWVzLCBqdXN0IHJldHVybiB3aGF0IGlzIHN0b3JlZCBpbiB0aGUgY29udGFpbmVyCisjZGVmaW5lIEFWRk1UX0ZMQUdfTk9QQVJTRSAgICAgIDB4MDAyMCAvLy88IERvIG5vdCB1c2UgQVZQYXJzZXJzLCB5b3UgYWxzbyBtdXN0IHNldCBBVkZNVF9GTEFHX05PRklMTElOIGFzIHRoZSBmaWxsaW4gY29kZSB3b3JrcyBvbiBmcmFtZXMgYW5kIG5vIHBhcnNpbmcgLT4gbm8gZnJhbWVzLiBBbHNvIHNlZWtpbmcgdG8gZnJhbWVzIGNhbiBub3Qgd29yayBpZiBwYXJzaW5nIHRvIGZpbmQgZnJhbWUgYm91bmRhcmllcyBoYXMgYmVlbiBkaXNhYmxlZAorI2RlZmluZSBBVkZNVF9GTEFHX05PQlVGRkVSICAgICAweDAwNDAgLy8vPCBEbyBub3QgYnVmZmVyIGZyYW1lcyB3aGVuIHBvc3NpYmxlCisjZGVmaW5lIEFWRk1UX0ZMQUdfQ1VTVE9NX0lPICAgIDB4MDA4MCAvLy88IFRoZSBjYWxsZXIgaGFzIHN1cHBsaWVkIGEgY3VzdG9tIEFWSU9Db250ZXh0LCBkb24ndCBhdmlvX2Nsb3NlKCkgaXQuCisjZGVmaW5lIEFWRk1UX0ZMQUdfRElTQ0FSRF9DT1JSVVBUICAweDAxMDAgLy8vPCBEaXNjYXJkIGZyYW1lcyBtYXJrZWQgY29ycnVwdGVkCisjZGVmaW5lIEFWRk1UX0ZMQUdfRkxVU0hfUEFDS0VUUyAgICAweDAyMDAgLy8vPCBGbHVzaCB0aGUgQVZJT0NvbnRleHQgZXZlcnkgcGFja2V0LgorLyoqCisgKiBXaGVuIG11eGluZywgdHJ5IHRvIGF2b2lkIHdyaXRpbmcgYW55IHJhbmRvbS92b2xhdGlsZSBkYXRhIHRvIHRoZSBvdXRwdXQuCisgKiBUaGlzIGluY2x1ZGVzIGFueSByYW5kb20gSURzLCByZWFsLXRpbWUgdGltZXN0YW1wcy9kYXRlcywgbXV4ZXIgdmVyc2lvbiwgZXRjLgorICoKKyAqIFRoaXMgZmxhZyBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIHRlc3RpbmcuCisgKi8KKyNkZWZpbmUgQVZGTVRfRkxBR19CSVRFWEFDVCAgICAgICAgIDB4MDQwMAorI2RlZmluZSBBVkZNVF9GTEFHX01QNEFfTEFUTSAgICAweDgwMDAgLy8vPCBFbmFibGUgUlRQIE1QNEEtTEFUTSBwYXlsb2FkCisjZGVmaW5lIEFWRk1UX0ZMQUdfU09SVF9EVFMgICAgMHgxMDAwMCAvLy88IHRyeSB0byBpbnRlcmxlYXZlIG91dHB1dHRlZCBwYWNrZXRzIGJ5IGR0cyAodXNpbmcgdGhpcyBmbGFnIGNhbiBzbG93IGRlbXV4aW5nIGRvd24pCisjZGVmaW5lIEFWRk1UX0ZMQUdfUFJJVl9PUFQgICAgMHgyMDAwMCAvLy88IEVuYWJsZSB1c2Ugb2YgcHJpdmF0ZSBvcHRpb25zIGJ5IGRlbGF5aW5nIGNvZGVjIG9wZW4gKHRoaXMgY291bGQgYmUgbWFkZSBkZWZhdWx0IG9uY2UgYWxsIGNvZGUgaXMgY29udmVydGVkKQorI2RlZmluZSBBVkZNVF9GTEFHX0tFRVBfU0lERV9EQVRBIDB4NDAwMDAgLy8vPCBEb24ndCBtZXJnZSBzaWRlIGRhdGEgYnV0IGtlZXAgaXQgc2VwYXJhdGUuCisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHByb2Jlc2l6ZTIKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgcHJvYmVzaXplOworCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBtYXhfYW5hbHl6ZV9kdXJhdGlvbjIKKyAgICAgKi8KKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorICAgIGludCBtYXhfYW5hbHl6ZV9kdXJhdGlvbjsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmtleTsKKyAgICBpbnQga2V5bGVuOworCisgICAgdW5zaWduZWQgaW50IG5iX3Byb2dyYW1zOworICAgIEFWUHJvZ3JhbSAqKnByb2dyYW1zOworCisgICAgLyoqCisgICAgICogRm9yY2VkIHZpZGVvIGNvZGVjX2lkLgorICAgICAqIERlbXV4aW5nOiBTZXQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBlbnVtIEFWQ29kZWNJRCB2aWRlb19jb2RlY19pZDsKKworICAgIC8qKgorICAgICAqIEZvcmNlZCBhdWRpbyBjb2RlY19pZC4KKyAgICAgKiBEZW11eGluZzogU2V0IGJ5IHVzZXIuCisgICAgICovCisgICAgZW51bSBBVkNvZGVjSUQgYXVkaW9fY29kZWNfaWQ7CisKKyAgICAvKioKKyAgICAgKiBGb3JjZWQgc3VidGl0bGUgY29kZWNfaWQuCisgICAgICogRGVtdXhpbmc6IFNldCBieSB1c2VyLgorICAgICAqLworICAgIGVudW0gQVZDb2RlY0lEIHN1YnRpdGxlX2NvZGVjX2lkOworCisgICAgLyoqCisgICAgICogTWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IGluIGJ5dGVzIHRvIHVzZSBmb3IgdGhlIGluZGV4IG9mIGVhY2ggc3RyZWFtLgorICAgICAqIElmIHRoZSBpbmRleCBleGNlZWRzIHRoaXMgc2l6ZSwgZW50cmllcyB3aWxsIGJlIGRpc2NhcmRlZCBhcworICAgICAqIG5lZWRlZCB0byBtYWludGFpbiBhIHNtYWxsZXIgc2l6ZS4gVGhpcyBjYW4gbGVhZCB0byBzbG93ZXIgb3IgbGVzcworICAgICAqIGFjY3VyYXRlIHNlZWtpbmcgKGRlcGVuZHMgb24gZGVtdXhlcikuCisgICAgICogRGVtdXhlcnMgZm9yIHdoaWNoIGEgZnVsbCBpbi1tZW1vcnkgaW5kZXggaXMgbWFuZGF0b3J5IHdpbGwgaWdub3JlCisgICAgICogdGhpcy4KKyAgICAgKiAtIG11eGluZzogdW51c2VkCisgICAgICogLSBkZW11eGluZzogc2V0IGJ5IHVzZXIKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgbWF4X2luZGV4X3NpemU7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdG8gdXNlIGZvciBidWZmZXJpbmcgZnJhbWVzCisgICAgICogb2J0YWluZWQgZnJvbSByZWFsdGltZSBjYXB0dXJlIGRldmljZXMuCisgICAgICovCisgICAgdW5zaWduZWQgaW50IG1heF9waWN0dXJlX2J1ZmZlcjsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBjaGFwdGVycyBpbiBBVkNoYXB0ZXIgYXJyYXkuCisgICAgICogV2hlbiBtdXhpbmcsIGNoYXB0ZXJzIGFyZSBub3JtYWxseSB3cml0dGVuIGluIHRoZSBmaWxlIGhlYWRlciwKKyAgICAgKiBzbyBuYl9jaGFwdGVycyBzaG91bGQgbm9ybWFsbHkgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHdyaXRlX2hlYWRlcgorICAgICAqIGlzIGNhbGxlZC4gU29tZSBtdXhlcnMgKGUuZy4gbW92IGFuZCBta3YpIGNhbiBhbHNvIHdyaXRlIGNoYXB0ZXJzCisgICAgICogaW4gdGhlIHRyYWlsZXIuICBUbyB3cml0ZSBjaGFwdGVycyBpbiB0aGUgdHJhaWxlciwgbmJfY2hhcHRlcnMKKyAgICAgKiBtdXN0IGJlIHplcm8gd2hlbiB3cml0ZV9oZWFkZXIgaXMgY2FsbGVkIGFuZCBub24temVybyB3aGVuCisgICAgICogd3JpdGVfdHJhaWxlciBpcyBjYWxsZWQuCisgICAgICogLSBtdXhpbmc6IHNldCBieSB1c2VyCisgICAgICogLSBkZW11eGluZzogc2V0IGJ5IGxpYmF2Zm9ybWF0CisgICAgICovCisgICAgdW5zaWduZWQgaW50IG5iX2NoYXB0ZXJzOworICAgIEFWQ2hhcHRlciAqKmNoYXB0ZXJzOworCisgICAgLyoqCisgICAgICogTWV0YWRhdGEgdGhhdCBhcHBsaWVzIHRvIHRoZSB3aG9sZSBmaWxlLgorICAgICAqCisgICAgICogLSBkZW11eGluZzogc2V0IGJ5IGxpYmF2Zm9ybWF0IGluIGF2Zm9ybWF0X29wZW5faW5wdXQoKQorICAgICAqIC0gbXV4aW5nOiBtYXkgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgYmVmb3JlIGF2Zm9ybWF0X3dyaXRlX2hlYWRlcigpCisgICAgICoKKyAgICAgKiBGcmVlZCBieSBsaWJhdmZvcm1hdCBpbiBhdmZvcm1hdF9mcmVlX2NvbnRleHQoKS4KKyAgICAgKi8KKyAgICBBVkRpY3Rpb25hcnkgKm1ldGFkYXRhOworCisgICAgLyoqCisgICAgICogU3RhcnQgdGltZSBvZiB0aGUgc3RyZWFtIGluIHJlYWwgd29ybGQgdGltZSwgaW4gbWljcm9zZWNvbmRzCisgICAgICogc2luY2UgdGhlIFVuaXggZXBvY2ggKDAwOjAwIDFzdCBKYW51YXJ5IDE5NzApLiBUaGF0IGlzLCBwdHM9MCBpbiB0aGUKKyAgICAgKiBzdHJlYW0gd2FzIGNhcHR1cmVkIGF0IHRoaXMgcmVhbCB3b3JsZCB0aW1lLgorICAgICAqIC0gbXV4aW5nOiBTZXQgYnkgdGhlIGNhbGxlciBiZWZvcmUgYXZmb3JtYXRfd3JpdGVfaGVhZGVyKCkuIElmIHNldCB0bworICAgICAqICAgICAgICAgICBlaXRoZXIgMCBvciBBVl9OT1BUU19WQUxVRSwgdGhlbiB0aGUgY3VycmVudCB3YWxsLXRpbWUgd2lsbAorICAgICAqICAgICAgICAgICBiZSB1c2VkLgorICAgICAqIC0gZGVtdXhpbmc6IFNldCBieSBsaWJhdmZvcm1hdC4gQVZfTk9QVFNfVkFMVUUgaWYgdW5rbm93bi4gTm90ZSB0aGF0CisgICAgICogICAgICAgICAgICAgdGhlIHZhbHVlIG1heSBiZWNvbWUga25vd24gYWZ0ZXIgc29tZSBudW1iZXIgb2YgZnJhbWVzCisgICAgICogICAgICAgICAgICAgaGF2ZSBiZWVuIHJlY2VpdmVkLgorICAgICAqLworICAgIGludDY0X3Qgc3RhcnRfdGltZV9yZWFsdGltZTsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgZnJhbWVzIHVzZWQgZm9yIGRldGVybWluaW5nIHRoZSBmcmFtZXJhdGUgaW4KKyAgICAgKiBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKCkuCisgICAgICogRGVtdXhpbmcgb25seSwgc2V0IGJ5IHRoZSBjYWxsZXIgYmVmb3JlIGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oKS4KKyAgICAgKi8KKyAgICBpbnQgZnBzX3Byb2JlX3NpemU7CisKKyAgICAvKioKKyAgICAgKiBFcnJvciByZWNvZ25pdGlvbjsgaGlnaGVyIHZhbHVlcyB3aWxsIGRldGVjdCBtb3JlIGVycm9ycyBidXQgbWF5CisgICAgICogbWlzZGV0ZWN0IHNvbWUgbW9yZSBvciBsZXNzIHZhbGlkIHBhcnRzIGFzIGVycm9ycy4KKyAgICAgKiBEZW11eGluZyBvbmx5LCBzZXQgYnkgdGhlIGNhbGxlciBiZWZvcmUgYXZmb3JtYXRfb3Blbl9pbnB1dCgpLgorICAgICAqLworICAgIGludCBlcnJvcl9yZWNvZ25pdGlvbjsKKworICAgIC8qKgorICAgICAqIEN1c3RvbSBpbnRlcnJ1cHQgY2FsbGJhY2tzIGZvciB0aGUgSS9PIGxheWVyLgorICAgICAqCisgICAgICogZGVtdXhpbmc6IHNldCBieSB0aGUgdXNlciBiZWZvcmUgYXZmb3JtYXRfb3Blbl9pbnB1dCgpLgorICAgICAqIG11eGluZzogc2V0IGJ5IHRoZSB1c2VyIGJlZm9yZSBhdmZvcm1hdF93cml0ZV9oZWFkZXIoKQorICAgICAqIChtYWlubHkgdXNlZnVsIGZvciBBVkZNVF9OT0ZJTEUgZm9ybWF0cykuIFRoZSBjYWxsYmFjaworICAgICAqIHNob3VsZCBhbHNvIGJlIHBhc3NlZCB0byBhdmlvX29wZW4yKCkgaWYgaXQncyB1c2VkIHRvCisgICAgICogb3BlbiB0aGUgZmlsZS4KKyAgICAgKi8KKyAgICBBVklPSW50ZXJydXB0Q0IgaW50ZXJydXB0X2NhbGxiYWNrOworCisgICAgLyoqCisgICAgICogRmxhZ3MgdG8gZW5hYmxlIGRlYnVnZ2luZy4KKyAgICAgKi8KKyAgICBpbnQgZGVidWc7CisjZGVmaW5lIEZGX0ZERUJVR19UUyAgICAgICAgMHgwMDAxCisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIGJ1ZmZlcmluZyBkdXJhdGlvbiBmb3IgaW50ZXJsZWF2aW5nLgorICAgICAqCisgICAgICogVG8gZW5zdXJlIGFsbCB0aGUgc3RyZWFtcyBhcmUgaW50ZXJsZWF2ZWQgY29ycmVjdGx5LAorICAgICAqIGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKCkgd2lsbCB3YWl0IHVudGlsIGl0IGhhcyBhdCBsZWFzdCBvbmUgcGFja2V0CisgICAgICogZm9yIGVhY2ggc3RyZWFtIGJlZm9yZSBhY3R1YWxseSB3cml0aW5nIGFueSBwYWNrZXRzIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgKiBXaGVuIHNvbWUgc3RyZWFtcyBhcmUgInNwYXJzZSIgKGkuZS4gdGhlcmUgYXJlIGxhcmdlIGdhcHMgYmV0d2VlbgorICAgICAqIHN1Y2Nlc3NpdmUgcGFja2V0cyksIHRoaXMgY2FuIHJlc3VsdCBpbiBleGNlc3NpdmUgYnVmZmVyaW5nLgorICAgICAqCisgICAgICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIG1heGltdW0gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0aW1lc3RhbXBzIG9mIHRoZQorICAgICAqIGZpcnN0IGFuZCB0aGUgbGFzdCBwYWNrZXQgaW4gdGhlIG11eGluZyBxdWV1ZSwgYWJvdmUgd2hpY2ggbGliYXZmb3JtYXQKKyAgICAgKiB3aWxsIG91dHB1dCBhIHBhY2tldCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaGFzIHF1ZXVlZCBhIHBhY2tldCBmb3IgYWxsCisgICAgICogdGhlIHN0cmVhbXMuCisgICAgICoKKyAgICAgKiBNdXhpbmcgb25seSwgc2V0IGJ5IHRoZSBjYWxsZXIgYmVmb3JlIGF2Zm9ybWF0X3dyaXRlX2hlYWRlcigpLgorICAgICAqLworICAgIGludDY0X3QgbWF4X2ludGVybGVhdmVfZGVsdGE7CisKKyAgICAvKioKKyAgICAgKiBBbGxvdyBub24tc3RhbmRhcmQgYW5kIGV4cGVyaW1lbnRhbCBleHRlbnNpb24KKyAgICAgKiBAc2VlIEFWQ29kZWNDb250ZXh0LnN0cmljdF9zdGRfY29tcGxpYW5jZQorICAgICAqLworICAgIGludCBzdHJpY3Rfc3RkX2NvbXBsaWFuY2U7CisKKyAgICAvKioKKyAgICAgKiBGbGFncyBmb3IgdGhlIHVzZXIgdG8gZGV0ZWN0IGV2ZW50cyBoYXBwZW5pbmcgb24gdGhlIGZpbGUuIEZsYWdzIG11c3QKKyAgICAgKiBiZSBjbGVhcmVkIGJ5IHRoZSB1c2VyIG9uY2UgdGhlIGV2ZW50IGhhcyBiZWVuIGhhbmRsZWQuCisgICAgICogQSBjb21iaW5hdGlvbiBvZiBBVkZNVF9FVkVOVF9GTEFHXyouCisgICAgICovCisgICAgaW50IGV2ZW50X2ZsYWdzOworI2RlZmluZSBBVkZNVF9FVkVOVF9GTEFHX01FVEFEQVRBX1VQREFURUQgMHgwMDAxIC8vLzwgVGhlIGNhbGwgcmVzdWx0ZWQgaW4gdXBkYXRlZCBtZXRhZGF0YS4KKworICAgIC8qKgorICAgICAqIE1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMgdG8gcmVhZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZmlyc3QgdGltZXN0YW1wLgorICAgICAqIERlY29kaW5nIG9ubHkuCisgICAgICovCisgICAgaW50IG1heF90c19wcm9iZTsKKworICAgIC8qKgorICAgICAqIEF2b2lkIG5lZ2F0aXZlIHRpbWVzdGFtcHMgZHVyaW5nIG11eGluZy4KKyAgICAgKiBBbnkgdmFsdWUgb2YgdGhlIEFWRk1UX0FWT0lEX05FR19UU18qIGNvbnN0YW50cy4KKyAgICAgKiBOb3RlLCB0aGlzIG9ubHkgd29ya3Mgd2hlbiB1c2luZyBhdl9pbnRlcmxlYXZlZF93cml0ZV9mcmFtZS4gKGludGVybGVhdmVfcGFja2V0X3Blcl9kdHMgaXMgaW4gdXNlKQorICAgICAqIC0gbXV4aW5nOiBTZXQgYnkgdXNlcgorICAgICAqIC0gZGVtdXhpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBhdm9pZF9uZWdhdGl2ZV90czsKKyNkZWZpbmUgQVZGTVRfQVZPSURfTkVHX1RTX0FVVE8gICAgICAgICAgICAgLTEgLy8vPCBFbmFibGVkIHdoZW4gcmVxdWlyZWQgYnkgdGFyZ2V0IGZvcm1hdAorI2RlZmluZSBBVkZNVF9BVk9JRF9ORUdfVFNfTUFLRV9OT05fTkVHQVRJVkUgMSAvLy88IFNoaWZ0IHRpbWVzdGFtcHMgc28gdGhleSBhcmUgbm9uIG5lZ2F0aXZlCisjZGVmaW5lIEFWRk1UX0FWT0lEX05FR19UU19NQUtFX1pFUk8gICAgICAgICAyIC8vLzwgU2hpZnQgdGltZXN0YW1wcyBzbyB0aGF0IHRoZXkgc3RhcnQgYXQgMAorCisKKyAgICAvKioKKyAgICAgKiBUcmFuc3BvcnQgc3RyZWFtIGlkLgorICAgICAqIFRoaXMgd2lsbCBiZSBtb3ZlZCBpbnRvIGRlbXV4ZXIgcHJpdmF0ZSBvcHRpb25zLiBUaHVzIG5vIEFQSS9BQkkgY29tcGF0aWJpbGl0eQorICAgICAqLworICAgIGludCB0c19pZDsKKworICAgIC8qKgorICAgICAqIEF1ZGlvIHByZWxvYWQgaW4gbWljcm9zZWNvbmRzLgorICAgICAqIE5vdGUsIG5vdCBhbGwgZm9ybWF0cyBzdXBwb3J0IHRoaXMgYW5kIHVucHJlZGljdGFibGUgdGhpbmdzIG1heSBoYXBwZW4gaWYgaXQgaXMgdXNlZCB3aGVuIG5vdCBzdXBwb3J0ZWQuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIgdmlhIEFWT3B0aW9ucyAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgYXVkaW9fcHJlbG9hZDsKKworICAgIC8qKgorICAgICAqIE1heCBjaHVuayB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KKyAgICAgKiBOb3RlLCBub3QgYWxsIGZvcm1hdHMgc3VwcG9ydCB0aGlzIGFuZCB1bnByZWRpY3RhYmxlIHRoaW5ncyBtYXkgaGFwcGVuIGlmIGl0IGlzIHVzZWQgd2hlbiBub3Qgc3VwcG9ydGVkLgorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyIHZpYSBBVk9wdGlvbnMgKE5PIGRpcmVjdCBhY2Nlc3MpCisgICAgICogLSBkZWNvZGluZzogdW51c2VkCisgICAgICovCisgICAgaW50IG1heF9jaHVua19kdXJhdGlvbjsKKworICAgIC8qKgorICAgICAqIE1heCBjaHVuayBzaXplIGluIGJ5dGVzCisgICAgICogTm90ZSwgbm90IGFsbCBmb3JtYXRzIHN1cHBvcnQgdGhpcyBhbmQgdW5wcmVkaWN0YWJsZSB0aGluZ3MgbWF5IGhhcHBlbiBpZiBpdCBpcyB1c2VkIHdoZW4gbm90IHN1cHBvcnRlZC4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlciB2aWEgQVZPcHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKQorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBtYXhfY2h1bmtfc2l6ZTsKKworICAgIC8qKgorICAgICAqIGZvcmNlcyB0aGUgdXNlIG9mIHdhbGxjbG9jayB0aW1lc3RhbXBzIGFzIHB0cy9kdHMgb2YgcGFja2V0cworICAgICAqIFRoaXMgaGFzIHVuZGVmaW5lZCByZXN1bHRzIGluIHRoZSBwcmVzZW5jZSBvZiBCIGZyYW1lcy4KKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlciB2aWEgQVZPcHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKQorICAgICAqLworICAgIGludCB1c2Vfd2FsbGNsb2NrX2FzX3RpbWVzdGFtcHM7CisKKyAgICAvKioKKyAgICAgKiBhdmlvIGZsYWdzLCB1c2VkIHRvIGZvcmNlIEFWSU9fRkxBR19ESVJFQ1QuCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIgdmlhIEFWT3B0aW9ucyAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKi8KKyAgICBpbnQgYXZpb19mbGFnczsKKworICAgIC8qKgorICAgICAqIFRoZSBkdXJhdGlvbiBmaWVsZCBjYW4gYmUgZXN0aW1hdGVkIHRocm91Z2ggdmFyaW91cyB3YXlzLCBhbmQgdGhpcyBmaWVsZCBjYW4gYmUgdXNlZAorICAgICAqIHRvIGtub3cgaG93IHRoZSBkdXJhdGlvbiB3YXMgZXN0aW1hdGVkLgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFJlYWQgYnkgdXNlciB2aWEgQVZPcHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKQorICAgICAqLworICAgIGVudW0gQVZEdXJhdGlvbkVzdGltYXRpb25NZXRob2QgZHVyYXRpb25fZXN0aW1hdGlvbl9tZXRob2Q7CisKKyAgICAvKioKKyAgICAgKiBTa2lwIGluaXRpYWwgYnl0ZXMgd2hlbiBvcGVuaW5nIHN0cmVhbQorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyIHZpYSBBVk9wdGlvbnMgKE5PIGRpcmVjdCBhY2Nlc3MpCisgICAgICovCisgICAgaW50NjRfdCBza2lwX2luaXRpYWxfYnl0ZXM7CisKKyAgICAvKioKKyAgICAgKiBDb3JyZWN0IHNpbmdsZSB0aW1lc3RhbXAgb3ZlcmZsb3dzCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIgdmlhIEFWT3B0aW9ucyAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgY29ycmVjdF90c19vdmVyZmxvdzsKKworICAgIC8qKgorICAgICAqIEZvcmNlIHNlZWtpbmcgdG8gYW55IChhbHNvIG5vbiBrZXkpIGZyYW1lcy4KKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlciB2aWEgQVZPcHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKQorICAgICAqLworICAgIGludCBzZWVrMmFueTsKKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBJL08gY29udGV4dCBhZnRlciBlYWNoIHBhY2tldC4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlciB2aWEgQVZPcHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKQorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCBmbHVzaF9wYWNrZXRzOworCisgICAgLyoqCisgICAgICogZm9ybWF0IHByb2Jpbmcgc2NvcmUuCisgICAgICogVGhlIG1heGltYWwgc2NvcmUgaXMgQVZQUk9CRV9TQ09SRV9NQVgsIGl0cyBzZXQgd2hlbiB0aGUgZGVtdXhlciBwcm9iZXMKKyAgICAgKiB0aGUgZm9ybWF0LgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSBhdmZvcm1hdCwgcmVhZCBieSB1c2VyIHZpYSBhdl9mb3JtYXRfZ2V0X3Byb2JlX3Njb3JlKCkgKE5PIGRpcmVjdCBhY2Nlc3MpCisgICAgICovCisgICAgaW50IHByb2JlX3Njb3JlOworCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgbWF4aW1hbGx5IHRvIGlkZW50aWZ5IGZvcm1hdC4KKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgdXNlciB0aHJvdWdoIEFWT1B0aW9ucyAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKi8KKyAgICBpbnQgZm9ybWF0X3Byb2Jlc2l6ZTsKKworICAgIC8qKgorICAgICAqICcsJyBzZXBhcmF0ZWQgbGlzdCBvZiBhbGxvd2VkIGRlY29kZXJzLgorICAgICAqIElmIE5VTEwgdGhlbiBhbGwgYXJlIGFsbG93ZWQKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgdXNlciB0aHJvdWdoIEFWT3B0aW9ucyAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKi8KKyAgICBjaGFyICpjb2RlY193aGl0ZWxpc3Q7CisKKyAgICAvKioKKyAgICAgKiAnLCcgc2VwYXJhdGVkIGxpc3Qgb2YgYWxsb3dlZCBkZW11eGVycy4KKyAgICAgKiBJZiBOVUxMIHRoZW4gYWxsIGFyZSBhbGxvd2VkCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogc2V0IGJ5IHVzZXIgdGhyb3VnaCBBVk9wdGlvbnMgKE5PIGRpcmVjdCBhY2Nlc3MpCisgICAgICovCisgICAgY2hhciAqZm9ybWF0X3doaXRlbGlzdDsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEFsbCBmaWVsZHMgYmVsb3cgdGhpcyBsaW5lIGFyZSBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSS4gVGhleQorICAgICAqIG1heSBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGxpYmF2Zm9ybWF0IGFuZCBjYW4gYmUgY2hhbmdlZCBhbmQKKyAgICAgKiByZW1vdmVkIGF0IHdpbGwuCisgICAgICogTmV3IHB1YmxpYyBmaWVsZHMgc2hvdWxkIGJlIGFkZGVkIHJpZ2h0IGFib3ZlLgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworCisgICAgLyoqCisgICAgICogVGhpcyBidWZmZXIgaXMgb25seSBuZWVkZWQgd2hlbiBwYWNrZXRzIHdlcmUgYWxyZWFkeSBidWZmZXJlZCBidXQKKyAgICAgKiBub3QgZGVjb2RlZCwgZm9yIGV4YW1wbGUgdG8gZ2V0IHRoZSBjb2RlYyBwYXJhbWV0ZXJzIGluIE1QRUcKKyAgICAgKiBzdHJlYW1zLgorICAgICAqLworICAgIHN0cnVjdCBBVlBhY2tldExpc3QgKnBhY2tldF9idWZmZXI7CisgICAgc3RydWN0IEFWUGFja2V0TGlzdCAqcGFja2V0X2J1ZmZlcl9lbmQ7CisKKyAgICAvKiBhdl9zZWVrX2ZyYW1lKCkgc3VwcG9ydCAqLworICAgIGludDY0X3QgZGF0YV9vZmZzZXQ7IC8qKjwgb2Zmc2V0IG9mIHRoZSBmaXJzdCBwYWNrZXQgKi8KKworICAgIC8qKgorICAgICAqIFJhdyBwYWNrZXRzIGZyb20gdGhlIGRlbXV4ZXIsIHByaW9yIHRvIHBhcnNpbmcgYW5kIGRlY29kaW5nLgorICAgICAqIFRoaXMgYnVmZmVyIGlzIHVzZWQgZm9yIGJ1ZmZlcmluZyBwYWNrZXRzIHVudGlsIHRoZSBjb2RlYyBjYW4KKyAgICAgKiBiZSBpZGVudGlmaWVkLCBhcyBwYXJzaW5nIGNhbm5vdCBiZSBkb25lIHdpdGhvdXQga25vd2luZyB0aGUKKyAgICAgKiBjb2RlYy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQVZQYWNrZXRMaXN0ICpyYXdfcGFja2V0X2J1ZmZlcjsKKyAgICBzdHJ1Y3QgQVZQYWNrZXRMaXN0ICpyYXdfcGFja2V0X2J1ZmZlcl9lbmQ7CisgICAgLyoqCisgICAgICogUGFja2V0cyBzcGxpdCBieSB0aGUgcGFyc2VyIGdldCBxdWV1ZWQgaGVyZS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQVZQYWNrZXRMaXN0ICpwYXJzZV9xdWV1ZTsKKyAgICBzdHJ1Y3QgQVZQYWNrZXRMaXN0ICpwYXJzZV9xdWV1ZV9lbmQ7CisgICAgLyoqCisgICAgICogUmVtYWluaW5nIHNpemUgYXZhaWxhYmxlIGZvciByYXdfcGFja2V0X2J1ZmZlciwgaW4gYnl0ZXMuCisgICAgICovCisjZGVmaW5lIFJBV19QQUNLRVRfQlVGRkVSX1NJWkUgMjUwMDAwMAorICAgIGludCByYXdfcGFja2V0X2J1ZmZlcl9yZW1haW5pbmdfc2l6ZTsKKworICAgIC8qKgorICAgICAqIE9mZnNldCB0byByZW1hcCB0aW1lc3RhbXBzIHRvIGJlIG5vbi1uZWdhdGl2ZS4KKyAgICAgKiBFeHByZXNzZWQgaW4gdGltZWJhc2UgdW5pdHMuCisgICAgICogQHNlZSBBVlN0cmVhbS5tdXhfdHNfb2Zmc2V0CisgICAgICovCisgICAgaW50NjRfdCBvZmZzZXQ7CisKKyAgICAvKioKKyAgICAgKiBUaW1lYmFzZSBmb3IgdGhlIHRpbWVzdGFtcCBvZmZzZXQuCisgICAgICovCisgICAgQVZSYXRpb25hbCBvZmZzZXRfdGltZWJhc2U7CisKKyAgICAvKioKKyAgICAgKiBBbiBvcGFxdWUgZmllbGQgZm9yIGxpYmF2Zm9ybWF0IGludGVybmFsIHVzYWdlLgorICAgICAqIE11c3Qgbm90IGJlIGFjY2Vzc2VkIGluIGFueSB3YXkgYnkgY2FsbGVycy4KKyAgICAgKi8KKyAgICBBVkZvcm1hdEludGVybmFsICppbnRlcm5hbDsKKworICAgIC8qKgorICAgICAqIElPIHJlcG9zaXRpb25lZCBmbGFnLgorICAgICAqIFRoaXMgaXMgc2V0IGJ5IGF2Zm9ybWF0IHdoZW4gdGhlIHVuZGVybGF5aW5nIElPIGNvbnRleHQgcmVhZCBwb2ludGVyCisgICAgICogaXMgcmVwb3NpdGlvbmVkLCBmb3IgZXhhbXBsZSB3aGVuIGRvaW5nIGJ5dGUgYmFzZWQgc2Vla2luZy4KKyAgICAgKiBEZW11eGVycyBjYW4gdXNlIHRoZSBmbGFnIHRvIGRldGVjdCBzdWNoIGNoYW5nZXMuCisgICAgICovCisgICAgaW50IGlvX3JlcG9zaXRpb25lZDsKKworICAgIC8qKgorICAgICAqIEZvcmNlZCB2aWRlbyBjb2RlYy4KKyAgICAgKiBUaGlzIGFsbG93cyBmb3JjaW5nIGEgc3BlY2lmaWMgZGVjb2RlciwgZXZlbiB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB3aXRoCisgICAgICogdGhlIHNhbWUgY29kZWNfaWQuCisgICAgICogRGVtdXhpbmc6IFNldCBieSB1c2VyIHZpYSBhdl9mb3JtYXRfc2V0X3ZpZGVvX2NvZGVjIChOTyBkaXJlY3QgYWNjZXNzKS4KKyAgICAgKi8KKyAgICBBVkNvZGVjICp2aWRlb19jb2RlYzsKKworICAgIC8qKgorICAgICAqIEZvcmNlZCBhdWRpbyBjb2RlYy4KKyAgICAgKiBUaGlzIGFsbG93cyBmb3JjaW5nIGEgc3BlY2lmaWMgZGVjb2RlciwgZXZlbiB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB3aXRoCisgICAgICogdGhlIHNhbWUgY29kZWNfaWQuCisgICAgICogRGVtdXhpbmc6IFNldCBieSB1c2VyIHZpYSBhdl9mb3JtYXRfc2V0X2F1ZGlvX2NvZGVjIChOTyBkaXJlY3QgYWNjZXNzKS4KKyAgICAgKi8KKyAgICBBVkNvZGVjICphdWRpb19jb2RlYzsKKworICAgIC8qKgorICAgICAqIEZvcmNlZCBzdWJ0aXRsZSBjb2RlYy4KKyAgICAgKiBUaGlzIGFsbG93cyBmb3JjaW5nIGEgc3BlY2lmaWMgZGVjb2RlciwgZXZlbiB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB3aXRoCisgICAgICogdGhlIHNhbWUgY29kZWNfaWQuCisgICAgICogRGVtdXhpbmc6IFNldCBieSB1c2VyIHZpYSBhdl9mb3JtYXRfc2V0X3N1YnRpdGxlX2NvZGVjIChOTyBkaXJlY3QgYWNjZXNzKS4KKyAgICAgKi8KKyAgICBBVkNvZGVjICpzdWJ0aXRsZV9jb2RlYzsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIGFzIHBhZGRpbmcgaW4gYSBtZXRhZGF0YSBoZWFkZXIuCisgICAgICogRGVtdXhpbmc6IFVudXNlZC4KKyAgICAgKiBNdXhpbmc6IFNldCBieSB1c2VyIHZpYSBhdl9mb3JtYXRfc2V0X21ldGFkYXRhX2hlYWRlcl9wYWRkaW5nLgorICAgICAqLworICAgIGludCBtZXRhZGF0YV9oZWFkZXJfcGFkZGluZzsKKworICAgIC8qKgorICAgICAqIFVzZXIgZGF0YS4KKyAgICAgKiBUaGlzIGlzIGEgcGxhY2UgZm9yIHNvbWUgcHJpdmF0ZSBkYXRhIG9mIHRoZSB1c2VyLgorICAgICAqIE1vc3RseSB1c2FibGUgd2l0aCBjb250cm9sX21lc3NhZ2VfY2Igb3IgYW55IGZ1dHVyZSBjYWxsYmFja3MgaW4gZGV2aWNlJ3MgY29udGV4dC4KKyAgICAgKi8KKyAgICB2b2lkICpvcGFxdWU7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayB1c2VkIGJ5IGRldmljZXMgdG8gY29tbXVuaWNhdGUgd2l0aCBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBhdl9mb3JtYXRfY29udHJvbF9tZXNzYWdlIGNvbnRyb2xfbWVzc2FnZV9jYjsKKworICAgIC8qKgorICAgICAqIE91dHB1dCB0aW1lc3RhbXAgb2Zmc2V0LCBpbiBtaWNyb3NlY29uZHMuCisgICAgICogTXV4aW5nOiBzZXQgYnkgdXNlciB2aWEgQVZPcHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKQorICAgICAqLworICAgIGludDY0X3Qgb3V0cHV0X3RzX29mZnNldDsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gZHVyYXRpb24gKGluIEFWX1RJTUVfQkFTRSB1bml0cykgb2YgdGhlIGRhdGEgcmVhZAorICAgICAqIGZyb20gaW5wdXQgaW4gYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbygpLgorICAgICAqIERlbXV4aW5nIG9ubHksIHNldCBieSB0aGUgY2FsbGVyIGJlZm9yZSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKCkKKyAgICAgKiB2aWEgQVZPcHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKS4KKyAgICAgKiBDYW4gYmUgc2V0IHRvIDAgdG8gbGV0IGF2Zm9ybWF0IGNob29zZSB1c2luZyBhIGhldXJpc3RpYy4KKyAgICAgKi8KKyAgICBpbnQ2NF90IG1heF9hbmFseXplX2R1cmF0aW9uMjsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gc2l6ZSBvZiB0aGUgZGF0YSByZWFkIGZyb20gaW5wdXQgZm9yIGRldGVybWluaW5nCisgICAgICogdGhlIGlucHV0IGNvbnRhaW5lciBmb3JtYXQuCisgICAgICogRGVtdXhpbmcgb25seSwgc2V0IGJ5IHRoZSBjYWxsZXIgYmVmb3JlIGF2Zm9ybWF0X29wZW5faW5wdXQoKQorICAgICAqIHZpYSBBVk9wdGlvbnMgKE5PIGRpcmVjdCBhY2Nlc3MpLgorICAgICAqLworICAgIGludDY0X3QgcHJvYmVzaXplMjsKKworICAgIC8qKgorICAgICAqIGR1bXAgZm9ybWF0IHNlcGFyYXRvci4KKyAgICAgKiBjYW4gYmUgIiwgIiBvciAiXG4gICAgICAiIG9yIGFueXRoaW5nIGVsc2UKKyAgICAgKiBDb2RlIG91dHNpZGUgbGliYXZmb3JtYXQgc2hvdWxkIGFjY2VzcyB0aGlzIGZpZWxkIHVzaW5nIEFWT3B0aW9ucworICAgICAqIChOTyBkaXJlY3QgYWNjZXNzKS4KKyAgICAgKiAtIG11eGluZzogU2V0IGJ5IHVzZXIuCisgICAgICogLSBkZW11eGluZzogU2V0IGJ5IHVzZXIuCisgICAgICovCisgICAgdWludDhfdCAqZHVtcF9zZXBhcmF0b3I7Cit9IEFWRm9ybWF0Q29udGV4dDsKKworaW50IGF2X2Zvcm1hdF9nZXRfcHJvYmVfc2NvcmUoY29uc3QgQVZGb3JtYXRDb250ZXh0ICpzKTsKK0FWQ29kZWMgKiBhdl9mb3JtYXRfZ2V0X3ZpZGVvX2NvZGVjKGNvbnN0IEFWRm9ybWF0Q29udGV4dCAqcyk7Cit2b2lkICAgICAgYXZfZm9ybWF0X3NldF92aWRlb19jb2RlYyhBVkZvcm1hdENvbnRleHQgKnMsIEFWQ29kZWMgKmMpOworQVZDb2RlYyAqIGF2X2Zvcm1hdF9nZXRfYXVkaW9fY29kZWMoY29uc3QgQVZGb3JtYXRDb250ZXh0ICpzKTsKK3ZvaWQgICAgICBhdl9mb3JtYXRfc2V0X2F1ZGlvX2NvZGVjKEFWRm9ybWF0Q29udGV4dCAqcywgQVZDb2RlYyAqYyk7CitBVkNvZGVjICogYXZfZm9ybWF0X2dldF9zdWJ0aXRsZV9jb2RlYyhjb25zdCBBVkZvcm1hdENvbnRleHQgKnMpOwordm9pZCAgICAgIGF2X2Zvcm1hdF9zZXRfc3VidGl0bGVfY29kZWMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkNvZGVjICpjKTsKK2ludCAgICAgICBhdl9mb3JtYXRfZ2V0X21ldGFkYXRhX2hlYWRlcl9wYWRkaW5nKGNvbnN0IEFWRm9ybWF0Q29udGV4dCAqcyk7Cit2b2lkICAgICAgYXZfZm9ybWF0X3NldF9tZXRhZGF0YV9oZWFkZXJfcGFkZGluZyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBjKTsKK3ZvaWQgKiAgICBhdl9mb3JtYXRfZ2V0X29wYXF1ZShjb25zdCBBVkZvcm1hdENvbnRleHQgKnMpOwordm9pZCAgICAgIGF2X2Zvcm1hdF9zZXRfb3BhcXVlKEFWRm9ybWF0Q29udGV4dCAqcywgdm9pZCAqb3BhcXVlKTsKK2F2X2Zvcm1hdF9jb250cm9sX21lc3NhZ2UgYXZfZm9ybWF0X2dldF9jb250cm9sX21lc3NhZ2VfY2IoY29uc3QgQVZGb3JtYXRDb250ZXh0ICpzKTsKK3ZvaWQgICAgICBhdl9mb3JtYXRfc2V0X2NvbnRyb2xfbWVzc2FnZV9jYihBVkZvcm1hdENvbnRleHQgKnMsIGF2X2Zvcm1hdF9jb250cm9sX21lc3NhZ2UgY2FsbGJhY2spOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYXVzZSBnbG9iYWwgc2lkZSBkYXRhIHRvIGJlIGluamVjdGVkIGluIHRoZSBuZXh0IHBhY2tldAorICogb2YgZWFjaCBzdHJlYW0gYXMgd2VsbCBhcyBhZnRlciBhbnkgc3Vic2VxdWVudCBzZWVrLgorICovCit2b2lkIGF2X2Zvcm1hdF9pbmplY3RfZ2xvYmFsX3NpZGVfZGF0YShBVkZvcm1hdENvbnRleHQgKnMpOworCisvKioKKyAqIFJldHVybnMgdGhlIG1ldGhvZCB1c2VkIHRvIHNldCBjdHgtPmR1cmF0aW9uLgorICoKKyAqIEByZXR1cm4gQVZGTVRfRFVSQVRJT05fRlJPTV9QVFMsIEFWRk1UX0RVUkFUSU9OX0ZST01fU1RSRUFNLCBvciBBVkZNVF9EVVJBVElPTl9GUk9NX0JJVFJBVEUuCisgKi8KK2VudW0gQVZEdXJhdGlvbkVzdGltYXRpb25NZXRob2QgYXZfZm10X2N0eF9nZXRfZHVyYXRpb25fZXN0aW1hdGlvbl9tZXRob2QoY29uc3QgQVZGb3JtYXRDb250ZXh0KiBjdHgpOworCit0eXBlZGVmIHN0cnVjdCBBVlBhY2tldExpc3QgeworICAgIEFWUGFja2V0IHBrdDsKKyAgICBzdHJ1Y3QgQVZQYWNrZXRMaXN0ICpuZXh0OworfSBBVlBhY2tldExpc3Q7CisKKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2Zl9jb3JlIENvcmUgZnVuY3Rpb25zCisgKiBAaW5ncm91cCBsaWJhdmYKKyAqCisgKiBGdW5jdGlvbnMgZm9yIHF1ZXJ5aW5nIGxpYmF2Zm9ybWF0IGNhcGFiaWxpdGllcywgYWxsb2NhdGluZyBjb3JlIHN0cnVjdHVyZXMsCisgKiBldGMuCisgKiBAeworICovCisKKy8qKgorICogUmV0dXJuIHRoZSBMSUJBVkZPUk1BVF9WRVJTSU9OX0lOVCBjb25zdGFudC4KKyAqLwordW5zaWduZWQgYXZmb3JtYXRfdmVyc2lvbih2b2lkKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGxpYmF2Zm9ybWF0IGJ1aWxkLXRpbWUgY29uZmlndXJhdGlvbi4KKyAqLworY29uc3QgY2hhciAqYXZmb3JtYXRfY29uZmlndXJhdGlvbih2b2lkKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGxpYmF2Zm9ybWF0IGxpY2Vuc2UuCisgKi8KK2NvbnN0IGNoYXIgKmF2Zm9ybWF0X2xpY2Vuc2Uodm9pZCk7CisKKy8qKgorICogSW5pdGlhbGl6ZSBsaWJhdmZvcm1hdCBhbmQgcmVnaXN0ZXIgYWxsIHRoZSBtdXhlcnMsIGRlbXV4ZXJzIGFuZAorICogcHJvdG9jb2xzLiBJZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgdGhlbiB5b3UgY2FuIHNlbGVjdAorICogZXhhY3RseSB3aGljaCBmb3JtYXRzIHlvdSB3YW50IHRvIHN1cHBvcnQuCisgKgorICogQHNlZSBhdl9yZWdpc3Rlcl9pbnB1dF9mb3JtYXQoKQorICogQHNlZSBhdl9yZWdpc3Rlcl9vdXRwdXRfZm9ybWF0KCkKKyAqLwordm9pZCBhdl9yZWdpc3Rlcl9hbGwodm9pZCk7CisKK3ZvaWQgYXZfcmVnaXN0ZXJfaW5wdXRfZm9ybWF0KEFWSW5wdXRGb3JtYXQgKmZvcm1hdCk7Cit2b2lkIGF2X3JlZ2lzdGVyX291dHB1dF9mb3JtYXQoQVZPdXRwdXRGb3JtYXQgKmZvcm1hdCk7CisKKy8qKgorICogRG8gZ2xvYmFsIGluaXRpYWxpemF0aW9uIG9mIG5ldHdvcmsgY29tcG9uZW50cy4gVGhpcyBpcyBvcHRpb25hbCwKKyAqIGJ1dCByZWNvbW1lbmRlZCwgc2luY2UgaXQgYXZvaWRzIHRoZSBvdmVyaGVhZCBvZiBpbXBsaWNpdGx5CisgKiBkb2luZyB0aGUgc2V0dXAgZm9yIGVhY2ggc2Vzc2lvbi4KKyAqCisgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBiZWNvbWUgbWFuZGF0b3J5IGlmIHVzaW5nIG5ldHdvcmsKKyAqIHByb3RvY29scyBhdCBzb21lIG1ham9yIHZlcnNpb24gYnVtcC4KKyAqLworaW50IGF2Zm9ybWF0X25ldHdvcmtfaW5pdCh2b2lkKTsKKworLyoqCisgKiBVbmRvIHRoZSBpbml0aWFsaXphdGlvbiBkb25lIGJ5IGF2Zm9ybWF0X25ldHdvcmtfaW5pdC4KKyAqLworaW50IGF2Zm9ybWF0X25ldHdvcmtfZGVpbml0KHZvaWQpOworCisvKioKKyAqIElmIGYgaXMgTlVMTCwgcmV0dXJucyB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBpbnB1dCBmb3JtYXQsCisgKiBpZiBmIGlzIG5vbi1OVUxMLCByZXR1cm5zIHRoZSBuZXh0IHJlZ2lzdGVyZWQgaW5wdXQgZm9ybWF0IGFmdGVyIGYKKyAqIG9yIE5VTEwgaWYgZiBpcyB0aGUgbGFzdCBvbmUuCisgKi8KK0FWSW5wdXRGb3JtYXQgICphdl9pZm9ybWF0X25leHQoY29uc3QgQVZJbnB1dEZvcm1hdCAgKmYpOworCisvKioKKyAqIElmIGYgaXMgTlVMTCwgcmV0dXJucyB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBvdXRwdXQgZm9ybWF0LAorICogaWYgZiBpcyBub24tTlVMTCwgcmV0dXJucyB0aGUgbmV4dCByZWdpc3RlcmVkIG91dHB1dCBmb3JtYXQgYWZ0ZXIgZgorICogb3IgTlVMTCBpZiBmIGlzIHRoZSBsYXN0IG9uZS4KKyAqLworQVZPdXRwdXRGb3JtYXQgKmF2X29mb3JtYXRfbmV4dChjb25zdCBBVk91dHB1dEZvcm1hdCAqZik7CisKKy8qKgorICogQWxsb2NhdGUgYW4gQVZGb3JtYXRDb250ZXh0LgorICogYXZmb3JtYXRfZnJlZV9jb250ZXh0KCkgY2FuIGJlIHVzZWQgdG8gZnJlZSB0aGUgY29udGV4dCBhbmQgZXZlcnl0aGluZworICogYWxsb2NhdGVkIGJ5IHRoZSBmcmFtZXdvcmsgd2l0aGluIGl0LgorICovCitBVkZvcm1hdENvbnRleHQgKmF2Zm9ybWF0X2FsbG9jX2NvbnRleHQodm9pZCk7CisKKy8qKgorICogRnJlZSBhbiBBVkZvcm1hdENvbnRleHQgYW5kIGFsbCBpdHMgc3RyZWFtcy4KKyAqIEBwYXJhbSBzIGNvbnRleHQgdG8gZnJlZQorICovCit2b2lkIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChBVkZvcm1hdENvbnRleHQgKnMpOworCisvKioKKyAqIEdldCB0aGUgQVZDbGFzcyBmb3IgQVZGb3JtYXRDb250ZXh0LiBJdCBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoCisgKiBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKIGZvciBleGFtaW5pbmcgb3B0aW9ucy4KKyAqCisgKiBAc2VlIGF2X29wdF9maW5kKCkuCisgKi8KK2NvbnN0IEFWQ2xhc3MgKmF2Zm9ybWF0X2dldF9jbGFzcyh2b2lkKTsKKworLyoqCisgKiBBZGQgYSBuZXcgc3RyZWFtIHRvIGEgbWVkaWEgZmlsZS4KKyAqCisgKiBXaGVuIGRlbXV4aW5nLCBpdCBpcyBjYWxsZWQgYnkgdGhlIGRlbXV4ZXIgaW4gcmVhZF9oZWFkZXIoKS4gSWYgdGhlCisgKiBmbGFnIEFWRk1UQ1RYX05PSEVBREVSIGlzIHNldCBpbiBzLmN0eF9mbGFncywgdGhlbiBpdCBtYXkgYWxzbworICogYmUgY2FsbGVkIGluIHJlYWRfcGFja2V0KCkuCisgKgorICogV2hlbiBtdXhpbmcsIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIHVzZXIgYmVmb3JlIGF2Zm9ybWF0X3dyaXRlX2hlYWRlcigpLgorICoKKyAqIFVzZXIgaXMgcmVxdWlyZWQgdG8gY2FsbCBhdmNvZGVjX2Nsb3NlKCkgYW5kIGF2Zm9ybWF0X2ZyZWVfY29udGV4dCgpIHRvCisgKiBjbGVhbiB1cCB0aGUgYWxsb2NhdGlvbiBieSBhdmZvcm1hdF9uZXdfc3RyZWFtKCkuCisgKgorICogQHBhcmFtIHMgbWVkaWEgZmlsZSBoYW5kbGUKKyAqIEBwYXJhbSBjIElmIG5vbi1OVUxMLCB0aGUgQVZDb2RlY0NvbnRleHQgY29ycmVzcG9uZGluZyB0byB0aGUgbmV3IHN0cmVhbQorICogd2lsbCBiZSBpbml0aWFsaXplZCB0byB1c2UgdGhpcyBjb2RlYy4gVGhpcyBpcyBuZWVkZWQgZm9yIGUuZy4gY29kZWMtc3BlY2lmaWMKKyAqIGRlZmF1bHRzIHRvIGJlIHNldCwgc28gY29kZWMgc2hvdWxkIGJlIHByb3ZpZGVkIGlmIGl0IGlzIGtub3duLgorICoKKyAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBzdHJlYW0gb3IgTlVMTCBvbiBlcnJvci4KKyAqLworQVZTdHJlYW0gKmF2Zm9ybWF0X25ld19zdHJlYW0oQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBBVkNvZGVjICpjKTsKKworLyoqCisgKiBHZXQgc2lkZSBpbmZvcm1hdGlvbiBmcm9tIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3RyZWFtIHN0cmVhbQorICogQHBhcmFtIHR5cGUgZGVzaXJlZCBzaWRlIGluZm9ybWF0aW9uIHR5cGUKKyAqIEBwYXJhbSBzaXplIHBvaW50ZXIgZm9yIHNpZGUgaW5mb3JtYXRpb24gc2l6ZSB0byBzdG9yZSAob3B0aW9uYWwpCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gZGF0YSBpZiBwcmVzZW50IG9yIE5VTEwgb3RoZXJ3aXNlCisgKi8KK3VpbnQ4X3QgKmF2X3N0cmVhbV9nZXRfc2lkZV9kYXRhKEFWU3RyZWFtICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGFja2V0U2lkZURhdGFUeXBlIHR5cGUsIGludCAqc2l6ZSk7CisKK0FWUHJvZ3JhbSAqYXZfbmV3X3Byb2dyYW0oQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWQpOworCisvKioKKyAqIEB9CisgKi8KKworCisvKioKKyAqIEFsbG9jYXRlIGFuIEFWRm9ybWF0Q29udGV4dCBmb3IgYW4gb3V0cHV0IGZvcm1hdC4KKyAqIGF2Zm9ybWF0X2ZyZWVfY29udGV4dCgpIGNhbiBiZSB1c2VkIHRvIGZyZWUgdGhlIGNvbnRleHQgYW5kCisgKiBldmVyeXRoaW5nIGFsbG9jYXRlZCBieSB0aGUgZnJhbWV3b3JrIHdpdGhpbiBpdC4KKyAqCisgKiBAcGFyYW0gKmN0eCBpcyBzZXQgdG8gdGhlIGNyZWF0ZWQgZm9ybWF0IGNvbnRleHQsIG9yIHRvIE5VTEwgaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZQorICogQHBhcmFtIG9mb3JtYXQgZm9ybWF0IHRvIHVzZSBmb3IgYWxsb2NhdGluZyB0aGUgY29udGV4dCwgaWYgTlVMTAorICogZm9ybWF0X25hbWUgYW5kIGZpbGVuYW1lIGFyZSB1c2VkIGluc3RlYWQKKyAqIEBwYXJhbSBmb3JtYXRfbmFtZSB0aGUgbmFtZSBvZiBvdXRwdXQgZm9ybWF0IHRvIHVzZSBmb3IgYWxsb2NhdGluZyB0aGUKKyAqIGNvbnRleHQsIGlmIE5VTEwgZmlsZW5hbWUgaXMgdXNlZCBpbnN0ZWFkCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVuYW1lIHRvIHVzZSBmb3IgYWxsb2NhdGluZyB0aGUKKyAqIGNvbnRleHQsIG1heSBiZSBOVUxMCisgKiBAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBpbiBjYXNlIG9mCisgKiBmYWlsdXJlCisgKi8KK2ludCBhdmZvcm1hdF9hbGxvY19vdXRwdXRfY29udGV4dDIoQVZGb3JtYXRDb250ZXh0ICoqY3R4LCBBVk91dHB1dEZvcm1hdCAqb2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0X25hbWUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworLyoqCisgKiBAYWRkdG9ncm91cCBsYXZmX2RlY29kaW5nCisgKiBAeworICovCisKKy8qKgorICogRmluZCBBVklucHV0Rm9ybWF0IGJhc2VkIG9uIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBpbnB1dCBmb3JtYXQuCisgKi8KK0FWSW5wdXRGb3JtYXQgKmF2X2ZpbmRfaW5wdXRfZm9ybWF0KGNvbnN0IGNoYXIgKnNob3J0X25hbWUpOworCisvKioKKyAqIEd1ZXNzIHRoZSBmaWxlIGZvcm1hdC4KKyAqCisgKiBAcGFyYW0gcGQgICAgICAgIGRhdGEgdG8gYmUgcHJvYmVkCisgKiBAcGFyYW0gaXNfb3BlbmVkIFdoZXRoZXIgdGhlIGZpbGUgaXMgYWxyZWFkeSBvcGVuZWQ7IGRldGVybWluZXMgd2hldGhlcgorICogICAgICAgICAgICAgICAgICBkZW11eGVycyB3aXRoIG9yIHdpdGhvdXQgQVZGTVRfTk9GSUxFIGFyZSBwcm9iZWQuCisgKi8KK0FWSW5wdXRGb3JtYXQgKmF2X3Byb2JlX2lucHV0X2Zvcm1hdChBVlByb2JlRGF0YSAqcGQsIGludCBpc19vcGVuZWQpOworCisvKioKKyAqIEd1ZXNzIHRoZSBmaWxlIGZvcm1hdC4KKyAqCisgKiBAcGFyYW0gcGQgICAgICAgIGRhdGEgdG8gYmUgcHJvYmVkCisgKiBAcGFyYW0gaXNfb3BlbmVkIFdoZXRoZXIgdGhlIGZpbGUgaXMgYWxyZWFkeSBvcGVuZWQ7IGRldGVybWluZXMgd2hldGhlcgorICogICAgICAgICAgICAgICAgICBkZW11eGVycyB3aXRoIG9yIHdpdGhvdXQgQVZGTVRfTk9GSUxFIGFyZSBwcm9iZWQuCisgKiBAcGFyYW0gc2NvcmVfbWF4IEEgcHJvYmUgc2NvcmUgbGFyZ2VyIHRoYXQgdGhpcyBpcyByZXF1aXJlZCB0byBhY2NlcHQgYQorICogICAgICAgICAgICAgICAgICBkZXRlY3Rpb24sIHRoZSB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIGFjdHVhbCBkZXRlY3Rpb24KKyAqICAgICAgICAgICAgICAgICAgc2NvcmUgYWZ0ZXJ3YXJkcy4KKyAqICAgICAgICAgICAgICAgICAgSWYgdGhlIHNjb3JlIGlzIDw9IEFWUFJPQkVfU0NPUkVfTUFYIC8gNCBpdCBpcyByZWNvbW1lbmRlZAorICogICAgICAgICAgICAgICAgICB0byByZXRyeSB3aXRoIGEgbGFyZ2VyIHByb2JlIGJ1ZmZlci4KKyAqLworQVZJbnB1dEZvcm1hdCAqYXZfcHJvYmVfaW5wdXRfZm9ybWF0MihBVlByb2JlRGF0YSAqcGQsIGludCBpc19vcGVuZWQsIGludCAqc2NvcmVfbWF4KTsKKworLyoqCisgKiBHdWVzcyB0aGUgZmlsZSBmb3JtYXQuCisgKgorICogQHBhcmFtIGlzX29wZW5lZCBXaGV0aGVyIHRoZSBmaWxlIGlzIGFscmVhZHkgb3BlbmVkOyBkZXRlcm1pbmVzIHdoZXRoZXIKKyAqICAgICAgICAgICAgICAgICAgZGVtdXhlcnMgd2l0aCBvciB3aXRob3V0IEFWRk1UX05PRklMRSBhcmUgcHJvYmVkLgorICogQHBhcmFtIHNjb3JlX3JldCBUaGUgc2NvcmUgb2YgdGhlIGJlc3QgZGV0ZWN0aW9uLgorICovCitBVklucHV0Rm9ybWF0ICphdl9wcm9iZV9pbnB1dF9mb3JtYXQzKEFWUHJvYmVEYXRhICpwZCwgaW50IGlzX29wZW5lZCwgaW50ICpzY29yZV9yZXQpOworCisvKioKKyAqIFByb2JlIGEgYnl0ZXN0cmVhbSB0byBkZXRlcm1pbmUgdGhlIGlucHV0IGZvcm1hdC4gRWFjaCB0aW1lIGEgcHJvYmUgcmV0dXJucworICogd2l0aCBhIHNjb3JlIHRoYXQgaXMgdG9vIGxvdywgdGhlIHByb2JlIGJ1ZmZlciBzaXplIGlzIGluY3JlYXNlZCBhbmQgYW5vdGhlcgorICogYXR0ZW1wdCBpcyBtYWRlLiBXaGVuIHRoZSBtYXhpbXVtIHByb2JlIHNpemUgaXMgcmVhY2hlZCwgdGhlIGlucHV0IGZvcm1hdAorICogd2l0aCB0aGUgaGlnaGVzdCBzY29yZSBpcyByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gcGIgdGhlIGJ5dGVzdHJlYW0gdG8gcHJvYmUKKyAqIEBwYXJhbSBmbXQgdGhlIGlucHV0IGZvcm1hdCBpcyBwdXQgaGVyZQorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSBvZiB0aGUgc3RyZWFtCisgKiBAcGFyYW0gbG9nY3R4IHRoZSBsb2cgY29udGV4dAorICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYnl0ZXN0cmVhbSB0byBwcm9iZSBmcm9tCisgKiBAcGFyYW0gbWF4X3Byb2JlX3NpemUgdGhlIG1heGltdW0gcHJvYmUgYnVmZmVyIHNpemUgKHplcm8gZm9yIGRlZmF1bHQpCisgKiBAcmV0dXJuIHRoZSBzY29yZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbgorICogICAgICAgICB0aGUgbWF4aW1hbCBzY29yZSBpcyBBVlBST0JFX1NDT1JFX01BWAorICogQVZFUlJPUiBjb2RlIG90aGVyd2lzZQorICovCitpbnQgYXZfcHJvYmVfaW5wdXRfYnVmZmVyMihBVklPQ29udGV4dCAqcGIsIEFWSW5wdXRGb3JtYXQgKipmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqbG9nY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IG1heF9wcm9iZV9zaXplKTsKKworLyoqCisgKiBMaWtlIGF2X3Byb2JlX2lucHV0X2J1ZmZlcjIoKSBidXQgcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAqLworaW50IGF2X3Byb2JlX2lucHV0X2J1ZmZlcihBVklPQ29udGV4dCAqcGIsIEFWSW5wdXRGb3JtYXQgKipmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpsb2djdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBtYXhfcHJvYmVfc2l6ZSk7CisKKy8qKgorICogT3BlbiBhbiBpbnB1dCBzdHJlYW0gYW5kIHJlYWQgdGhlIGhlYWRlci4gVGhlIGNvZGVjcyBhcmUgbm90IG9wZW5lZC4KKyAqIFRoZSBzdHJlYW0gbXVzdCBiZSBjbG9zZWQgd2l0aCBhdmZvcm1hdF9jbG9zZV9pbnB1dCgpLgorICoKKyAqIEBwYXJhbSBwcyBQb2ludGVyIHRvIHVzZXItc3VwcGxpZWQgQVZGb3JtYXRDb250ZXh0IChhbGxvY2F0ZWQgYnkgYXZmb3JtYXRfYWxsb2NfY29udGV4dCkuCisgKiAgICAgICAgICAgTWF5IGJlIGEgcG9pbnRlciB0byBOVUxMLCBpbiB3aGljaCBjYXNlIGFuIEFWRm9ybWF0Q29udGV4dCBpcyBhbGxvY2F0ZWQgYnkgdGhpcworICogICAgICAgICAgIGZ1bmN0aW9uIGFuZCB3cml0dGVuIGludG8gcHMuCisgKiAgICAgICAgICAgTm90ZSB0aGF0IGEgdXNlci1zdXBwbGllZCBBVkZvcm1hdENvbnRleHQgd2lsbCBiZSBmcmVlZCBvbiBmYWlsdXJlLgorICogQHBhcmFtIGZpbGVuYW1lIE5hbWUgb2YgdGhlIHN0cmVhbSB0byBvcGVuLgorICogQHBhcmFtIGZtdCBJZiBub24tTlVMTCwgdGhpcyBwYXJhbWV0ZXIgZm9yY2VzIGEgc3BlY2lmaWMgaW5wdXQgZm9ybWF0LgorICogICAgICAgICAgICBPdGhlcndpc2UgdGhlIGZvcm1hdCBpcyBhdXRvZGV0ZWN0ZWQuCisgKiBAcGFyYW0gb3B0aW9ucyAgQSBkaWN0aW9uYXJ5IGZpbGxlZCB3aXRoIEFWRm9ybWF0Q29udGV4dCBhbmQgZGVtdXhlci1wcml2YXRlIG9wdGlvbnMuCisgKiAgICAgICAgICAgICAgICAgT24gcmV0dXJuIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgZGVzdHJveWVkIGFuZCByZXBsYWNlZCB3aXRoIGEgZGljdCBjb250YWluaW5nCisgKiAgICAgICAgICAgICAgICAgb3B0aW9ucyB0aGF0IHdlcmUgbm90IGZvdW5kLiBNYXkgYmUgTlVMTC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIG9uIGZhaWx1cmUuCisgKgorICogQG5vdGUgSWYgeW91IHdhbnQgdG8gdXNlIGN1c3RvbSBJTywgcHJlYWxsb2NhdGUgdGhlIGZvcm1hdCBjb250ZXh0IGFuZCBzZXQgaXRzIHBiIGZpZWxkLgorICovCitpbnQgYXZmb3JtYXRfb3Blbl9pbnB1dChBVkZvcm1hdENvbnRleHQgKipwcywgY29uc3QgY2hhciAqZmlsZW5hbWUsIEFWSW5wdXRGb3JtYXQgKmZtdCwgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucyk7CisKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitpbnQgYXZfZGVtdXhlcl9vcGVuKEFWRm9ybWF0Q29udGV4dCAqaWMpOworCisvKioKKyAqIFJlYWQgcGFja2V0cyBvZiBhIG1lZGlhIGZpbGUgdG8gZ2V0IHN0cmVhbSBpbmZvcm1hdGlvbi4gVGhpcworICogaXMgdXNlZnVsIGZvciBmaWxlIGZvcm1hdHMgd2l0aCBubyBoZWFkZXJzIHN1Y2ggYXMgTVBFRy4gVGhpcworICogZnVuY3Rpb24gYWxzbyBjb21wdXRlcyB0aGUgcmVhbCBmcmFtZXJhdGUgaW4gY2FzZSBvZiBNUEVHLTIgcmVwZWF0CisgKiBmcmFtZSBtb2RlLgorICogVGhlIGxvZ2ljYWwgZmlsZSBwb3NpdGlvbiBpcyBub3QgY2hhbmdlZCBieSB0aGlzIGZ1bmN0aW9uOworICogZXhhbWluZWQgcGFja2V0cyBtYXkgYmUgYnVmZmVyZWQgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCisgKgorICogQHBhcmFtIGljIG1lZGlhIGZpbGUgaGFuZGxlCisgKiBAcGFyYW0gb3B0aW9ucyAgSWYgbm9uLU5VTEwsIGFuIGljLm5iX3N0cmVhbXMgbG9uZyBhcnJheSBvZiBwb2ludGVycyB0bworICogICAgICAgICAgICAgICAgIGRpY3Rpb25hcmllcywgd2hlcmUgaS10aCBtZW1iZXIgY29udGFpbnMgb3B0aW9ucyBmb3IKKyAqICAgICAgICAgICAgICAgICBjb2RlYyBjb3JyZXNwb25kaW5nIHRvIGktdGggc3RyZWFtLgorICogICAgICAgICAgICAgICAgIE9uIHJldHVybiBlYWNoIGRpY3Rpb25hcnkgd2lsbCBiZSBmaWxsZWQgd2l0aCBvcHRpb25zIHRoYXQgd2VyZSBub3QgZm91bmQuCisgKiBAcmV0dXJuID49MCBpZiBPSywgQVZFUlJPUl94eHggb24gZXJyb3IKKyAqCisgKiBAbm90ZSB0aGlzIGZ1bmN0aW9uIGlzbid0IGd1YXJhbnRlZWQgdG8gb3BlbiBhbGwgdGhlIGNvZGVjcywgc28KKyAqICAgICAgIG9wdGlvbnMgYmVpbmcgbm9uLWVtcHR5IGF0IHJldHVybiBpcyBhIHBlcmZlY3RseSBub3JtYWwgYmVoYXZpb3IuCisgKgorICogQHRvZG8gTGV0IHRoZSB1c2VyIGRlY2lkZSBzb21laG93IHdoYXQgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHNvIHRoYXQKKyAqICAgICAgIHdlIGRvIG5vdCB3YXN0ZSB0aW1lIGdldHRpbmcgc3R1ZmYgdGhlIHVzZXIgZG9lcyBub3QgbmVlZC4KKyAqLworaW50IGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oQVZGb3JtYXRDb250ZXh0ICppYywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucyk7CisKKy8qKgorICogRmluZCB0aGUgcHJvZ3JhbXMgd2hpY2ggYmVsb25nIHRvIGEgZ2l2ZW4gc3RyZWFtLgorICoKKyAqIEBwYXJhbSBpYyAgICBtZWRpYSBmaWxlIGhhbmRsZQorICogQHBhcmFtIGxhc3QgIHRoZSBsYXN0IGZvdW5kIHByb2dyYW0sIHRoZSBzZWFyY2ggd2lsbCBzdGFydCBhZnRlciB0aGlzCisgKiAgICAgICAgICAgICAgcHJvZ3JhbSwgb3IgZnJvbSB0aGUgYmVnaW5uaW5nIGlmIGl0IGlzIE5VTEwKKyAqIEBwYXJhbSBzICAgICBzdHJlYW0gaW5kZXgKKyAqIEByZXR1cm4gdGhlIG5leHQgcHJvZ3JhbSB3aGljaCBiZWxvbmdzIHRvIHMsIE5VTEwgaWYgbm8gcHJvZ3JhbSBpcyBmb3VuZCBvcgorICogICAgICAgICB0aGUgbGFzdCBwcm9ncmFtIGlzIG5vdCBhbW9uZyB0aGUgcHJvZ3JhbXMgb2YgaWMuCisgKi8KK0FWUHJvZ3JhbSAqYXZfZmluZF9wcm9ncmFtX2Zyb21fc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqaWMsIEFWUHJvZ3JhbSAqbGFzdCwgaW50IHMpOworCisvKioKKyAqIEZpbmQgdGhlICJiZXN0IiBzdHJlYW0gaW4gdGhlIGZpbGUuCisgKiBUaGUgYmVzdCBzdHJlYW0gaXMgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8gdmFyaW91cyBoZXVyaXN0aWNzIGFzIHRoZSBtb3N0CisgKiBsaWtlbHkgdG8gYmUgd2hhdCB0aGUgdXNlciBleHBlY3RzLgorICogSWYgdGhlIGRlY29kZXIgcGFyYW1ldGVyIGlzIG5vbi1OVUxMLCBhdl9maW5kX2Jlc3Rfc3RyZWFtIHdpbGwgZmluZCB0aGUKKyAqIGRlZmF1bHQgZGVjb2RlciBmb3IgdGhlIHN0cmVhbSdzIGNvZGVjOyBzdHJlYW1zIGZvciB3aGljaCBubyBkZWNvZGVyIGNhbgorICogYmUgZm91bmQgYXJlIGlnbm9yZWQuCisgKgorICogQHBhcmFtIGljICAgICAgICAgICAgICAgIG1lZGlhIGZpbGUgaGFuZGxlCisgKiBAcGFyYW0gdHlwZSAgICAgICAgICAgICAgc3RyZWFtIHR5cGU6IHZpZGVvLCBhdWRpbywgc3VidGl0bGVzLCBldGMuCisgKiBAcGFyYW0gd2FudGVkX3N0cmVhbV9uYiAgdXNlci1yZXF1ZXN0ZWQgc3RyZWFtIG51bWJlciwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciAtMSBmb3IgYXV0b21hdGljIHNlbGVjdGlvbgorICogQHBhcmFtIHJlbGF0ZWRfc3RyZWFtICAgIHRyeSB0byBmaW5kIGEgc3RyZWFtIHJlbGF0ZWQgKGVnLiBpbiB0aGUgc2FtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0pIHRvIHRoaXMgb25lLCBvciAtMSBpZiBub25lCisgKiBAcGFyYW0gZGVjb2Rlcl9yZXQgICAgICAgaWYgbm9uLU5VTEwsIHJldHVybnMgdGhlIGRlY29kZXIgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIHN0cmVhbQorICogQHBhcmFtIGZsYWdzICAgICAgICAgICAgIGZsYWdzOyBub25lIGFyZSBjdXJyZW50bHkgZGVmaW5lZAorICogQHJldHVybiAgdGhlIG5vbi1uZWdhdGl2ZSBzdHJlYW0gbnVtYmVyIGluIGNhc2Ugb2Ygc3VjY2VzcywKKyAqICAgICAgICAgIEFWRVJST1JfU1RSRUFNX05PVF9GT1VORCBpZiBubyBzdHJlYW0gd2l0aCB0aGUgcmVxdWVzdGVkIHR5cGUKKyAqICAgICAgICAgIGNvdWxkIGJlIGZvdW5kLAorICogICAgICAgICAgQVZFUlJPUl9ERUNPREVSX05PVF9GT1VORCBpZiBzdHJlYW1zIHdlcmUgZm91bmQgYnV0IG5vIGRlY29kZXIKKyAqIEBub3RlICBJZiBhdl9maW5kX2Jlc3Rfc3RyZWFtIHJldHVybnMgc3VjY2Vzc2Z1bGx5IGFuZCBkZWNvZGVyX3JldCBpcyBub3QKKyAqICAgICAgICBOVUxMLCB0aGVuICpkZWNvZGVyX3JldCBpcyBndWFyYW50ZWVkIHRvIGJlIHNldCB0byBhIHZhbGlkIEFWQ29kZWMuCisgKi8KK2ludCBhdl9maW5kX2Jlc3Rfc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqaWMsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2FudGVkX3N0cmVhbV9uYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWxhdGVkX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWMgKipkZWNvZGVyX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBuZXh0IGZyYW1lIG9mIGEgc3RyZWFtLgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHdoYXQgaXMgc3RvcmVkIGluIHRoZSBmaWxlLCBhbmQgZG9lcyBub3QgdmFsaWRhdGUKKyAqIHRoYXQgd2hhdCBpcyB0aGVyZSBhcmUgdmFsaWQgZnJhbWVzIGZvciB0aGUgZGVjb2Rlci4gSXQgd2lsbCBzcGxpdCB3aGF0IGlzCisgKiBzdG9yZWQgaW4gdGhlIGZpbGUgaW50byBmcmFtZXMgYW5kIHJldHVybiBvbmUgZm9yIGVhY2ggY2FsbC4gSXQgd2lsbCBub3QKKyAqIG9taXQgaW52YWxpZCBkYXRhIGJldHdlZW4gdmFsaWQgZnJhbWVzIHNvIGFzIHRvIGdpdmUgdGhlIGRlY29kZXIgdGhlIG1heGltdW0KKyAqIGluZm9ybWF0aW9uIHBvc3NpYmxlIGZvciBkZWNvZGluZy4KKyAqCisgKiBJZiBwa3QtPmJ1ZiBpcyBOVUxMLCB0aGVuIHRoZSBwYWNrZXQgaXMgdmFsaWQgdW50aWwgdGhlIG5leHQKKyAqIGF2X3JlYWRfZnJhbWUoKSBvciB1bnRpbCBhdmZvcm1hdF9jbG9zZV9pbnB1dCgpLiBPdGhlcndpc2UgdGhlIHBhY2tldAorICogaXMgdmFsaWQgaW5kZWZpbml0ZWx5LiBJbiBib3RoIGNhc2VzIHRoZSBwYWNrZXQgbXVzdCBiZSBmcmVlZCB3aXRoCisgKiBhdl9mcmVlX3BhY2tldCB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuIEZvciB2aWRlbywgdGhlIHBhY2tldCBjb250YWlucworICogZXhhY3RseSBvbmUgZnJhbWUuIEZvciBhdWRpbywgaXQgY29udGFpbnMgYW4gaW50ZWdlciBudW1iZXIgb2YgZnJhbWVzIGlmIGVhY2gKKyAqIGZyYW1lIGhhcyBhIGtub3duIGZpeGVkIHNpemUgKGUuZy4gUENNIG9yIEFEUENNIGRhdGEpLiBJZiB0aGUgYXVkaW8gZnJhbWVzCisgKiBoYXZlIGEgdmFyaWFibGUgc2l6ZSAoZS5nLiBNUEVHIGF1ZGlvKSwgdGhlbiBpdCBjb250YWlucyBvbmUgZnJhbWUuCisgKgorICogcGt0LT5wdHMsIHBrdC0+ZHRzIGFuZCBwa3QtPmR1cmF0aW9uIGFyZSBhbHdheXMgc2V0IHRvIGNvcnJlY3QKKyAqIHZhbHVlcyBpbiBBVlN0cmVhbS50aW1lX2Jhc2UgdW5pdHMgKGFuZCBndWVzc2VkIGlmIHRoZSBmb3JtYXQgY2Fubm90CisgKiBwcm92aWRlIHRoZW0pLiBwa3QtPnB0cyBjYW4gYmUgQVZfTk9QVFNfVkFMVUUgaWYgdGhlIHZpZGVvIGZvcm1hdAorICogaGFzIEItZnJhbWVzLCBzbyBpdCBpcyBiZXR0ZXIgdG8gcmVseSBvbiBwa3QtPmR0cyBpZiB5b3UgZG8gbm90CisgKiBkZWNvbXByZXNzIHRoZSBwYXlsb2FkLgorICoKKyAqIEByZXR1cm4gMCBpZiBPSywgPCAwIG9uIGVycm9yIG9yIGVuZCBvZiBmaWxlCisgKi8KK2ludCBhdl9yZWFkX2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCk7CisKKy8qKgorICogU2VlayB0byB0aGUga2V5ZnJhbWUgYXQgdGltZXN0YW1wLgorICogJ3RpbWVzdGFtcCcgaW4gJ3N0cmVhbV9pbmRleCcuCisgKgorICogQHBhcmFtIHMgbWVkaWEgZmlsZSBoYW5kbGUKKyAqIEBwYXJhbSBzdHJlYW1faW5kZXggSWYgc3RyZWFtX2luZGV4IGlzICgtMSksIGEgZGVmYXVsdAorICogc3RyZWFtIGlzIHNlbGVjdGVkLCBhbmQgdGltZXN0YW1wIGlzIGF1dG9tYXRpY2FsbHkgY29udmVydGVkCisgKiBmcm9tIEFWX1RJTUVfQkFTRSB1bml0cyB0byB0aGUgc3RyZWFtIHNwZWNpZmljIHRpbWVfYmFzZS4KKyAqIEBwYXJhbSB0aW1lc3RhbXAgVGltZXN0YW1wIGluIEFWU3RyZWFtLnRpbWVfYmFzZSB1bml0cworICogICAgICAgIG9yLCBpZiBubyBzdHJlYW0gaXMgc3BlY2lmaWVkLCBpbiBBVl9USU1FX0JBU0UgdW5pdHMuCisgKiBAcGFyYW0gZmxhZ3MgZmxhZ3Mgd2hpY2ggc2VsZWN0IGRpcmVjdGlvbiBhbmQgc2Vla2luZyBtb2RlCisgKiBAcmV0dXJuID49IDAgb24gc3VjY2VzcworICovCitpbnQgYXZfc2Vla19mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKworLyoqCisgKiBTZWVrIHRvIHRpbWVzdGFtcCB0cy4KKyAqIFNlZWtpbmcgd2lsbCBiZSBkb25lIHNvIHRoYXQgdGhlIHBvaW50IGZyb20gd2hpY2ggYWxsIGFjdGl2ZSBzdHJlYW1zCisgKiBjYW4gYmUgcHJlc2VudGVkIHN1Y2Nlc3NmdWxseSB3aWxsIGJlIGNsb3Nlc3QgdG8gdHMgYW5kIHdpdGhpbiBtaW4vbWF4X3RzLgorICogQWN0aXZlIHN0cmVhbXMgYXJlIGFsbCBzdHJlYW1zIHRoYXQgaGF2ZSBBVlN0cmVhbS5kaXNjYXJkIDwgQVZESVNDQVJEX0FMTC4KKyAqCisgKiBJZiBmbGFncyBjb250YWluIEFWU0VFS19GTEFHX0JZVEUsIHRoZW4gYWxsIHRpbWVzdGFtcHMgYXJlIGluIGJ5dGVzIGFuZAorICogYXJlIHRoZSBmaWxlIHBvc2l0aW9uICh0aGlzIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IGFsbCBkZW11eGVycykuCisgKiBJZiBmbGFncyBjb250YWluIEFWU0VFS19GTEFHX0ZSQU1FLCB0aGVuIGFsbCB0aW1lc3RhbXBzIGFyZSBpbiBmcmFtZXMKKyAqIGluIHRoZSBzdHJlYW0gd2l0aCBzdHJlYW1faW5kZXggKHRoaXMgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgYnkgYWxsIGRlbXV4ZXJzKS4KKyAqIE90aGVyd2lzZSBhbGwgdGltZXN0YW1wcyBhcmUgaW4gdW5pdHMgb2YgdGhlIHN0cmVhbSBzZWxlY3RlZCBieSBzdHJlYW1faW5kZXgKKyAqIG9yIGlmIHN0cmVhbV9pbmRleCBpcyAtMSwgaW4gQVZfVElNRV9CQVNFIHVuaXRzLgorICogSWYgZmxhZ3MgY29udGFpbiBBVlNFRUtfRkxBR19BTlksIHRoZW4gbm9uLWtleWZyYW1lcyBhcmUgdHJlYXRlZCBhcworICoga2V5ZnJhbWVzICh0aGlzIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IGFsbCBkZW11eGVycykuCisgKiBJZiBmbGFncyBjb250YWluIEFWU0VFS19GTEFHX0JBQ0tXQVJELCBpdCBpcyBpZ25vcmVkLgorICoKKyAqIEBwYXJhbSBzIG1lZGlhIGZpbGUgaGFuZGxlCisgKiBAcGFyYW0gc3RyZWFtX2luZGV4IGluZGV4IG9mIHRoZSBzdHJlYW0gd2hpY2ggaXMgdXNlZCBhcyB0aW1lIGJhc2UgcmVmZXJlbmNlCisgKiBAcGFyYW0gbWluX3RzIHNtYWxsZXN0IGFjY2VwdGFibGUgdGltZXN0YW1wCisgKiBAcGFyYW0gdHMgdGFyZ2V0IHRpbWVzdGFtcAorICogQHBhcmFtIG1heF90cyBsYXJnZXN0IGFjY2VwdGFibGUgdGltZXN0YW1wCisgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MKKyAqIEByZXR1cm4gPj0wIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKgorICogQG5vdGUgVGhpcyBpcyBwYXJ0IG9mIHRoZSBuZXcgc2VlayBBUEkgd2hpY2ggaXMgc3RpbGwgdW5kZXIgY29uc3RydWN0aW9uLgorICogICAgICAgVGh1cyBkbyBub3QgdXNlIHRoaXMgeWV0LiBJdCBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLCBkbyBub3QgZXhwZWN0CisgKiAgICAgICBBQkkgY29tcGF0aWJpbGl0eSB5ZXQhCisgKi8KK2ludCBhdmZvcm1hdF9zZWVrX2ZpbGUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LCBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncyk7CisKKy8qKgorICogU3RhcnQgcGxheWluZyBhIG5ldHdvcmstYmFzZWQgc3RyZWFtIChlLmcuIFJUU1Agc3RyZWFtKSBhdCB0aGUKKyAqIGN1cnJlbnQgcG9zaXRpb24uCisgKi8KK2ludCBhdl9yZWFkX3BsYXkoQVZGb3JtYXRDb250ZXh0ICpzKTsKKworLyoqCisgKiBQYXVzZSBhIG5ldHdvcmstYmFzZWQgc3RyZWFtIChlLmcuIFJUU1Agc3RyZWFtKS4KKyAqCisgKiBVc2UgYXZfcmVhZF9wbGF5KCkgdG8gcmVzdW1lIGl0LgorICovCitpbnQgYXZfcmVhZF9wYXVzZShBVkZvcm1hdENvbnRleHQgKnMpOworCisvKioKKyAqIENsb3NlIGFuIG9wZW5lZCBpbnB1dCBBVkZvcm1hdENvbnRleHQuIEZyZWUgaXQgYW5kIGFsbCBpdHMgY29udGVudHMKKyAqIGFuZCBzZXQgKnMgdG8gTlVMTC4KKyAqLwordm9pZCBhdmZvcm1hdF9jbG9zZV9pbnB1dChBVkZvcm1hdENvbnRleHQgKipzKTsKKy8qKgorICogQH0KKyAqLworCisjZGVmaW5lIEFWU0VFS19GTEFHX0JBQ0tXQVJEIDEgLy8vPCBzZWVrIGJhY2t3YXJkCisjZGVmaW5lIEFWU0VFS19GTEFHX0JZVEUgICAgIDIgLy8vPCBzZWVraW5nIGJhc2VkIG9uIHBvc2l0aW9uIGluIGJ5dGVzCisjZGVmaW5lIEFWU0VFS19GTEFHX0FOWSAgICAgIDQgLy8vPCBzZWVrIHRvIGFueSBmcmFtZSwgZXZlbiBub24ta2V5ZnJhbWVzCisjZGVmaW5lIEFWU0VFS19GTEFHX0ZSQU1FICAgIDggLy8vPCBzZWVraW5nIGJhc2VkIG9uIGZyYW1lIG51bWJlcgorCisvKioKKyAqIEBhZGR0b2dyb3VwIGxhdmZfZW5jb2RpbmcKKyAqIEB7CisgKi8KKy8qKgorICogQWxsb2NhdGUgdGhlIHN0cmVhbSBwcml2YXRlIGRhdGEgYW5kIHdyaXRlIHRoZSBzdHJlYW0gaGVhZGVyIHRvCisgKiBhbiBvdXRwdXQgbWVkaWEgZmlsZS4KKyAqCisgKiBAcGFyYW0gcyBNZWRpYSBmaWxlIGhhbmRsZSwgbXVzdCBiZSBhbGxvY2F0ZWQgd2l0aCBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCkuCisgKiAgICAgICAgICBJdHMgb2Zvcm1hdCBmaWVsZCBtdXN0IGJlIHNldCB0byB0aGUgZGVzaXJlZCBvdXRwdXQgZm9ybWF0OworICogICAgICAgICAgSXRzIHBiIGZpZWxkIG11c3QgYmUgc2V0IHRvIGFuIGFscmVhZHkgb3BlbmVkIEFWSU9Db250ZXh0LgorICogQHBhcmFtIG9wdGlvbnMgIEFuIEFWRGljdGlvbmFyeSBmaWxsZWQgd2l0aCBBVkZvcm1hdENvbnRleHQgYW5kIG11eGVyLXByaXZhdGUgb3B0aW9ucy4KKyAqICAgICAgICAgICAgICAgICBPbiByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBkZXN0cm95ZWQgYW5kIHJlcGxhY2VkIHdpdGggYSBkaWN0IGNvbnRhaW5pbmcKKyAqICAgICAgICAgICAgICAgICBvcHRpb25zIHRoYXQgd2VyZSBub3QgZm91bmQuIE1heSBiZSBOVUxMLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIG9uIGZhaWx1cmUuCisgKgorICogQHNlZSBhdl9vcHRfZmluZCwgYXZfZGljdF9zZXQsIGF2aW9fb3BlbiwgYXZfb2Zvcm1hdF9uZXh0LgorICovCitpbnQgYXZmb3JtYXRfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucyk7CisKKy8qKgorICogV3JpdGUgYSBwYWNrZXQgdG8gYW4gb3V0cHV0IG1lZGlhIGZpbGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBwYXNzZXMgdGhlIHBhY2tldCBkaXJlY3RseSB0byB0aGUgbXV4ZXIsIHdpdGhvdXQgYW55IGJ1ZmZlcmluZworICogb3IgcmVvcmRlcmluZy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY29ycmVjdGx5IGludGVybGVhdmluZyB0aGUKKyAqIHBhY2tldHMgaWYgdGhlIGZvcm1hdCByZXF1aXJlcyBpdC4gQ2FsbGVycyB0aGF0IHdhbnQgbGliYXZmb3JtYXQgdG8gaGFuZGxlCisgKiB0aGUgaW50ZXJsZWF2aW5nIHNob3VsZCBjYWxsIGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKCkgaW5zdGVhZCBvZiB0aGlzCisgKiBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gcyBtZWRpYSBmaWxlIGhhbmRsZQorICogQHBhcmFtIHBrdCBUaGUgcGFja2V0IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4gTm90ZSB0aGF0IHVubGlrZQorICogICAgICAgICAgICBhdl9pbnRlcmxlYXZlZF93cml0ZV9mcmFtZSgpLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UKKyAqICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoZSBwYWNrZXQgcGFzc2VkIHRvIGl0ICh0aG91Z2ggc29tZSBtdXhlcnMgbWF5IG1ha2UKKyAqICAgICAgICAgICAgYW4gaW50ZXJuYWwgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBwYWNrZXQpLgorICogICAgICAgICAgICA8YnI+CisgKiAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBOVUxMIChhdCBhbnkgdGltZSwgbm90IGp1c3QgYXQgdGhlIGVuZCksIGluCisgKiAgICAgICAgICAgIG9yZGVyIHRvIGltbWVkaWF0ZWx5IGZsdXNoIGRhdGEgYnVmZmVyZWQgd2l0aGluIHRoZSBtdXhlciwgZm9yCisgKiAgICAgICAgICAgIG11eGVycyB0aGF0IGJ1ZmZlciB1cCBkYXRhIGludGVybmFsbHkgYmVmb3JlIHdyaXRpbmcgaXQgdG8gdGhlCisgKiAgICAgICAgICAgIG91dHB1dC4KKyAqICAgICAgICAgICAgPGJyPgorICogICAgICAgICAgICBQYWNrZXQncyBAcmVmIEFWUGFja2V0LnN0cmVhbV9pbmRleCAic3RyZWFtX2luZGV4IiBmaWVsZCBtdXN0IGJlCisgKiAgICAgICAgICAgIHNldCB0byB0aGUgaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmcgc3RyZWFtIGluIEByZWYKKyAqICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0LnN0cmVhbXMgInMtPnN0cmVhbXMiLiBJdCBpcyB2ZXJ5IHN0cm9uZ2x5CisgKiAgICAgICAgICAgIHJlY29tbWVuZGVkIHRoYXQgdGltaW5nIGluZm9ybWF0aW9uIChAcmVmIEFWUGFja2V0LnB0cyAicHRzIiwgQHJlZgorICogICAgICAgICAgICBBVlBhY2tldC5kdHMgImR0cyIsIEByZWYgQVZQYWNrZXQuZHVyYXRpb24gImR1cmF0aW9uIikgaXMgc2V0IHRvCisgKiAgICAgICAgICAgIGNvcnJlY3QgdmFsdWVzLgorICogQHJldHVybiA8IDAgb24gZXJyb3IsID0gMCBpZiBPSywgMSBpZiBmbHVzaGVkIGFuZCB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8gZmx1c2gKKyAqCisgKiBAc2VlIGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKCkKKyAqLworaW50IGF2X3dyaXRlX2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCk7CisKKy8qKgorICogV3JpdGUgYSBwYWNrZXQgdG8gYW4gb3V0cHV0IG1lZGlhIGZpbGUgZW5zdXJpbmcgY29ycmVjdCBpbnRlcmxlYXZpbmcuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJ1ZmZlciB0aGUgcGFja2V0cyBpbnRlcm5hbGx5IGFzIG5lZWRlZCB0byBtYWtlIHN1cmUgdGhlCisgKiBwYWNrZXRzIGluIHRoZSBvdXRwdXQgZmlsZSBhcmUgcHJvcGVybHkgaW50ZXJsZWF2ZWQgaW4gdGhlIG9yZGVyIG9mCisgKiBpbmNyZWFzaW5nIGR0cy4gQ2FsbGVycyBkb2luZyB0aGVpciBvd24gaW50ZXJsZWF2aW5nIHNob3VsZCBjYWxsCisgKiBhdl93cml0ZV9mcmFtZSgpIGluc3RlYWQgb2YgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gcyBtZWRpYSBmaWxlIGhhbmRsZQorICogQHBhcmFtIHBrdCBUaGUgcGFja2V0IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAqICAgICAgICAgICAgPGJyPgorICogICAgICAgICAgICBJZiB0aGUgcGFja2V0IGlzIHJlZmVyZW5jZS1jb3VudGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgdGFrZQorICogICAgICAgICAgICBvd25lcnNoaXAgb2YgdGhpcyByZWZlcmVuY2UgYW5kIHVucmVmZXJlbmNlIGl0IGxhdGVyIHdoZW4gaXQgc2VlcworICogICAgICAgICAgICBmaXQuCisgKiAgICAgICAgICAgIFRoZSBjYWxsZXIgbXVzdCBub3QgYWNjZXNzIHRoZSBkYXRhIHRocm91Z2ggdGhpcyByZWZlcmVuY2UgYWZ0ZXIKKyAqICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiByZXR1cm5zLiBJZiB0aGUgcGFja2V0IGlzIG5vdCByZWZlcmVuY2UtY291bnRlZCwKKyAqICAgICAgICAgICAgbGliYXZmb3JtYXQgd2lsbCBtYWtlIGEgY29weS4KKyAqICAgICAgICAgICAgPGJyPgorICogICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgTlVMTCAoYXQgYW55IHRpbWUsIG5vdCBqdXN0IGF0IHRoZSBlbmQpLCB0bworICogICAgICAgICAgICBmbHVzaCB0aGUgaW50ZXJsZWF2aW5nIHF1ZXVlcy4KKyAqICAgICAgICAgICAgPGJyPgorICogICAgICAgICAgICBQYWNrZXQncyBAcmVmIEFWUGFja2V0LnN0cmVhbV9pbmRleCAic3RyZWFtX2luZGV4IiBmaWVsZCBtdXN0IGJlCisgKiAgICAgICAgICAgIHNldCB0byB0aGUgaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmcgc3RyZWFtIGluIEByZWYKKyAqICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0LnN0cmVhbXMgInMtPnN0cmVhbXMiLiBJdCBpcyB2ZXJ5IHN0cm9uZ2x5CisgKiAgICAgICAgICAgIHJlY29tbWVuZGVkIHRoYXQgdGltaW5nIGluZm9ybWF0aW9uIChAcmVmIEFWUGFja2V0LnB0cyAicHRzIiwgQHJlZgorICogICAgICAgICAgICBBVlBhY2tldC5kdHMgImR0cyIsIEByZWYgQVZQYWNrZXQuZHVyYXRpb24gImR1cmF0aW9uIikgaXMgc2V0IHRvCisgKiAgICAgICAgICAgIGNvcnJlY3QgdmFsdWVzLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1Igb24gZXJyb3IuIExpYmF2Zm9ybWF0IHdpbGwgYWx3YXlzCisgKiAgICAgICAgIHRha2UgY2FyZSBvZiBmcmVlaW5nIHRoZSBwYWNrZXQsIGV2ZW4gaWYgdGhpcyBmdW5jdGlvbiBmYWlscy4KKyAqCisgKiBAc2VlIGF2X3dyaXRlX2ZyYW1lKCksIEFWRm9ybWF0Q29udGV4dC5tYXhfaW50ZXJsZWF2ZV9kZWx0YQorICovCitpbnQgYXZfaW50ZXJsZWF2ZWRfd3JpdGVfZnJhbWUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KTsKKworLyoqCisgKiBXcml0ZSBhIHVuY29kZWQgZnJhbWUgdG8gYW4gb3V0cHV0IG1lZGlhIGZpbGUuCisgKgorICogVGhlIGZyYW1lIG11c3QgYmUgY29ycmVjdGx5IGludGVybGVhdmVkIGFjY29yZGluZyB0byB0aGUgY29udGFpbmVyCisgKiBzcGVjaWZpY2F0aW9uOyBpZiBub3QsIHRoZW4gYXZfaW50ZXJsZWF2ZWRfd3JpdGVfZnJhbWUoKSBtdXN0IGJlIHVzZWQuCisgKgorICogU2VlIGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKCkgZm9yIGRldGFpbHMuCisgKi8KK2ludCBhdl93cml0ZV91bmNvZGVkX2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBXcml0ZSBhIHVuY29kZWQgZnJhbWUgdG8gYW4gb3V0cHV0IG1lZGlhIGZpbGUuCisgKgorICogSWYgdGhlIG11eGVyIHN1cHBvcnRzIGl0LCB0aGlzIGZ1bmN0aW9uIGFsbG93cyB0byB3cml0ZSBhbiBBVkZyYW1lCisgKiBzdHJ1Y3R1cmUgZGlyZWN0bHksIHdpdGhvdXQgZW5jb2RpbmcgaXQgaW50byBhIHBhY2tldC4KKyAqIEl0IGlzIG1vc3RseSB1c2VmdWwgZm9yIGRldmljZXMgYW5kIHNpbWlsYXIgc3BlY2lhbCBtdXhlcnMgdGhhdCB1c2UgcmF3CisgKiB2aWRlbyBvciBQQ00gZGF0YSBhbmQgd2lsbCBub3Qgc2VyaWFsaXplIGl0IGludG8gYSBieXRlIHN0cmVhbS4KKyAqCisgKiBUbyB0ZXN0IHdoZXRoZXIgaXQgaXMgcG9zc2libGUgdG8gdXNlIGl0IHdpdGggYSBnaXZlbiBtdXhlciBhbmQgc3RyZWFtLAorICogdXNlIGF2X3dyaXRlX3VuY29kZWRfZnJhbWVfcXVlcnkoKS4KKyAqCisgKiBUaGUgY2FsbGVyIGdpdmVzIHVwIG93bmVyc2hpcCBvZiB0aGUgZnJhbWUgYW5kIG11c3Qgbm90IGFjY2VzcyBpdAorICogYWZ0ZXJ3YXJkcy4KKyAqCisgKiBAcmV0dXJuICA+PTAgZm9yIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgY29kZSBvbiBlcnJvcgorICovCitpbnQgYXZfaW50ZXJsZWF2ZWRfd3JpdGVfdW5jb2RlZF9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSk7CisKKy8qKgorICogVGVzdCB3aGV0aGVyIGEgbXV4ZXIgc3VwcG9ydHMgdW5jb2RlZCBmcmFtZS4KKyAqCisgKiBAcmV0dXJuICA+PTAgaWYgYW4gdW5jb2RlZCBmcmFtZSBjYW4gYmUgd3JpdHRlbiB0byB0aGF0IG11eGVyIGFuZCBzdHJlYW0sCisgKiAgICAgICAgICA8MCBpZiBub3QKKyAqLworaW50IGF2X3dyaXRlX3VuY29kZWRfZnJhbWVfcXVlcnkoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4KTsKKworLyoqCisgKiBXcml0ZSB0aGUgc3RyZWFtIHRyYWlsZXIgdG8gYW4gb3V0cHV0IG1lZGlhIGZpbGUgYW5kIGZyZWUgdGhlCisgKiBmaWxlIHByaXZhdGUgZGF0YS4KKyAqCisgKiBNYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYXZmb3JtYXRfd3JpdGVfaGVhZGVyLgorICoKKyAqIEBwYXJhbSBzIG1lZGlhIGZpbGUgaGFuZGxlCisgKiBAcmV0dXJuIDAgaWYgT0ssIEFWRVJST1JfeHh4IG9uIGVycm9yCisgKi8KK2ludCBhdl93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBvdXRwdXQgZm9ybWF0IGluIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgb3V0cHV0IGZvcm1hdHMKKyAqIHdoaWNoIGJlc3QgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycywgb3IgcmV0dXJuIE5VTEwgaWYKKyAqIHRoZXJlIGlzIG5vIG1hdGNoLgorICoKKyAqIEBwYXJhbSBzaG9ydF9uYW1lIGlmIG5vbi1OVUxMIGNoZWNrcyBpZiBzaG9ydF9uYW1lIG1hdGNoZXMgd2l0aCB0aGUKKyAqIG5hbWVzIG9mIHRoZSByZWdpc3RlcmVkIGZvcm1hdHMKKyAqIEBwYXJhbSBmaWxlbmFtZSBpZiBub24tTlVMTCBjaGVja3MgaWYgZmlsZW5hbWUgdGVybWluYXRlcyB3aXRoIHRoZQorICogZXh0ZW5zaW9ucyBvZiB0aGUgcmVnaXN0ZXJlZCBmb3JtYXRzCisgKiBAcGFyYW0gbWltZV90eXBlIGlmIG5vbi1OVUxMIGNoZWNrcyBpZiBtaW1lX3R5cGUgbWF0Y2hlcyB3aXRoIHRoZQorICogTUlNRSB0eXBlIG9mIHRoZSByZWdpc3RlcmVkIGZvcm1hdHMKKyAqLworQVZPdXRwdXRGb3JtYXQgKmF2X2d1ZXNzX2Zvcm1hdChjb25zdCBjaGFyICpzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZV90eXBlKTsKKworLyoqCisgKiBHdWVzcyB0aGUgY29kZWMgSUQgYmFzZWQgdXBvbiBtdXhlciBhbmQgZmlsZW5hbWUuCisgKi8KK2VudW0gQVZDb2RlY0lEIGF2X2d1ZXNzX2NvZGVjKEFWT3V0cHV0Rm9ybWF0ICpmbXQsIGNvbnN0IGNoYXIgKnNob3J0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1pbWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUpOworCisvKioKKyAqIEdldCB0aW1pbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBkYXRhIGN1cnJlbnRseSBvdXRwdXQuCisgKiBUaGUgZXhhY3QgbWVhbmluZyBvZiAiY3VycmVudGx5IG91dHB1dCIgZGVwZW5kcyBvbiB0aGUgZm9ybWF0LgorICogSXQgaXMgbW9zdGx5IHJlbGV2YW50IGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBhbiBpbnRlcm5hbCBidWZmZXIgYW5kL29yCisgKiB3b3JrIGluIHJlYWwgdGltZS4KKyAqIEBwYXJhbSBzICAgICAgICAgIG1lZGlhIGZpbGUgaGFuZGxlCisgKiBAcGFyYW0gc3RyZWFtICAgICBzdHJlYW0gaW4gdGhlIG1lZGlhIGZpbGUKKyAqIEBwYXJhbVtvdXRdIGR0cyAgIERUUyBvZiB0aGUgbGFzdCBwYWNrZXQgb3V0cHV0IGZvciB0aGUgc3RyZWFtLCBpbiBzdHJlYW0KKyAqICAgICAgICAgICAgICAgICAgIHRpbWVfYmFzZSB1bml0cworICogQHBhcmFtW291dF0gd2FsbCAgYWJzb2x1dGUgdGltZSB3aGVuIHRoYXQgcGFja2V0IHdoYXMgb3V0cHV0LAorICogICAgICAgICAgICAgICAgICAgaW4gbWljcm9zZWNvbmQKKyAqIEByZXR1cm4gIDAgaWYgT0ssIEFWRVJST1IoRU5PU1lTKSBpZiB0aGUgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgaXQKKyAqIE5vdGU6IHNvbWUgZm9ybWF0cyBvciBkZXZpY2VzIG1heSBub3QgYWxsb3cgdG8gbWVhc3VyZSBkdHMgYW5kIHdhbGwKKyAqIGF0b21pY2FsbHkuCisgKi8KK2ludCBhdl9nZXRfb3V0cHV0X3RpbWVzdGFtcChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmR0cywgaW50NjRfdCAqd2FsbCk7CisKKworLyoqCisgKiBAfQorICovCisKKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2Zl9taXNjIFV0aWxpdHkgZnVuY3Rpb25zCisgKiBAaW5ncm91cCBsaWJhdmYKKyAqIEB7CisgKgorICogTWlzY2VsbGFuZW91cyB1dGlsaXR5IGZ1bmN0aW9ucyByZWxhdGVkIHRvIGJvdGggbXV4aW5nIGFuZCBkZW11eGluZworICogKG9yIG5laXRoZXIpLgorICovCisKKy8qKgorICogU2VuZCBhIG5pY2UgaGV4YWRlY2ltYWwgZHVtcCBvZiBhIGJ1ZmZlciB0byB0aGUgc3BlY2lmaWVkIGZpbGUgc3RyZWFtLgorICoKKyAqIEBwYXJhbSBmIFRoZSBmaWxlIHN0cmVhbSBwb2ludGVyIHdoZXJlIHRoZSBkdW1wIHNob3VsZCBiZSBzZW50IHRvLgorICogQHBhcmFtIGJ1ZiBidWZmZXIKKyAqIEBwYXJhbSBzaXplIGJ1ZmZlciBzaXplCisgKgorICogQHNlZSBhdl9oZXhfZHVtcF9sb2csIGF2X3BrdF9kdW1wMiwgYXZfcGt0X2R1bXBfbG9nMgorICovCit2b2lkIGF2X2hleF9kdW1wKEZJTEUgKmYsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpOworCisvKioKKyAqIFNlbmQgYSBuaWNlIGhleGFkZWNpbWFsIGR1bXAgb2YgYSBidWZmZXIgdG8gdGhlIGxvZy4KKyAqCisgKiBAcGFyYW0gYXZjbCBBIHBvaW50ZXIgdG8gYW4gYXJiaXRyYXJ5IHN0cnVjdCBvZiB3aGljaCB0aGUgZmlyc3QgZmllbGQgaXMgYQorICogcG9pbnRlciB0byBhbiBBVkNsYXNzIHN0cnVjdC4KKyAqIEBwYXJhbSBsZXZlbCBUaGUgaW1wb3J0YW5jZSBsZXZlbCBvZiB0aGUgbWVzc2FnZSwgbG93ZXIgdmFsdWVzIHNpZ25pZnlpbmcKKyAqIGhpZ2hlciBpbXBvcnRhbmNlLgorICogQHBhcmFtIGJ1ZiBidWZmZXIKKyAqIEBwYXJhbSBzaXplIGJ1ZmZlciBzaXplCisgKgorICogQHNlZSBhdl9oZXhfZHVtcCwgYXZfcGt0X2R1bXAyLCBhdl9wa3RfZHVtcF9sb2cyCisgKi8KK3ZvaWQgYXZfaGV4X2R1bXBfbG9nKHZvaWQgKmF2Y2wsIGludCBsZXZlbCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSk7CisKKy8qKgorICogU2VuZCBhIG5pY2UgZHVtcCBvZiBhIHBhY2tldCB0byB0aGUgc3BlY2lmaWVkIGZpbGUgc3RyZWFtLgorICoKKyAqIEBwYXJhbSBmIFRoZSBmaWxlIHN0cmVhbSBwb2ludGVyIHdoZXJlIHRoZSBkdW1wIHNob3VsZCBiZSBzZW50IHRvLgorICogQHBhcmFtIHBrdCBwYWNrZXQgdG8gZHVtcAorICogQHBhcmFtIGR1bXBfcGF5bG9hZCBUcnVlIGlmIHRoZSBwYXlsb2FkIG11c3QgYmUgZGlzcGxheWVkLCB0b28uCisgKiBAcGFyYW0gc3QgQVZTdHJlYW0gdGhhdCB0aGUgcGFja2V0IGJlbG9uZ3MgdG8KKyAqLwordm9pZCBhdl9wa3RfZHVtcDIoRklMRSAqZiwgY29uc3QgQVZQYWNrZXQgKnBrdCwgaW50IGR1bXBfcGF5bG9hZCwgY29uc3QgQVZTdHJlYW0gKnN0KTsKKworCisvKioKKyAqIFNlbmQgYSBuaWNlIGR1bXAgb2YgYSBwYWNrZXQgdG8gdGhlIGxvZy4KKyAqCisgKiBAcGFyYW0gYXZjbCBBIHBvaW50ZXIgdG8gYW4gYXJiaXRyYXJ5IHN0cnVjdCBvZiB3aGljaCB0aGUgZmlyc3QgZmllbGQgaXMgYQorICogcG9pbnRlciB0byBhbiBBVkNsYXNzIHN0cnVjdC4KKyAqIEBwYXJhbSBsZXZlbCBUaGUgaW1wb3J0YW5jZSBsZXZlbCBvZiB0aGUgbWVzc2FnZSwgbG93ZXIgdmFsdWVzIHNpZ25pZnlpbmcKKyAqIGhpZ2hlciBpbXBvcnRhbmNlLgorICogQHBhcmFtIHBrdCBwYWNrZXQgdG8gZHVtcAorICogQHBhcmFtIGR1bXBfcGF5bG9hZCBUcnVlIGlmIHRoZSBwYXlsb2FkIG11c3QgYmUgZGlzcGxheWVkLCB0b28uCisgKiBAcGFyYW0gc3QgQVZTdHJlYW0gdGhhdCB0aGUgcGFja2V0IGJlbG9uZ3MgdG8KKyAqLwordm9pZCBhdl9wa3RfZHVtcF9sb2cyKHZvaWQgKmF2Y2wsIGludCBsZXZlbCwgY29uc3QgQVZQYWNrZXQgKnBrdCwgaW50IGR1bXBfcGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlN0cmVhbSAqc3QpOworCisvKioKKyAqIEdldCB0aGUgQVZDb2RlY0lEIGZvciB0aGUgZ2l2ZW4gY29kZWMgdGFnIHRhZy4KKyAqIElmIG5vIGNvZGVjIGlkIGlzIGZvdW5kIHJldHVybnMgQVZfQ09ERUNfSURfTk9ORS4KKyAqCisgKiBAcGFyYW0gdGFncyBsaXN0IG9mIHN1cHBvcnRlZCBjb2RlY19pZC1jb2RlY190YWcgcGFpcnMsIGFzIHN0b3JlZAorICogaW4gQVZJbnB1dEZvcm1hdC5jb2RlY190YWcgYW5kIEFWT3V0cHV0Rm9ybWF0LmNvZGVjX3RhZworICogQHBhcmFtIHRhZyAgY29kZWMgdGFnIHRvIG1hdGNoIHRvIGEgY29kZWMgSUQKKyAqLworZW51bSBBVkNvZGVjSUQgYXZfY29kZWNfZ2V0X2lkKGNvbnN0IHN0cnVjdCBBVkNvZGVjVGFnICogY29uc3QgKnRhZ3MsIHVuc2lnbmVkIGludCB0YWcpOworCisvKioKKyAqIEdldCB0aGUgY29kZWMgdGFnIGZvciB0aGUgZ2l2ZW4gY29kZWMgaWQgaWQuCisgKiBJZiBubyBjb2RlYyB0YWcgaXMgZm91bmQgcmV0dXJucyAwLgorICoKKyAqIEBwYXJhbSB0YWdzIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvZGVjX2lkLWNvZGVjX3RhZyBwYWlycywgYXMgc3RvcmVkCisgKiBpbiBBVklucHV0Rm9ybWF0LmNvZGVjX3RhZyBhbmQgQVZPdXRwdXRGb3JtYXQuY29kZWNfdGFnCisgKiBAcGFyYW0gaWQgICBjb2RlYyBJRCB0byBtYXRjaCB0byBhIGNvZGVjIHRhZworICovCit1bnNpZ25lZCBpbnQgYXZfY29kZWNfZ2V0X3RhZyhjb25zdCBzdHJ1Y3QgQVZDb2RlY1RhZyAqIGNvbnN0ICp0YWdzLCBlbnVtIEFWQ29kZWNJRCBpZCk7CisKKy8qKgorICogR2V0IHRoZSBjb2RlYyB0YWcgZm9yIHRoZSBnaXZlbiBjb2RlYyBpZC4KKyAqCisgKiBAcGFyYW0gdGFncyBsaXN0IG9mIHN1cHBvcnRlZCBjb2RlY19pZCAtIGNvZGVjX3RhZyBwYWlycywgYXMgc3RvcmVkCisgKiBpbiBBVklucHV0Rm9ybWF0LmNvZGVjX3RhZyBhbmQgQVZPdXRwdXRGb3JtYXQuY29kZWNfdGFnCisgKiBAcGFyYW0gaWQgY29kZWMgaWQgdGhhdCBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGluIHRoZSBsaXN0CisgKiBAcGFyYW0gdGFnIEEgcG9pbnRlciB0byB0aGUgZm91bmQgdGFnCisgKiBAcmV0dXJuIDAgaWYgaWQgd2FzIG5vdCBmb3VuZCBpbiB0YWdzLCA+IDAgaWYgaXQgd2FzIGZvdW5kCisgKi8KK2ludCBhdl9jb2RlY19nZXRfdGFnMihjb25zdCBzdHJ1Y3QgQVZDb2RlY1RhZyAqIGNvbnN0ICp0YWdzLCBlbnVtIEFWQ29kZWNJRCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnRhZyk7CisKK2ludCBhdl9maW5kX2RlZmF1bHRfc3RyZWFtX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcyk7CisKKy8qKgorICogR2V0IHRoZSBpbmRleCBmb3IgYSBzcGVjaWZpYyB0aW1lc3RhbXAuCisgKgorICogQHBhcmFtIHN0ICAgICAgICBzdHJlYW0gdGhhdCB0aGUgdGltZXN0YW1wIGJlbG9uZ3MgdG8KKyAqIEBwYXJhbSB0aW1lc3RhbXAgdGltZXN0YW1wIHRvIHJldHJpZXZlIHRoZSBpbmRleCBmb3IKKyAqIEBwYXJhbSBmbGFncyBpZiBBVlNFRUtfRkxBR19CQUNLV0FSRCB0aGVuIHRoZSByZXR1cm5lZCBpbmRleCB3aWxsIGNvcnJlc3BvbmQKKyAqICAgICAgICAgICAgICAgICB0byB0aGUgdGltZXN0YW1wIHdoaWNoIGlzIDw9IHRoZSByZXF1ZXN0ZWQgb25lLCBpZiBiYWNrd2FyZAorICogICAgICAgICAgICAgICAgIGlzIDAsIHRoZW4gaXQgd2lsbCBiZSA+PQorICogICAgICAgICAgICAgIGlmIEFWU0VFS19GTEFHX0FOWSBzZWVrIHRvIGFueSBmcmFtZSwgb25seSBrZXlmcmFtZXMgb3RoZXJ3aXNlCisgKiBAcmV0dXJuIDwgMCBpZiBubyBzdWNoIHRpbWVzdGFtcCBjb3VsZCBiZSBmb3VuZAorICovCitpbnQgYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChBVlN0cmVhbSAqc3QsIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpOworCisvKioKKyAqIEFkZCBhbiBpbmRleCBlbnRyeSBpbnRvIGEgc29ydGVkIGxpc3QuIFVwZGF0ZSB0aGUgZW50cnkgaWYgdGhlIGxpc3QKKyAqIGFscmVhZHkgY29udGFpbnMgaXQuCisgKgorICogQHBhcmFtIHRpbWVzdGFtcCB0aW1lc3RhbXAgaW4gdGhlIHRpbWUgYmFzZSBvZiB0aGUgZ2l2ZW4gc3RyZWFtCisgKi8KK2ludCBhdl9hZGRfaW5kZXhfZW50cnkoQVZTdHJlYW0gKnN0LCBpbnQ2NF90IHBvcywgaW50NjRfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgZGlzdGFuY2UsIGludCBmbGFncyk7CisKKworLyoqCisgKiBTcGxpdCBhIFVSTCBzdHJpbmcgaW50byBjb21wb25lbnRzLgorICoKKyAqIFRoZSBwb2ludGVycyB0byBidWZmZXJzIGZvciBzdG9yaW5nIGluZGl2aWR1YWwgY29tcG9uZW50cyBtYXkgYmUgbnVsbCwKKyAqIGluIG9yZGVyIHRvIGlnbm9yZSB0aGF0IGNvbXBvbmVudC4gQnVmZmVycyBmb3IgY29tcG9uZW50cyBub3QgZm91bmQgYXJlCisgKiBzZXQgdG8gZW1wdHkgc3RyaW5ncy4gSWYgdGhlIHBvcnQgaXMgbm90IGZvdW5kLCBpdCBpcyBzZXQgdG8gYSBuZWdhdGl2ZQorICogdmFsdWUuCisgKgorICogQHBhcmFtIHByb3RvIHRoZSBidWZmZXIgZm9yIHRoZSBwcm90b2NvbAorICogQHBhcmFtIHByb3RvX3NpemUgdGhlIHNpemUgb2YgdGhlIHByb3RvIGJ1ZmZlcgorICogQHBhcmFtIGF1dGhvcml6YXRpb24gdGhlIGJ1ZmZlciBmb3IgdGhlIGF1dGhvcml6YXRpb24KKyAqIEBwYXJhbSBhdXRob3JpemF0aW9uX3NpemUgdGhlIHNpemUgb2YgdGhlIGF1dGhvcml6YXRpb24gYnVmZmVyCisgKiBAcGFyYW0gaG9zdG5hbWUgdGhlIGJ1ZmZlciBmb3IgdGhlIGhvc3QgbmFtZQorICogQHBhcmFtIGhvc3RuYW1lX3NpemUgdGhlIHNpemUgb2YgdGhlIGhvc3RuYW1lIGJ1ZmZlcgorICogQHBhcmFtIHBvcnRfcHRyIGEgcG9pbnRlciB0byBzdG9yZSB0aGUgcG9ydCBudW1iZXIgaW4KKyAqIEBwYXJhbSBwYXRoIHRoZSBidWZmZXIgZm9yIHRoZSBwYXRoCisgKiBAcGFyYW0gcGF0aF9zaXplIHRoZSBzaXplIG9mIHRoZSBwYXRoIGJ1ZmZlcgorICogQHBhcmFtIHVybCB0aGUgVVJMIHRvIHNwbGl0CisgKi8KK3ZvaWQgYXZfdXJsX3NwbGl0KGNoYXIgKnByb3RvLCAgICAgICAgIGludCBwcm90b19zaXplLAorICAgICAgICAgICAgICAgICAgY2hhciAqYXV0aG9yaXphdGlvbiwgaW50IGF1dGhvcml6YXRpb25fc2l6ZSwKKyAgICAgICAgICAgICAgICAgIGNoYXIgKmhvc3RuYW1lLCAgICAgIGludCBob3N0bmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgaW50ICpwb3J0X3B0ciwKKyAgICAgICAgICAgICAgICAgIGNoYXIgKnBhdGgsICAgICAgICAgIGludCBwYXRoX3NpemUsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwpOworCisKKy8qKgorICogUHJpbnQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGlucHV0IG9yIG91dHB1dCBmb3JtYXQsIHN1Y2ggYXMKKyAqIGR1cmF0aW9uLCBiaXRyYXRlLCBzdHJlYW1zLCBjb250YWluZXIsIHByb2dyYW1zLCBtZXRhZGF0YSwgc2lkZSBkYXRhLAorICogY29kZWMgYW5kIHRpbWUgYmFzZS4KKyAqCisgKiBAcGFyYW0gaWMgICAgICAgIHRoZSBjb250ZXh0IHRvIGFuYWx5emUKKyAqIEBwYXJhbSBpbmRleCAgICAgaW5kZXggb2YgdGhlIHN0cmVhbSB0byBkdW1wIGluZm9ybWF0aW9uIGFib3V0CisgKiBAcGFyYW0gdXJsICAgICAgIHRoZSBVUkwgdG8gcHJpbnQsIHN1Y2ggYXMgc291cmNlIG9yIGRlc3RpbmF0aW9uIGZpbGUKKyAqIEBwYXJhbSBpc19vdXRwdXQgU2VsZWN0IHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb250ZXh0IGlzIGFuIGlucHV0KDApIG9yIG91dHB1dCgxKQorICovCit2b2lkIGF2X2R1bXBfZm9ybWF0KEFWRm9ybWF0Q29udGV4dCAqaWMsCisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgICAgICAgICBpbnQgaXNfb3V0cHV0KTsKKworLyoqCisgKiBSZXR1cm4gaW4gJ2J1ZicgdGhlIHBhdGggd2l0aCAnJWQnIHJlcGxhY2VkIGJ5IGEgbnVtYmVyLgorICoKKyAqIEFsc28gaGFuZGxlcyB0aGUgJyUwbmQnIGZvcm1hdCB3aGVyZSAnbicgaXMgdGhlIHRvdGFsIG51bWJlcgorICogb2YgZGlnaXRzIGFuZCAnJSUnLgorICoKKyAqIEBwYXJhbSBidWYgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW0gYnVmX3NpemUgZGVzdGluYXRpb24gYnVmZmVyIHNpemUKKyAqIEBwYXJhbSBwYXRoIG51bWJlcmVkIHNlcXVlbmNlIHN0cmluZworICogQHBhcmFtIG51bWJlciBmcmFtZSBudW1iZXIKKyAqIEByZXR1cm4gMCBpZiBPSywgLTEgb24gZm9ybWF0IGVycm9yCisgKi8KK2ludCBhdl9nZXRfZnJhbWVfZmlsZW5hbWUoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGludCBudW1iZXIpOworCisvKioKKyAqIENoZWNrIHdoZXRoZXIgZmlsZW5hbWUgYWN0dWFsbHkgaXMgYSBudW1iZXJlZCBzZXF1ZW5jZSBnZW5lcmF0b3IuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHBvc3NpYmxlIG51bWJlcmVkIHNlcXVlbmNlIHN0cmluZworICogQHJldHVybiAxIGlmIGEgdmFsaWQgbnVtYmVyZWQgc2VxdWVuY2Ugc3RyaW5nLCAwIG90aGVyd2lzZQorICovCitpbnQgYXZfZmlsZW5hbWVfbnVtYmVyX3Rlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisvKioKKyAqIEdlbmVyYXRlIGFuIFNEUCBmb3IgYW4gUlRQIHNlc3Npb24uCisgKgorICogTm90ZSwgdGhpcyBvdmVyd3JpdGVzIHRoZSBpZCB2YWx1ZXMgb2YgQVZTdHJlYW1zIGluIHRoZSBtdXhlciBjb250ZXh0cworICogZm9yIGdldHRpbmcgdW5pcXVlIGR5bmFtaWMgcGF5bG9hZCB0eXBlcy4KKyAqCisgKiBAcGFyYW0gYWMgYXJyYXkgb2YgQVZGb3JtYXRDb250ZXh0cyBkZXNjcmliaW5nIHRoZSBSVFAgc3RyZWFtcy4gSWYgdGhlCisgKiAgICAgICAgICAgYXJyYXkgaXMgY29tcG9zZWQgYnkgb25seSBvbmUgY29udGV4dCwgc3VjaCBjb250ZXh0IGNhbiBjb250YWluCisgKiAgICAgICAgICAgbXVsdGlwbGUgQVZTdHJlYW1zIChvbmUgQVZTdHJlYW0gcGVyIFJUUCBzdHJlYW0pLiBPdGhlcndpc2UsCisgKiAgICAgICAgICAgYWxsIHRoZSBjb250ZXh0cyBpbiB0aGUgYXJyYXkgKGFuIEFWQ29kZWNDb250ZXh0IHBlciBSVFAgc3RyZWFtKQorICogICAgICAgICAgIG11c3QgY29udGFpbiBvbmx5IG9uZSBBVlN0cmVhbS4KKyAqIEBwYXJhbSBuX2ZpbGVzIG51bWJlciBvZiBBVkNvZGVjQ29udGV4dHMgY29udGFpbmVkIGluIGFjCisgKiBAcGFyYW0gYnVmIGJ1ZmZlciB3aGVyZSB0aGUgU0RQIHdpbGwgYmUgc3RvcmVkIChtdXN0IGJlIGFsbG9jYXRlZCBieQorICogICAgICAgICAgICB0aGUgY2FsbGVyKQorICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogQHJldHVybiAwIGlmIE9LLCBBVkVSUk9SX3h4eCBvbiBlcnJvcgorICovCitpbnQgYXZfc2RwX2NyZWF0ZShBVkZvcm1hdENvbnRleHQgKmFjW10sIGludCBuX2ZpbGVzLCBjaGFyICpidWYsIGludCBzaXplKTsKKworLyoqCisgKiBSZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZSBpZiB0aGUgZ2l2ZW4gZmlsZW5hbWUgaGFzIG9uZSBvZiB0aGUgZ2l2ZW4KKyAqIGV4dGVuc2lvbnMsIDAgb3RoZXJ3aXNlLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSAgIGZpbGUgbmFtZSB0byBjaGVjayBhZ2FpbnN0IHRoZSBnaXZlbiBleHRlbnNpb25zCisgKiBAcGFyYW0gZXh0ZW5zaW9ucyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZpbGVuYW1lIGV4dGVuc2lvbnMKKyAqLworaW50IGF2X21hdGNoX2V4dChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZXh0ZW5zaW9ucyk7CisKKy8qKgorICogVGVzdCBpZiB0aGUgZ2l2ZW4gY29udGFpbmVyIGNhbiBzdG9yZSBhIGNvZGVjLgorICoKKyAqIEBwYXJhbSBvZm10ICAgICAgICAgICBjb250YWluZXIgdG8gY2hlY2sgZm9yIGNvbXBhdGliaWxpdHkKKyAqIEBwYXJhbSBjb2RlY19pZCAgICAgICBjb2RlYyB0byBwb3RlbnRpYWxseSBzdG9yZSBpbiBjb250YWluZXIKKyAqIEBwYXJhbSBzdGRfY29tcGxpYW5jZSBzdGFuZGFyZHMgY29tcGxpYW5jZSBsZXZlbCwgb25lIG9mIEZGX0NPTVBMSUFOQ0VfKgorICoKKyAqIEByZXR1cm4gMSBpZiBjb2RlYyB3aXRoIElEIGNvZGVjX2lkIGNhbiBiZSBzdG9yZWQgaW4gb2ZtdCwgMCBpZiBpdCBjYW5ub3QuCisgKiAgICAgICAgIEEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4KKyAqLworaW50IGF2Zm9ybWF0X3F1ZXJ5X2NvZGVjKGNvbnN0IEFWT3V0cHV0Rm9ybWF0ICpvZm10LCBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RkX2NvbXBsaWFuY2UpOworCisvKioKKyAqIEBkZWZncm91cCByaWZmX2ZvdXJjYyBSSUZGIEZvdXJDQ3MKKyAqIEB7CisgKiBHZXQgdGhlIHRhYmxlcyBtYXBwaW5nIFJJRkYgRm91ckNDcyB0byBsaWJhdmNvZGVjIEFWQ29kZWNJRHMuIFRoZSB0YWJsZXMgYXJlCisgKiBtZWFudCB0byBiZSBwYXNzZWQgdG8gYXZfY29kZWNfZ2V0X2lkKCkvYXZfY29kZWNfZ2V0X3RhZygpIGFzIGluIHRoZQorICogZm9sbG93aW5nIGNvZGU6CisgKiBAY29kZQorICogdWludDMyX3QgdGFnID0gTUtUQUcoJ0gnLCAnMicsICc2JywgJzQnKTsKKyAqIGNvbnN0IHN0cnVjdCBBVkNvZGVjVGFnICp0YWJsZVtdID0geyBhdmZvcm1hdF9nZXRfcmlmZl92aWRlb190YWdzKCksIDAgfTsKKyAqIGVudW0gQVZDb2RlY0lEIGlkID0gYXZfY29kZWNfZ2V0X2lkKHRhYmxlLCB0YWcpOworICogQGVuZGNvZGUKKyAqLworLyoqCisgKiBAcmV0dXJuIHRoZSB0YWJsZSBtYXBwaW5nIFJJRkYgRm91ckNDcyBmb3IgdmlkZW8gdG8gbGliYXZjb2RlYyBBVkNvZGVjSUQuCisgKi8KK2NvbnN0IHN0cnVjdCBBVkNvZGVjVGFnICphdmZvcm1hdF9nZXRfcmlmZl92aWRlb190YWdzKHZvaWQpOworLyoqCisgKiBAcmV0dXJuIHRoZSB0YWJsZSBtYXBwaW5nIFJJRkYgRm91ckNDcyBmb3IgYXVkaW8gdG8gQVZDb2RlY0lELgorICovCitjb25zdCBzdHJ1Y3QgQVZDb2RlY1RhZyAqYXZmb3JtYXRfZ2V0X3JpZmZfYXVkaW9fdGFncyh2b2lkKTsKKy8qKgorICogQHJldHVybiB0aGUgdGFibGUgbWFwcGluZyBNT1YgRm91ckNDcyBmb3IgdmlkZW8gdG8gbGliYXZjb2RlYyBBVkNvZGVjSUQuCisgKi8KK2NvbnN0IHN0cnVjdCBBVkNvZGVjVGFnICphdmZvcm1hdF9nZXRfbW92X3ZpZGVvX3RhZ3Modm9pZCk7CisvKioKKyAqIEByZXR1cm4gdGhlIHRhYmxlIG1hcHBpbmcgTU9WIEZvdXJDQ3MgZm9yIGF1ZGlvIHRvIEFWQ29kZWNJRC4KKyAqLworY29uc3Qgc3RydWN0IEFWQ29kZWNUYWcgKmF2Zm9ybWF0X2dldF9tb3ZfYXVkaW9fdGFncyh2b2lkKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogR3Vlc3MgdGhlIHNhbXBsZSBhc3BlY3QgcmF0aW8gb2YgYSBmcmFtZSwgYmFzZWQgb24gYm90aCB0aGUgc3RyZWFtIGFuZCB0aGUKKyAqIGZyYW1lIGFzcGVjdCByYXRpby4KKyAqCisgKiBTaW5jZSB0aGUgZnJhbWUgYXNwZWN0IHJhdGlvIGlzIHNldCBieSB0aGUgY29kZWMgYnV0IHRoZSBzdHJlYW0gYXNwZWN0IHJhdGlvCisgKiBpcyBzZXQgYnkgdGhlIGRlbXV4ZXIsIHRoZXNlIHR3byBtYXkgbm90IGJlIGVxdWFsLiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvCisgKiByZXR1cm4gdGhlIHZhbHVlIHRoYXQgeW91IHNob3VsZCB1c2UgaWYgeW91IHdvdWxkIGxpa2UgdG8gZGlzcGxheSB0aGUgZnJhbWUuCisgKgorICogQmFzaWMgbG9naWMgaXMgdG8gdXNlIHRoZSBzdHJlYW0gYXNwZWN0IHJhdGlvIGlmIGl0IGlzIHNldCB0byBzb21ldGhpbmcgc2FuZQorICogb3RoZXJ3aXNlIHVzZSB0aGUgZnJhbWUgYXNwZWN0IHJhdGlvLiBUaGlzIHdheSBhIGNvbnRhaW5lciBzZXR0aW5nLCB3aGljaCBpcworICogdXN1YWxseSBlYXN5IHRvIG1vZGlmeSBjYW4gb3ZlcnJpZGUgdGhlIGNvZGVkIHZhbHVlIGluIHRoZSBmcmFtZXMuCisgKgorICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IGNvbnRleHQgd2hpY2ggdGhlIHN0cmVhbSBpcyBwYXJ0IG9mCisgKiBAcGFyYW0gc3RyZWFtIHRoZSBzdHJlYW0gd2hpY2ggdGhlIGZyYW1lIGlzIHBhcnQgb2YKKyAqIEBwYXJhbSBmcmFtZSB0aGUgZnJhbWUgd2l0aCB0aGUgYXNwZWN0IHJhdGlvIHRvIGJlIGRldGVybWluZWQKKyAqIEByZXR1cm4gdGhlIGd1ZXNzZWQgKHZhbGlkKSBzYW1wbGVfYXNwZWN0X3JhdGlvLCAwLzEgaWYgbm8gaWRlYQorICovCitBVlJhdGlvbmFsIGF2X2d1ZXNzX3NhbXBsZV9hc3BlY3RfcmF0aW8oQVZGb3JtYXRDb250ZXh0ICpmb3JtYXQsIEFWU3RyZWFtICpzdHJlYW0sIEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBHdWVzcyB0aGUgZnJhbWUgcmF0ZSwgYmFzZWQgb24gYm90aCB0aGUgY29udGFpbmVyIGFuZCBjb2RlYyBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcGFyYW0gY3R4IHRoZSBmb3JtYXQgY29udGV4dCB3aGljaCB0aGUgc3RyZWFtIGlzIHBhcnQgb2YKKyAqIEBwYXJhbSBzdHJlYW0gdGhlIHN0cmVhbSB3aGljaCB0aGUgZnJhbWUgaXMgcGFydCBvZgorICogQHBhcmFtIGZyYW1lIHRoZSBmcmFtZSBmb3Igd2hpY2ggdGhlIGZyYW1lIHJhdGUgc2hvdWxkIGJlIGRldGVybWluZWQsIG1heSBiZSBOVUxMCisgKiBAcmV0dXJuIHRoZSBndWVzc2VkICh2YWxpZCkgZnJhbWUgcmF0ZSwgMC8xIGlmIG5vIGlkZWEKKyAqLworQVZSYXRpb25hbCBhdl9ndWVzc19mcmFtZV9yYXRlKEFWRm9ybWF0Q29udGV4dCAqY3R4LCBBVlN0cmVhbSAqc3RyZWFtLCBBVkZyYW1lICpmcmFtZSk7CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHN0cmVhbSBzdCBjb250YWluZWQgaW4gcyBpcyBtYXRjaGVkIGJ5IHRoZSBzdHJlYW0gc3BlY2lmaWVyCisgKiBzcGVjLgorICoKKyAqIFNlZSB0aGUgInN0cmVhbSBzcGVjaWZpZXJzIiBjaGFwdGVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgc3ludGF4CisgKiBvZiBzcGVjLgorICoKKyAqIEByZXR1cm4gID4wIGlmIHN0IGlzIG1hdGNoZWQgYnkgc3BlYzsKKyAqICAgICAgICAgIDAgIGlmIHN0IGlzIG5vdCBtYXRjaGVkIGJ5IHNwZWM7CisgKiAgICAgICAgICBBVkVSUk9SIGNvZGUgaWYgc3BlYyBpcyBpbnZhbGlkCisgKgorICogQG5vdGUgIEEgc3RyZWFtIHNwZWNpZmllciBjYW4gbWF0Y2ggc2V2ZXJhbCBzdHJlYW1zIGluIHRoZSBmb3JtYXQuCisgKi8KK2ludCBhdmZvcm1hdF9tYXRjaF9zdHJlYW1fc3BlY2lmaWVyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3BlYyk7CisKK2ludCBhdmZvcm1hdF9xdWV1ZV9hdHRhY2hlZF9waWN0dXJlcyhBVkZvcm1hdENvbnRleHQgKnMpOworCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZGT1JNQVRfQVZGT1JNQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2Zm9ybWF0cmVzLnJjIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2Zm9ybWF0cmVzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTYxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXZmb3JtYXRyZXMucmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIFdpbmRvd3MgcmVzb3VyY2UgZmlsZSBmb3IgbGliYXZmb3JtYXQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSmFtZXMgQWxtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaWFuY2hlbmcgIlRpbW90aHkiIEd1CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAibGliYXZmb3JtYXQvdmVyc2lvbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworMSBWRVJTSU9OSU5GTworRklMRVZFUlNJT04gICAgIExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IsIExJQkFWRk9STUFUX1ZFUlNJT05fTUlOT1IsIExJQkFWRk9STUFUX1ZFUlNJT05fTUlDUk8sIDAKK1BST0RVQ1RWRVJTSU9OICBMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SLCBMSUJBVkZPUk1BVF9WRVJTSU9OX01JTk9SLCBMSUJBVkZPUk1BVF9WRVJTSU9OX01JQ1JPLCAwCitGSUxFRkxBR1NNQVNLICAgVlNfRkZJX0ZJTEVGTEFHU01BU0sKK0ZJTEVPUyAgICAgICAgICBWT1NfTlRfV0lORE9XUzMyCitGSUxFVFlQRSAgICAgICAgVkZUX0RMTAoreworICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICB7CisgICAgICAgIEJMT0NLICIwNDA5MDRCMCIKKyAgICAgICAgeworICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgICAgICAiRkZtcGVnIFByb2plY3QiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgICJGRm1wZWcgY29udGFpbmVyIGZvcm1hdCBsaWJyYXJ5IgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgICAgICBBVl9TVFJJTkdJRlkoTElCQVZGT1JNQVRfVkVSU0lPTikKKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAgICAgImxpYmF2Zm9ybWF0IgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgICAiQ29weXJpZ2h0IChDKSAyMDAwLSIgQVZfU1RSSU5HSUZZKENPTkZJR19USElTX1lFQVIpICIgRkZtcGVnIFByb2plY3QiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJhdmZvcm1hdCIgQlVJTERTVUYgIi0iIEFWX1NUUklOR0lGWShMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SKSBTTElCU1VGCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAgICAgICJGRm1wZWciCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAgIEZGTVBFR19WRVJTSU9OCisgICAgICAgIH0KKyAgICB9CisKKyAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgeworICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDA0MDksIDB4MDRCMAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmkuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGRhNzZmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2aS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfQVZJX0gKKyNkZWZpbmUgQVZGT1JNQVRfQVZJX0gKKworI2RlZmluZSBBVklGX0hBU0lOREVYICAgICAgICAgICAweDAwMDAwMDEwICAgICAgICAvLyBJbmRleCBhdCBlbmQgb2YgZmlsZT8KKyNkZWZpbmUgQVZJRl9NVVNUVVNFSU5ERVggICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBVklGX0lTSU5URVJMRUFWRUQgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEFWSUZfVFJVU1RDS1RZUEUgICAgICAgIDB4MDAwMDA4MDAgICAgICAgIC8vIFVzZSBDS1R5cGUgdG8gZmluZCBrZXkgZnJhbWVzPworI2RlZmluZSBBVklGX1dBU0NBUFRVUkVGSUxFICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFWSUZfQ09QWVJJR0hURUQgICAgICAgIDB4MDAwMjAwMDAKKworI2RlZmluZSBBVklfTUFYX1JJRkZfU0laRSAgICAgICAweDQwMDAwMDAwTEwKKyNkZWZpbmUgQVZJX01BU1RFUl9JTkRFWF9TSVpFICAgMjU2CisjZGVmaW5lIEFWSV9NQVhfU1RSRUFNX0NPVU5UICAgIDEwMAorCisvKiBpbmRleCBmbGFncyAqLworI2RlZmluZSBBVklJRl9JTkRFWCAgICAgICAgICAgICAweDEwCisKKyNlbmRpZiAvKiBBVkZPUk1BVF9BVklfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2aWRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2aWRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YTZkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXZpZGVjLmMKQEAgLTAsMCArMSwxODg0IEBACisvKgorICogQVZJIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmkuaCIKKyNpbmNsdWRlICJkdi5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicmlmZi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZXhpZi5oIgorCit0eXBlZGVmIHN0cnVjdCBBVklTdHJlYW0geworICAgIGludDY0X3QgZnJhbWVfb2Zmc2V0OyAgIC8qIGN1cnJlbnQgZnJhbWUgKHZpZGVvKSBvciBieXRlIChhdWRpbykgY291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICh1c2VkIHRvIGNvbXB1dGUgdGhlIHB0cykgKi8KKyAgICBpbnQgcmVtYWluaW5nOworICAgIGludCBwYWNrZXRfc2l6ZTsKKworICAgIHVpbnQzMl90IHNjYWxlOworICAgIHVpbnQzMl90IHJhdGU7CisgICAgaW50IHNhbXBsZV9zaXplOyAgICAgICAgLyogc2l6ZSBvZiBvbmUgc2FtcGxlIChvciBwYWNrZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGluIHRoZSByYXRlL3NjYWxlIHNlbnNlKSBpbiBieXRlcyAqLworCisgICAgaW50NjRfdCBjdW1fbGVuOyAgICAgICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgKHVzZWQgZHVyaW5nIHNlZWspICovCisgICAgaW50IHByZWZpeDsgICAgICAgICAgICAgLyogbm9ybWFsbHkgJ2QnPDw4ICsgJ2MnIG9yICd3Jzw8OCArICdiJyAqLworICAgIGludCBwcmVmaXhfY291bnQ7CisgICAgdWludDMyX3QgcGFsWzI1Nl07CisgICAgaW50IGhhc19wYWw7CisgICAgaW50IGRzaG93X2Jsb2NrX2FsaWduOyAgLyogYmxvY2sgYWxpZ24gdmFyaWFibGUgdXNlZCB0byBlbXVsYXRlIGJ1Z3MgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgTVMgZHNob3cgZGVtdXhlciAqLworCisgICAgQVZGb3JtYXRDb250ZXh0ICpzdWJfY3R4OworICAgIEFWUGFja2V0IHN1Yl9wa3Q7CisgICAgdWludDhfdCAqc3ViX2J1ZmZlcjsKKworICAgIGludDY0X3Qgc2Vla19wb3M7Cit9IEFWSVN0cmVhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludDY0X3QgcmlmZl9lbmQ7CisgICAgaW50NjRfdCBtb3ZpX2VuZDsKKyAgICBpbnQ2NF90IGZzaXplOworICAgIGludDY0X3QgaW9fZnNpemU7CisgICAgaW50NjRfdCBtb3ZpX2xpc3Q7CisgICAgaW50NjRfdCBsYXN0X3BrdF9wb3M7CisgICAgaW50IGluZGV4X2xvYWRlZDsKKyAgICBpbnQgaXNfb2RtbDsKKyAgICBpbnQgbm9uX2ludGVybGVhdmVkOworICAgIGludCBzdHJlYW1faW5kZXg7CisgICAgRFZEZW11eENvbnRleHQgKmR2X2RlbXV4OworICAgIGludCBvZG1sX2RlcHRoOworICAgIGludCB1c2Vfb2RtbDsKKyNkZWZpbmUgTUFYX09ETUxfREVQVEggMTAwMAorICAgIGludDY0X3QgZHRzX21heDsKK30gQVZJQ29udGV4dDsKKworCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInVzZV9vZG1sIiwgInVzZSBvZG1sIGluZGV4Iiwgb2Zmc2V0b2YoQVZJQ29udGV4dCwgdXNlX29kbWwpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMX0sIC0xLCAxLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTX0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBkZW11eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImF2aSIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERU1VWEVSLAorfTsKKworCitzdGF0aWMgY29uc3QgY2hhciBhdmlfaGVhZGVyc1tdWzhdID0geworICAgIHsgJ1InLCAnSScsICdGJywgJ0YnLCAnQScsICdWJywgJ0knLCAnICcgIH0sCisgICAgeyAnUicsICdJJywgJ0YnLCAnRicsICdBJywgJ1YnLCAnSScsICdYJyAgfSwKKyAgICB7ICdSJywgJ0knLCAnRicsICdGJywgJ0EnLCAnVicsICdJJywgMHgxOSB9LAorICAgIHsgJ08nLCAnTicsICcyJywgJyAnLCAnTycsICdOJywgJzInLCAnZicgIH0sCisgICAgeyAnUicsICdJJywgJ0YnLCAnRicsICdBJywgJ00nLCAnVicsICcgJyAgfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFWTWV0YWRhdGFDb252IGF2aV9tZXRhZGF0YV9jb252W10gPSB7CisgICAgeyAic3RybiIsICJ0aXRsZSIgfSwKKyAgICB7IDAgfSwKK307CisKK3N0YXRpYyBpbnQgYXZpX2xvYWRfaW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzKTsKK3N0YXRpYyBpbnQgZ3Vlc3NfbmlfZmxhZyhBVkZvcm1hdENvbnRleHQgKnMpOworCisjZGVmaW5lIHByaW50X3RhZyhzdHIsIHRhZywgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZfZGxvZyhOVUxMLCAicG9zOiUiUFJJWDY0IiAlczogdGFnPSVjJWMlYyVjIHNpemU9MHgleFxuIiwgXAorICAgICAgICAgICAgYXZpb190ZWxsKHBiKSwgc3RyLCB0YWcgJiAweGZmLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKHRhZyA+PiA4KSAmIDB4ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKHRhZyA+PiAxNikgJiAweGZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKHRhZyA+PiAyNCkgJiAweGZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2l6ZSkKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2R1cmF0aW9uKEFWSVN0cmVhbSAqYXN0LCBpbnQgbGVuKQoreworICAgIGlmIChhc3QtPnNhbXBsZV9zaXplKQorICAgICAgICByZXR1cm4gbGVuOworICAgIGVsc2UgaWYgKGFzdC0+ZHNob3dfYmxvY2tfYWxpZ24pCisgICAgICAgIHJldHVybiAobGVuICsgYXN0LT5kc2hvd19ibG9ja19hbGlnbiAtIDEpIC8gYXN0LT5kc2hvd19ibG9ja19hbGlnbjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGdldF9yaWZmKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiKQoreworICAgIEFWSUNvbnRleHQgKmF2aSA9IHMtPnByaXZfZGF0YTsKKyAgICBjaGFyIGhlYWRlcls4XTsKKyAgICBpbnQgaTsKKworICAgIC8qIGNoZWNrIFJJRkYgaGVhZGVyICovCisgICAgYXZpb19yZWFkKHBiLCBoZWFkZXIsIDQpOworICAgIGF2aS0+cmlmZl9lbmQgID0gYXZpb19ybDMyKHBiKTsgLyogUklGRiBjaHVuayBzaXplICovCisgICAgYXZpLT5yaWZmX2VuZCArPSBhdmlvX3RlbGwocGIpOyAvKiBSSUZGIGNodW5rIGVuZCAqLworICAgIGF2aW9fcmVhZChwYiwgaGVhZGVyICsgNCwgNCk7CisKKyAgICBmb3IgKGkgPSAwOyBhdmlfaGVhZGVyc1tpXVswXTsgaSsrKQorICAgICAgICBpZiAoIW1lbWNtcChoZWFkZXIsIGF2aV9oZWFkZXJzW2ldLCA4KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmICghYXZpX2hlYWRlcnNbaV1bMF0pCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGhlYWRlcls3XSA9PSAweDE5KQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAiVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBieSBhIHRvdGFsbHkgYnJva2VuIG11eGVyLlxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2JyYWluZGVhZF9vZG1sX2luZHgoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgZnJhbWVfbnVtKQoreworICAgIEFWSUNvbnRleHQgKmF2aSAgICAgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiICAgICA9IHMtPnBiOworICAgIGludCBsb25nc19wcmVfZW50cnkgPSBhdmlvX3JsMTYocGIpOworICAgIGludCBpbmRleF9zdWJfdHlwZSAgPSBhdmlvX3I4KHBiKTsKKyAgICBpbnQgaW5kZXhfdHlwZSAgICAgID0gYXZpb19yOChwYik7CisgICAgaW50IGVudHJpZXNfaW5fdXNlICA9IGF2aW9fcmwzMihwYik7CisgICAgaW50IGNodW5rX2lkICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgaW50NjRfdCBiYXNlICAgICAgICA9IGF2aW9fcmw2NChwYik7CisgICAgaW50IHN0cmVhbV9pZCAgICAgICA9ICgoY2h1bmtfaWQgICAgICAmIDB4RkYpIC0gJzAnKSAqIDEwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaHVua19pZCA+PiA4ICYgMHhGRikgLSAnMCcpOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBBVklTdHJlYW0gKmFzdDsKKyAgICBpbnQgaTsKKyAgICBpbnQ2NF90IGxhc3RfcG9zID0gLTE7CisgICAgaW50NjRfdCBmaWxlc2l6ZSA9IGF2aS0+ZnNpemU7CisKKyAgICBhdl9kbG9nKHMsCisgICAgICAgICAgICAibG9uZ3NfcHJlX2VudHJ5OiVkIGluZGV4X3R5cGU6JWQgZW50cmllc19pbl91c2U6JWQgIgorICAgICAgICAgICAgImNodW5rX2lkOiVYIGJhc2U6JTE2IlBSSVg2NCJcbiIsCisgICAgICAgICAgICBsb25nc19wcmVfZW50cnksCisgICAgICAgICAgICBpbmRleF90eXBlLAorICAgICAgICAgICAgZW50cmllc19pbl91c2UsCisgICAgICAgICAgICBjaHVua19pZCwKKyAgICAgICAgICAgIGJhc2UpOworCisgICAgaWYgKHN0cmVhbV9pZCA+PSBzLT5uYl9zdHJlYW1zIHx8IHN0cmVhbV9pZCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHN0ICA9IHMtPnN0cmVhbXNbc3RyZWFtX2lkXTsKKyAgICBhc3QgPSBzdC0+cHJpdl9kYXRhOworCisgICAgaWYgKGluZGV4X3N1Yl90eXBlKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2aW9fcmwzMihwYik7CisKKyAgICBpZiAoaW5kZXhfdHlwZSAmJiBsb25nc19wcmVfZW50cnkgIT0gMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKGluZGV4X3R5cGUgPiAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChmaWxlc2l6ZSA+IDAgJiYgYmFzZSA+PSBmaWxlc2l6ZSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT0RNTCBpbmRleCBpbnZhbGlkXG4iKTsKKyAgICAgICAgaWYgKGJhc2UgPj4gMzIgPT0gKGJhc2UgJiAweEZGRkZGRkZGKSAmJgorICAgICAgICAgICAgKGJhc2UgJiAweEZGRkZGRkZGKSA8IGZpbGVzaXplICAgICYmCisgICAgICAgICAgICBmaWxlc2l6ZSA8PSAweEZGRkZGRkZGKQorICAgICAgICAgICAgYmFzZSAmPSAweEZGRkZGRkZGOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllc19pbl91c2U7IGkrKykgeworICAgICAgICBpZiAoaW5kZXhfdHlwZSkgeworICAgICAgICAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3JsMzIocGIpICsgYmFzZSAtIDg7CisgICAgICAgICAgICBpbnQgbGVuICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBpbnQga2V5ICAgICA9IGxlbiA+PSAwOworICAgICAgICAgICAgbGVuICY9IDB4N0ZGRkZGRkY7CisKKyNpZmRlZiBERUJVR19TRUVLCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicG9zOiUiUFJJZDY0IiwgbGVuOiVYXG4iLCBwb3MsIGxlbik7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBpZiAobGFzdF9wb3MgPT0gcG9zIHx8IHBvcyA9PSBiYXNlIC0gOCkKKyAgICAgICAgICAgICAgICBhdmktPm5vbl9pbnRlcmxlYXZlZCA9IDE7CisgICAgICAgICAgICBpZiAobGFzdF9wb3MgIT0gcG9zICYmIGxlbikKKyAgICAgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIHBvcywgYXN0LT5jdW1fbGVuLCBsZW4sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA/IEFWSU5ERVhfS0VZRlJBTUUgOiAwKTsKKworICAgICAgICAgICAgYXN0LT5jdW1fbGVuICs9IGdldF9kdXJhdGlvbihhc3QsIGxlbik7CisgICAgICAgICAgICBsYXN0X3BvcyAgICAgID0gcG9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsIHBvczsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbjsKKyAgICAgICAgICAgIG9mZnNldCA9IGF2aW9fcmw2NChwYik7CisgICAgICAgICAgICBhdmlvX3JsMzIocGIpOyAgICAgICAvKiBzaXplICovCisgICAgICAgICAgICBkdXJhdGlvbiA9IGF2aW9fcmwzMihwYik7CisKKyAgICAgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgICAgICAgICBpZiAoYXZpLT5vZG1sX2RlcHRoID4gTUFYX09ETUxfREVQVEgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVG9vIGRlZXBseSBuZXN0ZWQgT0RNTCBpbmRleGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF2aW9fc2VlayhwYiwgb2Zmc2V0ICsgOCwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBhdmktPm9kbWxfZGVwdGgrKzsKKyAgICAgICAgICAgIHJlYWRfYnJhaW5kZWFkX29kbWxfaW5keChzLCBmcmFtZV9udW0pOworICAgICAgICAgICAgYXZpLT5vZG1sX2RlcHRoLS07CisgICAgICAgICAgICBmcmFtZV9udW0gKz0gZHVyYXRpb247CisKKyAgICAgICAgICAgIGlmIChhdmlvX3NlZWsocGIsIHBvcywgU0VFS19TRVQpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVzdG9yZSBwb3NpdGlvbiBhZnRlciByZWFkaW5nIGluZGV4XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKyAgICBhdmktPmluZGV4X2xvYWRlZCA9IDI7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFuX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQ2NF90IGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCAgID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgQVZJU3RyZWFtICphc3QgPSBzdC0+cHJpdl9kYXRhOworICAgICAgICBpbnQgbiAgICAgICAgICA9IHN0LT5uYl9pbmRleF9lbnRyaWVzOworICAgICAgICBpbnQgbWF4ICAgICAgICA9IGFzdC0+c2FtcGxlX3NpemU7CisgICAgICAgIGludDY0X3QgcG9zLCBzaXplLCB0czsKKworICAgICAgICBpZiAobiAhPSAxIHx8IGFzdC0+c2FtcGxlX3NpemUgPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHdoaWxlIChtYXggPCAxMDI0KQorICAgICAgICAgICAgbWF4ICs9IG1heDsKKworICAgICAgICBwb3MgID0gc3QtPmluZGV4X2VudHJpZXNbMF0ucG9zOworICAgICAgICBzaXplID0gc3QtPmluZGV4X2VudHJpZXNbMF0uc2l6ZTsKKyAgICAgICAgdHMgICA9IHN0LT5pbmRleF9lbnRyaWVzWzBdLnRpbWVzdGFtcDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaiArPSBtYXgpCisgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIHBvcyArIGosIHRzICsgaiwgRkZNSU4obWF4LCBzaXplIC0gaiksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGF2aV9yZWFkX3RhZyhBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgdWludDMyX3QgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBjaGFyIGtleVs1XSAgICAgPSB7IDAgfTsKKyAgICBjaGFyICp2YWx1ZTsKKworICAgIHNpemUgKz0gKHNpemUgJiAxKTsKKworICAgIGlmIChzaXplID09IFVJTlRfTUFYKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIHZhbHVlID0gYXZfbWFsbG9jKHNpemUgKyAxKTsKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2aW9fcmVhZChwYiwgdmFsdWUsIHNpemUpOworICAgIHZhbHVlW3NpemVdID0gMDsKKworICAgIEFWX1dMMzIoa2V5LCB0YWcpOworCisgICAgcmV0dXJuIGF2X2RpY3Rfc2V0KHN0ID8gJnN0LT5tZXRhZGF0YSA6ICZzLT5tZXRhZGF0YSwga2V5LCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciBtb250aHNbMTJdWzRdID0geyAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIiB9OworCitzdGF0aWMgdm9pZCBhdmlfbWV0YWRhdGFfY3JlYXRpb25fdGltZShBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSwgY2hhciAqZGF0ZSkKK3sKKyAgICBjaGFyIG1vbnRoWzRdLCB0aW1lWzldLCBidWZmZXJbNjRdOworICAgIGludCBpLCBkYXksIHllYXI7CisgICAgLyogcGFyc2Ugc3RhbmRhcmQgQVZJIGRhdGUgZm9ybWF0IChpZS4gIk1vbiBNYXIgMTAgMTU6MDQ6NDMgMjAwMyIpICovCisgICAgaWYgKHNzY2FuZihkYXRlLCAiJSozcyUqWyBdJTNzJSpbIF0lMmQlKlsgXSU4cyUqWyBdJTRkIiwKKyAgICAgICAgICAgICAgIG1vbnRoLCAmZGF5LCB0aW1lLCAmeWVhcikgPT0gNCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKyAgICAgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcChtb250aCwgbW9udGhzW2ldKSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlLjRkLSUuMmQtJS4yZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciwgaSArIDEsIGRheSwgdGltZSk7CisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsICJjcmVhdGlvbl90aW1lIiwgYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGRhdGVbNF0gPT0gJy8nICYmIGRhdGVbN10gPT0gJy8nKSB7CisgICAgICAgIGRhdGVbNF0gPSBkYXRlWzddID0gJy0nOworICAgICAgICBhdl9kaWN0X3NldChtZXRhZGF0YSwgImNyZWF0aW9uX3RpbWUiLCBkYXRlLCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGF2aV9yZWFkX25pa29uKEFWRm9ybWF0Q29udGV4dCAqcywgdWludDY0X3QgZW5kKQoreworICAgIHdoaWxlIChhdmlvX3RlbGwocy0+cGIpIDwgZW5kKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICB1aW50MzJfdCBzaXplID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgY2FzZSBNS1RBRygnbicsICdjJywgJ3QnLCAnZycpOiAgLyogTmlrb24gVGFncyAqLworICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0YWdfZW5kID0gYXZpb190ZWxsKHMtPnBiKSArIHNpemU7CisgICAgICAgICAgICB3aGlsZSAoYXZpb190ZWxsKHMtPnBiKSA8IHRhZ19lbmQpIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCB0YWcgICAgID0gYXZpb19ybDE2KHMtPnBiKTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBzaXplICAgID0gYXZpb19ybDE2KHMtPnBiKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlcls2NF0gID0geyAwIH07CisgICAgICAgICAgICAgICAgc2l6ZSA9IEZGTUlOKHNpemUsIHRhZ19lbmQgLSBhdmlvX3RlbGwocy0+cGIpKTsKKyAgICAgICAgICAgICAgICBzaXplIC09IGF2aW9fcmVhZChzLT5wYiwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKHNpemUsIHNpemVvZihidWZmZXIpIC0gMSkpOworICAgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7CisgICAgICAgICAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gIm1ha2VyIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDA0OgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gIm1vZGVsIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDEzOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gImNyZWF0aW9uX3RpbWUiOworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyWzRdID09ICc6JyAmJiBidWZmZXJbN10gPT0gJzonKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyWzRdID0gYnVmZmVyWzddID0gJy0nOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgbmFtZSwgYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBhdmlfZXh0cmFjdF9zdHJlYW1fbWV0YWRhdGEoQVZTdHJlYW0gKnN0KQoreworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIHVpbnQ4X3QgKmRhdGEgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YTsKKyAgICBpbnQgZGF0YV9zaXplID0gc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZTsKKyAgICBpbnQgdGFnLCBvZmZzZXQ7CisKKyAgICBpZiAoIWRhdGEgfHwgZGF0YV9zaXplIDwgOCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgZGF0YSwgZGF0YV9zaXplKTsKKworICAgIHRhZyA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYik7CisKKyAgICBzd2l0Y2ggKHRhZykgeworICAgIGNhc2UgTUtUQUcoJ0EnLCAnVicsICdJJywgJ0YnKToKKyAgICAgICAgLy8gc2tpcCA0IGJ5dGUgcGFkZGluZworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgNCk7CisgICAgICAgIG9mZnNldCA9IGJ5dGVzdHJlYW0yX3RlbGwoJmdiKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGRhdGEgKyBvZmZzZXQsIGRhdGFfc2l6ZSAtIG9mZnNldCk7CisKKyAgICAgICAgLy8gZGVjb2RlIEVYSUYgdGFncyBmcm9tIElGRCwgQVZJIGlzIGFsd2F5cyBsaXR0bGUtZW5kaWFuCisgICAgICAgIHJldHVybiBhdnByaXZfZXhpZl9kZWNvZGVfaWZkKHN0LT5jb2RlYywgJmdiLCAxLCAwLCAmc3QtPm1ldGFkYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnQycsICdBJywgJ1MnLCAnSScpOgorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoc3QtPmNvZGVjLCAiUklGRiBzdHJlYW0gZGF0YSB0YWcgdHlwZSBDQVNJICgldSkiLCB0YWcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdaJywgJ28nLCAncicsICdhJyk6CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzdC0+Y29kZWMsICJSSUZGIHN0cmVhbSBkYXRhIHRhZyB0eXBlIFpvcmEgKCV1KSIsIHRhZyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbGN1bGF0ZV9iaXRyYXRlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklDb250ZXh0ICphdmkgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGksIGo7CisgICAgaW50NjRfdCBsZW5zdW0gPSAwOworICAgIGludDY0X3QgbWF4cG9zID0gMDsKKworICAgIGZvciAoaSA9IDA7IGk8cy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGludDY0X3QgbGVuID0gMDsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKworICAgICAgICBpZiAoIXN0LT5uYl9pbmRleF9lbnRyaWVzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0LT5uYl9pbmRleF9lbnRyaWVzOyBqKyspCisgICAgICAgICAgICBsZW4gKz0gc3QtPmluZGV4X2VudHJpZXNbal0uc2l6ZTsKKyAgICAgICAgbWF4cG9zID0gRkZNQVgobWF4cG9zLCBzdC0+aW5kZXhfZW50cmllc1tqLTFdLnBvcyk7CisgICAgICAgIGxlbnN1bSArPSBsZW47CisgICAgfQorICAgIGlmIChtYXhwb3MgPCBhdmktPmlvX2ZzaXplKjkvMTApIC8vIGluZGV4IGRvZXMgbm90IGNvdmVyIHRoZSB3aG9sZSBmaWxlCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChsZW5zdW0qOS8xMCA+IG1heHBvcyB8fCBsZW5zdW0gPCBtYXhwb3MqOS8xMCkgLy8gZnJhbWUgc3VtIGFuZCBmaWxlc2l6ZSBtaXNtYXRjaAorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaSA9IDA7IGk8cy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGludDY0X3QgbGVuID0gMDsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3QtPm5iX2luZGV4X2VudHJpZXM7IGorKykKKyAgICAgICAgICAgIGxlbiArPSBzdC0+aW5kZXhfZW50cmllc1tqXS5zaXplOworCisgICAgICAgIGlmIChzdC0+bmJfaW5kZXhfZW50cmllcyA8IDIgfHwgc3QtPmNvZGVjLT5iaXRfcmF0ZSA+IDApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZHVyYXRpb24gPSBzdC0+aW5kZXhfZW50cmllc1tqLTFdLnRpbWVzdGFtcCAtIHN0LT5pbmRleF9lbnRyaWVzWzBdLnRpbWVzdGFtcDsKKyAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IGF2X3Jlc2NhbGUoOCpsZW4sIHN0LT50aW1lX2Jhc2UuZGVuLCBkdXJhdGlvbiAqIHN0LT50aW1lX2Jhc2UubnVtKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYXZpX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklDb250ZXh0ICphdmkgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgdW5zaWduZWQgaW50IHRhZywgdGFnMSwgaGFuZGxlcjsKKyAgICBpbnQgY29kZWNfdHlwZSwgc3RyZWFtX2luZGV4LCBmcmFtZV9wZXJpb2Q7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgaW50IGk7CisgICAgQVZTdHJlYW0gKnN0OworICAgIEFWSVN0cmVhbSAqYXN0ICAgICAgPSBOVUxMOworICAgIGludCBhdmloX3dpZHRoICAgICAgPSAwLCBhdmloX2hlaWdodCA9IDA7CisgICAgaW50IGFtdl9maWxlX2Zvcm1hdCA9IDA7CisgICAgdWludDY0X3QgbGlzdF9lbmQgICA9IDA7CisgICAgaW50IHJldDsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZGljdF9lbnRyeTsKKworICAgIGF2aS0+c3RyZWFtX2luZGV4ID0gLTE7CisKKyAgICByZXQgPSBnZXRfcmlmZihzLCBwYik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdl9sb2coYXZpLCBBVl9MT0dfREVCVUcsICJ1c2Ugb2RtbDolZFxuIiwgYXZpLT51c2Vfb2RtbCk7CisKKyAgICBhdmktPmlvX2ZzaXplID0gYXZpLT5mc2l6ZSA9IGF2aW9fc2l6ZShwYik7CisgICAgaWYgKGF2aS0+ZnNpemUgPD0gMCB8fCBhdmktPmZzaXplIDwgYXZpLT5yaWZmX2VuZCkKKyAgICAgICAgYXZpLT5mc2l6ZSA9IGF2aS0+cmlmZl9lbmQgPT0gOCA/IElOVDY0X01BWCA6IGF2aS0+cmlmZl9lbmQ7CisKKyAgICAvKiBmaXJzdCBsaXN0IHRhZyAqLworICAgIHN0cmVhbV9pbmRleCA9IC0xOworICAgIGNvZGVjX3R5cGUgICA9IC0xOworICAgIGZyYW1lX3BlcmlvZCA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgdGFnICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIHNpemUgPSBhdmlvX3JsMzIocGIpOworCisgICAgICAgIHByaW50X3RhZygidGFnIiwgdGFnLCBzaXplKTsKKworICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICBjYXNlIE1LVEFHKCdMJywgJ0knLCAnUycsICdUJyk6CisgICAgICAgICAgICBsaXN0X2VuZCA9IGF2aW9fdGVsbChwYikgKyBzaXplOworICAgICAgICAgICAgLyogSWdub3JlZCwgZXhjZXB0IGF0IHN0YXJ0IG9mIHZpZGVvIHBhY2tldHMuICovCisgICAgICAgICAgICB0YWcxID0gYXZpb19ybDMyKHBiKTsKKworICAgICAgICAgICAgcHJpbnRfdGFnKCJsaXN0IiwgdGFnMSwgMCk7CisKKyAgICAgICAgICAgIGlmICh0YWcxID09IE1LVEFHKCdtJywgJ28nLCAndicsICdpJykpIHsKKyAgICAgICAgICAgICAgICBhdmktPm1vdmlfbGlzdCA9IGF2aW9fdGVsbChwYikgLSA0OworICAgICAgICAgICAgICAgIGlmIChzaXplKQorICAgICAgICAgICAgICAgICAgICBhdmktPm1vdmlfZW5kID0gYXZpLT5tb3ZpX2xpc3QgKyBzaXplICsgKHNpemUgJiAxKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGF2aS0+bW92aV9lbmQgPSBhdmktPmZzaXplOworICAgICAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgIm1vdmkgZW5kPSUiUFJJeDY0IlxuIiwgYXZpLT5tb3ZpX2VuZCk7CisgICAgICAgICAgICAgICAgZ290byBlbmRfb2ZfaGVhZGVyOworICAgICAgICAgICAgfSBlbHNlIGlmICh0YWcxID09IE1LVEFHKCdJJywgJ04nLCAnRicsICdPJykpCisgICAgICAgICAgICAgICAgZmZfcmVhZF9yaWZmX2luZm8ocywgc2l6ZSAtIDQpOworICAgICAgICAgICAgZWxzZSBpZiAodGFnMSA9PSBNS1RBRygnbicsICdjJywgJ2QnLCAndCcpKQorICAgICAgICAgICAgICAgIGF2aV9yZWFkX25pa29uKHMsIGxpc3RfZW5kKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ0knLCAnRCcsICdJJywgJ1QnKToKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBkYXRlWzY0XSA9IHsgMCB9OworICAgICAgICAgICAgc2l6ZSArPSAoc2l6ZSAmIDEpOworICAgICAgICAgICAgc2l6ZSAtPSBhdmlvX3JlYWQocGIsIGRhdGUsIEZGTUlOKHNpemUsIHNpemVvZihkYXRlKSAtIDEpKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgICAgICBhdmlfbWV0YWRhdGFfY3JlYXRpb25fdGltZSgmcy0+bWV0YWRhdGEsIGRhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBNS1RBRygnZCcsICdtJywgJ2wnLCAnaCcpOgorICAgICAgICAgICAgYXZpLT5pc19vZG1sID0gMTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSArIChzaXplICYgMSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ2EnLCAnbScsICd2JywgJ2gnKToKKyAgICAgICAgICAgIGFtdl9maWxlX2Zvcm1hdCA9IDE7CisgICAgICAgIGNhc2UgTUtUQUcoJ2EnLCAndicsICdpJywgJ2gnKToKKyAgICAgICAgICAgIC8qIEFWSSBoZWFkZXIgKi8KKyAgICAgICAgICAgIC8qIHVzaW5nIGZyYW1lX3BlcmlvZCBpcyBiYWQgaWRlYSAqLworICAgICAgICAgICAgZnJhbWVfcGVyaW9kID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGF2aW9fcmwzMihwYik7IC8qIG1heC4gYnl0ZXMgcGVyIHNlY29uZCAqLworICAgICAgICAgICAgYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGF2aS0+bm9uX2ludGVybGVhdmVkIHw9IGF2aW9fcmwzMihwYikgJiBBVklGX01VU1RVU0VJTkRFWDsKKworICAgICAgICAgICAgYXZpb19za2lwKHBiLCAyICogNCk7CisgICAgICAgICAgICBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGF2aWhfd2lkdGggID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGF2aWhfaGVpZ2h0ID0gYXZpb19ybDMyKHBiKTsKKworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gMTAgKiA0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdzJywgJ3QnLCAncicsICdoJyk6CisgICAgICAgICAgICAvKiBzdHJlYW0gaGVhZGVyICovCisKKyAgICAgICAgICAgIHRhZzEgICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgaGFuZGxlciA9IGF2aW9fcmwzMihwYik7IC8qIGNvZGVjIHRhZyAqLworCisgICAgICAgICAgICBpZiAodGFnMSA9PSBNS1RBRygncCcsICdhJywgJ2QnLCAncycpKSB7CisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gOCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmVhbV9pbmRleCsrOworICAgICAgICAgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgICAgICAgICBzdC0+aWQgPSBzdHJlYW1faW5kZXg7CisgICAgICAgICAgICAgICAgYXN0ICAgID0gYXZfbWFsbG9jeihzaXplb2YoQVZJU3RyZWFtKSk7CisgICAgICAgICAgICAgICAgaWYgKCFhc3QpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICBzdC0+cHJpdl9kYXRhID0gYXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFtdl9maWxlX2Zvcm1hdCkKKyAgICAgICAgICAgICAgICB0YWcxID0gc3RyZWFtX2luZGV4ID8gTUtUQUcoJ2EnLCAndScsICdkJywgJ3MnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNS1RBRygndicsICdpJywgJ2QnLCAncycpOworCisgICAgICAgICAgICBwcmludF90YWcoInN0cmgiLCB0YWcxLCAtMSk7CisKKyAgICAgICAgICAgIGlmICh0YWcxID09IE1LVEFHKCdpJywgJ2EnLCAndicsICdzJykgfHwKKyAgICAgICAgICAgICAgICB0YWcxID09IE1LVEFHKCdpJywgJ3YnLCAnYScsICdzJykpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGR2X2R1cjsKKworICAgICAgICAgICAgICAgIC8qIEFmdGVyIHNvbWUgY29uc2lkZXJhdGlvbiAtLSBJIGRvbid0IHRoaW5rIHdlCisgICAgICAgICAgICAgICAgICogaGF2ZSB0byBzdXBwb3J0IGFueXRoaW5nIGJ1dCBEViBpbiB0eXBlMSBBVklzLiAqLworICAgICAgICAgICAgICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IE1LVEFHKCdkJywgJ3YnLCAncycsICdkJykgJiYKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlciAhPSBNS1RBRygnZCcsICd2JywgJ2gnLCAnZCcpICYmCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgIT0gTUtUQUcoJ2QnLCAndicsICdzJywgJ2wnKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgICAgICAgICAgYXN0ID0gcy0+c3RyZWFtc1swXS0+cHJpdl9kYXRhOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5zdHJlYW1zWzBdLT5jb2RlYy0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcy0+c3RyZWFtc1swXS0+Y29kZWMpOworICAgICAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zWzBdLT5pbmZvKQorICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcy0+c3RyZWFtc1swXS0+aW5mby0+ZHVyYXRpb25fZXJyb3IpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5zdHJlYW1zWzBdLT5pbmZvKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcy0+c3RyZWFtc1swXSk7CisgICAgICAgICAgICAgICAgcy0+bmJfc3RyZWFtcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKENPTkZJR19EVl9ERU1VWEVSKSB7CisgICAgICAgICAgICAgICAgICAgIGF2aS0+ZHZfZGVtdXggPSBhdnByaXZfZHZfaW5pdF9kZW11eChzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhdmktPmR2X2RlbXV4KQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1swXS0+cHJpdl9kYXRhID0gYXN0OworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMyAqIDQpOworICAgICAgICAgICAgICAgIGFzdC0+c2NhbGUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgIGFzdC0+cmF0ZSAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7ICAvKiBzdGFydCB0aW1lICovCisKKyAgICAgICAgICAgICAgICBkdl9kdXIgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgIGlmIChhc3QtPnNjYWxlID4gMCAmJiBhc3QtPnJhdGUgPiAwICYmIGR2X2R1ciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZHZfZHVyICAgICAqPSBBVl9USU1FX0JBU0U7CisgICAgICAgICAgICAgICAgICAgIHMtPmR1cmF0aW9uID0gYXZfcmVzY2FsZShkdl9kdXIsIGFzdC0+c2NhbGUsIGFzdC0+cmF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGVsc2UsIGxlYXZlIGR1cmF0aW9uIGFsb25lOyB0aW1pbmcgZXN0aW1hdGlvbiBpbiB1dGlscy5jCisgICAgICAgICAgICAgICAgICogd2lsbCBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gYml0cmF0ZS4gKi8KKworICAgICAgICAgICAgICAgIHN0cmVhbV9pbmRleCA9IHMtPm5iX3N0cmVhbXMgLSAxOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSAtIDkgKiA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfYXNzZXJ0MChzdHJlYW1faW5kZXggPCBzLT5uYl9zdHJlYW1zKTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+c3RyZWFtX2NvZGVjX3RhZyA9IGhhbmRsZXI7CisKKyAgICAgICAgICAgIGF2aW9fcmwzMihwYik7IC8qIGZsYWdzICovCisgICAgICAgICAgICBhdmlvX3JsMTYocGIpOyAvKiBwcmlvcml0eSAqLworICAgICAgICAgICAgYXZpb19ybDE2KHBiKTsgLyogbGFuZ3VhZ2UgKi8KKyAgICAgICAgICAgIGF2aW9fcmwzMihwYik7IC8qIGluaXRpYWwgZnJhbWUgKi8KKyAgICAgICAgICAgIGFzdC0+c2NhbGUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgYXN0LT5yYXRlICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBpZiAoIShhc3QtPnNjYWxlICYmIGFzdC0+cmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJzY2FsZS9yYXRlIGlzICUiUFJJdTMyIi8lIlBSSXUzMiIgd2hpY2ggaXMgaW52YWxpZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAiKFRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgYnJva2VuIHNvZnR3YXJlLilcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+c2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+cmF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lX3BlcmlvZCkgeworICAgICAgICAgICAgICAgICAgICBhc3QtPnJhdGUgID0gMTAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgYXN0LT5zY2FsZSA9IGZyYW1lX3BlcmlvZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3QtPnJhdGUgID0gMjU7CisgICAgICAgICAgICAgICAgICAgIGFzdC0+c2NhbGUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBhc3QtPnNjYWxlLCBhc3QtPnJhdGUpOworCisgICAgICAgICAgICBhc3QtPmN1bV9sZW4gID0gYXZpb19ybDMyKHBiKTsgLyogc3RhcnQgKi8KKyAgICAgICAgICAgIHN0LT5uYl9mcmFtZXMgPSBhdmlvX3JsMzIocGIpOworCisgICAgICAgICAgICBzdC0+c3RhcnRfdGltZSA9IDA7CisgICAgICAgICAgICBhdmlvX3JsMzIocGIpOyAvKiBidWZmZXIgc2l6ZSAqLworICAgICAgICAgICAgYXZpb19ybDMyKHBiKTsgLyogcXVhbGl0eSAqLworICAgICAgICAgICAgaWYgKGFzdC0+Y3VtX2xlbiphc3QtPnNjYWxlL2FzdC0+cmF0ZSA+IDM2MDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY3Jhenkgc3RhcnQgdGltZSwgaWFtIHNjYXJlZCwgZ2l2aW5nIHVwXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzdC0+c2FtcGxlX3NpemUgPSBhdmlvX3JsMzIocGIpOyAvKiBzYW1wbGUgc3NpemUgKi8KKyAgICAgICAgICAgIGFzdC0+Y3VtX2xlbiAgICAqPSBGRk1BWCgxLCBhc3QtPnNhbXBsZV9zaXplKTsKKyAgICAgICAgICAgIGF2X2Rsb2cocywgIiUiUFJJdTMyIiAlIlBSSXUzMiIgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGFzdC0+cmF0ZSwgYXN0LT5zY2FsZSwgYXN0LT5zYW1wbGVfc2l6ZSk7CisKKyAgICAgICAgICAgIHN3aXRjaCAodGFnMSkgeworICAgICAgICAgICAgY2FzZSBNS1RBRygndicsICdpJywgJ2QnLCAncycpOgorICAgICAgICAgICAgICAgIGNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisKKyAgICAgICAgICAgICAgICBhc3QtPnNhbXBsZV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICBzdC0+YXZnX2ZyYW1lX3JhdGUgPSBhdl9pbnZfcShzdC0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUtUQUcoJ2EnLCAndScsICdkJywgJ3MnKToKKyAgICAgICAgICAgICAgICBjb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNS1RBRygndCcsICd4JywgJ3QnLCAncycpOgorICAgICAgICAgICAgICAgIGNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1LVEFHKCdkJywgJ2EnLCAndCcsICdzJyk6CisgICAgICAgICAgICAgICAgY29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJ1bmtub3duIHN0cmVhbSB0eXBlICVYXG4iLCB0YWcxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhc3QtPnNhbXBsZV9zaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSBzdC0+bmJfZnJhbWVzOworICAgICAgICAgICAgICAgIGlmIChzdC0+ZHVyYXRpb24gPiAwICYmIGF2aS0+aW9fZnNpemUgPiAwICYmIGF2aS0+cmlmZl9lbmQgPiBhdmktPmlvX2ZzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJGaWxlIGlzIHRydW5jYXRlZCBhZGp1c3RpbmcgZHVyYXRpb25cbiIpOworICAgICAgICAgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSBhdl9yZXNjYWxlKHN0LT5kdXJhdGlvbiwgYXZpLT5pb19mc2l6ZSwgYXZpLT5yaWZmX2VuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXN0LT5mcmFtZV9vZmZzZXQgPSBhc3QtPmN1bV9sZW47CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUgLSAxMiAqIDQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ3MnLCAndCcsICdyJywgJ2YnKToKKyAgICAgICAgICAgIC8qIHN0cmVhbSBoZWFkZXIgKi8KKyAgICAgICAgICAgIGlmICghc2l6ZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChzdHJlYW1faW5kZXggPj0gKHVuc2lnbmVkKXMtPm5iX3N0cmVhbXMgfHwgYXZpLT5kdl9kZW11eCkgeworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGN1cl9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGVzaXplOworICAgICAgICAgICAgICAgIGlmIChjdXJfcG9zIDwgbGlzdF9lbmQpCisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBGRk1JTihzaXplLCBsaXN0X2VuZCAtIGN1cl9wb3MpOworICAgICAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZWNfdHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgICAgICAgICBpZiAoYW12X2ZpbGVfZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSBhdmloX3dpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gYXZpaF9oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BTVY7CisgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGFnMSA9IGZmX2dldF9ibXBfaGVhZGVyKHBiLCBzdCwgJmVzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodGFnMSA9PSBNS1RBRygnRCcsICdYJywgJ1MnLCAnQicpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0YWcxID09IE1LVEFHKCdEJywgJ1gnLCAnUycsICdBJykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IHRhZzE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9YU1VCOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IDEwICogNCAmJiBzaXplIDwgKDEgPDwgMzApICYmIHNpemUgPCBhdmktPmZzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNpemUgPT0gc2l6ZS0xICYmIChlc2l6ZSYxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBlc2l6ZSAtIDEwICogNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAgc2l6ZSAtIDEwICogNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGNoZWNrIGlmIHRoZSBlbmNvZGVyIHJlYWxseSBkaWQgdGhpcyBjb3JyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgJiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZpb19yOChwYik7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRXh0cmFjdCBwYWxldHRlIGZyb20gZXh0cmFkYXRhIGlmIGJwcCA8PSA4LgorICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IGV4dHJhZGF0YSBjb250YWlucyBvbmx5IHBhbGV0dGUuCisgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdHJ1ZSBmb3IgYWxsIHBhbGV0dGVkIGNvZGVjcyBpbXBsZW1lbnRlZCBpbgorICAgICAgICAgICAgICAgICAgICAgKiBGRm1wZWcuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPD0gOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxfc2l6ZSA9ICgxIDw8IHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSA8PCAyOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGFsX3NyYzsKKworICAgICAgICAgICAgICAgICAgICAgICAgcGFsX3NpemUgPSBGRk1JTihwYWxfc2l6ZSwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWxfc3JjICA9IHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAtIHBhbF9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhjbHVkZSB0aGUgIkJvdHRvbVVwIiBmaWVsZCBmcm9tIHRoZSBwYWxldHRlICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFsX3NyYyAtIHN0LT5jb2RlYy0+ZXh0cmFkYXRhID49IDkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbWVtY21wKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAtIDksICJCb3R0b21VcCIsIDkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbF9zcmMgLT0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWxfc2l6ZSAvIDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3QtPnBhbFtpXSA9IDB4RkZVPDwyNCB8IEFWX1JMMzIocGFsX3NyYys0KmkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5oYXNfcGFsID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByaW50X3RhZygidmlkZW8iLCB0YWcxLCAwKTsKKworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IHRhZzE7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzEpOworICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIG5lZWRlZCB0byBnZXQgdGhlIHBpY3QgdHlwZSB3aGljaCBpcyBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgICogZm9yIGdlbmVyYXRpbmcgY29ycmVjdCBwdHMuICovCisgICAgICAgICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOworICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190YWcgPT0gTUtUQUcoJ1YnLCAnUycsICdTJywgJ0gnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSAwICYmIHN0LT5jb2RlYy0+aGVpZ2h0ID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA8IDFVIDw8IDMwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICs9IDk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGF2X3JlYWxsb2NwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAtIDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb3R0b21VcCIsIDkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gRkZBQlMoc3QtPmNvZGVjLT5oZWlnaHQpOworCisvLyAgICAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gNSAqIDQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocGIsIHN0LT5jb2RlYywgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgYXN0LT5kc2hvd19ibG9ja19hbGlnbiA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgICAgICAgICAgICAgICAgIGlmIChhc3QtPnNhbXBsZV9zaXplICYmIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+c2FtcGxlX3NpemUgIT0gc3QtPmNvZGVjLT5ibG9ja19hbGlnbikgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZSBzaXplICglZCkgIT0gYmxvY2sgYWxpZ24gKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3QtPnNhbXBsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pOworICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5zYW1wbGVfc2l6ZSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogMi1hbGlnbmVkCisgICAgICAgICAgICAgICAgICAgICAqIChmaXggZm9yIFN0YXJnYXRlIFNHLTEgLSAzeDE4IC0gU2hhZGVzIG9mIEdyZXkuYXZpKSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSAmIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDEpOworICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSBwYXJzaW5nIGFzIHNldmVyYWwgYXVkaW8gZnJhbWVzIGNhbiBiZSBpbgorICAgICAgICAgICAgICAgICAgICAgKiBvbmUgcGFja2V0IGFuZCB0aW1lc3RhbXBzIHJlZmVyIHRvIHBhY2tldCBzdGFydC4gKi8KKyAgICAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX1RJTUVTVEFNUFM7CisgICAgICAgICAgICAgICAgICAgIC8qIEFEVFMgaGVhZGVyIGlzIGluIGV4dHJhZGF0YSwgQUFDIHdpdGhvdXQgaGVhZGVyIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICogc3RvcmVkIGFzIGV4YWN0IGZyYW1lcy4gUGFyc2VyIG5vdCBuZWVkZWQgYW5kIGl0IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICogZmFpbC4gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX05PTkU7CisgICAgICAgICAgICAgICAgICAgIC8qIEFWSSBmaWxlcyB3aXRoIFhhbiBEUENNIGF1ZGlvICh3cm9uZ2x5KSBkZWNsYXJlIFBDTQorICAgICAgICAgICAgICAgICAgICAgKiBhdWRpbyBpbiB0aGUgaGVhZGVyIGJ1dCBoYXZlIEF4YW4gYXMgc3RyZWFtX2NvZGVfdGFnLiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5zdHJlYW1fY29kZWNfdGFnID09IEFWX1JMMzIoIkF4YW4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgPSBBVl9DT0RFQ19JRF9YQU5fRFBDTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+ZHNob3dfYmxvY2tfYWxpZ24gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChhbXZfZmlsZV9mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQU1WOworICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5kc2hvd19ibG9ja19hbGlnbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmIGFzdC0+ZHNob3dfYmxvY2tfYWxpZ24gPD0gNCAmJiBhc3QtPmRzaG93X2Jsb2NrX2FsaWduKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAib3ZlcnJpZGluZyBpbnZhbGlkIGRzaG93X2Jsb2NrX2FsaWduIG9mICVkXG4iLCBhc3QtPmRzaG93X2Jsb2NrX2FsaWduKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+ZHNob3dfYmxvY2tfYWxpZ24gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAmJiBhc3QtPmRzaG93X2Jsb2NrX2FsaWduID09IDEwMjQgJiYgYXN0LT5zYW1wbGVfc2l6ZSA9PSAxMDI0IHx8CisgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmIGFzdC0+ZHNob3dfYmxvY2tfYWxpZ24gPT0gNDA5NiAmJiBhc3QtPnNhbXBsZV9zaXplID09IDQwOTYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMgJiYgYXN0LT5kc2hvd19ibG9ja19hbGlnbiA9PSAxMTUyICYmIGFzdC0+c2FtcGxlX3NpemUgPT0gMTE1MikgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIm92ZXJyaWRpbmcgc2FtcGxlX3NpemVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5zYW1wbGVfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPnJlcXVlc3RfcHJvYmU9IDE7CisgICAgICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9OT05FOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSAwOworICAgICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygncycsICd0JywgJ3InLCAnZCcpOgorICAgICAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA+PSAodW5zaWduZWQpcy0+bmJfc3RyZWFtcworICAgICAgICAgICAgICAgIHx8IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWMtPmV4dHJhZGF0YV9zaXplCisgICAgICAgICAgICAgICAgfHwgcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5jb2RlYy0+Y29kZWNfdGFnID09IE1LVEFHKCdIJywnMicsJzYnLCc0JykpIHsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBjdXJfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyX3BvcyA8IGxpc3RfZW5kKQorICAgICAgICAgICAgICAgICAgICBzaXplID0gRkZNSU4oc2l6ZSwgbGlzdF9lbmQgLSBjdXJfcG9zKTsKKyAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKKworICAgICAgICAgICAgICAgIGlmIChzaXplPCgxPDwzMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAmIDEpIC8vRklYTUUgY2hlY2sgaWYgdGhlIGVuY29kZXIgcmVhbGx5IGRpZCB0aGlzIGNvcnJlY3RseQorICAgICAgICAgICAgICAgICAgICBhdmlvX3I4KHBiKTsKKworICAgICAgICAgICAgICAgIHJldCA9IGF2aV9leHRyYWN0X3N0cmVhbV9tZXRhZGF0YShzdCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiY291bGQgbm90IGRlY29kaW5nIEVYSUYgZGF0YSBpbiBzdHJlYW0gaGVhZGVyLlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ2knLCAnbicsICdkJywgJ3gnKToKKyAgICAgICAgICAgIGkgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgaWYgKHBiLT5zZWVrYWJsZSAmJiAhKHMtPmZsYWdzICYgQVZGTVRfRkxBR19JR05JRFgpICYmCisgICAgICAgICAgICAgICAgYXZpLT51c2Vfb2RtbCAmJgorICAgICAgICAgICAgICAgIHJlYWRfYnJhaW5kZWFkX29kbWxfaW5keChzLCAwKSA8IDAgJiYKKyAgICAgICAgICAgICAgICAocy0+ZXJyb3JfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGkgKyBzaXplLCBTRUVLX1NFVCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygndicsICdwJywgJ3InLCAncCcpOgorICAgICAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA8ICh1bnNpZ25lZClzLT5uYl9zdHJlYW1zICYmIHNpemUgPiA5ICogNCkgeworICAgICAgICAgICAgICAgIEFWUmF0aW9uYWwgYWN0aXZlLCBhY3RpdmVfYXNwZWN0OworCisgICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgICAgICAgICAgICAgYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgICAgICBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgIGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICAgICAgYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgICAgICBhdmlvX3JsMzIocGIpOworCisgICAgICAgICAgICAgICAgYWN0aXZlX2FzcGVjdC5kZW4gPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgICAgIGFjdGl2ZV9hc3BlY3QubnVtID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgICAgICAgICBhY3RpdmUubnVtICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICAgICAgYWN0aXZlLmRlbiAgICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgIGF2aW9fcmwzMihwYik7IC8vIG5iRmllbGRzUGVyRnJhbWUKKworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVfYXNwZWN0Lm51bSAmJiBhY3RpdmVfYXNwZWN0LmRlbiAmJgorICAgICAgICAgICAgICAgICAgICBhY3RpdmUubnVtICYmIGFjdGl2ZS5kZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhdl9kaXZfcShhY3RpdmVfYXNwZWN0LCBhY3RpdmUpOworICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKHMsICJ2cHJwICVkLyVkICVkLyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9hc3BlY3QubnVtLCBhY3RpdmVfYXNwZWN0LmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUubnVtLCBhY3RpdmUuZGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZSAtPSA5ICogNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygncycsICd0JywgJ3InLCAnbicpOgorICAgICAgICAgICAgaWYgKHMtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBhdmlfcmVhZF90YWcocywgcy0+c3RyZWFtc1tzLT5uYl9zdHJlYW1zIC0gMV0sIHRhZywgc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDEwMDAwMDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiU29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIGhlYWRlciBwYXJzaW5nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJJIHdpbGwgaWdub3JlIGl0IGFuZCB0cnkgdG8gY29udGludWUgYW55d2F5LlxuIik7CisgICAgICAgICAgICAgICAgaWYgKHMtPmVycm9yX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIGF2aS0+bW92aV9saXN0ID0gYXZpb190ZWxsKHBiKSAtIDQ7CisgICAgICAgICAgICAgICAgYXZpLT5tb3ZpX2VuZCAgPSBhdmktPmZzaXplOworICAgICAgICAgICAgICAgIGdvdG8gZW5kX29mX2hlYWRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHNraXAgdGFnICovCisgICAgICAgICAgICBzaXplICs9IChzaXplICYgMSk7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKK2VuZF9vZl9oZWFkZXI6CisgICAgLyogY2hlY2sgc3RyZWFtIG51bWJlciAqLworICAgIGlmIChzdHJlYW1faW5kZXggIT0gcy0+bmJfc3RyZWFtcyAtIDEpIHsKKworZmFpbDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCFhdmktPmluZGV4X2xvYWRlZCAmJiBwYi0+c2Vla2FibGUpCisgICAgICAgIGF2aV9sb2FkX2luZGV4KHMpOworICAgIGNhbGN1bGF0ZV9iaXRyYXRlKHMpOworICAgIGF2aS0+aW5kZXhfbG9hZGVkICAgIHw9IDE7CisKKyAgICBpZiAoKHJldCA9IGd1ZXNzX25pX2ZsYWcocykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2aS0+bm9uX2ludGVybGVhdmVkIHw9IHJldCB8IChzLT5mbGFncyAmIEFWRk1UX0ZMQUdfU09SVF9EVFMpOworCisgICAgZGljdF9lbnRyeSA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiSVNGVCIsIE5VTEwsIDApOworICAgIGlmIChkaWN0X2VudHJ5ICYmICFzdHJjbXAoZGljdF9lbnRyeS0+dmFsdWUsICJQb3RFbmNvZGVyIikpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBpZiAoICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPCisgICAgICAgICAgICAgICAgfHwgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKQorICAgICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworICAgICAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIGlmIChzdC0+bmJfaW5kZXhfZW50cmllcykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBEVi1pbi1BVkkgY2Fubm90IGJlIG5vbi1pbnRlcmxlYXZlZCwgaWYgc2V0IHRoaXMgbXVzdCBiZQorICAgIC8vIGEgbWlzLWRldGVjdGlvbi4KKyAgICBpZiAoYXZpLT5kdl9kZW11eCkKKyAgICAgICAgYXZpLT5ub25faW50ZXJsZWF2ZWQgPSAwOworICAgIGlmIChpID09IHMtPm5iX3N0cmVhbXMgJiYgYXZpLT5ub25faW50ZXJsZWF2ZWQpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIk5vbi1pbnRlcmxlYXZlZCBBVkkgd2l0aG91dCBpbmRleCwgc3dpdGNoaW5nIHRvIGludGVybGVhdmVkXG4iKTsKKyAgICAgICAgYXZpLT5ub25faW50ZXJsZWF2ZWQgPSAwOworICAgIH0KKworICAgIGlmIChhdmktPm5vbl9pbnRlcmxlYXZlZCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJub24taW50ZXJsZWF2ZWQgQVZJXG4iKTsKKyAgICAgICAgY2xlYW5faW5kZXgocyk7CisgICAgfQorCisgICAgZmZfbWV0YWRhdGFfY29udl9jdHgocywgTlVMTCwgYXZpX21ldGFkYXRhX2NvbnYpOworICAgIGZmX21ldGFkYXRhX2NvbnZfY3R4KHMsIE5VTEwsIGZmX3JpZmZfaW5mb19jb252KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfZ2FiMl9zdWIoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaWYgKHBrdC0+c2l6ZSA+PSA3ICYmCisgICAgICAgIHBrdC0+c2l6ZSA8IElOVF9NQVggLSBBVlBST0JFX1BBRERJTkdfU0laRSAmJgorICAgICAgICAhc3RyY21wKHBrdC0+ZGF0YSwgIkdBQjIiKSAmJiBBVl9STDE2KHBrdC0+ZGF0YSArIDUpID09IDIpIHsKKyAgICAgICAgdWludDhfdCBkZXNjWzI1Nl07CisgICAgICAgIGludCBzY29yZSAgICAgID0gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04sIHJldDsKKyAgICAgICAgQVZJU3RyZWFtICphc3QgPSBzdC0+cHJpdl9kYXRhOworICAgICAgICBBVklucHV0Rm9ybWF0ICpzdWJfZGVtdXhlcjsKKyAgICAgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7CisgICAgICAgIGludCBzaXplOworICAgICAgICBBVklPQ29udGV4dCAqcGIgPSBhdmlvX2FsbG9jX2NvbnRleHQocGt0LT5kYXRhICsgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+c2l6ZSAtIDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgQVZQcm9iZURhdGEgcGQ7CisgICAgICAgIHVuc2lnbmVkIGludCBkZXNjX2xlbiA9IGF2aW9fcmwzMihwYik7CisKKyAgICAgICAgaWYgKGRlc2NfbGVuID4gcGItPmJ1Zl9lbmQgLSBwYi0+YnVmX3B0cikKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgcmV0ID0gYXZpb19nZXRfc3RyMTZsZShwYiwgZGVzY19sZW4sIGRlc2MsIHNpemVvZihkZXNjKSk7CisgICAgICAgIGF2aW9fc2tpcChwYiwgZGVzY19sZW4gLSByZXQpOworICAgICAgICBpZiAoKmRlc2MpCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAidGl0bGUiLCBkZXNjLCAwKTsKKworICAgICAgICBhdmlvX3JsMTYocGIpOyAgIC8qIGZsYWdzPyAqLworICAgICAgICBhdmlvX3JsMzIocGIpOyAgIC8qIGRhdGEgc2l6ZSAqLworCisgICAgICAgIHNpemUgPSBwYi0+YnVmX2VuZCAtIHBiLT5idWZfcHRyOworICAgICAgICBwZCA9IChBVlByb2JlRGF0YSkgeyAuYnVmICAgICAgPSBhdl9tYWxsb2N6KHNpemUgKyBBVlBST0JFX1BBRERJTkdfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZfc2l6ZSA9IHNpemUgfTsKKyAgICAgICAgaWYgKCFwZC5idWYpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBtZW1jcHkocGQuYnVmLCBwYi0+YnVmX3B0ciwgc2l6ZSk7CisgICAgICAgIHN1Yl9kZW11eGVyID0gYXZfcHJvYmVfaW5wdXRfZm9ybWF0MigmcGQsIDEsICZzY29yZSk7CisgICAgICAgIGF2X2ZyZWVwKCZwZC5idWYpOworICAgICAgICBpZiAoIXN1Yl9kZW11eGVyKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICBpZiAoIShhc3QtPnN1Yl9jdHggPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCkpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICBhc3QtPnN1Yl9jdHgtPnBiID0gcGI7CisKKyAgICAgICAgaWYgKGZmX2NvcHlfd2hpdGVsaXN0cyhhc3QtPnN1Yl9jdHgsIHMpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgaWYgKCFhdmZvcm1hdF9vcGVuX2lucHV0KCZhc3QtPnN1Yl9jdHgsICIiLCBzdWJfZGVtdXhlciwgTlVMTCkpIHsKKyAgICAgICAgICAgIGZmX3JlYWRfcGFja2V0KGFzdC0+c3ViX2N0eCwgJmFzdC0+c3ViX3BrdCk7CisgICAgICAgICAgICAqc3QtPmNvZGVjID0gKmFzdC0+c3ViX2N0eC0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgICAgICAgICBhc3QtPnN1Yl9jdHgtPnN0cmVhbXNbMF0tPmNvZGVjLT5leHRyYWRhdGEgPSBOVUxMOworICAgICAgICAgICAgdGltZV9iYXNlID0gYXN0LT5zdWJfY3R4LT5zdHJlYW1zWzBdLT50aW1lX2Jhc2U7CisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgdGltZV9iYXNlLm51bSwgdGltZV9iYXNlLmRlbik7CisgICAgICAgIH0KKyAgICAgICAgYXN0LT5zdWJfYnVmZmVyID0gcGt0LT5kYXRhOworICAgICAgICBtZW1zZXQocGt0LCAwLCBzaXplb2YoKnBrdCkpOworICAgICAgICByZXR1cm4gMTsKKworZXJyb3I6CisgICAgICAgIGF2X2ZyZWVwKCZhc3QtPnN1Yl9jdHgpOworICAgICAgICBhdl9mcmVlcCgmcGIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEFWU3RyZWFtICpnZXRfc3VidGl0bGVfcGt0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKm5leHRfc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVklTdHJlYW0gKmFzdCwgKm5leHRfYXN0ID0gbmV4dF9zdC0+cHJpdl9kYXRhOworICAgIGludDY0X3QgdHMsIG5leHRfdHMsIHRzX21pbiA9IElOVDY0X01BWDsKKyAgICBBVlN0cmVhbSAqc3QsICpzdWJfc3QgPSBOVUxMOworICAgIGludCBpOworCisgICAgbmV4dF90cyA9IGF2X3Jlc2NhbGVfcShuZXh0X2FzdC0+ZnJhbWVfb2Zmc2V0LCBuZXh0X3N0LT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHN0ICA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIGFzdCA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgIGlmIChzdC0+ZGlzY2FyZCA8IEFWRElTQ0FSRF9BTEwgJiYgYXN0ICYmIGFzdC0+c3ViX3BrdC5kYXRhKSB7CisgICAgICAgICAgICB0cyA9IGF2X3Jlc2NhbGVfcShhc3QtPnN1Yl9wa3QuZHRzLCBzdC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgICAgICBpZiAodHMgPD0gbmV4dF90cyAmJiB0cyA8IHRzX21pbikgeworICAgICAgICAgICAgICAgIHRzX21pbiA9IHRzOworICAgICAgICAgICAgICAgIHN1Yl9zdCA9IHN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN1Yl9zdCkgeworICAgICAgICBhc3QgICAgICAgICAgICAgICA9IHN1Yl9zdC0+cHJpdl9kYXRhOworICAgICAgICAqcGt0ICAgICAgICAgICAgICA9IGFzdC0+c3ViX3BrdDsKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdWJfc3QtPmluZGV4OworCisgICAgICAgIGlmIChmZl9yZWFkX3BhY2tldChhc3QtPnN1Yl9jdHgsICZhc3QtPnN1Yl9wa3QpIDwgMCkKKyAgICAgICAgICAgIGFzdC0+c3ViX3BrdC5kYXRhID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHN1Yl9zdDsKK30KKworc3RhdGljIGludCBnZXRfc3RyZWFtX2lkeChjb25zdCB1bnNpZ25lZCAqZCkKK3sKKyAgICBpZiAoZFswXSA+PSAnMCcgJiYgZFswXSA8PSAnOScgJiYKKyAgICAgICAgZFsxXSA+PSAnMCcgJiYgZFsxXSA8PSAnOScpIHsKKyAgICAgICAgcmV0dXJuIChkWzBdIC0gJzAnKSAqIDEwICsgKGRbMV0gLSAnMCcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAxMDA7IC8vIGludmFsaWQgc3RyZWFtIElECisgICAgfQorfQorCisvKioKKyAqCisgKiBAcGFyYW0gZXhpdF9lYXJseSBzZXQgdG8gMSB0byBqdXN0IGdhdGhlciBwYWNrZXQgcG9zaXRpb24gd2l0aG91dCBtYWtpbmcgdGhlIGNoYW5nZXMgbmVlZGVkIHRvIGFjdHVhbGx5IHJlYWQgJiByZXR1cm4gdGhlIHBhY2tldAorICovCitzdGF0aWMgaW50IGF2aV9zeW5jKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGV4aXRfZWFybHkpCit7CisgICAgQVZJQ29udGV4dCAqYXZpID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCBuOworICAgIHVuc2lnbmVkIGludCBkWzhdOworICAgIHVuc2lnbmVkIGludCBzaXplOworICAgIGludDY0X3QgaSwgc3luYzsKKworc3RhcnRfc3luYzoKKyAgICBtZW1zZXQoZCwgLTEsIHNpemVvZihkKSk7CisgICAgZm9yIChpID0gc3luYyA9IGF2aW9fdGVsbChwYik7ICFhdmlvX2Zlb2YocGIpOyBpKyspIHsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDc7IGorKykKKyAgICAgICAgICAgIGRbal0gPSBkW2ogKyAxXTsKKyAgICAgICAgZFs3XSA9IGF2aW9fcjgocGIpOworCisgICAgICAgIHNpemUgPSBkWzRdICsgKGRbNV0gPDwgOCkgKyAoZFs2XSA8PCAxNikgKyAoZFs3XSA8PCAyNCk7CisKKyAgICAgICAgbiA9IGdldF9zdHJlYW1faWR4KGQgKyAyKTsKKyAgICAgICAgYXZfZGxvZyhzLCAiJVggJVggJVggJVggJVggJVggJVggJVggJSJQUklkNjQiICV1ICVkXG4iLAorICAgICAgICAgICAgICAgIGRbMF0sIGRbMV0sIGRbMl0sIGRbM10sIGRbNF0sIGRbNV0sIGRbNl0sIGRbN10sIGksIHNpemUsIG4pOworICAgICAgICBpZiAoaSooYXZpLT5pb19mc2l6ZT4wKSArICh1aW50NjRfdClzaXplID4gYXZpLT5mc2l6ZSB8fCBkWzBdID4gMTI3KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gcGFyc2UgaXgjIworICAgICAgICBpZiAoKGRbMF0gPT0gJ2knICYmIGRbMV0gPT0gJ3gnICYmIG4gPCBzLT5uYl9zdHJlYW1zKSB8fAorICAgICAgICAgICAgLy8gcGFyc2UgSlVOSworICAgICAgICAgICAgKGRbMF0gPT0gJ0onICYmIGRbMV0gPT0gJ1UnICYmIGRbMl0gPT0gJ04nICYmIGRbM10gPT0gJ0snKSB8fAorICAgICAgICAgICAgKGRbMF0gPT0gJ2knICYmIGRbMV0gPT0gJ2QnICYmIGRbMl0gPT0gJ3gnICYmIGRbM10gPT0gJzEnKSkgeworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgICAgIGdvdG8gc3RhcnRfc3luYzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBhcnNlIHN0cmF5IExJU1QKKyAgICAgICAgaWYgKGRbMF0gPT0gJ0wnICYmIGRbMV0gPT0gJ0knICYmIGRbMl0gPT0gJ1MnICYmIGRbM10gPT0gJ1QnKSB7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDQpOworICAgICAgICAgICAgZ290byBzdGFydF9zeW5jOworICAgICAgICB9CisKKyAgICAgICAgbiA9IGdldF9zdHJlYW1faWR4KGQpOworCisgICAgICAgIGlmICghKChpIC0gYXZpLT5sYXN0X3BrdF9wb3MpICYgMSkgJiYKKyAgICAgICAgICAgIGdldF9zdHJlYW1faWR4KGQgKyAxKSA8IHMtPm5iX3N0cmVhbXMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBkZXRlY3QgIyNpeCBjaHVuayBhbmQgc2tpcAorICAgICAgICBpZiAoZFsyXSA9PSAnaScgJiYgZFszXSA9PSAneCcgJiYgbiA8IHMtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgICAgICBnb3RvIHN0YXJ0X3N5bmM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXZpLT5kdl9kZW11eCAmJiBuICE9IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBwYXJzZSAjI2RjLyMjd2IKKyAgICAgICAgaWYgKG4gPCBzLT5uYl9zdHJlYW1zKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3Q7CisgICAgICAgICAgICBBVklTdHJlYW0gKmFzdDsKKyAgICAgICAgICAgIHN0ICA9IHMtPnN0cmVhbXNbbl07CisgICAgICAgICAgICBhc3QgPSBzdC0+cHJpdl9kYXRhOworCisgICAgICAgICAgICBpZiAoIWFzdCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlNraXBwaW5nIGZvcmVpZ24gc3RyZWFtICVkIHBhY2tldFxuIiwgbik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5uYl9zdHJlYW1zID49IDIpIHsKKyAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QxICAgPSBzLT5zdHJlYW1zWzFdOworICAgICAgICAgICAgICAgIEFWSVN0cmVhbSAqYXN0MSA9IHN0MS0+cHJpdl9kYXRhOworICAgICAgICAgICAgICAgIC8vIHdvcmthcm91bmQgZm9yIGJyb2tlbiBzbWFsbC1maWxlLWJ1ZzQwMi5hdmkKKyAgICAgICAgICAgICAgICBpZiAoICAgZFsyXSA9PSAndycgJiYgZFszXSA9PSAnYicKKyAgICAgICAgICAgICAgICAgICAmJiBuID09IDAKKyAgICAgICAgICAgICAgICAgICAmJiBzdCAtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTworICAgICAgICAgICAgICAgICAgICYmIHN0MS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPCisgICAgICAgICAgICAgICAgICAgJiYgYXN0LT5wcmVmaXggPT0gJ2QnKjI1NisnYycKKyAgICAgICAgICAgICAgICAgICAmJiAoZFsyXSoyNTYrZFszXSA9PSBhc3QxLT5wcmVmaXggfHwgIWFzdDEtPnByZWZpeF9jb3VudCkKKyAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBuICAgPSAxOworICAgICAgICAgICAgICAgICAgICBzdCAgPSBzdDE7CisgICAgICAgICAgICAgICAgICAgIGFzdCA9IGFzdDE7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHN0cmVhbSArIHByZWZpeCBjb21iaW5hdGlvbiwgYXNzdW1pbmcgYXVkaW8uXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghYXZpLT5kdl9kZW11eCAmJgorICAgICAgICAgICAgICAgICgoc3QtPmRpc2NhcmQgPj0gQVZESVNDQVJEX0RFRkFVTFQgJiYgc2l6ZSA9PSAwKSAvKiB8fAorICAgICAgICAgICAgICAgICAvLyBGSVhNRTogbmVlZHMgYSBsaXR0bGUgcmVvcmRlcmluZworICAgICAgICAgICAgICAgICAoc3QtPmRpc2NhcmQgPj0gQVZESVNDQVJEX05PTktFWSAmJgorICAgICAgICAgICAgICAgICAhKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKSAqLworICAgICAgICAgICAgICAgIHx8IHN0LT5kaXNjYXJkID49IEFWRElTQ0FSRF9BTEwpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFleGl0X2Vhcmx5KSB7CisgICAgICAgICAgICAgICAgICAgIGFzdC0+ZnJhbWVfb2Zmc2V0ICs9IGdldF9kdXJhdGlvbihhc3QsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBnb3RvIHN0YXJ0X3N5bmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZFsyXSA9PSAncCcgJiYgZFszXSA9PSAnYycgJiYgc2l6ZSA8PSA0ICogMjU2ICsgNCkgeworICAgICAgICAgICAgICAgIGludCBrICAgID0gYXZpb19yOChwYik7CisgICAgICAgICAgICAgICAgaW50IGxhc3QgPSAoayArIGF2aW9fcjgocGIpIC0gMSkgJiAweEZGOworCisgICAgICAgICAgICAgICAgYXZpb19ybDE2KHBiKTsgLy8gZmxhZ3MKKworICAgICAgICAgICAgICAgIC8vIGIgKyAoZyA8PCA4KSArIChyIDw8IDE2KTsKKyAgICAgICAgICAgICAgICBmb3IgKDsgayA8PSBsYXN0OyBrKyspCisgICAgICAgICAgICAgICAgICAgIGFzdC0+cGFsW2tdID0gMHhGRlU8PDI0IHwgYXZpb19yYjMyKHBiKT4+ODsKKworICAgICAgICAgICAgICAgIGFzdC0+aGFzX3BhbCA9IDE7CisgICAgICAgICAgICAgICAgZ290byBzdGFydF9zeW5jOworICAgICAgICAgICAgfSBlbHNlIGlmICgoKGFzdC0+cHJlZml4X2NvdW50IDwgNSB8fCBzeW5jICsgOSA+IGkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkWzJdIDwgMTI4ICYmIGRbM10gPCAxMjgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGRbMl0gKiAyNTYgKyBkWzNdID09IGFzdC0+cHJlZml4IC8qIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChkWzJdID09ICdkJyAmJiBkWzNdID09ICdjJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKGRbMl0gPT0gJ3cnICYmIGRbM10gPT0gJ2InKSAqLykgeworICAgICAgICAgICAgICAgIGlmIChleGl0X2Vhcmx5KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBpZiAoZFsyXSAqIDI1NiArIGRbM10gPT0gYXN0LT5wcmVmaXgpCisgICAgICAgICAgICAgICAgICAgIGFzdC0+cHJlZml4X2NvdW50Kys7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzdC0+cHJlZml4ICAgICAgID0gZFsyXSAqIDI1NiArIGRbM107CisgICAgICAgICAgICAgICAgICAgIGFzdC0+cHJlZml4X2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdmktPnN0cmVhbV9pbmRleCA9IG47CisgICAgICAgICAgICAgICAgYXN0LT5wYWNrZXRfc2l6ZSAgPSBzaXplICsgODsKKyAgICAgICAgICAgICAgICBhc3QtPnJlbWFpbmluZyAgICA9IHNpemU7CisKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpIC0gODsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdC0+aW5kZXhfZW50cmllcyB8fCAhc3QtPm5iX2luZGV4X2VudHJpZXMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5pbmRleF9lbnRyaWVzW3N0LT5uYl9pbmRleF9lbnRyaWVzIC0gMV0ucG9zIDwgcG9zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIHBvcywgYXN0LT5mcmFtZV9vZmZzZXQsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGItPmVycm9yKQorICAgICAgICByZXR1cm4gcGItPmVycm9yOworICAgIHJldHVybiBBVkVSUk9SX0VPRjsKK30KKworc3RhdGljIGludCBhdmlfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWSUNvbnRleHQgKmF2aSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgZXJyOworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKKyAgICB2b2lkICpkc3RyOworI2VuZGlmCisKKyAgICBpZiAoQ09ORklHX0RWX0RFTVVYRVIgJiYgYXZpLT5kdl9kZW11eCkgeworICAgICAgICBpbnQgc2l6ZSA9IGF2cHJpdl9kdl9nZXRfcGFja2V0KGF2aS0+ZHZfZGVtdXgsIHBrdCk7CisgICAgICAgIGlmIChzaXplID49IDApCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ290byByZXN5bmM7CisgICAgfQorCisgICAgaWYgKGF2aS0+bm9uX2ludGVybGVhdmVkKSB7CisgICAgICAgIGludCBiZXN0X3N0cmVhbV9pbmRleCA9IDA7CisgICAgICAgIEFWU3RyZWFtICpiZXN0X3N0ICAgICA9IE5VTEw7CisgICAgICAgIEFWSVN0cmVhbSAqYmVzdF9hc3Q7CisgICAgICAgIGludDY0X3QgYmVzdF90cyA9IElOVDY0X01BWDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ICAgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgQVZJU3RyZWFtICphc3QgPSBzdC0+cHJpdl9kYXRhOworICAgICAgICAgICAgaW50NjRfdCB0cyAgICAgPSBhc3QtPmZyYW1lX29mZnNldDsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdF90czsKKworICAgICAgICAgICAgaWYgKCFzdC0+bmJfaW5kZXhfZW50cmllcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbGFzdF90cyA9IHN0LT5pbmRleF9lbnRyaWVzW3N0LT5uYl9pbmRleF9lbnRyaWVzIC0gMV0udGltZXN0YW1wOworICAgICAgICAgICAgaWYgKCFhc3QtPnJlbWFpbmluZyAmJiB0cyA+IGxhc3RfdHMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHRzID0gYXZfcmVzY2FsZV9xKHRzLCBzdC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgRkZNQVgoMSwgYXN0LT5zYW1wbGVfc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0UgfSk7CisKKyAgICAgICAgICAgIGF2X2Rsb2cocywgIiUiUFJJZDY0IiAlZC8lZCAlIlBSSWQ2NCJcbiIsIHRzLAorICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlLm51bSwgc3QtPnRpbWVfYmFzZS5kZW4sIGFzdC0+ZnJhbWVfb2Zmc2V0KTsKKyAgICAgICAgICAgIGlmICh0cyA8IGJlc3RfdHMpIHsKKyAgICAgICAgICAgICAgICBiZXN0X3RzICAgICAgICAgICA9IHRzOworICAgICAgICAgICAgICAgIGJlc3Rfc3QgICAgICAgICAgID0gc3Q7CisgICAgICAgICAgICAgICAgYmVzdF9zdHJlYW1faW5kZXggPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghYmVzdF9zdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgICAgICBiZXN0X2FzdCA9IGJlc3Rfc3QtPnByaXZfZGF0YTsKKyAgICAgICAgYmVzdF90cyAgPSBiZXN0X2FzdC0+ZnJhbWVfb2Zmc2V0OworICAgICAgICBpZiAoYmVzdF9hc3QtPnJlbWFpbmluZykgeworICAgICAgICAgICAgaSA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoYmVzdF9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlNFRUtfRkxBR19BTlkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTRUVLX0ZMQUdfQkFDS1dBUkQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaSA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoYmVzdF9zdCwgYmVzdF90cywgQVZTRUVLX0ZMQUdfQU5ZKTsKKyAgICAgICAgICAgIGlmIChpID49IDApCisgICAgICAgICAgICAgICAgYmVzdF9hc3QtPmZyYW1lX29mZnNldCA9IGJlc3Rfc3QtPmluZGV4X2VudHJpZXNbaV0udGltZXN0YW1wOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgaW50NjRfdCBwb3MgPSBiZXN0X3N0LT5pbmRleF9lbnRyaWVzW2ldLnBvczsKKyAgICAgICAgICAgIHBvcyArPSBiZXN0X2FzdC0+cGFja2V0X3NpemUgLSBiZXN0X2FzdC0+cmVtYWluaW5nOworICAgICAgICAgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgcG9zICsgOCwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgICAgICAgICBhdl9hc3NlcnQwKGJlc3RfYXN0LT5yZW1haW5pbmcgPD0gYmVzdF9hc3QtPnBhY2tldF9zaXplKTsKKworICAgICAgICAgICAgYXZpLT5zdHJlYW1faW5kZXggPSBiZXN0X3N0cmVhbV9pbmRleDsKKyAgICAgICAgICAgIGlmICghYmVzdF9hc3QtPnJlbWFpbmluZykKKyAgICAgICAgICAgICAgICBiZXN0X2FzdC0+cGFja2V0X3NpemUgPQorICAgICAgICAgICAgICAgIGJlc3RfYXN0LT5yZW1haW5pbmcgICA9IGJlc3Rfc3QtPmluZGV4X2VudHJpZXNbaV0uc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0KKworcmVzeW5jOgorICAgIGlmIChhdmktPnN0cmVhbV9pbmRleCA+PSAwKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCAgID0gcy0+c3RyZWFtc1thdmktPnN0cmVhbV9pbmRleF07CisgICAgICAgIEFWSVN0cmVhbSAqYXN0ID0gc3QtPnByaXZfZGF0YTsKKyAgICAgICAgaW50IHNpemUsIGVycjsKKworICAgICAgICBpZiAoZ2V0X3N1YnRpdGxlX3BrdChzLCBzdCwgcGt0KSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIC8vIG1pbm9yaXR5cmVwb3J0LkFWSSBibG9ja19hbGlnbj0xMDI0IHNhbXBsZV9zaXplPTEgSU1BLUFEUENNCisgICAgICAgIGlmIChhc3QtPnNhbXBsZV9zaXplIDw9IDEpCisgICAgICAgICAgICBzaXplID0gSU5UX01BWDsKKyAgICAgICAgZWxzZSBpZiAoYXN0LT5zYW1wbGVfc2l6ZSA8IDMyKQorICAgICAgICAgICAgLy8gYXJiaXRyYXJ5IG11bHRpcGxpZXIgdG8gYXZvaWQgdGlueSBwYWNrZXRzIGZvciByYXcgUENNIGRhdGEKKyAgICAgICAgICAgIHNpemUgPSAxMDI0ICogYXN0LT5zYW1wbGVfc2l6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2l6ZSA9IGFzdC0+c2FtcGxlX3NpemU7CisKKyAgICAgICAgaWYgKHNpemUgPiBhc3QtPnJlbWFpbmluZykKKyAgICAgICAgICAgIHNpemUgPSBhc3QtPnJlbWFpbmluZzsKKyAgICAgICAgYXZpLT5sYXN0X3BrdF9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBlcnIgICAgICAgICAgICAgICA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgc2l6ZSk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgc2l6ZSA9IGVycjsKKworICAgICAgICBpZiAoYXN0LT5oYXNfcGFsICYmIHBrdC0+c2l6ZSA8ICh1bnNpZ25lZClJTlRfTUFYIC8gMikgeworICAgICAgICAgICAgdWludDhfdCAqcGFsOworICAgICAgICAgICAgcGFsID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfUEFMRVRURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgIGlmICghcGFsKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBkYXRhIGZvciBwYWxldHRlXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBhbCwgYXN0LT5wYWwsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgICAgICBhc3QtPmhhc19wYWwgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKENPTkZJR19EVl9ERU1VWEVSICYmIGF2aS0+ZHZfZGVtdXgpIHsKKyAgICAgICAgICAgIEFWQnVmZmVyUmVmICphdmJ1ZiA9IHBrdC0+YnVmOworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgICAgIGRzdHIgPSBwa3QtPmRlc3RydWN0OworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICAgICAgICAgIHNpemUgPSBhdnByaXZfZHZfcHJvZHVjZV9wYWNrZXQoYXZpLT5kdl9kZW11eCwgcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwgcGt0LT5wb3MpOworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgICAgIHBrdC0+ZGVzdHJ1Y3QgPSBkc3RyOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICAgICAgICAgIHBrdC0+YnVmICAgID0gYXZidWY7CisgICAgICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUgJiYKKyAgICAgICAgICAgICAgICAgICAhc3QtPmNvZGVjLT5jb2RlY190YWcgJiYgcmVhZF9nYWIyX3N1YihzLCBzdCwgcGt0KSkgeworICAgICAgICAgICAgYXN0LT5mcmFtZV9vZmZzZXQrKzsKKyAgICAgICAgICAgIGF2aS0+c3RyZWFtX2luZGV4ID0gLTE7CisgICAgICAgICAgICBhc3QtPnJlbWFpbmluZyAgICA9IDA7CisgICAgICAgICAgICBnb3RvIHJlc3luYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFhYWDogSG93IHRvIGhhbmRsZSBCLWZyYW1lcyBpbiBBVkk/ICovCisgICAgICAgICAgICBwa3QtPmR0cyA9IGFzdC0+ZnJhbWVfb2Zmc2V0OworLy8gICAgICAgICAgICAgICAgcGt0LT5kdHMgKz0gYXN0LT5zdGFydDsKKyAgICAgICAgICAgIGlmIChhc3QtPnNhbXBsZV9zaXplKQorICAgICAgICAgICAgICAgIHBrdC0+ZHRzIC89IGFzdC0+c2FtcGxlX3NpemU7CisgICAgICAgICAgICBhdl9kbG9nKHMsCisgICAgICAgICAgICAgICAgICAgICJkdHM6JSJQUklkNjQiIG9mZnNldDolIlBSSWQ2NCIgJWQvJWQgc21wbF9zaXo6JWQgIgorICAgICAgICAgICAgICAgICAgICAiYmFzZTolZCBzdDolZCBzaXplOiVkXG4iLAorICAgICAgICAgICAgICAgICAgICBwa3QtPmR0cywKKyAgICAgICAgICAgICAgICAgICAgYXN0LT5mcmFtZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGFzdC0+c2NhbGUsCisgICAgICAgICAgICAgICAgICAgIGFzdC0+cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgYXN0LT5zYW1wbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFLAorICAgICAgICAgICAgICAgICAgICBhdmktPnN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGF2aS0+c3RyZWFtX2luZGV4OworCisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBzdC0+aW5kZXhfZW50cmllcykgeworICAgICAgICAgICAgICAgIEFWSW5kZXhFbnRyeSAqZTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXg7CisKKyAgICAgICAgICAgICAgICBpbmRleCA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QsIGFzdC0+ZnJhbWVfb2Zmc2V0LCBBVlNFRUtfRkxBR19BTlkpOworICAgICAgICAgICAgICAgIGUgICAgID0gJnN0LT5pbmRleF9lbnRyaWVzW2luZGV4XTsKKworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGUtPnRpbWVzdGFtcCA9PSBhc3QtPmZyYW1lX29mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gc3QtPm5iX2luZGV4X2VudHJpZXMtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleT0xOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGF0ZT0tMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPEZGTUlOKHNpemUsMjU2KTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IDB4MUI2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9ICEocGt0LT5kYXRhW2ldJjB4QzApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZT0gKHN0YXRlPDw4KSArIHBrdC0+ZGF0YVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPmZsYWdzICY9IH5BVklOREVYX0tFWUZSQU1FOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChlLT5mbGFncyAmIEFWSU5ERVhfS0VZRlJBTUUpCisgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXN0LT5mcmFtZV9vZmZzZXQgKz0gZ2V0X2R1cmF0aW9uKGFzdCwgcGt0LT5zaXplKTsKKyAgICAgICAgfQorICAgICAgICBhc3QtPnJlbWFpbmluZyAtPSBlcnI7CisgICAgICAgIGlmICghYXN0LT5yZW1haW5pbmcpIHsKKyAgICAgICAgICAgIGF2aS0+c3RyZWFtX2luZGV4ID0gLTE7CisgICAgICAgICAgICBhc3QtPnBhY2tldF9zaXplICA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWF2aS0+bm9uX2ludGVybGVhdmVkICYmIHBrdC0+cG9zID49IDAgJiYgYXN0LT5zZWVrX3BvcyA+IHBrdC0+cG9zKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgZ290byByZXN5bmM7CisgICAgICAgIH0KKyAgICAgICAgYXN0LT5zZWVrX3Bvcz0gMDsKKworICAgICAgICBpZiAoIWF2aS0+bm9uX2ludGVybGVhdmVkICYmIHN0LT5uYl9pbmRleF9lbnRyaWVzPjEgJiYgYXZpLT5pbmRleF9sb2FkZWQ+MSkgeworICAgICAgICAgICAgaW50NjRfdCBkdHM9IGF2X3Jlc2NhbGVfcShwa3QtPmR0cywgc3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOworCisgICAgICAgICAgICBpZiAoYXZpLT5kdHNfbWF4IC0gZHRzID4gMipBVl9USU1FX0JBU0UpIHsKKyAgICAgICAgICAgICAgICBhdmktPm5vbl9pbnRlcmxlYXZlZD0gMTsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJTd2l0Y2hpbmcgdG8gTkkgbW9kZSwgZHVlIHRvIHBvb3IgaW50ZXJsZWF2aW5nXG4iKTsKKyAgICAgICAgICAgIH1lbHNlIGlmIChhdmktPmR0c19tYXggPCBkdHMpCisgICAgICAgICAgICAgICAgYXZpLT5kdHNfbWF4ID0gZHRzOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBhdmlfc3luYyhzLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGdvdG8gcmVzeW5jOworfQorCisvKiBYWFg6IFdlIG1ha2UgdGhlIGltcGxpY2l0IHN1cHBvc2l0aW9uIHRoYXQgdGhlIHBvc2l0aW9ucyBhcmUgc29ydGVkCisgKiBmb3IgZWFjaCBzdHJlYW0uICovCitzdGF0aWMgaW50IGF2aV9yZWFkX2lkeDEoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc2l6ZSkKK3sKKyAgICBBVklDb250ZXh0ICphdmkgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IG5iX2luZGV4X2VudHJpZXMsIGk7CisgICAgQVZTdHJlYW0gKnN0OworICAgIEFWSVN0cmVhbSAqYXN0OworICAgIHVuc2lnbmVkIGludCBpbmRleCwgdGFnLCBmbGFncywgcG9zLCBsZW4sIGZpcnN0X3BhY2tldCA9IDE7CisgICAgdW5zaWduZWQgbGFzdF9wb3MgPSAtMTsKKyAgICB1bnNpZ25lZCBsYXN0X2lkeCA9IC0xOworICAgIGludDY0X3QgaWR4MV9wb3MsIGZpcnN0X3BhY2tldF9wb3MgPSAwLCBkYXRhX29mZnNldCA9IDA7CisgICAgaW50IGFueWtleSA9IDA7CisKKyAgICBuYl9pbmRleF9lbnRyaWVzID0gc2l6ZSAvIDE2OworICAgIGlmIChuYl9pbmRleF9lbnRyaWVzIDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWR4MV9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fc2VlayhwYiwgYXZpLT5tb3ZpX2xpc3QgKyA0LCBTRUVLX1NFVCk7CisgICAgaWYgKGF2aV9zeW5jKHMsIDEpID09IDApCisgICAgICAgIGZpcnN0X3BhY2tldF9wb3MgPSBhdmlvX3RlbGwocGIpIC0gODsKKyAgICBhdmktPnN0cmVhbV9pbmRleCA9IC0xOworICAgIGF2aW9fc2VlayhwYiwgaWR4MV9wb3MsIFNFRUtfU0VUKTsKKworICAgIGlmIChzLT5uYl9zdHJlYW1zID09IDEgJiYgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJNTUVTIikpIHsKKyAgICAgICAgZmlyc3RfcGFja2V0X3BvcyA9IDA7CisgICAgICAgIGRhdGFfb2Zmc2V0ID0gYXZpLT5tb3ZpX2xpc3Q7CisgICAgfQorCisgICAgLyogUmVhZCB0aGUgZW50cmllcyBhbmQgc29ydCB0aGVtIGluIGVhY2ggc3RyZWFtIGNvbXBvbmVudC4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfaW5kZXhfZW50cmllczsgaSsrKSB7CisgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIHRhZyAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgZmxhZ3MgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBwb3MgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGxlbiAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgYXZfZGxvZyhzLCAiJWQ6IHRhZz0weCV4IGZsYWdzPTB4JXggcG9zPTB4JXggbGVuPSVkLyIsCisgICAgICAgICAgICAgICAgaSwgdGFnLCBmbGFncywgcG9zLCBsZW4pOworCisgICAgICAgIGluZGV4ICA9ICgodGFnICAgICAgJiAweGZmKSAtICcwJykgKiAxMDsKKyAgICAgICAgaW5kZXggKz0gICh0YWcgPj4gOCAmIDB4ZmYpIC0gJzAnOworICAgICAgICBpZiAoaW5kZXggPj0gcy0+bmJfc3RyZWFtcykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBzdCAgPSBzLT5zdHJlYW1zW2luZGV4XTsKKyAgICAgICAgYXN0ID0gc3QtPnByaXZfZGF0YTsKKworICAgICAgICBpZiAoZmlyc3RfcGFja2V0ICYmIGZpcnN0X3BhY2tldF9wb3MpIHsKKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICA9IGZpcnN0X3BhY2tldF9wb3MgLSBwb3M7CisgICAgICAgICAgICBmaXJzdF9wYWNrZXQgPSAwOworICAgICAgICB9CisgICAgICAgIHBvcyArPSBkYXRhX29mZnNldDsKKworICAgICAgICBhdl9kbG9nKHMsICIlZCBjdW1fbGVuPSUiUFJJZDY0IlxuIiwgbGVuLCBhc3QtPmN1bV9sZW4pOworCisgICAgICAgIC8vIGV2ZW4gaWYgd2UgaGF2ZSBvbmx5IGEgc2luZ2xlIHN0cmVhbSwgd2Ugc2hvdWxkCisgICAgICAgIC8vIHN3aXRjaCB0byBub24taW50ZXJsZWF2ZWQgdG8gZ2V0IGNvcnJlY3QgdGltZXN0YW1wcworICAgICAgICBpZiAobGFzdF9wb3MgPT0gcG9zKQorICAgICAgICAgICAgYXZpLT5ub25faW50ZXJsZWF2ZWQgPSAxOworICAgICAgICBpZiAobGFzdF9pZHggIT0gcG9zICYmIGxlbikgeworICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LCBwb3MsIGFzdC0+Y3VtX2xlbiwgbGVuLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFWSUlGX0lOREVYKSA/IEFWSU5ERVhfS0VZRlJBTUUgOiAwKTsKKyAgICAgICAgICAgIGxhc3RfaWR4PSBwb3M7CisgICAgICAgIH0KKyAgICAgICAgYXN0LT5jdW1fbGVuICs9IGdldF9kdXJhdGlvbihhc3QsIGxlbik7CisgICAgICAgIGxhc3RfcG9zICAgICAgPSBwb3M7CisgICAgICAgIGFueWtleSAgICAgICB8PSBmbGFncyZBVklJRl9JTkRFWDsKKyAgICB9CisgICAgaWYgKCFhbnlrZXkpIHsKKyAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcy0+bmJfc3RyZWFtczsgaW5kZXgrKykgeworICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2luZGV4XTsKKyAgICAgICAgICAgIGlmIChzdC0+bmJfaW5kZXhfZW50cmllcykKKyAgICAgICAgICAgICAgICBzdC0+aW5kZXhfZW50cmllc1swXS5mbGFncyB8PSBBVklOREVYX0tFWUZSQU1FOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBTY2FuIHRoZSBpbmRleCBhbmQgY29uc2lkZXIgYW55IGZpbGUgd2l0aCBzdHJlYW1zIG1vcmUgdGhhbgorICogMiBzZWNvbmRzIG9yIDY0TUIgYXBhcnQgbm9uLWludGVybGVhdmVkLiAqLworc3RhdGljIGludCBjaGVja19zdHJlYW1fbWF4X2RyaWZ0KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQ2NF90IG1pbl9wb3MsIHBvczsKKyAgICBpbnQgaTsKKyAgICBpbnQgKmlkeCA9IGF2X21hbGxvY3pfYXJyYXkocy0+bmJfc3RyZWFtcywgc2l6ZW9mKCppZHgpKTsKKyAgICBpZiAoIWlkeCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IgKG1pbl9wb3MgPSBwb3MgPSAwOyBtaW5fcG9zICE9IElOVDY0X01BWDsgcG9zID0gbWluX3BvcyArIDFMVSkgeworICAgICAgICBpbnQ2NF90IG1heF9kdHMgPSBJTlQ2NF9NSU4gLyAyOworICAgICAgICBpbnQ2NF90IG1pbl9kdHMgPSBJTlQ2NF9NQVggLyAyOworICAgICAgICBpbnQ2NF90IG1heF9idWZmZXIgPSAwOworCisgICAgICAgIG1pbl9wb3MgPSBJTlQ2NF9NQVg7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIEFWSVN0cmVhbSAqYXN0ID0gc3QtPnByaXZfZGF0YTsKKyAgICAgICAgICAgIGludCBuID0gc3QtPm5iX2luZGV4X2VudHJpZXM7CisgICAgICAgICAgICB3aGlsZSAoaWR4W2ldIDwgbiAmJiBzdC0+aW5kZXhfZW50cmllc1tpZHhbaV1dLnBvcyA8IHBvcykKKyAgICAgICAgICAgICAgICBpZHhbaV0rKzsKKyAgICAgICAgICAgIGlmIChpZHhbaV0gPCBuKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBkdHM7CisgICAgICAgICAgICAgICAgZHRzID0gYXZfcmVzY2FsZV9xKHN0LT5pbmRleF9lbnRyaWVzW2lkeFtpXV0udGltZXN0YW1wIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNQVgoYXN0LT5zYW1wbGVfc2l6ZSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgICAgICAgICBtaW5fZHRzID0gRkZNSU4obWluX2R0cywgZHRzKTsKKyAgICAgICAgICAgICAgICBtaW5fcG9zID0gRkZNSU4obWluX3Bvcywgc3QtPmluZGV4X2VudHJpZXNbaWR4W2ldXS5wb3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBBVklTdHJlYW0gKmFzdCA9IHN0LT5wcml2X2RhdGE7CisKKyAgICAgICAgICAgIGlmIChpZHhbaV0gJiYgbWluX2R0cyAhPSBJTlQ2NF9NQVggLyAyKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBkdHM7CisgICAgICAgICAgICAgICAgZHRzID0gYXZfcmVzY2FsZV9xKHN0LT5pbmRleF9lbnRyaWVzW2lkeFtpXSAtIDFdLnRpbWVzdGFtcCAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUFYKGFzdC0+c2FtcGxlX3NpemUsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgICAgICAgICAgbWF4X2R0cyA9IEZGTUFYKG1heF9kdHMsIGR0cyk7CisgICAgICAgICAgICAgICAgbWF4X2J1ZmZlciA9IEZGTUFYKG1heF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGUoZHRzIC0gbWluX2R0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtYXhfZHRzIC0gbWluX2R0cyA+IDIgKiBBVl9USU1FX0JBU0UgfHwKKyAgICAgICAgICAgIG1heF9idWZmZXIgPiAxMDI0ICogMTAyNCAqIDggKiA4KSB7CisgICAgICAgICAgICBhdl9mcmVlKGlkeCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9mcmVlKGlkeCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Vlc3NfbmlfZmxhZyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisgICAgaW50NjRfdCBsYXN0X3N0YXJ0ID0gMDsKKyAgICBpbnQ2NF90IGZpcnN0X2VuZCAgPSBJTlQ2NF9NQVg7CisgICAgaW50NjRfdCBvbGRwb3MgICAgID0gYXZpb190ZWxsKHMtPnBiKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaW50IG4gICAgICAgID0gc3QtPm5iX2luZGV4X2VudHJpZXM7CisgICAgICAgIHVuc2lnbmVkIGludCBzaXplOworCisgICAgICAgIGlmIChuIDw9IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAobiA+PSAyKSB7CisgICAgICAgICAgICBpbnQ2NF90IHBvcyA9IHN0LT5pbmRleF9lbnRyaWVzWzBdLnBvczsKKyAgICAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgcG9zICsgNCwgU0VFS19TRVQpOworICAgICAgICAgICAgc2l6ZSA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgICAgICBpZiAocG9zICsgc2l6ZSA+IHN0LT5pbmRleF9lbnRyaWVzWzFdLnBvcykKKyAgICAgICAgICAgICAgICBsYXN0X3N0YXJ0ID0gSU5UNjRfTUFYOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0LT5pbmRleF9lbnRyaWVzWzBdLnBvcyA+IGxhc3Rfc3RhcnQpCisgICAgICAgICAgICBsYXN0X3N0YXJ0ID0gc3QtPmluZGV4X2VudHJpZXNbMF0ucG9zOworICAgICAgICBpZiAoc3QtPmluZGV4X2VudHJpZXNbbiAtIDFdLnBvcyA8IGZpcnN0X2VuZCkKKyAgICAgICAgICAgIGZpcnN0X2VuZCA9IHN0LT5pbmRleF9lbnRyaWVzW24gLSAxXS5wb3M7CisgICAgfQorICAgIGF2aW9fc2VlayhzLT5wYiwgb2xkcG9zLCBTRUVLX1NFVCk7CisKKyAgICBpZiAobGFzdF9zdGFydCA+IGZpcnN0X2VuZCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gY2hlY2tfc3RyZWFtX21heF9kcmlmdChzKTsKK30KKworc3RhdGljIGludCBhdmlfbG9hZF9pbmRleChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJQ29udGV4dCAqYXZpID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVpbnQzMl90IHRhZywgc2l6ZTsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgaW50NjRfdCBuZXh0OworICAgIGludCByZXQgICAgID0gLTE7CisKKyAgICBpZiAoYXZpb19zZWVrKHBiLCBhdmktPm1vdmlfZW5kLCBTRUVLX1NFVCkgPCAwKQorICAgICAgICBnb3RvIHRoZV9lbmQ7IC8vIG1heWJlIHRydW5jYXRlZCBmaWxlCisgICAgYXZfZGxvZyhzLCAibW92aV9lbmQ9MHglIlBSSXg2NCJcbiIsIGF2aS0+bW92aV9lbmQpOworICAgIGZvciAoOzspIHsKKyAgICAgICAgdGFnICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIHNpemUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuZXh0ID0gYXZpb190ZWxsKHBiKSArIHNpemUgKyAoc2l6ZSAmIDEpOworCisgICAgICAgIGF2X2Rsb2cocywgInRhZz0lYyVjJWMlYyBzaXplPTB4JXhcbiIsCisgICAgICAgICAgICAgICAgIHRhZyAgICAgICAgJiAweGZmLAorICAgICAgICAgICAgICAgICh0YWcgPj4gIDgpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAodGFnID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgKHRhZyA+PiAyNCkgJiAweGZmLAorICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgICAgIGlmICh0YWcgPT0gTUtUQUcoJ2knLCAnZCcsICd4JywgJzEnKSAmJgorICAgICAgICAgICAgYXZpX3JlYWRfaWR4MShzLCBzaXplKSA+PSAwKSB7CisgICAgICAgICAgICBhdmktPmluZGV4X2xvYWRlZD0yOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgfWVsc2UgaWYgKHRhZyA9PSBNS1RBRygnTCcsICdJJywgJ1MnLCAnVCcpKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0YWcxID0gYXZpb19ybDMyKHBiKTsKKworICAgICAgICAgICAgaWYgKHRhZzEgPT0gTUtUQUcoJ0knLCAnTicsICdGJywgJ08nKSkKKyAgICAgICAgICAgICAgICBmZl9yZWFkX3JpZmZfaW5mbyhzLCBzaXplIC0gNCk7CisgICAgICAgIH1lbHNlIGlmICghcmV0KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGF2aW9fc2VlayhwYiwgbmV4dCwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOyAvLyBzb21ldGhpbmcgaXMgd3JvbmcgaGVyZQorICAgIH0KKwordGhlX2VuZDoKKyAgICBhdmlvX3NlZWsocGIsIHBvcywgU0VFS19TRVQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNlZWtfc3VidGl0bGUoQVZTdHJlYW0gKnN0LCBBVlN0cmVhbSAqc3QyLCBpbnQ2NF90IHRpbWVzdGFtcCkKK3sKKyAgICBBVklTdHJlYW0gKmFzdDIgPSBzdDItPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IHRzMiAgICAgPSBhdl9yZXNjYWxlX3EodGltZXN0YW1wLCBzdC0+dGltZV9iYXNlLCBzdDItPnRpbWVfYmFzZSk7CisgICAgYXZfZnJlZV9wYWNrZXQoJmFzdDItPnN1Yl9wa3QpOworICAgIGlmIChhdmZvcm1hdF9zZWVrX2ZpbGUoYXN0Mi0+c3ViX2N0eCwgMCwgSU5UNjRfTUlOLCB0czIsIHRzMiwgMCkgPj0gMCB8fAorICAgICAgICBhdmZvcm1hdF9zZWVrX2ZpbGUoYXN0Mi0+c3ViX2N0eCwgMCwgdHMyLCB0czIsIElOVDY0X01BWCwgMCkgPj0gMCkKKyAgICAgICAgZmZfcmVhZF9wYWNrZXQoYXN0Mi0+c3ViX2N0eCwgJmFzdDItPnN1Yl9wa3QpOworfQorCitzdGF0aWMgaW50IGF2aV9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgQVZJQ29udGV4dCAqYXZpID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgaSwgaW5kZXg7CisgICAgaW50NjRfdCBwb3MsIHBvc19taW47CisgICAgQVZJU3RyZWFtICphc3Q7CisKKyAgICAvKiBEb2VzIG5vdCBtYXR0ZXIgd2hpY2ggc3RyZWFtIGlzIHJlcXVlc3RlZCBkdiBpbiBhdmkgaGFzIHRoZQorICAgICAqIHN0cmVhbSBpbmZvcm1hdGlvbiBpbiB0aGUgZmlyc3QgdmlkZW8gc3RyZWFtLgorICAgICAqLworICAgIGlmIChhdmktPmR2X2RlbXV4KQorICAgICAgICBzdHJlYW1faW5kZXggPSAwOworCisgICAgaWYgKCFhdmktPmluZGV4X2xvYWRlZCkgeworICAgICAgICAvKiB3ZSBvbmx5IGxvYWQgdGhlIGluZGV4IG9uIGRlbWFuZCAqLworICAgICAgICBhdmlfbG9hZF9pbmRleChzKTsKKyAgICAgICAgYXZpLT5pbmRleF9sb2FkZWQgfD0gMTsKKyAgICB9CisgICAgYXZfYXNzZXJ0MChzdHJlYW1faW5kZXggPj0gMCk7CisKKyAgICBzdCAgICA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKKyAgICBhc3QgICA9IHN0LT5wcml2X2RhdGE7CisgICAgaW5kZXggPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgKiBGRk1BWChhc3QtPnNhbXBsZV9zaXplLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgaWYgKHN0LT5uYl9pbmRleF9lbnRyaWVzID4gMCkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJGYWlsZWQgdG8gZmluZCB0aW1lc3RhbXAgJSJQUklkNjQgIiBpbiBpbmRleCAlIlBSSWQ2NCAiIC4uICUiUFJJZDY0ICJcbiIsCisgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wICogRkZNQVgoYXN0LT5zYW1wbGVfc2l6ZSwgMSksCisgICAgICAgICAgICAgICAgICAgc3QtPmluZGV4X2VudHJpZXNbMF0udGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgIHN0LT5pbmRleF9lbnRyaWVzW3N0LT5uYl9pbmRleF9lbnRyaWVzIC0gMV0udGltZXN0YW1wKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogZmluZCB0aGUgcG9zaXRpb24gKi8KKyAgICBwb3MgICAgICAgPSBzdC0+aW5kZXhfZW50cmllc1tpbmRleF0ucG9zOworICAgIHRpbWVzdGFtcCA9IHN0LT5pbmRleF9lbnRyaWVzW2luZGV4XS50aW1lc3RhbXAgLyBGRk1BWChhc3QtPnNhbXBsZV9zaXplLCAxKTsKKworICAgIGF2X2Rsb2cocywgIlhYICUiUFJJZDY0IiAlZCAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICB0aW1lc3RhbXAsIGluZGV4LCBzdC0+aW5kZXhfZW50cmllc1tpbmRleF0udGltZXN0YW1wKTsKKworICAgIGlmIChDT05GSUdfRFZfREVNVVhFUiAmJiBhdmktPmR2X2RlbXV4KSB7CisgICAgICAgIC8qIE9uZSBhbmQgb25seSBvbmUgcmVhbCBzdHJlYW0gZm9yIERWIGluIEFWSSwgYW5kIGl0IGhhcyB2aWRlbyAgKi8KKyAgICAgICAgLyogb2Zmc2V0cy4gQ2FsbGluZyB3aXRoIG90aGVyIHN0cmVhbSBpbmRleGVzIHNob3VsZCBoYXZlIGZhaWxlZCAqLworICAgICAgICAvKiB0aGUgYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcCBjYWxsIGFib3ZlLiAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIC8qIEZlZWQgdGhlIERWIHZpZGVvIHN0cmVhbSB2ZXJzaW9uIG9mIHRoZSB0aW1lc3RhbXAgdG8gdGhlICovCisgICAgICAgIC8qIERWIGRlbXV4IHNvIGl0IGNhbiBzeW50aGVzaXplIGNvcnJlY3QgdGltZXN0YW1wcy4gICAgICAgICovCisgICAgICAgIGZmX2R2X29mZnNldF9yZXNldChhdmktPmR2X2RlbXV4LCB0aW1lc3RhbXApOworCisgICAgICAgIGF2aS0+c3RyZWFtX2luZGV4ID0gLTE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHBvc19taW4gPSBwb3M7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QyICAgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBBVklTdHJlYW0gKmFzdDIgPSBzdDItPnByaXZfZGF0YTsKKworICAgICAgICBhc3QyLT5wYWNrZXRfc2l6ZSA9CisgICAgICAgIGFzdDItPnJlbWFpbmluZyAgID0gMDsKKworICAgICAgICBpZiAoYXN0Mi0+c3ViX2N0eCkgeworICAgICAgICAgICAgc2Vla19zdWJ0aXRsZShzdCwgc3QyLCB0aW1lc3RhbXApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3QyLT5uYl9pbmRleF9lbnRyaWVzIDw9IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworLy8gICAgICAgIGF2X2Fzc2VydDEoc3QyLT5jb2RlYy0+YmxvY2tfYWxpZ24pOworICAgICAgICBhdl9hc3NlcnQwKGZhYnMoYXZfcTJkKHN0Mi0+dGltZV9iYXNlKSAtIGFzdDItPnNjYWxlIC8gKGRvdWJsZSlhc3QyLT5yYXRlKSA8IGF2X3EyZChzdDItPnRpbWVfYmFzZSkgKiAwLjAwMDAwMDAxKTsKKyAgICAgICAgaW5kZXggPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcSh0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdDItPnRpbWVfYmFzZSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNQVgoYXN0Mi0+c2FtcGxlX3NpemUsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTRUVLX0ZMQUdfQkFDS1dBUkQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0Mi0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPID8gQVZTRUVLX0ZMQUdfQU5ZIDogMCkpOworICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICBhc3QyLT5zZWVrX3BvcyA9IHN0Mi0+aW5kZXhfZW50cmllc1tpbmRleF0ucG9zOworICAgICAgICBwb3NfbWluID0gRkZNSU4ocG9zX21pbixhc3QyLT5zZWVrX3Bvcyk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0MiA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIEFWSVN0cmVhbSAqYXN0MiA9IHN0Mi0+cHJpdl9kYXRhOworCisgICAgICAgIGlmIChhc3QyLT5zdWJfY3R4IHx8IHN0Mi0+bmJfaW5kZXhfZW50cmllcyA8PSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaW5kZXggPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKAorICAgICAgICAgICAgICAgIHN0MiwKKyAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3EodGltZXN0YW1wLCBzdC0+dGltZV9iYXNlLCBzdDItPnRpbWVfYmFzZSkgKiBGRk1BWChhc3QyLT5zYW1wbGVfc2l6ZSwgMSksCisgICAgICAgICAgICAgICAgZmxhZ3MgfCBBVlNFRUtfRkxBR19CQUNLV0FSRCB8IChzdDItPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyA/IEFWU0VFS19GTEFHX0FOWSA6IDApKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgd2hpbGUgKCFhdmktPm5vbl9pbnRlcmxlYXZlZCAmJiBpbmRleD4wICYmIHN0Mi0+aW5kZXhfZW50cmllc1tpbmRleC0xXS5wb3MgPj0gcG9zX21pbikKKyAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgIGFzdDItPmZyYW1lX29mZnNldCA9IHN0Mi0+aW5kZXhfZW50cmllc1tpbmRleF0udGltZXN0YW1wOworICAgIH0KKworICAgIC8qIGRvIHRoZSBzZWVrICovCisgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgcG9zX21pbiwgU0VFS19TRVQpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU2VlayBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGF2aS0+c3RyZWFtX2luZGV4ID0gLTE7CisgICAgYXZpLT5kdHNfbWF4ICAgICAgPSBJTlRfTUlOOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF2aV9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBBVklDb250ZXh0ICphdmkgPSBzLT5wcml2X2RhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCAgID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgQVZJU3RyZWFtICphc3QgPSBzdC0+cHJpdl9kYXRhOworICAgICAgICBpZiAoYXN0KSB7CisgICAgICAgICAgICBpZiAoYXN0LT5zdWJfY3R4KSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmFzdC0+c3ViX2N0eC0+cGIpOworICAgICAgICAgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZhc3QtPnN1Yl9jdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZnJlZShhc3QtPnN1Yl9idWZmZXIpOworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQoJmFzdC0+c3ViX3BrdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9mcmVlKGF2aS0+ZHZfZGVtdXgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXZpX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGludCBpOworCisgICAgLyogY2hlY2sgZmlsZSBoZWFkZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBhdmlfaGVhZGVyc1tpXVswXTsgaSsrKQorICAgICAgICBpZiAoIW1lbWNtcChwLT5idWYsICAgICBhdmlfaGVhZGVyc1tpXSwgICAgIDQpICYmCisgICAgICAgICAgICAhbWVtY21wKHAtPmJ1ZiArIDgsIGF2aV9oZWFkZXJzW2ldICsgNCwgNCkpCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9hdmlfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXZpIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVZJIChBdWRpbyBWaWRlbyBJbnRlcmxlYXZlZCkiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVZJQ29udGV4dCksCisgICAgLmV4dGVuc2lvbnMgICAgID0gImF2aSIsCisgICAgLnJlYWRfcHJvYmUgICAgID0gYXZpX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGF2aV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBhdmlfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gYXZpX3JlYWRfY2xvc2UsCisgICAgLnJlYWRfc2VlayAgICAgID0gYXZpX3JlYWRfc2VlaywKKyAgICAucHJpdl9jbGFzcyA9ICZkZW11eGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmllbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmllbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDRjMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2aWVuYy5jCkBAIC0wLDAgKzEsNzU0IEBACisvKgorICogQVZJIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8vI2RlZmluZSBERUJVRworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2aS5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyaWZmLmgiCisjaW5jbHVkZSAibXBlZ3RzLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZsYW5ndWFnZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lc3RhbXAuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvcmF3LmgiCisKKy8qCisgKiBUT0RPOgorICogIC0gZmlsbCBhbGwgZmllbGRzIGlmIG5vbiBzdHJlYW1lZCAobmJfZnJhbWVzIGZvciBleGFtcGxlKQorICovCisKK3R5cGVkZWYgc3RydWN0IEFWSUllbnRyeSB7CisgICAgdW5zaWduZWQgaW50IGZsYWdzLCBwb3MsIGxlbjsKK30gQVZJSWVudHJ5OworCisjZGVmaW5lIEFWSV9JTkRFWF9DTFVTVEVSX1NJWkUgMTYzODQKKwordHlwZWRlZiBzdHJ1Y3QgQVZJSW5kZXggeworICAgIGludDY0X3QgICAgIGluZHhfc3RhcnQ7CisgICAgaW50ICAgICAgICAgZW50cnk7CisgICAgaW50ICAgICAgICAgZW50c19hbGxvY2F0ZWQ7CisgICAgQVZJSWVudHJ5KiogY2x1c3RlcjsKK30gQVZJSW5kZXg7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQ2NF90IHJpZmZfc3RhcnQsIG1vdmlfbGlzdCwgb2RtbF9saXN0OworICAgIGludDY0X3QgZnJhbWVzX2hkcl9hbGw7CisgICAgaW50IHJpZmZfaWQ7Cit9IEFWSUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0ICB7CisgICAgaW50NjRfdCBmcmFtZXNfaGRyX3N0cm07CisgICAgaW50NjRfdCBhdWRpb19zdHJtX2xlbmd0aDsKKyAgICBpbnQgcGFja2V0X2NvdW50OworICAgIGludCBlbnRyeTsKKyAgICBpbnQgbWF4X3NpemU7CisKKyAgICBpbnQ2NF90IGxhc3RfZHRzOworCisgICAgQVZJSW5kZXggaW5kZXhlczsKK30gQVZJU3RyZWFtOworCitzdGF0aWMgaW50IGF2aV93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KTsKKworc3RhdGljIGlubGluZSBBVklJZW50cnkgKmF2aV9nZXRfaWVudHJ5KGNvbnN0IEFWSUluZGV4ICppZHgsIGludCBlbnRfaWQpCit7CisgICAgaW50IGNsID0gZW50X2lkIC8gQVZJX0lOREVYX0NMVVNURVJfU0laRTsKKyAgICBpbnQgaWQgPSBlbnRfaWQgJSBBVklfSU5ERVhfQ0xVU1RFUl9TSVpFOworICAgIHJldHVybiAmaWR4LT5jbHVzdGVyW2NsXVtpZF07Cit9CisKK3N0YXRpYyBpbnQ2NF90IGF2aV9zdGFydF9uZXdfcmlmZihBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyaWZmX3RhZywgY29uc3QgY2hhciAqbGlzdF90YWcpCit7CisgICAgQVZJQ29udGV4dCAqYXZpID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgbG9mZjsKKyAgICBpbnQgaTsKKworICAgIGF2aS0+cmlmZl9pZCsrOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZJU3RyZWFtICphdmlzdCA9IHMtPnN0cmVhbXNbaV0tPnByaXZfZGF0YTsKKyAgICAgICAgYXZpc3QtPmluZGV4ZXMuZW50cnkgPSAwOworICAgIH0KKworICAgIGF2aS0+cmlmZl9zdGFydCA9IGZmX3N0YXJ0X3RhZyhwYiwgIlJJRkYiKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsIHJpZmZfdGFnKTsKKyAgICBsb2ZmID0gZmZfc3RhcnRfdGFnKHBiLCAiTElTVCIpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgbGlzdF90YWcpOworICAgIHJldHVybiBsb2ZmOworfQorCitzdGF0aWMgY2hhciAqYXZpX3N0cmVhbTJmb3VyY2MoY2hhciAqdGFnLCBpbnQgaW5kZXgsIGVudW0gQVZNZWRpYVR5cGUgdHlwZSkKK3sKKyAgICB0YWdbMF0gPSAnMCcgKyBpbmRleCAvIDEwOworICAgIHRhZ1sxXSA9ICcwJyArIGluZGV4ICUgMTA7CisgICAgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIHRhZ1syXSA9ICdkJzsKKyAgICAgICAgdGFnWzNdID0gJ2MnOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgLy8gbm90ZTogdGhpcyBpcyBub3QgYW4gb2ZmaWNpYWwgY29kZQorICAgICAgICB0YWdbMl0gPSAncyc7CisgICAgICAgIHRhZ1szXSA9ICdiJzsKKyAgICB9IGVsc2UgeworICAgICAgICB0YWdbMl0gPSAndyc7CisgICAgICAgIHRhZ1szXSA9ICdiJzsKKyAgICB9CisgICAgdGFnWzRdID0gJ1wwJzsKKyAgICByZXR1cm4gdGFnOworfQorCitzdGF0aWMgaW50IGF2aV93cml0ZV9jb3VudGVycyhBVkZvcm1hdENvbnRleHQgKnMsIGludCByaWZmX2lkKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWSUNvbnRleHQgKmF2aSA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgbiwgYXVfYnl0ZXJhdGUsIGF1X3NzaXplLCBhdV9zY2FsZSwgbmJfZnJhbWVzID0gMDsKKyAgICBpbnQ2NF90IGZpbGVfc2l6ZTsKKyAgICBBVkNvZGVjQ29udGV4dCAqc3RyZWFtOworCisgICAgZmlsZV9zaXplID0gYXZpb190ZWxsKHBiKTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgcy0+bmJfc3RyZWFtczsgbisrKSB7CisgICAgICAgIEFWSVN0cmVhbSAqYXZpc3QgPSBzLT5zdHJlYW1zW25dLT5wcml2X2RhdGE7CisKKyAgICAgICAgYXZfYXNzZXJ0MChhdmlzdC0+ZnJhbWVzX2hkcl9zdHJtKTsKKyAgICAgICAgc3RyZWFtID0gcy0+c3RyZWFtc1tuXS0+Y29kZWM7CisgICAgICAgIGF2aW9fc2VlayhwYiwgYXZpc3QtPmZyYW1lc19oZHJfc3RybSwgU0VFS19TRVQpOworICAgICAgICBmZl9wYXJzZV9zcGVjaWZpY19wYXJhbXMocy0+c3RyZWFtc1tuXSwgJmF1X2J5dGVyYXRlLCAmYXVfc3NpemUsICZhdV9zY2FsZSk7CisgICAgICAgIGlmIChhdV9zc2l6ZSA9PSAwKQorICAgICAgICAgICAgYXZpb193bDMyKHBiLCBhdmlzdC0+cGFja2V0X2NvdW50KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZpb193bDMyKHBiLCBhdmlzdC0+YXVkaW9fc3RybV9sZW5ndGggLyBhdV9zc2l6ZSk7CisgICAgICAgIGlmIChzdHJlYW0tPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgbmJfZnJhbWVzID0gRkZNQVgobmJfZnJhbWVzLCBhdmlzdC0+cGFja2V0X2NvdW50KTsKKyAgICB9CisgICAgaWYgKHJpZmZfaWQgPT0gMSkgeworICAgICAgICBhdl9hc3NlcnQwKGF2aS0+ZnJhbWVzX2hkcl9hbGwpOworICAgICAgICBhdmlvX3NlZWsocGIsIGF2aS0+ZnJhbWVzX2hkcl9hbGwsIFNFRUtfU0VUKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCBuYl9mcmFtZXMpOworICAgIH0KKyAgICBhdmlvX3NlZWsocGIsIGZpbGVfc2l6ZSwgU0VFS19TRVQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXZpX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJQ29udGV4dCAqYXZpID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCBiaXRyYXRlLCBuLCBpLCBuYl9mcmFtZXMsIGF1X2J5dGVyYXRlLCBhdV9zc2l6ZSwgYXVfc2NhbGU7CisgICAgQVZDb2RlY0NvbnRleHQgKnZpZGVvX2VuYzsKKyAgICBBVlN0cmVhbSAqdmlkZW9fc3QgPSBOVUxMOworICAgIGludDY0X3QgbGlzdDEsIGxpc3QyLCBzdHJoLCBzdHJmOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICBpbnQgcGFkZGluZzsKKworICAgIGlmIChzLT5uYl9zdHJlYW1zID4gQVZJX01BWF9TVFJFQU1fQ09VTlQpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkFWSSBkb2VzIG5vdCBzdXBwb3J0ID4lZCBzdHJlYW1zXG4iLAorICAgICAgICAgICAgICAgQVZJX01BWF9TVFJFQU1fQ09VTlQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGZvciAobiA9IDA7IG4gPCBzLT5uYl9zdHJlYW1zOyBuKyspIHsKKyAgICAgICAgcy0+c3RyZWFtc1tuXS0+cHJpdl9kYXRhID0gYXZfbWFsbG9jeihzaXplb2YoQVZJU3RyZWFtKSk7CisgICAgICAgIGlmICghcy0+c3RyZWFtc1tuXS0+cHJpdl9kYXRhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICAvKiBoZWFkZXIgbGlzdCAqLworICAgIGF2aS0+cmlmZl9pZCA9IDA7CisgICAgbGlzdDEgPSBhdmlfc3RhcnRfbmV3X3JpZmYocywgcGIsICJBVkkgIiwgImhkcmwiKTsKKworICAgIC8qIGF2aSBoZWFkZXIgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJhdmloIik7CisgICAgYXZpb193bDMyKHBiLCAxNCAqIDQpOworICAgIGJpdHJhdGUgPSAwOworCisgICAgdmlkZW9fZW5jID0gTlVMTDsKKyAgICBmb3IgKG4gPSAwOyBuIDwgcy0+bmJfc3RyZWFtczsgbisrKSB7CisgICAgICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbbl0tPmNvZGVjOworICAgICAgICBiaXRyYXRlICs9IGNvZGVjLT5iaXRfcmF0ZTsKKyAgICAgICAgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgdmlkZW9fZW5jID0gY29kZWM7CisgICAgICAgICAgICB2aWRlb19zdCA9IHMtPnN0cmVhbXNbbl07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuYl9mcmFtZXMgPSAwOworCisgICAgLy8gVE9ETzogc2hvdWxkIGJlIGF2Z19mcmFtZV9yYXRlCisgICAgaWYgKHZpZGVvX3N0KQorICAgICAgICBhdmlvX3dsMzIocGIsICh1aW50MzJfdCkgKElOVDY0X0MoMTAwMDAwMCkgKiB2aWRlb19zdC0+dGltZV9iYXNlLm51bSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fc3QtPnRpbWVfYmFzZS5kZW4pKTsKKyAgICBlbHNlCisgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgYXZpb193bDMyKHBiLCBiaXRyYXRlIC8gOCk7IC8qIFhYWDogbm90IHF1aXRlIGV4YWN0ICovCisgICAgYXZpb193bDMyKHBiLCAwKTsgLyogcGFkZGluZyAqLworICAgIGlmICghcGItPnNlZWthYmxlKQorICAgICAgICBhdmlvX3dsMzIocGIsIEFWSUZfVFJVU1RDS1RZUEUgfCBBVklGX0lTSU5URVJMRUFWRUQpOyAgLyogZmxhZ3MgKi8KKyAgICBlbHNlCisgICAgICAgIGF2aW9fd2wzMihwYiwgQVZJRl9UUlVTVENLVFlQRSB8IEFWSUZfSEFTSU5ERVggfCBBVklGX0lTSU5URVJMRUFWRUQpOyAgLyogZmxhZ3MgKi8KKyAgICBhdmktPmZyYW1lc19oZHJfYWxsID0gYXZpb190ZWxsKHBiKTsgLyogcmVtZW1iZXIgdGhpcyBvZmZzZXQgdG8gZmlsbCBsYXRlciAqLworICAgIGF2aW9fd2wzMihwYiwgbmJfZnJhbWVzKTsgLyogbmIgZnJhbWVzLCBmaWxsZWQgbGF0ZXIgKi8KKyAgICBhdmlvX3dsMzIocGIsIDApOyAvKiBpbml0aWFsIGZyYW1lICovCisgICAgYXZpb193bDMyKHBiLCBzLT5uYl9zdHJlYW1zKTsgLyogbmIgc3RyZWFtcyAqLworICAgIGF2aW9fd2wzMihwYiwgMTAyNCAqIDEwMjQpOyAvKiBzdWdnZXN0ZWQgYnVmZmVyIHNpemUgKi8KKyAgICBpZiAodmlkZW9fZW5jKSB7CisgICAgICAgIGF2aW9fd2wzMihwYiwgdmlkZW9fZW5jLT53aWR0aCk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgdmlkZW9fZW5jLT5oZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgfQorICAgIGF2aW9fd2wzMihwYiwgMCk7IC8qIHJlc2VydmVkICovCisgICAgYXZpb193bDMyKHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBhdmlvX3dsMzIocGIsIDApOyAvKiByZXNlcnZlZCAqLworICAgIGF2aW9fd2wzMihwYiwgMCk7IC8qIHJlc2VydmVkICovCisKKyAgICAvKiBzdHJlYW0gbGlzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHN0LT5jb2RlYzsKKyAgICAgICAgQVZJU3RyZWFtICphdmlzdCA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgIGxpc3QyID0gZmZfc3RhcnRfdGFnKHBiLCAiTElTVCIpOworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJzdHJsIik7CisKKyAgICAgICAgLyogc3RyZWFtIGdlbmVyaWMgaGVhZGVyICovCisgICAgICAgIHN0cmggPSBmZl9zdGFydF90YWcocGIsICJzdHJoIik7CisgICAgICAgIHN3aXRjaCAoZW5jLT5jb2RlY190eXBlKSB7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgorICAgICAgICAgICAgLy8gWFNVQiBzdWJ0aXRsZXMgYmVoYXZlIGxpa2UgdmlkZW8gdHJhY2tzLCBvdGhlciBzdWJ0aXRsZXMKKyAgICAgICAgICAgIC8vIGFyZSBub3QgKHlldCkgc3VwcG9ydGVkLgorICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfWFNVQikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJTdWJ0aXRsZSBzdHJlYW1zIG90aGVyIHRoYW4gRGl2WCBYU1VCIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBBVkkgbXV4ZXIuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAidmlkcyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiYXVkcyIpOworICAgICAgICAgICAgYnJlYWs7CisvLyAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1RFWFQ6CisvLyAgICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJ0eHRzIik7CisvLyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfREFUQToKKyAgICAgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImRhdHMiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgICAgICBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1hTVUIpCisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZpb193bDMyKHBiLCAxKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgLyogZmxhZ3MgKi8KKyAgICAgICAgYXZpb193bDE2KHBiLCAwKTsgLyogcHJpb3JpdHkgKi8KKyAgICAgICAgYXZpb193bDE2KHBiLCAwKTsgLyogbGFuZ3VhZ2UgKi8KKyAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgLyogaW5pdGlhbCBmcmFtZSAqLworCisgICAgICAgIGZmX3BhcnNlX3NwZWNpZmljX3BhcmFtcyhzdCwgJmF1X2J5dGVyYXRlLCAmYXVfc3NpemUsICZhdV9zY2FsZSk7CisKKyAgICAgICAgaWYgKCAgIGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8KKyAgICAgICAgICAgICYmIGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfWFNVQgorICAgICAgICAgICAgJiYgYXVfYnl0ZXJhdGUgPiAxMDAwTEwqYXVfc2NhbGUpIHsKKyAgICAgICAgICAgIGF1X2J5dGVyYXRlID0gNjAwOworICAgICAgICAgICAgYXVfc2NhbGUgICAgPSAxOworICAgICAgICB9CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBhdV9zY2FsZSwgYXVfYnl0ZXJhdGUpOworICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9YU1VCKQorICAgICAgICAgICAgYXVfc2NhbGUgPSBhdV9ieXRlcmF0ZSA9IDA7CisKKyAgICAgICAgYXZpb193bDMyKHBiLCBhdV9zY2FsZSk7IC8qIHNjYWxlICovCisgICAgICAgIGF2aW9fd2wzMihwYiwgYXVfYnl0ZXJhdGUpOyAvKiByYXRlICovCisKKyAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgLyogc3RhcnQgKi8KKyAgICAgICAgLyogcmVtZW1iZXIgdGhpcyBvZmZzZXQgdG8gZmlsbCBsYXRlciAqLworICAgICAgICBhdmlzdC0+ZnJhbWVzX2hkcl9zdHJtID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgaWYgKCFwYi0+c2Vla2FibGUpCisgICAgICAgICAgICAvKiBGSVhNRTogdGhpcyBtYXkgYmUgYnJva2VuLCBidXQgd2hvIGNhcmVzICovCisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIEFWSV9NQVhfUklGRl9TSVpFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgIC8qIGxlbmd0aCwgWFhYOiBmaWxsZWQgbGF0ZXIgKi8KKworICAgICAgICAvKiBzdWdnZXN0ZWQgYnVmZmVyIHNpemUsIGlzIHNldCB0byBsYXJnZXN0IGNodW5rIHNpemUgaW4gYXZpX3dyaXRlX3RyYWlsZXIgKi8KKyAgICAgICAgaWYgKGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgZWxzZSBpZiAoZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMTIgKiAxMDI0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCAtMSk7IC8qIHF1YWxpdHkgKi8KKyAgICAgICAgYXZpb193bDMyKHBiLCBhdV9zc2l6ZSk7IC8qIHNhbXBsZSBzaXplICovCisgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgICAgIGF2aW9fd2wxNihwYiwgZW5jLT53aWR0aCk7CisgICAgICAgIGF2aW9fd2wxNihwYiwgZW5jLT5oZWlnaHQpOworICAgICAgICBmZl9lbmRfdGFnKHBiLCBzdHJoKTsKKworICAgICAgICBpZiAoZW5jLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9EQVRBKSB7CisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisKKyAgICAgICAgICAgIHN0cmYgPSBmZl9zdGFydF90YWcocGIsICJzdHJmIik7CisgICAgICAgICAgICBzd2l0Y2ggKGVuYy0+Y29kZWNfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6CisgICAgICAgICAgICAgICAgLyogWFNVQiBzdWJ0aXRsZXMgYmVoYXZlIGxpa2UgdmlkZW8gdHJhY2tzLCBvdGhlciBzdWJ0aXRsZXMKKyAgICAgICAgICAgICAgICAgKiBhcmUgbm90ICh5ZXQpIHN1cHBvcnRlZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9YU1VCKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgICAgIC8qIFdNUCBleHBlY3RzIFJHQiA1OjU6NSByYXd2aWRlbyBpbiBhdmkgdG8gaGF2ZSBicHAgc2V0IHRvIDE2LiAqLworICAgICAgICAgICAgICAgIGlmICggICFlbmMtPmNvZGVjX3RhZworICAgICAgICAgICAgICAgICAgICAmJiBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPCisgICAgICAgICAgICAgICAgICAgICYmIGVuYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjU1NUxFCisgICAgICAgICAgICAgICAgICAgICYmIGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDE1KQorICAgICAgICAgICAgICAgICAgICBlbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OworICAgICAgICAgICAgICAgIGZmX3B1dF9ibXBfaGVhZGVyKHBiLCBlbmMsIGZmX2NvZGVjX2JtcF90YWdzLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gYXZwcml2X2ZpbmRfcGl4X2ZtdChhdnByaXZfcGl4X2ZtdF9icHNfYXZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoICAgIWVuYy0+Y29kZWNfdGFnCisgICAgICAgICAgICAgICAgICAgICYmIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8KKyAgICAgICAgICAgICAgICAgICAgJiYgZW5jLT5waXhfZm10ICE9IHBpeF9mbXQKKyAgICAgICAgICAgICAgICAgICAgJiYgZW5jLT5waXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiVzIHJhd3ZpZGVvIGNhbm5vdCBiZSB3cml0dGVuIHRvIGF2aSwgb3V0cHV0IGZpbGUgd2lsbCBiZSB1bnJlYWRhYmxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGVuYy0+cGl4X2ZtdCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9wdXRfd2F2X2hlYWRlcihwYiwgZW5jLCAwKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvciBub3Qgc3VwcG9ydGVkIGNvZGVjIHR5cGUgJyVzJyBmb3VuZCBpbiB0aGUgaW5wdXRcbiIsCisgICAgICAgICAgICAgICAgICAgIChjaGFyICopYXZfeF9pZl9udWxsKGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyhlbmMtPmNvZGVjX3R5cGUpLCAiPyIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmZfZW5kX3RhZyhwYiwgc3RyZik7CisgICAgICAgICAgICBpZiAoKHQgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApKSkgeworICAgICAgICAgICAgICAgIGZmX3JpZmZfd3JpdGVfaW5mb190YWcocy0+cGIsICJzdHJuIiwgdC0+dmFsdWUpOworICAgICAgICAgICAgICAgIHQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWFNVQgorICAgICAgICAgICAgJiYgKHQgPSBhdl9kaWN0X2dldChzLT5zdHJlYW1zW2ldLT5tZXRhZGF0YSwgImxhbmd1YWdlIiwgTlVMTCwgMCkpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGFuZ3N0ciA9IGF2X2NvbnZlcnRfbGFuZ190byh0LT52YWx1ZSwgQVZfTEFOR19JU082MzlfMSk7CisgICAgICAgICAgICAgICAgdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKGxhbmdzdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciogc3RyID0gYXZfYXNwcmludGYoIlN1YnRpdGxlIC0gJXMteHg7MDIiLCBsYW5nc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgZmZfcmlmZl93cml0ZV9pbmZvX3RhZyhzLT5wYiwgInN0cm4iLCBzdHIpOworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKHN0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0YWdbNV07CisgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgLyogU3RhcnRpbmcgdG8gbGF5IG91dCBBVkkgT3BlbkRNTCBtYXN0ZXIgaW5kZXguCisgICAgICAgICAgICAgKiBXZSB3YW50IHRvIG1ha2UgaXQgSlVOSyBlbnRyeSBmb3Igbm93LCBzaW5jZSB3ZSdkCisgICAgICAgICAgICAgKiBsaWtlIHRvIGdldCBhd2F5IHdpdGhvdXQgbWFraW5nIEFWSSBhbiBPcGVuRE1MIG9uZQorICAgICAgICAgICAgICogZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gKi8KKyAgICAgICAgICAgIGF2aXN0LT5pbmRleGVzLmVudHJ5ICAgICAgPSBhdmlzdC0+aW5kZXhlcy5lbnRzX2FsbG9jYXRlZCA9IDA7CisgICAgICAgICAgICBhdmlzdC0+aW5kZXhlcy5pbmR4X3N0YXJ0ID0gZmZfc3RhcnRfdGFnKHBiLCAiSlVOSyIpOworICAgICAgICAgICAgYXZpb193bDE2KHBiLCA0KTsgICAvKiB3TG9uZ3NQZXJFbnRyeSAqLworICAgICAgICAgICAgYXZpb193OChwYiwgMCk7ICAgICAvKiBiSW5kZXhTdWJUeXBlICgwID09IGZyYW1lIGluZGV4KSAqLworICAgICAgICAgICAgYXZpb193OChwYiwgMCk7ICAgICAvKiBiSW5kZXhUeXBlICgwID09IEFWSV9JTkRFWF9PRl9JTkRFWEVTKSAqLworICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgICAvKiBuRW50cmllc0luVXNlICh3aWxsIGZpbGwgb3V0IGxhdGVyIG9uKSAqLworICAgICAgICAgICAgZmZpb193Zm91cmNjKHBiLCBhdmlfc3RyZWFtMmZvdXJjYyh0YWcsIGksIGVuYy0+Y29kZWNfdHlwZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkd0NodW5rSWQgKi8KKyAgICAgICAgICAgIGF2aW9fd2w2NChwYiwgMCk7ICAgLyogZHdSZXNlcnZlZFszXSAqLworICAgICAgICAgICAgLy8gYXZpb193bDMyKHBiLCAwKTsgICAvKiBNdXN0IGJlIDAuICAgICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgQVZJX01BU1RFUl9JTkRFWF9TSVpFICogMjsgaisrKQorICAgICAgICAgICAgICAgIGF2aW9fd2w2NChwYiwgMCk7CisgICAgICAgICAgICBmZl9lbmRfdGFnKHBiLCBhdmlzdC0+aW5kZXhlcy5pbmR4X3N0YXJ0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICAgJiYKKyAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA+IDAgJiYKKyAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA+IDApIHsKKyAgICAgICAgICAgIGludCB2cHJwICAgICAgID0gZmZfc3RhcnRfdGFnKHBiLCAidnBycCIpOworICAgICAgICAgICAgQVZSYXRpb25hbCBkYXIgPSBhdl9tdWxfcShzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgZW5jLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5oZWlnaHQgfSk7CisgICAgICAgICAgICBpbnQgbnVtLCBkZW47CisgICAgICAgICAgICBhdl9yZWR1Y2UoJm51bSwgJmRlbiwgZGFyLm51bSwgZGFyLmRlbiwgMHhGRkZGKTsKKworICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgLy8gdmlkZW8gZm9ybWF0ICAgPSB1bmtub3duCisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDApOyAvLyB2aWRlbyBzdGFuZGFyZCA9IHVua25vd24KKyAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBiZSBhdmdfZnJhbWVfcmF0ZQorICAgICAgICAgICAgYXZpb193bDMyKHBiLCBscmludGYoMS4wIC8gYXZfcTJkKHN0LT50aW1lX2Jhc2UpKSk7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+d2lkdGgpOworICAgICAgICAgICAgYXZpb193bDMyKHBiLCBlbmMtPmhlaWdodCk7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIGRlbik7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIG51bSk7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+d2lkdGgpOworICAgICAgICAgICAgYXZpb193bDMyKHBiLCBlbmMtPmhlaWdodCk7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDEpOyAvLyBwcm9ncmVzc2l2ZSBGSVhNRQorCisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgZW5jLT53aWR0aCk7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgZW5jLT53aWR0aCk7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDApOworICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsKKworICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgICAgICAgICBmZl9lbmRfdGFnKHBiLCB2cHJwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZmX2VuZF90YWcocGIsIGxpc3QyKTsKKyAgICB9CisKKyAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIC8qIEFWSSBjb3VsZCBiZWNvbWUgYW4gT3BlbkRNTCBvbmUsIGlmIGl0IGdyb3dzIGJleW9uZCAyR2IgcmFuZ2UgKi8KKyAgICAgICAgYXZpLT5vZG1sX2xpc3QgPSBmZl9zdGFydF90YWcocGIsICJKVU5LIik7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm9kbWwiKTsKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiZG1saCIpOworICAgICAgICBhdmlvX3dsMzIocGIsIDI0OCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNDg7IGkgKz0gNCkKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgICAgIGZmX2VuZF90YWcocGIsIGF2aS0+b2RtbF9saXN0KTsKKyAgICB9CisKKyAgICBmZl9lbmRfdGFnKHBiLCBsaXN0MSk7CisKKyAgICBmZl9yaWZmX3dyaXRlX2luZm8ocyk7CisKKworICAgIHBhZGRpbmcgPSBzLT5tZXRhZGF0YV9oZWFkZXJfcGFkZGluZzsKKyAgICBpZiAocGFkZGluZyA8IDApCisgICAgICAgIHBhZGRpbmcgPSAxMDE2OworCisgICAgLyogc29tZSBwYWRkaW5nIGZvciBlYXNpZXIgdGFnIGVkaXRpbmcgKi8KKyAgICBpZiAocGFkZGluZykgeworICAgICAgICBsaXN0MiA9IGZmX3N0YXJ0X3RhZyhwYiwgIkpVTksiKTsKKyAgICAgICAgZm9yIChpID0gcGFkZGluZzsgaSA+IDA7IGkgLT0gNCkKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgICAgIGZmX2VuZF90YWcocGIsIGxpc3QyKTsKKyAgICB9CisKKyAgICBhdmktPm1vdmlfbGlzdCA9IGZmX3N0YXJ0X3RhZyhwYiwgIkxJU1QiKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJtb3ZpIik7CisKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF2aV93cml0ZV9peChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZJQ29udGV4dCAqYXZpID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgdGFnWzVdOworICAgIGNoYXIgaXhfdGFnW10gPSAiaXgwMCI7CisgICAgaW50IGksIGo7CisKKyAgICBhdl9hc3NlcnQwKHBiLT5zZWVrYWJsZSk7CisKKyAgICBpZiAoYXZpLT5yaWZmX2lkID4gQVZJX01BU1RFUl9JTkRFWF9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHJpZmYgaW5kZXggJWQgPiAlZFxuIiwKKyAgICAgICAgICAgICAgIGF2aS0+cmlmZl9pZCwgQVZJX01BU1RFUl9JTkRFWF9TSVpFKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWSVN0cmVhbSAqYXZpc3QgPSBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGE7CisgICAgICAgIGludDY0X3QgaXgsIHBvczsKKworICAgICAgICBhdmlfc3RyZWFtMmZvdXJjYyh0YWcsIGksIHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlKTsKKyAgICAgICAgaXhfdGFnWzNdID0gJzAnICsgaTsKKworICAgICAgICAvKiBXcml0aW5nIEFWSSBPcGVuRE1MIGxlYWYgaW5kZXggY2h1bmsgKi8KKyAgICAgICAgaXggPSBhdmlvX3RlbGwocGIpOworICAgICAgICBmZmlvX3dmb3VyY2MocGIsIGl4X3RhZyk7ICAgICAgLyogaXg/PyAqLworICAgICAgICBhdmlvX3dsMzIocGIsIGF2aXN0LT5pbmRleGVzLmVudHJ5ICogOCArIDI0KTsKKyAgICAgICAgLyogY2h1bmsgc2l6ZSAqLworICAgICAgICBhdmlvX3dsMTYocGIsIDIpOyAgICAgICAgICAgLyogd0xvbmdzUGVyRW50cnkgKi8KKyAgICAgICAgYXZpb193OChwYiwgMCk7ICAgICAgICAgICAgIC8qIGJJbmRleFN1YlR5cGUgKDAgPT0gZnJhbWUgaW5kZXgpICovCisgICAgICAgIGF2aW9fdzgocGIsIDEpOyAgICAgICAgICAgICAvKiBiSW5kZXhUeXBlICgxID09IEFWSV9JTkRFWF9PRl9DSFVOS1MpICovCisgICAgICAgIGF2aW9fd2wzMihwYiwgYXZpc3QtPmluZGV4ZXMuZW50cnkpOworICAgICAgICAvKiBuRW50cmllc0luVXNlICovCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgdGFnKTsgICAgICAgICAvKiBkd0NodW5rSWQgKi8KKyAgICAgICAgYXZpb193bDY0KHBiLCBhdmktPm1vdmlfbGlzdCk7IC8qIHF3QmFzZU9mZnNldCAqLworICAgICAgICBhdmlvX3dsMzIocGIsIDApOyAgICAgICAgICAgICAgLyogZHdSZXNlcnZlZF8zIChtdXN0IGJlIDApICovCisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2aXN0LT5pbmRleGVzLmVudHJ5OyBqKyspIHsKKyAgICAgICAgICAgIEFWSUllbnRyeSAqaWUgPSBhdmlfZ2V0X2llbnRyeSgmYXZpc3QtPmluZGV4ZXMsIGopOworICAgICAgICAgICAgYXZpb193bDMyKHBiLCBpZS0+cG9zICsgOCk7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsICgodWludDMyX3QpIGllLT5sZW4gJiB+MHg4MDAwMDAwMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaWUtPmZsYWdzICYgMHgxMCA/IDAgOiAweDgwMDAwMDAwKSk7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19mbHVzaChwYik7CisgICAgICAgIHBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICAgICAgLyogVXBkYXRpbmcgb25lIGVudHJ5IGluIHRoZSBBVkkgT3BlbkRNTCBtYXN0ZXIgaW5kZXggKi8KKyAgICAgICAgYXZpb19zZWVrKHBiLCBhdmlzdC0+aW5kZXhlcy5pbmR4X3N0YXJ0IC0gOCwgU0VFS19TRVQpOworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJpbmR4Iik7ICAgICAgICAgICAgIC8qIGVuYWJsaW5nIHRoaXMgZW50cnkgKi8KKyAgICAgICAgYXZpb19za2lwKHBiLCA4KTsKKyAgICAgICAgYXZpb193bDMyKHBiLCBhdmktPnJpZmZfaWQpOyAgICAgICAgICAvKiBuRW50cmllc0luVXNlICovCisgICAgICAgIGF2aW9fc2tpcChwYiwgMTYgKiBhdmktPnJpZmZfaWQpOworICAgICAgICBhdmlvX3dsNjQocGIsIGl4KTsgICAgICAgICAgICAgICAgICAgIC8qIHF3T2Zmc2V0ICovCisgICAgICAgIGF2aW9fd2wzMihwYiwgcG9zIC0gaXgpOyAgICAgICAgICAgICAgLyogZHdTaXplICovCisgICAgICAgIGF2aW9fd2wzMihwYiwgYXZpc3QtPmluZGV4ZXMuZW50cnkpOyAgLyogZHdEdXJhdGlvbiAqLworCisgICAgICAgIGF2aW9fc2VlayhwYiwgcG9zLCBTRUVLX1NFVCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF2aV93cml0ZV9pZHgxKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVklDb250ZXh0ICphdmkgPSBzLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBpZHhfY2h1bms7CisgICAgaW50IGk7CisgICAgY2hhciB0YWdbNV07CisKKyAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIEFWSVN0cmVhbSAqYXZpc3Q7CisgICAgICAgIEFWSUllbnRyeSAqaWUgPSAwLCAqdGllOworICAgICAgICBpbnQgZW1wdHksIHN0cmVhbV9pZCA9IC0xOworCisgICAgICAgIGlkeF9jaHVuayA9IGZmX3N0YXJ0X3RhZyhwYiwgImlkeDEiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgYXZpc3QgICAgICAgID0gcy0+c3RyZWFtc1tpXS0+cHJpdl9kYXRhOworICAgICAgICAgICAgYXZpc3QtPmVudHJ5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGVtcHR5ID0gMTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhdmlzdCA9IHMtPnN0cmVhbXNbaV0tPnByaXZfZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAoYXZpc3QtPmluZGV4ZXMuZW50cnkgPD0gYXZpc3QtPmVudHJ5KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIHRpZSA9IGF2aV9nZXRfaWVudHJ5KCZhdmlzdC0+aW5kZXhlcywgYXZpc3QtPmVudHJ5KTsKKyAgICAgICAgICAgICAgICBpZiAoZW1wdHkgfHwgdGllLT5wb3MgPCBpZS0+cG9zKSB7CisgICAgICAgICAgICAgICAgICAgIGllICAgICAgICA9IHRpZTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2lkID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW1wdHkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFlbXB0eSkgeworICAgICAgICAgICAgICAgIGF2aXN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faWRdLT5wcml2X2RhdGE7CisgICAgICAgICAgICAgICAgYXZpX3N0cmVhbTJmb3VyY2ModGFnLCBzdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1tzdHJlYW1faWRdLT5jb2RlYy0+Y29kZWNfdHlwZSk7CisgICAgICAgICAgICAgICAgZmZpb193Zm91cmNjKHBiLCB0YWcpOworICAgICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgaWUtPmZsYWdzKTsKKyAgICAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGllLT5wb3MpOworICAgICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgaWUtPmxlbik7CisgICAgICAgICAgICAgICAgYXZpc3QtPmVudHJ5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCFlbXB0eSk7CisgICAgICAgIGZmX2VuZF90YWcocGIsIGlkeF9jaHVuayk7CisKKyAgICAgICAgYXZpX3dyaXRlX2NvdW50ZXJzKHMsIGF2aS0+cmlmZl9pZCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3NraXBfZnJhbWVzKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCBkdHMpCit7CisgICAgQVZJU3RyZWFtICphdmlzdCAgICA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjOworCisgICAgYXZfZGxvZyhzLCAiZHRzOiVzIHBhY2tldF9jb3VudDolZCBzdHJlYW1faW5kZXg6JWRcbiIsIGF2X3RzMnN0cihkdHMpLCBhdmlzdC0+cGFja2V0X2NvdW50LCBzdHJlYW1faW5kZXgpOworICAgIHdoaWxlIChlbmMtPmJsb2NrX2FsaWduID09IDAgJiYgZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmCisgICAgICAgICAgIGR0cyA+IGF2aXN0LT5wYWNrZXRfY291bnQgJiYgZW5jLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9YU1VCICYmIGF2aXN0LT5wYWNrZXRfY291bnQpIHsKKyAgICAgICAgQVZQYWNrZXQgZW1wdHlfcGFja2V0OworCisgICAgICAgIGlmIChkdHMgLSBhdmlzdC0+cGFja2V0X2NvdW50ID4gNjAwMDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJUb28gbGFyZ2UgbnVtYmVyIG9mIHNraXBwZWQgZnJhbWVzICUiUFJJZDY0IiA+IDYwMDAwXG4iLCBkdHMgLSBhdmlzdC0+cGFja2V0X2NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBhdl9pbml0X3BhY2tldCgmZW1wdHlfcGFja2V0KTsKKyAgICAgICAgZW1wdHlfcGFja2V0LnNpemUgICAgICAgICA9IDA7CisgICAgICAgIGVtcHR5X3BhY2tldC5kYXRhICAgICAgICAgPSBOVUxMOworICAgICAgICBlbXB0eV9wYWNrZXQuc3RyZWFtX2luZGV4ID0gc3RyZWFtX2luZGV4OworICAgICAgICBhdmlfd3JpdGVfcGFja2V0KHMsICZlbXB0eV9wYWNrZXQpOworICAgICAgICBhdl9kbG9nKHMsICJkdXAgZHRzOiVzIHBhY2tldF9jb3VudDolZFxuIiwgYXZfdHMyc3RyKGR0cyksIGF2aXN0LT5wYWNrZXRfY291bnQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF2aV93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIHVuc2lnbmVkIGNoYXIgdGFnWzVdOworICAgIHVuc2lnbmVkIGludCBmbGFncyA9IDA7CisgICAgY29uc3QgaW50IHN0cmVhbV9pbmRleCA9IHBrdC0+c3RyZWFtX2luZGV4OworICAgIGludCBzaXplICAgICAgICAgICAgICAgPSBwa3QtPnNpemU7CisgICAgQVZJQ29udGV4dCAqYXZpICAgICA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgICAgID0gcy0+cGI7CisgICAgQVZJU3RyZWFtICphdmlzdCAgICA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjOworICAgIGludCByZXQ7CisKKyAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmIGVuYy0+Y29kZWNfdGFnID09IE1LVEFHKCdIJywnMicsJzYnLCc0JykgJiYgcGt0LT5zaXplKSB7CisgICAgICAgIHJldCA9IGZmX2NoZWNrX2gyNjRfc3RhcnRjb2RlKHMsIHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XSwgcGt0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICgocmV0ID0gd3JpdGVfc2tpcF9mcmFtZXMocywgc3RyZWFtX2luZGV4LCBwa3QtPmR0cykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgYXZpc3QtPmxhc3RfZHRzID0gcGt0LT5kdHMgKyBwa3QtPmR1cmF0aW9uOworCisgICAgYXZpc3QtPnBhY2tldF9jb3VudCsrOworCisgICAgLy8gTWFrZSBzdXJlIHRvIHB1dCBhbiBPcGVuRE1MIGNodW5rIHdoZW4gdGhlIGZpbGUgc2l6ZSBleGNlZWRzIHRoZSBsaW1pdHMKKyAgICBpZiAocGItPnNlZWthYmxlICYmCisgICAgICAgIChhdmlvX3RlbGwocGIpIC0gYXZpLT5yaWZmX3N0YXJ0ID4gQVZJX01BWF9SSUZGX1NJWkUpKSB7CisgICAgICAgIGF2aV93cml0ZV9peChzKTsKKyAgICAgICAgZmZfZW5kX3RhZyhwYiwgYXZpLT5tb3ZpX2xpc3QpOworCisgICAgICAgIGlmIChhdmktPnJpZmZfaWQgPT0gMSkKKyAgICAgICAgICAgIGF2aV93cml0ZV9pZHgxKHMpOworCisgICAgICAgIGZmX2VuZF90YWcocGIsIGF2aS0+cmlmZl9zdGFydCk7CisgICAgICAgIGF2aS0+bW92aV9saXN0ID0gYXZpX3N0YXJ0X25ld19yaWZmKHMsIHBiLCAiQVZJWCIsICJtb3ZpIik7CisgICAgfQorCisgICAgYXZpX3N0cmVhbTJmb3VyY2ModGFnLCBzdHJlYW1faW5kZXgsIGVuYy0+Y29kZWNfdHlwZSk7CisgICAgaWYgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpCisgICAgICAgIGZsYWdzID0gMHgxMDsKKyAgICBpZiAoZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgYXZpc3QtPmF1ZGlvX3N0cm1fbGVuZ3RoICs9IHNpemU7CisKKyAgICBpZiAocy0+cGItPnNlZWthYmxlKSB7CisgICAgICAgIEFWSUluZGV4ICppZHggPSAmYXZpc3QtPmluZGV4ZXM7CisgICAgICAgIGludCBjbCA9IGlkeC0+ZW50cnkgLyBBVklfSU5ERVhfQ0xVU1RFUl9TSVpFOworICAgICAgICBpbnQgaWQgPSBpZHgtPmVudHJ5ICUgQVZJX0lOREVYX0NMVVNURVJfU0laRTsKKyAgICAgICAgaWYgKGlkeC0+ZW50c19hbGxvY2F0ZWQgPD0gaWR4LT5lbnRyeSkgeworICAgICAgICAgICAgaWR4LT5jbHVzdGVyID0gYXZfcmVhbGxvY19mKGlkeC0+Y2x1c3Rlciwgc2l6ZW9mKHZvaWQqKSwgY2wrMSk7CisgICAgICAgICAgICBpZiAoIWlkeC0+Y2x1c3RlcikgeworICAgICAgICAgICAgICAgIGlkeC0+ZW50c19hbGxvY2F0ZWQgPSAwOworICAgICAgICAgICAgICAgIGlkeC0+ZW50cnkgICAgICAgICAgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZHgtPmNsdXN0ZXJbY2xdID0KKyAgICAgICAgICAgICAgICBhdl9tYWxsb2MoQVZJX0lOREVYX0NMVVNURVJfU0laRSAqIHNpemVvZihBVklJZW50cnkpKTsKKyAgICAgICAgICAgIGlmICghaWR4LT5jbHVzdGVyW2NsXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgaWR4LT5lbnRzX2FsbG9jYXRlZCArPSBBVklfSU5ERVhfQ0xVU1RFUl9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgaWR4LT5jbHVzdGVyW2NsXVtpZF0uZmxhZ3MgPSBmbGFnczsKKyAgICAgICAgaWR4LT5jbHVzdGVyW2NsXVtpZF0ucG9zICAgPSBhdmlvX3RlbGwocGIpIC0gYXZpLT5tb3ZpX2xpc3Q7CisgICAgICAgIGlkeC0+Y2x1c3RlcltjbF1baWRdLmxlbiAgID0gc2l6ZTsKKyAgICAgICAgYXZpc3QtPm1heF9zaXplID0gRkZNQVgoYXZpc3QtPm1heF9zaXplLCBzaXplKTsKKyAgICAgICAgaWR4LT5lbnRyeSsrOworICAgIH0KKworICAgIGF2aW9fd3JpdGUocGIsIHRhZywgNCk7CisgICAgYXZpb193bDMyKHBiLCBzaXplKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBwa3QtPmRhdGEsIHNpemUpOworICAgIGlmIChzaXplICYgMSkKKyAgICAgICAgYXZpb193OChwYiwgMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdmlfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJQ29udGV4dCAqYXZpID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCByZXMgPSAwOworICAgIGludCBpLCBqLCBuLCBuYl9mcmFtZXM7CisgICAgaW50NjRfdCBmaWxlX3NpemU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWSVN0cmVhbSAqYXZpc3QgPSBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGE7CisgICAgICAgIHdyaXRlX3NraXBfZnJhbWVzKHMsIGksIGF2aXN0LT5sYXN0X2R0cyk7CisgICAgfQorCisgICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgICAgICBpZiAoYXZpLT5yaWZmX2lkID09IDEpIHsKKyAgICAgICAgICAgIGZmX2VuZF90YWcocGIsIGF2aS0+bW92aV9saXN0KTsKKyAgICAgICAgICAgIHJlcyA9IGF2aV93cml0ZV9pZHgxKHMpOworICAgICAgICAgICAgZmZfZW5kX3RhZyhwYiwgYXZpLT5yaWZmX3N0YXJ0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2aV93cml0ZV9peChzKTsKKyAgICAgICAgICAgIGZmX2VuZF90YWcocGIsIGF2aS0+bW92aV9saXN0KTsKKyAgICAgICAgICAgIGZmX2VuZF90YWcocGIsIGF2aS0+cmlmZl9zdGFydCk7CisKKyAgICAgICAgICAgIGZpbGVfc2l6ZSA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGF2aS0+b2RtbF9saXN0IC0gOCwgU0VFS19TRVQpOworICAgICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiTElTVCIpOyAvKiBNYWtpbmcgdGhpcyBBVkkgT3BlbkRNTCBvbmUgKi8KKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMTYpOworCisgICAgICAgICAgICBmb3IgKG4gPSBuYl9mcmFtZXMgPSAwOyBuIDwgcy0+bmJfc3RyZWFtczsgbisrKSB7CisgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKnN0cmVhbSA9IHMtPnN0cmVhbXNbbl0tPmNvZGVjOworICAgICAgICAgICAgICAgIEFWSVN0cmVhbSAqYXZpc3QgICAgICAgPSBzLT5zdHJlYW1zW25dLT5wcml2X2RhdGE7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgICAgICAgICBpZiAobmJfZnJhbWVzIDwgYXZpc3QtPnBhY2tldF9jb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5iX2ZyYW1lcyA9IGF2aXN0LT5wYWNrZXRfY291bnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMykKKyAgICAgICAgICAgICAgICAgICAgICAgIG5iX2ZyYW1lcyArPSBhdmlzdC0+cGFja2V0X2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgbmJfZnJhbWVzKTsKKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgZmlsZV9zaXplLCBTRUVLX1NFVCk7CisKKyAgICAgICAgICAgIGF2aV93cml0ZV9jb3VudGVycyhzLCBhdmktPnJpZmZfaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVklTdHJlYW0gKmF2aXN0ID0gcy0+c3RyZWFtc1tpXS0+cHJpdl9kYXRhOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXZpc3QtPmluZGV4ZXMuZW50c19hbGxvY2F0ZWQgLyBBVklfSU5ERVhfQ0xVU1RFUl9TSVpFOyBqKyspCisgICAgICAgICAgICBhdl9mcmVlcCgmYXZpc3QtPmluZGV4ZXMuY2x1c3RlcltqXSk7CisgICAgICAgIGF2X2ZyZWVwKCZhdmlzdC0+aW5kZXhlcy5jbHVzdGVyKTsKKyAgICAgICAgYXZpc3QtPmluZGV4ZXMuZW50c19hbGxvY2F0ZWQgPSBhdmlzdC0+aW5kZXhlcy5lbnRyeSA9IDA7CisgICAgICAgIGlmIChwYi0+c2Vla2FibGUpIHsKKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgYXZpc3QtPmZyYW1lc19oZHJfc3RybSArIDQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgYXZpc3QtPm1heF9zaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX2F2aV9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXZpIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVZJIChBdWRpbyBWaWRlbyBJbnRlcmxlYXZlZCkiKSwKKyAgICAubWltZV90eXBlICAgICAgPSAidmlkZW8veC1tc3ZpZGVvIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiYXZpIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVZJQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgID0gQ09ORklHX0xJQk1QM0xBTUUgPyBBVl9DT0RFQ19JRF9NUDMgOiBBVl9DT0RFQ19JRF9BQzMsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfTVBFRzQsCisgICAgLndyaXRlX2hlYWRlciAgID0gYXZpX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBhdmlfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICA9IGF2aV93cml0ZV90cmFpbGVyLAorICAgIC5jb2RlY190YWcgICAgICA9IChjb25zdCBBVkNvZGVjVGFnICogY29uc3QgW10pIHsKKyAgICAgICAgZmZfY29kZWNfYm1wX3RhZ3MsIGZmX2NvZGVjX3dhdl90YWdzLCAwCisgICAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXZpby5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2aW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjZiYjBhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2aW8uYwpAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyAqIHVuYnVmZmVyZWQgSS9PCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgIm9zX3N1cHBvcnQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2lmIENPTkZJR19ORVRXT1JLCisjaW5jbHVkZSAibmV0d29yay5oIgorI2VuZGlmCisjaW5jbHVkZSAidXJsLmgiCisKK3N0YXRpYyBVUkxQcm90b2NvbCAqZmlyc3RfcHJvdG9jb2wgPSBOVUxMOworCitVUkxQcm90b2NvbCAqZmZ1cmxfcHJvdG9jb2xfbmV4dChjb25zdCBVUkxQcm90b2NvbCAqcHJldikKK3sKKyAgICByZXR1cm4gcHJldiA/IHByZXYtPm5leHQgOiBmaXJzdF9wcm90b2NvbDsKK30KKworLyoqIEBuYW1lIExvZ2dpbmcgY29udGV4dC4gKi8KKy8qQHsqLworc3RhdGljIGNvbnN0IGNoYXIgKnVybGNvbnRleHRfdG9fbmFtZSh2b2lkICpwdHIpCit7CisgICAgVVJMQ29udGV4dCAqaCA9IChVUkxDb250ZXh0ICopcHRyOworICAgIGlmIChoLT5wcm90KQorICAgICAgICByZXR1cm4gaC0+cHJvdC0+bmFtZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAiTlVMTCI7Cit9CisKK3N0YXRpYyB2b2lkICp1cmxjb250ZXh0X2NoaWxkX25leHQodm9pZCAqb2JqLCB2b2lkICpwcmV2KQoreworICAgIFVSTENvbnRleHQgKmggPSBvYmo7CisgICAgaWYgKCFwcmV2ICYmIGgtPnByaXZfZGF0YSAmJiBoLT5wcm90LT5wcml2X2RhdGFfY2xhc3MpCisgICAgICAgIHJldHVybiBoLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzICp1cmxjb250ZXh0X2NoaWxkX2NsYXNzX25leHQoY29uc3QgQVZDbGFzcyAqcHJldikKK3sKKyAgICBVUkxQcm90b2NvbCAqcCA9IE5VTEw7CisKKyAgICAvKiBmaW5kIHRoZSBwcm90b2NvbCB0aGF0IGNvcnJlc3BvbmRzIHRvIHByZXYgKi8KKyAgICB3aGlsZSAocHJldiAmJiAocCA9IGZmdXJsX3Byb3RvY29sX25leHQocCkpKQorICAgICAgICBpZiAocC0+cHJpdl9kYXRhX2NsYXNzID09IHByZXYpCisgICAgICAgICAgICBicmVhazsKKworICAgIC8qIGZpbmQgbmV4dCBwcm90b2NvbCB3aXRoIHByaXYgb3B0aW9ucyAqLworICAgIHdoaWxlIChwID0gZmZ1cmxfcHJvdG9jb2xfbmV4dChwKSkKKyAgICAgICAgaWYgKHAtPnByaXZfZGF0YV9jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBwLT5wcml2X2RhdGFfY2xhc3M7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7IHsgTlVMTCB9IH07Citjb25zdCBBVkNsYXNzIGZmdXJsX2NvbnRleHRfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgICAgICAgPSAiVVJMQ29udGV4dCIsCisgICAgLml0ZW1fbmFtZSAgICAgICAgPSB1cmxjb250ZXh0X3RvX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jaGlsZF9uZXh0ICAgICAgID0gdXJsY29udGV4dF9jaGlsZF9uZXh0LAorICAgIC5jaGlsZF9jbGFzc19uZXh0ID0gdXJsY29udGV4dF9jaGlsZF9jbGFzc19uZXh0LAorfTsKKy8qQH0qLworCitjb25zdCBjaGFyICphdmlvX2VudW1fcHJvdG9jb2xzKHZvaWQgKipvcGFxdWUsIGludCBvdXRwdXQpCit7CisgICAgVVJMUHJvdG9jb2wgKnA7CisgICAgKm9wYXF1ZSA9IGZmdXJsX3Byb3RvY29sX25leHQoKm9wYXF1ZSk7CisgICAgaWYgKCEocCA9ICpvcGFxdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKG91dHB1dCAmJiBwLT51cmxfd3JpdGUpIHx8ICghb3V0cHV0ICYmIHAtPnVybF9yZWFkKSkKKyAgICAgICAgcmV0dXJuIHAtPm5hbWU7CisgICAgcmV0dXJuIGF2aW9fZW51bV9wcm90b2NvbHMob3BhcXVlLCBvdXRwdXQpOworfQorCitpbnQgZmZ1cmxfcmVnaXN0ZXJfcHJvdG9jb2woVVJMUHJvdG9jb2wgKnByb3RvY29sKQoreworICAgIFVSTFByb3RvY29sICoqcDsKKyAgICBwID0gJmZpcnN0X3Byb3RvY29sOworICAgIHdoaWxlICgqcCkKKyAgICAgICAgcCA9ICYoKnApLT5uZXh0OworICAgICpwICAgICAgICAgICAgID0gcHJvdG9jb2w7CisgICAgcHJvdG9jb2wtPm5leHQgPSBOVUxMOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVybF9hbGxvY19mb3JfcHJvdG9jb2woVVJMQ29udGV4dCAqKnB1Yywgc3RydWN0IFVSTFByb3RvY29sICp1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWSU9JbnRlcnJ1cHRDQiAqaW50X2NiKQoreworICAgIFVSTENvbnRleHQgKnVjOworICAgIGludCBlcnI7CisKKyNpZiBDT05GSUdfTkVUV09SSworICAgIGlmICh1cC0+ZmxhZ3MgJiBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLICYmICFmZl9uZXR3b3JrX2luaXQoKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyNlbmRpZgorICAgIGlmICgoZmxhZ3MgJiBBVklPX0ZMQUdfUkVBRCkgJiYgIXVwLT51cmxfcmVhZCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkltcG9zc2libGUgdG8gb3BlbiB0aGUgJyVzJyBwcm90b2NvbCBmb3IgcmVhZGluZ1xuIiwgdXAtPm5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBpZiAoKGZsYWdzICYgQVZJT19GTEFHX1dSSVRFKSAmJiAhdXAtPnVybF93cml0ZSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkltcG9zc2libGUgdG8gb3BlbiB0aGUgJyVzJyBwcm90b2NvbCBmb3Igd3JpdGluZ1xuIiwgdXAtPm5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICB1YyA9IGF2X21hbGxvY3ooc2l6ZW9mKFVSTENvbnRleHQpICsgc3RybGVuKGZpbGVuYW1lKSArIDEpOworICAgIGlmICghdWMpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHVjLT5hdl9jbGFzcyA9ICZmZnVybF9jb250ZXh0X2NsYXNzOworICAgIHVjLT5maWxlbmFtZSA9IChjaGFyICopJnVjWzFdOworICAgIHN0cmNweSh1Yy0+ZmlsZW5hbWUsIGZpbGVuYW1lKTsKKyAgICB1Yy0+cHJvdCAgICAgICAgICAgID0gdXA7CisgICAgdWMtPmZsYWdzICAgICAgICAgICA9IGZsYWdzOworICAgIHVjLT5pc19zdHJlYW1lZCAgICAgPSAwOyAvKiBkZWZhdWx0ID0gbm90IHN0cmVhbWVkICovCisgICAgdWMtPm1heF9wYWNrZXRfc2l6ZSA9IDA7IC8qIGRlZmF1bHQ6IHN0cmVhbSBmaWxlICovCisgICAgaWYgKHVwLT5wcml2X2RhdGFfc2l6ZSkgeworICAgICAgICB1Yy0+cHJpdl9kYXRhID0gYXZfbWFsbG9jeih1cC0+cHJpdl9kYXRhX3NpemUpOworICAgICAgICBpZiAoIXVjLT5wcml2X2RhdGEpIHsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAodXAtPnByaXZfZGF0YV9jbGFzcykgeworICAgICAgICAgICAgaW50IHByb3RvX2xlbj0gc3RybGVuKHVwLT5uYW1lKTsKKyAgICAgICAgICAgIGNoYXIgKnN0YXJ0ID0gc3RyY2hyKHVjLT5maWxlbmFtZSwgJywnKTsKKyAgICAgICAgICAgICooY29uc3QgQVZDbGFzcyAqKil1Yy0+cHJpdl9kYXRhID0gdXAtPnByaXZfZGF0YV9jbGFzczsKKyAgICAgICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHModWMtPnByaXZfZGF0YSk7CisgICAgICAgICAgICBpZighc3RybmNtcCh1cC0+bmFtZSwgdWMtPmZpbGVuYW1lLCBwcm90b19sZW4pICYmIHVjLT5maWxlbmFtZSArIHByb3RvX2xlbiA9PSBzdGFydCl7CisgICAgICAgICAgICAgICAgaW50IHJldD0gMDsKKyAgICAgICAgICAgICAgICBjaGFyICpwPSBzdGFydDsKKyAgICAgICAgICAgICAgICBjaGFyIHNlcD0gKisrcDsKKyAgICAgICAgICAgICAgICBjaGFyICprZXksICp2YWw7CisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgIHdoaWxlKHJldCA+PSAwICYmIChrZXk9IHN0cmNocihwLCBzZXApKSAmJiBwPGtleSAmJiAodmFsID0gc3RyY2hyKGtleSsxLCBzZXApKSl7CisgICAgICAgICAgICAgICAgICAgICp2YWw9ICprZXk9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldD0gYXZfb3B0X3NldCh1Yy0+cHJpdl9kYXRhLCBwLCBrZXkrMSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHVjLCBBVl9MT0dfRVJST1IsICJLZXkgJyVzJyBub3QgZm91bmQuXG4iLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgKnZhbD0gKmtleT0gc2VwOworICAgICAgICAgICAgICAgICAgICBwPSB2YWwrMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYocmV0PDAgfHwgcCE9a2V5KXsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHVjLCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIG9wdGlvbnMgc3RyaW5nICVzXG4iLCBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZ1Yy0+cHJpdl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnVjKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbW1vdmUoc3RhcnQsIGtleSsxLCBzdHJsZW4oa2V5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGludF9jYikKKyAgICAgICAgdWMtPmludGVycnVwdF9jYWxsYmFjayA9ICppbnRfY2I7CisKKyAgICAqcHVjID0gdWM7CisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgICpwdWMgPSBOVUxMOworICAgIGlmICh1YykKKyAgICAgICAgYXZfZnJlZXAoJnVjLT5wcml2X2RhdGEpOworICAgIGF2X2ZyZWVwKCZ1Yyk7CisjaWYgQ09ORklHX05FVFdPUksKKyAgICBpZiAodXAtPmZsYWdzICYgVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSykKKyAgICAgICAgZmZfbmV0d29ya19jbG9zZSgpOworI2VuZGlmCisgICAgcmV0dXJuIGVycjsKK30KKworaW50IGZmdXJsX2Nvbm5lY3QoVVJMQ29udGV4dCAqdWMsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCit7CisgICAgaW50IGVyciA9CisgICAgICAgIHVjLT5wcm90LT51cmxfb3BlbjIgPyB1Yy0+cHJvdC0+dXJsX29wZW4yKHVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Yy0+ZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucykgOgorICAgICAgICB1Yy0+cHJvdC0+dXJsX29wZW4odWMsIHVjLT5maWxlbmFtZSwgdWMtPmZsYWdzKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIHVjLT5pc19jb25uZWN0ZWQgPSAxOworICAgIC8qIFdlIG11c3QgYmUgY2FyZWZ1bCBoZXJlIGFzIGZmdXJsX3NlZWsoKSBjb3VsZCBiZSBzbG93LAorICAgICAqIGZvciBleGFtcGxlIGZvciBodHRwICovCisgICAgaWYgKCh1Yy0+ZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUpIHx8ICFzdHJjbXAodWMtPnByb3QtPm5hbWUsICJmaWxlIikpCisgICAgICAgIGlmICghdWMtPmlzX3N0cmVhbWVkICYmIGZmdXJsX3NlZWsodWMsIDAsIFNFRUtfU0VUKSA8IDApCisgICAgICAgICAgICB1Yy0+aXNfc3RyZWFtZWQgPSAxOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFVSTF9TQ0hFTUVfQ0hBUlMgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiAgICAgICAgICAgICAgICBcCisgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIiAgICAgICAgICAgICAgICBcCisgICAgIjAxMjM0NTY3ODkrLS4iCisKK3N0YXRpYyBzdHJ1Y3QgVVJMUHJvdG9jb2wgKnVybF9maW5kX3Byb3RvY29sKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIFVSTFByb3RvY29sICp1cCA9IE5VTEw7CisgICAgY2hhciBwcm90b19zdHJbMTI4XSwgcHJvdG9fbmVzdGVkWzEyOF0sICpwdHI7CisgICAgc2l6ZV90IHByb3RvX2xlbiA9IHN0cnNwbihmaWxlbmFtZSwgVVJMX1NDSEVNRV9DSEFSUyk7CisKKyAgICBpZiAoZmlsZW5hbWVbcHJvdG9fbGVuXSAhPSAnOicgJiYKKyAgICAgICAgKGZpbGVuYW1lW3Byb3RvX2xlbl0gIT0gJywnIHx8ICFzdHJjaHIoZmlsZW5hbWUgKyBwcm90b19sZW4gKyAxLCAnOicpKSB8fAorICAgICAgICBpc19kb3NfcGF0aChmaWxlbmFtZSkpCisgICAgICAgIHN0cmNweShwcm90b19zdHIsICJmaWxlIik7CisgICAgZWxzZQorICAgICAgICBhdl9zdHJsY3B5KHByb3RvX3N0ciwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgRkZNSU4ocHJvdG9fbGVuICsgMSwgc2l6ZW9mKHByb3RvX3N0cikpKTsKKworICAgIGlmICgocHRyID0gc3RyY2hyKHByb3RvX3N0ciwgJywnKSkpCisgICAgICAgICpwdHIgPSAnXDAnOworICAgIGF2X3N0cmxjcHkocHJvdG9fbmVzdGVkLCBwcm90b19zdHIsIHNpemVvZihwcm90b19uZXN0ZWQpKTsKKyAgICBpZiAoKHB0ciA9IHN0cmNocihwcm90b19uZXN0ZWQsICcrJykpKQorICAgICAgICAqcHRyID0gJ1wwJzsKKworICAgIHdoaWxlICh1cCA9IGZmdXJsX3Byb3RvY29sX25leHQodXApKSB7CisgICAgICAgIGlmICghc3RyY21wKHByb3RvX3N0ciwgdXAtPm5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmICh1cC0+ZmxhZ3MgJiBVUkxfUFJPVE9DT0xfRkxBR19ORVNURURfU0NIRU1FICYmCisgICAgICAgICAgICAhc3RyY21wKHByb3RvX25lc3RlZCwgdXAtPm5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHVwOworfQorCitpbnQgZmZ1cmxfYWxsb2MoVVJMQ29udGV4dCAqKnB1YywgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBBVklPSW50ZXJydXB0Q0IgKmludF9jYikKK3sKKyAgICBVUkxQcm90b2NvbCAqcCA9IE5VTEw7CisKKyAgICBpZiAoIWZpcnN0X3Byb3RvY29sKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIk5vIFVSTCBQcm90b2NvbHMgYXJlIHJlZ2lzdGVyZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBjYWxsIHRvIGF2X3JlZ2lzdGVyX2FsbCgpP1xuIik7CisgICAgfQorCisgICAgcCA9IHVybF9maW5kX3Byb3RvY29sKGZpbGVuYW1lKTsKKyAgICBpZiAocCkKKyAgICAgICByZXR1cm4gdXJsX2FsbG9jX2Zvcl9wcm90b2NvbChwdWMsIHAsIGZpbGVuYW1lLCBmbGFncywgaW50X2NiKTsKKworICAgICpwdWMgPSBOVUxMOworICAgIGlmIChhdl9zdHJzdGFydChmaWxlbmFtZSwgImh0dHBzOiIsIE5VTEwpKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJodHRwcyBwcm90b2NvbCBub3QgZm91bmQsIHJlY29tcGlsZSB3aXRoIG9wZW5zc2wgb3IgZ251dGxzIGVuYWJsZWQuXG4iKTsKKyAgICByZXR1cm4gQVZFUlJPUl9QUk9UT0NPTF9OT1RfRk9VTkQ7Cit9CisKK2ludCBmZnVybF9vcGVuKFVSTENvbnRleHQgKipwdWMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICBjb25zdCBBVklPSW50ZXJydXB0Q0IgKmludF9jYiwgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykKK3sKKyAgICBpbnQgcmV0ID0gZmZ1cmxfYWxsb2MocHVjLCBmaWxlbmFtZSwgZmxhZ3MsIGludF9jYik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKG9wdGlvbnMgJiYgKCpwdWMpLT5wcm90LT5wcml2X2RhdGFfY2xhc3MgJiYKKyAgICAgICAgKHJldCA9IGF2X29wdF9zZXRfZGljdCgoKnB1YyktPnByaXZfZGF0YSwgb3B0aW9ucykpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmICgocmV0ID0gYXZfb3B0X3NldF9kaWN0KCpwdWMsIG9wdGlvbnMpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICByZXQgPSBmZnVybF9jb25uZWN0KCpwdWMsIG9wdGlvbnMpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgZmZ1cmxfY2xvc2UoKnB1Yyk7CisgICAgKnB1YyA9IE5VTEw7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmV0cnlfdHJhbnNmZXJfd3JhcHBlcihVUkxDb250ZXh0ICpoLCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgc2l6ZV9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKnRyYW5zZmVyX2Z1bmMpKFVSTENvbnRleHQgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpKQoreworICAgIGludCByZXQsIGxlbjsKKyAgICBpbnQgZmFzdF9yZXRyaWVzID0gNTsKKyAgICBpbnQ2NF90IHdhaXRfc2luY2UgPSAwOworCisgICAgbGVuID0gMDsKKyAgICB3aGlsZSAobGVuIDwgc2l6ZV9taW4pIHsKKyAgICAgICAgaWYgKGZmX2NoZWNrX2ludGVycnVwdCgmaC0+aW50ZXJydXB0X2NhbGxiYWNrKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisgICAgICAgIHJldCA9IHRyYW5zZmVyX2Z1bmMoaCwgYnVmICsgbGVuLCBzaXplIC0gbGVuKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVJTlRSKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfTk9OQkxPQ0spCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSkgeworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGlmIChmYXN0X3JldHJpZXMpIHsKKyAgICAgICAgICAgICAgICBmYXN0X3JldHJpZXMtLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGgtPnJ3X3RpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3YWl0X3NpbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgd2FpdF9zaW5jZSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXZfZ2V0dGltZV9yZWxhdGl2ZSgpID4gd2FpdF9zaW5jZSArIGgtPnJ3X3RpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl91c2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMSkKKyAgICAgICAgICAgIHJldHVybiAocmV0IDwgMCAmJiByZXQgIT0gQVZFUlJPUl9FT0YpID8gcmV0IDogbGVuOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgZmFzdF9yZXRyaWVzID0gRkZNQVgoZmFzdF9yZXRyaWVzLCAyKTsKKyAgICAgICAgbGVuICs9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworaW50IGZmdXJsX3JlYWQoVVJMQ29udGV4dCAqaCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpZiAoIShoLT5mbGFncyAmIEFWSU9fRkxBR19SRUFEKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICByZXR1cm4gcmV0cnlfdHJhbnNmZXJfd3JhcHBlcihoLCBidWYsIHNpemUsIDEsIGgtPnByb3QtPnVybF9yZWFkKTsKK30KKworaW50IGZmdXJsX3JlYWRfY29tcGxldGUoVVJMQ29udGV4dCAqaCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpZiAoIShoLT5mbGFncyAmIEFWSU9fRkxBR19SRUFEKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICByZXR1cm4gcmV0cnlfdHJhbnNmZXJfd3JhcHBlcihoLCBidWYsIHNpemUsIHNpemUsIGgtPnByb3QtPnVybF9yZWFkKTsKK30KKworaW50IGZmdXJsX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgaWYgKCEoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIC8qIGF2b2lkIHNlbmRpbmcgdG9vIGJpZyBwYWNrZXRzICovCisgICAgaWYgKGgtPm1heF9wYWNrZXRfc2l6ZSAmJiBzaXplID4gaC0+bWF4X3BhY2tldF9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgcmV0dXJuIHJldHJ5X3RyYW5zZmVyX3dyYXBwZXIoaCwgKHVuc2lnbmVkIGNoYXIgKilidWYsIHNpemUsIHNpemUsICh2b2lkKiloLT5wcm90LT51cmxfd3JpdGUpOworfQorCitpbnQ2NF90IGZmdXJsX3NlZWsoVVJMQ29udGV4dCAqaCwgaW50NjRfdCBwb3MsIGludCB3aGVuY2UpCit7CisgICAgaW50NjRfdCByZXQ7CisKKyAgICBpZiAoIWgtPnByb3QtPnVybF9zZWVrKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIHJldCA9IGgtPnByb3QtPnVybF9zZWVrKGgsIHBvcywgd2hlbmNlICYgfkFWU0VFS19GT1JDRSk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmdXJsX2Nsb3NlcChVUkxDb250ZXh0ICoqaGgpCit7CisgICAgVVJMQ29udGV4dCAqaD0gKmhoOworICAgIGludCByZXQgPSAwOworICAgIGlmICghaCkKKyAgICAgICAgcmV0dXJuIDA7ICAgICAvKiBjYW4gaGFwcGVuIHdoZW4gZmZ1cmxfb3BlbiBmYWlscyAqLworCisgICAgaWYgKGgtPmlzX2Nvbm5lY3RlZCAmJiBoLT5wcm90LT51cmxfY2xvc2UpCisgICAgICAgIHJldCA9IGgtPnByb3QtPnVybF9jbG9zZShoKTsKKyNpZiBDT05GSUdfTkVUV09SSworICAgIGlmIChoLT5wcm90LT5mbGFncyAmIFVSTF9QUk9UT0NPTF9GTEFHX05FVFdPUkspCisgICAgICAgIGZmX25ldHdvcmtfY2xvc2UoKTsKKyNlbmRpZgorICAgIGlmIChoLT5wcm90LT5wcml2X2RhdGFfc2l6ZSkgeworICAgICAgICBpZiAoaC0+cHJvdC0+cHJpdl9kYXRhX2NsYXNzKQorICAgICAgICAgICAgYXZfb3B0X2ZyZWUoaC0+cHJpdl9kYXRhKTsKKyAgICAgICAgYXZfZnJlZXAoJmgtPnByaXZfZGF0YSk7CisgICAgfQorICAgIGF2X2ZyZWVwKGhoKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZ1cmxfY2xvc2UoVVJMQ29udGV4dCAqaCkKK3sKKyAgICByZXR1cm4gZmZ1cmxfY2xvc2VwKCZoKTsKK30KKworCitjb25zdCBjaGFyICphdmlvX2ZpbmRfcHJvdG9jb2xfbmFtZShjb25zdCBjaGFyICp1cmwpCit7CisgICAgVVJMUHJvdG9jb2wgKnAgPSB1cmxfZmluZF9wcm90b2NvbCh1cmwpOworCisgICAgcmV0dXJuIHAgPyBwLT5uYW1lIDogTlVMTDsKK30KKworaW50IGF2aW9fY2hlY2soY29uc3QgY2hhciAqdXJsLCBpbnQgZmxhZ3MpCit7CisgICAgVVJMQ29udGV4dCAqaDsKKyAgICBpbnQgcmV0ID0gZmZ1cmxfYWxsb2MoJmgsIHVybCwgZmxhZ3MsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGgtPnByb3QtPnVybF9jaGVjaykgeworICAgICAgICByZXQgPSBoLT5wcm90LT51cmxfY2hlY2soaCwgZmxhZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IGZmdXJsX2Nvbm5lY3QoaCwgTlVMTCk7CisgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgIHJldCA9IGZsYWdzOworICAgIH0KKworICAgIGZmdXJsX2Nsb3NlKGgpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludDY0X3QgZmZ1cmxfc2l6ZShVUkxDb250ZXh0ICpoKQoreworICAgIGludDY0X3QgcG9zLCBzaXplOworCisgICAgc2l6ZSA9IGZmdXJsX3NlZWsoaCwgMCwgQVZTRUVLX1NJWkUpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBwb3MgPSBmZnVybF9zZWVrKGgsIDAsIFNFRUtfQ1VSKTsKKyAgICAgICAgaWYgKChzaXplID0gZmZ1cmxfc2VlayhoLCAtMSwgU0VFS19FTkQpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgc2l6ZSsrOworICAgICAgICBmZnVybF9zZWVrKGgsIHBvcywgU0VFS19TRVQpOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKworaW50IGZmdXJsX2dldF9maWxlX2hhbmRsZShVUkxDb250ZXh0ICpoKQoreworICAgIGlmICghaC0+cHJvdC0+dXJsX2dldF9maWxlX2hhbmRsZSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBoLT5wcm90LT51cmxfZ2V0X2ZpbGVfaGFuZGxlKGgpOworfQorCitpbnQgZmZ1cmxfZ2V0X211bHRpX2ZpbGVfaGFuZGxlKFVSTENvbnRleHQgKmgsIGludCAqKmhhbmRsZXMsIGludCAqbnVtaGFuZGxlcykKK3sKKyAgICBpZiAoIWgtPnByb3QtPnVybF9nZXRfbXVsdGlfZmlsZV9oYW5kbGUpIHsKKyAgICAgICAgaWYgKCFoLT5wcm90LT51cmxfZ2V0X2ZpbGVfaGFuZGxlKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgKmhhbmRsZXMgPSBhdl9tYWxsb2Moc2l6ZW9mKCoqaGFuZGxlcykpOworICAgICAgICBpZiAoISpoYW5kbGVzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgKm51bWhhbmRsZXMgPSAxOworICAgICAgICAqaGFuZGxlc1swXSA9IGgtPnByb3QtPnVybF9nZXRfZmlsZV9oYW5kbGUoaCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gaC0+cHJvdC0+dXJsX2dldF9tdWx0aV9maWxlX2hhbmRsZShoLCBoYW5kbGVzLCBudW1oYW5kbGVzKTsKK30KKworaW50IGZmdXJsX3NodXRkb3duKFVSTENvbnRleHQgKmgsIGludCBmbGFncykKK3sKKyAgICBpZiAoIWgtPnByb3QtPnVybF9zaHV0ZG93bikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICByZXR1cm4gaC0+cHJvdC0+dXJsX3NodXRkb3duKGgsIGZsYWdzKTsKK30KKworaW50IGZmX2NoZWNrX2ludGVycnVwdChBVklPSW50ZXJydXB0Q0IgKmNiKQoreworICAgIGludCByZXQ7CisgICAgaWYgKGNiICYmIGNiLT5jYWxsYmFjayAmJiAocmV0ID0gY2ItPmNhbGxiYWNrKGNiLT5vcGFxdWUpKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmlvLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvYXZpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjQwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXZpby5oCkBAIC0wLDAgKzEsNTI4IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2lmbmRlZiBBVkZPUk1BVF9BVklPX0gKKyNkZWZpbmUgQVZGT1JNQVRfQVZJT19ICisKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdmZfaW8KKyAqIEJ1ZmZlcmVkIEkvTyBvcGVyYXRpb25zCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorCisjaW5jbHVkZSAibGliYXZmb3JtYXQvdmVyc2lvbi5oIgorCisKKyNkZWZpbmUgQVZJT19TRUVLQUJMRV9OT1JNQUwgMHgwMDAxIC8qKjwgU2Vla2luZyB3b3JrcyBsaWtlIGZvciBhIGxvY2FsIGZpbGUgKi8KKworLyoqCisgKiBDYWxsYmFjayBmb3IgY2hlY2tpbmcgd2hldGhlciB0byBhYm9ydCBibG9ja2luZyBmdW5jdGlvbnMuCisgKiBBVkVSUk9SX0VYSVQgaXMgcmV0dXJuZWQgaW4gdGhpcyBjYXNlIGJ5IHRoZSBpbnRlcnJ1cHRlZAorICogZnVuY3Rpb24uIER1cmluZyBibG9ja2luZyBvcGVyYXRpb25zLCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorICogb3BhcXVlIGFzIHBhcmFtZXRlci4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgMSwgdGhlCisgKiBibG9ja2luZyBvcGVyYXRpb24gd2lsbCBiZSBhYm9ydGVkLgorICoKKyAqIE5vIG1lbWJlcnMgY2FuIGJlIGFkZGVkIHRvIHRoaXMgc3RydWN0IHdpdGhvdXQgYSBtYWpvciBidW1wLCBpZgorICogbmV3IGVsZW1lbnRzIGhhdmUgYmVlbiBhZGRlZCBhZnRlciB0aGlzIHN0cnVjdCBpbiBBVkZvcm1hdENvbnRleHQKKyAqIG9yIEFWSU9Db250ZXh0LgorICovCit0eXBlZGVmIHN0cnVjdCBBVklPSW50ZXJydXB0Q0IgeworICAgIGludCAoKmNhbGxiYWNrKSh2b2lkKik7CisgICAgdm9pZCAqb3BhcXVlOworfSBBVklPSW50ZXJydXB0Q0I7CisKKy8qKgorICogQnl0ZXN0cmVhbSBJTyBDb250ZXh0LgorICogTmV3IGZpZWxkcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGVuZCB3aXRoIG1pbm9yIHZlcnNpb24gYnVtcHMuCisgKiBSZW1vdmFsLCByZW9yZGVyaW5nIGFuZCBjaGFuZ2VzIHRvIGV4aXN0aW5nIGZpZWxkcyByZXF1aXJlIGEgbWFqb3IKKyAqIHZlcnNpb24gYnVtcC4KKyAqIHNpemVvZihBVklPQ29udGV4dCkgbXVzdCBub3QgYmUgdXNlZCBvdXRzaWRlIGxpYmF2Ki4KKyAqCisgKiBAbm90ZSBOb25lIG9mIHRoZSBmdW5jdGlvbiBwb2ludGVycyBpbiBBVklPQ29udGV4dCBzaG91bGQgYmUgY2FsbGVkCisgKiAgICAgICBkaXJlY3RseSwgdGhleSBzaG91bGQgb25seSBiZSBzZXQgYnkgdGhlIGNsaWVudCBhcHBsaWNhdGlvbgorICogICAgICAgd2hlbiBpbXBsZW1lbnRpbmcgY3VzdG9tIEkvTy4gTm9ybWFsbHkgdGhlc2UgYXJlIHNldCB0byB0aGUKKyAqICAgICAgIGZ1bmN0aW9uIHBvaW50ZXJzIHNwZWNpZmllZCBpbiBhdmlvX2FsbG9jX2NvbnRleHQoKQorICovCit0eXBlZGVmIHN0cnVjdCBBVklPQ29udGV4dCB7CisgICAgLyoqCisgICAgICogQSBjbGFzcyBmb3IgcHJpdmF0ZSBvcHRpb25zLgorICAgICAqCisgICAgICogSWYgdGhpcyBBVklPQ29udGV4dCBpcyBjcmVhdGVkIGJ5IGF2aW9fb3BlbjIoKSwgYXZfY2xhc3MgaXMgc2V0IGFuZAorICAgICAqIHBhc3NlcyB0aGUgb3B0aW9ucyBkb3duIHRvIHByb3RvY29scy4KKyAgICAgKgorICAgICAqIElmIHRoaXMgQVZJT0NvbnRleHQgaXMgbWFudWFsbHkgYWxsb2NhdGVkLCB0aGVuIGF2X2NsYXNzIG1heSBiZSBzZXQgYnkKKyAgICAgKiB0aGUgY2FsbGVyLgorICAgICAqCisgICAgICogd2FybmluZyAtLSB0aGlzIGZpZWxkIGNhbiBiZSBOVUxMLCBiZSBzdXJlIHRvIG5vdCBwYXNzIHRoaXMgQVZJT0NvbnRleHQKKyAgICAgKiB0byBhbnkgYXZfb3B0XyogZnVuY3Rpb25zIGluIHRoYXQgY2FzZS4KKyAgICAgKi8KKyAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7ICAvKio8IFN0YXJ0IG9mIHRoZSBidWZmZXIuICovCisgICAgaW50IGJ1ZmZlcl9zaXplOyAgICAgICAgLyoqPCBNYXhpbXVtIGJ1ZmZlciBzaXplICovCisgICAgdW5zaWduZWQgY2hhciAqYnVmX3B0cjsgLyoqPCBDdXJyZW50IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpidWZfZW5kOyAvKio8IEVuZCBvZiB0aGUgZGF0YSwgbWF5IGJlIGxlc3MgdGhhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyK2J1ZmZlcl9zaXplIGlmIHRoZSByZWFkIGZ1bmN0aW9uIHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIGRhdGEgdGhhbiByZXF1ZXN0ZWQsIGUuZy4gZm9yIHN0cmVhbXMgd2hlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIG1vcmUgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCB5ZXQuICovCisgICAgdm9pZCAqb3BhcXVlOyAgICAgICAgICAgLyoqPCBBIHByaXZhdGUgcG9pbnRlciwgcGFzc2VkIHRvIHRoZSByZWFkL3dyaXRlL3NlZWsvLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMuICovCisgICAgaW50ICgqcmVhZF9wYWNrZXQpKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpOworICAgIGludCAoKndyaXRlX3BhY2tldCkodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSk7CisgICAgaW50NjRfdCAoKnNlZWspKHZvaWQgKm9wYXF1ZSwgaW50NjRfdCBvZmZzZXQsIGludCB3aGVuY2UpOworICAgIGludDY0X3QgcG9zOyAgICAgICAgICAgIC8qKjwgcG9zaXRpb24gaW4gdGhlIGZpbGUgb2YgdGhlIGN1cnJlbnQgYnVmZmVyICovCisgICAgaW50IG11c3RfZmx1c2g7ICAgICAgICAgLyoqPCB0cnVlIGlmIHRoZSBuZXh0IHNlZWsgc2hvdWxkIGZsdXNoICovCisgICAgaW50IGVvZl9yZWFjaGVkOyAgICAgICAgLyoqPCB0cnVlIGlmIGVvZiByZWFjaGVkICovCisgICAgaW50IHdyaXRlX2ZsYWc7ICAgICAgICAgLyoqPCB0cnVlIGlmIG9wZW4gZm9yIHdyaXRpbmcgKi8KKyAgICBpbnQgbWF4X3BhY2tldF9zaXplOworICAgIHVuc2lnbmVkIGxvbmcgY2hlY2tzdW07CisgICAgdW5zaWduZWQgY2hhciAqY2hlY2tzdW1fcHRyOworICAgIHVuc2lnbmVkIGxvbmcgKCp1cGRhdGVfY2hlY2tzdW0pKHVuc2lnbmVkIGxvbmcgY2hlY2tzdW0sIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpOworICAgIGludCBlcnJvcjsgICAgICAgICAgICAgIC8qKjwgY29udGFpbnMgdGhlIGVycm9yIGNvZGUgb3IgMCBpZiBubyBlcnJvciBoYXBwZW5lZCAqLworICAgIC8qKgorICAgICAqIFBhdXNlIG9yIHJlc3VtZSBwbGF5YmFjayBmb3IgbmV0d29yayBzdHJlYW1pbmcgcHJvdG9jb2xzIC0gZS5nLiBNTVMuCisgICAgICovCisgICAgaW50ICgqcmVhZF9wYXVzZSkodm9pZCAqb3BhcXVlLCBpbnQgcGF1c2UpOworICAgIC8qKgorICAgICAqIFNlZWsgdG8gYSBnaXZlbiB0aW1lc3RhbXAgaW4gc3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBzdHJlYW1faW5kZXguCisgICAgICogTmVlZGVkIGZvciBzb21lIG5ldHdvcmsgc3RyZWFtaW5nIHByb3RvY29scyB3aGljaCBkb24ndCBzdXBwb3J0IHNlZWtpbmcKKyAgICAgKiB0byBieXRlIHBvc2l0aW9uLgorICAgICAqLworICAgIGludDY0X3QgKCpyZWFkX3NlZWspKHZvaWQgKm9wYXF1ZSwgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKTsKKyAgICAvKioKKyAgICAgKiBBIGNvbWJpbmF0aW9uIG9mIEFWSU9fU0VFS0FCTEVfIGZsYWdzIG9yIDAgd2hlbiB0aGUgc3RyZWFtIGlzIG5vdCBzZWVrYWJsZS4KKyAgICAgKi8KKyAgICBpbnQgc2Vla2FibGU7CisKKyAgICAvKioKKyAgICAgKiBtYXggZmlsZXNpemUsIHVzZWQgdG8gbGltaXQgYWxsb2NhdGlvbnMKKyAgICAgKiBUaGlzIGZpZWxkIGlzIGludGVybmFsIHRvIGxpYmF2Zm9ybWF0IGFuZCBhY2Nlc3MgZnJvbSBvdXRzaWRlIGlzIG5vdCBhbGxvd2VkLgorICAgICAqLworICAgIGludDY0X3QgbWF4c2l6ZTsKKworICAgIC8qKgorICAgICAqIGF2aW9fcmVhZCBhbmQgYXZpb193cml0ZSBzaG91bGQgaWYgcG9zc2libGUgYmUgc2F0aXNmaWVkIGRpcmVjdGx5CisgICAgICogaW5zdGVhZCBvZiBnb2luZyB0aHJvdWdoIGEgYnVmZmVyLCBhbmQgYXZpb19zZWVrIHdpbGwgYWx3YXlzCisgICAgICogY2FsbCB0aGUgdW5kZXJseWluZyBzZWVrIGZ1bmN0aW9uIGRpcmVjdGx5LgorICAgICAqLworICAgIGludCBkaXJlY3Q7CisKKyAgICAvKioKKyAgICAgKiBCeXRlcyByZWFkIHN0YXRpc3RpYworICAgICAqIFRoaXMgZmllbGQgaXMgaW50ZXJuYWwgdG8gbGliYXZmb3JtYXQgYW5kIGFjY2VzcyBmcm9tIG91dHNpZGUgaXMgbm90IGFsbG93ZWQuCisgICAgICovCisgICAgaW50NjRfdCBieXRlc19yZWFkOworCisgICAgLyoqCisgICAgICogc2VlayBzdGF0aXN0aWMKKyAgICAgKiBUaGlzIGZpZWxkIGlzIGludGVybmFsIHRvIGxpYmF2Zm9ybWF0IGFuZCBhY2Nlc3MgZnJvbSBvdXRzaWRlIGlzIG5vdCBhbGxvd2VkLgorICAgICAqLworICAgIGludCBzZWVrX2NvdW50OworCisgICAgLyoqCisgICAgICogd3JpdGVvdXQgc3RhdGlzdGljCisgICAgICogVGhpcyBmaWVsZCBpcyBpbnRlcm5hbCB0byBsaWJhdmZvcm1hdCBhbmQgYWNjZXNzIGZyb20gb3V0c2lkZSBpcyBub3QgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBpbnQgd3JpdGVvdXRfY291bnQ7CisKKyAgICAvKioKKyAgICAgKiBPcmlnaW5hbCBidWZmZXIgc2l6ZQorICAgICAqIHVzZWQgaW50ZXJuYWxseSBhZnRlciBwcm9iaW5nIGFuZCBlbnN1cmUgc2Vla2JhY2sgdG8gcmVzZXQgdGhlIGJ1ZmZlciBzaXplCisgICAgICogVGhpcyBmaWVsZCBpcyBpbnRlcm5hbCB0byBsaWJhdmZvcm1hdCBhbmQgYWNjZXNzIGZyb20gb3V0c2lkZSBpcyBub3QgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBpbnQgb3JpZ19idWZmZXJfc2l6ZTsKK30gQVZJT0NvbnRleHQ7CisKKy8qIHVuYnVmZmVyZWQgSS9PICovCisKKy8qKgorICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm90b2NvbCB0aGF0IHdpbGwgaGFuZGxlIHRoZSBwYXNzZWQgVVJMLgorICoKKyAqIE5VTEwgaXMgcmV0dXJuZWQgaWYgbm8gcHJvdG9jb2wgY291bGQgYmUgZm91bmQgZm9yIHRoZSBnaXZlbiBVUkwuCisgKgorICogQHJldHVybiBOYW1lIG9mIHRoZSBwcm90b2NvbCBvciBOVUxMLgorICovCitjb25zdCBjaGFyICphdmlvX2ZpbmRfcHJvdG9jb2xfbmFtZShjb25zdCBjaGFyICp1cmwpOworCisvKioKKyAqIFJldHVybiBBVklPX0ZMQUdfKiBhY2Nlc3MgZmxhZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgYWNjZXNzIHBlcm1pc3Npb25zCisgKiBvZiB0aGUgcmVzb3VyY2UgaW4gdXJsLCBvciBhIG5lZ2F0aXZlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4KKyAqIEFWRVJST1IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuIFRoZSByZXR1cm5lZCBhY2Nlc3MgZmxhZ3MgYXJlCisgKiBtYXNrZWQgYnkgdGhlIHZhbHVlIGluIGZsYWdzLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgaW50cmluc2ljYWxseSB1bnNhZmUsIGluIHRoZSBzZW5zZSB0aGF0IHRoZQorICogY2hlY2tlZCByZXNvdXJjZSBtYXkgY2hhbmdlIGl0cyBleGlzdGVuY2Ugb3IgcGVybWlzc2lvbiBzdGF0dXMgZnJvbQorICogb25lIGNhbGwgdG8gYW5vdGhlci4gVGh1cyB5b3Ugc2hvdWxkIG5vdCB0cnVzdCB0aGUgcmV0dXJuZWQgdmFsdWUsCisgKiB1bmxlc3MgeW91IGFyZSBzdXJlIHRoYXQgbm8gb3RoZXIgcHJvY2Vzc2VzIGFyZSBhY2Nlc3NpbmcgdGhlCisgKiBjaGVja2VkIHJlc291cmNlLgorICovCitpbnQgYXZpb19jaGVjayhjb25zdCBjaGFyICp1cmwsIGludCBmbGFncyk7CisKKy8qKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gQVZJT0NvbnRleHQgZm9yIGJ1ZmZlcmVkIEkvTy4gSXQgbXVzdCBiZSBsYXRlcgorICogZnJlZWQgd2l0aCBhdl9mcmVlKCkuCisgKgorICogQHBhcmFtIGJ1ZmZlciBNZW1vcnkgYmxvY2sgZm9yIGlucHV0L291dHB1dCBvcGVyYXRpb25zIHZpYSBBVklPQ29udGV4dC4KKyAqICAgICAgICBUaGUgYnVmZmVyIG11c3QgYmUgYWxsb2NhdGVkIHdpdGggYXZfbWFsbG9jKCkgYW5kIGZyaWVuZHMuCisgKiAgICAgICAgSXQgbWF5IGJlIGZyZWVkIGFuZCByZXBsYWNlZCB3aXRoIGEgbmV3IGJ1ZmZlciBieSBsaWJhdmZvcm1hdC4KKyAqICAgICAgICBBVklPQ29udGV4dC5idWZmZXIgaG9sZHMgdGhlIGJ1ZmZlciBjdXJyZW50bHkgaW4gdXNlLAorICogICAgICAgIHdoaWNoIG11c3QgYmUgbGF0ZXIgZnJlZWQgd2l0aCBhdl9mcmVlKCkuCisgKiBAcGFyYW0gYnVmZmVyX3NpemUgVGhlIGJ1ZmZlciBzaXplIGlzIHZlcnkgaW1wb3J0YW50IGZvciBwZXJmb3JtYW5jZS4KKyAqICAgICAgICBGb3IgcHJvdG9jb2xzIHdpdGggZml4ZWQgYmxvY2tzaXplIGl0IHNob3VsZCBiZSBzZXQgdG8gdGhpcyBibG9ja3NpemUuCisgKiAgICAgICAgRm9yIG90aGVycyBhIHR5cGljYWwgc2l6ZSBpcyBhIGNhY2hlIHBhZ2UsIGUuZy4gNGtiLgorICogQHBhcmFtIHdyaXRlX2ZsYWcgU2V0IHRvIDEgaWYgdGhlIGJ1ZmZlciBzaG91bGQgYmUgd3JpdGFibGUsIDAgb3RoZXJ3aXNlLgorICogQHBhcmFtIG9wYXF1ZSBBbiBvcGFxdWUgcG9pbnRlciB0byB1c2VyLXNwZWNpZmljIGRhdGEuCisgKiBAcGFyYW0gcmVhZF9wYWNrZXQgIEEgZnVuY3Rpb24gZm9yIHJlZmlsbGluZyB0aGUgYnVmZmVyLCBtYXkgYmUgTlVMTC4KKyAqIEBwYXJhbSB3cml0ZV9wYWNrZXQgQSBmdW5jdGlvbiBmb3Igd3JpdGluZyB0aGUgYnVmZmVyIGNvbnRlbnRzLCBtYXkgYmUgTlVMTC4KKyAqICAgICAgICBUaGUgZnVuY3Rpb24gbWF5IG5vdCBjaGFuZ2UgdGhlIGlucHV0IGJ1ZmZlcnMgY29udGVudC4KKyAqIEBwYXJhbSBzZWVrIEEgZnVuY3Rpb24gZm9yIHNlZWtpbmcgdG8gc3BlY2lmaWVkIGJ5dGUgcG9zaXRpb24sIG1heSBiZSBOVUxMLgorICoKKyAqIEByZXR1cm4gQWxsb2NhdGVkIEFWSU9Db250ZXh0IG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqLworQVZJT0NvbnRleHQgKmF2aW9fYWxsb2NfY29udGV4dCgKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIGludCBidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgIGludCB3cml0ZV9mbGFnLAorICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgaW50ICgqcmVhZF9wYWNrZXQpKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpLAorICAgICAgICAgICAgICAgICAgaW50ICgqd3JpdGVfcGFja2V0KSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKSwKKyAgICAgICAgICAgICAgICAgIGludDY0X3QgKCpzZWVrKSh2b2lkICpvcGFxdWUsIGludDY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSk7CisKK3ZvaWQgYXZpb193OChBVklPQ29udGV4dCAqcywgaW50IGIpOwordm9pZCBhdmlvX3dyaXRlKEFWSU9Db250ZXh0ICpzLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKTsKK3ZvaWQgYXZpb193bDY0KEFWSU9Db250ZXh0ICpzLCB1aW50NjRfdCB2YWwpOwordm9pZCBhdmlvX3diNjQoQVZJT0NvbnRleHQgKnMsIHVpbnQ2NF90IHZhbCk7Cit2b2lkIGF2aW9fd2wzMihBVklPQ29udGV4dCAqcywgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIGF2aW9fd2IzMihBVklPQ29udGV4dCAqcywgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIGF2aW9fd2wyNChBVklPQ29udGV4dCAqcywgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIGF2aW9fd2IyNChBVklPQ29udGV4dCAqcywgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIGF2aW9fd2wxNihBVklPQ29udGV4dCAqcywgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIGF2aW9fd2IxNihBVklPQ29udGV4dCAqcywgdW5zaWduZWQgaW50IHZhbCk7CisKKy8qKgorICogV3JpdGUgYSBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nLgorICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KKyAqLworaW50IGF2aW9fcHV0X3N0cihBVklPQ29udGV4dCAqcywgY29uc3QgY2hhciAqc3RyKTsKKworLyoqCisgKiBDb252ZXJ0IGFuIFVURi04IHN0cmluZyB0byBVVEYtMTZMRSBhbmQgd3JpdGUgaXQuCisgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorICovCitpbnQgYXZpb19wdXRfc3RyMTZsZShBVklPQ29udGV4dCAqcywgY29uc3QgY2hhciAqc3RyKTsKKworLyoqCisgKiBQYXNzaW5nIHRoaXMgYXMgdGhlICJ3aGVuY2UiIHBhcmFtZXRlciB0byBhIHNlZWsgZnVuY3Rpb24gY2F1c2VzIGl0IHRvCisgKiByZXR1cm4gdGhlIGZpbGVzaXplIHdpdGhvdXQgc2Vla2luZyBhbnl3aGVyZS4gU3VwcG9ydGluZyB0aGlzIGlzIG9wdGlvbmFsLgorICogSWYgaXQgaXMgbm90IHN1cHBvcnRlZCB0aGVuIHRoZSBzZWVrIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDwwLgorICovCisjZGVmaW5lIEFWU0VFS19TSVpFIDB4MTAwMDAKKworLyoqCisgKiBPcmluZyB0aGlzIGZsYWcgYXMgaW50byB0aGUgIndoZW5jZSIgcGFyYW1ldGVyIHRvIGEgc2VlayBmdW5jdGlvbiBjYXVzZXMgaXQgdG8KKyAqIHNlZWsgYnkgYW55IG1lYW5zIChsaWtlIHJlb3BlbmluZyBhbmQgbGluZWFyIHJlYWRpbmcpIG9yIG90aGVyIG5vcm1hbGx5IHVucmVhc29uYWJsZQorICogbWVhbnMgdGhhdCBjYW4gYmUgZXh0cmVtZWx5IHNsb3cuCisgKiBUaGlzIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBzZWVrIGNvZGUuCisgKi8KKyNkZWZpbmUgQVZTRUVLX0ZPUkNFIDB4MjAwMDAKKworLyoqCisgKiBmc2VlaygpIGVxdWl2YWxlbnQgZm9yIEFWSU9Db250ZXh0LgorICogQHJldHVybiBuZXcgcG9zaXRpb24gb3IgQVZFUlJPUi4KKyAqLworaW50NjRfdCBhdmlvX3NlZWsoQVZJT0NvbnRleHQgKnMsIGludDY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKKworLyoqCisgKiBTa2lwIGdpdmVuIG51bWJlciBvZiBieXRlcyBmb3J3YXJkCisgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBvciBBVkVSUk9SLgorICovCitpbnQ2NF90IGF2aW9fc2tpcChBVklPQ29udGV4dCAqcywgaW50NjRfdCBvZmZzZXQpOworCisvKioKKyAqIGZ0ZWxsKCkgZXF1aXZhbGVudCBmb3IgQVZJT0NvbnRleHQuCisgKiBAcmV0dXJuIHBvc2l0aW9uIG9yIEFWRVJST1IuCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludDY0X3QgYXZpb190ZWxsKEFWSU9Db250ZXh0ICpzKQoreworICAgIHJldHVybiBhdmlvX3NlZWsocywgMCwgU0VFS19DVVIpOworfQorCisvKioKKyAqIEdldCB0aGUgZmlsZXNpemUuCisgKiBAcmV0dXJuIGZpbGVzaXplIG9yIEFWRVJST1IKKyAqLworaW50NjRfdCBhdmlvX3NpemUoQVZJT0NvbnRleHQgKnMpOworCisvKioKKyAqIGZlb2YoKSBlcXVpdmFsZW50IGZvciBBVklPQ29udGV4dC4KKyAqIEByZXR1cm4gbm9uIHplcm8gaWYgYW5kIG9ubHkgaWYgZW5kIG9mIGZpbGUKKyAqLworaW50IGF2aW9fZmVvZihBVklPQ29udGV4dCAqcyk7CisjaWYgRkZfQVBJX1VSTF9GRU9GCisvKioKKyAqIEBkZXByZWNhdGVkIHVzZSBhdmlvX2Zlb2YoKQorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IHVybF9mZW9mKEFWSU9Db250ZXh0ICpzKTsKKyNlbmRpZgorCisvKiogQHdhcm5pbmcgY3VycmVudGx5IHNpemUgaXMgbGltaXRlZCAqLworaW50IGF2aW9fcHJpbnRmKEFWSU9Db250ZXh0ICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLikgYXZfcHJpbnRmX2Zvcm1hdCgyLCAzKTsKKworLyoqCisgKiBGb3JjZSBmbHVzaGluZyBvZiBidWZmZXJlZCBkYXRhLgorICoKKyAqIEZvciB3cml0ZSBzdHJlYW1zLCBmb3JjZSB0aGUgYnVmZmVyZWQgZGF0YSB0byBiZSBpbW1lZGlhdGVseSB3cml0dGVuIHRvIHRoZSBvdXRwdXQsCisgKiB3aXRob3V0IHRvIHdhaXQgdG8gZmlsbCB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICoKKyAqIEZvciByZWFkIHN0cmVhbXMsIGRpc2NhcmQgYWxsIGN1cnJlbnRseSBidWZmZXJlZCBkYXRhLCBhbmQgYWR2YW5jZSB0aGUKKyAqIHJlcG9ydGVkIGZpbGUgcG9zaXRpb24gdG8gdGhhdCBvZiB0aGUgdW5kZXJseWluZyBzdHJlYW0uIFRoaXMgZG9lcyBub3QKKyAqIHJlYWQgbmV3IGRhdGEsIGFuZCBkb2VzIG5vdCBwZXJmb3JtIGFueSBzZWVrcy4KKyAqLwordm9pZCBhdmlvX2ZsdXNoKEFWSU9Db250ZXh0ICpzKTsKKworLyoqCisgKiBSZWFkIHNpemUgYnl0ZXMgZnJvbSBBVklPQ29udGV4dCBpbnRvIGJ1Zi4KKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgQVZFUlJPUgorICovCitpbnQgYXZpb19yZWFkKEFWSU9Db250ZXh0ICpzLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKTsKKworLyoqCisgKiBAbmFtZSBGdW5jdGlvbnMgZm9yIHJlYWRpbmcgZnJvbSBBVklPQ29udGV4dAorICogQHsKKyAqCisgKiBAbm90ZSByZXR1cm4gMCBpZiBFT0YsIHNvIHlvdSBjYW5ub3QgdXNlIGl0IGlmIEVPRiBoYW5kbGluZyBpcworICogICAgICAgbmVjZXNzYXJ5CisgKi8KK2ludCAgICAgICAgICBhdmlvX3I4ICAoQVZJT0NvbnRleHQgKnMpOwordW5zaWduZWQgaW50IGF2aW9fcmwxNihBVklPQ29udGV4dCAqcyk7Cit1bnNpZ25lZCBpbnQgYXZpb19ybDI0KEFWSU9Db250ZXh0ICpzKTsKK3Vuc2lnbmVkIGludCBhdmlvX3JsMzIoQVZJT0NvbnRleHQgKnMpOwordWludDY0X3QgICAgIGF2aW9fcmw2NChBVklPQ29udGV4dCAqcyk7Cit1bnNpZ25lZCBpbnQgYXZpb19yYjE2KEFWSU9Db250ZXh0ICpzKTsKK3Vuc2lnbmVkIGludCBhdmlvX3JiMjQoQVZJT0NvbnRleHQgKnMpOwordW5zaWduZWQgaW50IGF2aW9fcmIzMihBVklPQ29udGV4dCAqcyk7Cit1aW50NjRfdCAgICAgYXZpb19yYjY0KEFWSU9Db250ZXh0ICpzKTsKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIFJlYWQgYSBzdHJpbmcgZnJvbSBwYiBpbnRvIGJ1Zi4gVGhlIHJlYWRpbmcgd2lsbCB0ZXJtaW5hdGUgd2hlbiBlaXRoZXIKKyAqIGEgTlVMTCBjaGFyYWN0ZXIgd2FzIGVuY291bnRlcmVkLCBtYXhsZW4gYnl0ZXMgaGF2ZSBiZWVuIHJlYWQsIG9yIG5vdGhpbmcKKyAqIG1vcmUgY2FuIGJlIHJlYWQgZnJvbSBwYi4gVGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIE5VTEwtdGVybWluYXRlZCwgaXQKKyAqIHdpbGwgYmUgdHJ1bmNhdGVkIGlmIGJ1ZiBpcyB0b28gc21hbGwuCisgKiBOb3RlIHRoYXQgdGhlIHN0cmluZyBpcyBub3QgaW50ZXJwcmV0ZWQgb3IgdmFsaWRhdGVkIGluIGFueSB3YXksIGl0CisgKiBtaWdodCBnZXQgdHJ1bmNhdGVkIGluIHRoZSBtaWRkbGUgb2YgYSBzZXF1ZW5jZSBmb3IgbXVsdGktYnl0ZSBlbmNvZGluZ3MuCisgKgorICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZCAoaXMgYWx3YXlzIDw9IG1heGxlbikuCisgKiBJZiByZWFkaW5nIGVuZHMgb24gRU9GIG9yIGVycm9yLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgb25lIG1vcmUgdGhhbgorICogYnl0ZXMgYWN0dWFsbHkgcmVhZC4KKyAqLworaW50IGF2aW9fZ2V0X3N0cihBVklPQ29udGV4dCAqcGIsIGludCBtYXhsZW4sIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CisKKy8qKgorICogUmVhZCBhIFVURi0xNiBzdHJpbmcgZnJvbSBwYiBhbmQgY29udmVydCBpdCB0byBVVEYtOC4KKyAqIFRoZSByZWFkaW5nIHdpbGwgdGVybWluYXRlIHdoZW4gZWl0aGVyIGEgbnVsbCBvciBpbnZhbGlkIGNoYXJhY3RlciB3YXMKKyAqIGVuY291bnRlcmVkIG9yIG1heGxlbiBieXRlcyBoYXZlIGJlZW4gcmVhZC4KKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKGlzIGFsd2F5cyA8PSBtYXhsZW4pCisgKi8KK2ludCBhdmlvX2dldF9zdHIxNmxlKEFWSU9Db250ZXh0ICpwYiwgaW50IG1heGxlbiwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKK2ludCBhdmlvX2dldF9zdHIxNmJlKEFWSU9Db250ZXh0ICpwYiwgaW50IG1heGxlbiwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKKworCisvKioKKyAqIEBuYW1lIFVSTCBvcGVuIG1vZGVzCisgKiBUaGUgZmxhZ3MgYXJndW1lbnQgdG8gYXZpb19vcGVuIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAqIGNvbnN0YW50cywgb3B0aW9uYWxseSBPUmVkIHdpdGggb3RoZXIgZmxhZ3MuCisgKiBAeworICovCisjZGVmaW5lIEFWSU9fRkxBR19SRUFEICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHJlYWQtb25seSAqLworI2RlZmluZSBBVklPX0ZMQUdfV1JJVEUgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB3cml0ZS1vbmx5ICovCisjZGVmaW5lIEFWSU9fRkxBR19SRUFEX1dSSVRFIChBVklPX0ZMQUdfUkVBRHxBVklPX0ZMQUdfV1JJVEUpICAvKio8IHJlYWQtd3JpdGUgcHNldWRvIGZsYWcgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIFVzZSBub24tYmxvY2tpbmcgbW9kZS4KKyAqIElmIHRoaXMgZmxhZyBpcyBzZXQsIG9wZXJhdGlvbnMgb24gdGhlIGNvbnRleHQgd2lsbCByZXR1cm4KKyAqIEFWRVJST1IoRUFHQUlOKSBpZiB0aGV5IGNhbiBub3QgYmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5LgorICogSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIG9wZXJhdGlvbnMgb24gdGhlIGNvbnRleHQgd2lsbCBuZXZlciByZXR1cm4KKyAqIEFWRVJST1IoRUFHQUlOKS4KKyAqIE5vdGUgdGhhdCB0aGlzIGZsYWcgZG9lcyBub3QgYWZmZWN0IHRoZSBvcGVuaW5nL2Nvbm5lY3Rpbmcgb2YgdGhlCisgKiBjb250ZXh0LiBDb25uZWN0aW5nIGEgcHJvdG9jb2wgd2lsbCBhbHdheXMgYmxvY2sgaWYgbmVjZXNzYXJ5IChlLmcuIG9uCisgKiBuZXR3b3JrIHByb3RvY29scykgYnV0IG5ldmVyIGhhbmcgKGUuZy4gb24gYnVzeSBkZXZpY2VzKS4KKyAqIFdhcm5pbmc6IG5vbi1ibG9ja2luZyBwcm90b2NvbHMgaXMgd29yay1pbi1wcm9ncmVzczsgdGhpcyBmbGFnIG1heSBiZQorICogc2lsZW50bHkgaWdub3JlZC4KKyAqLworI2RlZmluZSBBVklPX0ZMQUdfTk9OQkxPQ0sgOAorCisvKioKKyAqIFVzZSBkaXJlY3QgbW9kZS4KKyAqIGF2aW9fcmVhZCBhbmQgYXZpb193cml0ZSBzaG91bGQgaWYgcG9zc2libGUgYmUgc2F0aXNmaWVkIGRpcmVjdGx5CisgKiBpbnN0ZWFkIG9mIGdvaW5nIHRocm91Z2ggYSBidWZmZXIsIGFuZCBhdmlvX3NlZWsgd2lsbCBhbHdheXMKKyAqIGNhbGwgdGhlIHVuZGVybHlpbmcgc2VlayBmdW5jdGlvbiBkaXJlY3RseS4KKyAqLworI2RlZmluZSBBVklPX0ZMQUdfRElSRUNUIDB4ODAwMAorCisvKioKKyAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIEFWSU9Db250ZXh0IGZvciBhY2Nlc3NpbmcgdGhlCisgKiByZXNvdXJjZSBpbmRpY2F0ZWQgYnkgdXJsLgorICogQG5vdGUgV2hlbiB0aGUgcmVzb3VyY2UgaW5kaWNhdGVkIGJ5IHVybCBoYXMgYmVlbiBvcGVuZWQgaW4KKyAqIHJlYWQrd3JpdGUgbW9kZSwgdGhlIEFWSU9Db250ZXh0IGNhbiBiZSB1c2VkIG9ubHkgZm9yIHdyaXRpbmcuCisgKgorICogQHBhcmFtIHMgVXNlZCB0byByZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgQVZJT0NvbnRleHQuCisgKiBJbiBjYXNlIG9mIGZhaWx1cmUgdGhlIHBvaW50ZWQgdG8gdmFsdWUgaXMgc2V0IHRvIE5VTEwuCisgKiBAcGFyYW0gdXJsIHJlc291cmNlIHRvIGFjY2VzcworICogQHBhcmFtIGZsYWdzIGZsYWdzIHdoaWNoIGNvbnRyb2wgaG93IHRoZSByZXNvdXJjZSBpbmRpY2F0ZWQgYnkgdXJsCisgKiBpcyB0byBiZSBvcGVuZWQKKyAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbgorICogQVZFUlJPUiBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgYXZpb19vcGVuKEFWSU9Db250ZXh0ICoqcywgY29uc3QgY2hhciAqdXJsLCBpbnQgZmxhZ3MpOworCisvKioKKyAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIEFWSU9Db250ZXh0IGZvciBhY2Nlc3NpbmcgdGhlCisgKiByZXNvdXJjZSBpbmRpY2F0ZWQgYnkgdXJsLgorICogQG5vdGUgV2hlbiB0aGUgcmVzb3VyY2UgaW5kaWNhdGVkIGJ5IHVybCBoYXMgYmVlbiBvcGVuZWQgaW4KKyAqIHJlYWQrd3JpdGUgbW9kZSwgdGhlIEFWSU9Db250ZXh0IGNhbiBiZSB1c2VkIG9ubHkgZm9yIHdyaXRpbmcuCisgKgorICogQHBhcmFtIHMgVXNlZCB0byByZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgQVZJT0NvbnRleHQuCisgKiBJbiBjYXNlIG9mIGZhaWx1cmUgdGhlIHBvaW50ZWQgdG8gdmFsdWUgaXMgc2V0IHRvIE5VTEwuCisgKiBAcGFyYW0gdXJsIHJlc291cmNlIHRvIGFjY2VzcworICogQHBhcmFtIGZsYWdzIGZsYWdzIHdoaWNoIGNvbnRyb2wgaG93IHRoZSByZXNvdXJjZSBpbmRpY2F0ZWQgYnkgdXJsCisgKiBpcyB0byBiZSBvcGVuZWQKKyAqIEBwYXJhbSBpbnRfY2IgYW4gaW50ZXJydXB0IGNhbGxiYWNrIHRvIGJlIHVzZWQgYXQgdGhlIHByb3RvY29scyBsZXZlbAorICogQHBhcmFtIG9wdGlvbnMgIEEgZGljdGlvbmFyeSBmaWxsZWQgd2l0aCBwcm90b2NvbC1wcml2YXRlIG9wdGlvbnMuIE9uIHJldHVybgorICogdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBkZXN0cm95ZWQgYW5kIHJlcGxhY2VkIHdpdGggYSBkaWN0IGNvbnRhaW5pbmcgb3B0aW9ucworICogdGhhdCB3ZXJlIG5vdCBmb3VuZC4gTWF5IGJlIE5VTEwuCisgKiBAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4KKyAqIEFWRVJST1IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGF2aW9fb3BlbjIoQVZJT0NvbnRleHQgKipzLCBjb25zdCBjaGFyICp1cmwsIGludCBmbGFncywKKyAgICAgICAgICAgICAgIGNvbnN0IEFWSU9JbnRlcnJ1cHRDQiAqaW50X2NiLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKTsKKworLyoqCisgKiBDbG9zZSB0aGUgcmVzb3VyY2UgYWNjZXNzZWQgYnkgdGhlIEFWSU9Db250ZXh0IHMgYW5kIGZyZWUgaXQuCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaWYgcyB3YXMgb3BlbmVkIGJ5IGF2aW9fb3BlbigpLgorICoKKyAqIFRoZSBpbnRlcm5hbCBidWZmZXIgaXMgYXV0b21hdGljYWxseSBmbHVzaGVkIGJlZm9yZSBjbG9zaW5nIHRoZQorICogcmVzb3VyY2UuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGFuIEFWRVJST1IgPCAwIG9uIGVycm9yLgorICogQHNlZSBhdmlvX2Nsb3NlcAorICovCitpbnQgYXZpb19jbG9zZShBVklPQ29udGV4dCAqcyk7CisKKy8qKgorICogQ2xvc2UgdGhlIHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSBBVklPQ29udGV4dCAqcywgZnJlZSBpdAorICogYW5kIHNldCB0aGUgcG9pbnRlciBwb2ludGluZyB0byBpdCB0byBOVUxMLgorICogVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGlmIHMgd2FzIG9wZW5lZCBieSBhdmlvX29wZW4oKS4KKyAqCisgKiBUaGUgaW50ZXJuYWwgYnVmZmVyIGlzIGF1dG9tYXRpY2FsbHkgZmx1c2hlZCBiZWZvcmUgY2xvc2luZyB0aGUKKyAqIHJlc291cmNlLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhbiBBVkVSUk9SIDwgMCBvbiBlcnJvci4KKyAqIEBzZWUgYXZpb19jbG9zZQorICovCitpbnQgYXZpb19jbG9zZXAoQVZJT0NvbnRleHQgKipzKTsKKworCisvKioKKyAqIE9wZW4gYSB3cml0ZSBvbmx5IG1lbW9yeSBzdHJlYW0uCisgKgorICogQHBhcmFtIHMgbmV3IElPIGNvbnRleHQKKyAqIEByZXR1cm4gemVybyBpZiBubyBlcnJvci4KKyAqLworaW50IGF2aW9fb3Blbl9keW5fYnVmKEFWSU9Db250ZXh0ICoqcyk7CisKKy8qKgorICogUmV0dXJuIHRoZSB3cml0dGVuIHNpemUgYW5kIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyLiBUaGUgYnVmZmVyCisgKiBtdXN0IGJlIGZyZWVkIHdpdGggYXZfZnJlZSgpLgorICogUGFkZGluZyBvZiBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFIGlzIGFkZGVkIHRvIHRoZSBidWZmZXIuCisgKgorICogQHBhcmFtIHMgSU8gY29udGV4dAorICogQHBhcmFtIHBidWZmZXIgcG9pbnRlciB0byBhIGJ5dGUgYnVmZmVyCisgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGJ5dGUgYnVmZmVyCisgKi8KK2ludCBhdmlvX2Nsb3NlX2R5bl9idWYoQVZJT0NvbnRleHQgKnMsIHVpbnQ4X3QgKipwYnVmZmVyKTsKKworLyoqCisgKiBJdGVyYXRlIHRocm91Z2ggbmFtZXMgb2YgYXZhaWxhYmxlIHByb3RvY29scy4KKyAqCisgKiBAcGFyYW0gb3BhcXVlIEEgcHJpdmF0ZSBwb2ludGVyIHJlcHJlc2VudGluZyBjdXJyZW50IHByb3RvY29sLgorICogICAgICAgIEl0IG11c3QgYmUgYSBwb2ludGVyIHRvIE5VTEwgb24gZmlyc3QgaXRlcmF0aW9uIGFuZCB3aWxsCisgKiAgICAgICAgYmUgdXBkYXRlZCBieSBzdWNjZXNzaXZlIGNhbGxzIHRvIGF2aW9fZW51bV9wcm90b2NvbHMuCisgKiBAcGFyYW0gb3V0cHV0IElmIHNldCB0byAxLCBpdGVyYXRlIG92ZXIgb3V0cHV0IHByb3RvY29scywKKyAqICAgICAgICAgICAgICAgb3RoZXJ3aXNlIG92ZXIgaW5wdXQgcHJvdG9jb2xzLgorICoKKyAqIEByZXR1cm4gQSBzdGF0aWMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgY3VycmVudCBwcm90b2NvbCBvciBOVUxMCisgKi8KK2NvbnN0IGNoYXIgKmF2aW9fZW51bV9wcm90b2NvbHModm9pZCAqKm9wYXF1ZSwgaW50IG91dHB1dCk7CisKKy8qKgorICogUGF1c2UgYW5kIHJlc3VtZSBwbGF5aW5nIC0gb25seSBtZWFuaW5nZnVsIGlmIHVzaW5nIGEgbmV0d29yayBzdHJlYW1pbmcKKyAqIHByb3RvY29sIChlLmcuIE1NUykuCisgKgorICogQHBhcmFtIGggICAgIElPIGNvbnRleHQgZnJvbSB3aGljaCB0byBjYWxsIHRoZSByZWFkX3BhdXNlIGZ1bmN0aW9uIHBvaW50ZXIKKyAqIEBwYXJhbSBwYXVzZSAxIGZvciBwYXVzZSwgMCBmb3IgcmVzdW1lCisgKi8KK2ludCAgICAgYXZpb19wYXVzZShBVklPQ29udGV4dCAqaCwgaW50IHBhdXNlKTsKKworLyoqCisgKiBTZWVrIHRvIGEgZ2l2ZW4gdGltZXN0YW1wIHJlbGF0aXZlIHRvIHNvbWUgY29tcG9uZW50IHN0cmVhbS4KKyAqIE9ubHkgbWVhbmluZ2Z1bCBpZiB1c2luZyBhIG5ldHdvcmsgc3RyZWFtaW5nIHByb3RvY29sIChlLmcuIE1NUy4pLgorICoKKyAqIEBwYXJhbSBoIElPIGNvbnRleHQgZnJvbSB3aGljaCB0byBjYWxsIHRoZSBzZWVrIGZ1bmN0aW9uIHBvaW50ZXJzCisgKiBAcGFyYW0gc3RyZWFtX2luZGV4IFRoZSBzdHJlYW0gaW5kZXggdGhhdCB0aGUgdGltZXN0YW1wIGlzIHJlbGF0aXZlIHRvLgorICogICAgICAgIElmIHN0cmVhbV9pbmRleCBpcyAoLTEpIHRoZSB0aW1lc3RhbXAgc2hvdWxkIGJlIGluIEFWX1RJTUVfQkFTRQorICogICAgICAgIHVuaXRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJlc2VudGF0aW9uLgorICogICAgICAgIElmIGEgc3RyZWFtX2luZGV4ID49IDAgaXMgdXNlZCBhbmQgdGhlIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQKKyAqICAgICAgICBzZWVraW5nIGJhc2VkIG9uIGNvbXBvbmVudCBzdHJlYW1zLCB0aGUgY2FsbCB3aWxsIGZhaWwuCisgKiBAcGFyYW0gdGltZXN0YW1wIHRpbWVzdGFtcCBpbiBBVlN0cmVhbS50aW1lX2Jhc2UgdW5pdHMKKyAqICAgICAgICBvciBpZiB0aGVyZSBpcyBubyBzdHJlYW0gc3BlY2lmaWVkIHRoZW4gaW4gQVZfVElNRV9CQVNFIHVuaXRzLgorICogQHBhcmFtIGZsYWdzIE9wdGlvbmFsIGNvbWJpbmF0aW9uIG9mIEFWU0VFS19GTEFHX0JBQ0tXQVJELCBBVlNFRUtfRkxBR19CWVRFCisgKiAgICAgICAgYW5kIEFWU0VFS19GTEFHX0FOWS4gVGhlIHByb3RvY29sIG1heSBzaWxlbnRseSBpZ25vcmUKKyAqICAgICAgICBBVlNFRUtfRkxBR19CQUNLV0FSRCBhbmQgQVZTRUVLX0ZMQUdfQU5ZLCBidXQgQVZTRUVLX0ZMQUdfQllURSB3aWxsCisgKiAgICAgICAgZmFpbCBpZiB1c2VkIGFuZCBub3Qgc3VwcG9ydGVkLgorICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3MKKyAqIEBzZWUgQVZJbnB1dEZvcm1hdDo6cmVhZF9zZWVrCisgKi8KK2ludDY0X3QgYXZpb19zZWVrX3RpbWUoQVZJT0NvbnRleHQgKmgsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpOworCisvKiBBdm9pZCBhIHdhcm5pbmcuIFRoZSBoZWFkZXIgY2FuIG5vdCBiZSBpbmNsdWRlZCBiZWNhdXNlIGl0IGJyZWFrcyBjKysuICovCitzdHJ1Y3QgQVZCUHJpbnQ7CisKKy8qKgorICogUmVhZCBjb250ZW50cyBvZiBoIGludG8gcHJpbnQgYnVmZmVyLCB1cCB0byBtYXhfc2l6ZSBieXRlcywgb3IgdXAgdG8gRU9GLgorICoKKyAqIEByZXR1cm4gMCBmb3Igc3VjY2VzcyAobWF4X3NpemUgYnl0ZXMgcmVhZCBvciBFT0YgcmVhY2hlZCksIG5lZ2F0aXZlIGVycm9yCisgKiBjb2RlIG90aGVyd2lzZQorICovCitpbnQgYXZpb19yZWFkX3RvX2JwcmludChBVklPQ29udGV4dCAqaCwgc3RydWN0IEFWQlByaW50ICpwYiwgc2l6ZV90IG1heF9zaXplKTsKKworI2VuZGlmIC8qIEFWRk9STUFUX0FWSU9fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2aW9faW50ZXJuYWwuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmlvX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2NDA0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmlvX2ludGVybmFsLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfQVZJT19JTlRFUk5BTF9ICisjZGVmaW5lIEFWRk9STUFUX0FWSU9fSU5URVJOQUxfSAorCisjaW5jbHVkZSAiYXZpby5oIgorI2luY2x1ZGUgInVybC5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorCitleHRlcm4gY29uc3QgQVZDbGFzcyBmZmlvX3VybF9jbGFzczsKKworaW50IGZmaW9faW5pdF9jb250ZXh0KEFWSU9Db250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgaW50IHdyaXRlX2ZsYWcsCisgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICBpbnQgKCpyZWFkX3BhY2tldCkodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSksCisgICAgICAgICAgICAgICAgICBpbnQgKCp3cml0ZV9wYWNrZXQpKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpLAorICAgICAgICAgICAgICAgICAgaW50NjRfdCAoKnNlZWspKHZvaWQgKm9wYXF1ZSwgaW50NjRfdCBvZmZzZXQsIGludCB3aGVuY2UpKTsKKworCisvKioKKyAqIFJlYWQgc2l6ZSBieXRlcyBmcm9tIEFWSU9Db250ZXh0LCByZXR1cm5pbmcgYSBwb2ludGVyLgorICogTm90ZSB0aGF0IHRoZSBkYXRhIHBvaW50ZWQgYXQgYnkgdGhlIHJldHVybmVkIHBvaW50ZXIgaXMgb25seQorICogdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0aGF0IHJlZmVyZW5jZXMgdGhlIHNhbWUgSU8gY29udGV4dC4KKyAqIEBwYXJhbSBzIElPIGNvbnRleHQKKyAqIEBwYXJhbSBidWYgcG9pbnRlciB0byBidWZmZXIgaW50byB3aGljaCB0byBhc3NlbWJsZSB0aGUgcmVxdWVzdGVkCisgKiAgICBkYXRhIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUgaW4gY29udGlndW91cyBhZGRyZXNzZXMgaW4gdGhlCisgKiAgICB1bmRlcmx5aW5nIGJ1ZmZlcgorICogQHBhcmFtIHNpemUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZAorICogQHBhcmFtIGRhdGEgYWRkcmVzcyBhdCB3aGljaCB0byBzdG9yZSBwb2ludGVyOiB0aGlzIHdpbGwgYmUgYQorICogICAgYSBkaXJlY3QgcG9pbnRlciBpbnRvIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBpZiB0aGUgcmVxdWVzdGVkCisgKiAgICBudW1iZXIgb2YgYnl0ZXMgYXJlIGF2YWlsYWJsZSBhdCBjb250aWd1b3VzIGFkZHJlc3Nlcywgb3RoZXJ3aXNlCisgKiAgICB3aWxsIGJlIGEgY29weSBvZiBidWYKKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgQVZFUlJPUgorICovCitpbnQgZmZpb19yZWFkX2luZGlyZWN0KEFWSU9Db250ZXh0ICpzLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqZGF0YSk7CisKKy8qKgorICogUmVhZCBzaXplIGJ5dGVzIGZyb20gQVZJT0NvbnRleHQgaW50byBidWYuCisgKiBUaGlzIHJlYWRzIGF0IG1vc3QgMSBwYWNrZXQuIElmIHRoYXQgaXMgbm90IGVub3VnaCBmZXdlciBieXRlcyB3aWxsIGJlCisgKiByZXR1cm5lZC4KKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgQVZFUlJPUgorICovCitpbnQgZmZpb19yZWFkX3BhcnRpYWwoQVZJT0NvbnRleHQgKnMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworCit2b2lkIGZmaW9fZmlsbChBVklPQ29udGV4dCAqcywgaW50IGIsIGludCBjb3VudCk7CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZpb193Zm91cmNjKEFWSU9Db250ZXh0ICpwYiwgY29uc3QgdWludDhfdCAqcykKK3sKKyAgICBhdmlvX3dsMzIocGIsIE1LVEFHKHNbMF0sIHNbMV0sIHNbMl0sIHNbM10pKTsKK30KKworLyoqCisgKiBSZXdpbmQgdGhlIEFWSU9Db250ZXh0IHVzaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGJ1Zl9zaXplIGJ5dGVzIG9mIHRoZSBmaWxlLgorICogVXNlZCBhZnRlciBwcm9iaW5nIHRvIGF2b2lkIHNlZWtpbmcuCisgKiBKb2lucyBidWYgYW5kIHMtPmJ1ZmZlciwgdGFraW5nIGFueSBvdmVybGFwIGludG8gY29uc2lkZXJhdGlvbi4KKyAqIEBub3RlIHMtPmJ1ZmZlciBtdXN0IG92ZXJsYXAgd2l0aCBidWYgb3IgdGhleSBjYW4ndCBiZSBqb2luZWQgYW5kIHRoZSBmdW5jdGlvbiBmYWlscworICoKKyAqIEBwYXJhbSBzIFRoZSByZWFkLW9ubHkgQVZJT0NvbnRleHQgdG8gcmV3aW5kCisgKiBAcGFyYW0gYnVmIFRoZSBwcm9iZSBidWZmZXIgY29udGFpbmluZyB0aGUgZmlyc3QgYnVmX3NpemUgYnl0ZXMgb2YgdGhlIGZpbGUKKyAqIEBwYXJhbSBidWZfc2l6ZSBUaGUgc2l6ZSBvZiBidWYKKyAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbgorICogQVZFUlJPUiBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgZmZpb19yZXdpbmRfd2l0aF9wcm9iZV9kYXRhKEFWSU9Db250ZXh0ICpzLCB1bnNpZ25lZCBjaGFyICoqYnVmLCBpbnQgYnVmX3NpemUpOworCit1aW50NjRfdCBmZmlvX3JlYWRfdmFybGVuKEFWSU9Db250ZXh0ICpiYyk7CisKKy8qKiBAd2FybmluZyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IEkvTyAqLworaW50IGZmaW9fc2V0X2J1Zl9zaXplKEFWSU9Db250ZXh0ICpzLCBpbnQgYnVmX3NpemUpOworCisvKioKKyAqIEVuc3VyZXMgdGhhdCB0aGUgcmVxdWVzdGVkIHNlZWtiYWNrIGJ1ZmZlciBzaXplIHdpbGwgYmUgYXZhaWxhYmxlCisgKgorICogV2lsbCBlbnN1cmUgdGhhdCB3aGVuIHJlYWRpbmcgc2VxdWVudGlhbGx5IHVwIHRvIGJ1Zl9zaXplLCBzZWVraW5nCisgKiB3aXRoaW4gdGhlIGN1cnJlbnQgcG9zIGFuZCBwb3MrYnVmX3NpemUgaXMgcG9zc2libGUuCisgKiBPbmNlIHRoZSBzdHJlYW0gcG9zaXRpb24gbW92ZXMgb3V0c2lkZSB0aGlzIHdpbmRvdyB0aGlzIGd1YXJhbnRlZSBpcyBsb3N0LgorICovCitpbnQgZmZpb19lbnN1cmVfc2Vla2JhY2soQVZJT0NvbnRleHQgKnMsIGludDY0X3QgYnVmX3NpemUpOworCitpbnQgZmZpb19saW1pdChBVklPQ29udGV4dCAqcywgaW50IHNpemUpOworCit2b2lkIGZmaW9faW5pdF9jaGVja3N1bShBVklPQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKCp1cGRhdGVfY2hlY2tzdW0pKHVuc2lnbmVkIGxvbmcgYywgY29uc3QgdWludDhfdCAqcCwgdW5zaWduZWQgaW50IGxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNoZWNrc3VtKTsKK3Vuc2lnbmVkIGxvbmcgZmZpb19nZXRfY2hlY2tzdW0oQVZJT0NvbnRleHQgKnMpOwordW5zaWduZWQgbG9uZyBmZl9jcmMwNEMxMURCN191cGRhdGUodW5zaWduZWQgbG9uZyBjaGVja3N1bSwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbik7Cit1bnNpZ25lZCBsb25nIGZmX2NyY0EwMDFfdXBkYXRlKHVuc2lnbmVkIGxvbmcgY2hlY2tzdW0sIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbik7CisKKy8qKgorICogT3BlbiBhIHdyaXRlIG9ubHkgcGFja2V0aXplZCBtZW1vcnkgc3RyZWFtIHdpdGggYSBtYXhpbXVtIHBhY2tldAorICogc2l6ZSBvZiAnbWF4X3BhY2tldF9zaXplJy4gIFRoZSBzdHJlYW0gaXMgc3RvcmVkIGluIGEgbWVtb3J5IGJ1ZmZlcgorICogd2l0aCBhIGJpZy1lbmRpYW4gNCBieXRlIGhlYWRlciBnaXZpbmcgdGhlIHBhY2tldCBzaXplIGluIGJ5dGVzLgorICoKKyAqIEBwYXJhbSBzIG5ldyBJTyBjb250ZXh0CisgKiBAcGFyYW0gbWF4X3BhY2tldF9zaXplIG1heGltdW0gcGFja2V0IHNpemUgKG11c3QgYmUgPiAwKQorICogQHJldHVybiB6ZXJvIGlmIG5vIGVycm9yLgorICovCitpbnQgZmZpb19vcGVuX2R5bl9wYWNrZXRfYnVmKEFWSU9Db250ZXh0ICoqcywgaW50IG1heF9wYWNrZXRfc2l6ZSk7CisKKy8qKgorICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgQVZJT0NvbnRleHQgZm9yIGFjY2Vzc2luZyB0aGUKKyAqIHJlc291cmNlIHJlZmVyZW5jZWQgYnkgdGhlIFVSTENvbnRleHQgaC4KKyAqIEBub3RlIFdoZW4gdGhlIFVSTENvbnRleHQgaCBoYXMgYmVlbiBvcGVuZWQgaW4gcmVhZCt3cml0ZSBtb2RlLCB0aGUKKyAqIEFWSU9Db250ZXh0IGNhbiBiZSB1c2VkIG9ubHkgZm9yIHdyaXRpbmcuCisgKgorICogQHBhcmFtIHMgVXNlZCB0byByZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgQVZJT0NvbnRleHQuCisgKiBJbiBjYXNlIG9mIGZhaWx1cmUgdGhlIHBvaW50ZWQgdG8gdmFsdWUgaXMgc2V0IHRvIE5VTEwuCisgKiBAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4KKyAqIEFWRVJST1IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGZmaW9fZmRvcGVuKEFWSU9Db250ZXh0ICoqcywgVVJMQ29udGV4dCAqaCk7CisKKy8qKgorICogT3BlbiBhIHdyaXRlLW9ubHkgZmFrZSBtZW1vcnkgc3RyZWFtLiBUaGUgd3JpdHRlbiBkYXRhIGlzIG5vdCBzdG9yZWQKKyAqIGFueXdoZXJlIC0gdGhpcyBpcyBvbmx5IHVzZWQgZm9yIG1lYXN1cmluZyB0aGUgYW1vdW50IG9mIGRhdGEKKyAqIHdyaXR0ZW4uCisgKgorICogQHBhcmFtIHMgbmV3IElPIGNvbnRleHQKKyAqIEByZXR1cm4gemVybyBpZiBubyBlcnJvci4KKyAqLworaW50IGZmaW9fb3Blbl9udWxsX2J1ZihBVklPQ29udGV4dCAqKnMpOworCisvKioKKyAqIENsb3NlIGEgbnVsbCBidWZmZXIuCisgKgorICogQHBhcmFtIHMgYW4gSU8gY29udGV4dCBvcGVuZWQgYnkgZmZpb19vcGVuX251bGxfYnVmCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgbnVsbCBidWZmZXIKKyAqLworaW50IGZmaW9fY2xvc2VfbnVsbF9idWYoQVZJT0NvbnRleHQgKnMpOworCisjZW5kaWYgLyogQVZGT1JNQVRfQVZJT19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXZpb2J1Zi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2aW9idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzc0MzE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2aW9idWYuYwpAQCAtMCwwICsxLDExNDggQEAKKy8qCisgKiBidWZmZXJlZCBJL08KKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpby5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInVybC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIElPX0JVRkZFUl9TSVpFIDMyNzY4CisKKy8qKgorICogRG8gc2Vla3Mgd2l0aGluIHRoaXMgZGlzdGFuY2UgYWhlYWQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIGJ5IHNraXBwaW5nCisgKiBkYXRhIGluc3RlYWQgb2YgY2FsbGluZyB0aGUgcHJvdG9jb2wgc2VlayBmdW5jdGlvbiwgZm9yIHNlZWthYmxlCisgKiBwcm90b2NvbHMuCisgKi8KKyNkZWZpbmUgU0hPUlRfU0VFS19USFJFU0hPTEQgNDA5NgorCitzdGF0aWMgdm9pZCAqZmZpb191cmxfY2hpbGRfbmV4dCh2b2lkICpvYmosIHZvaWQgKnByZXYpCit7CisgICAgQVZJT0NvbnRleHQgKnMgPSBvYmo7CisgICAgcmV0dXJuIHByZXYgPyBOVUxMIDogcy0+b3BhcXVlOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyAqZmZpb191cmxfY2hpbGRfY2xhc3NfbmV4dChjb25zdCBBVkNsYXNzICpwcmV2KQoreworICAgIHJldHVybiBwcmV2ID8gTlVMTCA6ICZmZnVybF9jb250ZXh0X2NsYXNzOworfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZmZpb191cmxfb3B0aW9uc1tdID0geworICAgIHsgTlVMTCB9LAorfTsKKworY29uc3QgQVZDbGFzcyBmZmlvX3VybF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJBVklPQ29udGV4dCIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAub3B0aW9uICAgICA9IGZmaW9fdXJsX29wdGlvbnMsCisgICAgLmNoaWxkX25leHQgPSBmZmlvX3VybF9jaGlsZF9uZXh0LAorICAgIC5jaGlsZF9jbGFzc19uZXh0ID0gZmZpb191cmxfY2hpbGRfY2xhc3NfbmV4dCwKK307CisKK3N0YXRpYyB2b2lkIGZpbGxfYnVmZmVyKEFWSU9Db250ZXh0ICpzKTsKK3N0YXRpYyBpbnQgdXJsX3Jlc2V0YnVmKEFWSU9Db250ZXh0ICpzLCBpbnQgZmxhZ3MpOworCitpbnQgZmZpb19pbml0X2NvbnRleHQoQVZJT0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICBpbnQgd3JpdGVfZmxhZywKKyAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgIGludCAoKnJlYWRfcGFja2V0KSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKSwKKyAgICAgICAgICAgICAgICAgIGludCAoKndyaXRlX3BhY2tldCkodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSksCisgICAgICAgICAgICAgICAgICBpbnQ2NF90ICgqc2Vlaykodm9pZCAqb3BhcXVlLCBpbnQ2NF90IG9mZnNldCwgaW50IHdoZW5jZSkpCit7CisgICAgcy0+YnVmZmVyICAgICAgPSBidWZmZXI7CisgICAgcy0+b3JpZ19idWZmZXJfc2l6ZSA9CisgICAgcy0+YnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKKyAgICBzLT5idWZfcHRyICAgICA9IGJ1ZmZlcjsKKyAgICBzLT5vcGFxdWUgICAgICA9IG9wYXF1ZTsKKyAgICBzLT5kaXJlY3QgICAgICA9IDA7CisKKyAgICB1cmxfcmVzZXRidWYocywgd3JpdGVfZmxhZyA/IEFWSU9fRkxBR19XUklURSA6IEFWSU9fRkxBR19SRUFEKTsKKworICAgIHMtPndyaXRlX3BhY2tldCAgICA9IHdyaXRlX3BhY2tldDsKKyAgICBzLT5yZWFkX3BhY2tldCAgICAgPSByZWFkX3BhY2tldDsKKyAgICBzLT5zZWVrICAgICAgICAgICAgPSBzZWVrOworICAgIHMtPnBvcyAgICAgICAgICAgICA9IDA7CisgICAgcy0+bXVzdF9mbHVzaCAgICAgID0gMDsKKyAgICBzLT5lb2ZfcmVhY2hlZCAgICAgPSAwOworICAgIHMtPmVycm9yICAgICAgICAgICA9IDA7CisgICAgcy0+c2Vla2FibGUgICAgICAgID0gc2VlayA/IEFWSU9fU0VFS0FCTEVfTk9STUFMIDogMDsKKyAgICBzLT5tYXhfcGFja2V0X3NpemUgPSAwOworICAgIHMtPnVwZGF0ZV9jaGVja3N1bSA9IE5VTEw7CisKKyAgICBpZiAoIXJlYWRfcGFja2V0ICYmICF3cml0ZV9mbGFnKSB7CisgICAgICAgIHMtPnBvcyAgICAgPSBidWZmZXJfc2l6ZTsKKyAgICAgICAgcy0+YnVmX2VuZCA9IHMtPmJ1ZmZlciArIGJ1ZmZlcl9zaXplOworICAgIH0KKyAgICBzLT5yZWFkX3BhdXNlID0gTlVMTDsKKyAgICBzLT5yZWFkX3NlZWsgID0gTlVMTDsKKworICAgIHJldHVybiAwOworfQorCitBVklPQ29udGV4dCAqYXZpb19hbGxvY19jb250ZXh0KAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgaW50IHdyaXRlX2ZsYWcsCisgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICBpbnQgKCpyZWFkX3BhY2tldCkodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSksCisgICAgICAgICAgICAgICAgICBpbnQgKCp3cml0ZV9wYWNrZXQpKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpLAorICAgICAgICAgICAgICAgICAgaW50NjRfdCAoKnNlZWspKHZvaWQgKm9wYXF1ZSwgaW50NjRfdCBvZmZzZXQsIGludCB3aGVuY2UpKQoreworICAgIEFWSU9Db250ZXh0ICpzID0gYXZfbWFsbG9jeihzaXplb2YoQVZJT0NvbnRleHQpKTsKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZmaW9faW5pdF9jb250ZXh0KHMsIGJ1ZmZlciwgYnVmZmVyX3NpemUsIHdyaXRlX2ZsYWcsIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgIHJlYWRfcGFja2V0LCB3cml0ZV9wYWNrZXQsIHNlZWspOworICAgIHJldHVybiBzOworfQorCitzdGF0aWMgdm9pZCB3cml0ZW91dChBVklPQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKyAgICBpZiAocy0+d3JpdGVfcGFja2V0ICYmICFzLT5lcnJvcikgeworICAgICAgICBpbnQgcmV0ID0gcy0+d3JpdGVfcGFja2V0KHMtPm9wYXF1ZSwgKHVpbnQ4X3QgKilkYXRhLCBsZW4pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcy0+ZXJyb3IgPSByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+d3JpdGVvdXRfY291bnQgKys7CisgICAgcy0+cG9zICs9IGxlbjsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfYnVmZmVyKEFWSU9Db250ZXh0ICpzKQoreworICAgIGlmIChzLT53cml0ZV9mbGFnICYmIHMtPmJ1Zl9wdHIgPiBzLT5idWZmZXIpIHsKKyAgICAgICAgd3JpdGVvdXQocywgcy0+YnVmZmVyLCBzLT5idWZfcHRyIC0gcy0+YnVmZmVyKTsKKyAgICAgICAgaWYgKHMtPnVwZGF0ZV9jaGVja3N1bSkgeworICAgICAgICAgICAgcy0+Y2hlY2tzdW0gICAgID0gcy0+dXBkYXRlX2NoZWNrc3VtKHMtPmNoZWNrc3VtLCBzLT5jaGVja3N1bV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YnVmX3B0ciAtIHMtPmNoZWNrc3VtX3B0cik7CisgICAgICAgICAgICBzLT5jaGVja3N1bV9wdHIgPSBzLT5idWZmZXI7CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+YnVmX3B0ciA9IHMtPmJ1ZmZlcjsKKyAgICBpZiAoIXMtPndyaXRlX2ZsYWcpCisgICAgICAgIHMtPmJ1Zl9lbmQgPSBzLT5idWZmZXI7Cit9CisKK3ZvaWQgYXZpb193OChBVklPQ29udGV4dCAqcywgaW50IGIpCit7CisgICAgYXZfYXNzZXJ0MihiPj0tMTI4ICYmIGI8PTI1NSk7CisgICAgKnMtPmJ1Zl9wdHIrKyA9IGI7CisgICAgaWYgKHMtPmJ1Zl9wdHIgPj0gcy0+YnVmX2VuZCkKKyAgICAgICAgZmx1c2hfYnVmZmVyKHMpOworfQorCit2b2lkIGZmaW9fZmlsbChBVklPQ29udGV4dCAqcywgaW50IGIsIGludCBjb3VudCkKK3sKKyAgICB3aGlsZSAoY291bnQgPiAwKSB7CisgICAgICAgIGludCBsZW4gPSBGRk1JTihzLT5idWZfZW5kIC0gcy0+YnVmX3B0ciwgY291bnQpOworICAgICAgICBtZW1zZXQocy0+YnVmX3B0ciwgYiwgbGVuKTsKKyAgICAgICAgcy0+YnVmX3B0ciArPSBsZW47CisKKyAgICAgICAgaWYgKHMtPmJ1Zl9wdHIgPj0gcy0+YnVmX2VuZCkKKyAgICAgICAgICAgIGZsdXNoX2J1ZmZlcihzKTsKKworICAgICAgICBjb3VudCAtPSBsZW47CisgICAgfQorfQorCit2b2lkIGF2aW9fd3JpdGUoQVZJT0NvbnRleHQgKnMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgaWYgKHMtPmRpcmVjdCAmJiAhcy0+dXBkYXRlX2NoZWNrc3VtKSB7CisgICAgICAgIGF2aW9fZmx1c2gocyk7CisgICAgICAgIHdyaXRlb3V0KHMsIGJ1Ziwgc2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGludCBsZW4gPSBGRk1JTihzLT5idWZfZW5kIC0gcy0+YnVmX3B0ciwgc2l6ZSk7CisgICAgICAgIG1lbWNweShzLT5idWZfcHRyLCBidWYsIGxlbik7CisgICAgICAgIHMtPmJ1Zl9wdHIgKz0gbGVuOworCisgICAgICAgIGlmIChzLT5idWZfcHRyID49IHMtPmJ1Zl9lbmQpCisgICAgICAgICAgICBmbHVzaF9idWZmZXIocyk7CisKKyAgICAgICAgYnVmICs9IGxlbjsKKyAgICAgICAgc2l6ZSAtPSBsZW47CisgICAgfQorfQorCit2b2lkIGF2aW9fZmx1c2goQVZJT0NvbnRleHQgKnMpCit7CisgICAgZmx1c2hfYnVmZmVyKHMpOworICAgIHMtPm11c3RfZmx1c2ggPSAwOworfQorCitpbnQ2NF90IGF2aW9fc2VlayhBVklPQ29udGV4dCAqcywgaW50NjRfdCBvZmZzZXQsIGludCB3aGVuY2UpCit7CisgICAgaW50NjRfdCBvZmZzZXQxOworICAgIGludDY0X3QgcG9zOworICAgIGludCBmb3JjZSA9IHdoZW5jZSAmIEFWU0VFS19GT1JDRTsKKyAgICBpbnQgYnVmZmVyX3NpemU7CisgICAgd2hlbmNlICY9IH5BVlNFRUtfRk9SQ0U7CisKKyAgICBpZighcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGJ1ZmZlcl9zaXplID0gcy0+YnVmX2VuZCAtIHMtPmJ1ZmZlcjsKKyAgICBwb3MgPSBzLT5wb3MgLSAocy0+d3JpdGVfZmxhZyA/IDAgOiBidWZmZXJfc2l6ZSk7CisKKyAgICBpZiAod2hlbmNlICE9IFNFRUtfQ1VSICYmIHdoZW5jZSAhPSBTRUVLX1NFVCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmICh3aGVuY2UgPT0gU0VFS19DVVIpIHsKKyAgICAgICAgb2Zmc2V0MSA9IHBvcyArIChzLT5idWZfcHRyIC0gcy0+YnVmZmVyKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG9mZnNldDE7CisgICAgICAgIG9mZnNldCArPSBvZmZzZXQxOworICAgIH0KKyAgICBvZmZzZXQxID0gb2Zmc2V0IC0gcG9zOworICAgIGlmICghcy0+bXVzdF9mbHVzaCAmJiAoIXMtPmRpcmVjdCB8fCAhcy0+c2VlaykgJiYKKyAgICAgICAgb2Zmc2V0MSA+PSAwICYmIG9mZnNldDEgPD0gYnVmZmVyX3NpemUpIHsKKyAgICAgICAgLyogY2FuIGRvIHRoZSBzZWVrIGluc2lkZSB0aGUgYnVmZmVyICovCisgICAgICAgIHMtPmJ1Zl9wdHIgPSBzLT5idWZmZXIgKyBvZmZzZXQxOworICAgIH0gZWxzZSBpZiAoKCFzLT5zZWVrYWJsZSB8fAorICAgICAgICAgICAgICAgb2Zmc2V0MSA8PSBzLT5idWZfZW5kICsgU0hPUlRfU0VFS19USFJFU0hPTEQgLSBzLT5idWZmZXIpICYmCisgICAgICAgICAgICAgICAhcy0+d3JpdGVfZmxhZyAmJiBvZmZzZXQxID49IDAgJiYKKyAgICAgICAgICAgICAgICghcy0+ZGlyZWN0IHx8ICFzLT5zZWVrKSAmJgorICAgICAgICAgICAgICAod2hlbmNlICE9IFNFRUtfRU5EIHx8IGZvcmNlKSkgeworICAgICAgICB3aGlsZShzLT5wb3MgPCBvZmZzZXQgJiYgIXMtPmVvZl9yZWFjaGVkKQorICAgICAgICAgICAgZmlsbF9idWZmZXIocyk7CisgICAgICAgIGlmIChzLT5lb2ZfcmVhY2hlZCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICAgICAgcy0+YnVmX3B0ciA9IHMtPmJ1Zl9lbmQgKyBvZmZzZXQgLSBzLT5wb3M7CisgICAgfSBlbHNlIGlmKCFzLT53cml0ZV9mbGFnICYmIG9mZnNldDEgPCAwICYmIC1vZmZzZXQxIDwgYnVmZmVyX3NpemU+PjEgJiYgcy0+c2VlayAmJiBvZmZzZXQgPiAwKSB7CisgICAgICAgIGludDY0X3QgcmVzOworCisgICAgICAgIHBvcyAtPSBGRk1JTihidWZmZXJfc2l6ZT4+MSwgcG9zKTsKKyAgICAgICAgaWYgKChyZXMgPSBzLT5zZWVrKHMtPm9wYXF1ZSwgcG9zLCBTRUVLX1NFVCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIHMtPmJ1Zl9lbmQgPQorICAgICAgICBzLT5idWZfcHRyID0gcy0+YnVmZmVyOworICAgICAgICBzLT5wb3MgPSBwb3M7CisgICAgICAgIHMtPmVvZl9yZWFjaGVkID0gMDsKKyAgICAgICAgZmlsbF9idWZmZXIocyk7CisgICAgICAgIHJldHVybiBhdmlvX3NlZWsocywgb2Zmc2V0LCBTRUVLX1NFVCB8IGZvcmNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IHJlczsKKyAgICAgICAgaWYgKHMtPndyaXRlX2ZsYWcpIHsKKyAgICAgICAgICAgIGZsdXNoX2J1ZmZlcihzKTsKKyAgICAgICAgICAgIHMtPm11c3RfZmx1c2ggPSAxOworICAgICAgICB9CisgICAgICAgIGlmICghcy0+c2VlaykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVQSVBFKTsKKyAgICAgICAgaWYgKChyZXMgPSBzLT5zZWVrKHMtPm9wYXF1ZSwgb2Zmc2V0LCBTRUVLX1NFVCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIHMtPnNlZWtfY291bnQgKys7CisgICAgICAgIGlmICghcy0+d3JpdGVfZmxhZykKKyAgICAgICAgICAgIHMtPmJ1Zl9lbmQgPSBzLT5idWZmZXI7CisgICAgICAgIHMtPmJ1Zl9wdHIgPSBzLT5idWZmZXI7CisgICAgICAgIHMtPnBvcyA9IG9mZnNldDsKKyAgICB9CisgICAgcy0+ZW9mX3JlYWNoZWQgPSAwOworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK2ludDY0X3QgYXZpb19za2lwKEFWSU9Db250ZXh0ICpzLCBpbnQ2NF90IG9mZnNldCkKK3sKKyAgICByZXR1cm4gYXZpb19zZWVrKHMsIG9mZnNldCwgU0VFS19DVVIpOworfQorCitpbnQ2NF90IGF2aW9fc2l6ZShBVklPQ29udGV4dCAqcykKK3sKKyAgICBpbnQ2NF90IHNpemU7CisKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoIXMtPnNlZWspCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgc2l6ZSA9IHMtPnNlZWsocy0+b3BhcXVlLCAwLCBBVlNFRUtfU0laRSk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIGlmICgoc2l6ZSA9IHMtPnNlZWsocy0+b3BhcXVlLCAtMSwgU0VFS19FTkQpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgc2l6ZSsrOworICAgICAgICBzLT5zZWVrKHMtPm9wYXF1ZSwgcy0+cG9zLCBTRUVLX1NFVCk7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCitpbnQgYXZpb19mZW9mKEFWSU9Db250ZXh0ICpzKQoreworICAgIGlmKCFzKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZihzLT5lb2ZfcmVhY2hlZCl7CisgICAgICAgIHMtPmVvZl9yZWFjaGVkPTA7CisgICAgICAgIGZpbGxfYnVmZmVyKHMpOworICAgIH0KKyAgICByZXR1cm4gcy0+ZW9mX3JlYWNoZWQ7Cit9CisKKyNpZiBGRl9BUElfVVJMX0ZFT0YKK2ludCB1cmxfZmVvZihBVklPQ29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gYXZpb19mZW9mKHMpOworfQorI2VuZGlmCisKK3ZvaWQgYXZpb193bDMyKEFWSU9Db250ZXh0ICpzLCB1bnNpZ25lZCBpbnQgdmFsKQoreworICAgIGF2aW9fdzgocywgKHVpbnQ4X3QpIHZhbCAgICAgICApOworICAgIGF2aW9fdzgocywgKHVpbnQ4X3QpKHZhbCA+PiA4ICkpOworICAgIGF2aW9fdzgocywgKHVpbnQ4X3QpKHZhbCA+PiAxNikpOworICAgIGF2aW9fdzgocywgICAgICAgICAgIHZhbCA+PiAyNCApOworfQorCit2b2lkIGF2aW9fd2IzMihBVklPQ29udGV4dCAqcywgdW5zaWduZWQgaW50IHZhbCkKK3sKKyAgICBhdmlvX3c4KHMsICAgICAgICAgICB2YWwgPj4gMjQgKTsKKyAgICBhdmlvX3c4KHMsICh1aW50OF90KSh2YWwgPj4gMTYpKTsKKyAgICBhdmlvX3c4KHMsICh1aW50OF90KSh2YWwgPj4gOCApKTsKKyAgICBhdmlvX3c4KHMsICh1aW50OF90KSB2YWwgICAgICAgKTsKK30KKworaW50IGF2aW9fcHV0X3N0cihBVklPQ29udGV4dCAqcywgY29uc3QgY2hhciAqc3RyKQoreworICAgIGludCBsZW4gPSAxOworICAgIGlmIChzdHIpIHsKKyAgICAgICAgbGVuICs9IHN0cmxlbihzdHIpOworICAgICAgICBhdmlvX3dyaXRlKHMsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIHN0ciwgbGVuKTsKKyAgICB9IGVsc2UKKyAgICAgICAgYXZpb193OChzLCAwKTsKKyAgICByZXR1cm4gbGVuOworfQorCitpbnQgYXZpb19wdXRfc3RyMTZsZShBVklPQ29udGV4dCAqcywgY29uc3QgY2hhciAqc3RyKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnEgPSBzdHI7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGVyciA9IDA7CisKKyAgICB3aGlsZSAoKnEpIHsKKyAgICAgICAgdWludDMyX3QgY2g7CisgICAgICAgIHVpbnQxNl90IHRtcDsKKworICAgICAgICBHRVRfVVRGOChjaCwgKnErKywgZ290byBpbnZhbGlkOykKKyAgICAgICAgUFVUX1VURjE2KGNoLCB0bXAsIGF2aW9fd2wxNihzLCB0bXApOyByZXQgKz0gMjspCisgICAgICAgIGNvbnRpbnVlOworaW52YWxpZDoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFpZCBVVEY4IHNlcXVlbmNlIGluIGF2aW9fcHV0X3N0cjE2bGVcbiIpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGF2aW9fd2wxNihzLCAwKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIHJldCArPSAyOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9nZXRfdl9sZW5ndGgodWludDY0X3QgdmFsKQoreworICAgIGludCBpID0gMTsKKworICAgIHdoaWxlICh2YWwgPj49IDcpCisgICAgICAgIGkrKzsKKworICAgIHJldHVybiBpOworfQorCit2b2lkIGZmX3B1dF92KEFWSU9Db250ZXh0ICpiYywgdWludDY0X3QgdmFsKQoreworICAgIGludCBpID0gZmZfZ2V0X3ZfbGVuZ3RoKHZhbCk7CisKKyAgICB3aGlsZSAoLS1pID4gMCkKKyAgICAgICAgYXZpb193OChiYywgMTI4IHwgKHVpbnQ4X3QpKHZhbCA+PiAoNyppKSkpOworCisgICAgYXZpb193OChiYywgdmFsICYgMTI3KTsKK30KKwordm9pZCBhdmlvX3dsNjQoQVZJT0NvbnRleHQgKnMsIHVpbnQ2NF90IHZhbCkKK3sKKyAgICBhdmlvX3dsMzIocywgKHVpbnQzMl90KSh2YWwgJiAweGZmZmZmZmZmKSk7CisgICAgYXZpb193bDMyKHMsICh1aW50MzJfdCkodmFsID4+IDMyKSk7Cit9CisKK3ZvaWQgYXZpb193YjY0KEFWSU9Db250ZXh0ICpzLCB1aW50NjRfdCB2YWwpCit7CisgICAgYXZpb193YjMyKHMsICh1aW50MzJfdCkodmFsID4+IDMyKSk7CisgICAgYXZpb193YjMyKHMsICh1aW50MzJfdCkodmFsICYgMHhmZmZmZmZmZikpOworfQorCit2b2lkIGF2aW9fd2wxNihBVklPQ29udGV4dCAqcywgdW5zaWduZWQgaW50IHZhbCkKK3sKKyAgICBhdmlvX3c4KHMsICh1aW50OF90KXZhbCk7CisgICAgYXZpb193OChzLCAoaW50KXZhbCA+PiA4KTsKK30KKwordm9pZCBhdmlvX3diMTYoQVZJT0NvbnRleHQgKnMsIHVuc2lnbmVkIGludCB2YWwpCit7CisgICAgYXZpb193OChzLCAoaW50KXZhbCA+PiA4KTsKKyAgICBhdmlvX3c4KHMsICh1aW50OF90KXZhbCk7Cit9CisKK3ZvaWQgYXZpb193bDI0KEFWSU9Db250ZXh0ICpzLCB1bnNpZ25lZCBpbnQgdmFsKQoreworICAgIGF2aW9fd2wxNihzLCB2YWwgJiAweGZmZmYpOworICAgIGF2aW9fdzgocywgKGludCl2YWwgPj4gMTYpOworfQorCit2b2lkIGF2aW9fd2IyNChBVklPQ29udGV4dCAqcywgdW5zaWduZWQgaW50IHZhbCkKK3sKKyAgICBhdmlvX3diMTYocywgKGludCl2YWwgPj4gOCk7CisgICAgYXZpb193OChzLCAodWludDhfdCl2YWwpOworfQorCisvKiBJbnB1dCBzdHJlYW0gKi8KKworc3RhdGljIHZvaWQgZmlsbF9idWZmZXIoQVZJT0NvbnRleHQgKnMpCit7CisgICAgaW50IG1heF9idWZmZXJfc2l6ZSA9IHMtPm1heF9wYWNrZXRfc2l6ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1heF9wYWNrZXRfc2l6ZSA6IElPX0JVRkZFUl9TSVpFOworICAgIHVpbnQ4X3QgKmRzdCAgICAgICAgPSBzLT5idWZfZW5kIC0gcy0+YnVmZmVyICsgbWF4X2J1ZmZlcl9zaXplIDwgcy0+YnVmZmVyX3NpemUgPworICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5idWZfZW5kIDogcy0+YnVmZmVyOworICAgIGludCBsZW4gICAgICAgICAgICAgPSBzLT5idWZmZXJfc2l6ZSAtIChkc3QgLSBzLT5idWZmZXIpOworCisgICAgLyogY2FuJ3QgZmlsbCB0aGUgYnVmZmVyIHdpdGhvdXQgcmVhZF9wYWNrZXQsIGp1c3Qgc2V0IEVPRiBpZiBhcHByb3ByaWF0ZSAqLworICAgIGlmICghcy0+cmVhZF9wYWNrZXQgJiYgcy0+YnVmX3B0ciA+PSBzLT5idWZfZW5kKQorICAgICAgICBzLT5lb2ZfcmVhY2hlZCA9IDE7CisKKyAgICAvKiBubyBuZWVkIHRvIGRvIGFueXRoaW5nIGlmIEVPRiBhbHJlYWR5IHJlYWNoZWQgKi8KKyAgICBpZiAocy0+ZW9mX3JlYWNoZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChzLT51cGRhdGVfY2hlY2tzdW0gJiYgZHN0ID09IHMtPmJ1ZmZlcikgeworICAgICAgICBpZiAocy0+YnVmX2VuZCA+IHMtPmNoZWNrc3VtX3B0cikKKyAgICAgICAgICAgIHMtPmNoZWNrc3VtID0gcy0+dXBkYXRlX2NoZWNrc3VtKHMtPmNoZWNrc3VtLCBzLT5jaGVja3N1bV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5idWZfZW5kIC0gcy0+Y2hlY2tzdW1fcHRyKTsKKyAgICAgICAgcy0+Y2hlY2tzdW1fcHRyID0gcy0+YnVmZmVyOworICAgIH0KKworICAgIC8qIG1ha2UgYnVmZmVyIHNtYWxsZXIgaW4gY2FzZSBpdCBlbmRlZCB1cCBsYXJnZSBhZnRlciBwcm9iaW5nICovCisgICAgaWYgKHMtPnJlYWRfcGFja2V0ICYmIHMtPm9yaWdfYnVmZmVyX3NpemUgJiYgcy0+YnVmZmVyX3NpemUgPiBzLT5vcmlnX2J1ZmZlcl9zaXplKSB7CisgICAgICAgIGlmIChkc3QgPT0gcy0+YnVmZmVyKSB7CisgICAgICAgICAgICBmZmlvX3NldF9idWZfc2l6ZShzLCBzLT5vcmlnX2J1ZmZlcl9zaXplKTsKKworICAgICAgICAgICAgcy0+Y2hlY2tzdW1fcHRyID0gZHN0ID0gcy0+YnVmZmVyOworICAgICAgICB9CisgICAgICAgIGF2X2Fzc2VydDAobGVuID49IHMtPm9yaWdfYnVmZmVyX3NpemUpOworICAgICAgICBsZW4gPSBzLT5vcmlnX2J1ZmZlcl9zaXplOworICAgIH0KKworICAgIGlmIChzLT5yZWFkX3BhY2tldCkKKyAgICAgICAgbGVuID0gcy0+cmVhZF9wYWNrZXQocy0+b3BhcXVlLCBkc3QsIGxlbik7CisgICAgZWxzZQorICAgICAgICBsZW4gPSAwOworICAgIGlmIChsZW4gPD0gMCkgeworICAgICAgICAvKiBkbyBub3QgbW9kaWZ5IGJ1ZmZlciBpZiBFT0YgcmVhY2hlZCBzbyB0aGF0IGEgc2VlayBiYWNrIGNhbgorICAgICAgICAgICBiZSBkb25lIHdpdGhvdXQgcmVyZWFkaW5nIGRhdGEgKi8KKyAgICAgICAgcy0+ZW9mX3JlYWNoZWQgPSAxOworICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgIHMtPmVycm9yID0gbGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPnBvcyArPSBsZW47CisgICAgICAgIHMtPmJ1Zl9wdHIgPSBkc3Q7CisgICAgICAgIHMtPmJ1Zl9lbmQgPSBkc3QgKyBsZW47CisgICAgICAgIHMtPmJ5dGVzX3JlYWQgKz0gbGVuOworICAgIH0KK30KKwordW5zaWduZWQgbG9uZyBmZl9jcmMwNEMxMURCN191cGRhdGUodW5zaWduZWQgbG9uZyBjaGVja3N1bSwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICByZXR1cm4gYXZfY3JjKGF2X2NyY19nZXRfdGFibGUoQVZfQ1JDXzMyX0lFRUUpLCBjaGVja3N1bSwgYnVmLCBsZW4pOworfQorCit1bnNpZ25lZCBsb25nIGZmX2NyY0EwMDFfdXBkYXRlKHVuc2lnbmVkIGxvbmcgY2hlY2tzdW0sIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICByZXR1cm4gYXZfY3JjKGF2X2NyY19nZXRfdGFibGUoQVZfQ1JDXzE2X0FOU0lfTEUpLCBjaGVja3N1bSwgYnVmLCBsZW4pOworfQorCit1bnNpZ25lZCBsb25nIGZmaW9fZ2V0X2NoZWNrc3VtKEFWSU9Db250ZXh0ICpzKQoreworICAgIHMtPmNoZWNrc3VtID0gcy0+dXBkYXRlX2NoZWNrc3VtKHMtPmNoZWNrc3VtLCBzLT5jaGVja3N1bV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YnVmX3B0ciAtIHMtPmNoZWNrc3VtX3B0cik7CisgICAgcy0+dXBkYXRlX2NoZWNrc3VtID0gTlVMTDsKKyAgICByZXR1cm4gcy0+Y2hlY2tzdW07Cit9CisKK3ZvaWQgZmZpb19pbml0X2NoZWNrc3VtKEFWSU9Db250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKCp1cGRhdGVfY2hlY2tzdW0pKHVuc2lnbmVkIGxvbmcgYywgY29uc3QgdWludDhfdCAqcCwgdW5zaWduZWQgaW50IGxlbiksCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjaGVja3N1bSkKK3sKKyAgICBzLT51cGRhdGVfY2hlY2tzdW0gPSB1cGRhdGVfY2hlY2tzdW07CisgICAgaWYgKHMtPnVwZGF0ZV9jaGVja3N1bSkgeworICAgICAgICBzLT5jaGVja3N1bSAgICAgPSBjaGVja3N1bTsKKyAgICAgICAgcy0+Y2hlY2tzdW1fcHRyID0gcy0+YnVmX3B0cjsKKyAgICB9Cit9CisKKy8qIFhYWDogcHV0IGFuIGlubGluZSB2ZXJzaW9uICovCitpbnQgYXZpb19yOChBVklPQ29udGV4dCAqcykKK3sKKyAgICBpZiAocy0+YnVmX3B0ciA+PSBzLT5idWZfZW5kKQorICAgICAgICBmaWxsX2J1ZmZlcihzKTsKKyAgICBpZiAocy0+YnVmX3B0ciA8IHMtPmJ1Zl9lbmQpCisgICAgICAgIHJldHVybiAqcy0+YnVmX3B0cisrOworICAgIHJldHVybiAwOworfQorCitpbnQgYXZpb19yZWFkKEFWSU9Db250ZXh0ICpzLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKQoreworICAgIGludCBsZW4sIHNpemUxOworCisgICAgc2l6ZTEgPSBzaXplOworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBsZW4gPSBzLT5idWZfZW5kIC0gcy0+YnVmX3B0cjsKKyAgICAgICAgaWYgKGxlbiA+IHNpemUpCisgICAgICAgICAgICBsZW4gPSBzaXplOworICAgICAgICBpZiAobGVuID09IDAgfHwgcy0+d3JpdGVfZmxhZykgeworICAgICAgICAgICAgaWYoKHMtPmRpcmVjdCB8fCBzaXplID4gcy0+YnVmZmVyX3NpemUpICYmICFzLT51cGRhdGVfY2hlY2tzdW0peworICAgICAgICAgICAgICAgIGlmKHMtPnJlYWRfcGFja2V0KQorICAgICAgICAgICAgICAgICAgICBsZW4gPSBzLT5yZWFkX3BhY2tldChzLT5vcGFxdWUsIGJ1Ziwgc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdCBtb2RpZnkgYnVmZmVyIGlmIEVPRiByZWFjaGVkIHNvIHRoYXQgYSBzZWVrIGJhY2sgY2FuCisgICAgICAgICAgICAgICAgICAgIGJlIGRvbmUgd2l0aG91dCByZXJlYWRpbmcgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICBzLT5lb2ZfcmVhY2hlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmKGxlbjwwKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZXJyb3I9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+cG9zICs9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgcy0+Ynl0ZXNfcmVhZCArPSBsZW47CisgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gbGVuOworICAgICAgICAgICAgICAgICAgICBidWYgKz0gbGVuOworICAgICAgICAgICAgICAgICAgICBzLT5idWZfcHRyID0gcy0+YnVmZmVyOworICAgICAgICAgICAgICAgICAgICBzLT5idWZfZW5kID0gcy0+YnVmZmVyLyogKyBsZW4qLzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGxfYnVmZmVyKHMpOworICAgICAgICAgICAgICAgIGxlbiA9IHMtPmJ1Zl9lbmQgLSBzLT5idWZfcHRyOworICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkoYnVmLCBzLT5idWZfcHRyLCBsZW4pOworICAgICAgICAgICAgYnVmICs9IGxlbjsKKyAgICAgICAgICAgIHMtPmJ1Zl9wdHIgKz0gbGVuOworICAgICAgICAgICAgc2l6ZSAtPSBsZW47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNpemUxID09IHNpemUpIHsKKyAgICAgICAgaWYgKHMtPmVycm9yKSAgICAgIHJldHVybiBzLT5lcnJvcjsKKyAgICAgICAgaWYgKGF2aW9fZmVvZihzKSkgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisgICAgcmV0dXJuIHNpemUxIC0gc2l6ZTsKK30KKworaW50IGZmaW9fcmVhZF9pbmRpcmVjdChBVklPQ29udGV4dCAqcywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmRhdGEpCit7CisgICAgaWYgKHMtPmJ1Zl9lbmQgLSBzLT5idWZfcHRyID49IHNpemUgJiYgIXMtPndyaXRlX2ZsYWcpIHsKKyAgICAgICAgKmRhdGEgPSBzLT5idWZfcHRyOworICAgICAgICBzLT5idWZfcHRyICs9IHNpemU7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0gZWxzZSB7CisgICAgICAgICpkYXRhID0gYnVmOworICAgICAgICByZXR1cm4gYXZpb19yZWFkKHMsIGJ1Ziwgc2l6ZSk7CisgICAgfQorfQorCitpbnQgZmZpb19yZWFkX3BhcnRpYWwoQVZJT0NvbnRleHQgKnMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgaW50IGxlbjsKKworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKHMtPnJlYWRfcGFja2V0ICYmIHMtPndyaXRlX2ZsYWcpIHsKKyAgICAgICAgbGVuID0gcy0+cmVhZF9wYWNrZXQocy0+b3BhcXVlLCBidWYsIHNpemUpOworICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgICAgIHMtPnBvcyArPSBsZW47CisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorCisgICAgbGVuID0gcy0+YnVmX2VuZCAtIHMtPmJ1Zl9wdHI7CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIC8qIFJlc2V0IHRoZSBidWZfZW5kIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIHRvIG1ha2Ugc3VyZQorICAgICAgICAgKiB0aGUgZmlsbF9idWZmZXIgY2FsbCB0cmllcyB0byByZWFkIGFzIG11Y2ggZGF0YSBhcyBmaXRzIGludG8gdGhlCisgICAgICAgICAqIGZ1bGwgYnVmZmVyLCBpbnN0ZWFkIG9mIGp1c3Qgd2hhdCBzcGFjZSBpcyBsZWZ0IGFmdGVyIGJ1Zl9lbmQuCisgICAgICAgICAqIFRoaXMgYXZvaWRzIHJldHVybmluZyBwYXJ0aWFsIHBhY2tldHMgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLAorICAgICAgICAgKiBmb3IgcGFja2V0IGJhc2VkIGlucHV0cy4KKyAgICAgICAgICovCisgICAgICAgIHMtPmJ1Zl9lbmQgPSBzLT5idWZfcHRyID0gcy0+YnVmZmVyOworICAgICAgICBmaWxsX2J1ZmZlcihzKTsKKyAgICAgICAgbGVuID0gcy0+YnVmX2VuZCAtIHMtPmJ1Zl9wdHI7CisgICAgfQorICAgIGlmIChsZW4gPiBzaXplKQorICAgICAgICBsZW4gPSBzaXplOworICAgIG1lbWNweShidWYsIHMtPmJ1Zl9wdHIsIGxlbik7CisgICAgcy0+YnVmX3B0ciArPSBsZW47CisgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgaWYgKHMtPmVycm9yKSAgICAgIHJldHVybiBzLT5lcnJvcjsKKyAgICAgICAgaWYgKGF2aW9fZmVvZihzKSkgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKwordW5zaWduZWQgaW50IGF2aW9fcmwxNihBVklPQ29udGV4dCAqcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgdmFsOworICAgIHZhbCA9IGF2aW9fcjgocyk7CisgICAgdmFsIHw9IGF2aW9fcjgocykgPDwgODsKKyAgICByZXR1cm4gdmFsOworfQorCit1bnNpZ25lZCBpbnQgYXZpb19ybDI0KEFWSU9Db250ZXh0ICpzKQoreworICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgdmFsID0gYXZpb19ybDE2KHMpOworICAgIHZhbCB8PSBhdmlvX3I4KHMpIDw8IDE2OworICAgIHJldHVybiB2YWw7Cit9CisKK3Vuc2lnbmVkIGludCBhdmlvX3JsMzIoQVZJT0NvbnRleHQgKnMpCit7CisgICAgdW5zaWduZWQgaW50IHZhbDsKKyAgICB2YWwgPSBhdmlvX3JsMTYocyk7CisgICAgdmFsIHw9IGF2aW9fcmwxNihzKSA8PCAxNjsKKyAgICByZXR1cm4gdmFsOworfQorCit1aW50NjRfdCBhdmlvX3JsNjQoQVZJT0NvbnRleHQgKnMpCit7CisgICAgdWludDY0X3QgdmFsOworICAgIHZhbCA9ICh1aW50NjRfdClhdmlvX3JsMzIocyk7CisgICAgdmFsIHw9ICh1aW50NjRfdClhdmlvX3JsMzIocykgPDwgMzI7CisgICAgcmV0dXJuIHZhbDsKK30KKwordW5zaWduZWQgaW50IGF2aW9fcmIxNihBVklPQ29udGV4dCAqcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgdmFsOworICAgIHZhbCA9IGF2aW9fcjgocykgPDwgODsKKyAgICB2YWwgfD0gYXZpb19yOChzKTsKKyAgICByZXR1cm4gdmFsOworfQorCit1bnNpZ25lZCBpbnQgYXZpb19yYjI0KEFWSU9Db250ZXh0ICpzKQoreworICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgdmFsID0gYXZpb19yYjE2KHMpIDw8IDg7CisgICAgdmFsIHw9IGF2aW9fcjgocyk7CisgICAgcmV0dXJuIHZhbDsKK30KK3Vuc2lnbmVkIGludCBhdmlvX3JiMzIoQVZJT0NvbnRleHQgKnMpCit7CisgICAgdW5zaWduZWQgaW50IHZhbDsKKyAgICB2YWwgPSBhdmlvX3JiMTYocykgPDwgMTY7CisgICAgdmFsIHw9IGF2aW9fcmIxNihzKTsKKyAgICByZXR1cm4gdmFsOworfQorCitpbnQgZmZfZ2V0X2xpbmUoQVZJT0NvbnRleHQgKnMsIGNoYXIgKmJ1ZiwgaW50IG1heGxlbikKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgY2hhciBjOworCisgICAgZG8geworICAgICAgICBjID0gYXZpb19yOChzKTsKKyAgICAgICAgaWYgKGMgJiYgaSA8IG1heGxlbi0xKQorICAgICAgICAgICAgYnVmW2krK10gPSBjOworICAgIH0gd2hpbGUgKGMgIT0gJ1xuJyAmJiBjICE9ICdccicgJiYgYyk7CisgICAgaWYgKGMgPT0gJ1xyJyAmJiBhdmlvX3I4KHMpICE9ICdcbicgJiYgIWF2aW9fZmVvZihzKSkKKyAgICAgICAgYXZpb19za2lwKHMsIC0xKTsKKworICAgIGJ1ZltpXSA9IDA7CisgICAgcmV0dXJuIGk7Cit9CisKK2ludCBhdmlvX2dldF9zdHIoQVZJT0NvbnRleHQgKnMsIGludCBtYXhsZW4sIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChidWZsZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAvLyByZXNlcnZlIDEgYnl0ZSBmb3IgdGVybWluYXRpbmcgMAorICAgIGJ1ZmxlbiA9IEZGTUlOKGJ1ZmxlbiAtIDEsIG1heGxlbik7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmxlbjsgaSsrKQorICAgICAgICBpZiAoIShidWZbaV0gPSBhdmlvX3I4KHMpKSkKKyAgICAgICAgICAgIHJldHVybiBpICsgMTsKKyAgICBidWZbaV0gPSAwOworICAgIGZvciAoOyBpIDwgbWF4bGVuOyBpKyspCisgICAgICAgIGlmICghYXZpb19yOChzKSkKKyAgICAgICAgICAgIHJldHVybiBpICsgMTsKKyAgICByZXR1cm4gbWF4bGVuOworfQorCisjZGVmaW5lIEdFVF9TVFIxNih0eXBlLCByZWFkKSBcCisgICAgaW50IGF2aW9fZ2V0X3N0cjE2ICMjdHlwZShBVklPQ29udGV4dCAqcGIsIGludCBtYXhsZW4sIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbilcCit7XAorICAgIGNoYXIqIHEgPSBidWY7XAorICAgIGludCByZXQgPSAwO1wKKyAgICBpZiAoYnVmbGVuIDw9IDApIFwKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsgXAorICAgIHdoaWxlIChyZXQgKyAxIDwgbWF4bGVuKSB7XAorICAgICAgICB1aW50OF90IHRtcDtcCisgICAgICAgIHVpbnQzMl90IGNoO1wKKyAgICAgICAgR0VUX1VURjE2KGNoLCAocmV0ICs9IDIpIDw9IG1heGxlbiA/IHJlYWQocGIpIDogMCwgYnJlYWs7KVwKKyAgICAgICAgaWYgKCFjaClcCisgICAgICAgICAgICBicmVhaztcCisgICAgICAgIFBVVF9VVEY4KGNoLCB0bXAsIGlmIChxIC0gYnVmIDwgYnVmbGVuIC0gMSkgKnErKyA9IHRtcDspXAorICAgIH1cCisgICAgKnEgPSAwO1wKKyAgICByZXR1cm4gcmV0O1wKK31cCisKK0dFVF9TVFIxNihsZSwgYXZpb19ybDE2KQorR0VUX1NUUjE2KGJlLCBhdmlvX3JiMTYpCisKKyN1bmRlZiBHRVRfU1RSMTYKKwordWludDY0X3QgYXZpb19yYjY0KEFWSU9Db250ZXh0ICpzKQoreworICAgIHVpbnQ2NF90IHZhbDsKKyAgICB2YWwgPSAodWludDY0X3QpYXZpb19yYjMyKHMpIDw8IDMyOworICAgIHZhbCB8PSAodWludDY0X3QpYXZpb19yYjMyKHMpOworICAgIHJldHVybiB2YWw7Cit9CisKK3VpbnQ2NF90IGZmaW9fcmVhZF92YXJsZW4oQVZJT0NvbnRleHQgKmJjKXsKKyAgICB1aW50NjRfdCB2YWwgPSAwOworICAgIGludCB0bXA7CisKKyAgICBkb3sKKyAgICAgICAgdG1wID0gYXZpb19yOChiYyk7CisgICAgICAgIHZhbD0gKHZhbDw8NykgKyAodG1wJjEyNyk7CisgICAgfXdoaWxlKHRtcCYxMjgpOworICAgIHJldHVybiB2YWw7Cit9CisKK2ludCBmZmlvX2Zkb3BlbihBVklPQ29udGV4dCAqKnMsIFVSTENvbnRleHQgKmgpCit7CisgICAgdWludDhfdCAqYnVmZmVyOworICAgIGludCBidWZmZXJfc2l6ZSwgbWF4X3BhY2tldF9zaXplOworCisgICAgbWF4X3BhY2tldF9zaXplID0gaC0+bWF4X3BhY2tldF9zaXplOworICAgIGlmIChtYXhfcGFja2V0X3NpemUpIHsKKyAgICAgICAgYnVmZmVyX3NpemUgPSBtYXhfcGFja2V0X3NpemU7IC8qIG5vIG5lZWQgdG8gYnVmZmVyaXplIG1vcmUgdGhhbiBvbmUgcGFja2V0ICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmVyX3NpemUgPSBJT19CVUZGRVJfU0laRTsKKyAgICB9CisgICAgYnVmZmVyID0gYXZfbWFsbG9jKGJ1ZmZlcl9zaXplKTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICpzID0gYXZpb19hbGxvY19jb250ZXh0KGJ1ZmZlciwgYnVmZmVyX3NpemUsIGgtPmZsYWdzICYgQVZJT19GTEFHX1dSSVRFLCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilmZnVybF9yZWFkLCAodm9pZCopZmZ1cmxfd3JpdGUsICh2b2lkKilmZnVybF9zZWVrKTsKKyAgICBpZiAoISpzKSB7CisgICAgICAgIGF2X2ZyZWUoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgKCpzKS0+ZGlyZWN0ID0gaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfRElSRUNUOworICAgICgqcyktPnNlZWthYmxlID0gaC0+aXNfc3RyZWFtZWQgPyAwIDogQVZJT19TRUVLQUJMRV9OT1JNQUw7CisgICAgKCpzKS0+bWF4X3BhY2tldF9zaXplID0gbWF4X3BhY2tldF9zaXplOworICAgIGlmKGgtPnByb3QpIHsKKyAgICAgICAgKCpzKS0+cmVhZF9wYXVzZSA9IChpbnQgKCopKHZvaWQgKiwgaW50KSloLT5wcm90LT51cmxfcmVhZF9wYXVzZTsKKyAgICAgICAgKCpzKS0+cmVhZF9zZWVrICA9IChpbnQ2NF90ICgqKSh2b2lkICosIGludCwgaW50NjRfdCwgaW50KSloLT5wcm90LT51cmxfcmVhZF9zZWVrOworICAgIH0KKyAgICAoKnMpLT5hdl9jbGFzcyA9ICZmZmlvX3VybF9jbGFzczsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmaW9fZW5zdXJlX3NlZWtiYWNrKEFWSU9Db250ZXh0ICpzLCBpbnQ2NF90IGJ1Zl9zaXplKQoreworICAgIHVpbnQ4X3QgKmJ1ZmZlcjsKKyAgICBpbnQgbWF4X2J1ZmZlcl9zaXplID0gcy0+bWF4X3BhY2tldF9zaXplID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF4X3BhY2tldF9zaXplIDogSU9fQlVGRkVSX1NJWkU7CisgICAgaW50IGZpbGxlZCA9IHMtPmJ1Zl9lbmQgLSBzLT5idWZmZXI7CisKKyAgICBidWZfc2l6ZSArPSBzLT5idWZfcHRyIC0gcy0+YnVmZmVyICsgbWF4X2J1ZmZlcl9zaXplOworCisgICAgaWYgKGJ1Zl9zaXplIDwgZmlsbGVkIHx8IHMtPnNlZWthYmxlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBhdl9hc3NlcnQwKCFzLT53cml0ZV9mbGFnKTsKKworICAgIGJ1ZmZlciA9IGF2X21hbGxvYyhidWZfc2l6ZSk7CisgICAgaWYgKCFidWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBtZW1jcHkoYnVmZmVyLCBzLT5idWZmZXIsIGZpbGxlZCk7CisgICAgYXZfZnJlZShzLT5idWZmZXIpOworICAgIHMtPmJ1Zl9wdHIgPSBidWZmZXIgKyAocy0+YnVmX3B0ciAtIHMtPmJ1ZmZlcik7CisgICAgcy0+YnVmX2VuZCA9IGJ1ZmZlciArIChzLT5idWZfZW5kIC0gcy0+YnVmZmVyKTsKKyAgICBzLT5idWZmZXIgPSBidWZmZXI7CisgICAgcy0+YnVmZmVyX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmaW9fc2V0X2J1Zl9zaXplKEFWSU9Db250ZXh0ICpzLCBpbnQgYnVmX3NpemUpCit7CisgICAgdWludDhfdCAqYnVmZmVyOworICAgIGJ1ZmZlciA9IGF2X21hbGxvYyhidWZfc2l6ZSk7CisgICAgaWYgKCFidWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9mcmVlKHMtPmJ1ZmZlcik7CisgICAgcy0+YnVmZmVyID0gYnVmZmVyOworICAgIHMtPm9yaWdfYnVmZmVyX3NpemUgPQorICAgIHMtPmJ1ZmZlcl9zaXplID0gYnVmX3NpemU7CisgICAgcy0+YnVmX3B0ciA9IGJ1ZmZlcjsKKyAgICB1cmxfcmVzZXRidWYocywgcy0+d3JpdGVfZmxhZyA/IEFWSU9fRkxBR19XUklURSA6IEFWSU9fRkxBR19SRUFEKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cmxfcmVzZXRidWYoQVZJT0NvbnRleHQgKnMsIGludCBmbGFncykKK3sKKyAgICBhdl9hc3NlcnQxKGZsYWdzID09IEFWSU9fRkxBR19XUklURSB8fCBmbGFncyA9PSBBVklPX0ZMQUdfUkVBRCk7CisKKyAgICBpZiAoZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUpIHsKKyAgICAgICAgcy0+YnVmX2VuZCA9IHMtPmJ1ZmZlciArIHMtPmJ1ZmZlcl9zaXplOworICAgICAgICBzLT53cml0ZV9mbGFnID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5idWZfZW5kID0gcy0+YnVmZmVyOworICAgICAgICBzLT53cml0ZV9mbGFnID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZmlvX3Jld2luZF93aXRoX3Byb2JlX2RhdGEoQVZJT0NvbnRleHQgKnMsIHVuc2lnbmVkIGNoYXIgKipidWZwLCBpbnQgYnVmX3NpemUpCit7CisgICAgaW50NjRfdCBidWZmZXJfc3RhcnQ7CisgICAgaW50IGJ1ZmZlcl9zaXplOworICAgIGludCBvdmVybGFwLCBuZXdfc2l6ZSwgYWxsb2Nfc2l6ZTsKKyAgICB1aW50OF90ICpidWYgPSAqYnVmcDsKKworICAgIGlmIChzLT53cml0ZV9mbGFnKSB7CisgICAgICAgIGF2X2ZyZWVwKGJ1ZnApOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGJ1ZmZlcl9zaXplID0gcy0+YnVmX2VuZCAtIHMtPmJ1ZmZlcjsKKworICAgIC8qIHRoZSBidWZmZXJzIG11c3QgdG91Y2ggb3Igb3ZlcmxhcCAqLworICAgIGlmICgoYnVmZmVyX3N0YXJ0ID0gcy0+cG9zIC0gYnVmZmVyX3NpemUpID4gYnVmX3NpemUpIHsKKyAgICAgICAgYXZfZnJlZXAoYnVmcCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgb3ZlcmxhcCA9IGJ1Zl9zaXplIC0gYnVmZmVyX3N0YXJ0OworICAgIG5ld19zaXplID0gYnVmX3NpemUgKyBidWZmZXJfc2l6ZSAtIG92ZXJsYXA7CisKKyAgICBhbGxvY19zaXplID0gRkZNQVgocy0+YnVmZmVyX3NpemUsIG5ld19zaXplKTsKKyAgICBpZiAoYWxsb2Nfc2l6ZSA+IGJ1Zl9zaXplKQorICAgICAgICBpZiAoIShidWYgPSAoKmJ1ZnApID0gYXZfcmVhbGxvY19mKGJ1ZiwgMSwgYWxsb2Nfc2l6ZSkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChuZXdfc2l6ZSA+IGJ1Zl9zaXplKSB7CisgICAgICAgIG1lbWNweShidWYgKyBidWZfc2l6ZSwgcy0+YnVmZmVyICsgb3ZlcmxhcCwgYnVmZmVyX3NpemUgLSBvdmVybGFwKTsKKyAgICAgICAgYnVmX3NpemUgPSBuZXdfc2l6ZTsKKyAgICB9CisKKyAgICBhdl9mcmVlKHMtPmJ1ZmZlcik7CisgICAgcy0+YnVmX3B0ciA9IHMtPmJ1ZmZlciA9IGJ1ZjsKKyAgICBzLT5idWZmZXJfc2l6ZSA9IGFsbG9jX3NpemU7CisgICAgcy0+cG9zID0gYnVmX3NpemU7CisgICAgcy0+YnVmX2VuZCA9IHMtPmJ1Zl9wdHIgKyBidWZfc2l6ZTsKKyAgICBzLT5lb2ZfcmVhY2hlZCA9IDA7CisgICAgcy0+bXVzdF9mbHVzaCA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2aW9fb3BlbihBVklPQ29udGV4dCAqKnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgcmV0dXJuIGF2aW9fb3BlbjIocywgZmlsZW5hbWUsIGZsYWdzLCBOVUxMLCBOVUxMKTsKK30KKworaW50IGF2aW9fb3BlbjIoQVZJT0NvbnRleHQgKipzLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgY29uc3QgQVZJT0ludGVycnVwdENCICppbnRfY2IsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCit7CisgICAgVVJMQ29udGV4dCAqaDsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gZmZ1cmxfb3BlbigmaCwgZmlsZW5hbWUsIGZsYWdzLCBpbnRfY2IsIG9wdGlvbnMpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGVyciA9IGZmaW9fZmRvcGVuKHMsIGgpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGZmdXJsX2Nsb3NlKGgpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2aW9fY2xvc2UoQVZJT0NvbnRleHQgKnMpCit7CisgICAgVVJMQ29udGV4dCAqaDsKKworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBhdmlvX2ZsdXNoKHMpOworICAgIGggPSBzLT5vcGFxdWU7CisgICAgYXZfZnJlZXAoJnMtPmJ1ZmZlcik7CisgICAgaWYgKHMtPndyaXRlX2ZsYWcpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJTdGF0aXN0aWNzOiAlZCBzZWVrcywgJWQgd3JpdGVvdXRzXG4iLCBzLT5zZWVrX2NvdW50LCBzLT53cml0ZW91dF9jb3VudCk7CisgICAgZWxzZQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiU3RhdGlzdGljczogJSJQUklkNjQiIGJ5dGVzIHJlYWQsICVkIHNlZWtzXG4iLCBzLT5ieXRlc19yZWFkLCBzLT5zZWVrX2NvdW50KTsKKyAgICBhdl9mcmVlKHMpOworICAgIHJldHVybiBmZnVybF9jbG9zZShoKTsKK30KKworaW50IGF2aW9fY2xvc2VwKEFWSU9Db250ZXh0ICoqcykKK3sKKyAgICBpbnQgcmV0ID0gYXZpb19jbG9zZSgqcyk7CisgICAgKnMgPSBOVUxMOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBhdmlvX3ByaW50ZihBVklPQ29udGV4dCAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICBjaGFyIGJ1Zls0MDk2XTsKKyAgICBpbnQgcmV0OworCisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgcmV0ID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgYXZpb193cml0ZShzLCBidWYsIHN0cmxlbihidWYpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZpb19wYXVzZShBVklPQ29udGV4dCAqcywgaW50IHBhdXNlKQoreworICAgIGlmICghcy0+cmVhZF9wYXVzZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICByZXR1cm4gcy0+cmVhZF9wYXVzZShzLT5vcGFxdWUsIHBhdXNlKTsKK30KKworaW50NjRfdCBhdmlvX3NlZWtfdGltZShBVklPQ29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBVUkxDb250ZXh0ICpoID0gcy0+b3BhcXVlOworICAgIGludDY0X3QgcmV0OworICAgIGlmICghcy0+cmVhZF9zZWVrKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIHJldCA9IHMtPnJlYWRfc2VlayhoLCBzdHJlYW1faW5kZXgsIHRpbWVzdGFtcCwgZmxhZ3MpOworICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICBpbnQ2NF90IHBvczsKKyAgICAgICAgcy0+YnVmX3B0ciA9IHMtPmJ1Zl9lbmQ7IC8vIEZsdXNoIGJ1ZmZlcgorICAgICAgICBwb3MgPSBzLT5zZWVrKGgsIDAsIFNFRUtfQ1VSKTsKKyAgICAgICAgaWYgKHBvcyA+PSAwKQorICAgICAgICAgICAgcy0+cG9zID0gcG9zOworICAgICAgICBlbHNlIGlmIChwb3MgIT0gQVZFUlJPUihFTk9TWVMpKQorICAgICAgICAgICAgcmV0ID0gcG9zOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZpb19yZWFkX3RvX2JwcmludChBVklPQ29udGV4dCAqaCwgQVZCUHJpbnQgKnBiLCBzaXplX3QgbWF4X3NpemUpCit7CisgICAgaW50IHJldDsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgICB3aGlsZSAobWF4X3NpemUpIHsKKyAgICAgICAgcmV0ID0gYXZpb19yZWFkKGgsIGJ1ZiwgRkZNSU4obWF4X3NpemUsIHNpemVvZihidWYpKSk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHJldCA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYXZfYnByaW50X2FwcGVuZF9kYXRhKHBiLCBidWYsIHJldCk7CisgICAgICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKHBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1heF9zaXplIC09IHJldDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIG91dHB1dCBpbiBhIGR5bmFtaWMgYnVmZmVyICovCisKK3R5cGVkZWYgc3RydWN0IER5bkJ1ZmZlciB7CisgICAgaW50IHBvcywgc2l6ZSwgYWxsb2NhdGVkX3NpemU7CisgICAgdWludDhfdCAqYnVmZmVyOworICAgIGludCBpb19idWZmZXJfc2l6ZTsKKyAgICB1aW50OF90IGlvX2J1ZmZlclsxXTsKK30gRHluQnVmZmVyOworCitzdGF0aWMgaW50IGR5bl9idWZfd3JpdGUodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBEeW5CdWZmZXIgKmQgPSBvcGFxdWU7CisgICAgdW5zaWduZWQgbmV3X3NpemUsIG5ld19hbGxvY2F0ZWRfc2l6ZTsKKworICAgIC8qIHJlYWxsb2NhdGUgYnVmZmVyIGlmIG5lZWRlZCAqLworICAgIG5ld19zaXplID0gZC0+cG9zICsgYnVmX3NpemU7CisgICAgbmV3X2FsbG9jYXRlZF9zaXplID0gZC0+YWxsb2NhdGVkX3NpemU7CisgICAgaWYgKG5ld19zaXplIDwgZC0+cG9zIHx8IG5ld19zaXplID4gSU5UX01BWC8yKQorICAgICAgICByZXR1cm4gLTE7CisgICAgd2hpbGUgKG5ld19zaXplID4gbmV3X2FsbG9jYXRlZF9zaXplKSB7CisgICAgICAgIGlmICghbmV3X2FsbG9jYXRlZF9zaXplKQorICAgICAgICAgICAgbmV3X2FsbG9jYXRlZF9zaXplID0gbmV3X3NpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5ld19hbGxvY2F0ZWRfc2l6ZSArPSBuZXdfYWxsb2NhdGVkX3NpemUgLyAyICsgMTsKKyAgICB9CisKKyAgICBpZiAobmV3X2FsbG9jYXRlZF9zaXplID4gZC0+YWxsb2NhdGVkX3NpemUpIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmZC0+YnVmZmVyLCBuZXdfYWxsb2NhdGVkX3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgIGQtPmFsbG9jYXRlZF9zaXplID0gMDsKKyAgICAgICAgICAgIGQtPnNpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBkLT5hbGxvY2F0ZWRfc2l6ZSA9IG5ld19hbGxvY2F0ZWRfc2l6ZTsKKyAgICB9CisgICAgbWVtY3B5KGQtPmJ1ZmZlciArIGQtPnBvcywgYnVmLCBidWZfc2l6ZSk7CisgICAgZC0+cG9zID0gbmV3X3NpemU7CisgICAgaWYgKGQtPnBvcyA+IGQtPnNpemUpCisgICAgICAgIGQtPnNpemUgPSBkLT5wb3M7CisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgaW50IGR5bl9wYWNrZXRfYnVmX3dyaXRlKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgdW5zaWduZWQgY2hhciBidWYxWzRdOworICAgIGludCByZXQ7CisKKyAgICAvKiBwYWNrZXRpemVkIHdyaXRlOiBvdXRwdXQgdGhlIGhlYWRlciAqLworICAgIEFWX1dCMzIoYnVmMSwgYnVmX3NpemUpOworICAgIHJldCA9IGR5bl9idWZfd3JpdGUob3BhcXVlLCBidWYxLCA0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIHRoZW4gdGhlIGRhdGEgKi8KKyAgICByZXR1cm4gZHluX2J1Zl93cml0ZShvcGFxdWUsIGJ1ZiwgYnVmX3NpemUpOworfQorCitzdGF0aWMgaW50NjRfdCBkeW5fYnVmX3NlZWsodm9pZCAqb3BhcXVlLCBpbnQ2NF90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKyAgICBEeW5CdWZmZXIgKmQgPSBvcGFxdWU7CisKKyAgICBpZiAod2hlbmNlID09IFNFRUtfQ1VSKQorICAgICAgICBvZmZzZXQgKz0gZC0+cG9zOworICAgIGVsc2UgaWYgKHdoZW5jZSA9PSBTRUVLX0VORCkKKyAgICAgICAgb2Zmc2V0ICs9IGQtPnNpemU7CisgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gMHg3ZmZmZmZmZkxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZC0+cG9zID0gb2Zmc2V0OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVybF9vcGVuX2R5bl9idWZfaW50ZXJuYWwoQVZJT0NvbnRleHQgKipzLCBpbnQgbWF4X3BhY2tldF9zaXplKQoreworICAgIER5bkJ1ZmZlciAqZDsKKyAgICB1bnNpZ25lZCBpb19idWZmZXJfc2l6ZSA9IG1heF9wYWNrZXRfc2l6ZSA/IG1heF9wYWNrZXRfc2l6ZSA6IDEwMjQ7CisKKyAgICBpZiAoc2l6ZW9mKER5bkJ1ZmZlcikgKyBpb19idWZmZXJfc2l6ZSA8IGlvX2J1ZmZlcl9zaXplKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZCA9IGF2X21hbGxvY3ooc2l6ZW9mKER5bkJ1ZmZlcikgKyBpb19idWZmZXJfc2l6ZSk7CisgICAgaWYgKCFkKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGQtPmlvX2J1ZmZlcl9zaXplID0gaW9fYnVmZmVyX3NpemU7CisgICAgKnMgPSBhdmlvX2FsbG9jX2NvbnRleHQoZC0+aW9fYnVmZmVyLCBkLT5pb19idWZmZXJfc2l6ZSwgMSwgZCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcGFja2V0X3NpemUgPyBkeW5fcGFja2V0X2J1Zl93cml0ZSA6IGR5bl9idWZfd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3BhY2tldF9zaXplID8gTlVMTCA6IGR5bl9idWZfc2Vlayk7CisgICAgaWYoISpzKSB7CisgICAgICAgIGF2X2ZyZWUoZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgICgqcyktPm1heF9wYWNrZXRfc2l6ZSA9IG1heF9wYWNrZXRfc2l6ZTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2aW9fb3Blbl9keW5fYnVmKEFWSU9Db250ZXh0ICoqcykKK3sKKyAgICByZXR1cm4gdXJsX29wZW5fZHluX2J1Zl9pbnRlcm5hbChzLCAwKTsKK30KKworaW50IGZmaW9fb3Blbl9keW5fcGFja2V0X2J1ZihBVklPQ29udGV4dCAqKnMsIGludCBtYXhfcGFja2V0X3NpemUpCit7CisgICAgaWYgKG1heF9wYWNrZXRfc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHVybF9vcGVuX2R5bl9idWZfaW50ZXJuYWwocywgbWF4X3BhY2tldF9zaXplKTsKK30KKworaW50IGF2aW9fY2xvc2VfZHluX2J1ZihBVklPQ29udGV4dCAqcywgdWludDhfdCAqKnBidWZmZXIpCit7CisgICAgRHluQnVmZmVyICpkOworICAgIGludCBzaXplOworICAgIHN0YXRpYyBjb25zdCBjaGFyIHBhZGJ1ZltGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFXSA9IHswfTsKKyAgICBpbnQgcGFkZGluZyA9IDA7CisKKyAgICBpZiAoIXMpIHsKKyAgICAgICAgKnBidWZmZXIgPSBOVUxMOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBkb24ndCBhdHRlbXB0IHRvIHBhZCBmaXhlZC1zaXplIHBhY2tldCBidWZmZXJzICovCisgICAgaWYgKCFzLT5tYXhfcGFja2V0X3NpemUpIHsKKyAgICAgICAgYXZpb193cml0ZShzLCBwYWRidWYsIHNpemVvZihwYWRidWYpKTsKKyAgICAgICAgcGFkZGluZyA9IEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkU7CisgICAgfQorCisgICAgYXZpb19mbHVzaChzKTsKKworICAgIGQgPSBzLT5vcGFxdWU7CisgICAgKnBidWZmZXIgPSBkLT5idWZmZXI7CisgICAgc2l6ZSA9IGQtPnNpemU7CisgICAgYXZfZnJlZShkKTsKKyAgICBhdl9mcmVlKHMpOworICAgIHJldHVybiBzaXplIC0gcGFkZGluZzsKK30KKworc3RhdGljIGludCBudWxsX2J1Zl93cml0ZSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIER5bkJ1ZmZlciAqZCA9IG9wYXF1ZTsKKworICAgIGQtPnBvcyArPSBidWZfc2l6ZTsKKyAgICBpZiAoZC0+cG9zID4gZC0+c2l6ZSkKKyAgICAgICAgZC0+c2l6ZSA9IGQtPnBvczsKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK2ludCBmZmlvX29wZW5fbnVsbF9idWYoQVZJT0NvbnRleHQgKipzKQoreworICAgIGludCByZXQgPSB1cmxfb3Blbl9keW5fYnVmX2ludGVybmFsKHMsIDApOworICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICBBVklPQ29udGV4dCAqcGIgPSAqczsKKyAgICAgICAgcGItPndyaXRlX3BhY2tldCA9IG51bGxfYnVmX3dyaXRlOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZpb19jbG9zZV9udWxsX2J1ZihBVklPQ29udGV4dCAqcykKK3sKKyAgICBEeW5CdWZmZXIgKmQgPSBzLT5vcGFxdWU7CisgICAgaW50IHNpemU7CisKKyAgICBhdmlvX2ZsdXNoKHMpOworCisgICAgc2l6ZSA9IGQtPnNpemU7CisgICAgYXZfZnJlZShkKTsKKyAgICBhdl9mcmVlKHMpOworICAgIHJldHVybiBzaXplOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2aXN5bnRoLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXZpc3ludGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDFkN2U0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2aXN5bnRoLmMKQEAgLTAsMCArMSw2ODMgQEAKKy8qCisgKiBBdmlTeW50aC9BdnhTeW50aCBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQXZ4U3ludGggVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKiBFbmFibGUgZnVuY3Rpb24gcG9pbnRlciBkZWZpbml0aW9ucyBmb3IgcnVudGltZSBsb2FkaW5nLiAqLworI2RlZmluZSBBVlNDX05PX0RFQ0xTUEVDCisKKy8qIFBsYXRmb3JtLXNwZWNpZmljIGRpcmVjdGl2ZXMgZm9yIEF2aVN5bnRoIHZzIEF2eFN5bnRoLiAqLworI2lmZGVmIF9XSU4zMgorICAjaW5jbHVkZSA8d2luZG93cy5oPgorICAjdW5kZWYgRVhURVJOX0MKKyAgI2luY2x1ZGUgImNvbXBhdC9hdmlzeW50aC9hdmlzeW50aF9jLmgiCisgICNpbmNsdWRlICJjb21wYXQvYXZpc3ludGgvYXZpc3ludGhfY18yNS5oIgorICAjZGVmaW5lIEFWSVNZTlRIX0xJQiAiYXZpc3ludGgiCisgICNkZWZpbmUgVVNJTkdfQVZJU1lOVEgKKyNlbHNlCisgICNpbmNsdWRlIDxkbGZjbi5oPgorICAjaW5jbHVkZSAiY29tcGF0L2F2aXN5bnRoL2F2eHN5bnRoX2MuaCIKKyAgICAjaWYgZGVmaW5lZCAoX19BUFBMRV9fKQorICAgICAgI2RlZmluZSBBVklTWU5USF9MSUIgImxpYmF2eHN5bnRoLmR5bGliIgorICAgICNlbHNlCisgICAgICAjZGVmaW5lIEFWSVNZTlRIX0xJQiAibGliYXZ4c3ludGguc28iCisgICAgI2VuZGlmCisKKyAgI2RlZmluZSBMb2FkTGlicmFyeSh4KSBkbG9wZW4oeCwgUlRMRF9OT1cgfCBSVExEX0dMT0JBTCkKKyAgI2RlZmluZSBHZXRQcm9jQWRkcmVzcyBkbHN5bQorICAjZGVmaW5lIEZyZWVMaWJyYXJ5IGRsY2xvc2UKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBBdmlTeW50aExpYnJhcnkgeworICAgIHZvaWQgKmxpYnJhcnk7CisjZGVmaW5lIEFWU0NfREVDTEFSRV9GVU5DKG5hbWUpIG5hbWUgIyMgX2Z1bmMgbmFtZQorICAgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19iaXRfYmx0KTsKKyAgICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfY2xpcF9nZXRfZXJyb3IpOworICAgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19jcmVhdGVfc2NyaXB0X2Vudmlyb25tZW50KTsKKyAgICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfZGVsZXRlX3NjcmlwdF9lbnZpcm9ubWVudCk7CisgICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2dldF9hdWRpbyk7CisgICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2dldF9lcnJvcik7CisgICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2dldF9mcmFtZSk7CisgICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2dldF92ZXJzaW9uKTsKKyAgICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfZ2V0X3ZpZGVvX2luZm8pOworICAgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19pbnZva2UpOworICAgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19yZWxlYXNlX2NsaXApOworICAgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19yZWxlYXNlX3ZhbHVlKTsKKyAgICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfcmVsZWFzZV92aWRlb19mcmFtZSk7CisgICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX3Rha2VfY2xpcCk7CisjdW5kZWYgQVZTQ19ERUNMQVJFX0ZVTkMKK30gQXZpU3ludGhMaWJyYXJ5OworCit0eXBlZGVmIHN0cnVjdCBBdmlTeW50aENvbnRleHQgeworICAgIEFWU19TY3JpcHRFbnZpcm9ubWVudCAqZW52OworICAgIEFWU19DbGlwICpjbGlwOworICAgIGNvbnN0IEFWU19WaWRlb0luZm8gKnZpOworCisgICAgLyogYXZpc3ludGhfcmVhZF9wYWNrZXRfdmlkZW8oKSBpdGVyYXRlcyBvdmVyIHRoaXMuICovCisgICAgaW50IG5fcGxhbmVzOworICAgIGNvbnN0IGludCAqcGxhbmVzOworCisgICAgaW50IGN1cnJfc3RyZWFtOworICAgIGludCBjdXJyX2ZyYW1lOworICAgIGludDY0X3QgY3Vycl9zYW1wbGU7CisKKyAgICBpbnQgZXJyb3I7CisKKyAgICAvKiBMaW5rZWQgbGlzdCBwb2ludGVycy4gKi8KKyAgICBzdHJ1Y3QgQXZpU3ludGhDb250ZXh0ICpuZXh0OworfSBBdmlTeW50aENvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBpbnQgYXZzX3BsYW5lc19wYWNrZWRbMV0gPSB7IDAgfTsKK3N0YXRpYyBjb25zdCBpbnQgYXZzX3BsYW5lc19ncmV5WzFdICAgPSB7IEFWU19QTEFOQVJfWSB9Oworc3RhdGljIGNvbnN0IGludCBhdnNfcGxhbmVzX3l1dlszXSAgICA9IHsgQVZTX1BMQU5BUl9ZLCBBVlNfUExBTkFSX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlNfUExBTkFSX1YgfTsKKworLyogQSBjb25mbGljdCBiZXR3ZWVuIEMrKyBnbG9iYWwgb2JqZWN0cywgYXRleGl0LCBhbmQgZHluYW1pYyBsb2FkaW5nIHJlcXVpcmVzCisgKiB1cyB0byByZWdpc3RlciBvdXIgb3duIGF0ZXhpdCBoYW5kbGVyIHRvIHByZXZlbnQgZG91YmxlIGZyZWVpbmcuICovCitzdGF0aWMgQXZpU3ludGhMaWJyYXJ5IGF2c19saWJyYXJ5Oworc3RhdGljIGludCBhdnNfYXRleGl0X2NhbGxlZCAgICAgICAgPSAwOworCisvKiBMaW5rZWQgbGlzdCBvZiBBdmlTeW50aENvbnRleHRzLiBBbiBhdGV4aXQgaGFuZGxlciBkZXN0cm95cyB0aGlzIGxpc3QuICovCitzdGF0aWMgQXZpU3ludGhDb250ZXh0ICphdnNfY3R4X2xpc3QgPSBOVUxMOworCitzdGF0aWMgYXZfY29sZCB2b2lkIGF2aXN5bnRoX2F0ZXhpdF9oYW5kbGVyKHZvaWQpOworCitzdGF0aWMgYXZfY29sZCBpbnQgYXZpc3ludGhfbG9hZF9saWJyYXJ5KHZvaWQpCit7CisgICAgYXZzX2xpYnJhcnkubGlicmFyeSA9IExvYWRMaWJyYXJ5KEFWSVNZTlRIX0xJQik7CisgICAgaWYgKCFhdnNfbGlicmFyeS5saWJyYXJ5KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworCisjZGVmaW5lIExPQURfQVZTX0ZVTkMobmFtZSwgY29udGludWVfb25fZmFpbCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXZzX2xpYnJhcnkubmFtZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhhdnNfbGlicmFyeS5saWJyYXJ5LCAjbmFtZSk7ICAgICAgICBcCisgICAgICAgIGlmICghY29udGludWVfb25fZmFpbCAmJiAhYXZzX2xpYnJhcnkubmFtZSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgIExPQURfQVZTX0ZVTkMoYXZzX2JpdF9ibHQsIDApOworICAgIExPQURfQVZTX0ZVTkMoYXZzX2NsaXBfZ2V0X2Vycm9yLCAwKTsKKyAgICBMT0FEX0FWU19GVU5DKGF2c19jcmVhdGVfc2NyaXB0X2Vudmlyb25tZW50LCAwKTsKKyAgICBMT0FEX0FWU19GVU5DKGF2c19kZWxldGVfc2NyaXB0X2Vudmlyb25tZW50LCAwKTsKKyAgICBMT0FEX0FWU19GVU5DKGF2c19nZXRfYXVkaW8sIDApOworICAgIExPQURfQVZTX0ZVTkMoYXZzX2dldF9lcnJvciwgMSk7IC8vIE5ldyB0byBBdmlTeW50aCAyLjYKKyAgICBMT0FEX0FWU19GVU5DKGF2c19nZXRfZnJhbWUsIDApOworICAgIExPQURfQVZTX0ZVTkMoYXZzX2dldF92ZXJzaW9uLCAwKTsKKyAgICBMT0FEX0FWU19GVU5DKGF2c19nZXRfdmlkZW9faW5mbywgMCk7CisgICAgTE9BRF9BVlNfRlVOQyhhdnNfaW52b2tlLCAwKTsKKyAgICBMT0FEX0FWU19GVU5DKGF2c19yZWxlYXNlX2NsaXAsIDApOworICAgIExPQURfQVZTX0ZVTkMoYXZzX3JlbGVhc2VfdmFsdWUsIDApOworICAgIExPQURfQVZTX0ZVTkMoYXZzX3JlbGVhc2VfdmlkZW9fZnJhbWUsIDApOworICAgIExPQURfQVZTX0ZVTkMoYXZzX3Rha2VfY2xpcCwgMCk7CisjdW5kZWYgTE9BRF9BVlNfRlVOQworCisgICAgYXRleGl0KGF2aXN5bnRoX2F0ZXhpdF9oYW5kbGVyKTsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBGcmVlTGlicmFyeShhdnNfbGlicmFyeS5saWJyYXJ5KTsKKyAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworfQorCisvKiBOb3RlIHRoYXQgYXZpc3ludGhfY29udGV4dF9jcmVhdGUgYW5kIGF2aXN5bnRoX2NvbnRleHRfZGVzdHJveQorICogZG8gbm90IGFsbG9jYXRlIG9yIGZyZWUgdGhlIGFjdHVhbCBjb250ZXh0ISBUaGF0IGlzIHRha2VuIGNhcmUgb2YKKyAqIGJ5IGxpYmF2Zm9ybWF0LiAqLworc3RhdGljIGF2X2NvbGQgaW50IGF2aXN5bnRoX2NvbnRleHRfY3JlYXRlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBdmlTeW50aENvbnRleHQgKmF2cyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFhdnNfbGlicmFyeS5saWJyYXJ5KQorICAgICAgICBpZiAocmV0ID0gYXZpc3ludGhfbG9hZF9saWJyYXJ5KCkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZzLT5lbnYgPSBhdnNfbGlicmFyeS5hdnNfY3JlYXRlX3NjcmlwdF9lbnZpcm9ubWVudCgzKTsKKyAgICBpZiAoYXZzX2xpYnJhcnkuYXZzX2dldF9lcnJvcikgeworICAgICAgICBjb25zdCBjaGFyICplcnJvciA9IGF2c19saWJyYXJ5LmF2c19nZXRfZXJyb3IoYXZzLT5lbnYpOworICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICIlc1xuIiwgZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYXZzX2N0eF9saXN0KSB7CisgICAgICAgIGF2c19jdHhfbGlzdCA9IGF2czsKKyAgICB9IGVsc2UgeworICAgICAgICBhdnMtPm5leHQgICAgPSBhdnNfY3R4X2xpc3Q7CisgICAgICAgIGF2c19jdHhfbGlzdCA9IGF2czsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBhdmlzeW50aF9jb250ZXh0X2Rlc3Ryb3koQXZpU3ludGhDb250ZXh0ICphdnMpCit7CisgICAgaWYgKGF2c19hdGV4aXRfY2FsbGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoYXZzID09IGF2c19jdHhfbGlzdCkgeworICAgICAgICBhdnNfY3R4X2xpc3QgPSBhdnMtPm5leHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQXZpU3ludGhDb250ZXh0ICpwcmV2ID0gYXZzX2N0eF9saXN0OworICAgICAgICB3aGlsZSAocHJldi0+bmV4dCAhPSBhdnMpCisgICAgICAgICAgICBwcmV2ID0gcHJldi0+bmV4dDsKKyAgICAgICAgcHJldi0+bmV4dCA9IGF2cy0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAoYXZzLT5jbGlwKSB7CisgICAgICAgIGF2c19saWJyYXJ5LmF2c19yZWxlYXNlX2NsaXAoYXZzLT5jbGlwKTsKKyAgICAgICAgYXZzLT5jbGlwID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGF2cy0+ZW52KSB7CisgICAgICAgIGF2c19saWJyYXJ5LmF2c19kZWxldGVfc2NyaXB0X2Vudmlyb25tZW50KGF2cy0+ZW52KTsKKyAgICAgICAgYXZzLT5lbnYgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBhdmlzeW50aF9hdGV4aXRfaGFuZGxlcih2b2lkKQoreworICAgIEF2aVN5bnRoQ29udGV4dCAqYXZzID0gYXZzX2N0eF9saXN0OworCisgICAgd2hpbGUgKGF2cykgeworICAgICAgICBBdmlTeW50aENvbnRleHQgKm5leHQgPSBhdnMtPm5leHQ7CisgICAgICAgIGF2aXN5bnRoX2NvbnRleHRfZGVzdHJveShhdnMpOworICAgICAgICBhdnMgPSBuZXh0OworICAgIH0KKyAgICBGcmVlTGlicmFyeShhdnNfbGlicmFyeS5saWJyYXJ5KTsKKworICAgIGF2c19hdGV4aXRfY2FsbGVkID0gMTsKK30KKworLyogQ3JlYXRlIEFWU3RyZWFtIGZyb20gYXVkaW8gYW5kIHZpZGVvIGRhdGEuICovCitzdGF0aWMgaW50IGF2aXN5bnRoX2NyZWF0ZV9zdHJlYW1fdmlkZW8oQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCit7CisgICAgQXZpU3ludGhDb250ZXh0ICphdnMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHBsYW5hciA9IDA7IC8vIDA6IHBhY2tlZCwgMTogWVVWLCAyOiBZOAorCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IGF2cy0+dmktPndpZHRoOworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2cy0+dmktPmhlaWdodDsKKworICAgIHN0LT50aW1lX2Jhc2UgICAgICAgICA9IChBVlJhdGlvbmFsKSB7IGF2cy0+dmktPmZwc19kZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnMtPnZpLT5mcHNfbnVtZXJhdG9yIH07CisgICAgc3QtPmF2Z19mcmFtZV9yYXRlICAgID0gKEFWUmF0aW9uYWwpIHsgYXZzLT52aS0+ZnBzX251bWVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnMtPnZpLT5mcHNfZGVub21pbmF0b3IgfTsKKyAgICBzdC0+c3RhcnRfdGltZSAgICAgICAgPSAwOworICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICA9IGF2cy0+dmktPm51bV9mcmFtZXM7CisgICAgc3QtPm5iX2ZyYW1lcyAgICAgICAgID0gYXZzLT52aS0+bnVtX2ZyYW1lczsKKworICAgIHN3aXRjaCAoYXZzLT52aS0+cGl4ZWxfdHlwZSkgeworI2lmZGVmIFVTSU5HX0FWSVNZTlRICisgICAgY2FzZSBBVlNfQ1NfWVYyNDoKKyAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWU19DU19ZVjE2OgorICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX1lWNDExOgorICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQxMVA7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX1k4OgorICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVk4OworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgPSAyOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgQVZTX0NTX0JHUjI0OgorICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWU19DU19CR1IzMjoKKyAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IzMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfWVVZMjoKKyAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVlWNDIyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWU19DU19ZVjEyOgorICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX0k0MjA6IC8vIElzIHRoaXMgZXZlbiB1c2VkIGFueXdoZXJlPworICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAidW5rbm93biBBdmlTeW50aCBjb2xvcnNwYWNlICVkXG4iLCBhdnMtPnZpLT5waXhlbF90eXBlKTsKKyAgICAgICAgYXZzLT5lcnJvciA9IDE7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgc3dpdGNoIChwbGFuYXIpIHsKKyAgICBjYXNlIDI6IC8vIFk4CisgICAgICAgIGF2cy0+bl9wbGFuZXMgPSAxOworICAgICAgICBhdnMtPnBsYW5lcyAgID0gYXZzX3BsYW5lc19ncmV5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8vIFlVVgorICAgICAgICBhdnMtPm5fcGxhbmVzID0gMzsKKyAgICAgICAgYXZzLT5wbGFuZXMgICA9IGF2c19wbGFuZXNfeXV2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdnMtPm5fcGxhbmVzID0gMTsKKyAgICAgICAgYXZzLT5wbGFuZXMgICA9IGF2c19wbGFuZXNfcGFja2VkOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdmlzeW50aF9jcmVhdGVfc3RyZWFtX2F1ZGlvKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0KQoreworICAgIEF2aVN5bnRoQ29udGV4dCAqYXZzID0gcy0+cHJpdl9kYXRhOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZzLT52aS0+YXVkaW9fc2FtcGxlc19wZXJfc2Vjb25kOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBhdnMtPnZpLT5uY2hhbm5lbHM7CisgICAgc3QtPnRpbWVfYmFzZSAgICAgICAgICA9IChBVlJhdGlvbmFsKSB7IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cy0+dmktPmF1ZGlvX3NhbXBsZXNfcGVyX3NlY29uZCB9OworICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICAgPSBhdnMtPnZpLT5udW1fYXVkaW9fc2FtcGxlczsKKworICAgIHN3aXRjaCAoYXZzLT52aS0+c2FtcGxlX3R5cGUpIHsKKyAgICBjYXNlIEFWU19TQU1QTEVfSU5UODoKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfU0FNUExFX0lOVDE2OgorICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWU19TQU1QTEVfSU5UMjQ6CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzI0TEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX1NBTVBMRV9JTlQzMjoKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMzJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfU0FNUExFX0ZMT0FUOgorICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX0YzMkxFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInVua25vd24gQXZpU3ludGggc2FtcGxlIHR5cGUgJWRcbiIsIGF2cy0+dmktPnNhbXBsZV90eXBlKTsKKyAgICAgICAgYXZzLT5lcnJvciA9IDE7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF2aXN5bnRoX2NyZWF0ZV9zdHJlYW0oQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEF2aVN5bnRoQ29udGV4dCAqYXZzID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgcmV0OworICAgIGludCBpZCA9IDA7CisKKyAgICBpZiAoYXZzX2hhc192aWRlbyhhdnMtPnZpKSkgeworICAgICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBzdC0+aWQgPSBpZCsrOworICAgICAgICBpZiAocmV0ID0gYXZpc3ludGhfY3JlYXRlX3N0cmVhbV92aWRlbyhzLCBzdCkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoYXZzX2hhc19hdWRpbyhhdnMtPnZpKSkgeworICAgICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBzdC0+aWQgPSBpZCsrOworICAgICAgICBpZiAocmV0ID0gYXZpc3ludGhfY3JlYXRlX3N0cmVhbV9hdWRpbyhzLCBzdCkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdmlzeW50aF9vcGVuX2ZpbGUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEF2aVN5bnRoQ29udGV4dCAqYXZzID0gcy0+cHJpdl9kYXRhOworICAgIEFWU19WYWx1ZSBhcmcsIHZhbDsKKyAgICBpbnQgcmV0OworI2lmZGVmIFVTSU5HX0FWSVNZTlRICisgICAgY2hhciBmaWxlbmFtZV9hbnNpW01BWF9QQVRIICogNF07CisgICAgd2NoYXJfdCBmaWxlbmFtZV93Y1tNQVhfUEFUSCAqIDRdOworI2VuZGlmCisKKyAgICBpZiAocmV0ID0gYXZpc3ludGhfY29udGV4dF9jcmVhdGUocykpCisgICAgICAgIHJldHVybiByZXQ7CisKKyNpZmRlZiBVU0lOR19BVklTWU5USAorICAgIC8qIENvbnZlcnQgVVRGLTggdG8gQU5TSSBjb2RlIHBhZ2UgKi8KKyAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VURjgsIDAsIHMtPmZpbGVuYW1lLCAtMSwgZmlsZW5hbWVfd2MsIE1BWF9QQVRIICogNCk7CisgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9USFJFQURfQUNQLCAwLCBmaWxlbmFtZV93YywgLTEsIGZpbGVuYW1lX2Fuc2ksCisgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFUSCAqIDQsIE5VTEwsIE5VTEwpOworICAgIGFyZyA9IGF2c19uZXdfdmFsdWVfc3RyaW5nKGZpbGVuYW1lX2Fuc2kpOworI2Vsc2UKKyAgICBhcmcgPSBhdnNfbmV3X3ZhbHVlX3N0cmluZyhzLT5maWxlbmFtZSk7CisjZW5kaWYKKyAgICB2YWwgPSBhdnNfbGlicmFyeS5hdnNfaW52b2tlKGF2cy0+ZW52LCAiSW1wb3J0IiwgYXJnLCAwKTsKKyAgICBpZiAoYXZzX2lzX2Vycm9yKHZhbCkpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiVzXG4iLCBhdnNfYXNfZXJyb3IodmFsKSk7CisgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoIWF2c19pc19jbGlwKHZhbCkpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkF2aVN5bnRoIHNjcmlwdCBkaWQgbm90IHJldHVybiBhIGNsaXBcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdnMtPmNsaXAgPSBhdnNfbGlicmFyeS5hdnNfdGFrZV9jbGlwKHZhbCwgYXZzLT5lbnYpOworICAgIGF2cy0+dmkgICA9IGF2c19saWJyYXJ5LmF2c19nZXRfdmlkZW9faW5mbyhhdnMtPmNsaXApOworCisgICAgLyogUmVsZWFzZSB0aGUgQVZTX1ZhbHVlIGFzIGl0IHdpbGwgZ28gb3V0IG9mIHNjb3BlLiAqLworICAgIGF2c19saWJyYXJ5LmF2c19yZWxlYXNlX3ZhbHVlKHZhbCk7CisKKyAgICBpZiAocmV0ID0gYXZpc3ludGhfY3JlYXRlX3N0cmVhbShzKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZpc3ludGhfY29udGV4dF9kZXN0cm95KGF2cyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXZpc3ludGhfbmV4dF9zdHJlYW0oQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCwgaW50ICpkaXNjYXJkKQoreworICAgIEF2aVN5bnRoQ29udGV4dCAqYXZzID0gcy0+cHJpdl9kYXRhOworCisgICAgYXZzLT5jdXJyX3N0cmVhbSsrOworICAgIGF2cy0+Y3Vycl9zdHJlYW0gJT0gcy0+bmJfc3RyZWFtczsKKworICAgICpzdCA9IHMtPnN0cmVhbXNbYXZzLT5jdXJyX3N0cmVhbV07CisgICAgaWYgKCgqc3QpLT5kaXNjYXJkID09IEFWRElTQ0FSRF9BTEwpCisgICAgICAgICpkaXNjYXJkID0gMTsKKyAgICBlbHNlCisgICAgICAgICpkaXNjYXJkID0gMDsKKworICAgIHJldHVybjsKK30KKworLyogQ29weSBBdmlTeW50aCBjbGlwIGRhdGEgaW50byBhbiBBVlBhY2tldC4gKi8KK3N0YXRpYyBpbnQgYXZpc3ludGhfcmVhZF9wYWNrZXRfdmlkZW8oQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzY2FyZCkKK3sKKyAgICBBdmlTeW50aENvbnRleHQgKmF2cyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlNfVmlkZW9GcmFtZSAqZnJhbWU7CisgICAgdW5zaWduZWQgY2hhciAqZHN0X3A7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjX3A7CisgICAgaW50IG4sIGksIHBsYW5lLCByb3dzaXplLCBwbGFuZWhlaWdodCwgcGl0Y2gsIGJpdHM7CisgICAgY29uc3QgY2hhciAqZXJyb3I7CisKKyAgICBpZiAoYXZzLT5jdXJyX2ZyYW1lID49IGF2cy0+dmktPm51bV9mcmFtZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIC8qIFRoaXMgbXVzdCBoYXBwZW4gZXZlbiBpZiB0aGUgc3RyZWFtIGlzIGRpc2NhcmRlZCB0byBwcmV2ZW50IGRlc3luYy4gKi8KKyAgICBuID0gYXZzLT5jdXJyX2ZyYW1lKys7CisgICAgaWYgKGRpc2NhcmQpCisgICAgICAgIHJldHVybiAwOworCisjaWZkZWYgVVNJTkdfQVZJU1lOVEgKKyAgICAvKiBEZWZpbmUgdGhlIGJwcCB2YWx1ZXMgZm9yIHRoZSBuZXcgQXZpU3ludGggMi42IGNvbG9yc3BhY2VzLgorICAgICAqIFNpbmNlIEF2eFN5bnRoIGRvZXNuJ3QgaGF2ZSB0aGVzZSBmdW5jdGlvbnMsIHNwZWNpYWwtY2FzZQorICAgICAqIGl0IGluIG9yZGVyIHRvIGF2b2lkIGltcGxpY2l0IGRlY2xhcmF0aW9uIGVycm9ycy4gKi8KKworICAgIGlmIChhdnNfaXNfeXYyNChhdnMtPnZpKSkKKyAgICAgICAgYml0cyA9IDI0OworICAgIGVsc2UgaWYgKGF2c19pc195djE2KGF2cy0+dmkpKQorICAgICAgICBiaXRzID0gMTY7CisgICAgZWxzZSBpZiAoYXZzX2lzX3l2NDExKGF2cy0+dmkpKQorICAgICAgICBiaXRzID0gMTI7CisgICAgZWxzZSBpZiAoYXZzX2lzX3k4KGF2cy0+dmkpKQorICAgICAgICBiaXRzID0gODsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgYml0cyA9IGF2c19iaXRzX3Blcl9waXhlbChhdnMtPnZpKTsKKworICAgIC8qIFdpdGhvdXQgdGhlIGNhc3QgdG8gaW50NjRfdCwgY2FsY3VsYXRpb24gb3ZlcmZsb3dzIGF0IGFib3V0IDlrIHggOWsKKyAgICAgKiByZXNvbHV0aW9uLiAqLworICAgIHBrdC0+c2l6ZSA9ICgoKGludDY0X3QpYXZzLT52aS0+d2lkdGggKgorICAgICAgICAgICAgICAgICAgKGludDY0X3QpYXZzLT52aS0+aGVpZ2h0KSAqIGJpdHMpIC8gODsKKyAgICBpZiAoIXBrdC0+c2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKworICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgcGt0LT5zaXplKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBwa3QtPnB0cyAgICAgID0gbjsKKyAgICBwa3QtPmR0cyAgICAgID0gbjsKKyAgICBwa3QtPmR1cmF0aW9uID0gMTsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGF2cy0+Y3Vycl9zdHJlYW07CisKKyAgICBmcmFtZSA9IGF2c19saWJyYXJ5LmF2c19nZXRfZnJhbWUoYXZzLT5jbGlwLCBuKTsKKyAgICBlcnJvciA9IGF2c19saWJyYXJ5LmF2c19jbGlwX2dldF9lcnJvcihhdnMtPmNsaXApOworICAgIGlmIChlcnJvcikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJXNcbiIsIGVycm9yKTsKKyAgICAgICAgYXZzLT5lcnJvciA9IDE7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGRzdF9wID0gcGt0LT5kYXRhOworICAgIGZvciAoaSA9IDA7IGkgPCBhdnMtPm5fcGxhbmVzOyBpKyspIHsKKyAgICAgICAgcGxhbmUgPSBhdnMtPnBsYW5lc1tpXTsKKyAgICAgICAgc3JjX3AgPSBhdnNfZ2V0X3JlYWRfcHRyX3AoZnJhbWUsIHBsYW5lKTsKKyAgICAgICAgcGl0Y2ggPSBhdnNfZ2V0X3BpdGNoX3AoZnJhbWUsIHBsYW5lKTsKKworI2lmZGVmIFVTSU5HX0FWSVNZTlRICisgICAgICAgIGlmIChhdnNfbGlicmFyeS5hdnNfZ2V0X3ZlcnNpb24oYXZzLT5jbGlwKSA9PSAzKSB7CisgICAgICAgICAgICByb3dzaXplICAgICA9IGF2c19nZXRfcm93X3NpemVfcF8yNShmcmFtZSwgcGxhbmUpOworICAgICAgICAgICAgcGxhbmVoZWlnaHQgPSBhdnNfZ2V0X2hlaWdodF9wXzI1KGZyYW1lLCBwbGFuZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByb3dzaXplICAgICA9IGF2c19nZXRfcm93X3NpemVfcChmcmFtZSwgcGxhbmUpOworICAgICAgICAgICAgcGxhbmVoZWlnaHQgPSBhdnNfZ2V0X2hlaWdodF9wKGZyYW1lLCBwbGFuZSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHJvd3NpemUgICAgID0gYXZzX2dldF9yb3dfc2l6ZV9wKGZyYW1lLCBwbGFuZSk7CisgICAgICAgIHBsYW5laGVpZ2h0ID0gYXZzX2dldF9oZWlnaHRfcChmcmFtZSwgcGxhbmUpOworI2VuZGlmCisKKyAgICAgICAgLyogRmxpcCBSR0IgdmlkZW8uICovCisgICAgICAgIGlmIChhdnNfaXNfcmdiMjQoYXZzLT52aSkgfHwgYXZzX2lzX3JnYihhdnMtPnZpKSkgeworICAgICAgICAgICAgc3JjX3AgPSBzcmNfcCArIChwbGFuZWhlaWdodCAtIDEpICogcGl0Y2g7CisgICAgICAgICAgICBwaXRjaCA9IC1waXRjaDsKKyAgICAgICAgfQorCisgICAgICAgIGF2c19saWJyYXJ5LmF2c19iaXRfYmx0KGF2cy0+ZW52LCBkc3RfcCwgcm93c2l6ZSwgc3JjX3AsIHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93c2l6ZSwgcGxhbmVoZWlnaHQpOworICAgICAgICBkc3RfcCArPSByb3dzaXplICogcGxhbmVoZWlnaHQ7CisgICAgfQorCisgICAgYXZzX2xpYnJhcnkuYXZzX3JlbGVhc2VfdmlkZW9fZnJhbWUoZnJhbWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF2aXN5bnRoX3JlYWRfcGFja2V0X2F1ZGlvKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc2NhcmQpCit7CisgICAgQXZpU3ludGhDb250ZXh0ICphdnMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZSYXRpb25hbCBmcHMsIHNhbXBsZXJhdGU7CisgICAgaW50IHNhbXBsZXM7CisgICAgaW50NjRfdCBuOworICAgIGNvbnN0IGNoYXIgKmVycm9yOworCisgICAgaWYgKGF2cy0+Y3Vycl9zYW1wbGUgPj0gYXZzLT52aS0+bnVtX2F1ZGlvX3NhbXBsZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGZwcy5udW0gICAgICAgID0gYXZzLT52aS0+ZnBzX251bWVyYXRvcjsKKyAgICBmcHMuZGVuICAgICAgICA9IGF2cy0+dmktPmZwc19kZW5vbWluYXRvcjsKKyAgICBzYW1wbGVyYXRlLm51bSA9IGF2cy0+dmktPmF1ZGlvX3NhbXBsZXNfcGVyX3NlY29uZDsKKyAgICBzYW1wbGVyYXRlLmRlbiA9IDE7CisKKyAgICBpZiAoYXZzX2hhc192aWRlbyhhdnMtPnZpKSkgeworICAgICAgICBpZiAoYXZzLT5jdXJyX2ZyYW1lIDwgYXZzLT52aS0+bnVtX2ZyYW1lcykKKyAgICAgICAgICAgIHNhbXBsZXMgPSBhdl9yZXNjYWxlX3EoYXZzLT5jdXJyX2ZyYW1lLCBzYW1wbGVyYXRlLCBmcHMpIC0KKyAgICAgICAgICAgICAgICAgICAgICBhdnMtPmN1cnJfc2FtcGxlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzYW1wbGVzID0gYXZfcmVzY2FsZV9xKDEsIHNhbXBsZXJhdGUsIGZwcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2FtcGxlcyA9IDEwMDA7CisgICAgfQorCisgICAgLyogQWZ0ZXIgc2Vla2luZywgYXVkaW8gbWF5IGNhdGNoIHVwIHdpdGggdmlkZW8uICovCisgICAgaWYgKHNhbXBsZXMgPD0gMCkgeworICAgICAgICBwa3QtPnNpemUgPSAwOworICAgICAgICBwa3QtPmRhdGEgPSBOVUxMOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoYXZzLT5jdXJyX3NhbXBsZSArIHNhbXBsZXMgPiBhdnMtPnZpLT5udW1fYXVkaW9fc2FtcGxlcykKKyAgICAgICAgc2FtcGxlcyA9IGF2cy0+dmktPm51bV9hdWRpb19zYW1wbGVzIC0gYXZzLT5jdXJyX3NhbXBsZTsKKworICAgIC8qIFRoaXMgbXVzdCBoYXBwZW4gZXZlbiBpZiB0aGUgc3RyZWFtIGlzIGRpc2NhcmRlZCB0byBwcmV2ZW50IGRlc3luYy4gKi8KKyAgICBuICAgICAgICAgICAgICAgICA9IGF2cy0+Y3Vycl9zYW1wbGU7CisgICAgYXZzLT5jdXJyX3NhbXBsZSArPSBzYW1wbGVzOworICAgIGlmIChkaXNjYXJkKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHBrdC0+c2l6ZSA9IGF2c19ieXRlc19wZXJfY2hhbm5lbF9zYW1wbGUoYXZzLT52aSkgKgorICAgICAgICAgICAgICAgIHNhbXBsZXMgKiBhdnMtPnZpLT5uY2hhbm5lbHM7CisgICAgaWYgKCFwa3QtPnNpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisKKyAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIHBrdC0+c2l6ZSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcGt0LT5wdHMgICAgICA9IG47CisgICAgcGt0LT5kdHMgICAgICA9IG47CisgICAgcGt0LT5kdXJhdGlvbiA9IHNhbXBsZXM7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBhdnMtPmN1cnJfc3RyZWFtOworCisgICAgYXZzX2xpYnJhcnkuYXZzX2dldF9hdWRpbyhhdnMtPmNsaXAsIHBrdC0+ZGF0YSwgbiwgc2FtcGxlcyk7CisgICAgZXJyb3IgPSBhdnNfbGlicmFyeS5hdnNfY2xpcF9nZXRfZXJyb3IoYXZzLT5jbGlwKTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiVzXG4iLCBlcnJvcik7CisgICAgICAgIGF2cy0+ZXJyb3IgPSAxOworICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhdmlzeW50aF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IHJldDsKKworICAgIC8vIENhbGxpbmcgbGlicmFyeSBtdXN0IGltcGxlbWVudCBhIGxvY2sgZm9yIHRocmVhZC1zYWZlIG9wZW5zLgorICAgIGlmIChyZXQgPSBhdnByaXZfbG9ja19hdmZvcm1hdCgpKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHJldCA9IGF2aXN5bnRoX29wZW5fZmlsZShzKSkgeworICAgICAgICBhdnByaXZfdW5sb2NrX2F2Zm9ybWF0KCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXZwcml2X3VubG9ja19hdmZvcm1hdCgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF2aXN5bnRoX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBdmlTeW50aENvbnRleHQgKmF2cyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IGRpc2NhcmQgPSAwOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZzLT5lcnJvcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKworICAgIC8qIElmIGVpdGhlciBzdHJlYW0gcmVhY2hlcyBFT0YsIHRyeSB0byByZWFkIHRoZSBvdGhlciBvbmUgYmVmb3JlCisgICAgICogZ2l2aW5nIHVwLiAqLworICAgIGF2aXN5bnRoX25leHRfc3RyZWFtKHMsICZzdCwgcGt0LCAmZGlzY2FyZCk7CisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgcmV0ID0gYXZpc3ludGhfcmVhZF9wYWNrZXRfdmlkZW8ocywgcGt0LCBkaXNjYXJkKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBhdnNfaGFzX2F1ZGlvKGF2cy0+dmkpKSB7CisgICAgICAgICAgICBhdmlzeW50aF9uZXh0X3N0cmVhbShzLCAmc3QsIHBrdCwgJmRpc2NhcmQpOworICAgICAgICAgICAgcmV0dXJuIGF2aXN5bnRoX3JlYWRfcGFja2V0X2F1ZGlvKHMsIHBrdCwgZGlzY2FyZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBhdmlzeW50aF9yZWFkX3BhY2tldF9hdWRpbyhzLCBwa3QsIGRpc2NhcmQpOworICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIGF2c19oYXNfdmlkZW8oYXZzLT52aSkpIHsKKyAgICAgICAgICAgIGF2aXN5bnRoX25leHRfc3RyZWFtKHMsICZzdCwgcGt0LCAmZGlzY2FyZCk7CisgICAgICAgICAgICByZXR1cm4gYXZpc3ludGhfcmVhZF9wYWNrZXRfdmlkZW8ocywgcGt0LCBkaXNjYXJkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhdmlzeW50aF9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpZiAoYXZwcml2X2xvY2tfYXZmb3JtYXQoKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKworICAgIGF2aXN5bnRoX2NvbnRleHRfZGVzdHJveShzLT5wcml2X2RhdGEpOworICAgIGF2cHJpdl91bmxvY2tfYXZmb3JtYXQoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdmlzeW50aF9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBBdmlTeW50aENvbnRleHQgKmF2cyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgQVZSYXRpb25hbCBmcHMsIHNhbXBsZXJhdGU7CisKKyAgICBpZiAoYXZzLT5lcnJvcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKworICAgIGZwcyAgICAgICAgPSAoQVZSYXRpb25hbCkgeyBhdnMtPnZpLT5mcHNfbnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnMtPnZpLT5mcHNfZGVub21pbmF0b3IgfTsKKyAgICBzYW1wbGVyYXRlID0gKEFWUmF0aW9uYWwpIHsgYXZzLT52aS0+YXVkaW9fc2FtcGxlc19wZXJfc2Vjb25kLCAxIH07CisKKyAgICBzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAvKiBBdmlTeW50aCBmcmFtZSBjb3VudHMgYXJlIHNpZ25lZCBpbnQuICovCisgICAgICAgIGlmICgodGltZXN0YW1wID49IGF2cy0+dmktPm51bV9mcmFtZXMpIHx8CisgICAgICAgICAgICAodGltZXN0YW1wID4gSU5UX01BWCkgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAodGltZXN0YW1wIDwgMCkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIGF2cy0+Y3Vycl9mcmFtZSA9IHRpbWVzdGFtcDsKKyAgICAgICAgaWYgKGF2c19oYXNfYXVkaW8oYXZzLT52aSkpCisgICAgICAgICAgICBhdnMtPmN1cnJfc2FtcGxlID0gYXZfcmVzY2FsZV9xKHRpbWVzdGFtcCwgc2FtcGxlcmF0ZSwgZnBzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHRpbWVzdGFtcCA+PSBhdnMtPnZpLT5udW1fYXVkaW9fc2FtcGxlcykgfHwgKHRpbWVzdGFtcCA8IDApKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAvKiBGb3JjZSBmcmFtZSBncmFudWxhcml0eSBmb3Igc2Vla2luZy4gKi8KKyAgICAgICAgaWYgKGF2c19oYXNfdmlkZW8oYXZzLT52aSkpIHsKKyAgICAgICAgICAgIGF2cy0+Y3Vycl9mcmFtZSAgPSBhdl9yZXNjYWxlX3EodGltZXN0YW1wLCBmcHMsIHNhbXBsZXJhdGUpOworICAgICAgICAgICAgYXZzLT5jdXJyX3NhbXBsZSA9IGF2X3Jlc2NhbGVfcShhdnMtPmN1cnJfZnJhbWUsIHNhbXBsZXJhdGUsIGZwcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdnMtPmN1cnJfc2FtcGxlID0gdGltZXN0YW1wOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYXZpc3ludGhfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXZpc3ludGgiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlTeW50aCBzY3JpcHQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQXZpU3ludGhDb250ZXh0KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhdmlzeW50aF9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBhdmlzeW50aF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBhdmlzeW50aF9yZWFkX2Nsb3NlLAorICAgIC5yZWFkX3NlZWsgICAgICA9IGF2aXN5bnRoX3JlYWRfc2VlaywKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiYXZzIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXZsYW5ndWFnZS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2bGFuZ3VhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYyNTYwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2bGFuZ3VhZ2UuYwpAQCAtMCwwICsxLDc2NSBAQAorLyoKKyAqIEN5cmlsIENvbXBhcm9uLCBMYXJiaSBKb3ViYWxhLCBSZXNvbmF0ZS1NUDQgMjAwOQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZsYW5ndWFnZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiBzdHJ1Y3QgTGFuZ0VudHJ5IHsKKyAgICBjb25zdCBjaGFyIHN0cls0XTsKKyAgICB1aW50MTZfdCBuZXh0X2VxdWl2YWxlbnQ7Cit9IExhbmdFbnRyeTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGxhbmdfdGFibGVfY291bnRzW10gPSB7IDQ4NCwgMjAsIDE4NCB9Oworc3RhdGljIGNvbnN0IHVpbnQxNl90IGxhbmdfdGFibGVfb2Zmc2V0c1tdID0geyAwLCA0ODQsIDUwNCB9OworCitzdGF0aWMgY29uc3QgTGFuZ0VudHJ5IGxhbmdfdGFibGVbXSA9IHsKKyAgICAvKi0tLS0tIEFWX0xBTkdfSVNPNjM5XzJfQklCTCBlbnRyaWVzICg0ODQpIC0tLS0tKi8KKyAgICAvKjAwMDAqLyB7ICJhYXIiLCAgNTA0IH0sCisgICAgLyowMDAxKi8geyAiYWJrIiwgIDUwNSB9LAorICAgIC8qMDAwMiovIHsgImFjZSIsICAgIDIgfSwKKyAgICAvKjAwMDMqLyB7ICJhY2giLCAgICAzIH0sCisgICAgLyowMDA0Ki8geyAiYWRhIiwgICAgNCB9LAorICAgIC8qMDAwNSovIHsgImFkeSIsICAgIDUgfSwKKyAgICAvKjAwMDYqLyB7ICJhZmEiLCAgICA2IH0sCisgICAgLyowMDA3Ki8geyAiYWZoIiwgICAgNyB9LAorICAgIC8qMDAwOCovIHsgImFmciIsICA1MDcgfSwKKyAgICAvKjAwMDkqLyB7ICJhaW4iLCAgICA5IH0sCisgICAgLyowMDEwKi8geyAiYWthIiwgIDUwOCB9LAorICAgIC8qMDAxMSovIHsgImFrayIsICAgMTEgfSwKKyAgICAvKjAwMTIqLyB7ICJhbGIiLCAgNTAyIH0sCisgICAgLyowMDEzKi8geyAiYWxlIiwgICAxMyB9LAorICAgIC8qMDAxNCovIHsgImFsZyIsICAgMTQgfSwKKyAgICAvKjAwMTUqLyB7ICJhbHQiLCAgIDE1IH0sCisgICAgLyowMDE2Ki8geyAiYW1oIiwgIDUwOSB9LAorICAgIC8qMDAxNyovIHsgImFuZyIsICAgMTcgfSwKKyAgICAvKjAwMTgqLyB7ICJhbnAiLCAgIDE4IH0sCisgICAgLyowMDE5Ki8geyAiYXBhIiwgICAxOSB9LAorICAgIC8qMDAyMCovIHsgImFyYSIsICA1MTEgfSwKKyAgICAvKjAwMjEqLyB7ICJhcmMiLCAgIDIxIH0sCisgICAgLyowMDIyKi8geyAiYXJnIiwgIDUxMCB9LAorICAgIC8qMDAyMyovIHsgImFybSIsICA0OTIgfSwKKyAgICAvKjAwMjQqLyB7ICJhcm4iLCAgIDI0IH0sCisgICAgLyowMDI1Ki8geyAiYXJwIiwgICAyNSB9LAorICAgIC8qMDAyNiovIHsgImFydCIsICAgMjYgfSwKKyAgICAvKjAwMjcqLyB7ICJhcnciLCAgIDI3IH0sCisgICAgLyowMDI4Ki8geyAiYXNtIiwgIDUxMiB9LAorICAgIC8qMDAyOSovIHsgImFzdCIsICAgMjkgfSwKKyAgICAvKjAwMzAqLyB7ICJhdGgiLCAgIDMwIH0sCisgICAgLyowMDMxKi8geyAiYXVzIiwgICAzMSB9LAorICAgIC8qMDAzMiovIHsgImF2YSIsICA1MTMgfSwKKyAgICAvKjAwMzMqLyB7ICJhdmUiLCAgNTA2IH0sCisgICAgLyowMDM0Ki8geyAiYXdhIiwgICAzNCB9LAorICAgIC8qMDAzNSovIHsgImF5bSIsICA1MTQgfSwKKyAgICAvKjAwMzYqLyB7ICJhemUiLCAgNTE1IH0sCisgICAgLyowMDM3Ki8geyAiYmFkIiwgICAzNyB9LAorICAgIC8qMDAzOCovIHsgImJhaSIsICAgMzggfSwKKyAgICAvKjAwMzkqLyB7ICJiYWsiLCAgNTE2IH0sCisgICAgLyowMDQwKi8geyAiYmFsIiwgICA0MCB9LAorICAgIC8qMDA0MSovIHsgImJhbSIsICA1MjEgfSwKKyAgICAvKjAwNDIqLyB7ICJiYW4iLCAgIDQyIH0sCisgICAgLyowMDQzKi8geyAiYmFxIiwgIDQ4OSB9LAorICAgIC8qMDA0NCovIHsgImJhcyIsICAgNDQgfSwKKyAgICAvKjAwNDUqLyB7ICJiYXQiLCAgIDQ1IH0sCisgICAgLyowMDQ2Ki8geyAiYmVqIiwgICA0NiB9LAorICAgIC8qMDA0NyovIHsgImJlbCIsICA1MTcgfSwKKyAgICAvKjAwNDgqLyB7ICJiZW0iLCAgIDQ4IH0sCisgICAgLyowMDQ5Ki8geyAiYmVuIiwgIDUyMiB9LAorICAgIC8qMDA1MCovIHsgImJlciIsICAgNTAgfSwKKyAgICAvKjAwNTEqLyB7ICJiaG8iLCAgIDUxIH0sCisgICAgLyowMDUyKi8geyAiYmloIiwgIDUxOSB9LAorICAgIC8qMDA1MyovIHsgImJpayIsICAgNTMgfSwKKyAgICAvKjAwNTQqLyB7ICJiaW4iLCAgIDU0IH0sCisgICAgLyowMDU1Ki8geyAiYmlzIiwgIDUyMCB9LAorICAgIC8qMDA1NiovIHsgImJsYSIsICAgNTYgfSwKKyAgICAvKjAwNTcqLyB7ICJibnQiLCAgIDU3IH0sCisgICAgLyowMDU4Ki8geyAiYm9zIiwgIDUyNSB9LAorICAgIC8qMDA1OSovIHsgImJyYSIsICAgNTkgfSwKKyAgICAvKjAwNjAqLyB7ICJicmUiLCAgNTI0IH0sCisgICAgLyowMDYxKi8geyAiYnRrIiwgICA2MSB9LAorICAgIC8qMDA2MiovIHsgImJ1YSIsICAgNjIgfSwKKyAgICAvKjAwNjMqLyB7ICJidWciLCAgIDYzIH0sCisgICAgLyowMDY0Ki8geyAiYnVsIiwgIDUxOCB9LAorICAgIC8qMDA2NSovIHsgImJ1ciIsICA0OTggfSwKKyAgICAvKjAwNjYqLyB7ICJieW4iLCAgIDY2IH0sCisgICAgLyowMDY3Ki8geyAiY2FkIiwgICA2NyB9LAorICAgIC8qMDA2OCovIHsgImNhaSIsICAgNjggfSwKKyAgICAvKjAwNjkqLyB7ICJjYXIiLCAgIDY5IH0sCisgICAgLyowMDcwKi8geyAiY2F0IiwgIDUyNiB9LAorICAgIC8qMDA3MSovIHsgImNhdSIsICAgNzEgfSwKKyAgICAvKjAwNzIqLyB7ICJjZWIiLCAgIDcyIH0sCisgICAgLyowMDczKi8geyAiY2VsIiwgICA3MyB9LAorICAgIC8qMDA3NCovIHsgImNoYSIsICA1MjggfSwKKyAgICAvKjAwNzUqLyB7ICJjaGIiLCAgIDc1IH0sCisgICAgLyowMDc2Ki8geyAiY2hlIiwgIDUyNyB9LAorICAgIC8qMDA3NyovIHsgImNoZyIsICAgNzcgfSwKKyAgICAvKjAwNzgqLyB7ICJjaGkiLCAgNTAzIH0sCisgICAgLyowMDc5Ki8geyAiY2hrIiwgICA3OSB9LAorICAgIC8qMDA4MCovIHsgImNobSIsICAgODAgfSwKKyAgICAvKjAwODEqLyB7ICJjaG4iLCAgIDgxIH0sCisgICAgLyowMDgyKi8geyAiY2hvIiwgICA4MiB9LAorICAgIC8qMDA4MyovIHsgImNocCIsICAgODMgfSwKKyAgICAvKjAwODQqLyB7ICJjaHIiLCAgIDg0IH0sCisgICAgLyowMDg1Ki8geyAiY2h1IiwgIDUzMiB9LAorICAgIC8qMDA4NiovIHsgImNodiIsICA1MzMgfSwKKyAgICAvKjAwODcqLyB7ICJjaHkiLCAgIDg3IH0sCisgICAgLyowMDg4Ki8geyAiY21jIiwgICA4OCB9LAorICAgIC8qMDA4OSovIHsgImNvcCIsICAgODkgfSwKKyAgICAvKjAwOTAqLyB7ICJjb3IiLCAgNTkzIH0sCisgICAgLyowMDkxKi8geyAiY29zIiwgIDUyOSB9LAorICAgIC8qMDA5MiovIHsgImNwZSIsICAgOTIgfSwKKyAgICAvKjAwOTMqLyB7ICJjcGYiLCAgIDkzIH0sCisgICAgLyowMDk0Ki8geyAiY3BwIiwgICA5NCB9LAorICAgIC8qMDA5NSovIHsgImNyZSIsICA1MzAgfSwKKyAgICAvKjAwOTYqLyB7ICJjcmgiLCAgIDk2IH0sCisgICAgLyowMDk3Ki8geyAiY3JwIiwgICA5NyB9LAorICAgIC8qMDA5OCovIHsgImNzYiIsICAgOTggfSwKKyAgICAvKjAwOTkqLyB7ICJjdXMiLCAgIDk5IH0sCisgICAgLyowMTAwKi8geyAiY3plIiwgIDQ4NSB9LAorICAgIC8qMDEwMSovIHsgImRhayIsICAxMDEgfSwKKyAgICAvKjAxMDIqLyB7ICJkYW4iLCAgNTM1IH0sCisgICAgLyowMTAzKi8geyAiZGFyIiwgIDEwMyB9LAorICAgIC8qMDEwNCovIHsgImRheSIsICAxMDQgfSwKKyAgICAvKjAxMDUqLyB7ICJkZWwiLCAgMTA1IH0sCisgICAgLyowMTA2Ki8geyAiZGVuIiwgIDEwNiB9LAorICAgIC8qMDEwNyovIHsgImRnciIsICAxMDcgfSwKKyAgICAvKjAxMDgqLyB7ICJkaW4iLCAgMTA4IH0sCisgICAgLyowMTA5Ki8geyAiZGl2IiwgIDUzNyB9LAorICAgIC8qMDExMCovIHsgImRvaSIsICAxMTAgfSwKKyAgICAvKjAxMTEqLyB7ICJkcmEiLCAgMTExIH0sCisgICAgLyowMTEyKi8geyAiZHNiIiwgIDExMiB9LAorICAgIC8qMDExMyovIHsgImR1YSIsICAxMTMgfSwKKyAgICAvKjAxMTQqLyB7ICJkdW0iLCAgMTE0IH0sCisgICAgLyowMTE1Ki8geyAiZHV0IiwgIDQ5OSB9LAorICAgIC8qMDExNiovIHsgImR5dSIsICAxMTYgfSwKKyAgICAvKjAxMTcqLyB7ICJkem8iLCAgNTM4IH0sCisgICAgLyowMTE4Ki8geyAiZWZpIiwgIDExOCB9LAorICAgIC8qMDExOSovIHsgImVneSIsICAxMTkgfSwKKyAgICAvKjAxMjAqLyB7ICJla2EiLCAgMTIwIH0sCisgICAgLyowMTIxKi8geyAiZWx4IiwgIDEyMSB9LAorICAgIC8qMDEyMiovIHsgImVuZyIsICA1NDEgfSwKKyAgICAvKjAxMjMqLyB7ICJlbm0iLCAgMTIzIH0sCisgICAgLyowMTI0Ki8geyAiZXBvIiwgIDU0MiB9LAorICAgIC8qMDEyNSovIHsgImVzdCIsICA1NDQgfSwKKyAgICAvKjAxMjYqLyB7ICJld2UiLCAgNTM5IH0sCisgICAgLyowMTI3Ki8geyAiZXdvIiwgIDEyNyB9LAorICAgIC8qMDEyOCovIHsgImZhbiIsICAxMjggfSwKKyAgICAvKjAxMjkqLyB7ICJmYW8iLCAgNTUwIH0sCisgICAgLyowMTMwKi8geyAiZmF0IiwgIDEzMCB9LAorICAgIC8qMDEzMSovIHsgImZpaiIsICA1NDkgfSwKKyAgICAvKjAxMzIqLyB7ICJmaWwiLCAgMTMyIH0sCisgICAgLyowMTMzKi8geyAiZmluIiwgIDU0OCB9LAorICAgIC8qMDEzNCovIHsgImZpdSIsICAxMzQgfSwKKyAgICAvKjAxMzUqLyB7ICJmb24iLCAgMTM1IH0sCisgICAgLyowMTM2Ki8geyAiZnJlIiwgIDQ5MSB9LAorICAgIC8qMDEzNyovIHsgImZybSIsICAxMzcgfSwKKyAgICAvKjAxMzgqLyB7ICJmcm8iLCAgMTM4IH0sCisgICAgLyowMTM5Ki8geyAiZnJyIiwgIDEzOSB9LAorICAgIC8qMDE0MCovIHsgImZycyIsICAxNDAgfSwKKyAgICAvKjAxNDEqLyB7ICJmcnkiLCAgNTUyIH0sCisgICAgLyowMTQyKi8geyAiZnVsIiwgIDU0NyB9LAorICAgIC8qMDE0MyovIHsgImZ1ciIsICAxNDMgfSwKKyAgICAvKjAxNDQqLyB7ICJnYWEiLCAgMTQ0IH0sCisgICAgLyowMTQ1Ki8geyAiZ2F5IiwgIDE0NSB9LAorICAgIC8qMDE0NiovIHsgImdiYSIsICAxNDYgfSwKKyAgICAvKjAxNDcqLyB7ICJnZW0iLCAgMTQ3IH0sCisgICAgLyowMTQ4Ki8geyAiZ2VvIiwgIDQ5NCB9LAorICAgIC8qMDE0OSovIHsgImdlciIsICA0ODcgfSwKKyAgICAvKjAxNTAqLyB7ICJnZXoiLCAgMTUwIH0sCisgICAgLyowMTUxKi8geyAiZ2lsIiwgIDE1MSB9LAorICAgIC8qMDE1MiovIHsgImdsYSIsICA1NTQgfSwKKyAgICAvKjAxNTMqLyB7ICJnbGUiLCAgNTUzIH0sCisgICAgLyowMTU0Ki8geyAiZ2xnIiwgIDU1NSB9LAorICAgIC8qMDE1NSovIHsgImdsdiIsICA1NTggfSwKKyAgICAvKjAxNTYqLyB7ICJnbWgiLCAgMTU2IH0sCisgICAgLyowMTU3Ki8geyAiZ29oIiwgIDE1NyB9LAorICAgIC8qMDE1OCovIHsgImdvbiIsICAxNTggfSwKKyAgICAvKjAxNTkqLyB7ICJnb3IiLCAgMTU5IH0sCisgICAgLyowMTYwKi8geyAiZ290IiwgIDE2MCB9LAorICAgIC8qMDE2MSovIHsgImdyYiIsICAxNjEgfSwKKyAgICAvKjAxNjIqLyB7ICJncmMiLCAgMTYyIH0sCisgICAgLyowMTYzKi8geyAiZ3JlIiwgIDQ4OCB9LAorICAgIC8qMDE2NCovIHsgImdybiIsICA1NTYgfSwKKyAgICAvKjAxNjUqLyB7ICJnc3ciLCAgMTY1IH0sCisgICAgLyowMTY2Ki8geyAiZ3VqIiwgIDU1NyB9LAorICAgIC8qMDE2NyovIHsgImd3aSIsICAxNjcgfSwKKyAgICAvKjAxNjgqLyB7ICJoYWkiLCAgMTY4IH0sCisgICAgLyowMTY5Ki8geyAiaGF0IiwgIDU2NCB9LAorICAgIC8qMDE3MCovIHsgImhhdSIsICA1NTkgfSwKKyAgICAvKjAxNzEqLyB7ICJoYXciLCAgMTcxIH0sCisgICAgLyowMTcyKi8geyAiaGViIiwgIDU2MCB9LAorICAgIC8qMDE3MyovIHsgImhlciIsICA1NjcgfSwKKyAgICAvKjAxNzQqLyB7ICJoaWwiLCAgMTc0IH0sCisgICAgLyowMTc1Ki8geyAiaGltIiwgIDE3NSB9LAorICAgIC8qMDE3NiovIHsgImhpbiIsICA1NjEgfSwKKyAgICAvKjAxNzcqLyB7ICJoaXQiLCAgMTc3IH0sCisgICAgLyowMTc4Ki8geyAiaG1uIiwgIDE3OCB9LAorICAgIC8qMDE3OSovIHsgImhtbyIsICA1NjIgfSwKKyAgICAvKjAxODAqLyB7ICJocnYiLCAgNTYzIH0sCisgICAgLyowMTgxKi8geyAiaHNiIiwgIDE4MSB9LAorICAgIC8qMDE4MiovIHsgImh1biIsICA1NjUgfSwKKyAgICAvKjAxODMqLyB7ICJodXAiLCAgMTgzIH0sCisgICAgLyowMTg0Ki8geyAiaWJhIiwgIDE4NCB9LAorICAgIC8qMDE4NSovIHsgImlibyIsICA1NzEgfSwKKyAgICAvKjAxODYqLyB7ICJpY2UiLCAgNDkzIH0sCisgICAgLyowMTg3Ki8geyAiaWRvIiwgIDU3NCB9LAorICAgIC8qMDE4OCovIHsgImlpaSIsICA1NzIgfSwKKyAgICAvKjAxODkqLyB7ICJpam8iLCAgMTg5IH0sCisgICAgLyowMTkwKi8geyAiaWt1IiwgIDU3NyB9LAorICAgIC8qMDE5MSovIHsgImlsZSIsICA1NzAgfSwKKyAgICAvKjAxOTIqLyB7ICJpbG8iLCAgMTkyIH0sCisgICAgLyowMTkzKi8geyAiaW5hIiwgIDU2OCB9LAorICAgIC8qMDE5NCovIHsgImluYyIsICAxOTQgfSwKKyAgICAvKjAxOTUqLyB7ICJpbmQiLCAgNTY5IH0sCisgICAgLyowMTk2Ki8geyAiaW5lIiwgIDE5NiB9LAorICAgIC8qMDE5NyovIHsgImluaCIsICAxOTcgfSwKKyAgICAvKjAxOTgqLyB7ICJpcGsiLCAgNTczIH0sCisgICAgLyowMTk5Ki8geyAiaXJhIiwgIDE5OSB9LAorICAgIC8qMDIwMCovIHsgImlybyIsICAyMDAgfSwKKyAgICAvKjAyMDEqLyB7ICJpdGEiLCAgNTc2IH0sCisgICAgLyowMjAyKi8geyAiamF2IiwgIDU3OSB9LAorICAgIC8qMDIwMyovIHsgImpibyIsICAyMDMgfSwKKyAgICAvKjAyMDQqLyB7ICJqcG4iLCAgNTc4IH0sCisgICAgLyowMjA1Ki8geyAianByIiwgIDIwNSB9LAorICAgIC8qMDIwNiovIHsgImpyYiIsICAyMDYgfSwKKyAgICAvKjAyMDcqLyB7ICJrYWEiLCAgMjA3IH0sCisgICAgLyowMjA4Ki8geyAia2FiIiwgIDIwOCB9LAorICAgIC8qMDIwOSovIHsgImthYyIsICAyMDkgfSwKKyAgICAvKjAyMTAqLyB7ICJrYWwiLCAgNTg1IH0sCisgICAgLyowMjExKi8geyAia2FtIiwgIDIxMSB9LAorICAgIC8qMDIxMiovIHsgImthbiIsICA1ODcgfSwKKyAgICAvKjAyMTMqLyB7ICJrYXIiLCAgMjEzIH0sCisgICAgLyowMjE0Ki8geyAia2FzIiwgIDU5MCB9LAorICAgIC8qMDIxNSovIHsgImthdSIsICA1ODkgfSwKKyAgICAvKjAyMTYqLyB7ICJrYXciLCAgMjE2IH0sCisgICAgLyowMjE3Ki8geyAia2F6IiwgIDU4NCB9LAorICAgIC8qMDIxOCovIHsgImtiZCIsICAyMTggfSwKKyAgICAvKjAyMTkqLyB7ICJraGEiLCAgMjE5IH0sCisgICAgLyowMjIwKi8geyAia2hpIiwgIDIyMCB9LAorICAgIC8qMDIyMSovIHsgImtobSIsICA1ODYgfSwKKyAgICAvKjAyMjIqLyB7ICJraG8iLCAgMjIyIH0sCisgICAgLyowMjIzKi8geyAia2lrIiwgIDU4MiB9LAorICAgIC8qMDIyNCovIHsgImtpbiIsICA2NDAgfSwKKyAgICAvKjAyMjUqLyB7ICJraXIiLCAgNTk0IH0sCisgICAgLyowMjI2Ki8geyAia21iIiwgIDIyNiB9LAorICAgIC8qMDIyNyovIHsgImtvayIsICAyMjcgfSwKKyAgICAvKjAyMjgqLyB7ICJrb20iLCAgNTkyIH0sCisgICAgLyowMjI5Ki8geyAia29uIiwgIDU4MSB9LAorICAgIC8qMDIzMCovIHsgImtvciIsICA1ODggfSwKKyAgICAvKjAyMzEqLyB7ICJrb3MiLCAgMjMxIH0sCisgICAgLyowMjMyKi8geyAia3BlIiwgIDIzMiB9LAorICAgIC8qMDIzMyovIHsgImtyYyIsICAyMzMgfSwKKyAgICAvKjAyMzQqLyB7ICJrcmwiLCAgMjM0IH0sCisgICAgLyowMjM1Ki8geyAia3JvIiwgIDIzNSB9LAorICAgIC8qMDIzNiovIHsgImtydSIsICAyMzYgfSwKKyAgICAvKjAyMzcqLyB7ICJrdWEiLCAgNTgzIH0sCisgICAgLyowMjM4Ki8geyAia3VtIiwgIDIzOCB9LAorICAgIC8qMDIzOSovIHsgImt1ciIsICA1OTEgfSwKKyAgICAvKjAyNDAqLyB7ICJrdXQiLCAgMjQwIH0sCisgICAgLyowMjQxKi8geyAibGFkIiwgIDI0MSB9LAorICAgIC8qMDI0MiovIHsgImxhaCIsICAyNDIgfSwKKyAgICAvKjAyNDMqLyB7ICJsYW0iLCAgMjQzIH0sCisgICAgLyowMjQ0Ki8geyAibGFvIiwgIDYwMCB9LAorICAgIC8qMDI0NSovIHsgImxhdCIsICA1OTUgfSwKKyAgICAvKjAyNDYqLyB7ICJsYXYiLCAgNjAzIH0sCisgICAgLyowMjQ3Ki8geyAibGV6IiwgIDI0NyB9LAorICAgIC8qMDI0OCovIHsgImxpbSIsICA1OTggfSwKKyAgICAvKjAyNDkqLyB7ICJsaW4iLCAgNTk5IH0sCisgICAgLyowMjUwKi8geyAibGl0IiwgIDYwMSB9LAorICAgIC8qMDI1MSovIHsgImxvbCIsICAyNTEgfSwKKyAgICAvKjAyNTIqLyB7ICJsb3oiLCAgMjUyIH0sCisgICAgLyowMjUzKi8geyAibHR6IiwgIDU5NiB9LAorICAgIC8qMDI1NCovIHsgImx1YSIsICAyNTQgfSwKKyAgICAvKjAyNTUqLyB7ICJsdWIiLCAgNjAyIH0sCisgICAgLyowMjU2Ki8geyAibHVnIiwgIDU5NyB9LAorICAgIC8qMDI1NyovIHsgImx1aSIsICAyNTcgfSwKKyAgICAvKjAyNTgqLyB7ICJsdW4iLCAgMjU4IH0sCisgICAgLyowMjU5Ki8geyAibHVvIiwgIDI1OSB9LAorICAgIC8qMDI2MCovIHsgImx1cyIsICAyNjAgfSwKKyAgICAvKjAyNjEqLyB7ICJtYWMiLCAgNDk1IH0sCisgICAgLyowMjYyKi8geyAibWFkIiwgIDI2MiB9LAorICAgIC8qMDI2MyovIHsgIm1hZyIsICAyNjMgfSwKKyAgICAvKjAyNjQqLyB7ICJtYWgiLCAgNjA1IH0sCisgICAgLyowMjY1Ki8geyAibWFpIiwgIDI2NSB9LAorICAgIC8qMDI2NiovIHsgIm1hayIsICAyNjYgfSwKKyAgICAvKjAyNjcqLyB7ICJtYWwiLCAgNjA4IH0sCisgICAgLyowMjY4Ki8geyAibWFuIiwgIDI2OCB9LAorICAgIC8qMDI2OSovIHsgIm1hbyIsICA0OTYgfSwKKyAgICAvKjAyNzAqLyB7ICJtYXAiLCAgMjcwIH0sCisgICAgLyowMjcxKi8geyAibWFyIiwgIDYxMCB9LAorICAgIC8qMDI3MiovIHsgIm1hcyIsICAyNzIgfSwKKyAgICAvKjAyNzMqLyB7ICJtYXkiLCAgNDk3IH0sCisgICAgLyowMjc0Ki8geyAibWRmIiwgIDI3NCB9LAorICAgIC8qMDI3NSovIHsgIm1kciIsICAyNzUgfSwKKyAgICAvKjAyNzYqLyB7ICJtZW4iLCAgMjc2IH0sCisgICAgLyowMjc3Ki8geyAibWdhIiwgIDI3NyB9LAorICAgIC8qMDI3OCovIHsgIm1pYyIsICAyNzggfSwKKyAgICAvKjAyNzkqLyB7ICJtaW4iLCAgMjc5IH0sCisgICAgLyowMjgwKi8geyAibWlzIiwgIDI4MCB9LAorICAgIC8qMDI4MSovIHsgIm1raCIsICAyODEgfSwKKyAgICAvKjAyODIqLyB7ICJtbGciLCAgNjA0IH0sCisgICAgLyowMjgzKi8geyAibWx0IiwgIDYxMiB9LAorICAgIC8qMDI4NCovIHsgIm1uYyIsICAyODQgfSwKKyAgICAvKjAyODUqLyB7ICJtbmkiLCAgMjg1IH0sCisgICAgLyowMjg2Ki8geyAibW5vIiwgIDI4NiB9LAorICAgIC8qMDI4NyovIHsgIm1vaCIsICAyODcgfSwKKyAgICAvKjAyODgqLyB7ICJtb24iLCAgNjA5IH0sCisgICAgLyowMjg5Ki8geyAibW9zIiwgIDI4OSB9LAorICAgIC8qMDI5MCovIHsgIm11bCIsICAyOTAgfSwKKyAgICAvKjAyOTEqLyB7ICJtdW4iLCAgMjkxIH0sCisgICAgLyowMjkyKi8geyAibXVzIiwgIDI5MiB9LAorICAgIC8qMDI5MyovIHsgIm13bCIsICAyOTMgfSwKKyAgICAvKjAyOTQqLyB7ICJtd3IiLCAgMjk0IH0sCisgICAgLyowMjk1Ki8geyAibXluIiwgIDI5NSB9LAorICAgIC8qMDI5NiovIHsgIm15diIsICAyOTYgfSwKKyAgICAvKjAyOTcqLyB7ICJuYWgiLCAgMjk3IH0sCisgICAgLyowMjk4Ki8geyAibmFpIiwgIDI5OCB9LAorICAgIC8qMDI5OSovIHsgIm5hcCIsICAyOTkgfSwKKyAgICAvKjAzMDAqLyB7ICJuYXUiLCAgNjE0IH0sCisgICAgLyowMzAxKi8geyAibmF2IiwgIDYyMyB9LAorICAgIC8qMDMwMiovIHsgIm5ibCIsICA2MjIgfSwKKyAgICAvKjAzMDMqLyB7ICJuZGUiLCAgNjE2IH0sCisgICAgLyowMzA0Ki8geyAibmRvIiwgIDYxOCB9LAorICAgIC8qMDMwNSovIHsgIm5kcyIsICAzMDUgfSwKKyAgICAvKjAzMDYqLyB7ICJuZXAiLCAgNjE3IH0sCisgICAgLyowMzA3Ki8geyAibmV3IiwgIDMwNyB9LAorICAgIC8qMDMwOCovIHsgIm5pYSIsICAzMDggfSwKKyAgICAvKjAzMDkqLyB7ICJuaWMiLCAgMzA5IH0sCisgICAgLyowMzEwKi8geyAibml1IiwgIDMxMCB9LAorICAgIC8qMDMxMSovIHsgIm5ubyIsICA2MjAgfSwKKyAgICAvKjAzMTIqLyB7ICJub2IiLCAgNjE1IH0sCisgICAgLyowMzEzKi8geyAibm9nIiwgIDMxMyB9LAorICAgIC8qMDMxNCovIHsgIm5vbiIsICAzMTQgfSwKKyAgICAvKjAzMTUqLyB7ICJub3IiLCAgNjIxIH0sCisgICAgLyowMzE2Ki8geyAibnFvIiwgIDMxNiB9LAorICAgIC8qMDMxNyovIHsgIm5zbyIsICAzMTcgfSwKKyAgICAvKjAzMTgqLyB7ICJudWIiLCAgMzE4IH0sCisgICAgLyowMzE5Ki8geyAibndjIiwgIDMxOSB9LAorICAgIC8qMDMyMCovIHsgIm55YSIsICA2MjQgfSwKKyAgICAvKjAzMjEqLyB7ICJueW0iLCAgMzIxIH0sCisgICAgLyowMzIyKi8geyAibnluIiwgIDMyMiB9LAorICAgIC8qMDMyMyovIHsgIm55byIsICAzMjMgfSwKKyAgICAvKjAzMjQqLyB7ICJuemkiLCAgMzI0IH0sCisgICAgLyowMzI1Ki8geyAib2NpIiwgIDYyNSB9LAorICAgIC8qMDMyNiovIHsgIm9qaSIsICA2MjYgfSwKKyAgICAvKjAzMjcqLyB7ICJvcmkiLCAgNjI4IH0sCisgICAgLyowMzI4Ki8geyAib3JtIiwgIDYyNyB9LAorICAgIC8qMDMyOSovIHsgIm9zYSIsICAzMjkgfSwKKyAgICAvKjAzMzAqLyB7ICJvc3MiLCAgNjI5IH0sCisgICAgLyowMzMxKi8geyAib3RhIiwgIDMzMSB9LAorICAgIC8qMDMzMiovIHsgIm90byIsICAzMzIgfSwKKyAgICAvKjAzMzMqLyB7ICJwYWEiLCAgMzMzIH0sCisgICAgLyowMzM0Ki8geyAicGFnIiwgIDMzNCB9LAorICAgIC8qMDMzNSovIHsgInBhbCIsICAzMzUgfSwKKyAgICAvKjAzMzYqLyB7ICJwYW0iLCAgMzM2IH0sCisgICAgLyowMzM3Ki8geyAicGFuIiwgIDYzMCB9LAorICAgIC8qMDMzOCovIHsgInBhcCIsICAzMzggfSwKKyAgICAvKjAzMzkqLyB7ICJwYXUiLCAgMzM5IH0sCisgICAgLyowMzQwKi8geyAicGVvIiwgIDM0MCB9LAorICAgIC8qMDM0MSovIHsgInBlciIsICA0OTAgfSwKKyAgICAvKjAzNDIqLyB7ICJwaGkiLCAgMzQyIH0sCisgICAgLyowMzQzKi8geyAicGhuIiwgIDM0MyB9LAorICAgIC8qMDM0NCovIHsgInBsaSIsICA2MzEgfSwKKyAgICAvKjAzNDUqLyB7ICJwb2wiLCAgNjMyIH0sCisgICAgLyowMzQ2Ki8geyAicG9uIiwgIDM0NiB9LAorICAgIC8qMDM0NyovIHsgInBvciIsICA2MzQgfSwKKyAgICAvKjAzNDgqLyB7ICJwcmEiLCAgMzQ4IH0sCisgICAgLyowMzQ5Ki8geyAicHJvIiwgIDM0OSB9LAorICAgIC8qMDM1MCovIHsgInB1cyIsICA2MzMgfSwKKyAgICAvKjAzNTEqLyB7ICJxdWUiLCAgNjM1IH0sCisgICAgLyowMzUyKi8geyAicmFqIiwgIDM1MiB9LAorICAgIC8qMDM1MyovIHsgInJhcCIsICAzNTMgfSwKKyAgICAvKjAzNTQqLyB7ICJyYXIiLCAgMzU0IH0sCisgICAgLyowMzU1Ki8geyAicm9hIiwgIDM1NSB9LAorICAgIC8qMDM1NiovIHsgInJvaCIsICA2MzYgfSwKKyAgICAvKjAzNTcqLyB7ICJyb20iLCAgMzU3IH0sCisgICAgLyowMzU4Ki8geyAicnVtIiwgIDUwMCB9LAorICAgIC8qMDM1OSovIHsgInJ1biIsICA2MzcgfSwKKyAgICAvKjAzNjAqLyB7ICJydXAiLCAgMzYwIH0sCisgICAgLyowMzYxKi8geyAicnVzIiwgIDYzOSB9LAorICAgIC8qMDM2MiovIHsgInNhZCIsICAzNjIgfSwKKyAgICAvKjAzNjMqLyB7ICJzYWciLCAgNjQ1IH0sCisgICAgLyowMzY0Ki8geyAic2FoIiwgIDM2NCB9LAorICAgIC8qMDM2NSovIHsgInNhaSIsICAzNjUgfSwKKyAgICAvKjAzNjYqLyB7ICJzYWwiLCAgMzY2IH0sCisgICAgLyowMzY3Ki8geyAic2FtIiwgIDM2NyB9LAorICAgIC8qMDM2OCovIHsgInNhbiIsICA2NDEgfSwKKyAgICAvKjAzNjkqLyB7ICJzYXMiLCAgMzY5IH0sCisgICAgLyowMzcwKi8geyAic2F0IiwgIDM3MCB9LAorICAgIC8qMDM3MSovIHsgInNjbiIsICAzNzEgfSwKKyAgICAvKjAzNzIqLyB7ICJzY28iLCAgMzcyIH0sCisgICAgLyowMzczKi8geyAic2VsIiwgIDM3MyB9LAorICAgIC8qMDM3NCovIHsgInNlbSIsICAzNzQgfSwKKyAgICAvKjAzNzUqLyB7ICJzZ2EiLCAgMzc1IH0sCisgICAgLyowMzc2Ki8geyAic2duIiwgIDM3NiB9LAorICAgIC8qMDM3NyovIHsgInNobiIsICAzNzcgfSwKKyAgICAvKjAzNzgqLyB7ICJzaWQiLCAgMzc4IH0sCisgICAgLyowMzc5Ki8geyAic2luIiwgIDY0NiB9LAorICAgIC8qMDM4MCovIHsgInNpbyIsICAzODAgfSwKKyAgICAvKjAzODEqLyB7ICJzaXQiLCAgMzgxIH0sCisgICAgLyowMzgyKi8geyAic2xhIiwgIDM4MiB9LAorICAgIC8qMDM4MyovIHsgInNsbyIsICA1MDEgfSwKKyAgICAvKjAzODQqLyB7ICJzbHYiLCAgNjQ4IH0sCisgICAgLyowMzg1Ki8geyAic21hIiwgIDM4NSB9LAorICAgIC8qMDM4NiovIHsgInNtZSIsICA2NDQgfSwKKyAgICAvKjAzODcqLyB7ICJzbWkiLCAgMzg3IH0sCisgICAgLyowMzg4Ki8geyAic21qIiwgIDM4OCB9LAorICAgIC8qMDM4OSovIHsgInNtbiIsICAzODkgfSwKKyAgICAvKjAzOTAqLyB7ICJzbW8iLCAgNjQ5IH0sCisgICAgLyowMzkxKi8geyAic21zIiwgIDM5MSB9LAorICAgIC8qMDM5MiovIHsgInNuYSIsICA2NTAgfSwKKyAgICAvKjAzOTMqLyB7ICJzbmQiLCAgNjQzIH0sCisgICAgLyowMzk0Ki8geyAic25rIiwgIDM5NCB9LAorICAgIC8qMDM5NSovIHsgInNvZyIsICAzOTUgfSwKKyAgICAvKjAzOTYqLyB7ICJzb20iLCAgNjUxIH0sCisgICAgLyowMzk3Ki8geyAic29uIiwgIDM5NyB9LAorICAgIC8qMDM5OCovIHsgInNvdCIsICA2NTUgfSwKKyAgICAvKjAzOTkqLyB7ICJzcGEiLCAgNTQzIH0sCisgICAgLyowNDAwKi8geyAic3JkIiwgIDY0MiB9LAorICAgIC8qMDQwMSovIHsgInNybiIsICA0MDEgfSwKKyAgICAvKjA0MDIqLyB7ICJzcnAiLCAgNjUzIH0sCisgICAgLyowNDAzKi8geyAic3JyIiwgIDQwMyB9LAorICAgIC8qMDQwNCovIHsgInNzYSIsICA0MDQgfSwKKyAgICAvKjA0MDUqLyB7ICJzc3ciLCAgNjU0IH0sCisgICAgLyowNDA2Ki8geyAic3VrIiwgIDQwNiB9LAorICAgIC8qMDQwNyovIHsgInN1biIsICA2NTYgfSwKKyAgICAvKjA0MDgqLyB7ICJzdXMiLCAgNDA4IH0sCisgICAgLyowNDA5Ki8geyAic3V4IiwgIDQwOSB9LAorICAgIC8qMDQxMCovIHsgInN3YSIsICA2NTggfSwKKyAgICAvKjA0MTEqLyB7ICJzd2UiLCAgNjU3IH0sCisgICAgLyowNDEyKi8geyAic3ljIiwgIDQxMiB9LAorICAgIC8qMDQxMyovIHsgInN5ciIsICA0MTMgfSwKKyAgICAvKjA0MTQqLyB7ICJ0YWgiLCAgNjcyIH0sCisgICAgLyowNDE1Ki8geyAidGFpIiwgIDQxNSB9LAorICAgIC8qMDQxNiovIHsgInRhbSIsICA2NTkgfSwKKyAgICAvKjA0MTcqLyB7ICJ0YXQiLCAgNjcwIH0sCisgICAgLyowNDE4Ki8geyAidGVsIiwgIDY2MCB9LAorICAgIC8qMDQxOSovIHsgInRlbSIsICA0MTkgfSwKKyAgICAvKjA0MjAqLyB7ICJ0ZXIiLCAgNDIwIH0sCisgICAgLyowNDIxKi8geyAidGV0IiwgIDQyMSB9LAorICAgIC8qMDQyMiovIHsgInRnayIsICA2NjEgfSwKKyAgICAvKjA0MjMqLyB7ICJ0Z2wiLCAgNjY1IH0sCisgICAgLyowNDI0Ki8geyAidGhhIiwgIDY2MiB9LAorICAgIC8qMDQyNSovIHsgInRpYiIsICA0ODQgfSwKKyAgICAvKjA0MjYqLyB7ICJ0aWciLCAgNDI2IH0sCisgICAgLyowNDI3Ki8geyAidGlyIiwgIDY2MyB9LAorICAgIC8qMDQyOCovIHsgInRpdiIsICA0MjggfSwKKyAgICAvKjA0MjkqLyB7ICJ0a2wiLCAgNDI5IH0sCisgICAgLyowNDMwKi8geyAidGxoIiwgIDQzMCB9LAorICAgIC8qMDQzMSovIHsgInRsaSIsICA0MzEgfSwKKyAgICAvKjA0MzIqLyB7ICJ0bWgiLCAgNDMyIH0sCisgICAgLyowNDMzKi8geyAidG9nIiwgIDQzMyB9LAorICAgIC8qMDQzNCovIHsgInRvbiIsICA2NjcgfSwKKyAgICAvKjA0MzUqLyB7ICJ0cGkiLCAgNDM1IH0sCisgICAgLyowNDM2Ki8geyAidHNpIiwgIDQzNiB9LAorICAgIC8qMDQzNyovIHsgInRzbiIsICA2NjYgfSwKKyAgICAvKjA0MzgqLyB7ICJ0c28iLCAgNjY5IH0sCisgICAgLyowNDM5Ki8geyAidHVrIiwgIDY2NCB9LAorICAgIC8qMDQ0MCovIHsgInR1bSIsICA0NDAgfSwKKyAgICAvKjA0NDEqLyB7ICJ0dXAiLCAgNDQxIH0sCisgICAgLyowNDQyKi8geyAidHVyIiwgIDY2OCB9LAorICAgIC8qMDQ0MyovIHsgInR1dCIsICA0NDMgfSwKKyAgICAvKjA0NDQqLyB7ICJ0dmwiLCAgNDQ0IH0sCisgICAgLyowNDQ1Ki8geyAidHdpIiwgIDY3MSB9LAorICAgIC8qMDQ0NiovIHsgInR5diIsICA0NDYgfSwKKyAgICAvKjA0NDcqLyB7ICJ1ZG0iLCAgNDQ3IH0sCisgICAgLyowNDQ4Ki8geyAidWdhIiwgIDQ0OCB9LAorICAgIC8qMDQ0OSovIHsgInVpZyIsICA2NzMgfSwKKyAgICAvKjA0NTAqLyB7ICJ1a3IiLCAgNjc0IH0sCisgICAgLyowNDUxKi8geyAidW1iIiwgIDQ1MSB9LAorICAgIC8qMDQ1MiovIHsgInVuZCIsICA0NTIgfSwKKyAgICAvKjA0NTMqLyB7ICJ1cmQiLCAgNjc1IH0sCisgICAgLyowNDU0Ki8geyAidXpiIiwgIDY3NiB9LAorICAgIC8qMDQ1NSovIHsgInZhaSIsICA0NTUgfSwKKyAgICAvKjA0NTYqLyB7ICJ2ZW4iLCAgNjc3IH0sCisgICAgLyowNDU3Ki8geyAidmllIiwgIDY3OCB9LAorICAgIC8qMDQ1OCovIHsgInZvbCIsICA2NzkgfSwKKyAgICAvKjA0NTkqLyB7ICJ2b3QiLCAgNDU5IH0sCisgICAgLyowNDYwKi8geyAid2FrIiwgIDQ2MCB9LAorICAgIC8qMDQ2MSovIHsgIndhbCIsICA0NjEgfSwKKyAgICAvKjA0NjIqLyB7ICJ3YXIiLCAgNDYyIH0sCisgICAgLyowNDYzKi8geyAid2FzIiwgIDQ2MyB9LAorICAgIC8qMDQ2NCovIHsgIndlbCIsICA0ODYgfSwKKyAgICAvKjA0NjUqLyB7ICJ3ZW4iLCAgNDY1IH0sCisgICAgLyowNDY2Ki8geyAid2xuIiwgIDY4MCB9LAorICAgIC8qMDQ2NyovIHsgIndvbCIsICA2ODEgfSwKKyAgICAvKjA0NjgqLyB7ICJ4YWwiLCAgNDY4IH0sCisgICAgLyowNDY5Ki8geyAieGhvIiwgIDY4MiB9LAorICAgIC8qMDQ3MCovIHsgInlhbyIsICA0NzAgfSwKKyAgICAvKjA0NzEqLyB7ICJ5YXAiLCAgNDcxIH0sCisgICAgLyowNDcyKi8geyAieWlkIiwgIDY4MyB9LAorICAgIC8qMDQ3MyovIHsgInlvciIsICA2ODQgfSwKKyAgICAvKjA0NzQqLyB7ICJ5cGsiLCAgNDc0IH0sCisgICAgLyowNDc1Ki8geyAiemFwIiwgIDQ3NSB9LAorICAgIC8qMDQ3NiovIHsgInpibCIsICA0NzYgfSwKKyAgICAvKjA0NzcqLyB7ICJ6ZW4iLCAgNDc3IH0sCisgICAgLyowNDc4Ki8geyAiemhhIiwgIDY4NSB9LAorICAgIC8qMDQ3OSovIHsgInpuZCIsICA0NzkgfSwKKyAgICAvKjA0ODAqLyB7ICJ6dWwiLCAgNjg3IH0sCisgICAgLyowNDgxKi8geyAienVuIiwgIDQ4MSB9LAorICAgIC8qMDQ4MiovIHsgInp4eCIsICA0ODIgfSwKKyAgICAvKjA0ODMqLyB7ICJ6emEiLCAgNDgzIH0sCisgICAgLyotLS0tLSBBVl9MQU5HX0lTTzYzOV8yX1RFUk0gZW50cmllcyAoMjApIC0tLS0tKi8KKyAgICAvKjA0ODQqLyB7ICJib2QiLCAgNTIzIH0sCisgICAgLyowNDg1Ki8geyAiY2VzIiwgIDUzMSB9LAorICAgIC8qMDQ4NiovIHsgImN5bSIsICA1MzQgfSwKKyAgICAvKjA0ODcqLyB7ICJkZXUiLCAgNTM2IH0sCisgICAgLyowNDg4Ki8geyAiZWxsIiwgIDU0MCB9LAorICAgIC8qMDQ4OSovIHsgImV1cyIsICA1NDUgfSwKKyAgICAvKjA0OTAqLyB7ICJmYXMiLCAgNTQ2IH0sCisgICAgLyowNDkxKi8geyAiZnJhIiwgIDU1MSB9LAorICAgIC8qMDQ5MiovIHsgImh5ZSIsICA1NjYgfSwKKyAgICAvKjA0OTMqLyB7ICJpc2wiLCAgNTc1IH0sCisgICAgLyowNDk0Ki8geyAia2F0IiwgIDU4MCB9LAorICAgIC8qMDQ5NSovIHsgIm1rZCIsICA2MDcgfSwKKyAgICAvKjA0OTYqLyB7ICJtcmkiLCAgNjA2IH0sCisgICAgLyowNDk3Ki8geyAibXNhIiwgIDYxMSB9LAorICAgIC8qMDQ5OCovIHsgIm15YSIsICA2MTMgfSwKKyAgICAvKjA0OTkqLyB7ICJubGQiLCAgNjE5IH0sCisgICAgLyowNTAwKi8geyAicm9uIiwgIDYzOCB9LAorICAgIC8qMDUwMSovIHsgInNsayIsICA2NDcgfSwKKyAgICAvKjA1MDIqLyB7ICJzcWkiLCAgNjUyIH0sCisgICAgLyowNTAzKi8geyAiemhvIiwgIDY4NiB9LAorICAgIC8qLS0tLS0gQVZfTEFOR19JU082MzlfMSBlbnRyaWVzICgxODQpIC0tLS0tKi8KKyAgICAvKjA1MDQqLyB7ICJhYSIgLCAgICAwIH0sCisgICAgLyowNTA1Ki8geyAiYWIiICwgICAgMSB9LAorICAgIC8qMDUwNiovIHsgImFlIiAsICAgMzMgfSwKKyAgICAvKjA1MDcqLyB7ICJhZiIgLCAgICA4IH0sCisgICAgLyowNTA4Ki8geyAiYWsiICwgICAxMCB9LAorICAgIC8qMDUwOSovIHsgImFtIiAsICAgMTYgfSwKKyAgICAvKjA1MTAqLyB7ICJhbiIgLCAgIDIyIH0sCisgICAgLyowNTExKi8geyAiYXIiICwgICAyMCB9LAorICAgIC8qMDUxMiovIHsgImFzIiAsICAgMjggfSwKKyAgICAvKjA1MTMqLyB7ICJhdiIgLCAgIDMyIH0sCisgICAgLyowNTE0Ki8geyAiYXkiICwgICAzNSB9LAorICAgIC8qMDUxNSovIHsgImF6IiAsICAgMzYgfSwKKyAgICAvKjA1MTYqLyB7ICJiYSIgLCAgIDM5IH0sCisgICAgLyowNTE3Ki8geyAiYmUiICwgICA0NyB9LAorICAgIC8qMDUxOCovIHsgImJnIiAsICAgNjQgfSwKKyAgICAvKjA1MTkqLyB7ICJiaCIgLCAgIDUyIH0sCisgICAgLyowNTIwKi8geyAiYmkiICwgICA1NSB9LAorICAgIC8qMDUyMSovIHsgImJtIiAsICAgNDEgfSwKKyAgICAvKjA1MjIqLyB7ICJibiIgLCAgIDQ5IH0sCisgICAgLyowNTIzKi8geyAiYm8iICwgIDQyNSB9LAorICAgIC8qMDUyNCovIHsgImJyIiAsICAgNjAgfSwKKyAgICAvKjA1MjUqLyB7ICJicyIgLCAgIDU4IH0sCisgICAgLyowNTI2Ki8geyAiY2EiICwgICA3MCB9LAorICAgIC8qMDUyNyovIHsgImNlIiAsICAgNzYgfSwKKyAgICAvKjA1MjgqLyB7ICJjaCIgLCAgIDc0IH0sCisgICAgLyowNTI5Ki8geyAiY28iICwgICA5MSB9LAorICAgIC8qMDUzMCovIHsgImNyIiAsICAgOTUgfSwKKyAgICAvKjA1MzEqLyB7ICJjcyIgLCAgMTAwIH0sCisgICAgLyowNTMyKi8geyAiY3UiICwgICA4NSB9LAorICAgIC8qMDUzMyovIHsgImN2IiAsICAgODYgfSwKKyAgICAvKjA1MzQqLyB7ICJjeSIgLCAgNDY0IH0sCisgICAgLyowNTM1Ki8geyAiZGEiICwgIDEwMiB9LAorICAgIC8qMDUzNiovIHsgImRlIiAsICAxNDkgfSwKKyAgICAvKjA1MzcqLyB7ICJkdiIgLCAgMTA5IH0sCisgICAgLyowNTM4Ki8geyAiZHoiICwgIDExNyB9LAorICAgIC8qMDUzOSovIHsgImVlIiAsICAxMjYgfSwKKyAgICAvKjA1NDAqLyB7ICJlbCIgLCAgMTYzIH0sCisgICAgLyowNTQxKi8geyAiZW4iICwgIDEyMiB9LAorICAgIC8qMDU0MiovIHsgImVvIiAsICAxMjQgfSwKKyAgICAvKjA1NDMqLyB7ICJlcyIgLCAgMzk5IH0sCisgICAgLyowNTQ0Ki8geyAiZXQiICwgIDEyNSB9LAorICAgIC8qMDU0NSovIHsgImV1IiAsICAgNDMgfSwKKyAgICAvKjA1NDYqLyB7ICJmYSIgLCAgMzQxIH0sCisgICAgLyowNTQ3Ki8geyAiZmYiICwgIDE0MiB9LAorICAgIC8qMDU0OCovIHsgImZpIiAsICAxMzMgfSwKKyAgICAvKjA1NDkqLyB7ICJmaiIgLCAgMTMxIH0sCisgICAgLyowNTUwKi8geyAiZm8iICwgIDEyOSB9LAorICAgIC8qMDU1MSovIHsgImZyIiAsICAxMzYgfSwKKyAgICAvKjA1NTIqLyB7ICJmeSIgLCAgMTQxIH0sCisgICAgLyowNTUzKi8geyAiZ2EiICwgIDE1MyB9LAorICAgIC8qMDU1NCovIHsgImdkIiAsICAxNTIgfSwKKyAgICAvKjA1NTUqLyB7ICJnbCIgLCAgMTU0IH0sCisgICAgLyowNTU2Ki8geyAiZ24iICwgIDE2NCB9LAorICAgIC8qMDU1NyovIHsgImd1IiAsICAxNjYgfSwKKyAgICAvKjA1NTgqLyB7ICJndiIgLCAgMTU1IH0sCisgICAgLyowNTU5Ki8geyAiaGEiICwgIDE3MCB9LAorICAgIC8qMDU2MCovIHsgImhlIiAsICAxNzIgfSwKKyAgICAvKjA1NjEqLyB7ICJoaSIgLCAgMTc2IH0sCisgICAgLyowNTYyKi8geyAiaG8iICwgIDE3OSB9LAorICAgIC8qMDU2MyovIHsgImhyIiAsICAxODAgfSwKKyAgICAvKjA1NjQqLyB7ICJodCIgLCAgMTY5IH0sCisgICAgLyowNTY1Ki8geyAiaHUiICwgIDE4MiB9LAorICAgIC8qMDU2NiovIHsgImh5IiAsICAgMjMgfSwKKyAgICAvKjA1NjcqLyB7ICJoeiIgLCAgMTczIH0sCisgICAgLyowNTY4Ki8geyAiaWEiICwgIDE5MyB9LAorICAgIC8qMDU2OSovIHsgImlkIiAsICAxOTUgfSwKKyAgICAvKjA1NzAqLyB7ICJpZSIgLCAgMTkxIH0sCisgICAgLyowNTcxKi8geyAiaWciICwgIDE4NSB9LAorICAgIC8qMDU3MiovIHsgImlpIiAsICAxODggfSwKKyAgICAvKjA1NzMqLyB7ICJpayIgLCAgMTk4IH0sCisgICAgLyowNTc0Ki8geyAiaW8iICwgIDE4NyB9LAorICAgIC8qMDU3NSovIHsgImlzIiAsICAxODYgfSwKKyAgICAvKjA1NzYqLyB7ICJpdCIgLCAgMjAxIH0sCisgICAgLyowNTc3Ki8geyAiaXUiICwgIDE5MCB9LAorICAgIC8qMDU3OCovIHsgImphIiAsICAyMDQgfSwKKyAgICAvKjA1NzkqLyB7ICJqdiIgLCAgMjAyIH0sCisgICAgLyowNTgwKi8geyAia2EiICwgIDE0OCB9LAorICAgIC8qMDU4MSovIHsgImtnIiAsICAyMjkgfSwKKyAgICAvKjA1ODIqLyB7ICJraSIgLCAgMjIzIH0sCisgICAgLyowNTgzKi8geyAia2oiICwgIDIzNyB9LAorICAgIC8qMDU4NCovIHsgImtrIiAsICAyMTcgfSwKKyAgICAvKjA1ODUqLyB7ICJrbCIgLCAgMjEwIH0sCisgICAgLyowNTg2Ki8geyAia20iICwgIDIyMSB9LAorICAgIC8qMDU4NyovIHsgImtuIiAsICAyMTIgfSwKKyAgICAvKjA1ODgqLyB7ICJrbyIgLCAgMjMwIH0sCisgICAgLyowNTg5Ki8geyAia3IiICwgIDIxNSB9LAorICAgIC8qMDU5MCovIHsgImtzIiAsICAyMTQgfSwKKyAgICAvKjA1OTEqLyB7ICJrdSIgLCAgMjM5IH0sCisgICAgLyowNTkyKi8geyAia3YiICwgIDIyOCB9LAorICAgIC8qMDU5MyovIHsgImt3IiAsICAgOTAgfSwKKyAgICAvKjA1OTQqLyB7ICJreSIgLCAgMjI1IH0sCisgICAgLyowNTk1Ki8geyAibGEiICwgIDI0NSB9LAorICAgIC8qMDU5NiovIHsgImxiIiAsICAyNTMgfSwKKyAgICAvKjA1OTcqLyB7ICJsZyIgLCAgMjU2IH0sCisgICAgLyowNTk4Ki8geyAibGkiICwgIDI0OCB9LAorICAgIC8qMDU5OSovIHsgImxuIiAsICAyNDkgfSwKKyAgICAvKjA2MDAqLyB7ICJsbyIgLCAgMjQ0IH0sCisgICAgLyowNjAxKi8geyAibHQiICwgIDI1MCB9LAorICAgIC8qMDYwMiovIHsgImx1IiAsICAyNTUgfSwKKyAgICAvKjA2MDMqLyB7ICJsdiIgLCAgMjQ2IH0sCisgICAgLyowNjA0Ki8geyAibWciICwgIDI4MiB9LAorICAgIC8qMDYwNSovIHsgIm1oIiAsICAyNjQgfSwKKyAgICAvKjA2MDYqLyB7ICJtaSIgLCAgMjY5IH0sCisgICAgLyowNjA3Ki8geyAibWsiICwgIDI2MSB9LAorICAgIC8qMDYwOCovIHsgIm1sIiAsICAyNjcgfSwKKyAgICAvKjA2MDkqLyB7ICJtbiIgLCAgMjg4IH0sCisgICAgLyowNjEwKi8geyAibXIiICwgIDI3MSB9LAorICAgIC8qMDYxMSovIHsgIm1zIiAsICAyNzMgfSwKKyAgICAvKjA2MTIqLyB7ICJtdCIgLCAgMjgzIH0sCisgICAgLyowNjEzKi8geyAibXkiICwgICA2NSB9LAorICAgIC8qMDYxNCovIHsgIm5hIiAsICAzMDAgfSwKKyAgICAvKjA2MTUqLyB7ICJuYiIgLCAgMzEyIH0sCisgICAgLyowNjE2Ki8geyAibmQiICwgIDMwMyB9LAorICAgIC8qMDYxNyovIHsgIm5lIiAsICAzMDYgfSwKKyAgICAvKjA2MTgqLyB7ICJuZyIgLCAgMzA0IH0sCisgICAgLyowNjE5Ki8geyAibmwiICwgIDExNSB9LAorICAgIC8qMDYyMCovIHsgIm5uIiAsICAzMTEgfSwKKyAgICAvKjA2MjEqLyB7ICJubyIgLCAgMzE1IH0sCisgICAgLyowNjIyKi8geyAibnIiICwgIDMwMiB9LAorICAgIC8qMDYyMyovIHsgIm52IiAsICAzMDEgfSwKKyAgICAvKjA2MjQqLyB7ICJueSIgLCAgMzIwIH0sCisgICAgLyowNjI1Ki8geyAib2MiICwgIDMyNSB9LAorICAgIC8qMDYyNiovIHsgIm9qIiAsICAzMjYgfSwKKyAgICAvKjA2MjcqLyB7ICJvbSIgLCAgMzI4IH0sCisgICAgLyowNjI4Ki8geyAib3IiICwgIDMyNyB9LAorICAgIC8qMDYyOSovIHsgIm9zIiAsICAzMzAgfSwKKyAgICAvKjA2MzAqLyB7ICJwYSIgLCAgMzM3IH0sCisgICAgLyowNjMxKi8geyAicGkiICwgIDM0NCB9LAorICAgIC8qMDYzMiovIHsgInBsIiAsICAzNDUgfSwKKyAgICAvKjA2MzMqLyB7ICJwcyIgLCAgMzUwIH0sCisgICAgLyowNjM0Ki8geyAicHQiICwgIDM0NyB9LAorICAgIC8qMDYzNSovIHsgInF1IiAsICAzNTEgfSwKKyAgICAvKjA2MzYqLyB7ICJybSIgLCAgMzU2IH0sCisgICAgLyowNjM3Ki8geyAicm4iICwgIDM1OSB9LAorICAgIC8qMDYzOCovIHsgInJvIiAsICAzNTggfSwKKyAgICAvKjA2MzkqLyB7ICJydSIgLCAgMzYxIH0sCisgICAgLyowNjQwKi8geyAicnciICwgIDIyNCB9LAorICAgIC8qMDY0MSovIHsgInNhIiAsICAzNjggfSwKKyAgICAvKjA2NDIqLyB7ICJzYyIgLCAgNDAwIH0sCisgICAgLyowNjQzKi8geyAic2QiICwgIDM5MyB9LAorICAgIC8qMDY0NCovIHsgInNlIiAsICAzODYgfSwKKyAgICAvKjA2NDUqLyB7ICJzZyIgLCAgMzYzIH0sCisgICAgLyowNjQ2Ki8geyAic2kiICwgIDM3OSB9LAorICAgIC8qMDY0NyovIHsgInNrIiAsICAzODMgfSwKKyAgICAvKjA2NDgqLyB7ICJzbCIgLCAgMzg0IH0sCisgICAgLyowNjQ5Ki8geyAic20iICwgIDM5MCB9LAorICAgIC8qMDY1MCovIHsgInNuIiAsICAzOTIgfSwKKyAgICAvKjA2NTEqLyB7ICJzbyIgLCAgMzk2IH0sCisgICAgLyowNjUyKi8geyAic3EiICwgICAxMiB9LAorICAgIC8qMDY1MyovIHsgInNyIiAsICA0MDIgfSwKKyAgICAvKjA2NTQqLyB7ICJzcyIgLCAgNDA1IH0sCisgICAgLyowNjU1Ki8geyAic3QiICwgIDM5OCB9LAorICAgIC8qMDY1NiovIHsgInN1IiAsICA0MDcgfSwKKyAgICAvKjA2NTcqLyB7ICJzdiIgLCAgNDExIH0sCisgICAgLyowNjU4Ki8geyAic3ciICwgIDQxMCB9LAorICAgIC8qMDY1OSovIHsgInRhIiAsICA0MTYgfSwKKyAgICAvKjA2NjAqLyB7ICJ0ZSIgLCAgNDE4IH0sCisgICAgLyowNjYxKi8geyAidGciICwgIDQyMiB9LAorICAgIC8qMDY2MiovIHsgInRoIiAsICA0MjQgfSwKKyAgICAvKjA2NjMqLyB7ICJ0aSIgLCAgNDI3IH0sCisgICAgLyowNjY0Ki8geyAidGsiICwgIDQzOSB9LAorICAgIC8qMDY2NSovIHsgInRsIiAsICA0MjMgfSwKKyAgICAvKjA2NjYqLyB7ICJ0biIgLCAgNDM3IH0sCisgICAgLyowNjY3Ki8geyAidG8iICwgIDQzNCB9LAorICAgIC8qMDY2OCovIHsgInRyIiAsICA0NDIgfSwKKyAgICAvKjA2NjkqLyB7ICJ0cyIgLCAgNDM4IH0sCisgICAgLyowNjcwKi8geyAidHQiICwgIDQxNyB9LAorICAgIC8qMDY3MSovIHsgInR3IiAsICA0NDUgfSwKKyAgICAvKjA2NzIqLyB7ICJ0eSIgLCAgNDE0IH0sCisgICAgLyowNjczKi8geyAidWciICwgIDQ0OSB9LAorICAgIC8qMDY3NCovIHsgInVrIiAsICA0NTAgfSwKKyAgICAvKjA2NzUqLyB7ICJ1ciIgLCAgNDUzIH0sCisgICAgLyowNjc2Ki8geyAidXoiICwgIDQ1NCB9LAorICAgIC8qMDY3NyovIHsgInZlIiAsICA0NTYgfSwKKyAgICAvKjA2NzgqLyB7ICJ2aSIgLCAgNDU3IH0sCisgICAgLyowNjc5Ki8geyAidm8iICwgIDQ1OCB9LAorICAgIC8qMDY4MCovIHsgIndhIiAsICA0NjYgfSwKKyAgICAvKjA2ODEqLyB7ICJ3byIgLCAgNDY3IH0sCisgICAgLyowNjgyKi8geyAieGgiICwgIDQ2OSB9LAorICAgIC8qMDY4MyovIHsgInlpIiAsICA0NzIgfSwKKyAgICAvKjA2ODQqLyB7ICJ5byIgLCAgNDczIH0sCisgICAgLyowNjg1Ki8geyAiemEiICwgIDQ3OCB9LAorICAgIC8qMDY4NiovIHsgInpoIiAsICAgNzggfSwKKyAgICAvKjA2ODcqLyB7ICJ6dSIgLCAgNDgwIH0sCisgICAgeyAiIiwgMCB9Cit9OworCitzdGF0aWMgaW50IGxhbmdfdGFibGVfY29tcGFyZShjb25zdCB2b2lkICpsaHMsIGNvbnN0IHZvaWQgKnJocykKK3sKKyAgICByZXR1cm4gc3RyY21wKGxocywgKChjb25zdCBMYW5nRW50cnkgKilyaHMpLT5zdHIpOworfQorCitjb25zdCBjaGFyICphdl9jb252ZXJ0X2xhbmdfdG8oY29uc3QgY2hhciAqbGFuZywgZW51bSBBVkxhbmdDb2Rlc3BhY2UgdGFyZ2V0X2NvZGVzcGFjZSkKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCBMYW5nRW50cnkgKmVudHJ5ID0gTlVMTDsKKyAgICBjb25zdCBpbnQgTkJfQ09ERVNQQUNFUyA9IEZGX0FSUkFZX0VMRU1TKGxhbmdfdGFibGVfY291bnRzKTsKKworICAgIGlmICh0YXJnZXRfY29kZXNwYWNlID49IE5CX0NPREVTUEFDRVMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yIChpPTA7ICFlbnRyeSAmJiBpPE5CX0NPREVTUEFDRVM7IGkrKykKKyAgICAgICAgZW50cnkgPSBic2VhcmNoKGxhbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBsYW5nX3RhYmxlICsgbGFuZ190YWJsZV9vZmZzZXRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ190YWJsZV9jb3VudHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTGFuZ0VudHJ5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhbmdfdGFibGVfY29tcGFyZSk7CisgICAgaWYgKCFlbnRyeSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGk9MDsgaTxOQl9DT0RFU1BBQ0VTOyBpKyspCisgICAgICAgIGlmIChlbnRyeSA+PSBsYW5nX3RhYmxlICsgbGFuZ190YWJsZV9vZmZzZXRzW3RhcmdldF9jb2Rlc3BhY2VdICYmCisgICAgICAgICAgICBlbnRyeSA8IGxhbmdfdGFibGUgKyBsYW5nX3RhYmxlX29mZnNldHNbdGFyZ2V0X2NvZGVzcGFjZV0gKyBsYW5nX3RhYmxlX2NvdW50c1t0YXJnZXRfY29kZXNwYWNlXSkKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS0+c3RyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlbnRyeSA9IGxhbmdfdGFibGUgKyBlbnRyeS0+bmV4dF9lcXVpdmFsZW50OworCisgICAgaWYgKHRhcmdldF9jb2Rlc3BhY2UgPT0gQVZfTEFOR19JU082MzlfMl9URVJNKQorICAgICAgICByZXR1cm4gYXZfY29udmVydF9sYW5nX3RvKGxhbmcsIEFWX0xBTkdfSVNPNjM5XzJfQklCTCk7CisKKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hdmxhbmd1YWdlLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvYXZsYW5ndWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjg5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXZsYW5ndWFnZS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDeXJpbCBDb21wYXJvbiwgTGFyYmkgSm91YmFsYSwgUmVzb25hdGUtTVA0IDIwMDkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9BVkxBTkdVQUdFX0gKKyNkZWZpbmUgQVZGT1JNQVRfQVZMQU5HVUFHRV9ICisKKy8qKgorICogS25vd24gbGFuZ3VhZ2UgY29kZXNwYWNlcworICovCitlbnVtIEFWTGFuZ0NvZGVzcGFjZSB7CisgICAgQVZfTEFOR19JU082MzlfMl9CSUJMLCAvKiogMy1jaGFyIGJpYmxpb2dyYXBoaWMgbGFuZ3VhZ2UgY29kZXMgYXMgcGVyIElTTy1JRUMgNjM5LTIgKi8KKyAgICBBVl9MQU5HX0lTTzYzOV8yX1RFUk0sIC8qKiAzLWNoYXIgdGVybWlub2xvZ2ljIGxhbmd1YWdlIGNvZGVzIGFzIHBlciBJU08tSUVDIDYzOS0yICovCisgICAgQVZfTEFOR19JU082MzlfMSAgICAgICAvKiogMi1jaGFyIGNvZGUgb2YgbGFuZ3VhZ2UgYXMgcGVyIElTTy9JRUMgNjM5LTEgKi8KK307CisKKy8qKgorICogQ29udmVydCBhIGxhbmd1YWdlIGNvZGUgdG8gYSB0YXJnZXQgY29kZXNwYWNlLiBUaGUgc291cmNlIGNvZGVzcGFjZSBpcyBndWVzc2VkLgorICogQHJldHVybiBOVUxMIGlmIHRoZSBwcm92aWRlZCBsYW5nIGlzIG51bGwgb3IgaW52YWxpZC4KKyAqLworY29uc3QgY2hhciAqYXZfY29udmVydF9sYW5nX3RvKGNvbnN0IGNoYXIgKmxhbmcsIGVudW0gQVZMYW5nQ29kZXNwYWNlIHRhcmdldF9jb2Rlc3BhY2UpOworCisjZW5kaWYgLyogQVZGT1JNQVRfQVZMQU5HVUFHRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYXZyLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYXZyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzMTM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hdnIuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogQVZSIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicGNtLmgiCisKK3N0YXRpYyBpbnQgYXZyX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChBVl9STDMyKHAtPmJ1ZikgIT0gTUtUQUcoJzInLCAnQicsICdJJywgJ1QnKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIUFWX1JCMTYocC0+YnVmKzEyKSB8fCBBVl9SQjE2KHAtPmJ1ZisxMikgPiAyNTYpIC8vIGNoYW5uZWxzCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTi8yOworICAgIGlmIChBVl9SQjE2KHAtPmJ1ZisxNCkgPiAyNTYpIC8vIGJwcworICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04vMjsKKworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKK30KKworc3RhdGljIGludCBhdnJfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHVpbnQxNl90IGNoYW4sIHNpZ24sIGJwczsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKworICAgIGF2aW9fc2tpcChzLT5wYiwgNCk7IC8vIG1hZ2ljCisgICAgYXZpb19za2lwKHMtPnBiLCA4KTsgLy8gc2FtcGxlX25hbWUKKworICAgIGNoYW4gPSBhdmlvX3JiMTYocy0+cGIpOworICAgIGlmICghY2hhbikgeworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gMTsKKyAgICB9IGVsc2UgaWYgKGNoYW4gPT0gMHhGRkZGdSkgeworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImNoYW4gJWQiLCBjaGFuKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYnBzID0gYXZpb19yYjE2KHMtPnBiKTsKKworICAgIHNpZ24gPSBhdmlvX3JiMTYocy0+cGIpOworCisgICAgYXZpb19za2lwKHMtPnBiLCAyKTsgLy8gbG9vcAorICAgIGF2aW9fc2tpcChzLT5wYiwgMik7IC8vIG1pZGkKKyAgICBhdmlvX3NraXAocy0+cGIsIDEpOyAvLyByZXBsYXkgc3BlZWQKKworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMjQocy0+cGIpOworICAgIGF2aW9fc2tpcChzLT5wYiwgNCAqIDMpOworICAgIGF2aW9fc2tpcChzLT5wYiwgMiAqIDMpOworICAgIGF2aW9fc2tpcChzLT5wYiwgMjApOworICAgIGF2aW9fc2tpcChzLT5wYiwgNjQpOworCisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2dldF9wY21fY29kZWNfaWQoYnBzLCAwLCAxLCBzaWduKTsKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiQnBzICVkIGFuZCBzaWduICVkIiwgYnBzLCBzaWduKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBicHMgKiBzdC0+Y29kZWMtPmNoYW5uZWxzIC8gODsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9hdnJfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXZyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVZSIChBdWRpbyBWaXN1YWwgUmVzZWFyY2gpIiksCisgICAgLnJlYWRfcHJvYmUgICAgID0gYXZyX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGF2cl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmZl9wY21fcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlayAgICAgID0gZmZfcGNtX3JlYWRfc2VlaywKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiYXZyIiwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9hdnMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9hdnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjk5ZGJmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2F2cy5jCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQVZTIGRlbXV4ZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAidm9jLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgYXZzX2Zvcm1hdCB7CisgICAgVm9jRGVjQ29udGV4dCB2b2M7CisgICAgQVZTdHJlYW0gKnN0X3ZpZGVvOworICAgIEFWU3RyZWFtICpzdF9hdWRpbzsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgYml0c19wZXJfc2FtcGxlOworICAgIGludCBmcHM7CisgICAgaW50IG5iX2ZyYW1lczsKKyAgICBpbnQgcmVtYWluaW5nX2ZyYW1lX3NpemU7CisgICAgaW50IHJlbWFpbmluZ19hdWRpb19zaXplOworfSBBdnNGb3JtYXQ7CisKK3R5cGVkZWYgZW51bSBhdnNfYmxvY2tfdHlwZSB7CisgICAgQVZTX05PTkUgICAgICA9IDB4MDAsCisgICAgQVZTX1ZJREVPICAgICA9IDB4MDEsCisgICAgQVZTX0FVRElPICAgICA9IDB4MDIsCisgICAgQVZTX1BBTEVUVEUgICA9IDB4MDMsCisgICAgQVZTX0dBTUVfREFUQSA9IDB4MDQsCit9IEF2c0Jsb2NrVHlwZTsKKworc3RhdGljIGludCBhdnNfcHJvYmUoQVZQcm9iZURhdGEgKiBwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmQ7CisKKyAgICBkID0gcC0+YnVmOworICAgIGlmIChkWzBdID09ICd3JyAmJiBkWzFdID09ICdXJyAmJiBkWzJdID09IDB4MTAgJiYgZFszXSA9PSAwKQorICAgICAgICAvKiBFbnN1cmUgdGhlIGJ1ZmZlciBwcm9iZSBzY29yZXMgaGlnaGVyIHRoYW4gdGhlIGV4dGVuc2lvbiBwcm9iZS4KKyAgICAgICAgICogVGhpcyBhdm9pZHMgcHJvYmxlbXMgd2l0aCBtaXNkZXRlY3Rpb24gYXMgQXZpU3ludGggc2NyaXB0cy4gKi8KKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgNTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF2c19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKiBzKQoreworICAgIEF2c0Zvcm1hdCAqYXZzID0gcy0+cHJpdl9kYXRhOworCisgICAgcy0+Y3R4X2ZsYWdzIHw9IEFWRk1UQ1RYX05PSEVBREVSOworCisgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKKyAgICBhdnMtPndpZHRoID0gYXZpb19ybDE2KHMtPnBiKTsKKyAgICBhdnMtPmhlaWdodCA9IGF2aW9fcmwxNihzLT5wYik7CisgICAgYXZzLT5iaXRzX3Blcl9zYW1wbGUgPSBhdmlvX3JsMTYocy0+cGIpOworICAgIGF2cy0+ZnBzID0gYXZpb19ybDE2KHMtPnBiKTsKKyAgICBhdnMtPm5iX2ZyYW1lcyA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgYXZzLT5yZW1haW5pbmdfZnJhbWVfc2l6ZSA9IDA7CisgICAgYXZzLT5yZW1haW5pbmdfYXVkaW9fc2l6ZSA9IDA7CisKKyAgICBhdnMtPnN0X3ZpZGVvID0gYXZzLT5zdF9hdWRpbyA9IE5VTEw7CisKKyAgICBpZiAoYXZzLT53aWR0aCAhPSAzMTggfHwgYXZzLT5oZWlnaHQgIT0gMTk4KQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVGhpcyBhdnMgcHJldGVuZCB0byBiZSAlZHglZCAiCisgICAgICAgICAgICAgICAid2hlbiB0aGUgYXZzIGZvcm1hdCBpcyBzdXBwb3NlZCB0byBiZSAzMTh4MTk4IG9ubHkuXG4iLAorICAgICAgICAgICAgICAgYXZzLT53aWR0aCwgYXZzLT5oZWlnaHQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2F2c19yZWFkX3ZpZGVvX3BhY2tldChBVkZvcm1hdENvbnRleHQgKiBzLCBBVlBhY2tldCAqIHBrdCwKKyAgICAgICAgICAgICAgICAgICAgICBBdnNCbG9ja1R5cGUgdHlwZSwgaW50IHN1Yl90eXBlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICogcGFsZXR0ZSwgaW50IHBhbGV0dGVfc2l6ZSkKK3sKKyAgICBBdnNGb3JtYXQgKmF2cyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIHNpemUgKyBwYWxldHRlX3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHBhbGV0dGVfc2l6ZSkgeworICAgICAgICBwa3QtPmRhdGFbMF0gPSAweDAwOworICAgICAgICBwa3QtPmRhdGFbMV0gPSAweDAzOworICAgICAgICBwa3QtPmRhdGFbMl0gPSBwYWxldHRlX3NpemUgJiAweEZGOworICAgICAgICBwa3QtPmRhdGFbM10gPSAocGFsZXR0ZV9zaXplID4+IDgpICYgMHhGRjsKKyAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSArIDQsIHBhbGV0dGUsIHBhbGV0dGVfc2l6ZSAtIDQpOworICAgIH0KKworICAgIHBrdC0+ZGF0YVtwYWxldHRlX3NpemUgKyAwXSA9IHN1Yl90eXBlOworICAgIHBrdC0+ZGF0YVtwYWxldHRlX3NpemUgKyAxXSA9IHR5cGU7CisgICAgcGt0LT5kYXRhW3BhbGV0dGVfc2l6ZSArIDJdID0gc2l6ZSAmIDB4RkY7CisgICAgcGt0LT5kYXRhW3BhbGV0dGVfc2l6ZSArIDNdID0gKHNpemUgPj4gOCkgJiAweEZGOworICAgIHJldCA9IGF2aW9fcmVhZChzLT5wYiwgcGt0LT5kYXRhICsgcGFsZXR0ZV9zaXplICsgNCwgc2l6ZSAtIDQpICsgNDsKKyAgICBpZiAocmV0IDwgc2l6ZSkgeworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHBrdC0+c2l6ZSA9IHJldCArIHBhbGV0dGVfc2l6ZTsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGF2cy0+c3RfdmlkZW8tPmluZGV4OworICAgIGlmIChzdWJfdHlwZSA9PSAwKQorICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF2c19yZWFkX2F1ZGlvX3BhY2tldChBVkZvcm1hdENvbnRleHQgKiBzLCBBVlBhY2tldCAqIHBrdCkKK3sKKyAgICBBdnNGb3JtYXQgKmF2cyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBzaXplOworCisgICAgc2l6ZSA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgcmV0ID0gZmZfdm9jX2dldF9wYWNrZXQocywgcGt0LCBhdnMtPnN0X2F1ZGlvLCBhdnMtPnJlbWFpbmluZ19hdWRpb19zaXplKTsKKyAgICBzaXplID0gYXZpb190ZWxsKHMtPnBiKSAtIHNpemU7CisgICAgYXZzLT5yZW1haW5pbmdfYXVkaW9fc2l6ZSAtPSBzaXplOworCisgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVJTykpCisgICAgICAgIHJldHVybiAwOyAgICAvKiB0aGlzIGluZGljYXRlIEVPUyAqLworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBhdnMtPnN0X2F1ZGlvLT5pbmRleDsKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKworICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGF2c19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKiBzLCBBVlBhY2tldCAqIHBrdCkKK3sKKyAgICBBdnNGb3JtYXQgKmF2cyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgc3ViX3R5cGUgPSAwLCBzaXplID0gMDsKKyAgICBBdnNCbG9ja1R5cGUgdHlwZSA9IEFWU19OT05FOworICAgIGludCBwYWxldHRlX3NpemUgPSAwOworICAgIHVpbnQ4X3QgcGFsZXR0ZVs0ICsgMyAqIDI1Nl07CisgICAgaW50IHJldDsKKworICAgIGlmIChhdnMtPnJlbWFpbmluZ19hdWRpb19zaXplID4gMCkKKyAgICAgICAgaWYgKGF2c19yZWFkX2F1ZGlvX3BhY2tldChzLCBwa3QpID4gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGF2cy0+cmVtYWluaW5nX2ZyYW1lX3NpemUgPD0gMCkgeworICAgICAgICAgICAgaWYgKCFhdmlvX3JsMTYocy0+cGIpKSAgICAvKiBmb3VuZCBFT0YgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgYXZzLT5yZW1haW5pbmdfZnJhbWVfc2l6ZSA9IGF2aW9fcmwxNihzLT5wYikgLSA0OworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGF2cy0+cmVtYWluaW5nX2ZyYW1lX3NpemUgPiAwKSB7CisgICAgICAgICAgICBzdWJfdHlwZSA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICAgICAgdHlwZSA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICAgICAgc2l6ZSA9IGF2aW9fcmwxNihzLT5wYik7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBhdnMtPnJlbWFpbmluZ19mcmFtZV9zaXplIC09IHNpemU7CisKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBBVlNfUEFMRVRURToKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSAtIDQgPiBzaXplb2YocGFsZXR0ZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHJldCA9IGF2aW9fcmVhZChzLT5wYiwgcGFsZXR0ZSwgc2l6ZSAtIDQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCBzaXplIC0gNCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICBwYWxldHRlX3NpemUgPSBzaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFWU19WSURFTzoKKyAgICAgICAgICAgICAgICBpZiAoIWF2cy0+c3RfdmlkZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZzLT5zdF92aWRlbyA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghYXZzLT5zdF92aWRlbykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGF2cy0+c3RfdmlkZW8tPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgICAgICAgICBhdnMtPnN0X3ZpZGVvLT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BVlM7CisgICAgICAgICAgICAgICAgICAgIGF2cy0+c3RfdmlkZW8tPmNvZGVjLT53aWR0aCA9IGF2cy0+d2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGF2cy0+c3RfdmlkZW8tPmNvZGVjLT5oZWlnaHQgPSBhdnMtPmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYXZzLT5zdF92aWRlby0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZT1hdnMtPmJpdHNfcGVyX3NhbXBsZTsKKyAgICAgICAgICAgICAgICAgICAgYXZzLT5zdF92aWRlby0+bmJfZnJhbWVzID0gYXZzLT5uYl9mcmFtZXM7CisjaWYgRkZfQVBJX1JfRlJBTUVfUkFURQorICAgICAgICAgICAgICAgICAgICBhdnMtPnN0X3ZpZGVvLT5yX2ZyYW1lX3JhdGUgPQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGF2cy0+c3RfdmlkZW8tPmF2Z19mcmFtZV9yYXRlID0gKEFWUmF0aW9uYWwpe2F2cy0+ZnBzLCAxfTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGF2c19yZWFkX3ZpZGVvX3BhY2tldChzLCBwa3QsIHR5cGUsIHN1Yl90eXBlLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSwgcGFsZXR0ZV9zaXplKTsKKworICAgICAgICAgICAgY2FzZSBBVlNfQVVESU86CisgICAgICAgICAgICAgICAgaWYgKCFhdnMtPnN0X2F1ZGlvKSB7CisgICAgICAgICAgICAgICAgICAgIGF2cy0+c3RfYXVkaW8gPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWF2cy0+c3RfYXVkaW8pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBhdnMtPnN0X2F1ZGlvLT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZzLT5yZW1haW5pbmdfYXVkaW9fc2l6ZSA9IHNpemUgLSA0OworICAgICAgICAgICAgICAgIHNpemUgPSBhdnNfcmVhZF9hdWRpb19wYWNrZXQocywgcGt0KTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIHNpemUgLSA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBhdnNfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKiBzKQoreworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2F2c19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhdnMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVlMiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQXZzRm9ybWF0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBhdnNfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gYXZzX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGF2c19yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBhdnNfcmVhZF9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYmV0aHNvZnR2aWQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9iZXRoc29mdHZpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYTQyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYmV0aHNvZnR2aWQuYwpAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIEJldGhzb2Z0IFZJRCBmb3JtYXQgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IE5pY2hvbGFzIFR1bmcKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIEJldGhlc2RhIFNvZnR3b3JrcyBWSUQgKC52aWQpIGZpbGUgZGVtdXhlcgorICogQGF1dGhvciBOaWNob2xhcyBUdW5nIFtudHVuZyAoYXQuIG50dW5nIGNvbV0gKDIwMDctMDMpCisgKiBAc2VlIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPUJldGhzb2Z0X1ZJRAorICogQHNlZSBodHRwOi8vd3d3LnN2YXRvcGx1ay5jb20vYW5kdXgvZG9jcy9kZnZpZC5odG1sCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9iZXRoc29mdHZpZGVvLmgiCisKKyNkZWZpbmUgQlZJRF9QQUxFVFRFX1NJWkUgMyAqIDI1NgorCisjZGVmaW5lIERFRkFVTFRfU0FNUExFX1JBVEUgMTExMTEKKwordHlwZWRlZiBzdHJ1Y3QgQlZJRF9EZW11eENvbnRleHQKK3sKKyAgICBpbnQgbmZyYW1lczsKKyAgICBpbnQgc2FtcGxlX3JhdGU7ICAgICAgICAvKio8IGF1ZGlvIHNhbXBsZSByYXRlICovCisgICAgaW50IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCB2aWRlbyB3aWR0aCAgICAgICAqLworICAgIGludCBoZWlnaHQ7ICAgICAgICAgICAgIC8qKjwgdmlkZW8gaGVpZ2h0ICAgICAgKi8KKyAgICAvKiogZGVsYXkgdmFsdWUgYmV0d2VlbiBmcmFtZXMsIGFkZGVkIHRvIGluZGl2aWR1YWwgZnJhbWUgZGVsYXkuCisgICAgICogY3VzdG9tIHVuaXRzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIG90aGVyIGN1c3RvbSB1bml0cyAofj0xNm1zIGFjY29yZGluZworICAgICAqIHRvIGZyZWUsIHVub2ZmaWNpYWwgZG9jdW1lbnRhdGlvbikgKi8KKyAgICBpbnQgYmV0aHNvZnRfZ2xvYmFsX2RlbGF5OworICAgIGludCB2aWRlb19pbmRleDsgICAgICAgIC8qKjwgdmlkZW8gc3RyZWFtIGluZGV4ICovCisgICAgaW50IGF1ZGlvX2luZGV4OyAgICAgICAgLyoqPCBhdWRpbyBzdHJlYW0gaW5kZXggKi8KKyAgICB1aW50OF90ICpwYWxldHRlOworCisgICAgaW50IGlzX2ZpbmlzaGVkOworCit9IEJWSURfRGVtdXhDb250ZXh0OworCitzdGF0aWMgaW50IHZpZF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICAvLyBsaXR0bGUtZW5kaWFuIFZJRCB0YWcsIGZpbGUgc3RhcnRzIHdpdGggIlZJRFwwIgorICAgIGlmIChBVl9STDMyKHAtPmJ1ZikgIT0gTUtUQUcoJ1YnLCAnSScsICdEJywgMCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHAtPmJ1Zls0XSAhPSAyKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLyA0OworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCitzdGF0aWMgaW50IHZpZF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQlZJRF9EZW11eENvbnRleHQgKnZpZCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKworICAgIC8qIGxvYWQgbWFpbiBoZWFkZXIuIENvbnRlbnRzOgorICAgICogICAgYnl0ZXM6ICdWJyAnSScgJ0QnCisgICAgKiAgICBpbnQxNnM6IGFsd2F5c181MTIsIG5mcmFtZXMsIHdpZHRoLCBoZWlnaHQsIGRlbGF5LCBhbHdheXNfMTQKKyAgICAqLworICAgIGF2aW9fc2tpcChwYiwgNSk7CisgICAgdmlkLT5uZnJhbWVzID0gYXZpb19ybDE2KHBiKTsKKyAgICB2aWQtPndpZHRoICAgPSBhdmlvX3JsMTYocGIpOworICAgIHZpZC0+aGVpZ2h0ICA9IGF2aW9fcmwxNihwYik7CisgICAgdmlkLT5iZXRoc29mdF9nbG9iYWxfZGVsYXkgPSBhdmlvX3JsMTYocGIpOworICAgIGF2aW9fcmwxNihwYik7CisKKyAgICAvLyB3YWl0IHVudGlsIHRoZSBmaXJzdCBwYWNrZXQgdG8gY3JlYXRlIGVhY2ggc3RyZWFtCisgICAgdmlkLT52aWRlb19pbmRleCA9IC0xOworICAgIHZpZC0+YXVkaW9faW5kZXggPSAtMTsKKyAgICB2aWQtPnNhbXBsZV9yYXRlID0gREVGQVVMVF9TQU1QTEVfUkFURTsKKyAgICBzLT5jdHhfZmxhZ3MgfD0gQVZGTVRDVFhfTk9IRUFERVI7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBCVUZGRVJfUEFERElOR19TSVpFIDEwMDAKK3N0YXRpYyBpbnQgcmVhZF9mcmFtZShCVklEX0RlbXV4Q29udGV4dCAqdmlkLCBBVklPQ29udGV4dCAqcGIsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBibG9ja190eXBlLCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgdWludDhfdCAqIHZpZGJ1Zl9zdGFydCA9IE5VTEw7CisgICAgaW50IHZpZGJ1Zl9uYnl0ZXMgPSAwOworICAgIGludCBjb2RlOworICAgIGludCBieXRlc19jb3BpZWQgPSAwOworICAgIGludCBwb3NpdGlvbiwgZHVyYXRpb24sIG5waXhlbHM7CisgICAgdW5zaWduZWQgaW50IHZpZGJ1Zl9jYXBhY2l0eTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBpZiAodmlkLT52aWRlb19pbmRleCA8IDApIHsKKyAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgdmlkLT52aWRlb19pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgaWYgKHZpZC0+YXVkaW9faW5kZXggPCAwKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIlVzaW5nIGRlZmF1bHQgdmlkZW8gdGltZSBiYXNlIHNpbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGF2aW5nIG5vIGF1ZGlvIHBhY2tldCBiZWZvcmUgdGhlIGZpcnN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8gcGFja2V0Iik7CisgICAgICAgIH0KKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDE4NSwgdmlkLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQkVUSFNPRlRWSUQ7CisgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IHZpZC0+d2lkdGg7CisgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IHZpZC0+aGVpZ2h0OworICAgIH0KKyAgICBzdCAgICAgID0gcy0+c3RyZWFtc1t2aWQtPnZpZGVvX2luZGV4XTsKKyAgICBucGl4ZWxzID0gc3QtPmNvZGVjLT53aWR0aCAqIHN0LT5jb2RlYy0+aGVpZ2h0OworCisgICAgdmlkYnVmX3N0YXJ0ID0gYXZfbWFsbG9jKHZpZGJ1Zl9jYXBhY2l0eSA9IEJVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmKCF2aWRidWZfc3RhcnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvLyBzYXZlIHRoZSBmaWxlIHBvc2l0aW9uIGZvciB0aGUgcGFja2V0LCBpbmNsdWRlIGJsb2NrIHR5cGUKKyAgICBwb3NpdGlvbiA9IGF2aW9fdGVsbChwYikgLSAxOworCisgICAgdmlkYnVmX3N0YXJ0W3ZpZGJ1Zl9uYnl0ZXMrK10gPSBibG9ja190eXBlOworCisgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHBhY2tldCBkdXJhdGlvbgorICAgIGR1cmF0aW9uID0gdmlkLT5iZXRoc29mdF9nbG9iYWxfZGVsYXkgKyBhdmlvX3JsMTYocGIpOworCisgICAgLy8gc2V0IHRoZSB5IG9mZnNldCBpZiBpdCBleGlzdHMgKGRlY29kZXIgaGVhZGVyIGRhdGEgc2hvdWxkIGJlIGluIGRhdGEgc2VjdGlvbikKKyAgICBpZihibG9ja190eXBlID09IFZJREVPX1lPRkZfUF9GUkFNRSl7CisgICAgICAgIGlmIChhdmlvX3JlYWQocGIsICZ2aWRidWZfc3RhcnRbdmlkYnVmX25ieXRlc10sIDIpICE9IDIpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICB2aWRidWZfbmJ5dGVzICs9IDI7CisgICAgfQorCisgICAgZG97CisgICAgICAgIHZpZGJ1Zl9zdGFydCA9IGF2X2Zhc3RfcmVhbGxvYyh2aWRidWZfc3RhcnQsICZ2aWRidWZfY2FwYWNpdHksIHZpZGJ1Zl9uYnl0ZXMgKyBCVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgaWYoIXZpZGJ1Zl9zdGFydCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgY29kZSA9IGF2aW9fcjgocGIpOworICAgICAgICB2aWRidWZfc3RhcnRbdmlkYnVmX25ieXRlcysrXSA9IGNvZGU7CisKKyAgICAgICAgaWYoY29kZSA+PSAweDgwKXsgLy8gcmxlIHNlcXVlbmNlCisgICAgICAgICAgICBpZihibG9ja190eXBlID09IFZJREVPX0lfRlJBTUUpCisgICAgICAgICAgICAgICAgdmlkYnVmX3N0YXJ0W3ZpZGJ1Zl9uYnl0ZXMrK10gPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgfSBlbHNlIGlmKGNvZGUpeyAvLyBwbGFpbiBzZXF1ZW5jZQorICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgJnZpZGJ1Zl9zdGFydFt2aWRidWZfbmJ5dGVzXSwgY29kZSkgIT0gY29kZSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRidWZfbmJ5dGVzICs9IGNvZGU7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXNfY29waWVkICs9IGNvZGUgJiAweDdGOworICAgICAgICBpZihieXRlc19jb3BpZWQgPT0gbnBpeGVscyl7IC8vIHNvbWV0aW1lcyBubyBzdG9wIGNoYXJhY3RlciBpcyBnaXZlbiwgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGJ5dGVzIGNvcGllZAorICAgICAgICAgICAgLy8gbWF5IGNvbnRhaW4gYSAwIGJ5dGUgZXZlbiBpZiByZWFkIGFsbCBwaXhlbHMKKyAgICAgICAgICAgIGlmKGF2aW9fcjgocGIpKQorICAgICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgLTEsIFNFRUtfQ1VSKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlc19jb3BpZWQgPiBucGl4ZWxzKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfSB3aGlsZShjb2RlKTsKKworICAgIC8vIGNvcHkgZGF0YSBpbnRvIHBhY2tldAorICAgIGlmICgocmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIHZpZGJ1Zl9uYnl0ZXMpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBtZW1jcHkocGt0LT5kYXRhLCB2aWRidWZfc3RhcnQsIHZpZGJ1Zl9uYnl0ZXMpOworCisgICAgcGt0LT5wb3MgPSBwb3NpdGlvbjsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHZpZC0+dmlkZW9faW5kZXg7CisgICAgcGt0LT5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIGlmIChibG9ja190eXBlID09IFZJREVPX0lfRlJBTUUpCisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgLyogaWYgdGhlcmUgaXMgYSBuZXcgcGFsZXR0ZSBhdmFpbGFibGUsIGFkZCBpdCB0byBwYWNrZXQgc2lkZSBkYXRhICovCisgICAgaWYgKHZpZC0+cGFsZXR0ZSkgeworICAgICAgICB1aW50OF90ICpwZGF0YSA9IGF2X3BhY2tldF9uZXdfc2lkZV9kYXRhKHBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVklEX1BBTEVUVEVfU0laRSk7CisgICAgICAgIGlmICghcGRhdGEpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgcGFsZXR0ZSBzaWRlIGRhdGFcbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIG1lbWNweShwZGF0YSwgdmlkLT5wYWxldHRlLCBCVklEX1BBTEVUVEVfU0laRSk7CisKKyAgICAgICAgYXZfZnJlZXAoJnZpZC0+cGFsZXR0ZSk7CisgICAgfQorCisgICAgdmlkLT5uZnJhbWVzLS07ICAvLyB1c2VkIHRvIGNoZWNrIGlmIGFsbCB0aGUgZnJhbWVzIHdlcmUgcmVhZAorZmFpbDoKKyAgICBhdl9mcmVlKHZpZGJ1Zl9zdGFydCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aWRfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBCVklEX0RlbXV4Q29udGV4dCAqdmlkID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVuc2lnbmVkIGNoYXIgYmxvY2tfdHlwZTsKKyAgICBpbnQgYXVkaW9fbGVuZ3RoOworICAgIGludCByZXRfdmFsdWU7CisKKyAgICBpZih2aWQtPmlzX2ZpbmlzaGVkIHx8IGF2aW9fZmVvZihwYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGJsb2NrX3R5cGUgPSBhdmlvX3I4KHBiKTsKKyAgICBzd2l0Y2goYmxvY2tfdHlwZSl7CisgICAgICAgIGNhc2UgUEFMRVRURV9CTE9DSzoKKyAgICAgICAgICAgIGlmICh2aWQtPnBhbGV0dGUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJkaXNjYXJkaW5nIHVudXNlZCBwYWxldHRlXG4iKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmdmlkLT5wYWxldHRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZC0+cGFsZXR0ZSA9IGF2X21hbGxvYyhCVklEX1BBTEVUVEVfU0laRSk7CisgICAgICAgICAgICBpZiAoIXZpZC0+cGFsZXR0ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgdmlkLT5wYWxldHRlLCBCVklEX1BBTEVUVEVfU0laRSkgIT0gQlZJRF9QQUxFVFRFX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmdmlkLT5wYWxldHRlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZpZF9yZWFkX3BhY2tldChzLCBwa3QpOworCisgICAgICAgIGNhc2UgRklSU1RfQVVESU9fQkxPQ0s6CisgICAgICAgICAgICBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgLy8gc291bmRibGFzdGVyIERBQyB1c2VkIGZvciBzYW1wbGUgcmF0ZSwgYXMgb24gc3BlY2lmaWNhdGlvbiBwYWdlIChsaW5rIGFib3ZlKQorICAgICAgICAgICAgdmlkLT5zYW1wbGVfcmF0ZSA9IDEwMDAwMDAgLyAoMjU2IC0gYXZpb19yOChwYikpOworICAgICAgICBjYXNlIEFVRElPX0JMT0NLOgorICAgICAgICAgICAgaWYgKHZpZC0+YXVkaW9faW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIHZpZC0+YXVkaW9faW5kZXggICAgICAgICAgICAgICAgID0gc3QtPmluZGV4OworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ICAgICAgICA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgICAgICAgICA9IHZpZC0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSAgICAgICAgICAgICAgPSA4ICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBzdC0+c3RhcnRfdGltZSAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHZpZC0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9fbGVuZ3RoID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgICAgIGlmICgocmV0X3ZhbHVlID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBhdWRpb19sZW5ndGgpKSAhPSBhdWRpb19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbHVlIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWx1ZTsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW5jb21wbGV0ZSBhdWRpbyBibG9ja1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gdmlkLT5hdWRpb19pbmRleDsKKyAgICAgICAgICAgIHBrdC0+ZHVyYXRpb24gICAgID0gYXVkaW9fbGVuZ3RoOworICAgICAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFZJREVPX1BfRlJBTUU6CisgICAgICAgIGNhc2UgVklERU9fWU9GRl9QX0ZSQU1FOgorICAgICAgICBjYXNlIFZJREVPX0lfRlJBTUU6CisgICAgICAgICAgICByZXR1cm4gcmVhZF9mcmFtZSh2aWQsIHBiLCBwa3QsIGJsb2NrX3R5cGUsIHMpOworCisgICAgICAgIGNhc2UgRU9GX0JMT0NLOgorICAgICAgICAgICAgaWYodmlkLT5uZnJhbWVzICE9IDApCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAicmVhY2hlZCB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgYnV0IG5vdCBhbGwgZnJhbWVzIHJlYWQuXG4iKTsKKyAgICAgICAgICAgIHZpZC0+aXNfZmluaXNoZWQgPSAxOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIGJsb2NrIChjaGFyYWN0ZXIgPSAlYywgZGVjaW1hbCA9ICVkLCBoZXggPSAleCkhISFcbiIsCisgICAgICAgICAgICAgICAgICAgYmxvY2tfdHlwZSwgYmxvY2tfdHlwZSwgYmxvY2tfdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdmlkX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEJWSURfRGVtdXhDb250ZXh0ICp2aWQgPSBzLT5wcml2X2RhdGE7CisgICAgYXZfZnJlZXAoJnZpZC0+cGFsZXR0ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYmV0aHNvZnR2aWRfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYmV0aHNvZnR2aWQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCZXRoZXNkYSBTb2Z0d29ya3MgVklEIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEJWSURfRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB2aWRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gdmlkX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHZpZF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSB2aWRfcmVhZF9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYmZpLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3ZjQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9iZmkuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIEJydXRlIEZvcmNlICYgSWdub3JhbmNlIChCRkkpIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTaXNpciBLb3BwYWthCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEBicmllZiBCcnV0ZSBGb3JjZSAmIElnbm9yYW5jZSAoLmJmaSkgZmlsZSBkZW11eGVyCisgKiBAYXV0aG9yIFNpc2lyIEtvcHBha2EgKCBzaXNpci5rb3BwYWthIGF0IGdtYWlsIGRvdCBjb20gKQorICogQHNlZSBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1CRkkKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQkZJQ29udGV4dCB7CisgICAgaW50IG5mcmFtZXM7CisgICAgaW50IGF1ZGlvX2ZyYW1lOworICAgIGludCB2aWRlb19mcmFtZTsKKyAgICBpbnQgdmlkZW9fc2l6ZTsKKyAgICBpbnQgYXZmbGFnOworfSBCRklDb250ZXh0OworCitzdGF0aWMgaW50IGJmaV9wcm9iZShBVlByb2JlRGF0YSAqIHApCit7CisgICAgLyogQ2hlY2sgZmlsZSBoZWFkZXIgKi8KKyAgICBpZiAoQVZfUkwzMihwLT5idWYpID09IE1LVEFHKCdCJywgJ0YnLCAnJicsICdJJykpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJmaV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKiBzKQoreworICAgIEJGSUNvbnRleHQgKmJmaSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqdnN0cmVhbTsKKyAgICBBVlN0cmVhbSAqYXN0cmVhbTsKKyAgICBpbnQgZnBzLCBjaHVua19oZWFkZXI7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSB2aWRlbyBjb2RlYy4uLiAqLworICAgIHZzdHJlYW0gPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghdnN0cmVhbSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGF1ZGlvIGNvZGVjLi4uICovCisgICAgYXN0cmVhbSA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFhc3RyZWFtKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogU2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzLiAqLworICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgY2h1bmtfaGVhZGVyICAgICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgYmZpLT5uZnJhbWVzICAgICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgYXZpb19ybDMyKHBiKTsKKyAgICBhdmlvX3JsMzIocGIpOworICAgIGF2aW9fcmwzMihwYik7CisgICAgZnBzICAgICAgICAgICAgICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgYXZpb19za2lwKHBiLCAxMik7CisgICAgdnN0cmVhbS0+Y29kZWMtPndpZHRoICA9IGF2aW9fcmwzMihwYik7CisgICAgdnN0cmVhbS0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmwzMihwYik7CisKKyAgICAvKkxvYWQgdGhlIHBhbGV0dGUgdG8gZXh0cmFkYXRhICovCisgICAgYXZpb19za2lwKHBiLCA4KTsKKyAgICB2c3RyZWFtLT5jb2RlYy0+ZXh0cmFkYXRhICAgICAgPSBhdl9tYWxsb2MoNzY4KTsKKyAgICBpZiAoIXZzdHJlYW0tPmNvZGVjLT5leHRyYWRhdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgdnN0cmVhbS0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gNzY4OworICAgIGF2aW9fcmVhZChwYiwgdnN0cmVhbS0+Y29kZWMtPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgIHZzdHJlYW0tPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisKKyAgICBhc3RyZWFtLT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocGIpOworCisgICAgLyogU2V0IHVwIHRoZSB2aWRlbyBjb2RlYy4uLiAqLworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0cmVhbSwgMzIsIDEsIGZwcyk7CisgICAgdnN0cmVhbS0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdnN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9CRkk7CisgICAgdnN0cmVhbS0+Y29kZWMtPnBpeF9mbXQgICAgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgdnN0cmVhbS0+bmJfZnJhbWVzICAgICAgICAgPQorICAgIHZzdHJlYW0tPmR1cmF0aW9uICAgICAgICAgID0gYmZpLT5uZnJhbWVzOworCisgICAgLyogU2V0IHVwIHRoZSBhdWRpbyBjb2RlYyBub3cuLi4gKi8KKyAgICBhc3RyZWFtLT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIGFzdHJlYW0tPmNvZGVjLT5jb2RlY19pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgYXN0cmVhbS0+Y29kZWMtPmNoYW5uZWxzICAgICAgICA9IDE7CisgICAgYXN0cmVhbS0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ICA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIGFzdHJlYW0tPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA4OworICAgIGFzdHJlYW0tPmNvZGVjLT5iaXRfcmF0ZSAgICAgICAgPQorICAgICAgICBhc3RyZWFtLT5jb2RlYy0+c2FtcGxlX3JhdGUgKiBhc3RyZWFtLT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgIGF2aW9fc2VlayhwYiwgY2h1bmtfaGVhZGVyIC0gMywgU0VFS19TRVQpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0cmVhbSwgNjQsIDEsIGFzdHJlYW0tPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBiZmlfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICogcywgQVZQYWNrZXQgKiBwa3QpCit7CisgICAgQkZJQ29udGV4dCAqYmZpID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCByZXQsIGF1ZGlvX29mZnNldCwgdmlkZW9fb2Zmc2V0LCBjaHVua19zaXplLCBhdWRpb19zaXplID0gMDsKKyAgICBpZiAoYmZpLT5uZnJhbWVzID09IDAgfHwgYXZpb19mZW9mKHBiKSkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQorCisgICAgLyogSWYgYWxsIHByZXZpb3VzIGNodW5rcyB3ZXJlIGNvbXBsZXRlbHkgcmVhZCwgdGhlbiBmaW5kIGEgbmV3IG9uZS4uLiAqLworICAgIGlmICghYmZpLT5hdmZsYWcpIHsKKyAgICAgICAgdWludDMyX3Qgc3RhdGUgPSAwOworICAgICAgICB3aGlsZShzdGF0ZSAhPSBNS1RBRygnUycsJ0EnLCdWJywnSScpKXsKKyAgICAgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBzdGF0ZSA9IDI1NipzdGF0ZSArIGF2aW9fcjgocGIpOworICAgICAgICB9CisgICAgICAgIC8qIE5vdyB0aGF0IHRoZSBjaHVuaydzIGxvY2F0aW9uIGlzIGNvbmZpcm1lZCwgd2UgcHJvY2VlZC4uLiAqLworICAgICAgICBjaHVua19zaXplICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBhdmlvX3JsMzIocGIpOworICAgICAgICBhdWRpb19vZmZzZXQgICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBhdmlvX3JsMzIocGIpOworICAgICAgICB2aWRlb19vZmZzZXQgICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBhdWRpb19zaXplICAgICAgPSB2aWRlb19vZmZzZXQgLSBhdWRpb19vZmZzZXQ7CisgICAgICAgIGJmaS0+dmlkZW9fc2l6ZSA9IGNodW5rX3NpemUgLSB2aWRlb19vZmZzZXQ7CisgICAgICAgIGlmIChhdWRpb19zaXplIDwgMCB8fCBiZmktPnZpZGVvX3NpemUgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBhdWRpby92aWRlbyBvZmZzZXRzIG9yIGNodW5rIHNpemVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICAvL1Rvc3NpbmcgYW4gYXVkaW8gcGFja2V0IGF0IHRoZSBhdWRpbyBkZWNvZGVyLgorICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGF1ZGlvX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcGt0LT5wdHMgICAgICAgICAgPSBiZmktPmF1ZGlvX2ZyYW1lOworICAgICAgICBiZmktPmF1ZGlvX2ZyYW1lICs9IHJldDsKKyAgICB9IGVsc2UgaWYgKGJmaS0+dmlkZW9fc2l6ZSA+IDApIHsKKworICAgICAgICAvL1Rvc3NpbmcgYSB2aWRlbyBwYWNrZXQgYXQgdGhlIHZpZGVvIGRlY29kZXIuCisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgYmZpLT52aWRlb19zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHBrdC0+cHRzICAgICAgICAgID0gYmZpLT52aWRlb19mcmFtZTsKKyAgICAgICAgYmZpLT52aWRlb19mcmFtZSArPSByZXQgLyBiZmktPnZpZGVvX3NpemU7CisKKyAgICAgICAgLyogT25lIGxlc3MgZnJhbWUgdG8gcmVhZC4gQSBjdXJzb3J5IGRlY3JlbWVudC4gKi8KKyAgICAgICAgYmZpLT5uZnJhbWVzLS07CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRW1wdHkgdmlkZW8gcGFja2V0ICovCisgICAgICAgIHJldCA9IEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKKyAgICBiZmktPmF2ZmxhZyAgICAgICA9ICFiZmktPmF2ZmxhZzsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGJmaS0+YXZmbGFnOworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYmZpX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImJmaSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJydXRlIEZvcmNlICYgSWdub3JhbmNlIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEJGSUNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGJmaV9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBiZmlfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gYmZpX3JlYWRfcGFja2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9iaW5rLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYmluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NWM4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYmluay5jCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogQmluayBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCBQZXRlciBSb3NzIChwcm9zc0B4dmlkLm9yZykKKyAqIENvcHlyaWdodCAoYykgMjAwOSBEYW5pZWwgVmVya2FtcCAoZGFuaWVsQGRydi5udSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQmluayBkZW11eGVyCisgKgorICogVGVjaG5pY2FsIGRldGFpbHMgaGVyZToKKyAqICBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1CaW5rX0NvbnRhaW5lcgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZW51bSBCaW5rQXVkRmxhZ3MgeworICAgIEJJTktfQVVEXzE2QklUUyA9IDB4NDAwMCwgLy8vPCBwcmVmZXIgMTYtYml0IG91dHB1dAorICAgIEJJTktfQVVEX1NURVJFTyA9IDB4MjAwMCwKKyAgICBCSU5LX0FVRF9VU0VEQ1QgPSAweDEwMDAsCit9OworCisjZGVmaW5lIEJJTktfRVhUUkFEQVRBX1NJWkUgICAgIDEKKyNkZWZpbmUgQklOS19NQVhfQVVESU9fVFJBQ0tTICAgMjU2CisjZGVmaW5lIEJJTktfTUFYX1dJRFRIICAgICAgICAgIDc2ODAKKyNkZWZpbmUgQklOS19NQVhfSEVJR0hUICAgICAgICAgNDgwMAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgZmlsZV9zaXplOworCisgICAgdWludDMyX3QgbnVtX2F1ZGlvX3RyYWNrczsKKyAgICBpbnQgY3VycmVudF90cmFjazsgICAgICAvLy88IGF1ZGlvIHRyYWNrIHRvIHJldHVybiBpbiBuZXh0IHBhY2tldAorICAgIGludDY0X3QgdmlkZW9fcHRzOworICAgIGludDY0X3QgYXVkaW9fcHRzW0JJTktfTUFYX0FVRElPX1RSQUNLU107CisKKyAgICB1aW50MzJfdCByZW1haW5fcGFja2V0X3NpemU7Cit9IEJpbmtEZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqYiA9IHAtPmJ1ZjsKKworICAgIGlmICgoKGJbMF0gPT0gJ0InICYmIGJbMV0gPT0gJ0knICYmIGJbMl0gPT0gJ0snICYmCisgICAgICAgICAoYlszXSA9PSAnYicgfHwgYlszXSA9PSAnZicgfHwgYlszXSA9PSAnZycgfHwgYlszXSA9PSAnaCcgfHwgYlszXSA9PSAnaScpKSB8fAorICAgICAgICAgKGJbMF0gPT0gJ0snICYmIGJbMV0gPT0gJ0InICYmIGJbMl0gPT0gJzInICYmIC8qIEJpbmsgMiAqLworICAgICAgICAgKGJbM10gPT0gJ2EnIHx8IGJbM10gPT0gJ2QnIHx8IGJbM10gPT0gJ2YnIHx8IGJbM10gPT0gJ2cnKSkpICYmCisgICAgICAgIEFWX1JMMzIoYis4KSA+IDAgJiYgIC8vIG51bV9mcmFtZXMKKyAgICAgICAgQVZfUkwzMihiKzIwKSA+IDAgJiYgQVZfUkwzMihiKzIwKSA8PSBCSU5LX01BWF9XSURUSCAmJgorICAgICAgICBBVl9STDMyKGIrMjQpID4gMCAmJiBBVl9STDMyKGIrMjQpIDw9IEJJTktfTUFYX0hFSUdIVCAmJgorICAgICAgICBBVl9STDMyKGIrMjgpID4gMCAmJiBBVl9STDMyKGIrMzIpID4gMCkgIC8vIGZwcyBudW0sZGVuCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQmlua0RlbXV4Q29udGV4dCAqYmluayA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1aW50MzJfdCBmcHNfbnVtLCBmcHNfZGVuOworICAgIEFWU3RyZWFtICp2c3QsICphc3Q7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgdWludDMyX3QgcG9zLCBuZXh0X3BvczsKKyAgICB1aW50MTZfdCBmbGFnczsKKyAgICBpbnQga2V5ZnJhbWU7CisgICAgaW50IHJldDsKKworICAgIHZzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCF2c3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcgPSBhdmlvX3JsMzIocGIpOworCisgICAgYmluay0+ZmlsZV9zaXplID0gYXZpb19ybDMyKHBiKSArIDg7CisgICAgdnN0LT5kdXJhdGlvbiAgID0gYXZpb19ybDMyKHBiKTsKKworICAgIGlmICh2c3QtPmR1cmF0aW9uID4gMTAwMDAwMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBoZWFkZXI6IG1vcmUgdGhhbiAxMDAwMDAwIGZyYW1lc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgaWYgKGF2aW9fcmwzMihwYikgPiBiaW5rLT5maWxlX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJpbnZhbGlkIGhlYWRlcjogbGFyZ2VzdCBmcmFtZSBzaXplIGdyZWF0ZXIgdGhhbiBmaWxlIHNpemVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGF2aW9fc2tpcChwYiwgNCk7CisKKyAgICB2c3QtPmNvZGVjLT53aWR0aCAgPSBhdmlvX3JsMzIocGIpOworICAgIHZzdC0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmwzMihwYik7CisKKyAgICBmcHNfbnVtID0gYXZpb19ybDMyKHBiKTsKKyAgICBmcHNfZGVuID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZiAoZnBzX251bSA9PSAwIHx8IGZwc19kZW4gPT0gMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImludmFsaWQgaGVhZGVyOiBpbnZhbGlkIGZwcyAoJSJQUkl1MzIiLyUiUFJJdTMyIilcbiIsCisgICAgICAgICAgICAgICBmcHNfbnVtLCBmcHNfZGVuKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyh2c3QsIDY0LCBmcHNfZGVuLCBmcHNfbnVtKTsKKyAgICB2c3QtPmF2Z19mcmFtZV9yYXRlID0gYXZfaW52X3EodnN0LT50aW1lX2Jhc2UpOworCisgICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQklOS1ZJREVPOworCisgICAgaWYgKCh2c3QtPmNvZGVjLT5jb2RlY190YWcgJiAweEZGRkZGRikgPT0gTUtUQUcoJ0snLCAnQicsICcyJywgMCkpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiQmluayAyIHZpZGVvIGlzIG5vdCBpbXBsZW1lbnRlZFxuIik7CisgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTk9ORTsKKyAgICB9CisKKyAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YSh2c3QtPmNvZGVjLCBwYiwgNCkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYmluay0+bnVtX2F1ZGlvX3RyYWNrcyA9IGF2aW9fcmwzMihwYik7CisKKyAgICBpZiAoYmluay0+bnVtX2F1ZGlvX3RyYWNrcyA+IEJJTktfTUFYX0FVRElPX1RSQUNLUykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImludmFsaWQgaGVhZGVyOiBtb3JlIHRoYW4gIkFWX1NUUklOR0lGWShCSU5LX01BWF9BVURJT19UUkFDS1MpIiBhdWRpbyB0cmFja3MgKCUiUFJJdTMyIilcbiIsCisgICAgICAgICAgICAgICBiaW5rLT5udW1fYXVkaW9fdHJhY2tzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBpZiAoYmluay0+bnVtX2F1ZGlvX3RyYWNrcykgeworICAgICAgICBhdmlvX3NraXAocGIsIDQgKiBiaW5rLT5udW1fYXVkaW9fdHJhY2tzKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmluay0+bnVtX2F1ZGlvX3RyYWNrczsgaSsrKSB7CisgICAgICAgICAgICBhc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFhc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdGFnICAgPSAwOworICAgICAgICAgICAgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDY0LCAxLCBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBmbGFncyA9IGF2aW9fcmwxNihwYik7CisgICAgICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZsYWdzICYgQklOS19BVURfVVNFRENUID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSURfQklOS0FVRElPX0RDVCA6IEFWX0NPREVDX0lEX0JJTktBVURJT19SREZUOworICAgICAgICAgICAgaWYgKGZsYWdzICYgQklOS19BVURfU1RFUkVPKSB7CisgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKGFzdC0+Y29kZWMsIDQpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBBVl9XTDMyKGFzdC0+Y29kZWMtPmV4dHJhZGF0YSwgdnN0LT5jb2RlYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiaW5rLT5udW1fYXVkaW9fdHJhY2tzOyBpKyspCisgICAgICAgICAgICBzLT5zdHJlYW1zW2kgKyAxXS0+aWQgPSBhdmlvX3JsMzIocGIpOworICAgIH0KKworICAgIC8qIGZyYW1lIGluZGV4IHRhYmxlICovCisgICAgbmV4dF9wb3MgPSBhdmlvX3JsMzIocGIpOworICAgIGZvciAoaSA9IDA7IGkgPCB2c3QtPmR1cmF0aW9uOyBpKyspIHsKKyAgICAgICAgcG9zID0gbmV4dF9wb3M7CisgICAgICAgIGlmIChpID09IHZzdC0+ZHVyYXRpb24gLSAxKSB7CisgICAgICAgICAgICBuZXh0X3BvcyA9IGJpbmstPmZpbGVfc2l6ZTsKKyAgICAgICAgICAgIGtleWZyYW1lID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5leHRfcG9zID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGtleWZyYW1lID0gcG9zICYgMTsKKyAgICAgICAgfQorICAgICAgICBwb3MgJj0gfjE7CisgICAgICAgIG5leHRfcG9zICY9IH4xOworCisgICAgICAgIGlmIChuZXh0X3BvcyA8PSBwb3MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGZyYW1lIGluZGV4IHRhYmxlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBhdl9hZGRfaW5kZXhfZW50cnkodnN0LCBwb3MsIGksIG5leHRfcG9zIC0gcG9zLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlmcmFtZSA/IEFWSU5ERVhfS0VZRlJBTUUgOiAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBhdmlvX3NlZWsocGIsIHZzdC0+aW5kZXhfZW50cmllc1swXS5wb3MsIFNFRUtfU0VUKTsKKworICAgIGJpbmstPmN1cnJlbnRfdHJhY2sgPSAtMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQmlua0RlbXV4Q29udGV4dCAqYmluayA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGJpbmstPmN1cnJlbnRfdHJhY2sgPCAwKSB7CisgICAgICAgIGludCBpbmRleF9lbnRyeTsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1swXTsgLy8gc3RyZWFtIDAgaXMgdmlkZW8gc3RyZWFtIHdpdGggaW5kZXgKKworICAgICAgICBpZiAoYmluay0+dmlkZW9fcHRzID49IHN0LT5kdXJhdGlvbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgICAgICBpbmRleF9lbnRyeSA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QsIGJpbmstPnZpZGVvX3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU0VFS19GTEFHX0FOWSk7CisgICAgICAgIGlmIChpbmRleF9lbnRyeSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIGluZGV4IGVudHJ5IGZvciBmcmFtZSAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgYmluay0+dmlkZW9fcHRzKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKworICAgICAgICBiaW5rLT5yZW1haW5fcGFja2V0X3NpemUgPSBzdC0+aW5kZXhfZW50cmllc1tpbmRleF9lbnRyeV0uc2l6ZTsKKyAgICAgICAgYmluay0+Y3VycmVudF90cmFjayA9IDA7CisgICAgfQorCisgICAgd2hpbGUgKGJpbmstPmN1cnJlbnRfdHJhY2sgPCBiaW5rLT5udW1fYXVkaW9fdHJhY2tzKSB7CisgICAgICAgIHVpbnQzMl90IGF1ZGlvX3NpemUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAoYXVkaW9fc2l6ZSA+IGJpbmstPnJlbWFpbl9wYWNrZXRfc2l6ZSAtIDQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImZyYW1lICUiUFJJZDY0IjogYXVkaW8gc2l6ZSBpbiBoZWFkZXIgKCUiUFJJdTMyIikgPiBzaXplIG9mIHBhY2tldCBsZWZ0ICglIlBSSXUzMiIpXG4iLAorICAgICAgICAgICAgICAgICAgIGJpbmstPnZpZGVvX3B0cywgYXVkaW9fc2l6ZSwgYmluay0+cmVtYWluX3BhY2tldF9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKyAgICAgICAgYmluay0+cmVtYWluX3BhY2tldF9zaXplIC09IDQgKyBhdWRpb19zaXplOworICAgICAgICBiaW5rLT5jdXJyZW50X3RyYWNrKys7CisgICAgICAgIGlmIChhdWRpb19zaXplID49IDQpIHsKKyAgICAgICAgICAgIC8qIGdldCBvbmUgYXVkaW8gcGFja2V0IHBlciB0cmFjayAqLworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGF1ZGlvX3NpemUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gYmluay0+Y3VycmVudF90cmFjazsKKyAgICAgICAgICAgIHBrdC0+cHRzID0gYmluay0+YXVkaW9fcHRzW2JpbmstPmN1cnJlbnRfdHJhY2sgLSAxXTsKKworICAgICAgICAgICAgLyogRWFjaCBhdWRpbyBwYWNrZXQgcmVwb3J0cyB0aGUgbnVtYmVyIG9mIGRlY29tcHJlc3NlZCBzYW1wbGVzCisgICAgICAgICAgICAgICAoaW4gYnl0ZXMpLiBXZSB1c2UgdGhpcyB2YWx1ZSB0byBjYWxjdWF0ZSB0aGUgYXVkaW8gUFRTICovCisgICAgICAgICAgICBpZiAocGt0LT5zaXplID49IDQpCisgICAgICAgICAgICAgICAgYmluay0+YXVkaW9fcHRzW2JpbmstPmN1cnJlbnRfdHJhY2sgLTFdICs9CisgICAgICAgICAgICAgICAgICAgIEFWX1JMMzIocGt0LT5kYXRhKSAvICgyICogcy0+c3RyZWFtc1tiaW5rLT5jdXJyZW50X3RyYWNrXS0+Y29kZWMtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBhdWRpb19zaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCB2aWRlbyBwYWNrZXQgKi8KKyAgICBpZiAoKHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgYmluay0+cmVtYWluX3BhY2tldF9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICBwa3QtPnB0cyA9IGJpbmstPnZpZGVvX3B0cysrOworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgLyogLTEgaW5zdHJ1Y3RzIHRoZSBuZXh0IGNhbGwgdG8gcmVhZF9wYWNrZXQoKSB0byByZWFkIHRoZSBuZXh0IGZyYW1lICovCisgICAgYmluay0+Y3VycmVudF90cmFjayA9IC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBCaW5rRGVtdXhDb250ZXh0ICpiaW5rID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICp2c3QgPSBzLT5zdHJlYW1zWzBdOworCisgICAgaWYgKCFzLT5wYi0+c2Vla2FibGUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIHNlZWsgdG8gdGhlIGZpcnN0IGZyYW1lICovCisgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgdnN0LT5pbmRleF9lbnRyaWVzWzBdLnBvcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYmluay0+dmlkZW9fcHRzID0gMDsKKyAgICBtZW1zZXQoYmluay0+YXVkaW9fcHRzLCAwLCBzaXplb2YoYmluay0+YXVkaW9fcHRzKSk7CisgICAgYmluay0+Y3VycmVudF90cmFjayA9IC0xOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2JpbmtfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYmluayIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJpbmsiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQmlua0RlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlayAgICAgID0gcmVhZF9zZWVrLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX1NIT1dfSURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9iaW50ZXh0LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYmludGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxN2VhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYmludGV4dC5jCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogQmluYXJ5IHRleHQgZGVtdXhlcgorICogZVh0ZW5kZWQgQklOYXJ5IHRleHQgKFhCSU4pIGRlbXV4ZXIKKyAqIEFydHdvcnggRGF0YSBGb3JtYXQgZGVtdXhlcgorICogaUNFRHJhdyBGaWxlIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQmluYXJ5IHRleHQgZGVtdXhlcgorICogZVh0ZW5kZWQgQklOYXJ5IHRleHQgKFhCSU4pIGRlbXV4ZXIKKyAqIEFydHdvcnggRGF0YSBGb3JtYXQgZGVtdXhlcgorICogaUNFRHJhdyBGaWxlIGRlbXV4ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzYXVjZS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYmludGV4dC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IGNoYXJzX3Blcl9mcmFtZTsgLyoqPCBjaGFyYWN0ZXJzIHRvIHNlbmQgZGVjb2RlciBwZXIgZnJhbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgYnkgcHJpdmF0ZSBvcHRpb25zIGFzIGNoYXJhY3RlcnMgcGVyIHNlY29uZCwgYW5kIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCB0byBjaGFyYWN0ZXJzIHBlciBmcmFtZSBhdCBydW50aW1lICovCisgICAgaW50IHdpZHRoLCBoZWlnaHQ7ICAgIC8qKjwgdmlkZW8gc2l6ZSAoV3hIIHBpeGVscykgKHByaXZhdGUgb3B0aW9uKSAqLworICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOyAvKio8IGZyYW1lcyBwZXIgc2Vjb25kIChwcml2YXRlIG9wdGlvbikgKi8KKyAgICB1aW50NjRfdCBmc2l6ZTsgIC8qKjwgZmlsZSBzaXplIGxlc3MgbWV0YWRhdGEgYnVmZmVyICovCit9IEJpbkRlbXV4Q29udGV4dDsKKworc3RhdGljIEFWU3RyZWFtICogaW5pdF9zdHJlYW0oQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEJpbkRlbXV4Q29udGV4dCAqYmluID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IDA7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKworICAgIGlmICghYmluLT53aWR0aCkgeworICAgICAgICBzdC0+Y29kZWMtPndpZHRoICA9ICg4MDw8Myk7CisgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gKDI1PDw0KTsKKyAgICB9CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2MCwgYmluLT5mcmFtZXJhdGUuZGVuLCBiaW4tPmZyYW1lcmF0ZS5udW0pOworCisgICAgLyogc2ltdWxhdGUgdHR5IGRpc3BsYXkgc3BlZWQgKi8KKyAgICBiaW4tPmNoYXJzX3Blcl9mcmFtZSA9IGF2X2NsaXAoYXZfcTJkKHN0LT50aW1lX2Jhc2UpICogYmluLT5jaGFyc19wZXJfZnJhbWUsIDEsIElOVF9NQVgpOworCisgICAgcmV0dXJuIHN0OworfQorCisjaWYgQ09ORklHX0JJTlRFWFRfREVNVVhFUiB8IENPTkZJR19BREZfREVNVVhFUiB8IENPTkZJR19JREZfREVNVVhFUgorLyoqCisgKiBHaXZlbiBmaWxlc2l6ZSBhbmQgd2lkdGgsIGNhbGN1bGF0ZSBoZWlnaHQgKGFzc3VtZSBmb250X2hlaWdodCBvZiAxNikKKyAqLworc3RhdGljIHZvaWQgY2FsY3VsYXRlX2hlaWdodChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ2NF90IGZzaXplKQoreworICAgIGF2Y3R4LT5oZWlnaHQgPSAoZnNpemUgLyAoKGF2Y3R4LT53aWR0aD4+MykqMikpIDw8IDQ7Cit9CisjZW5kaWYKKworI2lmIENPTkZJR19CSU5URVhUX0RFTVVYRVIKK3N0YXRpYyBjb25zdCB1aW50OF90IG5leHRfbWFnaWNbXT17CisgICAgMHgxQSwgMHgxQiwgJ1snLCAnMCcsICc7JywgJzMnLCAnMCcsICc7JywgJzQnLCAnMCcsICdtJywgJ04nLCAnRScsICdYJywgJ1QnLCAweDAwCit9OworCitzdGF0aWMgaW50IG5leHRfdGFnX3JlYWQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgdWludDY0X3QgKmZzaXplKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IGF2Y3R4LT5wYjsKKyAgICBjaGFyIGJ1ZlszNl07CisgICAgaW50IGxlbjsKKyAgICB1aW50NjRfdCBzdGFydF9wb3MgPSBhdmlvX3NpemUocGIpIC0gMjU2OworCisgICAgYXZpb19zZWVrKHBiLCBzdGFydF9wb3MsIFNFRUtfU0VUKTsKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBidWYsIHNpemVvZihuZXh0X21hZ2ljKSkgIT0gc2l6ZW9mKG5leHRfbWFnaWMpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKG1lbWNtcChidWYsIG5leHRfbWFnaWMsIHNpemVvZihuZXh0X21hZ2ljKSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoYXZpb19yOChwYikgIT0gMHgwMSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgKmZzaXplIC09IDI1NjsKKworI2RlZmluZSBHRVRfRUZJMl9NRVRBKG5hbWUsc2l6ZSkgXAorICAgIGxlbiA9IGF2aW9fcjgocGIpOyBcCisgICAgaWYgKGxlbiA8IDEgfHwgbGVuID4gc2l6ZSkgXAorICAgICAgICByZXR1cm4gLTE7IFwKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBidWYsIHNpemUpID09IHNpemUgJiYgKmJ1ZikgeyBcCisgICAgICAgIGJ1ZltsZW5dID0gMDsgXAorICAgICAgICBhdl9kaWN0X3NldCgmYXZjdHgtPm1ldGFkYXRhLCBuYW1lLCBidWYsIDApOyBcCisgICAgfQorCisgICAgR0VUX0VGSTJfTUVUQSgiZmlsZW5hbWUiLCAgMTIpCisgICAgR0VUX0VGSTJfTUVUQSgiYXV0aG9yIiwgICAgMjApCisgICAgR0VUX0VGSTJfTUVUQSgicHVibGlzaGVyIiwgMjApCisgICAgR0VUX0VGSTJfTUVUQSgidGl0bGUiLCAgICAgMzUpCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJlZGljdF93aWR0aChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ2NF90IGZzaXplLCBpbnQgZ290X3dpZHRoKQoreworICAgIC8qKiBhdHRlbXB0IHRvIGd1ZXNzIHdpZHRoICovCisgICAgaWYgKCFnb3Rfd2lkdGgpCisgICAgICAgIGF2Y3R4LT53aWR0aCA9IGZzaXplID4gNDAwMCA/ICgxNjA8PDMpIDogKDgwPDwzKTsKK30KKworc3RhdGljIGludCBiaW50ZXh0X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBCaW5EZW11eENvbnRleHQgKmJpbiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKworICAgIEFWU3RyZWFtICpzdCA9IGluaXRfc3RyZWFtKHMpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0JJTlRFWFQ7CisKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgMikpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbMF0gPSAxNjsKKyAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVsxXSA9IDA7CisKKyAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIGludCBnb3Rfd2lkdGggPSAwOworICAgICAgICBiaW4tPmZzaXplID0gYXZpb19zaXplKHBiKTsKKyAgICAgICAgaWYgKGZmX3NhdWNlX3JlYWQocywgJmJpbi0+ZnNpemUsICZnb3Rfd2lkdGgsIDApIDwgMCkKKyAgICAgICAgICAgIG5leHRfdGFnX3JlYWQocywgJmJpbi0+ZnNpemUpOworICAgICAgICBpZiAoIWJpbi0+d2lkdGgpIHsKKyAgICAgICAgICAgIHByZWRpY3Rfd2lkdGgoc3QtPmNvZGVjLCBiaW4tPmZzaXplLCBnb3Rfd2lkdGgpOworICAgICAgICAgICAgY2FsY3VsYXRlX2hlaWdodChzdC0+Y29kZWMsIGJpbi0+ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGF2aW9fc2VlayhwYiwgMCwgU0VFS19TRVQpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfQklOVEVYVF9ERU1VWEVSICovCisKKyNpZiBDT05GSUdfWEJJTl9ERU1VWEVSCitzdGF0aWMgaW50IHhiaW5fcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqZCA9IHAtPmJ1ZjsKKworICAgIGlmIChBVl9STDMyKGQpID09IE1LVEFHKCdYJywnQicsJ0knLCdOJykgJiYgZFs0XSA9PSAweDFBICYmCisgICAgICAgIEFWX1JMMTYoZCs1KSA+IDAgJiYgQVZfUkwxNihkKzUpIDw9IDE2MCAmJgorICAgICAgICBkWzldID4gMCAmJiBkWzldIDw9IDMyKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGJpbl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQmluRGVtdXhDb250ZXh0ICpiaW4gPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgY2hhciBmb250aGVpZ2h0LCBmbGFnczsKKworICAgIEFWU3RyZWFtICpzdCA9IGluaXRfc3RyZWFtKHMpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmlvX3NraXAocGIsIDUpOworICAgIHN0LT5jb2RlYy0+d2lkdGggICA9IGF2aW9fcmwxNihwYik8PDM7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgID0gYXZpb19ybDE2KHBiKTsKKyAgICBmb250aGVpZ2h0ICAgICAgICAgPSBhdmlvX3I4KHBiKTsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCAqPSBmb250aGVpZ2h0OworICAgIGZsYWdzICAgICAgICAgICAgICA9IGF2aW9fcjgocGIpOworCisgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDI7CisgICAgaWYgKChmbGFncyAmIEJJTlRFWFRfUEFMRVRURSkpCisgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgKz0gNDg7CisgICAgaWYgKChmbGFncyAmIEJJTlRFWFRfRk9OVCkpCisgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgKz0gZm9udGhlaWdodCAqIChmbGFncyAmIDB4MTAgPyA1MTIgOiAyNTYpOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBmbGFncyAmIDQgPyBBVl9DT0RFQ19JRF9YQklOIDogQVZfQ09ERUNfSURfQklOVEVYVDsKKworICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVswXSA9IGZvbnRoZWlnaHQ7CisgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbMV0gPSBmbGFnczsKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgLSAyKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIGJpbi0+ZnNpemUgPSBhdmlvX3NpemUocGIpIC0gOSAtIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgIGZmX3NhdWNlX3JlYWQocywgJmJpbi0+ZnNpemUsIE5VTEwsIDApOworICAgICAgICBhdmlvX3NlZWsocGIsIDkgKyBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplLCBTRUVLX1NFVCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1hCSU5fREVNVVhFUiAqLworCisjaWYgQ09ORklHX0FERl9ERU1VWEVSCitzdGF0aWMgaW50IGFkZl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQmluRGVtdXhDb250ZXh0ICpiaW4gPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgaWYgKGF2aW9fcjgocGIpICE9IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3QgPSBpbml0X3N0cmVhbShzKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9CSU5URVhUOworCisgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIDIgKyA0OCArIDQwOTYpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzBdID0gMTY7CisgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbMV0gPSBCSU5URVhUX1BBTEVUVEV8QklOVEVYVF9GT05UOworCisgICAgaWYgKGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAyLCAyNCkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIGF2aW9fc2tpcChwYiwgMTQ0KTsKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIgKyAyNCwgMjQpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIgKyA0OCwgNDA5NikgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgICAgICBpbnQgZ290X3dpZHRoID0gMDsKKyAgICAgICAgYmluLT5mc2l6ZSA9IGF2aW9fc2l6ZShwYikgLSAxIC0gMTkyIC0gNDA5NjsKKyAgICAgICAgc3QtPmNvZGVjLT53aWR0aCA9IDgwPDwzOworICAgICAgICBmZl9zYXVjZV9yZWFkKHMsICZiaW4tPmZzaXplLCAmZ290X3dpZHRoLCAwKTsKKyAgICAgICAgaWYgKCFiaW4tPndpZHRoKQorICAgICAgICAgICAgY2FsY3VsYXRlX2hlaWdodChzdC0+Y29kZWMsIGJpbi0+ZnNpemUpOworICAgICAgICBhdmlvX3NlZWsocGIsIDEgKyAxOTIgKyA0MDk2LCBTRUVLX1NFVCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19BREZfREVNVVhFUiAqLworCisjaWYgQ09ORklHX0lERl9ERU1VWEVSCitzdGF0aWMgY29uc3QgdWludDhfdCBpZGZfbWFnaWNbXSA9IHsKKyAgICAweDA0LCAweDMxLCAweDJlLCAweDM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDRmLCAweDAwLCAweDE1LCAweDAwCit9OworCitzdGF0aWMgaW50IGlkZl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAocC0+YnVmX3NpemUgPCBzaXplb2YoaWRmX21hZ2ljKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFtZW1jbXAocC0+YnVmLCBpZGZfbWFnaWMsIHNpemVvZihpZGZfbWFnaWMpKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlkZl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQmluRGVtdXhDb250ZXh0ICpiaW4gPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCBnb3Rfd2lkdGggPSAwOworCisgICAgaWYgKCFwYi0+c2Vla2FibGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBzdCA9IGluaXRfc3RyZWFtKHMpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0lERjsKKworICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCAyICsgNDggKyA0MDk2KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVswXSA9IDE2OworICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzFdID0gQklOVEVYVF9QQUxFVFRFfEJJTlRFWFRfRk9OVDsKKworICAgIGF2aW9fc2VlayhwYiwgYXZpb19zaXplKHBiKSAtIDQwOTYgLSA0OCwgU0VFS19TRVQpOworCisgICAgaWYgKGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAyICsgNDgsIDQwOTYpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIsIDQ4KSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBiaW4tPmZzaXplID0gYXZpb19zaXplKHBiKSAtIDEyIC0gNDA5NiAtIDQ4OworICAgIGZmX3NhdWNlX3JlYWQocywgJmJpbi0+ZnNpemUsICZnb3Rfd2lkdGgsIDApOworICAgIGlmICghYmluLT53aWR0aCkKKyAgICAgICAgY2FsY3VsYXRlX2hlaWdodChzdC0+Y29kZWMsIGJpbi0+ZnNpemUpOworICAgIGF2aW9fc2VlayhwYiwgMTIsIFNFRUtfU0VUKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfSURGX0RFTVVYRVIgKi8KKworc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIEJpbkRlbXV4Q29udGV4dCAqYmluID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKGJpbi0+ZnNpemUgPiAwKSB7CisgICAgICAgIGlmIChhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIGJpbi0+ZnNpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIGJpbi0+ZnNpemUgPSAtMTsgLyogZG9uZSAqLworICAgIH0gZWxzZSBpZiAoIWJpbi0+ZnNpemUpIHsKKyAgICAgICAgaWYgKGF2aW9fZmVvZihzLT5wYikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICBpZiAoYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBiaW4tPmNoYXJzX3Blcl9mcmFtZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihCaW5EZW11eENvbnRleHQsIHgpCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImxpbmVzcGVlZCIsICJzZXQgc2ltdWxhdGVkIGxpbmUgc3BlZWQgKGJ5dGVzIHBlciBzZWNvbmQpIiwgT0ZGU0VUKGNoYXJzX3Blcl9mcmFtZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA2MDAwfSwgMSwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU19LAorICAgIHsgInZpZGVvX3NpemUiLCAic2V0IHZpZGVvIHNpemUsIHN1Y2ggYXMgNjQweDQ4MCBvciBoZDcyMC4iLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgImZyYW1lcmF0ZSIsICJzZXQgZnJhbWVyYXRlIChmcmFtZXMgcGVyIHNlY29uZCkiLCBPRkZTRVQoZnJhbWVyYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKKyNkZWZpbmUgQ0xBU1MobmFtZSkgXAorKGNvbnN0IEFWQ2xhc3NbMV0pe3sgXAorICAgIC5jbGFzc19uYW1lICAgICA9IG5hbWUsIFwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwgXAorICAgIC5vcHRpb24gICAgICAgICA9IG9wdGlvbnMsIFwKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsIFwKK319CisKKyNpZiBDT05GSUdfQklOVEVYVF9ERU1VWEVSCitBVklucHV0Rm9ybWF0IGZmX2JpbnRleHRfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYmluIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQmluYXJ5IHRleHQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQmluRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBiaW50ZXh0X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorICAgIC5leHRlbnNpb25zICAgICA9ICJiaW4iLAorICAgIC5wcml2X2NsYXNzICAgICA9IENMQVNTKCJCaW5hcnkgdGV4dCBkZW11eGVyIiksCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfWEJJTl9ERU1VWEVSCitBVklucHV0Rm9ybWF0IGZmX3hiaW5fZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAieGJpbiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImVYdGVuZGVkIEJJTmFyeSB0ZXh0IChYQklOKSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihCaW5EZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHhiaW5fcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0geGJpbl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSByZWFkX3BhY2tldCwKKyAgICAucHJpdl9jbGFzcyAgICAgPSBDTEFTUygiZVh0ZW5kZWQgQklOYXJ5IHRleHQgKFhCSU4pIGRlbXV4ZXIiKSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19BREZfREVNVVhFUgorQVZJbnB1dEZvcm1hdCBmZl9hZGZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYWRmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXJ0d29yeCBEYXRhIEZvcm1hdCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihCaW5EZW11eENvbnRleHQpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGFkZl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSByZWFkX3BhY2tldCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiYWRmIiwKKyAgICAucHJpdl9jbGFzcyAgICAgPSBDTEFTUygiQXJ0d29yeCBEYXRhIEZvcm1hdCBkZW11eGVyIiksCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfSURGX0RFTVVYRVIKK0FWSW5wdXRGb3JtYXQgZmZfaWRmX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImlkZiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImlDRSBEcmF3IEZpbGUiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQmluRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBpZGZfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gaWRmX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorICAgIC5leHRlbnNpb25zICAgICA9ICJpZGYiLAorICAgIC5wcml2X2NsYXNzICAgICA9IENMQVNTKCJpQ0UgRHJhdyBGaWxlIGRlbXV4ZXIiKSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9iaXQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9iaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjgwN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2JpdC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogRy43MjkgYml0IGZvcm1hdCBtdXhlciBhbmQgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggVmxhZGltaXIgVm9yb3NoaWxvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9wdXRfYml0cy5oIgorCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFIDEwCisKKyNkZWZpbmUgU1lOQ19XT1JEICAweDZiMjEKKyNkZWZpbmUgQklUXzAgICAgICAweDdmCisjZGVmaW5lIEJJVF8xICAgICAgMHg4MQorCitzdGF0aWMgaW50IHByb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGludCBpLCBqOworCisgICAgaWYocC0+YnVmX3NpemUgPCAweDQwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvcihpPTA7IGkrMzxwLT5idWZfc2l6ZSAmJiBpPCAxMCoweDUwOyApeworICAgICAgICBpZihBVl9STDE2KCZwLT5idWZbMF0pICE9IFNZTkNfV09SRCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBqPUFWX1JMMTYoJnAtPmJ1ZlsyXSk7CisgICAgICAgIGlmKGohPTB4NDAgJiYgaiE9MHg1MCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpKz1qOworICAgIH0KKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtKiBzdDsKKworICAgIHN0PWF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkPUFWX0NPREVDX0lEX0c3Mjk7CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZT04MDAwOworICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSAxNjsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzPTE7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgUHV0Qml0Q29udGV4dCBwYm87CisgICAgdWludDE2X3QgYnVmWzggKiBNQVhfRlJBTUVfU0laRSArIDJdOworICAgIGludCBwYWNrZXRfc2l6ZTsKKyAgICB1aW50MTZfdCogc3JjPWJ1ZjsKKyAgICBpbnQgaSwgaiwgcmV0OworICAgIGludDY0X3QgcG9zPSBhdmlvX3RlbGwocGIpOworCisgICAgaWYoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgYXZpb19ybDE2KHBiKTsgLy8gc3luYyB3b3JkCisgICAgcGFja2V0X3NpemUgPSBhdmlvX3JsMTYocGIpIC8gODsKKyAgICBpZihwYWNrZXRfc2l6ZSA+IE1BWF9GUkFNRV9TSVpFKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHJldCA9IGF2aW9fcmVhZChwYiwgKHVpbnQ4X3QqKWJ1ZiwgKDggKiBwYWNrZXRfc2l6ZSkgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZihyZXQ8MCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZihyZXQgIT0gOCAqIHBhY2tldF9zaXplICogc2l6ZW9mKHVpbnQxNl90KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgcGFja2V0X3NpemUpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGluaXRfcHV0X2JpdHMoJnBibywgcGt0LT5kYXRhLCBwYWNrZXRfc2l6ZSk7CisgICAgZm9yKGo9MDsgaiA8IHBhY2tldF9zaXplOyBqKyspCisgICAgICAgIGZvcihpPTA7IGk8ODtpKyspCisgICAgICAgICAgICBwdXRfYml0cygmcGJvLDEsIEFWX1JMMTYoc3JjKyspID09IEJJVF8xID8gMSA6IDApOworCisgICAgZmx1c2hfcHV0X2JpdHMoJnBibyk7CisKKyAgICBwa3QtPmR1cmF0aW9uPTE7CisgICAgcGt0LT5wb3MgPSBwb3M7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYml0X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgID0gImJpdCIsCisgICAgLmxvbmdfbmFtZSAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkcuNzI5IEJJVCBmaWxlIGZvcm1hdCIpLAorICAgIC5yZWFkX3Byb2JlICA9IHByb2JlLAorICAgIC5yZWFkX2hlYWRlciA9IHJlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCA9IHJlYWRfcGFja2V0LAorICAgIC5leHRlbnNpb25zICA9ICJiaXQiLAorfTsKKworI2lmIENPTkZJR19NVVhFUlMKK3N0YXRpYyBpbnQgd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisKKyAgICBlbmMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRzcyOTsKKyAgICBlbmMtPmNoYW5uZWxzID0gMTsKKyAgICBlbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OworICAgIGVuYy0+YmxvY2tfYWxpZ24gPSAoZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBlbmMtPmNoYW5uZWxzKSA+PiAzOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBpOworCisgICAgYXZpb193bDE2KHBiLCBTWU5DX1dPUkQpOworICAgIGF2aW9fd2wxNihwYiwgOCAqIDEwKTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBwa3QtPmRhdGEsIDgqMTApOworICAgIGZvcihpPTA7IGk8IDggKiAxMDsgaSsrKQorICAgICAgICBhdmlvX3dsMTYocGIsIGdldF9iaXRzMSgmZ2IpID8gQklUXzEgOiBCSVRfMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfYml0X211eGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAiYml0IiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkcuNzI5IEJJVCBmaWxlIGZvcm1hdCIpLAorICAgIC5taW1lX3R5cGUgICAgPSAiYXVkaW8vYml0IiwKKyAgICAuZXh0ZW5zaW9ucyAgID0gImJpdCIsCisgICAgLmF1ZGlvX2NvZGVjICA9IEFWX0NPREVDX0lEX0c3MjksCisgICAgLnZpZGVvX2NvZGVjICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciA9IHdyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ID0gd3JpdGVfcGFja2V0LAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2JsdXJheS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2JsdXJheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYzU3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvYmx1cmF5LmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBCbHVSYXkgKGxpYmJsdXJheSkgcHJvdG9jb2wKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGV0cmkgSGludHVrYWluZW4gPHBoaW50dWthIDxhdD4gdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bGliYmx1cmF5L2JsdXJheS5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC91cmwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNkZWZpbmUgQkxVUkFZX1BST1RPX1BSRUZJWCAgICAgImJsdXJheToiCisjZGVmaW5lIE1JTl9QTEFZTElTVF9MRU5HVEggICAgIDE4MCAgICAgLyogMyBtaW4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgQkxVUkFZICpiZDsKKworICAgIGludCBwbGF5bGlzdDsKKyAgICBpbnQgYW5nbGU7CisgICAgaW50IGNoYXB0ZXI7CisgICAgLyppbnQgcmVnaW9uOyovCit9IEJsdXJheUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEJsdXJheUNvbnRleHQsIHgpCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworeyJwbGF5bGlzdCIsICIiLCBPRkZTRVQocGxheWxpc3QpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2ND0tMSB9LCAtMSwgIDk5OTk5LCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAoreyJhbmdsZSIsICAgICIiLCBPRkZTRVQoYW5nbGUpLCAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2ND0wIH0sICAgMCwgICAweGZlLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAoreyJjaGFwdGVyIiwgICIiLCBPRkZTRVQoY2hhcHRlciksICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2ND0xIH0sICAgMSwgMHhmZmZlLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorLyp7InJlZ2lvbiIsICAgImJsdXJheSBwbGF5ZXIgcmVnaW9uIGNvZGUgKDEgPSByZWdpb24gQSwgMiA9IHJlZ2lvbiBCLCA0ID0gcmVnaW9uIEMpIiwgT0ZGU0VUKHJlZ2lvbiksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0PTAgfSwgMCwgMywgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwqLwore05VTEx9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBibHVyYXlfY29udGV4dF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAiYmx1cmF5IiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKKworc3RhdGljIGludCBjaGVja19kaXNjX2luZm8oVVJMQ29udGV4dCAqaCkKK3sKKyAgICBCbHVyYXlDb250ZXh0ICpiZCA9IGgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBCTFVSQVlfRElTQ19JTkZPICpkaXNjX2luZm87CisKKyAgICBkaXNjX2luZm8gPSBiZF9nZXRfZGlzY19pbmZvKGJkLT5iZCk7CisgICAgaWYgKCFkaXNjX2luZm8pIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgImJkX2dldF9kaXNjX2luZm8oKSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCFkaXNjX2luZm8tPmJsdXJheV9kZXRlY3RlZCkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiQmx1UmF5IGRpc2Mgbm90IGRldGVjdGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEFBQ1MgKi8KKyAgICBpZiAoZGlzY19pbmZvLT5hYWNzX2RldGVjdGVkICYmICFkaXNjX2luZm8tPmFhY3NfaGFuZGxlZCkgeworICAgICAgICBpZiAoIWRpc2NfaW5mby0+bGliYWFjc19kZXRlY3RlZCkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTWVkaWEgc3RyZWFtIGVuY3J5cHRlZCB3aXRoIEFBQ1MsIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSBsaWJhYWNzXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJZb3VyIGxpYmFhY3MgY2FuJ3QgZGVjcnlwdCB0aGlzIG1lZGlhXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogQkQrICovCisgICAgaWYgKGRpc2NfaW5mby0+YmRwbHVzX2RldGVjdGVkICYmICFkaXNjX2luZm8tPmJkcGx1c19oYW5kbGVkKSB7CisgICAgICAgIC8qCisgICAgICAgIGlmICghZGlzY19pbmZvLT5saWJiZHBsdXNfZGV0ZWN0ZWQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIk1lZGlhIHN0cmVhbSBlbmNyeXB0ZWQgd2l0aCBCRCssIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSBsaWJiZHBsdXMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgKi8KKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gZGVjcnlwdCBCRCsgZW5jcnlwdGVkIG1lZGlhXG4iKTsKKyAgICAgICAgLyp9Ki8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJsdXJheV9jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIEJsdXJheUNvbnRleHQgKmJkID0gaC0+cHJpdl9kYXRhOworICAgIGlmIChiZC0+YmQpIHsKKyAgICAgICAgYmRfY2xvc2UoYmQtPmJkKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibHVyYXlfb3BlbihVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MpCit7CisgICAgQmx1cmF5Q29udGV4dCAqYmQgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IG51bV90aXRsZV9pZHg7CisgICAgY29uc3QgY2hhciAqZGlza25hbWUgPSBwYXRoOworCisgICAgYXZfc3Ryc3RhcnQocGF0aCwgQkxVUkFZX1BST1RPX1BSRUZJWCwgJmRpc2tuYW1lKTsKKworICAgIGJkLT5iZCA9IGJkX29wZW4oZGlza25hbWUsIE5VTEwpOworICAgIGlmICghYmQtPmJkKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJiZF9vcGVuKCkgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBpZiBkaXNjIGNhbiBiZSBwbGF5ZWQgKi8KKyAgICBpZiAoY2hlY2tfZGlzY19pbmZvKGgpIDwgMCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIC8qIHNldHVwIHBsYXllciByZWdpc3RlcnMgKi8KKyAgICAvKiByZWdpb24gY29kZSBoYXMgbm8gZWZmZWN0IHdpdGhvdXQgbWVudXMKKyAgICBpZiAoYmQtPnJlZ2lvbiA+IDAgJiYgYmQtPnJlZ2lvbiA8IDUpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19JTkZPLCAic2V0dGluZyByZWdpb24gY29kZSB0byAlZCAoJWMpXG4iLCBiZC0+cmVnaW9uLCAnQScgKyAoYmQtPnJlZ2lvbiAtIDEpKTsKKyAgICAgICAgYmRfc2V0X3BsYXllcl9zZXR0aW5nKGJkLT5iZCwgQkxVUkFZX1BMQVlFUl9TRVRUSU5HX1JFR0lPTl9DT0RFLCBiZC0+cmVnaW9uKTsKKyAgICB9CisgICAgKi8KKworICAgIC8qIGxvYWQgdGl0bGUgbGlzdCAqLworICAgIG51bV90aXRsZV9pZHggPSBiZF9nZXRfdGl0bGVzKGJkLT5iZCwgVElUTEVTX1JFTEVWQU5ULCBNSU5fUExBWUxJU1RfTEVOR1RIKTsKKyAgICBhdl9sb2coaCwgQVZfTE9HX0lORk8sICIlZCB1c2FibGUgcGxheWxpc3RzOlxuIiwgbnVtX3RpdGxlX2lkeCk7CisgICAgaWYgKG51bV90aXRsZV9pZHggPCAxKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgLyogaWYgcGxheWxpc3Qgd2FzIG5vdCBnaXZlbiwgc2VsZWN0IGxvbmdlc3QgcGxheWxpc3QgKi8KKyAgICBpZiAoYmQtPnBsYXlsaXN0IDwgMCkgeworICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RpdGxlX2lkeDsgaSsrKSB7CisgICAgICAgICAgICBCTFVSQVlfVElUTEVfSU5GTyAqaW5mbyA9IGJkX2dldF90aXRsZV9pbmZvKGJkLT5iZCwgaSwgMCk7CisKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfSU5GTywgInBsYXlsaXN0ICUwNWQubXBscyAoJWQ6JTAyZDolMDJkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBpbmZvLT5wbGF5bGlzdCwKKyAgICAgICAgICAgICAgICAgICAoKGludCkoaW5mby0+ZHVyYXRpb24gLyA5MDAwMCkgLyAzNjAwKSwKKyAgICAgICAgICAgICAgICAgICAoKGludCkoaW5mby0+ZHVyYXRpb24gLyA5MDAwMCkgJSAzNjAwKSAvIDYwLAorICAgICAgICAgICAgICAgICAgICgoaW50KShpbmZvLT5kdXJhdGlvbiAvIDkwMDAwKSAlIDYwKSk7CisKKyAgICAgICAgICAgIGlmIChpbmZvLT5kdXJhdGlvbiA+IGR1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYmQtPnBsYXlsaXN0ID0gaW5mby0+cGxheWxpc3Q7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBpbmZvLT5kdXJhdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmRfZnJlZV90aXRsZV9pbmZvKGluZm8pOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfSU5GTywgInNlbGVjdGVkICUwNWQubXBsc1xuIiwgYmQtPnBsYXlsaXN0KTsKKyAgICB9CisKKyAgICAvKiBzZWxlY3QgcGxheWxpc3QgKi8KKyAgICBpZiAoYmRfc2VsZWN0X3BsYXlsaXN0KGJkLT5iZCwgYmQtPnBsYXlsaXN0KSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJiZF9zZWxlY3RfcGxheWxpc3QoJTA1ZC5tcGxzKSBmYWlsZWRcbiIsIGJkLT5wbGF5bGlzdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgLyogc2VsZWN0IGFuZ2xlICovCisgICAgaWYgKGJkLT5hbmdsZSA+PSAwKSB7CisgICAgICAgIGJkX3NlbGVjdF9hbmdsZShiZC0+YmQsIGJkLT5hbmdsZSk7CisgICAgfQorCisgICAgLyogc2VsZWN0IGNoYXB0ZXIgKi8KKyAgICBpZiAoYmQtPmNoYXB0ZXIgPiAxKSB7CisgICAgICAgIGJkX3NlZWtfY2hhcHRlcihiZC0+YmQsIGJkLT5jaGFwdGVyIC0gMSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmx1cmF5X3JlYWQoVVJMQ29udGV4dCAqaCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBCbHVyYXlDb250ZXh0ICpiZCA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgbGVuOworCisgICAgaWYgKCFiZCB8fCAhYmQtPmJkKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVGQVVMVCk7CisgICAgfQorCisgICAgbGVuID0gYmRfcmVhZChiZC0+YmQsIGJ1Ziwgc2l6ZSk7CisKKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50NjRfdCBibHVyYXlfc2VlayhVUkxDb250ZXh0ICpoLCBpbnQ2NF90IHBvcywgaW50IHdoZW5jZSkKK3sKKyAgICBCbHVyYXlDb250ZXh0ICpiZCA9IGgtPnByaXZfZGF0YTsKKworICAgIGlmICghYmQgfHwgIWJkLT5iZCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFRkFVTFQpOworICAgIH0KKworICAgIHN3aXRjaCAod2hlbmNlKSB7CisgICAgY2FzZSBTRUVLX1NFVDoKKyAgICBjYXNlIFNFRUtfQ1VSOgorICAgIGNhc2UgU0VFS19FTkQ6CisgICAgICAgIHJldHVybiBiZF9zZWVrKGJkLT5iZCwgcG9zKTsKKworICAgIGNhc2UgQVZTRUVLX1NJWkU6CisgICAgICAgIHJldHVybiBiZF9nZXRfdGl0bGVfc2l6ZShiZC0+YmQpOworICAgIH0KKworICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCB3aGVuY2Ugb3BlcmF0aW9uICVkXG4iLCB3aGVuY2UpOworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKKworVVJMUHJvdG9jb2wgZmZfYmx1cmF5X3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICAgPSAiYmx1cmF5IiwKKyAgICAudXJsX2Nsb3NlICAgICAgID0gYmx1cmF5X2Nsb3NlLAorICAgIC51cmxfb3BlbiAgICAgICAgPSBibHVyYXlfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgID0gYmx1cmF5X3JlYWQsCisgICAgLnVybF9zZWVrICAgICAgICA9IGJsdXJheV9zZWVrLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgPSBzaXplb2YoQmx1cmF5Q29udGV4dCksCisgICAgLnByaXZfZGF0YV9jbGFzcyA9ICZibHVyYXlfY29udGV4dF9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYm12LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYm12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhNjA2OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ibXYuYwpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIERpc2N3b3JsZCBJSSBCTVYgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDExIEtvbnN0YW50aW4gU2hpc2hrb3YuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2VudW0gQk1WRmxhZ3MgeworICAgIEJNVl9OT1AgPSAwLAorICAgIEJNVl9FTkQsCisgICAgQk1WX0RFTFRBLAorICAgIEJNVl9JTlRSQSwKKworICAgIEJNVl9BVURJTyAgID0gMHgyMCwKK307CisKK3R5cGVkZWYgc3RydWN0IEJNVkNvbnRleHQgeworICAgIHVpbnQ4X3QgKnBhY2tldDsKKyAgICBpbnQgICAgICBzaXplOworICAgIGludCAgICAgIGdldF9uZXh0OworICAgIGludDY0X3QgIGF1ZGlvX3BvczsKK30gQk1WQ29udGV4dDsKKworc3RhdGljIGludCBibXZfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICpzdCwgKmFzdDsKKyAgICBCTVZDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIDApOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0JNVl9WSURFTzsKKyAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSA2NDA7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gNDI5OworICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCAgICA9IEFWX1BJWF9GTVRfUEFMODsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAxNiwgMSwgMTIpOworICAgIGFzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgMCk7CisgICAgaWYgKCFhc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkICAgICAgICA9IEFWX0NPREVDX0lEX0JNVl9BVURJTzsKKyAgICBhc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgPSAyOworICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ICA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgID0gMjIwNTA7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDE2LCAxLCAyMjA1MCk7CisKKyAgICBjLT5nZXRfbmV4dCAgPSAxOworICAgIGMtPmF1ZGlvX3BvcyA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm12X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBCTVZDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCB0eXBlLCBlcnI7CisKKyAgICB3aGlsZSAoYy0+Z2V0X25leHQpIHsKKyAgICAgICAgaWYgKHMtPnBiLT5lb2ZfcmVhY2hlZCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICAgICAgdHlwZSA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICBpZiAodHlwZSA9PSBCTVZfTk9QKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICh0eXBlID09IEJNVl9FTkQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIGMtPnNpemUgPSBhdmlvX3JsMjQocy0+cGIpOworICAgICAgICBpZiAoIWMtPnNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmYy0+cGFja2V0LCBjLT5zaXplICsgMSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGMtPnBhY2tldFswXSA9IHR5cGU7CisgICAgICAgIGlmIChhdmlvX3JlYWQocy0+cGIsIGMtPnBhY2tldCArIDEsIGMtPnNpemUpICE9IGMtPnNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICBpZiAodHlwZSAmIEJNVl9BVURJTykgeworICAgICAgICAgICAgaW50IGF1ZGlvX3NpemUgPSBjLT5wYWNrZXRbMV0gKiA2NSArIDE7CisgICAgICAgICAgICBpZiAoYXVkaW9fc2l6ZSA+PSBjLT5zaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlJlcG9ydGVkIGF1ZGlvIHNpemUgJWQgaXMgYmlnZ2VyIHRoYW4gcGFja2V0IHNpemUgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2l6ZSwgYy0+c2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIGF1ZGlvX3NpemUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgYy0+cGFja2V0ICsgMSwgcGt0LT5zaXplKTsKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMTsKKyAgICAgICAgICAgIHBrdC0+cHRzICAgICAgICAgID0gYy0+YXVkaW9fcG9zOworICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiAgICAgPSBjLT5wYWNrZXRbMV0gKiAzMjsKKyAgICAgICAgICAgIGMtPmF1ZGlvX3BvcyArPSBwa3QtPmR1cmF0aW9uOworICAgICAgICAgICAgYy0+Z2V0X25leHQgICA9IDA7CisgICAgICAgICAgICByZXR1cm4gcGt0LT5zaXplOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIGMtPnNpemUgKyAxKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIGMtPmdldF9uZXh0ID0gMTsKKyAgICBtZW1jcHkocGt0LT5kYXRhLCBjLT5wYWNrZXQsIHBrdC0+c2l6ZSk7CisgICAgcmV0dXJuIHBrdC0+c2l6ZTsKK30KKworc3RhdGljIGludCBibXZfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQk1WQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZjLT5wYWNrZXQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYm12X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImJtdiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRpc2N3b3JsZCBJSSBCTVYiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQk1WQ29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgID0gYm12X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGJtdl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBibXZfcmVhZF9jbG9zZSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiYm12IiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYm9hZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYm9hZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmNmIzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ib2FkZWMuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogQmxhY2sgb3BzIGF1ZGlvIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMyBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworc3RhdGljIGludCBwcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAocC0+YnVmX3NpemUgPCAyMDk2KQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICAgQVZfUkwzMihwLT5idWYgICAgICkgIT0gMQorICAgICAgICB8fCBBVl9STDMyKHAtPmJ1ZiArICA4KSA+IDEwMDAwMAorICAgICAgICB8fCBBVl9STDMyKHAtPmJ1ZiArIDEyKSA+IDgKKyAgICAgICAgfHwgQVZfUkwzMihwLT5idWYgKyAxNikgIT0gMjA5NgorICAgICAgICB8fCFBVl9STDMyKHAtPmJ1ZiArIDIxKQorICAgICAgICB8fCBBVl9STDE2KHAtPmJ1ZiArIDI1KSAhPSAyMDk2CisgICAgICAgIHx8IEFWX1JMMzIocC0+YnVmICsgNDgpICUgQVZfUkwzMihwLT5idWYgKyAyMSkKKyAgICAgICAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047Cit9CisKKworc3RhdGljIGludCByZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9NUzsKKworICAgIGF2aW9fcmwzMihzLT5wYik7CisgICAgYXZpb19ybDMyKHMtPnBiKTsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBzLT5kYXRhX29mZnNldCAgICAgICAgID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBhdmlvX3I4KHMtPnBiKTsKKyAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjLT5jaGFubmVscyAqIGF2aW9fcmwzMihzLT5wYik7CisKKyAgICBhdmlvX3NlZWsocy0+cGIsIHMtPmRhdGFfb2Zmc2V0LCBTRUVLX1NFVCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1swXTsKKworICAgIHJldHVybiBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pOworfQorCitBVklucHV0Rm9ybWF0IGZmX2JvYV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJib2EiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCbGFjayBPcHMgQXVkaW8iKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBwcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSByZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSByZWFkX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9icnN0bS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2Jyc3RtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhNGEyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9icnN0bS5jCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogQlJTVE0gZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQlJTVE1EZW11eENvbnRleHQgeworICAgIHVpbnQzMl90ICAgIGJsb2NrX3NpemU7CisgICAgdWludDMyX3QgICAgYmxvY2tfY291bnQ7CisgICAgdWludDMyX3QgICAgY3VycmVudF9ibG9jazsKKyAgICB1aW50MzJfdCAgICBzYW1wbGVzX3Blcl9ibG9jazsKKyAgICB1aW50MzJfdCAgICBsYXN0X2Jsb2NrX3VzZWRfYnl0ZXM7CisgICAgdWludDhfdCAgICAgKnRhYmxlOworICAgIHVpbnQ4X3QgICAgICphZHBjOworfSBCUlNUTURlbXV4Q29udGV4dDsKKworc3RhdGljIGludCBwcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoQVZfUkwzMihwLT5idWYpID09IE1LVEFHKCdSJywnUycsJ1QnLCdNJykgJiYKKyAgICAgICAgKEFWX1JMMTYocC0+YnVmICsgNCkgPT0gMHhGRkZFIHx8CisgICAgICAgICBBVl9STDE2KHAtPmJ1ZiArIDQpID09IDB4RkVGRikpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDMgKiAyOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEJSU1RNRGVtdXhDb250ZXh0ICpiID0gcy0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmItPnRhYmxlKTsKKyAgICBhdl9mcmVlcCgmYi0+YWRwYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQlJTVE1EZW11eENvbnRleHQgKmIgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGJvbSwgbWFqb3IsIG1pbm9yLCBjb2RlYywgY2h1bms7CisgICAgaW50NjRfdCBwb3MsIGgxb2Zmc2V0LCB0b2Zmc2V0OworICAgIHVpbnQzMl90IHNpemUsIHN0YXJ0LCBhc2l6ZTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IHJldCA9IEFWRVJST1JfRU9GOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworCisgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKKworICAgIGJvbSA9IGF2aW9fcmIxNihzLT5wYik7CisgICAgaWYgKGJvbSAhPSAweEZFRkYgJiYgYm9tICE9IDB4RkZGRSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBieXRlIG9yZGVyOiAlWFxuIiwgYm9tKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChib20gPT0gMHhGRkZFKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAibGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBtYWpvciA9IGF2aW9fcjgocy0+cGIpOworICAgIG1pbm9yID0gYXZpb19yOChzLT5wYik7CisgICAgYXZpb19za2lwKHMtPnBiLCA0KTsgLy8gc2l6ZSBvZiBmaWxlCisgICAgc2l6ZSA9IGF2aW9fcmIxNihzLT5wYik7CisgICAgaWYgKHNpemUgPCAxNCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdmlvX3NraXAocy0+cGIsIHNpemUgLSAxNCk7CisgICAgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBpZiAoYXZpb19ybDMyKHMtPnBiKSAhPSBNS1RBRygnSCcsJ0UnLCdBJywnRCcpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBzaXplID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBpZiAoc2l6ZSA8IDI1NikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgYXZpb19za2lwKHMtPnBiLCA0KTsgLy8gdW5rbm93bgorICAgIGgxb2Zmc2V0ID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBpZiAoaDFvZmZzZXQgPiBzaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBhdmlvX3NraXAocy0+cGIsIDEyKTsKKyAgICB0b2Zmc2V0ID0gYXZpb19yYjMyKHMtPnBiKSArIDE2TEw7CisgICAgaWYgKHRvZmZzZXQgPiBzaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2aW9fc2tpcChzLT5wYiwgcG9zICsgaDFvZmZzZXQgKyA4IC0gYXZpb190ZWxsKHMtPnBiKSk7CisgICAgY29kZWMgPSBhdmlvX3I4KHMtPnBiKTsKKworICAgIHN3aXRjaCAoY29kZWMpIHsKKyAgICBjYXNlIDA6IGNvZGVjID0gQVZfQ09ERUNfSURfUENNX1M4X1BMQU5BUjsgICAgYnJlYWs7CisgICAgY2FzZSAxOiBjb2RlYyA9IEFWX0NPREVDX0lEX1BDTV9TMTZCRV9QTEFOQVI7IGJyZWFrOworICAgIGNhc2UgMjogY29kZWMgPSBBVl9DT0RFQ19JRF9BRFBDTV9USFA7ICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImNvZGVjICVkIiwgY29kZWMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgYXZpb19za2lwKHMtPnBiLCAxKTsgLy8gbG9vcCBmbGFnCisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGNvZGVjOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBhdmlvX3I4KHMtPnBiKTsKKyAgICBpZiAoIXN0LT5jb2RlYy0+Y2hhbm5lbHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYXZpb19za2lwKHMtPnBiLCAxKTsgLy8gcGFkZGluZworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMTYocy0+cGIpOworICAgIGlmICghc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdmlvX3NraXAocy0+cGIsIDIpOyAvLyBwYWRkaW5nCisgICAgYXZpb19za2lwKHMtPnBiLCA0KTsgLy8gbG9vcCBzdGFydCBzYW1wbGUKKyAgICBzdC0+c3RhcnRfdGltZSA9IDA7CisgICAgc3QtPmR1cmF0aW9uID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKKyAgICBzdGFydCA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgYi0+Y3VycmVudF9ibG9jayA9IDA7CisgICAgYi0+YmxvY2tfY291bnQgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGlmIChiLT5ibG9ja19jb3VudCA+IFVJTlQxNl9NQVgpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAidG9vIG1hbnkgYmxvY2tzOiAldVxuIiwgYi0+YmxvY2tfY291bnQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBiLT5ibG9ja19zaXplID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBpZiAoYi0+YmxvY2tfc2l6ZSA+IFVJTlQxNl9NQVggLyBzdC0+Y29kZWMtPmNoYW5uZWxzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBiLT5ibG9ja19zaXplICo9IHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisKKyAgICBiLT5zYW1wbGVzX3Blcl9ibG9jayA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgYi0+bGFzdF9ibG9ja191c2VkX2J5dGVzID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBpZiAoYi0+bGFzdF9ibG9ja191c2VkX2J5dGVzID4gVUlOVDE2X01BWCAvIHN0LT5jb2RlYy0+Y2hhbm5lbHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGItPmxhc3RfYmxvY2tfdXNlZF9ieXRlcyAqPSBzdC0+Y29kZWMtPmNoYW5uZWxzOworCisgICAgYXZpb19za2lwKHMtPnBiLCA0KTsgLy8gbGFzdCBibG9jayBzYW1wbGVzCisgICAgYXZpb19za2lwKHMtPnBiLCA0KTsgLy8gbGFzdCBibG9jayBzaXplCisKKyAgICBpZiAoY29kZWMgPT0gQVZfQ09ERUNfSURfQURQQ01fVEhQKSB7CisgICAgICAgIGludCBjaDsKKworICAgICAgICBhdmlvX3NraXAocy0+cGIsIHBvcyArIHRvZmZzZXQgLSBhdmlvX3RlbGwocy0+cGIpKTsKKyAgICAgICAgdG9mZnNldCA9IGF2aW9fcmIzMihzLT5wYikgKyAxNkxMOworICAgICAgICBpZiAodG9mZnNldCA+IHNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBhdmlvX3NraXAocy0+cGIsIHBvcyArIHRvZmZzZXQgLSBhdmlvX3RlbGwocy0+cGIpKTsKKyAgICAgICAgYi0+dGFibGUgPSBhdl9tYWxsb2N6KDMyICogc3QtPmNvZGVjLT5jaGFubmVscyk7CisgICAgICAgIGlmICghYi0+dGFibGUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHN0LT5jb2RlYy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocy0+cGIsIGItPnRhYmxlICsgY2ggKiAzMiwgMzIpICE9IDMyKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIDI0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplIDwgKGF2aW9fdGVsbChzLT5wYikgLSBwb3MpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgYXZpb19za2lwKHMtPnBiLCBzaXplIC0gKGF2aW9fdGVsbChzLT5wYikgLSBwb3MpKTsKKworICAgIHdoaWxlICghYXZpb19mZW9mKHMtPnBiKSkgeworICAgICAgICBjaHVuayA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgIHNpemUgID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICAgICAgaWYgKHNpemUgPCA4KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHNpemUgLT0gODsKKyAgICAgICAgc3dpdGNoIChjaHVuaykgeworICAgICAgICBjYXNlIE1LVEFHKCdBJywnRCcsJ1AnLCdDJyk6CisgICAgICAgICAgICBpZiAoY29kZWMgIT0gQVZfQ09ERUNfSURfQURQQ01fVEhQKQorICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKKworICAgICAgICAgICAgYXNpemUgPSBiLT5ibG9ja19jb3VudCAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiA0OworICAgICAgICAgICAgaWYgKHNpemUgPCBhc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGItPmFkcGMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJza2lwcGluZyBhZGRpdGlvbmFsIEFEUEMgY2h1bmtcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYi0+YWRwYyA9IGF2X21hbGxvY3ooYXNpemUpOworICAgICAgICAgICAgICAgIGlmICghYi0+YWRwYykgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZpb19yZWFkKHMtPnBiLCBiLT5hZHBjLCBhc2l6ZSk7CisgICAgICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCBzaXplIC0gYXNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ0QnLCdBJywnVCcsJ0EnKToKKyAgICAgICAgICAgIGlmICgoc3RhcnQgPCBhdmlvX3RlbGwocy0+cGIpKSB8fAorICAgICAgICAgICAgICAgICghYi0+YWRwYyAmJiBjb2RlYyA9PSBBVl9DT0RFQ19JRF9BRFBDTV9USFApKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIHN0YXJ0IC0gYXZpb190ZWxsKHMtPnBiKSk7CisKKyAgICAgICAgICAgIGlmIChtYWpvciAhPSAxIHx8IG1pbm9yKQorICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiVmVyc2lvbiAlZC4lZCIsIG1ham9yLCBtaW5vcik7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAic2tpcHBpbmcgdW5rbm93biBjaHVuazogJVhcbiIsIGNodW5rKTsKK3NraXA6CisgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIHNpemUpOworICAgICAgICB9CisgICAgfQorCitmYWlsOgorICAgIHJlYWRfY2xvc2Uocyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBCUlNUTURlbXV4Q29udGV4dCAqYiA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50MzJfdCBzYW1wbGVzLCBzaXplOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZpb19mZW9mKHMtPnBiKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIGItPmN1cnJlbnRfYmxvY2srKzsKKyAgICBpZiAoYi0+Y3VycmVudF9ibG9jayA9PSBiLT5ibG9ja19jb3VudCkgeworICAgICAgICBzaXplICAgID0gYi0+bGFzdF9ibG9ja191c2VkX2J5dGVzOworICAgICAgICBzYW1wbGVzID0gc2l6ZSAvICg4ICogY29kZWMtPmNoYW5uZWxzKSAqIDE0OworICAgIH0gZWxzZSBpZiAoYi0+Y3VycmVudF9ibG9jayA8IGItPmJsb2NrX2NvdW50KSB7CisgICAgICAgIHNpemUgICAgPSBiLT5ibG9ja19zaXplOworICAgICAgICBzYW1wbGVzID0gYi0+c2FtcGxlc19wZXJfYmxvY2s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0KKworICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fVEhQKSB7CisgICAgICAgIHVpbnQ4X3QgKmRzdDsKKworICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIDggKyAoMzIgKyA0KSAqIGNvZGVjLT5jaGFubmVscyArIHNpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGRzdCA9IHBrdC0+ZGF0YTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmZHN0LCBzaXplKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmZHN0LCBzYW1wbGVzKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZkc3QsIGItPnRhYmxlLCAzMiAqIGNvZGVjLT5jaGFubmVscyk7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmZHN0LCBiLT5hZHBjICsgNCAqIGNvZGVjLT5jaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYi0+Y3VycmVudF9ibG9jayAtIDEpLCA0ICogY29kZWMtPmNoYW5uZWxzKTsKKworICAgICAgICByZXQgPSBhdmlvX3JlYWQocy0+cGIsIGRzdCwgc2l6ZSk7CisgICAgICAgIGlmIChyZXQgIT0gc2l6ZSkKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgIHBrdC0+ZHVyYXRpb24gPSBzYW1wbGVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisgICAgfQorCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworCisgICAgaWYgKHJldCAhPSBzaXplKQorICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitBVklucHV0Rm9ybWF0IGZmX2Jyc3RtX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImJyc3RtIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQlJTVE0gKEJpbmFyeSBSZXZvbHV0aW9uIFN0cmVhbSkiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQlJTVE1EZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHByb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHJlYWRfY2xvc2UsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImJyc3RtIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvYzkzLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvYzkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhNjFiZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9jOTMuYwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIEludGVycGxheSBDOTMgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZvYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90IGluZGV4OworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgZnJhbWVzOworfSBDOTNCbG9ja1JlY29yZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZvY0RlY0NvbnRleHQgdm9jOworCisgICAgQzkzQmxvY2tSZWNvcmQgYmxvY2tfcmVjb3Jkc1s1MTJdOworICAgIGludCBjdXJyZW50X2Jsb2NrOworCisgICAgdWludDMyX3QgZnJhbWVfb2Zmc2V0c1szMl07CisgICAgaW50IGN1cnJlbnRfZnJhbWU7CisgICAgaW50IG5leHRfcGt0X2lzX2F1ZGlvOworCisgICAgQVZTdHJlYW0gKmF1ZGlvOworfSBDOTNEZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IGk7CisgICAgaW50IGluZGV4ID0gMTsKKyAgICBpZiAocC0+YnVmX3NpemUgPCAxNikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDQpIHsKKyAgICAgICAgaWYgKEFWX1JMMTYocC0+YnVmICsgaSkgIT0gaW5kZXggfHwgIXAtPmJ1ZltpICsgMl0gfHwgIXAtPmJ1ZltpICsgM10pCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaW5kZXggKz0gcC0+YnVmW2kgKyAyXTsKKyAgICB9CisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlN0cmVhbSAqdmlkZW87CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQzkzRGVtdXhDb250ZXh0ICpjOTMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisgICAgaW50IGZyYW1lY291bnQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisgICAgICAgIGM5My0+YmxvY2tfcmVjb3Jkc1tpXS5pbmRleCA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIGM5My0+YmxvY2tfcmVjb3Jkc1tpXS5sZW5ndGggPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgYzkzLT5ibG9ja19yZWNvcmRzW2ldLmZyYW1lcyA9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAoYzkzLT5ibG9ja19yZWNvcmRzW2ldLmZyYW1lcyA+IDMyKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidG9vIG1hbnkgZnJhbWVzIGluIGJsb2NrXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGZyYW1lY291bnQgKz0gYzkzLT5ibG9ja19yZWNvcmRzW2ldLmZyYW1lczsKKyAgICB9CisKKyAgICAvKiBBdWRpbyBzdHJlYW1zIGFyZSBhZGRlZCBpZiBhdWRpbyBwYWNrZXRzIGFyZSBmb3VuZCAqLworICAgIHMtPmN0eF9mbGFncyB8PSBBVkZNVENUWF9OT0hFQURFUjsKKworICAgIHZpZGVvID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXZpZGVvKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgdmlkZW8tPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHZpZGVvLT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9DOTM7CisgICAgdmlkZW8tPmNvZGVjLT53aWR0aCA9IDMyMDsKKyAgICB2aWRlby0+Y29kZWMtPmhlaWdodCA9IDE5MjsKKyAgICAvKiA0OjMgMzIweDIwMCB3aXRoIDggZW1wdHkgbGluZXMgKi8KKyAgICB2aWRlby0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKSB7IDUsIDYgfTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZpZGVvLCA2NCwgMiwgMjUpOworICAgIHZpZGVvLT5uYl9mcmFtZXMgPSBmcmFtZWNvdW50OworICAgIHZpZGVvLT5kdXJhdGlvbiA9IGZyYW1lY291bnQ7CisgICAgdmlkZW8tPnN0YXJ0X3RpbWUgPSAwOworCisgICAgYzkzLT5jdXJyZW50X2Jsb2NrID0gMDsKKyAgICBjOTMtPmN1cnJlbnRfZnJhbWUgPSAwOworICAgIGM5My0+bmV4dF9wa3RfaXNfYXVkaW8gPSAwOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEM5M19IQVNfUEFMRVRURSAweDAxCisjZGVmaW5lIEM5M19GSVJTVF9GUkFNRSAweDAyCisKK3N0YXRpYyBpbnQgcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEM5M0RlbXV4Q29udGV4dCAqYzkzID0gcy0+cHJpdl9kYXRhOworICAgIEM5M0Jsb2NrUmVjb3JkICpiciA9ICZjOTMtPmJsb2NrX3JlY29yZHNbYzkzLT5jdXJyZW50X2Jsb2NrXTsKKyAgICBpbnQgZGF0YXNpemU7CisgICAgaW50IHJldCwgaTsKKworICAgIGlmIChjOTMtPm5leHRfcGt0X2lzX2F1ZGlvKSB7CisgICAgICAgIGM5My0+Y3VycmVudF9mcmFtZSsrOworICAgICAgICBjOTMtPm5leHRfcGt0X2lzX2F1ZGlvID0gMDsKKyAgICAgICAgZGF0YXNpemUgPSBhdmlvX3JsMTYocGIpOworICAgICAgICBpZiAoZGF0YXNpemUgPiA0MikgeworICAgICAgICAgICAgaWYgKCFjOTMtPmF1ZGlvKSB7CisgICAgICAgICAgICAgICAgYzkzLT5hdWRpbyA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKCFjOTMtPmF1ZGlvKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGM5My0+YXVkaW8tPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb19za2lwKHBiLCAyNik7IC8qIFZPQyBoZWFkZXIgKi8KKyAgICAgICAgICAgIHJldCA9IGZmX3ZvY19nZXRfcGFja2V0KHMsIHBrdCwgYzkzLT5hdWRpbywgZGF0YXNpemUgLSAyNik7CisgICAgICAgICAgICBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMTsKKyAgICAgICAgICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChjOTMtPmN1cnJlbnRfZnJhbWUgPj0gYnItPmZyYW1lcykgeworICAgICAgICBpZiAoYzkzLT5jdXJyZW50X2Jsb2NrID49IDUxMSB8fCAhYnJbMV0ubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICBicisrOworICAgICAgICBjOTMtPmN1cnJlbnRfYmxvY2srKzsKKyAgICAgICAgYzkzLT5jdXJyZW50X2ZyYW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAoYzkzLT5jdXJyZW50X2ZyYW1lID09IDApIHsKKyAgICAgICAgYXZpb19zZWVrKHBiLCBici0+aW5kZXggKiAyMDQ4LCBTRUVLX1NFVCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgICAgICBjOTMtPmZyYW1lX29mZnNldHNbaV0gPSBhdmlvX3JsMzIocGIpOworICAgICAgICB9CisgICAgfQorCisgICAgYXZpb19zZWVrKHBiLGJyLT5pbmRleCAqIDIwNDggKworICAgICAgICAgICAgYzkzLT5mcmFtZV9vZmZzZXRzW2M5My0+Y3VycmVudF9mcmFtZV0sIFNFRUtfU0VUKTsKKyAgICBkYXRhc2l6ZSA9IGF2aW9fcmwxNihwYik7IC8qIHZpZGVvIGZyYW1lIHNpemUgKi8KKworICAgIHJldCA9IGF2X25ld19wYWNrZXQocGt0LCBkYXRhc2l6ZSArIDc2OCArIDEpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHBrdC0+ZGF0YVswXSA9IDA7CisgICAgcGt0LT5zaXplID0gZGF0YXNpemUgKyAxOworCisgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBwa3QtPmRhdGEgKyAxLCBkYXRhc2l6ZSk7CisgICAgaWYgKHJldCA8IGRhdGFzaXplKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGRhdGFzaXplID0gYXZpb19ybDE2KHBiKTsgLyogcGFsZXR0ZSBzaXplICovCisgICAgaWYgKGRhdGFzaXplKSB7CisgICAgICAgIGlmIChkYXRhc2l6ZSAhPSA3NjgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHBhbGV0dGUgc2l6ZSAldVxuIiwgZGF0YXNpemUpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBwa3QtPmRhdGFbMF0gfD0gQzkzX0hBU19QQUxFVFRFOworICAgICAgICByZXQgPSBhdmlvX3JlYWQocGIsIHBrdC0+ZGF0YSArIHBrdC0+c2l6ZSwgZGF0YXNpemUpOworICAgICAgICBpZiAocmV0IDwgZGF0YXNpemUpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBwa3QtPnNpemUgKz0gNzY4OworICAgIH0KKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgYzkzLT5uZXh0X3BrdF9pc19hdWRpbyA9IDE7CisKKyAgICAvKiBvbmx5IHRoZSBmaXJzdCBmcmFtZSBpcyBndWFyYW50ZWVkIHRvIG5vdCByZWZlcmVuY2UgcHJldmlvdXMgZnJhbWVzICovCisgICAgaWYgKGM5My0+Y3VycmVudF9ibG9jayA9PSAwICYmIGM5My0+Y3VycmVudF9mcmFtZSA9PSAwKSB7CisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICBwa3QtPmRhdGFbMF0gfD0gQzkzX0ZJUlNUX0ZSQU1FOworICAgIH0KKyAgICByZXR1cm4gMDsKKworICAgIGZhaWw6CisgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitBVklucHV0Rm9ybWF0IGZmX2M5M19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjOTMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJJbnRlcnBsYXkgQzkzIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEM5M0RlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcmVhZF9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2NhY2hlLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWY4MWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2NhY2hlLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBJbnB1dCBjYWNoZSBwcm90b2NvbC4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICoKKyAqIEJhc2VkIG9uIGZpbGUuYyBieSBGYWJyaWNlIEJlbGxhcmQKKyAqLworCisvKioKKyAqIEBUT0RPCisgKiAgICAgIHN1cHBvcnQgbm9uIGNvbnRpbnVvdXMgY2FjaGluZworICogICAgICBzdXBwb3J0IGtlZXBpbmcgZmlsZXMKKyAqICAgICAgc3VwcG9ydCBmaWxsaW5nIHdpdGggYSBiYWNrZ3JvdW5kIHRocmVhZAorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlsZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZiBIQVZFX0lPX0gKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvc19zdXBwb3J0LmgiCisjaW5jbHVkZSAidXJsLmgiCisKK3R5cGVkZWYgc3RydWN0IENvbnRleHQgeworICAgIGludCBmZDsKKyAgICBpbnQ2NF90IGVuZDsKKyAgICBpbnQ2NF90IHBvczsKKyAgICBVUkxDb250ZXh0ICppbm5lcjsKK30gQ29udGV4dDsKKworc3RhdGljIGludCBjYWNoZV9vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICAgIGNoYXIgKmJ1ZmZlcm5hbWU7CisgICAgQ29udGV4dCAqYz0gaC0+cHJpdl9kYXRhOworCisgICAgYXZfc3Ryc3RhcnQoYXJnLCAiY2FjaGU6IiwgJmFyZyk7CisKKyAgICBjLT5mZCA9IGF2X3RlbXBmaWxlKCJmZmNhY2hlIiwgJmJ1ZmZlcm5hbWUsIDAsIGgpOworICAgIGlmIChjLT5mZCA8IDApeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wZmlsZVxuIik7CisgICAgICAgIHJldHVybiBjLT5mZDsKKyAgICB9CisKKyAgICB1bmxpbmsoYnVmZmVybmFtZSk7CisgICAgYXZfZnJlZXAoJmJ1ZmZlcm5hbWUpOworCisgICAgcmV0dXJuIGZmdXJsX29wZW4oJmMtPmlubmVyLCBhcmcsIGZsYWdzLCAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMKTsKK30KKworc3RhdGljIGludCBjYWNoZV9yZWFkKFVSTENvbnRleHQgKmgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgQ29udGV4dCAqYz0gaC0+cHJpdl9kYXRhOworICAgIGludCByOworCisgICAgaWYoYy0+cG9zPGMtPmVuZCl7CisgICAgICAgIHIgPSByZWFkKGMtPmZkLCBidWYsIEZGTUlOKHNpemUsIGMtPmVuZCAtIGMtPnBvcykpOworICAgICAgICBpZihyPjApCisgICAgICAgICAgICBjLT5wb3MgKz0gcjsKKyAgICAgICAgcmV0dXJuICgtMSA9PSByKT9BVkVSUk9SKGVycm5vKTpyOworICAgIH1lbHNleworICAgICAgICByID0gZmZ1cmxfcmVhZChjLT5pbm5lciwgYnVmLCBzaXplKTsKKyAgICAgICAgaWYociA+IDApeworICAgICAgICAgICAgaW50IHIyPSB3cml0ZShjLT5mZCwgYnVmLCByKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAocjI9PXIpOyAvLyBGSVhNRSBoYW5kbGUgY2FjaGUgZmFpbHVyZQorICAgICAgICAgICAgYy0+cG9zICs9IHI7CisgICAgICAgICAgICBjLT5lbmQgKz0gcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQ2NF90IGNhY2hlX3NlZWsoVVJMQ29udGV4dCAqaCwgaW50NjRfdCBwb3MsIGludCB3aGVuY2UpCit7CisgICAgQ29udGV4dCAqYz0gaC0+cHJpdl9kYXRhOworCisgICAgaWYgKHdoZW5jZSA9PSBBVlNFRUtfU0laRSkgeworICAgICAgICBwb3M9IGZmdXJsX3NlZWsoYy0+aW5uZXIsIHBvcywgd2hlbmNlKTsKKyAgICAgICAgaWYocG9zIDw9IDApeworICAgICAgICAgICAgcG9zPSBmZnVybF9zZWVrKGMtPmlubmVyLCAtMSwgU0VFS19FTkQpOworICAgICAgICAgICAgZmZ1cmxfc2VlayhjLT5pbm5lciwgYy0+ZW5kLCBTRUVLX1NFVCk7CisgICAgICAgICAgICBpZihwb3MgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYy0+ZW5kOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgcG9zPSBsc2VlayhjLT5mZCwgcG9zLCB3aGVuY2UpOworICAgIGlmKHBvczwwKXsKKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9ZWxzZSBpZihwb3MgPD0gYy0+ZW5kKXsKKyAgICAgICAgYy0+cG9zPSBwb3M7CisgICAgICAgIHJldHVybiBwb3M7CisgICAgfWVsc2V7CisgICAgICAgIGlmKGxzZWVrKGMtPmZkLCBjLT5wb3MsIFNFRUtfU0VUKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJGYWlsdXJlIHRvIHNlZWsgaW4gY2FjaGVcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVQSVBFKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY2FjaGVfY2xvc2UoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBDb250ZXh0ICpjPSBoLT5wcml2X2RhdGE7CisgICAgY2xvc2UoYy0+ZmQpOworICAgIGZmdXJsX2Nsb3NlKGMtPmlubmVyKTsKKworICAgIHJldHVybiAwOworfQorCitVUkxQcm90b2NvbCBmZl9jYWNoZV9wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJjYWNoZSIsCisgICAgLnVybF9vcGVuICAgICAgICAgICAgPSBjYWNoZV9vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gY2FjaGVfcmVhZCwKKyAgICAudXJsX3NlZWsgICAgICAgICAgICA9IGNhY2hlX3NlZWssCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgPSBjYWNoZV9jbG9zZSwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICA9IHNpemVvZihDb250ZXh0KSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvY2FmLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvY2FmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlY2M5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9jYWYuYwpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ0FGIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgIEp1c3RpbiBSdWdnbGVzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENBRiBjb21tb24gY29kZQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiY2FmLmgiCisKKy8qKgorICogS25vd24gY29kZWMgdGFncyBmb3IgQ0FGCisgKi8KK2NvbnN0IEFWQ29kZWNUYWcgZmZfY29kZWNfY2FmX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX0FBQywgICAgICAgICAgICAgTUtUQUcoJ2EnLCdhJywnYycsJyAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQUMzLCAgICAgICAgICAgICBNS1RBRygnYScsJ2MnLCctJywnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQsICAgIE1LVEFHKCdpJywnbScsJ2EnLCc0JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYsICAgTUtUQUcoJ20nLCdzJywgMCwgMTcgKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQURQQ01fTVMsICAgICAgICBNS1RBRygnbScsJ3MnLCAwLCAgMiApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BTEFDLCAgICAgICAgICAgIE1LVEFHKCdhJywnbCcsJ2EnLCdjJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FNUl9OQiwgICAgICAgICAgTUtUQUcoJ3MnLCdhJywnbScsJ3InKSB9LAorICAvKiBGSVhNRTogdXNlIERWIGRlbXV4ZXIsIGFzIGRvbmUgaW4gTU9WICovCisgIC8qeyBBVl9DT0RFQ19JRF9EVkFVRElPLCAgICAgICAgIE1LVEFHKCd2JywnZCcsJ3YnLCdhJykgfSwqLworICAvKnsgQVZfQ09ERUNfSURfRFZBVURJTywgICAgICAgICBNS1RBRygnZCcsJ3YnLCdjJywnYScpIH0sKi8KKyAgICB7IEFWX0NPREVDX0lEX0dTTSwgICAgICAgICAgICAgTUtUQUcoJ2EnLCdnJywncycsJ20nKSB9LAorICAgIHsgQVZfQ09ERUNfSURfR1NNX01TLCAgICAgICAgICBNS1RBRygnbScsJ3MnLCAwLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9JTEJDLCAgICAgICAgICAgIE1LVEFHKCdpJywnbCcsJ2InLCdjJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BQ0UzLCAgICAgICAgICAgTUtUQUcoJ00nLCdBJywnQycsJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUFDRTYsICAgICAgICAgICBNS1RBRygnTScsJ0EnLCdDJywnNicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUDEsICAgICAgICAgICAgIE1LVEFHKCcuJywnbScsJ3AnLCcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QMiwgICAgICAgICAgICAgTUtUQUcoJy4nLCdtJywncCcsJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVAzLCAgICAgICAgICAgICBNS1RBRygnLicsJ20nLCdwJywnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUDMsICAgICAgICAgICAgIE1LVEFHKCdtJywncycsIDAgLCdVJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9BTEFXLCAgICAgICAgTUtUQUcoJ2EnLCdsJywnYScsJ3cnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX01VTEFXLCAgICAgICBNS1RBRygndScsJ2wnLCdhJywndycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9RQ0VMUCwgICAgICAgICAgIE1LVEFHKCdRJywnYycsJ2wnLCdwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1FETTIsICAgICAgICAgICAgTUtUQUcoJ1EnLCdEJywnTScsJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUURNMiwgICAgICAgICAgICBNS1RBRygnUScsJ0QnLCdNJywnQycpIH0sCisgIC8qIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBjb2RlY3MgKi8KKyAgLyp7IEFDLTMgb3ZlciBTL1BESUYgICAgICAgICAgTUtUQUcoJ2MnLCdhJywnYycsJzMnKSB9LCovCisgIC8qeyBNUEVHNENFTFAgICAgICAgICAgICAgICAgIE1LVEFHKCdjJywnZScsJ2wnLCdwJykgfSwqLworICAvKnsgTVBFRzRIVlhDICAgICAgICAgICAgICAgICBNS1RBRygnaCcsJ3YnLCd4JywnYycpIH0sKi8KKyAgLyp7IE1QRUc0VHdpblZRICAgICAgICAgICAgICAgTUtUQUcoJ3QnLCd3JywndicsJ3EnKSB9LCovCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAgICAgICAgICAgIDAgfSwKK307CisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9jYWYuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9jYWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzI1ZjJjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2NhZi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDQUYgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAwNyAgSnVzdGluIFJ1Z2dsZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ0FGIGNvbW1vbiBjb2RlCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9DQUZfSAorI2RlZmluZSBBVkZPUk1BVF9DQUZfSAorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZXh0ZXJuIGNvbnN0IEFWQ29kZWNUYWcgZmZfY29kZWNfY2FmX3RhZ3NbXTsKKworI2VuZGlmIC8qIEFWRk9STUFUX0NBRl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvY2FmZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvY2FmZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1MThkNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9jYWZkZWMuYwpAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIENvcmUgQXVkaW8gRm9ybWF0IGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBKdXN0aW4gUnVnZ2xlcworICogQ29weXJpZ2h0IChjKSAyMDA5IFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ29yZSBBdWRpbyBGb3JtYXQgZGVtdXhlcgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImlzb20uaCIKKyNpbmNsdWRlICJtb3ZfY2hhbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImNhZi5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGJ5dGVzX3Blcl9wYWNrZXQ7ICAgICAgICAgICAvLy88IGJ5dGVzIGluIGEgcGFja2V0LCBvciAwIGlmIHZhcmlhYmxlCisgICAgaW50IGZyYW1lc19wZXJfcGFja2V0OyAgICAgICAgICAvLy88IGZyYW1lcyBpbiBhIHBhY2tldCwgb3IgMCBpZiB2YXJpYWJsZQorICAgIGludDY0X3QgbnVtX2J5dGVzOyAgICAgICAgICAgICAgLy8vPCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gc3RyZWFtCisKKyAgICBpbnQ2NF90IHBhY2tldF9jbnQ7ICAgICAgICAgICAgIC8vLzwgcGFja2V0IGNvdW50ZXIKKyAgICBpbnQ2NF90IGZyYW1lX2NudDsgICAgICAgICAgICAgIC8vLzwgZnJhbWUgY291bnRlcgorCisgICAgaW50NjRfdCBkYXRhX3N0YXJ0OyAgICAgICAgICAgICAvLy88IGRhdGEgc3RhcnQgcG9zaXRpb24sIGluIGJ5dGVzCisgICAgaW50NjRfdCBkYXRhX3NpemU7ICAgICAgICAgICAgICAvLy88IHJhdyBkYXRhIHNpemUsIGluIGJ5dGVzCit9IENhZkNvbnRleHQ7CisKK3N0YXRpYyBpbnQgcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKEFWX1JCMzIocC0+YnVmKSA9PSBNS0JFVEFHKCdjJywnYScsJ2YnLCdmJykgJiYgQVZfUkIxNigmcC0+YnVmWzRdKSA9PSAxKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBSZWFkIGF1ZGlvIGRlc2NyaXB0aW9uIGNodW5rICovCitzdGF0aWMgaW50IHJlYWRfZGVzY19jaHVuayhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQ2FmQ29udGV4dCAqY2FmID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgZmxhZ3M7CisKKyAgICAvKiBuZXcgYXVkaW8gc3RyZWFtICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBwYXJzZSBmb3JtYXQgZGVzY3JpcHRpb24gKi8KKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgPSBhdmlvX3JsMzIocGIpOworICAgIGZsYWdzID0gYXZpb19yYjMyKHBiKTsKKyAgICBjYWYtPmJ5dGVzX3Blcl9wYWNrZXQgID0gYXZpb19yYjMyKHBiKTsKKyAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gY2FmLT5ieXRlc19wZXJfcGFja2V0OworICAgIGNhZi0+ZnJhbWVzX3Blcl9wYWNrZXQgPSBhdmlvX3JiMzIocGIpOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBhdmlvX3JiMzIocGIpOworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZpb19yYjMyKHBiKTsKKworICAgIC8qIGNhbGN1bGF0ZSBiaXQgcmF0ZSBmb3IgY29uc3RhbnQgc2l6ZSBwYWNrZXRzICovCisgICAgaWYgKGNhZi0+ZnJhbWVzX3Blcl9wYWNrZXQgPiAwICYmIGNhZi0+Ynl0ZXNfcGVyX3BhY2tldCA+IDApIHsKKyAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9ICh1aW50NjRfdClzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICogKHVpbnQ2NF90KWNhZi0+Ynl0ZXNfcGVyX3BhY2tldCAqIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHVpbnQ2NF90KWNhZi0+ZnJhbWVzX3Blcl9wYWNrZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IDA7CisgICAgfQorCisgICAgLyogZGV0ZXJtaW5lIGNvZGVjICovCisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdGFnID09IE1LVEFHKCdsJywncCcsJ2MnLCdtJykpCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9tb3ZfZ2V0X2xwY21fY29kZWNfaWQoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsIChmbGFncyBeIDB4MikgfCAweDQpOworICAgIGVsc2UKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19jYWZfdGFncywgc3QtPmNvZGVjLT5jb2RlY190YWcpOworICAgIHJldHVybiAwOworfQorCisvKiogUmVhZCBtYWdpYyBjb29raWUgY2h1bmsgKi8KK3N0YXRpYyBpbnQgcmVhZF9rdWtpX2NodW5rKEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCBzaXplKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdCAgICAgID0gcy0+c3RyZWFtc1swXTsKKworICAgIGlmIChzaXplIDwgMCB8fCBzaXplID4gSU5UX01BWCAtIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgeworICAgICAgICAvKiBUaGUgbWFnaWMgY29va2llIGZvcm1hdCBmb3IgQUFDIGlzIGFuIG1wNCBlc2RzIGF0b20uCisgICAgICAgICAgIFRoZSBsYXZjIEFBQyBkZWNvZGVyIHJlcXVpcmVzIHRoZSBkYXRhIGZyb20gdGhlIGNvZGVjIHNwZWNpZmljCisgICAgICAgICAgIGRlc2NyaXB0aW9uIGFzIGV4dHJhZGF0YSBpbnB1dC4gKi8KKyAgICAgICAgaW50IHN0cnQsIHNraXA7CisKKyAgICAgICAgc3RydCA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGZmX21vdl9yZWFkX2VzZHMocywgcGIpOworICAgICAgICBza2lwID0gc2l6ZSAtIChhdmlvX3RlbGwocGIpIC0gc3RydCk7CisgICAgICAgIGlmIChza2lwIDwgMCB8fCAhc3QtPmNvZGVjLT5leHRyYWRhdGEgfHwKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBBQUMgbWFnaWMgY29va2llXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGF2aW9fc2tpcChwYiwgc2tpcCk7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FMQUMpIHsKKyNkZWZpbmUgQUxBQ19QUkVBTUJMRSAxMgorI2RlZmluZSBBTEFDX0hFQURFUiAgIDM2CisjZGVmaW5lIEFMQUNfTkVXX0tVS0kgMjQKKyAgICAgICAgdWludDhfdCBwcmVhbWJsZVsxMl07CisgICAgICAgIGlmIChzaXplIDwgQUxBQ19ORVdfS1VLSSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgQUxBQyBtYWdpYyBjb29raWVcbiIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGF2aW9fcmVhZChwYiwgcHJlYW1ibGUsIEFMQUNfUFJFQU1CTEUpOworCisgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBBTEFDX0hFQURFUikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIC8qIEZvciB0aGUgb2xkIHN0eWxlIGNvb2tpZSwgd2Ugc2tpcCAxMiBieXRlcywgdGhlbiByZWFkIDM2IGJ5dGVzLgorICAgICAgICAgKiBUaGUgbmV3IHN0eWxlIGNvb2tpZSBvbmx5IGNvbnRhaW5zIHRoZSBsYXN0IDI0IGJ5dGVzIG9mIHdoYXQgd2FzCisgICAgICAgICAqIDM2IGJ5dGVzIGluIHRoZSBvbGQgc3R5bGUgY29va2llLCBzbyB3ZSBmYWJyaWNhdGUgdGhlIGZpcnN0IDEyIGJ5dGVzCisgICAgICAgICAqIGluIHRoYXQgY2FzZSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5LiAqLworICAgICAgICBpZiAoIW1lbWNtcCgmcHJlYW1ibGVbNF0sICJmcm1hYWxhYyIsIDgpKSB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IEFMQUNfUFJFQU1CTEUgKyBBTEFDX0hFQURFUikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIEFMQUMgbWFnaWMgY29va2llXG4iKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSwgQUxBQ19IRUFERVIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gQUxBQ19QUkVBTUJMRSAtIEFMQUNfSEVBREVSKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFWX1dCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEsIDM2KTsKKyAgICAgICAgICAgIG1lbWNweSgmc3QtPmNvZGVjLT5leHRyYWRhdGFbNF0sICJhbGFjIiwgNCk7CisgICAgICAgICAgICBBVl9XQjMyKCZzdC0+Y29kZWMtPmV4dHJhZGF0YVs4XSwgMCk7CisgICAgICAgICAgICBtZW1jcHkoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhWzEyXSwgcHJlYW1ibGUsIDEyKTsKKyAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgJnN0LT5jb2RlYy0+ZXh0cmFkYXRhWzI0XSwgQUxBQ19ORVdfS1VLSSAtIDEyKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSAtIEFMQUNfTkVXX0tVS0kpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqIFJlYWQgcGFja2V0IHRhYmxlIGNodW5rICovCitzdGF0aWMgaW50IHJlYWRfcGFrdF9jaHVuayhBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3Qgc2l6ZSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3QgICAgICA9IHMtPnN0cmVhbXNbMF07CisgICAgQ2FmQ29udGV4dCAqY2FmICAgPSBzLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBwb3MgPSAwLCBjY291bnQsIG51bV9wYWNrZXRzOworICAgIGludCBpOworCisgICAgY2NvdW50ID0gYXZpb190ZWxsKHBiKTsKKworICAgIG51bV9wYWNrZXRzID0gYXZpb19yYjY0KHBiKTsKKyAgICBpZiAobnVtX3BhY2tldHMgPCAwIHx8IElOVDMyX01BWCAvIHNpemVvZihBVkluZGV4RW50cnkpIDwgbnVtX3BhY2tldHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3QtPm5iX2ZyYW1lcyAgPSBhdmlvX3JiNjQocGIpOyAvKiB2YWxpZCBmcmFtZXMgKi8KKyAgICBzdC0+bmJfZnJhbWVzICs9IGF2aW9fcmIzMihwYik7IC8qIHByaW1pbmcgZnJhbWVzICovCisgICAgc3QtPm5iX2ZyYW1lcyArPSBhdmlvX3JiMzIocGIpOyAvKiByZW1haW5kZXIgZnJhbWVzICovCisKKyAgICBzdC0+ZHVyYXRpb24gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFja2V0czsgaSsrKSB7CisgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeShzLT5zdHJlYW1zWzBdLCBwb3MsIHN0LT5kdXJhdGlvbiwgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgICAgIHBvcyArPSBjYWYtPmJ5dGVzX3Blcl9wYWNrZXQgPyBjYWYtPmJ5dGVzX3Blcl9wYWNrZXQgOiBmZl9tcDRfcmVhZF9kZXNjcl9sZW4ocGIpOworICAgICAgICBzdC0+ZHVyYXRpb24gKz0gY2FmLT5mcmFtZXNfcGVyX3BhY2tldCA/IGNhZi0+ZnJhbWVzX3Blcl9wYWNrZXQgOiBmZl9tcDRfcmVhZF9kZXNjcl9sZW4ocGIpOworICAgIH0KKworICAgIGlmIChhdmlvX3RlbGwocGIpIC0gY2NvdW50ID4gc2l6ZSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZXJyb3IgcmVhZGluZyBwYWNrZXQgdGFibGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYXZpb19za2lwKHBiLCBjY291bnQgKyBzaXplIC0gYXZpb190ZWxsKHBiKSk7CisKKyAgICBjYWYtPm51bV9ieXRlcyA9IHBvczsKKyAgICByZXR1cm4gMDsKK30KKworLyoqIFJlYWQgaW5mb3JtYXRpb24gY2h1bmsgKi8KK3N0YXRpYyB2b2lkIHJlYWRfaW5mb19jaHVuayhBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3Qgc2l6ZSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB1bnNpZ25lZCBpbnQgbmJfZW50cmllcyA9IGF2aW9fcmIzMihwYik7CisgICAgZm9yIChpID0gMDsgaSA8IG5iX2VudHJpZXMgJiYgIWF2aW9fZmVvZihwYik7IGkrKykgeworICAgICAgICBjaGFyIGtleVszMl07CisgICAgICAgIGNoYXIgdmFsdWVbMTAyNF07CisgICAgICAgIGF2aW9fZ2V0X3N0cihwYiwgSU5UX01BWCwga2V5LCBzaXplb2Yoa2V5KSk7CisgICAgICAgIGF2aW9fZ2V0X3N0cihwYiwgSU5UX01BWCwgdmFsdWUsIHNpemVvZih2YWx1ZSkpOworICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsIGtleSwgdmFsdWUsIDApOworICAgIH0KK30KKworc3RhdGljIGludCByZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQ2FmQ29udGV4dCAqY2FmID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICB1aW50MzJfdCB0YWcgPSAwOworICAgIGludCBmb3VuZF9kYXRhLCByZXQ7CisgICAgaW50NjRfdCBzaXplLCBwb3M7CisKKyAgICBhdmlvX3NraXAocGIsIDgpOyAvKiBtYWdpYywgdmVyc2lvbiwgZmlsZSBmbGFncyAqLworCisgICAgLyogYXVkaW8gZGVzY3JpcHRpb24gY2h1bmsgKi8KKyAgICBpZiAoYXZpb19yYjMyKHBiKSAhPSBNS0JFVEFHKCdkJywnZScsJ3MnLCdjJykpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImRlc2MgY2h1bmsgbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgc2l6ZSA9IGF2aW9fcmI2NChwYik7CisgICAgaWYgKHNpemUgIT0gMzIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0ID0gcmVhZF9kZXNjX2NodW5rKHMpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgc3QgPSBzLT5zdHJlYW1zWzBdOworCisgICAgLyogcGFyc2UgZWFjaCBjaHVuayAqLworICAgIGZvdW5kX2RhdGEgPSAwOworICAgIHdoaWxlICghYXZpb19mZW9mKHBiKSkgeworCisgICAgICAgIC8qIHN0b3AgYXQgZGF0YSBjaHVuayBpZiBzZWVraW5nIGlzIG5vdCBzdXBwb3J0ZWQgb3IKKyAgICAgICAgICAgZGF0YSBjaHVuayBzaXplIGlzIHVua25vd24gKi8KKyAgICAgICAgaWYgKGZvdW5kX2RhdGEgJiYgKGNhZi0+ZGF0YV9zaXplIDwgMCB8fCAhcGItPnNlZWthYmxlKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHRhZyAgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBzaXplID0gYXZpb19yYjY0KHBiKTsKKyAgICAgICAgcG9zICA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgY2FzZSBNS0JFVEFHKCdkJywnYScsJ3QnLCdhJyk6CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDQpOyAvKiBlZGl0IGNvdW50ICovCisgICAgICAgICAgICBjYWYtPmRhdGFfc3RhcnQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgY2FmLT5kYXRhX3NpemUgID0gc2l6ZSA8IDAgPyAtMSA6IHNpemUgLSA0OworICAgICAgICAgICAgaWYgKGNhZi0+ZGF0YV9zaXplID4gMCAmJiBwYi0+c2Vla2FibGUpCisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBjYWYtPmRhdGFfc2l6ZSk7CisgICAgICAgICAgICBmb3VuZF9kYXRhID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUtCRVRBRygnYycsJ2gnLCdhJywnbicpOgorICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9tb3ZfcmVhZF9jaGFuKHMsIHMtPnBiLCBzdCwgc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogbWFnaWMgY29va2llIGNodW5rICovCisgICAgICAgIGNhc2UgTUtCRVRBRygnaycsJ3UnLCdrJywnaScpOgorICAgICAgICAgICAgaWYgKHJlYWRfa3VraV9jaHVuayhzLCBzaXplKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIHBhY2tldCB0YWJsZSBjaHVuayAqLworICAgICAgICBjYXNlIE1LQkVUQUcoJ3AnLCdhJywnaycsJ3QnKToKKyAgICAgICAgICAgIGlmIChyZWFkX3Bha3RfY2h1bmsocywgc2l6ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1LQkVUQUcoJ2knLCduJywnZicsJ28nKToKKyAgICAgICAgICAgIHJlYWRfaW5mb19jaHVuayhzLCBzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisjZGVmaW5lIF8oeCkgKCh4KSA+PSAnICcgPyAoeCkgOiAnICcpCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgInNraXBwaW5nIENBRiBjaHVuazogJTA4IlBSSVgzMiIgKCVjJWMlYyVjKSwgc2l6ZSAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgdGFnLCBfKHRhZz4+MjQpLCBfKCh0YWc+PjE2KSYweEZGKSwgXygodGFnPj44KSYweEZGKSwgXyh0YWcmMHhGRiksIHNpemUpOworI3VuZGVmIF8KKyAgICAgICAgY2FzZSBNS0JFVEFHKCdmJywncicsJ2UnLCdlJyk6CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgaWYgKHBvcyA+IElOVDY0X01BWCAtIHNpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIEZGTUFYKDAsIHBvcyArIHNpemUgLSBhdmlvX3RlbGwocGIpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kX2RhdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGNhZi0+Ynl0ZXNfcGVyX3BhY2tldCA+IDAgJiYgY2FmLT5mcmFtZXNfcGVyX3BhY2tldCA+IDApIHsKKyAgICAgICAgaWYgKGNhZi0+ZGF0YV9zaXplID4gMCkKKyAgICAgICAgICAgIHN0LT5uYl9mcmFtZXMgPSAoY2FmLT5kYXRhX3NpemUgLyBjYWYtPmJ5dGVzX3Blcl9wYWNrZXQpICogY2FmLT5mcmFtZXNfcGVyX3BhY2tldDsKKyAgICB9IGVsc2UgaWYgKHN0LT5uYl9pbmRleF9lbnRyaWVzICYmIHN0LT5kdXJhdGlvbiA+IDApIHsKKyAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiBjYWYtPmRhdGFfc2l6ZSAqIDggLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmR1cmF0aW9uOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIHBhY2tldCB0YWJsZS4gSXQgaXMgcmVxdWlyZWQgd2hlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibG9jayBzaXplIG9yIGZyYW1lIHNpemUgYXJlIHZhcmlhYmxlLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBzdC0+c3RhcnRfdGltZSA9IDA7CisKKyAgICAvKiBwb3NpdGlvbiB0aGUgc3RyZWFtIGF0IHRoZSBzdGFydCBvZiBkYXRhICovCisgICAgaWYgKGNhZi0+ZGF0YV9zaXplID49IDApCisgICAgICAgIGF2aW9fc2VlayhwYiwgY2FmLT5kYXRhX3N0YXJ0LCBTRUVLX1NFVCk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBDQUZfTUFYX1BLVF9TSVpFIDQwOTYKKworc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0ICAgICAgPSBzLT5zdHJlYW1zWzBdOworICAgIENhZkNvbnRleHQgKmNhZiAgID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXMsIHBrdF9zaXplID0gMCwgcGt0X2ZyYW1lcyA9IDA7CisgICAgaW50NjRfdCBsZWZ0ICAgICAgPSBDQUZfTUFYX1BLVF9TSVpFOworCisgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIC8qIGRvbid0IHJlYWQgcGFzdCBlbmQgb2YgZGF0YSBjaHVuayAqLworICAgIGlmIChjYWYtPmRhdGFfc2l6ZSA+IDApIHsKKyAgICAgICAgbGVmdCA9IChjYWYtPmRhdGFfc3RhcnQgKyBjYWYtPmRhdGFfc2l6ZSkgLSBhdmlvX3RlbGwocGIpOworICAgICAgICBpZiAoIWxlZnQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIGlmIChsZWZ0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgcGt0X2ZyYW1lcyA9IGNhZi0+ZnJhbWVzX3Blcl9wYWNrZXQ7CisgICAgcGt0X3NpemUgICA9IGNhZi0+Ynl0ZXNfcGVyX3BhY2tldDsKKworICAgIGlmIChwa3Rfc2l6ZSA+IDAgJiYgcGt0X2ZyYW1lcyA9PSAxKSB7CisgICAgICAgIHBrdF9zaXplICAgPSAoQ0FGX01BWF9QS1RfU0laRSAvIHBrdF9zaXplKSAqIHBrdF9zaXplOworICAgICAgICBwa3Rfc2l6ZSAgID0gRkZNSU4ocGt0X3NpemUsIGxlZnQpOworICAgICAgICBwa3RfZnJhbWVzID0gcGt0X3NpemUgLyBjYWYtPmJ5dGVzX3Blcl9wYWNrZXQ7CisgICAgfSBlbHNlIGlmIChzdC0+bmJfaW5kZXhfZW50cmllcykgeworICAgICAgICBpZiAoY2FmLT5wYWNrZXRfY250IDwgc3QtPm5iX2luZGV4X2VudHJpZXMgLSAxKSB7CisgICAgICAgICAgICBwa3Rfc2l6ZSAgID0gc3QtPmluZGV4X2VudHJpZXNbY2FmLT5wYWNrZXRfY250ICsgMV0ucG9zICAgICAgIC0gc3QtPmluZGV4X2VudHJpZXNbY2FmLT5wYWNrZXRfY250XS5wb3M7CisgICAgICAgICAgICBwa3RfZnJhbWVzID0gc3QtPmluZGV4X2VudHJpZXNbY2FmLT5wYWNrZXRfY250ICsgMV0udGltZXN0YW1wIC0gc3QtPmluZGV4X2VudHJpZXNbY2FmLT5wYWNrZXRfY250XS50aW1lc3RhbXA7CisgICAgICAgIH0gZWxzZSBpZiAoY2FmLT5wYWNrZXRfY250ID09IHN0LT5uYl9pbmRleF9lbnRyaWVzIC0gMSkgeworICAgICAgICAgICAgcGt0X3NpemUgICA9IGNhZi0+bnVtX2J5dGVzIC0gc3QtPmluZGV4X2VudHJpZXNbY2FmLT5wYWNrZXRfY250XS5wb3M7CisgICAgICAgICAgICBwa3RfZnJhbWVzID0gc3QtPmR1cmF0aW9uICAgLSBzdC0+aW5kZXhfZW50cmllc1tjYWYtPnBhY2tldF9jbnRdLnRpbWVzdGFtcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGt0X3NpemUgPT0gMCB8fCBwa3RfZnJhbWVzID09IDAgfHwgcGt0X3NpemUgPiBsZWZ0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgcmVzID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBwa3Rfc2l6ZSk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICBwa3QtPnNpemUgICAgICAgICAgID0gcmVzOworICAgIHBrdC0+c3RyZWFtX2luZGV4ICAgPSAwOworICAgIHBrdC0+ZHRzID0gcGt0LT5wdHMgPSBjYWYtPmZyYW1lX2NudDsKKworICAgIGNhZi0+cGFja2V0X2NudCsrOworICAgIGNhZi0+ZnJhbWVfY250ICs9IHBrdF9mcmFtZXM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIENhZkNvbnRleHQgKmNhZiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IHBvcywgcGFja2V0X2NudCwgZnJhbWVfY250OworCisgICAgdGltZXN0YW1wID0gRkZNQVgodGltZXN0YW1wLCAwKTsKKworICAgIGlmIChjYWYtPmZyYW1lc19wZXJfcGFja2V0ID4gMCAmJiBjYWYtPmJ5dGVzX3Blcl9wYWNrZXQgPiAwKSB7CisgICAgICAgIC8qIGNhbGN1bGF0ZSBuZXcgYnl0ZSBwb3NpdGlvbiBiYXNlZCBvbiB0YXJnZXQgZnJhbWUgcG9zaXRpb24gKi8KKyAgICAgICAgcG9zID0gY2FmLT5ieXRlc19wZXJfcGFja2V0ICogKHRpbWVzdGFtcCAvIGNhZi0+ZnJhbWVzX3Blcl9wYWNrZXQpOworICAgICAgICBpZiAoY2FmLT5kYXRhX3NpemUgPiAwKQorICAgICAgICAgICAgcG9zID0gRkZNSU4ocG9zLCBjYWYtPmRhdGFfc2l6ZSk7CisgICAgICAgIHBhY2tldF9jbnQgPSBwb3MgLyBjYWYtPmJ5dGVzX3Blcl9wYWNrZXQ7CisgICAgICAgIGZyYW1lX2NudCAgPSBjYWYtPmZyYW1lc19wZXJfcGFja2V0ICogcGFja2V0X2NudDsKKyAgICB9IGVsc2UgaWYgKHN0LT5uYl9pbmRleF9lbnRyaWVzKSB7CisgICAgICAgIHBhY2tldF9jbnQgPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHN0LCB0aW1lc3RhbXAsIGZsYWdzKTsKKyAgICAgICAgZnJhbWVfY250ICA9IHN0LT5pbmRleF9lbnRyaWVzW3BhY2tldF9jbnRdLnRpbWVzdGFtcDsKKyAgICAgICAgcG9zICAgICAgICA9IHN0LT5pbmRleF9lbnRyaWVzW3BhY2tldF9jbnRdLnBvczsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgcG9zICsgY2FmLT5kYXRhX3N0YXJ0LCBTRUVLX1NFVCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBjYWYtPnBhY2tldF9jbnQgPSBwYWNrZXRfY250OworICAgIGNhZi0+ZnJhbWVfY250ICA9IGZyYW1lX2NudDsKKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2NhZl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjYWYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBsZSBDQUYgKENvcmUgQXVkaW8gRm9ybWF0KSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihDYWZDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBwcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSByZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSByZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSByZWFkX3NlZWssCisgICAgLmNvZGVjX3RhZyAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgZmZfY29kZWNfY2FmX3RhZ3MsIDAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvY2FmZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvY2FmZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwODI3NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9jYWZlbmMuYwpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqIENvcmUgQXVkaW8gRm9ybWF0IG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FybCBFdWdlbiBIb3lvcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJjYWYuaCIKKyNpbmNsdWRlICJpc29tLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQ2NF90IGRhdGE7CisgICAgdWludDhfdCAqcGt0X3NpemVzOworICAgIGludCBzaXplX2J1ZmZlcl9zaXplOworICAgIGludCBzaXplX2VudHJpZXNfdXNlZDsKKyAgICBpbnQgcGFja2V0czsKK30gQ0FGQ29udGV4dDsKKworc3RhdGljIHVpbnQzMl90IGNvZGVjX2ZsYWdzKGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKSB7CisgICAgc3dpdGNoIChjb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NEJFOgorICAgICAgICByZXR1cm4gMTsgLy88IGtDQUZMaW5lYXJQQ01Gb3JtYXRGbGFnSXNGbG9hdAorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkxFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MyNExFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MzMkxFOgorICAgICAgICByZXR1cm4gMjsgLy88IGtDQUZMaW5lYXJQQ01Gb3JtYXRGbGFnSXNMaXR0bGVFbmRpYW4KKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMzJMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRMRToKKyAgICAgICAgcmV0dXJuIDM7IC8vPCBrQ0FGTGluZWFyUENNRm9ybWF0RmxhZ0lzRmxvYXQgfCBrQ0FGTGluZWFyUENNRm9ybWF0RmxhZ0lzTGl0dGxlRW5kaWFuCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgdWludDMyX3Qgc2FtcGxlc19wZXJfcGFja2V0KGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkLCBpbnQgY2hhbm5lbHMsIGludCBibG9ja19hbGlnbikgeworICAgIHN3aXRjaCAoY29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TODoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMzJMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMzJCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9BTEFXOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX01VTEFXOgorICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01BQ0UzOgorICAgIGNhc2UgQVZfQ09ERUNfSURfTUFDRTY6CisgICAgICAgIHJldHVybiA2OworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1FUOgorICAgICAgICByZXR1cm4gNjQ7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BTVJfTkI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9HU006CisgICAgY2FzZSBBVl9DT0RFQ19JRF9JTEJDOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUUNFTFA6CisgICAgICAgIHJldHVybiAxNjA7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9HU01fTVM6CisgICAgICAgIHJldHVybiAzMjA7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDE6CisgICAgICAgIHJldHVybiAzODQ7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDM6CisgICAgICAgIHJldHVybiAxMTUyOworICAgIGNhc2UgQVZfQ09ERUNfSURfQUMzOgorICAgICAgICByZXR1cm4gMTUzNjsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1FETTI6CisgICAgICAgIHJldHVybiAyMDQ4ICogY2hhbm5lbHM7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BTEFDOgorICAgICAgICByZXR1cm4gNDA5NjsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVY6CisgICAgICAgIHJldHVybiAoYmxvY2tfYWxpZ24gLSA0ICogY2hhbm5lbHMpICogOCAvICg0ICogY2hhbm5lbHMpICsgMTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX01TOgorICAgICAgICByZXR1cm4gKGJsb2NrX2FsaWduIC0gNyAqIGNoYW5uZWxzKSAqIDIgLyBjaGFubmVscyArIDI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNhZl93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBDQUZDb250ZXh0ICpjYWYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBOVUxMOworICAgIHVuc2lnbmVkIGludCBjb2RlY190YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX2NhZl90YWdzLCBlbmMtPmNvZGVjX2lkKTsKKyAgICBpbnQ2NF90IGNodW5rX3NpemUgPSAwOworICAgIGludCBmcmFtZV9zaXplID0gZW5jLT5mcmFtZV9zaXplOworCisgICAgaWYgKHMtPm5iX3N0cmVhbXMgIT0gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ0FGIGZpbGVzIGhhdmUgZXhhY3RseSBvbmUgc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGVuYy0+Y29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FBQzoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm11eGluZyBjb2RlYyBjdXJyZW50bHkgdW5zdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgc3dpdGNoIChlbmMtPmNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzg6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzI0TEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzI0QkU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyTEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyQkU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjMyTEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjMyQkU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjY0TEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjY0QkU6CisgICAgICAgIGNvZGVjX3RhZyA9IE1LVEFHKCdsJywncCcsJ2MnLCdtJyk7CisgICAgfQorCisgICAgaWYgKCFjb2RlY190YWcpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGNvZGVjXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCFlbmMtPmJsb2NrX2FsaWduICYmICFwYi0+c2Vla2FibGUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk11eGluZyB2YXJpYWJsZSBwYWNrZXQgc2l6ZSBub3Qgc3VwcG9ydGVkIG9uIG5vbiBzZWVrYWJsZSBvdXRwdXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoZW5jLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUDMgfHwgZnJhbWVfc2l6ZSAhPSA1NzYpCisgICAgICAgIGZyYW1lX3NpemUgPSBzYW1wbGVzX3Blcl9wYWNrZXQoZW5jLT5jb2RlY19pZCwgZW5jLT5jaGFubmVscywgZW5jLT5ibG9ja19hbGlnbik7CisKKyAgICBmZmlvX3dmb3VyY2MocGIsICJjYWZmIik7IC8vPCBtRmlsZVR5cGUKKyAgICBhdmlvX3diMTYocGIsIDEpOyAgICAgICAgIC8vPCBtRmlsZVZlcnNpb24KKyAgICBhdmlvX3diMTYocGIsIDApOyAgICAgICAgIC8vPCBtRmlsZUZsYWdzCisKKyAgICBmZmlvX3dmb3VyY2MocGIsICJkZXNjIik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vPCBBdWRpbyBEZXNjcmlwdGlvbiBjaHVuaworICAgIGF2aW9fd2I2NChwYiwgMzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy88IG1DaHVua1NpemUKKyAgICBhdmlvX3diNjQocGIsIGF2X2RvdWJsZTJpbnQoZW5jLT5zYW1wbGVfcmF0ZSkpOyAgIC8vPCBtU2FtcGxlUmF0ZQorICAgIGF2aW9fd2wzMihwYiwgY29kZWNfdGFnKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy88IG1Gb3JtYXRJRAorICAgIGF2aW9fd2IzMihwYiwgY29kZWNfZmxhZ3MoZW5jLT5jb2RlY19pZCkpOyAgICAgICAgLy88IG1Gb3JtYXRGbGFncworICAgIGF2aW9fd2IzMihwYiwgZW5jLT5ibG9ja19hbGlnbik7ICAgICAgICAgICAgICAgICAgLy88IG1CeXRlc1BlclBhY2tldAorICAgIGF2aW9fd2IzMihwYiwgZnJhbWVfc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgLy88IG1GcmFtZXNQZXJQYWNrZXQKKyAgICBhdmlvX3diMzIocGIsIGVuYy0+Y2hhbm5lbHMpOyAgICAgICAgICAgICAgICAgICAgIC8vPCBtQ2hhbm5lbHNQZXJGcmFtZQorICAgIGF2aW9fd2IzMihwYiwgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShlbmMtPmNvZGVjX2lkKSk7IC8vPCBtQml0c1BlckNoYW5uZWwKKworICAgIGlmIChlbmMtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImNoYW4iKTsKKyAgICAgICAgYXZpb193YjY0KHBiLCAxMik7CisgICAgICAgIGZmX21vdl93cml0ZV9jaGFuKHBiLCBlbmMtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICB9CisKKyAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTEFDKSB7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImt1a2kiKTsKKyAgICAgICAgYXZpb193YjY0KHBiLCAxMiArIGVuYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCAiXDBcMFwwXDE0ZnJtYWFsYWMiLCAxMik7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIGVuYy0+ZXh0cmFkYXRhLCBlbmMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICB9IGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX05CKSB7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImt1a2kiKTsKKyAgICAgICAgYXZpb193YjY0KHBiLCAyOSk7CisgICAgICAgIGF2aW9fd3JpdGUocGIsICJcMFwwXDBcMTRmcm1hc2FtciIsIDEyKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAweDExKTsgLyogc2l6ZSAqLworICAgICAgICBhdmlvX3dyaXRlKHBiLCAic2FtckZGTVAiLCA4KTsKKyAgICAgICAgYXZpb193OChwYiwgMCk7IC8qIGRlY29kZXIgdmVyc2lvbiAqLworCisgICAgICAgIGF2aW9fd2IxNihwYiwgMHg4MUZGKTsgLyogTW9kZSBzZXQgKGFsbCBtb2RlcyBmb3IgQU1SX05CKSAqLworICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsgLyogTW9kZSBjaGFuZ2UgcGVyaW9kIChubyByZXN0cmljdGlvbikgKi8KKyAgICAgICAgYXZpb193OChwYiwgMHgwMSk7IC8qIEZyYW1lcyBwZXIgc2FtcGxlICovCisgICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1FETTIpIHsKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAia3VraSIpOworICAgICAgICBhdmlvX3diNjQocGIsIGVuYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCBlbmMtPmV4dHJhZGF0YSwgZW5jLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgfQorCisgICAgaWYgKGF2X2RpY3RfY291bnQocy0+bWV0YWRhdGEpKSB7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImluZm8iKTsgLy88IEluZm9ybWF0aW9uIGNodW5rCisgICAgICAgIHdoaWxlICgodCA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiIiwgdCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgICAgIGNodW5rX3NpemUgKz0gc3RybGVuKHQtPmtleSkgKyBzdHJsZW4odC0+dmFsdWUpICsgMjsKKyAgICAgICAgfQorICAgICAgICBhdmlvX3diNjQocGIsIGNodW5rX3NpemUgKyA0KTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBhdl9kaWN0X2NvdW50KHMtPm1ldGFkYXRhKSk7CisgICAgICAgIHQgPSBOVUxMOworICAgICAgICB3aGlsZSAoKHQgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgIiIsIHQsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgICAgICBhdmlvX3B1dF9zdHIocGIsIHQtPmtleSk7CisgICAgICAgICAgICBhdmlvX3B1dF9zdHIocGIsIHQtPnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImRhdGEiKTsgLy88IEF1ZGlvIERhdGEgY2h1bmsKKyAgICBjYWYtPmRhdGEgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fd2I2NChwYiwgLTEpOyAgICAgICAgLy88IG1DaHVua1NpemUKKyAgICBhdmlvX3diMzIocGIsIDApOyAgICAgICAgIC8vPCBtRWRpdENvdW50CisKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYWZfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBDQUZDb250ZXh0ICpjYWYgPSBzLT5wcml2X2RhdGE7CisKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgaWYgKCFzLT5zdHJlYW1zWzBdLT5jb2RlYy0+YmxvY2tfYWxpZ24pIHsKKyAgICAgICAgdm9pZCAqcGt0X3NpemVzID0gY2FmLT5wa3Rfc2l6ZXM7CisgICAgICAgIGludCBpLCBhbGxvY19zaXplID0gY2FmLT5zaXplX2VudHJpZXNfdXNlZCArIDU7CisgICAgICAgIGlmIChhbGxvY19zaXplIDwgMCkgeworICAgICAgICAgICAgY2FmLT5wa3Rfc2l6ZXMgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FmLT5wa3Rfc2l6ZXMgPSBhdl9mYXN0X3JlYWxsb2MoY2FmLT5wa3Rfc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FmLT5zaXplX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2Nfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjYWYtPnBrdF9zaXplcykgeworICAgICAgICAgICAgYXZfZnJlZShwa3Rfc2l6ZXMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSA0OyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICB1bnNpZ25lZCB0b3AgPSBwa3QtPnNpemUgPj4gaSAqIDc7CisgICAgICAgICAgICBpZiAodG9wKQorICAgICAgICAgICAgICAgIGNhZi0+cGt0X3NpemVzW2NhZi0+c2l6ZV9lbnRyaWVzX3VzZWQrK10gPSAxMjggfCB0b3A7CisgICAgICAgIH0KKyAgICAgICAgY2FmLT5wa3Rfc2l6ZXNbY2FmLT5zaXplX2VudHJpZXNfdXNlZCsrXSA9IHBrdC0+c2l6ZSAmIDEyNzsKKyAgICAgICAgY2FmLT5wYWNrZXRzKys7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhZl93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBDQUZDb250ZXh0ICpjYWYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworCisgICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgICAgICBpbnQ2NF90IGZpbGVfc2l6ZSA9IGF2aW9fdGVsbChwYik7CisKKyAgICAgICAgYXZpb19zZWVrKHBiLCBjYWYtPmRhdGEsIFNFRUtfU0VUKTsKKyAgICAgICAgYXZpb193YjY0KHBiLCBmaWxlX3NpemUgLSBjYWYtPmRhdGEgLSA4KTsKKyAgICAgICAgYXZpb19zZWVrKHBiLCBmaWxlX3NpemUsIFNFRUtfU0VUKTsKKyAgICAgICAgaWYgKCFlbmMtPmJsb2NrX2FsaWduKSB7CisgICAgICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJwYWt0Iik7CisgICAgICAgICAgICBhdmlvX3diNjQocGIsIGNhZi0+c2l6ZV9lbnRyaWVzX3VzZWQgKyAyNCk7CisgICAgICAgICAgICBhdmlvX3diNjQocGIsIGNhZi0+cGFja2V0cyk7IC8vLzwgbU51bWJlclBhY2tldHMKKyAgICAgICAgICAgIGF2aW9fd2I2NChwYiwgY2FmLT5wYWNrZXRzICogc2FtcGxlc19wZXJfcGFja2V0KGVuYy0+Y29kZWNfaWQsIGVuYy0+Y2hhbm5lbHMsIGVuYy0+YmxvY2tfYWxpZ24pKTsgLy8vPCBtTnVtYmVyVmFsaWRGcmFtZXMKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7IC8vLzwgbVByaW1pbmdGcmFtZXMKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7IC8vLzwgbVJlbWFpbmRlckZyYW1lcworICAgICAgICAgICAgYXZpb193cml0ZShwYiwgY2FmLT5wa3Rfc2l6ZXMsIGNhZi0+c2l6ZV9lbnRyaWVzX3VzZWQpOworICAgICAgICAgICAgY2FmLT5zaXplX2J1ZmZlcl9zaXplID0gMDsKKyAgICAgICAgfQorICAgICAgICBhdmlvX2ZsdXNoKHBiKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmNhZi0+cGt0X3NpemVzKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfY2FmX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjYWYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBsZSBDQUYgKENvcmUgQXVkaW8gRm9ybWF0KSIpLAorICAgIC5taW1lX3R5cGUgICAgICA9ICJhdWRpby94LWNhZiIsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImNhZiIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENBRkNvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZCRSwKKyAgICAudmlkZW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC53cml0ZV9oZWFkZXIgICA9IGNhZl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gY2FmX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgPSBjYWZfd3JpdGVfdHJhaWxlciwKKyAgICAuY29kZWNfdGFnICAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyogY29uc3QgW10pe2ZmX2NvZGVjX2NhZl90YWdzLCAwfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvY2F2c3ZpZGVvZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvY2F2c3ZpZGVvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwZjRhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9jYXZzdmlkZW9kZWMuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogUkFXIENoaW5lc2UgQVZTIHZpZGVvIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSAgU3RlZmFuIEdlaHJlciA8c3RlZmFuLmdlaHJlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJhd2RlYy5oIgorCisjZGVmaW5lIENBVlNfU0VRX1NUQVJUX0NPREUgICAgICAgMHgwMDAwMDFiMAorI2RlZmluZSBDQVZTX1BJQ19JX1NUQVJUX0NPREUgICAgIDB4MDAwMDAxYjMKKyNkZWZpbmUgQ0FWU19VTkRFRl9TVEFSVF9DT0RFICAgICAweDAwMDAwMWI0CisjZGVmaW5lIENBVlNfUElDX1BCX1NUQVJUX0NPREUgICAgMHgwMDAwMDFiNgorI2RlZmluZSBDQVZTX1ZJREVPX0VESVRfQ09ERSAgICAgIDB4MDAwMDAxYjcKKyNkZWZpbmUgQ0FWU19QUk9GSUxFX0pJWkhVTiAgICAgICAweDIwCisKK3N0YXRpYyBpbnQgY2F2c3ZpZGVvX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIHVpbnQzMl90IGNvZGU9IC0xOworICAgIGludCBwaWM9MCwgc2VxPTAsIHNsaWNlX3BvcyA9IDA7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPHAtPmJ1Zl9zaXplOyBpKyspeworICAgICAgICBjb2RlID0gKGNvZGU8PDgpICsgcC0+YnVmW2ldOworICAgICAgICBpZiAoKGNvZGUgJiAweGZmZmZmZjAwKSA9PSAweDEwMCkgeworICAgICAgICAgICAgaWYoY29kZSA8IENBVlNfU0VRX1NUQVJUX0NPREUpIHsKKyAgICAgICAgICAgICAgICAvKiBzbGljZXMgaGF2ZSB0byBiZSBjb25zZWN1dGl2ZSAqLworICAgICAgICAgICAgICAgIGlmKGNvZGUgPCBzbGljZV9wb3MpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIHNsaWNlX3BvcyA9IGNvZGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNsaWNlX3BvcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29kZSA9PSBDQVZTX1NFUV9TVEFSVF9DT0RFKSB7CisgICAgICAgICAgICAgICAgc2VxKys7CisgICAgICAgICAgICAgICAgLyogY2hlY2sgZm9yIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQgcHJvZmlsZSAqLworICAgICAgICAgICAgICAgIGlmKHAtPmJ1ZltpKzFdICE9IENBVlNfUFJPRklMRV9KSVpIVU4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIGlmICgoY29kZSA9PSBDQVZTX1BJQ19JX1NUQVJUX0NPREUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChjb2RlID09IENBVlNfUElDX1BCX1NUQVJUX0NPREUpKSB7CisgICAgICAgICAgICAgICAgcGljKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChjb2RlID09IENBVlNfVU5ERUZfU1RBUlRfQ09ERSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUgPiAgQ0FWU19WSURFT19FRElUX0NPREUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoc2VxICYmIHNlcSo5PD1waWMqMTApCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTisxOworICAgIHJldHVybiAwOworfQorCitGRl9ERUZfUkFXVklERU9fREVNVVhFUihjYXZzdmlkZW8sICJyYXcgQ2hpbmVzZSBBVlMgKEF1ZGlvIFZpZGVvIFN0YW5kYXJkKSIsIGNhdnN2aWRlb19wcm9iZSwgTlVMTCwgQVZfQ09ERUNfSURfQ0FWUykKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9jZGcuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9jZGcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWYzN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2NkZy5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDRCBHcmFwaGljcyBEZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWljaGFlbCBUaXNvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIENER19QQUNLRVRfU0laRSAgICAyNAorI2RlZmluZSBDREdfQ09NTUFORCAgICAgICAgMHgwOQorI2RlZmluZSBDREdfTUFTSyAgICAgICAgICAgMHgzRgorCit0eXBlZGVmIHN0cnVjdCBDREdDb250ZXh0IHsKKyAgICBpbnQgZ290X2ZpcnN0X3BhY2tldDsKK30gQ0RHQ29udGV4dDsKKworc3RhdGljIGludCByZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnZzdDsKKyAgICBpbnQgcmV0OworCisgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXZzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0NER1JBUEhJQ1M7CisKKyAgICAvLy8gNzUgc2VjdG9ycy9zZWMgKiA0IHBhY2tldHMvc2VjdG9yID0gMzAwIHBhY2tldHMvc2VjCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyh2c3QsIDMyLCAxLCAzMDApOworCisgICAgcmV0ID0gYXZpb19zaXplKHMtPnBiKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJDYW5ub3QgY2FsY3VsYXRlIGR1cmF0aW9uIGFzIGZpbGUgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuIik7CisgICAgfSBlbHNlCisgICAgICAgIHZzdC0+ZHVyYXRpb24gPSAocmV0ICogdnN0LT50aW1lX2Jhc2UuZGVuKSAvIChDREdfUEFDS0VUX1NJWkUgKiAzMDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIENER0NvbnRleHQgKnByaXYgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgQ0RHX1BBQ0tFVF9TSVpFKTsKKyAgICAgICAgaWYgKHJldCA8IDEgfHwgKHBrdC0+ZGF0YVswXSAmIENER19NQVNLKSA9PSBDREdfQ09NTUFORCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgIH0KKworICAgIGlmICghcHJpdi0+Z290X2ZpcnN0X3BhY2tldCkgeworICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgcHJpdi0+Z290X2ZpcnN0X3BhY2tldCA9IDE7CisgICAgfQorCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIHBrdC0+ZHRzPQorICAgIHBrdC0+cHRzPSBwa3QtPnBvcyAvIENER19QQUNLRVRfU0laRTsKKworICAgIGlmKHJldD41ICYmIChwa3QtPmRhdGFbMF0mMHgzRikgPT0gOSAmJiAocGt0LT5kYXRhWzFdJjB4M0YpPT0xICYmICEocGt0LT5kYXRhWzIrMisxXSAmIDB4MEYpKXsKKyAgICAgICAgcGt0LT5mbGFncyA9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9jZGdfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiY2RnIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ0QgR3JhcGhpY3MiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ0RHQ29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgID0gcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcmVhZF9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiY2RnIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvY2R4bC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2NkeGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2UzNzlhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2NkeGwuYwpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIENEWEwgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIENEWExfSEVBREVSX1NJWkUgMzIKKwordHlwZWRlZiBzdHJ1Y3QgQ0RYTERlbXV4Q29udGV4dCB7CisgICAgQVZDbGFzcyAgICAgKmNsYXNzOworICAgIGludCAgICAgICAgIHNhbXBsZV9yYXRlOworICAgIGNoYXIgICAgICAgICpmcmFtZXJhdGU7CisgICAgQVZSYXRpb25hbCAgZnBzOworICAgIGludCAgICAgICAgIHJlYWRfY2h1bms7CisgICAgdWludDhfdCAgICAgaGVhZGVyW0NEWExfSEVBREVSX1NJWkVdOworICAgIGludCAgICAgICAgIHZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICBpbnQgICAgICAgICBhdWRpb19zdHJlYW1faW5kZXg7Cit9IENEWExEZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgY2R4bF9yZWFkX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGludCBzY29yZSA9IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMTA7CisKKyAgICBpZiAocC0+YnVmX3NpemUgPCBDRFhMX0hFQURFUl9TSVpFKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHJlc2VydmVkIGJ5dGVzIHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIDAgKi8KKyAgICBpZiAoQVZfUk42NCgmcC0+YnVmWzI0XSkgfHwgQVZfUk4xNigmcC0+YnVmWzEwXSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogY2hlY2sgdHlwZSAqLworICAgIGlmIChwLT5idWZbMF0gIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayBwYWxldHRlIHNpemUgKi8KKyAgICBpZiAoQVZfUkIxNigmcC0+YnVmWzIwXSkgPiA1MTIpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogY2hlY2sgbnVtYmVyIG9mIHBsYW5lcyAqLworICAgIGlmIChwLT5idWZbMThdIHx8ICFwLT5idWZbMTldKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGNoZWNrIHdpZGggYW5kIGhlaWdodCAqLworICAgIGlmICghQVZfUk4xNigmcC0+YnVmWzE0XSkgfHwgIUFWX1JOMTYoJnAtPmJ1ZlsxNl0pKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGNodW5rIHNpemUgKi8KKyAgICBpZiAoQVZfUkIzMigmcC0+YnVmWzJdKSA8IEFWX1JCMTYoJnAtPmJ1ZlsyMl0pICsgQVZfUkIxNigmcC0+YnVmWzIwXSkgKyBDRFhMX0hFQURFUl9TSVpFKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHByZXZpb3VzIGNodW5rIHNpemUgKi8KKyAgICBpZiAoQVZfUk4zMigmcC0+YnVmWzZdKSkKKyAgICAgICAgc2NvcmUgLz0gMjsKKworICAgIC8qIGN1cnJlbnQgZnJhbWUgbnVtYmVyLCB1c3VhbGx5IHN0YXJ0cyBmcm9tIDEgKi8KKyAgICBpZiAoQVZfUkIxNigmcC0+YnVmWzEyXSkgIT0gMSkKKyAgICAgICAgc2NvcmUgLz0gMjsKKworICAgIHJldHVybiBzY29yZTsKK30KKworc3RhdGljIGludCBjZHhsX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBDRFhMRGVtdXhDb250ZXh0ICpjZHhsID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoY2R4bC0+ZnJhbWVyYXRlICYmIChyZXQgPSBhdl9wYXJzZV92aWRlb19yYXRlKCZjZHhsLT5mcHMsIGNkeGwtPmZyYW1lcmF0ZSkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwYXJzZSBmcmFtZXJhdGU6ICVzLlxuIiwgY2R4bC0+ZnJhbWVyYXRlKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBjZHhsLT5yZWFkX2NodW5rICAgICAgICAgPSAgMDsKKyAgICBjZHhsLT52aWRlb19zdHJlYW1faW5kZXggPSAtMTsKKyAgICBjZHhsLT5hdWRpb19zdHJlYW1faW5kZXggPSAtMTsKKworICAgIHMtPmN0eF9mbGFncyB8PSBBVkZNVENUWF9OT0hFQURFUjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNkeGxfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIENEWExEZW11eENvbnRleHQgKmNkeGwgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgdWludDMyX3QgY3VycmVudF9zaXplLCB2aWRlb19zaXplLCBpbWFnZV9zaXplOworICAgIHVpbnQxNl90IGF1ZGlvX3NpemUsIHBhbGV0dGVfc2l6ZSwgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQ2NF90ICBwb3M7CisgICAgaW50ICAgICAgcmV0OworCisgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgaWYgKCFjZHhsLT5yZWFkX2NodW5rICYmCisgICAgICAgIGF2aW9fcmVhZChwYiwgY2R4bC0+aGVhZGVyLCBDRFhMX0hFQURFUl9TSVpFKSAhPSBDRFhMX0hFQURFUl9TSVpFKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgaWYgKGNkeGwtPmhlYWRlclswXSAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJub24tc3RhbmRhcmQgY2R4bCBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3VycmVudF9zaXplID0gQVZfUkIzMigmY2R4bC0+aGVhZGVyWzJdKTsKKyAgICB3aWR0aCAgICAgICAgPSBBVl9SQjE2KCZjZHhsLT5oZWFkZXJbMTRdKTsKKyAgICBoZWlnaHQgICAgICAgPSBBVl9SQjE2KCZjZHhsLT5oZWFkZXJbMTZdKTsKKyAgICBwYWxldHRlX3NpemUgPSBBVl9SQjE2KCZjZHhsLT5oZWFkZXJbMjBdKTsKKyAgICBhdWRpb19zaXplICAgPSBBVl9SQjE2KCZjZHhsLT5oZWFkZXJbMjJdKTsKKyAgICBpbWFnZV9zaXplICAgPSBGRkFMSUdOKHdpZHRoLCAxNikgKiBoZWlnaHQgKiBjZHhsLT5oZWFkZXJbMTldIC8gODsKKyAgICB2aWRlb19zaXplICAgPSBwYWxldHRlX3NpemUgKyBpbWFnZV9zaXplOworCisgICAgaWYgKHBhbGV0dGVfc2l6ZSA+IDUxMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKGN1cnJlbnRfc2l6ZSA8ICh1aW50NjRfdClhdWRpb19zaXplICsgdmlkZW9fc2l6ZSArIENEWExfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGNkeGwtPnJlYWRfY2h1bmsgJiYgYXVkaW9fc2l6ZSkgeworICAgICAgICBpZiAoY2R4bC0+YXVkaW9fc3RyZWFtX2luZGV4ID09IC0xKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgICAgPSAwOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgID0gQVZfQ09ERUNfSURfUENNX1M4OworICAgICAgICAgICAgaWYgKGNkeGwtPmhlYWRlclsxXSAmIDB4MTApIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgID0gY2R4bC0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICBzdC0+c3RhcnRfdGltZSAgICAgICAgICAgPSAwOworICAgICAgICAgICAgY2R4bC0+YXVkaW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGNkeGwtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgYXVkaW9fc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBjZHhsLT5hdWRpb19zdHJlYW1faW5kZXg7CisgICAgICAgIHBrdC0+cG9zICAgICAgICAgID0gcG9zOworICAgICAgICBwa3QtPmR1cmF0aW9uICAgICA9IGF1ZGlvX3NpemU7CisgICAgICAgIGNkeGwtPnJlYWRfY2h1bmsgID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY2R4bC0+dmlkZW9fc3RyZWFtX2luZGV4ID09IC0xKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgICAgPSAwOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgID0gQVZfQ09ERUNfSURfQ0RYTDsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICAgICA9IHdpZHRoOworICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgICAgID0gaGVpZ2h0OworICAgICAgICAgICAgc3QtPnN0YXJ0X3RpbWUgICAgICAgICAgID0gMDsKKyAgICAgICAgICAgIGNkeGwtPnZpZGVvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgICAgIGlmIChjZHhsLT5mcmFtZXJhdGUpCisgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIGNkeGwtPmZwcy5kZW4sIGNkeGwtPmZwcy5udW0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBjZHhsLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIHZpZGVvX3NpemUgKyBDRFhMX0hFQURFUl9TSVpFKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBjZHhsLT5oZWFkZXIsIENEWExfSEVBREVSX1NJWkUpOworICAgICAgICByZXQgPSBhdmlvX3JlYWQocGIsIHBrdC0+ZGF0YSArIENEWExfSEVBREVSX1NJWkUsIHZpZGVvX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYXZfc2hyaW5rX3BhY2tldChwa3QsIENEWExfSEVBREVSX1NJWkUgKyByZXQpOworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCAgPSBjZHhsLT52aWRlb19zdHJlYW1faW5kZXg7CisgICAgICAgIHBrdC0+ZmxhZ3MgICAgICAgIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgcGt0LT5wb3MgICAgICAgICAgID0gcG9zOworICAgICAgICBwa3QtPmR1cmF0aW9uICAgICAgPSBjZHhsLT5mcmFtZXJhdGUgPyAxIDogYXVkaW9fc2l6ZSA/IGF1ZGlvX3NpemUgOiAyMjA7CisgICAgICAgIGNkeGwtPnJlYWRfY2h1bmsgICA9IGF1ZGlvX3NpemU7CisgICAgfQorCisgICAgaWYgKCFjZHhsLT5yZWFkX2NodW5rKQorICAgICAgICBhdmlvX3NraXAocGIsIGN1cnJlbnRfc2l6ZSAtIGF1ZGlvX3NpemUgLSB2aWRlb19zaXplIC0gQ0RYTF9IRUFERVJfU0laRSk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ0RYTERlbXV4Q29udGV4dCwgeCkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjZHhsX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzYW1wbGVfcmF0ZSIsICIiLCBPRkZTRVQoc2FtcGxlX3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IDExMDI1IH0sIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiZnJhbWVyYXRlIiwgICAiIiwgT0ZGU0VUKGZyYW1lcmF0ZSksICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICAwLCAwLCAgICAgICBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgY2R4bF9kZW11eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIkNEWEwgZGVtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGNkeGxfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfY2R4bF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjZHhsIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29tbW9kb3JlIENEWEwgdmlkZW8iKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ0RYTERlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gY2R4bF9yZWFkX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGNkeGxfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gY2R4bF9yZWFkX3BhY2tldCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiY2R4bCx4bCIsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmY2R4bF9kZW11eGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9jaW5lZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvY2luZWRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMmY0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvY2luZWRlYy5jCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogUGhhbnRvbSBDaW5lIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBQaGFudG9tIENpbmUgZGVtdXhlcgorICogQGF1dGhvciBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYm1wLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGZsb2F0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgcHRzOworfSBDaW5lRGVtdXhDb250ZXh0OworCisvKiogQ29tcHJlc3Npb24gKi8KK2VudW0geworICAgIENDX1JHQiAgID0gMCwgIC8qKjwgR3JheSAqLworICAgIENDX0xFQUQgID0gMSwgIC8qKjwgTEVBRCAoTSlKUEVHICovCisgICAgQ0NfVU5JTlQgPSAyICAgLyoqPCBVbmludGVycG9sYXRlZCBjb2xvciBpbWFnZSAoQ0ZBIGZpZWxkIGluZGljYXRlcyBjb2xvciBvcmRlcmluZykgICovCit9OworCisvKiogQ29sb3IgRmlsdGVyIEFycmF5ICovCitlbnVtIHsKKyAgICBDRkFfTk9ORSAgICAgID0gMCwgIC8qKjwgR1JBWSAqLworICAgIENGQV9WUkkgICAgICAgPSAxLCAgLyoqPCBHQlJHL1JHR0IgKi8KKyAgICBDRkFfVlJJVjYgICAgID0gMiwgIC8qKjwgQkdHUi9HUkJHICovCisgICAgQ0ZBX0JBWUVSICAgICA9IDMsICAvKio8IEdCL1JHICovCisgICAgQ0ZBX0JBWUVSRkxJUCA9IDQsICAvKio8IFJHL0dCICovCisKKyAgICBDRkFfVExHUkFZICAgID0gMHg4MDAwMDAwMCwKKyAgICBDRkFfVFJHUkFZICAgID0gMHg0MDAwMDAwMCwKKyAgICBDRkFfQkxHUkFZICAgID0gMHgyMDAwMDAwMCwKKyAgICBDRkFfQlJHUkFZICAgID0gMHgxMDAwMDAwMAorfTsKKworc3RhdGljIGludCBjaW5lX3JlYWRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IEhlYWRlclNpemU7CisgICAgaWYgKHAtPmJ1ZlswXSA9PSAnQycgJiYgcC0+YnVmWzFdID09ICdJJyAmJiAgLy8gVHlwZQorICAgICAgICAoSGVhZGVyU2l6ZSA9IEFWX1JMMTYocC0+YnVmICsgMikpID49IDB4MkMgJiYgIC8vIEhlYWRlclNpemUKKyAgICAgICAgQVZfUkwxNihwLT5idWYgKyA0KSA8PSBDQ19VTklOVCAmJiAgICAgICAvLyBDb21wcmVzc2lvbgorICAgICAgICBBVl9STDE2KHAtPmJ1ZiArIDYpIDw9IDEgJiYgICAgICAgICAgICAgIC8vIFZlcnNpb24KKyAgICAgICAgQVZfUkwzMihwLT5idWYgKyAyMCkgJiYgICAgICAgICAgICAgICAgICAvLyBJbWFnZUNvdW50CisgICAgICAgIEFWX1JMMzIocC0+YnVmICsgMjQpID49IEhlYWRlclNpemUgJiYgICAgLy8gT2ZmSW1hZ2VIZWFkZXIKKyAgICAgICAgQVZfUkwzMihwLT5idWYgKyAyOCkgPj0gSGVhZGVyU2l6ZSAmJiAgICAvLyBPZmZTZXR1cAorICAgICAgICBBVl9STDMyKHAtPmJ1ZiArIDMyKSA+PSBIZWFkZXJTaXplKSAgICAgIC8vIE9mZkltYWdlT2Zmc2V0cworICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X21ldGFkYXRhX2ludChBVkRpY3Rpb25hcnkgKipkaWN0LCBjb25zdCBjaGFyICprZXksIGludCB2YWx1ZSwgaW50IGFsbG93X3plcm8pCit7CisgICAgaWYgKHZhbHVlIHx8IGFsbG93X3plcm8pIHsKKyAgICAgICAgcmV0dXJuIGF2X2RpY3Rfc2V0X2ludChkaWN0LCBrZXksIHZhbHVlLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X21ldGFkYXRhX2Zsb2F0KEFWRGljdGlvbmFyeSAqKmRpY3QsIGNvbnN0IGNoYXIgKmtleSwgZmxvYXQgdmFsdWUsIGludCBhbGxvd196ZXJvKQoreworICAgIGlmICh2YWx1ZSAhPSAwIHx8IGFsbG93X3plcm8pIHsKKyAgICAgICAgY2hhciB0bXBbNjRdOworICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiJWYiLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBhdl9kaWN0X3NldChkaWN0LCBrZXksIHRtcCwgMCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpbmVfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBhdmN0eC0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uLCBjb21wcmVzc2lvbiwgb2ZmSW1hZ2VIZWFkZXIsIG9mZlNldHVwLCBvZmZJbWFnZU9mZnNldHMsIGJpQml0Q291bnQsIGxlbmd0aCwgQ0ZBOworICAgIGludCB2ZmxpcDsKKyAgICBjaGFyICpkZXNjcmlwdGlvbjsKKyAgICB1aW50NjRfdCBpOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2Y3R4LCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSAwOworCisgICAgLyogQ0lORUZJTEVIRUFERVIgc3RydWN0dXJlICovCisgICAgYXZpb19za2lwKHBiLCA0KTsgLy8gVHlwZSwgSGVhZGVyc2l6ZQorCisgICAgY29tcHJlc3Npb24gPSBhdmlvX3JsMTYocGIpOworICAgIHZlcnNpb24gICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBpZiAodmVyc2lvbiAhPSAxKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInVrbm93biB2ZXJzaW9uICVpIiwgdmVyc2lvbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2aW9fc2tpcChwYiwgMTIpOyAvLyBGaXJzdE1vdmllSW1hZ2UsIFRvdGFsSW1hZ2VDb3VudCwgRmlyc3RJbWFnZU51bWJlcgorCisgICAgc3QtPmR1cmF0aW9uICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICBvZmZJbWFnZUhlYWRlciAgPSBhdmlvX3JsMzIocGIpOworICAgIG9mZlNldHVwICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgb2ZmSW1hZ2VPZmZzZXRzID0gYXZpb19ybDMyKHBiKTsKKworICAgIGF2aW9fc2tpcChwYiwgOCk7IC8vIFRyaWdnZXJUaW1lCisKKyAgICAvKiBCSVRNQVBJTkZPSEVBREVSIHN0cnVjdHVyZSAqLworICAgIGF2aW9fc2VlayhwYiwgb2ZmSW1hZ2VIZWFkZXIsIFNFRUtfU0VUKTsKKyAgICBhdmlvX3NraXAocGIsIDQpOyAvL2JpU2l6ZQorICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gYXZpb19ybDMyKHBiKTsKKworICAgIGlmIChhdmlvX3JsMTYocGIpICE9IDEpIC8vIGJpUGxhbmVzCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYmlCaXRDb3VudCA9IGF2aW9fcmwxNihwYik7CisgICAgaWYgKGJpQml0Q291bnQgIT0gOCAmJiBiaUJpdENvdW50ICE9IDE2ICYmIGJpQml0Q291bnQgIT0gMjQgJiYgYmlCaXRDb3VudCAhPSA0OCkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJ1bnN1cHBvcnRlZCBiaUJpdENvdW50ICVpIiwgYmlCaXRDb3VudCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHN3aXRjaCAoYXZpb19ybDMyKHBiKSkgeworICAgIGNhc2UgQk1QX1JHQjoKKyAgICAgICAgdmZsaXAgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTAwOiAvKiBCSV9QQUNLRUQgKi8KKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBNS1RBRygnQicsICdJJywgJ1QnLCAwKTsKKyAgICAgICAgdmZsaXAgPSAxOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJ1bmtub3duIGJpdG1hcCBjb21wcmVzc2lvbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdmlvX3NraXAocGIsIDQpOyAvLyBiaVNpemVJbWFnZQorCisgICAgLyogcGFyc2UgU0VUVVAgc3RydWN0dXJlICovCisgICAgYXZpb19zZWVrKHBiLCBvZmZTZXR1cCwgU0VFS19TRVQpOworICAgIGF2aW9fc2tpcChwYiwgMTQwKTsgLy8gRnJhbWVSYXRhZTE2IC4uIGRlc2NyaXB0aW9uT2xkCisgICAgaWYgKGF2aW9fcmwxNihwYikgIT0gMHg1NDUzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBsZW5ndGggPSBhdmlvX3JsMTYocGIpOworICAgIGlmIChsZW5ndGggPCAweDE2M0MpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAic2hvcnQgU0VUVVAgaGVhZGVyIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2aW9fc2tpcChwYiwgNjE2KTsgLy8gQmlubmluZyAuLiBiRmxpcEgKKyAgICBpZiAoIWF2aW9fcmwzMihwYikgXiB2ZmxpcCkgeworICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSAgPSBhdl9zdHJkdXAoIkJvdHRvbVVwIik7CisgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgID0gOTsKKyAgICB9CisKKyAgICBhdmlvX3NraXAocGIsIDQpOyAvLyBHcmlkCisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgYXZpb19ybDMyKHBiKSk7CisKKyAgICBhdmlvX3NraXAocGIsIDIwKTsgLy8gU2h1dHRlciAuLiBiRW5hYmxlQ29sb3IKKworICAgIHNldF9tZXRhZGF0YV9pbnQoJnN0LT5tZXRhZGF0YSwgImNhbWVyYV92ZXJzaW9uIiwgYXZpb19ybDMyKHBiKSwgMCk7CisgICAgc2V0X21ldGFkYXRhX2ludCgmc3QtPm1ldGFkYXRhLCAiZmlybXdhcmVfdmVyc2lvbiIsIGF2aW9fcmwzMihwYiksIDApOworICAgIHNldF9tZXRhZGF0YV9pbnQoJnN0LT5tZXRhZGF0YSwgInNvZnR3YXJlX3ZlcnNpb24iLCBhdmlvX3JsMzIocGIpLCAwKTsKKyAgICBzZXRfbWV0YWRhdGFfaW50KCZzdC0+bWV0YWRhdGEsICJyZWNvcmRpbmdfdGltZXpvbmUiLCBhdmlvX3JsMzIocGIpLCAwKTsKKworICAgIENGQSA9IGF2aW9fcmwzMihwYik7CisKKyAgICBzZXRfbWV0YWRhdGFfaW50KCZzdC0+bWV0YWRhdGEsICJicmlnaHRuZXNzIiwgYXZpb19ybDMyKHBiKSwgMSk7CisgICAgc2V0X21ldGFkYXRhX2ludCgmc3QtPm1ldGFkYXRhLCAiY29udHJhc3QiLCBhdmlvX3JsMzIocGIpLCAxKTsKKyAgICBzZXRfbWV0YWRhdGFfaW50KCZzdC0+bWV0YWRhdGEsICJnYW1tYSIsIGF2aW9fcmwzMihwYiksIDEpOworCisgICAgYXZpb19za2lwKHBiLCAxMiArIDE2KTsgLy8gUmVzZXJ2ZWQxIC4uIEF1dG9FeHBSZWN0CisgICAgc2V0X21ldGFkYXRhX2Zsb2F0KCZzdC0+bWV0YWRhdGEsICJ3YmdhaW5bMF0uciIsIGF2X2ludDJmbG9hdChhdmlvX3JsMzIocGIpKSwgMSk7CisgICAgc2V0X21ldGFkYXRhX2Zsb2F0KCZzdC0+bWV0YWRhdGEsICJ3YmdhaW5bMF0uYiIsIGF2X2ludDJmbG9hdChhdmlvX3JsMzIocGIpKSwgMSk7CisgICAgYXZpb19za2lwKHBiLCAzNik7IC8vIFdCR2FpblsxXS4uIFdCVmlldworCisgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JsMzIocGIpOworCisgICAgaWYgKGNvbXByZXNzaW9uID09IENDX1JHQikgeworICAgICAgICBpZiAoYmlCaXRDb3VudCA9PSA4KSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVk4OworICAgICAgICB9IGVsc2UgaWYgKGJpQml0Q291bnQgPT0gMTYpIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTE2TEU7CisgICAgICAgIH0gZWxzZSBpZiAoYmlCaXRDb3VudCA9PSAyNCkgeworICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IyNDsKKyAgICAgICAgfSBlbHNlIGlmIChiaUJpdENvdW50ID09IDQ4KSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjQ4TEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJ1bnN1cHBvcnRlZCBiaUJpdENvdW50ICVpIiwgYmlCaXRDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29tcHJlc3Npb24gPT0gQ0NfVU5JTlQpIHsKKyAgICAgICAgc3dpdGNoIChDRkEgJiAweEZGRkZGRikgeworICAgICAgICBjYXNlIENGQV9CQVlFUjoKKyAgICAgICAgICAgIGlmIChiaUJpdENvdW50ID09IDgpIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JBWUVSX0dCUkc4OworICAgICAgICAgICAgfSBlbHNlIGlmIChiaUJpdENvdW50ID09IDE2KSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9CQVlFUl9HQlJHMTZMRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAidW5zdXBwb3J0ZWQgYmlCaXRDb3VudCAlaSIsIGJpQml0Q291bnQpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZBX0JBWUVSRkxJUDoKKyAgICAgICAgICAgIGlmIChiaUJpdENvdW50ID09IDgpIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JBWUVSX1JHR0I4OworICAgICAgICAgICAgfSBlbHNlIGlmIChiaUJpdENvdW50ID09IDE2KSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9CQVlFUl9SR0dCMTZMRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAidW5zdXBwb3J0ZWQgYmlCaXRDb3VudCAlaSIsIGJpQml0Q291bnQpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInVuc3VwcG9ydGVkIENvbG9yIEZpZWxkIEFycmF5IChDRkEpICVpIiwgQ0ZBICYgMHhGRkZGRkYpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvL0NDX0xFQUQKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAidW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gJWkiLCBjb21wcmVzc2lvbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2aW9fc2tpcChwYiwgNjY4KTsgLy8gQ29udjhNaW4gLi4uIFNlbnNvcgorCisgICAgc2V0X21ldGFkYXRhX2ludCgmc3QtPm1ldGFkYXRhLCAic2h1dHRlcl9ucyIsIGF2aW9fcmwzMihwYiksIDApOworCisgICAgYXZpb19za2lwKHBiLCAyNCk7IC8vIEVEUlNodXR0ZXJOcyAuLi4gSW1IZWlnaHRBY3EKKworI2RlZmluZSBERVNDUklQVElPTl9TSVpFIDQwOTYKKyAgICBkZXNjcmlwdGlvbiA9IGF2X21hbGxvYyhERVNDUklQVElPTl9TSVpFICsgMSk7CisgICAgaWYgKCFkZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpID0gYXZpb19nZXRfc3RyKHBiLCBERVNDUklQVElPTl9TSVpFLCBkZXNjcmlwdGlvbiwgREVTQ1JJUFRJT05fU0laRSArIDEpOworICAgIGlmIChpIDwgREVTQ1JJUFRJT05fU0laRSkKKyAgICAgICAgYXZpb19za2lwKHBiLCBERVNDUklQVElPTl9TSVpFIC0gaSk7CisgICAgaWYgKGRlc2NyaXB0aW9uWzBdKQorICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbiwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgIGVsc2UKKyAgICAgICAgYXZfZnJlZShkZXNjcmlwdGlvbik7CisKKyAgICBhdmlvX3NraXAocGIsIDExNzYpOyAvLyBSaXNpbmdFZGdlIC4uLiBjbVVzZXIKKworICAgIHNldF9tZXRhZGF0YV9pbnQoJnN0LT5tZXRhZGF0YSwgImVuYWJsZV9jcm9wIiwgYXZpb19ybDMyKHBiKSwgMSk7CisgICAgc2V0X21ldGFkYXRhX2ludCgmc3QtPm1ldGFkYXRhLCAiY3JvcF9sZWZ0IiwgYXZpb19ybDMyKHBiKSwgMSk7CisgICAgc2V0X21ldGFkYXRhX2ludCgmc3QtPm1ldGFkYXRhLCAiY3JvcF90b3AiLCBhdmlvX3JsMzIocGIpLCAxKTsKKyAgICBzZXRfbWV0YWRhdGFfaW50KCZzdC0+bWV0YWRhdGEsICJjcm9wX3JpZ2h0IiwgYXZpb19ybDMyKHBiKSwgMSk7CisgICAgc2V0X21ldGFkYXRhX2ludCgmc3QtPm1ldGFkYXRhLCAiY3JvcF9ib3R0b20iLCBhdmlvX3JsMzIocGIpLCAxKTsKKworICAgIC8qIHBhcnNlIGltYWdlIG9mZnNldHMgKi8KKyAgICBhdmlvX3NlZWsocGIsIG9mZkltYWdlT2Zmc2V0cywgU0VFS19TRVQpOworICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+ZHVyYXRpb247IGkrKykKKyAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LCBhdmlvX3JsNjQocGIpLCBpLCAwLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpbmVfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBDaW5lRGVtdXhDb250ZXh0ICpjaW5lID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmN0eC0+c3RyZWFtc1swXTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBhdmN0eC0+cGI7CisgICAgaW50IG4sIHNpemUsIHJldDsKKworICAgIGlmIChjaW5lLT5wdHMgPj0gc3QtPmR1cmF0aW9uKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBhdmlvX3NlZWsocGIsIHN0LT5pbmRleF9lbnRyaWVzW2NpbmUtPnB0c10ucG9zLCBTRUVLX1NFVCk7CisgICAgbiA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKG4gPCA4KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBhdmlvX3NraXAocGIsIG4gLSA4KTsKKyAgICBzaXplID0gYXZpb19ybDMyKHBiKTsKKworICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QtPnB0cyA9IGNpbmUtPnB0cysrOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW5lX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBpbnQgc3RyZWFtX2luZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQoreworICAgIENpbmVEZW11eENvbnRleHQgKmNpbmUgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKChmbGFncyAmIEFWU0VFS19GTEFHX0ZSQU1FKSB8fCAoZmxhZ3MgJiBBVlNFRUtfRkxBR19CWVRFKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKworICAgIGlmICghYXZjdHgtPnBiLT5zZWVrYWJsZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIGNpbmUtPnB0cyA9IHRpbWVzdGFtcDsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9jaW5lX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImNpbmUiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQaGFudG9tIENpbmUiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ2luZURlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gY2luZV9yZWFkX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGNpbmVfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gY2luZV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSBjaW5lX3JlYWRfc2VlaywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvY29uY2F0LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvY29uY2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmZTk3MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9jb25jYXQuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvbmNhdCBVUkwgcHJvdG9jb2wKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTdGV2ZSBMaG9tbWUKKyAqIENvcHlyaWdodCAoYykgMjAwNyBXb2xmcmFtIEdsb2dlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1pY2hlbGUgT3Jyw7kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAidXJsLmgiCisKKyNkZWZpbmUgQVZfQ0FUX1NFUEFSQVRPUiAifCIKKworc3RydWN0IGNvbmNhdF9ub2RlcyB7CisgICAgVVJMQ29udGV4dCAqdWM7ICAgICAgICAgICAgICAgIC8vLzwgbm9kZSdzIFVSTENvbnRleHQKKyAgICBpbnQ2NF90ICAgICBzaXplOyAgICAgICAgICAgICAgLy8vPCB1cmwgZmlsZXNpemUKK307CisKK3N0cnVjdCBjb25jYXRfZGF0YSB7CisgICAgc3RydWN0IGNvbmNhdF9ub2RlcyAqbm9kZXM7ICAgIC8vLzwgbGlzdCBvZiBub2RlcyB0byBjb25jYXQKKyAgICBzaXplX3QgICAgICAgICAgICAgICBsZW5ndGg7ICAgLy8vPCBudW1iZXIgb2YgY2F0J2VkIG5vZGVzCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgY3VycmVudDsgIC8vLzwgaW5kZXggb2YgY3VycmVudGx5IHJlYWQgbm9kZQorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IGNvbmNhdF9jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIGludCBlcnIgPSAwOworICAgIHNpemVfdCBpOworICAgIHN0cnVjdCBjb25jYXRfZGF0YSAgKmRhdGEgID0gaC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBjb25jYXRfbm9kZXMgKm5vZGVzID0gZGF0YS0+bm9kZXM7CisKKyAgICBmb3IgKGkgPSAwOyBpICE9IGRhdGEtPmxlbmd0aDsgaSsrKQorICAgICAgICBlcnIgfD0gZmZ1cmxfY2xvc2Uobm9kZXNbaV0udWMpOworCisgICAgYXZfZnJlZXAoJmRhdGEtPm5vZGVzKTsKKworICAgIHJldHVybiBlcnIgPCAwID8gLTEgOiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgY29uY2F0X29wZW4oVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqdXJpLCBpbnQgZmxhZ3MpCit7CisgICAgY2hhciAqbm9kZV91cmkgPSBOVUxMOworICAgIGludCBlcnIgPSAwOworICAgIGludDY0X3Qgc2l6ZTsKKyAgICBzaXplX3QgbGVuLCBpOworICAgIFVSTENvbnRleHQgKnVjOworICAgIHN0cnVjdCBjb25jYXRfZGF0YSAgKmRhdGEgPSBoLT5wcml2X2RhdGE7CisgICAgc3RydWN0IGNvbmNhdF9ub2RlcyAqbm9kZXM7CisKKyAgICBhdl9zdHJzdGFydCh1cmksICJjb25jYXQ6IiwgJnVyaSk7CisKKyAgICBmb3IgKGkgPSAwLCBsZW4gPSAxOyB1cmlbaV07IGkrKykgeworICAgICAgICBpZiAodXJpW2ldID09ICpBVl9DQVRfU0VQQVJBVE9SKSB7CisgICAgICAgICAgICAvKiBpbnRlZ2VyIG92ZXJmbG93ICovCisgICAgICAgICAgICBpZiAoKytsZW4gPT0gVUlOVF9NQVggLyBzaXplb2YoKm5vZGVzKSkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZoLT5wcml2X2RhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOQU1FVE9PTE9ORyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIShub2RlcyA9IGF2X3JlYWxsb2MoTlVMTCwgc2l6ZW9mKCpub2RlcykgKiBsZW4pKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBlbHNlCisgICAgICAgIGRhdGEtPm5vZGVzID0gbm9kZXM7CisKKyAgICAvKiBoYW5kbGUgaW5wdXQgKi8KKyAgICBpZiAoISp1cmkpCisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PRU5UKTsKKyAgICBmb3IgKGkgPSAwOyAqdXJpOyBpKyspIHsKKyAgICAgICAgLyogcGFyc2luZyB1cmkgKi8KKyAgICAgICAgbGVuID0gc3RyY3Nwbih1cmksIEFWX0NBVF9TRVBBUkFUT1IpOworICAgICAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZub2RlX3VyaSwgbGVuICsgMSkpIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhdl9zdHJsY3B5KG5vZGVfdXJpLCB1cmksIGxlbiArIDEpOworICAgICAgICB1cmkgKz0gbGVuICsgc3Ryc3BuKHVyaSArIGxlbiwgQVZfQ0FUX1NFUEFSQVRPUik7CisKKyAgICAgICAgLyogY3JlYXRpbmcgVVJMQ29udGV4dCAqLworICAgICAgICBpZiAoKGVyciA9IGZmdXJsX29wZW4oJnVjLCBub2RlX3VyaSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMKSkgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogY3JlYXRpbmcgc2l6ZSAqLworICAgICAgICBpZiAoKHNpemUgPSBmZnVybF9zaXplKHVjKSkgPCAwKSB7CisgICAgICAgICAgICBmZnVybF9jbG9zZSh1Yyk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFzc2VtYmxpbmcgKi8KKyAgICAgICAgbm9kZXNbaV0udWMgICA9IHVjOworICAgICAgICBub2Rlc1tpXS5zaXplID0gc2l6ZTsKKyAgICB9CisgICAgYXZfZnJlZShub2RlX3VyaSk7CisgICAgZGF0YS0+bGVuZ3RoID0gaTsKKworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBjb25jYXRfY2xvc2UoaCk7CisgICAgZWxzZSBpZiAoIShub2RlcyA9IGF2X3JlYWxsb2Mobm9kZXMsIGRhdGEtPmxlbmd0aCAqIHNpemVvZigqbm9kZXMpKSkpIHsKKyAgICAgICAgY29uY2F0X2Nsb3NlKGgpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgfSBlbHNlCisgICAgICAgIGRhdGEtPm5vZGVzID0gbm9kZXM7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjb25jYXRfcmVhZChVUkxDb250ZXh0ICpoLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKQoreworICAgIGludCByZXN1bHQsIHRvdGFsID0gMDsKKyAgICBzdHJ1Y3QgY29uY2F0X2RhdGEgICpkYXRhICA9IGgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgY29uY2F0X25vZGVzICpub2RlcyA9IGRhdGEtPm5vZGVzOworICAgIHNpemVfdCBpICAgICAgICAgICAgICAgICAgID0gZGF0YS0+Y3VycmVudDsKKworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICByZXN1bHQgPSBmZnVybF9yZWFkKG5vZGVzW2ldLnVjLCBidWYsIHNpemUpOworICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiB0b3RhbCA/IHRvdGFsIDogcmVzdWx0OworICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgaWYgKGkgKyAxID09IGRhdGEtPmxlbmd0aCB8fAorICAgICAgICAgICAgICAgIGZmdXJsX3NlZWsobm9kZXNbKytpXS51YywgMCwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0b3RhbCArPSByZXN1bHQ7CisgICAgICAgIGJ1ZiAgICs9IHJlc3VsdDsKKyAgICAgICAgc2l6ZSAgLT0gcmVzdWx0OworICAgIH0KKyAgICBkYXRhLT5jdXJyZW50ID0gaTsKKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGNvbmNhdF9zZWVrKFVSTENvbnRleHQgKmgsIGludDY0X3QgcG9zLCBpbnQgd2hlbmNlKQoreworICAgIGludDY0X3QgcmVzdWx0OworICAgIHN0cnVjdCBjb25jYXRfZGF0YSAgKmRhdGEgID0gaC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBjb25jYXRfbm9kZXMgKm5vZGVzID0gZGF0YS0+bm9kZXM7CisgICAgc2l6ZV90IGk7CisKKyAgICBzd2l0Y2ggKHdoZW5jZSkgeworICAgIGNhc2UgU0VFS19FTkQ6CisgICAgICAgIGZvciAoaSA9IGRhdGEtPmxlbmd0aCAtIDE7IGkgJiYgcG9zIDwgLW5vZGVzW2ldLnNpemU7IGktLSkKKyAgICAgICAgICAgIHBvcyArPSBub2Rlc1tpXS5zaXplOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFRUtfQ1VSOgorICAgICAgICAvKiBnZXQgdGhlIGFic29sdXRlIHBvc2l0aW9uICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgIT0gZGF0YS0+Y3VycmVudDsgaSsrKQorICAgICAgICAgICAgcG9zICs9IG5vZGVzW2ldLnNpemU7CisgICAgICAgIHBvcyArPSBmZnVybF9zZWVrKG5vZGVzW2ldLnVjLCAwLCBTRUVLX0NVUik7CisgICAgICAgIHdoZW5jZSA9IFNFRUtfU0VUOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggd2l0aCB0aGUgYWJzb2x1dGUgcG9zaXRpb24gKi8KKyAgICBjYXNlIFNFRUtfU0VUOgorICAgICAgICBmb3IgKGkgPSAwOyBpICE9IGRhdGEtPmxlbmd0aCAtIDEgJiYgcG9zID49IG5vZGVzW2ldLnNpemU7IGkrKykKKyAgICAgICAgICAgIHBvcyAtPSBub2Rlc1tpXS5zaXplOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJlc3VsdCA9IGZmdXJsX3NlZWsobm9kZXNbaV0udWMsIHBvcywgd2hlbmNlKTsKKyAgICBpZiAocmVzdWx0ID49IDApIHsKKyAgICAgICAgZGF0YS0+Y3VycmVudCA9IGk7CisgICAgICAgIHdoaWxlIChpKQorICAgICAgICAgICAgcmVzdWx0ICs9IG5vZGVzWy0taV0uc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVVJMUHJvdG9jb2wgZmZfY29uY2F0X3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjb25jYXQiLAorICAgIC51cmxfb3BlbiAgICAgICA9IGNvbmNhdF9vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICA9IGNvbmNhdF9yZWFkLAorICAgIC51cmxfc2VlayAgICAgICA9IGNvbmNhdF9zZWVrLAorICAgIC51cmxfY2xvc2UgICAgICA9IGNvbmNhdF9jbG9zZSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGNvbmNhdF9kYXRhKSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvY29uY2F0ZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvY29uY2F0ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1ODRkNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9jb25jYXRkZWMuYwpAQCAtMCwwICsxLDY0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBOaWNvbGFzIEdlb3JnZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lc3RhbXAuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidXJsLmgiCisKK3R5cGVkZWYgZW51bSBDb25jYXRNYXRjaE1vZGUgeworICAgIE1BVENIX09ORV9UT19PTkUsCisgICAgTUFUQ0hfRVhBQ1RfSUQsCit9IENvbmNhdE1hdGNoTW9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ29uY2F0U3RyZWFtIHsKKyAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZjsKKyAgICBpbnQgb3V0X3N0cmVhbV9pbmRleDsKK30gQ29uY2F0U3RyZWFtOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAqdXJsOworICAgIGludDY0X3Qgc3RhcnRfdGltZTsKKyAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgIENvbmNhdFN0cmVhbSAqc3RyZWFtczsKKyAgICBpbnQgbmJfc3RyZWFtczsKK30gQ29uY2F0RmlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIENvbmNhdEZpbGUgKmZpbGVzOworICAgIENvbmNhdEZpbGUgKmN1cl9maWxlOworICAgIHVuc2lnbmVkIG5iX2ZpbGVzOworICAgIEFWRm9ybWF0Q29udGV4dCAqYXZmOworICAgIGludCBzYWZlOworICAgIGludCBzZWVrYWJsZTsKKyAgICBDb25jYXRNYXRjaE1vZGUgc3RyZWFtX21hdGNoX21vZGU7CisgICAgdW5zaWduZWQgYXV0b19jb252ZXJ0OworfSBDb25jYXRDb250ZXh0OworCitzdGF0aWMgaW50IGNvbmNhdF9wcm9iZShBVlByb2JlRGF0YSAqcHJvYmUpCit7CisgICAgcmV0dXJuIG1lbWNtcChwcm9iZS0+YnVmLCAiZmZjb25jYXQgdmVyc2lvbiAxLjAiLCAyMCkgPworICAgICAgICAgICAwIDogQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfa2V5d29yZCh1aW50OF90ICoqY3Vyc29yKQoreworICAgIGNoYXIgKnJldCA9ICpjdXJzb3IgKz0gc3Ryc3BuKCpjdXJzb3IsIFNQQUNFX0NIQVJTKTsKKyAgICAqY3Vyc29yICs9IHN0cmNzcG4oKmN1cnNvciwgU1BBQ0VfQ0hBUlMpOworICAgIGlmICgqKmN1cnNvcikgeworICAgICAgICAqKCgqY3Vyc29yKSsrKSA9IDA7CisgICAgICAgICpjdXJzb3IgKz0gc3Ryc3BuKCpjdXJzb3IsIFNQQUNFX0NIQVJTKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzYWZlX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKmYpCit7CisgICAgY29uc3QgY2hhciAqc3RhcnQgPSBmOworCisgICAgZm9yICg7ICpmOyBmKyspIHsKKyAgICAgICAgLyogQS1aYS16MC05Xy0gKi8KKyAgICAgICAgaWYgKCEoKHVuc2lnbmVkKSgoKmYgfCAzMikgLSAnYScpIDwgMjYgfHwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkKSgqZiAtICcwJykgPCAxMCB8fCAqZiA9PSAnXycgfHwgKmYgPT0gJy0nKSkgeworICAgICAgICAgICAgaWYgKGYgPT0gc3RhcnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIGlmICgqZiA9PSAnLycpCisgICAgICAgICAgICAgICAgc3RhcnQgPSBmICsgMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpmICE9ICcuJykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworI2RlZmluZSBGQUlMKHJldGNvZGUpIGRvIHsgcmV0ID0gKHJldGNvZGUpOyBnb3RvIGZhaWw7IH0gd2hpbGUoMCkKKworc3RhdGljIGludCBhZGRfZmlsZShBVkZvcm1hdENvbnRleHQgKmF2ZiwgY2hhciAqZmlsZW5hbWUsIENvbmNhdEZpbGUgKipyZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm5iX2ZpbGVzX2FsbG9jKQoreworICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGF2Zi0+cHJpdl9kYXRhOworICAgIENvbmNhdEZpbGUgKmZpbGU7CisgICAgY2hhciAqdXJsID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpwcm90bzsKKyAgICBzaXplX3QgdXJsX2xlbiwgcHJvdG9fbGVuOworICAgIGludCByZXQ7CisKKyAgICBpZiAoY2F0LT5zYWZlID4gMCAmJiAhc2FmZV9maWxlbmFtZShmaWxlbmFtZSkpIHsKKyAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLCAiVW5zYWZlIGZpbGUgbmFtZSAnJXMnXG4iLCBmaWxlbmFtZSk7CisgICAgICAgIEZBSUwoQVZFUlJPUihFUEVSTSkpOworICAgIH0KKworICAgIHByb3RvID0gYXZpb19maW5kX3Byb3RvY29sX25hbWUoZmlsZW5hbWUpOworICAgIHByb3RvX2xlbiA9IHByb3RvID8gc3RybGVuKHByb3RvKSA6IDA7CisgICAgaWYgKCFtZW1jbXAoZmlsZW5hbWUsIHByb3RvLCBwcm90b19sZW4pICYmCisgICAgICAgIChmaWxlbmFtZVtwcm90b19sZW5dID09ICc6JyB8fCBmaWxlbmFtZVtwcm90b19sZW5dID09ICcsJykpIHsKKyAgICAgICAgdXJsID0gZmlsZW5hbWU7CisgICAgICAgIGZpbGVuYW1lID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICB1cmxfbGVuID0gc3RybGVuKGF2Zi0+ZmlsZW5hbWUpICsgc3RybGVuKGZpbGVuYW1lKSArIDE2OworICAgICAgICBpZiAoISh1cmwgPSBhdl9tYWxsb2ModXJsX2xlbikpKQorICAgICAgICAgICAgRkFJTChBVkVSUk9SKEVOT01FTSkpOworICAgICAgICBmZl9tYWtlX2Fic29sdXRlX3VybCh1cmwsIHVybF9sZW4sIGF2Zi0+ZmlsZW5hbWUsIGZpbGVuYW1lKTsKKyAgICAgICAgYXZfZnJlZXAoJmZpbGVuYW1lKTsKKyAgICB9CisKKyAgICBpZiAoY2F0LT5uYl9maWxlcyA+PSAqbmJfZmlsZXNfYWxsb2MpIHsKKyAgICAgICAgc2l6ZV90IG4gPSBGRk1BWCgqbmJfZmlsZXNfYWxsb2MgKiAyLCAxNik7CisgICAgICAgIENvbmNhdEZpbGUgKm5ld19maWxlczsKKyAgICAgICAgaWYgKG4gPD0gY2F0LT5uYl9maWxlcyB8fCBuID4gU0laRV9NQVggLyBzaXplb2YoKmNhdC0+ZmlsZXMpIHx8CisgICAgICAgICAgICAhKG5ld19maWxlcyA9IGF2X3JlYWxsb2MoY2F0LT5maWxlcywgbiAqIHNpemVvZigqY2F0LT5maWxlcykpKSkKKyAgICAgICAgICAgIEZBSUwoQVZFUlJPUihFTk9NRU0pKTsKKyAgICAgICAgY2F0LT5maWxlcyA9IG5ld19maWxlczsKKyAgICAgICAgKm5iX2ZpbGVzX2FsbG9jID0gbjsKKyAgICB9CisKKyAgICBmaWxlID0gJmNhdC0+ZmlsZXNbY2F0LT5uYl9maWxlcysrXTsKKyAgICBtZW1zZXQoZmlsZSwgMCwgc2l6ZW9mKCpmaWxlKSk7CisgICAgKnJmaWxlID0gZmlsZTsKKworICAgIGZpbGUtPnVybCAgICAgICAgPSB1cmw7CisgICAgZmlsZS0+c3RhcnRfdGltZSA9IEFWX05PUFRTX1ZBTFVFOworICAgIGZpbGUtPmR1cmF0aW9uICAgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2ZyZWUodXJsKTsKKyAgICBhdl9mcmVlKGZpbGVuYW1lKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvcHlfc3RyZWFtX3Byb3BzKEFWU3RyZWFtICpzdCwgQVZTdHJlYW0gKnNvdXJjZV9zdCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgfHwgIXNvdXJjZV9zdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplIDwgc291cmNlX3N0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgICAgIHJldCA9IGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX3N0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsIHNvdXJjZV9zdC0+Y29kZWMtPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgIHNvdXJjZV9zdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgocmV0ID0gYXZjb2RlY19jb3B5X2NvbnRleHQoc3QtPmNvZGVjLCBzb3VyY2Vfc3QtPmNvZGVjKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHN0LT5yX2ZyYW1lX3JhdGUgICAgICAgID0gc291cmNlX3N0LT5yX2ZyYW1lX3JhdGU7CisgICAgc3QtPmF2Z19mcmFtZV9yYXRlICAgICAgPSBzb3VyY2Vfc3QtPmF2Z19mcmFtZV9yYXRlOworICAgIHN0LT50aW1lX2Jhc2UgICAgICAgICAgID0gc291cmNlX3N0LT50aW1lX2Jhc2U7CisgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzb3VyY2Vfc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGV0ZWN0X3N0cmVhbV9zcGVjaWZpYyhBVkZvcm1hdENvbnRleHQgKmF2ZiwgaW50IGlkeCkKK3sKKyAgICBDb25jYXRDb250ZXh0ICpjYXQgPSBhdmYtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBjYXQtPmF2Zi0+c3RyZWFtc1tpZHhdOworICAgIENvbmNhdFN0cmVhbSAqY3MgPSAmY2F0LT5jdXJfZmlsZS0+c3RyZWFtc1tpZHhdOworICAgIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmOworCisgICAgaWYgKGNhdC0+YXV0b19jb252ZXJ0ICYmIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCAmJgorICAgICAgICAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA8IDQgfHwgQVZfUkIzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSkgIT0gMSkpIHsKKyAgICAgICAgYXZfbG9nKGNhdC0+YXZmLCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICJBdXRvLWluc2VydGluZyBoMjY0X21wNHRvYW5uZXhiIGJpdHN0cmVhbSBmaWx0ZXJcbiIpOworICAgICAgICBpZiAoIShic2YgPSBhdl9iaXRzdHJlYW1fZmlsdGVyX2luaXQoImgyNjRfbXA0dG9hbm5leGIiKSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgImgyNjRfbXA0dG9hbm5leGIgYml0c3RyZWFtIGZpbHRlciAiCisgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGZvciBILjI2NCBzdHJlYW1zXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JTRl9OT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY3MtPmJzZiA9IGJzZjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfc3RyZWFtc19vbmVfdG9fb25lKEFWRm9ybWF0Q29udGV4dCAqYXZmKQoreworICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGF2Zi0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgaSwgcmV0OworCisgICAgZm9yIChpID0gY2F0LT5jdXJfZmlsZS0+bmJfc3RyZWFtczsgaSA8IGNhdC0+YXZmLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPCBhdmYtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgIHN0ID0gYXZmLT5zdHJlYW1zW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2ZiwgTlVMTCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBjb3B5X3N0cmVhbV9wcm9wcyhzdCwgY2F0LT5hdmYtPnN0cmVhbXNbaV0pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBjYXQtPmN1cl9maWxlLT5zdHJlYW1zW2ldLm91dF9zdHJlYW1faW5kZXggPSBpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXRjaF9zdHJlYW1zX2V4YWN0X2lkKEFWRm9ybWF0Q29udGV4dCAqYXZmKQoreworICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGF2Zi0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgaSwgaiwgcmV0OworCisgICAgZm9yIChpID0gY2F0LT5jdXJfZmlsZS0+bmJfc3RyZWFtczsgaSA8IGNhdC0+YXZmLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgc3QgPSBjYXQtPmF2Zi0+c3RyZWFtc1tpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Zi0+bmJfc3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICBpZiAoYXZmLT5zdHJlYW1zW2pdLT5pZCA9PSBzdC0+aWQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIk1hdGNoIHNsYXZlIHN0cmVhbSAjJWQgd2l0aCBzdHJlYW0gIyVkIGlkIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGksIGosIHN0LT5pZCk7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBjb3B5X3N0cmVhbV9wcm9wcyhhdmYtPnN0cmVhbXNbal0sIHN0KSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGNhdC0+Y3VyX2ZpbGUtPnN0cmVhbXNbaV0ub3V0X3N0cmVhbV9pbmRleCA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfc3RyZWFtcyhBVkZvcm1hdENvbnRleHQgKmF2ZikKK3sKKyAgICBDb25jYXRDb250ZXh0ICpjYXQgPSBhdmYtPnByaXZfZGF0YTsKKyAgICBDb25jYXRTdHJlYW0gKm1hcDsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKGNhdC0+Y3VyX2ZpbGUtPm5iX3N0cmVhbXMgPj0gY2F0LT5hdmYtPm5iX3N0cmVhbXMpCisgICAgICAgIHJldHVybiAwOworICAgIG1hcCA9IGF2X3JlYWxsb2MoY2F0LT5jdXJfZmlsZS0+c3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgIGNhdC0+YXZmLT5uYl9zdHJlYW1zICogc2l6ZW9mKCptYXApKTsKKyAgICBpZiAoIW1hcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBjYXQtPmN1cl9maWxlLT5zdHJlYW1zID0gbWFwOworICAgIG1lbXNldChtYXAgKyBjYXQtPmN1cl9maWxlLT5uYl9zdHJlYW1zLCAwLAorICAgICAgICAgICAoY2F0LT5hdmYtPm5iX3N0cmVhbXMgLSBjYXQtPmN1cl9maWxlLT5uYl9zdHJlYW1zKSAqIHNpemVvZigqbWFwKSk7CisKKyAgICBmb3IgKGkgPSBjYXQtPmN1cl9maWxlLT5uYl9zdHJlYW1zOyBpIDwgY2F0LT5hdmYtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgbWFwW2ldLm91dF9zdHJlYW1faW5kZXggPSAtMTsKKyAgICBzd2l0Y2ggKGNhdC0+c3RyZWFtX21hdGNoX21vZGUpIHsKKyAgICBjYXNlIE1BVENIX09ORV9UT19PTkU6CisgICAgICAgIHJldCA9IG1hdGNoX3N0cmVhbXNfb25lX3RvX29uZShhdmYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1BVENIX0VYQUNUX0lEOgorICAgICAgICByZXQgPSBtYXRjaF9zdHJlYW1zX2V4YWN0X2lkKGF2Zik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IEFWRVJST1JfQlVHOworICAgIH0KKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBmb3IgKGkgPSBjYXQtPmN1cl9maWxlLT5uYl9zdHJlYW1zOyBpIDwgY2F0LT5hdmYtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgaWYgKChyZXQgPSBkZXRlY3Rfc3RyZWFtX3NwZWNpZmljKGF2ZiwgaSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgY2F0LT5jdXJfZmlsZS0+bmJfc3RyZWFtcyA9IGNhdC0+YXZmLT5uYl9zdHJlYW1zOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wZW5fZmlsZShBVkZvcm1hdENvbnRleHQgKmF2ZiwgdW5zaWduZWQgZmlsZW5vKQoreworICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGF2Zi0+cHJpdl9kYXRhOworICAgIENvbmNhdEZpbGUgKmZpbGUgPSAmY2F0LT5maWxlc1tmaWxlbm9dOworICAgIGludCByZXQ7CisKKyAgICBpZiAoY2F0LT5hdmYpCisgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZjYXQtPmF2Zik7CisKKyAgICBjYXQtPmF2ZiA9IGF2Zm9ybWF0X2FsbG9jX2NvbnRleHQoKTsKKyAgICBpZiAoIWNhdC0+YXZmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY2F0LT5hdmYtPmludGVycnVwdF9jYWxsYmFjayA9IGF2Zi0+aW50ZXJydXB0X2NhbGxiYWNrOworCisgICAgaWYgKChyZXQgPSBmZl9jb3B5X3doaXRlbGlzdHMoY2F0LT5hdmYsIGF2ZikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmY2F0LT5hdmYsIGZpbGUtPnVybCwgTlVMTCwgTlVMTCkpIDwgMCB8fAorICAgICAgICAocmV0ID0gYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbyhjYXQtPmF2ZiwgTlVMTCkpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJJbXBvc3NpYmxlIHRvIG9wZW4gJyVzJ1xuIiwgZmlsZS0+dXJsKTsKKyAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmNhdC0+YXZmKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgY2F0LT5jdXJfZmlsZSA9IGZpbGU7CisgICAgaWYgKGZpbGUtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGZpbGUtPnN0YXJ0X3RpbWUgPSAhZmlsZW5vID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXQtPmZpbGVzW2ZpbGVubyAtIDFdLnN0YXJ0X3RpbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0LT5maWxlc1tmaWxlbm8gLSAxXS5kdXJhdGlvbjsKKyAgICBpZiAoKHJldCA9IG1hdGNoX3N0cmVhbXMoYXZmKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmNhdF9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqYXZmKQoreworICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGF2Zi0+cHJpdl9kYXRhOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBpZiAoY2F0LT5hdmYpCisgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZjYXQtPmF2Zik7CisgICAgZm9yIChpID0gMDsgaSA8IGNhdC0+bmJfZmlsZXM7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmY2F0LT5maWxlc1tpXS51cmwpOworICAgICAgICBhdl9mcmVlcCgmY2F0LT5maWxlc1tpXS5zdHJlYW1zKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmNhdC0+ZmlsZXMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmNhdF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmF2ZikKK3sKKyAgICBDb25jYXRDb250ZXh0ICpjYXQgPSBhdmYtPnByaXZfZGF0YTsKKyAgICB1aW50OF90IGJ1Zls0MDk2XTsKKyAgICB1aW50OF90ICpjdXJzb3IsICprZXl3b3JkOworICAgIGludCByZXQsIGxpbmUgPSAwLCBpOworICAgIHVuc2lnbmVkIG5iX2ZpbGVzX2FsbG9jID0gMDsKKyAgICBDb25jYXRGaWxlICpmaWxlID0gTlVMTDsKKyAgICBpbnQ2NF90IHRpbWUgPSAwOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfbGluZShhdmYtPnBiLCBidWYsIHNpemVvZihidWYpKSkgPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBsaW5lKys7CisgICAgICAgIGN1cnNvciA9IGJ1ZjsKKyAgICAgICAga2V5d29yZCA9IGdldF9rZXl3b3JkKCZjdXJzb3IpOworICAgICAgICBpZiAoISprZXl3b3JkIHx8ICprZXl3b3JkID09ICcjJykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICghc3RyY21wKGtleXdvcmQsICJmaWxlIikpIHsKKyAgICAgICAgICAgIGNoYXIgKmZpbGVuYW1lID0gYXZfZ2V0X3Rva2VuKChjb25zdCBjaGFyICoqKSZjdXJzb3IsIFNQQUNFX0NIQVJTKTsKKyAgICAgICAgICAgIGlmICghZmlsZW5hbWUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJMaW5lICVkOiBmaWxlbmFtZSByZXF1aXJlZFxuIiwgbGluZSk7CisgICAgICAgICAgICAgICAgRkFJTChBVkVSUk9SX0lOVkFMSUREQVRBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocmV0ID0gYWRkX2ZpbGUoYXZmLCBmaWxlbmFtZSwgJmZpbGUsICZuYl9maWxlc19hbGxvYykpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXl3b3JkLCAiZHVyYXRpb24iKSkgeworICAgICAgICAgICAgY2hhciAqZHVyX3N0ciA9IGdldF9rZXl3b3JkKCZjdXJzb3IpOworICAgICAgICAgICAgaW50NjRfdCBkdXI7CisgICAgICAgICAgICBpZiAoIWZpbGUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJMaW5lICVkOiBkdXJhdGlvbiB3aXRob3V0IGZpbGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOworICAgICAgICAgICAgICAgIEZBSUwoQVZFUlJPUl9JTlZBTElEREFUQSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X3BhcnNlX3RpbWUoJmR1ciwgZHVyX3N0ciwgMSkpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIkxpbmUgJWQ6IGludmFsaWQgZHVyYXRpb24gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZHVyX3N0cik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsZS0+ZHVyYXRpb24gPSBkdXI7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXl3b3JkLCAic3RyZWFtIikpIHsKKyAgICAgICAgICAgIGlmICghYXZmb3JtYXRfbmV3X3N0cmVhbShhdmYsIE5VTEwpKQorICAgICAgICAgICAgICAgIEZBSUwoQVZFUlJPUihFTk9NRU0pKTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleXdvcmQsICJleGFjdF9zdHJlYW1faWQiKSkgeworICAgICAgICAgICAgaWYgKCFhdmYtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJMaW5lICVkOiBleGFjdF9zdHJlYW1faWQgd2l0aG91dCBzdHJlYW1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOworICAgICAgICAgICAgICAgIEZBSUwoQVZFUlJPUl9JTlZBTElEREFUQSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmYtPnN0cmVhbXNbYXZmLT5uYl9zdHJlYW1zIC0gMV0tPmlkID0KKyAgICAgICAgICAgICAgICBzdHJ0b2woZ2V0X2tleXdvcmQoJmN1cnNvciksIE5VTEwsIDApOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5d29yZCwgImZmY29uY2F0IikpIHsKKyAgICAgICAgICAgIGNoYXIgKnZlcl9rdyAgPSBnZXRfa2V5d29yZCgmY3Vyc29yKTsKKyAgICAgICAgICAgIGNoYXIgKnZlcl92YWwgPSBnZXRfa2V5d29yZCgmY3Vyc29yKTsKKyAgICAgICAgICAgIGlmIChzdHJjbXAodmVyX2t3LCAidmVyc2lvbiIpIHx8IHN0cmNtcCh2ZXJfdmFsLCAiMS4wIikpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJMaW5lICVkOiBpbnZhbGlkIHZlcnNpb25cbiIsIGxpbmUpOworICAgICAgICAgICAgICAgIEZBSUwoQVZFUlJPUl9JTlZBTElEREFUQSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2F0LT5zYWZlIDwgMCkKKyAgICAgICAgICAgICAgICBjYXQtPnNhZmUgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLCAiTGluZSAlZDogdW5rbm93biBrZXl3b3JkICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgbGluZSwga2V5d29yZCk7CisgICAgICAgICAgICBGQUlMKEFWRVJST1JfSU5WQUxJRERBVEEpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKCFjYXQtPm5iX2ZpbGVzKQorICAgICAgICBGQUlMKEFWRVJST1JfSU5WQUxJRERBVEEpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNhdC0+bmJfZmlsZXM7IGkrKykgeworICAgICAgICBpZiAoY2F0LT5maWxlc1tpXS5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgY2F0LT5maWxlc1tpXS5zdGFydF90aW1lID0gdGltZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGltZSA9IGNhdC0+ZmlsZXNbaV0uc3RhcnRfdGltZTsKKyAgICAgICAgaWYgKGNhdC0+ZmlsZXNbaV0uZHVyYXRpb24gPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdGltZSArPSBjYXQtPmZpbGVzW2ldLmR1cmF0aW9uOworICAgIH0KKyAgICBpZiAoaSA9PSBjYXQtPm5iX2ZpbGVzKSB7CisgICAgICAgIGF2Zi0+ZHVyYXRpb24gPSB0aW1lOworICAgICAgICBjYXQtPnNlZWthYmxlID0gMTsKKyAgICB9CisKKyAgICBjYXQtPnN0cmVhbV9tYXRjaF9tb2RlID0gYXZmLT5uYl9zdHJlYW1zID8gTUFUQ0hfRVhBQ1RfSUQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRDSF9PTkVfVE9fT05FOworICAgIGlmICgocmV0ID0gb3Blbl9maWxlKGF2ZiwgMCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGNvbmNhdF9yZWFkX2Nsb3NlKGF2Zik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvcGVuX25leHRfZmlsZShBVkZvcm1hdENvbnRleHQgKmF2ZikKK3sKKyAgICBDb25jYXRDb250ZXh0ICpjYXQgPSBhdmYtPnByaXZfZGF0YTsKKyAgICB1bnNpZ25lZCBmaWxlbm8gPSBjYXQtPmN1cl9maWxlIC0gY2F0LT5maWxlczsKKworICAgIGlmIChjYXQtPmN1cl9maWxlLT5kdXJhdGlvbiA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgY2F0LT5jdXJfZmlsZS0+ZHVyYXRpb24gPSBjYXQtPmF2Zi0+ZHVyYXRpb247CisKKyAgICBpZiAoKytmaWxlbm8gPj0gY2F0LT5uYl9maWxlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIHJldHVybiBvcGVuX2ZpbGUoYXZmLCBmaWxlbm8pOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmYsIENvbmNhdFN0cmVhbSAqY3MsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZmLT5zdHJlYW1zW2NzLT5vdXRfc3RyZWFtX2luZGV4XTsKKyAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZjsKKyAgICBBVlBhY2tldCBwa3QyOworICAgIGludCByZXQ7CisKKyAgICBhdl9hc3NlcnQwKGNzLT5vdXRfc3RyZWFtX2luZGV4ID49IDApOworICAgIGZvciAoYnNmID0gY3MtPmJzZjsgYnNmOyBic2YgPSBic2YtPm5leHQpIHsKKyAgICAgICAgcGt0MiA9ICpwa3Q7CisgICAgICAgIHJldCA9IGF2X2JpdHN0cmVhbV9maWx0ZXJfZmlsdGVyKGJzZiwgc3QtPmNvZGVjLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGt0Mi5kYXRhLCAmcGt0Mi5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISEocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGF2X2Fzc2VydDAocGt0Mi5idWYpOworICAgICAgICBpZiAocmV0ID09IDAgJiYgcGt0Mi5kYXRhICE9IHBrdC0+ZGF0YSkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9jb3B5X3BhY2tldCgmcGt0MiwgcGt0KSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZShwa3QyLmRhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgcGt0Mi5idWYgPSBhdl9idWZmZXJfY3JlYXRlKHBrdDIuZGF0YSwgcGt0Mi5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2J1ZmZlcl9kZWZhdWx0X2ZyZWUsIE5VTEwsIDApOworICAgICAgICAgICAgaWYgKCFwa3QyLmJ1ZikgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUocGt0Mi5kYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpwa3QgPSBwa3QyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25jYXRfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmYsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQ29uY2F0Q29udGV4dCAqY2F0ID0gYXZmLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKyAgICBpbnQ2NF90IGRlbHRhOworICAgIENvbmNhdFN0cmVhbSAqY3M7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcmV0ID0gYXZfcmVhZF9mcmFtZShjYXQtPmF2ZiwgcGt0KTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgaWYgKChyZXQgPSBvcGVuX25leHRfZmlsZShhdmYpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKChyZXQgPSBtYXRjaF9zdHJlYW1zKGF2ZikpIDwgMCkgeworICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGNzID0gJmNhdC0+Y3VyX2ZpbGUtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworICAgICAgICBpZiAoY3MtPm91dF9zdHJlYW1faW5kZXggPCAwKSB7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gY3MtPm91dF9zdHJlYW1faW5kZXg7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKHJldCA9IGZpbHRlcl9wYWNrZXQoYXZmLCBjcywgcGt0KSkpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzdCA9IGNhdC0+YXZmLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICBhdl9sb2coYXZmLCBBVl9MT0dfREVCVUcsICJmaWxlOiVkIHN0cmVhbTolZCBwdHM6JXMgcHRzX3RpbWU6JXMgZHRzOiVzIGR0c190aW1lOiVzIiwKKyAgICAgICAgICAgKHVuc2lnbmVkKShjYXQtPmN1cl9maWxlIC0gY2F0LT5maWxlcyksIHBrdC0+c3RyZWFtX2luZGV4LAorICAgICAgICAgICBhdl90czJzdHIocGt0LT5wdHMpLCBhdl90czJ0aW1lc3RyKHBrdC0+cHRzLCAmc3QtPnRpbWVfYmFzZSksCisgICAgICAgICAgIGF2X3RzMnN0cihwa3QtPmR0cyksIGF2X3RzMnRpbWVzdHIocGt0LT5kdHMsICZzdC0+dGltZV9iYXNlKSk7CisKKyAgICBkZWx0YSA9IGF2X3Jlc2NhbGVfcShjYXQtPmN1cl9maWxlLT5zdGFydF90aW1lIC0gY2F0LT5hdmYtPnN0YXJ0X3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2F0LT5hdmYtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT50aW1lX2Jhc2UpOworICAgIGlmIChwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcGt0LT5wdHMgKz0gZGVsdGE7CisgICAgaWYgKHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBwa3QtPmR0cyArPSBkZWx0YTsKKyAgICBhdl9sb2coYXZmLCBBVl9MT0dfREVCVUcsICIgLT4gcHRzOiVzIHB0c190aW1lOiVzIGR0czolcyBkdHNfdGltZTolc1xuIiwKKyAgICAgICAgICAgYXZfdHMyc3RyKHBrdC0+cHRzKSwgYXZfdHMydGltZXN0cihwa3QtPnB0cywgJnN0LT50aW1lX2Jhc2UpLAorICAgICAgICAgICBhdl90czJzdHIocGt0LT5kdHMpLCBhdl90czJ0aW1lc3RyKHBrdC0+ZHRzLCAmc3QtPnRpbWVfYmFzZSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2NhbGVfaW50ZXJ2YWwoQVZSYXRpb25hbCB0Yl9pbiwgQVZSYXRpb25hbCB0Yl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKm1pbl90cywgaW50NjRfdCAqdHMsIGludDY0X3QgKm1heF90cykKK3sKKyAgICAqdHMgICAgID0gYXZfcmVzY2FsZV9xICAgICgqICAgIHRzLCB0Yl9pbiwgdGJfb3V0KTsKKyAgICAqbWluX3RzID0gYXZfcmVzY2FsZV9xX3JuZCgqbWluX3RzLCB0Yl9pbiwgdGJfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1JPVU5EX1VQICAgfCBBVl9ST1VORF9QQVNTX01JTk1BWCk7CisgICAgKm1heF90cyA9IGF2X3Jlc2NhbGVfcV9ybmQoKm1heF90cywgdGJfaW4sIHRiX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ST1VORF9ET1dOIHwgQVZfUk9VTkRfUEFTU19NSU5NQVgpOworfQorCitzdGF0aWMgaW50IHRyeV9zZWVrKEFWRm9ybWF0Q29udGV4dCAqYXZmLCBpbnQgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncykKK3sKKyAgICBDb25jYXRDb250ZXh0ICpjYXQgPSBhdmYtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IHQwID0gY2F0LT5jdXJfZmlsZS0+c3RhcnRfdGltZSAtIGNhdC0+YXZmLT5zdGFydF90aW1lOworCisgICAgdHMgLT0gdDA7CisgICAgbWluX3RzID0gbWluX3RzID09IElOVDY0X01JTiA/IElOVDY0X01JTiA6IG1pbl90cyAtIHQwOworICAgIG1heF90cyA9IG1heF90cyA9PSBJTlQ2NF9NQVggPyBJTlQ2NF9NQVggOiBtYXhfdHMgLSB0MDsKKyAgICBpZiAoc3RyZWFtID49IDApIHsKKyAgICAgICAgaWYgKHN0cmVhbSA+PSBjYXQtPmF2Zi0+bmJfc3RyZWFtcykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIHJlc2NhbGVfaW50ZXJ2YWwoQVZfVElNRV9CQVNFX1EsIGNhdC0+YXZmLT5zdHJlYW1zW3N0cmVhbV0tPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbWluX3RzLCAmdHMsICZtYXhfdHMpOworICAgIH0KKyAgICByZXR1cm4gYXZmb3JtYXRfc2Vla19maWxlKGNhdC0+YXZmLCBzdHJlYW0sIG1pbl90cywgdHMsIG1heF90cywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHJlYWxfc2VlayhBVkZvcm1hdENvbnRleHQgKmF2ZiwgaW50IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3RzLCBpbnQ2NF90IHRzLCBpbnQ2NF90IG1heF90cywgaW50IGZsYWdzKQoreworICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGF2Zi0+cHJpdl9kYXRhOworICAgIGludCByZXQsIGxlZnQsIHJpZ2h0OworCisgICAgaWYgKHN0cmVhbSA+PSAwKSB7CisgICAgICAgIGlmIChzdHJlYW0gPj0gYXZmLT5uYl9zdHJlYW1zKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgcmVzY2FsZV9pbnRlcnZhbChhdmYtPnN0cmVhbXNbc3RyZWFtXS0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbWluX3RzLCAmdHMsICZtYXhfdHMpOworICAgIH0KKworICAgIGxlZnQgID0gMDsKKyAgICByaWdodCA9IGNhdC0+bmJfZmlsZXM7CisgICAgd2hpbGUgKHJpZ2h0IC0gbGVmdCA+IDEpIHsKKyAgICAgICAgaW50IG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKKyAgICAgICAgaWYgKHRzIDwgY2F0LT5maWxlc1ttaWRdLnN0YXJ0X3RpbWUpCisgICAgICAgICAgICByaWdodCA9IG1pZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVmdCAgPSBtaWQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBvcGVuX2ZpbGUoYXZmLCBsZWZ0KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gdHJ5X3NlZWsoYXZmLCBzdHJlYW0sIG1pbl90cywgdHMsIG1heF90cywgZmxhZ3MpOworICAgIGlmIChyZXQgPCAwICYmCisgICAgICAgIGxlZnQgPCBjYXQtPm5iX2ZpbGVzIC0gMSAmJgorICAgICAgICBjYXQtPmZpbGVzW2xlZnQgKyAxXS5zdGFydF90aW1lIDwgbWF4X3RzKSB7CisgICAgICAgIGlmICgocmV0ID0gb3Blbl9maWxlKGF2ZiwgbGVmdCArIDEpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSB0cnlfc2VlayhhdmYsIHN0cmVhbSwgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncyk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29uY2F0X3NlZWsoQVZGb3JtYXRDb250ZXh0ICphdmYsIGludCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3RzLCBpbnQ2NF90IHRzLCBpbnQ2NF90IG1heF90cywgaW50IGZsYWdzKQoreworICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGF2Zi0+cHJpdl9kYXRhOworICAgIENvbmNhdEZpbGUgKmN1cl9maWxlX3NhdmVkID0gY2F0LT5jdXJfZmlsZTsKKyAgICBBVkZvcm1hdENvbnRleHQgKmN1cl9hdmZfc2F2ZWQgPSBjYXQtPmF2ZjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFjYXQtPnNlZWthYmxlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFU1BJUEUpOyAvKiBYWFg6IGNhbiB3ZSB1c2UgaXQ/ICovCisgICAgaWYgKGZsYWdzICYgKEFWU0VFS19GTEFHX0JZVEUgfCBBVlNFRUtfRkxBR19GUkFNRSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgY2F0LT5hdmYgPSBOVUxMOworICAgIGlmICgocmV0ID0gcmVhbF9zZWVrKGF2Ziwgc3RyZWFtLCBtaW5fdHMsIHRzLCBtYXhfdHMsIGZsYWdzKSkgPCAwKSB7CisgICAgICAgIGlmIChjYXQtPmF2ZikKKyAgICAgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZjYXQtPmF2Zik7CisgICAgICAgIGNhdC0+YXZmICAgICAgPSBjdXJfYXZmX3NhdmVkOworICAgICAgICBjYXQtPmN1cl9maWxlID0gY3VyX2ZpbGVfc2F2ZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmN1cl9hdmZfc2F2ZWQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDb25jYXRDb250ZXh0LCB4KQorI2RlZmluZSBERUMgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJzYWZlIiwgImVuYWJsZSBzYWZlIG1vZGUiLAorICAgICAgT0ZGU0VUKHNhZmUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgMSwgREVDIH0sCisgICAgeyAiYXV0b19jb252ZXJ0IiwgImF1dG9tYXRpY2FsbHkgY29udmVydCBiaXRzdHJlYW0gZm9ybWF0IiwKKyAgICAgIE9GRlNFVChhdXRvX2NvbnZlcnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIERFQyB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBjb25jYXRfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiY29uY2F0IGRlbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworCitBVklucHV0Rm9ybWF0IGZmX2NvbmNhdF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjb25jYXQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWaXJ0dWFsIGNvbmNhdGVuYXRpb24gc2NyaXB0IiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENvbmNhdENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGNvbmNhdF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBjb25jYXRfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gY29uY2F0X3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGNvbmNhdF9yZWFkX2Nsb3NlLAorICAgIC5yZWFkX3NlZWsyICAgICA9IGNvbmNhdF9zZWVrLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZjb25jYXRfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2NyY2VuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2NyY2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGZlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvY3JjZW5jLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENSQyBlbmNvZGVyIChmb3IgY29kZWMvZm9ybWF0IHRlc3RpbmcpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2FkbGVyMzIuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCit0eXBlZGVmIHN0cnVjdCBDUkNTdGF0ZSB7CisgICAgdWludDMyX3QgY3JjdmFsOworfSBDUkNTdGF0ZTsKKworc3RhdGljIGludCBjcmNfd3JpdGVfaGVhZGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQ1JDU3RhdGUgKmNyYyA9IHMtPnByaXZfZGF0YTsKKworICAgIC8qIGluaXQgQ1JDICovCisgICAgY3JjLT5jcmN2YWwgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JjX3dyaXRlX3BhY2tldChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIENSQ1N0YXRlICpjcmMgPSBzLT5wcml2X2RhdGE7CisgICAgY3JjLT5jcmN2YWwgPSBhdl9hZGxlcjMyX3VwZGF0ZShjcmMtPmNyY3ZhbCwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyY193cml0ZV90cmFpbGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQ1JDU3RhdGUgKmNyYyA9IHMtPnByaXZfZGF0YTsKKyAgICBjaGFyIGJ1Zls2NF07CisKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQ1JDPTB4JTA4IlBSSXgzMiJcbiIsIGNyYy0+Y3JjdmFsKTsKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBidWYsIHN0cmxlbihidWYpKTsKKworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9jcmNfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImNyYyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNSQyB0ZXN0aW5nIiksCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKENSQ1N0YXRlKSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gY3JjX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBjcmNfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IGNyY193cml0ZV90cmFpbGVyLAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvY3J5cHRvLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvY3J5cHRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3NTRiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9jcnlwdG8uYwpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIERlY3J5cHRpb24gcHJvdG9jb2wgaGFuZGxlcgorICogQ29weXJpZ2h0IChjKSAyMDExIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKworI2RlZmluZSBNQVhfQlVGRkVSX0JMT0NLUyAxNTAKKyNkZWZpbmUgQkxPQ0tTSVpFIDE2CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBVUkxDb250ZXh0ICpoZDsKKyAgICB1aW50OF90IGluYnVmZmVyIFtCTE9DS1NJWkUqTUFYX0JVRkZFUl9CTE9DS1NdLAorICAgICAgICAgICAgb3V0YnVmZmVyW0JMT0NLU0laRSpNQVhfQlVGRkVSX0JMT0NLU107CisgICAgdWludDhfdCAqb3V0cHRyOworICAgIGludCBpbmRhdGEsIGluZGF0YV91c2VkLCBvdXRkYXRhOworICAgIGludCBlb2Y7CisgICAgdWludDhfdCAqa2V5OworICAgIGludCBrZXlsZW47CisgICAgdWludDhfdCAqaXY7CisgICAgaW50IGl2bGVuOworICAgIHVpbnQ4X3QgKmRlY3J5cHRfa2V5OworICAgIGludCBkZWNyeXB0X2tleWxlbjsKKyAgICB1aW50OF90ICpkZWNyeXB0X2l2OworICAgIGludCBkZWNyeXB0X2l2bGVuOworICAgIHVpbnQ4X3QgKmVuY3J5cHRfa2V5OworICAgIGludCBlbmNyeXB0X2tleWxlbjsKKyAgICB1aW50OF90ICplbmNyeXB0X2l2OworICAgIGludCBlbmNyeXB0X2l2bGVuOworICAgIHN0cnVjdCBBVkFFUyAqYWVzX2RlY3J5cHQ7CisgICAgc3RydWN0IEFWQUVTICphZXNfZW5jcnlwdDsKKworICAgIHVpbnQ4X3QgcGFkW0JMT0NLU0laRV07CisgICAgaW50IHBhZF9sZW47CisKK30gQ3J5cHRvQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ3J5cHRvQ29udGV4dCwgeCkKKyNkZWZpbmUgRCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorI2RlZmluZSBFIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsia2V5IiwgIkFFUyBlbmNyeXB0aW9uL2RlY3J5cHRpb24ga2V5IiwgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGtleSksICAgICAgICAgQVZfT1BUX1RZUEVfQklOQVJZLCAuZmxhZ3MgPSBEfEUgfSwKKyAgICB7Iml2IiwgICJBRVMgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGluaXRpYWxpemF0aW9uIHZlY3RvciIsIE9GRlNFVChpdiksICAgICAgICAgIEFWX09QVF9UWVBFX0JJTkFSWSwgLmZsYWdzID0gRHxFIH0sCisgICAgeyJkZWNyeXB0aW9uX2tleSIsICJBRVMgZGVjcnlwdGlvbiBrZXkiLCAgICAgICAgICAgICAgICAgICBPRkZTRVQoZGVjcnlwdF9rZXkpLCBBVl9PUFRfVFlQRV9CSU5BUlksIC5mbGFncyA9IEQgfSwKKyAgICB7ImRlY3J5cHRpb25faXYiLCAgIkFFUyBkZWNyeXB0aW9uIGluaXRpYWxpemF0aW9uIHZlY3RvciIsIE9GRlNFVChkZWNyeXB0X2l2KSwgIEFWX09QVF9UWVBFX0JJTkFSWSwgLmZsYWdzID0gRCB9LAorICAgIHsiZW5jcnlwdGlvbl9rZXkiLCAiQUVTIGVuY3J5cHRpb24ga2V5IiwgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGVuY3J5cHRfa2V5KSwgQVZfT1BUX1RZUEVfQklOQVJZLCAuZmxhZ3MgPSBFIH0sCisgICAgeyJlbmNyeXB0aW9uX2l2IiwgICJBRVMgZW5jcnlwdGlvbiBpbml0aWFsaXphdGlvbiB2ZWN0b3IiLCBPRkZTRVQoZW5jcnlwdF9pdiksICBBVl9PUFRfVFlQRV9CSU5BUlksIC5mbGFncyA9IEUgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgY3J5cHRvX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICA9ICJjcnlwdG8iLAorICAgIC5pdGVtX25hbWUgICAgICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGludCBzZXRfYWVzX2FyZyhDcnlwdG9Db250ZXh0ICpjLCB1aW50OF90ICoqYnVmLCBpbnQgKmJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlZmF1bHRfYnVmLCBpbnQgZGVmYXVsdF9idWZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjKQoreworICAgIGlmICghKmJ1Zl9sZW4pIHsKKyAgICAgICAgaWYgKCFkZWZhdWx0X2J1Zl9sZW4pIHsKKyAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICIlcyBub3Qgc2V0XG4iLCBkZXNjKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdF9idWZfbGVuICE9IEJMT0NLU0laRSkgeworICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiaW52YWxpZCAlcyBzaXplICglZCBieXRlcywgYmxvY2sgc2l6ZSBpcyAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgZGVzYywgZGVmYXVsdF9idWZfbGVuLCBCTE9DS1NJWkUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICAqYnVmID0gYXZfbWVtZHVwKGRlZmF1bHRfYnVmLCBkZWZhdWx0X2J1Zl9sZW4pOworICAgICAgICBpZiAoISpidWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAqYnVmX2xlbiA9IGRlZmF1bHRfYnVmX2xlbjsKKyAgICB9IGVsc2UgaWYgKCpidWZfbGVuICE9IEJMT0NLU0laRSkgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImludmFsaWQgJXMgc2l6ZSAoJWQgYnl0ZXMsIGJsb2NrIHNpemUgaXMgJWQpXG4iLAorICAgICAgICAgICAgICAgZGVzYywgKmJ1Zl9sZW4sIEJMT0NLU0laRSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyeXB0b19vcGVuMihVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmksIGludCBmbGFncywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykKK3sKKyAgICBjb25zdCBjaGFyICpuZXN0ZWRfdXJsOworICAgIGludCByZXQgPSAwOworICAgIENyeXB0b0NvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisKKyAgICBpZiAoIWF2X3N0cnN0YXJ0KHVyaSwgImNyeXB0bysiLCAmbmVzdGVkX3VybCkgJiYKKyAgICAgICAgIWF2X3N0cnN0YXJ0KHVyaSwgImNyeXB0bzoiLCAmbmVzdGVkX3VybCkpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHVybCAlc1xuIiwgdXJpKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBBVklPX0ZMQUdfUkVBRCkgeworICAgICAgICBpZiAoKHJldCA9IHNldF9hZXNfYXJnKGMsICZjLT5kZWNyeXB0X2tleSwgJmMtPmRlY3J5cHRfa2V5bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmtleSwgYy0+a2V5bGVuLCAiZGVjcnlwdGlvbiBrZXkiKSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIGlmICgocmV0ID0gc2V0X2Flc19hcmcoYywgJmMtPmRlY3J5cHRfaXYsICZjLT5kZWNyeXB0X2l2bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmtleSwgYy0+a2V5bGVuLCAiZGVjcnlwdGlvbiBJViIpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUpIHsKKyAgICAgICAgaWYgKChyZXQgPSBzZXRfYWVzX2FyZyhjLCAmYy0+ZW5jcnlwdF9rZXksICZjLT5lbmNyeXB0X2tleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5rZXksIGMtPmtleWxlbiwgImVuY3J5cHRpb24ga2V5IikpIDwgMCkKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgaWYgKChyZXQgPSBzZXRfYWVzX2FyZyhjLCAmYy0+ZW5jcnlwdF9pdiwgJmMtPmVuY3J5cHRfaXZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+a2V5LCBjLT5rZXlsZW4sICJlbmNyeXB0aW9uIElWIikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZ1cmxfb3BlbigmYy0+aGQsIG5lc3RlZF91cmwsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBvcHRpb25zKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiByZXNvdXJjZTogJXNcbiIsIG5lc3RlZF91cmwpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBBVklPX0ZMQUdfUkVBRCkgeworICAgICAgICBjLT5hZXNfZGVjcnlwdCA9IGF2X2Flc19hbGxvYygpOworICAgICAgICBpZiAoIWMtPmFlc19kZWNyeXB0KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBhdl9hZXNfaW5pdChjLT5hZXNfZGVjcnlwdCwgYy0+ZGVjcnlwdF9rZXksIEJMT0NLU0laRSo4LCAxKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUpIHsKKyAgICAgICAgYy0+YWVzX2VuY3J5cHQgPSBhdl9hZXNfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFjLT5hZXNfZW5jcnlwdCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gYXZfYWVzX2luaXQoYy0+YWVzX2VuY3J5cHQsIGMtPmVuY3J5cHRfa2V5LCBCTE9DS1NJWkUqOCwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgYy0+cGFkX2xlbiA9IDA7CisKKyAgICBoLT5pc19zdHJlYW1lZCA9IDE7CisKK2VycjoKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNyeXB0b19yZWFkKFVSTENvbnRleHQgKmgsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgQ3J5cHRvQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgYmxvY2tzOworcmV0cnk6CisgICAgaWYgKGMtPm91dGRhdGEgPiAwKSB7CisgICAgICAgIHNpemUgPSBGRk1JTihzaXplLCBjLT5vdXRkYXRhKTsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgYy0+b3V0cHRyLCBzaXplKTsKKyAgICAgICAgYy0+b3V0cHRyICArPSBzaXplOworICAgICAgICBjLT5vdXRkYXRhIC09IHNpemU7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKyAgICAvLyBXZSBhdm9pZCB1c2luZyB0aGUgbGFzdCBibG9jayB1bnRpbCB3ZSd2ZSBmb3VuZCBFT0YsCisgICAgLy8gc2luY2Ugd2UnbGwgcmVtb3ZlIFBLQ1M3IHBhZGRpbmcgYXQgdGhlIGVuZC4gU28gbWFrZQorICAgIC8vIHN1cmUgd2UndmUgZ290IGF0IGxlYXN0IDIgYmxvY2tzLCBzbyB3ZSBjYW4gZGVjcnlwdAorICAgIC8vIGF0IGxlYXN0IG9uZS4KKyAgICB3aGlsZSAoYy0+aW5kYXRhIC0gYy0+aW5kYXRhX3VzZWQgPCAyKkJMT0NLU0laRSkgeworICAgICAgICBpbnQgbiA9IGZmdXJsX3JlYWQoYy0+aGQsIGMtPmluYnVmZmVyICsgYy0+aW5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGMtPmluYnVmZmVyKSAtIGMtPmluZGF0YSk7CisgICAgICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgICAgIGMtPmVvZiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjLT5pbmRhdGEgKz0gbjsKKyAgICB9CisgICAgYmxvY2tzID0gKGMtPmluZGF0YSAtIGMtPmluZGF0YV91c2VkKSAvIEJMT0NLU0laRTsKKyAgICBpZiAoIWJsb2NrcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIGlmICghYy0+ZW9mKQorICAgICAgICBibG9ja3MtLTsKKyAgICBhdl9hZXNfY3J5cHQoYy0+YWVzX2RlY3J5cHQsIGMtPm91dGJ1ZmZlciwgYy0+aW5idWZmZXIgKyBjLT5pbmRhdGFfdXNlZCwKKyAgICAgICAgICAgICAgICAgYmxvY2tzLCBjLT5kZWNyeXB0X2l2LCAxKTsKKyAgICBjLT5vdXRkYXRhICAgICAgPSBCTE9DS1NJWkUgKiBibG9ja3M7CisgICAgYy0+b3V0cHRyICAgICAgID0gYy0+b3V0YnVmZmVyOworICAgIGMtPmluZGF0YV91c2VkICs9IEJMT0NLU0laRSAqIGJsb2NrczsKKyAgICBpZiAoYy0+aW5kYXRhX3VzZWQgPj0gc2l6ZW9mKGMtPmluYnVmZmVyKS8yKSB7CisgICAgICAgIG1lbW1vdmUoYy0+aW5idWZmZXIsIGMtPmluYnVmZmVyICsgYy0+aW5kYXRhX3VzZWQsCisgICAgICAgICAgICAgICAgYy0+aW5kYXRhIC0gYy0+aW5kYXRhX3VzZWQpOworICAgICAgICBjLT5pbmRhdGEgICAgIC09IGMtPmluZGF0YV91c2VkOworICAgICAgICBjLT5pbmRhdGFfdXNlZCA9IDA7CisgICAgfQorICAgIGlmIChjLT5lb2YpIHsKKyAgICAgICAgLy8gUmVtb3ZlIFBLQ1M3IHBhZGRpbmcgYXQgdGhlIGVuZAorICAgICAgICBpbnQgcGFkZGluZyA9IGMtPm91dGJ1ZmZlcltjLT5vdXRkYXRhIC0gMV07CisgICAgICAgIGMtPm91dGRhdGEgLT0gcGFkZGluZzsKKyAgICB9CisgICAgZ290byByZXRyeTsKK30KKworc3RhdGljIGludCBjcnlwdG9fd3JpdGUoVVJMQ29udGV4dCAqaCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBDcnlwdG9Db250ZXh0ICpjID0gaC0+cHJpdl9kYXRhOworICAgIGludCB0b3RhbF9zaXplLCBibG9ja3MsIHBhZF9sZW4sIG91dF9zaXplOworICAgIHVpbnQ4X3QgKm91dF9idWY7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB0b3RhbF9zaXplID0gc2l6ZSArIGMtPnBhZF9sZW47CisgICAgcGFkX2xlbiA9IHRvdGFsX3NpemUgJSBCTE9DS1NJWkU7CisgICAgb3V0X3NpemUgPSB0b3RhbF9zaXplIC0gcGFkX2xlbjsKKyAgICBibG9ja3MgPSBvdXRfc2l6ZSAvIEJMT0NLU0laRTsKKworICAgIGlmIChvdXRfc2l6ZSkgeworICAgICAgICBvdXRfYnVmID0gYXZfbWFsbG9jKG91dF9zaXplKTsKKyAgICAgICAgaWYgKCFvdXRfYnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBpZiAoYy0+cGFkX2xlbikgeworICAgICAgICAgICAgbWVtY3B5KCZjLT5wYWRbYy0+cGFkX2xlbl0sIGJ1ZiwgQkxPQ0tTSVpFIC0gYy0+cGFkX2xlbik7CisgICAgICAgICAgICBhdl9hZXNfY3J5cHQoYy0+YWVzX2VuY3J5cHQsIG91dF9idWYsIGMtPnBhZCwgMSwgYy0+ZW5jcnlwdF9pdiwgMCk7CisgICAgICAgICAgICBibG9ja3MtLTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Flc19jcnlwdChjLT5hZXNfZW5jcnlwdCwgJm91dF9idWZbYy0+cGFkX2xlbiA/IEJMT0NLU0laRSA6IDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmW2MtPnBhZF9sZW4gPyBCTE9DS1NJWkUgLSBjLT5wYWRfbGVuOiAwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLCBjLT5lbmNyeXB0X2l2LCAwKTsKKworICAgICAgICByZXQgPSBmZnVybF93cml0ZShjLT5oZCwgb3V0X2J1Ziwgb3V0X3NpemUpOworICAgICAgICBhdl9mcmVlKG91dF9idWYpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgbWVtY3B5KGMtPnBhZCwgJmJ1ZltzaXplIC0gcGFkX2xlbl0sIHBhZF9sZW4pOworICAgIH0gZWxzZQorICAgICAgICBtZW1jcHkoJmMtPnBhZFtjLT5wYWRfbGVuXSwgYnVmLCBzaXplKTsKKworICAgIGMtPnBhZF9sZW4gPSBwYWRfbGVuOworCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX2Nsb3NlKFVSTENvbnRleHQgKmgpCit7CisgICAgQ3J5cHRvQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90IG91dF9idWZbQkxPQ0tTSVpFXTsKKyAgICBpbnQgcmV0LCBwYWQ7CisKKyAgICBpZiAoYy0+YWVzX2VuY3J5cHQpIHsKKyAgICAgICAgcGFkID0gQkxPQ0tTSVpFIC0gYy0+cGFkX2xlbjsKKyAgICAgICAgbWVtc2V0KCZjLT5wYWRbYy0+cGFkX2xlbl0sIHBhZCwgcGFkKTsKKyAgICAgICAgYXZfYWVzX2NyeXB0KGMtPmFlc19lbmNyeXB0LCBvdXRfYnVmLCBjLT5wYWQsIDEsIGMtPmVuY3J5cHRfaXYsIDApOworICAgICAgICBpZiAoKHJldCA9ICBmZnVybF93cml0ZShjLT5oZCwgb3V0X2J1ZiwgQkxPQ0tTSVpFKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoYy0+aGQpCisgICAgICAgIGZmdXJsX2Nsb3NlKGMtPmhkKTsKKyAgICBhdl9mcmVlcCgmYy0+YWVzX2RlY3J5cHQpOworICAgIGF2X2ZyZWVwKCZjLT5hZXNfZW5jcnlwdCk7CisgICAgcmV0dXJuIDA7Cit9CisKK1VSTFByb3RvY29sIGZmX2NyeXB0b19wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgID0gImNyeXB0byIsCisgICAgLnVybF9vcGVuMiAgICAgICA9IGNyeXB0b19vcGVuMiwKKyAgICAudXJsX3JlYWQgICAgICAgID0gY3J5cHRvX3JlYWQsCisgICAgLnVybF93cml0ZSAgICAgICA9IGNyeXB0b193cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgID0gY3J5cHRvX2Nsb3NlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgPSBzaXplb2YoQ3J5cHRvQ29udGV4dCksCisgICAgLnByaXZfZGF0YV9jbGFzcyA9ICZjcnlwdG9fY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgICA9IFVSTF9QUk9UT0NPTF9GTEFHX05FU1RFRF9TQ0hFTUUsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2N1dGlscy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2N1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmJhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvY3V0aWxzLmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIHZhcmlvdXMgc2ltcGxlIHV0aWxpdGllcyBmb3IgbGliYXZmb3JtYXQKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lX2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIElTTEVBUCh5KSAoKCh5KSAlIDQgPT0gMCkgJiYgKCgoeSkgJSAxMDApICE9IDAgfHwgKCh5KSAlIDQwMCkgPT0gMCkpCisjZGVmaW5lIExFQVBTX0NPVU5UKHkpICgoeSkvNCAtICh5KS8xMDAgKyAoeSkvNDAwKQorCisvKiBUaGlzIGlzIG91ciBvd24gZ210aW1lX3IuIEl0IGRpZmZlcnMgZnJvbSBpdHMgUE9TSVggY291bnRlcnBhcnQgaW4gYQorICAgY291cGxlIG9mIHBsYWNlcywgdGhvdWdoLiAqLworc3RydWN0IHRtICpmZl9icmt0aW1lZ20odGltZV90IHNlY3MsIHN0cnVjdCB0bSAqdG0pCit7CisgICAgdG0gPSBnbXRpbWVfcigmc2VjcywgdG0pOworCisgICAgdG0tPnRtX3llYXIgKz0gMTkwMDsgLyogdW5saWtlIGdtdGltZV9yIHdlIHN0b3JlIGNvbXBsZXRlIHllYXIgaGVyZSAqLworICAgIHRtLT50bV9tb24gICs9IDE7ICAgIC8qIHVubGlrZSBnbXRpbWVfciB0bV9tb24gaXMgZnJvbSAxIHRvIDEyICovCisKKyAgICByZXR1cm4gdG07Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZGFzaGVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2Rhc2hlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDllN2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2Rhc2hlbmMuYwpAQCAtMCwwICsxLDkzMyBAQAorLyoKKyAqIE1QRUctREFTSCBJU08gQk1GRiBzZWdtZW50ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lX2ludGVybmFsLmgiCisKKyNpbmNsdWRlICJhdmMuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImlzb20uaCIKKyNpbmNsdWRlICJvc19zdXBwb3J0LmgiCisjaW5jbHVkZSAidXJsLmgiCisKKy8vIFNlZSBJU08vSUVDIDIzMDA5LTE6MjAxNCA1LjMuOS40LjQKK3R5cGVkZWYgZW51bSB7CisgICAgREFTSF9UTVBMX0lEX1VOREVGSU5FRCA9IC0xLAorICAgIERBU0hfVE1QTF9JRF9FU0NBUEUsCisgICAgREFTSF9UTVBMX0lEX1JFUF9JRCwKKyAgICBEQVNIX1RNUExfSURfTlVNQkVSLAorICAgIERBU0hfVE1QTF9JRF9CQU5EV0lEVEgsCisgICAgREFTSF9UTVBMX0lEX1RJTUUsCit9IERBU0hUbXBsSWQ7CisKK3R5cGVkZWYgc3RydWN0IFNlZ21lbnQgeworICAgIGNoYXIgZmlsZVsxMDI0XTsKKyAgICBpbnQ2NF90IHN0YXJ0X3BvczsKKyAgICBpbnQgcmFuZ2VfbGVuZ3RoLCBpbmRleF9sZW5ndGg7CisgICAgaW50NjRfdCB0aW1lOworICAgIGludCBkdXJhdGlvbjsKKyAgICBpbnQgbjsKK30gU2VnbWVudDsKKwordHlwZWRlZiBzdHJ1Y3QgT3V0cHV0U3RyZWFtIHsKKyAgICBBVkZvcm1hdENvbnRleHQgKmN0eDsKKyAgICBpbnQgY3R4X2luaXRlZDsKKyAgICB1aW50OF90IGlvYnVmWzMyNzY4XTsKKyAgICBVUkxDb250ZXh0ICpvdXQ7CisgICAgaW50IHBhY2tldHNfd3JpdHRlbjsKKyAgICBjaGFyIGluaXRmaWxlWzEwMjRdOworICAgIGludDY0X3QgaW5pdF9zdGFydF9wb3M7CisgICAgaW50IGluaXRfcmFuZ2VfbGVuZ3RoOworICAgIGludCBuYl9zZWdtZW50cywgc2VnbWVudHNfc2l6ZSwgc2VnbWVudF9pbmRleDsKKyAgICBTZWdtZW50ICoqc2VnbWVudHM7CisgICAgaW50NjRfdCBmaXJzdF9kdHMsIHN0YXJ0X2R0cywgZW5kX2R0czsKKyAgICBpbnQgYml0X3JhdGU7CisgICAgY2hhciBiYW5kd2lkdGhfc3RyWzY0XTsKKworICAgIGNoYXIgY29kZWNfc3RyWzEwMF07Cit9IE91dHB1dFN0cmVhbTsKKwordHlwZWRlZiBzdHJ1Y3QgREFTSENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOyAgLyogQ2xhc3MgZm9yIHByaXZhdGUgb3B0aW9ucy4gKi8KKyAgICBpbnQgd2luZG93X3NpemU7CisgICAgaW50IGV4dHJhX3dpbmRvd19zaXplOworICAgIGludCBtaW5fc2VnX2R1cmF0aW9uOworICAgIGludCByZW1vdmVfYXRfZXhpdDsKKyAgICBpbnQgdXNlX3RlbXBsYXRlOworICAgIGludCB1c2VfdGltZWxpbmU7CisgICAgaW50IHNpbmdsZV9maWxlOworICAgIE91dHB1dFN0cmVhbSAqc3RyZWFtczsKKyAgICBpbnQgaGFzX3ZpZGVvLCBoYXNfYXVkaW87CisgICAgaW50IGxhc3RfZHVyYXRpb247CisgICAgaW50IHRvdGFsX2R1cmF0aW9uOworICAgIGNoYXIgYXZhaWxhYmlsaXR5X3N0YXJ0X3RpbWVbMTAwXTsKKyAgICBjaGFyIGRpcm5hbWVbMTAyNF07CisgICAgY29uc3QgY2hhciAqc2luZ2xlX2ZpbGVfbmFtZTsKKyAgICBjb25zdCBjaGFyICppbml0X3NlZ19uYW1lOworICAgIGNvbnN0IGNoYXIgKm1lZGlhX3NlZ19uYW1lOworfSBEQVNIQ29udGV4dDsKKworc3RhdGljIGludCBkYXNoX3dyaXRlKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgT3V0cHV0U3RyZWFtICpvcyA9IG9wYXF1ZTsKKyAgICBpZiAob3MtPm91dCkKKyAgICAgICAgZmZ1cmxfd3JpdGUob3MtPm91dCwgYnVmLCBidWZfc2l6ZSk7CisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCisvLyBSRkMgNjM4MQorc3RhdGljIHZvaWQgc2V0X2NvZGVjX3N0cihBVkZvcm1hdENvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICpjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKyAgICBjb25zdCBBVkNvZGVjVGFnICp0YWdzWzJdID0geyBOVUxMLCBOVUxMIH07CisgICAgdWludDMyX3QgdGFnOworICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIHRhZ3NbMF0gPSBmZl9jb2RlY19tb3Z2aWRlb190YWdzOworICAgIGVsc2UgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgdGFnc1swXSA9IGZmX2NvZGVjX21vdmF1ZGlvX3RhZ3M7CisgICAgZWxzZQorICAgICAgICByZXR1cm47CisKKyAgICB0YWcgPSBhdl9jb2RlY19nZXRfdGFnKHRhZ3MsIGNvZGVjLT5jb2RlY19pZCk7CisgICAgaWYgKCF0YWcpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoc2l6ZSA8IDUpCisgICAgICAgIHJldHVybjsKKworICAgIEFWX1dMMzIoc3RyLCB0YWcpOworICAgIHN0cls0XSA9ICdcMCc7CisgICAgaWYgKCFzdHJjbXAoc3RyLCAibXA0YSIpIHx8ICFzdHJjbXAoc3RyLCAibXA0diIpKSB7CisgICAgICAgIHVpbnQzMl90IG90aTsKKyAgICAgICAgdGFnc1swXSA9IGZmX21wNF9vYmpfdHlwZTsKKyAgICAgICAgb3RpID0gYXZfY29kZWNfZ2V0X3RhZyh0YWdzLCBjb2RlYy0+Y29kZWNfaWQpOworICAgICAgICBpZiAob3RpKQorICAgICAgICAgICAgYXZfc3RybGNhdGYoc3RyLCBzaXplLCAiLiUwMngiLCBvdGkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHRhZyA9PSBNS1RBRygnbScsICdwJywgJzQnLCAnYScpKSB7CisgICAgICAgICAgICBpZiAoY29kZWMtPmV4dHJhZGF0YV9zaXplID49IDIpIHsKKyAgICAgICAgICAgICAgICBpbnQgYW90ID0gY29kZWMtPmV4dHJhZGF0YVswXSA+PiAzOworICAgICAgICAgICAgICAgIGlmIChhb3QgPT0gMzEpCisgICAgICAgICAgICAgICAgICAgIGFvdCA9ICgoQVZfUkIxNihjb2RlYy0+ZXh0cmFkYXRhKSA+PiA1KSAmIDB4M2YpICsgMzI7CisgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoc3RyLCBzaXplLCAiLiVkIiwgYW90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gTUtUQUcoJ20nLCAncCcsICc0JywgJ3YnKSkgeworICAgICAgICAgICAgLy8gVW5pbXBsZW1lbnRlZCwgc2hvdWxkIG91dHB1dCBQcm9maWxlTGV2ZWxJbmRpY2F0aW9uIGFzIGEgZGVjaW1hbCBudW1iZXIKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkluY29tcGxldGUgUkZDIDYzODEgY29kZWMgc3RyaW5nIGZvciBtcDR2XG4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJhdmMxIikpIHsKKyAgICAgICAgdWludDhfdCAqdG1wYnVmID0gTlVMTDsKKyAgICAgICAgdWludDhfdCAqZXh0cmFkYXRhID0gY29kZWMtPmV4dHJhZGF0YTsKKyAgICAgICAgaW50IGV4dHJhZGF0YV9zaXplID0gY29kZWMtPmV4dHJhZGF0YV9zaXplOworICAgICAgICBpZiAoIWV4dHJhZGF0YV9zaXplKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoZXh0cmFkYXRhWzBdICE9IDEpIHsKKyAgICAgICAgICAgIEFWSU9Db250ZXh0ICpwYjsKKyAgICAgICAgICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmcGIpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoZmZfaXNvbV93cml0ZV9hdmNjKHBiLCBleHRyYWRhdGEsIGV4dHJhZGF0YV9zaXplKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdmlvX2Nsb3NlX2R5bl9idWYocGIsICZ0bXBidWYpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUodG1wYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHRyYWRhdGFfc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1ZihwYiwgJmV4dHJhZGF0YSk7CisgICAgICAgICAgICB0bXBidWYgPSBleHRyYWRhdGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXh0cmFkYXRhX3NpemUgPj0gNCkKKyAgICAgICAgICAgIGF2X3N0cmxjYXRmKHN0ciwgc2l6ZSwgIi4lMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFkYXRhWzFdLCBleHRyYWRhdGFbMl0sIGV4dHJhZGF0YVszXSk7CisgICAgICAgIGF2X2ZyZWUodG1wYnVmKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRhc2hfZnJlZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgREFTSENvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGksIGo7CisgICAgaWYgKCFjLT5zdHJlYW1zKQorICAgICAgICByZXR1cm47CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbaV07CisgICAgICAgIGlmIChvcy0+Y3R4ICYmIG9zLT5jdHhfaW5pdGVkKQorICAgICAgICAgICAgYXZfd3JpdGVfdHJhaWxlcihvcy0+Y3R4KTsKKyAgICAgICAgaWYgKG9zLT5jdHggJiYgb3MtPmN0eC0+cGIpCisgICAgICAgICAgICBhdl9mcmVlKG9zLT5jdHgtPnBiKTsKKyAgICAgICAgZmZ1cmxfY2xvc2Uob3MtPm91dCk7CisgICAgICAgIG9zLT5vdXQgPSAgTlVMTDsKKyAgICAgICAgaWYgKG9zLT5jdHgpCisgICAgICAgICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQob3MtPmN0eCk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBvcy0+bmJfc2VnbWVudHM7IGorKykKKyAgICAgICAgICAgIGF2X2ZyZWUob3MtPnNlZ21lbnRzW2pdKTsKKyAgICAgICAgYXZfZnJlZShvcy0+c2VnbWVudHMpOworICAgIH0KKyAgICBhdl9mcmVlcCgmYy0+c3RyZWFtcyk7Cit9CisKK3N0YXRpYyB2b2lkIG91dHB1dF9zZWdtZW50X2xpc3QoT3V0cHV0U3RyZWFtICpvcywgQVZJT0NvbnRleHQgKm91dCwgREFTSENvbnRleHQgKmMpCit7CisgICAgaW50IGksIHN0YXJ0X2luZGV4ID0gMCwgc3RhcnRfbnVtYmVyID0gMTsKKyAgICBpZiAoYy0+d2luZG93X3NpemUpIHsKKyAgICAgICAgc3RhcnRfaW5kZXggID0gRkZNQVgob3MtPm5iX3NlZ21lbnRzICAgLSBjLT53aW5kb3dfc2l6ZSwgMCk7CisgICAgICAgIHN0YXJ0X251bWJlciA9IEZGTUFYKG9zLT5zZWdtZW50X2luZGV4IC0gYy0+d2luZG93X3NpemUsIDEpOworICAgIH0KKworICAgIGlmIChjLT51c2VfdGVtcGxhdGUpIHsKKyAgICAgICAgaW50IHRpbWVzY2FsZSA9IGMtPnVzZV90aW1lbGluZSA/IG9zLT5jdHgtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZS5kZW4gOiBBVl9USU1FX0JBU0U7CisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0XHRcdFx0PFNlZ21lbnRUZW1wbGF0ZSB0aW1lc2NhbGU9XCIlZFwiICIsIHRpbWVzY2FsZSk7CisgICAgICAgIGlmICghYy0+dXNlX3RpbWVsaW5lKQorICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiZHVyYXRpb249XCIlZFwiICIsIGMtPmxhc3RfZHVyYXRpb24pOworICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJpbml0aWFsaXphdGlvbj1cIiVzXCIgbWVkaWE9XCIlc1wiIHN0YXJ0TnVtYmVyPVwiJWRcIj5cbiIsIGMtPmluaXRfc2VnX25hbWUsIGMtPm1lZGlhX3NlZ19uYW1lLCBjLT51c2VfdGltZWxpbmUgPyBzdGFydF9udW1iZXIgOiAxKTsKKyAgICAgICAgaWYgKGMtPnVzZV90aW1lbGluZSkgeworICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHRcdDxTZWdtZW50VGltZWxpbmU+XG4iKTsKKyAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0X2luZGV4OyBpIDwgb3MtPm5iX3NlZ21lbnRzOyApIHsKKyAgICAgICAgICAgICAgICBTZWdtZW50ICpzZWcgPSBvcy0+c2VnbWVudHNbaV07CisgICAgICAgICAgICAgICAgaW50IHJlcGVhdCA9IDA7CisgICAgICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHRcdFx0PFMgIik7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gc3RhcnRfaW5kZXgpCisgICAgICAgICAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgInQ9XCIlIlBSSWQ2NCJcIiAiLCBzZWctPnRpbWUpOworICAgICAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgImQ9XCIlZFwiICIsIHNlZy0+ZHVyYXRpb24pOworICAgICAgICAgICAgICAgIHdoaWxlIChpICsgcmVwZWF0ICsgMSA8IG9zLT5uYl9zZWdtZW50cyAmJiBvcy0+c2VnbWVudHNbaSArIHJlcGVhdCArIDFdLT5kdXJhdGlvbiA9PSBzZWctPmR1cmF0aW9uKQorICAgICAgICAgICAgICAgICAgICByZXBlYXQrKzsKKyAgICAgICAgICAgICAgICBpZiAocmVwZWF0ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAicj1cIiVkXCIgIiwgcmVwZWF0KTsKKyAgICAgICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIvPlxuIik7CisgICAgICAgICAgICAgICAgaSArPSAxICsgcmVwZWF0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHRcdDwvU2VnbWVudFRpbWVsaW5lPlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHQ8L1NlZ21lbnRUZW1wbGF0ZT5cbiIpOworICAgIH0gZWxzZSBpZiAoYy0+c2luZ2xlX2ZpbGUpIHsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHQ8QmFzZVVSTD4lczwvQmFzZVVSTD5cbiIsIG9zLT5pbml0ZmlsZSk7CisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0XHRcdFx0PFNlZ21lbnRMaXN0IHRpbWVzY2FsZT1cIiVkXCIgZHVyYXRpb249XCIlZFwiIHN0YXJ0TnVtYmVyPVwiJWRcIj5cbiIsIEFWX1RJTUVfQkFTRSwgYy0+bGFzdF9kdXJhdGlvbiwgc3RhcnRfbnVtYmVyKTsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHRcdDxJbml0aWFsaXphdGlvbiByYW5nZT1cIiUiUFJJZDY0Ii0lIlBSSWQ2NCJcIiAvPlxuIiwgb3MtPmluaXRfc3RhcnRfcG9zLCBvcy0+aW5pdF9zdGFydF9wb3MgKyBvcy0+aW5pdF9yYW5nZV9sZW5ndGggLSAxKTsKKyAgICAgICAgZm9yIChpID0gc3RhcnRfaW5kZXg7IGkgPCBvcy0+bmJfc2VnbWVudHM7IGkrKykgeworICAgICAgICAgICAgU2VnbWVudCAqc2VnID0gb3MtPnNlZ21lbnRzW2ldOworICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHRcdDxTZWdtZW50VVJMIG1lZGlhUmFuZ2U9XCIlIlBSSWQ2NCItJSJQUklkNjQiXCIgIiwgc2VnLT5zdGFydF9wb3MsIHNlZy0+c3RhcnRfcG9zICsgc2VnLT5yYW5nZV9sZW5ndGggLSAxKTsKKyAgICAgICAgICAgIGlmIChzZWctPmluZGV4X2xlbmd0aCkKKyAgICAgICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJpbmRleFJhbmdlPVwiJSJQUklkNjQiLSUiUFJJZDY0IlwiICIsIHNlZy0+c3RhcnRfcG9zLCBzZWctPnN0YXJ0X3BvcyArIHNlZy0+aW5kZXhfbGVuZ3RoIC0gMSk7CisgICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIvPlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHQ8L1NlZ21lbnRMaXN0PlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHQ8U2VnbWVudExpc3QgdGltZXNjYWxlPVwiJWRcIiBkdXJhdGlvbj1cIiVkXCIgc3RhcnROdW1iZXI9XCIlZFwiPlxuIiwgQVZfVElNRV9CQVNFLCBjLT5sYXN0X2R1cmF0aW9uLCBzdGFydF9udW1iZXIpOworICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcdFx0XHRcdFx0PEluaXRpYWxpemF0aW9uIHNvdXJjZVVSTD1cIiVzXCIgLz5cbiIsIG9zLT5pbml0ZmlsZSk7CisgICAgICAgIGZvciAoaSA9IHN0YXJ0X2luZGV4OyBpIDwgb3MtPm5iX3NlZ21lbnRzOyBpKyspIHsKKyAgICAgICAgICAgIFNlZ21lbnQgKnNlZyA9IG9zLT5zZWdtZW50c1tpXTsKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0XHRcdFx0XHQ8U2VnbWVudFVSTCBtZWRpYT1cIiVzXCIgLz5cbiIsIHNlZy0+ZmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHQ8L1NlZ21lbnRMaXN0PlxuIik7CisgICAgfQorfQorCitzdGF0aWMgREFTSFRtcGxJZCBkYXNoX3JlYWRfdG1wbF9pZChjb25zdCBjaGFyICppZGVudGlmaWVyLCBjaGFyICpmb3JtYXRfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZvcm1hdF90YWdfc2l6ZSwgY29uc3QgY2hhciAqKnB0cikgeworICAgIGNvbnN0IGNoYXIgKm5leHRfcHRyOworICAgIERBU0hUbXBsSWQgaWRfdHlwZSA9IERBU0hfVE1QTF9JRF9VTkRFRklORUQ7CisKKyAgICBpZiAoYXZfc3Ryc3RhcnQoaWRlbnRpZmllciwgIiQkIiwgJm5leHRfcHRyKSkgeworICAgICAgICBpZF90eXBlID0gREFTSF9UTVBMX0lEX0VTQ0FQRTsKKyAgICAgICAgKnB0ciA9IG5leHRfcHRyOworICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQoaWRlbnRpZmllciwgIiRSZXByZXNlbnRhdGlvbklEJCIsICZuZXh0X3B0cikpIHsKKyAgICAgICAgaWRfdHlwZSA9IERBU0hfVE1QTF9JRF9SRVBfSUQ7CisgICAgICAgIC8vIGRlZmF1bHQgdG8gYmFzaWMgZm9ybWF0LCBhcyAkUmVwcmVzZW50YXRpb25JRCQgaWRlbnRpZmllcnMKKyAgICAgICAgLy8gYXJlIG5vdCBhbGxvd2VkIHRvIGhhdmUgY3VzdG9tIGZvcm1hdC10YWdzLgorICAgICAgICBhdl9zdHJsY3B5KGZvcm1hdF90YWcsICIlZCIsIGZvcm1hdF90YWdfc2l6ZSk7CisgICAgICAgICpwdHIgPSBuZXh0X3B0cjsKKyAgICB9IGVsc2UgeyAvLyB0aGUgZm9sbG93aW5nIGlkZW50aWZpZXJzIG1heSBoYXZlIGFuIGV4cGxpY2l0IGZvcm1hdF90YWcKKyAgICAgICAgaWYgKGF2X3N0cnN0YXJ0KGlkZW50aWZpZXIsICIkTnVtYmVyIiwgJm5leHRfcHRyKSkKKyAgICAgICAgICAgIGlkX3R5cGUgPSBEQVNIX1RNUExfSURfTlVNQkVSOworICAgICAgICBlbHNlIGlmIChhdl9zdHJzdGFydChpZGVudGlmaWVyLCAiJEJhbmR3aWR0aCIsICZuZXh0X3B0cikpCisgICAgICAgICAgICBpZF90eXBlID0gREFTSF9UTVBMX0lEX0JBTkRXSURUSDsKKyAgICAgICAgZWxzZSBpZiAoYXZfc3Ryc3RhcnQoaWRlbnRpZmllciwgIiRUaW1lIiwgJm5leHRfcHRyKSkKKyAgICAgICAgICAgIGlkX3R5cGUgPSBEQVNIX1RNUExfSURfVElNRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWRfdHlwZSA9IERBU0hfVE1QTF9JRF9VTkRFRklORUQ7CisKKyAgICAgICAgLy8gbmV4dCBwYXJzZSB0aGUgZGFzaCBmb3JtYXQtdGFnIGFuZCBnZW5lcmF0ZSBhIGMtc3RyaW5nIGZvcm1hdCB0YWcKKyAgICAgICAgLy8gKG5leHRfcHRyIG5vdyBwb2ludHMgYXQgdGhlIGZpcnN0ICclJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb3JtYXQtdGFnKQorICAgICAgICBpZiAoaWRfdHlwZSAhPSBEQVNIX1RNUExfSURfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpudW1iZXJfZm9ybWF0ID0gREFTSF9UTVBMX0lEX1RJTUUgPyAibGxkIiA6ICJkIjsKKyAgICAgICAgICAgIGlmIChuZXh0X3B0clswXSA9PSAnJCcpIHsgLy8gbm8gZGFzaCBmb3JtYXQtdGFnCisgICAgICAgICAgICAgICAgc25wcmludGYoZm9ybWF0X3RhZywgZm9ybWF0X3RhZ19zaXplLCAiJSUlcyIsIG51bWJlcl9mb3JtYXQpOworICAgICAgICAgICAgICAgICpwdHIgPSAmbmV4dF9wdHJbMV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKndpZHRoX3B0cjsKKyAgICAgICAgICAgICAgICAvLyBvbmx5IHRvbGVyYXRlIHNpbmdsZS1kaWdpdCB3aWR0aC1maWVsZCAoaS5lLiB1cCB0byA5LWRpZ2l0IHdpZHRoKQorICAgICAgICAgICAgICAgIGlmIChhdl9zdHJzdGFydChuZXh0X3B0ciwgIiUwIiwgJndpZHRoX3B0cikgJiYKKyAgICAgICAgICAgICAgICAgICAgYXZfaXNkaWdpdCh3aWR0aF9wdHJbMF0pICYmCisgICAgICAgICAgICAgICAgICAgIGF2X3N0cnN0YXJ0KCZ3aWR0aF9wdHJbMV0sICJkJCIsICZuZXh0X3B0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8geWVzLCB3ZSdyZSB1c2luZyBhIGZvcm1hdCB0YWcgdG8gYnVpbGQgZm9ybWF0X3RhZy4KKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoZm9ybWF0X3RhZywgZm9ybWF0X3RhZ19zaXplLCAiJXMlYyVzIiwgIiUwIiwgd2lkdGhfcHRyWzBdLCBudW1iZXJfZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgKnB0ciA9IG5leHRfcHRyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byBwYXJzZSBmb3JtYXQtdGFnIGJlZ2lubmluZyB3aXRoICVzLiBFeHBlY3RlZCBlaXRoZXIgYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsb3NpbmcgJyQnIGNoYXJhY3RlciBvciBhIGZvcm1hdC1zdHJpbmcgbGlrZSAnJSUwW3dpZHRoXWQnLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoZXJlIHdpZHRoIG11c3QgYmUgYSBzaW5nbGUgZGlnaXRcbiIsIG5leHRfcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaWRfdHlwZSA9IERBU0hfVE1QTF9JRF9VTkRFRklORUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpZF90eXBlOworfQorCitzdGF0aWMgdm9pZCBkYXNoX2ZpbGxfdG1wbF9wYXJhbXMoY2hhciAqZHN0LCBzaXplX3QgYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGVtcGxhdGUsIGludCByZXBfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwgaW50IGJpdF9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZSkgeworICAgIGludCBkc3RfcG9zID0gMDsKKyAgICBjb25zdCBjaGFyICp0X2N1ciA9IHRlbXBsYXRlOworICAgIHdoaWxlIChkc3RfcG9zIDwgYnVmZmVyX3NpemUgLSAxICYmICp0X2N1cikgeworICAgICAgICBjaGFyIGZvcm1hdF90YWdbN107IC8vIE1heSBiZSAiJWQiLCAiJTBYZCIsIG9yICIlMFhsbGQiIChmb3IgJFRpbWUkKSwgd2hlcmUgWCBpcyBpbiBbMC05XQorICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIERBU0hUbXBsSWQgaWRfdHlwZTsKKyAgICAgICAgY29uc3QgY2hhciAqdF9uZXh0ID0gc3RyY2hyKHRfY3VyLCAnJCcpOyAvLyBjb3B5IG92ZXIgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3QgJyQnIGNoYXJhY3RlcgorICAgICAgICBpZiAodF9uZXh0KSB7CisgICAgICAgICAgICBpbnQgbnVtX2NvcHlfYnl0ZXMgPSBGRk1JTih0X25leHQgLSB0X2N1ciwgYnVmZmVyX3NpemUgLSBkc3RfcG9zIC0gMSk7CisgICAgICAgICAgICBhdl9zdHJsY3B5KCZkc3RbZHN0X3Bvc10sIHRfY3VyLCBudW1fY29weV9ieXRlcyArIDEpOworICAgICAgICAgICAgLy8gYWR2YW5jZQorICAgICAgICAgICAgZHN0X3BvcyArPSBudW1fY29weV9ieXRlczsKKyAgICAgICAgICAgIHRfY3VyID0gdF9uZXh0OworICAgICAgICB9IGVsc2UgeyAvLyBubyBtb3JlIERBU0ggaWRlbnRpZmllcnMgdG8gc3Vic3RpdHV0ZSAtIGp1c3QgY29weSB0aGUgcmVzdCBvdmVyIGFuZCBicmVhaworICAgICAgICAgICAgYXZfc3RybGNweSgmZHN0W2RzdF9wb3NdLCB0X2N1ciwgYnVmZmVyX3NpemUgLSBkc3RfcG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRzdF9wb3MgPj0gYnVmZmVyX3NpemUgLSAxIHx8ICEqdF9jdXIpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyB0X2N1ciBpcyBub3cgcG9pbnRpbmcgdG8gYSAnJCcgY2hhcmFjdGVyCisgICAgICAgIGlkX3R5cGUgPSBkYXNoX3JlYWRfdG1wbF9pZCh0X2N1ciwgZm9ybWF0X3RhZywgc2l6ZW9mKGZvcm1hdF90YWcpLCAmdF9uZXh0KTsKKyAgICAgICAgc3dpdGNoIChpZF90eXBlKSB7CisgICAgICAgIGNhc2UgREFTSF9UTVBMX0lEX0VTQ0FQRToKKyAgICAgICAgICAgIGF2X3N0cmxjcHkoJmRzdFtkc3RfcG9zXSwgIiQiLCAyKTsKKyAgICAgICAgICAgIG4gPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREFTSF9UTVBMX0lEX1JFUF9JRDoKKyAgICAgICAgICAgIG4gPSBzbnByaW50ZigmZHN0W2RzdF9wb3NdLCBidWZmZXJfc2l6ZSAtIGRzdF9wb3MsIGZvcm1hdF90YWcsIHJlcF9pZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEQVNIX1RNUExfSURfTlVNQkVSOgorICAgICAgICAgICAgbiA9IHNucHJpbnRmKCZkc3RbZHN0X3Bvc10sIGJ1ZmZlcl9zaXplIC0gZHN0X3BvcywgZm9ybWF0X3RhZywgbnVtYmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERBU0hfVE1QTF9JRF9CQU5EV0lEVEg6CisgICAgICAgICAgICBuID0gc25wcmludGYoJmRzdFtkc3RfcG9zXSwgYnVmZmVyX3NpemUgLSBkc3RfcG9zLCBmb3JtYXRfdGFnLCBiaXRfcmF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEQVNIX1RNUExfSURfVElNRToKKyAgICAgICAgICAgIG4gPSBzbnByaW50ZigmZHN0W2RzdF9wb3NdLCBidWZmZXJfc2l6ZSAtIGRzdF9wb3MsIGZvcm1hdF90YWcsIHRpbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREFTSF9UTVBMX0lEX1VOREVGSU5FRDoKKyAgICAgICAgICAgIC8vIGNvcHkgb3ZlciBvbmUgYnl0ZSBhbmQgYWR2YW5jZQorICAgICAgICAgICAgYXZfc3RybGNweSgmZHN0W2RzdF9wb3NdLCB0X2N1ciwgMik7CisgICAgICAgICAgICBuID0gMTsKKyAgICAgICAgICAgIHRfbmV4dCA9ICZ0X2N1clsxXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIHRfbmV4dCBwb2ludHMganVzdCBwYXN0IHRoZSBwcm9jZXNzZWQgaWRlbnRpZmllcgorICAgICAgICAvLyBuIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIGF0dGVtcHRlZCB0byBiZSB3cml0dGVuIHRvIGRzdAorICAgICAgICAvLyAobWF5IGhhdmUgZmFpbGVkIHRvIHdyaXRlIGFsbCBiZWNhdXNlIGJ1ZmZlcl9zaXplKS4KKworICAgICAgICAvLyBhZHZhbmNlCisgICAgICAgIGRzdF9wb3MgKz0gRkZNSU4obiwgYnVmZmVyX3NpemUgLSBkc3RfcG9zIC0gMSk7CisgICAgICAgIHRfY3VyID0gdF9uZXh0OworICAgIH0KK30KKworc3RhdGljIGNoYXIgKnhtbGVzY2FwZShjb25zdCBjaGFyICpzdHIpIHsKKyAgICBpbnQgb3V0bGVuID0gc3RybGVuKHN0cikqMy8yICsgNjsKKyAgICBjaGFyICpvdXQgPSBhdl9yZWFsbG9jKE5VTEwsIG91dGxlbiArIDEpOworICAgIGludCBwb3MgPSAwOworICAgIGlmICghb3V0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKDsgKnN0cjsgc3RyKyspIHsKKyAgICAgICAgaWYgKHBvcyArIDYgPiBvdXRsZW4pIHsKKyAgICAgICAgICAgIGNoYXIgKnRtcDsKKyAgICAgICAgICAgIG91dGxlbiA9IDIgKiBvdXRsZW4gKyA2OworICAgICAgICAgICAgdG1wID0gYXZfcmVhbGxvYyhvdXQsIG91dGxlbiArIDEpOworICAgICAgICAgICAgaWYgKCF0bXApIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKG91dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzdHIgPT0gJyYnKSB7CisgICAgICAgICAgICBtZW1jcHkoJm91dFtwb3NdLCAiJmFtcDsiLCA1KTsKKyAgICAgICAgICAgIHBvcyArPSA1OworICAgICAgICB9IGVsc2UgaWYgKCpzdHIgPT0gJzwnKSB7CisgICAgICAgICAgICBtZW1jcHkoJm91dFtwb3NdLCAiJmx0OyIsIDQpOworICAgICAgICAgICAgcG9zICs9IDQ7CisgICAgICAgIH0gZWxzZSBpZiAoKnN0ciA9PSAnPicpIHsKKyAgICAgICAgICAgIG1lbWNweSgmb3V0W3Bvc10sICImZ3Q7IiwgNCk7CisgICAgICAgICAgICBwb3MgKz0gNDsKKyAgICAgICAgfSBlbHNlIGlmICgqc3RyID09ICdcJycpIHsKKyAgICAgICAgICAgIG1lbWNweSgmb3V0W3Bvc10sICImYXBvczsiLCA2KTsKKyAgICAgICAgICAgIHBvcyArPSA2OworICAgICAgICB9IGVsc2UgaWYgKCpzdHIgPT0gJ1wiJykgeworICAgICAgICAgICAgbWVtY3B5KCZvdXRbcG9zXSwgIiZxdW90OyIsIDYpOworICAgICAgICAgICAgcG9zICs9IDY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRbcG9zKytdID0gKnN0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXRbcG9zXSA9ICdcMCc7CisgICAgcmV0dXJuIG91dDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfdGltZShBVklPQ29udGV4dCAqb3V0LCBpbnQ2NF90IHRpbWUpCit7CisgICAgaW50IHNlY29uZHMgPSB0aW1lIC8gQVZfVElNRV9CQVNFOworICAgIGludCBmcmFjdGlvbnMgPSB0aW1lICUgQVZfVElNRV9CQVNFOworICAgIGludCBtaW51dGVzID0gc2Vjb25kcyAvIDYwOworICAgIGludCBob3VycyA9IG1pbnV0ZXMgLyA2MDsKKyAgICBzZWNvbmRzICU9IDYwOworICAgIG1pbnV0ZXMgJT0gNjA7CisgICAgYXZpb19wcmludGYob3V0LCAiUFQiKTsKKyAgICBpZiAoaG91cnMpCisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIiVkSCIsIGhvdXJzKTsKKyAgICBpZiAoaG91cnMgfHwgbWludXRlcykKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiJWRNIiwgbWludXRlcyk7CisgICAgYXZpb19wcmludGYob3V0LCAiJWQuJWRTIiwgc2Vjb25kcywgZnJhY3Rpb25zIC8gKEFWX1RJTUVfQkFTRSAvIDEwKSk7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfbWFuaWZlc3QoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgZmluYWwpCit7CisgICAgREFTSENvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKm91dDsKKyAgICBjaGFyIHRlbXBfZmlsZW5hbWVbMTAyNF07CisgICAgaW50IHJldCwgaTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGl0bGUgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInRpdGxlIiwgTlVMTCwgMCk7CisKKyAgICBzbnByaW50Zih0ZW1wX2ZpbGVuYW1lLCBzaXplb2YodGVtcF9maWxlbmFtZSksICIlcy50bXAiLCBzLT5maWxlbmFtZSk7CisgICAgcmV0ID0gYXZpb19vcGVuMigmb3V0LCB0ZW1wX2ZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiAlcyBmb3Igd3JpdGluZ1xuIiwgdGVtcF9maWxlbmFtZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGF2aW9fcHJpbnRmKG91dCwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxuIik7CisgICAgYXZpb19wcmludGYob3V0LCAiPE1QRCB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiXG4iCisgICAgICAgICAgICAgICAgIlx0eG1sbnM9XCJ1cm46bXBlZzpkYXNoOnNjaGVtYTptcGQ6MjAxMVwiXG4iCisgICAgICAgICAgICAgICAgIlx0eG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiIKKyAgICAgICAgICAgICAgICAiXHR4c2k6c2NoZW1hTG9jYXRpb249XCJ1cm46bXBlZzpEQVNIOnNjaGVtYTpNUEQ6MjAxMSBodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXR0Zi9QdWJsaWNseUF2YWlsYWJsZVN0YW5kYXJkcy9NUEVHLURBU0hfc2NoZW1hX2ZpbGVzL0RBU0gtTVBELnhzZFwiXG4iCisgICAgICAgICAgICAgICAgIlx0cHJvZmlsZXM9XCJ1cm46bXBlZzpkYXNoOnByb2ZpbGU6aXNvZmYtbGl2ZToyMDExXCJcbiIKKyAgICAgICAgICAgICAgICAiXHR0eXBlPVwiJXNcIlxuIiwgZmluYWwgPyAic3RhdGljIiA6ICJkeW5hbWljIik7CisgICAgaWYgKGZpbmFsKSB7CisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0bWVkaWFQcmVzZW50YXRpb25EdXJhdGlvbj1cIiIpOworICAgICAgICB3cml0ZV90aW1lKG91dCwgYy0+dG90YWxfZHVyYXRpb24pOworICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcIlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHVwZGF0ZV9wZXJpb2QgPSBjLT5sYXN0X2R1cmF0aW9uIC8gQVZfVElNRV9CQVNFOworICAgICAgICBpZiAoYy0+dXNlX3RlbXBsYXRlICYmICFjLT51c2VfdGltZWxpbmUpCisgICAgICAgICAgICB1cGRhdGVfcGVyaW9kID0gNTAwOworICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcdG1pbmltdW1VcGRhdGVQZXJpb2Q9XCJQVCVkU1wiXG4iLCB1cGRhdGVfcGVyaW9kKTsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRzdWdnZXN0ZWRQcmVzZW50YXRpb25EZWxheT1cIlBUJWRTXCJcbiIsIGMtPmxhc3RfZHVyYXRpb24gLyBBVl9USU1FX0JBU0UpOworICAgICAgICBpZiAoIWMtPmF2YWlsYWJpbGl0eV9zdGFydF90aW1lWzBdICYmIHMtPm5iX3N0cmVhbXMgPiAwICYmIGMtPnN0cmVhbXNbMF0ubmJfc2VnbWVudHMgPiAwKSB7CisgICAgICAgICAgICB0aW1lX3QgdCA9IHRpbWUoTlVMTCk7CisgICAgICAgICAgICBzdHJ1Y3QgdG0gKnB0bSwgdG1idWY7CisgICAgICAgICAgICBwdG0gPSBnbXRpbWVfcigmdCwgJnRtYnVmKTsKKyAgICAgICAgICAgIGlmIChwdG0pIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmZ0aW1lKGMtPmF2YWlsYWJpbGl0eV9zdGFydF90aW1lLCBzaXplb2YoYy0+YXZhaWxhYmlsaXR5X3N0YXJ0X3RpbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcHRtKSkKKyAgICAgICAgICAgICAgICAgICAgYy0+YXZhaWxhYmlsaXR5X3N0YXJ0X3RpbWVbMF0gPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjLT5hdmFpbGFiaWxpdHlfc3RhcnRfdGltZVswXSkKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0YXZhaWxhYmlsaXR5U3RhcnRUaW1lPVwiJXNcIlxuIiwgYy0+YXZhaWxhYmlsaXR5X3N0YXJ0X3RpbWUpOworICAgICAgICBpZiAoYy0+d2luZG93X3NpemUgJiYgYy0+dXNlX3RlbXBsYXRlKSB7CisgICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcdHRpbWVTaGlmdEJ1ZmZlckRlcHRoPVwiIik7CisgICAgICAgICAgICB3cml0ZV90aW1lKG91dCwgYy0+bGFzdF9kdXJhdGlvbiAqIGMtPndpbmRvd19zaXplKTsKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlwiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdmlvX3ByaW50ZihvdXQsICJcdG1pbkJ1ZmZlclRpbWU9XCIiKTsKKyAgICB3cml0ZV90aW1lKG91dCwgYy0+bGFzdF9kdXJhdGlvbik7CisgICAgYXZpb19wcmludGYob3V0LCAiXCI+XG4iKTsKKyAgICBhdmlvX3ByaW50ZihvdXQsICJcdDxQcm9ncmFtSW5mb3JtYXRpb24+XG4iKTsKKyAgICBpZiAodGl0bGUpIHsKKyAgICAgICAgY2hhciAqZXNjYXBlZCA9IHhtbGVzY2FwZSh0aXRsZS0+dmFsdWUpOworICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcdFx0PFRpdGxlPiVzPC9UaXRsZT5cbiIsIGVzY2FwZWQpOworICAgICAgICBhdl9mcmVlKGVzY2FwZWQpOworICAgIH0KKyAgICBhdmlvX3ByaW50ZihvdXQsICJcdDwvUHJvZ3JhbUluZm9ybWF0aW9uPlxuIik7CisgICAgaWYgKGMtPndpbmRvd19zaXplICYmIHMtPm5iX3N0cmVhbXMgPiAwICYmIGMtPnN0cmVhbXNbMF0ubmJfc2VnbWVudHMgPiAwICYmICFjLT51c2VfdGVtcGxhdGUpIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zWzBdOworICAgICAgICBpbnQgc3RhcnRfaW5kZXggPSBGRk1BWChvcy0+bmJfc2VnbWVudHMgLSBjLT53aW5kb3dfc2l6ZSwgMCk7CisgICAgICAgIGludDY0X3Qgc3RhcnRfdGltZSA9IGF2X3Jlc2NhbGVfcShvcy0+c2VnbWVudHNbc3RhcnRfaW5kZXhdLT50aW1lLCBzLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHQ8UGVyaW9kIHN0YXJ0PVwiIik7CisgICAgICAgIHdyaXRlX3RpbWUob3V0LCBzdGFydF90aW1lKTsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXCI+XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcdDxQZXJpb2Qgc3RhcnQ9XCJQVDAuMFNcIj5cbiIpOworICAgIH0KKworICAgIGlmIChjLT5oYXNfdmlkZW8pIHsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdDxBZGFwdGF0aW9uU2V0IGlkPVwidmlkZW9cIiBzZWdtZW50QWxpZ25tZW50PVwidHJ1ZVwiIGJpdHN0cmVhbVN3aXRjaGluZz1cInRydWVcIj5cbiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0XHRcdDxSZXByZXNlbnRhdGlvbiBpZD1cIiVkXCIgbWltZVR5cGU9XCJ2aWRlby9tcDRcIiBjb2RlY3M9XCIlc1wiJXMgd2lkdGg9XCIlZFwiIGhlaWdodD1cIiVkXCI+XG4iLCBpLCBvcy0+Y29kZWNfc3RyLCBvcy0+YmFuZHdpZHRoX3N0ciwgc3QtPmNvZGVjLT53aWR0aCwgc3QtPmNvZGVjLT5oZWlnaHQpOworICAgICAgICAgICAgb3V0cHV0X3NlZ21lbnRfbGlzdCgmYy0+c3RyZWFtc1tpXSwgb3V0LCBjKTsKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0XHRcdDwvUmVwcmVzZW50YXRpb24+XG4iKTsKKyAgICAgICAgfQorICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcdFx0PC9BZGFwdGF0aW9uU2V0PlxuIik7CisgICAgfQorICAgIGlmIChjLT5oYXNfYXVkaW8pIHsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdDxBZGFwdGF0aW9uU2V0IGlkPVwiYXVkaW9cIiBzZWdtZW50QWxpZ25tZW50PVwidHJ1ZVwiIGJpdHN0cmVhbVN3aXRjaGluZz1cInRydWVcIj5cbiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0XHRcdDxSZXByZXNlbnRhdGlvbiBpZD1cIiVkXCIgbWltZVR5cGU9XCJhdWRpby9tcDRcIiBjb2RlY3M9XCIlc1wiJXMgYXVkaW9TYW1wbGluZ1JhdGU9XCIlZFwiPlxuIiwgaSwgb3MtPmNvZGVjX3N0ciwgb3MtPmJhbmR3aWR0aF9zdHIsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHQ8QXVkaW9DaGFubmVsQ29uZmlndXJhdGlvbiBzY2hlbWVJZFVyaT1cInVybjptcGVnOmRhc2g6MjMwMDM6MzphdWRpb19jaGFubmVsX2NvbmZpZ3VyYXRpb246MjAxMVwiIHZhbHVlPVwiJWRcIiAvPlxuIiwgc3QtPmNvZGVjLT5jaGFubmVscyk7CisgICAgICAgICAgICBvdXRwdXRfc2VnbWVudF9saXN0KCZjLT5zdHJlYW1zW2ldLCBvdXQsIGMpOworICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0PC9SZXByZXNlbnRhdGlvbj5cbiIpOworICAgICAgICB9CisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0XHQ8L0FkYXB0YXRpb25TZXQ+XG4iKTsKKyAgICB9CisgICAgYXZpb19wcmludGYob3V0LCAiXHQ8L1BlcmlvZD5cbiIpOworICAgIGF2aW9fcHJpbnRmKG91dCwgIjwvTVBEPlxuIik7CisgICAgYXZpb19mbHVzaChvdXQpOworICAgIGF2aW9fY2xvc2Uob3V0KTsKKyAgICByZXR1cm4gZmZfcmVuYW1lKHRlbXBfZmlsZW5hbWUsIHMtPmZpbGVuYW1lLCBzKTsKK30KKworc3RhdGljIGludCBkYXNoX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgREFTSENvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldCA9IDAsIGk7CisgICAgQVZPdXRwdXRGb3JtYXQgKm9mb3JtYXQ7CisgICAgY2hhciAqcHRyOworICAgIGNoYXIgYmFzZW5hbWVbMTAyNF07CisKKyAgICBpZiAoYy0+c2luZ2xlX2ZpbGVfbmFtZSkKKyAgICAgICAgYy0+c2luZ2xlX2ZpbGUgPSAxOworICAgIGlmIChjLT5zaW5nbGVfZmlsZSkKKyAgICAgICAgYy0+dXNlX3RlbXBsYXRlID0gMDsKKworICAgIGF2X3N0cmxjcHkoYy0+ZGlybmFtZSwgcy0+ZmlsZW5hbWUsIHNpemVvZihjLT5kaXJuYW1lKSk7CisgICAgcHRyID0gc3RycmNocihjLT5kaXJuYW1lLCAnLycpOworICAgIGlmIChwdHIpIHsKKyAgICAgICAgYXZfc3RybGNweShiYXNlbmFtZSwgJnB0clsxXSwgc2l6ZW9mKGJhc2VuYW1lKSk7CisgICAgICAgIHB0clsxXSA9ICdcMCc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+ZGlybmFtZVswXSA9ICdcMCc7CisgICAgICAgIGF2X3N0cmxjcHkoYmFzZW5hbWUsIHMtPmZpbGVuYW1lLCBzaXplb2YoYmFzZW5hbWUpKTsKKyAgICB9CisKKyAgICBwdHIgPSBzdHJyY2hyKGJhc2VuYW1lLCAnLicpOworICAgIGlmIChwdHIpCisgICAgICAgICpwdHIgPSAnXDAnOworCisgICAgb2Zvcm1hdCA9IGF2X2d1ZXNzX2Zvcm1hdCgibXA0IiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKCFvZm9ybWF0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfTVVYRVJfTk9UX0ZPVU5EOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYy0+c3RyZWFtcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpjLT5zdHJlYW1zKSAqIHMtPm5iX3N0cmVhbXMpOworICAgIGlmICghYy0+c3RyZWFtcykgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIE91dHB1dFN0cmVhbSAqb3MgPSAmYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpjdHg7CisgICAgICAgIEFWU3RyZWFtICpzdDsKKyAgICAgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKKyAgICAgICAgY2hhciBmaWxlbmFtZVsxMDI0XTsKKworICAgICAgICBvcy0+Yml0X3JhdGUgPSBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Yml0X3JhdGUgPworICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Yml0X3JhdGUgOgorICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+cmNfbWF4X3JhdGU7CisgICAgICAgIGlmIChvcy0+Yml0X3JhdGUpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKG9zLT5iYW5kd2lkdGhfc3RyLCBzaXplb2Yob3MtPmJhbmR3aWR0aF9zdHIpLAorICAgICAgICAgICAgICAgICAgICAgIiBiYW5kd2lkdGg9XCIlZFwiIiwgb3MtPmJpdF9yYXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IHMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+PSBGRl9DT01QTElBTkNFX1NUUklDVCA/CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9MT0dfRVJST1IgOiBBVl9MT0dfV0FSTklORzsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBsZXZlbCwgIk5vIGJpdCByYXRlIHNldCBmb3Igc3RyZWFtICVkXG4iLCBpKTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPj0gRkZfQ09NUExJQU5DRV9TVFJJQ1QpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOworICAgICAgICBpZiAoIWN0eCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIG9zLT5jdHggPSBjdHg7CisgICAgICAgIGN0eC0+b2Zvcm1hdCA9IG9mb3JtYXQ7CisgICAgICAgIGN0eC0+aW50ZXJydXB0X2NhbGxiYWNrID0gcy0+aW50ZXJydXB0X2NhbGxiYWNrOworCisgICAgICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjdHgsIE5VTEwpKSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGF2Y29kZWNfY29weV9jb250ZXh0KHN0LT5jb2RlYywgcy0+c3RyZWFtc1tpXS0+Y29kZWMpOworICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHMtPnN0cmVhbXNbaV0tPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgIHN0LT50aW1lX2Jhc2UgPSBzLT5zdHJlYW1zW2ldLT50aW1lX2Jhc2U7CisgICAgICAgIGN0eC0+YXZvaWRfbmVnYXRpdmVfdHMgPSBzLT5hdm9pZF9uZWdhdGl2ZV90czsKKworICAgICAgICBjdHgtPnBiID0gYXZpb19hbGxvY19jb250ZXh0KG9zLT5pb2J1Ziwgc2l6ZW9mKG9zLT5pb2J1ZiksIEFWSU9fRkxBR19XUklURSwgb3MsIE5VTEwsIGRhc2hfd3JpdGUsIE5VTEwpOworICAgICAgICBpZiAoIWN0eC0+cGIpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjLT5zaW5nbGVfZmlsZSkgeworICAgICAgICAgICAgaWYgKGMtPnNpbmdsZV9maWxlX25hbWUpCisgICAgICAgICAgICAgICAgZGFzaF9maWxsX3RtcGxfcGFyYW1zKG9zLT5pbml0ZmlsZSwgc2l6ZW9mKG9zLT5pbml0ZmlsZSksIGMtPnNpbmdsZV9maWxlX25hbWUsIGksIDAsIG9zLT5iaXRfcmF0ZSwgMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc25wcmludGYob3MtPmluaXRmaWxlLCBzaXplb2Yob3MtPmluaXRmaWxlKSwgIiVzLXN0cmVhbSVkLm00cyIsIGJhc2VuYW1lLCBpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhc2hfZmlsbF90bXBsX3BhcmFtcyhvcy0+aW5pdGZpbGUsIHNpemVvZihvcy0+aW5pdGZpbGUpLCBjLT5pbml0X3NlZ19uYW1lLCBpLCAwLCBvcy0+Yml0X3JhdGUsIDApOworICAgICAgICB9CisgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMlcyIsIGMtPmRpcm5hbWUsIG9zLT5pbml0ZmlsZSk7CisgICAgICAgIHJldCA9IGZmdXJsX29wZW4oJm9zLT5vdXQsIGZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgb3MtPmluaXRfc3RhcnRfcG9zID0gMDsKKworICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfY3VzdG9tK2Rhc2giLCAwKTsKKyAgICAgICAgaWYgKChyZXQgPSBhdmZvcm1hdF93cml0ZV9oZWFkZXIoY3R4LCAmb3B0cykpIDwgMCkgeworICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBvcy0+Y3R4X2luaXRlZCA9IDE7CisgICAgICAgIGF2aW9fZmx1c2goY3R4LT5wYik7CisgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CisKKyAgICAgICAgaWYgKGMtPnNpbmdsZV9maWxlKSB7CisgICAgICAgICAgICBvcy0+aW5pdF9yYW5nZV9sZW5ndGggPSBhdmlvX3RlbGwoY3R4LT5wYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZnVybF9jbG9zZShvcy0+b3V0KTsKKyAgICAgICAgICAgIG9zLT5vdXQgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcy0+c3RyZWFtc1tpXS0+dGltZV9iYXNlID0gc3QtPnRpbWVfYmFzZTsKKyAgICAgICAgLy8gSWYgdGhlIG11eGVyIHdhbnRzIHRvIHNoaWZ0IHRpbWVzdGFtcHMsIHJlcXVlc3QgdG8gaGF2ZSB0aGVtIHNoaWZ0ZWQKKyAgICAgICAgLy8gYWxyZWFkeSBiZWZvcmUgYmVpbmcgaGFuZGVkIHRvIHRoaXMgbXV4ZXIsIHNvIHdlIGRvbid0IGhhdmUgbWlzbWF0Y2hlcworICAgICAgICAvLyBiZXR3ZWVuIHRoZSBNUEQgYW5kIHRoZSBhY3R1YWwgc2VnbWVudHMuCisgICAgICAgIHMtPmF2b2lkX25lZ2F0aXZlX3RzID0gY3R4LT5hdm9pZF9uZWdhdGl2ZV90czsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICBjLT5oYXNfdmlkZW8gPSAxOworICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICAgICAgYy0+aGFzX2F1ZGlvID0gMTsKKworICAgICAgICBzZXRfY29kZWNfc3RyKHMsIG9zLT5jdHgtPnN0cmVhbXNbMF0tPmNvZGVjLCBvcy0+Y29kZWNfc3RyLCBzaXplb2Yob3MtPmNvZGVjX3N0cikpOworICAgICAgICBvcy0+Zmlyc3RfZHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIG9zLT5zZWdtZW50X2luZGV4ID0gMTsKKyAgICB9CisKKyAgICBpZiAoIWMtPmhhc192aWRlbyAmJiBjLT5taW5fc2VnX2R1cmF0aW9uIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAibm8gdmlkZW8gc3RyZWFtIGFuZCBubyBtaW4gc2VnIGR1cmF0aW9uIHNldFxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0ID0gd3JpdGVfbWFuaWZlc3QocywgMCk7CisKK2ZhaWw6CisgICAgaWYgKHJldCkKKyAgICAgICAgZGFzaF9mcmVlKHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3NlZ21lbnQoT3V0cHV0U3RyZWFtICpvcywgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lLCBpbnQgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRfcG9zLCBpbnQ2NF90IHJhbmdlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBpbmRleF9sZW5ndGgpCit7CisgICAgaW50IGVycjsKKyAgICBTZWdtZW50ICpzZWc7CisgICAgaWYgKG9zLT5uYl9zZWdtZW50cyA+PSBvcy0+c2VnbWVudHNfc2l6ZSkgeworICAgICAgICBvcy0+c2VnbWVudHNfc2l6ZSA9IChvcy0+c2VnbWVudHNfc2l6ZSArIDEpICogMjsKKyAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmb3MtPnNlZ21lbnRzLCBzaXplb2YoKm9zLT5zZWdtZW50cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLT5zZWdtZW50c19zaXplKSkgPCAwKSB7CisgICAgICAgICAgICBvcy0+c2VnbWVudHNfc2l6ZSA9IDA7CisgICAgICAgICAgICBvcy0+bmJfc2VnbWVudHMgPSAwOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZWcgPSBhdl9tYWxsb2N6KHNpemVvZigqc2VnKSk7CisgICAgaWYgKCFzZWcpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZfc3RybGNweShzZWctPmZpbGUsIGZpbGUsIHNpemVvZihzZWctPmZpbGUpKTsKKyAgICBzZWctPnRpbWUgPSB0aW1lOworICAgIHNlZy0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICBzZWctPnN0YXJ0X3BvcyA9IHN0YXJ0X3BvczsKKyAgICBzZWctPnJhbmdlX2xlbmd0aCA9IHJhbmdlX2xlbmd0aDsKKyAgICBzZWctPmluZGV4X2xlbmd0aCA9IGluZGV4X2xlbmd0aDsKKyAgICBvcy0+c2VnbWVudHNbb3MtPm5iX3NlZ21lbnRzKytdID0gc2VnOworICAgIG9zLT5zZWdtZW50X2luZGV4Kys7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3N0eXAoQVZJT0NvbnRleHQgKnBiKQoreworICAgIGF2aW9fd2IzMihwYiwgMjQpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInN0eXAiKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJtc2RoIik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogbWlub3IgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJtc2RoIik7CisgICAgZmZpb193Zm91cmNjKHBiLCAibXNpeCIpOworfQorCitzdGF0aWMgdm9pZCBmaW5kX2luZGV4X3JhbmdlKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqZGlybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludDY0X3QgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4X2xlbmd0aCkKK3sKKyAgICBjaGFyIGZ1bGxfcGF0aFsxMDI0XTsKKyAgICB1aW50OF90IGJ1Zls4XTsKKyAgICBVUkxDb250ZXh0ICpmZDsKKyAgICBpbnQgcmV0OworCisgICAgc25wcmludGYoZnVsbF9wYXRoLCBzaXplb2YoZnVsbF9wYXRoKSwgIiVzJXMiLCBkaXJuYW1lLCBmaWxlbmFtZSk7CisgICAgcmV0ID0gZmZ1cmxfb3BlbigmZmQsIGZ1bGxfcGF0aCwgQVZJT19GTEFHX1JFQUQsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGZmdXJsX3NlZWsoZmQsIHBvcywgU0VFS19TRVQpICE9IHBvcykgeworICAgICAgICBmZnVybF9jbG9zZShmZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmV0ID0gZmZ1cmxfcmVhZChmZCwgYnVmLCA4KTsKKyAgICBmZnVybF9jbG9zZShmZCk7CisgICAgaWYgKHJldCA8IDgpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoQVZfUkwzMigmYnVmWzRdKSAhPSBNS1RBRygncycsICdpJywgJ2QnLCAneCcpKQorICAgICAgICByZXR1cm47CisgICAgKmluZGV4X2xlbmd0aCA9IEFWX1JCMzIoJmJ1ZlswXSk7Cit9CisKK3N0YXRpYyBpbnQgZGFzaF9mbHVzaChBVkZvcm1hdENvbnRleHQgKnMsIGludCBmaW5hbCwgaW50IHN0cmVhbSkKK3sKKyAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcmV0ID0gMDsKKyAgICBpbnQgY3VyX2ZsdXNoX3NlZ21lbnRfaW5kZXggPSAwOworICAgIGlmIChzdHJlYW0gPj0gMCkKKyAgICAgICAgY3VyX2ZsdXNoX3NlZ21lbnRfaW5kZXggPSBjLT5zdHJlYW1zW3N0cmVhbV0uc2VnbWVudF9pbmRleDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2ldOworICAgICAgICBjaGFyIGZpbGVuYW1lWzEwMjRdID0gIiIsIGZ1bGxfcGF0aFsxMDI0XSwgdGVtcF9wYXRoWzEwMjRdOworICAgICAgICBpbnQ2NF90IHN0YXJ0X3BvcyA9IGF2aW9fdGVsbChvcy0+Y3R4LT5wYik7CisgICAgICAgIGludCByYW5nZV9sZW5ndGgsIGluZGV4X2xlbmd0aCA9IDA7CisKKyAgICAgICAgaWYgKCFvcy0+cGFja2V0c193cml0dGVuKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gRmx1c2ggdGhlIHNpbmdsZSBzdHJlYW0gdGhhdCBnb3QgYSBrZXlmcmFtZSByaWdodCBub3cuCisgICAgICAgIC8vIEZsdXNoIGFsbCBhdWRpbyBzdHJlYW1zIGFzIHdlbGwsIGluIHN5bmMgd2l0aCB2aWRlbyBrZXlmcmFtZXMsCisgICAgICAgIC8vIGJ1dCBub3QgdGhlIG90aGVyIHZpZGVvIHN0cmVhbXMuCisgICAgICAgIGlmIChzdHJlYW0gPj0gMCAmJiBpICE9IHN0cmVhbSkgeworICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBmbHVzaCBhdWRpbyBzdHJlYW1zIG11bHRpcGxlIHRpbWVzLCB3aGVuCisgICAgICAgICAgICAvLyBhbGwgdmlkZW8gc3RyZWFtcyBhcmUgZmx1c2hlZCBvbmUgYXQgYSB0aW1lLgorICAgICAgICAgICAgaWYgKGMtPmhhc192aWRlbyAmJiBvcy0+c2VnbWVudF9pbmRleCA+IGN1cl9mbHVzaF9zZWdtZW50X2luZGV4KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjLT5zaW5nbGVfZmlsZSkgeworICAgICAgICAgICAgZGFzaF9maWxsX3RtcGxfcGFyYW1zKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCBjLT5tZWRpYV9zZWdfbmFtZSwgaSwgb3MtPnNlZ21lbnRfaW5kZXgsIG9zLT5iaXRfcmF0ZSwgb3MtPnN0YXJ0X2R0cyk7CisgICAgICAgICAgICBzbnByaW50ZihmdWxsX3BhdGgsIHNpemVvZihmdWxsX3BhdGgpLCAiJXMlcyIsIGMtPmRpcm5hbWUsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIHNucHJpbnRmKHRlbXBfcGF0aCwgc2l6ZW9mKHRlbXBfcGF0aCksICIlcy50bXAiLCBmdWxsX3BhdGgpOworICAgICAgICAgICAgcmV0ID0gZmZ1cmxfb3Blbigmb3MtPm91dCwgdGVtcF9wYXRoLCBBVklPX0ZMQUdfV1JJVEUsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZV9zdHlwKG9zLT5jdHgtPnBiKTsKKyAgICAgICAgfQorICAgICAgICBhdl93cml0ZV9mcmFtZShvcy0+Y3R4LCBOVUxMKTsKKyAgICAgICAgYXZpb19mbHVzaChvcy0+Y3R4LT5wYik7CisgICAgICAgIG9zLT5wYWNrZXRzX3dyaXR0ZW4gPSAwOworCisgICAgICAgIHJhbmdlX2xlbmd0aCA9IGF2aW9fdGVsbChvcy0+Y3R4LT5wYikgLSBzdGFydF9wb3M7CisgICAgICAgIGlmIChjLT5zaW5nbGVfZmlsZSkgeworICAgICAgICAgICAgZmluZF9pbmRleF9yYW5nZShzLCBjLT5kaXJuYW1lLCBvcy0+aW5pdGZpbGUsIHN0YXJ0X3BvcywgJmluZGV4X2xlbmd0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZnVybF9jbG9zZShvcy0+b3V0KTsKKyAgICAgICAgICAgIG9zLT5vdXQgPSBOVUxMOworICAgICAgICAgICAgcmV0ID0gZmZfcmVuYW1lKHRlbXBfcGF0aCwgZnVsbF9wYXRoLCBzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGFkZF9zZWdtZW50KG9zLCBmaWxlbmFtZSwgb3MtPnN0YXJ0X2R0cywgb3MtPmVuZF9kdHMgLSBvcy0+c3RhcnRfZHRzLCBzdGFydF9wb3MsIHJhbmdlX2xlbmd0aCwgaW5kZXhfbGVuZ3RoKTsKKyAgICB9CisKKyAgICBpZiAoYy0+d2luZG93X3NpemUgfHwgKGZpbmFsICYmIGMtPnJlbW92ZV9hdF9leGl0KSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGludCByZW1vdmUgPSBvcy0+bmJfc2VnbWVudHMgLSBjLT53aW5kb3dfc2l6ZSAtIGMtPmV4dHJhX3dpbmRvd19zaXplOworICAgICAgICAgICAgaWYgKGZpbmFsICYmIGMtPnJlbW92ZV9hdF9leGl0KQorICAgICAgICAgICAgICAgIHJlbW92ZSA9IG9zLT5uYl9zZWdtZW50czsKKyAgICAgICAgICAgIGlmIChyZW1vdmUgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJlbW92ZTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgZmlsZW5hbWVbMTAyNF07CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMlcyIsIGMtPmRpcm5hbWUsIG9zLT5zZWdtZW50c1tqXS0+ZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIHVubGluayhmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUob3MtPnNlZ21lbnRzW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3MtPm5iX3NlZ21lbnRzIC09IHJlbW92ZTsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKG9zLT5zZWdtZW50cywgb3MtPnNlZ21lbnRzICsgcmVtb3ZlLCBvcy0+bmJfc2VnbWVudHMgKiBzaXplb2YoKm9zLT5zZWdtZW50cykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICByZXQgPSB3cml0ZV9tYW5pZmVzdChzLCBmaW5hbCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkYXNoX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgREFTSENvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICBpbnQ2NF90IHNlZ19lbmRfZHVyYXRpb24gPSAob3MtPnNlZ21lbnRfaW5kZXgpICogKGludDY0X3QpIGMtPm1pbl9zZWdfZHVyYXRpb247CisgICAgaW50IHJldDsKKworICAgIC8vIElmIGZvcmNpbmcgdGhlIHN0cmVhbSB0byBzdGFydCBhdCAwLCB0aGUgbXA0IG11eGVyIHdpbGwgc2V0IHRoZSBzdGFydAorICAgIC8vIHRpbWVzdGFtcHMgdG8gMC4gRG8gdGhlIHNhbWUgaGVyZSwgdG8gYXZvaWQgbWlzbWF0Y2hlcyBpbiBkdXJhdGlvbi90aW1lc3RhbXBzLgorICAgIGlmIChvcy0+Zmlyc3RfZHRzID09IEFWX05PUFRTX1ZBTFVFICYmCisgICAgICAgIHMtPmF2b2lkX25lZ2F0aXZlX3RzID09IEFWRk1UX0FWT0lEX05FR19UU19NQUtFX1pFUk8pIHsKKyAgICAgICAgcGt0LT5wdHMgLT0gcGt0LT5kdHM7CisgICAgICAgIHBrdC0+ZHRzICA9IDA7CisgICAgfQorCisgICAgaWYgKG9zLT5maXJzdF9kdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIG9zLT5maXJzdF9kdHMgPSBwa3QtPmR0czsKKworICAgIGlmICgoIWMtPmhhc192aWRlbyB8fCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSAmJgorICAgICAgICBwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZICYmIG9zLT5wYWNrZXRzX3dyaXR0ZW4gJiYKKyAgICAgICAgYXZfY29tcGFyZV90cyhwa3QtPmR0cyAtIG9zLT5maXJzdF9kdHMsIHN0LT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgc2VnX2VuZF9kdXJhdGlvbiwgQVZfVElNRV9CQVNFX1EpID49IDApIHsKKyAgICAgICAgaW50NjRfdCBwcmV2X2R1cmF0aW9uID0gYy0+bGFzdF9kdXJhdGlvbjsKKworICAgICAgICBjLT5sYXN0X2R1cmF0aW9uID0gYXZfcmVzY2FsZV9xKHBrdC0+ZHRzIC0gb3MtPnN0YXJ0X2R0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgYy0+dG90YWxfZHVyYXRpb24gPSBhdl9yZXNjYWxlX3EocGt0LT5kdHMgLSBvcy0+Zmlyc3RfZHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSk7CisKKyAgICAgICAgaWYgKCghYy0+dXNlX3RpbWVsaW5lIHx8ICFjLT51c2VfdGVtcGxhdGUpICYmIHByZXZfZHVyYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChjLT5sYXN0X2R1cmF0aW9uIDwgcHJldl9kdXJhdGlvbio5LzEwIHx8CisgICAgICAgICAgICAgICAgYy0+bGFzdF9kdXJhdGlvbiA+IHByZXZfZHVyYXRpb24qMTEvMTApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJTZWdtZW50IGR1cmF0aW9ucyBkaWZmZXIgdG9vIG11Y2gsIGVuYWJsZSB1c2VfdGltZWxpbmUgIgorICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHVzZV90ZW1wbGF0ZSwgb3Iga2VlcCBhIHN0cmljdGVyIGtleWZyYW1lIGludGVydmFsXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gZGFzaF9mbHVzaChzLCAwLCBwa3QtPnN0cmVhbV9pbmRleCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKCFvcy0+cGFja2V0c193cml0dGVuKQorICAgICAgICBvcy0+c3RhcnRfZHRzID0gcGt0LT5kdHM7CisgICAgb3MtPmVuZF9kdHMgPSBwa3QtPmR0cyArIHBrdC0+ZHVyYXRpb247CisgICAgb3MtPnBhY2tldHNfd3JpdHRlbisrOworICAgIHJldHVybiBmZl93cml0ZV9jaGFpbmVkKG9zLT5jdHgsIDAsIHBrdCwgcywgMCk7Cit9CisKK3N0YXRpYyBpbnQgZGFzaF93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmIChzLT5uYl9zdHJlYW1zID4gMCkgeworICAgICAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbMF07CisgICAgICAgIC8vIElmIG5vIHNlZ21lbnRzIGhhdmUgYmVlbiB3cml0dGVuIHNvIGZhciwgdHJ5IHRvIGRvIGEgY3J1ZGUKKyAgICAgICAgLy8gZ3Vlc3Mgb2YgdGhlIHNlZ21lbnQgZHVyYXRpb24KKyAgICAgICAgaWYgKCFjLT5sYXN0X2R1cmF0aW9uKQorICAgICAgICAgICAgYy0+bGFzdF9kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShvcy0+ZW5kX2R0cyAtIG9zLT5zdGFydF9kdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EpOworICAgICAgICBjLT50b3RhbF9kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShvcy0+ZW5kX2R0cyAtIG9zLT5maXJzdF9kdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EpOworICAgIH0KKyAgICBkYXNoX2ZsdXNoKHMsIDEsIC0xKTsKKworICAgIGlmIChjLT5yZW1vdmVfYXRfZXhpdCkgeworICAgICAgICBjaGFyIGZpbGVuYW1lWzEwMjRdOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcyVzIiwgYy0+ZGlybmFtZSwgb3MtPmluaXRmaWxlKTsKKyAgICAgICAgICAgIHVubGluayhmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgdW5saW5rKHMtPmZpbGVuYW1lKTsKKyAgICB9CisKKyAgICBkYXNoX2ZyZWUocyk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKERBU0hDb250ZXh0LCB4KQorI2RlZmluZSBFIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgIndpbmRvd19zaXplIiwgIm51bWJlciBvZiBzZWdtZW50cyBrZXB0IGluIHRoZSBtYW5pZmVzdCIsIE9GRlNFVCh3aW5kb3dfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBFIH0sCisgICAgeyAiZXh0cmFfd2luZG93X3NpemUiLCAibnVtYmVyIG9mIHNlZ21lbnRzIGtlcHQgb3V0c2lkZSBvZiB0aGUgbWFuaWZlc3QgYmVmb3JlIHJlbW92aW5nIGZyb20gZGlzayIsIE9GRlNFVChleHRyYV93aW5kb3dfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gNSB9LCAwLCBJTlRfTUFYLCBFIH0sCisgICAgeyAibWluX3NlZ19kdXJhdGlvbiIsICJtaW5pbXVtIHNlZ21lbnQgZHVyYXRpb24gKGluIG1pY3Jvc2Vjb25kcykiLCBPRkZTRVQobWluX3NlZ19kdXJhdGlvbiksIEFWX09QVF9UWVBFX0lOVDY0LCB7IC5pNjQgPSA1MDAwMDAwIH0sIDAsIElOVF9NQVgsIEUgfSwKKyAgICB7ICJyZW1vdmVfYXRfZXhpdCIsICJyZW1vdmUgYWxsIHNlZ21lbnRzIHdoZW4gZmluaXNoZWQiLCBPRkZTRVQocmVtb3ZlX2F0X2V4aXQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRSB9LAorICAgIHsgInVzZV90ZW1wbGF0ZSIsICJVc2UgU2VnbWVudFRlbXBsYXRlIGluc3RlYWQgb2YgU2VnbWVudExpc3QiLCBPRkZTRVQodXNlX3RlbXBsYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDAsIDEsIEUgfSwKKyAgICB7ICJ1c2VfdGltZWxpbmUiLCAiVXNlIFNlZ21lbnRUaW1lbGluZSBpbiBTZWdtZW50VGVtcGxhdGUiLCBPRkZTRVQodXNlX3RpbWVsaW5lKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDAsIDEsIEUgfSwKKyAgICB7ICJzaW5nbGVfZmlsZSIsICJTdG9yZSBhbGwgc2VnbWVudHMgaW4gb25lIGZpbGUsIGFjY2Vzc2VkIHVzaW5nIGJ5dGUgcmFuZ2VzIiwgT0ZGU0VUKHNpbmdsZV9maWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEUgfSwKKyAgICB7ICJzaW5nbGVfZmlsZV9uYW1lIiwgIkRBU0gtdGVtcGxhdGVkIG5hbWUgdG8gYmUgdXNlZCBmb3IgYmFzZVVSTC4gSW1wbGllcyBzdG9yaW5nIGFsbCBzZWdtZW50cyBpbiBvbmUgZmlsZSwgYWNjZXNzZWQgdXNpbmcgYnl0ZSByYW5nZXMiLCBPRkZTRVQoc2luZ2xlX2ZpbGVfbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBFIH0sCisgICAgeyAiaW5pdF9zZWdfbmFtZSIsICJEQVNILXRlbXBsYXRlZCBuYW1lIHRvIHVzZWQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBzZWdtZW50IiwgT0ZGU0VUKGluaXRfc2VnX25hbWUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gImluaXQtc3RyZWFtJFJlcHJlc2VudGF0aW9uSUQkLm00cyJ9LCAgMCwgMCwgRSB9LAorICAgIHsgIm1lZGlhX3NlZ19uYW1lIiwgIkRBU0gtdGVtcGxhdGVkIG5hbWUgdG8gdXNlZCBmb3IgdGhlIG1lZGlhIHNlZ21lbnRzIiwgT0ZGU0VUKG1lZGlhX3NlZ19uYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJjaHVuay1zdHJlYW0kUmVwcmVzZW50YXRpb25JRCQtJE51bWJlciUwNWQkLm00cyJ9LCAgMCwgMCwgRSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZGFzaF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJkYXNoIG11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWT3V0cHV0Rm9ybWF0IGZmX2Rhc2hfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImRhc2giLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEQVNIIE11eGVyIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKERBU0hDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9BQUMsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9OT0ZJTEUgfCBBVkZNVF9UU19ORUdBVElWRSwKKyAgICAud3JpdGVfaGVhZGVyICAgPSBkYXNoX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBkYXNoX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgPSBkYXNoX3dyaXRlX3RyYWlsZXIsCisgICAgLmNvZGVjX3RhZyAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgZmZfbXA0X29ial90eXBlLCAwIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJmRhc2hfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2RhdGFfdXJpLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZGF0YV91cmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTk4Yjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2RhdGFfdXJpLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9iYXNlNjQuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisgICAgdm9pZCAqdG9mcmVlOworICAgIHNpemVfdCBzaXplOworICAgIHNpemVfdCBwb3M7Cit9IERhdGFDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgZGF0YV9vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzKQoreworICAgIERhdGFDb250ZXh0ICpkYyA9IGgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBjaGFyICpkYXRhLCAqb3B0LCAqbmV4dDsKKyAgICBjaGFyICpkZGF0YTsKKyAgICBpbnQgcmV0LCBiYXNlNjQgPSAwOworICAgIHNpemVfdCBpbl9zaXplOworCisgICAgLyogZGF0YTpjb250ZW50L3R5cGVbO2Jhc2U2NF0scGF5bG9hZCAqLworCisgICAgYXZfc3Ryc3RhcnQodXJpLCAiZGF0YToiLCAmdXJpKTsKKyAgICBkYXRhID0gc3RyY2hyKHVyaSwgJywnKTsKKyAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIk5vICcsJyBkZWxpbWl0ZXIgaW4gVVJJXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgb3B0ID0gdXJpOworICAgIHdoaWxlIChvcHQgPCBkYXRhKSB7CisgICAgICAgIG5leHQgPSBhdl94X2lmX251bGwobWVtY2hyKG9wdCwgJzsnLCBkYXRhIC0gb3B0KSwgZGF0YSk7CisgICAgICAgIGlmIChvcHQgPT0gdXJpKSB7CisgICAgICAgICAgICBpZiAoIW1lbWNocihvcHQsICcvJywgbmV4dCAtIG9wdCkpIHsgLyogYmFzaWMgdmFsaWRpdHkgY2hlY2sgKi8KKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjb250ZW50LXR5cGUgJyUuKnMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KShuZXh0IC0gb3B0KSwgb3B0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19WRVJCT1NFLCAiQ29udGVudC10eXBlOiAlLipzXG4iLAorICAgICAgICAgICAgICAgICAgIChpbnQpKG5leHQgLSBvcHQpLCBvcHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFhdl9zdHJuY2FzZWNtcChvcHQsICJiYXNlNjQiLCBuZXh0IC0gb3B0KSkgeworICAgICAgICAgICAgICAgIGJhc2U2NCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfVkVSQk9TRSwgIklnbm9yaW5nIG9wdGlvbiAnJS4qcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG5leHQgLSBvcHQpLCBvcHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9wdCA9IG5leHQgKyAxOworICAgIH0KKworICAgIGRhdGErKzsKKyAgICBpbl9zaXplID0gc3RybGVuKGRhdGEpOworICAgIGlmIChiYXNlNjQpIHsKKyAgICAgICAgc2l6ZV90IG91dF9zaXplID0gMyAqIChpbl9zaXplIC8gNCkgKyAxOworCisgICAgICAgIGlmIChvdXRfc2l6ZSA+IElOVF9NQVggfHwgIShkZGF0YSA9IGF2X21hbGxvYyhvdXRfc2l6ZSkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9iYXNlNjRfZGVjb2RlKGRkYXRhLCBkYXRhLCBvdXRfc2l6ZSkpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZShkZGF0YSk7CisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBiYXNlNjQgaW4gVVJJXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgZGMtPmRhdGEgPSBkYy0+dG9mcmVlID0gZGRhdGE7CisgICAgICAgIGRjLT5zaXplID0gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIGRjLT5kYXRhID0gZGF0YTsKKyAgICAgICAgZGMtPnNpemUgPSBpbl9zaXplOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRhdGFfY2xvc2UoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBEYXRhQ29udGV4dCAqZGMgPSBoLT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmZGMtPnRvZnJlZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGF0YV9yZWFkKFVSTENvbnRleHQgKmgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgRGF0YUNvbnRleHQgKmRjID0gaC0+cHJpdl9kYXRhOworCisgICAgaWYgKGRjLT5wb3MgPj0gZGMtPnNpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICBzaXplID0gRkZNSU4oc2l6ZSwgZGMtPnNpemUgLSBkYy0+cG9zKTsKKyAgICBtZW1jcHkoYnVmLCBkYy0+ZGF0YSArIGRjLT5wb3MsIHNpemUpOworICAgIGRjLT5wb3MgKz0gc2l6ZTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworVVJMUHJvdG9jb2wgZmZfZGF0YV9wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZGF0YSIsCisgICAgLnVybF9vcGVuICAgICAgID0gZGF0YV9vcGVuLAorICAgIC51cmxfY2xvc2UgICAgICA9IGRhdGFfY2xvc2UsCisgICAgLnVybF9yZWFkICAgICAgID0gZGF0YV9yZWFkLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihEYXRhQ29udGV4dCksCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2RhdWRkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kYXVkZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlNzQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kYXVkZGVjLmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIEQtQ2luZW1hIGF1ZGlvIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNSBSZWltYXIgRMO2ZmZpbmdlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworc3RhdGljIGludCBkYXVkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpIHsKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzI0REFVRDsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IE1LVEFHKCdkJywgJ2EnLCAndScsICdkJyk7CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDY7CisgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF81UE9JTlQxOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSA5NjAwMDsKKyAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gMyAqIDYgKiA5NjAwMCAqIDg7CisgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IDMgKiA2OworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMjQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGF1ZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KSB7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHJldCwgc2l6ZTsKKyAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICBzaXplID0gYXZpb19yYjE2KHBiKTsKKyAgICBhdmlvX3JiMTYocGIpOyAvLyB1bmtub3duCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBzaXplKTsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9kYXVkX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImRhdWQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJELUNpbmVtYSBhdWRpbyIpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGRhdWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGRhdWRfcGFja2V0LAorICAgIC5leHRlbnNpb25zICAgICA9ICIzMDIsZGF1ZCIsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2RhdWRlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kYXVkZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliMThkMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kYXVkZW5jLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIEQtQ2luZW1hIGF1ZGlvIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgUmVpbWFyIETDtmZmaW5nZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisKK3N0YXRpYyBpbnQgZGF1ZF93cml0ZV9oZWFkZXIoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBpZiAoY29kZWMtPmNoYW5uZWxzIT02IHx8IGNvZGVjLT5zYW1wbGVfcmF0ZSE9OTYwMDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYXVkX3dyaXRlX3BhY2tldChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGlmIChwa3QtPnNpemUgPiA2NTUzNSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlBhY2tldCBzaXplIHRvbyBsYXJnZSBmb3IgczMwMm0uICglZCA+IDY1NTM1KVxuIiwgcGt0LT5zaXplKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhdmlvX3diMTYocy0+cGIsIHBrdC0+c2l6ZSk7CisgICAgYXZpb193YjE2KHMtPnBiLCAweDgwMTApOyAvLyB1bmtub3duCisgICAgYXZpb193cml0ZShzLT5wYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9kYXVkX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAiZGF1ZCIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJELUNpbmVtYSBhdWRpbyIpLAorICAgIC5leHRlbnNpb25zICAgPSAiMzAyIiwKKyAgICAuYXVkaW9fY29kZWMgID0gQVZfQ09ERUNfSURfUENNX1MyNERBVUQsCisgICAgLnZpZGVvX2NvZGVjICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciA9IGRhdWRfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgPSBkYXVkX3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9kZmEuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kZmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTBiYzIxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2RmYS5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ2hyb25vbWFzdGVyIERGQSBGb3JtYXQgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDExIEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IGRmYV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAocC0+YnVmX3NpemUgPCA0IHx8IEFWX1JMMzIocC0+YnVmKSAhPSBNS1RBRygnRCcsICdGJywgJ0knLCAnQScpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChBVl9STDMyKHAtPmJ1ZiArIDE2KSAhPSAweDgwKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLyA0OworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCitzdGF0aWMgaW50IGRmYV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCBmcmFtZXM7CisgICAgaW50IHZlcnNpb247CisgICAgdWludDMyX3QgbXNwZjsKKworICAgIGlmIChhdmlvX3JsMzIocGIpICE9IE1LVEFHKCdEJywgJ0YnLCAnSScsICdBJykpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbWFnaWMgZm9yIERGQVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHZlcnNpb24gPSBhdmlvX3JsMTYocGIpOworICAgIGZyYW1lcyA9IGF2aW9fcmwxNihwYik7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9ERkE7CisgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIG1zcGYgPSBhdmlvX3JsMzIocGIpOworICAgIGlmICghbXNwZikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJaZXJvIEZQUyByZXBvcnRlZCwgZGVmYXVsdGluZyB0byAxMFxuIik7CisgICAgICAgIG1zcGYgPSAxMDA7CisgICAgfQorICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDI0LCBtc3BmLCAxMDAwKTsKKyAgICBhdmlvX3NraXAocGIsIDEyOCAtIDE2KTsgLy8gcGFkZGluZworICAgIHN0LT5kdXJhdGlvbiA9IGZyYW1lczsKKworICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCAyKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBBVl9XTDE2KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCB2ZXJzaW9uKTsKKyAgICBpZiAodmVyc2lvbiA9PSAweDEwMCkKKyAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7MiwgMX07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZmFfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVpbnQzMl90IGZyYW1lX3NpemU7CisgICAgaW50IHJldCwgZmlyc3QgPSAxOworCisgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGlmIChhdl9nZXRfcGFja2V0KHBiLCBwa3QsIDEyKSAhPSAxMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgcmV0ID0gYXZfYXBwZW5kX3BhY2tldChwYiwgcGt0LCAxMik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgIGZyYW1lX3NpemUgPSBBVl9STDMyKHBrdC0+ZGF0YSArIHBrdC0+c2l6ZSAtIDgpOworICAgICAgICBpZiAoZnJhbWVfc2l6ZSA+IElOVF9NQVggLSA0KSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVG9vIGxhcmdlIGNodW5rIHNpemU6ICUiUFJJdTMyIlxuIiwgZnJhbWVfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9CisgICAgICAgIGlmIChBVl9STDMyKHBrdC0+ZGF0YSArIHBrdC0+c2l6ZSAtIDEyKSA9PSBNS1RBRygnRScsICdPJywgJ0YnLCAnUicpKSB7CisgICAgICAgICAgICBpZiAoZnJhbWVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgInNraXBwaW5nICUiUFJJdTMyIiBieXRlcyBvZiBlbmQtb2YtZnJhbWUgbWFya2VyIGNodW5rXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9zaXplKTsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIGZyYW1lX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gYXZfYXBwZW5kX3BhY2tldChwYiwgcGt0LCBmcmFtZV9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfZGZhX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImRmYSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNocm9ub21hc3RlciBERkEiKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBkZmFfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZGZhX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGRmYV9yZWFkX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9kaXJhY2RlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2RpcmFjZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MWJhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kaXJhY2RlYy5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBSQVcgRGlyYWMgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IE1hcmNvIEdlcmFyZHMgPG1hcmNvQGdudS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJyYXdkZWMuaCIKKworc3RhdGljIGludCBkaXJhY19wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICB1bnNpZ25lZCBzaXplOworICAgIGlmIChBVl9STDMyKHAtPmJ1ZikgIT0gTUtUQUcoJ0InLCAnQicsICdDJywgJ0QnKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzaXplID0gQVZfUkIzMihwLT5idWYrNSk7CisgICAgaWYgKHNpemUgPCAxMykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHNpemUgKyAxM0xMID4gcC0+YnVmX3NpemUpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDQ7CisgICAgaWYgKEFWX1JMMzIocC0+YnVmICsgc2l6ZSkgIT0gTUtUQUcoJ0InLCAnQicsICdDJywgJ0QnKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK0ZGX0RFRl9SQVdWSURFT19ERU1VWEVSKGRpcmFjLCAicmF3IERpcmFjIiwgZGlyYWNfcHJvYmUsIE5VTEwsIEFWX0NPREVDX0lEX0RJUkFDKQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2RueGhkZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZG54aGRkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjU1NDAwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2RueGhkZGVjLmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIFJBVyBETnhIRCAoU01QVEUgVkMtMykgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA4IEJhcHRpc3RlIENvdWR1cmllciA8YmFwdGlzdGUuY291ZHVyaWVyQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOSBSZWltYXIgRMO2ZmZpbmdlciA8UmVpbWFyLkRvZWZmaW5nZXJAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicmF3ZGVjLmgiCisKK3N0YXRpYyBpbnQgZG54aGRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaGVhZGVyW10gPSB7MHgwMCwweDAwLDB4MDIsMHg4MCwweDAxfTsKKyAgICBpbnQgdywgaCwgY29tcHJlc3Npb25faWQ7CisgICAgaWYgKHAtPmJ1Zl9zaXplIDwgMHgyYykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKG1lbWNtcChwLT5idWYsIGhlYWRlciwgNSkpCisgICAgICAgIHJldHVybiAwOworICAgIGggPSBBVl9SQjE2KHAtPmJ1ZiArIDB4MTgpOworICAgIHcgPSBBVl9SQjE2KHAtPmJ1ZiArIDB4MWEpOworICAgIGlmICghdyB8fCAhaCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY29tcHJlc3Npb25faWQgPSBBVl9SQjMyKHAtPmJ1ZiArIDB4MjgpOworICAgIGlmIChjb21wcmVzc2lvbl9pZCA8IDEyMzUgfHwgY29tcHJlc3Npb25faWQgPiAxMjUzKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK0ZGX0RFRl9SQVdWSURFT19ERU1VWEVSKGRueGhkLCAicmF3IEROeEhEIChTTVBURSBWQy0zKSIsIGRueGhkX3Byb2JlLCBOVUxMLCBBVl9DT0RFQ19JRF9ETlhIRCkKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9kc2ZkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kc2ZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTE5OGIyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2RzZmRlYy5jCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogRFNEIFN0cmVhbSBGaWxlIChEU0YpIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBQZXRlciBSb3NzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImlkM3YyLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCBkYXRhX2VuZDsKK30gRFNGQ29udGV4dDsKKworc3RhdGljIGludCBkc2ZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKHAtPmJ1Zl9zaXplIDwgMTIgfHwgbWVtY21wKHAtPmJ1ZiwgIkRTRCAiLCA0KSB8fCBBVl9STDY0KHAtPmJ1ZiArIDQpICE9IDI4KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50NjRfdCBkc2ZfY2hhbm5lbF9sYXlvdXRbXSA9IHsKKyAgICAwLAorICAgIEFWX0NIX0xBWU9VVF9NT05PLAorICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgQVZfQ0hfTEFZT1VUX1NVUlJPVU5ELAorICAgIEFWX0NIX0xBWU9VVF9RVUFELAorICAgIEFWX0NIX0xBWU9VVF80UE9JTlQwLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0ssCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSywKK307CisKK3N0YXRpYyB2b2lkIHJlYWRfaWQzKEFWRm9ybWF0Q29udGV4dCAqcywgdWludDY0X3QgaWQzcG9zKQoreworICAgIElEM3YyRXh0cmFNZXRhICppZDN2Ml9leHRyYV9tZXRhID0gTlVMTDsKKyAgICBpZiAoYXZpb19zZWVrKHMtPnBiLCBpZDNwb3MsIFNFRUtfU0VUKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIGZmX2lkM3YyX3JlYWQocywgSUQzdjJfREVGQVVMVF9NQUdJQywgJmlkM3YyX2V4dHJhX21ldGEsIDApOworICAgIGlmIChpZDN2Ml9leHRyYV9tZXRhKQorICAgICAgICBmZl9pZDN2Ml9wYXJzZV9hcGljKHMsICZpZDN2Ml9leHRyYV9tZXRhKTsKKyAgICBmZl9pZDN2Ml9mcmVlX2V4dHJhX21ldGEoJmlkM3YyX2V4dHJhX21ldGEpOworfQorCitzdGF0aWMgaW50IGRzZl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgRFNGQ29udGV4dCAqZHNmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdDsKKyAgICB1aW50NjRfdCBpZDNwb3M7CisgICAgdW5zaWduZWQgaW50IGNoYW5uZWxfdHlwZTsKKworICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgaWYgKGF2aW9fcmw2NChwYikgIT0gMjgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLyogY3JlYXRlIHByaW1hcnkgc3RyZWFtIGJlZm9yZSBhbnkgaWQzIGNvdmVyYXJ0IHN0cmVhbXMgKi8KKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgaWQzcG9zID0gYXZpb19ybDY0KHBiKTsKKyAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIHJlYWRfaWQzKHMsIGlkM3Bvcyk7CisgICAgICAgIGF2aW9fc2VlayhwYiwgMjgsIFNFRUtfU0VUKTsKKyAgICB9CisKKyAgICAvKiBmbXQgY2h1bmsgKi8KKworICAgIGlmIChhdmlvX3JsMzIocGIpICE9IE1LVEFHKCdmJywgJ20nLCAndCcsICcgJykgfHwgYXZpb19ybDY0KHBiKSAhPSA1MikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoYXZpb19ybDMyKHBiKSAhPSAxKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAidW5rbm93biBmb3JtYXQgdmVyc2lvbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoYXZpb19ybDMyKHBiKSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgInVua25vd24gZm9ybWF0IGlkIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGNoYW5uZWxfdHlwZSA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKGNoYW5uZWxfdHlwZSA8IEZGX0FSUkFZX0VMRU1TKGRzZl9jaGFubmVsX2xheW91dCkpCisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBkc2ZfY2hhbm5lbF9sYXlvdXRbY2hhbm5lbF90eXBlXTsKKyAgICBpZiAoIXN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQpCisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiY2hhbm5lbCB0eXBlICVpIiwgY2hhbm5lbF90eXBlKTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICA9IGF2aW9fcmwzMihwYikgLyA4OworCisgICAgc3dpdGNoKGF2aW9fcmwzMihwYikpIHsKKyAgICBjYXNlIDE6IHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9EU0RfTFNCRl9QTEFOQVI7IGJyZWFrOworICAgIGNhc2UgODogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0RTRF9NU0JGX1BMQU5BUjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJ1bmtub3duIG1vc3Qgc2lnbmlmaWNhbnQgYml0Iik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPiBJTlRfTUFYIC8gc3QtPmNvZGVjLT5jaGFubmVscykgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImJsb2NrX2FsaWduIG92ZXJmbG93Iik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduICo9IHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgYXZpb19za2lwKHBiLCA0KTsKKworICAgIC8qIGRhdGEgY2h1bmsgKi8KKworICAgIGRzZi0+ZGF0YV9lbmQgPSBhdmlvX3RlbGwocGIpOworICAgIGlmIChhdmlvX3JsMzIocGIpICE9IE1LVEFHKCdkJywgJ2EnLCAndCcsICdhJykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGRzZi0+ZGF0YV9lbmQgKz0gYXZpb19ybDY0KHBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzZl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgRFNGQ29udGV4dCAqZHNmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgaWYgKHBvcyA+PSBkc2YtPmRhdGFfZW5kKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcmV0dXJuIGF2X2dldF9wYWNrZXQocGIsIHBrdCwgRkZNSU4oZHNmLT5kYXRhX2VuZCAtIHBvcywgc3QtPmNvZGVjLT5ibG9ja19hbGlnbikpOworfQorCitBVklucHV0Rm9ybWF0IGZmX2RzZl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJkc2YiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEU0QgU3RyZWFtIEZpbGUgKERTRikiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRFNGQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gZHNmX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGRzZl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBkc2ZfcmVhZF9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCB8IEFWRk1UX05PX0JZVEVfU0VFSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZHNpY2luLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZHNpY2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI1YTkzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kc2ljaW4uYwpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIERlbHBoaW5lIFNvZnR3YXJlIEludGVybmF0aW9uYWwgQ0lOIEZpbGUgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA2IEdyZWdvcnkgTW9udG9pciAoY3l4QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRGVscGhpbmUgU29mdHdhcmUgSW50ZXJuYXRpb25hbCBDSU4gZmlsZSBkZW11eGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorCisKK3R5cGVkZWYgc3RydWN0IENpbkZpbGVIZWFkZXIgeworICAgIGludCB2aWRlb19mcmFtZV9zaXplOworICAgIGludCB2aWRlb19mcmFtZV93aWR0aDsKKyAgICBpbnQgdmlkZW9fZnJhbWVfaGVpZ2h0OworICAgIGludCBhdWRpb19mcmVxdWVuY3k7CisgICAgaW50IGF1ZGlvX2JpdHM7CisgICAgaW50IGF1ZGlvX3N0ZXJlbzsKKyAgICBpbnQgYXVkaW9fZnJhbWVfc2l6ZTsKK30gQ2luRmlsZUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgQ2luRnJhbWVIZWFkZXIgeworICAgIGludCBhdWRpb19mcmFtZV90eXBlOworICAgIGludCB2aWRlb19mcmFtZV90eXBlOworICAgIGludCBwYWxfY29sb3JzX2NvdW50OworICAgIGludCBhdWRpb19mcmFtZV9zaXplOworICAgIGludCB2aWRlb19mcmFtZV9zaXplOworfSBDaW5GcmFtZUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgQ2luRGVtdXhDb250ZXh0IHsKKyAgICBpbnQgYXVkaW9fc3RyZWFtX2luZGV4OworICAgIGludCB2aWRlb19zdHJlYW1faW5kZXg7CisgICAgQ2luRmlsZUhlYWRlciBmaWxlX2hlYWRlcjsKKyAgICBpbnQ2NF90IGF1ZGlvX3N0cmVhbV9wdHM7CisgICAgaW50NjRfdCB2aWRlb19zdHJlYW1fcHRzOworICAgIENpbkZyYW1lSGVhZGVyIGZyYW1lX2hlYWRlcjsKKyAgICBpbnQgYXVkaW9fYnVmZmVyX3NpemU7Cit9IENpbkRlbXV4Q29udGV4dDsKKworCitzdGF0aWMgaW50IGNpbl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICAvKiBoZWFkZXIgc3RhcnRzIHdpdGggdGhpcyBzcGVjaWFsIG1hcmtlciAqLworICAgIGlmIChBVl9STDMyKCZwLT5idWZbMF0pICE9IDB4NTVBQTAwMDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogZm9yIGFjY3VyYWN5LCBjaGVjayBzb21lIGhlYWRlciBmaWVsZCB2YWx1ZXMgKi8KKyAgICBpZiAoQVZfUkwzMigmcC0+YnVmWzEyXSkgIT0gMjIwNTAgfHwgcC0+YnVmWzE2XSAhPSAxNiB8fCBwLT5idWZbMTddICE9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCitzdGF0aWMgaW50IGNpbl9yZWFkX2ZpbGVfaGVhZGVyKENpbkRlbXV4Q29udGV4dCAqY2luLCBBVklPQ29udGV4dCAqcGIpIHsKKyAgICBDaW5GaWxlSGVhZGVyICpoZHIgPSAmY2luLT5maWxlX2hlYWRlcjsKKworICAgIGlmIChhdmlvX3JsMzIocGIpICE9IDB4NTVBQTAwMDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaGRyLT52aWRlb19mcmFtZV9zaXplICAgPSBhdmlvX3JsMzIocGIpOworICAgIGhkci0+dmlkZW9fZnJhbWVfd2lkdGggID0gYXZpb19ybDE2KHBiKTsKKyAgICBoZHItPnZpZGVvX2ZyYW1lX2hlaWdodCA9IGF2aW9fcmwxNihwYik7CisgICAgaGRyLT5hdWRpb19mcmVxdWVuY3kgICAgPSBhdmlvX3JsMzIocGIpOworICAgIGhkci0+YXVkaW9fYml0cyAgICAgICAgID0gYXZpb19yOChwYik7CisgICAgaGRyLT5hdWRpb19zdGVyZW8gICAgICAgPSBhdmlvX3I4KHBiKTsKKyAgICBoZHItPmF1ZGlvX2ZyYW1lX3NpemUgICA9IGF2aW9fcmwxNihwYik7CisKKyAgICBpZiAoaGRyLT5hdWRpb19mcmVxdWVuY3kgIT0gMjIwNTAgfHwgaGRyLT5hdWRpb19iaXRzICE9IDE2IHx8IGhkci0+YXVkaW9fc3RlcmVvICE9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2luX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgcmM7CisgICAgQ2luRGVtdXhDb250ZXh0ICpjaW4gPSBzLT5wcml2X2RhdGE7CisgICAgQ2luRmlsZUhlYWRlciAqaGRyID0gJmNpbi0+ZmlsZV9oZWFkZXI7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgcmMgPSBjaW5fcmVhZF9maWxlX2hlYWRlcihjaW4sIHBiKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybiByYzsKKworICAgIGNpbi0+dmlkZW9fc3RyZWFtX3B0cyA9IDA7CisgICAgY2luLT5hdWRpb19zdHJlYW1fcHRzID0gMDsKKyAgICBjaW4tPmF1ZGlvX2J1ZmZlcl9zaXplID0gMDsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIHZpZGVvIGRlY29kZXIgc3RyZWFtICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgMTIpOworICAgIGNpbi0+dmlkZW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRFNJQ0lOVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjLT53aWR0aCA9IGhkci0+dmlkZW9fZnJhbWVfd2lkdGg7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBoZHItPnZpZGVvX2ZyYW1lX2hlaWdodDsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIGF1ZGlvIGRlY29kZXIgc3RyZWFtICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgMjIwNTApOworICAgIGNpbi0+YXVkaW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRFNJQ0lOQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gdGFnICovCisgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7CisgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSAyMjA1MDsKKyAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7CisgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW5fcmVhZF9mcmFtZV9oZWFkZXIoQ2luRGVtdXhDb250ZXh0ICpjaW4sIEFWSU9Db250ZXh0ICpwYikgeworICAgIENpbkZyYW1lSGVhZGVyICpoZHIgPSAmY2luLT5mcmFtZV9oZWFkZXI7CisKKyAgICBoZHItPnZpZGVvX2ZyYW1lX3R5cGUgPSBhdmlvX3I4KHBiKTsKKyAgICBoZHItPmF1ZGlvX2ZyYW1lX3R5cGUgPSBhdmlvX3I4KHBiKTsKKyAgICBoZHItPnBhbF9jb2xvcnNfY291bnQgPSBhdmlvX3JsMTYocGIpOworICAgIGhkci0+dmlkZW9fZnJhbWVfc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgaGRyLT5hdWRpb19mcmFtZV9zaXplID0gYXZpb19ybDMyKHBiKTsKKworICAgIGlmIChhdmlvX2Zlb2YocGIpIHx8IHBiLT5lcnJvcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIGlmIChhdmlvX3JsMzIocGIpICE9IDB4QUE1NUFBNTUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChoZHItPnZpZGVvX2ZyYW1lX3NpemUgPCAwIHx8IGhkci0+YXVkaW9fZnJhbWVfc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2luX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBDaW5EZW11eENvbnRleHQgKmNpbiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBDaW5GcmFtZUhlYWRlciAqaGRyID0gJmNpbi0+ZnJhbWVfaGVhZGVyOworICAgIGludCByYywgcGFsZXR0ZV90eXBlLCBwa3Rfc2l6ZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGNpbi0+YXVkaW9fYnVmZmVyX3NpemUgPT0gMCkgeworICAgICAgICByYyA9IGNpbl9yZWFkX2ZyYW1lX2hlYWRlcihjaW4sIHBiKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgcmV0dXJuIHJjOworCisgICAgICAgIGlmICgoaW50MTZfdCloZHItPnBhbF9jb2xvcnNfY291bnQgPCAwKSB7CisgICAgICAgICAgICBoZHItPnBhbF9jb2xvcnNfY291bnQgPSAtKGludDE2X3QpaGRyLT5wYWxfY29sb3JzX2NvdW50OworICAgICAgICAgICAgcGFsZXR0ZV90eXBlID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhbGV0dGVfdHlwZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBwYWxldHRlIGFuZCB2aWRlbyBwYWNrZXQgKi8KKyAgICAgICAgcGt0X3NpemUgPSAocGFsZXR0ZV90eXBlICsgMykgKiBoZHItPnBhbF9jb2xvcnNfY291bnQgKyBoZHItPnZpZGVvX2ZyYW1lX3NpemU7CisKKyAgICAgICAgcGt0X3NpemUgPSBmZmlvX2xpbWl0KHBiLCBwa3Rfc2l6ZSk7CisKKyAgICAgICAgcmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIDQgKyBwa3Rfc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGNpbi0+dmlkZW9fc3RyZWFtX2luZGV4OworICAgICAgICBwa3QtPnB0cyA9IGNpbi0+dmlkZW9fc3RyZWFtX3B0cysrOworCisgICAgICAgIHBrdC0+ZGF0YVswXSA9IHBhbGV0dGVfdHlwZTsKKyAgICAgICAgcGt0LT5kYXRhWzFdID0gaGRyLT5wYWxfY29sb3JzX2NvdW50ICYgMHhGRjsKKyAgICAgICAgcGt0LT5kYXRhWzJdID0gaGRyLT5wYWxfY29sb3JzX2NvdW50ID4+IDg7CisgICAgICAgIHBrdC0+ZGF0YVszXSA9IGhkci0+dmlkZW9fZnJhbWVfdHlwZTsKKworICAgICAgICByZXQgPSBhdmlvX3JlYWQocGIsICZwa3QtPmRhdGFbNF0sIHBrdF9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPCBwa3Rfc2l6ZSkKKyAgICAgICAgICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCA0ICsgcmV0KTsKKworICAgICAgICAvKiBzb3VuZCBidWZmZXIgd2lsbCBiZSBwcm9jZXNzZWQgb24gbmV4dCByZWFkX3BhY2tldCgpIGNhbGwgKi8KKyAgICAgICAgY2luLT5hdWRpb19idWZmZXJfc2l6ZSA9IGhkci0+YXVkaW9fZnJhbWVfc2l6ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogYXVkaW8gcGFja2V0ICovCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBjaW4tPmF1ZGlvX2J1ZmZlcl9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gY2luLT5hdWRpb19zdHJlYW1faW5kZXg7CisgICAgcGt0LT5wdHMgPSBjaW4tPmF1ZGlvX3N0cmVhbV9wdHM7CisgICAgcGt0LT5kdXJhdGlvbiA9IGNpbi0+YXVkaW9fYnVmZmVyX3NpemUgLSAocGt0LT5wdHMgPT0gMCk7CisgICAgY2luLT5hdWRpb19zdHJlYW1fcHRzICs9IHBrdC0+ZHVyYXRpb247CisgICAgY2luLT5hdWRpb19idWZmZXJfc2l6ZSA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfZHNpY2luX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImRzaWNpbiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRlbHBoaW5lIFNvZnR3YXJlIEludGVybmF0aW9uYWwgQ0lOIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENpbkRlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gY2luX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGNpbl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBjaW5fcmVhZF9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2R0c2RlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2R0c2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTRmNDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZHRzZGVjLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBSQVcgRFRTIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCBCZW5qYW1pbiBMYXJzc29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9kY2EuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJhd2RlYy5oIgorCisjZGVmaW5lIERDQV9NQVJLRVJfMTRCX0JFIDB4MUZGRkU4MDAKKyNkZWZpbmUgRENBX01BUktFUl8xNEJfTEUgMHhGRjFGMDBFOAorI2RlZmluZSBEQ0FfTUFSS0VSX1JBV19CRSAweDdGRkU4MDAxCisjZGVmaW5lIERDQV9NQVJLRVJfUkFXX0xFIDB4RkU3RjAxODAKKworc3RhdGljIGludCBkdHNfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmLCAqYnVmcDsKKyAgICB1aW50MzJfdCBzdGF0ZSA9IC0xOworICAgIGludCBtYXJrZXJzWzQqMTZdID0gezB9OworICAgIGludCBzdW0sIG1heCwgaTsKKyAgICBpbnQ2NF90IGRpZmYgPSAwOworICAgIHVpbnQ4X3QgaGRyWzEyICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV0gPSB7IDAgfTsKKworICAgIGJ1ZiA9IHAtPmJ1ZiArIEZGTUlOKDQwOTYsIHAtPmJ1Zl9zaXplKTsKKworICAgIGZvcig7IGJ1ZiA8IChwLT5idWYrcC0+YnVmX3NpemUpLTI7IGJ1Zis9MikgeworICAgICAgICBpbnQgbWFya2VyLCBzYW1wbGVfYmxvY2tzLCBzYW1wbGVfcmF0ZSwgc3JfY29kZSwgZnJhbWVzaXplOworICAgICAgICBpbnQgbGZlOworICAgICAgICBHZXRCaXRDb250ZXh0IGdiOworCisgICAgICAgIGJ1ZnAgPSBidWY7CisgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDE2KSB8IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmJ1ZnApOworCisgICAgICAgIGlmIChidWYgLSBwLT5idWYgPj0gNCkKKyAgICAgICAgICAgIGRpZmYgKz0gRkZBQlMoKChpbnQxNl90KUFWX1JMMTYoYnVmKSkgLSAoaW50MTZfdClBVl9STDE2KGJ1Zi00KSk7CisKKyAgICAgICAgLyogcmVndWxhciBiaXRzdHJlYW0gKi8KKyAgICAgICAgaWYgKHN0YXRlID09IERDQV9NQVJLRVJfUkFXX0JFKQorICAgICAgICAgICAgbWFya2VyID0gMDsKKyAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gRENBX01BUktFUl9SQVdfTEUpCisgICAgICAgICAgICBtYXJrZXIgPSAxOworCisgICAgICAgIC8qIDE0IGJpdHMgYmlnLWVuZGlhbiBiaXRzdHJlYW0gKi8KKyAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gRENBX01BUktFUl8xNEJfQkUgJiYKKyAgICAgICAgICAgICAgICAgKGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmJ1ZnApICYgMHhGRkYwKSA9PSAweDA3RjApCisgICAgICAgICAgICBtYXJrZXIgPSAyOworCisgICAgICAgIC8qIDE0IGJpdHMgbGl0dGxlLWVuZGlhbiBiaXRzdHJlYW0gKi8KKyAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gRENBX01BUktFUl8xNEJfTEUgJiYKKyAgICAgICAgICAgICAgICAgKGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmJ1ZnApICYgMHhGMEZGKSA9PSAweEYwMDcpCisgICAgICAgICAgICBtYXJrZXIgPSAzOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoYXZwcml2X2RjYV9jb252ZXJ0X2JpdHN0cmVhbShidWYtMiwgMTIsIGhkciwgMTIpIDwgMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBoZHIsIDk2KTsKKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCAzOSk7CisKKyAgICAgICAgc2FtcGxlX2Jsb2NrcyA9IGdldF9iaXRzKCZnYiwgNykgKyAxOworICAgICAgICBpZiAoc2FtcGxlX2Jsb2NrcyA8IDgpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmcmFtZXNpemUgPSBnZXRfYml0cygmZ2IsIDE0KSArIDE7CisgICAgICAgIGlmIChmcmFtZXNpemUgPCA5NSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHNraXBfYml0cygmZ2IsIDYpOworICAgICAgICBzcl9jb2RlID0gZ2V0X2JpdHMoJmdiLCA0KTsKKyAgICAgICAgc2FtcGxlX3JhdGUgPSBhdnByaXZfZGNhX3NhbXBsZV9yYXRlc1tzcl9jb2RlXTsKKyAgICAgICAgaWYgKHNhbXBsZV9yYXRlID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBnZXRfYml0cygmZ2IsIDUpOworICAgICAgICBpZiAoZ2V0X2JpdHMoJmdiLCAxKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHNraXBfYml0c19sb25nKCZnYiwgOSk7CisgICAgICAgIGxmZSA9IGdldF9iaXRzKCZnYiwgMik7CisgICAgICAgIGlmIChsZmUgPiAyKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbWFya2VyICs9IDQqIHNyX2NvZGU7CisKKyAgICAgICAgbWFya2Vyc1ttYXJrZXJdICsrOworICAgIH0KKworICAgIHN1bSA9IG1heCA9IDA7CisgICAgZm9yIChpPTA7IGk8RkZfQVJSQVlfRUxFTVMobWFya2Vycyk7IGkrKykgeworICAgICAgICBzdW0gKz0gbWFya2Vyc1tpXTsKKyAgICAgICAgaWYgKG1hcmtlcnNbbWF4XSA8IG1hcmtlcnNbaV0pCisgICAgICAgICAgICBtYXggPSBpOworICAgIH0KKworICAgIGlmIChtYXJrZXJzW21heF0gPiAzICYmIHAtPmJ1Zl9zaXplIC8gbWFya2Vyc1ttYXhdIDwgMzIqMTAyNCAmJgorICAgICAgICBtYXJrZXJzW21heF0gKiA0ID4gc3VtICogMyAmJgorICAgICAgICBkaWZmIC8gcC0+YnVmX3NpemUgPiAyMDApCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9kdHNfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZHRzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IERUUyIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGR0c19wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBmZl9yYXdfYXVkaW9fcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmZfcmF3X3JlYWRfcGFydGlhbF9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiZHRzIiwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9EVFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2R0c2hkZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZHRzaGRkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmQwMzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2R0c2hkZGVjLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBSYXcgRFRTLUhEIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisKKyNkZWZpbmUgQVVQUl9IRFIgMHg0MTU1NTA1MjJENDg0NDUyCisjZGVmaW5lIEFVUFJJTkZPIDB4NDE1NTUwNTI0OTRFNDY0RgorI2RlZmluZSBCSVRTSFZUQiAweDQyNDk1NDUzNDg1NjU0NDIKKyNkZWZpbmUgQkxBQ0tPVVQgMHg0MjRDNDE0MzRCNEY1NTU0CisjZGVmaW5lIEJSQU5DSFBUIDB4NDI1MjQxNEU0MzQ4NTA1NAorI2RlZmluZSBCVUlMRFZFUiAweDQyNTU0OTRDNDQ1NjQ1NTIKKyNkZWZpbmUgQ09SRVNTTUQgMHg0MzRGNTI0NTUzNTM0RDQ0CisjZGVmaW5lIERUU0hESERSIDB4NDQ1NDUzNDg0NDQ4NDQ1MgorI2RlZmluZSBFWFRTU19NRCAweDQ1NTg1NDUzNTM1ZjRkNDQKKyNkZWZpbmUgRklMRUlORk8gMHg0NjQ5NEM0NTQ5NEU0NjRGCisjZGVmaW5lIE5BVklfVEJMIDB4NEU0MTU2NDkyRDU0NDI0QworI2RlZmluZSBTVFJNREFUQSAweDUzNTQ1MjRENDQ0MTU0NDEKKyNkZWZpbmUgVElNRUNPREUgMHg1NDQ5NEQ0NTQzNEY0NDQ1CisKK3R5cGVkZWYgc3RydWN0IERUU0hERGVtdXhDb250ZXh0IHsKKyAgICB1aW50NjRfdCAgICBkYXRhX2VuZDsKK30gRFRTSEREZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgZHRzaGRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKEFWX1JCNjQocC0+YnVmKSA9PSBEVFNIREhEUikKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR0c2hkX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBEVFNIRERlbXV4Q29udGV4dCAqZHRzaGQgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgdWludDY0X3QgY2h1bmtfdHlwZSwgY2h1bmtfc2l6ZTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IHJldDsKKyAgICBjaGFyICp2YWx1ZTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9EVFM7CisgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgY2h1bmtfdHlwZSA9IGF2aW9fcmI2NChwYik7CisgICAgICAgIGNodW5rX3NpemUgPSBhdmlvX3JiNjQocGIpOworCisgICAgICAgIGlmIChjaHVua19zaXplIDwgNCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNodW5rIHNpemUgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChjaHVua19zaXplID4gKCh1aW50NjRfdCkxIDw8IDYxKSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNodW5rIHNpemUgdG9vIGJpZ1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoY2h1bmtfdHlwZSkgeworICAgICAgICBjYXNlIFNUUk1EQVRBOgorICAgICAgICAgICAgZHRzaGQtPmRhdGFfZW5kID0gY2h1bmtfc2l6ZSArIGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBpZiAoZHRzaGQtPmRhdGFfZW5kIDw9IGNodW5rX3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZJTEVJTkZPOgorICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPiBJTlRfTUFYKQorICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKKyAgICAgICAgICAgIHZhbHVlID0gYXZfbWFsbG9jKGNodW5rX3NpemUpOworICAgICAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgICAgICAgICBhdmlvX3JlYWQocGIsIHZhbHVlLCBjaHVua19zaXplKTsKKyAgICAgICAgICAgIHZhbHVlW2NodW5rX3NpemUgLSAxXSA9IDA7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJmaWxlaW5mbyIsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6Citza2lwOgorICAgICAgICAgICAgcmV0ID0gYXZpb19za2lwKHBiLCBjaHVua19zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH07CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1JfRU9GOworfQorCitzdGF0aWMgaW50IHJhd19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgRFRTSEREZW11eENvbnRleHQgKmR0c2hkID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3Qgc2l6ZSwgbGVmdDsKKyAgICBpbnQgcmV0OworCisgICAgbGVmdCA9IGR0c2hkLT5kYXRhX2VuZCAtIGF2aW9fdGVsbChzLT5wYik7CisgICAgc2l6ZSA9IEZGTUlOKGxlZnQsIDEwMjQpOworICAgIGlmIChzaXplIDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitBVklucHV0Rm9ybWF0IGZmX2R0c2hkX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImR0c2hkIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IERUUy1IRCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihEVFNIRERlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gZHRzaGRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZHRzaGRfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcmF3X3JlYWRfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImR0c2hkIiwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9EVFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2R1bXAuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiMzdmZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kdW1wLmMKQEAgLTAsMCArMSw1MTAgQEAKKy8qCisgKiBWYXJpb3VzIHByZXR0eS1wcmludGluZyBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoaW4gRkZtcGVnCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Rpc3BsYXkuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmVwbGF5Z2Fpbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zdGVyZW8zZC5oIgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworI2RlZmluZSBIRVhEVU1QX1BSSU5UKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXZfbG9nKGF2Y2wsIGxldmVsLCBfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZnByaW50ZihmLCBfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGhleF9kdW1wX2ludGVybmFsKHZvaWQgKmF2Y2wsIEZJTEUgKmYsIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgaW50IGxlbiwgaSwgaiwgYzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IDE2KSB7CisgICAgICAgIGxlbiA9IHNpemUgLSBpOworICAgICAgICBpZiAobGVuID4gMTYpCisgICAgICAgICAgICBsZW4gPSAxNjsKKyAgICAgICAgSEVYRFVNUF9QUklOVCgiJTA4eCAiLCBpKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKyAgICAgICAgICAgIGlmIChqIDwgbGVuKQorICAgICAgICAgICAgICAgIEhFWERVTVBfUFJJTlQoIiAlMDJ4IiwgYnVmW2kgKyBqXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgSEVYRFVNUF9QUklOVCgiICAgIik7CisgICAgICAgIH0KKyAgICAgICAgSEVYRFVNUF9QUklOVCgiICIpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgICAgICAgIGMgPSBidWZbaSArIGpdOworICAgICAgICAgICAgaWYgKGMgPCAnICcgfHwgYyA+ICd+JykKKyAgICAgICAgICAgICAgICBjID0gJy4nOworICAgICAgICAgICAgSEVYRFVNUF9QUklOVCgiJWMiLCBjKTsKKyAgICAgICAgfQorICAgICAgICBIRVhEVU1QX1BSSU5UKCJcbiIpOworICAgIH0KK30KKwordm9pZCBhdl9oZXhfZHVtcChGSUxFICpmLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIGhleF9kdW1wX2ludGVybmFsKE5VTEwsIGYsIDAsIGJ1Ziwgc2l6ZSk7Cit9CisKK3ZvaWQgYXZfaGV4X2R1bXBfbG9nKHZvaWQgKmF2Y2wsIGludCBsZXZlbCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBoZXhfZHVtcF9pbnRlcm5hbChhdmNsLCBOVUxMLCBsZXZlbCwgYnVmLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgcGt0X2R1bXBfaW50ZXJuYWwodm9pZCAqYXZjbCwgRklMRSAqZiwgaW50IGxldmVsLCBjb25zdCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR1bXBfcGF5bG9hZCwgQVZSYXRpb25hbCB0aW1lX2Jhc2UpCit7CisgICAgSEVYRFVNUF9QUklOVCgic3RyZWFtICMlZDpcbiIsIHBrdC0+c3RyZWFtX2luZGV4KTsKKyAgICBIRVhEVU1QX1BSSU5UKCIgIGtleWZyYW1lPSVkXG4iLCAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkgIT0gMCk7CisgICAgSEVYRFVNUF9QUklOVCgiICBkdXJhdGlvbj0lMC4zZlxuIiwgcGt0LT5kdXJhdGlvbiAqIGF2X3EyZCh0aW1lX2Jhc2UpKTsKKyAgICAvKiBEVFMgaXMgX2Fsd2F5c18gdmFsaWQgYWZ0ZXIgYXZfcmVhZF9mcmFtZSgpICovCisgICAgSEVYRFVNUF9QUklOVCgiICBkdHM9Iik7CisgICAgaWYgKHBrdC0+ZHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBIRVhEVU1QX1BSSU5UKCJOL0EiKTsKKyAgICBlbHNlCisgICAgICAgIEhFWERVTVBfUFJJTlQoIiUwLjNmIiwgcGt0LT5kdHMgKiBhdl9xMmQodGltZV9iYXNlKSk7CisgICAgLyogUFRTIG1heSBub3QgYmUga25vd24gaWYgQi1mcmFtZXMgYXJlIHByZXNlbnQuICovCisgICAgSEVYRFVNUF9QUklOVCgiICBwdHM9Iik7CisgICAgaWYgKHBrdC0+cHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBIRVhEVU1QX1BSSU5UKCJOL0EiKTsKKyAgICBlbHNlCisgICAgICAgIEhFWERVTVBfUFJJTlQoIiUwLjNmIiwgcGt0LT5wdHMgKiBhdl9xMmQodGltZV9iYXNlKSk7CisgICAgSEVYRFVNUF9QUklOVCgiXG4iKTsKKyAgICBIRVhEVU1QX1BSSU5UKCIgIHNpemU9JWRcbiIsIHBrdC0+c2l6ZSk7CisgICAgaWYgKGR1bXBfcGF5bG9hZCkKKyAgICAgICAgYXZfaGV4X2R1bXAoZiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworfQorCit2b2lkIGF2X3BrdF9kdW1wMihGSUxFICpmLCBjb25zdCBBVlBhY2tldCAqcGt0LCBpbnQgZHVtcF9wYXlsb2FkLCBjb25zdCBBVlN0cmVhbSAqc3QpCit7CisgICAgcGt0X2R1bXBfaW50ZXJuYWwoTlVMTCwgZiwgMCwgcGt0LCBkdW1wX3BheWxvYWQsIHN0LT50aW1lX2Jhc2UpOworfQorCit2b2lkIGF2X3BrdF9kdW1wX2xvZzIodm9pZCAqYXZjbCwgaW50IGxldmVsLCBjb25zdCBBVlBhY2tldCAqcGt0LCBpbnQgZHVtcF9wYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWU3RyZWFtICpzdCkKK3sKKyAgICBwa3RfZHVtcF9pbnRlcm5hbChhdmNsLCBOVUxMLCBsZXZlbCwgcGt0LCBkdW1wX3BheWxvYWQsIHN0LT50aW1lX2Jhc2UpOworfQorCisKK3N0YXRpYyB2b2lkIHByaW50X2Zwcyhkb3VibGUgZCwgY29uc3QgY2hhciAqcG9zdGZpeCkKK3sKKyAgICB1aW50NjRfdCB2ID0gbHJpbnRmKGQgKiAxMDApOworICAgIGlmICh2ICUgMTAwKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlMy4yZiAlcyIsIGQsIHBvc3RmaXgpOworICAgIGVsc2UgaWYgKHYgJSAoMTAwICogMTAwMCkpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiUxLjBmICVzIiwgZCwgcG9zdGZpeCk7CisgICAgZWxzZQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlMS4wZmsgJXMiLCBkIC8gMTAwMCwgcG9zdGZpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfbWV0YWRhdGEodm9pZCAqY3R4LCBBVkRpY3Rpb25hcnkgKm0sIGNvbnN0IGNoYXIgKmluZGVudCkKK3sKKyAgICBpZiAobSAmJiAhKGF2X2RpY3RfY291bnQobSkgPT0gMSAmJiBhdl9kaWN0X2dldChtLCAibGFuZ3VhZ2UiLCBOVUxMLCAwKSkpIHsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnRhZyA9IE5VTEw7CisKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIlc01ldGFkYXRhOlxuIiwgaW5kZW50KTsKKyAgICAgICAgd2hpbGUgKCh0YWcgPSBhdl9kaWN0X2dldChtLCAiIiwgdGFnLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKKyAgICAgICAgICAgIGlmIChzdHJjbXAoImxhbmd1YWdlIiwgdGFnLT5rZXkpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IHRhZy0+dmFsdWU7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICIlcyAgJS0xNnM6ICIsIGluZGVudCwgdGFnLT5rZXkpOworICAgICAgICAgICAgICAgIHdoaWxlICgqcCkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIHRtcFsyNTZdOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuID0gc3RyY3NwbihwLCAiXHg4XHhhXHhiXHhjXHhkIik7CisgICAgICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkodG1wLCBwLCBGRk1JTihzaXplb2YodG1wKSwgbGVuKzEpKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIlcyIsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHAgKz0gbGVuOworICAgICAgICAgICAgICAgICAgICBpZiAoKnAgPT0gMHhkKSBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpwID09IDB4YSkgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJcbiVzICAlLTE2czogIiwgaW5kZW50LCAiIik7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcCkgcCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CisgICAgICAgICAgICB9CisgICAgfQorfQorCisvKiBwYXJhbSBjaGFuZ2Ugc2lkZSBkYXRhKi8KK3N0YXRpYyB2b2lkIGR1bXBfcGFyYW1jaGFuZ2Uodm9pZCAqY3R4LCBBVlBhY2tldFNpZGVEYXRhICpzZCkKK3sKKyAgICBpbnQgc2l6ZSA9IHNkLT5zaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBzZC0+ZGF0YTsKKyAgICB1aW50MzJfdCBmbGFncywgY2hhbm5lbHMsIHNhbXBsZV9yYXRlLCB3aWR0aCwgaGVpZ2h0OworICAgIHVpbnQ2NF90IGxheW91dDsKKworICAgIGlmICghZGF0YSB8fCBzZC0+c2l6ZSA8IDQpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZsYWdzID0gQVZfUkwzMihkYXRhKTsKKyAgICBkYXRhICs9IDQ7CisgICAgc2l6ZSAtPSA0OworCisgICAgaWYgKGZsYWdzICYgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9DSEFOTkVMX0NPVU5UKSB7CisgICAgICAgIGlmIChzaXplIDwgNCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgY2hhbm5lbHMgPSBBVl9STDMyKGRhdGEpOworICAgICAgICBkYXRhICs9IDQ7CisgICAgICAgIHNpemUgLT0gNDsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJjaGFubmVsIGNvdW50ICUiUFJJdTMyIiwgIiwgY2hhbm5lbHMpOworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0NIQU5ORUxfTEFZT1VUKSB7CisgICAgICAgIGlmIChzaXplIDwgOCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgbGF5b3V0ID0gQVZfUkw2NChkYXRhKTsKKyAgICAgICAgZGF0YSArPSA4OworICAgICAgICBzaXplIC09IDg7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgImNoYW5uZWwgbGF5b3V0OiAlcywgIiwgYXZfZ2V0X2NoYW5uZWxfbmFtZShsYXlvdXQpKTsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9TQU1QTEVfUkFURSkgeworICAgICAgICBpZiAoc2l6ZSA8IDQpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHNhbXBsZV9yYXRlID0gQVZfUkwzMihkYXRhKTsKKyAgICAgICAgZGF0YSArPSA0OworICAgICAgICBzaXplIC09IDQ7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAic2FtcGxlX3JhdGUgJSJQUkl1MzIiLCAiLCBzYW1wbGVfcmF0ZSk7CisgICAgfQorICAgIGlmIChmbGFncyAmIEFWX1NJREVfREFUQV9QQVJBTV9DSEFOR0VfRElNRU5TSU9OUykgeworICAgICAgICBpZiAoc2l6ZSA8IDgpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHdpZHRoID0gQVZfUkwzMihkYXRhKTsKKyAgICAgICAgZGF0YSArPSA0OworICAgICAgICBzaXplIC09IDQ7CisgICAgICAgIGhlaWdodCA9IEFWX1JMMzIoZGF0YSk7CisgICAgICAgIGRhdGEgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSA0OworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIndpZHRoICUiUFJJdTMyIiBoZWlnaHQgJSJQUkl1MzIsIHdpZHRoLCBoZWlnaHQpOworICAgIH0KKworICAgIHJldHVybjsKK2ZhaWw6CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJ1bmtub3duIHBhcmFtIik7Cit9CisKKy8qIHJlcGxheWdhaW4gc2lkZSBkYXRhKi8KK3N0YXRpYyB2b2lkIHByaW50X2dhaW4odm9pZCAqY3R4LCBjb25zdCBjaGFyICpzdHIsIGludDMyX3QgZ2FpbikKK3sKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiVzIC0gIiwgc3RyKTsKKyAgICBpZiAoZ2FpbiA9PSBJTlQzMl9NSU4pCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAidW5rbm93biIpOworICAgIGVsc2UKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIlZiIsIGdhaW4gLyAxMDAwMDAuMGYpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiLCAiKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcGVhayh2b2lkICpjdHgsIGNvbnN0IGNoYXIgKnN0ciwgdWludDMyX3QgcGVhaykKK3sKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiVzIC0gIiwgc3RyKTsKKyAgICBpZiAoIXBlYWspCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAidW5rbm93biIpOworICAgIGVsc2UKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIlZiIsIChmbG9hdCkgcGVhayAvIFVJTlQzMl9NQVgpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiLCAiKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9yZXBsYXlnYWluKHZvaWQgKmN0eCwgQVZQYWNrZXRTaWRlRGF0YSAqc2QpCit7CisgICAgQVZSZXBsYXlHYWluICpyZzsKKworICAgIGlmIChzZC0+c2l6ZSA8IHNpemVvZigqcmcpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiaW52YWxpZCBkYXRhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmcgPSAoQVZSZXBsYXlHYWluKilzZC0+ZGF0YTsKKworICAgIHByaW50X2dhaW4oY3R4LCAidHJhY2sgZ2FpbiIsIHJnLT50cmFja19nYWluKTsKKyAgICBwcmludF9wZWFrKGN0eCwgInRyYWNrIHBlYWsiLCByZy0+dHJhY2tfcGVhayk7CisgICAgcHJpbnRfZ2FpbihjdHgsICJhbGJ1bSBnYWluIiwgcmctPmFsYnVtX2dhaW4pOworICAgIHByaW50X3BlYWsoY3R4LCAiYWxidW0gcGVhayIsIHJnLT5hbGJ1bV9wZWFrKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9zdGVyZW8zZCh2b2lkICpjdHgsIEFWUGFja2V0U2lkZURhdGEgKnNkKQoreworICAgIEFWU3RlcmVvM0QgKnN0ZXJlbzsKKworICAgIGlmIChzZC0+c2l6ZSA8IHNpemVvZigqc3RlcmVvKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgImludmFsaWQgZGF0YSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RlcmVvID0gKEFWU3RlcmVvM0QgKilzZC0+ZGF0YTsKKworICAgIHN3aXRjaCAoc3RlcmVvLT50eXBlKSB7CisgICAgY2FzZSBBVl9TVEVSRU8zRF8yRDoKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIyRCIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NURVJFTzNEX1NJREVCWVNJREU6CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAic2lkZSBieSBzaWRlIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfVE9QQk9UVE9NOgorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgInRvcCBhbmQgYm90dG9tIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfRlJBTUVTRVFVRU5DRToKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJmcmFtZSBhbHRlcm5hdGUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TVEVSRU8zRF9DSEVDS0VSQk9BUkQ6CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiY2hlY2tlcmJvYXJkIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfTElORVM6CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiaW50ZXJsZWF2ZWQgbGluZXMiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TVEVSRU8zRF9DT0xVTU5TOgorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgImludGVybGVhdmVkIGNvbHVtbnMiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TVEVSRU8zRF9TSURFQllTSURFX1FVSU5DVU5YOgorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgInNpZGUgYnkgc2lkZSAocXVpbmN1bnggc3Vic2FtcGxpbmcpIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAidW5rbm93biIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc3RlcmVvLT5mbGFncyAmIEFWX1NURVJFTzNEX0ZMQUdfSU5WRVJUKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiAoaW52ZXJ0ZWQpIik7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfc2lkZWRhdGEodm9pZCAqY3R4LCBBVlN0cmVhbSAqc3QsIGNvbnN0IGNoYXIgKmluZGVudCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChzdC0+bmJfc2lkZV9kYXRhKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiVzU2lkZSBkYXRhOlxuIiwgaW5kZW50KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+bmJfc2lkZV9kYXRhOyBpKyspIHsKKyAgICAgICAgQVZQYWNrZXRTaWRlRGF0YSBzZCA9IHN0LT5zaWRlX2RhdGFbaV07CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiJXMgICIsIGluZGVudCk7CisKKyAgICAgICAgc3dpdGNoIChzZC50eXBlKSB7CisgICAgICAgIGNhc2UgQVZfUEtUX0RBVEFfUEFMRVRURToKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAicGFsZXR0ZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQToKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAibmV3IGV4dHJhZGF0YSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUEtUX0RBVEFfUEFSQU1fQ0hBTkdFOgorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJwYXJhbWNoYW5nZTogIik7CisgICAgICAgICAgICBkdW1wX3BhcmFtY2hhbmdlKGN0eCwgJnNkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BLVF9EQVRBX0gyNjNfTUJfSU5GTzoKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiaDI2MyBtYWNyb2Jsb2NrIGluZm8iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BLVF9EQVRBX1JFUExBWUdBSU46CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgInJlcGxheWdhaW46ICIpOworICAgICAgICAgICAgZHVtcF9yZXBsYXlnYWluKGN0eCwgJnNkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BLVF9EQVRBX0RJU1BMQVlNQVRSSVg6CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgImRpc3BsYXltYXRyaXg6IHJvdGF0aW9uIG9mICUuMmYgZGVncmVlcyIsCisgICAgICAgICAgICAgICAgICAgYXZfZGlzcGxheV9yb3RhdGlvbl9nZXQoKGludDMyX3QgKilzZC5kYXRhKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QS1RfREFUQV9TVEVSRU8zRDoKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAic3RlcmVvM2Q6ICIpOworICAgICAgICAgICAgZHVtcF9zdGVyZW8zZChjdHgsICZzZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHNpZGUgZGF0YSB0eXBlICVkICglZCBieXRlcykiLCBzZC50eXBlLCBzZC5zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJcbiIpOworICAgIH0KK30KKworLyogInVzZXIgaW50ZXJmYWNlIiBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGR1bXBfc3RyZWFtX2Zvcm1hdChBVkZvcm1hdENvbnRleHQgKmljLCBpbnQgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGludCBpc19vdXRwdXQpCit7CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBpbnQgZmxhZ3MgPSAoaXNfb3V0cHV0ID8gaWMtPm9mb3JtYXQtPmZsYWdzIDogaWMtPmlmb3JtYXQtPmZsYWdzKTsKKyAgICBBVlN0cmVhbSAqc3QgPSBpYy0+c3RyZWFtc1tpXTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqbGFuZyA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgImxhbmd1YWdlIiwgTlVMTCwgMCk7CisgICAgY2hhciAqc2VwYXJhdG9yID0gaWMtPmR1bXBfc2VwYXJhdG9yOworICAgIGNoYXIgKipjb2RlY19zZXBhcmF0b3IgPSBhdl9vcHRfcHRyKHN0LT5jb2RlYy0+YXZfY2xhc3MsIHN0LT5jb2RlYywgImR1bXBfc2VwYXJhdG9yIik7CisgICAgaW50IHVzZV9mb3JtYXRfc2VwYXJhdG9yID0gISpjb2RlY19zZXBhcmF0b3I7CisKKyAgICBpZiAodXNlX2Zvcm1hdF9zZXBhcmF0b3IpCisgICAgICAgICpjb2RlY19zZXBhcmF0b3IgPSBhdl9zdHJkdXAoc2VwYXJhdG9yKTsKKyAgICBhdmNvZGVjX3N0cmluZyhidWYsIHNpemVvZihidWYpLCBzdC0+Y29kZWMsIGlzX291dHB1dCk7CisgICAgaWYgKHVzZV9mb3JtYXRfc2VwYXJhdG9yKQorICAgICAgICBhdl9mcmVlcChjb2RlY19zZXBhcmF0b3IpOworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiAgICBTdHJlYW0gIyVkOiVkIiwgaW5kZXgsIGkpOworCisgICAgLyogdGhlIHBpZCBpcyBhbiBpbXBvcnRhbnQgaW5mb3JtYXRpb24sIHNvIHdlIGRpc3BsYXkgaXQgKi8KKyAgICAvKiBYWFg6IGFkZCBhIGdlbmVyaWMgc3lzdGVtICovCisgICAgaWYgKGZsYWdzICYgQVZGTVRfU0hPV19JRFMpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlsweCV4XSIsIHN0LT5pZCk7CisgICAgaWYgKGxhbmcpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiglcykiLCBsYW5nLT52YWx1ZSk7CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiwgJWQsICVkLyVkIiwgc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzLAorICAgICAgICAgICBzdC0+dGltZV9iYXNlLm51bSwgc3QtPnRpbWVfYmFzZS5kZW4pOworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIjogJXMiLCBidWYpOworCisgICAgaWYgKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAmJiAvLyBkZWZhdWx0CisgICAgICAgIGF2X2NtcF9xKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLCBzdC0+Y29kZWMtPnNhbXBsZV9hc3BlY3RfcmF0aW8pKSB7CisgICAgICAgIEFWUmF0aW9uYWwgZGlzcGxheV9hc3BlY3RfcmF0aW87CisgICAgICAgIGF2X3JlZHVjZSgmZGlzcGxheV9hc3BlY3RfcmF0aW8ubnVtLCAmZGlzcGxheV9hc3BlY3RfcmF0aW8uZGVuLAorICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgKiBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCisgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAqIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiLCBTQVIgJWQ6JWQgREFSICVkOiVkIiwKKyAgICAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAorICAgICAgICAgICAgICAgZGlzcGxheV9hc3BlY3RfcmF0aW8ubnVtLCBkaXNwbGF5X2FzcGVjdF9yYXRpby5kZW4pOworICAgIH0KKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGludCBmcHMgPSBzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuICYmIHN0LT5hdmdfZnJhbWVfcmF0ZS5udW07CisgICAgICAgIGludCB0YnIgPSBzdC0+cl9mcmFtZV9yYXRlLmRlbiAmJiBzdC0+cl9mcmFtZV9yYXRlLm51bTsKKyAgICAgICAgaW50IHRibiA9IHN0LT50aW1lX2Jhc2UuZGVuICYmIHN0LT50aW1lX2Jhc2UubnVtOworICAgICAgICBpbnQgdGJjID0gc3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuICYmIHN0LT5jb2RlYy0+dGltZV9iYXNlLm51bTsKKworICAgICAgICBpZiAoZnBzIHx8IHRiciB8fCB0Ym4gfHwgdGJjKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJXMiLCBzZXBhcmF0b3IpOworCisgICAgICAgIGlmIChmcHMpCisgICAgICAgICAgICBwcmludF9mcHMoYXZfcTJkKHN0LT5hdmdfZnJhbWVfcmF0ZSksIHRiciB8fCB0Ym4gfHwgdGJjID8gImZwcywgIiA6ICJmcHMiKTsKKyAgICAgICAgaWYgKHRicikKKyAgICAgICAgICAgIHByaW50X2Zwcyhhdl9xMmQoc3QtPnJfZnJhbWVfcmF0ZSksIHRibiB8fCB0YmMgPyAidGJyLCAiIDogInRiciIpOworICAgICAgICBpZiAodGJuKQorICAgICAgICAgICAgcHJpbnRfZnBzKDEgLyBhdl9xMmQoc3QtPnRpbWVfYmFzZSksIHRiYyA/ICJ0Ym4sICIgOiAidGJuIik7CisgICAgICAgIGlmICh0YmMpCisgICAgICAgICAgICBwcmludF9mcHMoMSAvIGF2X3EyZChzdC0+Y29kZWMtPnRpbWVfYmFzZSksICJ0YmMiKTsKKyAgICB9CisKKyAgICBpZiAoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fREVGQVVMVCkKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiIChkZWZhdWx0KSIpOworICAgIGlmIChzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9EVUIpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiAoZHViKSIpOworICAgIGlmIChzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9PUklHSU5BTCkKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiIChvcmlnaW5hbCkiKTsKKyAgICBpZiAoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fQ09NTUVOVCkKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiIChjb21tZW50KSIpOworICAgIGlmIChzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9MWVJJQ1MpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiAobHlyaWNzKSIpOworICAgIGlmIChzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9LQVJBT0tFKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgKGthcmFva2UpIik7CisgICAgaWYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0ZPUkNFRCkKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiIChmb3JjZWQpIik7CisgICAgaWYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiAoaGVhcmluZyBpbXBhaXJlZCkiKTsKKyAgICBpZiAoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fVklTVUFMX0lNUEFJUkVEKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgKHZpc3VhbCBpbXBhaXJlZCkiKTsKKyAgICBpZiAoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fQ0xFQU5fRUZGRUNUUykKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiIChjbGVhbiBlZmZlY3RzKSIpOworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlxuIik7CisKKyAgICBkdW1wX21ldGFkYXRhKE5VTEwsIHN0LT5tZXRhZGF0YSwgIiAgICAiKTsKKworICAgIGR1bXBfc2lkZWRhdGEoTlVMTCwgc3QsICIgICAgIik7Cit9CisKK3ZvaWQgYXZfZHVtcF9mb3JtYXQoQVZGb3JtYXRDb250ZXh0ICppYywgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGludCBpc19vdXRwdXQpCit7CisgICAgaW50IGk7CisgICAgdWludDhfdCAqcHJpbnRlZCA9IGljLT5uYl9zdHJlYW1zID8gYXZfbWFsbG9jeihpYy0+bmJfc3RyZWFtcykgOiBOVUxMOworICAgIGlmIChpYy0+bmJfc3RyZWFtcyAmJiAhcHJpbnRlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJXMgIyVkLCAlcywgJXMgJyVzJzpcbiIsCisgICAgICAgICAgIGlzX291dHB1dCA/ICJPdXRwdXQiIDogIklucHV0IiwKKyAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgIGlzX291dHB1dCA/IGljLT5vZm9ybWF0LT5uYW1lIDogaWMtPmlmb3JtYXQtPm5hbWUsCisgICAgICAgICAgIGlzX291dHB1dCA/ICJ0byIgOiAiZnJvbSIsIHVybCk7CisgICAgZHVtcF9tZXRhZGF0YShOVUxMLCBpYy0+bWV0YWRhdGEsICIgICIpOworCisgICAgaWYgKCFpc19vdXRwdXQpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiICBEdXJhdGlvbjogIik7CisgICAgICAgIGlmIChpYy0+ZHVyYXRpb24gIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIGludCBob3VycywgbWlucywgc2VjcywgdXM7CisgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gaWMtPmR1cmF0aW9uICsgNTAwMDsKKyAgICAgICAgICAgIHNlY3MgID0gZHVyYXRpb24gLyBBVl9USU1FX0JBU0U7CisgICAgICAgICAgICB1cyAgICA9IGR1cmF0aW9uICUgQVZfVElNRV9CQVNFOworICAgICAgICAgICAgbWlucyAgPSBzZWNzIC8gNjA7CisgICAgICAgICAgICBzZWNzICU9IDYwOworICAgICAgICAgICAgaG91cnMgPSBtaW5zIC8gNjA7CisgICAgICAgICAgICBtaW5zICU9IDYwOworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJTAyZDolMDJkOiUwMmQuJTAyZCIsIGhvdXJzLCBtaW5zLCBzZWNzLAorICAgICAgICAgICAgICAgICAgICgxMDAgKiB1cykgLyBBVl9USU1FX0JBU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiTi9BIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGljLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBpbnQgc2VjcywgdXM7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIsIHN0YXJ0OiAiKTsKKyAgICAgICAgICAgIHNlY3MgPSBpYy0+c3RhcnRfdGltZSAvIEFWX1RJTUVfQkFTRTsKKyAgICAgICAgICAgIHVzICAgPSBhYnMoaWMtPnN0YXJ0X3RpbWUgJSBBVl9USU1FX0JBU0UpOworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJWQuJTA2ZCIsCisgICAgICAgICAgICAgICAgICAgc2VjcywgKGludCkgYXZfcmVzY2FsZSh1cywgMTAwMDAwMCwgQVZfVElNRV9CQVNFKSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiLCBiaXRyYXRlOiAiKTsKKyAgICAgICAgaWYgKGljLT5iaXRfcmF0ZSkKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiVkIGtiL3MiLCBpYy0+Yml0X3JhdGUgLyAxMDAwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiTi9BIik7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlxuIik7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9jaGFwdGVyczsgaSsrKSB7CisgICAgICAgIEFWQ2hhcHRlciAqY2ggPSBpYy0+Y2hhcHRlcnNbaV07CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiAgICBDaGFwdGVyICMlZDolZDogIiwgaW5kZXgsIGkpOworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAic3RhcnQgJWYsICIsIGNoLT5zdGFydCAqIGF2X3EyZChjaC0+dGltZV9iYXNlKSk7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICJlbmQgJWZcbiIsIGNoLT5lbmQgKiBhdl9xMmQoY2gtPnRpbWVfYmFzZSkpOworCisgICAgICAgIGR1bXBfbWV0YWRhdGEoTlVMTCwgY2gtPm1ldGFkYXRhLCAiICAgICIpOworICAgIH0KKworICAgIGlmIChpYy0+bmJfcHJvZ3JhbXMpIHsKKyAgICAgICAgaW50IGosIGssIHRvdGFsID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGljLT5uYl9wcm9ncmFtczsgaisrKSB7CisgICAgICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqbmFtZSA9IGF2X2RpY3RfZ2V0KGljLT5wcm9ncmFtc1tqXS0+bWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIiwgTlVMTCwgMCk7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgIFByb2dyYW0gJWQgJXNcbiIsIGljLT5wcm9ncmFtc1tqXS0+aWQsCisgICAgICAgICAgICAgICAgICAgbmFtZSA/IG5hbWUtPnZhbHVlIDogIiIpOworICAgICAgICAgICAgZHVtcF9tZXRhZGF0YShOVUxMLCBpYy0+cHJvZ3JhbXNbal0tPm1ldGFkYXRhLCAiICAgICIpOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGljLT5wcm9ncmFtc1tqXS0+bmJfc3RyZWFtX2luZGV4ZXM7IGsrKykgeworICAgICAgICAgICAgICAgIGR1bXBfc3RyZWFtX2Zvcm1hdChpYywgaWMtPnByb2dyYW1zW2pdLT5zdHJlYW1faW5kZXhba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBpc19vdXRwdXQpOworICAgICAgICAgICAgICAgIHByaW50ZWRbaWMtPnByb2dyYW1zW2pdLT5zdHJlYW1faW5kZXhba11dID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvdGFsICs9IGljLT5wcm9ncmFtc1tqXS0+bmJfc3RyZWFtX2luZGV4ZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvdGFsIDwgaWMtPm5iX3N0cmVhbXMpCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgIE5vIFByb2dyYW1cbiIpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBpYy0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICBpZiAoIXByaW50ZWRbaV0pCisgICAgICAgICAgICBkdW1wX3N0cmVhbV9mb3JtYXQoaWMsIGksIGluZGV4LCBpc19vdXRwdXQpOworCisgICAgYXZfZnJlZShwcmludGVkKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9kdi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2R2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1OTY2YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kdi5jCkBAIC0wLDAgKzEsNjM5IEBACisvKgorICogR2VuZXJhbCBEViBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUm9tYW4gU2hhcG9zaG5paworICoKKyAqIE1hbnkgdGhhbmtzIHRvIERhbiBEZW5uZWR5IDxkYW5AZGVubmVkeS5vcmc+IGZvciBwcm92aWRpbmcgd2VhbHRoCisgKiBvZiBEViB0ZWNobmljYWwgaW5mby4KKyAqCisgKiBSYXcgRFYgZm9ybWF0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogNTAgTWJwcyAoRFZDUFJPNTApIGFuZCAxMDAgTWJwcyAoRFZDUFJPIEhEKSBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGFuaWVsIE1hYXMgPGRtYWFzQG1hYXNkaWdpdGFsLmNvbT4KKyAqIEZ1bmRlZCBieSBCQkMgUmVzZWFyY2ggJiBEZXZlbG9wbWVudAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9kdl9wcm9maWxlLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9kdi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZWNvZGUuaCIKKyNpbmNsdWRlICJkdi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorCitzdHJ1Y3QgRFZEZW11eENvbnRleHQgeworICAgIGNvbnN0IEFWRFZQcm9maWxlKiAgc3lzOyAgICAvKiBDdXJyZW50IERWIHByb2ZpbGUuIEUuZy46IDUyNS82MCwgNjI1LzUwICovCisgICAgQVZGb3JtYXRDb250ZXh0KiAgZmN0eDsKKyAgICBBVlN0cmVhbSogICAgICAgICB2c3Q7CisgICAgQVZTdHJlYW0qICAgICAgICAgYXN0WzRdOworICAgIEFWUGFja2V0ICAgICAgICAgIGF1ZGlvX3BrdFs0XTsKKyAgICB1aW50OF90ICAgICAgICAgICBhdWRpb19idWZbNF1bODE5Ml07CisgICAgaW50ICAgICAgICAgICAgICAgYWNoOworICAgIGludCAgICAgICAgICAgICAgIGZyYW1lczsKKyAgICB1aW50NjRfdCAgICAgICAgICBhYnl0ZXM7Cit9OworCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGR2X2F1ZGlvXzEydG8xNih1aW50MTZfdCBzYW1wbGUpCit7CisgICAgdWludDE2X3Qgc2hpZnQsIHJlc3VsdDsKKworICAgIHNhbXBsZSA9IChzYW1wbGUgPCAweDgwMCkgPyBzYW1wbGUgOiBzYW1wbGUgfCAweGYwMDA7CisgICAgc2hpZnQgID0gKHNhbXBsZSAmIDB4ZjAwKSA+PiA4OworCisgICAgaWYgKHNoaWZ0IDwgMHgyIHx8IHNoaWZ0ID4gMHhkKSB7CisgICAgICAgIHJlc3VsdCA9IHNhbXBsZTsKKyAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgMHg4KSB7CisgICAgICAgIHNoaWZ0LS07CisgICAgICAgIHJlc3VsdCA9IChzYW1wbGUgLSAoMjU2ICogc2hpZnQpKSA8PCBzaGlmdDsKKyAgICB9IGVsc2UgeworICAgICAgICBzaGlmdCAgPSAweGUgLSBzaGlmdDsKKyAgICAgICAgcmVzdWx0ID0gKChzYW1wbGUgKyAoKDI1NiAqIHNoaWZ0KSArIDEpKSA8PCBzaGlmdCkgLSAxOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90ICpkdl9leHRyYWN0X3BhY2soY29uc3QgdWludDhfdCAqZnJhbWUsIGVudW0gZHZfcGFja190eXBlIHQpCit7CisgICAgaW50IG9mZnM7CisgICAgaW50IGM7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgMTA7IGMrKykgeworICAgICAgICBzd2l0Y2ggKHQpIHsKKyAgICAgICAgY2FzZSBkdl9hdWRpb19zb3VyY2U6CisgICAgICAgICAgICBpZiAoYyYxKSAgICBvZmZzID0gKDgwICogNiArIDgwICogMTYgKiAwICsgMyArIGMqMTIwMDApOworICAgICAgICAgICAgZWxzZSAgICAgICAgb2ZmcyA9ICg4MCAqIDYgKyA4MCAqIDE2ICogMyArIDMgKyBjKjEyMDAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGR2X2F1ZGlvX2NvbnRyb2w6CisgICAgICAgICAgICBpZiAoYyYxKSAgICBvZmZzID0gKDgwICogNiArIDgwICogMTYgKiAxICsgMyArIGMqMTIwMDApOworICAgICAgICAgICAgZWxzZSAgICAgICAgb2ZmcyA9ICg4MCAqIDYgKyA4MCAqIDE2ICogNCArIDMgKyBjKjEyMDAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGR2X3ZpZGVvX2NvbnRyb2w6CisgICAgICAgICAgICBpZiAoYyYxKSAgICBvZmZzID0gKDgwICogMyArIDggICAgICArIGMqMTIwMDApOworICAgICAgICAgICAgZWxzZSAgICAgICAgb2ZmcyA9ICg4MCAqIDUgKyA0OCArIDUgKyBjKjEyMDAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGR2X3RpbWVjb2RlOgorICAgICAgICAgICAgb2ZmcyA9ICg4MCoxICsgMyArIDMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJhbWVbb2Zmc10gPT0gdCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmcmFtZVtvZmZzXSA9PSB0ID8gJmZyYW1lW29mZnNdIDogTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGludCBkdl9hdWRpb19mcmVxdWVuY3lbM10gPSB7CisgICAgNDgwMDAsIDQ0MTAwLCAzMjAwMCwKK307CisKKy8qCisgKiBUaGVyZSdzIGEgY291cGxlIG9mIGFzc3VtcHRpb25zIGJlaW5nIG1hZGUgaGVyZToKKyAqIDEuIEJ5IGRlZmF1bHQgd2Ugc2lsZW5jZSBlcnJvbmVvdXMgKDB4ODAwMC8xNmJpdCAweDgwMC8xMmJpdCkgYXVkaW8gc2FtcGxlcy4KKyAqICAgIFdlIGNhbiBwYXNzIHRoZW0gdXB3YXJkcyB3aGVuIGxpYmF2Y29kZWMgd2lsbCBiZSByZWFkeSB0byBkZWFsIHdpdGggdGhlbS4KKyAqIDIuIFdlIGRvbid0IGRvIHNvZnR3YXJlIGVtcGhhc2lzLgorICogMy4gQXVkaW8gaXMgYWx3YXlzIHJldHVybmVkIGFzIDE2Yml0IGxpbmVhciBzYW1wbGVzOiAxMmJpdCBub25saW5lYXIgc2FtcGxlcworICogICAgYXJlIGNvbnZlcnRlZCBpbnRvIDE2Yml0IGxpbmVhciBvbmVzLgorICovCitzdGF0aWMgaW50IGR2X2V4dHJhY3RfYXVkaW8oY29uc3QgdWludDhfdCAqZnJhbWUsIHVpbnQ4X3QgKipwcGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRFZQcm9maWxlICpzeXMpCit7CisgICAgaW50IHNpemUsIGNoYW4sIGksIGosIGQsIG9mLCBzbXBscywgZnJlcSwgcXVhbnQsIGhhbGZfY2g7CisgICAgdWludDE2X3QgbGMsIHJjOworICAgIGNvbnN0IHVpbnQ4X3QgKmFzX3BhY2s7CisgICAgdWludDhfdCAqcGNtLCBpcGNtOworCisgICAgYXNfcGFjayA9IGR2X2V4dHJhY3RfcGFjayhmcmFtZSwgZHZfYXVkaW9fc291cmNlKTsKKyAgICBpZiAoIWFzX3BhY2spICAgIC8qIE5vIGF1ZGlvID8gKi8KKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzbXBscyA9IGFzX3BhY2tbMV0gICAgICAmIDB4M2Y7IC8qIHNhbXBsZXMgaW4gdGhpcyBmcmFtZSAtIG1pbi4gc2FtcGxlcyAqLworICAgIGZyZXEgID0gYXNfcGFja1s0XSA+PiAzICYgMHgwNzsgLyogMCAtIDQ4a0h6LCAxIC0gNDQsMWtIeiwgMiAtIDMya0h6ICovCisgICAgcXVhbnQgPSBhc19wYWNrWzRdICAgICAgJiAweDA3OyAvKiAwIC0gMTZiaXQgbGluZWFyLCAxIC0gMTJiaXQgbm9ubGluZWFyICovCisKKyAgICBpZiAocXVhbnQgPiAxKQorICAgICAgICByZXR1cm4gLTE7ICAvKiB1bnN1cHBvcnRlZCBxdWFudGl6YXRpb24gKi8KKworICAgIGlmIChmcmVxID49IEZGX0FSUkFZX0VMRU1TKGR2X2F1ZGlvX2ZyZXF1ZW5jeSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc2l6ZSAgICA9IChzeXMtPmF1ZGlvX21pbl9zYW1wbGVzW2ZyZXFdICsgc21wbHMpICogNDsgLyogMmNoLCAyYnl0ZXMgKi8KKyAgICBoYWxmX2NoID0gc3lzLT5kaWZzZWdfc2l6ZSAvIDI7CisKKyAgICAvKiBXZSB3b3JrIHdpdGggNzIwcCBmcmFtZXMgc3BsaXQgaW4gaGFsZiwgdGh1cyBldmVuIGZyYW1lcyBoYXZlCisgICAgICogY2hhbm5lbHMgMCwxIGFuZCBvZGQgMiwzLiAqLworICAgIGlwY20gPSAoc3lzLT5oZWlnaHQgPT0gNzIwICYmICEoZnJhbWVbMV0gJiAweDBDKSkgPyAyIDogMDsKKworICAgIGlmIChpcGNtICsgc3lzLT5uX2RpZmNoYW4gPiAocXVhbnQgPT0gMSA/IDIgOiA0KSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAidG9vIG1hbnkgZHYgcGNtIGZyYW1lc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIGZvciBlYWNoIERJRiBjaGFubmVsICovCisgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IHN5cy0+bl9kaWZjaGFuOyBjaGFuKyspIHsKKyAgICAgICAgYXZfYXNzZXJ0MChpcGNtPDQpOworICAgICAgICBwY20gPSBwcGNtW2lwY20rK107CisgICAgICAgIGlmICghcGNtKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogZm9yIGVhY2ggRElGIHNlZ21lbnQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHN5cy0+ZGlmc2VnX3NpemU7IGkrKykgeworICAgICAgICAgICAgZnJhbWUgKz0gNiAqIDgwOyAvKiBza2lwIERJRiBzZWdtZW50IGhlYWRlciAqLworICAgICAgICAgICAgaWYgKHF1YW50ID09IDEgJiYgaSA9PSBoYWxmX2NoKSB7CisgICAgICAgICAgICAgICAgLyogbmV4dCBzdGVyZW8gY2hhbm5lbCAoMTJiaXQgbW9kZSBvbmx5KSAqLworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoaXBjbTw0KTsKKyAgICAgICAgICAgICAgICBwY20gPSBwcGNtW2lwY20rK107CisgICAgICAgICAgICAgICAgaWYgKCFwY20pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBmb3IgZWFjaCBBViBzZXF1ZW5jZSAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDk7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoZCA9IDg7IGQgPCA4MDsgZCArPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChxdWFudCA9PSAwKSB7ICAvKiAxNmJpdCBxdWFudGl6YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG9mID0gc3lzLT5hdWRpb19zaHVmZmxlW2ldW2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGQgLSA4KSAvIDIgKiBzeXMtPmF1ZGlvX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZiAqIDIgPj0gc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IG1heWJlIHdlIGhhdmUgdG8gYWRtaXQgdGhhdCBEViBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBiaWctZW5kaWFuIFBDTSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcGNtW29mICogMl0gICAgID0gZnJhbWVbZCArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgcGNtW29mICogMiArIDFdID0gZnJhbWVbZF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwY21bb2YgKiAyICsgMV0gPT0gMHg4MCAmJiBwY21bb2YgKiAyXSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbVtvZiAqIDIgKyAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAvKiAxMmJpdCBxdWFudGl6YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxjID0gKCh1aW50MTZfdClmcmFtZVtkXSAgICAgPDwgNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KWZyYW1lW2QgKyAyXSA+PiA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gKCh1aW50MTZfdClmcmFtZVtkICsgMV0gPDwgNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KWZyYW1lW2QgKyAyXSAmIDB4MGYpOworICAgICAgICAgICAgICAgICAgICAgICAgbGMgPSAobGMgPT0gMHg4MDAgPyAwIDogZHZfYXVkaW9fMTJ0bzE2KGxjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IChyYyA9PSAweDgwMCA/IDAgOiBkdl9hdWRpb18xMnRvMTYocmMpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb2YgPSBzeXMtPmF1ZGlvX3NodWZmbGVbaSAlIGhhbGZfY2hdW2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGQgLSA4KSAvIDMgKiBzeXMtPmF1ZGlvX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZiAqIDIgPj0gc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IG1heWJlIHdlIGhhdmUgdG8gYWRtaXQgdGhhdCBEViBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBiaWctZW5kaWFuIFBDTSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcGNtW29mICogMl0gICAgID0gbGMgJiAweGZmOworICAgICAgICAgICAgICAgICAgICAgICAgcGNtW29mICogMiArIDFdID0gbGMgPj4gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mID0gc3lzLT5hdWRpb19zaHVmZmxlW2kgJSBoYWxmX2NoICsgaGFsZl9jaF1bal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZCAtIDgpIC8gMyAqIHN5cy0+YXVkaW9fc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IG1heWJlIHdlIGhhdmUgdG8gYWRtaXQgdGhhdCBEViBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBiaWctZW5kaWFuIFBDTSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcGNtW29mICogMl0gICAgID0gcmMgJiAweGZmOworICAgICAgICAgICAgICAgICAgICAgICAgcGNtW29mICogMiArIDFdID0gcmMgPj4gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZyYW1lICs9IDE2ICogODA7IC8qIDE1IFZpZGVvIERJRnMgKyAxIEF1ZGlvIERJRiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgZHZfZXh0cmFjdF9hdWRpb19pbmZvKERWRGVtdXhDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpmcmFtZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICphc19wYWNrOworICAgIGludCBmcmVxLCBzdHlwZSwgc21wbHMsIHF1YW50LCBpLCBhY2g7CisKKyAgICBhc19wYWNrID0gZHZfZXh0cmFjdF9wYWNrKGZyYW1lLCBkdl9hdWRpb19zb3VyY2UpOworICAgIGlmICghYXNfcGFjayB8fCAhYy0+c3lzKSB7ICAgIC8qIE5vIGF1ZGlvID8gKi8KKyAgICAgICAgYy0+YWNoID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc21wbHMgPSBhc19wYWNrWzFdICAgICAgJiAweDNmOyAvKiBzYW1wbGVzIGluIHRoaXMgZnJhbWUgLSBtaW4uIHNhbXBsZXMgKi8KKyAgICBmcmVxICA9IGFzX3BhY2tbNF0gPj4gMyAmIDB4MDc7IC8qIDAgLSA0OGtIeiwgMSAtIDQ0LDFrSHosIDIgLSAzMmtIeiAqLworICAgIHN0eXBlID0gYXNfcGFja1szXSAgICAgICYgMHgxZjsgLyogMCAtIDJDSCwgMiAtIDRDSCwgMyAtIDhDSCAqLworICAgIHF1YW50ID0gYXNfcGFja1s0XSAgICAgICYgMHgwNzsgLyogMCAtIDE2Yml0IGxpbmVhciwgMSAtIDEyYml0IG5vbmxpbmVhciAqLworCisgICAgaWYgKGZyZXEgPj0gRkZfQVJSQVlfRUxFTVMoZHZfYXVkaW9fZnJlcXVlbmN5KSkgeworICAgICAgICBhdl9sb2coYy0+ZmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBhdWRpbyBzYW1wbGUgcmF0ZSBpbmRleCAoJWQpXG4iLCBmcmVxKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHN0eXBlID4gMykgeworICAgICAgICBhdl9sb2coYy0+ZmN0eCwgQVZfTE9HX0VSUk9SLCAic3R5cGUgJWQgaXMgaW52YWxpZFxuIiwgc3R5cGUpOworICAgICAgICBjLT5hY2ggPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBub3RlOiBhY2ggY291bnRzIFBBSVJTIG9mIGNoYW5uZWxzIChpLmUuIHN0ZXJlbyBjaGFubmVscykgKi8KKyAgICBhY2ggPSAoKGludFs0XSkgeyAxLCAwLCAyLCA0IH0pW3N0eXBlXTsKKyAgICBpZiAoYWNoID09IDEgJiYgcXVhbnQgJiYgZnJlcSA9PSAyKQorICAgICAgICBhY2ggPSAyOworCisgICAgLyogRHluYW1pYyBoYW5kbGluZyBvZiB0aGUgYXVkaW8gc3RyZWFtcyBpbiBEViAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhY2g7IGkrKykgeworICAgICAgICBpZiAoIWMtPmFzdFtpXSkgeworICAgICAgICAgICAgYy0+YXN0W2ldID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjLT5mY3R4LCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghYy0+YXN0W2ldKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhjLT5hc3RbaV0sIDY0LCAxLCAzMDAwMCk7CisgICAgICAgICAgICBjLT5hc3RbaV0tPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgYy0+YXN0W2ldLT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKworICAgICAgICAgICAgYXZfaW5pdF9wYWNrZXQoJmMtPmF1ZGlvX3BrdFtpXSk7CisgICAgICAgICAgICBjLT5hdWRpb19wa3RbaV0uc2l6ZSAgICAgICAgID0gMDsKKyAgICAgICAgICAgIGMtPmF1ZGlvX3BrdFtpXS5kYXRhICAgICAgICAgPSBjLT5hdWRpb19idWZbaV07CisgICAgICAgICAgICBjLT5hdWRpb19wa3RbaV0uc3RyZWFtX2luZGV4ID0gYy0+YXN0W2ldLT5pbmRleDsKKyAgICAgICAgICAgIGMtPmF1ZGlvX3BrdFtpXS5mbGFncyAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgICAgIH0KKyAgICAgICAgYy0+YXN0W2ldLT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgPSBkdl9hdWRpb19mcmVxdWVuY3lbZnJlcV07CisgICAgICAgIGMtPmFzdFtpXS0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgYy0+YXN0W2ldLT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICBjLT5hc3RbaV0tPmNvZGVjLT5iaXRfcmF0ZSAgICAgICA9IDIgKiBkdl9hdWRpb19mcmVxdWVuY3lbZnJlcV0gKiAxNjsKKyAgICAgICAgYy0+YXN0W2ldLT5zdGFydF90aW1lICAgICAgICAgICAgPSAwOworICAgIH0KKyAgICBjLT5hY2ggPSBpOworCisgICAgcmV0dXJuIChjLT5zeXMtPmF1ZGlvX21pbl9zYW1wbGVzW2ZyZXFdICsgc21wbHMpICogNDsgLyogMmNoLCAyYnl0ZXMgKi8KK30KKworc3RhdGljIGludCBkdl9leHRyYWN0X3ZpZGVvX2luZm8oRFZEZW11eENvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKmZyYW1lKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnZzY19wYWNrOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBpbnQgYXB0LCBpczE2Xzk7CisgICAgaW50IHNpemUgPSAwOworCisgICAgaWYgKGMtPnN5cykgeworICAgICAgICBhdmN0eCA9IGMtPnZzdC0+Y29kZWM7CisKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhjLT52c3QsIDY0LCBjLT5zeXMtPnRpbWVfYmFzZS5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c3lzLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgYy0+dnN0LT5hdmdfZnJhbWVfcmF0ZSA9IGF2X2ludl9xKGMtPnZzdC0+dGltZV9iYXNlKTsKKworICAgICAgICAvKiBmaW5kaW5nIG91dCBTQVIgaXMgYSBsaXR0bGUgYml0IG1lc3N5ICovCisgICAgICAgIHZzY19wYWNrID0gZHZfZXh0cmFjdF9wYWNrKGZyYW1lLCBkdl92aWRlb19jb250cm9sKTsKKyAgICAgICAgYXB0ICAgICAgPSBmcmFtZVs0XSAmIDB4MDc7CisgICAgICAgIGlzMTZfOSAgID0gKHZzY19wYWNrICYmICgodnNjX3BhY2tbMl0gJiAweDA3KSA9PSAweDAyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWFwdCAmJiAodnNjX3BhY2tbMl0gJiAweDA3KSA9PSAweDA3KSkpOworICAgICAgICBjLT52c3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBjLT5zeXMtPnNhcltpczE2XzldOworICAgICAgICBhdmN0eC0+Yml0X3JhdGUgPSBhdl9yZXNjYWxlX3EoYy0+c3lzLT5mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgOCwgMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c3lzLT50aW1lX2Jhc2UpOworICAgICAgICBzaXplID0gYy0+c3lzLT5mcmFtZV9zaXplOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBkdl9leHRyYWN0X3RpbWVjb2RlKERWRGVtdXhDb250ZXh0KiBjLCBjb25zdCB1aW50OF90KiBmcmFtZSwgY2hhciAqdGMpCit7CisgICAgY29uc3QgdWludDhfdCAqdGNfcGFjazsKKworICAgIC8vIEZvciBQQUwgc3lzdGVtcywgZHJvcCBmcmFtZSBiaXQgaXMgcmVwbGFjZWQgYnkgYW4gYXJiaXRyYXJ5CisgICAgLy8gYml0IHNvIGl0cyB2YWx1ZSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQuIERyb3AgZnJhbWUgdGltZWNvZGUKKyAgICAvLyBpcyBvbmx5IHJlbGV2YW50IGZvciBOVFNDIHN5c3RlbXMuCisgICAgaW50IHByZXZlbnRfZGYgPSBjLT5zeXMtPmx0Y19kaXZpc29yID09IDI1IHx8IGMtPnN5cy0+bHRjX2Rpdmlzb3IgPT0gNTA7CisKKyAgICB0Y19wYWNrID0gZHZfZXh0cmFjdF9wYWNrKGZyYW1lLCBkdl90aW1lY29kZSk7CisgICAgaWYgKCF0Y19wYWNrKQorICAgICAgICByZXR1cm4gMDsKKyAgICBhdl90aW1lY29kZV9tYWtlX3NtcHRlX3RjX3N0cmluZyh0YywgQVZfUkIzMih0Y19wYWNrICsgMSksIHByZXZlbnRfZGYpOworICAgIHJldHVybiAxOworfQorCisvKiBUaGUgZm9sbG93aW5nIDMgZnVuY3Rpb25zIGNvbnN0aXR1dGUgb3VyIGludGVyZmFjZSB0byB0aGUgd29ybGQgKi8KKworRFZEZW11eENvbnRleHQgKmF2cHJpdl9kdl9pbml0X2RlbXV4KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBEVkRlbXV4Q29udGV4dCAqYzsKKworICAgIGMgPSBhdl9tYWxsb2N6KHNpemVvZihEVkRlbXV4Q29udGV4dCkpOworICAgIGlmICghYykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjLT52c3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghYy0+dnN0KSB7CisgICAgICAgIGF2X2ZyZWUoYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGMtPmZjdHggICAgICAgICAgICAgICAgICAgPSBzOworICAgIGMtPnZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgYy0+dnN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0RWVklERU87CisgICAgYy0+dnN0LT5jb2RlYy0+Yml0X3JhdGUgICA9IDI1MDAwMDAwOworICAgIGMtPnZzdC0+c3RhcnRfdGltZSAgICAgICAgPSAwOworCisgICAgcmV0dXJuIGM7Cit9CisKK2ludCBhdnByaXZfZHZfZ2V0X3BhY2tldChEVkRlbXV4Q29udGV4dCAqYywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgc2l6ZSA9IC0xOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGMtPmFjaDsgaSsrKSB7CisgICAgICAgIGlmIChjLT5hc3RbaV0gJiYgYy0+YXVkaW9fcGt0W2ldLnNpemUpIHsKKyAgICAgICAgICAgICpwa3QgICAgICAgICAgICAgICAgID0gYy0+YXVkaW9fcGt0W2ldOworICAgICAgICAgICAgYy0+YXVkaW9fcGt0W2ldLnNpemUgPSAwOworICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgICAgICAgPSBwa3QtPnNpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzaXplOworfQorCitpbnQgYXZwcml2X2R2X3Byb2R1Y2VfcGFja2V0KERWRGVtdXhDb250ZXh0ICpjLCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50NjRfdCBwb3MpCit7CisgICAgaW50IHNpemUsIGk7CisgICAgdWludDhfdCAqcHBjbVs1XSA9IHsgMCB9OworCisgICAgaWYgKGJ1Zl9zaXplIDwgRFZfUFJPRklMRV9CWVRFUyB8fAorICAgICAgICAhKGMtPnN5cyA9IGF2X2R2X2ZyYW1lX3Byb2ZpbGUoYy0+c3lzLCBidWYsIGJ1Zl9zaXplKSkgfHwKKyAgICAgICAgYnVmX3NpemUgPCBjLT5zeXMtPmZyYW1lX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIC0xOyAgIC8qIEJyb2tlbiBmcmFtZSwgb3Igbm90IGVub3VnaCBkYXRhICovCisgICAgfQorCisgICAgLyogUXVldWVpbmcgYXVkaW8gcGFja2V0ICovCisgICAgLyogRklYTUU6IGluIGNhc2Ugb2Ygbm8gYXVkaW8vYmFkIGF1ZGlvIHdlIGhhdmUgdG8gZG8gc29tZXRoaW5nICovCisgICAgc2l6ZSA9IGR2X2V4dHJhY3RfYXVkaW9faW5mbyhjLCBidWYpOworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5hY2g7IGkrKykgeworICAgICAgICBjLT5hdWRpb19wa3RbaV0ucG9zICA9IHBvczsKKyAgICAgICAgYy0+YXVkaW9fcGt0W2ldLnNpemUgPSBzaXplOworICAgICAgICBjLT5hdWRpb19wa3RbaV0ucHRzICA9IGMtPmFieXRlcyAqIDMwMDAwICogOCAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXN0W2ldLT5jb2RlYy0+Yml0X3JhdGU7CisgICAgICAgIHBwY21baV0gPSBjLT5hdWRpb19idWZbaV07CisgICAgfQorICAgIGlmIChjLT5hY2gpCisgICAgICAgIGR2X2V4dHJhY3RfYXVkaW8oYnVmLCBwcGNtLCBjLT5zeXMpOworCisgICAgLyogV2Ugd29yayB3aXRoIDcyMHAgZnJhbWVzIHNwbGl0IGluIGhhbGYsIHRodXMgZXZlbiBmcmFtZXMgaGF2ZQorICAgICAqIGNoYW5uZWxzIDAsMSBhbmQgb2RkIDIsMy4gKi8KKyAgICBpZiAoYy0+c3lzLT5oZWlnaHQgPT0gNzIwKSB7CisgICAgICAgIGlmIChidWZbMV0gJiAweDBDKSB7CisgICAgICAgICAgICBjLT5hdWRpb19wa3RbMl0uc2l6ZSA9IGMtPmF1ZGlvX3BrdFszXS5zaXplID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGMtPmF1ZGlvX3BrdFswXS5zaXplID0gYy0+YXVkaW9fcGt0WzFdLnNpemUgPSAwOworICAgICAgICAgICAgYy0+YWJ5dGVzICAgICAgICAgICArPSBzaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+YWJ5dGVzICs9IHNpemU7CisgICAgfQorCisgICAgLyogTm93IGl0J3MgdGltZSB0byByZXR1cm4gdmlkZW8gcGFja2V0ICovCisgICAgc2l6ZSA9IGR2X2V4dHJhY3RfdmlkZW9faW5mbyhjLCBidWYpOworICAgIGF2X2luaXRfcGFja2V0KHBrdCk7CisgICAgcGt0LT5kYXRhICAgICAgICAgPSBidWY7CisgICAgcGt0LT5wb3MgICAgICAgICAgPSBwb3M7CisgICAgcGt0LT5zaXplICAgICAgICAgPSBzaXplOworICAgIHBrdC0+ZmxhZ3MgICAgICAgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gYy0+dnN0LT5pbmRleDsKKyAgICBwa3QtPnB0cyAgICAgICAgICA9IGMtPmZyYW1lczsKKworICAgIGMtPmZyYW1lcysrOworCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGR2X2ZyYW1lX29mZnNldChBVkZvcm1hdENvbnRleHQgKnMsIERWRGVtdXhDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgLy8gRklYTUU6IHN5cyBtYXkgYmUgd3JvbmcgaWYgbGFzdCBkdl9yZWFkX3BhY2tldCgpIGZhaWxlZCAoYnVmZmVyIGlzIGp1bmspCisgICAgY29uc3QgQVZEVlByb2ZpbGUgKnN5cyA9IGF2X2R2X2NvZGVjX3Byb2ZpbGUoYy0+dnN0LT5jb2RlYy0+d2lkdGgsIGMtPnZzdC0+Y29kZWMtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT52c3QtPmNvZGVjLT5waXhfZm10KTsKKyAgICBpbnQ2NF90IG9mZnNldDsKKyAgICBpbnQ2NF90IHNpemUgICAgICAgPSBhdmlvX3NpemUocy0+cGIpIC0gcy0+ZGF0YV9vZmZzZXQ7CisgICAgaW50NjRfdCBtYXhfb2Zmc2V0ID0gKChzaXplIC0gMSkgLyBzeXMtPmZyYW1lX3NpemUpICogc3lzLT5mcmFtZV9zaXplOworCisgICAgb2Zmc2V0ID0gc3lzLT5mcmFtZV9zaXplICogdGltZXN0YW1wOworCisgICAgaWYgKHNpemUgPj0gMCAmJiBvZmZzZXQgPiBtYXhfb2Zmc2V0KQorICAgICAgICBvZmZzZXQgPSBtYXhfb2Zmc2V0OworICAgIGVsc2UgaWYgKG9mZnNldCA8IDApCisgICAgICAgIG9mZnNldCA9IDA7CisKKyAgICByZXR1cm4gb2Zmc2V0ICsgcy0+ZGF0YV9vZmZzZXQ7Cit9CisKK3ZvaWQgZmZfZHZfb2Zmc2V0X3Jlc2V0KERWRGVtdXhDb250ZXh0ICpjLCBpbnQ2NF90IGZyYW1lX29mZnNldCkKK3sKKyAgICBjLT5mcmFtZXMgPSBmcmFtZV9vZmZzZXQ7CisgICAgaWYgKGMtPmFjaCkgeworICAgICAgICBpZiAoYy0+c3lzKSB7CisgICAgICAgIGMtPmFieXRlcyA9IGF2X3Jlc2NhbGVfcShjLT5mcmFtZXMsIGMtPnN5cy0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgOCwgYy0+YXN0WzBdLT5jb2RlYy0+Yml0X3JhdGUgfSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYXZfbG9nKGMtPmZjdHgsIEFWX0xPR19FUlJPUiwgImNhbm5vdCBhZGp1c3QgYXVkaW8gYnl0ZXNcbiIpOworICAgIH0KKyAgICBjLT5hdWRpb19wa3RbMF0uc2l6ZSA9IGMtPmF1ZGlvX3BrdFsxXS5zaXplID0gMDsKKyAgICBjLT5hdWRpb19wa3RbMl0uc2l6ZSA9IGMtPmF1ZGlvX3BrdFszXS5zaXplID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGVhc2llc3QgRFYgc3RvcmFnZSBvZiBhbGwgLS0gcmF3IERWLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgUmF3RFZDb250ZXh0IHsKKyAgICBEVkRlbXV4Q29udGV4dCAqZHZfZGVtdXg7CisgICAgdWludDhfdCAgICAgICAgIGJ1ZltEVl9NQVhfRlJBTUVfU0laRV07Cit9IFJhd0RWQ29udGV4dDsKKworc3RhdGljIGludCBkdl9yZWFkX3RpbWVjb2RlKEFWRm9ybWF0Q29udGV4dCAqcykgeworICAgIGludCByZXQ7CisgICAgY2hhciB0aW1lY29kZVtBVl9USU1FQ09ERV9TVFJfU0laRV07CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworCisgICAgLy8gUmVhZCAzIERJRiBibG9ja3M6IEhlYWRlciBibG9jayBhbmQgMiBTdWJjb2RlIGJsb2Nrcy4KKyAgICBpbnQgcGFydGlhbF9mcmFtZV9zaXplID0gMyAqIDgwOworICAgIHVpbnQ4X3QgKnBhcnRpYWxfZnJhbWUgPSBhdl9tYWxsb2N6KHNpemVvZigqcGFydGlhbF9mcmFtZSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxfZnJhbWVfc2l6ZSk7CisKKyAgICBSYXdEVkNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0ID0gYXZpb19yZWFkKHMtPnBiLCBwYXJ0aWFsX2ZyYW1lLCBwYXJ0aWFsX2ZyYW1lX3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZpbmlzaDsKKworICAgIGlmIChyZXQgPCBwYXJ0aWFsX2ZyYW1lX3NpemUpIHsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAgIHJldCA9IGR2X2V4dHJhY3RfdGltZWNvZGUoYy0+ZHZfZGVtdXgsIHBhcnRpYWxfZnJhbWUsIHRpbWVjb2RlKTsKKyAgICBpZiAocmV0KQorICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJ0aW1lY29kZSIsIHRpbWVjb2RlLCAwKTsKKyAgICBlbHNlCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJEZXRlY3RlZCB0aW1lY29kZSBpcyBpbnZhbGlkXG4iKTsKKworZmluaXNoOgorICAgIGF2X2ZyZWUocGFydGlhbF9mcmFtZSk7CisgICAgYXZpb19zZWVrKHMtPnBiLCBwb3MsIFNFRUtfU0VUKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGR2X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICB1bnNpZ25lZCBzdGF0ZSwgbWFya2VyX3BvcyA9IDA7CisgICAgUmF3RFZDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworCisgICAgYy0+ZHZfZGVtdXggPSBhdnByaXZfZHZfaW5pdF9kZW11eChzKTsKKyAgICBpZiAoIWMtPmR2X2RlbXV4KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzdGF0ZSA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgd2hpbGUgKChzdGF0ZSAmIDB4ZmZmZmZmN2YpICE9IDB4MWYwNzAwM2YpIHsKKyAgICAgICAgaWYgKGF2aW9fZmVvZihzLT5wYikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgZmluZCBEViBoZWFkZXIuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUgPT0gMHgwMDNmMDcwMCB8fCBzdGF0ZSA9PSAweGZmM2YwNzAwKQorICAgICAgICAgICAgbWFya2VyX3BvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgIGlmIChzdGF0ZSA9PSAweGZmM2YwNzAxICYmIGF2aW9fdGVsbChzLT5wYikgLSBtYXJrZXJfcG9zID09IDgwKSB7CisgICAgICAgICAgICBhdmlvX3NlZWsocy0+cGIsIC0xNjMsIFNFRUtfQ1VSKTsKKyAgICAgICAgICAgIHN0YXRlID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgYXZpb19yOChzLT5wYik7CisgICAgfQorICAgIEFWX1dCMzIoYy0+YnVmLCBzdGF0ZSk7CisKKyAgICBpZiAoYXZpb19yZWFkKHMtPnBiLCBjLT5idWYgKyA0LCBEVl9QUk9GSUxFX0JZVEVTIC0gNCkgIT0gRFZfUFJPRklMRV9CWVRFUyAtIDQgfHwKKyAgICAgICAgYXZpb19zZWVrKHMtPnBiLCAtRFZfUFJPRklMRV9CWVRFUywgU0VFS19DVVIpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIGMtPmR2X2RlbXV4LT5zeXMgPSBhdl9kdl9mcmFtZV9wcm9maWxlKGMtPmR2X2RlbXV4LT5zeXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERWX1BST0ZJTEVfQllURVMpOworICAgIGlmICghYy0+ZHZfZGVtdXgtPnN5cykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNhbid0IGRldGVybWluZSBwcm9maWxlIG9mIERWIGlucHV0IHN0cmVhbS5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcy0+Yml0X3JhdGUgPSBhdl9yZXNjYWxlX3EoYy0+ZHZfZGVtdXgtPnN5cy0+ZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCkgeyA4LCAxIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZHZfZGVtdXgtPnN5cy0+dGltZV9iYXNlKTsKKworICAgIGlmIChzLT5wYi0+c2Vla2FibGUpCisgICAgICAgIGR2X3JlYWRfdGltZWNvZGUocyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHNpemU7CisgICAgUmF3RFZDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworCisgICAgc2l6ZSA9IGF2cHJpdl9kdl9nZXRfcGFja2V0KGMtPmR2X2RlbXV4LCBwa3QpOworCisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICAgICAgaWYgKCFjLT5kdl9kZW11eC0+c3lzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgc2l6ZSA9IGMtPmR2X2RlbXV4LT5zeXMtPmZyYW1lX3NpemU7CisgICAgICAgIGlmIChhdmlvX3JlYWQocy0+cGIsIGMtPmJ1Ziwgc2l6ZSkgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAgICAgc2l6ZSA9IGF2cHJpdl9kdl9wcm9kdWNlX3BhY2tldChjLT5kdl9kZW11eCwgcGt0LCBjLT5idWYsIHNpemUsIHBvcyk7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgZHZfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgUmF3RFZDb250ZXh0ICpyICAgPSBzLT5wcml2X2RhdGE7CisgICAgRFZEZW11eENvbnRleHQgKmMgPSByLT5kdl9kZW11eDsKKyAgICBpbnQ2NF90IG9mZnNldCAgICA9IGR2X2ZyYW1lX29mZnNldChzLCBjLCB0aW1lc3RhbXAsIGZsYWdzKTsKKworICAgIGlmIChhdmlvX3NlZWsocy0+cGIsIG9mZnNldCwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZmZfZHZfb2Zmc2V0X3Jlc2V0KGMsIG9mZnNldCAvIGMtPnN5cy0+ZnJhbWVfc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHZfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUmF3RFZDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGF2X2ZyZWUoYy0+ZHZfZGVtdXgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIHVuc2lnbmVkIG1hcmtlcl9wb3MgPSAwOworICAgIGludCBpOworICAgIGludCBtYXRjaGVzICAgICAgICAgICA9IDA7CisgICAgaW50IGZpcnN0bWF0Y2ggICAgICAgID0gMDsKKyAgICBpbnQgc2Vjb25kYXJ5X21hdGNoZXMgPSAwOworCisgICAgaWYgKHAtPmJ1Zl9zaXplIDwgNSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+YnVmX3NpemUtNDsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIHN0YXRlID0gQVZfUkIzMihwLT5idWYraSk7CisgICAgICAgIGlmICgoc3RhdGUgJiAweDAwMDdmODQwKSA9PSAweDAwMDcwMDAwKSB7CisgICAgICAgICAgICAvLyBhbnkgc2VjdGlvbiBoZWFkZXIsIGFsc28gd2l0aCBzZXEvY2hhbiBudW0gIT0gMCwKKyAgICAgICAgICAgIC8vIHNob3VsZCBhcHBlYXIgYXJvdW5kIGV2ZXJ5IDEyMDAwIGJ5dGVzLCBhdCBsZWFzdCAxMCBwZXIgZnJhbWUKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiAweGZmMDdmZjdmKSA9PSAweDFmMDcwMDNmKSB7CisgICAgICAgICAgICAgICAgc2Vjb25kYXJ5X21hdGNoZXMrKzsKKyAgICAgICAgICAgICAgICBpZiAoKHN0YXRlICYgMHhmZmZmZmY3ZikgPT0gMHgxZjA3MDAzZikgeworICAgICAgICAgICAgICAgICAgICBtYXRjaGVzKys7CisgICAgICAgICAgICAgICAgICAgIGlmICghaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0bWF0Y2ggPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAweDAwM2YwNzAwIHx8IHN0YXRlID09IDB4ZmYzZjA3MDApCisgICAgICAgICAgICAgICAgbWFya2VyX3BvcyA9IGk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gMHhmZjNmMDcwMSAmJiBpIC0gbWFya2VyX3BvcyA9PSA4MCkKKyAgICAgICAgICAgICAgICBtYXRjaGVzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWF0Y2hlcyAmJiBwLT5idWZfc2l6ZSAvIG1hdGNoZXMgPCAxMDI0ICogMTAyNCkgeworICAgICAgICBpZiAobWF0Y2hlcyA+IDQgfHwgZmlyc3RtYXRjaCB8fAorICAgICAgICAgICAgKHNlY29uZGFyeV9tYXRjaGVzID49IDEwICYmCisgICAgICAgICAgICAgcC0+YnVmX3NpemUgLyBzZWNvbmRhcnlfbWF0Y2hlcyA8IDI0MDAwKSkKKyAgICAgICAgICAgIC8vIG5vdCBtYXggdG8gYXZvaWQgZHYgaW4gbW92IHRvIG1hdGNoCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggKiAzIC8gNDsKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gNDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfZHZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZHYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEViAoRGlnaXRhbCBWaWRlbykiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUmF3RFZDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBkdl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBkdl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBkdl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBkdl9yZWFkX2Nsb3NlLAorICAgIC5yZWFkX3NlZWsgICAgICA9IGR2X3JlYWRfc2VlaywKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiZHYsZGlmIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZHYuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGM2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZHYuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogR2VuZXJhbCBEViBtdXhlci9kZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUm9tYW4gU2hhcG9zaG5paworICoKKyAqIE1hbnkgdGhhbmtzIHRvIERhbiBEZW5uZWR5IDxkYW5AZGVubmVkeS5vcmc+IGZvciBwcm92aWRpbmcgd2VhbHRoCisgKiBvZiBEViB0ZWNobmljYWwgaW5mby4KKyAqCisgKiBSYXcgRFYgZm9ybWF0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfRFZfSAorI2RlZmluZSBBVkZPUk1BVF9EVl9ICisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCit0eXBlZGVmIHN0cnVjdCBEVkRlbXV4Q29udGV4dCBEVkRlbXV4Q29udGV4dDsKK0RWRGVtdXhDb250ZXh0KiBhdnByaXZfZHZfaW5pdF9kZW11eChBVkZvcm1hdENvbnRleHQqIHMpOworaW50IGF2cHJpdl9kdl9nZXRfcGFja2V0KERWRGVtdXhDb250ZXh0KiwgQVZQYWNrZXQgKik7CitpbnQgYXZwcml2X2R2X3Byb2R1Y2VfcGFja2V0KERWRGVtdXhDb250ZXh0KiwgQVZQYWNrZXQqLCB1aW50OF90KiwgaW50LCBpbnQ2NF90KTsKK3ZvaWQgZmZfZHZfb2Zmc2V0X3Jlc2V0KERWRGVtdXhDb250ZXh0ICpjLCBpbnQ2NF90IGZyYW1lX29mZnNldCk7CisKK3R5cGVkZWYgc3RydWN0IERWTXV4Q29udGV4dCBEVk11eENvbnRleHQ7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9EVl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZHZlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9kdmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZmRmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZHZlbmMuYwpAQCAtMCwwICsxLDQ0OSBAQAorLyoKKyAqIEdlbmVyYWwgRFYgbXV4ZXIvZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIFJvbWFuIFNoYXBvc2huaWsKKyAqCisgKiBNYW55IHRoYW5rcyB0byBEYW4gRGVubmVkeSA8ZGFuQGRlbm5lZHkub3JnPiBmb3IgcHJvdmlkaW5nIHdlYWx0aAorICogb2YgRFYgdGVjaG5pY2FsIGluZm8uCisgKgorICogUmF3IERWIGZvcm1hdAorICogQ29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIDUwIE1icHMgKERWQ1BSTzUwKSBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGFuaWVsIE1hYXMgPGRtYWFzQG1hYXNkaWdpdGFsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9kdl9wcm9maWxlLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9kdi5oIgorI2luY2x1ZGUgImR2LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpZm8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lY29kZS5oIgorCisjZGVmaW5lIE1BWF9BVURJT19GUkFNRV9TSVpFIDE5MjAwMCAvLyAxIHNlY29uZCBvZiA0OGtoeiAzMmJpdCBhdWRpbworCitzdHJ1Y3QgRFZNdXhDb250ZXh0IHsKKyAgICBBVkNsYXNzICAgICAgICAgICphdl9jbGFzczsKKyAgICBjb25zdCBBVkRWUHJvZmlsZSogIHN5czsgICAgICAgICAgIC8qIGN1cnJlbnQgRFYgcHJvZmlsZSwgZS5nLjogNTI1LzYwLCA2MjUvNTAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICBuX2FzdDsgICAgICAgICAvKiBudW1iZXIgb2Ygc3RlcmVvIGF1ZGlvIHN0cmVhbXMgKHVwIHRvIDIpICovCisgICAgQVZTdHJlYW0gICAgICAgICAqYXN0WzJdOyAgICAgICAgLyogc3RlcmVvIGF1ZGlvIHN0cmVhbXMgKi8KKyAgICBBVkZpZm9CdWZmZXIgICAgICphdWRpb19kYXRhWzJdOyAvKiBGSUZPIGZvciBzdG9yaW5nIGV4Y2Vzc2l2ZSBhbW91bnRzIG9mIFBDTSAqLworICAgIGludCAgICAgICAgICAgICAgIGZyYW1lczsgICAgICAgIC8qIGN1cnJlbnQgZnJhbWUgbnVtYmVyICovCisgICAgaW50NjRfdCAgICAgICAgICAgc3RhcnRfdGltZTsgICAgLyogcmVjb3JkaW5nIHN0YXJ0IHRpbWUgKi8KKyAgICBpbnQgICAgICAgICAgICAgICBoYXNfYXVkaW87ICAgICAvKiBmcmFtZSB1bmRlciBjb25zdHJ1Y3Rpb24gaGFzIGF1ZGlvICovCisgICAgaW50ICAgICAgICAgICAgICAgaGFzX3ZpZGVvOyAgICAgLyogZnJhbWUgdW5kZXIgY29uc3RydWN0aW9uIGhhcyB2aWRlbyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgIGZyYW1lX2J1ZltEVl9NQVhfRlJBTUVfU0laRV07IC8qIGZyYW1lIHVuZGVyIGNvbnN0cnVjdGlvbiAqLworICAgIEFWVGltZWNvZGUgICAgICAgIHRjOyAgICAgICAgICAgIC8qIHRpbWVjb2RlIGNvbnRleHQgKi8KK307CisKK3N0YXRpYyBjb25zdCBpbnQgZHZfYWF1eF9wYWNrc19kaXN0WzEyXVs5XSA9IHsKKyAgICB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYgfSwKKyAgICB7IDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfSwKKyAgICB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYgfSwKKyAgICB7IDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfSwKKyAgICB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYgfSwKKyAgICB7IDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfSwKKyAgICB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYgfSwKKyAgICB7IDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfSwKKyAgICB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYgfSwKKyAgICB7IDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfSwKKyAgICB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYgfSwKKyAgICB7IDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfSwKK307CisKK3N0YXRpYyBpbnQgZHZfYXVkaW9fZnJhbWVfc2l6ZShjb25zdCBBVkRWUHJvZmlsZSogc3lzLCBpbnQgZnJhbWUsIGludCBzYW1wbGVfcmF0ZSkKK3sKKyAgICBpZiAoKHN5cy0+dGltZV9iYXNlLmRlbiA9PSAyNSB8fCBzeXMtPnRpbWVfYmFzZS5kZW4gPT0gNTApICYmIHN5cy0+dGltZV9iYXNlLm51bSA9PSAxKSB7CisgICAgICAgIGlmICAgICAgKHNhbXBsZV9yYXRlID09IDMyMDAwKSByZXR1cm4gMTI4MDsKKyAgICAgICAgZWxzZSBpZiAoc2FtcGxlX3JhdGUgPT0gNDQxMDApIHJldHVybiAxNzY0OworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE5MjA7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MChzYW1wbGVfcmF0ZSA9PSA0ODAwMCk7CisKKyAgICByZXR1cm4gc3lzLT5hdWRpb19zYW1wbGVzX2Rpc3RbZnJhbWUgJSAoc2l6ZW9mKHN5cy0+YXVkaW9fc2FtcGxlc19kaXN0KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzeXMtPmF1ZGlvX3NhbXBsZXNfZGlzdFswXSkpXTsKK30KKworc3RhdGljIGludCBkdl93cml0ZV9wYWNrKGVudW0gZHZfcGFja190eXBlIHBhY2tfaWQsIERWTXV4Q29udGV4dCAqYywgdWludDhfdCogYnVmLCAuLi4pCit7CisgICAgc3RydWN0IHRtIHRjOworICAgIHRpbWVfdCBjdDsKKyAgICB1aW50MzJfdCB0aW1lY29kZTsKKyAgICB2YV9saXN0IGFwOworICAgIGludCBhdWRpb190eXBlID0gMDsKKyAgICBpbnQgY2hhbm5lbDsKKworICAgIGJ1ZlswXSA9ICh1aW50OF90KXBhY2tfaWQ7CisgICAgc3dpdGNoIChwYWNrX2lkKSB7CisgICAgY2FzZSBkdl90aW1lY29kZToKKyAgICAgICAgdGltZWNvZGUgID0gYXZfdGltZWNvZGVfZ2V0X3NtcHRlX2Zyb21fZnJhbWVudW0oJmMtPnRjLCBjLT5mcmFtZXMpOworICAgICAgICB0aW1lY29kZSB8PSAxPDwyMyB8IDE8PDE1IHwgMTw8NyB8IDE8PDY7IC8vIGJpcGhhc2UgYW5kIGJpbmFyeSBncm91cCBmbGFncworICAgICAgICBBVl9XQjMyKGJ1ZiArIDEsIHRpbWVjb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBkdl9hdWRpb19zb3VyY2U6ICAvKiBBQVVYIHNvdXJjZSBwYWNrICovCisgICAgICAgIHZhX3N0YXJ0KGFwLCBidWYpOworICAgICAgICBjaGFubmVsID0gdmFfYXJnKGFwLCBpbnQpOworICAgICAgICBpZiAoYy0+YXN0W2NoYW5uZWxdLT5jb2RlYy0+c2FtcGxlX3JhdGUgPT0gNDQxMDApIHsKKyAgICAgICAgICAgIGF1ZGlvX3R5cGUgPSAxOworICAgICAgICB9IGVsc2UgaWYgKGMtPmFzdFtjaGFubmVsXS0+Y29kZWMtPnNhbXBsZV9yYXRlID09IDMyMDAwKQorICAgICAgICAgICAgYXVkaW9fdHlwZSA9IDI7CisgICAgICAgIGJ1ZlsxXSA9ICgxIDw8IDcpIHwgLyogbG9ja2VkIG1vZGUgLS0gU01QVEUgb25seSBzdXBwb3J0cyBsb2NrZWQgbW9kZSAqLworICAgICAgICAgICAgICAgICAoMSA8PCA2KSB8IC8qIHJlc2VydmVkIC0tIGFsd2F5cyAxICovCisgICAgICAgICAgICAgICAgIChkdl9hdWRpb19mcmFtZV9zaXplKGMtPnN5cywgYy0+ZnJhbWVzLCBjLT5hc3RbY2hhbm5lbF0tPmNvZGVjLT5zYW1wbGVfcmF0ZSkgLQorICAgICAgICAgICAgICAgICAgYy0+c3lzLT5hdWRpb19taW5fc2FtcGxlc1thdWRpb190eXBlXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIyBvZiBzYW1wbGVzICAgICAgKi8KKyAgICAgICAgYnVmWzJdID0gKDAgPDwgNykgfCAvKiBtdWx0aS1zdGVyZW8gICAgICAqLworICAgICAgICAgICAgICAgICAoMCA8PCA1KSB8IC8qICNvZiBhdWRpbyBjaGFubmVscyBwZXIgYmxvY2s6IDAgLS0gMSBjaGFubmVsICovCisgICAgICAgICAgICAgICAgICgwIDw8IDQpIHwgLyogcGFpciBiaXQ6IDAgLS0gb25lIHBhaXIgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgICAgISF2YV9hcmcoYXAsIGludCk7IC8qIGF1ZGlvIG1vZGUgICAgICAgICovCisgICAgICAgIGJ1ZlszXSA9ICgxIDw8IDcpIHwgLyogcmVzICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgKDEgPDwgNikgfCAvKiBtdWx0aS1sYW5ndWFnZSBmbGFnICovCisgICAgICAgICAgICAgICAgIChjLT5zeXMtPmRzZiA8PCA1KSB8IC8qICBzeXN0ZW06IDYwZmllbGRzLzUwZmllbGRzICovCisgICAgICAgICAgICAgICAgIChjLT5zeXMtPm5fZGlmY2hhbiAmIDIpOyAvKiBkZWZpbml0aW9uOiAwIC0tIDI1TWJwcywgMiAtLSA1ME1icHMgKi8KKyAgICAgICAgYnVmWzRdID0gKDEgPDwgNykgfCAvKiBlbXBoYXNpczogMSAtLSBvZmYgKi8KKyAgICAgICAgICAgICAgICAgKDAgPDwgNikgfCAvKiBlbXBoYXNpcyB0aW1lIGNvbnN0YW50OiAwIC0tIHJlc2VydmVkICovCisgICAgICAgICAgICAgICAgIChhdWRpb190eXBlIDw8IDMpIHwgLyogZnJlcXVlbmN5OiAwIC0tIDQ4a0h6LCAxIC0tIDQ0LDFrSHosIDIgLS0gMzJrSHogKi8KKyAgICAgICAgICAgICAgICAgIDA7ICAgICAgICAvKiBxdWFudGl6YXRpb246IDAgLS0gMTZiaXQgbGluZWFyLCAxIC0tIDEyYml0IG5vbmxpbmVhciAqLworCisgICAgICAgIHZhX2VuZChhcCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZHZfYXVkaW9fY29udHJvbDoKKyAgICAgICAgYnVmWzFdID0gKDAgPDwgNikgfCAvKiBjb3B5IHByb3RlY3Rpb246IDAgLS0gdW5yZXN0cmljdGVkICovCisgICAgICAgICAgICAgICAgICgxIDw8IDQpIHwgLyogaW5wdXQgc291cmNlOiAxIC0tIGRpZ2l0YWwgaW5wdXQgKi8KKyAgICAgICAgICAgICAgICAgKDMgPDwgMikgfCAvKiBjb21wcmVzc2lvbjogMyAtLSBubyBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgICAgICAgMDsgICAgICAgIC8qIG1pc2MuIGluZm8vU01QVEUgZW1waGFzaXMgb2ZmICovCisgICAgICAgIGJ1ZlsyXSA9ICgxIDw8IDcpIHwgLyogcmVjb3JkaW5nIHN0YXJ0IHBvaW50OiAxIC0tIG5vICovCisgICAgICAgICAgICAgICAgICgxIDw8IDYpIHwgLyogcmVjb3JkaW5nIGVuZCBwb2ludDogMSAtLSBubyAqLworICAgICAgICAgICAgICAgICAoMSA8PCAzKSB8IC8qIHJlY29yZGluZyBtb2RlOiAxIC0tIG9yaWdpbmFsICovCisgICAgICAgICAgICAgICAgICA3OworICAgICAgICBidWZbM10gPSAoMSA8PCA3KSB8IC8qIGRpcmVjdGlvbjogMSAtLSBmb3J3YXJkICovCisgICAgICAgICAgICAgICAgIChjLT5zeXMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQID8gMHgyMCA6IC8qIHNwZWVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c3lzLT5sdGNfZGl2aXNvciAqIDQpOworICAgICAgICBidWZbNF0gPSAoMSA8PCA3KSB8IC8qIHJlc2VydmVkIC0tIGFsd2F5cyAxICovCisgICAgICAgICAgICAgICAgICAweDdmOyAgICAgLyogZ2VucmUgY2F0ZWdvcnkgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBkdl9hdWRpb19yZWNkYXRlOgorICAgIGNhc2UgZHZfdmlkZW9fcmVjZGF0ZTogIC8qIFZBVVggcmVjb3JkaW5nIGRhdGUgKi8KKyAgICAgICAgY3QgPSBjLT5zdGFydF90aW1lICsgYXZfcmVzY2FsZV9ybmQoYy0+ZnJhbWVzLCBjLT5zeXMtPnRpbWVfYmFzZS5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnN5cy0+dGltZV9iYXNlLmRlbiwgQVZfUk9VTkRfRE9XTik7CisgICAgICAgIGZmX2Jya3RpbWVnbShjdCwgJnRjKTsKKyAgICAgICAgYnVmWzFdID0gMHhmZjsgLyogZHMsIHRtLCB0ZW5zIG9mIHRpbWUgem9uZSwgdW5pdHMgb2YgdGltZSB6b25lICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4ZmYgaXMgdmVyeSBsaWtlbHkgdG8gYmUgInVua25vd24iICovCisgICAgICAgIGJ1ZlsyXSA9ICgzIDw8IDYpIHwgLyogcmVzZXJ2ZWQgLS0gYWx3YXlzIDEgKi8KKyAgICAgICAgICAgICAgICAgKCh0Yy50bV9tZGF5IC8gMTApIDw8IDQpIHwgLyogVGVucyBvZiBkYXkgKi8KKyAgICAgICAgICAgICAgICAgKHRjLnRtX21kYXkgJSAxMCk7ICAgICAgICAgLyogVW5pdHMgb2YgZGF5ICovCisgICAgICAgIGJ1ZlszXSA9IC8qIHdlIHNldCBoaWdoIDQgYml0cyB0byAwLCBzaG91bGRuJ3Qgd2Ugc2V0IHRoZW0gdG8gd2Vlaz8gKi8KKyAgICAgICAgICAgICAgICAgKCh0Yy50bV9tb24gLyAxMCkgPDwgNCkgfCAgICAvKiBUZW5zIG9mIG1vbnRoICovCisgICAgICAgICAgICAgICAgICh0Yy50bV9tb24gICUgMTApOyAgICAgICAgICAgLyogVW5pdHMgb2YgbW9udGggKi8KKyAgICAgICAgYnVmWzRdID0gKCgodGMudG1feWVhciAlIDEwMCkgLyAxMCkgPDwgNCkgfCAvKiBUZW5zIG9mIHllYXIgKi8KKyAgICAgICAgICAgICAgICAgKHRjLnRtX3llYXIgJSAxMCk7ICAgICAgICAgICAgICAgICAvKiBVbml0cyBvZiB5ZWFyICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZHZfYXVkaW9fcmVjdGltZTogIC8qIEFBVVggcmVjb3JkaW5nIHRpbWUgKi8KKyAgICBjYXNlIGR2X3ZpZGVvX3JlY3RpbWU6ICAvKiBWQVVYIHJlY29yZGluZyB0aW1lICovCisgICAgICAgIGN0ID0gYy0+c3RhcnRfdGltZSArIGF2X3Jlc2NhbGVfcm5kKGMtPmZyYW1lcywgYy0+c3lzLT50aW1lX2Jhc2UubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnN5cy0+dGltZV9iYXNlLmRlbiwgQVZfUk9VTkRfRE9XTik7CisgICAgICAgIGZmX2Jya3RpbWVnbShjdCwgJnRjKTsKKyAgICAgICAgYnVmWzFdID0gKDMgPDwgNikgfCAvKiByZXNlcnZlZCAtLSBhbHdheXMgMSAqLworICAgICAgICAgICAgICAgICAweDNmOyAvKiB0ZW5zIG9mIGZyYW1lLCB1bml0cyBvZiBmcmFtZTogMHgzZiAtICJ1bmtub3duIiA/ICovCisgICAgICAgIGJ1ZlsyXSA9ICgxIDw8IDcpIHwgLyogcmVzZXJ2ZWQgLS0gYWx3YXlzIDEgKi8KKyAgICAgICAgICAgICAgICAgKCh0Yy50bV9zZWMgLyAxMCkgPDwgNCkgfCAvKiBUZW5zIG9mIHNlY29uZHMgKi8KKyAgICAgICAgICAgICAgICAgKHRjLnRtX3NlYyAlIDEwKTsgICAgICAgICAvKiBVbml0cyBvZiBzZWNvbmRzICovCisgICAgICAgIGJ1ZlszXSA9ICgxIDw8IDcpIHwgLyogcmVzZXJ2ZWQgLS0gYWx3YXlzIDEgKi8KKyAgICAgICAgICAgICAgICAgKCh0Yy50bV9taW4gLyAxMCkgPDwgNCkgfCAvKiBUZW5zIG9mIG1pbnV0ZXMgKi8KKyAgICAgICAgICAgICAgICAgKHRjLnRtX21pbiAlIDEwKTsgICAgICAgICAvKiBVbml0cyBvZiBtaW51dGVzICovCisgICAgICAgIGJ1Zls0XSA9ICgzIDw8IDYpIHwgLyogcmVzZXJ2ZWQgLS0gYWx3YXlzIDEgKi8KKyAgICAgICAgICAgICAgICAgKCh0Yy50bV9ob3VyIC8gMTApIDw8IDQpIHwgLyogVGVucyBvZiBob3VycyAqLworICAgICAgICAgICAgICAgICAodGMudG1faG91ciAlIDEwKTsgICAgICAgICAvKiBVbml0cyBvZiBob3VycyAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBidWZbMV0gPSBidWZbMl0gPSBidWZbM10gPSBidWZbNF0gPSAweGZmOworICAgIH0KKyAgICByZXR1cm4gNTsKK30KKworc3RhdGljIHZvaWQgZHZfaW5qZWN0X2F1ZGlvKERWTXV4Q29udGV4dCAqYywgaW50IGNoYW5uZWwsIHVpbnQ4X3QqIGZyYW1lX3B0cikKK3sKKyAgICBpbnQgaSwgaiwgZCwgb2YsIHNpemU7CisgICAgc2l6ZSA9IDQgKiBkdl9hdWRpb19mcmFtZV9zaXplKGMtPnN5cywgYy0+ZnJhbWVzLCBjLT5hc3RbY2hhbm5lbF0tPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgZnJhbWVfcHRyICs9IGNoYW5uZWwgKiBjLT5zeXMtPmRpZnNlZ19zaXplICogMTUwICogODA7CisgICAgZm9yIChpID0gMDsgaSA8IGMtPnN5cy0+ZGlmc2VnX3NpemU7IGkrKykgeworICAgICAgICBmcmFtZV9wdHIgKz0gNiAqIDgwOyAvKiBza2lwIERJRiBzZWdtZW50IGhlYWRlciAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgOTsgaisrKSB7CisgICAgICAgICAgICBkdl93cml0ZV9wYWNrKGR2X2FhdXhfcGFja3NfZGlzdFtpXVtqXSwgYywgJmZyYW1lX3B0clszXSwgY2hhbm5lbCwgaSA+PSBjLT5zeXMtPmRpZnNlZ19zaXplLzIpOworICAgICAgICAgICAgZm9yIChkID0gODsgZCA8IDgwOyBkKz0yKSB7CisgICAgICAgICAgICAgICAgb2YgPSBjLT5zeXMtPmF1ZGlvX3NodWZmbGVbaV1bal0gKyAoZCAtIDgpLzIgKiBjLT5zeXMtPmF1ZGlvX3N0cmlkZTsKKyAgICAgICAgICAgICAgICBpZiAob2YqMiA+PSBzaXplKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGZyYW1lX3B0cltkXSAgID0gKmF2X2ZpZm9fcGVlazIoYy0+YXVkaW9fZGF0YVtjaGFubmVsXSwgb2YqMisxKTsgLy8gRklYTUU6IG1heWJlIHdlIGhhdmUgdG8gYWRtaXQKKyAgICAgICAgICAgICAgICBmcmFtZV9wdHJbZCsxXSA9ICphdl9maWZvX3BlZWsyKGMtPmF1ZGlvX2RhdGFbY2hhbm5lbF0sIG9mKjIpOyAgIC8vICAgICAgICB0aGF0IERWIGlzIGEgYmlnLWVuZGlhbiBQQ00KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lX3B0ciArPSAxNiAqIDgwOyAvKiAxNSBWaWRlbyBESUZzICsgMSBBdWRpbyBESUYgKi8KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZHZfaW5qZWN0X21ldGFkYXRhKERWTXV4Q29udGV4dCAqYywgdWludDhfdCogZnJhbWUpCit7CisgICAgaW50IGosIGs7CisgICAgdWludDhfdCogYnVmOworCisgICAgZm9yIChidWYgPSBmcmFtZTsgYnVmIDwgZnJhbWUgKyBjLT5zeXMtPmZyYW1lX3NpemU7IGJ1ZiArPSAxNTAgKiA4MCkgeworICAgICAgICAvKiBEViBzdWJjb2RlOiAybmQgYW5kIDNkIERJRnMgKi8KKyAgICAgICAgZm9yIChqID0gODA7IGogPCA4MCAqIDM7IGogKz0gODApIHsKKyAgICAgICAgICAgIGZvciAoayA9IDY7IGsgPCA2ICogODsgayArPSA4KQorICAgICAgICAgICAgICAgIGR2X3dyaXRlX3BhY2soZHZfdGltZWNvZGUsIGMsICZidWZbaitrXSk7CisKKyAgICAgICAgICAgIGlmICgoKGxvbmcpKGJ1Zi1mcmFtZSkvKGMtPnN5cy0+ZnJhbWVfc2l6ZS8oYy0+c3lzLT5kaWZzZWdfc2l6ZSpjLT5zeXMtPm5fZGlmY2hhbikpJWMtPnN5cy0+ZGlmc2VnX3NpemUpID4gNSkgeyAvKiBGSVhNRTogaXMgdGhpcyByZWFsbHkgbmVlZGVkID8gKi8KKyAgICAgICAgICAgICAgICBkdl93cml0ZV9wYWNrKGR2X3ZpZGVvX3JlY2RhdGUsIGMsICZidWZbaisxNF0pOworICAgICAgICAgICAgICAgIGR2X3dyaXRlX3BhY2soZHZfdmlkZW9fcmVjdGltZSwgYywgJmJ1ZltqKzIyXSk7CisgICAgICAgICAgICAgICAgZHZfd3JpdGVfcGFjayhkdl92aWRlb19yZWNkYXRlLCBjLCAmYnVmW2orMzhdKTsKKyAgICAgICAgICAgICAgICBkdl93cml0ZV9wYWNrKGR2X3ZpZGVvX3JlY3RpbWUsIGMsICZidWZbais0Nl0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogRFYgVkFVWDogNHRoLCA1dGggYW5kIDZ0aCAzRElGcyAqLworICAgICAgICBmb3IgKGogPSA4MCozICsgMzsgaiA8IDgwKjY7IGogKz0gODApIHsKKyAgICAgICAgICAgIGR2X3dyaXRlX3BhY2soZHZfdmlkZW9fcmVjZGF0ZSwgYywgJmJ1ZltqKzUqMl0pOworICAgICAgICAgICAgZHZfd3JpdGVfcGFjayhkdl92aWRlb19yZWN0aW1lLCBjLCAmYnVmW2orNSozXSk7CisgICAgICAgICAgICBkdl93cml0ZV9wYWNrKGR2X3ZpZGVvX3JlY2RhdGUsIGMsICZidWZbais1KjExXSk7CisgICAgICAgICAgICBkdl93cml0ZV9wYWNrKGR2X3ZpZGVvX3JlY3RpbWUsIGMsICZidWZbais1KjEyXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIDMgZnVuY3Rpb25zIGNvbnN0aXR1dGUgb3VyIGludGVyZmFjZSB0byB0aGUgd29ybGQKKyAqLworCitzdGF0aWMgaW50IGR2X2Fzc2VtYmxlX2ZyYW1lKERWTXV4Q29udGV4dCAqYywgQVZTdHJlYW0qIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhLCBpbnQgZGF0YV9zaXplLCB1aW50OF90KiogZnJhbWUpCit7CisgICAgaW50IGksIHJlcWFzaXplOworCisgICAgKmZyYW1lID0gJmMtPmZyYW1lX2J1ZlswXTsKKworICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIC8qIEZJWE1FOiB3ZSBoYXZlIHRvIGhhdmUgbW9yZSBzZW5zaWJsZSBhcHByb2FjaCB0aGFuIHRoaXMgb25lICovCisgICAgICAgIGlmIChjLT5oYXNfdmlkZW8pCisgICAgICAgICAgICBhdl9sb2coc3QtPmNvZGVjLCBBVl9MT0dfRVJST1IsICJDYW4ndCBwcm9jZXNzIERWIGZyYW1lICMlZC4gSW5zdWZmaWNpZW50IGF1ZGlvIGRhdGEgb3Igc2V2ZXJlIHN5bmMgcHJvYmxlbS5cbiIsIGMtPmZyYW1lcyk7CisKKyAgICAgICAgbWVtY3B5KCpmcmFtZSwgZGF0YSwgYy0+c3lzLT5mcmFtZV9zaXplKTsKKyAgICAgICAgYy0+aGFzX3ZpZGVvID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX2FzdCAmJiBzdCAhPSBjLT5hc3RbaV07IGkrKyk7CisKKyAgICAgICAgICAvKiBGSVhNRTogd2UgaGF2ZSB0byBoYXZlIG1vcmUgc2Vuc2libGUgYXBwcm9hY2ggdGhhbiB0aGlzIG9uZSAqLworICAgICAgICBpZiAoYXZfZmlmb19zaXplKGMtPmF1ZGlvX2RhdGFbaV0pICsgZGF0YV9zaXplID49IDEwMCpNQVhfQVVESU9fRlJBTUVfU0laRSkKKyAgICAgICAgICAgIGF2X2xvZyhzdC0+Y29kZWMsIEFWX0xPR19FUlJPUiwgIkNhbid0IHByb2Nlc3MgRFYgZnJhbWUgIyVkLiBJbnN1ZmZpY2llbnQgdmlkZW8gZGF0YSBvciBzZXZlcmUgc3luYyBwcm9ibGVtLlxuIiwgYy0+ZnJhbWVzKTsKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGMtPmF1ZGlvX2RhdGFbaV0sIGRhdGEsIGRhdGFfc2l6ZSwgTlVMTCk7CisKKyAgICAgICAgcmVxYXNpemUgPSA0ICogZHZfYXVkaW9fZnJhbWVfc2l6ZShjLT5zeXMsIGMtPmZyYW1lcywgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKKyAgICAgICAgLyogTGV0IHVzIHNlZSBpZiB3ZSd2ZSBnb3QgZW5vdWdoIGF1ZGlvIGZvciBvbmUgRFYgZnJhbWUuICovCisgICAgICAgIGMtPmhhc19hdWRpbyB8PSAoKHJlcWFzaXplIDw9IGF2X2ZpZm9fc2l6ZShjLT5hdWRpb19kYXRhW2ldKSkgPDwgaSk7CisKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogTGV0IHVzIHNlZSBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIGNvbnN0cnVjdCBvbmUgRFYgZnJhbWUuICovCisgICAgaWYgKGMtPmhhc192aWRlbyA9PSAxICYmIGMtPmhhc19hdWRpbyArIDEgPT0gMSA8PCBjLT5uX2FzdCkgeworICAgICAgICBkdl9pbmplY3RfbWV0YWRhdGEoYywgKmZyYW1lKTsKKyAgICAgICAgYy0+aGFzX2F1ZGlvID0gMDsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBjLT5uX2FzdDsgaSsrKSB7CisgICAgICAgICAgICBkdl9pbmplY3RfYXVkaW8oYywgaSwgKmZyYW1lKTsKKyAgICAgICAgICAgIHJlcWFzaXplID0gNCAqIGR2X2F1ZGlvX2ZyYW1lX3NpemUoYy0+c3lzLCBjLT5mcmFtZXMsIGMtPmFzdFtpXS0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIGF2X2ZpZm9fZHJhaW4oYy0+YXVkaW9fZGF0YVtpXSwgcmVxYXNpemUpOworICAgICAgICAgICAgYy0+aGFzX2F1ZGlvIHw9ICgocmVxYXNpemUgPD0gYXZfZmlmb19zaXplKGMtPmF1ZGlvX2RhdGFbaV0pKSA8PCBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGMtPmhhc192aWRlbyA9IDA7CisKKyAgICAgICAgYy0+ZnJhbWVzKys7CisKKyAgICAgICAgcmV0dXJuIGMtPnN5cy0+ZnJhbWVfc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIERWTXV4Q29udGV4dCogZHZfaW5pdF9tdXgoQVZGb3JtYXRDb250ZXh0KiBzKQoreworICAgIERWTXV4Q29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqdnN0ID0gTlVMTDsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdDsKKyAgICBpbnQgaTsKKworICAgIC8qIHdlIHN1cHBvcnQgYXQgbW9zdCAxIHZpZGVvIGFuZCAyIGF1ZGlvIHN0cmVhbXMgKi8KKyAgICBpZiAocy0+bmJfc3RyZWFtcyA+IDMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYy0+bl9hc3QgID0gMDsKKyAgICBjLT5hc3RbMF0gPSBjLT5hc3RbMV0gPSBOVUxMOworCisgICAgLyogV2UgaGF2ZSB0byBzb3J0IG91dCB3aGVyZSBhdWRpbyBhbmQgd2hlcmUgdmlkZW8gc3RyZWFtIGlzICovCisgICAgZm9yIChpPTA7IGk8cy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICBpZiAodnN0KSByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHZzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICBpZiAoYy0+bl9hc3QgPiAxKSByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGMtPmFzdFtjLT5uX2FzdCsrXSA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gYmFpbF9vdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTb21lIGNoZWNrcyAtLSBEViBmb3JtYXQgaXMgdmVyeSBwaWNreSBhYm91dCBpdHMgaW5jb21pbmcgc3RyZWFtcyAqLworICAgIGlmICghdnN0IHx8IHZzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0RWVklERU8pCisgICAgICAgIGdvdG8gYmFpbF9vdXQ7CisgICAgZm9yIChpPTA7IGk8Yy0+bl9hc3Q7IGkrKykgeworICAgICAgICBpZiAoYy0+YXN0W2ldKSB7CisgICAgICAgICAgICBpZihjLT5hc3RbaV0tPmNvZGVjLT5jb2RlY19pZCAgICAhPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUgfHwKKyAgICAgICAgICAgICAgIGMtPmFzdFtpXS0+Y29kZWMtPmNoYW5uZWxzICAgICE9IDIpCisgICAgICAgICAgICAgICAgZ290byBiYWlsX291dDsKKyAgICAgICAgICAgIGlmIChjLT5hc3RbaV0tPmNvZGVjLT5zYW1wbGVfcmF0ZSAhPSA0ODAwMCAmJgorICAgICAgICAgICAgICAgIGMtPmFzdFtpXS0+Y29kZWMtPnNhbXBsZV9yYXRlICE9IDQ0MTAwICYmCisgICAgICAgICAgICAgICAgYy0+YXN0W2ldLT5jb2RlYy0+c2FtcGxlX3JhdGUgIT0gMzIwMDAgICAgKQorICAgICAgICAgICAgICAgIGdvdG8gYmFpbF9vdXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgYy0+c3lzID0gYXZfZHZfY29kZWNfcHJvZmlsZSh2c3QtPmNvZGVjLT53aWR0aCwgdnN0LT5jb2RlYy0+aGVpZ2h0LCB2c3QtPmNvZGVjLT5waXhfZm10KTsKKyAgICBpZiAoIWMtPnN5cykKKyAgICAgICAgZ290byBiYWlsX291dDsKKworICAgIGlmICgoYy0+c3lzLT50aW1lX2Jhc2UuZGVuICE9IDI1ICYmIGMtPnN5cy0+dGltZV9iYXNlLmRlbiAhPSA1MCkgfHwgYy0+c3lzLT50aW1lX2Jhc2UubnVtICE9IDEpIHsKKyAgICAgICAgaWYgKGMtPmFzdFswXSAmJiBjLT5hc3RbMF0tPmNvZGVjLT5zYW1wbGVfcmF0ZSAhPSA0ODAwMCkKKyAgICAgICAgICAgIGdvdG8gYmFpbF9vdXQ7CisgICAgICAgIGlmIChjLT5hc3RbMV0gJiYgYy0+YXN0WzFdLT5jb2RlYy0+c2FtcGxlX3JhdGUgIT0gNDgwMDApCisgICAgICAgICAgICBnb3RvIGJhaWxfb3V0OworICAgIH0KKworICAgIGlmICgoYy0+bl9hc3QgPiAxKSAmJiAoYy0+c3lzLT5uX2RpZmNoYW4gPCAyKSkgeworICAgICAgICAvKiBvbmx5IDEgc3RlcmVvIHBhaXIgaXMgYWxsb3dlZCBpbiAyNU1icHMgbW9kZSAqLworICAgICAgICBnb3RvIGJhaWxfb3V0OworICAgIH0KKworICAgIC8qIE9rLCBldmVyeXRoaW5nIHNlZW1zIHRvIGJlIGluIHdvcmtpbmcgb3JkZXIgKi8KKyAgICBjLT5mcmFtZXMgICAgID0gMDsKKyAgICBjLT5oYXNfYXVkaW8gID0gMDsKKyAgICBjLT5oYXNfdmlkZW8gID0gMDsKKyAgICBpZiAodCA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiY3JlYXRpb25fdGltZSIsIE5VTEwsIDApKQorICAgICAgICBjLT5zdGFydF90aW1lID0gZmZfaXNvODYwMV90b191bml4X3RpbWUodC0+dmFsdWUpOworCisgICAgZm9yIChpPTA7IGkgPCBjLT5uX2FzdDsgaSsrKSB7CisgICAgICAgIGlmIChjLT5hc3RbaV0gJiYgIShjLT5hdWRpb19kYXRhW2ldPWF2X2ZpZm9fYWxsb2NfYXJyYXkoMTAwLCBNQVhfQVVESU9fRlJBTUVfU0laRSkpKSB7CisgICAgICAgICAgICB3aGlsZSAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgYXZfZmlmb19mcmVlcCgmYy0+YXVkaW9fZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGJhaWxfb3V0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGM7CisKK2JhaWxfb3V0OgorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBkdl9kZWxldGVfbXV4KERWTXV4Q29udGV4dCAqYykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGk9MDsgaSA8IGMtPm5fYXN0OyBpKyspCisgICAgICAgIGF2X2ZpZm9fZnJlZXAoJmMtPmF1ZGlvX2RhdGFbaV0pOworfQorCitzdGF0aWMgaW50IGR2X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZSYXRpb25hbCByYXRlOworICAgIERWTXV4Q29udGV4dCAqZHZjID0gcy0+cHJpdl9kYXRhOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0Y3IgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgTlVMTCwgMCk7CisKKyAgICBpZiAoIWR2X2luaXRfbXV4KHMpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW4ndCBpbml0aWFsaXplIERWIGZvcm1hdCFcbiIKKyAgICAgICAgICAgICAgICAgICAgIk1ha2Ugc3VyZSB0aGF0IHlvdSBzdXBwbHkgZXhhY3RseSB0d28gc3RyZWFtczpcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgdmlkZW86IDI1ZnBzIG9yIDI5Ljk3ZnBzLCBhdWRpbzogMmNoLzQ4fDQ0fDMya0h6L1BDTVxuIgorICAgICAgICAgICAgICAgICAgICAiICAgICAoNTBNYnBzIGFsbG93cyBhbiBvcHRpb25hbCBzZWNvbmQgYXVkaW8gc3RyZWFtKVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmF0ZS5udW0gPSBkdmMtPnN5cy0+bHRjX2Rpdmlzb3I7CisgICAgcmF0ZS5kZW4gPSAxOworICAgIGlmICghdGNyKSB7IC8vIG5vIGdsb2JhbCB0aW1lY29kZSwgbG9vayBpbnRvIHRoZSBzdHJlYW1zCisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICB0Y3IgPSBhdl9kaWN0X2dldChzLT5zdHJlYW1zW2ldLT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgTlVMTCwgMCk7CisgICAgICAgICAgICBpZiAodGNyKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0Y3IgJiYgYXZfdGltZWNvZGVfaW5pdF9mcm9tX3N0cmluZygmZHZjLT50YywgcmF0ZSwgdGNyLT52YWx1ZSwgcykgPj0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGF2X3RpbWVjb2RlX2luaXQoJmR2Yy0+dGMsIHJhdGUsIDAsIDAsIHMpOworfQorCitzdGF0aWMgaW50IGR2X3dyaXRlX3BhY2tldChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIHVpbnQ4X3QqIGZyYW1lOworICAgIGludCBmc2l6ZTsKKworICAgIGZzaXplID0gZHZfYXNzZW1ibGVfZnJhbWUocy0+cHJpdl9kYXRhLCBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YSwgcGt0LT5zaXplLCAmZnJhbWUpOworICAgIGlmIChmc2l6ZSA+IDApIHsKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgZnJhbWUsIGZzaXplKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBtaWdodCBlbmQgdXAgd2l0aCBzb21lIGV4dHJhIEEvViBkYXRhIHdpdGhvdXQgbWF0Y2hpbmcgY291bnRlcnBhcnQuCisgKiBFLmcuIHZpZGVvIGRhdGEgd2l0aG91dCBlbm91Z2ggYXVkaW8gdG8gd3JpdGUgdGhlIGNvbXBsZXRlIGZyYW1lLgorICogQ3VycmVudGx5IHdlIHNpbXBseSBkcm9wIHRoZSBsYXN0IGZyYW1lLiBJIGRvbid0IGtub3cgd2hldGhlciB0aGlzCisgKiBpcyB0aGUgYmVzdCBzdHJhdGVneSBvZiBhbGwKKyAqLworc3RhdGljIGludCBkdl93cml0ZV90cmFpbGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgZHZfZGVsZXRlX211eChzLT5wcml2X2RhdGEpOworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9kdl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAiZHYiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEViAoRGlnaXRhbCBWaWRlbykiKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAiZHYiLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihEVk11eENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRSwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9EVlZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGR2X3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBkdl93cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgICAgID0gZHZfd3JpdGVfdHJhaWxlciwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZHhhLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZHhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkMWM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9keGEuYwpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIERYQSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicmlmZi5oIgorCisjZGVmaW5lIERYQV9FWFRSQV9TSVpFICA5CisKK3R5cGVkZWYgc3RydWN0eworICAgIGludCBmcmFtZXM7CisgICAgaW50IGhhc19zb3VuZDsKKyAgICBpbnQgYnBjOworICAgIHVpbnQzMl90IGJ5dGVzX2xlZnQ7CisgICAgaW50NjRfdCB3YXZwb3MsIHZpZHBvczsKKyAgICBpbnQgcmVhZHZpZDsKK31EWEFDb250ZXh0OworCitzdGF0aWMgaW50IGR4YV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpbnQgdywgaDsKKyAgICBpZiAocC0+YnVmX3NpemUgPCAxNSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdyA9IEFWX1JCMTYocC0+YnVmICsgMTEpOworICAgIGggPSBBVl9SQjE2KHAtPmJ1ZiArIDEzKTsKKyAgICAvKiBjaGVjayBmaWxlIGhlYWRlciAqLworICAgIGlmIChwLT5idWZbMF0gPT0gJ0QnICYmIHAtPmJ1ZlsxXSA9PSAnRScgJiYKKyAgICAgICAgcC0+YnVmWzJdID09ICdYJyAmJiBwLT5idWZbM10gPT0gJ0EnICYmCisgICAgICAgIHcgJiYgdyA8PSAyMDQ4ICYmIGggJiYgaCA8PSAyMDQ4KQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeGFfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIERYQUNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0LCAqYXN0OworICAgIHVpbnQzMl90IHRhZzsKKyAgICBpbnQzMl90IGZwczsKKyAgICBpbnQgdywgaDsKKyAgICBpbnQgbnVtLCBkZW47CisgICAgaW50IGZsYWdzOworICAgIGludCByZXQ7CisKKyAgICB0YWcgPSBhdmlvX3JsMzIocGIpOworICAgIGlmICh0YWcgIT0gTUtUQUcoJ0QnLCAnRScsICdYJywgJ0EnKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgZmxhZ3MgPSBhdmlvX3I4KHBiKTsKKyAgICBjLT5mcmFtZXMgPSBhdmlvX3JiMTYocGIpOworICAgIGlmKCFjLT5mcmFtZXMpeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmlsZSBjb250YWlucyBubyBmcmFtZXMgPz8/XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZnBzID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZihmcHMgPiAwKXsKKyAgICAgICAgZGVuID0gMTAwMDsKKyAgICAgICAgbnVtID0gZnBzOworICAgIH1lbHNlIGlmIChmcHMgPCAwKXsKKyAgICAgICAgZGVuID0gMTAwMDAwOworICAgICAgICBudW0gPSAtZnBzOworICAgIH1lbHNleworICAgICAgICBkZW4gPSAxMDsKKyAgICAgICAgbnVtID0gMTsKKyAgICB9CisgICAgdyA9IGF2aW9fcmIxNihwYik7CisgICAgaCA9IGF2aW9fcmIxNihwYik7CisgICAgYy0+aGFzX3NvdW5kID0gMDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLy8gUGFyc2UgV0FWIGRhdGEgaGVhZGVyCisgICAgaWYoYXZpb19ybDMyKHBiKSA9PSBNS1RBRygnVycsICdBJywgJ1YnLCAnRScpKXsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSwgZnNpemU7CisgICAgICAgIGMtPmhhc19zb3VuZCA9IDE7CisgICAgICAgIHNpemUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBjLT52aWRwb3MgPSBhdmlvX3RlbGwocGIpICsgc2l6ZTsKKyAgICAgICAgYXZpb19za2lwKHBiLCAxNik7CisgICAgICAgIGZzaXplID0gYXZpb19ybDMyKHBiKTsKKworICAgICAgICBhc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICBpZiAoIWFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHJldCA9IGZmX2dldF93YXZfaGVhZGVyKHBiLCBhc3QtPmNvZGVjLCBmc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID4gMCkKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAvLyBmaW5kICdkYXRhJyBjaHVuaworICAgICAgICB3aGlsZShhdmlvX3RlbGwocGIpIDwgYy0+dmlkcG9zICYmICFhdmlvX2Zlb2YocGIpKXsKKyAgICAgICAgICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBmc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBpZih0YWcgPT0gTUtUQUcoJ2QnLCAnYScsICd0JywgJ2EnKSkgYnJlYWs7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIGZzaXplKTsKKyAgICAgICAgfQorICAgICAgICBjLT5icGMgPSAoZnNpemUgKyBjLT5mcmFtZXMgLSAxKSAvIGMtPmZyYW1lczsKKyAgICAgICAgaWYoYXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pCisgICAgICAgICAgICBjLT5icGMgPSAoKGMtPmJwYyArIGFzdC0+Y29kZWMtPmJsb2NrX2FsaWduIC0gMSkgLyBhc3QtPmNvZGVjLT5ibG9ja19hbGlnbikgKiBhc3QtPmNvZGVjLT5ibG9ja19hbGlnbjsKKyAgICAgICAgYy0+Ynl0ZXNfbGVmdCA9IGZzaXplOworICAgICAgICBjLT53YXZwb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBhdmlvX3NlZWsocGIsIGMtPnZpZHBvcywgU0VFS19TRVQpOworICAgIH0KKworICAgIC8qIG5vdyB3ZSBhcmUgcmVhZHk6IGJ1aWxkIGZvcm1hdCBzdHJlYW1zICovCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0RYQTsKKyAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSB3OworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGg7CisgICAgYXZfcmVkdWNlKCZkZW4sICZudW0sIGRlbiwgbnVtLCAoMVVMPDwzMSktMSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzMsIG51bSwgZGVuKTsKKyAgICAvKiBmbGFncyAmIDB4ODAgbWVhbnMgdGhhdCBpbWFnZSBpcyBpbnRlcmxhY2VkLAorICAgICAqIGZsYWdzICYgMHg0MCBtZWFucyB0aGF0IGltYWdlIGhhcyBkb3VibGUgaGVpZ2h0CisgICAgICogZWl0aGVyIHdheSBzZXQgdHJ1ZSBoZWlnaHQKKyAgICAgKi8KKyAgICBpZihmbGFncyAmIDB4QzApeworICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA+Pj0gMTsKKyAgICB9CisgICAgYy0+cmVhZHZpZCA9ICFjLT5oYXNfc291bmQ7CisgICAgYy0+dmlkcG9zICA9IGF2aW9fdGVsbChwYik7CisgICAgcy0+c3RhcnRfdGltZSA9IDA7CisgICAgcy0+ZHVyYXRpb24gPSAoaW50NjRfdCljLT5mcmFtZXMgKiBBVl9USU1FX0JBU0UgKiBudW0gLyBkZW47CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIiVkIGZyYW1lKHMpXG4iLGMtPmZyYW1lcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeGFfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIERYQUNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKyAgICB1aW50MzJfdCBzaXplOworICAgIHVpbnQ4X3QgYnVmW0RYQV9FWFRSQV9TSVpFXSwgcGFsWzc2OCs0XTsKKyAgICBpbnQgcGFsX3NpemUgPSAwOworCisgICAgaWYoIWMtPnJlYWR2aWQgJiYgYy0+aGFzX3NvdW5kICYmIGMtPmJ5dGVzX2xlZnQpeworICAgICAgICBjLT5yZWFkdmlkID0gMTsKKyAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBjLT53YXZwb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgc2l6ZSA9IEZGTUlOKGMtPmJ5dGVzX2xlZnQsIGMtPmJwYyk7CisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMTsKKyAgICAgICAgaWYocmV0ICE9IHNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICBjLT5ieXRlc19sZWZ0IC09IHNpemU7CisgICAgICAgIGMtPndhdnBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhdmlvX3NlZWsocy0+cGIsIGMtPnZpZHBvcywgU0VFS19TRVQpOworICAgIHdoaWxlKCFhdmlvX2Zlb2Yocy0+cGIpICYmIGMtPmZyYW1lcyl7CisgICAgICAgIGlmICgocmV0ID0gYXZpb19yZWFkKHMtPnBiLCBidWYsIDQpKSAhPSA0KSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZmFpbGVkIHJlYWRpbmcgY2h1bmsgdHlwZVxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKEFWX1JMMzIoYnVmKSl7CisgICAgICAgIGNhc2UgTUtUQUcoJ04nLCAnVScsICdMJywgJ0wnKToKKyAgICAgICAgICAgIGlmKGF2X25ld19wYWNrZXQocGt0LCA0ICsgcGFsX3NpemUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgICAgICAgICAgaWYocGFsX3NpemUpIG1lbWNweShwa3QtPmRhdGEsIHBhbCwgcGFsX3NpemUpOworICAgICAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSArIHBhbF9zaXplLCBidWYsIDQpOworICAgICAgICAgICAgYy0+ZnJhbWVzLS07CisgICAgICAgICAgICBjLT52aWRwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICAgICAgYy0+cmVhZHZpZCA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBNS1RBRygnQycsICdNJywgJ0EnLCAnUCcpOgorICAgICAgICAgICAgcGFsX3NpemUgPSA3NjgrNDsKKyAgICAgICAgICAgIG1lbWNweShwYWwsIGJ1ZiwgNCk7CisgICAgICAgICAgICBhdmlvX3JlYWQocy0+cGIsIHBhbCArIDQsIDc2OCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnRicsICdSJywgJ0EnLCAnTScpOgorICAgICAgICAgICAgaWYgKChyZXQgPSBhdmlvX3JlYWQocy0+cGIsIGJ1ZiArIDQsIERYQV9FWFRSQV9TSVpFIC0gNCkpICE9IERYQV9FWFRSQV9TSVpFIC0gNCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJmYWlsZWQgcmVhZGluZyBkeGFfZXh0cmFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemUgPSBBVl9SQjMyKGJ1ZiArIDUpOworICAgICAgICAgICAgaWYoc2l6ZSA+IDB4RkZGRkZGKXsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRnJhbWUgc2l6ZSBpcyB0b28gYmlnOiAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoYXZfbmV3X3BhY2tldChwa3QsIHNpemUgKyBEWEFfRVhUUkFfU0laRSArIHBhbF9zaXplKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEgKyBwYWxfc2l6ZSwgYnVmLCBEWEFfRVhUUkFfU0laRSk7CisgICAgICAgICAgICByZXQgPSBhdmlvX3JlYWQocy0+cGIsIHBrdC0+ZGF0YSArIERYQV9FWFRSQV9TSVpFICsgcGFsX3NpemUsIHNpemUpOworICAgICAgICAgICAgaWYocmV0ICE9IHNpemUpeworICAgICAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBhbF9zaXplKSBtZW1jcHkocGt0LT5kYXRhLCBwYWwsIHBhbF9zaXplKTsKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICAgICAgICAgIGMtPmZyYW1lcy0tOworICAgICAgICAgICAgYy0+dmlkcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICAgICAgICAgIGMtPnJlYWR2aWQgPSAwOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5rbm93biB0YWcgJWMlYyVjJWNcbiIsIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfZHhhX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImR4YSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRYQSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihEWEFDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBkeGFfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZHhhX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGR4YV9yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZWFjZGF0YS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2VhY2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2U1MTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2VhY2RhdGEuYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIEVsZWN0cm9uaWMgQXJ0cyAuY2RhdGEgZmlsZSBEZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGV0ZXIgUm9zcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBFbGVjdHJvbmljIEFydHMgY2RhdGEgRm9ybWF0IERlbXV4ZXIKKyAqIGJ5IFBldGVyIFJvc3MgKHByb3NzQHh2aWQub3JnKQorICoKKyAqIFRlY2huaWNhbCBkZXRhaWxzIGhlcmU6CisgKiAgaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9RUFfQ29tbWFuZF9BbmRfQ29ucXVlcl8zX0F1ZGlvX0NvZGVjCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2hhbm5lbHM7CisgIHVuc2lnbmVkIGludCBhdWRpb19wdHM7Cit9IENkYXRhRGVtdXhDb250ZXh0OworCitzdGF0aWMgaW50IGNkYXRhX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CisKKyAgICBpZiAoYlswXSA9PSAweDA0ICYmIChiWzFdID09IDB4MDAgfHwgYlsxXSA9PSAweDA0IHx8IGJbMV0gPT0gMHgwQyB8fCBiWzFdID09IDB4MTQpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVgvODsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZGF0YV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQ2RhdGFEZW11eENvbnRleHQgKmNkYXRhID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVuc2lnbmVkIGludCBzYW1wbGVfcmF0ZSwgaGVhZGVyOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQ2NF90IGNoYW5uZWxfbGF5b3V0ID0gMDsKKworICAgIGhlYWRlciA9IGF2aW9fcmIxNihwYik7CisgICAgc3dpdGNoIChoZWFkZXIpIHsKKyAgICAgICAgY2FzZSAweDA0MDA6IGNkYXRhLT5jaGFubmVscyA9IDE7IGJyZWFrOworICAgICAgICBjYXNlIDB4MDQwNDogY2RhdGEtPmNoYW5uZWxzID0gMjsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNDBDOiBjZGF0YS0+Y2hhbm5lbHMgPSA0OyBjaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9RVUFEOyAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDQxNDogY2RhdGEtPmNoYW5uZWxzID0gNjsgY2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgInVua25vd24gaGVhZGVyIDB4JTA0eFxuIiwgaGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9OworCisgICAgc2FtcGxlX3JhdGUgPSBhdmlvX3JiMTYocGIpOworICAgIGF2aW9fc2tpcChwYiwgKGF2aW9fcjgocGIpICYgMHgyMCkgPyAxNSA6IDExKTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7IC8qIG5vIGZvdXJjYyAqLworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9YQVM7CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IGNkYXRhLT5jaGFubmVsczsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gY2hhbm5lbF9sYXlvdXQ7CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzYW1wbGVfcmF0ZSk7CisKKyAgICBjZGF0YS0+YXVkaW9fcHRzID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZGF0YV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQ2RhdGFEZW11eENvbnRleHQgKmNkYXRhID0gcy0+cHJpdl9kYXRhOworICAgIGludCBwYWNrZXRfc2l6ZSA9IDc2KmNkYXRhLT5jaGFubmVsczsKKworICAgIGludCByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHBhY2tldF9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwa3QtPnB0cyA9IGNkYXRhLT5hdWRpb19wdHMrKzsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9lYV9jZGF0YV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJlYV9jZGF0YSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkVsZWN0cm9uaWMgQXJ0cyBjZGF0YSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihDZGF0YURlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gY2RhdGFfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gY2RhdGFfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gY2RhdGFfcmVhZF9wYWNrZXQsCisgICAgLmV4dGVuc2lvbnMgPSAiY2RhdGEiLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9lbGVjdHJvbmljYXJ0cy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2VsZWN0cm9uaWNhcnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhMzk2YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9lbGVjdHJvbmljYXJ0cy5jCkBAIC0wLDAgKzEsNzAyIEBACisvKiBFbGVjdHJvbmljIEFydHMgTXVsdGltZWRpYSBGaWxlIERlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRWxlY3Ryb25pYyBBcnRzIE11bHRpbWVkaWEgZmlsZSBkZW11eGVyIChXVkUvVVYyL2V0Yy4pCisgKiBieSBSb2JpbiBLYXkgKGtvbWFkb3JpIGF0IGdla2tvdS5jby51aykKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgU0NIbF9UQUcgTUtUQUcoJ1MnLCAnQycsICdIJywgJ2wnKQorI2RlZmluZSBTRUFEX1RBRyBNS1RBRygnUycsICdFJywgJ0EnLCAnRCcpICAvKiBTeHh4IGhlYWRlciAqLworI2RlZmluZSBTTkRDX1RBRyBNS1RBRygnUycsICdOJywgJ0QnLCAnQycpICAvKiBTeHh4IGRhdGEgKi8KKyNkZWZpbmUgU0VORF9UQUcgTUtUQUcoJ1MnLCAnRScsICdOJywgJ0QnKSAgLyogU3h4eCBlbmQgKi8KKyNkZWZpbmUgU0hFTl9UQUcgTUtUQUcoJ1MnLCAnSCcsICdFJywgJ04nKSAgLyogU3hFTiBoZWFkZXIgKi8KKyNkZWZpbmUgU0RFTl9UQUcgTUtUQUcoJ1MnLCAnRCcsICdFJywgJ04nKSAgLyogU3hFTiBkYXRhICovCisjZGVmaW5lIFNFRU5fVEFHIE1LVEFHKCdTJywgJ0UnLCAnRScsICdOJykgIC8qIFN4RU4gZW5kICovCisjZGVmaW5lIElTTmhfVEFHIE1LVEFHKCcxJywgJ1MnLCAnTicsICdoJykgIC8qIDFTTnggaGVhZGVyICovCisjZGVmaW5lIEVBQ1NfVEFHIE1LVEFHKCdFJywgJ0EnLCAnQycsICdTJykKKyNkZWZpbmUgSVNOZF9UQUcgTUtUQUcoJzEnLCAnUycsICdOJywgJ2QnKSAgLyogMVNOeCBkYXRhICovCisjZGVmaW5lIElTTmVfVEFHIE1LVEFHKCcxJywgJ1MnLCAnTicsICdlJykgIC8qIDFTTnggZW5kICovCisjZGVmaW5lIFBUMDBfVEFHIE1LVEFHKCdQJywgJ1QnLCAweDAsIDB4MCkKKyNkZWZpbmUgR1NUUl9UQUcgTUtUQUcoJ0cnLCAnUycsICdUJywgJ1InKQorI2RlZmluZSBTQ0RsX1RBRyBNS1RBRygnUycsICdDJywgJ0QnLCAnbCcpCisjZGVmaW5lIFNDRWxfVEFHIE1LVEFHKCdTJywgJ0MnLCAnRScsICdsJykKKyNkZWZpbmUga1ZHVF9UQUcgTUtUQUcoJ2snLCAnVicsICdHJywgJ1QnKSAgLyogVEdWIEktZnJhbWUgKi8KKyNkZWZpbmUgZlZHVF9UQUcgTUtUQUcoJ2YnLCAnVicsICdHJywgJ1QnKSAgLyogVEdWIFAtZnJhbWUgKi8KKyNkZWZpbmUgbVRDRF9UQUcgTUtUQUcoJ20nLCAnVCcsICdDJywgJ0QnKSAgLyogTURFQyAqLworI2RlZmluZSBNQURrX1RBRyBNS1RBRygnTScsICdBJywgJ0QnLCAnaycpICAvKiBNQUQgSS1mcmFtZSAqLworI2RlZmluZSBNQURtX1RBRyBNS1RBRygnTScsICdBJywgJ0QnLCAnbScpICAvKiBNQUQgUC1mcmFtZSAqLworI2RlZmluZSBNQURlX1RBRyBNS1RBRygnTScsICdBJywgJ0QnLCAnZScpICAvKiBNQUQgbHFwLWZyYW1lICovCisjZGVmaW5lIE1QQ2hfVEFHIE1LVEFHKCdNJywgJ1AnLCAnQycsICdoJykgIC8qIE1QRUctMiAqLworI2RlZmluZSBUR1FzX1RBRyBNS1RBRygnVCcsICdHJywgJ1EnLCAncycpICAvKiBUR1EgSS1mcmFtZSAoYXBwZWFycyBpbiAuVEdRIGZpbGVzKSAqLworI2RlZmluZSBwUUdUX1RBRyBNS1RBRygncCcsICdRJywgJ0cnLCAnVCcpICAvKiBUR1EgSS1mcmFtZSAoYXBwZWFycyBpbiAuVVYgZmlsZXMpICovCisjZGVmaW5lIHBJUVRfVEFHIE1LVEFHKCdwJywgJ0knLCAnUScsICdUJykgIC8qIFRRSS9VVjIgSS1mcmFtZSAoLlVWMi8uV1ZFKSAqLworI2RlZmluZSBNVmhkX1RBRyBNS1RBRygnTScsICdWJywgJ2gnLCAnZCcpCisjZGVmaW5lIE1WMEtfVEFHIE1LVEFHKCdNJywgJ1YnLCAnMCcsICdLJykKKyNkZWZpbmUgTVYwRl9UQUcgTUtUQUcoJ00nLCAnVicsICcwJywgJ0YnKQorI2RlZmluZSBNVkloX1RBRyBNS1RBRygnTScsICdWJywgJ0knLCAnaCcpICAvKiBDTVYgaGVhZGVyICovCisjZGVmaW5lIE1WSWZfVEFHIE1LVEFHKCdNJywgJ1YnLCAnSScsICdmJykgIC8qIENNViBJLWZyYW1lICovCisKK3R5cGVkZWYgc3RydWN0IEVhRGVtdXhDb250ZXh0IHsKKyAgICBpbnQgYmlnX2VuZGlhbjsKKworICAgIGVudW0gQVZDb2RlY0lEIHZpZGVvX2NvZGVjOworICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlOworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBuYl9mcmFtZXM7CisgICAgaW50IHZpZGVvX3N0cmVhbV9pbmRleDsKKworICAgIGVudW0gQVZDb2RlY0lEIGF1ZGlvX2NvZGVjOworICAgIGludCBhdWRpb19zdHJlYW1faW5kZXg7CisKKyAgICBpbnQgYnl0ZXM7CisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGludCBudW1fY2hhbm5lbHM7CisgICAgaW50IG51bV9zYW1wbGVzOworfSBFYURlbXV4Q29udGV4dDsKKworc3RhdGljIHVpbnQzMl90IHJlYWRfYXJiaXRyYXJ5KEFWSU9Db250ZXh0ICpwYikKK3sKKyAgICB1aW50OF90IHNpemUsIGJ5dGU7CisgICAgaW50IGk7CisgICAgdWludDMyX3Qgd29yZDsKKworICAgIHNpemUgPSBhdmlvX3I4KHBiKTsKKworICAgIHdvcmQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgYnl0ZSAgID0gYXZpb19yOChwYik7CisgICAgICAgIHdvcmQgPDw9IDg7CisgICAgICAgIHdvcmQgIHw9IGJ5dGU7CisgICAgfQorCisgICAgcmV0dXJuIHdvcmQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19hdWRpb19oZWFkZXJfZWxlbWVudHMoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEVhRGVtdXhDb250ZXh0ICplYSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAgICAqcGIgPSBzLT5wYjsKKyAgICBpbnQgaW5faGVhZGVyID0gMTsKKyAgICBpbnQgY29tcHJlc3Npb25fdHlwZSA9IC0xLCByZXZpc2lvbiA9IC0xLCByZXZpc2lvbjIgPSAtMTsKKworICAgIGVhLT5ieXRlcyAgICAgICAgPSAyOworICAgIGVhLT5zYW1wbGVfcmF0ZSAgPSAtMTsKKyAgICBlYS0+bnVtX2NoYW5uZWxzID0gMTsKKworICAgIHdoaWxlICghYXZpb19mZW9mKHBiKSAmJiBpbl9oZWFkZXIpIHsKKyAgICAgICAgaW50IGluX3N1YmhlYWRlcjsKKyAgICAgICAgdWludDhfdCBieXRlOworICAgICAgICBieXRlID0gYXZpb19yOChwYik7CisKKyAgICAgICAgc3dpdGNoIChieXRlKSB7CisgICAgICAgIGNhc2UgMHhGRDoKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJlbnRlcmVkIGF1ZGlvIHN1YmhlYWRlclxuIik7CisgICAgICAgICAgICBpbl9zdWJoZWFkZXIgPSAxOworICAgICAgICAgICAgd2hpbGUgKCFhdmlvX2Zlb2YocGIpICYmIGluX3N1YmhlYWRlcikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3ViYnl0ZTsKKyAgICAgICAgICAgICAgICBzdWJieXRlID0gYXZpb19yOChwYik7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YmJ5dGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4ODA6CisgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0gcmVhZF9hcmJpdHJhcnkocGIpOworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldmlzaW9uIChlbGVtZW50IDB4ODApIHNldCB0byAweCUwOHhcbiIsIHJldmlzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDgyOgorICAgICAgICAgICAgICAgICAgICBlYS0+bnVtX2NoYW5uZWxzID0gcmVhZF9hcmJpdHJhcnkocGIpOworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bV9jaGFubmVscyAoZWxlbWVudCAweDgyKSBzZXQgdG8gMHglMDh4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZWEtPm51bV9jaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg4MzoKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25fdHlwZSA9IHJlYWRfYXJiaXRyYXJ5KHBiKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2lvbl90eXBlIChlbGVtZW50IDB4ODMpIHNldCB0byAweCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbl90eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDg0OgorICAgICAgICAgICAgICAgICAgICBlYS0+c2FtcGxlX3JhdGUgPSByZWFkX2FyYml0cmFyeShwYik7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlX3JhdGUgKGVsZW1lbnQgMHg4NCkgc2V0IHRvICVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZWEtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDg1OgorICAgICAgICAgICAgICAgICAgICBlYS0+bnVtX3NhbXBsZXMgPSByZWFkX2FyYml0cmFyeShwYik7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtX3NhbXBsZXMgKGVsZW1lbnQgMHg4NSkgc2V0IHRvIDB4JTA4eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhLT5udW1fc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg4QToKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50IDB4JTAyeCBzZXQgdG8gMHglMDgiUFJJeDMyIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmJ5dGUsIHJlYWRfYXJiaXRyYXJ5KHBiKSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJleGl0ZWQgYXVkaW8gc3ViaGVhZGVyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgaW5fc3ViaGVhZGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweEEwOgorICAgICAgICAgICAgICAgICAgICByZXZpc2lvbjIgPSByZWFkX2FyYml0cmFyeShwYik7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV2aXNpb24yIChlbGVtZW50IDB4QTApIHNldCB0byAweCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbjIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4RkY6CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5kIG9mIGhlYWRlciBibG9jayByZWFjaGVkICh3aXRoaW4gYXVkaW8gc3ViaGVhZGVyKVxuIik7CisgICAgICAgICAgICAgICAgICAgIGluX3N1YmhlYWRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluX2hlYWRlciAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudCAweCUwMnggc2V0IHRvIDB4JTA4IlBSSXgzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJieXRlLCByZWFkX2FyYml0cmFyeShwYikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweEZGOgorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImVuZCBvZiBoZWFkZXIgYmxvY2sgcmVhY2hlZFxuIik7CisgICAgICAgICAgICBpbl9oZWFkZXIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJoZWFkZXIgZWxlbWVudCAweCUwMnggc2V0IHRvIDB4JTA4IlBSSXgzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgYnl0ZSwgcmVhZF9hcmJpdHJhcnkocGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChjb21wcmVzc2lvbl90eXBlKSB7CisgICAgY2FzZSAgMDoKKyAgICAgICAgZWEtPmF1ZGlvX2NvZGVjID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlICA3OgorICAgICAgICBlYS0+YXVkaW9fY29kZWMgPSBBVl9DT0RFQ19JRF9BRFBDTV9FQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAtMToKKyAgICAgICAgc3dpdGNoIChyZXZpc2lvbikgeworICAgICAgICBjYXNlICAxOgorICAgICAgICAgICAgZWEtPmF1ZGlvX2NvZGVjID0gQVZfQ09ERUNfSURfQURQQ01fRUFfUjE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAgMjoKKyAgICAgICAgICAgIGVhLT5hdWRpb19jb2RlYyA9IEFWX0NPREVDX0lEX0FEUENNX0VBX1IyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIDM6CisgICAgICAgICAgICBlYS0+YXVkaW9fY29kZWMgPSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9SMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgInN0cmVhbSB0eXBlOyByZXZpc2lvbj0laSIsIHJldmlzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAocmV2aXNpb24yKSB7CisgICAgICAgIGNhc2UgIDg6CisgICAgICAgICAgICBlYS0+YXVkaW9fY29kZWMgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEVfUExBTkFSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICBzd2l0Y2ggKHJldmlzaW9uKSB7CisgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgY2FzZSAgMjogZWEtPmF1ZGlvX2NvZGVjID0gQVZfQ09ERUNfSURfQURQQ01fRUFfUjE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAgMzogZWEtPmF1ZGlvX2NvZGVjID0gQVZfQ09ERUNfSURfQURQQ01fRUFfUjI7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgInN0cmVhbSB0eXBlOyByZXZpc2lvbj0laSwgcmV2aXNpb24yPSVpIiwgcmV2aXNpb24sIHJldmlzaW9uMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIGVhLT5hdWRpb19jb2RlYyA9IEFWX0NPREVDX0lEX01QMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlYS0+YXVkaW9fY29kZWMgPSBBVl9DT0RFQ19JRF9OT05FOworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJzdHJlYW0gdHlwZTsgcmV2aXNpb24yPSVpIiwgcmV2aXNpb24yKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbSB0eXBlOyBjb21wcmVzc2lvbl90eXBlPSVpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uX3R5cGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZWEtPnNhbXBsZV9yYXRlID09IC0xKQorICAgICAgICBlYS0+c2FtcGxlX3JhdGUgPSByZXZpc2lvbiA9PSAzID8gNDgwMDAgOiAyMjA1MDsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2F1ZGlvX2hlYWRlcl9lYWNzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBFYURlbXV4Q29udGV4dCAqZWEgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiICAgID0gcy0+cGI7CisgICAgaW50IGNvbXByZXNzaW9uX3R5cGU7CisKKyAgICBlYS0+c2FtcGxlX3JhdGUgID0gZWEtPmJpZ19lbmRpYW4gPyBhdmlvX3JiMzIocGIpIDogYXZpb19ybDMyKHBiKTsKKyAgICBlYS0+Ynl0ZXMgICAgICAgID0gYXZpb19yOChwYik7ICAgLyogMT04LWJpdCwgMj0xNi1iaXQgKi8KKyAgICBlYS0+bnVtX2NoYW5uZWxzID0gYXZpb19yOChwYik7CisgICAgY29tcHJlc3Npb25fdHlwZSA9IGF2aW9fcjgocGIpOworICAgIGF2aW9fc2tpcChwYiwgMTMpOworCisgICAgc3dpdGNoIChjb21wcmVzc2lvbl90eXBlKSB7CisgICAgY2FzZSAwOgorICAgICAgICBzd2l0Y2ggKGVhLT5ieXRlcykgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBlYS0+YXVkaW9fY29kZWMgPSBBVl9DT0RFQ19JRF9QQ01fUzg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZWEtPmF1ZGlvX2NvZGVjID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBlYS0+YXVkaW9fY29kZWMgPSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc7CisgICAgICAgIGVhLT5ieXRlcyAgICAgICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZWEtPmF1ZGlvX2NvZGVjID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX0VBX0VBQ1M7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbSB0eXBlOyBhdWRpbyBjb21wcmVzc2lvbl90eXBlPSVpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uX3R5cGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19hdWRpb19oZWFkZXJfc2VhZChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgRWFEZW11eENvbnRleHQgKmVhID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiAgICA9IHMtPnBiOworCisgICAgZWEtPnNhbXBsZV9yYXRlICA9IGF2aW9fcmwzMihwYik7CisgICAgZWEtPmJ5dGVzICAgICAgICA9IGF2aW9fcmwzMihwYik7ICAvKiAxPTgtYml0LCAyPTE2LWJpdCAqLworICAgIGVhLT5udW1fY2hhbm5lbHMgPSBhdmlvX3JsMzIocGIpOworICAgIGVhLT5hdWRpb19jb2RlYyAgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfRUFfU0VBRDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc192aWRlb19oZWFkZXJfbWRlYyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgRWFEZW11eENvbnRleHQgKmVhID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiAgICA9IHMtPnBiOworICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgZWEtPndpZHRoICAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBlYS0+aGVpZ2h0ICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIGVhLT50aW1lX2Jhc2UgICA9IChBVlJhdGlvbmFsKSB7IDEsIDE1IH07CisgICAgZWEtPnZpZGVvX2NvZGVjID0gQVZfQ09ERUNfSURfTURFQzsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3ZpZGVvX2hlYWRlcl92cDYoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEVhRGVtdXhDb250ZXh0ICplYSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgICAgPSBzLT5wYjsKKworICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgZWEtPm5iX2ZyYW1lcyA9IGF2aW9fcmwzMihwYik7CisgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICBlYS0+dGltZV9iYXNlLmRlbiA9IGF2aW9fcmwzMihwYik7CisgICAgZWEtPnRpbWVfYmFzZS5udW0gPSBhdmlvX3JsMzIocGIpOworICAgIGlmIChlYS0+dGltZV9iYXNlLmRlbiA8PSAwIHx8IGVhLT50aW1lX2Jhc2UubnVtIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlRpbWViYXNlIGlzIGludmFsaWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZWEtPnZpZGVvX2NvZGVjICAgPSBBVl9DT0RFQ19JRF9WUDY7CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc192aWRlb19oZWFkZXJfY212KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBFYURlbXV4Q29udGV4dCAqZWEgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGZwczsKKworICAgIGF2aW9fc2tpcChzLT5wYiwgMTApOworICAgIGZwcyA9IGF2aW9fcmwxNihzLT5wYik7CisgICAgaWYgKGZwcykKKyAgICAgICAgZWEtPnRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKSB7IDEsIGZwcyB9OworICAgIGVhLT52aWRlb19jb2RlYyA9IEFWX0NPREVDX0lEX0NNVjsKK30KKworLyogUHJvY2VzcyBFQSBmaWxlIGhlYWRlci4KKyAqIFJldHVybiAxIGlmIHRoZSBFQSBmaWxlIGlzIHZhbGlkIGFuZCBzdWNjZXNzZnVsbHkgb3BlbmVkLCAwIG90aGVyd2lzZS4gKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19lYV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHVpbnQzMl90IGJsb2NraWQsIHNpemUgPSAwOworICAgIEVhRGVtdXhDb250ZXh0ICplYSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgICAgPSBzLT5wYjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA1ICYmICghZWEtPmF1ZGlvX2NvZGVjIHx8ICFlYS0+dmlkZW9fY29kZWMpOyBpKyspIHsKKyAgICAgICAgdWludDY0X3Qgc3RhcnRwb3MgICAgID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgaW50IGVyciAgICAgICAgICAgICAgID0gMDsKKworICAgICAgICBibG9ja2lkID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgc2l6ZSAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICBlYS0+YmlnX2VuZGlhbiA9IHNpemUgPiBhdl9ic3dhcDMyKHNpemUpOworICAgICAgICBpZiAoZWEtPmJpZ19lbmRpYW4pCisgICAgICAgICAgICBzaXplID0gYXZfYnN3YXAzMihzaXplKTsKKworICAgICAgICBpZiAoc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjaHVuayBzaXplIHRvbyBzbWFsbFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYmxvY2tpZCkgeworICAgICAgICBjYXNlIElTTmhfVEFHOgorICAgICAgICAgICAgaWYgKGF2aW9fcmwzMihwYikgIT0gRUFDU19UQUcpIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgInVua25vd24gMVNOaCBoZWFkZXJpZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvY2Vzc19hdWRpb19oZWFkZXJfZWFjcyhzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0NIbF9UQUc6CisgICAgICAgIGNhc2UgU0hFTl9UQUc6CisgICAgICAgICAgICBibG9ja2lkID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGlmIChibG9ja2lkID09IEdTVFJfVEFHKSB7CisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJsb2NraWQgJiAweEZGRkYpICE9IFBUMDBfVEFHKSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJ1bmtub3duIFNDSGwgaGVhZGVyaWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IHByb2Nlc3NfYXVkaW9faGVhZGVyX2VsZW1lbnRzKHMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRUFEX1RBRzoKKyAgICAgICAgICAgIHByb2Nlc3NfYXVkaW9faGVhZGVyX3NlYWQocyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WSWhfVEFHOgorICAgICAgICAgICAgcHJvY2Vzc192aWRlb19oZWFkZXJfY212KHMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrVkdUX1RBRzoKKyAgICAgICAgICAgIGVhLT52aWRlb19jb2RlYyA9IEFWX0NPREVDX0lEX1RHVjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbVRDRF9UQUc6CisgICAgICAgICAgICBwcm9jZXNzX3ZpZGVvX2hlYWRlcl9tZGVjKHMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNUENoX1RBRzoKKyAgICAgICAgICAgIGVhLT52aWRlb19jb2RlYyA9IEFWX0NPREVDX0lEX01QRUcyVklERU87CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHBRR1RfVEFHOgorICAgICAgICBjYXNlIFRHUXNfVEFHOgorICAgICAgICAgICAgZWEtPnZpZGVvX2NvZGVjID0gQVZfQ09ERUNfSURfVEdROworICAgICAgICAgICAgZWEtPnRpbWVfYmFzZSAgID0gKEFWUmF0aW9uYWwpIHsgMSwgMTUgfTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgcElRVF9UQUc6CisgICAgICAgICAgICBlYS0+dmlkZW9fY29kZWMgPSBBVl9DT0RFQ19JRF9UUUk7CisgICAgICAgICAgICBlYS0+dGltZV9iYXNlICAgPSAoQVZSYXRpb25hbCkgeyAxLCAxNSB9OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNQURrX1RBRzoKKyAgICAgICAgICAgIGVhLT52aWRlb19jb2RlYyA9IEFWX0NPREVDX0lEX01BRDsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNik7CisgICAgICAgICAgICBlYS0+dGltZV9iYXNlID0gKEFWUmF0aW9uYWwpIHsgYXZpb19ybDE2KHBiKSwgMTAwMCB9OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNVmhkX1RBRzoKKyAgICAgICAgICAgIGVyciA9IHByb2Nlc3NfdmlkZW9faGVhZGVyX3ZwNihzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJlcnJvciBwYXJzaW5nIGhlYWRlcjogJWlcbiIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgYXZpb19zZWVrKHBiLCBzdGFydHBvcyArIHNpemUsIFNFRUtfU0VUKTsKKyAgICB9CisKKyAgICBhdmlvX3NlZWsocGIsIDAsIFNFRUtfU0VUKTsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGVhX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIHVuc2lnbmVkIGJpZ19lbmRpYW4sIHNpemU7CisKKyAgICBzd2l0Y2ggKEFWX1JMMzIoJnAtPmJ1ZlswXSkpIHsKKyAgICBjYXNlIElTTmhfVEFHOgorICAgIGNhc2UgU0NIbF9UQUc6CisgICAgY2FzZSBTRUFEX1RBRzoKKyAgICBjYXNlIFNIRU5fVEFHOgorICAgIGNhc2Uga1ZHVF9UQUc6CisgICAgY2FzZSBNQURrX1RBRzoKKyAgICBjYXNlIE1QQ2hfVEFHOgorICAgIGNhc2UgTVZoZF9UQUc6CisgICAgY2FzZSBNVkloX1RBRzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNpemUgPSBBVl9STDMyKCZwLT5idWZbNF0pOworICAgIGJpZ19lbmRpYW4gPSBzaXplID4gMHgwMDBGRkZGRjsKKyAgICBpZiAoYmlnX2VuZGlhbikKKyAgICAgICAgc2l6ZSA9IGF2X2Jzd2FwMzIoc2l6ZSk7CisgICAgaWYgKHNpemUgPiAweGZmZmZmIHx8IHNpemUgPCA4KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKK30KKworc3RhdGljIGludCBlYV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgRWFEZW11eENvbnRleHQgKmVhID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIGlmIChwcm9jZXNzX2VhX2hlYWRlcihzKTw9MCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIGlmIChlYS0+dmlkZW9fY29kZWMpIHsKKyAgICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgdmlkZW8gZGVjb2RlciBzdHJlYW0gKi8KKyAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZWEtPnZpZGVvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IGVhLT52aWRlb19jb2RlYzsKKyAgICAgICAgLy8gcGFyc2luZyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBGRm1wZWcgZ2VuZXJhdGUgY29ycmVjdCB0aW1lc3RhbXBzCisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8pCisgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IDA7IC8qIG5vIGZvdXJjYyAqLworICAgICAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgID0gZWEtPndpZHRoOworICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgID0gZWEtPmhlaWdodDsKKyAgICAgICAgc3QtPmR1cmF0aW9uICAgICAgICAgICA9IHN0LT5uYl9mcmFtZXMgPSBlYS0+bmJfZnJhbWVzOworICAgICAgICBpZiAoZWEtPnRpbWVfYmFzZS5udW0pCisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgZWEtPnRpbWVfYmFzZS5udW0sIGVhLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgc3QtPnJfZnJhbWVfcmF0ZSAgICAgICA9CisgICAgICAgIHN0LT5hdmdfZnJhbWVfcmF0ZSAgICAgPSBhdl9pbnZfcShlYS0+dGltZV9iYXNlKTsKKyAgICB9CisKKyAgICBpZiAoZWEtPmF1ZGlvX2NvZGVjKSB7CisgICAgICAgIGlmIChlYS0+bnVtX2NoYW5uZWxzIDw9IDAgfHwgZWEtPm51bV9jaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAlZFxuIiwgZWEtPm51bV9jaGFubmVscyk7CisgICAgICAgICAgICBlYS0+YXVkaW9fY29kZWMgPSAwOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVhLT5zYW1wbGVfcmF0ZSA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZTogJWRcbiIsIGVhLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBlYS0+YXVkaW9fY29kZWMgPSAwOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVhLT5ieXRlcyA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlOiAlZFxuIiwgZWEtPmJ5dGVzKTsKKyAgICAgICAgICAgIGVhLT5hdWRpb19jb2RlYyA9IEFWX0NPREVDX0lEX05PTkU7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGluaXRpYWxpemUgdGhlIGF1ZGlvIGRlY29kZXIgc3RyZWFtICovCisgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCBlYS0+c2FtcGxlX3JhdGUpOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBlYS0+YXVkaW9fY29kZWM7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgICAgICAgICAgID0gMDsgICAvKiBubyB0YWcgKi8KKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgICAgICAgPSBlYS0+bnVtX2NoYW5uZWxzOworICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgICAgICAgICA9IGVhLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBlYS0+Ynl0ZXMgKiA4OworICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgICAgICAgICAgICA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC8gNDsKKyAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiAgICAgICAgICAgPSBzdC0+Y29kZWMtPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgZWEtPmF1ZGlvX3N0cmVhbV9pbmRleCAgICAgICAgICAgPSBzdC0+aW5kZXg7CisgICAgICAgIHN0LT5zdGFydF90aW1lICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBlYV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgRWFEZW11eENvbnRleHQgKmVhID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiAgICA9IHMtPnBiOworICAgIGludCBwYXJ0aWFsX3BhY2tldCA9IDA7CisgICAgdW5zaWduZWQgaW50IGNodW5rX3R5cGUsIGNodW5rX3NpemU7CisgICAgaW50IHJldCA9IDAsIHBhY2tldF9yZWFkID0gMCwga2V5ID0gMDsKKyAgICBpbnQgYXZfdW5pbml0KG51bV9zYW1wbGVzKTsKKworICAgIHdoaWxlICghcGFja2V0X3JlYWQgfHwgcGFydGlhbF9wYWNrZXQpIHsKKyAgICAgICAgY2h1bmtfdHlwZSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGNodW5rX3NpemUgPSBlYS0+YmlnX2VuZGlhbiA/IGF2aW9fcmIzMihwYikgOiBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgY2h1bmtfc2l6ZSAtPSA4OworCisgICAgICAgIHN3aXRjaCAoY2h1bmtfdHlwZSkgeworICAgICAgICAvKiBhdWRpbyBkYXRhICovCisgICAgICAgIGNhc2UgSVNOaF9UQUc6CisgICAgICAgICAgICAvKiBoZWFkZXIgY2h1bmsgYWxzbyBjb250YWlucyBkYXRhOyBza2lwIG92ZXIgdGhlIGhlYWRlciBwb3J0aW9uICovCisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDMyKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCAzMik7CisgICAgICAgICAgICBjaHVua19zaXplIC09IDMyOworICAgICAgICBjYXNlIElTTmRfVEFHOgorICAgICAgICBjYXNlIFNDRGxfVEFHOgorICAgICAgICBjYXNlIFNORENfVEFHOgorICAgICAgICBjYXNlIFNERU5fVEFHOgorICAgICAgICAgICAgaWYgKCFlYS0+YXVkaW9fY29kZWMpIHsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIGNodW5rX3NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChlYS0+YXVkaW9fY29kZWMgPT0gQVZfQ09ERUNfSURfUENNX1MxNkxFX1BMQU5BUiB8fAorICAgICAgICAgICAgICAgICAgICAgICBlYS0+YXVkaW9fY29kZWMgPT0gQVZfQ09ERUNfSURfTVAzKSB7CisgICAgICAgICAgICAgICAgbnVtX3NhbXBsZXMgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSAtPSAxMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcnRpYWxfcGFja2V0KSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJ2aWRlbyBoZWFkZXIgZm9sbG93ZWQgYnkgYXVkaW8gcGFja2V0Iik7CisgICAgICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgICAgICBwYXJ0aWFsX3BhY2tldCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghY2h1bmtfc2l6ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBjaHVua19zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGVhLT5hdWRpb19zdHJlYW1faW5kZXg7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZWEtPmF1ZGlvX2NvZGVjKSB7CisgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0VBOgorICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9SMToKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRUFfUjI6CisgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9FQV9FQUNTOgorICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9SMzoKKyAgICAgICAgICAgICAgICBpZiAocGt0LT5zaXplIDwgNCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGlzIHRvbyBzaG9ydFxuIik7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZWEtPmF1ZGlvX2NvZGVjID09IEFWX0NPREVDX0lEX0FEUENNX0VBX1IzKQorICAgICAgICAgICAgICAgICAgICBwa3QtPmR1cmF0aW9uID0gQVZfUkIzMihwa3QtPmRhdGEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IEFWX1JMMzIocGt0LT5kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX0VBX1NFQUQ6CisgICAgICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IHJldCAqIDIgLyBlYS0+bnVtX2NoYW5uZWxzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEVfUExBTkFSOgorICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDM6CisgICAgICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IG51bV9zYW1wbGVzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwa3QtPmR1cmF0aW9uID0gY2h1bmtfc2l6ZSAvIChlYS0+Ynl0ZXMgKiBlYS0+bnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFja2V0X3JlYWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogZW5kaW5nIHRhZyAqLworICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgSVNOZV9UQUc6CisgICAgICAgIGNhc2UgU0NFbF9UQUc6CisgICAgICAgIGNhc2UgU0VORF9UQUc6CisgICAgICAgIGNhc2UgU0VFTl9UQUc6CisgICAgICAgICAgICByZXQgICAgICAgICA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIHBhY2tldF9yZWFkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTVZJaF9UQUc6CisgICAgICAgIGNhc2Uga1ZHVF9UQUc6CisgICAgICAgIGNhc2UgcFFHVF9UQUc6CisgICAgICAgIGNhc2UgVEdRc19UQUc6CisgICAgICAgIGNhc2UgTUFEa19UQUc6CisgICAgICAgICAgICBrZXkgPSBBVl9QS1RfRkxBR19LRVk7CisgICAgICAgIGNhc2UgTVZJZl9UQUc6CisgICAgICAgIGNhc2UgZlZHVF9UQUc6CisgICAgICAgIGNhc2UgTUFEbV9UQUc6CisgICAgICAgIGNhc2UgTUFEZV9UQUc6CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIC04LCBTRUVLX0NVUik7ICAgIC8vIGluY2x1ZGUgY2h1bmsgcHJlYW1ibGUKKyAgICAgICAgICAgIGNodW5rX3NpemUgKz0gODsKKyAgICAgICAgICAgIGdvdG8gZ2V0X3ZpZGVvX3BhY2tldDsKKworICAgICAgICBjYXNlIG1UQ0RfVEFHOgorICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCA4KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDgpOyAgICAgICAgICAgICAgIC8vIHNraXAgZWEgRENUIGhlYWRlcgorICAgICAgICAgICAgY2h1bmtfc2l6ZSAtPSA4OworICAgICAgICAgICAgZ290byBnZXRfdmlkZW9fcGFja2V0OworCisgICAgICAgIGNhc2UgTVYwS19UQUc6CisgICAgICAgIGNhc2UgTVBDaF9UQUc6CisgICAgICAgIGNhc2UgcElRVF9UQUc6CisgICAgICAgICAgICBrZXkgPSBBVl9QS1RfRkxBR19LRVk7CisgICAgICAgIGNhc2UgTVYwRl9UQUc6CitnZXRfdmlkZW9fcGFja2V0OgorICAgICAgICAgICAgaWYgKCFjaHVua19zaXplKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAocGFydGlhbF9wYWNrZXQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBhdl9hcHBlbmRfcGFja2V0KHBiLCBwa3QsIGNodW5rX3NpemUpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBjaHVua19zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgcGFja2V0X3JlYWQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFydGlhbF9wYWNrZXQgPSBjaHVua190eXBlID09IE1WSWhfVEFHOworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBlYS0+dmlkZW9fc3RyZWFtX2luZGV4OworICAgICAgICAgICAgcGt0LT5mbGFncyAgICAgICB8PSBrZXk7CisgICAgICAgICAgICBwYWNrZXRfcmVhZCAgICAgICA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZpb19za2lwKHBiLCBjaHVua19zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldCA8IDAgJiYgcGFydGlhbF9wYWNrZXQpCisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9lYV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJlYSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkVsZWN0cm9uaWMgQXJ0cyBNdWx0aW1lZGlhIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEVhRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBlYV9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBlYV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBlYV9yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZXBhZmRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2VwYWZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzM3ODkyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2VwYWZkZWMuYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIEVuc29uaXEgUGFyaXMgQXVkaW8gRmlsZSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInBjbS5oIgorCitzdGF0aWMgaW50IGVwYWZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKCgoQVZfUkwzMihwLT5idWYpID09IE1LVEFHKCdmJywnYScsJ3AnLCcgJykgJiYKKyAgICAgICAgICBBVl9STDMyKHAtPmJ1ZiArIDgpID09IDEpIHx8CisgICAgICAgICAoQVZfUkwzMihwLT5idWYpID09IE1LVEFHKCcgJywncCcsJ2EnLCdmJykgJiYKKyAgICAgICAgICBBVl9STjMyKHAtPmJ1ZiArIDgpID09IDApKSAmJgorICAgICAgICFBVl9STjMyKHAtPmJ1ZiArICA0KSAmJiBBVl9STjMyKHAtPmJ1ZiArIDEyKSAmJgorICAgICAgICBBVl9STjMyKHAtPmJ1ZiArIDIwKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gNCAqIDM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXBhZl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGxlLCBzYW1wbGVfcmF0ZSwgY29kZWMsIGNoYW5uZWxzOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIGF2aW9fc2tpcChzLT5wYiwgNCk7CisgICAgaWYgKGF2aW9fcmwzMihzLT5wYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgbGUgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIGlmIChsZSAmJiBsZSAhPSAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChsZSkgeworICAgICAgICBzYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgIGNvZGVjICAgICAgID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICAgICAgY2hhbm5lbHMgICAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICAgICAgY29kZWMgICAgICAgPSBhdmlvX3JiMzIocy0+cGIpOworICAgICAgICBjaGFubmVscyAgICA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgfQorCisgICAgaWYgKCFjaGFubmVscyB8fCAhc2FtcGxlX3JhdGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBjaGFubmVsczsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisgICAgc3dpdGNoIChjb2RlYykgeworICAgIGNhc2UgMDoKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGxlID8gQVZfQ09ERUNfSURfUENNX1MxNkxFIDogQVZfQ09ERUNfSURfUENNX1MxNkJFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICIyNC1iaXQgUGFyaXMgUENNIGZvcm1hdCIpOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKTsKKyAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWMtPmNoYW5uZWxzIC8gODsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKworICAgIGlmIChhdmlvX3NraXAocy0+cGIsIDIwMjQpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfZXBhZl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJlcGFmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRW5zb25pcSBQYXJpcyBBdWRpbyBGaWxlIiksCisgICAgLnJlYWRfcHJvYmUgICAgID0gZXBhZl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBlcGFmX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZmX3BjbV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSBmZl9wY21fcmVhZF9zZWVrLAorICAgIC5leHRlbnNpb25zICAgICA9ICJwYWYsZmFwIiwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9mZm0uaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mZm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzkyYjhkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZmbS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBGRk0gKGZmc2VydmVyIGxpdmUgZmVlZCkgY29tbW9uIGhlYWRlcgorICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX0ZGTV9ICisjZGVmaW5lIEFWRk9STUFUX0ZGTV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW8uaCIKKworLyogVGhlIEZGTSBmaWxlIGlzIG1hZGUgb2YgYmxvY2tzIG9mIGZpeGVkIHNpemUgKi8KKyNkZWZpbmUgRkZNX0hFQURFUl9TSVpFIDE0CisjZGVmaW5lIEZGTV9QQUNLRVRfU0laRSA0MDk2CisjZGVmaW5lIFBBQ0tFVF9JRCAgICAgICAweDY2NmQKKworLyogZWFjaCBwYWNrZXQgY29udGFpbnMgZnJhbWVzICh3aGljaCBjYW4gc3BhbiBzZXZlcmFsIHBhY2tldHMgKi8KKyNkZWZpbmUgRlJBTUVfSEVBREVSX1NJWkUgICAgMTYKKyNkZWZpbmUgRkxBR19LRVlfRlJBTUUgICAgICAgMHgwMQorI2RlZmluZSBGTEFHX0RUUyAgICAgICAgICAgICAweDAyCisKK2VudW0geworICAgIFJFQURfSEVBREVSLAorICAgIFJFQURfREFUQSwKK307CisKK3R5cGVkZWYgc3RydWN0IEZGTUNvbnRleHQgeworICAgIC8qIG9ubHkgcmVhZGluZyBtb2RlICovCisgICAgaW50NjRfdCB3cml0ZV9pbmRleCwgZmlsZV9zaXplOworICAgIGludCByZWFkX3N0YXRlOworICAgIHVpbnQ4X3QgaGVhZGVyW0ZSQU1FX0hFQURFUl9TSVpFKzRdOworCisgICAgLyogcmVhZCBhbmQgd3JpdGUgKi8KKyAgICBpbnQgZmlyc3RfcGFja2V0OyAvKiB0cnVlIGlmIGZpcnN0IHBhY2tldCwgbmVlZGVkIHRvIHNldCB0aGUgZGlzY29udGludWl0eSB0YWcgKi8KKyAgICBpbnQgcGFja2V0X3NpemU7CisgICAgaW50IGZyYW1lX29mZnNldDsKKyAgICBpbnQ2NF90IGR0czsKKyAgICB1aW50OF90ICpwYWNrZXRfcHRyLCAqcGFja2V0X2VuZDsKKyAgICB1aW50OF90IHBhY2tldFtGRk1fUEFDS0VUX1NJWkVdOworICAgIGludDY0X3Qgc3RhcnRfdGltZTsKK30gRkZNQ29udGV4dDsKKworI2VuZGlmIC8qIEFWRk9STUFUX0ZGTV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZmZtZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmZtZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3ZjQxOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mZm1kZWMuYwpAQCAtMCwwICsxLDcyMyBAQAorLyoKKyAqIEZGTSAoZmZzZXJ2ZXIgbGl2ZSBmZWVkKSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImZmbS5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKworc3RhdGljIGludCBmZm1faXNfYXZhaWxfZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIGludCBzaXplKQoreworICAgIEZGTUNvbnRleHQgKmZmbSA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IHBvcywgYXZhaWxfc2l6ZTsKKyAgICBpbnQgbGVuOworCisgICAgbGVuID0gZmZtLT5wYWNrZXRfZW5kIC0gZmZtLT5wYWNrZXRfcHRyOworICAgIGlmIChzaXplIDw9IGxlbikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBpZiAoIWZmbS0+d3JpdGVfaW5kZXgpIHsKKyAgICAgICAgaWYgKHBvcyA9PSBmZm0tPmZpbGVfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICAgICAgYXZhaWxfc2l6ZSA9IGZmbS0+ZmlsZV9zaXplIC0gcG9zOworICAgIH0gZWxzZSB7CisgICAgaWYgKHBvcyA9PSBmZm0tPndyaXRlX2luZGV4KSB7CisgICAgICAgIC8qIGV4YWN0bHkgYXQgdGhlIGVuZCBvZiBzdHJlYW0gKi8KKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9IGVsc2UgaWYgKHBvcyA8IGZmbS0+d3JpdGVfaW5kZXgpIHsKKyAgICAgICAgYXZhaWxfc2l6ZSA9IGZmbS0+d3JpdGVfaW5kZXggLSBwb3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZhaWxfc2l6ZSA9IChmZm0tPmZpbGVfc2l6ZSAtIHBvcykgKyAoZmZtLT53cml0ZV9pbmRleCAtIEZGTV9QQUNLRVRfU0laRSk7CisgICAgfQorICAgIH0KKyAgICBhdmFpbF9zaXplID0gKGF2YWlsX3NpemUgLyBmZm0tPnBhY2tldF9zaXplKSAqIChmZm0tPnBhY2tldF9zaXplIC0gRkZNX0hFQURFUl9TSVpFKSArIGxlbjsKKyAgICBpZiAoc2l6ZSA8PSBhdmFpbF9zaXplKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7Cit9CisKK3N0YXRpYyBpbnQgZmZtX3Jlc3luYyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdGF0ZSkKK3sKKyAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicmVzeW5jaW5nXG4iKTsKKyAgICB3aGlsZSAoc3RhdGUgIT0gUEFDS0VUX0lEKSB7CisgICAgICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY2Fubm90IGZpbmQgRkZNIHN5bmN3b3JkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSA9IChzdGF0ZSA8PCA4KSB8IGF2aW9fcjgocy0+cGIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogZmlyc3QgaXMgdHJ1ZSBpZiB3ZSByZWFkIHRoZSBmcmFtZSBoZWFkZXIgKi8KK3N0YXRpYyBpbnQgZmZtX3JlYWRfZGF0YShBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSwgaW50IGhlYWRlcikKK3sKKyAgICBGRk1Db250ZXh0ICpmZm0gPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGxlbiwgZmlsbF9zaXplLCBzaXplMSwgZnJhbWVfb2Zmc2V0LCBpZDsKKworICAgIHNpemUxID0gc2l6ZTsKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICByZWRvOgorICAgICAgICBsZW4gPSBmZm0tPnBhY2tldF9lbmQgLSBmZm0tPnBhY2tldF9wdHI7CisgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAobGVuID4gc2l6ZSkKKyAgICAgICAgICAgIGxlbiA9IHNpemU7CisgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgaWYgKGF2aW9fdGVsbChwYikgPT0gZmZtLT5maWxlX3NpemUpCisgICAgICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBmZm0tPnBhY2tldF9zaXplLCBTRUVLX1NFVCk7CisgICAgcmV0cnlfcmVhZDoKKyAgICAgICAgICAgIGlmIChwYi0+YnVmZmVyX3NpemUgIT0gZmZtLT5wYWNrZXRfc2l6ZSkgeworICAgICAgICAgICAgICAgIGludDY0X3QgdGVsbCA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICAgICAgZmZpb19zZXRfYnVmX3NpemUocGIsIGZmbS0+cGFja2V0X3NpemUpOworICAgICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgdGVsbCwgU0VFS19TRVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWQgPSBhdmlvX3JiMTYocGIpOyAvKiBQQUNLRVRfSUQgKi8KKyAgICAgICAgICAgIGlmIChpZCAhPSBQQUNLRVRfSUQpCisgICAgICAgICAgICAgICAgaWYgKGZmbV9yZXN5bmMocywgaWQpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgZmlsbF9zaXplID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIGZmbS0+ZHRzID0gYXZpb19yYjY0KHBiKTsKKyAgICAgICAgICAgIGZyYW1lX29mZnNldCA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBhdmlvX3JlYWQocGIsIGZmbS0+cGFja2V0LCBmZm0tPnBhY2tldF9zaXplIC0gRkZNX0hFQURFUl9TSVpFKTsKKyAgICAgICAgICAgIGZmbS0+cGFja2V0X2VuZCA9IGZmbS0+cGFja2V0ICsgKGZmbS0+cGFja2V0X3NpemUgLSBGRk1fSEVBREVSX1NJWkUgLSBmaWxsX3NpemUpOworICAgICAgICAgICAgaWYgKGZmbS0+cGFja2V0X2VuZCA8IGZmbS0+cGFja2V0IHx8IGZyYW1lX29mZnNldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgLyogaWYgZmlyc3QgcGFja2V0IG9yIHJlc3luY2hyb25pemF0aW9uIHBhY2tldCwgd2UgbXVzdAorICAgICAgICAgICAgICAgaGFuZGxlIGl0IHNwZWNpZmljYWxseSAqLworICAgICAgICAgICAgaWYgKGZmbS0+Zmlyc3RfcGFja2V0IHx8IChmcmFtZV9vZmZzZXQgJiAweDgwMDApKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmcmFtZV9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBwYWNrZXQgaGFzIG5vIGZyYW1lIGhlYWRlcnMgaW4gaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2aW9fdGVsbChwYikgPj0gZmZtLT5wYWNrZXRfc2l6ZSAqIDNMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZpb19zZWVrKHBiLCAtZmZtLT5wYWNrZXRfc2l6ZSAqIDJMTCwgU0VFS19DVVIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXRyeV9yZWFkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYmFkLCB3ZSBjYW5ub3QgZmluZCBhIHZhbGlkIGZyYW1lIGhlYWRlciAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmZtLT5maXJzdF9wYWNrZXQgPSAwOworICAgICAgICAgICAgICAgIGlmICgoZnJhbWVfb2Zmc2V0ICYgMHg3ZmZmKSA8IEZGTV9IRUFERVJfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGZmbS0+cGFja2V0X3B0ciA9IGZmbS0+cGFja2V0ICsgKGZyYW1lX29mZnNldCAmIDB4N2ZmZikgLSBGRk1fSEVBREVSX1NJWkU7CisgICAgICAgICAgICAgICAgaWYgKCFoZWFkZXIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmZm0tPnBhY2tldF9wdHIgPSBmZm0tPnBhY2tldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gcmVkbzsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmLCBmZm0tPnBhY2tldF9wdHIsIGxlbik7CisgICAgICAgIGJ1ZiArPSBsZW47CisgICAgICAgIGZmbS0+cGFja2V0X3B0ciArPSBsZW47CisgICAgICAgIHNpemUgLT0gbGVuOworICAgICAgICBoZWFkZXIgPSAwOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTEgLSBzaXplOworfQorCisvKiBlbnN1cmUgdGhhdCBhY3V0YWwgc2Vla2luZyBoYXBwZW5zIGJldHdlZW4gRkZNX1BBQ0tFVF9TSVpFCisgICBhbmQgZmlsZV9zaXplIC0gRkZNX1BBQ0tFVF9TSVpFICovCitzdGF0aWMgaW50NjRfdCBmZm1fc2VlazEoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IHBvczEpCit7CisgICAgRkZNQ29udGV4dCAqZmZtID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludDY0X3QgcG9zOworCisgICAgcG9zID0gRkZNSU4ocG9zMSwgZmZtLT5maWxlX3NpemUgLSBGRk1fUEFDS0VUX1NJWkUpOworICAgIHBvcyA9IEZGTUFYKHBvcywgRkZNX1BBQ0tFVF9TSVpFKTsKKyAgICBhdl9kbG9nKHMsICJzZWVrIHRvICUiUFJJeDY0IiAtPiAlIlBSSXg2NCJcbiIsIHBvczEsIHBvcyk7CisgICAgcmV0dXJuIGF2aW9fc2VlayhwYiwgcG9zLCBTRUVLX1NFVCk7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldF9kdHMoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IHBvcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQ2NF90IGR0czsKKworICAgIGZmbV9zZWVrMShzLCBwb3MpOworICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgZHRzID0gYXZpb19yYjY0KHBiKTsKKyAgICBhdl9kbG9nKHMsICJkdHM9JTAuNmZcbiIsIGR0cyAvIDEwMDAwMDAuMCk7CisgICAgcmV0dXJuIGR0czsKK30KKworc3RhdGljIHZvaWQgYWRqdXN0X3dyaXRlX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBGRk1Db250ZXh0ICpmZm0gPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50NjRfdCBwdHM7CisgICAgLy9pbnQ2NF90IG9yaWdfd3JpdGVfaW5kZXggPSBmZm0tPndyaXRlX2luZGV4OworICAgIGludDY0X3QgcG9zX21pbiwgcG9zX21heDsKKyAgICBpbnQ2NF90IHB0c19zdGFydDsKKyAgICBpbnQ2NF90IHB0ciA9IGF2aW9fdGVsbChwYik7CisKKworICAgIHBvc19taW4gPSAwOworICAgIHBvc19tYXggPSBmZm0tPmZpbGVfc2l6ZSAtIDIgKiBGRk1fUEFDS0VUX1NJWkU7CisKKyAgICBwdHNfc3RhcnQgPSBnZXRfZHRzKHMsIHBvc19taW4pOworCisgICAgcHRzID0gZ2V0X2R0cyhzLCBwb3NfbWF4KTsKKworICAgIGlmIChwdHMgLSAxMDAwMDAgPiBwdHNfc3RhcnQpCisgICAgICAgIGdvdG8gZW5kOworCisgICAgZmZtLT53cml0ZV9pbmRleCA9IEZGTV9QQUNLRVRfU0laRTsKKworICAgIHB0c19zdGFydCA9IGdldF9kdHMocywgcG9zX21pbik7CisKKyAgICBwdHMgPSBnZXRfZHRzKHMsIHBvc19tYXgpOworCisgICAgaWYgKHB0cyAtIDEwMDAwMCA8PSBwdHNfc3RhcnQpIHsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGludDY0X3QgbmV3cG9zOworICAgICAgICAgICAgaW50NjRfdCBuZXdwdHM7CisKKyAgICAgICAgICAgIG5ld3BvcyA9ICgocG9zX21heCArIHBvc19taW4pIC8gKDIgKiBGRk1fUEFDS0VUX1NJWkUpKSAqIEZGTV9QQUNLRVRfU0laRTsKKworICAgICAgICAgICAgaWYgKG5ld3BvcyA9PSBwb3NfbWluKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBuZXdwdHMgPSBnZXRfZHRzKHMsIG5ld3Bvcyk7CisKKyAgICAgICAgICAgIGlmIChuZXdwdHMgLSAxMDAwMDAgPD0gcHRzKSB7CisgICAgICAgICAgICAgICAgcG9zX21heCA9IG5ld3BvczsKKyAgICAgICAgICAgICAgICBwdHMgPSBuZXdwdHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBvc19taW4gPSBuZXdwb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmZtLT53cml0ZV9pbmRleCArPSBwb3NfbWF4OworICAgIH0KKworIGVuZDoKKyAgICBhdmlvX3NlZWsocGIsIHB0ciwgU0VFS19TRVQpOworfQorCisKK3N0YXRpYyBpbnQgZmZtX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZzLT5zdHJlYW1zW2ldLT5jb2RlYy0+cmNfZXEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmZtX2FwcGVuZF9yZWNvbW1lbmRlZF9jb25maWd1cmF0aW9uKEFWU3RyZWFtICpzdCwgY2hhciAqKmNvbmYpCit7CisgICAgaW50IHJldDsKKyAgICBzaXplX3QgbmV3c2l6ZTsKKyAgICBhdl9hc3NlcnQwKGNvbmYgJiYgc3QpOworICAgIGlmICghKmNvbmYpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghc3QtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbikgeworICAgICAgICBzdC0+cmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uID0gKmNvbmY7CisgICAgICAgICpjb25mID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG5ld3NpemUgPSBzdHJsZW4oKmNvbmYpICsgc3RybGVuKHN0LT5yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24pICsgMjsKKyAgICBpZiAoKHJldCA9IGF2X3JlYWxsb2NwKCZzdC0+cmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uLCBuZXdzaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGF2X3N0cmxjYXQoc3QtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbiwgIiwiLCBuZXdzaXplKTsKKyAgICBhdl9zdHJsY2F0KHN0LT5yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24sICpjb25mLCBuZXdzaXplKTsKKyAgICBhdl9mcmVlcChjb25mKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZm0yX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBGRk1Db250ZXh0ICpmZm0gPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYzsKKyAgICBpbnQgcmV0OworICAgIGludCBmX21haW4gPSAwLCBmX2NwcnYsIGZfc3R2aSwgZl9zdGF1OworICAgIEFWQ29kZWMgKmVuYzsKKyAgICBjaGFyICpidWZmZXI7CisKKyAgICBmZm0tPnBhY2tldF9zaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZiAoZmZtLT5wYWNrZXRfc2l6ZSAhPSBGRk1fUEFDS0VUX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGFja2V0IHNpemUgJWQsIGV4cGVjdGVkIHNpemUgd2FzICVkXG4iLAorICAgICAgICAgICAgICAgZmZtLT5wYWNrZXRfc2l6ZSwgRkZNX1BBQ0tFVF9TSVpFKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZmbS0+d3JpdGVfaW5kZXggPSBhdmlvX3JiNjQocGIpOworICAgIC8qIGdldCBhbHNvIGZpbGVzaXplICovCisgICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgICAgICBmZm0tPmZpbGVfc2l6ZSA9IGF2aW9fc2l6ZShwYik7CisgICAgICAgIGlmIChmZm0tPndyaXRlX2luZGV4ICYmIDApCisgICAgICAgICAgICBhZGp1c3Rfd3JpdGVfaW5kZXgocyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmZtLT5maWxlX3NpemUgPSAoVUlOVDY0X0MoMSkgPDwgNjMpIC0gMTsKKyAgICB9CisKKyAgICB3aGlsZSghYXZpb19mZW9mKHBiKSkgeworICAgICAgICB1bnNpZ25lZCBpZCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIHVuc2lnbmVkIHNpemUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBpbnQ2NF90IG5leHQgPSBhdmlvX3RlbGwocGIpICsgc2l6ZTsKKyAgICAgICAgY2hhciByY19lcV9idWZbMTI4XTsKKworICAgICAgICBpZighaWQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBzd2l0Y2goaWQpIHsKKyAgICAgICAgY2FzZSBNS0JFVEFHKCdNJywgJ0EnLCAnSScsICdOJyk6CisgICAgICAgICAgICBpZiAoZl9tYWluKyspIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb19yYjMyKHBiKTsgLyogbmJfc3RyZWFtcyAqLworICAgICAgICAgICAgYXZpb19yYjMyKHBiKTsgLyogdG90YWwgYml0cmF0ZSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtCRVRBRygnQycsICdPJywgJ00nLCAnTScpOgorICAgICAgICAgICAgZl9jcHJ2ID0gZl9zdHZpID0gZl9zdGF1ID0gMDsKKyAgICAgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghc3QpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMDAwMCk7CisKKyAgICAgICAgICAgIGNvZGVjID0gc3QtPmNvZGVjOworICAgICAgICAgICAgLyogZ2VuZXJpYyBpbmZvICovCisgICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPmNvZGVjX3R5cGUgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5iaXRfcmF0ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+ZmxhZ3MgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPmZsYWdzMiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+ZGVidWcgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgaWYgKGNvZGVjLT5mbGFncyAmIENPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikgeworICAgICAgICAgICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKGNvZGVjLCBwYiwgYXZpb19yYjMyKHBiKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtCRVRBRygnUycsICdUJywgJ1YnLCAnSScpOgorICAgICAgICAgICAgaWYgKGZfc3R2aSsrKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGVjLT50aW1lX2Jhc2UubnVtID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT50aW1lX2Jhc2UuZGVuID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT53aWR0aCA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBjb2RlYy0+aGVpZ2h0ID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5nb3Bfc2l6ZSA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBjb2RlYy0+cGl4X2ZtdCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+cW1pbiA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgY29kZWMtPnFtYXggPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5tYXhfcWRpZmYgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5xY29tcHJlc3MgPSBhdmlvX3JiMTYocGIpIC8gMTAwMDAuMDsKKyAgICAgICAgICAgIGNvZGVjLT5xYmx1ciA9IGF2aW9fcmIxNihwYikgLyAxMDAwMC4wOworICAgICAgICAgICAgY29kZWMtPmJpdF9yYXRlX3RvbGVyYW5jZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBhdmlvX2dldF9zdHIocGIsIElOVF9NQVgsIHJjX2VxX2J1Ziwgc2l6ZW9mKHJjX2VxX2J1ZikpOworICAgICAgICAgICAgY29kZWMtPnJjX2VxID0gYXZfc3RyZHVwKHJjX2VxX2J1Zik7CisgICAgICAgICAgICBjb2RlYy0+cmNfbWF4X3JhdGUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPnJjX21pbl9yYXRlID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5yY19idWZmZXJfc2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+aV9xdWFudF9mYWN0b3IgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOworICAgICAgICAgICAgY29kZWMtPmJfcXVhbnRfZmFjdG9yID0gYXZfaW50MmRvdWJsZShhdmlvX3JiNjQocGIpKTsKKyAgICAgICAgICAgIGNvZGVjLT5pX3F1YW50X29mZnNldCA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7CisgICAgICAgICAgICBjb2RlYy0+Yl9xdWFudF9vZmZzZXQgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOworICAgICAgICAgICAgY29kZWMtPmRjdF9hbGdvID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPm1heF9iX2ZyYW1lcyA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+bXBlZ19xdWFudCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+aW50cmFfZGNfcHJlY2lzaW9uID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5tZV9tZXRob2QgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPm1iX2RlY2lzaW9uID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5uc3NlX3dlaWdodCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+ZnJhbWVfc2tpcF9jbXAgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPnJjX2J1ZmZlcl9hZ2dyZXNzaXZpdHkgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOworICAgICAgICAgICAgY29kZWMtPmNvZGVjX3RhZyA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+dGhyZWFkX2NvdW50ID0gYXZpb19yOChwYik7CisgICAgICAgICAgICBjb2RlYy0+Y29kZXJfdHlwZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+bWVfY21wID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5tZV9zdWJwZWxfcXVhbGl0eSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+bWVfcmFuZ2UgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPmtleWludF9taW4gPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPnNjZW5lY2hhbmdlX3RocmVzaG9sZCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+Yl9mcmFtZV9zdHJhdGVneSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+cWNvbXByZXNzID0gYXZfaW50MmRvdWJsZShhdmlvX3JiNjQocGIpKTsKKyAgICAgICAgICAgIGNvZGVjLT5xYmx1ciA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7CisgICAgICAgICAgICBjb2RlYy0+bWF4X3FkaWZmID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5yZWZzID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LQkVUQUcoJ1MnLCAnVCcsICdBJywgJ1UnKToKKyAgICAgICAgICAgIGlmIChmX3N0YXUrKykgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPmNoYW5uZWxzID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5mcmFtZV9zaXplID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LQkVUQUcoJ0MnLCAnUCcsICdSJywgJ1YnKToKKyAgICAgICAgICAgIGlmIChmX2NwcnYrKykgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmMgPSBhdmNvZGVjX2ZpbmRfZW5jb2Rlcihjb2RlYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgaWYgKGVuYyAmJiBlbmMtPnByaXZfZGF0YV9zaXplICYmIGVuYy0+cHJpdl9jbGFzcykgeworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGF2X21hbGxvYyhzaXplICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF2aW9fZ2V0X3N0cihwYiwgc2l6ZSwgYnVmZmVyLCBzaXplICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZm1fYXBwZW5kX3JlY29tbWVuZGVkX2NvbmZpZ3VyYXRpb24oc3QsICZidWZmZXIpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LQkVUQUcoJ1MnLCAnMicsICdWJywgJ0knKToKKyAgICAgICAgICAgIGlmIChmX3N0dmkrKykgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIgPSBhdl9tYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmlvX2dldF9zdHIocGIsIElOVF9NQVgsIGJ1ZmZlciwgc2l6ZSk7CisgICAgICAgICAgICBhdl9zZXRfb3B0aW9uc19zdHJpbmcoY29kZWMsIGJ1ZmZlciwgIj0iLCAiLCIpOworICAgICAgICAgICAgaWYgKChyZXQgPSBmZm1fYXBwZW5kX3JlY29tbWVuZGVkX2NvbmZpZ3VyYXRpb24oc3QsICZidWZmZXIpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtCRVRBRygnUycsICcyJywgJ0EnLCAnVScpOgorICAgICAgICAgICAgaWYgKGZfc3RhdSsrKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlciA9IGF2X21hbGxvYyhzaXplKTsKKyAgICAgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fZ2V0X3N0cihwYiwgSU5UX01BWCwgYnVmZmVyLCBzaXplKTsKKyAgICAgICAgICAgIGF2X3NldF9vcHRpb25zX3N0cmluZyhjb2RlYywgYnVmZmVyLCAiPSIsICIsIik7CisgICAgICAgICAgICBmZm1fYXBwZW5kX3JlY29tbWVuZGVkX2NvbmZpZ3VyYXRpb24oc3QsICZidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19zZWVrKHBiLCBuZXh0LCBTRUVLX1NFVCk7CisgICAgfQorCisgICAgLyogZ2V0IHVudGlsIGVuZCBvZiBibG9jayByZWFjaGVkICovCisgICAgd2hpbGUgKChhdmlvX3RlbGwocGIpICUgZmZtLT5wYWNrZXRfc2l6ZSkgIT0gMCkKKyAgICAgICAgYXZpb19yOChwYik7CisKKyAgICAvKiBpbml0IHBhY2tldCBkZW11eCAqLworICAgIGZmbS0+cGFja2V0X3B0ciA9IGZmbS0+cGFja2V0OworICAgIGZmbS0+cGFja2V0X2VuZCA9IGZmbS0+cGFja2V0OworICAgIGZmbS0+ZnJhbWVfb2Zmc2V0ID0gMDsKKyAgICBmZm0tPmR0cyA9IDA7CisgICAgZmZtLT5yZWFkX3N0YXRlID0gUkVBRF9IRUFERVI7CisgICAgZmZtLT5maXJzdF9wYWNrZXQgPSAxOworICAgIHJldHVybiAwOworIGZhaWw6CisgICAgZmZtX2Nsb3NlKHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmZtX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBGRk1Db250ZXh0ICpmZm0gPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYzsKKyAgICBpbnQgaSwgbmJfc3RyZWFtczsKKyAgICB1aW50MzJfdCB0YWc7CisKKyAgICAvKiBoZWFkZXIgKi8KKyAgICB0YWcgPSBhdmlvX3JsMzIocGIpOworICAgIGlmICh0YWcgPT0gTUtUQUcoJ0YnLCAnRicsICdNJywgJzInKSkKKyAgICAgICAgcmV0dXJuIGZmbTJfcmVhZF9oZWFkZXIocyk7CisgICAgaWYgKHRhZyAhPSBNS1RBRygnRicsICdGJywgJ00nLCAnMScpKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZmZtLT5wYWNrZXRfc2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgaWYgKGZmbS0+cGFja2V0X3NpemUgIT0gRkZNX1BBQ0tFVF9TSVpFKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZmZtLT53cml0ZV9pbmRleCA9IGF2aW9fcmI2NChwYik7CisgICAgLyogZ2V0IGFsc28gZmlsZXNpemUgKi8KKyAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIGZmbS0+ZmlsZV9zaXplID0gYXZpb19zaXplKHBiKTsKKyAgICAgICAgaWYgKGZmbS0+d3JpdGVfaW5kZXggJiYgMCkKKyAgICAgICAgICAgIGFkanVzdF93cml0ZV9pbmRleChzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmZm0tPmZpbGVfc2l6ZSA9IChVSU5UNjRfQygxKSA8PCA2MykgLSAxOworICAgIH0KKworICAgIG5iX3N0cmVhbXMgPSBhdmlvX3JiMzIocGIpOworICAgIGF2aW9fcmIzMihwYik7IC8qIHRvdGFsIGJpdHJhdGUgKi8KKyAgICAvKiByZWFkIGVhY2ggc3RyZWFtICovCisgICAgZm9yKGk9MDtpPG5iX3N0cmVhbXM7aSsrKSB7CisgICAgICAgIGNoYXIgcmNfZXFfYnVmWzEyOF07CisKKyAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsKKworICAgICAgICBjb2RlYyA9IHN0LT5jb2RlYzsKKyAgICAgICAgLyogZ2VuZXJpYyBpbmZvICovCisgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGNvZGVjLT5jb2RlY190eXBlID0gYXZpb19yOChwYik7IC8qIGNvZGVjX3R5cGUgKi8KKyAgICAgICAgY29kZWMtPmJpdF9yYXRlID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgY29kZWMtPmZsYWdzID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgY29kZWMtPmZsYWdzMiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGNvZGVjLT5kZWJ1ZyA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIC8qIHNwZWNpZmljIGluZm8gKi8KKyAgICAgICAgc3dpdGNoKGNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgY29kZWMtPnRpbWVfYmFzZS5udW0gPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPnRpbWVfYmFzZS5kZW4gPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPndpZHRoID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5oZWlnaHQgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgY29kZWMtPmdvcF9zaXplID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5waXhfZm10ID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5xbWluID0gYXZpb19yOChwYik7CisgICAgICAgICAgICBjb2RlYy0+cW1heCA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgY29kZWMtPm1heF9xZGlmZiA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgY29kZWMtPnFjb21wcmVzcyA9IGF2aW9fcmIxNihwYikgLyAxMDAwMC4wOworICAgICAgICAgICAgY29kZWMtPnFibHVyID0gYXZpb19yYjE2KHBiKSAvIDEwMDAwLjA7CisgICAgICAgICAgICBjb2RlYy0+Yml0X3JhdGVfdG9sZXJhbmNlID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGF2aW9fZ2V0X3N0cihwYiwgSU5UX01BWCwgcmNfZXFfYnVmLCBzaXplb2YocmNfZXFfYnVmKSk7CisgICAgICAgICAgICBjb2RlYy0+cmNfZXEgPSBhdl9zdHJkdXAocmNfZXFfYnVmKTsKKyAgICAgICAgICAgIGNvZGVjLT5yY19tYXhfcmF0ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+cmNfbWluX3JhdGUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPnJjX2J1ZmZlcl9zaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5pX3F1YW50X2ZhY3RvciA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7CisgICAgICAgICAgICBjb2RlYy0+Yl9xdWFudF9mYWN0b3IgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOworICAgICAgICAgICAgY29kZWMtPmlfcXVhbnRfb2Zmc2V0ID0gYXZfaW50MmRvdWJsZShhdmlvX3JiNjQocGIpKTsKKyAgICAgICAgICAgIGNvZGVjLT5iX3F1YW50X29mZnNldCA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7CisgICAgICAgICAgICBjb2RlYy0+ZGN0X2FsZ28gPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+bWF4X2JfZnJhbWVzID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5tcGVnX3F1YW50ID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5pbnRyYV9kY19wcmVjaXNpb24gPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPm1lX21ldGhvZCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+bWJfZGVjaXNpb24gPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPm5zc2Vfd2VpZ2h0ID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5mcmFtZV9za2lwX2NtcCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+cmNfYnVmZmVyX2FnZ3Jlc3Npdml0eSA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7CisgICAgICAgICAgICBjb2RlYy0+Y29kZWNfdGFnID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT50aHJlYWRfY291bnQgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5jb2Rlcl90eXBlID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5tZV9jbXAgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPm1lX3N1YnBlbF9xdWFsaXR5ID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5tZV9yYW5nZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+a2V5aW50X21pbiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjb2RlYy0+c2NlbmVjaGFuZ2VfdGhyZXNob2xkID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5iX2ZyYW1lX3N0cmF0ZWd5ID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5xY29tcHJlc3MgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOworICAgICAgICAgICAgY29kZWMtPnFibHVyID0gYXZfaW50MmRvdWJsZShhdmlvX3JiNjQocGIpKTsKKyAgICAgICAgICAgIGNvZGVjLT5tYXhfcWRpZmYgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29kZWMtPnJlZnMgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgY29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNvZGVjLT5jaGFubmVscyA9IGF2aW9fcmwxNihwYik7CisgICAgICAgICAgICBjb2RlYy0+ZnJhbWVfc2l6ZSA9IGF2aW9fcmwxNihwYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWMtPmZsYWdzICYgQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSB7CisgICAgICAgICAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShjb2RlYywgcGIsIGF2aW9fcmIzMihwYikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IHVudGlsIGVuZCBvZiBibG9jayByZWFjaGVkICovCisgICAgd2hpbGUgKChhdmlvX3RlbGwocGIpICUgZmZtLT5wYWNrZXRfc2l6ZSkgIT0gMCkKKyAgICAgICAgYXZpb19yOChwYik7CisKKyAgICAvKiBpbml0IHBhY2tldCBkZW11eCAqLworICAgIGZmbS0+cGFja2V0X3B0ciA9IGZmbS0+cGFja2V0OworICAgIGZmbS0+cGFja2V0X2VuZCA9IGZmbS0+cGFja2V0OworICAgIGZmbS0+ZnJhbWVfb2Zmc2V0ID0gMDsKKyAgICBmZm0tPmR0cyA9IDA7CisgICAgZmZtLT5yZWFkX3N0YXRlID0gUkVBRF9IRUFERVI7CisgICAgZmZtLT5maXJzdF9wYWNrZXQgPSAxOworICAgIHJldHVybiAwOworIGZhaWw6CisgICAgZmZtX2Nsb3NlKHMpOworICAgIHJldHVybiAtMTsKK30KKworLyogcmV0dXJuIDwgMCBpZiBlb2YgKi8KK3N0YXRpYyBpbnQgZmZtX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgc2l6ZTsKKyAgICBGRk1Db250ZXh0ICpmZm0gPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGR1cmF0aW9uLCByZXQ7CisKKyAgICBzd2l0Y2goZmZtLT5yZWFkX3N0YXRlKSB7CisgICAgY2FzZSBSRUFEX0hFQURFUjoKKyAgICAgICAgaWYgKChyZXQgPSBmZm1faXNfYXZhaWxfZGF0YShzLCBGUkFNRV9IRUFERVJfU0laRSs0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBhdl9kbG9nKHMsICJwb3M9JTA4IlBSSXg2NCIgc3Bvcz0lIlBSSXg2NCIsIHdyaXRlX2luZGV4PSUiUFJJeDY0IiBzaXplPSUiUFJJeDY0IlxuIiwKKyAgICAgICAgICAgICAgIGF2aW9fdGVsbChzLT5wYiksIHMtPnBiLT5wb3MsIGZmbS0+d3JpdGVfaW5kZXgsIGZmbS0+ZmlsZV9zaXplKTsKKyAgICAgICAgaWYgKGZmbV9yZWFkX2RhdGEocywgZmZtLT5oZWFkZXIsIEZSQU1FX0hFQURFUl9TSVpFLCAxKSAhPQorICAgICAgICAgICAgRlJBTUVfSEVBREVSX1NJWkUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChmZm0tPmhlYWRlclsxXSAmIEZMQUdfRFRTKQorICAgICAgICAgICAgaWYgKGZmbV9yZWFkX2RhdGEocywgZmZtLT5oZWFkZXIrMTYsIDQsIDEpICE9IDQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBmZm0tPnJlYWRfc3RhdGUgPSBSRUFEX0RBVEE7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgUkVBRF9EQVRBOgorICAgICAgICBzaXplID0gQVZfUkIyNChmZm0tPmhlYWRlciArIDIpOworICAgICAgICBpZiAoKHJldCA9IGZmbV9pc19hdmFpbF9kYXRhKHMsIHNpemUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGR1cmF0aW9uID0gQVZfUkIyNChmZm0tPmhlYWRlciArIDUpOworCisgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gZmZtLT5oZWFkZXJbMF07CisgICAgICAgIGlmICgodW5zaWduZWQpcGt0LT5zdHJlYW1faW5kZXggPj0gcy0+bmJfc3RyZWFtcykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc3RyZWFtIGluZGV4ICVkXG4iLCBwa3QtPnN0cmVhbV9pbmRleCk7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgZmZtLT5yZWFkX3N0YXRlID0gUkVBRF9IRUFERVI7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcGt0LT5wb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICBpZiAoZmZtLT5oZWFkZXJbMV0gJiBGTEFHX0tFWV9GUkFNRSkKKyAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgICAgIGZmbS0+cmVhZF9zdGF0ZSA9IFJFQURfSEVBREVSOworICAgICAgICBpZiAoZmZtX3JlYWRfZGF0YShzLCBwa3QtPmRhdGEsIHNpemUsIDApICE9IHNpemUpIHsKKyAgICAgICAgICAgIC8qIGJhZCBjYXNlOiBkZXN5bmNocm9uaXplZCBwYWNrZXQuIHdlIGNhbmNlbCBhbGwgdGhlIHBhY2tldCBsb2FkaW5nICovCisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHBrdC0+cHRzID0gQVZfUkI2NChmZm0tPmhlYWRlcis4KTsKKyAgICAgICAgaWYgKGZmbS0+aGVhZGVyWzFdICYgRkxBR19EVFMpCisgICAgICAgICAgICBwa3QtPmR0cyA9IHBrdC0+cHRzIC0gQVZfUkIzMihmZm0tPmhlYWRlcisxNik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBrdC0+ZHRzID0gcGt0LT5wdHM7CisgICAgICAgIHBrdC0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBzZWVrIHRvIGEgZ2l2ZW4gdGltZSBpbiB0aGUgZmlsZS4gVGhlIGZpbGUgcmVhZCBwb2ludGVyIGlzCisgICBwb3NpdGlvbmVkIGF0IG9yIGJlZm9yZSBwdHMuIFhYWDogdGhlIGZvbGxvd2luZyBjb2RlIGlzIHF1aXRlCisgICBhcHByb3hpbWF0aXZlICovCitzdGF0aWMgaW50IGZmbV9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB3YW50ZWRfcHRzLCBpbnQgZmxhZ3MpCit7CisgICAgRkZNQ29udGV4dCAqZmZtID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgcG9zX21pbiwgcG9zX21heCwgcG9zOworICAgIGludDY0X3QgcHRzX21pbiwgcHRzX21heCwgcHRzOworICAgIGRvdWJsZSBwb3MxOworCisgICAgYXZfZGxvZyhzLCAid2FudGVkX3B0cz0lMC42ZlxuIiwgd2FudGVkX3B0cyAvIDEwMDAwMDAuMCk7CisgICAgLyogZmluZCB0aGUgcG9zaXRpb24gdXNpbmcgbGluZWFyIGludGVycG9sYXRpb24gKGJldHRlciB0aGFuCisgICAgICAgZGljaG90b215IGluIHR5cGljYWwgY2FzZXMpICovCisgICAgaWYgKGZmbS0+d3JpdGVfaW5kZXggJiYgZmZtLT53cml0ZV9pbmRleCA8IGZmbS0+ZmlsZV9zaXplKSB7CisgICAgICAgIGlmIChnZXRfZHRzKHMsIEZGTV9QQUNLRVRfU0laRSkgPCB3YW50ZWRfcHRzKSB7CisgICAgICAgICAgICBwb3NfbWluID0gRkZNX1BBQ0tFVF9TSVpFOworICAgICAgICAgICAgcG9zX21heCA9IGZmbS0+d3JpdGVfaW5kZXggLSBGRk1fUEFDS0VUX1NJWkU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwb3NfbWluID0gZmZtLT53cml0ZV9pbmRleDsKKyAgICAgICAgICAgIHBvc19tYXggPSBmZm0tPmZpbGVfc2l6ZSAtIEZGTV9QQUNLRVRfU0laRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBvc19taW4gPSBGRk1fUEFDS0VUX1NJWkU7CisgICAgICAgIHBvc19tYXggPSBmZm0tPmZpbGVfc2l6ZSAtIEZGTV9QQUNLRVRfU0laRTsKKyAgICB9CisgICAgd2hpbGUgKHBvc19taW4gPD0gcG9zX21heCkgeworICAgICAgICBwdHNfbWluID0gZ2V0X2R0cyhzLCBwb3NfbWluKTsKKyAgICAgICAgcHRzX21heCA9IGdldF9kdHMocywgcG9zX21heCk7CisgICAgICAgIGlmIChwdHNfbWluID4gd2FudGVkX3B0cyB8fCBwdHNfbWF4IDw9IHdhbnRlZF9wdHMpIHsKKyAgICAgICAgICAgIHBvcyA9IHB0c19taW4gPiB3YW50ZWRfcHRzID8gcG9zX21pbiA6IHBvc19tYXg7CisgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgICAgICB9CisgICAgICAgIC8qIGxpbmVhciBpbnRlcnBvbGF0aW9uICovCisgICAgICAgIHBvczEgPSAoZG91YmxlKShwb3NfbWF4IC0gcG9zX21pbikgKiAoZG91YmxlKSh3YW50ZWRfcHRzIC0gcHRzX21pbikgLworICAgICAgICAgICAgKGRvdWJsZSkocHRzX21heCAtIHB0c19taW4pOworICAgICAgICBwb3MgPSAoKChpbnQ2NF90KXBvczEpIC8gRkZNX1BBQ0tFVF9TSVpFKSAqIEZGTV9QQUNLRVRfU0laRTsKKyAgICAgICAgaWYgKHBvcyA8PSBwb3NfbWluKQorICAgICAgICAgICAgcG9zID0gcG9zX21pbjsKKyAgICAgICAgZWxzZSBpZiAocG9zID49IHBvc19tYXgpCisgICAgICAgICAgICBwb3MgPSBwb3NfbWF4OworICAgICAgICBwdHMgPSBnZXRfZHRzKHMsIHBvcyk7CisgICAgICAgIC8qIGNoZWNrIGlmIHdlIGFyZSBsdWNreSAqLworICAgICAgICBpZiAocHRzID09IHdhbnRlZF9wdHMpIHsKKyAgICAgICAgICAgIGdvdG8gZm91bmQ7CisgICAgICAgIH0gZWxzZSBpZiAocHRzID4gd2FudGVkX3B0cykgeworICAgICAgICAgICAgcG9zX21heCA9IHBvcyAtIEZGTV9QQUNLRVRfU0laRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBvc19taW4gPSBwb3MgKyBGRk1fUEFDS0VUX1NJWkU7CisgICAgICAgIH0KKyAgICB9CisgICAgcG9zID0gKGZsYWdzICYgQVZTRUVLX0ZMQUdfQkFDS1dBUkQpID8gcG9zX21pbiA6IHBvc19tYXg7CisKKyBmb3VuZDoKKyAgICBpZiAoZmZtX3NlZWsxKHMsIHBvcykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiByZXNldCByZWFkIHN0YXRlICovCisgICAgZmZtLT5yZWFkX3N0YXRlID0gUkVBRF9IRUFERVI7CisgICAgZmZtLT5wYWNrZXRfcHRyID0gZmZtLT5wYWNrZXQ7CisgICAgZmZtLT5wYWNrZXRfZW5kID0gZmZtLT5wYWNrZXQ7CisgICAgZmZtLT5maXJzdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmZtX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmICgKKyAgICAgICAgcC0+YnVmWzBdID09ICdGJyAmJiBwLT5idWZbMV0gPT0gJ0YnICYmIHAtPmJ1ZlsyXSA9PSAnTScgJiYKKyAgICAgICAgKHAtPmJ1ZlszXSA9PSAnMScgfHwgcC0+YnVmWzNdID09ICcyJykpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCArIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfZmZtX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImZmbSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZGTSAoRkZzZXJ2ZXIgbGl2ZSBmZWVkKSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRk1Db250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBmZm1fcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZmZtX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZmbV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBmZm1fY2xvc2UsCisgICAgLnJlYWRfc2VlayAgICAgID0gZmZtX3NlZWssCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZmbWVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZmbWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDFhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmZtZW5jLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBGRk0gKGZmc2VydmVyIGxpdmUgZmVlZCkgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZmZtLmgiCisKK3N0YXRpYyB2b2lkIGZsdXNoX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgRkZNQ29udGV4dCAqZmZtID0gcy0+cHJpdl9kYXRhOworICAgIGludCBmaWxsX3NpemUsIGg7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICBmaWxsX3NpemUgPSBmZm0tPnBhY2tldF9lbmQgLSBmZm0tPnBhY2tldF9wdHI7CisgICAgbWVtc2V0KGZmbS0+cGFja2V0X3B0ciwgMCwgZmlsbF9zaXplKTsKKworICAgIGF2X2Fzc2VydDEoYXZpb190ZWxsKHBiKSAlIGZmbS0+cGFja2V0X3NpemUgPT0gMCk7CisKKyAgICAvKiBwdXQgaGVhZGVyICovCisgICAgYXZpb193YjE2KHBiLCBQQUNLRVRfSUQpOworICAgIGF2aW9fd2IxNihwYiwgZmlsbF9zaXplKTsKKyAgICBhdmlvX3diNjQocGIsIGZmbS0+ZHRzKTsKKyAgICBoID0gZmZtLT5mcmFtZV9vZmZzZXQ7CisgICAgaWYgKGZmbS0+Zmlyc3RfcGFja2V0KQorICAgICAgICBoIHw9IDB4ODAwMDsKKyAgICBhdmlvX3diMTYocGIsIGgpOworICAgIGF2aW9fd3JpdGUocGIsIGZmbS0+cGFja2V0LCBmZm0tPnBhY2tldF9lbmQgLSBmZm0tPnBhY2tldCk7CisgICAgYXZpb19mbHVzaChwYik7CisKKyAgICAvKiBwcmVwYXJlIG5leHQgcGFja2V0ICovCisgICAgZmZtLT5mcmFtZV9vZmZzZXQgPSAwOyAvKiBubyBrZXkgZnJhbWUgKi8KKyAgICBmZm0tPnBhY2tldF9wdHIgPSBmZm0tPnBhY2tldDsKKyAgICBmZm0tPmZpcnN0X3BhY2tldCA9IDA7Cit9CisKKy8qICdmaXJzdCcgaXMgdHJ1ZSBpZiBmaXJzdCBkYXRhIG9mIGEgZnJhbWUgKi8KK3N0YXRpYyB2b2lkIGZmbV93cml0ZV9kYXRhKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR0cywgaW50IGhlYWRlcikKK3sKKyAgICBGRk1Db250ZXh0ICpmZm0gPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGxlbjsKKworICAgIGlmIChoZWFkZXIgJiYgZmZtLT5mcmFtZV9vZmZzZXQgPT0gMCkgeworICAgICAgICBmZm0tPmZyYW1lX29mZnNldCA9IGZmbS0+cGFja2V0X3B0ciAtIGZmbS0+cGFja2V0ICsgRkZNX0hFQURFUl9TSVpFOworICAgICAgICBmZm0tPmR0cyA9IGR0czsKKyAgICB9CisKKyAgICAvKiB3cml0ZSBhcyBtYW55IHBhY2tldHMgYXMgbmVlZGVkICovCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGxlbiA9IGZmbS0+cGFja2V0X2VuZCAtIGZmbS0+cGFja2V0X3B0cjsKKyAgICAgICAgaWYgKGxlbiA+IHNpemUpCisgICAgICAgICAgICBsZW4gPSBzaXplOworICAgICAgICBtZW1jcHkoZmZtLT5wYWNrZXRfcHRyLCBidWYsIGxlbik7CisKKyAgICAgICAgZmZtLT5wYWNrZXRfcHRyICs9IGxlbjsKKyAgICAgICAgYnVmICs9IGxlbjsKKyAgICAgICAgc2l6ZSAtPSBsZW47CisgICAgICAgIGlmIChmZm0tPnBhY2tldF9wdHIgPj0gZmZtLT5wYWNrZXRfZW5kKQorICAgICAgICAgICAgZmx1c2hfcGFja2V0KHMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgd3JpdGVfaGVhZGVyX2NodW5rKEFWSU9Db250ZXh0ICpwYiwgQVZJT0NvbnRleHQgKmRwYiwgdW5zaWduZWQgaWQpCit7CisgICAgdWludDhfdCAqZHluX2J1ZjsKKyAgICBpbnQgZHluX3NpemU9IGF2aW9fY2xvc2VfZHluX2J1ZihkcGIsICZkeW5fYnVmKTsKKyAgICBhdmlvX3diMzIocGIsIGlkKTsKKyAgICBhdmlvX3diMzIocGIsIGR5bl9zaXplKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBkeW5fYnVmLCBkeW5fc2l6ZSk7CisgICAgYXZfZnJlZShkeW5fYnVmKTsKK30KKworc3RhdGljIGludCBmZm1fd3JpdGVfaGVhZGVyX2NvZGVjX3ByaXZhdGVfY3R4KEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY0NvbnRleHQgKmN0eCwgaW50IHR5cGUpCit7CisgICAgQVZJT0NvbnRleHQgKnRtcDsKKyAgICBjaGFyICpidWYgPSBOVUxMOworICAgIGludCByZXQ7CisgICAgY29uc3QgQVZDb2RlYyAqZW5jID0gY3R4LT5jb2RlYyA/IGN0eC0+Y29kZWMgOiBhdmNvZGVjX2ZpbmRfZW5jb2RlcihjdHgtPmNvZGVjX2lkKTsKKworICAgIGlmICghZW5jKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGlmIChjdHgtPnByaXZfZGF0YSAmJiBlbmMtPnByaXZfY2xhc3MgJiYgZW5jLT5wcml2X2RhdGFfc2l6ZSkgeworICAgICAgICBpZiAoKHJldCA9IGF2X29wdF9zZXJpYWxpemUoY3R4LT5wcml2X2RhdGEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIHwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRVJJQUxJWkVfU0tJUF9ERUZBVUxUUywgJmJ1ZiwgJz0nLCAnLCcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoYnVmICYmIHN0cmxlbihidWYpKSB7CisgICAgICAgICAgICBpZiAoYXZpb19vcGVuX2R5bl9idWYoJnRtcCkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmlvX3B1dF9zdHIodG1wLCBidWYpOworICAgICAgICAgICAgd3JpdGVfaGVhZGVyX2NodW5rKHBiLCB0bXAsIE1LQkVUQUcoJ0MnLCAnUCcsICdSJywgJ1YnKSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZShidWYpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZm1fd3JpdGVfaGVhZGVyX2NvZGVjX2N0eChBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNDb250ZXh0ICpjdHgsIHVuc2lnbmVkIHRhZywgaW50IHR5cGUpCit7CisgICAgQVZJT0NvbnRleHQgKnRtcDsKKyAgICBjaGFyICpidWYgPSBOVUxMOworICAgIHVpbnQ4X3QgKnAgPSBOVUxMOworICAgIGludCByZXQsIG5lZWRfY29tYSA9IDA7CisKKyNkZWZpbmUgU0tJUF9ERUZBVUxUUyAgIEFWX09QVF9TRVJJQUxJWkVfU0tJUF9ERUZBVUxUUworI2RlZmluZSBPUFRfRkxBR1NfRVhBQ1QgQVZfT1BUX1NFUklBTElaRV9PUFRfRkxBR1NfRVhBQ1QKKyNkZWZpbmUgRU5DICAgICAgICAgICAgIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCisKKyAgICBpZiAoYXZpb19vcGVuX2R5bl9idWYoJnRtcCkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmICgocmV0ID0gYXZfb3B0X3NlcmlhbGl6ZShjdHgsIEVOQyB8IHR5cGUsIFNLSVBfREVGQVVMVFMsICZidWYsICc9JywgJywnKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKGJ1ZiAmJiBzdHJsZW4oYnVmKSkgeworICAgICAgICBhdmlvX3dyaXRlKHRtcCwgYnVmLCBzdHJsZW4oYnVmKSk7CisgICAgICAgIGF2X2ZyZWUoYnVmKTsKKyAgICAgICAgbmVlZF9jb21hID0gMTsKKyAgICB9CisgICAgaWYgKChyZXQgPSBhdl9vcHRfc2VyaWFsaXplKGN0eCwgMCwgU0tJUF9ERUZBVUxUUyB8IE9QVF9GTEFHU19FWEFDVCwgJmJ1ZiwgJz0nLCAnLCcpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoYnVmICYmIHN0cmxlbihidWYpKSB7CisgICAgICAgIGlmIChuZWVkX2NvbWEpCisgICAgICAgICAgICBhdmlvX3c4KHRtcCwgJywnKTsKKyAgICAgICAgYXZpb193cml0ZSh0bXAsIGJ1Ziwgc3RybGVuKGJ1ZikpOworICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgfQorICAgIGF2aW9fdzgodG1wLCAwKTsKKyAgICB3cml0ZV9oZWFkZXJfY2h1bmsocGIsIHRtcCwgdGFnKTsKKyAgICByZXR1cm4gMDsKKyAgZmFpbDoKKyAgICBhdl9mcmVlKGJ1Zik7CisgICAgYXZpb19jbG9zZV9keW5fYnVmKHRtcCwgJnApOworICAgIGF2X2ZyZWUocCk7CisgICAgcmV0dXJuIHJldDsKKworI3VuZGVmIFNLSVBfREVGQVVMVFMKKyN1bmRlZiBPUFRfRkxBR1NfRVhBQ1QKKyN1bmRlZiBFTkMKK30KKworc3RhdGljIGludCBmZm1fd3JpdGVfcmVjb21tZW5kZWRfY29uZmlnKEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY0NvbnRleHQgKmN0eCwgdW5zaWduZWQgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbmZpZ3VyYXRpb24pCit7CisgICAgaW50IHJldDsKKyAgICBjb25zdCBBVkNvZGVjICplbmMgPSBjdHgtPmNvZGVjID8gY3R4LT5jb2RlYyA6IGF2Y29kZWNfZmluZF9lbmNvZGVyKGN0eC0+Y29kZWNfaWQpOworICAgIEFWSU9Db250ZXh0ICp0bXA7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBOVUxMOworICAgIEFWRGljdGlvbmFyeSAqYWxsID0gTlVMTCwgKmNvbW0gPSBOVUxMLCAqcHJ2ID0gTlVMTDsKKyAgICBjaGFyICpidWYgPSBOVUxMOworCisgICAgaWYgKCFlbmMgfHwgIWVuYy0+cHJpdl9jbGFzcyB8fCAhZW5jLT5wcml2X2RhdGFfc2l6ZSkgeworICAgICAgICAvKiBjb2RlYyBpcyBub3Qga25vd24vaGFzIG5vIHByaXZhdGUgb3B0aW9ucywgc28gc2F2ZSBldmVyeXRoaW5nIGFzIGNvbW1vbiBvcHRpb25zICovCisgICAgICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmdG1wKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhdmlvX3B1dF9zdHIodG1wLCBjb25maWd1cmF0aW9uKTsKKyAgICAgICAgd3JpdGVfaGVhZGVyX2NodW5rKHBiLCB0bXAsIHRhZyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfZGljdF9wYXJzZV9zdHJpbmcoJmFsbCwgY29uZmlndXJhdGlvbiwgIj0iLCAiLCIsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICB3aGlsZSAoKHQgPSBhdl9kaWN0X2dldChhbGwsICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICBpZiAoYXZfb3B0X2ZpbmQoKHZvaWQgKikmZW5jLT5wcml2X2NsYXNzLCB0LT5rZXksIE5VTEwsIDAsIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X2RpY3Rfc2V0KCZwcnYsIHQtPmtleSwgdC0+dmFsdWUsIDApKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9IGVsc2UgaWYgKChyZXQgPSBhdl9kaWN0X3NldCgmY29tbSwgdC0+a2V5LCB0LT52YWx1ZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoY29tbSkgeworICAgICAgICBpZiAoKHJldCA9IGF2X2RpY3RfZ2V0X3N0cmluZyhjb21tLCAmYnVmLCAnPScsICcsJykpIDwgMCB8fAorICAgICAgICAgICAgKHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZ0bXApKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGF2aW9fcHV0X3N0cih0bXAsIGJ1Zik7CisgICAgICAgIGF2X2ZyZWVwKCZidWYpOworICAgICAgICB3cml0ZV9oZWFkZXJfY2h1bmsocGIsIHRtcCwgdGFnKTsKKyAgICB9CisgICAgaWYgKHBydikgeworICAgICAgICBpZiAoKHJldCA9IGF2X2RpY3RfZ2V0X3N0cmluZyhwcnYsICZidWYsICc9JywgJywnKSkgPCAwIHx8CisgICAgICAgICAgICAocmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJnRtcCkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgYXZpb19wdXRfc3RyKHRtcCwgYnVmKTsKKyAgICAgICAgd3JpdGVfaGVhZGVyX2NodW5rKHBiLCB0bXAsIE1LQkVUQUcoJ0MnLCAnUCcsICdSJywgJ1YnKSk7CisgICAgfQorCisgIGZhaWw6CisgICAgYXZfZnJlZShidWYpOworICAgIGF2X2RpY3RfZnJlZSgmYWxsKTsKKyAgICBhdl9kaWN0X2ZyZWUoJmNvbW0pOworICAgIGF2X2RpY3RfZnJlZSgmcHJ2KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZmbV93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEZGTUNvbnRleHQgKmZmbSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdDsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjOworICAgIGludCBiaXRfcmF0ZSwgaSwgcmV0OworCisgICAgaWYgKHQgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgImNyZWF0aW9uX3RpbWUiLCBOVUxMLCAwKSkgeworICAgICAgICByZXQgPSBhdl9wYXJzZV90aW1lKCZmZm0tPnN0YXJ0X3RpbWUsIHQtPnZhbHVlLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGZmbS0+cGFja2V0X3NpemUgPSBGRk1fUEFDS0VUX1NJWkU7CisKKyAgICAvKiBoZWFkZXIgKi8KKyAgICBhdmlvX3dsMzIocGIsIE1LVEFHKCdGJywgJ0YnLCAnTScsICcyJykpOworICAgIGF2aW9fd2IzMihwYiwgZmZtLT5wYWNrZXRfc2l6ZSk7CisgICAgYXZpb193YjY0KHBiLCAwKTsgLyogY3VycmVudCB3cml0ZSBwb3NpdGlvbiAqLworCisgICAgaWYoYXZpb19vcGVuX2R5bl9idWYoJnBiKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmlvX3diMzIocGIsIHMtPm5iX3N0cmVhbXMpOworICAgIGJpdF9yYXRlID0gMDsKKyAgICBmb3IoaT0wO2k8cy0+bmJfc3RyZWFtcztpKyspIHsKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBiaXRfcmF0ZSArPSBzdC0+Y29kZWMtPmJpdF9yYXRlOworICAgIH0KKyAgICBhdmlvX3diMzIocGIsIGJpdF9yYXRlKTsKKworICAgIHdyaXRlX2hlYWRlcl9jaHVuayhzLT5wYiwgcGIsIE1LQkVUQUcoJ00nLCAnQScsICdJJywgJ04nKSk7CisKKyAgICAvKiBsaXN0IG9mIHN0cmVhbXMgKi8KKyAgICBmb3IoaT0wO2k8cy0+bmJfc3RyZWFtcztpKyspIHsKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMDAwMCk7CisgICAgICAgIGlmKGF2aW9fb3Blbl9keW5fYnVmKCZwYikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBjb2RlYyA9IHN0LT5jb2RlYzsKKyAgICAgICAgLyogZ2VuZXJpYyBpbmZvICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgY29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgYXZpb193OChwYiwgY29kZWMtPmNvZGVjX3R5cGUpOworICAgICAgICBhdmlvX3diMzIocGIsIGNvZGVjLT5iaXRfcmF0ZSk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgY29kZWMtPmZsYWdzKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBjb2RlYy0+ZmxhZ3MyKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBjb2RlYy0+ZGVidWcpOworICAgICAgICBpZiAoY29kZWMtPmZsYWdzICYgQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSB7CisgICAgICAgICAgICBhdmlvX3diMzIocGIsIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBjb2RlYy0+ZXh0cmFkYXRhLCBjb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIHdyaXRlX2hlYWRlcl9jaHVuayhzLT5wYiwgcGIsIE1LQkVUQUcoJ0MnLCAnTycsICdNJywgJ00nKSk7CisgICAgICAgIC8qIHNwZWNpZmljIGluZm8gKi8KKyAgICAgICAgc3dpdGNoKGNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgaWYgKHN0LT5yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAid3JpdGluZyByZWNvbW1lbmRlZCBjb25maWd1cmF0aW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3QtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZm1fd3JpdGVfcmVjb21tZW5kZWRfY29uZmlnKHMtPnBiLCBjb2RlYywgTUtCRVRBRygnUycsICcyJywgJ1YnLCAnSScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+cmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChyZXQgPSBmZm1fd3JpdGVfaGVhZGVyX2NvZGVjX2N0eChzLT5wYiwgY29kZWMsIE1LQkVUQUcoJ1MnLCAnMicsICdWJywgJ0knKSwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0pKSA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKHJldCA9IGZmbV93cml0ZV9oZWFkZXJfY29kZWNfcHJpdmF0ZV9jdHgocy0+cGIsIGNvZGVjLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgaWYgKHN0LT5yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAid3JpdGluZyByZWNvbW1lbmRlZCBjb25maWd1cmF0aW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3QtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZm1fd3JpdGVfcmVjb21tZW5kZWRfY29uZmlnKHMtPnBiLCBjb2RlYywgTUtCRVRBRygnUycsICcyJywgJ0EnLCAnVScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+cmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChyZXQgPSBmZm1fd3JpdGVfaGVhZGVyX2NvZGVjX2N0eChzLT5wYiwgY29kZWMsIE1LQkVUQUcoJ1MnLCAnMicsICdBJywgJ1UnKSwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0pKSA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIChyZXQgPSBmZm1fd3JpdGVfaGVhZGVyX2NvZGVjX3ByaXZhdGVfY3R4KHMtPnBiLCBjb2RlYywgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0pKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIHBiID0gcy0+cGI7CisKKyAgICBhdmlvX3diNjQocGIsIDApOyAvLyBlbmQgb2YgaGVhZGVyCisKKyAgICAvKiBmbHVzaCB1bnRpbCBlbmQgb2YgYmxvY2sgcmVhY2hlZCAqLworICAgIHdoaWxlICgoYXZpb190ZWxsKHBiKSAlIGZmbS0+cGFja2V0X3NpemUpICE9IDApCisgICAgICAgIGF2aW9fdzgocGIsIDApOworCisgICAgYXZpb19mbHVzaChwYik7CisKKyAgICAvKiBpbml0IHBhY2tldCBtdXggKi8KKyAgICBmZm0tPnBhY2tldF9wdHIgPSBmZm0tPnBhY2tldDsKKyAgICBmZm0tPnBhY2tldF9lbmQgPSBmZm0tPnBhY2tldCArIGZmbS0+cGFja2V0X3NpemUgLSBGRk1fSEVBREVSX1NJWkU7CisgICAgYXZfYXNzZXJ0MChmZm0tPnBhY2tldF9lbmQgPj0gZmZtLT5wYWNrZXQpOworICAgIGZmbS0+ZnJhbWVfb2Zmc2V0ID0gMDsKKyAgICBmZm0tPmR0cyA9IDA7CisgICAgZmZtLT5maXJzdF9wYWNrZXQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmZtX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgRkZNQ29udGV4dCAqZmZtID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgZHRzOworICAgIHVpbnQ4X3QgaGVhZGVyW0ZSQU1FX0hFQURFUl9TSVpFKzRdOworICAgIGludCBoZWFkZXJfc2l6ZSA9IEZSQU1FX0hFQURFUl9TSVpFOworCisgICAgZHRzID0gZmZtLT5zdGFydF90aW1lICsgcGt0LT5kdHM7CisgICAgLyogcGFja2V0IHNpemUgJiBrZXlfZnJhbWUgKi8KKyAgICBoZWFkZXJbMF0gPSBwa3QtPnN0cmVhbV9pbmRleDsKKyAgICBoZWFkZXJbMV0gPSAwOworICAgIGlmIChwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKQorICAgICAgICBoZWFkZXJbMV0gfD0gRkxBR19LRVlfRlJBTUU7CisgICAgQVZfV0IyNChoZWFkZXIrMiwgcGt0LT5zaXplKTsKKyAgICBBVl9XQjI0KGhlYWRlcis1LCBwa3QtPmR1cmF0aW9uKTsKKyAgICBBVl9XQjY0KGhlYWRlcis4LCBmZm0tPnN0YXJ0X3RpbWUgKyBwa3QtPnB0cyk7CisgICAgaWYgKHBrdC0+cHRzICE9IHBrdC0+ZHRzKSB7CisgICAgICAgIGhlYWRlclsxXSB8PSBGTEFHX0RUUzsKKyAgICAgICAgQVZfV0IzMihoZWFkZXIrMTYsIHBrdC0+cHRzIC0gcGt0LT5kdHMpOworICAgICAgICBoZWFkZXJfc2l6ZSArPSA0OworICAgIH0KKyAgICBmZm1fd3JpdGVfZGF0YShzLCBoZWFkZXIsIGhlYWRlcl9zaXplLCBkdHMsIDEpOworICAgIGZmbV93cml0ZV9kYXRhKHMsIHBrdC0+ZGF0YSwgcGt0LT5zaXplLCBkdHMsIDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmZtX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEZGTUNvbnRleHQgKmZmbSA9IHMtPnByaXZfZGF0YTsKKworICAgIC8qIGZsdXNoIHBhY2tldHMgKi8KKyAgICBpZiAoZmZtLT5wYWNrZXRfcHRyID4gZmZtLT5wYWNrZXQpCisgICAgICAgIGZsdXNoX3BhY2tldChzKTsKKworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9mZm1fbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImZmbSIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZGTSAoRkZzZXJ2ZXIgbGl2ZSBmZWVkKSIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJmZm0iLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihGRk1Db250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUDIsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzFWSURFTywKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBmZm1fd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmbV93cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgICAgID0gZmZtX3dyaXRlX3RyYWlsZXIsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfVFNfTkVHQVRJVkUsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZmbWV0YS5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZmbWV0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODc3OGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmZtZXRhLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvbW1vbiBkYXRhIGZvciBtZXRhZGF0YSBtdXhlci9kZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQW50b24gS2hpcm5vdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX0ZGTUVUQV9ICisjZGVmaW5lIEFWRk9STUFUX0ZGTUVUQV9ICisKKyNkZWZpbmUgSURfU1RSSU5HICAiO0ZGTUVUQURBVEEiCisjZGVmaW5lIElEX0NIQVBURVIgIltDSEFQVEVSXSIKKyNkZWZpbmUgSURfU1RSRUFNICAiW1NUUkVBTV0iCisKKyNlbmRpZiAvKiBBVkZPUk1BVF9GRk1FVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZmbWV0YWRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZmbWV0YWRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjY0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmZtZXRhZGVjLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBNZXRhZGF0YSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQW50b24gS2hpcm5vdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJmZm1ldGEuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisKK3N0YXRpYyBpbnQgcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYoIW1lbWNtcChwLT5idWYsIElEX1NUUklORywgc3RybGVuKElEX1NUUklORykpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9saW5lKEFWSU9Db250ZXh0ICpzLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIGRvIHsKKyAgICAgICAgdWludDhfdCBjOworICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgd2hpbGUgKChjID0gYXZpb19yOChzKSkpIHsKKyAgICAgICAgICAgIGlmIChjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IHNpemUgLSAxKQorICAgICAgICAgICAgICAgICAgICBidWZbaSsrXSA9IGM7CisgICAgICAgICAgICAgICAgYyA9IGF2aW9fcjgocyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaWYgKGkgPCBzaXplIC0gMSkKKyAgICAgICAgICAgICAgICBidWZbaSsrXSA9IGM7CisgICAgICAgIH0KKyAgICAgICAgYnVmW2ldID0gMDsKKyAgICB9IHdoaWxlICghYXZpb19mZW9mKHMpICYmIChidWZbMF0gPT0gJzsnIHx8IGJ1ZlswXSA9PSAnIycgfHwgYnVmWzBdID09IDApKTsKK30KKworc3RhdGljIEFWQ2hhcHRlciAqcmVhZF9jaGFwdGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICB1aW50OF90IGxpbmVbMjU2XTsKKyAgICBpbnQ2NF90IHN0YXJ0LCBlbmQ7CisgICAgQVZSYXRpb25hbCB0YiA9IHsxLCAxZTl9OworCisgICAgZ2V0X2xpbmUocy0+cGIsIGxpbmUsIHNpemVvZihsaW5lKSk7CisKKyAgICBpZiAoc3NjYW5mKGxpbmUsICJUSU1FQkFTRT0lZC8lZCIsICZ0Yi5udW0sICZ0Yi5kZW4pKQorICAgICAgICBnZXRfbGluZShzLT5wYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKyAgICBpZiAoIXNzY2FuZihsaW5lLCAiU1RBUlQ9JSJTQ05kNjQsICZzdGFydCkpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkV4cGVjdGVkIGNoYXB0ZXIgc3RhcnQgdGltZXN0YW1wLCBmb3VuZCAlcy5cbiIsIGxpbmUpOworICAgICAgICBzdGFydCA9IChzLT5uYl9jaGFwdGVycyAmJiBzLT5jaGFwdGVyc1tzLT5uYl9jaGFwdGVycyAtIDFdLT5lbmQgIT0gQVZfTk9QVFNfVkFMVUUpID8KKyAgICAgICAgICAgICAgICAgcy0+Y2hhcHRlcnNbcy0+bmJfY2hhcHRlcnMgLSAxXS0+ZW5kIDogMDsKKyAgICB9IGVsc2UKKyAgICAgICAgZ2V0X2xpbmUocy0+cGIsIGxpbmUsIHNpemVvZihsaW5lKSk7CisKKyAgICBpZiAoIXNzY2FuZihsaW5lLCAiRU5EPSUiU0NOZDY0LCAmZW5kKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXhwZWN0ZWQgY2hhcHRlciBlbmQgdGltZXN0YW1wLCBmb3VuZCAlcy5cbiIsIGxpbmUpOworICAgICAgICBlbmQgPSBBVl9OT1BUU19WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gYXZwcml2X25ld19jaGFwdGVyKHMsIHMtPm5iX2NoYXB0ZXJzLCB0Yiwgc3RhcnQsIGVuZCwgTlVMTCk7Cit9CisKK3N0YXRpYyB1aW50OF90ICp1bmVzY2FwZShjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIHVpbnQ4X3QgKnJldCA9IGF2X21hbGxvYyhzaXplICsgMSk7CisgICAgdWludDhfdCAqcDEgID0gcmV0OworICAgIGNvbnN0IHVpbnQ4X3QgKnAyID0gYnVmOworCisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgd2hpbGUgKHAyIDwgYnVmICsgc2l6ZSkgeworICAgICAgICBpZiAoKnAyID09ICdcXCcpCisgICAgICAgICAgICBwMisrOworICAgICAgICAqcDErKyA9ICpwMisrOworICAgIH0KKyAgICAqcDEgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90YWcoY29uc3QgdWludDhfdCAqbGluZSwgQVZEaWN0aW9uYXJ5ICoqbSkKK3sKKyAgICB1aW50OF90ICprZXksICp2YWx1ZTsKKyAgICBjb25zdCB1aW50OF90ICpwID0gbGluZTsKKworICAgIC8qIGZpbmQgZmlyc3Qgbm90IGVzY2FwZWQgJz0nICovCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCpwID09ICc9JykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlIGlmICgqcCA9PSAnXFwnKQorICAgICAgICAgICAgcCsrOworCisgICAgICAgIGlmICgqcCsrKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCEoa2V5ID0gdW5lc2NhcGUobGluZSwgcCAtIGxpbmUpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpZiAoISh2YWx1ZSA9IHVuZXNjYXBlKHAgKyAxLCBzdHJsZW4ocCArIDEpKSkpIHsKKyAgICAgICAgYXZfZnJlZShrZXkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF2X2RpY3Rfc2V0KG0sIGtleSwgdmFsdWUsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZIHwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVkRpY3Rpb25hcnkgKiptID0gJnMtPm1ldGFkYXRhOworICAgIHVpbnQ4X3QgbGluZVsxMDI0XTsKKworICAgIHdoaWxlKCFhdmlvX2Zlb2Yocy0+cGIpKSB7CisgICAgICAgIGdldF9saW5lKHMtPnBiLCBsaW5lLCBzaXplb2YobGluZSkpOworCisgICAgICAgIGlmICghbWVtY21wKGxpbmUsIElEX1NUUkVBTSwgc3RybGVuKElEX1NUUkVBTSkpKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworCisgICAgICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfRkZNRVRBREFUQTsKKworICAgICAgICAgICAgbSA9ICZzdC0+bWV0YWRhdGE7CisgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChsaW5lLCBJRF9DSEFQVEVSLCBzdHJsZW4oSURfQ0hBUFRFUikpKSB7CisgICAgICAgICAgICBBVkNoYXB0ZXIgKmNoID0gcmVhZF9jaGFwdGVyKHMpOworCisgICAgICAgICAgICBpZiAoIWNoKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgIG0gPSAmY2gtPm1ldGFkYXRhOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJlYWRfdGFnKGxpbmUsIG0pOworICAgIH0KKworICAgIHMtPnN0YXJ0X3RpbWUgPSAwOworICAgIGlmIChzLT5uYl9jaGFwdGVycykKKyAgICAgICAgcy0+ZHVyYXRpb24gPSBhdl9yZXNjYWxlX3Eocy0+Y2hhcHRlcnNbcy0+bmJfY2hhcHRlcnMgLSAxXS0+ZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jaGFwdGVyc1tzLT5uYl9jaGFwdGVycyAtIDFdLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfZmZtZXRhZGF0YV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICA9ICJmZm1ldGFkYXRhIiwKKyAgICAubG9uZ19uYW1lICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRkZtcGVnIG1ldGFkYXRhIGluIHRleHQiKSwKKyAgICAucmVhZF9wcm9iZSAgPSBwcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgPSByZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgPSByZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZmZtZXRhZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmZtZXRhZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhZGJiMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mZm1ldGFlbmMuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogTWV0YWRhdGEgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBbnRvbiBLaGlybm92CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJmZm1ldGEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorCisKK3N0YXRpYyB2b2lkIHdyaXRlX2VzY2FwZV9zdHIoQVZJT0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKnN0cikKK3sKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RyOworCisgICAgd2hpbGUgKCpwKSB7CisgICAgICAgIGlmICgqcCA9PSAnIycgfHwgKnAgPT0gJzsnIHx8ICpwID09ICc9JyB8fCAqcCA9PSAnXFwnIHx8ICpwID09ICdcbicpCisgICAgICAgICAgICBhdmlvX3c4KHMsICdcXCcpOworICAgICAgICBhdmlvX3c4KHMsICpwKTsKKyAgICAgICAgcCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgd3JpdGVfdGFncyhBVklPQ29udGV4dCAqcywgQVZEaWN0aW9uYXJ5ICptKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICB3aGlsZSAoKHQgPSBhdl9kaWN0X2dldChtLCAiIiwgdCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgd3JpdGVfZXNjYXBlX3N0cihzLCB0LT5rZXkpOworICAgICAgICBhdmlvX3c4KHMsICc9Jyk7CisgICAgICAgIHdyaXRlX2VzY2FwZV9zdHIocywgdC0+dmFsdWUpOworICAgICAgICBhdmlvX3c4KHMsICdcbicpOworICAgIH0KK30KKworc3RhdGljIGludCB3cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGF2aW9fd3JpdGUocy0+cGIsIElEX1NUUklORywgc2l6ZW9mKElEX1NUUklORykgLSAxKTsKKyAgICBhdmlvX3c4KHMtPnBiLCAnMScpOyAgICAgICAgICAvLyB2ZXJzaW9uCisgICAgYXZpb193OChzLT5wYiwgJ1xuJyk7CisgICAgYXZpb19mbHVzaChzLT5wYik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisKKyAgICB3cml0ZV90YWdzKHMtPnBiLCBzLT5tZXRhZGF0YSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGF2aW9fd3JpdGUocy0+cGIsIElEX1NUUkVBTSwgc2l6ZW9mKElEX1NUUkVBTSkgLSAxKTsKKyAgICAgICAgYXZpb193OChzLT5wYiwgJ1xuJyk7CisgICAgICAgIHdyaXRlX3RhZ3Mocy0+cGIsIHMtPnN0cmVhbXNbaV0tPm1ldGFkYXRhKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhcHRlcnM7IGkrKykgeworICAgICAgICBBVkNoYXB0ZXIgKmNoID0gcy0+Y2hhcHRlcnNbaV07CisgICAgICAgIGF2aW9fd3JpdGUocy0+cGIsIElEX0NIQVBURVIsIHNpemVvZihJRF9DSEFQVEVSKSAtIDEpOworICAgICAgICBhdmlvX3c4KHMtPnBiLCAnXG4nKTsKKyAgICAgICAgYXZpb19wcmludGYocy0+cGIsICJUSU1FQkFTRT0lZC8lZFxuIiwgY2gtPnRpbWVfYmFzZS5udW0sIGNoLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgYXZpb19wcmludGYocy0+cGIsICJTVEFSVD0lIlBSSWQ2NCJcbiIsIGNoLT5zdGFydCk7CisgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiRU5EPSUiUFJJZDY0IlxuIiwgICBjaC0+ZW5kKTsKKyAgICAgICAgd3JpdGVfdGFncyhzLT5wYiwgY2gtPm1ldGFkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9mZm1ldGFkYXRhX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgID0gImZmbWV0YWRhdGEiLAorICAgIC5sb25nX25hbWUgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZGbXBlZyBtZXRhZGF0YSBpbiB0ZXh0IiksCisgICAgLmV4dGVuc2lvbnMgICAgPSAiZmZtZXRhIiwKKyAgICAud3JpdGVfaGVhZGVyICA9IHdyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICA9IHdyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciA9IHdyaXRlX3RyYWlsZXIsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMgfCBBVkZNVF9OT1NUUkVBTVMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZpbGUuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxMTMyOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9maWxlLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBidWZmZXJlZCBmaWxlIEkvTworICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZiBIQVZFX0lPX0gKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvc19zdXBwb3J0LmgiCisjaW5jbHVkZSAidXJsLmgiCisKKy8qIFNvbWUgc3lzdGVtcyBtYXkgbm90IGhhdmUgU19JU0ZJRk8gKi8KKyNpZm5kZWYgU19JU0ZJRk8KKyMgIGlmZGVmIFNfSUZJRk8KKyMgICAgZGVmaW5lIFNfSVNGSUZPKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGSUZPKQorIyAgZWxzZQorIyAgICBkZWZpbmUgU19JU0ZJRk8obSkgMAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBzdGFuZGFyZCBmaWxlIHByb3RvY29sICovCisKK3R5cGVkZWYgc3RydWN0IEZpbGVDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgZmQ7CisgICAgaW50IHRydW5jOworICAgIGludCBibG9ja3NpemU7Cit9IEZpbGVDb250ZXh0OworCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZmlsZV9vcHRpb25zW10gPSB7CisgICAgeyAidHJ1bmNhdGUiLCAidHJ1bmNhdGUgZXhpc3RpbmcgZmlsZXMgb24gd3JpdGUiLCBvZmZzZXRvZihGaWxlQ29udGV4dCwgdHJ1bmMpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJibG9ja3NpemUiLCAic2V0IEkvTyBvcGVyYXRpb24gbWF4aW11bSBibG9jayBzaXplIiwgb2Zmc2V0b2YoRmlsZUNvbnRleHQsIGJsb2Nrc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gSU5UX01BWCB9LCAxLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZPcHRpb24gcGlwZV9vcHRpb25zW10gPSB7CisgICAgeyAiYmxvY2tzaXplIiwgInNldCBJL08gb3BlcmF0aW9uIG1heGltdW0gYmxvY2sgc2l6ZSIsIG9mZnNldG9mKEZpbGVDb250ZXh0LCBibG9ja3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IElOVF9NQVggfSwgMSwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZmlsZV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJmaWxlIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gZmlsZV9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgcGlwZV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJwaXBlIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gcGlwZV9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGludCBmaWxlX3JlYWQoVVJMQ29udGV4dCAqaCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBGaWxlQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgcjsKKyAgICBzaXplID0gRkZNSU4oc2l6ZSwgYy0+YmxvY2tzaXplKTsKKyAgICByID0gcmVhZChjLT5mZCwgYnVmLCBzaXplKTsKKyAgICByZXR1cm4gKC0xID09IHIpP0FWRVJST1IoZXJybm8pOnI7Cit9CisKK3N0YXRpYyBpbnQgZmlsZV93cml0ZShVUkxDb250ZXh0ICpoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKQoreworICAgIEZpbGVDb250ZXh0ICpjID0gaC0+cHJpdl9kYXRhOworICAgIGludCByOworICAgIHNpemUgPSBGRk1JTihzaXplLCBjLT5ibG9ja3NpemUpOworICAgIHIgPSB3cml0ZShjLT5mZCwgYnVmLCBzaXplKTsKKyAgICByZXR1cm4gKC0xID09IHIpP0FWRVJST1IoZXJybm8pOnI7Cit9CisKK3N0YXRpYyBpbnQgZmlsZV9nZXRfaGFuZGxlKFVSTENvbnRleHQgKmgpCit7CisgICAgRmlsZUNvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGMtPmZkOworfQorCitzdGF0aWMgaW50IGZpbGVfY2hlY2soVVJMQ29udGV4dCAqaCwgaW50IG1hc2spCit7CisgICAgaW50IHJldCA9IDA7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBoLT5maWxlbmFtZTsKKyAgICBhdl9zdHJzdGFydChmaWxlbmFtZSwgImZpbGU6IiwgJmZpbGVuYW1lKTsKKworICAgIHsKKyNpZiBIQVZFX0FDQ0VTUyAmJiBkZWZpbmVkKFJfT0spCisgICAgaWYgKGFjY2VzcyhmaWxlbmFtZSwgRl9PSykgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihlcnJubyk7CisgICAgaWYgKG1hc2smQVZJT19GTEFHX1JFQUQpCisgICAgICAgIGlmIChhY2Nlc3MoZmlsZW5hbWUsIFJfT0spID49IDApCisgICAgICAgICAgICByZXQgfD0gQVZJT19GTEFHX1JFQUQ7CisgICAgaWYgKG1hc2smQVZJT19GTEFHX1dSSVRFKQorICAgICAgICBpZiAoYWNjZXNzKGZpbGVuYW1lLCBXX09LKSA+PSAwKQorICAgICAgICAgICAgcmV0IHw9IEFWSU9fRkxBR19XUklURTsKKyNlbHNlCisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgcmV0ID0gc3RhdChmaWxlbmFtZSwgJnN0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoZXJybm8pOworCisgICAgcmV0IHw9IHN0LnN0X21vZGUmU19JUlVTUiA/IG1hc2smQVZJT19GTEFHX1JFQUQgIDogMDsKKyAgICByZXQgfD0gc3Quc3RfbW9kZSZTX0lXVVNSID8gbWFzayZBVklPX0ZMQUdfV1JJVEUgOiAwOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKyNpZiBDT05GSUdfRklMRV9QUk9UT0NPTAorCitzdGF0aWMgaW50IGZpbGVfb3BlbihVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzKQoreworICAgIEZpbGVDb250ZXh0ICpjID0gaC0+cHJpdl9kYXRhOworICAgIGludCBhY2Nlc3M7CisgICAgaW50IGZkOworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgYXZfc3Ryc3RhcnQoZmlsZW5hbWUsICJmaWxlOiIsICZmaWxlbmFtZSk7CisKKyAgICBpZiAoZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUgJiYgZmxhZ3MgJiBBVklPX0ZMQUdfUkVBRCkgeworICAgICAgICBhY2Nlc3MgPSBPX0NSRUFUIHwgT19SRFdSOworICAgICAgICBpZiAoYy0+dHJ1bmMpCisgICAgICAgICAgICBhY2Nlc3MgfD0gT19UUlVOQzsKKyAgICB9IGVsc2UgaWYgKGZsYWdzICYgQVZJT19GTEFHX1dSSVRFKSB7CisgICAgICAgIGFjY2VzcyA9IE9fQ1JFQVQgfCBPX1dST05MWTsKKyAgICAgICAgaWYgKGMtPnRydW5jKQorICAgICAgICAgICAgYWNjZXNzIHw9IE9fVFJVTkM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWNjZXNzID0gT19SRE9OTFk7CisgICAgfQorI2lmZGVmIE9fQklOQVJZCisgICAgYWNjZXNzIHw9IE9fQklOQVJZOworI2VuZGlmCisgICAgZmQgPSBhdnByaXZfb3BlbihmaWxlbmFtZSwgYWNjZXNzLCAwNjY2KTsKKyAgICBpZiAoZmQgPT0gLTEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKGVycm5vKTsKKyAgICBjLT5mZCA9IGZkOworCisgICAgaC0+aXNfc3RyZWFtZWQgPSAhZnN0YXQoZmQsICZzdCkgJiYgU19JU0ZJRk8oc3Quc3RfbW9kZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogWFhYOiB1c2UgbGxzZWVrICovCitzdGF0aWMgaW50NjRfdCBmaWxlX3NlZWsoVVJMQ29udGV4dCAqaCwgaW50NjRfdCBwb3MsIGludCB3aGVuY2UpCit7CisgICAgRmlsZUNvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCByZXQ7CisKKyAgICBpZiAod2hlbmNlID09IEFWU0VFS19TSVpFKSB7CisgICAgICAgIHN0cnVjdCBzdGF0IHN0OworICAgICAgICByZXQgPSBmc3RhdChjLT5mZCwgJnN0KTsKKyAgICAgICAgcmV0dXJuIHJldCA8IDAgPyBBVkVSUk9SKGVycm5vKSA6IChTX0lTRklGTyhzdC5zdF9tb2RlKSA/IDAgOiBzdC5zdF9zaXplKTsKKyAgICB9CisKKyAgICByZXQgPSBsc2VlayhjLT5mZCwgcG9zLCB3aGVuY2UpOworCisgICAgcmV0dXJuIHJldCA8IDAgPyBBVkVSUk9SKGVycm5vKSA6IHJldDsKK30KKworc3RhdGljIGludCBmaWxlX2Nsb3NlKFVSTENvbnRleHQgKmgpCit7CisgICAgRmlsZUNvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGNsb3NlKGMtPmZkKTsKK30KKworVVJMUHJvdG9jb2wgZmZfZmlsZV9wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJmaWxlIiwKKyAgICAudXJsX29wZW4gICAgICAgICAgICA9IGZpbGVfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgICAgICA9IGZpbGVfcmVhZCwKKyAgICAudXJsX3dyaXRlICAgICAgICAgICA9IGZpbGVfd3JpdGUsCisgICAgLnVybF9zZWVrICAgICAgICAgICAgPSBmaWxlX3NlZWssCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgPSBmaWxlX2Nsb3NlLAorICAgIC51cmxfZ2V0X2ZpbGVfaGFuZGxlID0gZmlsZV9nZXRfaGFuZGxlLAorICAgIC51cmxfY2hlY2sgICAgICAgICAgID0gZmlsZV9jaGVjaywKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICA9IHNpemVvZihGaWxlQ29udGV4dCksCisgICAgLnByaXZfZGF0YV9jbGFzcyAgICAgPSAmZmlsZV9jbGFzcywKK307CisKKyNlbmRpZiAvKiBDT05GSUdfRklMRV9QUk9UT0NPTCAqLworCisjaWYgQ09ORklHX1BJUEVfUFJPVE9DT0wKKworc3RhdGljIGludCBwaXBlX29wZW4oVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncykKK3sKKyAgICBGaWxlQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgZmQ7CisgICAgY2hhciAqZmluYWw7CisgICAgYXZfc3Ryc3RhcnQoZmlsZW5hbWUsICJwaXBlOiIsICZmaWxlbmFtZSk7CisKKyAgICBmZCA9IHN0cnRvbChmaWxlbmFtZSwgJmZpbmFsLCAxMCk7CisgICAgaWYoKGZpbGVuYW1lID09IGZpbmFsKSB8fCAqZmluYWwgKSB7LyogTm8gZGlnaXRzIGZvdW5kLCBvciBzb21ldGhpbmcgbGlrZSAxMGFiICovCisgICAgICAgIGlmIChmbGFncyAmIEFWSU9fRkxBR19XUklURSkgeworICAgICAgICAgICAgZmQgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmQgPSAwOworICAgICAgICB9CisgICAgfQorI2lmIEhBVkVfU0VUTU9ERQorICAgIHNldG1vZGUoZmQsIE9fQklOQVJZKTsKKyNlbmRpZgorICAgIGMtPmZkID0gZmQ7CisgICAgaC0+aXNfc3RyZWFtZWQgPSAxOworICAgIHJldHVybiAwOworfQorCitVUkxQcm90b2NvbCBmZl9waXBlX3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgID0gInBpcGUiLAorICAgIC51cmxfb3BlbiAgICAgICAgICAgID0gcGlwZV9vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gZmlsZV9yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICAgICAgID0gZmlsZV93cml0ZSwKKyAgICAudXJsX2dldF9maWxlX2hhbmRsZSA9IGZpbGVfZ2V0X2hhbmRsZSwKKyAgICAudXJsX2NoZWNrICAgICAgICAgICA9IGZpbGVfY2hlY2ssCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgPSBzaXplb2YoRmlsZUNvbnRleHQpLAorICAgIC5wcml2X2RhdGFfY2xhc3MgICAgID0gJnBpcGVfY2xhc3MsCit9OworCisjZW5kaWYgLyogQ09ORklHX1BJUEVfUFJPVE9DT0wgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9maWxlX29wZW4uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9maWxlX29wZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTRhNWQzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZpbGVfb3Blbi5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlsZV9vcGVuLmMiCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZmlsbXN0cmlwZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmlsbXN0cmlwZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2ZDRiNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9maWxtc3RyaXBkZWMuYwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIEFkb2JlIEZpbG1zdHJpcCBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUGV0ZXIgUm9zcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBZG9iZSBGaWxtc3RyaXAgZGVtdXhlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFJBTkRfVEFHIE1LQkVUQUcoJ1InLCdhJywnbicsJ2QnKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGxlYWRpbmc7Cit9IEZpbG1zdHJpcERlbXV4Q29udGV4dDsKKworc3RhdGljIGludCByZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgRmlsbXN0cmlwRGVtdXhDb250ZXh0ICpmaWxtID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIGlmICghcy0+cGItPnNlZWthYmxlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgYXZpb19zZWVrKHBiLCBhdmlvX3NpemUocGIpIC0gMzYsIFNFRUtfU0VUKTsKKyAgICBpZiAoYXZpb19yYjMyKHBiKSAhPSBSQU5EX1RBRykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibWFnaWMgbnVtYmVyIG5vdCBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3QtPm5iX2ZyYW1lcyA9IGF2aW9fcmIzMihwYik7CisgICAgaWYgKGF2aW9fcmIxNihwYikgIT0gMCkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIlVuc3VwcG9ydGVkIHBhY2tpbmcgbWV0aG9kIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBhdmlvX3NraXAocGIsIDIpOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICBzdC0+Y29kZWMtPnBpeF9mbXQgICAgPSBBVl9QSVhfRk1UX1JHQkE7CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgID0gMDsgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gYXZpb19yYjE2KHBiKTsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBhdmlvX3JiMTYocGIpOworICAgIGZpbG0tPmxlYWRpbmcgICAgICAgICA9IGF2aW9fcmIxNihwYik7CisKKyAgICBpZiAoc3QtPmNvZGVjLT53aWR0aCAqIDRMTCAqIHN0LT5jb2RlYy0+aGVpZ2h0ID49IElOVF9NQVgpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImRpbWVuc2lvbnMgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBhdmlvX3JiMTYocGIpKTsKKworICAgIGF2aW9fc2VlayhwYiwgMCwgU0VFS19TRVQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIEZpbG1zdHJpcERlbXV4Q29udGV4dCAqZmlsbSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworCisgICAgaWYgKGF2aW9fZmVvZihzLT5wYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgcGt0LT5kdHMgPSBhdmlvX3RlbGwocy0+cGIpIC8gKHN0LT5jb2RlYy0+d2lkdGggKiAoaW50NjRfdCkoc3QtPmNvZGVjLT5oZWlnaHQgKyBmaWxtLT5sZWFkaW5nKSAqIDQpOworICAgIHBrdC0+c2l6ZSA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc3QtPmNvZGVjLT53aWR0aCAqIHN0LT5jb2RlYy0+aGVpZ2h0ICogNCk7CisgICAgYXZpb19za2lwKHMtPnBiLCBzdC0+Y29kZWMtPndpZHRoICogKGludDY0X3QpIGZpbG0tPmxlYWRpbmcgKiA0KTsKKyAgICBpZiAocGt0LT5zaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIHBrdC0+c2l6ZTsKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQoreworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKKyAgICBpZiAoYXZpb19zZWVrKHMtPnBiLCBGRk1BWCh0aW1lc3RhbXAsIDApICogc3QtPmNvZGVjLT53aWR0aCAqIHN0LT5jb2RlYy0+aGVpZ2h0ICogNCwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2ZpbG1zdHJpcF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJmaWxtc3RyaXAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBZG9iZSBGaWxtc3RyaXAiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRmlsbXN0cmlwRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSByZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSByZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSByZWFkX3NlZWssCisgICAgLmV4dGVuc2lvbnMgICAgID0gImZsbSIsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZpbG1zdHJpcGVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZpbG1zdHJpcGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWJjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmlsbXN0cmlwZW5jLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIEFkb2JlIEZpbG1zdHJpcCBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQWRvYmUgRmlsbXN0cmlwIG11eGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCisjZGVmaW5lIFJBTkRfVEFHIE1LQkVUQUcoJ1InLCdhJywnbicsJ2QnKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IG5iX2ZyYW1lczsKK30gRmlsbXN0cmlwTXV4Q29udGV4dDsKKworc3RhdGljIGludCB3cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGlmIChzLT5zdHJlYW1zWzBdLT5jb2RlYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1JHQkEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm9ubHkgQVZfUElYX0ZNVF9SR0JBIGlzIHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEZpbG1zdHJpcE11eENvbnRleHQgKmZpbG0gPSBzLT5wcml2X2RhdGE7CisgICAgYXZpb193cml0ZShzLT5wYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIGZpbG0tPm5iX2ZyYW1lcysrOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEZpbG1zdHJpcE11eENvbnRleHQgKmZpbG0gPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1swXTsKKyAgICBpbnQgaTsKKworICAgIGF2aW9fd2IzMihwYiwgUkFORF9UQUcpOworICAgIGF2aW9fd2IzMihwYiwgZmlsbS0+bmJfZnJhbWVzKTsKKyAgICBhdmlvX3diMTYocGIsIDApOyAgLy8gcGFja2luZyBtZXRob2QKKyAgICBhdmlvX3diMTYocGIsIDApOyAgLy8gcmVzZXJ2ZWQKKyAgICBhdmlvX3diMTYocGIsIHN0LT5jb2RlYy0+d2lkdGgpOworICAgIGF2aW9fd2IxNihwYiwgc3QtPmNvZGVjLT5oZWlnaHQpOworICAgIGF2aW9fd2IxNihwYiwgMCk7ICAvLyBsZWFkaW5nCisgICAgLy8gVE9ETzogc2hvdWxkIGJlIGF2Z19mcmFtZV9yYXRlCisgICAgYXZpb193YjE2KHBiLCBzdC0+dGltZV9iYXNlLmRlbiAvIHN0LT50aW1lX2Jhc2UubnVtKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgYXZpb193OChwYiwgMHgwMCk7ICAvLyByZXNlcnZlZAorCisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX2ZpbG1zdHJpcF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAiZmlsbXN0cmlwIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQWRvYmUgRmlsbXN0cmlwIiksCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gImZsbSIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKEZpbG1zdHJpcE11eENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHdyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSB3cml0ZV90cmFpbGVyLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9mbGFjX3BpY3R1cmUuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mbGFjX3BpY3R1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjlmZDJlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZsYWNfcGljdHVyZS5jCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogUmF3IEZMQUMgcGljdHVyZSBwYXJzZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiZmxhY19waWN0dXJlLmgiCisjaW5jbHVkZSAiaWQzdjIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitpbnQgZmZfZmxhY19wYXJzZV9waWN0dXJlKEFWRm9ybWF0Q29udGV4dCAqcywgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgY29uc3QgQ29kZWNNaW1lICptaW1lID0gZmZfaWQzdjJfbWltZV90YWdzOworICAgIGVudW0gQVZDb2RlY0lEIGlkID0gQVZfQ09ERUNfSURfTk9ORTsKKyAgICBBVkJ1ZmZlclJlZiAqZGF0YSA9IE5VTEw7CisgICAgdWludDhfdCBtaW1ldHlwZVs2NF0sICpkZXNjID0gTlVMTDsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBOVUxMOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgd2lkdGgsIGhlaWdodCwgcmV0ID0gMDsKKyAgICBpbnQgbGVuOworICAgIHVuc2lnbmVkIGludCB0eXBlOworCisgICAgcGIgPSBhdmlvX2FsbG9jX2NvbnRleHQoYnVmLCBidWZfc2l6ZSwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKCFwYikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8qIHJlYWQgdGhlIHBpY3R1cmUgdHlwZSAqLworICAgIHR5cGUgPSBhdmlvX3JiMzIocGIpOworICAgIGlmICh0eXBlID49IEZGX0FSUkFZX0VMRU1TKGZmX2lkM3YyX3BpY3R1cmVfdHlwZXMpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBpY3R1cmUgdHlwZTogJWQuXG4iLCB0eXBlKTsKKyAgICAgICAgaWYgKHMtPmVycm9yX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkgeworICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEFWRVJST1JfSU5WQUxJRERBVEEpOworICAgICAgICB9CisgICAgICAgIHR5cGUgPSAwOworICAgIH0KKworICAgIC8qIHBpY3R1cmUgbWltZXR5cGUgKi8KKyAgICBsZW4gPSBhdmlvX3JiMzIocGIpOworICAgIGlmIChsZW4gPD0gMCB8fCBsZW4gPj0gNjQgfHwKKyAgICAgICAgYXZpb19yZWFkKHBiLCBtaW1ldHlwZSwgRkZNSU4obGVuLCBzaXplb2YobWltZXR5cGUpIC0gMSkpICE9IGxlbikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHJlYWQgbWltZXR5cGUgZnJvbSBhbiBhdHRhY2hlZCAiCisgICAgICAgICAgICAgICAicGljdHVyZS5cbiIpOworICAgICAgICBpZiAocy0+ZXJyb3JfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBhdl9hc3NlcnQwKGxlbiA8IHNpemVvZihtaW1ldHlwZSkpOworICAgIG1pbWV0eXBlW2xlbl0gPSAwOworCisgICAgd2hpbGUgKG1pbWUtPmlkICE9IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgaWYgKCFzdHJuY21wKG1pbWUtPnN0ciwgbWltZXR5cGUsIHNpemVvZihtaW1ldHlwZSkpKSB7CisgICAgICAgICAgICBpZCA9IG1pbWUtPmlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbWltZSsrOworICAgIH0KKyAgICBpZiAoaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBhdHRhY2hlZCBwaWN0dXJlIG1pbWV0eXBlOiAlcy5cbiIsCisgICAgICAgICAgICAgICBtaW1ldHlwZSk7CisgICAgICAgIGlmIChzLT5lcnJvcl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogcGljdHVyZSBkZXNjcmlwdGlvbiAqLworICAgIGxlbiA9IGF2aW9fcmIzMihwYik7CisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgaWYgKCEoZGVzYyA9IGF2X21hbGxvYyhsZW4gKyAxKSkpIHsKKyAgICAgICAgICAgIFJFVFVSTl9FUlJPUihBVkVSUk9SKEVOT01FTSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgZGVzYywgbGVuKSAhPSBsZW4pIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFcnJvciByZWFkaW5nIGF0dGFjaGVkIHBpY3R1cmUgZGVzY3JpcHRpb24uXG4iKTsKKyAgICAgICAgICAgIGlmIChzLT5lcnJvcl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGRlc2NbbGVuXSA9IDA7CisgICAgfQorCisgICAgLyogcGljdHVyZSBtZXRhZGF0YSAqLworICAgIHdpZHRoICA9IGF2aW9fcmIzMihwYik7CisgICAgaGVpZ2h0ID0gYXZpb19yYjMyKHBiKTsKKyAgICBhdmlvX3NraXAocGIsIDgpOworCisgICAgLyogcGljdHVyZSBkYXRhICovCisgICAgbGVuID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZiAobGVuIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYXR0YWNoZWQgcGljdHVyZSBzaXplOiAlZC5cbiIsIGxlbik7CisgICAgICAgIGlmIChzLT5lcnJvcl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmICghKGRhdGEgPSBhdl9idWZmZXJfYWxsb2MobGVuICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkpKSB7CisgICAgICAgIFJFVFVSTl9FUlJPUihBVkVSUk9SKEVOT01FTSkpOworICAgIH0KKyAgICBtZW1zZXQoZGF0YS0+ZGF0YSArIGxlbiwgMCwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKGF2aW9fcmVhZChwYiwgZGF0YS0+ZGF0YSwgbGVuKSAhPSBsZW4pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVycm9yIHJlYWRpbmcgYXR0YWNoZWQgcGljdHVyZSBkYXRhLlxuIik7CisgICAgICAgIGlmIChzLT5lcnJvcl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkgeworICAgICAgICBSRVRVUk5fRVJST1IoQVZFUlJPUihFTk9NRU0pKTsKKyAgICB9CisKKyAgICBhdl9pbml0X3BhY2tldCgmc3QtPmF0dGFjaGVkX3BpYyk7CisgICAgc3QtPmF0dGFjaGVkX3BpYy5idWYgICAgICAgICAgPSBkYXRhOworICAgIHN0LT5hdHRhY2hlZF9waWMuZGF0YSAgICAgICAgID0gZGF0YS0+ZGF0YTsKKyAgICBzdC0+YXR0YWNoZWRfcGljLnNpemUgICAgICAgICA9IGxlbjsKKyAgICBzdC0+YXR0YWNoZWRfcGljLnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICBzdC0+YXR0YWNoZWRfcGljLmZsYWdzICAgICAgIHw9IEFWX1BLVF9GTEFHX0tFWTsKKworICAgIHN0LT5kaXNwb3NpdGlvbiAgICAgIHw9IEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gaWQ7CisgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gd2lkdGg7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gaGVpZ2h0OworICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJjb21tZW50IiwgZmZfaWQzdjJfcGljdHVyZV90eXBlc1t0eXBlXSwgMCk7CisgICAgaWYgKGRlc2MpCisgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJ0aXRsZSIsIGRlc2MsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKKworICAgIGF2X2ZyZWVwKCZwYik7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9idWZmZXJfdW5yZWYoJmRhdGEpOworICAgIGF2X2ZyZWVwKCZkZXNjKTsKKyAgICBhdl9mcmVlcCgmcGIpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9mbGFjX3BpY3R1cmUuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mbGFjX3BpY3R1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzc0YjZmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZsYWNfcGljdHVyZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBSYXcgRkxBQyBwaWN0dXJlIHBhcnNlcgorICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX0ZMQUNfUElDVFVSRV9ICisjZGVmaW5lIEFWRk9STUFUX0ZMQUNfUElDVFVSRV9ICisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCisjZGVmaW5lIFJFVFVSTl9FUlJPUihjb2RlKSBkbyB7IHJldCA9IChjb2RlKTsgZ290byBmYWlsOyB9IHdoaWxlICgwKQorCitpbnQgZmZfZmxhY19wYXJzZV9waWN0dXJlKEFWRm9ybWF0Q29udGV4dCAqcywgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpOworCisjZW5kaWYgLyogQVZGT1JNQVRfRkxBQ19QSUNUVVJFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9mbGFjZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmxhY2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOGRjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmxhY2RlYy5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogUmF3IEZMQUMgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9mbGFjLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJmbGFjX3BpY3R1cmUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInJhd2RlYy5oIgorI2luY2x1ZGUgIm9nZ2RlYy5oIgorI2luY2x1ZGUgInZvcmJpc2NvbW1lbnQuaCIKKyNpbmNsdWRlICJyZXBsYXlnYWluLmgiCisKK3N0YXRpYyBpbnQgZmxhY19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IHJldCwgbWV0YWRhdGFfbGFzdD0wLCBtZXRhZGF0YV90eXBlLCBtZXRhZGF0YV9zaXplLCBmb3VuZF9zdHJlYW1pbmZvPTA7CisgICAgdWludDhfdCBoZWFkZXJbNF07CisgICAgdWludDhfdCAqYnVmZmVyPU5VTEw7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRkxBQzsKKyAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CisgICAgLyogdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0gKi8KKworICAgIC8qIGlmIGZMYUMgbWFya2VyIGlzIG5vdCBmb3VuZCwgYXNzdW1lIHRoZXJlIGlzIG5vIGhlYWRlciAqLworICAgIGlmIChhdmlvX3JsMzIocy0+cGIpICE9IE1LVEFHKCdmJywnTCcsJ2EnLCdDJykpIHsKKyAgICAgICAgYXZpb19zZWVrKHMtPnBiLCAtNCwgU0VFS19DVVIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBwcm9jZXNzIG1ldGFkYXRhIGJsb2NrcyAqLworICAgIHdoaWxlICghYXZpb19mZW9mKHMtPnBiKSAmJiAhbWV0YWRhdGFfbGFzdCkgeworICAgICAgICBhdmlvX3JlYWQocy0+cGIsIGhlYWRlciwgNCk7CisgICAgICAgIGZsYWNfcGFyc2VfYmxvY2tfaGVhZGVyKGhlYWRlciwgJm1ldGFkYXRhX2xhc3QsICZtZXRhZGF0YV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0YWRhdGFfc2l6ZSk7CisgICAgICAgIHN3aXRjaCAobWV0YWRhdGFfdHlwZSkgeworICAgICAgICAvKiBhbGxvY2F0ZSBhbmQgcmVhZCBtZXRhZGF0YSBibG9jayBmb3Igc3VwcG9ydGVkIHR5cGVzICovCisgICAgICAgIGNhc2UgRkxBQ19NRVRBREFUQV9UWVBFX1NUUkVBTUlORk86CisgICAgICAgIGNhc2UgRkxBQ19NRVRBREFUQV9UWVBFX0NVRVNIRUVUOgorICAgICAgICBjYXNlIEZMQUNfTUVUQURBVEFfVFlQRV9QSUNUVVJFOgorICAgICAgICBjYXNlIEZMQUNfTUVUQURBVEFfVFlQRV9WT1JCSVNfQ09NTUVOVDoKKyAgICAgICAgICAgIGJ1ZmZlciA9IGF2X21hbGxvY3oobWV0YWRhdGFfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChzLT5wYiwgYnVmZmVyLCBtZXRhZGF0YV9zaXplKSAhPSBtZXRhZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEFWRVJST1IoRUlPKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogc2tpcCBtZXRhZGF0YSBibG9jayBmb3IgdW5zdXBwb3J0ZWQgdHlwZXMgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IGF2aW9fc2tpcChzLT5wYiwgbWV0YWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1ldGFkYXRhX3R5cGUgPT0gRkxBQ19NRVRBREFUQV9UWVBFX1NUUkVBTUlORk8pIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZXJhdGU7CisgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVzOworCisgICAgICAgICAgICAvKiBTVFJFQU1JTkZPIGNhbiBvbmx5IG9jY3VyIG9uY2UgKi8KKyAgICAgICAgICAgIGlmIChmb3VuZF9zdHJlYW1pbmZvKSB7CisgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEFWRVJST1JfSU5WQUxJRERBVEEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1ldGFkYXRhX3NpemUgIT0gRkxBQ19TVFJFQU1JTkZPX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoQVZFUlJPUl9JTlZBTElEREFUQSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3VuZF9zdHJlYW1pbmZvID0gMTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICAgICAgPSBidWZmZXI7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gbWV0YWRhdGFfc2l6ZTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIC8qIGdldCBzYW1wbGUgcmF0ZSBhbmQgc2FtcGxlIGNvdW50IGZyb20gU1RSRUFNSU5GTyBoZWFkZXI7CisgICAgICAgICAgICAgKiBvdGhlciBwYXJhbWV0ZXJzIHdpbGwgYmUgZXh0cmFjdGVkIGJ5IHRoZSBwYXJzZXIgKi8KKyAgICAgICAgICAgIHNhbXBsZXJhdGUgPSBBVl9SQjI0KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMTApID4+IDQ7CisgICAgICAgICAgICBzYW1wbGVzICAgID0gKEFWX1JCNjQoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAxMykgPj4gMjQpICYgKCgxVUxMIDw8IDM2KSAtIDEpOworCisgICAgICAgICAgICAvKiBzZXQgdGltZSBiYXNlIGFuZCBkdXJhdGlvbiAqLworICAgICAgICAgICAgaWYgKHNhbXBsZXJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHNhbXBsZXJhdGUpOworICAgICAgICAgICAgICAgIGlmIChzYW1wbGVzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgc3QtPmR1cmF0aW9uID0gc2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YV90eXBlID09IEZMQUNfTUVUQURBVEFfVFlQRV9DVUVTSEVFVCkgeworICAgICAgICAgICAgdWludDhfdCBpc3JjWzEzXTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXJ0OworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqb2Zmc2V0OworICAgICAgICAgICAgaW50IGksIGNoYXB0ZXJzLCB0cmFjaywgdGk7CisgICAgICAgICAgICBpZiAobWV0YWRhdGFfc2l6ZSA8IDQzMSkKKyAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoQVZFUlJPUl9JTlZBTElEREFUQSk7CisgICAgICAgICAgICBvZmZzZXQgPSBidWZmZXIgKyAzOTU7CisgICAgICAgICAgICBjaGFwdGVycyA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJm9mZnNldCkgLSAxOworICAgICAgICAgICAgaWYgKGNoYXB0ZXJzIDw9IDApCisgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEFWRVJST1JfSU5WQUxJRERBVEEpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNoYXB0ZXJzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICsgMzYgLSBidWZmZXIgPiBtZXRhZGF0YV9zaXplKQorICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoQVZFUlJPUl9JTlZBTElEREFUQSk7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBieXRlc3RyZWFtX2dldF9iZTY0KCZvZmZzZXQpOworICAgICAgICAgICAgICAgIHRyYWNrID0gYnl0ZXN0cmVhbV9nZXRfYnl0ZSgmb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX2dldF9idWZmZXIoJm9mZnNldCwgaXNyYywgMTIpOworICAgICAgICAgICAgICAgIGlzcmNbMTJdID0gMDsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTQ7CisgICAgICAgICAgICAgICAgdGkgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZvZmZzZXQpOworICAgICAgICAgICAgICAgIGlmICh0aSA8PSAwKSBSRVRVUk5fRVJST1IoQVZFUlJPUl9JTlZBTElEREFUQSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHRpICogMTI7CisgICAgICAgICAgICAgICAgYXZwcml2X25ld19jaGFwdGVyKHMsIHRyYWNrLCBzdC0+dGltZV9iYXNlLCBzdGFydCwgQVZfTk9QVFNfVkFMVUUsIGlzcmMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZnJlZXAoJmJ1ZmZlcik7CisgICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGFfdHlwZSA9PSBGTEFDX01FVEFEQVRBX1RZUEVfUElDVFVSRSkgeworICAgICAgICAgICAgcmV0ID0gZmZfZmxhY19wYXJzZV9waWN0dXJlKHMsIGJ1ZmZlciwgbWV0YWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgYXR0YWNoZWQgcGljdHVyZS5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBTVFJFQU1JTkZPIG11c3QgYmUgdGhlIGZpcnN0IGJsb2NrICovCisgICAgICAgICAgICBpZiAoIWZvdW5kX3N0cmVhbWluZm8pIHsKKyAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoQVZFUlJPUl9JTlZBTElEREFUQSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBwcm9jZXNzIHN1cHBvcnRlZCBibG9ja3Mgb3RoZXIgdGhhbiBTVFJFQU1JTkZPICovCisgICAgICAgICAgICBpZiAobWV0YWRhdGFfdHlwZSA9PSBGTEFDX01FVEFEQVRBX1RZUEVfVk9SQklTX0NPTU1FTlQpIHsKKyAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqY2htYXNrOworCisgICAgICAgICAgICAgICAgcmV0ID0gZmZfdm9yYmlzX2NvbW1lbnQocywgJnMtPm1ldGFkYXRhLCBidWZmZXIsIG1ldGFkYXRhX3NpemUsIDEpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgImVycm9yIHBhcnNpbmcgVm9yYmlzQ29tbWVudCBtZXRhZGF0YVxuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmV2ZW50X2ZsYWdzIHw9IEFWRk1UX0VWRU5UX0ZMQUdfTUVUQURBVEFfVVBEQVRFRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBwYXJzZSB0aGUgY2hhbm5lbHMgbWFzayBpZiBwcmVzZW50ICovCisgICAgICAgICAgICAgICAgY2htYXNrID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJXQVZFRk9STUFURVhURU5TSUJMRV9DSEFOTkVMX01BU0siLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoY2htYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG1hc2sgPSBzdHJ0b2woY2htYXNrLT52YWx1ZSwgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbWFzayB8fCBtYXNrICYgfjB4M2ZmZmZVTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBvZiBXQVZFRk9STUFURVhURU5TSUJMRV9DSEFOTkVMX01BU0tcbiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IG1hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJXQVZFRk9STUFURVhURU5TSUJMRV9DSEFOTkVMX01BU0siLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyZWVwKCZidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gZmZfcmVwbGF5Z2Fpbl9leHBvcnQoc3QsIHMtPm1ldGFkYXRhKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2ZyZWUoYnVmZmVyKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZsYWNfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKHAtPmJ1Zl9zaXplIDwgNCB8fCBtZW1jbXAocC0+YnVmLCAiZkxhQyIsIDQpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047Cit9CisKK3N0YXRpYyBhdl91bnVzZWQgaW50NjRfdCBmbGFjX3JlYWRfdGltZXN0YW1wKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnBwb3MsIGludDY0X3QgcG9zX2xpbWl0KQoreworICAgIEFWUGFja2V0IHBrdCwgb3V0X3BrdDsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgQVZDb2RlY1BhcnNlckNvbnRleHQgKnBhcnNlcjsKKyAgICBpbnQgcmV0OworICAgIGludDY0X3QgcHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBpZiAoYXZpb19zZWVrKHMtPnBiLCAqcHBvcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworCisgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7CisgICAgcGFyc2VyID0gYXZfcGFyc2VyX2luaXQoc3QtPmNvZGVjLT5jb2RlY19pZCk7CisgICAgaWYgKCFwYXJzZXIpeworICAgICAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7CisgICAgfQorICAgIHBhcnNlci0+ZmxhZ3MgfD0gUEFSU0VSX0ZMQUdfVVNFX0NPREVDX1RTOworCisgICAgZm9yICg7Oyl7CisgICAgICAgIHJldCA9IGZmX3Jhd19yZWFkX3BhcnRpYWxfcGFja2V0KHMsICZwa3QpOworICAgICAgICBpZiAocmV0IDwgMCl7CisgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhdl9pbml0X3BhY2tldCgmb3V0X3BrdCk7CisgICAgICAgIHJldCA9IGF2X3BhcnNlcl9wYXJzZTIocGFyc2VyLCBzdC0+Y29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dF9wa3QuZGF0YSwgJm91dF9wa3Quc2l6ZSwgcGt0LmRhdGEsIHBrdC5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC5wdHMsIHBrdC5kdHMsICpwcG9zKTsKKworICAgICAgICBhdl9mcmVlX3BhY2tldCgmcGt0KTsKKyAgICAgICAgaWYgKG91dF9wa3Quc2l6ZSl7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IG91dF9wa3Quc2l6ZTsKKyAgICAgICAgICAgIGlmIChwYXJzZXItPnB0cyAhPSBBVl9OT1BUU19WQUxVRSl7CisgICAgICAgICAgICAgICAgLy8gc2Vla2luZyBtYXkgbm90IGhhdmUgc3RhcnRlZCBmcm9tIGJlZ2lubmluZyBvZiBhIGZyYW1lCisgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGZyYW1lIHN0YXJ0IHBvc2l0aW9uIGZyb20gbmV4dCBmcmFtZSBiYWNrd2FyZHMKKyAgICAgICAgICAgICAgICAqcHBvcyA9IHBhcnNlci0+bmV4dF9mcmFtZV9vZmZzZXQgLSBzaXplOworICAgICAgICAgICAgICAgIHB0cyA9IHBhcnNlci0+cHRzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGF2X3BhcnNlcl9jbG9zZShwYXJzZXIpOworICAgIHJldHVybiBwdHM7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfZmxhY19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJmbGFjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IEZMQUMiKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBmbGFjX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGZsYWNfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmZfcmF3X3JlYWRfcGFydGlhbF9wYWNrZXQsCisgICAgLnJlYWRfdGltZXN0YW1wID0gZmxhY19yZWFkX3RpbWVzdGFtcCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5leHRlbnNpb25zICAgICA9ICJmbGFjIiwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9GTEFDLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9mbGFjZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmxhY2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZWE5NDIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmxhY2VuYy5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogcmF3IEZMQUMgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IEp1c3RpbiBSdWdnbGVzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9mbGFjLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiZmxhY2VuYy5oIgorI2luY2x1ZGUgInZvcmJpc2NvbW1lbnQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKworCit0eXBlZGVmIHN0cnVjdCBGbGFjTXV4ZXJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgd3JpdGVfaGVhZGVyOworCisgICAgLyogdXBkYXRlZCBzdHJlYW1pbmZvIHNlbnQgYnkgdGhlIGVuY29kZXIgYXQgdGhlIGVuZCAqLworICAgIHVpbnQ4X3QgKnN0cmVhbWluZm87Cit9IEZsYWNNdXhlckNvbnRleHQ7CisKK3N0YXRpYyBpbnQgZmxhY193cml0ZV9ibG9ja19wYWRkaW5nKEFWSU9Db250ZXh0ICpwYiwgdW5zaWduZWQgaW50IG5fcGFkZGluZ19ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0X2Jsb2NrKQoreworICAgIGF2aW9fdzgocGIsIGxhc3RfYmxvY2sgPyAweDgxIDogMHgwMSk7CisgICAgYXZpb193YjI0KHBiLCBuX3BhZGRpbmdfYnl0ZXMpOworICAgIGZmaW9fZmlsbChwYiwgMCwgbl9wYWRkaW5nX2J5dGVzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbGFjX3dyaXRlX2Jsb2NrX2NvbW1lbnQoQVZJT0NvbnRleHQgKnBiLCBBVkRpY3Rpb25hcnkgKiptLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RfYmxvY2ssIGludCBiaXRleGFjdCkKK3sKKyAgICBjb25zdCBjaGFyICp2ZW5kb3IgPSBiaXRleGFjdCA/ICJmZm1wZWciIDogTElCQVZGT1JNQVRfSURFTlQ7CisgICAgdW5zaWduZWQgaW50IGxlbjsKKyAgICB1aW50OF90ICpwLCAqcDA7CisKKyAgICBmZl9tZXRhZGF0YV9jb252KG0sIGZmX3ZvcmJpc2NvbW1lbnRfbWV0YWRhdGFfY29udiwgTlVMTCk7CisKKyAgICBsZW4gPSBmZl92b3JiaXNjb21tZW50X2xlbmd0aCgqbSwgdmVuZG9yKTsKKyAgICBwMCA9IGF2X21hbGxvYyhsZW4rNCk7CisgICAgaWYgKCFwMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBwID0gcDA7CisKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCBsYXN0X2Jsb2NrID8gMHg4NCA6IDB4MDQpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMjQoJnAsIGxlbik7CisgICAgZmZfdm9yYmlzY29tbWVudF93cml0ZSgmcCwgbSwgdmVuZG9yKTsKKworICAgIGF2aW9fd3JpdGUocGIsIHAwLCBsZW4rNCk7CisgICAgYXZfZnJlZXAoJnAwKTsKKyAgICBwID0gTlVMTDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsYWNfd3JpdGVfaGVhZGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IHJldDsKKyAgICBpbnQgcGFkZGluZyA9IHMtPm1ldGFkYXRhX2hlYWRlcl9wYWRkaW5nOworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEZsYWNNdXhlckNvbnRleHQgKmMgICA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmICghYy0+d3JpdGVfaGVhZGVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzLT5uYl9zdHJlYW1zID4gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAib25seSBvbmUgc3RyZWFtIGlzIHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfRkxBQykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgY29kZWNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChwYWRkaW5nIDwgMCkKKyAgICAgICAgcGFkZGluZyA9IDgxOTI7CisgICAgLyogVGhlIEZMQUMgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCAyNCBiaXRzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUKKyAgICAgKiBzaXplIG9mIGEgbWV0YWRhdGEgYmxvY2sgc28gd2UgbXVzdCBjbGlwIHRoaXMgdmFsdWUgdG8gMl4yNC0xLiAqLworICAgIHBhZGRpbmcgPSBhdl9jbGlwKHBhZGRpbmcsIDAsIDE2Nzc3MjE1KTsKKworICAgIHJldCA9IGZmX2ZsYWNfd3JpdGVfaGVhZGVyKHMtPnBiLCBjb2RlYy0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSwgMCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGFkZCB0aGUgY2hhbm5lbCBsYXlvdXQgdGFnICovCisgICAgaWYgKGNvZGVjLT5jaGFubmVsX2xheW91dCAmJgorICAgICAgICAhKGNvZGVjLT5jaGFubmVsX2xheW91dCAmIH4weDNmZmZmVUxMKSAmJgorICAgICAgICAhZmZfZmxhY19pc19uYXRpdmVfbGF5b3V0KGNvZGVjLT5jaGFubmVsX2xheW91dCkpIHsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmNobWFzayA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiV0FWRUZPUk1BVEVYVEVOU0lCTEVfQ0hBTk5FTF9NQVNLIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOworCisgICAgICAgIGlmIChjaG1hc2spIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkEgV0FWRUZPUk1BVEVYVEVOU0lCTEVfQ0hBTk5FTF9NQVNLIGlzICIKKyAgICAgICAgICAgICAgICAgICAiYWxyZWFkeSBwcmVzZW50LCB0aGlzIG11eGVyIHdpbGwgbm90IG92ZXJ3cml0ZSBpdC5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCBidWZbMzJdOworICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjB4JSJQUkl4NjQsIGNvZGVjLT5jaGFubmVsX2xheW91dCk7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJXQVZFRk9STUFURVhURU5TSUJMRV9DSEFOTkVMX01BU0siLCBidWYsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gZmxhY193cml0ZV9ibG9ja19jb21tZW50KHMtPnBiLCAmcy0+bWV0YWRhdGEsICFwYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQklURVhBQ1QpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBUaGUgY29tbWFuZCBsaW5lIGZsYWMgZW5jb2RlciBkZWZhdWx0cyB0byBwbGFjaW5nIGEgc2Vla3BvaW50CisgICAgICogZXZlcnkgMTBzLiAgU28gb25lIG1pZ2h0IGFkZCBwYWRkaW5nIHRvIGFsbG93IHRoYXQgbGF0ZXIKKyAgICAgKiBidXQgdGhlcmUgc2VlbXMgdG8gYmUgbm8gc2ltcGxlIHdheSB0byBnZXQgdGhlIGR1cmF0aW9uIGhlcmUuCisgICAgICogU28ganVzdCBhZGQgdGhlIGFtb3VudCByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuICovCisgICAgaWYgKHBhZGRpbmcpCisgICAgICAgIGZsYWNfd3JpdGVfYmxvY2tfcGFkZGluZyhzLT5wYiwgcGFkZGluZywgMSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZsYWNfd3JpdGVfdHJhaWxlcihzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludDY0X3QgZmlsZV9zaXplOworICAgIEZsYWNNdXhlckNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqc3RyZWFtaW5mbyA9IGMtPnN0cmVhbWluZm8gPyBjLT5zdHJlYW1pbmZvIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5leHRyYWRhdGE7CisKKyAgICBpZiAoIWMtPndyaXRlX2hlYWRlciB8fCAhc3RyZWFtaW5mbykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIC8qIHJld3JpdGUgdGhlIFNUUkVBTUlORk8gaGVhZGVyIGJsb2NrIGRhdGEgKi8KKyAgICAgICAgZmlsZV9zaXplID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgYXZpb19zZWVrKHBiLCA4LCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIHN0cmVhbWluZm8sIEZMQUNfU1RSRUFNSU5GT19TSVpFKTsKKyAgICAgICAgYXZpb19zZWVrKHBiLCBmaWxlX3NpemUsIFNFRUtfU0VUKTsKKyAgICAgICAgYXZpb19mbHVzaChwYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAidW5hYmxlIHRvIHJld3JpdGUgRkxBQyBoZWFkZXIuXG4iKTsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmYy0+c3RyZWFtaW5mbyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbGFjX3dyaXRlX3BhY2tldChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEZsYWNNdXhlckNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqc3RyZWFtaW5mbzsKKyAgICBpbnQgc3RyZWFtaW5mb19zaXplOworCisgICAgLyogY2hlY2sgZm9yIHVwZGF0ZWQgc3RyZWFtaW5mbyAqLworICAgIHN0cmVhbWluZm8gPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1pbmZvX3NpemUpOworICAgIGlmIChzdHJlYW1pbmZvICYmIHN0cmVhbWluZm9fc2l6ZSA9PSBGTEFDX1NUUkVBTUlORk9fU0laRSkgeworICAgICAgICBhdl9mcmVlcCgmYy0+c3RyZWFtaW5mbyk7CisKKyAgICAgICAgYy0+c3RyZWFtaW5mbyA9IGF2X21hbGxvYyhGTEFDX1NUUkVBTUlORk9fU0laRSk7CisgICAgICAgIGlmICghYy0+c3RyZWFtaW5mbykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbWNweShjLT5zdHJlYW1pbmZvLCBzdHJlYW1pbmZvLCBGTEFDX1NUUkVBTUlORk9fU0laRSk7CisgICAgfQorCisgICAgaWYgKHBrdC0+c2l6ZSkKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZmxhY2VuY19vcHRpb25zW10gPSB7CisgICAgeyAid3JpdGVfaGVhZGVyIiwgIldyaXRlIHRoZSBmaWxlIGhlYWRlciIsIG9mZnNldG9mKEZsYWNNdXhlckNvbnRleHQsIHdyaXRlX2hlYWRlciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgMCwgMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGZsYWNfbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZmxhYyBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGZsYWNlbmNfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWT3V0cHV0Rm9ybWF0IGZmX2ZsYWNfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImZsYWMiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgRkxBQyIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihGbGFjTXV4ZXJDb250ZXh0KSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAiYXVkaW8veC1mbGFjIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAiZmxhYyIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfRkxBQywKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZsYWNfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZsYWNfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IGZsYWNfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJmZsYWNfbXV4ZXJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZsYWNlbmMuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mbGFjZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkNTNhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mbGFjZW5jLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIHJhdyBGTEFDIG11eGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSnVzdGluIFJ1Z2dsZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9GTEFDRU5DX0gKKyNkZWZpbmUgQVZGT1JNQVRfRkxBQ0VOQ19ICisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ZsYWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCitpbnQgZmZfZmxhY193cml0ZV9oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCB1aW50OF90ICpleHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dHJhZGF0YV9zaXplLCBpbnQgbGFzdF9ibG9jayk7CisKK2ludCBmZl9mbGFjX2lzX25hdGl2ZV9sYXlvdXQodWludDY0X3QgY2hhbm5lbF9sYXlvdXQpOworCisjZW5kaWYgLyogQVZGT1JNQVRfRkxBQ0VOQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZmxhY2VuY19oZWFkZXIuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mbGFjZW5jX2hlYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODMzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmxhY2VuY19oZWFkZXIuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogcmF3IEZMQUMgbXV4ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKdXN0aW4gUnVnZ2xlcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ZsYWMuaCIKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiZmxhY2VuYy5oIgorCitpbnQgZmZfZmxhY193cml0ZV9oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCB1aW50OF90ICpleHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dHJhZGF0YV9zaXplLCBpbnQgbGFzdF9ibG9jaykKK3sKKyAgICB1aW50OF90IGhlYWRlcls4XSA9IHsKKyAgICAgICAgMHg2NiwgMHg0QywgMHg2MSwgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMgorICAgIH07CisKKyAgICBoZWFkZXJbNF0gPSBsYXN0X2Jsb2NrID8gMHg4MCA6IDB4MDA7CisKKyAgICBpZiAoZXh0cmFkYXRhX3NpemUgPCBGTEFDX1NUUkVBTUlORk9fU0laRSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiB3cml0ZSAiZkxhQyIgc3RyZWFtIG1hcmtlciBhbmQgZmlyc3QgbWV0YWRhdGEgYmxvY2sgaGVhZGVyICovCisgICAgYXZpb193cml0ZShwYiwgaGVhZGVyLCA4KTsKKworICAgIC8qIHdyaXRlIFNUUkVBTUlORk8gKi8KKyAgICBhdmlvX3dyaXRlKHBiLCBleHRyYWRhdGEsIEZMQUNfU1RSRUFNSU5GT19TSVpFKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfZmxhY19pc19uYXRpdmVfbGF5b3V0KHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0KQoreworICAgIGlmIChjaGFubmVsX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfTU9OTyAgICAgfHwKKyAgICAgICAgY2hhbm5lbF9sYXlvdXQgPT0gQVZfQ0hfTEFZT1VUX1NURVJFTyAgIHx8CisgICAgICAgIGNoYW5uZWxfbGF5b3V0ID09IEFWX0NIX0xBWU9VVF9TVVJST1VORCB8fAorICAgICAgICBjaGFubmVsX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfUVVBRCAgICAgfHwKKyAgICAgICAgY2hhbm5lbF9sYXlvdXQgPT0gQVZfQ0hfTEFZT1VUXzVQT0lOVDAgIHx8CisgICAgICAgIGNoYW5uZWxfbGF5b3V0ID09IEFWX0NIX0xBWU9VVF81UE9JTlQxICB8fAorICAgICAgICBjaGFubmVsX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfNlBPSU5UMSAgfHwKKyAgICAgICAgY2hhbm5lbF9sYXlvdXQgPT0gQVZfQ0hfTEFZT1VUXzdQT0lOVDEpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZsaWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mbGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlOWU4NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mbGljLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBGTEkvRkxDIEFuaW1hdGlvbiBGaWxlIERlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRkxJL0ZMQyBmaWxlIGRlbXV4ZXIKKyAqIGJ5IE1pa2UgTWVsYW5zb24gKG1lbGFuc29uQHBjaXN5cy5uZXQpCisgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgLmZsaS8uZmxjIGZpbGUgZm9ybWF0IGFuZCBhbGwgb2YgaXRzIG1hbnkKKyAqIHZhcmlhdGlvbnMsIHZpc2l0OgorICogICBodHRwOi8vd3d3LmNvbXB1cGhhc2UuY29tL2ZsaWMuaHRtCisgKgorICogVGhpcyBkZW11eGVyIGhhbmRsZXMgc3RhbmRhcmQgMHhBRjExLSBhbmQgMHhBRjEyLXR5cGUgRkxJcy4gSXQgYWxzbyBoYW5kbGVzCisgKiBzcGVjaWFsIEZMSXMgZnJvbSB0aGUgUEMgZ2FtZXMgIk1hZ2ljIENhcnBldCIgYW5kICJYLUNPTTogVGVycm9yIGZyb20gdGhlIERlZXAiLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIEZMSUNfRklMRV9NQUdJQ18xIDB4QUYxMQorI2RlZmluZSBGTElDX0ZJTEVfTUFHSUNfMiAweEFGMTIKKyNkZWZpbmUgRkxJQ19GSUxFX01BR0lDXzMgMHhBRjQ0ICAvKiBGbGljIFR5cGUgZm9yIEV4dGVuZGVkIEZMWCBGb3JtYXQgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hdGVkIGluIERhdmUncyBUYXJnYSBBbmltYXRvciAoRFRBKSAqLworI2RlZmluZSBGTElDX0NIVU5LX01BR0lDXzEgMHhGMUZBCisjZGVmaW5lIEZMSUNfQ0hVTktfTUFHSUNfMiAweEY1RkEKKyNkZWZpbmUgRkxJQ19NQ19TUEVFRCA1ICAvKiBzcGVlZCBmb3IgTWFnaWMgQ2FycGV0IGdhbWUgRkxJcyAqLworI2RlZmluZSBGTElDX0RFRkFVTFRfU1BFRUQgNSAgLyogZm9yIEZMSXMgdGhhdCBoYXZlIDAgc3BlZWQgKi8KKyNkZWZpbmUgRkxJQ19URlREX0NIVU5LX0FVRElPIDB4QUFBQSAvKiBBdWRpbyBjaHVuay4gVXNlZCBpbiBUZXJyb3IgZnJvbSB0aGUgRGVlcC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXMgMTAgQiBleHRyYSBoZWFkZXIgbm90IGFjY291bnRlZCBmb3IgaW4gdGhlIGNodW5rIGhlYWRlciAqLworI2RlZmluZSBGTElDX1RGVERfU0FNUExFX1JBVEUgMjIwNTAKKworI2RlZmluZSBGTElDX0hFQURFUl9TSVpFIDEyOAorI2RlZmluZSBGTElDX1BSRUFNQkxFX1NJWkUgNgorCit0eXBlZGVmIHN0cnVjdCBGbGljRGVtdXhDb250ZXh0IHsKKyAgICBpbnQgdmlkZW9fc3RyZWFtX2luZGV4OworICAgIGludCBhdWRpb19zdHJlYW1faW5kZXg7CisgICAgaW50IGZyYW1lX251bWJlcjsKK30gRmxpY0RlbXV4Q29udGV4dDsKKworc3RhdGljIGludCBmbGljX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGludCBtYWdpY19udW1iZXI7CisKKyAgICBpZihwLT5idWZfc2l6ZSA8IEZMSUNfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiAwOworCisgICAgbWFnaWNfbnVtYmVyID0gQVZfUkwxNigmcC0+YnVmWzRdKTsKKyAgICBpZiAoKG1hZ2ljX251bWJlciAhPSBGTElDX0ZJTEVfTUFHSUNfMSkgJiYKKyAgICAgICAgKG1hZ2ljX251bWJlciAhPSBGTElDX0ZJTEVfTUFHSUNfMikgJiYKKyAgICAgICAgKG1hZ2ljX251bWJlciAhPSBGTElDX0ZJTEVfTUFHSUNfMykpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYoQVZfUkwxNigmcC0+YnVmWzB4MTBdKSAhPSBGTElDX0NIVU5LX01BR0lDXzEpeworICAgICAgICBpZihBVl9STDMyKCZwLT5idWZbMHgxMF0pID4gMjAwMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmKCAgIEFWX1JMMTYoJnAtPmJ1ZlsweDA4XSkgPiA0MDk2CisgICAgICAgfHwgQVZfUkwxNigmcC0+YnVmWzB4MEFdKSA+IDQwOTYpCisgICAgICAgIHJldHVybiAwOworCisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLSAxOworfQorCitzdGF0aWMgaW50IGZsaWNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEZsaWNEZW11eENvbnRleHQgKmZsaWMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgdW5zaWduZWQgY2hhciBoZWFkZXJbRkxJQ19IRUFERVJfU0laRV07CisgICAgQVZTdHJlYW0gKnN0LCAqYXN0OworICAgIGludCBzcGVlZDsKKyAgICBpbnQgbWFnaWNfbnVtYmVyOworICAgIHVuc2lnbmVkIGNoYXIgcHJlYW1ibGVbRkxJQ19QUkVBTUJMRV9TSVpFXTsKKworICAgIGZsaWMtPmZyYW1lX251bWJlciA9IDA7CisKKyAgICAvKiBsb2FkIHRoZSB3aG9sZSBoZWFkZXIgYW5kIHB1bGwgb3V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0ICovCisgICAgaWYgKGF2aW9fcmVhZChwYiwgaGVhZGVyLCBGTElDX0hFQURFUl9TSVpFKSAhPSBGTElDX0hFQURFUl9TSVpFKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgbWFnaWNfbnVtYmVyID0gQVZfUkwxNigmaGVhZGVyWzRdKTsKKyAgICBzcGVlZCA9IEFWX1JMMzIoJmhlYWRlclsweDEwXSk7CisgICAgaWYgKHNwZWVkID09IDApCisgICAgICAgIHNwZWVkID0gRkxJQ19ERUZBVUxUX1NQRUVEOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgZGVjb2RlciBzdHJlYW1zICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmxpYy0+dmlkZW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRkxJQzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KKyAgICBzdC0+Y29kZWMtPndpZHRoID0gQVZfUkwxNigmaGVhZGVyWzB4MDhdKTsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IEFWX1JMMTYoJmhlYWRlclsweDBBXSk7CisKKyAgICBpZiAoIXN0LT5jb2RlYy0+d2lkdGggfHwgIXN0LT5jb2RlYy0+aGVpZ2h0KSB7CisgICAgICAgIC8qIFVnbHkgaGFjayBuZWVkZWQgZm9yIHRoZSBmb2xsb3dpbmcgc2FtcGxlOiAqLworICAgICAgICAvKiBodHRwOi8vc2FtcGxlcy5tcGxheWVyaHEuaHUvZmxpLWZsYy9mbGktYnVncy9zcGVjdWxhci5mbGMgKi8KKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkZpbGUgd2l0aCBubyBzcGVjaWZpZWQgd2lkdGgvaGVpZ2h0LiBUcnlpbmcgNjQweDQ4MC5cbiIpOworICAgICAgICBzdC0+Y29kZWMtPndpZHRoICA9IDY0MDsKKyAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSA0ODA7CisgICAgfQorCisgICAgLyogc2VuZCBvdmVyIHRoZSB3aG9sZSAxMjgtYnl0ZSBGTElDIGhlYWRlciAqLworICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBGTElDX0hFQURFUl9TSVpFKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsIGhlYWRlciwgRkxJQ19IRUFERVJfU0laRSk7CisKKyAgICAvKiBwZWVrIGF0IHRoZSBwcmVhbWJsZSB0byBkZXRlY3QgVEZURCB2aWRlb3MgLSB0aGV5IHNlZW0gdG8gYWx3YXlzIHN0YXJ0IHdpdGggYW4gYXVkaW8gY2h1bmsgKi8KKyAgICBpZiAoYXZpb19yZWFkKHBiLCBwcmVhbWJsZSwgRkxJQ19QUkVBTUJMRV9TSVpFKSAhPSBGTElDX1BSRUFNQkxFX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBwZWVrIGF0IHByZWFtYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBhdmlvX3NlZWsocGIsIC1GTElDX1BSRUFNQkxFX1NJWkUsIFNFRUtfQ1VSKTsKKworICAgIC8qIFRpbWUgdG8gZmlndXJlIG91dCB0aGUgZnJhbWVyYXRlOgorICAgICAqIElmIHRoZSBmaXJzdCBwcmVhbWJsZSdzIG1hZ2ljIG51bWJlciBpcyAweEFBQUEgdGhlbiB0aGlzIGZpbGUgaXMgZnJvbQorICAgICAqIFgtQ09NOiBUZXJyb3IgZnJvbSB0aGUgRGVlcC4gSWYgb24gdGhlIG90aGVyIGhhbmQgdGhlcmUgaXMgYSBGTElDIGNodW5rCisgICAgICogbWFnaWMgbnVtYmVyIGF0IG9mZnNldCAweDEwIGFzc3VtZSB0aGlzIGZpbGUgaXMgZnJvbSBNYWdpYyBDYXJwZXQgaW5zdGVhZC4KKyAgICAgKiBJZiBuZWl0aGVyIG9mIHRoZSBhYm92ZSBpcyB0cnVlIHRoZW4gdGhpcyBpcyBhIG5vcm1hbCBGTElDIGZpbGUuCisgICAgICovCisgICAgaWYgKEFWX1JMMTYoJnByZWFtYmxlWzRdKSA9PSBGTElDX1RGVERfQ0hVTktfQVVESU8pIHsKKyAgICAgICAgLyogVEZURCB2aWRlb3MgaGF2ZSBhbiBleHRyYSAyMjA1MCBIeiA4LWJpdCBtb25vIGF1ZGlvIHN0cmVhbSAqLworICAgICAgICBhc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICBpZiAoIWFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgZmxpYy0+YXVkaW9fc3RyZWFtX2luZGV4ID0gYXN0LT5pbmRleDsKKworICAgICAgICAvKiBhbGwgYXVkaW8gZnJhbWVzIGFyZSB0aGUgc2FtZSBzaXplLCBzbyB1c2UgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGNodW5rIGZvciBibG9ja19hbGlnbiAqLworICAgICAgICBhc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IEFWX1JMMzIoJnByZWFtYmxlWzBdKTsKKyAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7CisgICAgICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gRkxJQ19URlREX1NBTVBMRV9SQVRFOworICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7CisgICAgICAgIGFzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqIDg7CisgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7CisgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgIGFzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMDsKKworICAgICAgICAvKiBTaW5jZSB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIGlzIGluY29ycmVjdCB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlCisgICAgICAgICAqIGZyYW1lcmF0ZSB1c2luZyBibG9ja19hbGlnbiBhbmQgdGhlIGZhY3QgdGhhdCB0aGUgYXVkaW8gaXMgMjIwNTAgSHouCisgICAgICAgICAqIFdlIHVzdWFsbHkgaGF2ZSB0d28gY2FzZXM6IDIyMDUgLT4gMTAgZnBzIGFuZCAxNDcwIC0+IDE1IGZwcyAqLworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgYXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24sIEZMSUNfVEZURF9TQU1QTEVfUkFURSk7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgRkxJQ19URlREX1NBTVBMRV9SQVRFKTsKKyAgICB9IGVsc2UgaWYgKEFWX1JMMTYoJmhlYWRlclsweDEwXSkgPT0gRkxJQ19DSFVOS19NQUdJQ18xKSB7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBGTElDX01DX1NQRUVELCA3MCk7CisKKyAgICAgICAgLyogcmV3aW5kIHRoZSBzdHJlYW0gc2luY2UgdGhlIGZpcnN0IGNodW5rIGlzIGF0IG9mZnNldCAxMiAqLworICAgICAgICBhdmlvX3NlZWsocGIsIDEyLCBTRUVLX1NFVCk7CisKKyAgICAgICAgLyogc2VuZCBvdmVyIGFiYnJldmlhdGVkIEZMSUMgaGVhZGVyIGNodW5rICovCisgICAgICAgIGF2X2ZyZWUoc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgMTIpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBoZWFkZXIsIDEyKTsKKworICAgIH0gZWxzZSBpZiAobWFnaWNfbnVtYmVyID09IEZMSUNfRklMRV9NQUdJQ18xKSB7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBzcGVlZCwgNzApOworICAgIH0gZWxzZSBpZiAoKG1hZ2ljX251bWJlciA9PSBGTElDX0ZJTEVfTUFHSUNfMikgfHwKKyAgICAgICAgICAgICAgIChtYWdpY19udW1iZXIgPT0gRkxJQ19GSUxFX01BR0lDXzMpKSB7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBzcGVlZCwgMTAwMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgb3IgdW5zdXBwb3J0ZWQgbWFnaWMgY2h1bmsgaW4gZmlsZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsaWNfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgRmxpY0RlbXV4Q29udGV4dCAqZmxpYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgcGFja2V0X3JlYWQgPSAwOworICAgIHVuc2lnbmVkIGludCBzaXplOworICAgIGludCBtYWdpYzsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHByZWFtYmxlW0ZMSUNfUFJFQU1CTEVfU0laRV07CisKKyAgICB3aGlsZSAoIXBhY2tldF9yZWFkKSB7CisKKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX3JlYWQocGIsIHByZWFtYmxlLCBGTElDX1BSRUFNQkxFX1NJWkUpKSAhPQorICAgICAgICAgICAgRkxJQ19QUkVBTUJMRV9TSVpFKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNpemUgPSBBVl9STDMyKCZwcmVhbWJsZVswXSk7CisgICAgICAgIG1hZ2ljID0gQVZfUkwxNigmcHJlYW1ibGVbNF0pOworCisgICAgICAgIGlmICgoKG1hZ2ljID09IEZMSUNfQ0hVTktfTUFHSUNfMSkgfHwgKG1hZ2ljID09IEZMSUNfQ0hVTktfTUFHSUNfMikpICYmIHNpemUgPiBGTElDX1BSRUFNQkxFX1NJWkUpIHsKKyAgICAgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGZsaWMtPnZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICAgICAgICAgIHBrdC0+cHRzID0gZmxpYy0+ZnJhbWVfbnVtYmVyKys7CisgICAgICAgICAgICBwa3QtPnBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBwcmVhbWJsZSwgRkxJQ19QUkVBTUJMRV9TSVpFKTsKKyAgICAgICAgICAgIHJldCA9IGF2aW9fcmVhZChwYiwgcGt0LT5kYXRhICsgRkxJQ19QUkVBTUJMRV9TSVpFLAorICAgICAgICAgICAgICAgIHNpemUgLSBGTElDX1BSRUFNQkxFX1NJWkUpOworICAgICAgICAgICAgaWYgKHJldCAhPSBzaXplIC0gRkxJQ19QUkVBTUJMRV9TSVpFKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWNrZXRfcmVhZCA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAobWFnaWMgPT0gRkxJQ19URlREX0NIVU5LX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBza2lwIHVzZWxlc3MgMTBCIHN1Yi1oZWFkZXIgKHllcywgaXQncyBub3QgYWNjb3VudGVkIGZvciBpbiB0aGUgY2h1bmsgaGVhZGVyKSAqLworICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxMCk7CisKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gZmxpYy0+YXVkaW9fc3RyZWFtX2luZGV4OworICAgICAgICAgICAgcGt0LT5wb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBwa3QtPmRhdGEsIHNpemUpOworCisgICAgICAgICAgICBpZiAocmV0ICE9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFja2V0X3JlYWQgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogbm90IGludGVyZXN0ZWQgaW4gdGhpcyBjaHVuayAqLworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gNik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitBVklucHV0Rm9ybWF0IGZmX2ZsaWNfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZmxpYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZMSS9GTEMvRkxYIGFuaW1hdGlvbiIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGbGljRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBmbGljX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGZsaWNfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmxpY19yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZmx2LmggYi9mZm1wZWcvbGliYXZmb3JtYXQvZmx2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5NDY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mbHYuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIEZMViBjb21tb24gaGVhZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBGTFYgY29tbW9uIGhlYWRlcgorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfRkxWX0gKKyNkZWZpbmUgQVZGT1JNQVRfRkxWX0gKKworLyogb2Zmc2V0cyBmb3IgcGFja2VkIHZhbHVlcyAqLworI2RlZmluZSBGTFZfQVVESU9fU0FNUExFU1NJWkVfT0ZGU0VUIDEKKyNkZWZpbmUgRkxWX0FVRElPX1NBTVBMRVJBVEVfT0ZGU0VUICAyCisjZGVmaW5lIEZMVl9BVURJT19DT0RFQ0lEX09GRlNFVCAgICAgNAorCisjZGVmaW5lIEZMVl9WSURFT19GUkFNRVRZUEVfT0ZGU0VUICAgNAorCisvKiBiaXRtYXNrcyB0byBpc29sYXRlIHNwZWNpZmljIHZhbHVlcyAqLworI2RlZmluZSBGTFZfQVVESU9fQ0hBTk5FTF9NQVNLICAgIDB4MDEKKyNkZWZpbmUgRkxWX0FVRElPX1NBTVBMRVNJWkVfTUFTSyAweDAyCisjZGVmaW5lIEZMVl9BVURJT19TQU1QTEVSQVRFX01BU0sgMHgwYworI2RlZmluZSBGTFZfQVVESU9fQ09ERUNJRF9NQVNLICAgIDB4ZjAKKworI2RlZmluZSBGTFZfVklERU9fQ09ERUNJRF9NQVNLICAgIDB4MGYKKyNkZWZpbmUgRkxWX1ZJREVPX0ZSQU1FVFlQRV9NQVNLICAweGYwCisKKyNkZWZpbmUgQU1GX0VORF9PRl9PQkpFQ1QgICAgICAgICAweDA5CisKKyNkZWZpbmUgS0VZRlJBTUVTX1RBRyAgICAgICAgICAgICJrZXlmcmFtZXMiCisjZGVmaW5lIEtFWUZSQU1FU19USU1FU1RBTVBfVEFHICAidGltZXMiCisjZGVmaW5lIEtFWUZSQU1FU19CWVRFT0ZGU0VUX1RBRyAiZmlsZXBvc2l0aW9ucyIKKworCitlbnVtIHsKKyAgICBGTFZfSEVBREVSX0ZMQUdfSEFTVklERU8gPSAxLAorICAgIEZMVl9IRUFERVJfRkxBR19IQVNBVURJTyA9IDQsCit9OworCitlbnVtIHsKKyAgICBGTFZfVEFHX1RZUEVfQVVESU8gPSAweDA4LAorICAgIEZMVl9UQUdfVFlQRV9WSURFTyA9IDB4MDksCisgICAgRkxWX1RBR19UWVBFX01FVEEgID0gMHgxMiwKK307CisKK2VudW0geworICAgIEZMVl9TVFJFQU1fVFlQRV9WSURFTywKKyAgICBGTFZfU1RSRUFNX1RZUEVfQVVESU8sCisgICAgRkxWX1NUUkVBTV9UWVBFX0RBVEEsCisgICAgRkxWX1NUUkVBTV9UWVBFX05CLAorfTsKKworZW51bSB7CisgICAgRkxWX01PTk8gICA9IDAsCisgICAgRkxWX1NURVJFTyA9IDEsCit9OworCitlbnVtIHsKKyAgICBGTFZfU0FNUExFU1NJWkVfOEJJVCAgPSAwLAorICAgIEZMVl9TQU1QTEVTU0laRV8xNkJJVCA9IDEgPDwgRkxWX0FVRElPX1NBTVBMRVNTSVpFX09GRlNFVCwKK307CisKK2VudW0geworICAgIEZMVl9TQU1QTEVSQVRFX1NQRUNJQUwgPSAwLCAvKio8IHNpZ25pZmllcyA1NTEySHogYW5kIDgwMDBIeiBpbiB0aGUgY2FzZSBvZiBORUxMWU1PU0VSICovCisgICAgRkxWX1NBTVBMRVJBVEVfMTEwMjVIWiA9IDEgPDwgRkxWX0FVRElPX1NBTVBMRVJBVEVfT0ZGU0VULAorICAgIEZMVl9TQU1QTEVSQVRFXzIyMDUwSFogPSAyIDw8IEZMVl9BVURJT19TQU1QTEVSQVRFX09GRlNFVCwKKyAgICBGTFZfU0FNUExFUkFURV80NDEwMEhaID0gMyA8PCBGTFZfQVVESU9fU0FNUExFUkFURV9PRkZTRVQsCit9OworCitlbnVtIHsKKyAgICBGTFZfQ09ERUNJRF9QQ00gICAgICAgICAgICAgICAgICA9IDAsCisgICAgRkxWX0NPREVDSURfQURQQ00gICAgICAgICAgICAgICAgPSAxIDw8IEZMVl9BVURJT19DT0RFQ0lEX09GRlNFVCwKKyAgICBGTFZfQ09ERUNJRF9NUDMgICAgICAgICAgICAgICAgICA9IDIgPDwgRkxWX0FVRElPX0NPREVDSURfT0ZGU0VULAorICAgIEZMVl9DT0RFQ0lEX1BDTV9MRSAgICAgICAgICAgICAgID0gMyA8PCBGTFZfQVVESU9fQ09ERUNJRF9PRkZTRVQsCisgICAgRkxWX0NPREVDSURfTkVMTFlNT1NFUl8xNktIWl9NT05PID0gNCA8PCBGTFZfQVVESU9fQ09ERUNJRF9PRkZTRVQsCisgICAgRkxWX0NPREVDSURfTkVMTFlNT1NFUl84S0haX01PTk8gPSA1IDw8IEZMVl9BVURJT19DT0RFQ0lEX09GRlNFVCwKKyAgICBGTFZfQ09ERUNJRF9ORUxMWU1PU0VSICAgICAgICAgICA9IDYgPDwgRkxWX0FVRElPX0NPREVDSURfT0ZGU0VULAorICAgIEZMVl9DT0RFQ0lEX1BDTV9BTEFXICAgICAgICAgICAgID0gNyA8PCBGTFZfQVVESU9fQ09ERUNJRF9PRkZTRVQsCisgICAgRkxWX0NPREVDSURfUENNX01VTEFXICAgICAgICAgICAgPSA4IDw8IEZMVl9BVURJT19DT0RFQ0lEX09GRlNFVCwKKyAgICBGTFZfQ09ERUNJRF9BQUMgICAgICAgICAgICAgICAgICA9IDEwPDwgRkxWX0FVRElPX0NPREVDSURfT0ZGU0VULAorICAgIEZMVl9DT0RFQ0lEX1NQRUVYICAgICAgICAgICAgICAgID0gMTE8PCBGTFZfQVVESU9fQ09ERUNJRF9PRkZTRVQsCit9OworCitlbnVtIHsKKyAgICBGTFZfQ09ERUNJRF9IMjYzICAgID0gMiwKKyAgICBGTFZfQ09ERUNJRF9TQ1JFRU4gID0gMywKKyAgICBGTFZfQ09ERUNJRF9WUDYgICAgID0gNCwKKyAgICBGTFZfQ09ERUNJRF9WUDZBICAgID0gNSwKKyAgICBGTFZfQ09ERUNJRF9TQ1JFRU4yID0gNiwKKyAgICBGTFZfQ09ERUNJRF9IMjY0ICAgID0gNywKKyAgICBGTFZfQ09ERUNJRF9SRUFMSDI2Mz0gOCwKKyAgICBGTFZfQ09ERUNJRF9NUEVHNCAgID0gOSwKK307CisKK2VudW0geworICAgIEZMVl9GUkFNRV9LRVkgICAgICAgICAgICA9IDEgPDwgRkxWX1ZJREVPX0ZSQU1FVFlQRV9PRkZTRVQsIC8vLzwga2V5IGZyYW1lIChmb3IgQVZDLCBhIHNlZWthYmxlIGZyYW1lKQorICAgIEZMVl9GUkFNRV9JTlRFUiAgICAgICAgICA9IDIgPDwgRkxWX1ZJREVPX0ZSQU1FVFlQRV9PRkZTRVQsIC8vLzwgaW50ZXIgZnJhbWUgKGZvciBBVkMsIGEgbm9uLXNlZWthYmxlIGZyYW1lKQorICAgIEZMVl9GUkFNRV9ESVNQX0lOVEVSICAgICA9IDMgPDwgRkxWX1ZJREVPX0ZSQU1FVFlQRV9PRkZTRVQsIC8vLzwgZGlzcG9zYWJsZSBpbnRlciBmcmFtZSAoSC4yNjMgb25seSkKKyAgICBGTFZfRlJBTUVfR0VORVJBVEVEX0tFWSAgPSA0IDw8IEZMVl9WSURFT19GUkFNRVRZUEVfT0ZGU0VULCAvLy88IGdlbmVyYXRlZCBrZXkgZnJhbWUgKHJlc2VydmVkIGZvciBzZXJ2ZXIgdXNlIG9ubHkpCisgICAgRkxWX0ZSQU1FX1ZJREVPX0lORk9fQ01EID0gNSA8PCBGTFZfVklERU9fRlJBTUVUWVBFX09GRlNFVCwgLy8vPCB2aWRlbyBpbmZvL2NvbW1hbmQgZnJhbWUKK307CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU1GX0RBVEFfVFlQRV9OVU1CRVIgICAgICA9IDB4MDAsCisgICAgQU1GX0RBVEFfVFlQRV9CT09MICAgICAgICA9IDB4MDEsCisgICAgQU1GX0RBVEFfVFlQRV9TVFJJTkcgICAgICA9IDB4MDIsCisgICAgQU1GX0RBVEFfVFlQRV9PQkpFQ1QgICAgICA9IDB4MDMsCisgICAgQU1GX0RBVEFfVFlQRV9OVUxMICAgICAgICA9IDB4MDUsCisgICAgQU1GX0RBVEFfVFlQRV9VTkRFRklORUQgICA9IDB4MDYsCisgICAgQU1GX0RBVEFfVFlQRV9SRUZFUkVOQ0UgICA9IDB4MDcsCisgICAgQU1GX0RBVEFfVFlQRV9NSVhFREFSUkFZICA9IDB4MDgsCisgICAgQU1GX0RBVEFfVFlQRV9PQkpFQ1RfRU5EICA9IDB4MDksCisgICAgQU1GX0RBVEFfVFlQRV9BUlJBWSAgICAgICA9IDB4MGEsCisgICAgQU1GX0RBVEFfVFlQRV9EQVRFICAgICAgICA9IDB4MGIsCisgICAgQU1GX0RBVEFfVFlQRV9MT05HX1NUUklORyA9IDB4MGMsCisgICAgQU1GX0RBVEFfVFlQRV9VTlNVUFBPUlRFRCA9IDB4MGQsCit9IEFNRkRhdGFUeXBlOworCisjZW5kaWYgLyogQVZGT1JNQVRfRkxWX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9mbHZkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mbHZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QxMzEzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZsdmRlYy5jCkBAIC0wLDAgKzEsMTA5OCBAQAorLyoKKyAqIEZMViBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBkZW11eGVyIHdpbGwgZ2VuZXJhdGUgYSAxIGJ5dGUgZXh0cmFkYXRhIGZvciBWUDZGIGNvbnRlbnQuCisgKiBJdCBpcyBjb21wb3NlZCBvZjoKKyAqICAtIHVwcGVyIDRiaXRzOiBkaWZmZXJlbmNlIGJldHdlZW4gZW5jb2RlZCB3aWR0aCBhbmQgdmlzaWJsZSB3aWR0aAorICogIC0gbG93ZXIgNGJpdHM6IGRpZmZlcmVuY2UgYmV0d2VlbiBlbmNvZGVkIGhlaWdodCBhbmQgdmlzaWJsZSBoZWlnaHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZzRhdWRpby5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiZmx2LmgiCisKKyNkZWZpbmUgVkFMSURBVEVfSU5ERVhfVFNfVEhSRVNIIDI1MDAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOyAvLy88IENsYXNzIGZvciBwcml2YXRlIG9wdGlvbnMuCisgICAgaW50IHRydXN0X21ldGFkYXRhOyAgIC8vLzwgY29uZmlndXJlIHN0cmVhbXMgYWNjb3JkaW5nIG9uTWV0YURhdGEKKyAgICBpbnQgd3JvbmdfZHRzOyAgICAgICAgLy8vPCB3cm9uZyBkdHMgZHVlIHRvIG5lZ2F0aXZlIGN0cworICAgIHVpbnQ4X3QgKm5ld19leHRyYWRhdGFbRkxWX1NUUkVBTV9UWVBFX05CXTsKKyAgICBpbnQgbmV3X2V4dHJhZGF0YV9zaXplW0ZMVl9TVFJFQU1fVFlQRV9OQl07CisgICAgaW50IGxhc3Rfc2FtcGxlX3JhdGU7CisgICAgaW50IGxhc3RfY2hhbm5lbHM7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50NjRfdCBkdHM7CisgICAgICAgIGludDY0X3QgcG9zOworICAgIH0gdmFsaWRhdGVfaW5kZXhbMl07CisgICAgaW50IHZhbGlkYXRlX25leHQ7CisgICAgaW50IHZhbGlkYXRlX2NvdW50OworICAgIGludCBzZWFyY2hlZF9mb3JfZW5kOworfSBGTFZDb250ZXh0OworCitzdGF0aWMgaW50IHByb2JlKEFWUHJvYmVEYXRhICpwLCBpbnQgbGl2ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpkID0gcC0+YnVmOworICAgIHVuc2lnbmVkIG9mZnNldCA9IEFWX1JCMzIoZCArIDUpOworCisgICAgaWYgKGRbMF0gPT0gJ0YnICYmCisgICAgICAgIGRbMV0gPT0gJ0wnICYmCisgICAgICAgIGRbMl0gPT0gJ1YnICYmCisgICAgICAgIGRbM10gPCA1ICYmIGRbNV0gPT0gMCAmJgorICAgICAgICBvZmZzZXQgKyAxMDAgPCBwLT5idWZfc2l6ZSAmJgorICAgICAgICBvZmZzZXQgPiA4KSB7CisgICAgICAgIGludCBpc19saXZlID0gIW1lbWNtcChkICsgb2Zmc2V0ICsgNDAsICJOR0lOWCBSVE1QIiwgMTApOworCisgICAgICAgIGlmIChsaXZlID09IGlzX2xpdmUpCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsdl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICByZXR1cm4gcHJvYmUocCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgbGl2ZV9mbHZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgcmV0dXJuIHByb2JlKHAsIDEpOworfQorCitzdGF0aWMgQVZTdHJlYW0gKmNyZWF0ZV9zdHJlYW0oQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgY29kZWNfdHlwZSkKK3sKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IGNvZGVjX3R5cGU7CisgICAgaWYgKHMtPm5iX3N0cmVhbXM+PTMgfHwoICAgcy0+bmJfc3RyZWFtcz09MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0RBVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHMtPnN0cmVhbXNbMV0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9EQVRBKSkKKyAgICAgICAgcy0+Y3R4X2ZsYWdzICY9IH5BVkZNVENUWF9OT0hFQURFUjsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCAxMDAwKTsgLyogMzIgYml0IHB0cyBpbiBtcyAqLworICAgIHJldHVybiBzdDsKK30KKworc3RhdGljIGludCBmbHZfc2FtZV9hdWRpb19jb2RlYyhBVkNvZGVjQ29udGV4dCAqYWNvZGVjLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IChmbGFncyAmIEZMVl9BVURJT19TQU1QTEVTSVpFX01BU0spID8gMTYgOiA4OworICAgIGludCBmbHZfY29kZWNpZCAgICAgICAgICAgPSBmbGFncyAmIEZMVl9BVURJT19DT0RFQ0lEX01BU0s7CisgICAgaW50IGNvZGVjX2lkOworCisgICAgaWYgKCFhY29kZWMtPmNvZGVjX2lkICYmICFhY29kZWMtPmNvZGVjX3RhZykKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoYWNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgIT0gYml0c19wZXJfY29kZWRfc2FtcGxlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaCAoZmx2X2NvZGVjaWQpIHsKKyAgICAvLyBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuIFMxNiBhbmQgUzggUENNIGNvZGVjIGZsYWdzCisgICAgY2FzZSBGTFZfQ09ERUNJRF9QQ006CisgICAgICAgIGNvZGVjX2lkID0gYml0c19wZXJfY29kZWRfc2FtcGxlID09IDgKKyAgICAgICAgICAgICAgICAgICA/IEFWX0NPREVDX0lEX1BDTV9VOAorI2lmIEhBVkVfQklHRU5ESUFOCisgICAgICAgICAgICAgICAgICAgOiBBVl9DT0RFQ19JRF9QQ01fUzE2QkU7CisjZWxzZQorICAgICAgICAgICAgICAgICAgIDogQVZfQ09ERUNfSURfUENNX1MxNkxFOworI2VuZGlmCisgICAgICAgIHJldHVybiBjb2RlY19pZCA9PSBhY29kZWMtPmNvZGVjX2lkOworICAgIGNhc2UgRkxWX0NPREVDSURfUENNX0xFOgorICAgICAgICBjb2RlY19pZCA9IGJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSA4CisgICAgICAgICAgICAgICAgICAgPyBBVl9DT0RFQ19JRF9QQ01fVTgKKyAgICAgICAgICAgICAgICAgICA6IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICAgICAgcmV0dXJuIGNvZGVjX2lkID09IGFjb2RlYy0+Y29kZWNfaWQ7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9BQUM6CisgICAgICAgIHJldHVybiBhY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQzsKKyAgICBjYXNlIEZMVl9DT0RFQ0lEX0FEUENNOgorICAgICAgICByZXR1cm4gYWNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9TV0Y7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9TUEVFWDoKKyAgICAgICAgcmV0dXJuIGFjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1BFRVg7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9NUDM6CisgICAgICAgIHJldHVybiBhY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMzsKKyAgICBjYXNlIEZMVl9DT0RFQ0lEX05FTExZTU9TRVJfOEtIWl9NT05POgorICAgIGNhc2UgRkxWX0NPREVDSURfTkVMTFlNT1NFUl8xNktIWl9NT05POgorICAgIGNhc2UgRkxWX0NPREVDSURfTkVMTFlNT1NFUjoKKyAgICAgICAgcmV0dXJuIGFjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTkVMTFlNT1NFUjsKKyAgICBjYXNlIEZMVl9DT0RFQ0lEX1BDTV9NVUxBVzoKKyAgICAgICAgcmV0dXJuIGFjb2RlYy0+c2FtcGxlX3JhdGUgPT0gODAwMCAmJgorICAgICAgICAgICAgICAgYWNvZGVjLT5jb2RlY19pZCAgICA9PSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9QQ01fQUxBVzoKKyAgICAgICAgcmV0dXJuIGFjb2RlYy0+c2FtcGxlX3JhdGUgPT0gODAwMCAmJgorICAgICAgICAgICAgICAgYWNvZGVjLT5jb2RlY19pZCAgICA9PSBBVl9DT0RFQ19JRF9QQ01fQUxBVzsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gYWNvZGVjLT5jb2RlY190YWcgPT0gKGZsdl9jb2RlY2lkID4+IEZMVl9BVURJT19DT0RFQ0lEX09GRlNFVCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmbHZfc2V0X2F1ZGlvX2NvZGVjKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKmFzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphY29kZWMsIGludCBmbHZfY29kZWNpZCkKK3sKKyAgICBzd2l0Y2ggKGZsdl9jb2RlY2lkKSB7CisgICAgLy8gbm8gZGlzdGluY3Rpb24gYmV0d2VlbiBTMTYgYW5kIFM4IFBDTSBjb2RlYyBmbGFncworICAgIGNhc2UgRkxWX0NPREVDSURfUENNOgorICAgICAgICBhY29kZWMtPmNvZGVjX2lkID0gYWNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVl9DT0RFQ19JRF9QQ01fVTgKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVl9DT0RFQ19JRF9QQ01fUzE2QkU7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9QQ01fTEU6CisgICAgICAgIGFjb2RlYy0+Y29kZWNfaWQgPSBhY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFWX0NPREVDX0lEX1BDTV9VOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkxWX0NPREVDSURfQUFDOgorICAgICAgICBhY29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQUFDOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZMVl9DT0RFQ0lEX0FEUENNOgorICAgICAgICBhY29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fU1dGOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZMVl9DT0RFQ0lEX1NQRUVYOgorICAgICAgICBhY29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfU1BFRVg7CisgICAgICAgIGFjb2RlYy0+c2FtcGxlX3JhdGUgPSAxNjAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9NUDM6CisgICAgICAgIGFjb2RlYy0+Y29kZWNfaWQgICAgICA9IEFWX0NPREVDX0lEX01QMzsKKyAgICAgICAgYXN0cmVhbS0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9ORUxMWU1PU0VSXzhLSFpfTU9OTzoKKyAgICAgICAgLy8gaW4gY2FzZSBtZXRhZGF0YSBkb2VzIG5vdCBvdGhlcndpc2UgZGVjbGFyZSBzYW1wbGVyYXRlCisgICAgICAgIGFjb2RlYy0+c2FtcGxlX3JhdGUgPSA4MDAwOworICAgICAgICBhY29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfTkVMTFlNT1NFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9ORUxMWU1PU0VSXzE2S0haX01PTk86CisgICAgICAgIGFjb2RlYy0+c2FtcGxlX3JhdGUgPSAxNjAwMDsKKyAgICAgICAgYWNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX05FTExZTU9TRVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkxWX0NPREVDSURfTkVMTFlNT1NFUjoKKyAgICAgICAgYWNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05FTExZTU9TRVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkxWX0NPREVDSURfUENNX01VTEFXOgorICAgICAgICBhY29kZWMtPnNhbXBsZV9yYXRlID0gODAwMDsKKyAgICAgICAgYWNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1BDTV9NVUxBVzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9QQ01fQUxBVzoKKyAgICAgICAgYWNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgICAgIGFjb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9QQ01fQUxBVzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJBdWRpbyBjb2RlYyAoJXgpIiwKKyAgICAgICAgICAgICAgIGZsdl9jb2RlY2lkID4+IEZMVl9BVURJT19DT0RFQ0lEX09GRlNFVCk7CisgICAgICAgIGFjb2RlYy0+Y29kZWNfdGFnID0gZmx2X2NvZGVjaWQgPj4gRkxWX0FVRElPX0NPREVDSURfT0ZGU0VUOworICAgIH0KK30KKworc3RhdGljIGludCBmbHZfc2FtZV92aWRlb19jb2RlYyhBVkNvZGVjQ29udGV4dCAqdmNvZGVjLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGZsdl9jb2RlY2lkID0gZmxhZ3MgJiBGTFZfVklERU9fQ09ERUNJRF9NQVNLOworCisgICAgaWYgKCF2Y29kZWMtPmNvZGVjX2lkICYmICF2Y29kZWMtPmNvZGVjX3RhZykKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBzd2l0Y2ggKGZsdl9jb2RlY2lkKSB7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9IMjYzOgorICAgICAgICByZXR1cm4gdmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTFYxOworICAgIGNhc2UgRkxWX0NPREVDSURfU0NSRUVOOgorICAgICAgICByZXR1cm4gdmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTEFTSFNWOworICAgIGNhc2UgRkxWX0NPREVDSURfU0NSRUVOMjoKKyAgICAgICAgcmV0dXJuIHZjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxBU0hTVjI7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9WUDY6CisgICAgICAgIHJldHVybiB2Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNkY7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9WUDZBOgorICAgICAgICByZXR1cm4gdmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZBOworICAgIGNhc2UgRkxWX0NPREVDSURfSDI2NDoKKyAgICAgICAgcmV0dXJuIHZjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gdmNvZGVjLT5jb2RlY190YWcgPT0gZmx2X2NvZGVjaWQ7CisgICAgfQorfQorCitzdGF0aWMgaW50IGZsdl9zZXRfdmlkZW9fY29kZWMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqdnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmx2X2NvZGVjaWQsIGludCByZWFkKQoreworICAgIEFWQ29kZWNDb250ZXh0ICp2Y29kZWMgPSB2c3RyZWFtLT5jb2RlYzsKKyAgICBzd2l0Y2ggKGZsdl9jb2RlY2lkKSB7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9IMjYzOgorICAgICAgICB2Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRkxWMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9SRUFMSDI2MzoKKyAgICAgICAgdmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0gyNjM7CisgICAgICAgIGJyZWFrOyAvLyBSZWFsbHkgbWVhbiBpdCB0aGlzIHRpbWUKKyAgICBjYXNlIEZMVl9DT0RFQ0lEX1NDUkVFTjoKKyAgICAgICAgdmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZMQVNIU1Y7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkxWX0NPREVDSURfU0NSRUVOMjoKKyAgICAgICAgdmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZMQVNIU1YyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZMVl9DT0RFQ0lEX1ZQNjoKKyAgICAgICAgdmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1ZQNkY7CisgICAgY2FzZSBGTFZfQ09ERUNJRF9WUDZBOgorICAgICAgICBpZiAoZmx2X2NvZGVjaWQgPT0gRkxWX0NPREVDSURfVlA2QSkKKyAgICAgICAgICAgIHZjb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9WUDZBOworICAgICAgICBpZiAocmVhZCkgeworICAgICAgICAgICAgaWYgKHZjb2RlYy0+ZXh0cmFkYXRhX3NpemUgIT0gMSkgeworICAgICAgICAgICAgICAgIGZmX2FsbG9jX2V4dHJhZGF0YSh2Y29kZWMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZjb2RlYy0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgICAgIHZjb2RlYy0+ZXh0cmFkYXRhWzBdID0gYXZpb19yOChzLT5wYik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsgICAgIC8vIDEgYnl0ZSBib2R5IHNpemUgYWRqdXN0bWVudCBmb3IgZmx2X3JlYWRfcGFja2V0KCkKKyAgICBjYXNlIEZMVl9DT0RFQ0lEX0gyNjQ6CisgICAgICAgIHZjb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9IMjY0OworICAgICAgICB2c3RyZWFtLT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOworICAgICAgICByZXR1cm4gMzsgICAgIC8vIG5vdCA0LCByZWFkaW5nIHBhY2tldCB0eXBlIHdpbGwgY29uc3VtZSBvbmUgYnl0ZQorICAgIGNhc2UgRkxWX0NPREVDSURfTVBFRzQ6CisgICAgICAgIHZjb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUEVHNDsKKyAgICAgICAgcmV0dXJuIDM7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJWaWRlbyBjb2RlYyAoJXgpIiwgZmx2X2NvZGVjaWQpOworICAgICAgICB2Y29kZWMtPmNvZGVjX3RhZyA9IGZsdl9jb2RlY2lkOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZl9nZXRfc3RyaW5nKEFWSU9Db250ZXh0ICppb2MsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZzaXplKQoreworICAgIGludCBsZW5ndGggPSBhdmlvX3JiMTYoaW9jKTsKKyAgICBpZiAobGVuZ3RoID49IGJ1ZmZzaXplKSB7CisgICAgICAgIGF2aW9fc2tpcChpb2MsIGxlbmd0aCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBhdmlvX3JlYWQoaW9jLCBidWZmZXIsIGxlbmd0aCk7CisKKyAgICBidWZmZXJbbGVuZ3RoXSA9ICdcMCc7CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgaW50IHBhcnNlX2tleWZyYW1lc19pbmRleChBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICppb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqdnN0cmVhbSwgaW50NjRfdCBtYXhfcG9zKQoreworICAgIEZMVkNvbnRleHQgKmZsdiAgICAgICA9IHMtPnByaXZfZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgdGltZXNsZW4gPSAwLCBmaWxlcG9zbGVuID0gMCwgaTsKKyAgICBjaGFyIHN0cl92YWxbMjU2XTsKKyAgICBpbnQ2NF90ICp0aW1lcyAgICAgICAgID0gTlVMTDsKKyAgICBpbnQ2NF90ICpmaWxlcG9zaXRpb25zID0gTlVMTDsKKyAgICBpbnQgcmV0ICAgICAgICAgICAgICAgID0gQVZFUlJPUihFTk9TWVMpOworICAgIGludDY0X3QgaW5pdGlhbF9wb3MgICAgPSBhdmlvX3RlbGwoaW9jKTsKKworICAgIGlmICh2c3RyZWFtLT5uYl9pbmRleF9lbnRyaWVzPjApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiU2tpcHBpbmcgZHVwbGljYXRlIGluZGV4XG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHMtPmZsYWdzICYgQVZGTVRfRkxBR19JR05JRFgpCisgICAgICAgIHJldHVybiAwOworCisgICAgd2hpbGUgKGF2aW9fdGVsbChpb2MpIDwgbWF4X3BvcyAtIDIgJiYKKyAgICAgICAgICAgYW1mX2dldF9zdHJpbmcoaW9jLCBzdHJfdmFsLCBzaXplb2Yoc3RyX3ZhbCkpID4gMCkgeworICAgICAgICBpbnQ2NF90ICoqY3VycmVudF9hcnJheTsKKyAgICAgICAgdW5zaWduZWQgaW50IGFycmF5bGVuOworCisgICAgICAgIC8vIEV4cGVjdCBhcnJheSBvYmplY3QgaW4gY29udGV4dAorICAgICAgICBpZiAoYXZpb19yOChpb2MpICE9IEFNRl9EQVRBX1RZUEVfQVJSQVkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBhcnJheWxlbiA9IGF2aW9fcmIzMihpb2MpOworICAgICAgICBpZiAoYXJyYXlsZW4+PjI4KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgICAgICAgKCFzdHJjbXAoS0VZRlJBTUVTX1RJTUVTVEFNUF9UQUcgLCBzdHJfdmFsKSAmJiAhdGltZXMpIHsKKyAgICAgICAgICAgIGN1cnJlbnRfYXJyYXkgPSAmdGltZXM7CisgICAgICAgICAgICB0aW1lc2xlbiAgICAgID0gYXJyYXlsZW47CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChLRVlGUkFNRVNfQllURU9GRlNFVF9UQUcsIHN0cl92YWwpICYmCisgICAgICAgICAgICAgICAgICAgIWZpbGVwb3NpdGlvbnMpIHsKKyAgICAgICAgICAgIGN1cnJlbnRfYXJyYXkgPSAmZmlsZXBvc2l0aW9uczsKKyAgICAgICAgICAgIGZpbGVwb3NsZW4gICAgPSBhcnJheWxlbjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAvLyB1bmV4cGVjdGVkIG1ldGF0YWcgaW5zaWRlIGtleWZyYW1lcywgd2lsbCBub3QgdXNlIHN1Y2gKKyAgICAgICAgICAgIC8vIG1ldGFkYXRhIGZvciBpbmRleGluZworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKCEoKmN1cnJlbnRfYXJyYXkgPSBhdl9tYWxsb2N6KHNpemVvZigqKmN1cnJlbnRfYXJyYXkpICogYXJyYXlsZW4pKSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyYXlsZW4gJiYgYXZpb190ZWxsKGlvYykgPCBtYXhfcG9zIC0gMTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXZpb19yOChpb2MpICE9IEFNRl9EQVRBX1RZUEVfTlVNQkVSKQorICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgICAgIGN1cnJlbnRfYXJyYXlbMF1baV0gPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChpb2MpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGltZXMgJiYgZmlsZXBvc2l0aW9ucykgeworICAgICAgICAgICAgLy8gQWxsIGRvbmUsIGV4aXRpbmcgYXQgYSBwb3NpdGlvbiBhbGxvd2luZyBhbWZfcGFyc2Vfb2JqZWN0CisgICAgICAgICAgICAvLyB0byBmaW5pc2ggcGFyc2luZyB0aGUgb2JqZWN0CisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGltZXNsZW4gPT0gZmlsZXBvc2xlbiAmJiBmaWxlcG9zbGVuPjEgJiYgbWF4X3BvcyA8PSBmaWxlcG9zaXRpb25zWzBdKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWxlcG9zbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeSh2c3RyZWFtLCBmaWxlcG9zaXRpb25zW2ldLCB0aW1lc1tpXSAqIDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgICAgICAgICBpZiAoaSA8IDIpIHsKKyAgICAgICAgICAgICAgICBmbHYtPnZhbGlkYXRlX2luZGV4W2ldLnBvcyA9IGZpbGVwb3NpdGlvbnNbaV07CisgICAgICAgICAgICAgICAgZmx2LT52YWxpZGF0ZV9pbmRleFtpXS5kdHMgPSB0aW1lc1tpXSAqIDEwMDA7CisgICAgICAgICAgICAgICAgZmx2LT52YWxpZGF0ZV9jb3VudCAgICAgICAgPSBpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CitpbnZhbGlkOgorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIGtleWZyYW1lcyBvYmplY3QsIHNraXBwaW5nLlxuIik7CisgICAgfQorCitmaW5pc2g6CisgICAgYXZfZnJlZXAoJnRpbWVzKTsKKyAgICBhdl9mcmVlcCgmZmlsZXBvc2l0aW9ucyk7CisgICAgYXZpb19zZWVrKGlvYywgaW5pdGlhbF9wb3MsIFNFRUtfU0VUKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtZl9wYXJzZV9vYmplY3QoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqYXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqdnN0cmVhbSwgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWF4X3BvcywgaW50IGRlcHRoKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphY29kZWMsICp2Y29kZWM7CisgICAgRkxWQ29udGV4dCAqZmx2ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICppb2M7CisgICAgQU1GRGF0YVR5cGUgYW1mX3R5cGU7CisgICAgY2hhciBzdHJfdmFsWzI1Nl07CisgICAgZG91YmxlIG51bV92YWw7CisKKyAgICBudW1fdmFsICA9IDA7CisgICAgaW9jICAgICAgPSBzLT5wYjsKKyAgICBhbWZfdHlwZSA9IGF2aW9fcjgoaW9jKTsKKworICAgIHN3aXRjaCAoYW1mX3R5cGUpIHsKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfTlVNQkVSOgorICAgICAgICBudW1fdmFsID0gYXZfaW50MmRvdWJsZShhdmlvX3JiNjQoaW9jKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9CT09MOgorICAgICAgICBudW1fdmFsID0gYXZpb19yOChpb2MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfU1RSSU5HOgorICAgICAgICBpZiAoYW1mX2dldF9zdHJpbmcoaW9jLCBzdHJfdmFsLCBzaXplb2Yoc3RyX3ZhbCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX09CSkVDVDoKKyAgICAgICAgaWYgKCh2c3RyZWFtIHx8IGFzdHJlYW0pICYmIGtleSAmJgorICAgICAgICAgICAgaW9jLT5zZWVrYWJsZSAmJgorICAgICAgICAgICAgIXN0cmNtcChLRVlGUkFNRVNfVEFHLCBrZXkpICYmIGRlcHRoID09IDEpCisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5ZnJhbWVzX2luZGV4KHMsIGlvYywgdnN0cmVhbSA/IHZzdHJlYW0gOiBhc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcG9zKSA8IDApCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIktleWZyYW1lIGluZGV4IHBhcnNpbmcgZmFpbGVkXG4iKTsKKworICAgICAgICB3aGlsZSAoYXZpb190ZWxsKGlvYykgPCBtYXhfcG9zIC0gMiAmJgorICAgICAgICAgICAgICAgYW1mX2dldF9zdHJpbmcoaW9jLCBzdHJfdmFsLCBzaXplb2Yoc3RyX3ZhbCkpID4gMCkKKyAgICAgICAgICAgIGlmIChhbWZfcGFyc2Vfb2JqZWN0KHMsIGFzdHJlYW0sIHZzdHJlYW0sIHN0cl92YWwsIG1heF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCArIDEpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAvLyBpZiB3ZSBjb3VsZG4ndCBza2lwLCBib21iIG91dC4KKyAgICAgICAgaWYgKGF2aW9fcjgoaW9jKSAhPSBBTUZfRU5EX09GX09CSkVDVCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX05VTEw6CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX1VOREVGSU5FRDoKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfVU5TVVBQT1JURUQ6CisgICAgICAgIGJyZWFrOyAgICAgLy8gdGhlc2UgdGFrZSB1cCBubyBhZGRpdGlvbmFsIHNwYWNlCisgICAgY2FzZSBBTUZfREFUQV9UWVBFX01JWEVEQVJSQVk6CisgICAgICAgIGF2aW9fc2tpcChpb2MsIDQpOyAgICAgLy8gc2tpcCAzMi1iaXQgbWF4IGFycmF5IGluZGV4CisgICAgICAgIHdoaWxlIChhdmlvX3RlbGwoaW9jKSA8IG1heF9wb3MgLSAyICYmCisgICAgICAgICAgICAgICBhbWZfZ2V0X3N0cmluZyhpb2MsIHN0cl92YWwsIHNpemVvZihzdHJfdmFsKSkgPiAwKQorICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgb25seSBjYXNlIGluIHdoaWNoIHdlIHdvdWxkIHdhbnQgYSBuZXN0ZWQKKyAgICAgICAgICAgIC8vIHBhcnNlIHRvIG5vdCBza2lwIG92ZXIgdGhlIG9iamVjdAorICAgICAgICAgICAgaWYgKGFtZl9wYXJzZV9vYmplY3QocywgYXN0cmVhbSwgdnN0cmVhbSwgc3RyX3ZhbCwgbWF4X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoICsgMSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGF2aW9fcjgoaW9jKSAhPSBBTUZfRU5EX09GX09CSkVDVCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX0FSUkFZOgorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGFycmF5bGVuLCBpOworCisgICAgICAgIGFycmF5bGVuID0gYXZpb19yYjMyKGlvYyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnJheWxlbiAmJiBhdmlvX3RlbGwoaW9jKSA8IG1heF9wb3MgLSAxOyBpKyspCisgICAgICAgICAgICBpZiAoYW1mX3BhcnNlX29iamVjdChzLCBOVUxMLCBOVUxMLCBOVUxMLCBtYXhfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggKyAxKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgIC8vIGlmIHdlIGNvdWxkbid0IHNraXAsIGJvbWIgb3V0LgorICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfREFURToKKyAgICAgICAgYXZpb19za2lwKGlvYywgOCArIDIpOyAgLy8gdGltZXN0YW1wIChkb3VibGUpIGFuZCBVVEMgb2Zmc2V0IChpbnQxNikKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIHR5cGUsIHdlIGNvdWxkbid0IHNraXAKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChrZXkpIHsKKyAgICAgICAgLy8gc3RyZWFtIGluZm8gZG9lc24ndCBsaXZlIGFueSBkZWVwZXIgdGhhbiB0aGUgZmlyc3Qgb2JqZWN0CisgICAgICAgIGlmIChkZXB0aCA9PSAxKSB7CisgICAgICAgICAgICBhY29kZWMgPSBhc3RyZWFtID8gYXN0cmVhbS0+Y29kZWMgOiBOVUxMOworICAgICAgICAgICAgdmNvZGVjID0gdnN0cmVhbSA/IHZzdHJlYW0tPmNvZGVjIDogTlVMTDsKKworICAgICAgICAgICAgaWYgKGFtZl90eXBlID09IEFNRl9EQVRBX1RZUEVfTlVNQkVSIHx8CisgICAgICAgICAgICAgICAgYW1mX3R5cGUgPT0gQU1GX0RBVEFfVFlQRV9CT09MKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoa2V5LCAiZHVyYXRpb24iKSkKKyAgICAgICAgICAgICAgICAgICAgcy0+ZHVyYXRpb24gPSBudW1fdmFsICogQVZfVElNRV9CQVNFOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAidmlkZW9kYXRhcmF0ZSIpICYmIHZjb2RlYyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIDAgPD0gKGludCkobnVtX3ZhbCAqIDEwMjQuMCkpCisgICAgICAgICAgICAgICAgICAgIHZjb2RlYy0+Yml0X3JhdGUgPSBudW1fdmFsICogMTAyNC4wOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiYXVkaW9kYXRhcmF0ZSIpICYmIGFjb2RlYyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIDAgPD0gKGludCkobnVtX3ZhbCAqIDEwMjQuMCkpCisgICAgICAgICAgICAgICAgICAgIGFjb2RlYy0+Yml0X3JhdGUgPSBudW1fdmFsICogMTAyNC4wOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiZGF0YXN0cmVhbSIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IGNyZWF0ZV9zdHJlYW0ocywgQVZNRURJQV9UWVBFX0RBVEEpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1RFWFQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbHYtPnRydXN0X21ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGtleSwgInZpZGVvY29kZWNpZCIpICYmIHZjb2RlYykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmx2X3NldF92aWRlb19jb2RlYyhzLCB2c3RyZWFtLCBudW1fdmFsLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgImF1ZGlvY29kZWNpZCIpICYmIGFjb2RlYykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gKChpbnQpbnVtX3ZhbCkgPDwgRkxWX0FVRElPX0NPREVDSURfT0ZGU0VUOworICAgICAgICAgICAgICAgICAgICAgICAgZmx2X3NldF9hdWRpb19jb2RlYyhzLCBhc3RyZWFtLCBhY29kZWMsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgImF1ZGlvc2FtcGxlcmF0ZSIpICYmIGFjb2RlYykgeworICAgICAgICAgICAgICAgICAgICAgICAgYWNvZGVjLT5zYW1wbGVfcmF0ZSA9IG51bV92YWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJhdWRpb3NhbXBsZXNpemUiKSAmJiBhY29kZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgInN0ZXJlbyIpICYmIGFjb2RlYykgeworICAgICAgICAgICAgICAgICAgICAgICAgYWNvZGVjLT5jaGFubmVscyAgICAgICA9IG51bV92YWwgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgYWNvZGVjLT5jaGFubmVsX2xheW91dCA9IGFjb2RlYy0+Y2hhbm5lbHMgPT0gMiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJ3aWR0aCIpICYmIHZjb2RlYykgeworICAgICAgICAgICAgICAgICAgICAgICAgdmNvZGVjLT53aWR0aCA9IG51bV92YWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJoZWlnaHQiKSAmJiB2Y29kZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZjb2RlYy0+aGVpZ2h0ID0gbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhbWZfdHlwZSA9PSBBTUZfREFUQV9UWVBFX09CSkVDVCAmJiBzLT5uYl9zdHJlYW1zID09IDEgJiYKKyAgICAgICAgICAgKCghYWNvZGVjICYmICFzdHJjbXAoa2V5LCAiYXVkaW9jb2RlY2lkIikpIHx8CisgICAgICAgICAgICAoIXZjb2RlYyAmJiAhc3RyY21wKGtleSwgInZpZGVvY29kZWNpZCIpKSkpCisgICAgICAgICAgICAgICAgcy0+Y3R4X2ZsYWdzICY9IH5BVkZNVENUWF9OT0hFQURFUjsgLy9JZiB0aGVyZSBpcyBlaXRoZXIgYXVkaW8vdmlkZW8gbWlzc2luZywgY29kZWNpZCB3aWxsIGJlIGFuIGVtcHR5IG9iamVjdAorCisgICAgICAgIGlmICghc3RyY21wKGtleSwgImR1cmF0aW9uIikgICAgICAgIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgImZpbGVzaXplIikgICAgICAgIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgIndpZHRoIikgICAgICAgICAgIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgImhlaWdodCIpICAgICAgICAgIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgInZpZGVvZGF0YXJhdGUiKSAgIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgImZyYW1lcmF0ZSIpICAgICAgIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgInZpZGVvY29kZWNpZCIpICAgIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgImF1ZGlvZGF0YXJhdGUiKSAgIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgImF1ZGlvc2FtcGxlcmF0ZSIpIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgImF1ZGlvc2FtcGxlc2l6ZSIpIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgInN0ZXJlbyIpICAgICAgICAgIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgImF1ZGlvY29kZWNpZCIpICAgIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgImRhdGFzdHJlYW0iKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHMtPmV2ZW50X2ZsYWdzIHw9IEFWRk1UX0VWRU5UX0ZMQUdfTUVUQURBVEFfVVBEQVRFRDsKKyAgICAgICAgaWYgKGFtZl90eXBlID09IEFNRl9EQVRBX1RZUEVfQk9PTCkgeworICAgICAgICAgICAgYXZfc3RybGNweShzdHJfdmFsLCBudW1fdmFsID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJfdmFsKSk7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsIGtleSwgc3RyX3ZhbCwgMCk7CisgICAgICAgIH0gZWxzZSBpZiAoYW1mX3R5cGUgPT0gQU1GX0RBVEFfVFlQRV9OVU1CRVIpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHN0cl92YWwsIHNpemVvZihzdHJfdmFsKSwgIiUuZiIsIG51bV92YWwpOworICAgICAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBrZXksIHN0cl92YWwsIDApOworICAgICAgICB9IGVsc2UgaWYgKGFtZl90eXBlID09IEFNRl9EQVRBX1RZUEVfU1RSSU5HKQorICAgICAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBrZXksIHN0cl92YWwsIDApOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsdl9yZWFkX21ldGFib2R5KEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCBuZXh0X3BvcykKK3sKKyAgICBBTUZEYXRhVHlwZSB0eXBlOworICAgIEFWU3RyZWFtICpzdHJlYW0sICphc3RyZWFtLCAqdnN0cmVhbTsKKyAgICBBVlN0cmVhbSBhdl91bnVzZWQgKmRzdHJlYW07CisgICAgQVZJT0NvbnRleHQgKmlvYzsKKyAgICBpbnQgaTsKKyAgICAvLyBvbmx5IG5lZWRzIHRvIGhvbGQgdGhlIHN0cmluZyAib25NZXRhRGF0YSIuCisgICAgLy8gQW55dGhpbmcgbG9uZ2VyIGlzIHNvbWV0aGluZyB3ZSBkb24ndCB3YW50LgorICAgIGNoYXIgYnVmZmVyWzExXTsKKworICAgIGFzdHJlYW0gPSBOVUxMOworICAgIHZzdHJlYW0gPSBOVUxMOworICAgIGRzdHJlYW0gPSBOVUxMOworICAgIGlvYyAgICAgPSBzLT5wYjsKKworICAgIC8vIGZpcnN0IG9iamVjdCBuZWVkcyB0byBiZSAib25NZXRhRGF0YSIgc3RyaW5nCisgICAgdHlwZSA9IGF2aW9fcjgoaW9jKTsKKyAgICBpZiAodHlwZSAhPSBBTUZfREFUQV9UWVBFX1NUUklORyB8fAorICAgICAgICBhbWZfZ2V0X3N0cmluZyhpb2MsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKCFzdHJjbXAoYnVmZmVyLCAib25UZXh0RGF0YSIpKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGlmIChzdHJjbXAoYnVmZmVyLCAib25NZXRhRGF0YSIpICYmIHN0cmNtcChidWZmZXIsICJvbkN1ZVBvaW50IikpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vIGZpbmQgdGhlIHN0cmVhbXMgbm93IHNvIHRoYXQgYW1mX3BhcnNlX29iamVjdCBkb2Vzbid0IG5lZWQgdG8gZG8KKyAgICAvLyB0aGUgbG9va3VwIGV2ZXJ5IHRpbWUgaXQgaXMgY2FsbGVkLgorICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgc3RyZWFtID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKHN0cmVhbS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgdnN0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgZWxzZSBpZiAoc3RyZWFtLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgICAgICBhc3RyZWFtID0gc3RyZWFtOworICAgICAgICBlbHNlIGlmIChzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9EQVRBKQorICAgICAgICAgICAgZHN0cmVhbSA9IHN0cmVhbTsKKyAgICB9CisKKyAgICAvLyBwYXJzZSB0aGUgc2Vjb25kIG9iamVjdCAod2Ugd2FudCBhIG1peGVkIGFycmF5KQorICAgIGlmIChhbWZfcGFyc2Vfb2JqZWN0KHMsIGFzdHJlYW0sIHZzdHJlYW0sIGJ1ZmZlciwgbmV4dF9wb3MsIDApIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmx2X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgb2Zmc2V0LCBmbGFnczsKKworICAgIGF2aW9fc2tpcChzLT5wYiwgNCk7CisgICAgZmxhZ3MgPSBhdmlvX3I4KHMtPnBiKTsKKworICAgIHMtPmN0eF9mbGFncyB8PSBBVkZNVENUWF9OT0hFQURFUjsKKworICAgIGlmIChmbGFncyAmIEZMVl9IRUFERVJfRkxBR19IQVNWSURFTykKKyAgICAgICAgaWYgKCFjcmVhdGVfc3RyZWFtKHMsIEFWTUVESUFfVFlQRV9WSURFTykpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmIChmbGFncyAmIEZMVl9IRUFERVJfRkxBR19IQVNBVURJTykKKyAgICAgICAgaWYgKCFjcmVhdGVfc3RyZWFtKHMsIEFWTUVESUFfVFlQRV9BVURJTykpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIC8vIEZsYWcgZG9lc24ndCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBzY3JpcHQtZGF0YSBwcmVzZW50LiBNdXN0CisgICAgLy8gY3JlYXRlIHRoYXQgc3RyZWFtIGlmIGl0J3MgZW5jb3VudGVyZWQuCisKKyAgICBvZmZzZXQgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGF2aW9fc2VlayhzLT5wYiwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKKworICAgIHMtPnN0YXJ0X3RpbWUgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmx2X3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIEZMVkNvbnRleHQgKmZsdiA9IHMtPnByaXZfZGF0YTsKKyAgICBmb3IgKGk9MDsgaTxGTFZfU1RSRUFNX1RZUEVfTkI7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmZsdi0+bmV3X2V4dHJhZGF0YVtpXSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmx2X2dldF9leHRyYWRhdGEoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIGludCBzaXplKQoreworICAgIGF2X2ZyZWUoc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcy0+cGIsIHNpemUpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbHZfcXVldWVfZXh0cmFkYXRhKEZMVkNvbnRleHQgKmZsdiwgQVZJT0NvbnRleHQgKnBiLCBpbnQgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKQoreworICAgIGF2X2ZyZWUoZmx2LT5uZXdfZXh0cmFkYXRhW3N0cmVhbV0pOworICAgIGZsdi0+bmV3X2V4dHJhZGF0YVtzdHJlYW1dID0gYXZfbWFsbG9jeihzaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFmbHYtPm5ld19leHRyYWRhdGFbc3RyZWFtXSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmbHYtPm5ld19leHRyYWRhdGFfc2l6ZVtzdHJlYW1dID0gc2l6ZTsKKyAgICBhdmlvX3JlYWQocGIsIGZsdi0+bmV3X2V4dHJhZGF0YVtzdHJlYW1dLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfaW5kZXhfZW50cmllcyhBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3QgcG9zKQoreworICAgIGludCBpLCBqLCBvdXQ7CisgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAiRm91bmQgaW52YWxpZCBpbmRleCBlbnRyaWVzLCBjbGVhcmluZyB0aGUgaW5kZXguXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIC8qIFJlbW92ZSBhbGwgaW5kZXggZW50cmllcyB0aGF0IHBvaW50IHRvID49IHBvcyAqLworICAgICAgICBvdXQgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3QtPm5iX2luZGV4X2VudHJpZXM7IGorKykKKyAgICAgICAgICAgIGlmIChzdC0+aW5kZXhfZW50cmllc1tqXS5wb3MgPCBwb3MpCisgICAgICAgICAgICAgICAgc3QtPmluZGV4X2VudHJpZXNbb3V0KytdID0gc3QtPmluZGV4X2VudHJpZXNbal07CisgICAgICAgIHN0LT5uYl9pbmRleF9lbnRyaWVzID0gb3V0OworICAgIH0KK30KKworc3RhdGljIGludCBhbWZfc2tpcF90YWcoQVZJT0NvbnRleHQgKnBiLCBBTUZEYXRhVHlwZSB0eXBlKQoreworICAgIGludCBuYiA9IC0xLCByZXQsIHBhcnNlX25hbWUgPSAxOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX05VTUJFUjoKKyAgICAgICAgYXZpb19za2lwKHBiLCA4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX0JPT0w6CisgICAgICAgIGF2aW9fc2tpcChwYiwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9TVFJJTkc6CisgICAgICAgIGF2aW9fc2tpcChwYiwgYXZpb19yYjE2KHBiKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9BUlJBWToKKyAgICAgICAgcGFyc2VfbmFtZSA9IDA7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX01JWEVEQVJSQVk6CisgICAgICAgIG5iID0gYXZpb19yYjMyKHBiKTsKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfT0JKRUNUOgorICAgICAgICB3aGlsZSghcGItPmVvZl9yZWFjaGVkICYmIChuYi0tID4gMCB8fCB0eXBlICE9IEFNRl9EQVRBX1RZUEVfQVJSQVkpKSB7CisgICAgICAgICAgICBpZiAocGFyc2VfbmFtZSkgeworICAgICAgICAgICAgICAgIGludCBzaXplID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHJldCA9IGFtZl9za2lwX3RhZyhwYiwgYXZpb19yOChwYikpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfTlVMTDoKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfT0JKRUNUX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsdl9kYXRhX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR0cywgaW50NjRfdCBuZXh0KQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdCAgICA9IE5VTEw7CisgICAgY2hhciBidWZbMjBdOworICAgIGludCByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGludCBpLCBsZW5ndGggPSAtMTsKKworICAgIHN3aXRjaCAoYXZpb19yOChwYikpIHsKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfTUlYRURBUlJBWToKKyAgICAgICAgYXZpb19zZWVrKHBiLCA0LCBTRUVLX0NVUik7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX09CSkVDVDoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBza2lwOworICAgIH0KKworICAgIHdoaWxlICgocmV0ID0gYW1mX2dldF9zdHJpbmcocGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA+IDApIHsKKyAgICAgICAgQU1GRGF0YVR5cGUgdHlwZSA9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAodHlwZSA9PSBBTUZfREFUQV9UWVBFX1NUUklORyAmJiAhc3RyY21wKGJ1ZiwgInRleHQiKSkgeworICAgICAgICAgICAgbGVuZ3RoID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIHJldCAgICA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYW1mX3NraXBfdGFnKHBiLCB0eXBlKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsZW5ndGggPCAwKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gc2tpcDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpID09IHMtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgc3QgPSBjcmVhdGVfc3RyZWFtKHMsIEFWTUVESUFfVFlQRV9EQVRBKTsKKyAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9URVhUOworICAgIH0KKworICAgIHBrdC0+ZHRzICA9IGR0czsKKyAgICBwa3QtPnB0cyAgPSBkdHM7CisgICAgcGt0LT5zaXplID0gcmV0OworCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgcGt0LT5mbGFncyAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CisKK3NraXA6CisgICAgYXZpb19zZWVrKHMtPnBiLCBuZXh0ICsgNCwgU0VFS19TRVQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmbHZfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEZMVkNvbnRleHQgKmZsdiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBpLCB0eXBlLCBzaXplLCBmbGFnczsKKyAgICBpbnQgc3RyZWFtX3R5cGU9LTE7CisgICAgaW50NjRfdCBuZXh0LCBwb3MsIG1ldGFfcG9zOworICAgIGludDY0X3QgZHRzLCBwdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBpbnQgYXZfdW5pbml0KGNoYW5uZWxzKTsKKyAgICBpbnQgYXZfdW5pbml0KHNhbXBsZV9yYXRlKTsKKyAgICBBVlN0cmVhbSAqc3QgICAgPSBOVUxMOworCisgICAgLyogcGt0IHNpemUgaXMgcmVwZWF0ZWQgYXQgZW5kLiBza2lwIGl0ICovCisgICAgZm9yICg7OyBhdmlvX3NraXAocy0+cGIsIDQpKSB7CisgICAgICAgIHBvcyAgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICB0eXBlID0gKGF2aW9fcjgocy0+cGIpICYgMHgxRik7CisgICAgICAgIHNpemUgPSBhdmlvX3JiMjQocy0+cGIpOworICAgICAgICBkdHMgID0gYXZpb19yYjI0KHMtPnBiKTsKKyAgICAgICAgZHRzIHw9IGF2aW9fcjgocy0+cGIpIDw8IDI0OworICAgICAgICBhdl9kbG9nKHMsICJ0eXBlOiVkLCBzaXplOiVkLCBkdHM6JSJQUklkNjQiIHBvczolIlBSSWQ2NCJcbiIsIHR5cGUsIHNpemUsIGR0cywgYXZpb190ZWxsKHMtPnBiKSk7CisgICAgICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICBhdmlvX3NraXAocy0+cGIsIDMpOyAvKiBzdHJlYW0gaWQsIGFsd2F5cyAwICovCisgICAgICAgIGZsYWdzID0gMDsKKworICAgICAgICBpZiAoZmx2LT52YWxpZGF0ZV9uZXh0IDwgZmx2LT52YWxpZGF0ZV9jb3VudCkgeworICAgICAgICAgICAgaW50NjRfdCB2YWxpZGF0ZV9wb3MgPSBmbHYtPnZhbGlkYXRlX2luZGV4W2Zsdi0+dmFsaWRhdGVfbmV4dF0ucG9zOworICAgICAgICAgICAgaWYgKHBvcyA9PSB2YWxpZGF0ZV9wb3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoRkZBQlMoZHRzIC0gZmx2LT52YWxpZGF0ZV9pbmRleFtmbHYtPnZhbGlkYXRlX25leHRdLmR0cykgPD0KKyAgICAgICAgICAgICAgICAgICAgVkFMSURBVEVfSU5ERVhfVFNfVEhSRVNIKSB7CisgICAgICAgICAgICAgICAgICAgIGZsdi0+dmFsaWRhdGVfbmV4dCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNsZWFyX2luZGV4X2VudHJpZXMocywgdmFsaWRhdGVfcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgZmx2LT52YWxpZGF0ZV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MgPiB2YWxpZGF0ZV9wb3MpIHsKKyAgICAgICAgICAgICAgICBjbGVhcl9pbmRleF9lbnRyaWVzKHMsIHZhbGlkYXRlX3Bvcyk7CisgICAgICAgICAgICAgICAgZmx2LT52YWxpZGF0ZV9jb3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbmV4dCA9IHNpemUgKyBhdmlvX3RlbGwocy0+cGIpOworCisgICAgICAgIGlmICh0eXBlID09IEZMVl9UQUdfVFlQRV9BVURJTykgeworICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBGTFZfU1RSRUFNX1RZUEVfQVVESU87CisgICAgICAgICAgICBmbGFncyAgICA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICAgICAgc2l6ZS0tOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRkxWX1RBR19UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBzdHJlYW1fdHlwZSA9IEZMVl9TVFJFQU1fVFlQRV9WSURFTzsKKyAgICAgICAgICAgIGZsYWdzICAgID0gYXZpb19yOChzLT5wYik7CisgICAgICAgICAgICBzaXplLS07CisgICAgICAgICAgICBpZiAoKGZsYWdzICYgRkxWX1ZJREVPX0ZSQU1FVFlQRV9NQVNLKSA9PSBGTFZfRlJBTUVfVklERU9fSU5GT19DTUQpCisgICAgICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRkxWX1RBR19UWVBFX01FVEEpIHsKKyAgICAgICAgICAgIHN0cmVhbV90eXBlPUZMVl9TVFJFQU1fVFlQRV9EQVRBOworICAgICAgICAgICAgaWYgKHNpemUgPiAxMyArIDEgKyA0ICYmIGR0cyA9PSAwKSB7IC8vIEhlYWRlci10eXBlIG1ldGFkYXRhIHN0dWZmCisgICAgICAgICAgICAgICAgbWV0YV9wb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICAgICAgICAgIGlmIChmbHZfcmVhZF9tZXRhYm9keShzLCBuZXh0KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBtZXRhX3BvcywgU0VFS19TRVQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgZmx2IHBhY2tldDogdHlwZSAlZCwgc2l6ZSAlZCwgZmxhZ3MgJWQuXG4iLAorICAgICAgICAgICAgICAgICAgIHR5cGUsIHNpemUsIGZsYWdzKTsKK3NraXA6CisgICAgICAgICAgICBhdmlvX3NlZWsocy0+cGIsIG5leHQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogc2tpcCBlbXB0eSBkYXRhIHBhY2tldHMgKi8KKyAgICAgICAgaWYgKCFzaXplKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogbm93IGZpbmQgc3RyZWFtICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1fdHlwZSA9PSBGTFZfU1RSRUFNX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgICAgICAocy0+YXVkaW9fY29kZWNfaWQgfHwgZmx2X3NhbWVfYXVkaW9fY29kZWMoc3QtPmNvZGVjLCBmbGFncykpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtX3R5cGUgPT0gRkxWX1NUUkVBTV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICAgICAgICAgICAgICAgICAgKHMtPnZpZGVvX2NvZGVjX2lkIHx8IGZsdl9zYW1lX3ZpZGVvX2NvZGVjKHN0LT5jb2RlYywgZmxhZ3MpKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbV90eXBlID09IEZMVl9TVFJFQU1fVFlQRV9EQVRBKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gcy0+bmJfc3RyZWFtcykgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGVudW0gQVZNZWRpYVR5cGUgc3RyZWFtX3R5cGVzW10gPSB7QVZNRURJQV9UWVBFX1ZJREVPLCBBVk1FRElBX1RZUEVfQVVESU8sIEFWTUVESUFfVFlQRV9EQVRBfTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlN0cmVhbSBkaXNjb3ZlcmVkIGFmdGVyIGhlYWQgYWxyZWFkeSBwYXJzZWRcbiIpOworICAgICAgICAgICAgc3QgPSBjcmVhdGVfc3RyZWFtKHMsIHN0cmVhbV90eXBlc1tzdHJlYW1fdHlwZV0pOworICAgICAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIH0KKyAgICAgICAgYXZfZGxvZyhzLCAiJWQgJVggJWQgXG4iLCBzdHJlYW1fdHlwZSwgZmxhZ3MsIHN0LT5kaXNjYXJkKTsKKworICAgICAgICBpZiAoKGZsYWdzICYgRkxWX1ZJREVPX0ZSQU1FVFlQRV9NQVNLKSA9PSBGTFZfRlJBTUVfS0VZIHx8CisgICAgICAgICAgICBzdHJlYW1fdHlwZSA9PSBGTFZfU1RSRUFNX1RZUEVfQVVESU8pCisgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIHBvcywgZHRzLCBzaXplLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKKworICAgICAgICBpZiAoICAoc3QtPmRpc2NhcmQgPj0gQVZESVNDQVJEX05PTktFWSAmJiAhKChmbGFncyAmIEZMVl9WSURFT19GUkFNRVRZUEVfTUFTSykgPT0gRkxWX0ZSQU1FX0tFWSB8fCAoc3RyZWFtX3R5cGUgPT0gRkxWX1NUUkVBTV9UWVBFX0FVRElPKSkpCisgICAgICAgICAgICB8fChzdC0+ZGlzY2FyZCA+PSBBVkRJU0NBUkRfQklESVIgICYmICAoKGZsYWdzICYgRkxWX1ZJREVPX0ZSQU1FVFlQRV9NQVNLKSA9PSBGTFZfRlJBTUVfRElTUF9JTlRFUiAmJiAoc3RyZWFtX3R5cGUgPT0gRkxWX1NUUkVBTV9UWVBFX1ZJREVPKSkpCisgICAgICAgICAgICB8fCBzdC0+ZGlzY2FyZCA+PSBBVkRJU0NBUkRfQUxMCisgICAgICAgICkgeworICAgICAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBuZXh0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBpZiBub3Qgc3RyZWFtZWQgYW5kIG5vIGR1cmF0aW9uIGZyb20gbWV0YWRhdGEgdGhlbiBzZWVrIHRvIGVuZCB0byBmaW5kCisgICAgLy8gdGhlIGR1cmF0aW9uIGZyb20gdGhlIHRpbWVzdGFtcHMKKyAgICBpZiAocy0+cGItPnNlZWthYmxlICYmICghcy0+ZHVyYXRpb24gfHwgcy0+ZHVyYXRpb24gPT0gQVZfTk9QVFNfVkFMVUUpICYmICFmbHYtPnNlYXJjaGVkX2Zvcl9lbmQpIHsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGNvbnN0IGludDY0X3QgcG9zICAgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICAvLyBSZWFkIHRoZSBsYXN0IDQgYnl0ZXMgb2YgdGhlIGZpbGUsIHRoaXMgc2hvdWxkIGJlIHRoZSBzaXplIG9mIHRoZQorICAgICAgICAvLyBwcmV2aW91cyBGTFYgdGFnLiBVc2UgdGhlIHRpbWVzdGFtcCBvZiBpdHMgcGF5bG9hZCBhcyBkdXJhdGlvbi4KKyAgICAgICAgaW50NjRfdCBmc2l6ZSAgICAgICA9IGF2aW9fc2l6ZShzLT5wYik7CityZXRyeV9kdXJhdGlvbjoKKyAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBmc2l6ZSAtIDQsIFNFRUtfU0VUKTsKKyAgICAgICAgc2l6ZSA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgICAgIC8vIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsYXN0IEZMViB0YWcgYXQgcG9zaXRpb24gKGZzaXplIC0gNCAtIHNpemUpCisgICAgICAgIC8vIGJ1dCBza2lwIHRoZSBieXRlIGluZGljYXRpbmcgdGhlIHR5cGUuCisgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgZnNpemUgLSAzIC0gc2l6ZSwgU0VFS19TRVQpOworICAgICAgICBpZiAoc2l6ZSA9PSBhdmlvX3JiMjQocy0+cGIpICsgMTEpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRzID0gYXZpb19yYjI0KHMtPnBiKTsKKyAgICAgICAgICAgIHRzICAgICAgICAgfD0gYXZpb19yOChzLT5wYikgPDwgMjQ7CisgICAgICAgICAgICBpZiAodHMpCisgICAgICAgICAgICAgICAgcy0+ZHVyYXRpb24gPSB0cyAqIChpbnQ2NF90KUFWX1RJTUVfQkFTRSAvIDEwMDA7CisgICAgICAgICAgICBlbHNlIGlmIChmc2l6ZSA+PSA4ICYmIGZzaXplIC0gOCA+PSBzaXplKSB7CisgICAgICAgICAgICAgICAgZnNpemUgLT0gc2l6ZSs0OworICAgICAgICAgICAgICAgIGdvdG8gcmV0cnlfZHVyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIHBvcywgU0VFS19TRVQpOworICAgICAgICBmbHYtPnNlYXJjaGVkX2Zvcl9lbmQgPSAxOworICAgIH0KKworICAgIGlmIChzdHJlYW1fdHlwZSA9PSBGTFZfU1RSRUFNX1RZUEVfQVVESU8pIHsKKyAgICAgICAgaW50IGJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgY2hhbm5lbHMgPSAoZmxhZ3MgJiBGTFZfQVVESU9fQ0hBTk5FTF9NQVNLKSA9PSBGTFZfU1RFUkVPID8gMiA6IDE7CisgICAgICAgIHNhbXBsZV9yYXRlID0gNDQxMDAgPDwgKChmbGFncyAmIEZMVl9BVURJT19TQU1QTEVSQVRFX01BU0spID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVl9BVURJT19TQU1QTEVSQVRFX09GRlNFVCkgPj4gMzsKKyAgICAgICAgYml0c19wZXJfY29kZWRfc2FtcGxlID0gKGZsYWdzICYgRkxWX0FVRElPX1NBTVBMRVNJWkVfTUFTSykgPyAxNiA6IDg7CisgICAgICAgIGlmICghc3QtPmNvZGVjLT5jaGFubmVscyB8fCAhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSB8fAorICAgICAgICAgICAgIXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICAgICAgICA9IGNoYW5uZWxzOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCAgICAgICAgPSBjaGFubmVscyA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQVZfQ0hfTEFZT1VUX01PTk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSBzYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICB9CisgICAgICAgIGlmICghc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgICAgICAgICAgZmx2X3NldF9hdWRpb19jb2RlYyhzLCBzdCwgc3QtPmNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEZMVl9BVURJT19DT0RFQ0lEX01BU0spOworICAgICAgICAgICAgZmx2LT5sYXN0X3NhbXBsZV9yYXRlID0KKyAgICAgICAgICAgIHNhbXBsZV9yYXRlICAgICAgICAgICA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICBmbHYtPmxhc3RfY2hhbm5lbHMgICAgPQorICAgICAgICAgICAgY2hhbm5lbHMgICAgICAgICAgICAgID0gc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0IGN0eCA9IHswfTsKKyAgICAgICAgICAgIGN0eC5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICAgICAgICAgICAgY3R4LmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgICAgIGZsdl9zZXRfYXVkaW9fY29kZWMocywgc3QsICZjdHgsIGZsYWdzICYgRkxWX0FVRElPX0NPREVDSURfTUFTSyk7CisgICAgICAgICAgICBzYW1wbGVfcmF0ZSA9IGN0eC5zYW1wbGVfcmF0ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyZWFtX3R5cGUgPT0gRkxWX1NUUkVBTV9UWVBFX1ZJREVPKSB7CisgICAgICAgIHNpemUgLT0gZmx2X3NldF92aWRlb19jb2RlYyhzLCBzdCwgZmxhZ3MgJiBGTFZfVklERU9fQ09ERUNJRF9NQVNLLCAxKTsKKyAgICB9CisKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgfHwKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKKyAgICAgICAgaW50IHR5cGUgPSBhdmlvX3I4KHMtPnBiKTsKKyAgICAgICAgc2l6ZS0tOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8IHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKKyAgICAgICAgICAgIC8vIHNpZ24gZXh0ZW5zaW9uCisgICAgICAgICAgICBpbnQzMl90IGN0cyA9IChhdmlvX3JiMjQocy0+cGIpICsgMHhmZjgwMDAwMCkgXiAweGZmODAwMDAwOworICAgICAgICAgICAgcHRzID0gZHRzICsgY3RzOworICAgICAgICAgICAgaWYgKGN0cyA8IDApIHsgLy8gZHRzIG1pZ2h0IGJlIHdyb25nCisgICAgICAgICAgICAgICAgaWYgKCFmbHYtPndyb25nX2R0cykKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGN0cywgcHJldmlvdXMgdGltZXN0YW1wcyBtaWdodCBiZSB3cm9uZy5cbiIpOworICAgICAgICAgICAgICAgIGZsdi0+d3JvbmdfZHRzID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRkZBQlMoZHRzIC0gcHRzKSA+IDEwMDAqNjAqMTUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHRpbWVzdGFtcHMgJSJQUklkNjQiICUiUFJJZDY0IlxuIiwgZHRzLCBwdHMpOworICAgICAgICAgICAgICAgIGR0cyA9IHB0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IDAgJiYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YSB8fCBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyB8fAorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSkgeworICAgICAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQ7CisKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmx2X3F1ZXVlX2V4dHJhZGF0YShmbHYsIHMtPnBiLCBzdHJlYW1fdHlwZSwgc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgICAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocmV0ID0gZmx2X2dldF9leHRyYWRhdGEocywgc3QsIHNpemUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgLyogV29ya2Fyb3VuZCBmb3IgYnVnZ3kgT21uaWEgQS9YRSBlbmNvZGVyICovCisgICAgICAgICAgICB0ID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJFbmNvZGVyIiwgTlVMTCwgMCk7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYgdCAmJiAhc3RyY21wKHQtPnZhbHVlLCAiT21uaWEgQS9YRSIpKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAyOworCisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYgMCkgeworICAgICAgICAgICAgICAgIE1QRUc0QXVkaW9Db25maWcgY2ZnOworCisgICAgICAgICAgICAgICAgaWYgKGF2cHJpdl9tcGVnNGF1ZGlvX2dldF9jb25maWcoJmNmZywgc3QtPmNvZGVjLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICogOCwgMSkgPj0gMCkgeworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSBjZmcuY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGNmZy5leHRfc2FtcGxlX3JhdGUpCisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBjZmcuZXh0X3NhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGNmZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBhdl9kbG9nKHMsICJtcDRhIGNvbmZpZyBjaGFubmVscyAlZCBzYW1wbGUgcmF0ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFQUdBSU4pOworICAgICAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNraXAgZW1wdHkgZGF0YSBwYWNrZXRzICovCisgICAgaWYgKCFzaXplKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHBrdC0+ZHRzICAgICAgICAgID0gZHRzOworICAgIHBrdC0+cHRzICAgICAgICAgID0gcHRzID09IEFWX05PUFRTX1ZBTFVFID8gZHRzIDogcHRzOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIGlmIChmbHYtPm5ld19leHRyYWRhdGFbc3RyZWFtX3R5cGVdKSB7CisgICAgICAgIHVpbnQ4X3QgKnNpZGUgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHYtPm5ld19leHRyYWRhdGFfc2l6ZVtzdHJlYW1fdHlwZV0pOworICAgICAgICBpZiAoc2lkZSkgeworICAgICAgICAgICAgbWVtY3B5KHNpZGUsIGZsdi0+bmV3X2V4dHJhZGF0YVtzdHJlYW1fdHlwZV0sCisgICAgICAgICAgICAgICAgICAgZmx2LT5uZXdfZXh0cmFkYXRhX3NpemVbc3RyZWFtX3R5cGVdKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZmbHYtPm5ld19leHRyYWRhdGFbc3RyZWFtX3R5cGVdKTsKKyAgICAgICAgICAgIGZsdi0+bmV3X2V4dHJhZGF0YV9zaXplW3N0cmVhbV90eXBlXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0cmVhbV90eXBlID09IEZMVl9TVFJFQU1fVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgICAgICAoc2FtcGxlX3JhdGUgIT0gZmx2LT5sYXN0X3NhbXBsZV9yYXRlIHx8CisgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyAgICAhPSBmbHYtPmxhc3RfY2hhbm5lbHMpKSB7CisgICAgICAgIGZsdi0+bGFzdF9zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICAgICAgICBmbHYtPmxhc3RfY2hhbm5lbHMgICAgPSBjaGFubmVsczsKKyAgICAgICAgZmZfYWRkX3BhcmFtX2NoYW5nZShwa3QsIGNoYW5uZWxzLCAwLCBzYW1wbGVfcmF0ZSwgMCwgMCk7CisgICAgfQorCisgICAgaWYgKCAgICBzdHJlYW1fdHlwZSA9PSBGTFZfU1RSRUFNX1RZUEVfQVVESU8gfHwKKyAgICAgICAgICAgICgoZmxhZ3MgJiBGTFZfVklERU9fRlJBTUVUWVBFX01BU0spID09IEZMVl9GUkFNRV9LRVkpIHx8CisgICAgICAgICAgICBzdHJlYW1fdHlwZSA9PSBGTFZfU1RSRUFNX1RZUEVfREFUQSkKKyAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisKK2xlYXZlOgorICAgIGF2aW9fc2tpcChzLT5wYiwgNCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmbHZfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRzLCBpbnQgZmxhZ3MpCit7CisgICAgRkxWQ29udGV4dCAqZmx2ID0gcy0+cHJpdl9kYXRhOworICAgIGZsdi0+dmFsaWRhdGVfY291bnQgPSAwOworICAgIHJldHVybiBhdmlvX3NlZWtfdGltZShzLT5wYiwgc3RyZWFtX2luZGV4LCB0cywgZmxhZ3MpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGTFZDb250ZXh0LCB4KQorI2RlZmluZSBWRCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImZsdl9tZXRhZGF0YSIsICJBbGxvY2F0ZSBzdHJlYW1zIGFjY29yZGluZyB0byB0aGUgb25NZXRhRGF0YSBhcnJheSIsIE9GRlNFVCh0cnVzdF9tZXRhZGF0YSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRCB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmbHZfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZmx2ZGVjIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfZmx2X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImZsdiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZMViAoRmxhc2ggVmlkZW8pIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZMVkNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGZsdl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBmbHZfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmx2X3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IGZsdl9yZWFkX3NlZWssCisgICAgLnJlYWRfY2xvc2UgICAgID0gZmx2X3JlYWRfY2xvc2UsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImZsdiIsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmZsdl9jbGFzcywKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGxpdmVfZmx2X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImxpdmVfZmx2ZGVjIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfbGl2ZV9mbHZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGl2ZV9mbHYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaXZlIFJUTVAgRkxWIChGbGFzaCBWaWRlbykiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkxWQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gbGl2ZV9mbHZfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZmx2X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZsdl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSBmbHZfcmVhZF9zZWVrLAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGZsdl9yZWFkX2Nsb3NlLAorICAgIC5leHRlbnNpb25zICAgICA9ICJmbHYiLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZsaXZlX2Zsdl9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9UU19ESVNDT05UCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZsdmVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZsdmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjhjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZmx2ZW5jLmMKQEAgLTAsMCArMSw2NTYgQEAKKy8qCisgKiBGTFYgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2Yy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiZmx2LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorCisKK3N0YXRpYyBjb25zdCBBVkNvZGVjVGFnIGZsdl92aWRlb19jb2RlY19pZHNbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX0ZMVjEsICAgICBGTFZfQ09ERUNJRF9IMjYzIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjYzLCAgICAgRkxWX0NPREVDSURfUkVBTEgyNjMgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICBGTFZfQ09ERUNJRF9NUEVHNCB9LAorICAgIHsgQVZfQ09ERUNfSURfRkxBU0hTViwgIEZMVl9DT0RFQ0lEX1NDUkVFTiB9LAorICAgIHsgQVZfQ09ERUNfSURfRkxBU0hTVjIsIEZMVl9DT0RFQ0lEX1NDUkVFTjIgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQNkYsICAgICBGTFZfQ09ERUNJRF9WUDYgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQNiwgICAgICBGTFZfQ09ERUNJRF9WUDYgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQNkEsICAgICBGTFZfQ09ERUNJRF9WUDZBIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgICAgRkxWX0NPREVDSURfSDI2NCB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgIDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgZmx2X2F1ZGlvX2NvZGVjX2lkc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfTVAzLCAgICAgICAgRkxWX0NPREVDSURfTVAzICAgICAgICA+PiBGTFZfQVVESU9fQ09ERUNJRF9PRkZTRVQgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9VOCwgICAgIEZMVl9DT0RFQ0lEX1BDTSAgICAgICAgPj4gRkxWX0FVRElPX0NPREVDSURfT0ZGU0VUIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2QkUsICBGTFZfQ09ERUNJRF9QQ00gICAgICAgID4+IEZMVl9BVURJT19DT0RFQ0lEX09GRlNFVCB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MxNkxFLCAgRkxWX0NPREVDSURfUENNX0xFICAgICA+PiBGTFZfQVVESU9fQ09ERUNJRF9PRkZTRVQgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FEUENNX1NXRiwgIEZMVl9DT0RFQ0lEX0FEUENNICAgICAgPj4gRkxWX0FVRElPX0NPREVDSURfT0ZGU0VUIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BQUMsICAgICAgICBGTFZfQ09ERUNJRF9BQUMgICAgICAgID4+IEZMVl9BVURJT19DT0RFQ0lEX09GRlNFVCB9LAorICAgIHsgQVZfQ09ERUNfSURfTkVMTFlNT1NFUiwgRkxWX0NPREVDSURfTkVMTFlNT1NFUiA+PiBGTFZfQVVESU9fQ09ERUNJRF9PRkZTRVQgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9NVUxBVywgIEZMVl9DT0RFQ0lEX1BDTV9NVUxBVyAgPj4gRkxWX0FVRElPX0NPREVDSURfT0ZGU0VUIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fQUxBVywgICBGTFZfQ09ERUNJRF9QQ01fQUxBVyAgID4+IEZMVl9BVURJT19DT0RFQ0lEX09GRlNFVCB9LAorICAgIHsgQVZfQ09ERUNfSURfU1BFRVgsICAgICAgRkxWX0NPREVDSURfU1BFRVggICAgICA+PiBGTFZfQVVESU9fQ09ERUNJRF9PRkZTRVQgfSwKKyAgICB7IEFWX0NPREVDX0lEX05PTkUsICAgICAgIDAgfQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgRkxWQ29udGV4dCB7CisgICAgaW50ICAgICByZXNlcnZlZDsKKyAgICBpbnQ2NF90IGR1cmF0aW9uX29mZnNldDsKKyAgICBpbnQ2NF90IGZpbGVzaXplX29mZnNldDsKKyAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgIGludDY0X3QgZGVsYXk7ICAgICAgLy8vPCBmaXJzdCBkdHMgZGVsYXkgKG5lZWRlZCBmb3IgQVZDICYgU3BlZXgpCisKKyAgICBBVkNvZGVjQ29udGV4dCAqYXVkaW9fZW5jOworICAgIEFWQ29kZWNDb250ZXh0ICp2aWRlb19lbmM7CisgICAgZG91YmxlIGZyYW1lcmF0ZTsKKyAgICBBVkNvZGVjQ29udGV4dCAqZGF0YV9lbmM7Cit9IEZMVkNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IEZMVlN0cmVhbUNvbnRleHQgeworICAgIGludDY0X3QgbGFzdF90czsgICAgLy8vPCBsYXN0IHRpbWVzdGFtcCBmb3IgZWFjaCBzdHJlYW0KK30gRkxWU3RyZWFtQ29udGV4dDsKKworc3RhdGljIGludCBnZXRfYXVkaW9fZmxhZ3MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqZW5jKQoreworICAgIGludCBmbGFncyA9IChlbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNikgPyBGTFZfU0FNUExFU1NJWkVfMTZCSVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkxWX1NBTVBMRVNTSVpFXzhCSVQ7CisKKyAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIC8vIHNwZWNzIGZvcmNlIHRoZXNlIHBhcmFtZXRlcnMKKyAgICAgICAgcmV0dXJuIEZMVl9DT0RFQ0lEX0FBQyB8IEZMVl9TQU1QTEVSQVRFXzQ0MTAwSFogfAorICAgICAgICAgICAgICAgRkxWX1NBTVBMRVNTSVpFXzE2QklUIHwgRkxWX1NURVJFTzsKKyAgICBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NQRUVYKSB7CisgICAgICAgIGlmIChlbmMtPnNhbXBsZV9yYXRlICE9IDE2MDAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJGTFYgb25seSBzdXBwb3J0cyB3aWRlYmFuZCAoMTZrSHopIFNwZWV4IGF1ZGlvXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuYy0+Y2hhbm5lbHMgIT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZMViBvbmx5IHN1cHBvcnRzIG1vbm8gU3BlZXggYXVkaW9cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRkxWX0NPREVDSURfU1BFRVggfCBGTFZfU0FNUExFUkFURV8xMTAyNUhaIHwgRkxWX1NBTVBMRVNTSVpFXzE2QklUOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoZW5jLT5zYW1wbGVfcmF0ZSkgeworICAgICAgICBjYXNlIDQ0MTAwOgorICAgICAgICAgICAgZmxhZ3MgfD0gRkxWX1NBTVBMRVJBVEVfNDQxMDBIWjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIyMDUwOgorICAgICAgICAgICAgZmxhZ3MgfD0gRkxWX1NBTVBMRVJBVEVfMjIwNTBIWjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExMDI1OgorICAgICAgICAgICAgZmxhZ3MgfD0gRkxWX1NBTVBMRVJBVEVfMTEwMjVIWjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2MDAwOiAvLyBuZWxseW1vc2VyIG9ubHkKKyAgICAgICAgY2FzZSAgODAwMDogLy8gbmVsbHltb3NlciBvbmx5CisgICAgICAgIGNhc2UgIDU1MTI6IC8vIG5vdCBNUDMKKyAgICAgICAgICAgIGlmIChlbmMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QMykgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMVl9TQU1QTEVSQVRFX1NQRUNJQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJGTFYgZG9lcyBub3Qgc3VwcG9ydCBzYW1wbGUgcmF0ZSAlZCwgIgorICAgICAgICAgICAgICAgICAgICJjaG9vc2UgZnJvbSAoNDQxMDAsIDIyMDUwLCAxMTAyNSlcbiIsIGVuYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlbmMtPmNoYW5uZWxzID4gMSkKKyAgICAgICAgZmxhZ3MgfD0gRkxWX1NURVJFTzsKKworICAgIHN3aXRjaCAoZW5jLT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfTVAzOgorICAgICAgICBmbGFncyB8PSBGTFZfQ09ERUNJRF9NUDMgICAgfCBGTFZfU0FNUExFU1NJWkVfMTZCSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1U4OgorICAgICAgICBmbGFncyB8PSBGTFZfQ09ERUNJRF9QQ00gICAgfCBGTFZfU0FNUExFU1NJWkVfOEJJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU6CisgICAgICAgIGZsYWdzIHw9IEZMVl9DT0RFQ0lEX1BDTSAgICB8IEZMVl9TQU1QTEVTU0laRV8xNkJJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU6CisgICAgICAgIGZsYWdzIHw9IEZMVl9DT0RFQ0lEX1BDTV9MRSB8IEZMVl9TQU1QTEVTU0laRV8xNkJJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9TV0Y6CisgICAgICAgIGZsYWdzIHw9IEZMVl9DT0RFQ0lEX0FEUENNICB8IEZMVl9TQU1QTEVTU0laRV8xNkJJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9ORUxMWU1PU0VSOgorICAgICAgICBpZiAoZW5jLT5zYW1wbGVfcmF0ZSA9PSA4MDAwKQorICAgICAgICAgICAgZmxhZ3MgfD0gRkxWX0NPREVDSURfTkVMTFlNT1NFUl84S0haX01PTk8gIHwgRkxWX1NBTVBMRVNTSVpFXzE2QklUOworICAgICAgICBlbHNlIGlmIChlbmMtPnNhbXBsZV9yYXRlID09IDE2MDAwKQorICAgICAgICAgICAgZmxhZ3MgfD0gRkxWX0NPREVDSURfTkVMTFlNT1NFUl8xNktIWl9NT05PIHwgRkxWX1NBTVBMRVNTSVpFXzE2QklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmbGFncyB8PSBGTFZfQ09ERUNJRF9ORUxMWU1PU0VSICAgICAgICAgICAgfCBGTFZfU0FNUExFU1NJWkVfMTZCSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX01VTEFXOgorICAgICAgICBmbGFncyA9IEZMVl9DT0RFQ0lEX1BDTV9NVUxBVyB8IEZMVl9TQU1QTEVSQVRFX1NQRUNJQUwgfCBGTFZfU0FNUExFU1NJWkVfMTZCSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0FMQVc6CisgICAgICAgIGZsYWdzID0gRkxWX0NPREVDSURfUENNX0FMQVcgIHwgRkxWX1NBTVBMRVJBVEVfU1BFQ0lBTCB8IEZMVl9TQU1QTEVTU0laRV8xNkJJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAwOgorICAgICAgICBmbGFncyB8PSBlbmMtPmNvZGVjX3RhZyA8PCA0OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQXVkaW8gY29kZWMgJyVzJyBub3QgY29tcGF0aWJsZSB3aXRoIEZMVlxuIiwKKyAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUoZW5jLT5jb2RlY19pZCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiBmbGFnczsKK30KKworc3RhdGljIHZvaWQgcHV0X2FtZl9zdHJpbmcoQVZJT0NvbnRleHQgKnBiLCBjb25zdCBjaGFyICpzdHIpCit7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpOworICAgIGF2aW9fd2IxNihwYiwgbGVuKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBzdHIsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9hdmNfZW9zX3RhZyhBVklPQ29udGV4dCAqcGIsIHVuc2lnbmVkIHRzKQoreworICAgIGF2aW9fdzgocGIsIEZMVl9UQUdfVFlQRV9WSURFTyk7CisgICAgYXZpb193YjI0KHBiLCA1KTsgICAgICAgICAgICAgICAvKiBUYWcgRGF0YSBTaXplICovCisgICAgYXZpb193YjI0KHBiLCB0cyk7ICAgICAgICAgICAgICAvKiBsb3dlciAyNCBiaXRzIG9mIHRpbWVzdGFtcCBpbiBtcyAqLworICAgIGF2aW9fdzgocGIsICh0cyA+PiAyNCkgJiAweDdGKTsgLyogTVNCIG9mIHRzIGluIG1zICovCisgICAgYXZpb193YjI0KHBiLCAwKTsgICAgICAgICAgICAgICAvKiBTdHJlYW1JZCA9IDAgKi8KKyAgICBhdmlvX3c4KHBiLCAyMyk7ICAgICAgICAgICAgICAgIC8qIHViWzRdIEZyYW1lVHlwZSA9IDEsIHViWzRdIENvZGVjSWQgPSA3ICovCisgICAgYXZpb193OChwYiwgMik7ICAgICAgICAgICAgICAgICAvKiBBVkMgZW5kIG9mIHNlcXVlbmNlICovCisgICAgYXZpb193YjI0KHBiLCAwKTsgICAgICAgICAgICAgICAvKiBBbHdheXMgMCBmb3IgQVZDIEVPUy4gKi8KKyAgICBhdmlvX3diMzIocGIsIDE2KTsgICAgICAgICAgICAgIC8qIFNpemUgb2YgRkxWIHRhZyAqLworfQorCitzdGF0aWMgdm9pZCBwdXRfYW1mX2RvdWJsZShBVklPQ29udGV4dCAqcGIsIGRvdWJsZSBkKQoreworICAgIGF2aW9fdzgocGIsIEFNRl9EQVRBX1RZUEVfTlVNQkVSKTsKKyAgICBhdmlvX3diNjQocGIsIGF2X2RvdWJsZTJpbnQoZCkpOworfQorCitzdGF0aWMgdm9pZCBwdXRfYW1mX2Jvb2woQVZJT0NvbnRleHQgKnBiLCBpbnQgYikKK3sKKyAgICBhdmlvX3c4KHBiLCBBTUZfREFUQV9UWVBFX0JPT0wpOworICAgIGF2aW9fdzgocGIsICEhYik7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX21ldGFkYXRhKEFWRm9ybWF0Q29udGV4dCAqcywgdW5zaWduZWQgaW50IHRzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEZMVkNvbnRleHQgKmZsdiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgbWV0YWRhdGFfY291bnQgPSAwOworICAgIGludDY0X3QgbWV0YWRhdGFfc2l6ZV9wb3MsIGRhdGFfc2l6ZSwgbWV0YWRhdGFfY291bnRfcG9zOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0YWcgPSBOVUxMOworCisgICAgLyogd3JpdGUgbWV0YV90YWcgKi8KKyAgICBhdmlvX3c4KHBiLCAxOCk7ICAgICAgICAgICAgLy8gdGFnIHR5cGUgTUVUQQorICAgIG1ldGFkYXRhX3NpemVfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMjQocGIsIDApOyAgICAgICAgICAgLy8gc2l6ZSBvZiBkYXRhIHBhcnQgKHN1bSBvZiBhbGwgcGFydHMgYmVsb3cpCisgICAgYXZpb193YjI0KHBiLCB0cyk7ICAgICAgICAgIC8vIHRpbWVzdGFtcAorICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAorCisgICAgLyogbm93IGRhdGEgb2YgZGF0YV9zaXplIHNpemUgKi8KKworICAgIC8qIGZpcnN0IGV2ZW50IG5hbWUgYXMgYSBzdHJpbmcgKi8KKyAgICBhdmlvX3c4KHBiLCBBTUZfREFUQV9UWVBFX1NUUklORyk7CisgICAgcHV0X2FtZl9zdHJpbmcocGIsICJvbk1ldGFEYXRhIik7IC8vIDEyIGJ5dGVzCisKKyAgICAvKiBtaXhlZCBhcnJheSAoaGFzaCkgd2l0aCBzaXplIGFuZCBzdHJpbmcvdHlwZS9kYXRhIHR1cGxlcyAqLworICAgIGF2aW9fdzgocGIsIEFNRl9EQVRBX1RZUEVfTUlYRURBUlJBWSk7CisgICAgbWV0YWRhdGFfY291bnRfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBtZXRhZGF0YV9jb3VudCA9IDQgKiAhIWZsdi0+dmlkZW9fZW5jICsKKyAgICAgICAgICAgICAgICAgICAgIDUgKiAhIWZsdi0+YXVkaW9fZW5jICsKKyAgICAgICAgICAgICAgICAgICAgIDEgKiAhIWZsdi0+ZGF0YV9lbmMgICsKKyAgICAgICAgICAgICAgICAgICAgIDI7IC8vICsyIGZvciBkdXJhdGlvbiBhbmQgZmlsZSBzaXplCisKKyAgICBhdmlvX3diMzIocGIsIG1ldGFkYXRhX2NvdW50KTsKKworICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiZHVyYXRpb24iKTsKKyAgICBmbHYtPmR1cmF0aW9uX29mZnNldCA9IGF2aW9fdGVsbChwYik7CisKKyAgICAvLyBmaWxsIGluIHRoZSBndWVzc2VkIGR1cmF0aW9uLCBpdCdsbCBiZSBjb3JyZWN0ZWQgbGF0ZXIgaWYgaW5jb3JyZWN0CisgICAgcHV0X2FtZl9kb3VibGUocGIsIHMtPmR1cmF0aW9uIC8gQVZfVElNRV9CQVNFKTsKKworICAgIGlmIChmbHYtPnZpZGVvX2VuYykgeworICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgIndpZHRoIik7CisgICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBmbHYtPnZpZGVvX2VuYy0+d2lkdGgpOworCisgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiaGVpZ2h0Iik7CisgICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBmbHYtPnZpZGVvX2VuYy0+aGVpZ2h0KTsKKworICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgInZpZGVvZGF0YXJhdGUiKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+dmlkZW9fZW5jLT5iaXRfcmF0ZSAvIDEwMjQuMCk7CisKKyAgICAgICAgaWYgKGZsdi0+ZnJhbWVyYXRlICE9IDAuMCkgeworICAgICAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJmcmFtZXJhdGUiKTsKKyAgICAgICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBmbHYtPmZyYW1lcmF0ZSk7CisgICAgICAgICAgICBtZXRhZGF0YV9jb3VudCsrOworICAgICAgICB9CisKKyAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJ2aWRlb2NvZGVjaWQiKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+dmlkZW9fZW5jLT5jb2RlY190YWcpOworICAgIH0KKworICAgIGlmIChmbHYtPmF1ZGlvX2VuYykgeworICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgImF1ZGlvZGF0YXJhdGUiKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+YXVkaW9fZW5jLT5iaXRfcmF0ZSAvIDEwMjQuMCk7CisKKyAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJhdWRpb3NhbXBsZXJhdGUiKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+YXVkaW9fZW5jLT5zYW1wbGVfcmF0ZSk7CisKKyAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJhdWRpb3NhbXBsZXNpemUiKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+YXVkaW9fZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fVTggPyA4IDogMTYpOworCisgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAic3RlcmVvIik7CisgICAgICAgIHB1dF9hbWZfYm9vbChwYiwgZmx2LT5hdWRpb19lbmMtPmNoYW5uZWxzID09IDIpOworCisgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiYXVkaW9jb2RlY2lkIik7CisgICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBmbHYtPmF1ZGlvX2VuYy0+Y29kZWNfdGFnKTsKKyAgICB9CisKKyAgICBpZiAoZmx2LT5kYXRhX2VuYykgeworICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgImRhdGFzdHJlYW0iKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIDAuMCk7CisgICAgfQorCisgICAgd2hpbGUgKCh0YWcgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgIiIsIHRhZywgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgaWYoICAgIXN0cmNtcCh0YWctPmtleSwgIndpZHRoIikKKyAgICAgICAgICAgIHx8IXN0cmNtcCh0YWctPmtleSwgImhlaWdodCIpCisgICAgICAgICAgICB8fCFzdHJjbXAodGFnLT5rZXksICJ2aWRlb2RhdGFyYXRlIikKKyAgICAgICAgICAgIHx8IXN0cmNtcCh0YWctPmtleSwgImZyYW1lcmF0ZSIpCisgICAgICAgICAgICB8fCFzdHJjbXAodGFnLT5rZXksICJ2aWRlb2NvZGVjaWQiKQorICAgICAgICAgICAgfHwhc3RyY21wKHRhZy0+a2V5LCAiYXVkaW9kYXRhcmF0ZSIpCisgICAgICAgICAgICB8fCFzdHJjbXAodGFnLT5rZXksICJhdWRpb3NhbXBsZXJhdGUiKQorICAgICAgICAgICAgfHwhc3RyY21wKHRhZy0+a2V5LCAiYXVkaW9zYW1wbGVzaXplIikKKyAgICAgICAgICAgIHx8IXN0cmNtcCh0YWctPmtleSwgInN0ZXJlbyIpCisgICAgICAgICAgICB8fCFzdHJjbXAodGFnLT5rZXksICJhdWRpb2NvZGVjaWQiKQorICAgICAgICAgICAgfHwhc3RyY21wKHRhZy0+a2V5LCAiZHVyYXRpb24iKQorICAgICAgICAgICAgfHwhc3RyY21wKHRhZy0+a2V5LCAib25NZXRhRGF0YSIpCisgICAgICAgICl7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiSWdub3JpbmcgbWV0YWRhdGEgZm9yICVzXG4iLCB0YWctPmtleSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgdGFnLT5rZXkpOworICAgICAgICBhdmlvX3c4KHBiLCBBTUZfREFUQV9UWVBFX1NUUklORyk7CisgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCB0YWctPnZhbHVlKTsKKyAgICAgICAgbWV0YWRhdGFfY291bnQrKzsKKyAgICB9CisKKyAgICBwdXRfYW1mX3N0cmluZyhwYiwgImZpbGVzaXplIik7CisgICAgZmx2LT5maWxlc2l6ZV9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgIHB1dF9hbWZfZG91YmxlKHBiLCAwKTsgLy8gZGVsYXllZCB3cml0ZQorCisgICAgcHV0X2FtZl9zdHJpbmcocGIsICIiKTsKKyAgICBhdmlvX3c4KHBiLCBBTUZfRU5EX09GX09CSkVDVCk7CisKKyAgICAvKiB3cml0ZSB0b3RhbCBzaXplIG9mIHRhZyAqLworICAgIGRhdGFfc2l6ZSA9IGF2aW9fdGVsbChwYikgLSBtZXRhZGF0YV9zaXplX3BvcyAtIDEwOworCisgICAgYXZpb19zZWVrKHBiLCBtZXRhZGF0YV9jb3VudF9wb3MsIFNFRUtfU0VUKTsKKyAgICBhdmlvX3diMzIocGIsIG1ldGFkYXRhX2NvdW50KTsKKworICAgIGF2aW9fc2VlayhwYiwgbWV0YWRhdGFfc2l6ZV9wb3MsIFNFRUtfU0VUKTsKKyAgICBhdmlvX3diMjQocGIsIGRhdGFfc2l6ZSk7CisgICAgYXZpb19za2lwKHBiLCBkYXRhX3NpemUgKyAxMCAtIDMpOworICAgIGF2aW9fd2IzMihwYiwgZGF0YV9zaXplICsgMTEpOworfQorCitzdGF0aWMgaW50IGZsdl93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEZMVkNvbnRleHQgKmZsdiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IGRhdGFfc2l6ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbaV0tPmNvZGVjOworICAgICAgICBGTFZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICAgICAgc3dpdGNoIChlbmMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+YXZnX2ZyYW1lX3JhdGUuZGVuICYmCisgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+YXZnX2ZyYW1lX3JhdGUubnVtKSB7CisgICAgICAgICAgICAgICAgZmx2LT5mcmFtZXJhdGUgPSBhdl9xMmQocy0+c3RyZWFtc1tpXS0+YXZnX2ZyYW1lX3JhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZsdi0+dmlkZW9fZW5jKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImF0IG1vc3Qgb25lIHZpZGVvIHN0cmVhbSBpcyBzdXBwb3J0ZWQgaW4gZmx2XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmx2LT52aWRlb19lbmMgPSBlbmM7CisgICAgICAgICAgICBpZiAoZW5jLT5jb2RlY190YWcgPT0gMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJWaWRlbyBjb2RlYyAnJXMnIGZvciBzdHJlYW0gJWQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBGTFZcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUoZW5jLT5jb2RlY19pZCksIGkpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCB8fAorICAgICAgICAgICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2MykgeworICAgICAgICAgICAgICAgIGludCBlcnJvciA9IHMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfVU5PRkZJQ0lBTDsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgZXJyb3IgPyBBVl9MT0dfRVJST1IgOiBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvZGVjICVzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIG9mZmljaWFsIEZMViBzcGVjaWZpY2F0aW9uLFxuIiwgYXZjb2RlY19nZXRfbmFtZShlbmMtPmNvZGVjX2lkKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgdnN0cmljdD0tMSAvIC1zdHJpY3QgLTEgdG8gdXNlIGl0IGFueXdheS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDYpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJNdXhpbmcgVlA2IGluIGZsdiB3aWxsIHByb2R1Y2UgZmxpcHBlZCB2aWRlbyBvbiBwbGF5YmFjay5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgaWYgKGZsdi0+YXVkaW9fZW5jKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImF0IG1vc3Qgb25lIGF1ZGlvIHN0cmVhbSBpcyBzdXBwb3J0ZWQgaW4gZmx2XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmx2LT5hdWRpb19lbmMgPSBlbmM7CisgICAgICAgICAgICBpZiAoZ2V0X2F1ZGlvX2ZsYWdzKHMsIGVuYykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIjE2LWJpdCBiaWctZW5kaWFuIGF1ZGlvIGluIGZsdiBpcyB2YWxpZCBidXQgbW9zdCBsaWtlbHkgdW5wbGF5YWJsZSAoaGFyZHdhcmUgZGVwZW5kZW50KTsgdXNlIHMxNmxlXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOgorICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEVYVCAmJiBlbmMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRGF0YSBjb2RlYyAnJXMnIGZvciBzdHJlYW0gJWQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBGTFZcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUoZW5jLT5jb2RlY19pZCksIGkpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmx2LT5kYXRhX2VuYyA9IGVuYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvZGVjIHR5cGUgJyVzJyBmb3Igc3RyZWFtICVkIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggRkxWXG4iLAorICAgICAgICAgICAgICAgICAgIGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyhlbmMtPmNvZGVjX3R5cGUpLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzLT5zdHJlYW1zW2ldLCAzMiwgMSwgMTAwMCk7IC8qIDMyIGJpdCBwdHMgaW4gbXMgKi8KKworICAgICAgICBzYyA9IGF2X21hbGxvY3ooc2l6ZW9mKEZMVlN0cmVhbUNvbnRleHQpKTsKKyAgICAgICAgaWYgKCFzYykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHMtPnN0cmVhbXNbaV0tPnByaXZfZGF0YSA9IHNjOworICAgICAgICBzYy0+bGFzdF90cyA9IC0xOworICAgIH0KKworICAgIGZsdi0+ZGVsYXkgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIGF2aW9fd3JpdGUocGIsICJGTFYiLCAzKTsKKyAgICBhdmlvX3c4KHBiLCAxKTsKKyAgICBhdmlvX3c4KHBiLCBGTFZfSEVBREVSX0ZMQUdfSEFTQVVESU8gKiAhIWZsdi0+YXVkaW9fZW5jICsKKyAgICAgICAgICAgICAgICBGTFZfSEVBREVSX0ZMQUdfSEFTVklERU8gKiAhIWZsdi0+dmlkZW9fZW5jKTsKKyAgICBhdmlvX3diMzIocGIsIDkpOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3RhZyA9PSA1KSB7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCA4KTsgICAgIC8vIG1lc3NhZ2UgdHlwZQorICAgICAgICAgICAgYXZpb193YjI0KHBiLCAwKTsgICAvLyBpbmNsdWRlIGZsYWdzCisgICAgICAgICAgICBhdmlvX3diMjQocGIsIDApOyAgIC8vIHRpbWUgc3RhbXAKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgLy8gcmVzZXJ2ZWQKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgMTEpOyAgLy8gc2l6ZQorICAgICAgICAgICAgZmx2LT5yZXNlcnZlZCA9IDU7CisgICAgICAgIH0KKworICAgIHdyaXRlX21ldGFkYXRhKHMsIDApOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1tpXS0+Y29kZWM7CisgICAgICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyB8fCBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgfHwgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgeworICAgICAgICAgICAgaW50NjRfdCBwb3M7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCBlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPID8KKyAgICAgICAgICAgICAgICAgICAgRkxWX1RBR19UWVBFX1ZJREVPIDogRkxWX1RBR19UWVBFX0FVRElPKTsKKyAgICAgICAgICAgIGF2aW9fd2IyNChwYiwgMCk7IC8vIHNpemUgcGF0Y2hlZCBsYXRlcgorICAgICAgICAgICAgYXZpb193YjI0KHBiLCAwKTsgLy8gdHMKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIDApOyAgIC8vIHRzIGV4dAorICAgICAgICAgICAgYXZpb193YjI0KHBiLCAwKTsgLy8gc3RyZWFtaWQKKyAgICAgICAgICAgIHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKKyAgICAgICAgICAgICAgICBhdmlvX3c4KHBiLCBnZXRfYXVkaW9fZmxhZ3MocywgZW5jKSk7CisgICAgICAgICAgICAgICAgYXZpb193OChwYiwgMCk7IC8vIEFBQyBzZXF1ZW5jZSBoZWFkZXIKKyAgICAgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBlbmMtPmV4dHJhZGF0YSwgZW5jLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIGVuYy0+Y29kZWNfdGFnIHwgRkxWX0ZSQU1FX0tFWSk7IC8vIGZsYWdzCisgICAgICAgICAgICAgICAgYXZpb193OChwYiwgMCk7IC8vIEFWQyBzZXF1ZW5jZSBoZWFkZXIKKyAgICAgICAgICAgICAgICBhdmlvX3diMjQocGIsIDApOyAvLyBjb21wb3NpdGlvbiB0aW1lCisgICAgICAgICAgICAgICAgZmZfaXNvbV93cml0ZV9hdmNjKHBiLCBlbmMtPmV4dHJhZGF0YSwgZW5jLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhX3NpemUgPSBhdmlvX3RlbGwocGIpIC0gcG9zOworICAgICAgICAgICAgYXZpb19zZWVrKHBiLCAtZGF0YV9zaXplIC0gMTAsIFNFRUtfQ1VSKTsKKyAgICAgICAgICAgIGF2aW9fd2IyNChwYiwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgZGF0YV9zaXplICsgMTAgLSAzKTsKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgZGF0YV9zaXplICsgMTEpOyAvLyBwcmV2aW91cyB0YWcgc2l6ZQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmx2X3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludDY0X3QgZmlsZV9zaXplOworCisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgRkxWQ29udGV4dCAqZmx2ID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgLyogQWRkIEVPUyB0YWcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zW2ldLT5jb2RlYzsKKyAgICAgICAgRkxWU3RyZWFtQ29udGV4dCAqc2MgPSBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGE7CisgICAgICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgICAgICAgICAgICAgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fCBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KSkKKyAgICAgICAgICAgIHB1dF9hdmNfZW9zX3RhZyhwYiwgc2MtPmxhc3RfdHMpOworICAgIH0KKworICAgIGZpbGVfc2l6ZSA9IGF2aW9fdGVsbChwYik7CisKKyAgICAvKiB1cGRhdGUgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoYXZpb19zZWVrKHBiLCBmbHYtPmR1cmF0aW9uX29mZnNldCwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiRmFpbGVkIHRvIHVwZGF0ZSBoZWFkZXIgd2l0aCBjb3JyZWN0IGR1cmF0aW9uLlxuIik7CisgICAgZWxzZQorICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgZmx2LT5kdXJhdGlvbiAvIChkb3VibGUpMTAwMCk7CisgICAgaWYgKGF2aW9fc2VlayhwYiwgZmx2LT5maWxlc2l6ZV9vZmZzZXQsIFNFRUtfU0VUKSA8IDApCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byB1cGRhdGUgaGVhZGVyIHdpdGggY29ycmVjdCBmaWxlc2l6ZS5cbiIpOworICAgIGVsc2UKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZpbGVfc2l6ZSk7CisKKyAgICBhdmlvX3NlZWsocGIsIGZpbGVfc2l6ZSwgU0VFS19TRVQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsdl93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWSU9Db250ZXh0ICpwYiAgICAgID0gcy0+cGI7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYyAgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+Y29kZWM7CisgICAgRkxWQ29udGV4dCAqZmx2ICAgICAgPSBzLT5wcml2X2RhdGE7CisgICAgRkxWU3RyZWFtQ29udGV4dCAqc2MgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+cHJpdl9kYXRhOworICAgIHVuc2lnbmVkIHRzOworICAgIGludCBzaXplID0gcGt0LT5zaXplOworICAgIHVpbnQ4X3QgKmRhdGEgPSBOVUxMOworICAgIGludCBmbGFncyA9IC0xLCBmbGFnc19zaXplLCByZXQ7CisKKyAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZGIHx8IGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2QSB8fAorICAgICAgICBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNiAgfHwgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpCisgICAgICAgIGZsYWdzX3NpemUgPSAyOworICAgIGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fCBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KQorICAgICAgICBmbGFnc19zaXplID0gNTsKKyAgICBlbHNlCisgICAgICAgIGZsYWdzX3NpemUgPSAxOworCisgICAgaWYgKGZsdi0+ZGVsYXkgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGZsdi0+ZGVsYXkgPSAtcGt0LT5kdHM7CisKKyAgICBpZiAocGt0LT5kdHMgPCAtZmx2LT5kZWxheSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiUGFja2V0cyBhcmUgbm90IGluIHRoZSBwcm9wZXIgb3JkZXIgd2l0aCByZXNwZWN0IHRvIERUU1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgdHMgPSBwa3QtPmR0cyArIGZsdi0+ZGVsYXk7IC8vIGFkZCBkZWxheSB0byBmb3JjZSBwb3NpdGl2ZSBkdHMKKworICAgIGlmIChzLT5ldmVudF9mbGFncyAmIEFWU1RSRUFNX0VWRU5UX0ZMQUdfTUVUQURBVEFfVVBEQVRFRCkgeworICAgICAgICB3cml0ZV9tZXRhZGF0YShzLCB0cyk7CisgICAgICAgIHMtPmV2ZW50X2ZsYWdzICY9IH5BVlNUUkVBTV9FVkVOVF9GTEFHX01FVEFEQVRBX1VQREFURUQ7CisgICAgfQorCisgICAgc3dpdGNoIChlbmMtPmNvZGVjX3R5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgYXZpb193OChwYiwgRkxWX1RBR19UWVBFX1ZJREVPKTsKKworICAgICAgICBmbGFncyA9IGVuYy0+Y29kZWNfdGFnOworICAgICAgICBpZiAoZmxhZ3MgPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVmlkZW8gY29kZWMgJyVzJyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIEZMVlxuIiwKKyAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKGVuYy0+Y29kZWNfaWQpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBmbGFncyB8PSBwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZID8gRkxWX0ZSQU1FX0tFWSA6IEZMVl9GUkFNRV9JTlRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIGZsYWdzID0gZ2V0X2F1ZGlvX2ZsYWdzKHMsIGVuYyk7CisKKyAgICAgICAgYXZfYXNzZXJ0MChzaXplKTsKKworICAgICAgICBhdmlvX3c4KHBiLCBGTFZfVEFHX1RZUEVfQVVESU8pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOgorICAgICAgICBhdmlvX3c4KHBiLCBGTFZfVEFHX1RZUEVfTUVUQSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fCBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KSB7CisgICAgICAgIC8qIGNoZWNrIGlmIGV4dHJhZGF0YSBsb29rcyBsaWtlIG1wNCBmb3JtYXRlZCAqLworICAgICAgICBpZiAoZW5jLT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYgKih1aW50OF90KillbmMtPmV4dHJhZGF0YSAhPSAxKQorICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9hdmNfcGFyc2VfbmFsX3VuaXRzX2J1Zihwa3QtPmRhdGEsICZkYXRhLCAmc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYgcGt0LT5zaXplID4gMiAmJgorICAgICAgICAgICAgICAgKEFWX1JCMTYocGt0LT5kYXRhKSAmIDB4ZmZmMCkgPT0gMHhmZmYwKSB7CisgICAgICAgIGlmICghcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPm5iX2ZyYW1lcykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTWFsZm9ybWVkIEFBQyBiaXRzdHJlYW0gZGV0ZWN0ZWQ6ICIKKyAgICAgICAgICAgICAgICJ1c2UgdGhlIGF1ZGlvIGJpdHN0cmVhbSBmaWx0ZXIgJ2FhY19hZHRzdG9hc2MnIHRvIGZpeCBpdCAiCisgICAgICAgICAgICAgICAiKCctYnNmOmEgYWFjX2FkdHN0b2FzYycgb3B0aW9uIHdpdGggZmZtcGVnKVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgImFhYyBiaXRzdHJlYW0gZXJyb3JcbiIpOworICAgIH0KKworICAgIC8qIGNoZWNrIFNwZWV4IHBhY2tldCBkdXJhdGlvbiAqLworICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NQRUVYICYmIHRzIC0gc2MtPmxhc3RfdHMgPiAxNjApCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIldhcm5pbmc6IFNwZWV4IHN0cmVhbSBoYXMgbW9yZSB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOCBmcmFtZXMgcGVyIHBhY2tldC4gQWRvYmUgRmxhc2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGF5ZXIgY2Fubm90IGhhbmRsZSB0aGlzIVxuIik7CisKKyAgICBpZiAoc2MtPmxhc3RfdHMgPCB0cykKKyAgICAgICAgc2MtPmxhc3RfdHMgPSB0czsKKworICAgIGlmIChzaXplICsgZmxhZ3Nfc2l6ZSA+PSAxPDwyNCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVG9vIGxhcmdlIHBhY2tldCB3aXRoIHNpemUgJXUgPj0gJXVcbiIsCisgICAgICAgICAgICAgICBzaXplICsgZmxhZ3Nfc2l6ZSwgMTw8MjQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGF2aW9fd2IyNChwYiwgc2l6ZSArIGZsYWdzX3NpemUpOworICAgIGF2aW9fd2IyNChwYiwgdHMgJiAweEZGRkZGRik7CisgICAgYXZpb193OChwYiwgKHRzID4+IDI0KSAmIDB4N0YpOyAvLyB0aW1lc3RhbXBzIGFyZSAzMiBiaXRzIF9zaWduZWRfCisgICAgYXZpb193YjI0KHBiLCBmbHYtPnJlc2VydmVkKTsKKworICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0RBVEEpIHsKKyAgICAgICAgaW50IGRhdGFfc2l6ZTsKKyAgICAgICAgaW50NjRfdCBtZXRhZGF0YV9zaXplX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RFWFQpIHsKKyAgICAgICAgICAgIC8vIGxlZ2FjeSBGRm1wZWcgbWFnaWM/CisgICAgICAgICAgICBhdmlvX3c4KHBiLCBBTUZfREFUQV9UWVBFX1NUUklORyk7CisgICAgICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgIm9uVGV4dERhdGEiKTsKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIEFNRl9EQVRBX1RZUEVfTUlYRURBUlJBWSk7CisgICAgICAgICAgICBhdmlvX3diMzIocGIsIDIpOworICAgICAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJ0eXBlIik7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCBBTUZfREFUQV9UWVBFX1NUUklORyk7CisgICAgICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgIlRleHQiKTsKKyAgICAgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAidGV4dCIpOworICAgICAgICAgICAgYXZpb193OChwYiwgQU1GX0RBVEFfVFlQRV9TVFJJTkcpOworICAgICAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsIHBrdC0+ZGF0YSk7CisgICAgICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgIiIpOworICAgICAgICAgICAgYXZpb193OChwYiwgQU1GX0VORF9PRl9PQkpFQ1QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8ganVzdCBwYXNzIHRoZSBtZXRhZGF0YSB0aHJvdWdoCisgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBkYXRhID8gZGF0YSA6IHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgLyogd3JpdGUgdG90YWwgc2l6ZSBvZiB0YWcgKi8KKyAgICAgICAgZGF0YV9zaXplID0gYXZpb190ZWxsKHBiKSAtIG1ldGFkYXRhX3NpemVfcG9zOworICAgICAgICBhdmlvX3NlZWsocGIsIG1ldGFkYXRhX3NpemVfcG9zIC0gMTAsIFNFRUtfU0VUKTsKKyAgICAgICAgYXZpb193YjI0KHBiLCBkYXRhX3NpemUpOworICAgICAgICBhdmlvX3NlZWsocGIsIGRhdGFfc2l6ZSArIDEwIC0gMywgU0VFS19DVVIpOworICAgICAgICBhdmlvX3diMzIocGIsIGRhdGFfc2l6ZSArIDExKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9hc3NlcnQxKGZsYWdzPj0wKTsKKyAgICAgICAgYXZpb193OChwYixmbGFncyk7CisgICAgICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNikKKyAgICAgICAgICAgIGF2aW9fdzgocGIsMCk7CisgICAgICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNkYgfHwgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZBKSB7CisgICAgICAgICAgICBpZiAoZW5jLT5leHRyYWRhdGFfc2l6ZSkKKyAgICAgICAgICAgICAgICBhdmlvX3c4KHBiLCBlbmMtPmV4dHJhZGF0YVswXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZpb193OChwYiwgKChGRkFMSUdOKGVuYy0+d2lkdGgsICAxNikgLSBlbmMtPndpZHRoKSA8PCA0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGRkFMSUdOKGVuYy0+aGVpZ2h0LCAxNikgLSBlbmMtPmhlaWdodCkpOworICAgICAgICB9IGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKQorICAgICAgICAgICAgYXZpb193OChwYiwgMSk7IC8vIEFBQyByYXcKKyAgICAgICAgZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8IGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIDEpOyAvLyBBVkMgTkFMVQorICAgICAgICAgICAgYXZpb193YjI0KHBiLCBwa3QtPnB0cyAtIHBrdC0+ZHRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGF2aW9fd3JpdGUocGIsIGRhdGEgPyBkYXRhIDogcGt0LT5kYXRhLCBzaXplKTsKKworICAgICAgICBhdmlvX3diMzIocGIsIHNpemUgKyBmbGFnc19zaXplICsgMTEpOyAvLyBwcmV2aW91cyB0YWcgc2l6ZQorICAgICAgICBmbHYtPmR1cmF0aW9uID0gRkZNQVgoZmx2LT5kdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+cHRzICsgZmx2LT5kZWxheSArIHBrdC0+ZHVyYXRpb24pOworICAgIH0KKworICAgIGF2X2ZyZWUoZGF0YSk7CisKKyAgICByZXR1cm4gcGItPmVycm9yOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9mbHZfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImZsdiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZMViAoRmxhc2ggVmlkZW8pIiksCisgICAgLm1pbWVfdHlwZSAgICAgID0gInZpZGVvL3gtZmx2IiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiZmx2IiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkxWQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgID0gQ09ORklHX0xJQk1QM0xBTUUgPyBBVl9DT0RFQ19JRF9NUDMgOiBBVl9DT0RFQ19JRF9BRFBDTV9TV0YsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfRkxWMSwKKyAgICAud3JpdGVfaGVhZGVyICAgPSBmbHZfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IGZsdl93cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gZmx2X3dyaXRlX3RyYWlsZXIsCisgICAgLmNvZGVjX3RhZyAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdl92aWRlb19jb2RlY19pZHMsIGZsdl9hdWRpb19jb2RlY19pZHMsIDAKKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dMT0JBTEhFQURFUiB8IEFWRk1UX1ZBUklBQkxFX0ZQUyB8CisgICAgICAgICAgICAgICAgICAgICAgQVZGTVRfVFNfTk9OU1RSSUNULAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9mb3JtYXQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mb3JtYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y1NjU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2Zvcm1hdC5jCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogRm9ybWF0IHJlZ2lzdGVyIGFuZCBsb29rdXAKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdG9taWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaWQzdjIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKKy8qKgorICogQGZpbGUKKyAqIEZvcm1hdCByZWdpc3RlciBhbmQgbG9va3VwCisgKi8KKy8qKiBoZWFkIG9mIHJlZ2lzdGVyZWQgaW5wdXQgZm9ybWF0IGxpbmtlZCBsaXN0ICovCitzdGF0aWMgQVZJbnB1dEZvcm1hdCAqZmlyc3RfaWZvcm1hdCA9IE5VTEw7CisvKiogaGVhZCBvZiByZWdpc3RlcmVkIG91dHB1dCBmb3JtYXQgbGlua2VkIGxpc3QgKi8KK3N0YXRpYyBBVk91dHB1dEZvcm1hdCAqZmlyc3Rfb2Zvcm1hdCA9IE5VTEw7CisKK3N0YXRpYyBBVklucHV0Rm9ybWF0ICoqbGFzdF9pZm9ybWF0ID0gJmZpcnN0X2lmb3JtYXQ7CitzdGF0aWMgQVZPdXRwdXRGb3JtYXQgKipsYXN0X29mb3JtYXQgPSAmZmlyc3Rfb2Zvcm1hdDsKKworQVZJbnB1dEZvcm1hdCAqYXZfaWZvcm1hdF9uZXh0KGNvbnN0IEFWSW5wdXRGb3JtYXQgKmYpCit7CisgICAgaWYgKGYpCisgICAgICAgIHJldHVybiBmLT5uZXh0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZpcnN0X2lmb3JtYXQ7Cit9CisKK0FWT3V0cHV0Rm9ybWF0ICphdl9vZm9ybWF0X25leHQoY29uc3QgQVZPdXRwdXRGb3JtYXQgKmYpCit7CisgICAgaWYgKGYpCisgICAgICAgIHJldHVybiBmLT5uZXh0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZpcnN0X29mb3JtYXQ7Cit9CisKK3ZvaWQgYXZfcmVnaXN0ZXJfaW5wdXRfZm9ybWF0KEFWSW5wdXRGb3JtYXQgKmZvcm1hdCkKK3sKKyAgICBBVklucHV0Rm9ybWF0ICoqcCA9IGxhc3RfaWZvcm1hdDsKKworICAgIGZvcm1hdC0+bmV4dCA9IE5VTEw7CisgICAgd2hpbGUoKnAgfHwgYXZwcml2X2F0b21pY19wdHJfY2FzKCh2b2lkICogdm9sYXRpbGUgKilwLCBOVUxMLCBmb3JtYXQpKQorICAgICAgICBwID0gJigqcCktPm5leHQ7CisgICAgbGFzdF9pZm9ybWF0ID0gJmZvcm1hdC0+bmV4dDsKK30KKwordm9pZCBhdl9yZWdpc3Rlcl9vdXRwdXRfZm9ybWF0KEFWT3V0cHV0Rm9ybWF0ICpmb3JtYXQpCit7CisgICAgQVZPdXRwdXRGb3JtYXQgKipwID0gbGFzdF9vZm9ybWF0OworCisgICAgZm9ybWF0LT5uZXh0ID0gTlVMTDsKKyAgICB3aGlsZSgqcCB8fCBhdnByaXZfYXRvbWljX3B0cl9jYXMoKHZvaWQgKiB2b2xhdGlsZSAqKXAsIE5VTEwsIGZvcm1hdCkpCisgICAgICAgIHAgPSAmKCpwKS0+bmV4dDsKKyAgICBsYXN0X29mb3JtYXQgPSAmZm9ybWF0LT5uZXh0OworfQorCitpbnQgYXZfbWF0Y2hfZXh0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpleHRlbnNpb25zKQoreworICAgIGNvbnN0IGNoYXIgKmV4dDsKKworICAgIGlmICghZmlsZW5hbWUpCisgICAgICAgIHJldHVybiAwOworCisgICAgZXh0ID0gc3RycmNocihmaWxlbmFtZSwgJy4nKTsKKyAgICBpZiAoZXh0KQorICAgICAgICByZXR1cm4gYXZfbWF0Y2hfbmFtZShleHQgKyAxLCBleHRlbnNpb25zKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgKmF2X2d1ZXNzX2Zvcm1hdChjb25zdCBjaGFyICpzaG9ydF9uYW1lLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZV90eXBlKQoreworICAgIEFWT3V0cHV0Rm9ybWF0ICpmbXQgPSBOVUxMLCAqZm10X2ZvdW5kOworICAgIGludCBzY29yZV9tYXgsIHNjb3JlOworCisgICAgLyogc3BlY2lmaWMgdGVzdCBmb3IgaW1hZ2Ugc2VxdWVuY2VzICovCisjaWYgQ09ORklHX0lNQUdFMl9NVVhFUgorICAgIGlmICghc2hvcnRfbmFtZSAmJiBmaWxlbmFtZSAmJgorICAgICAgICBhdl9maWxlbmFtZV9udW1iZXJfdGVzdChmaWxlbmFtZSkgJiYKKyAgICAgICAgZmZfZ3Vlc3NfaW1hZ2UyX2NvZGVjKGZpbGVuYW1lKSAhPSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgIHJldHVybiBhdl9ndWVzc19mb3JtYXQoImltYWdlMiIsIE5VTEwsIE5VTEwpOworICAgIH0KKyNlbmRpZgorICAgIC8qIEZpbmQgdGhlIHByb3BlciBmaWxlIHR5cGUuICovCisgICAgZm10X2ZvdW5kID0gTlVMTDsKKyAgICBzY29yZV9tYXggPSAwOworICAgIHdoaWxlICgoZm10ID0gYXZfb2Zvcm1hdF9uZXh0KGZtdCkpKSB7CisgICAgICAgIHNjb3JlID0gMDsKKyAgICAgICAgaWYgKGZtdC0+bmFtZSAmJiBzaG9ydF9uYW1lICYmIGF2X21hdGNoX25hbWUoc2hvcnRfbmFtZSwgZm10LT5uYW1lKSkKKyAgICAgICAgICAgIHNjb3JlICs9IDEwMDsKKyAgICAgICAgaWYgKGZtdC0+bWltZV90eXBlICYmIG1pbWVfdHlwZSAmJiAhc3RyY21wKGZtdC0+bWltZV90eXBlLCBtaW1lX3R5cGUpKQorICAgICAgICAgICAgc2NvcmUgKz0gMTA7CisgICAgICAgIGlmIChmaWxlbmFtZSAmJiBmbXQtPmV4dGVuc2lvbnMgJiYKKyAgICAgICAgICAgIGF2X21hdGNoX2V4dChmaWxlbmFtZSwgZm10LT5leHRlbnNpb25zKSkgeworICAgICAgICAgICAgc2NvcmUgKz0gNTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2NvcmUgPiBzY29yZV9tYXgpIHsKKyAgICAgICAgICAgIHNjb3JlX21heCA9IHNjb3JlOworICAgICAgICAgICAgZm10X2ZvdW5kID0gZm10OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmbXRfZm91bmQ7Cit9CisKK2VudW0gQVZDb2RlY0lEIGF2X2d1ZXNzX2NvZGVjKEFWT3V0cHV0Rm9ybWF0ICpmbXQsIGNvbnN0IGNoYXIgKnNob3J0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbWltZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlKQoreworICAgIGlmIChhdl9tYXRjaF9uYW1lKCJzZWdtZW50IiwgZm10LT5uYW1lKSB8fCBhdl9tYXRjaF9uYW1lKCJzc2VnbWVudCIsIGZtdC0+bmFtZSkpIHsKKyAgICAgICAgQVZPdXRwdXRGb3JtYXQgKmZtdDIgPSBhdl9ndWVzc19mb3JtYXQoTlVMTCwgZmlsZW5hbWUsIE5VTEwpOworICAgICAgICBpZiAoZm10MikKKyAgICAgICAgICAgIGZtdCA9IGZtdDI7CisgICAgfQorCisgICAgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfTk9ORTsKKworI2lmIENPTkZJR19JTUFHRTJfTVVYRVIKKyAgICAgICAgaWYgKCFzdHJjbXAoZm10LT5uYW1lLCAiaW1hZ2UyIikgfHwgIXN0cmNtcChmbXQtPm5hbWUsICJpbWFnZTJwaXBlIikpIHsKKyAgICAgICAgICAgIGNvZGVjX2lkID0gZmZfZ3Vlc3NfaW1hZ2UyX2NvZGVjKGZpbGVuYW1lKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAgICAgY29kZWNfaWQgPSBmbXQtPnZpZGVvX2NvZGVjOworICAgICAgICByZXR1cm4gY29kZWNfaWQ7CisgICAgfSBlbHNlIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgcmV0dXJuIGZtdC0+YXVkaW9fY29kZWM7CisgICAgZWxzZSBpZiAodHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCisgICAgICAgIHJldHVybiBmbXQtPnN1YnRpdGxlX2NvZGVjOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEFWX0NPREVDX0lEX05PTkU7Cit9CisKK0FWSW5wdXRGb3JtYXQgKmF2X2ZpbmRfaW5wdXRfZm9ybWF0KGNvbnN0IGNoYXIgKnNob3J0X25hbWUpCit7CisgICAgQVZJbnB1dEZvcm1hdCAqZm10ID0gTlVMTDsKKyAgICB3aGlsZSAoKGZtdCA9IGF2X2lmb3JtYXRfbmV4dChmbXQpKSkKKyAgICAgICAgaWYgKGF2X21hdGNoX25hbWUoc2hvcnRfbmFtZSwgZm10LT5uYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBmbXQ7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0FWSW5wdXRGb3JtYXQgKmF2X3Byb2JlX2lucHV0X2Zvcm1hdDMoQVZQcm9iZURhdGEgKnBkLCBpbnQgaXNfb3BlbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNjb3JlX3JldCkKK3sKKyAgICBBVlByb2JlRGF0YSBscGQgPSAqcGQ7CisgICAgQVZJbnB1dEZvcm1hdCAqZm10MSA9IE5VTEwsICpmbXQ7CisgICAgaW50IHNjb3JlLCBub2RhdCA9IDAsIHNjb3JlX21heCA9IDA7CisgICAgY29uc3Qgc3RhdGljIHVpbnQ4X3QgemVyb2J1ZmZlcltBVlBST0JFX1BBRERJTkdfU0laRV07CisKKyAgICBpZiAoIWxwZC5idWYpCisgICAgICAgIGxwZC5idWYgPSB6ZXJvYnVmZmVyOworCisgICAgaWYgKGxwZC5idWZfc2l6ZSA+IDEwICYmIGZmX2lkM3YyX21hdGNoKGxwZC5idWYsIElEM3YyX0RFRkFVTFRfTUFHSUMpKSB7CisgICAgICAgIGludCBpZDNsZW4gPSBmZl9pZDN2Ml90YWdfbGVuKGxwZC5idWYpOworICAgICAgICBpZiAobHBkLmJ1Zl9zaXplID4gaWQzbGVuICsgMTYpIHsKKyAgICAgICAgICAgIGxwZC5idWYgICAgICArPSBpZDNsZW47CisgICAgICAgICAgICBscGQuYnVmX3NpemUgLT0gaWQzbGVuOworICAgICAgICB9IGVsc2UgaWYgKGlkM2xlbiA+PSBQUk9CRV9CVUZfTUFYKSB7CisgICAgICAgICAgICBub2RhdCA9IDI7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbm9kYXQgPSAxOworICAgIH0KKworICAgIGZtdCA9IE5VTEw7CisgICAgd2hpbGUgKChmbXQxID0gYXZfaWZvcm1hdF9uZXh0KGZtdDEpKSkgeworICAgICAgICBpZiAoIWlzX29wZW5lZCA9PSAhKGZtdDEtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSAmJiBzdHJjbXAoZm10MS0+bmFtZSwgImltYWdlMiIpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHNjb3JlID0gMDsKKyAgICAgICAgaWYgKGZtdDEtPnJlYWRfcHJvYmUpIHsKKyAgICAgICAgICAgIHNjb3JlID0gZm10MS0+cmVhZF9wcm9iZSgmbHBkKTsKKyAgICAgICAgICAgIGlmIChmbXQxLT5leHRlbnNpb25zICYmIGF2X21hdGNoX2V4dChscGQuZmlsZW5hbWUsIGZtdDEtPmV4dGVuc2lvbnMpKSB7CisgICAgICAgICAgICAgICAgaWYgICAgICAobm9kYXQgPT0gMCkgc2NvcmUgPSBGRk1BWChzY29yZSwgMSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kYXQgPT0gMSkgc2NvcmUgPSBGRk1BWChzY29yZSwgQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLyAyIC0gMSk7CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgc2NvcmUgPSBGRk1BWChzY29yZSwgQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGZtdDEtPmV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChhdl9tYXRjaF9leHQobHBkLmZpbGVuYW1lLCBmbXQxLT5leHRlbnNpb25zKSkKKyAgICAgICAgICAgICAgICBzY29yZSA9IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9tYXRjaF9uYW1lKGxwZC5taW1lX3R5cGUsIGZtdDEtPm1pbWVfdHlwZSkpCisgICAgICAgICAgICBzY29yZSA9IEZGTUFYKHNjb3JlLCBBVlBST0JFX1NDT1JFX01JTUUpOworICAgICAgICBpZiAoc2NvcmUgPiBzY29yZV9tYXgpIHsKKyAgICAgICAgICAgIHNjb3JlX21heCA9IHNjb3JlOworICAgICAgICAgICAgZm10ICAgICAgID0gZm10MTsKKyAgICAgICAgfSBlbHNlIGlmIChzY29yZSA9PSBzY29yZV9tYXgpCisgICAgICAgICAgICBmbXQgPSBOVUxMOworICAgIH0KKyAgICBpZiAobm9kYXQgPT0gMSkKKyAgICAgICAgc2NvcmVfbWF4ID0gRkZNSU4oQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLyAyIC0gMSwgc2NvcmVfbWF4KTsKKyAgICAqc2NvcmVfcmV0ID0gc2NvcmVfbWF4OworCisgICAgcmV0dXJuIGZtdDsKK30KKworQVZJbnB1dEZvcm1hdCAqYXZfcHJvYmVfaW5wdXRfZm9ybWF0MihBVlByb2JlRGF0YSAqcGQsIGludCBpc19vcGVuZWQsIGludCAqc2NvcmVfbWF4KQoreworICAgIGludCBzY29yZV9yZXQ7CisgICAgQVZJbnB1dEZvcm1hdCAqZm10ID0gYXZfcHJvYmVfaW5wdXRfZm9ybWF0MyhwZCwgaXNfb3BlbmVkLCAmc2NvcmVfcmV0KTsKKyAgICBpZiAoc2NvcmVfcmV0ID4gKnNjb3JlX21heCkgeworICAgICAgICAqc2NvcmVfbWF4ID0gc2NvcmVfcmV0OworICAgICAgICByZXR1cm4gZm10OworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKworQVZJbnB1dEZvcm1hdCAqYXZfcHJvYmVfaW5wdXRfZm9ybWF0KEFWUHJvYmVEYXRhICpwZCwgaW50IGlzX29wZW5lZCkKK3sKKyAgICBpbnQgc2NvcmUgPSAwOworICAgIHJldHVybiBhdl9wcm9iZV9pbnB1dF9mb3JtYXQyKHBkLCBpc19vcGVuZWQsICZzY29yZSk7Cit9CisKK2ludCBhdl9wcm9iZV9pbnB1dF9idWZmZXIyKEFWSU9Db250ZXh0ICpwYiwgQVZJbnB1dEZvcm1hdCAqKmZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmxvZ2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IG1heF9wcm9iZV9zaXplKQoreworICAgIEFWUHJvYmVEYXRhIHBkID0geyBmaWxlbmFtZSA/IGZpbGVuYW1lIDogIiIgfTsKKyAgICB1aW50OF90ICpidWYgPSBOVUxMOworICAgIGludCByZXQgPSAwLCBwcm9iZV9zaXplLCBidWZfb2Zmc2V0ID0gMDsKKyAgICBpbnQgc2NvcmUgPSAwOworICAgIGludCByZXQyOworCisgICAgaWYgKCFtYXhfcHJvYmVfc2l6ZSkKKyAgICAgICAgbWF4X3Byb2JlX3NpemUgPSBQUk9CRV9CVUZfTUFYOworICAgIGVsc2UgaWYgKG1heF9wcm9iZV9zaXplIDwgUFJPQkVfQlVGX01JTikgeworICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiU3BlY2lmaWVkIHByb2JlIHNpemUgdmFsdWUgJXUgY2Fubm90IGJlIDwgJXVcbiIsIG1heF9wcm9iZV9zaXplLCBQUk9CRV9CVUZfTUlOKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ID49IG1heF9wcm9iZV9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKHBiLT5hdl9jbGFzcykgeworICAgICAgICB1aW50OF90ICptaW1lX3R5cGVfb3B0ID0gTlVMTDsKKyAgICAgICAgYXZfb3B0X2dldChwYiwgIm1pbWVfdHlwZSIsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4sICZtaW1lX3R5cGVfb3B0KTsKKyAgICAgICAgcGQubWltZV90eXBlID0gKGNvbnN0IGNoYXIgKiltaW1lX3R5cGVfb3B0OworICAgIH0KKyNpZiAwCisgICAgaWYgKCEqZm10ICYmIHBiLT5hdl9jbGFzcyAmJiBhdl9vcHRfZ2V0KHBiLCAibWltZV90eXBlIiwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiwgJm1pbWVfdHlwZSkgPj0gMCAmJiBtaW1lX3R5cGUpIHsKKyAgICAgICAgaWYgKCFhdl9zdHJjYXNlY21wKG1pbWVfdHlwZSwgImF1ZGlvL2FhY3AiKSkgeworICAgICAgICAgICAgKmZtdCA9IGF2X2ZpbmRfaW5wdXRfZm9ybWF0KCJhYWMiKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmbWltZV90eXBlKTsKKyAgICB9CisjZW5kaWYKKworICAgIGZvciAocHJvYmVfc2l6ZSA9IFBST0JFX0JVRl9NSU47IHByb2JlX3NpemUgPD0gbWF4X3Byb2JlX3NpemUgJiYgISpmbXQ7CisgICAgICAgICBwcm9iZV9zaXplID0gRkZNSU4ocHJvYmVfc2l6ZSA8PCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUFYKG1heF9wcm9iZV9zaXplLCBwcm9iZV9zaXplICsgMSkpKSB7CisgICAgICAgIHNjb3JlID0gcHJvYmVfc2l6ZSA8IG1heF9wcm9iZV9zaXplID8gQVZQUk9CRV9TQ09SRV9SRVRSWSA6IDA7CisKKyAgICAgICAgLyogUmVhZCBwcm9iZSBkYXRhLiAqLworICAgICAgICBpZiAoKHJldCA9IGF2X3JlYWxsb2NwKCZidWYsIHByb2JlX3NpemUgKyBBVlBST0JFX1BBRERJTkdfU0laRSkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX3JlYWQocGIsIGJ1ZiArIGJ1Zl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlX3NpemUgLSBidWZfb2Zmc2V0KSkgPCAwKSB7CisgICAgICAgICAgICAvKiBGYWlsIGlmIGVycm9yIHdhcyBub3QgZW5kIG9mIGZpbGUsIG90aGVyd2lzZSwgbG93ZXIgc2NvcmUuICovCisgICAgICAgICAgICBpZiAocmV0ICE9IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICAgICAgc2NvcmUgPSAwOworICAgICAgICAgICAgcmV0ICAgPSAwOyAgICAgICAgICAvKiBlcnJvciB3YXMgZW5kIG9mIGZpbGUsIG5vdGhpbmcgcmVhZCAqLworICAgICAgICB9CisgICAgICAgIGJ1Zl9vZmZzZXQgKz0gcmV0OworICAgICAgICBpZiAoYnVmX29mZnNldCA8IG9mZnNldCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBwZC5idWZfc2l6ZSA9IGJ1Zl9vZmZzZXQgLSBvZmZzZXQ7CisgICAgICAgIHBkLmJ1ZiA9ICZidWZbb2Zmc2V0XTsKKworICAgICAgICBtZW1zZXQocGQuYnVmICsgcGQuYnVmX3NpemUsIDAsIEFWUFJPQkVfUEFERElOR19TSVpFKTsKKworICAgICAgICAvKiBHdWVzcyBmaWxlIGZvcm1hdC4gKi8KKyAgICAgICAgKmZtdCA9IGF2X3Byb2JlX2lucHV0X2Zvcm1hdDIoJnBkLCAxLCAmc2NvcmUpOworICAgICAgICBpZiAoKmZtdCkgeworICAgICAgICAgICAgLyogVGhpcyBjYW4gb25seSBiZSB0cnVlIGluIHRoZSBsYXN0IGl0ZXJhdGlvbi4gKi8KKyAgICAgICAgICAgIGlmIChzY29yZSA8PSBBVlBST0JFX1NDT1JFX1JFVFJZKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJGb3JtYXQgJXMgZGV0ZWN0ZWQgb25seSB3aXRoIGxvdyBzY29yZSBvZiAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAibWlzZGV0ZWN0aW9uIHBvc3NpYmxlIVxuIiwgKCpmbXQpLT5uYW1lLCBzY29yZSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICJGb3JtYXQgJXMgcHJvYmVkIHdpdGggc2l6ZT0lZCBhbmQgc2NvcmU9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICgqZm10KS0+bmFtZSwgcHJvYmVfc2l6ZSwgc2NvcmUpOworI2lmIDAKKyAgICAgICAgICAgIEZJTEUgKmYgPSBmb3BlbigicHJvYmVzdGF0LnRtcCIsICJhYiIpOworICAgICAgICAgICAgZnByaW50ZihmLCAicHJvYmVfc2l6ZTolZCBmb3JtYXQ6JXMgc2NvcmU6JWQgZmlsZW5hbWU6JXNcbiIsIHByb2JlX3NpemUsICgqZm10KS0+bmFtZSwgc2NvcmUsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIGZjbG9zZShmKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCEqZm10KQorICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworCitmYWlsOgorICAgIC8qIFJld2luZC4gUmV1c2UgcHJvYmUgYnVmZmVyIHRvIGF2b2lkIHNlZWtpbmcuICovCisgICAgcmV0MiA9IGZmaW9fcmV3aW5kX3dpdGhfcHJvYmVfZGF0YShwYiwgJmJ1ZiwgYnVmX29mZnNldCk7CisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICByZXQgPSByZXQyOworCisgICAgYXZfZnJlZXAoJnBkLm1pbWVfdHlwZSk7CisgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiBzY29yZTsKK30KKworaW50IGF2X3Byb2JlX2lucHV0X2J1ZmZlcihBVklPQ29udGV4dCAqcGIsIEFWSW5wdXRGb3JtYXQgKipmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpsb2djdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBtYXhfcHJvYmVfc2l6ZSkKK3sKKyAgICBpbnQgcmV0ID0gYXZfcHJvYmVfaW5wdXRfYnVmZmVyMihwYiwgZm10LCBmaWxlbmFtZSwgbG9nY3R4LCBvZmZzZXQsIG1heF9wcm9iZV9zaXplKTsKKyAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZnJhbWVjcmNlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mcmFtZWNyY2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNWI1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZnJhbWVjcmNlbmMuYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogZnJhbWUgQ1JDIGVuY29kZXIgKGZvciBjb2RlYy9mb3JtYXQgdGVzdGluZykKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWRsZXIzMi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIGludCBmcmFtZWNyY193cml0ZV9oZWFkZXIoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHN0LT5jb2RlYzsKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNyYyA9IGF2X2FkbGVyMzJfdXBkYXRlKDAsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiNleHRyYWRhdGEgJWQ6ICU4ZCwgMHglMDgiUFJJeDMyIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSwgY3JjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmZl9mcmFtZWhhc2hfd3JpdGVfaGVhZGVyKHMpOworfQorCitzdGF0aWMgaW50IGZyYW1lY3JjX3dyaXRlX3BhY2tldChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIHVpbnQzMl90IGNyYyA9IGF2X2FkbGVyMzJfdXBkYXRlKDAsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICBjaGFyIGJ1ZlsyNTZdOworCisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkLCAlMTAiUFJJZDY0IiwgJTEwIlBSSWQ2NCIsICU4ZCwgJThkLCAweCUwOCJQUkl4MzIsCisgICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXgsIHBrdC0+ZHRzLCBwa3QtPnB0cywgcGt0LT5kdXJhdGlvbiwgcGt0LT5zaXplLCBjcmMpOworICAgIGlmIChwa3QtPmZsYWdzICE9IEFWX1BLVF9GTEFHX0tFWSkKKyAgICAgICAgYXZfc3RybGNhdGYoYnVmLCBzaXplb2YoYnVmKSwgIiwgRj0weCUwWCIsIHBrdC0+ZmxhZ3MpOworICAgIGlmIChwa3QtPnNpZGVfZGF0YV9lbGVtcykgeworICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgYXZfc3RybGNhdGYoYnVmLCBzaXplb2YoYnVmKSwgIiwgUz0lZCIsIHBrdC0+c2lkZV9kYXRhX2VsZW1zKTsKKworICAgICAgICBmb3IgKGk9MDsgaTxwa3QtPnNpZGVfZGF0YV9lbGVtczsgaSsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBzaWRlX2RhdGFfY3JjID0gMDsKKyAgICAgICAgICAgIGlmIChIQVZFX0JJR0VORElBTiAmJiBBVl9QS1RfREFUQV9QQUxFVFRFID09IHBrdC0+c2lkZV9kYXRhW2ldLnR5cGUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajxwa3QtPnNpZGVfZGF0YVtpXS5zaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2lkZV9kYXRhX2NyYyA9IGF2X2FkbGVyMzJfdXBkYXRlKHNpZGVfZGF0YV9jcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPnNpZGVfZGF0YVtpXS5kYXRhICsgKGpeMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNpZGVfZGF0YV9jcmMgPSBhdl9hZGxlcjMyX3VwZGF0ZSgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPnNpZGVfZGF0YVtpXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPnNpZGVfZGF0YVtpXS5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIsICU4ZCwgMHglMDh4IiwgcGt0LT5zaWRlX2RhdGFbaV0uc2l6ZSwgc2lkZV9kYXRhX2NyYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfc3RybGNhdGYoYnVmLCBzaXplb2YoYnVmKSwgIlxuIik7CisgICAgYXZpb193cml0ZShzLT5wYiwgYnVmLCBzdHJsZW4oYnVmKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX2ZyYW1lY3JjX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJmcmFtZWNyYyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImZyYW1lY3JjIHRlc3RpbmciKSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZnJhbWVjcmNfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZyYW1lY3JjX3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9WQVJJQUJMRV9GUFMgfCBBVkZNVF9UU19OT05TVFJJQ1QgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRk1UX1RTX05FR0FUSVZFLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9mcmFtZWhhc2guYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mcmFtZWhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODM1N2IwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ZyYW1laGFzaC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb21tb24gZnVuY3Rpb25zIGZvciB0aGUgZnJhbWV7Y3JjLG1kNX0gbXV4ZXJzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitpbnQgZmZfZnJhbWVoYXNoX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAocy0+bmJfc3RyZWFtcyAmJiAhKHMtPmZsYWdzICYgQVZGTVRfRkxBR19CSVRFWEFDVCkpCisgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiI3NvZnR3YXJlOiAlc1xuIiwgTElCQVZGT1JNQVRfSURFTlQpOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIjdGIgJWQ6ICVkLyVkXG4iLCBpLCBzdC0+dGltZV9iYXNlLm51bSwgc3QtPnRpbWVfYmFzZS5kZW4pOworICAgICAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZnJtZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZnJtZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmMTlhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9mcm1kZWMuYwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIE1lZ2FsdXggRnJhbWUgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNZWdhbHV4IEZyYW1lIGRlbXV4ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9yYXcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworc3RhdGljIGNvbnN0IFBpeGVsRm9ybWF0VGFnIGZybV9waXhfZm10X3RhZ3NbXSA9IHsKKyAgICB7IEFWX1BJWF9GTVRfUkdCNTU1LCAxIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjAsICAgMiB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0IyNCwgIDMgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSMCwgICA0IH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUkEsICAgNSB9LAorICAgIHsgQVZfUElYX0ZNVF9OT05FLCAgIDAgfSwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgY291bnQ7Cit9IEZybUNvbnRleHQ7CisKK3N0YXRpYyBpbnQgZnJtX3JlYWRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKHAtPmJ1Zl9zaXplID4gOCAmJgorICAgICAgICBwLT5idWZbMF0gPT0gJ0YnICYmIHAtPmJ1ZlsxXSA9PSAnUicgJiYgcC0+YnVmWzJdID09ICdNJyAmJgorICAgICAgICBBVl9STDE2KCZwLT5idWZbNF0pICYmIEFWX1JMMTYoJnAtPmJ1Zls2XSkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnJtX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gYXZjdHgtPnBiOworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYXZjdHgsIDApOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgYXZpb19za2lwKHBiLCAzKTsKKworICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCAgICA9IGF2cHJpdl9maW5kX3BpeF9mbXQoZnJtX3BpeF9mbXRfdGFncywgYXZpb19yOChwYikpOworICAgIGlmICghc3QtPmNvZGVjLT5waXhfZm10KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IDA7CisgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZybV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIEZybUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNDb250ZXh0ICpzdGMgPSBhdmN0eC0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgaW50IHBhY2tldF9zaXplLCByZXQ7CisKKyAgICBpZiAocy0+Y291bnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHBhY2tldF9zaXplID0gYXZwaWN0dXJlX2dldF9zaXplKHN0Yy0+cGl4X2ZtdCwgc3RjLT53aWR0aCwgc3RjLT5oZWlnaHQpOworICAgIGlmIChwYWNrZXRfc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChhdmN0eC0+cGIsIHBrdCwgcGFja2V0X3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHN0Yy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUkEpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDM7IGkgKyAxIDw9IHBrdC0+c2l6ZTsgaSArPSA0KQorICAgICAgICAgICAgcGt0LT5kYXRhW2ldID0gMHhGRiAtIHBrdC0+ZGF0YVtpXTsKKyAgICB9CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcy0+Y291bnQrKzsKKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2ZybV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJmcm0iLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGcm1Db250ZXh0KSwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWVnYWx1eCBGcmFtZSIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGZybV9yZWFkX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGZybV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmcm1fcmVhZF9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2Z0cC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2Z0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWY0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZnRwLmMKQEAgLTAsMCArMSw4MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTHVrYXN6IE1hcmVrIDxsdWthc3oubS5sdWtpQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorCisjZGVmaW5lIENPTlRST0xfQlVGRkVSX1NJWkUgMTAyNAorI2RlZmluZSBDUkVERU5USUFMU19CVUZGRVJfU0laRSAxMjgKKwordHlwZWRlZiBlbnVtIHsKKyAgICBVTktOT1dOLAorICAgIFJFQURZLAorICAgIERPV05MT0FESU5HLAorICAgIFVQTE9BRElORywKKyAgICBESVNDT05ORUNURUQKK30gRlRQU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBVUkxDb250ZXh0ICpjb25uX2NvbnRyb2w7ICAgICAgICAgICAgICAgICAgICAvKio8IENvbnRyb2wgY29ubmVjdGlvbiAqLworICAgIFVSTENvbnRleHQgKmNvbm5fZGF0YTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGF0YSBjb25uZWN0aW9uLCBOVUxMIHdoZW4gbm90IGNvbm5lY3RlZCAqLworICAgIHVpbnQ4X3QgY29udHJvbF9idWZmZXJbQ09OVFJPTF9CVUZGRVJfU0laRV07IC8qKjwgQ29udHJvbCBjb25uZWN0aW9uIGJ1ZmZlciAqLworICAgIHVpbnQ4X3QgKmNvbnRyb2xfYnVmX3B0ciwgKmNvbnRyb2xfYnVmX2VuZDsKKyAgICBpbnQgc2VydmVyX2RhdGFfcG9ydDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEgY29ubmVjdGlvbiBwb3J0IG9wZW5lZCBieSBzZXJ2ZXIsIC0xIG9uIGVycm9yLiAqLworICAgIGludCBzZXJ2ZXJfY29udHJvbF9wb3J0OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29udHJvbCBjb25uZWN0aW9uIHBvcnQsIGRlZmF1bHQgaXMgMjEgKi8KKyAgICBjaGFyIGhvc3RuYW1lWzUxMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNlcnZlciBhZGRyZXNzLiAqLworICAgIGNoYXIgY3JlZGVuY2lhbHNbQ1JFREVOVElBTFNfQlVGRkVSX1NJWkVdOyAgIC8qKjwgQXV0aGVudGljYXRpb24gZGF0YSAqLworICAgIGNoYXIgcGF0aFtNQVhfVVJMX1NJWkVdOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgUGF0aCB0byByZXNvdXJjZSBvbiBzZXJ2ZXIuICovCisgICAgaW50NjRfdCBmaWxlc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIGZpbGUgb24gc2VydmVyLCAtMSBvbiBlcnJvci4gKi8KKyAgICBpbnQ2NF90IHBvc2l0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgcG9zaXRpb24sIGNhbGN1bGF0ZWQuICovCisgICAgaW50IHJ3X3RpbWVvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOZXR3b3JrIHRpbWVvdXQuICovCisgICAgY29uc3QgY2hhciAqYW5vbnltb3VzX3Bhc3N3b3JkOyAgICAgICAgICAgICAgLyoqPCBQYXNzd29yZCB0byBiZSB1c2VkIGZvciBhbm9ueW1vdXMgdXNlci4gQW4gZW1haWwgc2hvdWxkIGJlIHVzZWQuICovCisgICAgaW50IHdyaXRlX3NlZWthYmxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb250cm9sIHNlZWthYmlsaXR5LCAwID0gZGlzYWJsZSwgMSA9IGVuYWJsZS4gKi8KKyAgICBGVFBTdGF0ZSBzdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXRlIG9mIGRhdGEgY29ubmVjdGlvbiAqLworfSBGVFBDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGVFBDb250ZXh0LCB4KQorI2RlZmluZSBEIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCisjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyJ0aW1lb3V0IiwgInNldCB0aW1lb3V0IG9mIHNvY2tldCBJL08gb3BlcmF0aW9ucyIsIE9GRlNFVChyd190aW1lb3V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIElOVF9NQVgsIER8RSB9LAorICAgIHsiZnRwLXdyaXRlLXNlZWthYmxlIiwgImNvbnRyb2wgc2Vla2FiaWxpdHkgb2YgY29ubmVjdGlvbiBkdXJpbmcgZW5jb2RpbmciLCBPRkZTRVQod3JpdGVfc2Vla2FibGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIEUgfSwKKyAgICB7ImZ0cC1hbm9ueW1vdXMtcGFzc3dvcmQiLCAicGFzc3dvcmQgZm9yIGFub255bW91cyBsb2dpbi4gRS1tYWlsIGFkZHJlc3Mgc2hvdWxkIGJlIHVzZWQuIiwgT0ZGU0VUKGFub255bW91c19wYXNzd29yZCksIEFWX09QVF9UWVBFX1NUUklORywgeyAwIH0sIDAsIDAsIER8RSB9LAorICAgIHtOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZnRwX2NvbnRleHRfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgICAgID0gImZ0cCIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgaW50IGZ0cF9nZXRjKEZUUENvbnRleHQgKnMpCit7CisgICAgaW50IGxlbjsKKyAgICBpZiAocy0+Y29udHJvbF9idWZfcHRyID49IHMtPmNvbnRyb2xfYnVmX2VuZCkgeworICAgICAgICBsZW4gPSBmZnVybF9yZWFkKHMtPmNvbm5fY29udHJvbCwgcy0+Y29udHJvbF9idWZmZXIsIENPTlRST0xfQlVGRkVSX1NJWkUpOworICAgICAgICBpZiAobGVuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgfSBlbHNlIGlmICghbGVuKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5jb250cm9sX2J1Zl9wdHIgPSBzLT5jb250cm9sX2J1ZmZlcjsKKyAgICAgICAgICAgIHMtPmNvbnRyb2xfYnVmX2VuZCA9IHMtPmNvbnRyb2xfYnVmZmVyICsgbGVuOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAqcy0+Y29udHJvbF9idWZfcHRyKys7Cit9CisKK3N0YXRpYyBpbnQgZnRwX2dldF9saW5lKEZUUENvbnRleHQgKnMsIGNoYXIgKmxpbmUsIGludCBsaW5lX3NpemUpCit7CisgICAgaW50IGNoOworICAgIGNoYXIgKnEgPSBsaW5lOworCisgICAgZm9yICg7OykgeworICAgICAgICBjaCA9IGZ0cF9nZXRjKHMpOworICAgICAgICBpZiAoY2ggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gY2g7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgbGluZSAqLworICAgICAgICAgICAgaWYgKHEgPiBsaW5lICYmIHFbLTFdID09ICdccicpCisgICAgICAgICAgICAgICAgcS0tOworICAgICAgICAgICAgKnEgPSAnXDAnOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKHEgLSBsaW5lKSA8IGxpbmVfc2l6ZSAtIDEpCisgICAgICAgICAgICAgICAgKnErKyA9IGNoOworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogVGhpcyByb3V0aW5lIHJldHVybnMgZnRwIHNlcnZlciByZXNwb25zZSBjb2RlLgorICogU2VydmVyIG1heSBzZW5kIG1vcmUgdGhhbiBvbmUgcmVzcG9uc2UgZm9yIGEgY2VydGFpbiBjb21tYW5kLgorICogRmlyc3QgZXhwZWN0ZWQgY29kZSBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBmdHBfc3RhdHVzKEZUUENvbnRleHQgKnMsIGNoYXIgKipsaW5lLCBjb25zdCBpbnQgcmVzcG9uc2VfY29kZXNbXSkKK3sKKyAgICBpbnQgZXJyLCBpLCBkYXNoID0gMCwgcmVzdWx0ID0gMCwgY29kZV9mb3VuZCA9IDAsIGxpbmVzaXplOworICAgIGNoYXIgYnVmW0NPTlRST0xfQlVGRkVSX1NJWkVdOworICAgIEFWQlByaW50IGxpbmVfYnVmZmVyOworCisgICAgaWYgKGxpbmUpCisgICAgICAgIGF2X2JwcmludF9pbml0KCZsaW5lX2J1ZmZlciwgMCwgQVZfQlBSSU5UX1NJWkVfQVVUT01BVElDKTsKKworICAgIHdoaWxlICghY29kZV9mb3VuZCB8fCBkYXNoKSB7CisgICAgICAgIGlmICgoZXJyID0gZnRwX2dldF9saW5lKHMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChsaW5lKQorICAgICAgICAgICAgICAgIGF2X2JwcmludF9maW5hbGl6ZSgmbGluZV9idWZmZXIsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICIlc1xuIiwgYnVmKTsKKworICAgICAgICBsaW5lc2l6ZSA9IHN0cmxlbihidWYpOworICAgICAgICBlcnIgPSAwOworICAgICAgICBpZiAobGluZXNpemUgPj0gMykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChidWZbaV0gPCAnMCcgfHwgYnVmW2ldID4gJzknKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgKj0gMTA7CisgICAgICAgICAgICAgICAgZXJyICs9IGJ1ZltpXSAtICcwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29kZV9mb3VuZCkgeworICAgICAgICAgICAgaWYgKGVyciA+PSA1MDApIHsKKyAgICAgICAgICAgICAgICBjb2RlX2ZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBlcnI7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyByZXNwb25zZV9jb2Rlc1tpXTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gcmVzcG9uc2VfY29kZXNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfZm91bmQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZXJyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVfZm91bmQpIHsKKyAgICAgICAgICAgIGlmIChsaW5lKQorICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmxpbmVfYnVmZmVyLCAiJXNcclxuIiwgYnVmKTsKKyAgICAgICAgICAgIGlmIChsaW5lc2l6ZSA+PSA0KSB7CisgICAgICAgICAgICAgICAgaWYgKCFkYXNoICYmIGJ1ZlszXSA9PSAnLScpCisgICAgICAgICAgICAgICAgICAgIGRhc2ggPSBlcnI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyID09IGRhc2ggJiYgYnVmWzNdID09ICcgJykKKyAgICAgICAgICAgICAgICAgICAgZGFzaCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGluZSkKKyAgICAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZsaW5lX2J1ZmZlciwgbGluZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBmdHBfc2VuZF9jb21tYW5kKEZUUENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKmNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHJlc3BvbnNlX2NvZGVzW10sIGNoYXIgKipyZXNwb25zZSkKK3sKKyAgICBpbnQgZXJyOworCisgICAgaWYgKHJlc3BvbnNlKQorICAgICAgICAqcmVzcG9uc2UgPSBOVUxMOworCisgICAgaWYgKChlcnIgPSBmZnVybF93cml0ZShzLT5jb25uX2NvbnRyb2wsIGNvbW1hbmQsIHN0cmxlbihjb21tYW5kKSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICBpZiAoIWVycikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogcmV0dXJuIHN0YXR1cyAqLworICAgIGlmIChyZXNwb25zZV9jb2RlcykgeworICAgICAgICByZXR1cm4gZnRwX3N0YXR1cyhzLCByZXNwb25zZSwgcmVzcG9uc2VfY29kZXMpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnRwX2Nsb3NlX2RhdGFfY29ubmVjdGlvbihGVFBDb250ZXh0ICpzKQoreworICAgIGZmdXJsX2Nsb3NlcCgmcy0+Y29ubl9kYXRhKTsKKyAgICBzLT5wb3NpdGlvbiA9IDA7CisgICAgcy0+c3RhdGUgPSBESVNDT05ORUNURUQ7Cit9CisKK3N0YXRpYyB2b2lkIGZ0cF9jbG9zZV9ib3RoX2Nvbm5lY3Rpb25zKEZUUENvbnRleHQgKnMpCit7CisgICAgZmZ1cmxfY2xvc2VwKCZzLT5jb25uX2NvbnRyb2wpOworICAgIGZ0cF9jbG9zZV9kYXRhX2Nvbm5lY3Rpb24ocyk7Cit9CisKK3N0YXRpYyBpbnQgZnRwX2F1dGgoRlRQQ29udGV4dCAqcykKK3sKKyAgICBjb25zdCBjaGFyICp1c2VyID0gTlVMTCwgKnBhc3MgPSBOVUxMOworICAgIGNoYXIgKmVuZCA9IE5VTEwsIGJ1ZltDT05UUk9MX0JVRkZFUl9TSVpFXSwgY3JlZGVuY2lhbHNbQ1JFREVOVElBTFNfQlVGRkVSX1NJWkVdOworICAgIGludCBlcnI7CisgICAgc3RhdGljIGNvbnN0IGludCB1c2VyX2NvZGVzW10gPSB7MzMxLCAyMzAsIDB9OworICAgIHN0YXRpYyBjb25zdCBpbnQgcGFzc19jb2Rlc1tdID0gezIzMCwgMH07CisKKyAgICAvKiBBdXRoZW50aWNhdGlvbiBtYXkgYmUgcmVwZWF0ZWQsIG9yaWdpbmFsIHN0cmluZyBoYXMgdG8gYmUgc2F2ZWQgKi8KKyAgICBhdl9zdHJsY3B5KGNyZWRlbmNpYWxzLCBzLT5jcmVkZW5jaWFscywgc2l6ZW9mKGNyZWRlbmNpYWxzKSk7CisKKyAgICB1c2VyID0gYXZfc3RydG9rKGNyZWRlbmNpYWxzLCAiOiIsICZlbmQpOworICAgIHBhc3MgPSBhdl9zdHJ0b2soZW5kLCAiOiIsICZlbmQpOworCisgICAgaWYgKCF1c2VyKSB7CisgICAgICAgIHVzZXIgPSAiYW5vbnltb3VzIjsKKyAgICAgICAgcGFzcyA9IHMtPmFub255bW91c19wYXNzd29yZCA/IHMtPmFub255bW91c19wYXNzd29yZCA6ICJub3Bhc3N3b3JkIjsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiVVNFUiAlc1xyXG4iLCB1c2VyKTsKKyAgICBlcnIgPSBmdHBfc2VuZF9jb21tYW5kKHMsIGJ1ZiwgdXNlcl9jb2RlcywgTlVMTCk7CisgICAgaWYgKGVyciA9PSAzMzEpIHsKKyAgICAgICAgaWYgKHBhc3MpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJQQVNTICVzXHJcbiIsIHBhc3MpOworICAgICAgICAgICAgZXJyID0gZnRwX3NlbmRfY29tbWFuZChzLCBidWYsIHBhc3NfY29kZXMsIE5VTEwpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBQ0NFUyk7CisgICAgfQorICAgIGlmIChlcnIgIT0gMjMwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFQUNDRVMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnRwX3Bhc3NpdmVfbW9kZV9lcHN2KEZUUENvbnRleHQgKnMpCit7CisgICAgY2hhciAqcmVzID0gTlVMTCwgKnN0YXJ0ID0gTlVMTCwgKmVuZCA9IE5VTEw7CisgICAgaW50IGk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgZCA9ICd8JzsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29tbWFuZCA9ICJFUFNWXHJcbiI7CisgICAgc3RhdGljIGNvbnN0IGludCBlcHN2X2NvZGVzW10gPSB7MjI5LCAwfTsKKworICAgIGlmIChmdHBfc2VuZF9jb21tYW5kKHMsIGNvbW1hbmQsIGVwc3ZfY29kZXMsICZyZXMpICE9IDIyOSB8fCAhcmVzKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBmb3IgKGkgPSAwOyByZXNbaV07ICsraSkgeworICAgICAgICBpZiAocmVzW2ldID09ICcoJykgeworICAgICAgICAgICAgc3RhcnQgPSByZXMgKyBpICsgMTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXNbaV0gPT0gJyknKSB7CisgICAgICAgICAgICBlbmQgPSByZXMgKyBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzdGFydCB8fCAhZW5kKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAqZW5kID0gJ1wwJzsKKyAgICBpZiAoc3RybGVuKHN0YXJ0KSA8IDUpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoc3RhcnRbMF0gIT0gZCB8fCBzdGFydFsxXSAhPSBkIHx8IHN0YXJ0WzJdICE9IGQgfHwgZW5kWy0xXSAhPSBkKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgc3RhcnQgKz0gMzsKKyAgICBlbmRbLTFdID0gJ1wwJzsKKworICAgIHMtPnNlcnZlcl9kYXRhX3BvcnQgPSBhdG9pKHN0YXJ0KTsKKyAgICBhdl9kbG9nKHMsICJTZXJ2ZXIgZGF0YSBwb3J0OiAlZFxuIiwgcy0+c2VydmVyX2RhdGFfcG9ydCk7CisKKyAgICBhdl9mcmVlKHJlcyk7CisgICAgcmV0dXJuIDA7CisKKyAgZmFpbDoKKyAgICBhdl9mcmVlKHJlcyk7CisgICAgcy0+c2VydmVyX2RhdGFfcG9ydCA9IC0xOworICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Cit9CisKK3N0YXRpYyBpbnQgZnRwX3Bhc3NpdmVfbW9kZShGVFBDb250ZXh0ICpzKQoreworICAgIGNoYXIgKnJlcyA9IE5VTEwsICpzdGFydCA9IE5VTEwsICplbmQgPSBOVUxMOworICAgIGludCBpOworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb21tYW5kID0gIlBBU1ZcclxuIjsKKyAgICBzdGF0aWMgY29uc3QgaW50IHBhc3ZfY29kZXNbXSA9IHsyMjcsIDB9OworCisgICAgaWYgKGZ0cF9zZW5kX2NvbW1hbmQocywgY29tbWFuZCwgcGFzdl9jb2RlcywgJnJlcykgIT0gMjI3IHx8ICFyZXMpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZvciAoaSA9IDA7IHJlc1tpXTsgKytpKSB7CisgICAgICAgIGlmIChyZXNbaV0gPT0gJygnKSB7CisgICAgICAgICAgICBzdGFydCA9IHJlcyArIGkgKyAxOworICAgICAgICB9IGVsc2UgaWYgKHJlc1tpXSA9PSAnKScpIHsKKyAgICAgICAgICAgIGVuZCA9IHJlcyArIGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgICplbmQgID0gJ1wwJzsKKyAgICAvKiBza2lwIGlwICovCisgICAgaWYgKCFhdl9zdHJ0b2soc3RhcnQsICIsIiwgJmVuZCkpIGdvdG8gZmFpbDsKKyAgICBpZiAoIWF2X3N0cnRvayhlbmQsICIsIiwgJmVuZCkpIGdvdG8gZmFpbDsKKyAgICBpZiAoIWF2X3N0cnRvayhlbmQsICIsIiwgJmVuZCkpIGdvdG8gZmFpbDsKKyAgICBpZiAoIWF2X3N0cnRvayhlbmQsICIsIiwgJmVuZCkpIGdvdG8gZmFpbDsKKworICAgIC8qIHBhcnNlIHBvcnQgbnVtYmVyICovCisgICAgc3RhcnQgPSBhdl9zdHJ0b2soZW5kLCAiLCIsICZlbmQpOworICAgIGlmICghc3RhcnQpIGdvdG8gZmFpbDsKKyAgICBzLT5zZXJ2ZXJfZGF0YV9wb3J0ID0gYXRvaShzdGFydCkgKiAyNTY7CisgICAgc3RhcnQgPSBhdl9zdHJ0b2soZW5kLCAiLCIsICZlbmQpOworICAgIGlmICghc3RhcnQpIGdvdG8gZmFpbDsKKyAgICBzLT5zZXJ2ZXJfZGF0YV9wb3J0ICs9IGF0b2koc3RhcnQpOworICAgIGF2X2Rsb2cocywgIlNlcnZlciBkYXRhIHBvcnQ6ICVkXG4iLCBzLT5zZXJ2ZXJfZGF0YV9wb3J0KTsKKworICAgIGF2X2ZyZWUocmVzKTsKKyAgICByZXR1cm4gMDsKKworICBmYWlsOgorICAgIGF2X2ZyZWUocmVzKTsKKyAgICBzLT5zZXJ2ZXJfZGF0YV9wb3J0ID0gLTE7CisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworc3RhdGljIGludCBmdHBfY3VycmVudF9kaXIoRlRQQ29udGV4dCAqcykKK3sKKyAgICBjaGFyICpyZXMgPSBOVUxMLCAqc3RhcnQgPSBOVUxMLCAqZW5kID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29tbWFuZCA9ICJQV0RcclxuIjsKKyAgICBzdGF0aWMgY29uc3QgaW50IHB3ZF9jb2Rlc1tdID0gezI1NywgMH07CisKKyAgICBpZiAoZnRwX3NlbmRfY29tbWFuZChzLCBjb21tYW5kLCBwd2RfY29kZXMsICZyZXMpICE9IDI1NyB8fCAhcmVzKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBmb3IgKGkgPSAwOyByZXNbaV07ICsraSkgeworICAgICAgICBpZiAocmVzW2ldID09ICciJykgeworICAgICAgICAgICAgaWYgKCFzdGFydCkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVzICsgaSArIDE7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmQgPSByZXMgKyBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWVuZCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKGVuZCA+IHJlcyAmJiBlbmRbLTFdID09ICcvJykgeworICAgICAgICBlbmRbLTFdID0gJ1wwJzsKKyAgICB9IGVsc2UKKyAgICAgICAgKmVuZCA9ICdcMCc7CisgICAgYXZfc3RybGNweShzLT5wYXRoLCBzdGFydCwgc2l6ZW9mKHMtPnBhdGgpKTsKKworICAgIGF2X2ZyZWUocmVzKTsKKyAgICByZXR1cm4gMDsKKworICBmYWlsOgorICAgIGF2X2ZyZWUocmVzKTsKKyAgICByZXR1cm4gQVZFUlJPUihFSU8pOworfQorCitzdGF0aWMgaW50IGZ0cF9maWxlX3NpemUoRlRQQ29udGV4dCAqcykKK3sKKyAgICBjaGFyIGNvbW1hbmRbQ09OVFJPTF9CVUZGRVJfU0laRV07CisgICAgY2hhciAqcmVzID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgaW50IHNpemVfY29kZXNbXSA9IHsyMTMsIDB9OworCisgICAgc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAiU0laRSAlc1xyXG4iLCBzLT5wYXRoKTsKKyAgICBpZiAoZnRwX3NlbmRfY29tbWFuZChzLCBjb21tYW5kLCBzaXplX2NvZGVzLCAmcmVzKSA9PSAyMTMgJiYgcmVzKSB7CisgICAgICAgIHMtPmZpbGVzaXplID0gc3RydG9sbCgmcmVzWzRdLCBOVUxMLCAxMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+ZmlsZXNpemUgPSAtMTsKKyAgICAgICAgYXZfZnJlZShyZXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGF2X2ZyZWUocmVzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdHBfcmV0cmlldmUoRlRQQ29udGV4dCAqcykKK3sKKyAgICBjaGFyIGNvbW1hbmRbQ09OVFJPTF9CVUZGRVJfU0laRV07CisgICAgc3RhdGljIGNvbnN0IGludCByZXRyX2NvZGVzW10gPSB7MTUwLCAwfTsKKworICAgIHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgIlJFVFIgJXNcclxuIiwgcy0+cGF0aCk7CisgICAgaWYgKGZ0cF9zZW5kX2NvbW1hbmQocywgY29tbWFuZCwgcmV0cl9jb2RlcywgTlVMTCkgIT0gMTUwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgcy0+c3RhdGUgPSBET1dOTE9BRElORzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ0cF9zdG9yZShGVFBDb250ZXh0ICpzKQoreworICAgIGNoYXIgY29tbWFuZFtDT05UUk9MX0JVRkZFUl9TSVpFXTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHN0b3JfY29kZXNbXSA9IHsxNTAsIDB9OworCisgICAgc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAiU1RPUiAlc1xyXG4iLCBzLT5wYXRoKTsKKyAgICBpZiAoZnRwX3NlbmRfY29tbWFuZChzLCBjb21tYW5kLCBzdG9yX2NvZGVzLCBOVUxMKSAhPSAxNTApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBzLT5zdGF0ZSA9IFVQTE9BRElORzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ0cF90eXBlKEZUUENvbnRleHQgKnMpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbW1hbmQgPSAiVFlQRSBJXHJcbiI7CisgICAgc3RhdGljIGNvbnN0IGludCB0eXBlX2NvZGVzW10gPSB7MjAwLCAwfTsKKworICAgIGlmIChmdHBfc2VuZF9jb21tYW5kKHMsIGNvbW1hbmQsIHR5cGVfY29kZXMsIE5VTEwpICE9IDIwMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ0cF9yZXN0YXJ0KEZUUENvbnRleHQgKnMsIGludDY0X3QgcG9zKQoreworICAgIGNoYXIgY29tbWFuZFtDT05UUk9MX0JVRkZFUl9TSVpFXTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHJlc3RfY29kZXNbXSA9IHszNTAsIDB9OworCisgICAgc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAiUkVTVCAlIlBSSWQ2NCJcclxuIiwgcG9zKTsKKyAgICBpZiAoZnRwX3NlbmRfY29tbWFuZChzLCBjb21tYW5kLCByZXN0X2NvZGVzLCBOVUxMKSAhPSAzNTApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdHBfZmVhdHVyZXMoRlRQQ29udGV4dCAqcykKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZmVhdF9jb21tYW5kICAgICAgICA9ICJGRUFUXHJcbiI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmVuYWJsZV91dGY4X2NvbW1hbmQgPSAiT1BUUyBVVEY4IE9OXHJcbiI7CisgICAgc3RhdGljIGNvbnN0IGludCBmZWF0X2NvZGVzW10gPSB7MjExLCAwfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IG9wdHNfY29kZXNbXSA9IHsyMDAsIDQ1MX07CisgICAgY2hhciAqZmVhdCA9IE5VTEw7CisKKyAgICBpZiAoZnRwX3NlbmRfY29tbWFuZChzLCBmZWF0X2NvbW1hbmQsIGZlYXRfY29kZXMsICZmZWF0KSA9PSAyMTEpIHsKKyAgICAgICAgaWYgKGF2X3N0cmlzdHIoZmVhdCwgIlVURjgiKSkKKyAgICAgICAgICAgIGZ0cF9zZW5kX2NvbW1hbmQocywgZW5hYmxlX3V0ZjhfY29tbWFuZCwgb3B0c19jb2RlcywgTlVMTCk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZmZWF0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ0cF9jb25uZWN0X2NvbnRyb2xfY29ubmVjdGlvbihVUkxDb250ZXh0ICpoKQoreworICAgIGNoYXIgYnVmW0NPTlRST0xfQlVGRkVSX1NJWkVdLCAqcmVzcG9uc2UgPSBOVUxMOworICAgIGludCBlcnI7CisgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKKyAgICBGVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIHN0YXRpYyBjb25zdCBpbnQgY29ubmVjdF9jb2Rlc1tdID0gezIyMCwgMH07CisKKyAgICBpZiAoIXMtPmNvbm5fY29udHJvbCkgeworICAgICAgICBmZl91cmxfam9pbihidWYsIHNpemVvZihidWYpLCAidGNwIiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgcy0+aG9zdG5hbWUsIHMtPnNlcnZlcl9jb250cm9sX3BvcnQsIE5VTEwpOworICAgICAgICBpZiAocy0+cndfdGltZW91dCAhPSAtMSkgeworICAgICAgICAgICAgYXZfZGljdF9zZXRfaW50KCZvcHRzLCAidGltZW91dCIsIHMtPnJ3X3RpbWVvdXQsIDApOworICAgICAgICB9IC8qIGlmIG9wdGlvbiBpcyBub3QgZ2l2ZW4sIGRvbid0IHBhc3MgaXQgYW5kIGxldCB0Y3AgdXNlIGl0cyBvd24gZGVmYXVsdCAqLworICAgICAgICBlcnIgPSBmZnVybF9vcGVuKCZzLT5jb25uX2NvbnRyb2wsIGJ1ZiwgQVZJT19GTEFHX1JFQURfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmludGVycnVwdF9jYWxsYmFjaywgJm9wdHMpOworICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBvcGVuIGNvbnRyb2wgY29ubmVjdGlvblxuIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgaWYgc2VydmVyIGlzIHJlYWR5ICovCisgICAgICAgIGlmIChmdHBfc3RhdHVzKHMsICgoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUpID8gJnJlc3BvbnNlIDogTlVMTCksIGNvbm5lY3RfY29kZXMpICE9IDIyMCkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkZUUCBzZXJ2ZXIgbm90IHJlYWR5IGZvciBuZXcgdXNlcnNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFDQ0VTKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUpICYmIGF2X3N0cmlzdHIocmVzcG9uc2UsICJwdXJlLWZ0cGQiKSkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLCAiUHVyZS1GVFBkIHNlcnZlciBpcyB1c2VkIGFzIGFuIG91dHB1dCBwcm90b2NvbC4gSXQgaXMga25vd24gaXNzdWUgdGhpcyBpbXBsZW1lbnRhdGlvbiBtYXkgcHJvZHVjZSBpbmNvcnJlY3QgY29udGVudCBhbmQgaXQgY2Fubm90IGJlIGZpeGVkIGF0IHRoaXMgbW9tZW50LiIpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWUocmVzcG9uc2UpOworCisgICAgICAgIGlmICgoZXJyID0gZnRwX2F1dGgocykpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkZUUCBhdXRoZW50aWNhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZXJyID0gZnRwX3R5cGUocykpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlNldCBjb250ZW50IHR5cGUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBmdHBfZmVhdHVyZXMocyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ0cF9jb25uZWN0X2RhdGFfY29ubmVjdGlvbihVUkxDb250ZXh0ICpoKQoreworICAgIGludCBlcnI7CisgICAgY2hhciBidWZbQ09OVFJPTF9CVUZGRVJfU0laRV07CisgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKKyAgICBGVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworCisgICAgaWYgKCFzLT5jb25uX2RhdGEpIHsKKyAgICAgICAgLyogRW50ZXIgcGFzc2l2ZSBtb2RlICovCisgICAgICAgIGlmIChmdHBfcGFzc2l2ZV9tb2RlX2Vwc3YocykgPCAwKSB7CisgICAgICAgICAgICAvKiBVc2UgUEFTViBhcyBmYWxsYmFjayAqLworICAgICAgICAgICAgaWYgKChlcnIgPSBmdHBfcGFzc2l2ZV9tb2RlKHMpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICAvKiBPcGVuIGRhdGEgY29ubmVjdGlvbiAqLworICAgICAgICBmZl91cmxfam9pbihidWYsIHNpemVvZihidWYpLCAidGNwIiwgTlVMTCwgcy0+aG9zdG5hbWUsIHMtPnNlcnZlcl9kYXRhX3BvcnQsIE5VTEwpOworICAgICAgICBpZiAocy0+cndfdGltZW91dCAhPSAtMSkgeworICAgICAgICAgICAgYXZfZGljdF9zZXRfaW50KCZvcHRzLCAidGltZW91dCIsIHMtPnJ3X3RpbWVvdXQsIDApOworICAgICAgICB9IC8qIGlmIG9wdGlvbiBpcyBub3QgZ2l2ZW4sIGRvbid0IHBhc3MgaXQgYW5kIGxldCB0Y3AgdXNlIGl0cyBvd24gZGVmYXVsdCAqLworICAgICAgICBlcnIgPSBmZnVybF9vcGVuKCZzLT5jb25uX2RhdGEsIGJ1ZiwgaC0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmludGVycnVwdF9jYWxsYmFjaywgJm9wdHMpOworICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgaWYgKHMtPnBvc2l0aW9uKQorICAgICAgICAgICAgaWYgKChlcnIgPSBmdHBfcmVzdGFydChzLCBzLT5wb3NpdGlvbikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBzLT5zdGF0ZSA9IFJFQURZOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ0cF9hYm9ydChVUkxDb250ZXh0ICpoKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb21tYW5kID0gIkFCT1JcclxuIjsKKyAgICBpbnQgZXJyOworICAgIHN0YXRpYyBjb25zdCBpbnQgYWJvcl9jb2Rlc1tdID0gezIyNSwgMjI2LCAwfTsKKyAgICBGVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworCisgICAgLyogQWNjb3JkaW5nIHRvIFJDRiA5NTk6CisgICAgICAgIkFCT1IgY29tbWFuZCB0ZWxscyB0aGUgc2VydmVyIHRvIGFib3J0IHRoZSBwcmV2aW91cyBGVFAKKyAgICAgICBzZXJ2aWNlIGNvbW1hbmQgYW5kIGFueSBhc3NvY2lhdGVkIHRyYW5zZmVyIG9mIGRhdGEuIgorCisgICAgICAgVGhlcmUgYXJlIEZUUCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIHRoYXQgZG9uJ3QgcmVzcG9uc2UKKyAgICAgICB0byBhbnkgY29tbWFuZHMgZHVyaW5nIGRhdGEgdHJhbnNmZXIgaW4gcGFzc2l2ZSBtb2RlIChpbmNsdWRpbmcgQUJPUikuCisKKyAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGNsb3NlcyBkYXRhIGNvbm5lY3Rpb24gYnkgZm9yY2UuCisgICAgKi8KKworICAgIGlmIChmdHBfc2VuZF9jb21tYW5kKHMsIGNvbW1hbmQsIE5VTEwsIE5VTEwpIDwgMCkgeworICAgICAgICBmdHBfY2xvc2VfYm90aF9jb25uZWN0aW9ucyhzKTsKKyAgICAgICAgaWYgKChlcnIgPSBmdHBfY29ubmVjdF9jb250cm9sX2Nvbm5lY3Rpb24oaCkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlJlY29ubmVjdCBmYWlsZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmdHBfY2xvc2VfZGF0YV9jb25uZWN0aW9uKHMpOworICAgICAgICBpZiAoZnRwX3N0YXR1cyhzLCBOVUxMLCBhYm9yX2NvZGVzKSA8IDIyNSkgeworICAgICAgICAgICAgLyogd3UtZnRwZCBhbHNvIGNsb3NlcyBjb250cm9sIGNvbm5lY3Rpb24gYWZ0ZXIgZGF0YSBjb25uZWN0aW9uIGNsb3NpbmcgKi8KKyAgICAgICAgICAgIGZmdXJsX2Nsb3NlcCgmcy0+Y29ubl9jb250cm9sKTsKKyAgICAgICAgICAgIGlmICgoZXJyID0gZnRwX2Nvbm5lY3RfY29udHJvbF9jb25uZWN0aW9uKGgpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiUmVjb25uZWN0IGZhaWxlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdHBfb3BlbihVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmwsIGludCBmbGFncykKK3sKKyAgICBjaGFyIHByb3RvWzEwXSwgcGF0aFtNQVhfVVJMX1NJWkVdOworICAgIGludCBlcnI7CisgICAgRlRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKworICAgIGF2X2Rsb2coaCwgImZ0cCBwcm90b2NvbCBvcGVuXG4iKTsKKworICAgIHMtPnN0YXRlID0gRElTQ09OTkVDVEVEOworICAgIHMtPmZpbGVzaXplID0gLTE7CisgICAgcy0+cG9zaXRpb24gPSAwOworCisgICAgYXZfdXJsX3NwbGl0KHByb3RvLCBzaXplb2YocHJvdG8pLAorICAgICAgICAgICAgICAgICBzLT5jcmVkZW5jaWFscywgc2l6ZW9mKHMtPmNyZWRlbmNpYWxzKSwKKyAgICAgICAgICAgICAgICAgcy0+aG9zdG5hbWUsIHNpemVvZihzLT5ob3N0bmFtZSksCisgICAgICAgICAgICAgICAgICZzLT5zZXJ2ZXJfY29udHJvbF9wb3J0LAorICAgICAgICAgICAgICAgICBwYXRoLCBzaXplb2YocGF0aCksCisgICAgICAgICAgICAgICAgIHVybCk7CisKKyAgICBpZiAocy0+c2VydmVyX2NvbnRyb2xfcG9ydCA8IDAgfHwgcy0+c2VydmVyX2NvbnRyb2xfcG9ydCA+IDY1NTM1KQorICAgICAgICBzLT5zZXJ2ZXJfY29udHJvbF9wb3J0ID0gMjE7CisKKyAgICBpZiAoKGVyciA9IGZ0cF9jb25uZWN0X2NvbnRyb2xfY29ubmVjdGlvbihoKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoKGVyciA9IGZ0cF9jdXJyZW50X2RpcihzKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgYXZfc3RybGNhdChzLT5wYXRoLCBwYXRoLCBzaXplb2Yocy0+cGF0aCkpOworCisgICAgaWYgKGZ0cF9yZXN0YXJ0KHMsIDApIDwgMCkgeworICAgICAgICBoLT5pc19zdHJlYW1lZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZ0cF9maWxlX3NpemUocykgPCAwICYmIGZsYWdzICYgQVZJT19GTEFHX1JFQUQpCisgICAgICAgICAgICBoLT5pc19zdHJlYW1lZCA9IDE7CisgICAgICAgIGlmIChzLT53cml0ZV9zZWVrYWJsZSAhPSAxICYmIGZsYWdzICYgQVZJT19GTEFHX1dSSVRFKQorICAgICAgICAgICAgaC0+aXNfc3RyZWFtZWQgPSAxOworICAgIH0KKworICAgIHJldHVybiAwOworCisgIGZhaWw6CisgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkZUUCBvcGVuIGZhaWxlZFxuIik7CisgICAgZmZ1cmxfY2xvc2VwKCZzLT5jb25uX2NvbnRyb2wpOworICAgIGZmdXJsX2Nsb3NlcCgmcy0+Y29ubl9kYXRhKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50NjRfdCBmdHBfc2VlayhVUkxDb250ZXh0ICpoLCBpbnQ2NF90IHBvcywgaW50IHdoZW5jZSkKK3sKKyAgICBGVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGludCBlcnI7CisgICAgaW50NjRfdCBuZXdfcG9zLCBmYWtlX3BvczsKKworICAgIGF2X2Rsb2coaCwgImZ0cCBwcm90b2NvbCBzZWVrICUiUFJJZDY0IiAlZFxuIiwgcG9zLCB3aGVuY2UpOworCisgICAgc3dpdGNoKHdoZW5jZSkgeworICAgIGNhc2UgQVZTRUVLX1NJWkU6CisgICAgICAgIHJldHVybiBzLT5maWxlc2l6ZTsKKyAgICBjYXNlIFNFRUtfU0VUOgorICAgICAgICBuZXdfcG9zID0gcG9zOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFRUtfQ1VSOgorICAgICAgICBuZXdfcG9zID0gcy0+cG9zaXRpb24gKyBwb3M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VFS19FTkQ6CisgICAgICAgIGlmIChzLT5maWxlc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICBuZXdfcG9zID0gcy0+ZmlsZXNpemUgKyBwb3M7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGgtPmlzX3N0cmVhbWVkKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgaWYgKG5ld19wb3MgPCAwKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJTZWVraW5nIHRvIG5hZ2F0aXZlIHBvc2l0aW9uLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZmFrZV9wb3MgPSBzLT5maWxlc2l6ZSAhPSAtMSA/IEZGTUlOKG5ld19wb3MsIHMtPmZpbGVzaXplKSA6IG5ld19wb3M7CisgICAgaWYgKGZha2VfcG9zICE9IHMtPnBvc2l0aW9uKSB7CisgICAgICAgIGlmICgoZXJyID0gZnRwX2Fib3J0KGgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBzLT5wb3NpdGlvbiA9IGZha2VfcG9zOworICAgIH0KKyAgICByZXR1cm4gbmV3X3BvczsKK30KKworc3RhdGljIGludCBmdHBfcmVhZChVUkxDb250ZXh0ICpoLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKQoreworICAgIEZUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJlYWQsIGVyciwgcmV0cnlfZG9uZSA9IDA7CisKKyAgICBhdl9kbG9nKGgsICJmdHAgcHJvdG9jb2wgcmVhZCAlZCBieXRlc1xuIiwgc2l6ZSk7CisgIHJldHJ5OgorICAgIGlmIChzLT5zdGF0ZSA9PSBESVNDT05ORUNURUQpIHsKKyAgICAgICAgLyogb3B0aW1pemF0aW9uICovCisgICAgICAgIGlmIChzLT5wb3NpdGlvbiA+PSBzLT5maWxlc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoKGVyciA9IGZ0cF9jb25uZWN0X2RhdGFfY29ubmVjdGlvbihoKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKHMtPnN0YXRlID09IFJFQURZKSB7CisgICAgICAgIGlmIChzLT5wb3NpdGlvbiA+PSBzLT5maWxlc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoKGVyciA9IGZ0cF9yZXRyaWV2ZShzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKHMtPmNvbm5fZGF0YSAmJiBzLT5zdGF0ZSA9PSBET1dOTE9BRElORykgeworICAgICAgICByZWFkID0gZmZ1cmxfcmVhZChzLT5jb25uX2RhdGEsIGJ1Ziwgc2l6ZSk7CisgICAgICAgIGlmIChyZWFkID49IDApIHsKKyAgICAgICAgICAgIHMtPnBvc2l0aW9uICs9IHJlYWQ7CisgICAgICAgICAgICBpZiAocy0+cG9zaXRpb24gPj0gcy0+ZmlsZXNpemUpIHsKKyAgICAgICAgICAgICAgICAvKiBzZXJ2ZXIgd2lsbCB0ZXJtaW5hdGUsIGJ1dCBrZWVwIGN1cnJlbnQgcG9zaXRpb24gdG8gYXZvaWQgbWFkbmVzcyAqLworICAgICAgICAgICAgICAgIC8qIHNhdmUgcG9zaXRpb24gdG8gcmVzdGFydCBmcm9tIGl0ICovCisgICAgICAgICAgICAgICAgaW50NjRfdCBwb3MgPSBzLT5wb3NpdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAoZnRwX2Fib3J0KGgpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBzLT5wb3NpdGlvbiA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+cG9zaXRpb24gPSBwb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWQgPD0gMCAmJiBzLT5wb3NpdGlvbiA8IHMtPmZpbGVzaXplICYmICFoLT5pc19zdHJlYW1lZCkgeworICAgICAgICAgICAgLyogU2VydmVyIGNsb3NlZCBjb25uZWN0aW9uLiBQcm9iYWJseSBkdWUgdG8gaW5hY3Rpdml0eSAqLworICAgICAgICAgICAgaW50NjRfdCBwb3MgPSBzLT5wb3NpdGlvbjsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfSU5GTywgIlJlY29ubmVjdCB0byBGVFAgc2VydmVyLlxuIik7CisgICAgICAgICAgICBpZiAoKGVyciA9IGZ0cF9hYm9ydChoKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IGZ0cF9zZWVrKGgsIHBvcywgU0VFS19TRVQpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiUG9zaXRpb24gY2Fubm90IGJlIHJlc3RvcmVkLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcmV0cnlfZG9uZSkgeworICAgICAgICAgICAgICAgIHJldHJ5X2RvbmUgPSAxOworICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlYWQ7CisgICAgfQorCisgICAgYXZfbG9nKGgsIEFWX0xPR19ERUJVRywgIkZUUCByZWFkIGZhaWxlZFxuIik7CisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworc3RhdGljIGludCBmdHBfd3JpdGUoVVJMQ29udGV4dCAqaCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgZXJyOworICAgIEZUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHdyaXR0ZW47CisKKyAgICBhdl9kbG9nKGgsICJmdHAgcHJvdG9jb2wgd3JpdGUgJWQgYnl0ZXNcbiIsIHNpemUpOworCisgICAgaWYgKHMtPnN0YXRlID09IERJU0NPTk5FQ1RFRCkgeworICAgICAgICBpZiAoKGVyciA9IGZ0cF9jb25uZWN0X2RhdGFfY29ubmVjdGlvbihoKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKHMtPnN0YXRlID09IFJFQURZKSB7CisgICAgICAgIGlmICgoZXJyID0gZnRwX3N0b3JlKHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAocy0+Y29ubl9kYXRhICYmIHMtPnN0YXRlID09IFVQTE9BRElORykgeworICAgICAgICB3cml0dGVuID0gZmZ1cmxfd3JpdGUocy0+Y29ubl9kYXRhLCBidWYsIHNpemUpOworICAgICAgICBpZiAod3JpdHRlbiA+IDApIHsKKyAgICAgICAgICAgIHMtPnBvc2l0aW9uICs9IHdyaXR0ZW47CisgICAgICAgICAgICBzLT5maWxlc2l6ZSA9IEZGTUFYKHMtPmZpbGVzaXplLCBzLT5wb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdyaXR0ZW47CisgICAgfQorCisgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkZUUCB3cml0ZSBmYWlsZWRcbiIpOworICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Cit9CisKK3N0YXRpYyBpbnQgZnRwX2Nsb3NlKFVSTENvbnRleHQgKmgpCit7CisgICAgYXZfZGxvZyhoLCAiZnRwIHByb3RvY29sIGNsb3NlXG4iKTsKKworICAgIGZ0cF9jbG9zZV9ib3RoX2Nvbm5lY3Rpb25zKGgtPnByaXZfZGF0YSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdHBfZ2V0X2ZpbGVfaGFuZGxlKFVSTENvbnRleHQgKmgpCit7CisgICAgRlRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKworICAgIGF2X2Rsb2coaCwgImZ0cCBwcm90b2NvbCBnZXRfZmlsZV9oYW5kbGVcbiIpOworCisgICAgaWYgKHMtPmNvbm5fZGF0YSkKKyAgICAgICAgcmV0dXJuIGZmdXJsX2dldF9maWxlX2hhbmRsZShzLT5jb25uX2RhdGEpOworCisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworc3RhdGljIGludCBmdHBfc2h1dGRvd24oVVJMQ29udGV4dCAqaCwgaW50IGZsYWdzKQoreworICAgIEZUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisKKyAgICBhdl9kbG9nKGgsICJmdHAgcHJvdG9jb2wgc2h1dGRvd25cbiIpOworCisgICAgaWYgKHMtPmNvbm5fZGF0YSkKKyAgICAgICAgcmV0dXJuIGZmdXJsX3NodXRkb3duKHMtPmNvbm5fZGF0YSwgZmxhZ3MpOworCisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworVVJMUHJvdG9jb2wgZmZfZnRwX3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgID0gImZ0cCIsCisgICAgLnVybF9vcGVuICAgICAgICAgICAgPSBmdHBfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgICAgICA9IGZ0cF9yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICAgICAgID0gZnRwX3dyaXRlLAorICAgIC51cmxfc2VlayAgICAgICAgICAgID0gZnRwX3NlZWssCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgPSBmdHBfY2xvc2UsCisgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgPSBmdHBfZ2V0X2ZpbGVfaGFuZGxlLAorICAgIC51cmxfc2h1dGRvd24gICAgICAgID0gZnRwX3NodXRkb3duLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKEZUUENvbnRleHQpLAorICAgIC5wcml2X2RhdGFfY2xhc3MgICAgID0gJmZ0cF9jb250ZXh0X2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZzcyMi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2c3MjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTg3YzdkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2c3MjIuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogZzcyMiByYXcgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicmF3ZGVjLmgiCisKK3N0YXRpYyBpbnQgZzcyMl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9HNzIyOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSAxNjAwMDsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gMTsKKworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0KKyAgICAgICAgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKTsKKworICAgIGF2X2Fzc2VydDAoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPiAwKTsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9nNzIyX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImc3MjIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgRy43MjIiKSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBnNzIyX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZmX3Jhd19yZWFkX3BhcnRpYWxfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImc3MjIsNzIyIiwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9HNzIyLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9nNzIzXzEuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9nNzIzXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjNjZThmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2c3MjNfMS5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBHLjcyMy4xIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNb2hhbWVkIE5hdWZhbCBCYXNoZWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEcuNzIzLjEgZGVtdXhlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZnJhbWVfc2l6ZVs0XSA9IHsgMjQsIDIwLCA0LCAxIH07CisKK3N0YXRpYyBhdl9jb2xkIGludCBnNzIzXzFfaW5pdChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9HNzIzXzE7CisgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgPSA4MDAwOworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIHN0LT5zdGFydF90aW1lID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGc3MjNfMV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHNpemUsIGJ5dGUsIHJldDsKKworICAgIHBrdC0+cG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBieXRlICAgICA9IGF2aW9fcjgocy0+cGIpOworICAgIHNpemUgICAgID0gZnJhbWVfc2l6ZVtieXRlICYgM107CisKKyAgICByZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QtPmRhdGFbMF0gICAgICA9IGJ5dGU7CisgICAgcGt0LT5kdXJhdGlvbiAgICAgPSAyNDA7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworCisgICAgcmV0ID0gYXZpb19yZWFkKHMtPnBiLCBwa3QtPmRhdGEgKyAxLCBzaXplIC0gMSk7CisgICAgaWYgKHJldCA8IHNpemUgLSAxKSB7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogQVZFUlJPUl9FT0Y7CisgICAgfQorCisgICAgcmV0dXJuIHBrdC0+c2l6ZTsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9nNzIzXzFfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgPSAiZzcyM18xIiwKKyAgICAubG9uZ19uYW1lICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRy43MjMuMSIpLAorICAgIC5yZWFkX2hlYWRlciA9IGc3MjNfMV9pbml0LAorICAgIC5yZWFkX3BhY2tldCA9IGc3MjNfMV9yZWFkX3BhY2tldCwKKyAgICAuZXh0ZW5zaW9ucyAgPSAidGNvLHJjbyxnNzIzXzEiLAorICAgIC5mbGFncyAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZzcyOWRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2c3MjlkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTQ1NThlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2c3MjlkZWMuYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIEcuNzI5IHJhdyBmb3JtYXQgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDExIFZsYWRpbWlyIFZvcm9zaGlsb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCit0eXBlZGVmIHN0cnVjdCBHNzI5RGVtdXhlckNvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBiaXRfcmF0ZTsKK30gRzcyOURlbXV4ZXJDb250ZXh0OworCitzdGF0aWMgaW50IGc3MjlfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtKiBzdDsKKyAgICBHNzI5RGVtdXhlckNvbnRleHQgKnMxID0gcy0+cHJpdl9kYXRhOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0c3Mjk7CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7CisKKyAgICBpZiAoczEgJiYgczEtPmJpdF9yYXRlKSB7CisgICAgICAgIHMtPmJpdF9yYXRlID0gczEtPmJpdF9yYXRlOworICAgIH0KKworICAgIGlmIChzLT5iaXRfcmF0ZSA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJObyBiaXRyYXRlIHNwZWNpZmllZC4gQXNzdW1pbmcgODAwMCBiL3NcbiIpOworICAgICAgICBzLT5iaXRfcmF0ZSA9IDgwMDA7CisgICAgfQorCisgICAgaWYgKHMtPmJpdF9yYXRlID09IDY0MDApIHsKKyAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IDg7CisgICAgfSBlbHNlIGlmIChzLT5iaXRfcmF0ZSA9PSA4MDAwKSB7CisgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSAxMDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT25seSA4MDAwIGIvcyBhbmQgNjQwMCBiL3MgYml0cmF0ZXMgYXJlIHN1cHBvcnRlZC4gUHJvdmlkZWQ6ICVkIGIvc1xuIiwgcy0+Yml0X3JhdGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCBzdC0+Y29kZWMtPmJsb2NrX2FsaWduIDw8IDMsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIHJldHVybiAwOworfQorc3RhdGljIGludCBnNzI5X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+YmxvY2tfYWxpZ24pOworCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGt0LT5kdHMgPSBwa3QtPnB0cyA9IHBrdC0+cG9zIC8gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmJsb2NrX2FsaWduOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGc3Mjlfb3B0aW9uc1tdID0geworICAgIHsgImJpdF9yYXRlIiwgIiIsIG9mZnNldG9mKEc3MjlEZW11eGVyQ29udGV4dCwgYml0X3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBnNzI5X2RlbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZzcyOSBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gZzcyOV9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl9nNzI5X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImc3MjkiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHLjcyOSByYXcgZm9ybWF0IGRlbXV4ZXIiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRzcyOURlbXV4ZXJDb250ZXh0KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBnNzI5X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGc3MjlfcmVhZF9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiZzcyOSIsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmc3MjlfZGVtdXhlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZ2lmLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZ2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxNzEyMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9naWYuYwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIEFuaW1hdGVkIEdJRiBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAwIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIGZpcnN0IHZlcnNpb24gYnkgRnJhbmNvaXMgUmV2b2wgPHJldm9sQGZyZWUuZnI+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworc3RhdGljIGludCBnaWZfaW1hZ2Vfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb29wX2NvdW50LCB1aW50MzJfdCAqcGFsZXR0ZSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlJhdGlvbmFsIHNhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgIGludCBpOworICAgIGludDY0X3QgYXNwZWN0ID0gMDsKKworICAgIGlmIChzYXIubnVtID4gMCAmJiBzYXIuZGVuID4gMCkgeworICAgICAgICBhc3BlY3QgPSBzYXIubnVtICogNjRMTCAvIHNhci5kZW4gLSAxNTsKKyAgICAgICAgaWYgKGFzcGVjdCA8IDAgfHwgYXNwZWN0ID4gMjU1KQorICAgICAgICAgICAgYXNwZWN0ID0gMDsKKyAgICB9CisKKyAgICBhdmlvX3dyaXRlKHBiLCAiR0lGIiwgMyk7CisgICAgYXZpb193cml0ZShwYiwgIjg5YSIsIDMpOworICAgIGF2aW9fd2wxNihwYiwgd2lkdGgpOworICAgIGF2aW9fd2wxNihwYiwgaGVpZ2h0KTsKKworICAgIGlmIChwYWxldHRlKSB7CisgICAgICAgIGF2aW9fdzgocGIsIDB4ZjcpOyAvKiBmbGFnczogZ2xvYmFsIGNsdXQsIDI1NiBlbnRyaWVzICovCisgICAgICAgIGF2aW9fdzgocGIsIDB4MWYpOyAvKiBiYWNrZ3JvdW5kIGNvbG9yIGluZGV4ICovCisgICAgICAgIGF2aW9fdzgocGIsIGFzcGVjdCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdiA9IHBhbGV0dGVbaV0gJiAweGZmZmZmZjsKKyAgICAgICAgICAgIGF2aW9fd2IyNChwYiwgdik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3c4KHBiLCAwKTsgLyogZmxhZ3MgKi8KKyAgICAgICAgYXZpb193OChwYiwgMCk7IC8qIGJhY2tncm91bmQgY29sb3IgaW5kZXggKi8KKyAgICAgICAgYXZpb193OChwYiwgYXNwZWN0KTsKKyAgICB9CisKKworICAgIGlmIChsb29wX2NvdW50ID49IDAgKSB7CisgICAgICAgIC8qICJORVRTQ0FQRSBFWFRFTlNJT04iIGZvciBsb29wZWQgYW5pbWF0aW9uIEdJRiAqLworICAgICAgICBhdmlvX3c4KHBiLCAweDIxKTsgLyogR0lGIEV4dGVuc2lvbiBjb2RlICovCisgICAgICAgIGF2aW9fdzgocGIsIDB4ZmYpOyAvKiBBcHBsaWNhdGlvbiBFeHRlbnNpb24gTGFiZWwgKi8KKyAgICAgICAgYXZpb193OChwYiwgMHgwYik7IC8qIExlbmd0aCBvZiBBcHBsaWNhdGlvbiBCbG9jayAqLworICAgICAgICBhdmlvX3dyaXRlKHBiLCAiTkVUU0NBUEUyLjAiLCBzaXplb2YoIk5FVFNDQVBFMi4wIikgLSAxKTsKKyAgICAgICAgYXZpb193OChwYiwgMHgwMyk7IC8qIExlbmd0aCBvZiBEYXRhIFN1Yi1CbG9jayAqLworICAgICAgICBhdmlvX3c4KHBiLCAweDAxKTsKKyAgICAgICAgYXZpb193bDE2KHBiLCAodWludDE2X3QpbG9vcF9jb3VudCk7CisgICAgICAgIGF2aW9fdzgocGIsIDB4MDApOyAvKiBEYXRhIFN1Yi1ibG9jayBUZXJtaW5hdG9yICovCisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgbG9vcDsKKyAgICBpbnQgbGFzdF9kZWxheTsKKyAgICBBVlBhY2tldCAqcHJldl9wa3Q7CisgICAgaW50IGR1cmF0aW9uOworfSBHSUZDb250ZXh0OworCitzdGF0aWMgaW50IGdpZl93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEdJRkNvbnRleHQgKmdpZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkNvZGVjQ29udGV4dCAqdmlkZW9fZW5jOworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIHVpbnQzMl90IHBhbGV0dGVbQVZQQUxFVFRFX0NPVU5UXTsKKworICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEgfHwKKyAgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY19pZCAgICE9IEFWX0NPREVDX0lEX0dJRikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkdJRiBtdXhlciBzdXBwb3J0cyBvbmx5IGEgc2luZ2xlIHZpZGVvIEdJRiBzdHJlYW0uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICB2aWRlb19lbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICB3aWR0aCAgPSB2aWRlb19lbmMtPndpZHRoOworICAgIGhlaWdodCA9IHZpZGVvX2VuYy0+aGVpZ2h0OworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzLT5zdHJlYW1zWzBdLCA2NCwgMSwgMTAwKTsKKyAgICBpZiAoYXZwcml2X3NldF9zeXN0ZW1hdGljX3BhbDIocGFsZXR0ZSwgdmlkZW9fZW5jLT5waXhfZm10KSA8IDApIHsKKyAgICAgICAgYXZfYXNzZXJ0MCh2aWRlb19lbmMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KTsKKyAgICAgICAgZ2lmX2ltYWdlX3dyaXRlX2hlYWRlcihzLCB3aWR0aCwgaGVpZ2h0LCBnaWYtPmxvb3AsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdpZl9pbWFnZV93cml0ZV9oZWFkZXIocywgd2lkdGgsIGhlaWdodCwgZ2lmLT5sb29wLCBwYWxldHRlKTsKKyAgICB9CisKKyAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbHVzaF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqbmV3KQoreworICAgIEdJRkNvbnRleHQgKmdpZiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgc2l6ZTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1aW50OF90IGZsYWdzID0gMHg0LCB0cmFuc3BhcmVudF9jb2xvcl9pbmRleCA9IDB4MWY7CisgICAgY29uc3QgdWludDMyX3QgKnBhbGV0dGU7CisgICAgQVZQYWNrZXQgKnBrdCA9IGdpZi0+cHJldl9wa3Q7CisKKyAgICBpZiAoIXBrdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBNYXJrIG9uZSBjb2xvdXIgYXMgdHJhbnNwYXJlbnQgaWYgdGhlIGlucHV0IHBhbGV0dGUgY29udGFpbnMgYXQgbGVhc3QKKyAgICAgKiBvbmUgY29sb3VyIHRoYXQgaXMgbW9yZSB0aGFuIDUwJSB0cmFuc3BhcmVudC4gKi8KKyAgICBwYWxldHRlID0gKHVpbnQzMl90Kilhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsICZzaXplKTsKKyAgICBpZiAocGFsZXR0ZSAmJiBzaXplICE9IEFWUEFMRVRURV9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBhbGV0dGUgZXh0cmFkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChwYWxldHRlKSB7CisgICAgICAgIHVuc2lnbmVkIGksIHNtYWxsZXN0X2FscGhhID0gMHhmZjsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVZQQUxFVFRFX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHYgPSBwYWxldHRlW2ldOworICAgICAgICAgICAgaWYgKHYgPj4gMjQgPCBzbWFsbGVzdF9hbHBoYSkgeworICAgICAgICAgICAgICAgIHNtYWxsZXN0X2FscGhhID0gdiA+PiAyNDsKKyAgICAgICAgICAgICAgICB0cmFuc3BhcmVudF9jb2xvcl9pbmRleCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNtYWxsZXN0X2FscGhhIDwgMTI4KQorICAgICAgICAgICAgZmxhZ3MgfD0gMHgxOyAvKiBUcmFuc3BhcmVudCBDb2xvciBGbGFnICovCisgICAgfQorCisgICAgaWYgKG5ldyAmJiBuZXctPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgZ2lmLT5kdXJhdGlvbiA9IGF2X2NsaXBfdWludDE2KG5ldy0+cHRzIC0gZ2lmLT5wcmV2X3BrdC0+cHRzKTsKKyAgICBlbHNlIGlmICghbmV3ICYmIGdpZi0+bGFzdF9kZWxheSA+PSAwKQorICAgICAgICBnaWYtPmR1cmF0aW9uID0gZ2lmLT5sYXN0X2RlbGF5OworCisgICAgLyogZ3JhcGhpYyBjb250cm9sIGV4dGVuc2lvbiBibG9jayAqLworICAgIGF2aW9fdzgocGIsIDB4MjEpOworICAgIGF2aW9fdzgocGIsIDB4ZjkpOworICAgIGF2aW9fdzgocGIsIDB4MDQpOyAvKiBibG9jayBzaXplICovCisgICAgYXZpb193OChwYiwgZmxhZ3MpOworICAgIGF2aW9fd2wxNihwYiwgZ2lmLT5kdXJhdGlvbik7CisgICAgYXZpb193OChwYiwgdHJhbnNwYXJlbnRfY29sb3JfaW5kZXgpOworICAgIGF2aW9fdzgocGIsIDB4MDApOworCisgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworCisgICAgYXZfZnJlZV9wYWNrZXQoZ2lmLT5wcmV2X3BrdCk7CisgICAgaWYgKG5ldykKKyAgICAgICAgYXZfY29weV9wYWNrZXQoZ2lmLT5wcmV2X3BrdCwgbmV3KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpZl93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEdJRkNvbnRleHQgKmdpZiA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmICghZ2lmLT5wcmV2X3BrdCkgeworICAgICAgICBnaWYtPnByZXZfcGt0ID0gYXZfbWFsbG9jKHNpemVvZigqZ2lmLT5wcmV2X3BrdCkpOworICAgICAgICBpZiAoIWdpZi0+cHJldl9wa3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICByZXR1cm4gYXZfY29weV9wYWNrZXQoZ2lmLT5wcmV2X3BrdCwgcGt0KTsKKyAgICB9CisgICAgcmV0dXJuIGZsdXNoX3BhY2tldChzLCBwa3QpOworfQorCitzdGF0aWMgaW50IGdpZl93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBHSUZDb250ZXh0ICpnaWYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICBmbHVzaF9wYWNrZXQocywgTlVMTCk7CisgICAgYXZfZnJlZXAoJmdpZi0+cHJldl9wa3QpOworICAgIGF2aW9fdzgocGIsIDB4M2IpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEdJRkNvbnRleHQsIHgpCisjZGVmaW5lIEVOQyBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJsb29wIiwgIk51bWJlciBvZiB0aW1lcyB0byBsb29wIHRoZSBvdXRwdXQ6IC0xIC0gbm8gbG9vcCwgMCAtIGluZmluaXRlIGxvb3AiLCBPRkZTRVQobG9vcCksCisgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgLTEsIDY1NTM1LCBFTkMgfSwKKyAgICB7ICJmaW5hbF9kZWxheSIsICJGb3JjZSBkZWxheSAoaW4gY2VudGlzZWNvbmRzKSBhZnRlciB0aGUgbGFzdCBmcmFtZSIsIE9GRlNFVChsYXN0X2RlbGF5KSwKKyAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgLTEsIDY1NTM1LCBFTkMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGdpZl9tdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJHSUYgbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfZ2lmX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJnaWYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHSUYgQW5pbWF0aW9uIiksCisgICAgLm1pbWVfdHlwZSAgICAgID0gImltYWdlL2dpZiIsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImdpZiIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEdJRkNvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfR0lGLAorICAgIC53cml0ZV9oZWFkZXIgICA9IGdpZl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gZ2lmX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgPSBnaWZfd3JpdGVfdHJhaWxlciwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZ2lmX211eGVyX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX1ZBUklBQkxFX0ZQUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZ2lmZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZ2lmZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiNWEyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9naWZkZWMuYwpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqIEdJRiBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgVml0YWxpeSBFIFN1Z3JvYm92CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEdJRiBkZW11eGVyLgorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dpZi5oIgorCit0eXBlZGVmIHN0cnVjdCBHSUZEZW11eENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIC8qKgorICAgICAqIFRpbWUgc3BhbiBpbiBodW5kcmVkdGhzIG9mIHNlY29uZCBiZWZvcmUKKyAgICAgKiB0aGUgbmV4dCBmcmFtZSBzaG91bGQgYmUgZHJhd24gb24gc2NyZWVuLgorICAgICAqLworICAgIGludCBkZWxheTsKKyAgICAvKioKKyAgICAgKiBNaW5pbXVtIGFsbG93ZWQgZGVsYXkgYmV0d2VlbiBmcmFtZXMgaW4gaHVuZHJlZHRocyBvZgorICAgICAqIHNlY29uZC4gVmFsdWVzIGJlbG93IHRoaXMgdGhyZXNob2xkIGNvbnNpZGVyZWQgdG8gYmUKKyAgICAgKiBpbnZhbGlkIGFuZCBzZXQgdG8gdmFsdWUgb2YgZGVmYXVsdF9kZWxheS4KKyAgICAgKi8KKyAgICBpbnQgbWluX2RlbGF5OworICAgIGludCBkZWZhdWx0X2RlbGF5OworCisgICAgLyoqCisgICAgICogbG9vcCBvcHRpb25zCisgICAgICovCisgICAgaW50IHRvdGFsX2l0ZXI7CisgICAgaW50IGl0ZXJfY291bnQ7CisgICAgaW50IGlnbm9yZV9sb29wOworfSBHSUZEZW11eENvbnRleHQ7CisKKy8qKgorICogTWFqb3Igd2ViIGJyb3dzZXJzIGRpc3BsYXkgZ2lmcyBhdCB+MTAtMTVmcHMgd2hlbiByYXRlCisgKiBpcyBub3QgZXhwbGljaXRseSBzZXQgb3IgaGF2ZSB0b28gbG93IHZhbHVlcy4gV2UgYXNzdW1lIGRlZmF1bHQgcmF0ZSB0byBiZSAxMC4KKyAqIERlZmF1bHQgZGVsYXkgPSAxMDBodW5kcmVkdGhzIG9mIHNlY29uZCAvIDEwZnBzID0gMTBob3MgcGVyIGZyYW1lLgorICovCisjZGVmaW5lIEdJRl9ERUZBVUxUX0RFTEFZICAgMTAKKy8qKgorICogQnkgZGVmYXVsdCBkZWxheSB2YWx1ZXMgbGVzcyB0aGFuIHRoaXMgdGhyZXNob2xkIGNvbnNpZGVyZWQgdG8gYmUgaW52YWxpZC4KKyAqLworI2RlZmluZSBHSUZfTUlOX0RFTEFZICAgICAgIDIKKworc3RhdGljIGludCBnaWZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgLyogY2hlY2sgbWFnaWNrICovCisgICAgaWYgKG1lbWNtcChwLT5idWYsIGdpZjg3YV9zaWcsIDYpICYmIG1lbWNtcChwLT5idWYsIGdpZjg5YV9zaWcsIDYpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHdpZHRoIG9yIGhlaWdodCBjb250YWlucyB6ZXJvPyAqLworICAgIGlmICghQVZfUkwxNigmcC0+YnVmWzZdKSB8fCAhQVZfUkwxNigmcC0+YnVmWzhdKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBpbnQgcmVzeW5jKEFWSU9Db250ZXh0ICpwYikKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIGludCBiID0gYXZpb19yOChwYik7CisgICAgICAgIGlmIChiICE9IGdpZjg3YV9zaWdbaV0gJiYgYiAhPSBnaWY4OWFfc2lnW2ldKQorICAgICAgICAgICAgaSA9IC0oYiAhPSAnRycpOworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2lmX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBHSUZEZW11eENvbnRleHQgKmdkYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAgICAgKnBiICA9IHMtPnBiOworICAgIEFWU3RyZWFtICAgICAgICAqc3Q7CisgICAgaW50IHdpZHRoLCBoZWlnaHQsIHJldDsKKworICAgIGlmICgocmV0ID0gcmVzeW5jKHBiKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZ2RjLT5kZWxheSAgPSBnZGMtPmRlZmF1bHRfZGVsYXk7CisgICAgd2lkdGggID0gYXZpb19ybDE2KHBiKTsKKyAgICBoZWlnaHQgPSBhdmlvX3JsMTYocGIpOworCisgICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBHSUYgZm9ybWF0IG9wZXJhdGVzIHdpdGggdGltZSBpbiAiaHVuZHJlZHRocyBvZiBzZWNvbmQiLAorICAgICAqIHRoZXJlZm9yZSB0aW1lYmFzZSBpcyAxLzEwMCAqLworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDApOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9HSUY7CisgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gd2lkdGg7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gaGVpZ2h0OworCisgICAgLyoganVtcCB0byBzdGFydCBiZWNhdXNlIGdpZiBkZWNvZGVyIG5lZWRzIGhlYWRlciBkYXRhIHRvbyAqLworICAgIGlmIChhdmlvX3NlZWsocGIsIDAsIFNFRUtfU0VUKSAhPSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2lmX3NraXBfc3ViYmxvY2tzKEFWSU9Db250ZXh0ICpwYikKK3sKKyAgICBpbnQgc2Jfc2l6ZSwgcmV0ID0gMDsKKworICAgIHdoaWxlICgweDAwICE9IChzYl9zaXplID0gYXZpb19yOChwYikpKSB7CisgICAgICAgIGlmICgocmV0ID0gYXZpb19za2lwKHBiLCBzYl9zaXplKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdpZl9yZWFkX2V4dChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgR0lGRGVtdXhDb250ZXh0ICpnZGMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHNiX3NpemUsIGV4dF9sYWJlbCA9IGF2aW9fcjgocGIpOworICAgIGludCByZXQ7CisKKyAgICBpZiAoZXh0X2xhYmVsID09IEdJRl9HQ0VfRVhUX0xBQkVMKSB7CisgICAgICAgIGlmICgoc2Jfc2l6ZSA9IGF2aW9fcjgocGIpKSA8IDQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRkFUQUwsICJHcmFwaGljIENvbnRyb2wgRXh0ZW5zaW9uIGJsb2NrJ3Mgc2l6ZSBsZXNzIHRoYW4gNC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICAvKiBza2lwIHBhY2tlZCBmaWVsZHMgKi8KKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX3NraXAocGIsIDEpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGdkYy0+ZGVsYXkgPSBhdmlvX3JsMTYocGIpOworCisgICAgICAgIGlmIChnZGMtPmRlbGF5IDwgZ2RjLT5taW5fZGVsYXkpCisgICAgICAgICAgICBnZGMtPmRlbGF5ID0gZ2RjLT5kZWZhdWx0X2RlbGF5OworCisgICAgICAgIC8qIHNraXAgdGhlIHJlc3Qgb2YgdGhlIEdyYXBoaWMgQ29udHJvbCBFeHRlbnNpb24gYmxvY2sgKi8KKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX3NraXAocGIsIHNiX3NpemUgLSAzKSkgPCAwICkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIGlmIChleHRfbGFiZWwgPT0gR0lGX0FQUF9FWFRfTEFCRUwpIHsKKyAgICAgICAgdWludDhfdCBkYXRhWzI1Nl07CisKKyAgICAgICAgc2Jfc2l6ZSA9IGF2aW9fcjgocGIpOworICAgICAgICByZXQgPSBhdmlvX3JlYWQocGIsIGRhdGEsIHNiX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCB8fCAhc2Jfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKHNiX3NpemUgPT0gc3RybGVuKE5FVFNDQVBFX0VYVF9TVFIpKSB7CisgICAgICAgICAgICBzYl9zaXplID0gYXZpb19yOChwYik7CisgICAgICAgICAgICByZXQgPSBhdmlvX3JlYWQocGIsIGRhdGEsIHNiX3NpemUpOworICAgICAgICAgICAgaWYgKHJldCA8IDAgfHwgIXNiX3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgaWYgKHNiX3NpemUgPT0gMyAmJiBkYXRhWzBdID09IDEpIHsKKyAgICAgICAgICAgICAgICBnZGMtPnRvdGFsX2l0ZXIgPSBBVl9STDE2KGRhdGErMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZ2RjLT50b3RhbF9pdGVyID09IDApCisgICAgICAgICAgICAgICAgICAgIGdkYy0+dG90YWxfaXRlciA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChyZXQgPSBnaWZfc2tpcF9zdWJibG9ja3MocGIpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaWZfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEdJRkRlbXV4Q29udGV4dCAqZ2RjID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCBwYWNrZWRfZmllbGRzLCBibG9ja19sYWJlbCwgY3Rfc2l6ZSwKKyAgICAgICAga2V5ZnJhbWUsIGZyYW1lX3BhcnNlZCA9IDAsIHJldDsKKyAgICBpbnQ2NF90IGZyYW1lX3N0YXJ0ID0gYXZpb190ZWxsKHBiKSwgZnJhbWVfZW5kOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzZdOworCisgICAgaWYgKChyZXQgPSBhdmlvX3JlYWQocGIsIGJ1ZiwgNikpID09IDYpIHsKKyAgICAgICAga2V5ZnJhbWUgPSBtZW1jbXAoYnVmLCBnaWY4N2Ffc2lnLCA2KSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgbWVtY21wKGJ1ZiwgZ2lmODlhX3NpZywgNikgPT0gMDsKKyAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBrZXlmcmFtZSA9IDA7CisgICAgfQorCisgICAgaWYgKGtleWZyYW1lKSB7CitwYXJzZV9rZXlmcmFtZToKKyAgICAgICAgLyogc2tpcCAyIGJ5dGVzIG9mIHdpZHRoIGFuZCAyIG9mIGhlaWdodCAqLworICAgICAgICBpZiAoKHJldCA9IGF2aW9fc2tpcChwYiwgNCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcGFja2VkX2ZpZWxkcyA9IGF2aW9fcjgocGIpOworCisgICAgICAgIC8qIHNraXAgMSBieXRlIG9mIEJhY2tncm91bmQgQ29sb3IgSW5kZXggYW5kIDEgYnl0ZSBvZiBQaXhlbCBBc3BlY3QgUmF0aW8gKi8KKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX3NraXAocGIsIDIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIC8qIGdsb2JhbCBjb2xvciB0YWJsZSBwcmVzZW5jZSAqLworICAgICAgICBpZiAocGFja2VkX2ZpZWxkcyAmIDB4ODApIHsKKyAgICAgICAgICAgIGN0X3NpemUgPSAzICogKDEgPDwgKChwYWNrZWRfZmllbGRzICYgMHgwNykgKyAxKSk7CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZpb19za2lwKHBiLCBjdF9zaXplKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3NlZWsocGIsIC1yZXQsIFNFRUtfQ1VSKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FT0Y7CisgICAgfQorCisgICAgd2hpbGUgKEdJRl9UUkFJTEVSICE9IChibG9ja19sYWJlbCA9IGF2aW9fcjgocGIpKSAmJiAhYXZpb19mZW9mKHBiKSkgeworICAgICAgICBpZiAoYmxvY2tfbGFiZWwgPT0gR0lGX0VYVEVOU0lPTl9JTlRST0RVQ0VSKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGdpZl9yZWFkX2V4dCAocykpIDwgMCApCisgICAgICAgICAgICAgICAgZ290byByZXN5bmM7CisgICAgICAgIH0gZWxzZSBpZiAoYmxvY2tfbGFiZWwgPT0gR0lGX0lNQUdFX1NFUEFSQVRPUikgeworICAgICAgICAgICAgLyogc2tpcCB0byBsYXN0IGJ5dGUgb2YgSW1hZ2UgRGVzY3JpcHRvciBoZWFkZXIgKi8KKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZpb19za2lwKHBiLCA4KSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIHBhY2tlZF9maWVsZHMgPSBhdmlvX3I4KHBiKTsKKworICAgICAgICAgICAgLyogbG9jYWwgY29sb3IgdGFibGUgcHJlc2VuY2UgKi8KKyAgICAgICAgICAgIGlmIChwYWNrZWRfZmllbGRzICYgMHg4MCkgeworICAgICAgICAgICAgICAgIGN0X3NpemUgPSAzICogKDEgPDwgKChwYWNrZWRfZmllbGRzICYgMHgwNykgKyAxKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGF2aW9fc2tpcChwYiwgY3Rfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcmVhZCBMWlcgTWluaW11bSBDb2RlIFNpemUgKi8KKyAgICAgICAgICAgIGlmIChhdmlvX3I4KHBiKSA8IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibHp3IG1pbmltdW0gY29kZSBzaXplIG11c3QgYmUgPj0gMVxuIik7CisgICAgICAgICAgICAgICAgZ290byByZXN5bmM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gZ2lmX3NraXBfc3ViYmxvY2tzKHBiKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gcmVzeW5jOworCisgICAgICAgICAgICBmcmFtZV9lbmQgPSBhdmlvX3RlbGwocGIpOworCisgICAgICAgICAgICBpZiAoYXZpb19zZWVrKHBiLCBmcmFtZV9zdGFydCwgU0VFS19TRVQpICE9IGZyYW1lX3N0YXJ0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgZnJhbWVfZW5kIC0gZnJhbWVfc3RhcnQpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgaWYgKGtleWZyYW1lKQorICAgICAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgICAgICAgICBwa3QtPmR1cmF0aW9uID0gZ2RjLT5kZWxheTsKKworICAgICAgICAgICAgLyogR3JhcGhpYyBDb250cm9sIEV4dGVuc2lvbidzIHNjb3BlIGlzIHNpbmdsZSBmcmFtZS4KKyAgICAgICAgICAgICAqIFJlbW92ZSBpdHMgaW5mbHVlbmNlLiAqLworICAgICAgICAgICAgZ2RjLT5kZWxheSA9IGdkYy0+ZGVmYXVsdF9kZWxheTsKKyAgICAgICAgICAgIGZyYW1lX3BhcnNlZCA9IDE7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgYmxvY2sgbGFiZWxcbiIpOworcmVzeW5jOgorICAgICAgICAgICAgaWYgKCFrZXlmcmFtZSkKKyAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGZyYW1lX3N0YXJ0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICBpZiAoKHJldCA9IHJlc3luYyhwYikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgZnJhbWVfc3RhcnQgPSBhdmlvX3RlbGwocGIpIC0gNjsKKyAgICAgICAgICAgIGtleWZyYW1lID0gMTsKKyAgICAgICAgICAgIGdvdG8gcGFyc2Vfa2V5ZnJhbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHJldCA+PSAwICYmICFmcmFtZV9wYXJzZWQpIHx8IHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRoZXJlIGlzIG5vIGltYWdlIGJsb2NrCisgICAgICAgICAqIGJldHdlZW4gZXh0ZW5zaW9uIGJsb2NrcyBhbmQgR0lGX1RSQUlMRVIgb3IgRU9GICovCisgICAgICAgIGlmICghZ2RjLT5pZ25vcmVfbG9vcCAmJiAoYmxvY2tfbGFiZWwgPT0gR0lGX1RSQUlMRVIgfHwgYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgICYmIChnZGMtPnRvdGFsX2l0ZXIgPCAwIHx8ICsrZ2RjLT5pdGVyX2NvdW50IDwgZ2RjLT50b3RhbF9pdGVyKSkKKyAgICAgICAgICAgIHJldHVybiBhdmlvX3NlZWsocGIsIDAsIFNFRUtfU0VUKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgIm1pbl9kZWxheSIgICAgLCAibWluaW11bSB2YWxpZCBkZWxheSBiZXR3ZWVuIGZyYW1lcyAoaW4gaHVuZHJlZHRocyBvZiBzZWNvbmQpIiwgb2Zmc2V0b2YoR0lGRGVtdXhDb250ZXh0LCBtaW5fZGVsYXkpICAgICwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEdJRl9NSU5fREVMQVl9ICAgICwgMCwgMTAwICogNjAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiZGVmYXVsdF9kZWxheSIsICJkZWZhdWx0IGRlbGF5IGJldHdlZW4gZnJhbWVzIChpbiBodW5kcmVkdGhzIG9mIHNlY29uZCkiICAgICAgLCBvZmZzZXRvZihHSUZEZW11eENvbnRleHQsIGRlZmF1bHRfZGVsYXkpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gR0lGX0RFRkFVTFRfREVMQVl9LCAwLCAxMDAgKiA2MCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJpZ25vcmVfbG9vcCIgICwgImlnbm9yZSBsb29wIHNldHRpbmcgKG5ldHNjYXBlIGV4dGVuc2lvbikiICAgICAgICAgICAgICAgICAgICAsIG9mZnNldG9mKEdJRkRlbXV4Q29udGV4dCwgaWdub3JlX2xvb3ApICAsIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSAgICAgICAgICAgICAgICAsIDAsICAgICAgICAxLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZGVtdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJHSUYgZGVtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERU1VWEVSLAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl9naWZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZ2lmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29tcHVTZXJ2ZSBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQgKEdJRikiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoR0lGRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBnaWZfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZ2lmX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGdpZl9yZWFkX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZkZW11eGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9nb2xvbWJfdGFiLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvZ29sb21iX3RhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2M2ZhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZ29sb21iX3RhYi5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dvbG9tYi5jIgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2dvcGhlci5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2dvcGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzE1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZ29waGVyLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBHb3BoZXIgcHJvdG9jb2wKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgVG9zaGltaXRzdSBLaW11cmEKKyAqCisgKiBiYXNlZCBvbiBsaWJhdmZvcm1hdC9odHRwLmMsIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAidXJsLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVUkxDb250ZXh0ICpoZDsKK30gR29waGVyQ29udGV4dDsKKworc3RhdGljIGludCBnb3BoZXJfd3JpdGUoVVJMQ29udGV4dCAqaCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBHb3BoZXJDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZnVybF93cml0ZShzLT5oZCwgYnVmLCBzaXplKTsKK30KKworc3RhdGljIGludCBnb3BoZXJfY29ubmVjdChVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICpwYXRoKQoreworICAgIGNoYXIgYnVmZmVyWzEwMjRdOworCisgICAgaWYgKCEqcGF0aCkgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBzd2l0Y2ggKCorK3BhdGgpIHsKKyAgICAgICAgY2FzZSAnNSc6CisgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgICAgcGF0aCA9IHN0cmNocihwYXRoLCAnLycpOworICAgICAgICAgICAgaWYgKCFwYXRoKSByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkdvcGhlciBwcm90b2NvbCB0eXBlICclYycgbm90IHN1cHBvcnRlZCB5ZXQhXG4iLAorICAgICAgICAgICAgICAgICAgICpwYXRoKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogc2VuZCBnb3BoZXIgc2VjdG9yICovCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzXHJcbiIsIHBhdGgpOworCisgICAgaWYgKGdvcGhlcl93cml0ZShoLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnb3BoZXJfY2xvc2UoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBHb3BoZXJDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGlmIChzLT5oZCkgeworICAgICAgICBmZnVybF9jbG9zZShzLT5oZCk7CisgICAgICAgIHMtPmhkID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ29waGVyX29wZW4oVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqdXJpLCBpbnQgZmxhZ3MpCit7CisgICAgR29waGVyQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBjaGFyIGhvc3RuYW1lWzEwMjRdLCBhdXRoWzEwMjRdLCBwYXRoWzEwMjRdLCBidWZbMTAyNF07CisgICAgaW50IHBvcnQsIGVycjsKKworICAgIGgtPmlzX3N0cmVhbWVkID0gMTsKKworICAgIC8qIG5lZWRlZCBpbiBhbnkgY2FzZSB0byBidWlsZCB0aGUgaG9zdCBzdHJpbmcgKi8KKyAgICBhdl91cmxfc3BsaXQoTlVMTCwgMCwgYXV0aCwgc2l6ZW9mKGF1dGgpLCBob3N0bmFtZSwgc2l6ZW9mKGhvc3RuYW1lKSwgJnBvcnQsCisgICAgICAgICAgICAgICAgIHBhdGgsIHNpemVvZihwYXRoKSwgdXJpKTsKKworICAgIGlmIChwb3J0IDwgMCkKKyAgICAgICAgcG9ydCA9IDcwOworCisgICAgZmZfdXJsX2pvaW4oYnVmLCBzaXplb2YoYnVmKSwgInRjcCIsIE5VTEwsIGhvc3RuYW1lLCBwb3J0LCBOVUxMKTsKKworICAgIHMtPmhkID0gTlVMTDsKKyAgICBlcnIgPSBmZnVybF9vcGVuKCZzLT5oZCwgYnVmLCBBVklPX0ZMQUdfUkVBRF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoKGVyciA9IGdvcGhlcl9jb25uZWN0KGgsIHBhdGgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICByZXR1cm4gMDsKKyBmYWlsOgorICAgIGdvcGhlcl9jbG9zZShoKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGdvcGhlcl9yZWFkKFVSTENvbnRleHQgKmgsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgR29waGVyQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgbGVuID0gZmZ1cmxfcmVhZChzLT5oZCwgYnVmLCBzaXplKTsKKyAgICByZXR1cm4gbGVuOworfQorCisKK1VSTFByb3RvY29sIGZmX2dvcGhlcl9wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZ29waGVyIiwKKyAgICAudXJsX29wZW4gICAgICAgPSBnb3BoZXJfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgPSBnb3BoZXJfcmVhZCwKKyAgICAudXJsX3dyaXRlICAgICAgPSBnb3BoZXJfd3JpdGUsCisgICAgLnVybF9jbG9zZSAgICAgID0gZ29waGVyX2Nsb3NlLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihHb3BoZXJDb250ZXh0KSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9nc21kZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9nc21kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmU1NTdiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2dzbWRlYy5jCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogUkFXIEdTTSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSnVzdGluIFJ1Z2dsZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgR1NNX0JMT0NLX1NJWkUgICAgMzMKKyNkZWZpbmUgR1NNX0JMT0NLX1NBTVBMRVMgMTYwCisjZGVmaW5lIEdTTV9TQU1QTEVfUkFURSAgIDgwMDAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBzYW1wbGVfcmF0ZTsKK30gR1NNRGVtdXhlckNvbnRleHQ7CisKK3N0YXRpYyBpbnQgZ3NtX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0LCBzaXplOworCisgICAgc2l6ZSA9IEdTTV9CTE9DS19TSVpFOworCisgICAgcGt0LT5wb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKworICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisgICAgaWYgKHJldCA8IEdTTV9CTE9DS19TSVpFKSB7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBwa3QtPmR1cmF0aW9uID0gMTsKKyAgICBwa3QtPnB0cyAgICAgID0gcGt0LT5wb3MgLyBHU01fQkxPQ0tfU0laRTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgR1NNRGVtdXhlckNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gcy0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSAxOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYy0+c2FtcGxlX3JhdGU7CisgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSAgICA9IEdTTV9CTE9DS19TSVpFICogOCAqIGMtPnNhbXBsZV9yYXRlIC8gR1NNX0JMT0NLX1NBTVBMRVM7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgR1NNX0JMT0NLX1NBTVBMRVMsIEdTTV9TQU1QTEVfUkFURSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJzYW1wbGVfcmF0ZSIsICIiLCBvZmZzZXRvZihHU01EZW11eGVyQ29udGV4dCwgc2FtcGxlX3JhdGUpLAorICAgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBHU01fU0FNUExFX1JBVEV9LCAxLCBJTlRfTUFYIC8gR1NNX0JMT0NLX1NJWkUsCisgICAgICAgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGdzbV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJnc20gZGVtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2dzbV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJnc20iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgR1NNIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEdTTURlbXV4ZXJDb250ZXh0KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBnc21fcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZ3NtX3JlYWRfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImdzbSIsCisgICAgLnJhd19jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfR1NNLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZnc21fY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2d4Zi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2d4Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjI0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZ3hmLmMKQEAgLTAsMCArMSw2MDggQEAKKy8qCisgKiBHWEYgZGVtdXhlci4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBSZWltYXIgRG9lZmZpbmdlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZ3hmLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVnMTJkYXRhLmgiCisKK3N0cnVjdCBneGZfc3RyZWFtX2luZm8geworICAgIGludDY0X3QgZmlyc3RfZmllbGQ7CisgICAgaW50NjRfdCBsYXN0X2ZpZWxkOworICAgIEFWUmF0aW9uYWwgZnJhbWVzX3Blcl9zZWNvbmQ7CisgICAgaW50MzJfdCBmaWVsZHNfcGVyX2ZyYW1lOworICAgIGludDY0X3QgdHJhY2tfYXV4X2RhdGE7Cit9OworCisvKioKKyAqIEBicmllZiBwYXJzZSBneGYgdGltZWNvZGUgYW5kIGFkZCBpdCB0byBtZXRhZGF0YQorICovCitzdGF0aWMgaW50IGFkZF90aW1lY29kZV9tZXRhZGF0YShBVkRpY3Rpb25hcnkgKipwbSwgY29uc3QgY2hhciAqa2V5LCB1aW50MzJfdCB0aW1lY29kZSwgaW50IGZpZWxkc19wZXJfZnJhbWUpCit7CisgICBjaGFyIHRtcFsxMjhdOworICAgaW50IGZpZWxkICA9IHRpbWVjb2RlICYgMHhmZjsKKyAgIGludCBmcmFtZSAgPSBmaWVsZHNfcGVyX2ZyYW1lID8gZmllbGQgLyBmaWVsZHNfcGVyX2ZyYW1lIDogZmllbGQ7CisgICBpbnQgc2Vjb25kID0gKHRpbWVjb2RlID4+ICA4KSAmIDB4ZmY7CisgICBpbnQgbWludXRlID0gKHRpbWVjb2RlID4+IDE2KSAmIDB4ZmY7CisgICBpbnQgaG91ciAgID0gKHRpbWVjb2RlID4+IDI0KSAmIDB4MWY7CisgICBpbnQgZHJvcCAgID0gKHRpbWVjb2RlID4+IDI5KSAmIDE7CisgICAvLyBiaXQgMzA6IGNvbG9yX2ZyYW1lLCB1bnVzZWQKKyAgIC8vIGlnbm9yZSBpbnZhbGlkIHRpbWUgY29kZQorICAgaWYgKHRpbWVjb2RlID4+IDMxKQorICAgICAgIHJldHVybiAwOworICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIiUwMmQ6JTAyZDolMDJkJWMlMDJkIiwKKyAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgZHJvcCA/ICc7JyA6ICc6JywgZnJhbWUpOworICAgcmV0dXJuIGF2X2RpY3Rfc2V0KHBtLCBrZXksIHRtcCwgMCk7Cit9CisKKy8qKgorICogQGJyaWVmIHBhcnNlcyBhIHBhY2tldCBoZWFkZXIsIGV4dHJhY3RpbmcgdHlwZSBhbmQgbGVuZ3RoCisgKiBAcGFyYW0gcGIgQVZJT0NvbnRleHQgdG8gcmVhZCBoZWFkZXIgZnJvbQorICogQHBhcmFtIHR5cGUgZGV0ZWN0ZWQgcGFja2V0IHR5cGUgaXMgc3RvcmVkIGhlcmUKKyAqIEBwYXJhbSBsZW5ndGggZGV0ZWN0ZWQgcGFja2V0IGxlbmd0aCwgZXhjbHVkaW5nIGhlYWRlciBpcyBzdG9yZWQgaGVyZQorICogQHJldHVybiAwIGlmIGhlYWRlciBub3QgZm91bmQgb3IgY29udGFpbnMgaW52YWxpZCBkYXRhLCAxIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHBhcnNlX3BhY2tldF9oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCBHWEZQa3RUeXBlICp0eXBlLCBpbnQgKmxlbmd0aCkgeworICAgIGlmIChhdmlvX3JiMzIocGIpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYXZpb19yOChwYikgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgKnR5cGUgPSBhdmlvX3I4KHBiKTsKKyAgICAqbGVuZ3RoID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZiAoKCpsZW5ndGggPj4gMjQpIHx8ICpsZW5ndGggPCAxNikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgKmxlbmd0aCAtPSAxNjsKKyAgICBpZiAoYXZpb19yYjMyKHBiKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGF2aW9fcjgocGIpICE9IDB4ZTEpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhdmlvX3I4KHBiKSAhPSAweGUyKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKK30KKworLyoqCisgKiBAYnJpZWYgY2hlY2sgaWYgZmlsZSBzdGFydHMgd2l0aCBhIFBLVF9NQVAgaGVhZGVyCisgKi8KK3N0YXRpYyBpbnQgZ3hmX3Byb2JlKEFWUHJvYmVEYXRhICpwKSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3RhcnRjb2RlW10gPSB7MCwgMCwgMCwgMCwgMSwgMHhiY307IC8vIHN0YXJ0IHdpdGggbWFwIHBhY2tldAorICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGVuZGNvZGVbXSA9IHswLCAwLCAwLCAwLCAweGUxLCAweGUyfTsKKyAgICBpZiAoIW1lbWNtcChwLT5idWYsIHN0YXJ0Y29kZSwgc2l6ZW9mKHN0YXJ0Y29kZSkpICYmCisgICAgICAgICFtZW1jbXAoJnAtPmJ1ZlsxNiAtIHNpemVvZihlbmRjb2RlKV0sIGVuZGNvZGUsIHNpemVvZihlbmRjb2RlKSkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBAYnJpZWYgZ2V0cyB0aGUgc3RyZWFtIGluZGV4IGZvciB0aGUgdHJhY2sgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLCBjcmVhdGVzIG5ldworICogICAgICAgIHN0cmVhbSBpZiBub3QgZm91bmQKKyAqIEBwYXJhbSBpZCAgICAgaWQgb2Ygc3RyZWFtIHRvIGZpbmQgLyBhZGQKKyAqIEBwYXJhbSBmb3JtYXQgc3RyZWFtIGZvcm1hdCBpZGVudGlmaWVyCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3NpbmRleChBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZCwgaW50IGZvcm1hdCkgeworICAgIGludCBpOworICAgIEFWU3RyZWFtICpzdCA9IE5VTEw7CisgICAgaSA9IGZmX2ZpbmRfc3RyZWFtX2luZGV4KHMsIGlkKTsKKyAgICBpZiAoaSA+PSAwKQorICAgICAgICByZXR1cm4gaTsKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+aWQgPSBpZDsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NSlBFRzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOgorICAgICAgICBjYXNlIDE0OgorICAgICAgICBjYXNlIDE1OgorICAgICAgICBjYXNlIDE2OgorICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0RWVklERU87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOworICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0hFQURFUlM7IC8vZ2V0IGtleWZyYW1lIGZsYWcgZXRjLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjI6CisgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVBFRzFWSURFTzsKKyAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOyAvL2dldCBrZXlmcmFtZSBmbGFnIGV0Yy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MyNExFOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gMyAqIDEgKiA0ODAwMCAqIDg7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMyAqIDE7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDI0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gMiAqIDEgKiA0ODAwMCAqIDg7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMiAqIDE7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQUMzOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDI7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvKiBBVkNpNTAgLyBBVkNpMTAwIChBVkMgSW50cmEpICovCisgICAgICAgIGNhc2UgMjk6IC8qIEFWQ0hEICovCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSDI2NDsKKyAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIHRpbWVjb2RlIHRyYWNrczoKKyAgICAgICAgY2FzZSA3OgorICAgICAgICBjYXNlIDg6CisgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRE5YSEQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9VTktOT1dOOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHMtPm5iX3N0cmVhbXMgLSAxOworfQorCisvKioKKyAqIEBicmllZiBmaWx0ZXJzIG91dCBpbnRlcmVzdGluZyB0YWdzIGZyb20gbWF0ZXJpYWwgaW5mb3JtYXRpb24uCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB0YWcgc2VjdGlvbiwgd2lsbCBiZSBhZGp1c3RlZCB0byBjb250YWluIHJlbWFpbmluZyBieXRlcworICogQHBhcmFtIHNpIHN0cnVjdCB0byBzdG9yZSBjb2xsZWN0ZWQgaW5mb3JtYXRpb24gaW50bworICovCitzdGF0aWMgdm9pZCBneGZfbWF0ZXJpYWxfdGFncyhBVklPQ29udGV4dCAqcGIsIGludCAqbGVuLCBzdHJ1Y3QgZ3hmX3N0cmVhbV9pbmZvICpzaSkgeworICAgIHNpLT5maXJzdF9maWVsZCA9IEFWX05PUFRTX1ZBTFVFOworICAgIHNpLT5sYXN0X2ZpZWxkID0gQVZfTk9QVFNfVkFMVUU7CisgICAgd2hpbGUgKCpsZW4gPj0gMikgeworICAgICAgICBHWEZNYXRUYWcgdGFnID0gYXZpb19yOChwYik7CisgICAgICAgIGludCB0bGVuID0gYXZpb19yOChwYik7CisgICAgICAgICpsZW4gLT0gMjsKKyAgICAgICAgaWYgKHRsZW4gPiAqbGVuKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAqbGVuIC09IHRsZW47CisgICAgICAgIGlmICh0bGVuID09IDQpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGlmICh0YWcgPT0gTUFUX0ZJUlNUX0ZJRUxEKQorICAgICAgICAgICAgICAgIHNpLT5maXJzdF9maWVsZCA9IHZhbHVlOworICAgICAgICAgICAgZWxzZSBpZiAodGFnID09IE1BVF9MQVNUX0ZJRUxEKQorICAgICAgICAgICAgICAgIHNpLT5sYXN0X2ZpZWxkID0gdmFsdWU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYXZpb19za2lwKHBiLCB0bGVuKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBBVlJhdGlvbmFsIGZyYW1lX3JhdGVfdGFiW10gPSB7CisgICAgeyAgIDYwLCAgICAxfSwKKyAgICB7NjAwMDAsIDEwMDF9LAorICAgIHsgICA1MCwgICAgMX0sCisgICAgeyAgIDMwLCAgICAxfSwKKyAgICB7MzAwMDAsIDEwMDF9LAorICAgIHsgICAyNSwgICAgMX0sCisgICAgeyAgIDI0LCAgICAxfSwKKyAgICB7MjQwMDAsIDEwMDF9LAorICAgIHsgICAgMCwgICAgMH0sCit9OworCisvKioKKyAqIEBicmllZiBjb252ZXJ0IGZwcyB0YWcgdmFsdWUgdG8gQVZSYXRpb25hbCBmcHMKKyAqIEBwYXJhbSBmcHMgZnBzIHZhbHVlIGZyb20gdGFnCisgKiBAcmV0dXJuIGZwcyBhcyBBVlJhdGlvbmFsLCBvciAwIC8gMCBpZiB1bmtub3duCisgKi8KK3N0YXRpYyBBVlJhdGlvbmFsIGZwc190YWcyYXZyKGludDMyX3QgZnBzKSB7CisgICAgaWYgKGZwcyA8IDEgfHwgZnBzID4gOSkgZnBzID0gOTsKKyAgICByZXR1cm4gZnJhbWVfcmF0ZV90YWJbZnBzIC0gMV07Cit9CisKKy8qKgorICogQGJyaWVmIGNvbnZlcnQgVU1GIGF0dHJpYnV0ZXMgZmxhZ3MgdG8gQVZSYXRpb25hbCBmcHMKKyAqIEBwYXJhbSBmbGFncyBVTUYgZmxhZ3MgdG8gY29udmVydAorICogQHJldHVybiBmcHMgYXMgQVZSYXRpb25hbCwgb3IgMCAvIDAgaWYgdW5rbm93bgorICovCitzdGF0aWMgQVZSYXRpb25hbCBmcHNfdW1mMmF2cih1aW50MzJfdCBmbGFncykgeworICAgIHN0YXRpYyBjb25zdCBBVlJhdGlvbmFsIG1hcFtdID0ge3s1MCwgMX0sIHs2MDAwMCwgMTAwMX0sIHsyNCwgMX0sCisgICAgICAgIHsyNSwgMX0sIHszMDAwMCwgMTAwMX19OworICAgIGludCBpZHggPSAgYXZfbG9nMigoZmxhZ3MgJiAweDdjMCkgPj4gNik7CisgICAgcmV0dXJuIG1hcFtpZHhdOworfQorCisvKioKKyAqIEBicmllZiBmaWx0ZXJzIG91dCBpbnRlcmVzdGluZyB0YWdzIGZyb20gdHJhY2sgaW5mb3JtYXRpb24uCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB0YWcgc2VjdGlvbiwgd2lsbCBiZSBhZGp1c3RlZCB0byBjb250YWluIHJlbWFpbmluZyBieXRlcworICogQHBhcmFtIHNpIHN0cnVjdCB0byBzdG9yZSBjb2xsZWN0ZWQgaW5mb3JtYXRpb24gaW50bworICovCitzdGF0aWMgdm9pZCBneGZfdHJhY2tfdGFncyhBVklPQ29udGV4dCAqcGIsIGludCAqbGVuLCBzdHJ1Y3QgZ3hmX3N0cmVhbV9pbmZvICpzaSkgeworICAgIHNpLT5mcmFtZXNfcGVyX3NlY29uZCA9IChBVlJhdGlvbmFsKXswLCAwfTsKKyAgICBzaS0+ZmllbGRzX3Blcl9mcmFtZSA9IDA7CisgICAgc2ktPnRyYWNrX2F1eF9kYXRhID0gMHg4MDAwMDAwMDsKKyAgICB3aGlsZSAoKmxlbiA+PSAyKSB7CisgICAgICAgIEdYRlRyYWNrVGFnIHRhZyA9IGF2aW9fcjgocGIpOworICAgICAgICBpbnQgdGxlbiA9IGF2aW9fcjgocGIpOworICAgICAgICAqbGVuIC09IDI7CisgICAgICAgIGlmICh0bGVuID4gKmxlbikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgKmxlbiAtPSB0bGVuOworICAgICAgICBpZiAodGxlbiA9PSA0KSB7CisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBpZiAodGFnID09IFRSQUNLX0ZQUykKKyAgICAgICAgICAgICAgICBzaS0+ZnJhbWVzX3Blcl9zZWNvbmQgPSBmcHNfdGFnMmF2cih2YWx1ZSk7CisgICAgICAgICAgICBlbHNlIGlmICh0YWcgPT0gVFJBQ0tfRlBGICYmICh2YWx1ZSA9PSAxIHx8IHZhbHVlID09IDIpKQorICAgICAgICAgICAgICAgIHNpLT5maWVsZHNfcGVyX2ZyYW1lID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAodGxlbiA9PSA4ICYmIHRhZyA9PSBUUkFDS19BVVgpCisgICAgICAgICAgICBzaS0+dHJhY2tfYXV4X2RhdGEgPSBhdmlvX3JsNjQocGIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIHRsZW4pOworICAgIH0KK30KKworLyoqCisgKiBAYnJpZWYgcmVhZCBpbmRleCBmcm9tIEZMVCBwYWNrZXQgaW50byBzdHJlYW0gMCBhdl9pbmRleAorICovCitzdGF0aWMgdm9pZCBneGZfcmVhZF9pbmRleChBVkZvcm1hdENvbnRleHQgKnMsIGludCBwa3RfbGVuKSB7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworICAgIHVpbnQzMl90IGZpZWxkc19wZXJfbWFwID0gYXZpb19ybDMyKHBiKTsKKyAgICB1aW50MzJfdCBtYXBfY250ID0gYXZpb19ybDMyKHBiKTsKKyAgICBpbnQgaTsKKyAgICBwa3RfbGVuIC09IDg7CisgICAgaWYgKChzLT5mbGFncyAmIEFWRk1UX0ZMQUdfSUdOSURYKSB8fCAhcy0+c3RyZWFtcykgeworICAgICAgICBhdmlvX3NraXAocGIsIHBrdF9sZW4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ID0gcy0+c3RyZWFtc1swXTsKKyAgICBpZiAobWFwX2NudCA+IDEwMDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJ0b28gbWFueSBpbmRleCBlbnRyaWVzICUiUFJJdTMyIiAoJSJQUkl4MzIiKVxuIiwKKyAgICAgICAgICAgICAgIG1hcF9jbnQsIG1hcF9jbnQpOworICAgICAgICBtYXBfY250ID0gMTAwMDsKKyAgICB9CisgICAgaWYgKHBrdF9sZW4gPCA0ICogbWFwX2NudCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBpbmRleCBsZW5ndGhcbiIpOworICAgICAgICBhdmlvX3NraXAocGIsIHBrdF9sZW4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBrdF9sZW4gLT0gNCAqIG1hcF9jbnQ7CisgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LCAwLCAwLCAwLCAwLCAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWFwX2NudDsgaSsrKQorICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsICh1aW50NjRfdClhdmlvX3JsMzIocGIpICogMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiAodWludDY0X3QpZmllbGRzX3Blcl9tYXAgKyAxLCAwLCAwLCAwKTsKKyAgICBhdmlvX3NraXAocGIsIHBrdF9sZW4pOworfQorCitzdGF0aWMgaW50IGd4Zl9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKSB7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgR1hGUGt0VHlwZSBwa3RfdHlwZTsKKyAgICBpbnQgbWFwX2xlbjsKKyAgICBpbnQgbGVuOworICAgIEFWUmF0aW9uYWwgbWFpbl90aW1lYmFzZSA9IHswLCAwfTsKKyAgICBzdHJ1Y3QgZ3hmX3N0cmVhbV9pbmZvICpzaSA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKyAgICBpZiAoIXBhcnNlX3BhY2tldF9oZWFkZXIocGIsICZwa3RfdHlwZSwgJm1hcF9sZW4pIHx8IHBrdF90eXBlICE9IFBLVF9NQVApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm1hcCBwYWNrZXQgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG1hcF9sZW4gLT0gMjsKKyAgICBpZiAoYXZpb19yOChwYikgIT0gMHgwZTAgfHwgYXZpb19yOChwYikgIT0gMHhmZikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5rbm93biB2ZXJzaW9uIG9yIGludmFsaWQgbWFwIHByZWFtYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG1hcF9sZW4gLT0gMjsKKyAgICBsZW4gPSBhdmlvX3JiMTYocGIpOyAvLyBsZW5ndGggb2YgbWF0ZXJpYWwgZGF0YSBzZWN0aW9uCisgICAgaWYgKGxlbiA+IG1hcF9sZW4pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm1hdGVyaWFsIGRhdGEgbG9uZ2VyIHRoYW4gbWFwIGRhdGFcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbWFwX2xlbiAtPSBsZW47CisgICAgZ3hmX21hdGVyaWFsX3RhZ3MocGIsICZsZW4sIHNpKTsKKyAgICBhdmlvX3NraXAocGIsIGxlbik7CisgICAgbWFwX2xlbiAtPSAyOworICAgIGxlbiA9IGF2aW9fcmIxNihwYik7IC8vIGxlbmd0aCBvZiB0cmFjayBkZXNjcmlwdGlvbgorICAgIGlmIChsZW4gPiBtYXBfbGVuKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0cmFjayBkZXNjcmlwdGlvbiBsb25nZXIgdGhhbiBtYXAgZGF0YVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBtYXBfbGVuIC09IGxlbjsKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBpbnQgdHJhY2tfdHlwZSwgdHJhY2tfaWQsIHRyYWNrX2xlbjsKKyAgICAgICAgQVZTdHJlYW0gKnN0OworICAgICAgICBpbnQgaWR4OworICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgdHJhY2tfdHlwZSA9IGF2aW9fcjgocGIpOworICAgICAgICB0cmFja19pZCA9IGF2aW9fcjgocGIpOworICAgICAgICB0cmFja19sZW4gPSBhdmlvX3JiMTYocGIpOworICAgICAgICBsZW4gLT0gdHJhY2tfbGVuOworICAgICAgICBpZiAoISh0cmFja190eXBlICYgMHg4MCkpIHsKKyAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdHJhY2sgdHlwZSAleFxuIiwgdHJhY2tfdHlwZSk7CisgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHRyYWNrX3R5cGUgJj0gMHg3ZjsKKyAgICAgICAgaWYgKCh0cmFja19pZCAmIDB4YzApICE9IDB4YzApIHsKKyAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdHJhY2sgaWQgJXhcbiIsIHRyYWNrX2lkKTsKKyAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2tfaWQgJj0gMHgzZjsKKyAgICAgICAgZ3hmX3RyYWNrX3RhZ3MocGIsICZ0cmFja19sZW4sIHNpKTsKKyAgICAgICAgLy8gY2hlY2sgZm9yIHRpbWVjb2RlIHRyYWNrcworICAgICAgICBpZiAodHJhY2tfdHlwZSA9PSA3IHx8IHRyYWNrX3R5cGUgPT0gOCB8fCB0cmFja190eXBlID09IDI0KSB7CisgICAgICAgICAgICBhZGRfdGltZWNvZGVfbWV0YWRhdGEoJnMtPm1ldGFkYXRhLCAidGltZWNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpLT50cmFja19hdXhfZGF0YSAmIDB4ZmZmZmZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ktPmZpZWxkc19wZXJfZnJhbWUpOworCisgICAgICAgIH0KKyAgICAgICAgYXZpb19za2lwKHBiLCB0cmFja19sZW4pOworCisgICAgICAgIGlkeCA9IGdldF9zaW5kZXgocywgdHJhY2tfaWQsIHRyYWNrX3R5cGUpOworICAgICAgICBpZiAoaWR4IDwgMCkgY29udGludWU7CisgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpZHhdOworICAgICAgICBpZiAoIW1haW5fdGltZWJhc2UubnVtIHx8ICFtYWluX3RpbWViYXNlLmRlbikgeworICAgICAgICAgICAgbWFpbl90aW1lYmFzZS5udW0gPSBzaS0+ZnJhbWVzX3Blcl9zZWNvbmQuZGVuOworICAgICAgICAgICAgbWFpbl90aW1lYmFzZS5kZW4gPSBzaS0+ZnJhbWVzX3Blcl9zZWNvbmQubnVtICogMjsKKyAgICAgICAgfQorICAgICAgICBzdC0+c3RhcnRfdGltZSA9IHNpLT5maXJzdF9maWVsZDsKKyAgICAgICAgaWYgKHNpLT5maXJzdF9maWVsZCAhPSBBVl9OT1BUU19WQUxVRSAmJiBzaS0+bGFzdF9maWVsZCAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IHNpLT5sYXN0X2ZpZWxkIC0gc2ktPmZpcnN0X2ZpZWxkOworICAgIH0KKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdHJhY2sgZGVzY3JpcHRpb24gbGVuZ3RoIHNwZWNpZmllZFxuIik7CisgICAgaWYgKG1hcF9sZW4pCisgICAgICAgIGF2aW9fc2tpcChwYiwgbWFwX2xlbik7CisgICAgaWYgKCFwYXJzZV9wYWNrZXRfaGVhZGVyKHBiLCAmcGt0X3R5cGUsICZsZW4pKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJzeW5jIGxvc3QgaW4gaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocGt0X3R5cGUgPT0gUEtUX0ZMVCkgeworICAgICAgICBneGZfcmVhZF9pbmRleChzLCBsZW4pOworICAgICAgICBpZiAoIXBhcnNlX3BhY2tldF9oZWFkZXIocGIsICZwa3RfdHlwZSwgJmxlbikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJzeW5jIGxvc3QgaW4gaGVhZGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGt0X3R5cGUgPT0gUEtUX1VNRikgeworICAgICAgICBpZiAobGVuID49IDB4MzkpIHsKKyAgICAgICAgICAgIEFWUmF0aW9uYWwgZnBzOworICAgICAgICAgICAgbGVuIC09IDB4Mzk7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDUpOyAvLyBwcmVhbWJsZQorICAgICAgICAgICAgYXZpb19za2lwKHBiLCAweDMwKTsgLy8gcGF5bG9hZCBkZXNjcmlwdGlvbgorICAgICAgICAgICAgZnBzID0gZnBzX3VtZjJhdnIoYXZpb19ybDMyKHBiKSk7CisgICAgICAgICAgICBpZiAoIW1haW5fdGltZWJhc2UubnVtIHx8ICFtYWluX3RpbWViYXNlLmRlbikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIk5vIEZQUyB0cmFjayB0YWcsIHVzaW5nIFVNRiBmcHMgdGFnLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVGhpcyBtaWdodCBnaXZlIHdyb25nIHJlc3VsdHMuXG4iKTsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIG1heSBub3QgYWx3YXlzIGJlIGNvcnJlY3QsIGJ1dCBzaW1wbHkgdGhlIGJlc3Qgd2UgY2FuIGdldAorICAgICAgICAgICAgICAgIG1haW5fdGltZWJhc2UubnVtID0gZnBzLmRlbjsKKyAgICAgICAgICAgICAgICBtYWluX3RpbWViYXNlLmRlbiA9IGZwcy5udW0gKiAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGVuID49IDB4MTgpIHsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMHgxODsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDB4MTApOworICAgICAgICAgICAgICAgIGFkZF90aW1lY29kZV9tZXRhZGF0YSgmcy0+bWV0YWRhdGEsICJ0aW1lY29kZV9hdF9tYXJrX2luIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpb19ybDMyKHBiKSwgc2ktPmZpZWxkc19wZXJfZnJhbWUpOworICAgICAgICAgICAgICAgIGFkZF90aW1lY29kZV9tZXRhZGF0YSgmcy0+bWV0YWRhdGEsICJ0aW1lY29kZV9hdF9tYXJrX291dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2aW9fcmwzMihwYiksIHNpLT5maWVsZHNfcGVyX2ZyYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJVTUYgcGFja2V0IHRvbyBzaG9ydFxuIik7CisgICAgfSBlbHNlCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIlVNRiBwYWNrZXQgbWlzc2luZ1xuIik7CisgICAgYXZpb19za2lwKHBiLCBsZW4pOworICAgIC8vIHNldCBhIGZhbGxiYWNrIHZhbHVlLCA2MDAwMC8xMDAxIGlzIHNwZWNpZmllZCBmb3IgYXVkaW8tb25seSBmaWxlcworICAgIC8vIHNvIHVzZSB0aGF0IHJlZ2FyZGxlc3Mgb2Ygd2h5IHdlIGRvIG5vdCBrbm93IHRoZSB2aWRlbyBmcmFtZSByYXRlLgorICAgIGlmICghbWFpbl90aW1lYmFzZS5udW0gfHwgIW1haW5fdGltZWJhc2UuZGVuKQorICAgICAgICBtYWluX3RpbWViYXNlID0gKEFWUmF0aW9uYWwpezEwMDEsIDYwMDAwfTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCBtYWluX3RpbWViYXNlLm51bSwgbWFpbl90aW1lYmFzZS5kZW4pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBSRUFEX09ORSgpIFwKKyAgICB7IFwKKyAgICAgICAgaWYgKCFtYXhfaW50ZXJ2YWwtLSB8fCBhdmlvX2Zlb2YocGIpKSBcCisgICAgICAgICAgICBnb3RvIG91dDsgXAorICAgICAgICB0bXAgPSB0bXAgPDwgOCB8IGF2aW9fcjgocGIpOyBcCisgICAgfQorCisvKioKKyAqIEBicmllZiByZXN5bmMgdGhlIHN0cmVhbSBvbiB0aGUgbmV4dCBtZWRpYSBwYWNrZXQgd2l0aCBzcGVjaWZpZWQgcHJvcGVydGllcworICogQHBhcmFtIG1heF9pbnRlcnZhbCBob3cgbWFueSBieXRlcyB0byBzZWFyY2ggZm9yIG1hdGNoaW5nIHBhY2tldCBhdCBtb3N0CisgKiBAcGFyYW0gdHJhY2sgdHJhY2sgaWQgdGhlIG1lZGlhIHBhY2tldCBtdXN0IGJlbG9uZyB0bywgLTEgZm9yIGFueQorICogQHBhcmFtIHRpbWVzdGFtcCBtaW5pbXVtIHRpbWVzdGFtcCAoPT0gZmllbGQgbnVtYmVyKSB0aGUgcGFja2V0IG11c3QgaGF2ZSwgLTEgZm9yIGFueQorICogQHJldHVybiB0aW1lc3RhbXAgb2YgcGFja2V0IGZvdW5kCisgKi8KK3N0YXRpYyBpbnQ2NF90IGd4Zl9yZXN5bmNfbWVkaWEoQVZGb3JtYXRDb250ZXh0ICpzLCB1aW50NjRfdCBtYXhfaW50ZXJ2YWwsIGludCB0cmFjaywgaW50IHRpbWVzdGFtcCkgeworICAgIHVpbnQzMl90IHRtcDsKKyAgICB1aW50NjRfdCBsYXN0X3BvczsKKyAgICB1aW50NjRfdCBsYXN0X2ZvdW5kX3BvcyA9IDA7CisgICAgaW50IGN1cl90cmFjazsKKyAgICBpbnQ2NF90IGN1cl90aW1lc3RhbXAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBpbnQgbGVuOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEdYRlBrdFR5cGUgdHlwZTsKKyAgICB0bXAgPSBhdmlvX3JiMzIocGIpOworc3RhcnQ6CisgICAgd2hpbGUgKHRtcCkKKyAgICAgICAgUkVBRF9PTkUoKTsKKyAgICBSRUFEX09ORSgpOworICAgIGlmICh0bXAgIT0gMSkKKyAgICAgICAgZ290byBzdGFydDsKKyAgICBsYXN0X3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgaWYgKGF2aW9fc2VlayhwYiwgLTUsIFNFRUtfQ1VSKSA8IDApCisgICAgICAgIGdvdG8gb3V0OworICAgIGlmICghcGFyc2VfcGFja2V0X2hlYWRlcihwYiwgJnR5cGUsICZsZW4pIHx8IHR5cGUgIT0gUEtUX01FRElBKSB7CisgICAgICAgIGlmIChhdmlvX3NlZWsocGIsIGxhc3RfcG9zLCBTRUVLX1NFVCkgPCAwKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIGdvdG8gc3RhcnQ7CisgICAgfQorICAgIGF2aW9fcjgocGIpOworICAgIGN1cl90cmFjayA9IGF2aW9fcjgocGIpOworICAgIGN1cl90aW1lc3RhbXAgPSBhdmlvX3JiMzIocGIpOworICAgIGxhc3RfZm91bmRfcG9zID0gYXZpb190ZWxsKHBiKSAtIDE2IC0gNjsKKyAgICBpZiAoKHRyYWNrID49IDAgJiYgdHJhY2sgIT0gY3VyX3RyYWNrKSB8fCAodGltZXN0YW1wID49IDAgJiYgdGltZXN0YW1wID4gY3VyX3RpbWVzdGFtcCkpIHsKKyAgICAgICAgaWYgKGF2aW9fc2VlayhwYiwgbGFzdF9wb3MsIFNFRUtfU0VUKSA+PSAwKQorICAgICAgICAgICAgZ290byBzdGFydDsKKyAgICB9CitvdXQ6CisgICAgaWYgKGxhc3RfZm91bmRfcG9zKQorICAgICAgICBhdmlvX3NlZWsocGIsIGxhc3RfZm91bmRfcG9zLCBTRUVLX1NFVCk7CisgICAgcmV0dXJuIGN1cl90aW1lc3RhbXA7Cit9CisKK3N0YXRpYyBpbnQgZ3hmX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpIHsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBHWEZQa3RUeXBlIHBrdF90eXBlOworICAgIGludCBwa3RfbGVuOworICAgIHN0cnVjdCBneGZfc3RyZWFtX2luZm8gKnNpID0gcy0+cHJpdl9kYXRhOworCisgICAgd2hpbGUgKCFwYi0+ZW9mX3JlYWNoZWQpIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0OworICAgICAgICBpbnQgdHJhY2tfdHlwZSwgdHJhY2tfaWQsIHJldDsKKyAgICAgICAgaW50IGZpZWxkX25yLCBmaWVsZF9pbmZvLCBza2lwID0gMDsKKyAgICAgICAgaW50IHN0cmVhbV9pbmRleDsKKyAgICAgICAgaWYgKCFwYXJzZV9wYWNrZXRfaGVhZGVyKHBiLCAmcGt0X3R5cGUsICZwa3RfbGVuKSkgeworICAgICAgICAgICAgaWYgKCFhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJzeW5jIGxvc3RcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChwa3RfdHlwZSA9PSBQS1RfRkxUKSB7CisgICAgICAgICAgICBneGZfcmVhZF9pbmRleChzLCBwa3RfbGVuKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwa3RfdHlwZSAhPSBQS1RfTUVESUEpIHsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgcGt0X2xlbik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGt0X2xlbiA8IDE2KSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBtZWRpYSBwYWNrZXQgbGVuZ3RoXG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBrdF9sZW4gLT0gMTY7CisgICAgICAgIHRyYWNrX3R5cGUgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgdHJhY2tfaWQgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgc3RyZWFtX2luZGV4ID0gZ2V0X3NpbmRleChzLCB0cmFja19pZCwgdHJhY2tfdHlwZSk7CisgICAgICAgIGlmIChzdHJlYW1faW5kZXggPCAwKQorICAgICAgICAgICAgcmV0dXJuIHN0cmVhbV9pbmRleDsKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgICAgIGZpZWxkX25yID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgZmllbGRfaW5mbyA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGF2aW9fcmIzMihwYik7IC8vICJ0aW1lbGluZSIgZmllbGQgbnVtYmVyCisgICAgICAgIGF2aW9fcjgocGIpOyAvLyBmbGFncworICAgICAgICBhdmlvX3I4KHBiKTsgLy8gcmVzZXJ2ZWQKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MyNExFIHx8CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMTZMRSkgeworICAgICAgICAgICAgaW50IGZpcnN0ID0gZmllbGRfaW5mbyA+PiAxNjsKKyAgICAgICAgICAgIGludCBsYXN0ICA9IGZpZWxkX2luZm8gJiAweGZmZmY7IC8vIGxhc3QgaXMgZXhjbHVzaXZlCisgICAgICAgICAgICBpbnQgYnBzID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKT4+MzsKKyAgICAgICAgICAgIGlmIChmaXJzdCA8PSBsYXN0ICYmIGxhc3QqYnBzIDw9IHBrdF9sZW4pIHsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIGZpcnN0KmJwcyk7CisgICAgICAgICAgICAgICAgc2tpcCA9IHBrdF9sZW4gLSBsYXN0KmJwczsKKyAgICAgICAgICAgICAgICBwa3RfbGVuID0gKGxhc3QtZmlyc3QpKmJwczsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGZpcnN0IGFuZCBsYXN0IHNhbXBsZSB2YWx1ZXNcbiIpOworICAgICAgICB9CisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgcGt0X2xlbik7CisgICAgICAgIGlmIChza2lwKQorICAgICAgICAgICAgYXZpb19za2lwKHBiLCBza2lwKTsKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdHJlYW1faW5kZXg7CisgICAgICAgIHBrdC0+ZHRzID0gZmllbGRfbnI7CisKKyAgICAgICAgLy9zZXQgZHVyYXRpb24gbWFudWFsbHkgZm9yIERWIG9yIGVsc2UgbGF2ZiBtaXNkZXRlY3RzIHRoZSBmcmFtZSByYXRlCisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8pCisgICAgICAgICAgICBwa3QtPmR1cmF0aW9uID0gc2ktPmZpZWxkc19wZXJfZnJhbWU7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1JfRU9GOworfQorCitzdGF0aWMgaW50IGd4Zl9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykgeworICAgIGludCByZXMgPSAwOworICAgIHVpbnQ2NF90IHBvczsKKyAgICB1aW50NjRfdCBtYXhsZW4gPSAxMDAgKiAxMDI0ICogMTAyNDsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIGludDY0X3Qgc3RhcnRfdGltZSA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+c3RhcnRfdGltZTsKKyAgICBpbnQ2NF90IGZvdW5kOworICAgIGludCBpZHg7CisgICAgaWYgKHRpbWVzdGFtcCA8IHN0YXJ0X3RpbWUpIHRpbWVzdGFtcCA9IHN0YXJ0X3RpbWU7CisgICAgaWR4ID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdCwgdGltZXN0YW1wIC0gc3RhcnRfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU0VFS19GTEFHX0FOWSB8IEFWU0VFS19GTEFHX0JBQ0tXQVJEKTsKKyAgICBpZiAoaWR4IDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHBvcyA9IHN0LT5pbmRleF9lbnRyaWVzW2lkeF0ucG9zOworICAgIGlmIChpZHggPCBzdC0+bmJfaW5kZXhfZW50cmllcyAtIDIpCisgICAgICAgIG1heGxlbiA9IHN0LT5pbmRleF9lbnRyaWVzW2lkeCArIDJdLnBvcyAtIHBvczsKKyAgICBtYXhsZW4gPSBGRk1BWChtYXhsZW4sIDIwMCAqIDEwMjQpOworICAgIHJlcyA9IGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiByZXM7CisgICAgZm91bmQgPSBneGZfcmVzeW5jX21lZGlhKHMsIG1heGxlbiwgLTEsIHRpbWVzdGFtcCk7CisgICAgaWYgKEZGQUJTKGZvdW5kIC0gdGltZXN0YW1wKSA+IDQpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludDY0X3QgZ3hmX3JlYWRfdGltZXN0YW1wKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpwb3MsIGludDY0X3QgcG9zX2xpbWl0KSB7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50NjRfdCByZXM7CisgICAgaWYgKGF2aW9fc2VlayhwYiwgKnBvcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworICAgIHJlcyA9IGd4Zl9yZXN5bmNfbWVkaWEocywgcG9zX2xpbWl0IC0gKnBvcywgLTEsIC0xKTsKKyAgICAqcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICByZXR1cm4gcmVzOworfQorCitBVklucHV0Rm9ybWF0IGZmX2d4Zl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJneGYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHWEYgKEdlbmVyYWwgZVhjaGFuZ2UgRm9ybWF0KSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZ3hmX3N0cmVhbV9pbmZvKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBneGZfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZ3hmX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBneGZfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IGd4Zl9zZWVrLAorICAgIC5yZWFkX3RpbWVzdGFtcCA9IGd4Zl9yZWFkX3RpbWVzdGFtcCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvZ3hmLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvZ3hmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkY2RlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9neGYuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogR1hGIGRlbXV4ZXIKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBSZWltYXIgRG9lZmZpbmdlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX0dYRl9ICisjZGVmaW5lIEFWRk9STUFUX0dYRl9ICisKK3R5cGVkZWYgZW51bSB7CisgICAgUEtUX01BUCAgICAgICAgID0gMHhiYywKKyAgICBQS1RfTUVESUEgICAgICAgPSAweGJmLAorICAgIFBLVF9FT1MgICAgICAgICA9IDB4ZmIsCisgICAgUEtUX0ZMVCAgICAgICAgID0gMHhmYywKKyAgICBQS1RfVU1GICAgICAgICAgPSAweGZkLAorfSBHWEZQa3RUeXBlOworCit0eXBlZGVmIGVudW0geworICAgIE1BVF9OQU1FICAgICAgICA9IDB4NDAsCisgICAgTUFUX0ZJUlNUX0ZJRUxEID0gMHg0MSwKKyAgICBNQVRfTEFTVF9GSUVMRCAgPSAweDQyLAorICAgIE1BVF9NQVJLX0lOICAgICA9IDB4NDMsCisgICAgTUFUX01BUktfT1VUICAgID0gMHg0NCwKKyAgICBNQVRfU0laRSAgICAgICAgPSAweDQ1LAorfSBHWEZNYXRUYWc7CisKK3R5cGVkZWYgZW51bSB7CisgICAgVFJBQ0tfTkFNRSAgICAgID0gMHg0YywKKyAgICBUUkFDS19BVVggICAgICAgPSAweDRkLAorICAgIFRSQUNLX1ZFUiAgICAgICA9IDB4NGUsCisgICAgVFJBQ0tfTVBHX0FVWCAgID0gMHg0ZiwKKyAgICBUUkFDS19GUFMgICAgICAgPSAweDUwLAorICAgIFRSQUNLX0xJTkVTICAgICA9IDB4NTEsCisgICAgVFJBQ0tfRlBGICAgICAgID0gMHg1MiwKK30gR1hGVHJhY2tUYWc7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9HWEZfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2d4ZmVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2d4ZmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDMxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvZ3hmZW5jLmMKQEAgLTAsMCArMSwxMDMzIEBACisvKgorICogR1hGIG11eGVyLgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNtYXJ0Sm9nIFMuQS4sIEJhcHRpc3RlIENvdWR1cmllciA8YmFwdGlzdGUgZG90IGNvdWR1cmllciBhdCBzbWFydGpvZyBkb3QgY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGZsb2F0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lY29kZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJneGYuaCIKKyNpbmNsdWRlICJhdWRpb2ludGVybGVhdmUuaCIKKworI2RlZmluZSBHWEZfQVVESU9fUEFDS0VUX1NJWkUgNjU1MzYKKworI2RlZmluZSBHWEZfVElNRUNPREUoYywgZCwgaCwgbSwgcywgZikgXAorICAgICgoYykgPDwgMzAgfCAoZCkgPDwgMjkgfCAoaCkgPDwgMjQgfCAobSkgPDwgMTYgfCAocykgPDwgOCB8IChmKSkKKwordHlwZWRlZiBzdHJ1Y3QgR1hGVGltZWNvZGV7CisgICAgaW50IGhoOworICAgIGludCBtbTsKKyAgICBpbnQgc3M7CisgICAgaW50IGZmOworICAgIGludCBjb2xvcjsKKyAgICBpbnQgZHJvcDsKK30gR1hGVGltZWNvZGU7CisKK3R5cGVkZWYgc3RydWN0IEdYRlN0cmVhbUNvbnRleHQgeworICAgIEF1ZGlvSW50ZXJsZWF2ZUNvbnRleHQgYWljOworICAgIHVpbnQzMl90IHRyYWNrX3R5cGU7CisgICAgdWludDMyX3Qgc2FtcGxlX3NpemU7CisgICAgdWludDMyX3Qgc2FtcGxlX3JhdGU7CisgICAgdWludDE2X3QgbWVkaWFfdHlwZTsKKyAgICB1aW50MTZfdCBtZWRpYV9pbmZvOworICAgIGludCBmcmFtZV9yYXRlX2luZGV4OworICAgIGludCBsaW5lc19pbmRleDsKKyAgICBpbnQgZmllbGRzOworICAgIGludCBpZnJhbWVzOworICAgIGludCBwZnJhbWVzOworICAgIGludCBiZnJhbWVzOworICAgIGludCBwX3Blcl9nb3A7CisgICAgaW50IGJfcGVyX2lfb3JfcDsgLy8vPCBudW1iZXIgb2YgQiBmcmFtZXMgcGVyIEkgZnJhbWUgb3IgUCBmcmFtZQorICAgIGludCBmaXJzdF9nb3BfY2xvc2VkOworICAgIHVuc2lnbmVkIG9yZGVyOyAgIC8vLzwgaW50ZXJsZWF2aW5nIG9yZGVyCit9IEdYRlN0cmVhbUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IEdYRkNvbnRleHQgeworICAgIEFWQ2xhc3MgKmF2X2NsYXNzOworICAgIHVpbnQzMl90IG5iX2ZpZWxkczsKKyAgICB1aW50MTZfdCBhdWRpb190cmFja3M7CisgICAgdWludDE2X3QgbXBlZ190cmFja3M7CisgICAgaW50NjRfdCBjcmVhdGlvbl90aW1lOworICAgIHVpbnQzMl90IHVtZl9zdGFydF9vZmZzZXQ7CisgICAgdWludDMyX3QgdW1mX3RyYWNrX29mZnNldDsKKyAgICB1aW50MzJfdCB1bWZfbWVkaWFfb2Zmc2V0OworICAgIHVpbnQzMl90IHVtZl9sZW5ndGg7CisgICAgdWludDE2X3QgdW1mX3RyYWNrX3NpemU7CisgICAgdWludDE2X3QgdW1mX21lZGlhX3NpemU7CisgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7CisgICAgaW50IGZsYWdzOworICAgIEdYRlN0cmVhbUNvbnRleHQgdGltZWNvZGVfdHJhY2s7CisgICAgdW5zaWduZWQgKmZsdF9lbnRyaWVzOyAgICAvLy88IG9mZnNldHMgb2YgcGFja2V0cyAvMTAyNCwgc3RhcnRzIGFmdGVyIDJuZCB2aWRlbyBmaWVsZAorICAgIHVuc2lnbmVkIGZsdF9lbnRyaWVzX25iOworICAgIHVpbnQ2NF90ICptYXBfb2Zmc2V0czsgICAgLy8vPCBvZmZzZXQgb2YgbWFwIHBhY2tldHMKKyAgICB1bnNpZ25lZCBtYXBfb2Zmc2V0c19uYjsKKyAgICB1bnNpZ25lZCBwYWNrZXRfY291bnQ7CisgICAgR1hGVGltZWNvZGUgdGM7Cit9IEdYRkNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGludCBoZWlnaHQsIGluZGV4OworfSBneGZfbGluZXNfdGFiW10gPSB7CisgICAgeyA0ODAsICAxIH0sIC8qIE5UU0MgKi8KKyAgICB7IDUxMiwgIDEgfSwgLyogTlRTQyArIFZCSSAqLworICAgIHsgNTc2LCAgMiB9LCAvKiBQQUwgKi8KKyAgICB7IDYwOCwgIDIgfSwgLyogUEFMICsgVkJJICovCisgICAgeyAxMDgwLCA0IH0sCisgICAgeyA3MjAsICA2IH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY1RhZyBneGZfbWVkaWFfdHlwZXNbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX01KUEVHICAgICAsICAgMyB9LCAvKiBOVFNDICovCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRyAgICAgLCAgIDQgfSwgLyogUEFMICovCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzI0TEUgLCAgIDkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMTZMRSAsICAxMCB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgIDExIH0sIC8qIE5UU0MgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sICAxMiB9LCAvKiBQQUwgKi8KKyAgICB7IEFWX0NPREVDX0lEX0RWVklERU8gICAsICAxMyB9LCAvKiBOVFNDICovCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPICAgLCAgMTQgfSwgLyogUEFMICovCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPICAgLCAgMTUgfSwgLyogNTBNIE5UU0MgKi8KKyAgICB7IEFWX0NPREVDX0lEX0RWVklERU8gICAsICAxNiB9LCAvKiA1ME0gUEFMICovCisgICAgeyBBVl9DT0RFQ19JRF9BQzMgICAgICAgLCAgMTcgfSwKKyAgICAvL3sgQVZfQ09ERUNfSURfTk9ORSwgICwgICAxOCB9LCAvKiBOb24gY29tcHJlc3NlZCAyNCBiaXQgYXVkaW8gKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sICAyMCB9LCAvKiBNUEVHIEhEICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLCAgMjIgfSwgLyogTlRTQyAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzFWSURFTywgIDIzIH0sIC8qIFBBTCAqLworICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgICAgICAwIH0sCit9OworCisjZGVmaW5lIFNFUlZFUl9QQVRIICJFWFQ6L1BEUi9kZWZhdWx0LyIKKyNkZWZpbmUgRVNfTkFNRV9QQVRURVJOICJFWFQ6L1BEUi9kZWZhdWx0L0VTLiIKKworc3RhdGljIGludCBneGZfZmluZF9saW5lc19pbmRleChBVlN0cmVhbSAqc3QpCit7CisgICAgR1hGU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkgeworICAgICAgICBpZiAoc3QtPmNvZGVjLT5oZWlnaHQgPT0gZ3hmX2xpbmVzX3RhYltpXS5oZWlnaHQpIHsKKyAgICAgICAgICAgIHNjLT5saW5lc19pbmRleCA9IGd4Zl9saW5lc190YWJbaV0uaW5kZXg7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGd4Zl93cml0ZV9wYWRkaW5nKEFWSU9Db250ZXh0ICpwYiwgaW50NjRfdCB0b19wYWQpCit7CisgICAgZm9yICg7IHRvX3BhZCA+IDA7IHRvX3BhZC0tKSB7CisgICAgICAgIGF2aW9fdzgocGIsIDApOworICAgIH0KK30KKworc3RhdGljIGludDY0X3QgdXBkYXRlUGFja2V0U2l6ZShBVklPQ29udGV4dCAqcGIsIGludDY0X3QgcG9zKQoreworICAgIGludDY0X3QgY3VycG9zOworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IGF2aW9fdGVsbChwYikgLSBwb3M7CisgICAgaWYgKHNpemUgJSA0KSB7CisgICAgICAgIGd4Zl93cml0ZV9wYWRkaW5nKHBiLCA0IC0gc2l6ZSAlIDQpOworICAgICAgICBzaXplID0gYXZpb190ZWxsKHBiKSAtIHBvczsKKyAgICB9CisgICAgY3VycG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3NlZWsocGIsIHBvcyArIDYsIFNFRUtfU0VUKTsKKyAgICBhdmlvX3diMzIocGIsIHNpemUpOworICAgIGF2aW9fc2VlayhwYiwgY3VycG9zLCBTRUVLX1NFVCk7CisgICAgcmV0dXJuIGN1cnBvcyAtIHBvczsKK30KKworc3RhdGljIGludDY0X3QgdXBkYXRlU2l6ZShBVklPQ29udGV4dCAqcGIsIGludDY0X3QgcG9zKQoreworICAgIGludDY0X3QgY3VycG9zOworCisgICAgY3VycG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3NlZWsocGIsIHBvcywgU0VFS19TRVQpOworICAgIGF2aW9fd2IxNihwYiwgY3VycG9zIC0gcG9zIC0gMik7CisgICAgYXZpb19zZWVrKHBiLCBjdXJwb3MsIFNFRUtfU0VUKTsKKyAgICByZXR1cm4gY3VycG9zIC0gcG9zOworfQorCitzdGF0aWMgdm9pZCBneGZfd3JpdGVfcGFja2V0X2hlYWRlcihBVklPQ29udGV4dCAqcGIsIEdYRlBrdFR5cGUgdHlwZSkKK3sKKyAgICBhdmlvX3diMzIocGIsIDApOyAgLyogcGFja2V0IGxlYWRlciBmb3Igc3luY2hybyAqLworICAgIGF2aW9fdzgocGIsIDEpOworICAgIGF2aW9fdzgocGIsIHR5cGUpOyAvKiBtYXAgcGFja2V0ICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgIC8qIHNpemUgKi8KKyAgICBhdmlvX3diMzIocGIsIDApOyAgLyogcmVzZXJ2ZWQgKi8KKyAgICBhdmlvX3c4KHBiLCAweEUxKTsgLyogdHJhaWxlciAxICovCisgICAgYXZpb193OChwYiwgMHhFMik7IC8qIHRyYWlsZXIgMiAqLworfQorCitzdGF0aWMgaW50IGd4Zl93cml0ZV9tcGVnX2F1eGlsaWFyeShBVklPQ29udGV4dCAqcGIsIEFWU3RyZWFtICpzdCkKK3sKKyAgICBHWEZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgaW50IHNpemUsIHN0YXJ0aW5nX2xpbmU7CisKKyAgICBpZiAoc2MtPmlmcmFtZXMpIHsKKyAgICAgICAgc2MtPnBfcGVyX2dvcCA9IHNjLT5wZnJhbWVzIC8gc2MtPmlmcmFtZXM7CisgICAgICAgIGlmIChzYy0+cGZyYW1lcyAlIHNjLT5pZnJhbWVzKQorICAgICAgICAgICAgc2MtPnBfcGVyX2dvcCsrOworICAgICAgICBpZiAoc2MtPnBmcmFtZXMpIHsKKyAgICAgICAgICAgIHNjLT5iX3Blcl9pX29yX3AgPSBzYy0+YmZyYW1lcyAvIHNjLT5wZnJhbWVzOworICAgICAgICAgICAgaWYgKHNjLT5iZnJhbWVzICUgc2MtPnBmcmFtZXMpCisgICAgICAgICAgICAgICAgc2MtPmJfcGVyX2lfb3JfcCsrOworICAgICAgICB9CisgICAgICAgIGlmIChzYy0+cF9wZXJfZ29wID4gOSkKKyAgICAgICAgICAgIHNjLT5wX3Blcl9nb3AgPSA5OyAvKiBlbnN1cmUgdmFsdWUgd29uJ3QgdGFrZSBtb3JlIHRoYW4gb25lIGNoYXIgKi8KKyAgICAgICAgaWYgKHNjLT5iX3Blcl9pX29yX3AgPiA5KQorICAgICAgICAgICAgc2MtPmJfcGVyX2lfb3JfcCA9IDk7IC8qIGVuc3VyZSB2YWx1ZSB3b24ndCB0YWtlIG1vcmUgdGhhbiBvbmUgY2hhciAqLworICAgIH0KKyAgICBpZiAoc3QtPmNvZGVjLT5oZWlnaHQgPT0gNTEyIHx8IHN0LT5jb2RlYy0+aGVpZ2h0ID09IDYwOCkKKyAgICAgICAgc3RhcnRpbmdfbGluZSA9IDc7IC8vIFZCSQorICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+aGVpZ2h0ID09IDQ4MCkKKyAgICAgICAgc3RhcnRpbmdfbGluZSA9IDIwOworICAgIGVsc2UKKyAgICAgICAgc3RhcnRpbmdfbGluZSA9IDIzOyAvLyBkZWZhdWx0IFBBTAorCisgICAgc2l6ZSA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJWZXIgMVxuQnIgJS42ZlxuSXBnIDFcblBwaSAlZFxuQnBpb3AgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgIlBpeCAwXG5DZiAlZFxuQ2cgJWRcblNsICVkXG5ubDE2ICVkXG5WaSAxXG5mMSAxXG4iLAorICAgICAgICAgICAgICAgICAgICAoZmxvYXQpc3QtPmNvZGVjLT5iaXRfcmF0ZSwgc2MtPnBfcGVyX2dvcCwgc2MtPmJfcGVyX2lfb3JfcCwKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUCA/IDIgOiAxLCBzYy0+Zmlyc3RfZ29wX2Nsb3NlZCA9PSAxLAorICAgICAgICAgICAgICAgICAgICBzdGFydGluZ19saW5lLCAoc3QtPmNvZGVjLT5oZWlnaHQgKyAxNSkgLyAxNik7CisgICAgYXZfYXNzZXJ0MChzaXplIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIGF2aW9fdzgocGIsIFRSQUNLX01QR19BVVgpOworICAgIGF2aW9fdzgocGIsIHNpemUgKyAxKTsKKyAgICBhdmlvX3dyaXRlKHBiLCAodWludDhfdCAqKWJ1ZmZlciwgc2l6ZSArIDEpOworICAgIHJldHVybiBzaXplICsgMzsKK30KKworc3RhdGljIGludCBneGZfd3JpdGVfZHZfYXV4aWxpYXJ5KEFWSU9Db250ZXh0ICpwYiwgQVZTdHJlYW0gKnN0KQoreworICAgIGludDY0X3QgdHJhY2tfYXV4X2RhdGEgPSAwOworCisgICAgYXZpb193OChwYiwgVFJBQ0tfQVVYKTsKKyAgICBhdmlvX3c4KHBiLCA4KTsKKyAgICBpZiAoc3QtPmNvZGVjLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkKKyAgICAgICAgdHJhY2tfYXV4X2RhdGEgfD0gMHgwMTsgICAgIC8qIG1hcmtzIHN0cmVhbSBhcyBEVkNBTSBpbnN0ZWFkIG9mIERWUFJPICovCisgICAgdHJhY2tfYXV4X2RhdGEgfD0gMHg0MDAwMDAwMDsgICAvKiBhdXggZGF0YSBpcyB2YWxpZCAqLworICAgIGF2aW9fd2w2NChwYiwgdHJhY2tfYXV4X2RhdGEpOworICAgIHJldHVybiA4OworfQorCitzdGF0aWMgaW50IGd4Zl93cml0ZV90aW1lY29kZV9hdXhpbGlhcnkoQVZJT0NvbnRleHQgKnBiLCBHWEZDb250ZXh0ICpneGYpCit7CisgICAgdWludDMyX3QgdGltZWNvZGUgPSBHWEZfVElNRUNPREUoZ3hmLT50Yy5jb2xvciwgZ3hmLT50Yy5kcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4Zi0+dGMuaGgsIGd4Zi0+dGMubW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3hmLT50Yy5zcywgZ3hmLT50Yy5mZik7CisKKyAgICBhdmlvX3c4KHBiLCBUUkFDS19BVVgpOworICAgIGF2aW9fdzgocGIsIDgpOworICAgIGF2aW9fd2wzMihwYiwgdGltZWNvZGUpOworICAgIC8qIHJlc2VydmVkICovCisgICAgYXZpb193bDMyKHBiLCAwKTsKKyAgICByZXR1cm4gODsKK30KKworc3RhdGljIGludCBneGZfd3JpdGVfdHJhY2tfZGVzY3JpcHRpb24oQVZGb3JtYXRDb250ZXh0ICpzLCBHWEZTdHJlYW1Db250ZXh0ICpzYywgaW50IGluZGV4KQoreworICAgIEdYRkNvbnRleHQgKmd4ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQ2NF90IHBvczsKKworICAgIC8qIHRyYWNrIGRlc2NyaXB0aW9uIHNlY3Rpb24gKi8KKyAgICBhdmlvX3c4KHBiLCBzYy0+bWVkaWFfdHlwZSArIDB4ODApOworICAgIGF2aW9fdzgocGIsIGluZGV4ICsgMHhDMCk7CisKKyAgICBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fd2IxNihwYiwgMCk7IC8qIHNpemUgKi8KKworICAgIC8qIG1lZGlhIGZpbGUgbmFtZSAqLworICAgIGF2aW9fdzgocGIsIFRSQUNLX05BTUUpOworICAgIGF2aW9fdzgocGIsIHN0cmxlbihFU19OQU1FX1BBVFRFUk4pICsgMyk7CisgICAgYXZpb193cml0ZShwYiwgRVNfTkFNRV9QQVRURVJOLCBzaXplb2YoRVNfTkFNRV9QQVRURVJOKSAtIDEpOworICAgIGF2aW9fd2IxNihwYiwgc2MtPm1lZGlhX2luZm8pOworICAgIGF2aW9fdzgocGIsIDApOworCisgICAgc3dpdGNoIChzYy0+dHJhY2tfdHlwZSkgeworICAgICAgICBjYXNlIDM6ICAgICAvKiB0aW1lY29kZSAqLworICAgICAgICAgICAgZ3hmX3dyaXRlX3RpbWVjb2RlX2F1eGlsaWFyeShwYiwgZ3hmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6ICAgICAvKiBNUEVHMiAqLworICAgICAgICBjYXNlIDk6ICAgICAvKiBNUEVHMSAqLworICAgICAgICAgICAgZ3hmX3dyaXRlX21wZWdfYXV4aWxpYXJ5KHBiLCBzLT5zdHJlYW1zW2luZGV4XSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OiAgICAgLyogRFYyNSAqLworICAgICAgICBjYXNlIDY6ICAgICAvKiBEVjUwICovCisgICAgICAgICAgICBneGZfd3JpdGVfZHZfYXV4aWxpYXJ5KHBiLCBzLT5zdHJlYW1zW2luZGV4XSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIFRSQUNLX0FVWCk7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCA4KTsKKyAgICAgICAgICAgIGF2aW9fd2w2NChwYiwgMCk7CisgICAgfQorCisgICAgLyogZmlsZSBzeXN0ZW0gdmVyc2lvbiAqLworICAgIGF2aW9fdzgocGIsIFRSQUNLX1ZFUik7CisgICAgYXZpb193OChwYiwgNCk7CisgICAgYXZpb193YjMyKHBiLCAwKTsKKworICAgIC8qIGZyYW1lIHJhdGUgKi8KKyAgICBhdmlvX3c4KHBiLCBUUkFDS19GUFMpOworICAgIGF2aW9fdzgocGIsIDQpOworICAgIGF2aW9fd2IzMihwYiwgc2MtPmZyYW1lX3JhdGVfaW5kZXgpOworCisgICAgLyogbGluZXMgcGVyIGZyYW1lICovCisgICAgYXZpb193OChwYiwgVFJBQ0tfTElORVMpOworICAgIGF2aW9fdzgocGIsIDQpOworICAgIGF2aW9fd2IzMihwYiwgc2MtPmxpbmVzX2luZGV4KTsKKworICAgIC8qIGZpZWxkcyBwZXIgZnJhbWUgKi8KKyAgICBhdmlvX3c4KHBiLCBUUkFDS19GUEYpOworICAgIGF2aW9fdzgocGIsIDQpOworICAgIGF2aW9fd2IzMihwYiwgc2MtPmZpZWxkcyk7CisKKyAgICByZXR1cm4gdXBkYXRlU2l6ZShwYiwgcG9zKTsKK30KKworc3RhdGljIGludCBneGZfd3JpdGVfbWF0ZXJpYWxfZGF0YV9zZWN0aW9uKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBHWEZDb250ZXh0ICpneGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50NjRfdCBwb3M7CisgICAgaW50IGxlbjsKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IHN0cnJjaHIocy0+ZmlsZW5hbWUsICcvJyk7CisKKyAgICBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fd2IxNihwYiwgMCk7IC8qIHNpemUgKi8KKworICAgIC8qIG5hbWUgKi8KKyAgICBpZiAoZmlsZW5hbWUpCisgICAgICAgIGZpbGVuYW1lKys7CisgICAgZWxzZQorICAgICAgICBmaWxlbmFtZSA9IHMtPmZpbGVuYW1lOworICAgIGxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CisKKyAgICBhdmlvX3c4KHBiLCBNQVRfTkFNRSk7CisgICAgYXZpb193OChwYiwgc3RybGVuKFNFUlZFUl9QQVRIKSArIGxlbiArIDEpOworICAgIGF2aW9fd3JpdGUocGIsIFNFUlZFUl9QQVRILCBzaXplb2YoU0VSVkVSX1BBVEgpIC0gMSk7CisgICAgYXZpb193cml0ZShwYiwgZmlsZW5hbWUsIGxlbik7CisgICAgYXZpb193OChwYiwgMCk7CisKKyAgICAvKiBmaXJzdCBmaWVsZCAqLworICAgIGF2aW9fdzgocGIsIE1BVF9GSVJTVF9GSUVMRCk7CisgICAgYXZpb193OChwYiwgNCk7CisgICAgYXZpb193YjMyKHBiLCAwKTsKKworICAgIC8qIGxhc3QgZmllbGQgKi8KKyAgICBhdmlvX3c4KHBiLCBNQVRfTEFTVF9GSUVMRCk7CisgICAgYXZpb193OChwYiwgNCk7CisgICAgYXZpb193YjMyKHBiLCBneGYtPm5iX2ZpZWxkcyk7CisKKyAgICAvKiByZXNlcnZlZCAqLworICAgIGF2aW9fdzgocGIsIE1BVF9NQVJLX0lOKTsKKyAgICBhdmlvX3c4KHBiLCA0KTsKKyAgICBhdmlvX3diMzIocGIsIDApOworCisgICAgYXZpb193OChwYiwgTUFUX01BUktfT1VUKTsKKyAgICBhdmlvX3c4KHBiLCA0KTsKKyAgICBhdmlvX3diMzIocGIsIGd4Zi0+bmJfZmllbGRzKTsKKworICAgIC8qIGVzdGltYXRlZCBzaXplICovCisgICAgYXZpb193OChwYiwgTUFUX1NJWkUpOworICAgIGF2aW9fdzgocGIsIDQpOworICAgIGF2aW9fd2IzMihwYiwgYXZpb19zaXplKHBiKSAvIDEwMjQpOworCisgICAgcmV0dXJuIHVwZGF0ZVNpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgZ3hmX3dyaXRlX3RyYWNrX2Rlc2NyaXB0aW9uX3NlY3Rpb24oQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEdYRkNvbnRleHQgKmd4ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQ2NF90IHBvczsKKyAgICBpbnQgaTsKKworICAgIHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogc2l6ZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyArK2kpCisgICAgICAgIGd4Zl93cml0ZV90cmFja19kZXNjcmlwdGlvbihzLCBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGEsIGkpOworCisgICAgZ3hmX3dyaXRlX3RyYWNrX2Rlc2NyaXB0aW9uKHMsICZneGYtPnRpbWVjb2RlX3RyYWNrLCBzLT5uYl9zdHJlYW1zKTsKKworICAgIHJldHVybiB1cGRhdGVTaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IGd4Zl93cml0ZV9tYXBfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHJld3JpdGUpCit7CisgICAgR1hGQ29udGV4dCAqZ3hmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgIGlmICghcmV3cml0ZSkgeworICAgICAgICBpZiAoIShneGYtPm1hcF9vZmZzZXRzX25iICUgMzApKSB7CisgICAgICAgICAgICBpbnQgZXJyOworICAgICAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcF9hcnJheSgmZ3hmLT5tYXBfb2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3hmLT5tYXBfb2Zmc2V0c19uYiArIDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmd4Zi0+bWFwX29mZnNldHMpKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZ3hmLT5tYXBfb2Zmc2V0c19uYiA9IDA7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCByZWFsbG9jIG1hcCBvZmZzZXRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGd4Zi0+bWFwX29mZnNldHNbZ3hmLT5tYXBfb2Zmc2V0c19uYisrXSA9IHBvczsgLy8gZG8gbm90IGluY3JlbWVudCBoZXJlCisgICAgfQorCisgICAgZ3hmX3dyaXRlX3BhY2tldF9oZWFkZXIocGIsIFBLVF9NQVApOworCisgICAgLyogcHJlYW1ibGUgKi8KKyAgICBhdmlvX3c4KHBiLCAweEUwKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fdzgocGIsIDB4RkYpOyAvKiByZXNlcnZlZCAqLworCisgICAgZ3hmX3dyaXRlX21hdGVyaWFsX2RhdGFfc2VjdGlvbihzKTsKKyAgICBneGZfd3JpdGVfdHJhY2tfZGVzY3JpcHRpb25fc2VjdGlvbihzKTsKKworICAgIHJldHVybiB1cGRhdGVQYWNrZXRTaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IGd4Zl93cml0ZV9mbHRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBHWEZDb250ZXh0ICpneGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBmaWVsZHNfcGVyX2ZsdCA9IChneGYtPm5iX2ZpZWxkcysxKSAvIDEwMDAgKyAxOworICAgIGludCBmbHRfZW50cmllcyA9IGd4Zi0+bmJfZmllbGRzIC8gZmllbGRzX3Blcl9mbHQ7CisgICAgaW50IGkgPSAwOworCisgICAgZ3hmX3dyaXRlX3BhY2tldF9oZWFkZXIocGIsIFBLVF9GTFQpOworCisgICAgYXZpb193bDMyKHBiLCBmaWVsZHNfcGVyX2ZsdCk7IC8qIG51bWJlciBvZiBmaWVsZHMgKi8KKyAgICBhdmlvX3dsMzIocGIsIGZsdF9lbnRyaWVzKTsgLyogbnVtYmVyIG9mIGFjdGl2ZSBmbHQgZW50cmllcyAqLworCisgICAgaWYgKGd4Zi0+Zmx0X2VudHJpZXMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZsdF9lbnRyaWVzOyBpKyspCisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGd4Zi0+Zmx0X2VudHJpZXNbKGkqZmllbGRzX3Blcl9mbHQpPj4xXSk7CisgICAgfQorCisgICAgZm9yICg7IGkgPCAxMDAwOyBpKyspCisgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisKKyAgICByZXR1cm4gdXBkYXRlUGFja2V0U2l6ZShwYiwgcG9zKTsKK30KKworc3RhdGljIGludCBneGZfd3JpdGVfdW1mX21hdGVyaWFsX2Rlc2NyaXB0aW9uKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBHWEZDb250ZXh0ICpneGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHRpbWVjb2RlX2Jhc2UgPSBneGYtPnRpbWVfYmFzZS5kZW4gPT0gNjAwMDAgPyA2MCA6IDUwOworICAgIGludDY0X3QgdGltZXN0YW1wID0gMDsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdDsKKyAgICB1aW50NjRfdCBuYl9maWVsZHM7CisgICAgdWludDMyX3QgdGltZWNvZGVfaW47IC8vIHRpbWVjb2RlIGF0IG1hcmsgaW4KKyAgICB1aW50MzJfdCB0aW1lY29kZV9vdXQ7IC8vIHRpbWVjb2RlIGF0IG1hcmsgb3V0CisKKyAgICBpZiAodCA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiY3JlYXRpb25fdGltZSIsIE5VTEwsIDApKQorICAgICAgICB0aW1lc3RhbXAgPSBmZl9pc284NjAxX3RvX3VuaXhfdGltZSh0LT52YWx1ZSk7CisKKyAgICB0aW1lY29kZV9pbiA9IEdYRl9USU1FQ09ERShneGYtPnRjLmNvbG9yLCBneGYtPnRjLmRyb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3hmLT50Yy5oaCwgZ3hmLT50Yy5tbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneGYtPnRjLnNzLCBneGYtPnRjLmZmKTsKKworICAgIG5iX2ZpZWxkcyA9IGd4Zi0+bmJfZmllbGRzICsKKyAgICAgICAgICAgICAgICBneGYtPnRjLmhoICogKHRpbWVjb2RlX2Jhc2UgKiAzNjAwKSArCisgICAgICAgICAgICAgICAgZ3hmLT50Yy5tbSAqICh0aW1lY29kZV9iYXNlICogNjApICAgKworICAgICAgICAgICAgICAgIGd4Zi0+dGMuc3MgKiB0aW1lY29kZV9iYXNlICAgICAgICAgICsKKyAgICAgICAgICAgICAgICBneGYtPnRjLmZmOworCisgICAgdGltZWNvZGVfb3V0ID0gR1hGX1RJTUVDT0RFKGd4Zi0+dGMuY29sb3IsIGd4Zi0+dGMuZHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfZmllbGRzIC8gKHRpbWVjb2RlX2Jhc2UgKiAzNjAwKSAlIDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9maWVsZHMgLyAodGltZWNvZGVfYmFzZSAqIDYwKSAgICUgNjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX2ZpZWxkcyAvICB0aW1lY29kZV9iYXNlICUgNjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX2ZpZWxkcyAlICB0aW1lY29kZV9iYXNlKTsKKworICAgIGF2aW9fd2wzMihwYiwgZ3hmLT5mbGFncyk7CisgICAgYXZpb193bDMyKHBiLCBneGYtPm5iX2ZpZWxkcyk7IC8qIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCB0cmFjayAqLworICAgIGF2aW9fd2wzMihwYiwgZ3hmLT5uYl9maWVsZHMpOyAvKiBsZW5ndGggb2YgdGhlIHNob3J0ZXN0IHRyYWNrICovCisgICAgYXZpb193bDMyKHBiLCAwKTsgLyogbWFyayBpbiAqLworICAgIGF2aW9fd2wzMihwYiwgZ3hmLT5uYl9maWVsZHMpOyAvKiBtYXJrIG91dCAqLworICAgIGF2aW9fd2wzMihwYiwgdGltZWNvZGVfaW4pOyAvKiB0aW1lY29kZSBtYXJrIGluICovCisgICAgYXZpb193bDMyKHBiLCB0aW1lY29kZV9vdXQpOyAvKiB0aW1lY29kZSBtYXJrIG91dCAqLworICAgIGF2aW9fd2w2NChwYiwgdGltZXN0YW1wKTsgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi8KKyAgICBhdmlvX3dsNjQocGIsIHRpbWVzdGFtcCk7IC8qIGNyZWF0aW9uIHRpbWUgKi8KKyAgICBhdmlvX3dsMTYocGIsIDApOyAvKiByZXNlcnZlZCAqLworICAgIGF2aW9fd2wxNihwYiwgMCk7IC8qIHJlc2VydmVkICovCisgICAgYXZpb193bDE2KHBiLCBneGYtPmF1ZGlvX3RyYWNrcyk7CisgICAgYXZpb193bDE2KHBiLCAxKTsgLyogdGltZWNvZGUgdHJhY2sgY291bnQgKi8KKyAgICBhdmlvX3dsMTYocGIsIDApOyAvKiByZXNlcnZlZCAqLworICAgIGF2aW9fd2wxNihwYiwgZ3hmLT5tcGVnX3RyYWNrcyk7CisgICAgcmV0dXJuIDQ4OworfQorCitzdGF0aWMgaW50IGd4Zl93cml0ZV91bWZfcGF5bG9hZChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgR1hGQ29udGV4dCAqZ3hmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworCisgICAgYXZpb193bDMyKHBiLCBneGYtPnVtZl9sZW5ndGgpOyAvKiB0b3RhbCBsZW5ndGggb2YgdGhlIHVtZiBkYXRhICovCisgICAgYXZpb193bDMyKHBiLCAzKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fd2wzMihwYiwgcy0+bmJfc3RyZWFtcysxKTsKKyAgICBhdmlvX3dsMzIocGIsIGd4Zi0+dW1mX3RyYWNrX29mZnNldCk7IC8qIHVtZiB0cmFjayBzZWN0aW9uIG9mZnNldCAqLworICAgIGF2aW9fd2wzMihwYiwgZ3hmLT51bWZfdHJhY2tfc2l6ZSk7CisgICAgYXZpb193bDMyKHBiLCBzLT5uYl9zdHJlYW1zKzEpOworICAgIGF2aW9fd2wzMihwYiwgZ3hmLT51bWZfbWVkaWFfb2Zmc2V0KTsKKyAgICBhdmlvX3dsMzIocGIsIGd4Zi0+dW1mX21lZGlhX3NpemUpOworICAgIGF2aW9fd2wzMihwYiwgZ3hmLT51bWZfbGVuZ3RoKTsgLyogdXNlciBkYXRhIG9mZnNldCAqLworICAgIGF2aW9fd2wzMihwYiwgMCk7IC8qIHVzZXIgZGF0YSBzaXplICovCisgICAgYXZpb193bDMyKHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBhdmlvX3dsMzIocGIsIDApOyAvKiByZXNlcnZlZCAqLworICAgIHJldHVybiA0ODsKK30KKworc3RhdGljIGludCBneGZfd3JpdGVfdW1mX3RyYWNrX2Rlc2NyaXB0aW9uKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBHWEZDb250ZXh0ICpneGYgPSBzLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBpOworCisgICAgZ3hmLT51bWZfdHJhY2tfb2Zmc2V0ID0gcG9zIC0gZ3hmLT51bWZfc3RhcnRfb2Zmc2V0OworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyArK2kpIHsKKyAgICAgICAgR1hGU3RyZWFtQ29udGV4dCAqc2MgPSBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGE7CisgICAgICAgIGF2aW9fd2wxNihwYiwgc2MtPm1lZGlhX2luZm8pOworICAgICAgICBhdmlvX3dsMTYocGIsIDEpOworICAgIH0KKworICAgIGF2aW9fd2wxNihwYiwgZ3hmLT50aW1lY29kZV90cmFjay5tZWRpYV9pbmZvKTsKKyAgICBhdmlvX3dsMTYocGIsIDEpOworCisgICAgcmV0dXJuIGF2aW9fdGVsbChwYikgLSBwb3M7Cit9CisKK3N0YXRpYyBpbnQgZ3hmX3dyaXRlX3VtZl9tZWRpYV9tcGVnKEFWSU9Db250ZXh0ICpwYiwgQVZTdHJlYW0gKnN0KQoreworICAgIEdYRlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKKworICAgIGlmIChzdC0+Y29kZWMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQKQorICAgICAgICBhdmlvX3dsMzIocGIsIDIpOworICAgIGVsc2UKKyAgICAgICAgYXZpb193bDMyKHBiLCAxKTsgLyogZGVmYXVsdCB0byA0MjAgKi8KKyAgICBhdmlvX3dsMzIocGIsIHNjLT5maXJzdF9nb3BfY2xvc2VkID09IDEpOyAvKiBjbG9zZWQgPSAxLCBvcGVuID0gMCwgdW5rbm93biA9IDI1NSAqLworICAgIGF2aW9fd2wzMihwYiwgMyk7IC8qIHRvcCA9IDEsIGJvdHRvbSA9IDIsIGZyYW1lID0gMywgdW5rbm93biA9IDAgKi8KKyAgICBhdmlvX3dsMzIocGIsIDEpOyAvKiBJIHBpY3R1cmUgcGVyIEdPUCAqLworICAgIGF2aW9fd2wzMihwYiwgc2MtPnBfcGVyX2dvcCk7CisgICAgYXZpb193bDMyKHBiLCBzYy0+Yl9wZXJfaV9vcl9wKTsKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKQorICAgICAgICBhdmlvX3dsMzIocGIsIDIpOworICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzFWSURFTykKKyAgICAgICAgYXZpb193bDMyKHBiLCAxKTsKKyAgICBlbHNlCisgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgYXZpb193bDMyKHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICByZXR1cm4gMzI7Cit9CisKK3N0YXRpYyBpbnQgZ3hmX3dyaXRlX3VtZl9tZWRpYV90aW1lY29kZShBVklPQ29udGV4dCAqcGIsIGludCBkcm9wKQoreworICAgIGF2aW9fd2wzMihwYiwgZHJvcCk7IC8qIGRyb3AgZnJhbWUgKi8KKyAgICBhdmlvX3dsMzIocGIsIDApOyAvKiByZXNlcnZlZCAqLworICAgIGF2aW9fd2wzMihwYiwgMCk7IC8qIHJlc2VydmVkICovCisgICAgYXZpb193bDMyKHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBhdmlvX3dsMzIocGIsIDApOyAvKiByZXNlcnZlZCAqLworICAgIGF2aW9fd2wzMihwYiwgMCk7IC8qIHJlc2VydmVkICovCisgICAgYXZpb193bDMyKHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBhdmlvX3dsMzIocGIsIDApOyAvKiByZXNlcnZlZCAqLworICAgIHJldHVybiAzMjsKK30KKworc3RhdGljIGludCBneGZfd3JpdGVfdW1mX21lZGlhX2R2KEFWSU9Db250ZXh0ICpwYiwgR1hGU3RyZWFtQ29udGV4dCAqc2MsIEFWU3RyZWFtICpzdCkKK3sKKyAgICBpbnQgZHZfdW1mX2RhdGEgPSAwOworCisgICAgaWYgKHN0LT5jb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFApCisgICAgICAgIGR2X3VtZl9kYXRhIHw9IDB4MjA7IC8qIG1hcmtzIGFzIERWQ0FNIGluc3RlYWQgb2YgRFZQUk8gKi8KKyAgICBhdmlvX3dsMzIocGIsIGR2X3VtZl9kYXRhKTsKKyAgICBhdmlvX3dsMzIocGIsIDApOworICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgYXZpb193bDMyKHBiLCAwKTsKKyAgICBhdmlvX3dsMzIocGIsIDApOworICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgYXZpb193bDMyKHBiLCAwKTsKKyAgICBhdmlvX3dsMzIocGIsIDApOworICAgIHJldHVybiAzMjsKK30KKworc3RhdGljIGludCBneGZfd3JpdGVfdW1mX21lZGlhX2F1ZGlvKEFWSU9Db250ZXh0ICpwYiwgR1hGU3RyZWFtQ29udGV4dCAqc2MpCit7CisgICAgYXZpb193bDY0KHBiLCBhdl9kb3VibGUyaW50KDEpKTsgLyogc291bmQgbGV2ZWwgdG8gYmVnaW4gdG8gKi8KKyAgICBhdmlvX3dsNjQocGIsIGF2X2RvdWJsZTJpbnQoMSkpOyAvKiBzb3VuZCBsZXZlbCB0byBiZWdpbiB0byAqLworICAgIGF2aW9fd2wzMihwYiwgMCk7IC8qIG51bWJlciBvZiBmaWVsZHMgb3ZlciB3aGljaCB0byByYW1wIHVwIHNvdW5kIGxldmVsICovCisgICAgYXZpb193bDMyKHBiLCAwKTsgLyogbnVtYmVyIG9mIGZpZWxkcyBvdmVyIHdoaWNoIHRvIHJhbXAgZG93biBzb3VuZCBsZXZlbCAqLworICAgIGF2aW9fd2wzMihwYiwgMCk7IC8qIHJlc2VydmVkICovCisgICAgYXZpb193bDMyKHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICByZXR1cm4gMzI7Cit9CisKK3N0YXRpYyBpbnQgZ3hmX3dyaXRlX3VtZl9tZWRpYV9kZXNjcmlwdGlvbihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgR1hGQ29udGV4dCAqZ3hmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludDY0X3QgcG9zOworICAgIGludCBpLCBqOworCisgICAgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBneGYtPnVtZl9tZWRpYV9vZmZzZXQgPSBwb3MgLSBneGYtPnVtZl9zdGFydF9vZmZzZXQ7CisgICAgZm9yIChpID0gMDsgaSA8PSBzLT5uYl9zdHJlYW1zOyArK2kpIHsKKyAgICAgICAgR1hGU3RyZWFtQ29udGV4dCAqc2M7CisgICAgICAgIGludDY0X3Qgc3RhcnRwb3MsIGN1cnBvczsKKworICAgICAgICBpZiAoaSA9PSBzLT5uYl9zdHJlYW1zKQorICAgICAgICAgICAgc2MgPSAmZ3hmLT50aW1lY29kZV90cmFjazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2MgPSBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGE7CisKKyAgICAgICAgc3RhcnRwb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBhdmlvX3dsMTYocGIsIDApOyAvKiBsZW5ndGggKi8KKyAgICAgICAgYXZpb193bDE2KHBiLCBzYy0+bWVkaWFfaW5mbyk7CisgICAgICAgIGF2aW9fd2wxNihwYiwgMCk7IC8qIHJlc2VydmVkICovCisgICAgICAgIGF2aW9fd2wxNihwYiwgMCk7IC8qIHJlc2VydmVkICovCisgICAgICAgIGF2aW9fd2wzMihwYiwgZ3hmLT5uYl9maWVsZHMpOworICAgICAgICBhdmlvX3dsMzIocGIsIDApOyAvKiBhdHRyaWJ1dGVzIHJ3LCBybyAqLworICAgICAgICBhdmlvX3dsMzIocGIsIDApOyAvKiBtYXJrIGluICovCisgICAgICAgIGF2aW9fd2wzMihwYiwgZ3hmLT5uYl9maWVsZHMpOyAvKiBtYXJrIG91dCAqLworICAgICAgICBhdmlvX3dyaXRlKHBiLCBFU19OQU1FX1BBVFRFUk4sIHN0cmxlbihFU19OQU1FX1BBVFRFUk4pKTsKKyAgICAgICAgYXZpb193YjE2KHBiLCBzYy0+bWVkaWFfaW5mbyk7CisgICAgICAgIGZvciAoaiA9IHN0cmxlbihFU19OQU1FX1BBVFRFUk4pKzI7IGogPCA4ODsgaisrKQorICAgICAgICAgICAgYXZpb193OChwYiwgMCk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgc2MtPnRyYWNrX3R5cGUpOworICAgICAgICBhdmlvX3dsMzIocGIsIHNjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgc2MtPnNhbXBsZV9zaXplKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKworICAgICAgICBpZiAoc2MgPT0gJmd4Zi0+dGltZWNvZGVfdHJhY2spCisgICAgICAgICAgICBneGZfd3JpdGVfdW1mX21lZGlhX3RpbWVjb2RlKHBiLCBneGYtPnRjLmRyb3ApOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTzoKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzJWSURFTzoKKyAgICAgICAgICAgICAgICBneGZfd3JpdGVfdW1mX21lZGlhX21wZWcocGIsIHN0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkxFOgorICAgICAgICAgICAgICAgIGd4Zl93cml0ZV91bWZfbWVkaWFfYXVkaW8ocGIsIHNjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfRFZWSURFTzoKKyAgICAgICAgICAgICAgICBneGZfd3JpdGVfdW1mX21lZGlhX2R2KHBiLCBzYywgc3QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY3VycG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgYXZpb19zZWVrKHBiLCBzdGFydHBvcywgU0VFS19TRVQpOworICAgICAgICBhdmlvX3dsMTYocGIsIGN1cnBvcyAtIHN0YXJ0cG9zKTsKKyAgICAgICAgYXZpb19zZWVrKHBiLCBjdXJwb3MsIFNFRUtfU0VUKTsKKyAgICB9CisgICAgcmV0dXJuIGF2aW9fdGVsbChwYikgLSBwb3M7Cit9CisKK3N0YXRpYyBpbnQgZ3hmX3dyaXRlX3VtZl9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEdYRkNvbnRleHQgKmd4ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICBneGZfd3JpdGVfcGFja2V0X2hlYWRlcihwYiwgUEtUX1VNRik7CisKKyAgICAvKiBwcmVhbWJsZSAqLworICAgIGF2aW9fdzgocGIsIDMpOyAvKiBmaXJzdCBhbmQgbGFzdCAob25seSkgcGFja2V0ICovCisgICAgYXZpb193YjMyKHBiLCBneGYtPnVtZl9sZW5ndGgpOyAvKiBkYXRhIGxlbmd0aCAqLworCisgICAgZ3hmLT51bWZfc3RhcnRfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKKyAgICBneGZfd3JpdGVfdW1mX3BheWxvYWQocyk7CisgICAgZ3hmX3dyaXRlX3VtZl9tYXRlcmlhbF9kZXNjcmlwdGlvbihzKTsKKyAgICBneGYtPnVtZl90cmFja19zaXplID0gZ3hmX3dyaXRlX3VtZl90cmFja19kZXNjcmlwdGlvbihzKTsKKyAgICBneGYtPnVtZl9tZWRpYV9zaXplID0gZ3hmX3dyaXRlX3VtZl9tZWRpYV9kZXNjcmlwdGlvbihzKTsKKyAgICBneGYtPnVtZl9sZW5ndGggPSBhdmlvX3RlbGwocGIpIC0gZ3hmLT51bWZfc3RhcnRfb2Zmc2V0OworICAgIHJldHVybiB1cGRhdGVQYWNrZXRTaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgY29uc3QgaW50IEdYRl9zYW1wbGVzX3Blcl9mcmFtZVtdID0geyAzMjc2OCwgMCB9OworCitzdGF0aWMgdm9pZCBneGZfaW5pdF90aW1lY29kZV90cmFjayhHWEZTdHJlYW1Db250ZXh0ICpzYywgR1hGU3RyZWFtQ29udGV4dCAqdnNjKQoreworICAgIGlmICghdnNjKQorICAgICAgICByZXR1cm47CisKKyAgICBzYy0+bWVkaWFfdHlwZSA9IHZzYy0+c2FtcGxlX3JhdGUgPT0gNjAgPyA3IDogODsKKyAgICBzYy0+c2FtcGxlX3JhdGUgPSB2c2MtPnNhbXBsZV9yYXRlOworICAgIHNjLT5tZWRpYV9pbmZvID0gKCdUJzw8OCkgfCAnMCc7CisgICAgc2MtPnRyYWNrX3R5cGUgPSAzOworICAgIHNjLT5mcmFtZV9yYXRlX2luZGV4ID0gdnNjLT5mcmFtZV9yYXRlX2luZGV4OworICAgIHNjLT5saW5lc19pbmRleCA9IHZzYy0+bGluZXNfaW5kZXg7CisgICAgc2MtPnNhbXBsZV9zaXplID0gMTY7CisgICAgc2MtPmZpZWxkcyA9IHZzYy0+ZmllbGRzOworfQorCitzdGF0aWMgaW50IGd4Zl9pbml0X3RpbWVjb2RlKEFWRm9ybWF0Q29udGV4dCAqcywgR1hGVGltZWNvZGUgKnRjLCBjb25zdCBjaGFyICp0Y3N0ciwgaW50IGZpZWxkcykKK3sKKyAgICBjaGFyIGM7CisKKyAgICBpZiAoc3NjYW5mKHRjc3RyLCAiJWQ6JWQ6JWQlYyVkIiwgJnRjLT5oaCwgJnRjLT5tbSwgJnRjLT5zcywgJmMsICZ0Yy0+ZmYpICE9IDUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuYWJsZSB0byBwYXJzZSB0aW1lY29kZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ludGF4OiBoaDptbTpzc1s6Oy5dZmZcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdGMtPmNvbG9yID0gMDsKKyAgICB0Yy0+ZHJvcCA9IGMgIT0gJzonOworCisgICAgaWYgKGZpZWxkcyA9PSAyKQorICAgICAgICB0Yy0+ZmYgPSB0Yy0+ZmYgKiAyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3hmX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgR1hGQ29udGV4dCAqZ3hmID0gcy0+cHJpdl9kYXRhOworICAgIEdYRlN0cmVhbUNvbnRleHQgKnZzYyA9IE5VTEw7CisgICAgdWludDhfdCB0cmFja3NbMjU1XSA9IHswfTsKKyAgICBpbnQgaSwgbWVkaWFfaW5mbyA9IDA7CisgICAgaW50IHJldDsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGNyID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJ0aW1lY29kZSIsIE5VTEwsIDApOworCisgICAgaWYgKCFwYi0+c2Vla2FibGUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImd4ZiBtdXhlciBkb2VzIG5vdCBzdXBwb3J0IHN0cmVhbWVkIG91dHB1dCwgcGF0Y2ggd2VsY29tZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBneGYtPmZsYWdzIHw9IDB4MDAwODAwMDA7IC8qIG1hdGVyaWFsIGlzIHNpbXBsZSBjbGlwICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7ICsraSkgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBHWEZTdHJlYW1Db250ZXh0ICpzYyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzYykpOworICAgICAgICBpZiAoIXNjKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgc3QtPnByaXZfZGF0YSA9IHNjOworCisgICAgICAgIHNjLT5tZWRpYV90eXBlID0gZmZfY29kZWNfZ2V0X3RhZyhneGZfbWVkaWFfdHlwZXMsIHN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1MxNkxFKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm9ubHkgMTYgQklUIFBDTSBMRSBhbGxvd2VkIGZvciBub3dcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICE9IDQ4MDAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm9ubHkgNDgwMDBoeiBzYW1wbGluZyByYXRlIGlzIGFsbG93ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAib25seSBtb25vIHRyYWNrcyBhcmUgYWxsb3dlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2MtPnRyYWNrX3R5cGUgPSAyOworICAgICAgICAgICAgc2MtPnNhbXBsZV9yYXRlID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgc2MtPnNhbXBsZV9zaXplID0gMTY7CisgICAgICAgICAgICBzYy0+ZnJhbWVfcmF0ZV9pbmRleCA9IC0yOworICAgICAgICAgICAgc2MtPmxpbmVzX2luZGV4ID0gLTI7CisgICAgICAgICAgICBzYy0+ZmllbGRzID0gLTI7CisgICAgICAgICAgICBneGYtPmF1ZGlvX3RyYWNrcysrOworICAgICAgICAgICAgZ3hmLT5mbGFncyB8PSAweDA0MDAwMDAwOyAvKiBhdWRpbyBpcyAxNiBiaXQgcGNtICovCisgICAgICAgICAgICBtZWRpYV9pbmZvID0gJ0EnOworICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidmlkZW8gc3RyZWFtIG11c3QgYmUgdGhlIGZpcnN0IHRyYWNrXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBGSVhNRSBjaGVjayBmcm9tIHRpbWVfYmFzZSA/ICovCisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5oZWlnaHQgPT0gNDgwIHx8IHN0LT5jb2RlYy0+aGVpZ2h0ID09IDUxMikgeyAvKiBOVFNDIG9yIE5UU0MrVkJJICovCisgICAgICAgICAgICAgICAgc2MtPmZyYW1lX3JhdGVfaW5kZXggPSA1OworICAgICAgICAgICAgICAgIHNjLT5zYW1wbGVfcmF0ZSA9IDYwOworICAgICAgICAgICAgICAgIGd4Zi0+ZmxhZ3MgfD0gMHgwMDAwMDA4MDsKKyAgICAgICAgICAgICAgICBneGYtPnRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKXsgMTAwMSwgNjAwMDAgfTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5oZWlnaHQgPT0gNTc2IHx8IHN0LT5jb2RlYy0+aGVpZ2h0ID09IDYwOCkgeyAvKiBQQUwgb3IgUEFMK1ZCSSAqLworICAgICAgICAgICAgICAgIHNjLT5mcmFtZV9yYXRlX2luZGV4ID0gNjsKKyAgICAgICAgICAgICAgICBzYy0+bWVkaWFfdHlwZSsrOworICAgICAgICAgICAgICAgIHNjLT5zYW1wbGVfcmF0ZSA9IDUwOworICAgICAgICAgICAgICAgIGd4Zi0+ZmxhZ3MgfD0gMHgwMDAwMDA0MDsKKyAgICAgICAgICAgICAgICBneGYtPnRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKXsgMSwgNTAgfTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIHZpZGVvIHJlc29sdXRpb24sICIKKyAgICAgICAgICAgICAgICAgICAgICAgImd4ZiBtdXhlciBvbmx5IGFjY2VwdHMgUEFMIG9yIE5UU0MgcmVzb2x1dGlvbnMgY3VycmVudGx5XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXRjcikKKyAgICAgICAgICAgICAgICB0Y3IgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJ0aW1lY29kZSIsIE5VTEwsIDApOworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIGd4Zi0+dGltZV9iYXNlLm51bSwgZ3hmLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgICAgIGlmIChneGZfZmluZF9saW5lc19pbmRleChzdCkgPCAwKQorICAgICAgICAgICAgICAgIHNjLT5saW5lc19pbmRleCA9IC0xOworICAgICAgICAgICAgc2MtPnNhbXBsZV9zaXplID0gc3QtPmNvZGVjLT5iaXRfcmF0ZTsKKyAgICAgICAgICAgIHNjLT5maWVsZHMgPSAyOyAvKiBpbnRlcmxhY2VkICovCisKKyAgICAgICAgICAgIHZzYyA9IHNjOworCisgICAgICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTUpQRUc6CisgICAgICAgICAgICAgICAgc2MtPnRyYWNrX3R5cGUgPSAxOworICAgICAgICAgICAgICAgIGd4Zi0+ZmxhZ3MgfD0gMHgwMDAwNDAwMDsKKyAgICAgICAgICAgICAgICBtZWRpYV9pbmZvID0gJ0onOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPOgorICAgICAgICAgICAgICAgIHNjLT50cmFja190eXBlID0gOTsKKyAgICAgICAgICAgICAgICBneGYtPm1wZWdfdHJhY2tzKys7CisgICAgICAgICAgICAgICAgbWVkaWFfaW5mbyA9ICdMJzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzJWSURFTzoKKyAgICAgICAgICAgICAgICBzYy0+Zmlyc3RfZ29wX2Nsb3NlZCA9IC0xOworICAgICAgICAgICAgICAgIHNjLT50cmFja190eXBlID0gNDsKKyAgICAgICAgICAgICAgICBneGYtPm1wZWdfdHJhY2tzKys7CisgICAgICAgICAgICAgICAgZ3hmLT5mbGFncyB8PSAweDAwMDA4MDAwOworICAgICAgICAgICAgICAgIG1lZGlhX2luZm8gPSAnTSc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0RWVklERU86CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlApIHsKKyAgICAgICAgICAgICAgICAgICAgc2MtPm1lZGlhX3R5cGUgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgc2MtPnRyYWNrX3R5cGUgPSA2OworICAgICAgICAgICAgICAgICAgICBneGYtPmZsYWdzIHw9IDB4MDAwMDIwMDA7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhX2luZm8gPSAnRSc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2MtPnRyYWNrX3R5cGUgPSA1OworICAgICAgICAgICAgICAgICAgICBneGYtPmZsYWdzIHw9IDB4MDAwMDEwMDA7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhX2luZm8gPSAnRCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidmlkZW8gY29kZWMgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIEZJWE1FIGZpcnN0IDEwIGF1ZGlvIHRyYWNrcyBhcmUgMCB0byA5IG5leHQgMjIgYXJlIEEgdG8gViAqLworICAgICAgICBzYy0+bWVkaWFfaW5mbyA9IG1lZGlhX2luZm88PDggfCAoJzAnK3RyYWNrc1ttZWRpYV9pbmZvXSsrKTsKKyAgICAgICAgc2MtPm9yZGVyID0gcy0+bmJfc3RyZWFtcyAtIHN0LT5pbmRleDsKKyAgICB9CisKKyAgICBpZiAoZmZfYXVkaW9faW50ZXJsZWF2ZV9pbml0KHMsIEdYRl9zYW1wbGVzX3Blcl9mcmFtZSwgKEFWUmF0aW9uYWwpeyAxLCA0ODAwMCB9KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICh0Y3IgJiYgdnNjKQorICAgICAgICBneGZfaW5pdF90aW1lY29kZShzLCAmZ3hmLT50YywgdGNyLT52YWx1ZSwgdnNjLT5maWVsZHMpOworCisgICAgZ3hmX2luaXRfdGltZWNvZGVfdHJhY2soJmd4Zi0+dGltZWNvZGVfdHJhY2ssIHZzYyk7CisgICAgZ3hmLT5mbGFncyB8PSAweDIwMDAwMDsgLy8gdGltZSBjb2RlIHRyYWNrIGlzIG5vbi1kcm9wIGZyYW1lCisKKyAgICBpZiAoKHJldCA9IGd4Zl93cml0ZV9tYXBfcGFja2V0KHMsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZ3hmX3dyaXRlX2ZsdF9wYWNrZXQocyk7CisgICAgZ3hmX3dyaXRlX3VtZl9wYWNrZXQocyk7CisKKyAgICBneGYtPnBhY2tldF9jb3VudCA9IDM7CisKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBneGZfd3JpdGVfZW9zX3BhY2tldChBVklPQ29udGV4dCAqcGIpCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgZ3hmX3dyaXRlX3BhY2tldF9oZWFkZXIocGIsIFBLVF9FT1MpOworICAgIHJldHVybiB1cGRhdGVQYWNrZXRTaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IGd4Zl93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBHWEZDb250ZXh0ICpneGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50NjRfdCBlbmQ7CisgICAgaW50IGk7CisgICAgaW50IHJldDsKKworICAgIGZmX2F1ZGlvX2ludGVybGVhdmVfY2xvc2Uocyk7CisKKyAgICBneGZfd3JpdGVfZW9zX3BhY2tldChwYik7CisgICAgZW5kID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3NlZWsocGIsIDAsIFNFRUtfU0VUKTsKKyAgICAvKiBvdmVyd3JpdGUgbWFwLCBmbHQgYW5kIHVtZiBwYWNrZXRzIHdpdGggbmV3IHZhbHVlcyAqLworICAgIGlmICgocmV0ID0gZ3hmX3dyaXRlX21hcF9wYWNrZXQocywgMSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBneGZfd3JpdGVfZmx0X3BhY2tldChzKTsKKyAgICBneGZfd3JpdGVfdW1mX3BhY2tldChzKTsKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKyAgICAvKiB1cGRhdGUgZHVyYXRpb24gaW4gYWxsIG1hcCBwYWNrZXRzICovCisgICAgZm9yIChpID0gMTsgaSA8IGd4Zi0+bWFwX29mZnNldHNfbmI7IGkrKykgeworICAgICAgICBhdmlvX3NlZWsocGIsIGd4Zi0+bWFwX29mZnNldHNbaV0sIFNFRUtfU0VUKTsKKyAgICAgICAgaWYgKChyZXQgPSBneGZfd3JpdGVfbWFwX3BhY2tldChzLCAxKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYXZpb19mbHVzaChwYik7CisgICAgfQorCisgICAgYXZpb19zZWVrKHBiLCBlbmQsIFNFRUtfU0VUKTsKKworICAgIGF2X2ZyZWVwKCZneGYtPmZsdF9lbnRyaWVzKTsKKyAgICBhdl9mcmVlcCgmZ3hmLT5tYXBfb2Zmc2V0cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBneGZfcGFyc2VfbXBlZ19mcmFtZShHWEZTdHJlYW1Db250ZXh0ICpzYywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICB1aW50MzJfdCBjPS0xOworICAgIGludCBpOworICAgIGZvcihpPTA7IGk8c2l6ZS00ICYmIGMhPTB4MTAwOyBpKyspeworICAgICAgICBjID0gKGM8PDgpICsgYnVmW2ldOworICAgICAgICBpZihjID09IDB4MUI4ICYmIHNjLT5maXJzdF9nb3BfY2xvc2VkID09IC0xKSAvKiBHT1Agc3RhcnQgY29kZSAqLworICAgICAgICAgICAgc2MtPmZpcnN0X2dvcF9jbG9zZWQ9IChidWZbaSs0XT4+NikmMTsKKyAgICB9CisgICAgcmV0dXJuIChidWZbaSsxXT4+MykmNzsKK30KKworc3RhdGljIGludCBneGZfd3JpdGVfbWVkaWFfcHJlYW1ibGUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LCBpbnQgc2l6ZSkKK3sKKyAgICBHWEZDb250ZXh0ICpneGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgR1hGU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOworICAgIHVuc2lnbmVkIGZpZWxkX25iOworICAgIC8qIElmIHRoZSB2aWRlbyBpcyBmcmFtZS1lbmNvZGVkLCB0aGUgZnJhbWUgbnVtYmVycyBzaGFsbCBiZSByZXByZXNlbnRlZCBieQorICAgICAqIGV2ZW4gZmllbGQgbnVtYmVycy4KKyAgICAgKiBzZWUgU01QVEUzNjBNLTIwMDQgIDYuNC4yLjEuMyBNZWRpYSBmaWVsZCBudW1iZXIgKi8KKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBmaWVsZF9uYiA9IGd4Zi0+bmJfZmllbGRzOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpZWxkX25iID0gYXZfcmVzY2FsZV9ybmQocGt0LT5kdHMsIGd4Zi0+dGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCk0ODAwMCpneGYtPnRpbWVfYmFzZS5udW0sIEFWX1JPVU5EX1VQKTsKKyAgICB9CisKKyAgICBhdmlvX3c4KHBiLCBzYy0+bWVkaWFfdHlwZSk7CisgICAgYXZpb193OChwYiwgc3QtPmluZGV4KTsKKyAgICBhdmlvX3diMzIocGIsIGZpZWxkX25iKTsKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBhdmlvX3diMTYocGIsIDApOworICAgICAgICBhdmlvX3diMTYocGIsIHNpemUgLyAyKTsKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykgeworICAgICAgICBpbnQgZnJhbWVfdHlwZSA9IGd4Zl9wYXJzZV9tcGVnX2ZyYW1lKHNjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgICAgIGlmIChmcmFtZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCAweDBkKTsKKyAgICAgICAgICAgIHNjLT5pZnJhbWVzKys7CisgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICAgICAgYXZpb193OChwYiwgMHgwZik7CisgICAgICAgICAgICBzYy0+YmZyYW1lcysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZpb193OChwYiwgMHgwZSk7CisgICAgICAgICAgICBzYy0+cGZyYW1lcysrOworICAgICAgICB9CisgICAgICAgIGF2aW9fd2IyNChwYiwgc2l6ZSk7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8pIHsKKyAgICAgICAgYXZpb193OChwYiwgc2l6ZSAvIDQwOTYpOworICAgICAgICBhdmlvX3diMjQocGIsIDApOworICAgIH0gZWxzZQorICAgICAgICBhdmlvX3diMzIocGIsIHNpemUpOworICAgIGF2aW9fd2IzMihwYiwgZmllbGRfbmIpOworICAgIGF2aW9fdzgocGIsIDEpOyAvKiBmbGFncyAqLworICAgIGF2aW9fdzgocGIsIDApOyAvKiByZXNlcnZlZCAqLworICAgIHJldHVybiAxNjsKK30KKworc3RhdGljIGludCBneGZfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBHWEZDb250ZXh0ICpneGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBwYWRkaW5nID0gMDsKKyAgICB1bnNpZ25lZCBwYWNrZXRfc3RhcnRfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKSAvIDEwMjQ7CisgICAgaW50IHJldDsKKworICAgIGd4Zl93cml0ZV9wYWNrZXRfaGVhZGVyKHBiLCBQS1RfTUVESUEpOworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYgcGt0LT5zaXplICUgNCkgLyogTVBFRy0yIGZyYW1lcyBtdXN0IGJlIHBhZGRlZCAqLworICAgICAgICBwYWRkaW5nID0gNCAtIHBrdC0+c2l6ZSAlIDQ7CisgICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgcGFkZGluZyA9IEdYRl9BVURJT19QQUNLRVRfU0laRSAtIHBrdC0+c2l6ZTsKKyAgICBneGZfd3JpdGVfbWVkaWFfcHJlYW1ibGUocywgcGt0LCBwa3QtPnNpemUgKyBwYWRkaW5nKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgZ3hmX3dyaXRlX3BhZGRpbmcocGIsIHBhZGRpbmcpOworCisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgaWYgKCEoZ3hmLT5mbHRfZW50cmllc19uYiAlIDUwMCkpIHsKKyAgICAgICAgICAgIGludCBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwX2FycmF5KCZneGYtPmZsdF9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneGYtPmZsdF9lbnRyaWVzX25iICsgNTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmd4Zi0+Zmx0X2VudHJpZXMpKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZ3hmLT5mbHRfZW50cmllc19uYiA9IDA7CisgICAgICAgICAgICAgICAgZ3hmLT5uYl9maWVsZHMgPSAwOworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgcmVhbGxvY2F0ZSBmbHQgZW50cmllc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBneGYtPmZsdF9lbnRyaWVzW2d4Zi0+Zmx0X2VudHJpZXNfbmIrK10gPSBwYWNrZXRfc3RhcnRfb2Zmc2V0OworICAgICAgICBneGYtPm5iX2ZpZWxkcyArPSAyOyAvLyBjb3VudCBmaWVsZHMKKyAgICB9CisKKyAgICB1cGRhdGVQYWNrZXRTaXplKHBiLCBwb3MpOworCisgICAgZ3hmLT5wYWNrZXRfY291bnQrKzsKKyAgICBpZiAoZ3hmLT5wYWNrZXRfY291bnQgPT0gMTAwKSB7CisgICAgICAgIGlmICgocmV0ID0gZ3hmX3dyaXRlX21hcF9wYWNrZXQocywgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGd4Zi0+cGFja2V0X2NvdW50ID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBneGZfY29tcGFyZV9maWVsZF9uYihBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpuZXh0LCBBVlBhY2tldCAqY3VyKQoreworICAgIEdYRkNvbnRleHQgKmd4ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlBhY2tldCAqcGt0WzJdID0geyBjdXIsIG5leHQgfTsKKyAgICBpbnQgaSwgZmllbGRfbmJbMl07CisgICAgR1hGU3RyZWFtQ29udGV4dCAqc2NbMl07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0W2ldLT5zdHJlYW1faW5kZXhdOworICAgICAgICBzY1tpXSA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBmaWVsZF9uYltpXSA9IGF2X3Jlc2NhbGVfcm5kKHBrdFtpXS0+ZHRzLCBneGYtPnRpbWVfYmFzZS5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KTQ4MDAwKmd4Zi0+dGltZV9iYXNlLm51bSwgQVZfUk9VTkRfVVApOworICAgICAgICAgICAgZmllbGRfbmJbaV0gJj0gfjE7IC8vIGNvbXBhcmUgYWdhaW5zdCBldmVuIGZpZWxkIG51bWJlciBiZWNhdXNlIGF1ZGlvIG11c3QgYmUgYmVmb3JlIHZpZGVvCisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZmllbGRfbmJbaV0gPSBwa3RbaV0tPmR0czsgLy8gZHRzIGFyZSBmaWVsZCBiYXNlZAorICAgIH0KKworICAgIHJldHVybiBmaWVsZF9uYlsxXSA+IGZpZWxkX25iWzBdIHx8CisgICAgICAgIChmaWVsZF9uYlsxXSA9PSBmaWVsZF9uYlswXSAmJiBzY1sxXS0+b3JkZXIgPiBzY1swXS0+b3JkZXIpOworfQorCitzdGF0aWMgaW50IGd4Zl9pbnRlcmxlYXZlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpvdXQsIEFWUGFja2V0ICpwa3QsIGludCBmbHVzaCkKK3sKKyAgICBpZiAocGt0ICYmIHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIHBrdC0+ZHVyYXRpb24gPSAyOyAvLyBlbmZvcmNlIDIgZmllbGRzCisgICAgcmV0dXJuIGZmX2F1ZGlvX3JlY2h1bmtfaW50ZXJsZWF2ZShzLCBvdXQsIHBrdCwgZmx1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaW50ZXJsZWF2ZV9wYWNrZXRfcGVyX2R0cywgZ3hmX2NvbXBhcmVfZmllbGRfbmIpOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9neGZfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImd4ZiIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdYRiAoR2VuZXJhbCBlWGNoYW5nZSBGb3JtYXQpIiksCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gImd4ZiIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKEdYRkNvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRSwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGd4Zl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gZ3hmX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBneGZfd3JpdGVfdHJhaWxlciwKKyAgICAuaW50ZXJsZWF2ZV9wYWNrZXQgPSBneGZfaW50ZXJsZWF2ZV9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2gyNjFkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9oMjYxZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkNjgyMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9oMjYxZGVjLmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIFJBVyBILjI2MSB2aWRlbyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJhd2RlYy5oIgorCitzdGF0aWMgaW50IGgyNjFfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IGk7CisgICAgaW50IHZhbGlkX3BzYz0wOworICAgIGludCBpbnZhbGlkX3BzYz0wOworICAgIGludCBuZXh0X2duPTA7CisgICAgaW50IHNyY19mbXQ9MDsKKworICAgIGZvcihpPTA7IGk8cC0+YnVmX3NpemU7IGkrKyl7CisgICAgICAgIGlmICgoQVZfUkIxNigmcC0+YnVmW2ldKSAtIDEpIDwgMHhGRlUpIHsKKyAgICAgICAgICAgIGludCBzaGlmdCA9IGF2X2xvZzJfMTZiaXQocC0+YnVmW2krMV0pOworICAgICAgICAgICAgdWludDMyX3QgY29kZSA9IEFWX1JCNjQoJnAtPmJ1ZltGRk1BWChpLTEsIDApXSkgPj4gKDI0K3NoaWZ0KTsKKyAgICAgICAgICAgIGlmICgoY29kZSAmIDB4ZmZmZjAwMDApID09IDB4MTAwMDApIHsKKyAgICAgICAgICAgICAgICBpbnQgZ249IChjb2RlPj4xMikmMHhmOworICAgICAgICAgICAgICAgIGlmKCFnbikKKyAgICAgICAgICAgICAgICAgICAgc3JjX2ZtdD0gY29kZSY4OworICAgICAgICAgICAgICAgIGlmKGduICE9IG5leHRfZ24pIGludmFsaWRfcHNjKys7CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgdmFsaWRfcHNjKys7CisKKyAgICAgICAgICAgICAgICBpZihzcmNfZm10KXsgLy8gQ0lGCisgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbHV0WzE2XT17MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMCwxNiwxNiwxNn07CisgICAgICAgICAgICAgICAgICAgIG5leHRfZ24gPSBsdXRbZ25dOworICAgICAgICAgICAgICAgIH1lbHNleyAgICAgICAvL1FDSUYKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBsdXRbMTZdPXsxLDMsMTYsNSwxNiwwLDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2fTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dF9nbiA9IGx1dFtnbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmKHZhbGlkX3BzYyA+IDIqaW52YWxpZF9wc2MgKyA2KXsKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworICAgIH1lbHNlIGlmKHZhbGlkX3BzYyA+IDIqaW52YWxpZF9wc2MgKyAyKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLyAyOworICAgIHJldHVybiAwOworfQorCitGRl9ERUZfUkFXVklERU9fREVNVVhFUihoMjYxLCAicmF3IEguMjYxIiwgaDI2MV9wcm9iZSwgImgyNjEiLCBBVl9DT0RFQ19JRF9IMjYxKQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2gyNjNkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9oMjYzZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1ZmI4NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9oMjYzZGVjLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIFJBVyBILjI2MyB2aWRlbyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicmF3ZGVjLmgiCisKK3N0YXRpYyBpbnQgaDI2M19wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICB1aW50NjRfdCBjb2RlPSAtMTsKKyAgICBpbnQgaTsKKyAgICBpbnQgdmFsaWRfcHNjPTA7CisgICAgaW50IGludmFsaWRfcHNjPTA7CisgICAgaW50IHJlc19jaGFuZ2U9MDsKKyAgICBpbnQgc3JjX2ZtdCwgbGFzdF9zcmNfZm10PS0xOworICAgIGludCBsYXN0X2duPTA7CisgICAgaW50IHRyLCBsYXN0X3RyID0gLTE7CisKKyAgICBmb3IoaT0wOyBpPHAtPmJ1Zl9zaXplOyBpKyspeworICAgICAgICBjb2RlID0gKGNvZGU8PDgpICsgcC0+YnVmW2ldOworICAgICAgICBpZiAoKGNvZGUgJiAweGZmZmZmYzAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgdHIgPSAoY29kZSA+PiAxOCkgJiAweEZGOworICAgICAgICAgICAgc3JjX2ZtdD0gKGNvZGU+PjEwKSY3OworICAgICAgICAgICAgaWYoICAgc3JjX2ZtdCAhPSBsYXN0X3NyY19mbXQKKyAgICAgICAgICAgICAgICYmIGxhc3Rfc3JjX2ZtdD4wICYmIGxhc3Rfc3JjX2ZtdDw2CisgICAgICAgICAgICAgICAmJiBzcmNfZm10PDYpCisgICAgICAgICAgICAgICAgcmVzX2NoYW5nZSsrOworCisgICAgICAgICAgICBpZiAodHIgPT0gbGFzdF90cikgeworICAgICAgICAgICAgICAgIGludmFsaWRfcHNjKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzcmNfZm10ICE9IDcgJiYgIShjb2RlJigxPDw5KSkgJiYgKGNvZGUmKDE8PDUpKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRfcHNjKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKChjb2RlJjB4MzAwMDApPT0weDIwMDAwICYmIHNyY19mbXQpeworICAgICAgICAgICAgICAgIHZhbGlkX3BzYysrOworICAgICAgICAgICAgICAgIGxhc3RfZ249MDsKKyAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgaW52YWxpZF9wc2MrKzsKKyAgICAgICAgICAgIGxhc3Rfc3JjX2ZtdD0gc3JjX2ZtdDsKKyAgICAgICAgICAgIGxhc3RfdHIgPSB0cjsKKyAgICAgICAgfSBlbHNlIGlmKChjb2RlICYgMHhmZmZmODAwMDAwMDApID09IDB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgIGludCBnbj0gKGNvZGU+PigzMS01KSkgJiAweDFGOworICAgICAgICAgICAgaWYoZ248bGFzdF9nbil7CisgICAgICAgICAgICAgICAgaW52YWxpZF9wc2MrKzsKKyAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgbGFzdF9nbj0gZ247CisgICAgICAgIH0KKyAgICB9CisgICAgaWYodmFsaWRfcHNjID4gMippbnZhbGlkX3BzYyArIDIqcmVzX2NoYW5nZSArIDMpeworICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047CisgICAgfWVsc2UgaWYodmFsaWRfcHNjID4gMippbnZhbGlkX3BzYykKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIC8gMjsKKyAgICByZXR1cm4gMDsKK30KKworRkZfREVGX1JBV1ZJREVPX0RFTVVYRVIoaDI2MywgInJhdyBILjI2MyIsIGgyNjNfcHJvYmUsIE5VTEwsIEFWX0NPREVDX0lEX0gyNjMpCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaDI2NGRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2gyNjRkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA3M2RkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2gyNjRkZWMuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogUkFXIEguMjY0IHZpZGVvIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJyYXdkZWMuaCIKKworc3RhdGljIGludCBoMjY0X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIHVpbnQzMl90IGNvZGUgPSAtMTsKKyAgICBpbnQgc3BzID0gMCwgcHBzID0gMCwgaWRyID0gMCwgcmVzID0gMCwgc2xpID0gMDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwLT5idWZfc2l6ZTsgaSsrKSB7CisgICAgICAgIGNvZGUgPSAoY29kZSA8PCA4KSArIHAtPmJ1ZltpXTsKKyAgICAgICAgaWYgKChjb2RlICYgMHhmZmZmZmYwMCkgPT0gMHgxMDApIHsKKyAgICAgICAgICAgIGludCByZWZfaWRjID0gKGNvZGUgPj4gNSkgJiAzOworICAgICAgICAgICAgaW50IHR5cGUgICAgPSBjb2RlICYgMHgxRjsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgcmVmX3plcm9bXSA9IHsKKyAgICAgICAgICAgICAgICAgMiwgIDAsICAwLCAgMCwgIDAsIC0xLCAgMSwgLTEsCisgICAgICAgICAgICAgICAgLTEsICAxLCAgMSwgIDEsICAxLCAtMSwgIDIsICAyLAorICAgICAgICAgICAgICAgICAyLCAgMiwgIDIsICAwLCAgMiwgIDIsICAyLCAgMiwKKyAgICAgICAgICAgICAgICAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGlmIChjb2RlICYgMHg4MCkgLy8gZm9yYmlkZGVuX2JpdAorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICBpZiAocmVmX3plcm9bdHlwZV0gPT0gMSAmJiByZWZfaWRjKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKHJlZl96ZXJvW3R5cGVdID09IC0xICYmICFyZWZfaWRjKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKHJlZl96ZXJvW3R5cGVdID09IDIpCisgICAgICAgICAgICAgICAgcmVzKys7CisKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHNsaSsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIGlkcisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIGlmIChwLT5idWZbaSArIDJdICYgMHgwMykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgc3BzKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgcHBzKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3BzICYmIHBwcyAmJiAoaWRyIHx8IHNsaSA+IDMpICYmIHJlcyA8IChzcHMgKyBwcHMgKyBpZHIpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAxOyAgLy8gMSBtb3JlIHRoYW4gLm1wZworCisgICAgcmV0dXJuIDA7Cit9CisKK0ZGX0RFRl9SQVdWSURFT19ERU1VWEVSKGgyNjQsICJyYXcgSC4yNjQgdmlkZW8iLCBoMjY0X3Byb2JlLCAiaDI2bCxoMjY0LDI2NCxhdmMiLCBBVl9DT0RFQ19JRF9IMjY0KQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2hkc2VuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2hkc2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDdjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaGRzZW5jLmMKQEAgLTAsMCArMSw1OTcgQEAKKy8qCisgKiBMaXZlIEhEUyBmcmFnbWVudGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAib3Nfc3VwcG9ydC5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jhc2U2NC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKK3R5cGVkZWYgc3RydWN0IEZyYWdtZW50IHsKKyAgICBjaGFyIGZpbGVbMTAyNF07CisgICAgaW50NjRfdCBzdGFydF90aW1lLCBkdXJhdGlvbjsKKyAgICBpbnQgbjsKK30gRnJhZ21lbnQ7CisKK3R5cGVkZWYgc3RydWN0IE91dHB1dFN0cmVhbSB7CisgICAgaW50IGJpdHJhdGU7CisgICAgaW50IGZpcnN0X3N0cmVhbTsKKyAgICBBVkZvcm1hdENvbnRleHQgKmN0eDsKKyAgICBpbnQgY3R4X2luaXRlZDsKKyAgICB1aW50OF90IGlvYnVmWzMyNzY4XTsKKyAgICBjaGFyIHRlbXBfZmlsZW5hbWVbMTAyNF07CisgICAgaW50NjRfdCBmcmFnX3N0YXJ0X3RzLCBsYXN0X3RzOworICAgIEFWSU9Db250ZXh0ICpvdXQ7CisgICAgaW50IHBhY2tldHNfd3JpdHRlbjsKKyAgICBpbnQgbmJfZnJhZ21lbnRzLCBmcmFnbWVudHNfc2l6ZSwgZnJhZ21lbnRfaW5kZXg7CisgICAgRnJhZ21lbnQgKipmcmFnbWVudHM7CisKKyAgICBpbnQgaGFzX2F1ZGlvLCBoYXNfdmlkZW87CisKKyAgICB1aW50OF90ICptZXRhZGF0YTsKKyAgICBpbnQgbWV0YWRhdGFfc2l6ZTsKKworICAgIHVpbnQ4X3QgKmV4dHJhX3BhY2tldHNbMl07CisgICAgaW50IGV4dHJhX3BhY2tldF9zaXplc1syXTsKKyAgICBpbnQgbmJfZXh0cmFfcGFja2V0czsKK30gT3V0cHV0U3RyZWFtOworCit0eXBlZGVmIHN0cnVjdCBIRFNDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsgIC8qIENsYXNzIGZvciBwcml2YXRlIG9wdGlvbnMuICovCisgICAgaW50IHdpbmRvd19zaXplOworICAgIGludCBleHRyYV93aW5kb3dfc2l6ZTsKKyAgICBpbnQgbWluX2ZyYWdfZHVyYXRpb247CisgICAgaW50IHJlbW92ZV9hdF9leGl0OworCisgICAgT3V0cHV0U3RyZWFtICpzdHJlYW1zOworICAgIGludCBuYl9zdHJlYW1zOworfSBIRFNDb250ZXh0OworCitzdGF0aWMgaW50IHBhcnNlX2hlYWRlcihPdXRwdXRTdHJlYW0gKm9zLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpZiAoYnVmX3NpemUgPCAxMykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKG1lbWNtcChidWYsICJGTFYiLCAzKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgYnVmICAgICAgKz0gMTM7CisgICAgYnVmX3NpemUgLT0gMTM7CisgICAgd2hpbGUgKGJ1Zl9zaXplID49IDExICsgNCkgeworICAgICAgICBpbnQgdHlwZSA9IGJ1ZlswXTsKKyAgICAgICAgaW50IHNpemUgPSBBVl9SQjI0KCZidWZbMV0pICsgMTEgKyA0OworICAgICAgICBpZiAoc2l6ZSA+IGJ1Zl9zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmICh0eXBlID09IDggfHwgdHlwZSA9PSA5KSB7CisgICAgICAgICAgICBpZiAob3MtPm5iX2V4dHJhX3BhY2tldHMgPj0gRkZfQVJSQVlfRUxFTVMob3MtPmV4dHJhX3BhY2tldHMpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgb3MtPmV4dHJhX3BhY2tldF9zaXplc1tvcy0+bmJfZXh0cmFfcGFja2V0c10gPSBzaXplOworICAgICAgICAgICAgb3MtPmV4dHJhX3BhY2tldHNbb3MtPm5iX2V4dHJhX3BhY2tldHNdID0gYXZfbWFsbG9jKHNpemUpOworICAgICAgICAgICAgaWYgKCFvcy0+ZXh0cmFfcGFja2V0c1tvcy0+bmJfZXh0cmFfcGFja2V0c10pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG1lbWNweShvcy0+ZXh0cmFfcGFja2V0c1tvcy0+bmJfZXh0cmFfcGFja2V0c10sIGJ1Ziwgc2l6ZSk7CisgICAgICAgICAgICBvcy0+bmJfZXh0cmFfcGFja2V0cysrOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMHgxMikgeworICAgICAgICAgICAgaWYgKG9zLT5tZXRhZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIG9zLT5tZXRhZGF0YV9zaXplID0gc2l6ZSAtIDExIC0gNDsKKyAgICAgICAgICAgIG9zLT5tZXRhZGF0YSAgICAgID0gYXZfbWFsbG9jKG9zLT5tZXRhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmICghb3MtPm1ldGFkYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBtZW1jcHkob3MtPm1ldGFkYXRhLCBidWYgKyAxMSwgb3MtPm1ldGFkYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIGJ1ZiAgICAgICs9IHNpemU7CisgICAgICAgIGJ1Zl9zaXplIC09IHNpemU7CisgICAgfQorICAgIGlmICghb3MtPm1ldGFkYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZHNfd3JpdGUodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBPdXRwdXRTdHJlYW0gKm9zID0gb3BhcXVlOworICAgIGlmIChvcy0+b3V0KSB7CisgICAgICAgIGF2aW9fd3JpdGUob3MtPm91dCwgYnVmLCBidWZfc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFvcy0+bWV0YWRhdGFfc2l6ZSkgeworICAgICAgICAgICAgaW50IHJldDsKKyAgICAgICAgICAgIC8vIEFzc3VtaW5nIHRoZSBJTyBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGZpdCB0aGUKKyAgICAgICAgICAgIC8vIEZMViBoZWFkZXIgYW5kIGFsbCBtZXRhZGF0YSBhbmQgZXh0cmFkYXRhIHBhY2tldHMKKyAgICAgICAgICAgIGlmICgocmV0ID0gcGFyc2VfaGVhZGVyKG9zLCBidWYsIGJ1Zl9zaXplKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgdm9pZCBoZHNfZnJlZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgSERTQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgajsKKyAgICBpZiAoIWMtPnN0cmVhbXMpCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIE91dHB1dFN0cmVhbSAqb3MgPSAmYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKG9zLT5vdXQpCisgICAgICAgICAgICBhdmlvX2Nsb3NlKG9zLT5vdXQpOworICAgICAgICBvcy0+b3V0ID0gTlVMTDsKKyAgICAgICAgaWYgKG9zLT5jdHggJiYgb3MtPmN0eF9pbml0ZWQpCisgICAgICAgICAgICBhdl93cml0ZV90cmFpbGVyKG9zLT5jdHgpOworICAgICAgICBpZiAob3MtPmN0eCAmJiBvcy0+Y3R4LT5wYikKKyAgICAgICAgICAgIGF2X2ZyZWUob3MtPmN0eC0+cGIpOworICAgICAgICBpZiAob3MtPmN0eCkKKyAgICAgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChvcy0+Y3R4KTsKKyAgICAgICAgYXZfZnJlZShvcy0+bWV0YWRhdGEpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3MtPm5iX2V4dHJhX3BhY2tldHM7IGorKykKKyAgICAgICAgICAgIGF2X2ZyZWUob3MtPmV4dHJhX3BhY2tldHNbal0pOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3MtPm5iX2ZyYWdtZW50czsgaisrKQorICAgICAgICAgICAgYXZfZnJlZShvcy0+ZnJhZ21lbnRzW2pdKTsKKyAgICAgICAgYXZfZnJlZShvcy0+ZnJhZ21lbnRzKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmMtPnN0cmVhbXMpOworfQorCitzdGF0aWMgaW50IHdyaXRlX21hbmlmZXN0KEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGZpbmFsKQoreworICAgIEhEU0NvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKm91dDsKKyAgICBjaGFyIGZpbGVuYW1lWzEwMjRdLCB0ZW1wX2ZpbGVuYW1lWzEwMjRdOworICAgIGludCByZXQsIGk7CisgICAgZmxvYXQgZHVyYXRpb24gPSAwOworCisgICAgaWYgKGMtPm5iX3N0cmVhbXMgPiAwKQorICAgICAgICBkdXJhdGlvbiA9IGMtPnN0cmVhbXNbMF0ubGFzdF90cyAqIGF2X3EyZChzLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UpOworCisgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcy9pbmRleC5mNG0iLCBzLT5maWxlbmFtZSk7CisgICAgc25wcmludGYodGVtcF9maWxlbmFtZSwgc2l6ZW9mKHRlbXBfZmlsZW5hbWUpLCAiJXMvaW5kZXguZjRtLnRtcCIsIHMtPmZpbGVuYW1lKTsKKyAgICByZXQgPSBhdmlvX29wZW4yKCZvdXQsIHRlbXBfZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiAlcyBmb3Igd3JpdGluZ1xuIiwgdGVtcF9maWxlbmFtZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGF2aW9fcHJpbnRmKG91dCwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxuIik7CisgICAgYXZpb19wcmludGYob3V0LCAiPG1hbmlmZXN0IHhtbG5zPVwiaHR0cDovL25zLmFkb2JlLmNvbS9mNG0vMS4wXCI+XG4iKTsKKyAgICBhdmlvX3ByaW50ZihvdXQsICJcdDxpZD4lczwvaWQ+XG4iLCBhdl9iYXNlbmFtZShzLT5maWxlbmFtZSkpOworICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0PHN0cmVhbVR5cGU+JXM8L3N0cmVhbVR5cGU+XG4iLAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgPyAicmVjb3JkZWQiIDogImxpdmUiKTsKKyAgICBhdmlvX3ByaW50ZihvdXQsICJcdDxkZWxpdmVyeVR5cGU+c3RyZWFtaW5nPC9kZWxpdmVyeVR5cGU+XG4iKTsKKyAgICBpZiAoZmluYWwpCisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0PGR1cmF0aW9uPiVmPC9kdXJhdGlvbj5cbiIsIGR1cmF0aW9uKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIE91dHB1dFN0cmVhbSAqb3MgPSAmYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaW50IGI2NF9zaXplID0gQVZfQkFTRTY0X1NJWkUob3MtPm1ldGFkYXRhX3NpemUpOworICAgICAgICBjaGFyICpiYXNlNjQgPSBhdl9tYWxsb2MoYjY0X3NpemUpOworICAgICAgICBpZiAoIWJhc2U2NCkgeworICAgICAgICAgICAgYXZpb19jbG9zZShvdXQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9iYXNlNjRfZW5jb2RlKGJhc2U2NCwgYjY0X3NpemUsIG9zLT5tZXRhZGF0YSwgb3MtPm1ldGFkYXRhX3NpemUpOworCisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0PGJvb3RzdHJhcEluZm8gcHJvZmlsZT1cIm5hbWVkXCIgdXJsPVwic3RyZWFtJWQuYWJzdFwiIGlkPVwiYm9vdHN0cmFwJWRcIiAvPlxuIiwgaSwgaSk7CisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0PG1lZGlhIGJpdHJhdGU9XCIlZFwiIHVybD1cInN0cmVhbSVkXCIgYm9vdHN0cmFwSW5mb0lkPVwiYm9vdHN0cmFwJWRcIj5cbiIsIG9zLT5iaXRyYXRlLzEwMDAsIGksIGkpOworICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcdFx0PG1ldGFkYXRhPiVzPC9tZXRhZGF0YT5cbiIsIGJhc2U2NCk7CisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0PC9tZWRpYT5cbiIpOworICAgICAgICBhdl9mcmVlKGJhc2U2NCk7CisgICAgfQorICAgIGF2aW9fcHJpbnRmKG91dCwgIjwvbWFuaWZlc3Q+XG4iKTsKKyAgICBhdmlvX2ZsdXNoKG91dCk7CisgICAgYXZpb19jbG9zZShvdXQpOworICAgIHJldHVybiBmZl9yZW5hbWUodGVtcF9maWxlbmFtZSwgZmlsZW5hbWUsIHMpOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfc2l6ZShBVklPQ29udGV4dCAqb3V0LCBpbnQ2NF90IHBvcykKK3sKKyAgICBpbnQ2NF90IGVuZCA9IGF2aW9fdGVsbChvdXQpOworICAgIGF2aW9fc2VlayhvdXQsIHBvcywgU0VFS19TRVQpOworICAgIGF2aW9fd2IzMihvdXQsIGVuZCAtIHBvcyk7CisgICAgYXZpb19zZWVrKG91dCwgZW5kLCBTRUVLX1NFVCk7Cit9CisKKy8qIE5vdGUsIHRoZSAuYWJzdCBmaWxlcyBuZWVkIHRvIGJlIHNlcnZlZCB3aXRoIHRoZSAiYmluYXJ5L29jdGV0IgorICogbWltZSB0eXBlLCBvdGhlcndpc2UgYXQgbGVhc3QgdGhlIE9TTUYgcGxheWVyIGNhbiBlYXNpbHkgZmFpbAorICogd2l0aCAic3RyZWFtIG5vdCBmb3VuZCIgd2hlbiBwb2xsaW5nIGZvciB0aGUgbmV4dCBmcmFnbWVudC4gKi8KK3N0YXRpYyBpbnQgd3JpdGVfYWJzdChBVkZvcm1hdENvbnRleHQgKnMsIE91dHB1dFN0cmVhbSAqb3MsIGludCBmaW5hbCkKK3sKKyAgICBIRFNDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpvdXQ7CisgICAgY2hhciBmaWxlbmFtZVsxMDI0XSwgdGVtcF9maWxlbmFtZVsxMDI0XTsKKyAgICBpbnQgaSwgcmV0OworICAgIGludDY0X3QgYXNydF9wb3MsIGFmcnRfcG9zOworICAgIGludCBzdGFydCA9IDAsIGZyYWdtZW50czsKKyAgICBpbnQgaW5kZXggPSBzLT5zdHJlYW1zW29zLT5maXJzdF9zdHJlYW1dLT5pZDsKKyAgICBpbnQ2NF90IGN1cl9tZWRpYV90aW1lID0gMDsKKyAgICBpZiAoYy0+d2luZG93X3NpemUpCisgICAgICAgIHN0YXJ0ID0gRkZNQVgob3MtPm5iX2ZyYWdtZW50cyAtIGMtPndpbmRvd19zaXplLCAwKTsKKyAgICBmcmFnbWVudHMgPSBvcy0+bmJfZnJhZ21lbnRzIC0gc3RhcnQ7CisgICAgaWYgKGZpbmFsKQorICAgICAgICBjdXJfbWVkaWFfdGltZSA9IG9zLT5sYXN0X3RzOworICAgIGVsc2UgaWYgKG9zLT5uYl9mcmFnbWVudHMpCisgICAgICAgIGN1cl9tZWRpYV90aW1lID0gb3MtPmZyYWdtZW50c1tvcy0+bmJfZnJhZ21lbnRzIC0gMV0tPnN0YXJ0X3RpbWU7CisKKyAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAiJXMvc3RyZWFtJWQuYWJzdCIsIHMtPmZpbGVuYW1lLCBpbmRleCk7CisgICAgc25wcmludGYodGVtcF9maWxlbmFtZSwgc2l6ZW9mKHRlbXBfZmlsZW5hbWUpLAorICAgICAgICAgICAgICIlcy9zdHJlYW0lZC5hYnN0LnRtcCIsIHMtPmZpbGVuYW1lLCBpbmRleCk7CisgICAgcmV0ID0gYXZpb19vcGVuMigmb3V0LCB0ZW1wX2ZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIG9wZW4gJXMgZm9yIHdyaXRpbmdcbiIsIHRlbXBfZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBhdmlvX3diMzIob3V0LCAwKTsgLy8gYWJzdCBzaXplCisgICAgYXZpb193bDMyKG91dCwgTUtUQUcoJ2EnLCdiJywncycsJ3QnKSk7CisgICAgYXZpb193YjMyKG91dCwgMCk7IC8vIHZlcnNpb24gKyBmbGFncworICAgIGF2aW9fd2IzMihvdXQsIG9zLT5mcmFnbWVudF9pbmRleCAtIDEpOyAvLyBCb290c3RyYXBpbmZvVmVyc2lvbgorICAgIGF2aW9fdzgob3V0LCBmaW5hbCA/IDAgOiAweDIwKTsgLy8gcHJvZmlsZSwgbGl2ZSwgdXBkYXRlCisgICAgYXZpb193YjMyKG91dCwgMTAwMCk7IC8vIHRpbWVzY2FsZQorICAgIGF2aW9fd2I2NChvdXQsIGN1cl9tZWRpYV90aW1lKTsKKyAgICBhdmlvX3diNjQob3V0LCAwKTsgLy8gU21wdGVUaW1lQ29kZU9mZnNldAorICAgIGF2aW9fdzgob3V0LCAwKTsgLy8gTW92aWVJZGVudGlmZXIgKG51bGwgc3RyaW5nKQorICAgIGF2aW9fdzgob3V0LCAwKTsgLy8gU2VydmVyRW50cnlDb3VudAorICAgIGF2aW9fdzgob3V0LCAwKTsgLy8gUXVhbGl0eUVudHJ5Q291bnQKKyAgICBhdmlvX3c4KG91dCwgMCk7IC8vIERybURhdGEgKG51bGwgc3RyaW5nKQorICAgIGF2aW9fdzgob3V0LCAwKTsgLy8gTWV0YURhdGEgKG51bGwgc3RyaW5nKQorICAgIGF2aW9fdzgob3V0LCAxKTsgLy8gU2VnbWVudFJ1blRhYmxlQ291bnQKKyAgICBhc3J0X3BvcyA9IGF2aW9fdGVsbChvdXQpOworICAgIGF2aW9fd2IzMihvdXQsIDApOyAvLyBhc3J0IHNpemUKKyAgICBhdmlvX3dsMzIob3V0LCBNS1RBRygnYScsJ3MnLCdyJywndCcpKTsKKyAgICBhdmlvX3diMzIob3V0LCAwKTsgLy8gdmVyc2lvbiArIGZsYWdzCisgICAgYXZpb193OChvdXQsIDApOyAvLyBRdWFsaXR5RW50cnlDb3VudAorICAgIGF2aW9fd2IzMihvdXQsIDEpOyAvLyBTZWdtZW50UnVuRW50cnlDb3VudAorICAgIGF2aW9fd2IzMihvdXQsIDEpOyAvLyBGaXJzdFNlZ21lbnQKKyAgICBhdmlvX3diMzIob3V0LCBmaW5hbCA/IChvcy0+ZnJhZ21lbnRfaW5kZXggLSAxKSA6IDB4ZmZmZmZmZmYpOyAvLyBGcmFnbWVudHNQZXJTZWdtZW50CisgICAgdXBkYXRlX3NpemUob3V0LCBhc3J0X3Bvcyk7CisgICAgYXZpb193OChvdXQsIDEpOyAvLyBGcmFnbWVudFJ1blRhYmxlQ291bnQKKyAgICBhZnJ0X3BvcyA9IGF2aW9fdGVsbChvdXQpOworICAgIGF2aW9fd2IzMihvdXQsIDApOyAvLyBhZnJ0IHNpemUKKyAgICBhdmlvX3dsMzIob3V0LCBNS1RBRygnYScsJ2YnLCdyJywndCcpKTsKKyAgICBhdmlvX3diMzIob3V0LCAwKTsgLy8gdmVyc2lvbiArIGZsYWdzCisgICAgYXZpb193YjMyKG91dCwgMTAwMCk7IC8vIHRpbWVzY2FsZQorICAgIGF2aW9fdzgob3V0LCAwKTsgLy8gUXVhbGl0eUVudHJ5Q291bnQKKyAgICBhdmlvX3diMzIob3V0LCBmcmFnbWVudHMpOyAvLyBGcmFnbWVudFJ1bkVudHJ5Q291bnQKKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IG9zLT5uYl9mcmFnbWVudHM7IGkrKykgeworICAgICAgICBhdmlvX3diMzIob3V0LCBvcy0+ZnJhZ21lbnRzW2ldLT5uKTsKKyAgICAgICAgYXZpb193YjY0KG91dCwgb3MtPmZyYWdtZW50c1tpXS0+c3RhcnRfdGltZSk7CisgICAgICAgIGF2aW9fd2IzMihvdXQsIG9zLT5mcmFnbWVudHNbaV0tPmR1cmF0aW9uKTsKKyAgICB9CisgICAgdXBkYXRlX3NpemUob3V0LCBhZnJ0X3Bvcyk7CisgICAgdXBkYXRlX3NpemUob3V0LCAwKTsKKyAgICBhdmlvX2Nsb3NlKG91dCk7CisgICAgcmV0dXJuIGZmX3JlbmFtZSh0ZW1wX2ZpbGVuYW1lLCBmaWxlbmFtZSwgcyk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9maWxlKEFWRm9ybWF0Q29udGV4dCAqcywgT3V0cHV0U3RyZWFtICpvcywgaW50NjRfdCBzdGFydF90cykKK3sKKyAgICBpbnQgcmV0LCBpOworICAgIHJldCA9IGF2aW9fb3BlbjIoJm9zLT5vdXQsIG9zLT50ZW1wX2ZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBhdmlvX3diMzIob3MtPm91dCwgMCk7CisgICAgYXZpb193bDMyKG9zLT5vdXQsIE1LVEFHKCdtJywnZCcsJ2EnLCd0JykpOworICAgIGZvciAoaSA9IDA7IGkgPCBvcy0+bmJfZXh0cmFfcGFja2V0czsgaSsrKSB7CisgICAgICAgIEFWX1dCMjQob3MtPmV4dHJhX3BhY2tldHNbaV0gKyA0LCBzdGFydF90cyk7CisgICAgICAgIG9zLT5leHRyYV9wYWNrZXRzW2ldWzddID0gKHN0YXJ0X3RzID4+IDI0KSAmIDB4N2Y7CisgICAgICAgIGF2aW9fd3JpdGUob3MtPm91dCwgb3MtPmV4dHJhX3BhY2tldHNbaV0sIG9zLT5leHRyYV9wYWNrZXRfc2l6ZXNbaV0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xvc2VfZmlsZShPdXRwdXRTdHJlYW0gKm9zKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKG9zLT5vdXQpOworICAgIGF2aW9fc2Vlayhvcy0+b3V0LCAwLCBTRUVLX1NFVCk7CisgICAgYXZpb193YjMyKG9zLT5vdXQsIHBvcyk7CisgICAgYXZpb19mbHVzaChvcy0+b3V0KTsKKyAgICBhdmlvX2Nsb3NlKG9zLT5vdXQpOworICAgIG9zLT5vdXQgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGhkc193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEhEU0NvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldCA9IDAsIGk7CisgICAgQVZPdXRwdXRGb3JtYXQgKm9mb3JtYXQ7CisKKyAgICBpZiAobWtkaXIocy0+ZmlsZW5hbWUsIDA3NzcpID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiAsICJGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSAlc1xuIiwgcy0+ZmlsZW5hbWUpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgb2Zvcm1hdCA9IGF2X2d1ZXNzX2Zvcm1hdCgiZmx2IiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKCFvZm9ybWF0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfTVVYRVJfTk9UX0ZPVU5EOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYy0+c3RyZWFtcyA9IGF2X21hbGxvY3pfYXJyYXkocy0+bmJfc3RyZWFtcywgc2l6ZW9mKCpjLT5zdHJlYW1zKSk7CisgICAgaWYgKCFjLT5zdHJlYW1zKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2MtPm5iX3N0cmVhbXNdOworICAgICAgICBBVkZvcm1hdENvbnRleHQgKmN0eDsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKworICAgICAgICBpZiAoIXN0LT5jb2RlYy0+Yml0X3JhdGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyBiaXQgcmF0ZSBzZXQgZm9yIHN0cmVhbSAlZFxuIiwgaSk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIGlmIChvcy0+aGFzX3ZpZGVvKSB7CisgICAgICAgICAgICAgICAgYy0+bmJfc3RyZWFtcysrOworICAgICAgICAgICAgICAgIG9zKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcy0+aGFzX3ZpZGVvID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAob3MtPmhhc19hdWRpbykgeworICAgICAgICAgICAgICAgIGMtPm5iX3N0cmVhbXMrKzsKKyAgICAgICAgICAgICAgICBvcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3MtPmhhc19hdWRpbyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgaW4gc3RyZWFtICVkXG4iLCBpKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBvcy0+Yml0cmF0ZSArPSBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Yml0X3JhdGU7CisKKyAgICAgICAgaWYgKCFvcy0+Y3R4KSB7CisgICAgICAgICAgICBvcy0+Zmlyc3Rfc3RyZWFtID0gaTsKKyAgICAgICAgICAgIGN0eCA9IGF2Zm9ybWF0X2FsbG9jX2NvbnRleHQoKTsKKyAgICAgICAgICAgIGlmICghY3R4KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9zLT5jdHggPSBjdHg7CisgICAgICAgICAgICBjdHgtPm9mb3JtYXQgPSBvZm9ybWF0OworICAgICAgICAgICAgY3R4LT5pbnRlcnJ1cHRfY2FsbGJhY2sgPSBzLT5pbnRlcnJ1cHRfY2FsbGJhY2s7CisKKyAgICAgICAgICAgIGN0eC0+cGIgPSBhdmlvX2FsbG9jX2NvbnRleHQob3MtPmlvYnVmLCBzaXplb2Yob3MtPmlvYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJT19GTEFHX1dSSVRFLCBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgaGRzX3dyaXRlLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5wYikgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdHggPSBvcy0+Y3R4OworICAgICAgICB9CisgICAgICAgIHMtPnN0cmVhbXNbaV0tPmlkID0gYy0+bmJfc3RyZWFtczsKKworICAgICAgICBpZiAoIShzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oY3R4LCBOVUxMKSkpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBhdmNvZGVjX2NvcHlfY29udGV4dChzdC0+Y29kZWMsIHMtPnN0cmVhbXNbaV0tPmNvZGVjKTsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOworICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHMtPnN0cmVhbXNbaV0tPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgIHN0LT50aW1lX2Jhc2UgPSBzLT5zdHJlYW1zW2ldLT50aW1lX2Jhc2U7CisgICAgfQorICAgIGlmIChjLT5zdHJlYW1zW2MtPm5iX3N0cmVhbXNdLmN0eCkKKyAgICAgICAgYy0+bmJfc3RyZWFtcysrOworCisgICAgZm9yIChpID0gMDsgaSA8IGMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbaV07CisgICAgICAgIGludCBqOworICAgICAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihvcy0+Y3R4LCBOVUxMKSkgPCAwKSB7CisgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIG9zLT5jdHhfaW5pdGVkID0gMTsKKyAgICAgICAgYXZpb19mbHVzaChvcy0+Y3R4LT5wYik7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBvcy0+Y3R4LT5uYl9zdHJlYW1zOyBqKyspCisgICAgICAgICAgICBzLT5zdHJlYW1zW29zLT5maXJzdF9zdHJlYW0gKyBqXS0+dGltZV9iYXNlID0gb3MtPmN0eC0+c3RyZWFtc1tqXS0+dGltZV9iYXNlOworCisgICAgICAgIHNucHJpbnRmKG9zLT50ZW1wX2ZpbGVuYW1lLCBzaXplb2Yob3MtPnRlbXBfZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAiJXMvc3RyZWFtJWRfdGVtcCIsIHMtPmZpbGVuYW1lLCBpKTsKKyAgICAgICAgcmV0ID0gaW5pdF9maWxlKHMsIG9zLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgaWYgKCFvcy0+aGFzX3ZpZGVvICYmIGMtPm1pbl9mcmFnX2R1cmF0aW9uIDw9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiTm8gdmlkZW8gc3RyZWFtIGluIG91dHB1dCBzdHJlYW0gJWQgYW5kIG5vIG1pbiBmcmFnIGR1cmF0aW9uIHNldFxuIiwgaSk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgb3MtPmZyYWdtZW50X2luZGV4ID0gMTsKKyAgICAgICAgd3JpdGVfYWJzdChzLCBvcywgMCk7CisgICAgfQorICAgIHJldCA9IHdyaXRlX21hbmlmZXN0KHMsIDApOworCitmYWlsOgorICAgIGlmIChyZXQpCisgICAgICAgIGhkc19mcmVlKHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2ZyYWdtZW50KE91dHB1dFN0cmVhbSAqb3MsIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0X3RpbWUsIGludDY0X3QgZHVyYXRpb24pCit7CisgICAgRnJhZ21lbnQgKmZyYWc7CisgICAgaWYgKGR1cmF0aW9uID09IDApCisgICAgICAgIGR1cmF0aW9uID0gMTsKKyAgICBpZiAob3MtPm5iX2ZyYWdtZW50cyA+PSBvcy0+ZnJhZ21lbnRzX3NpemUpIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgb3MtPmZyYWdtZW50c19zaXplID0gKG9zLT5mcmFnbWVudHNfc2l6ZSArIDEpICogMjsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9yZWFsbG9jcF9hcnJheSgmb3MtPmZyYWdtZW50cywgb3MtPmZyYWdtZW50c19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqb3MtPmZyYWdtZW50cykpKSA8IDApIHsKKyAgICAgICAgICAgIG9zLT5mcmFnbWVudHNfc2l6ZSA9IDA7CisgICAgICAgICAgICBvcy0+bmJfZnJhZ21lbnRzICAgPSAwOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmcmFnID0gYXZfbWFsbG9jeihzaXplb2YoKmZyYWcpKTsKKyAgICBpZiAoIWZyYWcpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZfc3RybGNweShmcmFnLT5maWxlLCBmaWxlLCBzaXplb2YoZnJhZy0+ZmlsZSkpOworICAgIGZyYWctPnN0YXJ0X3RpbWUgPSBzdGFydF90aW1lOworICAgIGZyYWctPmR1cmF0aW9uICAgPSBkdXJhdGlvbjsKKyAgICBmcmFnLT5uICAgICAgICAgID0gb3MtPmZyYWdtZW50X2luZGV4OworICAgIG9zLT5mcmFnbWVudHNbb3MtPm5iX2ZyYWdtZW50cysrXSA9IGZyYWc7CisgICAgb3MtPmZyYWdtZW50X2luZGV4Kys7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRzX2ZsdXNoKEFWRm9ybWF0Q29udGV4dCAqcywgT3V0cHV0U3RyZWFtICpvcywgaW50IGZpbmFsLAorICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBlbmRfdHMpCit7CisgICAgSERTQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcmV0ID0gMDsKKyAgICBjaGFyIHRhcmdldF9maWxlbmFtZVsxMDI0XTsKKyAgICBpbnQgaW5kZXggPSBzLT5zdHJlYW1zW29zLT5maXJzdF9zdHJlYW1dLT5pZDsKKworICAgIGlmICghb3MtPnBhY2tldHNfd3JpdHRlbikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBhdmlvX2ZsdXNoKG9zLT5jdHgtPnBiKTsKKyAgICBvcy0+cGFja2V0c193cml0dGVuID0gMDsKKyAgICBjbG9zZV9maWxlKG9zKTsKKworICAgIHNucHJpbnRmKHRhcmdldF9maWxlbmFtZSwgc2l6ZW9mKHRhcmdldF9maWxlbmFtZSksCisgICAgICAgICAgICAgIiVzL3N0cmVhbSVkU2VnMS1GcmFnJWQiLCBzLT5maWxlbmFtZSwgaW5kZXgsIG9zLT5mcmFnbWVudF9pbmRleCk7CisgICAgcmV0ID0gZmZfcmVuYW1lKG9zLT50ZW1wX2ZpbGVuYW1lLCB0YXJnZXRfZmlsZW5hbWUsIHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGFkZF9mcmFnbWVudChvcywgdGFyZ2V0X2ZpbGVuYW1lLCBvcy0+ZnJhZ19zdGFydF90cywgZW5kX3RzIC0gb3MtPmZyYWdfc3RhcnRfdHMpOworCisgICAgaWYgKCFmaW5hbCkgeworICAgICAgICByZXQgPSBpbml0X2ZpbGUocywgb3MsIGVuZF90cyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoYy0+d2luZG93X3NpemUgfHwgKGZpbmFsICYmIGMtPnJlbW92ZV9hdF9leGl0KSkgeworICAgICAgICBpbnQgcmVtb3ZlID0gb3MtPm5iX2ZyYWdtZW50cyAtIGMtPndpbmRvd19zaXplIC0gYy0+ZXh0cmFfd2luZG93X3NpemU7CisgICAgICAgIGlmIChmaW5hbCAmJiBjLT5yZW1vdmVfYXRfZXhpdCkKKyAgICAgICAgICAgIHJlbW92ZSA9IG9zLT5uYl9mcmFnbWVudHM7CisgICAgICAgIGlmIChyZW1vdmUgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVtb3ZlOyBpKyspIHsKKyAgICAgICAgICAgICAgICB1bmxpbmsob3MtPmZyYWdtZW50c1tpXS0+ZmlsZSk7CisgICAgICAgICAgICAgICAgYXZfZnJlZShvcy0+ZnJhZ21lbnRzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9zLT5uYl9mcmFnbWVudHMgLT0gcmVtb3ZlOworICAgICAgICAgICAgbWVtbW92ZShvcy0+ZnJhZ21lbnRzLCBvcy0+ZnJhZ21lbnRzICsgcmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICBvcy0+bmJfZnJhZ21lbnRzICogc2l6ZW9mKCpvcy0+ZnJhZ21lbnRzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIHJldCA9IHdyaXRlX2Fic3Qocywgb3MsIGZpbmFsKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhkc193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEhEU0NvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW3MtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5pZF07CisgICAgaW50NjRfdCBlbmRfZHRzID0gb3MtPmZyYWdtZW50X2luZGV4ICogKGludDY0X3QpYy0+bWluX2ZyYWdfZHVyYXRpb247CisgICAgaW50IHJldDsKKworICAgIGlmIChzdC0+Zmlyc3RfZHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBzdC0+Zmlyc3RfZHRzID0gcGt0LT5kdHM7CisKKyAgICBpZiAoKCFvcy0+aGFzX3ZpZGVvIHx8IHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pICYmCisgICAgICAgIGF2X2NvbXBhcmVfdHMocGt0LT5kdHMgLSBzdC0+Zmlyc3RfZHRzLCBzdC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGVuZF9kdHMsIEFWX1RJTUVfQkFTRV9RKSA+PSAwICYmCisgICAgICAgIHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkgJiYgb3MtPnBhY2tldHNfd3JpdHRlbikgeworCisgICAgICAgIGlmICgocmV0ID0gaGRzX2ZsdXNoKHMsIG9zLCAwLCBwa3QtPmR0cykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gTm90ZSwgdGhlc2UgZnJhZ21lbnQgc3RhcnQgdGltZXN0YW1wcywgdGhhdCByZXByZXNlbnQgYSB3aG9sZQorICAgIC8vIE91dHB1dFN0cmVhbSwgYXNzdW1lIGFsbCBzdHJlYW1zIGluIGl0IGhhdmUgdGhlIHNhbWUgdGltZSBiYXNlLgorICAgIGlmICghb3MtPnBhY2tldHNfd3JpdHRlbikKKyAgICAgICAgb3MtPmZyYWdfc3RhcnRfdHMgPSBwa3QtPmR0czsKKyAgICBvcy0+bGFzdF90cyA9IHBrdC0+ZHRzOworCisgICAgb3MtPnBhY2tldHNfd3JpdHRlbisrOworICAgIHJldHVybiBmZl93cml0ZV9jaGFpbmVkKG9zLT5jdHgsIHBrdC0+c3RyZWFtX2luZGV4IC0gb3MtPmZpcnN0X3N0cmVhbSwgcGt0LCBzLCAwKTsKK30KKworc3RhdGljIGludCBoZHNfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgSERTQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIGhkc19mbHVzaChzLCAmYy0+c3RyZWFtc1tpXSwgMSwgYy0+c3RyZWFtc1tpXS5sYXN0X3RzKTsKKyAgICB3cml0ZV9tYW5pZmVzdChzLCAxKTsKKworICAgIGlmIChjLT5yZW1vdmVfYXRfZXhpdCkgeworICAgICAgICBjaGFyIGZpbGVuYW1lWzEwMjRdOworICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzL2luZGV4LmY0bSIsIHMtPmZpbGVuYW1lKTsKKyAgICAgICAgdW5saW5rKGZpbGVuYW1lKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcy9zdHJlYW0lZC5hYnN0Iiwgcy0+ZmlsZW5hbWUsIGkpOworICAgICAgICAgICAgdW5saW5rKGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBybWRpcihzLT5maWxlbmFtZSk7CisgICAgfQorCisgICAgaGRzX2ZyZWUocyk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEhEU0NvbnRleHQsIHgpCisjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAid2luZG93X3NpemUiLCAibnVtYmVyIG9mIGZyYWdtZW50cyBrZXB0IGluIHRoZSBtYW5pZmVzdCIsIE9GRlNFVCh3aW5kb3dfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBFIH0sCisgICAgeyAiZXh0cmFfd2luZG93X3NpemUiLCAibnVtYmVyIG9mIGZyYWdtZW50cyBrZXB0IG91dHNpZGUgb2YgdGhlIG1hbmlmZXN0IGJlZm9yZSByZW1vdmluZyBmcm9tIGRpc2siLCBPRkZTRVQoZXh0cmFfd2luZG93X3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDUgfSwgMCwgSU5UX01BWCwgRSB9LAorICAgIHsgIm1pbl9mcmFnX2R1cmF0aW9uIiwgIm1pbmltdW0gZnJhZ21lbnQgZHVyYXRpb24gKGluIG1pY3Jvc2Vjb25kcykiLCBPRkZTRVQobWluX2ZyYWdfZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQ2NCwgeyAuaTY0ID0gMTAwMDAwMDAgfSwgMCwgSU5UX01BWCwgRSB9LAorICAgIHsgInJlbW92ZV9hdF9leGl0IiwgInJlbW92ZSBhbGwgZnJhZ21lbnRzIHdoZW4gZmluaXNoZWQiLCBPRkZTRVQocmVtb3ZlX2F0X2V4aXQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaGRzX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIkhEUyBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9oZHNfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImhkcyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkhEUyBNdXhlciIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihIRFNDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9BQUMsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9OT0ZJTEUsCisgICAgLndyaXRlX2hlYWRlciAgID0gaGRzX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBoZHNfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICA9IGhkc193cml0ZV90cmFpbGVyLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZoZHNfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2hldmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9oZXZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViMDBjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9oZXZjLmMKQEAgLTAsMCArMSwxMTQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRpbSBXYWxrZXIgPHRkc2t5d2Fsa2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dvbG9tYi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaGV2Yy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmMuaCIKKyNpbmNsdWRlICJhdmlvLmgiCisjaW5jbHVkZSAiaGV2Yy5oIgorCisjZGVmaW5lIE1BWF9TUEFUSUFMX1NFR01FTlRBVElPTiA0MDk2IC8vIG1heC4gdmFsdWUgb2YgdSgxMikgZmllbGQKKwordHlwZWRlZiBzdHJ1Y3QgSFZDQ05BTFVuaXRBcnJheSB7CisgICAgdWludDhfdCAgYXJyYXlfY29tcGxldGVuZXNzOworICAgIHVpbnQ4X3QgIE5BTF91bml0X3R5cGU7CisgICAgdWludDE2X3QgbnVtTmFsdXM7CisgICAgdWludDE2X3QgKm5hbFVuaXRMZW5ndGg7CisgICAgdWludDhfdCAgKipuYWxVbml0OworfSBIVkNDTkFMVW5pdEFycmF5OworCit0eXBlZGVmIHN0cnVjdCBIRVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQgeworICAgIHVpbnQ4X3QgIGNvbmZpZ3VyYXRpb25WZXJzaW9uOworICAgIHVpbnQ4X3QgIGdlbmVyYWxfcHJvZmlsZV9zcGFjZTsKKyAgICB1aW50OF90ICBnZW5lcmFsX3RpZXJfZmxhZzsKKyAgICB1aW50OF90ICBnZW5lcmFsX3Byb2ZpbGVfaWRjOworICAgIHVpbnQzMl90IGdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzOworICAgIHVpbnQ2NF90IGdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JfZmxhZ3M7CisgICAgdWludDhfdCAgZ2VuZXJhbF9sZXZlbF9pZGM7CisgICAgdWludDE2X3QgbWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYzsKKyAgICB1aW50OF90ICBwYXJhbGxlbGlzbVR5cGU7CisgICAgdWludDhfdCAgY2hyb21hRm9ybWF0OworICAgIHVpbnQ4X3QgIGJpdERlcHRoTHVtYU1pbnVzODsKKyAgICB1aW50OF90ICBiaXREZXB0aENocm9tYU1pbnVzODsKKyAgICB1aW50MTZfdCBhdmdGcmFtZVJhdGU7CisgICAgdWludDhfdCAgY29uc3RhbnRGcmFtZVJhdGU7CisgICAgdWludDhfdCAgbnVtVGVtcG9yYWxMYXllcnM7CisgICAgdWludDhfdCAgdGVtcG9yYWxJZE5lc3RlZDsKKyAgICB1aW50OF90ICBsZW5ndGhTaXplTWludXNPbmU7CisgICAgdWludDhfdCAgbnVtT2ZBcnJheXM7CisgICAgSFZDQ05BTFVuaXRBcnJheSAqYXJyYXk7Cit9IEhFVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZDsKKwordHlwZWRlZiBzdHJ1Y3QgSFZDQ1Byb2ZpbGVUaWVyTGV2ZWwgeworICAgIHVpbnQ4X3QgIHByb2ZpbGVfc3BhY2U7CisgICAgdWludDhfdCAgdGllcl9mbGFnOworICAgIHVpbnQ4X3QgIHByb2ZpbGVfaWRjOworICAgIHVpbnQzMl90IHByb2ZpbGVfY29tcGF0aWJpbGl0eV9mbGFnczsKKyAgICB1aW50NjRfdCBjb25zdHJhaW50X2luZGljYXRvcl9mbGFnczsKKyAgICB1aW50OF90ICBsZXZlbF9pZGM7Cit9IEhWQ0NQcm9maWxlVGllckxldmVsOworCitzdGF0aWMgdm9pZCBodmNjX3VwZGF0ZV9wdGwoSEVWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkICpodmNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhWQ0NQcm9maWxlVGllckxldmVsICpwdGwpCit7CisgICAgLyoKKyAgICAgKiBUaGUgdmFsdWUgb2YgZ2VuZXJhbF9wcm9maWxlX3NwYWNlIGluIGFsbCB0aGUgcGFyYW1ldGVyIHNldHMgbXVzdCBiZQorICAgICAqIGlkZW50aWNhbC4KKyAgICAgKi8KKyAgICBodmNjLT5nZW5lcmFsX3Byb2ZpbGVfc3BhY2UgPSBwdGwtPnByb2ZpbGVfc3BhY2U7CisKKyAgICAvKgorICAgICAqIFRoZSBsZXZlbCBpbmRpY2F0aW9uIGdlbmVyYWxfbGV2ZWxfaWRjIG11c3QgaW5kaWNhdGUgYSBsZXZlbCBvZgorICAgICAqIGNhcGFiaWxpdHkgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHRoZSBoaWdoZXN0IGxldmVsIGluZGljYXRlZCBmb3IgdGhlCisgICAgICogaGlnaGVzdCB0aWVyIGluIGFsbCB0aGUgcGFyYW1ldGVyIHNldHMuCisgICAgICovCisgICAgaWYgKGh2Y2MtPmdlbmVyYWxfdGllcl9mbGFnIDwgcHRsLT50aWVyX2ZsYWcpCisgICAgICAgIGh2Y2MtPmdlbmVyYWxfbGV2ZWxfaWRjID0gcHRsLT5sZXZlbF9pZGM7CisgICAgZWxzZQorICAgICAgICBodmNjLT5nZW5lcmFsX2xldmVsX2lkYyA9IEZGTUFYKGh2Y2MtPmdlbmVyYWxfbGV2ZWxfaWRjLCBwdGwtPmxldmVsX2lkYyk7CisKKyAgICAvKgorICAgICAqIFRoZSB0aWVyIGluZGljYXRpb24gZ2VuZXJhbF90aWVyX2ZsYWcgbXVzdCBpbmRpY2F0ZSBhIHRpZXIgZXF1YWwgdG8gb3IKKyAgICAgKiBncmVhdGVyIHRoYW4gdGhlIGhpZ2hlc3QgdGllciBpbmRpY2F0ZWQgaW4gYWxsIHRoZSBwYXJhbWV0ZXIgc2V0cy4KKyAgICAgKi8KKyAgICBodmNjLT5nZW5lcmFsX3RpZXJfZmxhZyA9IEZGTUFYKGh2Y2MtPmdlbmVyYWxfdGllcl9mbGFnLCBwdGwtPnRpZXJfZmxhZyk7CisKKyAgICAvKgorICAgICAqIFRoZSBwcm9maWxlIGluZGljYXRpb24gZ2VuZXJhbF9wcm9maWxlX2lkYyBtdXN0IGluZGljYXRlIGEgcHJvZmlsZSB0bworICAgICAqIHdoaWNoIHRoZSBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbiByZWNvcmQgY29uZm9ybXMuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldHMgYXJlIG1hcmtlZCB3aXRoIGRpZmZlcmVudCBwcm9maWxlcywgdGhlbgorICAgICAqIHRoZSBzdHJlYW0gbWF5IG5lZWQgZXhhbWluYXRpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIHByb2ZpbGUsIGlmIGFueSwgdGhlCisgICAgICogZW50aXJlIHN0cmVhbSBjb25mb3JtcyB0by4gSWYgdGhlIGVudGlyZSBzdHJlYW0gaXMgbm90IGV4YW1pbmVkLCBvciB0aGUKKyAgICAgKiBleGFtaW5hdGlvbiByZXZlYWxzIHRoYXQgdGhlcmUgaXMgbm8gcHJvZmlsZSB0byB3aGljaCB0aGUgZW50aXJlIHN0cmVhbQorICAgICAqIGNvbmZvcm1zLCB0aGVuIHRoZSBlbnRpcmUgc3RyZWFtIG11c3QgYmUgc3BsaXQgaW50byB0d28gb3IgbW9yZQorICAgICAqIHN1Yi1zdHJlYW1zIHdpdGggc2VwYXJhdGUgY29uZmlndXJhdGlvbiByZWNvcmRzIGluIHdoaWNoIHRoZXNlIHJ1bGVzIGNhbgorICAgICAqIGJlIG1ldC4KKyAgICAgKgorICAgICAqIE5vdGU6IHNldCB0aGUgcHJvZmlsZSB0byB0aGUgaGlnaGVzdCB2YWx1ZSBmb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eS4KKyAgICAgKi8KKyAgICBodmNjLT5nZW5lcmFsX3Byb2ZpbGVfaWRjID0gRkZNQVgoaHZjYy0+Z2VuZXJhbF9wcm9maWxlX2lkYywgcHRsLT5wcm9maWxlX2lkYyk7CisKKyAgICAvKgorICAgICAqIEVhY2ggYml0IGluIGdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzIG1heSBvbmx5IGJlIHNldCBpZiBhbGwKKyAgICAgKiB0aGUgcGFyYW1ldGVyIHNldHMgc2V0IHRoYXQgYml0LgorICAgICAqLworICAgIGh2Y2MtPmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzICY9IHB0bC0+cHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzOworCisgICAgLyoKKyAgICAgKiBFYWNoIGJpdCBpbiBnZW5lcmFsX2NvbnN0cmFpbnRfaW5kaWNhdG9yX2ZsYWdzIG1heSBvbmx5IGJlIHNldCBpZiBhbGwKKyAgICAgKiB0aGUgcGFyYW1ldGVyIHNldHMgc2V0IHRoYXQgYml0LgorICAgICAqLworICAgIGh2Y2MtPmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JfZmxhZ3MgJj0gcHRsLT5jb25zdHJhaW50X2luZGljYXRvcl9mbGFnczsKK30KKworc3RhdGljIHZvaWQgaHZjY19wYXJzZV9wdGwoR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIRVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQgKmh2Y2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF4X3N1Yl9sYXllcnNfbWludXMxKQoreworICAgIHVuc2lnbmVkIGludCBpOworICAgIEhWQ0NQcm9maWxlVGllckxldmVsIGdlbmVyYWxfcHRsOworICAgIHVpbnQ4X3Qgc3ViX2xheWVyX3Byb2ZpbGVfcHJlc2VudF9mbGFnW01BWF9TVUJfTEFZRVJTXTsKKyAgICB1aW50OF90IHN1Yl9sYXllcl9sZXZlbF9wcmVzZW50X2ZsYWdbTUFYX1NVQl9MQVlFUlNdOworCisgICAgZ2VuZXJhbF9wdGwucHJvZmlsZV9zcGFjZSAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgIGdlbmVyYWxfcHRsLnRpZXJfZmxhZyAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CisgICAgZ2VuZXJhbF9wdGwucHJvZmlsZV9pZGMgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgIGdlbmVyYWxfcHRsLnByb2ZpbGVfY29tcGF0aWJpbGl0eV9mbGFncyA9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKKyAgICBnZW5lcmFsX3B0bC5jb25zdHJhaW50X2luZGljYXRvcl9mbGFncyAgPSBnZXRfYml0czY0KGdiLCA0OCk7CisgICAgZ2VuZXJhbF9wdGwubGV2ZWxfaWRjICAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgIGh2Y2NfdXBkYXRlX3B0bChodmNjLCAmZ2VuZXJhbF9wdGwpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1heF9zdWJfbGF5ZXJzX21pbnVzMTsgaSsrKSB7CisgICAgICAgIHN1Yl9sYXllcl9wcm9maWxlX3ByZXNlbnRfZmxhZ1tpXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIHN1Yl9sYXllcl9sZXZlbF9wcmVzZW50X2ZsYWdbaV0gICA9IGdldF9iaXRzMShnYik7CisgICAgfQorCisgICAgaWYgKG1heF9zdWJfbGF5ZXJzX21pbnVzMSA+IDApCisgICAgICAgIGZvciAoaSA9IG1heF9zdWJfbGF5ZXJzX21pbnVzMTsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMik7IC8vIHJlc2VydmVkX3plcm9fMmJpdHNbaV0KKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfc3ViX2xheWVyc19taW51czE7IGkrKykgeworICAgICAgICBpZiAoc3ViX2xheWVyX3Byb2ZpbGVfcHJlc2VudF9mbGFnW2ldKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogc3ViX2xheWVyX3Byb2ZpbGVfc3BhY2VbaV0gICAgICAgICAgICAgICAgICAgICB1KDIpCisgICAgICAgICAgICAgKiBzdWJfbGF5ZXJfdGllcl9mbGFnW2ldICAgICAgICAgICAgICAgICAgICAgICAgIHUoMSkKKyAgICAgICAgICAgICAqIHN1Yl9sYXllcl9wcm9maWxlX2lkY1tpXSAgICAgICAgICAgICAgICAgICAgICAgdSg1KQorICAgICAgICAgICAgICogc3ViX2xheWVyX3Byb2ZpbGVfY29tcGF0aWJpbGl0eV9mbGFnW2ldWzAuLjMxXSB1KDMyKQorICAgICAgICAgICAgICogc3ViX2xheWVyX3Byb2dyZXNzaXZlX3NvdXJjZV9mbGFnW2ldICAgICAgICAgICB1KDEpCisgICAgICAgICAgICAgKiBzdWJfbGF5ZXJfaW50ZXJsYWNlZF9zb3VyY2VfZmxhZ1tpXSAgICAgICAgICAgIHUoMSkKKyAgICAgICAgICAgICAqIHN1Yl9sYXllcl9ub25fcGFja2VkX2NvbnN0cmFpbnRfZmxhZ1tpXSAgICAgICAgdSgxKQorICAgICAgICAgICAgICogc3ViX2xheWVyX2ZyYW1lX29ubHlfY29uc3RyYWludF9mbGFnW2ldICAgICAgICB1KDEpCisgICAgICAgICAgICAgKiBzdWJfbGF5ZXJfcmVzZXJ2ZWRfemVyb180NGJpdHNbaV0gICAgICAgICAgICAgIHUoNDQpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKGdiLCAzMik7CisgICAgICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgMzIpOworICAgICAgICAgICAgc2tpcF9iaXRzICAgICAoZ2IsIDI0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWJfbGF5ZXJfbGV2ZWxfcHJlc2VudF9mbGFnW2ldKQorICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA4KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNraXBfc3ViX2xheWVyX2hyZF9wYXJhbWV0ZXJzKEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNwYl9jbnRfbWludXMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdWJfcGljX2hyZF9wYXJhbXNfcHJlc2VudF9mbGFnKQoreworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8PSBjcGJfY250X21pbnVzMTsgaSsrKSB7CisgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIGJpdF9yYXRlX3ZhbHVlX21pbnVzMQorICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBjcGJfc2l6ZV92YWx1ZV9taW51czEKKworICAgICAgICBpZiAoc3ViX3BpY19ocmRfcGFyYW1zX3ByZXNlbnRfZmxhZykgeworICAgICAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gY3BiX3NpemVfZHVfdmFsdWVfbWludXMxCisgICAgICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBiaXRfcmF0ZV9kdV92YWx1ZV9taW51czEKKyAgICAgICAgfQorCisgICAgICAgIHNraXBfYml0czEoZ2IpOyAvLyBjYnJfZmxhZworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2tpcF9ocmRfcGFyYW1ldGVycyhHZXRCaXRDb250ZXh0ICpnYiwgdWludDhfdCBjcHJtc19wcmVzZW50X2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfc3ViX2xheWVyc19taW51czEpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgdWludDhfdCBzdWJfcGljX2hyZF9wYXJhbXNfcHJlc2VudF9mbGFnID0gMDsKKyAgICB1aW50OF90IG5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSAwOworICAgIHVpbnQ4X3QgdmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IDA7CisKKyAgICBpZiAoY3BybXNfcHJlc2VudF9mbGFnKSB7CisgICAgICAgIG5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICB2Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICBpZiAobmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyB8fAorICAgICAgICAgICAgdmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykgeworICAgICAgICAgICAgc3ViX3BpY19ocmRfcGFyYW1zX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgICAgIGlmIChzdWJfcGljX2hyZF9wYXJhbXNfcHJlc2VudF9mbGFnKQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogdGlja19kaXZpc29yX21pbnVzMiAgICAgICAgICAgICAgICAgICAgICAgICAgdSg4KQorICAgICAgICAgICAgICAgICAqIGR1X2NwYl9yZW1vdmFsX2RlbGF5X2luY3JlbWVudF9sZW5ndGhfbWludXMxIHUoNSkKKyAgICAgICAgICAgICAgICAgKiBzdWJfcGljX2NwYl9wYXJhbXNfaW5fcGljX3RpbWluZ19zZWlfZmxhZyAgICB1KDEpCisgICAgICAgICAgICAgICAgICogZHBiX291dHB1dF9kZWxheV9kdV9sZW5ndGhfbWludXMxICAgICAgICAgICAgdSg1KQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTkpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogYml0X3JhdGVfc2NhbGUgdSg0KQorICAgICAgICAgICAgICogY3BiX3NpemVfc2NhbGUgdSg0KQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDgpOworCisgICAgICAgICAgICBpZiAoc3ViX3BpY19ocmRfcGFyYW1zX3ByZXNlbnRfZmxhZykKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDQpOyAvLyBjcGJfc2l6ZV9kdV9zY2FsZQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxIHUoNSkKKyAgICAgICAgICAgICAqIGF1X2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEgICAgICB1KDUpCisgICAgICAgICAgICAgKiBkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEgICAgICAgICAgdSg1KQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDE1KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPD0gbWF4X3N1Yl9sYXllcnNfbWludXMxOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGNwYl9jbnRfbWludXMxICAgICAgICAgICAgPSAwOworICAgICAgICB1aW50OF90IGxvd19kZWxheV9ocmRfZmxhZyAgICAgICAgICAgICA9IDA7CisgICAgICAgIHVpbnQ4X3QgZml4ZWRfcGljX3JhdGVfd2l0aGluX2N2c19mbGFnID0gMDsKKyAgICAgICAgdWludDhfdCBmaXhlZF9waWNfcmF0ZV9nZW5lcmFsX2ZsYWcgICAgPSBnZXRfYml0czEoZ2IpOworCisgICAgICAgIGlmICghZml4ZWRfcGljX3JhdGVfZ2VuZXJhbF9mbGFnKQorICAgICAgICAgICAgZml4ZWRfcGljX3JhdGVfd2l0aGluX2N2c19mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICBpZiAoZml4ZWRfcGljX3JhdGVfd2l0aGluX2N2c19mbGFnKQorICAgICAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gZWxlbWVudGFsX2R1cmF0aW9uX2luX3RjX21pbnVzMQorICAgICAgICBlbHNlCisgICAgICAgICAgICBsb3dfZGVsYXlfaHJkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgICAgIGlmICghbG93X2RlbGF5X2hyZF9mbGFnKQorICAgICAgICAgICAgY3BiX2NudF9taW51czEgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCisgICAgICAgIGlmIChuYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQorICAgICAgICAgICAgc2tpcF9zdWJfbGF5ZXJfaHJkX3BhcmFtZXRlcnMoZ2IsIGNwYl9jbnRfbWludXMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3BpY19ocmRfcGFyYW1zX3ByZXNlbnRfZmxhZyk7CisKKyAgICAgICAgaWYgKHZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgICAgICBza2lwX3N1Yl9sYXllcl9ocmRfcGFyYW1ldGVycyhnYiwgY3BiX2NudF9taW51czEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfcGljX2hyZF9wYXJhbXNfcHJlc2VudF9mbGFnKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNraXBfdGltaW5nX2luZm8oR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDMyKTsgLy8gbnVtX3VuaXRzX2luX3RpY2sKKyAgICBza2lwX2JpdHNfbG9uZyhnYiwgMzIpOyAvLyB0aW1lX3NjYWxlCisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgICAgICAgICAgLy8gcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZworICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBudW1fdGlja3NfcG9jX2RpZmZfb25lX21pbnVzMQorfQorCitzdGF0aWMgdm9pZCBodmNjX3BhcnNlX3Z1aShHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCAqaHZjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfc3ViX2xheWVyc19taW51czEpCit7CisgICAgdW5zaWduZWQgaW50IG1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGM7CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgICAgICAgICAgICAgIC8vIGFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZworICAgICAgICBpZiAoZ2V0X2JpdHMoZ2IsIDgpID09IDI1NSkgLy8gYXNwZWN0X3JhdGlvX2lkYworICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDMyKTsgLy8gc2FyX3dpZHRoIHUoMTYpLCBzYXJfaGVpZ2h0IHUoMTYpCisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgIC8vIG92ZXJzY2FuX2luZm9fcHJlc2VudF9mbGFnCisgICAgICAgIHNraXBfYml0czEoZ2IpOyAvLyBvdmVyc2Nhbl9hcHByb3ByaWF0ZV9mbGFnCisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAgLy8gdmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnCisgICAgICAgIHNraXBfYml0cyhnYiwgNCk7IC8vIHZpZGVvX2Zvcm1hdCB1KDMpLCB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgdSgxKQorCisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSAvLyBjb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogY29sb3VyX3ByaW1hcmllcyAgICAgICAgIHUoOCkKKyAgICAgICAgICAgICAqIHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyB1KDgpCisgICAgICAgICAgICAgKiBtYXRyaXhfY29lZmZzICAgICAgICAgICAgdSg4KQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDI0KTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAgICAgICAgLy8gY2hyb21hX2xvY19pbmZvX3ByZXNlbnRfZmxhZworICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBjaHJvbWFfc2FtcGxlX2xvY190eXBlX3RvcF9maWVsZAorICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBjaHJvbWFfc2FtcGxlX2xvY190eXBlX2JvdHRvbV9maWVsZAorICAgIH0KKworICAgIC8qCisgICAgICogbmV1dHJhbF9jaHJvbWFfaW5kaWNhdGlvbl9mbGFnIHUoMSkKKyAgICAgKiBmaWVsZF9zZXFfZmxhZyAgICAgICAgICAgICAgICAgdSgxKQorICAgICAqIGZyYW1lX2ZpZWxkX2luZm9fcHJlc2VudF9mbGFnICB1KDEpCisgICAgICovCisgICAgc2tpcF9iaXRzKGdiLCAzKTsKKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7ICAgICAgICAvLyBkZWZhdWx0X2Rpc3BsYXlfd2luZG93X2ZsYWcKKyAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gZGVmX2Rpc3Bfd2luX2xlZnRfb2Zmc2V0CisgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIGRlZl9kaXNwX3dpbl9yaWdodF9vZmZzZXQKKyAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gZGVmX2Rpc3Bfd2luX3RvcF9vZmZzZXQKKyAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gZGVmX2Rpc3Bfd2luX2JvdHRvbV9vZmZzZXQKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvLyB2dWlfdGltaW5nX2luZm9fcHJlc2VudF9mbGFnCisgICAgICAgIHNraXBfdGltaW5nX2luZm8oZ2IpOworCisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSAvLyB2dWlfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnCisgICAgICAgICAgICBza2lwX2hyZF9wYXJhbWV0ZXJzKGdiLCAxLCBtYXhfc3ViX2xheWVyc19taW51czEpOworICAgIH0KKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7IC8vIGJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnCisgICAgICAgIC8qCisgICAgICAgICAqIHRpbGVzX2ZpeGVkX3N0cnVjdHVyZV9mbGFnICAgICAgICAgICAgICB1KDEpCisgICAgICAgICAqIG1vdGlvbl92ZWN0b3JzX292ZXJfcGljX2JvdW5kYXJpZXNfZmxhZyB1KDEpCisgICAgICAgICAqIHJlc3RyaWN0ZWRfcmVmX3BpY19saXN0c19mbGFnICAgICAgICAgICB1KDEpCisgICAgICAgICAqLworICAgICAgICBza2lwX2JpdHMoZ2IsIDMpOworCisgICAgICAgIG1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGMgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCisgICAgICAgIC8qCisgICAgICAgICAqIHVuc2lnbmVkIGludCgxMikgbWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYzsKKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIG1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGMgaW5kaWNhdGlvbiBtdXN0IGluZGljYXRlIGEgbGV2ZWwgb2YKKyAgICAgICAgICogc3BhdGlhbCBzZWdtZW50YXRpb24gZXF1YWwgdG8gb3IgbGVzcyB0aGFuIHRoZSBsb3dlc3QgbGV2ZWwgb2YKKyAgICAgICAgICogc3BhdGlhbCBzZWdtZW50YXRpb24gaW5kaWNhdGVkIGluIGFsbCB0aGUgcGFyYW1ldGVyIHNldHMuCisgICAgICAgICAqLworICAgICAgICBodmNjLT5taW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjID0gRkZNSU4oaHZjYy0+bWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGMpOworCisgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIG1heF9ieXRlc19wZXJfcGljX2Rlbm9tCisgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIG1heF9iaXRzX3Blcl9taW5fY3VfZGVub20KKyAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gbG9nMl9tYXhfbXZfbGVuZ3RoX2hvcml6b250YWwKKyAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gbG9nMl9tYXhfbXZfbGVuZ3RoX3ZlcnRpY2FsCisgICAgfQorfQorCitzdGF0aWMgdm9pZCBza2lwX3N1Yl9sYXllcl9vcmRlcmluZ19pbmZvKEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIG1heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czEKKyAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBtYXhfbnVtX3Jlb3JkZXJfcGljcworICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIG1heF9sYXRlbmN5X2luY3JlYXNlX3BsdXMxCit9CisKK3N0YXRpYyBpbnQgaHZjY19wYXJzZV92cHMoR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhFVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCAqaHZjYykKK3sKKyAgICB1bnNpZ25lZCBpbnQgdnBzX21heF9zdWJfbGF5ZXJzX21pbnVzMTsKKworICAgIC8qCisgICAgICogdnBzX3ZpZGVvX3BhcmFtZXRlcl9zZXRfaWQgdSg0KQorICAgICAqIHZwc19yZXNlcnZlZF90aHJlZV8yYml0cyAgIHUoMikKKyAgICAgKiB2cHNfbWF4X2xheWVyc19taW51czEgICAgICB1KDYpCisgICAgICovCisgICAgc2tpcF9iaXRzKGdiLCAxMik7CisKKyAgICB2cHNfbWF4X3N1Yl9sYXllcnNfbWludXMxID0gZ2V0X2JpdHMoZ2IsIDMpOworCisgICAgLyoKKyAgICAgKiBudW1UZW1wb3JhbExheWVycyBncmVhdGVyIHRoYW4gMSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoaXMKKyAgICAgKiBjb25maWd1cmF0aW9uIHJlY29yZCBhcHBsaWVzIGlzIHRlbXBvcmFsbHkgc2NhbGFibGUgYW5kIHRoZSBjb250YWluZWQKKyAgICAgKiBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzIChhbHNvIHJlZmVycmVkIHRvIGFzIHRlbXBvcmFsIHN1Yi1sYXllciBvcgorICAgICAqIHN1Yi1sYXllciBpbiBJU08vSUVDIDIzMDA4LTIpIGlzIGVxdWFsIHRvIG51bVRlbXBvcmFsTGF5ZXJzLiBWYWx1ZSAxCisgICAgICogaW5kaWNhdGVzIHRoYXQgdGhlIHN0cmVhbSBpcyBub3QgdGVtcG9yYWxseSBzY2FsYWJsZS4gVmFsdWUgMCBpbmRpY2F0ZXMKKyAgICAgKiB0aGF0IGl0IGlzIHVua25vd24gd2hldGhlciB0aGUgc3RyZWFtIGlzIHRlbXBvcmFsbHkgc2NhbGFibGUuCisgICAgICovCisgICAgaHZjYy0+bnVtVGVtcG9yYWxMYXllcnMgPSBGRk1BWChodmNjLT5udW1UZW1wb3JhbExheWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwc19tYXhfc3ViX2xheWVyc19taW51czEgKyAxKTsKKworICAgIC8qCisgICAgICogdnBzX3RlbXBvcmFsX2lkX25lc3RpbmdfZmxhZyB1KDEpCisgICAgICogdnBzX3Jlc2VydmVkXzB4ZmZmZl8xNmJpdHMgICB1KDE2KQorICAgICAqLworICAgIHNraXBfYml0cyhnYiwgMTcpOworCisgICAgaHZjY19wYXJzZV9wdGwoZ2IsIGh2Y2MsIHZwc19tYXhfc3ViX2xheWVyc19taW51czEpOworCisgICAgLyogbm90aGluZyB1c2VmdWwgZm9yIGh2Y0MgcGFzdCB0aGlzIHBvaW50ICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNraXBfc2NhbGluZ19saXN0X2RhdGEoR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IGksIGosIGssIG51bV9jb2VmZnM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgKGkgPT0gMyA/IDIgOiA2KTsgaisrKQorICAgICAgICAgICAgaWYgKCFnZXRfYml0czEoZ2IpKSAgICAgICAgIC8vIHNjYWxpbmdfbGlzdF9wcmVkX21vZGVfZmxhZ1tpXVtqXQorICAgICAgICAgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIHNjYWxpbmdfbGlzdF9wcmVkX21hdHJpeF9pZF9kZWx0YVtpXVtqXQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbnVtX2NvZWZmcyA9IEZGTUlOKDY0LCAxIDw8ICg0ICsgKGkgPDwgMSkpKTsKKworICAgICAgICAgICAgICAgIGlmIChpID4gMSkKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3NlX2dvbG9tYl9sb25nKGdiKTsgLy8gc2NhbGluZ19saXN0X2RjX2NvZWZfbWludXM4W2ktMl1bal0KKworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBudW1fY29lZmZzOyBrKyspCisgICAgICAgICAgICAgICAgICAgIGdldF9zZV9nb2xvbWJfbG9uZyhnYik7IC8vIHNjYWxpbmdfbGlzdF9kZWx0YV9jb2VmCisgICAgICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfcnBzKEdldEJpdENvbnRleHQgKmdiLCB1bnNpZ25lZCBpbnQgcnBzX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fcnBzLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9kZWx0YV9wb2NzW01BWF9TSE9SVF9URVJNX1JQU19DT1VOVF0pCit7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBpZiAocnBzX2lkeCAmJiBnZXRfYml0czEoZ2IpKSB7IC8vIGludGVyX3JlZl9waWNfc2V0X3ByZWRpY3Rpb25fZmxhZworICAgICAgICAvKiB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBmb3Igc2xpY2UgaGVhZGVycywgYW5kIHRoaXMgaXNuJ3Qgb25lICovCisgICAgICAgIGlmIChycHNfaWR4ID49IG51bV9ycHMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBza2lwX2JpdHMxICAgICAgICAoZ2IpOyAvLyBkZWx0YV9ycHNfc2lnbgorICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBhYnNfZGVsdGFfcnBzX21pbnVzMQorCisgICAgICAgIG51bV9kZWx0YV9wb2NzW3Jwc19pZHhdID0gMDsKKworICAgICAgICAvKgorICAgICAgICAgKiBGcm9tIGxpYmF2Y29kZWMvaGV2Y19wcy5jOgorICAgICAgICAgKgorICAgICAgICAgKiBpZiAoaXNfc2xpY2VfaGVhZGVyKSB7CisgICAgICAgICAqICAgIC8vZm9vCisgICAgICAgICAqIH0gZWxzZQorICAgICAgICAgKiAgICAgcnBzX3JpZHggPSAmc3BzLT5zdF9ycHNbcnBzIC0gc3BzLT5zdF9ycHMgLSAxXTsKKyAgICAgICAgICoKKyAgICAgICAgICogd2hlcmU6CisgICAgICAgICAqIHJwczogICAgICAgICAgICAgJnNwcy0+c3RfcnBzW3Jwc19pZHhdCisgICAgICAgICAqIHNwcy0+c3RfcnBzOiAgICAgJnNwcy0+c3RfcnBzWzBdCisgICAgICAgICAqIGlzX3NsaWNlX2hlYWRlcjogcnBzX2lkeCA9PSBudW1fcnBzCisgICAgICAgICAqCisgICAgICAgICAqIHRodXM6CisgICAgICAgICAqIGlmIChudW1fcnBzICE9IHJwc19pZHgpCisgICAgICAgICAqICAgICBycHNfcmlkeCA9ICZzcHMtPnN0X3Jwc1tycHNfaWR4IC0gMV07CisgICAgICAgICAqCisgICAgICAgICAqIE51bURlbHRhUG9jc1tSZWZScHNJZHhdOiBudW1fZGVsdGFfcG9jc1tycHNfaWR4IC0gMV0KKyAgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZGVsdGFfcG9jc1tycHNfaWR4IC0gMV07IGkrKykgeworICAgICAgICAgICAgdWludDhfdCB1c2VfZGVsdGFfZmxhZyA9IDA7CisgICAgICAgICAgICB1aW50OF90IHVzZWRfYnlfY3Vycl9waWNfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAoIXVzZWRfYnlfY3Vycl9waWNfZmxhZykKKyAgICAgICAgICAgICAgICB1c2VfZGVsdGFfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgICAgIGlmICh1c2VkX2J5X2N1cnJfcGljX2ZsYWcgfHwgdXNlX2RlbHRhX2ZsYWcpCisgICAgICAgICAgICAgICAgbnVtX2RlbHRhX3BvY3NbcnBzX2lkeF0rKzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1fbmVnYXRpdmVfcGljcyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1fcG9zaXRpdmVfcGljcyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisKKyAgICAgICAgbnVtX2RlbHRhX3BvY3NbcnBzX2lkeF0gPSBudW1fbmVnYXRpdmVfcGljcyArIG51bV9wb3NpdGl2ZV9waWNzOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbmVnYXRpdmVfcGljczsgaSsrKSB7CisgICAgICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBkZWx0YV9wb2NfczBfbWludXMxW3Jwc19pZHhdCisgICAgICAgICAgICBza2lwX2JpdHMxICAgICAgICAoZ2IpOyAvLyB1c2VkX2J5X2N1cnJfcGljX3MwX2ZsYWdbcnBzX2lkeF0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcG9zaXRpdmVfcGljczsgaSsrKSB7CisgICAgICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBkZWx0YV9wb2NfczFfbWludXMxW3Jwc19pZHhdCisgICAgICAgICAgICBza2lwX2JpdHMxICAgICAgICAoZ2IpOyAvLyB1c2VkX2J5X2N1cnJfcGljX3MxX2ZsYWdbcnBzX2lkeF0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh2Y2NfcGFyc2Vfc3BzKEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIRVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQgKmh2Y2MpCit7CisgICAgdW5zaWduZWQgaW50IGksIHNwc19tYXhfc3ViX2xheWVyc19taW51czEsIGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsKKyAgICB1bnNpZ25lZCBpbnQgbnVtX3Nob3J0X3Rlcm1fcmVmX3BpY19zZXRzLCBudW1fZGVsdGFfcG9jc1tNQVhfU0hPUlRfVEVSTV9SUFNfQ09VTlRdOworCisgICAgc2tpcF9iaXRzKGdiLCA0KTsgLy8gc3BzX3ZpZGVvX3BhcmFtZXRlcl9zZXRfaWQKKworICAgIHNwc19tYXhfc3ViX2xheWVyc19taW51czEgPSBnZXRfYml0cyAoZ2IsIDMpOworCisgICAgLyoKKyAgICAgKiBudW1UZW1wb3JhbExheWVycyBncmVhdGVyIHRoYW4gMSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoaXMKKyAgICAgKiBjb25maWd1cmF0aW9uIHJlY29yZCBhcHBsaWVzIGlzIHRlbXBvcmFsbHkgc2NhbGFibGUgYW5kIHRoZSBjb250YWluZWQKKyAgICAgKiBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzIChhbHNvIHJlZmVycmVkIHRvIGFzIHRlbXBvcmFsIHN1Yi1sYXllciBvcgorICAgICAqIHN1Yi1sYXllciBpbiBJU08vSUVDIDIzMDA4LTIpIGlzIGVxdWFsIHRvIG51bVRlbXBvcmFsTGF5ZXJzLiBWYWx1ZSAxCisgICAgICogaW5kaWNhdGVzIHRoYXQgdGhlIHN0cmVhbSBpcyBub3QgdGVtcG9yYWxseSBzY2FsYWJsZS4gVmFsdWUgMCBpbmRpY2F0ZXMKKyAgICAgKiB0aGF0IGl0IGlzIHVua25vd24gd2hldGhlciB0aGUgc3RyZWFtIGlzIHRlbXBvcmFsbHkgc2NhbGFibGUuCisgICAgICovCisgICAgaHZjYy0+bnVtVGVtcG9yYWxMYXllcnMgPSBGRk1BWChodmNjLT5udW1UZW1wb3JhbExheWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwc19tYXhfc3ViX2xheWVyc19taW51czEgKyAxKTsKKworICAgIGh2Y2MtPnRlbXBvcmFsSWROZXN0ZWQgPSBnZXRfYml0czEoZ2IpOworCisgICAgaHZjY19wYXJzZV9wdGwoZ2IsIGh2Y2MsIHNwc19tYXhfc3ViX2xheWVyc19taW51czEpOworCisgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gc3BzX3NlcV9wYXJhbWV0ZXJfc2V0X2lkCisKKyAgICBodmNjLT5jaHJvbWFGb3JtYXQgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCisgICAgaWYgKGh2Y2MtPmNocm9tYUZvcm1hdCA9PSAzKQorICAgICAgICBza2lwX2JpdHMxKGdiKTsgLy8gc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcKKworICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIHBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXMKKyAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBwaWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlcworCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsgICAgICAgIC8vIGNvbmZvcm1hbmNlX3dpbmRvd19mbGFnCisgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIGNvbmZfd2luX2xlZnRfb2Zmc2V0CisgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIGNvbmZfd2luX3JpZ2h0X29mZnNldAorICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBjb25mX3dpbl90b3Bfb2Zmc2V0CisgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIGNvbmZfd2luX2JvdHRvbV9vZmZzZXQKKyAgICB9CisKKyAgICBodmNjLT5iaXREZXB0aEx1bWFNaW51czggICAgICAgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgIGh2Y2MtPmJpdERlcHRoQ2hyb21hTWludXM4ICAgICAgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKworICAgIC8qIHNwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWcgKi8KKyAgICBpID0gZ2V0X2JpdHMxKGdiKSA/IDAgOiBzcHNfbWF4X3N1Yl9sYXllcnNfbWludXMxOworICAgIGZvciAoOyBpIDw9IHNwc19tYXhfc3ViX2xheWVyc19taW51czE7IGkrKykKKyAgICAgICAgc2tpcF9zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mbyhnYik7CisKKyAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBsb2cyX21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMworICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIGxvZzJfZGlmZl9tYXhfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemUKKyAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBsb2cyX21pbl90cmFuc2Zvcm1fYmxvY2tfc2l6ZV9taW51czIKKyAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBsb2cyX2RpZmZfbWF4X21pbl90cmFuc2Zvcm1fYmxvY2tfc2l6ZQorICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIG1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyCisgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gbWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmEKKworICAgIGlmIChnZXRfYml0czEoZ2IpICYmIC8vIHNjYWxpbmdfbGlzdF9lbmFibGVkX2ZsYWcKKyAgICAgICAgZ2V0X2JpdHMxKGdiKSkgICAvLyBzcHNfc2NhbGluZ19saXN0X2RhdGFfcHJlc2VudF9mbGFnCisgICAgICAgIHNraXBfc2NhbGluZ19saXN0X2RhdGEoZ2IpOworCisgICAgc2tpcF9iaXRzMShnYik7IC8vIGFtcF9lbmFibGVkX2ZsYWcKKyAgICBza2lwX2JpdHMxKGdiKTsgLy8gc2FtcGxlX2FkYXB0aXZlX29mZnNldF9lbmFibGVkX2ZsYWcKKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7ICAgICAgICAgICAvLyBwY21fZW5hYmxlZF9mbGFnCisgICAgICAgIHNraXBfYml0cyAgICAgICAgIChnYiwgNCk7IC8vIHBjbV9zYW1wbGVfYml0X2RlcHRoX2x1bWFfbWludXMxCisgICAgICAgIHNraXBfYml0cyAgICAgICAgIChnYiwgNCk7IC8vIHBjbV9zYW1wbGVfYml0X2RlcHRoX2Nocm9tYV9taW51czEKKyAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgICAgLy8gbG9nMl9taW5fcGNtX2x1bWFfY29kaW5nX2Jsb2NrX3NpemVfbWludXMzCisgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7ICAgIC8vIGxvZzJfZGlmZl9tYXhfbWluX3BjbV9sdW1hX2NvZGluZ19ibG9ja19zaXplCisgICAgICAgIHNraXBfYml0czEgICAgICAgIChnYik7ICAgIC8vIHBjbV9sb29wX2ZpbHRlcl9kaXNhYmxlZF9mbGFnCisgICAgfQorCisgICAgbnVtX3Nob3J0X3Rlcm1fcmVmX3BpY19zZXRzID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICBpZiAobnVtX3Nob3J0X3Rlcm1fcmVmX3BpY19zZXRzID4gTUFYX1NIT1JUX1RFUk1fUlBTX0NPVU5UKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2hvcnRfdGVybV9yZWZfcGljX3NldHM7IGkrKykgeworICAgICAgICBpbnQgcmV0ID0gcGFyc2VfcnBzKGdiLCBpLCBudW1fc2hvcnRfdGVybV9yZWZfcGljX3NldHMsIG51bV9kZWx0YV9wb2NzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IGkrKykgeyAvLyBudW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcworICAgICAgICAgICAgaW50IGxlbiA9IEZGTUlOKGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQsIDE2KTsKKyAgICAgICAgICAgIHNraXBfYml0cyAoZ2IsIGxlbik7IC8vIGx0X3JlZl9waWNfcG9jX2xzYl9zcHNbaV0KKyAgICAgICAgICAgIHNraXBfYml0czEoZ2IpOyAgICAgIC8vIHVzZWRfYnlfY3Vycl9waWNfbHRfc3BzX2ZsYWdbaV0KKyAgICAgICAgfQorICAgIH0KKworICAgIHNraXBfYml0czEoZ2IpOyAvLyBzcHNfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZworICAgIHNraXBfYml0czEoZ2IpOyAvLyBzdHJvbmdfaW50cmFfc21vb3RoaW5nX2VuYWJsZWRfZmxhZworCisgICAgaWYgKGdldF9iaXRzMShnYikpIC8vIHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZworICAgICAgICBodmNjX3BhcnNlX3Z1aShnYiwgaHZjYywgc3BzX21heF9zdWJfbGF5ZXJzX21pbnVzMSk7CisKKyAgICAvKiBub3RoaW5nIHVzZWZ1bCBmb3IgaHZjQyBwYXN0IHRoaXMgcG9pbnQgKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBodmNjX3BhcnNlX3BwcyhHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEVWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkICpodmNjKQoreworICAgIHVpbnQ4X3QgdGlsZXNfZW5hYmxlZF9mbGFnLCBlbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZzsKKworICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIHBwc19waWNfcGFyYW1ldGVyX3NldF9pZAorICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIHBwc19zZXFfcGFyYW1ldGVyX3NldF9pZAorCisgICAgLyoKKyAgICAgKiBkZXBlbmRlbnRfc2xpY2Vfc2VnbWVudHNfZW5hYmxlZF9mbGFnIHUoMSkKKyAgICAgKiBvdXRwdXRfZmxhZ19wcmVzZW50X2ZsYWcgICAgICAgICAgICAgIHUoMSkKKyAgICAgKiBudW1fZXh0cmFfc2xpY2VfaGVhZGVyX2JpdHMgICAgICAgICAgIHUoMykKKyAgICAgKiBzaWduX2RhdGFfaGlkaW5nX2VuYWJsZWRfZmxhZyAgICAgICAgIHUoMSkKKyAgICAgKiBjYWJhY19pbml0X3ByZXNlbnRfZmxhZyAgICAgICAgICAgICAgIHUoMSkKKyAgICAgKi8KKyAgICBza2lwX2JpdHMoZ2IsIDcpOworCisgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gbnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmVfbWludXMxCisgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gbnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmVfbWludXMxCisgICAgZ2V0X3NlX2dvbG9tYl9sb25nKGdiKTsgLy8gaW5pdF9xcF9taW51czI2CisKKyAgICAvKgorICAgICAqIGNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyB1KDEpCisgICAgICogdHJhbnNmb3JtX3NraXBfZW5hYmxlZF9mbGFnIHUoMSkKKyAgICAgKi8KKyAgICBza2lwX2JpdHMoZ2IsIDIpOworCisgICAgaWYgKGdldF9iaXRzMShnYikpICAgICAgICAgIC8vIGN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZworICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBkaWZmX2N1X3FwX2RlbHRhX2RlcHRoCisKKyAgICBnZXRfc2VfZ29sb21iX2xvbmcoZ2IpOyAvLyBwcHNfY2JfcXBfb2Zmc2V0CisgICAgZ2V0X3NlX2dvbG9tYl9sb25nKGdiKTsgLy8gcHBzX2NyX3FwX29mZnNldAorCisgICAgLyoKKyAgICAgKiB3ZWlnaHRlZF9wcmVkX2ZsYWcgICAgICAgICAgICAgICB1KDEpCisgICAgICogd2VpZ2h0ZWRfYmlwcmVkX2ZsYWcgICAgICAgICAgICAgdSgxKQorICAgICAqIHRyYW5zcXVhbnRfYnlwYXNzX2VuYWJsZWRfZmxhZyAgIHUoMSkKKyAgICAgKi8KKyAgICBza2lwX2JpdHMoZ2IsIDMpOworCisgICAgdGlsZXNfZW5hYmxlZF9mbGFnICAgICAgICAgICAgICAgPSBnZXRfYml0czEoZ2IpOworICAgIGVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIGlmIChlbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZyAmJiB0aWxlc19lbmFibGVkX2ZsYWcpCisgICAgICAgIGh2Y2MtPnBhcmFsbGVsaXNtVHlwZSA9IDA7IC8vIG1peGVkLXR5cGUgcGFyYWxsZWwgZGVjb2RpbmcKKyAgICBlbHNlIGlmIChlbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZykKKyAgICAgICAgaHZjYy0+cGFyYWxsZWxpc21UeXBlID0gMzsgLy8gd2F2ZWZyb250LWJhc2VkIHBhcmFsbGVsIGRlY29kaW5nCisgICAgZWxzZSBpZiAodGlsZXNfZW5hYmxlZF9mbGFnKQorICAgICAgICBodmNjLT5wYXJhbGxlbGlzbVR5cGUgPSAyOyAvLyB0aWxlLWJhc2VkIHBhcmFsbGVsIGRlY29kaW5nCisgICAgZWxzZQorICAgICAgICBodmNjLT5wYXJhbGxlbGlzbVR5cGUgPSAxOyAvLyBzbGljZS1iYXNlZCBwYXJhbGxlbCBkZWNvZGluZworCisgICAgLyogbm90aGluZyB1c2VmdWwgZm9yIGh2Y0MgcGFzdCB0aGlzIHBvaW50ICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50OF90ICpuYWxfdW5pdF9leHRyYWN0X3Jic3AoY29uc3QgdWludDhfdCAqc3JjLCB1aW50MzJfdCBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZHN0X2xlbikKK3sKKyAgICB1aW50OF90ICpkc3Q7CisgICAgdWludDMyX3QgaSwgbGVuOworCisgICAgZHN0ID0gYXZfbWFsbG9jKHNyY19sZW4pOworICAgIGlmICghZHN0KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIE5BTCB1bml0IGhlYWRlciAoMiBieXRlcykgKi8KKyAgICBpID0gbGVuID0gMDsKKyAgICB3aGlsZSAoaSA8IDIgJiYgaSA8IHNyY19sZW4pCisgICAgICAgIGRzdFtsZW4rK10gPSBzcmNbaSsrXTsKKworICAgIHdoaWxlIChpICsgMiA8IHNyY19sZW4pCisgICAgICAgIGlmICghc3JjW2ldICYmICFzcmNbaSArIDFdICYmIHNyY1tpICsgMl0gPT0gMykgeworICAgICAgICAgICAgZHN0W2xlbisrXSA9IHNyY1tpKytdOworICAgICAgICAgICAgZHN0W2xlbisrXSA9IHNyY1tpKytdOworICAgICAgICAgICAgaSsrOyAvLyByZW1vdmUgZW11bGF0aW9uX3ByZXZlbnRpb25fdGhyZWVfYnl0ZQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGRzdFtsZW4rK10gPSBzcmNbaSsrXTsKKworICAgIHdoaWxlIChpIDwgc3JjX2xlbikKKyAgICAgICAgZHN0W2xlbisrXSA9IHNyY1tpKytdOworCisgICAgKmRzdF9sZW4gPSBsZW47CisgICAgcmV0dXJuIGRzdDsKK30KKworCisKK3N0YXRpYyB2b2lkIG5hbF91bml0X3BhcnNlX2hlYWRlcihHZXRCaXRDb250ZXh0ICpnYiwgdWludDhfdCAqbmFsX3R5cGUpCit7CisgICAgc2tpcF9iaXRzMShnYik7IC8vIGZvcmJpZGRlbl96ZXJvX2JpdAorCisgICAgKm5hbF90eXBlID0gZ2V0X2JpdHMoZ2IsIDYpOworCisgICAgLyoKKyAgICAgKiBudWhfbGF5ZXJfaWQgICAgICAgICAgdSg2KQorICAgICAqIG51aF90ZW1wb3JhbF9pZF9wbHVzMSB1KDMpCisgICAgICovCisgICAgc2tpcF9iaXRzKGdiLCA5KTsKK30KKworc3RhdGljIGludCBodmNjX2FycmF5X2FkZF9uYWxfdW5pdCh1aW50OF90ICpuYWxfYnVmLCB1aW50MzJfdCBuYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuYWxfdHlwZSwgaW50IHBzX2FycmF5X2NvbXBsZXRlbmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkICpodmNjKQoreworICAgIGludCByZXQ7CisgICAgdWludDhfdCBpbmRleDsKKyAgICB1aW50MTZfdCBudW1OYWx1czsKKyAgICBIVkNDTkFMVW5pdEFycmF5ICphcnJheTsKKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGh2Y2MtPm51bU9mQXJyYXlzOyBpbmRleCsrKQorICAgICAgICBpZiAoaHZjYy0+YXJyYXlbaW5kZXhdLk5BTF91bml0X3R5cGUgPT0gbmFsX3R5cGUpCisgICAgICAgICAgICBicmVhazsKKworICAgIGlmIChpbmRleCA+PSBodmNjLT5udW1PZkFycmF5cykgeworICAgICAgICB1aW50OF90IGk7CisKKyAgICAgICAgcmV0ID0gYXZfcmVhbGxvY3BfYXJyYXkoJmh2Y2MtPmFycmF5LCBpbmRleCArIDEsIHNpemVvZihIVkNDTkFMVW5pdEFycmF5KSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBmb3IgKGkgPSBodmNjLT5udW1PZkFycmF5czsgaSA8PSBpbmRleDsgaSsrKQorICAgICAgICAgICAgbWVtc2V0KCZodmNjLT5hcnJheVtpXSwgMCwgc2l6ZW9mKEhWQ0NOQUxVbml0QXJyYXkpKTsKKyAgICAgICAgaHZjYy0+bnVtT2ZBcnJheXMgPSBpbmRleCArIDE7CisgICAgfQorCisgICAgYXJyYXkgICAgPSAmaHZjYy0+YXJyYXlbaW5kZXhdOworICAgIG51bU5hbHVzID0gYXJyYXktPm51bU5hbHVzOworCisgICAgcmV0ID0gYXZfcmVhbGxvY3BfYXJyYXkoJmFycmF5LT5uYWxVbml0LCBudW1OYWx1cyArIDEsIHNpemVvZih1aW50OF90KikpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gYXZfcmVhbGxvY3BfYXJyYXkoJmFycmF5LT5uYWxVbml0TGVuZ3RoLCBudW1OYWx1cyArIDEsIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXJyYXktPm5hbFVuaXQgICAgICBbbnVtTmFsdXNdID0gbmFsX2J1ZjsKKyAgICBhcnJheS0+bmFsVW5pdExlbmd0aFtudW1OYWx1c10gPSBuYWxfc2l6ZTsKKyAgICBhcnJheS0+TkFMX3VuaXRfdHlwZSAgICAgICAgICAgPSBuYWxfdHlwZTsKKyAgICBhcnJheS0+bnVtTmFsdXMrKzsKKworICAgIC8qCisgICAgICogV2hlbiB0aGUgc2FtcGxlIGVudHJ5IG5hbWUgaXMg4oCYaHZjMeKAmSwgdGhlIGRlZmF1bHQgYW5kIG1hbmRhdG9yeSB2YWx1ZSBvZgorICAgICAqIGFycmF5X2NvbXBsZXRlbmVzcyBpcyAxIGZvciBhcnJheXMgb2YgYWxsIHR5cGVzIG9mIHBhcmFtZXRlciBzZXRzLCBhbmQgMAorICAgICAqIGZvciBhbGwgb3RoZXIgYXJyYXlzLiBXaGVuIHRoZSBzYW1wbGUgZW50cnkgbmFtZSBpcyDigJhoZXYx4oCZLCB0aGUgZGVmYXVsdAorICAgICAqIHZhbHVlIG9mIGFycmF5X2NvbXBsZXRlbmVzcyBpcyAwIGZvciBhbGwgYXJyYXlzLgorICAgICAqLworICAgIGlmIChuYWxfdHlwZSA9PSBOQUxfVlBTIHx8IG5hbF90eXBlID09IE5BTF9TUFMgfHwgbmFsX3R5cGUgPT0gTkFMX1BQUykKKyAgICAgICAgYXJyYXktPmFycmF5X2NvbXBsZXRlbmVzcyA9IHBzX2FycmF5X2NvbXBsZXRlbmVzczsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh2Y2NfYWRkX25hbF91bml0KHVpbnQ4X3QgKm5hbF9idWYsIHVpbnQzMl90IG5hbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHNfYXJyYXlfY29tcGxldGVuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQgKmh2Y2MpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgR2V0Qml0Q29udGV4dCBnYmM7CisgICAgdWludDhfdCBuYWxfdHlwZTsKKyAgICB1aW50OF90ICpyYnNwX2J1ZjsKKyAgICB1aW50MzJfdCByYnNwX3NpemU7CisKKyAgICByYnNwX2J1ZiA9IG5hbF91bml0X2V4dHJhY3RfcmJzcChuYWxfYnVmLCBuYWxfc2l6ZSwgJnJic3Bfc2l6ZSk7CisgICAgaWYgKCFyYnNwX2J1ZikgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIHJldCA9IGluaXRfZ2V0X2JpdHM4KCZnYmMsIHJic3BfYnVmLCByYnNwX3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIG5hbF91bml0X3BhcnNlX2hlYWRlcigmZ2JjLCAmbmFsX3R5cGUpOworCisgICAgLyoKKyAgICAgKiBOb3RlOiBvbmx5ICdkZWNsYXJhdGl2ZScgU0VJIG1lc3NhZ2VzIGFyZSBhbGxvd2VkIGluCisgICAgICogaHZjQy4gUGVyaGFwcyB0aGUgU0VJIHBsYXlsb2FkIHR5cGUgc2hvdWxkIGJlIGNoZWNrZWQKKyAgICAgKiBhbmQgbm9uLWRlY2xhcmF0aXZlIFNFSSBtZXNzYWdlcyBkaXNjYXJkZWQ/CisgICAgICovCisgICAgc3dpdGNoIChuYWxfdHlwZSkgeworICAgIGNhc2UgTkFMX1ZQUzoKKyAgICBjYXNlIE5BTF9TUFM6CisgICAgY2FzZSBOQUxfUFBTOgorICAgIGNhc2UgTkFMX1NFSV9QUkVGSVg6CisgICAgY2FzZSBOQUxfU0VJX1NVRkZJWDoKKyAgICAgICAgcmV0ID0gaHZjY19hcnJheV9hZGRfbmFsX3VuaXQobmFsX2J1ZiwgbmFsX3NpemUsIG5hbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19hcnJheV9jb21wbGV0ZW5lc3MsIGh2Y2MpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBlbHNlIGlmIChuYWxfdHlwZSA9PSBOQUxfVlBTKQorICAgICAgICAgICAgcmV0ID0gaHZjY19wYXJzZV92cHMoJmdiYywgaHZjYyk7CisgICAgICAgIGVsc2UgaWYgKG5hbF90eXBlID09IE5BTF9TUFMpCisgICAgICAgICAgICByZXQgPSBodmNjX3BhcnNlX3NwcygmZ2JjLCBodmNjKTsKKyAgICAgICAgZWxzZSBpZiAobmFsX3R5cGUgPT0gTkFMX1BQUykKKyAgICAgICAgICAgIHJldCA9IGh2Y2NfcGFyc2VfcHBzKCZnYmMsIGh2Y2MpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKK2VuZDoKKyAgICBhdl9mcmVlKHJic3BfYnVmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBodmNjX2luaXQoSEVWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkICpodmNjKQoreworICAgIG1lbXNldChodmNjLCAwLCBzaXplb2YoSEVWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkKSk7CisgICAgaHZjYy0+Y29uZmlndXJhdGlvblZlcnNpb24gPSAxOworICAgIGh2Y2MtPmxlbmd0aFNpemVNaW51c09uZSAgID0gMzsgLy8gNCBieXRlcworCisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBoYXZlIGFsbCB0aGVpciB2YWxpZCBiaXRzIHNldCBieSBkZWZhdWx0LAorICAgICAqIHRoZSBQcm9maWxlVGllckxldmVsIHBhcnNpbmcgY29kZSB3aWxsIHVuc2V0IHRoZW0gd2hlbiBuZWVkZWQuCisgICAgICovCisgICAgaHZjYy0+Z2VuZXJhbF9wcm9maWxlX2NvbXBhdGliaWxpdHlfZmxhZ3MgPSAweGZmZmZmZmZmOworICAgIGh2Y2MtPmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JfZmxhZ3MgID0gMHhmZmZmZmZmZmZmZmY7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemUgdGhpcyBmaWVsZCB3aXRoIGFuIGludmFsaWQgdmFsdWUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGV0ZWN0CisgICAgICogd2hldGhlciB3ZSBkaWRuJ3Qgc2VlIGFueSBWVUkgKGluIHdoaWNoIGNhc2UgaXQgc2hvdWxkIGJlIHJlc2V0IHRvIHplcm8pLgorICAgICAqLworICAgIGh2Y2MtPm1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGMgPSBNQVhfU1BBVElBTF9TRUdNRU5UQVRJT04gKyAxOworfQorCitzdGF0aWMgdm9pZCBodmNjX2Nsb3NlKEhFVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCAqaHZjYykKK3sKKyAgICB1aW50OF90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaHZjYy0+bnVtT2ZBcnJheXM7IGkrKykgeworICAgICAgICBodmNjLT5hcnJheVtpXS5udW1OYWx1cyA9IDA7CisgICAgICAgIGF2X2ZyZWVwKCZodmNjLT5hcnJheVtpXS5uYWxVbml0KTsKKyAgICAgICAgYXZfZnJlZXAoJmh2Y2MtPmFycmF5W2ldLm5hbFVuaXRMZW5ndGgpOworICAgIH0KKworICAgIGh2Y2MtPm51bU9mQXJyYXlzID0gMDsKKyAgICBhdl9mcmVlcCgmaHZjYy0+YXJyYXkpOworfQorCitzdGF0aWMgaW50IGh2Y2Nfd3JpdGUoQVZJT0NvbnRleHQgKnBiLCBIRVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQgKmh2Y2MpCit7CisgICAgdWludDhfdCBpOworICAgIHVpbnQxNl90IGosIHZwc19jb3VudCA9IDAsIHNwc19jb3VudCA9IDAsIHBwc19jb3VudCA9IDA7CisKKyAgICAvKgorICAgICAqIFdlIG9ubHkgc3VwcG9ydCB3cml0aW5nIEhFVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCB2ZXJzaW9uIDEuCisgICAgICovCisgICAgaHZjYy0+Y29uZmlndXJhdGlvblZlcnNpb24gPSAxOworCisgICAgLyoKKyAgICAgKiBJZiBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjIGlzIGludmFsaWQsIHJlc2V0IHRvIDAgKHVuc3BlY2lmaWVkKS4KKyAgICAgKi8KKyAgICBpZiAoaHZjYy0+bWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYyA+IE1BWF9TUEFUSUFMX1NFR01FTlRBVElPTikKKyAgICAgICAgaHZjYy0+bWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYyA9IDA7CisKKyAgICAvKgorICAgICAqIHBhcmFsbGVsaXNtVHlwZSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgcGFyYWxsZWxpc20gdGhhdCBpcyB1c2VkIHRvIG1lZXQKKyAgICAgKiB0aGUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgbWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYyB3aGVuIHRoZSB2YWx1ZQorICAgICAqIG9mIG1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGMgaXMgZ3JlYXRlciB0aGFuIDAuCisgICAgICovCisgICAgaWYgKCFodmNjLT5taW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjKQorICAgICAgICBodmNjLT5wYXJhbGxlbGlzbVR5cGUgPSAwOworCisgICAgLyoKKyAgICAgKiBJdCdzIHVuY2xlYXIgaG93IHRvIHByb3Blcmx5IGNvbXB1dGUgdGhlc2UgZmllbGRzLCBzbworICAgICAqIGxldCdzIGFsd2F5cyBzZXQgdGhlbSB0byB2YWx1ZXMgbWVhbmluZyAndW5zcGVjaWZpZWQnLgorICAgICAqLworICAgIGh2Y2MtPmF2Z0ZyYW1lUmF0ZSAgICAgID0gMDsKKyAgICBodmNjLT5jb25zdGFudEZyYW1lUmF0ZSA9IDA7CisKKyAgICBhdl9kbG9nKE5VTEwsICAiY29uZmlndXJhdGlvblZlcnNpb246ICAgICAgICAgICAgICAgICUiUFJJdTgiXG4iLAorICAgICAgICAgICAgaHZjYy0+Y29uZmlndXJhdGlvblZlcnNpb24pOworICAgIGF2X2Rsb2coTlVMTCwgICJnZW5lcmFsX3Byb2ZpbGVfc3BhY2U6ICAgICAgICAgICAgICAgJSJQUkl1OCJcbiIsCisgICAgICAgICAgICBodmNjLT5nZW5lcmFsX3Byb2ZpbGVfc3BhY2UpOworICAgIGF2X2Rsb2coTlVMTCwgICJnZW5lcmFsX3RpZXJfZmxhZzogICAgICAgICAgICAgICAgICAgJSJQUkl1OCJcbiIsCisgICAgICAgICAgICBodmNjLT5nZW5lcmFsX3RpZXJfZmxhZyk7CisgICAgYXZfZGxvZyhOVUxMLCAgImdlbmVyYWxfcHJvZmlsZV9pZGM6ICAgICAgICAgICAgICAgICAlIlBSSXU4IlxuIiwKKyAgICAgICAgICAgIGh2Y2MtPmdlbmVyYWxfcHJvZmlsZV9pZGMpOworICAgIGF2X2Rsb2coTlVMTCwgImdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzOiAweCUwOCJQUkl4MzIiXG4iLAorICAgICAgICAgICAgaHZjYy0+Z2VuZXJhbF9wcm9maWxlX2NvbXBhdGliaWxpdHlfZmxhZ3MpOworICAgIGF2X2Rsb2coTlVMTCwgImdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JfZmxhZ3M6ICAweCUwMTIiUFJJeDY0IlxuIiwKKyAgICAgICAgICAgIGh2Y2MtPmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JfZmxhZ3MpOworICAgIGF2X2Rsb2coTlVMTCwgICJnZW5lcmFsX2xldmVsX2lkYzogICAgICAgICAgICAgICAgICAgJSJQUkl1OCJcbiIsCisgICAgICAgICAgICBodmNjLT5nZW5lcmFsX2xldmVsX2lkYyk7CisgICAgYXZfZGxvZyhOVUxMLCAgIm1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGM6ICAgICAgICAlIlBSSXUxNiJcbiIsCisgICAgICAgICAgICBodmNjLT5taW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjKTsKKyAgICBhdl9kbG9nKE5VTEwsICAicGFyYWxsZWxpc21UeXBlOiAgICAgICAgICAgICAgICAgICAgICUiUFJJdTgiXG4iLAorICAgICAgICAgICAgaHZjYy0+cGFyYWxsZWxpc21UeXBlKTsKKyAgICBhdl9kbG9nKE5VTEwsICAiY2hyb21hRm9ybWF0OiAgICAgICAgICAgICAgICAgICAgICAgICUiUFJJdTgiXG4iLAorICAgICAgICAgICAgaHZjYy0+Y2hyb21hRm9ybWF0KTsKKyAgICBhdl9kbG9nKE5VTEwsICAiYml0RGVwdGhMdW1hTWludXM4OiAgICAgICAgICAgICAgICAgICUiUFJJdTgiXG4iLAorICAgICAgICAgICAgaHZjYy0+Yml0RGVwdGhMdW1hTWludXM4KTsKKyAgICBhdl9kbG9nKE5VTEwsICAiYml0RGVwdGhDaHJvbWFNaW51czg6ICAgICAgICAgICAgICAgICUiUFJJdTgiXG4iLAorICAgICAgICAgICAgaHZjYy0+Yml0RGVwdGhDaHJvbWFNaW51czgpOworICAgIGF2X2Rsb2coTlVMTCwgICJhdmdGcmFtZVJhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgJSJQUkl1MTYiXG4iLAorICAgICAgICAgICAgaHZjYy0+YXZnRnJhbWVSYXRlKTsKKyAgICBhdl9kbG9nKE5VTEwsICAiY29uc3RhbnRGcmFtZVJhdGU6ICAgICAgICAgICAgICAgICAgICUiUFJJdTgiXG4iLAorICAgICAgICAgICAgaHZjYy0+Y29uc3RhbnRGcmFtZVJhdGUpOworICAgIGF2X2Rsb2coTlVMTCwgICJudW1UZW1wb3JhbExheWVyczogICAgICAgICAgICAgICAgICAgJSJQUkl1OCJcbiIsCisgICAgICAgICAgICBodmNjLT5udW1UZW1wb3JhbExheWVycyk7CisgICAgYXZfZGxvZyhOVUxMLCAgInRlbXBvcmFsSWROZXN0ZWQ6ICAgICAgICAgICAgICAgICAgICAlIlBSSXU4IlxuIiwKKyAgICAgICAgICAgIGh2Y2MtPnRlbXBvcmFsSWROZXN0ZWQpOworICAgIGF2X2Rsb2coTlVMTCwgICJsZW5ndGhTaXplTWludXNPbmU6ICAgICAgICAgICAgICAgICAgJSJQUkl1OCJcbiIsCisgICAgICAgICAgICBodmNjLT5sZW5ndGhTaXplTWludXNPbmUpOworICAgIGF2X2Rsb2coTlVMTCwgICJudW1PZkFycmF5czogICAgICAgICAgICAgICAgICAgICAgICAgJSJQUkl1OCJcbiIsCisgICAgICAgICAgICBodmNjLT5udW1PZkFycmF5cyk7CisgICAgZm9yIChpID0gMDsgaSA8IGh2Y2MtPm51bU9mQXJyYXlzOyBpKyspIHsKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiYXJyYXlfY29tcGxldGVuZXNzWyUiUFJJdTgiXTogICAgICAgICAgICAgICAlIlBSSXU4IlxuIiwKKyAgICAgICAgICAgICAgICBpLCBodmNjLT5hcnJheVtpXS5hcnJheV9jb21wbGV0ZW5lc3MpOworICAgICAgICBhdl9kbG9nKE5VTEwsICJOQUxfdW5pdF90eXBlWyUiUFJJdTgiXTogICAgICAgICAgICAgICAgICAgICUiUFJJdTgiXG4iLAorICAgICAgICAgICAgICAgIGksIGh2Y2MtPmFycmF5W2ldLk5BTF91bml0X3R5cGUpOworICAgICAgICBhdl9kbG9nKE5VTEwsICJudW1OYWx1c1slIlBSSXU4Il06ICAgICAgICAgICAgICAgICAgICAgICAgICUiUFJJdTE2IlxuIiwKKyAgICAgICAgICAgICAgICBpLCBodmNjLT5hcnJheVtpXS5udW1OYWx1cyk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBodmNjLT5hcnJheVtpXS5udW1OYWx1czsgaisrKQorICAgICAgICAgICAgYXZfZGxvZyhOVUxMLAorICAgICAgICAgICAgICAgICAgICAibmFsVW5pdExlbmd0aFslIlBSSXU4Il1bJSJQUkl1MTYiXTogICAgICAgICAgICAgICAgICUiUFJJdTE2IlxuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgaiwgaHZjYy0+YXJyYXlbaV0ubmFsVW5pdExlbmd0aFtqXSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXZSBuZWVkIGF0IGxlYXN0IG9uZSBvZiBlYWNoOiBWUFMsIFNQUyBhbmQgUFBTLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBodmNjLT5udW1PZkFycmF5czsgaSsrKQorICAgICAgICBzd2l0Y2ggKGh2Y2MtPmFycmF5W2ldLk5BTF91bml0X3R5cGUpIHsKKyAgICAgICAgY2FzZSBOQUxfVlBTOgorICAgICAgICAgICAgdnBzX2NvdW50ICs9IGh2Y2MtPmFycmF5W2ldLm51bU5hbHVzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkFMX1NQUzoKKyAgICAgICAgICAgIHNwc19jb3VudCArPSBodmNjLT5hcnJheVtpXS5udW1OYWx1czsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5BTF9QUFM6CisgICAgICAgICAgICBwcHNfY291bnQgKz0gaHZjYy0+YXJyYXlbaV0ubnVtTmFsdXM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgaWYgKCF2cHNfY291bnQgfHwgdnBzX2NvdW50ID4gTUFYX1ZQU19DT1VOVCB8fAorICAgICAgICAhc3BzX2NvdW50IHx8IHNwc19jb3VudCA+IE1BWF9TUFNfQ09VTlQgfHwKKyAgICAgICAgIXBwc19jb3VudCB8fCBwcHNfY291bnQgPiBNQVhfUFBTX0NPVU5UKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIHVuc2lnbmVkIGludCg4KSBjb25maWd1cmF0aW9uVmVyc2lvbiA9IDE7ICovCisgICAgYXZpb193OChwYiwgaHZjYy0+Y29uZmlndXJhdGlvblZlcnNpb24pOworCisgICAgLyoKKyAgICAgKiB1bnNpZ25lZCBpbnQoMikgZ2VuZXJhbF9wcm9maWxlX3NwYWNlOworICAgICAqIHVuc2lnbmVkIGludCgxKSBnZW5lcmFsX3RpZXJfZmxhZzsKKyAgICAgKiB1bnNpZ25lZCBpbnQoNSkgZ2VuZXJhbF9wcm9maWxlX2lkYzsKKyAgICAgKi8KKyAgICBhdmlvX3c4KHBiLCBodmNjLT5nZW5lcmFsX3Byb2ZpbGVfc3BhY2UgPDwgNiB8CisgICAgICAgICAgICAgICAgaHZjYy0+Z2VuZXJhbF90aWVyX2ZsYWcgICAgIDw8IDUgfAorICAgICAgICAgICAgICAgIGh2Y2MtPmdlbmVyYWxfcHJvZmlsZV9pZGMpOworCisgICAgLyogdW5zaWduZWQgaW50KDMyKSBnZW5lcmFsX3Byb2ZpbGVfY29tcGF0aWJpbGl0eV9mbGFnczsgKi8KKyAgICBhdmlvX3diMzIocGIsIGh2Y2MtPmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzKTsKKworICAgIC8qIHVuc2lnbmVkIGludCg0OCkgZ2VuZXJhbF9jb25zdHJhaW50X2luZGljYXRvcl9mbGFnczsgKi8KKyAgICBhdmlvX3diMzIocGIsIGh2Y2MtPmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JfZmxhZ3MgPj4gMTYpOworICAgIGF2aW9fd2IxNihwYiwgaHZjYy0+Z2VuZXJhbF9jb25zdHJhaW50X2luZGljYXRvcl9mbGFncyk7CisKKyAgICAvKiB1bnNpZ25lZCBpbnQoOCkgZ2VuZXJhbF9sZXZlbF9pZGM7ICovCisgICAgYXZpb193OChwYiwgaHZjYy0+Z2VuZXJhbF9sZXZlbF9pZGMpOworCisgICAgLyoKKyAgICAgKiBiaXQoNCkgcmVzZXJ2ZWQgPSDigJgxMTEx4oCZYjsKKyAgICAgKiB1bnNpZ25lZCBpbnQoMTIpIG1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGM7CisgICAgICovCisgICAgYXZpb193YjE2KHBiLCBodmNjLT5taW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjIHwgMHhmMDAwKTsKKworICAgIC8qCisgICAgICogYml0KDYpIHJlc2VydmVkID0g4oCYMTExMTEx4oCZYjsKKyAgICAgKiB1bnNpZ25lZCBpbnQoMikgcGFyYWxsZWxpc21UeXBlOworICAgICAqLworICAgIGF2aW9fdzgocGIsIGh2Y2MtPnBhcmFsbGVsaXNtVHlwZSB8IDB4ZmMpOworCisgICAgLyoKKyAgICAgKiBiaXQoNikgcmVzZXJ2ZWQgPSDigJgxMTExMTHigJliOworICAgICAqIHVuc2lnbmVkIGludCgyKSBjaHJvbWFGb3JtYXQ7CisgICAgICovCisgICAgYXZpb193OChwYiwgaHZjYy0+Y2hyb21hRm9ybWF0IHwgMHhmYyk7CisKKyAgICAvKgorICAgICAqIGJpdCg1KSByZXNlcnZlZCA9IOKAmDExMTEx4oCZYjsKKyAgICAgKiB1bnNpZ25lZCBpbnQoMykgYml0RGVwdGhMdW1hTWludXM4OworICAgICAqLworICAgIGF2aW9fdzgocGIsIGh2Y2MtPmJpdERlcHRoTHVtYU1pbnVzOCB8IDB4ZjgpOworCisgICAgLyoKKyAgICAgKiBiaXQoNSkgcmVzZXJ2ZWQgPSDigJgxMTExMeKAmWI7CisgICAgICogdW5zaWduZWQgaW50KDMpIGJpdERlcHRoQ2hyb21hTWludXM4OworICAgICAqLworICAgIGF2aW9fdzgocGIsIGh2Y2MtPmJpdERlcHRoQ2hyb21hTWludXM4IHwgMHhmOCk7CisKKyAgICAvKiBiaXQoMTYpIGF2Z0ZyYW1lUmF0ZTsgKi8KKyAgICBhdmlvX3diMTYocGIsIGh2Y2MtPmF2Z0ZyYW1lUmF0ZSk7CisKKyAgICAvKgorICAgICAqIGJpdCgyKSBjb25zdGFudEZyYW1lUmF0ZTsKKyAgICAgKiBiaXQoMykgbnVtVGVtcG9yYWxMYXllcnM7CisgICAgICogYml0KDEpIHRlbXBvcmFsSWROZXN0ZWQ7CisgICAgICogdW5zaWduZWQgaW50KDIpIGxlbmd0aFNpemVNaW51c09uZTsKKyAgICAgKi8KKyAgICBhdmlvX3c4KHBiLCBodmNjLT5jb25zdGFudEZyYW1lUmF0ZSA8PCA2IHwKKyAgICAgICAgICAgICAgICBodmNjLT5udW1UZW1wb3JhbExheWVycyA8PCAzIHwKKyAgICAgICAgICAgICAgICBodmNjLT50ZW1wb3JhbElkTmVzdGVkICA8PCAyIHwKKyAgICAgICAgICAgICAgICBodmNjLT5sZW5ndGhTaXplTWludXNPbmUpOworCisgICAgLyogdW5zaWduZWQgaW50KDgpIG51bU9mQXJyYXlzOyAqLworICAgIGF2aW9fdzgocGIsIGh2Y2MtPm51bU9mQXJyYXlzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBodmNjLT5udW1PZkFycmF5czsgaSsrKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIGJpdCgxKSBhcnJheV9jb21wbGV0ZW5lc3M7CisgICAgICAgICAqIHVuc2lnbmVkIGludCgxKSByZXNlcnZlZCA9IDA7CisgICAgICAgICAqIHVuc2lnbmVkIGludCg2KSBOQUxfdW5pdF90eXBlOworICAgICAgICAgKi8KKyAgICAgICAgYXZpb193OChwYiwgaHZjYy0+YXJyYXlbaV0uYXJyYXlfY29tcGxldGVuZXNzIDw8IDcgfAorICAgICAgICAgICAgICAgICAgICBodmNjLT5hcnJheVtpXS5OQUxfdW5pdF90eXBlICYgMHgzZik7CisKKyAgICAgICAgLyogdW5zaWduZWQgaW50KDE2KSBudW1OYWx1czsgKi8KKyAgICAgICAgYXZpb193YjE2KHBiLCBodmNjLT5hcnJheVtpXS5udW1OYWx1cyk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGh2Y2MtPmFycmF5W2ldLm51bU5hbHVzOyBqKyspIHsKKyAgICAgICAgICAgIC8qIHVuc2lnbmVkIGludCgxNikgbmFsVW5pdExlbmd0aDsgKi8KKyAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgaHZjYy0+YXJyYXlbaV0ubmFsVW5pdExlbmd0aFtqXSk7CisKKyAgICAgICAgICAgIC8qIGJpdCg4Km5hbFVuaXRMZW5ndGgpIG5hbFVuaXQ7ICovCisgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBodmNjLT5hcnJheVtpXS5uYWxVbml0W2pdLAorICAgICAgICAgICAgICAgICAgICAgICBodmNjLT5hcnJheVtpXS5uYWxVbml0TGVuZ3RoW2pdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfaGV2Y19hbm5leGIybXA0KEFWSU9Db250ZXh0ICpwYiwgY29uc3QgdWludDhfdCAqYnVmX2luLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGZpbHRlcl9wcywgaW50ICpwc19jb3VudCkKK3sKKyAgICBpbnQgbnVtX3BzID0gMCwgcmV0ID0gMDsKKyAgICB1aW50OF90ICpidWYsICplbmQsICpzdGFydCA9IE5VTEw7CisKKyAgICBpZiAoIWZpbHRlcl9wcykgeworICAgICAgICByZXQgPSBmZl9hdmNfcGFyc2VfbmFsX3VuaXRzKHBiLCBidWZfaW4sIHNpemUpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICByZXQgPSBmZl9hdmNfcGFyc2VfbmFsX3VuaXRzX2J1ZihidWZfaW4sICZzdGFydCwgJnNpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIHJldCA9IDA7CisgICAgYnVmID0gc3RhcnQ7CisgICAgZW5kID0gc3RhcnQgKyBzaXplOworCisgICAgd2hpbGUgKGVuZCAtIGJ1ZiA+IDQpIHsKKyAgICAgICAgdWludDMyX3QgbGVuID0gRkZNSU4oQVZfUkIzMihidWYpLCBlbmQgLSBidWYgLSA0KTsKKyAgICAgICAgdWludDhfdCB0eXBlID0gKGJ1Zls0XSA+PiAxKSAmIDB4M2Y7CisKKyAgICAgICAgYnVmICs9IDQ7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTkFMX1ZQUzoKKyAgICAgICAgY2FzZSBOQUxfU1BTOgorICAgICAgICBjYXNlIE5BTF9QUFM6CisgICAgICAgICAgICBudW1fcHMrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ICs9IDQgKyBsZW47CisgICAgICAgICAgICBhdmlvX3diMzIocGIsIGxlbik7CisgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBidWYsIGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZiArPSBsZW47CisgICAgfQorCitlbmQ6CisgICAgYXZfZnJlZShzdGFydCk7CisgICAgaWYgKHBzX2NvdW50KQorICAgICAgICAqcHNfY291bnQgPSBudW1fcHM7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX2hldmNfYW5uZXhiMm1wNF9idWYoY29uc3QgdWludDhfdCAqYnVmX2luLCB1aW50OF90ICoqYnVmX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2l6ZSwgaW50IGZpbHRlcl9wcywgaW50ICpwc19jb3VudCkKK3sKKyAgICBBVklPQ29udGV4dCAqcGI7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZwYik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgICA9IGZmX2hldmNfYW5uZXhiMm1wNChwYiwgYnVmX2luLCAqc2l6ZSwgZmlsdGVyX3BzLCBwc19jb3VudCk7CisgICAgKnNpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYocGIsIGJ1Zl9vdXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX2lzb21fd3JpdGVfaHZjYyhBVklPQ29udGV4dCAqcGIsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgcHNfYXJyYXlfY29tcGxldGVuZXNzKQoreworICAgIGludCByZXQgPSAwOworICAgIHVpbnQ4X3QgKmJ1ZiwgKmVuZCwgKnN0YXJ0ID0gTlVMTDsKKyAgICBIRVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQgaHZjYzsKKworICAgIGh2Y2NfaW5pdCgmaHZjYyk7CisKKyAgICBpZiAoc2l6ZSA8IDYpIHsKKyAgICAgICAgLyogV2UgY2FuJ3Qgd3JpdGUgYSB2YWxpZCBodmNDIGZyb20gdGhlIHByb3ZpZGVkIGRhdGEgKi8KKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfSBlbHNlIGlmICgqZGF0YSA9PSAxKSB7CisgICAgICAgIC8qIERhdGEgaXMgYWxyZWFkeSBodmNDLWZvcm1hdHRlZCAqLworICAgICAgICBhdmlvX3dyaXRlKHBiLCBkYXRhLCBzaXplKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfSBlbHNlIGlmICghKEFWX1JCMjQoZGF0YSkgPT0gMSB8fCBBVl9SQjMyKGRhdGEpID09IDEpKSB7CisgICAgICAgIC8qIE5vdCBhIHZhbGlkIEFubmV4IEIgc3RhcnQgY29kZSBwcmVmaXggKi8KKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgcmV0ID0gZmZfYXZjX3BhcnNlX25hbF91bml0c19idWYoZGF0YSwgJnN0YXJ0LCAmc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgYnVmID0gc3RhcnQ7CisgICAgZW5kID0gc3RhcnQgKyBzaXplOworCisgICAgd2hpbGUgKGVuZCAtIGJ1ZiA+IDQpIHsKKyAgICAgICAgdWludDMyX3QgbGVuID0gRkZNSU4oQVZfUkIzMihidWYpLCBlbmQgLSBidWYgLSA0KTsKKyAgICAgICAgdWludDhfdCB0eXBlID0gKGJ1Zls0XSA+PiAxKSAmIDB4M2Y7CisKKyAgICAgICAgYnVmICs9IDQ7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTkFMX1ZQUzoKKyAgICAgICAgY2FzZSBOQUxfU1BTOgorICAgICAgICBjYXNlIE5BTF9QUFM6CisgICAgICAgIGNhc2UgTkFMX1NFSV9QUkVGSVg6CisgICAgICAgIGNhc2UgTkFMX1NFSV9TVUZGSVg6CisgICAgICAgICAgICByZXQgPSBodmNjX2FkZF9uYWxfdW5pdChidWYsIGxlbiwgcHNfYXJyYXlfY29tcGxldGVuZXNzLCAmaHZjYyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBidWYgKz0gbGVuOworICAgIH0KKworICAgIHJldCA9IGh2Y2Nfd3JpdGUocGIsICZodmNjKTsKKworZW5kOgorICAgIGh2Y2NfY2xvc2UoJmh2Y2MpOworICAgIGF2X2ZyZWUoc3RhcnQpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaGV2Yy5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2hldmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTZlYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2hldmMuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRpbSBXYWxrZXIgPHRkc2t5d2Fsa2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaW50ZXJuYWwgaGVhZGVyIGZvciBIRVZDIChkZSltdXhlciB1dGlsaXRpZXMKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX0hFVkNfSAorI2RlZmluZSBBVkZPUk1BVF9IRVZDX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImF2aW8uaCIKKworLyoqCisgKiBXcml0ZXMgQW5uZXggQiBmb3JtYXR0ZWQgSEVWQyBOQUwgdW5pdHMgdG8gdGhlIHByb3ZpZGVkIEFWSU9Db250ZXh0LgorICoKKyAqIFRoZSBOQUwgdW5pdHMgYXJlIGNvbnZlcnRlZCB0byBhbiBNUDQtY29tcGF0aWJsZSBmb3JtYXQgKHN0YXJ0IGNvZGUgcHJlZml4ZXMKKyAqIGFyZSByZXBsYWNlZCBieSA0LWJ5dGUgc2l6ZSBmaWVsZHMsIGFzIHBlciBJU08vSUVDIDE0NDk2LTE1KS4KKyAqCisgKiBJZiBmaWx0ZXJfcHMgaXMgbm9uLXplcm8sIGFueSBIRVZDIHBhcmFtZXRlciBzZXRzIGZvdW5kIGluIHRoZSBpbnB1dCB3aWxsIGJlCisgKiBkaXNjYXJkZWQsIGFuZCAqcHNfY291bnQgd2lsbCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZiBkaXNjYXJkZWQgUFMgTkFMIHVuaXRzLgorICoKKyAqIEBwYXJhbSBwYiBhZGRyZXNzIG9mIHRoZSBBVklPQ29udGV4dCB3aGVyZSB0aGUgZGF0YSBzaGFsbCBiZSB3cml0dGVuCisgKiBAcGFyYW0gYnVmX2luIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBob2xkaW5nIHRoZSBpbnB1dCBkYXRhCisgKiBAcGFyYW0gc2l6ZSBzaXplIChpbiBieXRlcykgb2YgdGhlIGlucHV0IGJ1ZmZlcgorICogQHBhcmFtIGZpbHRlcl9wcyB3aGV0aGVyIHRvIHdyaXRlIHBhcmFtZXRlciBzZXQgTkFMIHVuaXRzIHRvIHRoZSBvdXRwdXQgKDApCisgKiAgICAgICAgb3IgdG8gZGlzY2FyZCB0aGVtIChub24temVybykKKyAqIEBwYXJhbSBwc19jb3VudCBhZGRyZXNzIG9mIHRoZSB2YXJpYWJsZSB3aGVyZSB0aGUgbnVtYmVyIG9mIGRpc2NhcmRlZAorICogICAgICAgIHBhcmFtZXRlciBzZXQgTkFMIHVuaXRzIHNoYWxsIGJlIHdyaXR0ZW4sIG1heSBiZSBOVUxMCisgKiBAcmV0dXJuIHRoZSBhbW91bnQgKGluIGJ5dGVzKSBvZiBkYXRhIHdyaXR0ZW4gaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlCisgKiAgICAgICAgIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4gQVZFUlJPUiBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgZmZfaGV2Y19hbm5leGIybXA0KEFWSU9Db250ZXh0ICpwYiwgY29uc3QgdWludDhfdCAqYnVmX2luLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGZpbHRlcl9wcywgaW50ICpwc19jb3VudCk7CisKKy8qKgorICogV3JpdGVzIEFubmV4IEIgZm9ybWF0dGVkIEhFVkMgTkFMIHVuaXRzIHRvIGEgZGF0YSBidWZmZXIuCisgKgorICogVGhlIE5BTCB1bml0cyBhcmUgY29udmVydGVkIHRvIGFuIE1QNC1jb21wYXRpYmxlIGZvcm1hdCAoc3RhcnQgY29kZSBwcmVmaXhlcworICogYXJlIHJlcGxhY2VkIGJ5IDQtYnl0ZSBzaXplIGZpZWxkcywgYXMgcGVyIElTTy9JRUMgMTQ0OTYtMTUpLgorICoKKyAqIElmIGZpbHRlcl9wcyBpcyBub24temVybywgYW55IEhFVkMgcGFyYW1ldGVyIHNldHMgZm91bmQgaW4gdGhlIGlucHV0IHdpbGwgYmUKKyAqIGRpc2NhcmRlZCwgYW5kICpwc19jb3VudCB3aWxsIGJlIHNldCB0byB0aGUgbnVtYmVyIG9mIGRpc2NhcmRlZCBQUyBOQUwgdW5pdHMuCisgKgorICogT24gb3V0cHV0LCAqc2l6ZSBob2xkcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXIuCisgKgorICogQHBhcmFtIGJ1Zl9pbiBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaG9sZGluZyB0aGUgaW5wdXQgZGF0YQorICogQHBhcmFtIHNpemUgYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUgaG9sZGluZyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBpbnB1dAorICogICAgICAgIGJ1ZmZlciAob24gaW5wdXQpIGFuZCBvZiB0aGUgb3V0cHV0IGJ1ZmZlciAob24gb3V0cHV0KQorICogQHBhcmFtIGJ1Zl9vdXQgYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUgaG9sZGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgb3V0cHV0CisgKiAgICAgICAgYnVmZmVyCisgKiBAcGFyYW0gZmlsdGVyX3BzIHdoZXRoZXIgdG8gd3JpdGUgcGFyYW1ldGVyIHNldCBOQUwgdW5pdHMgdG8gdGhlIG91dHB1dCAoMCkKKyAqICAgICAgICBvciB0byBkaXNjYXJkIHRoZW0gKG5vbi16ZXJvKQorICogQHBhcmFtIHBzX2NvdW50IGFkZHJlc3Mgb2YgdGhlIHZhcmlhYmxlIHdoZXJlIHRoZSBudW1iZXIgb2YgZGlzY2FyZGVkCisgKiAgICAgICAgcGFyYW1ldGVyIHNldCBOQUwgdW5pdHMgc2hhbGwgYmUgd3JpdHRlbiwgbWF5IGJlIE5VTEwKKyAqIEByZXR1cm4gdGhlIGFtb3VudCAoaW4gYnl0ZXMpIG9mIGRhdGEgd3JpdHRlbiBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUKKyAqICAgICAgICAgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbiBBVkVSUk9SIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCBmZl9oZXZjX2FubmV4YjJtcDRfYnVmKGNvbnN0IHVpbnQ4X3QgKmJ1Zl9pbiwgdWludDhfdCAqKmJ1Zl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNpemUsIGludCBmaWx0ZXJfcHMsIGludCAqcHNfY291bnQpOworCisvKioKKyAqIFdyaXRlcyBIRVZDIGV4dHJhZGF0YSAocGFyYW1ldGVyIHNldHMsIGRlY2xhcmF0aXZlIFNFSSBOQUwgdW5pdHMpIHRvIHRoZQorICogcHJvdmlkZWQgQVZJT0NvbnRleHQuCisgKgorICogSWYgdGhlIGV4dHJhZGF0YSBpcyBBbm5leCBCIGZvcm1hdCwgaXQgZ2V0cyBjb252ZXJ0ZWQgdG8gaHZjQyBmb3JtYXQgYmVmb3JlCisgKiB3cml0aW5nLgorICoKKyAqIEBwYXJhbSBwYiBhZGRyZXNzIG9mIHRoZSBBVklPQ29udGV4dCB3aGVyZSB0aGUgaHZjQyBzaGFsbCBiZSB3cml0dGVuCisgKiBAcGFyYW0gZGF0YSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaG9sZGluZyB0aGUgZGF0YSBuZWVkZWQgdG8gd3JpdGUgdGhlIGh2Y0MKKyAqIEBwYXJhbSBzaXplIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgZGF0YSBidWZmZXIKKyAqIEBwYXJhbSBwc19hcnJheV9jb21wbGV0ZW5lc3Mgd2hldGhlciBhbGwgcGFyYW1ldGVyIHNldHMgYXJlIGluIHRoZSBodmNDICgxKQorICogICAgICAgIG9yIHRoZXJlIG1heSBiZSBhZGRpdGlvbmFsIHBhcmFtZXRlciBzZXRzIGluIHRoZSBiaXRzdHJlYW0gKDApCisgKiBAcmV0dXJuID49MCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbiBBVkVSUk9SCisgKiAgICAgICAgIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCBmZl9pc29tX3dyaXRlX2h2Y2MoQVZJT0NvbnRleHQgKnBiLCBjb25zdCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IHBzX2FycmF5X2NvbXBsZXRlbmVzcyk7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9IRVZDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9oZXZjZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvaGV2Y2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNmEwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaGV2Y2RlYy5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBSQVcgSEVWQyB2aWRlbyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgRGlyayBGYXJpbiA8ZGlyay5mYXJpbkBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2hldmMuaCIKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicmF3ZGVjLmgiCisKK3N0YXRpYyBpbnQgaGV2Y19wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICB1aW50MzJfdCBjb2RlID0gLTE7CisgICAgaW50IHZwcyA9IDAsIHNwcyA9IDAsIHBwcyA9IDAsIGlyYXAgPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHAtPmJ1Zl9zaXplIC0gMTsgaSsrKSB7CisgICAgICAgIGNvZGUgPSAoY29kZSA8PCA4KSArIHAtPmJ1ZltpXTsKKyAgICAgICAgaWYgKChjb2RlICYgMHhmZmZmZmYwMCkgPT0gMHgxMDApIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbmFsMiA9IHAtPmJ1ZltpICsgMV07CisgICAgICAgICAgICBpbnQgdHlwZSA9IChjb2RlICYgMHg3RSkgPj4gMTsKKworICAgICAgICAgICAgaWYgKGNvZGUgJiAweDgxKSAvLyBmb3JiaWRkZW4gYW5kIHJlc2VydmVkIHplcm8gYml0cworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICBpZiAobmFsMiAmIDB4ZjgpIC8vIHJlc2VydmVkIHplcm8KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIE5BTF9WUFM6ICAgICAgICB2cHMrKzsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOQUxfU1BTOiAgICAgICAgc3BzKys7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkFMX1BQUzogICAgICAgIHBwcysrOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5BTF9CTEFfTl9MUDoKKyAgICAgICAgICAgIGNhc2UgTkFMX0JMQV9XX0xQOgorICAgICAgICAgICAgY2FzZSBOQUxfQkxBX1dfUkFETDoKKyAgICAgICAgICAgIGNhc2UgTkFMX0NSQV9OVVQ6CisgICAgICAgICAgICBjYXNlIE5BTF9JRFJfTl9MUDoKKyAgICAgICAgICAgIGNhc2UgTkFMX0lEUl9XX1JBREw6IGlyYXArKzsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodnBzICYmIHNwcyAmJiBwcHMgJiYgaXJhcCkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMTsgLy8gMSBtb3JlIHRoYW4gLm1wZworICAgIHJldHVybiAwOworfQorCitGRl9ERUZfUkFXVklERU9fREVNVVhFUihoZXZjLCAicmF3IEhFVkMgdmlkZW8iLCBoZXZjX3Byb2JlLCAiaGV2YyxoMjY1LDI2NSIsIEFWX0NPREVDX0lEX0hFVkMpCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaGxzLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvaGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3YjgyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9obHMuYwpAQCAtMCwwICsxLDE3MTggQEAKKy8qCisgKiBBcHBsZSBIVFRQIExpdmUgU3RyZWFtaW5nIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYXJ0aW4gU3RvcnNqbworICogQ29weXJpZ2h0IChjKSAyMDEzIEFuc3NpIEhhbm51bGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQXBwbGUgSFRUUCBMaXZlIFN0cmVhbWluZyBkZW11eGVyCisgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1wYW50b3MtaHR0cC1saXZlLXN0cmVhbWluZworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgInVybC5oIgorI2luY2x1ZGUgImlkM3YyLmgiCisKKyNkZWZpbmUgSU5JVElBTF9CVUZGRVJfU0laRSAzMjc2OAorCisjZGVmaW5lIE1BWF9GSUVMRF9MRU4gNjQKKyNkZWZpbmUgTUFYX0NIQVJBQ1RFUklTVElDU19MRU4gNTEyCisKKyNkZWZpbmUgTVBFR19USU1FX0JBU0UgOTAwMDAKKyNkZWZpbmUgTVBFR19USU1FX0JBU0VfUSAoQVZSYXRpb25hbCl7MSwgTVBFR19USU1FX0JBU0V9CisKKy8qCisgKiBBbiBhcHBsZSBodHRwIHN0cmVhbSBjb25zaXN0cyBvZiBhIHBsYXlsaXN0IHdpdGggbWVkaWEgc2VnbWVudCBmaWxlcywKKyAqIHBsYXllZCBzZXF1ZW50aWFsbHkuIFRoZXJlIG1heSBiZSBzZXZlcmFsIHBsYXlsaXN0cyB3aXRoIHRoZSBzYW1lCisgKiB2aWRlbyBjb250ZW50LCBpbiBkaWZmZXJlbnQgYmFuZHdpZHRoIHZhcmlhbnRzLCB0aGF0IGFyZSBwbGF5ZWQgaW4KKyAqIHBhcmFsbGVsIChwcmVmZXJhYmx5IG9ubHkgb25lIGJhbmR3aWR0aCB2YXJpYW50IGF0IGEgdGltZSkuIEluIHRoaXMgY2FzZSwKKyAqIHRoZSB1c2VyIHN1cHBsaWVkIHRoZSB1cmwgdG8gYSBtYWluIHBsYXlsaXN0IHRoYXQgb25seSBsaXN0cyB0aGUgdmFyaWFudAorICogcGxheWxpc3RzLgorICoKKyAqIElmIHRoZSBtYWluIHBsYXlsaXN0IGRvZXNuJ3QgcG9pbnQgYXQgYW55IHZhcmlhbnRzLCB3ZSBzdGlsbCBjcmVhdGUKKyAqIG9uZSBhbm9ueW1vdXMgdG9wbGV2ZWwgdmFyaWFudCBmb3IgdGhpcywgdG8gbWFpbnRhaW4gdGhlIHN0cnVjdHVyZS4KKyAqLworCitlbnVtIEtleVR5cGUgeworICAgIEtFWV9OT05FLAorICAgIEtFWV9BRVNfMTI4LAorfTsKKworc3RydWN0IHNlZ21lbnQgeworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgaW50NjRfdCB1cmxfb2Zmc2V0OworICAgIGludDY0X3Qgc2l6ZTsKKyAgICBjaGFyICp1cmw7CisgICAgY2hhciAqa2V5OworICAgIGVudW0gS2V5VHlwZSBrZXlfdHlwZTsKKyAgICB1aW50OF90IGl2WzE2XTsKK307CisKK3N0cnVjdCByZW5kaXRpb247CisKK2VudW0gUGxheWxpc3RUeXBlIHsKKyAgICBQTFNfVFlQRV9VTlNQRUNJRklFRCwKKyAgICBQTFNfVFlQRV9FVkVOVCwKKyAgICBQTFNfVFlQRV9WT0QKK307CisKKy8qCisgKiBFYWNoIHBsYXlsaXN0IGhhcyBpdHMgb3duIGRlbXV4ZXIuIElmIGl0IGN1cnJlbnRseSBpcyBhY3RpdmUsCisgKiBpdCBoYXMgYW4gb3BlbiBBVklPQ29udGV4dCB0b28sIGFuZCBwb3RlbnRpYWxseSBhbiBBVlBhY2tldAorICogY29udGFpbmluZyB0aGUgbmV4dCBwYWNrZXQgZnJvbSB0aGlzIHN0cmVhbS4KKyAqLworc3RydWN0IHBsYXlsaXN0IHsKKyAgICBjaGFyIHVybFtNQVhfVVJMX1NJWkVdOworICAgIEFWSU9Db250ZXh0IHBiOworICAgIHVpbnQ4X3QqIHJlYWRfYnVmZmVyOworICAgIFVSTENvbnRleHQgKmlucHV0OworICAgIEFWRm9ybWF0Q29udGV4dCAqcGFyZW50OworICAgIGludCBpbmRleDsKKyAgICBBVkZvcm1hdENvbnRleHQgKmN0eDsKKyAgICBBVlBhY2tldCBwa3Q7CisgICAgaW50IHN0cmVhbV9vZmZzZXQ7CisKKyAgICBpbnQgZmluaXNoZWQ7CisgICAgZW51bSBQbGF5bGlzdFR5cGUgdHlwZTsKKyAgICBpbnQ2NF90IHRhcmdldF9kdXJhdGlvbjsKKyAgICBpbnQgc3RhcnRfc2VxX25vOworICAgIGludCBuX3NlZ21lbnRzOworICAgIHN0cnVjdCBzZWdtZW50ICoqc2VnbWVudHM7CisgICAgaW50IG5lZWRlZCwgY3VyX25lZWRlZDsKKyAgICBpbnQgY3VyX3NlcV9ubzsKKyAgICBpbnQ2NF90IGN1cl9zZWdfb2Zmc2V0OworICAgIGludDY0X3QgbGFzdF9sb2FkX3RpbWU7CisKKyAgICBjaGFyIGtleV91cmxbTUFYX1VSTF9TSVpFXTsKKyAgICB1aW50OF90IGtleVsxNl07CisKKyAgICAvKiBJRDMgdGltZXN0YW1wIGhhbmRsaW5nIChlbGVtZW50YXJ5IGF1ZGlvIHN0cmVhbXMgaGF2ZSBJRDMgdGltZXN0YW1wcworICAgICAqIChhbmQgcG9zc2libHkgb3RoZXIgSUQzIHRhZ3MpIGluIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzZWdtZW50KSAqLworICAgIGludCBpc19pZDNfdGltZXN0YW1wZWQ7IC8qIC0xOiBub3QgeWV0IGtub3duICovCisgICAgaW50NjRfdCBpZDNfbXBlZ3RzX3RpbWVzdGFtcDsgLyogaW4gbXBlZ3RzIHRiICovCisgICAgaW50NjRfdCBpZDNfb2Zmc2V0OyAvKiBpbiBzdHJlYW0gb3JpZ2luYWwgdGIgKi8KKyAgICB1aW50OF90KiBpZDNfYnVmOyAvKiB0ZW1wIGJ1ZmZlciBmb3IgaWQzIHBhcnNpbmcgKi8KKyAgICB1bnNpZ25lZCBpbnQgaWQzX2J1Zl9zaXplOworICAgIEFWRGljdGlvbmFyeSAqaWQzX2luaXRpYWw7IC8qIGRhdGEgZnJvbSBmaXJzdCBpZDMgdGFnICovCisgICAgaW50IGlkM19mb3VuZDsgLyogSUQzIHRhZyBmb3VuZCBhdCBzb21lIHBvaW50ICovCisgICAgaW50IGlkM19jaGFuZ2VkOyAvKiBJRDMgdGFnIGRhdGEgaGFzIGNoYW5nZWQgYXQgc29tZSBwb2ludCAqLworICAgIElEM3YyRXh0cmFNZXRhICppZDNfZGVmZXJyZWRfZXh0cmE7IC8qIHN0b3JlZCBoZXJlIHVudGlsIHN1YmRlbXV4ZXIgaXMgb3BlbmVkICovCisKKyAgICBpbnQ2NF90IHNlZWtfdGltZXN0YW1wOworICAgIGludCBzZWVrX2ZsYWdzOworICAgIGludCBzZWVrX3N0cmVhbV9pbmRleDsgLyogaW50byBzdWJkZW11eGVyIHN0cmVhbSBhcnJheSAqLworCisgICAgLyogUmVuZGl0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbGF5bGlzdCwgaWYgYW55LgorICAgICAqIEFsdGVybmF0aXZlIHJlbmRpdGlvbiBwbGF5bGlzdHMgaGF2ZSBhIHNpbmdsZSByZW5kaXRpb24gYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhlbSwgYW5kIHZhcmlhbnQgbWFpbiBNZWRpYSBQbGF5bGlzdHMgbWF5IGhhdmUKKyAgICAgKiBtdWx0aXBsZSAocGxheWxpc3QtbGVzcykgcmVuZGl0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlbS4gKi8KKyAgICBpbnQgbl9yZW5kaXRpb25zOworICAgIHN0cnVjdCByZW5kaXRpb24gKipyZW5kaXRpb25zOworfTsKKworLyoKKyAqIFJlbmRpdGlvbnMgYXJlIGUuZy4gYWx0ZXJuYXRpdmUgc3VidGl0bGUgb3IgYXVkaW8gc3RyZWFtcy4KKyAqIFRoZSByZW5kaXRpb24gbWF5IGVpdGhlciBiZSBhbiBleHRlcm5hbCBwbGF5bGlzdCBvciBpdCBtYXkgYmUKKyAqIGNvbnRhaW5lZCBpbiB0aGUgbWFpbiBNZWRpYSBQbGF5bGlzdCBvZiB0aGUgdmFyaWFudCAoaW4gd2hpY2ggY2FzZQorICogcGxheWxpc3QgaXMgTlVMTCkuCisgKi8KK3N0cnVjdCByZW5kaXRpb24geworICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZTsKKyAgICBzdHJ1Y3QgcGxheWxpc3QgKnBsYXlsaXN0OworICAgIGNoYXIgZ3JvdXBfaWRbTUFYX0ZJRUxEX0xFTl07CisgICAgY2hhciBsYW5ndWFnZVtNQVhfRklFTERfTEVOXTsKKyAgICBjaGFyIG5hbWVbTUFYX0ZJRUxEX0xFTl07CisgICAgaW50IGRpc3Bvc2l0aW9uOworfTsKKworc3RydWN0IHZhcmlhbnQgeworICAgIGludCBiYW5kd2lkdGg7CisKKyAgICAvKiBldmVyeSB2YXJpYW50IGNvbnRhaW5zIGF0IGxlYXN0IHRoZSBtYWluIE1lZGlhIFBsYXlsaXN0IGluIGluZGV4IDAgKi8KKyAgICBpbnQgbl9wbGF5bGlzdHM7CisgICAgc3RydWN0IHBsYXlsaXN0ICoqcGxheWxpc3RzOworCisgICAgY2hhciBhdWRpb19ncm91cFtNQVhfRklFTERfTEVOXTsKKyAgICBjaGFyIHZpZGVvX2dyb3VwW01BWF9GSUVMRF9MRU5dOworICAgIGNoYXIgc3VidGl0bGVzX2dyb3VwW01BWF9GSUVMRF9MRU5dOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSExTQ29udGV4dCB7CisgICAgaW50IG5fdmFyaWFudHM7CisgICAgc3RydWN0IHZhcmlhbnQgKip2YXJpYW50czsKKyAgICBpbnQgbl9wbGF5bGlzdHM7CisgICAgc3RydWN0IHBsYXlsaXN0ICoqcGxheWxpc3RzOworICAgIGludCBuX3JlbmRpdGlvbnM7CisgICAgc3RydWN0IHJlbmRpdGlvbiAqKnJlbmRpdGlvbnM7CisKKyAgICBpbnQgY3VyX3NlcV9ubzsKKyAgICBpbnQgZmlyc3RfcGFja2V0OworICAgIGludDY0X3QgZmlyc3RfdGltZXN0YW1wOworICAgIGludDY0X3QgY3VyX3RpbWVzdGFtcDsKKyAgICBBVklPSW50ZXJydXB0Q0IgKmludGVycnVwdF9jYWxsYmFjazsKKyAgICBjaGFyICp1c2VyX2FnZW50OyAgICAgICAgICAgICAgICAgICAgLy8vPCBob2xkcyBIVFRQIHVzZXIgYWdlbnQgc2V0IGFzIGFuIEFWT3B0aW9uIHRvIHRoZSBIVFRQIHByb3RvY29sIGNvbnRleHQKKyAgICBjaGFyICpjb29raWVzOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBob2xkcyBIVFRQIGNvb2tpZSB2YWx1ZXMgc2V0IGluIGVpdGhlciB0aGUgaW5pdGlhbCByZXNwb25zZSBvciBhcyBhbiBBVk9wdGlvbiB0byB0aGUgSFRUUCBwcm90b2NvbCBjb250ZXh0CisgICAgY2hhciAqaGVhZGVyczsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaG9sZHMgSFRUUCBoZWFkZXJzIHNldCBhcyBhbiBBVk9wdGlvbiB0byB0aGUgSFRUUCBwcm90b2NvbCBjb250ZXh0Cit9IEhMU0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgcmVhZF9jaG9tcF9saW5lKEFWSU9Db250ZXh0ICpzLCBjaGFyICpidWYsIGludCBtYXhsZW4pCit7CisgICAgaW50IGxlbiA9IGZmX2dldF9saW5lKHMsIGJ1ZiwgbWF4bGVuKTsKKyAgICB3aGlsZSAobGVuID4gMCAmJiBhdl9pc3NwYWNlKGJ1ZltsZW4gLSAxXSkpCisgICAgICAgIGJ1ZlstLWxlbl0gPSAnXDAnOworICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfc2VnbWVudF9saXN0KHN0cnVjdCBwbGF5bGlzdCAqcGxzKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBwbHMtPm5fc2VnbWVudHM7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmcGxzLT5zZWdtZW50c1tpXS0+a2V5KTsKKyAgICAgICAgYXZfZnJlZXAoJnBscy0+c2VnbWVudHNbaV0tPnVybCk7CisgICAgICAgIGF2X2ZyZWVwKCZwbHMtPnNlZ21lbnRzW2ldKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJnBscy0+c2VnbWVudHMpOworICAgIHBscy0+bl9zZWdtZW50cyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGxheWxpc3RfbGlzdChITFNDb250ZXh0ICpjKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX3BsYXlsaXN0czsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBwbGF5bGlzdCAqcGxzID0gYy0+cGxheWxpc3RzW2ldOworICAgICAgICBmcmVlX3NlZ21lbnRfbGlzdChwbHMpOworICAgICAgICBhdl9mcmVlcCgmcGxzLT5yZW5kaXRpb25zKTsKKyAgICAgICAgYXZfZnJlZXAoJnBscy0+aWQzX2J1Zik7CisgICAgICAgIGF2X2RpY3RfZnJlZSgmcGxzLT5pZDNfaW5pdGlhbCk7CisgICAgICAgIGZmX2lkM3YyX2ZyZWVfZXh0cmFfbWV0YSgmcGxzLT5pZDNfZGVmZXJyZWRfZXh0cmEpOworICAgICAgICBhdl9mcmVlX3BhY2tldCgmcGxzLT5wa3QpOworICAgICAgICBhdl9mcmVlcCgmcGxzLT5wYi5idWZmZXIpOworICAgICAgICBpZiAocGxzLT5pbnB1dCkKKyAgICAgICAgICAgIGZmdXJsX2Nsb3NlKHBscy0+aW5wdXQpOworICAgICAgICBpZiAocGxzLT5jdHgpIHsKKyAgICAgICAgICAgIHBscy0+Y3R4LT5wYiA9IE5VTEw7CisgICAgICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmcGxzLT5jdHgpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWUocGxzKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmMtPnBsYXlsaXN0cyk7CisgICAgYXZfZnJlZXAoJmMtPmNvb2tpZXMpOworICAgIGF2X2ZyZWVwKCZjLT51c2VyX2FnZW50KTsKKyAgICBjLT5uX3BsYXlsaXN0cyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdmFyaWFudF9saXN0KEhMU0NvbnRleHQgKmMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGMtPm5fdmFyaWFudHM7IGkrKykgeworICAgICAgICBzdHJ1Y3QgdmFyaWFudCAqdmFyID0gYy0+dmFyaWFudHNbaV07CisgICAgICAgIGF2X2ZyZWVwKCZ2YXItPnBsYXlsaXN0cyk7CisgICAgICAgIGF2X2ZyZWUodmFyKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmMtPnZhcmlhbnRzKTsKKyAgICBjLT5uX3ZhcmlhbnRzID0gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9yZW5kaXRpb25fbGlzdChITFNDb250ZXh0ICpjKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX3JlbmRpdGlvbnM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmMtPnJlbmRpdGlvbnNbaV0pOworICAgIGF2X2ZyZWVwKCZjLT5yZW5kaXRpb25zKTsKKyAgICBjLT5uX3JlbmRpdGlvbnMgPSAwOworfQorCisvKgorICogVXNlZCB0byByZXNldCBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIEFWUGFja2V0IHRvIGEgY2xlYW4gc2xhdGUsCisgKiBjb250YWluaW5nIG5vIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIHJlc2V0X3BhY2tldChBVlBhY2tldCAqcGt0KQoreworICAgIGF2X2luaXRfcGFja2V0KHBrdCk7CisgICAgcGt0LT5kYXRhID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF5bGlzdCAqbmV3X3BsYXlsaXN0KEhMU0NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiYXNlKQoreworICAgIHN0cnVjdCBwbGF5bGlzdCAqcGxzID0gYXZfbWFsbG9jeihzaXplb2Yoc3RydWN0IHBsYXlsaXN0KSk7CisgICAgaWYgKCFwbHMpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc2V0X3BhY2tldCgmcGxzLT5wa3QpOworICAgIGZmX21ha2VfYWJzb2x1dGVfdXJsKHBscy0+dXJsLCBzaXplb2YocGxzLT51cmwpLCBiYXNlLCB1cmwpOworICAgIHBscy0+c2Vla190aW1lc3RhbXAgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIHBscy0+aXNfaWQzX3RpbWVzdGFtcGVkID0gLTE7CisgICAgcGxzLT5pZDNfbXBlZ3RzX3RpbWVzdGFtcCA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgZHluYXJyYXlfYWRkKCZjLT5wbGF5bGlzdHMsICZjLT5uX3BsYXlsaXN0cywgcGxzKTsKKyAgICByZXR1cm4gcGxzOworfQorCitzdHJ1Y3QgdmFyaWFudF9pbmZvIHsKKyAgICBjaGFyIGJhbmR3aWR0aFsyMF07CisgICAgLyogdmFyaWFudCBncm91cCBpZHM6ICovCisgICAgY2hhciBhdWRpb1tNQVhfRklFTERfTEVOXTsKKyAgICBjaGFyIHZpZGVvW01BWF9GSUVMRF9MRU5dOworICAgIGNoYXIgc3VidGl0bGVzW01BWF9GSUVMRF9MRU5dOworfTsKKworc3RhdGljIHN0cnVjdCB2YXJpYW50ICpuZXdfdmFyaWFudChITFNDb250ZXh0ICpjLCBzdHJ1Y3QgdmFyaWFudF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IGNoYXIgKmJhc2UpCit7CisgICAgc3RydWN0IHZhcmlhbnQgKnZhcjsKKyAgICBzdHJ1Y3QgcGxheWxpc3QgKnBsczsKKworICAgIHBscyA9IG5ld19wbGF5bGlzdChjLCB1cmwsIGJhc2UpOworICAgIGlmICghcGxzKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHZhciA9IGF2X21hbGxvY3ooc2l6ZW9mKHN0cnVjdCB2YXJpYW50KSk7CisgICAgaWYgKCF2YXIpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGluZm8pIHsKKyAgICAgICAgdmFyLT5iYW5kd2lkdGggPSBhdG9pKGluZm8tPmJhbmR3aWR0aCk7CisgICAgICAgIHN0cmNweSh2YXItPmF1ZGlvX2dyb3VwLCBpbmZvLT5hdWRpbyk7CisgICAgICAgIHN0cmNweSh2YXItPnZpZGVvX2dyb3VwLCBpbmZvLT52aWRlbyk7CisgICAgICAgIHN0cmNweSh2YXItPnN1YnRpdGxlc19ncm91cCwgaW5mby0+c3VidGl0bGVzKTsKKyAgICB9CisKKyAgICBkeW5hcnJheV9hZGQoJmMtPnZhcmlhbnRzLCAmYy0+bl92YXJpYW50cywgdmFyKTsKKyAgICBkeW5hcnJheV9hZGQoJnZhci0+cGxheWxpc3RzLCAmdmFyLT5uX3BsYXlsaXN0cywgcGxzKTsKKyAgICByZXR1cm4gdmFyOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfdmFyaWFudF9hcmdzKHN0cnVjdCB2YXJpYW50X2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9sZW4sIGNoYXIgKipkZXN0LCBpbnQgKmRlc3RfbGVuKQoreworICAgIGlmICghc3RybmNtcChrZXksICJCQU5EV0lEVEg9Iiwga2V5X2xlbikpIHsKKyAgICAgICAgKmRlc3QgICAgID0gICAgICAgIGluZm8tPmJhbmR3aWR0aDsKKyAgICAgICAgKmRlc3RfbGVuID0gc2l6ZW9mKGluZm8tPmJhbmR3aWR0aCk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChrZXksICJBVURJTz0iLCBrZXlfbGVuKSkgeworICAgICAgICAqZGVzdCAgICAgPSAgICAgICAgaW5mby0+YXVkaW87CisgICAgICAgICpkZXN0X2xlbiA9IHNpemVvZihpbmZvLT5hdWRpbyk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChrZXksICJWSURFTz0iLCBrZXlfbGVuKSkgeworICAgICAgICAqZGVzdCAgICAgPSAgICAgICAgaW5mby0+dmlkZW87CisgICAgICAgICpkZXN0X2xlbiA9IHNpemVvZihpbmZvLT52aWRlbyk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChrZXksICJTVUJUSVRMRVM9Iiwga2V5X2xlbikpIHsKKyAgICAgICAgKmRlc3QgICAgID0gICAgICAgIGluZm8tPnN1YnRpdGxlczsKKyAgICAgICAgKmRlc3RfbGVuID0gc2l6ZW9mKGluZm8tPnN1YnRpdGxlcyk7CisgICAgfQorfQorCitzdHJ1Y3Qga2V5X2luZm8geworICAgICBjaGFyIHVyaVtNQVhfVVJMX1NJWkVdOworICAgICBjaGFyIG1ldGhvZFsxMF07CisgICAgIGNoYXIgaXZbMzVdOworfTsKKworc3RhdGljIHZvaWQgaGFuZGxlX2tleV9hcmdzKHN0cnVjdCBrZXlfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlfbGVuLCBjaGFyICoqZGVzdCwgaW50ICpkZXN0X2xlbikKK3sKKyAgICBpZiAoIXN0cm5jbXAoa2V5LCAiTUVUSE9EPSIsIGtleV9sZW4pKSB7CisgICAgICAgICpkZXN0ICAgICA9ICAgICAgICBpbmZvLT5tZXRob2Q7CisgICAgICAgICpkZXN0X2xlbiA9IHNpemVvZihpbmZvLT5tZXRob2QpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoa2V5LCAiVVJJPSIsIGtleV9sZW4pKSB7CisgICAgICAgICpkZXN0ICAgICA9ICAgICAgICBpbmZvLT51cmk7CisgICAgICAgICpkZXN0X2xlbiA9IHNpemVvZihpbmZvLT51cmkpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoa2V5LCAiSVY9Iiwga2V5X2xlbikpIHsKKyAgICAgICAgKmRlc3QgICAgID0gICAgICAgIGluZm8tPml2OworICAgICAgICAqZGVzdF9sZW4gPSBzaXplb2YoaW5mby0+aXYpOworICAgIH0KK30KKworc3RydWN0IHJlbmRpdGlvbl9pbmZvIHsKKyAgICBjaGFyIHR5cGVbMTZdOworICAgIGNoYXIgdXJpW01BWF9VUkxfU0laRV07CisgICAgY2hhciBncm91cF9pZFtNQVhfRklFTERfTEVOXTsKKyAgICBjaGFyIGxhbmd1YWdlW01BWF9GSUVMRF9MRU5dOworICAgIGNoYXIgYXNzb2NfbGFuZ3VhZ2VbTUFYX0ZJRUxEX0xFTl07CisgICAgY2hhciBuYW1lW01BWF9GSUVMRF9MRU5dOworICAgIGNoYXIgZGVmYXVsdHJbNF07CisgICAgY2hhciBmb3JjZWRbNF07CisgICAgY2hhciBjaGFyYWN0ZXJpc3RpY3NbTUFYX0NIQVJBQ1RFUklTVElDU19MRU5dOworfTsKKworc3RhdGljIHN0cnVjdCByZW5kaXRpb24gKm5ld19yZW5kaXRpb24oSExTQ29udGV4dCAqYywgc3RydWN0IHJlbmRpdGlvbl9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmxfYmFzZSkKK3sKKyAgICBzdHJ1Y3QgcmVuZGl0aW9uICpyZW5kOworICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZSA9IEFWTUVESUFfVFlQRV9VTktOT1dOOworICAgIGNoYXIgKmNoYXJhY3RlcmlzdGljOworICAgIGNoYXIgKmNocl9wdHI7CisgICAgY2hhciAqc2F2ZXB0cjsKKworICAgIGlmICghc3RyY21wKGluZm8tPnR5cGUsICJBVURJTyIpKQorICAgICAgICB0eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIGVsc2UgaWYgKCFzdHJjbXAoaW5mby0+dHlwZSwgIlZJREVPIikpCisgICAgICAgIHR5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgZWxzZSBpZiAoIXN0cmNtcChpbmZvLT50eXBlLCAiU1VCVElUTEVTIikpCisgICAgICAgIHR5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgZWxzZSBpZiAoIXN0cmNtcChpbmZvLT50eXBlLCAiQ0xPU0VELUNBUFRJT05TIikpCisgICAgICAgIC8qIENMT1NFRC1DQVBUSU9OUyBpcyBpZ25vcmVkIHNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IENFQS02MDggQ0MgaW4KKyAgICAgICAgICogQVZDIFNFSSBSQlNQIGFueXdheSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9VTktOT1dOKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFVSSSBpcyBtYW5kYXRvcnkgZm9yIHN1YnRpdGxlcyBhcyBwZXIgc3BlYyAqLworICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSAmJiAhaW5mby0+dXJpWzBdKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFRPRE86IGhhbmRsZSBzdWJ0aXRsZXMgKGVhY2ggc2VnbWVudCBoYXMgdG8gcGFyc2VkIHNlcGFyYXRlbHkpICovCisgICAgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJlbmQgPSBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3QgcmVuZGl0aW9uKSk7CisgICAgaWYgKCFyZW5kKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGR5bmFycmF5X2FkZCgmYy0+cmVuZGl0aW9ucywgJmMtPm5fcmVuZGl0aW9ucywgcmVuZCk7CisKKyAgICByZW5kLT50eXBlID0gdHlwZTsKKyAgICBzdHJjcHkocmVuZC0+Z3JvdXBfaWQsIGluZm8tPmdyb3VwX2lkKTsKKyAgICBzdHJjcHkocmVuZC0+bGFuZ3VhZ2UsIGluZm8tPmxhbmd1YWdlKTsKKyAgICBzdHJjcHkocmVuZC0+bmFtZSwgaW5mby0+bmFtZSk7CisKKyAgICAvKiBhZGQgdGhlIHBsYXlsaXN0IGlmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgcmVuZGl0aW9uICovCisgICAgaWYgKGluZm8tPnVyaVswXSkgeworICAgICAgICByZW5kLT5wbGF5bGlzdCA9IG5ld19wbGF5bGlzdChjLCBpbmZvLT51cmksIHVybF9iYXNlKTsKKyAgICAgICAgaWYgKHJlbmQtPnBsYXlsaXN0KQorICAgICAgICAgICAgZHluYXJyYXlfYWRkKCZyZW5kLT5wbGF5bGlzdC0+cmVuZGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcmVuZC0+cGxheWxpc3QtPm5fcmVuZGl0aW9ucywgcmVuZCk7CisgICAgfQorCisgICAgaWYgKGluZm8tPmFzc29jX2xhbmd1YWdlWzBdKSB7CisgICAgICAgIGludCBsYW5nbGVuID0gc3RybGVuKHJlbmQtPmxhbmd1YWdlKTsKKyAgICAgICAgaWYgKGxhbmdsZW4gPCBzaXplb2YocmVuZC0+bGFuZ3VhZ2UpIC0gMykgeworICAgICAgICAgICAgcmVuZC0+bGFuZ3VhZ2VbbGFuZ2xlbl0gPSAnLCc7CisgICAgICAgICAgICBzdHJuY3B5KHJlbmQtPmxhbmd1YWdlICsgbGFuZ2xlbiArIDEsIGluZm8tPmFzc29jX2xhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVuZC0+bGFuZ3VhZ2UpIC0gbGFuZ2xlbiAtIDIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAoaW5mby0+ZGVmYXVsdHIsICJZRVMiKSkKKyAgICAgICAgcmVuZC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fREVGQVVMVDsKKyAgICBpZiAoIXN0cmNtcChpbmZvLT5mb3JjZWQsICJZRVMiKSkKKyAgICAgICAgcmVuZC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fRk9SQ0VEOworCisgICAgY2hyX3B0ciA9IGluZm8tPmNoYXJhY3RlcmlzdGljczsKKyAgICB3aGlsZSAoKGNoYXJhY3RlcmlzdGljID0gYXZfc3RydG9rKGNocl9wdHIsICIsIiwgJnNhdmVwdHIpKSkgeworICAgICAgICBpZiAoIXN0cmNtcChjaGFyYWN0ZXJpc3RpYywgInB1YmxpYy5hY2Nlc3NpYmlsaXR5LmRlc2NyaWJlcy1tdXNpYy1hbmQtc291bmQiKSkKKyAgICAgICAgICAgIHJlbmQtPmRpc3Bvc2l0aW9uIHw9IEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQ7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoY2hhcmFjdGVyaXN0aWMsICJwdWJsaWMuYWNjZXNzaWJpbGl0eS5kZXNjcmliZXMtdmlkZW8iKSkKKyAgICAgICAgICAgIHJlbmQtPmRpc3Bvc2l0aW9uIHw9IEFWX0RJU1BPU0lUSU9OX1ZJU1VBTF9JTVBBSVJFRDsKKworICAgICAgICBjaHJfcHRyID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3JlbmRpdGlvbl9hcmdzKHN0cnVjdCByZW5kaXRpb25faW5mbyAqaW5mbywgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlfbGVuLCBjaGFyICoqZGVzdCwgaW50ICpkZXN0X2xlbikKK3sKKyAgICBpZiAoIXN0cm5jbXAoa2V5LCAiVFlQRT0iLCBrZXlfbGVuKSkgeworICAgICAgICAqZGVzdCAgICAgPSAgICAgICAgaW5mby0+dHlwZTsKKyAgICAgICAgKmRlc3RfbGVuID0gc2l6ZW9mKGluZm8tPnR5cGUpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoa2V5LCAiVVJJPSIsIGtleV9sZW4pKSB7CisgICAgICAgICpkZXN0ICAgICA9ICAgICAgICBpbmZvLT51cmk7CisgICAgICAgICpkZXN0X2xlbiA9IHNpemVvZihpbmZvLT51cmkpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoa2V5LCAiR1JPVVAtSUQ9Iiwga2V5X2xlbikpIHsKKyAgICAgICAgKmRlc3QgICAgID0gICAgICAgIGluZm8tPmdyb3VwX2lkOworICAgICAgICAqZGVzdF9sZW4gPSBzaXplb2YoaW5mby0+Z3JvdXBfaWQpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoa2V5LCAiTEFOR1VBR0U9Iiwga2V5X2xlbikpIHsKKyAgICAgICAgKmRlc3QgICAgID0gICAgICAgIGluZm8tPmxhbmd1YWdlOworICAgICAgICAqZGVzdF9sZW4gPSBzaXplb2YoaW5mby0+bGFuZ3VhZ2UpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoa2V5LCAiQVNTT0MtTEFOR1VBR0U9Iiwga2V5X2xlbikpIHsKKyAgICAgICAgKmRlc3QgICAgID0gICAgICAgIGluZm8tPmFzc29jX2xhbmd1YWdlOworICAgICAgICAqZGVzdF9sZW4gPSBzaXplb2YoaW5mby0+YXNzb2NfbGFuZ3VhZ2UpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoa2V5LCAiTkFNRT0iLCBrZXlfbGVuKSkgeworICAgICAgICAqZGVzdCAgICAgPSAgICAgICAgaW5mby0+bmFtZTsKKyAgICAgICAgKmRlc3RfbGVuID0gc2l6ZW9mKGluZm8tPm5hbWUpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoa2V5LCAiREVGQVVMVD0iLCBrZXlfbGVuKSkgeworICAgICAgICAqZGVzdCAgICAgPSAgICAgICAgaW5mby0+ZGVmYXVsdHI7CisgICAgICAgICpkZXN0X2xlbiA9IHNpemVvZihpbmZvLT5kZWZhdWx0cik7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChrZXksICJGT1JDRUQ9Iiwga2V5X2xlbikpIHsKKyAgICAgICAgKmRlc3QgICAgID0gICAgICAgIGluZm8tPmZvcmNlZDsKKyAgICAgICAgKmRlc3RfbGVuID0gc2l6ZW9mKGluZm8tPmZvcmNlZCk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChrZXksICJDSEFSQUNURVJJU1RJQ1M9Iiwga2V5X2xlbikpIHsKKyAgICAgICAgKmRlc3QgICAgID0gICAgICAgIGluZm8tPmNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgKmRlc3RfbGVuID0gc2l6ZW9mKGluZm8tPmNoYXJhY3RlcmlzdGljcyk7CisgICAgfQorICAgIC8qCisgICAgICogaWdub3JlZDoKKyAgICAgKiAtIEFVVE9TRUxFQ1Q6IGNsaWVudCBtYXkgYXV0b3NlbGVjdCBiYXNlZCBvbiBlLmcuIHN5c3RlbSBsYW5ndWFnZQorICAgICAqIC0gSU5TVFJFQU0tSUQ6IEVJQS02MDggY2xvc2VkIGNhcHRpb24gbnVtYmVyICgiQ0MxIi4uIkNDNCIpCisgICAgICovCit9CisKKy8qIHVzZWQgYnkgcGFyc2VfcGxheWxpc3QgdG8gYWxsb2NhdGUgYSBuZXcgdmFyaWFudCtwbGF5bGlzdCB3aGVuIHRoZQorICogcGxheWxpc3QgaXMgZGV0ZWN0ZWQgdG8gYmUgYSBNZWRpYSBQbGF5bGlzdCAobm90IE1hc3RlciBQbGF5bGlzdCkKKyAqIGFuZCB3ZSBoYXZlIG5vIHBhcmVudCBNYXN0ZXIgUGxheWxpc3QgKHBhcnNpbmcgb2Ygd2hpY2ggd291bGQgaGF2ZQorICogYWxsb2NhdGVkIHRoZSB2YXJpYW50IGFuZCBwbGF5bGlzdCBhbHJlYWR5KSAqLworc3RhdGljIGludCBlbnN1cmVfcGxheWxpc3QoSExTQ29udGV4dCAqYywgc3RydWN0IHBsYXlsaXN0ICoqcGxzLCBjb25zdCBjaGFyICp1cmwpCit7CisgICAgaWYgKCpwbHMpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghbmV3X3ZhcmlhbnQoYywgTlVMTCwgdXJsLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAqcGxzID0gYy0+cGxheWxpc3RzW2MtPm5fcGxheWxpc3RzIC0gMV07CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHBscyA9IE5VTEwgID0+IE1hc3RlciBQbGF5bGlzdCBvciBwYXJlbnRsZXNzIE1lZGlhIFBsYXlsaXN0CisgKiBwbHMgPSAhTlVMTCA9PiBwYXJlbnRlZCBNZWRpYSBQbGF5bGlzdCwgcGxheWxpc3QrdmFyaWFudCBhbGxvY2F0ZWQgKi8KK3N0YXRpYyBpbnQgcGFyc2VfcGxheWxpc3QoSExTQ29udGV4dCAqYywgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGxheWxpc3QgKnBscywgQVZJT0NvbnRleHQgKmluKQoreworICAgIGludCByZXQgPSAwLCBpc19zZWdtZW50ID0gMCwgaXNfdmFyaWFudCA9IDA7CisgICAgaW50NjRfdCBkdXJhdGlvbiA9IDA7CisgICAgZW51bSBLZXlUeXBlIGtleV90eXBlID0gS0VZX05PTkU7CisgICAgdWludDhfdCBpdlsxNl0gPSAiIjsKKyAgICBpbnQgaGFzX2l2ID0gMDsKKyAgICBjaGFyIGtleVtNQVhfVVJMX1NJWkVdID0gIiI7CisgICAgY2hhciBsaW5lW01BWF9VUkxfU0laRV07CisgICAgY29uc3QgY2hhciAqcHRyOworICAgIGludCBjbG9zZV9pbiA9IDA7CisgICAgaW50NjRfdCBzZWdfb2Zmc2V0ID0gMDsKKyAgICBpbnQ2NF90IHNlZ19zaXplID0gLTE7CisgICAgdWludDhfdCAqbmV3X3VybCA9IE5VTEw7CisgICAgc3RydWN0IHZhcmlhbnRfaW5mbyB2YXJpYW50X2luZm87CisgICAgY2hhciB0bXBfc3RyW01BWF9VUkxfU0laRV07CisKKyAgICBpZiAoIWluKSB7CisgICAgICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7CisgICAgICAgIGNsb3NlX2luID0gMTsKKyAgICAgICAgLyogU29tZSBITFMgc2VydmVycyBkb24ndCBsaWtlIGJlaW5nIHNlbnQgdGhlIHJhbmdlIGhlYWRlciAqLworICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgInNlZWthYmxlIiwgIjAiLCAwKTsKKworICAgICAgICAvLyBicm9rZXIgcHJpb3IgSFRUUCBvcHRpb25zIHRoYXQgc2hvdWxkIGJlIGNvbnNpc3RlbnQgYWNyb3NzIHJlcXVlc3RzCisgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAidXNlci1hZ2VudCIsIGMtPnVzZXJfYWdlbnQsIDApOworICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgImNvb2tpZXMiLCBjLT5jb29raWVzLCAwKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMsICJoZWFkZXJzIiwgYy0+aGVhZGVycywgMCk7CisKKyAgICAgICAgcmV0ID0gYXZpb19vcGVuMigmaW4sIHVybCwgQVZJT19GTEFHX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYy0+aW50ZXJydXB0X2NhbGxiYWNrLCAmb3B0cyk7CisgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoYXZfb3B0X2dldChpbiwgImxvY2F0aW9uIiwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiwgJm5ld191cmwpID49IDApCisgICAgICAgIHVybCA9IG5ld191cmw7CisKKyAgICByZWFkX2Nob21wX2xpbmUoaW4sIGxpbmUsIHNpemVvZihsaW5lKSk7CisgICAgaWYgKHN0cmNtcChsaW5lLCAiI0VYVE0zVSIpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAocGxzKSB7CisgICAgICAgIGZyZWVfc2VnbWVudF9saXN0KHBscyk7CisgICAgICAgIHBscy0+ZmluaXNoZWQgPSAwOworICAgICAgICBwbHMtPnR5cGUgPSBQTFNfVFlQRV9VTlNQRUNJRklFRDsKKyAgICB9CisgICAgd2hpbGUgKCFhdmlvX2Zlb2YoaW4pKSB7CisgICAgICAgIHJlYWRfY2hvbXBfbGluZShpbiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKyAgICAgICAgaWYgKGF2X3N0cnN0YXJ0KGxpbmUsICIjRVhULVgtU1RSRUFNLUlORjoiLCAmcHRyKSkgeworICAgICAgICAgICAgaXNfdmFyaWFudCA9IDE7CisgICAgICAgICAgICBtZW1zZXQoJnZhcmlhbnRfaW5mbywgMCwgc2l6ZW9mKHZhcmlhbnRfaW5mbykpOworICAgICAgICAgICAgZmZfcGFyc2Vfa2V5X3ZhbHVlKHB0ciwgKGZmX3BhcnNlX2tleV92YWxfY2IpIGhhbmRsZV92YXJpYW50X2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhbnRfaW5mbyk7CisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQobGluZSwgIiNFWFQtWC1LRVk6IiwgJnB0cikpIHsKKyAgICAgICAgICAgIHN0cnVjdCBrZXlfaW5mbyBpbmZvID0ge3swfX07CisgICAgICAgICAgICBmZl9wYXJzZV9rZXlfdmFsdWUocHRyLCAoZmZfcGFyc2Vfa2V5X3ZhbF9jYikgaGFuZGxlX2tleV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvKTsKKyAgICAgICAgICAgIGtleV90eXBlID0gS0VZX05PTkU7CisgICAgICAgICAgICBoYXNfaXYgPSAwOworICAgICAgICAgICAgaWYgKCFzdHJjbXAoaW5mby5tZXRob2QsICJBRVMtMTI4IikpCisgICAgICAgICAgICAgICAga2V5X3R5cGUgPSBLRVlfQUVTXzEyODsKKyAgICAgICAgICAgIGlmICghc3RybmNtcChpbmZvLml2LCAiMHgiLCAyKSB8fCAhc3RybmNtcChpbmZvLml2LCAiMFgiLCAyKSkgeworICAgICAgICAgICAgICAgIGZmX2hleF90b19kYXRhKGl2LCBpbmZvLml2ICsgMik7CisgICAgICAgICAgICAgICAgaGFzX2l2ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X3N0cmxjcHkoa2V5LCBpbmZvLnVyaSwgc2l6ZW9mKGtleSkpOworICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KGxpbmUsICIjRVhULVgtTUVESUE6IiwgJnB0cikpIHsKKyAgICAgICAgICAgIHN0cnVjdCByZW5kaXRpb25faW5mbyBpbmZvID0ge3swfX07CisgICAgICAgICAgICBmZl9wYXJzZV9rZXlfdmFsdWUocHRyLCAoZmZfcGFyc2Vfa2V5X3ZhbF9jYikgaGFuZGxlX3JlbmRpdGlvbl9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvKTsKKyAgICAgICAgICAgIG5ld19yZW5kaXRpb24oYywgJmluZm8sIHVybCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQobGluZSwgIiNFWFQtWC1UQVJHRVREVVJBVElPTjoiLCAmcHRyKSkgeworICAgICAgICAgICAgcmV0ID0gZW5zdXJlX3BsYXlsaXN0KGMsICZwbHMsIHVybCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBwbHMtPnRhcmdldF9kdXJhdGlvbiA9IGF0b2kocHRyKSAqIEFWX1RJTUVfQkFTRTsKKyAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChsaW5lLCAiI0VYVC1YLU1FRElBLVNFUVVFTkNFOiIsICZwdHIpKSB7CisgICAgICAgICAgICByZXQgPSBlbnN1cmVfcGxheWxpc3QoYywgJnBscywgdXJsKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIHBscy0+c3RhcnRfc2VxX25vID0gYXRvaShwdHIpOworICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KGxpbmUsICIjRVhULVgtUExBWUxJU1QtVFlQRToiLCAmcHRyKSkgeworICAgICAgICAgICAgcmV0ID0gZW5zdXJlX3BsYXlsaXN0KGMsICZwbHMsIHVybCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChwdHIsICJFVkVOVCIpKQorICAgICAgICAgICAgICAgIHBscy0+dHlwZSA9IFBMU19UWVBFX0VWRU5UOworICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChwdHIsICJWT0QiKSkKKyAgICAgICAgICAgICAgICBwbHMtPnR5cGUgPSBQTFNfVFlQRV9WT0Q7CisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQobGluZSwgIiNFWFQtWC1FTkRMSVNUIiwgJnB0cikpIHsKKyAgICAgICAgICAgIGlmIChwbHMpCisgICAgICAgICAgICAgICAgcGxzLT5maW5pc2hlZCA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQobGluZSwgIiNFWFRJTkY6IiwgJnB0cikpIHsKKyAgICAgICAgICAgIGlzX3NlZ21lbnQgPSAxOworICAgICAgICAgICAgZHVyYXRpb24gICA9IGF0b2YocHRyKSAqIEFWX1RJTUVfQkFTRTsKKyAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChsaW5lLCAiI0VYVC1YLUJZVEVSQU5HRToiLCAmcHRyKSkgeworICAgICAgICAgICAgc2VnX3NpemUgPSBhdG9pKHB0cik7CisgICAgICAgICAgICBwdHIgPSBzdHJjaHIocHRyLCAnQCcpOworICAgICAgICAgICAgaWYgKHB0cikKKyAgICAgICAgICAgICAgICBzZWdfb2Zmc2V0ID0gYXRvaShwdHIrMSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQobGluZSwgIiMiLCBOVUxMKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAobGluZVswXSkgeworICAgICAgICAgICAgaWYgKGlzX3ZhcmlhbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5ld192YXJpYW50KGMsICZ2YXJpYW50X2luZm8sIGxpbmUsIHVybCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzX3ZhcmlhbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzX3NlZ21lbnQpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VnbWVudCAqc2VnOworICAgICAgICAgICAgICAgIGlmICghcGxzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbmV3X3ZhcmlhbnQoYywgMCwgdXJsLCBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBscyA9IGMtPnBsYXlsaXN0c1tjLT5uX3BsYXlsaXN0cyAtIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWcgPSBhdl9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZWdtZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKCFzZWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlZy0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBzZWctPmtleV90eXBlID0ga2V5X3R5cGU7CisgICAgICAgICAgICAgICAgaWYgKGhhc19pdikgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2VnLT5pdiwgaXYsIHNpemVvZihpdikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzZXEgPSBwbHMtPnN0YXJ0X3NlcV9ubyArIHBscy0+bl9zZWdtZW50czsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHNlZy0+aXYsIDAsIHNpemVvZihzZWctPml2KSk7CisgICAgICAgICAgICAgICAgICAgIEFWX1dCMzIoc2VnLT5pdiArIDEyLCBzZXEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChrZXlfdHlwZSAhPSBLRVlfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICBmZl9tYWtlX2Fic29sdXRlX3VybCh0bXBfc3RyLCBzaXplb2YodG1wX3N0ciksIHVybCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgc2VnLT5rZXkgPSBhdl9zdHJkdXAodG1wX3N0cik7CisgICAgICAgICAgICAgICAgICAgIGlmICghc2VnLT5rZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUoc2VnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlZy0+a2V5ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmZl9tYWtlX2Fic29sdXRlX3VybCh0bXBfc3RyLCBzaXplb2YodG1wX3N0ciksIHVybCwgbGluZSk7CisgICAgICAgICAgICAgICAgc2VnLT51cmwgPSBhdl9zdHJkdXAodG1wX3N0cik7CisgICAgICAgICAgICAgICAgaWYgKCFzZWctPnVybCkgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKHNlZy0+a2V5KTsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShzZWcpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkeW5hcnJheV9hZGQoJnBscy0+c2VnbWVudHMsICZwbHMtPm5fc2VnbWVudHMsIHNlZyk7CisgICAgICAgICAgICAgICAgaXNfc2VnbWVudCA9IDA7CisKKyAgICAgICAgICAgICAgICBzZWctPnNpemUgPSBzZWdfc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoc2VnX3NpemUgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBzZWctPnVybF9vZmZzZXQgPSBzZWdfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBzZWdfb2Zmc2V0ICs9IHNlZ19zaXplOworICAgICAgICAgICAgICAgICAgICBzZWdfc2l6ZSA9IC0xOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlZy0+dXJsX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHNlZ19vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGxzKQorICAgICAgICBwbHMtPmxhc3RfbG9hZF90aW1lID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworCitmYWlsOgorICAgIGF2X2ZyZWUobmV3X3VybCk7CisgICAgaWYgKGNsb3NlX2luKQorICAgICAgICBhdmlvX2Nsb3NlKGluKTsKKyAgICByZXR1cm4gcmV0OworfQorCitlbnVtIFJlYWRGcm9tVVJMTW9kZSB7CisgICAgUkVBRF9OT1JNQUwsCisgICAgUkVBRF9DT01QTEVURSwKK307CisKKy8qIHJlYWQgZnJvbSBVUkxDb250ZXh0LCBsaW1pdGluZyByZWFkIHRvIGN1cnJlbnQgc2VnbWVudCAqLworc3RhdGljIGludCByZWFkX2Zyb21fdXJsKHN0cnVjdCBwbGF5bGlzdCAqcGxzLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFJlYWRGcm9tVVJMTW9kZSBtb2RlKQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IHNlZ21lbnQgKnNlZyA9IHBscy0+c2VnbWVudHNbcGxzLT5jdXJfc2VxX25vIC0gcGxzLT5zdGFydF9zZXFfbm9dOworCisgICAgIC8qIGxpbWl0IHJlYWQgaWYgdGhlIHNlZ21lbnQgd2FzIG9ubHkgYSBwYXJ0IG9mIGEgZmlsZSAqLworICAgIGlmIChzZWctPnNpemUgPj0gMCkKKyAgICAgICAgYnVmX3NpemUgPSBGRk1JTihidWZfc2l6ZSwgc2VnLT5zaXplIC0gcGxzLT5jdXJfc2VnX29mZnNldCk7CisKKyAgICBpZiAobW9kZSA9PSBSRUFEX0NPTVBMRVRFKQorICAgICAgICByZXQgPSBmZnVybF9yZWFkX2NvbXBsZXRlKHBscy0+aW5wdXQsIGJ1ZiwgYnVmX3NpemUpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gZmZ1cmxfcmVhZChwbHMtPmlucHV0LCBidWYsIGJ1Zl9zaXplKTsKKworICAgIGlmIChyZXQgPiAwKQorICAgICAgICBwbHMtPmN1cl9zZWdfb2Zmc2V0ICs9IHJldDsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIFBhcnNlIHRoZSByYXcgSUQzIGRhdGEgYW5kIHBhc3MgY29udGVudHMgdG8gY2FsbGVyICovCitzdGF0aWMgdm9pZCBwYXJzZV9pZDMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEsIGludDY0X3QgKmR0cywKKyAgICAgICAgICAgICAgICAgICAgICBJRDN2MkV4dHJhTWV0YUFQSUMgKiphcGljLCBJRDN2MkV4dHJhTWV0YSAqKmV4dHJhX21ldGEpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgaWQzX3ByaXZfb3duZXJfdHNbXSA9ICJjb20uYXBwbGUuc3RyZWFtaW5nLnRyYW5zcG9ydFN0cmVhbVRpbWVzdGFtcCI7CisgICAgSUQzdjJFeHRyYU1ldGEgKm1ldGE7CisKKyAgICBmZl9pZDN2Ml9yZWFkX2RpY3QocGIsIG1ldGFkYXRhLCBJRDN2Ml9ERUZBVUxUX01BR0lDLCBleHRyYV9tZXRhKTsKKyAgICBmb3IgKG1ldGEgPSAqZXh0cmFfbWV0YTsgbWV0YTsgbWV0YSA9IG1ldGEtPm5leHQpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAobWV0YS0+dGFnLCAiUFJJViIpKSB7CisgICAgICAgICAgICBJRDN2MkV4dHJhTWV0YVBSSVYgKnByaXYgPSBtZXRhLT5kYXRhOworICAgICAgICAgICAgaWYgKHByaXYtPmRhdGFzaXplID09IDggJiYgIXN0cmNtcChwcml2LT5vd25lciwgaWQzX3ByaXZfb3duZXJfdHMpKSB7CisgICAgICAgICAgICAgICAgLyogMzMtYml0IE1QRUcgdGltZXN0YW1wICovCisgICAgICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFWX1JCNjQocHJpdi0+ZGF0YSk7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkhMUyBJRDMgYXVkaW8gdGltZXN0YW1wICUiUFJJZDY0IlxuIiwgdHMpOworICAgICAgICAgICAgICAgIGlmICgodHMgJiB+KCgxVUxMIDw8IDMzKSAtIDEpKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAqZHRzID0gdHM7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBITFMgSUQzIGF1ZGlvIHRpbWVzdGFtcCAlIlBSSWQ2NCJcbiIsIHRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG1ldGEtPnRhZywgIkFQSUMiKSAmJiBhcGljKQorICAgICAgICAgICAgKmFwaWMgPSBtZXRhLT5kYXRhOworICAgIH0KK30KKworLyogQ2hlY2sgaWYgdGhlIElEMyBtZXRhZGF0YSBjb250ZW50cyBoYXZlIGNoYW5nZWQgKi8KK3N0YXRpYyBpbnQgaWQzX2hhc19jaGFuZ2VkX3ZhbHVlcyhzdHJ1Y3QgcGxheWxpc3QgKnBscywgQVZEaWN0aW9uYXJ5ICptZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDN2MkV4dHJhTWV0YUFQSUMgKmFwaWMpCit7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmVudHJ5ID0gTlVMTDsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqb2xkZW50cnk7CisgICAgLyogY2hlY2sgdGhhdCBubyBrZXlzIGhhdmUgY2hhbmdlZCB2YWx1ZXMgKi8KKyAgICB3aGlsZSAoKGVudHJ5ID0gYXZfZGljdF9nZXQobWV0YWRhdGEsICIiLCBlbnRyeSwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgb2xkZW50cnkgPSBhdl9kaWN0X2dldChwbHMtPmlkM19pbml0aWFsLCBlbnRyeS0+a2V5LCBOVUxMLCBBVl9ESUNUX01BVENIX0NBU0UpOworICAgICAgICBpZiAoIW9sZGVudHJ5IHx8IHN0cmNtcChvbGRlbnRyeS0+dmFsdWUsIGVudHJ5LT52YWx1ZSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGNoZWNrIGlmIGFwaWMgYXBwZWFyZWQgKi8KKyAgICBpZiAoYXBpYyAmJiAocGxzLT5jdHgtPm5iX3N0cmVhbXMgIT0gMiB8fCAhcGxzLT5jdHgtPnN0cmVhbXNbMV0tPmF0dGFjaGVkX3BpYy5kYXRhKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoYXBpYykgeworICAgICAgICBpbnQgc2l6ZSA9IHBscy0+Y3R4LT5zdHJlYW1zWzFdLT5hdHRhY2hlZF9waWMuc2l6ZTsKKyAgICAgICAgaWYgKHNpemUgIT0gYXBpYy0+YnVmLT5zaXplIC0gRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIGlmIChtZW1jbXAoYXBpYy0+YnVmLT5kYXRhLCBwbHMtPmN0eC0+c3RyZWFtc1sxXS0+YXR0YWNoZWRfcGljLmRhdGEsIHNpemUpICE9IDApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogUGFyc2UgSUQzIGRhdGEgYW5kIGhhbmRsZSB0aGUgZm91bmQgZGF0YSAqLworc3RhdGljIHZvaWQgaGFuZGxlX2lkMyhBVklPQ29udGV4dCAqcGIsIHN0cnVjdCBwbGF5bGlzdCAqcGxzKQoreworICAgIEFWRGljdGlvbmFyeSAqbWV0YWRhdGEgPSBOVUxMOworICAgIElEM3YyRXh0cmFNZXRhQVBJQyAqYXBpYyA9IE5VTEw7CisgICAgSUQzdjJFeHRyYU1ldGEgKmV4dHJhX21ldGEgPSBOVUxMOworICAgIGludDY0X3QgdGltZXN0YW1wID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBwYXJzZV9pZDMocGxzLT5jdHgsIHBiLCAmbWV0YWRhdGEsICZ0aW1lc3RhbXAsICZhcGljLCAmZXh0cmFfbWV0YSk7CisKKyAgICBpZiAodGltZXN0YW1wICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIHBscy0+aWQzX21wZWd0c190aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHBscy0+aWQzX29mZnNldCA9IDA7CisgICAgfQorCisgICAgaWYgKCFwbHMtPmlkM19mb3VuZCkgeworICAgICAgICAvKiBpbml0aWFsIElEMyB0YWdzICovCisgICAgICAgIGF2X2Fzc2VydDAoIXBscy0+aWQzX2RlZmVycmVkX2V4dHJhKTsKKyAgICAgICAgcGxzLT5pZDNfZm91bmQgPSAxOworCisgICAgICAgIC8qIGdldCBwaWN0dXJlIGF0dGFjaG1lbnQgYW5kIHNldCB0ZXh0IG1ldGFkYXRhICovCisgICAgICAgIGlmIChwbHMtPmN0eC0+bmJfc3RyZWFtcykKKyAgICAgICAgICAgIGZmX2lkM3YyX3BhcnNlX2FwaWMocGxzLT5jdHgsICZleHRyYV9tZXRhKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogZGVtdXhlciBub3QgeWV0IG9wZW5lZCwgZGVmZXIgcGljdHVyZSBhdHRhY2htZW50ICovCisgICAgICAgICAgICBwbHMtPmlkM19kZWZlcnJlZF9leHRyYSA9IGV4dHJhX21ldGE7CisKKyAgICAgICAgYXZfZGljdF9jb3B5KCZwbHMtPmN0eC0+bWV0YWRhdGEsIG1ldGFkYXRhLCAwKTsKKyAgICAgICAgcGxzLT5pZDNfaW5pdGlhbCA9IG1ldGFkYXRhOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFwbHMtPmlkM19jaGFuZ2VkICYmIGlkM19oYXNfY2hhbmdlZF92YWx1ZXMocGxzLCBtZXRhZGF0YSwgYXBpYykpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHBscy0+Y3R4LCAiQ2hhbmdpbmcgSUQzIG1ldGFkYXRhIGluIEhMUyBhdWRpbyBlbGVtZW50YXJ5IHN0cmVhbSIpOworICAgICAgICAgICAgcGxzLT5pZDNfY2hhbmdlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYXZfZGljdF9mcmVlKCZtZXRhZGF0YSk7CisgICAgfQorCisgICAgaWYgKCFwbHMtPmlkM19kZWZlcnJlZF9leHRyYSkKKyAgICAgICAgZmZfaWQzdjJfZnJlZV9leHRyYV9tZXRhKCZleHRyYV9tZXRhKTsKK30KKworLyogSW50ZXJjZXB0IGFuZCBoYW5kbGUgSUQzIHRhZ3MgYmV0d2VlbiBVUkxDb250ZXh0IGFuZCBBVklPQ29udGV4dCAqLworc3RhdGljIHZvaWQgaW50ZXJjZXB0X2lkMyhzdHJ1Y3QgcGxheWxpc3QgKnBscywgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSwgaW50ICpsZW4pCit7CisgICAgLyogaW50ZXJjZXB0IGlkMyB0YWdzLCB3ZSBkbyBub3Qgd2FudCB0byBwYXNzIHRoZW0gdG8gdGhlIHJhdworICAgICAqIGRlbXV4ZXIgb24gYWxsIHNlZ21lbnQgc3dpdGNoZXMgKi8KKyAgICBpbnQgYnl0ZXM7CisgICAgaW50IGlkM19idWZfcG9zID0gMDsKKyAgICBpbnQgZmlsbF9idWYgPSAwOworCisgICAgLyogZ2F0aGVyIGFsbCB0aGUgaWQzIHRhZ3MgKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgICAvKiBzZWUgaWYgd2UgY2FuIHJldHJpZXZlIGVub3VnaCBkYXRhIGZvciBJRDMgaGVhZGVyICovCisgICAgICAgIGlmICgqbGVuIDwgSUQzdjJfSEVBREVSX1NJWkUgJiYgYnVmX3NpemUgPj0gSUQzdjJfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgICAgIGJ5dGVzID0gcmVhZF9mcm9tX3VybChwbHMsIGJ1ZiArICpsZW4sIElEM3YyX0hFQURFUl9TSVpFIC0gKmxlbiwgUkVBRF9DT01QTEVURSk7CisgICAgICAgICAgICBpZiAoYnl0ZXMgPiAwKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXMgPT0gSUQzdjJfSEVBREVSX1NJWkUgLSAqbGVuKQorICAgICAgICAgICAgICAgICAgICAvKiBubyBFT0YgeWV0LCBzbyBmaWxsIHRoZSBjYWxsZXIgYnVmZmVyIGFnYWluIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAqIHdlIGhhdmUgc3RyaXBwZWQgdGhlIElEMyB0YWdzICovCisgICAgICAgICAgICAgICAgICAgIGZpbGxfYnVmID0gMTsKKworICAgICAgICAgICAgICAgICpsZW4gKz0gYnl0ZXM7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKmxlbiA8PSAwKSB7CisgICAgICAgICAgICAgICAgLyogZXJyb3IvRU9GICovCisgICAgICAgICAgICAgICAgKmxlbiA9IGJ5dGVzOworICAgICAgICAgICAgICAgIGZpbGxfYnVmID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgqbGVuIDwgSUQzdjJfSEVBREVSX1NJWkUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoZmZfaWQzdjJfbWF0Y2goYnVmLCBJRDN2Ml9ERUZBVUxUX01BR0lDKSkgeworICAgICAgICAgICAgc3RydWN0IHNlZ21lbnQgKnNlZyA9IHBscy0+c2VnbWVudHNbcGxzLT5jdXJfc2VxX25vIC0gcGxzLT5zdGFydF9zZXFfbm9dOworICAgICAgICAgICAgaW50NjRfdCBtYXhzaXplID0gc2VnLT5zaXplID49IDAgPyBzZWctPnNpemUgOiAxMDI0KjEwMjQ7CisgICAgICAgICAgICBpbnQgdGFnbGVuID0gZmZfaWQzdjJfdGFnX2xlbihidWYpOworICAgICAgICAgICAgaW50IHRhZ19nb3RfYnl0ZXMgPSBGRk1JTih0YWdsZW4sICpsZW4pOworICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IHRhZ2xlbiAtIHRhZ19nb3RfYnl0ZXM7CisKKyAgICAgICAgICAgIGlmICh0YWdsZW4gPiBtYXhzaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHBscy0+Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbGFyZ2UgSExTIElEMyB0YWcgKCVkID4gJSJQUklkNjQiIGJ5dGVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGFnbGVuLCBtYXhzaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgdGhlIGlkMyB0YWcgdG8gb3VyIHRlbXBvcmFyeSBpZDMgYnVmZmVyLgorICAgICAgICAgICAgICogV2UgY291bGQgcmVhZCBhIHNtYWxsIGlkMyB0YWcgZGlyZWN0bHkgd2l0aG91dCBtZW1jcHksIGJ1dAorICAgICAgICAgICAgICogd2Ugd291bGQgc3RpbGwgbmVlZCB0byBjb3B5IHRoZSBsYXJnZSB0YWdzLCBhbmQgaGFuZGxpbmcKKyAgICAgICAgICAgICAqIGJvdGggb2YgdGhvc2UgY2FzZXMgdG9nZXRoZXIgd2l0aCB0aGUgcG9zc2liaWxpdHkgZm9yIG11bHRpcGxlCisgICAgICAgICAgICAgKiB0YWdzIHdvdWxkIG1ha2UgdGhlIGhhbmRsaW5nIGEgYml0IGNvbXBsZXguCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBscy0+aWQzX2J1ZiA9IGF2X2Zhc3RfcmVhbGxvYyhwbHMtPmlkM19idWYsICZwbHMtPmlkM19idWZfc2l6ZSwgaWQzX2J1Zl9wb3MgKyB0YWdsZW4pOworICAgICAgICAgICAgaWYgKCFwbHMtPmlkM19idWYpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtZW1jcHkocGxzLT5pZDNfYnVmICsgaWQzX2J1Zl9wb3MsIGJ1ZiwgdGFnX2dvdF9ieXRlcyk7CisgICAgICAgICAgICBpZDNfYnVmX3BvcyArPSB0YWdfZ290X2J5dGVzOworCisgICAgICAgICAgICAvKiBzdHJpcCB0aGUgaW50ZXJjZXB0ZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgICpsZW4gLT0gdGFnX2dvdF9ieXRlczsKKyAgICAgICAgICAgIG1lbW1vdmUoYnVmLCBidWYgKyB0YWdfZ290X2J5dGVzLCAqbGVuKTsKKyAgICAgICAgICAgIGF2X2xvZyhwbHMtPmN0eCwgQVZfTE9HX0RFQlVHLCAiU3RyaXBwZWQgJWQgSExTIElEMyBieXRlc1xuIiwgdGFnX2dvdF9ieXRlcyk7CisKKyAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgLyogcmVhZCB0aGUgcmVzdCBvZiB0aGUgdGFnIGluICovCisgICAgICAgICAgICAgICAgaWYgKHJlYWRfZnJvbV91cmwocGxzLCBwbHMtPmlkM19idWYgKyBpZDNfYnVmX3BvcywgcmVtYWluaW5nLCBSRUFEX0NPTVBMRVRFKSAhPSByZW1haW5pbmcpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlkM19idWZfcG9zICs9IHJlbWFpbmluZzsKKyAgICAgICAgICAgICAgICBhdl9sb2cocGxzLT5jdHgsIEFWX0xPR19ERUJVRywgIlN0cmlwcGVkIGFkZGl0aW9uYWwgJWQgSExTIElEMyBieXRlc1xuIiwgcmVtYWluaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogbm8gbW9yZSBJRDMgdGFncyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZS1maWxsIGJ1ZmZlciBmb3IgdGhlIGNhbGxlciB1bmxlc3MgRU9GICovCisgICAgaWYgKCpsZW4gPj0gMCAmJiAoZmlsbF9idWYgfHwgKmxlbiA9PSAwKSkgeworICAgICAgICBieXRlcyA9IHJlYWRfZnJvbV91cmwocGxzLCBidWYgKyAqbGVuLCBidWZfc2l6ZSAtICpsZW4sIFJFQURfTk9STUFMKTsKKworICAgICAgICAvKiBpZ25vcmUgZXJyb3IgaWYgd2UgYWxyZWFkeSBoYWQgc29tZSBkYXRhICovCisgICAgICAgIGlmIChieXRlcyA+PSAwKQorICAgICAgICAgICAgKmxlbiArPSBieXRlczsKKyAgICAgICAgZWxzZSBpZiAoKmxlbiA9PSAwKQorICAgICAgICAgICAgKmxlbiA9IGJ5dGVzOworICAgIH0KKworICAgIGlmIChwbHMtPmlkM19idWYpIHsKKyAgICAgICAgLyogTm93IHBhcnNlIGFsbCB0aGUgSUQzIHRhZ3MgKi8KKyAgICAgICAgQVZJT0NvbnRleHQgaWQzaW9jdHg7CisgICAgICAgIGZmaW9faW5pdF9jb250ZXh0KCZpZDNpb2N0eCwgcGxzLT5pZDNfYnVmLCBpZDNfYnVmX3BvcywgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgIGhhbmRsZV9pZDMoJmlkM2lvY3R4LCBwbHMpOworICAgIH0KKworICAgIGlmIChwbHMtPmlzX2lkM190aW1lc3RhbXBlZCA9PSAtMSkKKyAgICAgICAgcGxzLT5pc19pZDNfdGltZXN0YW1wZWQgPSAocGxzLT5pZDNfbXBlZ3RzX3RpbWVzdGFtcCAhPSBBVl9OT1BUU19WQUxVRSk7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9pbnB1dChITFNDb250ZXh0ICpjLCBzdHJ1Y3QgcGxheWxpc3QgKnBscykKK3sKKyAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOworICAgIEFWRGljdGlvbmFyeSAqb3B0czIgPSBOVUxMOworICAgIGludCByZXQ7CisgICAgc3RydWN0IHNlZ21lbnQgKnNlZyA9IHBscy0+c2VnbWVudHNbcGxzLT5jdXJfc2VxX25vIC0gcGxzLT5zdGFydF9zZXFfbm9dOworCisgICAgLy8gYnJva2VyIHByaW9yIEhUVFAgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSBjb25zaXN0ZW50IGFjcm9zcyByZXF1ZXN0cworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAidXNlci1hZ2VudCIsIGMtPnVzZXJfYWdlbnQsIDApOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAiY29va2llcyIsIGMtPmNvb2tpZXMsIDApOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAiaGVhZGVycyIsIGMtPmhlYWRlcnMsIDApOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAic2Vla2FibGUiLCAiMCIsIDApOworCisgICAgLy8gU2FtZSBvcHRzIGZvciBrZXkgcmVxdWVzdCAoZmZ1cmxfb3BlbiBtdXRpbGF0ZXMgdGhlIG9wdHMgc28gaXQgY2Fubm90IGJlIHVzZWQgdHdpY2UpCisgICAgYXZfZGljdF9jb3B5KCZvcHRzMiwgb3B0cywgMCk7CisKKyAgICBpZiAoc2VnLT5zaXplID49IDApIHsKKyAgICAgICAgLyogdHJ5IHRvIHJlc3RyaWN0IHRoZSBIVFRQIHJlcXVlc3QgdG8gdGhlIHBhcnQgd2Ugd2FudAorICAgICAgICAgKiAoaWYgdGhpcyBpcyBpbiBmYWN0IGEgSFRUUCByZXF1ZXN0KSAqLworICAgICAgICBhdl9kaWN0X3NldF9pbnQoJm9wdHMsICJvZmZzZXQiLCBzZWctPnVybF9vZmZzZXQsIDApOworICAgICAgICBhdl9kaWN0X3NldF9pbnQoJm9wdHMsICJlbmRfb2Zmc2V0Iiwgc2VnLT51cmxfb2Zmc2V0ICsgc2VnLT5zaXplLCAwKTsKKyAgICB9CisKKyAgICBhdl9sb2cocGxzLT5wYXJlbnQsIEFWX0xPR19WRVJCT1NFLCAiSExTIHJlcXVlc3QgZm9yIHVybCAnJXMnLCBvZmZzZXQgJSJQUklkNjQiLCBwbGF5bGlzdCAlZFxuIiwKKyAgICAgICAgICAgc2VnLT51cmwsIHNlZy0+dXJsX29mZnNldCwgcGxzLT5pbmRleCk7CisKKyAgICBpZiAoc2VnLT5rZXlfdHlwZSA9PSBLRVlfTk9ORSkgeworICAgICAgICByZXQgPSBmZnVybF9vcGVuKCZwbHMtPmlucHV0LCBzZWctPnVybCwgQVZJT19GTEFHX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwbHMtPnBhcmVudC0+aW50ZXJydXB0X2NhbGxiYWNrLCAmb3B0cyk7CisKKyAgICB9IGVsc2UgaWYgKHNlZy0+a2V5X3R5cGUgPT0gS0VZX0FFU18xMjgpIHsKKyAgICAgICAgY2hhciBpdlszM10sIGtleVszM10sIHVybFtNQVhfVVJMX1NJWkVdOworICAgICAgICBpZiAoc3RyY21wKHNlZy0+a2V5LCBwbHMtPmtleV91cmwpKSB7CisgICAgICAgICAgICBVUkxDb250ZXh0ICp1YzsKKyAgICAgICAgICAgIGlmIChmZnVybF9vcGVuKCZ1Yywgc2VnLT5rZXksIEFWSU9fRkxBR19SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBscy0+cGFyZW50LT5pbnRlcnJ1cHRfY2FsbGJhY2ssICZvcHRzMikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChmZnVybF9yZWFkX2NvbXBsZXRlKHVjLCBwbHMtPmtleSwgc2l6ZW9mKHBscy0+a2V5KSkKKyAgICAgICAgICAgICAgICAgICAgIT0gc2l6ZW9mKHBscy0+a2V5KSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHJlYWQga2V5IGZpbGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWctPmtleSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZmdXJsX2Nsb3NlKHVjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBvcGVuIGtleSBmaWxlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzZWctPmtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9zdHJsY3B5KHBscy0+a2V5X3VybCwgc2VnLT5rZXksIHNpemVvZihwbHMtPmtleV91cmwpKTsKKyAgICAgICAgfQorICAgICAgICBmZl9kYXRhX3RvX2hleChpdiwgc2VnLT5pdiwgc2l6ZW9mKHNlZy0+aXYpLCAwKTsKKyAgICAgICAgZmZfZGF0YV90b19oZXgoa2V5LCBwbHMtPmtleSwgc2l6ZW9mKHBscy0+a2V5KSwgMCk7CisgICAgICAgIGl2WzMyXSA9IGtleVszMl0gPSAnXDAnOworICAgICAgICBpZiAoc3Ryc3RyKHNlZy0+dXJsLCAiOi8vIikpCisgICAgICAgICAgICBzbnByaW50Zih1cmwsIHNpemVvZih1cmwpLCAiY3J5cHRvKyVzIiwgc2VnLT51cmwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzbnByaW50Zih1cmwsIHNpemVvZih1cmwpLCAiY3J5cHRvOiVzIiwgc2VnLT51cmwpOworICAgICAgICBpZiAoKHJldCA9IGZmdXJsX2FsbG9jKCZwbHMtPmlucHV0LCB1cmwsIEFWSU9fRkxBR19SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwbHMtPnBhcmVudC0+aW50ZXJydXB0X2NhbGxiYWNrKSkgPCAwKQorICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBhdl9vcHRfc2V0KHBscy0+aW5wdXQtPnByaXZfZGF0YSwgImtleSIsIGtleSwgMCk7CisgICAgICAgIGF2X29wdF9zZXQocGxzLT5pbnB1dC0+cHJpdl9kYXRhLCAiaXYiLCBpdiwgMCk7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZnVybF9jb25uZWN0KHBscy0+aW5wdXQsICZvcHRzKSkgPCAwKSB7CisgICAgICAgICAgICBmZnVybF9jbG9zZShwbHMtPmlucHV0KTsKKyAgICAgICAgICAgIHBscy0+aW5wdXQgPSBOVUxMOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgICAgIHJldCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldCA9IEFWRVJST1IoRU5PU1lTKTsKKworICAgIC8qIFNlZWsgdG8gdGhlIHJlcXVlc3RlZCBwb3NpdGlvbi4gSWYgdGhpcyB3YXMgYSBIVFRQIHJlcXVlc3QsIHRoZSBvZmZzZXQKKyAgICAgKiBzaG91bGQgYWxyZWFkeSBiZSB3aGVyZSB3YW50IGl0IHRvLCBidXQgdGhpcyBhbGxvd3MgZS5nLiBsb2NhbCB0ZXN0aW5nCisgICAgICogd2l0aG91dCBhIEhUVFAgc2VydmVyLiAqLworICAgIGlmIChyZXQgPT0gMCAmJiBzZWctPmtleV90eXBlID09IEtFWV9OT05FKSB7CisgICAgICAgIGludCBzZWVrcmV0ID0gZmZ1cmxfc2VlayhwbHMtPmlucHV0LCBzZWctPnVybF9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgaWYgKHNlZWtyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocGxzLT5wYXJlbnQsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBzZWVrIHRvIG9mZnNldCAlIlBSSWQ2NCIgb2YgSExTIHNlZ21lbnQgJyVzJ1xuIiwgc2VnLT51cmxfb2Zmc2V0LCBzZWctPnVybCk7CisgICAgICAgICAgICByZXQgPSBzZWVrcmV0OworICAgICAgICAgICAgZmZ1cmxfY2xvc2UocGxzLT5pbnB1dCk7CisgICAgICAgICAgICBwbHMtPmlucHV0ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworY2xlYW51cDoKKyAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgIGF2X2RpY3RfZnJlZSgmb3B0czIpOworICAgIHBscy0+Y3VyX3NlZ19vZmZzZXQgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGRlZmF1bHRfcmVsb2FkX2ludGVydmFsKHN0cnVjdCBwbGF5bGlzdCAqcGxzKQoreworICAgIHJldHVybiBwbHMtPm5fc2VnbWVudHMgPiAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGxzLT5zZWdtZW50c1twbHMtPm5fc2VnbWVudHMgLSAxXS0+ZHVyYXRpb24gOgorICAgICAgICAgICAgICAgICAgICAgICAgICBwbHMtPnRhcmdldF9kdXJhdGlvbjsKK30KKworc3RhdGljIGludCByZWFkX2RhdGEodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgcGxheWxpc3QgKnYgPSBvcGFxdWU7CisgICAgSExTQ29udGV4dCAqYyA9IHYtPnBhcmVudC0+cHJpdl9kYXRhOworICAgIGludCByZXQsIGk7CisgICAgaW50IGp1c3Rfb3BlbmVkID0gMDsKKworcmVzdGFydDoKKyAgICBpZiAoIXYtPm5lZWRlZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgaWYgKCF2LT5pbnB1dCkgeworICAgICAgICBpbnQ2NF90IHJlbG9hZF9pbnRlcnZhbDsKKworICAgICAgICAvKiBDaGVjayB0aGF0IHRoZSBwbGF5bGlzdCBpcyBzdGlsbCBuZWVkZWQgYmVmb3JlIG9wZW5pbmcgYSBuZXcKKyAgICAgICAgICogc2VnbWVudC4gKi8KKyAgICAgICAgaWYgKHYtPmN0eCAmJiB2LT5jdHgtPm5iX3N0cmVhbXMgJiYKKyAgICAgICAgICAgIHYtPnBhcmVudC0+bmJfc3RyZWFtcyA+PSB2LT5zdHJlYW1fb2Zmc2V0ICsgdi0+Y3R4LT5uYl9zdHJlYW1zKSB7CisgICAgICAgICAgICB2LT5uZWVkZWQgPSAwOworICAgICAgICAgICAgZm9yIChpID0gdi0+c3RyZWFtX29mZnNldDsgaSA8IHYtPnN0cmVhbV9vZmZzZXQgKyB2LT5jdHgtPm5iX3N0cmVhbXM7CisgICAgICAgICAgICAgICAgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHYtPnBhcmVudC0+c3RyZWFtc1tpXS0+ZGlzY2FyZCA8IEFWRElTQ0FSRF9BTEwpCisgICAgICAgICAgICAgICAgICAgIHYtPm5lZWRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF2LT5uZWVkZWQpIHsKKyAgICAgICAgICAgIGF2X2xvZyh2LT5wYXJlbnQsIEFWX0xPR19JTkZPLCAiTm8gbG9uZ2VyIHJlY2VpdmluZyBwbGF5bGlzdCAlZFxuIiwKKyAgICAgICAgICAgICAgICB2LT5pbmRleCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB0aGlzIGlzIGEgbGl2ZSBzdHJlYW0gYW5kIHRoZSByZWxvYWQgaW50ZXJ2YWwgaGFzIGVsYXBzZWQgc2luY2UKKyAgICAgICAgICogdGhlIGxhc3QgcGxheWxpc3QgcmVsb2FkLCByZWxvYWQgdGhlIHBsYXlsaXN0cyBub3cuICovCisgICAgICAgIHJlbG9hZF9pbnRlcnZhbCA9IGRlZmF1bHRfcmVsb2FkX2ludGVydmFsKHYpOworCityZWxvYWQ6CisgICAgICAgIGlmICghdi0+ZmluaXNoZWQgJiYKKyAgICAgICAgICAgIGF2X2dldHRpbWVfcmVsYXRpdmUoKSAtIHYtPmxhc3RfbG9hZF90aW1lID49IHJlbG9hZF9pbnRlcnZhbCkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9wbGF5bGlzdChjLCB2LT51cmwsIHYsIE5VTEwpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2codi0+cGFyZW50LCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byByZWxvYWQgcGxheWxpc3QgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHYtPmluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgd2UgbmVlZCB0byByZWxvYWQgdGhlIHBsYXlsaXN0IGFnYWluIGJlbG93IChpZgorICAgICAgICAgICAgICogdGhlcmUncyBzdGlsbCBubyBtb3JlIHNlZ21lbnRzKSwgc3dpdGNoIHRvIGEgcmVsb2FkCisgICAgICAgICAgICAgKiBpbnRlcnZhbCBvZiBoYWxmIHRoZSB0YXJnZXQgZHVyYXRpb24uICovCisgICAgICAgICAgICByZWxvYWRfaW50ZXJ2YWwgPSB2LT50YXJnZXRfZHVyYXRpb24gLyAyOworICAgICAgICB9CisgICAgICAgIGlmICh2LT5jdXJfc2VxX25vIDwgdi0+c3RhcnRfc2VxX25vKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgInNraXBwaW5nICVkIHNlZ21lbnRzIGFoZWFkLCBleHBpcmVkIGZyb20gcGxheWxpc3RzXG4iLAorICAgICAgICAgICAgICAgICAgIHYtPnN0YXJ0X3NlcV9ubyAtIHYtPmN1cl9zZXFfbm8pOworICAgICAgICAgICAgdi0+Y3VyX3NlcV9ubyA9IHYtPnN0YXJ0X3NlcV9ubzsKKyAgICAgICAgfQorICAgICAgICBpZiAodi0+Y3VyX3NlcV9ubyA+PSB2LT5zdGFydF9zZXFfbm8gKyB2LT5uX3NlZ21lbnRzKSB7CisgICAgICAgICAgICBpZiAodi0+ZmluaXNoZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAgICAgd2hpbGUgKGF2X2dldHRpbWVfcmVsYXRpdmUoKSAtIHYtPmxhc3RfbG9hZF90aW1lIDwgcmVsb2FkX2ludGVydmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKGZmX2NoZWNrX2ludGVycnVwdChjLT5pbnRlcnJ1cHRfY2FsbGJhY2spKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgICAgICAgICAgICAgIGF2X3VzbGVlcCgxMDAqMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBFbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCByZWxvYWQgKi8KKyAgICAgICAgICAgIGdvdG8gcmVsb2FkOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gb3Blbl9pbnB1dChjLCB2KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyh2LT5wYXJlbnQsIEFWX0xPR19XQVJOSU5HLCAiRmFpbGVkIHRvIG9wZW4gc2VnbWVudCBvZiBwbGF5bGlzdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICB2LT5pbmRleCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGp1c3Rfb3BlbmVkID0gMTsKKyAgICB9CisKKyAgICByZXQgPSByZWFkX2Zyb21fdXJsKHYsIGJ1ZiwgYnVmX3NpemUsIFJFQURfTk9STUFMKTsKKyAgICBpZiAocmV0ID4gMCkgeworICAgICAgICBpZiAoanVzdF9vcGVuZWQgJiYgdi0+aXNfaWQzX3RpbWVzdGFtcGVkICE9IDApIHsKKyAgICAgICAgICAgIC8qIEludGVyY2VwdCBJRDMgdGFncyBoZXJlLCBlbGVtZW50YXJ5IGF1ZGlvIHN0cmVhbXMgYXJlIHJlcXVpcmVkCisgICAgICAgICAgICAgKiB0byBjb252ZXkgdGltZXN0YW1wcyB1c2luZyB0aGVtIGluIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzZWdtZW50LiAqLworICAgICAgICAgICAgaW50ZXJjZXB0X2lkMyh2LCBidWYsIGJ1Zl9zaXplLCAmcmV0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGZmdXJsX2Nsb3NlKHYtPmlucHV0KTsKKyAgICB2LT5pbnB1dCA9IE5VTEw7CisgICAgdi0+Y3VyX3NlcV9ubysrOworCisgICAgYy0+Y3VyX3NlcV9ubyA9IHYtPmN1cl9zZXFfbm87CisKKyAgICBnb3RvIHJlc3RhcnQ7Cit9CisKK3N0YXRpYyBpbnQgcGxheWxpc3RfaW5fbXVsdGlwbGVfdmFyaWFudHMoSExTQ29udGV4dCAqYywgc3RydWN0IHBsYXlsaXN0ICpwbHMpCit7CisgICAgaW50IHZhcmlhbnRfY291bnQgPSAwOworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGMtPm5fdmFyaWFudHMgJiYgdmFyaWFudF9jb3VudCA8IDI7IGkrKykgeworICAgICAgICBzdHJ1Y3QgdmFyaWFudCAqdiA9IGMtPnZhcmlhbnRzW2ldOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB2LT5uX3BsYXlsaXN0czsgaisrKSB7CisgICAgICAgICAgICBpZiAodi0+cGxheWxpc3RzW2pdID09IHBscykgeworICAgICAgICAgICAgICAgIHZhcmlhbnRfY291bnQrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2YXJpYW50X2NvdW50ID49IDI7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9yZW5kaXRpb25zX3RvX3ZhcmlhbnQoSExTQ29udGV4dCAqYywgc3RydWN0IHZhcmlhbnQgKnZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlLCBjb25zdCBjaGFyICpncm91cF9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX3JlbmRpdGlvbnM7IGkrKykgeworICAgICAgICBzdHJ1Y3QgcmVuZGl0aW9uICpyZW5kID0gYy0+cmVuZGl0aW9uc1tpXTsKKworICAgICAgICBpZiAocmVuZC0+dHlwZSA9PSB0eXBlICYmICFzdHJjbXAocmVuZC0+Z3JvdXBfaWQsIGdyb3VwX2lkKSkgeworCisgICAgICAgICAgICBpZiAocmVuZC0+cGxheWxpc3QpCisgICAgICAgICAgICAgICAgLyogcmVuZGl0aW9uIGlzIGFuIGV4dGVybmFsIHBsYXlsaXN0CisgICAgICAgICAgICAgICAgICogPT4gYWRkIHRoZSBwbGF5bGlzdCB0byB0aGUgdmFyaWFudCAqLworICAgICAgICAgICAgICAgIGR5bmFycmF5X2FkZCgmdmFyLT5wbGF5bGlzdHMsICZ2YXItPm5fcGxheWxpc3RzLCByZW5kLT5wbGF5bGlzdCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLyogcmVuZGl0aW9uIGlzIHBhcnQgb2YgdGhlIHZhcmlhbnQgbWFpbiBNZWRpYSBQbGF5bGlzdAorICAgICAgICAgICAgICAgICAqID0+IGFkZCB0aGUgcmVuZGl0aW9uIHRvIHRoZSBtYWluIE1lZGlhIFBsYXlsaXN0ICovCisgICAgICAgICAgICAgICAgZHluYXJyYXlfYWRkKCZ2YXItPnBsYXlsaXN0c1swXS0+cmVuZGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhci0+cGxheWxpc3RzWzBdLT5uX3JlbmRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmQpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGRfbWV0YWRhdGFfZnJvbV9yZW5kaXRpb25zKEFWRm9ybWF0Q29udGV4dCAqcywgc3RydWN0IHBsYXlsaXN0ICpwbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZSkKK3sKKyAgICBpbnQgcmVuZF9pZHggPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBscy0+Y3R4LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twbHMtPnN0cmVhbV9vZmZzZXQgKyBpXTsKKworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IHR5cGUpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmb3IgKDsgcmVuZF9pZHggPCBwbHMtPm5fcmVuZGl0aW9uczsgcmVuZF9pZHgrKykgeworICAgICAgICAgICAgc3RydWN0IHJlbmRpdGlvbiAqcmVuZCA9IHBscy0+cmVuZGl0aW9uc1tyZW5kX2lkeF07CisKKyAgICAgICAgICAgIGlmIChyZW5kLT50eXBlICE9IHR5cGUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChyZW5kLT5sYW5ndWFnZVswXSkKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAibGFuZ3VhZ2UiLCByZW5kLT5sYW5ndWFnZSwgMCk7CisgICAgICAgICAgICBpZiAocmVuZC0+bmFtZVswXSkKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAiY29tbWVudCIsIHJlbmQtPm5hbWUsIDApOworCisgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gfD0gcmVuZC0+ZGlzcG9zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlbmRfaWR4ID49cGxzLT5uX3JlbmRpdGlvbnMpCisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIGlmIHRpbWVzdGFtcCB3YXMgaW4gdmFsaWQgcmFuZ2U6IHJldHVybnMgMSBhbmQgc2V0cyBzZXFfbm8KKyAqIGlmIG5vdDogcmV0dXJucyAwIGFuZCBzZXRzIHNlcV9ubyB0byBjbG9zZXN0IHNlZ21lbnQgKi8KK3N0YXRpYyBpbnQgZmluZF90aW1lc3RhbXBfaW5fcGxheWxpc3QoSExTQ29udGV4dCAqYywgc3RydWN0IHBsYXlsaXN0ICpwbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgKnNlcV9ubykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQ2NF90IHBvcyA9IGMtPmZpcnN0X3RpbWVzdGFtcCA9PSBBVl9OT1BUU19WQUxVRSA/CisgICAgICAgICAgICAgICAgICAwIDogYy0+Zmlyc3RfdGltZXN0YW1wOworCisgICAgaWYgKHRpbWVzdGFtcCA8IHBvcykgeworICAgICAgICAqc2VxX25vID0gcGxzLT5zdGFydF9zZXFfbm87CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwbHMtPm5fc2VnbWVudHM7IGkrKykgeworICAgICAgICBpbnQ2NF90IGRpZmYgPSBwb3MgKyBwbHMtPnNlZ21lbnRzW2ldLT5kdXJhdGlvbiAtIHRpbWVzdGFtcDsKKyAgICAgICAgaWYgKGRpZmYgPiAwKSB7CisgICAgICAgICAgICAqc2VxX25vID0gcGxzLT5zdGFydF9zZXFfbm8gKyBpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcG9zICs9IHBscy0+c2VnbWVudHNbaV0tPmR1cmF0aW9uOworICAgIH0KKworICAgICpzZXFfbm8gPSBwbHMtPnN0YXJ0X3NlcV9ubyArIHBscy0+bl9zZWdtZW50cyAtIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZWxlY3RfY3VyX3NlcV9ubyhITFNDb250ZXh0ICpjLCBzdHJ1Y3QgcGxheWxpc3QgKnBscykKK3sKKyAgICBpbnQgc2VxX25vOworCisgICAgaWYgKCFwbHMtPmZpbmlzaGVkICYmICFjLT5maXJzdF9wYWNrZXQgJiYKKyAgICAgICAgYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gcGxzLT5sYXN0X2xvYWRfdGltZSA+PSBkZWZhdWx0X3JlbG9hZF9pbnRlcnZhbChwbHMpKQorICAgICAgICAvKiByZWxvYWQgdGhlIHBsYXlsaXN0IHNpbmNlIGl0IHdhcyBzdXNwZW5kZWQgKi8KKyAgICAgICAgcGFyc2VfcGxheWxpc3QoYywgcGxzLT51cmwsIHBscywgTlVMTCk7CisKKyAgICAvKiBJZiBwbGF5YmFjayBpcyBhbHJlYWR5IGluIHByb2dyZXNzICh3ZSBhcmUganVzdCBzZWxlY3RpbmcgYSBuZXcKKyAgICAgKiBwbGF5bGlzdCkgYW5kIHRoaXMgaXMgYSBjb21wbGV0ZSBmaWxlLCBmaW5kIHRoZSBtYXRjaGluZyBzZWdtZW50CisgICAgICogYnkgY291bnRpbmcgZHVyYXRpb25zLiAqLworICAgIGlmIChwbHMtPmZpbmlzaGVkICYmIGMtPmN1cl90aW1lc3RhbXAgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgZmluZF90aW1lc3RhbXBfaW5fcGxheWxpc3QoYywgcGxzLCBjLT5jdXJfdGltZXN0YW1wLCAmc2VxX25vKTsKKyAgICAgICAgcmV0dXJuIHNlcV9ubzsKKyAgICB9CisKKyAgICBpZiAoIXBscy0+ZmluaXNoZWQpIHsKKyAgICAgICAgaWYgKCFjLT5maXJzdF9wYWNrZXQgJiYgLyogd2UgYXJlIGRvaW5nIGEgc2VnbWVudCBzZWxlY3Rpb24gZHVyaW5nIHBsYXliYWNrICovCisgICAgICAgICAgICBjLT5jdXJfc2VxX25vID49IHBscy0+c3RhcnRfc2VxX25vICYmCisgICAgICAgICAgICBjLT5jdXJfc2VxX25vIDwgcGxzLT5zdGFydF9zZXFfbm8gKyBwbHMtPm5fc2VnbWVudHMpCisgICAgICAgICAgICAvKiBXaGlsZSBzcGVjIDMuNC4zIHNheXMgdGhhdCB3ZSBjYW5ub3QgYXNzdW1lIGFueXRoaW5nIGFib3V0IHRoZQorICAgICAgICAgICAgICogY29udGVudCBhdCB0aGUgc2FtZSBzZXF1ZW5jZSBudW1iZXIgb24gZGlmZmVyZW50IHBsYXlsaXN0cywKKyAgICAgICAgICAgICAqIGluIHByYWN0aWNlIHRoaXMgc2VlbXMgdG8gd29yayBhbmQgZG9pbmcgaXQgb3RoZXJ3aXNlIHdvdWxkCisgICAgICAgICAgICAgKiByZXF1aXJlIHVzIHRvIGRvd25sb2FkIGEgc2VnbWVudCB0byBpbnNwZWN0IGl0cyB0aW1lc3RhbXBzLiAqLworICAgICAgICAgICAgcmV0dXJuIGMtPmN1cl9zZXFfbm87CisKKyAgICAgICAgLyogSWYgdGhpcyBpcyBhIGxpdmUgc3RyZWFtIHdpdGggbW9yZSB0aGFuIDMgc2VnbWVudHMsIHN0YXJ0IGF0IHRoZQorICAgICAgICAgKiB0aGlyZCBsYXN0IHNlZ21lbnQuICovCisgICAgICAgIGlmIChwbHMtPm5fc2VnbWVudHMgPiAzKQorICAgICAgICAgICAgcmV0dXJuIHBscy0+c3RhcnRfc2VxX25vICsgcGxzLT5uX3NlZ21lbnRzIC0gMzsKKyAgICB9CisKKyAgICAvKiBPdGhlcndpc2UganVzdCBzdGFydCBvbiB0aGUgZmlyc3Qgc2VnbWVudC4gKi8KKyAgICByZXR1cm4gcGxzLT5zdGFydF9zZXFfbm87Cit9CisKK3N0YXRpYyBpbnQgaGxzX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBVUkxDb250ZXh0ICp1ID0gKHMtPmZsYWdzICYgQVZGTVRfRkxBR19DVVNUT01fSU8pID8gTlVMTCA6IHMtPnBiLT5vcGFxdWU7CisgICAgSExTQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0ID0gMCwgaSwgaiwgc3RyZWFtX29mZnNldCA9IDA7CisKKyAgICBjLT5pbnRlcnJ1cHRfY2FsbGJhY2sgPSAmcy0+aW50ZXJydXB0X2NhbGxiYWNrOworCisgICAgYy0+Zmlyc3RfcGFja2V0ID0gMTsKKyAgICBjLT5maXJzdF90aW1lc3RhbXAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBjLT5jdXJfdGltZXN0YW1wID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICAvLyBpZiB0aGUgVVJMIGNvbnRleHQgaXMgZ29vZCwgcmVhZCBpbXBvcnRhbnQgb3B0aW9ucyB3ZSBtdXN0IGJyb2tlciBsYXRlcgorICAgIGlmICh1ICYmIHUtPnByb3QtPnByaXZfZGF0YV9jbGFzcykgeworICAgICAgICAvLyBnZXQgdGhlIHByZXZpb3VzIHVzZXIgYWdlbnQgJiBzZXQgYmFjayB0byBudWxsIGlmIHN0cmluZyBzaXplIGlzIHplcm8KKyAgICAgICAgYXZfZnJlZXAoJmMtPnVzZXJfYWdlbnQpOworICAgICAgICBhdl9vcHRfZ2V0KHUtPnByaXZfZGF0YSwgInVzZXItYWdlbnQiLCAwLCAodWludDhfdCoqKSYoYy0+dXNlcl9hZ2VudCkpOworICAgICAgICBpZiAoYy0+dXNlcl9hZ2VudCAmJiAhc3RybGVuKGMtPnVzZXJfYWdlbnQpKQorICAgICAgICAgICAgYXZfZnJlZXAoJmMtPnVzZXJfYWdlbnQpOworCisgICAgICAgIC8vIGdldCB0aGUgcHJldmlvdXMgY29va2llcyAmIHNldCBiYWNrIHRvIG51bGwgaWYgc3RyaW5nIHNpemUgaXMgemVybworICAgICAgICBhdl9mcmVlcCgmYy0+Y29va2llcyk7CisgICAgICAgIGF2X29wdF9nZXQodS0+cHJpdl9kYXRhLCAiY29va2llcyIsIDAsICh1aW50OF90KiopJihjLT5jb29raWVzKSk7CisgICAgICAgIGlmIChjLT5jb29raWVzICYmICFzdHJsZW4oYy0+Y29va2llcykpCisgICAgICAgICAgICBhdl9mcmVlcCgmYy0+Y29va2llcyk7CisKKyAgICAgICAgLy8gZ2V0IHRoZSBwcmV2aW91cyBoZWFkZXJzICYgc2V0IGJhY2sgdG8gbnVsbCBpZiBzdHJpbmcgc2l6ZSBpcyB6ZXJvCisgICAgICAgIGF2X2ZyZWVwKCZjLT5oZWFkZXJzKTsKKyAgICAgICAgYXZfb3B0X2dldCh1LT5wcml2X2RhdGEsICJoZWFkZXJzIiwgMCwgKHVpbnQ4X3QqKikmKGMtPmhlYWRlcnMpKTsKKyAgICAgICAgaWYgKGMtPmhlYWRlcnMgJiYgIXN0cmxlbihjLT5oZWFkZXJzKSkKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZjLT5oZWFkZXJzKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHBhcnNlX3BsYXlsaXN0KGMsIHMtPmZpbGVuYW1lLCBOVUxMLCBzLT5wYikpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKGMtPm5fdmFyaWFudHMgPT0gMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJFbXB0eSBwbGF5bGlzdFxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfRU9GOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIC8qIElmIHRoZSBwbGF5bGlzdCBvbmx5IGNvbnRhaW5lZCBwbGF5bGlzdHMgKE1hc3RlciBQbGF5bGlzdCksCisgICAgICogcGFyc2UgZWFjaCBpbmRpdmlkdWFsIHBsYXlsaXN0LiAqLworICAgIGlmIChjLT5uX3BsYXlsaXN0cyA+IDEgfHwgYy0+cGxheWxpc3RzWzBdLT5uX3NlZ21lbnRzID09IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPm5fcGxheWxpc3RzOyBpKyspIHsKKyAgICAgICAgICAgIHN0cnVjdCBwbGF5bGlzdCAqcGxzID0gYy0+cGxheWxpc3RzW2ldOworICAgICAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9wbGF5bGlzdChjLCBwbHMtPnVybCwgcGxzLCBOVUxMKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjLT52YXJpYW50c1swXS0+cGxheWxpc3RzWzBdLT5uX3NlZ21lbnRzID09IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiRW1wdHkgcGxheWxpc3RcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0VPRjsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIElmIHRoaXMgaXNuJ3QgYSBsaXZlIHN0cmVhbSwgY2FsY3VsYXRlIHRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUKKyAgICAgKiBzdHJlYW0uICovCisgICAgaWYgKGMtPnZhcmlhbnRzWzBdLT5wbGF5bGlzdHNbMF0tPmZpbmlzaGVkKSB7CisgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+dmFyaWFudHNbMF0tPnBsYXlsaXN0c1swXS0+bl9zZWdtZW50czsgaSsrKQorICAgICAgICAgICAgZHVyYXRpb24gKz0gYy0+dmFyaWFudHNbMF0tPnBsYXlsaXN0c1swXS0+c2VnbWVudHNbaV0tPmR1cmF0aW9uOworICAgICAgICBzLT5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIH0KKworICAgIC8qIEFzc29jaWF0ZSByZW5kaXRpb25zIHdpdGggdmFyaWFudHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl92YXJpYW50czsgaSsrKSB7CisgICAgICAgIHN0cnVjdCB2YXJpYW50ICp2YXIgPSBjLT52YXJpYW50c1tpXTsKKworICAgICAgICBpZiAodmFyLT5hdWRpb19ncm91cFswXSkKKyAgICAgICAgICAgIGFkZF9yZW5kaXRpb25zX3RvX3ZhcmlhbnQoYywgdmFyLCBBVk1FRElBX1RZUEVfQVVESU8sIHZhci0+YXVkaW9fZ3JvdXApOworICAgICAgICBpZiAodmFyLT52aWRlb19ncm91cFswXSkKKyAgICAgICAgICAgIGFkZF9yZW5kaXRpb25zX3RvX3ZhcmlhbnQoYywgdmFyLCBBVk1FRElBX1RZUEVfVklERU8sIHZhci0+dmlkZW9fZ3JvdXApOworICAgICAgICBpZiAodmFyLT5zdWJ0aXRsZXNfZ3JvdXBbMF0pCisgICAgICAgICAgICBhZGRfcmVuZGl0aW9uc190b192YXJpYW50KGMsIHZhciwgQVZNRURJQV9UWVBFX1NVQlRJVExFLCB2YXItPnN1YnRpdGxlc19ncm91cCk7CisgICAgfQorCisgICAgLyogT3BlbiB0aGUgZGVtdXhlciBmb3IgZWFjaCBwbGF5bGlzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX3BsYXlsaXN0czsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBwbGF5bGlzdCAqcGxzID0gYy0+cGxheWxpc3RzW2ldOworICAgICAgICBBVklucHV0Rm9ybWF0ICppbl9mbXQgPSBOVUxMOworCisgICAgICAgIGlmIChwbHMtPm5fc2VnbWVudHMgPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICghKHBscy0+Y3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpKSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgcGxzLT5pbmRleCAgPSBpOworICAgICAgICBwbHMtPm5lZWRlZCA9IDE7CisgICAgICAgIHBscy0+cGFyZW50ID0gczsKKyAgICAgICAgcGxzLT5jdXJfc2VxX25vID0gc2VsZWN0X2N1cl9zZXFfbm8oYywgcGxzKTsKKworICAgICAgICBwbHMtPnJlYWRfYnVmZmVyID0gYXZfbWFsbG9jKElOSVRJQUxfQlVGRkVSX1NJWkUpOworICAgICAgICBmZmlvX2luaXRfY29udGV4dCgmcGxzLT5wYiwgcGxzLT5yZWFkX2J1ZmZlciwgSU5JVElBTF9CVUZGRVJfU0laRSwgMCwgcGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2RhdGEsIE5VTEwsIE5VTEwpOworICAgICAgICBwbHMtPnBiLnNlZWthYmxlID0gMDsKKyAgICAgICAgcmV0ID0gYXZfcHJvYmVfaW5wdXRfYnVmZmVyKCZwbHMtPnBiLCAmaW5fZm10LCBwbHMtPnNlZ21lbnRzWzBdLT51cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIC8qIEZyZWUgdGhlIGN0eCAtIGl0IGlzbid0IGluaXRpYWxpemVkIHByb3Blcmx5IGF0IHRoaXMgcG9pbnQsCisgICAgICAgICAgICAgKiBzbyBhdmZvcm1hdF9jbG9zZV9pbnB1dCBzaG91bGRuJ3QgYmUgY2FsbGVkLiBJZgorICAgICAgICAgICAgICogYXZmb3JtYXRfb3Blbl9pbnB1dCBmYWlscyBiZWxvdywgaXQgZnJlZXMgYW5kIHplcm9zIHRoZQorICAgICAgICAgICAgICogY29udGV4dCwgc28gaXQgZG9lc24ndCBuZWVkIGFueSBzcGVjaWFsIHRyZWF0bWVudCBsaWtlIHRoaXMuICovCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd2hlbiBsb2FkaW5nIGZpcnN0IHNlZ21lbnQgJyVzJ1xuIiwgcGxzLT5zZWdtZW50c1swXS0+dXJsKTsKKyAgICAgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChwbHMtPmN0eCk7CisgICAgICAgICAgICBwbHMtPmN0eCA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgcGxzLT5jdHgtPnBiICAgICAgID0gJnBscy0+cGI7CisgICAgICAgIHBscy0+c3RyZWFtX29mZnNldCA9IHN0cmVhbV9vZmZzZXQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9jb3B5X3doaXRlbGlzdHMocGxzLT5jdHgsIHMpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgcmV0ID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmcGxzLT5jdHgsIHBscy0+c2VnbWVudHNbMF0tPnVybCwgaW5fZm10LCBOVUxMKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgaWYgKHBscy0+aWQzX2RlZmVycmVkX2V4dHJhICYmIHBscy0+Y3R4LT5uYl9zdHJlYW1zID09IDEpIHsKKyAgICAgICAgICAgIGZmX2lkM3YyX3BhcnNlX2FwaWMocGxzLT5jdHgsICZwbHMtPmlkM19kZWZlcnJlZF9leHRyYSk7CisgICAgICAgICAgICBhdmZvcm1hdF9xdWV1ZV9hdHRhY2hlZF9waWN0dXJlcyhwbHMtPmN0eCk7CisgICAgICAgICAgICBmZl9pZDN2Ml9mcmVlX2V4dHJhX21ldGEoJnBscy0+aWQzX2RlZmVycmVkX2V4dHJhKTsKKyAgICAgICAgICAgIHBscy0+aWQzX2RlZmVycmVkX2V4dHJhID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHBscy0+Y3R4LT5jdHhfZmxhZ3MgJj0gfkFWRk1UQ1RYX05PSEVBREVSOworICAgICAgICByZXQgPSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKHBscy0+Y3R4LCBOVUxMKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgaWYgKHBscy0+aXNfaWQzX3RpbWVzdGFtcGVkID09IC0xKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiTm8gZXhwZWN0ZWQgSFRUUCByZXF1ZXN0cyBoYXZlIGJlZW4gbWFkZVxuIik7CisKKyAgICAgICAgLyogQ3JlYXRlIG5ldyBBVlN0cmVhbXMgZm9yIGVhY2ggc3RyZWFtIGluIHRoaXMgcGxheWxpc3QgKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHBscy0+Y3R4LT5uYl9zdHJlYW1zOyBqKyspIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgICAgICBBVlN0cmVhbSAqaXN0ID0gcGxzLT5jdHgtPnN0cmVhbXNbal07CisgICAgICAgICAgICBpZiAoIXN0KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0LT5pZCA9IGk7CisKKyAgICAgICAgICAgIGF2Y29kZWNfY29weV9jb250ZXh0KHN0LT5jb2RlYywgcGxzLT5jdHgtPnN0cmVhbXNbal0tPmNvZGVjKTsKKworICAgICAgICAgICAgaWYgKHBscy0+aXNfaWQzX3RpbWVzdGFtcGVkKSAvKiBjdXN0b20gdGltZXN0YW1wcyB2aWEgaWQzICovCisgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzMsIDEsIE1QRUdfVElNRV9CQVNFKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCBpc3QtPnB0c193cmFwX2JpdHMsIGlzdC0+dGltZV9iYXNlLm51bSwgaXN0LT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkZF9tZXRhZGF0YV9mcm9tX3JlbmRpdGlvbnMocywgcGxzLCBBVk1FRElBX1RZUEVfQVVESU8pOworICAgICAgICBhZGRfbWV0YWRhdGFfZnJvbV9yZW5kaXRpb25zKHMsIHBscywgQVZNRURJQV9UWVBFX1ZJREVPKTsKKyAgICAgICAgYWRkX21ldGFkYXRhX2Zyb21fcmVuZGl0aW9ucyhzLCBwbHMsIEFWTUVESUFfVFlQRV9TVUJUSVRMRSk7CisKKyAgICAgICAgc3RyZWFtX29mZnNldCArPSBwbHMtPmN0eC0+bmJfc3RyZWFtczsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgYSBwcm9ncmFtIGZvciBlYWNoIHZhcmlhbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl92YXJpYW50czsgaSsrKSB7CisgICAgICAgIHN0cnVjdCB2YXJpYW50ICp2ID0gYy0+dmFyaWFudHNbaV07CisgICAgICAgIEFWUHJvZ3JhbSAqcHJvZ3JhbTsKKworICAgICAgICBwcm9ncmFtID0gYXZfbmV3X3Byb2dyYW0ocywgaSk7CisgICAgICAgIGlmICghcHJvZ3JhbSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgYXZfZGljdF9zZXRfaW50KCZwcm9ncmFtLT5tZXRhZGF0YSwgInZhcmlhbnRfYml0cmF0ZSIsIHYtPmJhbmR3aWR0aCwgMCk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHYtPm5fcGxheWxpc3RzOyBqKyspIHsKKyAgICAgICAgICAgIHN0cnVjdCBwbGF5bGlzdCAqcGxzID0gdi0+cGxheWxpc3RzW2pdOworICAgICAgICAgICAgaW50IGlzX3NoYXJlZCA9IHBsYXlsaXN0X2luX211bHRpcGxlX3ZhcmlhbnRzKGMsIHBscyk7CisgICAgICAgICAgICBpbnQgazsKKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHBscy0+Y3R4LT5uYl9zdHJlYW1zOyBrKyspIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twbHMtPnN0cmVhbV9vZmZzZXQgKyBrXTsKKworICAgICAgICAgICAgICAgIGZmX3Byb2dyYW1fYWRkX3N0cmVhbV9pbmRleChzLCBpLCBwbHMtPnN0cmVhbV9vZmZzZXQgKyBrKTsKKworICAgICAgICAgICAgICAgIC8qIFNldCB2YXJpYW50X2JpdHJhdGUgZm9yIHN0cmVhbXMgdW5pcXVlIHRvIHRoaXMgdmFyaWFudCAqLworICAgICAgICAgICAgICAgIGlmICghaXNfc2hhcmVkICYmIHYtPmJhbmR3aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXRfaW50KCZzdC0+bWV0YWRhdGEsICJ2YXJpYW50X2JpdHJhdGUiLCB2LT5iYW5kd2lkdGgsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGZyZWVfcGxheWxpc3RfbGlzdChjKTsKKyAgICBmcmVlX3ZhcmlhbnRfbGlzdChjKTsKKyAgICBmcmVlX3JlbmRpdGlvbl9saXN0KGMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVjaGVja19kaXNjYXJkX2ZsYWdzKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGZpcnN0KQoreworICAgIEhMU0NvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGksIGNoYW5nZWQgPSAwOworCisgICAgLyogQ2hlY2sgaWYgYW55IG5ldyBzdHJlYW1zIGFyZSBuZWVkZWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl9wbGF5bGlzdHM7IGkrKykKKyAgICAgICAgYy0+cGxheWxpc3RzW2ldLT5jdXJfbmVlZGVkID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgc3RydWN0IHBsYXlsaXN0ICpwbHMgPSBjLT5wbGF5bGlzdHNbcy0+c3RyZWFtc1tpXS0+aWRdOworICAgICAgICBpZiAoc3QtPmRpc2NhcmQgPCBBVkRJU0NBUkRfQUxMKQorICAgICAgICAgICAgcGxzLT5jdXJfbmVlZGVkID0gMTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGMtPm5fcGxheWxpc3RzOyBpKyspIHsKKyAgICAgICAgc3RydWN0IHBsYXlsaXN0ICpwbHMgPSBjLT5wbGF5bGlzdHNbaV07CisgICAgICAgIGlmIChwbHMtPmN1cl9uZWVkZWQgJiYgIXBscy0+bmVlZGVkKSB7CisgICAgICAgICAgICBwbHMtPm5lZWRlZCA9IDE7CisgICAgICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICAgICAgICAgIHBscy0+Y3VyX3NlcV9ubyA9IHNlbGVjdF9jdXJfc2VxX25vKGMsIHBscyk7CisgICAgICAgICAgICBwbHMtPnBiLmVvZl9yZWFjaGVkID0gMDsKKyAgICAgICAgICAgIGlmIChjLT5jdXJfdGltZXN0YW1wICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgLyogY2F0Y2ggdXAgKi8KKyAgICAgICAgICAgICAgICBwbHMtPnNlZWtfdGltZXN0YW1wID0gYy0+Y3VyX3RpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICBwbHMtPnNlZWtfZmxhZ3MgPSBBVlNFRUtfRkxBR19BTlk7CisgICAgICAgICAgICAgICAgcGxzLT5zZWVrX3N0cmVhbV9pbmRleCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiTm93IHJlY2VpdmluZyBwbGF5bGlzdCAlZCwgc2VnbWVudCAlZFxuIiwgaSwgcGxzLT5jdXJfc2VxX25vKTsKKyAgICAgICAgfSBlbHNlIGlmIChmaXJzdCAmJiAhcGxzLT5jdXJfbmVlZGVkICYmIHBscy0+bmVlZGVkKSB7CisgICAgICAgICAgICBpZiAocGxzLT5pbnB1dCkKKyAgICAgICAgICAgICAgICBmZnVybF9jbG9zZShwbHMtPmlucHV0KTsKKyAgICAgICAgICAgIHBscy0+aW5wdXQgPSBOVUxMOworICAgICAgICAgICAgcGxzLT5uZWVkZWQgPSAwOworICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJObyBsb25nZXIgcmVjZWl2aW5nIHBsYXlsaXN0ICVkXG4iLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIHZvaWQgZmlsbF90aW1pbmdfZm9yX2lkM190aW1lc3RhbXBlZF9zdHJlYW0oc3RydWN0IHBsYXlsaXN0ICpwbHMpCit7CisgICAgaWYgKHBscy0+aWQzX29mZnNldCA+PSAwKSB7CisgICAgICAgIHBscy0+cGt0LmR0cyA9IHBscy0+aWQzX21wZWd0c190aW1lc3RhbXAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKHBscy0+aWQzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHMtPmN0eC0+c3RyZWFtc1twbHMtPnBrdC5zdHJlYW1faW5kZXhdLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR19USU1FX0JBU0VfUSk7CisgICAgICAgIGlmIChwbHMtPnBrdC5kdXJhdGlvbikKKyAgICAgICAgICAgIHBscy0+aWQzX29mZnNldCArPSBwbHMtPnBrdC5kdXJhdGlvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGxzLT5pZDNfb2Zmc2V0ID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogdGhlcmUgaGF2ZSBiZWVuIHBhY2tldHMgd2l0aCB1bmtub3duIGR1cmF0aW9uCisgICAgICAgICAqIHNpbmNlIHRoZSBsYXN0IGlkMyB0YWcsIHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuICovCisgICAgICAgIHBscy0+cGt0LmR0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIH0KKworICAgIGlmIChwbHMtPnBrdC5kdXJhdGlvbikKKyAgICAgICAgcGxzLT5wa3QuZHVyYXRpb24gPSBhdl9yZXNjYWxlX3EocGxzLT5wa3QuZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBscy0+Y3R4LT5zdHJlYW1zW3Bscy0+cGt0LnN0cmVhbV9pbmRleF0tPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR19USU1FX0JBU0VfUSk7CisKKyAgICBwbHMtPnBrdC5wdHMgPSBBVl9OT1BUU19WQUxVRTsKK30KKworc3RhdGljIEFWUmF0aW9uYWwgZ2V0X3RpbWViYXNlKHN0cnVjdCBwbGF5bGlzdCAqcGxzKQoreworICAgIGlmIChwbHMtPmlzX2lkM190aW1lc3RhbXBlZCkKKyAgICAgICAgcmV0dXJuIE1QRUdfVElNRV9CQVNFX1E7CisKKyAgICByZXR1cm4gcGxzLT5jdHgtPnN0cmVhbXNbcGxzLT5wa3Quc3RyZWFtX2luZGV4XS0+dGltZV9iYXNlOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfdHNfd2l0aF93cmFwZGV0ZWN0KGludDY0X3QgdHNfYSwgc3RydWN0IHBsYXlsaXN0ICpwbHNfYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0c19iLCBzdHJ1Y3QgcGxheWxpc3QgKnBsc19iKQoreworICAgIGludDY0X3Qgc2NhbGVkX3RzX2EgPSBhdl9yZXNjYWxlX3EodHNfYSwgZ2V0X3RpbWViYXNlKHBsc19hKSwgTVBFR19USU1FX0JBU0VfUSk7CisgICAgaW50NjRfdCBzY2FsZWRfdHNfYiA9IGF2X3Jlc2NhbGVfcSh0c19iLCBnZXRfdGltZWJhc2UocGxzX2IpLCBNUEVHX1RJTUVfQkFTRV9RKTsKKworICAgIHJldHVybiBhdl9jb21wYXJlX21vZChzY2FsZWRfdHNfYSwgc2NhbGVkX3RzX2IsIDFMTCA8PCAzMyk7Cit9CisKK3N0YXRpYyBpbnQgaGxzX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBITFNDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQsIGksIG1pbnBsYXlsaXN0ID0gLTE7CisKKyAgICByZWNoZWNrX2Rpc2NhcmRfZmxhZ3MocywgYy0+Zmlyc3RfcGFja2V0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX3BsYXlsaXN0czsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBwbGF5bGlzdCAqcGxzID0gYy0+cGxheWxpc3RzW2ldOworICAgICAgICAvKiBNYWtlIHN1cmUgd2UndmUgZ290IG9uZSBidWZmZXJlZCBwYWNrZXQgZnJvbSBlYWNoIG9wZW4gcGxheWxpc3QKKyAgICAgICAgICogc3RyZWFtICovCisgICAgICAgIGlmIChwbHMtPm5lZWRlZCAmJiAhcGxzLT5wa3QuZGF0YSkgeworICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRzX2RpZmY7CisgICAgICAgICAgICAgICAgQVZSYXRpb25hbCB0YjsKKyAgICAgICAgICAgICAgICByZXQgPSBhdl9yZWFkX2ZyYW1lKHBscy0+Y3R4LCAmcGxzLT5wa3QpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYXZpb19mZW9mKCZwbHMtPnBiKSAmJiByZXQgIT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICByZXNldF9wYWNrZXQoJnBscy0+cGt0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3RyZWFtX2luZGV4IGNoZWNrIHByZXZlbnRzIG1hdGNoaW5nIHBpY3R1cmUgYXR0YWNobWVudHMgZXRjLiAqLworICAgICAgICAgICAgICAgICAgICBpZiAocGxzLT5pc19pZDNfdGltZXN0YW1wZWQgJiYgcGxzLT5wa3Quc3RyZWFtX2luZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGF1ZGlvIGVsZW1lbnRhcnkgc3RyZWFtcyBhcmUgaWQzIHRpbWVzdGFtcGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX3RpbWluZ19mb3JfaWQzX3RpbWVzdGFtcGVkX3N0cmVhbShwbHMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMtPmZpcnN0X3RpbWVzdGFtcCA9PSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcGxzLT5wa3QuZHRzICAgICAgICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgYy0+Zmlyc3RfdGltZXN0YW1wID0gYXZfcmVzY2FsZV9xKHBscy0+cGt0LmR0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdGltZWJhc2UocGxzKSwgQVZfVElNRV9CQVNFX1EpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwbHMtPnNlZWtfdGltZXN0YW1wID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGlmIChwbHMtPnNlZWtfc3RyZWFtX2luZGV4IDwgMCB8fAorICAgICAgICAgICAgICAgICAgICBwbHMtPnNlZWtfc3RyZWFtX2luZGV4ID09IHBscy0+cGt0LnN0cmVhbV9pbmRleCkgeworCisgICAgICAgICAgICAgICAgICAgIGlmIChwbHMtPnBrdC5kdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBscy0+c2Vla190aW1lc3RhbXAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGIgPSBnZXRfdGltZWJhc2UocGxzKTsKKyAgICAgICAgICAgICAgICAgICAgdHNfZGlmZiA9IGF2X3Jlc2NhbGVfcm5kKHBscy0+cGt0LmR0cywgQVZfVElNRV9CQVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yi5kZW4sIEFWX1JPVU5EX0RPV04pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHMtPnNlZWtfdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICBpZiAodHNfZGlmZiA+PSAwICYmIChwbHMtPnNlZWtfZmxhZ3MgICYgQVZTRUVLX0ZMQUdfQU5ZIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxzLT5wa3QuZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbHMtPnNlZWtfdGltZXN0YW1wID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9mcmVlX3BhY2tldCgmcGxzLT5wa3QpOworICAgICAgICAgICAgICAgIHJlc2V0X3BhY2tldCgmcGxzLT5wa3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIENoZWNrIGlmIHRoaXMgc3RyZWFtIGhhcyB0aGUgcGFja2V0IHdpdGggdGhlIGxvd2VzdCBkdHMgKi8KKyAgICAgICAgaWYgKHBscy0+cGt0LmRhdGEpIHsKKyAgICAgICAgICAgIHN0cnVjdCBwbGF5bGlzdCAqbWlucGxzID0gbWlucGxheWxpc3QgPCAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIDogYy0+cGxheWxpc3RzW21pbnBsYXlsaXN0XTsKKyAgICAgICAgICAgIGlmIChtaW5wbGF5bGlzdCA8IDApIHsKKyAgICAgICAgICAgICAgICBtaW5wbGF5bGlzdCA9IGk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludDY0X3QgZHRzICAgICA9ICAgIHBscy0+cGt0LmR0czsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbmR0cyAgPSBtaW5wbHMtPnBrdC5kdHM7CisKKyAgICAgICAgICAgICAgICBpZiAoZHRzID09IEFWX05PUFRTX1ZBTFVFIHx8CisgICAgICAgICAgICAgICAgICAgIChtaW5kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgY29tcGFyZV90c193aXRoX3dyYXBkZXRlY3QoZHRzLCBwbHMsIG1pbmR0cywgbWlucGxzKSA8IDApKQorICAgICAgICAgICAgICAgICAgICBtaW5wbGF5bGlzdCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiB3ZSBnb3QgYSBwYWNrZXQsIHJldHVybiBpdCAqLworICAgIGlmIChtaW5wbGF5bGlzdCA+PSAwKSB7CisgICAgICAgIHN0cnVjdCBwbGF5bGlzdCAqcGxzID0gYy0+cGxheWxpc3RzW21pbnBsYXlsaXN0XTsKKyAgICAgICAgKnBrdCA9IHBscy0+cGt0OworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCArPSBwbHMtPnN0cmVhbV9vZmZzZXQ7CisgICAgICAgIHJlc2V0X3BhY2tldCgmYy0+cGxheWxpc3RzW21pbnBsYXlsaXN0XS0+cGt0KTsKKworICAgICAgICBpZiAocGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBjLT5jdXJfdGltZXN0YW1wID0gYXZfcmVzY2FsZV9xKHBrdC0+ZHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHMtPmN0eC0+c3RyZWFtc1twbHMtPnBrdC5zdHJlYW1faW5kZXhdLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1JfRU9GOworfQorCitzdGF0aWMgaW50IGhsc19jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgSExTQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKworICAgIGZyZWVfcGxheWxpc3RfbGlzdChjKTsKKyAgICBmcmVlX3ZhcmlhbnRfbGlzdChjKTsKKyAgICBmcmVlX3JlbmRpdGlvbl9saXN0KGMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhsc19yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgSExTQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgcGxheWxpc3QgKnNlZWtfcGxzID0gTlVMTDsKKyAgICBpbnQgaSwgc2VxX25vOworICAgIGludDY0X3QgZmlyc3RfdGltZXN0YW1wLCBzZWVrX3RpbWVzdGFtcCwgZHVyYXRpb247CisKKyAgICBpZiAoKGZsYWdzICYgQVZTRUVLX0ZMQUdfQllURSkgfHwKKyAgICAgICAgIShjLT52YXJpYW50c1swXS0+cGxheWxpc3RzWzBdLT5maW5pc2hlZCB8fCBjLT52YXJpYW50c1swXS0+cGxheWxpc3RzWzBdLT50eXBlID09IFBMU19UWVBFX0VWRU5UKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKworICAgIGZpcnN0X3RpbWVzdGFtcCA9IGMtPmZpcnN0X3RpbWVzdGFtcCA9PSBBVl9OT1BUU19WQUxVRSA/CisgICAgICAgICAgICAgICAgICAgICAgMCA6IGMtPmZpcnN0X3RpbWVzdGFtcDsKKworICAgIHNlZWtfdGltZXN0YW1wID0gYXZfcmVzY2FsZV9ybmQodGltZXN0YW1wLCBBVl9USU1FX0JBU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPnRpbWVfYmFzZS5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEFWU0VFS19GTEFHX0JBQ0tXQVJEID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1JPVU5EX0RPV04gOiBBVl9ST1VORF9VUCk7CisKKyAgICBkdXJhdGlvbiA9IHMtPmR1cmF0aW9uID09IEFWX05PUFRTX1ZBTFVFID8KKyAgICAgICAgICAgICAgIDAgOiBzLT5kdXJhdGlvbjsKKworICAgIGlmICgwIDwgZHVyYXRpb24gJiYgZHVyYXRpb24gPCBzZWVrX3RpbWVzdGFtcCAtIGZpcnN0X3RpbWVzdGFtcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIC8qIGZpbmQgdGhlIHBsYXlsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBzdHJlYW0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl9wbGF5bGlzdHM7IGkrKykgeworICAgICAgICBzdHJ1Y3QgcGxheWxpc3QgKnBscyA9IGMtPnBsYXlsaXN0c1tpXTsKKyAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA+PSBwbHMtPnN0cmVhbV9vZmZzZXQgJiYKKyAgICAgICAgICAgIHN0cmVhbV9pbmRleCAtIHBscy0+c3RyZWFtX29mZnNldCA8IHBscy0+Y3R4LT5uYl9zdHJlYW1zKSB7CisgICAgICAgICAgICBzZWVrX3BscyA9IHBsczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIC8qIGNoZWNrIGlmIHRoZSB0aW1lc3RhbXAgaXMgdmFsaWQgZm9yIHRoZSBwbGF5bGlzdCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBzdHJlYW0gaW5kZXggKi8KKyAgICBpZiAoIXNlZWtfcGxzIHx8ICFmaW5kX3RpbWVzdGFtcF9pbl9wbGF5bGlzdChjLCBzZWVrX3Bscywgc2Vla190aW1lc3RhbXAsICZzZXFfbm8pKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgLyogc2V0IHNlZ21lbnQgbm93IHNvIHdlIGRvIG5vdCBuZWVkIHRvIHNlYXJjaCBhZ2FpbiBiZWxvdyAqLworICAgIHNlZWtfcGxzLT5jdXJfc2VxX25vID0gc2VxX25vOworICAgIHNlZWtfcGxzLT5zZWVrX3N0cmVhbV9pbmRleCA9IHN0cmVhbV9pbmRleCAtIHNlZWtfcGxzLT5zdHJlYW1fb2Zmc2V0OworCisgICAgZm9yIChpID0gMDsgaSA8IGMtPm5fcGxheWxpc3RzOyBpKyspIHsKKyAgICAgICAgLyogUmVzZXQgcmVhZGluZyAqLworICAgICAgICBzdHJ1Y3QgcGxheWxpc3QgKnBscyA9IGMtPnBsYXlsaXN0c1tpXTsKKyAgICAgICAgaWYgKHBscy0+aW5wdXQpIHsKKyAgICAgICAgICAgIGZmdXJsX2Nsb3NlKHBscy0+aW5wdXQpOworICAgICAgICAgICAgcGxzLT5pbnB1dCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZV9wYWNrZXQoJnBscy0+cGt0KTsKKyAgICAgICAgcmVzZXRfcGFja2V0KCZwbHMtPnBrdCk7CisgICAgICAgIHBscy0+cGIuZW9mX3JlYWNoZWQgPSAwOworICAgICAgICAvKiBDbGVhciBhbnkgYnVmZmVyZWQgZGF0YSAqLworICAgICAgICBwbHMtPnBiLmJ1Zl9lbmQgPSBwbHMtPnBiLmJ1Zl9wdHIgPSBwbHMtPnBiLmJ1ZmZlcjsKKyAgICAgICAgLyogUmVzZXQgdGhlIHBvcywgdG8gbGV0IHRoZSBtcGVndHMgZGVtdXhlciBrbm93IHdlJ3ZlIHNlZWtlZC4gKi8KKyAgICAgICAgcGxzLT5wYi5wb3MgPSAwOworICAgICAgICAvKiBGbHVzaCB0aGUgcGFja2V0IHF1ZXVlIG9mIHRoZSBzdWJkZW11eGVyLiAqLworICAgICAgICBmZl9yZWFkX2ZyYW1lX2ZsdXNoKHBscy0+Y3R4KTsKKworICAgICAgICBwbHMtPnNlZWtfdGltZXN0YW1wID0gc2Vla190aW1lc3RhbXA7CisgICAgICAgIHBscy0+c2Vla19mbGFncyA9IGZsYWdzOworCisgICAgICAgIGlmIChwbHMgIT0gc2Vla19wbHMpIHsKKyAgICAgICAgICAgIC8qIHNldCBjbG9zZXN0IHNlZ21lbnQgc2VxX25vIGZvciBwbGF5bGlzdHMgbm90IGhhbmRsZWQgYWJvdmUgKi8KKyAgICAgICAgICAgIGZpbmRfdGltZXN0YW1wX2luX3BsYXlsaXN0KGMsIHBscywgc2Vla190aW1lc3RhbXAsICZwbHMtPmN1cl9zZXFfbm8pOworICAgICAgICAgICAgLyogc2VlayB0aGUgcGxheWxpc3QgdG8gdGhlIGdpdmVuIHBvc2l0aW9uIHdpdGhvdXQgdGFraW5nCisgICAgICAgICAgICAgKiBrZXlmcmFtZXMgaW50byBhY2NvdW50IHNpbmNlIHRoaXMgcGxheWxpc3QgZG9lcyBub3QgaGF2ZSB0aGUKKyAgICAgICAgICAgICAqIHNwZWNpZmllZCBzdHJlYW0gd2hlcmUgd2Ugc2hvdWxkIGxvb2sgZm9yIHRoZSBrZXlmcmFtZXMgKi8KKyAgICAgICAgICAgIHBscy0+c2Vla19zdHJlYW1faW5kZXggPSAtMTsKKyAgICAgICAgICAgIHBscy0+c2Vla19mbGFncyB8PSBBVlNFRUtfRkxBR19BTlk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjLT5jdXJfdGltZXN0YW1wID0gc2Vla190aW1lc3RhbXA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBobHNfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgLyogUmVxdWlyZSAjRVhUTTNVIGF0IHRoZSBzdGFydCwgYW5kIGVpdGhlciBvbmUgb2YgdGhlIG9uZXMgYmVsb3cKKyAgICAgKiBzb21ld2hlcmUgZm9yIGEgcHJvcGVyIG1hdGNoLiAqLworICAgIGlmIChzdHJuY21wKHAtPmJ1ZiwgIiNFWFRNM1UiLCA3KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHN0cnN0cihwLT5idWYsICIjRVhULVgtU1RSRUFNLUlORjoiKSAgICAgfHwKKyAgICAgICAgc3Ryc3RyKHAtPmJ1ZiwgIiNFWFQtWC1UQVJHRVREVVJBVElPTjoiKSB8fAorICAgICAgICBzdHJzdHIocC0+YnVmLCAiI0VYVC1YLU1FRElBLVNFUVVFTkNFOiIpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfaGxzX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImhscyxhcHBsZWh0dHAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBsZSBIVFRQIExpdmUgU3RyZWFtaW5nIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEhMU0NvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGhsc19wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBobHNfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gaGxzX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGhsc19jbG9zZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSBobHNfcmVhZF9zZWVrLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9obHNlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9obHNlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTNmNDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2hsc2VuYy5jCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogQXBwbGUgSFRUUCBMaXZlIFN0cmVhbWluZyBzZWdtZW50ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgTHVjYSBCYXJiYXRvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBITFNTZWdtZW50IHsKKyAgICBjaGFyIGZpbGVuYW1lWzEwMjRdOworICAgIGRvdWJsZSBkdXJhdGlvbjsgLyogaW4gc2Vjb25kcyAqLworICAgIGludDY0X3QgcG9zOworICAgIGludDY0X3Qgc2l6ZTsKKworICAgIHN0cnVjdCBITFNTZWdtZW50ICpuZXh0OworfSBITFNTZWdtZW50OworCit0eXBlZGVmIGVudW0gSExTRmxhZ3MgeworICAgIC8vIEdlbmVyYXRlIGEgc2luZ2xlIG1lZGlhIGZpbGUgYW5kIHVzZSBieXRlIHJhbmdlcyBpbiB0aGUgcGxheWxpc3QuCisgICAgSExTX1NJTkdMRV9GSUxFID0gKDEgPDwgMCksCit9IEhMU0ZsYWdzOworCit0eXBlZGVmIHN0cnVjdCBITFNDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsgIC8vIENsYXNzIGZvciBwcml2YXRlIG9wdGlvbnMuCisgICAgdW5zaWduZWQgbnVtYmVyOworICAgIGludDY0X3Qgc2VxdWVuY2U7CisgICAgaW50NjRfdCBzdGFydF9zZXF1ZW5jZTsKKyAgICBBVk91dHB1dEZvcm1hdCAqb2Zvcm1hdDsKKworICAgIEFWRm9ybWF0Q29udGV4dCAqYXZmOworCisgICAgZmxvYXQgdGltZTsgICAgICAgICAgICAvLyBTZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4KKyAgICBpbnQgbWF4X25iX3NlZ21lbnRzOyAgIC8vIFNldCBieSBhIHByaXZhdGUgb3B0aW9uLgorICAgIGludCAgd3JhcDsgICAgICAgICAgICAgLy8gU2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAvLyBlbnVtIEhMU0ZsYWdzCisKKyAgICBpbnQgYWxsb3djYWNoZTsKKyAgICBpbnQ2NF90IHJlY29yZGluZ190aW1lOworICAgIGludCBoYXNfdmlkZW87CisgICAgaW50NjRfdCBzdGFydF9wdHM7CisgICAgaW50NjRfdCBlbmRfcHRzOworICAgIGRvdWJsZSBkdXJhdGlvbjsgICAgICAvLyBsYXN0IHNlZ21lbnQgZHVyYXRpb24gY29tcHV0ZWQgc28gZmFyLCBpbiBzZWNvbmRzCisgICAgaW50NjRfdCBzdGFydF9wb3M7ICAgIC8vIGxhc3Qgc2VnbWVudCBzdGFydGluZyBwb3NpdGlvbgorICAgIGludDY0X3Qgc2l6ZTsgICAgICAgICAvLyBsYXN0IHNlZ21lbnQgc2l6ZQorICAgIGludCBuYl9lbnRyaWVzOworCisgICAgSExTU2VnbWVudCAqc2VnbWVudHM7CisgICAgSExTU2VnbWVudCAqbGFzdF9zZWdtZW50OworCisgICAgY2hhciAqYmFzZW5hbWU7CisgICAgY2hhciAqYmFzZXVybDsKKyAgICBjaGFyICpmb3JtYXRfb3B0aW9uc19zdHI7CisgICAgQVZEaWN0aW9uYXJ5ICpmb3JtYXRfb3B0aW9uczsKKworICAgIEFWSU9Db250ZXh0ICpwYjsKK30gSExTQ29udGV4dDsKKworc3RhdGljIGludCBobHNfbXV4X2luaXQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEhMU0NvbnRleHQgKmhscyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkZvcm1hdENvbnRleHQgKm9jOworICAgIGludCBpLCByZXQ7CisKKyAgICByZXQgPSBhdmZvcm1hdF9hbGxvY19vdXRwdXRfY29udGV4dDIoJmhscy0+YXZmLCBobHMtPm9mb3JtYXQsIE5VTEwsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG9jID0gaGxzLT5hdmY7CisKKyAgICBvYy0+b2Zvcm1hdCAgICAgICAgICAgID0gaGxzLT5vZm9ybWF0OworICAgIG9jLT5pbnRlcnJ1cHRfY2FsbGJhY2sgPSBzLT5pbnRlcnJ1cHRfY2FsbGJhY2s7CisgICAgb2MtPm1heF9kZWxheSAgICAgICAgICA9IHMtPm1heF9kZWxheTsKKyAgICBhdl9kaWN0X2NvcHkoJm9jLT5tZXRhZGF0YSwgcy0+bWV0YWRhdGEsIDApOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3Q7CisgICAgICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShvYywgTlVMTCkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZjb2RlY19jb3B5X2NvbnRleHQoc3QtPmNvZGVjLCBzLT5zdHJlYW1zW2ldLT5jb2RlYyk7CisgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gcy0+c3RyZWFtc1tpXS0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICAgICAgc3QtPnRpbWVfYmFzZSA9IHMtPnN0cmVhbXNbaV0tPnRpbWVfYmFzZTsKKyAgICB9CisgICAgaGxzLT5zdGFydF9wb3MgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBzZWdtZW50IGFuZCBhcHBlbmQgaXQgdG8gdGhlIHNlZ21lbnQgbGlzdCAqLworc3RhdGljIGludCBobHNfYXBwZW5kX3NlZ21lbnQoSExTQ29udGV4dCAqaGxzLCBkb3VibGUgZHVyYXRpb24sIGludDY0X3QgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplKQoreworICAgIEhMU1NlZ21lbnQgKmVuID0gYXZfbWFsbG9jKHNpemVvZigqZW4pKTsKKworICAgIGlmICghZW4pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9zdHJsY3B5KGVuLT5maWxlbmFtZSwgYXZfYmFzZW5hbWUoaGxzLT5hdmYtPmZpbGVuYW1lKSwgc2l6ZW9mKGVuLT5maWxlbmFtZSkpOworCisgICAgZW4tPmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgZW4tPnBvcyAgICAgID0gcG9zOworICAgIGVuLT5zaXplICAgICA9IHNpemU7CisgICAgZW4tPm5leHQgICAgID0gTlVMTDsKKworICAgIGlmICghaGxzLT5zZWdtZW50cykKKyAgICAgICAgaGxzLT5zZWdtZW50cyA9IGVuOworICAgIGVsc2UKKyAgICAgICAgaGxzLT5sYXN0X3NlZ21lbnQtPm5leHQgPSBlbjsKKworICAgIGhscy0+bGFzdF9zZWdtZW50ID0gZW47CisKKyAgICBpZiAoaGxzLT5tYXhfbmJfc2VnbWVudHMgJiYgaGxzLT5uYl9lbnRyaWVzID49IGhscy0+bWF4X25iX3NlZ21lbnRzKSB7CisgICAgICAgIGVuID0gaGxzLT5zZWdtZW50czsKKyAgICAgICAgaGxzLT5zZWdtZW50cyA9IGVuLT5uZXh0OworICAgICAgICBhdl9mcmVlKGVuKTsKKyAgICB9IGVsc2UKKyAgICAgICAgaGxzLT5uYl9lbnRyaWVzKys7CisKKyAgICBobHMtPnNlcXVlbmNlKys7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGxzX2ZyZWVfc2VnbWVudHMoSExTQ29udGV4dCAqaGxzKQoreworICAgIEhMU1NlZ21lbnQgKnAgPSBobHMtPnNlZ21lbnRzLCAqZW47CisKKyAgICB3aGlsZShwKSB7CisgICAgICAgIGVuID0gcDsKKyAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIGF2X2ZyZWUoZW4pOworICAgIH0KK30KKworc3RhdGljIGludCBobHNfd2luZG93KEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGxhc3QpCit7CisgICAgSExTQ29udGV4dCAqaGxzID0gcy0+cHJpdl9kYXRhOworICAgIEhMU1NlZ21lbnQgKmVuOworICAgIGludCB0YXJnZXRfZHVyYXRpb24gPSAwOworICAgIGludCByZXQgPSAwOworICAgIGludDY0X3Qgc2VxdWVuY2UgPSBGRk1BWChobHMtPnN0YXJ0X3NlcXVlbmNlLCBobHMtPnNlcXVlbmNlIC0gaGxzLT5uYl9lbnRyaWVzKTsKKyAgICBpbnQgdmVyc2lvbiA9IGhscy0+ZmxhZ3MgJiBITFNfU0lOR0xFX0ZJTEUgPyA0IDogMzsKKworICAgIGlmICgocmV0ID0gYXZpb19vcGVuMigmaGxzLT5wYiwgcy0+ZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZm9yIChlbiA9IGhscy0+c2VnbWVudHM7IGVuOyBlbiA9IGVuLT5uZXh0KSB7CisgICAgICAgIGlmICh0YXJnZXRfZHVyYXRpb24gPCBlbi0+ZHVyYXRpb24pCisgICAgICAgICAgICB0YXJnZXRfZHVyYXRpb24gPSBjZWlsKGVuLT5kdXJhdGlvbik7CisgICAgfQorCisgICAgYXZpb19wcmludGYoaGxzLT5wYiwgIiNFWFRNM1VcbiIpOworICAgIGF2aW9fcHJpbnRmKGhscy0+cGIsICIjRVhULVgtVkVSU0lPTjolZFxuIiwgdmVyc2lvbik7CisgICAgaWYgKGhscy0+YWxsb3djYWNoZSA9PSAwIHx8IGhscy0+YWxsb3djYWNoZSA9PSAxKSB7CisgICAgICAgIGF2aW9fcHJpbnRmKGhscy0+cGIsICIjRVhULVgtQUxMT1ctQ0FDSEU6JXNcbiIsIGhscy0+YWxsb3djYWNoZSA9PSAwID8gIk5PIiA6ICJZRVMiKTsKKyAgICB9CisgICAgYXZpb19wcmludGYoaGxzLT5wYiwgIiNFWFQtWC1UQVJHRVREVVJBVElPTjolZFxuIiwgdGFyZ2V0X2R1cmF0aW9uKTsKKyAgICBhdmlvX3ByaW50ZihobHMtPnBiLCAiI0VYVC1YLU1FRElBLVNFUVVFTkNFOiUiUFJJZDY0IlxuIiwgc2VxdWVuY2UpOworCisgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiRVhULVgtTUVESUEtU0VRVUVOQ0U6JSJQUklkNjQiXG4iLAorICAgICAgICAgICBzZXF1ZW5jZSk7CisKKyAgICBmb3IgKGVuID0gaGxzLT5zZWdtZW50czsgZW47IGVuID0gZW4tPm5leHQpIHsKKyAgICAgICAgYXZpb19wcmludGYoaGxzLT5wYiwgIiNFWFRJTkY6JWYsXG4iLCBlbi0+ZHVyYXRpb24pOworICAgICAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19TSU5HTEVfRklMRSkKKyAgICAgICAgICAgICBhdmlvX3ByaW50ZihobHMtPnBiLCAiI0VYVC1YLUJZVEVSQU5HRTolIlBSSWk2NCJAJSJQUklpNjQiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuLT5zaXplLCBlbi0+cG9zKTsKKyAgICAgICAgaWYgKGhscy0+YmFzZXVybCkKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKGhscy0+cGIsICIlcyIsIGhscy0+YmFzZXVybCk7CisgICAgICAgIGF2aW9fcHJpbnRmKGhscy0+cGIsICIlc1xuIiwgZW4tPmZpbGVuYW1lKTsKKyAgICB9CisKKyAgICBpZiAobGFzdCkKKyAgICAgICAgYXZpb19wcmludGYoaGxzLT5wYiwgIiNFWFQtWC1FTkRMSVNUXG4iKTsKKworZmFpbDoKKyAgICBhdmlvX2Nsb3NlcCgmaGxzLT5wYik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBobHNfc3RhcnQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEhMU0NvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZGb3JtYXRDb250ZXh0ICpvYyA9IGMtPmF2ZjsKKyAgICBpbnQgZXJyID0gMDsKKworICAgIGlmIChjLT5mbGFncyAmIEhMU19TSU5HTEVfRklMRSkKKyAgICAgICAgYXZfc3RybGNweShvYy0+ZmlsZW5hbWUsIGMtPmJhc2VuYW1lLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihvYy0+ZmlsZW5hbWUpKTsKKyAgICBlbHNlCisgICAgICAgIGlmIChhdl9nZXRfZnJhbWVfZmlsZW5hbWUob2MtPmZpbGVuYW1lLCBzaXplb2Yob2MtPmZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5iYXNlbmFtZSwgYy0+d3JhcCA/IGMtPnNlcXVlbmNlICUgYy0+d3JhcCA6IGMtPnNlcXVlbmNlKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhvYywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzZWdtZW50IGZpbGVuYW1lIHRlbXBsYXRlICclcydcbiIsIGMtPmJhc2VuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICBjLT5udW1iZXIrKzsKKworICAgIGlmICgoZXJyID0gYXZpb19vcGVuMigmb2MtPnBiLCBvYy0+ZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGlmIChvYy0+b2Zvcm1hdC0+cHJpdl9jbGFzcyAmJiBvYy0+cHJpdl9kYXRhKQorICAgICAgICBhdl9vcHRfc2V0KG9jLT5wcml2X2RhdGEsICJtcGVndHNfZmxhZ3MiLCAicmVzZW5kX2hlYWRlcnMiLCAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhsc193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEhMU0NvbnRleHQgKmhscyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBpOworICAgIGNoYXIgKnA7CisgICAgY29uc3QgY2hhciAqcGF0dGVybiA9ICIlZC50cyI7CisgICAgQVZEaWN0aW9uYXJ5ICpvcHRpb25zID0gTlVMTDsKKyAgICBpbnQgYmFzZW5hbWVfc2l6ZSA9IHN0cmxlbihzLT5maWxlbmFtZSkgKyBzdHJsZW4ocGF0dGVybikgKyAxOworCisgICAgaGxzLT5zZXF1ZW5jZSAgICAgICA9IGhscy0+c3RhcnRfc2VxdWVuY2U7CisgICAgaGxzLT5yZWNvcmRpbmdfdGltZSA9IGhscy0+dGltZSAqIEFWX1RJTUVfQkFTRTsKKyAgICBobHMtPnN0YXJ0X3B0cyAgICAgID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19TSU5HTEVfRklMRSkKKyAgICAgICAgcGF0dGVybiA9ICIudHMiOworCisgICAgaWYgKGhscy0+Zm9ybWF0X29wdGlvbnNfc3RyKSB7CisgICAgICAgIHJldCA9IGF2X2RpY3RfcGFyc2Vfc3RyaW5nKCZobHMtPmZvcm1hdF9vcHRpb25zLCBobHMtPmZvcm1hdF9vcHRpb25zX3N0ciwgIj0iLCAiOiIsIDApOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBwYXJzZSBmb3JtYXQgb3B0aW9ucyBsaXN0ICclcydcbiIsIGhscy0+Zm9ybWF0X29wdGlvbnNfc3RyKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIGhscy0+aGFzX3ZpZGVvICs9CisgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU87CisKKyAgICBpZiAoaGxzLT5oYXNfdmlkZW8gPiAxKQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiTW9yZSB0aGFuIGEgc2luZ2xlIHZpZGVvIHN0cmVhbSBwcmVzZW50LCAiCisgICAgICAgICAgICAgICAiZXhwZWN0IGlzc3VlcyBkZWNvZGluZyBpdC5cbiIpOworCisgICAgaGxzLT5vZm9ybWF0ID0gYXZfZ3Vlc3NfZm9ybWF0KCJtcGVndHMiLCBOVUxMLCBOVUxMKTsKKworICAgIGlmICghaGxzLT5vZm9ybWF0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfTVVYRVJfTk9UX0ZPVU5EOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaGxzLT5iYXNlbmFtZSA9IGF2X21hbGxvYyhiYXNlbmFtZV9zaXplKTsKKworICAgIGlmICghaGxzLT5iYXNlbmFtZSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzdHJjcHkoaGxzLT5iYXNlbmFtZSwgcy0+ZmlsZW5hbWUpOworCisgICAgcCA9IHN0cnJjaHIoaGxzLT5iYXNlbmFtZSwgJy4nKTsKKworICAgIGlmIChwKQorICAgICAgICAqcCA9ICdcMCc7CisKKyAgICBhdl9zdHJsY2F0KGhscy0+YmFzZW5hbWUsIHBhdHRlcm4sIGJhc2VuYW1lX3NpemUpOworCisgICAgaWYgKChyZXQgPSBobHNfbXV4X2luaXQocykpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKChyZXQgPSBobHNfc3RhcnQocykpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgYXZfZGljdF9jb3B5KCZvcHRpb25zLCBobHMtPmZvcm1hdF9vcHRpb25zLCAwKTsKKyAgICByZXQgPSBhdmZvcm1hdF93cml0ZV9oZWFkZXIoaGxzLT5hdmYsICZvcHRpb25zKTsKKyAgICBpZiAoYXZfZGljdF9jb3VudChvcHRpb25zKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU29tZSBvZiBwcm92aWRlZCBmb3JtYXQgb3B0aW9ucyBpbiAnJXMnIGFyZSBub3QgcmVjb2duaXplZFxuIiwgaGxzLT5mb3JtYXRfb3B0aW9uc19zdHIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgYXZfYXNzZXJ0MChzLT5uYl9zdHJlYW1zID09IGhscy0+YXZmLT5uYl9zdHJlYW1zKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICppbm5lcl9zdCAgPSBobHMtPmF2Zi0+c3RyZWFtc1tpXTsKKyAgICAgICAgQVZTdHJlYW0gKm91dGVyX3N0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhvdXRlcl9zdCwgaW5uZXJfc3QtPnB0c193cmFwX2JpdHMsIGlubmVyX3N0LT50aW1lX2Jhc2UubnVtLCBpbm5lcl9zdC0+dGltZV9iYXNlLmRlbik7CisgICAgfQorZmFpbDoKKworICAgIGF2X2RpY3RfZnJlZSgmb3B0aW9ucyk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9mcmVlKGhscy0+YmFzZW5hbWUpOworICAgICAgICBpZiAoaGxzLT5hdmYpCisgICAgICAgICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQoaGxzLT5hdmYpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhsc193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEhMU0NvbnRleHQgKmhscyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkZvcm1hdENvbnRleHQgKm9jID0gaGxzLT5hdmY7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgaW50NjRfdCBlbmRfcHRzID0gaGxzLT5yZWNvcmRpbmdfdGltZSAqIGhscy0+bnVtYmVyOworICAgIGludCBpc19yZWZfcGt0ID0gMTsKKyAgICBpbnQgcmV0LCBjYW5fc3BsaXQgPSAxOworCisgICAgaWYgKGhscy0+c3RhcnRfcHRzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGhscy0+c3RhcnRfcHRzID0gcGt0LT5wdHM7CisgICAgICAgIGhscy0+ZW5kX3B0cyAgID0gcGt0LT5wdHM7CisgICAgfQorCisgICAgaWYgKGhscy0+aGFzX3ZpZGVvKSB7CisgICAgICAgIGNhbl9zcGxpdCA9IHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgaXNfcmVmX3BrdCA9IHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU87CisgICAgfQorICAgIGlmIChwa3QtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgaXNfcmVmX3BrdCA9IGNhbl9zcGxpdCA9IDA7CisKKyAgICBpZiAoaXNfcmVmX3BrdCkKKyAgICAgICAgaGxzLT5kdXJhdGlvbiA9IChkb3VibGUpKHBrdC0+cHRzIC0gaGxzLT5lbmRfcHRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0LT50aW1lX2Jhc2UubnVtIC8gc3QtPnRpbWVfYmFzZS5kZW47CisKKyAgICBpZiAoY2FuX3NwbGl0ICYmIGF2X2NvbXBhcmVfdHMocGt0LT5wdHMgLSBobHMtPnN0YXJ0X3B0cywgc3QtPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3B0cywgQVZfVElNRV9CQVNFX1EpID49IDApIHsKKyAgICAgICAgaW50NjRfdCBuZXdfc3RhcnRfcG9zOworICAgICAgICBhdl93cml0ZV9mcmFtZShvYywgTlVMTCk7IC8qIEZsdXNoIGFueSBidWZmZXJlZCBkYXRhICovCisKKyAgICAgICAgbmV3X3N0YXJ0X3BvcyA9IGF2aW9fdGVsbChobHMtPmF2Zi0+cGIpOworICAgICAgICBobHMtPnNpemUgPSBuZXdfc3RhcnRfcG9zIC0gaGxzLT5zdGFydF9wb3M7CisgICAgICAgIHJldCA9IGhsc19hcHBlbmRfc2VnbWVudChobHMsIGhscy0+ZHVyYXRpb24sIGhscy0+c3RhcnRfcG9zLCBobHMtPnNpemUpOworICAgICAgICBobHMtPnN0YXJ0X3BvcyA9IG5ld19zdGFydF9wb3M7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGhscy0+ZW5kX3B0cyA9IHBrdC0+cHRzOworICAgICAgICBobHMtPmR1cmF0aW9uID0gMDsKKworICAgICAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19TSU5HTEVfRklMRSkgeworICAgICAgICAgICAgaWYgKGhscy0+YXZmLT5vZm9ybWF0LT5wcml2X2NsYXNzICYmIGhscy0+YXZmLT5wcml2X2RhdGEpCisgICAgICAgICAgICAgICAgYXZfb3B0X3NldChobHMtPmF2Zi0+cHJpdl9kYXRhLCAibXBlZ3RzX2ZsYWdzIiwgInJlc2VuZF9oZWFkZXJzIiwgMCk7CisgICAgICAgICAgICBobHMtPm51bWJlcisrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZpb19jbG9zZShvYy0+cGIpOworCisgICAgICAgICAgICByZXQgPSBobHNfc3RhcnQocyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBvYyA9IGhscy0+YXZmOworCisgICAgICAgIGlmICgocmV0ID0gaGxzX3dpbmRvdyhzLCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBmZl93cml0ZV9jaGFpbmVkKG9jLCBwa3QtPnN0cmVhbV9pbmRleCwgcGt0LCBzLCAwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGxzX3dyaXRlX3RyYWlsZXIoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBITFNDb250ZXh0ICpobHMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZGb3JtYXRDb250ZXh0ICpvYyA9IGhscy0+YXZmOworCisgICAgYXZfd3JpdGVfdHJhaWxlcihvYyk7CisgICAgaGxzLT5zaXplID0gYXZpb190ZWxsKGhscy0+YXZmLT5wYikgLSBobHMtPnN0YXJ0X3BvczsKKyAgICBhdmlvX2Nsb3NlcCgmb2MtPnBiKTsKKyAgICBhdl9mcmVlKGhscy0+YmFzZW5hbWUpOworICAgIGhsc19hcHBlbmRfc2VnbWVudChobHMsIGhscy0+ZHVyYXRpb24sIGhscy0+c3RhcnRfcG9zLCBobHMtPnNpemUpOworICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChvYyk7CisgICAgaGxzLT5hdmYgPSBOVUxMOworICAgIGhsc193aW5kb3cocywgMSk7CisKKyAgICBobHNfZnJlZV9zZWdtZW50cyhobHMpOworICAgIGF2aW9fY2xvc2UoaGxzLT5wYik7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEhMU0NvbnRleHQsIHgpCisjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyJzdGFydF9udW1iZXIiLCAgInNldCBmaXJzdCBudW1iZXIgaW4gdGhlIHNlcXVlbmNlIiwgICAgICAgIE9GRlNFVChzdGFydF9zZXF1ZW5jZSksQVZfT1BUX1RZUEVfSU5UNjQsICB7Lmk2NCA9IDB9LCAgICAgMCwgSU5UNjRfTUFYLCBFfSwKKyAgICB7Imhsc190aW1lIiwgICAgICAic2V0IHNlZ21lbnQgbGVuZ3RoIGluIHNlY29uZHMiLCAgICAgICAgICAgT0ZGU0VUKHRpbWUpLCAgICBBVl9PUFRfVFlQRV9GTE9BVCwgIHsuZGJsID0gMn0sICAgICAwLCBGTFRfTUFYLCBFfSwKKyAgICB7Imhsc19saXN0X3NpemUiLCAic2V0IG1heGltdW0gbnVtYmVyIG9mIHBsYXlsaXN0IGVudHJpZXMiLCAgT0ZGU0VUKG1heF9uYl9zZWdtZW50cyksICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSA1fSwgICAgIDAsIElOVF9NQVgsIEV9LAorICAgIHsiaGxzX3RzX29wdGlvbnMiLCJzZXQgaGxzIG1wZWd0cyBsaXN0IG9mIG9wdGlvbnMgZm9yIHRoZSBjb250YWluZXIgZm9ybWF0IHVzZWQgZm9yIGhscyIsIE9GRlNFVChmb3JtYXRfb3B0aW9uc19zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sICAwLCAwLCAgICBFfSwKKyAgICB7Imhsc193cmFwIiwgICAgICAic2V0IG51bWJlciBhZnRlciB3aGljaCB0aGUgaW5kZXggd3JhcHMiLCAgT0ZGU0VUKHdyYXApLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMH0sICAgICAwLCBJTlRfTUFYLCBFfSwKKyAgICB7Imhsc19hbGxvd19jYWNoZSIsICJleHBsaWNpdGx5IHNldCB3aGV0aGVyIHRoZSBjbGllbnQgTUFZICgxKSBvciBNVVNUIE5PVCAoMCkgY2FjaGUgbWVkaWEgc2VnbWVudHMiLCBPRkZTRVQoYWxsb3djYWNoZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIElOVF9NSU4sIElOVF9NQVgsIEV9LAorICAgIHsiaGxzX2Jhc2VfdXJsIiwgICJ1cmwgdG8gcHJlcGVuZCB0byBlYWNoIHBsYXlsaXN0IGVudHJ5IiwgICBPRkZTRVQoYmFzZXVybCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgIDAsIDAsICAgICAgIEV9LAorICAgIHsiaGxzX2ZsYWdzIiwgICAgICJzZXQgZmxhZ3MgYWZmZWN0aW5nIEhMUyBwbGF5bGlzdCBhbmQgbWVkaWEgZmlsZSBnZW5lcmF0aW9uIiwgT0ZGU0VUKGZsYWdzKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gMCB9LCAwLCBVSU5UX01BWCwgRSwgImZsYWdzIn0sCisgICAgeyJzaW5nbGVfZmlsZSIsICAgImdlbmVyYXRlIGEgc2luZ2xlIG1lZGlhIGZpbGUgaW5kZXhlZCB3aXRoIGJ5dGUgcmFuZ2VzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gSExTX1NJTkdMRV9GSUxFIH0sIDAsIFVJTlRfTUFYLCAgIEUsICJmbGFncyJ9LAorCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBobHNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiaGxzIG11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKKworQVZPdXRwdXRGb3JtYXQgZmZfaGxzX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJobHMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBsZSBIVFRQIExpdmUgU3RyZWFtaW5nIiksCisgICAgLmV4dGVuc2lvbnMgICAgID0gIm0zdTgiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihITFNDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9BQUMsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUgfCBBVkZNVF9BTExPV19GTFVTSCwKKyAgICAud3JpdGVfaGVhZGVyICAgPSBobHNfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IGhsc193cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gaGxzX3dyaXRlX3RyYWlsZXIsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmhsc19jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaGxzcHJvdG8uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9obHNwcm90by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjllOTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaGxzcHJvdG8uYwpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIEFwcGxlIEhUVFAgTGl2ZSBTdHJlYW1pbmcgUHJvdG9jb2wgSGFuZGxlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFwcGxlIEhUVFAgTGl2ZSBTdHJlYW1pbmcgUHJvdG9jb2wgSGFuZGxlcgorICogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtcGFudG9zLWh0dHAtbGl2ZS1zdHJlYW1pbmcKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidXJsLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisvKgorICogQW4gYXBwbGUgaHR0cCBzdHJlYW0gY29uc2lzdHMgb2YgYSBwbGF5bGlzdCB3aXRoIG1lZGlhIHNlZ21lbnQgZmlsZXMsCisgKiBwbGF5ZWQgc2VxdWVudGlhbGx5LiBUaGVyZSBtYXkgYmUgc2V2ZXJhbCBwbGF5bGlzdHMgd2l0aCB0aGUgc2FtZQorICogdmlkZW8gY29udGVudCwgaW4gZGlmZmVyZW50IGJhbmR3aWR0aCB2YXJpYW50cywgdGhhdCBhcmUgcGxheWVkIGluCisgKiBwYXJhbGxlbCAocHJlZmVyYWJseSBvbmx5IG9uZSBiYW5kd2lkdGggdmFyaWFudCBhdCBhIHRpbWUpLiBJbiB0aGlzIGNhc2UsCisgKiB0aGUgdXNlciBzdXBwbGllZCB0aGUgdXJsIHRvIGEgbWFpbiBwbGF5bGlzdCB0aGF0IG9ubHkgbGlzdHMgdGhlIHZhcmlhbnQKKyAqIHBsYXlsaXN0cy4KKyAqCisgKiBJZiB0aGUgbWFpbiBwbGF5bGlzdCBkb2Vzbid0IHBvaW50IGF0IGFueSB2YXJpYW50cywgd2Ugc3RpbGwgY3JlYXRlCisgKiBvbmUgYW5vbnltb3VzIHRvcGxldmVsIHZhcmlhbnQgZm9yIHRoaXMsIHRvIG1haW50YWluIHRoZSBzdHJ1Y3R1cmUuCisgKi8KKworc3RydWN0IHNlZ21lbnQgeworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgY2hhciB1cmxbTUFYX1VSTF9TSVpFXTsKK307CisKK3N0cnVjdCB2YXJpYW50IHsKKyAgICBpbnQgYmFuZHdpZHRoOworICAgIGNoYXIgdXJsW01BWF9VUkxfU0laRV07Cit9OworCit0eXBlZGVmIHN0cnVjdCBITFNDb250ZXh0IHsKKyAgICBjaGFyIHBsYXlsaXN0dXJsW01BWF9VUkxfU0laRV07CisgICAgaW50NjRfdCB0YXJnZXRfZHVyYXRpb247CisgICAgaW50IHN0YXJ0X3NlcV9ubzsKKyAgICBpbnQgZmluaXNoZWQ7CisgICAgaW50IG5fc2VnbWVudHM7CisgICAgc3RydWN0IHNlZ21lbnQgKipzZWdtZW50czsKKyAgICBpbnQgbl92YXJpYW50czsKKyAgICBzdHJ1Y3QgdmFyaWFudCAqKnZhcmlhbnRzOworICAgIGludCBjdXJfc2VxX25vOworICAgIFVSTENvbnRleHQgKnNlZ19oZDsKKyAgICBpbnQ2NF90IGxhc3RfbG9hZF90aW1lOworfSBITFNDb250ZXh0OworCitzdGF0aWMgaW50IHJlYWRfY2hvbXBfbGluZShBVklPQ29udGV4dCAqcywgY2hhciAqYnVmLCBpbnQgbWF4bGVuKQoreworICAgIGludCBsZW4gPSBmZl9nZXRfbGluZShzLCBidWYsIG1heGxlbik7CisgICAgd2hpbGUgKGxlbiA+IDAgJiYgYXZfaXNzcGFjZShidWZbbGVuIC0gMV0pKQorICAgICAgICBidWZbLS1sZW5dID0gJ1wwJzsKKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3NlZ21lbnRfbGlzdChITFNDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uX3NlZ21lbnRzOyBpKyspCisgICAgICAgIGF2X2ZyZWUocy0+c2VnbWVudHNbaV0pOworICAgIGF2X2ZyZWVwKCZzLT5zZWdtZW50cyk7CisgICAgcy0+bl9zZWdtZW50cyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdmFyaWFudF9saXN0KEhMU0NvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5fdmFyaWFudHM7IGkrKykKKyAgICAgICAgYXZfZnJlZShzLT52YXJpYW50c1tpXSk7CisgICAgYXZfZnJlZXAoJnMtPnZhcmlhbnRzKTsKKyAgICBzLT5uX3ZhcmlhbnRzID0gMDsKK30KKworc3RydWN0IHZhcmlhbnRfaW5mbyB7CisgICAgY2hhciBiYW5kd2lkdGhbMjBdOworfTsKKworc3RhdGljIHZvaWQgaGFuZGxlX3ZhcmlhbnRfYXJncyhzdHJ1Y3QgdmFyaWFudF9pbmZvICppbmZvLCBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlfbGVuLCBjaGFyICoqZGVzdCwgaW50ICpkZXN0X2xlbikKK3sKKyAgICBpZiAoIXN0cm5jbXAoa2V5LCAiQkFORFdJRFRIPSIsIGtleV9sZW4pKSB7CisgICAgICAgICpkZXN0ICAgICA9ICAgICAgICBpbmZvLT5iYW5kd2lkdGg7CisgICAgICAgICpkZXN0X2xlbiA9IHNpemVvZihpbmZvLT5iYW5kd2lkdGgpOworICAgIH0KK30KKworc3RhdGljIGludCBwYXJzZV9wbGF5bGlzdChVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmwpCit7CisgICAgSExTQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqaW47CisgICAgaW50IHJldCA9IDAsIGlzX3NlZ21lbnQgPSAwLCBpc192YXJpYW50ID0gMCwgYmFuZHdpZHRoID0gMDsKKyAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKKyAgICBjaGFyIGxpbmVbMTAyNF07CisgICAgY29uc3QgY2hhciAqcHRyOworCisgICAgaWYgKChyZXQgPSBhdmlvX29wZW4yKCZpbiwgdXJsLCBBVklPX0ZMQUdfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJlYWRfY2hvbXBfbGluZShpbiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKyAgICBpZiAoc3RyY21wKGxpbmUsICIjRVhUTTNVIikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgZnJlZV9zZWdtZW50X2xpc3Qocyk7CisgICAgcy0+ZmluaXNoZWQgPSAwOworICAgIHdoaWxlICghYXZpb19mZW9mKGluKSkgeworICAgICAgICByZWFkX2Nob21wX2xpbmUoaW4sIGxpbmUsIHNpemVvZihsaW5lKSk7CisgICAgICAgIGlmIChhdl9zdHJzdGFydChsaW5lLCAiI0VYVC1YLVNUUkVBTS1JTkY6IiwgJnB0cikpIHsKKyAgICAgICAgICAgIHN0cnVjdCB2YXJpYW50X2luZm8gaW5mbyA9IHt7MH19OworICAgICAgICAgICAgaXNfdmFyaWFudCA9IDE7CisgICAgICAgICAgICBmZl9wYXJzZV9rZXlfdmFsdWUocHRyLCAoZmZfcGFyc2Vfa2V5X3ZhbF9jYikgaGFuZGxlX3ZhcmlhbnRfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbyk7CisgICAgICAgICAgICBiYW5kd2lkdGggPSBhdG9pKGluZm8uYmFuZHdpZHRoKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChsaW5lLCAiI0VYVC1YLVRBUkdFVERVUkFUSU9OOiIsICZwdHIpKSB7CisgICAgICAgICAgICBzLT50YXJnZXRfZHVyYXRpb24gPSBhdG9pKHB0cikgKiBBVl9USU1FX0JBU0U7CisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQobGluZSwgIiNFWFQtWC1NRURJQS1TRVFVRU5DRToiLCAmcHRyKSkgeworICAgICAgICAgICAgcy0+c3RhcnRfc2VxX25vID0gYXRvaShwdHIpOworICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KGxpbmUsICIjRVhULVgtRU5ETElTVCIsICZwdHIpKSB7CisgICAgICAgICAgICBzLT5maW5pc2hlZCA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQobGluZSwgIiNFWFRJTkY6IiwgJnB0cikpIHsKKyAgICAgICAgICAgIGlzX3NlZ21lbnQgPSAxOworICAgICAgICAgICAgZHVyYXRpb24gPSBhdG9mKHB0cikgKiBBVl9USU1FX0JBU0U7CisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQobGluZSwgIiMiLCBOVUxMKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAobGluZVswXSkgeworICAgICAgICAgICAgaWYgKGlzX3NlZ21lbnQpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VnbWVudCAqc2VnID0gYXZfbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VnbWVudCkpOworICAgICAgICAgICAgICAgIGlmICghc2VnKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWctPmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgZmZfbWFrZV9hYnNvbHV0ZV91cmwoc2VnLT51cmwsIHNpemVvZihzZWctPnVybCksIHVybCwgbGluZSk7CisgICAgICAgICAgICAgICAgZHluYXJyYXlfYWRkKCZzLT5zZWdtZW50cywgJnMtPm5fc2VnbWVudHMsIHNlZyk7CisgICAgICAgICAgICAgICAgaXNfc2VnbWVudCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzX3ZhcmlhbnQpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdmFyaWFudCAqdmFyID0gYXZfbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmFyaWFudCkpOworICAgICAgICAgICAgICAgIGlmICghdmFyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXItPmJhbmR3aWR0aCA9IGJhbmR3aWR0aDsKKyAgICAgICAgICAgICAgICBmZl9tYWtlX2Fic29sdXRlX3VybCh2YXItPnVybCwgc2l6ZW9mKHZhci0+dXJsKSwgdXJsLCBsaW5lKTsKKyAgICAgICAgICAgICAgICBkeW5hcnJheV9hZGQoJnMtPnZhcmlhbnRzLCAmcy0+bl92YXJpYW50cywgdmFyKTsKKyAgICAgICAgICAgICAgICBpc192YXJpYW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5sYXN0X2xvYWRfdGltZSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKworZmFpbDoKKyAgICBhdmlvX2Nsb3NlKGluKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhsc19jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIEhMU0NvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisKKyAgICBmcmVlX3NlZ21lbnRfbGlzdChzKTsKKyAgICBmcmVlX3ZhcmlhbnRfbGlzdChzKTsKKyAgICBmZnVybF9jbG9zZShzLT5zZWdfaGQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhsc19vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzKQoreworICAgIEhMU0NvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldCwgaTsKKyAgICBjb25zdCBjaGFyICpuZXN0ZWRfdXJsOworCisgICAgaWYgKGZsYWdzICYgQVZJT19GTEFHX1dSSVRFKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworCisgICAgaC0+aXNfc3RyZWFtZWQgPSAxOworCisgICAgaWYgKGF2X3N0cnN0YXJ0KHVyaSwgImhscysiLCAmbmVzdGVkX3VybCkpIHsKKyAgICAgICAgYXZfc3RybGNweShzLT5wbGF5bGlzdHVybCwgbmVzdGVkX3VybCwgc2l6ZW9mKHMtPnBsYXlsaXN0dXJsKSk7CisgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydCh1cmksICJobHM6Ly8iLCAmbmVzdGVkX3VybCkpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJObyBuZXN0ZWQgcHJvdG9jb2wgc3BlY2lmaWVkLiBTcGVjaWZ5IGUuZy4gaGxzK2h0dHA6Ly8lc1xuIiwKKyAgICAgICAgICAgICAgIG5lc3RlZF91cmwpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgdXJsICVzXG4iLCB1cmkpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAiVXNpbmcgdGhlIGhscyBwcm90b2NvbCBpcyBkaXNjb3VyYWdlZCwgcGxlYXNlIHRyeSB1c2luZyB0aGUgIgorICAgICAgICAgICAiaGxzIGRlbXV4ZXIgaW5zdGVhZC4gVGhlIGhscyBkZW11eGVyIHNob3VsZCBiZSBtb3JlIGNvbXBsZXRlICIKKyAgICAgICAgICAgImFuZCB3b3JrIGFzIHdlbGwgYXMgdGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9uLiAoSWYgbm90LCAiCisgICAgICAgICAgICJwbGVhc2UgcmVwb3J0IGl0LikgVG8gdXNlIHRoZSBkZW11eGVyLCBzaW1wbHkgdXNlICVzIGFzIHVybC5cbiIsCisgICAgICAgICAgIHMtPnBsYXlsaXN0dXJsKTsKKworICAgIGlmICgocmV0ID0gcGFyc2VfcGxheWxpc3QoaCwgcy0+cGxheWxpc3R1cmwpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChzLT5uX3NlZ21lbnRzID09IDAgJiYgcy0+bl92YXJpYW50cyA+IDApIHsKKyAgICAgICAgaW50IG1heF9iYW5kd2lkdGggPSAwLCBtYXh2YXIgPSAtMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5fdmFyaWFudHM7IGkrKykgeworICAgICAgICAgICAgaWYgKHMtPnZhcmlhbnRzW2ldLT5iYW5kd2lkdGggPiBtYXhfYmFuZHdpZHRoIHx8IGkgPT0gMCkgeworICAgICAgICAgICAgICAgIG1heF9iYW5kd2lkdGggPSBzLT52YXJpYW50c1tpXS0+YmFuZHdpZHRoOworICAgICAgICAgICAgICAgIG1heHZhciA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfc3RybGNweShzLT5wbGF5bGlzdHVybCwgcy0+dmFyaWFudHNbbWF4dmFyXS0+dXJsLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihzLT5wbGF5bGlzdHVybCkpOworICAgICAgICBpZiAoKHJldCA9IHBhcnNlX3BsYXlsaXN0KGgsIHMtPnBsYXlsaXN0dXJsKSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChzLT5uX3NlZ21lbnRzID09IDApIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLCAiRW1wdHkgcGxheWxpc3RcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcy0+Y3VyX3NlcV9ubyA9IHMtPnN0YXJ0X3NlcV9ubzsKKyAgICBpZiAoIXMtPmZpbmlzaGVkICYmIHMtPm5fc2VnbWVudHMgPj0gMykKKyAgICAgICAgcy0+Y3VyX3NlcV9ubyA9IHMtPnN0YXJ0X3NlcV9ubyArIHMtPm5fc2VnbWVudHMgLSAzOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgaGxzX2Nsb3NlKGgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGxzX3JlYWQoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBITFNDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGNvbnN0IGNoYXIgKnVybDsKKyAgICBpbnQgcmV0OworICAgIGludDY0X3QgcmVsb2FkX2ludGVydmFsOworCitzdGFydDoKKyAgICBpZiAocy0+c2VnX2hkKSB7CisgICAgICAgIHJldCA9IGZmdXJsX3JlYWQocy0+c2VnX2hkLCBidWYsIHNpemUpOworICAgICAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChzLT5zZWdfaGQpIHsKKyAgICAgICAgZmZ1cmxfY2xvc2Uocy0+c2VnX2hkKTsKKyAgICAgICAgcy0+c2VnX2hkID0gTlVMTDsKKyAgICAgICAgcy0+Y3VyX3NlcV9ubysrOworICAgIH0KKyAgICByZWxvYWRfaW50ZXJ2YWwgPSBzLT5uX3NlZ21lbnRzID4gMCA/CisgICAgICAgICAgICAgICAgICAgICAgcy0+c2VnbWVudHNbcy0+bl9zZWdtZW50cyAtIDFdLT5kdXJhdGlvbiA6CisgICAgICAgICAgICAgICAgICAgICAgcy0+dGFyZ2V0X2R1cmF0aW9uOworcmV0cnk6CisgICAgaWYgKCFzLT5maW5pc2hlZCkgeworICAgICAgICBpbnQ2NF90IG5vdyA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICAgICAgaWYgKG5vdyAtIHMtPmxhc3RfbG9hZF90aW1lID49IHJlbG9hZF9pbnRlcnZhbCkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9wbGF5bGlzdChoLCBzLT5wbGF5bGlzdHVybCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgLyogSWYgd2UgbmVlZCB0byByZWxvYWQgdGhlIHBsYXlsaXN0IGFnYWluIGJlbG93IChpZgorICAgICAgICAgICAgICogdGhlcmUncyBzdGlsbCBubyBtb3JlIHNlZ21lbnRzKSwgc3dpdGNoIHRvIGEgcmVsb2FkCisgICAgICAgICAgICAgKiBpbnRlcnZhbCBvZiBoYWxmIHRoZSB0YXJnZXQgZHVyYXRpb24uICovCisgICAgICAgICAgICByZWxvYWRfaW50ZXJ2YWwgPSBzLT50YXJnZXRfZHVyYXRpb24gLyAyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5jdXJfc2VxX25vIDwgcy0+c3RhcnRfc2VxX25vKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJza2lwcGluZyAlZCBzZWdtZW50cyBhaGVhZCwgZXhwaXJlZCBmcm9tIHBsYXlsaXN0XG4iLAorICAgICAgICAgICAgICAgcy0+c3RhcnRfc2VxX25vIC0gcy0+Y3VyX3NlcV9ubyk7CisgICAgICAgIHMtPmN1cl9zZXFfbm8gPSBzLT5zdGFydF9zZXFfbm87CisgICAgfQorICAgIGlmIChzLT5jdXJfc2VxX25vIC0gcy0+c3RhcnRfc2VxX25vID49IHMtPm5fc2VnbWVudHMpIHsKKyAgICAgICAgaWYgKHMtPmZpbmlzaGVkKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICB3aGlsZSAoYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gcy0+bGFzdF9sb2FkX3RpbWUgPCByZWxvYWRfaW50ZXJ2YWwpIHsKKyAgICAgICAgICAgIGlmIChmZl9jaGVja19pbnRlcnJ1cHQoJmgtPmludGVycnVwdF9jYWxsYmFjaykpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhJVDsKKyAgICAgICAgICAgIGF2X3VzbGVlcCgxMDAqMTAwMCk7CisgICAgICAgIH0KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgdXJsID0gcy0+c2VnbWVudHNbcy0+Y3VyX3NlcV9ubyAtIHMtPnN0YXJ0X3NlcV9ub10tPnVybCwKKyAgICBhdl9sb2coaCwgQVZfTE9HX0RFQlVHLCAib3BlbmluZyAlc1xuIiwgdXJsKTsKKyAgICByZXQgPSBmZnVybF9vcGVuKCZzLT5zZWdfaGQsIHVybCwgQVZJT19GTEFHX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoZmZfY2hlY2tfaW50ZXJydXB0KCZoLT5pbnRlcnJ1cHRfY2FsbGJhY2spKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhJVDsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLCAiVW5hYmxlIHRvIG9wZW4gJXNcbiIsIHVybCk7CisgICAgICAgIHMtPmN1cl9zZXFfbm8rKzsKKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgZ290byBzdGFydDsKK30KKworVVJMUHJvdG9jb2wgZmZfaGxzX3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJobHMiLAorICAgIC51cmxfb3BlbiAgICAgICA9IGhsc19vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICA9IGhsc19yZWFkLAorICAgIC51cmxfY2xvc2UgICAgICA9IGhsc19jbG9zZSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVNURURfU0NIRU1FLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihITFNDb250ZXh0KSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaG5tLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvaG5tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMyMGZhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9obm0uYwpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENyeW8gSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBITk00IGRlbXV4ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgRGF2aWQgS21lbnQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcgLgorICoKKyAqIEZGbXBlZyAgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyAgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnIDsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBITk00X1RBRyBNS1RBRygnSCcsICdOJywgJ00nLCAnNCcpCisKKyNkZWZpbmUgSE5NNF9TQU1QTEVfUkFURSAyMjA1MAorI2RlZmluZSBITk00X0ZSQU1FX0ZQUyAyNAorCisjZGVmaW5lIEhOTTRfQ0hVTktfSURfUEwgMTk1MzYKKyNkZWZpbmUgSE5NNF9DSFVOS19JRF9JWiAyMzExMworI2RlZmluZSBITk00X0NIVU5LX0lEX0lVIDIxODMzCisjZGVmaW5lIEhOTTRfQ0hVTktfSURfU0QgMTc0OTEKKwordHlwZWRlZiBzdHJ1Y3QgSG5tNERlbXV4Q29udGV4dCB7CisgICAgdWludDhfdCB2ZXJzaW9uOworICAgIHVpbnQxNl90IHdpZHRoOworICAgIHVpbnQxNl90IGhlaWdodDsKKyAgICB1aW50MzJfdCBmaWxlc2l6ZTsKKyAgICB1aW50MzJfdCBmcmFtZXM7CisgICAgdWludDMyX3QgdGFib2Zmc2V0OworICAgIHVpbnQxNl90IGJpdHM7CisgICAgdWludDE2X3QgY2hhbm5lbHM7CisgICAgdWludDMyX3QgZnJhbWVzaXplOworICAgIHVpbnQzMl90IGN1cnJlbnRmcmFtZTsKKyAgICBpbnQ2NF90IHB0czsKKyAgICB1aW50MzJfdCBzdXBlcmNodW5rX3JlbWFpbmluZzsKKyAgICBBVlBhY2tldCB2cGt0OworfSBIbm00RGVtdXhDb250ZXh0OworCitzdGF0aWMgaW50IGhubV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAocC0+YnVmX3NpemUgPCA0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIGNoZWNrIGZvciBITk00IGhlYWRlci4KKyAgICAvLyBjdXJyZW50bHkgb25seSBITk0gdjQvdjRBIGlzIHN1cHBvcnRlZAorICAgIGlmIChBVl9STDMyKCZwLT5idWZbMF0pID09IEhOTTRfVEFHKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBobm1fcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEhubTREZW11eENvbnRleHQgKmhubSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqdnN0OworCisgICAgLyogZGVmYXVsdCBjb250ZXh0IG1lbWJlcnMgKi8KKyAgICBobm0tPnB0cyA9IDA7CisgICAgYXZfaW5pdF9wYWNrZXQoJmhubS0+dnBrdCk7CisgICAgaG5tLT52cGt0LmRhdGEgPSBOVUxMOworICAgIGhubS0+dnBrdC5zaXplID0gMDsKKworICAgIGhubS0+c3VwZXJjaHVua19yZW1haW5pbmcgPSAwOworCisgICAgYXZpb19za2lwKHBiLCA4KTsKKyAgICBobm0tPndpZHRoICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgaG5tLT5oZWlnaHQgICAgPSBhdmlvX3JsMTYocGIpOworICAgIGhubS0+ZmlsZXNpemUgID0gYXZpb19ybDMyKHBiKTsKKyAgICBobm0tPmZyYW1lcyAgICA9IGF2aW9fcmwzMihwYik7CisgICAgaG5tLT50YWJvZmZzZXQgPSBhdmlvX3JsMzIocGIpOworICAgIGhubS0+Yml0cyAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBobm0tPmNoYW5uZWxzICA9IGF2aW9fcmwxNihwYik7CisgICAgaG5tLT5mcmFtZXNpemUgPSBhdmlvX3JsMzIocGIpOworICAgIGF2aW9fc2tpcChwYiwgMzIpOworCisgICAgaG5tLT5jdXJyZW50ZnJhbWUgPSAwOworCisgICAgaWYgKGhubS0+d2lkdGggIDwgMjU2IHx8IGhubS0+d2lkdGggID4gNjQwIHx8CisgICAgICAgIGhubS0+aGVpZ2h0IDwgMTUwIHx8IGhubS0+aGVpZ2h0ID4gNDgwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiaW52YWxpZCByZXNvbHV0aW9uOiAldXgldVxuIiwgaG5tLT53aWR0aCwgaG5tLT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHdheSB0byBkZXRlY3QgSE5NNEEKKyAgICBpZiAoaG5tLT53aWR0aCA9PSA2NDApCisgICAgICAgIGhubS0+dmVyc2lvbiA9IDB4NGE7CisgICAgZWxzZQorICAgICAgICBobm0tPnZlcnNpb24gPSAweDQwOworCisgICAgaWYgKCEodnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9ITk00X1ZJREVPOworICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSAwOworICAgIHZzdC0+Y29kZWMtPndpZHRoICAgICAgPSBobm0tPndpZHRoOworICAgIHZzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBobm0tPmhlaWdodDsKKyAgICB2c3QtPmNvZGVjLT5leHRyYWRhdGEgID0gYXZfbWFsbG9jeigxKTsKKworICAgIHZzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMTsKKyAgICBtZW1jcHkodnN0LT5jb2RlYy0+ZXh0cmFkYXRhLCAmaG5tLT52ZXJzaW9uLCAxKTsKKworICAgIHZzdC0+c3RhcnRfdGltZSA9IDA7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgMzMsIDEsIEhOTTRfRlJBTUVfRlBTKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhubV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgSG5tNERlbXV4Q29udGV4dCAqaG5tID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCByZXQgPSAwOworCisgICAgdWludDMyX3Qgc3VwZXJjaHVua19zaXplLCBjaHVua19zaXplOworICAgIHVpbnQxNl90IGNodW5rX2lkOworCisgICAgaWYgKGhubS0+Y3VycmVudGZyYW1lID09IGhubS0+ZnJhbWVzIHx8IHBiLT5lb2ZfcmVhY2hlZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgaWYgKGhubS0+c3VwZXJjaHVua19yZW1haW5pbmcgPT0gMCkgeworICAgICAgICAvKiBwYXJzZSBuZXh0IHN1cGVyY2h1bmsgKi8KKyAgICAgICAgc3VwZXJjaHVua19zaXplID0gYXZpb19ybDI0KHBiKTsKKyAgICAgICAgYXZpb19za2lwKHBiLCAxKTsKKworICAgICAgICBobm0tPnN1cGVyY2h1bmtfcmVtYWluaW5nID0gc3VwZXJjaHVua19zaXplIC0gNDsKKyAgICB9CisKKyAgICBjaHVua19zaXplID0gYXZpb19ybDI0KHBiKTsKKyAgICBhdmlvX3NraXAocGIsIDEpOworICAgIGNodW5rX2lkID0gYXZpb19ybDE2KHBiKTsKKyAgICBhdmlvX3NraXAocGIsIDIpOworCisgICAgaWYgKGNodW5rX3NpemUgPiBobm0tPnN1cGVyY2h1bmtfcmVtYWluaW5nIHx8ICFjaHVua19zaXplKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiaW52YWxpZCBjaHVuayBzaXplOiAlIlBSSXUzMiIsIG9mZnNldDogJSJQUklkNjQiXG4iLAorICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSwgYXZpb190ZWxsKHBiKSk7CisgICAgICAgIGF2aW9fc2tpcChwYiwgaG5tLT5zdXBlcmNodW5rX3JlbWFpbmluZyAtIDgpOworICAgICAgICBobm0tPnN1cGVyY2h1bmtfcmVtYWluaW5nID0gMDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNodW5rX2lkKSB7CisgICAgY2FzZSBITk00X0NIVU5LX0lEX1BMOgorICAgIGNhc2UgSE5NNF9DSFVOS19JRF9JWjoKKyAgICBjYXNlIEhOTTRfQ0hVTktfSURfSVU6CisgICAgICAgIGF2aW9fc2VlayhwYiwgLTgsIFNFRUtfQ1VSKTsKKyAgICAgICAgcmV0ICs9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgY2h1bmtfc2l6ZSk7CisgICAgICAgIGhubS0+c3VwZXJjaHVua19yZW1haW5pbmcgLT0gY2h1bmtfc2l6ZTsKKyAgICAgICAgaWYgKGNodW5rX2lkID09IEhOTTRfQ0hVTktfSURfSVogfHwgY2h1bmtfaWQgPT0gSE5NNF9DSFVOS19JRF9JVSkKKyAgICAgICAgICAgIGhubS0+Y3VycmVudGZyYW1lKys7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBITk00X0NIVU5LX0lEX1NEOgorICAgICAgICBhdmlvX3NraXAocGIsIGNodW5rX3NpemUgLSA4KTsKKyAgICAgICAgaG5tLT5zdXBlcmNodW5rX3JlbWFpbmluZyAtPSBjaHVua19zaXplOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gY2h1bmsgZm91bmQ6ICUiUFJJdTE2Iiwgb2Zmc2V0OiAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICBjaHVua19pZCwgYXZpb190ZWxsKHBiKSk7CisgICAgICAgIGF2aW9fc2tpcChwYiwgY2h1bmtfc2l6ZSAtIDgpOworICAgICAgICBobm0tPnN1cGVyY2h1bmtfcmVtYWluaW5nIC09IGNodW5rX3NpemU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaG5tX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEhubTREZW11eENvbnRleHQgKmhubSA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmIChobm0tPnZwa3Quc2l6ZSA+IDApCisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZobm0tPnZwa3QpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfaG5tX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImhubSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNyeW8gSE5NIHY0IiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEhubTREZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGhubV9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBobm1fcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gaG5tX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGhubV9yZWFkX2Nsb3NlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PX0JZVEVfU0VFSyB8IEFWRk1UX05PR0VOU0VBUkNIIHwgQVZGTVRfTk9CSU5TRUFSQ0gKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaHR0cC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2h0dHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWRlMDVjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2h0dHAuYwpAQCAtMCwwICsxLDEzMTIgQEAKKy8qCisgKiBIVFRQIHByb3RvY29sIGZvciBmZm1wZWcgY2xpZW50CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIENPTkZJR19aTElCCisjaW5jbHVkZSA8emxpYi5oPgorI2VuZGlmIC8qIENPTkZJR19aTElCICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImh0dHAuaCIKKyNpbmNsdWRlICJodHRwYXV0aC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibmV0d29yay5oIgorI2luY2x1ZGUgIm9zX3N1cHBvcnQuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKworLyogWFhYOiBQT1NUIHByb3RvY29sIGlzIG5vdCBjb21wbGV0ZWx5IGltcGxlbWVudGVkIGJlY2F1c2UgZmZtcGVnIHVzZXMKKyAqIG9ubHkgYSBzdWJzZXQgb2YgaXQuICovCisKKy8qIFRoZSBJTyBidWZmZXIgc2l6ZSBpcyB1bnJlbGF0ZWQgdG8gdGhlIG1heCBVUkwgc2l6ZSBpbiBpdHNlbGYsIGJ1dCBuZWVkcworICogdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGZpdCB0aGUgZnVsbCByZXF1ZXN0IGhlYWRlcnMgKGluY2x1ZGluZyBsb25nCisgKiBwYXRoIG5hbWVzKS4gKi8KKyNkZWZpbmUgQlVGRkVSX1NJWkUgICBNQVhfVVJMX1NJWkUKKyNkZWZpbmUgTUFYX1JFRElSRUNUUyA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBVUkxDb250ZXh0ICpoZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltCVUZGRVJfU0laRV0sICpidWZfcHRyLCAqYnVmX2VuZDsKKyAgICBpbnQgbGluZV9jb3VudDsKKyAgICBpbnQgaHR0cF9jb2RlOworICAgIC8qIFVzZWQgaWYgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiBvdGhlcndpc2UgLTEuICovCisgICAgaW50NjRfdCBjaHVua3NpemU7CisgICAgaW50NjRfdCBvZmYsIGVuZF9vZmYsIGZpbGVzaXplOworICAgIGNoYXIgKmxvY2F0aW9uOworICAgIEhUVFBBdXRoU3RhdGUgYXV0aF9zdGF0ZTsKKyAgICBIVFRQQXV0aFN0YXRlIHByb3h5X2F1dGhfc3RhdGU7CisgICAgY2hhciAqaGVhZGVyczsKKyAgICBjaGFyICptaW1lX3R5cGU7CisgICAgY2hhciAqdXNlcl9hZ2VudDsKKyAgICBjaGFyICpjb250ZW50X3R5cGU7CisgICAgLyogU2V0IGlmIHRoZSBzZXJ2ZXIgY29ycmVjdGx5IGhhbmRsZXMgQ29ubmVjdGlvbjogY2xvc2UgYW5kIHdpbGwgY2xvc2UKKyAgICAgKiB0aGUgY29ubmVjdGlvbiBhZnRlciBmZWVkaW5nIHVzIHRoZSBjb250ZW50LiAqLworICAgIGludCB3aWxsY2xvc2U7CisgICAgaW50IHNlZWthYmxlOyAgICAgICAgICAgLyoqPCBDb250cm9sIHNlZWthYmlsaXR5LCAwID0gZGlzYWJsZSwgMSA9IGVuYWJsZSwgLTEgPSBwcm9iZS4gKi8KKyAgICBpbnQgY2h1bmtlZF9wb3N0OworICAgIC8qIEEgZmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgdGhlIGVuZCBvZiBjaHVua2VkIGVuY29kaW5nIGhhcyBiZWVuIHNlbnQuICovCisgICAgaW50IGVuZF9jaHVua2VkX3Bvc3Q7CisgICAgLyogQSBmbGFnIHdoaWNoIGluZGljYXRlcyB3ZSBoYXZlIGZpbmlzaGVkIHRvIHJlYWQgUE9TVCByZXBseS4gKi8KKyAgICBpbnQgZW5kX2hlYWRlcjsKKyAgICAvKiBBIGZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIHdlIHVzZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLiAqLworICAgIGludCBtdWx0aXBsZV9yZXF1ZXN0czsKKyAgICB1aW50OF90ICpwb3N0X2RhdGE7CisgICAgaW50IHBvc3RfZGF0YWxlbjsKKyAgICBpbnQgaXNfYWthbWFpOworICAgIGludCBpc19tZWRpYWdhdGV3YXk7CisgICAgY2hhciAqY29va2llczsgICAgICAgICAgLy8vPCBob2xkcyBuZXdsaW5lIChcbikgZGVsaW1pdGVkIFNldC1Db29raWUgaGVhZGVyIGZpZWxkIHZhbHVlcyAod2l0aG91dCB0aGUgIlNldC1Db29raWU6ICIgZmllbGQgbmFtZSkKKyAgICBpbnQgaWN5OworICAgIC8qIGhvdyBtdWNoIGRhdGEgd2FzIHJlYWQgc2luY2UgdGhlIGxhc3QgSUNZIG1ldGFkYXRhIHBhY2tldCAqLworICAgIGludCBpY3lfZGF0YV9yZWFkOworICAgIC8qIGFmdGVyIGhvdyBtYW55IGJ5dGVzIG9mIHJlYWQgZGF0YSBhIG5ldyBtZXRhZGF0YSBwYWNrZXQgd2lsbCBiZSBmb3VuZCAqLworICAgIGludCBpY3lfbWV0YWludDsKKyAgICBjaGFyICppY3lfbWV0YWRhdGFfaGVhZGVyczsKKyAgICBjaGFyICppY3lfbWV0YWRhdGFfcGFja2V0OworICAgIEFWRGljdGlvbmFyeSAqbWV0YWRhdGE7CisjaWYgQ09ORklHX1pMSUIKKyAgICBpbnQgY29tcHJlc3NlZDsKKyAgICB6X3N0cmVhbSBpbmZsYXRlX3N0cmVhbTsKKyAgICB1aW50OF90ICppbmZsYXRlX2J1ZmZlcjsKKyNlbmRpZiAvKiBDT05GSUdfWkxJQiAqLworICAgIEFWRGljdGlvbmFyeSAqY2hhaW5lZF9vcHRpb25zOworICAgIGludCBzZW5kX2V4cGVjdF8xMDA7CisgICAgY2hhciAqbWV0aG9kOworfSBIVFRQQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSFRUUENvbnRleHQsIHgpCisjZGVmaW5lIEQgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KKyNkZWZpbmUgRSBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorI2RlZmluZSBERUZBVUxUX1VTRVJfQUdFTlQgIkxhdmYvIiBBVl9TVFJJTkdJRlkoTElCQVZGT1JNQVRfVkVSU0lPTikKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJzZWVrYWJsZSIsICJjb250cm9sIHNlZWthYmlsaXR5IG9mIGNvbm5lY3Rpb24iLCBPRkZTRVQoc2Vla2FibGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sIC0xLCAxLCBEIH0sCisgICAgeyAiY2h1bmtlZF9wb3N0IiwgInVzZSBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nIGZvciBwb3N0cyIsIE9GRlNFVChjaHVua2VkX3Bvc3QpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgMSwgRSB9LAorICAgIHsgImhlYWRlcnMiLCAic2V0IGN1c3RvbSBIVFRQIGhlYWRlcnMsIGNhbiBvdmVycmlkZSBidWlsdCBpbiBkZWZhdWx0IGhlYWRlcnMiLCBPRkZTRVQoaGVhZGVycyksIEFWX09QVF9UWVBFX1NUUklORywgeyAwIH0sIDAsIDAsIEQgfCBFIH0sCisgICAgeyAiY29udGVudF90eXBlIiwgInNldCBhIHNwZWNpZmljIGNvbnRlbnQgdHlwZSBmb3IgdGhlIFBPU1QgbWVzc2FnZXMiLCBPRkZTRVQoY29udGVudF90eXBlKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgRCB8IEUgfSwKKyAgICB7ICJ1c2VyX2FnZW50IiwgIm92ZXJyaWRlIFVzZXItQWdlbnQgaGVhZGVyIiwgT0ZGU0VUKHVzZXJfYWdlbnQpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IERFRkFVTFRfVVNFUl9BR0VOVCB9LCAwLCAwLCBEIH0sCisgICAgeyAidXNlci1hZ2VudCIsICJvdmVycmlkZSBVc2VyLUFnZW50IGhlYWRlciIsIE9GRlNFVCh1c2VyX2FnZW50KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBERUZBVUxUX1VTRVJfQUdFTlQgfSwgMCwgMCwgRCB9LAorICAgIHsgIm11bHRpcGxlX3JlcXVlc3RzIiwgInVzZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIiwgT0ZGU0VUKG11bHRpcGxlX3JlcXVlc3RzKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEQgfCBFIH0sCisgICAgeyAicG9zdF9kYXRhIiwgInNldCBjdXN0b20gSFRUUCBwb3N0IGRhdGEiLCBPRkZTRVQocG9zdF9kYXRhKSwgQVZfT1BUX1RZUEVfQklOQVJZLCAuZmxhZ3MgPSBEIHwgRSB9LAorICAgIHsgIm1pbWVfdHlwZSIsICJleHBvcnQgdGhlIE1JTUUgdHlwZSIsIE9GRlNFVChtaW1lX3R5cGUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgMCB9LCAwLCAwLCBBVl9PUFRfRkxBR19FWFBPUlQgfCBBVl9PUFRfRkxBR19SRUFET05MWSB9LAorICAgIHsgImNvb2tpZXMiLCAic2V0IGNvb2tpZXMgdG8gYmUgc2VudCBpbiBhcHBsaWNhYmxlIGZ1dHVyZSByZXF1ZXN0cywgdXNlIG5ld2xpbmUgZGVsaW1pdGVkIFNldC1Db29raWUgSFRUUCBmaWVsZCB2YWx1ZSBzeW50YXgiLCBPRkZTRVQoY29va2llcyksIEFWX09QVF9UWVBFX1NUUklORywgeyAwIH0sIDAsIDAsIEQgfSwKKyAgICB7ICJpY3kiLCAicmVxdWVzdCBJQ1kgbWV0YWRhdGEiLCBPRkZTRVQoaWN5KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDAsIDEsIEQgfSwKKyAgICB7ICJpY3lfbWV0YWRhdGFfaGVhZGVycyIsICJyZXR1cm4gSUNZIG1ldGFkYXRhIGhlYWRlcnMiLCBPRkZTRVQoaWN5X21ldGFkYXRhX2hlYWRlcnMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgMCB9LCAwLCAwLCBBVl9PUFRfRkxBR19FWFBPUlQgfSwKKyAgICB7ICJpY3lfbWV0YWRhdGFfcGFja2V0IiwgInJldHVybiBjdXJyZW50IElDWSBtZXRhZGF0YSBwYWNrZXQiLCBPRkZTRVQoaWN5X21ldGFkYXRhX3BhY2tldCksIEFWX09QVF9UWVBFX1NUUklORywgeyAwIH0sIDAsIDAsIEFWX09QVF9GTEFHX0VYUE9SVCB9LAorICAgIHsgIm1ldGFkYXRhIiwgIm1ldGFkYXRhIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtIiwgT0ZGU0VUKG1ldGFkYXRhKSwgQVZfT1BUX1RZUEVfRElDVCwgezB9LCAwLCAwLCBBVl9PUFRfRkxBR19FWFBPUlQgfSwKKyAgICB7ICJhdXRoX3R5cGUiLCAiSFRUUCBhdXRoZW50aWNhdGlvbiB0eXBlIiwgT0ZGU0VUKGF1dGhfc3RhdGUuYXV0aF90eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBIVFRQX0FVVEhfTk9ORSB9LCBIVFRQX0FVVEhfTk9ORSwgSFRUUF9BVVRIX0JBU0lDLCBEIHwgRSwgImF1dGhfdHlwZSJ9LAorICAgIHsgIm5vbmUiLCAiTm8gYXV0aCBtZXRob2Qgc2V0LCBhdXRvZGV0ZWN0IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEhUVFBfQVVUSF9OT05FIH0sIDAsIDAsIEQgfCBFLCAiYXV0aF90eXBlIn0sCisgICAgeyAiYmFzaWMiLCAiSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBIVFRQX0FVVEhfQkFTSUMgfSwgMCwgMCwgRCB8IEUsICJhdXRoX3R5cGUifSwKKyAgICB7ICJzZW5kX2V4cGVjdF8xMDAiLCAiRm9yY2Ugc2VuZGluZyBhbiBFeHBlY3Q6IDEwMC1jb250aW51ZSBoZWFkZXIgZm9yIFBPU1QiLCBPRkZTRVQoc2VuZF9leHBlY3RfMTAwKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEUgfSwKKyAgICB7ICJsb2NhdGlvbiIsICJUaGUgYWN0dWFsIGxvY2F0aW9uIG9mIHRoZSBkYXRhIHJlY2VpdmVkIiwgT0ZGU0VUKGxvY2F0aW9uKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgRCB8IEUgfSwKKyAgICB7ICJvZmZzZXQiLCAiaW5pdGlhbCBieXRlIG9mZnNldCIsIE9GRlNFVChvZmYpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgeyAuaTY0ID0gMCB9LCAwLCBJTlQ2NF9NQVgsIEQgfSwKKyAgICB7ICJlbmRfb2Zmc2V0IiwgInRyeSB0byBsaW1pdCB0aGUgcmVxdWVzdCB0byBieXRlcyBwcmVjZWRpbmcgdGhpcyBvZmZzZXQiLCBPRkZTRVQoZW5kX29mZiksIEFWX09QVF9UWVBFX0lOVDY0LCB7IC5pNjQgPSAwIH0sIDAsIElOVDY0X01BWCwgRCB9LAorICAgIHsgIm1ldGhvZCIsICJPdmVycmlkZSB0aGUgSFRUUCBtZXRob2QiLCBPRkZTRVQobWV0aG9kKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sIDAsIDAsIEUgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGludCBodHRwX2Nvbm5lY3QoVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbG9jYWxfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3RzdHIsIGNvbnN0IGNoYXIgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm94eWF1dGgsIGludCAqbmV3X2xvY2F0aW9uKTsKKwordm9pZCBmZl9odHRwX2luaXRfYXV0aF9zdGF0ZShVUkxDb250ZXh0ICpkZXN0LCBjb25zdCBVUkxDb250ZXh0ICpzcmMpCit7CisgICAgbWVtY3B5KCYoKEhUVFBDb250ZXh0ICopZGVzdC0+cHJpdl9kYXRhKS0+YXV0aF9zdGF0ZSwKKyAgICAgICAgICAgJigoSFRUUENvbnRleHQgKilzcmMtPnByaXZfZGF0YSktPmF1dGhfc3RhdGUsCisgICAgICAgICAgIHNpemVvZihIVFRQQXV0aFN0YXRlKSk7CisgICAgbWVtY3B5KCYoKEhUVFBDb250ZXh0ICopZGVzdC0+cHJpdl9kYXRhKS0+cHJveHlfYXV0aF9zdGF0ZSwKKyAgICAgICAgICAgJigoSFRUUENvbnRleHQgKilzcmMtPnByaXZfZGF0YSktPnByb3h5X2F1dGhfc3RhdGUsCisgICAgICAgICAgIHNpemVvZihIVFRQQXV0aFN0YXRlKSk7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9vcGVuX2NueF9pbnRlcm5hbChVUkxDb250ZXh0ICpoLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKQoreworICAgIGNvbnN0IGNoYXIgKnBhdGgsICpwcm94eV9wYXRoLCAqbG93ZXJfcHJvdG8gPSAidGNwIiwgKmxvY2FsX3BhdGg7CisgICAgY2hhciBob3N0bmFtZVsxMDI0XSwgaG9zdHN0clsxMDI0XSwgcHJvdG9bMTBdOworICAgIGNoYXIgYXV0aFsxMDI0XSwgcHJveHlhdXRoWzEwMjRdID0gIiI7CisgICAgY2hhciBwYXRoMVtNQVhfVVJMX1NJWkVdOworICAgIGNoYXIgYnVmWzEwMjRdLCB1cmxidWZbTUFYX1VSTF9TSVpFXTsKKyAgICBpbnQgcG9ydCwgdXNlX3Byb3h5LCBlcnIsIGxvY2F0aW9uX2NoYW5nZWQgPSAwOworICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworCisgICAgYXZfdXJsX3NwbGl0KHByb3RvLCBzaXplb2YocHJvdG8pLCBhdXRoLCBzaXplb2YoYXV0aCksCisgICAgICAgICAgICAgICAgIGhvc3RuYW1lLCBzaXplb2YoaG9zdG5hbWUpLCAmcG9ydCwKKyAgICAgICAgICAgICAgICAgcGF0aDEsIHNpemVvZihwYXRoMSksIHMtPmxvY2F0aW9uKTsKKyAgICBmZl91cmxfam9pbihob3N0c3RyLCBzaXplb2YoaG9zdHN0ciksIE5VTEwsIE5VTEwsIGhvc3RuYW1lLCBwb3J0LCBOVUxMKTsKKworICAgIHByb3h5X3BhdGggPSBnZXRlbnYoImh0dHBfcHJveHkiKTsKKyAgICB1c2VfcHJveHkgID0gIWZmX2h0dHBfbWF0Y2hfbm9fcHJveHkoZ2V0ZW52KCJub19wcm94eSIpLCBob3N0bmFtZSkgJiYKKyAgICAgICAgICAgICAgICAgcHJveHlfcGF0aCAmJiBhdl9zdHJzdGFydChwcm94eV9wYXRoLCAiaHR0cDovLyIsIE5VTEwpOworCisgICAgaWYgKCFzdHJjbXAocHJvdG8sICJodHRwcyIpKSB7CisgICAgICAgIGxvd2VyX3Byb3RvID0gInRscyI7CisgICAgICAgIHVzZV9wcm94eSAgID0gMDsKKyAgICAgICAgaWYgKHBvcnQgPCAwKQorICAgICAgICAgICAgcG9ydCA9IDQ0MzsKKyAgICB9CisgICAgaWYgKHBvcnQgPCAwKQorICAgICAgICBwb3J0ID0gODA7CisKKyAgICBpZiAocGF0aDFbMF0gPT0gJ1wwJykKKyAgICAgICAgcGF0aCA9ICIvIjsKKyAgICBlbHNlCisgICAgICAgIHBhdGggPSBwYXRoMTsKKyAgICBsb2NhbF9wYXRoID0gcGF0aDsKKyAgICBpZiAodXNlX3Byb3h5KSB7CisgICAgICAgIC8qIFJlYXNzZW1ibGUgdGhlIHJlcXVlc3QgVVJMIHdpdGhvdXQgYXV0aCBzdHJpbmcgLSB3ZSBkb24ndAorICAgICAgICAgKiB3YW50IHRvIGxlYWsgdGhlIGF1dGggdG8gdGhlIHByb3h5LiAqLworICAgICAgICBmZl91cmxfam9pbih1cmxidWYsIHNpemVvZih1cmxidWYpLCBwcm90bywgTlVMTCwgaG9zdG5hbWUsIHBvcnQsICIlcyIsCisgICAgICAgICAgICAgICAgICAgIHBhdGgxKTsKKyAgICAgICAgcGF0aCA9IHVybGJ1ZjsKKyAgICAgICAgYXZfdXJsX3NwbGl0KE5VTEwsIDAsIHByb3h5YXV0aCwgc2l6ZW9mKHByb3h5YXV0aCksCisgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSwgc2l6ZW9mKGhvc3RuYW1lKSwgJnBvcnQsIE5VTEwsIDAsIHByb3h5X3BhdGgpOworICAgIH0KKworICAgIGZmX3VybF9qb2luKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGxvd2VyX3Byb3RvLCBOVUxMLCBob3N0bmFtZSwgcG9ydCwgTlVMTCk7CisKKyAgICBpZiAoIXMtPmhkKSB7CisgICAgICAgIGVyciA9IGZmdXJsX29wZW4oJnMtPmhkLCBidWYsIEFWSU9fRkxBR19SRUFEX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIG9wdGlvbnMpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gaHR0cF9jb25uZWN0KGgsIHBhdGgsIGxvY2FsX3BhdGgsIGhvc3RzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGF1dGgsIHByb3h5YXV0aCwgJmxvY2F0aW9uX2NoYW5nZWQpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIGxvY2F0aW9uX2NoYW5nZWQ7Cit9CisKKy8qIHJldHVybiBub24gemVybyBpZiBlcnJvciAqLworc3RhdGljIGludCBodHRwX29wZW5fY254KFVSTENvbnRleHQgKmgsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCit7CisgICAgSFRUUEF1dGhUeXBlIGN1cl9hdXRoX3R5cGUsIGN1cl9wcm94eV9hdXRoX3R5cGU7CisgICAgSFRUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IGxvY2F0aW9uX2NoYW5nZWQsIGF0dGVtcHRzID0gMCwgcmVkaXJlY3RzID0gMDsKK3JlZG86CisgICAgYXZfZGljdF9jb3B5KG9wdGlvbnMsIHMtPmNoYWluZWRfb3B0aW9ucywgMCk7CisKKyAgICBjdXJfYXV0aF90eXBlICAgICAgID0gcy0+YXV0aF9zdGF0ZS5hdXRoX3R5cGU7CisgICAgY3VyX3Byb3h5X2F1dGhfdHlwZSA9IHMtPmF1dGhfc3RhdGUuYXV0aF90eXBlOworCisgICAgbG9jYXRpb25fY2hhbmdlZCA9IGh0dHBfb3Blbl9jbnhfaW50ZXJuYWwoaCwgb3B0aW9ucyk7CisgICAgaWYgKGxvY2F0aW9uX2NoYW5nZWQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBhdHRlbXB0cysrOworICAgIGlmIChzLT5odHRwX2NvZGUgPT0gNDAxKSB7CisgICAgICAgIGlmICgoY3VyX2F1dGhfdHlwZSA9PSBIVFRQX0FVVEhfTk9ORSB8fCBzLT5hdXRoX3N0YXRlLnN0YWxlKSAmJgorICAgICAgICAgICAgcy0+YXV0aF9zdGF0ZS5hdXRoX3R5cGUgIT0gSFRUUF9BVVRIX05PTkUgJiYgYXR0ZW1wdHMgPCA0KSB7CisgICAgICAgICAgICBmZnVybF9jbG9zZXAoJnMtPmhkKTsKKyAgICAgICAgICAgIGdvdG8gcmVkbzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChzLT5odHRwX2NvZGUgPT0gNDA3KSB7CisgICAgICAgIGlmICgoY3VyX3Byb3h5X2F1dGhfdHlwZSA9PSBIVFRQX0FVVEhfTk9ORSB8fCBzLT5wcm94eV9hdXRoX3N0YXRlLnN0YWxlKSAmJgorICAgICAgICAgICAgcy0+cHJveHlfYXV0aF9zdGF0ZS5hdXRoX3R5cGUgIT0gSFRUUF9BVVRIX05PTkUgJiYgYXR0ZW1wdHMgPCA0KSB7CisgICAgICAgICAgICBmZnVybF9jbG9zZXAoJnMtPmhkKTsKKyAgICAgICAgICAgIGdvdG8gcmVkbzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmICgocy0+aHR0cF9jb2RlID09IDMwMSB8fCBzLT5odHRwX2NvZGUgPT0gMzAyIHx8CisgICAgICAgICBzLT5odHRwX2NvZGUgPT0gMzAzIHx8IHMtPmh0dHBfY29kZSA9PSAzMDcpICYmCisgICAgICAgIGxvY2F0aW9uX2NoYW5nZWQgPT0gMSkgeworICAgICAgICAvKiB1cmwgbW92ZWQsIGdldCBuZXh0ICovCisgICAgICAgIGZmdXJsX2Nsb3NlcCgmcy0+aGQpOworICAgICAgICBpZiAocmVkaXJlY3RzKysgPj0gTUFYX1JFRElSRUNUUykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIC8qIFJlc3RhcnQgdGhlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3Mgd2l0aCB0aGUgbmV3IHRhcmdldCwgd2hpY2gKKyAgICAgICAgICogbWlnaHQgdXNlIGEgZGlmZmVyZW50IGF1dGggbWVjaGFuaXNtLiAqLworICAgICAgICBtZW1zZXQoJnMtPmF1dGhfc3RhdGUsIDAsIHNpemVvZihzLT5hdXRoX3N0YXRlKSk7CisgICAgICAgIGF0dGVtcHRzICAgICAgICAgPSAwOworICAgICAgICBsb2NhdGlvbl9jaGFuZ2VkID0gMDsKKyAgICAgICAgZ290byByZWRvOworICAgIH0KKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBpZiAocy0+aGQpCisgICAgICAgIGZmdXJsX2Nsb3NlcCgmcy0+aGQpOworICAgIGlmIChsb2NhdGlvbl9jaGFuZ2VkIDwgMCkKKyAgICAgICAgcmV0dXJuIGxvY2F0aW9uX2NoYW5nZWQ7CisgICAgcmV0dXJuIGZmX2h0dHBfYXZlcnJvcihzLT5odHRwX2NvZGUsIEFWRVJST1IoRUlPKSk7Cit9CisKK2ludCBmZl9odHRwX2RvX25ld19yZXF1ZXN0KFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSkKK3sKKyAgICBIVFRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBBVkRpY3Rpb25hcnkgKm9wdGlvbnMgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICBzLT5vZmYgICAgICAgICAgID0gMDsKKyAgICBzLT5pY3lfZGF0YV9yZWFkID0gMDsKKyAgICBhdl9mcmVlKHMtPmxvY2F0aW9uKTsKKyAgICBzLT5sb2NhdGlvbiA9IGF2X3N0cmR1cCh1cmkpOworICAgIGlmICghcy0+bG9jYXRpb24pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXQgPSBodHRwX29wZW5fY254KGgsICZvcHRpb25zKTsKKyAgICBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9odHRwX2F2ZXJyb3IoaW50IHN0YXR1c19jb2RlLCBpbnQgZGVmYXVsdF9hdmVycm9yKQoreworICAgIHN3aXRjaCAoc3RhdHVzX2NvZGUpIHsKKyAgICAgICAgY2FzZSA0MDA6IHJldHVybiBBVkVSUk9SX0hUVFBfQkFEX1JFUVVFU1Q7CisgICAgICAgIGNhc2UgNDAxOiByZXR1cm4gQVZFUlJPUl9IVFRQX1VOQVVUSE9SSVpFRDsKKyAgICAgICAgY2FzZSA0MDM6IHJldHVybiBBVkVSUk9SX0hUVFBfRk9SQklEREVOOworICAgICAgICBjYXNlIDQwNDogcmV0dXJuIEFWRVJST1JfSFRUUF9OT1RfRk9VTkQ7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgICBpZiAoc3RhdHVzX2NvZGUgPj0gNDAwICYmIHN0YXR1c19jb2RlIDw9IDQ5OSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSFRUUF9PVEhFUl80WFg7CisgICAgZWxzZSBpZiAoc3RhdHVzX2NvZGUgPj0gNTAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9IVFRQX1NFUlZFUl9FUlJPUjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBkZWZhdWx0X2F2ZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykKK3sKKyAgICBIVFRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYoIHMtPnNlZWthYmxlID09IDEgKQorICAgICAgICBoLT5pc19zdHJlYW1lZCA9IDA7CisgICAgZWxzZQorICAgICAgICBoLT5pc19zdHJlYW1lZCA9IDE7CisKKyAgICBzLT5maWxlc2l6ZSA9IC0xOworICAgIHMtPmxvY2F0aW9uID0gYXZfc3RyZHVwKHVyaSk7CisgICAgaWYgKCFzLT5sb2NhdGlvbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpZiAob3B0aW9ucykKKyAgICAgICAgYXZfZGljdF9jb3B5KCZzLT5jaGFpbmVkX29wdGlvbnMsICpvcHRpb25zLCAwKTsKKworICAgIGlmIChzLT5oZWFkZXJzKSB7CisgICAgICAgIGludCBsZW4gPSBzdHJsZW4ocy0+aGVhZGVycyk7CisgICAgICAgIGlmIChsZW4gPCAyIHx8IHN0cmNtcCgiXHJcbiIsIHMtPmhlYWRlcnMgKyBsZW4gLSAyKSkKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiTm8gdHJhaWxpbmcgQ1JMRiBmb3VuZCBpbiBIVFRQIGhlYWRlci5cbiIpOworICAgIH0KKworICAgIHJldCA9IGh0dHBfb3Blbl9jbngoaCwgb3B0aW9ucyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGF2X2RpY3RfZnJlZSgmcy0+Y2hhaW5lZF9vcHRpb25zKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGh0dHBfZ2V0YyhIVFRQQ29udGV4dCAqcykKK3sKKyAgICBpbnQgbGVuOworICAgIGlmIChzLT5idWZfcHRyID49IHMtPmJ1Zl9lbmQpIHsKKyAgICAgICAgbGVuID0gZmZ1cmxfcmVhZChzLT5oZCwgcy0+YnVmZmVyLCBCVUZGRVJfU0laRSk7CisgICAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5idWZfcHRyID0gcy0+YnVmZmVyOworICAgICAgICAgICAgcy0+YnVmX2VuZCA9IHMtPmJ1ZmZlciArIGxlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKnMtPmJ1Zl9wdHIrKzsKK30KKworc3RhdGljIGludCBodHRwX2dldF9saW5lKEhUVFBDb250ZXh0ICpzLCBjaGFyICpsaW5lLCBpbnQgbGluZV9zaXplKQoreworICAgIGludCBjaDsKKyAgICBjaGFyICpxOworCisgICAgcSA9IGxpbmU7CisgICAgZm9yICg7OykgeworICAgICAgICBjaCA9IGh0dHBfZ2V0YyhzKTsKKyAgICAgICAgaWYgKGNoIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBjaDsKKyAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgbGluZSAqLworICAgICAgICAgICAgaWYgKHEgPiBsaW5lICYmIHFbLTFdID09ICdccicpCisgICAgICAgICAgICAgICAgcS0tOworICAgICAgICAgICAgKnEgPSAnXDAnOworCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocSAtIGxpbmUpIDwgbGluZV9zaXplIC0gMSkKKyAgICAgICAgICAgICAgICAqcSsrID0gY2g7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaHR0cF9jb2RlKFVSTENvbnRleHQgKmgsIGludCBodHRwX2NvZGUsIGNvbnN0IGNoYXIgKmVuZCkKK3sKKyAgICBIVFRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICAvKiBlcnJvciBjb2RlcyBhcmUgNHh4IGFuZCA1eHgsIGJ1dCByZWdhcmQgNDAxIGFzIGEgc3VjY2Vzcywgc28gd2UKKyAgICAgKiBkb24ndCBhYm9ydCB1bnRpbCBhbGwgaGVhZGVycyBoYXZlIGJlZW4gcGFyc2VkLiAqLworICAgIGlmIChodHRwX2NvZGUgPj0gNDAwICYmIGh0dHBfY29kZSA8IDYwMCAmJgorICAgICAgICAoaHR0cF9jb2RlICE9IDQwMSB8fCBzLT5hdXRoX3N0YXRlLmF1dGhfdHlwZSAhPSBIVFRQX0FVVEhfTk9ORSkgJiYKKyAgICAgICAgKGh0dHBfY29kZSAhPSA0MDcgfHwgcy0+cHJveHlfYXV0aF9zdGF0ZS5hdXRoX3R5cGUgIT0gSFRUUF9BVVRIX05PTkUpKSB7CisgICAgICAgIGVuZCArPSBzdHJzcG4oZW5kLCBTUEFDRV9DSEFSUyk7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywgIkhUVFAgZXJyb3IgJWQgJXNcbiIsIGh0dHBfY29kZSwgZW5kKTsKKyAgICAgICAgcmV0dXJuIGZmX2h0dHBfYXZlcnJvcihodHRwX2NvZGUsIEFWRVJST1IoRUlPKSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2xvY2F0aW9uKEhUVFBDb250ZXh0ICpzLCBjb25zdCBjaGFyICpwKQoreworICAgIGNoYXIgcmVkaXJlY3RlZF9sb2NhdGlvbltNQVhfVVJMX1NJWkVdLCAqbmV3X2xvYzsKKyAgICBmZl9tYWtlX2Fic29sdXRlX3VybChyZWRpcmVjdGVkX2xvY2F0aW9uLCBzaXplb2YocmVkaXJlY3RlZF9sb2NhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bG9jYXRpb24sIHApOworICAgIG5ld19sb2MgPSBhdl9zdHJkdXAocmVkaXJlY3RlZF9sb2NhdGlvbik7CisgICAgaWYgKCFuZXdfbG9jKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2X2ZyZWUocy0+bG9jYXRpb24pOworICAgIHMtPmxvY2F0aW9uID0gbmV3X2xvYzsKKyAgICByZXR1cm4gMDsKK30KKworLyogImJ5dGVzICRmcm9tLSR0by8kZG9jdW1lbnRfc2l6ZSIgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2NvbnRlbnRfcmFuZ2UoVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqcCkKK3sKKyAgICBIVFRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBjaGFyICpzbGFzaDsKKworICAgIGlmICghc3RybmNtcChwLCAiYnl0ZXMgIiwgNikpIHsKKyAgICAgICAgcCAgICAgKz0gNjsKKyAgICAgICAgcy0+b2ZmID0gc3RydG9sbChwLCBOVUxMLCAxMCk7CisgICAgICAgIGlmICgoc2xhc2ggPSBzdHJjaHIocCwgJy8nKSkgJiYgc3RybGVuKHNsYXNoKSA+IDApCisgICAgICAgICAgICBzLT5maWxlc2l6ZSA9IHN0cnRvbGwoc2xhc2ggKyAxLCBOVUxMLCAxMCk7CisgICAgfQorICAgIGlmIChzLT5zZWVrYWJsZSA9PSAtMSAmJiAoIXMtPmlzX2FrYW1haSB8fCBzLT5maWxlc2l6ZSAhPSAyMTQ3NDgzNjQ3KSkKKyAgICAgICAgaC0+aXNfc3RyZWFtZWQgPSAwOyAvKiB3ZSBfY2FuXyBpbiBmYWN0IHNlZWsgKi8KK30KKworc3RhdGljIGludCBwYXJzZV9jb250ZW50X2VuY29kaW5nKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnApCit7CisgICAgaWYgKCFhdl9zdHJuY2FzZWNtcChwLCAiZ3ppcCIsIDQpIHx8CisgICAgICAgICFhdl9zdHJuY2FzZWNtcChwLCAiZGVmbGF0ZSIsIDcpKSB7CisjaWYgQ09ORklHX1pMSUIKKyAgICAgICAgSFRUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisKKyAgICAgICAgcy0+Y29tcHJlc3NlZCA9IDE7CisgICAgICAgIGluZmxhdGVFbmQoJnMtPmluZmxhdGVfc3RyZWFtKTsKKyAgICAgICAgaWYgKGluZmxhdGVJbml0Migmcy0+aW5mbGF0ZV9zdHJlYW0sIDMyICsgMTUpICE9IFpfT0spIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywgIkVycm9yIGR1cmluZyB6bGliIGluaXRpYWxpc2F0aW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5pbmZsYXRlX3N0cmVhbS5tc2cpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoemxpYkNvbXBpbGVGbGFncygpICYgKDEgPDwgMTcpKSB7CisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIllvdXIgemxpYiB3YXMgY29tcGlsZWQgd2l0aG91dCBnemlwIHN1cHBvcnQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJDb21wcmVzc2VkICglcykgY29udGVudCwgbmVlZCB6bGliIHdpdGggZ3ppcCBzdXBwb3J0XG4iLCBwKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyNlbmRpZiAvKiBDT05GSUdfWkxJQiAqLworICAgIH0gZWxzZSBpZiAoIWF2X3N0cm5jYXNlY21wKHAsICJpZGVudGl0eSIsIDgpKSB7CisgICAgICAgIC8vIFRoZSBub3JtYWwsIG5vLWVuY29kaW5nIGNhc2UgKGFsdGhvdWdoIHNlcnZlcnMgc2hvdWxkbid0IGluY2x1ZGUKKyAgICAgICAgLy8gdGhlIGhlYWRlciBhdCBhbGwgaWYgdGhpcyBpcyB0aGUgY2FzZSkuCisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBjb250ZW50IGNvZGluZzogJXNcbiIsIHApOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy8gQ29uY2F0IGFsbCBJY3ktIGhlYWRlciBsaW5lcworc3RhdGljIGludCBwYXJzZV9pY3koSFRUUENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqcCkKK3sKKyAgICBpbnQgbGVuID0gNCArIHN0cmxlbihwKSArIHN0cmxlbih0YWcpOworICAgIGludCBpc19maXJzdCA9ICFzLT5pY3lfbWV0YWRhdGFfaGVhZGVyczsKKyAgICBpbnQgcmV0OworCisgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCB0YWcsIHAsIDApOworCisgICAgaWYgKHMtPmljeV9tZXRhZGF0YV9oZWFkZXJzKQorICAgICAgICBsZW4gKz0gc3RybGVuKHMtPmljeV9tZXRhZGF0YV9oZWFkZXJzKTsKKworICAgIGlmICgocmV0ID0gYXZfcmVhbGxvY3AoJnMtPmljeV9tZXRhZGF0YV9oZWFkZXJzLCBsZW4pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoaXNfZmlyc3QpCisgICAgICAgICpzLT5pY3lfbWV0YWRhdGFfaGVhZGVycyA9ICdcMCc7CisKKyAgICBhdl9zdHJsY2F0ZihzLT5pY3lfbWV0YWRhdGFfaGVhZGVycywgbGVuLCAiJXM6ICVzXG4iLCB0YWcsIHApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19saW5lKFVSTENvbnRleHQgKmgsIGNoYXIgKmxpbmUsIGludCBsaW5lX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuZXdfbG9jYXRpb24pCit7CisgICAgSFRUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgY2hhciAqdGFnLCAqcCwgKmVuZDsKKyAgICBpbnQgcmV0OworCisgICAgLyogZW5kIG9mIGhlYWRlciAqLworICAgIGlmIChsaW5lWzBdID09ICdcMCcpIHsKKyAgICAgICAgcy0+ZW5kX2hlYWRlciA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHAgPSBsaW5lOworICAgIGlmIChsaW5lX2NvdW50ID09IDApIHsKKyAgICAgICAgd2hpbGUgKCFhdl9pc3NwYWNlKCpwKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICAgICAgcCsrOworICAgICAgICB3aGlsZSAoYXZfaXNzcGFjZSgqcCkpCisgICAgICAgICAgICBwKys7CisgICAgICAgIHMtPmh0dHBfY29kZSA9IHN0cnRvbChwLCAmZW5kLCAxMCk7CisKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19ERUJVRywgImh0dHBfY29kZT0lZFxuIiwgcy0+aHR0cF9jb2RlKTsKKworICAgICAgICBpZiAoKHJldCA9IGNoZWNrX2h0dHBfY29kZShoLCBzLT5odHRwX2NvZGUsIGVuZCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJzonKQorICAgICAgICAgICAgcCsrOworICAgICAgICBpZiAoKnAgIT0gJzonKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgKnAgID0gJ1wwJzsKKyAgICAgICAgdGFnID0gbGluZTsKKyAgICAgICAgcCsrOworICAgICAgICB3aGlsZSAoYXZfaXNzcGFjZSgqcCkpCisgICAgICAgICAgICBwKys7CisgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcCh0YWcsICJMb2NhdGlvbiIpKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IHBhcnNlX2xvY2F0aW9uKHMsIHApKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICpuZXdfbG9jYXRpb24gPSAxOworICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKHRhZywgIkNvbnRlbnQtTGVuZ3RoIikgJiYgcy0+ZmlsZXNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgIHMtPmZpbGVzaXplID0gc3RydG9sbChwLCBOVUxMLCAxMCk7CisgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAodGFnLCAiQ29udGVudC1SYW5nZSIpKSB7CisgICAgICAgICAgICBwYXJzZV9jb250ZW50X3JhbmdlKGgsIHApOworICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKHRhZywgIkFjY2VwdC1SYW5nZXMiKSAmJgorICAgICAgICAgICAgICAgICAgICFzdHJuY21wKHAsICJieXRlcyIsIDUpICYmCisgICAgICAgICAgICAgICAgICAgcy0+c2Vla2FibGUgPT0gLTEpIHsKKyAgICAgICAgICAgIGgtPmlzX3N0cmVhbWVkID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcCh0YWcsICJUcmFuc2Zlci1FbmNvZGluZyIpICYmCisgICAgICAgICAgICAgICAgICAgIWF2X3N0cm5jYXNlY21wKHAsICJjaHVua2VkIiwgNykpIHsKKyAgICAgICAgICAgIHMtPmZpbGVzaXplICA9IC0xOworICAgICAgICAgICAgcy0+Y2h1bmtzaXplID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcCh0YWcsICJXV1ctQXV0aGVudGljYXRlIikpIHsKKyAgICAgICAgICAgIGZmX2h0dHBfYXV0aF9oYW5kbGVfaGVhZGVyKCZzLT5hdXRoX3N0YXRlLCB0YWcsIHApOworICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKHRhZywgIkF1dGhlbnRpY2F0aW9uLUluZm8iKSkgeworICAgICAgICAgICAgZmZfaHR0cF9hdXRoX2hhbmRsZV9oZWFkZXIoJnMtPmF1dGhfc3RhdGUsIHRhZywgcCk7CisgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAodGFnLCAiUHJveHktQXV0aGVudGljYXRlIikpIHsKKyAgICAgICAgICAgIGZmX2h0dHBfYXV0aF9oYW5kbGVfaGVhZGVyKCZzLT5wcm94eV9hdXRoX3N0YXRlLCB0YWcsIHApOworICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKHRhZywgIkNvbm5lY3Rpb24iKSkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAocCwgImNsb3NlIikpCisgICAgICAgICAgICAgICAgcy0+d2lsbGNsb3NlID0gMTsKKyAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcCh0YWcsICJTZXJ2ZXIiKSkgeworICAgICAgICAgICAgaWYgKCFhdl9zdHJjYXNlY21wKHAsICJBa2FtYWlHSG9zdCIpKSB7CisgICAgICAgICAgICAgICAgcy0+aXNfYWthbWFpID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cm5jYXNlY21wKHAsICJNZWRpYUdhdGV3YXkiLCAxMikpIHsKKyAgICAgICAgICAgICAgICBzLT5pc19tZWRpYWdhdGV3YXkgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKHRhZywgIkNvbnRlbnQtVHlwZSIpKSB7CisgICAgICAgICAgICBhdl9mcmVlKHMtPm1pbWVfdHlwZSk7CisgICAgICAgICAgICBzLT5taW1lX3R5cGUgPSBhdl9zdHJkdXAocCk7CisgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAodGFnLCAiU2V0LUNvb2tpZSIpKSB7CisgICAgICAgICAgICBpZiAoIXMtPmNvb2tpZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIShzLT5jb29raWVzID0gYXZfc3RyZHVwKHApKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhciAqdG1wID0gcy0+Y29va2llczsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc3RyX3NpemUgPSBzdHJsZW4odG1wKSArIHN0cmxlbihwKSArIDI7CisgICAgICAgICAgICAgICAgaWYgKCEocy0+Y29va2llcyA9IGF2X21hbGxvYyhzdHJfc2l6ZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmNvb2tpZXMgPSB0bXA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNucHJpbnRmKHMtPmNvb2tpZXMsIHN0cl9zaXplLCAiJXNcbiVzIiwgdG1wLCBwKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAodGFnLCAiSWN5LU1ldGFJbnQiKSkgeworICAgICAgICAgICAgcy0+aWN5X21ldGFpbnQgPSBzdHJ0b2xsKHAsIE5VTEwsIDEwKTsKKyAgICAgICAgfSBlbHNlIGlmICghYXZfc3RybmNhc2VjbXAodGFnLCAiSWN5LSIsIDQpKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IHBhcnNlX2ljeShzLCB0YWcsIHApKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcCh0YWcsICJDb250ZW50LUVuY29kaW5nIikpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gcGFyc2VfY29udGVudF9lbmNvZGluZyhoLCBwKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgc3RyaW5nIGNvbnRhaW5pbmcgY29va2llIHZhbHVlcyBmb3IgdXNlIGFzIGEgSFRUUCBjb29raWUgaGVhZGVyCisgKiBmaWVsZCB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIHBhdGggYW5kIGRvbWFpbiBmcm9tIHRoZSBjb29raWUgdmFsdWVzIHN0b3JlZCBpbgorICogdGhlIEhUVFAgcHJvdG9jb2wgY29udGV4dC4gVGhlIGNvb2tpZSBzdHJpbmcgaXMgc3RvcmVkIGluICpjb29raWVzLgorICoKKyAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiBhbiBlcnJvciBjb25kaXRpb24gb2NjdXJyZWQsIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2Nvb2tpZXMoSFRUUENvbnRleHQgKnMsIGNoYXIgKipjb29raWVzLCBjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkb21haW4pCit7CisgICAgLy8gY29va2llIHN0cmluZ3Mgd2lsbCBsb29rIGxpa2UgU2V0LUNvb2tpZSBoZWFkZXIgZmllbGQgdmFsdWVzLiAgTXVsdGlwbGUKKyAgICAvLyBTZXQtQ29va2llIGZpZWxkcyB3aWxsIHJlc3VsdCBpbiBtdWx0aXBsZSB2YWx1ZXMgZGVsaW1pdGVkIGJ5IGEgbmV3bGluZQorICAgIGludCByZXQgPSAwOworICAgIGNoYXIgKm5leHQsICpjb29raWUsICpzZXRfY29va2llcyA9IGF2X3N0cmR1cChzLT5jb29raWVzKSwgKmNzZXRfY29va2llcyA9IHNldF9jb29raWVzOworCisgICAgaWYgKCFzZXRfY29va2llcykgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICpjb29raWVzID0gTlVMTDsKKyAgICB3aGlsZSAoKGNvb2tpZSA9IGF2X3N0cnRvayhzZXRfY29va2llcywgIlxuIiwgJm5leHQpKSkgeworICAgICAgICBpbnQgZG9tYWluX29mZnNldCA9IDA7CisgICAgICAgIGNoYXIgKnBhcmFtLCAqbmV4dF9wYXJhbSwgKmNkb21haW4gPSBOVUxMLCAqY3BhdGggPSBOVUxMLCAqY3ZhbHVlID0gTlVMTDsKKyAgICAgICAgc2V0X2Nvb2tpZXMgPSBOVUxMOworCisgICAgICAgIHdoaWxlICgocGFyYW0gPSBhdl9zdHJ0b2soY29va2llLCAiOyAiLCAmbmV4dF9wYXJhbSkpKSB7CisgICAgICAgICAgICBpZiAoY29va2llKSB7CisgICAgICAgICAgICAgICAgLy8gZmlyc3Qga2V5LXZhbHVlIHBhaXIgaXMgdGhlIGFjdHVhbCBjb29raWUgdmFsdWUKKyAgICAgICAgICAgICAgICBjdmFsdWUgPSBhdl9zdHJkdXAocGFyYW0pOworICAgICAgICAgICAgICAgIGNvb2tpZSA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJuY2FzZWNtcCgicGF0aD0iLCAgIHBhcmFtLCA1KSkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUoY3BhdGgpOworICAgICAgICAgICAgICAgIGNwYXRoID0gYXZfc3RyZHVwKCZwYXJhbVs1XSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJuY2FzZWNtcCgiZG9tYWluPSIsIHBhcmFtLCA3KSkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjb29raWUgc3BlY2lmaWVzIGEgc3ViLWRvbWFpbiwgc2tpcCB0aGUgbGVhZGluZyBkb3QgdGhlcmVieQorICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmcgVVJMcyB0aGF0IHBvaW50IHRvIHN1Yi1kb21haW5zIGFuZCB0aGUgbWFzdGVyIGRvbWFpbgorICAgICAgICAgICAgICAgIGludCBsZWFkaW5nX2RvdCA9IChwYXJhbVs3XSA9PSAnLicpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoY2RvbWFpbik7CisgICAgICAgICAgICAgICAgY2RvbWFpbiA9IGF2X3N0cmR1cCgmcGFyYW1bNytsZWFkaW5nX2RvdF0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdW5rbm93biBhdHRyaWJ1dGVzCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjZG9tYWluKQorICAgICAgICAgICAgY2RvbWFpbiA9IGF2X3N0cmR1cChkb21haW4pOworCisgICAgICAgIC8vIGVuc3VyZSBhbGwgb2YgdGhlIG5lY2Vzc2FyeSB2YWx1ZXMgYXJlIHZhbGlkCisgICAgICAgIGlmICghY2RvbWFpbiB8fCAhY3BhdGggfHwgIWN2YWx1ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNvb2tpZSBmb3VuZCwgbm8gdmFsdWUsIHBhdGggb3IgZG9tYWluIHNwZWNpZmllZFxuIik7CisgICAgICAgICAgICBnb3RvIGRvbmVfY29va2llOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHJlcXVlc3QgcGF0aCBtYXRjaGVzIHRoZSBjb29raWUgcGF0aAorICAgICAgICBpZiAoYXZfc3RybmNhc2VjbXAocGF0aCwgY3BhdGgsIHN0cmxlbihjcGF0aCkpKQorICAgICAgICAgICAgZ290byBkb25lX2Nvb2tpZTsKKworICAgICAgICAvLyB0aGUgZG9tYWluIHNob3VsZCBiZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiBvdXIgY29va2llIGRvbWFpbgorICAgICAgICBkb21haW5fb2Zmc2V0ID0gc3RybGVuKGRvbWFpbikgLSBzdHJsZW4oY2RvbWFpbik7CisgICAgICAgIGlmIChkb21haW5fb2Zmc2V0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZG9uZV9jb29raWU7CisKKyAgICAgICAgLy8gbWF0Y2ggdGhlIGNvb2tpZSBkb21haW4KKyAgICAgICAgaWYgKGF2X3N0cmNhc2VjbXAoJmRvbWFpbltkb21haW5fb2Zmc2V0XSwgY2RvbWFpbikpCisgICAgICAgICAgICBnb3RvIGRvbmVfY29va2llOworCisgICAgICAgIC8vIGNvb2tpZSBwYXJhbWV0ZXJzIG1hdGNoLCBzbyBjb3B5IHRoZSB2YWx1ZQorICAgICAgICBpZiAoISpjb29raWVzKSB7CisgICAgICAgICAgICBpZiAoISgqY29va2llcyA9IGF2X3N0cmR1cChjdmFsdWUpKSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmVfY29va2llOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciAqdG1wID0gKmNvb2tpZXM7CisgICAgICAgICAgICBzaXplX3Qgc3RyX3NpemUgPSBzdHJsZW4oY3ZhbHVlKSArIHN0cmxlbigqY29va2llcykgKyAzOworICAgICAgICAgICAgaWYgKCEoKmNvb2tpZXMgPSBhdl9tYWxsb2Moc3RyX3NpemUpKSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmVfY29va2llOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc25wcmludGYoKmNvb2tpZXMsIHN0cl9zaXplLCAiJXM7ICVzIiwgdG1wLCBjdmFsdWUpOworICAgICAgICAgICAgYXZfZnJlZSh0bXApOworICAgICAgICB9CisKKyAgICAgICAgZG9uZV9jb29raWU6CisgICAgICAgIGF2X2ZyZWUoY2RvbWFpbik7CisgICAgICAgIGF2X2ZyZWUoY3BhdGgpOworICAgICAgICBhdl9mcmVlKGN2YWx1ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAoKmNvb2tpZXMpIGF2X2ZyZWVwKGNvb2tpZXMpOworICAgICAgICAgICAgYXZfZnJlZShjc2V0X2Nvb2tpZXMpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2ZyZWUoY3NldF9jb29raWVzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBoYXNfaGVhZGVyKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqaGVhZGVyKQoreworICAgIC8qIGhlYWRlciArIDIgdG8gc2tpcCBvdmVyIENSTEYgcHJlZml4LiAobWFrZSBzdXJlIHlvdSBoYXZlIG9uZSEpICovCisgICAgaWYgKCFzdHIpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBhdl9zdHJpc3RhcnQoc3RyLCBoZWFkZXIgKyAyLCBOVUxMKSB8fCBhdl9zdHJpc3RyKHN0ciwgaGVhZGVyKTsKK30KKworc3RhdGljIGludCBodHRwX3JlYWRfaGVhZGVyKFVSTENvbnRleHQgKmgsIGludCAqbmV3X2xvY2F0aW9uKQoreworICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGNoYXIgbGluZVtNQVhfVVJMX1NJWkVdOworICAgIGludCBlcnIgPSAwOworCisgICAgcy0+Y2h1bmtzaXplID0gLTE7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICgoZXJyID0gaHR0cF9nZXRfbGluZShzLCBsaW5lLCBzaXplb2YobGluZSkpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfREVCVUcsICJoZWFkZXI9JyVzJ1xuIiwgbGluZSk7CisKKyAgICAgICAgZXJyID0gcHJvY2Vzc19saW5lKGgsIGxpbmUsIHMtPmxpbmVfY291bnQsIG5ld19sb2NhdGlvbik7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKGVyciA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHMtPmxpbmVfY291bnQrKzsKKyAgICB9CisKKyAgICBpZiAocy0+c2Vla2FibGUgPT0gLTEgJiYgcy0+aXNfbWVkaWFnYXRld2F5ICYmIHMtPmZpbGVzaXplID09IDIwMDAwMDAwMDApCisgICAgICAgIGgtPmlzX3N0cmVhbWVkID0gMTsgLyogd2UgY2FuIGluIGZhY3QgX25vdF8gc2VlayAqLworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBodHRwX2Nvbm5lY3QoVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbG9jYWxfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3RzdHIsIGNvbnN0IGNoYXIgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm94eWF1dGgsIGludCAqbmV3X2xvY2F0aW9uKQoreworICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGludCBwb3N0LCBlcnI7CisgICAgY2hhciBoZWFkZXJzW0hUVFBfSEVBREVSU19TSVpFXSA9ICIiOworICAgIGNoYXIgKmF1dGhzdHIgPSBOVUxMLCAqcHJveHlhdXRoc3RyID0gTlVMTDsKKyAgICBpbnQ2NF90IG9mZiA9IHMtPm9mZjsKKyAgICBpbnQgbGVuID0gMDsKKyAgICBjb25zdCBjaGFyICptZXRob2Q7CisgICAgaW50IHNlbmRfZXhwZWN0XzEwMCA9IDA7CisKKyAgICAvKiBzZW5kIGh0dHAgaGVhZGVyICovCisgICAgcG9zdCA9IGgtPmZsYWdzICYgQVZJT19GTEFHX1dSSVRFOworCisgICAgaWYgKHMtPnBvc3RfZGF0YSkgeworICAgICAgICAvKiBmb3JjZSBQT1NUIG1ldGhvZCBhbmQgZGlzYWJsZSBjaHVua2VkIGVuY29kaW5nIHdoZW4KKyAgICAgICAgICogY3VzdG9tIEhUVFAgcG9zdCBkYXRhIGlzIHNldCAqLworICAgICAgICBwb3N0ICAgICAgICAgICAgPSAxOworICAgICAgICBzLT5jaHVua2VkX3Bvc3QgPSAwOworICAgIH0KKworICAgIGlmIChzLT5tZXRob2QpCisgICAgICAgIG1ldGhvZCA9IHMtPm1ldGhvZDsKKyAgICBlbHNlCisgICAgICAgIG1ldGhvZCA9IHBvc3QgPyAiUE9TVCIgOiAiR0VUIjsKKworICAgIGF1dGhzdHIgICAgICA9IGZmX2h0dHBfYXV0aF9jcmVhdGVfcmVzcG9uc2UoJnMtPmF1dGhfc3RhdGUsIGF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wYXRoLCBtZXRob2QpOworICAgIHByb3h5YXV0aHN0ciA9IGZmX2h0dHBfYXV0aF9jcmVhdGVfcmVzcG9uc2UoJnMtPnByb3h5X2F1dGhfc3RhdGUsIHByb3h5YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BhdGgsIG1ldGhvZCk7CisgICAgaWYgKHBvc3QgJiYgIXMtPnBvc3RfZGF0YSkgeworICAgICAgICBzZW5kX2V4cGVjdF8xMDAgPSBzLT5zZW5kX2V4cGVjdF8xMDA7CisgICAgICAgIC8qIFRoZSB1c2VyIGhhcyBzdXBwbGllZCBhdXRoZW50aWNhdGlvbiBidXQgd2UgZG9uJ3Qga25vdyB0aGUgYXV0aCB0eXBlLAorICAgICAgICAgKiBzZW5kIEV4cGVjdDogMTAwLWNvbnRpbnVlIHRvIGdldCB0aGUgNDAxIHJlc3BvbnNlIGluY2x1ZGluZyB0aGUKKyAgICAgICAgICogV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXIsIG9yIGFuIDEwMCBjb250aW51ZSBpZiBubyBhdXRoIGFjdHVhbGx5CisgICAgICAgICAqIGlzIG5lZWRlZC4gKi8KKyAgICAgICAgaWYgKGF1dGggJiYgKmF1dGggJiYKKyAgICAgICAgICAgIHMtPmF1dGhfc3RhdGUuYXV0aF90eXBlID09IEhUVFBfQVVUSF9OT05FICYmCisgICAgICAgICAgICBzLT5odHRwX2NvZGUgIT0gNDAxKQorICAgICAgICAgICAgc2VuZF9leHBlY3RfMTAwID0gMTsKKyAgICB9CisKKyAgICAvKiBzZXQgZGVmYXVsdCBoZWFkZXJzIGlmIG5lZWRlZCAqLworICAgIGlmICghaGFzX2hlYWRlcihzLT5oZWFkZXJzLCAiXHJcblVzZXItQWdlbnQ6ICIpKQorICAgICAgICBsZW4gKz0gYXZfc3RybGNhdGYoaGVhZGVycyArIGxlbiwgc2l6ZW9mKGhlYWRlcnMpIC0gbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXItQWdlbnQ6ICVzXHJcbiIsIHMtPnVzZXJfYWdlbnQpOworICAgIGlmICghaGFzX2hlYWRlcihzLT5oZWFkZXJzLCAiXHJcbkFjY2VwdDogIikpCisgICAgICAgIGxlbiArPSBhdl9zdHJsY3B5KGhlYWRlcnMgKyBsZW4sICJBY2NlcHQ6ICovKlxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGVhZGVycykgLSBsZW4pOworICAgIC8vIE5vdGU6IHdlIHNlbmQgdGhpcyBvbiBwdXJwb3NlIGV2ZW4gd2hlbiBzLT5vZmYgaXMgMCB3aGVuIHdlJ3JlIHByb2JpbmcsCisgICAgLy8gc2luY2UgaXQgYWxsb3dzIHVzIHRvIGRldGVjdCBtb3JlIHJlbGlhYmx5IGlmIGEgKG5vbi1jb25mb3JtaW5nKQorICAgIC8vIHNlcnZlciBzdXBwb3J0cyBzZWVraW5nIGJ5IGFuYWx5c2luZyB0aGUgcmVwbHkgaGVhZGVycy4KKyAgICBpZiAoIWhhc19oZWFkZXIocy0+aGVhZGVycywgIlxyXG5SYW5nZTogIikgJiYgIXBvc3QgJiYgKHMtPm9mZiA+IDAgfHwgcy0+ZW5kX29mZiB8fCBzLT5zZWVrYWJsZSA9PSAtMSkpIHsKKyAgICAgICAgbGVuICs9IGF2X3N0cmxjYXRmKGhlYWRlcnMgKyBsZW4sIHNpemVvZihoZWFkZXJzKSAtIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYW5nZTogYnl0ZXM9JSJQUklkNjQiLSIsIHMtPm9mZik7CisgICAgICAgIGlmIChzLT5lbmRfb2ZmKQorICAgICAgICAgICAgbGVuICs9IGF2X3N0cmxjYXRmKGhlYWRlcnMgKyBsZW4sIHNpemVvZihoZWFkZXJzKSAtIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSJQUklkNjQsIHMtPmVuZF9vZmYgLSAxKTsKKyAgICAgICAgbGVuICs9IGF2X3N0cmxjcHkoaGVhZGVycyArIGxlbiwgIlxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGVhZGVycykgLSBsZW4pOworICAgIH0KKyAgICBpZiAoc2VuZF9leHBlY3RfMTAwICYmICFoYXNfaGVhZGVyKHMtPmhlYWRlcnMsICJcclxuRXhwZWN0OiAiKSkKKyAgICAgICAgbGVuICs9IGF2X3N0cmxjYXRmKGhlYWRlcnMgKyBsZW4sIHNpemVvZihoZWFkZXJzKSAtIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3Q6IDEwMC1jb250aW51ZVxyXG4iKTsKKworICAgIGlmICghaGFzX2hlYWRlcihzLT5oZWFkZXJzLCAiXHJcbkNvbm5lY3Rpb246ICIpKSB7CisgICAgICAgIGlmIChzLT5tdWx0aXBsZV9yZXF1ZXN0cykKKyAgICAgICAgICAgIGxlbiArPSBhdl9zdHJsY3B5KGhlYWRlcnMgKyBsZW4sICJDb25uZWN0aW9uOiBrZWVwLWFsaXZlXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGVhZGVycykgLSBsZW4pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsZW4gKz0gYXZfc3RybGNweShoZWFkZXJzICsgbGVuLCAiQ29ubmVjdGlvbjogY2xvc2VcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXJzKSAtIGxlbik7CisgICAgfQorCisgICAgaWYgKCFoYXNfaGVhZGVyKHMtPmhlYWRlcnMsICJcclxuSG9zdDogIikpCisgICAgICAgIGxlbiArPSBhdl9zdHJsY2F0ZihoZWFkZXJzICsgbGVuLCBzaXplb2YoaGVhZGVycykgLSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9zdDogJXNcclxuIiwgaG9zdHN0cik7CisgICAgaWYgKCFoYXNfaGVhZGVyKHMtPmhlYWRlcnMsICJcclxuQ29udGVudC1MZW5ndGg6ICIpICYmIHMtPnBvc3RfZGF0YSkKKyAgICAgICAgbGVuICs9IGF2X3N0cmxjYXRmKGhlYWRlcnMgKyBsZW4sIHNpemVvZihoZWFkZXJzKSAtIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogJWRcclxuIiwgcy0+cG9zdF9kYXRhbGVuKTsKKworICAgIGlmICghaGFzX2hlYWRlcihzLT5oZWFkZXJzLCAiXHJcbkNvbnRlbnQtVHlwZTogIikgJiYgcy0+Y29udGVudF90eXBlKQorICAgICAgICBsZW4gKz0gYXZfc3RybGNhdGYoaGVhZGVycyArIGxlbiwgc2l6ZW9mKGhlYWRlcnMpIC0gbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogJXNcclxuIiwgcy0+Y29udGVudF90eXBlKTsKKyAgICBpZiAoIWhhc19oZWFkZXIocy0+aGVhZGVycywgIlxyXG5Db29raWU6ICIpICYmIHMtPmNvb2tpZXMpIHsKKyAgICAgICAgY2hhciAqY29va2llcyA9IE5VTEw7CisgICAgICAgIGlmICghZ2V0X2Nvb2tpZXMocywgJmNvb2tpZXMsIHBhdGgsIGhvc3RzdHIpICYmIGNvb2tpZXMpIHsKKyAgICAgICAgICAgIGxlbiArPSBhdl9zdHJsY2F0ZihoZWFkZXJzICsgbGVuLCBzaXplb2YoaGVhZGVycykgLSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvb2tpZTogJXNcclxuIiwgY29va2llcyk7CisgICAgICAgICAgICBhdl9mcmVlKGNvb2tpZXMpOworICAgICAgICB9CisgICAgfQorICAgIGlmICghaGFzX2hlYWRlcihzLT5oZWFkZXJzLCAiXHJcbkljeS1NZXRhRGF0YTogIikgJiYgcy0+aWN5KQorICAgICAgICBsZW4gKz0gYXZfc3RybGNhdGYoaGVhZGVycyArIGxlbiwgc2l6ZW9mKGhlYWRlcnMpIC0gbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkljeS1NZXRhRGF0YTogJWRcclxuIiwgMSk7CisKKyAgICAvKiBub3cgYWRkIGluIGN1c3RvbSBoZWFkZXJzICovCisgICAgaWYgKHMtPmhlYWRlcnMpCisgICAgICAgIGF2X3N0cmxjcHkoaGVhZGVycyArIGxlbiwgcy0+aGVhZGVycywgc2l6ZW9mKGhlYWRlcnMpIC0gbGVuKTsKKworICAgIHNucHJpbnRmKHMtPmJ1ZmZlciwgc2l6ZW9mKHMtPmJ1ZmZlciksCisgICAgICAgICAgICAgIiVzICVzIEhUVFAvMS4xXHJcbiIKKyAgICAgICAgICAgICAiJXMiCisgICAgICAgICAgICAgIiVzIgorICAgICAgICAgICAgICIlcyIKKyAgICAgICAgICAgICAiJXMlcyIKKyAgICAgICAgICAgICAiXHJcbiIsCisgICAgICAgICAgICAgbWV0aG9kLAorICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgcG9zdCAmJiBzLT5jaHVua2VkX3Bvc3QgPyAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcclxuIiA6ICIiLAorICAgICAgICAgICAgIGhlYWRlcnMsCisgICAgICAgICAgICAgYXV0aHN0ciA/IGF1dGhzdHIgOiAiIiwKKyAgICAgICAgICAgICBwcm94eWF1dGhzdHIgPyAiUHJveHktIiA6ICIiLCBwcm94eWF1dGhzdHIgPyBwcm94eWF1dGhzdHIgOiAiIik7CisKKyAgICBhdl9sb2coaCwgQVZfTE9HX0RFQlVHLCAicmVxdWVzdDogJXNcbiIsIHMtPmJ1ZmZlcik7CisKKyAgICBpZiAoKGVyciA9IGZmdXJsX3dyaXRlKHMtPmhkLCBzLT5idWZmZXIsIHN0cmxlbihzLT5idWZmZXIpKSkgPCAwKQorICAgICAgICBnb3RvIGRvbmU7CisKKyAgICBpZiAocy0+cG9zdF9kYXRhKQorICAgICAgICBpZiAoKGVyciA9IGZmdXJsX3dyaXRlKHMtPmhkLCBzLT5wb3N0X2RhdGEsIHMtPnBvc3RfZGF0YWxlbikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgIC8qIGluaXQgaW5wdXQgYnVmZmVyICovCisgICAgcy0+YnVmX3B0ciAgICAgICAgICA9IHMtPmJ1ZmZlcjsKKyAgICBzLT5idWZfZW5kICAgICAgICAgID0gcy0+YnVmZmVyOworICAgIHMtPmxpbmVfY291bnQgICAgICAgPSAwOworICAgIHMtPm9mZiAgICAgICAgICAgICAgPSAwOworICAgIHMtPmljeV9kYXRhX3JlYWQgICAgPSAwOworICAgIHMtPmZpbGVzaXplICAgICAgICAgPSAtMTsKKyAgICBzLT53aWxsY2xvc2UgICAgICAgID0gMDsKKyAgICBzLT5lbmRfY2h1bmtlZF9wb3N0ID0gMDsKKyAgICBzLT5lbmRfaGVhZGVyICAgICAgID0gMDsKKyAgICBpZiAocG9zdCAmJiAhcy0+cG9zdF9kYXRhICYmICFzZW5kX2V4cGVjdF8xMDApIHsKKyAgICAgICAgLyogUHJldGVuZCB0aGF0IGl0IGRpZCB3b3JrLiBXZSBkaWRuJ3QgcmVhZCBhbnkgaGVhZGVyIHlldCwgc2luY2UKKyAgICAgICAgICogd2UndmUgc3RpbGwgdG8gc2VuZCB0aGUgUE9TVCBkYXRhLCBidXQgdGhlIGNvZGUgY2FsbGluZyB0aGlzCisgICAgICAgICAqIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaHR0cF9jb2RlIGFmdGVyIHdlIHJldHVybi4gKi8KKyAgICAgICAgcy0+aHR0cF9jb2RlID0gMjAwOworICAgICAgICBlcnIgPSAwOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgLyogd2FpdCBmb3IgaGVhZGVyICovCisgICAgZXJyID0gaHR0cF9yZWFkX2hlYWRlcihoLCBuZXdfbG9jYXRpb24pOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGRvbmU7CisKKyAgICBlcnIgPSAob2ZmID09IHMtPm9mZikgPyAwIDogLTE7Citkb25lOgorICAgIGF2X2ZyZWVwKCZhdXRoc3RyKTsKKyAgICBhdl9mcmVlcCgmcHJveHlhdXRoc3RyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGh0dHBfYnVmX3JlYWQoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBIVFRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgbGVuOworICAgIC8qIHJlYWQgYnl0ZXMgZnJvbSBpbnB1dCBidWZmZXIgZmlyc3QgKi8KKyAgICBsZW4gPSBzLT5idWZfZW5kIC0gcy0+YnVmX3B0cjsKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgICBpZiAobGVuID4gc2l6ZSkKKyAgICAgICAgICAgIGxlbiA9IHNpemU7CisgICAgICAgIG1lbWNweShidWYsIHMtPmJ1Zl9wdHIsIGxlbik7CisgICAgICAgIHMtPmJ1Zl9wdHIgKz0gbGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoIXMtPndpbGxjbG9zZSB8fCBzLT5jaHVua3NpemUgPCAwKSAmJgorICAgICAgICAgICAgcy0+ZmlsZXNpemUgPj0gMCAmJiBzLT5vZmYgPj0gcy0+ZmlsZXNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIGxlbiA9IGZmdXJsX3JlYWQocy0+aGQsIGJ1Ziwgc2l6ZSk7CisgICAgfQorICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIHMtPm9mZiArPSBsZW47CisgICAgICAgIGlmIChzLT5jaHVua3NpemUgPiAwKQorICAgICAgICAgICAgcy0+Y2h1bmtzaXplIC09IGxlbjsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworI2lmIENPTkZJR19aTElCCisjZGVmaW5lIERFQ09NUFJFU1NfQlVGX1NJWkUgKDI1NiAqIDEwMjQpCitzdGF0aWMgaW50IGh0dHBfYnVmX3JlYWRfY29tcHJlc3NlZChVUkxDb250ZXh0ICpoLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIXMtPmluZmxhdGVfYnVmZmVyKSB7CisgICAgICAgIHMtPmluZmxhdGVfYnVmZmVyID0gYXZfbWFsbG9jKERFQ09NUFJFU1NfQlVGX1NJWkUpOworICAgICAgICBpZiAoIXMtPmluZmxhdGVfYnVmZmVyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBpZiAocy0+aW5mbGF0ZV9zdHJlYW0uYXZhaWxfaW4gPT0gMCkgeworICAgICAgICBpbnQgcmVhZCA9IGh0dHBfYnVmX3JlYWQoaCwgcy0+aW5mbGF0ZV9idWZmZXIsIERFQ09NUFJFU1NfQlVGX1NJWkUpOworICAgICAgICBpZiAocmVhZCA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIHJlYWQ7CisgICAgICAgIHMtPmluZmxhdGVfc3RyZWFtLm5leHRfaW4gID0gcy0+aW5mbGF0ZV9idWZmZXI7CisgICAgICAgIHMtPmluZmxhdGVfc3RyZWFtLmF2YWlsX2luID0gcmVhZDsKKyAgICB9CisKKyAgICBzLT5pbmZsYXRlX3N0cmVhbS5hdmFpbF9vdXQgPSBzaXplOworICAgIHMtPmluZmxhdGVfc3RyZWFtLm5leHRfb3V0ICA9IGJ1ZjsKKworICAgIHJldCA9IGluZmxhdGUoJnMtPmluZmxhdGVfc3RyZWFtLCBaX1NZTkNfRkxVU0gpOworICAgIGlmIChyZXQgIT0gWl9PSyAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKQorICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICJpbmZsYXRlIHJldHVybiB2YWx1ZTogJWQsICVzXG4iLAorICAgICAgICAgICAgICAgcmV0LCBzLT5pbmZsYXRlX3N0cmVhbS5tc2cpOworCisgICAgcmV0dXJuIHNpemUgLSBzLT5pbmZsYXRlX3N0cmVhbS5hdmFpbF9vdXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1pMSUIgKi8KKworc3RhdGljIGludCBodHRwX3JlYWRfc3RyZWFtKFVSTENvbnRleHQgKmgsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgSFRUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IGVyciwgbmV3X2xvY2F0aW9uOworCisgICAgaWYgKCFzLT5oZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgaWYgKHMtPmVuZF9jaHVua2VkX3Bvc3QgJiYgIXMtPmVuZF9oZWFkZXIpIHsKKyAgICAgICAgZXJyID0gaHR0cF9yZWFkX2hlYWRlcihoLCAmbmV3X2xvY2F0aW9uKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChzLT5jaHVua3NpemUgPj0gMCkgeworICAgICAgICBpZiAoIXMtPmNodW5rc2l6ZSkgeworICAgICAgICAgICAgY2hhciBsaW5lWzMyXTsKKworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBodHRwX2dldF9saW5lKHMsIGxpbmUsIHNpemVvZihsaW5lKSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoISpsaW5lKTsgICAgLyogc2tpcCBDUiBMRiBmcm9tIGxhc3QgY2h1bmsgKi8KKworICAgICAgICAgICAgICAgIHMtPmNodW5rc2l6ZSA9IHN0cnRvbGwobGluZSwgTlVMTCwgMTYpOworCisgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiQ2h1bmtlZCBlbmNvZGluZyBkYXRhIHNpemU6ICUiUFJJZDY0IidcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jaHVua3NpemUpOworCisgICAgICAgICAgICAgICAgaWYgKCFzLT5jaHVua3NpemUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNpemUgPSBGRk1JTihzaXplLCBzLT5jaHVua3NpemUpOworICAgIH0KKyNpZiBDT05GSUdfWkxJQgorICAgIGlmIChzLT5jb21wcmVzc2VkKQorICAgICAgICByZXR1cm4gaHR0cF9idWZfcmVhZF9jb21wcmVzc2VkKGgsIGJ1Ziwgc2l6ZSk7CisjZW5kaWYgLyogQ09ORklHX1pMSUIgKi8KKyAgICByZXR1cm4gaHR0cF9idWZfcmVhZChoLCBidWYsIHNpemUpOworfQorCisvLyBMaWtlIGh0dHBfcmVhZF9zdHJlYW0oKSwgYnV0IG5vIHNob3J0IHJlYWRzLgorLy8gQXNzdW1lcyBwYXJ0aWFsIHJlYWRzIGFyZSBhbiBlcnJvci4KK3N0YXRpYyBpbnQgaHR0cF9yZWFkX3N0cmVhbV9hbGwoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgcG9zID0gMDsKKyAgICB3aGlsZSAocG9zIDwgc2l6ZSkgeworICAgICAgICBpbnQgbGVuID0gaHR0cF9yZWFkX3N0cmVhbShoLCBidWYgKyBwb3MsIHNpemUgLSBwb3MpOworICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBsZW47CisgICAgICAgIHBvcyArPSBsZW47CisgICAgfQorICAgIHJldHVybiBwb3M7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9tZXRhZGF0YShIVFRQQ29udGV4dCAqcywgY2hhciAqZGF0YSkKK3sKKyAgICBjaGFyICprZXk7CisgICAgY2hhciAqdmFsOworICAgIGNoYXIgKmVuZDsKKyAgICBjaGFyICpuZXh0ID0gZGF0YTsKKworICAgIHdoaWxlICgqbmV4dCkgeworICAgICAgICBrZXkgPSBuZXh0OworICAgICAgICB2YWwgPSBzdHJzdHIoa2V5LCAiPSciKTsKKyAgICAgICAgaWYgKCF2YWwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZW5kID0gc3Ryc3RyKHZhbCwgIic7Iik7CisgICAgICAgIGlmICghZW5kKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgKnZhbCA9ICdcMCc7CisgICAgICAgICplbmQgPSAnXDAnOworICAgICAgICB2YWwgKz0gMjsKKworICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsIGtleSwgdmFsLCAwKTsKKworICAgICAgICBuZXh0ID0gZW5kICsgMjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfaWN5KFVSTENvbnRleHQgKmgsIGludCBzaXplKQoreworICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIC8qIHVudGlsIG5leHQgbWV0YWRhdGEgcGFja2V0ICovCisgICAgaW50IHJlbWFpbmluZyA9IHMtPmljeV9tZXRhaW50IC0gcy0+aWN5X2RhdGFfcmVhZDsKKworICAgIGlmIChyZW1haW5pbmcgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICghcmVtYWluaW5nKSB7CisgICAgICAgIC8qIFRoZSBtZXRhZGF0YSBwYWNrZXQgaXMgdmFyaWFibGUgc2l6ZWQuIEl0IGhhcyBhIDEgYnl0ZSBoZWFkZXIKKyAgICAgICAgICogd2hpY2ggc2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgKGRpdmlkZWQgYnkgMTYpLiBJZiBpdCdzIDAsCisgICAgICAgICAqIHRoZSBtZXRhZGF0YSBkb2Vzbid0IGNoYW5nZS4gQWZ0ZXIgdGhlIHBhY2tldCwgaWN5X21ldGFpbnQgYnl0ZXMKKyAgICAgICAgICogb2Ygbm9ybWFsIGRhdGEgZm9sbG93cy4gKi8KKyAgICAgICAgdWludDhfdCBjaDsKKyAgICAgICAgaW50IGxlbiA9IGh0dHBfcmVhZF9zdHJlYW1fYWxsKGgsICZjaCwgMSk7CisgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgaWYgKGNoID4gMCkgeworICAgICAgICAgICAgY2hhciBkYXRhWzI1NSAqIDE2ICsgMV07CisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgbGVuID0gY2ggKiAxNjsKKyAgICAgICAgICAgIHJldCA9IGh0dHBfcmVhZF9zdHJlYW1fYWxsKGgsIGRhdGEsIGxlbik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgZGF0YVtsZW4gKyAxXSA9IDA7CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X29wdF9zZXQocywgImljeV9tZXRhZGF0YV9wYWNrZXQiLCBkYXRhLCAwKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB1cGRhdGVfbWV0YWRhdGEocywgZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgcy0+aWN5X2RhdGFfcmVhZCA9IDA7CisgICAgICAgIHJlbWFpbmluZyAgICAgICAgPSBzLT5pY3lfbWV0YWludDsKKyAgICB9CisKKyAgICByZXR1cm4gRkZNSU4oc2l6ZSwgcmVtYWluaW5nKTsKK30KKworc3RhdGljIGludCBodHRwX3JlYWQoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBIVFRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKworICAgIGlmIChzLT5pY3lfbWV0YWludCA+IDApIHsKKyAgICAgICAgc2l6ZSA9IHN0b3JlX2ljeShoLCBzaXplKTsKKyAgICAgICAgaWYgKHNpemUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgc2l6ZSA9IGh0dHBfcmVhZF9zdHJlYW0oaCwgYnVmLCBzaXplKTsKKyAgICBpZiAoc2l6ZSA+IDApCisgICAgICAgIHMtPmljeV9kYXRhX3JlYWQgKz0gc2l6ZTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworLyogdXNlZCBvbmx5IHdoZW4gcG9zdGluZyBkYXRhICovCitzdGF0aWMgaW50IGh0dHBfd3JpdGUoVVJMQ29udGV4dCAqaCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBjaGFyIHRlbXBbMTFdID0gIiI7ICAvKiAzMi1iaXQgaGV4ICsgQ1JMRiArIG51bCAqLworICAgIGludCByZXQ7CisgICAgY2hhciBjcmxmW10gPSAiXHJcbiI7CisgICAgSFRUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisKKyAgICBpZiAoIXMtPmNodW5rZWRfcG9zdCkgeworICAgICAgICAvKiBub24tY2h1bmtlZCBkYXRhIGlzIHNlbnQgd2l0aG91dCBhbnkgc3BlY2lhbCBlbmNvZGluZyAqLworICAgICAgICByZXR1cm4gZmZ1cmxfd3JpdGUocy0+aGQsIGJ1Ziwgc2l6ZSk7CisgICAgfQorCisgICAgLyogc2lsZW50bHkgaWdub3JlIHplcm8tc2l6ZSBkYXRhIHNpbmNlIGNodW5rIGVuY29kaW5nIHRoYXQgd291bGQKKyAgICAgKiBzaWduYWwgRU9GICovCisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIC8qIHVwbG9hZCBkYXRhIHVzaW5nIGNodW5rZWQgZW5jb2RpbmcgKi8KKyAgICAgICAgc25wcmludGYodGVtcCwgc2l6ZW9mKHRlbXApLCAiJXhcclxuIiwgc2l6ZSk7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZnVybF93cml0ZShzLT5oZCwgdGVtcCwgc3RybGVuKHRlbXApKSkgPCAwIHx8CisgICAgICAgICAgICAocmV0ID0gZmZ1cmxfd3JpdGUocy0+aGQsIGJ1Ziwgc2l6ZSkpIDwgMCAgICAgICAgICB8fAorICAgICAgICAgICAgKHJldCA9IGZmdXJsX3dyaXRlKHMtPmhkLCBjcmxmLCBzaXplb2YoY3JsZikgLSAxKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9zaHV0ZG93bihVUkxDb250ZXh0ICpoLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgY2hhciBmb290ZXJbXSA9ICIwXHJcblxyXG4iOworICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworCisgICAgLyogc2lnbmFsIGVuZCBvZiBjaHVua2VkIGVuY29kaW5nIGlmIHVzZWQgKi8KKyAgICBpZiAoKGZsYWdzICYgQVZJT19GTEFHX1dSSVRFKSAmJiBzLT5jaHVua2VkX3Bvc3QpIHsKKyAgICAgICAgcmV0ID0gZmZ1cmxfd3JpdGUocy0+aGQsIGZvb3Rlciwgc2l6ZW9mKGZvb3RlcikgLSAxKTsKKyAgICAgICAgcmV0ID0gcmV0ID4gMCA/IDAgOiByZXQ7CisgICAgICAgIHMtPmVuZF9jaHVua2VkX3Bvc3QgPSAxOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIGludCByZXQgPSAwOworICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworCisjaWYgQ09ORklHX1pMSUIKKyAgICBpbmZsYXRlRW5kKCZzLT5pbmZsYXRlX3N0cmVhbSk7CisgICAgYXZfZnJlZXAoJnMtPmluZmxhdGVfYnVmZmVyKTsKKyNlbmRpZiAvKiBDT05GSUdfWkxJQiAqLworCisgICAgaWYgKCFzLT5lbmRfY2h1bmtlZF9wb3N0KQorICAgICAgICAvKiBDbG9zZSB0aGUgd3JpdGUgZGlyZWN0aW9uIGJ5IHNlbmRpbmcgdGhlIGVuZCBvZiBjaHVua2VkIGVuY29kaW5nLiAqLworICAgICAgICByZXQgPSBodHRwX3NodXRkb3duKGgsIGgtPmZsYWdzKTsKKworICAgIGlmIChzLT5oZCkKKyAgICAgICAgZmZ1cmxfY2xvc2VwKCZzLT5oZCk7CisgICAgYXZfZGljdF9mcmVlKCZzLT5jaGFpbmVkX29wdGlvbnMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGh0dHBfc2VlayhVUkxDb250ZXh0ICpoLCBpbnQ2NF90IG9mZiwgaW50IHdoZW5jZSkKK3sKKyAgICBIVFRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBVUkxDb250ZXh0ICpvbGRfaGQgPSBzLT5oZDsKKyAgICBpbnQ2NF90IG9sZF9vZmYgPSBzLT5vZmY7CisgICAgdWludDhfdCBvbGRfYnVmW0JVRkZFUl9TSVpFXTsKKyAgICBpbnQgb2xkX2J1Zl9zaXplLCByZXQ7CisgICAgQVZEaWN0aW9uYXJ5ICpvcHRpb25zID0gTlVMTDsKKworICAgIGlmICh3aGVuY2UgPT0gQVZTRUVLX1NJWkUpCisgICAgICAgIHJldHVybiBzLT5maWxlc2l6ZTsKKyAgICBlbHNlIGlmICgod2hlbmNlID09IFNFRUtfQ1VSICYmIG9mZiA9PSAwKSB8fAorICAgICAgICAgICAgICh3aGVuY2UgPT0gU0VFS19TRVQgJiYgb2ZmID09IHMtPm9mZikpCisgICAgICAgIHJldHVybiBzLT5vZmY7CisgICAgZWxzZSBpZiAoKHMtPmZpbGVzaXplID09IC0xICYmIHdoZW5jZSA9PSBTRUVLX0VORCkgfHwgaC0+aXNfc3RyZWFtZWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisKKyAgICBpZiAod2hlbmNlID09IFNFRUtfQ1VSKQorICAgICAgICBvZmYgKz0gcy0+b2ZmOworICAgIGVsc2UgaWYgKHdoZW5jZSA9PSBTRUVLX0VORCkKKyAgICAgICAgb2ZmICs9IHMtPmZpbGVzaXplOworICAgIGVsc2UgaWYgKHdoZW5jZSAhPSBTRUVLX1NFVCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBzLT5vZmYgPSBvZmY7CisKKyAgICAvKiB3ZSBzYXZlIHRoZSBvbGQgY29udGV4dCBpbiBjYXNlIHRoZSBzZWVrIGZhaWxzICovCisgICAgb2xkX2J1Zl9zaXplID0gcy0+YnVmX2VuZCAtIHMtPmJ1Zl9wdHI7CisgICAgbWVtY3B5KG9sZF9idWYsIHMtPmJ1Zl9wdHIsIG9sZF9idWZfc2l6ZSk7CisgICAgcy0+aGQgPSBOVUxMOworCisgICAgLyogaWYgaXQgZmFpbHMsIGNvbnRpbnVlIG9uIG9sZCBjb25uZWN0aW9uICovCisgICAgaWYgKChyZXQgPSBodHRwX29wZW5fY254KGgsICZvcHRpb25zKSkgPCAwKSB7CisgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0aW9ucyk7CisgICAgICAgIG1lbWNweShzLT5idWZmZXIsIG9sZF9idWYsIG9sZF9idWZfc2l6ZSk7CisgICAgICAgIHMtPmJ1Zl9wdHIgPSBzLT5idWZmZXI7CisgICAgICAgIHMtPmJ1Zl9lbmQgPSBzLT5idWZmZXIgKyBvbGRfYnVmX3NpemU7CisgICAgICAgIHMtPmhkICAgICAgPSBvbGRfaGQ7CisgICAgICAgIHMtPm9mZiAgICAgPSBvbGRfb2ZmOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOworICAgIGZmdXJsX2Nsb3NlKG9sZF9oZCk7CisgICAgcmV0dXJuIG9mZjsKK30KKworc3RhdGljIGludCBodHRwX2dldF9maWxlX2hhbmRsZShVUkxDb250ZXh0ICpoKQoreworICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZnVybF9nZXRfZmlsZV9oYW5kbGUocy0+aGQpOworfQorCisjZGVmaW5lIEhUVFBfQ0xBU1MoZmxhdm9yKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IEFWQ2xhc3MgZmxhdm9yICMjIF9jb250ZXh0X2NsYXNzID0geyAgIFwKKyAgICAuY2xhc3NfbmFtZSA9ICMgZmxhdm9yLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwgICAgICAgICAgICAgXAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwgICAgICAgICAgICBcCit9CisKKyNpZiBDT05GSUdfSFRUUF9QUk9UT0NPTAorSFRUUF9DTEFTUyhodHRwKTsKKworVVJMUHJvdG9jb2wgZmZfaHR0cF9wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJodHRwIiwKKyAgICAudXJsX29wZW4yICAgICAgICAgICA9IGh0dHBfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgICAgICA9IGh0dHBfcmVhZCwKKyAgICAudXJsX3dyaXRlICAgICAgICAgICA9IGh0dHBfd3JpdGUsCisgICAgLnVybF9zZWVrICAgICAgICAgICAgPSBodHRwX3NlZWssCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgPSBodHRwX2Nsb3NlLAorICAgIC51cmxfZ2V0X2ZpbGVfaGFuZGxlID0gaHR0cF9nZXRfZmlsZV9oYW5kbGUsCisgICAgLnVybF9zaHV0ZG93biAgICAgICAgPSBodHRwX3NodXRkb3duLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKEhUVFBDb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX2NsYXNzICAgICA9ICZodHRwX2NvbnRleHRfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfSFRUUF9QUk9UT0NPTCAqLworCisjaWYgQ09ORklHX0hUVFBTX1BST1RPQ09MCitIVFRQX0NMQVNTKGh0dHBzKTsKKworVVJMUHJvdG9jb2wgZmZfaHR0cHNfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAiaHR0cHMiLAorICAgIC51cmxfb3BlbjIgICAgICAgICAgID0gaHR0cF9vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gaHR0cF9yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICAgICAgID0gaHR0cF93cml0ZSwKKyAgICAudXJsX3NlZWsgICAgICAgICAgICA9IGh0dHBfc2VlaywKKyAgICAudXJsX2Nsb3NlICAgICAgICAgICA9IGh0dHBfY2xvc2UsCisgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgPSBodHRwX2dldF9maWxlX2hhbmRsZSwKKyAgICAudXJsX3NodXRkb3duICAgICAgICA9IGh0dHBfc2h1dGRvd24sCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgPSBzaXplb2YoSFRUUENvbnRleHQpLAorICAgIC5wcml2X2RhdGFfY2xhc3MgICAgID0gJmh0dHBzX2NvbnRleHRfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfSFRUUFNfUFJPVE9DT0wgKi8KKworI2lmIENPTkZJR19IVFRQUFJPWFlfUFJPVE9DT0wKK3N0YXRpYyBpbnQgaHR0cF9wcm94eV9jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGlmIChzLT5oZCkKKyAgICAgICAgZmZ1cmxfY2xvc2VwKCZzLT5oZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9wcm94eV9vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzKQoreworICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGNoYXIgaG9zdG5hbWVbMTAyNF0sIGhvc3RzdHJbMTAyNF07CisgICAgY2hhciBhdXRoWzEwMjRdLCBwYXRoYnVmWzEwMjRdLCAqcGF0aDsKKyAgICBjaGFyIGxvd2VyX3VybFsxMDBdOworICAgIGludCBwb3J0LCByZXQgPSAwLCBhdHRlbXB0cyA9IDA7CisgICAgSFRUUEF1dGhUeXBlIGN1cl9hdXRoX3R5cGU7CisgICAgY2hhciAqYXV0aHN0cjsKKyAgICBpbnQgbmV3X2xvYzsKKworICAgIGlmKCBzLT5zZWVrYWJsZSA9PSAxICkKKyAgICAgICAgaC0+aXNfc3RyZWFtZWQgPSAwOworICAgIGVsc2UKKyAgICAgICAgaC0+aXNfc3RyZWFtZWQgPSAxOworCisgICAgYXZfdXJsX3NwbGl0KE5VTEwsIDAsIGF1dGgsIHNpemVvZihhdXRoKSwgaG9zdG5hbWUsIHNpemVvZihob3N0bmFtZSksICZwb3J0LAorICAgICAgICAgICAgICAgICBwYXRoYnVmLCBzaXplb2YocGF0aGJ1ZiksIHVyaSk7CisgICAgZmZfdXJsX2pvaW4oaG9zdHN0ciwgc2l6ZW9mKGhvc3RzdHIpLCBOVUxMLCBOVUxMLCBob3N0bmFtZSwgcG9ydCwgTlVMTCk7CisgICAgcGF0aCA9IHBhdGhidWY7CisgICAgaWYgKCpwYXRoID09ICcvJykKKyAgICAgICAgcGF0aCsrOworCisgICAgZmZfdXJsX2pvaW4obG93ZXJfdXJsLCBzaXplb2YobG93ZXJfdXJsKSwgInRjcCIsIE5VTEwsIGhvc3RuYW1lLCBwb3J0LAorICAgICAgICAgICAgICAgIE5VTEwpOworcmVkbzoKKyAgICByZXQgPSBmZnVybF9vcGVuKCZzLT5oZCwgbG93ZXJfdXJsLCBBVklPX0ZMQUdfUkVBRF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXV0aHN0ciA9IGZmX2h0dHBfYXV0aF9jcmVhdGVfcmVzcG9uc2UoJnMtPnByb3h5X2F1dGhfc3RhdGUsIGF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgIkNPTk5FQ1QiKTsKKyAgICBzbnByaW50ZihzLT5idWZmZXIsIHNpemVvZihzLT5idWZmZXIpLAorICAgICAgICAgICAgICJDT05ORUNUICVzIEhUVFAvMS4xXHJcbiIKKyAgICAgICAgICAgICAiSG9zdDogJXNcclxuIgorICAgICAgICAgICAgICJDb25uZWN0aW9uOiBjbG9zZVxyXG4iCisgICAgICAgICAgICAgIiVzJXMiCisgICAgICAgICAgICAgIlxyXG4iLAorICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgaG9zdHN0ciwKKyAgICAgICAgICAgICBhdXRoc3RyID8gIlByb3h5LSIgOiAiIiwgYXV0aHN0ciA/IGF1dGhzdHIgOiAiIik7CisgICAgYXZfZnJlZXAoJmF1dGhzdHIpOworCisgICAgaWYgKChyZXQgPSBmZnVybF93cml0ZShzLT5oZCwgcy0+YnVmZmVyLCBzdHJsZW4ocy0+YnVmZmVyKSkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcy0+YnVmX3B0ciAgICA9IHMtPmJ1ZmZlcjsKKyAgICBzLT5idWZfZW5kICAgID0gcy0+YnVmZmVyOworICAgIHMtPmxpbmVfY291bnQgPSAwOworICAgIHMtPmZpbGVzaXplICAgPSAtMTsKKyAgICBjdXJfYXV0aF90eXBlID0gcy0+cHJveHlfYXV0aF9zdGF0ZS5hdXRoX3R5cGU7CisKKyAgICAvKiBOb3RlOiBUaGlzIHVzZXMgYnVmZmVyaW5nLCBwb3RlbnRpYWxseSByZWFkaW5nIG1vcmUgdGhhbiB0aGUKKyAgICAgKiBIVFRQIGhlYWRlci4gSWYgdHVubmVsaW5nIGEgcHJvdG9jb2wgd2hlcmUgdGhlIHNlcnZlciBzdGFydHMKKyAgICAgKiB0aGUgY29udmVyc2F0aW9uLCB3ZSBtaWdodCBidWZmZXIgcGFydCBvZiB0aGF0IGhlcmUsIHRvby4KKyAgICAgKiBSZWFkaW5nIHRoYXQgcmVxdWlyZXMgdXNpbmcgdGhlIHByb3BlciBmZnVybF9yZWFkKCkgZnVuY3Rpb24KKyAgICAgKiBvbiB0aGlzIFVSTENvbnRleHQsIG5vdCB1c2luZyB0aGUgZmQgZGlyZWN0bHkgKGFzIHRoZSB0bHMKKyAgICAgKiBwcm90b2NvbCBkb2VzKS4gVGhpcyBzaG91bGRuJ3QgYmUgYW4gaXNzdWUgZm9yIHRscyB0aG91Z2gsCisgICAgICogc2luY2UgdGhlIGNsaWVudCBzdGFydHMgdGhlIGNvbnZlcnNhdGlvbiB0aGVyZSwgc28gdGhlcmUKKyAgICAgKiBpcyBubyBleHRyYSBkYXRhIHRoYXQgd2UgbWlnaHQgYnVmZmVyIHVwIGhlcmUuCisgICAgICovCisgICAgcmV0ID0gaHR0cF9yZWFkX2hlYWRlcihoLCAmbmV3X2xvYyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGF0dGVtcHRzKys7CisgICAgaWYgKHMtPmh0dHBfY29kZSA9PSA0MDcgJiYKKyAgICAgICAgKGN1cl9hdXRoX3R5cGUgPT0gSFRUUF9BVVRIX05PTkUgfHwgcy0+cHJveHlfYXV0aF9zdGF0ZS5zdGFsZSkgJiYKKyAgICAgICAgcy0+cHJveHlfYXV0aF9zdGF0ZS5hdXRoX3R5cGUgIT0gSFRUUF9BVVRIX05PTkUgJiYgYXR0ZW1wdHMgPCAyKSB7CisgICAgICAgIGZmdXJsX2Nsb3NlcCgmcy0+aGQpOworICAgICAgICBnb3RvIHJlZG87CisgICAgfQorCisgICAgaWYgKHMtPmh0dHBfY29kZSA8IDQwMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0ID0gZmZfaHR0cF9hdmVycm9yKHMtPmh0dHBfY29kZSwgQVZFUlJPUihFSU8pKTsKKworZmFpbDoKKyAgICBodHRwX3Byb3h5X2Nsb3NlKGgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9wcm94eV93cml0ZShVUkxDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZnVybF93cml0ZShzLT5oZCwgYnVmLCBzaXplKTsKK30KKworVVJMUHJvdG9jb2wgZmZfaHR0cHByb3h5X3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgID0gImh0dHBwcm94eSIsCisgICAgLnVybF9vcGVuICAgICAgICAgICAgPSBodHRwX3Byb3h5X29wZW4sCisgICAgLnVybF9yZWFkICAgICAgICAgICAgPSBodHRwX2J1Zl9yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICAgICAgID0gaHR0cF9wcm94eV93cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgICAgICA9IGh0dHBfcHJveHlfY2xvc2UsCisgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgPSBodHRwX2dldF9maWxlX2hhbmRsZSwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICA9IHNpemVvZihIVFRQQ29udGV4dCksCisgICAgLmZsYWdzICAgICAgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfSFRUUFBST1hZX1BST1RPQ09MICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaHR0cC5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2h0dHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDAyNzEzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2h0dHAuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogSFRUUCBkZWZpbml0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDEwIEpvc2ggQWxsbWFubgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX0hUVFBfSAorI2RlZmluZSBBVkZPUk1BVF9IVFRQX0gKKworI2luY2x1ZGUgInVybC5oIgorCisjZGVmaW5lIEhUVFBfSEVBREVSU19TSVpFIDQwOTYKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBiYXNlZCBvbiBhbm90aGVyIEhUVFAgVVJMQ29udGV4dC4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJlLWluaXRpYWxpemUgdGhlIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMgaWYKKyAqIHRoZXkgYXJlIGtub3duIGJlZm9yZWhhbmQsIHRvIGF2b2lkIGhhdmluZyB0byBkbyBhbiBpbml0aWFsIGZhaWxpbmcKKyAqIHJlcXVlc3QganVzdCB0byBnZXQgdGhlIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIGRlc3QgVVJMIGNvbnRleHQgd2hvc2UgYXV0aGVudGljYXRpb24gc3RhdGUgZ2V0cyB1cGRhdGVkCisgKiBAcGFyYW0gc3JjIFVSTCBjb250ZXh0IHdob3NlIGF1dGhlbnRpY2F0aW9uIHN0YXRlIGdldHMgY29waWVkCisgKi8KK3ZvaWQgZmZfaHR0cF9pbml0X2F1dGhfc3RhdGUoVVJMQ29udGV4dCAqZGVzdCwgY29uc3QgVVJMQ29udGV4dCAqc3JjKTsKKworLyoqCisgKiBTZW5kIGEgbmV3IEhUVFAgcmVxdWVzdCwgcmV1c2luZyB0aGUgb2xkIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIGggcG9pbnRlciB0byB0aGUgcmVzb3VyY2UKKyAqIEBwYXJhbSB1cmkgdXJpIHVzZWQgdG8gcGVyZm9ybSB0aGUgcmVxdWVzdAorICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIGFuIGVycm9yIGNvbmRpdGlvbiBvY2N1cnJlZCwgMAorICogb3RoZXJ3aXNlCisgKi8KK2ludCBmZl9odHRwX2RvX25ld19yZXF1ZXN0KFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSk7CisKK2ludCBmZl9odHRwX2F2ZXJyb3IoaW50IHN0YXR1c19jb2RlLCBpbnQgZGVmYXVsdF9hdmVycm9yKTsKKworI2VuZGlmIC8qIEFWRk9STUFUX0hUVFBfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2h0dHBhdXRoLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvaHR0cGF1dGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmUzZWZmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2h0dHBhdXRoLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBIVFRQIGF1dGhlbnRpY2F0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImh0dHBhdXRoLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jhc2U2NC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhbmRvbV9zZWVkLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21kNS5oIgorI2luY2x1ZGUgInVybGRlY29kZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisKK3N0YXRpYyB2b2lkIGhhbmRsZV9iYXNpY19wYXJhbXMoSFRUUEF1dGhTdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9sZW4sIGNoYXIgKipkZXN0LCBpbnQgKmRlc3RfbGVuKQoreworICAgIGlmICghc3RybmNtcChrZXksICJyZWFsbT0iLCBrZXlfbGVuKSkgeworICAgICAgICAqZGVzdCAgICAgPSAgICAgICAgc3RhdGUtPnJlYWxtOworICAgICAgICAqZGVzdF9sZW4gPSBzaXplb2Yoc3RhdGUtPnJlYWxtKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9kaWdlc3RfcGFyYW1zKEhUVFBBdXRoU3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5X2xlbiwgY2hhciAqKmRlc3QsIGludCAqZGVzdF9sZW4pCit7CisgICAgRGlnZXN0UGFyYW1zICpkaWdlc3QgPSAmc3RhdGUtPmRpZ2VzdF9wYXJhbXM7CisKKyAgICBpZiAoIXN0cm5jbXAoa2V5LCAicmVhbG09Iiwga2V5X2xlbikpIHsKKyAgICAgICAgKmRlc3QgICAgID0gICAgICAgIHN0YXRlLT5yZWFsbTsKKyAgICAgICAgKmRlc3RfbGVuID0gc2l6ZW9mKHN0YXRlLT5yZWFsbSk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChrZXksICJub25jZT0iLCBrZXlfbGVuKSkgeworICAgICAgICAqZGVzdCAgICAgPSAgICAgICAgZGlnZXN0LT5ub25jZTsKKyAgICAgICAgKmRlc3RfbGVuID0gc2l6ZW9mKGRpZ2VzdC0+bm9uY2UpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoa2V5LCAib3BhcXVlPSIsIGtleV9sZW4pKSB7CisgICAgICAgICpkZXN0ICAgICA9ICAgICAgICBkaWdlc3QtPm9wYXF1ZTsKKyAgICAgICAgKmRlc3RfbGVuID0gc2l6ZW9mKGRpZ2VzdC0+b3BhcXVlKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGtleSwgImFsZ29yaXRobT0iLCBrZXlfbGVuKSkgeworICAgICAgICAqZGVzdCAgICAgPSAgICAgICAgZGlnZXN0LT5hbGdvcml0aG07CisgICAgICAgICpkZXN0X2xlbiA9IHNpemVvZihkaWdlc3QtPmFsZ29yaXRobSk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChrZXksICJxb3A9Iiwga2V5X2xlbikpIHsKKyAgICAgICAgKmRlc3QgICAgID0gICAgICAgIGRpZ2VzdC0+cW9wOworICAgICAgICAqZGVzdF9sZW4gPSBzaXplb2YoZGlnZXN0LT5xb3ApOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoa2V5LCAic3RhbGU9Iiwga2V5X2xlbikpIHsKKyAgICAgICAgKmRlc3QgICAgID0gICAgICAgIGRpZ2VzdC0+c3RhbGU7CisgICAgICAgICpkZXN0X2xlbiA9IHNpemVvZihkaWdlc3QtPnN0YWxlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9kaWdlc3RfdXBkYXRlKEhUVFBBdXRoU3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5X2xlbiwgY2hhciAqKmRlc3QsIGludCAqZGVzdF9sZW4pCit7CisgICAgRGlnZXN0UGFyYW1zICpkaWdlc3QgPSAmc3RhdGUtPmRpZ2VzdF9wYXJhbXM7CisKKyAgICBpZiAoIXN0cm5jbXAoa2V5LCAibmV4dG5vbmNlPSIsIGtleV9sZW4pKSB7CisgICAgICAgICpkZXN0ICAgICA9ICAgICAgICBkaWdlc3QtPm5vbmNlOworICAgICAgICAqZGVzdF9sZW4gPSBzaXplb2YoZGlnZXN0LT5ub25jZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaG9vc2VfcW9wKGNoYXIgKnFvcCwgaW50IHNpemUpCit7CisgICAgY2hhciAqcHRyID0gc3Ryc3RyKHFvcCwgImF1dGgiKTsKKyAgICBjaGFyICplbmQgPSBwdHIgKyBzdHJsZW4oImF1dGgiKTsKKworICAgIGlmIChwdHIgJiYgKCEqZW5kIHx8IGF2X2lzc3BhY2UoKmVuZCkgfHwgKmVuZCA9PSAnLCcpICYmCisgICAgICAgIChwdHIgPT0gcW9wIHx8IGF2X2lzc3BhY2UocHRyWy0xXSkgfHwgcHRyWy0xXSA9PSAnLCcpKSB7CisgICAgICAgIGF2X3N0cmxjcHkocW9wLCAiYXV0aCIsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHFvcFswXSA9IDA7CisgICAgfQorfQorCit2b2lkIGZmX2h0dHBfYXV0aF9oYW5kbGVfaGVhZGVyKEhUVFBBdXRoU3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIGlmICghc3RyY21wKGtleSwgIldXVy1BdXRoZW50aWNhdGUiKSB8fCAhc3RyY21wKGtleSwgIlByb3h5LUF1dGhlbnRpY2F0ZSIpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnA7CisgICAgICAgIGlmIChhdl9zdHJpc3RhcnQodmFsdWUsICJCYXNpYyAiLCAmcCkgJiYKKyAgICAgICAgICAgIHN0YXRlLT5hdXRoX3R5cGUgPD0gSFRUUF9BVVRIX0JBU0lDKSB7CisgICAgICAgICAgICBzdGF0ZS0+YXV0aF90eXBlID0gSFRUUF9BVVRIX0JBU0lDOworICAgICAgICAgICAgc3RhdGUtPnJlYWxtWzBdID0gMDsKKyAgICAgICAgICAgIHN0YXRlLT5zdGFsZSA9IDA7CisgICAgICAgICAgICBmZl9wYXJzZV9rZXlfdmFsdWUocCwgKGZmX3BhcnNlX2tleV92YWxfY2IpIGhhbmRsZV9iYXNpY19wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOworICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cmlzdGFydCh2YWx1ZSwgIkRpZ2VzdCAiLCAmcCkgJiYKKyAgICAgICAgICAgICAgICAgICBzdGF0ZS0+YXV0aF90eXBlIDw9IEhUVFBfQVVUSF9ESUdFU1QpIHsKKyAgICAgICAgICAgIHN0YXRlLT5hdXRoX3R5cGUgPSBIVFRQX0FVVEhfRElHRVNUOworICAgICAgICAgICAgbWVtc2V0KCZzdGF0ZS0+ZGlnZXN0X3BhcmFtcywgMCwgc2l6ZW9mKERpZ2VzdFBhcmFtcykpOworICAgICAgICAgICAgc3RhdGUtPnJlYWxtWzBdID0gMDsKKyAgICAgICAgICAgIHN0YXRlLT5zdGFsZSA9IDA7CisgICAgICAgICAgICBmZl9wYXJzZV9rZXlfdmFsdWUocCwgKGZmX3BhcnNlX2tleV92YWxfY2IpIGhhbmRsZV9kaWdlc3RfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKyAgICAgICAgICAgIGNob29zZV9xb3Aoc3RhdGUtPmRpZ2VzdF9wYXJhbXMucW9wLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RhdGUtPmRpZ2VzdF9wYXJhbXMucW9wKSk7CisgICAgICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAoc3RhdGUtPmRpZ2VzdF9wYXJhbXMuc3RhbGUsICJ0cnVlIikpCisgICAgICAgICAgICAgICAgc3RhdGUtPnN0YWxlID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJBdXRoZW50aWNhdGlvbi1JbmZvIikpIHsKKyAgICAgICAgZmZfcGFyc2Vfa2V5X3ZhbHVlKHZhbHVlLCAoZmZfcGFyc2Vfa2V5X3ZhbF9jYikgaGFuZGxlX2RpZ2VzdF91cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9tZDVfc3RyaW5ncyhzdHJ1Y3QgQVZNRDUgKm1kNWN0eCwgLi4uKQoreworICAgIHZhX2xpc3Qgdmw7CisKKyAgICB2YV9zdGFydCh2bCwgbWQ1Y3R4KTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBjb25zdCBjaGFyKiBzdHIgPSB2YV9hcmcodmwsIGNvbnN0IGNoYXIqKTsKKyAgICAgICAgaWYgKCFzdHIpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXZfbWQ1X3VwZGF0ZShtZDVjdHgsIHN0ciwgc3RybGVuKHN0cikpOworICAgIH0KKyAgICB2YV9lbmQodmwpOworfQorCisvKiBHZW5lcmF0ZSBhIGRpZ2VzdCByZXBseSwgYWNjb3JkaW5nIHRvIFJGQyAyNjE3LiAqLworc3RhdGljIGNoYXIgKm1ha2VfZGlnZXN0X2F1dGgoSFRUUEF1dGhTdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGFzc3dvcmQsIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCkKK3sKKyAgICBEaWdlc3RQYXJhbXMgKmRpZ2VzdCA9ICZzdGF0ZS0+ZGlnZXN0X3BhcmFtczsKKyAgICBpbnQgbGVuOworICAgIHVpbnQzMl90IGNub25jZV9idWZbMl07CisgICAgY2hhciBjbm9uY2VbMTddOworICAgIGNoYXIgbmNbOV07CisgICAgaW50IGk7CisgICAgY2hhciBBMWhhc2hbMzNdLCBBMmhhc2hbMzNdLCByZXNwb25zZVszM107CisgICAgc3RydWN0IEFWTUQ1ICptZDVjdHg7CisgICAgdWludDhfdCBoYXNoWzE2XTsKKyAgICBjaGFyICphdXRoc3RyOworCisgICAgZGlnZXN0LT5uYysrOworICAgIHNucHJpbnRmKG5jLCBzaXplb2YobmMpLCAiJTA4eCIsIGRpZ2VzdC0+bmMpOworCisgICAgLyogR2VuZXJhdGUgYSBjbGllbnQgbm9uY2UuICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgY25vbmNlX2J1ZltpXSA9IGF2X2dldF9yYW5kb21fc2VlZCgpOworICAgIGZmX2RhdGFfdG9faGV4KGNub25jZSwgKGNvbnN0IHVpbnQ4X3QqKSBjbm9uY2VfYnVmLCBzaXplb2YoY25vbmNlX2J1ZiksIDEpOworICAgIGNub25jZVsyKnNpemVvZihjbm9uY2VfYnVmKV0gPSAwOworCisgICAgbWQ1Y3R4ID0gYXZfbWQ1X2FsbG9jKCk7CisgICAgaWYgKCFtZDVjdHgpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYXZfbWQ1X2luaXQobWQ1Y3R4KTsKKyAgICB1cGRhdGVfbWQ1X3N0cmluZ3MobWQ1Y3R4LCB1c2VybmFtZSwgIjoiLCBzdGF0ZS0+cmVhbG0sICI6IiwgcGFzc3dvcmQsIE5VTEwpOworICAgIGF2X21kNV9maW5hbChtZDVjdHgsIGhhc2gpOworICAgIGZmX2RhdGFfdG9faGV4KEExaGFzaCwgaGFzaCwgMTYsIDEpOworICAgIEExaGFzaFszMl0gPSAwOworCisgICAgaWYgKCFzdHJjbXAoZGlnZXN0LT5hbGdvcml0aG0sICIiKSB8fCAhc3RyY21wKGRpZ2VzdC0+YWxnb3JpdGhtLCAiTUQ1IikpIHsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoZGlnZXN0LT5hbGdvcml0aG0sICJNRDUtc2VzcyIpKSB7CisgICAgICAgIGF2X21kNV9pbml0KG1kNWN0eCk7CisgICAgICAgIHVwZGF0ZV9tZDVfc3RyaW5ncyhtZDVjdHgsIEExaGFzaCwgIjoiLCBkaWdlc3QtPm5vbmNlLCAiOiIsIGNub25jZSwgTlVMTCk7CisgICAgICAgIGF2X21kNV9maW5hbChtZDVjdHgsIGhhc2gpOworICAgICAgICBmZl9kYXRhX3RvX2hleChBMWhhc2gsIGhhc2gsIDE2LCAxKTsKKyAgICAgICAgQTFoYXNoWzMyXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVW5zdXBwb3J0ZWQgYWxnb3JpdGhtICovCisgICAgICAgIGF2X2ZyZWUobWQ1Y3R4KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYXZfbWQ1X2luaXQobWQ1Y3R4KTsKKyAgICB1cGRhdGVfbWQ1X3N0cmluZ3MobWQ1Y3R4LCBtZXRob2QsICI6IiwgdXJpLCBOVUxMKTsKKyAgICBhdl9tZDVfZmluYWwobWQ1Y3R4LCBoYXNoKTsKKyAgICBmZl9kYXRhX3RvX2hleChBMmhhc2gsIGhhc2gsIDE2LCAxKTsKKyAgICBBMmhhc2hbMzJdID0gMDsKKworICAgIGF2X21kNV9pbml0KG1kNWN0eCk7CisgICAgdXBkYXRlX21kNV9zdHJpbmdzKG1kNWN0eCwgQTFoYXNoLCAiOiIsIGRpZ2VzdC0+bm9uY2UsIE5VTEwpOworICAgIGlmICghc3RyY21wKGRpZ2VzdC0+cW9wLCAiYXV0aCIpIHx8ICFzdHJjbXAoZGlnZXN0LT5xb3AsICJhdXRoLWludCIpKSB7CisgICAgICAgIHVwZGF0ZV9tZDVfc3RyaW5ncyhtZDVjdHgsICI6IiwgbmMsICI6IiwgY25vbmNlLCAiOiIsIGRpZ2VzdC0+cW9wLCBOVUxMKTsKKyAgICB9CisgICAgdXBkYXRlX21kNV9zdHJpbmdzKG1kNWN0eCwgIjoiLCBBMmhhc2gsIE5VTEwpOworICAgIGF2X21kNV9maW5hbChtZDVjdHgsIGhhc2gpOworICAgIGZmX2RhdGFfdG9faGV4KHJlc3BvbnNlLCBoYXNoLCAxNiwgMSk7CisgICAgcmVzcG9uc2VbMzJdID0gMDsKKworICAgIGF2X2ZyZWUobWQ1Y3R4KTsKKworICAgIGlmICghc3RyY21wKGRpZ2VzdC0+cW9wLCAiIikgfHwgIXN0cmNtcChkaWdlc3QtPnFvcCwgImF1dGgiKSkgeworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChkaWdlc3QtPnFvcCwgImF1dGgtaW50IikpIHsKKyAgICAgICAgLyogcW9wPWF1dGgtaW50IG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVW5zdXBwb3J0ZWQgcW9wIHZhbHVlLiAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBsZW4gPSBzdHJsZW4odXNlcm5hbWUpICsgc3RybGVuKHN0YXRlLT5yZWFsbSkgKyBzdHJsZW4oZGlnZXN0LT5ub25jZSkgKworICAgICAgICAgICAgICBzdHJsZW4odXJpKSArIHN0cmxlbihyZXNwb25zZSkgKyBzdHJsZW4oZGlnZXN0LT5hbGdvcml0aG0pICsKKyAgICAgICAgICAgICAgc3RybGVuKGRpZ2VzdC0+b3BhcXVlKSArIHN0cmxlbihkaWdlc3QtPnFvcCkgKyBzdHJsZW4oY25vbmNlKSArCisgICAgICAgICAgICAgIHN0cmxlbihuYykgKyAxNTA7CisKKyAgICBhdXRoc3RyID0gYXZfbWFsbG9jKGxlbik7CisgICAgaWYgKCFhdXRoc3RyKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzbnByaW50ZihhdXRoc3RyLCBsZW4sICJBdXRob3JpemF0aW9uOiBEaWdlc3QgIik7CisKKyAgICAvKiBUT0RPOiBFc2NhcGUgdGhlIHF1b3RlZCBzdHJpbmdzIHByb3Blcmx5LiAqLworICAgIGF2X3N0cmxjYXRmKGF1dGhzdHIsIGxlbiwgInVzZXJuYW1lPVwiJXNcIiIsICAgdXNlcm5hbWUpOworICAgIGF2X3N0cmxjYXRmKGF1dGhzdHIsIGxlbiwgIixyZWFsbT1cIiVzXCIiLCAgICAgc3RhdGUtPnJlYWxtKTsKKyAgICBhdl9zdHJsY2F0ZihhdXRoc3RyLCBsZW4sICIsbm9uY2U9XCIlc1wiIiwgICAgIGRpZ2VzdC0+bm9uY2UpOworICAgIGF2X3N0cmxjYXRmKGF1dGhzdHIsIGxlbiwgIix1cmk9XCIlc1wiIiwgICAgICAgdXJpKTsKKyAgICBhdl9zdHJsY2F0ZihhdXRoc3RyLCBsZW4sICIscmVzcG9uc2U9XCIlc1wiIiwgIHJlc3BvbnNlKTsKKworICAgIC8vIHdlIGFyZSB2aW9sYXRpbmcgdGhlIFJGQyBhbmQgdXNlICIiIGJlY2F1c2UgYWxsIG90aGVycyBzZWVtIHRvIGRvIHRoYXQgdG9vLgorICAgIGlmIChkaWdlc3QtPmFsZ29yaXRobVswXSkKKyAgICAgICAgYXZfc3RybGNhdGYoYXV0aHN0ciwgbGVuLCAiLGFsZ29yaXRobT1cIiVzXCIiLCAgZGlnZXN0LT5hbGdvcml0aG0pOworCisgICAgaWYgKGRpZ2VzdC0+b3BhcXVlWzBdKQorICAgICAgICBhdl9zdHJsY2F0ZihhdXRoc3RyLCBsZW4sICIsb3BhcXVlPVwiJXNcIiIsIGRpZ2VzdC0+b3BhcXVlKTsKKyAgICBpZiAoZGlnZXN0LT5xb3BbMF0pIHsKKyAgICAgICAgYXZfc3RybGNhdGYoYXV0aHN0ciwgbGVuLCAiLHFvcD1cIiVzXCIiLCAgICBkaWdlc3QtPnFvcCk7CisgICAgICAgIGF2X3N0cmxjYXRmKGF1dGhzdHIsIGxlbiwgIixjbm9uY2U9XCIlc1wiIiwgY25vbmNlKTsKKyAgICAgICAgYXZfc3RybGNhdGYoYXV0aHN0ciwgbGVuLCAiLG5jPSVzIiwgICAgICAgICBuYyk7CisgICAgfQorCisgICAgYXZfc3RybGNhdGYoYXV0aHN0ciwgbGVuLCAiXHJcbiIpOworCisgICAgcmV0dXJuIGF1dGhzdHI7Cit9CisKK2NoYXIgKmZmX2h0dHBfYXV0aF9jcmVhdGVfcmVzcG9uc2UoSFRUUEF1dGhTdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1ldGhvZCkKK3sKKyAgICBjaGFyICphdXRoc3RyID0gTlVMTDsKKworICAgIC8qIENsZWFyIHRoZSBzdGFsZSBmbGFnLCB3ZSBhc3N1bWUgdGhlIGF1dGggaXMgb2sgbm93LiBJdCBpcyByZXNldAorICAgICAqIGJ5IHRoZSBzZXJ2ZXIgaGVhZGVycyBpZiB0aGVyZSdzIGEgbmV3IGlzc3VlLiAqLworICAgIHN0YXRlLT5zdGFsZSA9IDA7CisgICAgaWYgKCFhdXRoIHx8ICFzdHJjaHIoYXV0aCwgJzonKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoc3RhdGUtPmF1dGhfdHlwZSA9PSBIVFRQX0FVVEhfQkFTSUMpIHsKKyAgICAgICAgaW50IGF1dGhfYjY0X2xlbiwgbGVuOworICAgICAgICBjaGFyICpwdHIsICpkZWNvZGVkX2F1dGggPSBmZl91cmxkZWNvZGUoYXV0aCk7CisKKyAgICAgICAgaWYgKCFkZWNvZGVkX2F1dGgpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBhdXRoX2I2NF9sZW4gPSBBVl9CQVNFNjRfU0laRShzdHJsZW4oZGVjb2RlZF9hdXRoKSk7CisgICAgICAgIGxlbiA9IGF1dGhfYjY0X2xlbiArIDMwOworCisgICAgICAgIGF1dGhzdHIgPSBhdl9tYWxsb2MobGVuKTsKKyAgICAgICAgaWYgKCFhdXRoc3RyKSB7CisgICAgICAgICAgICBhdl9mcmVlKGRlY29kZWRfYXV0aCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHNucHJpbnRmKGF1dGhzdHIsIGxlbiwgIkF1dGhvcml6YXRpb246IEJhc2ljICIpOworICAgICAgICBwdHIgPSBhdXRoc3RyICsgc3RybGVuKGF1dGhzdHIpOworICAgICAgICBhdl9iYXNlNjRfZW5jb2RlKHB0ciwgYXV0aF9iNjRfbGVuLCBkZWNvZGVkX2F1dGgsIHN0cmxlbihkZWNvZGVkX2F1dGgpKTsKKyAgICAgICAgYXZfc3RybGNhdChwdHIsICJcclxuIiwgbGVuIC0gKHB0ciAtIGF1dGhzdHIpKTsKKyAgICAgICAgYXZfZnJlZShkZWNvZGVkX2F1dGgpOworICAgIH0gZWxzZSBpZiAoc3RhdGUtPmF1dGhfdHlwZSA9PSBIVFRQX0FVVEhfRElHRVNUKSB7CisgICAgICAgIGNoYXIgKnVzZXJuYW1lID0gZmZfdXJsZGVjb2RlKGF1dGgpLCAqcGFzc3dvcmQ7CisKKyAgICAgICAgaWYgKCF1c2VybmFtZSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIGlmICgocGFzc3dvcmQgPSBzdHJjaHIodXNlcm5hbWUsICc6JykpKSB7CisgICAgICAgICAgICAqcGFzc3dvcmQrKyA9IDA7CisgICAgICAgICAgICBhdXRoc3RyID0gbWFrZV9kaWdlc3RfYXV0aChzdGF0ZSwgdXNlcm5hbWUsIHBhc3N3b3JkLCBwYXRoLCBtZXRob2QpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWUodXNlcm5hbWUpOworICAgIH0KKyAgICByZXR1cm4gYXV0aHN0cjsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9odHRwYXV0aC5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2h0dHBhdXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxN2M5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9odHRwYXV0aC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBIVFRQIGF1dGhlbnRpY2F0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9IVFRQQVVUSF9ICisjZGVmaW5lIEFWRk9STUFUX0hUVFBBVVRIX0gKKworLyoqCisgKiBBdXRoZW50aWNhdGlvbiB0eXBlcywgb3JkZXJlZCBmcm9tIHdlYWtlc3QgdG8gc3Ryb25nZXN0LgorICovCit0eXBlZGVmIGVudW0gSFRUUEF1dGhUeXBlIHsKKyAgICBIVFRQX0FVVEhfTk9ORSA9IDAsICAgIC8qKjwgTm8gYXV0aGVudGljYXRpb24gc3BlY2lmaWVkICovCisgICAgSFRUUF9BVVRIX0JBU0lDLCAgICAgICAvKio8IEhUVFAgMS4wIEJhc2ljIGF1dGggZnJvbSBSRkMgMTk0NQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAoYWxzbyBpbiBSRkMgMjYxNykgKi8KKyAgICBIVFRQX0FVVEhfRElHRVNULCAgICAgIC8qKjwgSFRUUCAxLjEgRGlnZXN0IGF1dGggZnJvbSBSRkMgMjYxNyAqLworfSBIVFRQQXV0aFR5cGU7CisKK3R5cGVkZWYgc3RydWN0IERpZ2VzdFBhcmFtcyB7CisgICAgY2hhciBub25jZVszMDBdOyAgICAgICAvKio8IFNlcnZlciBzcGVjaWZpZWQgbm9uY2UgKi8KKyAgICBjaGFyIGFsZ29yaXRobVsxMF07ICAgIC8qKjwgU2VydmVyIHNwZWNpZmllZCBkaWdlc3QgYWxnb3JpdGhtICovCisgICAgY2hhciBxb3BbMzBdOyAgICAgICAgICAvKio8IFF1YWxpdHkgb2YgcHJvdGVjdGlvbiwgY29udGFpbmluZyB0aGUgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHRoYXQgd2UndmUgY2hvc2VuIHRvIHVzZSwgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgYWx0ZXJuYXRpdmVzIHRoYXQgdGhlIHNlcnZlciBvZmZlcmVkLiAqLworICAgIGNoYXIgb3BhcXVlWzMwMF07ICAgICAgLyoqPCBBIHNlcnZlci1zcGVjaWZpZWQgc3RyaW5nIHRoYXQgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIGluY2x1ZGVkIGluIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlcywgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIGluY2x1ZGVkIGluIHRoZSBhY3R1YWwgZGlnZXN0IGNhbGN1bGF0aW9uLiAqLworICAgIGNoYXIgc3RhbGVbMTBdOyAgICAgICAgLyoqPCBUaGUgc2VydmVyIGluZGljYXRlZCB0aGF0IHRoZSBhdXRoIHdhcyBvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBidXQgbmVlZHMgdG8gYmUgcmVkb25lIHdpdGggYSBuZXcsIG5vbi1zdGFsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5vbmNlLiAqLworICAgIGludCBuYzsgICAgICAgICAgICAgICAgLyoqPCBOb25jZSBjb3VudCwgdGhlIG51bWJlciBvZiBlYXJsaWVyIHJlcGxpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgd2hlcmUgdGhpcyBwYXJ0aWN1bGFyIG5vbmNlIGhhcyBiZWVuIHVzZWQuICovCit9IERpZ2VzdFBhcmFtczsKKworLyoqCisgKiBIVFRQIEF1dGhlbnRpY2F0aW9uIHN0YXRlIHN0cnVjdHVyZS4gTXVzdCBiZSB6ZXJvLWluaXRpYWxpemVkCisgKiBiZWZvcmUgdXNlZCB3aXRoIHRoZSBmdW5jdGlvbnMgYmVsb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IEhUVFBBdXRoU3RhdGUgeworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50bHkgY2hvc2VuIGF1dGggdHlwZS4KKyAgICAgKi8KKyAgICBIVFRQQXV0aFR5cGUgYXV0aF90eXBlOworICAgIC8qKgorICAgICAqIEF1dGhlbnRpY2F0aW9uIHJlYWxtCisgICAgICovCisgICAgY2hhciByZWFsbVsyMDBdOworICAgIC8qKgorICAgICAqIFRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllYyB0byBkaWdlc3QgYXV0aGVudGljYXRpb24uCisgICAgICovCisgICAgRGlnZXN0UGFyYW1zIGRpZ2VzdF9wYXJhbXM7CisgICAgLyoqCisgICAgICogQXV0aCBvaywgYnV0IG5lZWRzIHRvIGJlIHJlc2VudCB3aXRoIGEgbmV3IG5vbmNlLgorICAgICAqLworICAgIGludCBzdGFsZTsKK30gSFRUUEF1dGhTdGF0ZTsKKwordm9pZCBmZl9odHRwX2F1dGhfaGFuZGxlX2hlYWRlcihIVFRQQXV0aFN0YXRlICpzdGF0ZSwgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSk7CitjaGFyICpmZl9odHRwX2F1dGhfY3JlYXRlX3Jlc3BvbnNlKEhUVFBBdXRoU3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptZXRob2QpOworCisjZW5kaWYgLyogQVZGT1JNQVRfSFRUUEFVVEhfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ljZWNhc3QuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pY2VjYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjNzAwMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pY2VjYXN0LmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBJY2VjYXN0IHByb3RvY29sIGZvciBGRm1wZWcKKyAqIENvcHlyaWdodCAoYykgMjAxNCBNYXJ2aW4gU2Nob2x6CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgIm5ldHdvcmsuaCIKKworCit0eXBlZGVmIHN0cnVjdCBJY2VjYXN0Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgVVJMQ29udGV4dCAqaGQ7CisgICAgaW50IHNlbmRfc3RhcnRlZDsKKyAgICBjaGFyICp1c2VyOworICAgIC8vIE9wdGlvbnMKKyAgICBjaGFyICpjb250ZW50X3R5cGU7CisgICAgY2hhciAqZGVzY3JpcHRpb247CisgICAgY2hhciAqZ2VucmU7CisgICAgaW50IGxlZ2FjeV9pY2VjYXN0OworICAgIGNoYXIgKm5hbWU7CisgICAgY2hhciAqcGFzczsKKyAgICBpbnQgcHVibGljOworICAgIGNoYXIgKnVybDsKKyAgICBjaGFyICp1c2VyX2FnZW50OworfSBJY2VjYXN0Q29udGV4dDsKKworI2RlZmluZSBERUZBVUxUX0lDRV9VU0VSICJzb3VyY2UiCisKKyNkZWZpbmUgTk9UX0VNUFRZKHMpIChzICYmIHNbMF0pCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEljZWNhc3RDb250ZXh0LCB4KQorI2RlZmluZSBFIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiaWNlX2dlbnJlIiwgInNldCBzdHJlYW0gZ2VucmUiLCBPRkZTRVQoZ2VucmUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgMCB9LCAwLCAwLCBFIH0sCisgICAgeyAiaWNlX25hbWUiLCAic2V0IHN0cmVhbSBkZXNjcmlwdGlvbiIsIE9GRlNFVChuYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgRSB9LAorICAgIHsgImljZV9kZXNjcmlwdGlvbiIsICJzZXQgc3RyZWFtIGRlc2NyaXB0aW9uIiwgT0ZGU0VUKGRlc2NyaXB0aW9uKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgRSB9LAorICAgIHsgImljZV91cmwiLCAic2V0IHN0cmVhbSB3ZWJzaXRlIiwgT0ZGU0VUKHVybCksIEFWX09QVF9UWVBFX1NUUklORywgeyAwIH0sIDAsIDAsIEUgfSwKKyAgICB7ICJpY2VfcHVibGljIiwgInNldCBpZiBzdHJlYW0gaXMgcHVibGljIiwgT0ZGU0VUKHB1YmxpYyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBFIH0sCisgICAgeyAidXNlcl9hZ2VudCIsICJvdmVycmlkZSBVc2VyLUFnZW50IGhlYWRlciIsIE9GRlNFVCh1c2VyX2FnZW50KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgRSB9LAorICAgIHsgInBhc3N3b3JkIiwgInNldCBwYXNzd29yZCIsIE9GRlNFVChwYXNzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgRSB9LAorICAgIHsgImNvbnRlbnRfdHlwZSIsICJzZXQgY29udGVudC10eXBlLCBNVVNUIGJlIHNldCBpZiBub3QgYXVkaW8vbXBlZyIsIE9GRlNFVChjb250ZW50X3R5cGUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgMCB9LCAwLCAwLCBFIH0sCisgICAgeyAibGVnYWN5X2ljZWNhc3QiLCAidXNlIGxlZ2FjeSBTT1VSQ0UgbWV0aG9kLCBmb3IgSWNlY2FzdCA8IHYyLjQiLCBPRkZTRVQobGVnYWN5X2ljZWNhc3QpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRSB9LAorICAgIHsgTlVMTCB9Cit9OworCisKK3N0YXRpYyB2b2lkIGNhdF9oZWFkZXIoQVZCUHJpbnQgKmJwLCBjb25zdCBjaGFyIGtleVtdLCBjb25zdCBjaGFyIHZhbHVlW10pCit7CisgICAgaWYgKE5PVF9FTVBUWSh2YWx1ZSkpCisgICAgICAgIGF2X2JwcmludGYoYnAsICIlczogJXNcclxuIiwga2V5LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgaWNlY2FzdF9jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIEljZWNhc3RDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGlmIChzLT5oZCkKKyAgICAgICAgZmZ1cmxfY2xvc2Uocy0+aGQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGljZWNhc3Rfb3BlbihVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmksIGludCBmbGFncykKK3sKKyAgICBJY2VjYXN0Q29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKworICAgIC8vIERpY3QgdG8gc2V0IG9wdGlvbnMgdGhhdCB3ZSBwYXNzIHRvIHRoZSBIVFRQIHByb3RvY29sCisgICAgQVZEaWN0aW9uYXJ5ICpvcHRfZGljdCA9IE5VTEw7CisKKyAgICAvLyBVUkkgcGFydCB2YXJpYWJsZXMKKyAgICBjaGFyIGhfdXJsWzEwMjRdLCBob3N0WzEwMjRdLCBhdXRoWzEwMjRdLCBwYXRoWzEwMjRdOworICAgIGNoYXIgKmhlYWRlcnMgPSBOVUxMLCAqdXNlciA9IE5VTEw7CisgICAgaW50IHBvcnQsIHJldDsKKyAgICBBVkJQcmludCBicDsKKworICAgIGlmIChmbGFncyAmIEFWSU9fRkxBR19SRUFEKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworCisgICAgYXZfYnByaW50X2luaXQoJmJwLCAwLCAxKTsKKworICAgIC8vIEJ1aWxkIGhlYWRlciBzdHJpbmdzCisgICAgY2F0X2hlYWRlcigmYnAsICJJY2UtTmFtZSIsIHMtPm5hbWUpOworICAgIGNhdF9oZWFkZXIoJmJwLCAiSWNlLURlc2NyaXB0aW9uIiwgcy0+ZGVzY3JpcHRpb24pOworICAgIGNhdF9oZWFkZXIoJmJwLCAiSWNlLVVSTCIsIHMtPnVybCk7CisgICAgY2F0X2hlYWRlcigmYnAsICJJY2UtR2VucmUiLCBzLT5nZW5yZSk7CisgICAgY2F0X2hlYWRlcigmYnAsICJJY2UtUHVibGljIiwgcy0+cHVibGljID8gIjEiIDogIjAiKTsKKyAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZSgmYnApKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmJwLCAmaGVhZGVycyk7CisKKyAgICAvLyBTZXQgb3B0aW9ucworICAgIGF2X2RpY3Rfc2V0KCZvcHRfZGljdCwgIm1ldGhvZCIsIHMtPmxlZ2FjeV9pY2VjYXN0ID8gIlNPVVJDRSIgOiAiUFVUIiwgMCk7CisgICAgYXZfZGljdF9zZXQoJm9wdF9kaWN0LCAiYXV0aF90eXBlIiwgImJhc2ljIiwgMCk7CisgICAgYXZfZGljdF9zZXQoJm9wdF9kaWN0LCAiaGVhZGVycyIsIGhlYWRlcnMsIDApOworICAgIGF2X2RpY3Rfc2V0KCZvcHRfZGljdCwgImNodW5rZWRfcG9zdCIsICIwIiwgMCk7CisgICAgYXZfZGljdF9zZXQoJm9wdF9kaWN0LCAic2VuZF9leHBlY3RfMTAwIiwgcy0+bGVnYWN5X2ljZWNhc3QgPyAiMCIgOiAiMSIsIDApOworICAgIGlmIChOT1RfRU1QVFkocy0+Y29udGVudF90eXBlKSkKKyAgICAgICAgYXZfZGljdF9zZXQoJm9wdF9kaWN0LCAiY29udGVudF90eXBlIiwgcy0+Y29udGVudF90eXBlLCAwKTsKKyAgICBlbHNlCisgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRfZGljdCwgImNvbnRlbnRfdHlwZSIsICJhdWRpby9tcGVnIiwgMCk7CisgICAgaWYgKE5PVF9FTVBUWShzLT51c2VyX2FnZW50KSkKKyAgICAgICAgYXZfZGljdF9zZXQoJm9wdF9kaWN0LCAidXNlcl9hZ2VudCIsIHMtPnVzZXJfYWdlbnQsIDApOworCisgICAgLy8gUGFyc2UgVVJJCisgICAgYXZfdXJsX3NwbGl0KE5VTEwsIDAsIGF1dGgsIHNpemVvZihhdXRoKSwgaG9zdCwgc2l6ZW9mKGhvc3QpLAorICAgICAgICAgICAgICAgICAmcG9ydCwgcGF0aCwgc2l6ZW9mKHBhdGgpLCB1cmkpOworCisgICAgLy8gQ2hlY2sgZm9yIGF1dGggZGF0YSBpbiBVUkkKKyAgICBpZiAoYXV0aFswXSkgeworICAgICAgICBjaGFyICpzZXAgPSBzdHJjaHIoYXV0aCwgJzonKTsKKyAgICAgICAgaWYgKHNlcCkgeworICAgICAgICAgICAgKnNlcCA9IDA7CisgICAgICAgICAgICBzZXArKzsKKyAgICAgICAgICAgIGlmIChzLT5wYXNzKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZShzLT5wYXNzKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICJPdmVyd3JpdGluZyAtcGFzc3dvcmQgPHBhc3M+IHdpdGggVVJJIHBhc3N3b3JkIVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShzLT5wYXNzID0gYXZfc3RyZHVwKHNlcCkpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoISh1c2VyID0gYXZfc3RyZHVwKGF1dGgpKSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQnVpbGQgbmV3IGF1dGhzdHJpbmcKKyAgICBzbnByaW50ZihhdXRoLCBzaXplb2YoYXV0aCksCisgICAgICAgICAgICAgIiVzOiVzIiwKKyAgICAgICAgICAgICB1c2VyID8gdXNlciA6IERFRkFVTFRfSUNFX1VTRVIsCisgICAgICAgICAgICAgcy0+cGFzcyA/IHMtPnBhc3MgOiAiIik7CisKKyAgICAvLyBDaGVjayBmb3IgbW91bnRwb2ludCAocGF0aCkKKyAgICBpZiAoIXBhdGhbMF0gfHwgc3RyY21wKHBhdGgsICIvIikgPT0gMCkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiTm8gbW91bnRwb2ludCAocGF0aCkgc3BlY2lmaWVkIVxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIC8vIEJ1aWxkIG5ldyBVUkkgZm9yIHBhc3NpbmcgdG8gaHR0cCBwcm90b2NvbAorICAgIGZmX3VybF9qb2luKGhfdXJsLCBzaXplb2YoaF91cmwpLCAiaHR0cCIsIGF1dGgsIGhvc3QsIHBvcnQsICIlcyIsIHBhdGgpOworICAgIC8vIEZpbmFsbHkgb3BlbiBodHRwIHByb3RvIGhhbmRsZXIKKyAgICByZXQgPSBmZnVybF9vcGVuKCZzLT5oZCwgaF91cmwsIEFWSU9fRkxBR19SRUFEX1dSSVRFLCBOVUxMLCAmb3B0X2RpY3QpOworCitjbGVhbnVwOgorICAgIGF2X2ZyZWVwKCZ1c2VyKTsKKyAgICBhdl9mcmVlcCgmaGVhZGVycyk7CisgICAgYXZfZGljdF9mcmVlKCZvcHRfZGljdCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGljZWNhc3Rfd3JpdGUoVVJMQ29udGV4dCAqaCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBJY2VjYXN0Q29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpZiAoIXMtPnNlbmRfc3RhcnRlZCkgeworICAgICAgICBzLT5zZW5kX3N0YXJ0ZWQgPSAxOworICAgICAgICBpZiAoIXMtPmNvbnRlbnRfdHlwZSAmJiBzaXplID49IDgpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG9nZ3NbNF0gPSB7IDB4NEYsIDB4NjcsIDB4NjcsIDB4NTMgfTsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHdlYm1bNF0gPSB7IDB4MUEsIDB4NDUsIDB4REYsIDB4QTMgfTsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG9wdXNbOF0gPSB7IDB4NEYsIDB4NzAsIDB4NzUsIDB4NzMsIDB4NDgsIDB4NjUsIDB4NjEsIDB4NjQgfTsKKyAgICAgICAgICAgIGlmIChtZW1jbXAoYnVmLCBvZ2dzLCBzaXplb2Yob2dncykpID09IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICJTdHJlYW1pbmcgT2dnIGJ1dCBhcHByb3ByaWF0ZSBjb250ZW50IHR5cGUgTk9UIHNldCFcbiIpOworICAgICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywgIlNldCBpdCB3aXRoIC1jb250ZW50X3R5cGUgYXBwbGljYXRpb24vb2dnXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtY21wKGJ1Ziwgb3B1cywgc2l6ZW9mKG9wdXMpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLCAiU3RyZWFtaW5nIE9wdXMgYnV0IGFwcHJvcHJpYXRlIGNvbnRlbnQgdHlwZSBOT1Qgc2V0IVxuIik7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLCAiU2V0IGl0IHdpdGggLWNvbnRlbnRfdHlwZSBhdWRpby9vZ2dcbiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1jbXAoYnVmLCB3ZWJtLCBzaXplb2Yod2VibSkpID09IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICJTdHJlYW1pbmcgV2ViTSBidXQgYXBwcm9wcmlhdGUgY29udGVudCB0eXBlIE5PVCBzZXQhXG4iKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICJTZXQgaXQgd2l0aCAtY29udGVudF90eXBlIHZpZGVvL3dlYm1cbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICJJdCBzZWVtcyB5b3UgYXJlIHN0cmVhbWluZyBhbiB1bnN1cHBvcnRlZCBmb3JtYXQuXG4iKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICJJdCBtaWdodCB3b3JrLCBidXQgaXMgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkIGluIEljZWNhc3QhXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmZ1cmxfd3JpdGUocy0+aGQsIGJ1Ziwgc2l6ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGljZWNhc3RfY29udGV4dF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAiaWNlY2FzdCIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitVUkxQcm90b2NvbCBmZl9pY2VjYXN0X3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICAgPSAiaWNlY2FzdCIsCisgICAgLnVybF9vcGVuICAgICAgICA9IGljZWNhc3Rfb3BlbiwKKyAgICAudXJsX3dyaXRlICAgICAgID0gaWNlY2FzdF93cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgID0gaWNlY2FzdF9jbG9zZSwKKyAgICAucHJpdl9kYXRhX3NpemUgID0gc2l6ZW9mKEljZWNhc3RDb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX2NsYXNzID0gJmljZWNhc3RfY29udGV4dF9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaWNvZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvaWNvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3ZjBlZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pY29kZWMuYwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIE1pY3Jvc29mdCBXaW5kb3dzIElDTyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGV0ZXIgUm9zcyAocHJvc3NAeHZpZC5vcmcpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1pY3Jvc29mdCBXaW5kb3dzIElDTyBkZW11eGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2JtcC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBvZmZzZXQ7CisgICAgaW50IHNpemU7CisgICAgaW50IG5iX3BhbDsKK30gSWNvSW1hZ2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgY3VycmVudF9pbWFnZTsKKyAgICBpbnQgbmJfaW1hZ2VzOworICAgIEljb0ltYWdlICogaW1hZ2VzOworfSBJY29EZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKEFWX1JMMTYocC0+YnVmKSA9PSAwICYmIEFWX1JMMTYocC0+YnVmICsgMikgPT0gMSAmJiBBVl9STDE2KHAtPmJ1ZiArIDQpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLyA0OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBJY29EZW11eENvbnRleHQgKmljbyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgaSwgY29kZWM7CisKKyAgICBhdmlvX3NraXAocGIsIDQpOworICAgIGljby0+bmJfaW1hZ2VzID0gYXZpb19ybDE2KHBiKTsKKworICAgIGljby0+aW1hZ2VzID0gYXZfbWFsbG9jX2FycmF5KGljby0+bmJfaW1hZ2VzLCBzaXplb2YoSWNvSW1hZ2UpKTsKKyAgICBpZiAoIWljby0+aW1hZ2VzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IGljby0+bmJfaW1hZ2VzOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0OworICAgICAgICBpbnQgdG1wOworCisgICAgICAgIGlmIChhdmlvX3NlZWsocGIsIDYgKyBpICogMTYsIFNFRUtfU0VUKSA8IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gYXZpb19yOChwYik7CisgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcjgocGIpOworICAgICAgICBpY28tPmltYWdlc1tpXS5uYl9wYWwgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgaWYgKGljby0+aW1hZ2VzW2ldLm5iX3BhbCA9PSAyNTUpCisgICAgICAgICAgICBpY28tPmltYWdlc1tpXS5uYl9wYWwgPSAwOworCisgICAgICAgIGF2aW9fc2tpcChwYiwgNSk7CisKKyAgICAgICAgaWNvLT5pbWFnZXNbaV0uc2l6ZSAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgaWNvLT5pbWFnZXNbaV0ub2Zmc2V0ID0gYXZpb19ybDMyKHBiKTsKKworICAgICAgICBpZiAoYXZpb19zZWVrKHBiLCBpY28tPmltYWdlc1tpXS5vZmZzZXQsIFNFRUtfU0VUKSA8IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjb2RlYyA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIHN3aXRjaCAoY29kZWMpIHsKKyAgICAgICAgY2FzZSBNS1RBRygweDg5LCAnUCcsICdOJywgJ0cnKToKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QTkc7CisgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICAgID0gMDsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDA6CisgICAgICAgICAgICBpZiAoaWNvLT5pbWFnZXNbaV0uc2l6ZSA8IDQwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0JNUDsKKyAgICAgICAgICAgIHRtcCA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBpZiAodG1wKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggPSB0bXA7CisgICAgICAgICAgICB0bXAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgaWYgKHRtcCkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHRtcCAvIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiY29kZWMgJWQiLCBjb2RlYyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBJY29EZW11eENvbnRleHQgKmljbyA9IHMtPnByaXZfZGF0YTsKKyAgICBJY29JbWFnZSAqaW1hZ2U7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1swXTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGljby0+Y3VycmVudF9pbWFnZSA+PSBpY28tPm5iX2ltYWdlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIGltYWdlID0gJmljby0+aW1hZ2VzW2ljby0+Y3VycmVudF9pbWFnZV07CisKKyAgICBpZiAoKHJldCA9IGF2aW9fc2VlayhwYiwgaW1hZ2UtPm9mZnNldCwgU0VFS19TRVQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+c3RyZWFtc1tpY28tPmN1cnJlbnRfaW1hZ2VdLT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUE5HKSB7CisgICAgICAgIGlmICgocmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBpbWFnZS0+c2l6ZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDhfdCAqYnVmOworICAgICAgICBpZiAoKHJldCA9IGF2X25ld19wYWNrZXQocGt0LCAxNCArIGltYWdlLT5zaXplKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYnVmID0gcGt0LT5kYXRhOworCisgICAgICAgIC8qIGFkZCBCTVAgaGVhZGVyICovCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgJ0InKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCAnTScpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZidWYsIHBrdC0+c2l6ZSk7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmJ1ZiwgMCk7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJmJ1ZiwgMCk7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmJ1ZiwgMCk7CisKKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX3JlYWQocGIsIGJ1ZiwgaW1hZ2UtPnNpemUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gQVZfUkwxNihidWYgKyAxNCk7CisKKyAgICAgICAgaWYgKEFWX1JMMzIoYnVmICsgMzIpKQorICAgICAgICAgICAgaW1hZ2UtPm5iX3BhbCA9IEFWX1JMMzIoYnVmICsgMzIpOworCisgICAgICAgIGlmIChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA8PSA4ICYmICFpbWFnZS0+bmJfcGFsKSB7CisgICAgICAgICAgICBpbWFnZS0+bmJfcGFsID0gMSA8PCBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgICAgIEFWX1dMMzIoYnVmICsgMzIsIGltYWdlLT5uYl9wYWwpOworICAgICAgICB9CisKKyAgICAgICAgQVZfV0wzMihidWYgLSA0LCAxNCArIDQwICsgaW1hZ2UtPm5iX3BhbCAqIDQpOworICAgICAgICBBVl9XTDMyKGJ1ZiArIDgsIEFWX1JMMzIoYnVmICsgOCkgLyAyKTsKKyAgICB9CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGljby0+Y3VycmVudF9pbWFnZSsrOworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfaWNvX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImljbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1pY3Jvc29mdCBXaW5kb3dzIElDTyIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihJY29EZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHByb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaWNvZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvaWNvZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkNDQyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pY29lbmMuYwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIE1pY3Jvc29mdCBXaW5kb3dzIElDTyBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1pY2hhZWwgQnJhZHNoYXcgPG1qYnNoYXcgZ21haWwgY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNaWNyb3NvZnQgV2luZG93cyBJQ08gbXV4ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBvZmZzZXQ7CisgICAgaW50IHNpemU7CisgICAgdW5zaWduZWQgY2hhciB3aWR0aDsKKyAgICB1bnNpZ25lZCBjaGFyIGhlaWdodDsKKyAgICBzaG9ydCBiaXRzOworfSBJY29JbWFnZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBjdXJyZW50X2ltYWdlOworICAgIGludCBuYl9pbWFnZXM7CisgICAgSWNvSW1hZ2UgKmltYWdlczsKK30gSWNvTXV4Q29udGV4dDsKKworc3RhdGljIGludCBpY29fY2hlY2tfYXR0cmlidXRlcyhBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpjKQoreworICAgIGlmIChjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9CTVApIHsKKyAgICAgICAgaWYgKGMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4ICYmIEFWX1BJWF9GTVRfUkdCMzIgIT0gQVZfUElYX0ZNVF9CR1JBKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiV3JvbmcgZW5kaWFubmVzcyBmb3IgYm1wIHBpeGVsIGZvcm1hdFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9IGVsc2UgaWYgKGMtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9QQUw4ICYmCisgICAgICAgICAgICAgICAgICAgYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1JHQjU1NUxFICYmCisgICAgICAgICAgICAgICAgICAgYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX0JHUjI0ICYmCisgICAgICAgICAgICAgICAgICAgYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX0JHUkEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJCTVAgbXVzdCBiZSAxYml0LCA0Yml0LCA4Yml0LCAxNmJpdCwgMjRiaXQsIG9yIDMyYml0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BORykgeworICAgICAgICBpZiAoYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1JHQkEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJQTkcgaW4gaWNvIHJlcXVpcmVzIHBpeGVsIGZvcm1hdCB0byBiZSByZ2JhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqY29kZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldChjLT5jb2RlY19pZCk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjb2RlYyAlc1xuIiwgY29kZXNjID8gY29kZXNjLT5uYW1lIDogIiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChjLT53aWR0aCA+IDI1NiB8fAorICAgICAgICBjLT5oZWlnaHQgPiAyNTYpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGRpbWVuc2lvbnMgJWR4JWQgKGRpbWVuc2lvbnMgY2Fubm90IGV4Y2VlZCAyNTZ4MjU2KVxuIiwgYy0+d2lkdGgsIGMtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWNvX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgSWNvTXV4Q29udGV4dCAqaWNvID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCByZXQ7CisgICAgaW50IGk7CisKKyAgICBpZiAoIXBiLT5zZWVrYWJsZSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT3V0cHV0IGlzIG5vdCBzZWVrYWJsZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWNvLT5jdXJyZW50X2ltYWdlID0gMDsKKyAgICBpY28tPm5iX2ltYWdlcyA9IHMtPm5iX3N0cmVhbXM7CisKKyAgICBhdmlvX3dsMTYocGIsIDApOyAvLyByZXNlcnZlZAorICAgIGF2aW9fd2wxNihwYiwgMSk7IC8vIDEgPT0gaWNvbgorICAgIGF2aW9fc2tpcChwYiwgMik7IC8vIHNraXAgdGhlIG51bWJlciBvZiBpbWFnZXMKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKHJldCA9IGljb19jaGVja19hdHRyaWJ1dGVzKHMsIHMtPnN0cmVhbXNbaV0tPmNvZGVjKSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgLy8gRmlsbCBpbiBsYXRlciB3aGVuIHdyaXRpbmcgdHJhaWxlci4uLgorICAgICAgICBhdmlvX3NraXAocGIsIDE2KTsKKyAgICB9CisKKyAgICBpY28tPmltYWdlcyA9IGF2X21hbGxvY3pfYXJyYXkoaWNvLT5uYl9pbWFnZXMsIHNpemVvZihJY29NdXhDb250ZXh0KSk7CisgICAgaWYgKCFpY28tPmltYWdlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2aW9fZmx1c2gocGIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWNvX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgSWNvTXV4Q29udGV4dCAqaWNvID0gcy0+cHJpdl9kYXRhOworICAgIEljb0ltYWdlICppbWFnZTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVkNvZGVjQ29udGV4dCAqYyA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYzsKKyAgICBpbnQgaTsKKworICAgIGlmIChpY28tPmN1cnJlbnRfaW1hZ2UgPj0gaWNvLT5uYl9pbWFnZXMpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIklDTyBhbHJlYWR5IGNvbnRhaW5zICVkIGltYWdlc1xuIiwgaWNvLT5jdXJyZW50X2ltYWdlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBpbWFnZSA9ICZpY28tPmltYWdlc1tpY28tPmN1cnJlbnRfaW1hZ2UrK107CisKKyAgICBpbWFnZS0+b2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKKyAgICBpbWFnZS0+d2lkdGggPSAoYy0+d2lkdGggPT0gMjU2KSA/IDAgOiBjLT53aWR0aDsKKyAgICBpbWFnZS0+aGVpZ2h0ID0gKGMtPmhlaWdodCA9PSAyNTYpID8gMCA6IGMtPmhlaWdodDsKKworICAgIGlmIChjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QTkcpIHsKKyAgICAgICAgaW1hZ2UtPmJpdHMgPSBjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgICAgIGltYWdlLT5zaXplID0gcGt0LT5zaXplOworCisgICAgICAgIGF2aW9fd3JpdGUocGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICB9IGVsc2UgeyAvLyBCTVAKKyAgICAgICAgaWYgKEFWX1JMMzIocGt0LT5kYXRhICsgMTQpICE9IDQwKSB7IC8vIG11c3QgYmUgQklUTUFQSU5GT0hFQURFUgorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgQk1QXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBpbWFnZS0+Yml0cyA9IEFWX1JMMTYocGt0LT5kYXRhICsgMjgpOyAvLyBhbGxvd3MgdGhpbmdzIGxpa2UgMWJpdCBhbmQgNGJpdCBpbWFnZXMgdG8gYmUgcHJlc2VydmVkCisgICAgICAgIGltYWdlLT5zaXplID0gcGt0LT5zaXplIC0gMTQgKyBjLT5oZWlnaHQgKiAoYy0+d2lkdGggKyA3KSAvIDg7CisKKyAgICAgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhICsgMTQsIDgpOyAvLyBTa2lwIHRoZSBCSVRNQVBGSUxFSEVBREVSIGhlYWRlcgorICAgICAgICBhdmlvX3dsMzIocGIsIEFWX1JMMzIocGt0LT5kYXRhICsgMjIpICogMik7IC8vIHJld3JpdGUgaGVpZ2h0IGFzIDIgKiBoZWlnaHQKKyAgICAgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhICsgMjYsIHBrdC0+c2l6ZSAtIDI2KTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+aGVpZ2h0ICogKGMtPndpZHRoICsgNykgLyA4OyArK2kpCisgICAgICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsgLy8gV3JpdGUgYml0bWFzayAob3BhcXVlKQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGljb193cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBJY29NdXhDb250ZXh0ICppY28gPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGk7CisKKyAgICBhdmlvX3NlZWsocGIsIDQsIFNFRUtfU0VUKTsKKworICAgIGF2aW9fd2wxNihwYiwgaWNvLT5jdXJyZW50X2ltYWdlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBpY28tPm5iX2ltYWdlczsgaSsrKSB7CisgICAgICAgIGF2aW9fdzgocGIsIGljby0+aW1hZ2VzW2ldLndpZHRoKTsKKyAgICAgICAgYXZpb193OChwYiwgaWNvLT5pbWFnZXNbaV0uaGVpZ2h0KTsKKworICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0JNUCAmJgorICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCAoaWNvLT5pbWFnZXNbaV0uYml0cyA+PSA4KSA/IDAgOiAxIDw8IGljby0+aW1hZ2VzW2ldLmJpdHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZpb193OChwYiwgMCk7CisgICAgICAgIH0KKworICAgICAgICBhdmlvX3c4KHBiLCAwKTsgLy8gcmVzZXJ2ZWQKKyAgICAgICAgYXZpb193bDE2KHBiLCAxKTsgLy8gY29sb3IgcGxhbmVzCisgICAgICAgIGF2aW9fd2wxNihwYiwgaWNvLT5pbWFnZXNbaV0uYml0cyk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgaWNvLT5pbWFnZXNbaV0uc2l6ZSk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgaWNvLT5pbWFnZXNbaV0ub2Zmc2V0KTsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmaWNvLT5pbWFnZXMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX2ljb19tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaWNvIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWljcm9zb2Z0IFdpbmRvd3MgSUNPIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEljb011eENvbnRleHQpLAorICAgIC5taW1lX3R5cGUgICAgICA9ICJpbWFnZS92bmQubWljcm9zb2Z0Lmljb24iLAorICAgIC5leHRlbnNpb25zICAgICA9ICJpY28iLAorICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfQk1QLAorICAgIC53cml0ZV9oZWFkZXIgICA9IGljb193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gaWNvX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgPSBpY29fd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2lkM3YxLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvaWQzdjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjE3YTljCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lkM3YxLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBJRDN2MSBoZWFkZXIgcGFyc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJpZDN2MS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisKKy8qIFNlZSBHZW5yZSBMaXN0IGF0IGh0dHA6Ly9pZDMub3JnL2lkM3YyLjMuMCAqLworY29uc3QgY2hhciAqIGNvbnN0IGZmX2lkM3YxX2dlbnJlX3N0cltJRDN2MV9HRU5SRV9NQVggKyAxXSA9IHsKKyAgICAgIFswXSA9ICJCbHVlcyIsCisgICAgICBbMV0gPSAiQ2xhc3NpYyBSb2NrIiwKKyAgICAgIFsyXSA9ICJDb3VudHJ5IiwKKyAgICAgIFszXSA9ICJEYW5jZSIsCisgICAgICBbNF0gPSAiRGlzY28iLAorICAgICAgWzVdID0gIkZ1bmsiLAorICAgICAgWzZdID0gIkdydW5nZSIsCisgICAgICBbN10gPSAiSGlwLUhvcCIsCisgICAgICBbOF0gPSAiSmF6eiIsCisgICAgICBbOV0gPSAiTWV0YWwiLAorICAgICBbMTBdID0gIk5ldyBBZ2UiLAorICAgICBbMTFdID0gIk9sZGllcyIsCisgICAgIFsxMl0gPSAiT3RoZXIiLAorICAgICBbMTNdID0gIlBvcCIsCisgICAgIFsxNF0gPSAiUiZCIiwKKyAgICAgWzE1XSA9ICJSYXAiLAorICAgICBbMTZdID0gIlJlZ2dhZSIsCisgICAgIFsxN10gPSAiUm9jayIsCisgICAgIFsxOF0gPSAiVGVjaG5vIiwKKyAgICAgWzE5XSA9ICJJbmR1c3RyaWFsIiwKKyAgICAgWzIwXSA9ICJBbHRlcm5hdGl2ZSIsCisgICAgIFsyMV0gPSAiU2thIiwKKyAgICAgWzIyXSA9ICJEZWF0aCBNZXRhbCIsCisgICAgIFsyM10gPSAiUHJhbmtzIiwKKyAgICAgWzI0XSA9ICJTb3VuZHRyYWNrIiwKKyAgICAgWzI1XSA9ICJFdXJvLVRlY2hubyIsCisgICAgIFsyNl0gPSAiQW1iaWVudCIsCisgICAgIFsyN10gPSAiVHJpcC1Ib3AiLAorICAgICBbMjhdID0gIlZvY2FsIiwKKyAgICAgWzI5XSA9ICJKYXp6K0Z1bmsiLAorICAgICBbMzBdID0gIkZ1c2lvbiIsCisgICAgIFszMV0gPSAiVHJhbmNlIiwKKyAgICAgWzMyXSA9ICJDbGFzc2ljYWwiLAorICAgICBbMzNdID0gIkluc3RydW1lbnRhbCIsCisgICAgIFszNF0gPSAiQWNpZCIsCisgICAgIFszNV0gPSAiSG91c2UiLAorICAgICBbMzZdID0gIkdhbWUiLAorICAgICBbMzddID0gIlNvdW5kIENsaXAiLAorICAgICBbMzhdID0gIkdvc3BlbCIsCisgICAgIFszOV0gPSAiTm9pc2UiLAorICAgICBbNDBdID0gIkFsdGVyblJvY2siLAorICAgICBbNDFdID0gIkJhc3MiLAorICAgICBbNDJdID0gIlNvdWwiLAorICAgICBbNDNdID0gIlB1bmsiLAorICAgICBbNDRdID0gIlNwYWNlIiwKKyAgICAgWzQ1XSA9ICJNZWRpdGF0aXZlIiwKKyAgICAgWzQ2XSA9ICJJbnN0cnVtZW50YWwgUG9wIiwKKyAgICAgWzQ3XSA9ICJJbnN0cnVtZW50YWwgUm9jayIsCisgICAgIFs0OF0gPSAiRXRobmljIiwKKyAgICAgWzQ5XSA9ICJHb3RoaWMiLAorICAgICBbNTBdID0gIkRhcmt3YXZlIiwKKyAgICAgWzUxXSA9ICJUZWNobm8tSW5kdXN0cmlhbCIsCisgICAgIFs1Ml0gPSAiRWxlY3Ryb25pYyIsCisgICAgIFs1M10gPSAiUG9wLUZvbGsiLAorICAgICBbNTRdID0gIkV1cm9kYW5jZSIsCisgICAgIFs1NV0gPSAiRHJlYW0iLAorICAgICBbNTZdID0gIlNvdXRoZXJuIFJvY2siLAorICAgICBbNTddID0gIkNvbWVkeSIsCisgICAgIFs1OF0gPSAiQ3VsdCIsCisgICAgIFs1OV0gPSAiR2FuZ3N0YSIsCisgICAgIFs2MF0gPSAiVG9wIDQwIiwKKyAgICAgWzYxXSA9ICJDaHJpc3RpYW4gUmFwIiwKKyAgICAgWzYyXSA9ICJQb3AvRnVuayIsCisgICAgIFs2M10gPSAiSnVuZ2xlIiwKKyAgICAgWzY0XSA9ICJOYXRpdmUgQW1lcmljYW4iLAorICAgICBbNjVdID0gIkNhYmFyZXQiLAorICAgICBbNjZdID0gIk5ldyBXYXZlIiwKKyAgICAgWzY3XSA9ICJQc3ljaGFkZWxpYyIsIC8qIHNpYywgdGhlIG1pc3NwZWxsaW5nIGlzIHVzZWQgaW4gdGhlIHNwZWNpZmljYXRpb24gKi8KKyAgICAgWzY4XSA9ICJSYXZlIiwKKyAgICAgWzY5XSA9ICJTaG93dHVuZXMiLAorICAgICBbNzBdID0gIlRyYWlsZXIiLAorICAgICBbNzFdID0gIkxvLUZpIiwKKyAgICAgWzcyXSA9ICJUcmliYWwiLAorICAgICBbNzNdID0gIkFjaWQgUHVuayIsCisgICAgIFs3NF0gPSAiQWNpZCBKYXp6IiwKKyAgICAgWzc1XSA9ICJQb2xrYSIsCisgICAgIFs3Nl0gPSAiUmV0cm8iLAorICAgICBbNzddID0gIk11c2ljYWwiLAorICAgICBbNzhdID0gIlJvY2sgJiBSb2xsIiwKKyAgICAgWzc5XSA9ICJIYXJkIFJvY2siLAorICAgICBbODBdID0gIkZvbGsiLAorICAgICBbODFdID0gIkZvbGstUm9jayIsCisgICAgIFs4Ml0gPSAiTmF0aW9uYWwgRm9sayIsCisgICAgIFs4M10gPSAiU3dpbmciLAorICAgICBbODRdID0gIkZhc3QgRnVzaW9uIiwKKyAgICAgWzg1XSA9ICJCZWJvYiIsCisgICAgIFs4Nl0gPSAiTGF0aW4iLAorICAgICBbODddID0gIlJldml2YWwiLAorICAgICBbODhdID0gIkNlbHRpYyIsCisgICAgIFs4OV0gPSAiQmx1ZWdyYXNzIiwKKyAgICAgWzkwXSA9ICJBdmFudGdhcmRlIiwKKyAgICAgWzkxXSA9ICJHb3RoaWMgUm9jayIsCisgICAgIFs5Ml0gPSAiUHJvZ3Jlc3NpdmUgUm9jayIsCisgICAgIFs5M10gPSAiUHN5Y2hlZGVsaWMgUm9jayIsCisgICAgIFs5NF0gPSAiU3ltcGhvbmljIFJvY2siLAorICAgICBbOTVdID0gIlNsb3cgUm9jayIsCisgICAgIFs5Nl0gPSAiQmlnIEJhbmQiLAorICAgICBbOTddID0gIkNob3J1cyIsCisgICAgIFs5OF0gPSAiRWFzeSBMaXN0ZW5pbmciLAorICAgICBbOTldID0gIkFjb3VzdGljIiwKKyAgICBbMTAwXSA9ICJIdW1vdXIiLAorICAgIFsxMDFdID0gIlNwZWVjaCIsCisgICAgWzEwMl0gPSAiQ2hhbnNvbiIsCisgICAgWzEwM10gPSAiT3BlcmEiLAorICAgIFsxMDRdID0gIkNoYW1iZXIgTXVzaWMiLAorICAgIFsxMDVdID0gIlNvbmF0YSIsCisgICAgWzEwNl0gPSAiU3ltcGhvbnkiLAorICAgIFsxMDddID0gIkJvb3R5IEJhc3MiLAorICAgIFsxMDhdID0gIlByaW11cyIsCisgICAgWzEwOV0gPSAiUG9ybiBHcm9vdmUiLAorICAgIFsxMTBdID0gIlNhdGlyZSIsCisgICAgWzExMV0gPSAiU2xvdyBKYW0iLAorICAgIFsxMTJdID0gIkNsdWIiLAorICAgIFsxMTNdID0gIlRhbmdvIiwKKyAgICBbMTE0XSA9ICJTYW1iYSIsCisgICAgWzExNV0gPSAiRm9sa2xvcmUiLAorICAgIFsxMTZdID0gIkJhbGxhZCIsCisgICAgWzExN10gPSAiUG93ZXIgQmFsbGFkIiwKKyAgICBbMTE4XSA9ICJSaHl0aG1pYyBTb3VsIiwKKyAgICBbMTE5XSA9ICJGcmVlc3R5bGUiLAorICAgIFsxMjBdID0gIkR1ZXQiLAorICAgIFsxMjFdID0gIlB1bmsgUm9jayIsCisgICAgWzEyMl0gPSAiRHJ1bSBTb2xvIiwKKyAgICBbMTIzXSA9ICJBIGNhcGVsbGEiLAorICAgIFsxMjRdID0gIkV1cm8tSG91c2UiLAorICAgIFsxMjVdID0gIkRhbmNlIEhhbGwiLAorICAgIFsxMjZdID0gIkdvYSIsCisgICAgWzEyN10gPSAiRHJ1bSAmIEJhc3MiLAorICAgIFsxMjhdID0gIkNsdWItSG91c2UiLAorICAgIFsxMjldID0gIkhhcmRjb3JlIiwKKyAgICBbMTMwXSA9ICJUZXJyb3IiLAorICAgIFsxMzFdID0gIkluZGllIiwKKyAgICBbMTMyXSA9ICJCcml0UG9wIiwKKyAgICBbMTMzXSA9ICJOZWdlcnB1bmsiLAorICAgIFsxMzRdID0gIlBvbHNrIFB1bmsiLAorICAgIFsxMzVdID0gIkJlYXQiLAorICAgIFsxMzZdID0gIkNocmlzdGlhbiBHYW5nc3RhIiwKKyAgICBbMTM3XSA9ICJIZWF2eSBNZXRhbCIsCisgICAgWzEzOF0gPSAiQmxhY2sgTWV0YWwiLAorICAgIFsxMzldID0gIkNyb3Nzb3ZlciIsCisgICAgWzE0MF0gPSAiQ29udGVtcG9yYXJ5IENocmlzdGlhbiIsCisgICAgWzE0MV0gPSAiQ2hyaXN0aWFuIFJvY2siLAorICAgIFsxNDJdID0gIk1lcmVuZ3VlIiwKKyAgICBbMTQzXSA9ICJTYWxzYSIsCisgICAgWzE0NF0gPSAiVGhyYXNoIE1ldGFsIiwKKyAgICBbMTQ1XSA9ICJBbmltZSIsCisgICAgWzE0Nl0gPSAiSlBvcCIsCisgICAgWzE0N10gPSAiU3ludGhQb3AiLAorfTsKKworc3RhdGljIHZvaWQgZ2V0X3N0cmluZyhBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgaW50IGksIGM7CisgICAgY2hhciAqcSwgc3RyWzUxMl07CisKKyAgICBxID0gc3RyOworICAgIGZvcihpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgYyA9IGJ1ZltpXTsKKyAgICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoKHEgLSBzdHIpID49IHNpemVvZihzdHIpIC0gMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAqcSsrID0gYzsKKyAgICB9CisgICAgKnEgPSAnXDAnOworCisgICAgaWYgKCpzdHIpCisgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwga2V5LCBzdHIsIDApOworfQorCisvKioKKyAqIFBhcnNlIGFuIElEM3YxIHRhZworICoKKyAqIEBwYXJhbSBidWYgSUQzdjFfVEFHX1NJWkUgbG9uZyBidWZmZXIgY29udGFpbmluZyB0aGUgdGFnCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmKQoreworICAgIGludCBnZW5yZTsKKworICAgIGlmICghKGJ1ZlswXSA9PSAnVCcgJiYKKyAgICAgICAgICBidWZbMV0gPT0gJ0EnICYmCisgICAgICAgICAgYnVmWzJdID09ICdHJykpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBnZXRfc3RyaW5nKHMsICJ0aXRsZSIsICAgYnVmICsgIDMsIDMwKTsKKyAgICBnZXRfc3RyaW5nKHMsICJhcnRpc3QiLCAgYnVmICsgMzMsIDMwKTsKKyAgICBnZXRfc3RyaW5nKHMsICJhbGJ1bSIsICAgYnVmICsgNjMsIDMwKTsKKyAgICBnZXRfc3RyaW5nKHMsICJkYXRlIiwgICAgYnVmICsgOTMsICA0KTsKKyAgICBnZXRfc3RyaW5nKHMsICJjb21tZW50IiwgYnVmICsgOTcsIDMwKTsKKyAgICBpZiAoYnVmWzEyNV0gPT0gMCAmJiBidWZbMTI2XSAhPSAwKSB7CisgICAgICAgIGF2X2RpY3Rfc2V0X2ludCgmcy0+bWV0YWRhdGEsICJ0cmFjayIsIGJ1ZlsxMjZdLCAwKTsKKyAgICB9CisgICAgZ2VucmUgPSBidWZbMTI3XTsKKyAgICBpZiAoZ2VucmUgPD0gSUQzdjFfR0VOUkVfTUFYKQorICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJnZW5yZSIsIGZmX2lkM3YxX2dlbnJlX3N0cltnZW5yZV0sIDApOworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX2lkM3YxX3JlYWQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCByZXQ7CisgICAgdWludDhfdCBidWZbSUQzdjFfVEFHX1NJWkVdOworICAgIGludDY0X3QgZmlsZXNpemUsIHBvc2l0aW9uID0gYXZpb190ZWxsKHMtPnBiKTsKKworICAgIGlmIChzLT5wYi0+c2Vla2FibGUpIHsKKyAgICAgICAgLyogWFhYOiBjaGFuZ2UgdGhhdCAqLworICAgICAgICBmaWxlc2l6ZSA9IGF2aW9fc2l6ZShzLT5wYik7CisgICAgICAgIGlmIChmaWxlc2l6ZSA+IDEyOCkgeworICAgICAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBmaWxlc2l6ZSAtIDEyOCwgU0VFS19TRVQpOworICAgICAgICAgICAgcmV0ID0gYXZpb19yZWFkKHMtPnBiLCBidWYsIElEM3YxX1RBR19TSVpFKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gSUQzdjFfVEFHX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBwYXJzZV90YWcocywgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgcG9zaXRpb24sIFNFRUtfU0VUKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9pZDN2MS5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lkM3YxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkY2EzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pZDN2MS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBJRDN2MSBoZWFkZXIgcGFyc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfSUQzVjFfSAorI2RlZmluZSBBVkZPUk1BVF9JRDNWMV9ICisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCisjZGVmaW5lIElEM3YxX1RBR19TSVpFIDEyOAorCisjZGVmaW5lIElEM3YxX0dFTlJFX01BWCAxNDcKKworLyoqCisgKiBJRDN2MSBnZW5yZXMKKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBmZl9pZDN2MV9nZW5yZV9zdHJbSUQzdjFfR0VOUkVfTUFYICsgMV07CisKKy8qKgorICogUmVhZCBhbiBJRDN2MSB0YWcKKyAqLwordm9pZCBmZl9pZDN2MV9yZWFkKEFWRm9ybWF0Q29udGV4dCAqcyk7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9JRDNWMV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaWQzdjIuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pZDN2Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZjQzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaWQzdjIuYwpAQCAtMCwwICsxLDEwNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIElEM3YyIGhlYWRlciBwYXJzZXIKKyAqCisgKiBTcGVjaWZpY2F0aW9ucyBhdmFpbGFibGUgYXQ6CisgKiBodHRwOi8vaWQzLm9yZy9EZXZlbG9wZXJfSW5mb3JtYXRpb24KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBDT05GSUdfWkxJQgorI2luY2x1ZGUgPHpsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiaWQzdjEuaCIKKyNpbmNsdWRlICJpZDN2Mi5oIgorCitjb25zdCBBVk1ldGFkYXRhQ29udiBmZl9pZDN2Ml8zNF9tZXRhZGF0YV9jb252W10gPSB7CisgICAgeyAiVEFMQiIsICJhbGJ1bSIgICAgICAgIH0sCisgICAgeyAiVENPTSIsICJjb21wb3NlciIgICAgIH0sCisgICAgeyAiVENPTiIsICJnZW5yZSIgICAgICAgIH0sCisgICAgeyAiVENPUCIsICJjb3B5cmlnaHQiICAgIH0sCisgICAgeyAiVEVOQyIsICJlbmNvZGVkX2J5IiAgIH0sCisgICAgeyAiVElUMiIsICJ0aXRsZSIgICAgICAgIH0sCisgICAgeyAiVExBTiIsICJsYW5ndWFnZSIgICAgIH0sCisgICAgeyAiVFBFMSIsICJhcnRpc3QiICAgICAgIH0sCisgICAgeyAiVFBFMiIsICJhbGJ1bV9hcnRpc3QiIH0sCisgICAgeyAiVFBFMyIsICJwZXJmb3JtZXIiICAgIH0sCisgICAgeyAiVFBPUyIsICJkaXNjIiAgICAgICAgIH0sCisgICAgeyAiVFBVQiIsICJwdWJsaXNoZXIiICAgIH0sCisgICAgeyAiVFJDSyIsICJ0cmFjayIgICAgICAgIH0sCisgICAgeyAiVFNTRSIsICJlbmNvZGVyIiAgICAgIH0sCisgICAgeyAwIH0KK307CisKK2NvbnN0IEFWTWV0YWRhdGFDb252IGZmX2lkM3YyXzRfbWV0YWRhdGFfY29udltdID0geworICAgIHsgIlRDTVAiLCAiY29tcGlsYXRpb24iICAgfSwKKyAgICB7ICJURFJDIiwgImRhdGUiICAgICAgICAgIH0sCisgICAgeyAiVERSTCIsICJkYXRlIiAgICAgICAgICB9LAorICAgIHsgIlRERU4iLCAiY3JlYXRpb25fdGltZSIgfSwKKyAgICB7ICJUU09BIiwgImFsYnVtLXNvcnQiICAgIH0sCisgICAgeyAiVFNPUCIsICJhcnRpc3Qtc29ydCIgICB9LAorICAgIHsgIlRTT1QiLCAidGl0bGUtc29ydCIgICAgfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFWTWV0YWRhdGFDb252IGlkM3YyXzJfbWV0YWRhdGFfY29udltdID0geworICAgIHsgIlRBTCIsICJhbGJ1bSIgICAgICAgIH0sCisgICAgeyAiVENPIiwgImdlbnJlIiAgICAgICAgfSwKKyAgICB7ICJUQ1AiLCAiY29tcGlsYXRpb24iICB9LAorICAgIHsgIlRUMiIsICJ0aXRsZSIgICAgICAgIH0sCisgICAgeyAiVEVOIiwgImVuY29kZWRfYnkiICAgfSwKKyAgICB7ICJUUDEiLCAiYXJ0aXN0IiAgICAgICB9LAorICAgIHsgIlRQMiIsICJhbGJ1bV9hcnRpc3QiIH0sCisgICAgeyAiVFAzIiwgInBlcmZvcm1lciIgICAgfSwKKyAgICB7ICJUUksiLCAidHJhY2siICAgICAgICB9LAorICAgIHsgMCB9Cit9OworCitjb25zdCBjaGFyIGZmX2lkM3YyX3RhZ3NbXVs0XSA9IHsKKyAgICAiVEFMQiIsICJUQlBNIiwgIlRDT00iLCAiVENPTiIsICJUQ09QIiwgIlRETFkiLCAiVEVOQyIsICJURVhUIiwKKyAgICAiVEZMVCIsICJUSVQxIiwgIlRJVDIiLCAiVElUMyIsICJUS0VZIiwgIlRMQU4iLCAiVExFTiIsICJUTUVEIiwKKyAgICAiVE9BTCIsICJUT0ZOIiwgIlRPTFkiLCAiVE9QRSIsICJUT1dOIiwgIlRQRTEiLCAiVFBFMiIsICJUUEUzIiwKKyAgICAiVFBFNCIsICJUUE9TIiwgIlRQVUIiLCAiVFJDSyIsICJUUlNOIiwgIlRSU08iLCAiVFNSQyIsICJUU1NFIiwKKyAgICB7IDAgfSwKK307CisKK2NvbnN0IGNoYXIgZmZfaWQzdjJfNF90YWdzW11bNF0gPSB7CisgICAgIlRERU4iLCAiVERPUiIsICJURFJDIiwgIlREUkwiLCAiVERURyIsICJUSVBMIiwgIlRNQ0wiLCAiVE1PTyIsCisgICAgIlRQUk8iLCAiVFNPQSIsICJUU09QIiwgIlRTT1QiLCAiVFNTVCIsCisgICAgeyAwIH0sCit9OworCitjb25zdCBjaGFyIGZmX2lkM3YyXzNfdGFnc1tdWzRdID0geworICAgICJUREFUIiwgIlRJTUUiLCAiVE9SWSIsICJUUkRBIiwgIlRTSVoiLCAiVFlFUiIsCisgICAgeyAwIH0sCit9OworCitjb25zdCBjaGFyICpmZl9pZDN2Ml9waWN0dXJlX3R5cGVzWzIxXSA9IHsKKyAgICAiT3RoZXIiLAorICAgICIzMngzMiBwaXhlbHMgJ2ZpbGUgaWNvbiciLAorICAgICJPdGhlciBmaWxlIGljb24iLAorICAgICJDb3ZlciAoZnJvbnQpIiwKKyAgICAiQ292ZXIgKGJhY2spIiwKKyAgICAiTGVhZmxldCBwYWdlIiwKKyAgICAiTWVkaWEgKGUuZy4gbGFiZWwgc2lkZSBvZiBDRCkiLAorICAgICJMZWFkIGFydGlzdC9sZWFkIHBlcmZvcm1lci9zb2xvaXN0IiwKKyAgICAiQXJ0aXN0L3BlcmZvcm1lciIsCisgICAgIkNvbmR1Y3RvciIsCisgICAgIkJhbmQvT3JjaGVzdHJhIiwKKyAgICAiQ29tcG9zZXIiLAorICAgICJMeXJpY2lzdC90ZXh0IHdyaXRlciIsCisgICAgIlJlY29yZGluZyBMb2NhdGlvbiIsCisgICAgIkR1cmluZyByZWNvcmRpbmciLAorICAgICJEdXJpbmcgcGVyZm9ybWFuY2UiLAorICAgICJNb3ZpZS92aWRlbyBzY3JlZW4gY2FwdHVyZSIsCisgICAgIkEgYnJpZ2h0IGNvbG91cmVkIGZpc2giLAorICAgICJJbGx1c3RyYXRpb24iLAorICAgICJCYW5kL2FydGlzdCBsb2dvdHlwZSIsCisgICAgIlB1Ymxpc2hlci9TdHVkaW8gbG9nb3R5cGUiLAorfTsKKworY29uc3QgQ29kZWNNaW1lIGZmX2lkM3YyX21pbWVfdGFnc1tdID0geworICAgIHsgImltYWdlL2dpZiIsICBBVl9DT0RFQ19JRF9HSUYgICB9LAorICAgIHsgImltYWdlL2pwZWciLCBBVl9DT0RFQ19JRF9NSlBFRyB9LAorICAgIHsgImltYWdlL2pwZyIsICBBVl9DT0RFQ19JRF9NSlBFRyB9LAorICAgIHsgImltYWdlL3BuZyIsICBBVl9DT0RFQ19JRF9QTkcgICB9LAorICAgIHsgImltYWdlL3RpZmYiLCBBVl9DT0RFQ19JRF9USUZGICB9LAorICAgIHsgImltYWdlL2JtcCIsICBBVl9DT0RFQ19JRF9CTVAgICB9LAorICAgIHsgIkpQRyIsICAgICAgICBBVl9DT0RFQ19JRF9NSlBFRyB9LCAvKiBJRDN2Mi4yICAqLworICAgIHsgIlBORyIsICAgICAgICBBVl9DT0RFQ19JRF9QTkcgICB9LCAvKiBJRDN2Mi4yICAqLworICAgIHsgIiIsICAgICAgICAgICBBVl9DT0RFQ19JRF9OT05FICB9LAorfTsKKworaW50IGZmX2lkM3YyX21hdGNoKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgY29uc3QgY2hhciAqbWFnaWMpCit7CisgICAgcmV0dXJuICBidWZbMF0gICAgICAgICA9PSBtYWdpY1swXSAmJgorICAgICAgICAgICAgYnVmWzFdICAgICAgICAgPT0gbWFnaWNbMV0gJiYKKyAgICAgICAgICAgIGJ1ZlsyXSAgICAgICAgID09IG1hZ2ljWzJdICYmCisgICAgICAgICAgICBidWZbM10gICAgICAgICAhPSAweGZmICAgICAmJgorICAgICAgICAgICAgYnVmWzRdICAgICAgICAgIT0gMHhmZiAgICAgJiYKKyAgICAgICAgICAgKGJ1Zls2XSAmIDB4ODApID09IDAgICAgICAgICYmCisgICAgICAgICAgIChidWZbN10gJiAweDgwKSA9PSAwICAgICAgICAmJgorICAgICAgICAgICAoYnVmWzhdICYgMHg4MCkgPT0gMCAgICAgICAgJiYKKyAgICAgICAgICAgKGJ1Zls5XSAmIDB4ODApID09IDA7Cit9CisKK2ludCBmZl9pZDN2Ml90YWdfbGVuKGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKyAgICBpbnQgbGVuID0gKChidWZbNl0gJiAweDdmKSA8PCAyMSkgKworICAgICAgICAgICAgICAoKGJ1Zls3XSAmIDB4N2YpIDw8IDE0KSArCisgICAgICAgICAgICAgICgoYnVmWzhdICYgMHg3ZikgPDwgNykgKworICAgICAgICAgICAgICAoYnVmWzldICYgMHg3ZikgKworICAgICAgICAgICAgICBJRDN2Ml9IRUFERVJfU0laRTsKKyAgICBpZiAoYnVmWzVdICYgMHgxMCkKKyAgICAgICAgbGVuICs9IElEM3YyX0hFQURFUl9TSVpFOworICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3NpemUoQVZJT0NvbnRleHQgKnMsIGludCBsZW4pCit7CisgICAgaW50IHYgPSAwOworICAgIHdoaWxlIChsZW4tLSkKKyAgICAgICAgdiA9ICh2IDw8IDcpICsgKGF2aW9fcjgocykgJiAweDdGKTsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzaXplX3RvX3N5bmNzYWZlKHVuc2lnbmVkIGludCBzaXplKQoreworICAgIHJldHVybiAoKChzaXplKSAmICgweDdmIDw8ICAwKSkgPj4gMCkgKworICAgICAgICAgICAoKChzaXplKSAmICgweDdmIDw8ICA4KSkgPj4gMSkgKworICAgICAgICAgICAoKChzaXplKSAmICgweDdmIDw8IDE2KSkgPj4gMikgKworICAgICAgICAgICAoKChzaXplKSAmICgweDdmIDw8IDI0KSkgPj4gMyk7Cit9CisKKy8qIE5vIHJlYWwgdmVyaWZpY2F0aW9uLCBvbmx5IGNoZWNrIHRoYXQgdGhlIHRhZyBjb25zaXN0cyBvZgorICogYSBjb21iaW5hdGlvbiBvZiBjYXBpdGFsIGFscGhhLW51bWVyaWNhbCBjaGFyYWN0ZXJzICovCitzdGF0aWMgaW50IGlzX3RhZyhjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW4pCit7CisgICAgaWYgKCFsZW4pCisgICAgICAgIHJldHVybiAwOworCisgICAgd2hpbGUgKGxlbi0tKQorICAgICAgICBpZiAoKGJ1ZltsZW5dIDwgJ0EnIHx8CisgICAgICAgICAgICAgYnVmW2xlbl0gPiAnWicpICYmCisgICAgICAgICAgICAoYnVmW2xlbl0gPCAnMCcgfHwKKyAgICAgICAgICAgICBidWZbbGVuXSA+ICc5JykpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAxOworfQorCisvKioKKyAqIFJldHVybiAxIGlmIHRoZSB0YWcgb2YgbGVuZ3RoIGxlbiBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIHZhbGlkLCAwIGlmIG5vdCwgLTEgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBjaGVja190YWcoQVZJT0NvbnRleHQgKnMsIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4pCit7CisgICAgY2hhciB0YWdbNF07CisKKyAgICBpZiAobGVuID4gNCB8fAorICAgICAgICBhdmlvX3NlZWsocywgb2Zmc2V0LCBTRUVLX1NFVCkgPCAwIHx8CisgICAgICAgIGF2aW9fcmVhZChzLCB0YWcsIGxlbikgPCBsZW4pCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlIGlmICghQVZfUkIzMih0YWcpIHx8IGlzX3RhZyh0YWcsIGxlbikpCisgICAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRnJlZSBHRU9CIHR5cGUgZXh0cmEgbWV0YWRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfZ2VvYnRhZyh2b2lkICpvYmopCit7CisgICAgSUQzdjJFeHRyYU1ldGFHRU9CICpnZW9iID0gb2JqOworICAgIGF2X2ZyZWUoZ2VvYi0+bWltZV90eXBlKTsKKyAgICBhdl9mcmVlKGdlb2ItPmZpbGVfbmFtZSk7CisgICAgYXZfZnJlZShnZW9iLT5kZXNjcmlwdGlvbik7CisgICAgYXZfZnJlZShnZW9iLT5kYXRhKTsKKyAgICBhdl9mcmVlKGdlb2IpOworfQorCisvKioKKyAqIERlY29kZSBjaGFyYWN0ZXJzIHRvIFVURi04IGFjY29yZGluZyB0byBlbmNvZGluZyB0eXBlLiBUaGUgZGVjb2RlZCBidWZmZXIgaXMKKyAqIGFsd2F5cyBudWxsIHRlcm1pbmF0ZWQuIFN0b3AgcmVhZGluZyB3aGVuIGVpdGhlciAqbWF4cmVhZCBieXRlcyBhcmUgcmVhZCBmcm9tCisgKiBwYiBvciBVKzAwMDAgY2hhcmFjdGVyIGlzIGZvdW5kLgorICoKKyAqIEBwYXJhbSBkc3QgUG9pbnRlciB3aGVyZSB0aGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIHdpdGggdGhlIGRlY29kZWQgYnl0ZXMgaXMKKyAqIHN0b3JlZC4gQnVmZmVyIG11c3QgYmUgZnJlZWQgYnkgY2FsbGVyLgorICogQHBhcmFtIG1heHJlYWQgUG9pbnRlciB0byBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgZnJvbSB0aGUKKyAqIEFWSU9Db250ZXh0LiBBZnRlciBleGVjdXRpb24gdGhlIHZhbHVlIGlzIGRlY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqIGFjdHVhbGx5IHJlYWQuCisgKiBAcmV0dXJucyAwIGlmIG5vIGVycm9yIG9jY3VycmVkLCBkc3QgaXMgdW5pbml0aWFsaXplZCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IGRlY29kZV9zdHIoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIGludCBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqZHN0LCBpbnQgKm1heHJlYWQpCit7CisgICAgaW50IHJldDsKKyAgICB1aW50OF90IHRtcDsKKyAgICB1aW50MzJfdCBjaCA9IDE7CisgICAgaW50IGxlZnQgPSAqbWF4cmVhZDsKKyAgICB1bnNpZ25lZCBpbnQgKCpnZXQpKEFWSU9Db250ZXh0KikgPSBhdmlvX3JiMTY7CisgICAgQVZJT0NvbnRleHQgKmR5bmJ1ZjsKKworICAgIGlmICgocmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJmR5bmJ1ZikpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3Igb3BlbmluZyBtZW1vcnkgc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGVuY29kaW5nKSB7CisgICAgY2FzZSBJRDN2Ml9FTkNPRElOR19JU084ODU5OgorICAgICAgICB3aGlsZSAobGVmdCAmJiBjaCkgeworICAgICAgICAgICAgY2ggPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIFBVVF9VVEY4KGNoLCB0bXAsIGF2aW9fdzgoZHluYnVmLCB0bXApOykKKyAgICAgICAgICAgIGxlZnQtLTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgSUQzdjJfRU5DT0RJTkdfVVRGMTZCT006CisgICAgICAgIGlmICgobGVmdCAtPSAyKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgcmVhZCBCT00gdmFsdWUsIGlucHV0IHRvbyBzaG9ydFxuIik7CisgICAgICAgICAgICBhdmlvX2Nsb3NlX2R5bl9idWYoZHluYnVmLCBkc3QpOworICAgICAgICAgICAgYXZfZnJlZXAoZHN0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYXZpb19yYjE2KHBiKSkgeworICAgICAgICBjYXNlIDB4ZmZmZToKKyAgICAgICAgICAgIGdldCA9IGF2aW9fcmwxNjsKKyAgICAgICAgY2FzZSAweGZlZmY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgQk9NIHZhbHVlXG4iKTsKKyAgICAgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1ZihkeW5idWYsIGRzdCk7CisgICAgICAgICAgICBhdl9mcmVlcChkc3QpOworICAgICAgICAgICAgKm1heHJlYWQgPSBsZWZ0OworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbC10aHJvdWdoCisKKyAgICBjYXNlIElEM3YyX0VOQ09ESU5HX1VURjE2QkU6CisgICAgICAgIHdoaWxlICgobGVmdCA+IDEpICYmIGNoKSB7CisgICAgICAgICAgICBHRVRfVVRGMTYoY2gsICgobGVmdCAtPSAyKSA+PSAwID8gZ2V0KHBiKSA6IDApLCBicmVhazspCisgICAgICAgICAgICBQVVRfVVRGOChjaCwgdG1wLCBhdmlvX3c4KGR5bmJ1ZiwgdG1wKTspCisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlZnQgPCAwKQorICAgICAgICAgICAgbGVmdCArPSAyOyAgLyogZGlkIG5vdCByZWFkIGxhc3QgY2hhciBmcm9tIHBiICovCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBJRDN2Ml9FTkNPRElOR19VVEY4OgorICAgICAgICB3aGlsZSAobGVmdCAmJiBjaCkgeworICAgICAgICAgICAgY2ggPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIGF2aW9fdzgoZHluYnVmLCBjaCk7CisgICAgICAgICAgICBsZWZ0LS07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBlbmNvZGluZ1xuIik7CisgICAgfQorCisgICAgaWYgKGNoKQorICAgICAgICBhdmlvX3c4KGR5bmJ1ZiwgMCk7CisKKyAgICBhdmlvX2Nsb3NlX2R5bl9idWYoZHluYnVmLCBkc3QpOworICAgICptYXhyZWFkID0gbGVmdDsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFBhcnNlIGEgdGV4dCB0YWcuCisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfdHRhZyhBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSwgY29uc3QgY2hhciAqa2V5KQoreworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBpbnQgZW5jb2RpbmcsIGRpY3RfZmxhZ3MgPSBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFIHwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUw7CisgICAgdW5zaWduZWQgZ2VucmU7CisKKyAgICBpZiAodGFnbGVuIDwgMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZW5jb2RpbmcgPSBhdmlvX3I4KHBiKTsKKyAgICB0YWdsZW4tLTsgLyogYWNjb3VudCBmb3IgZW5jb2RpbmcgdHlwZSBieXRlICovCisKKyAgICBpZiAoZGVjb2RlX3N0cihzLCBwYiwgZW5jb2RpbmcsICZkc3QsICZ0YWdsZW4pIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBmcmFtZSAlcywgc2tpcHBlZFxuIiwga2V5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghKHN0cmNtcChrZXksICJUQ09OIikgJiYgc3RyY21wKGtleSwgIlRDTyIpKSAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAoc3NjYW5mKGRzdCwgIiglZCkiLCAmZ2VucmUpID09IDEgfHwgc3NjYW5mKGRzdCwgIiVkIiwgJmdlbnJlKSA9PSAxKSAmJgorICAgICAgICBnZW5yZSA8PSBJRDN2MV9HRU5SRV9NQVgpIHsKKyAgICAgICAgYXZfZnJlZXAoJmRzdCk7CisgICAgICAgIGRzdCA9IGF2X3N0cmR1cChmZl9pZDN2MV9nZW5yZV9zdHJbZ2VucmVdKTsKKyAgICB9IGVsc2UgaWYgKCEoc3RyY21wKGtleSwgIlRYWFgiKSAmJiBzdHJjbXAoa2V5LCAiVFhYIikpKSB7CisgICAgICAgIC8qIGRzdCBub3cgY29udGFpbnMgdGhlIGtleSwgbmVlZCB0byBnZXQgdmFsdWUgKi8KKyAgICAgICAga2V5ID0gZHN0OworICAgICAgICBpZiAoZGVjb2RlX3N0cihzLCBwYiwgZW5jb2RpbmcsICZkc3QsICZ0YWdsZW4pIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVycm9yIHJlYWRpbmcgZnJhbWUgJXMsIHNraXBwZWRcbiIsIGtleSk7CisgICAgICAgICAgICBhdl9mcmVlcCgma2V5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBkaWN0X2ZsYWdzIHw9IEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZOworICAgIH0gZWxzZSBpZiAoISpkc3QpCisgICAgICAgIGF2X2ZyZWVwKCZkc3QpOworCisgICAgaWYgKGRzdCkKKyAgICAgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsIGtleSwgZHN0LCBkaWN0X2ZsYWdzKTsKK30KKworLyoqCisgKiBQYXJzZSBHRU9CIHRhZyBpbnRvIGEgSUQzdjJFeHRyYU1ldGFHRU9CIHN0cnVjdC4KKyAqLworc3RhdGljIHZvaWQgcmVhZF9nZW9idGFnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBpbnQgdGFnbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnRhZywgSUQzdjJFeHRyYU1ldGEgKipleHRyYV9tZXRhLCBpbnQgaXN2MzQpCit7CisgICAgSUQzdjJFeHRyYU1ldGFHRU9CICpnZW9iX2RhdGEgPSBOVUxMOworICAgIElEM3YyRXh0cmFNZXRhICpuZXdfZXh0cmEgICAgID0gTlVMTDsKKyAgICBjaGFyIGVuY29kaW5nOworICAgIHVuc2lnbmVkIGludCBsZW47CisKKyAgICBpZiAodGFnbGVuIDwgMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZ2VvYl9kYXRhID0gYXZfbWFsbG9jeihzaXplb2YoSUQzdjJFeHRyYU1ldGFHRU9CKSk7CisgICAgaWYgKCFnZW9iX2RhdGEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvYyAlIlNJWkVfU1BFQ0lGSUVSIiBieXRlc1xuIiwKKyAgICAgICAgICAgICAgIHNpemVvZihJRDN2MkV4dHJhTWV0YUdFT0IpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5ld19leHRyYSA9IGF2X21hbGxvY3ooc2l6ZW9mKElEM3YyRXh0cmFNZXRhKSk7CisgICAgaWYgKCFuZXdfZXh0cmEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvYyAlIlNJWkVfU1BFQ0lGSUVSIiBieXRlc1xuIiwKKyAgICAgICAgICAgICAgIHNpemVvZihJRDN2MkV4dHJhTWV0YSkpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogcmVhZCBlbmNvZGluZyB0eXBlIGJ5dGUgKi8KKyAgICBlbmNvZGluZyA9IGF2aW9fcjgocGIpOworICAgIHRhZ2xlbi0tOworCisgICAgLyogcmVhZCBNSU1FIHR5cGUgKGFsd2F5cyBJU08tODg1OSkgKi8KKyAgICBpZiAoZGVjb2RlX3N0cihzLCBwYiwgSUQzdjJfRU5DT0RJTkdfSVNPODg1OSwgJmdlb2JfZGF0YS0+bWltZV90eXBlLAorICAgICAgICAgICAgICAgICAgICZ0YWdsZW4pIDwgMCB8fAorICAgICAgICB0YWdsZW4gPD0gMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgLyogcmVhZCBmaWxlIG5hbWUgKi8KKyAgICBpZiAoZGVjb2RlX3N0cihzLCBwYiwgZW5jb2RpbmcsICZnZW9iX2RhdGEtPmZpbGVfbmFtZSwgJnRhZ2xlbikgPCAwIHx8CisgICAgICAgIHRhZ2xlbiA8PSAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiByZWFkIGNvbnRlbnQgZGVzY3JpcHRpb24gKi8KKyAgICBpZiAoZGVjb2RlX3N0cihzLCBwYiwgZW5jb2RpbmcsICZnZW9iX2RhdGEtPmRlc2NyaXB0aW9uLCAmdGFnbGVuKSA8IDAgfHwKKyAgICAgICAgdGFnbGVuIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKHRhZ2xlbikgeworICAgICAgICAvKiBzYXZlIGVuY2Fwc3VsYXRlZCBiaW5hcnkgZGF0YSAqLworICAgICAgICBnZW9iX2RhdGEtPmRhdGEgPSBhdl9tYWxsb2ModGFnbGVuKTsKKyAgICAgICAgaWYgKCFnZW9iX2RhdGEtPmRhdGEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2MgJWQgYnl0ZXNcbiIsIHRhZ2xlbik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChsZW4gPSBhdmlvX3JlYWQocGIsIGdlb2JfZGF0YS0+ZGF0YSwgdGFnbGVuKSkgPCB0YWdsZW4pCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgR0VPQiBmcmFtZSwgZGF0YSB0cnVuY2F0ZWQuXG4iKTsKKyAgICAgICAgZ2VvYl9kYXRhLT5kYXRhc2l6ZSA9IGxlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBnZW9iX2RhdGEtPmRhdGEgICAgID0gTlVMTDsKKyAgICAgICAgZ2VvYl9kYXRhLT5kYXRhc2l6ZSA9IDA7CisgICAgfQorCisgICAgLyogYWRkIGRhdGEgdG8gdGhlIGxpc3QgKi8KKyAgICBuZXdfZXh0cmEtPnRhZyAgPSAiR0VPQiI7CisgICAgbmV3X2V4dHJhLT5kYXRhID0gZ2VvYl9kYXRhOworICAgIG5ld19leHRyYS0+bmV4dCA9ICpleHRyYV9tZXRhOworICAgICpleHRyYV9tZXRhICAgICA9IG5ld19leHRyYTsKKworICAgIHJldHVybjsKKworZmFpbDoKKyAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBmcmFtZSAlcywgc2tpcHBlZFxuIiwgdGFnKTsKKyAgICBmcmVlX2dlb2J0YWcoZ2VvYl9kYXRhKTsKKyAgICBhdl9mcmVlKG5ld19leHRyYSk7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW50IGlzX251bWJlcihjb25zdCBjaGFyICpzdHIpCit7CisgICAgd2hpbGUgKCpzdHIgPj0gJzAnICYmICpzdHIgPD0gJzknKQorICAgICAgICBzdHIrKzsKKyAgICByZXR1cm4gISpzdHI7Cit9CisKK3N0YXRpYyBBVkRpY3Rpb25hcnlFbnRyeSAqZ2V0X2RhdGVfdGFnKEFWRGljdGlvbmFyeSAqbSwgY29uc3QgY2hhciAqdGFnKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0OworICAgIGlmICgodCA9IGF2X2RpY3RfZ2V0KG0sIHRhZywgTlVMTCwgQVZfRElDVF9NQVRDSF9DQVNFKSkgJiYKKyAgICAgICAgc3RybGVuKHQtPnZhbHVlKSA9PSA0ICYmIGlzX251bWJlcih0LT52YWx1ZSkpCisgICAgICAgIHJldHVybiB0OworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBtZXJnZV9kYXRlKEFWRGljdGlvbmFyeSAqKm0pCit7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQ7CisgICAgY2hhciBkYXRlWzE3XSA9IHsgMCB9OyAgICAgIC8vIFlZWVktTU0tREQgaGg6bW0KKworICAgIGlmICghKHQgPSBnZXRfZGF0ZV90YWcoKm0sICJUWUVSIikpICYmCisgICAgICAgICEodCA9IGdldF9kYXRlX3RhZygqbSwgIlRZRSIpKSkKKyAgICAgICAgcmV0dXJuOworICAgIGF2X3N0cmxjcHkoZGF0ZSwgdC0+dmFsdWUsIDUpOworICAgIGF2X2RpY3Rfc2V0KG0sICJUWUVSIiwgTlVMTCwgMCk7CisgICAgYXZfZGljdF9zZXQobSwgIlRZRSIsIE5VTEwsIDApOworCisgICAgaWYgKCEodCA9IGdldF9kYXRlX3RhZygqbSwgIlREQVQiKSkgJiYKKyAgICAgICAgISh0ID0gZ2V0X2RhdGVfdGFnKCptLCAiVERBIikpKQorICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICBzbnByaW50ZihkYXRlICsgNCwgc2l6ZW9mKGRhdGUpIC0gNCwgIi0lLjJzLSUuMnMiLCB0LT52YWx1ZSArIDIsIHQtPnZhbHVlKTsKKyAgICBhdl9kaWN0X3NldChtLCAiVERBVCIsIE5VTEwsIDApOworICAgIGF2X2RpY3Rfc2V0KG0sICJUREEiLCBOVUxMLCAwKTsKKworICAgIGlmICghKHQgPSBnZXRfZGF0ZV90YWcoKm0sICJUSU1FIikpICYmCisgICAgICAgICEodCA9IGdldF9kYXRlX3RhZygqbSwgIlRJTSIpKSkKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgc25wcmludGYoZGF0ZSArIDEwLCBzaXplb2YoZGF0ZSkgLSAxMCwKKyAgICAgICAgICAgICAiICUuMnM6JS4ycyIsIHQtPnZhbHVlLCB0LT52YWx1ZSArIDIpOworICAgIGF2X2RpY3Rfc2V0KG0sICJUSU1FIiwgTlVMTCwgMCk7CisgICAgYXZfZGljdF9zZXQobSwgIlRJTSIsIE5VTEwsIDApOworCitmaW5pc2g6CisgICAgaWYgKGRhdGVbMF0pCisgICAgICAgIGF2X2RpY3Rfc2V0KG0sICJkYXRlIiwgZGF0ZSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfYXBpYyh2b2lkICpvYmopCit7CisgICAgSUQzdjJFeHRyYU1ldGFBUElDICphcGljID0gb2JqOworICAgIGF2X2J1ZmZlcl91bnJlZigmYXBpYy0+YnVmKTsKKyAgICBhdl9mcmVlcCgmYXBpYy0+ZGVzY3JpcHRpb24pOworICAgIGF2X2ZyZWVwKCZhcGljKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9hcGljKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBpbnQgdGFnbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnRhZywgSUQzdjJFeHRyYU1ldGEgKipleHRyYV9tZXRhLCBpbnQgaXN2MzQpCit7CisgICAgaW50IGVuYywgcGljX3R5cGU7CisgICAgY2hhciBtaW1ldHlwZVs2NF07CisgICAgY29uc3QgQ29kZWNNaW1lICptaW1lICAgICA9IGZmX2lkM3YyX21pbWVfdGFnczsKKyAgICBlbnVtIEFWQ29kZWNJRCBpZCAgICAgICAgID0gQVZfQ09ERUNfSURfTk9ORTsKKyAgICBJRDN2MkV4dHJhTWV0YUFQSUMgKmFwaWMgID0gTlVMTDsKKyAgICBJRDN2MkV4dHJhTWV0YSAqbmV3X2V4dHJhID0gTlVMTDsKKyAgICBpbnQ2NF90IGVuZCAgICAgICAgICAgICAgID0gYXZpb190ZWxsKHBiKSArIHRhZ2xlbjsKKworICAgIGlmICh0YWdsZW4gPD0gNCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgbmV3X2V4dHJhID0gYXZfbWFsbG9jeihzaXplb2YoKm5ld19leHRyYSkpOworICAgIGFwaWMgICAgICA9IGF2X21hbGxvY3ooc2l6ZW9mKCphcGljKSk7CisgICAgaWYgKCFuZXdfZXh0cmEgfHwgIWFwaWMpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGVuYyA9IGF2aW9fcjgocGIpOworICAgIHRhZ2xlbi0tOworCisgICAgLyogbWltZXR5cGUgKi8KKyAgICBpZiAoaXN2MzQpIHsKKyAgICB0YWdsZW4gLT0gYXZpb19nZXRfc3RyKHBiLCB0YWdsZW4sIG1pbWV0eXBlLCBzaXplb2YobWltZXR5cGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3JlYWQocGIsIG1pbWV0eXBlLCAzKTsKKyAgICAgICAgbWltZXR5cGVbM10gPSAwOworICAgIH0KKyAgICB3aGlsZSAobWltZS0+aWQgIT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICBpZiAoIWF2X3N0cm5jYXNlY21wKG1pbWUtPnN0ciwgbWltZXR5cGUsIHNpemVvZihtaW1ldHlwZSkpKSB7CisgICAgICAgICAgICBpZCA9IG1pbWUtPmlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbWltZSsrOworICAgIH0KKyAgICBpZiAoaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiVW5rbm93biBhdHRhY2hlZCBwaWN0dXJlIG1pbWV0eXBlOiAlcywgc2tpcHBpbmcuXG4iLCBtaW1ldHlwZSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgYXBpYy0+aWQgPSBpZDsKKworICAgIC8qIHBpY3R1cmUgdHlwZSAqLworICAgIHBpY190eXBlID0gYXZpb19yOChwYik7CisgICAgdGFnbGVuLS07CisgICAgaWYgKHBpY190eXBlIDwgMCB8fCBwaWNfdHlwZSA+PSBGRl9BUlJBWV9FTEVNUyhmZl9pZDN2Ml9waWN0dXJlX3R5cGVzKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIGF0dGFjaGVkIHBpY3R1cmUgdHlwZSAlZC5cbiIsCisgICAgICAgICAgICAgICBwaWNfdHlwZSk7CisgICAgICAgIHBpY190eXBlID0gMDsKKyAgICB9CisgICAgYXBpYy0+dHlwZSA9IGZmX2lkM3YyX3BpY3R1cmVfdHlwZXNbcGljX3R5cGVdOworCisgICAgLyogZGVzY3JpcHRpb24gYW5kIHBpY3R1cmUgZGF0YSAqLworICAgIGlmIChkZWNvZGVfc3RyKHMsIHBiLCBlbmMsICZhcGljLT5kZXNjcmlwdGlvbiwgJnRhZ2xlbikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRXJyb3IgZGVjb2RpbmcgYXR0YWNoZWQgcGljdHVyZSBkZXNjcmlwdGlvbi5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYXBpYy0+YnVmID0gYXZfYnVmZmVyX2FsbG9jKHRhZ2xlbiArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghYXBpYy0+YnVmIHx8ICF0YWdsZW4gfHwgYXZpb19yZWFkKHBiLCBhcGljLT5idWYtPmRhdGEsIHRhZ2xlbikgIT0gdGFnbGVuKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgbWVtc2V0KGFwaWMtPmJ1Zi0+ZGF0YSArIHRhZ2xlbiwgMCwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICBuZXdfZXh0cmEtPnRhZyAgPSAiQVBJQyI7CisgICAgbmV3X2V4dHJhLT5kYXRhID0gYXBpYzsKKyAgICBuZXdfZXh0cmEtPm5leHQgPSAqZXh0cmFfbWV0YTsKKyAgICAqZXh0cmFfbWV0YSAgICAgPSBuZXdfZXh0cmE7CisKKyAgICByZXR1cm47CisKK2ZhaWw6CisgICAgaWYgKGFwaWMpCisgICAgICAgIGZyZWVfYXBpYyhhcGljKTsKKyAgICBhdl9mcmVlcCgmbmV3X2V4dHJhKTsKKyAgICBhdmlvX3NlZWsocGIsIGVuZCwgU0VFS19TRVQpOworfQorCitzdGF0aWMgdm9pZCByZWFkX2NoYXB0ZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIGludCBsZW4sIGNoYXIgKnR0YWcsIElEM3YyRXh0cmFNZXRhICoqZXh0cmFfbWV0YSwgaW50IGlzdjM0KQoreworICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlID0gezEsIDEwMDB9OworICAgIHVpbnQzMl90IHN0YXJ0LCBlbmQ7CisgICAgQVZDaGFwdGVyICpjaGFwdGVyOworICAgIHVpbnQ4X3QgKmRzdCA9IE5VTEw7CisgICAgaW50IHRhZ2xlbjsKKyAgICBjaGFyIHRhZ1s1XTsKKworICAgIGlmICghcykgeworICAgICAgICAvKiBXZSBzaG91bGQgcHJvYmFibHkganVzdCBwdXQgdGhlIGNoYXB0ZXIgZGF0YSB0byBleHRyYV9tZXRhIGhlcmUKKyAgICAgICAgICogYW5kIGRvIHRoZSBBVkZvcm1hdENvbnRleHQtbmVlZGluZyBwYXJ0IGluIGEgc2VwYXJhdGUKKyAgICAgICAgICogZmZfaWQzdjJfcGFyc2VfYXBpYygpLWxpa2UgZnVuY3Rpb24uICovCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJObyBBVkZvcm1hdENvbnRleHQsIHNraXBwZWQgSUQzIGNoYXB0ZXIgZGF0YVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZGVjb2RlX3N0cihzLCBwYiwgMCwgJmRzdCwgJmxlbikgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGxlbiA8IDE2KQorICAgICAgICByZXR1cm47CisKKyAgICBzdGFydCA9IGF2aW9fcmIzMihwYik7CisgICAgZW5kICAgPSBhdmlvX3JiMzIocGIpOworICAgIGF2aW9fc2tpcChwYiwgOCk7CisKKyAgICBjaGFwdGVyID0gYXZwcml2X25ld19jaGFwdGVyKHMsIHMtPm5iX2NoYXB0ZXJzICsgMSwgdGltZV9iYXNlLCBzdGFydCwgZW5kLCBkc3QpOworICAgIGlmICghY2hhcHRlcikgeworICAgICAgICBhdl9mcmVlKGRzdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZW4gLT0gMTY7CisgICAgd2hpbGUgKGxlbiA+IDEwKSB7CisgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIHRhZywgNCkgPCA0KQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIHRhZ1s0XSA9IDA7CisgICAgICAgIHRhZ2xlbiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGF2aW9fc2tpcChwYiwgMik7CisgICAgICAgIGxlbiAtPSAxMDsKKyAgICAgICAgaWYgKHRhZ2xlbiA8IDAgfHwgdGFnbGVuID4gbGVuKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIGlmICh0YWdbMF0gPT0gJ1QnKQorICAgICAgICAgICAgcmVhZF90dGFnKHMsIHBiLCB0YWdsZW4sICZjaGFwdGVyLT5tZXRhZGF0YSwgdGFnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZpb19za2lwKHBiLCB0YWdsZW4pOworICAgICAgICBsZW4gLT0gdGFnbGVuOworICAgIH0KKworICAgIGZmX21ldGFkYXRhX2NvbnYoJmNoYXB0ZXItPm1ldGFkYXRhLCBOVUxMLCBmZl9pZDN2Ml8zNF9tZXRhZGF0YV9jb252KTsKKyAgICBmZl9tZXRhZGF0YV9jb252KCZjaGFwdGVyLT5tZXRhZGF0YSwgTlVMTCwgZmZfaWQzdjJfNF9tZXRhZGF0YV9jb252KTsKK2VuZDoKKyAgICBhdl9mcmVlKGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcHJpdih2b2lkICpvYmopCit7CisgICAgSUQzdjJFeHRyYU1ldGFQUklWICpwcml2ID0gb2JqOworICAgIGF2X2ZyZWVwKCZwcml2LT5vd25lcik7CisgICAgYXZfZnJlZXAoJnByaXYtPmRhdGEpOworICAgIGF2X2ZyZWVwKCZwcml2KTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9wcml2KEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBpbnQgdGFnbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnRhZywgSUQzdjJFeHRyYU1ldGEgKipleHRyYV9tZXRhLCBpbnQgaXN2MzQpCit7CisgICAgSUQzdjJFeHRyYU1ldGEgKm1ldGE7CisgICAgSUQzdjJFeHRyYU1ldGFQUklWICpwcml2OworCisgICAgbWV0YSA9IGF2X21hbGxvY3ooc2l6ZW9mKCptZXRhKSk7CisgICAgcHJpdiA9IGF2X21hbGxvY3ooc2l6ZW9mKCpwcml2KSk7CisKKyAgICBpZiAoIW1ldGEgfHwgIXByaXYpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChkZWNvZGVfc3RyKHMsIHBiLCBJRDN2Ml9FTkNPRElOR19JU084ODU5LCAmcHJpdi0+b3duZXIsICZ0YWdsZW4pIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcHJpdi0+ZGF0YSA9IGF2X21hbGxvYyh0YWdsZW4pOworICAgIGlmICghcHJpdi0+ZGF0YSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcHJpdi0+ZGF0YXNpemUgPSB0YWdsZW47CisKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBwcml2LT5kYXRhLCBwcml2LT5kYXRhc2l6ZSkgIT0gcHJpdi0+ZGF0YXNpemUpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIG1ldGEtPnRhZyAgID0gIlBSSVYiOworICAgIG1ldGEtPmRhdGEgID0gcHJpdjsKKyAgICBtZXRhLT5uZXh0ICA9ICpleHRyYV9tZXRhOworICAgICpleHRyYV9tZXRhID0gbWV0YTsKKworICAgIHJldHVybjsKKworZmFpbDoKKyAgICBpZiAocHJpdikKKyAgICAgICAgZnJlZV9wcml2KHByaXYpOworICAgIGF2X2ZyZWVwKCZtZXRhKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgSUQzdjJFTUZ1bmMgeworICAgIGNvbnN0IGNoYXIgKnRhZzM7CisgICAgY29uc3QgY2hhciAqdGFnNDsKKyAgICB2b2lkICgqcmVhZCkoQVZGb3JtYXRDb250ZXh0ICosIEFWSU9Db250ZXh0ICosIGludCwgY2hhciAqLAorICAgICAgICAgICAgICAgICBJRDN2MkV4dHJhTWV0YSAqKiwgaW50IGlzdjM0KTsKKyAgICB2b2lkICgqZnJlZSkodm9pZCAqb2JqKTsKK30gSUQzdjJFTUZ1bmM7CisKK3N0YXRpYyBjb25zdCBJRDN2MkVNRnVuYyBpZDN2Ml9leHRyYV9tZXRhX2Z1bmNzW10gPSB7CisgICAgeyAiR0VPIiwgIkdFT0IiLCByZWFkX2dlb2J0YWcsIGZyZWVfZ2VvYnRhZyB9LAorICAgIHsgIlBJQyIsICJBUElDIiwgcmVhZF9hcGljLCAgICBmcmVlX2FwaWMgICAgfSwKKyAgICB7ICJDSEFQIiwiQ0hBUCIsIHJlYWRfY2hhcHRlciwgTlVMTCAgICAgICAgIH0sCisgICAgeyAiUFJJViIsIlBSSVYiLCByZWFkX3ByaXYsICAgIGZyZWVfcHJpdiAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCisvKioKKyAqIEdldCB0aGUgY29ycmVzcG9uZGluZyBJRDN2MkVNRnVuYyBzdHJ1Y3QgZm9yIGEgdGFnLgorICogQHBhcmFtIGlzdjM0IERldGVybWluZXMgaWYgdjIuMiBvciB2Mi4zLzQgc3RyaW5ncyBhcmUgdXNlZAorICogQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIElEM3YyRU1GdW5jIHN0cnVjdCBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBjb25zdCBJRDN2MkVNRnVuYyAqZ2V0X2V4dHJhX21ldGFfZnVuYyhjb25zdCBjaGFyICp0YWcsIGludCBpc3YzNCkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKGlkM3YyX2V4dHJhX21ldGFfZnVuY3NbaV0udGFnMykgeworICAgICAgICBpZiAodGFnICYmICFtZW1jbXAodGFnLAorICAgICAgICAgICAgICAgICAgICAoaXN2MzQgPyBpZDN2Ml9leHRyYV9tZXRhX2Z1bmNzW2ldLnRhZzQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDN2Ml9leHRyYV9tZXRhX2Z1bmNzW2ldLnRhZzMpLAorICAgICAgICAgICAgICAgICAgICAoaXN2MzQgPyA0IDogMykpKQorICAgICAgICAgICAgcmV0dXJuICZpZDN2Ml9leHRyYV9tZXRhX2Z1bmNzW2ldOworICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpZDN2Ml9wYXJzZShBVklPQ29udGV4dCAqcGIsIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgbGVuLCB1aW50OF90IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGZsYWdzLCBJRDN2MkV4dHJhTWV0YSAqKmV4dHJhX21ldGEpCit7CisgICAgaW50IGlzdjM0LCB1bnN5bmM7CisgICAgdW5zaWduZWQgdGxlbjsKKyAgICBjaGFyIHRhZ1s1XTsKKyAgICBpbnQ2NF90IG5leHQsIGVuZCA9IGF2aW9fdGVsbChwYikgKyBsZW47CisgICAgaW50IHRhZ2hkcmxlbjsKKyAgICBjb25zdCBjaGFyICpyZWFzb24gPSBOVUxMOworICAgIEFWSU9Db250ZXh0IHBiX2xvY2FsOworICAgIEFWSU9Db250ZXh0ICpwYng7CisgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICBpbnQgYnVmZmVyX3NpemUgICAgICAgPSAwOworICAgIGNvbnN0IElEM3YyRU1GdW5jICpleHRyYV9mdW5jID0gTlVMTDsKKyAgICB1bnNpZ25lZCBjaGFyICp1bmNvbXByZXNzZWRfYnVmZmVyID0gTlVMTDsKKyAgICBhdl91bnVzZWQgaW50IHVuY29tcHJlc3NlZF9idWZmZXJfc2l6ZSA9IDA7CisKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiaWQzdjIgdmVyOiVkIGZsYWdzOiUwMlggbGVuOiVkXG4iLCB2ZXJzaW9uLCBmbGFncywgbGVuKTsKKworICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGZsYWdzICYgMHg0MCkgeworICAgICAgICAgICAgcmVhc29uID0gImNvbXByZXNzaW9uIjsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaXN2MzQgICAgID0gMDsKKyAgICAgICAgdGFnaGRybGVuID0gNjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDM6CisgICAgY2FzZSA0OgorICAgICAgICBpc3YzNCAgICAgPSAxOworICAgICAgICB0YWdoZHJsZW4gPSAxMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZWFzb24gPSAidmVyc2lvbiI7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgdW5zeW5jID0gZmxhZ3MgJiAweDgwOworCisgICAgaWYgKGlzdjM0ICYmIGZsYWdzICYgMHg0MCkgeyAvKiBFeHRlbmRlZCBoZWFkZXIgcHJlc2VudCwganVzdCBza2lwIG92ZXIgaXQgKi8KKyAgICAgICAgaW50IGV4dGxlbiA9IGdldF9zaXplKHBiLCA0KTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gNCkKKyAgICAgICAgICAgIC8qIEluIHYyLjQgdGhlIGxlbmd0aCBpbmNsdWRlcyB0aGUgbGVuZ3RoIGZpZWxkIHdlIGp1c3QgcmVhZC4gKi8KKyAgICAgICAgICAgIGV4dGxlbiAtPSA0OworCisgICAgICAgIGlmIChleHRsZW4gPCAwKSB7CisgICAgICAgICAgICByZWFzb24gPSAiaW52YWxpZCBleHRlbmRlZCBoZWFkZXIgbGVuZ3RoIjsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19za2lwKHBiLCBleHRsZW4pOworICAgICAgICBsZW4gLT0gZXh0bGVuICsgNDsKKyAgICAgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgICAgIHJlYXNvbiA9ICJleHRlbmRlZCBoZWFkZXIgdG9vIGxvbmcuIjsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAobGVuID49IHRhZ2hkcmxlbikgeworICAgICAgICB1bnNpZ25lZCBpbnQgdGZsYWdzID0gMDsKKyAgICAgICAgaW50IHR1bnN5bmMgICAgICAgICA9IDA7CisgICAgICAgIGludCB0Y29tcCAgICAgICAgICAgPSAwOworICAgICAgICBpbnQgdGVuY3IgICAgICAgICAgID0gMDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhdl91bnVzZWQgZGxlbjsKKworICAgICAgICBpZiAoaXN2MzQpIHsKKyAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIHRhZywgNCkgPCA0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdGFnWzRdID0gMDsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDMpIHsKKyAgICAgICAgICAgICAgICB0bGVuID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogc29tZSBlbmNvZGVycyBpbmNvcnJlY3RseSB1c2VzIHYzIHNpemVzIGluc3RlYWQgb2Ygc3luY3NhZmUgb25lcworICAgICAgICAgICAgICAgICAqIHNvIGNoZWNrIHRoZSBuZXh0IHRhZyB0byBzZWUgd2hpY2ggb25lIHRvIHVzZSAqLworICAgICAgICAgICAgICAgIHRsZW4gPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgICAgIGlmICh0bGVuID4gMHg3ZikgeworICAgICAgICAgICAgICAgICAgICBpZiAodGxlbiA8IGxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXIgPSBhdmlvX3RlbGwocGIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmZpb19lbnN1cmVfc2Vla2JhY2socGIsIDIgLyogdGZsYWdzICovICsgdGxlbiArIDQgLyogbmV4dCB0YWcgKi8pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tfdGFnKHBiLCBjdXIgKyAyICsgc2l6ZV90b19zeW5jc2FmZSh0bGVuKSwgNCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bGVuID0gc2l6ZV90b19zeW5jc2FmZSh0bGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrX3RhZyhwYiwgY3VyICsgMiArIHRsZW4sIDQpICE9IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGN1ciwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRsZW4gPSBzaXplX3RvX3N5bmNzYWZlKHRsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRmbGFncyAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgdHVuc3luYyA9IHRmbGFncyAmIElEM3YyX0ZMQUdfVU5TWU5DSDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIHRhZywgMykgPCAzKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdGFnWzNdID0gMDsKKyAgICAgICAgICAgIHRsZW4gICA9IGF2aW9fcmIyNChwYik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRsZW4gPiAoMTw8MjgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxlbiAtPSB0YWdoZHJsZW4gKyB0bGVuOworCisgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbmV4dCA9IGF2aW9fdGVsbChwYikgKyB0bGVuOworCisgICAgICAgIGlmICghdGxlbikgeworICAgICAgICAgICAgaWYgKHRhZ1swXSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiSW52YWxpZCBlbXB0eSBmcmFtZSAlcywgc2tpcHBpbmcuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0YWcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGZsYWdzICYgSUQzdjJfRkxBR19EQVRBTEVOKSB7CisgICAgICAgICAgICBpZiAodGxlbiA8IDQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkbGVuID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIHRsZW4gLT0gNDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBkbGVuID0gdGxlbjsKKworICAgICAgICB0Y29tcCA9IHRmbGFncyAmIElEM3YyX0ZMQUdfQ09NUFJFU1NJT047CisgICAgICAgIHRlbmNyID0gdGZsYWdzICYgSUQzdjJfRkxBR19FTkNSWVBUSU9OOworCisgICAgICAgIC8qIHNraXAgZW5jcnlwdGVkIHRhZ3MgYW5kLCBpZiBubyB6bGliLCBjb21wcmVzc2VkIHRhZ3MgKi8KKyAgICAgICAgaWYgKHRlbmNyIHx8ICghQ09ORklHX1pMSUIgJiYgdGNvbXApKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlOworICAgICAgICAgICAgaWYgKCF0Y29tcCkKKyAgICAgICAgICAgICAgICB0eXBlID0gImVuY3J5cHRlZCI7CisgICAgICAgICAgICBlbHNlIGlmICghdGVuY3IpCisgICAgICAgICAgICAgICAgdHlwZSA9ICJjb21wcmVzc2VkIjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0eXBlID0gImVuY3J5cHRlZCBhbmQgY29tcHJlc3NlZCI7CisKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlNraXBwaW5nICVzIElEM3YyIGZyYW1lICVzLlxuIiwgdHlwZSwgdGFnKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgdGxlbik7CisgICAgICAgIC8qIGNoZWNrIGZvciB0ZXh0IHRhZyBvciBzdXBwb3J0ZWQgc3BlY2lhbCBtZXRhIHRhZyAqLworICAgICAgICB9IGVsc2UgaWYgKHRhZ1swXSA9PSAnVCcgfHwKKyAgICAgICAgICAgICAgICAgICAoZXh0cmFfbWV0YSAmJgorICAgICAgICAgICAgICAgICAgICAoZXh0cmFfZnVuYyA9IGdldF9leHRyYV9tZXRhX2Z1bmModGFnLCBpc3YzNCkpKSkgeworICAgICAgICAgICAgcGJ4ID0gcGI7CisKKyAgICAgICAgICAgIGlmICh1bnN5bmMgfHwgdHVuc3luYyB8fCB0Y29tcCkgeworICAgICAgICAgICAgICAgIGF2X2Zhc3RfbWFsbG9jKCZidWZmZXIsICZidWZmZXJfc2l6ZSwgdGxlbik7CisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvYyAlZCBieXRlc1xuIiwgdGxlbik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gc2VlazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodW5zeW5jIHx8IHR1bnN5bmMpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGVuZCA9IGF2aW9fdGVsbChwYikgKyB0bGVuOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmI7CisKKyAgICAgICAgICAgICAgICBiID0gYnVmZmVyOworICAgICAgICAgICAgICAgIHdoaWxlIChhdmlvX3RlbGwocGIpIDwgZW5kICYmIGIgLSBidWZmZXIgPCB0bGVuICYmICFwYi0+ZW9mX3JlYWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgKmIrKyA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgICAgICAgICBpZiAoKihiIC0gMSkgPT0gMHhmZiAmJiBhdmlvX3RlbGwocGIpIDwgZW5kIC0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYiAtIGJ1ZmZlciA8IHRsZW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFwYi0+ZW9mX3JlYWNoZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZhbCA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgICAgICAgICAgICAgKmIrKyA9IHZhbCA/IHZhbCA6IGF2aW9fcjgocGIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZmaW9faW5pdF9jb250ZXh0KCZwYl9sb2NhbCwgYnVmZmVyLCBiIC0gYnVmZmVyLCAwLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgIHRsZW4gPSBiIC0gYnVmZmVyOworICAgICAgICAgICAgICAgIHBieCAgPSAmcGJfbG9jYWw7IC8vIHJlYWQgZnJvbSBzeW5jIGJ1ZmZlcgorICAgICAgICAgICAgfQorCisjaWYgQ09ORklHX1pMSUIKKyAgICAgICAgICAgICAgICBpZiAodGNvbXApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVycjsKKworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiQ29tcHJlc3NzZWQgZnJhbWUgJXMgdGxlbj0lZCBkbGVuPSVsZFxuIiwgdGFnLCB0bGVuLCBkbGVuKTsKKworICAgICAgICAgICAgICAgICAgICBhdl9mYXN0X21hbGxvYygmdW5jb21wcmVzc2VkX2J1ZmZlciwgJnVuY29tcHJlc3NlZF9idWZmZXJfc2l6ZSwgZGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlmICghdW5jb21wcmVzc2VkX2J1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvYyAlbGQgYnl0ZXNcbiIsIGRsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzZWVrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEodW5zeW5jIHx8IHR1bnN5bmMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBhdmlvX3JlYWQocGIsIGJ1ZmZlciwgdGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBjb21wcmVzc2VkIHRhZ1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzZWVrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiA9IGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVyciA9IHVuY29tcHJlc3ModW5jb21wcmVzc2VkX2J1ZmZlciwgJmRsZW4sIGJ1ZmZlciwgdGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB1bmNvbXByZXNzIHRhZzogJWRcbiIsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNlZWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmZpb19pbml0X2NvbnRleHQoJnBiX2xvY2FsLCB1bmNvbXByZXNzZWRfYnVmZmVyLCBkbGVuLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgdGxlbiA9IGRsZW47CisgICAgICAgICAgICAgICAgICAgIHBieCA9ICZwYl9sb2NhbDsgLy8gcmVhZCBmcm9tIHN5bmMgYnVmZmVyCisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAodGFnWzBdID09ICdUJykKKyAgICAgICAgICAgICAgICAvKiBwYXJzZSB0ZXh0IHRhZyAqLworICAgICAgICAgICAgICAgIHJlYWRfdHRhZyhzLCBwYngsIHRsZW4sIG1ldGFkYXRhLCB0YWcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8qIHBhcnNlIHNwZWNpYWwgbWV0YSB0YWcgKi8KKyAgICAgICAgICAgICAgICBleHRyYV9mdW5jLT5yZWFkKHMsIHBieCwgdGxlbiwgdGFnLCBleHRyYV9tZXRhLCBpc3YzNCk7CisgICAgICAgIH0gZWxzZSBpZiAoIXRhZ1swXSkgeworICAgICAgICAgICAgaWYgKHRhZ1sxXSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJpbnZhbGlkIGZyYW1lIGlkLCBhc3N1bWluZyBwYWRkaW5nXG4iKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgdGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBTa2lwIHRvIGVuZCBvZiB0YWcgKi8KK3NlZWs6CisgICAgICAgIGF2aW9fc2VlayhwYiwgbmV4dCwgU0VFS19TRVQpOworICAgIH0KKworICAgIC8qIEZvb3RlciBwcmVzZXQsIGFsd2F5cyAxMCBieXRlcywgc2tpcCBvdmVyIGl0ICovCisgICAgaWYgKHZlcnNpb24gPT0gNCAmJiBmbGFncyAmIDB4MTApCisgICAgICAgIGVuZCArPSAxMDsKKworZXJyb3I6CisgICAgaWYgKHJlYXNvbikKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiSUQzdjIuJWQgdGFnIHNraXBwZWQsIGNhbm5vdCBoYW5kbGUgJXNcbiIsCisgICAgICAgICAgICAgICB2ZXJzaW9uLCByZWFzb24pOworICAgIGF2aW9fc2VlayhwYiwgZW5kLCBTRUVLX1NFVCk7CisgICAgYXZfZnJlZShidWZmZXIpOworICAgIGF2X2ZyZWUodW5jb21wcmVzc2VkX2J1ZmZlcik7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpZDN2Ml9yZWFkX2ludGVybmFsKEFWSU9Db250ZXh0ICpwYiwgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqbWFnaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEM3YyRXh0cmFNZXRhICoqZXh0cmFfbWV0YSwgaW50NjRfdCBtYXhfc2VhcmNoX3NpemUpCit7CisgICAgaW50IGxlbiwgcmV0OworICAgIHVpbnQ4X3QgYnVmW0lEM3YyX0hFQURFUl9TSVpFXTsKKyAgICBpbnQgZm91bmRfaGVhZGVyOworICAgIGludDY0X3Qgc3RhcnQsIG9mZjsKKworICAgIGlmIChtYXhfc2VhcmNoX3NpemUgJiYgbWF4X3NlYXJjaF9zaXplIDwgSUQzdjJfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybjsKKworICAgIHN0YXJ0ID0gYXZpb190ZWxsKHBiKTsKKyAgICBkbyB7CisgICAgICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgb2Zmc2V0IGluIGNhc2UgdGhlcmUncyBub3RoaW5nIHRvIHJlYWQvc2tpcCAqLworICAgICAgICBvZmYgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBpZiAobWF4X3NlYXJjaF9zaXplICYmIG9mZiAtIHN0YXJ0ID49IG1heF9zZWFyY2hfc2l6ZSAtIElEM3YyX0hFQURFUl9TSVpFKSB7CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIG9mZiwgU0VFS19TRVQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBhdmlvX3JlYWQocGIsIGJ1ZiwgSUQzdjJfSEVBREVSX1NJWkUpOworICAgICAgICBpZiAocmV0ICE9IElEM3YyX0hFQURFUl9TSVpFKSB7CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIG9mZiwgU0VFS19TRVQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm91bmRfaGVhZGVyID0gZmZfaWQzdjJfbWF0Y2goYnVmLCBtYWdpYyk7CisgICAgICAgIGlmIChmb3VuZF9oZWFkZXIpIHsKKyAgICAgICAgICAgIC8qIHBhcnNlIElEM3YyIGhlYWRlciAqLworICAgICAgICAgICAgbGVuID0gKChidWZbNl0gJiAweDdmKSA8PCAyMSkgfAorICAgICAgICAgICAgICAgICAgKChidWZbN10gJiAweDdmKSA8PCAxNCkgfAorICAgICAgICAgICAgICAgICAgKChidWZbOF0gJiAweDdmKSA8PCA3KSB8CisgICAgICAgICAgICAgICAgICAgKGJ1Zls5XSAmIDB4N2YpOworICAgICAgICAgICAgaWQzdjJfcGFyc2UocGIsIG1ldGFkYXRhLCBzLCBsZW4sIGJ1ZlszXSwgYnVmWzVdLCBleHRyYV9tZXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgb2ZmLCBTRUVLX1NFVCk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChmb3VuZF9oZWFkZXIpOworICAgIGZmX21ldGFkYXRhX2NvbnYobWV0YWRhdGEsIE5VTEwsIGZmX2lkM3YyXzM0X21ldGFkYXRhX2NvbnYpOworICAgIGZmX21ldGFkYXRhX2NvbnYobWV0YWRhdGEsIE5VTEwsIGlkM3YyXzJfbWV0YWRhdGFfY29udik7CisgICAgZmZfbWV0YWRhdGFfY29udihtZXRhZGF0YSwgTlVMTCwgZmZfaWQzdjJfNF9tZXRhZGF0YV9jb252KTsKKyAgICBtZXJnZV9kYXRlKG1ldGFkYXRhKTsKK30KKwordm9pZCBmZl9pZDN2Ml9yZWFkX2RpY3QoQVZJT0NvbnRleHQgKnBiLCBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1hZ2ljLCBJRDN2MkV4dHJhTWV0YSAqKmV4dHJhX21ldGEpCit7CisgICAgaWQzdjJfcmVhZF9pbnRlcm5hbChwYiwgbWV0YWRhdGEsIE5VTEwsIG1hZ2ljLCBleHRyYV9tZXRhLCAwKTsKK30KKwordm9pZCBmZl9pZDN2Ml9yZWFkKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqbWFnaWMsCisgICAgICAgICAgICAgICAgICAgSUQzdjJFeHRyYU1ldGEgKipleHRyYV9tZXRhLCB1bnNpZ25lZCBpbnQgbWF4X3NlYXJjaF9zaXplKQoreworICAgIGlkM3YyX3JlYWRfaW50ZXJuYWwocy0+cGIsICZzLT5tZXRhZGF0YSwgcywgbWFnaWMsIGV4dHJhX21ldGEsIG1heF9zZWFyY2hfc2l6ZSk7Cit9CisKK3ZvaWQgZmZfaWQzdjJfZnJlZV9leHRyYV9tZXRhKElEM3YyRXh0cmFNZXRhICoqZXh0cmFfbWV0YSkKK3sKKyAgICBJRDN2MkV4dHJhTWV0YSAqY3VycmVudCA9ICpleHRyYV9tZXRhLCAqbmV4dDsKKyAgICBjb25zdCBJRDN2MkVNRnVuYyAqZXh0cmFfZnVuYzsKKworICAgIHdoaWxlIChjdXJyZW50KSB7CisgICAgICAgIGlmICgoZXh0cmFfZnVuYyA9IGdldF9leHRyYV9tZXRhX2Z1bmMoY3VycmVudC0+dGFnLCAxKSkpCisgICAgICAgICAgICBleHRyYV9mdW5jLT5mcmVlKGN1cnJlbnQtPmRhdGEpOworICAgICAgICBuZXh0ID0gY3VycmVudC0+bmV4dDsKKyAgICAgICAgYXZfZnJlZXAoJmN1cnJlbnQpOworICAgICAgICBjdXJyZW50ID0gbmV4dDsKKyAgICB9CisKKyAgICAqZXh0cmFfbWV0YSA9IE5VTEw7Cit9CisKK2ludCBmZl9pZDN2Ml9wYXJzZV9hcGljKEFWRm9ybWF0Q29udGV4dCAqcywgSUQzdjJFeHRyYU1ldGEgKipleHRyYV9tZXRhKQoreworICAgIElEM3YyRXh0cmFNZXRhICpjdXI7CisKKyAgICBmb3IgKGN1ciA9ICpleHRyYV9tZXRhOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBJRDN2MkV4dHJhTWV0YUFQSUMgKmFwaWM7CisgICAgICAgIEFWU3RyZWFtICpzdDsKKworICAgICAgICBpZiAoc3RyY21wKGN1ci0+dGFnLCAiQVBJQyIpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGFwaWMgPSBjdXItPmRhdGE7CisKKyAgICAgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgc3QtPmRpc3Bvc2l0aW9uICAgICAgfD0gQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGFwaWMtPmlkOworICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAidGl0bGUiLCAgIGFwaWMtPmRlc2NyaXB0aW9uLCAwKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgImNvbW1lbnQiLCBhcGljLT50eXBlLCAwKTsKKworICAgICAgICBhdl9pbml0X3BhY2tldCgmc3QtPmF0dGFjaGVkX3BpYyk7CisgICAgICAgIHN0LT5hdHRhY2hlZF9waWMuYnVmICAgICAgICAgID0gYXBpYy0+YnVmOworICAgICAgICBzdC0+YXR0YWNoZWRfcGljLmRhdGEgICAgICAgICA9IGFwaWMtPmJ1Zi0+ZGF0YTsKKyAgICAgICAgc3QtPmF0dGFjaGVkX3BpYy5zaXplICAgICAgICAgPSBhcGljLT5idWYtPnNpemUgLSBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFOworICAgICAgICBzdC0+YXR0YWNoZWRfcGljLnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgc3QtPmF0dGFjaGVkX3BpYy5mbGFncyAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICAgICAgYXBpYy0+YnVmID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9pZDN2Mi5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lkM3YyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3YmYxYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pZDN2Mi5oCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogSUQzdjIgaGVhZGVyIHBhcnNlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX0lEM1YyX0gKKyNkZWZpbmUgQVZGT1JNQVRfSUQzVjJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisKKyNkZWZpbmUgSUQzdjJfSEVBREVSX1NJWkUgMTAKKworLyoqCisgKiBEZWZhdWx0IG1hZ2ljIGJ5dGVzIGZvciBJRDN2MiBoZWFkZXI6ICJJRDMiCisgKi8KKyNkZWZpbmUgSUQzdjJfREVGQVVMVF9NQUdJQyAiSUQzIgorCisjZGVmaW5lIElEM3YyX0ZMQUdfREFUQUxFTiAgICAgMHgwMDAxCisjZGVmaW5lIElEM3YyX0ZMQUdfVU5TWU5DSCAgICAgMHgwMDAyCisjZGVmaW5lIElEM3YyX0ZMQUdfRU5DUllQVElPTiAgMHgwMDA0CisjZGVmaW5lIElEM3YyX0ZMQUdfQ09NUFJFU1NJT04gMHgwMDA4CisKK2VudW0gSUQzdjJFbmNvZGluZyB7CisgICAgSUQzdjJfRU5DT0RJTkdfSVNPODg1OSAgPSAwLAorICAgIElEM3YyX0VOQ09ESU5HX1VURjE2Qk9NID0gMSwKKyAgICBJRDN2Ml9FTkNPRElOR19VVEYxNkJFICA9IDIsCisgICAgSUQzdjJfRU5DT0RJTkdfVVRGOCAgICAgPSAzLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgSUQzdjJFbmNDb250ZXh0IHsKKyAgICBpbnQgICAgICB2ZXJzaW9uOyAgICAgICAvLy88IElEM3YyIG1pbm9yIHZlcnNpb24sIGVpdGhlciAzIG9yIDQKKyAgICBpbnQ2NF90IHNpemVfcG9zOyAgICAgICAvLy88IG9mZnNldCBvZiB0aGUgdGFnIHRvdGFsIHNpemUKKyAgICBpbnQgICAgICAgICAgbGVuOyAgICAgICAvLy88IHNpemUgb2YgdGhlIHRhZyB3cml0dGVuIHNvIGZhcgorfSBJRDN2MkVuY0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IElEM3YyRXh0cmFNZXRhIHsKKyAgICBjb25zdCBjaGFyICp0YWc7CisgICAgdm9pZCAqZGF0YTsKKyAgICBzdHJ1Y3QgSUQzdjJFeHRyYU1ldGEgKm5leHQ7Cit9IElEM3YyRXh0cmFNZXRhOworCit0eXBlZGVmIHN0cnVjdCBJRDN2MkV4dHJhTWV0YUdFT0IgeworICAgIHVpbnQzMl90IGRhdGFzaXplOworICAgIHVpbnQ4X3QgKm1pbWVfdHlwZTsKKyAgICB1aW50OF90ICpmaWxlX25hbWU7CisgICAgdWludDhfdCAqZGVzY3JpcHRpb247CisgICAgdWludDhfdCAqZGF0YTsKK30gSUQzdjJFeHRyYU1ldGFHRU9COworCit0eXBlZGVmIHN0cnVjdCBJRDN2MkV4dHJhTWV0YUFQSUMgeworICAgIEFWQnVmZmVyUmVmICpidWY7CisgICAgY29uc3QgY2hhciAgKnR5cGU7CisgICAgdWludDhfdCAgICAgKmRlc2NyaXB0aW9uOworICAgIGVudW0gQVZDb2RlY0lEIGlkOworfSBJRDN2MkV4dHJhTWV0YUFQSUM7CisKK3R5cGVkZWYgc3RydWN0IElEM3YyRXh0cmFNZXRhUFJJViB7CisgICAgdWludDhfdCAqb3duZXI7CisgICAgdWludDhfdCAqZGF0YTsKKyAgICB1aW50MzJfdCBkYXRhc2l6ZTsKK30gSUQzdjJFeHRyYU1ldGFQUklWOworCisvKioKKyAqIERldGVjdCBJRDN2MiBIZWFkZXIuCisgKiBAcGFyYW0gYnVmICAgbXVzdCBiZSBJRDN2Ml9IRUFERVJfU0laRSBieXRlIGxvbmcKKyAqIEBwYXJhbSBtYWdpYyBtYWdpYyBieXRlcyB0byBpZGVudGlmeSB0aGUgaGVhZGVyLgorICogSWYgaW4gZG91YnQsIHVzZSBJRDN2Ml9ERUZBVUxUX01BR0lDLgorICovCitpbnQgZmZfaWQzdjJfbWF0Y2goY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCBjaGFyICptYWdpYyk7CisKKy8qKgorICogR2V0IHRoZSBsZW5ndGggb2YgYW4gSUQzdjIgdGFnLgorICogQHBhcmFtIGJ1ZiBtdXN0IGJlIElEM3YyX0hFQURFUl9TSVpFIGJ5dGVzIGxvbmcgYW5kIHBvaW50IHRvIHRoZSBzdGFydCBvZiBhbgorICogYWxyZWFkeSBkZXRlY3RlZCBJRDN2MiB0YWcKKyAqLworaW50IGZmX2lkM3YyX3RhZ19sZW4oY29uc3QgdWludDhfdCAqYnVmKTsKKworLyoqCisgKiBSZWFkIGFuIElEM3YyIHRhZyBpbnRvIHNwZWNpZmllZCBkaWN0aW9uYXJ5IGFuZCByZXRyaWV2ZSBzdXBwb3J0ZWQgZXh0cmEgbWV0YWRhdGEuCisgKgorICogQ2hhcHRlcnMgYXJlIG5vdCBjdXJyZW50bHkgcmVhZCBieSB0aGlzIHZhcmlhbnQuCisgKgorICogQHBhcmFtIG1ldGFkYXRhIFBhcnNlZCBtZXRhZGF0YSBpcyBzdG9yZWQgaGVyZQorICogQHBhcmFtIGV4dHJhX21ldGEgSWYgbm90IE5VTEwsIGV4dHJhIG1ldGFkYXRhIGlzIHBhcnNlZCBpbnRvIGEgbGlzdCBvZgorICogSUQzdjJFeHRyYU1ldGEgc3RydWN0cyBhbmQgKmV4dHJhX21ldGEgcG9pbnRzIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0CisgKi8KK3ZvaWQgZmZfaWQzdjJfcmVhZF9kaWN0KEFWSU9Db250ZXh0ICpwYiwgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEsIGNvbnN0IGNoYXIgKm1hZ2ljLCBJRDN2MkV4dHJhTWV0YSAqKmV4dHJhX21ldGEpOworCisvKioKKyAqIFJlYWQgYW4gSUQzdjIgdGFnLCBpbmNsdWRpbmcgc3VwcG9ydGVkIGV4dHJhIG1ldGFkYXRhIGFuZCBjaGFwdGVycy4KKyAqCisgKiBEYXRhIGlzIHJlYWQgZnJvbSBhbmQgc3RvcmVkIHRvIEFWRm9ybWF0Q29udGV4dC4KKyAqCisgKiBAcGFyYW0gZXh0cmFfbWV0YSBJZiBub3QgTlVMTCwgZXh0cmEgbWV0YWRhdGEgaXMgcGFyc2VkIGludG8gYSBsaXN0IG9mCisgKiBJRDN2MkV4dHJhTWV0YSBzdHJ1Y3RzIGFuZCAqZXh0cmFfbWV0YSBwb2ludHMgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqIEBwYXJhbVtvcHRdIG1heF9zZWFyY2hfc2VhcmNoIHJlc3RyaWN0IElEMyBtYWdpYyBudW1iZXIgc2VhcmNoIChieXRlcyBmcm9tIHN0YXJ0KQorICovCit2b2lkIGZmX2lkM3YyX3JlYWQoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICptYWdpYywgSUQzdjJFeHRyYU1ldGEgKipleHRyYV9tZXRhLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfc2VhcmNoX3NpemUpOworCisvKioKKyAqIEluaXRpYWxpemUgYW4gSUQzdjIgdGFnLgorICovCit2b2lkIGZmX2lkM3YyX3N0YXJ0KElEM3YyRW5jQ29udGV4dCAqaWQzLCBBVklPQ29udGV4dCAqcGIsIGludCBpZDN2Ml92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptYWdpYyk7CisKKy8qKgorICogQ29udmVydCBhbmQgd3JpdGUgYWxsIGdsb2JhbCBtZXRhZGF0YSBmcm9tIHMgaW50byBhbiBJRDN2MiB0YWcuCisgKi8KK2ludCBmZl9pZDN2Ml93cml0ZV9tZXRhZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIElEM3YyRW5jQ29udGV4dCAqaWQzKTsKKworLyoqCisgKiBXcml0ZSBhbiBhdHRhY2hlZCBwaWN0dXJlIGZyb20gcGt0IGludG8gYW4gSUQzdjIgdGFnLgorICovCitpbnQgZmZfaWQzdjJfd3JpdGVfYXBpYyhBVkZvcm1hdENvbnRleHQgKnMsIElEM3YyRW5jQ29udGV4dCAqaWQzLCBBVlBhY2tldCAqcGt0KTsKKworLyoqCisgKiBGaW5hbGl6ZSBhbiBvcGVuZWQgSUQzdjIgdGFnLgorICovCit2b2lkIGZmX2lkM3YyX2ZpbmlzaChJRDN2MkVuY0NvbnRleHQgKmlkMywgQVZJT0NvbnRleHQgKnBiLCBpbnQgcGFkZGluZ19ieXRlcyk7CisKKy8qKgorICogV3JpdGUgYW4gSUQzdjIgdGFnIGNvbnRhaW5pbmcgYWxsIGdsb2JhbCBtZXRhZGF0YSBmcm9tIHMuCisgKiBAcGFyYW0gaWQzdjJfdmVyc2lvbiBTdWJ2ZXJzaW9uIG9mIElEM3YyOyBzdXBwb3J0ZWQgdmFsdWVzIGFyZSAzIGFuZCA0CisgKiBAcGFyYW0gbWFnaWMgbWFnaWMgYnl0ZXMgdG8gaWRlbnRpZnkgdGhlIGhlYWRlcgorICogSWYgaW4gZG91YnQsIHVzZSBJRDN2Ml9ERUZBVUxUX01BR0lDLgorICovCitpbnQgZmZfaWQzdjJfd3JpdGVfc2ltcGxlKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZDN2Ml92ZXJzaW9uLCBjb25zdCBjaGFyICptYWdpYyk7CisKKy8qKgorICogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIHBhcnNpbmcgc3BlY2lhbCAobm9uLXRleHQpIG1ldGFkYXRhLgorICogQHBhcmFtIGV4dHJhX21ldGEgUG9pbnRlciB0byBhIHBvaW50ZXIgdG8gdGhlIGhlYWQgb2YgYSBJRDN2MkV4dHJhTWV0YSBsaXN0LCAqZXh0cmFfbWV0YSBpcyBzZXQgdG8gTlVMTC4KKyAqLwordm9pZCBmZl9pZDN2Ml9mcmVlX2V4dHJhX21ldGEoSUQzdjJFeHRyYU1ldGEgKipleHRyYV9tZXRhKTsKKworLyoqCisgKiBDcmVhdGUgYSBzdHJlYW0gZm9yIGVhY2ggQVBJQyAoYXR0YWNoZWQgcGljdHVyZSkgZXh0cmFjdGVkIGZyb20gdGhlCisgKiBJRDN2MiBoZWFkZXIuCisgKi8KK2ludCBmZl9pZDN2Ml9wYXJzZV9hcGljKEFWRm9ybWF0Q29udGV4dCAqcywgSUQzdjJFeHRyYU1ldGEgKipleHRyYV9tZXRhKTsKKworZXh0ZXJuIGNvbnN0IEFWTWV0YWRhdGFDb252IGZmX2lkM3YyXzM0X21ldGFkYXRhX2NvbnZbXTsKK2V4dGVybiBjb25zdCBBVk1ldGFkYXRhQ29udiBmZl9pZDN2Ml80X21ldGFkYXRhX2NvbnZbXTsKKworLyoqCisgKiBBIGxpc3Qgb2YgdGV4dCBpbmZvcm1hdGlvbiBmcmFtZXMgYWxsb3dlZCBpbiBib3RoIElEMyB2Mi4zIGFuZCB2Mi40CisgKiBodHRwOi8vd3d3LmlkMy5vcmcvaWQzdjIuNC4wLWZyYW1lcworICogaHR0cDovL3d3dy5pZDMub3JnL2lkM3YyLjQuMC1jaGFuZ2VzCisgKi8KK2V4dGVybiBjb25zdCBjaGFyIGZmX2lkM3YyX3RhZ3NbXVs0XTsKKworLyoqCisgKiBJRDN2Mi40LW9ubHkgdGV4dCBpbmZvcm1hdGlvbiBmcmFtZXMuCisgKi8KK2V4dGVybiBjb25zdCBjaGFyIGZmX2lkM3YyXzRfdGFnc1tdWzRdOworCisvKioKKyAqIElEM3YyLjMtb25seSB0ZXh0IGluZm9ybWF0aW9uIGZyYW1lcy4KKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgZmZfaWQzdjJfM190YWdzW11bNF07CisKK2V4dGVybiBjb25zdCBDb2RlY01pbWUgZmZfaWQzdjJfbWltZV90YWdzW107CisKK2V4dGVybiBjb25zdCBjaGFyICpmZl9pZDN2Ml9waWN0dXJlX3R5cGVzWzIxXTsKKworI2VuZGlmIC8qIEFWRk9STUFUX0lEM1YyX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9pZDN2MmVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lkM3YyZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4MDRjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pZDN2MmVuYy5jCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogSUQzdjIgaGVhZGVyIHdyaXRlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW8uaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaWQzdjIuaCIKKworc3RhdGljIHZvaWQgaWQzdjJfcHV0X3NpemUoQVZJT0NvbnRleHQgKnBiLCBpbnQgc2l6ZSkKK3sKKyAgICBhdmlvX3c4KHBiLCBzaXplID4+IDIxICYgMHg3Zik7CisgICAgYXZpb193OChwYiwgc2l6ZSA+PiAxNCAmIDB4N2YpOworICAgIGF2aW9fdzgocGIsIHNpemUgPj4gNyAgJiAweDdmKTsKKyAgICBhdmlvX3c4KHBiLCBzaXplICAgICAgICYgMHg3Zik7Cit9CisKK3N0YXRpYyBpbnQgc3RyaW5nX2lzX2FzY2lpKGNvbnN0IHVpbnQ4X3QgKnN0cikKK3sKKyAgICB3aGlsZSAoKnN0ciAmJiAqc3RyIDwgMTI4KSBzdHIrKzsKKyAgICByZXR1cm4gISpzdHI7Cit9CisKK3N0YXRpYyB2b2lkIGlkM3YyX2VuY29kZV9zdHJpbmcoQVZJT0NvbnRleHQgKnBiLCBjb25zdCB1aW50OF90ICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBJRDN2MkVuY29kaW5nIGVuYykKK3sKKyAgICBpbnQgKCpwdXQpKEFWSU9Db250ZXh0KiwgY29uc3QgY2hhciopOworCisgICAgaWYgKGVuYyA9PSBJRDN2Ml9FTkNPRElOR19VVEYxNkJPTSkgeworICAgICAgICBhdmlvX3dsMTYocGIsIDB4RkVGRik7ICAgICAgLyogQk9NICovCisgICAgICAgIHB1dCA9IGF2aW9fcHV0X3N0cjE2bGU7CisgICAgfSBlbHNlCisgICAgICAgIHB1dCA9IGF2aW9fcHV0X3N0cjsKKworICAgIHB1dChwYiwgc3RyKTsKK30KKworLyoqCisgKiBXcml0ZSBhIHRleHQgZnJhbWUgd2l0aCBvbmUgKG5vcm1hbCBmcmFtZXMpIG9yIHR3byAoVFhYWCBmcmFtZXMpIHN0cmluZ3MKKyAqIGFjY29yZGluZyB0byBlbmNvZGluZyAob25seSBVVEYtOCBvciBVVEYtMTYrQk9NIHN1cHBvcnRlZCkuCisgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBpZDN2Ml9wdXRfdHRhZyhJRDN2MkVuY0NvbnRleHQgKmlkMywgQVZJT0NvbnRleHQgKmF2aW9jLCBjb25zdCBjaGFyICpzdHIxLCBjb25zdCBjaGFyICpzdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0YWcsIGVudW0gSUQzdjJFbmNvZGluZyBlbmMpCit7CisgICAgaW50IGxlbjsKKyAgICB1aW50OF90ICpwYjsKKyAgICBBVklPQ29udGV4dCAqZHluX2J1ZjsKKyAgICBpZiAoYXZpb19vcGVuX2R5bl9idWYoJmR5bl9idWYpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8qIGNoZWNrIGlmIHRoZSBzdHJpbmdzIGFyZSBBU0NJSS1vbmx5IGFuZCB1c2UgVVRGMTYgb25seSBpZgorICAgICAqIHRoZXkncmUgbm90ICovCisgICAgaWYgKGVuYyA9PSBJRDN2Ml9FTkNPRElOR19VVEYxNkJPTSAmJiBzdHJpbmdfaXNfYXNjaWkoc3RyMSkgJiYKKyAgICAgICAgKCFzdHIyIHx8IHN0cmluZ19pc19hc2NpaShzdHIyKSkpCisgICAgICAgIGVuYyA9IElEM3YyX0VOQ09ESU5HX0lTTzg4NTk7CisKKyAgICBhdmlvX3c4KGR5bl9idWYsIGVuYyk7CisgICAgaWQzdjJfZW5jb2RlX3N0cmluZyhkeW5fYnVmLCBzdHIxLCBlbmMpOworICAgIGlmIChzdHIyKQorICAgICAgICBpZDN2Ml9lbmNvZGVfc3RyaW5nKGR5bl9idWYsIHN0cjIsIGVuYyk7CisgICAgbGVuID0gYXZpb19jbG9zZV9keW5fYnVmKGR5bl9idWYsICZwYik7CisKKyAgICBhdmlvX3diMzIoYXZpb2MsIHRhZyk7CisgICAgLyogSUQzdjIuMyBmcmFtZSBzaXplIGlzIG5vdCBzeW5jaHNhZmUgKi8KKyAgICBpZiAoaWQzLT52ZXJzaW9uID09IDMpCisgICAgICAgIGF2aW9fd2IzMihhdmlvYywgbGVuKTsKKyAgICBlbHNlCisgICAgICAgIGlkM3YyX3B1dF9zaXplKGF2aW9jLCBsZW4pOworICAgIGF2aW9fd2IxNihhdmlvYywgMCk7CisgICAgYXZpb193cml0ZShhdmlvYywgcGIsIGxlbik7CisKKyAgICBhdl9mcmVlcCgmcGIpOworICAgIHJldHVybiBsZW4gKyBJRDN2Ml9IRUFERVJfU0laRTsKK30KKworc3RhdGljIGludCBpZDN2Ml9jaGVja193cml0ZV90YWcoSUQzdjJFbmNDb250ZXh0ICppZDMsIEFWSU9Db250ZXh0ICpwYiwgQVZEaWN0aW9uYXJ5RW50cnkgKnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHRhYmxlW11bNF0sIGVudW0gSUQzdjJFbmNvZGluZyBlbmMpCit7CisgICAgdWludDMyX3QgdGFnOworICAgIGludCBpOworCisgICAgaWYgKHQtPmtleVswXSAhPSAnVCcgfHwgc3RybGVuKHQtPmtleSkgIT0gNCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHRhZyA9IEFWX1JCMzIodC0+a2V5KTsKKyAgICBmb3IgKGkgPSAwOyAqdGFibGVbaV07IGkrKykKKyAgICAgICAgaWYgKHRhZyA9PSBBVl9SQjMyKHRhYmxlW2ldKSkKKyAgICAgICAgICAgIHJldHVybiBpZDN2Ml9wdXRfdHRhZyhpZDMsIHBiLCB0LT52YWx1ZSwgTlVMTCwgdGFnLCBlbmMpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgaWQzdjJfM19tZXRhZGF0YV9zcGxpdF9kYXRlKEFWRGljdGlvbmFyeSAqKnBtKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICptdGFnID0gTlVMTDsKKyAgICBBVkRpY3Rpb25hcnkgKmRzdCA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqa2V5LCAqdmFsdWU7CisgICAgY2hhciB5ZWFyWzVdID0gezB9LCBkYXlfbW9udGhbNV0gPSB7MH07CisgICAgaW50IGk7CisKKyAgICB3aGlsZSAoKG10YWcgPSBhdl9kaWN0X2dldCgqcG0sICIiLCBtdGFnLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICBrZXkgPSBtdGFnLT5rZXk7CisgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcChrZXksICJkYXRlIikpIHsKKyAgICAgICAgICAgIC8qIHNwbGl0IGRhdGUgdGFnIHVzaW5nICJZWVlZLU1NLUREIiBmb3JtYXQgaW50byB5ZWFyIGFuZCBtb250aC9kYXkgc2VnbWVudHMgKi8KKyAgICAgICAgICAgIHZhbHVlID0gbXRhZy0+dmFsdWU7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZVtpXSA+PSAnMCcgJiYgdmFsdWVbaV0gPD0gJzknKSBpKys7CisgICAgICAgICAgICBpZiAodmFsdWVbaV0gPT0gJ1wwJyB8fCB2YWx1ZVtpXSA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBhdl9zdHJsY3B5KHllYXIsIHZhbHVlLCBzaXplb2YoeWVhcikpOworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZkc3QsICJUWUVSIiwgeWVhciwgMCk7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWVbaV0gPT0gJy0nICYmCisgICAgICAgICAgICAgICAgICAgIHZhbHVlW2krMV0gPj0gJzAnICYmIHZhbHVlW2krMV0gPD0gJzEnICYmCisgICAgICAgICAgICAgICAgICAgIHZhbHVlW2krMl0gPj0gJzAnICYmIHZhbHVlW2krMl0gPD0gJzknICYmCisgICAgICAgICAgICAgICAgICAgIHZhbHVlW2krM10gPT0gJy0nICYmCisgICAgICAgICAgICAgICAgICAgIHZhbHVlW2krNF0gPj0gJzAnICYmIHZhbHVlW2krNF0gPD0gJzMnICYmCisgICAgICAgICAgICAgICAgICAgIHZhbHVlW2krNV0gPj0gJzAnICYmIHZhbHVlW2krNV0gPD0gJzknICYmCisgICAgICAgICAgICAgICAgICAgICh2YWx1ZVtpKzZdID09ICdcMCcgfHwgdmFsdWVbaSs2XSA9PSAnICcpKSB7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGRheV9tb250aCwgc2l6ZW9mKGRheV9tb250aCksICIlLjJzJS4ycyIsIHZhbHVlICsgaSArIDQsIHZhbHVlICsgaSArIDEpOworICAgICAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmZHN0LCAiVERBVCIsIGRheV9tb250aCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJmRzdCwga2V5LCB2YWx1ZSwgMCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYXZfZGljdF9zZXQoJmRzdCwga2V5LCBtdGFnLT52YWx1ZSwgMCk7CisgICAgfQorICAgIGF2X2RpY3RfZnJlZShwbSk7CisgICAgKnBtID0gZHN0OworfQorCit2b2lkIGZmX2lkM3YyX3N0YXJ0KElEM3YyRW5jQ29udGV4dCAqaWQzLCBBVklPQ29udGV4dCAqcGIsIGludCBpZDN2Ml92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptYWdpYykKK3sKKyAgICBpZDMtPnZlcnNpb24gPSBpZDN2Ml92ZXJzaW9uOworCisgICAgYXZpb193YjMyKHBiLCBNS0JFVEFHKG1hZ2ljWzBdLCBtYWdpY1sxXSwgbWFnaWNbMl0sIGlkM3YyX3ZlcnNpb24pKTsKKyAgICBhdmlvX3c4KHBiLCAwKTsKKyAgICBhdmlvX3c4KHBiLCAwKTsgLyogZmxhZ3MgKi8KKworICAgIC8qIHJlc2VydmUgc3BhY2UgZm9yIHNpemUgKi8KKyAgICBpZDMtPnNpemVfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOworfQorCitzdGF0aWMgaW50IHdyaXRlX21ldGFkYXRhKEFWSU9Db250ZXh0ICpwYiwgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElEM3YyRW5jQ29udGV4dCAqaWQzLCBpbnQgZW5jKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgZmZfbWV0YWRhdGFfY29udihtZXRhZGF0YSwgZmZfaWQzdjJfMzRfbWV0YWRhdGFfY29udiwgTlVMTCk7CisgICAgaWYgKGlkMy0+dmVyc2lvbiA9PSAzKQorICAgICAgICBpZDN2Ml8zX21ldGFkYXRhX3NwbGl0X2RhdGUobWV0YWRhdGEpOworICAgIGVsc2UgaWYgKGlkMy0+dmVyc2lvbiA9PSA0KQorICAgICAgICBmZl9tZXRhZGF0YV9jb252KG1ldGFkYXRhLCBmZl9pZDN2Ml80X21ldGFkYXRhX2NvbnYsIE5VTEwpOworCisgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQoKm1ldGFkYXRhLCAiIiwgdCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgaWYgKChyZXQgPSBpZDN2Ml9jaGVja193cml0ZV90YWcoaWQzLCBwYiwgdCwgZmZfaWQzdjJfdGFncywgZW5jKSkgPiAwKSB7CisgICAgICAgICAgICBpZDMtPmxlbiArPSByZXQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJldCA9IGlkM3YyX2NoZWNrX3dyaXRlX3RhZyhpZDMsIHBiLCB0LCBpZDMtPnZlcnNpb24gPT0gMyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2lkM3YyXzNfdGFncyA6IGZmX2lkM3YyXzRfdGFncywgZW5jKSkgPiAwKSB7CisgICAgICAgICAgICBpZDMtPmxlbiArPSByZXQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVua25vd24gdGFnLCB3cml0ZSBhcyBUWFhYIGZyYW1lICovCisgICAgICAgIGlmICgocmV0ID0gaWQzdjJfcHV0X3R0YWcoaWQzLCBwYiwgdC0+a2V5LCB0LT52YWx1ZSwgTUtCRVRBRygnVCcsICdYJywgJ1gnLCAnWCcpLCBlbmMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZDMtPmxlbiArPSByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfY2hhcHRlcihBVkZvcm1hdENvbnRleHQgKnMsIElEM3YyRW5jQ29udGV4dCAqaWQzLCBpbnQgaWQsIGludCBlbmMpCit7CisgICAgY29uc3QgQVZSYXRpb25hbCB0aW1lX2Jhc2UgPSB7MSwgMTAwMH07CisgICAgQVZDaGFwdGVyICpjaCA9IHMtPmNoYXB0ZXJzW2lkXTsKKyAgICB1aW50OF90ICpkeW5fYnVmID0gTlVMTDsKKyAgICBBVklPQ29udGV4dCAqZHluX2JjID0gTlVMTDsKKyAgICBjaGFyIG5hbWVbMTIzXTsKKyAgICBpbnQgbGVuLCBzdGFydCwgZW5kLCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZkeW5fYmMpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHN0YXJ0ID0gYXZfcmVzY2FsZV9xKGNoLT5zdGFydCwgY2gtPnRpbWVfYmFzZSwgdGltZV9iYXNlKTsKKyAgICBlbmQgICA9IGF2X3Jlc2NhbGVfcShjaC0+ZW5kLCAgIGNoLT50aW1lX2Jhc2UsIHRpbWVfYmFzZSk7CisKKyAgICBzbnByaW50ZihuYW1lLCAxMjIsICJjaCVkIiwgaWQpOworICAgIGlkMy0+bGVuICs9IGF2aW9fcHV0X3N0cihkeW5fYmMsIG5hbWUpOworICAgIGF2aW9fd2IzMihkeW5fYmMsIHN0YXJ0KTsKKyAgICBhdmlvX3diMzIoZHluX2JjLCBlbmQpOworICAgIGF2aW9fd2IzMihkeW5fYmMsIDB4RkZGRkZGRkZ1KTsKKyAgICBhdmlvX3diMzIoZHluX2JjLCAweEZGRkZGRkZGdSk7CisKKyAgICBpZiAoKHJldCA9IHdyaXRlX21ldGFkYXRhKGR5bl9iYywgJmNoLT5tZXRhZGF0YSwgaWQzLCBlbmMpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGxlbiA9IGF2aW9fY2xvc2VfZHluX2J1ZihkeW5fYmMsICZkeW5fYnVmKTsKKyAgICBpZDMtPmxlbiArPSAxNiArIElEM3YyX0hFQURFUl9TSVpFOworCisgICAgYXZpb193YjMyKHMtPnBiLCBNS0JFVEFHKCdDJywgJ0gnLCAnQScsICdQJykpOworICAgIGF2aW9fd2IzMihzLT5wYiwgbGVuKTsKKyAgICBhdmlvX3diMTYocy0+cGIsIDApOworICAgIGF2aW9fd3JpdGUocy0+cGIsIGR5bl9idWYsIGxlbik7CisKK2ZhaWw6CisgICAgaWYgKGR5bl9iYyAmJiAhZHluX2J1ZikKKyAgICAgICAgYXZpb19jbG9zZV9keW5fYnVmKGR5bl9iYywgJmR5bl9idWYpOworICAgIGF2X2ZyZWVwKCZkeW5fYnVmKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9pZDN2Ml93cml0ZV9tZXRhZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIElEM3YyRW5jQ29udGV4dCAqaWQzKQoreworICAgIGludCBlbmMgPSBpZDMtPnZlcnNpb24gPT0gMyA/IElEM3YyX0VOQ09ESU5HX1VURjE2Qk9NIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDN2Ml9FTkNPRElOR19VVEY4OworICAgIGludCBpLCByZXQ7CisKKyAgICBpZiAoKHJldCA9IHdyaXRlX21ldGFkYXRhKHMtPnBiLCAmcy0+bWV0YWRhdGEsIGlkMywgZW5jKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NoYXB0ZXJzOyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSB3cml0ZV9jaGFwdGVyKHMsIGlkMywgaSwgZW5jKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2lkM3YyX3dyaXRlX2FwaWMoQVZGb3JtYXRDb250ZXh0ICpzLCBJRDN2MkVuY0NvbnRleHQgKmlkMywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZTsKKworICAgIEFWSU9Db250ZXh0ICpkeW5fYnVmOworICAgIHVpbnQ4X3QgICAgICpidWY7CisgICAgY29uc3QgQ29kZWNNaW1lICptaW1lID0gZmZfaWQzdjJfbWltZV90YWdzOworICAgIGNvbnN0IGNoYXIgICptaW1ldHlwZSA9IE5VTEwsICpkZXNjID0gIiI7CisgICAgaW50IGVuYyA9IGlkMy0+dmVyc2lvbiA9PSAzID8gSUQzdjJfRU5DT0RJTkdfVVRGMTZCT00gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEM3YyX0VOQ09ESU5HX1VURjg7CisgICAgaW50IGksIGxlbiwgdHlwZSA9IDA7CisKKyAgICAvKiBnZXQgdGhlIG1pbWV0eXBlKi8KKyAgICB3aGlsZSAobWltZS0+aWQgIT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICBpZiAobWltZS0+aWQgPT0gc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgICAgICAgICAgbWltZXR5cGUgPSBtaW1lLT5zdHI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtaW1lKys7CisgICAgfQorICAgIGlmICghbWltZXR5cGUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vIG1pbWV0eXBlIGlzIGtub3duIGZvciBzdHJlYW0gJWQsIGNhbm5vdCAiCisgICAgICAgICAgICAgICAid3JpdGUgYW4gYXR0YWNoZWQgcGljdHVyZS5cbiIsIHN0LT5pbmRleCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogZ2V0IHRoZSBwaWN0dXJlIHR5cGUgKi8KKyAgICBlID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAiY29tbWVudCIsIE5VTEwsIDApOworICAgIGZvciAoaSA9IDA7IGUgJiYgaSA8IEZGX0FSUkFZX0VMRU1TKGZmX2lkM3YyX3BpY3R1cmVfdHlwZXMpOyBpKyspIHsKKyAgICAgICAgaWYgKCFhdl9zdHJjYXNlY21wKGUtPnZhbHVlLCBmZl9pZDN2Ml9waWN0dXJlX3R5cGVzW2ldKSkgeworICAgICAgICAgICAgdHlwZSA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCB0aGUgZGVzY3JpcHRpb24gKi8KKyAgICBpZiAoKGUgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApKSkKKyAgICAgICAgZGVzYyA9IGUtPnZhbHVlOworCisgICAgLyogdXNlIFVURjE2IG9ubHkgZm9yIG5vbi1BU0NJSSBzdHJpbmdzICovCisgICAgaWYgKGVuYyA9PSBJRDN2Ml9FTkNPRElOR19VVEYxNkJPTSAmJiBzdHJpbmdfaXNfYXNjaWkoZGVzYykpCisgICAgICAgIGVuYyA9IElEM3YyX0VOQ09ESU5HX0lTTzg4NTk7CisKKyAgICAvKiBzdGFydCB3cml0aW5nICovCisgICAgaWYgKGF2aW9fb3Blbl9keW5fYnVmKCZkeW5fYnVmKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmlvX3c4KGR5bl9idWYsIGVuYyk7CisgICAgYXZpb19wdXRfc3RyKGR5bl9idWYsIG1pbWV0eXBlKTsKKyAgICBhdmlvX3c4KGR5bl9idWYsIHR5cGUpOworICAgIGlkM3YyX2VuY29kZV9zdHJpbmcoZHluX2J1ZiwgZGVzYywgZW5jKTsKKyAgICBhdmlvX3dyaXRlKGR5bl9idWYsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICBsZW4gPSBhdmlvX2Nsb3NlX2R5bl9idWYoZHluX2J1ZiwgJmJ1Zik7CisKKyAgICBhdmlvX3diMzIocy0+cGIsIE1LQkVUQUcoJ0EnLCAnUCcsICdJJywgJ0MnKSk7CisgICAgaWYgKGlkMy0+dmVyc2lvbiA9PSAzKQorICAgICAgICBhdmlvX3diMzIocy0+cGIsIGxlbik7CisgICAgZWxzZQorICAgICAgICBpZDN2Ml9wdXRfc2l6ZShzLT5wYiwgbGVuKTsKKyAgICBhdmlvX3diMTYocy0+cGIsIDApOworICAgIGF2aW9fd3JpdGUocy0+cGIsIGJ1ZiwgbGVuKTsKKyAgICBhdl9mcmVlcCgmYnVmKTsKKworICAgIGlkMy0+bGVuICs9IGxlbiArIElEM3YyX0hFQURFUl9TSVpFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfaWQzdjJfZmluaXNoKElEM3YyRW5jQ29udGV4dCAqaWQzLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgcGFkZGluZ19ieXRlcykKK3sKKyAgICBpbnQ2NF90IGN1cl9wb3M7CisKKyAgICBpZiAocGFkZGluZ19ieXRlcyA8IDApCisgICAgICAgIHBhZGRpbmdfYnl0ZXMgPSAxMDsKKworICAgIC8qIFRoZSBJRDN2Mi4zIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgMjggYml0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlCisgICAgICogc2l6ZSBvZiB0aGUgd2hvbGUgdGFnLiAgVGhlcmVmb3JlIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHRhZyBuZWVkcyB0byBiZQorICAgICAqIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdXBwZXIgbGltaXQgb2YgMl4yOC0xIHRvIGNsaXAgdGhlIHZhbHVlIGNvcnJlY3RseS4gKi8KKyAgICAvKiBUaGUgbWluaW11bSBvZiAxMCBpcyBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHBhZGRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgdGFnCisgICAgICogdG8gZml4IGNvdmVyIGFydCBkaXNwbGF5IHdpdGggc29tZSBzb2Z0d2FyZSBzdWNoIGFzIGlUdW5lcywgVHJha3RvciwKKyAgICAgKiBTZXJhdG8sIFRvcnEuICovCisgICAgcGFkZGluZ19ieXRlcyA9IGF2X2NsaXAocGFkZGluZ19ieXRlcywgMTAsIDI2ODQzNTQ1NSAtIGlkMy0+bGVuKTsKKyAgICBmZmlvX2ZpbGwocGIsIDAsIHBhZGRpbmdfYnl0ZXMpOworICAgIGlkMy0+bGVuICs9IHBhZGRpbmdfYnl0ZXM7CisKKyAgICBjdXJfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3NlZWsocGIsIGlkMy0+c2l6ZV9wb3MsIFNFRUtfU0VUKTsKKyAgICBpZDN2Ml9wdXRfc2l6ZShwYiwgaWQzLT5sZW4pOworICAgIGF2aW9fc2VlayhwYiwgY3VyX3BvcywgU0VFS19TRVQpOworfQorCitpbnQgZmZfaWQzdjJfd3JpdGVfc2ltcGxlKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZDN2Ml92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptYWdpYykKK3sKKyAgICBJRDN2MkVuY0NvbnRleHQgaWQzID0geyAwIH07CisgICAgaW50IHJldDsKKworICAgIGZmX2lkM3YyX3N0YXJ0KCZpZDMsIHMtPnBiLCBpZDN2Ml92ZXJzaW9uLCBtYWdpYyk7CisgICAgaWYgKChyZXQgPSBmZl9pZDN2Ml93cml0ZV9tZXRhZGF0YShzLCAmaWQzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGZmX2lkM3YyX2ZpbmlzaCgmaWQzLCBzLT5wYiwgcy0+bWV0YWRhdGFfaGVhZGVyX3BhZGRpbmcpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaWRjaW4uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pZGNpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YTQ2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaWRjaW4uYwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIGlkIFF1YWtlIElJIENJTiBGaWxlIERlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaWQgUXVha2UgSUkgQ0lOIGZpbGUgZGVtdXhlciBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGlkIENJTiBmb3JtYXQsIHZpc2l0OgorICogICBodHRwOi8vd3d3LmNzc2UubW9uYXNoLmVkdS5hdS9+dGltZi8KKyAqCisgKiBDSU4gaXMgYSBzb21ld2hhdCBxdWlya3kgYW5kIGlsbC1kZWZpbmVkIGZvcm1hdC4gSGVyZSBhcmUgc29tZSBub3RlcworICogZm9yIGFueW9uZSB0cnlpbmcgdG8gdW5kZXJzdGFuZCB0aGUgdGVjaG5pY2FsIGRldGFpbHMgb2YgdGhpcyBmb3JtYXQ6CisgKgorICogVGhlIGZvcm1hdCBoYXMgbm8gZGVmaW5pdGUgZmlsZSBzaWduYXR1cmUuIFRoaXMgaXMgcHJvYmxlbWF0aWMgZm9yIGEKKyAqIGdlbmVyYWwtcHVycG9zZSBtZWRpYSBwbGF5ZXIgdGhhdCB3YW50cyB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBmaWxlCisgKiB0eXBlcy4gSG93ZXZlciwgYSBDSU4gZmlsZSBkb2VzIHN0YXJ0IHdpdGggNSAzMi1iaXQgbnVtYmVycyB0aGF0CisgKiBzcGVjaWZ5IGF1ZGlvIGFuZCB2aWRlbyBwYXJhbWV0ZXJzLiBUaGlzIGRlbXV4ZXIgZ2V0cyBhcm91bmQgdGhlIGxhY2sKKyAqIG9mIGZpbGUgc2lnbmF0dXJlIGJ5IHBlcmZvcm1pbmcgc2FuaXR5IGNoZWNrcyBvbiB0aG9zZSBwYXJhbWV0ZXJzLgorICogUHJvYmFiYWxpc3RpY2FsbHksIHRoaXMgaXMgYSByZWFzb25hYmxlIHNvbHV0aW9uIHNpbmNlIHRoZSBudW1iZXIgb2YKKyAqIHZhbGlkIGNvbWJpbmF0aW9ucyBvZiB0aGUgNSBwYXJhbWV0ZXJzIGlzIGEgdmVyeSBzbWFsbCBzdWJzZXQgb2YgdGhlCisgKiB0b3RhbCAxNjAtYml0IG51bWJlciBzcGFjZS4KKyAqCisgKiBSZWZlciB0byB0aGUgZnVuY3Rpb24gaWRjaW5fcHJvYmUoKSBmb3IgdGhlIHByZWNpc2UgQS9WIHBhcmFtZXRlcnMKKyAqIHRoYXQgdGhpcyBkZW11eGVyIGFsbG93cy4KKyAqCisgKiBOZXh0LCBlYWNoIGF1ZGlvIGFuZCB2aWRlbyBmcmFtZSBoYXMgYSBkdXJhdGlvbiBvZiAxLzE0IHNlYy4gSWYgdGhlCisgKiBhdWRpbyBzYW1wbGUgcmF0ZSBpcyBhIG11bHRpcGxlIG9mIHRoZSBjb21tb24gZnJlcXVlbmN5IDIyMDUwIEh6IGl0IHdpbGwKKyAqIGRpdmlkZSBldmVubHkgYnkgMTQuIEhvd2V2ZXIsIGlmIHRoZSBzYW1wbGUgcmF0ZSBpcyAxMTAyNSBIejoKKyAqICAgMTEwMjUgKHNhbXBsZXMvc2VjKSAvIDE0IChmcmFtZXMvc2VjKSA9IDc4Ny41IChzYW1wbGVzL2ZyYW1lKQorICogVGhlIHdheSB0aGUgQ0lOIHN0b3JlcyBhdWRpbyBpbiB0aGlzIGNhc2UgaXMgYnkgc3RvcmluZyA3ODcgc2FtcGxlCisgKiBmcmFtZXMgaW4gdGhlIGZpcnN0IGF1ZGlvIGZyYW1lIGFuZCA3ODggc2FtcGxlIGZyYW1lcyBpbiB0aGUgc2Vjb25kCisgKiBhdWRpbyBmcmFtZS4gVGhlcmVmb3JlLCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluIGFuIGF1ZGlvIGZyYW1lCisgKiBpcyBnaXZlbiBhczoKKyAqICAgYXVkaW8gZnJhbWUgIzA6IDc4NyAqIChieXRlcy9zYW1wbGUpICogKCMgY2hhbm5lbHMpIGJ5dGVzIGluIGZyYW1lCisgKiAgIGF1ZGlvIGZyYW1lICMxOiA3ODggKiAoYnl0ZXMvc2FtcGxlKSAqICgjIGNoYW5uZWxzKSBieXRlcyBpbiBmcmFtZQorICogICBhdWRpbyBmcmFtZSAjMjogNzg3ICogKGJ5dGVzL3NhbXBsZSkgKiAoIyBjaGFubmVscykgYnl0ZXMgaW4gZnJhbWUKKyAqICAgYXVkaW8gZnJhbWUgIzM6IDc4OCAqIChieXRlcy9zYW1wbGUpICogKCMgY2hhbm5lbHMpIGJ5dGVzIGluIGZyYW1lCisgKgorICogRmluYWxseSwgbm90IGFsbCBpZCBDSU4gY3JlYXRpb24gdG9vbHMgYWdyZWUgb24gdGhlIHJlc29sdXRpb24gb2YgdGhlCisgKiBjb2xvciBwYWxldHRlLCBhcHBhcmVudGx5LiBTb21lIGNyZWF0aW9uIHRvb2xzIHNwZWNpZnkgcmVkLCBncmVlbiwgYW5kCisgKiBibHVlIHBhbGV0dGUgY29tcG9uZW50cyBpbiB0ZXJtcyBvZiA2LWJpdCBWR0EgY29sb3IgREFDIHZhbHVlcyB3aGljaAorICogcmFuZ2UgZnJvbSAwLi42My4gT3RoZXIgdG9vbHMgc3BlY2lmeSB0aGUgUkdCIGNvbXBvbmVudHMgYXMgZnVsbCA4LWJpdAorICogdmFsdWVzIHRoYXQgcmFuZ2UgZnJvbSAwLi4yNTUuIFNpbmNlIHRoZXJlIGFyZSBubyBtYXJrZXJzIGluIHRoZSBmaWxlIHRvCisgKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHR3byB2YXJpYW50cywgdGhpcyBkZW11eGVyIHVzZXMgdGhlIGZvbGxvd2luZworICogaGV1cmlzdGljOgorICogICAtIGxvYWQgdGhlIDc2OCBwYWxldHRlIGJ5dGVzIGZyb20gZGlzaworICogICAtIGFzc3VtZSB0aGF0IHRoZXkgd2lsbCBuZWVkIHRvIGJlIHNoaWZ0ZWQgbGVmdCBieSAyIGJpdHMgdG8KKyAqICAgICB0cmFuc2Zvcm0gdGhlbSBmcm9tIDYtYml0IHZhbHVlcyB0byA4LWJpdCB2YWx1ZXMKKyAqICAgLSBzY2FuIHRocm91Z2ggYWxsIDc2OCBwYWxldHRlIGJ5dGVzCisgKiAgICAgLSBpZiBhbnkgYnl0ZXMgZXhjZWVkIDYzLCBkbyBub3Qgc2hpZnQgdGhlIGJ5dGVzIGF0IGFsbCBiZWZvcmUKKyAqICAgICAgIHRyYW5zbWl0dGluZyB0aGVtIHRvIHRoZSB2aWRlbyBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgSFVGRk1BTl9UQUJMRV9TSVpFICg2NCAqIDEwMjQpCisjZGVmaW5lIElEQ0lOX0ZQUyAxNAorCit0eXBlZGVmIHN0cnVjdCBJZGNpbkRlbXV4Q29udGV4dCB7CisgICAgaW50IHZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICBpbnQgYXVkaW9fc3RyZWFtX2luZGV4OworICAgIGludCBhdWRpb19jaHVua19zaXplMTsKKyAgICBpbnQgYXVkaW9fY2h1bmtfc2l6ZTI7CisgICAgaW50IGJsb2NrX2FsaWduOworCisgICAgLyogZGVtdXggc3RhdGUgdmFyaWFibGVzICovCisgICAgaW50IGN1cnJlbnRfYXVkaW9fY2h1bms7CisgICAgaW50IG5leHRfY2h1bmtfaXNfdmlkZW87CisgICAgaW50IGF1ZGlvX3ByZXNlbnQ7CisgICAgaW50NjRfdCBmaXJzdF9wa3RfcG9zOworfSBJZGNpbkRlbXV4Q29udGV4dDsKKworc3RhdGljIGludCBpZGNpbl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbnVtYmVyLCBzYW1wbGVfcmF0ZTsKKyAgICB1bnNpZ25lZCBpbnQgdywgaDsKKyAgICBpbnQgaTsKKworICAgIC8qCisgICAgICogVGhpcyBpcyB3aGF0IHlvdSBjb3VsZCBjYWxsIGEgInByb2JhYmlsaXN0aWMiIGZpbGUgY2hlY2s6IGlkIENJTgorICAgICAqIGZpbGVzIGRvbid0IGhhdmUgYSBkZWZpbml0ZSBmaWxlIHNpZ25hdHVyZS4gSW4gbGlldSBvZiBzdWNoIGEgbWFya2VyLAorICAgICAqIHBlcmZvcm0gc2FuaXR5IGNoZWNrcyBvbiB0aGUgNSAzMi1iaXQgaGVhZGVyIGZpZWxkczoKKyAgICAgKiAgd2lkdGgsIGhlaWdodDogZ3JlYXRlciB0aGFuIDAsIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxMDI0CisgICAgICogYXVkaW8gc2FtcGxlIHJhdGU6IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA4MDAwLCBsZXNzIHRoYW4gb3IKKyAgICAgKiAgZXF1YWwgdG8gNDgwMDAsIG9yIDAgZm9yIG5vIGF1ZGlvCisgICAgICogYXVkaW8gc2FtcGxlIHdpZHRoIChieXRlcy9zYW1wbGUpOiAwIGZvciBubyBhdWRpbywgb3IgMSBvciAyCisgICAgICogYXVkaW8gY2hhbm5lbHM6IDAgZm9yIG5vIGF1ZGlvLCBvciAxIG9yIDIKKyAgICAgKi8KKworICAgIC8qIGNoZWNrIHdlIGhhdmUgZW5vdWdoIGRhdGEgdG8gZG8gYWxsIGNoZWNrcywgb3RoZXJ3aXNlIHRoZQorICAgICAgIDAtcGFkZGluZyBtYXkgY2F1c2UgYSB3cm9uZyByZWNvZ25pdGlvbiAqLworICAgIGlmIChwLT5idWZfc2l6ZSA8IDIwICsgSFVGRk1BTl9UQUJMRV9TSVpFICsgMTIpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogY2hlY2sgdGhlIHZpZGVvIHdpZHRoICovCisgICAgdyA9IEFWX1JMMzIoJnAtPmJ1ZlswXSk7CisgICAgaWYgKCh3ID09IDApIHx8ICh3ID4gMTAyNCkpCisgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayB0aGUgdmlkZW8gaGVpZ2h0ICovCisgICAgaCA9IEFWX1JMMzIoJnAtPmJ1Zls0XSk7CisgICAgaWYgKChoID09IDApIHx8IChoID4gMTAyNCkpCisgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayB0aGUgYXVkaW8gc2FtcGxlIHJhdGUgKi8KKyAgICBzYW1wbGVfcmF0ZSA9IEFWX1JMMzIoJnAtPmJ1Zls4XSk7CisgICAgaWYgKHNhbXBsZV9yYXRlICYmIChzYW1wbGVfcmF0ZSA8IDgwMDAgfHwgc2FtcGxlX3JhdGUgPiA0ODAwMCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogY2hlY2sgdGhlIGF1ZGlvIGJ5dGVzL3NhbXBsZSAqLworICAgIG51bWJlciA9IEFWX1JMMzIoJnAtPmJ1ZlsxMl0pOworICAgIGlmIChudW1iZXIgPiAyIHx8IHNhbXBsZV9yYXRlICYmICFudW1iZXIpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogY2hlY2sgdGhlIGF1ZGlvIGNoYW5uZWxzICovCisgICAgbnVtYmVyID0gQVZfUkwzMigmcC0+YnVmWzE2XSk7CisgICAgaWYgKG51bWJlciA+IDIgfHwgc2FtcGxlX3JhdGUgJiYgIW51bWJlcikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpID0gMjAgKyBIVUZGTUFOX1RBQkxFX1NJWkU7CisgICAgaWYgKEFWX1JMMzIoJnAtPmJ1ZltpXSkgPT0gMSkKKyAgICAgICAgaSArPSA3Njg7CisKKyAgICBpZiAoaSsxMiA+IHAtPmJ1Zl9zaXplIHx8IEFWX1JMMzIoJnAtPmJ1ZltpKzhdKSAhPSB3KmgpCisgICAgICAgIHJldHVybiAxOworCisgICAgLyogcmV0dXJuIGhhbGYgY2VydGFpbnR5IHNpbmNlIHRoaXMgY2hlY2sgaXMgYSBiaXQgc2tldGNoeSAqLworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKK30KKworc3RhdGljIGludCBpZGNpbl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgSWRjaW5EZW11eENvbnRleHQgKmlkY2luID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICB1bnNpZ25lZCBpbnQgc2FtcGxlX3JhdGUsIGJ5dGVzX3Blcl9zYW1wbGUsIGNoYW5uZWxzOworICAgIGludCByZXQ7CisKKyAgICAvKiBnZXQgdGhlIDUgaGVhZGVyIHBhcmFtZXRlcnMgKi8KKyAgICB3aWR0aCA9IGF2aW9fcmwzMihwYik7CisgICAgaGVpZ2h0ID0gYXZpb19ybDMyKHBiKTsKKyAgICBzYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihwYik7CisgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IGF2aW9fcmwzMihwYik7CisgICAgY2hhbm5lbHMgPSBhdmlvX3JsMzIocGIpOworCisgICAgaWYgKHMtPnBiLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW5jb21wbGV0ZSBoZWFkZXJcbiIpOworICAgICAgICByZXR1cm4gcy0+cGItPmVycm9yID8gcy0+cGItPmVycm9yIDogQVZFUlJPUl9FT0Y7CisgICAgfQorCisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUod2lkdGgsIGhlaWdodCwgMCwgcykgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoc2FtcGxlX3JhdGUgPiAwKSB7CisgICAgICAgIGlmIChzYW1wbGVfcmF0ZSA8IDE0IHx8IHNhbXBsZV9yYXRlID4gSU5UX01BWCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc2FtcGxlIHJhdGU6ICV1XG4iLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXNfcGVyX3NhbXBsZSA8IDEgfHwgYnl0ZXNfcGVyX3NhbXBsZSA+IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGJ5dGVzIHBlciBzYW1wbGU6ICV1XG4iLAorICAgICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl9zYW1wbGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYW5uZWxzIDwgMSB8fCBjaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGNoYW5uZWxzOiAldVxuIiwgY2hhbm5lbHMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWRjaW4tPmF1ZGlvX3ByZXNlbnQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGlmIHNhbXBsZSByYXRlIGlzIDAsIGFzc3VtZSBubyBhdWRpbyAqLworICAgICAgICBpZGNpbi0+YXVkaW9fcHJlc2VudCA9IDA7CisgICAgfQorCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzMsIDEsIElEQ0lOX0ZQUyk7CisgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOworICAgIGlkY2luLT52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9JRENJTjsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KKyAgICBzdC0+Y29kZWMtPndpZHRoID0gd2lkdGg7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAvKiBsb2FkIHVwIHRoZSBIdWZmbWFuIHRhYmxlcyBpbnRvIGV4dHJhZGF0YSAqLworICAgIGlmICgocmV0ID0gZmZfZ2V0X2V4dHJhZGF0YShzdC0+Y29kZWMsIHBiLCBIVUZGTUFOX1RBQkxFX1NJWkUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoaWRjaW4tPmF1ZGlvX3ByZXNlbnQpIHsKKyAgICAgICAgaWRjaW4tPmF1ZGlvX3ByZXNlbnQgPSAxOworICAgICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2MywgMSwgc2FtcGxlX3JhdGUpOworICAgICAgICBzdC0+c3RhcnRfdGltZSA9IDA7CisgICAgICAgIGlkY2luLT5hdWRpb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAxOworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBjaGFubmVscyA+IDEgPyBBVl9DSF9MQVlPVVRfU1RFUkVPIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYnl0ZXNfcGVyX3NhbXBsZSAqIDg7CisgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzYW1wbGVfcmF0ZSAqIGJ5dGVzX3Blcl9zYW1wbGUgKiA4ICogY2hhbm5lbHM7CisgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBpZGNpbi0+YmxvY2tfYWxpZ24gPSBieXRlc19wZXJfc2FtcGxlICogY2hhbm5lbHM7CisgICAgICAgIGlmIChieXRlc19wZXJfc2FtcGxlID09IDEpCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworCisgICAgICAgIGlmIChzYW1wbGVfcmF0ZSAlIDE0ICE9IDApIHsKKyAgICAgICAgICAgIGlkY2luLT5hdWRpb19jaHVua19zaXplMSA9IChzYW1wbGVfcmF0ZSAvIDE0KSAqCisgICAgICAgICAgICBieXRlc19wZXJfc2FtcGxlICogY2hhbm5lbHM7CisgICAgICAgICAgICBpZGNpbi0+YXVkaW9fY2h1bmtfc2l6ZTIgPSAoc2FtcGxlX3JhdGUgLyAxNCArIDEpICoKKyAgICAgICAgICAgICAgICBieXRlc19wZXJfc2FtcGxlICogY2hhbm5lbHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZGNpbi0+YXVkaW9fY2h1bmtfc2l6ZTEgPSBpZGNpbi0+YXVkaW9fY2h1bmtfc2l6ZTIgPQorICAgICAgICAgICAgICAgIChzYW1wbGVfcmF0ZSAvIDE0KSAqIGJ5dGVzX3Blcl9zYW1wbGUgKiBjaGFubmVsczsKKyAgICAgICAgfQorICAgICAgICBpZGNpbi0+Y3VycmVudF9hdWRpb19jaHVuayA9IDA7CisgICAgfQorCisgICAgaWRjaW4tPm5leHRfY2h1bmtfaXNfdmlkZW8gPSAxOworICAgIGlkY2luLT5maXJzdF9wa3RfcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlkY2luX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGludCBjb21tYW5kOworICAgIHVuc2lnbmVkIGludCBjaHVua19zaXplOworICAgIElkY2luRGVtdXhDb250ZXh0ICppZGNpbiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgaTsKKyAgICBpbnQgcGFsZXR0ZV9zY2FsZTsKKyAgICB1bnNpZ25lZCBjaGFyIHIsIGcsIGI7CisgICAgdW5zaWduZWQgY2hhciBwYWxldHRlX2J1ZmZlcls3NjhdOworICAgIHVpbnQzMl90IHBhbGV0dGVbMjU2XTsKKworICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKQorICAgICAgICByZXR1cm4gcy0+cGItPmVycm9yID8gcy0+cGItPmVycm9yIDogQVZFUlJPUl9FT0Y7CisKKyAgICBpZiAoaWRjaW4tPm5leHRfY2h1bmtfaXNfdmlkZW8pIHsKKyAgICAgICAgY29tbWFuZCA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGlmIChjb21tYW5kID09IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAxKSB7CisgICAgICAgICAgICAvKiB0cmlnZ2VyIGEgcGFsZXR0ZSBjaGFuZ2UgKi8KKyAgICAgICAgICAgIHJldCA9IGF2aW9fcmVhZChwYiwgcGFsZXR0ZV9idWZmZXIsIDc2OCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSA3NjgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW5jb21wbGV0ZSBwYWNrZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBzY2FsZSB0aGUgcGFsZXR0ZSBhcyBuZWNlc3NhcnkgKi8KKyAgICAgICAgICAgIHBhbGV0dGVfc2NhbGUgPSAyOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDc2ODsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChwYWxldHRlX2J1ZmZlcltpXSA+IDYzKSB7CisgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVfc2NhbGUgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgICAgICAgIHIgPSBwYWxldHRlX2J1ZmZlcltpICogMyAgICBdIDw8IHBhbGV0dGVfc2NhbGU7CisgICAgICAgICAgICAgICAgZyA9IHBhbGV0dGVfYnVmZmVyW2kgKiAzICsgMV0gPDwgcGFsZXR0ZV9zY2FsZTsKKyAgICAgICAgICAgICAgICBiID0gcGFsZXR0ZV9idWZmZXJbaSAqIDMgKyAyXSA8PCBwYWxldHRlX3NjYWxlOworICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0gPSAoMHhGRlUgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYik7CisgICAgICAgICAgICAgICAgaWYgKHBhbGV0dGVfc2NhbGUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSB8PSBwYWxldHRlW2ldID4+IDYgJiAweDMwMzAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnBiLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImluY29tcGxldGUgcGFja2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBzLT5wYi0+ZXJyb3IgPyBzLT5wYi0+ZXJyb3IgOiBBVkVSUk9SX0VPRjsKKyAgICAgICAgfQorICAgICAgICBjaHVua19zaXplID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgaWYgKGNodW5rX3NpemUgPCA0IHx8IGNodW5rX3NpemUgPiBJTlRfTUFYIC0gNCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgY2h1bmsgc2l6ZTogJXVcbiIsIGNodW5rX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgLyogc2tpcCB0aGUgbnVtYmVyIG9mIGRlY29kZWQgYnl0ZXMgKGFsd2F5cyBlcXVhbCB0byB3aWR0aCAqIGhlaWdodCkgKi8KKyAgICAgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICAgICAgaWYgKGNodW5rX3NpemUgPCA0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGNodW5rX3NpemUgLT0gNDsKKyAgICAgICAgcmV0PSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGNodW5rX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGVsc2UgaWYgKHJldCAhPSBjaHVua19zaXplKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW5jb21wbGV0ZSBwYWNrZXRcbiIpOworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gMSkgeworICAgICAgICAgICAgdWludDhfdCAqcGFsOworCisgICAgICAgICAgICBwYWwgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgICAgICBpZiAoIXBhbCkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShwYWwsIHBhbGV0dGUsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICB9CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gaWRjaW4tPnZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICAgICAgcGt0LT5kdXJhdGlvbiAgICAgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHNlbmQgb3V0IHRoZSBhdWRpbyBjaHVuayAqLworICAgICAgICBpZiAoaWRjaW4tPmN1cnJlbnRfYXVkaW9fY2h1bmspCisgICAgICAgICAgICBjaHVua19zaXplID0gaWRjaW4tPmF1ZGlvX2NodW5rX3NpemUyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjaHVua19zaXplID0gaWRjaW4tPmF1ZGlvX2NodW5rX3NpemUxOworICAgICAgICByZXQ9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgY2h1bmtfc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBpZGNpbi0+YXVkaW9fc3RyZWFtX2luZGV4OworICAgICAgICBwa3QtPmR1cmF0aW9uICAgICA9IGNodW5rX3NpemUgLyBpZGNpbi0+YmxvY2tfYWxpZ247CisKKyAgICAgICAgaWRjaW4tPmN1cnJlbnRfYXVkaW9fY2h1bmsgXj0gMTsKKyAgICB9CisKKyAgICBpZiAoaWRjaW4tPmF1ZGlvX3ByZXNlbnQpCisgICAgICAgIGlkY2luLT5uZXh0X2NodW5rX2lzX3ZpZGVvIF49IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZGNpbl9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBJZGNpbkRlbXV4Q29udGV4dCAqaWRjaW4gPSBzLT5wcml2X2RhdGE7CisKKyAgICBpZiAoaWRjaW4tPmZpcnN0X3BrdF9wb3MgPiAwKSB7CisgICAgICAgIGludCByZXQgPSBhdmlvX3NlZWsocy0+cGIsIGlkY2luLT5maXJzdF9wa3RfcG9zLCBTRUVLX1NFVCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZmZfdXBkYXRlX2N1cl9kdHMocywgcy0+c3RyZWFtc1tpZGNpbi0+dmlkZW9fc3RyZWFtX2luZGV4XSwgMCk7CisgICAgICAgIGlkY2luLT5uZXh0X2NodW5rX2lzX3ZpZGVvID0gMTsKKyAgICAgICAgaWRjaW4tPmN1cnJlbnRfYXVkaW9fY2h1bmsgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitBVklucHV0Rm9ybWF0IGZmX2lkY2luX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImlkY2luIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiaWQgQ2luZW1hdGljIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKElkY2luRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBpZGNpbl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBpZGNpbl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBpZGNpbl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSBpZGNpbl9yZWFkX3NlZWssCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9fQllURV9TRUVLLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9pZHJvcWRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lkcm9xZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiYjM5MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pZHJvcWRlYy5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogaWQgUm9RICgucm9xKSBGaWxlIERlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaWQgUm9RIGZvcm1hdCBmaWxlIGRlbXV4ZXIKKyAqIGJ5IE1pa2UgTWVsYW5zb24gKG1lbGFuc29uQHBjaXN5cy5uZXQpCisgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgLnJvcSBmaWxlIGZvcm1hdCwgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cuY3NzZS5tb25hc2guZWR1LmF1L350aW1mLworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKworI2RlZmluZSBSb1FfTUFHSUNfTlVNQkVSIDB4MTA4NAorI2RlZmluZSBSb1FfQ0hVTktfUFJFQU1CTEVfU0laRSA4CisjZGVmaW5lIFJvUV9BVURJT19TQU1QTEVfUkFURSAyMjA1MAorI2RlZmluZSBSb1FfQ0hVTktTX1RPX1NDQU4gMzAKKworI2RlZmluZSBSb1FfSU5GTyAgICAgICAgICAgMHgxMDAxCisjZGVmaW5lIFJvUV9RVUFEX0NPREVCT09LICAweDEwMDIKKyNkZWZpbmUgUm9RX1FVQURfVlEgICAgICAgIDB4MTAxMQorI2RlZmluZSBSb1FfU09VTkRfTU9OTyAgICAgMHgxMDIwCisjZGVmaW5lIFJvUV9TT1VORF9TVEVSRU8gICAweDEwMjEKKwordHlwZWRlZiBzdHJ1Y3QgUm9xRGVtdXhDb250ZXh0IHsKKworICAgIGludCBmcmFtZV9yYXRlOworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCBhdWRpb19jaGFubmVsczsKKworICAgIGludCB2aWRlb19zdHJlYW1faW5kZXg7CisgICAgaW50IGF1ZGlvX3N0cmVhbV9pbmRleDsKKworICAgIGludDY0X3QgdmlkZW9fcHRzOworICAgIHVuc2lnbmVkIGludCBhdWRpb19mcmFtZV9jb3VudDsKKworfSBSb3FEZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcm9xX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmICgoQVZfUkwxNigmcC0+YnVmWzBdKSAhPSBSb1FfTUFHSUNfTlVNQkVSKSB8fAorICAgICAgICAoQVZfUkwzMigmcC0+YnVmWzJdKSAhPSAweEZGRkZGRkZGKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBpbnQgcm9xX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBSb3FEZW11eENvbnRleHQgKnJvcSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1bnNpZ25lZCBjaGFyIHByZWFtYmxlW1JvUV9DSFVOS19QUkVBTUJMRV9TSVpFXTsKKworICAgIC8qIGdldCB0aGUgbWFpbiBoZWFkZXIgKi8KKyAgICBpZiAoYXZpb19yZWFkKHBiLCBwcmVhbWJsZSwgUm9RX0NIVU5LX1BSRUFNQkxFX1NJWkUpICE9CisgICAgICAgIFJvUV9DSFVOS19QUkVBTUJMRV9TSVpFKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIHJvcS0+ZnJhbWVfcmF0ZSA9IEFWX1JMMTYoJnByZWFtYmxlWzZdKTsKKworICAgIC8qIGluaXQgcHJpdmF0ZSBjb250ZXh0IHBhcmFtZXRlcnMgKi8KKyAgICByb3EtPndpZHRoID0gcm9xLT5oZWlnaHQgPSByb3EtPmF1ZGlvX2NoYW5uZWxzID0gcm9xLT52aWRlb19wdHMgPQorICAgIHJvcS0+YXVkaW9fZnJhbWVfY291bnQgPSAwOworICAgIHJvcS0+YXVkaW9fc3RyZWFtX2luZGV4ID0gLTE7CisgICAgcm9xLT52aWRlb19zdHJlYW1faW5kZXggPSAtMTsKKworICAgIHMtPmN0eF9mbGFncyB8PSBBVkZNVENUWF9OT0hFQURFUjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvcV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIFJvcURlbXV4Q29udGV4dCAqcm9xID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCByZXQgPSAwOworICAgIHVuc2lnbmVkIGludCBjaHVua19zaXplOworICAgIHVuc2lnbmVkIGludCBjaHVua190eXBlOworICAgIHVuc2lnbmVkIGludCBjb2RlYm9va19zaXplOworICAgIHVuc2lnbmVkIGNoYXIgcHJlYW1ibGVbUm9RX0NIVU5LX1BSRUFNQkxFX1NJWkVdOworICAgIGludCBwYWNrZXRfcmVhZCA9IDA7CisgICAgaW50NjRfdCBjb2RlYm9va19vZmZzZXQ7CisKKyAgICB3aGlsZSAoIXBhY2tldF9yZWFkKSB7CisKKyAgICAgICAgaWYgKGF2aW9fZmVvZihzLT5wYikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgICAgIC8qIGdldCB0aGUgbmV4dCBjaHVuayBwcmVhbWJsZSAqLworICAgICAgICBpZiAoKHJldCA9IGF2aW9fcmVhZChwYiwgcHJlYW1ibGUsIFJvUV9DSFVOS19QUkVBTUJMRV9TSVpFKSkgIT0KKyAgICAgICAgICAgIFJvUV9DSFVOS19QUkVBTUJMRV9TSVpFKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgICAgICBjaHVua190eXBlID0gQVZfUkwxNigmcHJlYW1ibGVbMF0pOworICAgICAgICBjaHVua19zaXplID0gQVZfUkwzMigmcHJlYW1ibGVbMl0pOworICAgICAgICBpZihjaHVua19zaXplID4gSU5UX01BWCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGNodW5rX3NpemUgPSBmZmlvX2xpbWl0KHBiLCBjaHVua19zaXplKTsKKworICAgICAgICBzd2l0Y2ggKGNodW5rX3R5cGUpIHsKKworICAgICAgICBjYXNlIFJvUV9JTkZPOgorICAgICAgICAgICAgaWYgKHJvcS0+dmlkZW9fc3RyZWFtX2luZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDYzLCAxLCByb3EtPmZyYW1lX3JhdGUpOworICAgICAgICAgICAgICAgIHJvcS0+dmlkZW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgID0gQVZfQ09ERUNfSURfUk9ROworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgID0gMDsgIC8qIG5vIGZvdXJjYyAqLworCisgICAgICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgcHJlYW1ibGUsIFJvUV9DSFVOS19QUkVBTUJMRV9TSVpFKSAhPSBSb1FfQ0hVTktfUFJFQU1CTEVfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICA9IHJvcS0+d2lkdGggID0gQVZfUkwxNihwcmVhbWJsZSk7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSByb3EtPmhlaWdodCA9IEFWX1JMMTYocHJlYW1ibGUgKyAyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBjaHVuayBhbnltb3JlICovCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIFJvUV9DSFVOS19QUkVBTUJMRV9TSVpFKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUm9RX1FVQURfQ09ERUJPT0s6CisgICAgICAgICAgICBpZiAocm9xLT52aWRlb19zdHJlYW1faW5kZXggPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgLyogcGFja2V0IG5lZWRzIHRvIGNvbnRhaW4gYm90aCB0aGlzIGNvZGVib29rIGFuZCBuZXh0IFZRIGNodW5rICovCisgICAgICAgICAgICBjb2RlYm9va19vZmZzZXQgPSBhdmlvX3RlbGwocGIpIC0gUm9RX0NIVU5LX1BSRUFNQkxFX1NJWkU7CisgICAgICAgICAgICBjb2RlYm9va19zaXplID0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgY29kZWJvb2tfc2l6ZSk7CisgICAgICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBwcmVhbWJsZSwgUm9RX0NIVU5LX1BSRUFNQkxFX1NJWkUpICE9CisgICAgICAgICAgICAgICAgUm9RX0NIVU5LX1BSRUFNQkxFX1NJWkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGNodW5rX3NpemUgPSBBVl9STDMyKCZwcmVhbWJsZVsyXSkgKyBSb1FfQ0hVTktfUFJFQU1CTEVfU0laRSAqIDIgKworICAgICAgICAgICAgICAgIGNvZGVib29rX3NpemU7CisKKyAgICAgICAgICAgIC8qIHJld2luZCAqLworICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBjb2RlYm9va19vZmZzZXQsIFNFRUtfU0VUKTsKKworICAgICAgICAgICAgLyogbG9hZCB1cCB0aGUgcGFja2V0ICovCisgICAgICAgICAgICByZXQ9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IGNodW5rX3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gcm9xLT52aWRlb19zdHJlYW1faW5kZXg7CisgICAgICAgICAgICBwa3QtPnB0cyA9IHJvcS0+dmlkZW9fcHRzKys7CisKKyAgICAgICAgICAgIHBhY2tldF9yZWFkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUm9RX1NPVU5EX01PTk86CisgICAgICAgIGNhc2UgUm9RX1NPVU5EX1NURVJFTzoKKyAgICAgICAgICAgIGlmIChyb3EtPmF1ZGlvX3N0cmVhbV9pbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgUm9RX0FVRElPX1NBTVBMRV9SQVRFKTsKKyAgICAgICAgICAgICAgICByb3EtPmF1ZGlvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JPUV9EUENNOworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIHRhZyAqLworICAgICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IFJvUV9TT1VORF9TVEVSRU8pIHsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDI7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJvcS0+YXVkaW9fY2hhbm5lbHMgICAgPSBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBSb1FfQVVESU9fU0FNUExFX1JBVEU7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5jaGFubmVscyAqIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKgorICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjLT5jaGFubmVscyAqIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIFJvUV9RVUFEX1ZROgorICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gUm9RX1FVQURfVlEpIHsKKyAgICAgICAgICAgICAgICBpZiAocm9xLT52aWRlb19zdHJlYW1faW5kZXggPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbG9hZCB1cCB0aGUgcGFja2V0ICovCisgICAgICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIGNodW5rX3NpemUgKyBSb1FfQ0hVTktfUFJFQU1CTEVfU0laRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIC8qIGNvcHkgb3ZlciBwcmVhbWJsZSAqLworICAgICAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgcHJlYW1ibGUsIFJvUV9DSFVOS19QUkVBTUJMRV9TSVpFKTsKKworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gUm9RX1FVQURfVlEpIHsKKyAgICAgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHJvcS0+dmlkZW9fc3RyZWFtX2luZGV4OworICAgICAgICAgICAgICAgIHBrdC0+cHRzID0gcm9xLT52aWRlb19wdHMrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSByb3EtPmF1ZGlvX3N0cmVhbV9pbmRleDsKKyAgICAgICAgICAgICAgICBwa3QtPnB0cyA9IHJvcS0+YXVkaW9fZnJhbWVfY291bnQ7CisgICAgICAgICAgICAgICAgcm9xLT5hdWRpb19mcmFtZV9jb3VudCArPSAoY2h1bmtfc2l6ZSAvIHJvcS0+YXVkaW9fY2hhbm5lbHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwa3QtPnBvcz0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgICAgIHJldCA9IGF2aW9fcmVhZChwYiwgcGt0LT5kYXRhICsgUm9RX0NIVU5LX1BSRUFNQkxFX1NJWkUsCisgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IGNodW5rX3NpemUpCisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworCisgICAgICAgICAgICBwYWNrZXRfcmVhZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiAgdW5rbm93biBSb1EgY2h1bmsgKCUwNFgpXG4iLCBjaHVua190eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9yb3FfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicm9xIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiaWQgUm9RIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFJvcURlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gcm9xX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJvcV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSByb3FfcmVhZF9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2lkcm9xZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvaWRyb3FlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGEzYWJhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lkcm9xZW5jLmMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIGlkIFJvUSAoLnJvcSkgRmlsZSBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IFZpdG9yIFNlc3NhaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJyYXdlbmMuaCIKKworCitzdGF0aWMgaW50IHJvcV93cml0ZV9oZWFkZXIoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICB1aW50OF90IGhlYWRlcltdID0geworICAgICAgICAweDg0LCAweDEwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAvKiBmcHM6ICovIDB4MUUsIDB4MDAKKyAgICB9OworICAgIGludCBuOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKworLy8gc2V0IHRoZSBhY3R1YWwgZnBzCisgICAgZm9yKG49MDtuPHMtPm5iX3N0cmVhbXM7bisrKSB7CisgICAgICAgIGlmICgoYXZjdHg9cy0+c3RyZWFtc1tuXS0+Y29kZWMpLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGZwczsKKworICAgICAgICAgICAgaWYgKGF2Y3R4LT50aW1lX2Jhc2UubnVtICE9IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZyYW1lIHJhdGUgbXVzdCBiZSBpbnRlZ2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZwcz1hdmN0eC0+dGltZV9iYXNlLmRlbikgPiAyNTUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZyYW1lIHJhdGUgbWF5IG5vdCBleGNlZWQgMjU1ZnBzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZnBzICE9IDMwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkZvciB2aW50YWdlIGNvbXBhdGliaWxpdHkgZnBzIG11c3QgYmUgMzBcbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoZWFkZXJbNl0gPSBmcHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2aW9fd3JpdGUocy0+cGIsIGhlYWRlciwgOCk7CisgICAgYXZpb19mbHVzaChzLT5wYik7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfcm9xX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAicm9xIiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBpZCBSb1EiKSwKKyAgICAuZXh0ZW5zaW9ucyAgID0gInJvcSIsCisgICAgLmF1ZGlvX2NvZGVjICA9IEFWX0NPREVDX0lEX1JPUV9EUENNLAorICAgIC52aWRlb19jb2RlYyAgPSBBVl9DT0RFQ19JRF9ST1EsCisgICAgLndyaXRlX2hlYWRlciA9IHJvcV93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2lmZi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YzI0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaWZmLmMKQEAgLTAsMCArMSw3NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSmFpa3Jpc2huYW4gTWVub24gPHJlYWxpdHltYW5AZ214Lm5ldD4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBTZWJhc3RpYW4gVmF0ZXIgPGNkZ3MuYmFzdHlAZ29vZ2xlbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIElGRiBmaWxlIGRlbXV4ZXIKKyAqIGJ5IEphaWtyaXNobmFuIE1lbm9uCisgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgLmlmZiBmaWxlIGZvcm1hdCwgdmlzaXQ6CisgKiBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1JRkYKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaWQzdjIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIElEXzhTVlggICAgICAgTUtUQUcoJzgnLCdTJywnVicsJ1gnKQorI2RlZmluZSBJRF8xNlNWICAgICAgIE1LVEFHKCcxJywnNicsJ1MnLCdWJykKKyNkZWZpbmUgSURfTUFVRCAgICAgICBNS1RBRygnTScsJ0EnLCdVJywnRCcpCisjZGVmaW5lIElEX01IRFIgICAgICAgTUtUQUcoJ00nLCdIJywnRCcsJ1InKQorI2RlZmluZSBJRF9NREFUICAgICAgIE1LVEFHKCdNJywnRCcsJ0EnLCdUJykKKyNkZWZpbmUgSURfVkhEUiAgICAgICBNS1RBRygnVicsJ0gnLCdEJywnUicpCisjZGVmaW5lIElEX0FUQUsgICAgICAgTUtUQUcoJ0EnLCdUJywnQScsJ0snKQorI2RlZmluZSBJRF9STFNFICAgICAgIE1LVEFHKCdSJywnTCcsJ1MnLCdFJykKKyNkZWZpbmUgSURfQ0hBTiAgICAgICBNS1RBRygnQycsJ0gnLCdBJywnTicpCisjZGVmaW5lIElEX1BCTSAgICAgICAgTUtUQUcoJ1AnLCdCJywnTScsJyAnKQorI2RlZmluZSBJRF9JTEJNICAgICAgIE1LVEFHKCdJJywnTCcsJ0InLCdNJykKKyNkZWZpbmUgSURfQk1IRCAgICAgICBNS1RBRygnQicsJ00nLCdIJywnRCcpCisjZGVmaW5lIElEX0RHQkwgICAgICAgTUtUQUcoJ0QnLCdHJywnQicsJ0wnKQorI2RlZmluZSBJRF9DQU1HICAgICAgIE1LVEFHKCdDJywnQScsJ00nLCdHJykKKyNkZWZpbmUgSURfQ01BUCAgICAgICBNS1RBRygnQycsJ00nLCdBJywnUCcpCisjZGVmaW5lIElEX0FDQk0gICAgICAgTUtUQUcoJ0EnLCdDJywnQicsJ00nKQorI2RlZmluZSBJRF9ERUVQICAgICAgIE1LVEFHKCdEJywnRScsJ0UnLCdQJykKKyNkZWZpbmUgSURfUkdCOCAgICAgICBNS1RBRygnUicsJ0cnLCdCJywnOCcpCisjZGVmaW5lIElEX1JHQk4gICAgICAgTUtUQUcoJ1InLCdHJywnQicsJ04nKQorI2RlZmluZSBJRF9EU0QgICAgICAgIE1LVEFHKCdEJywnUycsJ0QnLCcgJykKKyNkZWZpbmUgSURfQU5JTSAgICAgICBNS1RBRygnQScsJ04nLCdJJywnTScpCisKKyNkZWZpbmUgSURfRk9STSAgICAgICBNS1RBRygnRicsJ08nLCdSJywnTScpCisjZGVmaW5lIElEX0ZSTTggICAgICAgTUtUQUcoJ0YnLCdSJywnTScsJzgnKQorI2RlZmluZSBJRF9BTk5PICAgICAgIE1LVEFHKCdBJywnTicsJ04nLCdPJykKKyNkZWZpbmUgSURfQVVUSCAgICAgICBNS1RBRygnQScsJ1UnLCdUJywnSCcpCisjZGVmaW5lIElEX0NIUlMgICAgICAgTUtUQUcoJ0MnLCdIJywnUicsJ1MnKQorI2RlZmluZSBJRF9DT1BZUklHSFQgIE1LVEFHKCcoJywnYycsJyknLCcgJykKKyNkZWZpbmUgSURfQ1NFVCAgICAgICBNS1RBRygnQycsJ1MnLCdFJywnVCcpCisjZGVmaW5lIElEX0ZWRVIgICAgICAgTUtUQUcoJ0YnLCdWJywnRScsJ1InKQorI2RlZmluZSBJRF9OQU1FICAgICAgIE1LVEFHKCdOJywnQScsJ00nLCdFJykKKyNkZWZpbmUgSURfVEVYVCAgICAgICBNS1RBRygnVCcsJ0UnLCdYJywnVCcpCisjZGVmaW5lIElEX0FCSVQgICAgICAgTUtUQUcoJ0EnLCdCJywnSScsJ1QnKQorI2RlZmluZSBJRF9CT0RZICAgICAgIE1LVEFHKCdCJywnTycsJ0QnLCdZJykKKyNkZWZpbmUgSURfREJPRCAgICAgICBNS1RBRygnRCcsJ0InLCdPJywnRCcpCisjZGVmaW5lIElEX0RQRUwgICAgICAgTUtUQUcoJ0QnLCdQJywnRScsJ0wnKQorI2RlZmluZSBJRF9ETE9DICAgICAgIE1LVEFHKCdEJywnTCcsJ08nLCdDJykKKyNkZWZpbmUgSURfVFZEQyAgICAgICBNS1RBRygnVCcsJ1YnLCdEJywnQycpCisKKyNkZWZpbmUgTEVGVCAgICAyCisjZGVmaW5lIFJJR0hUICAgNAorI2RlZmluZSBTVEVSRU8gIDYKKworLyoqCisgKiBUaGlzIG51bWJlciBvZiBieXRlcyBpZiBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggQVZQYWNrZXQKKyAqIHdoaWNoIGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB2aWRlbyBwcm9wZXJ0aWVzCisgKiB3aGljaCBoYXMgdG8gYmUgc2hhcmVkIGJldHdlZW4gZGVtdXhlciBhbmQgZGVjb2Rlci4KKyAqIFRoaXMgbnVtYmVyIG1heSBjaGFuZ2UgYmV0d2VlbiBmcmFtZXMsIGUuZy4gdGhlIGRlbXV4ZXIgbWlnaHQKKyAqIHNldCBpdCB0byBzbWFsbGVzdCBwb3NzaWJsZSBzaXplIG9mIDIgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSdzCisgKiBubyBleHRyYWRhdGEgY2hhbmdpbmcgaW4gdGhpcyBmcmFtZS4KKyAqLworI2RlZmluZSBJRkZfRVhUUkFfVklERU9fU0laRSA0MQorCit0eXBlZGVmIGVudW0geworICAgIENPTVBfTk9ORSwKKyAgICBDT01QX0ZJQiwKKyAgICBDT01QX0VYUAorfSBzdng4X2NvbXByZXNzaW9uX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICBpc182NGJpdDsgIC8vLzwgY2h1bmsgc2l6ZSBpcyA2NC1iaXQKKyAgICBpbnQ2NF90ICBib2R5X3BvczsKKyAgICBpbnQ2NF90ICBib2R5X2VuZDsKKyAgICB1aW50MzJfdCAgYm9keV9zaXplOworICAgIHN2eDhfY29tcHJlc3Npb25fdHlwZSAgIHN2eDhfY29tcHJlc3Npb247CisgICAgdW5zaWduZWQgIG1hdWRfYml0czsKKyAgICB1bnNpZ25lZCAgbWF1ZF9jb21wcmVzc2lvbjsKKyAgICB1bnNpZ25lZCAgYml0bWFwX2NvbXByZXNzaW9uOyAgLy8vPCBkZWx0YSBjb21wcmVzc2lvbiBtZXRob2QgdXNlZAorICAgIHVuc2lnbmVkICBicHA7ICAgICAgICAgIC8vLzwgYml0cyBwZXIgcGxhbmUgdG8gZGVjb2RlIChkaWZmZXJzIGZyb20gYml0c19wZXJfY29kZWRfc2FtcGxlIGlmIEhBTSkKKyAgICB1bnNpZ25lZCAgaGFtOyAgICAgICAgICAvLy88IDAgaWYgbm9uLUhBTSBvciBudW1iZXIgb2YgaG9sZCBiaXRzICg2IGZvciBicHAgPiA2LCA0IG90aGVyd2lzZSkKKyAgICB1bnNpZ25lZCAgZmxhZ3M7ICAgICAgICAvLy88IDEgZm9yIEVIQiwgMCBpcyBubyBleHRyYSBoYWxmIGRhcmtlbmluZworICAgIHVuc2lnbmVkICB0cmFuc3BhcmVuY3k7IC8vLzwgdHJhbnNwYXJlbmN5IGNvbG9yIGluZGV4IGluIHBhbGV0dGUKKyAgICB1bnNpZ25lZCAgbWFza2luZzsgICAgICAvLy88IG1hc2tpbmcgbWV0aG9kIHVzZWQKKyAgICB1aW50OF90ICAgdHZkY1szMl07ICAgICAvLy88IFRWREMgbG9va3VwIHRhYmxlCit9IElmZkRlbXV4Q29udGV4dDsKKworLyogTWV0YWRhdGEgc3RyaW5nIHJlYWQgKi8KK3N0YXRpYyBpbnQgZ2V0X21ldGFkYXRhKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGRhdGFfc2l6ZSkKK3sKKyAgICB1aW50OF90ICpidWYgPSAoKGRhdGFfc2l6ZSArIDEpID09IDApID8gTlVMTCA6IGF2X21hbGxvYyhkYXRhX3NpemUgKyAxKTsKKworICAgIGlmICghYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKGF2aW9fcmVhZChzLT5wYiwgYnVmLCBkYXRhX3NpemUpICE9IGRhdGFfc2l6ZSkgeworICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIGJ1ZltkYXRhX3NpemVdID0gMDsKKyAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsIHRhZywgYnVmLCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWZmX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmQgPSBwLT5idWY7CisKKyAgICBpZiAoIChBVl9STDMyKGQpICAgPT0gSURfRk9STSAmJgorICAgICAgICAgKEFWX1JMMzIoZCs4KSA9PSBJRF84U1ZYIHx8CisgICAgICAgICAgQVZfUkwzMihkKzgpID09IElEXzE2U1YgfHwKKyAgICAgICAgICBBVl9STDMyKGQrOCkgPT0gSURfTUFVRCB8fAorICAgICAgICAgIEFWX1JMMzIoZCs4KSA9PSBJRF9QQk0gIHx8CisgICAgICAgICAgQVZfUkwzMihkKzgpID09IElEX0FDQk0gfHwKKyAgICAgICAgICBBVl9STDMyKGQrOCkgPT0gSURfREVFUCB8fAorICAgICAgICAgIEFWX1JMMzIoZCs4KSA9PSBJRF9JTEJNIHx8CisgICAgICAgICAgQVZfUkwzMihkKzgpID09IElEX1JHQjggfHwKKyAgICAgICAgICBBVl9STDMyKGQrOCkgPT0gSURfUkdCOCB8fAorICAgICAgICAgIEFWX1JMMzIoZCs4KSA9PSBJRF9BTklNIHx8CisgICAgICAgICAgQVZfUkwzMihkKzgpID09IElEX1JHQk4pKSB8fAorICAgICAgICAgKEFWX1JMMzIoZCkgPT0gSURfRlJNOCAmJiBBVl9STDMyKGQrMTIpID09IElEX0RTRCkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgZHNkX2NvZGVjX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX0RTRF9NU0JGLCBJRF9EU0QgfSwKKyAgICB7IEFWX0NPREVDX0lEX05PTkUsIDAgfSwKK307CisKKworI2RlZmluZSBEU0RfU0xGVCBNS1RBRygnUycsJ0wnLCdGJywnVCcpCisjZGVmaW5lIERTRF9TUkdUIE1LVEFHKCdTJywnUicsJ0cnLCdUJykKKyNkZWZpbmUgRFNEX01MRlQgTUtUQUcoJ00nLCdMJywnRicsJ1QnKQorI2RlZmluZSBEU0RfTVJHVCBNS1RBRygnTScsJ1InLCdHJywnVCcpCisjZGVmaW5lIERTRF9DICAgIE1LVEFHKCdDJywnICcsJyAnLCcgJykKKyNkZWZpbmUgRFNEX0xTICAgTUtUQUcoJ0wnLCdTJywnICcsJyAnKQorI2RlZmluZSBEU0RfUlMgICBNS1RBRygnUicsJ1MnLCcgJywnICcpCisjZGVmaW5lIERTRF9MRkUgIE1LVEFHKCdMJywnRicsJ0UnLCcgJykKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGRzZF9zdGVyZW9bXSAgPSB7IERTRF9TTEZULCBEU0RfU1JHVCB9Oworc3RhdGljIGNvbnN0IHVpbnQzMl90IGRzZF81cG9pbnQwW10gPSB7IERTRF9NTEZULCBEU0RfTVJHVCwgRFNEX0MsIERTRF9MUywgRFNEX1JTIH07CitzdGF0aWMgY29uc3QgdWludDMyX3QgZHNkXzVwb2ludDFbXSA9IHsgRFNEX01MRlQsIERTRF9NUkdULCBEU0RfQywgRFNEX0xGRSwgRFNEX0xTLCBEU0RfUlMgfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90IGxheW91dDsKKyAgICBjb25zdCB1aW50MzJfdCAqIGRzZF9sYXlvdXQ7Cit9IERTRExheW91dERlc2M7CisKK3N0YXRpYyBjb25zdCBEU0RMYXlvdXREZXNjIGRzZF9jaGFubmVsX2xheW91dFtdID0geworICAgIHsgQVZfQ0hfTEFZT1VUX1NURVJFTywgIGRzZF9zdGVyZW8gfSwKKyAgICB7IEFWX0NIX0xBWU9VVF81UE9JTlQwLCBkc2RfNXBvaW50MCB9LAorICAgIHsgQVZfQ0hfTEFZT1VUXzVQT0lOVDEsIGRzZF81cG9pbnQxIH0sCit9OworCitzdGF0aWMgY29uc3QgdWludDY0X3QgZHNkX2xvdWRzcGVha2VyX2NvbmZpZ1tdID0geworICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgMCwgMCwKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMCwgQVZfQ0hfTEFZT1VUXzVQT0lOVDEsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGRzZF9zb3VyY2VfY29tbWVudFtdID0geworICAgICJkc2Rfc291cmNlX2NvbW1lbnQiLAorICAgICJhbmFsb2d1ZV9zb3VyY2VfY29tbWVudCIsCisgICAgInBjbV9zb3VyY2VfY29tbWVudCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGRzZF9oaXN0b3J5X2NvbW1lbnRbXSA9IHsKKyAgICAiZ2VuZXJhbF9yZW1hcmsiLAorICAgICJvcGVyYXRvcl9uYW1lIiwKKyAgICAiY3JlYXRpbmdfbWFjaGluZSIsCisgICAgInRpbWV6b25lIiwKKyAgICAiZmlsZV9yZXZpc2lvbiIKK307CisKK3N0YXRpYyBpbnQgcGFyc2VfZHNkX2RpaW4oQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIHVpbnQ2NF90IGVvZikKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKworICAgIHdoaWxlIChhdmlvX3RlbGwocGIpICsgMTIgPD0gZW9mKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgdWludDY0X3Qgc2l6ZSAgICAgPSBhdmlvX3JiNjQocGIpOworICAgICAgICB1aW50NjRfdCBvcmlnX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGNvbnN0IGNoYXIgKiBtZXRhZGF0YV90YWcgPSBOVUxMOworCisgICAgICAgIHN3aXRjaCh0YWcpIHsKKyAgICAgICAgY2FzZSBNS1RBRygnRCcsJ0knLCdBJywnUicpOiBtZXRhZGF0YV90YWcgPSAiYXJ0aXN0IjsgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ0QnLCdJJywnVCcsJ0knKTogbWV0YWRhdGFfdGFnID0gInRpdGxlIjsgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1ldGFkYXRhX3RhZyAmJiBzaXplID4gNCkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhZ19zaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGludCByZXQgPSBnZXRfbWV0YWRhdGEocywgbWV0YWRhdGFfdGFnLCBGRk1JTih0YWdfc2l6ZSwgc2l6ZSAtIDQpKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNhbm5vdCBhbGxvY2F0ZSBtZXRhZGF0YSB0YWcgJXMhXG4iLCBtZXRhZGF0YV90YWcpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdmlvX3NraXAocGIsIHNpemUgLSAoYXZpb190ZWxsKHBiKSAtIG9yaWdfcG9zKSArIChzaXplICYgMSkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2RzZF9wcm9wKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCB1aW50NjRfdCBlb2YpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgY2hhciBhYnNzWzI0XTsKKyAgICBpbnQgaG91ciwgbWluLCBzZWMsIGksIHJldCwgY29uZmlnOworICAgIGludCBkc2RfbGF5b3V0WzZdOworICAgIElEM3YyRXh0cmFNZXRhICppZDN2Ml9leHRyYV9tZXRhOworCisgICAgd2hpbGUgKGF2aW9fdGVsbChwYikgKyAxMiA8PSBlb2YpIHsKKyAgICAgICAgdWludDMyX3QgdGFnICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICB1aW50NjRfdCBzaXplICAgICA9IGF2aW9fcmI2NChwYik7CisgICAgICAgIHVpbnQ2NF90IG9yaWdfcG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgICAgICBzd2l0Y2godGFnKSB7CisgICAgICAgIGNhc2UgTUtUQUcoJ0EnLCdCJywnUycsJ1MnKToKKyAgICAgICAgICAgIGlmIChzaXplIDwgOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGhvdXIgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgbWluICA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgc2VjICA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgc25wcmludGYoYWJzcywgc2l6ZW9mKGFic3MpLCAiJTAyZGg6JTAyZG06JTAyZHM6JWQiLCBob3VyLCBtaW4sIHNlYywgYXZpb19yYjMyKHBiKSk7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAiYWJzb2x1dGVfc3RhcnRfdGltZSIsIGFic3MsIDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNS1RBRygnQycsJ0gnLCdOJywnTCcpOgorICAgICAgICAgICAgaWYgKHNpemUgPCAyKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDIgKyBzdC0+Y29kZWMtPmNoYW5uZWxzICogNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSAwOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPiBGRl9BUlJBWV9FTEVNUyhkc2RfbGF5b3V0KSkgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiY2hhbm5lbCBsYXlvdXQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+Y29kZWMtPmNoYW5uZWxzOyBpKyspCisgICAgICAgICAgICAgICAgZHNkX2xheW91dFtpXSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZHNkX2NoYW5uZWxfbGF5b3V0KTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgRFNETGF5b3V0RGVzYyAqIGQgPSAmZHNkX2NoYW5uZWxfbGF5b3V0W2ldOworICAgICAgICAgICAgICAgIGlmIChhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoZC0+bGF5b3V0KSA9PSBzdC0+Y29kZWMtPmNoYW5uZWxzICYmCisgICAgICAgICAgICAgICAgICAgICFtZW1jbXAoZC0+ZHNkX2xheW91dCwgZHNkX2xheW91dCwgc3QtPmNvZGVjLT5jaGFubmVscyAqIHNpemVvZih1aW50MzJfdCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBkLT5sYXlvdXQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUtUQUcoJ0MnLCdNJywnUCcsJ1InKToKKyAgICAgICAgICAgIGlmIChzaXplIDwgNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGRzZF9jb2RlY190YWdzLCB0YWcpOworICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiclYyVjJWMlYycgY29tcHJlc3Npb24gaXMgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGFnJjB4RkYsICh0YWc+PjgpJjB4RkYsICh0YWc+PjE2KSYweEZGLCAodGFnPj4yNCkmMHhGRik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNS1RBRygnRicsJ1MnLCcgJywnICcpOgorICAgICAgICAgICAgaWYgKHNpemUgPCA0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIzMihwYikgLyA4OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNS1RBRygnSScsJ0QnLCczJywnICcpOgorICAgICAgICAgICAgaWQzdjJfZXh0cmFfbWV0YSA9IE5VTEw7CisgICAgICAgICAgICBmZl9pZDN2Ml9yZWFkKHMsIElEM3YyX0RFRkFVTFRfTUFHSUMsICZpZDN2Ml9leHRyYV9tZXRhLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChpZDN2Ml9leHRyYV9tZXRhKSB7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9pZDN2Ml9wYXJzZV9hcGljKHMsICZpZDN2Ml9leHRyYV9tZXRhKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZmX2lkM3YyX2ZyZWVfZXh0cmFfbWV0YSgmaWQzdjJfZXh0cmFfbWV0YSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZmX2lkM3YyX2ZyZWVfZXh0cmFfbWV0YSgmaWQzdjJfZXh0cmFfbWV0YSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaXplIDwgYXZpb190ZWxsKHBiKSAtIG9yaWdfcG9zKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImlkMyBleGNlZWRzIGNodW5rIHNpemVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNS1RBRygnTCcsJ1MnLCdDJywnTycpOgorICAgICAgICAgICAgaWYgKHNpemUgPCAyKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgY29uZmlnID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIGlmIChjb25maWcgIT0gMHhGRkZGKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZyA8IEZGX0FSUkFZX0VMRU1TKGRzZF9sb3Vkc3BlYWtlcl9jb25maWcpKQorICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gZHNkX2xvdWRzcGVha2VyX2NvbmZpZ1tjb25maWddOworICAgICAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCkKKyAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJsb3Vkc3BlYWtlciBjb25maWd1cmF0aW9uICVkIiwgY29uZmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gKGF2aW9fdGVsbChwYikgLSBvcmlnX3BvcykgKyAoc2l6ZSAmIDEpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGVlcF9yZ2IyNFtdID0gezAsIDAsIDAsIDMsIDAsIDEsIDAsIDgsIDAsIDIsIDAsIDgsIDAsIDMsIDAsIDh9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGVlcF9yZ2JhW10gID0gezAsIDAsIDAsIDQsIDAsIDEsIDAsIDgsIDAsIDIsIDAsIDgsIDAsIDMsIDAsIDh9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGVlcF9iZ3JhW10gID0gezAsIDAsIDAsIDQsIDAsIDMsIDAsIDgsIDAsIDIsIDAsIDgsIDAsIDEsIDAsIDh9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGVlcF9hcmdiW10gID0gezAsIDAsIDAsIDQsIDAsMTcsIDAsIDgsIDAsIDEsIDAsIDgsIDAsIDIsIDAsIDh9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGVlcF9hYmdyW10gID0gezAsIDAsIDAsIDQsIDAsMTcsIDAsIDgsIDAsIDMsIDAsIDgsIDAsIDIsIDAsIDh9OworCitzdGF0aWMgaW50IGlmZl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgSWZmRGVtdXhDb250ZXh0ICppZmYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICB1aW50MzJfdCBjaHVua19pZDsKKyAgICB1aW50NjRfdCBkYXRhX3NpemU7CisgICAgdWludDMyX3Qgc2NyZWVubW9kZSA9IDAsIG51bSwgZGVuOworICAgIHVuc2lnbmVkIHRyYW5zcGFyZW5jeSA9IDA7CisgICAgdW5zaWduZWQgbWFza2luZyA9IDA7IC8vIG5vIG1hc2sKKyAgICB1aW50OF90IGZtdFsxNl07CisgICAgaW50IGZtdF9zaXplOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gMTsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgaWZmLT5pc182NGJpdCA9IGF2aW9fcmwzMihwYikgPT0gSURfRlJNODsKKyAgICBhdmlvX3NraXAocGIsIGlmZi0+aXNfNjRiaXQgPyA4IDogNCk7CisgICAgLy8gY29kZWNfdGFnIHVzZWQgYnkgQnl0ZVJ1bjEgZGVjb2RlciB0byBkaXN0aW5ndWlzaCBwcm9ncmVzc2l2ZSAoUEJNKSBhbmQgaW50ZXJsYWNlZCAoSUxCTSkgY29udGVudAorICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190YWcgPT0gSURfQU5JTSkgeworICAgICAgICBhdmlvX3NraXAocGIsIDgpOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IGF2aW9fcmwzMihwYik7CisgICAgfQorICAgIGlmZi0+Yml0bWFwX2NvbXByZXNzaW9uID0gLTE7CisgICAgaWZmLT5zdng4X2NvbXByZXNzaW9uID0gLTE7CisgICAgaWZmLT5tYXVkX2JpdHMgPSAtMTsKKyAgICBpZmYtPm1hdWRfY29tcHJlc3Npb24gPSAtMTsKKworICAgIHdoaWxlKCFhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgIHVpbnQ2NF90IG9yaWdfcG9zOworICAgICAgICBpbnQgcmVzOworICAgICAgICBjb25zdCBjaGFyICptZXRhZGF0YV90YWcgPSBOVUxMOworICAgICAgICBpbnQgdmVyc2lvbiwgbmJfY29tbWVudHMsIGk7CisgICAgICAgIGNodW5rX2lkID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgZGF0YV9zaXplID0gaWZmLT5pc182NGJpdCA/IGF2aW9fcmI2NChwYikgOiBhdmlvX3JiMzIocGIpOworICAgICAgICBvcmlnX3BvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICAgICAgc3dpdGNoKGNodW5rX2lkKSB7CisgICAgICAgIGNhc2UgSURfVkhEUjoKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKworICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA8IDE0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxMik7CisgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIGlmIChkYXRhX3NpemUgPj0gMTYpIHsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDEpOworICAgICAgICAgICAgICAgIGlmZi0+c3Z4OF9jb21wcmVzc2lvbiA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJRF9NSERSOgorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworCisgICAgICAgICAgICBpZiAoZGF0YV9zaXplIDwgMzIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDQpOworICAgICAgICAgICAgaWZmLT5tYXVkX2JpdHMgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCAyKTsKKyAgICAgICAgICAgIG51bSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBkZW4gPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgaWYgKCFkZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDIpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IG51bSAvIGRlbjsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgaWZmLT5tYXVkX2NvbXByZXNzaW9uID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID09IDEpCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICAgICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5jaGFubmVscyA9PSAyKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJRF9BQklUOgorICAgICAgICBjYXNlIElEX0JPRFk6CisgICAgICAgIGNhc2UgSURfREJPRDoKKyAgICAgICAgY2FzZSBJRF9EU0Q6CisgICAgICAgIGNhc2UgSURfTURBVDoKKyAgICAgICAgICAgIGlmZi0+Ym9keV9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgaWZmLT5ib2R5X2VuZCA9IGlmZi0+Ym9keV9wb3MgKyBkYXRhX3NpemU7CisgICAgICAgICAgICBpZmYtPmJvZHlfc2l6ZSA9IGRhdGFfc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURfQ0hBTjoKKyAgICAgICAgICAgIGlmIChkYXRhX3NpemUgPCA0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaWYgKGF2aW9fcmIzMihwYikgPCA2KSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURfQ0FNRzoKKyAgICAgICAgICAgIGlmIChkYXRhX3NpemUgPCA0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgc2NyZWVubW9kZSAgICAgICAgICAgICAgICA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElEX0NNQVA6CisgICAgICAgICAgICBpZiAoZGF0YV9zaXplIDwgMyB8fCBkYXRhX3NpemUgPiA3NjggfHwgZGF0YV9zaXplICUgMykgeworICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBDTUFQIGNodW5rIHNpemUgJSJQUkl1NjQiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gZGF0YV9zaXplICsgSUZGX0VYVFJBX1ZJREVPX1NJWkU7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSAgICAgID0gYXZfbWFsbG9jKGRhdGFfc2l6ZSArIElGRl9FWFRSQV9WSURFT19TSVpFICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIElGRl9FWFRSQV9WSURFT19TSVpFLCBkYXRhX3NpemUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJRF9CTUhEOgorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBpZiAoZGF0YV9zaXplIDw9IDgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgICAgICAgICAgICA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgICAgICAgICAgICA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDQpOyAvLyB4LCB5IG9mZnNldAorICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIGlmIChkYXRhX3NpemUgPj0gMTApCisgICAgICAgICAgICAgICAgbWFza2luZyAgICAgICAgICAgICAgICAgICAgICA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA+PSAxMSkKKyAgICAgICAgICAgICAgICBpZmYtPmJpdG1hcF9jb21wcmVzc2lvbiAgICAgID0gYXZpb19yOChwYik7CisgICAgICAgICAgICBpZiAoZGF0YV9zaXplID49IDE0KSB7CisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxKTsgLy8gcGFkZGluZworICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSAgICAgICAgICAgICAgICAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA+PSAxNikgeworICAgICAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gID0gYXZpb19yOChwYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElEX0RQRUw6CisgICAgICAgICAgICBpZiAoZGF0YV9zaXplIDwgNCB8fCAoZGF0YV9zaXplICYgMykpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAoKGZtdF9zaXplID0gYXZpb19yZWFkKHBiLCBmbXQsIHNpemVvZihmbXQpKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBmbXRfc2l6ZTsKKyAgICAgICAgICAgIGlmIChmbXRfc2l6ZSA9PSBzaXplb2YoZGVlcF9yZ2IyNCkgJiYgIW1lbWNtcChmbXQsIGRlZXBfcmdiMjQsIHNpemVvZihkZWVwX3JnYjI0KSkpCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IyNDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZtdF9zaXplID09IHNpemVvZihkZWVwX3JnYmEpICYmICFtZW1jbXAoZm10LCBkZWVwX3JnYmEsIHNpemVvZihkZWVwX3JnYmEpKSkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQkE7CisgICAgICAgICAgICBlbHNlIGlmIChmbXRfc2l6ZSA9PSBzaXplb2YoZGVlcF9iZ3JhKSAmJiAhbWVtY21wKGZtdCwgZGVlcF9iZ3JhLCBzaXplb2YoZGVlcF9iZ3JhKSkpCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1JBOworICAgICAgICAgICAgZWxzZSBpZiAoZm10X3NpemUgPT0gc2l6ZW9mKGRlZXBfYXJnYikgJiYgIW1lbWNtcChmbXQsIGRlZXBfYXJnYiwgc2l6ZW9mKGRlZXBfYXJnYikpKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQVJHQjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZtdF9zaXplID09IHNpemVvZihkZWVwX2FiZ3IpICYmICFtZW1jbXAoZm10LCBkZWVwX2FiZ3IsIHNpemVvZihkZWVwX2FiZ3IpKSkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0FCR1I7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImNvbG9yIGZvcm1hdCAlLjE2cyIsIGZtdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJRF9ER0JMOgorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBpZiAoZGF0YV9zaXplIDwgOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICAgICAgICAgICAgID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICAgICAgICAgICAgID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIGlmZi0+Yml0bWFwX2NvbXByZXNzaW9uICAgICAgICAgID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAgICAgID0gYXZpb19yOChwYik7CisgICAgICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gICAgICA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAyNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURfRExPQzoKKyAgICAgICAgICAgIGlmIChkYXRhX3NpemUgPCA0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJRF9UVkRDOgorICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA8IHNpemVvZihpZmYtPnR2ZGMpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgcmVzID0gYXZpb19yZWFkKHBiLCBpZmYtPnR2ZGMsIHNpemVvZihpZmYtPnR2ZGMpKTsKKyAgICAgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElEX0FOTk86CisgICAgICAgIGNhc2UgSURfVEVYVDogICAgICBtZXRhZGF0YV90YWcgPSAiY29tbWVudCI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgSURfQVVUSDogICAgICBtZXRhZGF0YV90YWcgPSAiYXJ0aXN0IjsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSURfQ09QWVJJR0hUOiBtZXRhZGF0YV90YWcgPSAiY29weXJpZ2h0IjsgYnJlYWs7CisgICAgICAgIGNhc2UgSURfTkFNRTogICAgICBtZXRhZGF0YV90YWcgPSAidGl0bGUiOyAgICAgYnJlYWs7CisKKyAgICAgICAgLyogRFNEIHRhZ3MgKi8KKworICAgICAgICBjYXNlIE1LVEFHKCdGJywnVicsJ0UnLCdSJyk6CisgICAgICAgICAgICBpZiAoZGF0YV9zaXplIDwgNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHZlcnNpb24gPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkRTSUZGIHYlZC4lZC4lZC4lZFxuIix2ZXJzaW9uID4+IDI0LCAodmVyc2lvbiA+PiAxNikgJiAweEZGLCAodmVyc2lvbiA+PiA4KSAmIDB4RkYsIHZlcnNpb24gJiAweEZGKTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUtUQUcoJ0QnLCdJJywnSScsJ04nKToKKyAgICAgICAgICAgIHJlcyA9IHBhcnNlX2RzZF9kaWluKHMsIHN0LCBvcmlnX3BvcyArIGRhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNS1RBRygnUCcsJ1InLCdPJywnUCcpOgorICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA8IDQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAoYXZpb19ybDMyKHBiKSAhPSBNS1RBRygnUycsJ04nLCdEJywnICcpKSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJ1bmtub3duIHByb3BlcnR5IHR5cGUiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IHBhcnNlX2RzZF9wcm9wKHMsIHN0LCBvcmlnX3BvcyArIGRhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNS1RBRygnQycsJ08nLCdNJywnVCcpOgorICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA8IDIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBuYl9jb21tZW50cyA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfY29tbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgIGludCB5ZWFyLCBtb24sIGRheSwgaG91ciwgbWluLCB0eXBlLCByZWY7CisgICAgICAgICAgICAgICAgY2hhciB0bXBbMjRdOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzsKKyAgICAgICAgICAgICAgICBpbnQgbWV0YWRhdGFfc2l6ZTsKKworICAgICAgICAgICAgICAgIHllYXIgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgICAgIG1vbiAgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgICAgICBkYXkgID0gYXZpb19yOChwYik7CisgICAgICAgICAgICAgICAgaG91ciA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgICAgIG1pbiAgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkIiwgeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbik7CisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgImNvbW1lbnRfdGltZSIsIHRtcCwgMCk7CisKKyAgICAgICAgICAgICAgICB0eXBlID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgICAgICByZWYgID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIGlmICghaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9ICJjaGFubmVsX2NvbW1lbnQiOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJjaGFubmVsJWRfY29tbWVudCIsIHJlZik7CisgICAgICAgICAgICAgICAgICAgICAgICB0YWcgPSB0bXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB0YWcgPSByZWYgPCBGRl9BUlJBWV9FTEVNUyhkc2Rfc291cmNlX2NvbW1lbnQpID8gZHNkX3NvdXJjZV9jb21tZW50W3JlZl0gOiAic291cmNlX2NvbW1lbnQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIHRhZyA9IHJlZiA8IEZGX0FSUkFZX0VMRU1TKGRzZF9oaXN0b3J5X2NvbW1lbnQpID8gZHNkX2hpc3RvcnlfY29tbWVudFtyZWZdIDogImZpbGVfaGlzdG9yeSI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRhZyA9ICJjb21tZW50IjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtZXRhZGF0YV9zaXplICA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICAgICAgaWYgKChyZXMgPSBnZXRfbWV0YWRhdGEocywgdGFnLCBtZXRhZGF0YV9zaXplKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjYW5ub3QgYWxsb2NhdGUgbWV0YWRhdGEgdGFnICVzIVxuIiwgdGFnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFfc2l6ZSAmIDEpCisgICAgICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXRhZGF0YV90YWcpIHsKKyAgICAgICAgICAgIGlmICgocmVzID0gZ2V0X21ldGFkYXRhKHMsIG1ldGFkYXRhX3RhZywgZGF0YV9zaXplKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNhbm5vdCBhbGxvY2F0ZSBtZXRhZGF0YSB0YWcgJXMhXG4iLCBtZXRhZGF0YV90YWcpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZpb19za2lwKHBiLCBkYXRhX3NpemUgLSAoYXZpb190ZWxsKHBiKSAtIG9yaWdfcG9zKSArIChkYXRhX3NpemUgJiAxKSk7CisgICAgfQorCisgICAgYXZpb19zZWVrKHBiLCBpZmYtPmJvZHlfcG9zLCBTRUVLX1NFVCk7CisKKyAgICBzd2l0Y2goc3QtPmNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190YWcgPT0gSURfMTZTVikKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2QkVfUExBTkFSOworICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSBJRF9NQVVEKSB7CisgICAgICAgICAgICBpZiAoaWZmLT5tYXVkX2JpdHMgPT0gOCAmJiAhaWZmLT5tYXVkX2NvbXByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaWZmLT5tYXVkX2JpdHMgPT0gMTYgJiYgIWlmZi0+bWF1ZF9jb21wcmVzc2lvbikgeworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlmZi0+bWF1ZF9iaXRzID09ICA4ICYmIGlmZi0+bWF1ZF9jb21wcmVzc2lvbiA9PSAyKSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9BTEFXOworICAgICAgICAgICAgfSBlbHNlIGlmIChpZmYtPm1hdWRfYml0cyA9PSAgOCAmJiBpZmYtPm1hdWRfY29tcHJlc3Npb24gPT0gMykgeworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiY29tcHJlc3Npb24gJWQgYW5kIGJpdCBkZXB0aCAlZCIsIGlmZi0+bWF1ZF9jb21wcmVzc2lvbiwgaWZmLT5tYXVkX2JpdHMpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyAhPSBJRF9EU0QpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoaWZmLT5zdng4X2NvbXByZXNzaW9uKSB7CisgICAgICAgICAgICBjYXNlIENPTVBfTk9ORToKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1M4X1BMQU5BUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09NUF9GSUI6CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEXzhTVlhfRklCOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT01QX0VYUDoKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfOFNWWF9FWFA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIFNWWDggY29tcHJlc3Npb24gbWV0aG9kICclZCdcbiIsIGlmZi0+c3Z4OF9jb21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5jaGFubmVscyAqIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgaWZmLT5icHAgICAgICAgICAgPSBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgaWYgKChzY3JlZW5tb2RlICYgMHg4MDAgLyogSG9sZCBBbmQgTW9kaWZ5ICovKSAmJiBpZmYtPmJwcCA8PSA4KSB7CisgICAgICAgICAgICBpZmYtPmhhbSAgICAgID0gaWZmLT5icHAgPiA2ID8gNiA6IDQ7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDI0OworICAgICAgICB9CisgICAgICAgIGlmZi0+ZmxhZ3MgICAgICAgID0gKHNjcmVlbm1vZGUgJiAweDgwIC8qIEV4dHJhIEhhbGZCcml0ZSAqLykgJiYgaWZmLT5icHAgPD0gODsKKyAgICAgICAgaWZmLT5tYXNraW5nICAgICAgPSBtYXNraW5nOworICAgICAgICBpZmYtPnRyYW5zcGFyZW5jeSA9IHRyYW5zcGFyZW5jeTsKKworICAgICAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gSUZGX0VYVFJBX1ZJREVPX1NJWkU7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSAgICAgID0gYXZfbWFsbG9jKElGRl9FWFRSQV9WSURFT19TSVpFICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfYXNzZXJ0MChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID49IElGRl9FWFRSQV9WSURFT19TSVpFKTsKKyAgICAgICAgYnVmID0gc3QtPmNvZGVjLT5leHRyYWRhdGE7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgSUZGX0VYVFJBX1ZJREVPX1NJWkUpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZidWYsIGlmZi0+Yml0bWFwX2NvbXByZXNzaW9uKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCBpZmYtPmJwcCk7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgaWZmLT5oYW0pOworICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZidWYsIGlmZi0+ZmxhZ3MpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZidWYsIGlmZi0+dHJhbnNwYXJlbmN5KTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCBpZmYtPm1hc2tpbmcpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJmJ1ZiwgaWZmLT50dmRjLCBzaXplb2YoaWZmLT50dmRjKSk7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9JRkZfSUxCTTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlmZl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIElmZkRlbXV4Q29udGV4dCAqaWZmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgaW50IHJldDsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICBpZiAocG9zID49IGlmZi0+Ym9keV9lbmQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSBJRF9EU0QgfHwgc3QtPmNvZGVjLT5jb2RlY190YWcgPT0gSURfTUFVRCkgeworICAgICAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBGRk1JTihpZmYtPmJvZHlfZW5kIC0gcG9zLCAxMDI0ICogc3QtPmNvZGVjLT5ibG9ja19hbGlnbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBpZmYtPmJvZHlfc2l6ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgdWludDhfdCAqYnVmOworCisgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgaWZmLT5ib2R5X3NpemUgKyAyKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBidWYgPSBwa3QtPmRhdGE7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgMik7CisgICAgICAgIHJldCA9IGF2aW9fcmVhZChwYiwgYnVmLCBpZmYtPmJvZHlfc2l6ZSk7CisgICAgICAgIGlmIChyZXQ8MCkgeworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPCBpZmYtPmJvZHlfc2l6ZSkKKyAgICAgICAgICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCByZXQgKyAyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIGlmIChwb3MgPT0gaWZmLT5ib2R5X3BvcykKKyAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfaWZmX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImlmZiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIklGRiAoSW50ZXJjaGFuZ2UgRmlsZSBGb3JtYXQpIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKElmZkRlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gaWZmX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGlmZl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBpZmZfcmVhZF9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCB8IEFWRk1UX05PX0JZVEVfU0VFSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaWxiYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lsYmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjE1NGNlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lsYmMuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIGlMQkMgc3RvcmFnZSBmaWxlIGZvcm1hdAorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIG1vZGUyMF9oZWFkZXJbXSA9ICIjIWlMQkMyMFxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1vZGUzMF9oZWFkZXJbXSA9ICIjIWlMQkMzMFxuIjsKKworc3RhdGljIGludCBpbGJjX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYzsKKworICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIG51bWJlciBvZiBzdHJlYW1zXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisKKyAgICBpZiAoZW5jLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9JTEJDKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjb2RlY1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGVuYy0+YmxvY2tfYWxpZ24gPT0gNTApIHsKKyAgICAgICAgYXZpb193cml0ZShwYiwgbW9kZTMwX2hlYWRlciwgc2l6ZW9mKG1vZGUzMF9oZWFkZXIpIC0gMSk7CisgICAgfSBlbHNlIGlmIChlbmMtPmJsb2NrX2FsaWduID09IDM4KSB7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIG1vZGUyMF9oZWFkZXIsIHNpemVvZihtb2RlMjBfaGVhZGVyKSAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBtb2RlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXZpb19mbHVzaChwYik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWxiY193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGF2aW9fd3JpdGUocy0+cGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbGJjX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIC8vIE9ubHkgY2hlY2sgZm9yICIjIWlMQkMiIHdoaWNoIG1hdGNoZXMgYm90aCBmb3JtYXRzCisgICAgaWYgKCFtZW1jbXAocC0+YnVmLCBtb2RlMjBfaGVhZGVyLCA2KSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWxiY19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworICAgIHVpbnQ4X3QgaGVhZGVyWzldOworCisgICAgYXZpb19yZWFkKHBiLCBoZWFkZXIsIDkpOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0lMQkM7CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5zdGFydF90aW1lID0gMDsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgaWYgKCFtZW1jbXAoaGVhZGVyLCBtb2RlMjBfaGVhZGVyLCBzaXplb2YobW9kZTIwX2hlYWRlcikgLSAxKSkgeworICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMzg7CisgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSAxNTIwMDsKKyAgICB9IGVsc2UgaWYgKCFtZW1jbXAoaGVhZGVyLCBtb2RlMzBfaGVhZGVyLCBzaXplb2YobW9kZTMwX2hlYWRlcikgLSAxKSkgeworICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gNTA7CisgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSAxMzMzMzsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5yZWNvZ25pemVkIGlMQkMgZmlsZSBoZWFkZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbGJjX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIGVuYy0+YmxvY2tfYWxpZ24pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcGt0LT5wb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIHBrdC0+ZHVyYXRpb24gPSBlbmMtPmJsb2NrX2FsaWduID09IDM4ID8gMTYwIDogMjQwOworICAgIGlmICgocmV0ID0gYXZpb19yZWFkKHMtPnBiLCBwa3QtPmRhdGEsIGVuYy0+YmxvY2tfYWxpZ24pKSAhPSBlbmMtPmJsb2NrX2FsaWduKSB7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2lsYmNfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gImlsYmMiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiaUxCQyBzdG9yYWdlIiksCisgICAgLnJlYWRfcHJvYmUgICA9IGlsYmNfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICA9IGlsYmNfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICA9IGlsYmNfcmVhZF9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9pbGJjX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAiaWxiYyIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJpTEJDIHN0b3JhZ2UiKSwKKyAgICAubWltZV90eXBlICAgID0gImF1ZGlvL2lMQkMiLAorICAgIC5leHRlbnNpb25zICAgPSAibGJjIiwKKyAgICAuYXVkaW9fY29kZWMgID0gQVZfQ09ERUNfSURfSUxCQywKKyAgICAud3JpdGVfaGVhZGVyID0gaWxiY193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCA9IGlsYmNfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ltZzIuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pbWcyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmMTI0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pbWcyLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBJbWFnZSBmb3JtYXQKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZW51bSBBVkNvZGVjSUQgaWQ7CisgICAgY29uc3QgY2hhciAqc3RyOworfSBJZFN0ck1hcDsKKworc3RhdGljIGNvbnN0IElkU3RyTWFwIGltZ190YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAianBlZyIgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAianBnIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAianBzIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAibXBvIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9MSlBFRywgICAgICAibGpwZyIgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9KUEVHTFMsICAgICAiamxzIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QTkcsICAgICAgICAicG5nIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QTkcsICAgICAgICAicG5zIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QTkcsICAgICAgICAibW5nIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QUE0sICAgICAgICAicHBtIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QUE0sICAgICAgICAicG5tIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QR00sICAgICAgICAicGdtIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QR01ZVVYsICAgICAicGdteXV2IiAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQk0sICAgICAgICAicGJtIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQU0sICAgICAgICAicGFtIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BTElBU19QSVgsICAicGl4IiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLCAibXBnMS1pbWciIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCAibXBnMi1pbWciIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAibXBnNC1pbWciIH0sCisgICAgeyBBVl9DT0RFQ19JRF9GRlYxLCAgICAgICAiZmZ2MS1pbWciIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAieSIgICAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAicmF3IiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9CTVAsICAgICAgICAiYm1wIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9UQVJHQSwgICAgICAidGdhIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9USUZGLCAgICAgICAidGlmZiIgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9USUZGLCAgICAgICAidGlmIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TR0ksICAgICAgICAic2dpIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QVFgsICAgICAgICAicHR4IiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ1gsICAgICAgICAicGN4IiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TVU5SQVNULCAgICAic3VuIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TVU5SQVNULCAgICAicmFzIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TVU5SQVNULCAgICAicnMiICAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TVU5SQVNULCAgICAiaW0xIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TVU5SQVNULCAgICAiaW04IiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TVU5SQVNULCAgICAiaW0yNCIgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TVU5SQVNULCAgICAiaW0zMiIgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TVU5SQVNULCAgICAic3VucmFzIiAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9KUEVHMjAwMCwgICAiajJjIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9KUEVHMjAwMCwgICAianAyIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9KUEVHMjAwMCwgICAianBjIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9KUEVHMjAwMCwgICAiajJrIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9EUFgsICAgICAgICAiZHB4IiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9FWFIsICAgICAgICAiZXhyIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QSUNUT1IsICAgICAicGljIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WMjEwWCwgICAgICAieXV2MTAiICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9XRUJQLCAgICAgICAid2VicCIgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9YQk0sICAgICAgICAieGJtIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9YRkFDRSwgICAgICAieGZhY2UiICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9YV0QsICAgICAgICAieHdkIiAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAgICAgICBOVUxMICAgICAgIH0KK307CisKK3N0YXRpYyBlbnVtIEFWQ29kZWNJRCBhdl9zdHIyaWQoY29uc3QgSWRTdHJNYXAgKnRhZ3MsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBzdHIgPSBzdHJyY2hyKHN0ciwgJy4nKTsKKyAgICBpZiAoIXN0cikKKyAgICAgICAgcmV0dXJuIEFWX0NPREVDX0lEX05PTkU7CisgICAgc3RyKys7CisKKyAgICB3aGlsZSAodGFncy0+aWQpIHsKKyAgICAgICAgaWYgKCFhdl9zdHJjYXNlY21wKHN0ciwgdGFncy0+c3RyKSkKKyAgICAgICAgICAgIHJldHVybiB0YWdzLT5pZDsKKworICAgICAgICB0YWdzKys7CisgICAgfQorICAgIHJldHVybiBBVl9DT0RFQ19JRF9OT05FOworfQorCitlbnVtIEFWQ29kZWNJRCBmZl9ndWVzc19pbWFnZTJfY29kZWMoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgcmV0dXJuIGF2X3N0cjJpZChpbWdfdGFncywgZmlsZW5hbWUpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ltZzIuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pbWcyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhNjgzMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pbWcyLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIEltYWdlIGZvcm1hdAorICogQ29weXJpZ2h0IChjKSAyMDE0IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9JTUcyX0gKKyNkZWZpbmUgQVZGT1JNQVRfSU1HMl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2lmIEhBVkVfR0xPQgorI2luY2x1ZGUgPGdsb2IuaD4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7ICAvKio8IENsYXNzIGZvciBwcml2YXRlIG9wdGlvbnMuICovCisgICAgaW50IGltZ19maXJzdDsKKyAgICBpbnQgaW1nX2xhc3Q7CisgICAgaW50IGltZ19udW1iZXI7CisgICAgaW50NjRfdCBwdHM7CisgICAgaW50IGltZ19jb3VudDsKKyAgICBpbnQgaXNfcGlwZTsKKyAgICBpbnQgc3BsaXRfcGxhbmVzOyAgICAgICAvKio8IHVzZSBpbmRlcGVuZGVudCBmaWxlIGZvciBlYWNoIFksIFUsIFYgcGxhbmUgKi8KKyAgICBjaGFyIHBhdGhbMTAyNF07CisgICAgY2hhciAqcGl4ZWxfZm9ybWF0OyAgICAgLyoqPCBTZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4gKi8KKyAgICBpbnQgd2lkdGgsIGhlaWdodDsgICAgICAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLworICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOyAgIC8qKjwgU2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uICovCisgICAgaW50IGxvb3A7CisgICAgZW51bSB7IFBUX0dMT0JfU0VRVUVOQ0UsIFBUX0dMT0IsIFBUX1NFUVVFTkNFIH0gcGF0dGVybl90eXBlOworICAgIGludCB1c2VfZ2xvYjsKKyNpZiBIQVZFX0dMT0IKKyAgICBnbG9iX3QgZ2xvYnN0YXRlOworI2VuZGlmCisgICAgaW50IHN0YXJ0X251bWJlcjsKKyAgICBpbnQgc3RhcnRfbnVtYmVyX3JhbmdlOworICAgIGludCBmcmFtZV9zaXplOworICAgIGludCB0c19mcm9tX2ZpbGU7Cit9IFZpZGVvRGVtdXhEYXRhOworCitleHRlcm4gY29uc3QgQVZPcHRpb24gZmZfaW1nX29wdGlvbnNbXTsKKworaW50IGZmX2ltZ19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMxKTsKKworaW50IGZmX2ltZ19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMxLCBBVlBhY2tldCAqcGt0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ltZzJfYWxpYXNfcGl4LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvaW1nMl9hbGlhc19waXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY1MGFkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ltZzJfYWxpYXNfcGl4LmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIEFsaWFzIFBJWCBpbWFnZSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiaW1nMi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorCitzdGF0aWMgaW50IGFsaWFzX3BpeF9yZWFkX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CisgICAgY29uc3QgdWludDhfdCAqZW5kID0gYiArIHAtPmJ1Zl9zaXplOworICAgIGludCB3aWR0aCAgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZiKTsKKyAgICBpbnQgaGVpZ2h0ID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYik7CisgICAgYXZfdW51c2VkIGludCBveCA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmIpOworICAgIGF2X3VudXNlZCBpbnQgb3kgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZiKTsKKyAgICBpbnQgYnBwICAgID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYik7CisgICAgaW50IHgsIHk7CisKKyAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGJwcCAhPSAyNCAmJiBicHAgIT0gOCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKHk9MDsgeTwyICYmIHk8aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4PTA7IHg8d2lkdGg7ICkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gKmIrKzsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAwIHx8IHggKyBjb3VudCA+IHdpZHRoKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKGIgPiBlbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gODsKKyAgICAgICAgICAgIGIgKz0gYnBwIC8gODsKKyAgICAgICAgICAgIHggKz0gY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAxOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBpbWFnZTJfYWxpYXNfcGl4X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImFsaWFzX3BpeCBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gZmZfaW1nX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2ltYWdlMl9hbGlhc19waXhfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYWxpYXNfcGl4IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQWxpYXMvV2F2ZWZyb250IFBJWCBpbWFnZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWaWRlb0RlbXV4RGF0YSksCisgICAgLnJlYWRfcHJvYmUgICAgID0gYWxpYXNfcGl4X3JlYWRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZmZfaW1nX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZmX2ltZ19yZWFkX3BhY2tldCwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BTElBU19QSVgsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmltYWdlMl9hbGlhc19waXhfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2ltZzJfYnJlbmRlcl9waXguYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pbWcyX2JyZW5kZXJfcGl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2YjNkZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pbWcyX2JyZW5kZXJfcGl4LmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIEJSZW5kZXIgUElYIGltYWdlIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJpbWcyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCitzdGF0aWMgaW50IGJyZW5kZXJfcmVhZF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBicmVuZGVyX21hZ2ljWzE2XSA9IHsKKyAgICAgICAgMCwwLDAsMHgxMiwwLDAsMCw4LDAsMCwwLDIsMCwwLDAsMgorICAgIH07CisKKyAgICBpZiAobWVtY21wKHAtPmJ1ZiwgYnJlbmRlcl9tYWdpYywgc2l6ZW9mKGJyZW5kZXJfbWFnaWMpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoQVZfUkIzMihwLT5idWYrMTYpICE9IDB4MDMgJiYKKyAgICAgICAgQVZfUkIzMihwLT5idWYrMTYpICE9IDB4M0QpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYLTEwOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBpbWFnZTJfYnJlbmRlcl9waXhfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiYnJlbmRlcl9waXggZGVtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGZmX2ltZ19vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl9pbWFnZTJfYnJlbmRlcl9waXhfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYnJlbmRlcl9waXgiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCUmVuZGVyIFBJWCBpbWFnZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWaWRlb0RlbXV4RGF0YSksCisgICAgLnJlYWRfcHJvYmUgICAgID0gYnJlbmRlcl9yZWFkX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGZmX2ltZ19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmZl9pbWdfcmVhZF9wYWNrZXQsCisgICAgLnJhd19jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQlJFTkRFUl9QSVgsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmltYWdlMl9icmVuZGVyX3BpeF9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaW1nMmRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ltZzJkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjA4NjhjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ltZzJkZWMuYwpAQCAtMCwwICsxLDc4MyBAQAorLyoKKyAqIEltYWdlIGZvcm1hdAorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBfQlNEX1NPVVJDRQorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiaW1nMi5oIgorCisjaWYgSEFWRV9HTE9CCisvKiBMb2NhbGx5IGRlZmluZSBhcyAwIChiaXR3aXNlLU9SIG5vLW9wKSBhbnkgbWlzc2luZyBnbG9iIG9wdGlvbnMgdGhhdAorICAgYXJlIG5vbi1wb3NpeCBnbGliYy9ic2QgZXh0ZW5zaW9ucy4gKi8KKyNpZm5kZWYgR0xPQl9OT01BR0lDCisjZGVmaW5lIEdMT0JfTk9NQUdJQyAwCisjZW5kaWYKKyNpZm5kZWYgR0xPQl9CUkFDRQorI2RlZmluZSBHTE9CX0JSQUNFIDAKKyNlbmRpZgorCisjZW5kaWYgLyogSEFWRV9HTE9CICovCisKK3N0YXRpYyBjb25zdCBpbnQgc2l6ZXNbXVsyXSA9IHsKKyAgICB7IDY0MCwgNDgwIH0sCisgICAgeyA3MjAsIDQ4MCB9LAorICAgIHsgNzIwLCA1NzYgfSwKKyAgICB7IDM1MiwgMjg4IH0sCisgICAgeyAzNTIsIDI0MCB9LAorICAgIHsgMTYwLCAxMjggfSwKKyAgICB7IDUxMiwgMzg0IH0sCisgICAgeyA2NDAsIDM1MiB9LAorICAgIHsgNjQwLCAyNDAgfSwKK307CisKK3N0YXRpYyBpbnQgaW5mZXJfc2l6ZShpbnQgKndpZHRoX3B0ciwgaW50ICpoZWlnaHRfcHRyLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzaXplcyk7IGkrKykgeworICAgICAgICBpZiAoKHNpemVzW2ldWzBdICogc2l6ZXNbaV1bMV0pID09IHNpemUpIHsKKyAgICAgICAgICAgICp3aWR0aF9wdHIgID0gc2l6ZXNbaV1bMF07CisgICAgICAgICAgICAqaGVpZ2h0X3B0ciA9IHNpemVzW2ldWzFdOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaXNfZ2xvYihjb25zdCBjaGFyICpwYXRoKQoreworI2lmIEhBVkVfR0xPQgorICAgIHNpemVfdCBzcGFuID0gMDsKKyAgICBjb25zdCBjaGFyICpwID0gcGF0aDsKKworICAgIHdoaWxlIChwID0gc3RyY2hyKHAsICclJykpIHsKKyAgICAgICAgaWYgKCooKytwKSA9PSAnJScpIHsKKyAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzcGFuID0gc3Ryc3BuKHAsICIqP1tde30iKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBEaWQgd2UgaGl0IGEgZ2xvYiBjaGFyIG9yIGdldCB0byB0aGUgZW5kPyAqLworICAgIHJldHVybiBzcGFuICE9IDA7CisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCit9CisKKy8qKgorICogR2V0IGluZGV4IHJhbmdlIG9mIGltYWdlIGZpbGVzIG1hdGNoZWQgYnkgcGF0aC4KKyAqCisgKiBAcGFyYW0gcGZpcnN0X2luZGV4IHBvaW50ZXIgdG8gaW5kZXggdXBkYXRlZCB3aXRoIHRoZSBmaXJzdCBudW1iZXIgaW4gdGhlIHJhbmdlCisgKiBAcGFyYW0gcGxhc3RfaW5kZXggIHBvaW50ZXIgdG8gaW5kZXggdXBkYXRlZCB3aXRoIHRoZSBsYXN0IG51bWJlciBpbiB0aGUgcmFuZ2UKKyAqIEBwYXJhbSBwYXRoICAgICAgICAgcGF0aCB3aGljaCBoYXMgdG8gYmUgbWF0Y2hlZCBieSB0aGUgaW1hZ2UgZmlsZXMgaW4gdGhlIHJhbmdlCisgKiBAcGFyYW0gc3RhcnRfaW5kZXggIG1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgZm9yIHRoZSBmaXJzdCBpbmRleCBpbiB0aGUgcmFuZ2UKKyAqIEByZXR1cm4gLTEgaWYgbm8gaW1hZ2UgZmlsZSBjb3VsZCBiZSBmb3VuZAorICovCitzdGF0aWMgaW50IGZpbmRfaW1hZ2VfcmFuZ2UoaW50ICpwZmlyc3RfaW5kZXgsIGludCAqcGxhc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgaW50IHN0YXJ0X2luZGV4LCBpbnQgc3RhcnRfaW5kZXhfcmFuZ2UpCit7CisgICAgY2hhciBidWZbMTAyNF07CisgICAgaW50IHJhbmdlLCBsYXN0X2luZGV4LCByYW5nZTEsIGZpcnN0X2luZGV4OworCisgICAgLyogZmluZCB0aGUgZmlyc3QgaW1hZ2UgKi8KKyAgICBmb3IgKGZpcnN0X2luZGV4ID0gc3RhcnRfaW5kZXg7IGZpcnN0X2luZGV4IDwgc3RhcnRfaW5kZXggKyBzdGFydF9pbmRleF9yYW5nZTsgZmlyc3RfaW5kZXgrKykgeworICAgICAgICBpZiAoYXZfZ2V0X2ZyYW1lX2ZpbGVuYW1lKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHBhdGgsIGZpcnN0X2luZGV4KSA8IDApIHsKKyAgICAgICAgICAgICpwZmlyc3RfaW5kZXggPQorICAgICAgICAgICAgKnBsYXN0X2luZGV4ICA9IDE7CisgICAgICAgICAgICBpZiAoYXZpb19jaGVjayhidWYsIEFWSU9fRkxBR19SRUFEKSA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2aW9fY2hlY2soYnVmLCBBVklPX0ZMQUdfUkVBRCkgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChmaXJzdF9pbmRleCA9PSBzdGFydF9pbmRleCArIHN0YXJ0X2luZGV4X3JhbmdlKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiBmaW5kIHRoZSBsYXN0IGltYWdlICovCisgICAgbGFzdF9pbmRleCA9IGZpcnN0X2luZGV4OworICAgIGZvciAoOzspIHsKKyAgICAgICAgcmFuZ2UgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBpZiAoIXJhbmdlKQorICAgICAgICAgICAgICAgIHJhbmdlMSA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFuZ2UxID0gMiAqIHJhbmdlOworICAgICAgICAgICAgaWYgKGF2X2dldF9mcmFtZV9maWxlbmFtZShidWYsIHNpemVvZihidWYpLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2luZGV4ICsgcmFuZ2UxKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgaWYgKGF2aW9fY2hlY2soYnVmLCBBVklPX0ZMQUdfUkVBRCkgPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UxOworICAgICAgICAgICAgLyoganVzdCBpbiBjYXNlLi4uICovCisgICAgICAgICAgICBpZiAocmFuZ2UgPj0gKDEgPDwgMzApKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICAvKiB3ZSBhcmUgc3VyZSB0aGFuIGltYWdlIGxhc3RfaW5kZXggKyByYW5nZSBleGlzdHMgKi8KKyAgICAgICAgaWYgKCFyYW5nZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBsYXN0X2luZGV4ICs9IHJhbmdlOworICAgIH0KKyAgICAqcGZpcnN0X2luZGV4ID0gZmlyc3RfaW5kZXg7CisgICAgKnBsYXN0X2luZGV4ICA9IGxhc3RfaW5kZXg7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGltZ19yZWFkX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChwLT5maWxlbmFtZSAmJiBmZl9ndWVzc19pbWFnZTJfY29kZWMocC0+ZmlsZW5hbWUpKSB7CisgICAgICAgIGlmIChhdl9maWxlbmFtZV9udW1iZXJfdGVzdChwLT5maWxlbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgICAgIGVsc2UgaWYgKGlzX2dsb2IocC0+ZmlsZW5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgICAgICBlbHNlIGlmIChwLT5maWxlbmFtZVtzdHJjc3BuKHAtPmZpbGVuYW1lLCAiKj97IildKSAvLyBwcm9iYWJseSBQVF9HTE9CCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAyOyAvLyBzY29yZSBjaG9zZW4gdG8gYmUgYSB0YWQgYWJvdmUgdGhlIGltYWdlIHBpcGVzCisgICAgICAgIGVsc2UgaWYgKHAtPmJ1Zl9zaXplID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZWxzZSBpZiAoYXZfbWF0Y2hfZXh0KHAtPmZpbGVuYW1lLCAicmF3IikgfHwgYXZfbWF0Y2hfZXh0KHAtPmZpbGVuYW1lLCAiZ2lmIikpCisgICAgICAgICAgICByZXR1cm4gNTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2ltZ19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMxKQoreworICAgIFZpZGVvRGVtdXhEYXRhICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBpbnQgZmlyc3RfaW5kZXgsIGxhc3RfaW5kZXg7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgczEtPmN0eF9mbGFncyB8PSBBVkZNVENUWF9OT0hFQURFUjsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzMSwgTlVMTCk7CisgICAgaWYgKCFzdCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmIChzLT5waXhlbF9mb3JtYXQgJiYKKyAgICAgICAgKHBpeF9mbXQgPSBhdl9nZXRfcGl4X2ZtdChzLT5waXhlbF9mb3JtYXQpKSA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJObyBzdWNoIHBpeGVsIGZvcm1hdDogJXMuXG4iLAorICAgICAgICAgICAgICAgcy0+cGl4ZWxfZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdl9zdHJsY3B5KHMtPnBhdGgsIHMxLT5maWxlbmFtZSwgc2l6ZW9mKHMtPnBhdGgpKTsKKyAgICBzLT5pbWdfbnVtYmVyID0gMDsKKyAgICBzLT5pbWdfY291bnQgID0gMDsKKworICAgIC8qIGZpbmQgZm9ybWF0ICovCisgICAgaWYgKHMxLT5pZm9ybWF0LT5mbGFncyAmIEFWRk1UX05PRklMRSkKKyAgICAgICAgcy0+aXNfcGlwZSA9IDA7CisgICAgZWxzZSB7CisgICAgICAgIHMtPmlzX3BpcGUgICAgICAgPSAxOworICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICB9CisKKyAgICBpZiAocy0+dHNfZnJvbV9maWxlID09IDIpIHsKKyNpZiAhSEFWRV9TVFJVQ1RfU1RBVF9TVF9NVElNX1RWX05TRUMKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJQT1NJWC4xLTIwMDggbm90IHN1cHBvcnRlZCwgbmFub3NlY29uZCBmaWxlIHRpbWVzdGFtcHMgdW5hdmFpbGFibGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworI2VuZGlmCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwMDAwKTsKKyAgICB9IGVsc2UgaWYgKHMtPnRzX2Zyb21fZmlsZSkKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEpOworICAgIGVsc2UKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHMtPmZyYW1lcmF0ZS5kZW4sIHMtPmZyYW1lcmF0ZS5udW0pOworCisgICAgaWYgKHMtPndpZHRoICYmIHMtPmhlaWdodCkgeworICAgICAgICBzdC0+Y29kZWMtPndpZHRoICA9IHMtPndpZHRoOworICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICB9CisKKyAgICBpZiAoIXMtPmlzX3BpcGUpIHsKKyAgICAgICAgaWYgKHMtPnBhdHRlcm5fdHlwZSA9PSBQVF9HTE9CX1NFUVVFTkNFKSB7CisgICAgICAgIHMtPnVzZV9nbG9iID0gaXNfZ2xvYihzLT5wYXRoKTsKKyAgICAgICAgaWYgKHMtPnVzZV9nbG9iKSB7CisgICAgICAgICAgICBjaGFyICpwID0gcy0+cGF0aCwgKnEsICpkdXA7CisgICAgICAgICAgICBpbnQgZ2VycjsKKworICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfV0FSTklORywgIlBhdHRlcm4gdHlwZSAnZ2xvYl9zZXF1ZW5jZScgaXMgZGVwcmVjYXRlZDogIgorICAgICAgICAgICAgICAgICAgICJ1c2UgcGF0dGVybl90eXBlICdnbG9iJyBpbnN0ZWFkXG4iKTsKKyNpZiBIQVZFX0dMT0IKKyAgICAgICAgICAgIGR1cCA9IHEgPSBhdl9zdHJkdXAocCk7CisgICAgICAgICAgICB3aGlsZSAoKnEpIHsKKyAgICAgICAgICAgICAgICAvKiBEbyB3ZSBoYXZlIHJvb20gZm9yIHRoZSBuZXh0IGNoYXIgYW5kIGEgXCBpbnNlcnRpb24/ICovCisgICAgICAgICAgICAgICAgaWYgKChwIC0gcy0+cGF0aCkgPj0gKHNpemVvZihzLT5wYXRoKSAtIDIpKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKCpxID09ICclJyAmJiBzdHJzcG4ocSArIDEsICIlKj9bXXt9IikpCisgICAgICAgICAgICAgICAgICAgICsrcTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJzcG4ocSwgIlxcKj9bXXt9IikpCisgICAgICAgICAgICAgICAgICAgICpwKysgPSAnXFwnOworICAgICAgICAgICAgICAgICpwKysgPSAqcSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnAgPSAwOworICAgICAgICAgICAgYXZfZnJlZShkdXApOworCisgICAgICAgICAgICBnZXJyID0gZ2xvYihzLT5wYXRoLCBHTE9CX05PQ0hFQ0t8R0xPQl9CUkFDRXxHTE9CX05PTUFHSUMsIE5VTEwsICZzLT5nbG9ic3RhdGUpOworICAgICAgICAgICAgaWYgKGdlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT0VOVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXJzdF9pbmRleCA9IDA7CisgICAgICAgICAgICBsYXN0X2luZGV4ID0gcy0+Z2xvYnN0YXRlLmdsX3BhdGhjIC0gMTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzLT5wYXR0ZXJuX3R5cGUgPT0gUFRfR0xPQl9TRVFVRU5DRSAmJiAhcy0+dXNlX2dsb2IpIHx8IHMtPnBhdHRlcm5fdHlwZSA9PSBQVF9TRVFVRU5DRSkgeworICAgICAgICAgICAgaWYgKGZpbmRfaW1hZ2VfcmFuZ2UoJmZpcnN0X2luZGV4LCAmbGFzdF9pbmRleCwgcy0+cGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXJ0X251bWJlciwgcy0+c3RhcnRfbnVtYmVyX3JhbmdlKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIGZpbmQgbm8gZmlsZSB3aXRoIHBhdGggJyVzJyBhbmQgaW5kZXggaW4gdGhlIHJhbmdlICVkLSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5wYXRoLCBzLT5zdGFydF9udW1iZXIsIHMtPnN0YXJ0X251bWJlciArIHMtPnN0YXJ0X251bWJlcl9yYW5nZSAtIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT0VOVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+cGF0dGVybl90eXBlID09IFBUX0dMT0IpIHsKKyNpZiBIQVZFX0dMT0IKKyAgICAgICAgICAgIGludCBnZXJyOworICAgICAgICAgICAgZ2VyciA9IGdsb2Iocy0+cGF0aCwgR0xPQl9OT0NIRUNLfEdMT0JfQlJBQ0V8R0xPQl9OT01BR0lDLCBOVUxMLCAmcy0+Z2xvYnN0YXRlKTsKKyAgICAgICAgICAgIGlmIChnZXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9FTlQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlyc3RfaW5kZXggPSAwOworICAgICAgICAgICAgbGFzdF9pbmRleCA9IHMtPmdsb2JzdGF0ZS5nbF9wYXRoYyAtIDE7CisgICAgICAgICAgICBzLT51c2VfZ2xvYiA9IDE7CisjZWxzZQorICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlBhdHRlcm4gdHlwZSAnZ2xvYicgd2FzIHNlbGVjdGVkIGJ1dCBnbG9iYmluZyAiCisgICAgICAgICAgICAgICAgICAgImlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBsaWJhdmZvcm1hdCBidWlsZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworI2VuZGlmCisgICAgICAgIH0gZWxzZSBpZiAocy0+cGF0dGVybl90eXBlICE9IFBUX0dMT0JfU0VRVUVOQ0UpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJVbmtub3duIHZhbHVlICclZCcgZm9yIHBhdHRlcm5fdHlwZSBvcHRpb25cbiIsIHMtPnBhdHRlcm5fdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIHMtPmltZ19maXJzdCAgPSBmaXJzdF9pbmRleDsKKyAgICAgICAgcy0+aW1nX2xhc3QgICA9IGxhc3RfaW5kZXg7CisgICAgICAgIHMtPmltZ19udW1iZXIgPSBmaXJzdF9pbmRleDsKKyAgICAgICAgLyogY29tcHV0ZSBkdXJhdGlvbiAqLworICAgICAgICBpZiAoIXMtPnRzX2Zyb21fZmlsZSkgeworICAgICAgICAgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOworICAgICAgICAgICAgc3QtPmR1cmF0aW9uICAgPSBsYXN0X2luZGV4IC0gZmlyc3RfaW5kZXggKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMxLT52aWRlb19jb2RlY19pZCkgeworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IHMxLT52aWRlb19jb2RlY19pZDsKKyAgICB9IGVsc2UgaWYgKHMxLT5hdWRpb19jb2RlY19pZCkgeworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IHMxLT5hdWRpb19jb2RlY19pZDsKKyAgICB9IGVsc2UgaWYgKHMxLT5pZm9ybWF0LT5yYXdfY29kZWNfaWQpIHsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBzMS0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnJjaHIocy0+cGF0aCwgJy4nKTsKKyAgICAgICAgcy0+c3BsaXRfcGxhbmVzICAgICAgID0gc3RyICYmICFhdl9zdHJjYXNlY21wKHN0ciArIDEsICJ5Iik7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgaWYgKHMxLT5wYikgeworICAgICAgICAgICAgaW50IHByb2JlX2J1ZmZlcl9zaXplID0gMjA0ODsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnByb2JlX2J1ZmZlciA9IGF2X3JlYWxsb2MoTlVMTCwgcHJvYmVfYnVmZmVyX3NpemUgKyBBVlBST0JFX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBBVklucHV0Rm9ybWF0ICpmbXQgPSBOVUxMOworICAgICAgICAgICAgQVZQcm9iZURhdGEgcGQgPSB7IDAgfTsKKworICAgICAgICAgICAgaWYgKCFwcm9iZV9idWZmZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgcHJvYmVfYnVmZmVyX3NpemUgPSBhdmlvX3JlYWQoczEtPnBiLCBwcm9iZV9idWZmZXIsIHByb2JlX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgICAgIGlmIChwcm9iZV9idWZmZXJfc2l6ZSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHByb2JlX2J1ZmZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb2JlX2J1ZmZlcl9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtc2V0KHByb2JlX2J1ZmZlciArIHByb2JlX2J1ZmZlcl9zaXplLCAwLCBBVlBST0JFX1BBRERJTkdfU0laRSk7CisKKyAgICAgICAgICAgIHBkLmJ1ZiA9IHByb2JlX2J1ZmZlcjsKKyAgICAgICAgICAgIHBkLmJ1Zl9zaXplID0gcHJvYmVfYnVmZmVyX3NpemU7CisgICAgICAgICAgICBwZC5maWxlbmFtZSA9IHMxLT5maWxlbmFtZTsKKworICAgICAgICAgICAgd2hpbGUgKChmbXQgPSBhdl9pZm9ybWF0X25leHQoZm10KSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm10LT5yZWFkX2hlYWRlciAhPSBmZl9pbWdfcmVhZF9oZWFkZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgIWZtdC0+cmVhZF9wcm9iZSB8fAorICAgICAgICAgICAgICAgICAgICAoZm10LT5mbGFncyAmIEFWRk1UX05PRklMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgIWZtdC0+cmF3X2NvZGVjX2lkKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoZm10LT5yZWFkX3Byb2JlKCZwZCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmbXQtPnJhd19jb2RlY19pZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmZpb19yZXdpbmRfd2l0aF9wcm9iZV9kYXRhKHMxLT5wYiwgJnByb2JlX2J1ZmZlciwgcHJvYmVfYnVmZmVyX3NpemUpOworICAgICAgICB9CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfZ3Vlc3NfaW1hZ2UyX2NvZGVjKHMtPnBhdGgpOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9MSlBFRykKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NSlBFRzsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUxJQVNfUElYKSAvLyB3ZSBjYW5ub3QgZGlzdGluZ2l1c2ggdGhpcyBmcm9tIEJSRU5ERVJfUElYCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTk9ORTsKKyAgICB9CisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICAgICAgcGl4X2ZtdCAhPSBBVl9QSVhfRk1UX05PTkUpCisgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IHBpeF9mbXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2ltZ19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMxLCBBVlBhY2tldCAqcGt0KQoreworICAgIFZpZGVvRGVtdXhEYXRhICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBjaGFyIGZpbGVuYW1lX2J5dGVzWzEwMjRdOworICAgIGNoYXIgKmZpbGVuYW1lID0gZmlsZW5hbWVfYnl0ZXM7CisgICAgaW50IGksIHJlczsKKyAgICBpbnQgc2l6ZVszXSAgICAgICAgICAgPSB7IDAgfSwgcmV0WzNdID0geyAwIH07CisgICAgQVZJT0NvbnRleHQgKmZbM10gICAgID0geyBOVUxMIH07CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gczEtPnN0cmVhbXNbMF0tPmNvZGVjOworCisgICAgaWYgKCFzLT5pc19waXBlKSB7CisgICAgICAgIC8qIGxvb3Agb3ZlciBpbnB1dCAqLworICAgICAgICBpZiAocy0+bG9vcCAmJiBzLT5pbWdfbnVtYmVyID4gcy0+aW1nX2xhc3QpIHsKKyAgICAgICAgICAgIHMtPmltZ19udW1iZXIgPSBzLT5pbWdfZmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmltZ19udW1iZXIgPiBzLT5pbWdfbGFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICAgICAgaWYgKHMtPnVzZV9nbG9iKSB7CisjaWYgSEFWRV9HTE9CCisgICAgICAgICAgICBmaWxlbmFtZSA9IHMtPmdsb2JzdGF0ZS5nbF9wYXRodltzLT5pbWdfbnVtYmVyXTsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXZfZ2V0X2ZyYW1lX2ZpbGVuYW1lKGZpbGVuYW1lX2J5dGVzLCBzaXplb2YoZmlsZW5hbWVfYnl0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW1nX251bWJlcikgPCAwICYmIHMtPmltZ19udW1iZXIgPiAxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXZpb19vcGVuMigmZltpXSwgZmlsZW5hbWUsIEFWSU9fRkxBR19SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMxLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChpID49IDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gZmlsZSA6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVbaV0gPSBhdmlvX3NpemUoZltpXSk7CisKKyAgICAgICAgICAgIGlmICghcy0+c3BsaXRfcGxhbmVzKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZmlsZW5hbWVbc3RybGVuKGZpbGVuYW1lKSAtIDFdID0gJ1UnICsgaTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgQVZQcm9iZURhdGEgcGQgPSB7IDAgfTsKKyAgICAgICAgICAgIEFWSW5wdXRGb3JtYXQgKmlmbXQ7CisgICAgICAgICAgICB1aW50OF90IGhlYWRlcltQUk9CRV9CVUZfTUlOICsgQVZQUk9CRV9QQURESU5HX1NJWkVdOworICAgICAgICAgICAgaW50IHJldDsKKyAgICAgICAgICAgIGludCBzY29yZSA9IDA7CisKKyAgICAgICAgICAgIHJldCA9IGF2aW9fcmVhZChmWzBdLCBoZWFkZXIsIFBST0JFX0JVRl9NSU4pOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIG1lbXNldChoZWFkZXIgKyByZXQsIDAsIHNpemVvZihoZWFkZXIpIC0gcmV0KTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChmWzBdLCAtcmV0KTsKKyAgICAgICAgICAgIHBkLmJ1ZiA9IGhlYWRlcjsKKyAgICAgICAgICAgIHBkLmJ1Zl9zaXplID0gcmV0OworICAgICAgICAgICAgcGQuZmlsZW5hbWUgPSBmaWxlbmFtZTsKKworICAgICAgICAgICAgaWZtdCA9IGF2X3Byb2JlX2lucHV0X2Zvcm1hdDMoJnBkLCAxLCAmc2NvcmUpOworICAgICAgICAgICAgaWYgKGlmbXQgJiYgaWZtdC0+cmVhZF9wYWNrZXQgPT0gZmZfaW1nX3JlYWRfcGFja2V0ICYmIGlmbXQtPnJhd19jb2RlY19pZCkKKyAgICAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPSBpZm10LT5yYXdfY29kZWNfaWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPICYmICFjb2RlYy0+d2lkdGgpCisgICAgICAgICAgICBpbmZlcl9zaXplKCZjb2RlYy0+d2lkdGgsICZjb2RlYy0+aGVpZ2h0LCBzaXplWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmWzBdID0gczEtPnBiOworICAgICAgICBpZiAoYXZpb19mZW9mKGZbMF0pICYmIHMtPmxvb3AgJiYgcy0+aXNfcGlwZSkKKyAgICAgICAgICAgIGF2aW9fc2VlayhmWzBdLCAwLCBTRUVLX1NFVCk7CisgICAgICAgIGlmIChhdmlvX2Zlb2YoZlswXSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIGlmIChzLT5mcmFtZV9zaXplID4gMCkgeworICAgICAgICAgICAgc2l6ZVswXSA9IHMtPmZyYW1lX3NpemU7CisgICAgICAgIH0gZWxzZSBpZiAoIXMxLT5zdHJlYW1zWzBdLT5wYXJzZXIpIHsKKyAgICAgICAgICAgIHNpemVbMF0gPSBhdmlvX3NpemUoczEtPnBiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVbMF0gPSA0MDk2OworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gYXZfbmV3X3BhY2tldChwa3QsIHNpemVbMF0gKyBzaXplWzFdICsgc2l6ZVsyXSk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiByZXM7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIHBrdC0+ZmxhZ3MgICAgICAgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgIGlmIChzLT50c19mcm9tX2ZpbGUpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgaW1nX3N0YXQ7CisgICAgICAgIGlmIChzdGF0KGZpbGVuYW1lLCAmaW1nX3N0YXQpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgcGt0LT5wdHMgPSAoaW50NjRfdClpbWdfc3RhdC5zdF9tdGltZTsKKyNpZiBIQVZFX1NUUlVDVF9TVEFUX1NUX01USU1fVFZfTlNFQworICAgICAgICBpZiAocy0+dHNfZnJvbV9maWxlID09IDIpCisgICAgICAgICAgICBwa3QtPnB0cyA9IDEwMDAwMDAwMDAqcGt0LT5wdHMgKyBpbWdfc3RhdC5zdF9tdGltLnR2X25zZWM7CisjZW5kaWYKKyAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHMxLT5zdHJlYW1zWzBdLCBzLT5pbWdfbnVtYmVyLCBwa3QtPnB0cywgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgfSBlbHNlIGlmICghcy0+aXNfcGlwZSkgeworICAgICAgICBwa3QtPnB0cyAgICAgID0gcy0+cHRzOworICAgIH0KKworICAgIGlmIChzLT5pc19waXBlKQorICAgICAgICBwa3QtPnBvcyA9IGF2aW9fdGVsbChmWzBdKTsKKworICAgIHBrdC0+c2l6ZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBpZiAoZltpXSkgeworICAgICAgICAgICAgcmV0W2ldID0gYXZpb19yZWFkKGZbaV0sIHBrdC0+ZGF0YSArIHBrdC0+c2l6ZSwgc2l6ZVtpXSk7CisgICAgICAgICAgICBpZiAocy0+bG9vcCAmJiBzLT5pc19waXBlICYmIHJldFtpXSA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgICAgIGlmIChhdmlvX3NlZWsoZltpXSwgMCwgU0VFS19TRVQpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5wb3MgPSAwOworICAgICAgICAgICAgICAgICAgICByZXRbaV0gPSBhdmlvX3JlYWQoZltpXSwgcGt0LT5kYXRhICsgcGt0LT5zaXplLCBzaXplW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXMtPmlzX3BpcGUpCisgICAgICAgICAgICAgICAgYXZpb19jbG9zZShmW2ldKTsKKyAgICAgICAgICAgIGlmIChyZXRbaV0gPiAwKQorICAgICAgICAgICAgICAgIHBrdC0+c2l6ZSArPSByZXRbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmV0WzBdIDw9IDAgfHwgcmV0WzFdIDwgMCB8fCByZXRbMl0gPCAwKSB7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgIGlmIChyZXRbMF0gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0WzBdOworICAgICAgICB9IGVsc2UgaWYgKHJldFsxXSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXRbMV07CisgICAgICAgIH0gZWxzZSBpZiAocmV0WzJdIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXRbMl07CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5pbWdfY291bnQrKzsKKyAgICAgICAgcy0+aW1nX251bWJlcisrOworICAgICAgICBzLT5wdHMrKzsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgaW50IGltZ19yZWFkX2Nsb3NlKHN0cnVjdCBBVkZvcm1hdENvbnRleHQqIHMxKQoreworICAgIFZpZGVvRGVtdXhEYXRhICpzID0gczEtPnByaXZfZGF0YTsKKyNpZiBIQVZFX0dMT0IKKyAgICBpZiAocy0+dXNlX2dsb2IpIHsKKyAgICAgICAgZ2xvYmZyZWUoJnMtPmdsb2JzdGF0ZSk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW1nX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgVmlkZW9EZW11eERhdGEgKnMxID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisKKyAgICBpZiAoczEtPnRzX2Zyb21fZmlsZSkgeworICAgICAgICBpbnQgaW5kZXggPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHN0LCB0aW1lc3RhbXAsIGZsYWdzKTsKKyAgICAgICAgaWYoaW5kZXggPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzMS0+aW1nX251bWJlciA9IHN0LT5pbmRleF9lbnRyaWVzW2luZGV4XS5wb3M7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICh0aW1lc3RhbXAgPCAwIHx8ICFzMS0+bG9vcCAmJiB0aW1lc3RhbXAgPiBzMS0+aW1nX2xhc3QgLSBzMS0+aW1nX2ZpcnN0KQorICAgICAgICByZXR1cm4gLTE7CisgICAgczEtPmltZ19udW1iZXIgPSB0aW1lc3RhbXAlKHMxLT5pbWdfbGFzdCAtIHMxLT5pbWdfZmlyc3QgKyAxKSArIHMxLT5pbWdfZmlyc3Q7CisgICAgczEtPnB0cyA9IHRpbWVzdGFtcDsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVmlkZW9EZW11eERhdGEsIHgpCisjZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorY29uc3QgQVZPcHRpb24gZmZfaW1nX29wdGlvbnNbXSA9IHsKKyAgICB7ICJmcmFtZXJhdGUiLCAgICAic2V0IHRoZSB2aWRlbyBmcmFtZXJhdGUiLCAgICAgICAgICAgICBPRkZTRVQoZnJhbWVyYXRlKSwgICAgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgICBERUMgfSwKKyAgICB7ICJsb29wIiwgICAgICAgICAiZm9yY2UgbG9vcCBvdmVyIGlucHV0IGZpbGUgc2VxdWVuY2UiLCBPRkZTRVQobG9vcCksICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDAgICB9LCAwLCAxLCAgICAgICBERUMgfSwKKworICAgIHsgInBhdHRlcm5fdHlwZSIsICJzZXQgcGF0dGVybiB0eXBlIiwgICAgICAgICAgICAgICAgICAgIE9GRlNFVChwYXR0ZXJuX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PVBUX0dMT0JfU0VRVUVOQ0V9LCAwLCAgICAgICBJTlRfTUFYLCBERUMsICJwYXR0ZXJuX3R5cGUifSwKKyAgICB7ICJnbG9iX3NlcXVlbmNlIiwic2VsZWN0IGdsb2Ivc2VxdWVuY2UgcGF0dGVybiB0eXBlIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PVBUX0dMT0JfU0VRVUVOQ0V9LCBJTlRfTUlOLCBJTlRfTUFYLCBERUMsICJwYXR0ZXJuX3R5cGUiIH0sCisgICAgeyAiZ2xvYiIsICAgICAgICAgInNlbGVjdCBnbG9iIHBhdHRlcm4gdHlwZSIsICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND1QVF9HTE9CICAgICAgICAgfSwgSU5UX01JTiwgSU5UX01BWCwgREVDLCAicGF0dGVybl90eXBlIiB9LAorICAgIHsgInNlcXVlbmNlIiwgICAgICJzZWxlY3Qgc2VxdWVuY2UgcGF0dGVybiB0eXBlIiwgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9UFRfU0VRVUVOQ0UgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsIERFQywgInBhdHRlcm5fdHlwZSIgfSwKKworICAgIHsgInBpeGVsX2Zvcm1hdCIsICJzZXQgdmlkZW8gcGl4ZWwgZm9ybWF0IiwgICAgICAgICAgICAgIE9GRlNFVChwaXhlbF9mb3JtYXQpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsICAgICAgIERFQyB9LAorICAgIHsgInN0YXJ0X251bWJlciIsICJzZXQgZmlyc3QgbnVtYmVyIGluIHRoZSBzZXF1ZW5jZSIsICAgIE9GRlNFVChzdGFydF9udW1iZXIpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMCAgIH0sIDAsIElOVF9NQVgsIERFQyB9LAorICAgIHsgInN0YXJ0X251bWJlcl9yYW5nZSIsICJzZXQgcmFuZ2UgZm9yIGxvb2tpbmcgYXQgdGhlIGZpcnN0IHNlcXVlbmNlIG51bWJlciIsIE9GRlNFVChzdGFydF9udW1iZXJfcmFuZ2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gNX0sIDEsIElOVF9NQVgsIERFQyB9LAorICAgIHsgInZpZGVvX3NpemUiLCAgICJzZXQgdmlkZW8gc2l6ZSIsICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVCh3aWR0aCksICAgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCAgIERFQyB9LAorICAgIHsgImZyYW1lX3NpemUiLCAgICJmb3JjZSBmcmFtZSBzaXplIGluIGJ5dGVzIiwgICAgICAgICAgIE9GRlNFVChmcmFtZV9zaXplKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMCAgIH0sIDAsIElOVF9NQVgsIERFQyB9LAorICAgIHsgInRzX2Zyb21fZmlsZSIsICJzZXQgZnJhbWUgdGltZXN0YW1wIGZyb20gZmlsZSdzIG9uZSIsIE9GRlNFVCh0c19mcm9tX2ZpbGUpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMCAgIH0sIDAsIDIsICAgICAgIERFQywgInRzX3R5cGUiIH0sCisgICAgeyAibm9uZSIsICJub25lIiwgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsICAgIHsuaTY0ID0gMCAgIH0sIDAsIDIsICAgICAgIERFQywgInRzX3R5cGUiIH0sCisgICAgeyAic2VjIiwgICJzZWNvbmQgcHJlY2lzaW9uIiwgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsICAgIHsuaTY0ID0gMSAgIH0sIDAsIDIsICAgICAgIERFQywgInRzX3R5cGUiIH0sCisgICAgeyAibnMiLCAgICJuYW5vIHNlY29uZCBwcmVjaXNpb24iLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsICAgIHsuaTY0ID0gMiAgIH0sIDAsIDIsICAgICAgIERFQywgInRzX3R5cGUiIH0sCisgICAgeyBOVUxMIH0sCit9OworCisjaWYgQ09ORklHX0lNQUdFMl9ERU1VWEVSCitzdGF0aWMgY29uc3QgQVZDbGFzcyBpbWcyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImltYWdlMiBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gZmZfaW1nX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworQVZJbnB1dEZvcm1hdCBmZl9pbWFnZTJfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaW1hZ2UyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiaW1hZ2UyIHNlcXVlbmNlIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZpZGVvRGVtdXhEYXRhKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBpbWdfcmVhZF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBmZl9pbWdfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmZfaW1nX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGltZ19yZWFkX2Nsb3NlLAorICAgIC5yZWFkX3NlZWsgICAgICA9IGltZ19yZWFkX3NlZWssCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZpbWcyX2NsYXNzLAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19JTUFHRTJQSVBFX0RFTVVYRVIKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGltZzJwaXBlX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImltYWdlMnBpcGUgZGVtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGZmX2ltZ19vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKK0FWSW5wdXRGb3JtYXQgZmZfaW1hZ2UycGlwZV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJpbWFnZTJwaXBlIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicGlwZWQgaW1hZ2UyIHNlcXVlbmNlIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZpZGVvRGVtdXhEYXRhKSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBmZl9pbWdfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmZfaW1nX3JlYWRfcGFja2V0LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZpbWcycGlwZV9jbGFzcywKK307CisjZW5kaWYKKworc3RhdGljIGludCBibXBfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqYiA9IHAtPmJ1ZjsKKyAgICBpbnQgaWhzaXplOworCisgICAgaWYgKEFWX1JCMTYoYikgIT0gMHg0MjRkKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGloc2l6ZSA9IEFWX1JMMzIoYisxNCk7CisgICAgaWYgKGloc2l6ZSA8IDEyIHx8IGloc2l6ZSA+IDI1NSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIUFWX1JOMzIoYiArIDYpKSB7CisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIC8gNDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHB4X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CisKKyAgICBpZiAoQVZfUk4zMihiKSA9PSBBVl9STjMyKCJTRFBYIikgfHwgQVZfUk4zMihiKSA9PSBBVl9STjMyKCJYUERTIikpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXhyX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CisKKyAgICBpZiAoQVZfUkwzMihiKSA9PSAyMDAwMDYzMCkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqMmtfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqYiA9IHAtPmJ1ZjsKKworICAgIGlmIChBVl9SQjY0KGIpID09IDB4MDAwMDAwMGM2YTUwMjAyMCB8fAorICAgICAgICBBVl9SQjMyKGIpID09IDB4ZmY0ZmZmNTEpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQganBlZ19wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpiID0gcC0+YnVmOworICAgIGludCBpLCBzdGF0ZSA9IDB4RDg7CisKKyAgICBpZiAoQVZfUkIxNihiKSAhPSAweEZGRDggfHwKKyAgICAgICAgQVZfUkIzMihiKSA9PSAweEZGRDhGRkY3KQorICAgIHJldHVybiAwOworCisgICAgYiArPSAyOworICAgIGZvciAoaSA9IDA7IGkgPCBwLT5idWZfc2l6ZSAtIDI7IGkrKykgeworICAgICAgICBpbnQgYzsKKyAgICAgICAgaWYgKGJbaV0gIT0gMHhGRikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjID0gYltpICsgMV07CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlIDB4RDg6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSAweEMwOgorICAgICAgICBjYXNlIDB4QzE6CisgICAgICAgIGNhc2UgMHhDMjoKKyAgICAgICAgY2FzZSAweEMzOgorICAgICAgICBjYXNlIDB4QzU6CisgICAgICAgIGNhc2UgMHhDNjoKKyAgICAgICAgY2FzZSAweEM3OgorICAgICAgICAgICAgaWYgKHN0YXRlICE9IDB4RDgpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBzdGF0ZSA9IDB4QzA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweERBOgorICAgICAgICAgICAgaWYgKHN0YXRlICE9IDB4QzApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBzdGF0ZSA9IDB4REE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweEQ5OgorICAgICAgICAgICAgaWYgKHN0YXRlICE9IDB4REEpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBzdGF0ZSA9IDB4RDk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICggIChjID49IDB4MDIgJiYgYyA8PSAweEJGKQorICAgICAgICAgICAgICAgIHx8IGMgPT0gMHhDOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSAweEQ5KQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAxOworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDg7Cit9CisKK3N0YXRpYyBpbnQganBlZ2xzX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CisKKyAgICBpZiAoQVZfUkIzMihiKSA9PSAweGZmZDhmZmY3KQorICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaWN0b3JfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqYiA9IHAtPmJ1ZjsKKworICAgIGlmIChBVl9STDE2KGIpID09IDB4MTIzNCkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIC8gNDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbmdfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqYiA9IHAtPmJ1ZjsKKworICAgIGlmIChBVl9SQjY0KGIpID09IDB4ODk1MDRlNDcwZDBhMWEwYSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZ2lfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqYiA9IHAtPmJ1ZjsKKworICAgIGlmIChBVl9SQjE2KGIpID09IDQ3NCAmJgorICAgICAgICAoYlsyXSAmIH4xKSA9PSAwICYmCisgICAgICAgIChiWzNdICYgfjMpID09IDAgJiYgYlszXSAmJgorICAgICAgICAoQVZfUkIxNihiICsgNCkgJiB+NykgPT0gMCAmJiBBVl9SQjE2KGIgKyA0KSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdW5yYXN0X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CisKKyAgICBpZiAoQVZfUkIzMihiKSA9PSAweDU5YTY2YTk1KQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpZmZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqYiA9IHAtPmJ1ZjsKKworICAgIGlmIChBVl9SQjMyKGIpID09IDB4NDk0OTJhMDAgfHwKKyAgICAgICAgQVZfUkIzMihiKSA9PSAweDRENEQwMDJhKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdlYnBfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqYiA9IHAtPmJ1ZjsKKworICAgIGlmIChBVl9SQjMyKGIpICAgICA9PSAweDUyNDk0NjQ2ICYmCisgICAgICAgIEFWX1JCMzIoYiArIDgpID09IDB4NTc0NTQyNTApCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAtIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSU1BR0VBVVRPX0RFTVVYRVIoaW1nbmFtZSwgY29kZWNpZClcCitzdGF0aWMgY29uc3QgQVZDbGFzcyBpbWduYW1lICMjIF9jbGFzcyA9IHtcCisgICAgLmNsYXNzX25hbWUgPSBBVl9TVFJJTkdJRlkoaW1nbmFtZSkgIiBkZW11eGVyIixcCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSxcCisgICAgLm9wdGlvbiAgICAgPSBmZl9pbWdfb3B0aW9ucyxcCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsXAorfTtcCitBVklucHV0Rm9ybWF0IGZmX2ltYWdlXyAjIyBpbWduYW1lICMjIF9waXBlX2RlbXV4ZXIgPSB7XAorICAgIC5uYW1lICAgICAgICAgICA9IEFWX1NUUklOR0lGWShpbWduYW1lKSAiX3BpcGUiLFwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicGlwZWQgIiBBVl9TVFJJTkdJRlkoaW1nbmFtZSkgIiBzZXF1ZW5jZSIpLFwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVmlkZW9EZW11eERhdGEpLFwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBpbWduYW1lICMjIF9wcm9iZSxcCisgICAgLnJlYWRfaGVhZGVyICAgID0gZmZfaW1nX3JlYWRfaGVhZGVyLFwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmZl9pbWdfcmVhZF9wYWNrZXQsXAorICAgIC5wcml2X2NsYXNzICAgICA9ICYgaW1nbmFtZSAjIyBfY2xhc3MsXAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsIFwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBjb2RlY2lkLFwKK307CisKK0lNQUdFQVVUT19ERU1VWEVSKGJtcCwgICAgIEFWX0NPREVDX0lEX0JNUCkKK0lNQUdFQVVUT19ERU1VWEVSKGRweCwgICAgIEFWX0NPREVDX0lEX0RQWCkKK0lNQUdFQVVUT19ERU1VWEVSKGV4ciwgICAgIEFWX0NPREVDX0lEX0VYUikKK0lNQUdFQVVUT19ERU1VWEVSKGoyaywgICAgIEFWX0NPREVDX0lEX0pQRUcyMDAwKQorSU1BR0VBVVRPX0RFTVVYRVIoanBlZywgICAgQVZfQ09ERUNfSURfTUpQRUcpCitJTUFHRUFVVE9fREVNVVhFUihqcGVnbHMsICBBVl9DT0RFQ19JRF9KUEVHTFMpCitJTUFHRUFVVE9fREVNVVhFUihwaWN0b3IsICBBVl9DT0RFQ19JRF9QSUNUT1IpCitJTUFHRUFVVE9fREVNVVhFUihwbmcsICAgICBBVl9DT0RFQ19JRF9QTkcpCitJTUFHRUFVVE9fREVNVVhFUihzZ2ksICAgICBBVl9DT0RFQ19JRF9TR0kpCitJTUFHRUFVVE9fREVNVVhFUihzdW5yYXN0LCBBVl9DT0RFQ19JRF9TVU5SQVNUKQorSU1BR0VBVVRPX0RFTVVYRVIodGlmZiwgICAgQVZfQ09ERUNfSURfVElGRikKK0lNQUdFQVVUT19ERU1VWEVSKHdlYnAsICAgIEFWX0NPREVDX0lEX1dFQlApCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaW1nMmVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ltZzJlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjhiMmQwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ltZzJlbmMuYwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIEltYWdlIGZvcm1hdAorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7ICAvKio8IENsYXNzIGZvciBwcml2YXRlIG9wdGlvbnMuICovCisgICAgaW50IGltZ19udW1iZXI7CisgICAgaW50IGlzX3BpcGU7CisgICAgaW50IHNwbGl0X3BsYW5lczsgICAgICAgLyoqPCB1c2UgaW5kZXBlbmRlbnQgZmlsZSBmb3IgZWFjaCBZLCBVLCBWIHBsYW5lICovCisgICAgY2hhciBwYXRoWzEwMjRdOworICAgIGludCB1cGRhdGU7CisgICAgaW50IHVzZV9zdHJmdGltZTsKKyAgICBjb25zdCBjaGFyICptdXhlcjsKK30gVmlkZW9NdXhEYXRhOworCitzdGF0aWMgaW50IHdyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgVmlkZW9NdXhEYXRhICppbWcgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1swXTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHN0LT5jb2RlYy0+cGl4X2ZtdCk7CisKKyAgICBhdl9zdHJsY3B5KGltZy0+cGF0aCwgcy0+ZmlsZW5hbWUsIHNpemVvZihpbWctPnBhdGgpKTsKKworICAgIC8qIGZpbmQgZm9ybWF0ICovCisgICAgaWYgKHMtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9GSUxFKQorICAgICAgICBpbWctPmlzX3BpcGUgPSAwOworICAgIGVsc2UKKyAgICAgICAgaW1nLT5pc19waXBlID0gMTsKKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0dJRikgeworICAgICAgICBpbWctPm11eGVyID0gImdpZiI7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnJjaHIoaW1nLT5wYXRoLCAnLicpOworICAgICAgICBpbWctPnNwbGl0X3BsYW5lcyA9ICAgICBzdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWF2X3N0cmNhc2VjbXAoc3RyICsgMSwgInkiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzLT5uYl9zdHJlYW1zID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVzYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJihkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QTEFOQVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRlc2MtPm5iX2NvbXBvbmVudHMgPj0gMzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBWaWRlb011eERhdGEgKmltZyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGJbNF07CisgICAgY2hhciBmaWxlbmFtZVsxMDI0XTsKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+Y29kZWM7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChjb2RlYy0+cGl4X2ZtdCk7CisgICAgaW50IGk7CisKKyAgICBpZiAoIWltZy0+aXNfcGlwZSkgeworICAgICAgICBpZiAoaW1nLT51cGRhdGUpIHsKKyAgICAgICAgICAgIGF2X3N0cmxjcHkoZmlsZW5hbWUsIGltZy0+cGF0aCwgc2l6ZW9mKGZpbGVuYW1lKSk7CisgICAgICAgIH0gZWxzZSBpZiAoaW1nLT51c2Vfc3RyZnRpbWUpIHsKKyAgICAgICAgICAgIHRpbWVfdCBub3cwOworICAgICAgICAgICAgc3RydWN0IHRtICp0bSwgdG1wYnVmOworICAgICAgICAgICAgdGltZSgmbm93MCk7CisgICAgICAgICAgICB0bSA9IGxvY2FsdGltZV9yKCZub3cwLCAmdG1wYnVmKTsKKyAgICAgICAgICAgIGlmICghc3RyZnRpbWUoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksIGltZy0+cGF0aCwgdG0pKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBnZXQgZnJhbWUgZmlsZW5hbWUgd2l0aCBzdHJmdGltZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhdl9nZXRfZnJhbWVfZmlsZW5hbWUoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksIGltZy0+cGF0aCwgaW1nLT5pbWdfbnVtYmVyKSA8IDAgJiYKKyAgICAgICAgICAgICAgICAgICBpbWctPmltZ19udW1iZXIgPiAxKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IGZyYW1lIGZpbGVuYW1lIG51bWJlciAlZCBmcm9tIHBhdHRlcm4gJyVzJyAoZWl0aGVyIHNldCB1cGRhdGVmaXJzdCBvciB1c2UgYSBwYXR0ZXJuIGxpa2UgJSUwM2Qgd2l0aGluIHRoZSBmaWxlbmFtZSBwYXR0ZXJuKVxuIiwKKyAgICAgICAgICAgICAgICAgICBpbWctPmltZ19udW1iZXIsIGltZy0+cGF0aCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhdmlvX29wZW4yKCZwYltpXSwgZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgb3BlbiBmaWxlIDogJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWltZy0+c3BsaXRfcGxhbmVzIHx8IGkrMSA+PSBkZXNjLT5uYl9jb21wb25lbnRzKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZmlsZW5hbWVbc3RybGVuKGZpbGVuYW1lKSAtIDFdID0gIlVWQXgiW2ldOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGJbMF0gPSBzLT5wYjsKKyAgICB9CisKKyAgICBpZiAoaW1nLT5zcGxpdF9wbGFuZXMpIHsKKyAgICAgICAgaW50IHlzaXplID0gY29kZWMtPndpZHRoICogY29kZWMtPmhlaWdodDsKKyAgICAgICAgaW50IHVzaXplID0gRkZfQ0VJTF9SU0hJRlQoY29kZWMtPndpZHRoLCBkZXNjLT5sb2cyX2Nocm9tYV93KSAqIEZGX0NFSUxfUlNISUZUKGNvZGVjLT5oZWlnaHQsIGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgICAgICBpZiAoZGVzYy0+Y29tcFswXS5kZXB0aF9taW51czEgPj0gOCkgeworICAgICAgICAgICAgeXNpemUgKj0gMjsKKyAgICAgICAgICAgIHVzaXplICo9IDI7CisgICAgICAgIH0KKyAgICAgICAgYXZpb193cml0ZShwYlswXSwgcGt0LT5kYXRhICAgICAgICAgICAgICAgICwgeXNpemUpOworICAgICAgICBhdmlvX3dyaXRlKHBiWzFdLCBwa3QtPmRhdGEgKyB5c2l6ZSAgICAgICAgLCB1c2l6ZSk7CisgICAgICAgIGF2aW9fd3JpdGUocGJbMl0sIHBrdC0+ZGF0YSArIHlzaXplICsgdXNpemUsIHVzaXplKTsKKyAgICAgICAgYXZpb19jbG9zZShwYlsxXSk7CisgICAgICAgIGF2aW9fY2xvc2UocGJbMl0pOworICAgICAgICBpZiAoZGVzYy0+bmJfY29tcG9uZW50cyA+IDMpIHsKKyAgICAgICAgICAgIGF2aW9fd3JpdGUocGJbM10sIHBrdC0+ZGF0YSArIHlzaXplICsgMip1c2l6ZSwgeXNpemUpOworICAgICAgICAgICAgYXZpb19jbG9zZShwYlszXSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGltZy0+bXV4ZXIpIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgQVZTdHJlYW0gKnN0OworICAgICAgICBBVlBhY2tldCBwa3QyID0gezB9OworICAgICAgICBBVkZvcm1hdENvbnRleHQgKmZtdCA9IE5VTEw7CisKKyAgICAgICAgYXZfYXNzZXJ0MCghaW1nLT5zcGxpdF9wbGFuZXMpOworCisgICAgICAgIHJldCA9IGF2Zm9ybWF0X2FsbG9jX291dHB1dF9jb250ZXh0MigmZm10LCBOVUxMLCBpbWctPm11eGVyLCBzLT5maWxlbmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGZtdCwgTlVMTCk7CisgICAgICAgIGlmICghc3QpIHsKKyAgICAgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChmbXQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBzdC0+aWQgPSBwa3QtPnN0cmVhbV9pbmRleDsKKworICAgICAgICBmbXQtPnBiID0gcGJbMF07CisgICAgICAgIGlmICgocmV0ID0gYXZfY29weV9wYWNrZXQoJnBrdDIsIHBrdCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgMCB8fAorICAgICAgICAgICAgKHJldCA9IGF2X2R1cF9wYWNrZXQoJnBrdDIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IDAgfHwKKyAgICAgICAgICAgIChyZXQgPSBhdmNvZGVjX2NvcHlfY29udGV4dChzdC0+Y29kZWMsIHMtPnN0cmVhbXNbMF0tPmNvZGVjKSkgPCAwIHx8CisgICAgICAgICAgICAocmV0ID0gYXZmb3JtYXRfd3JpdGVfaGVhZGVyKGZtdCwgTlVMTCkpICAgICAgICAgICAgICAgICAgICAgIDwgMCB8fAorICAgICAgICAgICAgKHJldCA9IGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKGZtdCwgJnBrdDIpKSAgICAgICAgICAgICAgICA8IDAgfHwKKyAgICAgICAgICAgIChyZXQgPSBhdl93cml0ZV90cmFpbGVyKGZtdCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldCgmcGt0Mik7CisgICAgICAgICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQoZm10KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZV9wYWNrZXQoJnBrdDIpOworICAgICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQoZm10KTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3dyaXRlKHBiWzBdLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgfQorICAgIGF2aW9fZmx1c2gocGJbMF0pOworICAgIGlmICghaW1nLT5pc19waXBlKSB7CisgICAgICAgIGF2aW9fY2xvc2UocGJbMF0pOworICAgIH0KKworICAgIGltZy0+aW1nX251bWJlcisrOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihWaWRlb011eERhdGEsIHgpCisjZGVmaW5lIEVOQyBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG11eG9wdGlvbnNbXSA9IHsKKyAgICB7ICJ1cGRhdGVmaXJzdCIsICAiY29udGludW91c2x5IG92ZXJ3cml0ZSBvbmUgZmlsZSIsIE9GRlNFVCh1cGRhdGUpLCAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsICAgICAgIDEsIEVOQyB9LAorICAgIHsgInVwZGF0ZSIsICAgICAgICJjb250aW51b3VzbHkgb3ZlcndyaXRlIG9uZSBmaWxlIiwgT0ZGU0VUKHVwZGF0ZSksICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgICAgICAgMSwgRU5DIH0sCisgICAgeyAic3RhcnRfbnVtYmVyIiwgInNldCBmaXJzdCBudW1iZXIgaW4gdGhlIHNlcXVlbmNlIiwgT0ZGU0VUKGltZ19udW1iZXIpLCBBVl9PUFRfVFlQRV9JTlQsICB7IC5pNjQgPSAxIH0sIDAsIElOVF9NQVgsIEVOQyB9LAorICAgIHsgInN0cmZ0aW1lIiwgICAgICJ1c2Ugc3RyZnRpbWUgZm9yIGZpbGVuYW1lIiwgT0ZGU0VUKHVzZV9zdHJmdGltZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBFTkMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKKyNpZiBDT05GSUdfSU1BR0UyX01VWEVSCitzdGF0aWMgY29uc3QgQVZDbGFzcyBpbWcybXV4X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImltYWdlMiBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG11eG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9pbWFnZTJfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImltYWdlMiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImltYWdlMiBzZXF1ZW5jZSIpLAorICAgIC5leHRlbnNpb25zICAgICA9ICJibXAsZHB4LGpscyxqcGVnLGpwZyxsanBnLHBhbSxwYm0scGN4LHBnbSxwZ215dXYscG5nLCIKKyAgICAgICAgICAgICAgICAgICAgICAicHBtLHNnaSx0Z2EsdGlmLHRpZmYsanAyLGoyYyxqMmsseHdkLHN1bixyYXMscnMsaW0xLGltOCxpbTI0LCIKKyAgICAgICAgICAgICAgICAgICAgICAic3VucmFzLHhibSx4ZmFjZSxwaXgseSIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZpZGVvTXV4RGF0YSksCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfTUpQRUcsCisgICAgLndyaXRlX2hlYWRlciAgID0gd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IHdyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMgfCBBVkZNVF9OT0RJTUVOU0lPTlMgfCBBVkZNVF9OT0ZJTEUsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmltZzJtdXhfY2xhc3MsCit9OworI2VuZGlmCisjaWYgQ09ORklHX0lNQUdFMlBJUEVfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX2ltYWdlMnBpcGVfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImltYWdlMnBpcGUiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJwaXBlZCBpbWFnZTIgc2VxdWVuY2UiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVmlkZW9NdXhEYXRhKSwKKyAgICAudmlkZW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9NSlBFRywKKyAgICAud3JpdGVfaGVhZGVyICAgPSB3cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUyB8IEFWRk1UX05PRElNRU5TSU9OUworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2luZ2VuaWVudGRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2luZ2VuaWVudGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YzU0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaW5nZW5pZW50ZGVjLmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIFJBVyBJbmdlbmllbnQgTUpQRUcgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFsZXggQmVyZWdzemFzemkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicmF3ZGVjLmgiCisKKy8vIGh0dHA6Ly93d3cuYXJ0aWZpY2lzLmh1L2ZpbGVzL3RleHRzL2luZ2VuaWVudC50eHQKK3N0YXRpYyBpbnQgaW5nZW5pZW50X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0LCBzaXplLCB3LCBoLCB1bmsxLCB1bmsyOworCisgICAgaWYgKGF2aW9fcmwzMihzLT5wYikgIT0gTUtUQUcoJ00nLCAnSicsICdQJywgJ0cnKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsgLy8gRklYTUUKKworICAgIHNpemUgPSBhdmlvX3JsMzIocy0+cGIpOworCisgICAgdyA9IGF2aW9fcmwxNihzLT5wYik7CisgICAgaCA9IGF2aW9fcmwxNihzLT5wYik7CisKKyAgICBhdmlvX3NraXAocy0+cGIsIDgpOyAvLyB6ZXJvICsgc2l6ZSAocGFkZGVkPykKKyAgICBhdmlvX3NraXAocy0+cGIsIDIpOworICAgIHVuazEgPSBhdmlvX3JsMTYocy0+cGIpOworICAgIHVuazIgPSBhdmlvX3JsMTYocy0+cGIpOworICAgIGF2aW9fc2tpcChzLT5wYiwgMjIpOyAvLyBBU0NJSSB0aW1lc3RhbXAKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJJbmdlbmllbnQgcGFja2V0OiBzaXplPSVkLCB3aWR0aD0lZCwgaGVpZ2h0PSVkLCB1bmsxPSVkIHVuazI9JWRcbiIsCisgICAgICAgIHNpemUsIHcsIGgsIHVuazEsIHVuazIpOworCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworRkZfUkFXVklERU9fREVNVVhFUl9DTEFTUyhpbmdlbmllbnQpCisKK0FWSW5wdXRGb3JtYXQgZmZfaW5nZW5pZW50X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImluZ2VuaWVudCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBJbmdlbmllbnQgTUpQRUciKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZSYXdWaWRlb0RlbXV4ZXJDb250ZXh0KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBmZl9yYXdfdmlkZW9fcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gaW5nZW5pZW50X3JlYWRfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImNnaSIsIC8vIEZJWE1FCisgICAgLnJhd19jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTUpQRUcsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmluZ2VuaWVudF9kZW11eGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9pbnRlcm5hbC5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwM2RhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX0lOVEVSTkFMX0gKKyNkZWZpbmUgQVZGT1JNQVRfSU5URVJOQUxfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJvc19zdXBwb3J0LmgiCisKKyNkZWZpbmUgTUFYX1VSTF9TSVpFIDQwOTYKKworLyoqIHNpemUgb2YgcHJvYmUgYnVmZmVyLCBmb3IgZ3Vlc3NpbmcgZmlsZSB0eXBlIGZyb20gZmlsZSBjb250ZW50cyAqLworI2RlZmluZSBQUk9CRV9CVUZfTUlOIDIwNDgKKyNkZWZpbmUgUFJPQkVfQlVGX01BWCAoMSA8PCAyMCkKKworI2lmZGVmIERFQlVHCisjICAgIGRlZmluZSBoZXhfZHVtcF9kZWJ1ZyhjbGFzcywgYnVmLCBzaXplKSBhdl9oZXhfZHVtcF9sb2coY2xhc3MsIEFWX0xPR19ERUJVRywgYnVmLCBzaXplKQorI2Vsc2UKKyMgICAgZGVmaW5lIGhleF9kdW1wX2RlYnVnKGNsYXNzLCBidWYsIHNpemUpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgQVZDb2RlY1RhZyB7CisgICAgZW51bSBBVkNvZGVjSUQgaWQ7CisgICAgdW5zaWduZWQgaW50IHRhZzsKK30gQVZDb2RlY1RhZzsKKwordHlwZWRlZiBzdHJ1Y3QgQ29kZWNNaW1leworICAgIGNoYXIgc3RyWzMyXTsKKyAgICBlbnVtIEFWQ29kZWNJRCBpZDsKK30gQ29kZWNNaW1lOworCitzdHJ1Y3QgQVZGb3JtYXRJbnRlcm5hbCB7CisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIHN0cmVhbXMgcmVsZXZhbnQgZm9yIGludGVybGVhdmluZy4KKyAgICAgKiBNdXhpbmcgb25seS4KKyAgICAgKi8KKyAgICBpbnQgbmJfaW50ZXJsZWF2ZWRfc3RyZWFtczsKKworICAgIGludCBpbmplY3RfZ2xvYmFsX3NpZGVfZGF0YTsKK307CisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBkeW5hcnJheV9hZGQodGFiLCBuYl9wdHIsIGVsZW0pXAorZG8ge1wKKyAgICBfX3R5cGVvZl9fKHRhYikgX3RhYiA9ICh0YWIpO1wKKyAgICBfX3R5cGVvZl9fKGVsZW0pIF9lbGVtID0gKGVsZW0pO1wKKyAgICAodm9pZClzaXplb2YoKipfdGFiID09IF9lbGVtKTsgLyogY2hlY2sgdGhhdCB0eXBlcyBhcmUgY29tcGF0aWJsZSAqL1wKKyAgICBhdl9keW5hcnJheV9hZGQoX3RhYiwgbmJfcHRyLCBfZWxlbSk7XAorfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgZHluYXJyYXlfYWRkKHRhYiwgbmJfcHRyLCBlbGVtKVwKK2RvIHtcCisgICAgYXZfZHluYXJyYXlfYWRkKCh0YWIpLCBuYl9wdHIsIChlbGVtKSk7XAorfSB3aGlsZSgwKQorI2VuZGlmCisKK3N0cnVjdCB0bSAqZmZfYnJrdGltZWdtKHRpbWVfdCBzZWNzLCBzdHJ1Y3QgdG0gKnRtKTsKKworY2hhciAqZmZfZGF0YV90b19oZXgoY2hhciAqYnVmLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzaXplLCBpbnQgbG93ZXJjYXNlKTsKKworLyoqCisgKiBQYXJzZSBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBzdHJpbmdzLiBBbnkgc3BhY2UgYmV0d2VlbiB0aGUgaGV4YWRlY2ltYWwKKyAqIGRpZ2l0cyBpcyBpZ25vcmVkLgorICoKKyAqIEBwYXJhbSBkYXRhIGlmIG5vbi1udWxsLCB0aGUgcGFyc2VkIGRhdGEgaXMgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXIKKyAqIEBwYXJhbSBwIHRoZSBzdHJpbmcgdG8gcGFyc2UKKyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIChvciB0byBiZSB3cml0dGVuLCBpZiBkYXRhIGlzIG51bGwpCisgKi8KK2ludCBmZl9oZXhfdG9fZGF0YSh1aW50OF90ICpkYXRhLCBjb25zdCBjaGFyICpwKTsKKwordm9pZCBmZl9wcm9ncmFtX2FkZF9zdHJlYW1faW5kZXgoQVZGb3JtYXRDb250ZXh0ICphYywgaW50IHByb2dpZCwgdW5zaWduZWQgaW50IGlkeCk7CisKKy8qKgorICogQWRkIHBhY2tldCB0byBBVkZvcm1hdENvbnRleHQtPnBhY2tldF9idWZmZXIgbGlzdCwgZGV0ZXJtaW5pbmcgaXRzCisgKiBpbnRlcmxlYXZlZCBwb3NpdGlvbiB1c2luZyBjb21wYXJlKCkgZnVuY3Rpb24gYXJndW1lbnQuCisgKiBAcmV0dXJuIDAsIG9yIDwgMCBvbiBlcnJvcgorICovCitpbnQgZmZfaW50ZXJsZWF2ZV9hZGRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY29tcGFyZSkoQVZGb3JtYXRDb250ZXh0ICosIEFWUGFja2V0ICosIEFWUGFja2V0ICopKTsKKwordm9pZCBmZl9yZWFkX2ZyYW1lX2ZsdXNoKEFWRm9ybWF0Q29udGV4dCAqcyk7CisKKyNkZWZpbmUgTlRQX09GRlNFVCAyMjA4OTg4ODAwVUxMCisjZGVmaW5lIE5UUF9PRkZTRVRfVVMgKE5UUF9PRkZTRVQgKiAxMDAwMDAwVUxMKQorCisvKiogR2V0IHRoZSBjdXJyZW50IHRpbWUgc2luY2UgTlRQIGVwb2NoIGluIG1pY3Jvc2Vjb25kcy4gKi8KK3VpbnQ2NF90IGZmX250cF90aW1lKHZvaWQpOworCisvKioKKyAqIEFwcGVuZCB0aGUgbWVkaWEtc3BlY2lmaWMgU0RQIGZyYWdtZW50IGZvciB0aGUgbWVkaWEgc3RyZWFtIGMKKyAqIHRvIHRoZSBidWZmZXIgYnVmZi4KKyAqCisgKiBOb3RlLCB0aGUgYnVmZmVyIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkLCBzaW5jZSBpdCBpcyBhcHBlbmRlZCB0bworICogZXhpc3RpbmcgY29udGVudC4KKyAqCisgKiBAcGFyYW0gYnVmZiB0aGUgYnVmZmVyIHRvIGFwcGVuZCB0aGUgU0RQIGZyYWdtZW50IHRvCisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZiBidWZmZXIKKyAqIEBwYXJhbSBzdCB0aGUgQVZTdHJlYW0gb2YgdGhlIG1lZGlhIHRvIGRlc2NyaWJlCisgKiBAcGFyYW0gaWR4IHRoZSBnbG9iYWwgc3RyZWFtIGluZGV4CisgKiBAcGFyYW0gZGVzdF9hZGRyIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSBtZWRpYSBzdHJlYW0sIG1heSBiZSBOVUxMCisgKiBAcGFyYW0gZGVzdF90eXBlIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHR5cGUsIG1heSBiZSBOVUxMCisgKiBAcGFyYW0gcG9ydCB0aGUgZGVzdGluYXRpb24gcG9ydCBvZiB0aGUgbWVkaWEgc3RyZWFtLCAwIGlmIHVua25vd24KKyAqIEBwYXJhbSB0dGwgdGhlIHRpbWUgdG8gbGl2ZSBvZiB0aGUgc3RyZWFtLCAwIGlmIG5vdCBtdWx0aWNhc3QKKyAqIEBwYXJhbSBmbXQgdGhlIEFWRm9ybWF0Q29udGV4dCwgd2hpY2ggbWlnaHQgY29udGFpbiBvcHRpb25zIG1vZGlmeWluZworICogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIFNEUAorICovCit2b2lkIGZmX3NkcF93cml0ZV9tZWRpYShjaGFyICpidWZmLCBpbnQgc2l6ZSwgQVZTdHJlYW0gKnN0LCBpbnQgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVzdF9hZGRyLCBjb25zdCBjaGFyICpkZXN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwgaW50IHR0bCwgQVZGb3JtYXRDb250ZXh0ICpmbXQpOworCisvKioKKyAqIFdyaXRlIGEgcGFja2V0IHRvIGFub3RoZXIgbXV4ZXIgdGhhbiB0aGUgb25lIHRoZSB1c2VyIG9yaWdpbmFsbHkKKyAqIGludGVuZGVkLiBVc2VmdWwgd2hlbiBjaGFpbmluZyBtdXhlcnMsIHdoZXJlIG9uZSBtdXhlciBpbnRlcm5hbGx5CisgKiB3cml0ZXMgYSByZWNlaXZlZCBwYWNrZXQgdG8gYW5vdGhlciBtdXhlci4KKyAqCisgKiBAcGFyYW0gZHN0IHRoZSBtdXhlciB0byB3cml0ZSB0aGUgcGFja2V0IHRvCisgKiBAcGFyYW0gZHN0X3N0cmVhbSB0aGUgc3RyZWFtIGluZGV4IHdpdGhpbiBkc3QgdG8gd3JpdGUgdGhlIHBhY2tldCB0bworICogQHBhcmFtIHBrdCB0aGUgcGFja2V0IHRvIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSBzcmMgdGhlIG11eGVyIHRoZSBwYWNrZXQgb3JpZ2luYWxseSB3YXMgaW50ZW5kZWQgZm9yCisgKiBAcGFyYW0gaW50ZXJsZWF2ZSAwLT51c2UgYXZfd3JpdGVfZnJhbWUsIDEtPmF2X3dyaXRlX2ludGVybGVhdmVkX2ZyYW1lCisgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhdl93cml0ZV9mcmFtZSByZXR1cm5lZAorICovCitpbnQgZmZfd3JpdGVfY2hhaW5lZChBVkZvcm1hdENvbnRleHQgKmRzdCwgaW50IGRzdF9zdHJlYW0sIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKnNyYywgaW50IGludGVybGVhdmUpOworCisvKioKKyAqIEdldCB0aGUgbGVuZ3RoIGluIGJ5dGVzIHdoaWNoIGlzIG5lZWRlZCB0byBzdG9yZSB2YWwgYXMgdi4KKyAqLworaW50IGZmX2dldF92X2xlbmd0aCh1aW50NjRfdCB2YWwpOworCisvKioKKyAqIFB1dCB2YWwgdXNpbmcgYSB2YXJpYWJsZSBudW1iZXIgb2YgYnl0ZXMuCisgKi8KK3ZvaWQgZmZfcHV0X3YoQVZJT0NvbnRleHQgKmJjLCB1aW50NjRfdCB2YWwpOworCisvKioKKyAqIFJlYWQgYSB3aG9sZSBsaW5lIG9mIHRleHQgZnJvbSBBVklPQ29udGV4dC4gU3RvcCByZWFkaW5nIGFmdGVyIHJlYWNoaW5nCisgKiBlaXRoZXIgYSBcXG4sIGEgXFwwIG9yIEVPRi4gVGhlIHJldHVybmVkIHN0cmluZyBpcyBhbHdheXMgXFwwLXRlcm1pbmF0ZWQsCisgKiBhbmQgbWF5IGJlIHRydW5jYXRlZCBpZiB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAqCisgKiBAcGFyYW0gcyB0aGUgcmVhZC1vbmx5IEFWSU9Db250ZXh0CisgKiBAcGFyYW0gYnVmIGJ1ZmZlciB0byBzdG9yZSB0aGUgcmVhZCBsaW5lCisgKiBAcGFyYW0gbWF4bGVuIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgd3JpdHRlbiBpbiB0aGUgYnVmZmVyLCBub3QgaW5jbHVkaW5nIHRoZQorICogICAgICAgICBmaW5hbCBcXDAKKyAqLworaW50IGZmX2dldF9saW5lKEFWSU9Db250ZXh0ICpzLCBjaGFyICpidWYsIGludCBtYXhsZW4pOworCisjZGVmaW5lIFNQQUNFX0NIQVJTICIgXHRcclxuIgorCisvKioKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIHR5cGUgZm9yIGZmX3BhcnNlX2tleV92YWx1ZS4KKyAqCisgKiBAcGFyYW0ga2V5IGEgcG9pbnRlciB0byB0aGUga2V5CisgKiBAcGFyYW0ga2V5X2xlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYmVsb25nIHRvIHRoZSBrZXksIGluY2x1ZGluZyB0aGUgJz0nCisgKiAgICAgICAgICAgICAgICBjaGFyCisgKiBAcGFyYW0gZGVzdCByZXR1cm4gdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgZm9yIHRoZSB2YWx1ZSBpbiAqZGVzdCwgbWF5CisgKiAgICAgICAgICAgICBiZSBudWxsIHRvIGlnbm9yZSB0aGUgdmFsdWUKKyAqIEBwYXJhbSBkZXN0X2xlbiB0aGUgbGVuZ3RoIG9mIHRoZSAqZGVzdCBidWZmZXIKKyAqLwordHlwZWRlZiB2b2lkICgqZmZfcGFyc2Vfa2V5X3ZhbF9jYikodm9pZCAqY29udGV4dCwgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9sZW4sIGNoYXIgKipkZXN0LCBpbnQgKmRlc3RfbGVuKTsKKy8qKgorICogUGFyc2UgYSBzdHJpbmcgd2l0aCBjb21tYS1zZXBhcmF0ZWQga2V5PXZhbHVlIHBhaXJzLiBUaGUgdmFsdWUgc3RyaW5ncworICogbWF5IGJlIHF1b3RlZCBhbmQgbWF5IGNvbnRhaW4gZXNjYXBlZCBjaGFyYWN0ZXJzIHdpdGhpbiBxdW90ZWQgc3RyaW5ncy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gcGFyc2UKKyAqIEBwYXJhbSBjYWxsYmFja19nZXRfYnVmIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB3aGVyZSB0byBzdG9yZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlZCB2YWx1ZSBzdHJpbmcuCisgKiBAcGFyYW0gY29udGV4dCB0aGUgb3BhcXVlIGNvbnRleHQgcG9pbnRlciB0byBwYXNzIHRvIGNhbGxiYWNrX2dldF9idWYKKyAqLwordm9pZCBmZl9wYXJzZV9rZXlfdmFsdWUoY29uc3QgY2hhciAqc3RyLCBmZl9wYXJzZV9rZXlfdmFsX2NiIGNhbGxiYWNrX2dldF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb250ZXh0KTsKKworLyoqCisgKiBGaW5kIHN0cmVhbSBpbmRleCBiYXNlZCBvbiBmb3JtYXQtc3BlY2lmaWMgc3RyZWFtIElECisgKiBAcmV0dXJuIHN0cmVhbSBpbmRleCwgb3IgPCAwIG9uIGVycm9yCisgKi8KK2ludCBmZl9maW5kX3N0cmVhbV9pbmRleChBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZCk7CisKKy8qKgorICogSW50ZXJuYWwgdmVyc2lvbiBvZiBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wCisgKi8KK2ludCBmZl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKGNvbnN0IEFWSW5kZXhFbnRyeSAqZW50cmllcywgaW50IG5iX2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHdhbnRlZF90aW1lc3RhbXAsIGludCBmbGFncyk7CisKKy8qKgorICogSW50ZXJuYWwgdmVyc2lvbiBvZiBhdl9hZGRfaW5kZXhfZW50cnkKKyAqLworaW50IGZmX2FkZF9pbmRleF9lbnRyeShBVkluZGV4RW50cnkgKippbmRleF9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5iX2luZGV4X2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqaW5kZXhfZW50cmllc19hbGxvY2F0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3MsIGludDY0X3QgdGltZXN0YW1wLCBpbnQgc2l6ZSwgaW50IGRpc3RhbmNlLCBpbnQgZmxhZ3MpOworCisvKioKKyAqIEFkZCBhIG5ldyBjaGFwdGVyLgorICoKKyAqIEBwYXJhbSBzIG1lZGlhIGZpbGUgaGFuZGxlCisgKiBAcGFyYW0gaWQgdW5pcXVlIElEIGZvciB0aGlzIGNoYXB0ZXIKKyAqIEBwYXJhbSBzdGFydCBjaGFwdGVyIHN0YXJ0IHRpbWUgaW4gdGltZV9iYXNlIHVuaXRzCisgKiBAcGFyYW0gZW5kIGNoYXB0ZXIgZW5kIHRpbWUgaW4gdGltZV9iYXNlIHVuaXRzCisgKiBAcGFyYW0gdGl0bGUgY2hhcHRlciB0aXRsZQorICoKKyAqIEByZXR1cm4gQVZDaGFwdGVyIG9yIE5VTEwgb24gZXJyb3IKKyAqLworQVZDaGFwdGVyICphdnByaXZfbmV3X2NoYXB0ZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWQsIEFWUmF0aW9uYWwgdGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzdGFydCwgaW50NjRfdCBlbmQsIGNvbnN0IGNoYXIgKnRpdGxlKTsKKworLyoqCisgKiBFbnN1cmUgdGhlIGluZGV4IHVzZXMgbGVzcyBtZW1vcnkgdGhhbiB0aGUgbWF4aW11bSBzcGVjaWZpZWQgaW4KKyAqIEFWRm9ybWF0Q29udGV4dC5tYXhfaW5kZXhfc2l6ZSBieSBkaXNjYXJkaW5nIGVudHJpZXMgaWYgaXQgZ3Jvd3MKKyAqIHRvbyBsYXJnZS4KKyAqLwordm9pZCBmZl9yZWR1Y2VfaW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4KTsKKworZW51bSBBVkNvZGVjSUQgZmZfZ3Vlc3NfaW1hZ2UyX2NvZGVjKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworLyoqCisgKiBDb252ZXJ0IGEgZGF0ZSBzdHJpbmcgaW4gSVNPODYwMSBmb3JtYXQgdG8gVW5peCB0aW1lc3RhbXAuCisgKi8KK2ludDY0X3QgZmZfaXNvODYwMV90b191bml4X3RpbWUoY29uc3QgY2hhciAqZGF0ZXN0cik7CisKKy8qKgorICogUGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggdXNpbmcgYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcCgpIGFuZAorICogQVZJbnB1dEZvcm1hdC5yZWFkX3RpbWVzdGFtcCgpLgorICoKKyAqIEBwYXJhbSB0YXJnZXRfdHMgdGFyZ2V0IHRpbWVzdGFtcCBpbiB0aGUgdGltZSBiYXNlIG9mIHRoZSBnaXZlbiBzdHJlYW0KKyAqIEBwYXJhbSBzdHJlYW1faW5kZXggc3RyZWFtIG51bWJlcgorICovCitpbnQgZmZfc2Vla19mcmFtZV9iaW5hcnkoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0X3RzLCBpbnQgZmxhZ3MpOworCisvKioKKyAqIFVwZGF0ZSBjdXJfZHRzIG9mIGFsbCBzdHJlYW1zIGJhc2VkIG9uIHRoZSBnaXZlbiB0aW1lc3RhbXAgYW5kIEFWU3RyZWFtLgorICoKKyAqIFN0cmVhbSByZWZfc3QgdW5jaGFuZ2VkLCBvdGhlcnMgc2V0IGN1cl9kdHMgaW4gdGhlaXIgbmF0aXZlIHRpbWUgYmFzZS4KKyAqIE9ubHkgbmVlZGVkIGZvciB0aW1lc3RhbXAgd3JhcHBpbmcgb3IgaWYgKGR0cyBub3Qgc2V0IGFuZCBwdHMhPWR0cykuCisgKiBAcGFyYW0gdGltZXN0YW1wIG5ldyBkdHMgZXhwcmVzc2VkIGluIHRpbWVfYmFzZSBvZiBwYXJhbSByZWZfc3QKKyAqIEBwYXJhbSByZWZfc3QgcmVmZXJlbmNlIHN0cmVhbSBnaXZpbmcgdGltZV9iYXNlIG9mIHBhcmFtIHRpbWVzdGFtcAorICovCit2b2lkIGZmX3VwZGF0ZV9jdXJfZHRzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnJlZl9zdCwgaW50NjRfdCB0aW1lc3RhbXApOworCitpbnQgZmZfZmluZF9sYXN0X3RzKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCAqdHMsIGludDY0X3QgKnBvcywKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAoKnJlYWRfdGltZXN0YW1wKShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICosIGludCAsIGludDY0X3QgKiwgaW50NjRfdCApKTsKKworLyoqCisgKiBQZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCB1c2luZyByZWFkX3RpbWVzdGFtcCgpLgorICoKKyAqIEBwYXJhbSB0YXJnZXRfdHMgdGFyZ2V0IHRpbWVzdGFtcCBpbiB0aGUgdGltZSBiYXNlIG9mIHRoZSBnaXZlbiBzdHJlYW0KKyAqIEBwYXJhbSBzdHJlYW1faW5kZXggc3RyZWFtIG51bWJlcgorICovCitpbnQ2NF90IGZmX2dlbl9zZWFyY2goQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0X3RzLCBpbnQ2NF90IHBvc19taW4sCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NfbWF4LCBpbnQ2NF90IHBvc19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRzX21pbiwgaW50NjRfdCB0c19tYXgsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQ2NF90ICp0c19yZXQsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAoKnJlYWRfdGltZXN0YW1wKShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICosIGludCAsIGludDY0X3QgKiwgaW50NjRfdCApKTsKKworLyoqCisgKiBTZXQgdGhlIHRpbWUgYmFzZSBhbmQgd3JhcHBpbmcgaW5mbyBmb3IgYSBnaXZlbiBzdHJlYW0uIFRoaXMgd2lsbCBiZSB1c2VkCisgKiB0byBpbnRlcnByZXQgdGhlIHN0cmVhbSdzIHRpbWVzdGFtcHMuIElmIHRoZSBuZXcgdGltZSBiYXNlIGlzIGludmFsaWQKKyAqIChudW1lcmF0b3Igb3IgZGVub21pbmF0b3IgYXJlIG5vbi1wb3NpdGl2ZSksIGl0IGxlYXZlcyB0aGUgc3RyZWFtCisgKiB1bmNoYW5nZWQuCisgKgorICogQHBhcmFtIHMgc3RyZWFtCisgKiBAcGFyYW0gcHRzX3dyYXBfYml0cyBudW1iZXIgb2YgYml0cyBlZmZlY3RpdmVseSB1c2VkIGJ5IHRoZSBwdHMKKyAqICAgICAgICAodXNlZCBmb3Igd3JhcCBjb250cm9sKQorICogQHBhcmFtIHB0c19udW0gdGltZSBiYXNlIG51bWVyYXRvcgorICogQHBhcmFtIHB0c19kZW4gdGltZSBiYXNlIGRlbm9taW5hdG9yCisgKi8KK3ZvaWQgYXZwcml2X3NldF9wdHNfaW5mbyhBVlN0cmVhbSAqcywgaW50IHB0c193cmFwX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHB0c19udW0sIHVuc2lnbmVkIGludCBwdHNfZGVuKTsKKworLyoqCisgKiBBZGQgc2lkZSBkYXRhIHRvIGEgcGFja2V0IGZvciBjaGFuZ2luZyBwYXJhbWV0ZXJzIHRvIHRoZSBnaXZlbiB2YWx1ZXMuCisgKiBQYXJhbWV0ZXJzIHNldCB0byAwIGFyZW4ndCBpbmNsdWRlZCBpbiB0aGUgY2hhbmdlLgorICovCitpbnQgZmZfYWRkX3BhcmFtX2NoYW5nZShBVlBhY2tldCAqcGt0LCBpbnQzMl90IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY2hhbm5lbF9sYXlvdXQsIGludDMyX3Qgc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKy8qKgorICogU2V0IHRoZSB0aW1lYmFzZSBmb3IgZWFjaCBzdHJlYW0gZnJvbSB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyB0aW1lYmFzZSBhbmQKKyAqIHByaW50IGl0LgorICovCitpbnQgZmZfZnJhbWVoYXNoX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpOworCisvKioKKyAqIFJlYWQgYSB0cmFuc3BvcnQgcGFja2V0IGZyb20gYSBtZWRpYSBmaWxlLgorICoKKyAqIEBwYXJhbSBzIG1lZGlhIGZpbGUgaGFuZGxlCisgKiBAcGFyYW0gcGt0IGlzIGZpbGxlZAorICogQHJldHVybiAwIGlmIE9LLCBBVkVSUk9SX3h4eCBvbiBlcnJvcgorICovCitpbnQgZmZfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KTsKKworLyoqCisgKiBJbnRlcmxlYXZlIGEgcGFja2V0IHBlciBkdHMgaW4gYW4gb3V0cHV0IG1lZGlhIGZpbGUuCisgKgorICogUGFja2V0cyB3aXRoIHBrdC0+ZGVzdHJ1Y3QgPT0gYXZfZGVzdHJ1Y3RfcGFja2V0IHdpbGwgYmUgZnJlZWQgaW5zaWRlIHRoaXMKKyAqIGZ1bmN0aW9uLCBzbyB0aGV5IGNhbm5vdCBiZSB1c2VkIGFmdGVyIGl0LiBOb3RlIHRoYXQgY2FsbGluZyBhdl9mcmVlX3BhY2tldCgpCisgKiBvbiB0aGVtIGlzIHN0aWxsIHNhZmUuCisgKgorICogQHBhcmFtIHMgbWVkaWEgZmlsZSBoYW5kbGUKKyAqIEBwYXJhbSBvdXQgdGhlIGludGVybGVhdmVkIHBhY2tldCB3aWxsIGJlIG91dHB1dCBoZXJlCisgKiBAcGFyYW0gcGt0IHRoZSBpbnB1dCBwYWNrZXQKKyAqIEBwYXJhbSBmbHVzaCAxIGlmIG5vIGZ1cnRoZXIgcGFja2V0cyBhcmUgYXZhaWxhYmxlIGFzIGlucHV0IGFuZCBhbGwKKyAqICAgICAgICAgICAgICByZW1haW5pbmcgcGFja2V0cyBzaG91bGQgYmUgb3V0cHV0CisgKiBAcmV0dXJuIDEgaWYgYSBwYWNrZXQgd2FzIG91dHB1dCwgMCBpZiBubyBwYWNrZXQgY291bGQgYmUgb3V0cHV0LAorICogICAgICAgICA8IDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworaW50IGZmX2ludGVybGVhdmVfcGFja2V0X3Blcl9kdHMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCwgaW50IGZsdXNoKTsKKwordm9pZCBmZl9mcmVlX3N0cmVhbShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBmcmFtZSBkdXJhdGlvbiBpbiBzZWNvbmRzLiBSZXR1cm4gMCBpZiBub3QgYXZhaWxhYmxlLgorICovCit2b2lkIGZmX2NvbXB1dGVfZnJhbWVfZHVyYXRpb24oQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgKnBudW0sIGludCAqcGRlbiwgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNQYXJzZXJDb250ZXh0ICpwYywgQVZQYWNrZXQgKnBrdCk7CisKK3Vuc2lnbmVkIGludCBmZl9jb2RlY19nZXRfdGFnKGNvbnN0IEFWQ29kZWNUYWcgKnRhZ3MsIGVudW0gQVZDb2RlY0lEIGlkKTsKKworZW51bSBBVkNvZGVjSUQgZmZfY29kZWNfZ2V0X2lkKGNvbnN0IEFWQ29kZWNUYWcgKnRhZ3MsIHVuc2lnbmVkIGludCB0YWcpOworCisvKioKKyAqIFNlbGVjdCBhIFBDTSBjb2RlYyBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gYnBzICAgICBiaXRzLXBlci1zYW1wbGUKKyAqIEBwYXJhbSBmbHQgICAgIGZsb2F0aW5nLXBvaW50CisgKiBAcGFyYW0gYmUgICAgICBiaWctZW5kaWFuCisgKiBAcGFyYW0gc2ZsYWdzICBzaWduZWQgZmxhZ3MuIGVhY2ggYml0IGNvcnJlc3BvbmRzIHRvIG9uZSBieXRlIG9mIGJpdCBkZXB0aC4KKyAqICAgICAgICAgICAgICAgIGUuZy4gdGhlIDFzdCBiaXQgaW5kaWNhdGVzIGlmIDgtYml0IHNob3VsZCBiZSBzaWduZWQgb3IKKyAqICAgICAgICAgICAgICAgIHVuc2lnbmVkLCB0aGUgMm5kIGJpdCBpbmRpY2F0ZXMgaWYgMTYtYml0IHNob3VsZCBiZSBzaWduZWQgb3IKKyAqICAgICAgICAgICAgICAgIHVuc2lnbmVkLCBldGMuLi4gVGhpcyBpcyB1c2VmdWwgZm9yIGZvcm1hdHMgc3VjaCBhcyBXQVZFIHdoZXJlCisgKiAgICAgICAgICAgICAgICBvbmx5IDgtYml0IGlzIHVuc2lnbmVkIGFuZCBhbGwgb3RoZXIgYml0IGRlcHRocyBhcmUgc2lnbmVkLgorICogQHJldHVybiAgICAgICAgYSBQQ00gY29kZWMgaWQgb3IgQVZfQ09ERUNfSURfTk9ORQorICovCitlbnVtIEFWQ29kZWNJRCBmZl9nZXRfcGNtX2NvZGVjX2lkKGludCBicHMsIGludCBmbHQsIGludCBiZSwgaW50IHNmbGFncyk7CisKKy8qKgorICogQ2hvb3NlcyBhIHRpbWViYXNlIGZvciBtdXhpbmcgdGhlIHNwZWNpZmllZCBzdHJlYW0uCisgKgorICogVGhlIGNob3NlbiB0aW1lYmFzZSBhbGxvd3Mgc2FtcGxlIGFjY3VyYXRlIHRpbWVzdGFtcHMgYmFzZWQKKyAqIG9uIHRoZSBmcmFtZXJhdGUgb3Igc2FtcGxlIHJhdGUgZm9yIGF1ZGlvIHN0cmVhbXMuIEl0IGFsc28gaXMKKyAqIGF0IGxlYXN0IGFzIHByZWNpc2UgYXMgMS9taW5fcHJlY2lzaW9uIHdvdWxkIGJlLgorICovCitBVlJhdGlvbmFsIGZmX2Nob29zZV90aW1lYmFzZShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgaW50IG1pbl9wcmVjaXNpb24pOworCisvKioKKyAqIEdlbmVyYXRlIHN0YW5kYXJkIGV4dHJhZGF0YSBmb3IgQVZDLUludHJhIGJhc2VkIG9uIHdpZHRoL2hlaWdodCBhbmQgZmllbGQKKyAqIG9yZGVyLgorICovCitpbnQgZmZfZ2VuZXJhdGVfYXZjaV9leHRyYWRhdGEoQVZTdHJlYW0gKnN0KTsKKworLyoqCisgKiBXcmFwIGVycm5vIG9uIHJlbmFtZSgpIGVycm9yLgorICoKKyAqIEBwYXJhbSBvbGRwYXRoIHNvdXJjZSBwYXRoCisgKiBAcGFyYW0gbmV3cGF0aCBkZXN0aW5hdGlvbiBwYXRoCisgKiBAcmV0dXJuICAgICAgICAwIG9yIEFWRVJST1Igb24gZmFpbHVyZQorICovCitzdGF0aWMgaW5saW5lIGludCBmZl9yZW5hbWUoY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCwgdm9pZCAqbG9nY3R4KQoreworICAgIGludCByZXQgPSAwOworICAgIGlmIChyZW5hbWUob2xkcGF0aCwgbmV3cGF0aCkgPT0gLTEpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGlmIChsb2djdHgpCisgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJmYWlsZWQgdG8gcmVuYW1lIGZpbGUgJXMgdG8gJXNcbiIsIG9sZHBhdGgsIG5ld3BhdGgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEFsbG9jYXRlIGV4dHJhZGF0YSB3aXRoIGFkZGl0aW9uYWwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSBhdCBlbmQKKyAqIHdoaWNoIGlzIGFsd2F5cyBzZXQgdG8gMC4KKyAqCisgKiBAcGFyYW0gc2l6ZSBzaXplIG9mIGV4dHJhZGF0YQorICogQHJldHVybiAwIGlmIE9LLCBBVkVSUk9SX3h4eCBvbiBlcnJvcgorICovCitpbnQgZmZfYWxsb2NfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IHNpemUpOworCisvKioKKyAqIEFsbG9jYXRlIGV4dHJhZGF0YSB3aXRoIGFkZGl0aW9uYWwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSBhdCBlbmQKKyAqIHdoaWNoIGlzIGFsd2F5cyBzZXQgdG8gMCBhbmQgZmlsbCBpdCBmcm9tIHBiLgorICoKKyAqIEBwYXJhbSBzaXplIHNpemUgb2YgZXh0cmFkYXRhCisgKiBAcmV0dXJuID49IDAgaWYgT0ssIEFWRVJST1JfeHh4IG9uIGVycm9yCisgKi8KK2ludCBmZl9nZXRfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZJT0NvbnRleHQgKnBiLCBpbnQgc2l6ZSk7CisKKy8qKgorICogYWRkIGZyYW1lIGZvciByZnBzIGNhbGN1bGF0aW9uLgorICoKKyAqIEBwYXJhbSBkdHMgdGltZXN0YW1wIG9mIHRoZSBpLXRoIGZyYW1lCisgKiBAcmV0dXJuIDAgaWYgT0ssIEFWRVJST1JfeHh4IG9uIGVycm9yCisgKi8KK2ludCBmZl9yZnBzX2FkZF9mcmFtZShBVkZvcm1hdENvbnRleHQgKmljLCBBVlN0cmVhbSAqc3QsIGludDY0X3QgZHRzKTsKKwordm9pZCBmZl9yZnBzX2NhbGN1bGF0ZShBVkZvcm1hdENvbnRleHQgKmljKTsKKworLyoqCisgKiBGbGFncyBmb3IgQVZGb3JtYXRDb250ZXh0LndyaXRlX3VuY29kZWRfZnJhbWUoKQorICovCitlbnVtIEFWV3JpdGVVbmNvZGVkRnJhbWVGbGFncyB7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSB3aGV0aGVyIHRoZSBmZWF0dXJlIGlzIHBvc3NpYmxlIG9uIHRoaXMgc3RyZWFtLgorICAgICAqIFRoZSBmcmFtZSBhcmd1bWVudCBpcyBpZ25vcmVkLgorICAgICAqLworICAgIEFWX1dSSVRFX1VOQ09ERURfRlJBTUVfUVVFUlkgICAgICAgICAgID0gMHgwMDAxLAorCit9OworCisvKioKKyAqIENvcGllcyB0aGUgd2hpbGVsaXN0cyBmcm9tIG9uZSBjb250ZXh0IHRvIHRoZSBvdGhlcgorICovCitpbnQgZmZfY29weV93aGl0ZWxpc3RzKEFWRm9ybWF0Q29udGV4dCAqZHN0LCBBVkZvcm1hdENvbnRleHQgKnNyYyk7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaXBtb3ZpZS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lwbW92aWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWU3MGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lwbW92aWUuYwpAQCAtMCwwICsxLDY1OSBAQAorLyoKKyAqIEludGVycGxheSBNVkUgRmlsZSBEZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEludGVycGxheSBNVkUgZmlsZSBkZW11eGVyCisgKiBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBJbnRlcnBsYXkgTVZFIGZpbGUgZm9ybWF0LCB2aXNpdDoKKyAqICAgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvCisgKiBUaGUgYWZvcmVtZW50aW9uZWQgc2l0ZSBhbHNvIGNvbnRhaW5zIGEgY29tbWFuZCBsaW5lIHV0aWxpdHkgZm9yIHBhcnNpbmcKKyAqIElQIE1WRSBmaWxlcyBzbyB0aGF0IHlvdSBjYW4gZ2V0IGEgZ29vZCBpZGVhIG9mIHRoZSB0eXBpY2FsIHN0cnVjdHVyZSBvZgorICogc3VjaCBmaWxlcy4gVGhpcyBkZW11eGVyIGlzIG5vdCB0aGUgYmVzdCBleGFtcGxlIHRvIHVzZSBpZiB5b3UgYXJlIHRyeWluZworICogdG8gd3JpdGUgeW91ciBvd24gYXMgaXQgdXNlcyBhIHJhdGhlciByb3VuZGFib3V0IGFwcHJvYWNoIGZvciBzcGxpdHRpbmcKKyAqIHVwIGFuZCBzZW5kaW5nIG91dCB0aGUgY2h1bmtzLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIENIVU5LX1BSRUFNQkxFX1NJWkUgNAorI2RlZmluZSBPUENPREVfUFJFQU1CTEVfU0laRSA0CisKKyNkZWZpbmUgQ0hVTktfSU5JVF9BVURJTyAgIDB4MDAwMAorI2RlZmluZSBDSFVOS19BVURJT19PTkxZICAgMHgwMDAxCisjZGVmaW5lIENIVU5LX0lOSVRfVklERU8gICAweDAwMDIKKyNkZWZpbmUgQ0hVTktfVklERU8gICAgICAgIDB4MDAwMworI2RlZmluZSBDSFVOS19TSFVURE9XTiAgICAgMHgwMDA0CisjZGVmaW5lIENIVU5LX0VORCAgICAgICAgICAweDAwMDUKKy8qIHRoZXNlIGxhc3QgdHlwZXMgYXJlIHVzZWQgaW50ZXJuYWxseSAqLworI2RlZmluZSBDSFVOS19ET05FICAgICAgICAgMHhGRkZDCisjZGVmaW5lIENIVU5LX05PTUVNICAgICAgICAweEZGRkQKKyNkZWZpbmUgQ0hVTktfRU9GICAgICAgICAgIDB4RkZGRQorI2RlZmluZSBDSFVOS19CQUQgICAgICAgICAgMHhGRkZGCisKKyNkZWZpbmUgT1BDT0RFX0VORF9PRl9TVFJFQU0gICAgICAgICAgIDB4MDAKKyNkZWZpbmUgT1BDT0RFX0VORF9PRl9DSFVOSyAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgT1BDT0RFX0NSRUFURV9USU1FUiAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgT1BDT0RFX0lOSVRfQVVESU9fQlVGRkVSUyAgICAgIDB4MDMKKyNkZWZpbmUgT1BDT0RFX1NUQVJUX1NUT1BfQVVESU8gICAgICAgIDB4MDQKKyNkZWZpbmUgT1BDT0RFX0lOSVRfVklERU9fQlVGRkVSUyAgICAgIDB4MDUKKyNkZWZpbmUgT1BDT0RFX1VOS05PV05fMDYgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgT1BDT0RFX1NFTkRfQlVGRkVSICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgT1BDT0RFX0FVRElPX0ZSQU1FICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgT1BDT0RFX1NJTEVOQ0VfRlJBTUUgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgT1BDT0RFX0lOSVRfVklERU9fTU9ERSAgICAgICAgIDB4MEEKKyNkZWZpbmUgT1BDT0RFX0NSRUFURV9HUkFESUVOVCAgICAgICAgIDB4MEIKKyNkZWZpbmUgT1BDT0RFX1NFVF9QQUxFVFRFICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgT1BDT0RFX1NFVF9QQUxFVFRFX0NPTVBSRVNTRUQgIDB4MEQKKyNkZWZpbmUgT1BDT0RFX1VOS05PV05fMEUgICAgICAgICAgICAgIDB4MEUKKyNkZWZpbmUgT1BDT0RFX1NFVF9ERUNPRElOR19NQVAgICAgICAgIDB4MEYKKyNkZWZpbmUgT1BDT0RFX1VOS05PV05fMTAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgT1BDT0RFX1ZJREVPX0RBVEEgICAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgT1BDT0RFX1VOS05PV05fMTIgICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgT1BDT0RFX1VOS05PV05fMTMgICAgICAgICAgICAgIDB4MTMKKyNkZWZpbmUgT1BDT0RFX1VOS05PV05fMTQgICAgICAgICAgICAgIDB4MTQKKyNkZWZpbmUgT1BDT0RFX1VOS05PV05fMTUgICAgICAgICAgICAgIDB4MTUKKworI2RlZmluZSBQQUxFVFRFX0NPVU5UIDI1NgorCit0eXBlZGVmIHN0cnVjdCBJUE1WRUNvbnRleHQgeworCisgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgIGludCBidWZfc2l6ZTsKKworICAgIHVpbnQ2NF90IGZyYW1lX3B0c19pbmM7CisKKyAgICB1bnNpZ25lZCBpbnQgdmlkZW9fYnBwOworICAgIHVuc2lnbmVkIGludCB2aWRlb193aWR0aDsKKyAgICB1bnNpZ25lZCBpbnQgdmlkZW9faGVpZ2h0OworICAgIGludDY0X3QgdmlkZW9fcHRzOworICAgIHVpbnQzMl90ICAgICBwYWxldHRlWzI1Nl07CisgICAgaW50ICAgICAgICAgIGhhc19wYWxldHRlOworICAgIGludCAgICAgICAgICBjaGFuZ2VkOworCisgICAgdW5zaWduZWQgaW50IGF1ZGlvX2JpdHM7CisgICAgdW5zaWduZWQgaW50IGF1ZGlvX2NoYW5uZWxzOworICAgIHVuc2lnbmVkIGludCBhdWRpb19zYW1wbGVfcmF0ZTsKKyAgICBlbnVtIEFWQ29kZWNJRCBhdWRpb190eXBlOworICAgIHVuc2lnbmVkIGludCBhdWRpb19mcmFtZV9jb3VudDsKKworICAgIGludCB2aWRlb19zdHJlYW1faW5kZXg7CisgICAgaW50IGF1ZGlvX3N0cmVhbV9pbmRleDsKKworICAgIGludDY0X3QgYXVkaW9fY2h1bmtfb2Zmc2V0OworICAgIGludCBhdWRpb19jaHVua19zaXplOworICAgIGludDY0X3QgdmlkZW9fY2h1bmtfb2Zmc2V0OworICAgIGludCB2aWRlb19jaHVua19zaXplOworICAgIGludDY0X3QgZGVjb2RlX21hcF9jaHVua19vZmZzZXQ7CisgICAgaW50IGRlY29kZV9tYXBfY2h1bmtfc2l6ZTsKKworICAgIGludDY0X3QgbmV4dF9jaHVua19vZmZzZXQ7CisKK30gSVBNVkVDb250ZXh0OworCitzdGF0aWMgaW50IGxvYWRfaXBtb3ZpZV9wYWNrZXQoSVBNVkVDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsCisgICAgQVZQYWNrZXQgKnBrdCkgeworCisgICAgaW50IGNodW5rX3R5cGU7CisKKyAgICBpZiAocy0+YXVkaW9fY2h1bmtfb2Zmc2V0ICYmIHMtPmF1ZGlvX2NoYW5uZWxzICYmIHMtPmF1ZGlvX2JpdHMpIHsKKyAgICAgICAgaWYgKHMtPmF1ZGlvX3R5cGUgPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbiBub3QgcmVhZCBhdWRpbyBwYWNrZXQgYmVmb3JlIgorICAgICAgICAgICAgICAgICAgICJhdWRpbyBjb2RlYyBpcyBrbm93blxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIENIVU5LX0JBRDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFkanVzdCBmb3IgUENNIGF1ZGlvIGJ5IHNraXBwaW5nIGNodW5rIGhlYWRlciAqLworICAgICAgICBpZiAocy0+YXVkaW9fdHlwZSAhPSBBVl9DT0RFQ19JRF9JTlRFUlBMQVlfRFBDTSkgeworICAgICAgICAgICAgcy0+YXVkaW9fY2h1bmtfb2Zmc2V0ICs9IDY7CisgICAgICAgICAgICBzLT5hdWRpb19jaHVua19zaXplIC09IDY7CisgICAgICAgIH0KKworICAgICAgICBhdmlvX3NlZWsocGIsIHMtPmF1ZGlvX2NodW5rX29mZnNldCwgU0VFS19TRVQpOworICAgICAgICBzLT5hdWRpb19jaHVua19vZmZzZXQgPSAwOworCisgICAgICAgIGlmIChzLT5hdWRpb19jaHVua19zaXplICE9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgcy0+YXVkaW9fY2h1bmtfc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gQ0hVTktfRU9GOworCisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gcy0+YXVkaW9fc3RyZWFtX2luZGV4OworICAgICAgICBwa3QtPnB0cyA9IHMtPmF1ZGlvX2ZyYW1lX2NvdW50OworCisgICAgICAgIC8qIGF1ZGlvIGZyYW1lIG1haW50ZW5hbmNlICovCisgICAgICAgIGlmIChzLT5hdWRpb190eXBlICE9IEFWX0NPREVDX0lEX0lOVEVSUExBWV9EUENNKQorICAgICAgICAgICAgcy0+YXVkaW9fZnJhbWVfY291bnQgKz0KKyAgICAgICAgICAgIChzLT5hdWRpb19jaHVua19zaXplIC8gcy0+YXVkaW9fY2hhbm5lbHMgLyAocy0+YXVkaW9fYml0cyAvIDgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+YXVkaW9fZnJhbWVfY291bnQgKz0KKyAgICAgICAgICAgICAgICAocy0+YXVkaW9fY2h1bmtfc2l6ZSAtIDYgLSBzLT5hdWRpb19jaGFubmVscykgLyBzLT5hdWRpb19jaGFubmVsczsKKworICAgICAgICBhdl9kbG9nKE5VTEwsICJzZW5kaW5nIGF1ZGlvIGZyYW1lIHdpdGggcHRzICUiUFJJZDY0IiAoJWQgYXVkaW8gZnJhbWVzKVxuIiwKKyAgICAgICAgICAgICAgICBwa3QtPnB0cywgcy0+YXVkaW9fZnJhbWVfY291bnQpOworCisgICAgICAgIGNodW5rX3R5cGUgPSBDSFVOS19WSURFTzsKKworICAgIH0gZWxzZSBpZiAocy0+ZGVjb2RlX21hcF9jaHVua19vZmZzZXQpIHsKKworICAgICAgICAvKiBzZW5kIGJvdGggdGhlIGRlY29kZSBtYXAgYW5kIHRoZSB2aWRlbyBkYXRhIHRvZ2V0aGVyICovCisKKyAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBzLT5kZWNvZGVfbWFwX2NodW5rX3NpemUgKyBzLT52aWRlb19jaHVua19zaXplKSkKKyAgICAgICAgICAgIHJldHVybiBDSFVOS19OT01FTTsKKworICAgICAgICBpZiAocy0+aGFzX3BhbGV0dGUpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnBhbDsKKworICAgICAgICAgICAgcGFsID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQQUxFVFRFX1NJWkUpOworICAgICAgICAgICAgaWYgKHBhbCkgeworICAgICAgICAgICAgICAgIG1lbWNweShwYWwsIHMtPnBhbGV0dGUsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgICAgICBzLT5oYXNfcGFsZXR0ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+Y2hhbmdlZCkgeworICAgICAgICAgICAgZmZfYWRkX3BhcmFtX2NoYW5nZShwa3QsIDAsIDAsIDAsIHMtPnZpZGVvX3dpZHRoLCBzLT52aWRlb19oZWlnaHQpOworICAgICAgICAgICAgcy0+Y2hhbmdlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcGt0LT5wb3M9IHMtPmRlY29kZV9tYXBfY2h1bmtfb2Zmc2V0OworICAgICAgICBhdmlvX3NlZWsocGIsIHMtPmRlY29kZV9tYXBfY2h1bmtfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIHMtPmRlY29kZV9tYXBfY2h1bmtfb2Zmc2V0ID0gMDsKKworICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBwa3QtPmRhdGEsIHMtPmRlY29kZV9tYXBfY2h1bmtfc2l6ZSkgIT0KKyAgICAgICAgICAgIHMtPmRlY29kZV9tYXBfY2h1bmtfc2l6ZSkgeworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgIHJldHVybiBDSFVOS19FT0Y7CisgICAgICAgIH0KKworICAgICAgICBhdmlvX3NlZWsocGIsIHMtPnZpZGVvX2NodW5rX29mZnNldCwgU0VFS19TRVQpOworICAgICAgICBzLT52aWRlb19jaHVua19vZmZzZXQgPSAwOworCisgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIHBrdC0+ZGF0YSArIHMtPmRlY29kZV9tYXBfY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgIHMtPnZpZGVvX2NodW5rX3NpemUpICE9IHMtPnZpZGVvX2NodW5rX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICByZXR1cm4gQ0hVTktfRU9GOworICAgICAgICB9CisKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzLT52aWRlb19zdHJlYW1faW5kZXg7CisgICAgICAgIHBrdC0+cHRzID0gcy0+dmlkZW9fcHRzOworCisgICAgICAgIGF2X2Rsb2coTlVMTCwgInNlbmRpbmcgdmlkZW8gZnJhbWUgd2l0aCBwdHMgJSJQUklkNjQiXG4iLCBwa3QtPnB0cyk7CisKKyAgICAgICAgcy0+dmlkZW9fcHRzICs9IHMtPmZyYW1lX3B0c19pbmM7CisKKyAgICAgICAgY2h1bmtfdHlwZSA9IENIVU5LX1ZJREVPOworCisgICAgfSBlbHNlIHsKKworICAgICAgICBhdmlvX3NlZWsocGIsIHMtPm5leHRfY2h1bmtfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIGNodW5rX3R5cGUgPSBDSFVOS19ET05FOworCisgICAgfQorCisgICAgcmV0dXJuIGNodW5rX3R5cGU7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gbG9hZHMgYW5kIHByb2Nlc3NlcyBhIHNpbmdsZSBjaHVuayBpbiBhbiBJUCBtb3ZpZSBmaWxlLgorICogSXQgcmV0dXJucyB0aGUgdHlwZSBvZiBjaHVuayB0aGF0IHdhcyBwcm9jZXNzZWQuICovCitzdGF0aWMgaW50IHByb2Nlc3NfaXBtb3ZpZV9jaHVuayhJUE1WRUNvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICBBVlBhY2tldCAqcGt0KQoreworICAgIHVuc2lnbmVkIGNoYXIgY2h1bmtfcHJlYW1ibGVbQ0hVTktfUFJFQU1CTEVfU0laRV07CisgICAgaW50IGNodW5rX3R5cGU7CisgICAgaW50IGNodW5rX3NpemU7CisgICAgdW5zaWduZWQgY2hhciBvcGNvZGVfcHJlYW1ibGVbT1BDT0RFX1BSRUFNQkxFX1NJWkVdOworICAgIHVuc2lnbmVkIGNoYXIgb3Bjb2RlX3R5cGU7CisgICAgdW5zaWduZWQgY2hhciBvcGNvZGVfdmVyc2lvbjsKKyAgICBpbnQgb3Bjb2RlX3NpemU7CisgICAgdW5zaWduZWQgY2hhciBzY3JhdGNoWzEwMjRdOworICAgIGludCBpLCBqOworICAgIGludCBmaXJzdF9jb2xvciwgbGFzdF9jb2xvcjsKKyAgICBpbnQgYXVkaW9fZmxhZ3M7CisgICAgdW5zaWduZWQgY2hhciByLCBnLCBiOworICAgIHVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworCisgICAgLyogc2VlIGlmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyBwYWNrZXRzICovCisgICAgY2h1bmtfdHlwZSA9IGxvYWRfaXBtb3ZpZV9wYWNrZXQocywgcGIsIHBrdCk7CisgICAgaWYgKGNodW5rX3R5cGUgIT0gQ0hVTktfRE9ORSkKKyAgICAgICAgcmV0dXJuIGNodW5rX3R5cGU7CisKKyAgICAvKiByZWFkIHRoZSBuZXh0IGNodW5rLCB3aGVyZXZlciB0aGUgZmlsZSBoYXBwZW5zIHRvIGJlIHBvaW50aW5nICovCisgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgIHJldHVybiBDSFVOS19FT0Y7CisgICAgaWYgKGF2aW9fcmVhZChwYiwgY2h1bmtfcHJlYW1ibGUsIENIVU5LX1BSRUFNQkxFX1NJWkUpICE9CisgICAgICAgIENIVU5LX1BSRUFNQkxFX1NJWkUpCisgICAgICAgIHJldHVybiBDSFVOS19CQUQ7CisgICAgY2h1bmtfc2l6ZSA9IEFWX1JMMTYoJmNodW5rX3ByZWFtYmxlWzBdKTsKKyAgICBjaHVua190eXBlID0gQVZfUkwxNigmY2h1bmtfcHJlYW1ibGVbMl0pOworCisgICAgYXZfZGxvZyhOVUxMLCAiY2h1bmsgdHlwZSAweCUwNFgsIDB4JTA0WCBieXRlczogIiwgY2h1bmtfdHlwZSwgY2h1bmtfc2l6ZSk7CisKKyAgICBzd2l0Y2ggKGNodW5rX3R5cGUpIHsKKworICAgIGNhc2UgQ0hVTktfSU5JVF9BVURJTzoKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiaW5pdGlhbGl6ZSBhdWRpb1xuIik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDSFVOS19BVURJT19PTkxZOgorICAgICAgICBhdl9kbG9nKE5VTEwsICJhdWRpbyBvbmx5XG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENIVU5LX0lOSVRfVklERU86CisgICAgICAgIGF2X2Rsb2coTlVMTCwgImluaXRpYWxpemUgdmlkZW9cbiIpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ0hVTktfVklERU86CisgICAgICAgIGF2X2Rsb2coTlVMTCwgInZpZGVvIChhbmQgYXVkaW8pXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENIVU5LX1NIVVRET1dOOgorICAgICAgICBhdl9kbG9nKE5VTEwsICJzaHV0ZG93blxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDSFVOS19FTkQ6CisgICAgICAgIGF2X2Rsb2coTlVMTCwgImVuZFxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiaW52YWxpZCBjaHVua1xuIik7CisgICAgICAgIGNodW5rX3R5cGUgPSBDSFVOS19CQUQ7CisgICAgICAgIGJyZWFrOworCisgICAgfQorCisgICAgd2hpbGUgKChjaHVua19zaXplID4gMCkgJiYgKGNodW5rX3R5cGUgIT0gQ0hVTktfQkFEKSkgeworCisgICAgICAgIC8qIHJlYWQgdGhlIG5leHQgY2h1bmssIHdoZXJldmVyIHRoZSBmaWxlIGhhcHBlbnMgdG8gYmUgcG9pbnRpbmcgKi8KKyAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgICAgIGNodW5rX3R5cGUgPSBDSFVOS19FT0Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBvcGNvZGVfcHJlYW1ibGUsIENIVU5LX1BSRUFNQkxFX1NJWkUpICE9CisgICAgICAgICAgICBDSFVOS19QUkVBTUJMRV9TSVpFKSB7CisgICAgICAgICAgICBjaHVua190eXBlID0gQ0hVTktfQkFEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvcGNvZGVfc2l6ZSA9IEFWX1JMMTYoJm9wY29kZV9wcmVhbWJsZVswXSk7CisgICAgICAgIG9wY29kZV90eXBlID0gb3Bjb2RlX3ByZWFtYmxlWzJdOworICAgICAgICBvcGNvZGVfdmVyc2lvbiA9IG9wY29kZV9wcmVhbWJsZVszXTsKKworICAgICAgICBjaHVua19zaXplIC09IE9QQ09ERV9QUkVBTUJMRV9TSVpFOworICAgICAgICBjaHVua19zaXplIC09IG9wY29kZV9zaXplOworICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgImNodW5rX3NpemUgY291bnRkb3duIGp1c3Qgd2VudCBuZWdhdGl2ZVxuIik7CisgICAgICAgICAgICBjaHVua190eXBlID0gQ0hVTktfQkFEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhdl9kbG9nKE5VTEwsICIgIG9wY29kZSB0eXBlICUwMlgsIHZlcnNpb24gJWQsIDB4JTA0WCBieXRlczogIiwKKyAgICAgICAgICAgICAgICBvcGNvZGVfdHlwZSwgb3Bjb2RlX3ZlcnNpb24sIG9wY29kZV9zaXplKTsKKyAgICAgICAgc3dpdGNoIChvcGNvZGVfdHlwZSkgeworCisgICAgICAgIGNhc2UgT1BDT0RFX0VORF9PRl9TVFJFQU06CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJlbmQgb2Ygc3RyZWFtXG4iKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgb3Bjb2RlX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPUENPREVfRU5EX09GX0NIVU5LOgorICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiZW5kIG9mIGNodW5rXG4iKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgb3Bjb2RlX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPUENPREVfQ1JFQVRFX1RJTUVSOgorICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiY3JlYXRlIHRpbWVyXG4iKTsKKyAgICAgICAgICAgIGlmICgob3Bjb2RlX3ZlcnNpb24gPiAwKSB8fCAob3Bjb2RlX3NpemUgIT0gNikpIHsKKyAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJiYWQgY3JlYXRlX3RpbWVyIG9wY29kZVxuIik7CisgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSA9IENIVU5LX0JBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIHNjcmF0Y2gsIG9wY29kZV9zaXplKSAhPQorICAgICAgICAgICAgICAgIG9wY29kZV9zaXplKSB7CisgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSA9IENIVU5LX0JBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmZyYW1lX3B0c19pbmMgPSAoKHVpbnQ2NF90KUFWX1JMMzIoJnNjcmF0Y2hbMF0pKSAqIEFWX1JMMTYoJnNjcmF0Y2hbNF0pOworICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiICAlLjJmIGZyYW1lcy9zZWNvbmQgKHRpbWVyIGRpdiA9ICVkLCBzdWJkaXYgPSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAuMCAvIHMtPmZyYW1lX3B0c19pbmMsIEFWX1JMMzIoJnNjcmF0Y2hbMF0pLAorICAgICAgICAgICAgICAgICAgICBBVl9STDE2KCZzY3JhdGNoWzRdKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE9QQ09ERV9JTklUX0FVRElPX0JVRkZFUlM6CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJpbml0aWFsaXplIGF1ZGlvIGJ1ZmZlcnNcbiIpOworICAgICAgICAgICAgaWYgKG9wY29kZV92ZXJzaW9uID4gMSB8fCBvcGNvZGVfc2l6ZSA+IDEwIHx8IG9wY29kZV9zaXplIDwgNikgeworICAgICAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgImJhZCBpbml0X2F1ZGlvX2J1ZmZlcnMgb3Bjb2RlXG4iKTsKKyAgICAgICAgICAgICAgICBjaHVua190eXBlID0gQ0hVTktfQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgc2NyYXRjaCwgb3Bjb2RlX3NpemUpICE9CisgICAgICAgICAgICAgICAgb3Bjb2RlX3NpemUpIHsKKyAgICAgICAgICAgICAgICBjaHVua190eXBlID0gQ0hVTktfQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+YXVkaW9fc2FtcGxlX3JhdGUgPSBBVl9STDE2KCZzY3JhdGNoWzRdKTsKKyAgICAgICAgICAgIGF1ZGlvX2ZsYWdzID0gQVZfUkwxNigmc2NyYXRjaFsyXSk7CisgICAgICAgICAgICAvKiBiaXQgMCBvZiB0aGUgZmxhZ3M6IDAgPSBtb25vLCAxID0gc3RlcmVvICovCisgICAgICAgICAgICBzLT5hdWRpb19jaGFubmVscyA9IChhdWRpb19mbGFncyAmIDEpICsgMTsKKyAgICAgICAgICAgIC8qIGJpdCAxIG9mIHRoZSBmbGFnczogMCA9IDggYml0LCAxID0gMTYgYml0ICovCisgICAgICAgICAgICBzLT5hdWRpb19iaXRzID0gKCgoYXVkaW9fZmxhZ3MgPj4gMSkgJiAxKSArIDEpICogODsKKyAgICAgICAgICAgIC8qIGJpdCAyIGluZGljYXRlcyBjb21wcmVzc2VkIGF1ZGlvIGluIHZlcnNpb24gMSBvcGNvZGUgKi8KKyAgICAgICAgICAgIGlmICgob3Bjb2RlX3ZlcnNpb24gPT0gMSkgJiYgKGF1ZGlvX2ZsYWdzICYgMHg0KSkKKyAgICAgICAgICAgICAgICBzLT5hdWRpb190eXBlID0gQVZfQ09ERUNfSURfSU5URVJQTEFZX0RQQ007CisgICAgICAgICAgICBlbHNlIGlmIChzLT5hdWRpb19iaXRzID09IDE2KQorICAgICAgICAgICAgICAgIHMtPmF1ZGlvX3R5cGUgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcy0+YXVkaW9fdHlwZSA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgImF1ZGlvOiAlZCBiaXRzLCAlZCBIeiwgJXMsICVzIGZvcm1hdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgcy0+YXVkaW9fYml0cywgcy0+YXVkaW9fc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgIChzLT5hdWRpb19jaGFubmVscyA9PSAyKSA/ICJzdGVyZW8iIDogIm1vbm8iLAorICAgICAgICAgICAgICAgICAgICAocy0+YXVkaW9fdHlwZSA9PSBBVl9DT0RFQ19JRF9JTlRFUlBMQVlfRFBDTSkgPworICAgICAgICAgICAgICAgICAgICAiSW50ZXJwbGF5IGF1ZGlvIiA6ICJQQ00iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgT1BDT0RFX1NUQVJUX1NUT1BfQVVESU86CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJzdGFydC9zdG9wIGF1ZGlvXG4iKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgb3Bjb2RlX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPUENPREVfSU5JVF9WSURFT19CVUZGRVJTOgorICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiaW5pdGlhbGl6ZSB2aWRlbyBidWZmZXJzXG4iKTsKKyAgICAgICAgICAgIGlmICgob3Bjb2RlX3ZlcnNpb24gPiAyKSB8fCAob3Bjb2RlX3NpemUgPiA4KSB8fCBvcGNvZGVfc2l6ZSA8IDQKKyAgICAgICAgICAgICAgICB8fCBvcGNvZGVfdmVyc2lvbiA9PSAyICYmIG9wY29kZV9zaXplIDwgOAorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiYmFkIGluaXRfdmlkZW9fYnVmZmVycyBvcGNvZGVcbiIpOworICAgICAgICAgICAgICAgIGNodW5rX3R5cGUgPSBDSFVOS19CQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBzY3JhdGNoLCBvcGNvZGVfc2l6ZSkgIT0KKyAgICAgICAgICAgICAgICBvcGNvZGVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGNodW5rX3R5cGUgPSBDSFVOS19CQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aWR0aCAgPSBBVl9STDE2KCZzY3JhdGNoWzBdKSAqIDg7CisgICAgICAgICAgICBoZWlnaHQgPSBBVl9STDE2KCZzY3JhdGNoWzJdKSAqIDg7CisgICAgICAgICAgICBpZiAod2lkdGggIT0gcy0+dmlkZW9fd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBzLT52aWRlb193aWR0aCA9IHdpZHRoOworICAgICAgICAgICAgICAgIHMtPmNoYW5nZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoZWlnaHQgIT0gcy0+dmlkZW9faGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcy0+dmlkZW9faGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgICAgIHMtPmNoYW5nZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcGNvZGVfdmVyc2lvbiA8IDIgfHwgIUFWX1JMMTYoJnNjcmF0Y2hbNl0pKSB7CisgICAgICAgICAgICAgICAgcy0+dmlkZW9fYnBwID0gODsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcy0+dmlkZW9fYnBwID0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJ2aWRlbyByZXNvbHV0aW9uOiAlZCB4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBzLT52aWRlb193aWR0aCwgcy0+dmlkZW9faGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgT1BDT0RFX1VOS05PV05fMDY6CisgICAgICAgIGNhc2UgT1BDT0RFX1VOS05PV05fMEU6CisgICAgICAgIGNhc2UgT1BDT0RFX1VOS05PV05fMTA6CisgICAgICAgIGNhc2UgT1BDT0RFX1VOS05PV05fMTI6CisgICAgICAgIGNhc2UgT1BDT0RFX1VOS05PV05fMTM6CisgICAgICAgIGNhc2UgT1BDT0RFX1VOS05PV05fMTQ6CisgICAgICAgIGNhc2UgT1BDT0RFX1VOS05PV05fMTU6CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJ1bmtub3duIChidXQgZG9jdW1lbnRlZCkgb3Bjb2RlICUwMlhcbiIsIG9wY29kZV90eXBlKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgb3Bjb2RlX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPUENPREVfU0VORF9CVUZGRVI6CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJzZW5kIGJ1ZmZlclxuIik7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIG9wY29kZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgT1BDT0RFX0FVRElPX0ZSQU1FOgorICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiYXVkaW8gZnJhbWVcbiIpOworCisgICAgICAgICAgICAvKiBsb2cgcG9zaXRpb24gYW5kIG1vdmUgb24gZm9yIG5vdyAqLworICAgICAgICAgICAgcy0+YXVkaW9fY2h1bmtfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgICAgIHMtPmF1ZGlvX2NodW5rX3NpemUgPSBvcGNvZGVfc2l6ZTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgb3Bjb2RlX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPUENPREVfU0lMRU5DRV9GUkFNRToKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgInNpbGVuY2UgZnJhbWVcbiIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBvcGNvZGVfc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE9QQ09ERV9JTklUX1ZJREVPX01PREU6CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJpbml0aWFsaXplIHZpZGVvIG1vZGVcbiIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBvcGNvZGVfc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE9QQ09ERV9DUkVBVEVfR1JBRElFTlQ6CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJjcmVhdGUgZ3JhZGllbnRcbiIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBvcGNvZGVfc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE9QQ09ERV9TRVRfUEFMRVRURToKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgInNldCBwYWxldHRlXG4iKTsKKyAgICAgICAgICAgIC8qIGNoZWNrIGZvciB0aGUgbG9naWNhbCBtYXhpbXVtIHBhbGV0dGUgc2l6ZQorICAgICAgICAgICAgICogKDMgKiAyNTYgKyA0IGJ5dGVzKSAqLworICAgICAgICAgICAgaWYgKG9wY29kZV9zaXplID4gMHgzMDQgfHwgb3Bjb2RlX3NpemUgPCA0KSB7CisgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiZGVtdXhfaXBtb3ZpZTogc2V0X3BhbGV0dGUgb3Bjb2RlIHdpdGggaW52YWxpZCBzaXplXG4iKTsKKyAgICAgICAgICAgICAgICBjaHVua190eXBlID0gQ0hVTktfQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgc2NyYXRjaCwgb3Bjb2RlX3NpemUpICE9IG9wY29kZV9zaXplKSB7CisgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSA9IENIVU5LX0JBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbG9hZCB0aGUgcGFsZXR0ZSBpbnRvIGludGVybmFsIGRhdGEgc3RydWN0dXJlICovCisgICAgICAgICAgICBmaXJzdF9jb2xvciA9IEFWX1JMMTYoJnNjcmF0Y2hbMF0pOworICAgICAgICAgICAgbGFzdF9jb2xvciA9IGZpcnN0X2NvbG9yICsgQVZfUkwxNigmc2NyYXRjaFsyXSkgLSAxOworICAgICAgICAgICAgLyogc2FuaXR5IGNoZWNrIChzaW5jZSB0aGV5IGFyZSAxNiBiaXQgdmFsdWVzKSAqLworICAgICAgICAgICAgaWYgKCAgIChmaXJzdF9jb2xvciA+IDB4RkYpIHx8IChsYXN0X2NvbG9yID4gMHhGRikKKyAgICAgICAgICAgICAgICB8fCAobGFzdF9jb2xvciAtIGZpcnN0X2NvbG9yICsgMSkqMyArIDQgPiBvcGNvZGVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgImRlbXV4X2lwbW92aWU6IHNldF9wYWxldHRlIGluZGV4ZXMgb3V0IG9mIHJhbmdlICglZCAtPiAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbG9yLCBsYXN0X2NvbG9yKTsKKyAgICAgICAgICAgICAgICBjaHVua190eXBlID0gQ0hVTktfQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaiA9IDQ7ICAvKiBvZmZzZXQgb2YgZmlyc3QgcGFsZXR0ZSBkYXRhICovCisgICAgICAgICAgICBmb3IgKGkgPSBmaXJzdF9jb2xvcjsgaSA8PSBsYXN0X2NvbG9yOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvKiB0aGUgcGFsZXR0ZSBpcyBzdG9yZWQgYXMgYSA2LWJpdCBWR0EgcGFsZXR0ZSwgdGh1cyBlYWNoCisgICAgICAgICAgICAgICAgICogY29tcG9uZW50IGlzIHNoaWZ0ZWQgdXAgdG8gYSA4LWJpdCByYW5nZSAqLworICAgICAgICAgICAgICAgIHIgPSBzY3JhdGNoW2orK10gKiA0OworICAgICAgICAgICAgICAgIGcgPSBzY3JhdGNoW2orK10gKiA0OworICAgICAgICAgICAgICAgIGIgPSBzY3JhdGNoW2orK10gKiA0OworICAgICAgICAgICAgICAgIHMtPnBhbGV0dGVbaV0gPSAoMHhGRlUgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYik7CisgICAgICAgICAgICAgICAgcy0+cGFsZXR0ZVtpXSB8PSBzLT5wYWxldHRlW2ldID4+IDYgJiAweDMwMzAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+aGFzX3BhbGV0dGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPUENPREVfU0VUX1BBTEVUVEVfQ09NUFJFU1NFRDoKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgInNldCBwYWxldHRlIGNvbXByZXNzZWRcbiIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBvcGNvZGVfc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE9QQ09ERV9TRVRfREVDT0RJTkdfTUFQOgorICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAic2V0IGRlY29kaW5nIG1hcFxuIik7CisKKyAgICAgICAgICAgIC8qIGxvZyBwb3NpdGlvbiBhbmQgbW92ZSBvbiBmb3Igbm93ICovCisgICAgICAgICAgICBzLT5kZWNvZGVfbWFwX2NodW5rX29mZnNldCA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBzLT5kZWNvZGVfbWFwX2NodW5rX3NpemUgPSBvcGNvZGVfc2l6ZTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgb3Bjb2RlX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPUENPREVfVklERU9fREFUQToKKyAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgInNldCB2aWRlbyBkYXRhXG4iKTsKKworICAgICAgICAgICAgLyogbG9nIHBvc2l0aW9uIGFuZCBtb3ZlIG9uIGZvciBub3cgKi8KKyAgICAgICAgICAgIHMtPnZpZGVvX2NodW5rX29mZnNldCA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBzLT52aWRlb19jaHVua19zaXplID0gb3Bjb2RlX3NpemU7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIG9wY29kZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICIqKiogdW5rbm93biBvcGNvZGUgdHlwZVxuIik7CisgICAgICAgICAgICBjaHVua190eXBlID0gQ0hVTktfQkFEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG1ha2UgYSBub3RlIG9mIHdoZXJlIHRoZSBzdHJlYW0gaXMgc2l0dGluZyAqLworICAgIHMtPm5leHRfY2h1bmtfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKKworICAgIC8qIGRpc3BhdGNoIHRoZSBmaXJzdCBvZiBhbnkgcGVuZGluZyBwYWNrZXRzICovCisgICAgaWYgKChjaHVua190eXBlID09IENIVU5LX1ZJREVPKSB8fCAoY2h1bmtfdHlwZSA9PSBDSFVOS19BVURJT19PTkxZKSkKKyAgICAgICAgY2h1bmtfdHlwZSA9IGxvYWRfaXBtb3ZpZV9wYWNrZXQocywgcGIsIHBrdCk7CisKKyAgICByZXR1cm4gY2h1bmtfdHlwZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgc2lnbmF0dXJlW10gPSAiSW50ZXJwbGF5IE1WRSBGaWxlXHgxQVwwXHgxQSI7CisKK3N0YXRpYyBpbnQgaXBtb3ZpZV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpiID0gcC0+YnVmOworICAgIGNvbnN0IHVpbnQ4X3QgKmJfZW5kID0gcC0+YnVmICsgcC0+YnVmX3NpemUgLSBzaXplb2Yoc2lnbmF0dXJlKTsKKyAgICBkbyB7CisgICAgICAgIGlmIChiWzBdID09IHNpZ25hdHVyZVswXSAmJiBtZW1jbXAoYiwgc2lnbmF0dXJlLCBzaXplb2Yoc2lnbmF0dXJlKSkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICAgICAgYisrOworICAgIH0gd2hpbGUgKGIgPCBiX2VuZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcG1vdmllX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBJUE1WRUNvbnRleHQgKmlwbW92aWUgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZQYWNrZXQgcGt0OworICAgIEFWU3RyZWFtICpzdDsKKyAgICB1bnNpZ25lZCBjaGFyIGNodW5rX3ByZWFtYmxlW0NIVU5LX1BSRUFNQkxFX1NJWkVdOworICAgIGludCBjaHVua190eXBlLCBpOworICAgIHVpbnQ4X3Qgc2lnbmF0dXJlX2J1ZmZlcltzaXplb2Yoc2lnbmF0dXJlKV07CisKKyAgICBhdmlvX3JlYWQocGIsIHNpZ25hdHVyZV9idWZmZXIsIHNpemVvZihzaWduYXR1cmVfYnVmZmVyKSk7CisgICAgd2hpbGUgKG1lbWNtcChzaWduYXR1cmVfYnVmZmVyLCBzaWduYXR1cmUsIHNpemVvZihzaWduYXR1cmUpKSkgeworICAgICAgICBtZW1tb3ZlKHNpZ25hdHVyZV9idWZmZXIsIHNpZ25hdHVyZV9idWZmZXIgKyAxLCBzaXplb2Yoc2lnbmF0dXJlX2J1ZmZlcikgLSAxKTsKKyAgICAgICAgc2lnbmF0dXJlX2J1ZmZlcltzaXplb2Yoc2lnbmF0dXJlX2J1ZmZlcikgLSAxXSA9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisgICAgLyogaW5pdGlhbGl6ZSBwcml2YXRlIGNvbnRleHQgbWVtYmVycyAqLworICAgIGlwbW92aWUtPnZpZGVvX3B0cyA9IGlwbW92aWUtPmF1ZGlvX2ZyYW1lX2NvdW50ID0gMDsKKyAgICBpcG1vdmllLT5hdWRpb19jaHVua19vZmZzZXQgPSBpcG1vdmllLT52aWRlb19jaHVua19vZmZzZXQgPQorICAgIGlwbW92aWUtPmRlY29kZV9tYXBfY2h1bmtfb2Zmc2V0ID0gMDsKKworICAgIC8qIG9uIHRoZSBmaXJzdCByZWFkLCB0aGlzIHdpbGwgcG9zaXRpb24gdGhlIHN0cmVhbSBhdCB0aGUgZmlyc3QgY2h1bmsgKi8KKyAgICBpcG1vdmllLT5uZXh0X2NodW5rX29mZnNldCA9IGF2aW9fdGVsbChwYikgKyA0OworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBpcG1vdmllLT5wYWxldHRlW2ldID0gMHhGRlUgPDwgMjQ7CisKKyAgICAvKiBwcm9jZXNzIHRoZSBmaXJzdCBjaHVuayB3aGljaCBzaG91bGQgYmUgQ0hVTktfSU5JVF9WSURFTyAqLworICAgIGlmIChwcm9jZXNzX2lwbW92aWVfY2h1bmsoaXBtb3ZpZSwgcGIsICZwa3QpICE9IENIVU5LX0lOSVRfVklERU8pCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLyogcGVlayBhaGVhZCB0byB0aGUgbmV4dCBjaHVuay0tIGlmIGl0IGlzIGFuIGluaXQgYXVkaW8gY2h1bmssIHByb2Nlc3MKKyAgICAgKiBpdDsgaWYgaXQgaXMgdGhlIGZpcnN0IHZpZGVvIGNodW5rLCB0aGlzIGlzIGEgc2lsZW50IGZpbGUgKi8KKyAgICBpZiAoYXZpb19yZWFkKHBiLCBjaHVua19wcmVhbWJsZSwgQ0hVTktfUFJFQU1CTEVfU0laRSkgIT0KKyAgICAgICAgQ0hVTktfUFJFQU1CTEVfU0laRSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICBjaHVua190eXBlID0gQVZfUkwxNigmY2h1bmtfcHJlYW1ibGVbMl0pOworICAgIGF2aW9fc2VlayhwYiwgLUNIVU5LX1BSRUFNQkxFX1NJWkUsIFNFRUtfQ1VSKTsKKworICAgIGlmIChjaHVua190eXBlID09IENIVU5LX1ZJREVPKQorICAgICAgICBpcG1vdmllLT5hdWRpb190eXBlID0gQVZfQ09ERUNfSURfTk9ORTsgIC8qIG5vIGF1ZGlvICovCisgICAgZWxzZSBpZiAocHJvY2Vzc19pcG1vdmllX2NodW5rKGlwbW92aWUsIHBiLCAmcGt0KSAhPSBDSFVOS19JTklUX0FVRElPKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIHN0cmVhbSBkZWNvZGVycyAqLworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDYzLCAxLCAxMDAwMDAwKTsKKyAgICBpcG1vdmllLT52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9JTlRFUlBMQVlfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjLT53aWR0aCA9IGlwbW92aWUtPnZpZGVvX3dpZHRoOworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gaXBtb3ZpZS0+dmlkZW9faGVpZ2h0OworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gaXBtb3ZpZS0+dmlkZW9fYnBwOworCisgICAgaWYgKGlwbW92aWUtPmF1ZGlvX3R5cGUpIHsKKyAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIGlwbW92aWUtPmF1ZGlvX3NhbXBsZV9yYXRlKTsKKyAgICAgICAgaXBtb3ZpZS0+YXVkaW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBpcG1vdmllLT5hdWRpb190eXBlOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyB0YWcgKi8KKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IGlwbW92aWUtPmF1ZGlvX2NoYW5uZWxzOworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gc3QtPmNvZGVjLT5jaGFubmVscyA9PSAxID8gQVZfQ0hfTEFZT1VUX01PTk8gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGlwbW92aWUtPmF1ZGlvX3NhbXBsZV9yYXRlOworICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGlwbW92aWUtPmF1ZGlvX2JpdHM7CisgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqCisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSU5URVJQTEFZX0RQQ00pCisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlIC89IDI7CisgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBtb3ZpZV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBJUE1WRUNvbnRleHQgKmlwbW92aWUgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHJldDsKKworICAgIGZvciAoOzspIHsKKyAgICByZXQgPSBwcm9jZXNzX2lwbW92aWVfY2h1bmsoaXBtb3ZpZSwgcGIsIHBrdCk7CisgICAgaWYgKHJldCA9PSBDSFVOS19CQUQpCisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgZWxzZSBpZiAocmV0ID09IENIVU5LX0VPRikKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgIGVsc2UgaWYgKHJldCA9PSBDSFVOS19OT01FTSkKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgIGVsc2UgaWYgKHJldCA9PSBDSFVOS19WSURFTykKKyAgICAgICAgcmV0ID0gMDsKKyAgICBlbHNlIGlmIChyZXQgPT0gQ0hVTktfSU5JVF9WSURFTyB8fCByZXQgPT0gQ0hVTktfSU5JVF9BVURJTykKKyAgICAgICAgY29udGludWU7CisgICAgZWxzZQorICAgICAgICByZXQgPSAtMTsKKworICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCitBVklucHV0Rm9ybWF0IGZmX2lwbW92aWVfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaXBtb3ZpZSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkludGVycGxheSBNVkUiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSVBNVkVDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBpcG1vdmllX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGlwbW92aWVfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gaXBtb3ZpZV9yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaXJjYW0uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pcmNhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjdjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaXJjYW0uYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogSVJDQU0gY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworY29uc3QgQVZDb2RlY1RhZyBmZl9jb2RlY19pcmNhbV9sZV90YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9QQ01fQUxBVywgIDB4MTAwMDEgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9GMzJMRSwgMHgwMDAwNCB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX0Y2NExFLCAweDAwMDA4IH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fTVVMQVcsIDB4MjAwMDEgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMTZMRSwgMHgwMDAwMiB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MyNExFLCAweDAwMDAzIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzMyTEUsIDB4NDAwMDQgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TOCwgICAgMHgwMDAwMSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgICAwICAgICAgIH0sCit9OworCitjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX2lyY2FtX2JlX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9BTEFXLCAgMHgxMDAwMSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX0YzMkJFLCAweDAwMDA0IH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjY0QkUsIDB4MDAwMDggfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9NVUxBVywgMHgyMDAwMSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MxNkJFLCAweDAwMDAyIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzI0QkUsIDB4MDAwMDMgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMzJCRSwgMHg0MDAwNCB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1M4LCAgICAweDAwMDAxIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAgICAgIDAgICAgICAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaXJjYW0uaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pcmNhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjljODQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaXJjYW0uaApAQCAtMCwwICsxLDMwIEBACisvKgorICogSVJDQU0gY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9JUkNBTV9ICisjZGVmaW5lIEFWRk9STUFUX0lSQ0FNX0gKKworI2luY2x1ZGUgImludGVybmFsLmgiCisKK2V4dGVybiBjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX2lyY2FtX2JlX3RhZ3NbXTsKK2V4dGVybiBjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX2lyY2FtX2xlX3RhZ3NbXTsKKworI2VuZGlmIC8qIEFWRk9STUFUX0lSQ0FNX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9pcmNhbWRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lyY2FtZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1MzNlYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pcmNhbWRlYy5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogSVJDQU0gZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwY20uaCIKKyNpbmNsdWRlICJpcmNhbS5oIgorCitzdGF0aWMgaW50IGlyY2FtX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmICgocC0+YnVmWzBdID09IDB4NjQgJiYgcC0+YnVmWzFdID09IDB4QTMgJiYgcC0+YnVmWzNdID09IDB4MDAgJiYKKyAgICAgICAgIHAtPmJ1ZlsyXSA+PSAgICAxICYmIHAtPmJ1ZlsyXSA8PSA0KSB8fAorICAgICAgICAocC0+YnVmWzNdID09IDB4NjQgJiYgcC0+YnVmWzJdID09IDB4QTMgJiYgcC0+YnVmWzBdID09IDB4MDAgJiYKKyAgICAgICAgIHAtPmJ1ZlsxXSA+PSAgICAxICYmIHAtPmJ1ZlsxXSA8PSAzKSAmJgorICAgICAgICBBVl9STjMyKHAtPmJ1ZiArIDQpICYmIEFWX1JOMzIocC0+YnVmICsgOCkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDQgKiAzOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGVuZGlhbmVzcyB7CisgICAgdWludDMyX3QgbWFnaWM7CisgICAgaW50ICAgICAgaXNfbGU7Cit9IHRhYmxlW10gPSB7CisgIHsgMHg2NEEzMDEwMCwgMCB9LAorICB7IDB4NjRBMzAyMDAsIDEgfSwKKyAgeyAweDY0QTMwMzAwLCAwIH0sCisgIHsgMHg2NEEzMDQwMCwgMSB9LAorICB7IDB4MDAwMUEzNjQsIDEgfSwKKyAgeyAweDAwMDJBMzY0LCAwIH0sCisgIHsgMHgwMDAzQTM2NCwgMSB9LAorfTsKKworc3RhdGljIGludCBpcmNhbV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgdWludDMyX3QgbWFnaWMsIHNhbXBsZV9yYXRlLCBjaGFubmVscywgdGFnOworICAgIGNvbnN0IEFWQ29kZWNUYWcgKnRhZ3M7CisgICAgaW50IGxlID0gLTEsIGk7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgbWFnaWMgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKyAgICAgICAgaWYgKG1hZ2ljID09IHRhYmxlW2ldLm1hZ2ljKSB7CisgICAgICAgICAgICBsZSA9IHRhYmxlW2ldLmlzX2xlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGUgPT0gMSkgeworICAgICAgICBzYW1wbGVfcmF0ZSA9IGF2X2ludDJmbG9hdChhdmlvX3JsMzIocy0+cGIpKTsKKyAgICAgICAgY2hhbm5lbHMgICAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICB0YWcgICAgICAgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgIHRhZ3MgICAgICAgID0gZmZfY29kZWNfaXJjYW1fbGVfdGFnczsKKyAgICB9IGVsc2UgaWYgKGxlID09IDApIHsKKyAgICAgICAgc2FtcGxlX3JhdGUgPSBhdl9pbnQyZmxvYXQoYXZpb19yYjMyKHMtPnBiKSk7CisgICAgICAgIGNoYW5uZWxzICAgID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICAgICAgdGFnICAgICAgICAgPSBhdmlvX3JiMzIocy0+cGIpOworICAgICAgICB0YWdzICAgICAgICA9IGZmX2NvZGVjX2lyY2FtX2JlX3RhZ3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCFjaGFubmVscyB8fCAhc2FtcGxlX3JhdGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBjaGFubmVsczsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKHRhZ3MsIHRhZyk7CisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5rbm93biB0YWcgJVhcbiIsIHRhZyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKTsKKyAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWMtPmNoYW5uZWxzIC8gODsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZpb19za2lwKHMtPnBiLCAxMDA4KTsKKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2lyY2FtX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImlyY2FtIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQmVya2VsZXkvSVJDQU0vQ0FSTCBTb3VuZCBGb3JtYXQiKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBpcmNhbV9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBpcmNhbV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmZl9wY21fcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlayAgICAgID0gZmZfcGNtX3JlYWRfc2VlaywKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAic2YsaXJjYW0iLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2lyY2FtZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvaXJjYW1lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGYxNWZiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lyY2FtZW5jLmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIElSQ0FNIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyYXdlbmMuaCIKKyNpbmNsdWRlICJpcmNhbS5oIgorCitzdGF0aWMgaW50IGlyY2FtX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgdWludDMyX3QgdGFnOworCisgICAgaWYgKHMtPm5iX3N0cmVhbXMgIT0gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAib25seSBvbmUgc3RyZWFtIGlzIHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19pcmNhbV9sZV90YWdzLCBjb2RlYy0+Y29kZWNfaWQpOworICAgIGlmICghdGFnKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBjb2RlY1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZpb193bDMyKHMtPnBiLCAweDAwMDFBMzY0KTsKKyAgICBhdmlvX3dsMzIocy0+cGIsIGF2X2Zsb2F0MmludChjb2RlYy0+c2FtcGxlX3JhdGUpKTsKKyAgICBhdmlvX3dsMzIocy0+cGIsIGNvZGVjLT5jaGFubmVscyk7CisgICAgYXZpb193bDMyKHMtPnBiLCB0YWcpOworICAgIGZmaW9fZmlsbChzLT5wYiwgMCwgMTAwOCk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX2lyY2FtX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJpcmNhbSIsCisgICAgLmV4dGVuc2lvbnMgICAgID0gInNmLGlyY2FtIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQmVya2VsZXkvSVJDQU0vQ0FSTCBTb3VuZCBGb3JtYXQiKSwKKyAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgPSBpcmNhbV93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKKyAgICAuY29kZWNfdGFnICAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyAqY29uc3QgW10peyBmZl9jb2RlY19pcmNhbV9sZV90YWdzLCAwIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2lzb20uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pc29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwOTAyMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pc29tLmMKQEAgLTAsMCArMSw1OTMgQEAKKy8qCisgKiBJU08gTWVkaWEgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGcmFuY29pcyBSZXZvbCA8cmV2b2xAZnJlZS5mcj4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlLmNvdWR1cmllckBmcmVlLmZyPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImlzb20uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWc0YXVkaW8uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWdhdWRpb2RhdGEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKKy8qIGh0dHA6Ly93d3cubXA0cmEub3JnICovCisvKiBvcmRlcmVkIGJ5IG11eGluZyBwcmVmZXJlbmNlICovCitjb25zdCBBVkNvZGVjVGFnIGZmX21wNF9vYmpfdHlwZVtdID0geworICAgIHsgQVZfQ09ERUNfSURfTU9WX1RFWFQgICAgLCAweDA4IH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCAgICAgICAsIDB4MjAgfSwKKyAgICB7IEFWX0NPREVDX0lEX0gyNjQgICAgICAgICwgMHgyMSB9LAorICAgIHsgQVZfQ09ERUNfSURfSEVWQyAgICAgICAgLCAweDIzIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BQUMgICAgICAgICAsIDB4NDAgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QNEFMUyAgICAgICwgMHg0MCB9LCAvKiAxNDQ5Ni0zIEFMUyAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTyAgLCAweDYxIH0sIC8qIE1QRUcyIE1haW4gKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8gICwgMHg2MCB9LCAvKiBNUEVHMiBTaW1wbGUgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8gICwgMHg2MiB9LCAvKiBNUEVHMiBTTlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8gICwgMHg2MyB9LCAvKiBNUEVHMiBTcGF0aWFsICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICAsIDB4NjQgfSwgLyogTVBFRzIgSGlnaCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTyAgLCAweDY1IH0sIC8qIE1QRUcyIDQyMiAqLworICAgIHsgQVZfQ09ERUNfSURfQUFDICAgICAgICAgLCAweDY2IH0sIC8qIE1QRUcyIEFBQyBNYWluICovCisgICAgeyBBVl9DT0RFQ19JRF9BQUMgICAgICAgICAsIDB4NjcgfSwgLyogTVBFRzIgQUFDIExvdyAqLworICAgIHsgQVZfQ09ERUNfSURfQUFDICAgICAgICAgLCAweDY4IH0sIC8qIE1QRUcyIEFBQyBTU1IgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QMyAgICAgICAgICwgMHg2OSB9LCAvKiAxMzgxOC0zICovCisgICAgeyBBVl9DT0RFQ19JRF9NUDIgICAgICAgICAsIDB4NjkgfSwgLyogMTExNzItMyAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzFWSURFTyAgLCAweDZBIH0sIC8qIDExMTcyLTIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QMyAgICAgICAgICwgMHg2QiB9LCAvKiAxMTE3Mi0zICovCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRyAgICAgICAsIDB4NkMgfSwgLyogMTA5MTgtMSAqLworICAgIHsgQVZfQ09ERUNfSURfUE5HICAgICAgICAgLCAweDZEIH0sCisgICAgeyBBVl9DT0RFQ19JRF9KUEVHMjAwMCAgICAsIDB4NkUgfSwgLyogMTU0NDQtMSAqLworICAgIHsgQVZfQ09ERUNfSURfVkMxICAgICAgICAgLCAweEEzIH0sCisgICAgeyBBVl9DT0RFQ19JRF9ESVJBQyAgICAgICAsIDB4QTQgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FDMyAgICAgICAgICwgMHhBNSB9LAorICAgIHsgQVZfQ09ERUNfSURfRUFDMyAgICAgICAgLCAweEE2IH0sCisgICAgeyBBVl9DT0RFQ19JRF9EVFMgICAgICAgICAsIDB4QTkgfSwgLyogbXA0cmEub3JnICovCisgICAgeyBBVl9DT0RFQ19JRF9WT1JCSVMgICAgICAsIDB4REQgfSwgLyogbm9uIHN0YW5kYXJkLCBncGFjIHVzZXMgaXQgKi8KKyAgICB7IEFWX0NPREVDX0lEX0RWRF9TVUJUSVRMRSwgMHhFMCB9LCAvKiBub24gc3RhbmRhcmQsIHNlZSB1bnN1cHBvcnRlZC1lbWJlZGRlZC1zdWJzLTIubXA0ICovCisgICAgeyBBVl9DT0RFQ19JRF9RQ0VMUCAgICAgICAsIDB4RTEgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0U1lTVEVNUywgMHgwMSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzRTWVNURU1TLCAweDAyIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FICAgICAgICAsICAgIDAgfSwKK307CisKK2NvbnN0IEFWQ29kZWNUYWcgZmZfY29kZWNfbW92dmlkZW9fdGFnc1tdID0geworLyogIHsgQVZfQ09ERUNfSURfLCBNS1RBRygnSScsICdWJywgJzUnLCAnMCcpIH0sICovLyogSW5kZW8gNS4wICovCisKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygncicsICdhJywgJ3cnLCAnICcpIH0sIC8qIFVuY29tcHJlc3NlZCBSR0IgKi8KKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygneScsICd1JywgJ3YnLCAnMicpIH0sIC8qIFVuY29tcHJlc3NlZCBZVVY0MjIgKi8KKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnMicsICd2JywgJ3UnLCAneScpIH0sIC8qIFVOQ09NUFJFU1NFRCA4QklUIDQ6MjoyICovCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJ3knLCAndScsICd2JywgJ3MnKSB9LCAvKiBzYW1lIGFzIDJ2dXkgYnV0IGJ5dGUgc3dhcHBlZCAqLworCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJ0wnLCAnNScsICc1JywgJzUnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sIE1LVEFHKCdMJywgJzUnLCAnNicsICc1JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnQicsICc1JywgJzYnLCAnNScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJzInLCAnNCcsICdCJywgJ0cnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sIE1LVEFHKCdCJywgJ0cnLCAnUicsICdBJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnUicsICdHJywgJ0InLCAnQScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJ0EnLCAnQicsICdHJywgJ1InKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sIE1LVEFHKCdiJywgJzEnLCAnNicsICdnJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnYicsICc0JywgJzgnLCAncicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJ2InLCAneCcsICdiJywgJ2cnKSB9LCAvKiBCT1hYICovCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJ2InLCAneCcsICdyJywgJ2cnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sIE1LVEFHKCdiJywgJ3gnLCAneScsICd2JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnTicsICdPJywgJzEnLCAnNicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJ0QnLCAnVicsICdPJywgJ08nKSB9LCAvKiBEaWdpdGFsIFZvb2RvbyBTRCA4IEJpdCAqLworICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sIE1LVEFHKCdSJywgJzQnLCAnMicsICcwJykgfSwgLyogUmFkaXVzIERWIFlVViBQQUwgKi8KKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnUicsICc0JywgJzEnLCAnMScpIH0sIC8qIFJhZGl1cyBEViBZVVYgTlRTQyAqLworCisgICAgeyBBVl9DT0RFQ19JRF9SMTBLLCAgIE1LVEFHKCdSJywgJzEnLCAnMCcsICdrJykgfSwgLyogVU5DT01QUkVTU0VEIDEwQklUIFJHQiAqLworICAgIHsgQVZfQ09ERUNfSURfUjEwSywgICBNS1RBRygnUicsICcxJywgJzAnLCAnZycpIH0sIC8qIFVOQ09NUFJFU1NFRCAxMEJJVCBSR0IgKi8KKyAgICB7IEFWX0NPREVDX0lEX1IyMTAsICAgTUtUQUcoJ3InLCAnMicsICcxJywgJzAnKSB9LCAvKiBVTkNPTVBSRVNTRUQgMTBCSVQgUkdCICovCisgICAgeyBBVl9DT0RFQ19JRF9BVlVJLCAgIE1LVEFHKCdBJywgJ1YnLCAnVScsICdJJykgfSwgLyogQVZJRCBVbmNvbXByZXNzZWQgZGVpbnRlcmxlYXZlZCBVWVZZNDIyICovCisgICAgeyBBVl9DT0RFQ19JRF9BVlJQLCAgIE1LVEFHKCdBJywgJ1YnLCAncicsICdwJykgfSwgLyogQXZpZCAxOjEgMTAtYml0IFJHQiBQYWNrZXIgKi8KKyAgICB7IEFWX0NPREVDX0lEX0FWUlAsICAgTUtUQUcoJ1MnLCAnVScsICdEJywgJ1MnKSB9LCAvKiBBdmlkIERTIFVuY29tcHJlc3NlZCAqLworICAgIHsgQVZfQ09ERUNfSURfVjIxMCwgICBNS1RBRygndicsICcyJywgJzEnLCAnMCcpIH0sIC8qIFVOQ09NUFJFU1NFRCAxMEJJVCA0OjI6MiAqLworICAgIHsgQVZfQ09ERUNfSURfVjIxMCwgICBNS1RBRygnYicsICd4JywgJ3knLCAnMicpIH0sIC8qIEJPWFggMTBCSVQgNDoyOjIgKi8KKyAgICB7IEFWX0NPREVDX0lEX1YzMDgsICAgTUtUQUcoJ3YnLCAnMycsICcwJywgJzgnKSB9LCAvKiBVTkNPTVBSRVNTRUQgIDhCSVQgNDo0OjQgKi8KKyAgICB7IEFWX0NPREVDX0lEX1Y0MDgsICAgTUtUQUcoJ3YnLCAnNCcsICcwJywgJzgnKSB9LCAvKiBVTkNPTVBSRVNTRUQgIDhCSVQgNDo0OjQ6NCAqLworICAgIHsgQVZfQ09ERUNfSURfVjQxMCwgICBNS1RBRygndicsICc0JywgJzEnLCAnMCcpIH0sIC8qIFVOQ09NUFJFU1NFRCAxMEJJVCA0OjQ6NCAqLworICAgIHsgQVZfQ09ERUNfSURfWTQxUCwgICBNS1RBRygnWScsICc0JywgJzEnLCAnUCcpIH0sIC8qIFVOQ09NUFJFU1NFRCAxMkJJVCA0OjE6MSAqLworICAgIHsgQVZfQ09ERUNfSURfWVVWNCwgICBNS1RBRygneScsICd1JywgJ3YnLCAnNCcpIH0sIC8qIGxpYnF1aWNrdGltZSBwYWNrZWQgeXV2NDIwcCAqLworICAgIHsgQVZfQ09ERUNfSURfVEFSR0FfWTIxNiwgTUtUQUcoJ1knLCAnMicsICcxJywgJzYnKSB9LAorCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgIE1LVEFHKCdqJywgJ3AnLCAnZScsICdnJykgfSwgLyogUGhvdG9KUEVHICovCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgIE1LVEFHKCdtJywgJ2onLCAncCcsICdhJykgfSwgLyogTW90aW9uLUpQRUcgKGZvcm1hdCBBKSAqLworICAgIHsgQVZfQ09ERUNfSURfTUpQRUcsICBNS1RBRygnQScsICdWJywgJ0QnLCAnSicpIH0sIC8qIE1KUEVHIHdpdGggYWxwaGEtY2hhbm5lbCAoQVZJRCBKRklGIG1lcmlkaWVuIGNvbXByZXNzZWQpICovCisvKiAgeyBBVl9DT0RFQ19JRF9NSlBFRywgIE1LVEFHKCdBJywgJ1YnLCAnUicsICduJykgfSwgKi8vKiBNSlBFRyB3aXRoIGFscGhhLWNoYW5uZWwgKEFWSUQgQUJWQi9UcnVldmlzaW9uIE51VmlzdGEpICovCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgIE1LVEFHKCdkJywgJ20nLCAnYicsICcxJykgfSwgLyogTW90aW9uIEpQRUcgT3BlbkRNTCAqLworICAgIHsgQVZfQ09ERUNfSURfTUpQRUdCLCBNS1RBRygnbScsICdqJywgJ3AnLCAnYicpIH0sIC8qIE1vdGlvbi1KUEVHIChmb3JtYXQgQikgKi8KKworICAgIHsgQVZfQ09ERUNfSURfU1ZRMSwgTUtUQUcoJ1MnLCAnVicsICdRJywgJzEnKSB9LCAvKiBTb3JlbnNvbiBWaWRlbyB2MSAqLworICAgIHsgQVZfQ09ERUNfSURfU1ZRMSwgTUtUQUcoJ3MnLCAndicsICdxJywgJzEnKSB9LCAvKiBTb3JlbnNvbiBWaWRlbyB2MSAqLworICAgIHsgQVZfQ09ERUNfSURfU1ZRMSwgTUtUQUcoJ3MnLCAndicsICdxJywgJ2knKSB9LCAvKiBTb3JlbnNvbiBWaWRlbyB2MSAoZnJvbSBRVCBzcGVjcykqLworICAgIHsgQVZfQ09ERUNfSURfU1ZRMywgTUtUQUcoJ1MnLCAnVicsICdRJywgJzMnKSB9LCAvKiBTb3JlbnNvbiBWaWRlbyB2MyAqLworCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgTUtUQUcoJ20nLCAncCcsICc0JywgJ3YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsIE1LVEFHKCdEJywgJ0knLCAnVicsICdYJykgfSwgLyogT3BlbkRpVlggKi8vKiBzYW1wbGUgZmlsZXMgYXQgaHR0cDovL2hlcm9pbmV3YXJyaW9yLmNvbS94bW92aWUucGhwMyB1c2UgdGhpcyB0YWcgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCBNS1RBRygnWCcsICdWJywgJ0knLCAnRCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgTUtUQUcoJzMnLCAnSScsICdWJywgJzInKSB9LCAvKiBleHBlcmltZW50YWw6IDNJVlggZmlsZXMgYmVmb3JlIGl2eCBENCA0LjUuMSAqLworCisgICAgeyBBVl9DT0RFQ19JRF9IMjYzLCBNS1RBRygnaCcsICcyJywgJzYnLCAnMycpIH0sIC8qIEgyNjMgKi8KKyAgICB7IEFWX0NPREVDX0lEX0gyNjMsIE1LVEFHKCdzJywgJzInLCAnNicsICczJykgfSwgLyogSDI2MyA/PyB3b3JrcyAqLworCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCBNS1RBRygnZCcsICd2JywgJ2MnLCAncCcpIH0sIC8qIERWIFBBTCAqLworICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgTUtUQUcoJ2QnLCAndicsICdjJywgJyAnKSB9LCAvKiBEViBOVFNDICovCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCBNS1RBRygnZCcsICd2JywgJ3AnLCAncCcpIH0sIC8qIERWQ1BSTyBQQUwgcHJvZHVjZWQgYnkgRkNQICovCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCBNS1RBRygnZCcsICd2JywgJzUnLCAncCcpIH0sIC8qIERWQ1BSTzUwIFBBTCBwcm9kdWNlZCBieSBGQ1AgKi8KKyAgICB7IEFWX0NPREVDX0lEX0RWVklERU8sIE1LVEFHKCdkJywgJ3YnLCAnNScsICduJykgfSwgLyogRFZDUFJPNTAgTlRTQyBwcm9kdWNlZCBieSBGQ1AgKi8KKyAgICB7IEFWX0NPREVDX0lEX0RWVklERU8sIE1LVEFHKCdBJywgJ1YnLCAnZCcsICd2JykgfSwgLyogQVZJRCBEViAqLworICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgTUtUQUcoJ0EnLCAnVicsICdkJywgJzEnKSB9LCAvKiBBVklEIERWMTAwICovCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCBNS1RBRygnZCcsICd2JywgJ2gnLCAncScpIH0sIC8qIERWQ1BSTyBIRCA3MjBwNTAgKi8KKyAgICB7IEFWX0NPREVDX0lEX0RWVklERU8sIE1LVEFHKCdkJywgJ3YnLCAnaCcsICdwJykgfSwgLyogRFZDUFJPIEhEIDcyMHA2MCAqLworICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgTUtUQUcoJ2QnLCAndicsICdoJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgTUtUQUcoJ2QnLCAndicsICdoJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgTUtUQUcoJ2QnLCAndicsICdoJywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgTUtUQUcoJ2QnLCAndicsICdoJywgJzUnKSB9LCAvKiBEVkNQUk8gSEQgNTBpIHByb2R1Y2VkIGJ5IEZDUCAqLworICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgTUtUQUcoJ2QnLCAndicsICdoJywgJzYnKSB9LCAvKiBEVkNQUk8gSEQgNjBpIHByb2R1Y2VkIGJ5IEZDUCAqLworICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgTUtUQUcoJ2QnLCAndicsICdoJywgJzMnKSB9LCAvKiBEVkNQUk8gSEQgMzBwIHByb2R1Y2VkIGJ5IEZDUCAqLworCisgICAgeyBBVl9DT0RFQ19JRF9WUDMsICAgICBNS1RBRygnVicsICdQJywgJzMnLCAnMScpIH0sIC8qIE9uMiBWUDMgKi8KKyAgICB7IEFWX0NPREVDX0lEX1JQWkEsICAgIE1LVEFHKCdyJywgJ3AnLCAneicsICdhJykgfSwgLyogQXBwbGUgVmlkZW8gKFJQWkEpICovCisgICAgeyBBVl9DT0RFQ19JRF9DSU5FUEFLLCBNS1RBRygnYycsICd2JywgJ2knLCAnZCcpIH0sIC8qIENpbmVwYWsgKi8KKyAgICB7IEFWX0NPREVDX0lEXzhCUFMsICAgIE1LVEFHKCc4JywgJ0InLCAnUCcsICdTJykgfSwgLyogUGxhbmFyIFJHQiAoOEJQUykgKi8KKyAgICB7IEFWX0NPREVDX0lEX1NNQywgICAgIE1LVEFHKCdzJywgJ20nLCAnYycsICcgJykgfSwgLyogQXBwbGUgR3JhcGhpY3MgKFNNQykgKi8KKyAgICB7IEFWX0NPREVDX0lEX1FUUkxFLCAgIE1LVEFHKCdyJywgJ2wnLCAnZScsICcgJykgfSwgLyogQXBwbGUgQW5pbWF0aW9uIChSTEUpICovCisgICAgeyBBVl9DT0RFQ19JRF9TR0lSTEUsICBNS1RBRygncicsICdsJywgJ2UnLCAnMScpIH0sIC8qIFNHSSBSTEUgOC1iaXQgKi8KKyAgICB7IEFWX0NPREVDX0lEX01TUkxFLCAgIE1LVEFHKCdXJywgJ1InLCAnTCcsICdFJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1FEUkFXLCAgIE1LVEFHKCdxJywgJ2QnLCAncicsICd3JykgfSwgLyogUXVpY2tEcmF3ICovCisKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnVycsICdSJywgJ0EnLCAnVycpIH0sCisKKyAgICB7IEFWX0NPREVDX0lEX0hFVkMsIE1LVEFHKCdoJywgJ2UnLCAndicsICcxJykgfSwgLyogSEVWQy9ILjI2NSB3aGljaCBpbmRpY2F0ZXMgcGFyYW1ldGVyIHNldHMgbWF5IGJlIGluIEVTICovCisgICAgeyBBVl9DT0RFQ19JRF9IRVZDLCBNS1RBRygnaCcsICd2JywgJ2MnLCAnMScpIH0sIC8qIEhFVkMvSC4yNjUgd2hpY2ggaW5kaWNhdGVzIHBhcmFtZXRlciBzZXRzIHNoYWxsIG5vdCBiZSBpbiBFUyAqLworCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCBNS1RBRygnYScsICd2JywgJ2MnLCAnMScpIH0sIC8qIEFWQy0xL0guMjY0ICovCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCBNS1RBRygnYScsICdpJywgJzUnLCAncCcpIH0sIC8qIEFWQy1JbnRyYSAgNTBNIDcyMHAyNC8zMC82MCAqLworICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgTUtUQUcoJ2EnLCAnaScsICc1JywgJ3EnKSB9LCAvKiBBVkMtSW50cmEgIDUwTSA3MjBwMjUvNTAgKi8KKyAgICB7IEFWX0NPREVDX0lEX0gyNjQsIE1LVEFHKCdhJywgJ2knLCAnNScsICcyJykgfSwgLyogQVZDLUludHJhICA1ME0gMTA4MHAyNS81MCAqLworICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgTUtUQUcoJ2EnLCAnaScsICc1JywgJzMnKSB9LCAvKiBBVkMtSW50cmEgIDUwTSAxMDgwcDI0LzMwLzYwICovCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCBNS1RBRygnYScsICdpJywgJzUnLCAnNScpIH0sIC8qIEFWQy1JbnRyYSAgNTBNIDEwODBpNTAgKi8KKyAgICB7IEFWX0NPREVDX0lEX0gyNjQsIE1LVEFHKCdhJywgJ2knLCAnNScsICc2JykgfSwgLyogQVZDLUludHJhICA1ME0gMTA4MGk2MCAqLworICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgTUtUQUcoJ2EnLCAnaScsICcxJywgJ3AnKSB9LCAvKiBBVkMtSW50cmEgMTAwTSA3MjBwMjQvMzAvNjAgKi8KKyAgICB7IEFWX0NPREVDX0lEX0gyNjQsIE1LVEFHKCdhJywgJ2knLCAnMScsICdxJykgfSwgLyogQVZDLUludHJhIDEwME0gNzIwcDI1LzUwICovCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCBNS1RBRygnYScsICdpJywgJzEnLCAnMicpIH0sIC8qIEFWQy1JbnRyYSAxMDBNIDEwODBwMjUvNTAgKi8KKyAgICB7IEFWX0NPREVDX0lEX0gyNjQsIE1LVEFHKCdhJywgJ2knLCAnMScsICczJykgfSwgLyogQVZDLUludHJhIDEwME0gMTA4MHAyNC8zMC82MCAqLworICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgTUtUQUcoJ2EnLCAnaScsICcxJywgJzUnKSB9LCAvKiBBVkMtSW50cmEgMTAwTSAxMDgwaTUwICovCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCBNS1RBRygnYScsICdpJywgJzEnLCAnNicpIH0sIC8qIEFWQy1JbnRyYSAxMDBNIDEwODBpNjAgKi8KKyAgICB7IEFWX0NPREVDX0lEX0gyNjQsIE1LVEFHKCdBJywgJ1YnLCAnaScsICduJykgfSwgLyogQVZDLUludHJhIHdpdGggaW1wbGljaXQgU1BTL1BQUyAqLworICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgTUtUQUcoJ2EnLCAnaScsICd2JywgJ3gnKSB9LCAvKiBYQVZDIDQ6MjoyIDEwYml0ICovCisKKyAgICB7IEFWX0NPREVDX0lEX01QRUcxVklERU8sIE1LVEFHKCdtJywgJzEnLCAndicsICcgJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUcxVklERU8sIE1LVEFHKCdtJywgJzEnLCAndicsICcxJykgfSwgLyogQXBwbGUgTVBFRy0xIENhbWNvcmRlciAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzFWSURFTywgTUtUQUcoJ20nLCAncCcsICdlJywgJ2cnKSB9LCAvKiBNUEVHICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnbScsICcyJywgJ3YnLCAnMScpIH0sIC8qIEFwcGxlIE1QRUctMiBDYW1jb3JkZXIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICcxJykgfSwgLyogTVBFRzIgSERWIDcyMHAzMCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ2gnLCAnZCcsICd2JywgJzInKSB9LCAvKiBNUEVHMiBIRFYgMTA4MGk2MCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ2gnLCAnZCcsICd2JywgJzMnKSB9LCAvKiBNUEVHMiBIRFYgMTA4MGk1MCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ2gnLCAnZCcsICd2JywgJzQnKSB9LCAvKiBNUEVHMiBIRFYgNzIwcDI0ICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnaCcsICdkJywgJ3YnLCAnNScpIH0sIC8qIE1QRUcyIEhEViA3MjBwMjUgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICc2JykgfSwgLyogTVBFRzIgSERWIDEwODBwMjQgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICc3JykgfSwgLyogTVBFRzIgSERWIDEwODBwMjUgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICc4JykgfSwgLyogTVBFRzIgSERWIDEwODBwMzAgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICc5JykgfSwgLyogTVBFRzIgSERWIDcyMHA2MCBKVkMgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICdhJykgfSwgLyogTVBFRzIgSERWIDcyMHA1MCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ20nLCAneCcsICc1JywgJ24nKSB9LCAvKiBNUEVHMiBJTVggTlRTQyA1MjUvNjAgNTBtYi9zIHByb2R1Y2VkIGJ5IEZDUCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ20nLCAneCcsICc1JywgJ3AnKSB9LCAvKiBNUEVHMiBJTVggUEFMIDYyNS81MCA1MG1iL3MgcHJvZHVjZWQgYnkgRkNQICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnbScsICd4JywgJzQnLCAnbicpIH0sIC8qIE1QRUcyIElNWCBOVFNDIDUyNS82MCA0MG1iL3MgcHJvZHVjZWQgYnkgRkNQICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnbScsICd4JywgJzQnLCAncCcpIH0sIC8qIE1QRUcyIElNWCBQQUwgNjI1LzUwIDQwbWIvcyBwcm9kdWNlZCBieSBGQ1AgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdtJywgJ3gnLCAnMycsICduJykgfSwgLyogTVBFRzIgSU1YIE5UU0MgNTI1LzYwIDMwbWIvcyBwcm9kdWNlZCBieSBGQ1AgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdtJywgJ3gnLCAnMycsICdwJykgfSwgLyogTVBFRzIgSU1YIFBBTCA2MjUvNTAgMzBtYi9zIHByb2R1Y2VkIGJ5IEZDUCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ3gnLCAnZCcsICc1JywgJzEnKSB9LCAvKiBYRENBTSBIRDQyMiA3MjBwMzAgQ0JSICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygneCcsICdkJywgJzUnLCAnNCcpIH0sIC8qIFhEQ0FNIEhENDIyIDcyMHAyNCBDQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAnNScsICc1JykgfSwgLyogWERDQU0gSEQ0MjIgNzIwcDI1IENCUiAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ3gnLCAnZCcsICc1JywgJzknKSB9LCAvKiBYRENBTSBIRDQyMiA3MjBwNjAgQ0JSICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygneCcsICdkJywgJzUnLCAnYScpIH0sIC8qIFhEQ0FNIEhENDIyIDcyMHA1MCBDQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAnNScsICdiJykgfSwgLyogWERDQU0gSEQ0MjIgMTA4MGk2MCBDQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAnNScsICdjJykgfSwgLyogWERDQU0gSEQ0MjIgMTA4MGk1MCBDQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAnNScsICdkJykgfSwgLyogWERDQU0gSEQ0MjIgMTA4MHAyNCBDQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAnNScsICdlJykgfSwgLyogWERDQU0gSEQ0MjIgMTA4MHAyNSBDQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAnNScsICdmJykgfSwgLyogWERDQU0gSEQ0MjIgMTA4MHAzMCBDQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAndicsICcxJykgfSwgLyogWERDQU0gRVggNzIwcDMwIFZCUiAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ3gnLCAnZCcsICd2JywgJzInKSB9LCAvKiBYRENBTSBIRCAxMDgwaTYwICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygneCcsICdkJywgJ3YnLCAnMycpIH0sIC8qIFhEQ0FNIEhEIDEwODBpNTAgVkJSICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygneCcsICdkJywgJ3YnLCAnNCcpIH0sIC8qIFhEQ0FNIEVYIDcyMHAyNCBWQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAndicsICc1JykgfSwgLyogWERDQU0gRVggNzIwcDI1IFZCUiAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ3gnLCAnZCcsICd2JywgJzYnKSB9LCAvKiBYRENBTSBIRCAxMDgwcDI0IFZCUiAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ3gnLCAnZCcsICd2JywgJzcnKSB9LCAvKiBYRENBTSBIRCAxMDgwcDI1IFZCUiAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ3gnLCAnZCcsICd2JywgJzgnKSB9LCAvKiBYRENBTSBIRCAxMDgwcDMwIFZCUiAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ3gnLCAnZCcsICd2JywgJzknKSB9LCAvKiBYRENBTSBFWCA3MjBwNjAgVkJSICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygneCcsICdkJywgJ3YnLCAnYScpIH0sIC8qIFhEQ0FNIEVYIDcyMHA1MCBWQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAndicsICdiJykgfSwgLyogWERDQU0gRVggMTA4MGk2MCBWQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAndicsICdjJykgfSwgLyogWERDQU0gRVggMTA4MGk1MCBWQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAndicsICdkJykgfSwgLyogWERDQU0gRVggMTA4MHAyNCBWQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAndicsICdlJykgfSwgLyogWERDQU0gRVggMTA4MHAyNSBWQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAndicsICdmJykgfSwgLyogWERDQU0gRVggMTA4MHAzMCBWQlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAnaCcsICdkJykgfSwgLyogWERDQU0gSEQgNTQwcCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ3gnLCAnZCcsICdoJywgJzInKSB9LCAvKiBYRENBTSBIRDQyMiA1NDBwICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnQScsICdWJywgJ20nLCAncCcpIH0sIC8qIEFWSUQgSU1YIFBBTCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ20nLCAncCcsICcyJywgJ3YnKSB9LCAvKiBGQ1A1ICovCisKKyAgICB7IEFWX0NPREVDX0lEX0pQRUcyMDAwLCBNS1RBRygnbScsICdqJywgJ3AnLCAnMicpIH0sIC8qIEpQRUcgMjAwMCBwcm9kdWNlZCBieSBGQ1AgKi8KKworICAgIHsgQVZfQ09ERUNfSURfVEFSR0EsIE1LVEFHKCd0JywgJ2cnLCAnYScsICcgJykgfSwgLyogVHJ1ZXZpc2lvbiBUYXJnYSAqLworICAgIHsgQVZfQ09ERUNfSURfVElGRiwgIE1LVEFHKCd0JywgJ2knLCAnZicsICdmJykgfSwgLyogVElGRiBlbWJlZGRlZCBpbiBNT1YgKi8KKyAgICB7IEFWX0NPREVDX0lEX0dJRiwgICBNS1RBRygnZycsICdpJywgJ2YnLCAnICcpIH0sIC8qIGVtYmVkZGVkIGdpZiBmaWxlcyBhcyBmcmFtZXMgKHVzdWFsbHkgb25lICJjbGljayB0byBwbGF5IG1vdmllIiBmcmFtZSkgKi8KKyAgICB7IEFWX0NPREVDX0lEX1BORywgICBNS1RBRygncCcsICduJywgJ2cnLCAnICcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QTkcsICAgTUtUQUcoJ00nLCAnTicsICdHJywgJyAnKSB9LAorCisgICAgeyBBVl9DT0RFQ19JRF9WQzEsIE1LVEFHKCd2JywgJ2MnLCAnLScsICcxJykgfSwgLyogU01QVEUgUlAgMjAyNSAqLworICAgIHsgQVZfQ09ERUNfSURfQ0FWUywgTUtUQUcoJ2EnLCAndicsICdzJywgJzInKSB9LAorCisgICAgeyBBVl9DT0RFQ19JRF9ESVJBQywgICAgIE1LVEFHKCdkJywgJ3InLCAnYScsICdjJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0ROWEhELCAgICAgTUtUQUcoJ0EnLCAnVicsICdkJywgJ24nKSB9LCAvKiBBVklEIEROeEhEICovCisgICAgeyBBVl9DT0RFQ19JRF9IMjYzLCAgICAgIE1LVEFHKCdIJywgJzInLCAnNicsICczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01TTVBFRzRWMywgTUtUQUcoJzMnLCAnSScsICdWJywgJ0QnKSB9LCAvKiAzaXZ4IERpdlggRG9jdG9yICovCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgIE1LVEFHKCdBJywgJ1YnLCAnMScsICd4JykgfSwgLyogQVZJRCAxOjF4ICovCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgIE1LVEFHKCdBJywgJ1YnLCAndScsICdwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1NHSSwgICAgICAgTUtUQUcoJ3MnLCAnZycsICdpJywgJyAnKSB9LCAvKiBTR0kgICovCisgICAgeyBBVl9DT0RFQ19JRF9EUFgsICAgICAgIE1LVEFHKCdkJywgJ3AnLCAneCcsICcgJykgfSwgLyogRFBYICovCisgICAgeyBBVl9DT0RFQ19JRF9FWFIsICAgICAgIE1LVEFHKCdlJywgJ3gnLCAncicsICcgJykgfSwgLyogT3BlbkVYUiAqLworCisgICAgeyBBVl9DT0RFQ19JRF9QUk9SRVMsIE1LVEFHKCdhJywgJ3AnLCAnYycsICdoJykgfSwgLyogQXBwbGUgUHJvUmVzIDQyMiBIaWdoIFF1YWxpdHkgKi8KKyAgICB7IEFWX0NPREVDX0lEX1BST1JFUywgTUtUQUcoJ2EnLCAncCcsICdjJywgJ24nKSB9LCAvKiBBcHBsZSBQcm9SZXMgNDIyIFN0YW5kYXJkIERlZmluaXRpb24gKi8KKyAgICB7IEFWX0NPREVDX0lEX1BST1JFUywgTUtUQUcoJ2EnLCAncCcsICdjJywgJ3MnKSB9LCAvKiBBcHBsZSBQcm9SZXMgNDIyIExUICovCisgICAgeyBBVl9DT0RFQ19JRF9QUk9SRVMsIE1LVEFHKCdhJywgJ3AnLCAnYycsICdvJykgfSwgLyogQXBwbGUgUHJvUmVzIDQyMiBQcm94eSAqLworICAgIHsgQVZfQ09ERUNfSURfUFJPUkVTLCBNS1RBRygnYScsICdwJywgJzQnLCAnaCcpIH0sIC8qIEFwcGxlIFByb1JlcyA0NDQ0ICovCisgICAgeyBBVl9DT0RFQ19JRF9GTElDLCAgIE1LVEFHKCdmJywgJ2wnLCAnaScsICdjJykgfSwKKworICAgIHsgQVZfQ09ERUNfSURfQUlDLCBNS1RBRygnaScsICdjJywgJ28nLCAnZCcpIH0sCisKKyAgICB7IEFWX0NPREVDX0lEX05PTkUsIDAgfSwKK307CisKK2NvbnN0IEFWQ29kZWNUYWcgZmZfY29kZWNfbW92YXVkaW9fdGFnc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfQUFDLCAgICAgICAgICAgICBNS1RBRygnbScsICdwJywgJzQnLCAnYScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BQzMsICAgICAgICAgICAgIE1LVEFHKCdhJywgJ2MnLCAnLScsICczJykgfSwgLyogRVRTSSBUUyAxMDIgMzY2IEFubmV4IEYgKi8KKyAgICB7IEFWX0NPREVDX0lEX0FDMywgICAgICAgICAgICAgTUtUQUcoJ3MnLCAnYScsICdjJywgJzMnKSB9LCAvKiBOZXJvIFJlY29kZSAqLworICAgIHsgQVZfQ09ERUNfSURfQURQQ01fSU1BX1FULCAgICBNS1RBRygnaScsICdtJywgJ2EnLCAnNCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BTEFDLCAgICAgICAgICAgIE1LVEFHKCdhJywgJ2wnLCAnYScsICdjJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FNUl9OQiwgICAgICAgICAgTUtUQUcoJ3MnLCAnYScsICdtJywgJ3InKSB9LCAvKiBBTVItTkIgM2dwICovCisgICAgeyBBVl9DT0RFQ19JRF9BTVJfV0IsICAgICAgICAgIE1LVEFHKCdzJywgJ2EnLCAndycsICdiJykgfSwgLyogQU1SLVdCIDNncCAqLworICAgIHsgQVZfQ09ERUNfSURfRFRTLCAgICAgICAgICAgICBNS1RBRygnZCcsICd0JywgJ3MnLCAnYycpIH0sIC8qIERUUyBmb3JtYXRzIHByaW9yIHRvIERUUy1IRCAqLworICAgIHsgQVZfQ09ERUNfSURfRFRTLCAgICAgICAgICAgICBNS1RBRygnZCcsICd0JywgJ3MnLCAnaCcpIH0sIC8qIERUUy1IRCBhdWRpbyBmb3JtYXRzICovCisgICAgeyBBVl9DT0RFQ19JRF9EVFMsICAgICAgICAgICAgIE1LVEFHKCdkJywgJ3QnLCAncycsICdsJykgfSwgLyogRFRTLUhEIExvc3NsZXNzIGZvcm1hdHMgKi8KKyAgICB7IEFWX0NPREVDX0lEX0RUUywgICAgICAgICAgICAgTUtUQUcoJ0QnLCAnVCcsICdTJywgJyAnKSB9LCAvKiBub24tc3RhbmRhcmQgKi8KKyAgICB7IEFWX0NPREVDX0lEX0VBQzMsICAgICAgICAgICAgTUtUQUcoJ2UnLCAnYycsICctJywgJzMnKSB9LCAvKiBFVFNJIFRTIDEwMiAzNjYgQW5uZXggRiAob25seSB2YWxpZCBpbiBJU09CTUZGKSAqLworICAgIHsgQVZfQ09ERUNfSURfRFZBVURJTywgICAgICAgICBNS1RBRygndicsICdkJywgJ3YnLCAnYScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9EVkFVRElPLCAgICAgICAgIE1LVEFHKCdkJywgJ3YnLCAnYycsICdhJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0dTTSwgICAgICAgICAgICAgTUtUQUcoJ2EnLCAnZycsICdzJywgJ20nKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSUxCQywgICAgICAgICAgICBNS1RBRygnaScsICdsJywgJ2InLCAnYycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NQUNFMywgICAgICAgICAgIE1LVEFHKCdNJywgJ0EnLCAnQycsICczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BQ0U2LCAgICAgICAgICAgTUtUQUcoJ00nLCAnQScsICdDJywgJzYnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVAxLCAgICAgICAgICAgICBNS1RBRygnLicsICdtJywgJ3AnLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUDIsICAgICAgICAgICAgIE1LVEFHKCcuJywgJ20nLCAncCcsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QMywgICAgICAgICAgICAgTUtUQUcoJy4nLCAnbScsICdwJywgJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVAzLCAgICAgICAgICAgICAweDZENzMwMDU1ICAgICAgICAgICAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9ORUxMWU1PU0VSLCAgICAgIE1LVEFHKCduJywgJ20nLCAnbycsICdzJykgfSwgLyogRmxhc2ggTWVkaWEgU2VydmVyICovCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fQUxBVywgICAgICAgIE1LVEFHKCdhJywgJ2wnLCAnYScsICd3JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9GMzJCRSwgICAgICAgTUtUQUcoJ2YnLCAnbCcsICczJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX0YzMkxFLCAgICAgICBNS1RBRygnZicsICdsJywgJzMnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjY0QkUsICAgICAgIE1LVEFHKCdmJywgJ2wnLCAnNicsICc0JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9GNjRMRSwgICAgICAgTUtUQUcoJ2YnLCAnbCcsICc2JywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX01VTEFXLCAgICAgICBNS1RBRygndScsICdsJywgJ2EnLCAndycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2QkUsICAgICAgIE1LVEFHKCd0JywgJ3cnLCAnbycsICdzJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMTZMRSwgICAgICAgTUtUQUcoJ3MnLCAnbycsICd3JywgJ3QnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MxNkJFLCAgICAgICBNS1RBRygnbCcsICdwJywgJ2MnLCAnbScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsICAgICAgIE1LVEFHKCdsJywgJ3AnLCAnYycsICdtJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMjRCRSwgICAgICAgTUtUQUcoJ2knLCAnbicsICcyJywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MyNExFLCAgICAgICBNS1RBRygnaScsICduJywgJzInLCAnNCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzMyQkUsICAgICAgIE1LVEFHKCdpJywgJ24nLCAnMycsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMzJMRSwgICAgICAgTUtUQUcoJ2knLCAnbicsICczJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1M4LCAgICAgICAgICBNS1RBRygncycsICdvJywgJ3cnLCAndCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fVTgsICAgICAgICAgIE1LVEFHKCdyJywgJ2EnLCAndycsICcgJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9VOCwgICAgICAgICAgTUtUQUcoJ04nLCAnTycsICdOJywgJ0UnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUUNFTFAsICAgICAgICAgICBNS1RBRygnUScsICdjJywgJ2wnLCAncCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9RQ0VMUCwgICAgICAgICAgIE1LVEFHKCdRJywgJ2MnLCAnbCcsICdxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1FDRUxQLCAgICAgICAgICAgTUtUQUcoJ3MnLCAncScsICdjJywgJ3AnKSB9LCAvKiBJU08gTWVkaWEgZm91cmNjICovCisgICAgeyBBVl9DT0RFQ19JRF9RRE0yLCAgICAgICAgICAgIE1LVEFHKCdRJywgJ0QnLCAnTScsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1FETUMsICAgICAgICAgICAgTUtUQUcoJ1EnLCAnRCcsICdNJywgJ0MnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfU1BFRVgsICAgICAgICAgICBNS1RBRygncycsICdwJywgJ2UnLCAneCcpIH0sIC8qIEZsYXNoIE1lZGlhIFNlcnZlciAqLworICAgIHsgQVZfQ09ERUNfSURfU1BFRVgsICAgICAgICAgICBNS1RBRygnUycsICdQJywgJ1gnLCAnTicpIH0sIC8qIFp5Z29BdWRpbyAocXVhbGl0eSAxMCBtb2RlKSAqLworICAgIHsgQVZfQ09ERUNfSURfV01BVjIsICAgICAgICAgICBNS1RBRygnVycsICdNJywgJ0EnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9FVlJDLCAgICAgICAgICAgIE1LVEFHKCdzJywgJ2UnLCAndicsICdjJykgfSwgLyogM0dQUDIgKi8KKyAgICB7IEFWX0NPREVDX0lEX1NNViwgICAgICAgICAgICAgTUtUQUcoJ3MnLCAncycsICdtJywgJ3YnKSB9LCAvKiAzR1BQMiAqLworICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgMCB9LAorfTsKKworY29uc3QgQVZDb2RlY1RhZyBmZl9jb2RlY19tb3ZzdWJ0aXRsZV90YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9NT1ZfVEVYVCwgTUtUQUcoJ3QnLCAnZScsICd4JywgJ3QnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTU9WX1RFWFQsIE1LVEFHKCd0JywgJ3gnLCAnMycsICdnJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0VJQV82MDgsICBNS1RBRygnYycsICc2JywgJzAnLCAnOCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAwIH0sCit9OworCisvKiBtYXAgbnVtZXJpYyBjb2RlcyBmcm9tIG1kaGQgYXRvbSB0byBJU08gNjM5ICovCisvKiBjZi4gUVRGaWxlRm9ybWF0LnBkZiBwMjUzLCBxdGZmLnBkZiBwMjA1ICovCisvKiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL21hYy9UZXh0L1RleHQtMzY4Lmh0bWwgKi8KKy8qIGRlcHJlY2F0ZWQgYnkgcHV0dGluZyB0aGUgY29kZSBhcyAzKjViaXQgYXNjaWkgKi8KK3N0YXRpYyBjb25zdCBjaGFyIG1vdl9tZGhkX2xhbmd1YWdlX21hcFtdWzRdID0geworICAgIC8qIDAtOSAqLworICAgICJlbmciLCAiZnJhIiwgImdlciIsICJpdGEiLCAiZHV0IiwgInN2ZSIsICJzcGEiLCAiZGFuIiwgInBvciIsICJub3IiLAorICAgICJoZWIiLCAianBuIiwgImFyYSIsICJmaW4iLCAiZ3JlIiwgImljZSIsICJtbHQiLCAidHVyIiwgImhyICIvKnNjciovLCAiY2hpIi8qYWNlPyovLAorICAgICJ1cmQiLCAiaGluIiwgInRoYSIsICJrb3IiLCAibGl0IiwgInBvbCIsICJodW4iLCAiZXN0IiwgImxhdiIsICAgICIiLAorICAgICJmbyAiLCAgICAiIiwgInJ1cyIsICJjaGkiLCAgICAiIiwgImlyaSIsICJhbGIiLCAicm9uIiwgImNlcyIsICJzbGsiLAorICAgICJzbHYiLCAieWlkIiwgInNyICIsICJtYWMiLCAiYnVsIiwgInVrciIsICJiZWwiLCAidXpiIiwgImtheiIsICJhemUiLAorICAgIC8qPyovCisgICAgImF6ZSIsICJhcm0iLCAiZ2VvIiwgIm1vbCIsICJraXIiLCAidGdrIiwgInR1ayIsICJtb24iLCAgICAiIiwgInB1cyIsCisgICAgImt1ciIsICJrYXMiLCAic25kIiwgInRpYiIsICJuZXAiLCAic2FuIiwgIm1hciIsICJiZW4iLCAiYXNtIiwgImd1aiIsCisgICAgInBhICIsICJvcmkiLCAibWFsIiwgImthbiIsICJ0YW0iLCAidGVsIiwgICAgIiIsICJidXIiLCAia2htIiwgImxhbyIsCisgICAgLyogICAgICAgICAgICAgICAgICAgcm9tYW4/IGFyYWJpYz8gKi8KKyAgICAidmllIiwgImluZCIsICJ0Z2wiLCAibWF5IiwgIm1heSIsICJhbWgiLCAidGlyIiwgIm9ybSIsICJzb20iLCAic3dhIiwKKyAgICAvKj09cnVuZGk/Ki8KKyAgICAgICAiIiwgInJ1biIsICAgICIiLCAibWxnIiwgImVwbyIsICAgICIiLCAgICAiIiwgICAgIiIsICAgICIiLCAgICAiIiwKKyAgICAvKiAxMDAgKi8KKyAgICAgICAiIiwgICAgIiIsICAgICIiLCAgICAiIiwgICAgIiIsICAgICIiLCAgICAiIiwgICAgIiIsICAgICIiLCAgICAiIiwKKyAgICAgICAiIiwgICAgIiIsICAgICIiLCAgICAiIiwgICAgIiIsICAgICIiLCAgICAiIiwgICAgIiIsICAgICIiLCAgICAiIiwKKyAgICAgICAiIiwgICAgIiIsICAgICIiLCAgICAiIiwgICAgIiIsICAgICIiLCAgICAiIiwgICAgIiIsICJ3ZWwiLCAiYmFxIiwKKyAgICAiY2F0IiwgImxhdCIsICJxdWUiLCAiZ3JuIiwgImF5bSIsICJ0YXQiLCAidWlnIiwgImR6byIsICJqYXYiCit9OworCitpbnQgZmZfbW92X2lzbzYzOV90b19sYW5nKGNvbnN0IGNoYXIgbGFuZ1s0XSwgaW50IG1wNCkKK3sKKyAgICBpbnQgaSwgY29kZSA9IDA7CisKKyAgICAvKiBvbGQgd2F5LCBvbmx5IGZvciBRVD8gKi8KKyAgICBmb3IgKGkgPSAwOyBsYW5nWzBdICYmICFtcDQgJiYgaSA8IEZGX0FSUkFZX0VMRU1TKG1vdl9tZGhkX2xhbmd1YWdlX21hcCk7IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcChsYW5nLCBtb3ZfbWRoZF9sYW5ndWFnZV9tYXBbaV0pKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIC8qIFhYWDpjYW4gd2UgZG8gdGhhdCBpbiBtb3YgdG9vPyAqLworICAgIGlmICghbXA0KQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogaGFuZGxlIHVuZGVmaW5lZCBhcyBzdWNoICovCisgICAgaWYgKGxhbmdbMF0gPT0gJ1wwJykKKyAgICAgICAgbGFuZyA9ICJ1bmQiOworICAgIC8qIDViaXQgYXNjaWkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgYyA9IGxhbmdbaV07CisgICAgICAgIGMgLT0gMHg2MDsKKyAgICAgICAgaWYgKGMgPiAweDFmKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjb2RlIDw8PSA1OworICAgICAgICBjb2RlIHw9IGM7CisgICAgfQorICAgIHJldHVybiBjb2RlOworfQorCitpbnQgZmZfbW92X2xhbmdfdG9faXNvNjM5KHVuc2lnbmVkIGNvZGUsIGNoYXIgdG9bNF0pCit7CisgICAgaW50IGk7CisgICAgbWVtc2V0KHRvLCAwLCA0KTsKKyAgICAvKiBpcyBpdCB0aGUgbWFuZ2xlZCBpc28gY29kZT8gKi8KKyAgICAvKiBzZWUgaHR0cDovL3d3dy5nZW9jaXRpZXMuY29tL3hoZWxtYm95eC9xdWlja3RpbWUvZm9ybWF0cy9tcDQtbGF5b3V0LnR4dCAqLworICAgIGlmIChjb2RlID49IDB4NDAwICYmIGNvZGUgIT0gMHg3ZmZmKSB7CisgICAgICAgIGZvciAoaSA9IDI7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICB0b1tpXSA9IDB4NjAgKyAoY29kZSAmIDB4MWYpOworICAgICAgICAgICAgY29kZSA+Pj0gNTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogb2xkIGZhc2hpb24gYXBwbGUgbGFuZyBjb2RlICovCisgICAgaWYgKGNvZGUgPj0gRkZfQVJSQVlfRUxFTVMobW92X21kaGRfbGFuZ3VhZ2VfbWFwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFtb3ZfbWRoZF9sYW5ndWFnZV9tYXBbY29kZV1bMF0pCisgICAgICAgIHJldHVybiAwOworICAgIG1lbWNweSh0bywgbW92X21kaGRfbGFuZ3VhZ2VfbWFwW2NvZGVdLCA0KTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IGZmX21wNF9yZWFkX2Rlc2NyX2xlbihBVklPQ29udGV4dCAqcGIpCit7CisgICAgaW50IGxlbiA9IDA7CisgICAgaW50IGNvdW50ID0gNDsKKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICBpbnQgYyA9IGF2aW9fcjgocGIpOworICAgICAgICBsZW4gPSAobGVuIDw8IDcpIHwgKGMgJiAweDdmKTsKKyAgICAgICAgaWYgKCEoYyAmIDB4ODApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKK2ludCBmZl9tcDRfcmVhZF9kZXNjcihBVkZvcm1hdENvbnRleHQgKmZjLCBBVklPQ29udGV4dCAqcGIsIGludCAqdGFnKQoreworICAgIGludCBsZW47CisgICAgKnRhZyA9IGF2aW9fcjgocGIpOworICAgIGxlbiA9IGZmX21wNF9yZWFkX2Rlc2NyX2xlbihwYik7CisgICAgYXZfZGxvZyhmYywgIk1QRUc0IGRlc2NyaXB0aW9uOiB0YWc9MHglMDJ4IGxlbj0lZFxuIiwgKnRhZywgbGVuKTsKKyAgICByZXR1cm4gbGVuOworfQorCit2b2lkIGZmX21wNF9wYXJzZV9lc19kZXNjcihBVklPQ29udGV4dCAqcGIsIGludCAqZXNfaWQpCit7CisgICAgIGludCBmbGFnczsKKyAgICAgaWYgKGVzX2lkKSAqZXNfaWQgPSBhdmlvX3JiMTYocGIpOworICAgICBlbHNlICAgICAgICAgICAgICAgIGF2aW9fcmIxNihwYik7CisgICAgIGZsYWdzID0gYXZpb19yOChwYik7CisgICAgIGlmIChmbGFncyAmIDB4ODApIC8vc3RyZWFtRGVwZW5kZW5jZUZsYWcKKyAgICAgICAgIGF2aW9fcmIxNihwYik7CisgICAgIGlmIChmbGFncyAmIDB4NDApIHsgLy9VUkxfRmxhZworICAgICAgICAgaW50IGxlbiA9IGF2aW9fcjgocGIpOworICAgICAgICAgYXZpb19za2lwKHBiLCBsZW4pOworICAgICB9CisgICAgIGlmIChmbGFncyAmIDB4MjApIC8vT0NSc3RyZWFtRmxhZworICAgICAgICAgYXZpb19yYjE2KHBiKTsKK30KKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgbXA0X2F1ZGlvX3R5cGVzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9NUDNPTjQsIEFPVF9QUyAgIH0sIC8qIG9sZCBtcDNvbjQgZHJhZnQgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QM09ONCwgQU9UX0wxICAgfSwgLyogbGF5ZXIgMSAqLworICAgIHsgQVZfQ09ERUNfSURfTVAzT040LCBBT1RfTDIgICB9LCAvKiBsYXllciAyICovCisgICAgeyBBVl9DT0RFQ19JRF9NUDNPTjQsIEFPVF9MMyAgIH0sIC8qIGxheWVyIDMgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QNEFMUywgQU9UX0FMUyAgfSwgLyogTVBFRy00IEFMUyAqLworICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICBBT1RfTlVMTCB9LAorfTsKKworaW50IGZmX21wNF9yZWFkX2RlY19jb25maWdfZGVzY3IoQVZGb3JtYXRDb250ZXh0ICpmYywgQVZTdHJlYW0gKnN0LCBBVklPQ29udGV4dCAqcGIpCit7CisgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQ7CisgICAgaW50IGxlbiwgdGFnOworICAgIGludCByZXQ7CisgICAgaW50IG9iamVjdF90eXBlX2lkID0gYXZpb19yOChwYik7CisgICAgYXZpb19yOChwYik7IC8qIHN0cmVhbSB0eXBlICovCisgICAgYXZpb19yYjI0KHBiKTsgLyogYnVmZmVyIHNpemUgZGIgKi8KKyAgICBhdmlvX3JiMzIocGIpOyAvKiBtYXggYml0cmF0ZSAqLworICAgIGF2aW9fcmIzMihwYik7IC8qIGF2ZyBiaXRyYXRlICovCisKKyAgICBpZihhdmNvZGVjX2lzX29wZW4oc3QtPmNvZGVjKSkgeworICAgICAgICBhdl9sb2coZmMsIEFWX0xPR19ERUJVRywgImNvZGVjIG9wZW4gaW4gcmVhZF9kZWNfY29uZmlnX2Rlc2NyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGNvZGVjX2lkPSBmZl9jb2RlY19nZXRfaWQoZmZfbXA0X29ial90eXBlLCBvYmplY3RfdHlwZV9pZCk7CisgICAgaWYgKGNvZGVjX2lkKQorICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkPSBjb2RlY19pZDsKKyAgICBhdl9kbG9nKGZjLCAiZXNkcyBvYmplY3QgdHlwZSBpZCAweCUwMnhcbiIsIG9iamVjdF90eXBlX2lkKTsKKyAgICBsZW4gPSBmZl9tcDRfcmVhZF9kZXNjcihmYywgcGIsICZ0YWcpOworICAgIGlmICh0YWcgPT0gTVA0RGVjU3BlY2lmaWNEZXNjclRhZykgeworICAgICAgICBhdl9kbG9nKGZjLCAiU3BlY2lmaWMgTVBFRzQgaGVhZGVyIGxlbj0lZFxuIiwgbGVuKTsKKyAgICAgICAgaWYgKCFsZW4gfHwgKHVpbnQ2NF90KWxlbiA+ICgxPDwzMCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGF2X2ZyZWUoc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgbGVuKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgICAgICBNUEVHNEF1ZGlvQ29uZmlnIGNmZyA9IHswfTsKKyAgICAgICAgICAgIGF2cHJpdl9tcGVnNGF1ZGlvX2dldF9jb25maWcoJmNmZywgc3QtPmNvZGVjLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgKiA4LCAxKTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBjZmcuY2hhbm5lbHM7CisgICAgICAgICAgICBpZiAoY2ZnLm9iamVjdF90eXBlID09IDI5ICYmIGNmZy5zYW1wbGluZ19pbmRleCA8IDMpIC8vIG9sZCBtcDNvbjQKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZwcml2X21wYV9mcmVxX3RhYltjZmcuc2FtcGxpbmdfaW5kZXhdOworICAgICAgICAgICAgZWxzZSBpZiAoY2ZnLmV4dF9zYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gY2ZnLmV4dF9zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gY2ZnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgYXZfZGxvZyhmYywgIm1wNGEgY29uZmlnIGNoYW5uZWxzICVkIG9iaiAlZCBleHQgb2JqICVkICIKKyAgICAgICAgICAgICAgICAgICAgInNhbXBsZSByYXRlICVkIGV4dCBzYW1wbGUgcmF0ZSAlZFxuIiwgc3QtPmNvZGVjLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgY2ZnLm9iamVjdF90eXBlLCBjZmcuZXh0X29iamVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICBjZmcuc2FtcGxlX3JhdGUsIGNmZy5leHRfc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgaWYgKCEoc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChtcDRfYXVkaW9fdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5vYmplY3RfdHlwZSkpKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BQUM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IE1vdkNoYW5uZWxMYXlvdXQgeworICAgIGludDY0X3QgIGNoYW5uZWxfbGF5b3V0OworICAgIHVpbnQzMl90IGxheW91dF90YWc7Cit9IE1vdkNoYW5uZWxMYXlvdXQ7CisKK3N0YXRpYyBjb25zdCBNb3ZDaGFubmVsTGF5b3V0IG1vdl9jaGFubmVsX2xheW91dFtdID0geworICAgIHsgQVZfQ0hfTEFZT1VUX01PTk8sICAgICAgICAgICAgICAgICAgICAgICAgICgxMDA8PDE2KSB8IDF9LCAvLyBrQ0FGQ2hhbm5lbExheW91dFRhZ19Nb25vCisgICAgeyBBVl9DSF9MQVlPVVRfU1RFUkVPLCAgICAgICAgICAgICAgICAgICAgICAgKDEwMTw8MTYpIHwgMn0sIC8vIGtDQUZDaGFubmVsTGF5b3V0VGFnX1N0ZXJlbworICAgIHsgQVZfQ0hfTEFZT1VUX1NURVJFTywgICAgICAgICAgICAgICAgICAgICAgICgxMDI8PDE2KSB8IDJ9LCAvLyBrQ0FGQ2hhbm5lbExheW91dFRhZ19TdGVyZW9IZWFkcGhvbmVzCisgICAgeyBBVl9DSF9MQVlPVVRfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgKDEzMTw8MTYpIHwgM30sIC8vIGtDQUZDaGFubmVsTGF5b3V0VGFnX0lUVV8yXzEKKyAgICB7IEFWX0NIX0xBWU9VVF9RVUFELCAgICAgICAgICAgICAgICAgICAgICAgICAoMTMyPDwxNikgfCA0fSwgLy8ga0NBRkNoYW5uZWxMYXlvdXRUYWdfSVRVXzJfMgorICAgIHsgQVZfQ0hfTEFZT1VUXzJfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICgxMzI8PDE2KSB8IDR9LCAvLyBrQ0FGQ2hhbm5lbExheW91dFRhZ19JVFVfMl8yCisgICAgeyBBVl9DSF9MQVlPVVRfUVVBRCwgICAgICAgICAgICAgICAgICAgICAgICAgKDEwODw8MTYpIHwgNH0sIC8vIGtDQUZDaGFubmVsTGF5b3V0VGFnX1F1YWRyYXBob25pYworICAgIHsgQVZfQ0hfTEFZT1VUX1NVUlJPVU5ELCAgICAgICAgICAgICAgICAgICAgICgxMTM8PDE2KSB8IDN9LCAvLyBrQ0FGQ2hhbm5lbExheW91dFRhZ19NUEVHXzNfMF9BCisgICAgeyBBVl9DSF9MQVlPVVRfNFBPSU5UMCwgICAgICAgICAgICAgICAgICAgICAgKDExNTw8MTYpIHwgNH0sIC8vIGtDQUZDaGFubmVsTGF5b3V0VGFnX01QRUdfNF8wX0EKKyAgICB7IEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0ssICAgICAgICAgICAgICAgICAoMTE3PDwxNikgfCA1fSwgLy8ga0NBRkNoYW5uZWxMYXlvdXRUYWdfTVBFR181XzBfQQorICAgIHsgQVZfQ0hfTEFZT1VUXzVQT0lOVDAsICAgICAgICAgICAgICAgICAgICAgICgxMTc8PDE2KSB8IDV9LCAvLyBrQ0FGQ2hhbm5lbExheW91dFRhZ19NUEVHXzVfMF9BCisgICAgeyBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLLCAgICAgICAgICAgICAgICAgKDEyMTw8MTYpIHwgNn0sIC8vIGtDQUZDaGFubmVsTGF5b3V0VGFnX01QRUdfNV8xX0EKKyAgICB7IEFWX0NIX0xBWU9VVF81UE9JTlQxLCAgICAgICAgICAgICAgICAgICAgICAoMTIxPDwxNikgfCA2fSwgLy8ga0NBRkNoYW5uZWxMYXlvdXRUYWdfTVBFR181XzFfQQorICAgIHsgQVZfQ0hfTEFZT1VUXzdQT0lOVDEsICAgICAgICAgICAgICAgICAgICAgICgxMjg8PDE2KSB8IDh9LCAvLyBrQ0FGQ2hhbm5lbExheW91dFRhZ19NUEVHXzdfMV9DCisgICAgeyBBVl9DSF9MQVlPVVRfN1BPSU5UMV9XSURFLCAgICAgICAgICAgICAgICAgKDEyNjw8MTYpIHwgOH0sIC8vIGtDQUZDaGFubmVsTGF5b3V0VGFnX01QRUdfN18xX0EKKyAgICB7IEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0t8QVZfQ0hfTEFZT1VUX1NURVJFT19ET1dOTUlYLCAoMTMwPDwxNikgfCA4fSwgLy8ga0NBRkNoYW5uZWxMYXlvdXRUYWdfU01QVEVfRFRWCisgICAgeyBBVl9DSF9MQVlPVVRfU1RFUkVPfEFWX0NIX0xPV19GUkVRVUVOQ1ksICAgKDEzMzw8MTYpIHwgM30sIC8vIGtDQUZDaGFubmVsTGF5b3V0VGFnX0RWRF80CisgICAgeyBBVl9DSF9MQVlPVVRfMl8xfEFWX0NIX0xPV19GUkVRVUVOQ1ksICAgICAgKDEzNDw8MTYpIHwgNH0sIC8vIGtDQUZDaGFubmVsTGF5b3V0VGFnX0RWRF81CisgICAgeyBBVl9DSF9MQVlPVVRfUVVBRHxBVl9DSF9MT1dfRlJFUVVFTkNZLCAgICAgKDEzNTw8MTYpIHwgNH0sIC8vIGtDQUZDaGFubmVsTGF5b3V0VGFnX0RWRF82CisgICAgeyBBVl9DSF9MQVlPVVRfMl8yfEFWX0NIX0xPV19GUkVRVUVOQ1ksICAgICAgKDEzNTw8MTYpIHwgNH0sIC8vIGtDQUZDaGFubmVsTGF5b3V0VGFnX0RWRF82CisgICAgeyBBVl9DSF9MQVlPVVRfU1VSUk9VTkR8QVZfQ0hfTE9XX0ZSRVFVRU5DWSwgKDEzNjw8MTYpIHwgNH0sIC8vIGtDQUZDaGFubmVsTGF5b3V0VGFnX0RWRF8xMAorICAgIHsgQVZfQ0hfTEFZT1VUXzRQT0lOVDB8QVZfQ0hfTE9XX0ZSRVFVRU5DWSwgICgxMzc8PDE2KSB8IDV9LCAvLyBrQ0FGQ2hhbm5lbExheW91dFRhZ19EVkRfMTEKKyAgICB7IDAsIDB9LAorfTsKKyNpZiAwCitpbnQgZmZfbW92X3JlYWRfY2hhbihBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgaW50NjRfdCBzaXplKQoreworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYz0gc3QtPmNvZGVjOworICAgIHVpbnQzMl90IGxheW91dF90YWc7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgY29uc3QgTW92Q2hhbm5lbExheW91dCAqbGF5b3V0cyA9IG1vdl9jaGFubmVsX2xheW91dDsKKworICAgIGlmIChzaXplIDwgMTIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgbGF5b3V0X3RhZyA9IGF2aW9fcmIzMihwYik7CisgICAgc2l6ZSAtPSA0OworICAgIGlmIChsYXlvdXRfdGFnID09IDApIHsgLy8ga0NBRkNoYW5uZWxMYXlvdXRUYWdfVXNlQ2hhbm5lbERlc2NyaXB0aW9ucworICAgICAgICAvLyBDaGFubmVsIGRlc2NyaXB0aW9ucyBub3QgaW1wbGVtZW50ZWQKKyAgICAgICAgYXZfbG9nX2Fza19mb3Jfc2FtcGxlKHMsICJVbmltcGxlbWVudGVkIGNvbnRhaW5lciBjaGFubmVsIGxheW91dC5cbiIpOworICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGxheW91dF90YWcgPT0gMHgxMDAwMCkgeyAvLyBrQ0FGQ2hhbm5lbExheW91dFRhZ19Vc2VDaGFubmVsQml0bWFwCisgICAgICAgIGNvZGVjLT5jaGFubmVsX2xheW91dCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIHNpemUgLT0gNDsKKyAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHdoaWxlIChsYXlvdXRzLT5jaGFubmVsX2xheW91dCkgeworICAgICAgICBpZiAobGF5b3V0X3RhZyA9PSBsYXlvdXRzLT5sYXlvdXRfdGFnKSB7CisgICAgICAgICAgICBjb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBsYXlvdXRzLT5jaGFubmVsX2xheW91dDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGxheW91dHMrKzsKKyAgICB9CisgICAgaWYgKCFjb2RlYy0+Y2hhbm5lbF9sYXlvdXQpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVua25vd24gY29udGFpbmVyIGNoYW5uZWwgbGF5b3V0LlxuIik7CisgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3ZvaWQgZmZfbW92X3dyaXRlX2NoYW4oQVZJT0NvbnRleHQgKnBiLCBpbnQ2NF90IGNoYW5uZWxfbGF5b3V0KQoreworICAgIGNvbnN0IE1vdkNoYW5uZWxMYXlvdXQgKmxheW91dHM7CisgICAgdWludDMyX3QgbGF5b3V0X3RhZyA9IDA7CisKKyAgICBmb3IgKGxheW91dHMgPSBtb3ZfY2hhbm5lbF9sYXlvdXQ7IGxheW91dHMtPmNoYW5uZWxfbGF5b3V0OyBsYXlvdXRzKyspCisgICAgICAgIGlmIChjaGFubmVsX2xheW91dCA9PSBsYXlvdXRzLT5jaGFubmVsX2xheW91dCkgeworICAgICAgICAgICAgbGF5b3V0X3RhZyA9IGxheW91dHMtPmxheW91dF90YWc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgaWYgKGxheW91dF90YWcpIHsKKyAgICAgICAgYXZpb193YjMyKHBiLCBsYXlvdXRfdGFnKTsgLy8gbUNoYW5uZWxMYXlvdXRUYWcKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgLy8gbUNoYW5uZWxCaXRtYXAKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3diMzIocGIsIDB4MTAwMDApOyAgICAvLyBrQ0FGQ2hhbm5lbExheW91dFRhZ19Vc2VDaGFubmVsQml0bWFwCisgICAgICAgIGF2aW9fd2IzMihwYiwgY2hhbm5lbF9sYXlvdXQpOworICAgIH0KKyAgICBhdmlvX3diMzIocGIsIDApOyAgICAgICAgICAgICAgLy8gbU51bWJlckNoYW5uZWxEZXNjcmlwdGlvbnMKK30KKworY29uc3Qgc3RydWN0IEFWQ29kZWNUYWcgKmF2Zm9ybWF0X2dldF9tb3ZfdmlkZW9fdGFncyh2b2lkKQoreworICAgIHJldHVybiBmZl9jb2RlY19tb3Z2aWRlb190YWdzOworfQorCitjb25zdCBzdHJ1Y3QgQVZDb2RlY1RhZyAqYXZmb3JtYXRfZ2V0X21vdl9hdWRpb190YWdzKHZvaWQpCit7CisgICAgcmV0dXJuIGZmX2NvZGVjX21vdmF1ZGlvX3RhZ3M7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaXNvbS5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lzb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzE2MGQwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lzb20uaApAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIElTTyBNZWRpYSBjb21tb24gY29kZQorICogY29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogY29weXJpZ2h0IChjKSAyMDAyIEZyYW5jb2lzIFJldm9sIDxyZXZvbEBmcmVlLmZyPgorICogY29weXJpZ2h0IChjKSAyMDA2IEJhcHRpc3RlIENvdWR1cmllciA8YmFwdGlzdGUuY291ZHVyaWVyQGZyZWUuZnI+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfSVNPTV9ICisjZGVmaW5lIEFWRk9STUFUX0lTT01fSAorCisjaW5jbHVkZSAiYXZpby5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZHYuaCIKKworLyogaXNvbS5jICovCitleHRlcm4gY29uc3QgQVZDb2RlY1RhZyBmZl9tcDRfb2JqX3R5cGVbXTsKK2V4dGVybiBjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX21vdnZpZGVvX3RhZ3NbXTsKK2V4dGVybiBjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX21vdmF1ZGlvX3RhZ3NbXTsKK2V4dGVybiBjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX21vdnN1YnRpdGxlX3RhZ3NbXTsKKworaW50IGZmX21vdl9pc282MzlfdG9fbGFuZyhjb25zdCBjaGFyIGxhbmdbNF0sIGludCBtcDQpOworaW50IGZmX21vdl9sYW5nX3RvX2lzbzYzOSh1bnNpZ25lZCBjb2RlLCBjaGFyIHRvWzRdKTsKKworLyogdGhlIFF1aWNrVGltZSBmaWxlIGZvcm1hdCBpcyBxdWl0ZSBjb252b2x1dGVkLi4uCisgKiBpdCBoYXMgbG90cyBvZiBpbmRleCB0YWJsZXMsIGVhY2ggaW5kZXhpbmcgc29tZXRoaW5nIGluIGFub3RoZXIgb25lLi4uCisgKiBIZXJlIHdlIGp1c3QgdXNlIHdoYXQgaXMgbmVlZGVkIHRvIHJlYWQgdGhlIGNodW5rcworICovCisKK3R5cGVkZWYgc3RydWN0IE1PVlN0dHMgeworICAgIGludCBjb3VudDsKKyAgICBpbnQgZHVyYXRpb247Cit9IE1PVlN0dHM7CisKK3R5cGVkZWYgc3RydWN0IE1PVlN0c2MgeworICAgIGludCBmaXJzdDsKKyAgICBpbnQgY291bnQ7CisgICAgaW50IGlkOworfSBNT1ZTdHNjOworCit0eXBlZGVmIHN0cnVjdCBNT1ZEcmVmIHsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNoYXIgKnBhdGg7CisgICAgY2hhciAqZGlyOworICAgIGNoYXIgdm9sdW1lWzI4XTsKKyAgICBjaGFyIGZpbGVuYW1lWzY0XTsKKyAgICBpbnQxNl90IG5sdmxfdG8sIG5sdmxfZnJvbTsKK30gTU9WRHJlZjsKKwordHlwZWRlZiBzdHJ1Y3QgTU9WQXRvbSB7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBpbnQ2NF90IHNpemU7IC8qIHRvdGFsIHNpemUgKGV4Y2x1ZGluZyB0aGUgc2l6ZSBhbmQgdHlwZSBmaWVsZHMpICovCit9IE1PVkF0b207CisKK3N0cnVjdCBNT1ZQYXJzZVRhYmxlRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IE1PVkZyYWdtZW50IHsKKyAgICB1bnNpZ25lZCB0cmFja19pZDsKKyAgICB1aW50NjRfdCBiYXNlX2RhdGFfb2Zmc2V0OworICAgIHVpbnQ2NF90IG1vb2Zfb2Zmc2V0OworICAgIHVpbnQ2NF90IGltcGxpY2l0X29mZnNldDsKKyAgICB1bnNpZ25lZCBzdHNkX2lkOworICAgIHVuc2lnbmVkIGR1cmF0aW9uOworICAgIHVuc2lnbmVkIHNpemU7CisgICAgdW5zaWduZWQgZmxhZ3M7CisgICAgaW50NjRfdCB0aW1lOworfSBNT1ZGcmFnbWVudDsKKwordHlwZWRlZiBzdHJ1Y3QgTU9WVHJhY2tFeHQgeworICAgIHVuc2lnbmVkIHRyYWNrX2lkOworICAgIHVuc2lnbmVkIHN0c2RfaWQ7CisgICAgdW5zaWduZWQgZHVyYXRpb247CisgICAgdW5zaWduZWQgc2l6ZTsKKyAgICB1bnNpZ25lZCBmbGFnczsKK30gTU9WVHJhY2tFeHQ7CisKK3R5cGVkZWYgc3RydWN0IE1PVlNiZ3AgeworICAgIHVuc2lnbmVkIGludCBjb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Cit9IE1PVlNiZ3A7CisKK3R5cGVkZWYgc3RydWN0IE1PVkZyYWdtZW50SW5kZXhJdGVtIHsKKyAgICBpbnQ2NF90IG1vb2Zfb2Zmc2V0OworICAgIGludDY0X3QgdGltZTsKK30gTU9WRnJhZ21lbnRJbmRleEl0ZW07CisKK3R5cGVkZWYgc3RydWN0IE1PVkZyYWdtZW50SW5kZXggeworICAgIHVuc2lnbmVkIHRyYWNrX2lkOworICAgIHVuc2lnbmVkIGl0ZW1fY291bnQ7CisgICAgdW5zaWduZWQgY3VycmVudF9pdGVtOworICAgIE1PVkZyYWdtZW50SW5kZXhJdGVtICppdGVtczsKK30gTU9WRnJhZ21lbnRJbmRleDsKKwordHlwZWRlZiBzdHJ1Y3QgTU9WU3RyZWFtQ29udGV4dCB7CisgICAgQVZJT0NvbnRleHQgKnBiOworICAgIGludCBwYl9pc19jb3BpZWQ7CisgICAgaW50IGZmaW5kZXg7ICAgICAgICAgIC8vLzwgQVZTdHJlYW0gaW5kZXgKKyAgICBpbnQgbmV4dF9jaHVuazsKKyAgICB1bnNpZ25lZCBpbnQgY2h1bmtfY291bnQ7CisgICAgaW50NjRfdCAqY2h1bmtfb2Zmc2V0czsKKyAgICB1bnNpZ25lZCBpbnQgc3R0c19jb3VudDsKKyAgICBNT1ZTdHRzICpzdHRzX2RhdGE7CisgICAgdW5zaWduZWQgaW50IGN0dHNfY291bnQ7CisgICAgTU9WU3R0cyAqY3R0c19kYXRhOworICAgIHVuc2lnbmVkIGludCBzdHNjX2NvdW50OworICAgIE1PVlN0c2MgKnN0c2NfZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgc3Rwc19jb3VudDsKKyAgICB1bnNpZ25lZCAqc3Rwc19kYXRhOyAgLy8vPCBwYXJ0aWFsIHN5bmMgc2FtcGxlIGZvciBtcGVnLTIgb3BlbiBnb3AKKyAgICBpbnQgY3R0c19pbmRleDsKKyAgICBpbnQgY3R0c19zYW1wbGU7CisgICAgdW5zaWduZWQgaW50IHNhbXBsZV9zaXplOyAvLy88IG1heSBjb250YWluIHZhbHVlIGNhbGN1bGF0ZWQgZnJvbSBzdHNkIG9yIHZhbHVlIGZyb20gc3RzeiBhdG9tCisgICAgdW5zaWduZWQgaW50IHN0c3pfc2FtcGxlX3NpemU7IC8vLzwgYWx3YXlzIGNvbnRhaW5zIHNhbXBsZSBzaXplIGZyb20gc3RzeiBhdG9tCisgICAgdW5zaWduZWQgaW50IHNhbXBsZV9jb3VudDsKKyAgICBpbnQgKnNhbXBsZV9zaXplczsKKyAgICBpbnQga2V5ZnJhbWVfYWJzZW50OworICAgIHVuc2lnbmVkIGludCBrZXlmcmFtZV9jb3VudDsKKyAgICBpbnQgKmtleWZyYW1lczsKKyAgICBpbnQgdGltZV9zY2FsZTsKKyAgICBpbnQ2NF90IGVtcHR5X2R1cmF0aW9uOyAvLy88IGVtcHR5IGR1cmF0aW9uIG9mIHRoZSBmaXJzdCBlZGl0IGxpc3QgZW50cnkKKyAgICBpbnQ2NF90IHN0YXJ0X3RpbWU7ICAgLy8vPCBzdGFydCB0aW1lIG9mIHRoZSBtZWRpYQorICAgIGludDY0X3QgdGltZV9vZmZzZXQ7ICAvLy88IHRpbWUgb2Zmc2V0IG9mIHRoZSBlZGl0IGxpc3QgZW50cmllcworICAgIGludCBjdXJyZW50X3NhbXBsZTsKKyAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfcGVyX2ZyYW1lOworICAgIHVuc2lnbmVkIGludCBzYW1wbGVzX3Blcl9mcmFtZTsKKyAgICBpbnQgZHZfYXVkaW9fY29udGFpbmVyOworICAgIGludCBwc2V1ZG9fc3RyZWFtX2lkOyAvLy88IC0xIG1lYW5zIGRlbXV4IGFsbCBpZHMKKyAgICBpbnQxNl90IGF1ZGlvX2NpZDsgICAgLy8vPCBzdHNkIGF1ZGlvIGNvbXByZXNzaW9uIGlkCisgICAgdW5zaWduZWQgZHJlZnNfY291bnQ7CisgICAgTU9WRHJlZiAqZHJlZnM7CisgICAgaW50IGRyZWZfaWQ7CisgICAgaW50IHRpbWVjb2RlX3RyYWNrOworICAgIGludCB3cm9uZ19kdHM7ICAgICAgICAvLy88IGR0cyBhcmUgd3JvbmcgZHVlIHRvIGh1Z2UgY3R0cyBvZmZzZXQgKGlNb3ZpZSBmaWxlcykKKyAgICBpbnQgd2lkdGg7ICAgICAgICAgICAgLy8vPCB0a2hkIHdpZHRoCisgICAgaW50IGhlaWdodDsgICAgICAgICAgIC8vLzwgdGtoZCBoZWlnaHQKKyAgICBpbnQgZHRzX3NoaWZ0OyAgICAgICAgLy8vPCBkdHMgc2hpZnQgd2hlbiBjdHRzIGlzIG5lZ2F0aXZlCisgICAgdWludDMyX3QgcGFsZXR0ZVsyNTZdOworICAgIGludCBoYXNfcGFsZXR0ZTsKKyAgICBpbnQ2NF90IGRhdGFfc2l6ZTsKKyAgICB1aW50MzJfdCB0bWNkX2ZsYWdzOyAgLy8vPCB0bWNkIHRyYWNrIGZsYWdzCisgICAgaW50NjRfdCB0cmFja19lbmQ7ICAgIC8vLzwgdXNlZCBmb3IgZHRzIGdlbmVyYXRpb24gaW4gZnJhZ21lbnRlZCBtb3ZpZSBmaWxlcworICAgIGludCBzdGFydF9wYWQ7ICAgICAgICAvLy88IGFtb3VudCBvZiBzYW1wbGVzIHRvIHNraXAgZHVlIHRvIGVuYy1kZWMgZGVsYXkKKyAgICB1bnNpZ25lZCBpbnQgcmFwX2dyb3VwX2NvdW50OworICAgIE1PVlNiZ3AgKnJhcF9ncm91cDsKKworICAgIGludCBuYl9mcmFtZXNfZm9yX2ZwczsKKyAgICBpbnQ2NF90IGR1cmF0aW9uX2Zvcl9mcHM7CisKKyAgICBpbnQzMl90ICpkaXNwbGF5X21hdHJpeDsKK30gTU9WU3RyZWFtQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgTU9WQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7IC8vLzwgY2xhc3MgZm9yIHByaXZhdGUgb3B0aW9ucworICAgIEFWRm9ybWF0Q29udGV4dCAqZmM7CisgICAgaW50IHRpbWVfc2NhbGU7CisgICAgaW50NjRfdCBkdXJhdGlvbjsgICAgIC8vLzwgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3QgdHJhY2sKKyAgICBpbnQgZm91bmRfbW9vdjsgICAgICAgLy8vPCAnbW9vdicgYXRvbSBoYXMgYmVlbiBmb3VuZAorICAgIGludCBmb3VuZF9tZGF0OyAgICAgICAvLy88ICdtZGF0JyBhdG9tIGhhcyBiZWVuIGZvdW5kCisgICAgRFZEZW11eENvbnRleHQgKmR2X2RlbXV4OworICAgIEFWRm9ybWF0Q29udGV4dCAqZHZfZmN0eDsKKyAgICBpbnQgaXNvbTsgICAgICAgICAgICAgLy8vPCAxIGlmIGZpbGUgaXMgSVNPIE1lZGlhIChtcDQvM2dwKQorICAgIE1PVkZyYWdtZW50IGZyYWdtZW50OyAvLy88IGN1cnJlbnQgZnJhZ21lbnQgaW4gbW9vZiBhdG9tCisgICAgTU9WVHJhY2tFeHQgKnRyZXhfZGF0YTsKKyAgICB1bnNpZ25lZCB0cmV4X2NvdW50OworICAgIGludCBpdHVuZXNfbWV0YWRhdGE7ICAvLy88IG1ldGFkYXRhIGFyZSBpdHVuZXMgc3R5bGUKKyAgICBpbnQgY2hhcHRlcl90cmFjazsKKyAgICBpbnQgdXNlX2Fic29sdXRlX3BhdGg7CisgICAgaW50IGlnbm9yZV9lZGl0bGlzdDsKKyAgICBpbnQ2NF90IG5leHRfcm9vdF9hdG9tOyAvLy88IG9mZnNldCBvZiB0aGUgbmV4dCByb290IGF0b20KKyAgICBpbnQgZXhwb3J0X2FsbDsKKyAgICBpbnQgKmJpdHJhdGVzOyAgICAgICAgICAvLy88IGJpdHJhdGVzIHJlYWQgYmVmb3JlIHN0cmVhbXMgY3JlYXRpb24KKyAgICBpbnQgYml0cmF0ZXNfY291bnQ7CisgICAgaW50IG1vb3ZfcmV0cnk7CisgICAgaW50IHVzZV9tZnJhX2ZvcjsKKyAgICBpbnQgaGFzX2xvb2tlZF9mb3JfbWZyYTsKKyAgICBNT1ZGcmFnbWVudEluZGV4KiogZnJhZ21lbnRfaW5kZXhfZGF0YTsKKyAgICB1bnNpZ25lZCBmcmFnbWVudF9pbmRleF9jb3VudDsKK30gTU9WQ29udGV4dDsKKworaW50IGZmX21wNF9yZWFkX2Rlc2NyX2xlbihBVklPQ29udGV4dCAqcGIpOworaW50IGZmX21wNF9yZWFkX2Rlc2NyKEFWRm9ybWF0Q29udGV4dCAqZmMsIEFWSU9Db250ZXh0ICpwYiwgaW50ICp0YWcpOworaW50IGZmX21wNF9yZWFkX2RlY19jb25maWdfZGVzY3IoQVZGb3JtYXRDb250ZXh0ICpmYywgQVZTdHJlYW0gKnN0LCBBVklPQ29udGV4dCAqcGIpOwordm9pZCBmZl9tcDRfcGFyc2VfZXNfZGVzY3IoQVZJT0NvbnRleHQgKnBiLCBpbnQgKmVzX2lkKTsKKworI2RlZmluZSBNUDRPRGVzY3JUYWcgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTVA0SU9EZXNjclRhZyAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIE1QNEVTRGVzY3JUYWcgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBNUDREZWNDb25maWdEZXNjclRhZyAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTVA0RGVjU3BlY2lmaWNEZXNjclRhZyAgICAgICAgICAweDA1CisjZGVmaW5lIE1QNFNMRGVzY3JUYWcgICAgICAgICAgICAgICAgICAgMHgwNgorCisjZGVmaW5lIE1PVl9URkhEX0JBU0VfREFUQV9PRkZTRVQgICAgICAgMHgwMQorI2RlZmluZSBNT1ZfVEZIRF9TVFNEX0lEICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTU9WX1RGSERfREVGQVVMVF9EVVJBVElPTiAgICAgICAweDA4CisjZGVmaW5lIE1PVl9URkhEX0RFRkFVTFRfU0laRSAgICAgICAgICAgMHgxMAorI2RlZmluZSBNT1ZfVEZIRF9ERUZBVUxUX0ZMQUdTICAgICAgICAgIDB4MjAKKyNkZWZpbmUgTU9WX1RGSERfRFVSQVRJT05fSVNfRU1QVFkgIDB4MDEwMDAwCisjZGVmaW5lIE1PVl9URkhEX0RFRkFVTFRfQkFTRV9JU19NT09GIDB4MDIwMDAwCisKKyNkZWZpbmUgTU9WX1RSVU5fREFUQV9PRkZTRVQgICAgICAgICAgICAweDAxCisjZGVmaW5lIE1PVl9UUlVOX0ZJUlNUX1NBTVBMRV9GTEFHUyAgICAgMHgwNAorI2RlZmluZSBNT1ZfVFJVTl9TQU1QTEVfRFVSQVRJT04gICAgICAgMHgxMDAKKyNkZWZpbmUgTU9WX1RSVU5fU0FNUExFX1NJWkUgICAgICAgICAgIDB4MjAwCisjZGVmaW5lIE1PVl9UUlVOX1NBTVBMRV9GTEFHUyAgICAgICAgICAweDQwMAorI2RlZmluZSBNT1ZfVFJVTl9TQU1QTEVfQ1RTICAgICAgICAgICAgMHg4MDAKKworI2RlZmluZSBNT1ZfRlJBR19TQU1QTEVfRkxBR19ERUdSQURBVElPTl9QUklPUklUWV9NQVNLIDB4MDAwMGZmZmYKKyNkZWZpbmUgTU9WX0ZSQUdfU0FNUExFX0ZMQUdfSVNfTk9OX1NZTkMgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIE1PVl9GUkFHX1NBTVBMRV9GTEFHX1BBRERJTkdfTUFTSyAgICAgICAgICAgICAgMHgwMDBlMDAwMAorI2RlZmluZSBNT1ZfRlJBR19TQU1QTEVfRkxBR19SRURVTkRBTkNZX01BU0sgICAgICAgICAgIDB4MDAzMDAwMDAKKyNkZWZpbmUgTU9WX0ZSQUdfU0FNUExFX0ZMQUdfREVQRU5ERURfTUFTSyAgICAgICAgICAgICAweDAwYzAwMDAwCisjZGVmaW5lIE1PVl9GUkFHX1NBTVBMRV9GTEFHX0RFUEVORFNfTUFTSyAgICAgICAgICAgICAgMHgwMzAwMDAwMAorCisjZGVmaW5lIE1PVl9GUkFHX1NBTVBMRV9GTEFHX0RFUEVORFNfTk8gICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBNT1ZfRlJBR19TQU1QTEVfRkxBR19ERVBFTkRTX1lFUyAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKworI2RlZmluZSBNT1ZfVEtIRF9GTEFHX0VOQUJMRUQgICAgICAgMHgwMDAxCisjZGVmaW5lIE1PVl9US0hEX0ZMQUdfSU5fTU9WSUUgICAgICAweDAwMDIKKyNkZWZpbmUgTU9WX1RLSERfRkxBR19JTl9QUkVWSUVXICAgIDB4MDAwNAorI2RlZmluZSBNT1ZfVEtIRF9GTEFHX0lOX1BPU1RFUiAgICAgMHgwMDA4CisKKyNkZWZpbmUgVEFHX0lTX0FWQ0kodGFnKSAgICAgICAgICAgICAgICAgICAgXAorICAgICgodGFnKSA9PSBNS1RBRygnYScsICdpJywgJzUnLCAncCcpIHx8ICBcCisgICAgICh0YWcpID09IE1LVEFHKCdhJywgJ2knLCAnNScsICdxJykgfHwgIFwKKyAgICAgKHRhZykgPT0gTUtUQUcoJ2EnLCAnaScsICc1JywgJzInKSB8fCAgXAorICAgICAodGFnKSA9PSBNS1RBRygnYScsICdpJywgJzUnLCAnMycpIHx8ICBcCisgICAgICh0YWcpID09IE1LVEFHKCdhJywgJ2knLCAnNScsICc1JykgfHwgIFwKKyAgICAgKHRhZykgPT0gTUtUQUcoJ2EnLCAnaScsICc1JywgJzYnKSB8fCAgXAorICAgICAodGFnKSA9PSBNS1RBRygnYScsICdpJywgJzEnLCAncCcpIHx8ICBcCisgICAgICh0YWcpID09IE1LVEFHKCdhJywgJ2knLCAnMScsICdxJykgfHwgIFwKKyAgICAgKHRhZykgPT0gTUtUQUcoJ2EnLCAnaScsICcxJywgJzInKSB8fCAgXAorICAgICAodGFnKSA9PSBNS1RBRygnYScsICdpJywgJzEnLCAnMycpIHx8ICBcCisgICAgICh0YWcpID09IE1LVEFHKCdhJywgJ2knLCAnMScsICc1JykgfHwgIFwKKyAgICAgKHRhZykgPT0gTUtUQUcoJ2EnLCAnaScsICcxJywgJzYnKSB8fCAgXAorICAgICAodGFnKSA9PSBNS1RBRygnYScsICdpJywgJ3YnLCAneCcpIHx8ICBcCisgICAgICh0YWcpID09IE1LVEFHKCdBJywgJ1YnLCAnaScsICduJykpCisKKworaW50IGZmX21vdl9yZWFkX2VzZHMoQVZGb3JtYXRDb250ZXh0ICpmYywgQVZJT0NvbnRleHQgKnBiKTsKK2VudW0gQVZDb2RlY0lEIGZmX21vdl9nZXRfbHBjbV9jb2RlY19pZChpbnQgYnBzLCBpbnQgZmxhZ3MpOworCitpbnQgZmZfbW92X3JlYWRfc3RzZF9lbnRyaWVzKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgaW50IGVudHJpZXMpOwordm9pZCBmZl9tb3Zfd3JpdGVfY2hhbihBVklPQ29udGV4dCAqcGIsIGludDY0X3QgY2hhbm5lbF9sYXlvdXQpOworCisjZGVmaW5lIEZGX01PVl9GTEFHX01GUkFfQVVUTyAtMQorI2RlZmluZSBGRl9NT1ZfRkxBR19NRlJBX0RUUyAxCisjZGVmaW5lIEZGX01PVl9GTEFHX01GUkFfUFRTIDIKKworI2VuZGlmIC8qIEFWRk9STUFUX0lTT01fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2lzcy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2lzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OTQ1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaXNzLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBJU1MgKC5pc3MpIGZpbGUgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA4IEphaWtyaXNobmFuIE1lbm9uIDxyZWFsaXR5bWFuQGdteC5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEZ1bmNvbSBJU1MgZmlsZSBkZW11eGVyCisgKiBAYXV0aG9yIEphaWtyaXNobmFuIE1lbm9uCisgKiBAc2VlIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPUZ1bkNvbV9JU1MKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorCisjZGVmaW5lIElTU19TSUcgIklNQV9BRFBDTV9Tb3VuZCIKKyNkZWZpbmUgSVNTX1NJR19MRU4gMTUKKyNkZWZpbmUgTUFYX1RPS0VOX1NJWkUgMjAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBwYWNrZXRfc2l6ZTsKKyAgICBpbnQgc2FtcGxlX3N0YXJ0X3BvczsKK30gSXNzRGVtdXhDb250ZXh0OworCitzdGF0aWMgdm9pZCBnZXRfdG9rZW4oQVZJT0NvbnRleHQgKnMsIGNoYXIgKmJ1ZiwgaW50IG1heGxlbikKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgY2hhciBjOworCisgICAgd2hpbGUgKChjID0gYXZpb19yOChzKSkpIHsKKyAgICAgICAgaWYoYyA9PSAnICcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGkgPCBtYXhsZW4tMSkKKyAgICAgICAgICAgIGJ1ZltpKytdID0gYzsKKyAgICB9CisKKyAgICBpZighYykKKyAgICAgICAgYXZpb19yOChzKTsKKworICAgIGJ1ZltpXSA9IDA7IC8qIEVuc3VyZSBudWxsIHRlcm1pbmF0ZWQsIGJ1dCBtYXkgYmUgdHJ1bmNhdGVkICovCit9CisKK3N0YXRpYyBpbnQgaXNzX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChzdHJuY21wKHAtPmJ1ZiwgSVNTX1NJRywgSVNTX1NJR19MRU4pKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGlzc19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgSXNzRGVtdXhDb250ZXh0ICppc3MgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGNoYXIgdG9rZW5bTUFYX1RPS0VOX1NJWkVdOworICAgIGludCBzdGVyZW8sIHJhdGVfZGl2aXNvcjsKKworICAgIGdldF90b2tlbihwYiwgdG9rZW4sIHNpemVvZih0b2tlbikpOyAvLyJJTUFfQURQQ01fU291bmQiCisgICAgZ2V0X3Rva2VuKHBiLCB0b2tlbiwgc2l6ZW9mKHRva2VuKSk7IC8vcGFja2V0IHNpemUKKyAgICBpZiAoc3NjYW5mKHRva2VuLCAiJWQiLCAmaXNzLT5wYWNrZXRfc2l6ZSkgIT0gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHBhcnNpbmcgcGFja2V0IHNpemVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZ2V0X3Rva2VuKHBiLCB0b2tlbiwgc2l6ZW9mKHRva2VuKSk7IC8vRmlsZSBJRAorICAgIGdldF90b2tlbihwYiwgdG9rZW4sIHNpemVvZih0b2tlbikpOyAvL291dCBzaXplCisgICAgZ2V0X3Rva2VuKHBiLCB0b2tlbiwgc2l6ZW9mKHRva2VuKSk7IC8vc3RlcmVvCisgICAgaWYgKHNzY2FuZih0b2tlbiwgIiVkIiwgJnN0ZXJlbykgIT0gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHBhcnNpbmcgc3RlcmVvIGZsYWdcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgZ2V0X3Rva2VuKHBiLCB0b2tlbiwgc2l6ZW9mKHRva2VuKSk7IC8vVW5rbm93bjEKKyAgICBnZXRfdG9rZW4ocGIsIHRva2VuLCBzaXplb2YodG9rZW4pKTsgLy9SYXRlRGl2aXNvcgorICAgIGlmIChzc2NhbmYodG9rZW4sICIlZCIsICZyYXRlX2Rpdmlzb3IpICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCBwYXJzaW5nIHJhdGVfZGl2aXNvclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBnZXRfdG9rZW4ocGIsIHRva2VuLCBzaXplb2YodG9rZW4pKTsgLy9Vbmtub3duMgorICAgIGdldF90b2tlbihwYiwgdG9rZW4sIHNpemVvZih0b2tlbikpOyAvL1ZlcnNpb24gSUQKKyAgICBnZXRfdG9rZW4ocGIsIHRva2VuLCBzaXplb2YodG9rZW4pKTsgLy9TaXplCisKKyAgICBpZiAoaXNzLT5wYWNrZXRfc2l6ZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJwYWNrZXRfc2l6ZSAlZCBpcyBpbnZhbGlkXG4iLCBpc3MtPnBhY2tldF9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaXNzLT5zYW1wbGVfc3RhcnRfcG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX0lTUzsKKyAgICBpZiAoc3RlcmVvKSB7CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICB9IGVsc2UgeworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIH0KKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gNDQxMDA7CisgICAgaWYocmF0ZV9kaXZpc29yID4gMCkKKyAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgLz0gcmF0ZV9kaXZpc29yOworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gNDsKKyAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5jaGFubmVscyAqIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gaXNzLT5wYWNrZXRfc2l6ZTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc3NfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIElzc0RlbXV4Q29udGV4dCAqaXNzID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIGlzcy0+cGFja2V0X3NpemUpOworCisgICAgaWYocmV0ICE9IGlzcy0+cGFja2V0X3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcGt0LT5wdHMgPSBhdmlvX3RlbGwocy0+cGIpIC0gaXNzLT5zYW1wbGVfc3RhcnRfcG9zOworICAgIGlmKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jaGFubmVscyA+IDApCisgICAgICAgIHBrdC0+cHRzIC89IHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jaGFubmVscyoyOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2lzc19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJpc3MiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGdW5jb20gSVNTIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKElzc0RlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gaXNzX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGlzc19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBpc3NfcmVhZF9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2l2OC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2l2OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Yjc5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaXY4LmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3N0YXRpYyBpbnQgcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgLy8gdGhlIHNpbmdsZSBmaWxlIEkgaGF2ZSBzdGFydHMgd2l0aCB0aGF0LCBJIGRvIG5vdCBrbm93IGlmIG90aGVycyBkbywgdG9vCisgICAgaWYoICAgcC0+YnVmWzBdID09IDEKKyAgICAgICAmJiBwLT5idWZbMV0gPT0gMQorICAgICAgICYmIHAtPmJ1ZlsyXSA9PSAzCisgICAgICAgJiYgcC0+YnVmWzNdID09IDB4QjgKKyAgICAgICAmJiBwLT5idWZbNF0gPT0gMHg4MAorICAgICAgICYmIHAtPmJ1Zls1XSA9PSAweDYwCisgICAgICApCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWC0yOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICpzdDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUEVHNDsKKyAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgOTAwMDApOworCisgICAgcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldCwgc2l6ZSwgcHRzLCB0eXBlLCBmbGFnczsKKyAgICBpbnQgZmlyc3RfcGt0ICAgICAgPSAwOworICAgIGludCBmcmFtZV9jb21wbGV0ZSA9IDA7CisKKyAgICB3aGlsZSAoIWZyYW1lX2NvbXBsZXRlKSB7CisKKyAgICAgICAgdHlwZSAgPSBhdmlvX3JiMTYocy0+cGIpOyAvLyAyNTcgb3IgMjU4CisgICAgICAgIHNpemUgID0gYXZpb19yYjE2KHMtPnBiKTsKKyAgICAgICAgZmxhZ3MgPSBhdmlvX3JiMTYocy0+cGIpOyAvL3NvbWUgZmxhZ3MsIDB4ODAgaW5kaWNhdGVzIGVuZCBvZiBmcmFtZQorICAgICAgICAgICAgICAgIGF2aW9fcmIxNihzLT5wYik7IC8vcGFja2V0IG51bWJlcgorICAgICAgICBwdHMgICA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgICAgICAgICAgICAgYXZpb19yYjMyKHMtPnBiKTsgLy82QSAxMyBFMyA4OAorCisgICAgICAgIGZyYW1lX2NvbXBsZXRlID0gZmxhZ3MgJiAweDgwOworCisgICAgICAgIHNpemUgLT0gMTI7CisgICAgICAgIGlmIChzaXplIDwgMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZiAodHlwZSA9PSAyNTgpIHsKKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgc2l6ZSk7CisgICAgICAgICAgICBmcmFtZV9jb21wbGV0ZSA9IDA7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZmlyc3RfcGt0KSB7CisgICAgICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGZpcnN0X3BrdCA9IDE7CisgICAgICAgICAgICBwa3QtPnB0cyAgPSBwdHM7CisgICAgICAgICAgICBwa3QtPnBvcyAtPSAxNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGF2X2FwcGVuZF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJmYWlsZWQgdG8gZ3JvdyBwYWNrZXRcbiIpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmV0IDwgc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlRydW5jYXRlZCBwYWNrZXQhIFJlYWQgJWQgb2YgJWQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgcmV0LCBzaXplKTsKKyAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfQ09SUlVQVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2l2OF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJpdjgiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJJbmRpZ29WaXNpb24gODAwMCB2aWRlbyIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHByb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2l2ZmRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2l2ZmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZmRhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvaXZmZGVjLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBEYXZpZCBDb25yYWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyaWZmLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCitzdGF0aWMgaW50IHByb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChBVl9STDMyKHAtPmJ1ZikgPT0gTUtUQUcoJ0QnLCdLJywnSScsJ0YnKQorICAgICAgICAmJiAhQVZfUkwxNihwLT5idWYrNCkgJiYgQVZfUkwxNihwLT5idWYrNikgPT0gMzIpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWC0yOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsKKworICAgIGF2aW9fcmwzMihzLT5wYik7IC8vIERLSUYKKyAgICBhdmlvX3JsMTYocy0+cGIpOyAvLyB2ZXJzaW9uCisgICAgYXZpb19ybDE2KHMtPnBiKTsgLy8gaGVhZGVyIHNpemUKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsIHN0LT5jb2RlYy0+Y29kZWNfdGFnKTsKKyAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSBhdmlvX3JsMTYocy0+cGIpOworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcmwxNihzLT5wYik7CisgICAgdGltZV9iYXNlLmRlbiAgICAgICAgID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICB0aW1lX2Jhc2UubnVtICAgICAgICAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICA9IGF2aW9fcmw2NChzLT5wYik7CisKKyAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOworCisgICAgaWYgKCF0aW1lX2Jhc2UuZGVuIHx8ICF0aW1lX2Jhc2UubnVtKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGZyYW1lIHJhdGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgdGltZV9iYXNlLm51bSwgdGltZV9iYXNlLmRlbik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldCwgc2l6ZSA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgaW50NjRfdCAgIHB0cyA9IGF2aW9fcmw2NChzLT5wYik7CisKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICBwa3QtPnB0cyAgICAgICAgICA9IHB0czsKKyAgICBwa3QtPnBvcyAgICAgICAgIC09IDEyOworCisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9pdmZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaXZmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT24yIElWRiIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHByb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCisgICAgLmNvZGVjX3RhZyAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgZmZfY29kZWNfYm1wX3RhZ3MsIDAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvaXZmZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvaXZmZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwMGYwMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9pdmZlbmMuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFJlaW1hciBEw7ZmZmluZ2VyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKK3N0YXRpYyBpbnQgaXZmX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmN0eDsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKworICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZvcm1hdCBzdXBwb3J0cyBvbmx5IGV4YWN0bHkgb25lIHZpZGVvIHN0cmVhbVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGN0eCA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIGlmIChjdHgtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgICEoY3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDggfHwgY3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDdXJyZW50bHkgb25seSBWUDggYW5kIFZQOSBhcmUgc3VwcG9ydGVkIVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGF2aW9fd3JpdGUocGIsICJES0lGIiwgNCk7CisgICAgYXZpb193bDE2KHBiLCAwKTsgLy8gdmVyc2lvbgorICAgIGF2aW9fd2wxNihwYiwgMzIpOyAvLyBoZWFkZXIgbGVuZ3RoCisgICAgYXZpb193bDMyKHBiLCBjdHgtPmNvZGVjX3RhZyA/IGN0eC0+Y29kZWNfdGFnIDogQVZfUkwzMigiVlA4MCIpKTsKKyAgICBhdmlvX3dsMTYocGIsIGN0eC0+d2lkdGgpOworICAgIGF2aW9fd2wxNihwYiwgY3R4LT5oZWlnaHQpOworICAgIGF2aW9fd2wzMihwYiwgcy0+c3RyZWFtc1swXS0+dGltZV9iYXNlLmRlbik7CisgICAgYXZpb193bDMyKHBiLCBzLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UubnVtKTsKKyAgICBhdmlvX3dsNjQocGIsIHMtPnN0cmVhbXNbMF0tPmR1cmF0aW9uKTsgLy8gVE9ETzogZHVyYXRpb24gb3IgbnVtYmVyIG9mIGZyYW1lcz8hPworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXZmX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgYXZpb193bDMyKHBiLCBwa3QtPnNpemUpOworICAgIGF2aW9fd2w2NChwYiwgcGt0LT5wdHMpOworICAgIGF2aW9fd3JpdGUocGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9pdmZfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICA9ICJpdmYiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT24yIElWRiIpLAorICAgIC5leHRlbnNpb25zICAgPSAiaXZmIiwKKyAgICAuYXVkaW9fY29kZWMgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAudmlkZW9fY29kZWMgID0gQVZfQ09ERUNfSURfVlA4LAorICAgIC53cml0ZV9oZWFkZXIgPSBpdmZfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgPSBpdmZfd3JpdGVfcGFja2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9qYWNvc3ViZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvamFjb3N1YmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYTAwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvamFjb3N1YmRlYy5jCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIENsw6ltZW50IELFk3NjaAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBKQUNPc3ViIHN1YnRpdGxlIGRlbXV4ZXIKKyAqIEBzZWUgaHR0cDovL3VuaWNvcm4udXMuY29tL2phY29zdWIvanNjcmlwdHMuaHRtbAorICogQHRvZG8gU3VwcG9ydCBQW0FMRVRURV0gZGlyZWN0aXZlLgorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic3VidGl0bGVzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvamFjb3N1Yi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgc2hpZnQ7CisgICAgdW5zaWduZWQgdGltZXJlczsKKyAgICBGRkRlbXV4U3VidGl0bGVzUXVldWUgcTsKK30gSkFDT3N1YkNvbnRleHQ7CisKK3N0YXRpYyBpbnQgdGltZWRfbGluZShjb25zdCBjaGFyICpwdHIpCit7CisgICAgY2hhciBjOworICAgIGludCBmcywgZmU7CisgICAgcmV0dXJuIChzc2NhbmYocHRyLCAiJSp1OiUqdTolKnUuJSp1ICUqdTolKnU6JSp1LiUqdSAlYyIsICZjKSA9PSAxIHx8CisgICAgICAgICAgICAoc3NjYW5mKHB0ciwgIkAldSBAJXUgJWMiLCAmZnMsICZmZSwgJmMpID09IDMgJiYgZnMgPCBmZSkpOworfQorCitzdGF0aWMgaW50IGphY29zdWJfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgY2hhciAqcHRyICAgICA9IHAtPmJ1ZjsKKyAgICBjb25zdCBjaGFyICpwdHJfZW5kID0gcC0+YnVmICsgcC0+YnVmX3NpemU7CisKKyAgICBpZiAoQVZfUkIyNChwdHIpID09IDB4RUZCQkJGKQorICAgICAgICBwdHIgKz0gMzsgLyogc2tpcCBVVEYtOCBCT00gKi8KKworICAgIHdoaWxlIChwdHIgPCBwdHJfZW5kKSB7CisgICAgICAgIHdoaWxlIChqc3Nfd2hpdGVzcGFjZSgqcHRyKSkKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICBpZiAoKnB0ciAhPSAnIycgJiYgKnB0ciAhPSAnXG4nKSB7CisgICAgICAgICAgICBpZiAodGltZWRfbGluZShwdHIpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBwdHIgKz0gZmZfc3VidGl0bGVzX25leHRfbGluZShwdHIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjbWRzW10gPSB7CisgICAgIkNMT0NLUEFVU0UiLAorICAgICJESVJFQ1RJVkUiLAorICAgICJGT05UIiwKKyAgICAiSFJFUyIsCisgICAgIklOQ0xVREUiLAorICAgICJQQUxFVFRFIiwKKyAgICAiUVVBTlRJWkUiLAorICAgICJSQU1QIiwKKyAgICAiU0hJRlQiLAorICAgICJUSU1FUkVTIiwKK307CisKK3N0YXRpYyBpbnQgZ2V0X2pzc19jbWQoY2hhciBrKQoreworICAgIGludCBpOworCisgICAgayA9IGF2X3RvdXBwZXIoayk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGNtZHMpOyBpKyspCisgICAgICAgIGlmIChrID09IGNtZHNbaV1bMF0pCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgamFjb3N1Yl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBKQUNPc3ViQ29udGV4dCAqamFjb3N1YiA9IHMtPnByaXZfZGF0YTsKKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfY2xlYW4oJmphY29zdWItPnEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcmVhZF90cyhKQUNPc3ViQ29udGV4dCAqamFjb3N1YiwgY29uc3QgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqc3RhcnQsIGludCAqZHVyYXRpb24pCit7CisgICAgaW50IGxlbjsKKyAgICB1bnNpZ25lZCBocywgbXMsIHNzLCBmczsgLy8gaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGZyYW1lIHN0YXJ0CisgICAgdW5zaWduZWQgaGUsIG1lLCBzZSwgZmU7IC8vIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBmcmFtZSBlbmQKKyAgICBpbnQgdHNfc3RhcnQsIHRzX2VuZDsKKworICAgIC8qIHRpbWVkIGZvcm1hdCAqLworICAgIGlmIChzc2NhbmYoYnVmLCAiJXU6JXU6JXUuJXUgJXU6JXU6JXUuJXUgJW4iLAorICAgICAgICAgICAgICAgJmhzLCAmbXMsICZzcywgJmZzLAorICAgICAgICAgICAgICAgJmhlLCAmbWUsICZzZSwgJmZlLCAmbGVuKSA9PSA4KSB7CisgICAgICAgIHRzX3N0YXJ0ID0gKGhzKjM2MDAgKyBtcyo2MCArIHNzKSAqIGphY29zdWItPnRpbWVyZXMgKyBmczsKKyAgICAgICAgdHNfZW5kICAgPSAoaGUqMzYwMCArIG1lKjYwICsgc2UpICogamFjb3N1Yi0+dGltZXJlcyArIGZlOworICAgICAgICBnb3RvIHNoaWZ0X2FuZF9yZXQ7CisgICAgfQorCisgICAgLyogdGltZXN0YW1wcyBmb3JtYXQgKi8KKyAgICBpZiAoc3NjYW5mKGJ1ZiwgIkAldSBAJXUgJW4iLCAmdHNfc3RhcnQsICZ0c19lbmQsICZsZW4pID09IDIpCisgICAgICAgIGdvdG8gc2hpZnRfYW5kX3JldDsKKworICAgIHJldHVybiBOVUxMOworCitzaGlmdF9hbmRfcmV0OgorICAgIHRzX3N0YXJ0ICA9ICh0c19zdGFydCArIGphY29zdWItPnNoaWZ0KSAqIDEwMCAvIGphY29zdWItPnRpbWVyZXM7CisgICAgdHNfZW5kICAgID0gKHRzX2VuZCAgICsgamFjb3N1Yi0+c2hpZnQpICogMTAwIC8gamFjb3N1Yi0+dGltZXJlczsKKyAgICAqc3RhcnQgICAgPSB0c19zdGFydDsKKyAgICAqZHVyYXRpb24gPSB0c19zdGFydCArIHRzX2VuZDsKKyAgICByZXR1cm4gYnVmICsgbGVuOworfQorCitzdGF0aWMgaW50IGdldF9zaGlmdChpbnQgdGltZXJlcywgY29uc3QgY2hhciAqYnVmKQoreworICAgIGludCBzaWduID0gMTsKKyAgICBpbnQgYSA9IDAsIGIgPSAwLCBjID0gMCwgZCA9IDA7CisjZGVmaW5lIFNTRVAgIiUqMVsuOl0iCisgICAgaW50IG4gPSBzc2NhbmYoYnVmLCAiJWQiU1NFUCIlZCJTU0VQIiVkIlNTRVAiJWQiLCAmYSwgJmIsICZjLCAmZCk7CisjdW5kZWYgU1NFUAorCisgICAgaWYgKCpidWYgPT0gJy0nIHx8IGEgPCAwKSB7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgYSA9IEZGQUJTKGEpOworICAgIH0KKworICAgIHN3aXRjaCAobikgeworICAgIGNhc2UgNDogcmV0dXJuIHNpZ24gKiAoKGEqMzYwMCArIGIqNjAgKyBjKSAqIHRpbWVyZXMgKyBkKTsKKyAgICBjYXNlIDM6IHJldHVybiBzaWduICogKCggICAgICAgICBhKjYwICsgYikgKiB0aW1lcmVzICsgYyk7CisgICAgY2FzZSAyOiByZXR1cm4gc2lnbiAqICgoICAgICAgICAgICAgICAgIGEpICogdGltZXJlcyArIGIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGphY29zdWJfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWQlByaW50IGhlYWRlcjsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBjaGFyIGxpbmVbSlNTX01BWF9MSU5FU0laRV07CisgICAgSkFDT3N1YkNvbnRleHQgKmphY29zdWIgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHNoaWZ0X3NldCA9IDA7IC8vIG9ubHkgdGhlIGZpcnN0IHNoaWZ0IG1hdHRlcnMKKyAgICBpbnQgbWVyZ2VfbGluZSA9IDA7CisgICAgaW50IGksIHJldDsKKworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfSkFDT1NVQjsKKworICAgIGphY29zdWItPnRpbWVyZXMgPSAzMDsKKworICAgIGF2X2JwcmludF9pbml0KCZoZWFkZXIsIDEwMjQrRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSwgNDA5Nik7CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgaW50IGNtZF9sZW47CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBsaW5lOworICAgICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGludCBsZW4gPSBmZl9nZXRfbGluZShwYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKworICAgICAgICBwID0ganNzX3NraXBfd2hpdGVzcGFjZShwKTsKKworICAgICAgICAvKiBxdWV1ZSB0aW1lZCBsaW5lICovCisgICAgICAgIGlmIChtZXJnZV9saW5lIHx8IHRpbWVkX2xpbmUocCkpIHsKKyAgICAgICAgICAgIEFWUGFja2V0ICpzdWI7CisKKyAgICAgICAgICAgIHN1YiA9IGZmX3N1YnRpdGxlc19xdWV1ZV9pbnNlcnQoJmphY29zdWItPnEsIGxpbmUsIGxlbiwgbWVyZ2VfbGluZSk7CisgICAgICAgICAgICBpZiAoIXN1YikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgc3ViLT5wb3MgPSBwb3M7CisgICAgICAgICAgICBtZXJnZV9saW5lID0gbGVuID4gMSAmJiAhc3RyY21wKCZsaW5lW2xlbiAtIDJdLCAiXFxcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBza2lwIGFsbCBub24tY29tcGlsZXIgY29tbWFuZHMgYW5kIGZvY3VzIG9uIHRoZSBjb21tYW5kICovCisgICAgICAgIGlmICgqcCAhPSAnIycpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcCsrOworICAgICAgICBpID0gZ2V0X2pzc19jbWQocFswXSk7CisgICAgICAgIGlmIChpID09IC0xKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogdHJpbSBjb21tYW5kICsgc3BhY2VzICovCisgICAgICAgIGNtZF9sZW4gPSBzdHJsZW4oY21kc1tpXSk7CisgICAgICAgIGlmIChhdl9zdHJuY2FzZWNtcChwLCBjbWRzW2ldLCBjbWRfbGVuKSA9PSAwKQorICAgICAgICAgICAgcCArPSBjbWRfbGVuOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwKys7CisgICAgICAgIHAgPSBqc3Nfc2tpcF93aGl0ZXNwYWNlKHApOworCisgICAgICAgIC8qIGhhbmRsZSBjb21tYW5kcyB3aGljaCBhZmZlY3QgdGhlIHdob2xlIHNjcmlwdCAqLworICAgICAgICBzd2l0Y2ggKGNtZHNbaV1bMF0pIHsKKyAgICAgICAgY2FzZSAnUyc6IC8vIFNISUZUIGNvbW1hbmQgYWZmZWN0IHRoZSB3aG9sZSBzY3JpcHQuLi4KKyAgICAgICAgICAgIGlmICghc2hpZnRfc2V0KSB7CisgICAgICAgICAgICAgICAgamFjb3N1Yi0+c2hpZnQgPSBnZXRfc2hpZnQoamFjb3N1Yi0+dGltZXJlcywgcCk7CisgICAgICAgICAgICAgICAgc2hpZnRfc2V0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2JwcmludGYoJmhlYWRlciwgIiNTICVzIiwgcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnVCc6IC8vIC4uLmJ1dCBtdXN0IGJlIHBsYWNlZCBhZnRlciBUSU1FUkVTCisgICAgICAgICAgICBqYWNvc3ViLT50aW1lcmVzID0gc3RydG9sKHAsIE5VTEwsIDEwKTsKKyAgICAgICAgICAgIGlmICghamFjb3N1Yi0+dGltZXJlcykKKyAgICAgICAgICAgICAgICBqYWNvc3ViLT50aW1lcmVzID0gMzA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmaGVhZGVyLCAiI1QgJXMiLCBwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2VuZXJhbC9lc3NlbnRpYWwgZGlyZWN0aXZlcyBpbiB0aGUgZXh0cmFkYXRhICovCisgICAgcmV0ID0gYXZwcml2X2JwcmludF90b19leHRyYWRhdGEoc3QtPmNvZGVjLCAmaGVhZGVyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgLyogU0hJRlQgYW5kIFRJTUVSRVMgYWZmZWN0IHRoZSB3aG9sZSBzY3JpcHQgc28gcGFja2V0IHRpbWluZyBjYW4gb25seSBiZQorICAgICAqIGRvbmUgaW4gYSBzZWNvbmQgcGFzcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBqYWNvc3ViLT5xLm5iX3N1YnM7IGkrKykgeworICAgICAgICBBVlBhY2tldCAqc3ViID0gJmphY29zdWItPnEuc3Vic1tpXTsKKyAgICAgICAgcmVhZF90cyhqYWNvc3ViLCBzdWItPmRhdGEsICZzdWItPnB0cywgJnN1Yi0+ZHVyYXRpb24pOworICAgIH0KKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfZmluYWxpemUoJmphY29zdWItPnEpOworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGphY29zdWJfcmVhZF9jbG9zZShzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGphY29zdWJfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEpBQ09zdWJDb250ZXh0ICpqYWNvc3ViID0gcy0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl9zdWJ0aXRsZXNfcXVldWVfcmVhZF9wYWNrZXQoJmphY29zdWItPnEsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgamFjb3N1Yl9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncykKK3sKKyAgICBKQUNPc3ViQ29udGV4dCAqamFjb3N1YiA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJmphY29zdWItPnEsIHMsIHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncyk7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfamFjb3N1Yl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJqYWNvc3ViIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSkFDT3N1YiBzdWJ0aXRsZSBmb3JtYXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSkFDT3N1YkNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGphY29zdWJfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gamFjb3N1Yl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBqYWNvc3ViX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsyICAgICA9IGphY29zdWJfcmVhZF9zZWVrLAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGphY29zdWJfcmVhZF9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvamFjb3N1YmVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2phY29zdWJlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFlNDVhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2phY29zdWJlbmMuYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJhd2VuYy5oIgorCitzdGF0aWMgaW50IGphY29zdWJfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBjb25zdCBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplIC0gMSk7CisgICAgICAgIGF2aW9fZmx1c2gocy0+cGIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfamFjb3N1Yl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiamFjb3N1YiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkpBQ09zdWIgc3VidGl0bGUgZm9ybWF0IiksCisgICAgLm1pbWVfdHlwZSAgICAgID0gInRleHQveC1qYWNvc3ViIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAianNzLGpzIiwKKyAgICAud3JpdGVfaGVhZGVyICAgPSBqYWNvc3ViX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX1RTX05PTlNUUklDVCwKKyAgICAuc3VidGl0bGVfY29kZWMgPSBBVl9DT0RFQ19JRF9KQUNPU1VCLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9qdmRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2p2ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlYjE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9qdmRlYy5jCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQml0bWFwIEJyb3RoZXJzIEpWIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQml0bWFwIEJyb3RoZXJzIEpWIGRlbXV4ZXIKKyAqIEBhdXRob3IgUGV0ZXIgUm9zcyA8cHJvc3NAeHZpZC5vcmc+CisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBKVl9QUkVBTUJMRV9TSVpFIDUKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBhdWRpb19zaXplOyAgICAvKio8IGF1ZGlvIHBhY2tldCBzaXplIChieXRlcykgKi8KKyAgICBpbnQgdmlkZW9fc2l6ZTsgICAgLyoqPCB2aWRlbyBwYWNrZXQgc2l6ZSAoYnl0ZXMpICovCisgICAgaW50IHBhbGV0dGVfc2l6ZTsgIC8qKjwgcGFsZXR0ZSBzaXplIChieXRlcykgKi8KKyAgICBpbnQgdmlkZW9fdHlwZTsgICAgLyoqPCBwZXItZnJhbWUgdmlkZW8gY29tcHJlc3Npb24gdHlwZSAqLworfSBKVkZyYW1lOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgSlZGcmFtZSAqZnJhbWVzOworICAgIGVudW0geworICAgICAgICBKVl9BVURJTyA9IDAsCisgICAgICAgIEpWX1ZJREVPLAorICAgICAgICBKVl9QQURESU5HCisgICAgfSBzdGF0ZTsKKyAgICBpbnQ2NF90IHB0czsKK30gSlZEZW11eENvbnRleHQ7CisKKyNkZWZpbmUgTUFHSUMgIiBDb21wcmVzc2lvbiBieSBKb2huIE0gUGhpbGxpcHMgQ29weXJpZ2h0IChDKSAxOTk1IFRoZSBCaXRtYXAgQnJvdGhlcnMgTHRkLiIKKworc3RhdGljIGludCByZWFkX3Byb2JlKEFWUHJvYmVEYXRhICpwZCkKK3sKKyAgICBpZiAocGQtPmJ1ZlswXSA9PSAnSicgJiYgcGQtPmJ1ZlsxXSA9PSAnVicgJiYgc3RybGVuKE1BR0lDKSA8PSBwZC0+YnVmX3NpemUgLSA0ICYmCisgICAgICAgICFtZW1jbXAocGQtPmJ1ZiArIDQsIE1BR0lDLCBzdHJsZW4oTUFHSUMpKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEpWRGVtdXhDb250ZXh0ICpqdiA9IHMtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZqdi0+ZnJhbWVzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBKVkRlbXV4Q29udGV4dCAqanYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnZzdCwgKmFzdDsKKyAgICBpbnQ2NF90IGF1ZGlvX3B0cyA9IDA7CisgICAgaW50NjRfdCBvZmZzZXQ7CisgICAgaW50IGk7CisKKyAgICBhdmlvX3NraXAocGIsIDgwKTsKKworICAgIGFzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIWFzdCB8fCAhdnN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9KVjsKKyAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcgICA9IDA7IC8qIG5vIGZvdXJjYyAqLworICAgIHZzdC0+Y29kZWMtPndpZHRoICAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICB2c3QtPmNvZGVjLT5oZWlnaHQgICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgdnN0LT5kdXJhdGlvbiAgICAgICAgICAgPQorICAgIHZzdC0+bmJfZnJhbWVzICAgICAgICAgID0KKyAgICBhc3QtPm5iX2luZGV4X2VudHJpZXMgICA9IGF2aW9fcmwxNihwYik7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyh2c3QsIDY0LCBhdmlvX3JsMTYocGIpLCAxMDAwKTsKKworICAgIGF2aW9fc2tpcChwYiwgNCk7CisKKyAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICBhc3QtPmNvZGVjLT5jb2RlY190YWcgICAgICA9IDA7IC8qIG5vIGZvdXJjYyAqLworICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBhc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgNjQsIDEsIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKworICAgIGF2aW9fc2tpcChwYiwgMTApOworCisgICAgYXN0LT5pbmRleF9lbnRyaWVzID0gYXZfbWFsbG9jKGFzdC0+bmJfaW5kZXhfZW50cmllcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqYXN0LT5pbmRleF9lbnRyaWVzKSk7CisgICAgaWYgKCFhc3QtPmluZGV4X2VudHJpZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBqdi0+ZnJhbWVzID0gYXZfbWFsbG9jKGFzdC0+bmJfaW5kZXhfZW50cmllcyAqIHNpemVvZihKVkZyYW1lKSk7CisgICAgaWYgKCFqdi0+ZnJhbWVzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgb2Zmc2V0ID0gMHg2OCArIGFzdC0+bmJfaW5kZXhfZW50cmllcyAqIDE2OworICAgIGZvciAoaSA9IDA7IGkgPCBhc3QtPm5iX2luZGV4X2VudHJpZXM7IGkrKykgeworICAgICAgICBBVkluZGV4RW50cnkgKmUgICA9IGFzdC0+aW5kZXhfZW50cmllcyArIGk7CisgICAgICAgIEpWRnJhbWUgICAgICAqanZmID0ganYtPmZyYW1lcyArIGk7CisKKyAgICAgICAgLyogdG90YWwgZnJhbWUgc2l6ZSBpbmNsdWRpbmcgYXVkaW8sIHZpZGVvLCBwYWxldHRlIGRhdGEgYW5kIHBhZGRpbmcgKi8KKyAgICAgICAgZS0+c2l6ZSAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgZS0+dGltZXN0YW1wID0gaTsKKyAgICAgICAgZS0+cG9zICAgICAgID0gb2Zmc2V0OworICAgICAgICBvZmZzZXQgICAgICArPSBlLT5zaXplOworCisgICAgICAgIGp2Zi0+YXVkaW9fc2l6ZSAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAganZmLT52aWRlb19zaXplICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBqdmYtPnBhbGV0dGVfc2l6ZSA9IGF2aW9fcjgocGIpID8gNzY4IDogMDsKKworICAgICAgICBpZiAoKGp2Zi0+dmlkZW9fc2l6ZSB8IGp2Zi0+YXVkaW9fc2l6ZSkgJiB+MHhGRkZGRkYgfHwKKyAgICAgICAgICAgIGUtPnNpemUgLSBqdmYtPmF1ZGlvX3NpemUKKyAgICAgICAgICAgICAgICAgICAgLSBqdmYtPnZpZGVvX3NpemUKKyAgICAgICAgICAgICAgICAgICAgLSBqdmYtPnBhbGV0dGVfc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIGlmIChzLT5lcnJvcl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpIHsKKyAgICAgICAgICAgICAgICByZWFkX2Nsb3NlKHMpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAganZmLT5hdWRpb19zaXplICAgPQorICAgICAgICAgICAganZmLT52aWRlb19zaXplICAgPQorICAgICAgICAgICAganZmLT5wYWxldHRlX3NpemUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF2aW9fcjgocGIpKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAidW5zdXBwb3J0ZWQgYXVkaW8gY29kZWNcbiIpOworCisgICAgICAgIGp2Zi0+dmlkZW9fdHlwZSA9IGF2aW9fcjgocGIpOworICAgICAgICBhdmlvX3NraXAocGIsIDEpOworCisgICAgICAgIGUtPnRpbWVzdGFtcCA9IGp2Zi0+YXVkaW9fc2l6ZSA/IGF1ZGlvX3B0cyA6IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBhdWRpb19wdHMgICArPSBqdmYtPmF1ZGlvX3NpemU7CisKKyAgICAgICAgZS0+ZmxhZ3MgPSBqdmYtPnZpZGVvX3R5cGUgIT0gMSA/IEFWSU5ERVhfS0VZRlJBTUUgOiAwOworICAgIH0KKworICAgIGp2LT5zdGF0ZSA9IEpWX0FVRElPOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBKVkRlbXV4Q29udGV4dCAqanYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKmFzdCA9IHMtPnN0cmVhbXNbMF07CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihzLT5wYikgJiYganYtPnB0cyA8IGFzdC0+bmJfaW5kZXhfZW50cmllcykgeworICAgICAgICBjb25zdCBBVkluZGV4RW50cnkgKmUgICA9IGFzdC0+aW5kZXhfZW50cmllcyArIGp2LT5wdHM7CisgICAgICAgIGNvbnN0IEpWRnJhbWUgICAgICAqanZmID0ganYtPmZyYW1lcyArIGp2LT5wdHM7CisKKyAgICAgICAgc3dpdGNoIChqdi0+c3RhdGUpIHsKKyAgICAgICAgY2FzZSBKVl9BVURJTzoKKyAgICAgICAgICAgIGp2LT5zdGF0ZSsrOworICAgICAgICAgICAgaWYgKGp2Zi0+YXVkaW9fc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIGp2Zi0+YXVkaW9fc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBwa3QtPnB0cyAgICAgICAgICA9IGUtPnRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICBwa3QtPmZsYWdzICAgICAgIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBKVl9WSURFTzoKKyAgICAgICAgICAgIGp2LT5zdGF0ZSsrOworICAgICAgICAgICAgaWYgKGp2Zi0+dmlkZW9fc2l6ZSB8fCBqdmYtPnBhbGV0dGVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBqdmYtPnZpZGVvX3NpemUgKyBqdmYtPnBhbGV0dGVfc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIHNpemUgKyBKVl9QUkVBTUJMRV9TSVpFKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgICAgIEFWX1dMMzIocGt0LT5kYXRhLCBqdmYtPnZpZGVvX3NpemUpOworICAgICAgICAgICAgICAgIHBrdC0+ZGF0YVs0XSA9IGp2Zi0+dmlkZW9fdHlwZTsKKyAgICAgICAgICAgICAgICByZXQgPSBhdmlvX3JlYWQocGIsIHBrdC0+ZGF0YSArIEpWX1BSRUFNQkxFX1NJWkUsIHNpemUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGlmIChyZXQgPCBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChwa3QtPmRhdGEgKyBKVl9QUkVBTUJMRV9TSVpFICsgcmV0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfQ09SUlVQVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGt0LT5zaXplICAgICAgICAgPSByZXQgKyBKVl9QUkVBTUJMRV9TSVpFOworICAgICAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMTsKKyAgICAgICAgICAgICAgICBwa3QtPnB0cyAgICAgICAgICA9IGp2LT5wdHM7CisgICAgICAgICAgICAgICAgaWYgKGp2Zi0+dmlkZW9fdHlwZSAhPSAxKQorICAgICAgICAgICAgICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBKVl9QQURESU5HOgorICAgICAgICAgICAgYXZpb19za2lwKHBiLCBGRk1BWChlLT5zaXplIC0ganZmLT5hdWRpb19zaXplIC0ganZmLT52aWRlb19zaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBqdmYtPnBhbGV0dGVfc2l6ZSwgMCkpOworICAgICAgICAgICAganYtPnN0YXRlID0gSlZfQVVESU87CisgICAgICAgICAgICBqdi0+cHRzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+cGItPmVvZl9yZWFjaGVkKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICByZXR1cm4gQVZFUlJPUihFSU8pOworfQorCitzdGF0aWMgaW50IHJlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRzLCBpbnQgZmxhZ3MpCit7CisgICAgSlZEZW11eENvbnRleHQgKmp2ID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICphc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIGludCBpOworCisgICAgaWYgKGZsYWdzICYgKEFWU0VFS19GTEFHX0JZVEUgfCBBVlNFRUtfRkxBR19GUkFNRSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisKKyAgICBzd2l0Y2ggKHN0cmVhbV9pbmRleCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaSA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoYXN0LCB0cywgZmxhZ3MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGkgPSB0czsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGkgPCAwIHx8IGkgPj0gYXN0LT5uYl9pbmRleF9lbnRyaWVzKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYXZpb19zZWVrKHMtPnBiLCBhc3QtPmluZGV4X2VudHJpZXNbaV0ucG9zLCBTRUVLX1NFVCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBqdi0+c3RhdGUgPSBKVl9BVURJTzsKKyAgICBqdi0+cHRzICAgPSBpOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2p2X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImp2IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQml0bWFwIEJyb3RoZXJzIEpWIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEpWRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSByZWFkX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IHJlYWRfc2VlaywKKyAgICAucmVhZF9jbG9zZSAgICAgPSByZWFkX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9sYXRtZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbGF0bWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNzllODQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbGF0bWVuYy5jCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogTEFUTS9MT0FTIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgS2llcmFuIEt1bmh5YSA8a2llcmFuQGt1bmh5YS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9wdXRfYml0cy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZzRhdWRpby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJhd2VuYy5oIgorCisjZGVmaW5lIE1BWF9FWFRSQURBVEFfU0laRSAxMDI0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICphdl9jbGFzczsKKyAgICBpbnQgb2ZmOworICAgIGludCBjaGFubmVsX2NvbmY7CisgICAgaW50IG9iamVjdF90eXBlOworICAgIGludCBjb3VudGVyOworICAgIGludCBtb2Q7CisgICAgdWludDhfdCBidWZmZXJbMHgxZmZmICsgTUFYX0VYVFJBREFUQV9TSVpFICsgMTAyNF07Cit9IExBVE1Db250ZXh0OworCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsic21jLWludGVydmFsIiwgIlN0cmVhbU11eENvbmZpZyBpbnRlcnZhbC4iLAorICAgICBvZmZzZXRvZihMQVRNQ29udGV4dCwgbW9kKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB4MDAxNH0sIDB4MDAwMSwgMHhmZmZmLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTX0sCisgICAge05VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgbGF0bV9tdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJMQVRNL0xPQVMgbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGludCBsYXRtX2RlY29kZV9leHRyYWRhdGEoTEFUTUNvbnRleHQgKmN0eCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBNUEVHNEF1ZGlvQ29uZmlnIG00YWM7CisKKyAgICBpZiAoc2l6ZSA+IE1BWF9FWFRSQURBVEFfU0laRSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFeHRyYWRhdGEgaXMgbGFyZ2VyIHRoYW4gY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgY3R4LT5vZmYgPSBhdnByaXZfbXBlZzRhdWRpb19nZXRfY29uZmlnKCZtNGFjLCBidWYsIHNpemUgKiA4LCAxKTsKKyAgICBpZiAoY3R4LT5vZmYgPCAwKQorICAgICAgICByZXR1cm4gY3R4LT5vZmY7CisKKyAgICBpZiAoY3R4LT5vYmplY3RfdHlwZSA9PSBBT1RfQUxTICYmIChjdHgtPm9mZiAmIDcpKSB7CisgICAgICAgIC8vIGFzIGxvbmcgYXMgYXZwcml2X21wZWc0YXVkaW9fZ2V0X2NvbmZpZyB3b3JrcyBjb3JyZWN0bHkgdGhpcyBpcyBpbXBvc3NpYmxlCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkJVRzogQUxTIG9mZnNldCBpcyBub3QgYnl0ZS1hbGlnbmVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIC8qIEZJWE1FOiBhcmUgYW55IGZvcm1hdHMgbm90IGFsbG93ZWQgaW4gTEFUTT8gKi8KKworICAgIGlmIChtNGFjLm9iamVjdF90eXBlID4gQU9UX1NCUiAmJiBtNGFjLm9iamVjdF90eXBlICE9IEFPVF9BTFMpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTXV4aW5nIE1QRUctNCBBT1QgJWQgaW4gTEFUTSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBtNGFjLm9iamVjdF90eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGN0eC0+Y2hhbm5lbF9jb25mID0gbTRhYy5jaGFuX2NvbmZpZzsKKyAgICBjdHgtPm9iamVjdF90eXBlICA9IG00YWMub2JqZWN0X3R5cGU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYXRtX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTEFUTUNvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDX0xBVE0pCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYKKyAgICAgICAgbGF0bV9kZWNvZGVfZXh0cmFkYXRhKGN0eCwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxhdG1fd3JpdGVfZnJhbWVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgUHV0Qml0Q29udGV4dCAqYnMpCit7CisgICAgTEFUTUNvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBpbnQgaGVhZGVyX3NpemU7CisKKyAgICAvKiBBdWRpb011eEVsZW1lbnQgKi8KKyAgICBwdXRfYml0cyhicywgMSwgISFjdHgtPmNvdW50ZXIpOworCisgICAgaWYgKCFjdHgtPmNvdW50ZXIpIHsKKyAgICAgICAgLyogU3RyZWFtTXV4Q29uZmlnICovCisgICAgICAgIHB1dF9iaXRzKGJzLCAxLCAwKTsgLyogYXVkaW9NdXhWZXJzaW9uICovCisgICAgICAgIHB1dF9iaXRzKGJzLCAxLCAxKTsgLyogYWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyAqLworICAgICAgICBwdXRfYml0cyhicywgNiwgMCk7IC8qIG51bVN1YkZyYW1lcyAqLworICAgICAgICBwdXRfYml0cyhicywgNCwgMCk7IC8qIG51bVByb2dyYW0gKi8KKyAgICAgICAgcHV0X2JpdHMoYnMsIDMsIDApOyAvKiBudW1MYXllciAqLworCisgICAgICAgIC8qIEF1ZGlvU3BlY2lmaWNDb25maWcgKi8KKyAgICAgICAgaWYgKGN0eC0+b2JqZWN0X3R5cGUgPT0gQU9UX0FMUykgeworICAgICAgICAgICAgaGVhZGVyX3NpemUgPSBhdmN0eC0+ZXh0cmFkYXRhX3NpemUtKGN0eC0+b2ZmID4+IDMpOworICAgICAgICAgICAgYXZwcml2X2NvcHlfYml0cyhicywgJmF2Y3R4LT5leHRyYWRhdGFbY3R4LT5vZmYgPj4gM10sIGhlYWRlcl9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vICsgMyBhc3N1bWVzIG5vdCBzY2FsYWJsZSBhbmQgZGVwZW5kc09uQ29yZUNvZGVyID09IDAsCisgICAgICAgICAgICAvLyBzZWUgZGVjb2RlX2dhX3NwZWNpZmljX2NvbmZpZyBpbiBsaWJhdmNvZGVjL2FhY2RlYy5jCisgICAgICAgICAgICBhdnByaXZfY29weV9iaXRzKGJzLCBhdmN0eC0+ZXh0cmFkYXRhLCBjdHgtPm9mZiArIDMpOworCisgICAgICAgICAgICBpZiAoIWN0eC0+Y2hhbm5lbF9jb25mKSB7CisgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzOCgmZ2IsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCBjdHgtPm9mZiArIDMpOworICAgICAgICAgICAgICAgIGF2cHJpdl9jb3B5X3BjZV9kYXRhKGJzLCAmZ2IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHV0X2JpdHMoYnMsIDMsIDApOyAvKiBmcmFtZUxlbmd0aFR5cGUgKi8KKyAgICAgICAgcHV0X2JpdHMoYnMsIDgsIDB4ZmYpOyAvKiBsYXRtQnVmZmVyRnVsbG5lc3MgKi8KKworICAgICAgICBwdXRfYml0cyhicywgMSwgMCk7IC8qIG90aGVyRGF0YVByZXNlbnQgKi8KKyAgICAgICAgcHV0X2JpdHMoYnMsIDEsIDApOyAvKiBjcmNDaGVja1ByZXNlbnQgKi8KKyAgICB9CisKKyAgICBjdHgtPmNvdW50ZXIrKzsKKyAgICBjdHgtPmNvdW50ZXIgJT0gY3R4LT5tb2Q7Cit9CisKK3N0YXRpYyBpbnQgbGF0bV93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIExBVE1Db250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgUHV0Qml0Q29udGV4dCBiczsKKyAgICBpbnQgaSwgbGVuOworICAgIHVpbnQ4X3QgbG9hc19oZWFkZXJbXSA9ICJceDU2XHhlMFx4MDAiOworCisgICAgaWYgKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUNfTEFUTSkKKyAgICAgICAgcmV0dXJuIGZmX3Jhd193cml0ZV9wYWNrZXQocywgcGt0KTsKKworICAgIGlmIChwa3QtPnNpemUgPiAyICYmIHBrdC0+ZGF0YVswXSA9PSAweGZmICYmIChwa3QtPmRhdGFbMV0gPj4gNCkgPT0gMHhmKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBRFRTIGhlYWRlciBkZXRlY3RlZCAtIEFEVFMgd2lsbCBub3QgYmUgaW5jb3JyZWN0bHkgbXV4ZWQgaW50byBMQVRNXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCFzLT5zdHJlYW1zWzBdLT5jb2RlYy0+ZXh0cmFkYXRhKSB7CisgICAgICAgIGlmKHBrdC0+c2l6ZSA+IDIgJiYgcGt0LT5kYXRhWzBdID09IDB4NTYgJiYgKHBrdC0+ZGF0YVsxXSA+PiA0KSA9PSAweGUgJiYKKyAgICAgICAgICAgIChBVl9SQjE2KHBrdC0+ZGF0YSArIDEpICYgMHgxRkZGKSArIDMgPT0gcGt0LT5zaXplKQorICAgICAgICAgICAgcmV0dXJuIGZmX3Jhd193cml0ZV9wYWNrZXQocywgcGt0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHBrdC0+c2l6ZSA+IDB4MWZmZikKKyAgICAgICAgZ290byB0b29fbGFyZ2U7CisKKyAgICBpbml0X3B1dF9iaXRzKCZicywgY3R4LT5idWZmZXIsIHBrdC0+c2l6ZSsxMDI0K01BWF9FWFRSQURBVEFfU0laRSk7CisKKyAgICBsYXRtX3dyaXRlX2ZyYW1lX2hlYWRlcihzLCAmYnMpOworCisgICAgLyogUGF5bG9hZExlbmd0aEluZm8oKSAqLworICAgIGZvciAoaSA9IDA7IGkgPD0gcGt0LT5zaXplLTI1NTsgaSs9MjU1KQorICAgICAgICBwdXRfYml0cygmYnMsIDgsIDI1NSk7CisKKyAgICBwdXRfYml0cygmYnMsIDgsIHBrdC0+c2l6ZS1pKTsKKworICAgIC8qIFRoZSBMQVRNIHBheWxvYWQgaXMgd3JpdHRlbiB1bmFsaWduZWQgKi8KKworICAgIC8qIFBheWxvYWRNdXgoKSAqLworICAgIGlmIChwa3QtPnNpemUgJiYgKHBrdC0+ZGF0YVswXSAmIDB4ZTEpID09IDB4ODEpIHsKKyAgICAgICAgLy8gQ29udmVydCBieXRlLWFsaWduZWQgRFNFIHRvIG5vbi1hbGlnbmVkLgorICAgICAgICAvLyBEdWUgdG8gdGhlIGlucHV0IGZvcm1hdCBlbmNvZGluZyB3ZSBrbm93IHRoYXQKKyAgICAgICAgLy8gaXQgaXMgbmF0dXJhbGx5IGJ5dGUtYWxpZ25lZCBpbiB0aGUgaW5wdXQgc3RyZWFtLAorICAgICAgICAvLyBzbyB0aGVyZSBhcmUgbm8gcGFkZGluZyBiaXRzIHRvIGFjY291bnQgZm9yLgorICAgICAgICAvLyBUbyBhdm9pZCBoYXZpbmcgdG8gYWRkIHBhZGRpbmcgYml0cyBhbmQgcmVhcnJhbmdlCisgICAgICAgIC8vIHRoZSB3aG9sZSBzdHJlYW0gd2UganVzdCByZW1vdmUgdGhlIGJ5dGUtYWxpZ24gZmxhZy4KKyAgICAgICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcmVtdXggb3VyIEZBVEUgQUFDIHNhbXBsZXMgaW50byBsYXRtCisgICAgICAgIC8vIGZpbGVzIHRoYXQgYXJlIHN0aWxsIHBsYXlhYmxlIHdpdGggbWluaW1hbCBlZmZvcnQuCisgICAgICAgIHB1dF9iaXRzKCZicywgOCwgcGt0LT5kYXRhWzBdICYgMHhmZSk7CisgICAgICAgIGF2cHJpdl9jb3B5X2JpdHMoJmJzLCBwa3QtPmRhdGEgKyAxLCA4KnBrdC0+c2l6ZSAtIDgpOworICAgIH0gZWxzZQorICAgICAgICBhdnByaXZfY29weV9iaXRzKCZicywgcGt0LT5kYXRhLCA4KnBrdC0+c2l6ZSk7CisKKyAgICBhdnByaXZfYWxpZ25fcHV0X2JpdHMoJmJzKTsKKyAgICBmbHVzaF9wdXRfYml0cygmYnMpOworCisgICAgbGVuID0gcHV0X2JpdHNfY291bnQoJmJzKSA+PiAzOworCisgICAgaWYgKGxlbiA+IDB4MWZmZikKKyAgICAgICAgZ290byB0b29fbGFyZ2U7CisKKyAgICBsb2FzX2hlYWRlclsxXSB8PSAobGVuID4+IDgpICYgMHgxZjsKKyAgICBsb2FzX2hlYWRlclsyXSB8PSBsZW4gJiAweGZmOworCisgICAgYXZpb193cml0ZShwYiwgbG9hc19oZWFkZXIsIDMpOworICAgIGF2aW9fd3JpdGUocGIsIGN0eC0+YnVmZmVyLCBsZW4pOworCisgICAgcmV0dXJuIDA7CisKK3Rvb19sYXJnZToKKyAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTEFUTSBwYWNrZXQgc2l6ZSBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemUgMHgxZmZmXG4iKTsKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfbGF0bV9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGF0bSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkxPQVMvTEFUTSIpLAorICAgIC5taW1lX3R5cGUgICAgICA9ICJhdWRpby9NUDRBLUxBVE0iLAorICAgIC5leHRlbnNpb25zICAgICA9ICJsYXRtLGxvYXMiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihMQVRNQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfQUFDLAorICAgIC52aWRlb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgID0gbGF0bV93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gbGF0bV93cml0ZV9wYWNrZXQsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmxhdG1fbXV4ZXJfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9saWJhdmZvcm1hdC52IGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2xpYmF2Zm9ybWF0LnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwYWVmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9saWJhdmZvcm1hdC52CkBAIC0wLDAgKzEsMjAgQEAKK0xJQkFWRk9STUFUXyRNQUpPUiB7CisgICAgICAgIGdsb2JhbDogYXYqOworICAgICAgICAgICAgICAgICNGSVhNRSB0aG9zZSBhcmUgZm9yIGZmc2VydmVyCisgICAgICAgICAgICAgICAgZmZfaW5ldF9hdG9uOworICAgICAgICAgICAgICAgIGZmX3NvY2tldF9ub25ibG9jazsKKyAgICAgICAgICAgICAgICBmZl9ydHNwX3BhcnNlX2xpbmU7CisgICAgICAgICAgICAgICAgZmZfcnRwX2dldF9sb2NhbF9ydHBfcG9ydDsKKyAgICAgICAgICAgICAgICBmZl9ydHBfZ2V0X2xvY2FsX3J0Y3BfcG9ydDsKKyAgICAgICAgICAgICAgICBmZmlvX29wZW5fZHluX3BhY2tldF9idWY7CisgICAgICAgICAgICAgICAgZmZpb19zZXRfYnVmX3NpemU7CisgICAgICAgICAgICAgICAgZmZ1cmxfY2xvc2U7CisgICAgICAgICAgICAgICAgZmZ1cmxfb3BlbjsKKyAgICAgICAgICAgICAgICBmZnVybF9yZWFkX2NvbXBsZXRlOworICAgICAgICAgICAgICAgIGZmdXJsX3NlZWs7CisgICAgICAgICAgICAgICAgZmZ1cmxfc2l6ZTsKKyAgICAgICAgICAgICAgICBmZnVybF93cml0ZTsKKyAgICAgICAgICAgICAgICAjdGhvc2UgYXJlIGRlcHJlY2F0ZWQsIHJlbW92ZSBvbiBuZXh0IGJ1bXAKKyAgICAgICAgICAgICAgICB1cmxfZmVvZjsKKyAgICAgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2xpYmdtZS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2xpYmdtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NjQ3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbGliZ21lLmMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisqIEBmaWxlCisqIGxpYmdtZSBkZW11eGVyCisqLworCisjaW5jbHVkZSA8Z21lL2dtZS5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgR01FQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgTXVzaWNfRW11ICptdXNpY19lbXU7CisgICAgZ21lX2luZm9fdCAqaW5mbzsgICAvLy88IHNlbGVjdGVkIHRyYWNrCisKKyAgICAvKiBvcHRpb25zICovCisgICAgaW50IHRyYWNrX2luZGV4OworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICBpbnQ2NF90IG1heF9zaXplOworfSBHTUVDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihHTUVDb250ZXh0LCB4KQorI2RlZmluZSBBIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNCisjZGVmaW5lIEQgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyJ0cmFja19pbmRleCIsICJzZXQgdHJhY2sgdGhhdCBzaG91bGQgYmUgcGxheWVkIiwgICAgICAgIE9GRlNFVCh0cmFja19pbmRleCksIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2NCA9IDB9LCAgICAgICAgICAgICAgICAwLCAgICBJTlRfTUFYLCAgQXxEfSwKKyAgICB7InNhbXBsZV9yYXRlIiwgInNldCBzYW1wbGUgcmF0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHNhbXBsZV9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0ID0gNDQxMDB9LCAgICAgICAgICAgIDEwMDAsIDk5OTk5OSwgICBBfER9LAorICAgIHsibWF4X3NpemUiLCAgICAic2V0IG1heCBmaWxlIHNpemUgc3VwcG9ydGVkIChpbiBieXRlcykiLCBPRkZTRVQobWF4X3NpemUpLCAgICBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSA1MCAqIDEwMjQgKiAxMDI0fSwgMCwgICAgU0laRV9NQVgsIEF8RH0sCisgICAge05VTEx9Cit9OworCitzdGF0aWMgdm9pZCBhZGRfbWV0YShBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVswXSkKKyAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBuYW1lLCB2YWx1ZSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgbG9hZF9tZXRhZGF0YShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgR01FQ29udGV4dCAqZ21lID0gcy0+cHJpdl9kYXRhOworICAgIGdtZV9pbmZvX3QgKmluZm8gPSBnbWUtPmluZm87CisgICAgY2hhciBidWZbMzBdOworCisgICAgYWRkX21ldGEocywgInN5c3RlbSIsICAgICAgIGluZm8tPnN5c3RlbSk7CisgICAgYWRkX21ldGEocywgImdhbWUiLCAgICAgICAgIGluZm8tPmdhbWUpOworICAgIGFkZF9tZXRhKHMsICJzb25nIiwgICAgICAgICBpbmZvLT5zb25nKTsKKyAgICBhZGRfbWV0YShzLCAiYXV0aG9yIiwgICAgICAgaW5mby0+YXV0aG9yKTsKKyAgICBhZGRfbWV0YShzLCAiY29weXJpZ2h0IiwgICAgaW5mby0+Y29weXJpZ2h0KTsKKyAgICBhZGRfbWV0YShzLCAiY29tbWVudCIsICAgICAgaW5mby0+Y29tbWVudCk7CisgICAgYWRkX21ldGEocywgImR1bXBlciIsICAgICAgIGluZm8tPmR1bXBlcik7CisKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCAoaW50KWdtZV90cmFja19jb3VudChnbWUtPm11c2ljX2VtdSkpOworICAgIGFkZF9tZXRhKHMsICJ0cmFja3MiLCBidWYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQVVESU9fUEtUX1NJWkUgNTEyCisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXJfZ21lKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgR01FQ29udGV4dCAqZ21lID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3Qgc3ogPSBhdmlvX3NpemUocGIpOworICAgIGNoYXIgKmJ1ZjsKKyAgICBjaGFyIGR1bW15OworCisgICAgaWYgKHN6IDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJDb3VsZCBub3QgZGV0ZXJtaW5lIGZpbGUgc2l6ZVxuIik7CisgICAgICAgIHN6ID0gZ21lLT5tYXhfc2l6ZTsKKyAgICB9IGVsc2UgaWYgKGdtZS0+bWF4X3NpemUgJiYgc3ogPiBnbWUtPm1heF9zaXplKSB7CisgICAgICAgIHN6ID0gZ21lLT5tYXhfc2l6ZTsKKyAgICB9CisKKyAgICBidWYgPSBhdl9tYWxsb2Moc3opOworICAgIGlmICghYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN6ID0gYXZpb19yZWFkKHBiLCBidWYsIHN6KTsKKworICAgIC8vIERhdGEgbGVmdCBtZWFucyBvdXIgYnVmZmVyICh0aGUgbWF4X3NpemUgb3B0aW9uKSBpcyB0b28gc21hbGwKKyAgICBpZiAoYXZpb19yZWFkKHBiLCAmZHVtbXksIDEpID09IDEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZpbGUgc2l6ZSBpcyBsYXJnZXIgdGhhbiBtYXhfc2l6ZSBvcHRpb24gIgorICAgICAgICAgICAgICAgInZhbHVlICUiUFJJaTY0IiwgY29uc2lkZXIgaW5jcmVhc2luZyB0aGUgbWF4X3NpemUgb3B0aW9uXG4iLAorICAgICAgICAgICAgICAgZ21lLT5tYXhfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgfQorCisgICAgaWYgKGdtZV9vcGVuX2RhdGEoYnVmLCBzeiwgJmdtZS0+bXVzaWNfZW11LCBnbWUtPnNhbXBsZV9yYXRlKSkgeworICAgICAgICBhdl9mcmVlcCgmYnVmKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2X2ZyZWVwKCZidWYpOworCisgICAgaWYgKGdtZV90cmFja19pbmZvKGdtZS0+bXVzaWNfZW11LCAmZ21lLT5pbmZvLCBnbWUtPnRyYWNrX2luZGV4KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfU1RSRUFNX05PVF9GT1VORDsKKworICAgIGlmIChnbWVfc3RhcnRfdHJhY2soZ21lLT5tdXNpY19lbXUsIGdtZS0+dHJhY2tfaW5kZXgpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworCisgICAgbG9hZF9tZXRhZGF0YShzKTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwKTsKKyAgICBpZiAoc3QtPmR1cmF0aW9uID4gMCkKKyAgICAgICAgc3QtPmR1cmF0aW9uID0gZ21lLT5pbmZvLT5sZW5ndGg7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfTkUoQVZfQ09ERUNfSURfUENNX1MxNkJFLCBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSAyOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBnbWUtPnNhbXBsZV9yYXRlOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wYWNrZXRfZ21lKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBHTUVDb250ZXh0ICpnbWUgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IG5fc2FtcGxlcyA9IEFVRElPX1BLVF9TSVpFIC8gMjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGdtZV90cmFja19lbmRlZChnbWUtPm11c2ljX2VtdSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGlmICgocmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIEFVRElPX1BLVF9TSVpFKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGdtZV9wbGF5KGdtZS0+bXVzaWNfZW11LCBuX3NhbXBsZXMsIChzaG9ydCAqKXBrdC0+ZGF0YSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIHBrdC0+c2l6ZSA9IEFVRElPX1BLVF9TSVpFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9jbG9zZV9nbWUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEdNRUNvbnRleHQgKmdtZSA9IHMtPnByaXZfZGF0YTsKKyAgICBnbWVfZnJlZV9pbmZvKGdtZS0+aW5mbyk7CisgICAgZ21lX2RlbGV0ZShnbWUtPm11c2ljX2VtdSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9zZWVrX2dtZShBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faWR4LCBpbnQ2NF90IHRzLCBpbnQgZmxhZ3MpCit7CisgICAgR01FQ29udGV4dCAqZ21lID0gcy0+cHJpdl9kYXRhOworICAgIGlmICghZ21lX3NlZWsoZ21lLT5tdXNpY19lbXUsIChpbnQpdHMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9nbWUoQVZQcm9iZURhdGEgKnApCit7CisgICAgLy8gUmVhZHMgNCBieXRlcyAtIHJldHVybnMgIiIgaWYgdW5rbm93biBmb3JtYXQuCisgICAgaWYgKGdtZV9pZGVudGlmeV9oZWFkZXIocC0+YnVmKVswXSkgeworICAgICAgICBpZiAocC0+YnVmX3NpemUgPCAxNjM4NCkKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDQgOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLyAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgY2xhc3NfZ21lID0geworICAgIC5jbGFzc19uYW1lID0gIkdhbWUgTXVzaWMgRW11IGRlbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl9saWJnbWVfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGliZ21lIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR2FtZSBNdXNpYyBFbXUgZGVtdXhlciIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihHTUVDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBwcm9iZV9nbWUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gcmVhZF9oZWFkZXJfZ21lLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0X2dtZSwKKyAgICAucmVhZF9jbG9zZSAgICAgPSByZWFkX2Nsb3NlX2dtZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSByZWFkX3NlZWtfZ21lLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZjbGFzc19nbWUsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2xpYm1vZHBsdWcuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9saWJtb2RwbHVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4YTYzMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9saWJtb2RwbHVnLmMKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisqIEBmaWxlCisqIE1vZFBsdWcgZGVtdXhlcgorKiBAdG9kbyBiZXR0ZXIgcHJvYmluZyB0aGFuIGV4dGVuc2lvbnMgbWF0Y2hpbmcKKyovCisKKyNkZWZpbmUgTU9EUExVR19TVEFUSUMKKyNpbmNsdWRlIDxsaWJtb2RwbHVnL21vZHBsdWcuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IE1vZFBsdWdDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBNb2RQbHVnRmlsZSAqZjsKKyAgICB1aW50OF90ICpidWY7IC8vLzwgaW5wdXQgZmlsZSBjb250ZW50CisKKyAgICAvKiBvcHRpb25zICovCisgICAgaW50IG5vaXNlX3JlZHVjdGlvbjsKKyAgICBpbnQgcmV2ZXJiX2RlcHRoOworICAgIGludCByZXZlcmJfZGVsYXk7CisgICAgaW50IGJhc3NfYW1vdW50OworICAgIGludCBiYXNzX3JhbmdlOworICAgIGludCBzdXJyb3VuZF9kZXB0aDsKKyAgICBpbnQgc3Vycm91bmRfZGVsYXk7CisKKyAgICBpbnQgbWF4X3NpemU7IC8vLzwgbWF4IGZpbGUgc2l6ZSB0byBhbGxvY2F0ZQorCisgICAgLyogb3B0aW9uYWwgdmlkZW8gc3RyZWFtICovCisgICAgZG91YmxlIHRzX3Blcl9wYWNrZXQ7IC8vLzwgdXNlZCB0byBkZWZpbmUgdGhlIHB0cy9kdHMgdXNpbmcgcGFja2V0X2NvdW50OworICAgIGludCBwYWNrZXRfY291bnQ7ICAgICAvLy88IHRvdGFsIG51bWJlciBvZiBhdWRpbyBwYWNrZXRzCisgICAgaW50IHByaW50X3RleHRpbmZvOyAgIC8vLzwgYm9vbCBmbGFnIGZvciBwcmludGluZyBzcGVlZCwgdGVtcG8sIG9yZGVyLCAuLi4KKyAgICBpbnQgdmlkZW9fc3RyZWFtOyAgICAgLy8vPCAxIGlmIHRoZSB1c2VyIHdhbnQgYSB2aWRlbyBzdHJlYW0sIG90aGVyd2lzZSAwCisgICAgaW50IHc7ICAgICAgICAgICAgICAgIC8vLzwgdmlkZW8gc3RyZWFtIHdpZHRoICBpbiBjaGFyIChvbmUgY2hhciA9IDh4OHB4KQorICAgIGludCBoOyAgICAgICAgICAgICAgICAvLy88IHZpZGVvIHN0cmVhbSBoZWlnaHQgaW4gY2hhciAob25lIGNoYXIgPSA4eDhweCkKKyAgICBpbnQgdmlkZW9fc3dpdGNoOyAgICAgLy8vPCAxIGlmIGN1cnJlbnQgcGFja2V0IGlzIHZpZGVvLCBvdGhlcndpc2UgMAorICAgIGludCBmc2l6ZTsgICAgICAgICAgICAvLy88IGNvbnN0YW50IGZyYW1lIHNpemUKKyAgICBpbnQgbGluZXNpemU7ICAgICAgICAgLy8vPCBsaW5lIHNpemUgaW4gYnl0ZXMKKyAgICBjaGFyICpjb2xvcl9ldmFsOyAgICAgLy8vPCBjb2xvciBldmFsIHVzZXIgaW5wdXQgZXhwcmVzc2lvbgorICAgIEFWRXhwciAqZXhwcjsgICAgICAgICAvLy88IHBhcnNlZCBjb2xvciBldmFsIGV4cHJlc3Npb24KK30gTW9kUGx1Z0NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmFyX25hbWVzW10gPSB7CisgICAgIngiLCAieSIsCisgICAgInciLCAiaCIsCisgICAgInQiLAorICAgICJzcGVlZCIsICJ0ZW1wbyIsICJvcmRlciIsICJwYXR0ZXJuIiwgInJvdyIsCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX1gsIFZBUl9ZLAorICAgIFZBUl9XLCBWQVJfSCwKKyAgICBWQVJfVElNRSwKKyAgICBWQVJfU1BFRUQsIFZBUl9URU1QTywgVkFSX09SREVSLCBWQVJfUEFUVEVSTiwgVkFSX1JPVywKKyAgICBWQVJfVkFSU19OQgorfTsKKworI2RlZmluZSBGRl9NT0RQTFVHX01BWF9GSUxFX1NJWkUgKDEwMCAqIDE8PDIwKSAvLyAxMDBNCisjZGVmaW5lIEZGX01PRFBMVUdfREVGX0ZJTEVfU0laRSAoICA1ICogMTw8MjApIC8vICAgNU0KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTW9kUGx1Z0NvbnRleHQsIHgpCisjZGVmaW5lIEQgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyJub2lzZV9yZWR1Y3Rpb24iLCAiRW5hYmxlIG5vaXNlIHJlZHVjdGlvbiAwKG9mZiktMShvbikiLCAgT0ZGU0VUKG5vaXNlX3JlZHVjdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgICAgICAgMSwgRH0sCisgICAgeyJyZXZlcmJfZGVwdGgiLCAgICAiUmV2ZXJiIGxldmVsIDAocXVpZXQpLTEwMChsb3VkKSIsICAgICAgT0ZGU0VUKHJldmVyYl9kZXB0aCksICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgICAgIDEwMCwgRH0sCisgICAgeyJyZXZlcmJfZGVsYXkiLCAgICAiUmV2ZXJiIGRlbGF5IGluIG1zLCB1c3VhbGx5IDQwLTIwMG1zIiwgT0ZGU0VUKHJldmVyYl9kZWxheSksICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgRH0sCisgICAgeyJiYXNzX2Ftb3VudCIsICAgICAiWEJhc3MgbGV2ZWwgMChxdWlldCktMTAwKGxvdWQpIiwgICAgICAgT0ZGU0VUKGJhc3NfYW1vdW50KSwgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgICAgIDEwMCwgRH0sCisgICAgeyJiYXNzX3JhbmdlIiwgICAgICAiWEJhc3MgY3V0b2ZmIGluIEh6IDEwLTEwMCIsICAgICAgICAgICAgT0ZGU0VUKGJhc3NfcmFuZ2UpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgICAgIDEwMCwgRH0sCisgICAgeyJzdXJyb3VuZF9kZXB0aCIsICAiU3Vycm91bmQgbGV2ZWwgMChxdWlldCktMTAwKGhlYXZ5KSIsICAgT0ZGU0VUKHN1cnJvdW5kX2RlcHRoKSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgICAgIDEwMCwgRH0sCisgICAgeyJzdXJyb3VuZF9kZWxheSIsICAiU3Vycm91bmQgZGVsYXkgaW4gbXMsIHVzdWFsbHkgNS00MG1zIiwgT0ZGU0VUKHN1cnJvdW5kX2RlbGF5KSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgRH0sCisgICAgeyJtYXhfc2l6ZSIsICAgICAgICAiTWF4IGZpbGUgc2l6ZSBzdXBwb3J0ZWQgKGluIGJ5dGVzKS4gRGVmYXVsdCBpcyA1TUIuIFNldCB0byAwIGZvciBubyBsaW1pdCAobm90IHJlY29tbWVuZGVkKSIsCisgICAgIE9GRlNFVChtYXhfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBGRl9NT0RQTFVHX0RFRl9GSUxFX1NJWkV9LCAwLCBGRl9NT0RQTFVHX01BWF9GSUxFX1NJWkUsIER9LAorICAgIHsidmlkZW9fc3RyZWFtX2V4cHIiLCAiQ29sb3IgZm9ybXVsYSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChjb2xvcl9ldmFsKSwgICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRH0sCisgICAgeyJ2aWRlb19zdHJlYW0iLCAgICAgICJNYWtlIGRlbXV4ZXIgb3V0cHV0IGEgdmlkZW8gc3RyZWFtIiwgICAgICAgICAgICAgT0ZGU0VUKHZpZGVvX3N0cmVhbSksICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAgIDAsICAgMSwgRH0sCisgICAgeyJ2aWRlb19zdHJlYW1fdyIsICAgICJWaWRlbyBzdHJlYW0gd2lkdGggaW4gY2hhciAob25lIGNoYXIgPSA4eDhweCkiLCAgT0ZGU0VUKHcpLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDMwfSwgMjAsIDUxMiwgRH0sCisgICAgeyJ2aWRlb19zdHJlYW1faCIsICAgICJWaWRlbyBzdHJlYW0gaGVpZ2h0IGluIGNoYXIgKG9uZSBjaGFyID0gOHg4cHgpIiwgT0ZGU0VUKGgpLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDMwfSwgMjAsIDUxMiwgRH0sCisgICAgeyJ2aWRlb19zdHJlYW1fcHR4dCIsICJQcmludCBzcGVlZCwgdGVtcG8sIG9yZGVyLCAuLi4gaW4gdmlkZW8gc3RyZWFtIiwgT0ZGU0VUKHByaW50X3RleHRpbmZvKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDF9LCAgIDAsICAgMSwgRH0sCisgICAge05VTEx9LAorfTsKKworI2RlZmluZSBTRVRfT1BUX0lGX1JFUVVFU1RFRChsaWJvcHQsIG9wdCwgZmxhZykgZG8geyAgICAgICAgXAorICAgIGlmIChtb2RwbHVnLT5vcHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzZXR0aW5ncy5saWJvcHQgID0gbW9kcGx1Zy0+b3B0OyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzZXR0aW5ncy5tRmxhZ3MgfD0gZmxhZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBRERfTUVUQV9NVUxUSVBMRV9FTlRSSUVTKGVudHJ5X25hbWUsIGZuYW1lKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobl8jIyBlbnRyeV9uYW1lICMjcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGksIG4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5fIyMgZW50cnlfbmFtZSAjI3M7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjaGFyIGl0ZW1fbmFtZVs2NF0gPSB7MH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm5hbWUoZiwgaSwgaXRlbV9uYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICghKml0ZW1fbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICNlbnRyeV9uYW1lLCAiXG4iLCBBVl9ESUNUX0FQUEVORCk7ICBcCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICNlbnRyeV9uYW1lLCBpdGVtX25hbWUsIEFWX0RJQ1RfQVBQRU5EKTsgXAorICAgICAgICAgICAgbisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBleHRyYSA9IGF2X2FzcHJpbnRmKCIsICV1LyV1ICIgI2VudHJ5X25hbWUgIiVzIiwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLCBuXyMjIGVudHJ5X25hbWUgIyNzLCBuID4gMSA/ICJzIiA6ICIiKTsgICAgICAgICBcCisgICAgICAgIGlmICghZXh0cmEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCAiZXh0cmEgaW5mbyIsIGV4dHJhLCBBVl9ESUNUX0FQUEVORCk7ICAgICAgICBcCisgICAgICAgIGF2X2ZyZWUoZXh0cmEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgbW9kcGx1Z19sb2FkX21ldGFkYXRhKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNb2RQbHVnQ29udGV4dCAqbW9kcGx1ZyA9IHMtPnByaXZfZGF0YTsKKyAgICBNb2RQbHVnRmlsZSAqZiA9IG1vZHBsdWctPmY7CisgICAgY2hhciAqZXh0cmE7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IE1vZFBsdWdfR2V0TmFtZShmKTsKKyAgICBjb25zdCBjaGFyICptc2cgID0gTW9kUGx1Z19HZXRNZXNzYWdlKGYpOworCisgICAgdW5zaWduZWQgbl9pbnN0cnVtZW50cyA9IE1vZFBsdWdfTnVtSW5zdHJ1bWVudHMoZik7CisgICAgdW5zaWduZWQgbl9zYW1wbGVzICAgICA9IE1vZFBsdWdfTnVtU2FtcGxlcyhmKTsKKyAgICB1bnNpZ25lZCBuX3BhdHRlcm5zICAgID0gTW9kUGx1Z19OdW1QYXR0ZXJucyhmKTsKKyAgICB1bnNpZ25lZCBuX2NoYW5uZWxzICAgID0gTW9kUGx1Z19OdW1DaGFubmVscyhmKTsKKworICAgIGlmIChuYW1lICYmICpuYW1lKSBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJuYW1lIiwgICAgbmFtZSwgMCk7CisgICAgaWYgKG1zZyAgJiYgKm1zZykgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgIm1lc3NhZ2UiLCBtc2csICAwKTsKKworICAgIGV4dHJhID0gYXZfYXNwcmludGYoIiV1IHBhdHRlcm4lcywgJXUgY2hhbm5lbCVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5fcGF0dGVybnMsIG5fcGF0dGVybnMgPiAxID8gInMiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuX2NoYW5uZWxzLCBuX2NoYW5uZWxzID4gMSA/ICJzIiA6ICIiKTsKKyAgICBpZiAoIWV4dHJhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgImV4dHJhIGluZm8iLCBleHRyYSwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworCisgICAgQUREX01FVEFfTVVMVElQTEVfRU5UUklFUyhpbnN0cnVtZW50LCBNb2RQbHVnX0luc3RydW1lbnROYW1lKTsKKyAgICBBRERfTUVUQV9NVUxUSVBMRV9FTlRSSUVTKHNhbXBsZSwgICAgIE1vZFBsdWdfU2FtcGxlTmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBBVURJT19QS1RfU0laRSA1MTIKKworc3RhdGljIGludCBtb2RwbHVnX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgTW9kUGx1Z19TZXR0aW5ncyBzZXR0aW5nczsKKyAgICBNb2RQbHVnQ29udGV4dCAqbW9kcGx1ZyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IHN6ID0gYXZpb19zaXplKHBiKTsKKworICAgIGlmIChzeiA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiQ291bGQgbm90IGRldGVybWluZSBmaWxlIHNpemVcbiIpOworICAgICAgICBzeiA9IG1vZHBsdWctPm1heF9zaXplOworICAgIH0gZWxzZSBpZiAobW9kcGx1Zy0+bWF4X3NpemUgJiYgc3ogPiBtb2RwbHVnLT5tYXhfc2l6ZSkgeworICAgICAgICBzeiA9IG1vZHBsdWctPm1heF9zaXplOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJNYXggZmlsZSBzaXplIHJlYWNoJXMsIGFsbG9jYXRpbmcgJSJQUklpNjQiQiAiCisgICAgICAgICAgICAgICAiYnV0IGRlbXV4aW5nIGlzIGxpa2VseSB0byBmYWlsIGR1ZSB0byBpbmNvbXBsZXRlIGJ1ZmZlclxuIiwKKyAgICAgICAgICAgICAgIHN6ID09IEZGX01PRFBMVUdfREVGX0ZJTEVfU0laRSA/ICIgKHNlZSAtbWF4X3NpemUpIiA6ICIiLCBzeik7CisgICAgfQorCisgICAgaWYgKG1vZHBsdWctPmNvbG9yX2V2YWwpIHsKKyAgICAgICAgaW50IHIgPSBhdl9leHByX3BhcnNlKCZtb2RwbHVnLT5leHByLCBtb2RwbHVnLT5jb2xvcl9ldmFsLCB2YXJfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBzKTsKKyAgICAgICAgaWYgKHIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgbW9kcGx1Zy0+YnVmID0gYXZfbWFsbG9jKG1vZHBsdWctPm1heF9zaXplKTsKKyAgICBpZiAoIW1vZHBsdWctPmJ1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzeiA9IGF2aW9fcmVhZChwYiwgbW9kcGx1Zy0+YnVmLCBzeik7CisKKyAgICBNb2RQbHVnX0dldFNldHRpbmdzKCZzZXR0aW5ncyk7CisgICAgc2V0dGluZ3MubUNoYW5uZWxzICAgICAgID0gMjsKKyAgICBzZXR0aW5ncy5tQml0cyAgICAgICAgICAgPSAxNjsKKyAgICBzZXR0aW5ncy5tRnJlcXVlbmN5ICAgICAgPSA0NDEwMDsKKyAgICBzZXR0aW5ncy5tUmVzYW1wbGluZ01vZGUgPSBNT0RQTFVHX1JFU0FNUExFX0ZJUjsgLy8gYmVzdCBxdWFsaXR5CisgICAgc2V0dGluZ3MubUxvb3BDb3VudCAgICAgID0gMDsgLy8gcHJldmVudHMgbG9vcGluZyBmb3JldmVyCisKKyAgICBpZiAobW9kcGx1Zy0+bm9pc2VfcmVkdWN0aW9uKSBzZXR0aW5ncy5tRmxhZ3MgICAgIHw9IE1PRFBMVUdfRU5BQkxFX05PSVNFX1JFRFVDVElPTjsKKyAgICBTRVRfT1BUX0lGX1JFUVVFU1RFRChtUmV2ZXJiRGVwdGgsICAgcmV2ZXJiX2RlcHRoLCAgIE1PRFBMVUdfRU5BQkxFX1JFVkVSQik7CisgICAgU0VUX09QVF9JRl9SRVFVRVNURUQobVJldmVyYkRlbGF5LCAgIHJldmVyYl9kZWxheSwgICBNT0RQTFVHX0VOQUJMRV9SRVZFUkIpOworICAgIFNFVF9PUFRfSUZfUkVRVUVTVEVEKG1CYXNzQW1vdW50LCAgICBiYXNzX2Ftb3VudCwgICAgTU9EUExVR19FTkFCTEVfTUVHQUJBU1MpOworICAgIFNFVF9PUFRfSUZfUkVRVUVTVEVEKG1CYXNzUmFuZ2UsICAgICBiYXNzX3JhbmdlLCAgICAgTU9EUExVR19FTkFCTEVfTUVHQUJBU1MpOworICAgIFNFVF9PUFRfSUZfUkVRVUVTVEVEKG1TdXJyb3VuZERlcHRoLCBzdXJyb3VuZF9kZXB0aCwgTU9EUExVR19FTkFCTEVfU1VSUk9VTkQpOworICAgIFNFVF9PUFRfSUZfUkVRVUVTVEVEKG1TdXJyb3VuZERlbGF5LCBzdXJyb3VuZF9kZWxheSwgTU9EUExVR19FTkFCTEVfU1VSUk9VTkQpOworCisgICAgaWYgKG1vZHBsdWctPnJldmVyYl9kZXB0aCkgICBzZXR0aW5ncy5tUmV2ZXJiRGVwdGggICA9IG1vZHBsdWctPnJldmVyYl9kZXB0aDsKKyAgICBpZiAobW9kcGx1Zy0+cmV2ZXJiX2RlbGF5KSAgIHNldHRpbmdzLm1SZXZlcmJEZWxheSAgID0gbW9kcGx1Zy0+cmV2ZXJiX2RlbGF5OworICAgIGlmIChtb2RwbHVnLT5iYXNzX2Ftb3VudCkgICAgc2V0dGluZ3MubUJhc3NBbW91bnQgICAgPSBtb2RwbHVnLT5iYXNzX2Ftb3VudDsKKyAgICBpZiAobW9kcGx1Zy0+YmFzc19yYW5nZSkgICAgIHNldHRpbmdzLm1CYXNzUmFuZ2UgICAgID0gbW9kcGx1Zy0+YmFzc19yYW5nZTsKKyAgICBpZiAobW9kcGx1Zy0+c3Vycm91bmRfZGVwdGgpIHNldHRpbmdzLm1TdXJyb3VuZERlcHRoID0gbW9kcGx1Zy0+c3Vycm91bmRfZGVwdGg7CisgICAgaWYgKG1vZHBsdWctPnN1cnJvdW5kX2RlbGF5KSBzZXR0aW5ncy5tU3Vycm91bmREZWxheSA9IG1vZHBsdWctPnN1cnJvdW5kX2RlbGF5OworCisgICAgTW9kUGx1Z19TZXRTZXR0aW5ncygmc2V0dGluZ3MpOworCisgICAgbW9kcGx1Zy0+ZiA9IE1vZFBsdWdfTG9hZChtb2RwbHVnLT5idWYsIHN6KTsKKyAgICBpZiAoIW1vZHBsdWctPmYpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDApOworICAgIHN0LT5kdXJhdGlvbiA9IE1vZFBsdWdfR2V0TGVuZ3RoKG1vZHBsdWctPmYpOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gc2V0dGluZ3MubUNoYW5uZWxzOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzZXR0aW5ncy5tRnJlcXVlbmN5OworCisgICAgLy8gdGltZWJhc2UgPSAxLzEwMDAsIDJjaCAxNmJpdHMgNDQuMWtIei0+IDIqMio0NDEwMAorICAgIG1vZHBsdWctPnRzX3Blcl9wYWNrZXQgPSAxMDAwKkFVRElPX1BLVF9TSVpFIC8gKDQqNDQxMDAuKTsKKworICAgIGlmIChtb2RwbHVnLT52aWRlb19zdHJlYW0pIHsKKyAgICAgICAgQVZTdHJlYW0gKnZzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghdnN0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyh2c3QsIDY0LCAxLCAxMDAwKTsKKyAgICAgICAgdnN0LT5kdXJhdGlvbiA9IHN0LT5kdXJhdGlvbjsKKyAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1hCSU47CisgICAgICAgIHZzdC0+Y29kZWMtPndpZHRoICAgICAgPSBtb2RwbHVnLT53IDw8IDM7CisgICAgICAgIHZzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBtb2RwbHVnLT5oIDw8IDM7CisgICAgICAgIG1vZHBsdWctPmxpbmVzaXplID0gbW9kcGx1Zy0+dyAqIDM7CisgICAgICAgIG1vZHBsdWctPmZzaXplICAgID0gbW9kcGx1Zy0+bGluZXNpemUgKiBtb2RwbHVnLT5oOworICAgIH0KKworICAgIHJldHVybiBtb2RwbHVnX2xvYWRfbWV0YWRhdGEocyk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3RleHQodWludDhfdCAqZHN0LCBjb25zdCBjaGFyICpzLCBpbnQgbGluZXNpemUsIGludCB4LCBpbnQgeSkKK3sKKyAgICBpbnQgaTsKKyAgICBkc3QgKz0geSpsaW5lc2l6ZSArIHgqMzsKKyAgICBmb3IgKGkgPSAwOyBzW2ldOyBpKyssIGRzdCArPSAzKSB7CisgICAgICAgIGRzdFswXSA9IDB4MDsgICAvLyBjb3VudCAtIDEKKyAgICAgICAgZHN0WzFdID0gc1tpXTsgIC8vIGNoYXIKKyAgICAgICAgZHN0WzJdID0gMHgwZjsgIC8vIGJhY2tncm91bmQgLyBmb3JlZ3JvdW5kCisgICAgfQorfQorCisjZGVmaW5lIFBSSU5UX0lORk8obGluZSwgbmFtZSwgaWR2YWx1ZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc25wcmludGYoaW50YnVmLCBzaXplb2YoaW50YnVmKSwgIiUuMGYiLCB2YXJfdmFsdWVzW2lkdmFsdWVdKTsgICAgICBcCisgICAgd3JpdGVfdGV4dChwa3QtPmRhdGEsIG5hbWUgIjoiLCBtb2RwbHVnLT5saW5lc2l6ZSwgIDArMSwgbGluZSsxKTsgICBcCisgICAgd3JpdGVfdGV4dChwa3QtPmRhdGEsIGludGJ1ZiwgICBtb2RwbHVnLT5saW5lc2l6ZSwgMTArMSwgbGluZSsxKTsgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IG1vZHBsdWdfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE1vZFBsdWdDb250ZXh0ICptb2RwbHVnID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKG1vZHBsdWctPnZpZGVvX3N0cmVhbSkgeworICAgICAgICBtb2RwbHVnLT52aWRlb19zd2l0Y2ggXj0gMTsgLy8gb25lIHZpZGVvIHBhY2tldCBmb3Igb25lIGF1ZGlvIHBhY2tldAorICAgICAgICBpZiAobW9kcGx1Zy0+dmlkZW9fc3dpdGNoKSB7CisgICAgICAgICAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJfVkFSU19OQl07CisKKyAgICAgICAgICAgIHZhcl92YWx1ZXNbVkFSX1cgICAgICBdID0gbW9kcGx1Zy0+dzsKKyAgICAgICAgICAgIHZhcl92YWx1ZXNbVkFSX0ggICAgICBdID0gbW9kcGx1Zy0+aDsKKyAgICAgICAgICAgIHZhcl92YWx1ZXNbVkFSX1RJTUUgICBdID0gbW9kcGx1Zy0+cGFja2V0X2NvdW50ICogbW9kcGx1Zy0+dHNfcGVyX3BhY2tldDsKKyAgICAgICAgICAgIHZhcl92YWx1ZXNbVkFSX1NQRUVEICBdID0gTW9kUGx1Z19HZXRDdXJyZW50U3BlZWQgIChtb2RwbHVnLT5mKTsKKyAgICAgICAgICAgIHZhcl92YWx1ZXNbVkFSX1RFTVBPICBdID0gTW9kUGx1Z19HZXRDdXJyZW50VGVtcG8gIChtb2RwbHVnLT5mKTsKKyAgICAgICAgICAgIHZhcl92YWx1ZXNbVkFSX09SREVSICBdID0gTW9kUGx1Z19HZXRDdXJyZW50T3JkZXIgIChtb2RwbHVnLT5mKTsKKyAgICAgICAgICAgIHZhcl92YWx1ZXNbVkFSX1BBVFRFUk5dID0gTW9kUGx1Z19HZXRDdXJyZW50UGF0dGVybihtb2RwbHVnLT5mKTsKKyAgICAgICAgICAgIHZhcl92YWx1ZXNbVkFSX1JPVyAgICBdID0gTW9kUGx1Z19HZXRDdXJyZW50Um93ICAgIChtb2RwbHVnLT5mKTsKKworICAgICAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBtb2RwbHVnLT5mc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDE7CisgICAgICAgICAgICBtZW1zZXQocGt0LT5kYXRhLCAwLCBtb2RwbHVnLT5mc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChtb2RwbHVnLT5wcmludF90ZXh0aW5mbykgeworICAgICAgICAgICAgICAgIGNoYXIgaW50YnVmWzMyXTsKKyAgICAgICAgICAgICAgICBQUklOVF9JTkZPKDAsICJzcGVlZCIsICAgVkFSX1NQRUVEKTsKKyAgICAgICAgICAgICAgICBQUklOVF9JTkZPKDEsICJ0ZW1wbyIsICAgVkFSX1RFTVBPKTsKKyAgICAgICAgICAgICAgICBQUklOVF9JTkZPKDIsICJvcmRlciIsICAgVkFSX09SREVSKTsKKyAgICAgICAgICAgICAgICBQUklOVF9JTkZPKDMsICJwYXR0ZXJuIiwgVkFSX1BBVFRFUk4pOworICAgICAgICAgICAgICAgIFBSSU5UX0lORk8oNCwgInJvdyIsICAgICBWQVJfUk9XKTsKKyAgICAgICAgICAgICAgICBQUklOVF9JTkZPKDUsICJ0cyIsICAgICAgVkFSX1RJTUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobW9kcGx1Zy0+ZXhwcikgeworICAgICAgICAgICAgICAgIGludCB4LCB5OworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBtb2RwbHVnLT5oOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG1vZHBsdWctPnc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvbG9yOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3ZhbHVlc1tWQVJfWF0gPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3ZhbHVlc1tWQVJfWV0gPSB5OworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBhdl9leHByX2V2YWwobW9kcGx1Zy0+ZXhwciwgdmFyX3ZhbHVlcywgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmRhdGFbeSptb2RwbHVnLT5saW5lc2l6ZSArIHgqMyArIDJdIHw9IGF2X2NsaXAoKGludCljb2xvciwgMCwgMHhmKTw8NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBrdC0+cHRzID0gcGt0LT5kdHMgPSB2YXJfdmFsdWVzW1ZBUl9USU1FXTsKKyAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIEFVRElPX1BLVF9TSVpFKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAobW9kcGx1Zy0+dmlkZW9fc3RyZWFtKQorICAgICAgICBwa3QtPnB0cyA9IHBrdC0+ZHRzID0gbW9kcGx1Zy0+cGFja2V0X2NvdW50KysgKiBtb2RwbHVnLT50c19wZXJfcGFja2V0OworCisgICAgcGt0LT5zaXplID0gTW9kUGx1Z19SZWFkKG1vZHBsdWctPmYsIHBrdC0+ZGF0YSwgQVVESU9fUEtUX1NJWkUpOworICAgIGlmIChwa3QtPnNpemUgPD0gMCkgeworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gcGt0LT5zaXplID09IDAgPyBBVkVSUk9SX0VPRiA6IEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW9kcGx1Z19yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNb2RQbHVnQ29udGV4dCAqbW9kcGx1ZyA9IHMtPnByaXZfZGF0YTsKKyAgICBNb2RQbHVnX1VubG9hZChtb2RwbHVnLT5mKTsKKyAgICBhdl9mcmVlcCgmbW9kcGx1Zy0+YnVmKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb2RwbHVnX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faWR4LCBpbnQ2NF90IHRzLCBpbnQgZmxhZ3MpCit7CisgICAgTW9kUGx1Z0NvbnRleHQgKm1vZHBsdWcgPSBzLT5wcml2X2RhdGE7CisgICAgTW9kUGx1Z19TZWVrKG1vZHBsdWctPmYsIChpbnQpdHMpOworICAgIGlmIChtb2RwbHVnLT52aWRlb19zdHJlYW0pCisgICAgICAgIG1vZHBsdWctPnBhY2tldF9jb3VudCA9IHRzIC8gbW9kcGx1Zy0+dHNfcGVyX3BhY2tldDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbW9kcGx1Z19leHRlbnNpb25zW10gPSAiNjY5LGFiYyxhbWYsYW1zLGRibSxkbWYsZHNtLGZhcixpdCxtZGwsbWVkLG1pZCxtb2QsbXQyLG10bSxva3QscHNtLHB0bSxzM20sc3RtLHVsdCx1bXgseG0saXRneixpdHIsaXR6LG1kZ3osbWRyLG1keixzM2d6LHMzcixzM3oseG1neix4bXIseG16IjsKKworc3RhdGljIGludCBtb2RwbHVnX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChhdl9tYXRjaF9leHQocC0+ZmlsZW5hbWUsIG1vZHBsdWdfZXh0ZW5zaW9ucykpIHsKKyAgICAgICAgaWYgKHAtPmJ1Zl9zaXplIDwgMTYzODQpCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04vMi0xOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBtb2RwbHVnX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIk1vZFBsdWcgZGVtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2xpYm1vZHBsdWdfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlibW9kcGx1ZyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1vZFBsdWcgZGVtdXhlciIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNb2RQbHVnQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gbW9kcGx1Z19wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBtb2RwbHVnX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IG1vZHBsdWdfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gbW9kcGx1Z19yZWFkX2Nsb3NlLAorICAgIC5yZWFkX3NlZWsgICAgICA9IG1vZHBsdWdfcmVhZF9zZWVrLAorICAgIC5leHRlbnNpb25zICAgICA9IG1vZHBsdWdfZXh0ZW5zaW9ucywKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmbW9kcGx1Z19jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbGlibnV0LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbGlibnV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5YTIxYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9saWJudXQuYwpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIE5VVCAoZGUpbXV4aW5nIHZpYSBsaWJudXQKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBPZGVkIFNoaW1vbiA8b2RzMTVAb2RzMTUuZHluZG5zLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTlVUIGRlbXV4aW5nIGFuZCBtdXhpbmcgdmlhIGxpYm51dC4KKyAqIEBhdXRob3IgT2RlZCBTaGltb24gPG9kczE1QG9kczE1LmR5bmRucy5vcmc+CisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyaWZmLmgiCisjaW5jbHVkZSA8bGlibnV0Lmg+CisKKyNkZWZpbmUgSURfU1RSSU5HICJudXQvbXVsdGltZWRpYSBjb250YWluZXIiCisjZGVmaW5lIElEX0xFTkdUSCAoc3RybGVuKElEX1NUUklORykgKyAxKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbnV0X2NvbnRleHRfdHQgKiBudXQ7CisgICAgbnV0X3N0cmVhbV9oZWFkZXJfdHQgKiBzOworfSBOVVRDb250ZXh0OworCitzdGF0aWMgY29uc3QgQVZDb2RlY1RhZyBudXRfdGFnc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICBNS1RBRygnbScsICdwJywgJzQnLCAndicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUDMsICAgIE1LVEFHKCdtJywgJ3AnLCAnMycsICcgJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZPUkJJUywgTUtUQUcoJ3YnLCAncicsICdiJywgJ3MnKSB9LAorICAgIHsgMCwgMCB9LAorfTsKKworI2lmIENPTkZJR19MSUJOVVRfTVVYRVIKK3N0YXRpYyBpbnQgYXZfd3JpdGUodm9pZCAqIGgsIHNpemVfdCBsZW4sIGNvbnN0IHVpbnQ4X3QgKiBidWYpIHsKKyAgICBBVklPQ29udGV4dCAqIGJjID0gaDsKKyAgICBhdmlvX3dyaXRlKGJjLCBidWYsIGxlbik7CisgICAgLy9hdmlvX2ZsdXNoKGJjKTsKKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IG51dF93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICogYXZmKSB7CisgICAgTlVUQ29udGV4dCAqIHByaXYgPSBhdmYtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqIGJjID0gYXZmLT5wYjsKKyAgICBudXRfbXV4ZXJfb3B0c190dCBtb3B0cyA9IHsKKyAgICAgICAgLm91dHB1dCA9IHsKKyAgICAgICAgICAgIC5wcml2ID0gYmMsCisgICAgICAgICAgICAud3JpdGUgPSBhdl93cml0ZSwKKyAgICAgICAgfSwKKyAgICAgICAgLmFsbG9jID0geyBhdl9tYWxsb2MsIGF2X3JlYWxsb2MsIGF2X2ZyZWUgfSwKKyAgICAgICAgLndyaXRlX2luZGV4ID0gMSwKKyAgICAgICAgLnJlYWx0aW1lX3N0cmVhbSA9IDAsCisgICAgICAgIC5tYXhfZGlzdGFuY2UgPSAzMjc2OCwKKyAgICAgICAgLmZ0aSA9IE5VTEwsCisgICAgfTsKKyAgICBudXRfc3RyZWFtX2hlYWRlcl90dCAqIHM7CisgICAgaW50IGk7CisKKyAgICBwcml2LT5zID0gcyA9IGF2X21hbGxvY3pfYXJyYXkoYXZmLT5uYl9zdHJlYW1zICsgMSwgc2l6ZW9mKnMpOworICAgIGlmKCFzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IGF2Zi0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWQ29kZWNDb250ZXh0ICogY29kZWMgPSBhdmYtPnN0cmVhbXNbaV0tPmNvZGVjOworICAgICAgICBpbnQgajsKKyAgICAgICAgaW50IGZvdXJjYyA9IDA7CisgICAgICAgIGludCBudW0sIGRlbm9tLCBzc2l6ZTsKKworICAgICAgICBzW2ldLnR5cGUgPSBjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gPyBOVVRfVklERU9fQ0xBU1MgOiBOVVRfQVVESU9fQ0xBU1M7CisKKyAgICAgICAgaWYgKGNvZGVjLT5jb2RlY190YWcpIGZvdXJjYyA9IGNvZGVjLT5jb2RlY190YWc7CisgICAgICAgIGVsc2UgZm91cmNjID0gZmZfY29kZWNfZ2V0X3RhZyhudXRfdGFncywgY29kZWMtPmNvZGVjX2lkKTsKKworICAgICAgICBpZiAoIWZvdXJjYykgeworICAgICAgICAgICAgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgZm91cmNjID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19ibXBfdGFncywgY29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIGZvdXJjYyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfd2F2X3RhZ3MsIGNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgIH0KKworICAgICAgICBzW2ldLmZvdXJjY19sZW4gPSA0OworICAgICAgICBzW2ldLmZvdXJjYyA9IGF2X21hbGxvYyhzW2ldLmZvdXJjY19sZW4pOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc1tpXS5mb3VyY2NfbGVuOyBqKyspIHNbaV0uZm91cmNjW2pdID0gKGZvdXJjYyA+PiAoaio4KSkgJiAweEZGOworCisgICAgICAgIGZmX3BhcnNlX3NwZWNpZmljX3BhcmFtcyhjb2RlYywgJm51bSwgJnNzaXplLCAmZGVub20pOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGF2Zi0+c3RyZWFtc1tpXSwgNjAsIGRlbm9tLCBudW0pOworCisgICAgICAgIHNbaV0udGltZV9iYXNlLm51bSA9IGRlbm9tOworICAgICAgICBzW2ldLnRpbWVfYmFzZS5kZW4gPSBudW07CisKKyAgICAgICAgc1tpXS5maXhlZF9mcHMgPSAwOworICAgICAgICBzW2ldLmRlY29kZV9kZWxheSA9IGNvZGVjLT5oYXNfYl9mcmFtZXM7CisgICAgICAgIHNbaV0uY29kZWNfc3BlY2lmaWNfbGVuID0gY29kZWMtPmV4dHJhZGF0YV9zaXplOworICAgICAgICBzW2ldLmNvZGVjX3NwZWNpZmljID0gY29kZWMtPmV4dHJhZGF0YTsKKworICAgICAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBzW2ldLndpZHRoID0gY29kZWMtPndpZHRoOworICAgICAgICAgICAgc1tpXS5oZWlnaHQgPSBjb2RlYy0+aGVpZ2h0OworICAgICAgICAgICAgc1tpXS5zYW1wbGVfd2lkdGggPSAwOworICAgICAgICAgICAgc1tpXS5zYW1wbGVfaGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIHNbaV0uY29sb3JzcGFjZV90eXBlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNbaV0uc2FtcGxlcmF0ZV9udW0gPSBjb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICBzW2ldLnNhbXBsZXJhdGVfZGVub20gPSAxOworICAgICAgICAgICAgc1tpXS5jaGFubmVsX2NvdW50ID0gY29kZWMtPmNoYW5uZWxzOworICAgICAgICB9CisgICAgfQorCisgICAgc1thdmYtPm5iX3N0cmVhbXNdLnR5cGUgPSAtMTsKKyAgICBwcml2LT5udXQgPSBudXRfbXV4ZXJfaW5pdCgmbW9wdHMsIHMsIE5VTEwpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnV0X3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKiBhdmYsIEFWUGFja2V0ICogcGt0KSB7CisgICAgTlVUQ29udGV4dCAqIHByaXYgPSBhdmYtPnByaXZfZGF0YTsKKyAgICBudXRfcGFja2V0X3R0IHA7CisKKyAgICBwLmxlbiA9IHBrdC0+c2l6ZTsKKyAgICBwLnN0cmVhbSA9IHBrdC0+c3RyZWFtX2luZGV4OworICAgIHAucHRzID0gcGt0LT5wdHM7CisgICAgcC5mbGFncyA9IHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkgPyBOVVRfRkxBR19LRVkgOiAwOworICAgIHAubmV4dF9wdHMgPSAwOworCisgICAgbnV0X3dyaXRlX2ZyYW1lX3Jlb3JkZXIocHJpdi0+bnV0LCAmcCwgcGt0LT5kYXRhKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG51dF93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqIGF2ZikgeworICAgIEFWSU9Db250ZXh0ICogYmMgPSBhdmYtPnBiOworICAgIE5VVENvbnRleHQgKiBwcml2ID0gYXZmLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBudXRfbXV4ZXJfdW5pbml0X3Jlb3JkZXIocHJpdi0+bnV0KTsKKyAgICBhdmlvX2ZsdXNoKGJjKTsKKworICAgIGZvcihpID0gMDsgcHJpdi0+c1tpXS50eXBlICE9IC0xOyBpKysgKSBhdl9mcmVlcCgmcHJpdi0+c1tpXS5mb3VyY2MpOworICAgIGF2X2ZyZWVwKCZwcml2LT5zKTsKKworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9saWJudXRfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImxpYm51dCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gIm51dCBmb3JtYXQiLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJ2aWRlby94LW51dCIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gIm51dCIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKE5VVENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1ZPUkJJUywKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBudXRfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IG51dF93cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgICAgID0gbnV0X3dyaXRlX3RyYWlsZXIsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfR0xPQkFMSEVBREVSLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfTElCTlVUX01VWEVSICovCisKK3N0YXRpYyBpbnQgbnV0X3Byb2JlKEFWUHJvYmVEYXRhICpwKSB7CisgICAgaWYgKCFtZW1jbXAocC0+YnVmLCBJRF9TVFJJTkcsIElEX0xFTkdUSCkpIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc2l6ZV90IGF2X3JlYWQodm9pZCAqIGgsIHNpemVfdCBsZW4sIHVpbnQ4X3QgKiBidWYpIHsKKyAgICBBVklPQ29udGV4dCAqIGJjID0gaDsKKyAgICByZXR1cm4gYXZpb19yZWFkKGJjLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBvZmZfdCBhdl9zZWVrKHZvaWQgKiBoLCBsb25nIGxvbmcgcG9zLCBpbnQgd2hlbmNlKSB7CisgICAgQVZJT0NvbnRleHQgKiBiYyA9IGg7CisgICAgaWYgKHdoZW5jZSA9PSBTRUVLX0VORCkgeworICAgICAgICBwb3MgPSBhdmlvX3NpemUoYmMpICsgcG9zOworICAgICAgICB3aGVuY2UgPSBTRUVLX1NFVDsKKyAgICB9CisgICAgcmV0dXJuIGF2aW9fc2VlayhiYywgcG9zLCB3aGVuY2UpOworfQorCitzdGF0aWMgaW50IG51dF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKiBhdmYpIHsKKyAgICBOVVRDb250ZXh0ICogcHJpdiA9IGF2Zi0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICogYmMgPSBhdmYtPnBiOworICAgIG51dF9kZW11eGVyX29wdHNfdHQgZG9wdHMgPSB7CisgICAgICAgIC5pbnB1dCA9IHsKKyAgICAgICAgICAgIC5wcml2ID0gYmMsCisgICAgICAgICAgICAuc2VlayA9IGF2X3NlZWssCisgICAgICAgICAgICAucmVhZCA9IGF2X3JlYWQsCisgICAgICAgICAgICAuZW9mID0gTlVMTCwKKyAgICAgICAgICAgIC5maWxlX3BvcyA9IDAsCisgICAgICAgIH0sCisgICAgICAgIC5hbGxvYyA9IHsgYXZfbWFsbG9jLCBhdl9yZWFsbG9jLCBhdl9mcmVlIH0sCisgICAgICAgIC5yZWFkX2luZGV4ID0gMSwKKyAgICAgICAgLmNhY2hlX3N5bmNwb2ludHMgPSAxLAorICAgIH07CisgICAgbnV0X2NvbnRleHRfdHQgKiBudXQgPSBwcml2LT5udXQgPSBudXRfZGVtdXhlcl9pbml0KCZkb3B0cyk7CisgICAgbnV0X3N0cmVhbV9oZWFkZXJfdHQgKiBzOworICAgIGludCByZXQsIGk7CisKKyAgICBpZighbnV0KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoKHJldCA9IG51dF9yZWFkX2hlYWRlcnMobnV0LCAmcywgTlVMTCkpKSB7CisgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIiBOVVQgZXJyb3I6ICVzXG4iLCBudXRfZXJyb3IocmV0KSk7CisgICAgICAgIG51dF9kZW11eGVyX3VuaW5pdChudXQpOworICAgICAgICBwcml2LT5udXQgPSBOVUxMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdi0+cyA9IHM7CisKKyAgICBmb3IgKGkgPSAwOyBzW2ldLnR5cGUgIT0gLTEgJiYgaSA8IDI7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShhdmYsIE5VTEwpOworICAgICAgICBpbnQgajsKKworICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc1tpXS5mb3VyY2NfbGVuICYmIGogPCA4OyBqKyspIHN0LT5jb2RlYy0+Y29kZWNfdGFnIHw9IHNbaV0uZm91cmNjW2pdPDwoaio4KTsKKworICAgICAgICBzdC0+Y29kZWMtPmhhc19iX2ZyYW1lcyA9IHNbaV0uZGVjb2RlX2RlbGF5OworCisgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBzW2ldLmNvZGVjX3NwZWNpZmljX2xlbjsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgICAgIGlmKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpKXsKKyAgICAgICAgICAgICAgICBudXRfZGVtdXhlcl91bmluaXQobnV0KTsKKyAgICAgICAgICAgICAgICBwcml2LT5udXQgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsIHNbaV0uY29kZWNfc3BlY2lmaWMsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhdmYtPnN0cmVhbXNbaV0sIDYwLCBzW2ldLnRpbWVfYmFzZS5udW0sIHNbaV0udGltZV9iYXNlLmRlbik7CisgICAgICAgIHN0LT5zdGFydF90aW1lID0gMDsKKyAgICAgICAgc3QtPmR1cmF0aW9uID0gc1tpXS5tYXhfcHRzOworCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQobnV0X3RhZ3MsIHN0LT5jb2RlYy0+Y29kZWNfdGFnKTsKKworICAgICAgICBzd2l0Y2goc1tpXS50eXBlKSB7CisgICAgICAgIGNhc2UgTlVUX0FVRElPX0NMQVNTOgorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY193YXZfdGFncywgc3QtPmNvZGVjLT5jb2RlY190YWcpOworCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gc1tpXS5jaGFubmVsX2NvdW50OworICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNbaV0uc2FtcGxlcmF0ZV9udW0gLyBzW2ldLnNhbXBsZXJhdGVfZGVub207CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVVRfVklERU9fQ0xBU1M6CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2JtcF90YWdzLCBzdC0+Y29kZWMtPmNvZGVjX3RhZyk7CisKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggPSBzW2ldLndpZHRoOworICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBzW2ldLmhlaWdodDsKKyAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA9IHNbaV0uc2FtcGxlX3dpZHRoOworICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gc1tpXS5zYW1wbGVfaGVpZ2h0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjb2RlYz8hXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudXRfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICogYXZmLCBBVlBhY2tldCAqIHBrdCkgeworICAgIE5VVENvbnRleHQgKiBwcml2ID0gYXZmLT5wcml2X2RhdGE7CisgICAgbnV0X3BhY2tldF90dCBwZDsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gbnV0X3JlYWRfbmV4dF9wYWNrZXQocHJpdi0+bnV0LCAmcGQpOworCisgICAgaWYgKHJldCB8fCBhdl9uZXdfcGFja2V0KHBrdCwgcGQubGVuKSA8IDApIHsKKyAgICAgICAgaWYgKHJldCAhPSBOVVRfRVJSX0VPRikKKyAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIiBOVVQgZXJyb3I6ICVzXG4iLCBudXRfZXJyb3IocmV0KSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocGQuZmxhZ3MgJiBOVVRfRkxBR19LRVkpIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgIHBrdC0+cHRzID0gcGQucHRzOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gcGQuc3RyZWFtOworICAgIHBrdC0+cG9zID0gYXZpb190ZWxsKGF2Zi0+cGIpOworCisgICAgcmV0ID0gbnV0X3JlYWRfZnJhbWUocHJpdi0+bnV0LCAmcGQubGVuLCBwa3QtPmRhdGEpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBudXRfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqIGF2ZiwgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0YXJnZXRfdHMsIGludCBmbGFncykgeworICAgIE5VVENvbnRleHQgKiBwcml2ID0gYXZmLT5wcml2X2RhdGE7CisgICAgaW50IGFjdGl2ZV9zdHJlYW1zW10gPSB7IHN0cmVhbV9pbmRleCwgLTEgfTsKKyAgICBkb3VibGUgdGltZV9wb3MgPSB0YXJnZXRfdHMgKiBwcml2LT5zW3N0cmVhbV9pbmRleF0udGltZV9iYXNlLm51bSAvIChkb3VibGUpcHJpdi0+c1tzdHJlYW1faW5kZXhdLnRpbWVfYmFzZS5kZW47CisKKyAgICBpZiAobnV0X3NlZWsocHJpdi0+bnV0LCB0aW1lX3BvcywgMiohKGZsYWdzICYgQVZTRUVLX0ZMQUdfQkFDS1dBUkQpLCBhY3RpdmVfc3RyZWFtcykpIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG51dF9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykgeworICAgIE5VVENvbnRleHQgKiBwcml2ID0gcy0+cHJpdl9kYXRhOworCisgICAgbnV0X2RlbXV4ZXJfdW5pbml0KHByaXYtPm51dCk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9saWJudXRfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlibnV0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTlVUIGZvcm1hdCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihOVVRDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBudXRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gbnV0X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IG51dF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBudXRfcmVhZF9jbG9zZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSBudXRfcmVhZF9zZWVrLAorICAgIC5leHRlbnNpb25zICAgICA9ICJudXQiLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9saWJxdXZpLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbGlicXV2aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNTkzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbGlicXV2aS5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIENsw6ltZW50IELFk3NjaAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8cXV2aS9xdXZpLmg+CisKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgY2hhciAqZm9ybWF0OworICAgIEFWRm9ybWF0Q29udGV4dCAqZm10Y3R4OworfSBMaWJRdXZpQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTGliUXV2aUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbGlicXV2aV9vcHRpb25zW10gPSB7CisgICAgeyAiZm9ybWF0IiwgInJlcXVlc3Qgc3BlY2lmaWMgZm9ybWF0IiwgT0ZGU0VUKGZvcm1hdCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9ImJlc3QifSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgbGlicXV2aV9jb250ZXh0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICA9ICJsaWJxdXZpIiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgPSBsaWJxdXZpX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGludCBsaWJxdXZpX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBMaWJRdXZpQ29udGV4dCAqcWMgPSBzLT5wcml2X2RhdGE7CisgICAgaWYgKHFjLT5mbXRjdHgpCisgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZxYy0+Zm10Y3R4KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsaWJxdXZpX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgcmV0OworICAgIHF1dmlfdCBxOworICAgIHF1dmlfbWVkaWFfdCBtOworICAgIFFVVkljb2RlIHJjOworICAgIExpYlF1dmlDb250ZXh0ICpxYyA9IHMtPnByaXZfZGF0YTsKKyAgICBjaGFyICptZWRpYV91cmwsICpwYWdldGl0bGU7CisKKyAgICByYyA9IHF1dmlfaW5pdCgmcSk7CisgICAgaWYgKHJjICE9IFFVVklfT0spCisgICAgICAgIGdvdG8gcXV2aV9mYWlsOworCisgICAgcXV2aV9zZXRvcHQocSwgUVVWSU9QVF9GT1JNQVQsIHFjLT5mb3JtYXQpOworCisgICAgcmMgPSBxdXZpX3BhcnNlKHEsIHMtPmZpbGVuYW1lLCAmbSk7CisgICAgaWYgKHJjICE9IFFVVklfT0spCisgICAgICAgIGdvdG8gcXV2aV9mYWlsOworCisgICAgcmMgPSBxdXZpX2dldHByb3AobSwgUVVWSVBST1BfTUVESUFVUkwsICZtZWRpYV91cmwpOworICAgIGlmIChyYyAhPSBRVVZJX09LKQorICAgICAgICBnb3RvIHF1dmlfZmFpbDsKKworICAgIGlmICgocmV0ID0gZmZfY29weV93aGl0ZWxpc3RzKHFjLT5mbXRjdHgsIHMpKSA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgcmV0ID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmcWMtPmZtdGN0eCwgbWVkaWFfdXJsLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICByYyA9IHF1dmlfZ2V0cHJvcChtLCBRVVZJUFJPUF9QQUdFVElUTEUsICZwYWdldGl0bGUpOworICAgIGlmIChyYyA9PSBRVVZJX09LKQorICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJ0aXRsZSIsIHBhZ2V0aXRsZSwgMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcWMtPmZtdGN0eC0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIEFWU3RyZWFtICppc3QgPSBxYy0+Zm10Y3R4LT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoIXN0KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCBpc3QtPnB0c193cmFwX2JpdHMsIGlzdC0+dGltZV9iYXNlLm51bSwgaXN0LT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgYXZjb2RlY19jb3B5X2NvbnRleHQoc3QtPmNvZGVjLCBxYy0+Zm10Y3R4LT5zdHJlYW1zW2ldLT5jb2RlYyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK3F1dmlfZmFpbDoKKyAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJXNcbiIsIHF1dmlfc3RyZXJyb3IocSwgcmMpKTsKKyAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworCitlbmQ6CisgICAgcXV2aV9wYXJzZV9jbG9zZSgmbSk7CisgICAgcXV2aV9jbG9zZSgmcSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsaWJxdXZpX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBMaWJRdXZpQ29udGV4dCAqcWMgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGF2X3JlYWRfZnJhbWUocWMtPmZtdGN0eCwgcGt0KTsKK30KKworc3RhdGljIGludCBsaWJxdXZpX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgTGliUXV2aUNvbnRleHQgKnFjID0gcy0+cHJpdl9kYXRhOworICAgIHJldHVybiBhdl9zZWVrX2ZyYW1lKHFjLT5mbXRjdHgsIHN0cmVhbV9pbmRleCwgdGltZXN0YW1wLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbGlicXV2aV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpbnQgc2NvcmU7CisgICAgcXV2aV90IHE7CisgICAgUVVWSWNvZGUgcmM7CisKKyAgICByYyA9IHF1dmlfaW5pdCgmcSk7CisgICAgaWYgKHJjICE9IFFVVklfT0spCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc2NvcmUgPSBxdXZpX3N1cHBvcnRlZChxLCAoY2hhciAqKXAtPmZpbGVuYW1lKSA9PSBRVVZJX09LID8gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gOiAwOworICAgIHF1dmlfY2xvc2UoJnEpOworICAgIHJldHVybiBzY29yZTsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9saWJxdXZpX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYnF1dmkiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJxdXZpIGRlbXV4ZXIiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTGliUXV2aUNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGxpYnF1dmlfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gbGlicXV2aV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBsaWJxdXZpX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGxpYnF1dmlfY2xvc2UsCisgICAgLnJlYWRfc2VlayAgICAgID0gbGlicXV2aV9yZWFkX3NlZWssCisgICAgLnByaXZfY2xhc3MgICAgID0gJmxpYnF1dmlfY29udGV4dF9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L2xpYnJ0bXAuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9saWJydG1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5MzliOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9saWJydG1wLmMKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiBSVE1QIG5ldHdvcmsgcHJvdG9jb2wKKyAqIENvcHlyaWdodCAoYykgMjAxMCBIb3dhcmQgQ2h1CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJUTVAgcHJvdG9jb2wgYmFzZWQgb24gaHR0cDovL3J0bXBkdW1wLm1wbGF5ZXJocS5odS8gbGlicnRtcAorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKworI2luY2x1ZGUgPGxpYnJ0bXAvcnRtcC5oPgorI2luY2x1ZGUgPGxpYnJ0bXAvbG9nLmg+CisKK3R5cGVkZWYgc3RydWN0IExpYlJUTVBDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBSVE1QIHJ0bXA7CisgICAgY2hhciAqYXBwOworICAgIGNoYXIgKmNvbm47CisgICAgY2hhciAqc3Vic2NyaWJlOworICAgIGNoYXIgKnBsYXlwYXRoOworICAgIGNoYXIgKnRjdXJsOworICAgIGNoYXIgKmZsYXNodmVyOworICAgIGNoYXIgKnN3ZnVybDsKKyAgICBjaGFyICpzd2Z2ZXJpZnk7CisgICAgY2hhciAqcGFnZXVybDsKKyAgICBjaGFyICpjbGllbnRfYnVmZmVyX3RpbWU7CisgICAgaW50IGxpdmU7CisgICAgY2hhciAqdGVtcF9maWxlbmFtZTsKK30gTGliUlRNUENvbnRleHQ7CisKK3N0YXRpYyB2b2lkIHJ0bXBfbG9nKGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisgICAgc3dpdGNoIChsZXZlbCkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBSVE1QX0xPR0NSSVQ6ICAgIGxldmVsID0gQVZfTE9HX0ZBVEFMOyAgIGJyZWFrOworICAgIGNhc2UgUlRNUF9MT0dFUlJPUjogICBsZXZlbCA9IEFWX0xPR19FUlJPUjsgICBicmVhazsKKyAgICBjYXNlIFJUTVBfTE9HV0FSTklORzogbGV2ZWwgPSBBVl9MT0dfV0FSTklORzsgYnJlYWs7CisgICAgY2FzZSBSVE1QX0xPR0lORk86ICAgIGxldmVsID0gQVZfTE9HX0lORk87ICAgIGJyZWFrOworICAgIGNhc2UgUlRNUF9MT0dERUJVRzogICBsZXZlbCA9IEFWX0xPR19WRVJCT1NFOyBicmVhazsKKyAgICBjYXNlIFJUTVBfTE9HREVCVUcyOiAgbGV2ZWwgPSBBVl9MT0dfREVCVUc7ICAgYnJlYWs7CisgICAgfQorCisgICAgYXZfdmxvZyhOVUxMLCBsZXZlbCwgZm10LCBhcmdzKTsKKyAgICBhdl9sb2coTlVMTCwgbGV2ZWwsICJcbiIpOworfQorCitzdGF0aWMgaW50IHJ0bXBfY2xvc2UoVVJMQ29udGV4dCAqcykKK3sKKyAgICBMaWJSVE1QQ29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIFJUTVAgKnIgPSAmY3R4LT5ydG1wOworCisgICAgUlRNUF9DbG9zZShyKTsKKyAgICBhdl9mcmVlcCgmY3R4LT50ZW1wX2ZpbGVuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBPcGVuIFJUTVAgY29ubmVjdGlvbiBhbmQgdmVyaWZ5IHRoYXQgdGhlIHN0cmVhbSBjYW4gYmUgcGxheWVkLgorICoKKyAqIFVSTCBzeW50YXg6IHJ0bXA6Ly9zZXJ2ZXJbOnBvcnRdWy9hcHBdWy9wbGF5cGF0aF1bIGtleXdvcmQ9dmFsdWVdLi4uCisgKiAgICAgICAgICAgICB3aGVyZSAnYXBwJyBpcyBmaXJzdCBvbmUgb3IgdHdvIGRpcmVjdG9yaWVzIGluIHRoZSBwYXRoCisgKiAgICAgICAgICAgICAoZS5nLiAvb25kZW1hbmQvLCAvZmxhc2gvbGl2ZS8sIGV0Yy4pCisgKiAgICAgICAgICAgICBhbmQgJ3BsYXlwYXRoJyBpcyBhIGZpbGUgbmFtZSAodGhlIHJlc3Qgb2YgdGhlIHBhdGgsCisgKiAgICAgICAgICAgICBtYXkgYmUgcHJlZml4ZWQgd2l0aCAibXA0OiIpCisgKgorICogICAgICAgICAgICAgQWRkaXRpb25hbCBSVE1QIGxpYnJhcnkgb3B0aW9ucyBtYXkgYmUgYXBwZW5kZWQgYXMKKyAqICAgICAgICAgICAgIHNwYWNlLXNlcGFyYXRlZCBrZXktdmFsdWUgcGFpcnMuCisgKi8KK3N0YXRpYyBpbnQgcnRtcF9vcGVuKFVSTENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzKQoreworICAgIExpYlJUTVBDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgUlRNUCAqciA9ICZjdHgtPnJ0bXA7CisgICAgaW50IHJjID0gMCwgbGV2ZWw7CisgICAgY2hhciAqZmlsZW5hbWUgPSBzLT5maWxlbmFtZTsKKyAgICBpbnQgbGVuID0gc3RybGVuKHMtPmZpbGVuYW1lKSArIDE7CisKKyAgICBzd2l0Y2ggKGF2X2xvZ19nZXRfbGV2ZWwoKSkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBBVl9MT0dfRkFUQUw6ICAgbGV2ZWwgPSBSVE1QX0xPR0NSSVQ7ICAgIGJyZWFrOworICAgIGNhc2UgQVZfTE9HX0VSUk9SOiAgIGxldmVsID0gUlRNUF9MT0dFUlJPUjsgICBicmVhazsKKyAgICBjYXNlIEFWX0xPR19XQVJOSU5HOiBsZXZlbCA9IFJUTVBfTE9HV0FSTklORzsgYnJlYWs7CisgICAgY2FzZSBBVl9MT0dfSU5GTzogICAgbGV2ZWwgPSBSVE1QX0xPR0lORk87ICAgIGJyZWFrOworICAgIGNhc2UgQVZfTE9HX1ZFUkJPU0U6IGxldmVsID0gUlRNUF9MT0dERUJVRzsgICBicmVhazsKKyAgICBjYXNlIEFWX0xPR19ERUJVRzogICBsZXZlbCA9IFJUTVBfTE9HREVCVUcyOyAgYnJlYWs7CisgICAgfQorICAgIFJUTVBfTG9nU2V0TGV2ZWwobGV2ZWwpOworICAgIFJUTVBfTG9nU2V0Q2FsbGJhY2socnRtcF9sb2cpOworCisgICAgaWYgKGN0eC0+YXBwKSAgICAgIGxlbiArPSBzdHJsZW4oY3R4LT5hcHApICAgICAgKyBzaXplb2YoIiBhcHA9Iik7CisgICAgaWYgKGN0eC0+dGN1cmwpICAgIGxlbiArPSBzdHJsZW4oY3R4LT50Y3VybCkgICAgKyBzaXplb2YoIiB0Y1VybD0iKTsKKyAgICBpZiAoY3R4LT5wYWdldXJsKSAgbGVuICs9IHN0cmxlbihjdHgtPnBhZ2V1cmwpICArIHNpemVvZigiIHBhZ2VVcmw9Iik7CisgICAgaWYgKGN0eC0+Zmxhc2h2ZXIpIGxlbiArPSBzdHJsZW4oY3R4LT5mbGFzaHZlcikgKyBzaXplb2YoIiBmbGFzaHZlcj0iKTsKKworICAgIGlmIChjdHgtPmNvbm4pIHsKKyAgICAgICAgY2hhciAqc2VwLCAqcCA9IGN0eC0+Y29ubjsKKyAgICAgICAgaW50IG9wdGlvbnMgPSAwOworCisgICAgICAgIHdoaWxlIChwKSB7CisgICAgICAgICAgICBvcHRpb25zKys7CisgICAgICAgICAgICBwICs9IHN0cnNwbihwLCAiICIpOworICAgICAgICAgICAgaWYgKCEqcCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHNlcCA9IHN0cmNocihwLCAnICcpOworICAgICAgICAgICAgaWYgKHNlcCkKKyAgICAgICAgICAgICAgICBwID0gc2VwICsgMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBsZW4gKz0gb3B0aW9ucyAqIHNpemVvZigiIGNvbm49Iik7CisgICAgICAgIGxlbiArPSBzdHJsZW4oY3R4LT5jb25uKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5wbGF5cGF0aCkKKyAgICAgICAgbGVuICs9IHN0cmxlbihjdHgtPnBsYXlwYXRoKSArIHNpemVvZigiIHBsYXlwYXRoPSIpOworICAgIGlmIChjdHgtPmxpdmUpCisgICAgICAgIGxlbiArPSBzaXplb2YoIiBsaXZlPTEiKTsKKyAgICBpZiAoY3R4LT5zdWJzY3JpYmUpCisgICAgICAgIGxlbiArPSBzdHJsZW4oY3R4LT5zdWJzY3JpYmUpICsgc2l6ZW9mKCIgc3Vic2NyaWJlPSIpOworCisgICAgaWYgKGN0eC0+Y2xpZW50X2J1ZmZlcl90aW1lKQorICAgICAgICBsZW4gKz0gc3RybGVuKGN0eC0+Y2xpZW50X2J1ZmZlcl90aW1lKSArIHNpemVvZigiIGJ1ZmZlcj0iKTsKKworICAgIGlmIChjdHgtPnN3ZnVybCB8fCBjdHgtPnN3ZnZlcmlmeSkgeworICAgICAgICBsZW4gKz0gc2l6ZW9mKCIgc3dmVXJsPSIpOworCisgICAgICAgIGlmIChjdHgtPnN3ZnZlcmlmeSkKKyAgICAgICAgICAgIGxlbiArPSBzdHJsZW4oY3R4LT5zd2Z2ZXJpZnkpICsgc2l6ZW9mKCIgc3dmVmZ5PTEiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVuICs9IHN0cmxlbihjdHgtPnN3ZnVybCk7CisgICAgfQorCisgICAgaWYgKCEoY3R4LT50ZW1wX2ZpbGVuYW1lID0gZmlsZW5hbWUgPSBhdl9tYWxsb2MobGVuKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9zdHJsY3B5KGZpbGVuYW1lLCBzLT5maWxlbmFtZSwgbGVuKTsKKyAgICBpZiAoY3R4LT5hcHApIHsKKyAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgIiBhcHA9IiwgbGVuKTsKKyAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgY3R4LT5hcHAsIGxlbik7CisgICAgfQorICAgIGlmIChjdHgtPnRjdXJsKSB7CisgICAgICAgIGF2X3N0cmxjYXQoZmlsZW5hbWUsICIgdGNVcmw9IiwgbGVuKTsKKyAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgY3R4LT50Y3VybCwgbGVuKTsKKyAgICB9CisgICAgaWYgKGN0eC0+cGFnZXVybCkgeworICAgICAgICBhdl9zdHJsY2F0KGZpbGVuYW1lLCAiIHBhZ2VVcmw9IiwgbGVuKTsKKyAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgY3R4LT5wYWdldXJsLCBsZW4pOworICAgIH0KKyAgICBpZiAoY3R4LT5zd2Z1cmwpIHsKKyAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgIiBzd2ZVcmw9IiwgbGVuKTsKKyAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgY3R4LT5zd2Z1cmwsIGxlbik7CisgICAgfQorICAgIGlmIChjdHgtPmZsYXNodmVyKSB7CisgICAgICAgIGF2X3N0cmxjYXQoZmlsZW5hbWUsICIgZmxhc2hWZXI9IiwgbGVuKTsKKyAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgY3R4LT5mbGFzaHZlciwgbGVuKTsKKyAgICB9CisgICAgaWYgKGN0eC0+Y29ubikgeworICAgICAgICBjaGFyICpzZXAsICpwID0gY3R4LT5jb25uOworICAgICAgICB3aGlsZSAocCkgeworICAgICAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgIiBjb25uPSIsIGxlbik7CisgICAgICAgICAgICBwICs9IHN0cnNwbihwLCAiICIpOworICAgICAgICAgICAgaWYgKCEqcCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHNlcCA9IHN0cmNocihwLCAnICcpOworICAgICAgICAgICAgaWYgKHNlcCkKKyAgICAgICAgICAgICAgICAqc2VwID0gJ1wwJzsKKyAgICAgICAgICAgIGF2X3N0cmxjYXQoZmlsZW5hbWUsIHAsIGxlbik7CisKKyAgICAgICAgICAgIGlmIChzZXApCisgICAgICAgICAgICAgICAgcCA9IHNlcCArIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGN0eC0+cGxheXBhdGgpIHsKKyAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgIiBwbGF5cGF0aD0iLCBsZW4pOworICAgICAgICBhdl9zdHJsY2F0KGZpbGVuYW1lLCBjdHgtPnBsYXlwYXRoLCBsZW4pOworICAgIH0KKyAgICBpZiAoY3R4LT5saXZlKQorICAgICAgICBhdl9zdHJsY2F0KGZpbGVuYW1lLCAiIGxpdmU9MSIsIGxlbik7CisgICAgaWYgKGN0eC0+c3Vic2NyaWJlKSB7CisgICAgICAgIGF2X3N0cmxjYXQoZmlsZW5hbWUsICIgc3Vic2NyaWJlPSIsIGxlbik7CisgICAgICAgIGF2X3N0cmxjYXQoZmlsZW5hbWUsIGN0eC0+c3Vic2NyaWJlLCBsZW4pOworICAgIH0KKyAgICBpZiAoY3R4LT5jbGllbnRfYnVmZmVyX3RpbWUpIHsKKyAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgIiBidWZmZXI9IiwgbGVuKTsKKyAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgY3R4LT5jbGllbnRfYnVmZmVyX3RpbWUsIGxlbik7CisgICAgfQorICAgIGlmIChjdHgtPnN3ZnVybCB8fCBjdHgtPnN3ZnZlcmlmeSkgeworICAgICAgICBhdl9zdHJsY2F0KGZpbGVuYW1lLCAiIHN3ZlVybD0iLCBsZW4pOworCisgICAgICAgIGlmIChjdHgtPnN3ZnZlcmlmeSkgeworICAgICAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgY3R4LT5zd2Z2ZXJpZnksIGxlbik7CisgICAgICAgICAgICBhdl9zdHJsY2F0KGZpbGVuYW1lLCAiIHN3ZlZmeT0xIiwgbGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X3N0cmxjYXQoZmlsZW5hbWUsIGN0eC0+c3dmdXJsLCBsZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgUlRNUF9Jbml0KHIpOworICAgIGlmICghUlRNUF9TZXR1cFVSTChyLCBmaWxlbmFtZSkpIHsKKyAgICAgICAgcmMgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUpCisgICAgICAgIFJUTVBfRW5hYmxlV3JpdGUocik7CisKKyAgICBpZiAoIVJUTVBfQ29ubmVjdChyLCBOVUxMKSB8fCAhUlRNUF9Db25uZWN0U3RyZWFtKHIsIDApKSB7CisgICAgICAgIHJjID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcy0+aXNfc3RyZWFtZWQgPSAxOworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBhdl9mcmVlcCgmY3R4LT50ZW1wX2ZpbGVuYW1lKTsKKyAgICBpZiAocmMpCisgICAgICAgIFJUTVBfQ2xvc2Uocik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcnRtcF93cml0ZShVUkxDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIExpYlJUTVBDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgUlRNUCAqciA9ICZjdHgtPnJ0bXA7CisKKyAgICByZXR1cm4gUlRNUF9Xcml0ZShyLCBidWYsIHNpemUpOworfQorCitzdGF0aWMgaW50IHJ0bXBfcmVhZChVUkxDb250ZXh0ICpzLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIExpYlJUTVBDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgUlRNUCAqciA9ICZjdHgtPnJ0bXA7CisKKyAgICByZXR1cm4gUlRNUF9SZWFkKHIsIGJ1Ziwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgcnRtcF9yZWFkX3BhdXNlKFVSTENvbnRleHQgKnMsIGludCBwYXVzZSkKK3sKKyAgICBMaWJSVE1QQ29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIFJUTVAgKnIgPSAmY3R4LT5ydG1wOworCisgICAgaWYgKCFSVE1QX1BhdXNlKHIsIHBhdXNlKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludDY0X3QgcnRtcF9yZWFkX3NlZWsoVVJMQ29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgTGliUlRNUENvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBSVE1QICpyID0gJmN0eC0+cnRtcDsKKworICAgIGlmIChmbGFncyAmIEFWU0VFS19GTEFHX0JZVEUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisKKyAgICAvKiBzZWVrcyBhcmUgaW4gbWlsbGlzZWNvbmRzICovCisgICAgaWYgKHN0cmVhbV9pbmRleCA8IDApCisgICAgICAgIHRpbWVzdGFtcCA9IGF2X3Jlc2NhbGVfcm5kKHRpbWVzdGFtcCwgMTAwMCwgQVZfVElNRV9CQVNFLAorICAgICAgICAgICAgZmxhZ3MgJiBBVlNFRUtfRkxBR19CQUNLV0FSRCA/IEFWX1JPVU5EX0RPV04gOiBBVl9ST1VORF9VUCk7CisKKyAgICBpZiAoIVJUTVBfU2VuZFNlZWsociwgdGltZXN0YW1wKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICByZXR1cm4gdGltZXN0YW1wOworfQorCitzdGF0aWMgaW50IHJ0bXBfZ2V0X2ZpbGVfaGFuZGxlKFVSTENvbnRleHQgKnMpCit7CisgICAgTGliUlRNUENvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBSVE1QICpyID0gJmN0eC0+cnRtcDsKKworICAgIHJldHVybiBSVE1QX1NvY2tldChyKTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTGliUlRNUENvbnRleHQsIHgpCisjZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorI2RlZmluZSBFTkMgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyJydG1wX2FwcCIsICJOYW1lIG9mIGFwcGxpY2F0aW9uIHRvIGNvbm5lY3QgdG8gb24gdGhlIFJUTVAgc2VydmVyIiwgT0ZGU0VUKGFwcCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIERFQ3xFTkN9LAorICAgIHsicnRtcF9idWZmZXIiLCAiU2V0IGJ1ZmZlciB0aW1lIGluIG1pbGxpc2Vjb25kcy4gVGhlIGRlZmF1bHQgaXMgMzAwMC4iLCBPRkZTRVQoY2xpZW50X2J1ZmZlcl90aW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICIzMDAwIn0sIDAsIDAsIERFQ3xFTkN9LAorICAgIHsicnRtcF9jb25uIiwgIkFwcGVuZCBhcmJpdHJhcnkgQU1GIGRhdGEgdG8gdGhlIENvbm5lY3QgbWVzc2FnZSIsIE9GRlNFVChjb25uKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEwgfSwgMCwgMCwgREVDfEVOQ30sCisgICAgeyJydG1wX2ZsYXNodmVyIiwgIlZlcnNpb24gb2YgdGhlIEZsYXNoIHBsdWdpbiB1c2VkIHRvIHJ1biB0aGUgU1dGIHBsYXllci4iLCBPRkZTRVQoZmxhc2h2ZXIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTCB9LCAwLCAwLCBERUN8RU5DfSwKKyAgICB7InJ0bXBfbGl2ZSIsICJTcGVjaWZ5IHRoYXQgdGhlIG1lZGlhIGlzIGEgbGl2ZSBzdHJlYW0uIiwgT0ZGU0VUKGxpdmUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIElOVF9NSU4sIElOVF9NQVgsIERFQywgInJ0bXBfbGl2ZSJ9LAorICAgIHsiYW55IiwgImJvdGgiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAtMn0sIDAsIDAsIERFQywgInJ0bXBfbGl2ZSJ9LAorICAgIHsibGl2ZSIsICJsaXZlIHN0cmVhbSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IC0xfSwgMCwgMCwgREVDLCAicnRtcF9saXZlIn0sCisgICAgeyJyZWNvcmRlZCIsICJyZWNvcmRlZCBzdHJlYW0iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAwfSwgMCwgMCwgREVDLCAicnRtcF9saXZlIn0sCisgICAgeyJydG1wX3BhZ2V1cmwiLCAiVVJMIG9mIHRoZSB3ZWIgcGFnZSBpbiB3aGljaCB0aGUgbWVkaWEgd2FzIGVtYmVkZGVkLiBCeSBkZWZhdWx0IG5vIHZhbHVlIHdpbGwgYmUgc2VudC4iLCBPRkZTRVQocGFnZXVybCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIERFQ30sCisgICAgeyJydG1wX3BsYXlwYXRoIiwgIlN0cmVhbSBpZGVudGlmaWVyIHRvIHBsYXkgb3IgdG8gcHVibGlzaCIsIE9GRlNFVChwbGF5cGF0aCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIERFQ3xFTkN9LAorICAgIHsicnRtcF9zdWJzY3JpYmUiLCAiTmFtZSBvZiBsaXZlIHN0cmVhbSB0byBzdWJzY3JpYmUgdG8uIERlZmF1bHRzIHRvIHJ0bXBfcGxheXBhdGguIiwgT0ZGU0VUKHN1YnNjcmliZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIERFQ30sCisgICAgeyJydG1wX3N3ZnVybCIsICJVUkwgb2YgdGhlIFNXRiBwbGF5ZXIuIEJ5IGRlZmF1bHQgbm8gdmFsdWUgd2lsbCBiZSBzZW50IiwgT0ZGU0VUKHN3ZnVybCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIERFQ3xFTkN9LAorICAgIHsicnRtcF9zd2Z2ZXJpZnkiLCAiVVJMIHRvIHBsYXllciBzd2YgZmlsZSwgY29tcHV0ZSBoYXNoL3NpemUgYXV0b21hdGljYWxseS4gKHVuaW1wbGVtZW50ZWQpIiwgT0ZGU0VUKHN3ZnZlcmlmeSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIERFQ30sCisgICAgeyJydG1wX3RjdXJsIiwgIlVSTCBvZiB0aGUgdGFyZ2V0IHN0cmVhbS4gRGVmYXVsdHMgdG8gcHJvdG86Ly9ob3N0Wzpwb3J0XS9hcHAuIiwgT0ZGU0VUKHRjdXJsKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEwgfSwgMCwgMCwgREVDfEVOQ30sCisgICAgeyBOVUxMIH0sCit9OworCisjZGVmaW5lIFJUTVBfQ0xBU1MoZmxhdm9yKVwKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGxpYiAjIyBmbGF2b3IgIyMgX2NsYXNzID0ge1wKKyAgICAuY2xhc3NfbmFtZSA9ICJsaWIiICNmbGF2b3IgIiBwcm90b2NvbCIsXAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsXAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucyxcCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsXAorfTsKKworUlRNUF9DTEFTUyhydG1wKQorVVJMUHJvdG9jb2wgZmZfbGlicnRtcF9wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJydG1wIiwKKyAgICAudXJsX29wZW4gICAgICAgICAgICA9IHJ0bXBfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgICAgICA9IHJ0bXBfcmVhZCwKKyAgICAudXJsX3dyaXRlICAgICAgICAgICA9IHJ0bXBfd3JpdGUsCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgPSBydG1wX2Nsb3NlLAorICAgIC51cmxfcmVhZF9wYXVzZSAgICAgID0gcnRtcF9yZWFkX3BhdXNlLAorICAgIC51cmxfcmVhZF9zZWVrICAgICAgID0gcnRtcF9yZWFkX3NlZWssCisgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgPSBydG1wX2dldF9maWxlX2hhbmRsZSwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICA9IHNpemVvZihMaWJSVE1QQ29udGV4dCksCisgICAgLnByaXZfZGF0YV9jbGFzcyAgICAgPSAmbGlicnRtcF9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICAgICAgICA9IFVSTF9QUk9UT0NPTF9GTEFHX05FVFdPUkssCit9OworCitSVE1QX0NMQVNTKHJ0bXB0KQorVVJMUHJvdG9jb2wgZmZfbGlicnRtcHRfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAicnRtcHQiLAorICAgIC51cmxfb3BlbiAgICAgICAgICAgID0gcnRtcF9vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gcnRtcF9yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICAgICAgID0gcnRtcF93cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgICAgICA9IHJ0bXBfY2xvc2UsCisgICAgLnVybF9yZWFkX3BhdXNlICAgICAgPSBydG1wX3JlYWRfcGF1c2UsCisgICAgLnVybF9yZWFkX3NlZWsgICAgICAgPSBydG1wX3JlYWRfc2VlaywKKyAgICAudXJsX2dldF9maWxlX2hhbmRsZSA9IHJ0bXBfZ2V0X2ZpbGVfaGFuZGxlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKExpYlJUTVBDb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX2NsYXNzICAgICA9ICZsaWJydG1wdF9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICAgICAgICA9IFVSTF9QUk9UT0NPTF9GTEFHX05FVFdPUkssCit9OworCitSVE1QX0NMQVNTKHJ0bXBlKQorVVJMUHJvdG9jb2wgZmZfbGlicnRtcGVfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAicnRtcGUiLAorICAgIC51cmxfb3BlbiAgICAgICAgICAgID0gcnRtcF9vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gcnRtcF9yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICAgICAgID0gcnRtcF93cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgICAgICA9IHJ0bXBfY2xvc2UsCisgICAgLnVybF9yZWFkX3BhdXNlICAgICAgPSBydG1wX3JlYWRfcGF1c2UsCisgICAgLnVybF9yZWFkX3NlZWsgICAgICAgPSBydG1wX3JlYWRfc2VlaywKKyAgICAudXJsX2dldF9maWxlX2hhbmRsZSA9IHJ0bXBfZ2V0X2ZpbGVfaGFuZGxlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKExpYlJUTVBDb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX2NsYXNzICAgICA9ICZsaWJydG1wZV9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICAgICAgICA9IFVSTF9QUk9UT0NPTF9GTEFHX05FVFdPUkssCit9OworCitSVE1QX0NMQVNTKHJ0bXB0ZSkKK1VSTFByb3RvY29sIGZmX2xpYnJ0bXB0ZV9wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJydG1wdGUiLAorICAgIC51cmxfb3BlbiAgICAgICAgICAgID0gcnRtcF9vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gcnRtcF9yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICAgICAgID0gcnRtcF93cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgICAgICA9IHJ0bXBfY2xvc2UsCisgICAgLnVybF9yZWFkX3BhdXNlICAgICAgPSBydG1wX3JlYWRfcGF1c2UsCisgICAgLnVybF9yZWFkX3NlZWsgICAgICAgPSBydG1wX3JlYWRfc2VlaywKKyAgICAudXJsX2dldF9maWxlX2hhbmRsZSA9IHJ0bXBfZ2V0X2ZpbGVfaGFuZGxlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKExpYlJUTVBDb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX2NsYXNzICAgICA9ICZsaWJydG1wdGVfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAorfTsKKworUlRNUF9DTEFTUyhydG1wcykKK1VSTFByb3RvY29sIGZmX2xpYnJ0bXBzX3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgID0gInJ0bXBzIiwKKyAgICAudXJsX29wZW4gICAgICAgICAgICA9IHJ0bXBfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgICAgICA9IHJ0bXBfcmVhZCwKKyAgICAudXJsX3dyaXRlICAgICAgICAgICA9IHJ0bXBfd3JpdGUsCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgPSBydG1wX2Nsb3NlLAorICAgIC51cmxfcmVhZF9wYXVzZSAgICAgID0gcnRtcF9yZWFkX3BhdXNlLAorICAgIC51cmxfcmVhZF9zZWVrICAgICAgID0gcnRtcF9yZWFkX3NlZWssCisgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgPSBydG1wX2dldF9maWxlX2hhbmRsZSwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICA9IHNpemVvZihMaWJSVE1QQ29udGV4dCksCisgICAgLnByaXZfZGF0YV9jbGFzcyAgICAgPSAmbGlicnRtcHNfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9saWJzbWJjbGllbnQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9saWJzbWJjbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjkwZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2xpYnNtYmNsaWVudC5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEx1a2FzeiBNYXJlayA8bHVrYXN6Lm0ubHVraUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaWJzbWJjbGllbnQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInVybC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgU01CQ0NUWCAqY3R4OworICAgIGludCBmZDsKKyAgICBpbnQ2NF90IGZpbGVzaXplOworICAgIGludCB0cnVuYzsKKyAgICBpbnQgdGltZW91dDsKKyAgICBjaGFyICp3b3JrZ3JvdXA7Cit9IExJQlNNQkNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIGxpYnNtYmNfZ2V0X2F1dGhfZGF0YShTTUJDQ1RYICpjLCBjb25zdCBjaGFyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKnNoYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKndvcmtncm91cCwgaW50IHdvcmtncm91cF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdXNlcm5hbWUsIGludCB1c2VybmFtZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFzc3dvcmQsIGludCBwYXNzd29yZF9sZW4pCit7CisgICAgLyogRG8gbm90aGluZyB5ZXQuIENyZWRlbnRpYWxzIGFyZSBwYXNzZWQgdmlhIHVybC4KKyAgICAgKiBDYWxsYmFjayBtdXN0IGV4aXN0cywgdGhlcmUgbWlnaHQgYmUgYSBzZWdtZW50YXRpb24gZmF1bHQgb3RoZXJ3aXNlLiAqLworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbGlic21iY19jb25uZWN0KFVSTENvbnRleHQgKmgpCit7CisgICAgTElCU01CQ29udGV4dCAqbGlic21iYyA9IGgtPnByaXZfZGF0YTsKKworICAgIGxpYnNtYmMtPmN0eCA9IHNtYmNfbmV3X2NvbnRleHQoKTsKKyAgICBpZiAoIWxpYnNtYmMtPmN0eCkgeworICAgICAgICBpbnQgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgY3JlYXRlIGNvbnRleHQ6ICVzLlxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKCFzbWJjX2luaXRfY29udGV4dChsaWJzbWJjLT5jdHgpKSB7CisgICAgICAgIGludCByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBpbml0aWFsaXplIGNvbnRleHQ6ICVzLlxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgc21iY19zZXRfY29udGV4dChsaWJzbWJjLT5jdHgpOworCisgICAgc21iY19zZXRPcHRpb25Vc2VyRGF0YShsaWJzbWJjLT5jdHgsIGgpOworICAgIHNtYmNfc2V0RnVuY3Rpb25BdXRoRGF0YVdpdGhDb250ZXh0KGxpYnNtYmMtPmN0eCwgbGlic21iY19nZXRfYXV0aF9kYXRhKTsKKworICAgIGlmIChsaWJzbWJjLT50aW1lb3V0ICE9IC0xKQorICAgICAgICBzbWJjX3NldFRpbWVvdXQobGlic21iYy0+Y3R4LCBsaWJzbWJjLT50aW1lb3V0KTsKKyAgICBpZiAobGlic21iYy0+d29ya2dyb3VwKQorICAgICAgICBzbWJjX3NldFdvcmtncm91cChsaWJzbWJjLT5jdHgsIGxpYnNtYmMtPndvcmtncm91cCk7CisKKyAgICBpZiAoc21iY19pbml0KE5VTEwsIDApIDwgMCkgeworICAgICAgICBpbnQgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJJbml0aWFsaXphdGlvbiBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYnNtYmNfY2xvc2UoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBMSUJTTUJDb250ZXh0ICpsaWJzbWJjID0gaC0+cHJpdl9kYXRhOworICAgIGlmIChsaWJzbWJjLT5mZCA+PSAwKSB7CisgICAgICAgIHNtYmNfY2xvc2UobGlic21iYy0+ZmQpOworICAgICAgICBsaWJzbWJjLT5mZCA9IC0xOworICAgIH0KKyAgICBpZiAobGlic21iYy0+Y3R4KSB7CisgICAgICAgIHNtYmNfZnJlZV9jb250ZXh0KGxpYnNtYmMtPmN0eCwgMSk7CisgICAgICAgIGxpYnNtYmMtPmN0eCA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbGlic21iY19vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVybCwgaW50IGZsYWdzKQoreworICAgIExJQlNNQkNvbnRleHQgKmxpYnNtYmMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IGFjY2VzcywgcmV0OworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgbGlic21iYy0+ZmQgPSAtMTsKKyAgICBsaWJzbWJjLT5maWxlc2l6ZSA9IC0xOworCisgICAgaWYgKChyZXQgPSBsaWJzbWJjX2Nvbm5lY3QoaCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKChmbGFncyAmIEFWSU9fRkxBR19XUklURSkgJiYgKGZsYWdzICYgQVZJT19GTEFHX1JFQUQpKSB7CisgICAgICAgIGFjY2VzcyA9IE9fQ1JFQVQgfCBPX1JEV1I7CisgICAgICAgIGlmIChsaWJzbWJjLT50cnVuYykKKyAgICAgICAgICAgIGFjY2VzcyB8PSBPX1RSVU5DOworICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUpIHsKKyAgICAgICAgYWNjZXNzID0gT19DUkVBVCB8IE9fV1JPTkxZOworICAgICAgICBpZiAobGlic21iYy0+dHJ1bmMpCisgICAgICAgICAgICBhY2Nlc3MgfD0gT19UUlVOQzsKKyAgICB9IGVsc2UKKyAgICAgICAgYWNjZXNzID0gT19SRE9OTFk7CisKKyAgICAvKiAwNjY2ID0gLXJ3LXJ3LXJ3LSA9IHJlYWQrd3JpdGUgZm9yIGV2ZXJ5b25lLCBtaW51cyB1bWFzayAqLworICAgIGlmICgobGlic21iYy0+ZmQgPSBzbWJjX29wZW4odXJsLCBhY2Nlc3MsIDA2NjYpKSA8IDApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJGaWxlIG9wZW4gZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChzbWJjX2ZzdGF0KGxpYnNtYmMtPmZkLCAmc3QpIDwgMCkKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLCAiQ2Fubm90IHN0YXQgZmlsZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgZWxzZQorICAgICAgICBsaWJzbWJjLT5maWxlc2l6ZSA9IHN0LnN0X3NpemU7CisKKyAgICByZXR1cm4gMDsKKyAgZmFpbDoKKyAgICBsaWJzbWJjX2Nsb3NlKGgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGxpYnNtYmNfc2VlayhVUkxDb250ZXh0ICpoLCBpbnQ2NF90IHBvcywgaW50IHdoZW5jZSkKK3sKKyAgICBMSUJTTUJDb250ZXh0ICpsaWJzbWJjID0gaC0+cHJpdl9kYXRhOworICAgIGludDY0X3QgbmV3cG9zOworCisgICAgaWYgKHdoZW5jZSA9PSBBVlNFRUtfU0laRSkgeworICAgICAgICBpZiAobGlic21iYy0+ZmlsZXNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJFcnJvciBkdXJpbmcgc2Vla2luZzogZmlsZXNpemUgaXMgdW5rbm93bi5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gbGlic21iYy0+ZmlsZXNpemU7CisgICAgfQorCisgICAgaWYgKChuZXdwb3MgPSBzbWJjX2xzZWVrKGxpYnNtYmMtPmZkLCBwb3MsIHdoZW5jZSkpIDwgMCkgeworICAgICAgICBpbnQgZXJyID0gZXJybm87CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJFcnJvciBkdXJpbmcgc2Vla2luZzogJXNcbiIsIHN0cmVycm9yKGVycikpOworICAgICAgICByZXR1cm4gQVZFUlJPUihlcnIpOworICAgIH0KKworICAgIHJldHVybiBuZXdwb3M7Cit9CisKK3N0YXRpYyBpbnQgbGlic21iY19yZWFkKFVSTENvbnRleHQgKmgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgTElCU01CQ29udGV4dCAqbGlic21iYyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgYnl0ZXNfcmVhZDsKKworICAgIGlmICgoYnl0ZXNfcmVhZCA9IHNtYmNfcmVhZChsaWJzbWJjLT5mZCwgYnVmLCBzaXplKSkgPCAwKSB7CisgICAgICAgIGludCByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlJlYWQgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgaW50IGxpYnNtYmNfd3JpdGUoVVJMQ29udGV4dCAqaCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBMSUJTTUJDb250ZXh0ICpsaWJzbWJjID0gaC0+cHJpdl9kYXRhOworICAgIGludCBieXRlc193cml0dGVuOworCisgICAgaWYgKChieXRlc193cml0dGVuID0gc21iY193cml0ZShsaWJzbWJjLT5mZCwgYnVmLCBzaXplKSkgPCAwKSB7CisgICAgICAgIGludCByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIldyaXRlIGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTElCU01CQ29udGV4dCwgeCkKKyNkZWZpbmUgRCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorI2RlZmluZSBFIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsidGltZW91dCIsICAgInNldCB0aW1lb3V0IGluIG1zIG9mIHNvY2tldCBJL08gb3BlcmF0aW9ucyIsICAgIE9GRlNFVCh0aW1lb3V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIElOVF9NQVgsIER8RSB9LAorICAgIHsidHJ1bmNhdGUiLCAgInRydW5jYXRlIGV4aXN0aW5nIGZpbGVzIG9uIHdyaXRlIiwgICAgICAgICAgICAgIE9GRlNFVCh0cnVuYyksICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDAsIDEsIEUgfSwKKyAgICB7Indvcmtncm91cCIsICJzZXQgdGhlIHdvcmtncm91cCB1c2VkIGZvciBtYWtpbmcgY29ubmVjdGlvbnMiLCBPRkZTRVQod29ya2dyb3VwKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgRHxFIH0sCisgICAge05VTEx9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBsaWJzbWJjbGllbnRfY29udGV4dF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAibGlic21iYyIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitVUkxQcm90b2NvbCBmZl9saWJzbWJjbGllbnRfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAic21iIiwKKyAgICAudXJsX29wZW4gICAgICAgICAgICA9IGxpYnNtYmNfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgICAgICA9IGxpYnNtYmNfcmVhZCwKKyAgICAudXJsX3dyaXRlICAgICAgICAgICA9IGxpYnNtYmNfd3JpdGUsCisgICAgLnVybF9zZWVrICAgICAgICAgICAgPSBsaWJzbWJjX3NlZWssCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgPSBsaWJzbWJjX2Nsb3NlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKExJQlNNQkNvbnRleHQpLAorICAgIC5wcml2X2RhdGFfY2xhc3MgICAgID0gJmxpYnNtYmNsaWVudF9jb250ZXh0X2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbGlic3NoLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbGlic3NoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjNjBjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9saWJzc2guYwpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBMdWthc3ogTWFyZWsgPGx1a2Fzei5tLmx1a2lAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNkZWZpbmUgTElCU1NIX1NUQVRJQworI2luY2x1ZGUgPGxpYnNzaC9zZnRwLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInVybC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgc3NoX3Nlc3Npb24gc2Vzc2lvbjsKKyAgICBzZnRwX3Nlc3Npb24gc2Z0cDsKKyAgICBzZnRwX2ZpbGUgZmlsZTsKKyAgICBpbnQ2NF90IGZpbGVzaXplOworICAgIGludCByd190aW1lb3V0OworICAgIGludCB0cnVuYzsKKyAgICBjaGFyICpwcml2X2tleTsKK30gTElCU1NIQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGxpYnNzaF9jcmVhdGVfc3NoX3Nlc3Npb24oTElCU1NIQ29udGV4dCAqbGlic3NoLCBjb25zdCBjaGFyKiBob3N0bmFtZSwgdW5zaWduZWQgaW50IHBvcnQpCit7CisgICAgc3RhdGljIGNvbnN0IGludCB2ZXJib3NpdHkgPSBTU0hfTE9HX05PTE9HOworCisgICAgaWYgKCEobGlic3NoLT5zZXNzaW9uID0gc3NoX25ldygpKSkgeworICAgICAgICBhdl9sb2cobGlic3NoLCBBVl9MT0dfRVJST1IsICJTU0ggc2Vzc2lvbiBjcmVhdGlvbiBmYWlsZWQ6ICVzXG4iLCBzc2hfZ2V0X2Vycm9yKGxpYnNzaC0+c2Vzc2lvbikpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBzc2hfb3B0aW9uc19zZXQobGlic3NoLT5zZXNzaW9uLCBTU0hfT1BUSU9OU19IT1NULCBob3N0bmFtZSk7CisgICAgc3NoX29wdGlvbnNfc2V0KGxpYnNzaC0+c2Vzc2lvbiwgU1NIX09QVElPTlNfUE9SVCwgJnBvcnQpOworICAgIHNzaF9vcHRpb25zX3NldChsaWJzc2gtPnNlc3Npb24sIFNTSF9PUFRJT05TX0xPR19WRVJCT1NJVFksICZ2ZXJib3NpdHkpOworICAgIGlmIChsaWJzc2gtPnJ3X3RpbWVvdXQgPiAwKSB7CisgICAgICAgIGxvbmcgdGltZW91dCA9IGxpYnNzaC0+cndfdGltZW91dCAqIDEwMDA7CisgICAgICAgIHNzaF9vcHRpb25zX3NldChsaWJzc2gtPnNlc3Npb24sIFNTSF9PUFRJT05TX1RJTUVPVVRfVVNFQywgJnRpbWVvdXQpOworICAgIH0KKworICAgIGlmIChzc2hfY29ubmVjdChsaWJzc2gtPnNlc3Npb24pICE9IFNTSF9PSykgeworICAgICAgICBhdl9sb2cobGlic3NoLCBBVl9MT0dfRVJST1IsICJDb25uZWN0aW9uIGZhaWxlZDogJXNcbiIsIHNzaF9nZXRfZXJyb3IobGlic3NoLT5zZXNzaW9uKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJzc2hfYXV0aGVudGljYXRpb24oTElCU1NIQ29udGV4dCAqbGlic3NoLCBjb25zdCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICpwYXNzd29yZCkKK3sKKyAgICBpbnQgYXV0aG9yaXplZCA9IDA7CisgICAgaW50IGF1dGhfbWV0aG9kczsKKworICAgIGlmICh1c2VyKQorICAgICAgICBzc2hfb3B0aW9uc19zZXQobGlic3NoLT5zZXNzaW9uLCBTU0hfT1BUSU9OU19VU0VSLCB1c2VyKTsKKworICAgIGlmIChzc2hfdXNlcmF1dGhfbm9uZShsaWJzc2gtPnNlc3Npb24sIE5VTEwpID09IFNTSF9BVVRIX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAwOworCisgICAgYXV0aF9tZXRob2RzID0gc3NoX3VzZXJhdXRoX2xpc3QobGlic3NoLT5zZXNzaW9uLCBOVUxMKTsKKworICAgIGlmIChhdXRoX21ldGhvZHMgJiBTU0hfQVVUSF9NRVRIT0RfUFVCTElDS0VZKSB7CisgICAgICAgIGlmIChsaWJzc2gtPnByaXZfa2V5KSB7CisgICAgICAgICAgICBzc2hfc3RyaW5nIHB1Yl9rZXk7CisgICAgICAgICAgICBzc2hfcHJpdmF0ZV9rZXkgcHJpdl9rZXk7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGlmICghc3NoX3RyeV9wdWJsaWNrZXlfZnJvbV9maWxlKGxpYnNzaC0+c2Vzc2lvbiwgbGlic3NoLT5wcml2X2tleSwgJnB1Yl9rZXksICZ0eXBlKSkgeworICAgICAgICAgICAgICAgIHByaXZfa2V5ID0gcHJpdmF0ZWtleV9mcm9tX2ZpbGUobGlic3NoLT5zZXNzaW9uLCBsaWJzc2gtPnByaXZfa2V5LCB0eXBlLCBwYXNzd29yZCk7CisgICAgICAgICAgICAgICAgaWYgKHNzaF91c2VyYXV0aF9wdWJrZXkobGlic3NoLT5zZXNzaW9uLCBOVUxMLCBwdWJfa2V5LCBwcml2X2tleSkgPT0gU1NIX0FVVEhfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cobGlic3NoLCBBVl9MT0dfREVCVUcsICJBdXRoZW50aWNhdGlvbiBzdWNjZXNzZnVsIHdpdGggc2VsZWN0ZWQgcHJpdmF0ZSBrZXkuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobGlic3NoLCBBVl9MT0dfREVCVUcsICJJbnZhbGlkIGtleSBpcyBwcm92aWRlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBQ0NFUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3NoX3VzZXJhdXRoX2F1dG9wdWJrZXkobGlic3NoLT5zZXNzaW9uLCBwYXNzd29yZCkgPT0gU1NIX0FVVEhfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGxpYnNzaCwgQVZfTE9HX0RFQlVHLCAiQXV0aGVudGljYXRpb24gc3VjY2Vzc2Z1bCB3aXRoIGF1dG8gc2VsZWN0ZWQga2V5LlxuIik7CisgICAgICAgICAgICBhdXRob3JpemVkID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYXV0aG9yaXplZCAmJiAoYXV0aF9tZXRob2RzICYgU1NIX0FVVEhfTUVUSE9EX1BBU1NXT1JEKSkgeworICAgICAgICBpZiAoc3NoX3VzZXJhdXRoX3Bhc3N3b3JkKGxpYnNzaC0+c2Vzc2lvbiwgTlVMTCwgcGFzc3dvcmQpID09IFNTSF9BVVRIX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhsaWJzc2gsIEFWX0xPR19ERUJVRywgIkF1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NmdWwgd2l0aCBwYXNzd29yZC5cbiIpOworICAgICAgICAgICAgYXV0aG9yaXplZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWF1dGhvcml6ZWQpIHsKKyAgICAgICAgYXZfbG9nKGxpYnNzaCwgQVZfTE9HX0VSUk9SLCAiQXV0aGVudGljYXRpb24gZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBQ0NFUyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJzc2hfY3JlYXRlX3NmdHBfc2Vzc2lvbihMSUJTU0hDb250ZXh0ICpsaWJzc2gpCit7CisgICAgaWYgKCEobGlic3NoLT5zZnRwID0gc2Z0cF9uZXcobGlic3NoLT5zZXNzaW9uKSkpIHsKKyAgICAgICAgYXZfbG9nKGxpYnNzaCwgQVZfTE9HX0VSUk9SLCAiU0ZUUCBzZXNzaW9uIGNyZWF0aW9uIGZhaWxlZDogJXNcbiIsIHNzaF9nZXRfZXJyb3IobGlic3NoLT5zZXNzaW9uKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaWYgKHNmdHBfaW5pdChsaWJzc2gtPnNmdHApICE9IFNTSF9PSykgeworICAgICAgICBhdl9sb2cobGlic3NoLCBBVl9MT0dfRVJST1IsICJFcnJvciBpbml0aWFsaXppbmcgc2Z0cCBzZXNzaW9uOiAlc1xuIiwgc3NoX2dldF9lcnJvcihsaWJzc2gtPnNlc3Npb24pKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYnNzaF9vcGVuX2ZpbGUoTElCU1NIQ29udGV4dCAqbGlic3NoLCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmZpbGUpCit7CisgICAgaW50IGFjY2VzczsKKworICAgIGlmICgoZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUpICYmIChmbGFncyAmIEFWSU9fRkxBR19SRUFEKSkgeworICAgICAgICBhY2Nlc3MgPSBPX0NSRUFUIHwgT19SRFdSOworICAgICAgICBpZiAobGlic3NoLT50cnVuYykKKyAgICAgICAgICAgIGFjY2VzcyB8PSBPX1RSVU5DOworICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUpIHsKKyAgICAgICAgYWNjZXNzID0gT19DUkVBVCB8IE9fV1JPTkxZOworICAgICAgICBpZiAobGlic3NoLT50cnVuYykKKyAgICAgICAgICAgIGFjY2VzcyB8PSBPX1RSVU5DOworICAgIH0gZWxzZQorICAgICAgICBhY2Nlc3MgPSBPX1JET05MWTsKKworICAgIC8qIDA2NjYgPSAtcnctcnctcnctID0gcmVhZCt3cml0ZSBmb3IgZXZlcnlvbmUsIG1pbnVzIHVtYXNrICovCisgICAgaWYgKCEobGlic3NoLT5maWxlID0gc2Z0cF9vcGVuKGxpYnNzaC0+c2Z0cCwgZmlsZSwgYWNjZXNzLCAwNjY2KSkpIHsKKyAgICAgICAgYXZfbG9nKGxpYnNzaCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igb3BlbmluZyBzZnRwIGZpbGU6ICVzXG4iLCBzc2hfZ2V0X2Vycm9yKGxpYnNzaC0+c2Vzc2lvbikpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGxpYnNzaF9zdGF0X2ZpbGUoTElCU1NIQ29udGV4dCAqbGlic3NoKQoreworICAgIHNmdHBfYXR0cmlidXRlcyBzdGF0OworCisgICAgaWYgKCEoc3RhdCA9IHNmdHBfZnN0YXQobGlic3NoLT5maWxlKSkpIHsKKyAgICAgICAgYXZfbG9nKGxpYnNzaCwgQVZfTE9HX1dBUk5JTkcsICJDYW5ub3Qgc3RhdCByZW1vdGUgZmlsZS5cbiIpOworICAgICAgICBsaWJzc2gtPmZpbGVzaXplID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGlic3NoLT5maWxlc2l6ZSA9IHN0YXQtPnNpemU7CisgICAgICAgIHNmdHBfYXR0cmlidXRlc19mcmVlKHN0YXQpOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYnNzaF9jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIExJQlNTSENvbnRleHQgKmxpYnNzaCA9IGgtPnByaXZfZGF0YTsKKyAgICBpZiAobGlic3NoLT5maWxlKSB7CisgICAgICAgIHNmdHBfY2xvc2UobGlic3NoLT5maWxlKTsKKyAgICAgICAgbGlic3NoLT5maWxlID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGxpYnNzaC0+c2Z0cCkgeworICAgICAgICBzZnRwX2ZyZWUobGlic3NoLT5zZnRwKTsKKyAgICAgICAgbGlic3NoLT5zZnRwID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGxpYnNzaC0+c2Vzc2lvbikgeworICAgICAgICBzc2hfZGlzY29ubmVjdChsaWJzc2gtPnNlc3Npb24pOworICAgICAgICBzc2hfZnJlZShsaWJzc2gtPnNlc3Npb24pOworICAgICAgICBsaWJzc2gtPnNlc3Npb24gPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYnNzaF9vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVybCwgaW50IGZsYWdzKQoreworICAgIExJQlNTSENvbnRleHQgKmxpYnNzaCA9IGgtPnByaXZfZGF0YTsKKyAgICBjaGFyIHByb3RvWzEwXSwgcGF0aFtNQVhfVVJMX1NJWkVdLCBob3N0bmFtZVsxMDI0XSwgY3JlZGVuY2lhbHNbMTAyNF07CisgICAgaW50IHBvcnQgPSAyMiwgcmV0OworICAgIGNvbnN0IGNoYXIgKnVzZXIgPSBOVUxMLCAqcGFzcyA9IE5VTEw7CisgICAgY2hhciAqZW5kID0gTlVMTDsKKworICAgIGF2X3VybF9zcGxpdChwcm90bywgc2l6ZW9mKHByb3RvKSwKKyAgICAgICAgICAgICAgICAgY3JlZGVuY2lhbHMsIHNpemVvZihjcmVkZW5jaWFscyksCisgICAgICAgICAgICAgICAgIGhvc3RuYW1lLCBzaXplb2YoaG9zdG5hbWUpLAorICAgICAgICAgICAgICAgICAmcG9ydCwKKyAgICAgICAgICAgICAgICAgcGF0aCwgc2l6ZW9mKHBhdGgpLAorICAgICAgICAgICAgICAgICB1cmwpOworCisgICAgaWYgKHBvcnQgPD0gMCB8fCBwb3J0ID4gNjU1MzUpCisgICAgICAgIHBvcnQgPSAyMjsKKworICAgIGlmICgocmV0ID0gbGlic3NoX2NyZWF0ZV9zc2hfc2Vzc2lvbihsaWJzc2gsIGhvc3RuYW1lLCBwb3J0KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICB1c2VyID0gYXZfc3RydG9rKGNyZWRlbmNpYWxzLCAiOiIsICZlbmQpOworICAgIHBhc3MgPSBhdl9zdHJ0b2soZW5kLCAiOiIsICZlbmQpOworCisgICAgaWYgKChyZXQgPSBsaWJzc2hfYXV0aGVudGljYXRpb24obGlic3NoLCB1c2VyLCBwYXNzKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoKHJldCA9IGxpYnNzaF9jcmVhdGVfc2Z0cF9zZXNzaW9uKGxpYnNzaCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKChyZXQgPSBsaWJzc2hfb3Blbl9maWxlKGxpYnNzaCwgZmxhZ3MsIHBhdGgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGxpYnNzaF9zdGF0X2ZpbGUobGlic3NoKTsKKworICAgIHJldHVybiAwOworCisgIGZhaWw6CisgICAgbGlic3NoX2Nsb3NlKGgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGxpYnNzaF9zZWVrKFVSTENvbnRleHQgKmgsIGludDY0X3QgcG9zLCBpbnQgd2hlbmNlKQoreworICAgIExJQlNTSENvbnRleHQgKmxpYnNzaCA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IG5ld3BvczsKKworICAgIGlmIChsaWJzc2gtPmZpbGVzaXplID09IC0xICYmICh3aGVuY2UgPT0gQVZTRUVLX1NJWkUgfHwgd2hlbmNlID09IFNFRUtfRU5EKSkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZHVyaW5nIHNlZWtpbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBzd2l0Y2god2hlbmNlKSB7CisgICAgY2FzZSBBVlNFRUtfU0laRToKKyAgICAgICAgcmV0dXJuIGxpYnNzaC0+ZmlsZXNpemU7CisgICAgY2FzZSBTRUVLX1NFVDoKKyAgICAgICAgbmV3cG9zID0gcG9zOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFRUtfQ1VSOgorICAgICAgICBuZXdwb3MgPSBzZnRwX3RlbGw2NChsaWJzc2gtPmZpbGUpICsgcG9zOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFRUtfRU5EOgorICAgICAgICBuZXdwb3MgPSBsaWJzc2gtPmZpbGVzaXplICsgcG9zOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChuZXdwb3MgPCAwKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJTZWVraW5nIHRvIG5hZ2F0aXZlIHBvc2l0aW9uLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKHNmdHBfc2VlazY0KGxpYnNzaC0+ZmlsZSwgbmV3cG9zKSkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZHVyaW5nIHNlZWtpbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3cG9zOworfQorCitzdGF0aWMgaW50IGxpYnNzaF9yZWFkKFVSTENvbnRleHQgKmgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgTElCU1NIQ29udGV4dCAqbGlic3NoID0gaC0+cHJpdl9kYXRhOworICAgIGludCBieXRlc19yZWFkOworCisgICAgaWYgKChieXRlc19yZWFkID0gc2Z0cF9yZWFkKGxpYnNzaC0+ZmlsZSwgYnVmLCBzaXplKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhsaWJzc2gsIEFWX0xPR19FUlJPUiwgIlJlYWQgZXJyb3IuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKK3N0YXRpYyBpbnQgbGlic3NoX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgTElCU1NIQ29udGV4dCAqbGlic3NoID0gaC0+cHJpdl9kYXRhOworICAgIGludCBieXRlc193cml0dGVuOworCisgICAgaWYgKChieXRlc193cml0dGVuID0gc2Z0cF93cml0ZShsaWJzc2gtPmZpbGUsIGJ1Ziwgc2l6ZSkpIDwgMCkgeworICAgICAgICBhdl9sb2cobGlic3NoLCBBVl9MT0dfRVJST1IsICJXcml0ZSBlcnJvci5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTElCU1NIQ29udGV4dCwgeCkKKyNkZWZpbmUgRCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorI2RlZmluZSBFIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsidGltZW91dCIsICJzZXQgdGltZW91dCBvZiBzb2NrZXQgSS9PIG9wZXJhdGlvbnMiLCBPRkZTRVQocndfdGltZW91dCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBEfEUgfSwKKyAgICB7InRydW5jYXRlIiwgIlRydW5jYXRlIGV4aXN0aW5nIGZpbGVzIG9uIHdyaXRlIiwgT0ZGU0VUKHRydW5jKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDAsIDEsIEUgfSwKKyAgICB7InByaXZhdGVfa2V5IiwgInNldCBwYXRoIHRvIHByaXZhdGUga2V5IiwgT0ZGU0VUKHByaXZfa2V5KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sIDAsIDAsIER8RSB9LAorICAgIHtOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgbGlic3NoX2NvbnRleHRfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgICAgID0gImxpYnNzaCIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitVUkxQcm90b2NvbCBmZl9saWJzc2hfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAic2Z0cCIsCisgICAgLnVybF9vcGVuICAgICAgICAgICAgPSBsaWJzc2hfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgICAgICA9IGxpYnNzaF9yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICAgICAgID0gbGlic3NoX3dyaXRlLAorICAgIC51cmxfc2VlayAgICAgICAgICAgID0gbGlic3NoX3NlZWssCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgPSBsaWJzc2hfY2xvc2UsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgPSBzaXplb2YoTElCU1NIQ29udGV4dCksCisgICAgLnByaXZfZGF0YV9jbGFzcyAgICAgPSAmbGlic3NoX2NvbnRleHRfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9sbWxtNC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2xtbG00LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5ZjQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9sbWxtNC5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogTGludXggTWVkaWEgTGFicyBNUEVHLTQgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA4IEl2byB2YW4gUG9vcnRlbgorICoKKyAqIER1ZSB0byBhIGxhY2sgb2Ygc2FtcGxlIGZpbGVzLCBvbmx5IGZpbGVzIHdpdGggb25lIGNoYW5uZWwgYXJlIHN1cHBvcnRlZC4KKyAqIHUtbGF3IGFuZCBBRFBDTSBhdWRpbyBhcmUgdW5zdXBwb3J0ZWQgZm9yIHRoZSBzYW1lIHJlYXNvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBMTUxNNF9JX0ZSQU1FICAgMHgwMAorI2RlZmluZSBMTUxNNF9QX0ZSQU1FICAgMHgwMQorI2RlZmluZSBMTUxNNF9CX0ZSQU1FICAgMHgwMgorI2RlZmluZSBMTUxNNF9JTlZBTElEICAgMHgwMworI2RlZmluZSBMTUxNNF9NUEVHMUwyICAgMHgwNAorCisjZGVmaW5lIExNTE00X01BWF9QQUNLRVRfU0laRSAgIDEwMjQgKiAxMDI0CisKK3N0YXRpYyBpbnQgbG1sbTRfcHJvYmUoQVZQcm9iZURhdGEgKnBkKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHBkLT5idWY7CisgICAgdW5zaWduZWQgaW50IGZyYW1lX3R5cGUsIHBhY2tldF9zaXplOworCisgICAgZnJhbWVfdHlwZSAgPSBBVl9SQjE2KGJ1ZiArIDIpOworICAgIHBhY2tldF9zaXplID0gQVZfUkIzMihidWYgKyA0KTsKKworICAgIGlmICghQVZfUkIxNihidWYpICYmIGZyYW1lX3R5cGUgPD0gTE1MTTRfTVBFRzFMMiAmJiBwYWNrZXRfc2l6ZSAmJgorICAgICAgICBmcmFtZV90eXBlICE9IExNTE00X0lOVkFMSUQgJiYgcGFja2V0X3NpemUgPD0gTE1MTTRfTUFYX1BBQ0tFVF9TSVpFKSB7CisgICAgICAgIGlmIChmcmFtZV90eXBlID09IExNTE00X01QRUcxTDIpIHsKKyAgICAgICAgICAgIGlmICgoQVZfUkIxNihidWYgKyA4KSAmIDB4ZmZmZSkgIT0gMHhmZmZjKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgLyogSSBjb3VsZCBjYWxjdWxhdGUgdGhlIGF1ZGlvIGZyYW1lc2l6ZSBhbmQgY29tcGFyZSB3aXRoCisgICAgICAgICAgICAgKiBwYWNrZXRfc2l6ZS04LCBidXQgdGhhdCBzZWVtcyBvdmVya2lsbCAqLworICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gMzsKKyAgICAgICAgfSBlbHNlIGlmIChBVl9SQjI0KGJ1ZiArIDgpID09IDB4MDAwMDAxKSB7ICAgIC8qIFBFUyBTaWduYWwgKi8KKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbWxtNF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTVBFRzQ7CisgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMTAwMSwgMzAwMDApOworCisgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTVAyOworICAgIHN0LT5uZWVkX3BhcnNpbmcgICAgICA9IEFWU1RSRUFNX1BBUlNFX0hFQURFUlM7CisKKyAgICAvKiB0aGUgcGFyYW1ldGVycyB3aWxsIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBjb21wcmVzc2VkIGJpdHN0cmVhbSAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxtbG00X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGludCBmcmFtZV90eXBlLCBwYWNrZXRfc2l6ZSwgcGFkZGluZywgZnJhbWVfc2l6ZTsKKworICAgIGF2aW9fcmIxNihwYik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIG51bWJlciAqLworICAgIGZyYW1lX3R5cGUgID0gYXZpb19yYjE2KHBiKTsKKyAgICBwYWNrZXRfc2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgcGFkZGluZyAgICAgPSAtcGFja2V0X3NpemUgJiA1MTE7CisgICAgZnJhbWVfc2l6ZSAgPSBwYWNrZXRfc2l6ZSAtIDg7CisKKyAgICBpZiAoZnJhbWVfdHlwZSA+IExNTE00X01QRUcxTDIgfHwgZnJhbWVfdHlwZSA9PSBMTUxNNF9JTlZBTElEKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG9yIHVuc3VwcG9ydGVkIGZyYW1lX3R5cGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBpZiAocGFja2V0X3NpemUgPiBMTUxNNF9NQVhfUEFDS0VUX1NJWkUgfHwgcGFja2V0X3NpemU8PTgpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInBhY2tldCBzaXplICVkIGlzIGludmFsaWRcbiIsIHBhY2tldF9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgZnJhbWVfc2l6ZSkpIDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBhdmlvX3NraXAocGIsIHBhZGRpbmcpOworCisgICAgc3dpdGNoIChmcmFtZV90eXBlKSB7CisgICAgY2FzZSBMTUxNNF9JX0ZSQU1FOgorICAgICAgICBwa3QtPmZsYWdzID0gQVZfUEtUX0ZMQUdfS0VZOworICAgIGNhc2UgTE1MTTRfUF9GUkFNRToKKyAgICBjYXNlIExNTE00X0JfRlJBTUU6CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUxNNF9NUEVHMUwyOgorICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbG1sbTRfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibG1sbTQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgbG1sbTQiKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBsbWxtNF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBsbWxtNF9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBsbWxtNF9yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbG9hc2RlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2xvYXNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDE4MDliCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2xvYXNkZWMuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogTE9BUyBBdWRpb1N5bmNTdHJlYW0gZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInJhd2RlYy5oIgorCisjZGVmaW5lIExPQVNfU1lOQ19XT1JEIDB4MmI3CisKK3N0YXRpYyBpbnQgbG9hc19wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpbnQgbWF4X2ZyYW1lcyA9IDAsIGZpcnN0X2ZyYW1lcyA9IDA7CisgICAgaW50IGZzaXplLCBmcmFtZXM7CisgICAgY29uc3QgdWludDhfdCAqYnVmMCA9IHAtPmJ1ZjsKKyAgICBjb25zdCB1aW50OF90ICpidWYyOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKyAgICBjb25zdCB1aW50OF90ICplbmQgPSBidWYwICsgcC0+YnVmX3NpemUgLSAzOworICAgIGJ1ZiA9IGJ1ZjA7CisKKyAgICBmb3IgKDsgYnVmIDwgZW5kOyBidWYgPSBidWYyICsgMSkgeworICAgICAgICBidWYyID0gYnVmOworCisgICAgICAgIGZvciAoZnJhbWVzID0gMDsgYnVmMiA8IGVuZDsgZnJhbWVzKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IEFWX1JCMjQoYnVmMik7CisgICAgICAgICAgICBpZiAoKGhlYWRlciA+PiAxMykgIT0gTE9BU19TWU5DX1dPUkQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBmc2l6ZSA9IChoZWFkZXIgJiAweDFGRkYpICsgMzsKKyAgICAgICAgICAgIGlmIChmc2l6ZSA8IDcpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBmc2l6ZSA9IEZGTUlOKGZzaXplLCBlbmQgLSBidWYyKTsKKyAgICAgICAgICAgIGJ1ZjIgKz0gZnNpemU7CisgICAgICAgIH0KKyAgICAgICAgbWF4X2ZyYW1lcyA9IEZGTUFYKG1heF9mcmFtZXMsIGZyYW1lcyk7CisgICAgICAgIGlmIChidWYgPT0gYnVmMCkKKyAgICAgICAgICAgIGZpcnN0X2ZyYW1lcyA9IGZyYW1lczsKKyAgICB9CisKKyAgICBpZiAoZmlyc3RfZnJhbWVzID49IDMpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDE7CisgICAgZWxzZSBpZiAobWF4X2ZyYW1lcyA+IDEwMCkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworICAgIGVsc2UgaWYgKG1heF9mcmFtZXMgPj0gMykKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIC8gMjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxvYXNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICpzdDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBzLT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CisgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOworCisgICAgLy9MQ00gb2YgYWxsIHBvc3NpYmxlIEFBQyBzYW1wbGUgcmF0ZXMKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMjgyMjQwMDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbG9hc19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsb2FzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTE9BUyBBdWRpb1N5bmNTdHJlYW0iKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBsb2FzX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGxvYXNfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmZfcmF3X3JlYWRfcGFydGlhbF9wYWNrZXQsCisgICAgLmZsYWdzPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5yYXdfY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BQUNfTEFUTSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbG9nMl90YWIuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9sb2cyX3RhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YTFkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbG9nMl90YWIuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZzJfdGFiLmMiCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbHJjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbHJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5YzY1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9scmMuYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogTFJDIGx5cmljcyBmaWxlIGZvcm1hdCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgU3RhckJyaWxsaWFudCA8bTEzMjUzQGhvdG1haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJscmMuaCIKKworY29uc3QgQVZNZXRhZGF0YUNvbnYgZmZfbHJjX21ldGFkYXRhX2NvbnZbXSA9IHsKKyAgICB7InRpIiwgInRpdGxlIn0sCisgICAgeyJhbCIsICJhbGJ1bSJ9LAorICAgIHsiYXIiLCAiYXJ0aXN0In0sCisgICAgeyJhdSIsICJhdXRob3IifSwKKyAgICB7ImJ5IiwgImNyZWF0b3IifSwKKyAgICB7InJlIiwgImVuY29kZXIifSwKKyAgICB7InZlIiwgImVuY29kZXJfdmVyc2lvbiJ9LAorICAgIHswLCAwfQorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9scmMuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9scmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjk3YmMxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2xyYy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBMUkMgbHlyaWNzIGZpbGUgZm9ybWF0IGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBTdGFyQnJpbGxpYW50IDxtMTMyNTNAaG90bWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfTFJDX0gKKyNkZWZpbmUgQVZGT1JNQVRfTFJDX0gKKworI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisKK2V4dGVybiBjb25zdCBBVk1ldGFkYXRhQ29udiBmZl9scmNfbWV0YWRhdGFfY29udltdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9scmNkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9scmNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjYxODUzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2xyY2RlYy5jCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogTFJDIGx5cmljcyBmaWxlIGZvcm1hdCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgU3RhckJyaWxsaWFudCA8bTEzMjUzQGhvdG1haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJscmMuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgInN1YnRpdGxlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorCit0eXBlZGVmIHN0cnVjdCBMUkNDb250ZXh0IHsKKyAgICBGRkRlbXV4U3VidGl0bGVzUXVldWUgcTsKKyAgICBpbnQ2NF90IHRzX29mZnNldDsgLy8gb2Zmc2V0IG1ldGFkYXRhIGl0ZW0KK30gTFJDQ29udGV4dDsKKworc3RhdGljIGludDY0X3QgZmluZF9oZWFkZXIoY29uc3QgY2hhciAqcCkKK3sKKyAgICBpbnQ2NF90IG9mZnNldCA9IDA7CisgICAgd2hpbGUocFtvZmZzZXRdID09ICcgJyB8fCBwW29mZnNldF0gPT0gJ1x0JykgeworICAgICAgICBvZmZzZXQrKzsKKyAgICB9CisgICAgaWYocFtvZmZzZXRdID09ICdbJyAmJiBwW29mZnNldCArIDFdID49ICdhJyAmJiBwW29mZnNldCArIDFdIDw9ICd6JykgeworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQ2NF90IGNvdW50X3RzKGNvbnN0IGNoYXIgKnApCit7CisgICAgaW50NjRfdCBvZmZzZXQgPSAwOworICAgIGludCBpbl9icmFja2V0cyA9IDA7CisKKyAgICBmb3IoOzspIHsKKyAgICAgICAgaWYocFtvZmZzZXRdID09ICcgJyB8fCBwW29mZnNldF0gPT0gJ1x0JykgeworICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgIH0gZWxzZSBpZihwW29mZnNldF0gPT0gJ1snKSB7CisgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgIGluX2JyYWNrZXRzKys7CisgICAgICAgIH0gZWxzZSBpZiAocFtvZmZzZXRdID09ICddJyAmJiBpbl9icmFja2V0cykgeworICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgICBpbl9icmFja2V0cy0tOworICAgICAgICB9IGVsc2UgaWYoaW5fYnJhY2tldHMgJiYKKyAgICAgICAgICAgICAgICAgKHBbb2Zmc2V0XSA9PSAnOicgfHwgcFtvZmZzZXRdID09ICcuJyB8fCBwW29mZnNldF0gPT0gJy0nIHx8CisgICAgICAgICAgICAgICAgIChwW29mZnNldF0gPj0gJzAnICYmIHBbb2Zmc2V0XSA8PSAnOScpKSkgeworICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgaW50NjRfdCByZWFkX3RzKGNvbnN0IGNoYXIgKnAsIGludDY0X3QgKnN0YXJ0KQoreworICAgIGludDY0X3Qgb2Zmc2V0ID0gMDsKKyAgICB1aW50NjRfdCBtbSwgc3MsIGNzOworCisgICAgd2hpbGUocFtvZmZzZXRdID09ICcgJyB8fCBwW29mZnNldF0gPT0gJ1x0JykgeworICAgICAgICBvZmZzZXQrKzsKKyAgICB9CisgICAgaWYocFtvZmZzZXRdICE9ICdbJykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYoc3NjYW5mKHAsICJbLSUiU0NOdTY0IjolIlNDTnU2NCIuJSJTQ051NjQiXSIsICZtbSwgJnNzLCAmY3MpID09IDMpIHsKKyAgICAgICAgLyogSnVzdCBpbiBjYXNlIG5lZ2F0aXZlIHB0cywgcGxheWVycyBtYXkgZHJvcCBpdCBidXQgd2Ugd29uJ3QuICovCisgICAgICAgICpzdGFydCA9IC0oaW50NjRfdCkgKG1tKjYwMDAwICsgc3MqMTAwMCArIGNzKjEwKTsKKyAgICB9IGVsc2UgaWYoc3NjYW5mKHAsICJbJSJTQ051NjQiOiUiU0NOdTY0Ii4lIlNDTnU2NCJdIiwgJm1tLCAmc3MsICZjcykgPT0gMykgeworICAgICAgICAqc3RhcnQgPSBtbSo2MDAwMCArIHNzKjEwMDAgKyBjcyoxMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZG8geworICAgICAgICBvZmZzZXQrKzsKKyAgICB9IHdoaWxlKHBbb2Zmc2V0XSAmJiBwW29mZnNldC0xXSAhPSAnXScpOworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQ2NF90IHJlYWRfbGluZShBVkJQcmludCAqYnVmLCBBVklPQ29udGV4dCAqcGIpCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgYXZfYnByaW50X2NsZWFyKGJ1Zik7CisgICAgd2hpbGUoIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgaW50IGMgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgaWYoYyAhPSAnXHInKSB7CisgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnVmLCBjLCAxKTsKKyAgICAgICAgfQorICAgICAgICBpZihjID09ICdcbicpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBpbnQgbHJjX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGludDY0X3Qgb2Zmc2V0ID0gMDsKKyAgICBpbnQ2NF90IG1tOworICAgIHVpbnQ2NF90IHNzLCBjczsKKyAgICBjb25zdCBBVk1ldGFkYXRhQ29udiAqbWV0YWRhdGFfaXRlbTsKKworICAgIGlmKCFtZW1jbXAocC0+YnVmLCAiXHhlZlx4YmJceGJmIiwgMykpIHsgLy8gU2tpcCBVVEYtOCBCT00gaGVhZGVyCisgICAgICAgIG9mZnNldCArPSAzOworICAgIH0KKyAgICB3aGlsZShwLT5idWZbb2Zmc2V0XSA9PSAnXG4nIHx8IHAtPmJ1ZltvZmZzZXRdID09ICdccicpIHsKKyAgICAgICAgb2Zmc2V0Kys7CisgICAgfQorICAgIGlmKHAtPmJ1ZltvZmZzZXRdICE9ICdbJykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2Zmc2V0Kys7CisgICAgLy8gQ29tbW9uIG1ldGFkYXRhIGl0ZW0gYnV0IG5vdCBleGlzdCBpbiBmZl9scmNfbWV0YWRhdGFfY29udgorICAgIGlmKCFtZW1jbXAocC0+YnVmICsgb2Zmc2V0LCAib2Zmc2V0OiIsIDcpKSB7CisgICAgICAgIHJldHVybiA0MDsKKyAgICB9CisgICAgaWYoc3NjYW5mKHAtPmJ1ZiArIG9mZnNldCwgIiUiU0NOZDY0IjolIlNDTnU2NCIuJSJTQ051NjQiXSIsCisgICAgICAgICAgICAgICZtbSwgJnNzLCAmY3MpID09IDMpIHsKKyAgICAgICAgcmV0dXJuIDUwOworICAgIH0KKyAgICAvLyBNZXRhZGF0YSBpdGVtcyBleGlzdCBpbiBmZl9scmNfbWV0YWRhdGFfY29udgorICAgIGZvcihtZXRhZGF0YV9pdGVtID0gZmZfbHJjX21ldGFkYXRhX2NvbnY7CisgICAgICAgIG1ldGFkYXRhX2l0ZW0tPm5hdGl2ZTsgbWV0YWRhdGFfaXRlbSsrKSB7CisgICAgICAgIHNpemVfdCBtZXRhZGF0YV9pdGVtX2xlbiA9IHN0cmxlbihtZXRhZGF0YV9pdGVtLT5uYXRpdmUpOworICAgICAgICBpZihwLT5idWZbb2Zmc2V0ICsgbWV0YWRhdGFfaXRlbV9sZW5dID09ICc6JyAmJgorICAgICAgICAgICAhbWVtY21wKHAtPmJ1ZiArIG9mZnNldCwgbWV0YWRhdGFfaXRlbS0+bmF0aXZlLCBtZXRhZGF0YV9pdGVtX2xlbikpIHsKKyAgICAgICAgICAgIHJldHVybiA0MDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gNTsgLy8gR2l2ZSBpdCA1IHNjb3JlcyBzaW5jZSBpdCBzdGFydHMgd2l0aCBhIGJyYWNrZXQKK30KKworc3RhdGljIGludCBscmNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIExSQ0NvbnRleHQgKmxyYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkJQcmludCBsaW5lOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZighc3QpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDApOworICAgIGxyYy0+dHNfb2Zmc2V0ID0gMDsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVEVYVDsKKyAgICBhdl9icHJpbnRfaW5pdCgmbGluZSwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIHdoaWxlKCFhdmlvX2Zlb2Yocy0+cGIpKSB7CisgICAgICAgIGludDY0X3QgcG9zID0gcmVhZF9saW5lKCZsaW5lLCBzLT5wYik7CisgICAgICAgIGludDY0X3QgaGVhZGVyX29mZnNldCA9IGZpbmRfaGVhZGVyKGxpbmUuc3RyKTsKKyAgICAgICAgaWYoaGVhZGVyX29mZnNldCA+PSAwKSB7CisgICAgICAgICAgICBjaGFyICpjb21tYV9vZmZzZXQgPSBzdHJjaHIobGluZS5zdHIsICc6Jyk7CisgICAgICAgICAgICBpZihjb21tYV9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpyaWdodF9icmFja2V0X29mZnNldCA9IHN0cmNocihsaW5lLnN0ciwgJ10nKTsKKyAgICAgICAgICAgICAgICBpZighcmlnaHRfYnJhY2tldF9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKnJpZ2h0X2JyYWNrZXRfb2Zmc2V0ID0gKmNvbW1hX29mZnNldCA9ICdcMCc7CisgICAgICAgICAgICAgICAgaWYoc3RyY21wKGxpbmUuc3RyICsgMSwgIm9mZnNldCIpIHx8CisgICAgICAgICAgICAgICAgICAgc3NjYW5mKGNvbW1hX29mZnNldCArIDEsICIlIlNDTmQ2NCwgJmxyYy0+dHNfb2Zmc2V0KSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgbGluZS5zdHIgKyAxLCBjb21tYV9vZmZzZXQgKyAxLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmNvbW1hX29mZnNldCA9ICc6JzsKKyAgICAgICAgICAgICAgICAqcmlnaHRfYnJhY2tldF9vZmZzZXQgPSAnXSc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFWUGFja2V0ICpzdWI7CisgICAgICAgICAgICBpbnQ2NF90IHRzX3N0YXJ0ID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgICAgICBpbnQ2NF90IHRzX3N0cm9mZnNldCA9IDA7CisgICAgICAgICAgICBpbnQ2NF90IHRzX3N0cm9mZnNldF9pbmNyID0gMDsKKyAgICAgICAgICAgIGludDY0X3QgdHNfc3RybGVuZ3RoID0gY291bnRfdHMobGluZS5zdHIpOworCisgICAgICAgICAgICB3aGlsZSgodHNfc3Ryb2Zmc2V0X2luY3IgPSByZWFkX3RzKGxpbmUuc3RyICsgdHNfc3Ryb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHNfc3RhcnQpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdHNfc3Ryb2Zmc2V0ICs9IHRzX3N0cm9mZnNldF9pbmNyOworICAgICAgICAgICAgICAgIHN1YiA9IGZmX3N1YnRpdGxlc19xdWV1ZV9pbnNlcnQoJmxyYy0+cSwgbGluZS5zdHIgKyB0c19zdHJsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmxlbiAtIHRzX3N0cmxlbmd0aCwgMCk7CisgICAgICAgICAgICAgICAgaWYoIXN1YikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdWItPnBvcyA9IHBvczsKKyAgICAgICAgICAgICAgICBzdWItPnB0cyA9IHRzX3N0YXJ0IC0gbHJjLT50c19vZmZzZXQ7CisgICAgICAgICAgICAgICAgc3ViLT5kdXJhdGlvbiA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9maW5hbGl6ZSgmbHJjLT5xKTsKKyAgICBmZl9tZXRhZGF0YV9jb252X2N0eChzLCBOVUxMLCBmZl9scmNfbWV0YWRhdGFfY29udik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHJjX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBMUkNDb250ZXh0ICpscmMgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3N1YnRpdGxlc19xdWV1ZV9yZWFkX3BhY2tldCgmbHJjLT5xLCBwa3QpOworfQorCitzdGF0aWMgaW50IGxyY19yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3RzLCBpbnQ2NF90IHRzLCBpbnQ2NF90IG1heF90cywgaW50IGZsYWdzKQoreworICAgIExSQ0NvbnRleHQgKmxyYyA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJmxyYy0+cSwgcywgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdHMsIHRzLCBtYXhfdHMsIGZsYWdzKTsKK30KKworc3RhdGljIGludCBscmNfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTFJDQ29udGV4dCAqbHJjID0gcy0+cHJpdl9kYXRhOworICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9jbGVhbigmbHJjLT5xKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9scmNfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibHJjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTFJDIGx5cmljcyIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZiAoTFJDQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gbHJjX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGxyY19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBscmNfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gbHJjX3JlYWRfY2xvc2UsCisgICAgLnJlYWRfc2VlazIgICAgID0gbHJjX3JlYWRfc2VlaworfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9scmNlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9scmNlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzE2Y2NkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2xyY2VuYy5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTFJDIGx5cmljcyBmaWxlIGZvcm1hdCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgU3RhckJyaWxsaWFudCA8bTEzMjUzQGhvdG1haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJscmMuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgInN1YnRpdGxlcy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hY3Jvcy5oIgorCitzdGF0aWMgaW50IGxyY193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGNvbnN0IEFWRGljdGlvbmFyeUVudHJ5ICptZXRhZGF0YV9pdGVtOworCisgICAgaWYocy0+bmJfc3RyZWFtcyAhPSAxIHx8CisgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTFJDIHN1cHBvcnRzIG9ubHkgYSBzaW5nbGUgc3VidGl0bGUgc3RyZWFtLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9TVUJSSVAgJiYKKyAgICAgICBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEVYVCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgc3VidGl0bGUgY29kZWM6ICVzXG4iLAorICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzLT5zdHJlYW1zWzBdLCA2NCwgMSwgMTAwKTsKKworICAgIGZmX21ldGFkYXRhX2NvbnZfY3R4KHMsIGZmX2xyY19tZXRhZGF0YV9jb252LCBOVUxMKTsKKyAgICBpZighKHMtPmZsYWdzICYgQVZGTVRfRkxBR19CSVRFWEFDVCkpIHsgLy8gYXZvaWQgYnJlYWtpbmcgcmVncmVzc2lvbiB0ZXN0cworICAgICAgICAvKiBMUkMgcHJvdmlkZXMgYSBtZXRhZGF0YSBzbG90IGZvciBzcGVjaWZ5aW5nIGVuY29kZXIgdmVyc2lvbgorICAgICAgICAgKiBpbiBhZGRpdGlvbiB0byBlbmNvZGVyIG5hbWUuIFdlIHdpbGwgc3RvcmUgTElCQVZGT1JNQVRfVkVSU0lPTgorICAgICAgICAgKiB0byBpdC4KKyAgICAgICAgICovCisgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgInZlIiwgQVZfU1RSSU5HSUZZKExJQkFWRk9STUFUX1ZFUlNJT04pLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJ2ZSIsIE5VTEwsIDApOworICAgIH0KKyAgICBmb3IobWV0YWRhdGFfaXRlbSA9IE5VTEw7CisgICAgICAgKG1ldGFkYXRhX2l0ZW0gPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgIiIsIG1ldGFkYXRhX2l0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKTspIHsKKyAgICAgICAgY2hhciAqZGVsaW07CisgICAgICAgIGlmKCFtZXRhZGF0YV9pdGVtLT52YWx1ZVswXSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUoKGRlbGltID0gc3RyY2hyKG1ldGFkYXRhX2l0ZW0tPnZhbHVlLCAnXG4nKSkpIHsKKyAgICAgICAgICAgICpkZWxpbSA9ICcgJzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSgoZGVsaW0gPSBzdHJjaHIobWV0YWRhdGFfaXRlbS0+dmFsdWUsICdccicpKSkgeworICAgICAgICAgICAgKmRlbGltID0gJyAnOworICAgICAgICB9CisgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiWyVzOiVzXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfaXRlbS0+a2V5LCBtZXRhZGF0YV9pdGVtLT52YWx1ZSk7CisgICAgfQorICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscmNfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpZihwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBjaGFyICpkYXRhID0gYXZfbWFsbG9jKHBrdC0+c2l6ZSArIDEpOworICAgICAgICBjaGFyICpsaW5lOworICAgICAgICBjaGFyICpkZWxpbTsKKworICAgICAgICBpZighZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZGF0YSwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgICAgICBkYXRhW3BrdC0+c2l6ZV0gPSAnXDAnOworCisgICAgICAgIGZvcihkZWxpbSA9IGRhdGEgKyBwa3QtPnNpemUgLSAxOworICAgICAgICAgICAgZGVsaW0gPj0gZGF0YSAmJiAoZGVsaW1bMF0gPT0gJ1xuJyB8fCBkZWxpbVswXSA9PSAnXHInKTsgZGVsaW0tLSkgeworICAgICAgICAgICAgZGVsaW1bMF0gPSAnXDAnOyAvLyBTdHJpcCBsYXN0IGVtcHR5IGxpbmVzCisgICAgICAgIH0KKyAgICAgICAgbGluZSA9IGRhdGE7CisgICAgICAgIHdoaWxlKGxpbmVbMF0gPT0gJ1xuJyB8fCBsaW5lWzBdID09ICdccicpIHsKKyAgICAgICAgICAgIGxpbmUrKzsgLy8gU2tpcCBmaXJzdCBlbXB0eSBsaW5lcworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUobGluZSkgeworICAgICAgICAgICAgZGVsaW0gPSBzdHJjaHIobGluZSwgJ1xuJyk7CisgICAgICAgICAgICBpZihkZWxpbSkgeworICAgICAgICAgICAgICAgIGlmKGRlbGltID4gbGluZSAmJiBkZWxpbVstMV0gPT0gJ1xyJykgeworICAgICAgICAgICAgICAgICAgICBkZWxpbVstMV0gPSAnXDAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWxpbVswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgZGVsaW0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGxpbmVbMF0gPT0gJ1snKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiU3VidGl0bGUgc3RhcnRzIHdpdGggJ1snLCBtYXkgY2F1c2UgcHJvYmxlbXMgd2l0aCBMUkMgZm9ybWF0LlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHBrdC0+cHRzID49IDApIHsKKyAgICAgICAgICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIlslMDIiUFJJZDY0IjolMDIiUFJJZDY0Ii4lMDIiUFJJZDY0Il0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwa3QtPnB0cyAvIDYwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGt0LT5wdHMgLyAxMDApICUgNjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwa3QtPnB0cyAlIDEwMCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBPZmZzZXQgZmVhdHVyZSBvZiBMUkMgY2FuIGVhc2lseSBtYWtlIHB0cyBuZWdhdGl2ZSwKKyAgICAgICAgICAgICAgICAgKiB3ZSBqdXN0IG91dHB1dCBpdCBkaXJlY3RseSBhbmQgbGV0IHRoZSBwbGF5ZXIgZHJvcCBpdC4gKi8KKyAgICAgICAgICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIlstJTAyIlBSSWQ2NCI6JTAyIlBSSWQ2NCIuJTAyIlBSSWQ2NCJdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXBrdC0+cHRzKSAvIDYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgtcGt0LT5wdHMpIC8gMTAwKSAlIDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtcGt0LT5wdHMpICUgMTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiJXNcbiIsIGxpbmUpOworICAgICAgICAgICAgbGluZSA9IGRlbGltOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWUoZGF0YSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9scmNfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxyYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkxSQyBseXJpY3MiKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAibHJjIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSAwLAorICAgIC53cml0ZV9oZWFkZXIgICA9IGxyY193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gbHJjX3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9WQVJJQUJMRV9GUFMgfCBBVkZNVF9HTE9CQUxIRUFERVIgfAorICAgICAgICAgICAgICAgICAgICAgIEFWRk1UX1RTX05FR0FUSVZFIHwgQVZGTVRfVFNfTk9OU1RSSUNULAorICAgIC5zdWJ0aXRsZV9jb2RlYyA9IEFWX0NPREVDX0lEX1NVQlJJUAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9sdmZkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9sdmZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWFlYzU5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L2x2ZmRlYy5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTFZGIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJpZmYuaCIKKworc3RhdGljIGludCBsdmZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKEFWX1JMMzIocC0+YnVmKSAhPSBNS1RBRygnTCcsICdWJywgJ0YnLCAnRicpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghQVZfUkwzMihwLT5idWYgKyAxNikgfHwgQVZfUkwzMihwLT5idWYgKyAxNikgPiAyNTYpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDg7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047Cit9CisKK3N0YXRpYyBpbnQgbHZmX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50NjRfdCBuZXh0X29mZnNldDsKKyAgICB1bnNpZ25lZCBzaXplLCBuYl9zdHJlYW1zLCBpZDsKKworICAgIGF2aW9fc2tpcChzLT5wYiwgMTYpOworICAgIG5iX3N0cmVhbXMgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIGlmICghbmJfc3RyZWFtcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKG5iX3N0cmVhbXMgPiAyKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiJWQgc3RyZWFtcyIsIG5iX3N0cmVhbXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgYXZpb19za2lwKHMtPnBiLCAxMDEyKTsKKworICAgIHdoaWxlICghYXZpb19mZW9mKHMtPnBiKSkgeworICAgICAgICBpZCAgICAgICAgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgIHNpemUgICAgICAgID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICAgICAgbmV4dF9vZmZzZXQgPSBhdmlvX3RlbGwocy0+cGIpICsgc2l6ZTsKKworICAgICAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIGNhc2UgTUtUQUcoJzAnLCAnMCcsICdmJywgJ20nKToKKyAgICAgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKKyAgICAgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcpOworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIDEwMDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJzAnLCAnMScsICdmJywgJ20nKToKKyAgICAgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKKyAgICAgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgPSBhdmlvX3JsMTYocy0+cGIpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IGF2aW9fcmwxNihzLT5wYik7CisgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19ybDE2KHMtPnBiKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgOCk7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY193YXZfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcpOworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIDEwMDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgMjA0OCArIDgsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJpZCAlZCIsIGlkKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorCisgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgbmV4dF9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Cit9CisKK3N0YXRpYyBpbnQgbHZmX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICB1bnNpZ25lZCBzaXplLCBmbGFncywgdGltZXN0YW1wLCBpZDsKKyAgICBpbnQ2NF90IHBvczsKKyAgICBpbnQgcmV0LCBpc192aWRlbyA9IDA7CisKKyAgICBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIHdoaWxlICghYXZpb19mZW9mKHMtPnBiKSkgeworICAgICAgICBpZCAgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgIHNpemUgID0gYXZpb19ybDMyKHMtPnBiKTsKKworICAgICAgICBpZiAoc2l6ZSA9PSAweEZGRkZGRkZGdSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgICAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIGNhc2UgTUtUQUcoJzAnLCAnMCcsICdkJywgJ2MnKToKKyAgICAgICAgICAgIGlzX3ZpZGVvID0gMTsKKyAgICAgICAgY2FzZSBNS1RBRygnMCcsICcxJywgJ3cnLCAnYicpOgorICAgICAgICAgICAgaWYgKHNpemUgPCA4KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgdGltZXN0YW1wID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICAgICAgICAgIGZsYWdzID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICAgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSAtIDgpOworICAgICAgICAgICAgaWYgKGZsYWdzICYgKDEgPDwgMTIpKQorICAgICAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBpc192aWRlbyA/IDAgOiAxOworICAgICAgICAgICAgcGt0LT5wdHMgICAgICAgICAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICBwa3QtPnBvcyAgICAgICAgICA9IHBvczsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSBhdmlvX3NraXAocy0+cGIsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiBBVkVSUk9SX0VPRjsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9sdmZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgPSAibHZmIiwKKyAgICAubG9uZ19uYW1lICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTFZGIiksCisgICAgLnJlYWRfcHJvYmUgID0gbHZmX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciA9IGx2Zl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgPSBsdmZfcmVhZF9wYWNrZXQsCisgICAgLmV4dGVuc2lvbnMgID0gImx2ZiIsCisgICAgLmZsYWdzICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbHhmZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbHhmZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzN2RhNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9seGZkZWMuYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIExYRiBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgVG9tYXMgSMOkcmRpbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTFhGX01BWF9QQUNLRVRfSEVBREVSX1NJWkUgMjU2CisjZGVmaW5lIExYRl9IRUFERVJfREFUQV9TSVpFICAgIDEyMAorI2RlZmluZSBMWEZfSURFTlQgICAgICAgICAgICAgICAiTEVJVENIXDAiCisjZGVmaW5lIExYRl9JREVOVF9MRU5HVEggICAgICAgIDgKKyNkZWZpbmUgTFhGX1NBTVBMRVJBVEUgICAgICAgICAgNDgwMDAKKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgbHhmX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX01KUEVHLCAgICAgICAwIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLCAgMSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgIDIgfSwgICAgLy9NcE1sLCA0OjI6MAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgIDMgfSwgICAgLy9NcFBsLCA0OjI6MgorICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgICAgIDQgfSwgICAgLy9EVjI1CisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCAgICAgNSB9LCAgICAvL0RWQ1BSTworICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgICAgIDYgfSwgICAgLy9EVkNQUk81MAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgIDcgfSwgICAgLy9BVl9QSVhfRk1UX0FSR0IsIHdoZXJlIGFscGhhIGlzIHVzZWQgZm9yIGNocm9tYSBrZXlpbmcKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICA4IH0sICAgIC8vMTYtYml0IGNocm9tYSBrZXkKKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sICA5IH0sICAgIC8vNDoyOjIgQ0JQICgiQ29uc3RyYWluZWQgQnl0ZXMgcGVyIEdvcCIpCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAgICAgICAgMCB9LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBjaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLiB6ZXJvIG1lYW5zIG5vIGF1ZGlvCisgICAgaW50IGZyYW1lX251bWJlcjsgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IHZpZGVvIGZyYW1lCisgICAgdWludDMyX3QgdmlkZW9fZm9ybWF0LCBwYWNrZXRfdHlwZSwgZXh0ZW5kZWRfc2l6ZTsKK30gTFhGRGVtdXhDb250ZXh0OworCitzdGF0aWMgaW50IGx4Zl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoIW1lbWNtcChwLT5idWYsIExYRl9JREVOVCwgTFhGX0lERU5UX0xFTkdUSCkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFZlcmlmeSB0aGUgY2hlY2tzdW0gb2YgYW4gTFhGIHBhY2tldCBoZWFkZXIKKyAqCisgKiBAcGFyYW1baW5dIGhlYWRlciB0aGUgcGFja2V0IGhlYWRlciB0byBjaGVjaworICogQHJldHVybiB6ZXJvIGlmIHRoZSBjaGVja3N1bSBpcyBPSywgbm9uLXplcm8gb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfY2hlY2tzdW0oY29uc3QgdWludDhfdCAqaGVhZGVyLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgeDsKKyAgICB1aW50MzJfdCBzdW0gPSAwOworCisgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7IHggKz0gNCkKKyAgICAgICAgc3VtICs9IEFWX1JMMzIoJmhlYWRlclt4XSk7CisKKyAgICByZXR1cm4gc3VtOworfQorCisvKioKKyAqIFJlYWQgaW5wdXQgdW50aWwgd2UgZmluZCB0aGUgbmV4dCBpZGVudC4gSWYgZm91bmQsIGNvcHkgaXQgdG8gdGhlIGhlYWRlciBidWZmZXIKKyAqCisgKiBAcGFyYW1bb3V0XSBoZWFkZXIgd2hlcmUgdG8gY29weSB0aGUgaWRlbnQgdG8KKyAqIEByZXR1cm4gMCBpZiBhbiBpZGVudCB3YXMgZm91bmQsIDwgMCBvbiBJL08gZXJyb3IKKyAqLworc3RhdGljIGludCBseGZfc3luYyhBVkZvcm1hdENvbnRleHQgKnMsIHVpbnQ4X3QgKmhlYWRlcikKK3sKKyAgICB1aW50OF90IGJ1ZltMWEZfSURFTlRfTEVOR1RIXTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBhdmlvX3JlYWQocy0+cGIsIGJ1ZiwgTFhGX0lERU5UX0xFTkdUSCkpICE9IExYRl9JREVOVF9MRU5HVEgpCisgICAgICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogQVZFUlJPUl9FT0Y7CisKKyAgICB3aGlsZSAobWVtY21wKGJ1ZiwgTFhGX0lERU5ULCBMWEZfSURFTlRfTEVOR1RIKSkgeworICAgICAgICBpZiAoYXZpb19mZW9mKHMtPnBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgICAgICBtZW1tb3ZlKGJ1ZiwgJmJ1ZlsxXSwgTFhGX0lERU5UX0xFTkdUSC0xKTsKKyAgICAgICAgYnVmW0xYRl9JREVOVF9MRU5HVEgtMV0gPSBhdmlvX3I4KHMtPnBiKTsKKyAgICB9CisKKyAgICBtZW1jcHkoaGVhZGVyLCBMWEZfSURFTlQsIExYRl9JREVOVF9MRU5HVEgpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZCBhbmQgY2hlY2tzdW0gdGhlIG5leHQgcGFja2V0IGhlYWRlcgorICoKKyAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBheWxvYWQgZm9sbG93aW5nIHRoZSBoZWFkZXIgb3IgPCAwIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBnZXRfcGFja2V0X2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTFhGRGVtdXhDb250ZXh0ICpseGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgICAqcGIgID0gcy0+cGI7CisgICAgaW50IHRyYWNrX3NpemUsIHNhbXBsZXMsIHJldDsKKyAgICB1aW50MzJfdCB2ZXJzaW9uLCBhdWRpb19mb3JtYXQsIGhlYWRlcl9zaXplLCBjaGFubmVscywgdG1wOworICAgIEFWU3RyZWFtICpzdDsKKyAgICB1aW50OF90IGhlYWRlcltMWEZfTUFYX1BBQ0tFVF9IRUFERVJfU0laRV07CisgICAgY29uc3QgdWludDhfdCAqcCA9IGhlYWRlciArIExYRl9JREVOVF9MRU5HVEg7CisKKyAgICAvL2ZpbmQgYW5kIHJlYWQgdGhlIGlkZW50CisgICAgaWYgKChyZXQgPSBseGZfc3luYyhzLCBoZWFkZXIpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBhdmlvX3JlYWQocGIsIGhlYWRlciArIExYRl9JREVOVF9MRU5HVEgsIDgpOworICAgIGlmIChyZXQgIT0gOCkKKyAgICAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiBBVkVSUk9SX0VPRjsKKworICAgIHZlcnNpb24gICAgID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcCk7CisgICAgaGVhZGVyX3NpemUgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZwKTsKKyAgICBpZiAodmVyc2lvbiA+IDEpCisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiVW5rbm93biBmb3JtYXQgdmVyc2lvbiAlIlBSSXUzMiJcbiIsIHZlcnNpb24pOworCisgICAgaWYgKGhlYWRlcl9zaXplIDwgKHZlcnNpb24gPyA3MiA6IDYwKSB8fAorICAgICAgICBoZWFkZXJfc2l6ZSA+IExYRl9NQVhfUEFDS0VUX0hFQURFUl9TSVpFIHx8CisgICAgICAgIChoZWFkZXJfc2l6ZSAmIDMpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGhlYWRlciBzaXplIDB4JSJQUkl4MzIiXG4iLCBoZWFkZXJfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8vcmVhZCB0aGUgcmVzdCBvZiB0aGUgcGFja2V0IGhlYWRlcgorICAgIGlmICgocmV0ID0gYXZpb19yZWFkKHBiLCBoZWFkZXIgKyAocCAtIGhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9zaXplIC0gKHAgLSBoZWFkZXIpKSkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX3NpemUgLSAocCAtIGhlYWRlcikpCisgICAgICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogQVZFUlJPUl9FT0Y7CisKKyAgICBpZiAoY2hlY2tfY2hlY2tzdW0oaGVhZGVyLCBoZWFkZXJfc2l6ZSkpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjaGVja3N1bSBlcnJvclxuIik7CisKKyAgICBseGYtPnBhY2tldF90eXBlID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcCk7CisgICAgcCArPSB2ZXJzaW9uID8gMjAgOiAxMjsKKworICAgIGx4Zi0+ZXh0ZW5kZWRfc2l6ZSA9IDA7CisgICAgc3dpdGNoIChseGYtPnBhY2tldF90eXBlKSB7CisgICAgY2FzZSAwOgorICAgICAgICAvL3ZpZGVvCisgICAgICAgIGx4Zi0+dmlkZW9fZm9ybWF0ID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcCk7CisgICAgICAgIHJldCAgICAgICAgICAgICAgID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcCk7CisgICAgICAgIC8vc2tpcCBWQkkgZGF0YSBhbmQgbWV0YWRhdGEKKyAgICAgICAgYXZpb19za2lwKHBiLCAoaW50NjRfdCkodWludDMyX3QpQVZfUkwzMihwICsgNCkgKworICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KSh1aW50MzJfdClBVl9STDMyKHAgKyAxMikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIC8vYXVkaW8KKyAgICAgICAgaWYgKHMtPm5iX3N0cmVhbXMgPCAyKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJnb3QgYXVkaW8gcGFja2V0LCBidXQgbm8gYXVkaW8gc3RyZWFtIHByZXNlbnRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmVyc2lvbiA9PSAwKQorICAgICAgICAgICAgcCArPSA4OworICAgICAgICBhdWRpb19mb3JtYXQgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZwKTsKKyAgICAgICAgY2hhbm5lbHMgICAgID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcCk7CisgICAgICAgIHRyYWNrX3NpemUgICA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJnApOworCisgICAgICAgIHN0ID0gcy0+c3RyZWFtc1sxXTsKKworICAgICAgICAvL3NldCBjb2RlYyBiYXNlZCBvbiBzcGVjaWZpZWQgYXVkaW8gYml0ZGVwdGgKKyAgICAgICAgLy93ZSBvbmx5IHN1cHBvcnQgdGlnaHRseSBwYWNrZWQgMTYtLCAyMC0sIDI0LSBhbmQgMzItYml0IFBDTSBhdCB0aGUgbW9tZW50CisgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gKGF1ZGlvX2Zvcm1hdCA+PiA2KSAmIDB4M0Y7CisKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICE9IChhdWRpb19mb3JtYXQgJiAweDNGKSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAib25seSB0aWdodGx5IHBhY2tlZCBQQ00gY3VycmVudGx5IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSB7CisgICAgICAgIGNhc2UgMTY6IHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEVfUExBTkFSOyBicmVhazsKKyAgICAgICAgY2FzZSAyMDogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9MWEY7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjQ6IHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzI0TEVfUExBTkFSOyBicmVhazsKKyAgICAgICAgY2FzZSAzMjogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMzJMRV9QTEFOQVI7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJvbmx5IDE2LSwgMjAtLCAyNC0gYW5kIDMyLWJpdCBQQ00gY3VycmVudGx5IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKworICAgICAgICBzYW1wbGVzID0gdHJhY2tfc2l6ZSAqIDggLyBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKworICAgICAgICAvL3VzZSBhdWRpbyBwYWNrZXQgc2l6ZSB0byBkZXRlcm1pbmUgdmlkZW8gc3RhbmRhcmQKKyAgICAgICAgLy9mb3IgTlRTQyB3ZSBoYXZlIG9uZSA4MDA4LXNhbXBsZSBhdWRpbyBmcmFtZSBwZXIgZml2ZSB2aWRlbyBmcmFtZXMKKyAgICAgICAgaWYgKHNhbXBsZXMgPT0gTFhGX1NBTVBMRVJBVEUgKiA1MDA1IC8gMzAwMDApIHsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1swXSwgNjQsIDEwMDEsIDMwMDAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vYXNzdW1lIFBBTCwgYnV0IHdhcm4gaWYgd2UgZG9uJ3QgaGF2ZSAxOTIwIHNhbXBsZXMKKyAgICAgICAgICAgIGlmIChzYW1wbGVzICE9IExYRl9TQU1QTEVSQVRFIC8gMjUpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8gZG9lc24ndCBzZWVtIHRvIGJlIFBBTCBvciBOVFNDLiBndWVzc2luZyBQQUxcbiIpOworCisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHMtPnN0cmVhbXNbMF0sIDY0LCAxLCAyNSk7CisgICAgICAgIH0KKworICAgICAgICAvL1RPRE86IHdhcm5pbmcgaWYgdHJhY2sgbWFzayAhPSAoMSA8PCBjaGFubmVscykgLSAxPworICAgICAgICByZXQgPSBhdl9wb3Bjb3VudChjaGFubmVscykgKiB0cmFja19zaXplOworCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRtcCA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJnApOworICAgICAgICByZXQgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZwKTsKKyAgICAgICAgaWYgKHRtcCA9PSAxKQorICAgICAgICAgICAgbHhmLT5leHRlbmRlZF9zaXplID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbHhmX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBMWEZEZW11eENvbnRleHQgKmx4ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAgICpwYiAgPSBzLT5wYjsKKyAgICB1aW50OF90IGhlYWRlcl9kYXRhW0xYRl9IRUFERVJfREFUQV9TSVpFXTsKKyAgICBpbnQgcmV0OworICAgIEFWU3RyZWFtICpzdDsKKyAgICB1aW50MzJfdCB2aWRlb19wYXJhbXMsIGRpc2tfcGFyYW1zOworICAgIHVpbnQxNl90IHJlY29yZF9kYXRlLCBleHBpcmF0aW9uX2RhdGU7CisKKyAgICBpZiAoKHJldCA9IGdldF9wYWNrZXRfaGVhZGVyKHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocmV0ICE9IExYRl9IRUFERVJfREFUQV9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJleHBlY3RlZCAlZCBCIHNpemUgaGVhZGVyLCBnb3QgJWRcbiIsCisgICAgICAgICAgICAgICBMWEZfSEVBREVSX0RBVEFfU0laRSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdmlvX3JlYWQocGIsIGhlYWRlcl9kYXRhLCBMWEZfSEVBREVSX0RBVEFfU0laRSkpICE9IExYRl9IRUFERVJfREFUQV9TSVpFKQorICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1JfRU9GOworCisgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICA9IEFWX1JMMzIoJmhlYWRlcl9kYXRhWzMyXSk7CisgICAgdmlkZW9fcGFyYW1zICAgICAgICAgID0gQVZfUkwzMigmaGVhZGVyX2RhdGFbNDBdKTsKKyAgICByZWNvcmRfZGF0ZSAgICAgICAgICAgPSBBVl9STDE2KCZoZWFkZXJfZGF0YVs1Nl0pOworICAgIGV4cGlyYXRpb25fZGF0ZSAgICAgICA9IEFWX1JMMTYoJmhlYWRlcl9kYXRhWzU4XSk7CisgICAgZGlza19wYXJhbXMgICAgICAgICAgID0gQVZfUkwzMigmaGVhZGVyX2RhdGFbMTE2XSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSAgID0gMTAwMDAwMCAqICgodmlkZW9fcGFyYW1zID4+IDE0KSAmIDB4RkYpOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IHZpZGVvX3BhcmFtcyAmIDB4RjsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQobHhmX3RhZ3MsIHN0LT5jb2RlYy0+Y29kZWNfdGFnKTsKKyAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOworCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInJlY29yZDogJXggPSAlaS0lMDJpLSUwMmlcbiIsCisgICAgICAgICAgIHJlY29yZF9kYXRlLCAxOTAwICsgKHJlY29yZF9kYXRlICYgMHg3RiksIChyZWNvcmRfZGF0ZSA+PiA3KSAmIDB4RiwKKyAgICAgICAgICAgKHJlY29yZF9kYXRlID4+IDExKSAmIDB4MUYpOworCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImV4cGlyZTogJXggPSAlaS0lMDJpLSUwMmlcbiIsCisgICAgICAgICAgIGV4cGlyYXRpb25fZGF0ZSwgMTkwMCArIChleHBpcmF0aW9uX2RhdGUgJiAweDdGKSwgKGV4cGlyYXRpb25fZGF0ZSA+PiA3KSAmIDB4RiwKKyAgICAgICAgICAgKGV4cGlyYXRpb25fZGF0ZSA+PiAxMSkgJiAweDFGKTsKKworICAgIGlmICgodmlkZW9fcGFyYW1zID4+IDIyKSAmIDEpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlZCSSBkYXRhIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKKworICAgIGlmICgobHhmLT5jaGFubmVscyA9IDEgPDwgKGRpc2tfcGFyYW1zID4+IDQgJiAzKSArIDEpKSB7CisgICAgICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBMWEZfU0FNUExFUkFURTsKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IGx4Zi0+Y2hhbm5lbHM7CisKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIH0KKworICAgIGF2aW9fc2tpcChzLT5wYiwgbHhmLT5leHRlbmRlZF9zaXplKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGx4Zl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTFhGRGVtdXhDb250ZXh0ICpseGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgICAqcGIgID0gcy0+cGI7CisgICAgdWludDMyX3Qgc3RyZWFtOworICAgIGludCByZXQsIHJldDI7CisKKyAgICBpZiAoKHJldCA9IGdldF9wYWNrZXRfaGVhZGVyKHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzdHJlYW0gPSBseGYtPnBhY2tldF90eXBlOworCisgICAgaWYgKHN0cmVhbSA+IDEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgImdvdCBwYWNrZXQgd2l0aCBpbGxlZ2FsIHN0cmVhbSBpbmRleCAlIlBSSXUzMiJcbiIsIHN0cmVhbSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgfQorCisgICAgaWYgKHN0cmVhbSA9PSAxICYmIHMtPm5iX3N0cmVhbXMgPCAyKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJnb3QgYXVkaW8gcGFja2V0IHdpdGhvdXQgaGF2aW5nIGFuIGF1ZGlvIHN0cmVhbVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0MiA9IGF2X25ld19wYWNrZXQocGt0LCByZXQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQyOworCisgICAgaWYgKChyZXQyID0gYXZpb19yZWFkKHBiLCBwa3QtPmRhdGEsIHJldCkpICE9IHJldCkgeworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gcmV0MiA8IDAgPyByZXQyIDogQVZFUlJPUl9FT0Y7CisgICAgfQorCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdHJlYW07CisKKyAgICBpZiAoIXN0cmVhbSkgeworICAgICAgICAvL3BpY3R1cmUgdHlwZSAoMCA9IGNsb3NlZCBJLCAxID0gb3BlbiBJLCAyID0gUCwgMyA9IEIpCisgICAgICAgIGlmICgoKGx4Zi0+dmlkZW9fZm9ybWF0ID4+IDIyKSAmIDB4MykgPCAyKQorICAgICAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICAgICAgcGt0LT5kdHMgPSBseGYtPmZyYW1lX251bWJlcisrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbHhmX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImx4ZiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZSIG5hdGl2ZSBzdHJlYW0gKExYRikiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTFhGRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBseGZfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gbHhmX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGx4Zl9yZWFkX3BhY2tldCwKKyAgICAuY29kZWNfdGFnICAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyogY29uc3QgW10pe2x4Zl90YWdzLCAwfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbTR2ZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbTR2ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlZTUzMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tNHZkZWMuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogUkFXIE1QRUctNCB2aWRlbyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIFRoaWpzIFZlcm1laXIgPHRoaWpzLnZlcm1laXJAYmFyY28uY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJyYXdkZWMuaCIKKworI2RlZmluZSBWSVNVQUxfT0JKRUNUX1NUQVJUX0NPREUgICAgICAgMHgwMDAwMDFiNQorI2RlZmluZSBWT1BfU1RBUlRfQ09ERSAgICAgICAgICAgICAgICAgMHgwMDAwMDFiNgorCitzdGF0aWMgaW50IG1wZWc0dmlkZW9fcHJvYmUoQVZQcm9iZURhdGEgKnByb2JlX3BhY2tldCkKK3sKKyAgICB1aW50MzJfdCB0ZW1wX2J1ZmZlciA9IC0xOworICAgIGludCBWTyA9IDAsIFZPTCA9IDAsIFZPUCA9IDAsIFZJU08gPSAwLCByZXMgPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHByb2JlX3BhY2tldC0+YnVmX3NpemU7IGkrKykgeworICAgICAgICB0ZW1wX2J1ZmZlciA9ICh0ZW1wX2J1ZmZlciA8PCA4KSArIHByb2JlX3BhY2tldC0+YnVmW2ldOworICAgICAgICBpZiAodGVtcF9idWZmZXIgJiAweGZmZmZmZTAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICh0ZW1wX2J1ZmZlciA8IDIpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAodGVtcF9idWZmZXIgPT0gVk9QX1NUQVJUX0NPREUpCisgICAgICAgICAgICBWT1ArKzsKKyAgICAgICAgZWxzZSBpZiAodGVtcF9idWZmZXIgPT0gVklTVUFMX09CSkVDVF9TVEFSVF9DT0RFKQorICAgICAgICAgICAgVklTTysrOworICAgICAgICBlbHNlIGlmICh0ZW1wX2J1ZmZlciA+PSAweDEwMCAmJiB0ZW1wX2J1ZmZlciA8IDB4MTIwKQorICAgICAgICAgICAgVk8rKzsKKyAgICAgICAgZWxzZSBpZiAodGVtcF9idWZmZXIgPj0gMHgxMjAgJiYgdGVtcF9idWZmZXIgPCAweDEzMCkKKyAgICAgICAgICAgIFZPTCsrOworICAgICAgICBlbHNlIGlmICghKDB4MUFGIDwgdGVtcF9idWZmZXIgJiYgdGVtcF9idWZmZXIgPCAweDFCNykgJiYKKyAgICAgICAgICAgICAgICAgISgweDFCOSA8IHRlbXBfYnVmZmVyICYmIHRlbXBfYnVmZmVyIDwgMHgxQzQpKQorICAgICAgICAgICAgcmVzKys7CisgICAgfQorCisgICAgaWYgKFZPUCA+PSBWSVNPICYmIFZPUCA+PSBWT0wgJiYgVk8gPj0gVk9MICYmIFZPTCA+IDAgJiYgcmVzID09IDApCisgICAgICAgIHJldHVybiBWT1ArVk8gPiA0ID8gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gOiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTi8yOworICAgIHJldHVybiAwOworfQorCitGRl9ERUZfUkFXVklERU9fREVNVVhFUjIobTR2LCAicmF3IE1QRUctNCB2aWRlbyIsIG1wZWc0dmlkZW9fcHJvYmUsICJtNHYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0lEX01QRUc0LCBBVkZNVF9HRU5FUklDX0lOREVYIHwgQVZGTVRfVFNfRElTQ09OVCkKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tYXRyb3NrYS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21hdHJvc2thLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1MDA3YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tYXRyb3NrYS5jCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogTWF0cm9za2EgY29tbW9uIGRhdGEKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3N0ZXJlbzNkLmgiCisKKyNpbmNsdWRlICJtYXRyb3NrYS5oIgorCisvKiBJZiB5b3UgYWRkIGEgdGFnIGhlcmUgdGhhdCBpcyBub3QgaW4gZmZfY29kZWNfYm1wX3RhZ3NbXQorICAgb3IgZmZfY29kZWNfd2F2X3RhZ3NbXSwgYWRkIGl0IGFsc28gdG8gYWRkaXRpb25hbF9hdWRpb190YWdzW10KKyAgIG9yIGFkZGl0aW9uYWxfdmlkZW9fdGFnc1tdIGluIG1hdHJvc2thZW5jLmMgKi8KK2NvbnN0IENvZGVjVGFncyBmZl9ta3ZfY29kZWNfdGFnc1tdPXsKKyAgICB7IkFfQUFDIiAgICAgICAgICAgICwgQVZfQ09ERUNfSURfQUFDfSwKKyAgICB7IkFfQUMzIiAgICAgICAgICAgICwgQVZfQ09ERUNfSURfQUMzfSwKKyAgICB7IkFfQUxBQyIgICAgICAgICAgICwgQVZfQ09ERUNfSURfQUxBQ30sCisgICAgeyJBX0RUUyIgICAgICAgICAgICAsIEFWX0NPREVDX0lEX0RUU30sCisgICAgeyJBX0VBQzMiICAgICAgICAgICAsIEFWX0NPREVDX0lEX0VBQzN9LAorICAgIHsiQV9GTEFDIiAgICAgICAgICAgLCBBVl9DT0RFQ19JRF9GTEFDfSwKKyAgICB7IkFfTUxQIiAgICAgICAgICAgICwgQVZfQ09ERUNfSURfTUxQfSwKKyAgICB7IkFfTVBFRy9MMiIgICAgICAgICwgQVZfQ09ERUNfSURfTVAyfSwKKyAgICB7IkFfTVBFRy9MMSIgICAgICAgICwgQVZfQ09ERUNfSURfTVAyfSwKKyAgICB7IkFfTVBFRy9MMyIgICAgICAgICwgQVZfQ09ERUNfSURfTVAzfSwKKyAgICB7IkFfT1BVUyIgICAgICAgICAgICwgQVZfQ09ERUNfSURfT1BVU30sCisgICAgeyJBX09QVVMvRVhQRVJJTUVOVEFMIixBVl9DT0RFQ19JRF9PUFVTfSwKKyAgICB7IkFfUENNL0ZMT0FUL0lFRUUiICwgQVZfQ09ERUNfSURfUENNX0YzMkxFfSwKKyAgICB7IkFfUENNL0ZMT0FUL0lFRUUiICwgQVZfQ09ERUNfSURfUENNX0Y2NExFfSwKKyAgICB7IkFfUENNL0lOVC9CSUciICAgICwgQVZfQ09ERUNfSURfUENNX1MxNkJFfSwKKyAgICB7IkFfUENNL0lOVC9CSUciICAgICwgQVZfQ09ERUNfSURfUENNX1MyNEJFfSwKKyAgICB7IkFfUENNL0lOVC9CSUciICAgICwgQVZfQ09ERUNfSURfUENNX1MzMkJFfSwKKyAgICB7IkFfUENNL0lOVC9MSVQiICAgICwgQVZfQ09ERUNfSURfUENNX1MxNkxFfSwKKyAgICB7IkFfUENNL0lOVC9MSVQiICAgICwgQVZfQ09ERUNfSURfUENNX1MyNExFfSwKKyAgICB7IkFfUENNL0lOVC9MSVQiICAgICwgQVZfQ09ERUNfSURfUENNX1MzMkxFfSwKKyAgICB7IkFfUENNL0lOVC9MSVQiICAgICwgQVZfQ09ERUNfSURfUENNX1U4fSwKKyAgICB7IkFfUVVJQ0tUSU1FL1FETTIiICwgQVZfQ09ERUNfSURfUURNMn0sCisgICAgeyJBX1JFQUwvMTRfNCIgICAgICAsIEFWX0NPREVDX0lEX1JBXzE0NH0sCisgICAgeyJBX1JFQUwvMjhfOCIgICAgICAsIEFWX0NPREVDX0lEX1JBXzI4OH0sCisgICAgeyJBX1JFQUwvQVRSQyIgICAgICAsIEFWX0NPREVDX0lEX0FUUkFDM30sCisgICAgeyJBX1JFQUwvQ09PSyIgICAgICAsIEFWX0NPREVDX0lEX0NPT0t9LAorICAgIHsiQV9SRUFML1NJUFIiICAgICAgLCBBVl9DT0RFQ19JRF9TSVBSfSwKKyAgICB7IkFfVFJVRUhEIiAgICAgICAgICwgQVZfQ09ERUNfSURfVFJVRUhEfSwKKyAgICB7IkFfVFRBMSIgICAgICAgICAgICwgQVZfQ09ERUNfSURfVFRBfSwKKyAgICB7IkFfVk9SQklTIiAgICAgICAgICwgQVZfQ09ERUNfSURfVk9SQklTfSwKKyAgICB7IkFfV0FWUEFDSzQiICAgICAgICwgQVZfQ09ERUNfSURfV0FWUEFDS30sCisKKyAgICB7IkRfV0VCVlRUL1NVQlRJVExFUyIgICAsIEFWX0NPREVDX0lEX1dFQlZUVH0sCisgICAgeyJEX1dFQlZUVC9DQVBUSU9OUyIgICAgLCBBVl9DT0RFQ19JRF9XRUJWVFR9LAorICAgIHsiRF9XRUJWVFQvREVTQ1JJUFRJT05TIiwgQVZfQ09ERUNfSURfV0VCVlRUfSwKKyAgICB7IkRfV0VCVlRUL01FVEFEQVRBIiAgICAsIEFWX0NPREVDX0lEX1dFQlZUVH0sCisKKyAgICB7IlNfVEVYVC9VVEY4IiAgICAgICwgQVZfQ09ERUNfSURfU1VCUklQfSwKKyAgICB7IlNfVEVYVC9VVEY4IiAgICAgICwgQVZfQ09ERUNfSURfVEVYVH0sCisgICAgeyJTX1RFWFQvQVNDSUkiICAgICAsIEFWX0NPREVDX0lEX1RFWFR9LAorICAgIHsiU19URVhUL0FTUyIgICAgICAgLCBBVl9DT0RFQ19JRF9BU1N9LAorICAgIHsiU19URVhUL1NTQSIgICAgICAgLCBBVl9DT0RFQ19JRF9BU1N9LAorICAgIHsiU19BU1MiICAgICAgICAgICAgLCBBVl9DT0RFQ19JRF9BU1N9LAorICAgIHsiU19TU0EiICAgICAgICAgICAgLCBBVl9DT0RFQ19JRF9BU1N9LAorICAgIHsiU19WT0JTVUIiICAgICAgICAgLCBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEV9LAorICAgIHsiU19EVkJTVUIiICAgICAgICAgLCBBVl9DT0RFQ19JRF9EVkJfU1VCVElUTEV9LAorICAgIHsiU19IRE1WL1BHUyIgICAgICAgLCBBVl9DT0RFQ19JRF9IRE1WX1BHU19TVUJUSVRMRX0sCisKKyAgICB7IlZfRElSQUMiICAgICAgICAgICwgQVZfQ09ERUNfSURfRElSQUN9LAorICAgIHsiVl9NSlBFRyIgICAgICAgICAgLCBBVl9DT0RFQ19JRF9NSlBFR30sCisgICAgeyJWX01QRUcxIiAgICAgICAgICAsIEFWX0NPREVDX0lEX01QRUcxVklERU99LAorICAgIHsiVl9NUEVHMiIgICAgICAgICAgLCBBVl9DT0RFQ19JRF9NUEVHMlZJREVPfSwKKyAgICB7IlZfTVBFRzQvSVNPL0FTUCIgICwgQVZfQ09ERUNfSURfTVBFRzR9LAorICAgIHsiVl9NUEVHNC9JU08vQVAiICAgLCBBVl9DT0RFQ19JRF9NUEVHNH0sCisgICAgeyJWX01QRUc0L0lTTy9TUCIgICAsIEFWX0NPREVDX0lEX01QRUc0fSwKKyAgICB7IlZfTVBFRzQvSVNPL0FWQyIgICwgQVZfQ09ERUNfSURfSDI2NH0sCisgICAgeyJWX01QRUdIL0lTTy9IRVZDIiAsIEFWX0NPREVDX0lEX0hFVkN9LAorICAgIHsiVl9NUEVHNC9NUy9WMyIgICAgLCBBVl9DT0RFQ19JRF9NU01QRUc0VjN9LAorICAgIHsiVl9QUk9SRVMiICAgICAgICAgLCBBVl9DT0RFQ19JRF9QUk9SRVN9LAorICAgIHsiVl9SRUFML1JWMTAiICAgICAgLCBBVl9DT0RFQ19JRF9SVjEwfSwKKyAgICB7IlZfUkVBTC9SVjIwIiAgICAgICwgQVZfQ09ERUNfSURfUlYyMH0sCisgICAgeyJWX1JFQUwvUlYzMCIgICAgICAsIEFWX0NPREVDX0lEX1JWMzB9LAorICAgIHsiVl9SRUFML1JWNDAiICAgICAgLCBBVl9DT0RFQ19JRF9SVjQwfSwKKyAgICB7IlZfU05PVyIgICAgICAgICAgICwgQVZfQ09ERUNfSURfU05PV30sCisgICAgeyJWX1RIRU9SQSIgICAgICAgICAsIEFWX0NPREVDX0lEX1RIRU9SQX0sCisgICAgeyJWX1VOQ09NUFJFU1NFRCIgICAsIEFWX0NPREVDX0lEX1JBV1ZJREVPfSwKKyAgICB7IlZfVlA4IiAgICAgICAgICAgICwgQVZfQ09ERUNfSURfVlA4fSwKKyAgICB7IlZfVlA5IiAgICAgICAgICAgICwgQVZfQ09ERUNfSURfVlA5fSwKKworICAgIHsiIiAgICAgICAgICAgICAgICAgLCBBVl9DT0RFQ19JRF9OT05FfQorfTsKKworY29uc3QgQ29kZWNNaW1lIGZmX21rdl9taW1lX3RhZ3NbXSA9IHsKKyAgICB7InRleHQvcGxhaW4iICAgICAgICAgICAgICAgICAsIEFWX0NPREVDX0lEX1RFWFR9LAorICAgIHsiaW1hZ2UvZ2lmIiAgICAgICAgICAgICAgICAgICwgQVZfQ09ERUNfSURfR0lGfSwKKyAgICB7ImltYWdlL2pwZWciICAgICAgICAgICAgICAgICAsIEFWX0NPREVDX0lEX01KUEVHfSwKKyAgICB7ImltYWdlL3BuZyIgICAgICAgICAgICAgICAgICAsIEFWX0NPREVDX0lEX1BOR30sCisgICAgeyJpbWFnZS90aWZmIiAgICAgICAgICAgICAgICAgLCBBVl9DT0RFQ19JRF9USUZGfSwKKyAgICB7ImFwcGxpY2F0aW9uL3gtdHJ1ZXR5cGUtZm9udCIsIEFWX0NPREVDX0lEX1RURn0sCisgICAgeyJhcHBsaWNhdGlvbi94LWZvbnQiICAgICAgICAgLCBBVl9DT0RFQ19JRF9UVEZ9LAorICAgIHsiYXBwbGljYXRpb24vdm5kLm1zLW9wZW50eXBlIiwgQVZfQ09ERUNfSURfT1RGfSwKKyAgICB7ImJpbmFyeSIgICAgICAgICAgICAgICAgICAgICAsIEFWX0NPREVDX0lEX0JJTl9EQVRBfSwKKworICAgIHsiIiAgICAgICAgICAgICAgICAgICAgICAgICAgICwgQVZfQ09ERUNfSURfTk9ORX0KK307CisKK2NvbnN0IEFWTWV0YWRhdGFDb252IGZmX21rdl9tZXRhZGF0YV9jb252W10gPSB7CisgICAgeyAiTEVBRF9QRVJGT1JNRVIiLCAicGVyZm9ybWVyIiB9LAorICAgIHsgIlBBUlRfTlVNQkVSIiAgICwgInRyYWNrIiAgfSwKKyAgICB7IDAgfQorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IGZmX21hdHJvc2thX3ZpZGVvX3N0ZXJlb19tb2RlW01BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9OQl0gPSB7CisgICAgIm1vbm8iLAorICAgICJsZWZ0X3JpZ2h0IiwKKyAgICAiYm90dG9tX3RvcCIsCisgICAgInRvcF9ib3R0b20iLAorICAgICJjaGVja2VyYm9hcmRfcmwiLAorICAgICJjaGVja2VyYm9hcmRfbHIiLAorICAgICJyb3dfaW50ZXJsZWF2ZWRfcmwiLAorICAgICJyb3dfaW50ZXJsZWF2ZWRfbHIiLAorICAgICJjb2xfaW50ZXJsZWF2ZWRfcmwiLAorICAgICJjb2xfaW50ZXJsZWF2ZWRfbHIiLAorICAgICJhbmFnbHlwaF9jeWFuX3JlZCIsCisgICAgInJpZ2h0X2xlZnQiLAorICAgICJhbmFnbHlwaF9ncmVlbl9tYWdlbnRhIiwKKyAgICAiYmxvY2tfbHIiLAorICAgICJibG9ja19ybCIsCit9OworCitjb25zdCBjaGFyICogY29uc3QgZmZfbWF0cm9za2FfdmlkZW9fc3RlcmVvX3BsYW5lW01BVFJPU0tBX1ZJREVPX1NURVJFT19QTEFORV9DT1VOVF0gPSB7CisgICAgImxlZnQiLAorICAgICJyaWdodCIsCisgICAgImJhY2tncm91bmQiLAorfTsKKworaW50IGZmX21rdl9zdGVyZW8zZF9jb252KEFWU3RyZWFtICpzdCwgTWF0cm9za2FWaWRlb1N0ZXJlb01vZGVUeXBlIHN0ZXJlb19tb2RlKQoreworICAgIEFWUGFja2V0U2lkZURhdGEgKnNkLCAqdG1wOworICAgIEFWU3RlcmVvM0QgKnN0ZXJlbzsKKworICAgIHN0ZXJlbyA9IGF2X3N0ZXJlbzNkX2FsbG9jKCk7CisgICAgaWYgKCFzdGVyZW8pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB0bXAgPSBhdl9yZWFsbG9jX2FycmF5KHN0LT5zaWRlX2RhdGEsIHN0LT5uYl9zaWRlX2RhdGEgKyAxLCBzaXplb2YoKnRtcCkpOworICAgIGlmICghdG1wKSB7CisgICAgICAgIGF2X2ZyZWVwKCZzdGVyZW8pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBzdC0+c2lkZV9kYXRhID0gdG1wOworICAgIHN0LT5uYl9zaWRlX2RhdGErKzsKKworICAgIHNkID0gJnN0LT5zaWRlX2RhdGFbc3QtPm5iX3NpZGVfZGF0YSAtIDFdOworICAgIHNkLT50eXBlID0gQVZfUEtUX0RBVEFfU1RFUkVPM0Q7CisgICAgc2QtPmRhdGEgPSAodWludDhfdCAqKXN0ZXJlbzsKKyAgICBzZC0+c2l6ZSA9IHNpemVvZigqc3RlcmVvKTsKKworICAgIC8vIG5vdGU6IHRoZSBtaXNzaW5nIGJyZWFrcyBhcmUgaW50ZW50aW9uYWwKKyAgICBzd2l0Y2ggKHN0ZXJlb19tb2RlKSB7CisgICAgY2FzZSBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfTU9OTzoKKyAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfMkQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX1JJR0hUX0xFRlQ6CisgICAgICAgIHN0ZXJlby0+ZmxhZ3MgfD0gQVZfU1RFUkVPM0RfRkxBR19JTlZFUlQ7CisgICAgY2FzZSBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfTEVGVF9SSUdIVDoKKyAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfU0lERUJZU0lERTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfQk9UVE9NX1RPUDoKKyAgICAgICAgc3RlcmVvLT5mbGFncyB8PSBBVl9TVEVSRU8zRF9GTEFHX0lOVkVSVDsKKyAgICBjYXNlIE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9UT1BfQk9UVE9NOgorICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF9UT1BCT1RUT007CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX0NIRUNLRVJCT0FSRF9STDoKKyAgICAgICAgc3RlcmVvLT5mbGFncyB8PSBBVl9TVEVSRU8zRF9GTEFHX0lOVkVSVDsKKyAgICBjYXNlIE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9DSEVDS0VSQk9BUkRfTFI6CisgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX0NIRUNLRVJCT0FSRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfUk9XX0lOVEVSTEVBVkVEX1JMOgorICAgICAgICBzdGVyZW8tPmZsYWdzIHw9IEFWX1NURVJFTzNEX0ZMQUdfSU5WRVJUOworICAgIGNhc2UgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX1JPV19JTlRFUkxFQVZFRF9MUjoKKyAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfTElORVM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX0NPTF9JTlRFUkxFQVZFRF9STDoKKyAgICAgICAgc3RlcmVvLT5mbGFncyB8PSBBVl9TVEVSRU8zRF9GTEFHX0lOVkVSVDsKKyAgICBjYXNlIE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9DT0xfSU5URVJMRUFWRURfTFI6CisgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX0NPTFVNTlM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX0JPVEhfRVlFU19CTE9DS19STDoKKyAgICAgICAgc3RlcmVvLT5mbGFncyB8PSBBVl9TVEVSRU8zRF9GTEFHX0lOVkVSVDsKKyAgICBjYXNlIE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9CT1RIX0VZRVNfQkxPQ0tfTFI6CisgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX0ZSQU1FU0VRVUVOQ0U7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L21hdHJvc2thLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvbWF0cm9za2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTFjNTZjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21hdHJvc2thLmgKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBNYXRyb3NrYSBjb25zdGFudHMKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX01BVFJPU0tBX0gKKyNkZWZpbmUgQVZGT1JNQVRfTUFUUk9TS0FfSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKiBFQk1MIHZlcnNpb24gc3VwcG9ydGVkICovCisjZGVmaW5lIEVCTUxfVkVSU0lPTiAxCisKKy8qIHRvcC1sZXZlbCBtYXN0ZXItSURzICovCisjZGVmaW5lIEVCTUxfSURfSEVBREVSICAgICAgICAgICAgIDB4MUE0NURGQTMKKworLyogSURzIGluIHRoZSBIRUFERVIgbWFzdGVyICovCisjZGVmaW5lIEVCTUxfSURfRUJNTFZFUlNJT04gICAgICAgIDB4NDI4NgorI2RlZmluZSBFQk1MX0lEX0VCTUxSRUFEVkVSU0lPTiAgICAweDQyRjcKKyNkZWZpbmUgRUJNTF9JRF9FQk1MTUFYSURMRU5HVEggICAgMHg0MkYyCisjZGVmaW5lIEVCTUxfSURfRUJNTE1BWFNJWkVMRU5HVEggIDB4NDJGMworI2RlZmluZSBFQk1MX0lEX0RPQ1RZUEUgICAgICAgICAgICAweDQyODIKKyNkZWZpbmUgRUJNTF9JRF9ET0NUWVBFVkVSU0lPTiAgICAgMHg0Mjg3CisjZGVmaW5lIEVCTUxfSURfRE9DVFlQRVJFQURWRVJTSU9OIDB4NDI4NQorCisvKiBnZW5lcmFsIEVCTUwgdHlwZXMgKi8KKyNkZWZpbmUgRUJNTF9JRF9WT0lEICAgICAgICAgICAgICAgMHhFQworI2RlZmluZSBFQk1MX0lEX0NSQzMyICAgICAgICAgICAgICAweEJGCisKKy8qCisgKiBNYXRyb3NrYSBlbGVtZW50IElEcywgbWF4LiAzMiBiaXRzCisgKi8KKworLyogdG9wbGV2ZWwgc2VnbWVudCAqLworI2RlZmluZSBNQVRST1NLQV9JRF9TRUdNRU5UICAgIDB4MTg1MzgwNjcKKworLyogTWF0cm9za2EgdG9wLWxldmVsIG1hc3RlciBJRHMgKi8KKyNkZWZpbmUgTUFUUk9TS0FfSURfSU5GTyAgICAgICAweDE1NDlBOTY2CisjZGVmaW5lIE1BVFJPU0tBX0lEX1RSQUNLUyAgICAgMHgxNjU0QUU2QgorI2RlZmluZSBNQVRST1NLQV9JRF9DVUVTICAgICAgIDB4MUM1M0JCNkIKKyNkZWZpbmUgTUFUUk9TS0FfSURfVEFHUyAgICAgICAweDEyNTRDMzY3CisjZGVmaW5lIE1BVFJPU0tBX0lEX1NFRUtIRUFEICAgMHgxMTREOUI3NAorI2RlZmluZSBNQVRST1NLQV9JRF9BVFRBQ0hNRU5UUyAweDE5NDFBNDY5CisjZGVmaW5lIE1BVFJPU0tBX0lEX0NMVVNURVIgICAgMHgxRjQzQjY3NQorI2RlZmluZSBNQVRST1NLQV9JRF9DSEFQVEVSUyAgIDB4MTA0M0E3NzAKKworLyogSURzIGluIHRoZSBpbmZvIG1hc3RlciAqLworI2RlZmluZSBNQVRST1NLQV9JRF9USU1FQ09ERVNDQUxFIDB4MkFEN0IxCisjZGVmaW5lIE1BVFJPU0tBX0lEX0RVUkFUSU9OICAgMHg0NDg5CisjZGVmaW5lIE1BVFJPU0tBX0lEX1RJVExFICAgICAgMHg3QkE5CisjZGVmaW5lIE1BVFJPU0tBX0lEX1dSSVRJTkdBUFAgMHg1NzQxCisjZGVmaW5lIE1BVFJPU0tBX0lEX01VWElOR0FQUCAgMHg0RDgwCisjZGVmaW5lIE1BVFJPU0tBX0lEX0RBVEVVVEMgICAgMHg0NDYxCisjZGVmaW5lIE1BVFJPU0tBX0lEX1NFR01FTlRVSUQgMHg3M0E0CisKKy8qIElEIGluIHRoZSB0cmFja3MgbWFzdGVyICovCisjZGVmaW5lIE1BVFJPU0tBX0lEX1RSQUNLRU5UUlkgMHhBRQorCisvKiBJRHMgaW4gdGhlIHRyYWNrZW50cnkgbWFzdGVyICovCisjZGVmaW5lIE1BVFJPU0tBX0lEX1RSQUNLTlVNQkVSIDB4RDcKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tVSUQgICAweDczQzUKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tUWVBFICAweDgzCisjZGVmaW5lIE1BVFJPU0tBX0lEX1RSQUNLVklERU8gICAgIDB4RTAKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tBVURJTyAgICAgMHhFMQorI2RlZmluZSBNQVRST1NLQV9JRF9UUkFDS09QRVJBVElPTiAweEUyCisjZGVmaW5lIE1BVFJPU0tBX0lEX1RSQUNLQ09NQklORVBMQU5FUyAweEUzCisjZGVmaW5lIE1BVFJPU0tBX0lEX1RSQUNLUExBTkUgICAgICAgICAweEU0CisjZGVmaW5lIE1BVFJPU0tBX0lEX1RSQUNLUExBTkVVSUQgICAgICAweEU1CisjZGVmaW5lIE1BVFJPU0tBX0lEX1RSQUNLUExBTkVUWVBFICAgICAweEU2CisjZGVmaW5lIE1BVFJPU0tBX0lEX0NPREVDSUQgICAgMHg4NgorI2RlZmluZSBNQVRST1NLQV9JRF9DT0RFQ1BSSVZBVEUgMHg2M0EyCisjZGVmaW5lIE1BVFJPU0tBX0lEX0NPREVDTkFNRSAgMHgyNTg2ODgKKyNkZWZpbmUgTUFUUk9TS0FfSURfQ09ERUNJTkZPVVJMIDB4M0I0MDQwCisjZGVmaW5lIE1BVFJPU0tBX0lEX0NPREVDRE9XTkxPQURVUkwgMHgyNkIyNDAKKyNkZWZpbmUgTUFUUk9TS0FfSURfQ09ERUNERUNPREVBTEwgMHhBQQorI2RlZmluZSBNQVRST1NLQV9JRF9DT0RFQ0RFTEFZIDB4NTZBQQorI2RlZmluZSBNQVRST1NLQV9JRF9TRUVLUFJFUk9MTCAweDU2QkIKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tOQU1FICAweDUzNkUKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tMQU5HVUFHRSAweDIyQjU5QworI2RlZmluZSBNQVRST1NLQV9JRF9UUkFDS0ZMQUdFTkFCTEVEIDB4QjkKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tGTEFHREVGQVVMVCAweDg4CisjZGVmaW5lIE1BVFJPU0tBX0lEX1RSQUNLRkxBR0ZPUkNFRCAweDU1QUEKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tGTEFHTEFDSU5HIDB4OUMKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tNSU5DQUNIRSAweDZERTcKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tNQVhDQUNIRSAweDZERjgKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tERUZBVUxURFVSQVRJT04gMHgyM0UzODMKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tDT05URU5URU5DT0RJTkdTIDB4NkQ4MAorI2RlZmluZSBNQVRST1NLQV9JRF9UUkFDS0NPTlRFTlRFTkNPRElORyAweDYyNDAKKyNkZWZpbmUgTUFUUk9TS0FfSURfVFJBQ0tUSU1FQ09ERVNDQUxFIDB4MjMzMTRGCisjZGVmaW5lIE1BVFJPU0tBX0lEX1RSQUNLTUFYQkxLQURESUQgMHg1NUVFCisKKy8qIElEcyBpbiB0aGUgdHJhY2t2aWRlbyBtYXN0ZXIgKi8KKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9GUkFNRVJBVEUgMHgyMzgzRTMKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9ESVNQTEFZV0lEVEggMHg1NEIwCisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPRElTUExBWUhFSUdIVCAweDU0QkEKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9QSVhFTFdJRFRIIDB4QjAKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9QSVhFTEhFSUdIVCAweEJBCisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPUElYRUxDUk9QQiAweDU0QUEKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BUIDB4NTRCQgorI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUEwgMHg1NENDCisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPUElYRUxDUk9QUiAweDU0REQKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9ESVNQTEFZVU5JVCAweDU0QjIKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9GTEFHSU5URVJMQUNFRCAweDlBCisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPU1RFUkVPTU9ERSAweDUzQjgKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9BTFBIQU1PREUgMHg1M0MwCisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPQVNQRUNUUkFUSU8gMHg1NEIzCisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JTUEFDRSAweDJFQjUyNAorCisvKiBJRHMgaW4gdGhlIHRyYWNrYXVkaW8gbWFzdGVyICovCisjZGVmaW5lIE1BVFJPU0tBX0lEX0FVRElPU0FNUExJTkdGUkVRIDB4QjUKKyNkZWZpbmUgTUFUUk9TS0FfSURfQVVESU9PVVRTQU1QTElOR0ZSRVEgMHg3OEI1CisKKyNkZWZpbmUgTUFUUk9TS0FfSURfQVVESU9CSVRERVBUSCAweDYyNjQKKyNkZWZpbmUgTUFUUk9TS0FfSURfQVVESU9DSEFOTkVMUyAweDlGCisKKy8qIElEcyBpbiB0aGUgY29udGVudCBlbmNvZGluZyBtYXN0ZXIgKi8KKyNkZWZpbmUgTUFUUk9TS0FfSURfRU5DT0RJTkdPUkRFUiAweDUwMzEKKyNkZWZpbmUgTUFUUk9TS0FfSURfRU5DT0RJTkdTQ09QRSAweDUwMzIKKyNkZWZpbmUgTUFUUk9TS0FfSURfRU5DT0RJTkdUWVBFIDB4NTAzMworI2RlZmluZSBNQVRST1NLQV9JRF9FTkNPRElOR0NPTVBSRVNTSU9OIDB4NTAzNAorI2RlZmluZSBNQVRST1NLQV9JRF9FTkNPRElOR0NPTVBBTEdPIDB4NDI1NAorI2RlZmluZSBNQVRST1NLQV9JRF9FTkNPRElOR0NPTVBTRVRUSU5HUyAweDQyNTUKKworI2RlZmluZSBNQVRST1NLQV9JRF9FTkNPRElOR0VOQ1JZUFRJT04gMHg1MDM1CisjZGVmaW5lIE1BVFJPU0tBX0lEX0VOQ09ESU5HRU5DQUVTU0VUVElOR1MgMHg0N0U3CisjZGVmaW5lIE1BVFJPU0tBX0lEX0VOQ09ESU5HRU5DQUxHTyAweDQ3RTEKKyNkZWZpbmUgTUFUUk9TS0FfSURfRU5DT0RJTkdFTkNLRVlJRCAweDQ3RTIKKyNkZWZpbmUgTUFUUk9TS0FfSURfRU5DT0RJTkdTSUdBTEdPIDB4NDdFNQorI2RlZmluZSBNQVRST1NLQV9JRF9FTkNPRElOR1NJR0hBU0hBTEdPIDB4NDdFNgorI2RlZmluZSBNQVRST1NLQV9JRF9FTkNPRElOR1NJR0tFWUlEIDB4NDdFNAorI2RlZmluZSBNQVRST1NLQV9JRF9FTkNPRElOR1NJR05BVFVSRSAweDQ3RTMKKworLyogSUQgaW4gdGhlIGN1ZXMgbWFzdGVyICovCisjZGVmaW5lIE1BVFJPU0tBX0lEX1BPSU5URU5UUlkgMHhCQgorCisvKiBJRHMgaW4gdGhlIHBvaW50ZW50cnkgbWFzdGVyICovCisjZGVmaW5lIE1BVFJPU0tBX0lEX0NVRVRJTUUgICAgMHhCMworI2RlZmluZSBNQVRST1NLQV9JRF9DVUVUUkFDS1BPU0lUSU9OIDB4QjcKKworLyogSURzIGluIHRoZSBjdWV0cmFja3Bvc2l0aW9uIG1hc3RlciAqLworI2RlZmluZSBNQVRST1NLQV9JRF9DVUVUUkFDSyAgIDB4RjcKKyNkZWZpbmUgTUFUUk9TS0FfSURfQ1VFQ0xVU1RFUlBPU0lUSU9OIDB4RjEKKyNkZWZpbmUgTUFUUk9TS0FfSURfQ1VFUkVMQVRJVkVQT1NJVElPTiAweEYwCisjZGVmaW5lIE1BVFJPU0tBX0lEX0NVRURVUkFUSU9OIDB4QjIKKyNkZWZpbmUgTUFUUk9TS0FfSURfQ1VFQkxPQ0tOVU1CRVIgMHg1Mzc4CisKKy8qIElEcyBpbiB0aGUgdGFncyBtYXN0ZXIgKi8KKyNkZWZpbmUgTUFUUk9TS0FfSURfVEFHICAgICAgICAgICAgICAgICAweDczNzMKKyNkZWZpbmUgTUFUUk9TS0FfSURfU0lNUExFVEFHICAgICAgICAgICAweDY3QzgKKyNkZWZpbmUgTUFUUk9TS0FfSURfVEFHTkFNRSAgICAgICAgICAgICAweDQ1QTMKKyNkZWZpbmUgTUFUUk9TS0FfSURfVEFHU1RSSU5HICAgICAgICAgICAweDQ0ODcKKyNkZWZpbmUgTUFUUk9TS0FfSURfVEFHTEFORyAgICAgICAgICAgICAweDQ0N0EKKyNkZWZpbmUgTUFUUk9TS0FfSURfVEFHREVGQVVMVCAgICAgICAgICAweDQ0ODQKKyNkZWZpbmUgTUFUUk9TS0FfSURfVEFHREVGQVVMVF9CVUcgICAgICAweDQ0QjQKKyNkZWZpbmUgTUFUUk9TS0FfSURfVEFHVEFSR0VUUyAgICAgICAgICAweDYzQzAKKyNkZWZpbmUgTUFUUk9TS0FfSURfVEFHVEFSR0VUU19UWVBFICAgICAgIDB4NjNDQQorI2RlZmluZSBNQVRST1NLQV9JRF9UQUdUQVJHRVRTX1RZUEVWQUxVRSAgMHg2OENBCisjZGVmaW5lIE1BVFJPU0tBX0lEX1RBR1RBUkdFVFNfVFJBQ0tVSUQgICAweDYzQzUKKyNkZWZpbmUgTUFUUk9TS0FfSURfVEFHVEFSR0VUU19DSEFQVEVSVUlEIDB4NjNDNAorI2RlZmluZSBNQVRST1NLQV9JRF9UQUdUQVJHRVRTX0FUVEFDSFVJRCAgMHg2M0M2CisKKy8qIElEcyBpbiB0aGUgc2Vla2hlYWQgbWFzdGVyICovCisjZGVmaW5lIE1BVFJPU0tBX0lEX1NFRUtFTlRSWSAgMHg0REJCCisKKy8qIElEcyBpbiB0aGUgc2Vla3BvaW50IG1hc3RlciAqLworI2RlZmluZSBNQVRST1NLQV9JRF9TRUVLSUQgICAgIDB4NTNBQgorI2RlZmluZSBNQVRST1NLQV9JRF9TRUVLUE9TSVRJT04gMHg1M0FDCisKKy8qIElEcyBpbiB0aGUgY2x1c3RlciBtYXN0ZXIgKi8KKyNkZWZpbmUgTUFUUk9TS0FfSURfQ0xVU1RFUlRJTUVDT0RFIDB4RTcKKyNkZWZpbmUgTUFUUk9TS0FfSURfQ0xVU1RFUlBPU0lUSU9OIDB4QTcKKyNkZWZpbmUgTUFUUk9TS0FfSURfQ0xVU1RFUlBSRVZTSVpFIDB4QUIKKyNkZWZpbmUgTUFUUk9TS0FfSURfQkxPQ0tHUk9VUCAweEEwCisjZGVmaW5lIE1BVFJPU0tBX0lEX0JMT0NLQURESVRJT05TIDB4NzVBMQorI2RlZmluZSBNQVRST1NLQV9JRF9CTE9DS01PUkUgMHhBNgorI2RlZmluZSBNQVRST1NLQV9JRF9CTE9DS0FERElEIDB4RUUKKyNkZWZpbmUgTUFUUk9TS0FfSURfQkxPQ0tBRERJVElPTkFMIDB4QTUKKyNkZWZpbmUgTUFUUk9TS0FfSURfU0lNUExFQkxPQ0sgMHhBMworCisvKiBJRHMgaW4gdGhlIGJsb2NrZ3JvdXAgbWFzdGVyICovCisjZGVmaW5lIE1BVFJPU0tBX0lEX0JMT0NLICAgICAgMHhBMQorI2RlZmluZSBNQVRST1NLQV9JRF9CTE9DS0RVUkFUSU9OIDB4OUIKKyNkZWZpbmUgTUFUUk9TS0FfSURfQkxPQ0tSRUZFUkVOQ0UgMHhGQgorI2RlZmluZSBNQVRST1NLQV9JRF9DT0RFQ1NUQVRFIDB4QTQKKyNkZWZpbmUgTUFUUk9TS0FfSURfRElTQ0FSRFBBRERJTkcgMHg3NUEyCisKKy8qIElEcyBpbiB0aGUgYXR0YWNobWVudHMgbWFzdGVyICovCisjZGVmaW5lIE1BVFJPU0tBX0lEX0FUVEFDSEVERklMRSAgICAgICAgMHg2MUE3CisjZGVmaW5lIE1BVFJPU0tBX0lEX0ZJTEVERVNDICAgICAgICAgICAgMHg0NjdFCisjZGVmaW5lIE1BVFJPU0tBX0lEX0ZJTEVOQU1FICAgICAgICAgICAgMHg0NjZFCisjZGVmaW5lIE1BVFJPU0tBX0lEX0ZJTEVNSU1FVFlQRSAgICAgICAgMHg0NjYwCisjZGVmaW5lIE1BVFJPU0tBX0lEX0ZJTEVEQVRBICAgICAgICAgICAgMHg0NjVDCisjZGVmaW5lIE1BVFJPU0tBX0lEX0ZJTEVVSUQgICAgICAgICAgICAgMHg0NkFFCisKKy8qIElEcyBpbiB0aGUgY2hhcHRlcnMgbWFzdGVyICovCisjZGVmaW5lIE1BVFJPU0tBX0lEX0VESVRJT05FTlRSWSAgICAgICAgMHg0NUI5CisjZGVmaW5lIE1BVFJPU0tBX0lEX0NIQVBURVJBVE9NICAgICAgICAgMHhCNgorI2RlZmluZSBNQVRST1NLQV9JRF9DSEFQVEVSVElNRVNUQVJUICAgIDB4OTEKKyNkZWZpbmUgTUFUUk9TS0FfSURfQ0hBUFRFUlRJTUVFTkQgICAgICAweDkyCisjZGVmaW5lIE1BVFJPU0tBX0lEX0NIQVBURVJESVNQTEFZICAgICAgMHg4MAorI2RlZmluZSBNQVRST1NLQV9JRF9DSEFQU1RSSU5HICAgICAgICAgIDB4ODUKKyNkZWZpbmUgTUFUUk9TS0FfSURfQ0hBUExBTkcgICAgICAgICAgICAweDQzN0MKKyNkZWZpbmUgTUFUUk9TS0FfSURfRURJVElPTlVJRCAgICAgICAgICAweDQ1QkMKKyNkZWZpbmUgTUFUUk9TS0FfSURfRURJVElPTkZMQUdISURERU4gICAweDQ1QkQKKyNkZWZpbmUgTUFUUk9TS0FfSURfRURJVElPTkZMQUdERUZBVUxUICAweDQ1REIKKyNkZWZpbmUgTUFUUk9TS0FfSURfRURJVElPTkZMQUdPUkRFUkVEICAweDQ1REQKKyNkZWZpbmUgTUFUUk9TS0FfSURfQ0hBUFRFUlVJRCAgICAgICAgICAweDczQzQKKyNkZWZpbmUgTUFUUk9TS0FfSURfQ0hBUFRFUkZMQUdISURERU4gICAweDk4CisjZGVmaW5lIE1BVFJPU0tBX0lEX0NIQVBURVJGTEFHRU5BQkxFRCAgMHg0NTk4CisjZGVmaW5lIE1BVFJPU0tBX0lEX0NIQVBURVJQSFlTRVFVSVYgICAgMHg2M0MzCisKK3R5cGVkZWYgZW51bSB7CisgIE1BVFJPU0tBX1RSQUNLX1RZUEVfTk9ORSAgICAgPSAweDAsCisgIE1BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8gICAgPSAweDEsCisgIE1BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU8gICAgPSAweDIsCisgIE1BVFJPU0tBX1RSQUNLX1RZUEVfQ09NUExFWCAgPSAweDMsCisgIE1BVFJPU0tBX1RSQUNLX1RZUEVfTE9HTyAgICAgPSAweDEwLAorICBNQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFID0gMHgxMSwKKyAgTUFUUk9TS0FfVFJBQ0tfVFlQRV9DT05UUk9MICA9IDB4MjAsCisgIE1BVFJPU0tBX1RSQUNLX1RZUEVfTUVUQURBVEEgPSAweDIxLAorfSBNYXRyb3NrYVRyYWNrVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgTUFUUk9TS0FfVFJBQ0tfRU5DT0RJTkdfQ09NUF9aTElCICAgICAgICA9IDAsCisgIE1BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX0NPTVBfQlpMSUIgICAgICAgPSAxLAorICBNQVRST1NLQV9UUkFDS19FTkNPRElOR19DT01QX0xaTyAgICAgICAgID0gMiwKKyAgTUFUUk9TS0FfVFJBQ0tfRU5DT0RJTkdfQ09NUF9IRUFERVJTVFJJUCA9IDMsCit9IE1hdHJvc2thVHJhY2tFbmNvZGluZ0NvbXBBbGdvOworCit0eXBlZGVmIGVudW0geworICBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfTU9OTyAgICAgICAgICAgICAgID0gMCwKKyAgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX0xFRlRfUklHSFQgICAgICAgICA9IDEsCisgIE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9CT1RUT01fVE9QICAgICAgICAgPSAyLAorICBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfVE9QX0JPVFRPTSAgICAgICAgID0gMywKKyAgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX0NIRUNLRVJCT0FSRF9STCAgICA9IDQsCisgIE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9DSEVDS0VSQk9BUkRfTFIgICAgPSA1LAorICBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfUk9XX0lOVEVSTEVBVkVEX1JMID0gNiwKKyAgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX1JPV19JTlRFUkxFQVZFRF9MUiA9IDcsCisgIE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9DT0xfSU5URVJMRUFWRURfUkwgPSA4LAorICBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfQ09MX0lOVEVSTEVBVkVEX0xSID0gOSwKKyAgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX0FOQUdMWVBIX0NZQU5fUkVEICA9IDEwLAorICBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfUklHSFRfTEVGVCAgICAgICAgID0gMTEsCisgIE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9BTkFHTFlQSF9HUkVFTl9NQUcgPSAxMiwKKyAgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX0JPVEhfRVlFU19CTE9DS19MUiA9IDEzLAorICBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfQk9USF9FWUVTX0JMT0NLX1JMID0gMTQsCisgIE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9OQiwKK30gTWF0cm9za2FWaWRlb1N0ZXJlb01vZGVUeXBlOworCisvKgorICogTWF0cm9za2EgQ29kZWMgSURzLCBzdHJpbmdzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgQ29kZWNUYWdzeworICAgIGNoYXIgc3RyWzIyXTsKKyAgICBlbnVtIEFWQ29kZWNJRCBpZDsKK31Db2RlY1RhZ3M7CisKKy8qIG1heC4gZGVwdGggaW4gdGhlIEVCTUwgdHJlZSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgRUJNTF9NQVhfREVQVEggMTYKKworI2RlZmluZSBNQVRST1NLQV9WSURFT19TVEVSRU9fUExBTkVfQ09VTlQgIDMKKworZXh0ZXJuIGNvbnN0IENvZGVjVGFncyBmZl9ta3ZfY29kZWNfdGFnc1tdOworZXh0ZXJuIGNvbnN0IENvZGVjTWltZSBmZl9ta3ZfbWltZV90YWdzW107CitleHRlcm4gY29uc3QgQVZNZXRhZGF0YUNvbnYgZmZfbWt2X21ldGFkYXRhX2NvbnZbXTsKK2V4dGVybiBjb25zdCBjaGFyICogY29uc3QgZmZfbWF0cm9za2FfdmlkZW9fc3RlcmVvX21vZGVbTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX05CXTsKK2V4dGVybiBjb25zdCBjaGFyICogY29uc3QgZmZfbWF0cm9za2FfdmlkZW9fc3RlcmVvX3BsYW5lW01BVFJPU0tBX1ZJREVPX1NURVJFT19QTEFORV9DT1VOVF07CisKKy8qIEFWU3RyZWFtIE1ldGFkYXRhIHRhZyBrZXlzIGZvciBXZWJNIERhc2ggTWFuaWZlc3QgKi8KKyNkZWZpbmUgSU5JVElBTElaQVRJT05fUkFOR0UgIndlYm1fZGFzaF9tYW5pZmVzdF9pbml0aWFsaXphdGlvbl9yYW5nZSIKKyNkZWZpbmUgQ1VFU19TVEFSVCAid2VibV9kYXNoX21hbmlmZXN0X2N1ZXNfc3RhcnQiCisjZGVmaW5lIENVRVNfRU5EICJ3ZWJtX2Rhc2hfbWFuaWZlc3RfY3Vlc19lbmQiCisjZGVmaW5lIEZJTEVOQU1FICJ3ZWJtX2Rhc2hfbWFuaWZlc3RfZmlsZV9uYW1lIgorI2RlZmluZSBCQU5EV0lEVEggIndlYm1fZGFzaF9tYW5pZmVzdF9iYW5kd2lkdGgiCisjZGVmaW5lIERVUkFUSU9OICJ3ZWJtX2Rhc2hfbWFuaWZlc3RfZHVyYXRpb24iCisjZGVmaW5lIENMVVNURVJfS0VZRlJBTUUgIndlYm1fZGFzaF9tYW5pZmVzdF9jbHVzdGVyX2tleWZyYW1lIgorI2RlZmluZSBDVUVfVElNRVNUQU1QUyAid2VibV9kYXNoX21hbmlmZXN0X2N1ZV90aW1lc3RhbXBzIgorI2RlZmluZSBUUkFDS19OVU1CRVIgIndlYm1fZGFzaF9tYW5pZmVzdF90cmFja19udW1iZXIiCisjZGVmaW5lIENPREVDX1BSSVZBVEVfU0laRSAid2VibV9kYXNoX21hbmlmZXN0X2NvZGVjX3ByaXZfc2l6ZSIKKworaW50IGZmX21rdl9zdGVyZW8zZF9jb252KEFWU3RyZWFtICpzdCwgTWF0cm9za2FWaWRlb1N0ZXJlb01vZGVUeXBlIHN0ZXJlb19tb2RlKTsKKworI2VuZGlmIC8qIEFWRk9STUFUX01BVFJPU0tBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tYXRyb3NrYWRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21hdHJvc2thZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxYjVhMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tYXRyb3NrYWRlYy5jCkBAIC0wLDAgKzEsMzM3OCBAQAorLyoKKyAqIE1hdHJvc2thIGZpbGUgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1hdHJvc2thIGZpbGUgZGVtdXhlcgorICogQGF1dGhvciBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiBAYXV0aG9yIHdpdGggYSBsaXR0bGUgaGVscCBmcm9tIE1vcml0eiBCdW5rdXMgPG1vcml0ekBidW5rdXMub3JnPgorICogQGF1dGhvciB0b3RhbGx5IHJld29ya2VkIGJ5IEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqIEBzZWUgc3BlY3MgYXZhaWxhYmxlIG9uIHRoZSBNYXRyb3NrYSBwcm9qZWN0IHBhZ2U6IGh0dHA6Ly93d3cubWF0cm9za2Eub3JnLworICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9iYXNlNjQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbHpvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVfaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZmxhYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZzRhdWRpby5oIgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpc29tLmgiCisjaW5jbHVkZSAibWF0cm9za2EuaCIKKyNpbmNsdWRlICJvZ2dkZWMuaCIKKy8qIEZvciBmZl9jb2RlY19nZXRfaWQoKS4gKi8KKyNpbmNsdWRlICJyaWZmLmgiCisjaW5jbHVkZSAicm1zaXByLmgiCisKKyNpZiBDT05GSUdfQlpMSUIKKyNpbmNsdWRlIDxiemxpYi5oPgorI2VuZGlmCisjaWYgQ09ORklHX1pMSUIKKyNpbmNsdWRlIDx6bGliLmg+CisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFQk1MX05PTkUsCisgICAgRUJNTF9VSU5ULAorICAgIEVCTUxfRkxPQVQsCisgICAgRUJNTF9TVFIsCisgICAgRUJNTF9VVEY4LAorICAgIEVCTUxfQklOLAorICAgIEVCTUxfTkVTVCwKKyAgICBFQk1MX1BBU1MsCisgICAgRUJNTF9TVE9QLAorICAgIEVCTUxfU0lOVCwKKyAgICBFQk1MX1RZUEVfQ09VTlQKK30gRWJtbFR5cGU7CisKK3R5cGVkZWYgY29uc3Qgc3RydWN0IEVibWxTeW50YXggeworICAgIHVpbnQzMl90IGlkOworICAgIEVibWxUeXBlIHR5cGU7CisgICAgaW50IGxpc3RfZWxlbV9zaXplOworICAgIGludCBkYXRhX29mZnNldDsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQ2NF90ICAgIHU7CisgICAgICAgIGRvdWJsZSAgICAgIGY7CisgICAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICAgIGNvbnN0IHN0cnVjdCBFYm1sU3ludGF4ICpuOworICAgIH0gZGVmOworfSBFYm1sU3ludGF4OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IG5iX2VsZW07CisgICAgdm9pZCAqZWxlbTsKK30gRWJtbExpc3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICBzaXplOworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgaW50NjRfdCAgcG9zOworfSBFYm1sQmluOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgdmVyc2lvbjsKKyAgICB1aW50NjRfdCBtYXhfc2l6ZTsKKyAgICB1aW50NjRfdCBpZF9sZW5ndGg7CisgICAgY2hhciAgICAqZG9jdHlwZTsKKyAgICB1aW50NjRfdCBkb2N0eXBlX3ZlcnNpb247Cit9IEVibWw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCBhbGdvOworICAgIEVibWxCaW4gIHNldHRpbmdzOworfSBNYXRyb3NrYVRyYWNrQ29tcHJlc3Npb247CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCBhbGdvOworICAgIEVibWxCaW4gIGtleV9pZDsKK30gTWF0cm9za2FUcmFja0VuY3J5cHRpb247CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCBzY29wZTsKKyAgICB1aW50NjRfdCB0eXBlOworICAgIE1hdHJvc2thVHJhY2tDb21wcmVzc2lvbiBjb21wcmVzc2lvbjsKKyAgICBNYXRyb3NrYVRyYWNrRW5jcnlwdGlvbiBlbmNyeXB0aW9uOworfSBNYXRyb3NrYVRyYWNrRW5jb2Rpbmc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBkb3VibGUgICBmcmFtZV9yYXRlOworICAgIHVpbnQ2NF90IGRpc3BsYXlfd2lkdGg7CisgICAgdWludDY0X3QgZGlzcGxheV9oZWlnaHQ7CisgICAgdWludDY0X3QgcGl4ZWxfd2lkdGg7CisgICAgdWludDY0X3QgcGl4ZWxfaGVpZ2h0OworICAgIEVibWxCaW4gY29sb3Jfc3BhY2U7CisgICAgdWludDY0X3Qgc3RlcmVvX21vZGU7CisgICAgdWludDY0X3QgYWxwaGFfbW9kZTsKK30gTWF0cm9za2FUcmFja1ZpZGVvOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZG91YmxlICAgc2FtcGxlcmF0ZTsKKyAgICBkb3VibGUgICBvdXRfc2FtcGxlcmF0ZTsKKyAgICB1aW50NjRfdCBiaXRkZXB0aDsKKyAgICB1aW50NjRfdCBjaGFubmVsczsKKworICAgIC8qIHJlYWwgYXVkaW8gaGVhZGVyIChleHRyYWN0ZWQgZnJvbSBleHRyYWRhdGEpICovCisgICAgaW50ICAgICAgY29kZWRfZnJhbWVzaXplOworICAgIGludCAgICAgIHN1Yl9wYWNrZXRfaDsKKyAgICBpbnQgICAgICBmcmFtZV9zaXplOworICAgIGludCAgICAgIHN1Yl9wYWNrZXRfc2l6ZTsKKyAgICBpbnQgICAgICBzdWJfcGFja2V0X2NudDsKKyAgICBpbnQgICAgICBwa3RfY250OworICAgIHVpbnQ2NF90IGJ1Zl90aW1lY29kZTsKKyAgICB1aW50OF90ICpidWY7Cit9IE1hdHJvc2thVHJhY2tBdWRpbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90IHVpZDsKKyAgICB1aW50NjRfdCB0eXBlOworfSBNYXRyb3NrYVRyYWNrUGxhbmU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFYm1sTGlzdCBjb21iaW5lX3BsYW5lczsKK30gTWF0cm9za2FUcmFja09wZXJhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90IG51bTsKKyAgICB1aW50NjRfdCB1aWQ7CisgICAgdWludDY0X3QgdHlwZTsKKyAgICBjaGFyICAgICpuYW1lOworICAgIGNoYXIgICAgKmNvZGVjX2lkOworICAgIEVibWxCaW4gIGNvZGVjX3ByaXY7CisgICAgY2hhciAgICAqbGFuZ3VhZ2U7CisgICAgZG91YmxlIHRpbWVfc2NhbGU7CisgICAgdWludDY0X3QgZGVmYXVsdF9kdXJhdGlvbjsKKyAgICB1aW50NjRfdCBmbGFnX2RlZmF1bHQ7CisgICAgdWludDY0X3QgZmxhZ19mb3JjZWQ7CisgICAgdWludDY0X3Qgc2Vla19wcmVyb2xsOworICAgIE1hdHJvc2thVHJhY2tWaWRlbyB2aWRlbzsKKyAgICBNYXRyb3NrYVRyYWNrQXVkaW8gYXVkaW87CisgICAgTWF0cm9za2FUcmFja09wZXJhdGlvbiBvcGVyYXRpb247CisgICAgRWJtbExpc3QgZW5jb2RpbmdzOworICAgIHVpbnQ2NF90IGNvZGVjX2RlbGF5OworCisgICAgQVZTdHJlYW0gKnN0cmVhbTsKKyAgICBpbnQ2NF90IGVuZF90aW1lY29kZTsKKyAgICBpbnQgbXNfY29tcGF0OworICAgIHVpbnQ2NF90IG1heF9ibG9ja19hZGRpdGlvbmFsX2lkOworfSBNYXRyb3NrYVRyYWNrOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgdWlkOworICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGNoYXIgKm1pbWU7CisgICAgRWJtbEJpbiBiaW47CisKKyAgICBBVlN0cmVhbSAqc3RyZWFtOworfSBNYXRyb3NrYUF0dGFjaG1lbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCBzdGFydDsKKyAgICB1aW50NjRfdCBlbmQ7CisgICAgdWludDY0X3QgdWlkOworICAgIGNoYXIgICAgKnRpdGxlOworCisgICAgQVZDaGFwdGVyICpjaGFwdGVyOworfSBNYXRyb3NrYUNoYXB0ZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCB0cmFjazsKKyAgICB1aW50NjRfdCBwb3M7Cit9IE1hdHJvc2thSW5kZXhQb3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCB0aW1lOworICAgIEVibWxMaXN0IHBvczsKK30gTWF0cm9za2FJbmRleDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgKm5hbWU7CisgICAgY2hhciAqc3RyaW5nOworICAgIGNoYXIgKmxhbmc7CisgICAgdWludDY0X3QgZGVmOworICAgIEVibWxMaXN0IHN1YjsKK30gTWF0cm9za2FUYWc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICAgICp0eXBlOworICAgIHVpbnQ2NF90IHR5cGV2YWx1ZTsKKyAgICB1aW50NjRfdCB0cmFja3VpZDsKKyAgICB1aW50NjRfdCBjaGFwdGVydWlkOworICAgIHVpbnQ2NF90IGF0dGFjaHVpZDsKK30gTWF0cm9za2FUYWdUYXJnZXQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBNYXRyb3NrYVRhZ1RhcmdldCB0YXJnZXQ7CisgICAgRWJtbExpc3QgdGFnOworfSBNYXRyb3NrYVRhZ3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCBpZDsKKyAgICB1aW50NjRfdCBwb3M7Cit9IE1hdHJvc2thU2Vla2hlYWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCBzdGFydDsKKyAgICB1aW50NjRfdCBsZW5ndGg7Cit9IE1hdHJvc2thTGV2ZWw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCB0aW1lY29kZTsKKyAgICBFYm1sTGlzdCBibG9ja3M7Cit9IE1hdHJvc2thQ2x1c3RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWRm9ybWF0Q29udGV4dCAqY3R4OworCisgICAgLyogRUJNTCBzdHVmZiAqLworICAgIGludCBudW1fbGV2ZWxzOworICAgIE1hdHJvc2thTGV2ZWwgbGV2ZWxzW0VCTUxfTUFYX0RFUFRIXTsKKyAgICBpbnQgbGV2ZWxfdXA7CisgICAgdWludDMyX3QgY3VycmVudF9pZDsKKworICAgIHVpbnQ2NF90IHRpbWVfc2NhbGU7CisgICAgZG91YmxlICAgZHVyYXRpb247CisgICAgY2hhciAgICAqdGl0bGU7CisgICAgY2hhciAgICAqbXV4aW5nYXBwOworICAgIEVibWxCaW4gZGF0ZV91dGM7CisgICAgRWJtbExpc3QgdHJhY2tzOworICAgIEVibWxMaXN0IGF0dGFjaG1lbnRzOworICAgIEVibWxMaXN0IGNoYXB0ZXJzOworICAgIEVibWxMaXN0IGluZGV4OworICAgIEVibWxMaXN0IHRhZ3M7CisgICAgRWJtbExpc3Qgc2Vla2hlYWQ7CisKKyAgICAvKiBieXRlIHBvc2l0aW9uIG9mIHRoZSBzZWdtZW50IGluc2lkZSB0aGUgc3RyZWFtICovCisgICAgaW50NjRfdCBzZWdtZW50X3N0YXJ0OworCisgICAgLyogdGhlIHBhY2tldCBxdWV1ZSAqLworICAgIEFWUGFja2V0ICoqcGFja2V0czsKKyAgICBpbnQgbnVtX3BhY2tldHM7CisgICAgQVZQYWNrZXQgKnByZXZfcGt0OworCisgICAgaW50IGRvbmU7CisKKyAgICAvKiBXaGF0IHRvIHNraXAgYmVmb3JlIGVmZmVjdGl2ZWx5IHJlYWRpbmcgYSBwYWNrZXQuICovCisgICAgaW50IHNraXBfdG9fa2V5ZnJhbWU7CisgICAgdWludDY0X3Qgc2tpcF90b190aW1lY29kZTsKKworICAgIC8qIEZpbGUgaGFzIGEgQ1VFUyBlbGVtZW50LCBidXQgd2UgZGVmZXIgcGFyc2luZyB1bnRpbCBpdCBpcyBuZWVkZWQuICovCisgICAgaW50IGN1ZXNfcGFyc2luZ19kZWZlcnJlZDsKKworICAgIGludCBjdXJyZW50X2NsdXN0ZXJfbnVtX2Jsb2NrczsKKyAgICBpbnQ2NF90IGN1cnJlbnRfY2x1c3Rlcl9wb3M7CisgICAgTWF0cm9za2FDbHVzdGVyIGN1cnJlbnRfY2x1c3RlcjsKKworICAgIC8qIEZpbGUgaGFzIFNTQSBzdWJ0aXRsZXMgd2hpY2ggcHJldmVudCBpbmNyZW1lbnRhbCBjbHVzdGVyIHBhcnNpbmcuICovCisgICAgaW50IGNvbnRhaW5zX3NzYTsKK30gTWF0cm9za2FEZW11eENvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCBkdXJhdGlvbjsKKyAgICBpbnQ2NF90ICByZWZlcmVuY2U7CisgICAgdWludDY0X3Qgbm9uX3NpbXBsZTsKKyAgICBFYm1sQmluICBiaW47CisgICAgdWludDY0X3QgYWRkaXRpb25hbF9pZDsKKyAgICBFYm1sQmluICBhZGRpdGlvbmFsOworICAgIGludDY0X3QgZGlzY2FyZF9wYWRkaW5nOworfSBNYXRyb3NrYUJsb2NrOworCitzdGF0aWMgRWJtbFN5bnRheCBlYm1sX2hlYWRlcltdID0geworICAgIHsgRUJNTF9JRF9FQk1MUkVBRFZFUlNJT04sICAgIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoRWJtbCwgdmVyc2lvbiksICAgICAgICAgeyAudSA9IEVCTUxfVkVSU0lPTiB9IH0sCisgICAgeyBFQk1MX0lEX0VCTUxNQVhTSVpFTEVOR1RILCAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihFYm1sLCBtYXhfc2l6ZSksICAgICAgICB7IC51ID0gOCB9IH0sCisgICAgeyBFQk1MX0lEX0VCTUxNQVhJRExFTkdUSCwgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihFYm1sLCBpZF9sZW5ndGgpLCAgICAgICB7IC51ID0gNCB9IH0sCisgICAgeyBFQk1MX0lEX0RPQ1RZUEUsICAgICAgICAgICAgRUJNTF9TVFIsICAwLCBvZmZzZXRvZihFYm1sLCBkb2N0eXBlKSwgICAgICAgICB7IC5zID0gIihub25lKSIgfSB9LAorICAgIHsgRUJNTF9JRF9ET0NUWVBFUkVBRFZFUlNJT04sIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoRWJtbCwgZG9jdHlwZV92ZXJzaW9uKSwgeyAudSA9IDEgfSB9LAorICAgIHsgRUJNTF9JRF9FQk1MVkVSU0lPTiwgICAgICAgIEVCTUxfTk9ORSB9LAorICAgIHsgRUJNTF9JRF9ET0NUWVBFVkVSU0lPTiwgICAgIEVCTUxfTk9ORSB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBlYm1sX3N5bnRheFtdID0geworICAgIHsgRUJNTF9JRF9IRUFERVIsIEVCTUxfTkVTVCwgMCwgMCwgeyAubiA9IGVibWxfaGVhZGVyIH0gfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2FfaW5mb1tdID0geworICAgIHsgTUFUUk9TS0FfSURfVElNRUNPREVTQ0FMRSwgRUJNTF9VSU5ULCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FEZW11eENvbnRleHQsIHRpbWVfc2NhbGUpLCB7IC51ID0gMTAwMDAwMCB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9EVVJBVElPTiwgICAgICBFQk1MX0ZMT0FULCAwLCBvZmZzZXRvZihNYXRyb3NrYURlbXV4Q29udGV4dCwgZHVyYXRpb24pIH0sCisgICAgeyBNQVRST1NLQV9JRF9USVRMRSwgICAgICAgICBFQk1MX1VURjgsICAwLCBvZmZzZXRvZihNYXRyb3NrYURlbXV4Q29udGV4dCwgdGl0bGUpIH0sCisgICAgeyBNQVRST1NLQV9JRF9XUklUSU5HQVBQLCAgICBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX01VWElOR0FQUCwgICAgIEVCTUxfVVRGOCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FEZW11eENvbnRleHQsIG11eGluZ2FwcCkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0RBVEVVVEMsICAgICAgIEVCTUxfQklOLCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FEZW11eENvbnRleHQsIGRhdGVfdXRjKSB9LAorICAgIHsgTUFUUk9TS0FfSURfU0VHTUVOVFVJRCwgICAgRUJNTF9OT05FIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX3RyYWNrX3ZpZGVvW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9WSURFT0ZSQU1FUkFURSwgICAgICBFQk1MX0ZMT0FULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW8sIGZyYW1lX3JhdGUpIH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0RJU1BMQVlXSURUSCwgICBFQk1MX1VJTlQsICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW8sIGRpc3BsYXlfd2lkdGgpLCB7IC51PS0xIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPRElTUExBWUhFSUdIVCwgIEVCTUxfVUlOVCwgIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2tWaWRlbywgZGlzcGxheV9oZWlnaHQpLCB7IC51PS0xIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPUElYRUxXSURUSCwgICAgIEVCTUxfVUlOVCwgIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2tWaWRlbywgcGl4ZWxfd2lkdGgpIH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT1BJWEVMSEVJR0hULCAgICBFQk1MX1VJTlQsICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW8sIHBpeGVsX2hlaWdodCkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JTUEFDRSwgICAgIEVCTUxfQklOLCAgIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2tWaWRlbywgY29sb3Jfc3BhY2UpIH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0FMUEhBTU9ERSwgICAgICBFQk1MX1VJTlQsICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW8sIGFscGhhX21vZGUpIH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUEIsICAgICBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPUElYRUxDUk9QVCwgICAgIEVCTUxfTk9ORSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BMLCAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUFIsICAgICBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPRElTUExBWVVOSVQsICAgIEVCTUxfTk9ORSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9GTEFHSU5URVJMQUNFRCwgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT1NURVJFT01PREUsICAgICBFQk1MX1VJTlQsICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW8sIHN0ZXJlb19tb2RlKSwgeyAudSA9IE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9OQiB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0FTUEVDVFJBVElPLCAgICBFQk1MX05PTkUgfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2FfdHJhY2tfYXVkaW9bXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX0FVRElPU0FNUExJTkdGUkVRLCAgICBFQk1MX0ZMT0FULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrQXVkaW8sIHNhbXBsZXJhdGUpLCB7IC5mID0gODAwMC4wIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX0FVRElPT1VUU0FNUExJTkdGUkVRLCBFQk1MX0ZMT0FULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrQXVkaW8sIG91dF9zYW1wbGVyYXRlKSB9LAorICAgIHsgTUFUUk9TS0FfSURfQVVESU9CSVRERVBUSCwgICAgICAgIEVCTUxfVUlOVCwgIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2tBdWRpbywgYml0ZGVwdGgpIH0sCisgICAgeyBNQVRST1NLQV9JRF9BVURJT0NIQU5ORUxTLCAgICAgICAgRUJNTF9VSU5ULCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja0F1ZGlvLCBjaGFubmVscyksICAgeyAudSA9IDEgfSB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBtYXRyb3NrYV90cmFja19lbmNvZGluZ19jb21wcmVzc2lvbltdID0geworICAgIHsgTUFUUk9TS0FfSURfRU5DT0RJTkdDT01QQUxHTywgICAgIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja0NvbXByZXNzaW9uLCBhbGdvKSwgeyAudSA9IDAgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfRU5DT0RJTkdDT01QU0VUVElOR1MsIEVCTUxfQklOLCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja0NvbXByZXNzaW9uLCBzZXR0aW5ncykgfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2FfdHJhY2tfZW5jb2RpbmdfZW5jcnlwdGlvbltdID0geworICAgIHsgTUFUUk9TS0FfSURfRU5DT0RJTkdFTkNBTEdPLCAgICAgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrRW5jcnlwdGlvbixhbGdvKSwgey51ID0gMH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX0VOQ09ESU5HRU5DS0VZSUQsICAgICAgIEVCTUxfQklOLCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrRW5jcnlwdGlvbixrZXlfaWQpIH0sCisgICAgeyBNQVRST1NLQV9JRF9FTkNPRElOR0VOQ0FFU1NFVFRJTkdTLCBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0VOQ09ESU5HU0lHQUxHTywgICAgICAgIEVCTUxfTk9ORSB9LAorICAgIHsgTUFUUk9TS0FfSURfRU5DT0RJTkdTSUdIQVNIQUxHTywgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9FTkNPRElOR1NJR0tFWUlELCAgICAgICBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0VOQ09ESU5HU0lHTkFUVVJFLCAgICAgIEVCTUxfTk9ORSB9LAorICAgIHsgMCB9Cit9Oworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2FfdHJhY2tfZW5jb2RpbmdbXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX0VOQ09ESU5HU0NPUEUsICAgICAgIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja0VuY29kaW5nLCBzY29wZSksICAgICAgIHsgLnUgPSAxIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX0VOQ09ESU5HVFlQRSwgICAgICAgIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja0VuY29kaW5nLCB0eXBlKSwgICAgICAgIHsgLnUgPSAwIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX0VOQ09ESU5HQ09NUFJFU1NJT04sIEVCTUxfTkVTVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja0VuY29kaW5nLCBjb21wcmVzc2lvbiksIHsgLm4gPSBtYXRyb3NrYV90cmFja19lbmNvZGluZ19jb21wcmVzc2lvbiB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9FTkNPRElOR0VOQ1JZUFRJT04sICBFQk1MX05FU1QsIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2tFbmNvZGluZywgZW5jcnlwdGlvbiksICB7IC5uID0gbWF0cm9za2FfdHJhY2tfZW5jb2RpbmdfZW5jcnlwdGlvbiB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9FTkNPRElOR09SREVSLCAgICAgICBFQk1MX05PTkUgfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2FfdHJhY2tfZW5jb2RpbmdzW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9UUkFDS0NPTlRFTlRFTkNPRElORywgRUJNTF9ORVNULCBzaXplb2YoTWF0cm9za2FUcmFja0VuY29kaW5nKSwgb2Zmc2V0b2YoTWF0cm9za2FUcmFjaywgZW5jb2RpbmdzKSwgeyAubiA9IG1hdHJvc2thX3RyYWNrX2VuY29kaW5nIH0gfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2FfdHJhY2tfcGxhbmVbXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX1RSQUNLUExBTkVVSUQsICBFQk1MX1VJTlQsIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2tQbGFuZSx1aWQpIH0sCisgICAgeyBNQVRST1NLQV9JRF9UUkFDS1BMQU5FVFlQRSwgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrUGxhbmUsdHlwZSkgfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2FfdHJhY2tfY29tYmluZV9wbGFuZXNbXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX1RSQUNLUExBTkUsIEVCTUxfTkVTVCwgc2l6ZW9mKE1hdHJvc2thVHJhY2tQbGFuZSksIG9mZnNldG9mKE1hdHJvc2thVHJhY2tPcGVyYXRpb24sY29tYmluZV9wbGFuZXMpLCB7Lm4gPSBtYXRyb3NrYV90cmFja19wbGFuZX0gfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2FfdHJhY2tfb3BlcmF0aW9uW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9UUkFDS0NPTUJJTkVQTEFORVMsIEVCTUxfTkVTVCwgMCwgMCwgey5uID0gbWF0cm9za2FfdHJhY2tfY29tYmluZV9wbGFuZXN9IH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX3RyYWNrW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9UUkFDS05VTUJFUiwgICAgICAgICAgIEVCTUxfVUlOVCwgIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2ssIG51bSkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RSQUNLTkFNRSwgICAgICAgICAgICAgRUJNTF9VVEY4LCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFjaywgbmFtZSkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RSQUNLVUlELCAgICAgICAgICAgICAgRUJNTF9VSU5ULCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFjaywgdWlkKSB9LAorICAgIHsgTUFUUk9TS0FfSURfVFJBQ0tUWVBFLCAgICAgICAgICAgICBFQk1MX1VJTlQsICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrLCB0eXBlKSB9LAorICAgIHsgTUFUUk9TS0FfSURfQ09ERUNJRCwgICAgICAgICAgICAgICBFQk1MX1NUUiwgICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrLCBjb2RlY19pZCkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NPREVDUFJJVkFURSwgICAgICAgICAgRUJNTF9CSU4sICAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFjaywgY29kZWNfcHJpdikgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NPREVDREVMQVksICAgICAgICAgICAgRUJNTF9VSU5ULCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFjaywgY29kZWNfZGVsYXkpIH0sCisgICAgeyBNQVRST1NLQV9JRF9UUkFDS0xBTkdVQUdFLCAgICAgICAgIEVCTUxfVVRGOCwgIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2ssIGxhbmd1YWdlKSwgICAgIHsgLnMgPSAiZW5nIiB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9UUkFDS0RFRkFVTFREVVJBVElPTiwgIEVCTUxfVUlOVCwgIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2ssIGRlZmF1bHRfZHVyYXRpb24pIH0sCisgICAgeyBNQVRST1NLQV9JRF9UUkFDS1RJTUVDT0RFU0NBTEUsICAgIEVCTUxfRkxPQVQsIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2ssIHRpbWVfc2NhbGUpLCAgIHsgLmYgPSAxLjAgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVFJBQ0tGTEFHREVGQVVMVCwgICAgICBFQk1MX1VJTlQsICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrLCBmbGFnX2RlZmF1bHQpLCB7IC51ID0gMSB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9UUkFDS0ZMQUdGT1JDRUQsICAgICAgIEVCTUxfVUlOVCwgIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2ssIGZsYWdfZm9yY2VkKSwgIHsgLnUgPSAwIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RSQUNLVklERU8sICAgICAgICAgICAgRUJNTF9ORVNULCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFjaywgdmlkZW8pLCAgICAgICAgeyAubiA9IG1hdHJvc2thX3RyYWNrX3ZpZGVvIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RSQUNLQVVESU8sICAgICAgICAgICAgRUJNTF9ORVNULCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFjaywgYXVkaW8pLCAgICAgICAgeyAubiA9IG1hdHJvc2thX3RyYWNrX2F1ZGlvIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RSQUNLT1BFUkFUSU9OLCAgICAgICAgRUJNTF9ORVNULCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFjaywgb3BlcmF0aW9uKSwgICAgeyAubiA9IG1hdHJvc2thX3RyYWNrX29wZXJhdGlvbiB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9UUkFDS0NPTlRFTlRFTkNPRElOR1MsIEVCTUxfTkVTVCwgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm4gPSBtYXRyb3NrYV90cmFja19lbmNvZGluZ3MgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVFJBQ0tNQVhCTEtBRERJRCwgICAgICBFQk1MX1VJTlQsICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrLCBtYXhfYmxvY2tfYWRkaXRpb25hbF9pZCkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1NFRUtQUkVST0xMLCAgICAgICAgICAgRUJNTF9VSU5ULCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFjaywgc2Vla19wcmVyb2xsKSB9LAorICAgIHsgTUFUUk9TS0FfSURfVFJBQ0tGTEFHRU5BQkxFRCwgICAgICBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RSQUNLRkxBR0xBQ0lORywgICAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9DT0RFQ05BTUUsICAgICAgICAgICAgIEVCTUxfTk9ORSB9LAorICAgIHsgTUFUUk9TS0FfSURfQ09ERUNERUNPREVBTEwsICAgICAgICBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NPREVDSU5GT1VSTCwgICAgICAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9DT0RFQ0RPV05MT0FEVVJMLCAgICAgIEVCTUxfTk9ORSB9LAorICAgIHsgTUFUUk9TS0FfSURfVFJBQ0tNSU5DQUNIRSwgICAgICAgICBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RSQUNLTUFYQ0FDSEUsICAgICAgICAgRUJNTF9OT05FIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX3RyYWNrc1tdID0geworICAgIHsgTUFUUk9TS0FfSURfVFJBQ0tFTlRSWSwgRUJNTF9ORVNULCBzaXplb2YoTWF0cm9za2FUcmFjayksIG9mZnNldG9mKE1hdHJvc2thRGVtdXhDb250ZXh0LCB0cmFja3MpLCB7IC5uID0gbWF0cm9za2FfdHJhY2sgfSB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBtYXRyb3NrYV9hdHRhY2htZW50W10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9GSUxFVUlELCAgICAgIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FBdHRhY2htZW50LCB1aWQpIH0sCisgICAgeyBNQVRST1NLQV9JRF9GSUxFTkFNRSwgICAgIEVCTUxfVVRGOCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FBdHRhY2htZW50LCBmaWxlbmFtZSkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0ZJTEVNSU1FVFlQRSwgRUJNTF9TVFIsICAwLCBvZmZzZXRvZihNYXRyb3NrYUF0dGFjaG1lbnQsIG1pbWUpIH0sCisgICAgeyBNQVRST1NLQV9JRF9GSUxFREFUQSwgICAgIEVCTUxfQklOLCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FBdHRhY2htZW50LCBiaW4pIH0sCisgICAgeyBNQVRST1NLQV9JRF9GSUxFREVTQywgICAgIEVCTUxfTk9ORSB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBtYXRyb3NrYV9hdHRhY2htZW50c1tdID0geworICAgIHsgTUFUUk9TS0FfSURfQVRUQUNIRURGSUxFLCBFQk1MX05FU1QsIHNpemVvZihNYXRyb3NrYUF0dGFjaG1lbnQpLCBvZmZzZXRvZihNYXRyb3NrYURlbXV4Q29udGV4dCwgYXR0YWNobWVudHMpLCB7IC5uID0gbWF0cm9za2FfYXR0YWNobWVudCB9IH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX2NoYXB0ZXJfZGlzcGxheVtdID0geworICAgIHsgTUFUUk9TS0FfSURfQ0hBUFNUUklORywgRUJNTF9VVEY4LCAwLCBvZmZzZXRvZihNYXRyb3NrYUNoYXB0ZXIsIHRpdGxlKSB9LAorICAgIHsgTUFUUk9TS0FfSURfQ0hBUExBTkcsICAgRUJNTF9OT05FIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX2NoYXB0ZXJfZW50cnlbXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX0NIQVBURVJUSU1FU1RBUlQsICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYUNoYXB0ZXIsIHN0YXJ0KSwgeyAudSA9IEFWX05PUFRTX1ZBTFVFIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NIQVBURVJUSU1FRU5ELCAgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYUNoYXB0ZXIsIGVuZCksICAgeyAudSA9IEFWX05PUFRTX1ZBTFVFIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NIQVBURVJVSUQsICAgICAgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYUNoYXB0ZXIsIHVpZCkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NIQVBURVJESVNQTEFZLCAgICAgRUJNTF9ORVNULCAwLCAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgeyAubiA9IG1hdHJvc2thX2NoYXB0ZXJfZGlzcGxheSB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9DSEFQVEVSRkxBR0hJRERFTiwgIEVCTUxfTk9ORSB9LAorICAgIHsgTUFUUk9TS0FfSURfQ0hBUFRFUkZMQUdFTkFCTEVELCBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NIQVBURVJQSFlTRVFVSVYsICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9DSEFQVEVSQVRPTSwgICAgICAgIEVCTUxfTk9ORSB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBtYXRyb3NrYV9jaGFwdGVyW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9DSEFQVEVSQVRPTSwgICAgICAgIEVCTUxfTkVTVCwgc2l6ZW9mKE1hdHJvc2thQ2hhcHRlciksIG9mZnNldG9mKE1hdHJvc2thRGVtdXhDb250ZXh0LCBjaGFwdGVycyksIHsgLm4gPSBtYXRyb3NrYV9jaGFwdGVyX2VudHJ5IH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX0VESVRJT05VSUQsICAgICAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9FRElUSU9ORkxBR0hJRERFTiwgIEVCTUxfTk9ORSB9LAorICAgIHsgTUFUUk9TS0FfSURfRURJVElPTkZMQUdERUZBVUxULCBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0VESVRJT05GTEFHT1JERVJFRCwgRUJNTF9OT05FIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX2NoYXB0ZXJzW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9FRElUSU9ORU5UUlksIEVCTUxfTkVTVCwgMCwgMCwgeyAubiA9IG1hdHJvc2thX2NoYXB0ZXIgfSB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBtYXRyb3NrYV9pbmRleF9wb3NbXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX0NVRVRSQUNLLCAgICAgICAgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYUluZGV4UG9zLCB0cmFjaykgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NVRUNMVVNURVJQT1NJVElPTiwgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYUluZGV4UG9zLCBwb3MpIH0sCisgICAgeyBNQVRST1NLQV9JRF9DVUVSRUxBVElWRVBPU0lUSU9OLEVCTUxfTk9ORSB9LAorICAgIHsgTUFUUk9TS0FfSURfQ1VFRFVSQVRJT04sICAgICAgICBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NVRUJMT0NLTlVNQkVSLCAgICAgRUJNTF9OT05FIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX2luZGV4X2VudHJ5W10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9DVUVUSU1FLCAgICAgICAgICBFQk1MX1VJTlQsIDAsICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoTWF0cm9za2FJbmRleCwgdGltZSkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NVRVRSQUNLUE9TSVRJT04sIEVCTUxfTkVTVCwgc2l6ZW9mKE1hdHJvc2thSW5kZXhQb3MpLCBvZmZzZXRvZihNYXRyb3NrYUluZGV4LCBwb3MpLCB7IC5uID0gbWF0cm9za2FfaW5kZXhfcG9zIH0gfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2FfaW5kZXhbXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX1BPSU5URU5UUlksIEVCTUxfTkVTVCwgc2l6ZW9mKE1hdHJvc2thSW5kZXgpLCBvZmZzZXRvZihNYXRyb3NrYURlbXV4Q29udGV4dCwgaW5kZXgpLCB7IC5uID0gbWF0cm9za2FfaW5kZXhfZW50cnkgfSB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBtYXRyb3NrYV9zaW1wbGV0YWdbXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX1RBR05BTUUsICAgICAgICBFQk1MX1VURjgsIDAsICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKE1hdHJvc2thVGFnLCBuYW1lKSB9LAorICAgIHsgTUFUUk9TS0FfSURfVEFHU1RSSU5HLCAgICAgIEVCTUxfVVRGOCwgMCwgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoTWF0cm9za2FUYWcsIHN0cmluZykgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RBR0xBTkcsICAgICAgICBFQk1MX1NUUiwgIDAsICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKE1hdHJvc2thVGFnLCBsYW5nKSwgeyAucyA9ICJ1bmQiIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RBR0RFRkFVTFQsICAgICBFQk1MX1VJTlQsIDAsICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKE1hdHJvc2thVGFnLCBkZWYpIH0sCisgICAgeyBNQVRST1NLQV9JRF9UQUdERUZBVUxUX0JVRywgRUJNTF9VSU5ULCAwLCAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihNYXRyb3NrYVRhZywgZGVmKSB9LAorICAgIHsgTUFUUk9TS0FfSURfU0lNUExFVEFHLCAgICAgIEVCTUxfTkVTVCwgc2l6ZW9mKE1hdHJvc2thVGFnKSwgb2Zmc2V0b2YoTWF0cm9za2FUYWcsIHN1YiksICB7IC5uID0gbWF0cm9za2Ffc2ltcGxldGFnIH0gfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2FfdGFndGFyZ2V0c1tdID0geworICAgIHsgTUFUUk9TS0FfSURfVEFHVEFSR0VUU19UWVBFLCAgICAgICBFQk1MX1NUUiwgIDAsIG9mZnNldG9mKE1hdHJvc2thVGFnVGFyZ2V0LCB0eXBlKSB9LAorICAgIHsgTUFUUk9TS0FfSURfVEFHVEFSR0VUU19UWVBFVkFMVUUsICBFQk1MX1VJTlQsIDAsIG9mZnNldG9mKE1hdHJvc2thVGFnVGFyZ2V0LCB0eXBldmFsdWUpLCB7IC51ID0gNTAgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVEFHVEFSR0VUU19UUkFDS1VJRCwgICBFQk1MX1VJTlQsIDAsIG9mZnNldG9mKE1hdHJvc2thVGFnVGFyZ2V0LCB0cmFja3VpZCkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RBR1RBUkdFVFNfQ0hBUFRFUlVJRCwgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRhZ1RhcmdldCwgY2hhcHRlcnVpZCkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RBR1RBUkdFVFNfQVRUQUNIVUlELCAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRhZ1RhcmdldCwgYXR0YWNodWlkKSB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBtYXRyb3NrYV90YWdbXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX1NJTVBMRVRBRywgIEVCTUxfTkVTVCwgc2l6ZW9mKE1hdHJvc2thVGFnKSwgb2Zmc2V0b2YoTWF0cm9za2FUYWdzLCB0YWcpLCAgICB7IC5uID0gbWF0cm9za2Ffc2ltcGxldGFnIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1RBR1RBUkdFVFMsIEVCTUxfTkVTVCwgMCwgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoTWF0cm9za2FUYWdzLCB0YXJnZXQpLCB7IC5uID0gbWF0cm9za2FfdGFndGFyZ2V0cyB9IH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX3RhZ3NbXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX1RBRywgRUJNTF9ORVNULCBzaXplb2YoTWF0cm9za2FUYWdzKSwgb2Zmc2V0b2YoTWF0cm9za2FEZW11eENvbnRleHQsIHRhZ3MpLCB7IC5uID0gbWF0cm9za2FfdGFnIH0gfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2Ffc2Vla2hlYWRfZW50cnlbXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX1NFRUtJRCwgICAgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVNlZWtoZWFkLCBpZCkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1NFRUtQT1NJVElPTiwgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVNlZWtoZWFkLCBwb3MpLCB7IC51ID0gLTEgfSB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBtYXRyb3NrYV9zZWVraGVhZFtdID0geworICAgIHsgTUFUUk9TS0FfSURfU0VFS0VOVFJZLCBFQk1MX05FU1QsIHNpemVvZihNYXRyb3NrYVNlZWtoZWFkKSwgb2Zmc2V0b2YoTWF0cm9za2FEZW11eENvbnRleHQsIHNlZWtoZWFkKSwgeyAubiA9IG1hdHJvc2thX3NlZWtoZWFkX2VudHJ5IH0gfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIEVibWxTeW50YXggbWF0cm9za2Ffc2VnbWVudFtdID0geworICAgIHsgTUFUUk9TS0FfSURfSU5GTywgICAgICAgIEVCTUxfTkVTVCwgMCwgMCwgeyAubiA9IG1hdHJvc2thX2luZm8gfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVFJBQ0tTLCAgICAgIEVCTUxfTkVTVCwgMCwgMCwgeyAubiA9IG1hdHJvc2thX3RyYWNrcyB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9BVFRBQ0hNRU5UUywgRUJNTF9ORVNULCAwLCAwLCB7IC5uID0gbWF0cm9za2FfYXR0YWNobWVudHMgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfQ0hBUFRFUlMsICAgIEVCTUxfTkVTVCwgMCwgMCwgeyAubiA9IG1hdHJvc2thX2NoYXB0ZXJzIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NVRVMsICAgICAgICBFQk1MX05FU1QsIDAsIDAsIHsgLm4gPSBtYXRyb3NrYV9pbmRleCB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9UQUdTLCAgICAgICAgRUJNTF9ORVNULCAwLCAwLCB7IC5uID0gbWF0cm9za2FfdGFncyB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9TRUVLSEVBRCwgICAgRUJNTF9ORVNULCAwLCAwLCB7IC5uID0gbWF0cm9za2Ffc2Vla2hlYWQgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfQ0xVU1RFUiwgICAgIEVCTUxfU1RPUCB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBtYXRyb3NrYV9zZWdtZW50c1tdID0geworICAgIHsgTUFUUk9TS0FfSURfU0VHTUVOVCwgRUJNTF9ORVNULCAwLCAwLCB7IC5uID0gbWF0cm9za2Ffc2VnbWVudCB9IH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX2Jsb2NrbW9yZVtdID0geworICAgIHsgTUFUUk9TS0FfSURfQkxPQ0tBRERJRCwgICAgICBFQk1MX1VJTlQsIDAsIG9mZnNldG9mKE1hdHJvc2thQmxvY2ssYWRkaXRpb25hbF9pZCkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0JMT0NLQURESVRJT05BTCwgRUJNTF9CSU4sICAwLCBvZmZzZXRvZihNYXRyb3NrYUJsb2NrLGFkZGl0aW9uYWwpIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX2Jsb2NrYWRkaXRpb25zW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9CTE9DS01PUkUsIEVCTUxfTkVTVCwgMCwgMCwgey5uID0gbWF0cm9za2FfYmxvY2ttb3JlfSB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBtYXRyb3NrYV9ibG9ja2dyb3VwW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9CTE9DSywgICAgICAgICAgRUJNTF9CSU4sICAwLCBvZmZzZXRvZihNYXRyb3NrYUJsb2NrLCBiaW4pIH0sCisgICAgeyBNQVRST1NLQV9JRF9CTE9DS0FERElUSU9OUywgRUJNTF9ORVNULCAwLCAwLCB7IC5uID0gbWF0cm9za2FfYmxvY2thZGRpdGlvbnN9IH0sCisgICAgeyBNQVRST1NLQV9JRF9TSU1QTEVCTE9DSywgICAgRUJNTF9CSU4sICAwLCBvZmZzZXRvZihNYXRyb3NrYUJsb2NrLCBiaW4pIH0sCisgICAgeyBNQVRST1NLQV9JRF9CTE9DS0RVUkFUSU9OLCAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYUJsb2NrLCBkdXJhdGlvbikgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0RJU0NBUkRQQURESU5HLCBFQk1MX1NJTlQsIDAsIG9mZnNldG9mKE1hdHJvc2thQmxvY2ssIGRpc2NhcmRfcGFkZGluZykgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0JMT0NLUkVGRVJFTkNFLCBFQk1MX1NJTlQsIDAsIG9mZnNldG9mKE1hdHJvc2thQmxvY2ssIHJlZmVyZW5jZSkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NPREVDU1RBVEUsICAgICBFQk1MX05PTkUgfSwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBFQk1MX1VJTlQsIDAsIG9mZnNldG9mKE1hdHJvc2thQmxvY2ssIG5vbl9zaW1wbGUpLCB7IC51ID0gMSB9IH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX2NsdXN0ZXJbXSA9IHsKKyAgICB7IE1BVFJPU0tBX0lEX0NMVVNURVJUSU1FQ09ERSwgRUJNTF9VSU5ULCAwLCAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKE1hdHJvc2thQ2x1c3RlciwgdGltZWNvZGUpIH0sCisgICAgeyBNQVRST1NLQV9JRF9CTE9DS0dST1VQLCAgICAgIEVCTUxfTkVTVCwgc2l6ZW9mKE1hdHJvc2thQmxvY2spLCBvZmZzZXRvZihNYXRyb3NrYUNsdXN0ZXIsIGJsb2NrcyksIHsgLm4gPSBtYXRyb3NrYV9ibG9ja2dyb3VwIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1NJTVBMRUJMT0NLLCAgICAgRUJNTF9QQVNTLCBzaXplb2YoTWF0cm9za2FCbG9jayksIG9mZnNldG9mKE1hdHJvc2thQ2x1c3RlciwgYmxvY2tzKSwgeyAubiA9IG1hdHJvc2thX2Jsb2NrZ3JvdXAgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfQ0xVU1RFUlBPU0lUSU9OLCBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NMVVNURVJQUkVWU0laRSwgRUJNTF9OT05FIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX2NsdXN0ZXJzW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9DTFVTVEVSLCAgRUJNTF9ORVNULCAwLCAwLCB7IC5uID0gbWF0cm9za2FfY2x1c3RlciB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9JTkZPLCAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9DVUVTLCAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9UQUdTLCAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9TRUVLSEVBRCwgRUJNTF9OT05FIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX2NsdXN0ZXJfaW5jcmVtZW50YWxfcGFyc2luZ1tdID0geworICAgIHsgTUFUUk9TS0FfSURfQ0xVU1RFUlRJTUVDT0RFLCBFQk1MX1VJTlQsIDAsICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoTWF0cm9za2FDbHVzdGVyLCB0aW1lY29kZSkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0JMT0NLR1JPVVAsICAgICAgRUJNTF9ORVNULCBzaXplb2YoTWF0cm9za2FCbG9jayksIG9mZnNldG9mKE1hdHJvc2thQ2x1c3RlciwgYmxvY2tzKSwgeyAubiA9IG1hdHJvc2thX2Jsb2NrZ3JvdXAgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfU0lNUExFQkxPQ0ssICAgICBFQk1MX1BBU1MsIHNpemVvZihNYXRyb3NrYUJsb2NrKSwgb2Zmc2V0b2YoTWF0cm9za2FDbHVzdGVyLCBibG9ja3MpLCB7IC5uID0gbWF0cm9za2FfYmxvY2tncm91cCB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9DTFVTVEVSUE9TSVRJT04sIEVCTUxfTk9ORSB9LAorICAgIHsgTUFUUk9TS0FfSURfQ0xVU1RFUlBSRVZTSVpFLCBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0lORk8sICAgICAgICAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9DVUVTLCAgICAgICAgICAgIEVCTUxfTk9ORSB9LAorICAgIHsgTUFUUk9TS0FfSURfVEFHUywgICAgICAgICAgICBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX1NFRUtIRUFELCAgICAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9DTFVTVEVSLCAgICAgICAgIEVCTUxfU1RPUCB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgRWJtbFN5bnRheCBtYXRyb3NrYV9jbHVzdGVyX2luY3JlbWVudGFsW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9DTFVTVEVSVElNRUNPREUsIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FDbHVzdGVyLCB0aW1lY29kZSkgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0JMT0NLR1JPVVAsICAgICAgRUJNTF9TVE9QIH0sCisgICAgeyBNQVRST1NLQV9JRF9TSU1QTEVCTE9DSywgICAgIEVCTUxfU1RPUCB9LAorICAgIHsgTUFUUk9TS0FfSURfQ0xVU1RFUlBPU0lUSU9OLCBFQk1MX05PTkUgfSwKKyAgICB7IE1BVFJPU0tBX0lEX0NMVVNURVJQUkVWU0laRSwgRUJNTF9OT05FIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBFYm1sU3ludGF4IG1hdHJvc2thX2NsdXN0ZXJzX2luY3JlbWVudGFsW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9DTFVTVEVSLCAgRUJNTF9ORVNULCAwLCAwLCB7IC5uID0gbWF0cm9za2FfY2x1c3Rlcl9pbmNyZW1lbnRhbCB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9JTkZPLCAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9DVUVTLCAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9UQUdTLCAgICAgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9TRUVLSEVBRCwgRUJNTF9OT05FIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtYXRyb3NrYV9kb2N0eXBlc1tdID0geyAibWF0cm9za2EiLCAid2VibSIgfTsKKworc3RhdGljIGludCBtYXRyb3NrYV9yZXN5bmMoTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thLCBpbnQ2NF90IGxhc3RfcG9zKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IG1hdHJvc2thLT5jdHgtPnBiOworICAgIHVpbnQzMl90IGlkOworICAgIG1hdHJvc2thLT5jdXJyZW50X2lkID0gMDsKKyAgICBtYXRyb3NrYS0+bnVtX2xldmVscyA9IDA7CisKKyAgICAvKiBzZWVrIHRvIG5leHQgcG9zaXRpb24gdG8gcmVzeW5jIGZyb20gKi8KKyAgICBpZiAoYXZpb19zZWVrKHBiLCBsYXN0X3BvcyArIDEsIFNFRUtfU0VUKSA8IDApCisgICAgICAgIGdvdG8gZW9mOworCisgICAgaWQgPSBhdmlvX3JiMzIocGIpOworCisgICAgLy8gdHJ5IHRvIGZpbmQgYSB0b3BsZXZlbCBlbGVtZW50CisgICAgd2hpbGUgKCFhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgIGlmIChpZCA9PSBNQVRST1NLQV9JRF9JTkZPICAgICB8fCBpZCA9PSBNQVRST1NLQV9JRF9UUkFDS1MgICAgICB8fAorICAgICAgICAgICAgaWQgPT0gTUFUUk9TS0FfSURfQ1VFUyAgICAgfHwgaWQgPT0gTUFUUk9TS0FfSURfVEFHUyAgICAgICAgfHwKKyAgICAgICAgICAgIGlkID09IE1BVFJPU0tBX0lEX1NFRUtIRUFEIHx8IGlkID09IE1BVFJPU0tBX0lEX0FUVEFDSE1FTlRTIHx8CisgICAgICAgICAgICBpZCA9PSBNQVRST1NLQV9JRF9DTFVTVEVSICB8fCBpZCA9PSBNQVRST1NLQV9JRF9DSEFQVEVSUykgeworICAgICAgICAgICAgbWF0cm9za2EtPmN1cnJlbnRfaWQgPSBpZDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlkID0gKGlkIDw8IDgpIHwgYXZpb19yOChwYik7CisgICAgfQorCitlb2Y6CisgICAgbWF0cm9za2EtPmRvbmUgPSAxOworICAgIHJldHVybiBBVkVSUk9SX0VPRjsKK30KKworLyoKKyAqIFJldHVybjogV2hldGhlciB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgYSBsZXZlbCBpbiB0aGUgaGllcmFyY2h5IG9yIG5vdC4KKyAqLworc3RhdGljIGludCBlYm1sX2xldmVsX2VuZChNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gbWF0cm9za2EtPmN0eC0+cGI7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgaWYgKG1hdHJvc2thLT5udW1fbGV2ZWxzID4gMCkgeworICAgICAgICBNYXRyb3NrYUxldmVsICpsZXZlbCA9ICZtYXRyb3NrYS0+bGV2ZWxzW21hdHJvc2thLT5udW1fbGV2ZWxzIC0gMV07CisgICAgICAgIGlmIChwb3MgLSBsZXZlbC0+c3RhcnQgPj0gbGV2ZWwtPmxlbmd0aCB8fCBtYXRyb3NrYS0+Y3VycmVudF9pZCkgeworICAgICAgICAgICAgbWF0cm9za2EtPm51bV9sZXZlbHMtLTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICogUmVhZDogYW4gIkVCTUwgbnVtYmVyIiwgd2hpY2ggaXMgZGVmaW5lZCBhcyBhIHZhcmlhYmxlLWxlbmd0aAorICogYXJyYXkgb2YgYnl0ZXMuIFRoZSBmaXJzdCBieXRlIGluZGljYXRlcyB0aGUgbGVuZ3RoIGJ5IGdpdmluZyBhCisgKiBudW1iZXIgb2YgMC1iaXRzIGZvbGxvd2VkIGJ5IGEgb25lLiBUaGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0CisgKiAib25lIiBiaXQgaW5zaWRlIHRoZSBmaXJzdCBieXRlIGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHRoaXMKKyAqIG51bWJlci4KKyAqIFJldHVybnM6IG51bWJlciBvZiBieXRlcyByZWFkLCA8IDAgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBlYm1sX3JlYWRfbnVtKE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSwgQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfc2l6ZSwgdWludDY0X3QgKm51bWJlcikKK3sKKyAgICBpbnQgcmVhZCA9IDEsIG4gPSAxOworICAgIHVpbnQ2NF90IHRvdGFsID0gMDsKKworICAgIC8qIFRoZSBmaXJzdCBieXRlIHRlbGxzIHVzIHRoZSBsZW5ndGggaW4gYnl0ZXMgLSBhdmlvX3I4KCkgY2FuIG5vcm1hbGx5CisgICAgICogcmV0dXJuIDAsIGJ1dCBzaW5jZSB0aGF0J3Mgbm90IGEgdmFsaWQgZmlyc3QgZWJtbElEIGJ5dGUsIHdlIGNhbgorICAgICAqIHVzZSBpdCBzYWZlbHkgaGVyZSB0byBjYXRjaCBFT1MuICovCisgICAgaWYgKCEodG90YWwgPSBhdmlvX3I4KHBiKSkpIHsKKyAgICAgICAgLyogd2UgbWlnaHQgZW5jb3VudGVyIEVPUyBoZXJlICovCisgICAgICAgIGlmICghYXZpb19mZW9mKHBiKSkgeworICAgICAgICAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiUmVhZCBlcnJvciBhdCBwb3MuICUiUFJJdTY0IiAoMHglIlBSSXg2NCIpXG4iLAorICAgICAgICAgICAgICAgICAgIHBvcywgcG9zKTsKKyAgICAgICAgICAgIHJldHVybiBwYi0+ZXJyb3IgPyBwYi0+ZXJyb3IgOiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0KKworICAgIC8qIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBFQk1MIG51bWJlciAqLworICAgIHJlYWQgPSA4IC0gZmZfbG9nMl90YWJbdG90YWxdOworICAgIGlmIChyZWFkID4gbWF4X3NpemUpIHsKKyAgICAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpIC0gMTsKKyAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIEVCTUwgbnVtYmVyIHNpemUgdGFnIDB4JTAyeCBhdCBwb3MgJSJQUkl1NjQiICgweCUiUFJJeDY0IilcbiIsCisgICAgICAgICAgICAgICAodWludDhfdCkgdG90YWwsIHBvcywgcG9zKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogcmVhZCBvdXQgbGVuZ3RoICovCisgICAgdG90YWwgXj0gMSA8PCBmZl9sb2cyX3RhYlt0b3RhbF07CisgICAgd2hpbGUgKG4rKyA8IHJlYWQpCisgICAgICAgIHRvdGFsID0gKHRvdGFsIDw8IDgpIHwgYXZpb19yOChwYik7CisKKyAgICAqbnVtYmVyID0gdG90YWw7CisKKyAgICByZXR1cm4gcmVhZDsKK30KKworLyoqCisgKiBSZWFkIGEgRUJNTCBsZW5ndGggdmFsdWUuCisgKiBUaGlzIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSAidW5rbm93biBsZW5ndGgiIGNhc2Ugd2hpY2ggaGFzIG11bHRpcGxlCisgKiBlbmNvZGluZ3MuCisgKi8KK3N0YXRpYyBpbnQgZWJtbF9yZWFkX2xlbmd0aChNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqbnVtYmVyKQoreworICAgIGludCByZXMgPSBlYm1sX3JlYWRfbnVtKG1hdHJvc2thLCBwYiwgOCwgbnVtYmVyKTsKKyAgICBpZiAocmVzID4gMCAmJiAqbnVtYmVyICsgMSA9PSAxVUxMIDw8ICg3ICogcmVzKSkKKyAgICAgICAgKm51bWJlciA9IDB4ZmZmZmZmZmZmZmZmZmZVTEw7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgZWxlbWVudCBhcyBhbiB1bnNpZ25lZCBpbnQuCisgKiAwIGlzIHN1Y2Nlc3MsIDwgMCBpcyBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGVibWxfcmVhZF91aW50KEFWSU9Db250ZXh0ICpwYiwgaW50IHNpemUsIHVpbnQ2NF90ICpudW0pCit7CisgICAgaW50IG4gPSAwOworCisgICAgaWYgKHNpemUgPiA4KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIGJpZy1lbmRpYW4gb3JkZXJpbmc7IGJ1aWxkIHVwIG51bWJlciAqLworICAgICpudW0gPSAwOworICAgIHdoaWxlIChuKysgPCBzaXplKQorICAgICAgICAqbnVtID0gKCpudW0gPDwgOCkgfCBhdmlvX3I4KHBiKTsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogUmVhZCB0aGUgbmV4dCBlbGVtZW50IGFzIGEgc2lnbmVkIGludC4KKyAqIDAgaXMgc3VjY2VzcywgPCAwIGlzIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgZWJtbF9yZWFkX3NpbnQoQVZJT0NvbnRleHQgKnBiLCBpbnQgc2l6ZSwgaW50NjRfdCAqbnVtKQoreworICAgIGludCBuID0gMTsKKworICAgIGlmIChzaXplID4gOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICpudW0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgICpudW0gPSBzaWduX2V4dGVuZChhdmlvX3I4KHBiKSwgOCk7CisKKyAgICAgICAgLyogYmlnLWVuZGlhbiBvcmRlcmluZzsgYnVpbGQgdXAgbnVtYmVyICovCisgICAgICAgIHdoaWxlIChuKysgPCBzaXplKQorICAgICAgICAgICAgKm51bSA9ICgqbnVtIDw8IDgpIHwgYXZpb19yOChwYik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQgYXMgYSBmbG9hdC4KKyAqIDAgaXMgc3VjY2VzcywgPCAwIGlzIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgZWJtbF9yZWFkX2Zsb2F0KEFWSU9Db250ZXh0ICpwYiwgaW50IHNpemUsIGRvdWJsZSAqbnVtKQoreworICAgIGlmIChzaXplID09IDApCisgICAgICAgICpudW0gPSAwOworICAgIGVsc2UgaWYgKHNpemUgPT0gNCkKKyAgICAgICAgKm51bSA9IGF2X2ludDJmbG9hdChhdmlvX3JiMzIocGIpKTsKKyAgICBlbHNlIGlmIChzaXplID09IDgpCisgICAgICAgICpudW0gPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgZWxlbWVudCBhcyBhbiBBU0NJSSBzdHJpbmcuCisgKiAwIGlzIHN1Y2Nlc3MsIDwgMCBpcyBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGVibWxfcmVhZF9hc2NpaShBVklPQ29udGV4dCAqcGIsIGludCBzaXplLCBjaGFyICoqc3RyKQoreworICAgIGNoYXIgKnJlczsKKworICAgIC8qIEVCTUwgc3RyaW5ncyBhcmUgdXN1YWxseSBub3QgMC10ZXJtaW5hdGVkLCBzbyB3ZSBhbGxvY2F0ZSBvbmUKKyAgICAgKiBieXRlIG1vcmUsIHJlYWQgdGhlIHN0cmluZyBhbmQgTlVMTC10ZXJtaW5hdGUgaXQgb3Vyc2VsdmVzLiAqLworICAgIGlmICghKHJlcyA9IGF2X21hbGxvYyhzaXplICsgMSkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmIChhdmlvX3JlYWQocGIsICh1aW50OF90ICopIHJlcywgc2l6ZSkgIT0gc2l6ZSkgeworICAgICAgICBhdl9mcmVlKHJlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIChyZXMpW3NpemVdID0gJ1wwJzsKKyAgICBhdl9mcmVlKCpzdHIpOworICAgICpzdHIgPSByZXM7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgZWxlbWVudCBhcyBiaW5hcnkgZGF0YS4KKyAqIDAgaXMgc3VjY2VzcywgPCAwIGlzIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgZWJtbF9yZWFkX2JpbmFyeShBVklPQ29udGV4dCAqcGIsIGludCBsZW5ndGgsIEVibWxCaW4gKmJpbikKK3sKKyAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmJpbi0+ZGF0YSwgJmJpbi0+c2l6ZSwgbGVuZ3RoKTsKKyAgICBpZiAoIWJpbi0+ZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGJpbi0+c2l6ZSA9IGxlbmd0aDsKKyAgICBiaW4tPnBvcyAgPSBhdmlvX3RlbGwocGIpOworICAgIGlmIChhdmlvX3JlYWQocGIsIGJpbi0+ZGF0YSwgbGVuZ3RoKSAhPSBsZW5ndGgpIHsKKyAgICAgICAgYXZfZnJlZXAoJmJpbi0+ZGF0YSk7CisgICAgICAgIGJpbi0+c2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQsIGJ1dCBvbmx5IHRoZSBoZWFkZXIuIFRoZSBjb250ZW50cworICogYXJlIHN1cHBvc2VkIHRvIGJlIHN1Yi1lbGVtZW50cyB3aGljaCBjYW4gYmUgcmVhZCBzZXBhcmF0ZWx5LgorICogMCBpcyBzdWNjZXNzLCA8IDAgaXMgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBlYm1sX3JlYWRfbWFzdGVyKE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSwgdWludDY0X3QgbGVuZ3RoKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IG1hdHJvc2thLT5jdHgtPnBiOworICAgIE1hdHJvc2thTGV2ZWwgKmxldmVsOworCisgICAgaWYgKG1hdHJvc2thLT5udW1fbGV2ZWxzID49IEVCTUxfTUFYX0RFUFRIKSB7CisgICAgICAgIGF2X2xvZyhtYXRyb3NrYS0+Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRmlsZSBtb3ZlcyBiZXlvbmQgbWF4LiBhbGxvd2VkIGRlcHRoICglZClcbiIsIEVCTUxfTUFYX0RFUFRIKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICBsZXZlbCAgICAgICAgID0gJm1hdHJvc2thLT5sZXZlbHNbbWF0cm9za2EtPm51bV9sZXZlbHMrK107CisgICAgbGV2ZWwtPnN0YXJ0ICA9IGF2aW9fdGVsbChwYik7CisgICAgbGV2ZWwtPmxlbmd0aCA9IGxlbmd0aDsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogUmVhZCBzaWduZWQvdW5zaWduZWQgIkVCTUwiIG51bWJlcnMuCisgKiBSZXR1cm46IG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQsIDwgMCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IG1hdHJvc2thX2VibWxudW1fdWludChNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhLCB1aW50MzJfdCBzaXplLCB1aW50NjRfdCAqbnVtKQoreworICAgIEFWSU9Db250ZXh0IHBiOworICAgIGZmaW9faW5pdF9jb250ZXh0KCZwYiwgZGF0YSwgc2l6ZSwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIGVibWxfcmVhZF9udW0obWF0cm9za2EsICZwYiwgRkZNSU4oc2l6ZSwgOCksIG51bSk7Cit9CisKKy8qCisgKiBTYW1lIGFzIGFib3ZlLCBidXQgc2lnbmVkLgorICovCitzdGF0aWMgaW50IG1hdHJvc2thX2VibWxudW1fc2ludChNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhLCB1aW50MzJfdCBzaXplLCBpbnQ2NF90ICpudW0pCit7CisgICAgdWludDY0X3QgdW51bTsKKyAgICBpbnQgcmVzOworCisgICAgLyogcmVhZCBhcyB1bnNpZ25lZCBudW1iZXIgZmlyc3QgKi8KKyAgICBpZiAoKHJlcyA9IG1hdHJvc2thX2VibWxudW1fdWludChtYXRyb3NrYSwgZGF0YSwgc2l6ZSwgJnVudW0pKSA8IDApCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICAvKiBtYWtlIHNpZ25lZCAod2VpcmQgd2F5KSAqLworICAgICpudW0gPSB1bnVtIC0gKCgxTEwgPDwgKDcgKiByZXMgLSAxKSkgLSAxKTsKKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgZWJtbF9wYXJzZV9lbGVtKE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVibWxTeW50YXggKnN5bnRheCwgdm9pZCAqZGF0YSk7CisKK3N0YXRpYyBpbnQgZWJtbF9wYXJzZV9pZChNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsIEVibWxTeW50YXggKnN5bnRheCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCwgdm9pZCAqZGF0YSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBzeW50YXhbaV0uaWQ7IGkrKykKKyAgICAgICAgaWYgKGlkID09IHN5bnRheFtpXS5pZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmICghc3ludGF4W2ldLmlkICYmIGlkID09IE1BVFJPU0tBX0lEX0NMVVNURVIgJiYKKyAgICAgICAgbWF0cm9za2EtPm51bV9sZXZlbHMgPiAwICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgIG1hdHJvc2thLT5sZXZlbHNbbWF0cm9za2EtPm51bV9sZXZlbHMgLSAxXS5sZW5ndGggPT0gMHhmZmZmZmZmZmZmZmZmZikKKyAgICAgICAgcmV0dXJuIDA7ICAvLyB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgYW4gdW5rbm93biBzaXplIGNsdXN0ZXIKKyAgICBpZiAoIXN5bnRheFtpXS5pZCAmJiBpZCAhPSBFQk1MX0lEX1ZPSUQgJiYgaWQgIT0gRUJNTF9JRF9DUkMzMikgeworICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX0lORk8sICJVbmtub3duIGVudHJ5IDB4JSJQUklYMzIiXG4iLCBpZCk7CisgICAgICAgIGlmIChtYXRyb3NrYS0+Y3R4LT5lcnJvcl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcmV0dXJuIGVibWxfcGFyc2VfZWxlbShtYXRyb3NrYSwgJnN5bnRheFtpXSwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgZWJtbF9wYXJzZShNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsIEVibWxTeW50YXggKnN5bnRheCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworICAgIGlmICghbWF0cm9za2EtPmN1cnJlbnRfaWQpIHsKKyAgICAgICAgdWludDY0X3QgaWQ7CisgICAgICAgIGludCByZXMgPSBlYm1sX3JlYWRfbnVtKG1hdHJvc2thLCBtYXRyb3NrYS0+Y3R4LT5wYiwgNCwgJmlkKTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICBtYXRyb3NrYS0+Y3VycmVudF9pZCA9IGlkIHwgMSA8PCA3ICogcmVzOworICAgIH0KKyAgICByZXR1cm4gZWJtbF9wYXJzZV9pZChtYXRyb3NrYSwgc3ludGF4LCBtYXRyb3NrYS0+Y3VycmVudF9pZCwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgZWJtbF9wYXJzZV9uZXN0KE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSwgRWJtbFN5bnRheCAqc3ludGF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgICBpbnQgaSwgcmVzID0gMDsKKworICAgIGZvciAoaSA9IDA7IHN5bnRheFtpXS5pZDsgaSsrKQorICAgICAgICBzd2l0Y2ggKHN5bnRheFtpXS50eXBlKSB7CisgICAgICAgIGNhc2UgRUJNTF9VSU5UOgorICAgICAgICAgICAgKih1aW50NjRfdCAqKSAoKGNoYXIgKikgZGF0YSArIHN5bnRheFtpXS5kYXRhX29mZnNldCkgPSBzeW50YXhbaV0uZGVmLnU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQk1MX0ZMT0FUOgorICAgICAgICAgICAgKihkb3VibGUgKikgKChjaGFyICopIGRhdGEgKyBzeW50YXhbaV0uZGF0YV9vZmZzZXQpID0gc3ludGF4W2ldLmRlZi5mOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUJNTF9TVFI6CisgICAgICAgIGNhc2UgRUJNTF9VVEY4OgorICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgbWF5IGJlIE5VTEwKKyAgICAgICAgICAgIGlmIChzeW50YXhbaV0uZGVmLnMpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICoqZHN0ID0gKHVpbnQ4X3QgKiopICgodWludDhfdCAqKSBkYXRhICsgc3ludGF4W2ldLmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAqZHN0ID0gYXZfc3RyZHVwKHN5bnRheFtpXS5kZWYucyk7CisgICAgICAgICAgICAgICAgaWYgKCEqZHN0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIHdoaWxlICghcmVzICYmICFlYm1sX2xldmVsX2VuZChtYXRyb3NrYSkpCisgICAgICAgIHJlcyA9IGVibWxfcGFyc2UobWF0cm9za2EsIHN5bnRheCwgZGF0YSk7CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGVibWxfcGFyc2VfZWxlbShNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFYm1sU3ludGF4ICpzeW50YXgsIHZvaWQgKmRhdGEpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IG1heF9sZW5ndGhzW0VCTUxfVFlQRV9DT1VOVF0gPSB7CisgICAgICAgIFtFQk1MX1VJTlRdICA9IDgsCisgICAgICAgIFtFQk1MX0ZMT0FUXSA9IDgsCisgICAgICAgIC8vIG1heC4gMTYgTUIgZm9yIHN0cmluZ3MKKyAgICAgICAgW0VCTUxfU1RSXSAgID0gMHgxMDAwMDAwLAorICAgICAgICBbRUJNTF9VVEY4XSAgPSAweDEwMDAwMDAsCisgICAgICAgIC8vIG1heC4gMjU2IE1CIGZvciBiaW5hcnkgZGF0YQorICAgICAgICBbRUJNTF9CSU5dICAgPSAweDEwMDAwMDAwLAorICAgICAgICAvLyBubyBsaW1pdHMgZm9yIGFueXRoaW5nIGVsc2UKKyAgICB9OworICAgIEFWSU9Db250ZXh0ICpwYiA9IG1hdHJvc2thLT5jdHgtPnBiOworICAgIHVpbnQzMl90IGlkID0gc3ludGF4LT5pZDsKKyAgICB1aW50NjRfdCBsZW5ndGg7CisgICAgaW50IHJlczsKKyAgICB2b2lkICpuZXdlbGVtOworCisgICAgZGF0YSA9IChjaGFyICopIGRhdGEgKyBzeW50YXgtPmRhdGFfb2Zmc2V0OworICAgIGlmIChzeW50YXgtPmxpc3RfZWxlbV9zaXplKSB7CisgICAgICAgIEVibWxMaXN0ICpsaXN0ID0gZGF0YTsKKyAgICAgICAgbmV3ZWxlbSA9IGF2X3JlYWxsb2NfYXJyYXkobGlzdC0+ZWxlbSwgbGlzdC0+bmJfZWxlbSArIDEsIHN5bnRheC0+bGlzdF9lbGVtX3NpemUpOworICAgICAgICBpZiAoIW5ld2VsZW0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBsaXN0LT5lbGVtID0gbmV3ZWxlbTsKKyAgICAgICAgZGF0YSA9IChjaGFyICopIGxpc3QtPmVsZW0gKyBsaXN0LT5uYl9lbGVtICogc3ludGF4LT5saXN0X2VsZW1fc2l6ZTsKKyAgICAgICAgbWVtc2V0KGRhdGEsIDAsIHN5bnRheC0+bGlzdF9lbGVtX3NpemUpOworICAgICAgICBsaXN0LT5uYl9lbGVtKys7CisgICAgfQorCisgICAgaWYgKHN5bnRheC0+dHlwZSAhPSBFQk1MX1BBU1MgJiYgc3ludGF4LT50eXBlICE9IEVCTUxfU1RPUCkgeworICAgICAgICBtYXRyb3NrYS0+Y3VycmVudF9pZCA9IDA7CisgICAgICAgIGlmICgocmVzID0gZWJtbF9yZWFkX2xlbmd0aChtYXRyb3NrYSwgcGIsICZsZW5ndGgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICBpZiAobWF4X2xlbmd0aHNbc3ludGF4LT50eXBlXSAmJiBsZW5ndGggPiBtYXhfbGVuZ3Roc1tzeW50YXgtPnR5cGVdKSB7CisgICAgICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGxlbmd0aCAweCUiUFJJeDY0IiA+IDB4JSJQUkl4NjQiIGZvciBzeW50YXggZWxlbWVudCAlaVxuIiwKKyAgICAgICAgICAgICAgICAgICBsZW5ndGgsIG1heF9sZW5ndGhzW3N5bnRheC0+dHlwZV0sIHN5bnRheC0+dHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoc3ludGF4LT50eXBlKSB7CisgICAgY2FzZSBFQk1MX1VJTlQ6CisgICAgICAgIHJlcyA9IGVibWxfcmVhZF91aW50KHBiLCBsZW5ndGgsIGRhdGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVCTUxfU0lOVDoKKyAgICAgICAgcmVzID0gZWJtbF9yZWFkX3NpbnQocGIsIGxlbmd0aCwgZGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUJNTF9GTE9BVDoKKyAgICAgICAgcmVzID0gZWJtbF9yZWFkX2Zsb2F0KHBiLCBsZW5ndGgsIGRhdGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVCTUxfU1RSOgorICAgIGNhc2UgRUJNTF9VVEY4OgorICAgICAgICByZXMgPSBlYm1sX3JlYWRfYXNjaWkocGIsIGxlbmd0aCwgZGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUJNTF9CSU46CisgICAgICAgIHJlcyA9IGVibWxfcmVhZF9iaW5hcnkocGIsIGxlbmd0aCwgZGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUJNTF9ORVNUOgorICAgICAgICBpZiAoKHJlcyA9IGVibWxfcmVhZF9tYXN0ZXIobWF0cm9za2EsIGxlbmd0aCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIGlmIChpZCA9PSBNQVRST1NLQV9JRF9TRUdNRU5UKQorICAgICAgICAgICAgbWF0cm9za2EtPnNlZ21lbnRfc3RhcnQgPSBhdmlvX3RlbGwobWF0cm9za2EtPmN0eC0+cGIpOworICAgICAgICByZXR1cm4gZWJtbF9wYXJzZV9uZXN0KG1hdHJvc2thLCBzeW50YXgtPmRlZi5uLCBkYXRhKTsKKyAgICBjYXNlIEVCTUxfUEFTUzoKKyAgICAgICAgcmV0dXJuIGVibWxfcGFyc2VfaWQobWF0cm9za2EsIHN5bnRheC0+ZGVmLm4sIGlkLCBkYXRhKTsKKyAgICBjYXNlIEVCTUxfU1RPUDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGZmaW9fbGltaXQocGIsIGxlbmd0aCkgIT0gbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgcmV0dXJuIGF2aW9fc2tpcChwYiwgbGVuZ3RoKSA8IDAgPyBBVkVSUk9SKEVJTykgOiAwOworICAgIH0KKyAgICBpZiAocmVzID09IEFWRVJST1JfSU5WQUxJRERBVEEpCisgICAgICAgIGF2X2xvZyhtYXRyb3NrYS0+Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGVsZW1lbnRcbiIpOworICAgIGVsc2UgaWYgKHJlcyA9PSBBVkVSUk9SKEVJTykpCisgICAgICAgIGF2X2xvZyhtYXRyb3NrYS0+Y3R4LCBBVl9MT0dfRVJST1IsICJSZWFkIGVycm9yXG4iKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBlYm1sX2ZyZWUoRWJtbFN5bnRheCAqc3ludGF4LCB2b2lkICpkYXRhKQoreworICAgIGludCBpLCBqOworICAgIGZvciAoaSA9IDA7IHN5bnRheFtpXS5pZDsgaSsrKSB7CisgICAgICAgIHZvaWQgKmRhdGFfb2ZmID0gKGNoYXIgKikgZGF0YSArIHN5bnRheFtpXS5kYXRhX29mZnNldDsKKyAgICAgICAgc3dpdGNoIChzeW50YXhbaV0udHlwZSkgeworICAgICAgICBjYXNlIEVCTUxfU1RSOgorICAgICAgICBjYXNlIEVCTUxfVVRGODoKKyAgICAgICAgICAgIGF2X2ZyZWVwKGRhdGFfb2ZmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVCTUxfQklOOgorICAgICAgICAgICAgYXZfZnJlZXAoJigoRWJtbEJpbiAqKSBkYXRhX29mZiktPmRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUJNTF9ORVNUOgorICAgICAgICAgICAgaWYgKHN5bnRheFtpXS5saXN0X2VsZW1fc2l6ZSkgeworICAgICAgICAgICAgICAgIEVibWxMaXN0ICpsaXN0ID0gZGF0YV9vZmY7CisgICAgICAgICAgICAgICAgY2hhciAqcHRyID0gbGlzdC0+ZWxlbTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGlzdC0+bmJfZWxlbTsKKyAgICAgICAgICAgICAgICAgICAgIGorKywgcHRyICs9IHN5bnRheFtpXS5saXN0X2VsZW1fc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgZWJtbF9mcmVlKHN5bnRheFtpXS5kZWYubiwgcHRyKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKGxpc3QtPmVsZW0pOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgZWJtbF9mcmVlKHN5bnRheFtpXS5kZWYubiwgZGF0YV9vZmYpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBBdXRvZGV0ZWN0aW5nLi4uCisgKi8KK3N0YXRpYyBpbnQgbWF0cm9za2FfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgdWludDY0X3QgdG90YWwgPSAwOworICAgIGludCBsZW5fbWFzayA9IDB4ODAsIHNpemUgPSAxLCBuID0gMSwgaTsKKworICAgIC8qIEVCTUwgaGVhZGVyPyAqLworICAgIGlmIChBVl9SQjMyKHAtPmJ1ZikgIT0gRUJNTF9JRF9IRUFERVIpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogbGVuZ3RoIG9mIGhlYWRlciAqLworICAgIHRvdGFsID0gcC0+YnVmWzRdOworICAgIHdoaWxlIChzaXplIDw9IDggJiYgISh0b3RhbCAmIGxlbl9tYXNrKSkgeworICAgICAgICBzaXplKys7CisgICAgICAgIGxlbl9tYXNrID4+PSAxOworICAgIH0KKyAgICBpZiAoc2l6ZSA+IDgpCisgICAgICAgIHJldHVybiAwOworICAgIHRvdGFsICY9IChsZW5fbWFzayAtIDEpOworICAgIHdoaWxlIChuIDwgc2l6ZSkKKyAgICAgICAgdG90YWwgPSAodG90YWwgPDwgOCkgfCBwLT5idWZbNCArIG4rK107CisKKyAgICAvKiBEb2VzIHRoZSBwcm9iZSBkYXRhIGNvbnRhaW4gdGhlIHdob2xlIGhlYWRlcj8gKi8KKyAgICBpZiAocC0+YnVmX3NpemUgPCA0ICsgc2l6ZSArIHRvdGFsKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gYSBrbm93biBkb2N1bWVudCB0eXBlLiBGb3Igbm93LAorICAgICAqIHdlIGRvbid0IHBhcnNlIHRoZSB3aG9sZSBoZWFkZXIgYnV0IHNpbXBseSBjaGVjayBmb3IgdGhlCisgICAgICogYXZhaWxhYmlsaXR5IG9mIHRoYXQgYXJyYXkgb2YgY2hhcmFjdGVycyBpbnNpZGUgdGhlIGhlYWRlci4KKyAgICAgKiBOb3QgZnVsbHkgZm9vbC1wcm9vZiwgYnV0IGdvb2QgZW5vdWdoLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhtYXRyb3NrYV9kb2N0eXBlcyk7IGkrKykgeworICAgICAgICBpbnQgcHJvYmVsZW4gPSBzdHJsZW4obWF0cm9za2FfZG9jdHlwZXNbaV0pOworICAgICAgICBpZiAodG90YWwgPCBwcm9iZWxlbikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKG4gPSA0ICsgc2l6ZTsgbiA8PSA0ICsgc2l6ZSArIHRvdGFsIC0gcHJvYmVsZW47IG4rKykKKyAgICAgICAgICAgIGlmICghbWVtY21wKHAtPmJ1ZiArIG4sIG1hdHJvc2thX2RvY3R5cGVzW2ldLCBwcm9iZWxlbikpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIH0KKworICAgIC8vIHByb2JhYmx5IHZhbGlkIEVCTUwgaGVhZGVyIGJ1dCBubyByZWNvZ25pemVkIGRvY3R5cGUKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047Cit9CisKK3N0YXRpYyBNYXRyb3NrYVRyYWNrICptYXRyb3NrYV9maW5kX3RyYWNrX2J5X251bShNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bSkKK3sKKyAgICBNYXRyb3NrYVRyYWNrICp0cmFja3MgPSBtYXRyb3NrYS0+dHJhY2tzLmVsZW07CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF0cm9za2EtPnRyYWNrcy5uYl9lbGVtOyBpKyspCisgICAgICAgIGlmICh0cmFja3NbaV0ubnVtID09IG51bSkKKyAgICAgICAgICAgIHJldHVybiAmdHJhY2tzW2ldOworCisgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdHJhY2sgbnVtYmVyICVkXG4iLCBudW0pOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG1hdHJvc2thX2RlY29kZV9idWZmZXIodWludDhfdCAqKmJ1ZiwgaW50ICpidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyb3NrYVRyYWNrICp0cmFjaykKK3sKKyAgICBNYXRyb3NrYVRyYWNrRW5jb2RpbmcgKmVuY29kaW5ncyA9IHRyYWNrLT5lbmNvZGluZ3MuZWxlbTsKKyAgICB1aW50OF90ICpkYXRhID0gKmJ1ZjsKKyAgICBpbnQgaXNpemUgPSAqYnVmX3NpemU7CisgICAgdWludDhfdCAqcGt0X2RhdGEgPSBOVUxMOworICAgIHVpbnQ4X3QgYXZfdW51c2VkICpuZXdwa3RkYXRhOworICAgIGludCBwa3Rfc2l6ZSA9IGlzaXplOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBvbGVuOworCisgICAgaWYgKHBrdF9zaXplID49IDEwMDAwMDAwVSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzd2l0Y2ggKGVuY29kaW5nc1swXS5jb21wcmVzc2lvbi5hbGdvKSB7CisgICAgY2FzZSBNQVRST1NLQV9UUkFDS19FTkNPRElOR19DT01QX0hFQURFUlNUUklQOgorICAgIHsKKyAgICAgICAgaW50IGhlYWRlcl9zaXplID0gZW5jb2RpbmdzWzBdLmNvbXByZXNzaW9uLnNldHRpbmdzLnNpemU7CisgICAgICAgIHVpbnQ4X3QgKmhlYWRlciA9IGVuY29kaW5nc1swXS5jb21wcmVzc2lvbi5zZXR0aW5ncy5kYXRhOworCisgICAgICAgIGlmIChoZWFkZXJfc2l6ZSAmJiAhaGVhZGVyKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ29tcHJlc3Npb24gc2l6ZSBidXQgbm8gZGF0YSBpbiBoZWFkZXJzdHJpcFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWhlYWRlcl9zaXplKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgcGt0X3NpemUgPSBpc2l6ZSArIGhlYWRlcl9zaXplOworICAgICAgICBwa3RfZGF0YSA9IGF2X21hbGxvYyhwa3Rfc2l6ZSk7CisgICAgICAgIGlmICghcGt0X2RhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIG1lbWNweShwa3RfZGF0YSwgaGVhZGVyLCBoZWFkZXJfc2l6ZSk7CisgICAgICAgIG1lbWNweShwa3RfZGF0YSArIGhlYWRlcl9zaXplLCBkYXRhLCBpc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNpZiBDT05GSUdfTFpPCisgICAgY2FzZSBNQVRST1NLQV9UUkFDS19FTkNPRElOR19DT01QX0xaTzoKKyAgICAgICAgZG8geworICAgICAgICAgICAgb2xlbiAgICAgICA9IHBrdF9zaXplICo9IDM7CisgICAgICAgICAgICBuZXdwa3RkYXRhID0gYXZfcmVhbGxvYyhwa3RfZGF0YSwgcGt0X3NpemUgKyBBVl9MWk9fT1VUUFVUX1BBRERJTkcpOworICAgICAgICAgICAgaWYgKCFuZXdwa3RkYXRhKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGt0X2RhdGEgPSBuZXdwa3RkYXRhOworICAgICAgICAgICAgcmVzdWx0ICAgPSBhdl9sem8xeF9kZWNvZGUocGt0X2RhdGEsICZvbGVuLCBkYXRhLCAmaXNpemUpOworICAgICAgICB9IHdoaWxlIChyZXN1bHQgPT0gQVZfTFpPX09VVFBVVF9GVUxMICYmIHBrdF9zaXplIDwgMTAwMDAwMDApOworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICByZXN1bHQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgcGt0X3NpemUgLT0gb2xlbjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfWkxJQgorICAgIGNhc2UgTUFUUk9TS0FfVFJBQ0tfRU5DT0RJTkdfQ09NUF9aTElCOgorICAgIHsKKyAgICAgICAgel9zdHJlYW0genN0cmVhbSA9IHsgMCB9OworICAgICAgICBpZiAoaW5mbGF0ZUluaXQoJnpzdHJlYW0pICE9IFpfT0spCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHpzdHJlYW0ubmV4dF9pbiAgPSBkYXRhOworICAgICAgICB6c3RyZWFtLmF2YWlsX2luID0gaXNpemU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHBrdF9zaXplICAqPSAzOworICAgICAgICAgICAgbmV3cGt0ZGF0YSA9IGF2X3JlYWxsb2MocGt0X2RhdGEsIHBrdF9zaXplKTsKKyAgICAgICAgICAgIGlmICghbmV3cGt0ZGF0YSkgeworICAgICAgICAgICAgICAgIGluZmxhdGVFbmQoJnpzdHJlYW0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGt0X2RhdGEgICAgICAgICAgPSBuZXdwa3RkYXRhOworICAgICAgICAgICAgenN0cmVhbS5hdmFpbF9vdXQgPSBwa3Rfc2l6ZSAtIHpzdHJlYW0udG90YWxfb3V0OworICAgICAgICAgICAgenN0cmVhbS5uZXh0X291dCAgPSBwa3RfZGF0YSArIHpzdHJlYW0udG90YWxfb3V0OworICAgICAgICAgICAgaWYgKHBrdF9kYXRhKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5mbGF0ZSgmenN0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBaX01FTV9FUlJPUjsKKyAgICAgICAgfSB3aGlsZSAocmVzdWx0ID09IFpfT0sgJiYgcGt0X3NpemUgPCAxMDAwMDAwMCk7CisgICAgICAgIHBrdF9zaXplID0genN0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgIGluZmxhdGVFbmQoJnpzdHJlYW0pOworICAgICAgICBpZiAocmVzdWx0ICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBaX01FTV9FUlJPUikKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorI2lmIENPTkZJR19CWkxJQgorICAgIGNhc2UgTUFUUk9TS0FfVFJBQ0tfRU5DT0RJTkdfQ09NUF9CWkxJQjoKKyAgICB7CisgICAgICAgIGJ6X3N0cmVhbSBienN0cmVhbSA9IHsgMCB9OworICAgICAgICBpZiAoQloyX2J6RGVjb21wcmVzc0luaXQoJmJ6c3RyZWFtLCAwLCAwKSAhPSBCWl9PSykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnpzdHJlYW0ubmV4dF9pbiAgPSBkYXRhOworICAgICAgICBienN0cmVhbS5hdmFpbF9pbiA9IGlzaXplOworICAgICAgICBkbyB7CisgICAgICAgICAgICBwa3Rfc2l6ZSAgKj0gMzsKKyAgICAgICAgICAgIG5ld3BrdGRhdGEgPSBhdl9yZWFsbG9jKHBrdF9kYXRhLCBwa3Rfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIW5ld3BrdGRhdGEpIHsKKyAgICAgICAgICAgICAgICBCWjJfYnpEZWNvbXByZXNzRW5kKCZienN0cmVhbSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwa3RfZGF0YSAgICAgICAgICAgPSBuZXdwa3RkYXRhOworICAgICAgICAgICAgYnpzdHJlYW0uYXZhaWxfb3V0ID0gcGt0X3NpemUgLSBienN0cmVhbS50b3RhbF9vdXRfbG8zMjsKKyAgICAgICAgICAgIGJ6c3RyZWFtLm5leHRfb3V0ICA9IHBrdF9kYXRhICsgYnpzdHJlYW0udG90YWxfb3V0X2xvMzI7CisgICAgICAgICAgICBpZiAocGt0X2RhdGEpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBCWjJfYnpEZWNvbXByZXNzKCZienN0cmVhbSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBCWl9NRU1fRVJST1I7CisgICAgICAgIH0gd2hpbGUgKHJlc3VsdCA9PSBCWl9PSyAmJiBwa3Rfc2l6ZSA8IDEwMDAwMDAwKTsKKyAgICAgICAgcGt0X3NpemUgPSBienN0cmVhbS50b3RhbF9vdXRfbG8zMjsKKyAgICAgICAgQloyX2J6RGVjb21wcmVzc0VuZCgmYnpzdHJlYW0pOworICAgICAgICBpZiAocmVzdWx0ICE9IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQlpfTUVNX0VSUk9SKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgKmJ1ZiAgICAgID0gcGt0X2RhdGE7CisgICAgKmJ1Zl9zaXplID0gcGt0X3NpemU7CisgICAgcmV0dXJuIDA7CisKK2ZhaWxlZDoKKyAgICBhdl9mcmVlKHBrdF9kYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBtYXRyb3NrYV9jb252ZXJ0X3RhZyhBVkZvcm1hdENvbnRleHQgKnMsIEVibWxMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEsIGNoYXIgKnByZWZpeCkKK3sKKyAgICBNYXRyb3NrYVRhZyAqdGFncyA9IGxpc3QtPmVsZW07CisgICAgY2hhciBrZXlbMTAyNF07CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bmJfZWxlbTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcgPSB0YWdzW2ldLmxhbmcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcCh0YWdzW2ldLmxhbmcsICJ1bmQiKSA/IHRhZ3NbaV0ubGFuZyA6IE5VTEw7CisKKyAgICAgICAgaWYgKCF0YWdzW2ldLm5hbWUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlNraXBwaW5nIGludmFsaWQgdGFnIHdpdGggbm8gVGFnTmFtZS5cbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZWZpeCkKKyAgICAgICAgICAgIHNucHJpbnRmKGtleSwgc2l6ZW9mKGtleSksICIlcy8lcyIsIHByZWZpeCwgdGFnc1tpXS5uYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZfc3RybGNweShrZXksIHRhZ3NbaV0ubmFtZSwgc2l6ZW9mKGtleSkpOworICAgICAgICBpZiAodGFnc1tpXS5kZWYgfHwgIWxhbmcpIHsKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KG1ldGFkYXRhLCBrZXksIHRhZ3NbaV0uc3RyaW5nLCAwKTsKKyAgICAgICAgICAgIGlmICh0YWdzW2ldLnN1Yi5uYl9lbGVtKQorICAgICAgICAgICAgICAgIG1hdHJvc2thX2NvbnZlcnRfdGFnKHMsICZ0YWdzW2ldLnN1YiwgbWV0YWRhdGEsIGtleSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxhbmcpIHsKKyAgICAgICAgICAgIGF2X3N0cmxjYXQoa2V5LCAiLSIsIHNpemVvZihrZXkpKTsKKyAgICAgICAgICAgIGF2X3N0cmxjYXQoa2V5LCBsYW5nLCBzaXplb2Yoa2V5KSk7CisgICAgICAgICAgICBhdl9kaWN0X3NldChtZXRhZGF0YSwga2V5LCB0YWdzW2ldLnN0cmluZywgMCk7CisgICAgICAgICAgICBpZiAodGFnc1tpXS5zdWIubmJfZWxlbSkKKyAgICAgICAgICAgICAgICBtYXRyb3NrYV9jb252ZXJ0X3RhZyhzLCAmdGFnc1tpXS5zdWIsIG1ldGFkYXRhLCBrZXkpOworICAgICAgICB9CisgICAgfQorICAgIGZmX21ldGFkYXRhX2NvbnYobWV0YWRhdGEsIE5VTEwsIGZmX21rdl9tZXRhZGF0YV9jb252KTsKK30KKworc3RhdGljIHZvaWQgbWF0cm9za2FfY29udmVydF90YWdzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EgPSBzLT5wcml2X2RhdGE7CisgICAgTWF0cm9za2FUYWdzICp0YWdzID0gbWF0cm9za2EtPnRhZ3MuZWxlbTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXRyb3NrYS0+dGFncy5uYl9lbGVtOyBpKyspIHsKKyAgICAgICAgaWYgKHRhZ3NbaV0udGFyZ2V0LmF0dGFjaHVpZCkgeworICAgICAgICAgICAgTWF0cm9za2FBdHRhY2htZW50ICphdHRhY2htZW50ID0gbWF0cm9za2EtPmF0dGFjaG1lbnRzLmVsZW07CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWF0cm9za2EtPmF0dGFjaG1lbnRzLm5iX2VsZW07IGorKykKKyAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudFtqXS51aWQgPT0gdGFnc1tpXS50YXJnZXQuYXR0YWNodWlkICYmCisgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRbal0uc3RyZWFtKQorICAgICAgICAgICAgICAgICAgICBtYXRyb3NrYV9jb252ZXJ0X3RhZyhzLCAmdGFnc1tpXS50YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRhY2htZW50W2pdLnN0cmVhbS0+bWV0YWRhdGEsIE5VTEwpOworICAgICAgICB9IGVsc2UgaWYgKHRhZ3NbaV0udGFyZ2V0LmNoYXB0ZXJ1aWQpIHsKKyAgICAgICAgICAgIE1hdHJvc2thQ2hhcHRlciAqY2hhcHRlciA9IG1hdHJvc2thLT5jaGFwdGVycy5lbGVtOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1hdHJvc2thLT5jaGFwdGVycy5uYl9lbGVtOyBqKyspCisgICAgICAgICAgICAgICAgaWYgKGNoYXB0ZXJbal0udWlkID09IHRhZ3NbaV0udGFyZ2V0LmNoYXB0ZXJ1aWQgJiYKKyAgICAgICAgICAgICAgICAgICAgY2hhcHRlcltqXS5jaGFwdGVyKQorICAgICAgICAgICAgICAgICAgICBtYXRyb3NrYV9jb252ZXJ0X3RhZyhzLCAmdGFnc1tpXS50YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFwdGVyW2pdLmNoYXB0ZXItPm1ldGFkYXRhLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIGlmICh0YWdzW2ldLnRhcmdldC50cmFja3VpZCkgeworICAgICAgICAgICAgTWF0cm9za2FUcmFjayAqdHJhY2sgPSBtYXRyb3NrYS0+dHJhY2tzLmVsZW07CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWF0cm9za2EtPnRyYWNrcy5uYl9lbGVtOyBqKyspCisgICAgICAgICAgICAgICAgaWYgKHRyYWNrW2pdLnVpZCA9PSB0YWdzW2ldLnRhcmdldC50cmFja3VpZCAmJiB0cmFja1tqXS5zdHJlYW0pCisgICAgICAgICAgICAgICAgICAgIG1hdHJvc2thX2NvbnZlcnRfdGFnKHMsICZ0YWdzW2ldLnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrW2pdLnN0cmVhbS0+bWV0YWRhdGEsIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF0cm9za2FfY29udmVydF90YWcocywgJnRhZ3NbaV0udGFnLCAmcy0+bWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdzW2ldLnRhcmdldC50eXBlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBtYXRyb3NrYV9wYXJzZV9zZWVraGVhZF9lbnRyeShNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHgpCit7CisgICAgRWJtbExpc3QgKnNlZWtoZWFkX2xpc3QgPSAmbWF0cm9za2EtPnNlZWtoZWFkOworICAgIHVpbnQzMl90IGxldmVsX3VwICAgICAgID0gbWF0cm9za2EtPmxldmVsX3VwOworICAgIHVpbnQzMl90IHNhdmVkX2lkICAgICAgID0gbWF0cm9za2EtPmN1cnJlbnRfaWQ7CisgICAgTWF0cm9za2FTZWVraGVhZCAqc2Vla2hlYWQgPSBzZWVraGVhZF9saXN0LT5lbGVtOworICAgIGludDY0X3QgYmVmb3JlX3BvcyA9IGF2aW9fdGVsbChtYXRyb3NrYS0+Y3R4LT5wYik7CisgICAgTWF0cm9za2FMZXZlbCBsZXZlbDsKKyAgICBpbnQ2NF90IG9mZnNldDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChpZHggPj0gc2Vla2hlYWRfbGlzdC0+bmJfZWxlbSAgICAgICAgICAgIHx8CisgICAgICAgIHNlZWtoZWFkW2lkeF0uaWQgPT0gTUFUUk9TS0FfSURfU0VFS0hFQUQgfHwKKyAgICAgICAgc2Vla2hlYWRbaWR4XS5pZCA9PSBNQVRST1NLQV9JRF9DTFVTVEVSKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHNlZWsgKi8KKyAgICBvZmZzZXQgPSBzZWVraGVhZFtpZHhdLnBvcyArIG1hdHJvc2thLT5zZWdtZW50X3N0YXJ0OworICAgIGlmIChhdmlvX3NlZWsobWF0cm9za2EtPmN0eC0+cGIsIG9mZnNldCwgU0VFS19TRVQpID09IG9mZnNldCkgeworICAgICAgICAvKiBXZSBkb24ndCB3YW50IHRvIGxvc2Ugb3VyIHNlZWtoZWFkIGxldmVsLCBzbyB3ZSBhZGQKKyAgICAgICAgICogYSBkdW1teS4gVGhpcyBpcyBhIGNydWRlIGhhY2suICovCisgICAgICAgIGlmIChtYXRyb3NrYS0+bnVtX2xldmVscyA9PSBFQk1MX01BWF9ERVBUSCkgeworICAgICAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJNYXggRUJNTCBlbGVtZW50IGRlcHRoICglZCkgcmVhY2hlZCwgIgorICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcGFyc2UgZnVydGhlci5cbiIsIEVCTUxfTUFYX0RFUFRIKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXZlbC5zdGFydCAgPSAwOworICAgICAgICAgICAgbGV2ZWwubGVuZ3RoID0gKHVpbnQ2NF90KSAtMTsKKyAgICAgICAgICAgIG1hdHJvc2thLT5sZXZlbHNbbWF0cm9za2EtPm51bV9sZXZlbHNdID0gbGV2ZWw7CisgICAgICAgICAgICBtYXRyb3NrYS0+bnVtX2xldmVscysrOworICAgICAgICAgICAgbWF0cm9za2EtPmN1cnJlbnRfaWQgICAgICAgICAgICAgICAgICAgPSAwOworCisgICAgICAgICAgICByZXQgPSBlYm1sX3BhcnNlKG1hdHJvc2thLCBtYXRyb3NrYV9zZWdtZW50LCBtYXRyb3NrYSk7CisKKyAgICAgICAgICAgIC8qIHJlbW92ZSBkdW1teSBsZXZlbCAqLworICAgICAgICAgICAgd2hpbGUgKG1hdHJvc2thLT5udW1fbGV2ZWxzKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgbGVuZ3RoID0gbWF0cm9za2EtPmxldmVsc1stLW1hdHJvc2thLT5udW1fbGV2ZWxzXS5sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAodWludDY0X3QpIC0xKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBzZWVrIGJhY2sgKi8KKyAgICBhdmlvX3NlZWsobWF0cm9za2EtPmN0eC0+cGIsIGJlZm9yZV9wb3MsIFNFRUtfU0VUKTsKKyAgICBtYXRyb3NrYS0+bGV2ZWxfdXAgICA9IGxldmVsX3VwOworICAgIG1hdHJvc2thLT5jdXJyZW50X2lkID0gc2F2ZWRfaWQ7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtYXRyb3NrYV9leGVjdXRlX3NlZWtoZWFkKE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSkKK3sKKyAgICBFYm1sTGlzdCAqc2Vla2hlYWRfbGlzdCA9ICZtYXRyb3NrYS0+c2Vla2hlYWQ7CisgICAgaW50NjRfdCBiZWZvcmVfcG9zID0gYXZpb190ZWxsKG1hdHJvc2thLT5jdHgtPnBiKTsKKyAgICBpbnQgaTsKKworICAgIC8vIHdlIHNob3VsZCBub3QgZG8gYW55IHNlZWtpbmcgaW4gdGhlIHN0cmVhbWluZyBjYXNlCisgICAgaWYgKCFtYXRyb3NrYS0+Y3R4LT5wYi0+c2Vla2FibGUgfHwKKyAgICAgICAgKG1hdHJvc2thLT5jdHgtPmZsYWdzICYgQVZGTVRfRkxBR19JR05JRFgpKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2Vla2hlYWRfbGlzdC0+bmJfZWxlbTsgaSsrKSB7CisgICAgICAgIE1hdHJvc2thU2Vla2hlYWQgKnNlZWtoZWFkID0gc2Vla2hlYWRfbGlzdC0+ZWxlbTsKKyAgICAgICAgaWYgKHNlZWtoZWFkW2ldLnBvcyA8PSBiZWZvcmVfcG9zKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gZGVmZXIgY3VlcyBwYXJzaW5nIHVudGlsIHdlIGFjdHVhbGx5IG5lZWQgY3VlIGRhdGEuCisgICAgICAgIGlmIChzZWVraGVhZFtpXS5pZCA9PSBNQVRST1NLQV9JRF9DVUVTKSB7CisgICAgICAgICAgICBtYXRyb3NrYS0+Y3Vlc19wYXJzaW5nX2RlZmVycmVkID0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hdHJvc2thX3BhcnNlX3NlZWtoZWFkX2VudHJ5KG1hdHJvc2thLCBpKSA8IDApIHsKKyAgICAgICAgICAgIC8vIG1hcmsgaW5kZXggYXMgYnJva2VuCisgICAgICAgICAgICBtYXRyb3NrYS0+Y3Vlc19wYXJzaW5nX2RlZmVycmVkID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgbWF0cm9za2FfYWRkX2luZGV4X2VudHJpZXMoTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thKQoreworICAgIEVibWxMaXN0ICppbmRleF9saXN0OworICAgIE1hdHJvc2thSW5kZXggKmluZGV4OworICAgIGludCBpbmRleF9zY2FsZSA9IDE7CisgICAgaW50IGksIGo7CisKKyAgICBpbmRleF9saXN0ID0gJm1hdHJvc2thLT5pbmRleDsKKyAgICBpbmRleCAgICAgID0gaW5kZXhfbGlzdC0+ZWxlbTsKKyAgICBpZiAoaW5kZXhfbGlzdC0+bmJfZWxlbSAmJgorICAgICAgICBpbmRleFswXS50aW1lID4gMUUxNCAvIG1hdHJvc2thLT50aW1lX3NjYWxlKSB7CisgICAgICAgIGF2X2xvZyhtYXRyb3NrYS0+Y3R4LCBBVl9MT0dfV0FSTklORywgIldvcmtpbmcgYXJvdW5kIGJyb2tlbiBpbmRleC5cbiIpOworICAgICAgICBpbmRleF9zY2FsZSA9IG1hdHJvc2thLT50aW1lX3NjYWxlOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZXhfbGlzdC0+bmJfZWxlbTsgaSsrKSB7CisgICAgICAgIEVibWxMaXN0ICpwb3NfbGlzdCAgICA9ICZpbmRleFtpXS5wb3M7CisgICAgICAgIE1hdHJvc2thSW5kZXhQb3MgKnBvcyA9IHBvc19saXN0LT5lbGVtOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9zX2xpc3QtPm5iX2VsZW07IGorKykgeworICAgICAgICAgICAgTWF0cm9za2FUcmFjayAqdHJhY2sgPSBtYXRyb3NrYV9maW5kX3RyYWNrX2J5X251bShtYXRyb3NrYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zW2pdLnRyYWNrKTsKKyAgICAgICAgICAgIGlmICh0cmFjayAmJiB0cmFjay0+c3RyZWFtKQorICAgICAgICAgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeSh0cmFjay0+c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3Nbal0ucG9zICsgbWF0cm9za2EtPnNlZ21lbnRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4W2ldLnRpbWUgLyBpbmRleF9zY2FsZSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1hdHJvc2thX3BhcnNlX2N1ZXMoTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thKSB7CisgICAgRWJtbExpc3QgKnNlZWtoZWFkX2xpc3QgPSAmbWF0cm9za2EtPnNlZWtoZWFkOworICAgIE1hdHJvc2thU2Vla2hlYWQgKnNlZWtoZWFkID0gc2Vla2hlYWRfbGlzdC0+ZWxlbTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzZWVraGVhZF9saXN0LT5uYl9lbGVtOyBpKyspCisgICAgICAgIGlmIChzZWVraGVhZFtpXS5pZCA9PSBNQVRST1NLQV9JRF9DVUVTKQorICAgICAgICAgICAgYnJlYWs7CisgICAgYXZfYXNzZXJ0MShpIDw9IHNlZWtoZWFkX2xpc3QtPm5iX2VsZW0pOworCisgICAgaWYgKG1hdHJvc2thX3BhcnNlX3NlZWtoZWFkX2VudHJ5KG1hdHJvc2thLCBpKSA8IDApCisgICAgICAgbWF0cm9za2EtPmN1ZXNfcGFyc2luZ19kZWZlcnJlZCA9IC0xOworICAgIG1hdHJvc2thX2FkZF9pbmRleF9lbnRyaWVzKG1hdHJvc2thKTsKK30KKworc3RhdGljIGludCBtYXRyb3NrYV9hYWNfcHJvZmlsZShjaGFyICpjb2RlY19pZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWFjX3Byb2ZpbGVzW10gPSB7ICJNQUlOIiwgIkxDIiwgIlNTUiIgfTsKKyAgICBpbnQgcHJvZmlsZTsKKworICAgIGZvciAocHJvZmlsZSA9IDA7IHByb2ZpbGUgPCBGRl9BUlJBWV9FTEVNUyhhYWNfcHJvZmlsZXMpOyBwcm9maWxlKyspCisgICAgICAgIGlmIChzdHJzdHIoY29kZWNfaWQsIGFhY19wcm9maWxlc1twcm9maWxlXSkpCisgICAgICAgICAgICBicmVhazsKKyAgICByZXR1cm4gcHJvZmlsZSArIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0cm9za2FfYWFjX3NyaShpbnQgc2FtcGxlcmF0ZSkKK3sKKyAgICBpbnQgc3JpOworCisgICAgZm9yIChzcmkgPSAwOyBzcmkgPCBGRl9BUlJBWV9FTEVNUyhhdnByaXZfbXBlZzRhdWRpb19zYW1wbGVfcmF0ZXMpOyBzcmkrKykKKyAgICAgICAgaWYgKGF2cHJpdl9tcGVnNGF1ZGlvX3NhbXBsZV9yYXRlc1tzcmldID09IHNhbXBsZXJhdGUpCisgICAgICAgICAgICBicmVhazsKKyAgICByZXR1cm4gc3JpOworfQorCitzdGF0aWMgdm9pZCBtYXRyb3NrYV9tZXRhZGF0YV9jcmVhdGlvbl90aW1lKEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhLCBpbnQ2NF90IGRhdGVfdXRjKQoreworICAgIGNoYXIgYnVmZmVyWzMyXTsKKyAgICAvKiBDb252ZXJ0IHRvIHNlY29uZHMgYW5kIGFkanVzdCBieSBudW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIDIwMDEtMDEtMDEgYW5kIEVwb2NoICovCisgICAgdGltZV90IGNyZWF0aW9uX3RpbWUgPSBkYXRlX3V0YyAvIDEwMDAwMDAwMDAgKyA5NzgzMDcyMDA7CisgICAgc3RydWN0IHRtIHRtcGJ1ZiwgKnB0bSA9IGdtdGltZV9yKCZjcmVhdGlvbl90aW1lLCAmdG1wYnVmKTsKKyAgICBpZiAoIXB0bSkgcmV0dXJuOworICAgIGlmIChzdHJmdGltZShidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJVktJW0tJWQgJUg6JU06JVMiLCBwdG0pKQorICAgICAgICBhdl9kaWN0X3NldChtZXRhZGF0YSwgImNyZWF0aW9uX3RpbWUiLCBidWZmZXIsIDApOworfQorCitzdGF0aWMgaW50IG1hdHJvc2thX3BhcnNlX2ZsYWMoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJvc2thVHJhY2sgKnRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb2Zmc2V0KQoreworICAgIEFWU3RyZWFtICpzdCA9IHRyYWNrLT5zdHJlYW07CisgICAgdWludDhfdCAqcCA9IHRyYWNrLT5jb2RlY19wcml2LmRhdGE7CisgICAgaW50IHNpemUgICA9IHRyYWNrLT5jb2RlY19wcml2LnNpemU7CisKKyAgICBpZiAoc2l6ZSA8IDggKyBGTEFDX1NUUkVBTUlORk9fU0laRSB8fCBwWzRdICYgMHg3ZikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIEZMQUMgcHJpdmF0ZSBkYXRhXG4iKTsKKyAgICAgICAgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqb2Zmc2V0ID0gODsKKyAgICB0cmFjay0+Y29kZWNfcHJpdi5zaXplID0gOCArIEZMQUNfU1RSRUFNSU5GT19TSVpFOworCisgICAgcCAgICArPSB0cmFjay0+Y29kZWNfcHJpdi5zaXplOworICAgIHNpemUgLT0gdHJhY2stPmNvZGVjX3ByaXYuc2l6ZTsKKworICAgIC8qIHBhcnNlIHRoZSByZW1haW5pbmcgbWV0YWRhdGEgYmxvY2tzIGlmIHByZXNlbnQgKi8KKyAgICB3aGlsZSAoc2l6ZSA+PSA0KSB7CisgICAgICAgIGludCBibG9ja19sYXN0LCBibG9ja190eXBlLCBibG9ja19zaXplOworCisgICAgICAgIGZsYWNfcGFyc2VfYmxvY2tfaGVhZGVyKHAsICZibG9ja19sYXN0LCAmYmxvY2tfdHlwZSwgJmJsb2NrX3NpemUpOworCisgICAgICAgIHAgICAgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSA0OworICAgICAgICBpZiAoYmxvY2tfc2l6ZSA+IHNpemUpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAvKiBjaGVjayBmb3IgdGhlIGNoYW5uZWwgbWFzayAqLworICAgICAgICBpZiAoYmxvY2tfdHlwZSA9PSBGTEFDX01FVEFEQVRBX1RZUEVfVk9SQklTX0NPTU1FTlQpIHsKKyAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqZGljdCA9IE5VTEw7CisgICAgICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqY2htYXNrOworCisgICAgICAgICAgICBmZl92b3JiaXNfY29tbWVudChzLCAmZGljdCwgcCwgYmxvY2tfc2l6ZSwgMCk7CisgICAgICAgICAgICBjaG1hc2sgPSBhdl9kaWN0X2dldChkaWN0LCAiV0FWRUZPUk1BVEVYVEVOU0lCTEVfQ0hBTk5FTF9NQVNLIiwgTlVMTCwgMCk7CisgICAgICAgICAgICBpZiAoY2htYXNrKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgbWFzayA9IHN0cnRvbChjaG1hc2stPnZhbHVlLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1hc2sgfHwgbWFzayAmIH4weDNmZmZmVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIG9mIFdBVkVGT1JNQVRFWFRFTlNJQkxFX0NIQU5ORUxfTUFTS1xuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBtYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHAgICAgKz0gYmxvY2tfc2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBibG9ja19zaXplOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hdHJvc2thX3BhcnNlX3RyYWNrcyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thID0gcy0+cHJpdl9kYXRhOworICAgIE1hdHJvc2thVHJhY2sgKnRyYWNrcyA9IG1hdHJvc2thLT50cmFja3MuZWxlbTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IGksIGosIHJldDsKKyAgICBpbnQgazsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXRyb3NrYS0+dHJhY2tzLm5iX2VsZW07IGkrKykgeworICAgICAgICBNYXRyb3NrYVRyYWNrICp0cmFjayA9ICZ0cmFja3NbaV07CisgICAgICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfTk9ORTsKKyAgICAgICAgRWJtbExpc3QgKmVuY29kaW5nc19saXN0ID0gJnRyYWNrLT5lbmNvZGluZ3M7CisgICAgICAgIE1hdHJvc2thVHJhY2tFbmNvZGluZyAqZW5jb2RpbmdzID0gZW5jb2RpbmdzX2xpc3QtPmVsZW07CisgICAgICAgIHVpbnQ4X3QgKmV4dHJhZGF0YSA9IE5VTEw7CisgICAgICAgIGludCBleHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgIGludCBleHRyYWRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgdWludDMyX3QgZm91cmNjID0gMDsKKyAgICAgICAgQVZJT0NvbnRleHQgYjsKKyAgICAgICAgY2hhcioga2V5X2lkX2Jhc2U2NCA9IE5VTEw7CisgICAgICAgIGludCBiaXRfZGVwdGggPSAtMTsKKworICAgICAgICAvKiBBcHBseSBzb21lIHNhbml0eSBjaGVja3MuICovCisgICAgICAgIGlmICh0cmFjay0+dHlwZSAhPSBNQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPICYmCisgICAgICAgICAgICB0cmFjay0+dHlwZSAhPSBNQVRST1NLQV9UUkFDS19UWVBFX0FVRElPICYmCisgICAgICAgICAgICB0cmFjay0+dHlwZSAhPSBNQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFICYmCisgICAgICAgICAgICB0cmFjay0+dHlwZSAhPSBNQVRST1NLQV9UUkFDS19UWVBFX01FVEFEQVRBKSB7CisgICAgICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgdHJhY2sgdHlwZSAlIlBSSXU2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgdHJhY2stPnR5cGUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0cmFjay0+Y29kZWNfaWQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAodHJhY2stPnR5cGUgPT0gTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTykgeworICAgICAgICAgICAgaWYgKCF0cmFjay0+ZGVmYXVsdF9kdXJhdGlvbiAmJiB0cmFjay0+dmlkZW8uZnJhbWVfcmF0ZSA+IDApCisgICAgICAgICAgICAgICAgdHJhY2stPmRlZmF1bHRfZHVyYXRpb24gPSAxMDAwMDAwMDAwIC8gdHJhY2stPnZpZGVvLmZyYW1lX3JhdGU7CisgICAgICAgICAgICBpZiAodHJhY2stPnZpZGVvLmRpc3BsYXlfd2lkdGggPT0gLTEpCisgICAgICAgICAgICAgICAgdHJhY2stPnZpZGVvLmRpc3BsYXlfd2lkdGggPSB0cmFjay0+dmlkZW8ucGl4ZWxfd2lkdGg7CisgICAgICAgICAgICBpZiAodHJhY2stPnZpZGVvLmRpc3BsYXlfaGVpZ2h0ID09IC0xKQorICAgICAgICAgICAgICAgIHRyYWNrLT52aWRlby5kaXNwbGF5X2hlaWdodCA9IHRyYWNrLT52aWRlby5waXhlbF9oZWlnaHQ7CisgICAgICAgICAgICBpZiAodHJhY2stPnZpZGVvLmNvbG9yX3NwYWNlLnNpemUgPT0gNCkKKyAgICAgICAgICAgICAgICBmb3VyY2MgPSBBVl9STDMyKHRyYWNrLT52aWRlby5jb2xvcl9zcGFjZS5kYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+dHlwZSA9PSBNQVRST1NLQV9UUkFDS19UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoIXRyYWNrLT5hdWRpby5vdXRfc2FtcGxlcmF0ZSkKKyAgICAgICAgICAgICAgICB0cmFjay0+YXVkaW8ub3V0X3NhbXBsZXJhdGUgPSB0cmFjay0+YXVkaW8uc2FtcGxlcmF0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5jb2RpbmdzX2xpc3QtPm5iX2VsZW0gPiAxKSB7CisgICAgICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBjb21iaW5lZCBlbmNvZGluZ3Mgbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nc19saXN0LT5uYl9lbGVtID09IDEpIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGluZ3NbMF0udHlwZSkgeworICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NbMF0uZW5jcnlwdGlvbi5rZXlfaWQuc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgaWQgdG8gYmUgc3RvcmVkIGxhdGVyIGFzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdGFnLiAqLworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYjY0X3NpemUgPSBBVl9CQVNFNjRfU0laRShlbmNvZGluZ3NbMF0uZW5jcnlwdGlvbi5rZXlfaWQuc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGtleV9pZF9iYXNlNjQgPSBhdl9tYWxsb2MoYjY0X3NpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5X2lkX2Jhc2U2NCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgICAgICAgICBhdl9iYXNlNjRfZW5jb2RlKGtleV9pZF9iYXNlNjQsIGI2NF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc1swXS5lbmNyeXB0aW9uLmtleV9pZC5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc1swXS5lbmNyeXB0aW9uLmtleV9pZC5zaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ3NbMF0uc2NvcGUgPSAwOworICAgICAgICAgICAgICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGVuY29kaW5nIHR5cGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKAorI2lmIENPTkZJR19aTElCCisgICAgICAgICAgICAgICAgIGVuY29kaW5nc1swXS5jb21wcmVzc2lvbi5hbGdvICE9IE1BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX0NPTVBfWkxJQiAgJiYKKyNlbmRpZgorI2lmIENPTkZJR19CWkxJQgorICAgICAgICAgICAgICAgICBlbmNvZGluZ3NbMF0uY29tcHJlc3Npb24uYWxnbyAhPSBNQVRST1NLQV9UUkFDS19FTkNPRElOR19DT01QX0JaTElCICYmCisjZW5kaWYKKyNpZiBDT05GSUdfTFpPCisgICAgICAgICAgICAgICAgIGVuY29kaW5nc1swXS5jb21wcmVzc2lvbi5hbGdvICE9IE1BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX0NPTVBfTFpPICAgJiYKKyNlbmRpZgorICAgICAgICAgICAgICAgICBlbmNvZGluZ3NbMF0uY29tcHJlc3Npb24uYWxnbyAhPSBNQVRST1NLQV9UUkFDS19FTkNPRElOR19DT01QX0hFQURFUlNUUklQKSB7CisgICAgICAgICAgICAgICAgZW5jb2RpbmdzWzBdLnNjb3BlID0gMDsKKyAgICAgICAgICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgZW5jb2RpbmcgdHlwZSIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+Y29kZWNfcHJpdi5zaXplICYmIGVuY29kaW5nc1swXS5zY29wZSAmIDIpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpjb2RlY19wcml2ID0gdHJhY2stPmNvZGVjX3ByaXYuZGF0YTsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gbWF0cm9za2FfZGVjb2RlX2J1ZmZlcigmdHJhY2stPmNvZGVjX3ByaXYuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjayk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPmNvZGVjX3ByaXYuZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5jb2RlY19wcml2LnNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBkZWNvZGUgY29kZWMgcHJpdmF0ZSBkYXRhXG4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29kZWNfcHJpdiAhPSB0cmFjay0+Y29kZWNfcHJpdi5kYXRhKQorICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKGNvZGVjX3ByaXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgZmZfbWt2X2NvZGVjX3RhZ3Nbal0uaWQgIT0gQVZfQ09ERUNfSURfTk9ORTsgaisrKSB7CisgICAgICAgICAgICBpZiAoIXN0cm5jbXAoZmZfbWt2X2NvZGVjX3RhZ3Nbal0uc3RyLCB0cmFjay0+Y29kZWNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGZmX21rdl9jb2RlY190YWdzW2pdLnN0cikpKSB7CisgICAgICAgICAgICAgICAgY29kZWNfaWQgPSBmZl9ta3ZfY29kZWNfdGFnc1tqXS5pZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0ID0gdHJhY2stPnN0cmVhbSA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghc3QpIHsKKyAgICAgICAgICAgIGF2X2ZyZWUoa2V5X2lkX2Jhc2U2NCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtleV9pZF9iYXNlNjQpIHsKKyAgICAgICAgICAgIC8qIGV4cG9ydCBlbmNyeXB0aW9uIGtleSBpZCBhcyBiYXNlNjQgbWV0YWRhdGEgdGFnICovCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAiZW5jX2tleV9pZCIsIGtleV9pZF9iYXNlNjQsIDApOworICAgICAgICAgICAgYXZfZnJlZXAoJmtleV9pZF9iYXNlNjQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJjbXAodHJhY2stPmNvZGVjX2lkLCAiVl9NUy9WRlcvRk9VUkNDIikgJiYKKyAgICAgICAgICAgICB0cmFjay0+Y29kZWNfcHJpdi5zaXplID49IDQwICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgIHRyYWNrLT5jb2RlY19wcml2LmRhdGEpIHsKKyAgICAgICAgICAgIHRyYWNrLT5tc19jb21wYXQgICAgPSAxOworICAgICAgICAgICAgYml0X2RlcHRoICAgICAgICAgICA9IEFWX1JMMTYodHJhY2stPmNvZGVjX3ByaXYuZGF0YSArIDE0KTsKKyAgICAgICAgICAgIGZvdXJjYyAgICAgICAgICAgICAgPSBBVl9STDMyKHRyYWNrLT5jb2RlY19wcml2LmRhdGEgKyAxNik7CisgICAgICAgICAgICBjb2RlY19pZCAgICAgICAgICAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2JtcF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VyY2MpOworICAgICAgICAgICAgaWYgKCFjb2RlY19pZCkKKyAgICAgICAgICAgICAgICBjb2RlY19pZCAgICAgICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfbW92dmlkZW9fdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91cmNjKTsKKyAgICAgICAgICAgIGV4dHJhZGF0YV9vZmZzZXQgICAgPSA0MDsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHRyYWNrLT5jb2RlY19pZCwgIkFfTVMvQUNNIikgJiYKKyAgICAgICAgICAgICAgICAgICB0cmFjay0+Y29kZWNfcHJpdi5zaXplID49IDE0ICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICB0cmFjay0+Y29kZWNfcHJpdi5kYXRhKSB7CisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgZmZpb19pbml0X2NvbnRleHQoJmIsIHRyYWNrLT5jb2RlY19wcml2LmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Y29kZWNfcHJpdi5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICByZXQgPSBmZl9nZXRfd2F2X2hlYWRlcigmYiwgc3QtPmNvZGVjLCB0cmFjay0+Y29kZWNfcHJpdi5zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBjb2RlY19pZCAgICAgICAgID0gc3QtPmNvZGVjLT5jb2RlY19pZDsKKyAgICAgICAgICAgIGV4dHJhZGF0YV9vZmZzZXQgPSBGRk1JTih0cmFjay0+Y29kZWNfcHJpdi5zaXplLCAxOCk7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCh0cmFjay0+Y29kZWNfaWQsICJBX1FVSUNLVElNRSIpCisgICAgICAgICAgICAgICAgICAgJiYgKHRyYWNrLT5jb2RlY19wcml2LnNpemUgPj0gODYpCisgICAgICAgICAgICAgICAgICAgJiYgKHRyYWNrLT5jb2RlY19wcml2LmRhdGEpKSB7CisgICAgICAgICAgICBmb3VyY2MgPSBBVl9STDMyKHRyYWNrLT5jb2RlY19wcml2LmRhdGEgKyA0KTsKKyAgICAgICAgICAgIGNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdmF1ZGlvX3RhZ3MsIGZvdXJjYyk7CisgICAgICAgICAgICBpZiAoZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdmF1ZGlvX3RhZ3MsIEFWX1JMMzIodHJhY2stPmNvZGVjX3ByaXYuZGF0YSkpKSB7CisgICAgICAgICAgICAgICAgZm91cmNjID0gQVZfUkwzMih0cmFjay0+Y29kZWNfcHJpdi5kYXRhKTsKKyAgICAgICAgICAgICAgICBjb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19tb3ZhdWRpb190YWdzLCBmb3VyY2MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAodHJhY2stPmNvZGVjX2lkLCAiVl9RVUlDS1RJTUUiKSAmJgorICAgICAgICAgICAgICAgICAgICh0cmFjay0+Y29kZWNfcHJpdi5zaXplID49IDIxKSAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICh0cmFjay0+Y29kZWNfcHJpdi5kYXRhKSkgeworICAgICAgICAgICAgZm91cmNjICAgPSBBVl9STDMyKHRyYWNrLT5jb2RlY19wcml2LmRhdGEgKyA0KTsKKyAgICAgICAgICAgIGNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIGZvdXJjYyk7CisgICAgICAgICAgICBpZiAoZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIEFWX1JMMzIodHJhY2stPmNvZGVjX3ByaXYuZGF0YSkpKSB7CisgICAgICAgICAgICAgICAgZm91cmNjICAgPSBBVl9STDMyKHRyYWNrLT5jb2RlY19wcml2LmRhdGEpOworICAgICAgICAgICAgICAgIGNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIGZvdXJjYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSAmJiBBVl9STDMyKHRyYWNrLT5jb2RlY19wcml2LmRhdGErNCkgPT0gQVZfUkwzMigiU01JICIpKQorICAgICAgICAgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfU1ZRMzsKKyAgICAgICAgfSBlbHNlIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2QkUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHJhY2stPmF1ZGlvLmJpdGRlcHRoKSB7CisgICAgICAgICAgICBjYXNlICA4OgorICAgICAgICAgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICBjb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMjRCRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzMyQkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkxFKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHRyYWNrLT5hdWRpby5iaXRkZXB0aCkgeworICAgICAgICAgICAgY2FzZSAgODoKKyAgICAgICAgICAgICAgICBjb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzI0TEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MzMkxFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9GMzJMRSAmJgorICAgICAgICAgICAgICAgICAgIHRyYWNrLT5hdWRpby5iaXRkZXB0aCA9PSA2NCkgeworICAgICAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fRjY0TEU7CisgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmICF0cmFjay0+Y29kZWNfcHJpdi5zaXplKSB7CisgICAgICAgICAgICBpbnQgcHJvZmlsZSA9IG1hdHJvc2thX2FhY19wcm9maWxlKHRyYWNrLT5jb2RlY19pZCk7CisgICAgICAgICAgICBpbnQgc3JpICAgICA9IG1hdHJvc2thX2FhY19zcmkodHJhY2stPmF1ZGlvLnNhbXBsZXJhdGUpOworICAgICAgICAgICAgZXh0cmFkYXRhICAgPSBhdl9tYWxsb2N6KDUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmICghZXh0cmFkYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBleHRyYWRhdGFbMF0gPSAocHJvZmlsZSA8PCAzKSB8ICgoc3JpICYgMHgwRSkgPj4gMSk7CisgICAgICAgICAgICBleHRyYWRhdGFbMV0gPSAoKHNyaSAmIDB4MDEpIDw8IDcpIHwgKHRyYWNrLT5hdWRpby5jaGFubmVscyA8PCAzKTsKKyAgICAgICAgICAgIGlmIChzdHJzdHIodHJhY2stPmNvZGVjX2lkLCAiU0JSIikpIHsKKyAgICAgICAgICAgICAgICBzcmkgICAgICAgICAgICA9IG1hdHJvc2thX2FhY19zcmkodHJhY2stPmF1ZGlvLm91dF9zYW1wbGVyYXRlKTsKKyAgICAgICAgICAgICAgICBleHRyYWRhdGFbMl0gICA9IDB4NTY7CisgICAgICAgICAgICAgICAgZXh0cmFkYXRhWzNdICAgPSAweEU1OworICAgICAgICAgICAgICAgIGV4dHJhZGF0YVs0XSAgID0gMHg4MCB8IChzcmkgPDwgMyk7CisgICAgICAgICAgICAgICAgZXh0cmFkYXRhX3NpemUgPSA1OworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgZXh0cmFkYXRhX3NpemUgPSAyOworICAgICAgICB9IGVsc2UgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FMQUMgJiYgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSAmJiB0cmFjay0+Y29kZWNfcHJpdi5zaXplIDwgSU5UX01BWCAtIDEyIC0gRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkgeworICAgICAgICAgICAgLyogT25seSBBTEFDJ3MgbWFnaWMgY29va2llIGlzIHN0b3JlZCBpbiBNYXRyb3NrYSdzIHRyYWNrIGhlYWRlcnMuCisgICAgICAgICAgICAgKiBDcmVhdGUgdGhlICJhdG9tIHNpemUiLCAidGFnIiwgYW5kICJ0YWcgdmVyc2lvbiIgZmllbGRzIHRoZQorICAgICAgICAgICAgICogZGVjb2RlciBleHBlY3RzIG1hbnVhbGx5LiAqLworICAgICAgICAgICAgZXh0cmFkYXRhX3NpemUgPSAxMiArIHRyYWNrLT5jb2RlY19wcml2LnNpemU7CisgICAgICAgICAgICBleHRyYWRhdGEgICAgICA9IGF2X21hbGxvY3ooZXh0cmFkYXRhX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgaWYgKCFleHRyYWRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIEFWX1dCMzIoZXh0cmFkYXRhLCBleHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkoJmV4dHJhZGF0YVs0XSwgImFsYWMiLCA0KTsKKyAgICAgICAgICAgIEFWX1dCMzIoJmV4dHJhZGF0YVs4XSwgMCk7CisgICAgICAgICAgICBtZW1jcHkoJmV4dHJhZGF0YVsxMl0sIHRyYWNrLT5jb2RlY19wcml2LmRhdGEsCisgICAgICAgICAgICAgICAgICAgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVFRBKSB7CisgICAgICAgICAgICBleHRyYWRhdGFfc2l6ZSA9IDMwOworICAgICAgICAgICAgZXh0cmFkYXRhICAgICAgPSBhdl9tYWxsb2N6KGV4dHJhZGF0YV9zaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBpZiAoIWV4dHJhZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZmZpb19pbml0X2NvbnRleHQoJmIsIGV4dHJhZGF0YSwgZXh0cmFkYXRhX3NpemUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGF2aW9fd3JpdGUoJmIsICJUVEExIiwgNCk7CisgICAgICAgICAgICBhdmlvX3dsMTYoJmIsIDEpOworICAgICAgICAgICAgYXZpb193bDE2KCZiLCB0cmFjay0+YXVkaW8uY2hhbm5lbHMpOworICAgICAgICAgICAgYXZpb193bDE2KCZiLCB0cmFjay0+YXVkaW8uYml0ZGVwdGgpOworICAgICAgICAgICAgaWYgKHRyYWNrLT5hdWRpby5vdXRfc2FtcGxlcmF0ZSA8IDAgfHwgdHJhY2stPmF1ZGlvLm91dF9zYW1wbGVyYXRlID4gSU5UX01BWCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGF2aW9fd2wzMigmYiwgdHJhY2stPmF1ZGlvLm91dF9zYW1wbGVyYXRlKTsKKyAgICAgICAgICAgIGF2aW9fd2wzMigmYiwgYXZfcmVzY2FsZSgobWF0cm9za2EtPmR1cmF0aW9uICogbWF0cm9za2EtPnRpbWVfc2NhbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5hdWRpby5vdXRfc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0UgKiAxMDAwKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlYxMCB8fAorICAgICAgICAgICAgICAgICAgIGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWMjAgfHwKKyAgICAgICAgICAgICAgICAgICBjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjMwIHx8CisgICAgICAgICAgICAgICAgICAgY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlY0MCkgeworICAgICAgICAgICAgZXh0cmFkYXRhX29mZnNldCA9IDI2OworICAgICAgICB9IGVsc2UgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBXzE0NCkgeworICAgICAgICAgICAgdHJhY2stPmF1ZGlvLm91dF9zYW1wbGVyYXRlID0gODAwMDsKKyAgICAgICAgICAgIHRyYWNrLT5hdWRpby5jaGFubmVscyAgICAgICA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBXzI4OCB8fAorICAgICAgICAgICAgICAgICAgICBjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9DT09LICAgfHwKKyAgICAgICAgICAgICAgICAgICAgY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVRSQUMzIHx8CisgICAgICAgICAgICAgICAgICAgIGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NJUFIpCisgICAgICAgICAgICAgICAgICAgICAgJiYgdHJhY2stPmNvZGVjX3ByaXYuZGF0YSkgeworICAgICAgICAgICAgaW50IGZsYXZvcjsKKworICAgICAgICAgICAgZmZpb19pbml0X2NvbnRleHQoJmIsIHRyYWNrLT5jb2RlY19wcml2LmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Y29kZWNfcHJpdi5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBhdmlvX3NraXAoJmIsIDIyKTsKKyAgICAgICAgICAgIGZsYXZvciAgICAgICAgICAgICAgICAgICAgICAgPSBhdmlvX3JiMTYoJmIpOworICAgICAgICAgICAgdHJhY2stPmF1ZGlvLmNvZGVkX2ZyYW1lc2l6ZSA9IGF2aW9fcmIzMigmYik7CisgICAgICAgICAgICBhdmlvX3NraXAoJmIsIDEyKTsKKyAgICAgICAgICAgIHRyYWNrLT5hdWRpby5zdWJfcGFja2V0X2ggICAgPSBhdmlvX3JiMTYoJmIpOworICAgICAgICAgICAgdHJhY2stPmF1ZGlvLmZyYW1lX3NpemUgICAgICA9IGF2aW9fcmIxNigmYik7CisgICAgICAgICAgICB0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9zaXplID0gYXZpb19yYjE2KCZiKTsKKyAgICAgICAgICAgIGlmIChmbGF2b3IgICAgICAgICAgICAgICAgICAgICAgICA8IDAgfHwKKyAgICAgICAgICAgICAgICB0cmFjay0+YXVkaW8uY29kZWRfZnJhbWVzaXplIDw9IDAgfHwKKyAgICAgICAgICAgICAgICB0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9oICAgIDw9IDAgfHwKKyAgICAgICAgICAgICAgICB0cmFjay0+YXVkaW8uZnJhbWVfc2l6ZSAgICAgIDw9IDAgfHwKKyAgICAgICAgICAgICAgICB0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9zaXplIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB0cmFjay0+YXVkaW8uYnVmID0gYXZfbWFsbG9jX2FycmF5KHRyYWNrLT5hdWRpby5zdWJfcGFja2V0X2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5hdWRpby5mcmFtZV9zaXplKTsKKyAgICAgICAgICAgIGlmICghdHJhY2stPmF1ZGlvLmJ1ZikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBXzI4OCkgeworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSB0cmFjay0+YXVkaW8uY29kZWRfZnJhbWVzaXplOworICAgICAgICAgICAgICAgIHRyYWNrLT5jb2RlY19wcml2LnNpemUgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU0lQUiAmJiBmbGF2b3IgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgc2lwcl9iaXRfcmF0ZVs0XSA9IHsgNjUwNCwgODQ5NiwgNTAwMCwgMTYwMDAgfTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPmF1ZGlvLnN1Yl9wYWNrZXRfc2l6ZSA9IGZmX3NpcHJfc3VicGtfc2l6ZVtmbGF2b3JdOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgICAgICAgID0gc2lwcl9iaXRfcmF0ZVtmbGF2b3JdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gdHJhY2stPmF1ZGlvLnN1Yl9wYWNrZXRfc2l6ZTsKKyAgICAgICAgICAgICAgICBleHRyYWRhdGFfb2Zmc2V0ICAgICAgID0gNzg7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxBQyAmJiB0cmFjay0+Y29kZWNfcHJpdi5zaXplKSB7CisgICAgICAgICAgICByZXQgPSBtYXRyb3NrYV9wYXJzZV9mbGFjKHMsIHRyYWNrLCAmZXh0cmFkYXRhX29mZnNldCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BST1JFUyAmJiB0cmFjay0+Y29kZWNfcHJpdi5zaXplID09IDQpIHsKKyAgICAgICAgICAgIGZvdXJjYyA9IEFWX1JMMzIodHJhY2stPmNvZGVjX3ByaXYuZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSAtPSBleHRyYWRhdGFfb2Zmc2V0OworCisgICAgICAgIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJVbmtub3duL3Vuc3VwcG9ydGVkIEFWQ29kZWNJRCAlcy5cbiIsIHRyYWNrLT5jb2RlY19pZCk7CisKKyAgICAgICAgaWYgKHRyYWNrLT50aW1lX3NjYWxlIDwgMC4wMSkKKyAgICAgICAgICAgIHRyYWNrLT50aW1lX3NjYWxlID0gMS4wOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgbWF0cm9za2EtPnRpbWVfc2NhbGUgKiB0cmFjay0+dGltZV9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwICogMTAwMCAqIDEwMDApOyAgICAvKiA2NCBiaXQgcHRzIGluIG5zICovCisKKyAgICAgICAgLyogY29udmVydCB0aGUgZGVsYXkgZnJvbSBucyB0byB0aGUgdHJhY2sgdGltZWJhc2UgKi8KKyAgICAgICAgdHJhY2stPmNvZGVjX2RlbGF5ID0gYXZfcmVzY2FsZV9xKHRyYWNrLT5jb2RlY19kZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgMTAwMDAwMDAwMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSk7CisKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGNvZGVjX2lkOworCisgICAgICAgIGlmIChzdHJjbXAodHJhY2stPmxhbmd1YWdlLCAidW5kIikpCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAibGFuZ3VhZ2UiLCB0cmFjay0+bGFuZ3VhZ2UsIDApOworICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAidGl0bGUiLCB0cmFjay0+bmFtZSwgMCk7CisKKyAgICAgICAgaWYgKHRyYWNrLT5mbGFnX2RlZmF1bHQpCisgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fREVGQVVMVDsKKyAgICAgICAgaWYgKHRyYWNrLT5mbGFnX2ZvcmNlZCkKKyAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiB8PSBBVl9ESVNQT1NJVElPTl9GT1JDRUQ7CisKKyAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgaWYgKGV4dHJhZGF0YSkgeworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICAgICAgPSBleHRyYWRhdGE7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IGV4dHJhZGF0YV9zaXplOworICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+Y29kZWNfcHJpdi5kYXRhICYmIHRyYWNrLT5jb2RlY19wcml2LnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIHRyYWNrLT5jb2RlY19wcml2LnNpemUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIG1lbWNweShzdC0+Y29kZWMtPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmNvZGVjX3ByaXYuZGF0YSArIGV4dHJhZGF0YV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5jb2RlY19wcml2LnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHRyYWNrLT50eXBlID09IE1BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIE1hdHJvc2thVHJhY2tQbGFuZSAqcGxhbmVzID0gdHJhY2stPm9wZXJhdGlvbi5jb21iaW5lX3BsYW5lcy5lbGVtOworCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSBmb3VyY2M7CisgICAgICAgICAgICBpZiAoYml0X2RlcHRoID49IDApCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaXRfZGVwdGg7CisgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSB0cmFjay0+dmlkZW8ucGl4ZWxfd2lkdGg7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSB0cmFjay0+dmlkZW8ucGl4ZWxfaGVpZ2h0OworICAgICAgICAgICAgYXZfcmVkdWNlKCZzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCisgICAgICAgICAgICAgICAgICAgICAgJnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAqIHRyYWNrLT52aWRlby5kaXNwbGF5X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggICogdHJhY2stPnZpZGVvLmRpc3BsYXlfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIDI1NSk7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9IRVZDKQorICAgICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOworCisgICAgICAgICAgICBpZiAodHJhY2stPmRlZmF1bHRfZHVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBhdl9yZWR1Y2UoJnN0LT5hdmdfZnJhbWVfcmF0ZS5udW0sICZzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwLCB0cmFjay0+ZGVmYXVsdF9kdXJhdGlvbiwgMzAwMDApOworI2lmIEZGX0FQSV9SX0ZSQU1FX1JBVEUKKyAgICAgICAgICAgICAgICBpZiAoICAgc3QtPmF2Z19mcmFtZV9yYXRlLm51bSA8IHN0LT5hdmdfZnJhbWVfcmF0ZS5kZW4gKiAxMDAwTAorICAgICAgICAgICAgICAgICAgICAmJiBzdC0+YXZnX2ZyYW1lX3JhdGUubnVtID4gc3QtPmF2Z19mcmFtZV9yYXRlLmRlbiAqIDVMKQorICAgICAgICAgICAgICAgICAgICBzdC0+cl9mcmFtZV9yYXRlID0gc3QtPmF2Z19mcmFtZV9yYXRlOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGV4cG9ydCBzdGVyZW8gbW9kZSBmbGFnIGFzIG1ldGFkYXRhIHRhZyAqLworICAgICAgICAgICAgaWYgKHRyYWNrLT52aWRlby5zdGVyZW9fbW9kZSAmJiB0cmFjay0+dmlkZW8uc3RlcmVvX21vZGUgPCBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfTkIpCisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgInN0ZXJlb19tb2RlIiwgZmZfbWF0cm9za2FfdmlkZW9fc3RlcmVvX21vZGVbdHJhY2stPnZpZGVvLnN0ZXJlb19tb2RlXSwgMCk7CisKKyAgICAgICAgICAgIC8qIGV4cG9ydCBhbHBoYSBtb2RlIGZsYWcgYXMgbWV0YWRhdGEgdGFnICAqLworICAgICAgICAgICAgaWYgKHRyYWNrLT52aWRlby5hbHBoYV9tb2RlKQorICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJhbHBoYV9tb2RlIiwgIjEiLCAwKTsKKworICAgICAgICAgICAgLyogaWYgd2UgaGF2ZSB2aXJ0dWFsIHRyYWNrLCBtYXJrIHRoZSByZWFsIHRyYWNrcyAqLworICAgICAgICAgICAgZm9yIChqPTA7IGogPCB0cmFjay0+b3BlcmF0aW9uLmNvbWJpbmVfcGxhbmVzLm5iX2VsZW07IGorKykgeworICAgICAgICAgICAgICAgIGNoYXIgYnVmWzMyXTsKKyAgICAgICAgICAgICAgICBpZiAocGxhbmVzW2pdLnR5cGUgPj0gTUFUUk9TS0FfVklERU9fU1RFUkVPX1BMQU5FX0NPVU5UKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXNfJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21hdHJvc2thX3ZpZGVvX3N0ZXJlb19wbGFuZVtwbGFuZXNbal0udHlwZV0sIGkpOworICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrIDwgbWF0cm9za2EtPnRyYWNrcy5uYl9lbGVtOyBrKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChwbGFuZXNbal0udWlkID09IHRyYWNrc1trXS51aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5zdHJlYW1zW2tdLT5tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGVyZW9fbW9kZSIsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWRkIHN0cmVhbSBsZXZlbCBzdGVyZW8zZCBzaWRlIGRhdGEgaWYgaXQgaXMgYSBzdXBwb3J0ZWQgZm9ybWF0CisgICAgICAgICAgICBpZiAodHJhY2stPnZpZGVvLnN0ZXJlb19tb2RlIDwgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX05CICYmCisgICAgICAgICAgICAgICAgdHJhY2stPnZpZGVvLnN0ZXJlb19tb2RlICE9IDEwICYmIHRyYWNrLT52aWRlby5zdGVyZW9fbW9kZSAhPSAxMikgeworICAgICAgICAgICAgICAgIGludCByZXQgPSBmZl9ta3Zfc3RlcmVvM2RfY29udihzdCwgdHJhY2stPnZpZGVvLnN0ZXJlb19tb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+dHlwZSA9PSBNQVRST1NLQV9UUkFDS19UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHRyYWNrLT5hdWRpby5vdXRfc2FtcGxlcmF0ZTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSB0cmFjay0+YXVkaW8uY2hhbm5lbHM7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gdHJhY2stPmF1ZGlvLmJpdGRlcHRoOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQUFDKQorICAgICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOworICAgICAgICAgICAgaWYgKHRyYWNrLT5jb2RlY19kZWxheSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmRlbGF5ID0gYXZfcmVzY2FsZV9xKHRyYWNrLT5jb2RlY19kZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZX0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYWNrLT5zZWVrX3ByZXJvbGwgPiAwKSB7CisgICAgICAgICAgICAgICAgYXZfY29kZWNfc2V0X3NlZWtfcHJlcm9sbChzdC0+Y29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3EodHJhY2stPnNlZWtfcHJlcm9sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgMTAwMDAwMDAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGV9KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV0VCVlRUKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisKKyAgICAgICAgICAgIGlmICghc3RyY21wKHRyYWNrLT5jb2RlY19pZCwgIkRfV0VCVlRUL0NBUFRJT05TIikpIHsKKyAgICAgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fQ0FQVElPTlM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAodHJhY2stPmNvZGVjX2lkLCAiRF9XRUJWVFQvREVTQ1JJUFRJT05TIikpIHsKKyAgICAgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fREVTQ1JJUFRJT05TOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHRyYWNrLT5jb2RlY19pZCwgIkRfV0VCVlRUL01FVEFEQVRBIikpIHsKKyAgICAgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fTUVUQURBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPnR5cGUgPT0gTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVNTKQorICAgICAgICAgICAgICAgIG1hdHJvc2thLT5jb250YWluc19zc2EgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF0cm9za2FfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSA9IHMtPnByaXZfZGF0YTsKKyAgICBFYm1sTGlzdCAqYXR0YWNobWVudHNfbGlzdCA9ICZtYXRyb3NrYS0+YXR0YWNobWVudHM7CisgICAgRWJtbExpc3QgKmNoYXB0ZXJzX2xpc3QgICAgPSAmbWF0cm9za2EtPmNoYXB0ZXJzOworICAgIE1hdHJvc2thQXR0YWNobWVudCAqYXR0YWNobWVudHM7CisgICAgTWF0cm9za2FDaGFwdGVyICpjaGFwdGVyczsKKyAgICB1aW50NjRfdCBtYXhfc3RhcnQgPSAwOworICAgIGludDY0X3QgcG9zOworICAgIEVibWwgZWJtbCA9IHsgMCB9OworICAgIGludCBpLCBqLCByZXM7CisKKyAgICBtYXRyb3NrYS0+Y3R4ID0gczsKKworICAgIC8qIEZpcnN0IHJlYWQgdGhlIEVCTUwgaGVhZGVyLiAqLworICAgIGlmIChlYm1sX3BhcnNlKG1hdHJvc2thLCBlYm1sX3N5bnRheCwgJmVibWwpIHx8CisgICAgICAgIGVibWwudmVyc2lvbiAgICAgICAgID4gRUJNTF9WRVJTSU9OICAgICAgfHwKKyAgICAgICAgZWJtbC5tYXhfc2l6ZSAgICAgICAgPiBzaXplb2YodWludDY0X3QpICB8fAorICAgICAgICBlYm1sLmlkX2xlbmd0aCAgICAgICA+IHNpemVvZih1aW50MzJfdCkgIHx8CisgICAgICAgIGVibWwuZG9jdHlwZV92ZXJzaW9uID4gMyAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIWVibWwuZG9jdHlwZSkgeworICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkVCTUwgaGVhZGVyIHVzaW5nIHVuc3VwcG9ydGVkIGZlYXR1cmVzXG4iCisgICAgICAgICAgICAgICAiKEVCTUwgdmVyc2lvbiAlIlBSSXU2NCIsIGRvY3R5cGUgJXMsIGRvYyB2ZXJzaW9uICUiUFJJdTY0IilcbiIsCisgICAgICAgICAgICAgICBlYm1sLnZlcnNpb24sIGVibWwuZG9jdHlwZSwgZWJtbC5kb2N0eXBlX3ZlcnNpb24pOworICAgICAgICBlYm1sX2ZyZWUoZWJtbF9zeW50YXgsICZlYm1sKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0gZWxzZSBpZiAoZWJtbC5kb2N0eXBlX3ZlcnNpb24gPT0gMykgeworICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiRUJNTCBoZWFkZXIgdXNpbmcgdW5zdXBwb3J0ZWQgZmVhdHVyZXNcbiIKKyAgICAgICAgICAgICAgICIoRUJNTCB2ZXJzaW9uICUiUFJJdTY0IiwgZG9jdHlwZSAlcywgZG9jIHZlcnNpb24gJSJQUkl1NjQiKVxuIiwKKyAgICAgICAgICAgICAgIGVibWwudmVyc2lvbiwgZWJtbC5kb2N0eXBlLCBlYm1sLmRvY3R5cGVfdmVyc2lvbik7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhtYXRyb3NrYV9kb2N0eXBlcyk7IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAoZWJtbC5kb2N0eXBlLCBtYXRyb3NrYV9kb2N0eXBlc1tpXSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaSA+PSBGRl9BUlJBWV9FTEVNUyhtYXRyb3NrYV9kb2N0eXBlcykpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBFQk1MIGRvY3R5cGUgJyVzJ1xuIiwgZWJtbC5kb2N0eXBlKTsKKyAgICAgICAgaWYgKG1hdHJvc2thLT5jdHgtPmVycm9yX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkgeworICAgICAgICAgICAgZWJtbF9mcmVlKGVibWxfc3ludGF4LCAmZWJtbCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlYm1sX2ZyZWUoZWJtbF9zeW50YXgsICZlYm1sKTsKKworICAgIC8qIFRoZSBuZXh0IHRoaW5nIGlzIGEgc2VnbWVudC4gKi8KKyAgICBwb3MgPSBhdmlvX3RlbGwobWF0cm9za2EtPmN0eC0+cGIpOworICAgIHJlcyA9IGVibWxfcGFyc2UobWF0cm9za2EsIG1hdHJvc2thX3NlZ21lbnRzLCBtYXRyb3NrYSk7CisgICAgLy8gdHJ5IHJlc3luY2luZyB1bnRpbCB3ZSBmaW5kIGEgRUJNTF9TVE9QIHR5cGUgZWxlbWVudC4KKyAgICB3aGlsZSAocmVzICE9IDEpIHsKKyAgICAgICAgcmVzID0gbWF0cm9za2FfcmVzeW5jKG1hdHJvc2thLCBwb3MpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIHBvcyA9IGF2aW9fdGVsbChtYXRyb3NrYS0+Y3R4LT5wYik7CisgICAgICAgIHJlcyA9IGVibWxfcGFyc2UobWF0cm9za2EsIG1hdHJvc2thX3NlZ21lbnQsIG1hdHJvc2thKTsKKyAgICB9CisgICAgbWF0cm9za2FfZXhlY3V0ZV9zZWVraGVhZChtYXRyb3NrYSk7CisKKyAgICBpZiAoIW1hdHJvc2thLT50aW1lX3NjYWxlKQorICAgICAgICBtYXRyb3NrYS0+dGltZV9zY2FsZSA9IDEwMDAwMDA7CisgICAgaWYgKG1hdHJvc2thLT5kdXJhdGlvbikKKyAgICAgICAgbWF0cm9za2EtPmN0eC0+ZHVyYXRpb24gPSBtYXRyb3NrYS0+ZHVyYXRpb24gKiBtYXRyb3NrYS0+dGltZV9zY2FsZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCAvIEFWX1RJTUVfQkFTRTsKKyAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJ0aXRsZSIsIG1hdHJvc2thLT50aXRsZSwgMCk7CisgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCAiZW5jb2RlciIsIG1hdHJvc2thLT5tdXhpbmdhcHAsIDApOworCisgICAgaWYgKG1hdHJvc2thLT5kYXRlX3V0Yy5zaXplID09IDgpCisgICAgICAgIG1hdHJvc2thX21ldGFkYXRhX2NyZWF0aW9uX3RpbWUoJnMtPm1ldGFkYXRhLCBBVl9SQjY0KG1hdHJvc2thLT5kYXRlX3V0Yy5kYXRhKSk7CisKKyAgICByZXMgPSBtYXRyb3NrYV9wYXJzZV90cmFja3Mocyk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICBhdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzX2xpc3QtPmVsZW07CisgICAgZm9yIChqID0gMDsgaiA8IGF0dGFjaG1lbnRzX2xpc3QtPm5iX2VsZW07IGorKykgeworICAgICAgICBpZiAoIShhdHRhY2htZW50c1tqXS5maWxlbmFtZSAmJiBhdHRhY2htZW50c1tqXS5taW1lICYmCisgICAgICAgICAgICAgIGF0dGFjaG1lbnRzW2pdLmJpbi5kYXRhICYmIGF0dGFjaG1lbnRzW2pdLmJpbi5zaXplID4gMCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhtYXRyb3NrYS0+Y3R4LCBBVl9MT0dfRVJST1IsICJpbmNvbXBsZXRlIGF0dGFjaG1lbnRcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAiZmlsZW5hbWUiLCBhdHRhY2htZW50c1tqXS5maWxlbmFtZSwgMCk7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAibWltZXR5cGUiLCBhdHRhY2htZW50c1tqXS5taW1lLCAwKTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX05PTkU7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVDsKKyAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBhdHRhY2htZW50c1tqXS5iaW4uc2l6ZSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsIGF0dGFjaG1lbnRzW2pdLmJpbi5kYXRhLAorICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzW2pdLmJpbi5zaXplKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgZmZfbWt2X21pbWVfdGFnc1tpXS5pZCAhPSBBVl9DT0RFQ19JRF9OT05FOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoZmZfbWt2X21pbWVfdGFnc1tpXS5zdHIsIGF0dGFjaG1lbnRzW2pdLm1pbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihmZl9ta3ZfbWltZV90YWdzW2ldLnN0cikpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9ta3ZfbWltZV90YWdzW2ldLmlkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRhY2htZW50c1tqXS5zdHJlYW0gPSBzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNoYXB0ZXJzID0gY2hhcHRlcnNfbGlzdC0+ZWxlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhcHRlcnNfbGlzdC0+bmJfZWxlbTsgaSsrKQorICAgICAgICBpZiAoY2hhcHRlcnNbaV0uc3RhcnQgIT0gQVZfTk9QVFNfVkFMVUUgJiYgY2hhcHRlcnNbaV0udWlkICYmCisgICAgICAgICAgICAobWF4X3N0YXJ0ID09IDAgfHwgY2hhcHRlcnNbaV0uc3RhcnQgPiBtYXhfc3RhcnQpKSB7CisgICAgICAgICAgICBjaGFwdGVyc1tpXS5jaGFwdGVyID0KKyAgICAgICAgICAgICAgICBhdnByaXZfbmV3X2NoYXB0ZXIocywgY2hhcHRlcnNbaV0udWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCkgeyAxLCAxMDAwMDAwMDAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXB0ZXJzW2ldLnN0YXJ0LCBjaGFwdGVyc1tpXS5lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXB0ZXJzW2ldLnRpdGxlKTsKKyAgICAgICAgICAgIGlmIChjaGFwdGVyc1tpXS5jaGFwdGVyKSB7CisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJmNoYXB0ZXJzW2ldLmNoYXB0ZXItPm1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSIsIGNoYXB0ZXJzW2ldLnRpdGxlLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heF9zdGFydCA9IGNoYXB0ZXJzW2ldLnN0YXJ0OworICAgICAgICB9CisKKyAgICBtYXRyb3NrYV9hZGRfaW5kZXhfZW50cmllcyhtYXRyb3NrYSk7CisKKyAgICBtYXRyb3NrYV9jb252ZXJ0X3RhZ3Mocyk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFB1dCBvbmUgcGFja2V0IGluIGFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkIEFWUGFja2V0IHN0cnVjdC4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC0xIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgbWF0cm9za2FfZGVsaXZlcl9wYWNrZXQoTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIGlmIChtYXRyb3NrYS0+bnVtX3BhY2tldHMgPiAwKSB7CisgICAgICAgIG1lbWNweShwa3QsIG1hdHJvc2thLT5wYWNrZXRzWzBdLCBzaXplb2YoQVZQYWNrZXQpKTsKKyAgICAgICAgYXZfZnJlZShtYXRyb3NrYS0+cGFja2V0c1swXSk7CisgICAgICAgIGlmIChtYXRyb3NrYS0+bnVtX3BhY2tldHMgPiAxKSB7CisgICAgICAgICAgICB2b2lkICpuZXdwYWNrZXRzOworICAgICAgICAgICAgbWVtbW92ZSgmbWF0cm9za2EtPnBhY2tldHNbMF0sICZtYXRyb3NrYS0+cGFja2V0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgKG1hdHJvc2thLT5udW1fcGFja2V0cyAtIDEpICogc2l6ZW9mKEFWUGFja2V0ICopKTsKKyAgICAgICAgICAgIG5ld3BhY2tldHMgPSBhdl9yZWFsbG9jKG1hdHJvc2thLT5wYWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdHJvc2thLT5udW1fcGFja2V0cyAtIDEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBVlBhY2tldCAqKSk7CisgICAgICAgICAgICBpZiAobmV3cGFja2V0cykKKyAgICAgICAgICAgICAgICBtYXRyb3NrYS0+cGFja2V0cyA9IG5ld3BhY2tldHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmbWF0cm9za2EtPnBhY2tldHMpOworICAgICAgICAgICAgbWF0cm9za2EtPnByZXZfcGt0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBtYXRyb3NrYS0+bnVtX3BhY2tldHMtLTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCisvKgorICogRnJlZSBhbGwgcGFja2V0cyBpbiBvdXIgaW50ZXJuYWwgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIG1hdHJvc2thX2NsZWFyX3F1ZXVlKE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSkKK3sKKyAgICBtYXRyb3NrYS0+cHJldl9wa3QgPSBOVUxMOworICAgIGlmIChtYXRyb3NrYS0+cGFja2V0cykgeworICAgICAgICBpbnQgbjsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IG1hdHJvc2thLT5udW1fcGFja2V0czsgbisrKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChtYXRyb3NrYS0+cGFja2V0c1tuXSk7CisgICAgICAgICAgICBhdl9mcmVlKG1hdHJvc2thLT5wYWNrZXRzW25dKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmbWF0cm9za2EtPnBhY2tldHMpOworICAgICAgICBtYXRyb3NrYS0+bnVtX3BhY2tldHMgPSAwOworICAgIH0KK30KKworc3RhdGljIGludCBtYXRyb3NrYV9wYXJzZV9sYWNlcyhNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsIHVpbnQ4X3QgKipidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnVmX3NpemUsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqKmxhY2VfYnVmLCBpbnQgKmxhY2VzKQoreworICAgIGludCByZXMgPSAwLCBuLCBzaXplID0gKmJ1Zl9zaXplOworICAgIHVpbnQ4X3QgKmRhdGEgPSAqYnVmOworICAgIHVpbnQzMl90ICpsYWNlX3NpemU7CisKKyAgICBpZiAoIXR5cGUpIHsKKyAgICAgICAgKmxhY2VzICAgID0gMTsKKyAgICAgICAgKmxhY2VfYnVmID0gYXZfbWFsbG9jeihzaXplb2YoaW50KSk7CisgICAgICAgIGlmICghKmxhY2VfYnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAqbGFjZV9idWZbMF0gPSBzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdl9hc3NlcnQwKHNpemUgPiAwKTsKKyAgICAqbGFjZXMgICAgPSAqZGF0YSArIDE7CisgICAgZGF0YSAgICAgKz0gMTsKKyAgICBzaXplICAgICAtPSAxOworICAgIGxhY2Vfc2l6ZSA9IGF2X21hbGxvY3ooKmxhY2VzICogc2l6ZW9mKGludCkpOworICAgIGlmICghbGFjZV9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAweDE6IC8qIFhpcGggbGFjaW5nICovCisgICAgeworICAgICAgICB1aW50OF90IHRlbXA7CisgICAgICAgIHVpbnQzMl90IHRvdGFsID0gMDsKKyAgICAgICAgZm9yIChuID0gMDsgcmVzID09IDAgJiYgbiA8ICpsYWNlcyAtIDE7IG4rKykgeworICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8PSB0b3RhbCkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGVtcCAgICAgICAgICA9ICpkYXRhOworICAgICAgICAgICAgICAgIHRvdGFsICAgICAgICArPSB0ZW1wOworICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSArPSB0ZW1wOworICAgICAgICAgICAgICAgIGRhdGEgICAgICAgICArPSAxOworICAgICAgICAgICAgICAgIHNpemUgICAgICAgICAtPSAxOworICAgICAgICAgICAgICAgIGlmICh0ZW1wICE9IDB4ZmYpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzaXplIDw9IHRvdGFsKSB7CisgICAgICAgICAgICByZXMgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBsYWNlX3NpemVbbl0gPSBzaXplIC0gdG90YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgMHgyOiAvKiBmaXhlZC1zaXplIGxhY2luZyAqLworICAgICAgICBpZiAoc2l6ZSAlICgqbGFjZXMpKSB7CisgICAgICAgICAgICByZXMgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChuID0gMDsgbiA8ICpsYWNlczsgbisrKQorICAgICAgICAgICAgbGFjZV9zaXplW25dID0gc2l6ZSAvICpsYWNlczsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MzogLyogRUJNTCBsYWNpbmcgKi8KKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG51bTsKKyAgICAgICAgdWludDY0X3QgdG90YWw7CisgICAgICAgIG4gPSBtYXRyb3NrYV9lYm1sbnVtX3VpbnQobWF0cm9za2EsIGRhdGEsIHNpemUsICZudW0pOworICAgICAgICBpZiAobiA8IDAgfHwgbnVtID4gSU5UX01BWCkgeworICAgICAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJFQk1MIGJsb2NrIGRhdGEgZXJyb3JcbiIpOworICAgICAgICAgICAgcmVzID0gbjwwID8gbiA6IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkYXRhICs9IG47CisgICAgICAgIHNpemUgLT0gbjsKKyAgICAgICAgdG90YWwgPSBsYWNlX3NpemVbMF0gPSBudW07CisgICAgICAgIGZvciAobiA9IDE7IHJlcyA9PSAwICYmIG4gPCAqbGFjZXMgLSAxOyBuKyspIHsKKyAgICAgICAgICAgIGludDY0X3Qgc251bTsKKyAgICAgICAgICAgIGludCByOworICAgICAgICAgICAgciA9IG1hdHJvc2thX2VibWxudW1fc2ludChtYXRyb3NrYSwgZGF0YSwgc2l6ZSwgJnNudW0pOworICAgICAgICAgICAgaWYgKHIgPCAwIHx8IGxhY2Vfc2l6ZVtuIC0gMV0gKyBzbnVtID4gKHVpbnQ2NF90KUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJFQk1MIGJsb2NrIGRhdGEgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIHJlcyA9IHI8MCA/IHIgOiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YSAgICAgICAgKz0gcjsKKyAgICAgICAgICAgIHNpemUgICAgICAgIC09IHI7CisgICAgICAgICAgICBsYWNlX3NpemVbbl0gPSBsYWNlX3NpemVbbiAtIDFdICsgc251bTsKKyAgICAgICAgICAgIHRvdGFsICAgICAgICs9IGxhY2Vfc2l6ZVtuXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA8PSB0b3RhbCkgeworICAgICAgICAgICAgcmVzID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGxhY2Vfc2l6ZVsqbGFjZXMgLSAxXSA9IHNpemUgLSB0b3RhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKworICAgICpidWYgICAgICA9IGRhdGE7CisgICAgKmxhY2VfYnVmID0gbGFjZV9zaXplOworICAgICpidWZfc2l6ZSA9IHNpemU7CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IG1hdHJvc2thX3BhcnNlX3JtX2F1ZGlvKE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cm9za2FUcmFjayAqdHJhY2ssIEFWU3RyZWFtICpzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwgaW50IHNpemUsIHVpbnQ2NF90IHRpbWVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvcykKK3sKKyAgICBpbnQgYSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgaW50IHNwcyA9IHRyYWNrLT5hdWRpby5zdWJfcGFja2V0X3NpemU7CisgICAgaW50IGNmcyA9IHRyYWNrLT5hdWRpby5jb2RlZF9mcmFtZXNpemU7CisgICAgaW50IGggICA9IHRyYWNrLT5hdWRpby5zdWJfcGFja2V0X2g7CisgICAgaW50IHkgICA9IHRyYWNrLT5hdWRpby5zdWJfcGFja2V0X2NudDsKKyAgICBpbnQgdyAgID0gdHJhY2stPmF1ZGlvLmZyYW1lX3NpemU7CisgICAgaW50IHg7CisKKyAgICBpZiAoIXRyYWNrLT5hdWRpby5wa3RfY250KSB7CisgICAgICAgIGlmICh0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9jbnQgPT0gMCkKKyAgICAgICAgICAgIHRyYWNrLT5hdWRpby5idWZfdGltZWNvZGUgPSB0aW1lY29kZTsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFfMjg4KSB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IGNmcyAqIGggLyAyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvcnJ1cHQgaW50NCBSTS1zdHlsZSBhdWRpbyBwYWNrZXQgc2l6ZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaCAvIDI7IHgrKykKKyAgICAgICAgICAgICAgICBtZW1jcHkodHJhY2stPmF1ZGlvLmJ1ZiArIHggKiAyICogdyArIHkgKiBjZnMsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyB4ICogY2ZzLCBjZnMpOworICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU0lQUikgeworICAgICAgICAgICAgaWYgKHNpemUgPCB3KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvcnJ1cHQgc2lwciBSTS1zdHlsZSBhdWRpbyBwYWNrZXQgc2l6ZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkodHJhY2stPmF1ZGlvLmJ1ZiArIHkgKiB3LCBkYXRhLCB3KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzaXplIDwgc3BzICogdyAvIHNwcyB8fCBoPD0wIHx8IHclc3BzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvcnJ1cHQgZ2VuZXJpYyBSTS1zdHlsZSBhdWRpbyBwYWNrZXQgc2l6ZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdyAvIHNwczsgeCsrKQorICAgICAgICAgICAgICAgIG1lbWNweSh0cmFjay0+YXVkaW8uYnVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgc3BzICogKGggKiB4ICsgKChoICsgMSkgLyAyKSAqICh5ICYgMSkgKyAoeSA+PiAxKSksCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyB4ICogc3BzLCBzcHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCsrdHJhY2stPmF1ZGlvLnN1Yl9wYWNrZXRfY250ID49IGgpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NJUFIpCisgICAgICAgICAgICAgICAgZmZfcm1fcmVvcmRlcl9zaXByX2RhdGEodHJhY2stPmF1ZGlvLmJ1ZiwgaCwgdyk7CisgICAgICAgICAgICB0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9jbnQgPSAwOworICAgICAgICAgICAgdHJhY2stPmF1ZGlvLnBrdF9jbnQgICAgICAgID0gaCAqIHcgLyBhOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKHRyYWNrLT5hdWRpby5wa3RfY250KSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIEFWUGFja2V0ICpwa3QgPSBhdl9tYWxsb2N6KHNpemVvZihBVlBhY2tldCkpOworICAgICAgICBpZiAoIXBrdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgcmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIGEpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZShwa3QpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocGt0LT5kYXRhLAorICAgICAgICAgICAgICAgdHJhY2stPmF1ZGlvLmJ1ZiArIGEgKiAoaCAqIHcgLyBhIC0gdHJhY2stPmF1ZGlvLnBrdF9jbnQtLSksCisgICAgICAgICAgICAgICBhKTsKKyAgICAgICAgcGt0LT5wdHMgICAgICAgICAgICAgICAgICA9IHRyYWNrLT5hdWRpby5idWZfdGltZWNvZGU7CisgICAgICAgIHRyYWNrLT5hdWRpby5idWZfdGltZWNvZGUgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgcGt0LT5wb3MgICAgICAgICAgICAgICAgICA9IHBvczsKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggICAgICAgICA9IHN0LT5pbmRleDsKKyAgICAgICAgZHluYXJyYXlfYWRkKCZtYXRyb3NrYS0+cGFja2V0cywgJm1hdHJvc2thLT5udW1fcGFja2V0cywgcGt0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogcmVjb25zdHJ1Y3QgZnVsbCB3YXZwYWNrIGJsb2NrcyBmcm9tIG1hbmdsZWQgbWF0cm9za2Egb25lcyAqLworc3RhdGljIGludCBtYXRyb3NrYV9wYXJzZV93YXZwYWNrKE1hdHJvc2thVHJhY2sgKnRyYWNrLCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnBkc3QsIGludCAqc2l6ZSkKK3sKKyAgICB1aW50OF90ICpkc3QgPSBOVUxMOworICAgIGludCBkc3RsZW4gICA9IDA7CisgICAgaW50IHNyY2xlbiAgID0gKnNpemU7CisgICAgdWludDMyX3Qgc2FtcGxlczsKKyAgICB1aW50MTZfdCB2ZXI7CisgICAgaW50IHJldCwgb2Zmc2V0ID0gMDsKKworICAgIGlmIChzcmNsZW4gPCAxMiB8fCB0cmFjay0+c3RyZWFtLT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPCAyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHZlciA9IEFWX1JMMTYodHJhY2stPnN0cmVhbS0+Y29kZWMtPmV4dHJhZGF0YSk7CisKKyAgICBzYW1wbGVzID0gQVZfUkwzMihzcmMpOworICAgIHNyYyAgICArPSA0OworICAgIHNyY2xlbiAtPSA0OworCisgICAgd2hpbGUgKHNyY2xlbiA+PSA4KSB7CisgICAgICAgIGludCBtdWx0aWJsb2NrOworICAgICAgICB1aW50MzJfdCBibG9ja3NpemU7CisgICAgICAgIHVpbnQ4X3QgKnRtcDsKKworICAgICAgICB1aW50MzJfdCBmbGFncyA9IEFWX1JMMzIoc3JjKTsKKyAgICAgICAgdWludDMyX3QgY3JjICAgPSBBVl9STDMyKHNyYyArIDQpOworICAgICAgICBzcmMgICAgKz0gODsKKyAgICAgICAgc3JjbGVuIC09IDg7CisKKyAgICAgICAgbXVsdGlibG9jayA9IChmbGFncyAmIDB4MTgwMCkgIT0gMHgxODAwOworICAgICAgICBpZiAobXVsdGlibG9jaykgeworICAgICAgICAgICAgaWYgKHNyY2xlbiA8IDQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJsb2Nrc2l6ZSA9IEFWX1JMMzIoc3JjKTsKKyAgICAgICAgICAgIHNyYyAgICAgICs9IDQ7CisgICAgICAgICAgICBzcmNsZW4gICAtPSA0OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJsb2Nrc2l6ZSA9IHNyY2xlbjsKKworICAgICAgICBpZiAoYmxvY2tzaXplID4gc3JjbGVuKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgdG1wID0gYXZfcmVhbGxvYyhkc3QsIGRzdGxlbiArIGJsb2Nrc2l6ZSArIDMyKTsKKyAgICAgICAgaWYgKCF0bXApIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBkc3QgICAgID0gdG1wOworICAgICAgICBkc3RsZW4gKz0gYmxvY2tzaXplICsgMzI7CisKKyAgICAgICAgQVZfV0wzMihkc3QgKyBvZmZzZXQsIE1LVEFHKCd3JywgJ3YnLCAncCcsICdrJykpOyAgIC8vIHRhZworICAgICAgICBBVl9XTDMyKGRzdCArIG9mZnNldCArICA0LCBibG9ja3NpemUgKyAyNCk7ICAgICAgICAgLy8gYmxvY2tzaXplIC0gOAorICAgICAgICBBVl9XTDE2KGRzdCArIG9mZnNldCArICA4LCB2ZXIpOyAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbgorICAgICAgICBBVl9XTDE2KGRzdCArIG9mZnNldCArIDEwLCAwKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2svaW5kZXhfbm8KKyAgICAgICAgQVZfV0wzMihkc3QgKyBvZmZzZXQgKyAxMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIHRvdGFsIHNhbXBsZXMKKyAgICAgICAgQVZfV0wzMihkc3QgKyBvZmZzZXQgKyAxNiwgMCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrIGluZGV4CisgICAgICAgIEFWX1dMMzIoZHN0ICsgb2Zmc2V0ICsgMjAsIHNhbXBsZXMpOyAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2Ygc2FtcGxlcworICAgICAgICBBVl9XTDMyKGRzdCArIG9mZnNldCArIDI0LCBmbGFncyk7ICAgICAgICAgICAgICAgICAgLy8gZmxhZ3MKKyAgICAgICAgQVZfV0wzMihkc3QgKyBvZmZzZXQgKyAyOCwgY3JjKTsgICAgICAgICAgICAgICAgICAgIC8vIGNyYworICAgICAgICBtZW1jcHkoZHN0ICsgb2Zmc2V0ICsgMzIsIHNyYywgYmxvY2tzaXplKTsgICAgICAgICAgLy8gYmxvY2sgZGF0YQorCisgICAgICAgIHNyYyAgICArPSBibG9ja3NpemU7CisgICAgICAgIHNyY2xlbiAtPSBibG9ja3NpemU7CisgICAgICAgIG9mZnNldCArPSBibG9ja3NpemUgKyAzMjsKKyAgICB9CisKKyAgICAqcGRzdCA9IGRzdDsKKyAgICAqc2l6ZSA9IGRzdGxlbjsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2ZyZWVwKCZkc3QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF0cm9za2FfcGFyc2Vfd2VidnR0KE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJvc2thVHJhY2sgKnRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwgaW50IGRhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zKQoreworICAgIEFWUGFja2V0ICpwa3Q7CisgICAgdWludDhfdCAqaWQsICpzZXR0aW5ncywgKnRleHQsICpidWY7CisgICAgaW50IGlkX2xlbiwgc2V0dGluZ3NfbGVuLCB0ZXh0X2xlbjsKKyAgICB1aW50OF90ICpwLCAqcTsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKGRhdGFfbGVuIDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcCA9IGRhdGE7CisgICAgcSA9IGRhdGEgKyBkYXRhX2xlbjsKKworICAgIGlkID0gcDsKKyAgICBpZF9sZW4gPSAtMTsKKyAgICB3aGlsZSAocCA8IHEpIHsKKyAgICAgICAgaWYgKCpwID09ICdccicgfHwgKnAgPT0gJ1xuJykgeworICAgICAgICAgICAgaWRfbGVuID0gcCAtIGlkOworICAgICAgICAgICAgaWYgKCpwID09ICdccicpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcCsrOworICAgIH0KKworICAgIGlmIChwID49IHEgfHwgKnAgIT0gJ1xuJykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgcCsrOworCisgICAgc2V0dGluZ3MgPSBwOworICAgIHNldHRpbmdzX2xlbiA9IC0xOworICAgIHdoaWxlIChwIDwgcSkgeworICAgICAgICBpZiAoKnAgPT0gJ1xyJyB8fCAqcCA9PSAnXG4nKSB7CisgICAgICAgICAgICBzZXR0aW5nc19sZW4gPSBwIC0gc2V0dGluZ3M7CisgICAgICAgICAgICBpZiAoKnAgPT0gJ1xyJykKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwKys7CisgICAgfQorCisgICAgaWYgKHAgPj0gcSB8fCAqcCAhPSAnXG4nKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBwKys7CisKKyAgICB0ZXh0ID0gcDsKKyAgICB0ZXh0X2xlbiA9IHEgLSBwOworICAgIHdoaWxlICh0ZXh0X2xlbiA+IDApIHsKKyAgICAgICAgY29uc3QgaW50IGxlbiA9IHRleHRfbGVuIC0gMTsKKyAgICAgICAgY29uc3QgdWludDhfdCBjID0gcFtsZW5dOworICAgICAgICBpZiAoYyAhPSAnXHInICYmIGMgIT0gJ1xuJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB0ZXh0X2xlbiA9IGxlbjsKKyAgICB9CisKKyAgICBpZiAodGV4dF9sZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBwa3QgPSBhdl9tYWxsb2N6KHNpemVvZigqcGt0KSk7CisgICAgZXJyID0gYXZfbmV3X3BhY2tldChwa3QsIHRleHRfbGVuKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9mcmVlKHBrdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKGVycik7CisgICAgfQorCisgICAgbWVtY3B5KHBrdC0+ZGF0YSwgdGV4dCwgdGV4dF9sZW4pOworCisgICAgaWYgKGlkX2xlbiA+IDApIHsKKyAgICAgICAgYnVmID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9XRUJWVFRfSURFTlRJRklFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRfbGVuKTsKKyAgICAgICAgaWYgKCFidWYpIHsKKyAgICAgICAgICAgIGF2X2ZyZWUocGt0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJ1ZiwgaWQsIGlkX2xlbik7CisgICAgfQorCisgICAgaWYgKHNldHRpbmdzX2xlbiA+IDApIHsKKyAgICAgICAgYnVmID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9XRUJWVFRfU0VUVElOR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzX2xlbik7CisgICAgICAgIGlmICghYnVmKSB7CisgICAgICAgICAgICBhdl9mcmVlKHBrdCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIG1lbWNweShidWYsIHNldHRpbmdzLCBzZXR0aW5nc19sZW4pOworICAgIH0KKworICAgIC8vIERvIHdlIG5lZWQgdGhpcyBmb3Igc3VidGl0bGVzPworICAgIC8vIHBrdC0+ZmxhZ3MgPSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICBwa3QtPnB0cyA9IHRpbWVjb2RlOworCisgICAgLy8gRG8gd2UgbmVlZCB0aGlzIGZvciBzdWJ0aXRsZXM/CisgICAgLy8gcGt0LT5kdHMgPSB0aW1lY29kZTsKKworICAgIHBrdC0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICBwa3QtPnBvcyA9IHBvczsKKworICAgIGR5bmFycmF5X2FkZCgmbWF0cm9za2EtPnBhY2tldHMsICZtYXRyb3NrYS0+bnVtX3BhY2tldHMsIHBrdCk7CisgICAgbWF0cm9za2EtPnByZXZfcGt0ID0gcGt0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF0cm9za2FfcGFyc2VfZnJhbWUoTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyb3NrYVRyYWNrICp0cmFjaywgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhLCBpbnQgcGt0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVjb2RlLCB1aW50NjRfdCBsYWNlX2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvcywgaW50IGlzX2tleWZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICphZGRpdGlvbmFsLCB1aW50NjRfdCBhZGRpdGlvbmFsX2lkLCBpbnQgYWRkaXRpb25hbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRpc2NhcmRfcGFkZGluZykKK3sKKyAgICBNYXRyb3NrYVRyYWNrRW5jb2RpbmcgKmVuY29kaW5ncyA9IHRyYWNrLT5lbmNvZGluZ3MuZWxlbTsKKyAgICB1aW50OF90ICpwa3RfZGF0YSA9IGRhdGE7CisgICAgaW50IG9mZnNldCA9IDAsIHJlczsKKyAgICBBVlBhY2tldCAqcGt0OworCisgICAgaWYgKGVuY29kaW5ncyAmJiAhZW5jb2RpbmdzLT50eXBlICYmIGVuY29kaW5ncy0+c2NvcGUgJiAxKSB7CisgICAgICAgIHJlcyA9IG1hdHJvc2thX2RlY29kZV9idWZmZXIoJnBrdF9kYXRhLCAmcGt0X3NpemUsIHRyYWNrKTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dBVlBBQ0spIHsKKyAgICAgICAgdWludDhfdCAqd3ZfZGF0YTsKKyAgICAgICAgcmVzID0gbWF0cm9za2FfcGFyc2Vfd2F2cGFjayh0cmFjaywgcGt0X2RhdGEsICZ3dl9kYXRhLCAmcGt0X3NpemUpOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBhIHdhdnBhY2sgYmxvY2suXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocGt0X2RhdGEgIT0gZGF0YSkKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwa3RfZGF0YSk7CisgICAgICAgIHBrdF9kYXRhID0gd3ZfZGF0YTsKKyAgICB9CisKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QUk9SRVMgJiYKKyAgICAgICAgQVZfUkIzMigmZGF0YVs0XSkgIT0gTUtCRVRBRygnaScsICdjJywgJ3AnLCAnZicpKQorICAgICAgICBvZmZzZXQgPSA4OworCisgICAgcGt0ID0gYXZfbWFsbG9jeihzaXplb2YoQVZQYWNrZXQpKTsKKyAgICAvKiBYWFg6IHByZXZlbnQgZGF0YSBjb3B5Li4uICovCisgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBwa3Rfc2l6ZSArIG9mZnNldCkgPCAwKSB7CisgICAgICAgIGF2X2ZyZWUocGt0KTsKKyAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUFJPUkVTICYmIG9mZnNldCA9PSA4KSB7CisgICAgICAgIHVpbnQ4X3QgKmJ1ZiA9IHBrdC0+ZGF0YTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCBwa3Rfc2l6ZSk7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgTUtCRVRBRygnaScsICdjJywgJ3AnLCAnZicpKTsKKyAgICB9CisKKyAgICBtZW1jcHkocGt0LT5kYXRhICsgb2Zmc2V0LCBwa3RfZGF0YSwgcGt0X3NpemUpOworCisgICAgaWYgKHBrdF9kYXRhICE9IGRhdGEpCisgICAgICAgIGF2X2ZyZWVwKCZwa3RfZGF0YSk7CisKKyAgICBwa3QtPmZsYWdzICAgICAgICA9IGlzX2tleWZyYW1lOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworCisgICAgaWYgKGFkZGl0aW9uYWxfc2l6ZSA+IDApIHsKKyAgICAgICAgdWludDhfdCAqc2lkZV9kYXRhID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9NQVRST1NLQV9CTE9DS0FERElUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfc2l6ZSArIDgpOworICAgICAgICBpZiAoIXNpZGVfZGF0YSkgeworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgIGF2X2ZyZWUocGt0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgQVZfV0I2NChzaWRlX2RhdGEsIGFkZGl0aW9uYWxfaWQpOworICAgICAgICBtZW1jcHkoc2lkZV9kYXRhICsgOCwgYWRkaXRpb25hbCwgYWRkaXRpb25hbF9zaXplKTsKKyAgICB9CisKKyAgICBpZiAoZGlzY2FyZF9wYWRkaW5nKSB7CisgICAgICAgIHVpbnQ4X3QgKnNpZGVfZGF0YSA9IGF2X3BhY2tldF9uZXdfc2lkZV9kYXRhKHBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfU0tJUF9TQU1QTEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCk7CisgICAgICAgIGlmICghc2lkZV9kYXRhKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgYXZfZnJlZShwa3QpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBBVl9XTDMyKHNpZGVfZGF0YSwgMCk7CisgICAgICAgIEFWX1dMMzIoc2lkZV9kYXRhICsgNCwgYXZfcmVzY2FsZV9xKGRpc2NhcmRfcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIDEwMDAwMDAwMDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZX0pKTsKKyAgICB9CisKKyAgICBpZiAodHJhY2stPm1zX2NvbXBhdCkKKyAgICAgICAgcGt0LT5kdHMgPSB0aW1lY29kZTsKKyAgICBlbHNlCisgICAgICAgIHBrdC0+cHRzID0gdGltZWNvZGU7CisgICAgcGt0LT5wb3MgPSBwb3M7CisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1VCUklQKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgKiBIaXN0b3JpY2FsbHksIHdlIGhhdmUgcHV0IHN1YnRpdGxlIGR1cmF0aW9uCisgICAgICAgICAqIGluIGNvbnZlcmdlbmNlX2R1cmF0aW9uLCBvbiB0aGUgb2ZmIGNoYW5jZQorICAgICAgICAgKiB0aGF0IHRoZSB0aW1lX3NjYWxlIGlzIGxlc3MgdGhhbiAxdXMsIHdoaWNoCisgICAgICAgICAqIGNvdWxkIHJlc3VsdCBpbiBhIDMyYml0IG92ZXJmbG93IG9uIHRoZQorICAgICAgICAgKiBub3JtYWwgZHVyYXRpb24gZmllbGQuCisgICAgICAgICAqLworICAgICAgICBwa3QtPmNvbnZlcmdlbmNlX2R1cmF0aW9uID0gbGFjZV9kdXJhdGlvbjsKKyAgICB9CisKKyAgICBpZiAodHJhY2stPnR5cGUgIT0gTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRSB8fAorICAgICAgICBsYWNlX2R1cmF0aW9uIDw9IElOVF9NQVgpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIG5vbiBzdWJ0aXRsZSB0cmFja3MsIGp1c3Qgc3RvcmUgdGhlIGR1cmF0aW9uCisgICAgICAgICAqIGFzIG5vcm1hbC4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgaXQncyBhIHN1YnRpdGxlIHRyYWNrIGFuZCBkdXJhdGlvbiB2YWx1ZSBkb2VzCisgICAgICAgICAqIG5vdCBvdmVyZmxvdyBhIHVpbnQzMiwgdGhlbiBhbHNvIHN0b3JlIGl0IG5vcm1hbGx5LgorICAgICAgICAgKi8KKyAgICAgICAgcGt0LT5kdXJhdGlvbiA9IGxhY2VfZHVyYXRpb247CisgICAgfQorCisgICAgZHluYXJyYXlfYWRkKCZtYXRyb3NrYS0+cGFja2V0cywgJm1hdHJvc2thLT5udW1fcGFja2V0cywgcGt0KTsKKyAgICBtYXRyb3NrYS0+cHJldl9wa3QgPSBwa3Q7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBpZiAocGt0X2RhdGEgIT0gZGF0YSkKKyAgICAgICAgYXZfZnJlZXAoJnBrdF9kYXRhKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IG1hdHJvc2thX3BhcnNlX2Jsb2NrKE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSwgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludDY0X3QgcG9zLCB1aW50NjRfdCBjbHVzdGVyX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrX2R1cmF0aW9uLCBpbnQgaXNfa2V5ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmFkZGl0aW9uYWwsIHVpbnQ2NF90IGFkZGl0aW9uYWxfaWQsIGludCBhZGRpdGlvbmFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY2x1c3Rlcl9wb3MsIGludDY0X3QgZGlzY2FyZF9wYWRkaW5nKQoreworICAgIHVpbnQ2NF90IHRpbWVjb2RlID0gQVZfTk9QVFNfVkFMVUU7CisgICAgTWF0cm9za2FUcmFjayAqdHJhY2s7CisgICAgaW50IHJlcyA9IDA7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludDE2X3QgYmxvY2tfdGltZTsKKyAgICB1aW50MzJfdCAqbGFjZV9zaXplID0gTlVMTDsKKyAgICBpbnQgbiwgZmxhZ3MsIGxhY2VzID0gMDsKKyAgICB1aW50NjRfdCBudW07CisgICAgaW50IHRydXN0X2RlZmF1bHRfZHVyYXRpb24gPSAxOworCisgICAgaWYgKChuID0gbWF0cm9za2FfZWJtbG51bV91aW50KG1hdHJvc2thLCBkYXRhLCBzaXplLCAmbnVtKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhtYXRyb3NrYS0+Y3R4LCBBVl9MT0dfRVJST1IsICJFQk1MIGJsb2NrIGRhdGEgZXJyb3JcbiIpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisgICAgZGF0YSArPSBuOworICAgIHNpemUgLT0gbjsKKworICAgIHRyYWNrID0gbWF0cm9za2FfZmluZF90cmFja19ieV9udW0obWF0cm9za2EsIG51bSk7CisgICAgaWYgKCF0cmFjayB8fCAhdHJhY2stPnN0cmVhbSkgeworICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAiSW52YWxpZCBzdHJlYW0gJSJQUkl1NjQiIG9yIHNpemUgJXVcbiIsIG51bSwgc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0gZWxzZSBpZiAoc2l6ZSA8PSAzKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IHRyYWNrLT5zdHJlYW07CisgICAgaWYgKHN0LT5kaXNjYXJkID49IEFWRElTQ0FSRF9BTEwpCisgICAgICAgIHJldHVybiByZXM7CisgICAgYXZfYXNzZXJ0MShibG9ja19kdXJhdGlvbiAhPSBBVl9OT1BUU19WQUxVRSk7CisKKyAgICBibG9ja190aW1lID0gc2lnbl9leHRlbmQoQVZfUkIxNihkYXRhKSwgMTYpOworICAgIGRhdGEgICAgICArPSAyOworICAgIGZsYWdzICAgICAgPSAqZGF0YSsrOworICAgIHNpemUgICAgICAtPSAzOworICAgIGlmIChpc19rZXlmcmFtZSA9PSAtMSkKKyAgICAgICAgaXNfa2V5ZnJhbWUgPSBmbGFncyAmIDB4ODAgPyBBVl9QS1RfRkxBR19LRVkgOiAwOworCisgICAgaWYgKGNsdXN0ZXJfdGltZSAhPSAodWludDY0X3QpIC0xICYmCisgICAgICAgIChibG9ja190aW1lID49IDAgfHwgY2x1c3Rlcl90aW1lID49IC1ibG9ja190aW1lKSkgeworICAgICAgICB0aW1lY29kZSA9IGNsdXN0ZXJfdGltZSArIGJsb2NrX3RpbWUgLSB0cmFjay0+Y29kZWNfZGVsYXk7CisgICAgICAgIGlmICh0cmFjay0+dHlwZSA9PSBNQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFICYmCisgICAgICAgICAgICB0aW1lY29kZSA8IHRyYWNrLT5lbmRfdGltZWNvZGUpCisgICAgICAgICAgICBpc19rZXlmcmFtZSA9IDA7ICAvKiBvdmVybGFwcGluZyBzdWJ0aXRsZXMgYXJlIG5vdCBrZXkgZnJhbWUgKi8KKyAgICAgICAgaWYgKGlzX2tleWZyYW1lKQorICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LCBjbHVzdGVyX3BvcywgdGltZWNvZGUsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgfQorCisgICAgaWYgKG1hdHJvc2thLT5za2lwX3RvX2tleWZyYW1lICYmCisgICAgICAgIHRyYWNrLT50eXBlICE9IE1BVFJPU0tBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgaWYgKHRpbWVjb2RlIDwgbWF0cm9za2EtPnNraXBfdG9fdGltZWNvZGUpCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICBpZiAoaXNfa2V5ZnJhbWUpCisgICAgICAgICAgICBtYXRyb3NrYS0+c2tpcF90b19rZXlmcmFtZSA9IDA7CisgICAgICAgIGVsc2UgaWYgKCFzdC0+c2tpcF90b19rZXlmcmFtZSkgeworICAgICAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19FUlJPUiwgIkZpbGUgaXMgYnJva2VuLCBrZXlmcmFtZXMgbm90IGNvcnJlY3RseSBtYXJrZWQhXG4iKTsKKyAgICAgICAgICAgIG1hdHJvc2thLT5za2lwX3RvX2tleWZyYW1lID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IG1hdHJvc2thX3BhcnNlX2xhY2VzKG1hdHJvc2thLCAmZGF0YSwgJnNpemUsIChmbGFncyAmIDB4MDYpID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxhY2Vfc2l6ZSwgJmxhY2VzKTsKKworICAgIGlmIChyZXMpCisgICAgICAgIGdvdG8gZW5kOworCisgICAgaWYgKHRyYWNrLT5hdWRpby5zYW1wbGVyYXRlID09IDgwMDApIHsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBuZWVkZWQgZm9yIG1vcmUgY29kZWNzLCB0aGVuIGFkZCB0aGVtIGhlcmUKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKSB7CisgICAgICAgICAgICBpZiAodHJhY2stPmF1ZGlvLnNhbXBsZXJhdGUgIT0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSB8fCAhc3QtPmNvZGVjLT5mcmFtZV9zaXplKQorICAgICAgICAgICAgICAgIHRydXN0X2RlZmF1bHRfZHVyYXRpb24gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFibG9ja19kdXJhdGlvbiAmJiB0cnVzdF9kZWZhdWx0X2R1cmF0aW9uKQorICAgICAgICBibG9ja19kdXJhdGlvbiA9IHRyYWNrLT5kZWZhdWx0X2R1cmF0aW9uICogbGFjZXMgLyBtYXRyb3NrYS0+dGltZV9zY2FsZTsKKworICAgIGlmIChjbHVzdGVyX3RpbWUgIT0gKHVpbnQ2NF90KS0xICYmIChibG9ja190aW1lID49IDAgfHwgY2x1c3Rlcl90aW1lID49IC1ibG9ja190aW1lKSkKKyAgICAgICAgdHJhY2stPmVuZF90aW1lY29kZSA9CisgICAgICAgICAgICBGRk1BWCh0cmFjay0+ZW5kX3RpbWVjb2RlLCB0aW1lY29kZSArIGJsb2NrX2R1cmF0aW9uKTsKKworICAgIGZvciAobiA9IDA7IG4gPCBsYWNlczsgbisrKSB7CisgICAgICAgIGludDY0X3QgbGFjZV9kdXJhdGlvbiA9IGJsb2NrX2R1cmF0aW9uKihuKzEpIC8gbGFjZXMgLSBibG9ja19kdXJhdGlvbipuIC8gbGFjZXM7CisKKyAgICAgICAgaWYgKGxhY2Vfc2l6ZVtuXSA+IHNpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhtYXRyb3NrYS0+Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBhY2tldCBzaXplXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBXzI4OCB8fAorICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQ09PSyAgIHx8CisgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TSVBSICAgfHwKKyAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FUUkFDMykgJiYKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gJiYgdHJhY2stPmF1ZGlvLnN1Yl9wYWNrZXRfc2l6ZSkgeworICAgICAgICAgICAgcmVzID0gbWF0cm9za2FfcGFyc2Vfcm1fYXVkaW8obWF0cm9za2EsIHRyYWNrLCBzdCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVjb2RlLCBwb3MpOworICAgICAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKworICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV0VCVlRUKSB7CisgICAgICAgICAgICByZXMgPSBtYXRyb3NrYV9wYXJzZV93ZWJ2dHQobWF0cm9za2EsIHRyYWNrLCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBsYWNlX3NpemVbbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWNvZGUsIGxhY2VfZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zKTsKKyAgICAgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBtYXRyb3NrYV9wYXJzZV9mcmFtZShtYXRyb3NrYSwgdHJhY2ssIHN0LCBkYXRhLCBsYWNlX3NpemVbbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lY29kZSwgbGFjZV9kdXJhdGlvbiwgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW4gPyBpc19rZXlmcmFtZSA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsLCBhZGRpdGlvbmFsX2lkLCBhZGRpdGlvbmFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkX3BhZGRpbmcpOworICAgICAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aW1lY29kZSAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHRpbWVjb2RlID0gbGFjZV9kdXJhdGlvbiA/IHRpbWVjb2RlICsgbGFjZV9kdXJhdGlvbiA6IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBkYXRhICs9IGxhY2Vfc2l6ZVtuXTsKKyAgICAgICAgc2l6ZSAtPSBsYWNlX3NpemVbbl07CisgICAgfQorCitlbmQ6CisgICAgYXZfZnJlZShsYWNlX3NpemUpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgbWF0cm9za2FfcGFyc2VfY2x1c3Rlcl9pbmNyZW1lbnRhbChNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EpCit7CisgICAgRWJtbExpc3QgKmJsb2Nrc19saXN0OworICAgIE1hdHJvc2thQmxvY2sgKmJsb2NrczsKKyAgICBpbnQgaSwgcmVzOworICAgIHJlcyA9IGVibWxfcGFyc2UobWF0cm9za2EsCisgICAgICAgICAgICAgICAgICAgICBtYXRyb3NrYV9jbHVzdGVyX2luY3JlbWVudGFsX3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAmbWF0cm9za2EtPmN1cnJlbnRfY2x1c3Rlcik7CisgICAgaWYgKHJlcyA9PSAxKSB7CisgICAgICAgIC8qIE5ldyBDbHVzdGVyICovCisgICAgICAgIGlmIChtYXRyb3NrYS0+Y3VycmVudF9jbHVzdGVyX3BvcykKKyAgICAgICAgICAgIGVibWxfbGV2ZWxfZW5kKG1hdHJvc2thKTsKKyAgICAgICAgZWJtbF9mcmVlKG1hdHJvc2thX2NsdXN0ZXIsICZtYXRyb3NrYS0+Y3VycmVudF9jbHVzdGVyKTsKKyAgICAgICAgbWVtc2V0KCZtYXRyb3NrYS0+Y3VycmVudF9jbHVzdGVyLCAwLCBzaXplb2YoTWF0cm9za2FDbHVzdGVyKSk7CisgICAgICAgIG1hdHJvc2thLT5jdXJyZW50X2NsdXN0ZXJfbnVtX2Jsb2NrcyA9IDA7CisgICAgICAgIG1hdHJvc2thLT5jdXJyZW50X2NsdXN0ZXJfcG9zICAgICAgICA9IGF2aW9fdGVsbChtYXRyb3NrYS0+Y3R4LT5wYik7CisgICAgICAgIG1hdHJvc2thLT5wcmV2X3BrdCAgICAgICAgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIC8qIHNpemVvZiB0aGUgSUQgd2hpY2ggd2FzIGFscmVhZHkgcmVhZCAqLworICAgICAgICBpZiAobWF0cm9za2EtPmN1cnJlbnRfaWQpCisgICAgICAgICAgICBtYXRyb3NrYS0+Y3VycmVudF9jbHVzdGVyX3BvcyAtPSA0OworICAgICAgICByZXMgPSBlYm1sX3BhcnNlKG1hdHJvc2thLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJvc2thX2NsdXN0ZXJzX2luY3JlbWVudGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICZtYXRyb3NrYS0+Y3VycmVudF9jbHVzdGVyKTsKKyAgICAgICAgLyogVHJ5IHBhcnNpbmcgdGhlIGJsb2NrIGFnYWluLiAqLworICAgICAgICBpZiAocmVzID09IDEpCisgICAgICAgICAgICByZXMgPSBlYm1sX3BhcnNlKG1hdHJvc2thLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyb3NrYV9jbHVzdGVyX2luY3JlbWVudGFsX3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXRyb3NrYS0+Y3VycmVudF9jbHVzdGVyKTsKKyAgICB9CisKKyAgICBpZiAoIXJlcyAmJgorICAgICAgICBtYXRyb3NrYS0+Y3VycmVudF9jbHVzdGVyX251bV9ibG9ja3MgPAorICAgICAgICBtYXRyb3NrYS0+Y3VycmVudF9jbHVzdGVyLmJsb2Nrcy5uYl9lbGVtKSB7CisgICAgICAgIGJsb2Nrc19saXN0ID0gJm1hdHJvc2thLT5jdXJyZW50X2NsdXN0ZXIuYmxvY2tzOworICAgICAgICBibG9ja3MgICAgICA9IGJsb2Nrc19saXN0LT5lbGVtOworCisgICAgICAgIG1hdHJvc2thLT5jdXJyZW50X2NsdXN0ZXJfbnVtX2Jsb2NrcyA9IGJsb2Nrc19saXN0LT5uYl9lbGVtOworICAgICAgICBpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBibG9ja3NfbGlzdC0+bmJfZWxlbSAtIDE7CisgICAgICAgIGlmIChibG9ja3NbaV0uYmluLnNpemUgPiAwICYmIGJsb2Nrc1tpXS5iaW4uZGF0YSkgeworICAgICAgICAgICAgaW50IGlzX2tleWZyYW1lID0gYmxvY2tzW2ldLm5vbl9zaW1wbGUgPyAhYmxvY2tzW2ldLnJlZmVyZW5jZSA6IC0xOworICAgICAgICAgICAgdWludDhfdCogYWRkaXRpb25hbCA9IGJsb2Nrc1tpXS5hZGRpdGlvbmFsLnNpemUgPiAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc1tpXS5hZGRpdGlvbmFsLmRhdGEgOiBOVUxMOworICAgICAgICAgICAgaWYgKCFibG9ja3NbaV0ubm9uX3NpbXBsZSkKKyAgICAgICAgICAgICAgICBibG9ja3NbaV0uZHVyYXRpb24gPSAwOworICAgICAgICAgICAgcmVzID0gbWF0cm9za2FfcGFyc2VfYmxvY2sobWF0cm9za2EsIGJsb2Nrc1tpXS5iaW4uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc1tpXS5iaW4uc2l6ZSwgYmxvY2tzW2ldLmJpbi5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyb3NrYS0+Y3VycmVudF9jbHVzdGVyLnRpbWVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2ldLmR1cmF0aW9uLCBpc19rZXlmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwsIGJsb2Nrc1tpXS5hZGRpdGlvbmFsX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2ldLmFkZGl0aW9uYWwuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJvc2thLT5jdXJyZW50X2NsdXN0ZXJfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2ldLmRpc2NhcmRfcGFkZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IG1hdHJvc2thX3BhcnNlX2NsdXN0ZXIoTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thKQoreworICAgIE1hdHJvc2thQ2x1c3RlciBjbHVzdGVyID0geyAwIH07CisgICAgRWJtbExpc3QgKmJsb2Nrc19saXN0OworICAgIE1hdHJvc2thQmxvY2sgKmJsb2NrczsKKyAgICBpbnQgaSwgcmVzOworICAgIGludDY0X3QgcG9zOworCisgICAgaWYgKCFtYXRyb3NrYS0+Y29udGFpbnNfc3NhKQorICAgICAgICByZXR1cm4gbWF0cm9za2FfcGFyc2VfY2x1c3Rlcl9pbmNyZW1lbnRhbChtYXRyb3NrYSk7CisgICAgcG9zID0gYXZpb190ZWxsKG1hdHJvc2thLT5jdHgtPnBiKTsKKyAgICBtYXRyb3NrYS0+cHJldl9wa3QgPSBOVUxMOworICAgIGlmIChtYXRyb3NrYS0+Y3VycmVudF9pZCkKKyAgICAgICAgcG9zIC09IDQ7ICAvKiBzaXplb2YgdGhlIElEIHdoaWNoIHdhcyBhbHJlYWR5IHJlYWQgKi8KKyAgICByZXMgICAgICAgICA9IGVibWxfcGFyc2UobWF0cm9za2EsIG1hdHJvc2thX2NsdXN0ZXJzLCAmY2x1c3Rlcik7CisgICAgYmxvY2tzX2xpc3QgPSAmY2x1c3Rlci5ibG9ja3M7CisgICAgYmxvY2tzICAgICAgPSBibG9ja3NfbGlzdC0+ZWxlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzX2xpc3QtPm5iX2VsZW07IGkrKykKKyAgICAgICAgaWYgKGJsb2Nrc1tpXS5iaW4uc2l6ZSA+IDAgJiYgYmxvY2tzW2ldLmJpbi5kYXRhKSB7CisgICAgICAgICAgICBpbnQgaXNfa2V5ZnJhbWUgPSBibG9ja3NbaV0ubm9uX3NpbXBsZSA/ICFibG9ja3NbaV0ucmVmZXJlbmNlIDogLTE7CisgICAgICAgICAgICByZXMgPSBtYXRyb3NrYV9wYXJzZV9ibG9jayhtYXRyb3NrYSwgYmxvY2tzW2ldLmJpbi5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2ldLmJpbi5zaXplLCBibG9ja3NbaV0uYmluLnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIudGltZWNvZGUsIGJsb2Nrc1tpXS5kdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2tleWZyYW1lLCBOVUxMLCAwLCAwLCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NbaV0uZGlzY2FyZF9wYWRkaW5nKTsKKyAgICAgICAgfQorICAgIGVibWxfZnJlZShtYXRyb3NrYV9jbHVzdGVyLCAmY2x1c3Rlcik7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBtYXRyb3NrYV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thID0gcy0+cHJpdl9kYXRhOworCisgICAgd2hpbGUgKG1hdHJvc2thX2RlbGl2ZXJfcGFja2V0KG1hdHJvc2thLCBwa3QpKSB7CisgICAgICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKG1hdHJvc2thLT5jdHgtPnBiKTsKKyAgICAgICAgaWYgKG1hdHJvc2thLT5kb25lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICBpZiAobWF0cm9za2FfcGFyc2VfY2x1c3RlcihtYXRyb3NrYSkgPCAwKQorICAgICAgICAgICAgbWF0cm9za2FfcmVzeW5jKG1hdHJvc2thLCBwb3MpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hdHJvc2thX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQoreworICAgIE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSA9IHMtPnByaXZfZGF0YTsKKyAgICBNYXRyb3NrYVRyYWNrICp0cmFja3MgPSBOVUxMOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKKyAgICBpbnQgaSwgaW5kZXgsIGluZGV4X3N1YiwgaW5kZXhfbWluOworCisgICAgLyogUGFyc2UgdGhlIENVRVMgbm93IHNpbmNlIHdlIG5lZWQgdGhlIGluZGV4IGRhdGEgdG8gc2Vlay4gKi8KKyAgICBpZiAobWF0cm9za2EtPmN1ZXNfcGFyc2luZ19kZWZlcnJlZCA+IDApIHsKKyAgICAgICAgbWF0cm9za2EtPmN1ZXNfcGFyc2luZ19kZWZlcnJlZCA9IDA7CisgICAgICAgIG1hdHJvc2thX3BhcnNlX2N1ZXMobWF0cm9za2EpOworICAgIH0KKworICAgIGlmICghc3QtPm5iX2luZGV4X2VudHJpZXMpCisgICAgICAgIGdvdG8gZXJyOworICAgIHRpbWVzdGFtcCA9IEZGTUFYKHRpbWVzdGFtcCwgc3QtPmluZGV4X2VudHJpZXNbMF0udGltZXN0YW1wKTsKKworICAgIGlmICgoaW5kZXggPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHN0LCB0aW1lc3RhbXAsIGZsYWdzKSkgPCAwIHx8IGluZGV4ID09IHN0LT5uYl9pbmRleF9lbnRyaWVzIC0gMSkgeworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIHN0LT5pbmRleF9lbnRyaWVzW3N0LT5uYl9pbmRleF9lbnRyaWVzIC0gMV0ucG9zLAorICAgICAgICAgICAgICAgICAgU0VFS19TRVQpOworICAgICAgICBtYXRyb3NrYS0+Y3VycmVudF9pZCA9IDA7CisgICAgICAgIHdoaWxlICgoaW5kZXggPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHN0LCB0aW1lc3RhbXAsIGZsYWdzKSkgPCAwIHx8IGluZGV4ID09IHN0LT5uYl9pbmRleF9lbnRyaWVzIC0gMSkgeworICAgICAgICAgICAgbWF0cm9za2FfY2xlYXJfcXVldWUobWF0cm9za2EpOworICAgICAgICAgICAgaWYgKG1hdHJvc2thX3BhcnNlX2NsdXN0ZXIobWF0cm9za2EpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1hdHJvc2thX2NsZWFyX3F1ZXVlKG1hdHJvc2thKTsKKyAgICBpZiAoaW5kZXggPCAwIHx8IChtYXRyb3NrYS0+Y3Vlc19wYXJzaW5nX2RlZmVycmVkIDwgMCAmJiBpbmRleCA9PSBzdC0+bmJfaW5kZXhfZW50cmllcyAtIDEpKQorICAgICAgICBnb3RvIGVycjsKKworICAgIGluZGV4X21pbiA9IGluZGV4OworICAgIHRyYWNrcyA9IG1hdHJvc2thLT50cmFja3MuZWxlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF0cm9za2EtPnRyYWNrcy5uYl9lbGVtOyBpKyspIHsKKyAgICAgICAgdHJhY2tzW2ldLmF1ZGlvLnBrdF9jbnQgICAgICAgID0gMDsKKyAgICAgICAgdHJhY2tzW2ldLmF1ZGlvLnN1Yl9wYWNrZXRfY250ID0gMDsKKyAgICAgICAgdHJhY2tzW2ldLmF1ZGlvLmJ1Zl90aW1lY29kZSAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHRyYWNrc1tpXS5lbmRfdGltZWNvZGUgICAgICAgICA9IDA7CisgICAgICAgIGlmICh0cmFja3NbaV0udHlwZSA9PSBNQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFICYmCisgICAgICAgICAgICB0cmFja3NbaV0uc3RyZWFtLT5kaXNjYXJkICE9IEFWRElTQ0FSRF9BTEwpIHsKKyAgICAgICAgICAgIGluZGV4X3N1YiA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoCisgICAgICAgICAgICAgICAgdHJhY2tzW2ldLnN0cmVhbSwgc3QtPmluZGV4X2VudHJpZXNbaW5kZXhdLnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICBBVlNFRUtfRkxBR19CQUNLV0FSRCk7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXhfc3ViID49IDAgJiYKKyAgICAgICAgICAgICAgICAgIGluZGV4X21pbiA+IDAgJiYKKyAgICAgICAgICAgICAgICAgIHRyYWNrc1tpXS5zdHJlYW0tPmluZGV4X2VudHJpZXNbaW5kZXhfc3ViXS5wb3MgPCBzdC0+aW5kZXhfZW50cmllc1tpbmRleF9taW5dLnBvcyAmJgorICAgICAgICAgICAgICAgICAgc3QtPmluZGV4X2VudHJpZXNbaW5kZXhdLnRpbWVzdGFtcCAtIHRyYWNrc1tpXS5zdHJlYW0tPmluZGV4X2VudHJpZXNbaW5kZXhfc3ViXS50aW1lc3RhbXAgPCAzMDAwMDAwMDAwMCAvIG1hdHJvc2thLT50aW1lX3NjYWxlKQorICAgICAgICAgICAgICAgIGluZGV4X21pbi0tOworICAgICAgICB9CisgICAgfQorCisgICAgYXZpb19zZWVrKHMtPnBiLCBzdC0+aW5kZXhfZW50cmllc1tpbmRleF9taW5dLnBvcywgU0VFS19TRVQpOworICAgIG1hdHJvc2thLT5jdXJyZW50X2lkICAgICAgID0gMDsKKyAgICBpZiAoZmxhZ3MgJiBBVlNFRUtfRkxBR19BTlkpIHsKKyAgICAgICAgc3QtPnNraXBfdG9fa2V5ZnJhbWUgPSAwOworICAgICAgICBtYXRyb3NrYS0+c2tpcF90b190aW1lY29kZSA9IHRpbWVzdGFtcDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdC0+c2tpcF90b19rZXlmcmFtZSA9IDE7CisgICAgICAgIG1hdHJvc2thLT5za2lwX3RvX3RpbWVjb2RlID0gc3QtPmluZGV4X2VudHJpZXNbaW5kZXhdLnRpbWVzdGFtcDsKKyAgICB9CisgICAgbWF0cm9za2EtPnNraXBfdG9fa2V5ZnJhbWUgPSAxOworICAgIG1hdHJvc2thLT5kb25lICAgICAgICAgICAgID0gMDsKKyAgICBtYXRyb3NrYS0+bnVtX2xldmVscyAgICAgICA9IDA7CisgICAgZmZfdXBkYXRlX2N1cl9kdHMocywgc3QsIHN0LT5pbmRleF9lbnRyaWVzW2luZGV4XS50aW1lc3RhbXApOworICAgIHJldHVybiAwOworZXJyOgorICAgIC8vIHNsaWdodGx5IGhhY2tpc2ggYnV0IGFsbG93cyBwcm9wZXIgZmFsbGJhY2sgdG8KKyAgICAvLyB0aGUgZ2VuZXJpYyBzZWVraW5nIGNvZGUuCisgICAgbWF0cm9za2FfY2xlYXJfcXVldWUobWF0cm9za2EpOworICAgIG1hdHJvc2thLT5jdXJyZW50X2lkID0gMDsKKyAgICBzdC0+c2tpcF90b19rZXlmcmFtZSA9CisgICAgbWF0cm9za2EtPnNraXBfdG9fa2V5ZnJhbWUgPSAwOworICAgIG1hdHJvc2thLT5kb25lID0gMDsKKyAgICBtYXRyb3NrYS0+bnVtX2xldmVscyA9IDA7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IG1hdHJvc2thX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSA9IHMtPnByaXZfZGF0YTsKKyAgICBNYXRyb3NrYVRyYWNrICp0cmFja3MgPSBtYXRyb3NrYS0+dHJhY2tzLmVsZW07CisgICAgaW50IG47CisKKyAgICBtYXRyb3NrYV9jbGVhcl9xdWV1ZShtYXRyb3NrYSk7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbWF0cm9za2EtPnRyYWNrcy5uYl9lbGVtOyBuKyspCisgICAgICAgIGlmICh0cmFja3Nbbl0udHlwZSA9PSBNQVRST1NLQV9UUkFDS19UWVBFX0FVRElPKQorICAgICAgICAgICAgYXZfZnJlZSh0cmFja3Nbbl0uYXVkaW8uYnVmKTsKKyAgICBlYm1sX2ZyZWUobWF0cm9za2FfY2x1c3RlciwgJm1hdHJvc2thLT5jdXJyZW50X2NsdXN0ZXIpOworICAgIGVibWxfZnJlZShtYXRyb3NrYV9zZWdtZW50LCBtYXRyb3NrYSk7CisKKyAgICByZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDY0X3Qgc3RhcnRfdGltZV9uczsKKyAgICBpbnQ2NF90IGVuZF90aW1lX25zOworICAgIGludDY0X3Qgc3RhcnRfb2Zmc2V0OworICAgIGludDY0X3QgZW5kX29mZnNldDsKK30gQ3VlRGVzYzsKKworLyogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBhbGwgdGhlIEN1ZXMgYW5kIHJldHVybnMgdGhlIEN1ZURlc2MgY29ycmVzcG9uZGluZyB0aGUKKyAqIHRoZSB0aW1lc3RhbXAgdHMuIFJldHVybmVkIEN1ZURlc2Mgd2lsbCBiZSBzdWNoIHRoYXQgc3RhcnRfdGltZV9ucyA8PSB0cyA8CisgKiBlbmRfdGltZV9ucy4gQWxsIDQgZmllbGRzIHdpbGwgYmUgc2V0IHRvIC0xIGlmIHRzID49IGZpbGUncyBkdXJhdGlvbi4KKyAqLworc3RhdGljIEN1ZURlc2MgZ2V0X2N1ZV9kZXNjKEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCB0cywgaW50NjRfdCBjdWVzX3N0YXJ0KSB7CisgICAgTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thID0gcy0+cHJpdl9kYXRhOworICAgIEN1ZURlc2MgY3VlX2Rlc2M7CisgICAgaW50IGk7CisgICAgaW50IG5iX2luZGV4X2VudHJpZXMgPSBzLT5zdHJlYW1zWzBdLT5uYl9pbmRleF9lbnRyaWVzOworICAgIEFWSW5kZXhFbnRyeSAqaW5kZXhfZW50cmllcyA9IHMtPnN0cmVhbXNbMF0tPmluZGV4X2VudHJpZXM7CisgICAgaWYgKHRzID49IG1hdHJvc2thLT5kdXJhdGlvbiAqIG1hdHJvc2thLT50aW1lX3NjYWxlKSByZXR1cm4gKEN1ZURlc2MpIHstMSwgLTEsIC0xLCAtMX07CisgICAgZm9yIChpID0gMTsgaSA8IG5iX2luZGV4X2VudHJpZXM7IGkrKykgeworICAgICAgICBpZiAoaW5kZXhfZW50cmllc1tpIC0gMV0udGltZXN0YW1wICogbWF0cm9za2EtPnRpbWVfc2NhbGUgPD0gdHMgJiYKKyAgICAgICAgICAgIGluZGV4X2VudHJpZXNbaV0udGltZXN0YW1wICogbWF0cm9za2EtPnRpbWVfc2NhbGUgPiB0cykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgLS1pOworICAgIGN1ZV9kZXNjLnN0YXJ0X3RpbWVfbnMgPSBpbmRleF9lbnRyaWVzW2ldLnRpbWVzdGFtcCAqIG1hdHJvc2thLT50aW1lX3NjYWxlOworICAgIGN1ZV9kZXNjLnN0YXJ0X29mZnNldCA9IGluZGV4X2VudHJpZXNbaV0ucG9zIC0gbWF0cm9za2EtPnNlZ21lbnRfc3RhcnQ7CisgICAgaWYgKGkgIT0gbmJfaW5kZXhfZW50cmllcyAtIDEpIHsKKyAgICAgICAgY3VlX2Rlc2MuZW5kX3RpbWVfbnMgPSBpbmRleF9lbnRyaWVzW2kgKyAxXS50aW1lc3RhbXAgKiBtYXRyb3NrYS0+dGltZV9zY2FsZTsKKyAgICAgICAgY3VlX2Rlc2MuZW5kX29mZnNldCA9IGluZGV4X2VudHJpZXNbaSArIDFdLnBvcyAtIG1hdHJvc2thLT5zZWdtZW50X3N0YXJ0OworICAgIH0gZWxzZSB7CisgICAgICAgIGN1ZV9kZXNjLmVuZF90aW1lX25zID0gbWF0cm9za2EtPmR1cmF0aW9uICogbWF0cm9za2EtPnRpbWVfc2NhbGU7CisgICAgICAgIC8vIEZJWE1FOiB0aGlzIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGZpbGVzIHdoZXJlIEN1ZXMgYXBwZWFyCisgICAgICAgIC8vIGJlZm9yZSBDbHVzdGVycy4gdGhlIGN1cnJlbnQgbG9naWMgYXNzdW1lcyBDdWVzIGFwcGVhciBhZnRlcgorICAgICAgICAvLyBDbHVzdGVycy4KKyAgICAgICAgY3VlX2Rlc2MuZW5kX29mZnNldCA9IGN1ZXNfc3RhcnQgLSBtYXRyb3NrYS0+c2VnbWVudF9zdGFydDsKKyAgICB9CisgICAgcmV0dXJuIGN1ZV9kZXNjOworfQorCitzdGF0aWMgaW50IHdlYm1fY2x1c3RlcnNfc3RhcnRfd2l0aF9rZXlmcmFtZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgY2x1c3Rlcl9wb3MsIGJlZm9yZV9wb3M7CisgICAgaW50IGluZGV4LCBydiA9IDE7CisgICAgaWYgKHMtPnN0cmVhbXNbMF0tPm5iX2luZGV4X2VudHJpZXMgPD0gMCkgcmV0dXJuIDA7CisgICAgLy8gc2VlayB0byB0aGUgZmlyc3QgY2x1c3RlciB1c2luZyBjdWVzLgorICAgIGluZGV4ID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzLT5zdHJlYW1zWzBdLCAwLCAwKTsKKyAgICBpZiAoaW5kZXggPCAwKSAgcmV0dXJuIDA7CisgICAgY2x1c3Rlcl9wb3MgPSBzLT5zdHJlYW1zWzBdLT5pbmRleF9lbnRyaWVzW2luZGV4XS5wb3M7CisgICAgYmVmb3JlX3BvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50NjRfdCBjbHVzdGVyX2lkID0gMCwgY2x1c3Rlcl9sZW5ndGggPSAwOworICAgICAgICBBVlBhY2tldCAqcGt0OworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIGNsdXN0ZXJfcG9zLCBTRUVLX1NFVCk7CisgICAgICAgIC8vIHJlYWQgY2x1c3RlciBpZCBhbmQgbGVuZ3RoCisgICAgICAgIGVibWxfcmVhZF9udW0obWF0cm9za2EsIG1hdHJvc2thLT5jdHgtPnBiLCA0LCAmY2x1c3Rlcl9pZCk7CisgICAgICAgIGVibWxfcmVhZF9sZW5ndGgobWF0cm9za2EsIG1hdHJvc2thLT5jdHgtPnBiLCAmY2x1c3Rlcl9sZW5ndGgpOworICAgICAgICBpZiAoY2x1c3Rlcl9pZCAhPSAweEY0M0I2NzUpIHsgLy8gZG9uZSB3aXRoIGFsbCBjbHVzdGVycworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBjbHVzdGVyX3BvcywgU0VFS19TRVQpOworICAgICAgICBtYXRyb3NrYS0+Y3VycmVudF9pZCA9IDA7CisgICAgICAgIG1hdHJvc2thX2NsZWFyX3F1ZXVlKG1hdHJvc2thKTsKKyAgICAgICAgaWYgKG1hdHJvc2thX3BhcnNlX2NsdXN0ZXIobWF0cm9za2EpIDwgMCB8fAorICAgICAgICAgICAgbWF0cm9za2EtPm51bV9wYWNrZXRzIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBrdCA9IG1hdHJvc2thLT5wYWNrZXRzWzBdOworICAgICAgICBjbHVzdGVyX3BvcyArPSBjbHVzdGVyX2xlbmd0aCArIDEyOyAvLyAxMiBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBjbHVzdGVyIGlkIGFuZCBsZW5ndGguCisgICAgICAgIGlmICghKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKSB7CisgICAgICAgICAgICBydiA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdmlvX3NlZWsocy0+cGIsIGJlZm9yZV9wb3MsIFNFRUtfU0VUKTsKKyAgICByZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX3NpemVfYWZ0ZXJfdGltZV9kb3dubG9hZGVkKGludDY0X3QgdGltZV9ucywgZG91YmxlIHNlYXJjaF9zZWMsIGludDY0X3QgYnBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbl9idWZmZXIsIGRvdWJsZSogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzZWNfdG9fZG93bmxvYWQsIEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3Vlc19zdGFydCkKK3sKKyAgICBkb3VibGUgbmFub19zZWNvbmRzX3Blcl9zZWNvbmQgPSAxMDAwMDAwMDAwLjA7CisgICAgZG91YmxlIHRpbWVfc2VjID0gdGltZV9ucyAvIG5hbm9fc2Vjb25kc19wZXJfc2Vjb25kOworICAgIGludCBydiA9IDA7CisgICAgaW50NjRfdCB0aW1lX3RvX3NlYXJjaF9ucyA9IChpbnQ2NF90KShzZWFyY2hfc2VjICogbmFub19zZWNvbmRzX3Blcl9zZWNvbmQpOworICAgIGludDY0X3QgZW5kX3RpbWVfbnMgPSB0aW1lX25zICsgdGltZV90b19zZWFyY2hfbnM7CisgICAgZG91YmxlIHNlY19kb3dubG9hZGVkID0gMC4wOworICAgIEN1ZURlc2MgZGVzY19jdXJyID0gZ2V0X2N1ZV9kZXNjKHMsIHRpbWVfbnMsIGN1ZXNfc3RhcnQpOworICAgIGlmIChkZXNjX2N1cnIuc3RhcnRfdGltZV9ucyA9PSAtMSkKKyAgICAgIHJldHVybiAtMTsKKyAgICAqc2VjX3RvX2Rvd25sb2FkID0gMC4wOworCisgICAgLy8gQ2hlY2sgZm9yIG5vbiBjdWUgc3RhcnQgdGltZS4KKyAgICBpZiAodGltZV9ucyA+IGRlc2NfY3Vyci5zdGFydF90aW1lX25zKSB7CisgICAgICBpbnQ2NF90IGN1ZV9uYW5vID0gZGVzY19jdXJyLmVuZF90aW1lX25zIC0gdGltZV9uczsKKyAgICAgIGRvdWJsZSBwZXJjZW50ID0gKGRvdWJsZSkoY3VlX25hbm8pIC8gKGRlc2NfY3Vyci5lbmRfdGltZV9ucyAtIGRlc2NfY3Vyci5zdGFydF90aW1lX25zKTsKKyAgICAgIGRvdWJsZSBjdWVCeXRlcyA9IChkZXNjX2N1cnIuZW5kX29mZnNldCAtIGRlc2NfY3Vyci5zdGFydF9vZmZzZXQpICogcGVyY2VudDsKKyAgICAgIGRvdWJsZSB0aW1lVG9Eb3dubG9hZCA9IChjdWVCeXRlcyAqIDguMCkgLyBicHM7CisKKyAgICAgIHNlY19kb3dubG9hZGVkICs9IChjdWVfbmFubyAvIG5hbm9fc2Vjb25kc19wZXJfc2Vjb25kKSAtIHRpbWVUb0Rvd25sb2FkOworICAgICAgKnNlY190b19kb3dubG9hZCArPSB0aW1lVG9Eb3dubG9hZDsKKworICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlYXJjaCBlbmRzIHdpdGhpbiB0aGUgZmlyc3QgY3VlLgorICAgICAgaWYgKGRlc2NfY3Vyci5lbmRfdGltZV9ucyA+PSBlbmRfdGltZV9ucykgeworICAgICAgICAgIGRvdWJsZSBkZXNjX2VuZF90aW1lX3NlYyA9IGRlc2NfY3Vyci5lbmRfdGltZV9ucyAvIG5hbm9fc2Vjb25kc19wZXJfc2Vjb25kOworICAgICAgICAgIGRvdWJsZSBwZXJjZW50X3RvX3N1YiA9IHNlYXJjaF9zZWMgLyAoZGVzY19lbmRfdGltZV9zZWMgLSB0aW1lX3NlYyk7CisgICAgICAgICAgc2VjX2Rvd25sb2FkZWQgPSBwZXJjZW50X3RvX3N1YiAqIHNlY19kb3dubG9hZGVkOworICAgICAgICAgICpzZWNfdG9fZG93bmxvYWQgPSBwZXJjZW50X3RvX3N1YiAqICpzZWNfdG9fZG93bmxvYWQ7CisgICAgICB9CisKKyAgICAgIGlmICgoc2VjX2Rvd25sb2FkZWQgKyAqYnVmZmVyKSA8PSBtaW5fYnVmZmVyKSB7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgICAgIC8vIEdldCB0aGUgbmV4dCBDdWUuCisgICAgICBkZXNjX2N1cnIgPSBnZXRfY3VlX2Rlc2MocywgZGVzY19jdXJyLmVuZF90aW1lX25zLCBjdWVzX3N0YXJ0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoZGVzY19jdXJyLnN0YXJ0X3RpbWVfbnMgIT0gLTEpIHsKKyAgICAgICAgaW50NjRfdCBkZXNjX2J5dGVzID0gZGVzY19jdXJyLmVuZF9vZmZzZXQgLSBkZXNjX2N1cnIuc3RhcnRfb2Zmc2V0OworICAgICAgICBpbnQ2NF90IGRlc2NfbnMgPSBkZXNjX2N1cnIuZW5kX3RpbWVfbnMgLSBkZXNjX2N1cnIuc3RhcnRfdGltZV9uczsKKyAgICAgICAgZG91YmxlIGRlc2Nfc2VjID0gZGVzY19ucyAvIG5hbm9fc2Vjb25kc19wZXJfc2Vjb25kOworICAgICAgICBkb3VibGUgYml0cyA9IChkZXNjX2J5dGVzICogOC4wKTsKKyAgICAgICAgZG91YmxlIHRpbWVfdG9fZG93bmxvYWQgPSBiaXRzIC8gYnBzOworCisgICAgICAgIHNlY19kb3dubG9hZGVkICs9IGRlc2Nfc2VjIC0gdGltZV90b19kb3dubG9hZDsKKyAgICAgICAgKnNlY190b19kb3dubG9hZCArPSB0aW1lX3RvX2Rvd25sb2FkOworCisgICAgICAgIGlmIChkZXNjX2N1cnIuZW5kX3RpbWVfbnMgPj0gZW5kX3RpbWVfbnMpIHsKKyAgICAgICAgICAgIGRvdWJsZSBkZXNjX2VuZF90aW1lX3NlYyA9IGRlc2NfY3Vyci5lbmRfdGltZV9ucyAvIG5hbm9fc2Vjb25kc19wZXJfc2Vjb25kOworICAgICAgICAgICAgZG91YmxlIHBlcmNlbnRfdG9fc3ViID0gc2VhcmNoX3NlYyAvIChkZXNjX2VuZF90aW1lX3NlYyAtIHRpbWVfc2VjKTsKKyAgICAgICAgICAgIHNlY19kb3dubG9hZGVkID0gcGVyY2VudF90b19zdWIgKiBzZWNfZG93bmxvYWRlZDsKKyAgICAgICAgICAgICpzZWNfdG9fZG93bmxvYWQgPSBwZXJjZW50X3RvX3N1YiAqICpzZWNfdG9fZG93bmxvYWQ7CisKKyAgICAgICAgICAgIGlmICgoc2VjX2Rvd25sb2FkZWQgKyAqYnVmZmVyKSA8PSBtaW5fYnVmZmVyKQorICAgICAgICAgICAgICAgIHJ2ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzZWNfZG93bmxvYWRlZCArICpidWZmZXIpIDw9IG1pbl9idWZmZXIpIHsKKyAgICAgICAgICAgIHJ2ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVzY19jdXJyID0gZ2V0X2N1ZV9kZXNjKHMsIGRlc2NfY3Vyci5lbmRfdGltZV9ucywgY3Vlc19zdGFydCk7CisgICAgfQorICAgICpidWZmZXIgPSAqYnVmZmVyICsgc2VjX2Rvd25sb2FkZWQ7CisgICAgcmV0dXJuIHJ2OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBiYW5kd2lkdGggb2YgdGhlIFdlYk0gZmlsZSB3aXRoIHRoZSBoZWxwIG9mCisgKiBidWZmZXJfc2l6ZV9hZnRlcl90aW1lX2Rvd25sb2FkZWQoKSBmdW5jdGlvbi4gQm90aCBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlCisgKiBhZGFwdGVkIGZyb20gV2ViTSBUb29scyBwcm9qZWN0IGFuZCBhcmUgYWRhcHRlZCB0byB3b3JrIHdpdGggRkZtcGVnJ3MKKyAqIE1hdHJvc2thIHBhcnNpbmcgbWVjaGFuaXNtLgorICoKKyAqIFJldHVybnMgdGhlIGJhbmR3aWR0aCBvZiB0aGUgZmlsZSBvbiBzdWNjZXNzOyAtMSBvbiBlcnJvci4KKyAqICovCitzdGF0aWMgaW50NjRfdCB3ZWJtX2Rhc2hfbWFuaWZlc3RfY29tcHV0ZV9iYW5kd2lkdGgoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IGN1ZXNfc3RhcnQpCit7CisgICAgTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgZG91YmxlIGJhbmR3aWR0aCA9IDAuMDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+bmJfaW5kZXhfZW50cmllczsgaSsrKSB7CisgICAgICAgIGludDY0X3QgcHJlYnVmZmVyX25zID0gMTAwMDAwMDAwMDsKKyAgICAgICAgaW50NjRfdCB0aW1lX25zID0gc3QtPmluZGV4X2VudHJpZXNbaV0udGltZXN0YW1wICogbWF0cm9za2EtPnRpbWVfc2NhbGU7CisgICAgICAgIGRvdWJsZSBuYW5vX3NlY29uZHNfcGVyX3NlY29uZCA9IDEwMDAwMDAwMDAuMDsKKyAgICAgICAgaW50NjRfdCBwcmVidWZmZXJlZF9ucyA9IHRpbWVfbnMgKyBwcmVidWZmZXJfbnM7CisgICAgICAgIGRvdWJsZSBwcmVidWZmZXJfYnl0ZXMgPSAwLjA7CisgICAgICAgIGludDY0X3QgdGVtcF9wcmVidWZmZXJfbnMgPSBwcmVidWZmZXJfbnM7CisgICAgICAgIGludDY0X3QgcHJlX2J5dGVzLCBwcmVfbnM7CisgICAgICAgIGRvdWJsZSBwcmVfc2VjLCBwcmVidWZmZXIsIGJpdHNfcGVyX3NlY29uZDsKKyAgICAgICAgQ3VlRGVzYyBkZXNjX2JlZyA9IGdldF9jdWVfZGVzYyhzLCB0aW1lX25zLCBjdWVzX3N0YXJ0KTsKKworICAgICAgICAvLyBTdGFydCB3aXRoIHRoZSBmaXJzdCBDdWUuCisgICAgICAgIEN1ZURlc2MgZGVzY19lbmQgPSBkZXNjX2JlZzsKKworICAgICAgICAvLyBGaWd1cmUgb3V0IGhvdyBtdWNoIGRhdGEgd2UgaGF2ZSBkb3dubG9hZGVkIGZvciB0aGUgcHJlYnVmZmVyLiBUaGlzIHdpbGwKKyAgICAgICAgLy8gYmUgdXNlZCBsYXRlciB0byBhZGp1c3QgdGhlIGJpdHMgcGVyIHNhbXBsZSB0byB0cnkuCisgICAgICAgIHdoaWxlIChkZXNjX2VuZC5zdGFydF90aW1lX25zICE9IC0xICYmIGRlc2NfZW5kLmVuZF90aW1lX25zIDwgcHJlYnVmZmVyZWRfbnMpIHsKKyAgICAgICAgICAgIC8vIFByZWJ1ZmZlcmVkIHRoZSBlbnRpcmUgQ3VlLgorICAgICAgICAgICAgcHJlYnVmZmVyX2J5dGVzICs9IGRlc2NfZW5kLmVuZF9vZmZzZXQgLSBkZXNjX2VuZC5zdGFydF9vZmZzZXQ7CisgICAgICAgICAgICB0ZW1wX3ByZWJ1ZmZlcl9ucyAtPSBkZXNjX2VuZC5lbmRfdGltZV9ucyAtIGRlc2NfZW5kLnN0YXJ0X3RpbWVfbnM7CisgICAgICAgICAgICBkZXNjX2VuZCA9IGdldF9jdWVfZGVzYyhzLCBkZXNjX2VuZC5lbmRfdGltZV9ucywgY3Vlc19zdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc2NfZW5kLnN0YXJ0X3RpbWVfbnMgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIFRoZSBwcmVidWZmZXIgaXMgbGFyZ2VyIHRoYW4gdGhlIGR1cmF0aW9uLgorICAgICAgICAgICAgaWYgKG1hdHJvc2thLT5kdXJhdGlvbiAqIG1hdHJvc2thLT50aW1lX3NjYWxlID49IHByZWJ1ZmZlcmVkX25zKQorICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBiaXRzX3Blcl9zZWNvbmQgPSAwLjA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUgcHJlYnVmZmVyIGVuZHMgaW4gdGhlIGxhc3QgQ3VlLiBFc3RpbWF0ZSBob3cgbXVjaCBkYXRhIHdhcworICAgICAgICAgICAgLy8gcHJlYnVmZmVyZWQuCisgICAgICAgICAgICBwcmVfYnl0ZXMgPSBkZXNjX2VuZC5lbmRfb2Zmc2V0IC0gZGVzY19lbmQuc3RhcnRfb2Zmc2V0OworICAgICAgICAgICAgcHJlX25zID0gZGVzY19lbmQuZW5kX3RpbWVfbnMgLSBkZXNjX2VuZC5zdGFydF90aW1lX25zOworICAgICAgICAgICAgcHJlX3NlYyA9IHByZV9ucyAvIG5hbm9fc2Vjb25kc19wZXJfc2Vjb25kOworICAgICAgICAgICAgcHJlYnVmZmVyX2J5dGVzICs9CisgICAgICAgICAgICAgICAgcHJlX2J5dGVzICogKCh0ZW1wX3ByZWJ1ZmZlcl9ucyAvIG5hbm9fc2Vjb25kc19wZXJfc2Vjb25kKSAvIHByZV9zZWMpOworCisgICAgICAgICAgICBwcmVidWZmZXIgPSBwcmVidWZmZXJfbnMgLyBuYW5vX3NlY29uZHNfcGVyX3NlY29uZDsKKworICAgICAgICAgICAgLy8gU2V0IHRoaXMgdG8gMC4wIGluIGNhc2Ugb3VyIHByZWJ1ZmZlciBidWZmZXJzIHRoZSBlbnRpcmUgdmlkZW8uCisgICAgICAgICAgICBiaXRzX3Blcl9zZWNvbmQgPSAwLjA7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBkZXNjX2J5dGVzID0gZGVzY19lbmQuZW5kX29mZnNldCAtIGRlc2NfYmVnLnN0YXJ0X29mZnNldDsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGRlc2NfbnMgPSBkZXNjX2VuZC5lbmRfdGltZV9ucyAtIGRlc2NfYmVnLnN0YXJ0X3RpbWVfbnM7CisgICAgICAgICAgICAgICAgZG91YmxlIGRlc2Nfc2VjID0gZGVzY19ucyAvIG5hbm9fc2Vjb25kc19wZXJfc2Vjb25kOworICAgICAgICAgICAgICAgIGRvdWJsZSBjYWxjX2JpdHNfcGVyX3NlY29uZCA9IChkZXNjX2J5dGVzICogOCkgLyBkZXNjX3NlYzsKKworICAgICAgICAgICAgICAgIC8vIERyb3AgdGhlIGJwcyBieSB0aGUgcGVyY2VudGFnZSBvZiBieXRlcyBidWZmZXJlZC4KKyAgICAgICAgICAgICAgICBkb3VibGUgcGVyY2VudCA9IChkZXNjX2J5dGVzIC0gcHJlYnVmZmVyX2J5dGVzKSAvIGRlc2NfYnl0ZXM7CisgICAgICAgICAgICAgICAgZG91YmxlIG1vZF9iaXRzX3Blcl9zZWNvbmQgPSBjYWxjX2JpdHNfcGVyX3NlY29uZCAqIHBlcmNlbnQ7CisKKyAgICAgICAgICAgICAgICBpZiAocHJlYnVmZmVyIDwgZGVzY19zZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNlYXJjaF9zZWMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkobWF0cm9za2EtPmR1cmF0aW9uICogbWF0cm9za2EtPnRpbWVfc2NhbGUpIC8gbmFub19zZWNvbmRzX3Blcl9zZWNvbmQ7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIDEgc28gdGhlIGJpdHMgcGVyIHNlY29uZCBzaG91bGQgYmUgYSBsaXR0bGUgYml0IGdyZWF0ZXIgdGhhbiBmaWxlCisgICAgICAgICAgICAgICAgICAgIC8vIGRhdGFyYXRlLgorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGJwcyA9IChpbnQ2NF90KShtb2RfYml0c19wZXJfc2Vjb25kKSArIDE7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5fYnVmZmVyID0gMC4wOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgYnVmZmVyID0gcHJlYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2VjX3RvX2Rvd25sb2FkID0gMC4wOworCisgICAgICAgICAgICAgICAgICAgIGludCBydiA9IGJ1ZmZlcl9zaXplX2FmdGVyX3RpbWVfZG93bmxvYWRlZChwcmVidWZmZXJlZF9ucywgc2VhcmNoX3NlYywgYnBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2J1ZmZlciwgJmJ1ZmZlciwgJnNlY190b19kb3dubG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIGN1ZXNfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICBpZiAocnYgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnYgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYml0c19wZXJfc2Vjb25kID0gKGRvdWJsZSkoYnBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVzY19lbmQgPSBnZXRfY3VlX2Rlc2MocywgZGVzY19lbmQuZW5kX3RpbWVfbnMsIGN1ZXNfc3RhcnQpOworICAgICAgICAgICAgfSB3aGlsZSAoZGVzY19lbmQuc3RhcnRfdGltZV9ucyAhPSAtMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhbmR3aWR0aCA8IGJpdHNfcGVyX3NlY29uZCkgYmFuZHdpZHRoID0gYml0c19wZXJfc2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gKGludDY0X3QpYmFuZHdpZHRoOworfQorCitzdGF0aWMgaW50IHdlYm1fZGFzaF9tYW5pZmVzdF9jdWVzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EgPSBzLT5wcml2X2RhdGE7CisgICAgRWJtbExpc3QgKnNlZWtoZWFkX2xpc3QgPSAmbWF0cm9za2EtPnNlZWtoZWFkOworICAgIE1hdHJvc2thU2Vla2hlYWQgKnNlZWtoZWFkID0gc2Vla2hlYWRfbGlzdC0+ZWxlbTsKKyAgICBjaGFyICpidWY7CisgICAgaW50NjRfdCBjdWVzX3N0YXJ0ID0gLTEsIGN1ZXNfZW5kID0gLTEsIGJlZm9yZV9wb3MsIGJhbmR3aWR0aDsKKyAgICBpbnQgaTsKKworICAgIC8vIGRldGVybWluZSBjdWVzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zCisgICAgZm9yIChpID0gMDsgaSA8IHNlZWtoZWFkX2xpc3QtPm5iX2VsZW07IGkrKykKKyAgICAgICAgaWYgKHNlZWtoZWFkW2ldLmlkID09IE1BVFJPU0tBX0lEX0NVRVMpCisgICAgICAgICAgICBicmVhazsKKworICAgIGlmIChpID49IHNlZWtoZWFkX2xpc3QtPm5iX2VsZW0pIHJldHVybiAtMTsKKworICAgIGJlZm9yZV9wb3MgPSBhdmlvX3RlbGwobWF0cm9za2EtPmN0eC0+cGIpOworICAgIGN1ZXNfc3RhcnQgPSBzZWVraGVhZFtpXS5wb3MgKyBtYXRyb3NrYS0+c2VnbWVudF9zdGFydDsKKyAgICBpZiAoYXZpb19zZWVrKG1hdHJvc2thLT5jdHgtPnBiLCBjdWVzX3N0YXJ0LCBTRUVLX1NFVCkgPT0gY3Vlc19zdGFydCkgeworICAgICAgICAvLyBjdWVzX2VuZCBpcyBjb21wdXRlZCBhcyBjdWVzX3N0YXJ0ICsgY3Vlc19sZW5ndGggKyBsZW5ndGggb2YgdGhlCisgICAgICAgIC8vIEN1ZXMgZWxlbWVudCBJRCArIEVCTUwgbGVuZ3RoIG9mIHRoZSBDdWVzIGVsZW1lbnQuIGN1ZXNfZW5kIGlzCisgICAgICAgIC8vIGluY2x1c2l2ZSBhbmQgdGhlIGFib3ZlIHN1bSBpcyByZWR1Y2VkIGJ5IDEuCisgICAgICAgIHVpbnQ2NF90IGN1ZXNfbGVuZ3RoID0gMCwgY3Vlc19pZCA9IDAsIGJ5dGVzX3JlYWQgPSAwOworICAgICAgICBieXRlc19yZWFkICs9IGVibWxfcmVhZF9udW0obWF0cm9za2EsIG1hdHJvc2thLT5jdHgtPnBiLCA0LCAmY3Vlc19pZCk7CisgICAgICAgIGJ5dGVzX3JlYWQgKz0gZWJtbF9yZWFkX2xlbmd0aChtYXRyb3NrYSwgbWF0cm9za2EtPmN0eC0+cGIsICZjdWVzX2xlbmd0aCk7CisgICAgICAgIGN1ZXNfZW5kID0gY3Vlc19zdGFydCArIGN1ZXNfbGVuZ3RoICsgYnl0ZXNfcmVhZCAtIDE7CisgICAgfQorICAgIGF2aW9fc2VlayhtYXRyb3NrYS0+Y3R4LT5wYiwgYmVmb3JlX3BvcywgU0VFS19TRVQpOworICAgIGlmIChjdWVzX3N0YXJ0ID09IC0xIHx8IGN1ZXNfZW5kID09IC0xKSByZXR1cm4gLTE7CisKKyAgICAvLyBwYXJzZSB0aGUgY3VlcworICAgIG1hdHJvc2thX3BhcnNlX2N1ZXMobWF0cm9za2EpOworCisgICAgLy8gY3VlcyBzdGFydAorICAgIGF2X2RpY3Rfc2V0X2ludCgmcy0+c3RyZWFtc1swXS0+bWV0YWRhdGEsIENVRVNfU1RBUlQsIGN1ZXNfc3RhcnQsIDApOworCisgICAgLy8gY3VlcyBlbmQKKyAgICBhdl9kaWN0X3NldF9pbnQoJnMtPnN0cmVhbXNbMF0tPm1ldGFkYXRhLCBDVUVTX0VORCwgY3Vlc19lbmQsIDApOworCisgICAgLy8gYmFuZHdpZHRoCisgICAgYmFuZHdpZHRoID0gd2VibV9kYXNoX21hbmlmZXN0X2NvbXB1dGVfYmFuZHdpZHRoKHMsIGN1ZXNfc3RhcnQpOworICAgIGlmIChiYW5kd2lkdGggPCAwKSByZXR1cm4gLTE7CisgICAgYXZfZGljdF9zZXRfaW50KCZzLT5zdHJlYW1zWzBdLT5tZXRhZGF0YSwgQkFORFdJRFRILCBiYW5kd2lkdGgsIDApOworCisgICAgLy8gY2hlY2sgaWYgYWxsIGNsdXN0ZXJzIHN0YXJ0IHdpdGgga2V5IGZyYW1lcworICAgIGF2X2RpY3Rfc2V0X2ludCgmcy0+c3RyZWFtc1swXS0+bWV0YWRhdGEsIENMVVNURVJfS0VZRlJBTUUsIHdlYm1fY2x1c3RlcnNfc3RhcnRfd2l0aF9rZXlmcmFtZShzKSwgMCk7CisKKyAgICAvLyBzdG9yZSBjdWUgcG9pbnQgdGltZXN0YW1wcyBhcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IGZvciBjaGVja2luZyBzdWJzZWdtZW50IGFsaWdubWVudCBpbgorICAgIC8vIHRoZSBtdXhlci4gYXNzdW1lcyB0aGF0IGVhY2ggdGltZXN0YW1wIGNhbm5vdCBiZSBtb3JlIHRoYW4gMjAgY2hhcmFjdGVycyBsb25nLgorICAgIGJ1ZiA9IGF2X21hbGxvYyhzLT5zdHJlYW1zWzBdLT5uYl9pbmRleF9lbnRyaWVzICogMjAgKiBzaXplb2YoY2hhcikpOworICAgIGlmICghYnVmKSByZXR1cm4gLTE7CisgICAgc3RyY3B5KGJ1ZiwgIiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zdHJlYW1zWzBdLT5uYl9pbmRleF9lbnRyaWVzOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmLCAoaSArIDEpICogMjAgKiBzaXplb2YoY2hhciksCisgICAgICAgICAgICAgICAgICIlcyUiIFBSSWQ2NCwgYnVmLCBzLT5zdHJlYW1zWzBdLT5pbmRleF9lbnRyaWVzW2ldLnRpbWVzdGFtcCk7CisgICAgICAgIGlmIChpICE9IHMtPnN0cmVhbXNbMF0tPm5iX2luZGV4X2VudHJpZXMgLSAxKQorICAgICAgICAgICAgc3RybmNhdChidWYsICIsIiwgc2l6ZW9mKGNoYXIpKTsKKyAgICB9CisgICAgYXZfZGljdF9zZXQoJnMtPnN0cmVhbXNbMF0tPm1ldGFkYXRhLCBDVUVfVElNRVNUQU1QUywgYnVmLCAwKTsKKyAgICBhdl9mcmVlKGJ1Zik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZWJtX2Rhc2hfbWFuaWZlc3RfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgcmV0ID0gbWF0cm9za2FfcmVhZF9oZWFkZXIocyk7CisgICAgTWF0cm9za2FUcmFjayAqdHJhY2tzOworICAgIE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSA9IHMtPnByaXZfZGF0YTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBmaWxlIGhlYWRlcnNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6YXRpb24gcmFuZ2UKKyAgICAvLyA1IGlzIHRoZSBvZmZzZXQgb2YgQ2x1c3RlciBJRC4KKyAgICBhdl9kaWN0X3NldF9pbnQoJnMtPnN0cmVhbXNbMF0tPm1ldGFkYXRhLCBJTklUSUFMSVpBVElPTl9SQU5HRSwgYXZpb190ZWxsKHMtPnBiKSAtIDUsIDApOworCisgICAgLy8gYmFzZW5hbWUgb2YgdGhlIGZpbGUKKyAgICBidWYgPSBzdHJyY2hyKHMtPmZpbGVuYW1lLCAnLycpOworICAgIGF2X2RpY3Rfc2V0KCZzLT5zdHJlYW1zWzBdLT5tZXRhZGF0YSwgRklMRU5BTUUsIGJ1ZiA/ICsrYnVmIDogcy0+ZmlsZW5hbWUsIDApOworCisgICAgLy8gZHVyYXRpb24KKyAgICBidWYgPSBhdl9hc3ByaW50ZigiJWciLCBtYXRyb3NrYS0+ZHVyYXRpb24pOworICAgIGlmICghYnVmKSByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2X2RpY3Rfc2V0KCZzLT5zdHJlYW1zWzBdLT5tZXRhZGF0YSwgRFVSQVRJT04sIGJ1ZiwgMCk7CisgICAgYXZfZnJlZShidWYpOworCisgICAgLy8gdHJhY2sgbnVtYmVyCisgICAgdHJhY2tzID0gbWF0cm9za2EtPnRyYWNrcy5lbGVtOworICAgIGF2X2RpY3Rfc2V0X2ludCgmcy0+c3RyZWFtc1swXS0+bWV0YWRhdGEsIFRSQUNLX05VTUJFUiwgdHJhY2tzWzBdLm51bSwgMCk7CisKKyAgICAvLyBwYXJzZSB0aGUgY3VlcyBhbmQgcG9wdWxhdGUgQ3VlIHJlbGF0ZWQgZmllbGRzCisgICAgcmV0dXJuIHdlYm1fZGFzaF9tYW5pZmVzdF9jdWVzKHMpOworfQorCitzdGF0aWMgaW50IHdlYm1fZGFzaF9tYW5pZmVzdF9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgcmV0dXJuIEFWRVJST1JfRU9GOworfQorCitBVklucHV0Rm9ybWF0IGZmX21hdHJvc2thX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1hdHJvc2thLHdlYm0iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNYXRyb3NrYSAvIFdlYk0iKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAibWt2LG1rM2QsbWthLG1rcyIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1hdHJvc2thRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBtYXRyb3NrYV9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBtYXRyb3NrYV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBtYXRyb3NrYV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBtYXRyb3NrYV9yZWFkX2Nsb3NlLAorICAgIC5yZWFkX3NlZWsgICAgICA9IG1hdHJvc2thX3JlYWRfc2VlaywKKyAgICAubWltZV90eXBlICAgICAgPSAiYXVkaW8vd2VibSxhdWRpby94LW1hdHJvc2thLHZpZGVvL3dlYm0sdmlkZW8veC1tYXRyb3NrYSIKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfd2VibV9kYXNoX21hbmlmZXN0X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIndlYm1fZGFzaF9tYW5pZmVzdCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldlYk0gREFTSCBNYW5pZmVzdCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNYXRyb3NrYURlbXV4Q29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgID0gd2VibV9kYXNoX21hbmlmZXN0X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHdlYm1fZGFzaF9tYW5pZmVzdF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBtYXRyb3NrYV9yZWFkX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tYXRyb3NrYWVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21hdHJvc2thZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlOGRhMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tYXRyb3NrYWVuYy5jCkBAIC0wLDAgKzEsMjA2OSBAQAorLyoKKyAqIE1hdHJvc2thIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRGF2aWQgQ29ucmFkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2Yy5oIgorI2luY2x1ZGUgImhldmMuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZmxhY2VuYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiaXNvbS5oIgorI2luY2x1ZGUgIm1hdHJvc2thLmgiCisjaW5jbHVkZSAicmlmZi5oIgorI2luY2x1ZGUgInN1YnRpdGxlcy5oIgorI2luY2x1ZGUgInZvcmJpc2NvbW1lbnQuaCIKKyNpbmNsdWRlICJ3di5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmFuZG9tX3NlZWQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NoYS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zdGVyZW8zZC5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy94aXBoLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVnNGF1ZGlvLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBlYm1sX21hc3RlciB7CisgICAgaW50NjRfdCAgICAgICAgIHBvczsgICAgICAgICAgICAgICAgLy8vPCBhYnNvbHV0ZSBvZmZzZXQgaW4gdGhlIGZpbGUgd2hlcmUgdGhlIG1hc3RlcidzIGVsZW1lbnRzIHN0YXJ0CisgICAgaW50ICAgICAgICAgICAgIHNpemVieXRlczsgICAgICAgICAgLy8vPCBob3cgbWFueSBieXRlcyB3ZXJlIHJlc2VydmVkIGZvciB0aGUgc2l6ZQorfSBlYm1sX21hc3RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgbWt2X3NlZWtoZWFkX2VudHJ5IHsKKyAgICB1bnNpZ25lZCBpbnQgICAgZWxlbWVudGlkOworICAgIHVpbnQ2NF90ICAgICAgICBzZWdtZW50cG9zOworfSBta3Zfc2Vla2hlYWRfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IG1rdl9zZWVraGVhZCB7CisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgZmlsZXBvczsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBzZWdtZW50X29mZnNldDsgICAgIC8vLzwgdGhlIGZpbGUgb2Zmc2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZF9zaXplOyAgICAgIC8vLzwgLTEgaWYgYXBwZW5kaW5nIHRvIGZpbGUKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtYXhfZW50cmllczsKKyAgICBta3Zfc2Vla2hlYWRfZW50cnkgICAgICAqZW50cmllczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBudW1fZW50cmllczsKK30gbWt2X3NlZWtoZWFkOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgICAgICAgIHB0czsKKyAgICBpbnQgICAgICAgICAgICAgc3RyZWFtX2lkeDsKKyAgICBpbnQgICAgICAgICAgICAgdHJhY2tudW07CisgICAgaW50NjRfdCAgICAgICAgIGNsdXN0ZXJfcG9zOyAgICAgICAgLy8vPCBmaWxlIG9mZnNldCBvZiB0aGUgY2x1c3RlciBjb250YWluaW5nIHRoZSBibG9jaworICAgIGludDY0X3QgICAgICAgICByZWxhdGl2ZV9wb3M7ICAgICAgIC8vLzwgcmVsYXRpdmUgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uIG9mIHRoZSBjbHVzdGVyIGNvbnRhaW5pbmcgdGhlIGJsb2NrCisgICAgaW50NjRfdCAgICAgICAgIGR1cmF0aW9uOyAgICAgICAgICAgLy8vPCBkdXJhdGlvbiBvZiB0aGUgYmxvY2sgYWNjb3JkaW5nIHRvIHRpbWUgYmFzZQorfSBta3ZfY3VlcG9pbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQ2NF90ICAgICAgICAgc2VnbWVudF9vZmZzZXQ7CisgICAgbWt2X2N1ZXBvaW50ICAgICplbnRyaWVzOworICAgIGludCAgICAgICAgICAgICBudW1fZW50cmllczsKK30gbWt2X2N1ZXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICAgd3JpdGVfZHRzOworICAgIGludCAgICAgICAgICAgICBoYXNfY3VlOworICAgIGludDY0X3QgICAgICAgICB0c19vZmZzZXQ7Cit9IG1rdl90cmFjazsKKworI2RlZmluZSBNT0RFX01BVFJPU0tBdjIgMHgwMQorI2RlZmluZSBNT0RFX1dFQk0gICAgICAgMHgwMgorCit0eXBlZGVmIHN0cnVjdCBNYXRyb3NrYU11eENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgICpjbGFzczsKKyAgICBpbnQgICAgICAgICAgICAgbW9kZTsKKyAgICBBVklPQ29udGV4dCAgICpkeW5fYmM7CisgICAgZWJtbF9tYXN0ZXIgICAgIHNlZ21lbnQ7CisgICAgaW50NjRfdCAgICAgICAgIHNlZ21lbnRfb2Zmc2V0OworICAgIGVibWxfbWFzdGVyICAgICBjbHVzdGVyOworICAgIGludDY0X3QgICAgICAgICBjbHVzdGVyX3BvczsgICAgICAgIC8vLzwgZmlsZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgY2x1c3RlcgorICAgIGludDY0X3QgICAgICAgICBjbHVzdGVyX3B0czsKKyAgICBpbnQ2NF90ICAgICAgICAgZHVyYXRpb25fb2Zmc2V0OworICAgIGludDY0X3QgICAgICAgICBkdXJhdGlvbjsKKyAgICBta3Zfc2Vla2hlYWQgICAgKm1haW5fc2Vla2hlYWQ7CisgICAgbWt2X2N1ZXMgICAgICAgICpjdWVzOworICAgIG1rdl90cmFjayAgICAgICAqdHJhY2tzOworCisgICAgQVZQYWNrZXQgICAgICAgIGN1cl9hdWRpb19wa3Q7CisKKyAgICBpbnQgaGF2ZV9hdHRhY2htZW50czsKKworICAgIGludCByZXNlcnZlX2N1ZXNfc3BhY2U7CisgICAgaW50IGNsdXN0ZXJfc2l6ZV9saW1pdDsKKyAgICBpbnQ2NF90IGN1ZXNfcG9zOworICAgIGludDY0X3QgY2x1c3Rlcl90aW1lX2xpbWl0OworICAgIGludCBpc19kYXNoOworICAgIGludCBkYXNoX3RyYWNrX251bWJlcjsKKworICAgIHVpbnQzMl90IGNoYXB0ZXJfaWRfb2Zmc2V0OworICAgIGludCB3cm90ZV9jaGFwdGVyczsKK30gTWF0cm9za2FNdXhDb250ZXh0OworCisKKy8qKiAyIGJ5dGVzICogMyBmb3IgRUJNTCBJRHMsIDMgMS1ieXRlIEVCTUwgbGVuZ3RocywgOCBieXRlcyBmb3IgNjQgYml0CisgKiBvZmZzZXQsIDQgYnl0ZXMgZm9yIHRhcmdldCBFQk1MIElEICovCisjZGVmaW5lIE1BWF9TRUVLRU5UUllfU0laRSAyMQorCisvKiogcGVyLWN1ZXBvaW50LXRyYWNrIC0gNSAxLWJ5dGUgRUJNTCBJRHMsIDUgMS1ieXRlIEVCTUwgc2l6ZXMsIDQKKyAqIDgtYnl0ZSB1aW50IG1heCAqLworI2RlZmluZSBNQVhfQ1VFVFJBQ0tQT1NfU0laRSA0MgorCisvKiogcGVyLWN1ZXBvaW50IC0gMiAxLWJ5dGUgRUJNTCBJRHMsIDIgMS1ieXRlIEVCTUwgc2l6ZXMsIDgtYnl0ZSB1aW50IG1heCAqLworI2RlZmluZSBNQVhfQ1VFUE9JTlRfU0laRShudW1fdHJhY2tzKSAxMiArIE1BWF9DVUVUUkFDS1BPU19TSVpFICogbnVtX3RyYWNrcworCisvKiogU2VlayBwcmVyb2xsIHZhbHVlIGZvciBvcHVzICovCisjZGVmaW5lIE9QVVNfU0VFS19QUkVST0xMIDgwMDAwMDAwCisKK3N0YXRpYyBpbnQgZWJtbF9pZF9zaXplKHVuc2lnbmVkIGludCBpZCkKK3sKKyAgICByZXR1cm4gKGF2X2xvZzIoaWQgKyAxKSAtIDEpIC8gNyArIDE7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9lYm1sX2lkKEFWSU9Db250ZXh0ICpwYiwgdW5zaWduZWQgaW50IGlkKQoreworICAgIGludCBpID0gZWJtbF9pZF9zaXplKGlkKTsKKyAgICB3aGlsZSAoaS0tKQorICAgICAgICBhdmlvX3c4KHBiLCAodWludDhfdCkoaWQgPj4gKGkgKiA4KSkpOworfQorCisvKioKKyAqIFdyaXRlIGFuIEVCTUwgc2l6ZSBtZWFuaW5nICJ1bmtub3duIHNpemUiLgorICoKKyAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBzaXplIHNob3VsZCBvY2N1cHkgKG1heGltdW06IDgpLgorICovCitzdGF0aWMgdm9pZCBwdXRfZWJtbF9zaXplX3Vua25vd24oQVZJT0NvbnRleHQgKnBiLCBpbnQgYnl0ZXMpCit7CisgICAgYXZfYXNzZXJ0MChieXRlcyA8PSA4KTsKKyAgICBhdmlvX3c4KHBiLCAweDFmZiA+PiBieXRlcyk7CisgICAgZmZpb19maWxsKHBiLCAweGZmLCBieXRlcyAtIDEpOworfQorCisvKioKKyAqIENhbGN1bGF0ZSBob3cgbWFueSBieXRlcyBhcmUgbmVlZGVkIHRvIHJlcHJlc2VudCBhIGdpdmVuIG51bWJlciBpbiBFQk1MLgorICovCitzdGF0aWMgaW50IGVibWxfbnVtX3NpemUodWludDY0X3QgbnVtKQoreworICAgIGludCBieXRlcyA9IDE7CisgICAgd2hpbGUgKChudW0gKyAxKSA+PiBieXRlcyAqIDcpCisgICAgICAgIGJ5dGVzKys7CisgICAgcmV0dXJuIGJ5dGVzOworfQorCisvKioKKyAqIFdyaXRlIGEgbnVtYmVyIGluIEVCTUwgdmFyaWFibGUgbGVuZ3RoIGZvcm1hdC4KKyAqCisgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG5lZWQgdG8gYmUgdXNlZCB0byB3cml0ZSB0aGUgbnVtYmVyLgorICogICAgICAgICAgICAgIElmIHplcm8sIGFueSBudW1iZXIgb2YgYnl0ZXMgY2FuIGJlIHVzZWQuCisgKi8KK3N0YXRpYyB2b2lkIHB1dF9lYm1sX251bShBVklPQ29udGV4dCAqcGIsIHVpbnQ2NF90IG51bSwgaW50IGJ5dGVzKQoreworICAgIGludCBpLCBuZWVkZWRfYnl0ZXMgPSBlYm1sX251bV9zaXplKG51bSk7CisKKyAgICAvLyBzaXplcyBsYXJnZXIgdGhhbiB0aGlzIGFyZSBjdXJyZW50bHkgdW5kZWZpbmVkIGluIEVCTUwKKyAgICBhdl9hc3NlcnQwKG51bSA8ICgxVUxMIDw8IDU2KSAtIDEpOworCisgICAgaWYgKGJ5dGVzID09IDApCisgICAgICAgIC8vIGRvbid0IGNhcmUgaG93IG1hbnkgYnl0ZXMgYXJlIHVzZWQsIHNvIHVzZSB0aGUgbWluCisgICAgICAgIGJ5dGVzID0gbmVlZGVkX2J5dGVzOworICAgIC8vIHRoZSBieXRlcyBuZWVkZWQgdG8gd3JpdGUgdGhlIGdpdmVuIHNpemUgd291bGQgZXhjZWVkIHRoZSBieXRlcworICAgIC8vIHRoYXQgd2UgbmVlZCB0byB1c2UsIHNvIHdyaXRlIHVua25vd24gc2l6ZS4gVGhpcyBzaG91bGRuJ3QgaGFwcGVuLgorICAgIGF2X2Fzc2VydDAoYnl0ZXMgPj0gbmVlZGVkX2J5dGVzKTsKKworICAgIG51bSB8PSAxVUxMIDw8IGJ5dGVzICogNzsKKyAgICBmb3IgKGkgPSBieXRlcyAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICBhdmlvX3c4KHBiLCAodWludDhfdCkobnVtID4+IGkgKiA4KSk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9lYm1sX3VpbnQoQVZJT0NvbnRleHQgKnBiLCB1bnNpZ25lZCBpbnQgZWxlbWVudGlkLCB1aW50NjRfdCB2YWwpCit7CisgICAgaW50IGksIGJ5dGVzID0gMTsKKyAgICB1aW50NjRfdCB0bXAgPSB2YWw7CisgICAgd2hpbGUgKHRtcCA+Pj0gOCkKKyAgICAgICAgYnl0ZXMrKzsKKworICAgIHB1dF9lYm1sX2lkKHBiLCBlbGVtZW50aWQpOworICAgIHB1dF9lYm1sX251bShwYiwgYnl0ZXMsIDApOworICAgIGZvciAoaSA9IGJ5dGVzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgIGF2aW9fdzgocGIsICh1aW50OF90KSh2YWwgPj4gaSAqIDgpKTsKK30KKworc3RhdGljIHZvaWQgcHV0X2VibWxfc2ludChBVklPQ29udGV4dCAqcGIsIHVuc2lnbmVkIGludCBlbGVtZW50aWQsIGludDY0X3QgdmFsKQoreworICAgIGludCBpLCBieXRlcyA9IDE7CisgICAgdWludDY0X3QgdG1wID0gMioodmFsIDwgMCA/IHZhbF4tMSA6IHZhbCk7CisKKyAgICB3aGlsZSAodG1wPj49OCkgYnl0ZXMrKzsKKworICAgIHB1dF9lYm1sX2lkKHBiLCBlbGVtZW50aWQpOworICAgIHB1dF9lYm1sX251bShwYiwgYnl0ZXMsIDApOworICAgIGZvciAoaSA9IGJ5dGVzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgIGF2aW9fdzgocGIsICh1aW50OF90KSh2YWwgPj4gaSAqIDgpKTsKK30KKworc3RhdGljIHZvaWQgcHV0X2VibWxfZmxvYXQoQVZJT0NvbnRleHQgKnBiLCB1bnNpZ25lZCBpbnQgZWxlbWVudGlkLCBkb3VibGUgdmFsKQoreworICAgIHB1dF9lYm1sX2lkKHBiLCBlbGVtZW50aWQpOworICAgIHB1dF9lYm1sX251bShwYiwgOCwgMCk7CisgICAgYXZpb193YjY0KHBiLCBhdl9kb3VibGUyaW50KHZhbCkpOworfQorCitzdGF0aWMgdm9pZCBwdXRfZWJtbF9iaW5hcnkoQVZJT0NvbnRleHQgKnBiLCB1bnNpZ25lZCBpbnQgZWxlbWVudGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgcHV0X2VibWxfaWQocGIsIGVsZW1lbnRpZCk7CisgICAgcHV0X2VibWxfbnVtKHBiLCBzaXplLCAwKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBidWYsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBwdXRfZWJtbF9zdHJpbmcoQVZJT0NvbnRleHQgKnBiLCB1bnNpZ25lZCBpbnQgZWxlbWVudGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBwdXRfZWJtbF9iaW5hcnkocGIsIGVsZW1lbnRpZCwgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKKy8qKgorICogV3JpdGUgYSB2b2lkIGVsZW1lbnQgb2YgYSBnaXZlbiBzaXplLiBVc2VmdWwgZm9yIHJlc2VydmluZyBzcGFjZSBpbgorICogdGhlIGZpbGUgdG8gYmUgd3JpdHRlbiB0byBsYXRlci4KKyAqCisgKiBAcGFyYW0gc2l6ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlc2VydmUsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgMi4KKyAqLworc3RhdGljIHZvaWQgcHV0X2VibWxfdm9pZChBVklPQ29udGV4dCAqcGIsIHVpbnQ2NF90IHNpemUpCit7CisgICAgaW50NjRfdCBjdXJyZW50cG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgIGF2X2Fzc2VydDAoc2l6ZSA+PSAyKTsKKworICAgIHB1dF9lYm1sX2lkKHBiLCBFQk1MX0lEX1ZPSUQpOworICAgIC8vIHdlIG5lZWQgdG8gc3VidHJhY3QgdGhlIGxlbmd0aCBuZWVkZWQgdG8gc3RvcmUgdGhlIHNpemUgZnJvbSB0aGUKKyAgICAvLyBzaXplIHdlIG5lZWQgdG8gcmVzZXJ2ZSBzbyAyIGNhc2VzLCB3ZSB1c2UgOCBieXRlcyB0byBzdG9yZSB0aGUKKyAgICAvLyBzaXplIGlmIHBvc3NpYmxlLCAxIGJ5dGUgb3RoZXJ3aXNlCisgICAgaWYgKHNpemUgPCAxMCkKKyAgICAgICAgcHV0X2VibWxfbnVtKHBiLCBzaXplIC0gMSwgMCk7CisgICAgZWxzZQorICAgICAgICBwdXRfZWJtbF9udW0ocGIsIHNpemUgLSA5LCA4KTsKKyAgICBmZmlvX2ZpbGwocGIsIDAsIGN1cnJlbnRwb3MgKyBzaXplIC0gYXZpb190ZWxsKHBiKSk7Cit9CisKK3N0YXRpYyBlYm1sX21hc3RlciBzdGFydF9lYm1sX21hc3RlcihBVklPQ29udGV4dCAqcGIsIHVuc2lnbmVkIGludCBlbGVtZW50aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZXhwZWN0ZWRzaXplKQoreworICAgIGludCBieXRlcyA9IGV4cGVjdGVkc2l6ZSA/IGVibWxfbnVtX3NpemUoZXhwZWN0ZWRzaXplKSA6IDg7CisgICAgcHV0X2VibWxfaWQocGIsIGVsZW1lbnRpZCk7CisgICAgcHV0X2VibWxfc2l6ZV91bmtub3duKHBiLCBieXRlcyk7CisgICAgcmV0dXJuIChlYm1sX21hc3Rlcikge2F2aW9fdGVsbChwYiksIGJ5dGVzIH07Cit9CisKK3N0YXRpYyB2b2lkIGVuZF9lYm1sX21hc3RlcihBVklPQ29udGV4dCAqcGIsIGVibWxfbWFzdGVyIG1hc3RlcikKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICBpZiAoYXZpb19zZWVrKHBiLCBtYXN0ZXIucG9zIC0gbWFzdGVyLnNpemVieXRlcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIHB1dF9lYm1sX251bShwYiwgcG9zIC0gbWFzdGVyLnBvcywgbWFzdGVyLnNpemVieXRlcyk7CisgICAgYXZpb19zZWVrKHBiLCBwb3MsIFNFRUtfU0VUKTsKK30KKworc3RhdGljIHZvaWQgcHV0X3hpcGhfc2l6ZShBVklPQ29udGV4dCAqcGIsIGludCBzaXplKQoreworICAgIGZmaW9fZmlsbChwYiwgMjU1LCBzaXplIC8gMjU1KTsKKyAgICBhdmlvX3c4KHBiLCBzaXplICUgMjU1KTsKK30KKworLyoqCisgKiBJbml0aWFsaXplIGEgbWt2X3NlZWtoZWFkIGVsZW1lbnQgdG8gYmUgcmVhZHkgdG8gaW5kZXggbGV2ZWwgMSBNYXRyb3NrYQorICogZWxlbWVudHMuIElmIGEgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaXMgc3BlY2lmaWVkLCBlbm91Z2ggc3BhY2UKKyAqIHdpbGwgYmUgcmVzZXJ2ZWQgYXQgdGhlIGN1cnJlbnQgZmlsZSBsb2NhdGlvbiB0byB3cml0ZSBhIHNlZWsgaGVhZCBvZgorICogdGhhdCBzaXplLgorICoKKyAqIEBwYXJhbSBzZWdtZW50X29mZnNldCBUaGUgYWJzb2x1dGUgb2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZQorICogICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHRoZSBzZWdtZW50IGJlZ2lucy4KKyAqIEBwYXJhbSBudW1lbGVtZW50cyBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCB3aWxsIGJlIGluZGV4ZWQKKyAqICAgICAgICAgICAgICAgICAgICBieSB0aGlzIHNlZWsgaGVhZCwgMCBpZiB1bmxpbWl0ZWQuCisgKi8KK3N0YXRpYyBta3Zfc2Vla2hlYWQgKm1rdl9zdGFydF9zZWVraGVhZChBVklPQ29udGV4dCAqcGIsIGludDY0X3Qgc2VnbWVudF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWVsZW1lbnRzKQoreworICAgIG1rdl9zZWVraGVhZCAqbmV3X3NlZWtoZWFkID0gYXZfbWFsbG9jeihzaXplb2YobWt2X3NlZWtoZWFkKSk7CisgICAgaWYgKCFuZXdfc2Vla2hlYWQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbmV3X3NlZWtoZWFkLT5zZWdtZW50X29mZnNldCA9IHNlZ21lbnRfb2Zmc2V0OworCisgICAgaWYgKG51bWVsZW1lbnRzID4gMCkgeworICAgICAgICBuZXdfc2Vla2hlYWQtPmZpbGVwb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAvLyAyMSBieXRlcyBtYXggZm9yIGEgc2VlayBlbnRyeSwgMTAgYnl0ZXMgbWF4IGZvciB0aGUgU2Vla0hlYWQgSUQKKyAgICAgICAgLy8gYW5kIHNpemUsIGFuZCAzIGJ5dGVzIHRvIGd1YXJhbnRlZSB0aGF0IGFuIEVCTUwgdm9pZCBlbGVtZW50CisgICAgICAgIC8vIHdpbGwgZml0IGFmdGVyd2FyZHMKKyAgICAgICAgbmV3X3NlZWtoZWFkLT5yZXNlcnZlZF9zaXplID0gbnVtZWxlbWVudHMgKiBNQVhfU0VFS0VOVFJZX1NJWkUgKyAxMzsKKyAgICAgICAgbmV3X3NlZWtoZWFkLT5tYXhfZW50cmllcyAgID0gbnVtZWxlbWVudHM7CisgICAgICAgIHB1dF9lYm1sX3ZvaWQocGIsIG5ld19zZWVraGVhZC0+cmVzZXJ2ZWRfc2l6ZSk7CisgICAgfQorICAgIHJldHVybiBuZXdfc2Vla2hlYWQ7Cit9CisKK3N0YXRpYyBpbnQgbWt2X2FkZF9zZWVraGVhZF9lbnRyeShta3Zfc2Vla2hlYWQgKnNlZWtoZWFkLCB1bnNpZ25lZCBpbnQgZWxlbWVudGlkLCB1aW50NjRfdCBmaWxlcG9zKQoreworICAgIG1rdl9zZWVraGVhZF9lbnRyeSAqZW50cmllcyA9IHNlZWtoZWFkLT5lbnRyaWVzOworCisgICAgLy8gZG9uJ3Qgc3RvcmUgbW9yZSBlbGVtZW50cyB0aGFuIHdlIHJlc2VydmVkIHNwYWNlIGZvcgorICAgIGlmIChzZWVraGVhZC0+bWF4X2VudHJpZXMgPiAwICYmIHNlZWtoZWFkLT5tYXhfZW50cmllcyA8PSBzZWVraGVhZC0+bnVtX2VudHJpZXMpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGVudHJpZXMgPSBhdl9yZWFsbG9jX2FycmF5KGVudHJpZXMsIHNlZWtoZWFkLT5udW1fZW50cmllcyArIDEsIHNpemVvZihta3Zfc2Vla2hlYWRfZW50cnkpKTsKKyAgICBpZiAoIWVudHJpZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc2Vla2hlYWQtPmVudHJpZXMgPSBlbnRyaWVzOworCisgICAgc2Vla2hlYWQtPmVudHJpZXNbc2Vla2hlYWQtPm51bV9lbnRyaWVzXS5lbGVtZW50aWQgICAgPSBlbGVtZW50aWQ7CisgICAgc2Vla2hlYWQtPmVudHJpZXNbc2Vla2hlYWQtPm51bV9lbnRyaWVzKytdLnNlZ21lbnRwb3MgPSBmaWxlcG9zIC0gc2Vla2hlYWQtPnNlZ21lbnRfb2Zmc2V0OworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogV3JpdGUgdGhlIHNlZWsgaGVhZCB0byB0aGUgZmlsZSBhbmQgZnJlZSBpdC4gSWYgYSBtYXhpbXVtIG51bWJlciBvZgorICogZWxlbWVudHMgd2FzIHNwZWNpZmllZCB0byBta3Zfc3RhcnRfc2Vla2hlYWQoKSwgdGhlIHNlZWsgaGVhZCB3aWxsCisgKiBiZSB3cml0dGVuIGF0IHRoZSBsb2NhdGlvbiByZXNlcnZlZCBmb3IgaXQuIE90aGVyd2lzZSwgaXQgaXMgd3JpdHRlbgorICogYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGZpbGUuCisgKgorICogQHJldHVybiBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHNlZWtoZWFkIHdhcyB3cml0dGVuLAorICogLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBpbnQ2NF90IG1rdl93cml0ZV9zZWVraGVhZChBVklPQ29udGV4dCAqcGIsIG1rdl9zZWVraGVhZCAqc2Vla2hlYWQpCit7CisgICAgZWJtbF9tYXN0ZXIgbWV0YXNlZWssIHNlZWtlbnRyeTsKKyAgICBpbnQ2NF90IGN1cnJlbnRwb3M7CisgICAgaW50IGk7CisKKyAgICBjdXJyZW50cG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgIGlmIChzZWVraGVhZC0+cmVzZXJ2ZWRfc2l6ZSA+IDApIHsKKyAgICAgICAgaWYgKGF2aW9fc2VlayhwYiwgc2Vla2hlYWQtPmZpbGVwb3MsIFNFRUtfU0VUKSA8IDApIHsKKyAgICAgICAgICAgIGN1cnJlbnRwb3MgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1ldGFzZWVrID0gc3RhcnRfZWJtbF9tYXN0ZXIocGIsIE1BVFJPU0tBX0lEX1NFRUtIRUFELCBzZWVraGVhZC0+cmVzZXJ2ZWRfc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNlZWtoZWFkLT5udW1fZW50cmllczsgaSsrKSB7CisgICAgICAgIG1rdl9zZWVraGVhZF9lbnRyeSAqZW50cnkgPSAmc2Vla2hlYWQtPmVudHJpZXNbaV07CisKKyAgICAgICAgc2Vla2VudHJ5ID0gc3RhcnRfZWJtbF9tYXN0ZXIocGIsIE1BVFJPU0tBX0lEX1NFRUtFTlRSWSwgTUFYX1NFRUtFTlRSWV9TSVpFKTsKKworICAgICAgICBwdXRfZWJtbF9pZChwYiwgTUFUUk9TS0FfSURfU0VFS0lEKTsKKyAgICAgICAgcHV0X2VibWxfbnVtKHBiLCBlYm1sX2lkX3NpemUoZW50cnktPmVsZW1lbnRpZCksIDApOworICAgICAgICBwdXRfZWJtbF9pZChwYiwgZW50cnktPmVsZW1lbnRpZCk7CisKKyAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfU0VFS1BPU0lUSU9OLCBlbnRyeS0+c2VnbWVudHBvcyk7CisgICAgICAgIGVuZF9lYm1sX21hc3RlcihwYiwgc2Vla2VudHJ5KTsKKyAgICB9CisgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBtZXRhc2Vlayk7CisKKyAgICBpZiAoc2Vla2hlYWQtPnJlc2VydmVkX3NpemUgPiAwKSB7CisgICAgICAgIHVpbnQ2NF90IHJlbWFpbmluZyA9IHNlZWtoZWFkLT5maWxlcG9zICsgc2Vla2hlYWQtPnJlc2VydmVkX3NpemUgLSBhdmlvX3RlbGwocGIpOworICAgICAgICBwdXRfZWJtbF92b2lkKHBiLCByZW1haW5pbmcpOworICAgICAgICBhdmlvX3NlZWsocGIsIGN1cnJlbnRwb3MsIFNFRUtfU0VUKTsKKworICAgICAgICBjdXJyZW50cG9zID0gc2Vla2hlYWQtPmZpbGVwb3M7CisgICAgfQorZmFpbDoKKyAgICBhdl9mcmVlcCgmc2Vla2hlYWQtPmVudHJpZXMpOworICAgIGF2X2ZyZWUoc2Vla2hlYWQpOworCisgICAgcmV0dXJuIGN1cnJlbnRwb3M7Cit9CisKK3N0YXRpYyBta3ZfY3VlcyAqbWt2X3N0YXJ0X2N1ZXMoaW50NjRfdCBzZWdtZW50X29mZnNldCkKK3sKKyAgICBta3ZfY3VlcyAqY3VlcyA9IGF2X21hbGxvY3ooc2l6ZW9mKG1rdl9jdWVzKSk7CisgICAgaWYgKCFjdWVzKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGN1ZXMtPnNlZ21lbnRfb2Zmc2V0ID0gc2VnbWVudF9vZmZzZXQ7CisgICAgcmV0dXJuIGN1ZXM7Cit9CisKK3N0YXRpYyBpbnQgbWt2X2FkZF9jdWVwb2ludChta3ZfY3VlcyAqY3VlcywgaW50IHN0cmVhbSwgaW50IHRyYWNrbnVtLCBpbnQ2NF90IHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY2x1c3Rlcl9wb3MsIGludDY0X3QgcmVsYXRpdmVfcG9zLCBpbnQ2NF90IGR1cmF0aW9uKQoreworICAgIG1rdl9jdWVwb2ludCAqZW50cmllcyA9IGN1ZXMtPmVudHJpZXM7CisKKyAgICBpZiAodHMgPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVudHJpZXMgPSBhdl9yZWFsbG9jX2FycmF5KGVudHJpZXMsIGN1ZXMtPm51bV9lbnRyaWVzICsgMSwgc2l6ZW9mKG1rdl9jdWVwb2ludCkpOworICAgIGlmICghZW50cmllcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBjdWVzLT5lbnRyaWVzID0gZW50cmllczsKKworICAgIGN1ZXMtPmVudHJpZXNbY3Vlcy0+bnVtX2VudHJpZXNdLnB0cyAgICAgICAgICAgPSB0czsKKyAgICBjdWVzLT5lbnRyaWVzW2N1ZXMtPm51bV9lbnRyaWVzXS5zdHJlYW1faWR4ICAgID0gc3RyZWFtOworICAgIGN1ZXMtPmVudHJpZXNbY3Vlcy0+bnVtX2VudHJpZXNdLnRyYWNrbnVtICAgICAgPSB0cmFja251bTsKKyAgICBjdWVzLT5lbnRyaWVzW2N1ZXMtPm51bV9lbnRyaWVzXS5jbHVzdGVyX3BvcyAgID0gY2x1c3Rlcl9wb3MgLSBjdWVzLT5zZWdtZW50X29mZnNldDsKKyAgICBjdWVzLT5lbnRyaWVzW2N1ZXMtPm51bV9lbnRyaWVzXS5yZWxhdGl2ZV9wb3MgID0gcmVsYXRpdmVfcG9zOworICAgIGN1ZXMtPmVudHJpZXNbY3Vlcy0+bnVtX2VudHJpZXMrK10uZHVyYXRpb24gICAgPSBkdXJhdGlvbjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50NjRfdCBta3Zfd3JpdGVfY3VlcyhBVkZvcm1hdENvbnRleHQgKnMsIG1rdl9jdWVzICpjdWVzLCBta3ZfdHJhY2sgKnRyYWNrcywgaW50IG51bV90cmFja3MpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgZWJtbF9tYXN0ZXIgY3Vlc19lbGVtZW50OworICAgIGludDY0X3QgY3VycmVudHBvczsKKyAgICBpbnQgaSwgajsKKworICAgIGN1cnJlbnRwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGN1ZXNfZWxlbWVudCA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9DVUVTLCAwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdWVzLT5udW1fZW50cmllczsgaSsrKSB7CisgICAgICAgIGVibWxfbWFzdGVyIGN1ZXBvaW50LCB0cmFja19wb3NpdGlvbnM7CisgICAgICAgIG1rdl9jdWVwb2ludCAqZW50cnkgPSAmY3Vlcy0+ZW50cmllc1tpXTsKKyAgICAgICAgdWludDY0X3QgcHRzID0gZW50cnktPnB0czsKKyAgICAgICAgaW50IGN0cF9uYiA9IDA7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZW50cmllcywgc28gd2Uga25vdyB0aGUgZWxlbWVudCBzaXplCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fdHJhY2tzOyBqKyspCisgICAgICAgICAgICB0cmFja3Nbal0uaGFzX2N1ZSA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdWVzLT5udW1fZW50cmllcyAtIGkgJiYgZW50cnlbal0ucHRzID09IHB0czsgaisrKSB7CisgICAgICAgICAgICBpbnQgdHJhY2tudW0gPSBlbnRyeVtqXS5zdHJlYW1faWR4OworICAgICAgICAgICAgYXZfYXNzZXJ0MCh0cmFja251bT49MCAmJiB0cmFja251bTxudW1fdHJhY2tzKTsKKyAgICAgICAgICAgIGlmICh0cmFja3NbdHJhY2tudW1dLmhhc19jdWUgJiYgcy0+c3RyZWFtc1t0cmFja251bV0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHRyYWNrc1t0cmFja251bV0uaGFzX2N1ZSA9IDE7CisgICAgICAgICAgICBjdHBfbmIgKys7CisgICAgICAgIH0KKworICAgICAgICBjdWVwb2ludCA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9QT0lOVEVOVFJZLCBNQVhfQ1VFUE9JTlRfU0laRShjdHBfbmIpKTsKKyAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQ1VFVElNRSwgcHRzKTsKKworICAgICAgICAvLyBwdXQgYWxsIHRoZSBlbnRyaWVzIGZyb20gZGlmZmVyZW50IHRyYWNrcyB0aGF0IGhhdmUgdGhlIGV4YWN0IHNhbWUKKyAgICAgICAgLy8gdGltZXN0YW1wIGludG8gdGhlIHNhbWUgQ3VlUG9pbnQKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV90cmFja3M7IGorKykKKyAgICAgICAgICAgIHRyYWNrc1tqXS5oYXNfY3VlID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1ZXMtPm51bV9lbnRyaWVzIC0gaSAmJiBlbnRyeVtqXS5wdHMgPT0gcHRzOyBqKyspIHsKKyAgICAgICAgICAgIGludCB0cmFja251bSA9IGVudHJ5W2pdLnN0cmVhbV9pZHg7CisgICAgICAgICAgICBhdl9hc3NlcnQwKHRyYWNrbnVtPj0wICYmIHRyYWNrbnVtPG51bV90cmFja3MpOworICAgICAgICAgICAgaWYgKHRyYWNrc1t0cmFja251bV0uaGFzX2N1ZSAmJiBzLT5zdHJlYW1zW3RyYWNrbnVtXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdHJhY2tzW3RyYWNrbnVtXS5oYXNfY3VlID0gMTsKKyAgICAgICAgICAgIHRyYWNrX3Bvc2l0aW9ucyA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9DVUVUUkFDS1BPU0lUSU9OLCBNQVhfQ1VFVFJBQ0tQT1NfU0laRSk7CisgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9DVUVUUkFDSyAgICAgICAgICAgLCBlbnRyeVtqXS50cmFja251bSAgICk7CisgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9DVUVDTFVTVEVSUE9TSVRJT04gLCBlbnRyeVtqXS5jbHVzdGVyX3Bvcyk7CisgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9DVUVSRUxBVElWRVBPU0lUSU9OLCBlbnRyeVtqXS5yZWxhdGl2ZV9wb3MpOworICAgICAgICAgICAgaWYgKGVudHJ5W2pdLmR1cmF0aW9uICE9IC0xKQorICAgICAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX0NVRURVUkFUSU9OICAgICwgZW50cnlbal0uZHVyYXRpb24pOworICAgICAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCB0cmFja19wb3NpdGlvbnMpOworICAgICAgICB9CisgICAgICAgIGkgKz0gaiAtIDE7CisgICAgICAgIGVuZF9lYm1sX21hc3RlcihwYiwgY3VlcG9pbnQpOworICAgIH0KKyAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIGN1ZXNfZWxlbWVudCk7CisKKyAgICByZXR1cm4gY3VycmVudHBvczsKK30KKworc3RhdGljIGludCBwdXRfeGlwaF9jb2RlY3ByaXYoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNDb250ZXh0ICpjb2RlYykKK3sKKyAgICB1aW50OF90ICpoZWFkZXJfc3RhcnRbM107CisgICAgaW50IGhlYWRlcl9sZW5bM107CisgICAgaW50IGZpcnN0X2hlYWRlcl9zaXplOworICAgIGludCBqOworCisgICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WT1JCSVMpCisgICAgICAgIGZpcnN0X2hlYWRlcl9zaXplID0gMzA7CisgICAgZWxzZQorICAgICAgICBmaXJzdF9oZWFkZXJfc2l6ZSA9IDQyOworCisgICAgaWYgKGF2cHJpdl9zcGxpdF94aXBoX2hlYWRlcnMoY29kZWMtPmV4dHJhZGF0YSwgY29kZWMtPmV4dHJhZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfaGVhZGVyX3NpemUsIGhlYWRlcl9zdGFydCwgaGVhZGVyX2xlbikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFeHRyYWRhdGEgY29ycnVwdC5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYXZpb193OChwYiwgMik7ICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgcGFja2V0cyAtIDEKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgIHB1dF94aXBoX3NpemUocGIsIGhlYWRlcl9sZW5bal0pOworICAgIH0KKyAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQorICAgICAgICBhdmlvX3dyaXRlKHBiLCBoZWFkZXJfc3RhcnRbal0sIGhlYWRlcl9sZW5bal0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV0X3d2X2NvZGVjcHJpdihBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNDb250ZXh0ICpjb2RlYykKK3sKKyAgICBpZiAoY29kZWMtPmV4dHJhZGF0YSAmJiBjb2RlYy0+ZXh0cmFkYXRhX3NpemUgPT0gMikKKyAgICAgICAgYXZpb193cml0ZShwYiwgY29kZWMtPmV4dHJhZGF0YSwgMik7CisgICAgZWxzZQorICAgICAgICBhdmlvX3dsMTYocGIsIDB4NDAzKTsgLy8gZmFsbGJhY2sgdG8gdGhlIHZlcnNpb24gbWVudGlvbmVkIGluIG1hdHJvc2thIHNwZWNzCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2ZsYWNfY29kZWNwcml2KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY0NvbnRleHQgKmNvZGVjKQoreworICAgIGludCB3cml0ZV9jb21tZW50ID0gKGNvZGVjLT5jaGFubmVsX2xheW91dCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICEoY29kZWMtPmNoYW5uZWxfbGF5b3V0ICYgfjB4M2ZmZmZVTEwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIWZmX2ZsYWNfaXNfbmF0aXZlX2xheW91dChjb2RlYy0+Y2hhbm5lbF9sYXlvdXQpKTsKKyAgICBpbnQgcmV0ID0gZmZfZmxhY193cml0ZV9oZWFkZXIocGIsIGNvZGVjLT5leHRyYWRhdGEsIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXdyaXRlX2NvbW1lbnQpOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAod3JpdGVfY29tbWVudCkgeworICAgICAgICBjb25zdCBjaGFyICp2ZW5kb3IgPSAocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0JJVEVYQUNUKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXZmIiA6IExJQkFWRk9STUFUX0lERU5UOworICAgICAgICBBVkRpY3Rpb25hcnkgKmRpY3QgPSBOVUxMOworICAgICAgICB1aW50OF90IGJ1ZlszMl0sICpkYXRhLCAqcDsKKyAgICAgICAgaW50IGxlbjsKKworICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiMHglIlBSSXg2NCwgY29kZWMtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgYXZfZGljdF9zZXQoJmRpY3QsICJXQVZFRk9STUFURVhURU5TSUJMRV9DSEFOTkVMX01BU0siLCBidWYsIDApOworCisgICAgICAgIGxlbiA9IGZmX3ZvcmJpc2NvbW1lbnRfbGVuZ3RoKGRpY3QsIHZlbmRvcik7CisgICAgICAgIGRhdGEgPSBhdl9tYWxsb2MobGVuICsgNCk7CisgICAgICAgIGlmICghZGF0YSkgeworICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBkYXRhWzBdID0gMHg4NDsKKyAgICAgICAgQVZfV0IyNChkYXRhICsgMSwgbGVuKTsKKworICAgICAgICBwID0gZGF0YSArIDQ7CisgICAgICAgIGZmX3ZvcmJpc2NvbW1lbnRfd3JpdGUoJnAsICZkaWN0LCB2ZW5kb3IpOworCisgICAgICAgIGF2aW9fd3JpdGUocGIsIGRhdGEsIGxlbiArIDQpOworCisgICAgICAgIGF2X2ZyZWVwKCZkYXRhKTsKKyAgICAgICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2FhY19zYW1wbGVfcmF0ZXMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNhbXBsZV9yYXRlLCBpbnQgKm91dHB1dF9zYW1wbGVfcmF0ZSkKK3sKKyAgICBNUEVHNEF1ZGlvQ29uZmlnIG1wNGFjOworCisgICAgaWYgKGF2cHJpdl9tcGVnNGF1ZGlvX2dldF9jb25maWcoJm1wNGFjLCBjb2RlYy0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSAqIDgsIDEpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBBQUMgZXh0cmFkYXRhLCB1bmFibGUgdG8gZGV0ZXJtaW5lIHNhbXBsZXJhdGUuXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICpzYW1wbGVfcmF0ZSAgICAgICAgPSBtcDRhYy5zYW1wbGVfcmF0ZTsKKyAgICAqb3V0cHV0X3NhbXBsZV9yYXRlID0gbXA0YWMuZXh0X3NhbXBsZV9yYXRlOworfQorCitzdGF0aWMgaW50IG1rdl93cml0ZV9uYXRpdmVfY29kZWNwcml2YXRlKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVklPQ29udGV4dCAqZHluX2NwKQoreworICAgIHN3aXRjaCAoY29kZWMtPmNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9WT1JCSVM6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9USEVPUkE6CisgICAgICAgIHJldHVybiBwdXRfeGlwaF9jb2RlY3ByaXYocywgZHluX2NwLCBjb2RlYyk7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9GTEFDOgorICAgICAgICByZXR1cm4gcHV0X2ZsYWNfY29kZWNwcml2KHMsIGR5bl9jcCwgY29kZWMpOworICAgIGNhc2UgQVZfQ09ERUNfSURfV0FWUEFDSzoKKyAgICAgICAgcmV0dXJuIHB1dF93dl9jb2RlY3ByaXYoZHluX2NwLCBjb2RlYyk7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY0OgorICAgICAgICByZXR1cm4gZmZfaXNvbV93cml0ZV9hdmNjKGR5bl9jcCwgY29kZWMtPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgIGNhc2UgQVZfQ09ERUNfSURfSEVWQzoKKyAgICAgICAgcmV0dXJuIGZmX2lzb21fd3JpdGVfaHZjYyhkeW5fY3AsIGNvZGVjLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmV4dHJhZGF0YV9zaXplLCAwKTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FMQUM6CisgICAgICAgIGlmIChjb2RlYy0+ZXh0cmFkYXRhX3NpemUgPCAzNikgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBleHRyYWRhdGEgZm91bmQsIEFMQUMgZXhwZWN0cyBhIDM2LWJ5dGUgIgorICAgICAgICAgICAgICAgICAgICJRdWlja1RpbWUgYXRvbS4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGF2aW9fd3JpdGUoZHluX2NwLCBjb2RlYy0+ZXh0cmFkYXRhICsgMTIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSAtIDEyKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QUk9SRVMgJiYKKyAgICAgICAgICAgIGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19tb3Z2aWRlb190YWdzLCBjb2RlYy0+Y29kZWNfdGFnKSA9PSBBVl9DT0RFQ19JRF9QUk9SRVMpIHsKKyAgICAgICAgICAgIGF2aW9fd2wzMihkeW5fY3AsIGNvZGVjLT5jb2RlY190YWcpOworICAgICAgICB9IGVsc2UgaWYgKGNvZGVjLT5leHRyYWRhdGFfc2l6ZSAmJiBjb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVFRBKQorICAgICAgICAgICAgYXZpb193cml0ZShkeW5fY3AsIGNvZGVjLT5leHRyYWRhdGEsIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWt2X3dyaXRlX2NvZGVjcHJpdmF0ZShBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMsIGludCBuYXRpdmVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF0X2lkKQoreworICAgIEFWSU9Db250ZXh0ICpkeW5fY3A7CisgICAgdWludDhfdCAqY29kZWNwcml2OworICAgIGludCByZXQsIGNvZGVjcHJpdl9zaXplOworCisgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJmR5bl9jcCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAobmF0aXZlX2lkKSB7CisgICAgICAgIHJldCA9IG1rdl93cml0ZV9uYXRpdmVfY29kZWNwcml2YXRlKHMsIGNvZGVjLCBkeW5fY3ApOworICAgIH0gZWxzZSBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGlmIChxdF9pZCkgeworICAgICAgICAgICAgaWYgKCFjb2RlYy0+Y29kZWNfdGFnKQorICAgICAgICAgICAgICAgIGNvZGVjLT5jb2RlY190YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIGlmIChjb2RlYy0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoICAgZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIGNvZGVjLT5jb2RlY190YWcpID09IGNvZGVjLT5jb2RlY19pZAorICAgICAgICAgICAgICAgICAgICAmJiBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfbW92dmlkZW9fdGFncywgQVZfUkwzMihjb2RlYy0+ZXh0cmFkYXRhICsgNCkpICE9IGNvZGVjLT5jb2RlY19pZAorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgYXZpb193YjMyKGR5bl9jcCwgMHg1YSArIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGF2aW9fd2wzMihkeW5fY3AsIGNvZGVjLT5jb2RlY190YWcpOworICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAweDVhIC0gODsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZpb193OChkeW5fY3AsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdmlvX3dyaXRlKGR5bl9jcCwgY29kZWMtPmV4dHJhZGF0YSwgY29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19ibXBfdGFncywgY29kZWMtPmNvZGVjX2lkKSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJjb2RlYyAlcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZm9ybWF0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKGNvZGVjLT5jb2RlY19pZCkpOworCisgICAgICAgICAgICBpZiAoIWNvZGVjLT5jb2RlY190YWcpCisgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX3RhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfYm1wX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIGlmICghY29kZWMtPmNvZGVjX3RhZykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyBibXAgY29kZWMgdGFnIGZvdW5kIGZvciBjb2RlYyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShjb2RlYy0+Y29kZWNfaWQpKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZmX3B1dF9ibXBfaGVhZGVyKGR5bl9jcCwgY29kZWMsIGZmX2NvZGVjX2JtcF90YWdzLCAwLCAwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIHVuc2lnbmVkIGludCB0YWc7CisgICAgICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfd2F2X3RhZ3MsIGNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgIGlmICghdGFnKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm8gd2F2IGNvZGVjIHRhZyBmb3VuZCBmb3IgY29kZWMgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShjb2RlYy0+Y29kZWNfaWQpKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNvZGVjLT5jb2RlY190YWcpCisgICAgICAgICAgICBjb2RlYy0+Y29kZWNfdGFnID0gdGFnOworCisgICAgICAgIGZmX3B1dF93YXZfaGVhZGVyKGR5bl9jcCwgY29kZWMsIEZGX1BVVF9XQVZfSEVBREVSX0ZPUkNFX1dBVkVGT1JNQVRFWCk7CisgICAgfQorCisgICAgY29kZWNwcml2X3NpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYoZHluX2NwLCAmY29kZWNwcml2KTsKKyAgICBpZiAoY29kZWNwcml2X3NpemUpCisgICAgICAgIHB1dF9lYm1sX2JpbmFyeShwYiwgTUFUUk9TS0FfSURfQ09ERUNQUklWQVRFLCBjb2RlY3ByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3ByaXZfc2l6ZSk7CisgICAgYXZfZnJlZShjb2RlY3ByaXYpOworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBta3Zfd3JpdGVfc3RlcmVvX21vZGUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIGludCBtb2RlLCBpbnQgKmhfd2lkdGgsIGludCAqaF9oZWlnaHQpCit7CisgICAgaW50IGk7CisgICAgaW50IHJldCA9IDA7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnRhZzsKKyAgICBNYXRyb3NrYVZpZGVvU3RlcmVvTW9kZVR5cGUgZm9ybWF0ID0gTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX05COworCisgICAgKmhfd2lkdGggPSAxOworICAgICpoX2hlaWdodCA9IDE7CisgICAgLy8gY29udmVydCBtZXRhZGF0YSBpbnRvIHByb3BlciBzaWRlIGRhdGEgYW5kIGFkZCBpdCB0byB0aGUgc3RyZWFtCisgICAgaWYgKCh0YWcgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJzdGVyZW9fbW9kZSIsIE5VTEwsIDApKSB8fAorICAgICAgICAodGFnID0gYXZfZGljdF9nZXQoIHMtPm1ldGFkYXRhLCAic3RlcmVvX21vZGUiLCBOVUxMLCAwKSkpIHsKKyAgICAgICAgaW50IHN0ZXJlb19tb2RlID0gYXRvaSh0YWctPnZhbHVlKTsKKworICAgICAgICBmb3IgKGk9MDsgaTxNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfTkI7IGkrKykKKyAgICAgICAgICAgIGlmICghc3RyY21wKHRhZy0+dmFsdWUsIGZmX21hdHJvc2thX3ZpZGVvX3N0ZXJlb19tb2RlW2ldKSl7CisgICAgICAgICAgICAgICAgc3RlcmVvX21vZGUgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGlmIChzdGVyZW9fbW9kZSA8IE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9OQiAmJgorICAgICAgICAgICAgc3RlcmVvX21vZGUgIT0gMTAgJiYgc3RlcmVvX21vZGUgIT0gMTIpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBmZl9ta3Zfc3RlcmVvM2RfY29udihzdCwgc3RlcmVvX21vZGUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGl0ZXJhdGUgdG8gZmluZCB0aGUgc3RlcmVvM2Qgc2lkZSBkYXRhCisgICAgZm9yIChpID0gMDsgaSA8IHN0LT5uYl9zaWRlX2RhdGE7IGkrKykgeworICAgICAgICBBVlBhY2tldFNpZGVEYXRhIHNkID0gc3QtPnNpZGVfZGF0YVtpXTsKKyAgICAgICAgaWYgKHNkLnR5cGUgPT0gQVZfUEtUX0RBVEFfU1RFUkVPM0QpIHsKKyAgICAgICAgICAgIEFWU3RlcmVvM0QgKnN0ZXJlbyA9IChBVlN0ZXJlbzNEICopc2QuZGF0YTsKKworICAgICAgICAgICAgc3dpdGNoIChzdGVyZW8tPnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQVZfU1RFUkVPM0RfMkQ6CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX01PTk87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1NURVJFTzNEX1NJREVCWVNJREU6CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gKHN0ZXJlby0+ZmxhZ3MgJiBBVl9TVEVSRU8zRF9GTEFHX0lOVkVSVCkKKyAgICAgICAgICAgICAgICAgICAgPyBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfUklHSFRfTEVGVAorICAgICAgICAgICAgICAgICAgICA6IE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9MRUZUX1JJR0hUOworICAgICAgICAgICAgICAgICpoX3dpZHRoID0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfU1RFUkVPM0RfVE9QQk9UVE9NOgorICAgICAgICAgICAgICAgIGZvcm1hdCA9IE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9UT1BfQk9UVE9NOworICAgICAgICAgICAgICAgIGlmIChzdGVyZW8tPmZsYWdzICYgQVZfU1RFUkVPM0RfRkxBR19JTlZFUlQpCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0tOworICAgICAgICAgICAgICAgICpoX2hlaWdodCA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1NURVJFTzNEX0NIRUNLRVJCT0FSRDoKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfQ0hFQ0tFUkJPQVJEX0xSOworICAgICAgICAgICAgICAgIGlmIChzdGVyZW8tPmZsYWdzICYgQVZfU1RFUkVPM0RfRkxBR19JTlZFUlQpCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0tOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9TVEVSRU8zRF9MSU5FUzoKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfUk9XX0lOVEVSTEVBVkVEX0xSOworICAgICAgICAgICAgICAgIGlmIChzdGVyZW8tPmZsYWdzICYgQVZfU1RFUkVPM0RfRkxBR19JTlZFUlQpCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0tOworICAgICAgICAgICAgICAgICpoX2hlaWdodCA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1NURVJFTzNEX0NPTFVNTlM6CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX0NPTF9JTlRFUkxFQVZFRF9MUjsKKyAgICAgICAgICAgICAgICBpZiAoc3RlcmVvLT5mbGFncyAmIEFWX1NURVJFTzNEX0ZMQUdfSU5WRVJUKQorICAgICAgICAgICAgICAgICAgICBmb3JtYXQtLTsKKyAgICAgICAgICAgICAgICAqaF93aWR0aCA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1NURVJFTzNEX0ZSQU1FU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX0JPVEhfRVlFU19CTE9DS19MUjsKKyAgICAgICAgICAgICAgICBpZiAoc3RlcmVvLT5mbGFncyAmIEFWX1NURVJFTzNEX0ZMQUdfSU5WRVJUKQorICAgICAgICAgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvcm1hdCA9PSBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfTkIpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvLyBpZiB3ZWJtLCBkbyBub3Qgd3JpdGUgdW5zdXBwb3J0ZWQgbW9kZXMKKyAgICBpZiAoKG1vZGUgPT0gTU9ERV9XRUJNICYmCisgICAgICAgIGZvcm1hdCA+IE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9UT1BfQk9UVE9NICYmCisgICAgICAgIGZvcm1hdCAhPSBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfUklHSFRfTEVGVCkKKyAgICAgICAgfHwgZm9ybWF0ID49IE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9OQikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoZSBzcGVjaWZpZWQgc3RlcmVvIG1vZGUgaXMgbm90IHZhbGlkLlxuIik7CisgICAgICAgIGZvcm1hdCA9IE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9OQjsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvLyB3cml0ZSBTdGVyZW9Nb2RlIGlmIGZvcm1hdCBpcyB2YWxpZAorICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1ZJREVPU1RFUkVPTU9ERSwgZm9ybWF0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWt2X3dyaXRlX3RyYWNrKEFWRm9ybWF0Q29udGV4dCAqcywgTWF0cm9za2FNdXhDb250ZXh0ICpta3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgQVZJT0NvbnRleHQgKnBiLCBpbnQgZGVmYXVsdF9zdHJlYW1fZXhpc3RzKQoreworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gc3QtPmNvZGVjOworICAgIGVibWxfbWFzdGVyIHN1YmluZm8sIHRyYWNrOworICAgIGludCBuYXRpdmVfaWQgPSAwOworICAgIGludCBxdF9pZCA9IDA7CisgICAgaW50IGJpdF9kZXB0aCA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoY29kZWMtPmNvZGVjX2lkKTsKKyAgICBpbnQgc2FtcGxlX3JhdGUgPSBjb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgaW50IG91dHB1dF9zYW1wbGVfcmF0ZSA9IDA7CisgICAgaW50IGRpc3BsYXlfd2lkdGhfZGl2ID0gMTsKKyAgICBpbnQgZGlzcGxheV9oZWlnaHRfZGl2ID0gMTsKKyAgICBpbnQgaiwgcmV0OworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0YWc7CisKKyAgICAvLyBtcyBwcmVjaXNpb24gaXMgdGhlIGRlLWZhY3RvIHN0YW5kYXJkIHRpbWVzY2FsZSBmb3IgbWt2IGZpbGVzCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDApOworCisgICAgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UKSB7CisgICAgICAgIG1rdi0+aGF2ZV9hdHRhY2htZW50cyA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghYml0X2RlcHRoICYmIGNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2KQorICAgICAgICBiaXRfZGVwdGggPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShjb2RlYy0+c2FtcGxlX2ZtdCkgPDwgMzsKKyAgICBpZiAoIWJpdF9kZXB0aCkKKyAgICAgICAgYml0X2RlcHRoID0gY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKworICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKQorICAgICAgICBnZXRfYWFjX3NhbXBsZV9yYXRlcyhzLCBjb2RlYywgJnNhbXBsZV9yYXRlLCAmb3V0cHV0X3NhbXBsZV9yYXRlKTsKKworICAgIHRyYWNrID0gc3RhcnRfZWJtbF9tYXN0ZXIocGIsIE1BVFJPU0tBX0lEX1RSQUNLRU5UUlksIDApOworICAgIHB1dF9lYm1sX3VpbnQgKHBiLCBNQVRST1NLQV9JRF9UUkFDS05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICBta3YtPmlzX2Rhc2ggPyBta3YtPmRhc2hfdHJhY2tfbnVtYmVyIDogaSArIDEpOworICAgIHB1dF9lYm1sX3VpbnQgKHBiLCBNQVRST1NLQV9JRF9UUkFDS1VJRCwKKyAgICAgICAgICAgICAgICAgICBta3YtPmlzX2Rhc2ggPyBta3YtPmRhc2hfdHJhY2tfbnVtYmVyIDogaSArIDEpOworICAgIHB1dF9lYm1sX3VpbnQgKHBiLCBNQVRST1NLQV9JRF9UUkFDS0ZMQUdMQUNJTkcgLCAwKTsgICAgLy8gbm8gbGFjaW5nICh5ZXQpCisKKyAgICBpZiAoKHRhZyA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgInRpdGxlIiwgTlVMTCwgMCkpKQorICAgICAgICBwdXRfZWJtbF9zdHJpbmcocGIsIE1BVFJPU0tBX0lEX1RSQUNLTkFNRSwgdGFnLT52YWx1ZSk7CisgICAgdGFnID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAibGFuZ3VhZ2UiLCBOVUxMLCAwKTsKKyAgICBpZiAobWt2LT5tb2RlICE9IE1PREVfV0VCTSB8fCBjb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfV0VCVlRUKSB7CisgICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfVFJBQ0tMQU5HVUFHRSwgdGFnICYmIHRhZy0+dmFsdWUgPyB0YWctPnZhbHVlOiJ1bmQiKTsKKyAgICB9IGVsc2UgaWYgKHRhZyAmJiB0YWctPnZhbHVlKSB7CisgICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfVFJBQ0tMQU5HVUFHRSwgdGFnLT52YWx1ZSk7CisgICAgfQorCisgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIFRSQUNLRkxBR0RFRkFVTFQgaXMgMSwgc28gYWRkIGVsZW1lbnQKKyAgICAvLyBpZiB3ZSBuZWVkIHRvIGNsZWFyIGl0LgorICAgIGlmIChkZWZhdWx0X3N0cmVhbV9leGlzdHMgJiYgIShzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9ERUZBVUxUKSkKKyAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVFJBQ0tGTEFHREVGQVVMVCwgISEoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fREVGQVVMVCkpOworCisgICAgaWYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0ZPUkNFRCkKKyAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVFJBQ0tGTEFHRk9SQ0VELCAxKTsKKworICAgIGlmIChta3YtPm1vZGUgPT0gTU9ERV9XRUJNICYmIGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XRUJWVFQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY29kZWNfaWQ7CisgICAgICAgIGlmIChzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9DQVBUSU9OUykgeworICAgICAgICAgICAgY29kZWNfaWQgPSAiRF9XRUJWVFQvQ0FQVElPTlMiOworICAgICAgICAgICAgbmF0aXZlX2lkID0gTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9ERVNDUklQVElPTlMpIHsKKyAgICAgICAgICAgIGNvZGVjX2lkID0gIkRfV0VCVlRUL0RFU0NSSVBUSU9OUyI7CisgICAgICAgICAgICBuYXRpdmVfaWQgPSBNQVRST1NLQV9UUkFDS19UWVBFX01FVEFEQVRBOworICAgICAgICB9IGVsc2UgaWYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX01FVEFEQVRBKSB7CisgICAgICAgICAgICBjb2RlY19pZCA9ICJEX1dFQlZUVC9NRVRBREFUQSI7CisgICAgICAgICAgICBuYXRpdmVfaWQgPSBNQVRST1NLQV9UUkFDS19UWVBFX01FVEFEQVRBOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29kZWNfaWQgPSAiRF9XRUJWVFQvU1VCVElUTEVTIjsKKyAgICAgICAgICAgIG5hdGl2ZV9pZCA9IE1BVFJPU0tBX1RSQUNLX1RZUEVfU1VCVElUTEU7CisgICAgICAgIH0KKyAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9DT0RFQ0lELCBjb2RlY19pZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbG9vayBmb3IgYSBjb2RlYyBJRCBzdHJpbmcgc3BlY2lmaWMgdG8gbWt2IHRvIHVzZSwKKyAgICAgICAgLy8gaWYgbm9uZSBhcmUgZm91bmQsIHVzZSBBVkkgY29kZXMKKyAgICAgICAgZm9yIChqID0gMDsgZmZfbWt2X2NvZGVjX3RhZ3Nbal0uaWQgIT0gQVZfQ09ERUNfSURfTk9ORTsgaisrKSB7CisgICAgICAgICAgICBpZiAoZmZfbWt2X2NvZGVjX3RhZ3Nbal0uaWQgPT0gY29kZWMtPmNvZGVjX2lkKSB7CisgICAgICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9DT0RFQ0lELCBmZl9ta3ZfY29kZWNfdGFnc1tqXS5zdHIpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9pZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIGNvZGVjLT5pbml0aWFsX3BhZGRpbmcgJiYgY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpIHsKKy8vICAgICAgICAgbWt2LT50cmFja3NbaV0udHNfb2Zmc2V0ID0gYXZfcmVzY2FsZV9xKGNvZGVjLT5pbml0aWFsX3BhZGRpbmcsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7IDEsIGNvZGVjLT5zYW1wbGVfcmF0ZSB9LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSk7CisKKyAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQ09ERUNERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3EoY29kZWMtPmluaXRpYWxfcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyAxLCBjb2RlYy0+c2FtcGxlX3JhdGUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyAxLCAxMDAwMDAwMDAwIH0pKTsKKyAgICB9CisgICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9PUFVTKSB7CisgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1NFRUtQUkVST0xMLCBPUFVTX1NFRUtfUFJFUk9MTCk7CisgICAgfQorCisgICAgaWYgKG1rdi0+bW9kZSA9PSBNT0RFX1dFQk0gJiYgIShjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA5IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZPUkJJUyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dFQlZUVCkpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJPbmx5IFZQOCBvciBWUDkgdmlkZW8gYW5kIFZvcmJpcyBvciBPcHVzIGF1ZGlvIGFuZCBXZWJWVFQgc3VidGl0bGVzIGFyZSBzdXBwb3J0ZWQgZm9yIFdlYk0uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1RSQUNLVFlQRSwgTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTyk7CisKKyAgICAgICAgaWYoICAgc3QtPmF2Z19mcmFtZV9yYXRlLm51bSA+IDAgJiYgc3QtPmF2Z19mcmFtZV9yYXRlLmRlbiA+IDAKKyAgICAgICAgICAgJiYgMS4wL2F2X3EyZChzdC0+YXZnX2ZyYW1lX3JhdGUpID4gYXZfcTJkKGNvZGVjLT50aW1lX2Jhc2UpKQorICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVFJBQ0tERUZBVUxURFVSQVRJT04sIDFFOSAvIGF2X3EyZChzdC0+YXZnX2ZyYW1lX3JhdGUpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVFJBQ0tERUZBVUxURFVSQVRJT04sIGF2X3EyZChjb2RlYy0+dGltZV9iYXNlKSoxRTkpOworCisgICAgICAgIGlmICghbmF0aXZlX2lkICYmCisgICAgICAgICAgICBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIGNvZGVjLT5jb2RlY19pZCkgJiYKKyAgICAgICAgICAgICghZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19ibXBfdGFncywgICBjb2RlYy0+Y29kZWNfaWQpIHx8CisgICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NWUTEgfHwKKyAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1ZRMyB8fAorICAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9DSU5FUEFLKSkKKyAgICAgICAgICAgIHF0X2lkID0gMTsKKworICAgICAgICBpZiAocXRfaWQpCisgICAgICAgICAgICBwdXRfZWJtbF9zdHJpbmcocGIsIE1BVFJPU0tBX0lEX0NPREVDSUQsICJWX1FVSUNLVElNRSIpOworICAgICAgICBlbHNlIGlmICghbmF0aXZlX2lkKSB7CisgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBta3Ytc3BlY2lmaWMgY29kZWMgSUQsIHVzZSBWRlcgbW9kZQorICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9DT0RFQ0lELCAiVl9NUy9WRlcvRk9VUkNDIik7CisgICAgICAgICAgICBta3YtPnRyYWNrc1tpXS53cml0ZV9kdHMgPSAxOworICAgICAgICB9CisKKyAgICAgICAgc3ViaW5mbyA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9UUkFDS1ZJREVPLCAwKTsKKyAgICAgICAgLy8gWFhYOiBpbnRlcmxhY2UgZmxhZz8KKyAgICAgICAgcHV0X2VibWxfdWludCAocGIsIE1BVFJPU0tBX0lEX1ZJREVPUElYRUxXSURUSCAsIGNvZGVjLT53aWR0aCk7CisgICAgICAgIHB1dF9lYm1sX3VpbnQgKHBiLCBNQVRST1NLQV9JRF9WSURFT1BJWEVMSEVJR0hULCBjb2RlYy0+aGVpZ2h0KTsKKworICAgICAgICAvLyBjaGVjayBib3RoIHNpZGUgZGF0YSBhbmQgbWV0YWRhdGEgZm9yIHN0ZXJlbyBpbmZvcm1hdGlvbiwKKyAgICAgICAgLy8gd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgYml0c3RyZWFtIGlmIGFueSBpcyBmb3VuZAorICAgICAgICByZXQgPSBta3Zfd3JpdGVfc3RlcmVvX21vZGUocywgcGIsIHN0LCBta3YtPm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheV93aWR0aF9kaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheV9oZWlnaHRfZGl2KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmICgoKHRhZyA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgImFscGhhX21vZGUiLCBOVUxMLCAwKSkgJiYgYXRvaSh0YWctPnZhbHVlKSkgfHwKKyAgICAgICAgICAgICgodGFnID0gYXZfZGljdF9nZXQoIHMtPm1ldGFkYXRhLCAiYWxwaGFfbW9kZSIsIE5VTEwsIDApKSAmJiBhdG9pKHRhZy0+dmFsdWUpKSB8fAorICAgICAgICAgICAgKGNvZGVjLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWQTQyMFApKSB7CisgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9WSURFT0FMUEhBTU9ERSwgMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3cml0ZSBEaXNwbGF5V2lkdGggYW5kIERpc3BsYXlIZWlnaHQsIHRoZXkgY29udGFpbiB0aGUgc2l6ZSBvZgorICAgICAgICAvLyBhIHNpbmdsZSBzb3VyY2UgdmlldyBhbmQvb3IgdGhlIGRpc3BsYXkgYXNwZWN0IHJhdGlvCisgICAgICAgIGlmIChzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pIHsKKyAgICAgICAgICAgIGludDY0X3QgZF93aWR0aCA9IGF2X3Jlc2NhbGUoY29kZWMtPndpZHRoLCBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisgICAgICAgICAgICBpZiAoZF93aWR0aCA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT3ZlcmZsb3cgaW4gZGlzcGxheSB3aWR0aFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1ZJREVPRElTUExBWVdJRFRIICwgZF93aWR0aCAvIGRpc3BsYXlfd2lkdGhfZGl2KTsKKyAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1ZJREVPRElTUExBWUhFSUdIVCwgY29kZWMtPmhlaWdodCAvIGRpc3BsYXlfaGVpZ2h0X2Rpdik7CisgICAgICAgIH0gZWxzZSBpZiAoZGlzcGxheV93aWR0aF9kaXYgIT0gMSB8fCBkaXNwbGF5X2hlaWdodF9kaXYgIT0gMSkgeworICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVklERU9ESVNQTEFZV0lEVEggLCBjb2RlYy0+d2lkdGggLyBkaXNwbGF5X3dpZHRoX2Rpdik7CisgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9WSURFT0RJU1BMQVlIRUlHSFQsIGNvZGVjLT5oZWlnaHQgLyBkaXNwbGF5X2hlaWdodF9kaXYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTykgeworICAgICAgICAgICAgdWludDMyX3QgY29sb3Jfc3BhY2UgPSBhdl9sZTJuZTMyKGNvZGVjLT5jb2RlY190YWcpOworICAgICAgICAgICAgcHV0X2VibWxfYmluYXJ5KHBiLCBNQVRST1NLQV9JRF9WSURFT0NPTE9SU1BBQ0UsICZjb2xvcl9zcGFjZSwgc2l6ZW9mKGNvbG9yX3NwYWNlKSk7CisgICAgICAgIH0KKworICAgICAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIHN1YmluZm8pOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9UUkFDS1RZUEUsIE1BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU8pOworCisgICAgICAgIGlmICghbmF0aXZlX2lkKQorICAgICAgICAgICAgLy8gbm8gbWt2LXNwZWNpZmljIElELCB1c2UgQUNNIG1vZGUKKyAgICAgICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfQ09ERUNJRCwgIkFfTVMvQUNNIik7CisKKyAgICAgICAgc3ViaW5mbyA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9UUkFDS0FVRElPLCAwKTsKKyAgICAgICAgcHV0X2VibWxfdWludCAgKHBiLCBNQVRST1NLQV9JRF9BVURJT0NIQU5ORUxTICAgICwgY29kZWMtPmNoYW5uZWxzKTsKKyAgICAgICAgcHV0X2VibWxfZmxvYXQgKHBiLCBNQVRST1NLQV9JRF9BVURJT1NBTVBMSU5HRlJFUSwgc2FtcGxlX3JhdGUpOworICAgICAgICBpZiAob3V0cHV0X3NhbXBsZV9yYXRlKQorICAgICAgICAgICAgcHV0X2VibWxfZmxvYXQocGIsIE1BVFJPU0tBX0lEX0FVRElPT1VUU0FNUExJTkdGUkVRLCBvdXRwdXRfc2FtcGxlX3JhdGUpOworICAgICAgICBpZiAoYml0X2RlcHRoKQorICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQVVESU9CSVRERVBUSCwgYml0X2RlcHRoKTsKKyAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBzdWJpbmZvKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgaWYgKCFuYXRpdmVfaWQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTdWJ0aXRsZSBjb2RlYyAlZCBpcyBub3Qgc3VwcG9ydGVkLlxuIiwgY29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWt2LT5tb2RlICE9IE1PREVfV0VCTSB8fCBjb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfV0VCVlRUKQorICAgICAgICAgICAgbmF0aXZlX2lkID0gTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKKworICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9UUkFDS1RZUEUsIG5hdGl2ZV9pZCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPbmx5IGF1ZGlvLCB2aWRlbywgYW5kIHN1YnRpdGxlcyBhcmUgc3VwcG9ydGVkIGZvciBNYXRyb3NrYS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChta3YtPm1vZGUgIT0gTU9ERV9XRUJNIHx8IGNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XRUJWVFQpIHsKKyAgICAgICAgcmV0ID0gbWt2X3dyaXRlX2NvZGVjcHJpdmF0ZShzLCBwYiwgY29kZWMsIG5hdGl2ZV9pZCwgcXRfaWQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZW5kX2VibWxfbWFzdGVyKHBiLCB0cmFjayk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBta3Zfd3JpdGVfdHJhY2tzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNYXRyb3NrYU11eENvbnRleHQgKm1rdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBlYm1sX21hc3RlciB0cmFja3M7CisgICAgaW50IGksIHJldCwgZGVmYXVsdF9zdHJlYW1fZXhpc3RzID0gMDsKKworICAgIHJldCA9IG1rdl9hZGRfc2Vla2hlYWRfZW50cnkobWt2LT5tYWluX3NlZWtoZWFkLCBNQVRST1NLQV9JRF9UUkFDS1MsIGF2aW9fdGVsbChwYikpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgdHJhY2tzID0gc3RhcnRfZWJtbF9tYXN0ZXIocGIsIE1BVFJPU0tBX0lEX1RSQUNLUywgMCk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBkZWZhdWx0X3N0cmVhbV9leGlzdHMgfD0gc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fREVGQVVMVDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICByZXQgPSBta3Zfd3JpdGVfdHJhY2socywgbWt2LCBpLCBwYiwgZGVmYXVsdF9zdHJlYW1fZXhpc3RzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIHRyYWNrcyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWt2X3dyaXRlX2NoYXB0ZXJzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNYXRyb3NrYU11eENvbnRleHQgKm1rdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBlYm1sX21hc3RlciBjaGFwdGVycywgZWRpdGlvbmVudHJ5OworICAgIEFWUmF0aW9uYWwgc2NhbGUgPSB7MSwgMUU5fTsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKCFzLT5uYl9jaGFwdGVycyB8fCBta3YtPndyb3RlX2NoYXB0ZXJzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldCA9IG1rdl9hZGRfc2Vla2hlYWRfZW50cnkobWt2LT5tYWluX3NlZWtoZWFkLCBNQVRST1NLQV9JRF9DSEFQVEVSUywgYXZpb190ZWxsKHBiKSk7CisgICAgaWYgKHJldCA8IDApIHJldHVybiByZXQ7CisKKyAgICBjaGFwdGVycyAgICAgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfQ0hBUFRFUlMgICAgLCAwKTsKKyAgICBlZGl0aW9uZW50cnkgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfRURJVElPTkVOVFJZLCAwKTsKKyAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9FRElUSU9ORkxBR0RFRkFVTFQsIDEpOworICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX0VESVRJT05GTEFHSElEREVOICwgMCk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NoYXB0ZXJzOyBpKyspIHsKKyAgICAgICAgZWJtbF9tYXN0ZXIgY2hhcHRlcmF0b20sIGNoYXB0ZXJkaXNwbGF5OworICAgICAgICBBVkNoYXB0ZXIgKmMgICAgID0gcy0+Y2hhcHRlcnNbaV07CisgICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKworICAgICAgICBjaGFwdGVyYXRvbSA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9DSEFQVEVSQVRPTSwgMCk7CisgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX0NIQVBURVJVSUQsIGMtPmlkICsgbWt2LT5jaGFwdGVyX2lkX29mZnNldCk7CisgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX0NIQVBURVJUSU1FU1RBUlQsCisgICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKGMtPnN0YXJ0LCBjLT50aW1lX2Jhc2UsIHNjYWxlKSk7CisgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX0NIQVBURVJUSU1FRU5ELAorICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShjLT5lbmQsICAgYy0+dGltZV9iYXNlLCBzY2FsZSkpOworICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9DSEFQVEVSRkxBR0hJRERFTiAsIDApOworICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9DSEFQVEVSRkxBR0VOQUJMRUQsIDEpOworICAgICAgICBpZiAoKHQgPSBhdl9kaWN0X2dldChjLT5tZXRhZGF0YSwgInRpdGxlIiwgTlVMTCwgMCkpKSB7CisgICAgICAgICAgICBjaGFwdGVyZGlzcGxheSA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9DSEFQVEVSRElTUExBWSwgMCk7CisgICAgICAgICAgICBwdXRfZWJtbF9zdHJpbmcocGIsIE1BVFJPU0tBX0lEX0NIQVBTVFJJTkcsIHQtPnZhbHVlKTsKKyAgICAgICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfQ0hBUExBTkcgICwgInVuZCIpOworICAgICAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBjaGFwdGVyZGlzcGxheSk7CisgICAgICAgIH0KKyAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBjaGFwdGVyYXRvbSk7CisgICAgfQorICAgIGVuZF9lYm1sX21hc3RlcihwYiwgZWRpdGlvbmVudHJ5KTsKKyAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIGNoYXB0ZXJzKTsKKworICAgIG1rdi0+d3JvdGVfY2hhcHRlcnMgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBta3Zfd3JpdGVfc2ltcGxldGFnKEFWSU9Db250ZXh0ICpwYiwgQVZEaWN0aW9uYXJ5RW50cnkgKnQpCit7CisgICAgdWludDhfdCAqa2V5ID0gYXZfc3RyZHVwKHQtPmtleSk7CisgICAgdWludDhfdCAqcCAgID0ga2V5OworICAgIGNvbnN0IHVpbnQ4X3QgKmxhbmcgPSBOVUxMOworICAgIGVibWxfbWFzdGVyIHRhZzsKKworICAgIGlmICgocCA9IHN0cnJjaHIocCwgJy0nKSkgJiYKKyAgICAgICAgKGxhbmcgPSBhdl9jb252ZXJ0X2xhbmdfdG8ocCArIDEsIEFWX0xBTkdfSVNPNjM5XzJfQklCTCkpKQorICAgICAgICAqcCA9IDA7CisKKyAgICBwID0ga2V5OworICAgIHdoaWxlICgqcCkgeworICAgICAgICBpZiAoKnAgPT0gJyAnKQorICAgICAgICAgICAgKnAgPSAnXyc7CisgICAgICAgIGVsc2UgaWYgKCpwID49ICdhJyAmJiAqcCA8PSAneicpCisgICAgICAgICAgICAqcCAtPSAnYScgLSAnQSc7CisgICAgICAgIHArKzsKKyAgICB9CisKKyAgICB0YWcgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfU0lNUExFVEFHLCAwKTsKKyAgICBwdXRfZWJtbF9zdHJpbmcocGIsIE1BVFJPU0tBX0lEX1RBR05BTUUsIGtleSk7CisgICAgaWYgKGxhbmcpCisgICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfVEFHTEFORywgbGFuZyk7CisgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9UQUdTVFJJTkcsIHQtPnZhbHVlKTsKKyAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIHRhZyk7CisKKyAgICBhdl9mcmVlcCgma2V5KTsKK30KKworc3RhdGljIGludCBta3Zfd3JpdGVfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZEaWN0aW9uYXJ5ICptLCB1bnNpZ25lZCBpbnQgZWxlbWVudGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB1aWQsIGVibWxfbWFzdGVyICp0YWdzKQoreworICAgIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2ID0gcy0+cHJpdl9kYXRhOworICAgIGVibWxfbWFzdGVyIHRhZywgdGFyZ2V0czsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IE5VTEw7CisgICAgaW50IHJldDsKKworICAgIGlmICghdGFncy0+cG9zKSB7CisgICAgICAgIHJldCA9IG1rdl9hZGRfc2Vla2hlYWRfZW50cnkobWt2LT5tYWluX3NlZWtoZWFkLCBNQVRST1NLQV9JRF9UQUdTLCBhdmlvX3RlbGwocy0+cGIpKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHJldHVybiByZXQ7CisKKyAgICAgICAgKnRhZ3MgPSBzdGFydF9lYm1sX21hc3RlcihzLT5wYiwgTUFUUk9TS0FfSURfVEFHUywgMCk7CisgICAgfQorCisgICAgdGFnICAgICA9IHN0YXJ0X2VibWxfbWFzdGVyKHMtPnBiLCBNQVRST1NLQV9JRF9UQUcsICAgICAgICAwKTsKKyAgICB0YXJnZXRzID0gc3RhcnRfZWJtbF9tYXN0ZXIocy0+cGIsIE1BVFJPU0tBX0lEX1RBR1RBUkdFVFMsIDApOworICAgIGlmIChlbGVtZW50aWQpCisgICAgICAgIHB1dF9lYm1sX3VpbnQocy0+cGIsIGVsZW1lbnRpZCwgdWlkKTsKKyAgICBlbmRfZWJtbF9tYXN0ZXIocy0+cGIsIHRhcmdldHMpOworCisgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQobSwgIiIsIHQsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKQorICAgICAgICBpZiAoYXZfc3RyY2FzZWNtcCh0LT5rZXksICJ0aXRsZSIpICYmCisgICAgICAgICAgICBhdl9zdHJjYXNlY21wKHQtPmtleSwgInN0ZXJlb19tb2RlIikgJiYKKyAgICAgICAgICAgIGF2X3N0cmNhc2VjbXAodC0+a2V5LCAiZW5jb2RpbmdfdG9vbCIpKQorICAgICAgICAgICAgbWt2X3dyaXRlX3NpbXBsZXRhZyhzLT5wYiwgdCk7CisKKyAgICBlbmRfZWJtbF9tYXN0ZXIocy0+cGIsIHRhZyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWt2X2NoZWNrX3RhZyhBVkRpY3Rpb25hcnkgKm0pCit7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBOVUxMOworCisgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQobSwgIiIsIHQsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKQorICAgICAgICBpZiAoYXZfc3RyY2FzZWNtcCh0LT5rZXksICJ0aXRsZSIpICYmIGF2X3N0cmNhc2VjbXAodC0+a2V5LCAic3RlcmVvX21vZGUiKSkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWt2X3dyaXRlX3RhZ3MoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2ID0gcy0+cHJpdl9kYXRhOworICAgIGVibWxfbWFzdGVyIHRhZ3MgPSB7MH07CisgICAgaW50IGksIHJldDsKKworICAgIGZmX21ldGFkYXRhX2NvbnZfY3R4KHMsIGZmX21rdl9tZXRhZGF0YV9jb252LCBOVUxMKTsKKworICAgIGlmIChta3ZfY2hlY2tfdGFnKHMtPm1ldGFkYXRhKSkgeworICAgICAgICByZXQgPSBta3Zfd3JpdGVfdGFnKHMsIHMtPm1ldGFkYXRhLCAwLCAwLCAmdGFncyk7CisgICAgICAgIGlmIChyZXQgPCAwKSByZXR1cm4gcmV0OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKworICAgICAgICBpZiAoIW1rdl9jaGVja190YWcoc3QtPm1ldGFkYXRhKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHJldCA9IG1rdl93cml0ZV90YWcocywgc3QtPm1ldGFkYXRhLCBNQVRST1NLQV9JRF9UQUdUQVJHRVRTX1RSQUNLVUlELCBpICsgMSwgJnRhZ3MpOworICAgICAgICBpZiAocmV0IDwgMCkgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhcHRlcnM7IGkrKykgeworICAgICAgICBBVkNoYXB0ZXIgKmNoID0gcy0+Y2hhcHRlcnNbaV07CisKKyAgICAgICAgaWYgKCFta3ZfY2hlY2tfdGFnKGNoLT5tZXRhZGF0YSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICByZXQgPSBta3Zfd3JpdGVfdGFnKHMsIGNoLT5tZXRhZGF0YSwgTUFUUk9TS0FfSURfVEFHVEFSR0VUU19DSEFQVEVSVUlELCBjaC0+aWQgKyBta3YtPmNoYXB0ZXJfaWRfb2Zmc2V0LCAmdGFncyk7CisgICAgICAgIGlmIChyZXQgPCAwKSByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICh0YWdzLnBvcykKKyAgICAgICAgZW5kX2VibWxfbWFzdGVyKHMtPnBiLCB0YWdzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBta3Zfd3JpdGVfYXR0YWNobWVudHMoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGVibWxfbWFzdGVyIGF0dGFjaG1lbnRzOworICAgIEFWTEZHIGM7CisgICAgaW50IGksIHJldDsKKworICAgIGlmICghbWt2LT5oYXZlX2F0dGFjaG1lbnRzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF2X2xmZ19pbml0KCZjLCBhdl9nZXRfcmFuZG9tX3NlZWQoKSk7CisKKyAgICByZXQgPSBta3ZfYWRkX3NlZWtoZWFkX2VudHJ5KG1rdi0+bWFpbl9zZWVraGVhZCwgTUFUUk9TS0FfSURfQVRUQUNITUVOVFMsIGF2aW9fdGVsbChwYikpOworICAgIGlmIChyZXQgPCAwKSByZXR1cm4gcmV0OworCisgICAgYXR0YWNobWVudHMgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfQVRUQUNITUVOVFMsIDApOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBlYm1sX21hc3RlciBhdHRhY2hlZF9maWxlOworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdDsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZXR5cGUgPSBOVUxMOworICAgICAgICB1aW50NjRfdCBmaWxldWlkOworCisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBhdHRhY2hlZF9maWxlID0gc3RhcnRfZWJtbF9tYXN0ZXIocGIsIE1BVFJPU0tBX0lEX0FUVEFDSEVERklMRSwgMCk7CisKKyAgICAgICAgaWYgKHQgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApKQorICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9GSUxFREVTQywgdC0+dmFsdWUpOworICAgICAgICBpZiAoISh0ID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAiZmlsZW5hbWUiLCBOVUxMLCAwKSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBdHRhY2htZW50IHN0cmVhbSAlZCBoYXMgbm8gZmlsZW5hbWUgdGFnLlxuIiwgaSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfRklMRU5BTUUsIHQtPnZhbHVlKTsKKyAgICAgICAgaWYgKHQgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJtaW1ldHlwZSIsIE5VTEwsIDApKQorICAgICAgICAgICAgbWltZXR5cGUgPSB0LT52YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FICkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBmZl9ta3ZfbWltZV90YWdzW2ldLmlkICE9IEFWX0NPREVDX0lEX05PTkU7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoZmZfbWt2X21pbWVfdGFnc1tpXS5pZCA9PSBzdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlID0gZmZfbWt2X21pbWVfdGFnc1tpXS5zdHI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1pbWV0eXBlKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQXR0YWNobWVudCBzdHJlYW0gJWQgaGFzIG5vIG1pbWV0eXBlIHRhZyBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0IGNhbm5vdCBiZSBkZWR1Y2VkIGZyb20gdGhlIGNvZGVjIGlkLlxuIiwgaSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPmZsYWdzICYgQVZGTVRfRkxBR19CSVRFWEFDVCkgeworICAgICAgICAgICAgc3RydWN0IEFWU0hBICpzaGEgPSBhdl9zaGFfYWxsb2MoKTsKKyAgICAgICAgICAgIHVpbnQ4X3QgZGlnZXN0WzIwXTsKKyAgICAgICAgICAgIGlmICghc2hhKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBhdl9zaGFfaW5pdChzaGEsIDE2MCk7CisgICAgICAgICAgICBhdl9zaGFfdXBkYXRlKHNoYSwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgYXZfc2hhX2ZpbmFsKHNoYSwgZGlnZXN0KTsKKyAgICAgICAgICAgIGF2X2ZyZWUoc2hhKTsKKyAgICAgICAgICAgIGZpbGV1aWQgPSBBVl9STDY0KGRpZ2VzdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxldWlkID0gYXZfbGZnX2dldCgmYyk7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiVXNpbmcgJS4xNiJQUkl4NjQiIGZvciBhdHRhY2htZW50ICVkXG4iLAorICAgICAgICAgICAgICAgZmlsZXVpZCwgaSk7CisKKyAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9GSUxFTUlNRVRZUEUsIG1pbWV0eXBlKTsKKyAgICAgICAgcHV0X2VibWxfYmluYXJ5KHBiLCBNQVRST1NLQV9JRF9GSUxFREFUQSwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9GSUxFVUlELCBmaWxldWlkKTsKKyAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBhdHRhY2hlZF9maWxlKTsKKyAgICB9CisgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBhdHRhY2htZW50cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBta3Zfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNYXRyb3NrYU11eENvbnRleHQgKm1rdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBlYm1sX21hc3RlciBlYm1sX2hlYWRlciwgc2VnbWVudF9pbmZvOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0YWc7CisgICAgaW50IHJldCwgaSwgdmVyc2lvbiA9IDI7CisKKyAgICBpZiAoIXN0cmNtcChzLT5vZm9ybWF0LT5uYW1lLCAid2VibSIpKQorICAgICAgICBta3YtPm1vZGUgPSBNT0RFX1dFQk07CisgICAgZWxzZQorICAgICAgICBta3YtPm1vZGUgPSBNT0RFX01BVFJPU0tBdjI7CisKKyAgICBpZiAocy0+YXZvaWRfbmVnYXRpdmVfdHMgPCAwKQorICAgICAgICBzLT5hdm9pZF9uZWdhdGl2ZV90cyA9IDE7CisKKyAgICBpZiAobWt2LT5tb2RlICE9IE1PREVfV0VCTSB8fAorICAgICAgICBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInN0ZXJlb19tb2RlIiwgTlVMTCwgMCkgfHwKKyAgICAgICAgYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJhbHBoYV9tb2RlIiwgTlVMTCwgMCkpCisgICAgICAgIHZlcnNpb24gPSA0OworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FUUkFDMyB8fAorICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0NPT0sgfHwKKyAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQV8yODggfHwKKyAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TSVBSIHx8CisgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlYxMCB8fAorICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWMjApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlRoZSBNYXRyb3NrYSBtdXhlciBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBtdXhpbmcgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfaWQpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMgfHwKKyAgICAgICAgICAgIGF2X2RpY3RfZ2V0KHMtPnN0cmVhbXNbaV0tPm1ldGFkYXRhLCAic3RlcmVvX21vZGUiLCBOVUxMLCAwKSB8fAorICAgICAgICAgICAgYXZfZGljdF9nZXQocy0+c3RyZWFtc1tpXS0+bWV0YWRhdGEsICJhbHBoYV9tb2RlIiwgTlVMTCwgMCkpCisgICAgICAgICAgICB2ZXJzaW9uID0gNDsKKyAgICB9CisKKyAgICBta3YtPnRyYWNrcyA9IGF2X21hbGxvY3pfYXJyYXkocy0+bmJfc3RyZWFtcywgc2l6ZW9mKCpta3YtPnRyYWNrcykpOworICAgIGlmICghbWt2LT50cmFja3MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBlYm1sX2hlYWRlciA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBFQk1MX0lEX0hFQURFUiwgMCk7CisgICAgcHV0X2VibWxfdWludCAgIChwYiwgRUJNTF9JRF9FQk1MVkVSU0lPTiAgICAgICAgLCAgICAgICAgICAgMSk7CisgICAgcHV0X2VibWxfdWludCAgIChwYiwgRUJNTF9JRF9FQk1MUkVBRFZFUlNJT04gICAgLCAgICAgICAgICAgMSk7CisgICAgcHV0X2VibWxfdWludCAgIChwYiwgRUJNTF9JRF9FQk1MTUFYSURMRU5HVEggICAgLCAgICAgICAgICAgNCk7CisgICAgcHV0X2VibWxfdWludCAgIChwYiwgRUJNTF9JRF9FQk1MTUFYU0laRUxFTkdUSCAgLCAgICAgICAgICAgOCk7CisgICAgcHV0X2VibWxfc3RyaW5nIChwYiwgRUJNTF9JRF9ET0NUWVBFICAgICAgICAgICAgLCBzLT5vZm9ybWF0LT5uYW1lKTsKKyAgICBwdXRfZWJtbF91aW50ICAgKHBiLCBFQk1MX0lEX0RPQ1RZUEVWRVJTSU9OICAgICAsICAgICB2ZXJzaW9uKTsKKyAgICBwdXRfZWJtbF91aW50ICAgKHBiLCBFQk1MX0lEX0RPQ1RZUEVSRUFEVkVSU0lPTiAsICAgICAgICAgICAyKTsKKyAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIGVibWxfaGVhZGVyKTsKKworICAgIG1rdi0+c2VnbWVudCA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9TRUdNRU5ULCAwKTsKKyAgICBta3YtPnNlZ21lbnRfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKKworICAgIC8vIHdlIHdyaXRlIDIgc2VlayBoZWFkcyAtIG9uZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRvIHBvaW50IHRvIGVhY2gKKyAgICAvLyBjbHVzdGVyLCBhbmQgb25lIGF0IHRoZSBiZWdpbm5pbmcgdG8gcG9pbnQgdG8gYWxsIG90aGVyIGxldmVsIG9uZQorICAgIC8vIGVsZW1lbnRzIChpbmNsdWRpbmcgdGhlIHNlZWsgaGVhZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlKSwgd2hpY2gKKyAgICAvLyBpc24ndCBtb3JlIHRoYW4gMTAgZWxlbWVudHMgaWYgd2Ugb25seSB3cml0ZSBvbmUgb2YgZWFjaCBvdGhlcgorICAgIC8vIGN1cnJlbnRseSBkZWZpbmVkIGxldmVsIDEgZWxlbWVudAorICAgIG1rdi0+bWFpbl9zZWVraGVhZCAgICA9IG1rdl9zdGFydF9zZWVraGVhZChwYiwgbWt2LT5zZWdtZW50X29mZnNldCwgMTApOworICAgIGlmICghbWt2LT5tYWluX3NlZWtoZWFkKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gbWt2X2FkZF9zZWVraGVhZF9lbnRyeShta3YtPm1haW5fc2Vla2hlYWQsIE1BVFJPU0tBX0lEX0lORk8sIGF2aW9fdGVsbChwYikpOworICAgIGlmIChyZXQgPCAwKSByZXR1cm4gcmV0OworCisgICAgc2VnbWVudF9pbmZvID0gc3RhcnRfZWJtbF9tYXN0ZXIocGIsIE1BVFJPU0tBX0lEX0lORk8sIDApOworICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1RJTUVDT0RFU0NBTEUsIDEwMDAwMDApOworICAgIGlmICgodGFnID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApKSkKKyAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9USVRMRSwgdGFnLT52YWx1ZSk7CisgICAgaWYgKCEocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0JJVEVYQUNUKSkgeworICAgICAgICB1aW50MzJfdCBzZWdtZW50X3VpZFs0XTsKKyAgICAgICAgQVZMRkcgbGZnOworCisgICAgICAgIGF2X2xmZ19pbml0KCZsZmcsIGF2X2dldF9yYW5kb21fc2VlZCgpKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgc2VnbWVudF91aWRbaV0gPSBhdl9sZmdfZ2V0KCZsZmcpOworCisgICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfTVVYSU5HQVBQLCBMSUJBVkZPUk1BVF9JREVOVCk7CisgICAgICAgIGlmICgodGFnID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJlbmNvZGluZ190b29sIiwgTlVMTCwgMCkpKQorICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9XUklUSU5HQVBQLCB0YWctPnZhbHVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9XUklUSU5HQVBQLCBMSUJBVkZPUk1BVF9JREVOVCk7CisgICAgICAgIHB1dF9lYm1sX2JpbmFyeShwYiwgTUFUUk9TS0FfSURfU0VHTUVOVFVJRCwgc2VnbWVudF91aWQsIDE2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBjaGFyICppZGVudCA9ICJMYXZmIjsKKyAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9NVVhJTkdBUFAgLCBpZGVudCk7CisgICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfV1JJVElOR0FQUCwgaWRlbnQpOworICAgIH0KKworICAgIGlmICh0YWcgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgImNyZWF0aW9uX3RpbWUiLCBOVUxMLCAwKSkgeworICAgICAgICAvLyBBZGp1c3QgdGltZSBzbyBpdCdzIHJlbGF0aXZlIHRvIDIwMDEtMDEtMDEgYW5kIGNvbnZlcnQgdG8gbmFub3NlY29uZHMuCisgICAgICAgIGludDY0X3QgZGF0ZV91dGMgPSAoZmZfaXNvODYwMV90b191bml4X3RpbWUodGFnLT52YWx1ZSkgLSA5NzgzMDcyMDApICogMTAwMDAwMDAwMDsKKyAgICAgICAgdWludDhfdCBkYXRlX3V0Y19idWZbOF07CisgICAgICAgIEFWX1dCNjQoZGF0ZV91dGNfYnVmLCBkYXRlX3V0Yyk7CisgICAgICAgIHB1dF9lYm1sX2JpbmFyeShwYiwgTUFUUk9TS0FfSURfREFURVVUQywgZGF0ZV91dGNfYnVmLCA4KTsKKyAgICB9CisKKyAgICAvLyByZXNlcnZlIHNwYWNlIGZvciB0aGUgZHVyYXRpb24KKyAgICBta3YtPmR1cmF0aW9uID0gMDsKKyAgICBta3YtPmR1cmF0aW9uX29mZnNldCA9IGF2aW9fdGVsbChwYik7CisgICAgcHV0X2VibWxfdm9pZChwYiwgMTEpOyAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZXMgZG91YmxlLXByZWNpc2lvbiBmbG9hdCB0byBiZSB3cml0dGVuCisgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBzZWdtZW50X2luZm8pOworCisgICAgcmV0ID0gbWt2X3dyaXRlX3RyYWNrcyhzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFwdGVyczsgaSsrKQorICAgICAgICBta3YtPmNoYXB0ZXJfaWRfb2Zmc2V0ID0gRkZNQVgobWt2LT5jaGFwdGVyX2lkX29mZnNldCwgMUxMIC0gcy0+Y2hhcHRlcnNbaV0tPmlkKTsKKworICAgIGlmIChta3YtPm1vZGUgIT0gTU9ERV9XRUJNKSB7CisgICAgICAgIHJldCA9IG1rdl93cml0ZV9jaGFwdGVycyhzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldCA9IG1rdl93cml0ZV90YWdzKHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0ID0gbWt2X3dyaXRlX2F0dGFjaG1lbnRzKHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKCFzLT5wYi0+c2Vla2FibGUpCisgICAgICAgIG1rdl93cml0ZV9zZWVraGVhZChwYiwgbWt2LT5tYWluX3NlZWtoZWFkKTsKKworICAgIG1rdi0+Y3VlcyA9IG1rdl9zdGFydF9jdWVzKG1rdi0+c2VnbWVudF9vZmZzZXQpOworICAgIGlmICghbWt2LT5jdWVzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKHBiLT5zZWVrYWJsZSAmJiBta3YtPnJlc2VydmVfY3Vlc19zcGFjZSkgeworICAgICAgICBta3YtPmN1ZXNfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgcHV0X2VibWxfdm9pZChwYiwgbWt2LT5yZXNlcnZlX2N1ZXNfc3BhY2UpOworICAgIH0KKworICAgIGF2X2luaXRfcGFja2V0KCZta3YtPmN1cl9hdWRpb19wa3QpOworICAgIG1rdi0+Y3VyX2F1ZGlvX3BrdC5zaXplID0gMDsKKyAgICBta3YtPmNsdXN0ZXJfcG9zID0gLTE7CisKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIC8vIHN0YXJ0IGEgbmV3IGNsdXN0ZXIgZXZlcnkgNSBNQiBvciA1IHNlYywgb3IgMzJrIC8gMSBzZWMgZm9yIHN0cmVhbWluZyBvcgorICAgIC8vIGFmdGVyIDRrIGFuZCBvbiBhIGtleWZyYW1lCisgICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgICAgICBpZiAobWt2LT5jbHVzdGVyX3RpbWVfbGltaXQgPCAwKQorICAgICAgICAgICAgbWt2LT5jbHVzdGVyX3RpbWVfbGltaXQgPSA1MDAwOworICAgICAgICBpZiAobWt2LT5jbHVzdGVyX3NpemVfbGltaXQgPCAwKQorICAgICAgICAgICAgbWt2LT5jbHVzdGVyX3NpemVfbGltaXQgPSA1ICogMTAyNCAqIDEwMjQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1rdi0+Y2x1c3Rlcl90aW1lX2xpbWl0IDwgMCkKKyAgICAgICAgICAgIG1rdi0+Y2x1c3Rlcl90aW1lX2xpbWl0ID0gMTAwMDsKKyAgICAgICAgaWYgKG1rdi0+Y2x1c3Rlcl9zaXplX2xpbWl0IDwgMCkKKyAgICAgICAgICAgIG1rdi0+Y2x1c3Rlcl9zaXplX2xpbWl0ID0gMzIgKiAxMDI0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1rdl9ibG9ja2dyb3VwX3NpemUoaW50IHBrdF9zaXplKQoreworICAgIGludCBzaXplID0gcGt0X3NpemUgKyA0OworICAgIHNpemUgKz0gZWJtbF9udW1fc2l6ZShzaXplKTsKKyAgICBzaXplICs9IDI7ICAgICAgICAgICAgICAvLyBFQk1MIElEIGZvciBibG9jayBhbmQgYmxvY2sgZHVyYXRpb24KKyAgICBzaXplICs9IDg7ICAgICAgICAgICAgICAvLyBtYXggc2l6ZSBvZiBibG9jayBkdXJhdGlvbgorICAgIHNpemUgKz0gZWJtbF9udW1fc2l6ZShzaXplKTsKKyAgICBzaXplICs9IDE7ICAgICAgICAgICAgICAvLyBibG9ja2dyb3VwIEVCTUwgSUQKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBta3Zfc3RyaXBfd2F2cGFjayhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKipwZHN0LCBpbnQgKnNpemUpCit7CisgICAgdWludDhfdCAqZHN0OworICAgIGludCBzcmNsZW4gPSAqc2l6ZTsKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBpbnQgcmV0OworCisgICAgZHN0ID0gYXZfbWFsbG9jKHNyY2xlbik7CisgICAgaWYgKCFkc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB3aGlsZSAoc3JjbGVuID49IFdWX0hFQURFUl9TSVpFKSB7CisgICAgICAgIFd2SGVhZGVyIGhlYWRlcjsKKworICAgICAgICByZXQgPSBmZl93dl9wYXJzZV9oZWFkZXIoJmhlYWRlciwgc3JjKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHNyYyAgICArPSBXVl9IRUFERVJfU0laRTsKKyAgICAgICAgc3JjbGVuIC09IFdWX0hFQURFUl9TSVpFOworCisgICAgICAgIGlmIChzcmNsZW4gPCBoZWFkZXIuYmxvY2tzaXplKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhlYWRlci5pbml0aWFsKSB7CisgICAgICAgICAgICBBVl9XTDMyKGRzdCArIG9mZnNldCwgaGVhZGVyLnNhbXBsZXMpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgQVZfV0wzMihkc3QgKyBvZmZzZXQsICAgICBoZWFkZXIuZmxhZ3MpOworICAgICAgICBBVl9XTDMyKGRzdCArIG9mZnNldCArIDQsIGhlYWRlci5jcmMpOworICAgICAgICBvZmZzZXQgKz0gODsKKworICAgICAgICBpZiAoIShoZWFkZXIuaW5pdGlhbCAmJiBoZWFkZXIuZmluYWwpKSB7CisgICAgICAgICAgICBBVl9XTDMyKGRzdCArIG9mZnNldCwgaGVhZGVyLmJsb2Nrc2l6ZSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShkc3QgKyBvZmZzZXQsIHNyYywgaGVhZGVyLmJsb2Nrc2l6ZSk7CisgICAgICAgIHNyYyAgICArPSBoZWFkZXIuYmxvY2tzaXplOworICAgICAgICBzcmNsZW4gLT0gaGVhZGVyLmJsb2Nrc2l6ZTsKKyAgICAgICAgb2Zmc2V0ICs9IGhlYWRlci5ibG9ja3NpemU7CisgICAgfQorCisgICAgKnBkc3QgPSBkc3Q7CisgICAgKnNpemUgPSBvZmZzZXQ7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfZnJlZXAoJmRzdCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbWt2X3dyaXRlX2Jsb2NrKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBibG9ja2lkLCBBVlBhY2tldCAqcGt0LCBpbnQgZmxhZ3MpCit7CisgICAgTWF0cm9za2FNdXhDb250ZXh0ICpta3YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjOworICAgIHVpbnQ4X3QgKmRhdGEgPSBOVUxMLCAqc2lkZV9kYXRhID0gTlVMTDsKKyAgICBpbnQgb2Zmc2V0ID0gMCwgc2l6ZSA9IHBrdC0+c2l6ZSwgc2lkZV9kYXRhX3NpemUgPSAwOworICAgIGludDY0X3QgdHMgPSBta3YtPnRyYWNrc1twa3QtPnN0cmVhbV9pbmRleF0ud3JpdGVfZHRzID8gcGt0LT5kdHMgOiBwa3QtPnB0czsKKyAgICB1aW50NjRfdCBhZGRpdGlvbmFsX2lkID0gMDsKKyAgICBpbnQ2NF90IGRpc2NhcmRfcGFkZGluZyA9IDA7CisgICAgZWJtbF9tYXN0ZXIgYmxvY2tfZ3JvdXAsIGJsb2NrX2FkZGl0aW9ucywgYmxvY2tfbW9yZTsKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJXcml0aW5nIGJsb2NrIGF0IG9mZnNldCAlIiBQUkl1NjQgIiwgc2l6ZSAlZCwgIgorICAgICAgICAgICAicHRzICUiIFBSSWQ2NCAiLCBkdHMgJSIgUFJJZDY0ICIsIGR1cmF0aW9uICVkLCBmbGFncyAlZFxuIiwKKyAgICAgICAgICAgYXZpb190ZWxsKHBiKSwgcGt0LT5zaXplLCBwa3QtPnB0cywgcGt0LT5kdHMsIHBrdC0+ZHVyYXRpb24sIGZsYWdzKTsKKyAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgJiYgY29kZWMtPmV4dHJhZGF0YV9zaXplID4gMCAmJgorICAgICAgICAoQVZfUkIyNChjb2RlYy0+ZXh0cmFkYXRhKSA9PSAxIHx8IEFWX1JCMzIoY29kZWMtPmV4dHJhZGF0YSkgPT0gMSkpCisgICAgICAgIGZmX2F2Y19wYXJzZV9uYWxfdW5pdHNfYnVmKHBrdC0+ZGF0YSwgJmRhdGEsICZzaXplKTsKKyAgICBlbHNlIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQyAmJiBjb2RlYy0+ZXh0cmFkYXRhX3NpemUgPiA2ICYmCisgICAgICAgICAgICAgKEFWX1JCMjQoY29kZWMtPmV4dHJhZGF0YSkgPT0gMSB8fCBBVl9SQjMyKGNvZGVjLT5leHRyYWRhdGEpID09IDEpKQorICAgICAgICAvKiBleHRyYWRhdGEgaXMgQW5uZXggQiwgYXNzdW1lIHRoZSBiaXRzdHJlYW0gaXMgdG9vIGFuZCBjb252ZXJ0IGl0ICovCisgICAgICAgIGZmX2hldmNfYW5uZXhiMm1wNF9idWYocGt0LT5kYXRhLCAmZGF0YSwgJnNpemUsIDAsIE5VTEwpOworICAgIGVsc2UgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XQVZQQUNLKSB7CisgICAgICAgIGludCByZXQgPSBta3Zfc3RyaXBfd2F2cGFjayhwa3QtPmRhdGEsICZkYXRhLCAmc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3Igc3RyaXBwaW5nIGEgV2F2UGFjayBwYWNrZXQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBkYXRhID0gcGt0LT5kYXRhOworCisgICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QUk9SRVMpIHsKKyAgICAgICAgLyogTWF0cm9za2Egc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0byByZW1vdmUgdGhlIGZpcnN0IFF1aWNrVGltZSBhdG9tCisgICAgICAgICAqLworICAgICAgICBzaXplICAtPSA4OworICAgICAgICBvZmZzZXQgPSA4OworICAgIH0KKworICAgIHNpZGVfZGF0YSA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9TS0lQX1NBTVBMRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZGVfZGF0YV9zaXplKTsKKworICAgIGlmIChzaWRlX2RhdGEgJiYgc2lkZV9kYXRhX3NpemUgPj0gMTApIHsKKyAgICAgICAgZGlzY2FyZF9wYWRkaW5nID0gYXZfcmVzY2FsZV9xKEFWX1JMMzIoc2lkZV9kYXRhICsgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgY29kZWMtPnNhbXBsZV9yYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCAxMDAwMDAwMDAwfSk7CisgICAgfQorCisgICAgc2lkZV9kYXRhID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEocGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BLVF9EQVRBX01BVFJPU0tBX0JMT0NLQURESVRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lkZV9kYXRhX3NpemUpOworICAgIGlmIChzaWRlX2RhdGEpIHsKKyAgICAgICAgYWRkaXRpb25hbF9pZCA9IEFWX1JCNjQoc2lkZV9kYXRhKTsKKyAgICAgICAgc2lkZV9kYXRhICs9IDg7CisgICAgICAgIHNpZGVfZGF0YV9zaXplIC09IDg7CisgICAgfQorCisgICAgaWYgKChzaWRlX2RhdGFfc2l6ZSAmJiBhZGRpdGlvbmFsX2lkID09IDEpIHx8IGRpc2NhcmRfcGFkZGluZykgeworICAgICAgICBibG9ja19ncm91cCA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9CTE9DS0dST1VQLCAwKTsKKyAgICAgICAgYmxvY2tpZCA9IE1BVFJPU0tBX0lEX0JMT0NLOworICAgIH0KKworICAgIHB1dF9lYm1sX2lkKHBiLCBibG9ja2lkKTsKKyAgICBwdXRfZWJtbF9udW0ocGIsIHNpemUgKyA0LCAwKTsKKyAgICAvLyB0aGlzIGFzc3VtZXMgc3RyZWFtX2luZGV4IGlzIGxlc3MgdGhhbiAxMjYKKyAgICBhdmlvX3c4KHBiLCAweDgwIHwgKG1rdi0+aXNfZGFzaCA/IG1rdi0+ZGFzaF90cmFja19udW1iZXIgOiAocGt0LT5zdHJlYW1faW5kZXggKyAxKSkpOworICAgIGF2aW9fd2IxNihwYiwgdHMgLSBta3YtPmNsdXN0ZXJfcHRzKTsKKyAgICBhdmlvX3c4KHBiLCBmbGFncyk7CisgICAgYXZpb193cml0ZShwYiwgZGF0YSArIG9mZnNldCwgc2l6ZSk7CisgICAgaWYgKGRhdGEgIT0gcGt0LT5kYXRhKQorICAgICAgICBhdl9mcmVlKGRhdGEpOworCisgICAgaWYgKGRpc2NhcmRfcGFkZGluZykgeworICAgICAgICBwdXRfZWJtbF9zaW50KHBiLCBNQVRST1NLQV9JRF9ESVNDQVJEUEFERElORywgZGlzY2FyZF9wYWRkaW5nKTsKKyAgICB9CisKKyAgICBpZiAoc2lkZV9kYXRhX3NpemUgJiYgYWRkaXRpb25hbF9pZCA9PSAxKSB7CisgICAgICAgIGJsb2NrX2FkZGl0aW9ucyA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9CTE9DS0FERElUSU9OUywgMCk7CisgICAgICAgIGJsb2NrX21vcmUgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfQkxPQ0tNT1JFLCAwKTsKKyAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQkxPQ0tBRERJRCwgMSk7CisgICAgICAgIHB1dF9lYm1sX2lkKHBiLCBNQVRST1NLQV9JRF9CTE9DS0FERElUSU9OQUwpOworICAgICAgICBwdXRfZWJtbF9udW0ocGIsIHNpZGVfZGF0YV9zaXplLCAwKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgc2lkZV9kYXRhLCBzaWRlX2RhdGFfc2l6ZSk7CisgICAgICAgIGVuZF9lYm1sX21hc3RlcihwYiwgYmxvY2tfbW9yZSk7CisgICAgICAgIGVuZF9lYm1sX21hc3RlcihwYiwgYmxvY2tfYWRkaXRpb25zKTsKKyAgICB9CisgICAgaWYgKChzaWRlX2RhdGFfc2l6ZSAmJiBhZGRpdGlvbmFsX2lkID09IDEpIHx8IGRpc2NhcmRfcGFkZGluZykgeworICAgICAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIGJsb2NrX2dyb3VwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbWt2X3dyaXRlX3Z0dF9ibG9ja3MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTWF0cm9za2FNdXhDb250ZXh0ICpta3YgPSBzLT5wcml2X2RhdGE7CisgICAgZWJtbF9tYXN0ZXIgYmxvY2tncm91cDsKKyAgICBpbnQgaWRfc2l6ZSwgc2V0dGluZ3Nfc2l6ZSwgc2l6ZTsKKyAgICB1aW50OF90ICppZCwgKnNldHRpbmdzOworICAgIGludDY0X3QgdHMgPSBta3YtPnRyYWNrc1twa3QtPnN0cmVhbV9pbmRleF0ud3JpdGVfZHRzID8gcGt0LT5kdHMgOiBwa3QtPnB0czsKKyAgICBjb25zdCBpbnQgZmxhZ3MgPSAwOworCisgICAgaWRfc2l6ZSA9IDA7CisgICAgaWQgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX1dFQlZUVF9JREVOVElGSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkX3NpemUpOworCisgICAgc2V0dGluZ3Nfc2l6ZSA9IDA7CisgICAgc2V0dGluZ3MgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX1dFQlZUVF9TRVRUSU5HUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc19zaXplKTsKKworICAgIHNpemUgPSBpZF9zaXplICsgMSArIHNldHRpbmdzX3NpemUgKyAxICsgcGt0LT5zaXplOworCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIldyaXRpbmcgYmxvY2sgYXQgb2Zmc2V0ICUiIFBSSXU2NCAiLCBzaXplICVkLCAiCisgICAgICAgICAgICJwdHMgJSIgUFJJZDY0ICIsIGR0cyAlIiBQUklkNjQgIiwgZHVyYXRpb24gJWQsIGZsYWdzICVkXG4iLAorICAgICAgICAgICBhdmlvX3RlbGwocGIpLCBzaXplLCBwa3QtPnB0cywgcGt0LT5kdHMsIHBrdC0+ZHVyYXRpb24sIGZsYWdzKTsKKworICAgIGJsb2NrZ3JvdXAgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfQkxPQ0tHUk9VUCwgbWt2X2Jsb2NrZ3JvdXBfc2l6ZShzaXplKSk7CisKKyAgICBwdXRfZWJtbF9pZChwYiwgTUFUUk9TS0FfSURfQkxPQ0spOworICAgIHB1dF9lYm1sX251bShwYiwgc2l6ZSArIDQsIDApOworICAgIGF2aW9fdzgocGIsIDB4ODAgfCAocGt0LT5zdHJlYW1faW5kZXggKyAxKSk7ICAgICAvLyB0aGlzIGFzc3VtZXMgc3RyZWFtX2luZGV4IGlzIGxlc3MgdGhhbiAxMjYKKyAgICBhdmlvX3diMTYocGIsIHRzIC0gbWt2LT5jbHVzdGVyX3B0cyk7CisgICAgYXZpb193OChwYiwgZmxhZ3MpOworICAgIGF2aW9fcHJpbnRmKHBiLCAiJS4qc1xuJS4qc1xuJS4qcyIsIGlkX3NpemUsIGlkLCBzZXR0aW5nc19zaXplLCBzZXR0aW5ncywgcGt0LT5zaXplLCBwa3QtPmRhdGEpOworCisgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQkxPQ0tEVVJBVElPTiwgcGt0LT5kdXJhdGlvbik7CisgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBibG9ja2dyb3VwKTsKKworICAgIHJldHVybiBwa3QtPmR1cmF0aW9uOworfQorCitzdGF0aWMgdm9pZCBta3ZfZmx1c2hfZHluYnVmKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNYXRyb3NrYU11eENvbnRleHQgKm1rdiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgYnVmc2l6ZTsKKyAgICB1aW50OF90ICpkeW5fYnVmOworCisgICAgaWYgKCFta3YtPmR5bl9iYykKKyAgICAgICAgcmV0dXJuOworCisgICAgYnVmc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1Zihta3YtPmR5bl9iYywgJmR5bl9idWYpOworICAgIGF2aW9fd3JpdGUocy0+cGIsIGR5bl9idWYsIGJ1ZnNpemUpOworICAgIGF2X2ZyZWUoZHluX2J1Zik7CisgICAgbWt2LT5keW5fYmMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBta3Zfc3RhcnRfbmV3X2NsdXN0ZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYjsKKworICAgIGlmIChzLT5wYi0+c2Vla2FibGUpIHsKKyAgICAgICAgcGIgPSBzLT5wYjsKKyAgICB9IGVsc2UgeworICAgICAgICBwYiA9IG1rdi0+ZHluX2JjOworICAgIH0KKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAiU3RhcnRpbmcgbmV3IGNsdXN0ZXIgYXQgb2Zmc2V0ICUiIFBSSXU2NCAiIGJ5dGVzLCAiCisgICAgICAgICAgICAicHRzICUiIFBSSXU2NCAiZHRzICUiIFBSSXU2NCAiXG4iLAorICAgICAgICAgICAgYXZpb190ZWxsKHBiKSwgcGt0LT5wdHMsIHBrdC0+ZHRzKTsKKyAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIG1rdi0+Y2x1c3Rlcik7CisgICAgbWt2LT5jbHVzdGVyX3BvcyA9IC0xOworICAgIGlmIChta3YtPmR5bl9iYykKKyAgICAgICAgbWt2X2ZsdXNoX2R5bmJ1ZihzKTsKKyAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKK30KKworc3RhdGljIGludCBta3Zfd3JpdGVfcGFja2V0X2ludGVybmFsKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCwgaW50IGFkZF9jdWUpCit7CisgICAgTWF0cm9za2FNdXhDb250ZXh0ICpta3YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiICAgICAgICAgPSBzLT5wYjsKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgICA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYzsKKyAgICBpbnQga2V5ZnJhbWUgICAgICAgICAgICA9ICEhKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpOworICAgIGludCBkdXJhdGlvbiAgICAgICAgICAgID0gcGt0LT5kdXJhdGlvbjsKKyAgICBpbnQgcmV0OworICAgIGludDY0X3QgdHMgPSBta3YtPnRyYWNrc1twa3QtPnN0cmVhbV9pbmRleF0ud3JpdGVfZHRzID8gcGt0LT5kdHMgOiBwa3QtPnB0czsKKyAgICBpbnQ2NF90IHJlbGF0aXZlX3BhY2tldF9wb3M7CisgICAgaW50IGRhc2hfdHJhY2tudW0gPSBta3YtPmlzX2Rhc2ggPyBta3YtPmRhc2hfdHJhY2tfbnVtYmVyIDogcGt0LT5zdHJlYW1faW5kZXggKyAxOworCisgICAgaWYgKHRzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW4ndCB3cml0ZSBwYWNrZXQgd2l0aCB1bmtub3duIHRpbWVzdGFtcFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHRzICs9IG1rdi0+dHJhY2tzW3BrdC0+c3RyZWFtX2luZGV4XS50c19vZmZzZXQ7CisKKyAgICBpZiAobWt2LT5jbHVzdGVyX3BvcyAhPSAtMSkgeworICAgICAgICBpbnQ2NF90IGNsdXN0ZXJfdGltZSA9IHRzIC0gbWt2LT5jbHVzdGVyX3B0cyArIG1rdi0+dHJhY2tzW3BrdC0+c3RyZWFtX2luZGV4XS50c19vZmZzZXQ7CisgICAgICAgIGlmICgoaW50MTZfdCljbHVzdGVyX3RpbWUgIT0gY2x1c3Rlcl90aW1lKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJTdGFydGluZyBuZXcgY2x1c3RlciBkdWUgdG8gdGltZXN0YW1wXG4iKTsKKyAgICAgICAgICAgIG1rdl9zdGFydF9uZXdfY2x1c3RlcihzLCBwa3QpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzLT5wYi0+c2Vla2FibGUpIHsKKyAgICAgICAgaWYgKCFta3YtPmR5bl9iYykgeworICAgICAgICAgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJm1rdi0+ZHluX2JjKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIGR5bmFtaWMgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBiID0gbWt2LT5keW5fYmM7CisgICAgfQorCisgICAgaWYgKG1rdi0+Y2x1c3Rlcl9wb3MgPT0gLTEpIHsKKyAgICAgICAgbWt2LT5jbHVzdGVyX3BvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgIG1rdi0+Y2x1c3RlciAgICAgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfQ0xVU1RFUiwgMCk7CisgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX0NMVVNURVJUSU1FQ09ERSwgRkZNQVgoMCwgdHMpKTsKKyAgICAgICAgbWt2LT5jbHVzdGVyX3B0cyA9IEZGTUFYKDAsIHRzKTsKKyAgICB9CisKKyAgICByZWxhdGl2ZV9wYWNrZXRfcG9zID0gYXZpb190ZWxsKHMtPnBiKSAtIG1rdi0+Y2x1c3Rlci5wb3M7CisKKyAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIG1rdl93cml0ZV9ibG9jayhzLCBwYiwgTUFUUk9TS0FfSURfU0lNUExFQkxPQ0ssIHBrdCwga2V5ZnJhbWUgPDwgNyk7CisgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYga2V5ZnJhbWUgfHwgYWRkX2N1ZSkgeworICAgICAgICAgICAgcmV0ID0gbWt2X2FkZF9jdWVwb2ludChta3YtPmN1ZXMsIHBrdC0+c3RyZWFtX2luZGV4LCBkYXNoX3RyYWNrbnVtLCB0cywgbWt2LT5jbHVzdGVyX3BvcywgcmVsYXRpdmVfcGFja2V0X3BvcywgLTEpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV0VCVlRUKSB7CisgICAgICAgIGR1cmF0aW9uID0gbWt2X3dyaXRlX3Z0dF9ibG9ja3MocywgcGIsIHBrdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZWJtbF9tYXN0ZXIgYmxvY2tncm91cCA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9CTE9DS0dST1VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWt2X2Jsb2NrZ3JvdXBfc2l6ZShwa3QtPnNpemUpKTsKKyAgICAgICAgLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHByZWZlciBjb252ZXJnZW5jZV9kdXJhdGlvbi4gKi8KKyAgICAgICAgaWYgKHBrdC0+Y29udmVyZ2VuY2VfZHVyYXRpb24gPiAwKSB7CisgICAgICAgICAgICBkdXJhdGlvbiA9IHBrdC0+Y29udmVyZ2VuY2VfZHVyYXRpb247CisgICAgICAgIH0KKyAgICAgICAgbWt2X3dyaXRlX2Jsb2NrKHMsIHBiLCBNQVRST1NLQV9JRF9CTE9DSywgcGt0LCAwKTsKKyAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQkxPQ0tEVVJBVElPTiwgZHVyYXRpb24pOworICAgICAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIGJsb2NrZ3JvdXApOworICAgIH0KKworICAgIHJldCA9IG1rdl9hZGRfY3VlcG9pbnQobWt2LT5jdWVzLCBwa3QtPnN0cmVhbV9pbmRleCwgZGFzaF90cmFja251bSwgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBta3YtPmNsdXN0ZXJfcG9zLCByZWxhdGl2ZV9wYWNrZXRfcG9zLCBkdXJhdGlvbik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgbWt2LT5kdXJhdGlvbiA9IEZGTUFYKG1rdi0+ZHVyYXRpb24sIHRzICsgZHVyYXRpb24pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1rdl93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2ID0gcy0+cHJpdl9kYXRhOworICAgIGludCBjb2RlY190eXBlICAgICAgICAgID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlOworICAgIGludCBrZXlmcmFtZSAgICAgICAgICAgID0gISEocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSk7CisgICAgaW50IGNsdXN0ZXJfc2l6ZTsKKyAgICBpbnQ2NF90IGNsdXN0ZXJfdGltZTsKKyAgICBpbnQgcmV0OworICAgIGludCBzdGFydF9uZXdfY2x1c3RlcjsKKworICAgIGlmIChta3YtPnRyYWNrc1twa3QtPnN0cmVhbV9pbmRleF0ud3JpdGVfZHRzKQorICAgICAgICBjbHVzdGVyX3RpbWUgPSBwa3QtPmR0cyAtIG1rdi0+Y2x1c3Rlcl9wdHM7CisgICAgZWxzZQorICAgICAgICBjbHVzdGVyX3RpbWUgPSBwa3QtPnB0cyAtIG1rdi0+Y2x1c3Rlcl9wdHM7CisgICAgY2x1c3Rlcl90aW1lICs9IG1rdi0+dHJhY2tzW3BrdC0+c3RyZWFtX2luZGV4XS50c19vZmZzZXQ7CisKKyAgICAvLyBzdGFydCBhIG5ldyBjbHVzdGVyIGV2ZXJ5IDUgTUIgb3IgNSBzZWMsIG9yIDMyayAvIDEgc2VjIGZvciBzdHJlYW1pbmcgb3IKKyAgICAvLyBhZnRlciA0ayBhbmQgb24gYSBrZXlmcmFtZQorICAgIGlmIChzLT5wYi0+c2Vla2FibGUpIHsKKyAgICAgICAgY2x1c3Rlcl9zaXplID0gYXZpb190ZWxsKHMtPnBiKSAtIG1rdi0+Y2x1c3Rlcl9wb3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2x1c3Rlcl9zaXplID0gYXZpb190ZWxsKG1rdi0+ZHluX2JjKTsKKyAgICB9CisKKyAgICBpZiAobWt2LT5pc19kYXNoICYmIGNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIC8vIFdlYk0gREFTSCBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IHRoZSBmaXJzdCBibG9jayBvZiBldmVyeSBjbHVzdGVyCisgICAgICAgIC8vIGhhcyB0byBiZSBhIGtleSBmcmFtZS4gU28gZm9yIERBU0ggdmlkZW8sIHdlIG9ubHkgY3JlYXRlIGEgY2x1c3RlcgorICAgICAgICAvLyBvbiBzZWVpbmcga2V5IGZyYW1lcy4KKyAgICAgICAgc3RhcnRfbmV3X2NsdXN0ZXIgPSBrZXlmcmFtZTsKKyAgICB9IGVsc2UgaWYgKG1rdi0+aXNfZGFzaCAmJiBjb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgKG1rdi0+Y2x1c3Rlcl9wb3MgPT0gLTEgfHwKKyAgICAgICAgICAgICAgICBjbHVzdGVyX3RpbWUgPiBta3YtPmNsdXN0ZXJfdGltZV9saW1pdCkpIHsKKyAgICAgICAgLy8gRm9yIERBU0ggYXVkaW8sIHdlIGNyZWF0ZSBhIENsdXN0ZXIgYmFzZWQgb24gY2x1c3Rlcl90aW1lX2xpbWl0CisgICAgICAgIHN0YXJ0X25ld19jbHVzdGVyID0gMTsKKyAgICB9IGVsc2UgaWYgKCFta3YtPmlzX2Rhc2ggJiYKKyAgICAgICAgICAgICAgIChjbHVzdGVyX3NpemUgPiBta3YtPmNsdXN0ZXJfc2l6ZV9saW1pdCB8fAorICAgICAgICAgICAgICAgIGNsdXN0ZXJfdGltZSA+IG1rdi0+Y2x1c3Rlcl90aW1lX2xpbWl0IHx8CisgICAgICAgICAgICAgICAgKGNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIGtleWZyYW1lICYmCisgICAgICAgICAgICAgICAgIGNsdXN0ZXJfc2l6ZSA+IDQgKiAxMDI0KSkpIHsKKyAgICAgICAgc3RhcnRfbmV3X2NsdXN0ZXIgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXJ0X25ld19jbHVzdGVyID0gMDsKKyAgICB9CisKKyAgICBpZiAobWt2LT5jbHVzdGVyX3BvcyAhPSAtMSAmJiBzdGFydF9uZXdfY2x1c3RlcikgeworICAgICAgICBta3Zfc3RhcnRfbmV3X2NsdXN0ZXIocywgcGt0KTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIGFuIGF1ZGlvIHBhY2tldCBjYWNoZWQKKyAgICBpZiAobWt2LT5jdXJfYXVkaW9fcGt0LnNpemUgPiAwKSB7CisgICAgICAgIC8vIGZvciBEQVNIIGF1ZGlvLCBhIEN1ZVBvaW50IGhhcyB0byBiZSBhZGRlZCB3aGVuIHRoZXJlIGlzIGEgbmV3IGNsdXN0ZXIuCisgICAgICAgIHJldCA9IG1rdl93cml0ZV9wYWNrZXRfaW50ZXJuYWwocywgJm1rdi0+Y3VyX2F1ZGlvX3BrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBta3YtPmlzX2Rhc2ggPyBzdGFydF9uZXdfY2x1c3RlciA6IDApOworICAgICAgICBhdl9mcmVlX3BhY2tldCgmbWt2LT5jdXJfYXVkaW9fcGt0KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB3cml0ZSBjYWNoZWQgYXVkaW8gcGFja2V0IHJldDolZFxuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBidWZmZXIgYW4gYXVkaW8gcGFja2V0IHRvIGVuc3VyZSB0aGUgcGFja2V0IGNvbnRhaW5pbmcgdGhlIHZpZGVvCisgICAgLy8ga2V5ZnJhbWUncyB0aW1lY29kZSBpcyBjb250YWluZWQgaW4gdGhlIHNhbWUgY2x1c3RlciBmb3IgV2ViTQorICAgIGlmIChjb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBta3YtPmN1cl9hdWRpb19wa3QgPSAqcGt0OworICAgICAgICBpZiAocGt0LT5idWYpIHsKKyAgICAgICAgICAgIG1rdi0+Y3VyX2F1ZGlvX3BrdC5idWYgPSBhdl9idWZmZXJfcmVmKHBrdC0+YnVmKTsKKyAgICAgICAgICAgIHJldCA9IG1rdi0+Y3VyX2F1ZGlvX3BrdC5idWYgPyAwIDogQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldCA9IGF2X2R1cF9wYWNrZXQoJm1rdi0+Y3VyX2F1ZGlvX3BrdCk7CisgICAgICAgIGlmIChta3YtPmN1cl9hdWRpb19wa3Quc2lkZV9kYXRhX2VsZW1zID4gMCkgeworICAgICAgICAgICAgcmV0ID0gYXZfY29weV9wYWNrZXRfc2lkZV9kYXRhKCZta3YtPmN1cl9hdWRpb19wa3QsICZta3YtPmN1cl9hdWRpb19wa3QpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIHJldCA9IG1rdl93cml0ZV9wYWNrZXRfaW50ZXJuYWwocywgcGt0LCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1rdl93cml0ZV9mbHVzaF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYjsKKyAgICBpZiAocy0+cGItPnNlZWthYmxlKQorICAgICAgICBwYiA9IHMtPnBiOworICAgIGVsc2UKKyAgICAgICAgcGIgPSBta3YtPmR5bl9iYzsKKyAgICBpZiAoIXBrdCkgeworICAgICAgICBpZiAobWt2LT5jbHVzdGVyX3BvcyAhPSAtMSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAiRmx1c2hpbmcgY2x1c3RlciBhdCBvZmZzZXQgJSIgUFJJdTY0ICIgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgYXZpb190ZWxsKHBiKSk7CisgICAgICAgICAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIG1rdi0+Y2x1c3Rlcik7CisgICAgICAgICAgICBta3YtPmNsdXN0ZXJfcG9zID0gLTE7CisgICAgICAgICAgICBpZiAobWt2LT5keW5fYmMpCisgICAgICAgICAgICAgICAgbWt2X2ZsdXNoX2R5bmJ1ZihzKTsKKyAgICAgICAgICAgIGF2aW9fZmx1c2gocy0+cGIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbWt2X3dyaXRlX3BhY2tldChzLCBwa3QpOworfQorCitzdGF0aWMgaW50IG1rdl93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNYXRyb3NrYU11eENvbnRleHQgKm1rdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQ2NF90IGN1cnJlbnRwb3MsIGN1ZXNwb3M7CisgICAgaW50IHJldDsKKworICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgYW4gYXVkaW8gcGFja2V0IGNhY2hlZAorICAgIGlmIChta3YtPmN1cl9hdWRpb19wa3Quc2l6ZSA+IDApIHsKKyAgICAgICAgcmV0ID0gbWt2X3dyaXRlX3BhY2tldF9pbnRlcm5hbChzLCAmbWt2LT5jdXJfYXVkaW9fcGt0LCAwKTsKKyAgICAgICAgYXZfZnJlZV9wYWNrZXQoJm1rdi0+Y3VyX2F1ZGlvX3BrdCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgd3JpdGUgY2FjaGVkIGF1ZGlvIHBhY2tldCByZXQ6JWRcbiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1rdi0+ZHluX2JjKSB7CisgICAgICAgIGVuZF9lYm1sX21hc3Rlcihta3YtPmR5bl9iYywgbWt2LT5jbHVzdGVyKTsKKyAgICAgICAgbWt2X2ZsdXNoX2R5bmJ1ZihzKTsKKyAgICB9IGVsc2UgaWYgKG1rdi0+Y2x1c3Rlcl9wb3MgIT0gLTEpIHsKKyAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBta3YtPmNsdXN0ZXIpOworICAgIH0KKworICAgIGlmIChta3YtPm1vZGUgIT0gTU9ERV9XRUJNKSB7CisgICAgICAgIHJldCA9IG1rdl93cml0ZV9jaGFwdGVycyhzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChwYi0+c2Vla2FibGUpIHsKKyAgICAgICAgaWYgKG1rdi0+Y3Vlcy0+bnVtX2VudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChta3YtPnJlc2VydmVfY3Vlc19zcGFjZSkgeworICAgICAgICAgICAgICAgIGludDY0X3QgY3Vlc19lbmQ7CisKKyAgICAgICAgICAgICAgICBjdXJyZW50cG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIG1rdi0+Y3Vlc19wb3MsIFNFRUtfU0VUKTsKKworICAgICAgICAgICAgICAgIGN1ZXNwb3MgID0gbWt2X3dyaXRlX2N1ZXMocywgbWt2LT5jdWVzLCBta3YtPnRyYWNrcywgcy0+bmJfc3RyZWFtcyk7CisgICAgICAgICAgICAgICAgY3Vlc19lbmQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgICAgIGlmIChjdWVzX2VuZCA+IGN1ZXNwb3MgKyBta3YtPnJlc2VydmVfY3Vlc19zcGFjZSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluc3VmZmljaWVudCBzcGFjZSByZXNlcnZlZCBmb3IgY3VlczogJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIihuZWVkZWQ6ICUiIFBSSWQ2NCAiKS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBta3YtPnJlc2VydmVfY3Vlc19zcGFjZSwgY3Vlc19lbmQgLSBjdWVzcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY3Vlc19lbmQgPCBjdWVzcG9zICsgbWt2LT5yZXNlcnZlX2N1ZXNfc3BhY2UpCisgICAgICAgICAgICAgICAgICAgIHB1dF9lYm1sX3ZvaWQocGIsIG1rdi0+cmVzZXJ2ZV9jdWVzX3NwYWNlIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3Vlc19lbmQgLSBjdWVzcG9zKSk7CisKKyAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGN1cnJlbnRwb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3Vlc3BvcyA9IG1rdl93cml0ZV9jdWVzKHMsIG1rdi0+Y3VlcywgbWt2LT50cmFja3MsIHMtPm5iX3N0cmVhbXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBta3ZfYWRkX3NlZWtoZWFkX2VudHJ5KG1rdi0+bWFpbl9zZWVraGVhZCwgTUFUUk9TS0FfSURfQ1VFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vlc3Bvcyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgbWt2X3dyaXRlX3NlZWtoZWFkKHBiLCBta3YtPm1haW5fc2Vla2hlYWQpOworCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgZHVyYXRpb24KKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImVuZCBkdXJhdGlvbiA9ICUiIFBSSXU2NCAiXG4iLCBta3YtPmR1cmF0aW9uKTsKKyAgICAgICAgY3VycmVudHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGF2aW9fc2VlayhwYiwgbWt2LT5kdXJhdGlvbl9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgcHV0X2VibWxfZmxvYXQocGIsIE1BVFJPU0tBX0lEX0RVUkFUSU9OLCBta3YtPmR1cmF0aW9uKTsKKworICAgICAgICBhdmlvX3NlZWsocGIsIGN1cnJlbnRwb3MsIFNFRUtfU0VUKTsKKyAgICB9CisKKyAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIG1rdi0+c2VnbWVudCk7CisgICAgYXZfZnJlZXAoJm1rdi0+dHJhY2tzKTsKKyAgICBhdl9mcmVlcCgmbWt2LT5jdWVzLT5lbnRyaWVzKTsKKyAgICBhdl9mcmVlcCgmbWt2LT5jdWVzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1rdl9xdWVyeV9jb2RlYyhlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCwgaW50IHN0ZF9jb21wbGlhbmNlKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGZmX21rdl9jb2RlY190YWdzW2ldLmlkICE9IEFWX0NPREVDX0lEX05PTkU7IGkrKykKKyAgICAgICAgaWYgKGZmX21rdl9jb2RlY190YWdzW2ldLmlkID09IGNvZGVjX2lkKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoc3RkX2NvbXBsaWFuY2UgPCBGRl9DT01QTElBTkNFX05PUk1BTCkgeworICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUgPSBhdmNvZGVjX2dldF90eXBlKGNvZGVjX2lkKTsKKyAgICAgICAgLy8gbWt2IHRoZW9yZXRpY2FsbHkgc3VwcG9ydHMgYW55IHZpZGVvL2F1ZGlvIHRocm91Z2ggVkZXL0FDTQorICAgICAgICBpZiAodHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwgdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgYWRkaXRpb25hbF9hdWRpb190YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9BTEFDLCAgICAgIDBYRkZGRkZGRkYgfSwKKyAgICB7IEFWX0NPREVDX0lEX0VBQzMsICAgICAgMFhGRkZGRkZGRiB9LAorICAgIHsgQVZfQ09ERUNfSURfTUxQLCAgICAgICAweEZGRkZGRkZGIH0sCisgICAgeyBBVl9DT0RFQ19JRF9PUFVTLCAgICAgIDB4RkZGRkZGRkYgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMTZCRSwgMHhGRkZGRkZGRiB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MyNEJFLCAweEZGRkZGRkZGIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzMyQkUsIDB4RkZGRkZGRkYgfSwKKyAgICB7IEFWX0NPREVDX0lEX1FETTIsICAgICAgMHhGRkZGRkZGRiB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFfMTQ0LCAgICAweEZGRkZGRkZGIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQV8yODgsICAgIDB4RkZGRkZGRkYgfSwKKyAgICB7IEFWX0NPREVDX0lEX0NPT0ssICAgICAgMHhGRkZGRkZGRiB9LAorICAgIHsgQVZfQ09ERUNfSURfVFJVRUhELCAgICAweEZGRkZGRkZGIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAgICAgIDB4RkZGRkZGRkYgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgYWRkaXRpb25hbF92aWRlb190YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9SVjEwLCAgICAgIDB4RkZGRkZGRkYgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JWMjAsICAgICAgMHhGRkZGRkZGRiB9LAorICAgIHsgQVZfQ09ERUNfSURfUlYzMCwgICAgICAweEZGRkZGRkZGIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SVjQwLCAgICAgIDB4RkZGRkZGRkYgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQOSwgICAgICAgMHhGRkZGRkZGRiB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgICAweEZGRkZGRkZGIH0KK307CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE1hdHJvc2thTXV4Q29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAicmVzZXJ2ZV9pbmRleF9zcGFjZSIsICJSZXNlcnZlIGEgZ2l2ZW4gYW1vdW50IG9mIHNwYWNlIChpbiBieXRlcykgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBmb3IgdGhlIGluZGV4IChjdWVzKS4iLCBPRkZTRVQocmVzZXJ2ZV9jdWVzX3NwYWNlKSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDAgfSwgICAwLCBJTlRfTUFYLCAgIEZMQUdTIH0sCisgICAgeyAiY2x1c3Rlcl9zaXplX2xpbWl0IiwgICJTdG9yZSBhdCBtb3N0IHRoZSBwcm92aWRlZCBhbW91bnQgb2YgYnl0ZXMgaW4gYSBjbHVzdGVyLiAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoY2x1c3Rlcl9zaXplX2xpbWl0KSwgQVZfT1BUX1RZUEVfSU5UICAsIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlRfTUFYLCAgIEZMQUdTIH0sCisgICAgeyAiY2x1c3Rlcl90aW1lX2xpbWl0IiwgICJTdG9yZSBhdCBtb3N0IHRoZSBwcm92aWRlZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGEgY2x1c3Rlci4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoY2x1c3Rlcl90aW1lX2xpbWl0KSwgQVZfT1BUX1RZUEVfSU5UNjQsIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisgICAgeyAiZGFzaCIsICJDcmVhdGUgYSBXZWJNIGZpbGUgY29uZm9ybWluZyB0byBXZWJNIERBU0ggc3BlY2lmaWNhdGlvbiIsIE9GRlNFVChpc19kYXNoKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiZGFzaF90cmFja19udW1iZXIiLCAiVHJhY2sgbnVtYmVyIGZvciB0aGUgREFTSCBzdHJlYW0iLCBPRkZTRVQoZGFzaF90cmFja19udW1iZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgMTI3LCBGTEFHUyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworI2lmIENPTkZJR19NQVRST1NLQV9NVVhFUgorc3RhdGljIGNvbnN0IEFWQ2xhc3MgbWF0cm9za2FfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibWF0cm9za2EgbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfbWF0cm9za2FfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gIm1hdHJvc2thIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWF0cm9za2EiKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAidmlkZW8veC1tYXRyb3NrYSIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gIm1rdiIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKE1hdHJvc2thTXV4Q29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQ09ORklHX0xJQlZPUkJJU19FTkNPREVSID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19JRF9WT1JCSVMgOiBBVl9DT0RFQ19JRF9BQzMsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQ09ORklHX0xJQlgyNjRfRU5DT0RFUiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSURfSDI2NCA6IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1rdl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbWt2X3dyaXRlX2ZsdXNoX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBta3Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9WQVJJQUJMRV9GUFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRk1UX1RTX05PTlNUUklDVCB8IEFWRk1UX0FMTE9XX0ZMVVNILAorICAgIC5jb2RlY190YWcgICAgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7CisgICAgICAgICBmZl9jb2RlY19ibXBfdGFncywgZmZfY29kZWNfd2F2X3RhZ3MsCisgICAgICAgICBhZGRpdGlvbmFsX2F1ZGlvX3RhZ3MsIGFkZGl0aW9uYWxfdmlkZW9fdGFncywgMAorICAgIH0sCisgICAgLnN1YnRpdGxlX2NvZGVjICAgID0gQVZfQ09ERUNfSURfQVNTLAorICAgIC5xdWVyeV9jb2RlYyAgICAgICA9IG1rdl9xdWVyeV9jb2RlYywKKyAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmbWF0cm9za2FfY2xhc3MsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfV0VCTV9NVVhFUgorc3RhdGljIGNvbnN0IEFWQ2xhc3Mgd2VibV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJ3ZWJtIG11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3dlYm1fbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gIndlYm0iLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXZWJNIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gInZpZGVvL3dlYm0iLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJ3ZWJtIiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTWF0cm9za2FNdXhDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9WT1JCSVMsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfVlA4LAorICAgIC5zdWJ0aXRsZV9jb2RlYyAgICA9IEFWX0NPREVDX0lEX1dFQlZUVCwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBta3Zfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IG1rdl93cml0ZV9mbHVzaF9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgICAgID0gbWt2X3dyaXRlX3RyYWlsZXIsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfR0xPQkFMSEVBREVSIHwgQVZGTVRfVkFSSUFCTEVfRlBTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVkZNVF9UU19OT05TVFJJQ1QgfCBBVkZNVF9BTExPV19GTFVTSCwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmd2VibV9jbGFzcywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19NQVRST1NLQV9BVURJT19NVVhFUgorc3RhdGljIGNvbnN0IEFWQ2xhc3MgbWthX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIm1hdHJvc2thIGF1ZGlvIG11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CitBVk91dHB1dEZvcm1hdCBmZl9tYXRyb3NrYV9hdWRpb19tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAibWF0cm9za2EiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNYXRyb3NrYSBBdWRpbyIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhdWRpby94LW1hdHJvc2thIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAibWthIiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTWF0cm9za2FNdXhDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBDT05GSUdfTElCVk9SQklTX0VOQ09ERVIgPworICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0lEX1ZPUkJJUyA6IEFWX0NPREVDX0lEX0FDMywKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1rdl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbWt2X3dyaXRlX2ZsdXNoX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBta3Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9UU19OT05TVFJJQ1QgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRk1UX0FMTE9XX0ZMVVNILAorICAgIC5jb2RlY190YWcgICAgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7CisgICAgICAgIGZmX2NvZGVjX3dhdl90YWdzLCBhZGRpdGlvbmFsX2F1ZGlvX3RhZ3MsIDAKKyAgICB9LAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZta2FfY2xhc3MsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbWQ1ZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbWQ1ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4N2YwOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tZDVlbmMuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIE1ENSBlbmNvZGVyIChmb3IgY29kZWMvZm9ybWF0IHRlc3RpbmcpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVpbWFyIETDtmZmaW5nZXIsIGJhc2VkIG9uIGNyY2VuYyAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9oYXNoLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RydWN0IE1ENUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmF2Y2xhc3M7CisgICAgc3RydWN0IEFWSGFzaENvbnRleHQgKmhhc2g7CisgICAgY2hhciAqaGFzaF9uYW1lOworICAgIGludCBmb3JtYXRfdmVyc2lvbjsKK307CisKK3N0YXRpYyB2b2lkIG1kNV9maW5pc2goc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgY2hhciAqYnVmKQoreworICAgIHN0cnVjdCBNRDVDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgbWQ1W0FWX0hBU0hfTUFYX1NJWkVdOworICAgIGludCBpLCBvZmZzZXQgPSBzdHJsZW4oYnVmKTsKKyAgICBpbnQgbGVuID0gYXZfaGFzaF9nZXRfc2l6ZShjLT5oYXNoKTsKKyAgICBhdl9hc3NlcnQwKGxlbiA+IDAgJiYgbGVuIDw9IHNpemVvZihtZDUpKTsKKyAgICBhdl9oYXNoX2ZpbmFsKGMtPmhhc2gsIG1kNSk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZiArIG9mZnNldCwgMywgIiUwMiJQUkl4OCwgbWQ1W2ldKTsKKyAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgfQorICAgIGJ1ZltvZmZzZXRdID0gJ1xuJzsKKyAgICBidWZbb2Zmc2V0KzFdID0gMDsKKworICAgIGF2aW9fd3JpdGUocy0+cGIsIGJ1Ziwgc3RybGVuKGJ1ZikpOworICAgIGF2aW9fZmx1c2gocy0+cGIpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihzdHJ1Y3QgTUQ1Q29udGV4dCwgeCkKKyNkZWZpbmUgRU5DIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaGFzaF9vcHRpb25zW10gPSB7CisgICAgeyAiaGFzaCIsICJzZXQgaGFzaCB0byB1c2UiLCBPRkZTRVQoaGFzaF9uYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJtZDUifSwgMCwgMCwgRU5DIH0sCisgICAgeyAiZm9ybWF0X3ZlcnNpb24iLCAiZmlsZSBmb3JtYXQgdmVyc2lvbiIsIE9GRlNFVChmb3JtYXRfdmVyc2lvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgMSwgMSwgRU5DIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBtZDVlbmNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiaGFzaCBlbmNvZGVyIGNsYXNzIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gaGFzaF9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworI2lmIENPTkZJR19NRDVfTVVYRVIKK3N0YXRpYyBpbnQgd3JpdGVfaGVhZGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgc3RydWN0IE1ENUNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJlcyA9IGF2X2hhc2hfYWxsb2MoJmMtPmhhc2gsIGMtPmhhc2hfbmFtZSk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiByZXM7CisgICAgYXZfaGFzaF9pbml0KGMtPmhhc2gpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3BhY2tldChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIHN0cnVjdCBNRDVDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGF2X2hhc2hfdXBkYXRlKGMtPmhhc2gsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV90cmFpbGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgc3RydWN0IE1ENUNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBhdl9zdHJsY3B5KGJ1ZiwgYXZfaGFzaF9nZXRfbmFtZShjLT5oYXNoKSwgc2l6ZW9mKGJ1ZikgLSAyMDApOworICAgIGF2X3N0cmxjYXQoYnVmLCAiPSIsIHNpemVvZihidWYpIC0gMjAwKTsKKworICAgIG1kNV9maW5pc2gocywgYnVmKTsKKworICAgIGF2X2hhc2hfZnJlZXAoJmMtPmhhc2gpOworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9tZDVfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gIm1kNSIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1ENSB0ZXN0aW5nIiksCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKHN0cnVjdCBNRDVDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHdyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSB3cml0ZV90cmFpbGVyLAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKKyAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmbWQ1ZW5jX2NsYXNzLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0ZSQU1FTUQ1X01VWEVSCitzdGF0aWMgaW50IGZyYW1lbWQ1X3dyaXRlX2hlYWRlcihzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHN0cnVjdCBNRDVDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXMgPSBhdl9oYXNoX2FsbG9jKCZjLT5oYXNoLCBjLT5oYXNoX25hbWUpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zXG4iKTsKKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiN2ZXJzaW9uOiAlZFxuIiwgYy0+Zm9ybWF0X3ZlcnNpb24pOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiI2hhc2g6ICVzXG4iLCBhdl9oYXNoX2dldF9uYW1lKGMtPmhhc2gpKTsKKyAgICBmZl9mcmFtZWhhc2hfd3JpdGVfaGVhZGVyKHMpOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmcmFtZW1kNV93cml0ZV9wYWNrZXQoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBzdHJ1Y3QgTUQ1Q29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIGF2X2hhc2hfaW5pdChjLT5oYXNoKTsKKyAgICBhdl9oYXNoX3VwZGF0ZShjLT5oYXNoLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gNjQsICIlZCwgJTEwIlBSSWQ2NCIsICUxMCJQUklkNjQiLCAlOGQsICU4ZCwgIiwKKyAgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCwgcGt0LT5kdHMsIHBrdC0+cHRzLCBwa3QtPmR1cmF0aW9uLCBwa3QtPnNpemUpOworICAgIG1kNV9maW5pc2gocywgYnVmKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmcmFtZW1kNV93cml0ZV90cmFpbGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgc3RydWN0IE1ENUNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgYXZfaGFzaF9mcmVlcCgmYy0+aGFzaCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGZyYW1lbWQ1X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImZyYW1lIGhhc2ggZW5jb2RlciBjbGFzcyIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGhhc2hfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWT3V0cHV0Rm9ybWF0IGZmX2ZyYW1lbWQ1X211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJmcmFtZW1kNSIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBlci1mcmFtZSBNRDUgdGVzdGluZyIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihzdHJ1Y3QgTUQ1Q29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZyYW1lbWQ1X3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmcmFtZW1kNV93cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgICAgID0gZnJhbWVtZDVfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9WQVJJQUJMRV9GUFMgfCBBVkZNVF9UU19OT05TVFJJQ1QgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRk1UX1RTX05FR0FUSVZFLAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZmcmFtZW1kNV9jbGFzcywKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tZDVwcm90by5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21kNXByb3RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmMGE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tZDVwcm90by5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFucyBSdWxsZ2FyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWQ1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9lcnJvci5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpby5oIgorI2luY2x1ZGUgInVybC5oIgorCitzdHJ1Y3QgTUQ1Q29udGV4dCB7CisgICAgc3RydWN0IEFWTUQ1ICptZDU7Cit9OworCitzdGF0aWMgaW50IG1kNV9vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgc3RydWN0IE1ENUNvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisKKyAgICBpZiAoIShmbGFncyAmIEFWSU9fRkxBR19XUklURSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBjLT5tZDUgPSBhdl9tZDVfYWxsb2MoKTsKKyAgICBpZiAoIWMtPm1kNSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdl9tZDVfaW5pdChjLT5tZDUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWQ1X3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgc3RydWN0IE1ENUNvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgYXZfbWQ1X3VwZGF0ZShjLT5tZDUsIGJ1Ziwgc2l6ZSk7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgbWQ1X2Nsb3NlKFVSTENvbnRleHQgKmgpCit7CisgICAgc3RydWN0IE1ENUNvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBoLT5maWxlbmFtZTsKKyAgICB1aW50OF90IG1kNVsxNl0sIGJ1Zls2NF07CisgICAgVVJMQ29udGV4dCAqb3V0OworICAgIGludCBpLCBlcnIgPSAwOworCisgICAgYXZfbWQ1X2ZpbmFsKGMtPm1kNSwgbWQ1KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG1kNSk7IGkrKykKKyAgICAgICAgc25wcmludGYoYnVmICsgaSoyLCAzLCAiJTAyeCIsIG1kNVtpXSk7CisgICAgYnVmW2kqMl0gPSAnXG4nOworCisgICAgYXZfc3Ryc3RhcnQoZmlsZW5hbWUsICJtZDU6IiwgJmZpbGVuYW1lKTsKKworICAgIGlmICgqZmlsZW5hbWUpIHsKKyAgICAgICAgZXJyID0gZmZ1cmxfb3Blbigmb3V0LCBmaWxlbmFtZSwgQVZJT19GTEFHX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgZXJyID0gZmZ1cmxfd3JpdGUob3V0LCBidWYsIGkqMisxKTsKKyAgICAgICAgZmZ1cmxfY2xvc2Uob3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZndyaXRlKGJ1ZiwgMSwgaSoyKzEsIHN0ZG91dCkgPCBpKjIrMSkKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoZXJybm8pOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZjLT5tZDUpOworCisgICAgcmV0dXJuIGVycjsKK30KKworCitVUkxQcm90b2NvbCBmZl9tZDVfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAibWQ1IiwKKyAgICAudXJsX29wZW4gICAgICAgICAgICA9IG1kNV9vcGVuLAorICAgIC51cmxfd3JpdGUgICAgICAgICAgID0gbWQ1X3dyaXRlLAorICAgIC51cmxfY2xvc2UgICAgICAgICAgID0gbWQ1X2Nsb3NlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKHN0cnVjdCBNRDVDb250ZXh0KSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbWV0YWRhdGEuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tZXRhZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjZkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbWV0YWRhdGEuYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDA5IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorCit2b2lkIGZmX21ldGFkYXRhX2NvbnYoQVZEaWN0aW9uYXJ5ICoqcG0sIGNvbnN0IEFWTWV0YWRhdGFDb252ICpkX2NvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVk1ldGFkYXRhQ29udiAqc19jb252KQoreworICAgIC8qIFRPRE86IHVzZSBiaW5hcnkgc2VhcmNoIHRvIGxvb2sgdXAgdGhlIHR3byBjb252ZXJzaW9uIHRhYmxlcworICAgICAgIGlmIHRoZSB0YWJsZXMgYXJlIGdldHRpbmcgYmlnIGVub3VnaCB0aGF0IGl0IHdvdWxkIG1hdHRlciBzcGVlZCB3aXNlICovCisgICAgY29uc3QgQVZNZXRhZGF0YUNvbnYgKnNjLCAqZGM7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKm10YWcgPSBOVUxMOworICAgIEFWRGljdGlvbmFyeSAqZHN0ID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICprZXk7CisKKyAgICBpZiAoZF9jb252ID09IHNfY29udiB8fCAhcG0pCisgICAgICAgIHJldHVybjsKKworICAgIHdoaWxlICgobXRhZyA9IGF2X2RpY3RfZ2V0KCpwbSwgIiIsIG10YWcsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgIGtleSA9IG10YWctPmtleTsKKyAgICAgICAgaWYgKHNfY29udikKKyAgICAgICAgICAgIGZvciAoc2M9c19jb252OyBzYy0+bmF0aXZlOyBzYysrKQorICAgICAgICAgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcChrZXksIHNjLT5uYXRpdmUpKSB7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IHNjLT5nZW5lcmljOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmIChkX2NvbnYpCisgICAgICAgICAgICBmb3IgKGRjPWRfY29udjsgZGMtPm5hdGl2ZTsgZGMrKykKKyAgICAgICAgICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAoa2V5LCBkYy0+Z2VuZXJpYykpIHsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gZGMtPm5hdGl2ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICBhdl9kaWN0X3NldCgmZHN0LCBrZXksIG10YWctPnZhbHVlLCAwKTsKKyAgICB9CisgICAgYXZfZGljdF9mcmVlKHBtKTsKKyAgICAqcG0gPSBkc3Q7Cit9CisKK3ZvaWQgZmZfbWV0YWRhdGFfY29udl9jdHgoQVZGb3JtYXRDb250ZXh0ICpjdHgsIGNvbnN0IEFWTWV0YWRhdGFDb252ICpkX2NvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVk1ldGFkYXRhQ29udiAqc19jb252KQoreworICAgIGludCBpOworICAgIGZmX21ldGFkYXRhX2NvbnYoJmN0eC0+bWV0YWRhdGEsIGRfY29udiwgc19jb252KTsKKyAgICBmb3IgKGk9MDsgaTxjdHgtPm5iX3N0cmVhbXMgOyBpKyspCisgICAgICAgIGZmX21ldGFkYXRhX2NvbnYoJmN0eC0+c3RyZWFtcyBbaV0tPm1ldGFkYXRhLCBkX2NvbnYsIHNfY29udik7CisgICAgZm9yIChpPTA7IGk8Y3R4LT5uYl9jaGFwdGVyczsgaSsrKQorICAgICAgICBmZl9tZXRhZGF0YV9jb252KCZjdHgtPmNoYXB0ZXJzW2ldLT5tZXRhZGF0YSwgZF9jb252LCBzX2NvbnYpOworICAgIGZvciAoaT0wOyBpPGN0eC0+bmJfcHJvZ3JhbXM7IGkrKykKKyAgICAgICAgZmZfbWV0YWRhdGFfY29udigmY3R4LT5wcm9ncmFtc1tpXS0+bWV0YWRhdGEsIGRfY29udiwgc19jb252KTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tZXRhZGF0YS5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4NjA5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tZXRhZGF0YS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDkgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX01FVEFEQVRBX0gKKyNkZWZpbmUgQVZGT1JNQVRfTUVUQURBVEFfSAorCisvKioKKyAqIEBmaWxlCisgKiBpbnRlcm5hbCBtZXRhZGF0YSBBUEkgaGVhZGVyCisgKiBzZWUgYXZmb3JtYXQuaCBvciB0aGUgcHVibGljIEFQSSEKKyAqLworCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisKK3R5cGVkZWYgc3RydWN0IEFWTWV0YWRhdGFDb252IHsKKyAgICBjb25zdCBjaGFyICpuYXRpdmU7CisgICAgY29uc3QgY2hhciAqZ2VuZXJpYzsKK30gQVZNZXRhZGF0YUNvbnY7CisKK3ZvaWQgZmZfbWV0YWRhdGFfY29udihBVkRpY3Rpb25hcnkgKipwbSwgY29uc3QgQVZNZXRhZGF0YUNvbnYgKmRfY29udiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWTWV0YWRhdGFDb252ICpzX2NvbnYpOwordm9pZCBmZl9tZXRhZGF0YV9jb252X2N0eChBVkZvcm1hdENvbnRleHQgKmN0eCwgY29uc3QgQVZNZXRhZGF0YUNvbnYgKmRfY29udiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWTWV0YWRhdGFDb252ICpzX2NvbnYpOworCisjZW5kaWYgLyogQVZGT1JNQVRfTUVUQURBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L21nc3RzLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbWdzdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2JjOTUyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21nc3RzLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBNZXRhciBHZWFyIFNvbGlkOiBUaGUgVHdpbiBTbmFrZXMgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicmlmZi5oIgorCitzdGF0aWMgaW50IHJlYWRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKEFWX1JCMzIocC0+YnVmICAgICApICE9IDB4MDAwRSB8fAorICAgICAgICBBVl9SQjMyKHAtPmJ1ZiArICA0KSAhPSAweDAwNTAgfHwKKyAgICAgICAgQVZfUkIzMihwLT5idWYgKyAxMikgIT0gMHgwMDM0KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICAgICpzdDsKKyAgICBBVlJhdGlvbmFsICBmcHM7CisgICAgdWludDMyX3QgY2h1bmtfc2l6ZTsKKworICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgY2h1bmtfc2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgaWYgKGNodW5rX3NpemUgIT0gODApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgYXZpb19za2lwKHBiLCAyMCk7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgMCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOworICAgIHN0LT5zdGFydF90aW1lID0gMDsKKyAgICBzdC0+bmJfZnJhbWVzICA9CisgICAgc3QtPmR1cmF0aW9uICAgPSBhdmlvX3JiMzIocGIpOworICAgIGZwcyA9IGF2X2QycShhdl9pbnQyZmxvYXQoYXZpb19yYjMyKHBiKSksIElOVF9NQVgpOworICAgIHN0LT5jb2RlYy0+d2lkdGggID0gYXZpb19yYjMyKHBiKTsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmIzMihwYik7CisgICAgYXZpb19za2lwKHBiLCAxMik7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IGF2aW9fcmIzMihwYik7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2JtcF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIGZwcy5kZW4sIGZwcy5udW0pOworICAgIGF2aW9fc2tpcChwYiwgMjApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVpbnQzMl90IGNodW5rX3NpemUsIHBheWxvYWRfc2l6ZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgY2h1bmtfc2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICBwYXlsb2FkX3NpemUgPSBhdmlvX3JiMzIocGIpOworCisgICAgaWYgKGNodW5rX3NpemUgPCBwYXlsb2FkX3NpemUgKyAxNikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgcGF5bG9hZF9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBrdC0+cG9zIC09IDE2OworICAgIHBrdC0+ZHVyYXRpb24gPSAxOworICAgIGF2aW9fc2tpcChwYiwgY2h1bmtfc2l6ZSAtIChyZXQgKyAxNikpOworCisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9tZ3N0c19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICA9ICJtZ3N0cyIsCisgICAgLmxvbmdfbmFtZSAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1ldGFsIEdlYXIgU29saWQ6IFRoZSBUd2luIFNuYWtlcyIpLAorICAgIC5yZWFkX3Byb2JlICA9IHJlYWRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyID0gcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ID0gcmVhZF9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbWljcm9kdmRkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9taWNyb2R2ZGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzQzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbWljcm9kdmRkZWMuYwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIE1pY3JvRFZEIHN1YnRpdGxlIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDEyICBDbMOpbWVudCBCxZNzY2ggPHUgcGtoIG1lPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInN1YnRpdGxlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNkZWZpbmUgTUFYX0xJTkVTSVpFIDIwNDgKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgRkZEZW11eFN1YnRpdGxlc1F1ZXVlIHE7CisgICAgQVZSYXRpb25hbCBmcmFtZV9yYXRlOworfSBNaWNyb0RWRENvbnRleHQ7CisKKworc3RhdGljIGludCBtaWNyb2R2ZF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGM7CisgICAgY29uc3QgdWludDhfdCAqcHRyID0gcC0+YnVmOworICAgIGludCBpOworCisgICAgaWYgKEFWX1JCMjQocHRyKSA9PSAweEVGQkJCRikKKyAgICAgICAgcHRyICs9IDM7ICAvKiBza2lwIFVURi04IEJPTSAqLworCisgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7CisgICAgICAgIGlmIChzc2NhbmYocHRyLCAieyUqZH17fSVjIiwgICAgICZjKSAhPSAxICYmCisgICAgICAgICAgICBzc2NhbmYocHRyLCAieyUqZH17JSpkfSVjIiwgICZjKSAhPSAxICYmCisgICAgICAgICAgICBzc2NhbmYocHRyLCAie0RFRkFVTFR9e30lYyIsICZjKSAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHB0ciArPSBmZl9zdWJ0aXRsZXNfbmV4dF9saW5lKHB0cik7CisgICAgfQorICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKK30KKworc3RhdGljIGludDY0X3QgZ2V0X3B0cyhjb25zdCBjaGFyICpidWYpCit7CisgICAgaW50IGZyYW1lOworICAgIGNoYXIgYzsKKworICAgIGlmIChzc2NhbmYoYnVmLCAieyVkfXslYyIsICZmcmFtZSwgJmMpID09IDIpCisgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2R1cmF0aW9uKGNvbnN0IGNoYXIgKmJ1ZikKK3sKKyAgICBpbnQgZnJhbWVfc3RhcnQsIGZyYW1lX2VuZDsKKworICAgIGlmIChzc2NhbmYoYnVmLCAieyVkfXslZH0iLCAmZnJhbWVfc3RhcnQsICZmcmFtZV9lbmQpID09IDIpCisgICAgICAgIHJldHVybiBmcmFtZV9lbmQgLSBmcmFtZV9zdGFydDsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpib20gPSAiXHhFRlx4QkJceEJGIjsKKworc3RhdGljIGludCBtaWNyb2R2ZF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZSYXRpb25hbCBwdHNfaW5mbyA9IChBVlJhdGlvbmFsKXsgMjk5NywgMTI1IH07ICAvKiBkZWZhdWx0OiAyMy45NzYgZnBzICovCisgICAgTWljcm9EVkRDb250ZXh0ICptaWNyb2R2ZCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGludCBpID0gMDsKKyAgICBjaGFyIGxpbmVfYnVmW01BWF9MSU5FU0laRV07CisgICAgaW50IGhhc19yZWFsX2ZwcyA9IDA7CisKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgd2hpbGUgKCFhdmlvX2Zlb2Yocy0+cGIpKSB7CisgICAgICAgIGNoYXIgKnA7CisgICAgICAgIEFWUGFja2V0ICpzdWI7CisgICAgICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICAgICAgaW50IGxlbiA9IGZmX2dldF9saW5lKHMtPnBiLCBsaW5lX2J1Ziwgc2l6ZW9mKGxpbmVfYnVmKSk7CisgICAgICAgIGNoYXIgKmxpbmUgPSBsaW5lX2J1ZjsKKworICAgICAgICBpZiAoIXN0cm5jbXAobGluZSwgYm9tLCAzKSkKKyAgICAgICAgICAgIGxpbmUgKz0gMzsKKyAgICAgICAgcCA9IGxpbmU7CisKKyAgICAgICAgaWYgKCFsZW4pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGluZVtzdHJjc3BuKGxpbmUsICJcclxuIildID0gMDsKKyAgICAgICAgaWYgKGkrKyA8IDMpIHsKKyAgICAgICAgICAgIGludCBmcmFtZTsKKyAgICAgICAgICAgIGRvdWJsZSBmcHM7CisgICAgICAgICAgICBjaGFyIGM7CisKKyAgICAgICAgICAgIGlmICgoc3NjYW5mKGxpbmUsICJ7JWR9e30lNmxmIiwgICAgJmZyYW1lLCAmZnBzKSA9PSAyIHx8CisgICAgICAgICAgICAgICAgIHNzY2FuZihsaW5lLCAieyVkfXslKmR9JTZsZiIsICZmcmFtZSwgJmZwcykgPT0gMikKKyAgICAgICAgICAgICAgICAmJiBmcmFtZSA8PSAxICYmIGZwcyA+IDMgJiYgZnBzIDwgMTAwKSB7CisgICAgICAgICAgICAgICAgcHRzX2luZm8gPSBhdl9kMnEoZnBzLCAxMDAwMDApOworICAgICAgICAgICAgICAgIGhhc19yZWFsX2ZwcyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhICYmIHNzY2FuZihsaW5lLCAie0RFRkFVTFR9e30lYyIsICZjKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgPSBhdl9zdHJkdXAobGluZSArIDExKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBzdHJsZW4oc3QtPmNvZGVjLT5leHRyYWRhdGEpICsgMTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2RlZmluZSBTS0lQX0ZSQU1FX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAgPSBzdHJjaHIocCwgJ30nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIGV2ZW50IFwiJXNcIiIgICAgXAorICAgICAgICAgICAgICAgIiBhdCBsaW5lICVkXG4iLCBsaW5lLCBpKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHArKworICAgICAgICBTS0lQX0ZSQU1FX0lEOworICAgICAgICBTS0lQX0ZSQU1FX0lEOworICAgICAgICBpZiAoISpwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHN1YiA9IGZmX3N1YnRpdGxlc19xdWV1ZV9pbnNlcnQoJm1pY3JvZHZkLT5xLCBwLCBzdHJsZW4ocCksIDApOworICAgICAgICBpZiAoIXN1YikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHN1Yi0+cG9zID0gcG9zOworICAgICAgICBzdWItPnB0cyA9IGdldF9wdHMobGluZSk7CisgICAgICAgIHN1Yi0+ZHVyYXRpb24gPSBnZXRfZHVyYXRpb24obGluZSk7CisgICAgfQorICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9maW5hbGl6ZSgmbWljcm9kdmQtPnEpOworICAgIGlmIChoYXNfcmVhbF9mcHMpIHsKKyAgICAgICAgLyogZXhwb3J0IHRoZSBGUFMgaW5mbyBvbmx5IGlmIHNldCBpbiB0aGUgZmlsZSAqLworICAgICAgICBtaWNyb2R2ZC0+ZnJhbWVfcmF0ZSA9IHB0c19pbmZvOworICAgIH0gZWxzZSBpZiAobWljcm9kdmQtPmZyYW1lX3JhdGUubnVtKSB7CisgICAgICAgIC8qIGZhbGxiYWNrIG9uIHVzZXIgc3BlY2lmaWVkIGZyYW1lIHJhdGUgKi8KKyAgICAgICAgcHRzX2luZm8gPSBtaWNyb2R2ZC0+ZnJhbWVfcmF0ZTsKKyAgICB9CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHB0c19pbmZvLmRlbiwgcHRzX2luZm8ubnVtKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTUlDUk9EVkQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWljcm9kdmRfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE1pY3JvRFZEQ29udGV4dCAqbWljcm9kdmQgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3N1YnRpdGxlc19xdWV1ZV9yZWFkX3BhY2tldCgmbWljcm9kdmQtPnEsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgbWljcm9kdmRfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtaW5fdHMsIGludDY0X3QgdHMsIGludDY0X3QgbWF4X3RzLCBpbnQgZmxhZ3MpCit7CisgICAgTWljcm9EVkRDb250ZXh0ICptaWNyb2R2ZCA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJm1pY3JvZHZkLT5xLCBzLCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl90cywgdHMsIG1heF90cywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG1pY3JvZHZkX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1pY3JvRFZEQ29udGV4dCAqbWljcm9kdmQgPSBzLT5wcml2X2RhdGE7CisgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2NsZWFuKCZtaWNyb2R2ZC0+cSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTWljcm9EVkRDb250ZXh0LCB4KQorI2RlZmluZSBTRCBBVl9PUFRfRkxBR19TVUJUSVRMRV9QQVJBTXxBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG1pY3JvZHZkX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzdWJmcHMiLCAic2V0IHRoZSBtb3ZpZSBmcmFtZSByYXRlIGZhbGxiYWNrIiwgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9SQVRJT05BTCwgey5kYmw9MH0sIDAsIElOVF9NQVgsIFNEIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG1pY3JvZHZkX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIm1pY3JvZHZkZGVjIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gbWljcm9kdmRfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfbWljcm9kdmRfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibWljcm9kdmQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNaWNyb0RWRCBzdWJ0aXRsZSBmb3JtYXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTWljcm9EVkRDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBtaWNyb2R2ZF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBtaWNyb2R2ZF9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBtaWNyb2R2ZF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrMiAgICAgPSBtaWNyb2R2ZF9yZWFkX3NlZWssCisgICAgLnJlYWRfY2xvc2UgICAgID0gbWljcm9kdmRfcmVhZF9jbG9zZSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmbWljcm9kdmRfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L21pY3JvZHZkZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbWljcm9kdmRlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDg0Mzg0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21pY3JvZHZkZW5jLmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIE1pY3JvRFZEIHN1YnRpdGxlIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IG1pY3JvZHZkX3dyaXRlX2hlYWRlcihzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWUmF0aW9uYWwgdGIgPSBhdmN0eC0+dGltZV9iYXNlOworCisgICAgaWYgKHMtPm5iX3N0cmVhbXMgIT0gMSB8fCBhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTUlDUk9EVkQpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkV4YWN0bHkgb25lIE1pY3JvRFZEIHN0cmVhbSBpcyBuZWVkZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhICYmIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+IDApIHsKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgIntERUZBVUxUfXt9IiwgMTEpOworICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKyAgICB9CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHMtPnN0cmVhbXNbMF0sIDY0LCB0Yi5udW0sIHRiLmRlbik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWljcm9kdmRfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZmLCBBVlBhY2tldCAqcGt0KQoreworICAgIGF2aW9fcHJpbnRmKGF2Zi0+cGIsICJ7JSJQUklkNjQifSIsIHBrdC0+cHRzKTsKKyAgICBpZiAocGt0LT5kdXJhdGlvbiA8IDApCisgICAgICAgIGF2aW9fd3JpdGUoYXZmLT5wYiwgInt9IiwgMik7CisgICAgZWxzZQorICAgICAgICBhdmlvX3ByaW50ZihhdmYtPnBiLCAieyUiUFJJZDY0In0iLCBwa3QtPnB0cyArIHBrdC0+ZHVyYXRpb24pOworICAgIGF2aW9fd3JpdGUoYXZmLT5wYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIGF2aW9fd3JpdGUoYXZmLT5wYiwgIlxuIiwgMSk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX21pY3JvZHZkX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtaWNyb2R2ZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1pY3JvRFZEIHN1YnRpdGxlIGZvcm1hdCIpLAorICAgIC5taW1lX3R5cGUgICAgICA9ICJ0ZXh0L3gtbWljcm9kdmQiLAorICAgIC5leHRlbnNpb25zICAgICA9ICJzdWIiLAorICAgIC53cml0ZV9oZWFkZXIgICA9IG1pY3JvZHZkX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBtaWNyb2R2ZF93cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorICAgIC5zdWJ0aXRsZV9jb2RlYyA9IEFWX0NPREVDX0lEX01JQ1JPRFZELAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ta3Z0aW1lc3RhbXBfdjIuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ta3Z0aW1lc3RhbXBfdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE2NjkxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21rdnRpbWVzdGFtcF92Mi5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBleHRyYWN0IHB0cyBhcyB0aW1lY29kZSB2MiwgYXMgZGVmaW5lZCBieSBta3Z0b29sbml4CisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRGF2aWQgQ29ucmFkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqaGVhZGVyID0gIiMgdGltZWNvZGUgZm9ybWF0IHYyXG4iOworICAgIGF2aW9fd3JpdGUocy0+cGIsIGhlYWRlciwgc3RybGVuKGhlYWRlcikpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1swXSwgNjQsIDEsIDEwMDApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBpZiAocGt0LT5zdHJlYW1faW5kZXgpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIk1vcmUgdGhhbiBvbmUgc3RyZWFtIHVuc3VwcG9ydGVkXG4iKTsKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJSIgUFJJZDY0ICJcbiIsIHBrdC0+ZHRzKTsKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBidWYsIHN0cmxlbihidWYpKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfbWt2dGltZXN0YW1wX3YyX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgPSAibWt2dGltZXN0YW1wX3YyIiwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImV4dHJhY3QgcHRzIGFzIHRpbWVjb2RlIHYyIGZvcm1hdCwgYXMgZGVmaW5lZCBieSBta3Z0b29sbml4IiksCisgICAgLmF1ZGlvX2NvZGVjICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLnZpZGVvX2NvZGVjICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgPSB3cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCA9IHdyaXRlX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbWx2ZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbWx2ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiZGIxNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tbHZkZWMuYwpAQCAtMCwwICsxLDQ2MyBAQAorLyoKKyAqIE1hZ2ljIExhbnRlcm4gVmlkZW8gKE1MVikgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDE0IFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTWFnaWMgTGFudGVybiBWaWRlbyAoTUxWKSBkZW11eGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYXRpb25hbC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyaWZmLmgiCisKKyNkZWZpbmUgTUxWX1ZFUlNJT04gInYyLjAiCisKKyNkZWZpbmUgTUxWX1ZJREVPX0NMQVNTX1JBVyAgMQorI2RlZmluZSBNTFZfVklERU9fQ0xBU1NfWVVWICAyCisjZGVmaW5lIE1MVl9WSURFT19DTEFTU19KUEVHIDMKKyNkZWZpbmUgTUxWX1ZJREVPX0NMQVNTX0gyNjQgNAorCisjZGVmaW5lIE1MVl9BVURJT19DTEFTU19XQVYgIDEKKworI2RlZmluZSBNTFZfQ0xBU1NfRkxBR19ERUxUQSAweDQwCisjZGVmaW5lIE1MVl9DTEFTU19GTEFHX0xaTUEgIDB4ODAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWSU9Db250ZXh0ICpwYlsxMDFdOworICAgIGludCBjbGFzc1syXTsKKyAgICBpbnQgc3RyZWFtX2luZGV4OworICAgIHVpbnQ2NF90IHB0czsKK30gTWx2Q29udGV4dDsKKworc3RhdGljIGludCBwcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoQVZfUkwzMihwLT5idWYpID09IE1LVEFHKCdNJywnTCcsJ1YnLCdJJykgJiYKKyAgICAgICAgQVZfUkwzMihwLT5idWYgKyA0KSA+PSA1MiAmJgorICAgICAgICAhbWVtY21wKHAtPmJ1ZiArIDgsIE1MVl9WRVJTSU9OLCA1KSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2ZpbGVfaGVhZGVyKEFWSU9Db250ZXh0ICpwYiwgdWludDY0X3QgZ3VpZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICB1aW50OF90IHZlcnNpb25bOF07CisKKyAgICBhdmlvX3NraXAocGIsIDQpOworICAgIHNpemUgPSBhdmlvX3JsMzIocGIpOworICAgIGlmIChzaXplIDwgNTIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGF2aW9fcmVhZChwYiwgdmVyc2lvbiwgOCk7CisgICAgaWYgKG1lbWNtcCh2ZXJzaW9uLCBNTFZfVkVSU0lPTiwgNSkgfHwgYXZpb19ybDY0KHBiKSAhPSBndWlkKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBhdmlvX3NraXAocGIsIHNpemUgLSAyNCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfc3RyaW5nKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWSU9Db250ZXh0ICpwYiwgY29uc3QgY2hhciAqdGFnLCBpbnQgc2l6ZSkKK3sKKyAgICBjaGFyICogdmFsdWUgPSBhdl9tYWxsb2Moc2l6ZSArIDEpOworICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF2aW9fcmVhZChwYiwgdmFsdWUsIHNpemUpOworICAgIGlmICghdmFsdWVbMF0pIHsKKyAgICAgICAgYXZfZnJlZSh2YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YWx1ZVtzaXplXSA9IDA7CisgICAgYXZfZGljdF9zZXQoJmF2Y3R4LT5tZXRhZGF0YSwgdGFnLCB2YWx1ZSwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworfQorCitzdGF0aWMgdm9pZCByZWFkX3VpbnQ4KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWSU9Db250ZXh0ICpwYiwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICpmbXQpCit7CisgICAgYXZfZGljdF9zZXRfaW50KCZhdmN0eC0+bWV0YWRhdGEsIHRhZywgYXZpb19yOChwYiksIDApOworfQorCitzdGF0aWMgdm9pZCByZWFkX3VpbnQxNihBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVklPQ29udGV4dCAqcGIsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqZm10KQoreworICAgIGF2X2RpY3Rfc2V0X2ludCgmYXZjdHgtPm1ldGFkYXRhLCB0YWcsIGF2aW9fcmwxNihwYiksIDApOworfQorCitzdGF0aWMgdm9pZCByZWFkX3VpbnQzMihBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVklPQ29udGV4dCAqcGIsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqZm10KQoreworICAgIGF2X2RpY3Rfc2V0X2ludCgmYXZjdHgtPm1ldGFkYXRhLCB0YWcsIGF2aW9fcmwzMihwYiksIDApOworfQorCitzdGF0aWMgdm9pZCByZWFkX3VpbnQ2NChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVklPQ29udGV4dCAqcGIsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqZm10KQoreworICAgIGF2X2RpY3Rfc2V0X2ludCgmYXZjdHgtPm1ldGFkYXRhLCB0YWcsIGF2aW9fcmw2NChwYiksIDApOworfQorCitzdGF0aWMgaW50IHNjYW5fZmlsZShBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlN0cmVhbSAqdnN0LCBBVlN0cmVhbSAqYXN0LCBpbnQgZmlsZSkKK3sKKyAgICBNbHZDb250ZXh0ICptbHYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IG1sdi0+cGJbZmlsZV07CisgICAgaW50IHJldDsKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIHVuc2lnbmVkIGludCBzaXplOworICAgICAgICB0eXBlID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGF2aW9fc2tpcChwYiwgOCk7IC8vdGltZXN0YW1wCisgICAgICAgIGlmIChzaXplIDwgMTYpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2l6ZSAtPSAxNjsKKyAgICAgICAgaWYgKHZzdCAmJiB0eXBlID09IE1LVEFHKCdSJywnQScsJ1cnLCdJJykgJiYgc2l6ZSA+PSAxNjQpIHsKKyAgICAgICAgICAgIHZzdC0+Y29kZWMtPndpZHRoICA9IGF2aW9fcmwxNihwYik7CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgaWYgKGF2aW9fcmwzMihwYikgIT0gMSkKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJyYXcgYXBpIHZlcnNpb24iKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMjApOyAvLyBwb2ludGVyLCB3aWR0aCwgaGVpZ2h0LCBwaXRjaCwgZnJhbWVfc2l6ZQorICAgICAgICAgICAgdnN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgOCArIDE2ICsgMjQpOyAvLyBibGFja19sZXZlbCwgd2hpdGVfbGV2ZWwsIHh5d2gsIGFjdGl2ZV9hcmVhLCBleHBvc3VyZV9iaWFzCisgICAgICAgICAgICBpZiAoYXZpb19ybDMyKHBiKSAhPSAweDIwMTAxMDApIC8qIFJHR0IgKi8KKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJjZmFfcGF0dGVybiIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCA4MCk7IC8vIGNhbGlicmF0aW9uX2lsbHVtaW5hbnQxLCBjb2xvcl9tYXRyaXgxLCBkeW5hbWljX3JhbmdlCisgICAgICAgICAgICB2c3QtPmNvZGVjLT5waXhfZm10ICA9IEFWX1BJWF9GTVRfQkFZRVJfUkdHQjE2TEU7CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcgPSBNS1RBRygnQicsICdJJywgJ1QnLCAxNik7CisgICAgICAgICAgICBzaXplIC09IDE2NDsKKyAgICAgICAgfSBlbHNlIGlmIChhc3QgJiYgdHlwZSA9PSBNS1RBRygnVycsICdBJywgJ1YnLCAnSScpICYmIHNpemUgPj0gMTYpIHsKKyAgICAgICAgICAgIHJldCA9IGZmX2dldF93YXZfaGVhZGVyKHBiLCBhc3QtPmNvZGVjLCAxNik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgc2l6ZSAtPSAxNjsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE1LVEFHKCdJJywnTicsJ0YnLCdPJykpIHsKKyAgICAgICAgICAgIGlmIChzaXplID4gMCkKKyAgICAgICAgICAgICAgICByZWFkX3N0cmluZyhhdmN0eCwgcGIsICJpbmZvIiwgc2l6ZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE1LVEFHKCdJJywnRCcsJ04nLCdUJykgJiYgc2l6ZSA+PSAzNikgeworICAgICAgICAgICAgcmVhZF9zdHJpbmcoYXZjdHgsIHBiLCAiY2FtZXJhTmFtZSIsIDMyKTsKKyAgICAgICAgICAgIHJlYWRfdWludDMyKGF2Y3R4LCBwYiwgImNhbWVyYU1vZGVsIiwgIjB4JSJQUkl4MzIpOworICAgICAgICAgICAgc2l6ZSAtPSAzNjsKKyAgICAgICAgICAgIGlmIChzaXplID49IDMyKSB7CisgICAgICAgICAgICAgICAgcmVhZF9zdHJpbmcoYXZjdHgsIHBiLCAiY2FtZXJhU2VyaWFsIiwgMzIpOworICAgICAgICAgICAgICAgIHNpemUgLT0gMzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBNS1RBRygnTCcsJ0UnLCdOJywnUycpICYmIHNpemUgPj0gNDgpIHsKKyAgICAgICAgICAgIHJlYWRfdWludDE2KGF2Y3R4LCBwYiwgImZvY2FsTGVuZ3RoIiwgIiVpIik7CisgICAgICAgICAgICByZWFkX3VpbnQxNihhdmN0eCwgcGIsICJmb2NhbERpc3QiLCAiJWkiKTsKKyAgICAgICAgICAgIHJlYWRfdWludDE2KGF2Y3R4LCBwYiwgImFwZXJ0dXJlIiwgIiVpIik7CisgICAgICAgICAgICByZWFkX3VpbnQ4KGF2Y3R4LCBwYiwgInN0YWJpbGl6ZXJNb2RlIiwgIiVpIik7CisgICAgICAgICAgICByZWFkX3VpbnQ4KGF2Y3R4LCBwYiwgImF1dG9mb2N1c01vZGUiLCAiJWkiKTsKKyAgICAgICAgICAgIHJlYWRfdWludDMyKGF2Y3R4LCBwYiwgImZsYWdzIiwgIjB4JSJQUkl4MzIpOworICAgICAgICAgICAgcmVhZF91aW50MzIoYXZjdHgsIHBiLCAibGVuc0lEIiwgIiUiUFJJaTMyKTsKKyAgICAgICAgICAgIHJlYWRfc3RyaW5nKGF2Y3R4LCBwYiwgImxlbnNOYW1lIiwgMzIpOworICAgICAgICAgICAgc2l6ZSAtPSA0ODsKKyAgICAgICAgICAgIGlmIChzaXplID49IDMyKSB7CisgICAgICAgICAgICAgICAgcmVhZF9zdHJpbmcoYXZjdHgsIHBiLCAibGVuc1NlcmlhbCIsIDMyKTsKKyAgICAgICAgICAgICAgICBzaXplIC09IDMyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHZzdCAmJiB0eXBlID09IE1LVEFHKCdWJywgJ0knLCAnRCcsICdGJykgJiYgc2l6ZSA+PSA0KSB7CisgICAgICAgICAgICB1aW50NjRfdCBwdHMgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgZmZfYWRkX2luZGV4X2VudHJ5KCZ2c3QtPmluZGV4X2VudHJpZXMsICZ2c3QtPm5iX2luZGV4X2VudHJpZXMsICZ2c3QtPmluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpb190ZWxsKHBiKSAtIDIwLCBwdHMsIGZpbGUsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOworICAgICAgICAgICAgc2l6ZSAtPSA0OworICAgICAgICB9IGVsc2UgaWYgKGFzdCAmJiB0eXBlID09IE1LVEFHKCdBJywgJ1UnLCAnRCcsICdGJykgJiYgc2l6ZSA+PSA0KSB7CisgICAgICAgICAgICB1aW50NjRfdCBwdHMgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgZmZfYWRkX2luZGV4X2VudHJ5KCZhc3QtPmluZGV4X2VudHJpZXMsICZhc3QtPm5iX2luZGV4X2VudHJpZXMsICZhc3QtPmluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpb190ZWxsKHBiKSAtIDIwLCBwdHMsIGZpbGUsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOworICAgICAgICAgICAgc2l6ZSAtPSA0OworICAgICAgICB9IGVsc2UgaWYgKHZzdCAmJiB0eXBlID09IE1LVEFHKCdXJywnQicsJ0EnLCdMJykgJiYgc2l6ZSA+PSAyOCkgeworICAgICAgICAgICAgcmVhZF91aW50MzIoYXZjdHgsIHBiLCAid2JfbW9kZSIsICIlIlBSSWkzMik7CisgICAgICAgICAgICByZWFkX3VpbnQzMihhdmN0eCwgcGIsICJrZWx2aW4iLCAiJSJQUklpMzIpOworICAgICAgICAgICAgcmVhZF91aW50MzIoYXZjdHgsIHBiLCAid2JnYWluX3IiLCAiJSJQUklpMzIpOworICAgICAgICAgICAgcmVhZF91aW50MzIoYXZjdHgsIHBiLCAid2JnYWluX2ciLCAiJSJQUklpMzIpOworICAgICAgICAgICAgcmVhZF91aW50MzIoYXZjdHgsIHBiLCAid2JnYWluX2IiLCAiJSJQUklpMzIpOworICAgICAgICAgICAgcmVhZF91aW50MzIoYXZjdHgsIHBiLCAid2JzX2dtIiwgIiUiUFJJaTMyKTsKKyAgICAgICAgICAgIHJlYWRfdWludDMyKGF2Y3R4LCBwYiwgIndic19iYSIsICIlIlBSSWkzMik7CisgICAgICAgICAgICBzaXplIC09IDI4OworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTUtUQUcoJ1InLCdUJywnQycsJ0knKSAmJiBzaXplID49IDIwKSB7CisgICAgICAgICAgICBjaGFyIHN0clszMl07CisgICAgICAgICAgICBzdHJ1Y3QgdG0gdGltZSA9IHsgMCB9OworICAgICAgICAgICAgdGltZS50bV9zZWMgICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgdGltZS50bV9taW4gICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgdGltZS50bV9ob3VyICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgdGltZS50bV9tZGF5ICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgdGltZS50bV9tb24gICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgdGltZS50bV95ZWFyICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgdGltZS50bV93ZGF5ICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgdGltZS50bV95ZGF5ICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgdGltZS50bV9pc2RzdCAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCAyKTsKKyAgICAgICAgICAgIGlmIChzdHJmdGltZShzdHIsIHNpemVvZihzdHIpLCAiJVktJW0tJWQgJUg6JU06JVMiLCAmdGltZSkpCisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJmF2Y3R4LT5tZXRhZGF0YSwgInRpbWUiLCBzdHIsIDApOworICAgICAgICAgICAgc2l6ZSAtPSAyMDsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE1LVEFHKCdFJywnWCcsJ1AnLCdPJykgJiYgc2l6ZSA+PSAxNikgeworICAgICAgICAgICAgYXZfZGljdF9zZXQoJmF2Y3R4LT5tZXRhZGF0YSwgImlzb01vZGUiLCBhdmlvX3JsMzIocGIpID8gImF1dG8iIDogIm1hbnVhbCIsIDApOworICAgICAgICAgICAgcmVhZF91aW50MzIoYXZjdHgsIHBiLCAiaXNvVmFsdWUiLCAiJSJQUklpMzIpOworICAgICAgICAgICAgcmVhZF91aW50MzIoYXZjdHgsIHBiLCAiaXNvQW5hbG9nIiwgIiUiUFJJaTMyKTsKKyAgICAgICAgICAgIHJlYWRfdWludDMyKGF2Y3R4LCBwYiwgImRpZ2l0YWxHYWluIiwgIiUiUFJJaTMyKTsKKyAgICAgICAgICAgIHNpemUgLT0gMTY7CisgICAgICAgICAgICBpZiAoc2l6ZSA+PSA4KSB7CisgICAgICAgICAgICAgICAgcmVhZF91aW50NjQoYXZjdHgsIHBiLCAic2h1dHRlclZhbHVlIiwgIiUiUFJJaTY0KTsKKyAgICAgICAgICAgICAgICBzaXplIC09IDg7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBNS1RBRygnUycsJ1QnLCdZJywnTCcpICYmIHNpemUgPj0gMzYpIHsKKyAgICAgICAgICAgIHJlYWRfdWludDMyKGF2Y3R4LCBwYiwgInBpY1N0eWxlSWQiLCAiJSJQUklpMzIpOworICAgICAgICAgICAgcmVhZF91aW50MzIoYXZjdHgsIHBiLCAiY29udHJhc3QiLCAiJSJQUklpMzIpOworICAgICAgICAgICAgcmVhZF91aW50MzIoYXZjdHgsIHBiLCAic2hhcnBuZXNzIiwgIiUiUFJJaTMyKTsKKyAgICAgICAgICAgIHJlYWRfdWludDMyKGF2Y3R4LCBwYiwgInNhdHVyYXRpb24iLCAiJSJQUklpMzIpOworICAgICAgICAgICAgcmVhZF91aW50MzIoYXZjdHgsIHBiLCAiY29sb3J0b25lIiwgIiUiUFJJaTMyKTsKKyAgICAgICAgICAgIHJlYWRfc3RyaW5nKGF2Y3R4LCBwYiwgInBpY1N0eWxlTmFtZSIsIDE2KTsKKyAgICAgICAgICAgIHNpemUgLT0gMzY7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBNS1RBRygnTScsJ0EnLCdSJywnSycpKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBNS1RBRygnTicsJ1UnLCdMJywnTCcpKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBNS1RBRygnTScsJ0wnLCdWJywnSScpKSB7IC8qIG9jY3VycyB3aGVuIE1MViBhbmQgTW5uIGZpbGVzIGFyZSBjb25jYXRlbmF0ZWQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJ1bnN1cHBvcnRlZCB0YWcgJWMlYyVjJWMsIHNpemUgJXVcbiIsIHR5cGUmMHhGRiwgKHR5cGU+PjgpJjB4RkYsICh0eXBlPj4xNikmMHhGRiwgKHR5cGU+PjI0KSYweEZGLCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQoreworICAgIE1sdkNvbnRleHQgKm1sdiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gYXZjdHgtPnBiOworICAgIEFWU3RyZWFtICp2c3QgPSBOVUxMLCAqYXN0ID0gTlVMTDsKKyAgICBpbnQgc2l6ZSwgcmV0OworICAgIHVpbnQ2NF90IGd1aWQ7CisgICAgY2hhciBndWlkc3RyWzMyXTsKKworICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKHNpemUgPCA1MikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdmlvX3NraXAocGIsIDgpOworCisgICAgZ3VpZCA9IGF2aW9fcmw2NChwYik7CisgICAgc25wcmludGYoZ3VpZHN0ciwgc2l6ZW9mKGd1aWRzdHIpLCAiMHglIlBSSXg2NCwgZ3VpZCk7CisgICAgYXZfZGljdF9zZXQoJmF2Y3R4LT5tZXRhZGF0YSwgImd1aWQiLCBndWlkc3RyLCAwKTsKKworICAgIGF2aW9fc2tpcChwYiwgOCk7IC8vZmlsZU51bSwgZmlsZUNvdW50LCBmaWxlRmxhZ3MKKworICAgIG1sdi0+Y2xhc3NbMF0gPSBhdmlvX3JsMTYocGIpOworICAgIGlmIChtbHYtPmNsYXNzWzBdKSB7CisgICAgICAgIHZzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYXZjdHgsIE5VTEwpOworICAgICAgICBpZiAoIXZzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHZzdC0+aWQgPSAwOworICAgICAgICBpZiAoKG1sdi0+Y2xhc3NbMF0gJiAoTUxWX0NMQVNTX0ZMQUdfREVMVEF8TUxWX0NMQVNTX0ZMQUdfTFpNQSkpKQorICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiY29tcHJlc3Npb24iKTsKKyAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3dpdGNoIChtbHYtPmNsYXNzWzBdICYgfihNTFZfQ0xBU1NfRkxBR19ERUxUQXxNTFZfQ0xBU1NfRkxBR19MWk1BKSkgeworICAgICAgICBjYXNlIE1MVl9WSURFT19DTEFTU19SQVc6CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUxWX1ZJREVPX0NMQVNTX1lVVjoKKyAgICAgICAgICAgIHZzdC0+Y29kZWMtPnBpeF9mbXQgID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNTFZfVklERU9fQ0xBU1NfSlBFRzoKKyAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTUpQRUc7CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUxWX1ZJREVPX0NMQVNTX0gyNjQ6CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0gyNjQ7CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJ1bmtub3duIHZpZGVvIGNsYXNzIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtbHYtPmNsYXNzWzFdID0gYXZpb19ybDE2KHBiKTsKKyAgICBpZiAobWx2LT5jbGFzc1sxXSkgeworICAgICAgICBhc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2Y3R4LCBOVUxMKTsKKyAgICAgICAgaWYgKCFhc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhc3QtPmlkID0gMTsKKyAgICAgICAgaWYgKChtbHYtPmNsYXNzWzFdICYgTUxWX0NMQVNTX0ZMQUdfTFpNQSkpCisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJjb21wcmVzc2lvbiIpOworICAgICAgICBpZiAoKG1sdi0+Y2xhc3NbMV0gJiB+TUxWX0NMQVNTX0ZMQUdfTFpNQSkgIT0gTUxWX0FVRElPX0NMQVNTX1dBVikKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInVua25vd24gYXVkaW8gY2xhc3MiKTsKKworICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgMzMsIDEsIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICB9CisKKyAgICBpZiAodnN0KQorICAgICAgIHZzdC0+bmJfZnJhbWVzID0gYXZpb19ybDMyKHBiKTsKKyAgICBlbHNlCisgICAgICAgYXZpb19za2lwKHBiLCA0KTsKKworICAgIGlmIChhc3QpCisgICAgICAgYXN0LT5uYl9mcmFtZXMgPSBhdmlvX3JsMzIocGIpOworICAgIGVsc2UKKyAgICAgICBhdmlvX3NraXAocGIsIDQpOworCisgICAgaWYgKHZzdCkgeworICAgICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOworICAgICAgIGZyYW1lcmF0ZS5udW0gPSBhdmlvX3JsMzIocGIpOworICAgICAgIGZyYW1lcmF0ZS5kZW4gPSBhdmlvX3JsMzIocGIpOworICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgZnJhbWVyYXRlLmRlbiwgZnJhbWVyYXRlLm51bSk7CisgICAgfSBlbHNlCisgICAgICAgYXZpb19za2lwKHBiLCA4KTsKKworICAgIGF2aW9fc2tpcChwYiwgc2l6ZSAtIDUyKTsKKworICAgIC8qIHNjYW4gcHJpbWFyeSBmaWxlICovCisgICAgbWx2LT5wYlsxMDBdID0gYXZjdHgtPnBiOworICAgIHJldCA9IHNjYW5fZmlsZShhdmN0eCwgdnN0LCBhc3QsIDEwMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBzY2FuIHNlY29uZGFyeSBmaWxlcyAqLworICAgIGlmIChzdHJsZW4oYXZjdHgtPmZpbGVuYW1lKSA+IDIpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGNoYXIgKmZpbGVuYW1lID0gYXZfc3RyZHVwKGF2Y3R4LT5maWxlbmFtZSk7CisgICAgICAgIGlmICghZmlsZW5hbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lICsgc3RybGVuKGZpbGVuYW1lKSAtIDIsIDMsICIlMDJkIiwgaSk7CisgICAgICAgICAgICBpZiAoYXZpb19vcGVuMigmbWx2LT5wYltpXSwgZmlsZW5hbWUsIEFWSU9fRkxBR19SRUFELCAmYXZjdHgtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGNoZWNrX2ZpbGVfaGVhZGVyKG1sdi0+cGJbaV0sIGd1aWQpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJpZ25vcmluZyAlczsgYmFkIGZvcm1hdCBvciBndWlkIG1pc21hdGNoXG4iLCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgYXZpb19jbG9zZShtbHYtPnBiW2ldKTsKKyAgICAgICAgICAgICAgICBtbHYtPnBiW2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJzY2FubmluZyAlc1xuIiwgZmlsZW5hbWUpOworICAgICAgICAgICAgcmV0ID0gc2Nhbl9maWxlKGF2Y3R4LCB2c3QsIGFzdCwgaSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJpZ25vcmluZyAlczsgJXNcbiIsIGZpbGVuYW1lLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgICAgIGF2aW9fY2xvc2UobWx2LT5wYltpXSk7CisgICAgICAgICAgICAgICAgbWx2LT5wYltpXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZShmaWxlbmFtZSk7CisgICAgfQorCisgICAgaWYgKHZzdCkKKyAgICAgICAgdnN0LT5kdXJhdGlvbiA9IHZzdC0+bmJfaW5kZXhfZW50cmllczsKKyAgICBpZiAoYXN0KQorICAgICAgICBhc3QtPmR1cmF0aW9uID0gYXN0LT5uYl9pbmRleF9lbnRyaWVzOworCisgICAgaWYgKHZzdCAmJiBhc3QpCisgICAgICAgIGF2aW9fc2VlayhwYiwgRkZNSU4odnN0LT5pbmRleF9lbnRyaWVzWzBdLnBvcywgYXN0LT5pbmRleF9lbnRyaWVzWzBdLnBvcyksIFNFRUtfU0VUKTsKKyAgICBlbHNlIGlmICh2c3QpCisgICAgICAgIGF2aW9fc2VlayhwYiwgdnN0LT5pbmRleF9lbnRyaWVzWzBdLnBvcywgU0VFS19TRVQpOworICAgIGVsc2UgaWYgKGFzdCkKKyAgICAgICAgYXZpb19zZWVrKHBiLCBhc3QtPmluZGV4X2VudHJpZXNbMF0ucG9zLCBTRUVLX1NFVCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIE1sdkNvbnRleHQgKm1sdiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiOworICAgIEFWU3RyZWFtICpzdCA9IGF2Y3R4LT5zdHJlYW1zW21sdi0+c3RyZWFtX2luZGV4XTsKKyAgICBpbnQgaW5kZXgsIHJldDsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgc3BhY2U7CisKKyAgICBpZiAobWx2LT5wdHMgPj0gc3QtPmR1cmF0aW9uKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBpbmRleCA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QsIG1sdi0+cHRzLCBBVlNFRUtfRkxBR19BTlkpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgZmluZCBpbmRleCBlbnRyeSBmb3IgZnJhbWUgJSJQUklkNjQiXG4iLCBtbHYtPnB0cyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgcGIgPSBtbHYtPnBiW3N0LT5pbmRleF9lbnRyaWVzW2luZGV4XS5zaXplXTsKKyAgICBhdmlvX3NlZWsocGIsIHN0LT5pbmRleF9lbnRyaWVzW2luZGV4XS5wb3MsIFNFRUtfU0VUKTsKKworICAgIGF2aW9fc2tpcChwYiwgNCk7IC8vIGJsb2NrVHlwZQorICAgIHNpemUgPSBhdmlvX3JsMzIocGIpOworICAgIGlmIChzaXplIDwgMTYpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGF2aW9fc2tpcChwYiwgMTIpOyAvL3RpbWVzdGFtcCwgZnJhbWVOdW1iZXIKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgYXZpb19za2lwKHBiLCA4KTsgLy8gY3JvcFBvc1gsIGNyb3BQb3NZLCBwYW5Qb3NYLCBwYW5Qb3NZCisgICAgc3BhY2UgPSBhdmlvX3JsMzIocGIpOworICAgIGF2aW9fc2tpcChwYiwgc3BhY2UpOworCisgICAgaWYgKChtbHYtPmNsYXNzW3N0LT5pZF0gJiAoTUxWX0NMQVNTX0ZMQUdfREVMVEF8TUxWX0NMQVNTX0ZMQUdfTFpNQSkpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIChzdC0+Y29kZWMtPndpZHRoICogc3QtPmNvZGVjLT5oZWlnaHQgKiBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSArIDcpID4+IDMpOworICAgIH0gZWxzZSB7IC8vIEFWTUVESUFfVFlQRV9BVURJTworICAgICAgICBpZiAoc3BhY2UgPiBVSU5UX01BWCAtIDI0IHx8IHNpemUgPCAoMjQgKyBzcGFjZSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBzaXplIC0gKDI0ICsgc3BhY2UpKTsKKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gbWx2LT5zdHJlYW1faW5kZXg7CisgICAgcGt0LT5wdHMgPSBtbHYtPnB0czsKKworICAgIG1sdi0+c3RyZWFtX2luZGV4Kys7CisgICAgaWYgKG1sdi0+c3RyZWFtX2luZGV4ID09IGF2Y3R4LT5uYl9zdHJlYW1zKSB7CisgICAgICAgIG1sdi0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICAgICAgbWx2LT5wdHMrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgTWx2Q29udGV4dCAqbWx2ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmICgoZmxhZ3MgJiBBVlNFRUtfRkxBR19GUkFNRSkgfHwgKGZsYWdzICYgQVZTRUVLX0ZMQUdfQllURSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisKKyAgICBpZiAoIWF2Y3R4LT5wYi0+c2Vla2FibGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBtbHYtPnB0cyA9IHRpbWVzdGFtcDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNbHZDb250ZXh0ICptbHYgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICBpZiAobWx2LT5wYltpXSkKKyAgICAgICAgICAgIGF2aW9fY2xvc2UobWx2LT5wYltpXSk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbWx2X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1sdiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1hZ2ljIExhbnRlcm4gVmlkZW8gKE1MVikiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTWx2Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gcmVhZF9jbG9zZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSByZWFkX3NlZWssCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L21tLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzE1ODAyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21tLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBBbWVyaWNhbiBMYXNlciBHYW1lcyBNTSBGb3JtYXQgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA2IFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQW1lcmljYW4gTGFzZXIgR2FtZXMgTU0gRm9ybWF0IERlbXV4ZXIKKyAqIGJ5IFBldGVyIFJvc3MgKHByb3NzQHh2aWQub3JnKQorICoKKyAqIFRoZSBNTSBmb3JtYXQgd2FzIHVzZWQgYnkgSUJNLVBDIHBvcnRzIG9mIEFMRydzICJhcmNhZGUgc2hvb3RlciIgZ2FtZXMsCisgKiBpbmNsdWRpbmcgTWFkIERvZyBNY0NyZWUgYW5kIENyaW1lIFBhdHJvbC4KKyAqCisgKiBUZWNobmljYWwgZGV0YWlscyBoZXJlOgorICogIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPUFtZXJpY2FuX0xhc2VyX0dhbWVzX01NCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTU1fUFJFQU1CTEVfU0laRSAgICA2CisKKyNkZWZpbmUgTU1fVFlQRV9IRUFERVIgICAgICAweDAKKyNkZWZpbmUgTU1fVFlQRV9JTlRFUiAgICAgICAweDUKKyNkZWZpbmUgTU1fVFlQRV9JTlRSQSAgICAgICAweDgKKyNkZWZpbmUgTU1fVFlQRV9JTlRSQV9ISCAgICAweGMKKyNkZWZpbmUgTU1fVFlQRV9JTlRFUl9ISCAgICAweGQKKyNkZWZpbmUgTU1fVFlQRV9JTlRSQV9ISFYgICAweGUKKyNkZWZpbmUgTU1fVFlQRV9JTlRFUl9ISFYgICAweGYKKyNkZWZpbmUgTU1fVFlQRV9BVURJTyAgICAgICAweDE1CisjZGVmaW5lIE1NX1RZUEVfUEFMRVRURSAgICAgMHgzMQorCisjZGVmaW5lIE1NX0hFQURFUl9MRU5fViAgICAgMHgxNiAgICAvKiB2aWRlbyBvbmx5ICovCisjZGVmaW5lIE1NX0hFQURFUl9MRU5fQVYgICAgMHgxOCAgICAvKiB2aWRlbyArIGF1ZGlvICovCisKKyNkZWZpbmUgTU1fUEFMRVRURV9DT1VOVCAgICAxMjgKKyNkZWZpbmUgTU1fUEFMRVRURV9TSVpFICAgICAoTU1fUEFMRVRURV9DT1VOVCozKQorCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBhdWRpb19wdHMsIHZpZGVvX3B0czsKK30gTW1EZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IGxlbiwgdHlwZSwgZnBzLCB3LCBoOworICAgIGlmIChwLT5idWZfc2l6ZSA8IE1NX0hFQURFUl9MRU5fQVYgKyBNTV9QUkVBTUJMRV9TSVpFKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvKiB0aGUgZmlyc3QgY2h1bmsgaXMgYWx3YXlzIHRoZSBoZWFkZXIgKi8KKyAgICBpZiAoQVZfUkwxNigmcC0+YnVmWzBdKSAhPSBNTV9UWVBFX0hFQURFUikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbGVuID0gQVZfUkwzMigmcC0+YnVmWzJdKTsKKyAgICBpZiAobGVuICE9IE1NX0hFQURFUl9MRU5fViAmJiBsZW4gIT0gTU1fSEVBREVSX0xFTl9BVikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZnBzID0gQVZfUkwxNigmcC0+YnVmWzhdKTsKKyAgICB3ID0gQVZfUkwxNigmcC0+YnVmWzEyXSk7CisgICAgaCA9IEFWX1JMMTYoJnAtPmJ1ZlsxNF0pOworICAgIGlmICghZnBzIHx8IGZwcyA+IDYwIHx8ICF3IHx8IHcgPiAyMDQ4IHx8ICFoIHx8IGggPiAyMDQ4KQorICAgICAgICByZXR1cm4gMDsKKyAgICB0eXBlID0gQVZfUkwxNigmcC0+YnVmW2xlbl0pOworICAgIGlmICghdHlwZSB8fCB0eXBlID4gMHgzMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBvbmx5IHJldHVybiBoYWxmIGNlcnRhaW50eSBzaW5jZSB0aGlzIGNoZWNrIGlzIGEgYml0IHNrZXRjaHkgKi8KKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1tRGVtdXhDb250ZXh0ICptbSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICB1bnNpZ25lZCBpbnQgdHlwZSwgbGVuZ3RoOworICAgIHVuc2lnbmVkIGludCBmcmFtZV9yYXRlLCB3aWR0aCwgaGVpZ2h0OworCisgICAgdHlwZSA9IGF2aW9fcmwxNihwYik7CisgICAgbGVuZ3RoID0gYXZpb19ybDMyKHBiKTsKKworICAgIGlmICh0eXBlICE9IE1NX1RZUEVfSEVBREVSKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIHJlYWQgaGVhZGVyICovCisgICAgYXZpb19ybDE2KHBiKTsgICAvKiB0b3RhbCBudW1iZXIgb2YgY2h1bmtzICovCisgICAgZnJhbWVfcmF0ZSA9IGF2aW9fcmwxNihwYik7CisgICAgYXZpb19ybDE2KHBiKTsgICAvKiBpYm0tcGMgdmlkZW8gYmlvcyBtb2RlICovCisgICAgd2lkdGggPSBhdmlvX3JsMTYocGIpOworICAgIGhlaWdodCA9IGF2aW9fcmwxNihwYik7CisgICAgYXZpb19za2lwKHBiLCBsZW5ndGggLSAxMCk7ICAvKiB1bmtub3duIGRhdGEgKi8KKworICAgIC8qIHZpZGVvIHN0cmVhbSAqLworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTU1WSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KKyAgICBzdC0+Y29kZWMtPndpZHRoID0gd2lkdGg7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGZyYW1lX3JhdGUpOworCisgICAgLyogYXVkaW8gc3RyZWFtICovCisgICAgaWYgKGxlbmd0aCA9PSBNTV9IRUFERVJfTEVOX0FWKSB7CisgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAvKiBubyBmb3VyY2MgKi8KKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCA4MDAwKTsgLyogODAwMCBoeiAqLworICAgIH0KKworICAgIG1tLT5hdWRpb19wdHMgPSAwOworICAgIG1tLT52aWRlb19wdHMgPSAwOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgTW1EZW11eENvbnRleHQgKm1tID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVuc2lnbmVkIGNoYXIgcHJlYW1ibGVbTU1fUFJFQU1CTEVfU0laRV07CisgICAgdW5zaWduZWQgaW50IHR5cGUsIGxlbmd0aDsKKworICAgIHdoaWxlKDEpIHsKKworICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBwcmVhbWJsZSwgTU1fUFJFQU1CTEVfU0laRSkgIT0gTU1fUFJFQU1CTEVfU0laRSkgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorCisgICAgICAgIHR5cGUgPSBBVl9STDE2KCZwcmVhbWJsZVswXSk7CisgICAgICAgIGxlbmd0aCA9IEFWX1JMMTYoJnByZWFtYmxlWzJdKTsKKworICAgICAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIE1NX1RZUEVfUEFMRVRURSA6CisgICAgICAgIGNhc2UgTU1fVFlQRV9JTlRFUiA6CisgICAgICAgIGNhc2UgTU1fVFlQRV9JTlRSQSA6CisgICAgICAgIGNhc2UgTU1fVFlQRV9JTlRSQV9ISCA6CisgICAgICAgIGNhc2UgTU1fVFlQRV9JTlRFUl9ISCA6CisgICAgICAgIGNhc2UgTU1fVFlQRV9JTlRSQV9ISFYgOgorICAgICAgICBjYXNlIE1NX1RZUEVfSU5URVJfSEhWIDoKKyAgICAgICAgICAgIC8qIG91dHB1dCBwcmVhbWJsZSArIGRhdGEgKi8KKyAgICAgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgbGVuZ3RoICsgTU1fUFJFQU1CTEVfU0laRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIHByZWFtYmxlLCBNTV9QUkVBTUJMRV9TSVpFKTsKKyAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIHBrdC0+ZGF0YSArIE1NX1BSRUFNQkxFX1NJWkUsIGxlbmd0aCkgIT0gbGVuZ3RoKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBwa3QtPnNpemUgPSBsZW5ndGggKyBNTV9QUkVBTUJMRV9TSVpFOworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgICAgICAgICAgcGt0LT5wdHMgPSBtbS0+dmlkZW9fcHRzOworICAgICAgICAgICAgaWYgKHR5cGUhPU1NX1RZUEVfUEFMRVRURSkKKyAgICAgICAgICAgICAgICBtbS0+dmlkZW9fcHRzKys7CisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIE1NX1RZUEVfQVVESU8gOgorICAgICAgICAgICAgaWYgKGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgbGVuZ3RoKTwwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDE7CisgICAgICAgICAgICBwa3QtPnB0cyA9IG1tLT5hdWRpb19wdHMrKzsKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAidW5rbm93biBjaHVuayB0eXBlIDB4JXhcbiIsIHR5cGUpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBsZW5ndGgpOworICAgICAgICB9CisgICAgfQorfQorCitBVklucHV0Rm9ybWF0IGZmX21tX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1tIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQW1lcmljYW4gTGFzZXIgR2FtZXMgTU0iKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTW1EZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHByb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tbWYuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tbWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTYzMTEyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21tZi5jCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogWWFtYWhhIFNNQUYgZm9ybWF0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVmlkYXIgTWFkc2VuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInBjbS5oIgorI2luY2x1ZGUgInJhd2VuYy5oIgorI2luY2x1ZGUgInJpZmYuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDY0X3QgYXRycG9zLCBhdHNxcG9zLCBhd2Fwb3M7CisgICAgaW50NjRfdCBkYXRhX2VuZDsKKyAgICBpbnQgc3RlcmVvOworfSBNTUZDb250ZXh0OworCitzdGF0aWMgY29uc3QgaW50IG1tZl9yYXRlc1tdID0geyA0MDAwLCA4MDAwLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH07CisKK3N0YXRpYyBpbnQgbW1mX3JhdGUoaW50IGNvZGUpCit7CisgICAgaWYgKChjb2RlIDwgMCkgfHwgKGNvZGUgPiA0KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBtbWZfcmF0ZXNbY29kZV07Cit9CisKKyNpZiBDT05GSUdfTU1GX01VWEVSCitzdGF0aWMgaW50IG1tZl9yYXRlX2NvZGUoaW50IHJhdGUpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgaWYgKG1tZl9yYXRlc1tpXSA9PSByYXRlKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgcmV0dXJuIC0xOworfQorCisvKiBDb3B5IG9mIGVuZF90YWcoKSBmcm9tIGF2aWVuYy5jLCBidXQgZm9yIGJpZy1lbmRpYW4gY2h1bmsgc2l6ZSAqLworc3RhdGljIHZvaWQgZW5kX3RhZ19iZShBVklPQ29udGV4dCAqcGIsIGludDY0X3Qgc3RhcnQpCit7CisgICAgaW50NjRfdCBwb3M7CisKKyAgICBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fc2VlayhwYiwgc3RhcnQgLSA0LCBTRUVLX1NFVCk7CisgICAgYXZpb193YjMyKHBiLCAodWludDMyX3QpKHBvcyAtIHN0YXJ0KSk7CisgICAgYXZpb19zZWVrKHBiLCBwb3MsIFNFRUtfU0VUKTsKK30KKworc3RhdGljIGludCBtbWZfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNTUZDb250ZXh0ICptbWYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50NjRfdCBwb3M7CisgICAgaW50IHJhdGU7CisgICAgY29uc3QgY2hhciAqdmVyc2lvbiA9IHMtPmZsYWdzICYgQVZGTVRfRkxBR19CSVRFWEFDVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICJWTjpMYXZmLCIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAiVk46IkxJQkFWRk9STUFUX0lERU5UIiwiOworCisgICAgcmF0ZSA9IG1tZl9yYXRlX2NvZGUocy0+c3RyZWFtc1swXS0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBpZiAocmF0ZSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICVkLCBzdXBwb3J0ZWQgYXJlIDQwMDAsIDgwMDAsIDExMDI1LCAyMjA1MCBhbmQgNDQxMDBcbiIsCisgICAgICAgICAgICAgICBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG1tZi0+c3RlcmVvID0gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNoYW5uZWxzID4gMTsKKyAgICBpZiAobW1mLT5zdGVyZW8gJiYKKyAgICAgICAgcy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID4gRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIllhbWFoYSBTTUFGIHN0ZXJlbyBpcyBleHBlcmltZW50YWwsICIKKyAgICAgICAgICAgICAgICJhZGQgJy1zdHJpY3QgJWQnIGlmIHlvdSB3YW50IHRvIHVzZSBpdC5cbiIsCisgICAgICAgICAgICAgICBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZmZpb193Zm91cmNjKHBiLCAiTU1NRCIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgcG9zID0gZmZfc3RhcnRfdGFnKHBiLCAiQ05USSIpOworICAgIGF2aW9fdzgocGIsIDApOyAvKiBjbGFzcyAqLworICAgIGF2aW9fdzgocGIsIDEpOyAvKiB0eXBlICovCisgICAgYXZpb193OChwYiwgMSk7IC8qIGNvZGUgdHlwZSAqLworICAgIGF2aW9fdzgocGIsIDApOyAvKiBzdGF0dXMgKi8KKyAgICBhdmlvX3c4KHBiLCAwKTsgLyogY291bnRzICovCisgICAgZW5kX3RhZ19iZShwYiwgcG9zKTsKKworICAgIHBvcyA9IGZmX3N0YXJ0X3RhZyhwYiwgIk9QREEiKTsKKyAgICBhdmlvX3dyaXRlKHBiLCB2ZXJzaW9uLCBzdHJsZW4odmVyc2lvbikpOyAvKiBtZXRhZGF0YSAoIlNUOnNvbmd0aXRsZSxWTjp2ZXJzaW9uLC4uLiIpICovCisgICAgZW5kX3RhZ19iZShwYiwgcG9zKTsKKworICAgIGF2aW9fd3JpdGUocGIsICJBVFJceDAwIiwgNCk7CisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBtbWYtPmF0cnBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193OChwYiwgMCk7IC8qIGZvcm1hdCB0eXBlICovCisgICAgYXZpb193OChwYiwgMCk7IC8qIHNlcXVlbmNlIHR5cGUgKi8KKyAgICBhdmlvX3c4KHBiLCAobW1mLT5zdGVyZW8gPDwgNykgfCAoMSA8PCA0KSB8IHJhdGUpOyAvKiAoY2hhbm5lbCA8PCA3KSB8IChmb3JtYXQgPDwgNCkgfCByYXRlICovCisgICAgYXZpb193OChwYiwgMCk7IC8qIHdhdmUgYmFzZSBiaXQgKi8KKyAgICBhdmlvX3c4KHBiLCAyKTsgLyogdGltZSBiYXNlIGQgKi8KKyAgICBhdmlvX3c4KHBiLCAyKTsgLyogdGltZSBiYXNlIGcgKi8KKworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkF0c3EiKTsKKyAgICBhdmlvX3diMzIocGIsIDE2KTsKKyAgICBtbWYtPmF0c3Fwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIC8qIFdpbGwgYmUgZmlsbGVkIG9uIGNsb3NlICovCisgICAgYXZpb193cml0ZShwYiwgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLCAxNik7CisKKyAgICBtbWYtPmF3YXBvcyA9IGZmX3N0YXJ0X3RhZyhwYiwgIkF3YVx4MDEiKTsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1swXSwgNjQsIDEsIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIHJldHVybiAwOworfQorCisvKiBXcml0ZSBhIHZhcmlhYmxlLWxlbmd0aCBzeW1ib2wgKi8KK3N0YXRpYyB2b2lkIHB1dF92YXJsZW5ndGgoQVZJT0NvbnRleHQgKnBiLCBpbnQgdmFsKQoreworICAgIGlmICh2YWwgPCAxMjgpCisgICAgICAgIGF2aW9fdzgocGIsIHZhbCk7CisgICAgZWxzZSB7CisgICAgICAgIHZhbCAtPSAxMjg7CisgICAgICAgIGF2aW9fdzgocGIsIDB4ODAgfCB2YWwgPj4gNyk7CisgICAgICAgIGF2aW9fdzgocGIsIDB4N2YgJiB2YWwpOworICAgIH0KK30KKworc3RhdGljIGludCBtbWZfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgTU1GQ29udGV4dCAqbW1mID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgcG9zLCBzaXplOworICAgIGludCBnYXRldGltZTsKKworICAgIGlmIChzLT5wYi0+c2Vla2FibGUpIHsKKyAgICAgICAgLyogRmlsbCBpbiBsZW5ndGggZmllbGRzICovCisgICAgICAgIGVuZF90YWdfYmUocGIsIG1tZi0+YXdhcG9zKTsKKyAgICAgICAgZW5kX3RhZ19iZShwYiwgbW1mLT5hdHJwb3MpOworICAgICAgICBlbmRfdGFnX2JlKHBiLCA4KTsKKworICAgICAgICBwb3MgID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgc2l6ZSA9IHBvcyAtIG1tZi0+YXdhcG9zOworCisgICAgICAgIC8qIEZpbGwgQXRzcSBjaHVuayAqLworICAgICAgICBhdmlvX3NlZWsocGIsIG1tZi0+YXRzcXBvcywgU0VFS19TRVQpOworCisgICAgICAgIC8qICJwbGF5IHdhdiIgKi8KKyAgICAgICAgYXZpb193OChwYiwgMCk7IC8qIHN0YXJ0IHRpbWUgKi8KKyAgICAgICAgYXZpb193OChwYiwgKG1tZi0+c3RlcmVvIDw8IDYpIHwgMSk7IC8qIChjaGFubmVsIDw8IDYpIHwgd2F2ZW51bSAqLworICAgICAgICBnYXRldGltZSA9IHNpemUgKiA1MDAgLyBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgICAgIHB1dF92YXJsZW5ndGgocGIsIGdhdGV0aW1lKTsgLyogZHVyYXRpb24gKi8KKworICAgICAgICAvKiAibm9wIiAqLworICAgICAgICBwdXRfdmFybGVuZ3RoKHBiLCBnYXRldGltZSk7IC8qIHN0YXJ0IHRpbWUgKi8KKyAgICAgICAgYXZpb193cml0ZShwYiwgIlx4ZmZceDAwIiwgMik7IC8qIG5vcCAqLworCisgICAgICAgIC8qICJlbmQgb2Ygc2VxdWVuY2UiICovCisgICAgICAgIGF2aW9fd3JpdGUocGIsICJceDAwXHgwMFx4MDBceDAwIiwgNCk7CisKKyAgICAgICAgYXZpb19zZWVrKHBiLCBwb3MsIFNFRUtfU0VUKTsKKworICAgICAgICBhdmlvX2ZsdXNoKHBiKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX01NRl9NVVhFUiAqLworCitzdGF0aWMgaW50IG1tZl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICAvKiBjaGVjayBmaWxlIGhlYWRlciAqLworICAgIGlmIChwLT5idWZbMF0gPT0gJ00nICYmIHAtPmJ1ZlsxXSA9PSAnTScgJiYKKyAgICAgICAgcC0+YnVmWzJdID09ICdNJyAmJiBwLT5idWZbM10gPT0gJ0QnICYmCisgICAgICAgIHAtPmJ1Zls4XSA9PSAnQycgJiYgcC0+YnVmWzldID09ICdOJyAmJgorICAgICAgICBwLT5idWZbMTBdID09ICdUJyAmJiBwLT5idWZbMTFdID09ICdJJykKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIG1tZiBpbnB1dCAqLworc3RhdGljIGludCBtbWZfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1NRkNvbnRleHQgKm1tZiA9IHMtPnByaXZfZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgdGFnOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQ2NF90IHNpemU7CisgICAgaW50IHJhdGUsIHBhcmFtczsKKworICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKHRhZyAhPSBNS1RBRygnTScsICdNJywgJ00nLCAnRCcpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBhdmlvX3NraXAocGIsIDQpOyAvKiBmaWxlX3NpemUgKi8KKworICAgIC8qIFNraXAgc29tZSB1bnVzZWQgY2h1bmtzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudCAqLworICAgIGZvciAoOzsgYXZpb19za2lwKHBiLCBzaXplKSkgeworICAgICAgICB0YWcgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgc2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGlmICh0YWcgPT0gTUtUQUcoJ0MnLCAnTicsICdUJywgJ0knKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAodGFnID09IE1LVEFHKCdPJywgJ1AnLCAnRCcsICdBJykpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogVGFnID0gIkFUUngiLCB3aGVyZSAieCIgPSB0cmFjayBudW1iZXIgKi8KKyAgICBpZiAoKHRhZyAmIDB4ZmZmZmZmKSA9PSBNS1RBRygnTScsICdUJywgJ1InLCAwKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTUlESSBsaWtlIGZvcm1hdCBmb3VuZCwgdW5zdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIGlmICgodGFnICYgMHhmZmZmZmYpICE9IE1LVEFHKCdBJywgJ1QnLCAnUicsIDApKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBTTUFGIGNodW5rICUwOHhcbiIsIHRhZyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBhdmlvX3I4KHBiKTsgLyogZm9ybWF0IHR5cGUgKi8KKyAgICBhdmlvX3I4KHBiKTsgLyogc2VxdWVuY2UgdHlwZSAqLworICAgIHBhcmFtcyA9IGF2aW9fcjgocGIpOyAvKiAoY2hhbm5lbCA8PCA3KSB8IChmb3JtYXQgPDwgNCkgfCByYXRlICovCisgICAgcmF0ZSAgID0gbW1mX3JhdGUocGFyYW1zICYgMHgwZik7CisgICAgaWYgKHJhdGUgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSByYXRlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2aW9fcjgocGIpOyAvKiB3YXZlIGJhc2UgYml0ICovCisgICAgYXZpb19yOChwYik7IC8qIHRpbWUgYmFzZSBkICovCisgICAgYXZpb19yOChwYik7IC8qIHRpbWUgYmFzZSBnICovCisKKyAgICAvKiBTa2lwIHNvbWUgdW51c2VkIGNodW5rcyB0aGF0IG1heSBvciBtYXkgbm90IGJlIHByZXNlbnQgKi8KKyAgICBmb3IgKDs7IGF2aW9fc2tpcChwYiwgc2l6ZSkpIHsKKyAgICAgICAgdGFnICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIHNpemUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBpZiAodGFnID09IE1LVEFHKCdBJywgJ3QnLCAncycsICdxJykpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHRhZyA9PSBNS1RBRygnQScsICdzJywgJ3AnLCAnSScpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSBpdCdzIGZvbGxvd2VkIGJ5IGFuIEF3YSBjaHVuaywgYWthIHdhdmUgZGF0YSAqLworICAgIGlmICgodGFnICYgMHhmZmZmZmYpICE9IE1LVEFHKCdBJywgJ3cnLCAnYScsIDApKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmV4cGVjdGVkIFNNQUYgY2h1bmsgJTA4eFxuIiwgdGFnKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIG1tZi0+ZGF0YV9lbmQgPSBhdmlvX3RlbGwocGIpICsgc2l6ZTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9ZQU1BSEE7CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSByYXRlOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gKHBhcmFtcyA+PiA3KSArIDE7CisgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCAgICAgICAgPSBwYXJhbXMgPj4gNyA/IEFWX0NIX0xBWU9VVF9TVEVSRU8gOiBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDQ7CisgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSAgICAgICAgICAgICAgPSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX1NJWkUgNDA5NgorCitzdGF0aWMgaW50IG1tZl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTU1GQ29udGV4dCAqbW1mID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgbGVmdCwgc2l6ZTsKKyAgICBpbnQgcmV0OworCisgICAgbGVmdCA9IG1tZi0+ZGF0YV9lbmQgLSBhdmlvX3RlbGwocy0+cGIpOworICAgIHNpemUgPSBGRk1JTihsZWZ0LCBNQVhfU0laRSk7CisgICAgaWYgKGF2aW9fZmVvZihzLT5wYikgfHwgc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworCisgICAgcmV0dXJuIHJldDsKK30KKworI2lmIENPTkZJR19NTUZfREVNVVhFUgorQVZJbnB1dEZvcm1hdCBmZl9tbWZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibW1mIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiWWFtYWhhIFNNQUYiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTU1GQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gbW1mX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IG1tZl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBtbWZfcmVhZF9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19NTUZfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX21tZl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibW1mIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiWWFtYWhhIFNNQUYiKSwKKyAgICAubWltZV90eXBlICAgICAgPSAiYXBwbGljYXRpb24vdm5kLnNtYWYiLAorICAgIC5leHRlbnNpb25zICAgICA9ICJtbWYiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNTUZDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9ZQU1BSEEsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgPSBtbWZfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gbW1mX3dyaXRlX3RyYWlsZXIsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbW1zLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2MGIzYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tbXMuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIE1NUyBwcm90b2NvbCBjb21tb24gZGVmaW5pdGlvbnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsMjAwNyBSeWFuIE1hcnRlbGwKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCasO2cm4gQXhlbHNzb24KKyAqIENvcHlyaWdodCAoYykgMjAxMCBaaGVudGFuIEZlbmcgPHNweWZlbmcgYXQgZ21haWwgZG90IGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpbmNsdWRlICJtbXMuaCIKKyNpbmNsdWRlICJhc2YuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKKyNkZWZpbmUgTU1TX01BWF9TVFJFQU1TIDI1NiAgICAvKio8IGFyYml0cmFyeSBzYW5pdHkgY2hlY2sgdmFsdWUgKi8KKworaW50IGZmX21tc19yZWFkX2hlYWRlcihNTVNDb250ZXh0ICptbXMsIHVpbnQ4X3QgKmJ1ZiwgY29uc3QgaW50IHNpemUpCit7CisgICAgY2hhciAqcG9zOworICAgIGludCBzaXplX3RvX2NvcHk7CisgICAgaW50IHJlbWFpbmluZ19zaXplID0gbW1zLT5hc2ZfaGVhZGVyX3NpemUgLSBtbXMtPmFzZl9oZWFkZXJfcmVhZF9zaXplOworICAgIHNpemVfdG9fY29weSA9IEZGTUlOKHNpemUsIHJlbWFpbmluZ19zaXplKTsKKyAgICBwb3MgPSBtbXMtPmFzZl9oZWFkZXIgKyBtbXMtPmFzZl9oZWFkZXJfcmVhZF9zaXplOworICAgIG1lbWNweShidWYsIHBvcywgc2l6ZV90b19jb3B5KTsKKyAgICBpZiAobW1zLT5hc2ZfaGVhZGVyX3JlYWRfc2l6ZSA9PSBtbXMtPmFzZl9oZWFkZXJfc2l6ZSkgeworICAgICAgICBhdl9mcmVlcCgmbW1zLT5hc2ZfaGVhZGVyKTsgLy8gd2hpY2ggY29udGFpbnMgYXNmIGhlYWRlcgorICAgIH0KKyAgICBtbXMtPmFzZl9oZWFkZXJfcmVhZF9zaXplICs9IHNpemVfdG9fY29weTsKKyAgICByZXR1cm4gc2l6ZV90b19jb3B5OworfQorCitpbnQgZmZfbW1zX3JlYWRfZGF0YShNTVNDb250ZXh0ICptbXMsIHVpbnQ4X3QgKmJ1ZiwgY29uc3QgaW50IHNpemUpCit7CisgICAgaW50IHJlYWRfc2l6ZTsKKyAgICByZWFkX3NpemUgPSBGRk1JTihzaXplLCBtbXMtPnJlbWFpbmluZ19pbl9sZW4pOworICAgIG1lbWNweShidWYsIG1tcy0+cmVhZF9pbl9wdHIsIHJlYWRfc2l6ZSk7CisgICAgbW1zLT5yZW1haW5pbmdfaW5fbGVuIC09IHJlYWRfc2l6ZTsKKyAgICBtbXMtPnJlYWRfaW5fcHRyICAgICAgKz0gcmVhZF9zaXplOworICAgIHJldHVybiByZWFkX3NpemU7Cit9CisKK2ludCBmZl9tbXNfYXNmX2hlYWRlcl9wYXJzZXIoTU1TQ29udGV4dCAqbW1zKQoreworICAgIHVpbnQ4X3QgKnAgPSBtbXMtPmFzZl9oZWFkZXI7CisgICAgdWludDhfdCAqZW5kOworICAgIGludCBmbGFncywgc3RyZWFtX2lkOworICAgIG1tcy0+c3RyZWFtX251bSA9IDA7CisKKyAgICBpZiAobW1zLT5hc2ZfaGVhZGVyX3NpemUgPCBzaXplb2YoZmZfYXNmX2d1aWQpICogMiArIDIyIHx8CisgICAgICAgIG1lbWNtcChwLCBmZl9hc2ZfaGVhZGVyLCBzaXplb2YoZmZfYXNmX2d1aWQpKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvcnJ1cHQgc3RyZWFtIChpbnZhbGlkIEFTRiBoZWFkZXIsIHNpemU9JWQpXG4iLAorICAgICAgICAgICAgICAgbW1zLT5hc2ZfaGVhZGVyX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBlbmQgPSBtbXMtPmFzZl9oZWFkZXIgKyBtbXMtPmFzZl9oZWFkZXJfc2l6ZTsKKworICAgIHAgKz0gc2l6ZW9mKGZmX2FzZl9ndWlkKSArIDE0OworICAgIHdoaWxlKGVuZCAtIHAgPj0gc2l6ZW9mKGZmX2FzZl9ndWlkKSArIDgpIHsKKyAgICAgICAgdWludDY0X3QgY2h1bmtzaXplOworICAgICAgICBpZiAoIW1lbWNtcChwLCBmZl9hc2ZfZGF0YV9oZWFkZXIsIHNpemVvZihmZl9hc2ZfZ3VpZCkpKSB7CisgICAgICAgICAgICBjaHVua3NpemUgPSA1MDsgLy8gc2VlIFJlZmVyZW5jZSBbMl0gc2VjdGlvbiA1LjEKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNodW5rc2l6ZSA9IEFWX1JMNjQocCArIHNpemVvZihmZl9hc2ZfZ3VpZCkpOworICAgICAgICB9CisgICAgICAgIGlmICghY2h1bmtzaXplIHx8IGNodW5rc2l6ZSA+IGVuZCAtIHApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNvcnJ1cHQgc3RyZWFtIChoZWFkZXIgY2h1bmtzaXplICUiUFJJZDY0IiBpcyBpbnZhbGlkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBjaHVua3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZW1jbXAocCwgZmZfYXNmX2ZpbGVfaGVhZGVyLCBzaXplb2YoZmZfYXNmX2d1aWQpKSkgeworICAgICAgICAgICAgLyogcmVhZCBwYWNrZXQgc2l6ZSAqLworICAgICAgICAgICAgaWYgKGVuZCAtIHAgPiBzaXplb2YoZmZfYXNmX2d1aWQpICogMiArIDY4KSB7CisgICAgICAgICAgICAgICAgbW1zLT5hc2ZfcGFja2V0X2xlbiA9IEFWX1JMMzIocCArIHNpemVvZihmZl9hc2ZfZ3VpZCkgKiAyICsgNjQpOworICAgICAgICAgICAgICAgIGlmIChtbXMtPmFzZl9wYWNrZXRfbGVuIDw9IDAgfHwgbW1zLT5hc2ZfcGFja2V0X2xlbiA+IHNpemVvZihtbXMtPmluX2J1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3JydXB0IHN0cmVhbSAodG9vIGxhcmdlIHBrdF9sZW4gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1zLT5hc2ZfcGFja2V0X2xlbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghbWVtY21wKHAsIGZmX2FzZl9zdHJlYW1faGVhZGVyLCBzaXplb2YoZmZfYXNmX2d1aWQpKSkgeworICAgICAgICAgICAgZmxhZ3MgICAgID0gQVZfUkwxNihwICsgc2l6ZW9mKGZmX2FzZl9ndWlkKSozICsgMjQpOworICAgICAgICAgICAgc3RyZWFtX2lkID0gZmxhZ3MgJiAweDdGOworICAgICAgICAgICAgLy9UaGUgc2Vjb25kIGNvbmRpdGlvbiBpcyBmb3IgY2hlY2tpbmcgQ1NfUEtUX1NUUkVBTV9JRF9SRVFVRVNUIHBhY2tldCBzaXplLAorICAgICAgICAgICAgLy93ZSBjYW4gY2FsY3VhdGUgdGhlIHBhY2tldCBzaXplIGJ5IHN0cmVhbV9udW0uCisgICAgICAgICAgICAvL1BsZWFzZSBzZWUgZnVuY3Rpb24gc2VuZF9zdHJlYW1fc2VsZWN0aW9uX3JlcXVlc3QoKS4KKyAgICAgICAgICAgIGlmIChtbXMtPnN0cmVhbV9udW0gPCBNTVNfTUFYX1NUUkVBTVMgJiYKKyAgICAgICAgICAgICAgICAgICAgNDYgKyBtbXMtPnN0cmVhbV9udW0gKiA2IDwgc2l6ZW9mKG1tcy0+b3V0X2J1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBtbXMtPnN0cmVhbXMgPSBhdl9mYXN0X3JlYWxsb2MobW1zLT5zdHJlYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW1zLT5uYl9zdHJlYW1zX2FsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1tcy0+c3RyZWFtX251bSArIDEpICogc2l6ZW9mKE1NU1N0cmVhbSkpOworICAgICAgICAgICAgICAgIG1tcy0+c3RyZWFtc1ttbXMtPnN0cmVhbV9udW1dLmlkID0gc3RyZWFtX2lkOworICAgICAgICAgICAgICAgIG1tcy0+c3RyZWFtX251bSsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ29ycnVwdCBzdHJlYW0gKHRvbyBtYW55IEEvViBzdHJlYW1zKVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChwLCBmZl9hc2ZfZXh0X3N0cmVhbV9oZWFkZXIsIHNpemVvZihmZl9hc2ZfZ3VpZCkpKSB7CisgICAgICAgICAgICBpZiAoZW5kIC0gcCA+PSA4OCkgeworICAgICAgICAgICAgICAgIGludCBzdHJlYW1fY291bnQgPSBBVl9STDE2KHAgKyA4NCksIGV4dF9sZW5fY291bnQgPSBBVl9STDE2KHAgKyA4Nik7CisgICAgICAgICAgICAgICAgdWludDY0X3Qgc2tpcF9ieXRlcyA9IDg4OworICAgICAgICAgICAgICAgIHdoaWxlIChzdHJlYW1fY291bnQtLSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW5kIC0gcCA8IHNraXBfYnl0ZXMgKyA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3JydXB0IHN0cmVhbSAobmV4dCBzdHJlYW0gbmFtZSBsZW5ndGggaXMgbm90IGluIHRoZSBidWZmZXIpXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNraXBfYnl0ZXMgKz0gNCArIEFWX1JMMTYocCArIHNraXBfYnl0ZXMgKyAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGV4dF9sZW5fY291bnQtLSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW5kIC0gcCA8IHNraXBfYnl0ZXMgKyAyMikgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ycnVwdCBzdHJlYW0gKG5leHQgZXh0ZW5zaW9uIHN5c3RlbSBpbmZvIGxlbmd0aCBpcyBub3QgaW4gdGhlIGJ1ZmZlcilcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2tpcF9ieXRlcyArPSAyMiArIEFWX1JMMzIocCArIHNraXBfYnl0ZXMgKyAxOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbmQgLSBwIDwgc2tpcF9ieXRlcykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvcnJ1cHQgc3RyZWFtICh0aGUgbGFzdCBleHRlbnNpb24gc3lzdGVtIGluZm8gbGVuZ3RoIGlzIGludmFsaWQpXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaHVua3NpemUgLSBza2lwX2J5dGVzID4gMjQpCisgICAgICAgICAgICAgICAgICAgIGNodW5rc2l6ZSA9IHNraXBfYnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChwLCBmZl9hc2ZfaGVhZDFfZ3VpZCwgc2l6ZW9mKGZmX2FzZl9ndWlkKSkpIHsKKyAgICAgICAgICAgIGNodW5rc2l6ZSA9IDQ2OyAvLyBzZWUgcmVmZXJlbmNlcyBbMl0gc2VjdGlvbiAzLjQuIFRoaXMgc2hvdWxkIGJlIHNldCA0Ni4KKyAgICAgICAgfQorICAgICAgICBwICs9IGNodW5rc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tbXMuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2UzZDdlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21tcy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBNTVMgcHJvdG9jb2wgY29tbW9uIGRlZmluaXRpb25zLgorICogQ29weXJpZ2h0IChjKSAyMDEwIFpoZW50YW4gRmVuZyA8c3B5ZmVuZyBhdCBnbWFpbCBkb3QgY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2lmbmRlZiBBVkZPUk1BVF9NTVNfSAorI2RlZmluZSBBVkZPUk1BVF9NTVNfSAorCisjaW5jbHVkZSAidXJsLmgiCisKK3R5cGVkZWYgc3RydWN0IE1NU1N0cmVhbSB7CisgICAgaW50IGlkOworfU1NU1N0cmVhbTsKKwordHlwZWRlZiBzdHJ1Y3QgTU1TQ29udGV4dCB7CisgICAgVVJMQ29udGV4dCAqbW1zX2hkOyAgICAgICAgICAgICAgICAgIC8vLzwgVENQIGNvbm5lY3Rpb24gaGFuZGxlCisgICAgTU1TU3RyZWFtICpzdHJlYW1zOworCisgICAgLyoqIEJ1ZmZlciBmb3Igb3V0Z29pbmcgcGFja2V0cy4gKi8KKyAgICAvKkB7Ki8KKyAgICB1aW50OF90ICp3cml0ZV9vdXRfcHRyOyAgICAgICAgICAgICAgLy8vPCBQb2ludGVyIGZvciB3cml0aW5nIHRoZSBidWZmZXIuCisgICAgdWludDhfdCBvdXRfYnVmZmVyWzUxMl07ICAgICAgICAgICAgLy8vPCBCdWZmZXIgZm9yIG91dGdvaW5nIHBhY2tldC4KKyAgICAvKkB9Ki8KKworICAgIC8qKiBCdWZmZXIgZm9yIGluY29taW5nIHBhY2tldHMuICovCisgICAgLypAeyovCisgICAgdWludDhfdCBpbl9idWZmZXJbNjU1MzZdOyAgICAgICAgICAgIC8vLzwgQnVmZmVyIGZvciBpbmNvbWluZyBwYWNrZXRzLgorICAgIHVpbnQ4X3QgKnJlYWRfaW5fcHRyOyAgICAgICAgICAgICAgICAvLy88IFBvaW50ZXIgZm9yIHJlYWRpbmcgZnJvbSBpbmNvbWluZyBidWZmZXIuCisgICAgaW50IHJlbWFpbmluZ19pbl9sZW47ICAgICAgICAgICAgICAgIC8vLzwgUmVhZGluZyBsZW5ndGggZnJvbSBpbmNvbWluZyBidWZmZXIuCisgICAgLypAfSovCisKKyAgICAvKiogSW50ZXJuYWwgaGFuZGxpbmcgb2YgdGhlIEFTRiBoZWFkZXIgKi8KKyAgICAvKkB7Ki8KKyAgICB1aW50OF90ICphc2ZfaGVhZGVyOyAgICAgICAgICAgICAgICAgLy8vPCBTdG9yZWQgQVNGIGhlYWRlci4KKyAgICBpbnQgYXNmX2hlYWRlcl9zaXplOyAgICAgICAgICAgICAgICAgLy8vPCBTaXplIG9mIHN0b3JlZCBBU0YgaGVhZGVyLgorICAgIGludCBoZWFkZXJfcGFyc2VkOyAgICAgICAgICAgICAgICAgICAvLy88IFRoZSBoZWFkZXIgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHBhcnNlZC4KKyAgICBpbnQgYXNmX3BhY2tldF9sZW47CisgICAgaW50IGFzZl9oZWFkZXJfcmVhZF9zaXplOworICAgIC8qQH0qLworCisgICAgaW50IHN0cmVhbV9udW07ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc3RyZWFtIG51bWJlcnMuCisgICAgdW5zaWduZWQgaW50IG5iX3N0cmVhbXNfYWxsb2NhdGVkOyAgIC8vLzwgYWxsb2NhdGVkIHNpemUgb2Ygc3RyZWFtcworfSBNTVNDb250ZXh0OworCitpbnQgZmZfbW1zX2FzZl9oZWFkZXJfcGFyc2VyKE1NU0NvbnRleHQgKiBtbXMpOworaW50IGZmX21tc19yZWFkX2RhdGEoTU1TQ29udGV4dCAqbW1zLCB1aW50OF90ICpidWYsIGNvbnN0IGludCBzaXplKTsKK2ludCBmZl9tbXNfcmVhZF9oZWFkZXIoTU1TQ29udGV4dCAqIG1tcywgdWludDhfdCAqIGJ1ZiwgY29uc3QgaW50IHNpemUpOworCisjZW5kaWYgLyogQVZGT1JNQVRfTU1TX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tbXNoLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbW1zaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYzVkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbW1zaC5jCkBAIC0wLDAgKzEsNDEzIEBACisvKgorICogTU1TIHByb3RvY29sIG92ZXIgSFRUUAorICogQ29weXJpZ2h0IChjKSAyMDEwIFpoZW50YW4gRmVuZyA8c3B5ZmVuZyBhdCBnbWFpbCBkb3QgY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogUmVmZXJlbmNlCisgKiBXaW5kb3dzIE1lZGlhIEhUVFAgU3RyZWFtaW5nIFByb3RvY29sLgorICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjMjUxMDU5KFBST1QuMTApLmFzcHgKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1tcy5oIgorI2luY2x1ZGUgImFzZi5oIgorI2luY2x1ZGUgImh0dHAuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKworI2RlZmluZSBDSFVOS19IRUFERVJfTEVOR1RIIDQgICAvLyAyYnl0ZXMgY2h1bmsgdHlwZSBhbmQgMmJ5dGVzIGNodW5rIGxlbmd0aC4KKyNkZWZpbmUgRVhUX0hFQURFUl9MRU5HVEggICA4ICAgLy8gNGJ5dGVzIHNlcXVlbmNlLCAyYnl0ZXMgdXNlbGVzcyBhbmQgMmJ5dGVzIGNodW5rIGxlbmd0aC4KKworLy8gc2VlIFJlZiAyLjIuMS44CisjZGVmaW5lIFVTRVJBR0VOVCAgIlVzZXItQWdlbnQ6IE5TUGxheWVyLzQuMS4wLjM4NTZcclxuIgorLy8gc2VlIFJlZiAyLjIuMS40LjMzCisvLyB0aGUgZ3VpZCB2YWx1ZSBjYW4gYmUgY2hhbmdlZCB0byBhbnkgdmFsaWQgdmFsdWUuCisjZGVmaW5lIENMSUVOVEdVSUQgIlByYWdtYTogeENsaWVudEdVSUQ9e2M3N2U3NDAwLTczOGEtMTFkMi05YWRkLTAwMjBhZjBhMzI3OH1cclxuIgorCisvLyBzZWUgUmVmIDIuMi4zIGZvciBwYWNrZXQgdHlwZSBkZWZpbmU6CisvLyBjaHVuayB0eXBlIGNvbnRhaW5zIDIgZmllbGRzOiBGcmFtZSBhbmQgUGFja2V0SUQuCisvLyBGcmFtZSBpcyAweDI0IG9yIDB4QTQocmFyZWx5KSwgZGlmZmVyZW50IFBhY2tldElEIGluZGljYXRlcyBkaWZmZXJlbnQgcGFja2V0IHR5cGUuCit0eXBlZGVmIGVudW0geworICAgIENIVU5LX1RZUEVfREFUQSAgICAgICAgICA9IDB4NDQyNCwKKyAgICBDSFVOS19UWVBFX0FTRl9IRUFERVIgICAgPSAweDQ4MjQsCisgICAgQ0hVTktfVFlQRV9FTkQgICAgICAgICAgID0gMHg0NTI0LAorICAgIENIVU5LX1RZUEVfU1RSRUFNX0NIQU5HRSA9IDB4NDMyNCwKK30gQ2h1bmtUeXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTU1TQ29udGV4dCBtbXM7CisgICAgdWludDhfdCBsb2NhdGlvblsxMDI0XTsKKyAgICBpbnQgcmVxdWVzdF9zZXE7ICAvLy88IHJlcXVlc3QgcGFja2V0IHNlcXVlbmNlCisgICAgaW50IGNodW5rX3NlcTsgICAgLy8vPCBkYXRhIHBhY2tldCBzZXF1ZW5jZQorfSBNTVNIQ29udGV4dDsKKworc3RhdGljIGludCBtbXNoX2Nsb3NlKFVSTENvbnRleHQgKmgpCit7CisgICAgTU1TSENvbnRleHQgKm1tc2ggPSAoTU1TSENvbnRleHQgKiloLT5wcml2X2RhdGE7CisgICAgTU1TQ29udGV4dCAqbW1zICAgPSAmbW1zaC0+bW1zOworICAgIGlmIChtbXMtPm1tc19oZCkKKyAgICAgICAgZmZ1cmxfY2xvc2VwKCZtbXMtPm1tc19oZCk7CisgICAgYXZfZnJlZXAoJm1tcy0+c3RyZWFtcyk7CisgICAgYXZfZnJlZXAoJm1tcy0+YXNmX2hlYWRlcik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBDaHVua1R5cGUgZ2V0X2NodW5rX2hlYWRlcihNTVNIQ29udGV4dCAqbW1zaCwgaW50ICpsZW4pCit7CisgICAgTU1TQ29udGV4dCAqbW1zID0gJm1tc2gtPm1tczsKKyAgICB1aW50OF90IGNodW5rX2hlYWRlcltDSFVOS19IRUFERVJfTEVOR1RIXTsKKyAgICB1aW50OF90IGV4dF9oZWFkZXJbRVhUX0hFQURFUl9MRU5HVEhdOworICAgIENodW5rVHlwZSBjaHVua190eXBlOworICAgIGludCBjaHVua19sZW4sIHJlcywgZXh0X2hlYWRlcl9sZW47CisKKyAgICByZXMgPSBmZnVybF9yZWFkX2NvbXBsZXRlKG1tcy0+bW1zX2hkLCBjaHVua19oZWFkZXIsIENIVU5LX0hFQURFUl9MRU5HVEgpOworICAgIGlmIChyZXMgIT0gQ0hVTktfSEVBREVSX0xFTkdUSCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiUmVhZCBkYXRhIHBhY2tldCBoZWFkZXIgZmFpbGVkIVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIGNodW5rX3R5cGUgPSBBVl9STDE2KGNodW5rX2hlYWRlcik7CisgICAgY2h1bmtfbGVuICA9IEFWX1JMMTYoY2h1bmtfaGVhZGVyICsgMik7CisKKyAgICBzd2l0Y2ggKGNodW5rX3R5cGUpIHsKKyAgICBjYXNlIENIVU5LX1RZUEVfRU5EOgorICAgIGNhc2UgQ0hVTktfVFlQRV9TVFJFQU1fQ0hBTkdFOgorICAgICAgICBleHRfaGVhZGVyX2xlbiA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hVTktfVFlQRV9BU0ZfSEVBREVSOgorICAgIGNhc2UgQ0hVTktfVFlQRV9EQVRBOgorICAgICAgICBleHRfaGVhZGVyX2xlbiA9IDg7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJTdHJhbmdlIGNodW5rIHR5cGUgJWRcbiIsIGNodW5rX3R5cGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXMgPSBmZnVybF9yZWFkX2NvbXBsZXRlKG1tcy0+bW1zX2hkLCBleHRfaGVhZGVyLCBleHRfaGVhZGVyX2xlbik7CisgICAgaWYgKHJlcyAhPSBleHRfaGVhZGVyX2xlbikgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiUmVhZCBleHQgaGVhZGVyIGZhaWxlZCFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICAqbGVuID0gY2h1bmtfbGVuIC0gZXh0X2hlYWRlcl9sZW47CisgICAgaWYgKGNodW5rX3R5cGUgPT0gQ0hVTktfVFlQRV9FTkQgfHwgY2h1bmtfdHlwZSA9PSBDSFVOS19UWVBFX0RBVEEpCisgICAgICAgIG1tc2gtPmNodW5rX3NlcSA9IEFWX1JMMzIoZXh0X2hlYWRlcik7CisgICAgcmV0dXJuIGNodW5rX3R5cGU7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9kYXRhX3BhY2tldChNTVNIQ29udGV4dCAqbW1zaCwgY29uc3QgaW50IGxlbikKK3sKKyAgICBNTVNDb250ZXh0ICptbXMgICA9ICZtbXNoLT5tbXM7CisgICAgaW50IHJlczsKKyAgICBpZiAobGVuID4gc2l6ZW9mKG1tcy0+aW5fYnVmZmVyKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkRhdGEgcGFja2V0IGxlbmd0aCAlZCBleGNlZWRzIHRoZSBpbl9idWZmZXIgc2l6ZSAlIlNJWkVfU1BFQ0lGSUVSIlxuIiwKKyAgICAgICAgICAgICAgIGxlbiwgc2l6ZW9mKG1tcy0+aW5fYnVmZmVyKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIHJlcyA9IGZmdXJsX3JlYWRfY29tcGxldGUobW1zLT5tbXNfaGQsIG1tcy0+aW5fYnVmZmVyLCBsZW4pOworICAgIGF2X2Rsb2coTlVMTCwgIkRhdGEgcGFja2V0IGxlbiA9ICVkXG4iLCBsZW4pOworICAgIGlmIChyZXMgIT0gbGVuKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJSZWFkIGRhdGEgcGFja2V0IGZhaWxlZCFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBpZiAobGVuID4gbW1zLT5hc2ZfcGFja2V0X2xlbikgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNodW5rIGxlbmd0aCAlZCBleGNlZWQgcGFja2V0IGxlbmd0aCAlZFxuIixsZW4sIG1tcy0+YXNmX3BhY2tldF9sZW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1zZXQobW1zLT5pbl9idWZmZXIgKyBsZW4sIDAsIG1tcy0+YXNmX3BhY2tldF9sZW4gLSBsZW4pOyAvLyBwYWRkaW5nCisgICAgfQorICAgIG1tcy0+cmVhZF9pbl9wdHIgICAgICA9IG1tcy0+aW5fYnVmZmVyOworICAgIG1tcy0+cmVtYWluaW5nX2luX2xlbiA9IG1tcy0+YXNmX3BhY2tldF9sZW47CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2h0dHBfaGVhZGVyX2RhdGEoTU1TSENvbnRleHQgKm1tc2gpCit7CisgICAgTU1TQ29udGV4dCAqbW1zID0gJm1tc2gtPm1tczsKKyAgICBpbnQgcmVzLCBsZW47CisgICAgQ2h1bmtUeXBlIGNodW5rX3R5cGU7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxlbiA9IDA7CisgICAgICAgIHJlcyA9IGNodW5rX3R5cGUgPSBnZXRfY2h1bmtfaGVhZGVyKG1tc2gsICZsZW4pOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlID09IENIVU5LX1RZUEVfQVNGX0hFQURFUil7CisgICAgICAgICAgICAvLyBnZXQgYXNmIGhlYWRlciBhbmQgc3RvcmVkIGl0CisgICAgICAgICAgICBpZiAoIW1tcy0+aGVhZGVyX3BhcnNlZCkgeworICAgICAgICAgICAgICAgIGlmIChtbXMtPmFzZl9oZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiAhPSBtbXMtPmFzZl9oZWFkZXJfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbW1zLT5hc2ZfaGVhZGVyX3NpemUgPSBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJIZWFkZXIgbGVuIGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1zLT5hc2ZfaGVhZGVyX3NpemUsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmbW1zLT5hc2ZfaGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtbXMtPmFzZl9oZWFkZXIgPSBhdl9tYWxsb2N6KGxlbik7CisgICAgICAgICAgICAgICAgaWYgKCFtbXMtPmFzZl9oZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbW1zLT5hc2ZfaGVhZGVyX3NpemUgPSBsZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVuID4gbW1zLT5hc2ZfaGVhZGVyX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQXNmIGhlYWRlciBwYWNrZXQgbGVuID0gJWQgZXhjZWVkIHRoZSBhc2YgaGVhZGVyIGJ1ZiBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBsZW4sIG1tcy0+YXNmX2hlYWRlcl9zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gZmZ1cmxfcmVhZF9jb21wbGV0ZShtbXMtPm1tc19oZCwgbW1zLT5hc2ZfaGVhZGVyLCBsZW4pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBsZW4pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiUmVjdiBhc2YgaGVhZGVyIGRhdGEgbGVuICVkICE9IGV4cGVjdGVkIGxlbiAlZFxuIiwgcmVzLCBsZW4pOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtbXMtPmFzZl9oZWFkZXJfc2l6ZSA9IGxlbjsKKyAgICAgICAgICAgIGlmICghbW1zLT5oZWFkZXJfcGFyc2VkKSB7CisgICAgICAgICAgICAgICAgcmVzID0gZmZfbW1zX2FzZl9oZWFkZXJfcGFyc2VyKG1tcyk7CisgICAgICAgICAgICAgICAgbW1zLT5oZWFkZXJfcGFyc2VkID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNodW5rX3R5cGUgPT0gQ0hVTktfVFlQRV9EQVRBKSB7CisgICAgICAgICAgICAvLyByZWFkIGRhdGEgcGFja2V0IGFuZCBkbyBwYWRkaW5nCisgICAgICAgICAgICByZXR1cm4gcmVhZF9kYXRhX3BhY2tldChtbXNoLCBsZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxlbikgeworICAgICAgICAgICAgICAgIGlmIChsZW4gPiBzaXplb2YobW1zLT5pbl9idWZmZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIgcGFja2V0IGxlbiA9ICVkIGV4Y2VlZCB0aGUgaW5fYnVmZmVyIHNpemUgJSJTSVpFX1NQRUNJRklFUiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIHNpemVvZihtbXMtPmluX2J1ZmZlcikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXMgPSBmZnVybF9yZWFkX2NvbXBsZXRlKG1tcy0+bW1zX2hkLCBtbXMtPmluX2J1ZmZlciwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IGxlbikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiUmVhZCBvdGhlciBjaHVuayB0eXBlIGRhdGEgZmFpbGVkIVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiU2tpcCBjaHVuayB0eXBlICVkIFxuIiwgY2h1bmtfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBtbXNoX29wZW5faW50ZXJuYWwoVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqdXJpLCBpbnQgZmxhZ3MsIGludCB0aW1lc3RhbXAsIGludDY0X3QgcG9zKQoreworICAgIGludCBpLCBwb3J0LCBlcnI7CisgICAgY2hhciBodHRwbmFtZVsyNTZdLCBwYXRoWzI1Nl0sIGhvc3RbMTI4XTsKKyAgICBjaGFyICpzdHJlYW1fc2VsZWN0aW9uID0gTlVMTDsKKyAgICBjaGFyIGhlYWRlcnNbMTAyNF07CisgICAgTU1TSENvbnRleHQgKm1tc2ggPSBoLT5wcml2X2RhdGE7CisgICAgTU1TQ29udGV4dCAqbW1zOworCisgICAgbW1zaC0+cmVxdWVzdF9zZXEgPSBoLT5pc19zdHJlYW1lZCA9IDE7CisgICAgbW1zID0gJm1tc2gtPm1tczsKKyAgICBhdl9zdHJsY3B5KG1tc2gtPmxvY2F0aW9uLCB1cmksIHNpemVvZihtbXNoLT5sb2NhdGlvbikpOworCisgICAgYXZfdXJsX3NwbGl0KE5VTEwsIDAsIE5VTEwsIDAsCisgICAgICAgIGhvc3QsIHNpemVvZihob3N0KSwgJnBvcnQsIHBhdGgsIHNpemVvZihwYXRoKSwgbW1zaC0+bG9jYXRpb24pOworICAgIGlmIChwb3J0PDApCisgICAgICAgIHBvcnQgPSA4MDsgLy8gZGVmYXVsdCBtbXNoIHByb3RvY29sIHBvcnQKKyAgICBmZl91cmxfam9pbihodHRwbmFtZSwgc2l6ZW9mKGh0dHBuYW1lKSwgImh0dHAiLCBOVUxMLCBob3N0LCBwb3J0LCAiJXMiLCBwYXRoKTsKKworICAgIGlmIChmZnVybF9hbGxvYygmbW1zLT5tbXNfaGQsIGh0dHBuYW1lLCBBVklPX0ZMQUdfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgJmgtPmludGVycnVwdF9jYWxsYmFjaykgPCAwKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgc25wcmludGYoaGVhZGVycywgc2l6ZW9mKGhlYWRlcnMpLAorICAgICAgICAgICAgICJBY2NlcHQ6ICovKlxyXG4iCisgICAgICAgICAgICAgVVNFUkFHRU5UCisgICAgICAgICAgICAgIkhvc3Q6ICVzOiVkXHJcbiIKKyAgICAgICAgICAgICAiUHJhZ21hOiBuby1jYWNoZSxyYXRlPTEuMDAwMDAwLHN0cmVhbS10aW1lPTAsIgorICAgICAgICAgICAgICJzdHJlYW0tb2Zmc2V0PTA6MCxyZXF1ZXN0LWNvbnRleHQ9JXUsbWF4LWR1cmF0aW9uPTBcclxuIgorICAgICAgICAgICAgIENMSUVOVEdVSUQKKyAgICAgICAgICAgICAiQ29ubmVjdGlvbjogQ2xvc2VcclxuIiwKKyAgICAgICAgICAgICBob3N0LCBwb3J0LCBtbXNoLT5yZXF1ZXN0X3NlcSsrKTsKKyAgICBhdl9vcHRfc2V0KG1tcy0+bW1zX2hkLT5wcml2X2RhdGEsICJoZWFkZXJzIiwgaGVhZGVycywgMCk7CisKKyAgICBlcnIgPSBmZnVybF9jb25uZWN0KG1tcy0+bW1zX2hkLCBOVUxMKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgZXJyID0gZ2V0X2h0dHBfaGVhZGVyX2RhdGEobW1zaCk7CisgICAgaWYgKGVycikgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiR2V0IGh0dHAgaGVhZGVyIGRhdGEgZmFpbGVkIVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvLyBjbG9zZSB0aGUgc29ja2V0IGFuZCB0aGVuIHJlb3BlbiBpdCBmb3Igc2VuZGluZyB0aGUgc2Vjb25kIHBsYXkgcmVxdWVzdC4KKyAgICBmZnVybF9jbG9zZShtbXMtPm1tc19oZCk7CisgICAgbWVtc2V0KGhlYWRlcnMsIDAsIHNpemVvZihoZWFkZXJzKSk7CisgICAgaWYgKChlcnIgPSBmZnVybF9hbGxvYygmbW1zLT5tbXNfaGQsIGh0dHBuYW1lLCBBVklPX0ZMQUdfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2spKSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzdHJlYW1fc2VsZWN0aW9uID0gYXZfbWFsbG9jeihtbXMtPnN0cmVhbV9udW0gKiAxOSArIDEpOworICAgIGlmICghc3RyZWFtX3NlbGVjdGlvbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW1zLT5zdHJlYW1fbnVtOyBpKyspIHsKKyAgICAgICAgY2hhciB0bXBbMjBdOworICAgICAgICBlcnIgPSBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiZmZmZjolZDowICIsIG1tcy0+c3RyZWFtc1tpXS5pZCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBhdl9zdHJsY2F0KHN0cmVhbV9zZWxlY3Rpb24sIHRtcCwgbW1zLT5zdHJlYW1fbnVtICogMTkgKyAxKTsKKyAgICB9CisgICAgLy8gc2VuZCBwbGF5IHJlcXVlc3QKKyAgICBlcnIgPSBzbnByaW50ZihoZWFkZXJzLCBzaXplb2YoaGVhZGVycyksCisgICAgICAgICAgICAgICAgICAgIkFjY2VwdDogKi8qXHJcbiIKKyAgICAgICAgICAgICAgICAgICBVU0VSQUdFTlQKKyAgICAgICAgICAgICAgICAgICAiSG9zdDogJXM6JWRcclxuIgorICAgICAgICAgICAgICAgICAgICJQcmFnbWE6IG5vLWNhY2hlLHJhdGU9MS4wMDAwMDAscmVxdWVzdC1jb250ZXh0PSV1XHJcbiIKKyAgICAgICAgICAgICAgICAgICAiUHJhZ21hOiB4UGxheVN0cm09MVxyXG4iCisgICAgICAgICAgICAgICAgICAgQ0xJRU5UR1VJRAorICAgICAgICAgICAgICAgICAgICJQcmFnbWE6IHN0cmVhbS1zd2l0Y2gtY291bnQ9JWRcclxuIgorICAgICAgICAgICAgICAgICAgICJQcmFnbWE6IHN0cmVhbS1zd2l0Y2gtZW50cnk9JXNcclxuIgorICAgICAgICAgICAgICAgICAgICJQcmFnbWE6IG5vLWNhY2hlLHJhdGU9MS4wMDAwMDAsc3RyZWFtLXRpbWU9JXUiCisgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb246IENsb3NlXHJcbiIsCisgICAgICAgICAgICAgICAgICAgaG9zdCwgcG9ydCwgbW1zaC0+cmVxdWVzdF9zZXErKywgbW1zLT5zdHJlYW1fbnVtLCBzdHJlYW1fc2VsZWN0aW9uLCB0aW1lc3RhbXApOworICAgIGF2X2ZyZWVwKCZzdHJlYW1fc2VsZWN0aW9uKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQnVpbGQgcGxheSByZXF1ZXN0IGZhaWxlZCFcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGF2X2Rsb2coTlVMTCwgIm91dF9idWZmZXIgaXMgJXMiLCBoZWFkZXJzKTsKKyAgICBhdl9vcHRfc2V0KG1tcy0+bW1zX2hkLT5wcml2X2RhdGEsICJoZWFkZXJzIiwgaGVhZGVycywgMCk7CisKKyAgICBlcnIgPSBmZnVybF9jb25uZWN0KG1tcy0+bW1zX2hkLCBOVUxMKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IGdldF9odHRwX2hlYWRlcl9kYXRhKG1tc2gpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkdldCBodHRwIGhlYWRlciBkYXRhIGZhaWxlZCFcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYXZfZGxvZyhOVUxMLCAiQ29ubmVjdGlvbiBzdWNjZXNzZnVsbHkgb3BlblxuIik7CisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGF2X2ZyZWVwKCZzdHJlYW1fc2VsZWN0aW9uKTsKKyAgICBtbXNoX2Nsb3NlKGgpOworICAgIGF2X2Rsb2coTlVMTCwgIkNvbm5lY3Rpb24gZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtbXNoX29wZW4oVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqdXJpLCBpbnQgZmxhZ3MpCit7CisgICAgcmV0dXJuIG1tc2hfb3Blbl9pbnRlcm5hbChoLCB1cmksIGZsYWdzLCAwLCAwKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfY2h1bmtfdHlwZShNTVNIQ29udGV4dCAqbW1zaCkKK3sKKyAgICBNTVNDb250ZXh0ICptbXMgPSAmbW1zaC0+bW1zOworICAgIGludCByZXMsIGxlbiA9IDA7CisgICAgQ2h1bmtUeXBlIGNodW5rX3R5cGU7CisgICAgY2h1bmtfdHlwZSA9IGdldF9jaHVua19oZWFkZXIobW1zaCwgJmxlbik7CisKKyAgICBzd2l0Y2ggKGNodW5rX3R5cGUpIHsKKyAgICBjYXNlIENIVU5LX1RZUEVfRU5EOgorICAgICAgICBtbXNoLT5jaHVua19zZXEgPSAwOworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiU3RyZWFtIGVuZGVkIVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgY2FzZSBDSFVOS19UWVBFX1NUUkVBTV9DSEFOR0U6CisgICAgICAgIG1tcy0+aGVhZGVyX3BhcnNlZCA9IDA7CisgICAgICAgIGlmIChyZXMgPSBnZXRfaHR0cF9oZWFkZXJfZGF0YShtbXNoKSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwiU3RyZWFtIGNoYW5nZWQhIEZhaWxlZCB0byBnZXQgbmV3IGhlYWRlciFcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENIVU5LX1RZUEVfREFUQToKKyAgICAgICAgcmV0dXJuIHJlYWRfZGF0YV9wYWNrZXQobW1zaCwgbGVuKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiUmVjdiBvdGhlciB0eXBlIHBhY2tldCAlZFxuIiwgY2h1bmtfdHlwZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtbXNoX3JlYWQoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgcmVzID0gMDsKKyAgICBNTVNIQ29udGV4dCAqbW1zaCA9IGgtPnByaXZfZGF0YTsKKyAgICBNTVNDb250ZXh0ICptbXMgICA9ICZtbXNoLT5tbXM7CisgICAgZG8geworICAgICAgICBpZiAobW1zLT5hc2ZfaGVhZGVyX3JlYWRfc2l6ZSA8IG1tcy0+YXNmX2hlYWRlcl9zaXplKSB7CisgICAgICAgICAgICAvLyBjb3B5IGFzZiBoZWFkZXIgaW50byBidWZmZXIKKyAgICAgICAgICAgIHJlcyA9IGZmX21tc19yZWFkX2hlYWRlcihtbXMsIGJ1Ziwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1tcy0+cmVtYWluaW5nX2luX2xlbiAmJiAocmVzID0gaGFuZGxlX2NodW5rX3R5cGUobW1zaCkpKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICByZXMgPSBmZl9tbXNfcmVhZF9kYXRhKG1tcywgYnVmLCBzaXplKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKCFyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQ2NF90IG1tc2hfcmVhZF9zZWVrKFVSTENvbnRleHQgKmgsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQoreworICAgIE1NU0hDb250ZXh0ICptbXNoX29sZCA9IGgtPnByaXZfZGF0YTsKKyAgICBNTVNIQ29udGV4dCAqbW1zaCAgICAgPSBhdl9tYWxsb2N6KHNpemVvZigqbW1zaCkpOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIW1tc2gpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBoLT5wcml2X2RhdGEgPSBtbXNoOworICAgIHJldD0gbW1zaF9vcGVuX2ludGVybmFsKGgsIG1tc2hfb2xkLT5sb2NhdGlvbiwgMCwgRkZNQVgodGltZXN0YW1wLCAwKSwgMCk7CisgICAgaWYocmV0Pj0wKXsKKyAgICAgICAgaC0+cHJpdl9kYXRhID0gbW1zaF9vbGQ7CisgICAgICAgIG1tc2hfY2xvc2UoaCk7CisgICAgICAgIGgtPnByaXZfZGF0YSA9IG1tc2g7CisgICAgICAgIGF2X2ZyZWUobW1zaF9vbGQpOworICAgICAgICBtbXNoLT5tbXMuYXNmX2hlYWRlcl9yZWFkX3NpemUgPSBtbXNoLT5tbXMuYXNmX2hlYWRlcl9zaXplOworICAgIH1lbHNlIHsKKyAgICAgICAgaC0+cHJpdl9kYXRhID0gbW1zaF9vbGQ7CisgICAgICAgIGF2X2ZyZWUobW1zaCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludDY0X3QgbW1zaF9zZWVrKFVSTENvbnRleHQgKmgsIGludDY0X3QgcG9zLCBpbnQgd2hlbmNlKQoreworICAgIE1NU0hDb250ZXh0ICptbXNoID0gaC0+cHJpdl9kYXRhOworICAgIE1NU0NvbnRleHQgKm1tcyAgID0gJm1tc2gtPm1tczsKKworICAgIGlmKHBvcyA9PSAwICYmIHdoZW5jZSA9PSBTRUVLX0NVUikKKyAgICAgICAgcmV0dXJuIG1tcy0+YXNmX2hlYWRlcl9yZWFkX3NpemUgKyBtbXMtPnJlbWFpbmluZ19pbl9sZW4gKyBtbXNoLT5jaHVua19zZXEgKiAoaW50NjRfdCltbXMtPmFzZl9wYWNrZXRfbGVuOworICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Cit9CisKK1VSTFByb3RvY29sIGZmX21tc2hfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1tc2giLAorICAgIC51cmxfb3BlbiAgICAgICA9IG1tc2hfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgPSBtbXNoX3JlYWQsCisgICAgLnVybF9zZWVrICAgICAgID0gbW1zaF9zZWVrLAorICAgIC51cmxfY2xvc2UgICAgICA9IG1tc2hfY2xvc2UsCisgICAgLnVybF9yZWFkX3NlZWsgID0gbW1zaF9yZWFkX3NlZWssCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1NU0hDb250ZXh0KSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tbXN0LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbW1zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTExODcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbW1zdC5jCkBAIC0wLDAgKzEsNjM4IEBACisvKgorICogTU1TIHByb3RvY29sIG92ZXIgVENQCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsMjAwNyBSeWFuIE1hcnRlbGwKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCasO2cm4gQXhlbHNzb24KKyAqIENvcHlyaWdodCAoYykgMjAxMCBaaGVudGFuIEZlbmcgPHNweWZlbmcgYXQgZ21haWwgZG90IGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyogUmVmZXJlbmNlcworICogTU1TIHByb3RvY29sIHNwZWNpZmljYXRpb246CisgKiAgWzFdaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjMjM0NzExKFBST1QuMTApLmFzcHgKKyAqIEFTRiBzcGVjaWZpY2F0aW9uLiBSZXZpc2lvbiAwMS4yMC4wMy4KKyAqICBbMl1odHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYmI2NDMzMjMuYXNweAorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgIm1tcy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAidXJsLmgiCisKKyNkZWZpbmUgTE9DQUxfQUREUkVTUyAweGMwYTgwMDgxICAgIC8vIEZJWE1FIGdldCBhbmQgdXNlIGNvcnJlY3QgbG9jYWwgaXAgYWRkcmVzcy4KKyNkZWZpbmUgTE9DQUxfUE9SVCAgICAxMDM3ICAgICAgICAgIC8vIGFzIGFib3ZlLgorLyoqIENsaWVudCB0byBzZXJ2ZXIgcGFja2V0IHR5cGVzLiAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBDU19QS1RfSU5JVElBTCAgICAgICAgICAgICAgICAgID0gMHgwMSwKKyAgICBDU19QS1RfUFJPVE9DT0xfU0VMRUNUICAgICAgICAgID0gMHgwMiwKKyAgICBDU19QS1RfTUVESUFfRklMRV9SRVFVRVNUICAgICAgID0gMHgwNSwKKyAgICBDU19QS1RfU1RBUlRfRlJPTV9QS1RfSUQgICAgICAgID0gMHgwNywKKyAgICBDU19QS1RfU1RSRUFNX1BBVVNFICAgICAgICAgICAgID0gMHgwOSwKKyAgICBDU19QS1RfU1RSRUFNX0NMT1NFICAgICAgICAgICAgID0gMHgwZCwKKyAgICBDU19QS1RfTUVESUFfSEVBREVSX1JFUVVFU1QgICAgID0gMHgxNSwKKyAgICBDU19QS1RfVElNSU5HX0RBVEFfUkVRVUVTVCAgICAgID0gMHgxOCwKKyAgICBDU19QS1RfVVNFUl9QQVNTV09SRCAgICAgICAgICAgID0gMHgxYSwKKyAgICBDU19QS1RfS0VFUEFMSVZFICAgICAgICAgICAgICAgID0gMHgxYiwKKyAgICBDU19QS1RfU1RSRUFNX0lEX1JFUVVFU1QgICAgICAgID0gMHgzMywKK30gTU1TQ1NQYWNrZXRUeXBlOworCisvKiogU2VydmVyIHRvIGNsaWVudCBwYWNrZXQgdHlwZXMuICovCit0eXBlZGVmIGVudW0geworICAgIC8qKiBDb250cm9sIHBhY2tldHMuICovCisgICAgLypAeyovCisgICAgU0NfUEtUX0NMSUVOVF9BQ0NFUFRFRCAgICAgICAgICA9IDB4MDEsCisgICAgU0NfUEtUX1BST1RPQ09MX0FDQ0VQVEVEICAgICAgICA9IDB4MDIsCisgICAgU0NfUEtUX1BST1RPQ09MX0ZBSUxFRCAgICAgICAgICA9IDB4MDMsCisgICAgU0NfUEtUX01FRElBX1BLVF9GT0xMT1dTICAgICAgICA9IDB4MDUsCisgICAgU0NfUEtUX01FRElBX0ZJTEVfREVUQUlMUyAgICAgICA9IDB4MDYsCisgICAgU0NfUEtUX0hFQURFUl9SRVFVRVNUX0FDQ0VQVEVEICA9IDB4MTEsCisgICAgU0NfUEtUX1RJTUlOR19URVNUX1JFUExZICAgICAgICA9IDB4MTUsCisgICAgU0NfUEtUX1BBU1NXT1JEX1JFUVVJUkVEICAgICAgICA9IDB4MWEsCisgICAgU0NfUEtUX0tFRVBBTElWRSAgICAgICAgICAgICAgICA9IDB4MWIsCisgICAgU0NfUEtUX1NUUkVBTV9TVE9QUEVEICAgICAgICAgICA9IDB4MWUsCisgICAgU0NfUEtUX1NUUkVBTV9DSEFOR0lORyAgICAgICAgICA9IDB4MjAsCisgICAgU0NfUEtUX1NUUkVBTV9JRF9BQ0NFUFRFRCAgICAgICA9IDB4MjEsCisgICAgLypAfSovCisKKyAgICAvKiogUHNldWRvIHBhY2tldHMuICovCisgICAgLypAeyovCisgICAgU0NfUEtUX0NBTkNFTCAgICAgICAgICAgICAgICAgICA9IC0xLAorICAgIFNDX1BLVF9OT19EQVRBICAgICAgICAgICAgICAgICAgPSAtMiwKKyAgICAvKkB9Ki8KKworICAgIC8qKiBEYXRhIHBhY2tldHMuICovCisgICAgLypAeyovCisgICAgU0NfUEtUX0FTRl9IRUFERVIgICAgICAgICAgICAgICA9IDB4MDEwMDAwLC8vIG1ha2UgaXQgYmlnZ2VyIHRoYW4gMHhGRiBpbiBjYXNlIG9mCisgICAgU0NfUEtUX0FTRl9NRURJQSAgICAgICAgICAgICAgICA9IDB4MDEwMDAxLC8vIHJlY2VpdmluZyBmYWxzZSBkYXRhIHBhY2tldHMuCisgICAgLypAfSovCit9IE1NU1NDUGFja2V0VHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE1NU0NvbnRleHQgIG1tczsKKyAgICBpbnQgb3V0Z29pbmdfcGFja2V0X3NlcTsgICAgICAgICAgICAgLy8vPCBPdXRnb2luZyBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyLgorICAgIGNoYXIgcGF0aFsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAvLy88IFBhdGggb2YgdGhlIHJlc291cmNlIGJlaW5nIGFza2VkIGZvci4KKyAgICBjaGFyIGhvc3RbMTI4XTsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIb3N0IG9mIHRoZSByZXNvdXJjZXMuCisgICAgaW50IGluY29taW5nX3BhY2tldF9zZXE7ICAgICAgICAgICAgIC8vLzwgSW5jb21pbmcgcGFja2V0IHNlcXVlbmNlIG51bWJlci4KKyAgICBpbnQgaW5jb21pbmdfZmxhZ3M7ICAgICAgICAgICAgICAgICAgLy8vPCBJbmNvbWluZyBwYWNrZXQgZmxhZ3MuCisgICAgaW50IHBhY2tldF9pZDsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSWRlbnRpZmllciBmb3IgcGFja2V0cyBpbiB0aGUgY3VycmVudCBzdHJlYW0uCisgICAgdW5zaWduZWQgaW50IGhlYWRlcl9wYWNrZXRfaWQ7ICAgICAgIC8vLzwgZGVmYXVsdCBpcyAyLgorfSBNTVNUQ29udGV4dDsKKworLyoqIENyZWF0ZSBNTVNUIGNvbW1hbmQgcGFja2V0IGhlYWRlciAqLworc3RhdGljIHZvaWQgc3RhcnRfY29tbWFuZF9wYWNrZXQoTU1TVENvbnRleHQgKm1tc3QsIE1NU0NTUGFja2V0VHlwZSBwYWNrZXRfdHlwZSkKK3sKKyAgICBNTVNDb250ZXh0ICptbXMgICAgPSAmbW1zdC0+bW1zOworICAgIG1tcy0+d3JpdGVfb3V0X3B0ciA9IG1tcy0+b3V0X2J1ZmZlcjsKKworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMSk7IC8vIHN0YXJ0IHNlcXVlbmNlCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCAweGIwMGJmYWNlKTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZtbXMtPndyaXRlX291dF9wdHIsIDApOyAvLyBMZW5ndGggc3RhcnRzIGZyb20gYWZ0ZXIgdGhlIHByb3RvY29sIHR5cGUgYnl0ZXMKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZtbXMtPndyaXRlX291dF9wdHIsIE1LVEFHKCdNJywnTScsJ1MnLCcgJykpOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCBtbXN0LT5vdXRnb2luZ19wYWNrZXRfc2VxKyspOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlNjQoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMCk7IC8vIHRpbWVzdGFtcAorICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmbW1zLT53cml0ZV9vdXRfcHRyLCBwYWNrZXRfdHlwZSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmbW1zLT53cml0ZV9vdXRfcHRyLCAzKTsgLy8gZGlyZWN0aW9uIHRvIHNlcnZlcgorfQorCisvKiogQWRkIHByZWZpeGVzIHRvIE1NU1QgY29tbWFuZCBwYWNrZXQuICovCitzdGF0aWMgdm9pZCBpbnNlcnRfY29tbWFuZF9wcmVmaXhlcyhNTVNDb250ZXh0ICptbXMsCisgICAgICAgIHVpbnQzMl90IHByZWZpeDEsIHVpbnQzMl90IHByZWZpeDIpCit7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCBwcmVmaXgxKTsgLy8gZmlyc3QgcHJlZml4CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCBwcmVmaXgyKTsgLy8gc2Vjb25kIHByZWZpeAorfQorCisvKiogU2VuZCBhIHByZXBhcmVkIE1NU1QgY29tbWFuZCBwYWNrZXQuICovCitzdGF0aWMgaW50IHNlbmRfY29tbWFuZF9wYWNrZXQoTU1TVENvbnRleHQgKm1tc3QpCit7CisgICAgTU1TQ29udGV4dCAqbW1zICA9ICZtbXN0LT5tbXM7CisgICAgaW50IGxlbj0gbW1zLT53cml0ZV9vdXRfcHRyIC0gbW1zLT5vdXRfYnVmZmVyOworICAgIGludCBleGFjdF9sZW5ndGggPSBGRkFMSUdOKGxlbiwgOCk7CisgICAgaW50IGZpcnN0X2xlbmd0aD0gZXhhY3RfbGVuZ3RoIC0gMTY7CisgICAgaW50IGxlbjg9IGZpcnN0X2xlbmd0aC84OworICAgIGludCB3cml0ZV9yZXN1bHQ7CisKKyAgICAvLyB1cGRhdGUgcGFja2V0IGxlbmd0aCBmaWVsZHMuCisgICAgQVZfV0wzMihtbXMtPm91dF9idWZmZXIgKyA4LCBmaXJzdF9sZW5ndGgpOworICAgIEFWX1dMMzIobW1zLT5vdXRfYnVmZmVyICsgMTYsIGxlbjgpOworICAgIEFWX1dMMzIobW1zLT5vdXRfYnVmZmVyICsgMzIsIGxlbjgtMik7CisgICAgbWVtc2V0KG1tcy0+d3JpdGVfb3V0X3B0ciwgMCwgZXhhY3RfbGVuZ3RoIC0gbGVuKTsKKworICAgIC8vIHdyaXRlIGl0IG91dC4KKyAgICB3cml0ZV9yZXN1bHQ9IGZmdXJsX3dyaXRlKG1tcy0+bW1zX2hkLCBtbXMtPm91dF9idWZmZXIsIGV4YWN0X2xlbmd0aCk7CisgICAgaWYod3JpdGVfcmVzdWx0ICE9IGV4YWN0X2xlbmd0aCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byB3cml0ZSBkYXRhIG9mIGxlbmd0aCAlZDogJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgIGV4YWN0X2xlbmd0aCwgd3JpdGVfcmVzdWx0LAorICAgICAgICAgICAgICAgd3JpdGVfcmVzdWx0IDwgMCA/IHN0cmVycm9yKEFWVU5FUlJPUih3cml0ZV9yZXN1bHQpKSA6CisgICAgICAgICAgICAgICAgICAgIlRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW1zX3B1dF91dGYxNihNTVNDb250ZXh0ICptbXMsIGNvbnN0IHVpbnQ4X3QgKnNyYykKK3sKKyAgICBBVklPQ29udGV4dCBiaWM7CisgICAgaW50IHNpemUgPSBtbXMtPndyaXRlX291dF9wdHIgLSBtbXMtPm91dF9idWZmZXI7CisgICAgaW50IGxlbjsKKyAgICBmZmlvX2luaXRfY29udGV4dCgmYmljLCBtbXMtPndyaXRlX291dF9wdHIsCisgICAgICAgICAgICBzaXplb2YobW1zLT5vdXRfYnVmZmVyKSAtIHNpemUsIDEsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgbGVuID0gYXZpb19wdXRfc3RyMTZsZSgmYmljLCBzcmMpOworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gbGVuOworICAgIG1tcy0+d3JpdGVfb3V0X3B0ciArPSBsZW47CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF90aW1lX3Rlc3RfZGF0YShNTVNUQ29udGV4dCAqbW1zdCkKK3sKKyAgICBzdGFydF9jb21tYW5kX3BhY2tldChtbXN0LCBDU19QS1RfVElNSU5HX0RBVEFfUkVRVUVTVCk7CisgICAgaW5zZXJ0X2NvbW1hbmRfcHJlZml4ZXMoJm1tc3QtPm1tcywgMHgwMGYwZjBmMCwgMHgwMDA0MDAwYik7CisgICAgcmV0dXJuIHNlbmRfY29tbWFuZF9wYWNrZXQobW1zdCk7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9wcm90b2NvbF9zZWxlY3QoTU1TVENvbnRleHQgKm1tc3QpCit7CisgICAgaW50IHJldDsKKyAgICBjaGFyIGRhdGFfc3RyaW5nWzI1Nl07CisgICAgTU1TQ29udGV4dCAqbW1zID0gJm1tc3QtPm1tczsKKworICAgIHN0YXJ0X2NvbW1hbmRfcGFja2V0KG1tc3QsIENTX1BLVF9QUk9UT0NPTF9TRUxFQ1QpOworICAgIGluc2VydF9jb21tYW5kX3ByZWZpeGVzKG1tcywgMCwgMHhmZmZmZmZmZik7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCAwKTsgICAgICAgICAgLy8gbWF4RnVubmVsQnl0ZXMKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZtbXMtPndyaXRlX291dF9wdHIsIDB4MDA5ODk2ODApOyAvLyBtYXhiaXRSYXRlCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCAyKTsgICAgICAgICAgLy8gZnVubmVsTW9kZQorICAgIHNucHJpbnRmKGRhdGFfc3RyaW5nLCBzaXplb2YoZGF0YV9zdHJpbmcpLCAiXFxcXCVkLiVkLiVkLiVkXFwlc1xcJWQiLAorICAgICAgICAgICAgKExPQ0FMX0FERFJFU1M+PjI0KSYweGZmLAorICAgICAgICAgICAgKExPQ0FMX0FERFJFU1M+PjE2KSYweGZmLAorICAgICAgICAgICAgKExPQ0FMX0FERFJFU1M+PjgpJjB4ZmYsCisgICAgICAgICAgICBMT0NBTF9BRERSRVNTJjB4ZmYsCisgICAgICAgICAgICAiVENQIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgVURQCisgICAgICAgICAgICBMT0NBTF9QT1JUKTsKKworICAgIGlmICgocmV0ID0gbW1zX3B1dF91dGYxNihtbXMsIGRhdGFfc3RyaW5nKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBzZW5kX2NvbW1hbmRfcGFja2V0KG1tc3QpOworfQorCitzdGF0aWMgaW50IHNlbmRfbWVkaWFfZmlsZV9yZXF1ZXN0KE1NU1RDb250ZXh0ICptbXN0KQoreworICAgIGludCByZXQ7CisgICAgTU1TQ29udGV4dCAqbW1zID0gJm1tc3QtPm1tczsKKyAgICBzdGFydF9jb21tYW5kX3BhY2tldChtbXN0LCBDU19QS1RfTUVESUFfRklMRV9SRVFVRVNUKTsKKyAgICBpbnNlcnRfY29tbWFuZF9wcmVmaXhlcyhtbXMsIDEsIDB4ZmZmZmZmZmYpOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCAwKTsKKyAgICBpZiAoKHJldCA9IG1tc19wdXRfdXRmMTYobW1zLCBtbXN0LT5wYXRoICsgMSkpIDwgMCkgLy8gKzEgZm9yIHNraXAgIi8iCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gc2VuZF9jb21tYW5kX3BhY2tldChtbXN0KTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3BhY2tldF9zdHJlYW1fY2hhbmdpbmdfdHlwZShNTVNUQ29udGV4dCAqbW1zdCkKK3sKKyAgICBNTVNDb250ZXh0ICptbXMgPSAmbW1zdC0+bW1zOworICAgIGF2X2Rsb2coTlVMTCwgIlN0cmVhbSBjaGFuZ2luZyFcbiIpOworCisgICAgLy8gNDAgaXMgdGhlIHBhY2tldCBoZWFkZXIgc2l6ZSwgNyBpcyB0aGUgcHJlZml4IHNpemUuCisgICAgbW1zdC0+aGVhZGVyX3BhY2tldF9pZD0gQVZfUkwzMihtbXMtPmluX2J1ZmZlciArIDQwICsgNyk7CisgICAgYXZfZGxvZyhOVUxMLCAiQ2hhbmdlZCBoZWFkZXIgcHJlZml4IHRvIDB4JXgiLCBtbXN0LT5oZWFkZXJfcGFja2V0X2lkKTsKK30KKworc3RhdGljIGludCBzZW5kX2tlZXBhbGl2ZV9wYWNrZXQoTU1TVENvbnRleHQgKm1tc3QpCit7CisgICAgLy8gcmVzcG9uZCB0byBhIGtlZXBhbGl2ZSB3aXRoIGEga2VlcGFsaXZlLi4uCisgICAgc3RhcnRfY29tbWFuZF9wYWNrZXQobW1zdCwgQ1NfUEtUX0tFRVBBTElWRSk7CisgICAgaW5zZXJ0X2NvbW1hbmRfcHJlZml4ZXMoJm1tc3QtPm1tcywgMSwgMHgxMDBGRkZGKTsKKyAgICByZXR1cm4gc2VuZF9jb21tYW5kX3BhY2tldChtbXN0KTsKK30KKworLyoqIFBhZCBtZWRpYSBwYWNrZXRzIHNtYWxsZXIgdGhhbiBtYXhfcGFja2V0X3NpemUgYW5kL29yIGFkanVzdCByZWFkIHBvc2l0aW9uCisgICogYWZ0ZXIgYSBzZWVrLiAqLworc3RhdGljIHZvaWQgcGFkX21lZGlhX3BhY2tldChNTVNDb250ZXh0ICptbXMpCit7CisgICAgaWYobW1zLT5yZW1haW5pbmdfaW5fbGVuPG1tcy0+YXNmX3BhY2tldF9sZW4pIHsKKyAgICAgICAgaW50IHBhZGRpbmdfc2l6ZSA9IG1tcy0+YXNmX3BhY2tldF9sZW4gLSBtbXMtPnJlbWFpbmluZ19pbl9sZW47CisgICAgICAgIG1lbXNldChtbXMtPmluX2J1ZmZlciArIG1tcy0+cmVtYWluaW5nX2luX2xlbiwgMCwgcGFkZGluZ19zaXplKTsKKyAgICAgICAgbW1zLT5yZW1haW5pbmdfaW5fbGVuICs9IHBhZGRpbmdfc2l6ZTsKKyAgICB9Cit9CisKKy8qKiBSZWFkIGluY29taW5nIE1NU1QgbWVkaWEsIGhlYWRlciBvciBjb21tYW5kIHBhY2tldC4gKi8KK3N0YXRpYyBNTVNTQ1BhY2tldFR5cGUgZ2V0X3RjcF9zZXJ2ZXJfcmVzcG9uc2UoTU1TVENvbnRleHQgKm1tc3QpCit7CisgICAgaW50IHJlYWRfcmVzdWx0OworICAgIE1NU1NDUGFja2V0VHlwZSBwYWNrZXRfdHlwZT0gLTE7CisgICAgTU1TQ29udGV4dCAqbW1zID0gJm1tc3QtPm1tczsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgcmVhZF9yZXN1bHQgPSBmZnVybF9yZWFkX2NvbXBsZXRlKG1tcy0+bW1zX2hkLCBtbXMtPmluX2J1ZmZlciwgOCk7CisgICAgICAgIGlmIChyZWFkX3Jlc3VsdCAhPSA4KSB7CisgICAgICAgICAgICBpZihyZWFkX3Jlc3VsdCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcmVhZGluZyBwYWNrZXQgaGVhZGVyOiAlZCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICByZWFkX3Jlc3VsdCwgc3RyZXJyb3IoQVZVTkVSUk9SKHJlYWRfcmVzdWx0KSkpOworICAgICAgICAgICAgICAgIHBhY2tldF90eXBlID0gU0NfUEtUX0NBTkNFTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICBwYWNrZXRfdHlwZSA9IFNDX1BLVF9OT19EQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhY2tldF90eXBlOworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIGNvbW1hbmQgcGFja2V0LgorICAgICAgICBpZihBVl9STDMyKG1tcy0+aW5fYnVmZmVyICsgNCk9PTB4YjAwYmZhY2UpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGhfcmVtYWluaW5nLCBocjsKKworICAgICAgICAgICAgbW1zdC0+aW5jb21pbmdfZmxhZ3M9IG1tcy0+aW5fYnVmZmVyWzNdOworICAgICAgICAgICAgcmVhZF9yZXN1bHQ9IGZmdXJsX3JlYWRfY29tcGxldGUobW1zLT5tbXNfaGQsIG1tcy0+aW5fYnVmZmVyKzgsIDQpOworICAgICAgICAgICAgaWYocmVhZF9yZXN1bHQgIT0gNCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJSZWFkaW5nIGNvbW1hbmQgcGFja2V0IGxlbmd0aCBmYWlsZWQ6ICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICByZWFkX3Jlc3VsdCA8IDAgPyBzdHJlcnJvcihBVlVORVJST1IocmVhZF9yZXN1bHQpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZF9yZXN1bHQgPCAwID8gcmVhZF9yZXN1bHQgOiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxlbmd0aF9yZW1haW5pbmc9IEFWX1JMMzIobW1zLT5pbl9idWZmZXIrOCkgKyA0OworICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAiTGVuZ3RoIHJlbWFpbmluZyBpcyAlZFxuIiwgbGVuZ3RoX3JlbWFpbmluZyk7CisgICAgICAgICAgICAvLyByZWFkIHRoZSByZXN0IG9mIHRoZSBwYWNrZXQuCisgICAgICAgICAgICBpZiAobGVuZ3RoX3JlbWFpbmluZyA8IDAKKyAgICAgICAgICAgICAgICB8fCBsZW5ndGhfcmVtYWluaW5nID4gc2l6ZW9mKG1tcy0+aW5fYnVmZmVyKSAtIDEyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkluY29taW5nIHBhY2tldCBsZW5ndGggJWQgZXhjZWVkcyBidWZzaXplICUiU0laRV9TUEVDSUZJRVIiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfcmVtYWluaW5nLCBzaXplb2YobW1zLT5pbl9idWZmZXIpIC0gMTIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZF9yZXN1bHQgPSBmZnVybF9yZWFkX2NvbXBsZXRlKG1tcy0+bW1zX2hkLCBtbXMtPmluX2J1ZmZlciArIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfcmVtYWluaW5nKSA7CisgICAgICAgICAgICBpZiAocmVhZF9yZXN1bHQgIT0gbGVuZ3RoX3JlbWFpbmluZykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJSZWFkaW5nIHBrdCBkYXRhIChsZW5ndGg9JWQpIGZhaWxlZDogJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3JlbWFpbmluZywgcmVhZF9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVzdWx0IDwgMCA/IHN0cmVycm9yKEFWVU5FUlJPUihyZWFkX3Jlc3VsdCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZWFkX3Jlc3VsdCA8IDAgPyByZWFkX3Jlc3VsdCA6IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhY2tldF90eXBlPSBBVl9STDE2KG1tcy0+aW5fYnVmZmVyKzM2KTsKKyAgICAgICAgICAgIGlmIChyZWFkX3Jlc3VsdCA+PSA0NCAmJiAoaHIgPSBBVl9STDMyKG1tcy0+aW5fYnVmZmVyICsgNDApKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2ZXIgc2VudCBhIG1lc3NhZ2Ugd2l0aCBwYWNrZXQgdHlwZSAweCV4IGFuZCBlcnJvciBzdGF0dXMgY29kZSAweCUwOHhcbiIsIHBhY2tldF90eXBlLCBocik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBsZW5ndGhfcmVtYWluaW5nOworICAgICAgICAgICAgaW50IHBhY2tldF9pZF90eXBlOworICAgICAgICAgICAgaW50IHRtcDsKKworICAgICAgICAgICAgLy8gbm90ZSB3ZSBjYWNoZSB0aGUgZmlyc3QgOCBieXRlcywKKyAgICAgICAgICAgIC8vIHRoZW4gZmlsbCB1cCB0aGUgYnVmZmVyIHdpdGggdGhlIG90aGVycworICAgICAgICAgICAgdG1wICAgICAgICAgICAgICAgICAgICAgICA9IEFWX1JMMTYobW1zLT5pbl9idWZmZXIgKyA2KTsKKyAgICAgICAgICAgIGxlbmd0aF9yZW1haW5pbmcgICAgICAgICAgPSAodG1wIC0gOCkgJiAweGZmZmY7CisgICAgICAgICAgICBtbXN0LT5pbmNvbWluZ19wYWNrZXRfc2VxID0gQVZfUkwzMihtbXMtPmluX2J1ZmZlcik7CisgICAgICAgICAgICBwYWNrZXRfaWRfdHlwZSAgICAgICAgICAgID0gbW1zLT5pbl9idWZmZXJbNF07CisgICAgICAgICAgICBtbXN0LT5pbmNvbWluZ19mbGFncyAgICAgID0gbW1zLT5pbl9idWZmZXJbNV07CisKKyAgICAgICAgICAgIGlmIChsZW5ndGhfcmVtYWluaW5nIDwgMAorICAgICAgICAgICAgICAgIHx8IGxlbmd0aF9yZW1haW5pbmcgPiBzaXplb2YobW1zLT5pbl9idWZmZXIpIC0gOCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIGxlbmd0aCAlZCBpcyBpbnZhbGlkIG9yIHRvbyBsYXJnZSAobWF4PSUiU0laRV9TUEVDSUZJRVIiKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3JlbWFpbmluZywgc2l6ZW9mKG1tcy0+aW5fYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtbXMtPnJlbWFpbmluZ19pbl9sZW4gICAgPSBsZW5ndGhfcmVtYWluaW5nOworICAgICAgICAgICAgbW1zLT5yZWFkX2luX3B0ciAgICAgICAgID0gbW1zLT5pbl9idWZmZXI7CisgICAgICAgICAgICByZWFkX3Jlc3VsdD0gZmZ1cmxfcmVhZF9jb21wbGV0ZShtbXMtPm1tc19oZCwgbW1zLT5pbl9idWZmZXIsIGxlbmd0aF9yZW1haW5pbmcpOworICAgICAgICAgICAgaWYocmVhZF9yZXN1bHQgIT0gbGVuZ3RoX3JlbWFpbmluZykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBwYWNrZXQgZGF0YSBvZiBzaXplICVkOiAlZCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfcmVtYWluaW5nLCByZWFkX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9yZXN1bHQgPCAwID8gc3RyZXJyb3IoQVZVTkVSUk9SKHJlYWRfcmVzdWx0KSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRfcmVzdWx0IDwgMCA/IHJlYWRfcmVzdWx0IDogQVZFUlJPUihFSU8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB3ZSBzdWNjZXNzZnVsbHkgcmVhZCBldmVyeXRoaW5nLgorICAgICAgICAgICAgaWYocGFja2V0X2lkX3R5cGUgPT0gbW1zdC0+aGVhZGVyX3BhY2tldF9pZCkgeworICAgICAgICAgICAgICAgIGludCBlcnI7CisgICAgICAgICAgICAgICAgcGFja2V0X3R5cGUgPSBTQ19QS1RfQVNGX0hFQURFUjsKKyAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgYXNmIGhlYWRlcgorICAgICAgICAgICAgICAgIGlmKCFtbXMtPmhlYWRlcl9wYXJzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmbW1zLT5hc2ZfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tcy0+YXNmX2hlYWRlcl9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbXMtPnJlbWFpbmluZ19pbl9sZW4pKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1tcy0+YXNmX2hlYWRlcl9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG1tcy0+YXNmX2hlYWRlciArIG1tcy0+YXNmX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1zLT5yZWFkX2luX3B0ciwgbW1zLT5yZW1haW5pbmdfaW5fbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgbW1zLT5hc2ZfaGVhZGVyX3NpemUgKz0gbW1zLT5yZW1haW5pbmdfaW5fbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyAweDA0IG1lYW5zIGFzZiBoZWFkZXIgaXMgc2VudCBpbiBtdWx0aXBsZSBwYWNrZXRzLgorICAgICAgICAgICAgICAgIGlmIChtbXN0LT5pbmNvbWluZ19mbGFncyA9PSAweDA0KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihwYWNrZXRfaWRfdHlwZSA9PSBtbXN0LT5wYWNrZXRfaWQpIHsKKyAgICAgICAgICAgICAgICBwYWNrZXRfdHlwZSA9IFNDX1BLVF9BU0ZfTUVESUE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2Rsb2coTlVMTCwgInBhY2tldCBpZCB0eXBlICVkIGlzIG9sZC4iLCBwYWNrZXRfaWRfdHlwZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmVwcm9jZXNzIHNvbWUgcGFja2V0IHR5cGUKKyAgICAgICAgaWYocGFja2V0X3R5cGUgPT0gU0NfUEtUX0tFRVBBTElWRSkgeworICAgICAgICAgICAgc2VuZF9rZWVwYWxpdmVfcGFja2V0KG1tc3QpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZihwYWNrZXRfdHlwZSA9PSBTQ19QS1RfU1RSRUFNX0NIQU5HSU5HKSB7CisgICAgICAgICAgICBoYW5kbGVfcGFja2V0X3N0cmVhbV9jaGFuZ2luZ190eXBlKG1tc3QpOworICAgICAgICB9IGVsc2UgaWYocGFja2V0X3R5cGUgPT0gU0NfUEtUX0FTRl9NRURJQSkgeworICAgICAgICAgICAgcGFkX21lZGlhX3BhY2tldChtbXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrZXRfdHlwZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbW1zX3NhZmVfc2VuZF9yZWN2KE1NU1RDb250ZXh0ICptbXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqc2VuZF9mdW4pKE1NU1RDb250ZXh0ICptbXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1NU1NDUGFja2V0VHlwZSBleHBlY3RfdHlwZSkKK3sKKyAgICBNTVNTQ1BhY2tldFR5cGUgdHlwZTsKKyAgICBpZihzZW5kX2Z1bikgeworICAgICAgICBpbnQgcmV0ID0gc2VuZF9mdW4obW1zdCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJTZW5kIFBhY2tldCBlcnJvciBiZWZvcmUgZXhwZWN0aW5nIHJlY3YgcGFja2V0ICVkXG4iLCBleHBlY3RfdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCh0eXBlID0gZ2V0X3RjcF9zZXJ2ZXJfcmVzcG9uc2UobW1zdCkpICE9IGV4cGVjdF90eXBlKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ29ycnVwdCBzdHJlYW0gKHVuZXhwZWN0ZWQgcGFja2V0IHR5cGUgMHgleCwgZXhwZWN0ZWQgMHgleClcbiIsCisgICAgICAgICAgICAgICB0eXBlLCBleHBlY3RfdHlwZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCBzZW5kX21lZGlhX2hlYWRlcl9yZXF1ZXN0KE1NU1RDb250ZXh0ICptbXN0KQoreworICAgIE1NU0NvbnRleHQgKm1tcyA9ICZtbXN0LT5tbXM7CisgICAgc3RhcnRfY29tbWFuZF9wYWNrZXQobW1zdCwgQ1NfUEtUX01FRElBX0hFQURFUl9SRVFVRVNUKTsKKyAgICBpbnNlcnRfY29tbWFuZF9wcmVmaXhlcyhtbXMsIDEsIDApOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCAweDAwODAwMDAwKTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZtbXMtPndyaXRlX291dF9wdHIsIDB4ZmZmZmZmZmYpOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCAwKTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZtbXMtPndyaXRlX291dF9wdHIsIDApOworCisgICAgLy8gdGhlIG1lZGlhIHByZXJvbGwgdmFsdWUgaW4gbWlsbGlzZWNvbmRzPworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCAweDQwQUMyMDAwKTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZtbXMtPndyaXRlX291dF9wdHIsIDIpOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMCk7CisKKyAgICByZXR1cm4gc2VuZF9jb21tYW5kX3BhY2tldChtbXN0KTsKK30KKworLyoqIFNlbmQgdGhlIGluaXRpYWwgaGFuZHNoYWtlLiAqLworc3RhdGljIGludCBzZW5kX3N0YXJ0dXBfcGFja2V0KE1NU1RDb250ZXh0ICptbXN0KQoreworICAgIGNoYXIgZGF0YV9zdHJpbmdbMjU2XTsKKyAgICBpbnQgcmV0OworICAgIE1NU0NvbnRleHQgKm1tcyA9ICZtbXN0LT5tbXM7CisgICAgLy8gU3Vic2NyaWJlck5hbWUgaXMgZGVmaW5lZCBpbiBNUyBzcGVjaWZpY2F0aW9uIGxpbmtlZCBiZWxvdy4KKyAgICAvLyBUaGUgZ3VpZCB2YWx1ZSBjYW4gYmUgYW55IHZhbGlkIHZhbHVlLgorICAgIC8vIGh0dHA6Ly9kb3dubG9hZC5taWNyb3NvZnQuY29tLworICAgIC8vIGRvd25sb2FkLzkvNS9FLzk1RUY2NkFGLTkwMjYtNEJCMC1BNDFELUE0RjgxODAyRDkyQy8lNUJNUy1XTVNQJTVELnBkZgorICAgIHNucHJpbnRmKGRhdGFfc3RyaW5nLCBzaXplb2YoZGF0YV9zdHJpbmcpLAorICAgICAgICAgICAgIk5TUGxheWVyLzcuMC4wLjE5NTY7IHslc307IEhvc3Q6ICVzIiwKKyAgICAgICAgICAgICI3RTY2N0Y1RC1BNjYxLTQ5NUUtQTUxMi1GNTU2ODZEREExNzgiLCBtbXN0LT5ob3N0KTsKKworICAgIHN0YXJ0X2NvbW1hbmRfcGFja2V0KG1tc3QsIENTX1BLVF9JTklUSUFMKTsKKyAgICBpbnNlcnRfY29tbWFuZF9wcmVmaXhlcyhtbXMsIDAsIDB4MDAwNDAwMGIpOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMHgwMDAzMDAxYyk7CisgICAgaWYgKChyZXQgPSBtbXNfcHV0X3V0ZjE2KG1tcywgZGF0YV9zdHJpbmcpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIHNlbmRfY29tbWFuZF9wYWNrZXQobW1zdCk7Cit9CisKKy8qKiBTZW5kIE1NU1Qgc3RyZWFtIHNlbGVjdGlvbiBjb21tYW5kIGJhc2VkIG9uIHRoZSBBVlN0cmVhbS0+ZGlzY2FyZCB2YWx1ZXMuICovCitzdGF0aWMgaW50IHNlbmRfc3RyZWFtX3NlbGVjdGlvbl9yZXF1ZXN0KE1NU1RDb250ZXh0ICptbXN0KQoreworICAgIGludCBpOworICAgIE1NU0NvbnRleHQgKm1tcyA9ICZtbXN0LT5tbXM7CisgICAgLy8gIHNlbmQgdGhlIHN0cmVhbXMgd2Ugd2FudCBiYWNrLi4uCisgICAgc3RhcnRfY29tbWFuZF9wYWNrZXQobW1zdCwgQ1NfUEtUX1NUUkVBTV9JRF9SRVFVRVNUKTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZtbXMtPndyaXRlX291dF9wdHIsIG1tcy0+c3RyZWFtX251bSk7ICAgICAgICAgLy8gc3RyZWFtIG51bXMKKyAgICBmb3IoaT0gMDsgaTxtbXMtPnN0cmVhbV9udW07IGkrKykgeworICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZtbXMtPndyaXRlX291dF9wdHIsIDB4ZmZmZik7ICAgICAgICAgICAgICAvLyBmbGFncworICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZtbXMtPndyaXRlX291dF9wdHIsIG1tcy0+c3RyZWFtc1tpXS5pZCk7ICAvLyBzdHJlYW0gaWQKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmbW1zLT53cml0ZV9vdXRfcHRyLCAwKTsgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uCisgICAgfQorICAgIHJldHVybiBzZW5kX2NvbW1hbmRfcGFja2V0KG1tc3QpOworfQorCitzdGF0aWMgaW50IHNlbmRfY2xvc2VfcGFja2V0KE1NU1RDb250ZXh0ICptbXN0KQoreworICAgIHN0YXJ0X2NvbW1hbmRfcGFja2V0KG1tc3QsIENTX1BLVF9TVFJFQU1fQ0xPU0UpOworICAgIGluc2VydF9jb21tYW5kX3ByZWZpeGVzKCZtbXN0LT5tbXMsIDEsIDEpOworCisgICAgcmV0dXJuIHNlbmRfY29tbWFuZF9wYWNrZXQobW1zdCk7Cit9CisKKy8qKiBDbG9zZSB0aGUgTU1TSC9NTVNUIGNvbm5lY3Rpb24gKi8KK3N0YXRpYyBpbnQgbW1zX2Nsb3NlKFVSTENvbnRleHQgKmgpCit7CisgICAgTU1TVENvbnRleHQgKm1tc3QgPSAoTU1TVENvbnRleHQgKiloLT5wcml2X2RhdGE7CisgICAgTU1TQ29udGV4dCAqbW1zICAgPSAmbW1zdC0+bW1zOworICAgIGlmKG1tcy0+bW1zX2hkKSB7CisgICAgICAgIHNlbmRfY2xvc2VfcGFja2V0KG1tc3QpOworICAgICAgICBmZnVybF9jbG9zZShtbXMtPm1tc19oZCk7CisgICAgfQorCisgICAgLyogZnJlZSBhbGwgc2VwYXJhdGVseSBhbGxvY2F0ZWQgcG9pbnRlcnMgaW4gbW1zICovCisgICAgYXZfZnJlZShtbXMtPnN0cmVhbXMpOworICAgIGF2X2ZyZWUobW1zLT5hc2ZfaGVhZGVyKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlbmRfbWVkaWFfcGFja2V0X3JlcXVlc3QoTU1TVENvbnRleHQgKm1tc3QpCit7CisgICAgTU1TQ29udGV4dCAqbW1zID0gJm1tc3QtPm1tczsKKyAgICBzdGFydF9jb21tYW5kX3BhY2tldChtbXN0LCBDU19QS1RfU1RBUlRfRlJPTV9QS1RfSUQpOworICAgIGluc2VydF9jb21tYW5kX3ByZWZpeGVzKG1tcywgMSwgMHgwMDAxRkZGRik7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGU2NCgmbW1zLT53cml0ZV9vdXRfcHRyLCAwKTsgICAgICAgICAgLy8gc2VlayB0aW1lc3RhbXAKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZtbXMtPndyaXRlX291dF9wdHIsIDB4ZmZmZmZmZmYpOyAvLyB1bmtub3duCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCAweGZmZmZmZmZmKTsgLy8gcGFja2V0IG9mZnNldAorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMHhmZik7ICAgICAgIC8vIG1heCBzdHJlYW0gdGltZSBsaW1pdAorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMHhmZik7ICAgICAgIC8vIG1heCBzdHJlYW0gdGltZSBsaW1pdAorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMHhmZik7ICAgICAgIC8vIG1heCBzdHJlYW0gdGltZSBsaW1pdAorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJm1tcy0+d3JpdGVfb3V0X3B0ciwgMHgwMCk7ICAgICAgIC8vIHN0cmVhbSB0aW1lIGxpbWl0IGZsYWcKKworICAgIG1tc3QtPnBhY2tldF9pZCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgcGFja2V0X2lkCisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmbW1zLT53cml0ZV9vdXRfcHRyLCBtbXN0LT5wYWNrZXRfaWQpOworICAgIHJldHVybiBzZW5kX2NvbW1hbmRfcGFja2V0KG1tc3QpOworfQorCisKK3N0YXRpYyB2b2lkIGNsZWFyX3N0cmVhbV9idWZmZXJzKE1NU0NvbnRleHQgKm1tcykKK3sKKyAgICBtbXMtPnJlbWFpbmluZ19pbl9sZW4gPSAwOworICAgIG1tcy0+cmVhZF9pbl9wdHIgICAgICA9IG1tcy0+aW5fYnVmZmVyOworfQorCitzdGF0aWMgaW50IG1tc19vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzKQoreworICAgIE1NU1RDb250ZXh0ICptbXN0ID0gaC0+cHJpdl9kYXRhOworICAgIE1NU0NvbnRleHQgKm1tczsKKyAgICBpbnQgcG9ydCwgZXJyOworICAgIGNoYXIgdGNwbmFtZVsyNTZdOworCisgICAgaC0+aXNfc3RyZWFtZWQgPSAxOworICAgIG1tcyA9ICZtbXN0LT5tbXM7CisKKyAgICAvLyBvbmx5IGZvciBNTVMgb3ZlciBUQ1AsIHNvIHNldCBwcm90byA9IE5VTEwKKyAgICBhdl91cmxfc3BsaXQoTlVMTCwgMCwgTlVMTCwgMCwKKyAgICAgICAgICAgIG1tc3QtPmhvc3QsIHNpemVvZihtbXN0LT5ob3N0KSwgJnBvcnQsIG1tc3QtPnBhdGgsCisgICAgICAgICAgICBzaXplb2YobW1zdC0+cGF0aCksIHVyaSk7CisKKyAgICBpZihwb3J0PDApCisgICAgICAgIHBvcnQgPSAxNzU1OyAvLyBkZWZhdXQgbW1zIHByb3RvY29sIHBvcnQKKworICAgIC8vIGVzdGFibGlzaCB0Y3AgY29ubmVjdGlvbi4KKyAgICBmZl91cmxfam9pbih0Y3BuYW1lLCBzaXplb2YodGNwbmFtZSksICJ0Y3AiLCBOVUxMLCBtbXN0LT5ob3N0LCBwb3J0LCBOVUxMKTsKKyAgICBlcnIgPSBmZnVybF9vcGVuKCZtbXMtPm1tc19oZCwgdGNwbmFtZSwgQVZJT19GTEFHX1JFQURfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMKTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBtbXN0LT5wYWNrZXRfaWQgICAgICAgID0gMzsgICAgICAgICAgLy8gZGVmYXVsdCwgaW5pdGlhbCB2YWx1ZS4KKyAgICBtbXN0LT5oZWFkZXJfcGFja2V0X2lkID0gMjsgICAgICAgICAgLy8gZGVmYXVsdCwgaW5pdGlhbCB2YWx1ZS4KKyAgICBlcnIgPSBtbXNfc2FmZV9zZW5kX3JlY3YobW1zdCwgc2VuZF9zdGFydHVwX3BhY2tldCwgU0NfUEtUX0NMSUVOVF9BQ0NFUFRFRCk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworICAgIGVyciA9IG1tc19zYWZlX3NlbmRfcmVjdihtbXN0LCBzZW5kX3RpbWVfdGVzdF9kYXRhLCBTQ19QS1RfVElNSU5HX1RFU1RfUkVQTFkpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBlcnIgPSBtbXNfc2FmZV9zZW5kX3JlY3YobW1zdCwgc2VuZF9wcm90b2NvbF9zZWxlY3QsIFNDX1BLVF9QUk9UT0NPTF9BQ0NFUFRFRCk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworICAgIGVyciA9IG1tc19zYWZlX3NlbmRfcmVjdihtbXN0LCBzZW5kX21lZGlhX2ZpbGVfcmVxdWVzdCwgU0NfUEtUX01FRElBX0ZJTEVfREVUQUlMUyk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworICAgIGVyciA9IG1tc19zYWZlX3NlbmRfcmVjdihtbXN0LCBzZW5kX21lZGlhX2hlYWRlcl9yZXF1ZXN0LCBTQ19QS1RfSEVBREVSX1JFUVVFU1RfQUNDRVBURUQpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBlcnIgPSBtbXNfc2FmZV9zZW5kX3JlY3YobW1zdCwgTlVMTCwgU0NfUEtUX0FTRl9IRUFERVIpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZigobW1zdC0+aW5jb21pbmdfZmxhZ3MgIT0gMFgwOCkgJiYgKG1tc3QtPmluY29taW5nX2ZsYWdzICE9IDBYMEMpKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IE1NU1QgKHRyeSBNTVNIIG9yIFJUU1ApXG4iKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGVyciA9IGZmX21tc19hc2ZfaGVhZGVyX3BhcnNlcihtbXMpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiYXNmIGhlYWRlciBwYXJzZWQgZmFpbGVkIVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgbW1zLT5oZWFkZXJfcGFyc2VkID0gMTsKKworICAgIGlmICghbW1zLT5hc2ZfcGFja2V0X2xlbiB8fCAhbW1zLT5zdHJlYW1fbnVtKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBjbGVhcl9zdHJlYW1fYnVmZmVycyhtbXMpOworICAgIGVyciA9IG1tc19zYWZlX3NlbmRfcmVjdihtbXN0LCBzZW5kX3N0cmVhbV9zZWxlY3Rpb25fcmVxdWVzdCwgU0NfUEtUX1NUUkVBTV9JRF9BQ0NFUFRFRCk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworICAgIC8vIHNlbmQgbWVkaWEgcGFja2V0IHJlcXVlc3QKKyAgICBlcnIgPSBtbXNfc2FmZV9zZW5kX3JlY3YobW1zdCwgc2VuZF9tZWRpYV9wYWNrZXRfcmVxdWVzdCwgU0NfUEtUX01FRElBX1BLVF9GT0xMT1dTKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgYXZfZGxvZyhOVUxMLCAiTGVhdmluZyBvcGVuIChzdWNjZXNzKVxuIik7CisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIG1tc19jbG9zZShoKTsKKyAgICBhdl9kbG9nKE5VTEwsICJMZWF2aW5nIG9wZW4gKGZhaWx1cmU6ICVkKVxuIiwgZXJyKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiogUmVhZCBBU0YgZGF0YSB0aHJvdWdoIHRoZSBwcm90b2NvbC4gKi8KK3N0YXRpYyBpbnQgbW1zX3JlYWQoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICAvKiBUT0RPOiBzZWUgdGNwLmM6dGNwX3JlYWQoKSBhYm91dCBhIHBvc3NpYmxlIHRpbWVvdXQgc2NoZW1lICovCisgICAgTU1TVENvbnRleHQgKm1tc3QgPSBoLT5wcml2X2RhdGE7CisgICAgTU1TQ29udGV4dCAqbW1zICAgPSAmbW1zdC0+bW1zOworICAgIGludCByZXN1bHQgPSAwOworCisgICAgZG8geworICAgICAgICBpZihtbXMtPmFzZl9oZWFkZXJfcmVhZF9zaXplIDwgbW1zLT5hc2ZfaGVhZGVyX3NpemUpIHsKKyAgICAgICAgICAgIC8qIFJlYWQgZnJvbSBBU0YgaGVhZGVyIGJ1ZmZlciAqLworICAgICAgICAgICAgcmVzdWx0ID0gZmZfbW1zX3JlYWRfaGVhZGVyKG1tcywgYnVmLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIGlmKG1tcy0+cmVtYWluaW5nX2luX2xlbikgeworICAgICAgICAgICAgLyogUmVhZCByZW1haW5pbmcgcGFja2V0IGRhdGEgdG8gYnVmZmVyLgorICAgICAgICAgICAgICogdGhlIHJlc3VsdCBjYW4gbm90IGJlIHplcm8gYmVjYXVzZSByZW1haW5pbmdfaW5fbGVuIGlzIHBvc2l0aXZlLiovCisgICAgICAgICAgICByZXN1bHQgPSBmZl9tbXNfcmVhZF9kYXRhKG1tcywgYnVmLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFJlYWQgZnJvbSBuZXR3b3JrICovCisgICAgICAgICAgICBpbnQgZXJyID0gbW1zX3NhZmVfc2VuZF9yZWN2KG1tc3QsIE5VTEwsIFNDX1BLVF9BU0ZfTUVESUEpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYobW1zLT5yZW1haW5pbmdfaW5fbGVuPm1tcy0+YXNmX3BhY2tldF9sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvbWluZyBwa3RsZW4gJWQgaXMgbGFyZ2VyIHRoYW4gQVNGIHBrdHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtbXMtPnJlbWFpbmluZ19pbl9sZW4sIG1tcy0+YXNmX3BhY2tldF9sZW4pOworICAgICAgICAgICAgICAgICAgICByZXN1bHQ9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBwYWNrZXQgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmZl9tbXNfcmVhZF9kYXRhKG1tcywgYnVmLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKE5VTEwsICJSZWFkIEFTRiBtZWRpYSBwYWNrZXQgc2l6ZSBpcyB6ZXJvIVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfZGxvZyhOVUxMLCAicmVhZCBwYWNrZXQgZXJyb3IhXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUoIXJlc3VsdCk7IC8vIG9ubHkgcmV0dXJuIG9uZSBwYWNrZXQuCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVVJMUHJvdG9jb2wgZmZfbW1zdF9wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibW1zdCIsCisgICAgLnVybF9vcGVuICAgICAgID0gbW1zX29wZW4sCisgICAgLnVybF9yZWFkICAgICAgID0gbW1zX3JlYWQsCisgICAgLnVybF9jbG9zZSAgICAgID0gbW1zX2Nsb3NlLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNTVNUQ29udGV4dCksCisgICAgLmZsYWdzICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbW92LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbW92LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2NmMwYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tb3YuYwpAQCAtMCwwICsxLDQyMzkgQEAKKy8qCisgKiBNT1YgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA5IEJhcHRpc3RlIENvdWR1cmllciA8YmFwdGlzdGUgZG90IGNvdWR1cmllciBhdCBnbWFpbCBkb3QgY29tPgorICoKKyAqIGZpcnN0IHZlcnNpb24gYnkgRnJhbmNvaXMgUmV2b2wgPHJldm9sQGZyZWUuZnI+CisgKiBzZWVrIGZ1bmN0aW9uIGJ5IEdhZWwgQ2hhcmRvbiA8Z2FlbC5kZXZANG5vdy5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGlzcGxheS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lY29kZS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYWMzdGFiLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyaWZmLmgiCisjaW5jbHVkZSAiaXNvbS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpZDN2MS5oIgorI2luY2x1ZGUgIm1vdl9jaGFuLmgiCisjaW5jbHVkZSAicmVwbGF5Z2Fpbi5oIgorCisjaWYgQ09ORklHX1pMSUIKKyNpbmNsdWRlIDx6bGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInF0cGFsZXR0ZS5oIgorCisKKyN1bmRlZiBOREVCVUcKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyogdGhvc2UgZnVuY3Rpb25zIHBhcnNlIGFuIGF0b20gKi8KKy8qIGxpbmtzIGF0b20gSURzIHRvIHBhcnNlIGZ1bmN0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgTU9WUGFyc2VUYWJsZUVudHJ5IHsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGludCAoKnBhcnNlKShNT1ZDb250ZXh0ICpjdHgsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKTsKK30gTU9WUGFyc2VUYWJsZUVudHJ5OworCitzdGF0aWMgaW50IG1vdl9yZWFkX2RlZmF1bHQoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pOworc3RhdGljIGludCBtb3ZfcmVhZF9tZnJhKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpmKTsKKworc3RhdGljIGludCBtb3ZfbWV0YWRhdGFfdHJhY2tfb3JfZGlzY19udW1iZXIoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICprZXkpCit7CisgICAgY2hhciBidWZbMTZdOworCisgICAgc2hvcnQgY3VycmVudCwgdG90YWwgPSAwOworICAgIGF2aW9fcmIxNihwYik7IC8vIHVua25vd24KKyAgICBjdXJyZW50ID0gYXZpb19yYjE2KHBiKTsKKyAgICBpZiAobGVuID49IDYpCisgICAgICAgIHRvdGFsID0gYXZpb19yYjE2KHBiKTsKKyAgICBpZiAoIXRvdGFsKQorICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBjdXJyZW50KTsKKyAgICBlbHNlCisgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZC8lZCIsIGN1cnJlbnQsIHRvdGFsKTsKKyAgICBjLT5mYy0+ZXZlbnRfZmxhZ3MgfD0gQVZGTVRfRVZFTlRfRkxBR19NRVRBREFUQV9VUERBVEVEOworICAgIGF2X2RpY3Rfc2V0KCZjLT5mYy0+bWV0YWRhdGEsIGtleSwgYnVmLCAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9tZXRhZGF0YV9pbnQ4X2J5cGFzc19wYWRkaW5nKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICprZXkpCit7CisgICAgLyogYnlwYXNzIHBhZGRpbmcgYnl0ZXMgKi8KKyAgICBhdmlvX3I4KHBiKTsKKyAgICBhdmlvX3I4KHBiKTsKKyAgICBhdmlvX3I4KHBiKTsKKworICAgIGMtPmZjLT5ldmVudF9mbGFncyB8PSBBVkZNVF9FVkVOVF9GTEFHX01FVEFEQVRBX1VQREFURUQ7CisgICAgYXZfZGljdF9zZXRfaW50KCZjLT5mYy0+bWV0YWRhdGEsIGtleSwgYXZpb19yOChwYiksIDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X21ldGFkYXRhX2ludDhfbm9fcGFkZGluZyhNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICprZXkpCit7CisgICAgYy0+ZmMtPmV2ZW50X2ZsYWdzIHw9IEFWRk1UX0VWRU5UX0ZMQUdfTUVUQURBVEFfVVBEQVRFRDsKKyAgICBhdl9kaWN0X3NldF9pbnQoJmMtPmZjLT5tZXRhZGF0YSwga2V5LCBhdmlvX3I4KHBiKSwgMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfbWV0YWRhdGFfZ25yZShNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbiwgY29uc3QgY2hhciAqa2V5KQoreworICAgIHNob3J0IGdlbnJlOworCisgICAgYXZpb19yOChwYik7IC8vIHVua25vd24KKworICAgIGdlbnJlID0gYXZpb19yOChwYik7CisgICAgaWYgKGdlbnJlIDwgMSB8fCBnZW5yZSA+IElEM3YxX0dFTlJFX01BWCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYy0+ZmMtPmV2ZW50X2ZsYWdzIHw9IEFWRk1UX0VWRU5UX0ZMQUdfTUVUQURBVEFfVVBEQVRFRDsKKyAgICBhdl9kaWN0X3NldCgmYy0+ZmMtPm1ldGFkYXRhLCBrZXksIGZmX2lkM3YxX2dlbnJlX3N0cltnZW5yZS0xXSwgMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHVpbnQzMl90IG1hY190b191bmljb2RlWzEyOF0gPSB7CisgICAgMHgwMEM0LDB4MDBDNSwweDAwQzcsMHgwMEM5LDB4MDBEMSwweDAwRDYsMHgwMERDLDB4MDBFMSwKKyAgICAweDAwRTAsMHgwMEUyLDB4MDBFNCwweDAwRTMsMHgwMEU1LDB4MDBFNywweDAwRTksMHgwMEU4LAorICAgIDB4MDBFQSwweDAwRUIsMHgwMEVELDB4MDBFQywweDAwRUUsMHgwMEVGLDB4MDBGMSwweDAwRjMsCisgICAgMHgwMEYyLDB4MDBGNCwweDAwRjYsMHgwMEY1LDB4MDBGQSwweDAwRjksMHgwMEZCLDB4MDBGQywKKyAgICAweDIwMjAsMHgwMEIwLDB4MDBBMiwweDAwQTMsMHgwMEE3LDB4MjAyMiwweDAwQjYsMHgwMERGLAorICAgIDB4MDBBRSwweDAwQTksMHgyMTIyLDB4MDBCNCwweDAwQTgsMHgyMjYwLDB4MDBDNiwweDAwRDgsCisgICAgMHgyMjFFLDB4MDBCMSwweDIyNjQsMHgyMjY1LDB4MDBBNSwweDAwQjUsMHgyMjAyLDB4MjIxMSwKKyAgICAweDIyMEYsMHgwM0MwLDB4MjIyQiwweDAwQUEsMHgwMEJBLDB4MDNBOSwweDAwRTYsMHgwMEY4LAorICAgIDB4MDBCRiwweDAwQTEsMHgwMEFDLDB4MjIxQSwweDAxOTIsMHgyMjQ4LDB4MjIwNiwweDAwQUIsCisgICAgMHgwMEJCLDB4MjAyNiwweDAwQTAsMHgwMEMwLDB4MDBDMywweDAwRDUsMHgwMTUyLDB4MDE1MywKKyAgICAweDIwMTMsMHgyMDE0LDB4MjAxQywweDIwMUQsMHgyMDE4LDB4MjAxOSwweDAwRjcsMHgyNUNBLAorICAgIDB4MDBGRiwweDAxNzgsMHgyMDQ0LDB4MjBBQywweDIwMzksMHgyMDNBLDB4RkIwMSwweEZCMDIsCisgICAgMHgyMDIxLDB4MDBCNywweDIwMUEsMHgyMDFFLDB4MjAzMCwweDAwQzIsMHgwMENBLDB4MDBDMSwKKyAgICAweDAwQ0IsMHgwMEM4LDB4MDBDRCwweDAwQ0UsMHgwMENGLDB4MDBDQywweDAwRDMsMHgwMEQ0LAorICAgIDB4RjhGRiwweDAwRDIsMHgwMERBLDB4MDBEQiwweDAwRDksMHgwMTMxLDB4MDJDNiwweDAyREMsCisgICAgMHgwMEFGLDB4MDJEOCwweDAyRDksMHgwMkRBLDB4MDBCOCwweDAyREQsMHgwMkRCLDB4MDJDNywKK307CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfbWFjX3N0cmluZyhNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZHN0LCBpbnQgZHN0bGVuKQoreworICAgIGNoYXIgKnAgPSBkc3Q7CisgICAgY2hhciAqZW5kID0gZHN0K2RzdGxlbi0xOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgdCwgYyA9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAoYyA8IDB4ODAgJiYgcCA8IGVuZCkKKyAgICAgICAgICAgICpwKysgPSBjOworICAgICAgICBlbHNlIGlmIChwIDwgZW5kKQorICAgICAgICAgICAgUFVUX1VURjgobWFjX3RvX3VuaWNvZGVbYy0weDgwXSwgdCwgaWYgKHAgPCBlbmQpICpwKysgPSB0Oyk7CisgICAgfQorICAgICpwID0gMDsKKyAgICByZXR1cm4gcCAtIGRzdDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9jb3ZyKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgaW50IHR5cGUsIGludCBsZW4pCit7CisgICAgQVZQYWNrZXQgcGt0OworICAgIEFWU3RyZWFtICpzdDsKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICBlbnVtIEFWQ29kZWNJRCBpZDsKKyAgICBpbnQgcmV0OworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAweGQ6ICBpZCA9IEFWX0NPREVDX0lEX01KUEVHOyBicmVhazsKKyAgICBjYXNlIDB4ZTogIGlkID0gQVZfQ09ERUNfSURfUE5HOyAgIGJyZWFrOworICAgIGNhc2UgMHgxYjogaWQgPSBBVl9DT0RFQ19JRF9CTVA7ICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgIlVua25vd24gY292ZXIgdHlwZTogMHgleC5cbiIsIHR5cGUpOworICAgICAgICBhdmlvX3NraXAocGIsIGxlbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjLT5mYywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzYyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzYykpOworICAgIGlmICghc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPnByaXZfZGF0YSA9IHNjOworCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgJnBrdCwgbGVuKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHN0LT5kaXNwb3NpdGlvbiAgICAgICAgICAgICAgfD0gQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDOworCisgICAgc3QtPmF0dGFjaGVkX3BpYyAgICAgICAgICAgICAgPSBwa3Q7CisgICAgc3QtPmF0dGFjaGVkX3BpYy5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgc3QtPmF0dGFjaGVkX3BpYy5mbGFncyAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gaWQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfbWV0YWRhdGFfcmF3KE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4sIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBjaGFyICp2YWx1ZSA9IGF2X21hbGxvYyhsZW4gKyAxKTsKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2aW9fcmVhZChwYiwgdmFsdWUsIGxlbik7CisgICAgdmFsdWVbbGVuXSA9IDA7CisgICAgcmV0dXJuIGF2X2RpY3Rfc2V0KCZjLT5mYy0+bWV0YWRhdGEsIGtleSwgdmFsdWUsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKK30KKworc3RhdGljIGludCBtb3ZfbWV0YWRhdGFfbG9jaShNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIHVuc2lnbmVkIGxlbikKK3sKKyAgICBjaGFyIGxhbmd1YWdlWzRdID0geyAwIH07CisgICAgY2hhciBidWZbMTAwXTsKKyAgICB1aW50MTZfdCBsYW5nY29kZSA9IDA7CisgICAgZG91YmxlIGxvbmdpdHVkZSwgbGF0aXR1ZGU7CisgICAgY29uc3QgY2hhciAqa2V5ID0gImxvY2F0aW9uIjsKKworICAgIGlmIChsZW4gPCA0ICsgMiArIDEgKyAxICsgNCArIDQgKyA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2aW9fc2tpcChwYiwgNCk7IC8vIHZlcnNpb24rZmxhZ3MKKyAgICBsYW5nY29kZSA9IGF2aW9fcmIxNihwYik7CisgICAgZmZfbW92X2xhbmdfdG9faXNvNjM5KGxhbmdjb2RlLCBsYW5ndWFnZSk7CisgICAgbGVuIC09IDY7CisKKyAgICBsZW4gLT0gYXZpb19nZXRfc3RyKHBiLCBsZW4sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOyAvLyBwbGFjZSBuYW1lCisgICAgaWYgKGxlbiA8IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGF2aW9fc2tpcChwYiwgMSk7IC8vIHJvbGUKKyAgICBsZW4gLT0gMTsKKworICAgIGlmIChsZW4gPCAxNCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgbG9uZ2l0dWRlID0gKChpbnQzMl90KSBhdmlvX3JiMzIocGIpKSAvIChmbG9hdCkgKDEgPDwgMTYpOworICAgIGxhdGl0dWRlICA9ICgoaW50MzJfdCkgYXZpb19yYjMyKHBiKSkgLyAoZmxvYXQpICgxIDw8IDE2KTsKKworICAgIC8vIFRyeSB0byBvdXRwdXQgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSA/eHl6IGZpZWxkCisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUrMDguNGYlKzA5LjRmLyIsIGxhdGl0dWRlLCBsb25naXR1ZGUpOworICAgIGlmICgqbGFuZ3VhZ2UgJiYgc3RyY21wKGxhbmd1YWdlLCAidW5kIikpIHsKKyAgICAgICAgY2hhciBrZXkyWzE2XTsKKyAgICAgICAgc25wcmludGYoa2V5Miwgc2l6ZW9mKGtleTIpLCAiJXMtJXMiLCBrZXksIGxhbmd1YWdlKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJmMtPmZjLT5tZXRhZGF0YSwga2V5MiwgYnVmLCAwKTsKKyAgICB9CisgICAgYy0+ZmMtPmV2ZW50X2ZsYWdzIHw9IEFWRk1UX0VWRU5UX0ZMQUdfTUVUQURBVEFfVVBEQVRFRDsKKyAgICByZXR1cm4gYXZfZGljdF9zZXQoJmMtPmZjLT5tZXRhZGF0YSwga2V5LCBidWYsIDApOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX3VkdGFfc3RyaW5nKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIGNoYXIgdG1wX2tleVs1XTsKKyAgICBjaGFyIGtleTJbMzJdLCBsYW5ndWFnZVs0XSA9IHswfTsKKyAgICBjaGFyICpzdHIgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKmtleSA9IE5VTEw7CisgICAgdWludDE2X3QgbGFuZ2NvZGUgPSAwOworICAgIHVpbnQzMl90IGRhdGFfdHlwZSA9IDAsIHN0cl9zaXplLCBzdHJfc2l6ZV9hbGxvYzsKKyAgICBpbnQgKCpwYXJzZSkoTU9WQ29udGV4dCosIEFWSU9Db250ZXh0KiwgdW5zaWduZWQsIGNvbnN0IGNoYXIqKSA9IE5VTEw7CisKKyAgICBzd2l0Y2ggKGF0b20udHlwZSkgeworICAgIGNhc2UgTUtUQUcoMHhhOSwnbicsJ2EnLCdtJyk6IGtleSA9ICJ0aXRsZSI7ICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKDB4YTksJ2EnLCd1JywndCcpOgorICAgIGNhc2UgTUtUQUcoMHhhOSwnQScsJ1InLCdUJyk6IGtleSA9ICJhcnRpc3QiOyAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCAnYScsJ0EnLCdSJywnVCcpOiBrZXkgPSAiYWxidW1fYXJ0aXN0IjsgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygweGE5LCd3JywncicsJ3QnKToga2V5ID0gImNvbXBvc2VyIjsgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoICdjJywncCcsJ2knLCdsJyk6IGtleSA9ICJjb21waWxhdGlvbiI7CisgICAgICAgIHBhcnNlID0gbW92X21ldGFkYXRhX2ludDhfbm9fcGFkZGluZzsgYnJlYWs7CisgICAgY2FzZSBNS1RBRyggJ2MnLCdwJywncicsJ3QnKToKKyAgICBjYXNlIE1LVEFHKDB4YTksJ2MnLCdwJywneScpOiBrZXkgPSAiY29weXJpZ2h0IjsgYnJlYWs7CisgICAgY2FzZSBNS1RBRygweGE5LCdnJywncicsJ3AnKToga2V5ID0gImdyb3VwaW5nIjsgYnJlYWs7CisgICAgY2FzZSBNS1RBRygweGE5LCdsJywneScsJ3InKToga2V5ID0gImx5cmljcyI7IGJyZWFrOworICAgIGNhc2UgTUtUQUcoMHhhOSwnYycsJ20nLCd0Jyk6CisgICAgY2FzZSBNS1RBRygweGE5LCdpJywnbicsJ2YnKToga2V5ID0gImNvbW1lbnQiOyAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoMHhhOSwnYScsJ2wnLCdiJyk6IGtleSA9ICJhbGJ1bSI7ICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKDB4YTksJ2QnLCdhJywneScpOiBrZXkgPSAiZGF0ZSI7ICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygweGE5LCdnJywnZScsJ24nKToga2V5ID0gImdlbnJlIjsgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoICdnJywnbicsJ3InLCdlJyk6IGtleSA9ICJnZW5yZSI7CisgICAgICAgIHBhcnNlID0gbW92X21ldGFkYXRhX2ducmU7IGJyZWFrOworICAgIGNhc2UgTUtUQUcoMHhhOSwndCcsJ28nLCdvJyk6CisgICAgY2FzZSBNS1RBRygweGE5LCdzJywndycsJ3InKToga2V5ID0gImVuY29kZXIiOyAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoMHhhOSwnZScsJ24nLCdjJyk6IGtleSA9ICJlbmNvZGVyIjsgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKDB4YTksJ20nLCdhJywnaycpOiBrZXkgPSAibWFrZSI7ICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygweGE5LCdtJywnbycsJ2QnKToga2V5ID0gIm1vZGVsIjsgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoMHhhOSwneCcsJ3knLCd6Jyk6IGtleSA9ICJsb2NhdGlvbiI7ICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCAnZCcsJ2UnLCdzJywnYycpOiBrZXkgPSAiZGVzY3JpcHRpb24iO2JyZWFrOworICAgIGNhc2UgTUtUQUcoICdsJywnZCcsJ2UnLCdzJyk6IGtleSA9ICJzeW5vcHNpcyI7ICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCAndCcsJ3YnLCdzJywnaCcpOiBrZXkgPSAic2hvdyI7ICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRyggJ3QnLCd2JywnZScsJ24nKToga2V5ID0gImVwaXNvZGVfaWQiO2JyZWFrOworICAgIGNhc2UgTUtUQUcoICd0JywndicsJ24nLCduJyk6IGtleSA9ICJuZXR3b3JrIjsgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCAndCcsJ3InLCdrJywnbicpOiBrZXkgPSAidHJhY2siOworICAgICAgICBwYXJzZSA9IG1vdl9tZXRhZGF0YV90cmFja19vcl9kaXNjX251bWJlcjsgYnJlYWs7CisgICAgY2FzZSBNS1RBRyggJ2QnLCdpJywncycsJ2snKToga2V5ID0gImRpc2MiOworICAgICAgICBwYXJzZSA9IG1vdl9tZXRhZGF0YV90cmFja19vcl9kaXNjX251bWJlcjsgYnJlYWs7CisgICAgY2FzZSBNS1RBRyggJ3QnLCd2JywnZScsJ3MnKToga2V5ID0gImVwaXNvZGVfc29ydCI7CisgICAgICAgIHBhcnNlID0gbW92X21ldGFkYXRhX2ludDhfYnlwYXNzX3BhZGRpbmc7IGJyZWFrOworICAgIGNhc2UgTUtUQUcoICd0JywndicsJ3MnLCduJyk6IGtleSA9ICJzZWFzb25fbnVtYmVyIjsKKyAgICAgICAgcGFyc2UgPSBtb3ZfbWV0YWRhdGFfaW50OF9ieXBhc3NfcGFkZGluZzsgYnJlYWs7CisgICAgY2FzZSBNS1RBRyggJ3MnLCd0JywnaScsJ2snKToga2V5ID0gIm1lZGlhX3R5cGUiOworICAgICAgICBwYXJzZSA9IG1vdl9tZXRhZGF0YV9pbnQ4X25vX3BhZGRpbmc7IGJyZWFrOworICAgIGNhc2UgTUtUQUcoICdoJywnZCcsJ3YnLCdkJyk6IGtleSA9ICJoZF92aWRlbyI7CisgICAgICAgIHBhcnNlID0gbW92X21ldGFkYXRhX2ludDhfbm9fcGFkZGluZzsgYnJlYWs7CisgICAgY2FzZSBNS1RBRyggJ3AnLCdnJywnYScsJ3AnKToga2V5ID0gImdhcGxlc3NfcGxheWJhY2siOworICAgICAgICBwYXJzZSA9IG1vdl9tZXRhZGF0YV9pbnQ4X25vX3BhZGRpbmc7IGJyZWFrOworICAgIGNhc2UgTUtUQUcoICdAJywnUCcsJ1InLCdNJyk6CisgICAgICAgIHJldHVybiBtb3ZfbWV0YWRhdGFfcmF3KGMsIHBiLCBhdG9tLnNpemUsICJwcmVtaWVyZV92ZXJzaW9uIik7CisgICAgY2FzZSBNS1RBRyggJ0AnLCdQJywnUicsJ1EnKToKKyAgICAgICAgcmV0dXJuIG1vdl9tZXRhZGF0YV9yYXcoYywgcGIsIGF0b20uc2l6ZSwgInF1aWNrdGltZV92ZXJzaW9uIik7CisgICAgY2FzZSBNS1RBRyggJ2wnLCdvJywnYycsJ2knKToKKyAgICAgICAgcmV0dXJuIG1vdl9tZXRhZGF0YV9sb2NpKGMsIHBiLCBhdG9tLnNpemUpOworICAgIGNhc2UgTUtUQUcoICdYJywnTScsJ1AnLCdfJyk6CisgICAgICAgIHJldHVybiBtb3ZfbWV0YWRhdGFfcmF3KGMsIHBiLCBhdG9tLnNpemUsICJ4bXAiKTsKKyAgICB9CisKKyAgICBpZiAoYy0+aXR1bmVzX21ldGFkYXRhICYmIGF0b20uc2l6ZSA+IDgpIHsKKyAgICAgICAgaW50IGRhdGFfc2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGludCB0YWcgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAodGFnID09IE1LVEFHKCdkJywnYScsJ3QnLCdhJykpIHsKKyAgICAgICAgICAgIGRhdGFfdHlwZSA9IGF2aW9fcmIzMihwYik7IC8vIHR5cGUKKyAgICAgICAgICAgIGF2aW9fcmIzMihwYik7IC8vIHVua25vd24KKyAgICAgICAgICAgIHN0cl9zaXplID0gZGF0YV9zaXplIC0gMTY7CisgICAgICAgICAgICBhdG9tLnNpemUgLT0gMTY7CisKKyAgICAgICAgICAgIGlmIChhdG9tLnR5cGUgPT0gTUtUQUcoJ2MnLCAnbycsICd2JywgJ3InKSkgeworICAgICAgICAgICAgICAgIGludCByZXQgPSBtb3ZfcmVhZF9jb3ZyKGMsIHBiLCBkYXRhX3R5cGUsIHN0cl9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgY292ZXIgYXJ0LlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKGF0b20uc2l6ZSA+IDQgJiYga2V5ICYmICFjLT5pdHVuZXNfbWV0YWRhdGEpIHsKKyAgICAgICAgc3RyX3NpemUgPSBhdmlvX3JiMTYocGIpOyAvLyBzdHJpbmcgbGVuZ3RoCisgICAgICAgIGxhbmdjb2RlID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgZmZfbW92X2xhbmdfdG9faXNvNjM5KGxhbmdjb2RlLCBsYW5ndWFnZSk7CisgICAgICAgIGF0b20uc2l6ZSAtPSA0OworICAgIH0gZWxzZQorICAgICAgICBzdHJfc2l6ZSA9IGF0b20uc2l6ZTsKKworICAgIGlmIChjLT5leHBvcnRfYWxsICYmICFrZXkpIHsKKyAgICAgICAgc25wcmludGYodG1wX2tleSwgNSwgIiUuNHMiLCAoY2hhciopJmF0b20udHlwZSk7CisgICAgICAgIGtleSA9IHRtcF9rZXk7CisgICAgfQorCisgICAgaWYgKCFrZXkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhdG9tLnNpemUgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHN0cl9zaXplX2FsbG9jID0gc3RyX3NpemUgPDwgMTsgLy8gd29yc3QtY2FzZSByZXF1aXJlbWVudCBmb3Igb3V0cHV0IHN0cmluZyBpbiBjYXNlIG9mIHV0ZjggY29kZWQgaW5wdXQKKyAgICBzdHIgPSBhdl9tYWxsb2Moc3RyX3NpemVfYWxsb2MpOworICAgIGlmICghc3RyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKHBhcnNlKQorICAgICAgICBwYXJzZShjLCBwYiwgc3RyX3NpemUsIGtleSk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChkYXRhX3R5cGUgPT0gMyB8fCAoZGF0YV90eXBlID09IDAgJiYgKGxhbmdjb2RlIDwgMHg0MDAgfHwgbGFuZ2NvZGUgPT0gMHg3ZmZmKSkpIHsgLy8gTUFDIEVuY29kZWQKKyAgICAgICAgICAgIG1vdl9yZWFkX21hY19zdHJpbmcoYywgcGIsIHN0cl9zaXplLCBzdHIsIHN0cl9zaXplX2FsbG9jKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCByZXQgPSBhdmlvX3JlYWQocGIsIHN0ciwgc3RyX3NpemUpOworICAgICAgICAgICAgaWYgKHJldCAhPSBzdHJfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzdHIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cltzdHJfc2l6ZV0gPSAwOworICAgICAgICB9CisgICAgICAgIGMtPmZjLT5ldmVudF9mbGFncyB8PSBBVkZNVF9FVkVOVF9GTEFHX01FVEFEQVRBX1VQREFURUQ7CisgICAgICAgIGF2X2RpY3Rfc2V0KCZjLT5mYy0+bWV0YWRhdGEsIGtleSwgc3RyLCAwKTsKKyAgICAgICAgaWYgKCpsYW5ndWFnZSAmJiBzdHJjbXAobGFuZ3VhZ2UsICJ1bmQiKSkgeworICAgICAgICAgICAgc25wcmludGYoa2V5Miwgc2l6ZW9mKGtleTIpLCAiJXMtJXMiLCBrZXksIGxhbmd1YWdlKTsKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZjLT5mYy0+bWV0YWRhdGEsIGtleTIsIHN0ciwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZGxvZyhjLT5mYywgImxhbmcgXCIlM3NcIiAiLCBsYW5ndWFnZSk7CisgICAgYXZfZGxvZyhjLT5mYywgInRhZyBcIiVzXCIgdmFsdWUgXCIlc1wiIGF0b20gXCIlLjRzXCIgJWQgJSJQUklkNjQiXG4iLAorICAgICAgICAgICAga2V5LCBzdHIsIChjaGFyKikmYXRvbS50eXBlLCBzdHJfc2l6ZV9hbGxvYywgYXRvbS5zaXplKTsKKworICAgIGF2X2ZyZWVwKCZzdHIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX2NocGwoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgaW50NjRfdCBzdGFydDsKKyAgICBpbnQgaSwgbmJfY2hhcHRlcnMsIHN0cl9sZW4sIHZlcnNpb247CisgICAgY2hhciBzdHJbMjU2KzFdOworCisgICAgaWYgKChhdG9tLnNpemUgLT0gNSkgPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsKKyAgICBhdmlvX3JiMjQocGIpOworICAgIGlmICh2ZXJzaW9uKQorICAgICAgICBhdmlvX3JiMzIocGIpOyAvLyA/Pz8KKyAgICBuYl9jaGFwdGVycyA9IGF2aW9fcjgocGIpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX2NoYXB0ZXJzOyBpKyspIHsKKyAgICAgICAgaWYgKGF0b20uc2l6ZSA8IDkpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBzdGFydCA9IGF2aW9fcmI2NChwYik7CisgICAgICAgIHN0cl9sZW4gPSBhdmlvX3I4KHBiKTsKKworICAgICAgICBpZiAoKGF0b20uc2l6ZSAtPSA5K3N0cl9sZW4pIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGF2aW9fcmVhZChwYiwgc3RyLCBzdHJfbGVuKTsKKyAgICAgICAgc3RyW3N0cl9sZW5dID0gMDsKKyAgICAgICAgYXZwcml2X25ld19jaGFwdGVyKGMtPmZjLCBpLCAoQVZSYXRpb25hbCl7MSwxMDAwMDAwMH0sIHN0YXJ0LCBBVl9OT1BUU19WQUxVRSwgc3RyKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUlOX0RBVEFfRU5UUllfQk9YX1NJWkUgMTIKK3N0YXRpYyBpbnQgbW92X3JlYWRfZHJlZihNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7CisgICAgaW50IGVudHJpZXMsIGksIGo7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOworICAgIHNjID0gc3QtPnByaXZfZGF0YTsKKworICAgIGF2aW9fcmIzMihwYik7IC8vIHZlcnNpb24gKyBmbGFncworICAgIGVudHJpZXMgPSBhdmlvX3JiMzIocGIpOworICAgIGlmIChlbnRyaWVzID4gIChhdG9tLnNpemUgLSAxKSAvIE1JTl9EQVRBX0VOVFJZX0JPWF9TSVpFICsgMSB8fAorICAgICAgICBlbnRyaWVzID49IFVJTlRfTUFYIC8gc2l6ZW9mKCpzYy0+ZHJlZnMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBhdl9mcmVlKHNjLT5kcmVmcyk7CisgICAgc2MtPmRyZWZzX2NvdW50ID0gMDsKKyAgICBzYy0+ZHJlZnMgPSBhdl9tYWxsb2N6KGVudHJpZXMgKiBzaXplb2YoKnNjLT5kcmVmcykpOworICAgIGlmICghc2MtPmRyZWZzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHNjLT5kcmVmc19jb3VudCA9IGVudHJpZXM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2MtPmRyZWZzX2NvdW50OyBpKyspIHsKKyAgICAgICAgTU9WRHJlZiAqZHJlZiA9ICZzYy0+ZHJlZnNbaV07CisgICAgICAgIHVpbnQzMl90IHNpemUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBpbnQ2NF90IG5leHQgPSBhdmlvX3RlbGwocGIpICsgc2l6ZSAtIDQ7CisKKyAgICAgICAgaWYgKHNpemUgPCAxMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGRyZWYtPnR5cGUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBhdmlvX3JiMzIocGIpOyAvLyB2ZXJzaW9uICsgZmxhZ3MKKyAgICAgICAgYXZfZGxvZyhjLT5mYywgInR5cGUgJS40cyBzaXplICVkXG4iLCAoY2hhciopJmRyZWYtPnR5cGUsIHNpemUpOworCisgICAgICAgIGlmIChkcmVmLT50eXBlID09IE1LVEFHKCdhJywnbCcsJ2knLCdzJykgJiYgc2l6ZSA+IDE1MCkgeworICAgICAgICAgICAgLyogbWFjaW50b3NoIGFsaWFzIHJlY29yZCAqLworICAgICAgICAgICAgdWludDE2X3Qgdm9sdW1lX2xlbiwgbGVuOworICAgICAgICAgICAgaW50MTZfdCB0eXBlOworCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDEwKTsKKworICAgICAgICAgICAgdm9sdW1lX2xlbiA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgdm9sdW1lX2xlbiA9IEZGTUlOKHZvbHVtZV9sZW4sIDI3KTsKKyAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgZHJlZi0+dm9sdW1lLCAyNyk7CisgICAgICAgICAgICBkcmVmLT52b2x1bWVbdm9sdW1lX2xlbl0gPSAwOworICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfREVCVUcsICJ2b2x1bWUgJXMsIGxlbiAlZFxuIiwgZHJlZi0+dm9sdW1lLCB2b2x1bWVfbGVuKTsKKworICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxMik7CisKKyAgICAgICAgICAgIGxlbiA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgbGVuID0gRkZNSU4obGVuLCA2Myk7CisgICAgICAgICAgICBhdmlvX3JlYWQocGIsIGRyZWYtPmZpbGVuYW1lLCA2Myk7CisgICAgICAgICAgICBkcmVmLT5maWxlbmFtZVtsZW5dID0gMDsKKyAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiZmlsZW5hbWUgJXMsIGxlbiAlZFxuIiwgZHJlZi0+ZmlsZW5hbWUsIGxlbik7CisKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMTYpOworCisgICAgICAgICAgICAvKiByZWFkIG5leHQgbGV2ZWwgdXBfZnJvbV9hbGlhcy9kb3duX3RvX3RhcmdldCAqLworICAgICAgICAgICAgZHJlZi0+bmx2bF9mcm9tID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIGRyZWYtPm5sdmxfdG8gICA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19ERUJVRywgIm5sdmwgZnJvbSAlZCwgbmx2bCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBkcmVmLT5ubHZsX2Zyb20sIGRyZWYtPm5sdmxfdG8pOworCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDE2KTsKKworICAgICAgICAgICAgZm9yICh0eXBlID0gMDsgdHlwZSAhPSAtMSAmJiBhdmlvX3RlbGwocGIpIDwgbmV4dDsgKSB7CisgICAgICAgICAgICAgICAgaWYoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAgICAgICAgIHR5cGUgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgICAgIGxlbiA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfREVCVUcsICJ0eXBlICVkLCBsZW4gJWRcbiIsIHR5cGUsIGxlbik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiYxKQorICAgICAgICAgICAgICAgICAgICBsZW4gKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAyKSB7IC8vIGFic29sdXRlIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShkcmVmLT5wYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgZHJlZi0+cGF0aCA9IGF2X21hbGxvY3oobGVuKzEpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWRyZWYtPnBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBhdmlvX3JlYWQocGIsIGRyZWYtPnBhdGgsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiB2b2x1bWVfbGVuICYmICFzdHJuY21wKGRyZWYtPnBhdGgsIGRyZWYtPnZvbHVtZSwgdm9sdW1lX2xlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSB2b2x1bWVfbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtbW92ZShkcmVmLT5wYXRoLCBkcmVmLT5wYXRoK3ZvbHVtZV9sZW4sIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkcmVmLT5wYXRoW2xlbl0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmVmLT5wYXRoW2pdID09ICc6JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmVmLT5wYXRoW2pdID0gJy8nOworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19ERUJVRywgInBhdGggJXNcbiIsIGRyZWYtPnBhdGgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAwKSB7IC8vIGRpcmVjdG9yeSBuYW1lCisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUoZHJlZi0+ZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgZHJlZi0+ZGlyID0gYXZfbWFsbG9jKGxlbisxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkcmVmLT5kaXIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBkcmVmLT5kaXIsIGxlbikgIT0gbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIGRyZWYtPmRpcltsZW5dID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyZWYtPmRpcltqXSA9PSAnOicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJlZi0+ZGlyW2pdID0gJy8nOworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19ERUJVRywgImRpciAlc1xuIiwgZHJlZi0+ZGlyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2aW9fc2VlayhwYiwgbmV4dCwgU0VFS19TRVQpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9oZGxyKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIHVpbnQzMl90IGF2X3VudXNlZCBjdHlwZTsKKyAgICBpbnQgdGl0bGVfc2l6ZTsKKyAgICBjaGFyICp0aXRsZV9zdHI7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKSAvLyBtZXRhIGJlZm9yZSBmaXJzdCB0cmFrCisgICAgICAgIHJldHVybiAwOworCisgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKKworICAgIGF2aW9fcjgocGIpOyAvKiB2ZXJzaW9uICovCisgICAgYXZpb19yYjI0KHBiKTsgLyogZmxhZ3MgKi8KKworICAgIC8qIGNvbXBvbmVudCB0eXBlICovCisgICAgY3R5cGUgPSBhdmlvX3JsMzIocGIpOworICAgIHR5cGUgPSBhdmlvX3JsMzIocGIpOyAvKiBjb21wb25lbnQgc3VidHlwZSAqLworCisgICAgYXZfZGxvZyhjLT5mYywgImN0eXBlPSAlLjRzICgweCUwOHgpXG4iLCAoY2hhciopJmN0eXBlLCBjdHlwZSk7CisgICAgYXZfZGxvZyhjLT5mYywgInN0eXBlPSAlLjRzXG4iLCAoY2hhciopJnR5cGUpOworCisgICAgaWYgICAgICh0eXBlID09IE1LVEFHKCd2JywnaScsJ2QnLCdlJykpCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBlbHNlIGlmICh0eXBlID09IE1LVEFHKCdzJywnbycsJ3UnLCduJykpCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBlbHNlIGlmICh0eXBlID09IE1LVEFHKCdtJywnMScsJ2EnLCcgJykpCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUDI7CisgICAgZWxzZSBpZiAoKHR5cGUgPT0gTUtUQUcoJ3MnLCd1JywnYicsJ3AnKSkgfHwgKHR5cGUgPT0gTUtUQUcoJ2MnLCdsJywnYycsJ3AnKSkpCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKworICAgIGF2aW9fcmIzMihwYik7IC8qIGNvbXBvbmVudCAgbWFudWZhY3R1cmUgKi8KKyAgICBhdmlvX3JiMzIocGIpOyAvKiBjb21wb25lbnQgZmxhZ3MgKi8KKyAgICBhdmlvX3JiMzIocGIpOyAvKiBjb21wb25lbnQgZmxhZ3MgbWFzayAqLworCisgICAgdGl0bGVfc2l6ZSA9IGF0b20uc2l6ZSAtIDI0OworICAgIGlmICh0aXRsZV9zaXplID4gMCkgeworICAgICAgICB0aXRsZV9zdHIgPSBhdl9tYWxsb2ModGl0bGVfc2l6ZSArIDEpOyAvKiBBZGQgbnVsbCB0ZXJtaW5hdG9yICovCisgICAgICAgIGlmICghdGl0bGVfc3RyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZpb19yZWFkKHBiLCB0aXRsZV9zdHIsIHRpdGxlX3NpemUpOworICAgICAgICB0aXRsZV9zdHJbdGl0bGVfc2l6ZV0gPSAwOworICAgICAgICBpZiAodGl0bGVfc3RyWzBdKQorICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgImhhbmRsZXJfbmFtZSIsIHRpdGxlX3N0ciArCisgICAgICAgICAgICAgICAgICAgICAgICAoIWMtPmlzb20gJiYgdGl0bGVfc3RyWzBdID09IHRpdGxlX3NpemUgLSAxKSwgMCk7CisgICAgICAgIGF2X2ZyZWVwKCZ0aXRsZV9zdHIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfbW92X3JlYWRfZXNkcyhBVkZvcm1hdENvbnRleHQgKmZjLCBBVklPQ29udGV4dCAqcGIpCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCB0YWc7CisKKyAgICBpZiAoZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGZjLT5zdHJlYW1zW2ZjLT5uYl9zdHJlYW1zLTFdOworCisgICAgYXZpb19yYjMyKHBiKTsgLyogdmVyc2lvbiArIGZsYWdzICovCisgICAgZmZfbXA0X3JlYWRfZGVzY3IoZmMsIHBiLCAmdGFnKTsKKyAgICBpZiAodGFnID09IE1QNEVTRGVzY3JUYWcpIHsKKyAgICAgICAgZmZfbXA0X3BhcnNlX2VzX2Rlc2NyKHBiLCBOVUxMKTsKKyAgICB9IGVsc2UKKyAgICAgICAgYXZpb19yYjE2KHBiKTsgLyogSUQgKi8KKworICAgIGZmX21wNF9yZWFkX2Rlc2NyKGZjLCBwYiwgJnRhZyk7CisgICAgaWYgKHRhZyA9PSBNUDREZWNDb25maWdEZXNjclRhZykKKyAgICAgICAgZmZfbXA0X3JlYWRfZGVjX2NvbmZpZ19kZXNjcihmYywgc3QsIHBiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9lc2RzKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIHJldHVybiBmZl9tb3ZfcmVhZF9lc2RzKGMtPmZjLCBwYik7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfZGFjMyhNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IGFjM2luZm8sIGFjbW9kLCBsZmVvbiwgYnNtb2Q7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOworCisgICAgYWMzaW5mbyA9IGF2aW9fcmIyNChwYik7CisgICAgYnNtb2QgPSAoYWMzaW5mbyA+PiAxNCkgJiAweDc7CisgICAgYWNtb2QgPSAoYWMzaW5mbyA+PiAxMSkgJiAweDc7CisgICAgbGZlb24gPSAoYWMzaW5mbyA+PiAxMCkgJiAweDE7CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9ICgoaW50W10pezIsMSwyLDMsMyw0LDQsNX0pW2FjbW9kXSArIGxmZW9uOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBhdnByaXZfYWMzX2NoYW5uZWxfbGF5b3V0X3RhYlthY21vZF07CisgICAgaWYgKGxmZW9uKQorICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0IHw9IEFWX0NIX0xPV19GUkVRVUVOQ1k7CisgICAgc3QtPmNvZGVjLT5hdWRpb19zZXJ2aWNlX3R5cGUgPSBic21vZDsKKyAgICBpZiAoc3QtPmNvZGVjLT5jaGFubmVscyA+IDEgJiYgYnNtb2QgPT0gMHg3KQorICAgICAgICBzdC0+Y29kZWMtPmF1ZGlvX3NlcnZpY2VfdHlwZSA9IEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9LQVJBT0tFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfZGVjMyhNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IGVhYzNpbmZvLCBhY21vZCwgbGZlb24sIGJzbW9kOworCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKKworICAgIC8qIE5vIG5lZWQgdG8gcGFyc2UgZmllbGRzIGZvciBhZGRpdGlvbmFsIGluZGVwZW5kZW50IHN1YnN0cmVhbXMgYW5kIGl0cworICAgICAqIGFzc29jaWF0ZWQgZGVwZW5kZW50IHN1YnN0cmVhbXMgc2luY2UgbGliYXZjb2RlYydzIEUtQUMtMyBkZWNvZGVyCisgICAgICogZG9lcyBub3Qgc3VwcG9ydCB0aGVtIHlldC4gKi8KKyAgICBhdmlvX3JiMTYocGIpOyAvKiBkYXRhX3JhdGUgYW5kIG51bV9pbmRfc3ViICovCisgICAgZWFjM2luZm8gPSBhdmlvX3JiMjQocGIpOworICAgIGJzbW9kID0gKGVhYzNpbmZvID4+IDEyKSAmIDB4MWY7CisgICAgYWNtb2QgPSAoZWFjM2luZm8gPj4gIDkpICYgMHg3OworICAgIGxmZW9uID0gKGVhYzNpbmZvID4+ICA4KSAmIDB4MTsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gYXZwcml2X2FjM19jaGFubmVsX2xheW91dF90YWJbYWNtb2RdOworICAgIGlmIChsZmVvbikKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCB8PSBBVl9DSF9MT1dfRlJFUVVFTkNZOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCk7CisgICAgc3QtPmNvZGVjLT5hdWRpb19zZXJ2aWNlX3R5cGUgPSBic21vZDsKKyAgICBpZiAoc3QtPmNvZGVjLT5jaGFubmVscyA+IDEgJiYgYnNtb2QgPT0gMHg3KQorICAgICAgICBzdC0+Y29kZWMtPmF1ZGlvX3NlcnZpY2VfdHlwZSA9IEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9LQVJBT0tFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfY2hhbihNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOworCisgICAgaWYgKGF0b20uc2l6ZSA8IDE2KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHNraXAgdmVyc2lvbiBhbmQgZmxhZ3MgKi8KKyAgICBhdmlvX3NraXAocGIsIDQpOworCisgICAgZmZfbW92X3JlYWRfY2hhbihjLT5mYywgcGIsIHN0LCBhdG9tLnNpemUgLSA0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX3dmZXgoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCByZXQ7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfd2F2X2hlYWRlcihwYiwgc3QtPmNvZGVjLCBhdG9tLnNpemUpKSA8IDApCisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1dBUk5JTkcsICJnZXRfd2F2X2hlYWRlciBmYWlsZWRcbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9wYXNwKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIGNvbnN0IGludCBudW0gPSBhdmlvX3JiMzIocGIpOworICAgIGNvbnN0IGludCBkZW4gPSBhdmlvX3JiMzIocGIpOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpCisgICAgICAgIHJldHVybiAwOworICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMtMV07CisKKyAgICBpZiAoKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAhPSAxIHx8IHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkgJiYgLy8gZGVmYXVsdAorICAgICAgICAoZGVuICE9IHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiB8fCBudW0gIT0gc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKSkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgInNhbXBsZSBhc3BlY3QgcmF0aW8gYWxyZWFkeSBzZXQgdG8gJWQ6JWQsIGlnbm9yaW5nICdwYXNwJyBhdG9tICglZDolZClcbiIsCisgICAgICAgICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgIG51bSwgZGVuKTsKKyAgICB9IGVsc2UgaWYgKGRlbiAhPSAwKSB7CisgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA9IG51bTsKKyAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gZGVuOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogdGhpcyBhdG9tIGNvbnRhaW5zIGFjdHVhbCBtZWRpYSBkYXRhICovCitzdGF0aWMgaW50IG1vdl9yZWFkX21kYXQoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgaWYgKGF0b20uc2l6ZSA9PSAwKSAvKiB3cm9uZyBvbmUgKE1QNCkgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgYy0+Zm91bmRfbWRhdD0xOworICAgIHJldHVybiAwOyAvKiBub3cgZ28gZm9yIG1vb3YgKi8KK30KKworLyogcmVhZCBtYWpvciBicmFuZCwgbWlub3IgdmVyc2lvbiBhbmQgY29tcGF0aWJsZSBicmFuZHMgYW5kIHN0b3JlIHRoZW0gYXMgbWV0YWRhdGEgKi8KK3N0YXRpYyBpbnQgbW92X3JlYWRfZnR5cChNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICB1aW50MzJfdCBtaW5vcl92ZXI7CisgICAgaW50IGNvbXBfYnJhbmRfc2l6ZTsKKyAgICBjaGFyKiBjb21wX2JyYW5kc19zdHI7CisgICAgdWludDhfdCB0eXBlWzVdID0gezB9OworCisgICAgYXZpb19yZWFkKHBiLCB0eXBlLCA0KTsKKyAgICBpZiAoc3RyY21wKHR5cGUsICJxdCAgIikpCisgICAgICAgIGMtPmlzb20gPSAxOworICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiSVNPOiBGaWxlIFR5cGUgTWFqb3IgQnJhbmQ6ICUuNHNcbiIsKGNoYXIgKikmdHlwZSk7CisgICAgYXZfZGljdF9zZXQoJmMtPmZjLT5tZXRhZGF0YSwgIm1ham9yX2JyYW5kIiwgdHlwZSwgMCk7CisgICAgbWlub3JfdmVyID0gYXZpb19yYjMyKHBiKTsgLyogbWlub3IgdmVyc2lvbiAqLworICAgIGF2X2RpY3Rfc2V0X2ludCgmYy0+ZmMtPm1ldGFkYXRhLCAibWlub3JfdmVyc2lvbiIsIG1pbm9yX3ZlciwgMCk7CisKKyAgICBjb21wX2JyYW5kX3NpemUgPSBhdG9tLnNpemUgLSA4OworICAgIGlmIChjb21wX2JyYW5kX3NpemUgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBjb21wX2JyYW5kc19zdHIgPSBhdl9tYWxsb2MoY29tcF9icmFuZF9zaXplICsgMSk7IC8qIEFkZCBudWxsIHRlcm1pbmF0b3IgKi8KKyAgICBpZiAoIWNvbXBfYnJhbmRzX3N0cikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdmlvX3JlYWQocGIsIGNvbXBfYnJhbmRzX3N0ciwgY29tcF9icmFuZF9zaXplKTsKKyAgICBjb21wX2JyYW5kc19zdHJbY29tcF9icmFuZF9zaXplXSA9IDA7CisgICAgYXZfZGljdF9zZXQoJmMtPmZjLT5tZXRhZGF0YSwgImNvbXBhdGlibGVfYnJhbmRzIiwgY29tcF9icmFuZHNfc3RyLCAwKTsKKyAgICBhdl9mcmVlcCgmY29tcF9icmFuZHNfc3RyKTsKKworICAgIHJldHVybiAwOworfQorCisvKiB0aGlzIGF0b20gc2hvdWxkIGNvbnRhaW4gYWxsIGhlYWRlciBhdG9tcyAqLworc3RhdGljIGludCBtb3ZfcmVhZF9tb292KE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoYy0+Zm91bmRfbW9vdikgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiRm91bmQgZHVwbGljYXRlZCBNT09WIEF0b20uIFNraXBwZWQgaXRcbiIpOworICAgICAgICBhdmlvX3NraXAocGIsIGF0b20uc2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgocmV0ID0gbW92X3JlYWRfZGVmYXVsdChjLCBwYiwgYXRvbSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAvKiB3ZSBwYXJzZWQgdGhlICdtb292JyBhdG9tLCB3ZSBjYW4gdGVybWluYXRlIHRoZSBwYXJzaW5nIGFzIHNvb24gYXMgd2UgZmluZCB0aGUgJ21kYXQnICovCisgICAgLyogc28gd2UgZG9uJ3QgcGFyc2UgdGhlIHdob2xlIGZpbGUgaWYgb3ZlciBhIG5ldHdvcmsgKi8KKyAgICBjLT5mb3VuZF9tb292PTE7CisgICAgcmV0dXJuIDA7IC8qIG5vdyBnbyBmb3IgbWRhdCAqLworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX21vb2YoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgaWYgKCFjLT5oYXNfbG9va2VkX2Zvcl9tZnJhICYmIGMtPnVzZV9tZnJhX2ZvciA+IDApIHsKKyAgICAgICAgYy0+aGFzX2xvb2tlZF9mb3JfbWZyYSA9IDE7CisgICAgICAgIGlmIChwYi0+c2Vla2FibGUpIHsKKyAgICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19WRVJCT1NFLCAic3RyZWFtIGhhcyBtb29mIGJveGVzLCB3aWxsIGxvb2sgIgorICAgICAgICAgICAgICAgICAgICAiZm9yIGEgbWZyYVxuIik7CisgICAgICAgICAgICBpZiAoKHJldCA9IG1vdl9yZWFkX21mcmEoYywgcGIpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19WRVJCT1NFLCAiZm91bmQgYSBtb29mIGJveCBidXQgZmFpbGVkIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIHRoZSBtZnJhIChtYXkgYmUgYSBsaXZlIGlzbXYpXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1ZFUkJPU0UsICJmb3VuZCBhIG1vb2YgYm94IGJ1dCBzdHJlYW0gaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgInNlZWthYmxlLCBjYW4gbm90IGxvb2sgZm9yIG1mcmFcbiIpOworICAgICAgICB9CisgICAgfQorICAgIGMtPmZyYWdtZW50Lm1vb2Zfb2Zmc2V0ID0gYy0+ZnJhZ21lbnQuaW1wbGljaXRfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKSAtIDg7CisgICAgYXZfZGxvZyhjLT5mYywgIm1vb2Ygb2Zmc2V0ICUiUFJJeDY0IlxuIiwgYy0+ZnJhZ21lbnQubW9vZl9vZmZzZXQpOworICAgIHJldHVybiBtb3ZfcmVhZF9kZWZhdWx0KGMsIHBiLCBhdG9tKTsKK30KKworc3RhdGljIHZvaWQgbW92X21ldGFkYXRhX2NyZWF0aW9uX3RpbWUoQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEsIGludDY0X3QgdGltZSkKK3sKKyAgICBjaGFyIGJ1ZmZlclszMl07CisgICAgaWYgKHRpbWUpIHsKKyAgICAgICAgc3RydWN0IHRtICpwdG0sIHRtYnVmOworICAgICAgICB0aW1lX3QgdGltZXQ7CisgICAgICAgIGlmKHRpbWUgPj0gMjA4Mjg0NDgwMCkKKyAgICAgICAgICAgIHRpbWUgLT0gMjA4Mjg0NDgwMDsgIC8qIHNlY29uZHMgYmV0d2VlbiAxOTA0LTAxLTAxIGFuZCBFcG9jaCAqLworICAgICAgICB0aW1ldCA9IHRpbWU7CisgICAgICAgIHB0bSA9IGdtdGltZV9yKCZ0aW1ldCwgJnRtYnVmKTsKKyAgICAgICAgaWYgKCFwdG0pIHJldHVybjsKKyAgICAgICAgaWYgKHN0cmZ0aW1lKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlWS0lbS0lZCAlSDolTTolUyIsIHB0bSkpCisgICAgICAgICAgICBhdl9kaWN0X3NldChtZXRhZGF0YSwgImNyZWF0aW9uX3RpbWUiLCBidWZmZXIsIDApOworICAgIH0KK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9tZGhkKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICBpbnQgdmVyc2lvbjsKKyAgICBjaGFyIGxhbmd1YWdlWzRdID0gezB9OworICAgIHVuc2lnbmVkIGxhbmc7CisgICAgaW50NjRfdCBjcmVhdGlvbl90aW1lOworCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKKyAgICBzYyA9IHN0LT5wcml2X2RhdGE7CisKKyAgICBpZiAoc2MtPnRpbWVfc2NhbGUpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJNdWx0aXBsZSBtZGhkP1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsKKyAgICBpZiAodmVyc2lvbiA+IDEpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGMtPmZjLCAiVmVyc2lvbiAlZCIsIHZlcnNpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIGF2aW9fcmIyNChwYik7IC8qIGZsYWdzICovCisgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICBjcmVhdGlvbl90aW1lID0gYXZpb19yYjY0KHBiKTsKKyAgICAgICAgYXZpb19yYjY0KHBiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjcmVhdGlvbl90aW1lID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYXZpb19yYjMyKHBiKTsgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi8KKyAgICB9CisgICAgbW92X21ldGFkYXRhX2NyZWF0aW9uX3RpbWUoJnN0LT5tZXRhZGF0YSwgY3JlYXRpb25fdGltZSk7CisKKyAgICBzYy0+dGltZV9zY2FsZSA9IGF2aW9fcmIzMihwYik7CisgICAgc3QtPmR1cmF0aW9uID0gKHZlcnNpb24gPT0gMSkgPyBhdmlvX3JiNjQocGIpIDogYXZpb19yYjMyKHBiKTsgLyogZHVyYXRpb24gKi8KKworICAgIGxhbmcgPSBhdmlvX3JiMTYocGIpOyAvKiBsYW5ndWFnZSAqLworICAgIGlmIChmZl9tb3ZfbGFuZ190b19pc282MzkobGFuZywgbGFuZ3VhZ2UpKQorICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAibGFuZ3VhZ2UiLCBsYW5ndWFnZSwgMCk7CisgICAgYXZpb19yYjE2KHBiKTsgLyogcXVhbGl0eSAqLworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfbXZoZChNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBpbnQ2NF90IGNyZWF0aW9uX3RpbWU7CisgICAgaW50IHZlcnNpb24gPSBhdmlvX3I4KHBiKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fcmIyNChwYik7IC8qIGZsYWdzICovCisKKyAgICBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgIGNyZWF0aW9uX3RpbWUgPSBhdmlvX3JiNjQocGIpOworICAgICAgICBhdmlvX3JiNjQocGIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNyZWF0aW9uX3RpbWUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBtb2RpZmljYXRpb24gdGltZSAqLworICAgIH0KKyAgICBtb3ZfbWV0YWRhdGFfY3JlYXRpb25fdGltZSgmYy0+ZmMtPm1ldGFkYXRhLCBjcmVhdGlvbl90aW1lKTsKKyAgICBjLT50aW1lX3NjYWxlID0gYXZpb19yYjMyKHBiKTsgLyogdGltZSBzY2FsZSAqLworCisgICAgYXZfZGxvZyhjLT5mYywgInRpbWUgc2NhbGUgPSAlaVxuIiwgYy0+dGltZV9zY2FsZSk7CisKKyAgICBjLT5kdXJhdGlvbiA9ICh2ZXJzaW9uID09IDEpID8gYXZpb19yYjY0KHBiKSA6IGF2aW9fcmIzMihwYik7IC8qIGR1cmF0aW9uICovCisgICAgLy8gc2V0IHRoZSBBVkNvZGVjQ29udGV4dCBkdXJhdGlvbiBiZWNhdXNlIHRoZSBkdXJhdGlvbiBvZiBpbmRpdmlkdWFsIHRyYWNrcworICAgIC8vIG1heSBiZSBpbmFjY3VyYXRlCisgICAgaWYgKGMtPnRpbWVfc2NhbGUgPiAwICYmICFjLT50cmV4X2RhdGEpCisgICAgICAgIGMtPmZjLT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGUoYy0+ZHVyYXRpb24sIEFWX1RJTUVfQkFTRSwgYy0+dGltZV9zY2FsZSk7CisgICAgYXZpb19yYjMyKHBiKTsgLyogcHJlZmVycmVkIHNjYWxlICovCisKKyAgICBhdmlvX3JiMTYocGIpOyAvKiBwcmVmZXJyZWQgdm9sdW1lICovCisKKyAgICBhdmlvX3NraXAocGIsIDEwKTsgLyogcmVzZXJ2ZWQgKi8KKworICAgIGF2aW9fc2tpcChwYiwgMzYpOyAvKiBkaXNwbGF5IG1hdHJpeCAqLworCisgICAgYXZpb19yYjMyKHBiKTsgLyogcHJldmlldyB0aW1lICovCisgICAgYXZpb19yYjMyKHBiKTsgLyogcHJldmlldyBkdXJhdGlvbiAqLworICAgIGF2aW9fcmIzMihwYik7IC8qIHBvc3RlciB0aW1lICovCisgICAgYXZpb19yYjMyKHBiKTsgLyogc2VsZWN0aW9uIHRpbWUgKi8KKyAgICBhdmlvX3JiMzIocGIpOyAvKiBzZWxlY3Rpb24gZHVyYXRpb24gKi8KKyAgICBhdmlvX3JiMzIocGIpOyAvKiBjdXJyZW50IHRpbWUgKi8KKyAgICBhdmlvX3JiMzIocGIpOyAvKiBuZXh0IHRyYWNrIElEICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfZW5kYShNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IGxpdHRsZV9lbmRpYW47CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOworCisgICAgbGl0dGxlX2VuZGlhbiA9IGF2aW9fcmIxNihwYikgJiAweEZGOworICAgIGF2X2Rsb2coYy0+ZmMsICJlbmRhICVkXG4iLCBsaXR0bGVfZW5kaWFuKTsKKyAgICBpZiAobGl0dGxlX2VuZGlhbiA9PSAxKSB7CisgICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRCRToKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzI0TEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyQkU6CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MzMkxFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkJFOgorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9GMzJMRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRCRToKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fRjY0TEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX2NvbHIoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGNoYXIgY29sb3JfcGFyYW1ldGVyX3R5cGVbNV0gPSB7IDAgfTsKKyAgICBpbnQgY29sb3JfcHJpbWFyaWVzLCBjb2xvcl90cmMsIGNvbG9yX21hdHJpeDsKKworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpCisgICAgICAgIHJldHVybiAwOworICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMgLSAxXTsKKworICAgIGF2aW9fcmVhZChwYiwgY29sb3JfcGFyYW1ldGVyX3R5cGUsIDQpOworICAgIGlmIChzdHJuY21wKGNvbG9yX3BhcmFtZXRlcl90eXBlLCAibmNseCIsIDQpICYmCisgICAgICAgIHN0cm5jbXAoY29sb3JfcGFyYW1ldGVyX3R5cGUsICJuY2xjIiwgNCkpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgInVuc3VwcG9ydGVkIGNvbG9yX3BhcmFtZXRlcl90eXBlICVzXG4iLAorICAgICAgICAgICAgICAgY29sb3JfcGFyYW1ldGVyX3R5cGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb2xvcl9wcmltYXJpZXMgPSBhdmlvX3JiMTYocGIpOworICAgIGNvbG9yX3RyYyA9IGF2aW9fcmIxNihwYik7CisgICAgY29sb3JfbWF0cml4ID0gYXZpb19yYjE2KHBiKTsKKworICAgIGF2X2Rsb2coYy0+ZmMsICIlczogcHJpICVkIHRyYyAlZCBtYXRyaXggJWQiLAorICAgICAgICAgICAgY29sb3JfcGFyYW1ldGVyX3R5cGUsIGNvbG9yX3ByaW1hcmllcywgY29sb3JfdHJjLCBjb2xvcl9tYXRyaXgpOworCisgICAgaWYgKGMtPmlzb20pIHsKKyAgICAgICAgdWludDhfdCBjb2xvcl9yYW5nZSA9IGF2aW9fcjgocGIpID4+IDc7CisgICAgICAgIGF2X2Rsb2coYy0+ZmMsICIgZnVsbCAlIlBSSXU4IiIsIGNvbG9yX3JhbmdlKTsKKyAgICAgICAgaWYgKGNvbG9yX3JhbmdlKQorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29sb3JfcmFuZ2UgPSBBVkNPTF9SQU5HRV9NUEVHOworICAgICAgICAvKiAxNDQ5Ni0xMiByZWZlcmVuY2VzIEpQRUcgWFIgc3BlY3MgKHJhdGhlciB0aGFuIHRoZSBtb3JlIGNvbXBsZXRlCisgICAgICAgICAqIDIzMDAxLTgpIHNvIHNvbWUgYWRqdXN0aW5nIGlzIHJlcXVpcmVkICovCisgICAgICAgIGlmIChjb2xvcl9wcmltYXJpZXMgPj0gQVZDT0xfUFJJX0ZJTE0pCisgICAgICAgICAgICBjb2xvcl9wcmltYXJpZXMgPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQ7CisgICAgICAgIGlmICgoY29sb3JfdHJjID49IEFWQ09MX1RSQ19MSU5FQVIgJiYKKyAgICAgICAgICAgICBjb2xvcl90cmMgPD0gQVZDT0xfVFJDX0xPR19TUVJUKSB8fAorICAgICAgICAgICAgY29sb3JfdHJjID49IEFWQ09MX1RSQ19CVDIwMjBfMTApCisgICAgICAgICAgICBjb2xvcl90cmMgPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQ7CisgICAgICAgIGlmIChjb2xvcl9tYXRyaXggPj0gQVZDT0xfU1BDX0JUMjAyMF9OQ0wpCisgICAgICAgICAgICBjb2xvcl9tYXRyaXggPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQ7CisgICAgICAgIHN0LT5jb2RlYy0+Y29sb3JfcHJpbWFyaWVzID0gY29sb3JfcHJpbWFyaWVzOworICAgICAgICBzdC0+Y29kZWMtPmNvbG9yX3RyYyA9IGNvbG9yX3RyYzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2xvcnNwYWNlID0gY29sb3JfbWF0cml4OworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGNvbG9yIHByaW1hcmllcywgVGFibGUgNC00ICovCisgICAgICAgIHN3aXRjaCAoY29sb3JfcHJpbWFyaWVzKSB7CisgICAgICAgIGNhc2UgMTogc3QtPmNvZGVjLT5jb2xvcl9wcmltYXJpZXMgPSBBVkNPTF9QUklfQlQ3MDk7IGJyZWFrOworICAgICAgICBjYXNlIDU6IHN0LT5jb2RlYy0+Y29sb3JfcHJpbWFyaWVzID0gQVZDT0xfUFJJX1NNUFRFMTcwTTsgYnJlYWs7CisgICAgICAgIGNhc2UgNjogc3QtPmNvZGVjLT5jb2xvcl9wcmltYXJpZXMgPSBBVkNPTF9QUklfU01QVEUyNDBNOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBjb2xvciB0cmFuc2ZlciwgVGFibGUgNC01ICovCisgICAgICAgIHN3aXRjaCAoY29sb3JfdHJjKSB7CisgICAgICAgIGNhc2UgMTogc3QtPmNvZGVjLT5jb2xvcl90cmMgPSBBVkNPTF9UUkNfQlQ3MDk7IGJyZWFrOworICAgICAgICBjYXNlIDc6IHN0LT5jb2RlYy0+Y29sb3JfdHJjID0gQVZDT0xfVFJDX1NNUFRFMjQwTTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogY29sb3IgbWF0cml4LCBUYWJsZSA0LTYgKi8KKyAgICAgICAgc3dpdGNoIChjb2xvcl9tYXRyaXgpIHsKKyAgICAgICAgY2FzZSAxOiBzdC0+Y29kZWMtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7IGJyZWFrOworICAgICAgICBjYXNlIDY6IHN0LT5jb2RlYy0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOyBicmVhazsKKyAgICAgICAgY2FzZSA3OiBzdC0+Y29kZWMtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfU01QVEUyNDBNOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9kbG9nKGMtPmZjLCAiXG4iKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX2ZpZWwoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIHVuc2lnbmVkIG1vdl9maWVsZF9vcmRlcjsKKyAgICBlbnVtIEFWRmllbGRPcmRlciBkZWNvZGVkX2ZpZWxkX29yZGVyID0gQVZfRklFTERfVU5LTk9XTjsKKworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpIC8vIHdpbGwgaGFwcGVuIHdpdGgganAyIGZpbGVzCisgICAgICAgIHJldHVybiAwOworICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMtMV07CisgICAgaWYgKGF0b20uc2l6ZSA8IDIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIG1vdl9maWVsZF9vcmRlciA9IGF2aW9fcmIxNihwYik7CisgICAgaWYgKChtb3ZfZmllbGRfb3JkZXIgJiAweEZGMDApID09IDB4MDEwMCkKKyAgICAgICAgZGVjb2RlZF9maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1BST0dSRVNTSVZFOworICAgIGVsc2UgaWYgKChtb3ZfZmllbGRfb3JkZXIgJiAweEZGMDApID09IDB4MDIwMCkgeworICAgICAgICBzd2l0Y2ggKG1vdl9maWVsZF9vcmRlciAmIDB4RkYpIHsKKyAgICAgICAgY2FzZSAweDAxOiBkZWNvZGVkX2ZpZWxkX29yZGVyID0gQVZfRklFTERfVFQ7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNjogZGVjb2RlZF9maWVsZF9vcmRlciA9IEFWX0ZJRUxEX0JCOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDk6IGRlY29kZWRfZmllbGRfb3JkZXIgPSBBVl9GSUVMRF9UQjsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDBFOiBkZWNvZGVkX2ZpZWxkX29yZGVyID0gQVZfRklFTERfQlQ7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRlY29kZWRfZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVU5LTk9XTiAmJiBtb3ZfZmllbGRfb3JkZXIpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24gTU9WIGZpZWxkIG9yZGVyIDB4JTA0eFxuIiwgbW92X2ZpZWxkX29yZGVyKTsKKyAgICB9CisgICAgc3QtPmNvZGVjLT5maWVsZF9vcmRlciA9IGRlY29kZWRfZmllbGRfb3JkZXI7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogRklYTUUgbW9kaWZ5IHFkbTIvc3ZxMy9oMjY0IGRlY29kZXJzIHRvIHRha2UgZnVsbCBhdG9tIGFzIGV4dHJhZGF0YSAqLworc3RhdGljIGludCBtb3ZfcmVhZF9leHRyYWRhdGEoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgdWludDY0X3Qgc2l6ZTsKKyAgICB1aW50OF90ICpidWY7CisgICAgaW50IGVycjsKKworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpIC8vIHdpbGwgaGFwcGVuIHdpdGgganAyIGZpbGVzCisgICAgICAgIHJldHVybiAwOworICAgIHN0PSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkICE9IGNvZGVjX2lkKQorICAgICAgICByZXR1cm4gMDsgLyogdW5leHBlY3RlZCBjb2RlY19pZCAtIGRvbid0IG1lc3Mgd2l0aCBleHRyYWRhdGEgKi8KKworICAgIHNpemU9ICh1aW50NjRfdClzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICsgYXRvbS5zaXplICsgOCArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkU7CisgICAgaWYgKHNpemUgPiBJTlRfTUFYIHx8ICh1aW50NjRfdClhdG9tLnNpemUgPiBJTlRfTUFYKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSwgc2l6ZSkpIDwgMCkgeworICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgYnVmID0gc3QtPmNvZGVjLT5leHRyYWRhdGEgKyBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplOworICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemU9IHNpemUgLSBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFOworICAgIEFWX1dCMzIoICAgICAgIGJ1ZiAgICAsIGF0b20uc2l6ZSArIDgpOworICAgIEFWX1dMMzIoICAgICAgIGJ1ZiArIDQsIGF0b20udHlwZSk7CisgICAgZXJyID0gYXZpb19yZWFkKHBiLCBidWYgKyA4LCBhdG9tLnNpemUpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIGlmIChlcnIgPCBhdG9tLnNpemUpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgInRydW5jYXRlZCBleHRyYWRhdGFcbiIpOworICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplIC09IGF0b20uc2l6ZSAtIGVycjsKKyAgICB9CisgICAgbWVtc2V0KGJ1ZiArIDggKyBlcnIsIDAsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIHJldHVybiAwOworfQorCisvKiB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBBTEFDL0FWUy9NSlBFRy9NSlBFRzIwMDAgZXh0cmFkYXRhIGF0b21zIG9ubHkgZm9yIHRob3NlIGNvZGVjcyAqLworc3RhdGljIGludCBtb3ZfcmVhZF9hbGFjKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIHJldHVybiBtb3ZfcmVhZF9leHRyYWRhdGEoYywgcGIsIGF0b20sIEFWX0NPREVDX0lEX0FMQUMpOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX2F2c3MoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgcmV0dXJuIG1vdl9yZWFkX2V4dHJhZGF0YShjLCBwYiwgYXRvbSwgQVZfQ09ERUNfSURfQVZTKTsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9qcDJoKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIHJldHVybiBtb3ZfcmVhZF9leHRyYWRhdGEoYywgcGIsIGF0b20sIEFWX0NPREVDX0lEX0pQRUcyMDAwKTsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9hdmlkKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIGludCByZXQgPSBtb3ZfcmVhZF9leHRyYWRhdGEoYywgcGIsIGF0b20sIEFWX0NPREVDX0lEX0FWVUkpOworICAgIGlmKHJldCA9PSAwKQorICAgICAgICByZXQgPSBtb3ZfcmVhZF9leHRyYWRhdGEoYywgcGIsIGF0b20sIEFWX0NPREVDX0lEX0ROWEhEKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX3RhcmdhX3kyMTYoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgaW50IHJldCA9IG1vdl9yZWFkX2V4dHJhZGF0YShjLCBwYiwgYXRvbSwgQVZfQ09ERUNfSURfVEFSR0FfWTIxNik7CisKKyAgICBpZiAoIXJldCAmJiBjLT5mYy0+bmJfc3RyZWFtcyA+PSAxKSB7CisgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdLT5jb2RlYzsKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSA0MCkgeworICAgICAgICAgICAgYXZjdHgtPmhlaWdodCA9IEFWX1JCMTYoJmF2Y3R4LT5leHRyYWRhdGFbMzZdKTsKKyAgICAgICAgICAgIGF2Y3R4LT53aWR0aCAgPSBBVl9SQjE2KCZhdmN0eC0+ZXh0cmFkYXRhWzM4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9hcmVzKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA+PSAxKSB7CisgICAgICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdLT5jb2RlYzsKKyAgICAgICAgaWYgKGNvZGVjLT5jb2RlY190YWcgPT0gTUtUQUcoJ0EnLCAnVicsICdpJywgJ24nKSAmJgorICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgJiYKKyAgICAgICAgICAgIGF0b20uc2l6ZSA+IDExKSB7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDEwKTsKKyAgICAgICAgICAgIC8qIEZvciBBVklEIEFWQ0k1MCwgZm9yY2Ugd2lkdGggb2YgMTQ0MCB0byBiZSBhYmxlIHRvIHNlbGVjdCB0aGUgY29ycmVjdCBTUFMgYW5kIFBQUyAqLworICAgICAgICAgICAgaWYgKGF2aW9fcmIxNihwYikgPT0gMHhkNGQpCisgICAgICAgICAgICAgICAgY29kZWMtPndpZHRoID0gMTQ0MDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1vdl9yZWFkX2F2aWQoYywgcGIsIGF0b20pOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX3N2cTMoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgcmV0dXJuIG1vdl9yZWFkX2V4dHJhZGF0YShjLCBwYiwgYXRvbSwgQVZfQ09ERUNfSURfU1ZRMyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfd2F2ZShNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOworCisgICAgaWYgKCh1aW50NjRfdClhdG9tLnNpemUgPiAoMTw8MzApKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1FETTIgfHwKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE1DIHx8CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1BFRVgpIHsKKyAgICAgICAgLy8gcGFzcyBhbGwgZnJtYSBhdG9tIHRvIGNvZGVjLCBuZWVkZWQgYXQgbGVhc3QgZm9yIFFETUMgYW5kIFFETTIKKyAgICAgICAgYXZfZnJlZShzdC0+Y29kZWMtPmV4dHJhZGF0YSk7CisgICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIGF0b20uc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9IGVsc2UgaWYgKGF0b20uc2l6ZSA+IDgpIHsgLyogdG8gcmVhZCBmcm1hLCBlc2RzIGF0b21zICovCisgICAgICAgIGludCByZXQ7CisgICAgICAgIGlmICgocmV0ID0gbW92X3JlYWRfZGVmYXVsdChjLCBwYiwgYXRvbSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlCisgICAgICAgIGF2aW9fc2tpcChwYiwgYXRvbS5zaXplKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGF0b20gY29udGVudCBhbmQgcHV0cyBkYXRhIGluIGV4dHJhZGF0YSB3aXRob3V0IHRhZworICogbm9yIHNpemUgdW5saWtlIG1vdl9yZWFkX2V4dHJhZGF0YS4KKyAqLworc3RhdGljIGludCBtb3ZfcmVhZF9nbGJsKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIEFWU3RyZWFtICpzdDsKKworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpCisgICAgICAgIHJldHVybiAwOworICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMtMV07CisKKyAgICBpZiAoKHVpbnQ2NF90KWF0b20uc2l6ZSA+ICgxPDwzMCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGF0b20uc2l6ZSA+PSAxMCkgeworICAgICAgICAvLyBCcm9rZW4gZmlsZXMgY3JlYXRlZCBieSBsZWdhY3kgdmVyc2lvbnMgb2YgbGliYXZmb3JtYXQgd2lsbAorICAgICAgICAvLyB3cmFwIGEgd2hvbGUgZmllbCBhdG9tIGluc2lkZSBvZiBhIGdsYmwgYXRvbS4KKyAgICAgICAgdW5zaWduZWQgc2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIHVuc2lnbmVkIHR5cGUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBhdmlvX3NlZWsocGIsIC04LCBTRUVLX0NVUik7CisgICAgICAgIGlmICh0eXBlID09IE1LVEFHKCdmJywnaScsJ2UnLCdsJykgJiYgc2l6ZSA9PSBhdG9tLnNpemUpCisgICAgICAgICAgICByZXR1cm4gbW92X3JlYWRfZGVmYXVsdChjLCBwYiwgYXRvbSk7CisgICAgfQorICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID4gMSAmJiBzdC0+Y29kZWMtPmV4dHJhZGF0YSkgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX1dBUk5JTkcsICJpZ25vcmluZyBtdWx0aXBsZSBnbGJsXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGF2X2ZyZWUoc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIGF0b20uc2l6ZSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfZHZjMShNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgdWludDhfdCBwcm9maWxlX2xldmVsOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOworCisgICAgaWYgKGF0b20uc2l6ZSA+PSAoMTw8MjgpIHx8IGF0b20uc2l6ZSA8IDcpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcHJvZmlsZV9sZXZlbCA9IGF2aW9fcjgocGIpOworICAgIGlmICgocHJvZmlsZV9sZXZlbCAmIDB4ZjApICE9IDB4YzApCisgICAgICAgIHJldHVybiAwOworCisgICAgYXZpb19zZWVrKHBiLCA2LCBTRUVLX0NVUik7CisgICAgYXZfZnJlZShzdC0+Y29kZWMtPmV4dHJhZGF0YSk7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIGF0b20uc2l6ZSAtIDcpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBBbiBzdHJmIGF0b20gaXMgYSBCSVRNQVBJTkZPSEVBREVSIHN0cnVjdC4gVGhpcyBzdHJ1Y3QgaXMgNDAgYnl0ZXMgaXRzZWxmLAorICogYnV0IGNhbiBoYXZlIGV4dHJhZGF0YSBhcHBlbmRlZCBhdCB0aGUgZW5kIGFmdGVyIHRoZSA0MCBieXRlcyBiZWxvbmdpbmcKKyAqIHRvIHRoZSBzdHJ1Y3QuCisgKi8KK3N0YXRpYyBpbnQgbW92X3JlYWRfc3RyZihNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYXRvbS5zaXplIDw9IDQwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOworCisgICAgaWYgKCh1aW50NjRfdClhdG9tLnNpemUgPiAoMTw8MzApKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2aW9fc2tpcChwYiwgNDApOworICAgIGF2X2ZyZWUoc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIGF0b20uc2l6ZSAtIDQwKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfc3RjbyhNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7CisgICAgdW5zaWduZWQgaW50IGksIGVudHJpZXM7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOworICAgIHNjID0gc3QtPnByaXZfZGF0YTsKKworICAgIGF2aW9fcjgocGIpOyAvKiB2ZXJzaW9uICovCisgICAgYXZpb19yYjI0KHBiKTsgLyogZmxhZ3MgKi8KKworICAgIGVudHJpZXMgPSBhdmlvX3JiMzIocGIpOworCisgICAgaWYgKCFlbnRyaWVzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzYy0+Y2h1bmtfb2Zmc2V0cykKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgIkR1cGxpY2F0ZWQgU1RDTyBhdG9tXG4iKTsKKyAgICBhdl9mcmVlKHNjLT5jaHVua19vZmZzZXRzKTsKKyAgICBzYy0+Y2h1bmtfY291bnQgPSAwOworICAgIHNjLT5jaHVua19vZmZzZXRzID0gYXZfbWFsbG9jX2FycmF5KGVudHJpZXMsIHNpemVvZigqc2MtPmNodW5rX29mZnNldHMpKTsKKyAgICBpZiAoIXNjLT5jaHVua19vZmZzZXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHNjLT5jaHVua19jb3VudCA9IGVudHJpZXM7CisKKyAgICBpZiAgICAgIChhdG9tLnR5cGUgPT0gTUtUQUcoJ3MnLCd0JywnYycsJ28nKSkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGVudHJpZXMgJiYgIXBiLT5lb2ZfcmVhY2hlZDsgaSsrKQorICAgICAgICAgICAgc2MtPmNodW5rX29mZnNldHNbaV0gPSBhdmlvX3JiMzIocGIpOworICAgIGVsc2UgaWYgKGF0b20udHlwZSA9PSBNS1RBRygnYycsJ28nLCc2JywnNCcpKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllcyAmJiAhcGItPmVvZl9yZWFjaGVkOyBpKyspCisgICAgICAgICAgICBzYy0+Y2h1bmtfb2Zmc2V0c1tpXSA9IGF2aW9fcmI2NChwYik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHNjLT5jaHVua19jb3VudCA9IGk7CisKKyAgICBpZiAocGItPmVvZl9yZWFjaGVkKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDb21wdXRlIGNvZGVjIGlkIGZvciAnbHBjbScgdGFnLgorICogU2VlIENvcmVBdWRpb1R5cGVzIGFuZCBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gYXQgQXBwbGUuCisgKi8KK2VudW0gQVZDb2RlY0lEIGZmX21vdl9nZXRfbHBjbV9jb2RlY19pZChpbnQgYnBzLCBpbnQgZmxhZ3MpCit7CisgICAgLyogbHBjbSBmbGFnczoKKyAgICAgKiAweDEgPSBmbG9hdAorICAgICAqIDB4MiA9IGJpZy1lbmRpYW4KKyAgICAgKiAweDQgPSBzaWduZWQKKyAgICAgKi8KKyAgICByZXR1cm4gZmZfZ2V0X3BjbV9jb2RlY19pZChicHMsIGZsYWdzICYgMSwgZmxhZ3MgJiAyLCBmbGFncyAmIDQgPyAtMSA6IDApOworfQorCitzdGF0aWMgaW50IG1vdl9jb2RlY19pZChBVlN0cmVhbSAqc3QsIHVpbnQzMl90IGZvcm1hdCkKK3sKKyAgICBpbnQgaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfbW92YXVkaW9fdGFncywgZm9ybWF0KTsKKworICAgIGlmIChpZCA8PSAwICYmCisgICAgICAgICgoZm9ybWF0ICYgMHhGRkZGKSA9PSAnbScgKyAoJ3MnIDw8IDgpIHx8CisgICAgICAgICAoZm9ybWF0ICYgMHhGRkZGKSA9PSAnVCcgKyAoJ1MnIDw8IDgpKSkKKyAgICAgICAgaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfd2F2X3RhZ3MsIGF2X2Jzd2FwMzIoZm9ybWF0KSAmIDB4RkZGRik7CisKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyAmJiBpZCA+IDApIHsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgLyogc2tpcCBvbGQgYXNmIG1wZWc0IHRhZyAqLworICAgICAgICAgICAgICAgZm9ybWF0ICYmIGZvcm1hdCAhPSBNS1RBRygnbScsJ3AnLCc0JywncycpKSB7CisgICAgICAgIGlkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIGZvcm1hdCk7CisgICAgICAgIGlmIChpZCA8PSAwKQorICAgICAgICAgICAgaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsIGZvcm1hdCk7CisgICAgICAgIGlmIChpZCA+IDApCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSB8fAorICAgICAgICAgICAgICAgICAgICAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSAmJgorICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpKSB7CisgICAgICAgICAgICBpZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19tb3ZzdWJ0aXRsZV90YWdzLCBmb3JtYXQpOworICAgICAgICAgICAgaWYgKGlkID4gMCkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IGZvcm1hdDsKKworICAgIHJldHVybiBpZDsKK30KKworc3RhdGljIHZvaWQgbW92X3BhcnNlX3N0c2RfdmlkZW8oTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBNT1ZTdHJlYW1Db250ZXh0ICpzYykKK3sKKyAgICB1aW50OF90IGNvZGVjX25hbWVbMzJdOworICAgIHVuc2lnbmVkIGludCBjb2xvcl9kZXB0aCwgbGVuLCBqOworICAgIGludCBjb2xvcl9ncmV5c2NhbGU7CisgICAgaW50IGNvbG9yX3RhYmxlX2lkOworCisgICAgYXZpb19yYjE2KHBiKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fcmIxNihwYik7IC8qIHJldmlzaW9uIGxldmVsICovCisgICAgYXZpb19yYjMyKHBiKTsgLyogdmVuZG9yICovCisgICAgYXZpb19yYjMyKHBiKTsgLyogdGVtcG9yYWwgcXVhbGl0eSAqLworICAgIGF2aW9fcmIzMihwYik7IC8qIHNwYXRpYWwgcXVhbGl0eSAqLworCisgICAgc3QtPmNvZGVjLT53aWR0aCAgPSBhdmlvX3JiMTYocGIpOyAvKiB3aWR0aCAqLworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gYXZpb19yYjE2KHBiKTsgLyogaGVpZ2h0ICovCisKKyAgICBhdmlvX3JiMzIocGIpOyAvKiBob3JpeiByZXNvbHV0aW9uICovCisgICAgYXZpb19yYjMyKHBiKTsgLyogdmVydCByZXNvbHV0aW9uICovCisgICAgYXZpb19yYjMyKHBiKTsgLyogZGF0YSBzaXplLCBhbHdheXMgMCAqLworICAgIGF2aW9fcmIxNihwYik7IC8qIGZyYW1lcyBwZXIgc2FtcGxlcyAqLworCisgICAgbGVuID0gYXZpb19yOChwYik7IC8qIGNvZGVjIG5hbWUsIHBhc2NhbCBzdHJpbmcgKi8KKyAgICBpZiAobGVuID4gMzEpCisgICAgICAgIGxlbiA9IDMxOworICAgIG1vdl9yZWFkX21hY19zdHJpbmcoYywgcGIsIGxlbiwgY29kZWNfbmFtZSwgc2l6ZW9mKGNvZGVjX25hbWUpKTsKKyAgICBpZiAobGVuIDwgMzEpCisgICAgICAgIGF2aW9fc2tpcChwYiwgMzEgLSBsZW4pOworCisgICAgaWYgKGNvZGVjX25hbWVbMF0pCisgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJlbmNvZGVyIiwgY29kZWNfbmFtZSwgMCk7CisKKyAgICAvKiBjb2RlY190YWcgWVYxMiB0cmlnZ2VycyBhbiBVViBzd2FwIGluIHJhd2RlYy5jICovCisgICAgaWYgKCFtZW1jbXAoY29kZWNfbmFtZSwgIlBsYW5hciBZJ0NiQ3IgOC1iaXQgNDoyOjAiLCAyNSkpIHsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBNS1RBRygnSScsICc0JywgJzInLCAnMCcpOworICAgICAgICBzdC0+Y29kZWMtPndpZHRoICY9IH4xOworICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAmPSB+MTsKKyAgICB9CisgICAgLyogRmxhc2ggTWVkaWEgU2VydmVyIHVzZXMgdGFnIEgyNjMgd2l0aCBTb3JlbnNvbiBTcGFyayAqLworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSBNS1RBRygnSCcsJzInLCc2JywnMycpICYmCisgICAgICAgICFtZW1jbXAoY29kZWNfbmFtZSwgIlNvcmVuc29uIEgyNjMiLCAxMykpCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9GTFYxOworCisgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JiMTYocGIpOyAvKiBkZXB0aCAqLworICAgIGNvbG9yX3RhYmxlX2lkID0gYXZpb19yYjE2KHBiKTsgLyogY29sb3J0YWJsZSBpZCAqLworICAgIGF2X2Rsb2coYy0+ZmMsICJkZXB0aCAlZCwgY3RhYiBpZCAlZFxuIiwKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlLCBjb2xvcl90YWJsZV9pZCk7CisgICAgLyogZmlndXJlIG91dCB0aGUgcGFsZXR0ZSBzaXR1YXRpb24gKi8KKyAgICBjb2xvcl9kZXB0aCAgICAgPSBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAmIDB4MUY7CisgICAgY29sb3JfZ3JleXNjYWxlID0gc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgJiAweDIwOworICAgIC8qIERvIG5vdCBjcmVhdGUgYSBncmV5c2NhbGUgcGFsZXR0ZSBmb3IgY2luZXBhayAqLworICAgIGlmIChjb2xvcl9ncmV5c2NhbGUgJiYgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9DSU5FUEFLKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBpZiB0aGUgZGVwdGggaXMgMiwgNCwgb3IgOCBicHAsIGZpbGUgaXMgcGFsZXR0aXplZCAqLworICAgIGlmICgoY29sb3JfZGVwdGggPT0gMikgfHwgKGNvbG9yX2RlcHRoID09IDQpIHx8IChjb2xvcl9kZXB0aCA9PSA4KSkgeworICAgICAgICAvKiBmb3IgcGFsZXR0ZSB0cmF2ZXJzYWwgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGNvbG9yX3N0YXJ0LCBjb2xvcl9jb3VudCwgY29sb3JfZW5kOworICAgICAgICB1bnNpZ25lZCBjaGFyIGEsIHIsIGcsIGI7CisKKyAgICAgICAgaWYgKGNvbG9yX2dyZXlzY2FsZSkgeworICAgICAgICAgICAgaW50IGNvbG9yX2luZGV4LCBjb2xvcl9kZWM7CisgICAgICAgICAgICAvKiBjb21wdXRlIHRoZSBncmV5c2NhbGUgcGFsZXR0ZSAqLworICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBjb2xvcl9kZXB0aDsKKyAgICAgICAgICAgIGNvbG9yX2NvdW50ID0gMSA8PCBjb2xvcl9kZXB0aDsKKyAgICAgICAgICAgIGNvbG9yX2luZGV4ID0gMjU1OworICAgICAgICAgICAgY29sb3JfZGVjICAgPSAyNTYgLyAoY29sb3JfY291bnQgLSAxKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2xvcl9jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgciA9IGcgPSBiID0gY29sb3JfaW5kZXg7CisgICAgICAgICAgICAgICAgc2MtPnBhbGV0dGVbal0gPSAoMHhGRlUgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYik7CisgICAgICAgICAgICAgICAgY29sb3JfaW5kZXggLT0gY29sb3JfZGVjOworICAgICAgICAgICAgICAgIGlmIChjb2xvcl9pbmRleCA8IDApCisgICAgICAgICAgICAgICAgICAgIGNvbG9yX2luZGV4ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb2xvcl90YWJsZV9pZCkgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY29sb3JfdGFibGU7CisgICAgICAgICAgICAvKiBpZiBmbGFnIGJpdCAzIGlzIHNldCwgdXNlIHRoZSBkZWZhdWx0IHBhbGV0dGUgKi8KKyAgICAgICAgICAgIGNvbG9yX2NvdW50ID0gMSA8PCBjb2xvcl9kZXB0aDsKKyAgICAgICAgICAgIGlmIChjb2xvcl9kZXB0aCA9PSAyKQorICAgICAgICAgICAgICAgIGNvbG9yX3RhYmxlID0gZmZfcXRfZGVmYXVsdF9wYWxldHRlXzQ7CisgICAgICAgICAgICBlbHNlIGlmIChjb2xvcl9kZXB0aCA9PSA0KQorICAgICAgICAgICAgICAgIGNvbG9yX3RhYmxlID0gZmZfcXRfZGVmYXVsdF9wYWxldHRlXzE2OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbG9yX3RhYmxlID0gZmZfcXRfZGVmYXVsdF9wYWxldHRlXzI1NjsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvbG9yX2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICByID0gY29sb3JfdGFibGVbaiAqIDMgKyAwXTsKKyAgICAgICAgICAgICAgICBnID0gY29sb3JfdGFibGVbaiAqIDMgKyAxXTsKKyAgICAgICAgICAgICAgICBiID0gY29sb3JfdGFibGVbaiAqIDMgKyAyXTsKKyAgICAgICAgICAgICAgICBzYy0+cGFsZXR0ZVtqXSA9ICgweEZGVSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IChiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGxvYWQgdGhlIHBhbGV0dGUgZnJvbSB0aGUgZmlsZSAqLworICAgICAgICAgICAgY29sb3Jfc3RhcnQgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgY29sb3JfY291bnQgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgY29sb3JfZW5kICAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgaWYgKChjb2xvcl9zdGFydCA8PSAyNTUpICYmIChjb2xvcl9lbmQgPD0gMjU1KSkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IGNvbG9yX3N0YXJ0OyBqIDw9IGNvbG9yX2VuZDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGVhY2ggQSwgUiwgRywgb3IgQiBjb21wb25lbnQgaXMgMTYgYml0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICogb25seSB1c2UgdGhlIHRvcCA4IGJpdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgYSA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgICAgICAgICBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgICAgICAgICAgciA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgICAgICAgICBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgICAgICAgICAgZyA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgICAgICAgICBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgICAgICAgICAgYiA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgICAgICAgICBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgICAgICAgICAgc2MtPnBhbGV0dGVbal0gPSAoYSA8PCAyNCApIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNjLT5oYXNfcGFsZXR0ZSA9IDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtb3ZfcGFyc2Vfc3RzZF9hdWRpbyhNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIE1PVlN0cmVhbUNvbnRleHQgKnNjKQoreworICAgIGludCBiaXRzX3Blcl9zYW1wbGUsIGZsYWdzOworICAgIHVpbnQxNl90IHZlcnNpb24gPSBhdmlvX3JiMTYocGIpOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICpjb21wYXRpYmxlX2JyYW5kcyA9IGF2X2RpY3RfZ2V0KGMtPmZjLT5tZXRhZGF0YSwgImNvbXBhdGlibGVfYnJhbmRzIiwgTlVMTCwgQVZfRElDVF9NQVRDSF9DQVNFKTsKKworICAgIGF2aW9fcmIxNihwYik7IC8qIHJldmlzaW9uIGxldmVsICovCisgICAgYXZpb19yYjMyKHBiKTsgLyogdmVuZG9yICovCisKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICAgICAgICA9IGF2aW9fcmIxNihwYik7IC8qIGNoYW5uZWwgY291bnQgKi8KKyAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcmIxNihwYik7IC8qIHNhbXBsZSBzaXplICovCisgICAgYXZfZGxvZyhjLT5mYywgImF1ZGlvIGNoYW5uZWxzICVkXG4iLCBzdC0+Y29kZWMtPmNoYW5uZWxzKTsKKworICAgIHNjLT5hdWRpb19jaWQgPSBhdmlvX3JiMTYocGIpOworICAgIGF2aW9fcmIxNihwYik7IC8qIHBhY2tldCBzaXplID0gMCAqLworCisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9ICgoYXZpb19yYjMyKHBiKSA+PiAxNikpOworCisgICAgLy8gUmVhZCBRVCB2ZXJzaW9uIDEgZmllbGRzLiBJbiB2ZXJzaW9uIDAgdGhlc2UgZG8gbm90IGV4aXN0LgorICAgIGF2X2Rsb2coYy0+ZmMsICJ2ZXJzaW9uID0lZCwgaXNvbSA9JWRcbiIsIHZlcnNpb24sIGMtPmlzb20pOworICAgIGlmICghYy0+aXNvbSB8fAorICAgICAgICAoY29tcGF0aWJsZV9icmFuZHMgJiYgc3Ryc3RyKGNvbXBhdGlibGVfYnJhbmRzLT52YWx1ZSwgInF0ICAiKSkpIHsKKworICAgICAgICBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICBzYy0+c2FtcGxlc19wZXJfZnJhbWUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgYXZpb19yYjMyKHBiKTsgLyogYnl0ZXMgcGVyIHBhY2tldCAqLworICAgICAgICAgICAgc2MtPmJ5dGVzX3Blcl9mcmFtZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBieXRlcyBwZXIgc2FtcGxlICovCisgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAyKSB7CisgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBzaXplb2Ygc3RydWN0IG9ubHkgKi8KKyAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBhbHdheXMgMHg3RjAwMDAwMCAqLworICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JiMzIocGIpOworCisgICAgICAgICAgICBmbGFncyA9IGF2aW9fcmIzMihwYik7IC8qIGxwY20gZm9ybWF0IHNwZWNpZmljIGZsYWcgKi8KKyAgICAgICAgICAgIHNjLT5ieXRlc19wZXJfZnJhbWUgICA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBzYy0+c2FtcGxlc19wZXJfZnJhbWUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdGFnID09IE1LVEFHKCdsJywncCcsJ2MnLCdtJykpCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9CisgICAgICAgICAgICAgICAgICAgIGZmX21vdl9nZXRfbHBjbV9jb2RlY19pZChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M4OgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1U4OgorICAgICAgICBpZiAoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMTYpCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkJFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZCRToKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDgpCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1M4OworICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAyNCkKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFID8KKyAgICAgICAgICAgICAgICBBVl9DT0RFQ19JRF9QQ01fUzI0QkUgOiBBVl9DT0RFQ19JRF9QQ01fUzI0TEU7CisgICAgICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDMyKQorICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFID8KKyAgICAgICAgICAgICAgICBBVl9DT0RFQ19JRF9QQ01fUzMyQkUgOiBBVl9DT0RFQ19JRF9QQ01fUzMyTEU7CisgICAgICAgIGJyZWFrOworICAgIC8qIHNldCB2YWx1ZXMgZm9yIG9sZCBmb3JtYXQgYmVmb3JlIHN0c2QgdmVyc2lvbiAxIGFwcGVhcmVkICovCisgICAgY2FzZSBBVl9DT0RFQ19JRF9NQUNFMzoKKyAgICAgICAgc2MtPnNhbXBsZXNfcGVyX2ZyYW1lID0gNjsKKyAgICAgICAgc2MtPmJ5dGVzX3Blcl9mcmFtZSAgID0gMiAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfTUFDRTY6CisgICAgICAgIHNjLT5zYW1wbGVzX3Blcl9mcmFtZSA9IDY7CisgICAgICAgIHNjLT5ieXRlc19wZXJfZnJhbWUgICA9IDEgKiBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVDoKKyAgICAgICAgc2MtPnNhbXBsZXNfcGVyX2ZyYW1lID0gNjQ7CisgICAgICAgIHNjLT5ieXRlc19wZXJfZnJhbWUgICA9IDM0ICogc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9HU006CisgICAgICAgIHNjLT5zYW1wbGVzX3Blcl9mcmFtZSA9IDE2MDsKKyAgICAgICAgc2MtPmJ5dGVzX3Blcl9mcmFtZSAgID0gMzM7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJpdHNfcGVyX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCk7CisgICAgaWYgKGJpdHNfcGVyX3NhbXBsZSkgeworICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKKyAgICAgICAgc2MtPnNhbXBsZV9zaXplID0gKGJpdHNfcGVyX3NhbXBsZSA+PiAzKSAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtb3ZfcGFyc2Vfc3RzZF9zdWJ0aXRsZShNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIE1PVlN0cmVhbUNvbnRleHQgKnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCit7CisgICAgLy8gdHR4dCBzdHNkIGNvbnRhaW5zIGRpc3BsYXkgZmxhZ3MsIGp1c3RpZmljYXRpb24sIGJhY2tncm91bmQKKyAgICAvLyBjb2xvciwgZm9udHMsIGFuZCBkZWZhdWx0IHN0eWxlcywgc28gZmFrZSBhbiBhdG9tIHRvIHJlYWQgaXQKKyAgICBNT1ZBdG9tIGZha2VfYXRvbSA9IHsgLnNpemUgPSBzaXplIH07CisgICAgLy8gbXA0cyBjb250YWlucyBhIHJlZ3VsYXIgZXNkcyBhdG9tCisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdGFnICE9IEFWX1JMMzIoIm1wNHMiKSkKKyAgICAgICAgbW92X3JlYWRfZ2xibChjLCBwYiwgZmFrZV9hdG9tKTsKKyAgICBzdC0+Y29kZWMtPndpZHRoICA9IHNjLT53aWR0aDsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHNjLT5oZWlnaHQ7Cit9CisKK3N0YXRpYyB1aW50MzJfdCB5dXZfdG9fcmdiYSh1aW50MzJfdCB5Y2JjcikKK3sKKyAgICB1aW50OF90IHIsIGcsIGI7CisgICAgaW50IHksIGNiLCBjcjsKKworICAgIHkgID0gKHljYmNyID4+IDE2KSAmIDB4RkY7CisgICAgY3IgPSAoeWNiY3IgPj4gOCkgICYgMHhGRjsKKyAgICBjYiA9ICB5Y2JjciAgICAgICAgJiAweEZGOworCisgICAgYiA9IGF2X2NsaXBfdWludDgoMS4xNjQgKiAoeSAtIDE2KSAgICAgICAgICAgICAgICAgICAgICArIDIuMDE4ICogKGNiIC0gMTI4KSk7CisgICAgZyA9IGF2X2NsaXBfdWludDgoMS4xNjQgKiAoeSAtIDE2KSAtIDAuODEzICogKGNyIC0gMTI4KSAtIDAuMzkxICogKGNiIC0gMTI4KSk7CisgICAgciA9IGF2X2NsaXBfdWludDgoMS4xNjQgKiAoeSAtIDE2KSArIDEuNTk2ICogKGNyIC0gMTI4KSk7CisKKyAgICByZXR1cm4gKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworfQorCitzdGF0aWMgaW50IG1vdl9yZXdyaXRlX2R2ZF9zdWJfZXh0cmFkYXRhKEFWU3RyZWFtICpzdCkKK3sKKyAgICBjaGFyIGJ1ZlsyNTZdID0gezB9OworICAgIHVpbnQ4X3QgKnNyYyA9IHN0LT5jb2RlYy0+ZXh0cmFkYXRhOworICAgIGludCBpOworCisgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgIT0gNjQpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHN0LT5jb2RlYy0+d2lkdGggPiAwICYmICBzdC0+Y29kZWMtPmhlaWdodCA+IDApCisgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJzaXplOiAlZHglZFxuIiwKKyAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCwgc3QtPmNvZGVjLT5oZWlnaHQpOworICAgIGF2X3N0cmxjYXQoYnVmLCAicGFsZXR0ZTogIiwgc2l6ZW9mKGJ1ZikpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgeXV2ID0gQVZfUkIzMihzcmMgKyBpICogNCk7CisgICAgICAgIHVpbnQzMl90IHJnYmEgPSB5dXZfdG9fcmdiYSh5dXYpOworCisgICAgICAgIGF2X3N0cmxjYXRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlMDYiUFJJeDMyIiVzIiwgcmdiYSwgaSAhPSAxNSA/ICIsICIgOiAiIik7CisgICAgfQorCisgICAgaWYgKGF2X3N0cmxjYXQoYnVmLCAiXG4iLCBzaXplb2YoYnVmKSkgPj0gc2l6ZW9mKGJ1ZikpCisgICAgICAgIHJldHVybiAwOworCisgICAgYXZfZnJlZXAoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKKyAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3ooc3RybGVuKGJ1ZikgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBzdHJsZW4oYnVmKTsKKyAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsIGJ1Ziwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcGFyc2Vfc3RzZF9kYXRhKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBNT1ZTdHJlYW1Db250ZXh0ICpzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCit7CisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdGFnID09IE1LVEFHKCd0JywnbScsJ2MnLCdkJykpIHsKKyAgICAgICAgaWYgKGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKHNpemUgPiAxNikgeworICAgICAgICAgICAgTU9WU3RyZWFtQ29udGV4dCAqdG1jZF9jdHggPSBzdC0+cHJpdl9kYXRhOworICAgICAgICAgICAgaW50IHZhbDsKKyAgICAgICAgICAgIHZhbCA9IEFWX1JCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA0KTsKKyAgICAgICAgICAgIHRtY2RfY3R4LT50bWNkX2ZsYWdzID0gdmFsOworICAgICAgICAgICAgaWYgKHZhbCAmIDEpCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5mbGFnczIgfD0gQ09ERUNfRkxBRzJfRFJPUF9GUkFNRV9USU1FQ09ERTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlLmRlbiA9IHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzE2XTsgLyogbnVtYmVyIG9mIGZyYW1lICovCisgICAgICAgICAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW0gPSAxOworICAgICAgICAgICAgaWYgKHNpemUgPiAzMCkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbiA9IEFWX1JCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAxOCk7IC8qIG5hbWUgYXRvbSBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBVl9SQjMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMjIpOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gQVZfUkIzMigibmFtZSIpICYmIChpbnQ2NF90KXNpemUgPj0gKGludDY0X3QpbGVuICsgMTgpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RyX3NpemUgPSBBVl9SQjE2KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMjYpOyAvKiBzdHJpbmcgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJfc2l6ZSA+IDAgJiYgc2l6ZSA+PSAoaW50KXN0cl9zaXplICsgMjYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnJlZWxfbmFtZSA9IGF2X21hbGxvYyhzdHJfc2l6ZSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWVsX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShyZWVsX25hbWUsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMzAsIHN0cl9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZWxfbmFtZVtzdHJfc2l6ZV0gPSAwOyAvKiBBZGQgbnVsbCB0ZXJtaW5hdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBhZGQgcmVlbF9uYW1lIGlmIGVtdHB5IHN0cmluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpyZWVsX25hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUocmVlbF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgInJlZWxfbmFtZSIsIHJlZWxfbmFtZSwgIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG90aGVyIGNvZGVjIHR5cGUsIGp1c3Qgc2tpcCAocnRwLCBtcDRzIC4uLikgKi8KKyAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X2ZpbmFsaXplX3N0c2RfY29kZWMoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIE1PVlN0cmVhbUNvbnRleHQgKnNjKQoreworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICYmIHNjLT50aW1lX3NjYWxlID4gMSkKKyAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNjLT50aW1lX3NjYWxlOworCisgICAgLyogc3BlY2lhbCBjb2RlYyBwYXJhbWV0ZXJzIGhhbmRsaW5nICovCisgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisjaWYgQ09ORklHX0RWX0RFTVVYRVIKKyAgICBjYXNlIEFWX0NPREVDX0lEX0RWQVVESU86CisgICAgICAgIGMtPmR2X2ZjdHggID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOworICAgICAgICBjLT5kdl9kZW11eCA9IGF2cHJpdl9kdl9pbml0X2RlbXV4KGMtPmR2X2ZjdHgpOworICAgICAgICBpZiAoIWMtPmR2X2RlbXV4KSB7CisgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgImR2IGRlbXV4IGNvbnRleHQgaW5pdCBlcnJvclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIHNjLT5kdl9hdWRpb19jb250YWluZXIgPSAxOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIC8qIG5vIGlmZGVmIHNpbmNlIHBhcmFtZXRlcnMgYXJlIGFsd2F5cyB0aG9zZSAqLworICAgIGNhc2UgQVZfQ09ERUNfSURfUUNFTFA6CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAxOworICAgICAgICAvLyBmb3JjZSBzYW1wbGUgcmF0ZSBmb3IgcWNlbHAgd2hlbiBub3Qgc3RvcmVkIGluIG1vdgorICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190YWcgIT0gTUtUQUcoJ1EnLCdjJywnbCcsJ3AnKSkKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSA4MDAwOworICAgICAgICAvLyBGSVhNRTogV2h5IGlzIHRoZSBmb2xsb3dpbmcgbmVlZGVkIGZvciBzb21lIGZpbGVzPworICAgICAgICBzYy0+c2FtcGxlc19wZXJfZnJhbWUgPSAxNjA7CisgICAgICAgIGlmICghc2MtPmJ5dGVzX3Blcl9mcmFtZSkKKyAgICAgICAgICAgIHNjLT5ieXRlc19wZXJfZnJhbWUgPSAzNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BTVJfTkI6CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSAxOworICAgICAgICAvKiBmb3JjZSBzYW1wbGUgcmF0ZSBmb3IgYW1yLCBzdHNkIGluIDNncCBkb2VzIG5vdCBzdG9yZSBzYW1wbGUgcmF0ZSAqLworICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gODAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BTVJfV0I6CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSAxOworICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gMTYwMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVAyOgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVAzOgorICAgICAgICAvKiBmb3JjZSB0eXBlIGFmdGVyIHN0c2QgZm9yIG0xYSBoZGxyICovCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9HU006CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9NUzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVY6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9JTEJDOgorICAgIGNhc2UgQVZfQ09ERUNfSURfTUFDRTM6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NQUNFNjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1FETTI6CisgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBzYy0+Ynl0ZXNfcGVyX2ZyYW1lOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FMQUM6CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID09IDM2KSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gQVZfUkI4IChzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIxKTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBBVl9SQjMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMzIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQUMzOgorICAgIGNhc2UgQVZfQ09ERUNfSURfRUFDMzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcxVklERU86CisgICAgY2FzZSBBVl9DT0RFQ19JRF9WQzE6CisgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3NraXBfbXVsdGlwbGVfc3RzZChNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGVjX3RhZywgaW50IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUpCit7CisgICAgaW50IHZpZGVvX2NvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIGZvcm1hdCk7CisKKyAgICBpZiAoY29kZWNfdGFnICYmCisgICAgICAgICAoY29kZWNfdGFnICE9IGZvcm1hdCAmJgorICAgICAgICAgIChjLT5mYy0+dmlkZW9fY29kZWNfaWQgPyB2aWRlb19jb2RlY19pZCAhPSBjLT5mYy0+dmlkZW9fY29kZWNfaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29kZWNfdGFnICE9IE1LVEFHKCdqJywncCcsJ2UnLCdnJykpKSkgeworICAgICAgICAvKiBNdWx0aXBsZSBmb3VyY2MsIHdlIHNraXAgSlBFRy4gVGhpcyBpcyBub3QgY29ycmVjdCwgd2Ugc2hvdWxkCisgICAgICAgICAqIGV4cG9ydCBpdCBhcyBhIHNlcGFyYXRlIEFWU3RyZWFtIGJ1dCB0aGlzIG5lZWRzIGEgZmV3IGNoYW5nZXMKKyAgICAgICAgICogaW4gdGhlIE1PViBkZW11eGVyLCBwYXRjaCB3ZWxjb21lLiAqLworCisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1dBUk5JTkcsICJtdWx0aXBsZSBmb3VyY2Mgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIGNvZGVjX3RhZyA9PSBBVl9STDMyKCJhdmMxIikgfHwKKyAgICAgICAgIGNvZGVjX3RhZyA9PSBBVl9STDMyKCJodmMxIikgfHwKKyAgICAgICAgIGNvZGVjX3RhZyA9PSBBVl9STDMyKCJoZXYxIikKKyAgICApCisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1dBUk5JTkcsICJDb25jYXRlbmF0ZWQgSC4yNjQgb3IgSC4yNjUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LlxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX21vdl9yZWFkX3N0c2RfZW50cmllcyhNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIGludCBlbnRyaWVzKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICBpbnQgcHNldWRvX3N0cmVhbV9pZDsKKworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpCisgICAgICAgIHJldHVybiAwOworICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMtMV07CisgICAgc2MgPSBzdC0+cHJpdl9kYXRhOworCisgICAgZm9yIChwc2V1ZG9fc3RyZWFtX2lkID0gMDsKKyAgICAgICAgIHBzZXVkb19zdHJlYW1faWQgPCBlbnRyaWVzICYmICFwYi0+ZW9mX3JlYWNoZWQ7CisgICAgICAgICBwc2V1ZG9fc3RyZWFtX2lkKyspIHsKKyAgICAgICAgLy9QYXJzaW5nIFNhbXBsZSBkZXNjcmlwdGlvbiB0YWJsZQorICAgICAgICBlbnVtIEFWQ29kZWNJRCBpZDsKKyAgICAgICAgaW50IHJldCwgZHJlZl9pZCA9IDE7CisgICAgICAgIE1PVkF0b20gYSA9IHsgQVZfUkwzMigic3RzZCIpIH07CisgICAgICAgIGludDY0X3Qgc3RhcnRfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgaW50NjRfdCBzaXplID0gYXZpb19yYjMyKHBiKTsgLyogc2l6ZSAqLworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBhdmlvX3JsMzIocGIpOyAvKiBkYXRhIGZvcm1hdCAqLworCisgICAgICAgIGlmIChzaXplID49IDE2KSB7CisgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiByZXNlcnZlZCAqLworICAgICAgICAgICAgYXZpb19yYjE2KHBiKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgIGRyZWZfaWQgPSBhdmlvX3JiMTYocGIpOworICAgICAgICB9ZWxzZSBpZiAoc2l6ZSA8PSA3KXsKKyAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBzaXplICUiUFJJZDY0IiBpbiBzdHNkXG4iLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1vdl9za2lwX211bHRpcGxlX3N0c2QoYywgcGIsIHN0LT5jb2RlYy0+Y29kZWNfdGFnLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLSAoYXZpb190ZWxsKHBiKSAtIHN0YXJ0X3BvcykpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgc2MtPnBzZXVkb19zdHJlYW1faWQgPSBzdC0+Y29kZWMtPmNvZGVjX3RhZyA/IC0xIDogcHNldWRvX3N0cmVhbV9pZDsKKyAgICAgICAgc2MtPmRyZWZfaWQ9IGRyZWZfaWQ7CisKKyAgICAgICAgaWQgPSBtb3ZfY29kZWNfaWQoc3QsIGZvcm1hdCk7CisKKyAgICAgICAgYXZfZGxvZyhjLT5mYywgInNpemU9JSJQUklkNjQiIDRDQz0gJWMlYyVjJWMgY29kZWNfdHlwZT0lZFxuIiwgc2l6ZSwKKyAgICAgICAgICAgICAgICAoZm9ybWF0ID4+IDApICYgMHhmZiwgKGZvcm1hdCA+PiA4KSAmIDB4ZmYsIChmb3JtYXQgPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAoZm9ybWF0ID4+IDI0KSAmIDB4ZmYsIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSk7CisKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZT09QVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gaWQ7CisgICAgICAgICAgICBtb3ZfcGFyc2Vfc3RzZF92aWRlbyhjLCBwYiwgc3QsIHNjKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGU9PUFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGlkOworICAgICAgICAgICAgbW92X3BhcnNlX3N0c2RfYXVkaW8oYywgcGIsIHN0LCBzYyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlPT1BVk1FRElBX1RZUEVfU1VCVElUTEUpeworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGlkOworICAgICAgICAgICAgbW92X3BhcnNlX3N0c2Rfc3VidGl0bGUoYywgcGIsIHN0LCBzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLSAoYXZpb190ZWxsKHBiKSAtIHN0YXJ0X3BvcykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gbW92X3BhcnNlX3N0c2RfZGF0YShjLCBwYiwgc3QsIHNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC0gKGF2aW9fdGVsbChwYikgLSBzdGFydF9wb3MpKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgLyogdGhpcyB3aWxsIHJlYWQgZXh0cmEgYXRvbXMgYXQgdGhlIGVuZCAod2F2ZSwgYWxhYywgZGFtciwgYXZjQywgaHZjQywgU01JIC4uLikgKi8KKyAgICAgICAgYS5zaXplID0gc2l6ZSAtIChhdmlvX3RlbGwocGIpIC0gc3RhcnRfcG9zKTsKKyAgICAgICAgaWYgKGEuc2l6ZSA+IDgpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gbW92X3JlYWRfZGVmYXVsdChjLCBwYiwgYSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgaWYgKGEuc2l6ZSA+IDApCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIGEuc2l6ZSk7CisgICAgfQorCisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgcmV0dXJuIG1vdl9maW5hbGl6ZV9zdHNkX2NvZGVjKGMsIHBiLCBzdCwgc2MpOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX3N0c2QoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgaW50IGVudHJpZXM7CisKKyAgICBhdmlvX3I4KHBiKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fcmIyNChwYik7IC8qIGZsYWdzICovCisgICAgZW50cmllcyA9IGF2aW9fcmIzMihwYik7CisKKyAgICByZXR1cm4gZmZfbW92X3JlYWRfc3RzZF9lbnRyaWVzKGMsIHBiLCBlbnRyaWVzKTsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9zdHNjKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICB1bnNpZ25lZCBpbnQgaSwgZW50cmllczsKKworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpCisgICAgICAgIHJldHVybiAwOworICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMtMV07CisgICAgc2MgPSBzdC0+cHJpdl9kYXRhOworCisgICAgYXZpb19yOChwYik7IC8qIHZlcnNpb24gKi8KKyAgICBhdmlvX3JiMjQocGIpOyAvKiBmbGFncyAqLworCisgICAgZW50cmllcyA9IGF2aW9fcmIzMihwYik7CisKKyAgICBhdl9kbG9nKGMtPmZjLCAidHJhY2tbJWldLnN0c2MuZW50cmllcyA9ICVpXG4iLCBjLT5mYy0+bmJfc3RyZWFtcy0xLCBlbnRyaWVzKTsKKworICAgIGlmICghZW50cmllcykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHNjLT5zdHNjX2RhdGEpCisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1dBUk5JTkcsICJEdXBsaWNhdGVkIFNUU0MgYXRvbVxuIik7CisgICAgYXZfZnJlZShzYy0+c3RzY19kYXRhKTsKKyAgICBzYy0+c3RzY19jb3VudCA9IDA7CisgICAgc2MtPnN0c2NfZGF0YSA9IGF2X21hbGxvY19hcnJheShlbnRyaWVzLCBzaXplb2YoKnNjLT5zdHNjX2RhdGEpKTsKKyAgICBpZiAoIXNjLT5zdHNjX2RhdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllcyAmJiAhcGItPmVvZl9yZWFjaGVkOyBpKyspIHsKKyAgICAgICAgc2MtPnN0c2NfZGF0YVtpXS5maXJzdCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIHNjLT5zdHNjX2RhdGFbaV0uY291bnQgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBzYy0+c3RzY19kYXRhW2ldLmlkID0gYXZpb19yYjMyKHBiKTsKKyAgICB9CisKKyAgICBzYy0+c3RzY19jb3VudCA9IGk7CisKKyAgICBpZiAocGItPmVvZl9yZWFjaGVkKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9zdHBzKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICB1bnNpZ25lZCBpLCBlbnRyaWVzOworCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKKyAgICBzYyA9IHN0LT5wcml2X2RhdGE7CisKKyAgICBhdmlvX3JiMzIocGIpOyAvLyB2ZXJzaW9uICsgZmxhZ3MKKworICAgIGVudHJpZXMgPSBhdmlvX3JiMzIocGIpOworICAgIGlmIChzYy0+c3Rwc19kYXRhKQorICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiRHVwbGljYXRlZCBTVFBTIGF0b21cbiIpOworICAgIGF2X2ZyZWUoc2MtPnN0cHNfZGF0YSk7CisgICAgc2MtPnN0cHNfY291bnQgPSAwOworICAgIHNjLT5zdHBzX2RhdGEgPSBhdl9tYWxsb2NfYXJyYXkoZW50cmllcywgc2l6ZW9mKCpzYy0+c3Rwc19kYXRhKSk7CisgICAgaWYgKCFzYy0+c3Rwc19kYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IGVudHJpZXMgJiYgIXBiLT5lb2ZfcmVhY2hlZDsgaSsrKSB7CisgICAgICAgIHNjLT5zdHBzX2RhdGFbaV0gPSBhdmlvX3JiMzIocGIpOworICAgICAgICAvL2F2X2Rsb2coYy0+ZmMsICJzdHBzICVkXG4iLCBzYy0+c3Rwc19kYXRhW2ldKTsKKyAgICB9CisKKyAgICBzYy0+c3Rwc19jb3VudCA9IGk7CisKKyAgICBpZiAocGItPmVvZl9yZWFjaGVkKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9zdHNzKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICB1bnNpZ25lZCBpbnQgaSwgZW50cmllczsKKworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpCisgICAgICAgIHJldHVybiAwOworICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMtMV07CisgICAgc2MgPSBzdC0+cHJpdl9kYXRhOworCisgICAgYXZpb19yOChwYik7IC8qIHZlcnNpb24gKi8KKyAgICBhdmlvX3JiMjQocGIpOyAvKiBmbGFncyAqLworCisgICAgZW50cmllcyA9IGF2aW9fcmIzMihwYik7CisKKyAgICBhdl9kbG9nKGMtPmZjLCAia2V5ZnJhbWVfY291bnQgPSAlZFxuIiwgZW50cmllcyk7CisKKyAgICBpZiAoIWVudHJpZXMpCisgICAgeworICAgICAgICBzYy0+a2V5ZnJhbWVfYWJzZW50ID0gMTsKKyAgICAgICAgaWYgKCFzdC0+bmVlZF9wYXJzaW5nICYmIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChzYy0+a2V5ZnJhbWVzKQorICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiRHVwbGljYXRlZCBTVFNTIGF0b21cbiIpOworICAgIGF2X2ZyZWUoc2MtPmtleWZyYW1lcyk7CisgICAgc2MtPmtleWZyYW1lX2NvdW50ID0gMDsKKyAgICBzYy0+a2V5ZnJhbWVzID0gYXZfbWFsbG9jX2FycmF5KGVudHJpZXMsIHNpemVvZigqc2MtPmtleWZyYW1lcykpOworICAgIGlmICghc2MtPmtleWZyYW1lcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzICYmICFwYi0+ZW9mX3JlYWNoZWQ7IGkrKykgeworICAgICAgICBzYy0+a2V5ZnJhbWVzW2ldID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgLy9hdl9kbG9nKGMtPmZjLCAia2V5ZnJhbWVzW109JWRcbiIsIHNjLT5rZXlmcmFtZXNbaV0pOworICAgIH0KKworICAgIHNjLT5rZXlmcmFtZV9jb3VudCA9IGk7CisKKyAgICBpZiAocGItPmVvZl9yZWFjaGVkKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9zdHN6KE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICB1bnNpZ25lZCBpbnQgaSwgZW50cmllcywgc2FtcGxlX3NpemUsIGZpZWxkX3NpemUsIG51bV9ieXRlczsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZjsKKworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpCisgICAgICAgIHJldHVybiAwOworICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMtMV07CisgICAgc2MgPSBzdC0+cHJpdl9kYXRhOworCisgICAgYXZpb19yOChwYik7IC8qIHZlcnNpb24gKi8KKyAgICBhdmlvX3JiMjQocGIpOyAvKiBmbGFncyAqLworCisgICAgaWYgKGF0b20udHlwZSA9PSBNS1RBRygncycsJ3QnLCdzJywneicpKSB7CisgICAgICAgIHNhbXBsZV9zaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgaWYgKCFzYy0+c2FtcGxlX3NpemUpIC8qIGRvIG5vdCBvdmVyd3JpdGUgdmFsdWUgY29tcHV0ZWQgaW4gc3RzZCAqLworICAgICAgICAgICAgc2MtPnNhbXBsZV9zaXplID0gc2FtcGxlX3NpemU7CisgICAgICAgIHNjLT5zdHN6X3NhbXBsZV9zaXplID0gc2FtcGxlX3NpemU7CisgICAgICAgIGZpZWxkX3NpemUgPSAzMjsKKyAgICB9IGVsc2UgeworICAgICAgICBzYW1wbGVfc2l6ZSA9IDA7CisgICAgICAgIGF2aW9fcmIyNChwYik7IC8qIHJlc2VydmVkICovCisgICAgICAgIGZpZWxkX3NpemUgPSBhdmlvX3I4KHBiKTsKKyAgICB9CisgICAgZW50cmllcyA9IGF2aW9fcmIzMihwYik7CisKKyAgICBhdl9kbG9nKGMtPmZjLCAic2FtcGxlX3NpemUgPSAlZCBzYW1wbGVfY291bnQgPSAlZFxuIiwgc2MtPnNhbXBsZV9zaXplLCBlbnRyaWVzKTsKKworICAgIHNjLT5zYW1wbGVfY291bnQgPSBlbnRyaWVzOworICAgIGlmIChzYW1wbGVfc2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoZmllbGRfc2l6ZSAhPSA0ICYmIGZpZWxkX3NpemUgIT0gOCAmJiBmaWVsZF9zaXplICE9IDE2ICYmIGZpZWxkX3NpemUgIT0gMzIpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSBmaWVsZCBzaXplICVkXG4iLCBmaWVsZF9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCFlbnRyaWVzKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoZW50cmllcyA+PSAoVUlOVF9NQVggLSA0KSAvIGZpZWxkX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChzYy0+c2FtcGxlX3NpemVzKQorICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiRHVwbGljYXRlZCBTVFNaIGF0b21cbiIpOworICAgIGF2X2ZyZWUoc2MtPnNhbXBsZV9zaXplcyk7CisgICAgc2MtPnNhbXBsZV9jb3VudCA9IDA7CisgICAgc2MtPnNhbXBsZV9zaXplcyA9IGF2X21hbGxvY19hcnJheShlbnRyaWVzLCBzaXplb2YoKnNjLT5zYW1wbGVfc2l6ZXMpKTsKKyAgICBpZiAoIXNjLT5zYW1wbGVfc2l6ZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBudW1fYnl0ZXMgPSAoZW50cmllcypmaWVsZF9zaXplKzQpPj4zOworCisgICAgYnVmID0gYXZfbWFsbG9jKG51bV9ieXRlcytGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIWJ1ZikgeworICAgICAgICBhdl9mcmVlcCgmc2MtPnNhbXBsZV9zaXplcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaWYgKGF2aW9fcmVhZChwYiwgYnVmLCBudW1fYnl0ZXMpIDwgbnVtX2J5dGVzKSB7CisgICAgICAgIGF2X2ZyZWVwKCZzYy0+c2FtcGxlX3NpemVzKTsKKyAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCA4Km51bV9ieXRlcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllcyAmJiAhcGItPmVvZl9yZWFjaGVkOyBpKyspIHsKKyAgICAgICAgc2MtPnNhbXBsZV9zaXplc1tpXSA9IGdldF9iaXRzX2xvbmcoJmdiLCBmaWVsZF9zaXplKTsKKyAgICAgICAgc2MtPmRhdGFfc2l6ZSArPSBzYy0+c2FtcGxlX3NpemVzW2ldOworICAgIH0KKworICAgIHNjLT5zYW1wbGVfY291bnQgPSBpOworCisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgYXZfZnJlZShidWYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX3N0dHMoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOworICAgIHVuc2lnbmVkIGludCBpLCBlbnRyaWVzOworICAgIGludDY0X3QgZHVyYXRpb249MDsKKyAgICBpbnQ2NF90IHRvdGFsX3NhbXBsZV9jb3VudD0wOworCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKKyAgICBzYyA9IHN0LT5wcml2X2RhdGE7CisKKyAgICBhdmlvX3I4KHBiKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fcmIyNChwYik7IC8qIGZsYWdzICovCisgICAgZW50cmllcyA9IGF2aW9fcmIzMihwYik7CisKKyAgICBhdl9kbG9nKGMtPmZjLCAidHJhY2tbJWldLnN0dHMuZW50cmllcyA9ICVpXG4iLAorICAgICAgICAgICAgYy0+ZmMtPm5iX3N0cmVhbXMtMSwgZW50cmllcyk7CisKKyAgICBpZiAoc2MtPnN0dHNfZGF0YSkKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgIkR1cGxpY2F0ZWQgU1RUUyBhdG9tXG4iKTsKKyAgICBhdl9mcmVlKHNjLT5zdHRzX2RhdGEpOworICAgIHNjLT5zdHRzX2NvdW50ID0gMDsKKyAgICBzYy0+c3R0c19kYXRhID0gYXZfbWFsbG9jX2FycmF5KGVudHJpZXMsIHNpemVvZigqc2MtPnN0dHNfZGF0YSkpOworICAgIGlmICghc2MtPnN0dHNfZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzICYmICFwYi0+ZW9mX3JlYWNoZWQ7IGkrKykgeworICAgICAgICBpbnQgc2FtcGxlX2R1cmF0aW9uOworICAgICAgICBpbnQgc2FtcGxlX2NvdW50OworCisgICAgICAgIHNhbXBsZV9jb3VudD1hdmlvX3JiMzIocGIpOworICAgICAgICBzYW1wbGVfZHVyYXRpb24gPSBhdmlvX3JiMzIocGIpOworCisgICAgICAgIC8qIHNhbXBsZV9kdXJhdGlvbiA8IDAgaXMgaW52YWxpZCBiYXNlZCBvbiB0aGUgc3BlYyAqLworICAgICAgICBpZiAoc2FtcGxlX2R1cmF0aW9uIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIFNhbXBsZURlbHRhICVkIGluIFNUVFMsIGF0ICVkIHN0OiVkXG4iLAorICAgICAgICAgICAgICAgICAgIHNhbXBsZV9kdXJhdGlvbiwgaSwgYy0+ZmMtPm5iX3N0cmVhbXMtMSk7CisgICAgICAgICAgICBzYW1wbGVfZHVyYXRpb24gPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChzYW1wbGVfY291bnQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2FtcGxlX2NvdW50PSVkXG4iLCBzYW1wbGVfY291bnQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgc2MtPnN0dHNfZGF0YVtpXS5jb3VudD0gc2FtcGxlX2NvdW50OworICAgICAgICBzYy0+c3R0c19kYXRhW2ldLmR1cmF0aW9uPSBzYW1wbGVfZHVyYXRpb247CisKKyAgICAgICAgYXZfZGxvZyhjLT5mYywgInNhbXBsZV9jb3VudD0lZCwgc2FtcGxlX2R1cmF0aW9uPSVkXG4iLAorICAgICAgICAgICAgICAgIHNhbXBsZV9jb3VudCwgc2FtcGxlX2R1cmF0aW9uKTsKKworICAgICAgICBpZiAoICAgaSsxID09IGVudHJpZXMKKyAgICAgICAgICAgICYmIGkKKyAgICAgICAgICAgICYmIHNhbXBsZV9jb3VudCA9PSAxCisgICAgICAgICAgICAmJiB0b3RhbF9zYW1wbGVfY291bnQgPiAxMDAKKyAgICAgICAgICAgICYmIHNhbXBsZV9kdXJhdGlvbi8xMCA+IGR1cmF0aW9uIC8gdG90YWxfc2FtcGxlX2NvdW50KQorICAgICAgICAgICAgc2FtcGxlX2R1cmF0aW9uID0gZHVyYXRpb24gLyB0b3RhbF9zYW1wbGVfY291bnQ7CisgICAgICAgIGR1cmF0aW9uKz0oaW50NjRfdClzYW1wbGVfZHVyYXRpb24qc2FtcGxlX2NvdW50OworICAgICAgICB0b3RhbF9zYW1wbGVfY291bnQrPXNhbXBsZV9jb3VudDsKKyAgICB9CisKKyAgICBzYy0+c3R0c19jb3VudCA9IGk7CisKKyAgICBzYy0+ZHVyYXRpb25fZm9yX2ZwcyAgKz0gZHVyYXRpb247CisgICAgc2MtPm5iX2ZyYW1lc19mb3JfZnBzICs9IHRvdGFsX3NhbXBsZV9jb3VudDsKKworICAgIGlmIChwYi0+ZW9mX3JlYWNoZWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHN0LT5uYl9mcmFtZXM9IHRvdGFsX3NhbXBsZV9jb3VudDsKKyAgICBpZiAoZHVyYXRpb24pCisgICAgICAgIHN0LT5kdXJhdGlvbj0gZHVyYXRpb247CisgICAgc2MtPnRyYWNrX2VuZCA9IGR1cmF0aW9uOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtb3ZfdXBkYXRlX2R0c19zaGlmdChNT1ZTdHJlYW1Db250ZXh0ICpzYywgaW50IGR1cmF0aW9uKQoreworICAgIGlmIChkdXJhdGlvbiA8IDApIHsKKyAgICAgICAgc2MtPmR0c19zaGlmdCA9IEZGTUFYKHNjLT5kdHNfc2hpZnQsIC1kdXJhdGlvbik7CisgICAgfQorfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX2N0dHMoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOworICAgIHVuc2lnbmVkIGludCBpLCBlbnRyaWVzOworCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKKyAgICBzYyA9IHN0LT5wcml2X2RhdGE7CisKKyAgICBhdmlvX3I4KHBiKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fcmIyNChwYik7IC8qIGZsYWdzICovCisgICAgZW50cmllcyA9IGF2aW9fcmIzMihwYik7CisKKyAgICBhdl9kbG9nKGMtPmZjLCAidHJhY2tbJWldLmN0dHMuZW50cmllcyA9ICVpXG4iLCBjLT5mYy0+bmJfc3RyZWFtcy0xLCBlbnRyaWVzKTsKKworICAgIGlmICghZW50cmllcykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGVudHJpZXMgPj0gVUlOVF9NQVggLyBzaXplb2YoKnNjLT5jdHRzX2RhdGEpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBzYy0+Y3R0c19kYXRhID0gYXZfbWFsbG9jKGVudHJpZXMgKiBzaXplb2YoKnNjLT5jdHRzX2RhdGEpKTsKKyAgICBpZiAoIXNjLT5jdHRzX2RhdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllcyAmJiAhcGItPmVvZl9yZWFjaGVkOyBpKyspIHsKKyAgICAgICAgaW50IGNvdW50ICAgID1hdmlvX3JiMzIocGIpOworICAgICAgICBpbnQgZHVyYXRpb24gPWF2aW9fcmIzMihwYik7CisKKyAgICAgICAgc2MtPmN0dHNfZGF0YVtpXS5jb3VudCAgID0gY291bnQ7CisgICAgICAgIHNjLT5jdHRzX2RhdGFbaV0uZHVyYXRpb249IGR1cmF0aW9uOworCisgICAgICAgIGF2X2Rsb2coYy0+ZmMsICJjb3VudD0lZCwgZHVyYXRpb249JWRcbiIsCisgICAgICAgICAgICAgICAgY291bnQsIGR1cmF0aW9uKTsKKworICAgICAgICBpZiAoRkZBQlMoZHVyYXRpb24pID4gKDE8PDI4KSAmJiBpKzI8ZW50cmllcykgeworICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgIkNUVFMgaW52YWxpZFxuIik7CisgICAgICAgICAgICBhdl9mcmVlcCgmc2MtPmN0dHNfZGF0YSk7CisgICAgICAgICAgICBzYy0+Y3R0c19jb3VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpKzI8ZW50cmllcykKKyAgICAgICAgICAgIG1vdl91cGRhdGVfZHRzX3NoaWZ0KHNjLCBkdXJhdGlvbik7CisgICAgfQorCisgICAgc2MtPmN0dHNfY291bnQgPSBpOworCisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgYXZfZGxvZyhjLT5mYywgImR0cyBzaGlmdCAlZFxuIiwgc2MtPmR0c19zaGlmdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9zYmdwKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICB1bnNpZ25lZCBpbnQgaSwgZW50cmllczsKKyAgICB1aW50OF90IHZlcnNpb247CisgICAgdWludDMyX3QgZ3JvdXBpbmdfdHlwZTsKKworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpCisgICAgICAgIHJldHVybiAwOworICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMtMV07CisgICAgc2MgPSBzdC0+cHJpdl9kYXRhOworCisgICAgdmVyc2lvbiA9IGF2aW9fcjgocGIpOyAvKiB2ZXJzaW9uICovCisgICAgYXZpb19yYjI0KHBiKTsgLyogZmxhZ3MgKi8KKyAgICBncm91cGluZ190eXBlID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZiAoZ3JvdXBpbmdfdHlwZSAhPSBNS1RBRyggJ3InLCdhJywncCcsJyAnKSkKKyAgICAgICAgcmV0dXJuIDA7IC8qIG9ubHkgc3VwcG9ydCAncmFwICcgZ3JvdXBpbmcgKi8KKyAgICBpZiAodmVyc2lvbiA9PSAxKQorICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBncm91cGluZ190eXBlX3BhcmFtZXRlciAqLworCisgICAgZW50cmllcyA9IGF2aW9fcmIzMihwYik7CisgICAgaWYgKCFlbnRyaWVzKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc2MtPnJhcF9ncm91cCkKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgIkR1cGxpY2F0ZWQgU0JHUCBhdG9tXG4iKTsKKyAgICBhdl9mcmVlKHNjLT5yYXBfZ3JvdXApOworICAgIHNjLT5yYXBfZ3JvdXBfY291bnQgPSAwOworICAgIHNjLT5yYXBfZ3JvdXAgPSBhdl9tYWxsb2NfYXJyYXkoZW50cmllcywgc2l6ZW9mKCpzYy0+cmFwX2dyb3VwKSk7CisgICAgaWYgKCFzYy0+cmFwX2dyb3VwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IGVudHJpZXMgJiYgIXBiLT5lb2ZfcmVhY2hlZDsgaSsrKSB7CisgICAgICAgIHNjLT5yYXBfZ3JvdXBbaV0uY291bnQgPSBhdmlvX3JiMzIocGIpOyAvKiBzYW1wbGVfY291bnQgKi8KKyAgICAgICAgc2MtPnJhcF9ncm91cFtpXS5pbmRleCA9IGF2aW9fcmIzMihwYik7IC8qIGdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4ICovCisgICAgfQorCisgICAgc2MtPnJhcF9ncm91cF9jb3VudCA9IGk7CisKKyAgICByZXR1cm4gcGItPmVvZl9yZWFjaGVkID8gQVZFUlJPUl9FT0YgOiAwOworfQorCitzdGF0aWMgdm9pZCBtb3ZfYnVpbGRfaW5kZXgoTU9WQ29udGV4dCAqbW92LCBBVlN0cmVhbSAqc3QpCit7CisgICAgTU9WU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOworICAgIGludDY0X3QgY3VycmVudF9vZmZzZXQ7CisgICAgaW50NjRfdCBjdXJyZW50X2R0cyA9IDA7CisgICAgdW5zaWduZWQgaW50IHN0dHNfaW5kZXggPSAwOworICAgIHVuc2lnbmVkIGludCBzdHNjX2luZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgc3Rzc19pbmRleCA9IDA7CisgICAgdW5zaWduZWQgaW50IHN0cHNfaW5kZXggPSAwOworICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgIHVpbnQ2NF90IHN0cmVhbV9zaXplID0gMDsKKworICAgIC8qIGFkanVzdCBmaXJzdCBkdHMgYWNjb3JkaW5nIHRvIGVkaXQgbGlzdCAqLworICAgIGlmICgoc2MtPmVtcHR5X2R1cmF0aW9uIHx8IHNjLT5zdGFydF90aW1lKSAmJiBtb3YtPnRpbWVfc2NhbGUgPiAwKSB7CisgICAgICAgIGlmIChzYy0+ZW1wdHlfZHVyYXRpb24pCisgICAgICAgICAgICBzYy0+ZW1wdHlfZHVyYXRpb24gPSBhdl9yZXNjYWxlKHNjLT5lbXB0eV9kdXJhdGlvbiwgc2MtPnRpbWVfc2NhbGUsIG1vdi0+dGltZV9zY2FsZSk7CisgICAgICAgIHNjLT50aW1lX29mZnNldCA9IHNjLT5zdGFydF90aW1lIC0gc2MtPmVtcHR5X2R1cmF0aW9uOworICAgICAgICBjdXJyZW50X2R0cyA9IC1zYy0+dGltZV9vZmZzZXQ7CisgICAgICAgIGlmIChzYy0+Y3R0c19jb3VudD4wICYmIHNjLT5zdHRzX2NvdW50PjAgJiYKKyAgICAgICAgICAgIHNjLT5jdHRzX2RhdGFbMF0uZHVyYXRpb24gLyBGRk1BWChzYy0+c3R0c19kYXRhWzBdLmR1cmF0aW9uLCAxKSA+IDE2KSB7CisgICAgICAgICAgICAvKiBtb3JlIHRoYW4gMTYgZnJhbWVzIGRlbGF5LCBkdHMgYXJlIGxpa2VseSB3cm9uZworICAgICAgICAgICAgICAgdGhpcyBoYXBwZW5zIHdpdGggZmlsZXMgY3JlYXRlZCBieSBpTW92aWUgKi8KKyAgICAgICAgICAgIHNjLT53cm9uZ19kdHMgPSAxOworICAgICAgICAgICAgc3QtPmNvZGVjLT5oYXNfYl9mcmFtZXMgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyogb25seSB1c2Ugb2xkIHVuY29tcHJlc3NlZCBhdWRpbyBjaHVuayBkZW11eGluZyB3aGVuIHN0dHMgc3BlY2lmaWVzIGl0ICovCisgICAgaWYgKCEoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgIHNjLT5zdHRzX2NvdW50ID09IDEgJiYgc2MtPnN0dHNfZGF0YVswXS5kdXJhdGlvbiA9PSAxKSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgY3VycmVudF9zYW1wbGUgPSAwOworICAgICAgICB1bnNpZ25lZCBpbnQgc3R0c19zYW1wbGUgPSAwOworICAgICAgICB1bnNpZ25lZCBpbnQgc2FtcGxlX3NpemU7CisgICAgICAgIHVuc2lnbmVkIGludCBkaXN0YW5jZSA9IDA7CisgICAgICAgIHVuc2lnbmVkIGludCByYXBfZ3JvdXBfaW5kZXggPSAwOworICAgICAgICB1bnNpZ25lZCBpbnQgcmFwX2dyb3VwX3NhbXBsZSA9IDA7CisgICAgICAgIGludCByYXBfZ3JvdXBfcHJlc2VudCA9IHNjLT5yYXBfZ3JvdXBfY291bnQgJiYgc2MtPnJhcF9ncm91cDsKKyAgICAgICAgaW50IGtleV9vZmYgPSAoc2MtPmtleWZyYW1lX2NvdW50ICYmIHNjLT5rZXlmcmFtZXNbMF0gPiAwKSB8fCAoc2MtPnN0cHNfY291bnQgJiYgc2MtPnN0cHNfZGF0YVswXSA+IDApOworCisgICAgICAgIGN1cnJlbnRfZHRzIC09IHNjLT5kdHNfc2hpZnQ7CisKKyAgICAgICAgaWYgKCFzYy0+c2FtcGxlX2NvdW50IHx8IHN0LT5uYl9pbmRleF9lbnRyaWVzKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoc2MtPnNhbXBsZV9jb3VudCA+PSBVSU5UX01BWCAvIHNpemVvZigqc3QtPmluZGV4X2VudHJpZXMpIC0gc3QtPm5iX2luZGV4X2VudHJpZXMpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChhdl9yZWFsbG9jcF9hcnJheSgmc3QtPmluZGV4X2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+bmJfaW5kZXhfZW50cmllcyArIHNjLT5zYW1wbGVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnN0LT5pbmRleF9lbnRyaWVzKSkgPCAwKSB7CisgICAgICAgICAgICBzdC0+bmJfaW5kZXhfZW50cmllcyA9IDA7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3QtPmluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemUgPSAoc3QtPm5iX2luZGV4X2VudHJpZXMgKyBzYy0+c2FtcGxlX2NvdW50KSAqIHNpemVvZigqc3QtPmluZGV4X2VudHJpZXMpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzYy0+Y2h1bmtfY291bnQ7IGkrKykgeworICAgICAgICAgICAgaW50NjRfdCBuZXh0X29mZnNldCA9IGkrMSA8IHNjLT5jaHVua19jb3VudCA/IHNjLT5jaHVua19vZmZzZXRzW2krMV0gOiBJTlQ2NF9NQVg7CisgICAgICAgICAgICBjdXJyZW50X29mZnNldCA9IHNjLT5jaHVua19vZmZzZXRzW2ldOworICAgICAgICAgICAgd2hpbGUgKHN0c2NfaW5kZXggKyAxIDwgc2MtPnN0c2NfY291bnQgJiYKKyAgICAgICAgICAgICAgICBpICsgMSA9PSBzYy0+c3RzY19kYXRhW3N0c2NfaW5kZXggKyAxXS5maXJzdCkKKyAgICAgICAgICAgICAgICBzdHNjX2luZGV4Kys7CisKKyAgICAgICAgICAgIGlmIChuZXh0X29mZnNldCA+IGN1cnJlbnRfb2Zmc2V0ICYmIHNjLT5zYW1wbGVfc2l6ZT4wICYmIHNjLT5zYW1wbGVfc2l6ZSA8IHNjLT5zdHN6X3NhbXBsZV9zaXplICYmCisgICAgICAgICAgICAgICAgc2MtPnN0c2NfZGF0YVtzdHNjX2luZGV4XS5jb3VudCAqIChpbnQ2NF90KXNjLT5zdHN6X3NhbXBsZV9zaXplID4gbmV4dF9vZmZzZXQgLSBjdXJyZW50X29mZnNldCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfV0FSTklORywgIlNUU1ogc2FtcGxlIHNpemUgJWQgaW52YWxpZCAodG9vIGxhcmdlKSwgaWdub3JpbmdcbiIsIHNjLT5zdHN6X3NhbXBsZV9zaXplKTsKKyAgICAgICAgICAgICAgICBzYy0+c3Rzel9zYW1wbGVfc2l6ZSA9IHNjLT5zYW1wbGVfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzYy0+c3Rzel9zYW1wbGVfc2l6ZT4wICYmIHNjLT5zdHN6X3NhbXBsZV9zaXplIDwgc2MtPnNhbXBsZV9zaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiU1RTWiBzYW1wbGUgc2l6ZSAlZCBpbnZhbGlkICh0b28gc21hbGwpLCBpZ25vcmluZ1xuIiwgc2MtPnN0c3pfc2FtcGxlX3NpemUpOworICAgICAgICAgICAgICAgIHNjLT5zdHN6X3NhbXBsZV9zaXplID0gc2MtPnNhbXBsZV9zaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2MtPnN0c2NfZGF0YVtzdHNjX2luZGV4XS5jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGtleWZyYW1lID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudF9zYW1wbGUgPj0gc2MtPnNhbXBsZV9jb3VudCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX0VSUk9SLCAid3Jvbmcgc2FtcGxlIGNvdW50XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghc2MtPmtleWZyYW1lX2Fic2VudCAmJiAoIXNjLT5rZXlmcmFtZV9jb3VudCB8fCBjdXJyZW50X3NhbXBsZStrZXlfb2ZmID09IHNjLT5rZXlmcmFtZXNbc3Rzc19pbmRleF0pKSB7CisgICAgICAgICAgICAgICAgICAgIGtleWZyYW1lID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0c3NfaW5kZXggKyAxIDwgc2MtPmtleWZyYW1lX2NvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgc3Rzc19pbmRleCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2MtPnN0cHNfY291bnQgJiYgY3VycmVudF9zYW1wbGUra2V5X29mZiA9PSBzYy0+c3Rwc19kYXRhW3N0cHNfaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgIGtleWZyYW1lID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cHNfaW5kZXggKyAxIDwgc2MtPnN0cHNfY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHBzX2luZGV4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyYXBfZ3JvdXBfcHJlc2VudCAmJiByYXBfZ3JvdXBfaW5kZXggPCBzYy0+cmFwX2dyb3VwX2NvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYy0+cmFwX2dyb3VwW3JhcF9ncm91cF9pbmRleF0uaW5kZXggPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAga2V5ZnJhbWUgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoKytyYXBfZ3JvdXBfc2FtcGxlID09IHNjLT5yYXBfZ3JvdXBbcmFwX2dyb3VwX2luZGV4XS5jb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmFwX2dyb3VwX3NhbXBsZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICByYXBfZ3JvdXBfaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2MtPmtleWZyYW1lX2Fic2VudAorICAgICAgICAgICAgICAgICAgICAmJiAhc2MtPnN0cHNfY291bnQKKyAgICAgICAgICAgICAgICAgICAgJiYgIXJhcF9ncm91cF9wcmVzZW50CisgICAgICAgICAgICAgICAgICAgICYmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPIHx8IChpPT0wICYmIGo9PTApKSkKKyAgICAgICAgICAgICAgICAgICAgIGtleWZyYW1lID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5ZnJhbWUpCisgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gMDsKKyAgICAgICAgICAgICAgICBzYW1wbGVfc2l6ZSA9IHNjLT5zdHN6X3NhbXBsZV9zaXplID4gMCA/IHNjLT5zdHN6X3NhbXBsZV9zaXplIDogc2MtPnNhbXBsZV9zaXplc1tjdXJyZW50X3NhbXBsZV07CisgICAgICAgICAgICAgICAgaWYgKHNjLT5wc2V1ZG9fc3RyZWFtX2lkID09IC0xIHx8CisgICAgICAgICAgICAgICAgICAgc2MtPnN0c2NfZGF0YVtzdHNjX2luZGV4XS5pZCAtIDEgPT0gc2MtPnBzZXVkb19zdHJlYW1faWQpIHsKKyAgICAgICAgICAgICAgICAgICAgQVZJbmRleEVudHJ5ICplID0gJnN0LT5pbmRleF9lbnRyaWVzW3N0LT5uYl9pbmRleF9lbnRyaWVzKytdOworICAgICAgICAgICAgICAgICAgICBlLT5wb3MgPSBjdXJyZW50X29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgZS0+dGltZXN0YW1wID0gY3VycmVudF9kdHM7CisgICAgICAgICAgICAgICAgICAgIGUtPnNpemUgPSBzYW1wbGVfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgZS0+bWluX2Rpc3RhbmNlID0gZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgICAgIGUtPmZsYWdzID0ga2V5ZnJhbWUgPyBBVklOREVYX0tFWUZSQU1FIDogMDsKKyAgICAgICAgICAgICAgICAgICAgYXZfZGxvZyhtb3YtPmZjLCAiQVZJbmRleCBzdHJlYW0gJWQsIHNhbXBsZSAlZCwgb2Zmc2V0ICUiUFJJeDY0IiwgZHRzICUiUFJJZDY0IiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaXplICVkLCBkaXN0YW5jZSAlZCwga2V5ZnJhbWUgJWRcbiIsIHN0LT5pbmRleCwgY3VycmVudF9zYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9vZmZzZXQsIGN1cnJlbnRfZHRzLCBzYW1wbGVfc2l6ZSwgZGlzdGFuY2UsIGtleWZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgc3QtPm5iX2luZGV4X2VudHJpZXMgPCAxMDApCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9yZnBzX2FkZF9mcmFtZShtb3YtPmZjLCBzdCwgY3VycmVudF9kdHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IHNhbXBsZV9zaXplOworICAgICAgICAgICAgICAgIHN0cmVhbV9zaXplICs9IHNhbXBsZV9zaXplOworICAgICAgICAgICAgICAgIGN1cnJlbnRfZHRzICs9IHNjLT5zdHRzX2RhdGFbc3R0c19pbmRleF0uZHVyYXRpb247CisgICAgICAgICAgICAgICAgZGlzdGFuY2UrKzsKKyAgICAgICAgICAgICAgICBzdHRzX3NhbXBsZSsrOworICAgICAgICAgICAgICAgIGN1cnJlbnRfc2FtcGxlKys7CisgICAgICAgICAgICAgICAgaWYgKHN0dHNfaW5kZXggKyAxIDwgc2MtPnN0dHNfY291bnQgJiYgc3R0c19zYW1wbGUgPT0gc2MtPnN0dHNfZGF0YVtzdHRzX2luZGV4XS5jb3VudCkgeworICAgICAgICAgICAgICAgICAgICBzdHRzX3NhbXBsZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN0dHNfaW5kZXgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0LT5kdXJhdGlvbiA+IDApCisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3RyZWFtX3NpemUqOCpzYy0+dGltZV9zY2FsZS9zdC0+ZHVyYXRpb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgdW5zaWduZWQgY2h1bmtfc2FtcGxlcywgdG90YWwgPSAwOworCisgICAgICAgIC8vIGNvbXB1dGUgdG90YWwgY2h1bmsgY291bnQKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjLT5zdHNjX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50LCBjaHVua19jb3VudDsKKworICAgICAgICAgICAgY2h1bmtfc2FtcGxlcyA9IHNjLT5zdHNjX2RhdGFbaV0uY291bnQ7CisgICAgICAgICAgICBpZiAoaSAhPSBzYy0+c3RzY19jb3VudCAtIDEgJiYKKyAgICAgICAgICAgICAgICBzYy0+c2FtcGxlc19wZXJfZnJhbWUgJiYgY2h1bmtfc2FtcGxlcyAlIHNjLT5zYW1wbGVzX3Blcl9mcmFtZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfRVJST1IsICJlcnJvciB1bmFsaWduZWQgY2h1bmtcbiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNjLT5zYW1wbGVzX3Blcl9mcmFtZSA+PSAxNjApIHsgLy8gZ3NtCisgICAgICAgICAgICAgICAgY291bnQgPSBjaHVua19zYW1wbGVzIC8gc2MtPnNhbXBsZXNfcGVyX2ZyYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChzYy0+c2FtcGxlc19wZXJfZnJhbWUgPiAxKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxlcyA9ICgxMDI0L3NjLT5zYW1wbGVzX3Blcl9mcmFtZSkqc2MtPnNhbXBsZXNfcGVyX2ZyYW1lOworICAgICAgICAgICAgICAgIGNvdW50ID0gKGNodW5rX3NhbXBsZXMrc2FtcGxlcy0xKSAvIHNhbXBsZXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvdW50ID0gKGNodW5rX3NhbXBsZXMrMTAyMykgLyAxMDI0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaSA8IHNjLT5zdHNjX2NvdW50IC0gMSkKKyAgICAgICAgICAgICAgICBjaHVua19jb3VudCA9IHNjLT5zdHNjX2RhdGFbaSsxXS5maXJzdCAtIHNjLT5zdHNjX2RhdGFbaV0uZmlyc3Q7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2h1bmtfY291bnQgPSBzYy0+Y2h1bmtfY291bnQgLSAoc2MtPnN0c2NfZGF0YVtpXS5maXJzdCAtIDEpOworICAgICAgICAgICAgdG90YWwgKz0gY2h1bmtfY291bnQgKiBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Rsb2cobW92LT5mYywgImNodW5rIGNvdW50ICVkXG4iLCB0b3RhbCk7CisgICAgICAgIGlmICh0b3RhbCA+PSBVSU5UX01BWCAvIHNpemVvZigqc3QtPmluZGV4X2VudHJpZXMpIC0gc3QtPm5iX2luZGV4X2VudHJpZXMpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChhdl9yZWFsbG9jcF9hcnJheSgmc3QtPmluZGV4X2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+bmJfaW5kZXhfZW50cmllcyArIHRvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzdC0+aW5kZXhfZW50cmllcykpIDwgMCkgeworICAgICAgICAgICAgc3QtPm5iX2luZGV4X2VudHJpZXMgPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0LT5pbmRleF9lbnRyaWVzX2FsbG9jYXRlZF9zaXplID0gKHN0LT5uYl9pbmRleF9lbnRyaWVzICsgdG90YWwpICogc2l6ZW9mKCpzdC0+aW5kZXhfZW50cmllcyk7CisKKyAgICAgICAgLy8gcG9wdWxhdGUgaW5kZXgKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjLT5jaHVua19jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjdXJyZW50X29mZnNldCA9IHNjLT5jaHVua19vZmZzZXRzW2ldOworICAgICAgICAgICAgaWYgKHN0c2NfaW5kZXggKyAxIDwgc2MtPnN0c2NfY291bnQgJiYKKyAgICAgICAgICAgICAgICBpICsgMSA9PSBzYy0+c3RzY19kYXRhW3N0c2NfaW5kZXggKyAxXS5maXJzdCkKKyAgICAgICAgICAgICAgICBzdHNjX2luZGV4Kys7CisgICAgICAgICAgICBjaHVua19zYW1wbGVzID0gc2MtPnN0c2NfZGF0YVtzdHNjX2luZGV4XS5jb3VudDsKKworICAgICAgICAgICAgd2hpbGUgKGNodW5rX3NhbXBsZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgQVZJbmRleEVudHJ5ICplOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNpemUsIHNhbXBsZXM7CisKKyAgICAgICAgICAgICAgICBpZiAoc2MtPnNhbXBsZXNfcGVyX2ZyYW1lID49IDE2MCkgeyAvLyBnc20KKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyA9IHNjLT5zYW1wbGVzX3Blcl9mcmFtZTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNjLT5ieXRlc19wZXJfZnJhbWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjLT5zYW1wbGVzX3Blcl9mcmFtZSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgPSBGRk1JTigoMTAyNCAvIHNjLT5zYW1wbGVzX3Blcl9mcmFtZSkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPnNhbXBsZXNfcGVyX2ZyYW1lLCBjaHVua19zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAoc2FtcGxlcyAvIHNjLT5zYW1wbGVzX3Blcl9mcmFtZSkgKiBzYy0+Ynl0ZXNfcGVyX2ZyYW1lOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyA9IEZGTUlOKDEwMjQsIGNodW5rX3NhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNhbXBsZXMgKiBzYy0+c2FtcGxlX3NpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3QtPm5iX2luZGV4X2VudHJpZXMgPj0gdG90YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19FUlJPUiwgIndyb25nIGNodW5rIGNvdW50ICVkXG4iLCB0b3RhbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZSA9ICZzdC0+aW5kZXhfZW50cmllc1tzdC0+bmJfaW5kZXhfZW50cmllcysrXTsKKyAgICAgICAgICAgICAgICBlLT5wb3MgPSBjdXJyZW50X29mZnNldDsKKyAgICAgICAgICAgICAgICBlLT50aW1lc3RhbXAgPSBjdXJyZW50X2R0czsKKyAgICAgICAgICAgICAgICBlLT5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBlLT5taW5fZGlzdGFuY2UgPSAwOworICAgICAgICAgICAgICAgIGUtPmZsYWdzID0gQVZJTkRFWF9LRVlGUkFNRTsKKyAgICAgICAgICAgICAgICBhdl9kbG9nKG1vdi0+ZmMsICJBVkluZGV4IHN0cmVhbSAlZCwgY2h1bmsgJWQsIG9mZnNldCAlIlBSSXg2NCIsIGR0cyAlIlBSSWQ2NCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaXplICVkLCBkdXJhdGlvbiAlZFxuIiwgc3QtPmluZGV4LCBpLCBjdXJyZW50X29mZnNldCwgY3VycmVudF9kdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBzYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IHNpemU7CisgICAgICAgICAgICAgICAgY3VycmVudF9kdHMgKz0gc2FtcGxlczsKKyAgICAgICAgICAgICAgICBjaHVua19zYW1wbGVzIC09IHNhbXBsZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbW92X29wZW5fZHJlZihBVklPQ29udGV4dCAqKnBiLCBjb25zdCBjaGFyICpzcmMsIE1PVkRyZWYgKnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVklPSW50ZXJydXB0Q0IgKmludF9jYiwgaW50IHVzZV9hYnNvbHV0ZV9wYXRoLCBBVkZvcm1hdENvbnRleHQgKmZjKQoreworICAgIC8qIHRyeSByZWxhdGl2ZSBwYXRoLCB3ZSBkbyBub3QgdHJ5IHRoZSBhYnNvbHV0ZSBiZWNhdXNlIGl0IGNhbiBsZWFrIGluZm9ybWF0aW9uIGFib3V0IG91cgorICAgICAgIHN5c3RlbSB0byBhbiBhdHRhY2tlciAqLworICAgIGlmIChyZWYtPm5sdmxfdG8gPiAwICYmIHJlZi0+bmx2bF9mcm9tID4gMCkgeworICAgICAgICBjaGFyIGZpbGVuYW1lWzEwMjRdOworICAgICAgICBjb25zdCBjaGFyICpzcmNfcGF0aDsKKyAgICAgICAgaW50IGksIGw7CisKKyAgICAgICAgLyogZmluZCBhIHNvdXJjZSBkaXIgKi8KKyAgICAgICAgc3JjX3BhdGggPSBzdHJyY2hyKHNyYywgJy8nKTsKKyAgICAgICAgaWYgKHNyY19wYXRoKQorICAgICAgICAgICAgc3JjX3BhdGgrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3JjX3BhdGggPSBzcmM7CisKKyAgICAgICAgLyogZmluZCBhIG5leHQgbGV2ZWwgZG93biB0byB0YXJnZXQgKi8KKyAgICAgICAgZm9yIChpID0gMCwgbCA9IHN0cmxlbihyZWYtPnBhdGgpIC0gMTsgbCA+PSAwOyBsLS0pCisgICAgICAgICAgICBpZiAocmVmLT5wYXRoW2xdID09ICcvJykgeworICAgICAgICAgICAgICAgIGlmIChpID09IHJlZi0+bmx2bF90byAtIDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorCisgICAgICAgIC8qIGNvbXBvc2UgZmlsZW5hbWUgaWYgbmV4dCBsZXZlbCBkb3duIHRvIHRhcmdldCB3YXMgZm91bmQgKi8KKyAgICAgICAgaWYgKGkgPT0gcmVmLT5ubHZsX3RvIC0gMSAmJiBzcmNfcGF0aCAtIHNyYyAgPCBzaXplb2YoZmlsZW5hbWUpKSB7CisgICAgICAgICAgICBtZW1jcHkoZmlsZW5hbWUsIHNyYywgc3JjX3BhdGggLSBzcmMpOworICAgICAgICAgICAgZmlsZW5hbWVbc3JjX3BhdGggLSBzcmNdID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJlZi0+bmx2bF9mcm9tOyBpKyspCisgICAgICAgICAgICAgICAgYXZfc3RybGNhdChmaWxlbmFtZSwgIi4uLyIsIDEwMjQpOworCisgICAgICAgICAgICBhdl9zdHJsY2F0KGZpbGVuYW1lLCByZWYtPnBhdGggKyBsICsgMSwgMTAyNCk7CisKKyAgICAgICAgICAgIGlmICghYXZpb19vcGVuMihwYiwgZmlsZW5hbWUsIEFWSU9fRkxBR19SRUFELCBpbnRfY2IsIE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh1c2VfYWJzb2x1dGVfcGF0aCkgeworICAgICAgICBhdl9sb2coZmMsIEFWX0xPR19XQVJOSU5HLCAiVXNpbmcgYWJzb2x1dGUgcGF0aCBvbiB1c2VyIHJlcXVlc3QsICIKKyAgICAgICAgICAgICAgICJ0aGlzIGlzIGEgcG9zc2libGUgc2VjdXJpdHkgaXNzdWVcbiIpOworICAgICAgICBpZiAoIWF2aW9fb3BlbjIocGIsIHJlZi0+cGF0aCwgQVZJT19GTEFHX1JFQUQsIGludF9jYiwgTlVMTCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUihFTk9FTlQpOworfQorCitzdGF0aWMgdm9pZCBmaXhfdGltZXNjYWxlKE1PVkNvbnRleHQgKmMsIE1PVlN0cmVhbUNvbnRleHQgKnNjKQoreworICAgIGlmIChzYy0+dGltZV9zY2FsZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1dBUk5JTkcsICJzdHJlYW0gJWQsIHRpbWVzY2FsZSBub3Qgc2V0XG4iLCBzYy0+ZmZpbmRleCk7CisgICAgICAgIHNjLT50aW1lX3NjYWxlID0gYy0+dGltZV9zY2FsZTsKKyAgICAgICAgaWYgKHNjLT50aW1lX3NjYWxlIDw9IDApCisgICAgICAgICAgICBzYy0+dGltZV9zY2FsZSA9IDE7CisgICAgfQorfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX3RyYWsoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOworICAgIGludCByZXQ7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYy0+ZmMsIE5VTEwpOworICAgIGlmICghc3QpIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmlkID0gYy0+ZmMtPm5iX3N0cmVhbXM7CisgICAgc2MgPSBhdl9tYWxsb2N6KHNpemVvZihNT1ZTdHJlYW1Db250ZXh0KSk7CisgICAgaWYgKCFzYykgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5wcml2X2RhdGEgPSBzYzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKKyAgICBzYy0+ZmZpbmRleCA9IHN0LT5pbmRleDsKKworICAgIGlmICgocmV0ID0gbW92X3JlYWRfZGVmYXVsdChjLCBwYiwgYXRvbSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIHNhbml0eSBjaGVja3MgKi8KKyAgICBpZiAoc2MtPmNodW5rX2NvdW50ICYmICghc2MtPnN0dHNfY291bnQgfHwgIXNjLT5zdHNjX2NvdW50IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzYy0+c2FtcGxlX3NpemUgJiYgIXNjLT5zYW1wbGVfY291bnQpKSkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgInN0cmVhbSAlZCwgbWlzc2luZyBtYW5kYXRvcnkgYXRvbXMsIGJyb2tlbiBoZWFkZXJcbiIsCisgICAgICAgICAgICAgICBzdC0+aW5kZXgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmaXhfdGltZXNjYWxlKGMsIHNjKTsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzYy0+dGltZV9zY2FsZSk7CisKKyAgICBtb3ZfYnVpbGRfaW5kZXgoYywgc3QpOworCisgICAgaWYgKHNjLT5kcmVmX2lkLTEgPCBzYy0+ZHJlZnNfY291bnQgJiYgc2MtPmRyZWZzW3NjLT5kcmVmX2lkLTFdLnBhdGgpIHsKKyAgICAgICAgTU9WRHJlZiAqZHJlZiA9ICZzYy0+ZHJlZnNbc2MtPmRyZWZfaWQgLSAxXTsKKyAgICAgICAgaWYgKG1vdl9vcGVuX2RyZWYoJnNjLT5wYiwgYy0+ZmMtPmZpbGVuYW1lLCBkcmVmLCAmYy0+ZmMtPmludGVycnVwdF9jYWxsYmFjaywKKyAgICAgICAgICAgIGMtPnVzZV9hYnNvbHV0ZV9wYXRoLCBjLT5mYykgPCAwKQorICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgInN0cmVhbSAlZCwgZXJyb3Igb3BlbmluZyBhbGlhczogcGF0aD0nJXMnLCBkaXI9JyVzJywgIgorICAgICAgICAgICAgICAgICAgICJmaWxlbmFtZT0nJXMnLCB2b2x1bWU9JyVzJywgbmx2bF9mcm9tPSVkLCBubHZsX3RvPSVkXG4iLAorICAgICAgICAgICAgICAgICAgIHN0LT5pbmRleCwgZHJlZi0+cGF0aCwgZHJlZi0+ZGlyLCBkcmVmLT5maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICBkcmVmLT52b2x1bWUsIGRyZWYtPm5sdmxfZnJvbSwgZHJlZi0+bmx2bF90byk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2MtPnBiID0gYy0+ZmMtPnBiOworICAgICAgICBzYy0+cGJfaXNfY29waWVkID0gMTsKKyAgICB9CisKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBpZiAoIXN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAmJgorICAgICAgICAgICAgKHN0LT5jb2RlYy0+d2lkdGggIT0gc2MtPndpZHRoIHx8IHN0LT5jb2RlYy0+aGVpZ2h0ICE9IHNjLT5oZWlnaHQpKSB7CisgICAgICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGF2X2QycSgoKGRvdWJsZSlzdC0+Y29kZWMtPmhlaWdodCAqIHNjLT53aWR0aCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChkb3VibGUpc3QtPmNvZGVjLT53aWR0aCAqIHNjLT5oZWlnaHQpLCBJTlRfTUFYKTsKKyAgICAgICAgfQorCisjaWYgRkZfQVBJX1JfRlJBTUVfUkFURQorICAgICAgICBpZiAoc2MtPnN0dHNfY291bnQgPT0gMSB8fCAoc2MtPnN0dHNfY291bnQgPT0gMiAmJiBzYy0+c3R0c19kYXRhWzFdLmNvdW50ID09IDEpKQorICAgICAgICAgICAgYXZfcmVkdWNlKCZzdC0+cl9mcmFtZV9yYXRlLm51bSwgJnN0LT5yX2ZyYW1lX3JhdGUuZGVuLAorICAgICAgICAgICAgICAgICAgICAgIHNjLT50aW1lX3NjYWxlLCBzYy0+c3R0c19kYXRhWzBdLmR1cmF0aW9uLCBJTlRfTUFYKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIGRvbmUgZm9yIGFpNXEsIGFpNTIsIGFpNTUsIGFpMXEsIGFpMTIgYW5kIGFpMTUuCisgICAgaWYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICYmIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCAmJgorICAgICAgICBUQUdfSVNfQVZDSShzdC0+Y29kZWMtPmNvZGVjX3RhZykpIHsKKyAgICAgICAgcmV0ID0gZmZfZ2VuZXJhdGVfYXZjaV9leHRyYWRhdGEoc3QpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisjaWYgQ09ORklHX0gyNjFfREVDT0RFUgorICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2MToKKyNlbmRpZgorI2lmIENPTkZJR19IMjYzX0RFQ09ERVIKKyAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjM6CisjZW5kaWYKKyNpZiBDT05GSUdfTVBFRzRfREVDT0RFUgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzQ6CisjZW5kaWYKKyAgICAgICAgc3QtPmNvZGVjLT53aWR0aCA9IDA7IC8qIGxldCBkZWNvZGVyIGluaXQgd2lkdGgvaGVpZ2h0ICovCisgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0PSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBEbyBub3QgbmVlZCB0aG9zZSBhbnltb3JlLiAqLworICAgIGF2X2ZyZWVwKCZzYy0+Y2h1bmtfb2Zmc2V0cyk7CisgICAgYXZfZnJlZXAoJnNjLT5zdHNjX2RhdGEpOworICAgIGF2X2ZyZWVwKCZzYy0+c2FtcGxlX3NpemVzKTsKKyAgICBhdl9mcmVlcCgmc2MtPmtleWZyYW1lcyk7CisgICAgYXZfZnJlZXAoJnNjLT5zdHRzX2RhdGEpOworICAgIGF2X2ZyZWVwKCZzYy0+c3Rwc19kYXRhKTsKKyAgICBhdl9mcmVlcCgmc2MtPnJhcF9ncm91cCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9pbHN0KE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIGludCByZXQ7CisgICAgYy0+aXR1bmVzX21ldGFkYXRhID0gMTsKKyAgICByZXQgPSBtb3ZfcmVhZF9kZWZhdWx0KGMsIHBiLCBhdG9tKTsKKyAgICBjLT5pdHVuZXNfbWV0YWRhdGEgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfY3VzdG9tXzJwbHVzKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgaW50IHNpemUpCit7CisgICAgaW50NjRfdCBlbmQgPSBhdmlvX3RlbGwocGIpICsgc2l6ZTsKKyAgICB1aW50OF90ICprZXkgPSBOVUxMLCAqdmFsID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOworICAgIHNjID0gc3QtPnByaXZfZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgdWludDhfdCAqKnA7CisgICAgICAgIHVpbnQzMl90IGxlbiwgdGFnOworCisgICAgICAgIGlmIChlbmQgLSBhdmlvX3RlbGwocGIpIDw9IDEyKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbGVuID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgYXZpb19za2lwKHBiLCA0KTsgLy8gZmxhZ3MKKworICAgICAgICBpZiAobGVuIDwgMTIgfHwgbGVuIC0gMTIgPiBlbmQgLSBhdmlvX3RlbGwocGIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxlbiAtPSAxMjsKKworICAgICAgICBpZiAodGFnID09IE1LVEFHKCduJywgJ2EnLCAnbScsICdlJykpCisgICAgICAgICAgICBwID0gJmtleTsKKyAgICAgICAgZWxzZSBpZiAodGFnID09IE1LVEFHKCdkJywgJ2EnLCAndCcsICdhJykgJiYgbGVuID4gNCkgeworICAgICAgICAgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICAgICAgICAgIGxlbiAtPSA0OworICAgICAgICAgICAgcCA9ICZ2YWw7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgKnAgPSBhdl9tYWxsb2MobGVuICsgMSk7CisgICAgICAgIGlmICghKnApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXZpb19yZWFkKHBiLCAqcCwgbGVuKTsKKyAgICAgICAgKCpwKVtsZW5dID0gMDsKKyAgICB9CisKKyAgICBpZiAoa2V5ICYmIHZhbCkgeworICAgICAgICBpZiAoc3RyY21wKGtleSwgImlUdW5TTVBCIikgPT0gMCkgeworICAgICAgICAgICAgaW50IHByaW1pbmcsIHJlbWFpbmRlciwgc2FtcGxlczsKKyAgICAgICAgICAgIGlmKHNzY2FuZih2YWwsICIlKlggJVggJVggJVgiLCAmcHJpbWluZywgJnJlbWFpbmRlciwgJnNhbXBsZXMpID09IDMpeworICAgICAgICAgICAgICAgIGlmKHByaW1pbmc+MCAmJiBwcmltaW5nPDE2Mzg0KQorICAgICAgICAgICAgICAgICAgICBzYy0+c3RhcnRfcGFkID0gcHJpbWluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKGtleSwgImNkZWMiKSAhPSAwKSB7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmYy0+ZmMtPm1ldGFkYXRhLCBrZXksIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZIHwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgICAgICAgICAga2V5ID0gdmFsID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2aW9fc2VlayhwYiwgZW5kLCBTRUVLX1NFVCk7CisgICAgYXZfZnJlZXAoJmtleSk7CisgICAgYXZfZnJlZXAoJnZhbCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfY3VzdG9tKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIGludDY0X3QgZW5kID0gYXZpb190ZWxsKHBiKSArIGF0b20uc2l6ZTsKKyAgICB1aW50MzJfdCB0YWcsIGxlbjsKKworICAgIGlmIChhdG9tLnNpemUgPCA4KQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBsZW4gPSBhdmlvX3JiMzIocGIpOworICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisKKyAgICBpZiAobGVuID4gYXRvbS5zaXplKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAodGFnID09IE1LVEFHKCdtJywgJ2UnLCAnYScsICduJykgJiYgbGVuID4gMTIpIHsKKyAgICAgICAgdWludDhfdCBkb21haW5bMTI4XTsKKyAgICAgICAgaW50IGRvbWFpbl9sZW47CisKKyAgICAgICAgYXZpb19za2lwKHBiLCA0KTsgLy8gZmxhZ3MKKyAgICAgICAgbGVuIC09IDEyOworCisgICAgICAgIGRvbWFpbl9sZW4gPSBhdmlvX2dldF9zdHIocGIsIGxlbiwgZG9tYWluLCBzaXplb2YoZG9tYWluKSk7CisgICAgICAgIGF2aW9fc2tpcChwYiwgbGVuIC0gZG9tYWluX2xlbik7CisgICAgICAgIHJldHVybiBtb3ZfcmVhZF9jdXN0b21fMnBsdXMoYywgcGIsIGVuZCAtIGF2aW9fdGVsbChwYikpOworICAgIH0KKworZmFpbDoKKyAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAiVW5oYW5kbGVkIG9yIG1hbGZvcm1lZCBjdXN0b20gbWV0YWRhdGEgb2Ygc2l6ZSAlIlBSSWQ2NCJcbiIsIGF0b20uc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfbWV0YShNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICB3aGlsZSAoYXRvbS5zaXplID4gOCkgeworICAgICAgICB1aW50MzJfdCB0YWcgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBhdG9tLnNpemUgLT0gNDsKKyAgICAgICAgaWYgKHRhZyA9PSBNS1RBRygnaCcsJ2QnLCdsJywncicpKSB7CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIC04LCBTRUVLX0NVUik7CisgICAgICAgICAgICBhdG9tLnNpemUgKz0gODsKKyAgICAgICAgICAgIHJldHVybiBtb3ZfcmVhZF9kZWZhdWx0KGMsIHBiLCBhdG9tKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF90a2hkKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIGludCBpOworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludDY0X3QgZGlzcF90cmFuc2Zvcm1bMl07CisgICAgaW50IGRpc3BsYXlfbWF0cml4WzNdWzNdOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICBpbnQgdmVyc2lvbjsKKyAgICBpbnQgZmxhZ3M7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOworICAgIHNjID0gc3QtPnByaXZfZGF0YTsKKworICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsKKyAgICBmbGFncyA9IGF2aW9fcmIyNChwYik7CisgICAgc3QtPmRpc3Bvc2l0aW9uIHw9IChmbGFncyAmIE1PVl9US0hEX0ZMQUdfRU5BQkxFRCkgPyBBVl9ESVNQT1NJVElPTl9ERUZBVUxUIDogMDsKKworICAgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgYXZpb19yYjY0KHBiKTsKKyAgICAgICAgYXZpb19yYjY0KHBiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBjcmVhdGlvbiB0aW1lICovCisgICAgICAgIGF2aW9fcmIzMihwYik7IC8qIG1vZGlmaWNhdGlvbiB0aW1lICovCisgICAgfQorICAgIHN0LT5pZCA9IChpbnQpYXZpb19yYjMyKHBiKTsgLyogdHJhY2sgaWQgKE5PVCAwICEpKi8KKyAgICBhdmlvX3JiMzIocGIpOyAvKiByZXNlcnZlZCAqLworCisgICAgLyogaGlnaGxldmVsIChjb25zaWRlcmluZyBlZGl0cykgZHVyYXRpb24gaW4gbW92aWUgdGltZWJhc2UgKi8KKyAgICAodmVyc2lvbiA9PSAxKSA/IGF2aW9fcmI2NChwYikgOiBhdmlvX3JiMzIocGIpOworICAgIGF2aW9fcmIzMihwYik7IC8qIHJlc2VydmVkICovCisgICAgYXZpb19yYjMyKHBiKTsgLyogcmVzZXJ2ZWQgKi8KKworICAgIGF2aW9fcmIxNihwYik7IC8qIGxheWVyICovCisgICAgYXZpb19yYjE2KHBiKTsgLyogYWx0ZXJuYXRlIGdyb3VwICovCisgICAgYXZpb19yYjE2KHBiKTsgLyogdm9sdW1lICovCisgICAgYXZpb19yYjE2KHBiKTsgLyogcmVzZXJ2ZWQgKi8KKworICAgIC8vcmVhZCBpbiB0aGUgZGlzcGxheSBtYXRyaXggKG91dGxpbmVkIGluIElTTyAxNDQ5Ni0xMiwgU2VjdGlvbiA2LjIuMikKKyAgICAvLyB0aGV5J3JlIGtlcHQgaW4gZml4ZWQgcG9pbnQgZm9ybWF0IHRocm91Z2ggYWxsIGNhbGN1bGF0aW9ucworICAgIC8vIHNhdmUgdSx2LHogdG8gc3RvcmUgdGhlIHdob2xlIG1hdHJpeCBpbiB0aGUgQVZfUEtUX0RBVEFfRElTUExBWU1BVFJJWAorICAgIC8vIHNpZGUgZGF0YSwgYnV0IHRoZSBzY2FsZSBmYWN0b3IgaXMgbm90IG5lZWRlZCB0byBjYWxjdWxhdGUgYXNwZWN0IHJhdGlvCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBkaXNwbGF5X21hdHJpeFtpXVswXSA9IGF2aW9fcmIzMihwYik7ICAgLy8gMTYuMTYgZml4ZWQgcG9pbnQKKyAgICAgICAgZGlzcGxheV9tYXRyaXhbaV1bMV0gPSBhdmlvX3JiMzIocGIpOyAgIC8vIDE2LjE2IGZpeGVkIHBvaW50CisgICAgICAgIGRpc3BsYXlfbWF0cml4W2ldWzJdID0gYXZpb19yYjMyKHBiKTsgICAvLyAgMi4zMCBmaXhlZCBwb2ludAorICAgIH0KKworICAgIHdpZHRoID0gYXZpb19yYjMyKHBiKTsgICAgICAgLy8gMTYuMTYgZml4ZWQgcG9pbnQgdHJhY2sgd2lkdGgKKyAgICBoZWlnaHQgPSBhdmlvX3JiMzIocGIpOyAgICAgIC8vIDE2LjE2IGZpeGVkIHBvaW50IHRyYWNrIGhlaWdodAorICAgIHNjLT53aWR0aCA9IHdpZHRoID4+IDE2OworICAgIHNjLT5oZWlnaHQgPSBoZWlnaHQgPj4gMTY7CisKKyAgICAvLyBzYXZlIHRoZSBtYXRyaXggYW5kIGFkZCByb3RhdGUgbWV0YWRhdGEgd2hlbiBpdCBpcyBub3QgdGhlIGRlZmF1bHQKKyAgICAvLyBpZGVudGl0eQorICAgIGlmIChkaXNwbGF5X21hdHJpeFswXVswXSAhPSAoMSA8PCAxNikgfHwKKyAgICAgICAgZGlzcGxheV9tYXRyaXhbMV1bMV0gIT0gKDEgPDwgMTYpIHx8CisgICAgICAgIGRpc3BsYXlfbWF0cml4WzJdWzJdICE9ICgxIDw8IDMwKSB8fAorICAgICAgICBkaXNwbGF5X21hdHJpeFswXVsxXSB8fCBkaXNwbGF5X21hdHJpeFswXVsyXSB8fAorICAgICAgICBkaXNwbGF5X21hdHJpeFsxXVswXSB8fCBkaXNwbGF5X21hdHJpeFsxXVsyXSB8fAorICAgICAgICBkaXNwbGF5X21hdHJpeFsyXVswXSB8fCBkaXNwbGF5X21hdHJpeFsyXVsxXSkgeworICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgZG91YmxlIHJvdGF0ZTsKKworICAgICAgICBhdl9mcmVlcCgmc2MtPmRpc3BsYXlfbWF0cml4KTsKKyAgICAgICAgc2MtPmRpc3BsYXlfbWF0cml4ID0gYXZfbWFsbG9jKHNpemVvZihpbnQzMl90KSAqIDkpOworICAgICAgICBpZiAoIXNjLT5kaXNwbGF5X21hdHJpeCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCisgICAgICAgICAgICAgICAgc2MtPmRpc3BsYXlfbWF0cml4W2kgKiAzICsgal0gPSBkaXNwbGF5X21hdHJpeFtqXVtpXTsKKworICAgICAgICByb3RhdGUgPSBhdl9kaXNwbGF5X3JvdGF0aW9uX2dldChzYy0+ZGlzcGxheV9tYXRyaXgpOworICAgICAgICBpZiAoIWlzbmFuKHJvdGF0ZSkpIHsKKyAgICAgICAgICAgIGNoYXIgcm90YXRlX2J1Zls2NF07CisgICAgICAgICAgICByb3RhdGUgPSAtcm90YXRlOworICAgICAgICAgICAgaWYgKHJvdGF0ZSA8IDApIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgICAgICAgICAgICAgcm90YXRlICs9IDM2MDsKKyAgICAgICAgICAgIHNucHJpbnRmKHJvdGF0ZV9idWYsIHNpemVvZihyb3RhdGVfYnVmKSwgIiVnIiwgcm90YXRlKTsKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJyb3RhdGUiLCByb3RhdGVfYnVmLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRyYW5zZm9ybSB0aGUgZGlzcGxheSB3aWR0aC9oZWlnaHQgYWNjb3JkaW5nIHRvIHRoZSBtYXRyaXgKKyAgICAvLyBza2lwIHRoaXMgaWYgdGhlIGRpc3BsYXkgbWF0cml4IGlzIHRoZSBkZWZhdWx0IGlkZW50aXR5IG1hdHJpeAorICAgIC8vIG9yIGlmIGl0IGlzIHJvdGF0aW5nIHRoZSBwaWN0dXJlLCBleCBpUGhvbmUgM0dTCisgICAgLy8gdG8ga2VlcCB0aGUgc2FtZSBzY2FsZSwgdXNlIFt3aWR0aCBoZWlnaHQgMTw8MTZdCisgICAgaWYgKHdpZHRoICYmIGhlaWdodCAmJgorICAgICAgICAoKGRpc3BsYXlfbWF0cml4WzBdWzBdICE9IDY1NTM2ICB8fAorICAgICAgICAgIGRpc3BsYXlfbWF0cml4WzFdWzFdICE9IDY1NTM2KSAmJgorICAgICAgICAgIWRpc3BsYXlfbWF0cml4WzBdWzFdICYmCisgICAgICAgICAhZGlzcGxheV9tYXRyaXhbMV1bMF0gJiYKKyAgICAgICAgICFkaXNwbGF5X21hdHJpeFsyXVswXSAmJiAhZGlzcGxheV9tYXRyaXhbMl1bMV0pKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICBkaXNwX3RyYW5zZm9ybVtpXSA9CisgICAgICAgICAgICAgICAgKGludDY0X3QpICB3aWR0aCAgKiBkaXNwbGF5X21hdHJpeFswXVtpXSArCisgICAgICAgICAgICAgICAgKGludDY0X3QpICBoZWlnaHQgKiBkaXNwbGF5X21hdHJpeFsxXVtpXSArCisgICAgICAgICAgICAgICAgKChpbnQ2NF90KSBkaXNwbGF5X21hdHJpeFsyXVtpXSA8PCAxNik7CisKKyAgICAgICAgLy9zYW1wbGUgYXNwZWN0IHJhdGlvIGlzIG5ldyB3aWR0aC9oZWlnaHQgZGl2aWRlZCBieSBvbGQgd2lkdGgvaGVpZ2h0CisgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfZDJxKAorICAgICAgICAgICAgKChkb3VibGUpIGRpc3BfdHJhbnNmb3JtWzBdICogaGVpZ2h0KSAvCisgICAgICAgICAgICAoKGRvdWJsZSkgZGlzcF90cmFuc2Zvcm1bMV0gKiB3aWR0aCksIElOVF9NQVgpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF90ZmhkKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIE1PVkZyYWdtZW50ICpmcmFnID0gJmMtPmZyYWdtZW50OworICAgIE1PVlRyYWNrRXh0ICp0cmV4ID0gTlVMTDsKKyAgICBNT1ZGcmFnbWVudEluZGV4KiBpbmRleCA9IE5VTEw7CisgICAgaW50IGZsYWdzLCB0cmFja19pZCwgaTsKKworICAgIGF2aW9fcjgocGIpOyAvKiB2ZXJzaW9uICovCisgICAgZmxhZ3MgPSBhdmlvX3JiMjQocGIpOworCisgICAgdHJhY2tfaWQgPSBhdmlvX3JiMzIocGIpOworICAgIGlmICghdHJhY2tfaWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGZyYWctPnRyYWNrX2lkID0gdHJhY2tfaWQ7CisgICAgZm9yIChpID0gMDsgaSA8IGMtPnRyZXhfY291bnQ7IGkrKykKKyAgICAgICAgaWYgKGMtPnRyZXhfZGF0YVtpXS50cmFja19pZCA9PSBmcmFnLT50cmFja19pZCkgeworICAgICAgICAgICAgdHJleCA9ICZjLT50cmV4X2RhdGFbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGlmICghdHJleCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgdHJleFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+ZnJhZ21lbnRfaW5kZXhfY291bnQ7IGkrKykgeworICAgICAgICBNT1ZGcmFnbWVudEluZGV4KiBjYW5kaWRhdGUgPSBjLT5mcmFnbWVudF9pbmRleF9kYXRhW2ldOworICAgICAgICBpZiAoY2FuZGlkYXRlLT50cmFja19pZCA9PSBmcmFnLT50cmFja19pZCkgeworICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgImZvdW5kIGZyYWdtZW50IGluZGV4IGZvciB0cmFjayAldVxuIiwgZnJhZy0+dHJhY2tfaWQpOworICAgICAgICAgICAgaW5kZXggPSBjYW5kaWRhdGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZyYWctPmJhc2VfZGF0YV9vZmZzZXQgPSBmbGFncyAmIE1PVl9URkhEX0JBU0VfREFUQV9PRkZTRVQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3JiNjQocGIpIDogZmxhZ3MgJiBNT1ZfVEZIRF9ERUZBVUxUX0JBU0VfSVNfTU9PRiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWctPm1vb2Zfb2Zmc2V0IDogZnJhZy0+aW1wbGljaXRfb2Zmc2V0OworICAgIGZyYWctPnN0c2RfaWQgID0gZmxhZ3MgJiBNT1ZfVEZIRF9TVFNEX0lEID8gYXZpb19yYjMyKHBiKSA6IHRyZXgtPnN0c2RfaWQ7CisKKyAgICBmcmFnLT5kdXJhdGlvbiA9IGZsYWdzICYgTU9WX1RGSERfREVGQVVMVF9EVVJBVElPTiA/CisgICAgICAgICAgICAgICAgICAgICBhdmlvX3JiMzIocGIpIDogdHJleC0+ZHVyYXRpb247CisgICAgZnJhZy0+c2l6ZSAgICAgPSBmbGFncyAmIE1PVl9URkhEX0RFRkFVTFRfU0laRSA/CisgICAgICAgICAgICAgICAgICAgICBhdmlvX3JiMzIocGIpIDogdHJleC0+c2l6ZTsKKyAgICBmcmFnLT5mbGFncyAgICA9IGZsYWdzICYgTU9WX1RGSERfREVGQVVMVF9GTEFHUyA/CisgICAgICAgICAgICAgICAgICAgICBhdmlvX3JiMzIocGIpIDogdHJleC0+ZmxhZ3M7CisgICAgZnJhZy0+dGltZSAgICAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBpZiAoaW5kZXgpIHsKKyAgICAgICAgaW50IGksIGZvdW5kID0gMDsKKyAgICAgICAgZm9yIChpID0gaW5kZXgtPmN1cnJlbnRfaXRlbTsgaSA8IGluZGV4LT5pdGVtX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmcmFnLT5pbXBsaWNpdF9vZmZzZXQgPT0gaW5kZXgtPml0ZW1zW2ldLm1vb2Zfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfREVCVUcsICJmb3VuZCBmcmFnbWVudCBpbmRleCBlbnRyeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRyYWNrICV1IGFuZCBtb29mX29mZnNldCAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLT50cmFja19pZCwgaW5kZXgtPml0ZW1zW2ldLm1vb2Zfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBmcmFnLT50aW1lID0gaW5kZXgtPml0ZW1zW2ldLnRpbWU7CisgICAgICAgICAgICAgICAgaW5kZXgtPmN1cnJlbnRfaXRlbSA9IGkgKyAxOworICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAidHJhY2sgJXUgaGFzIGEgZnJhZ21lbnQgaW5kZXggIgorICAgICAgICAgICAgICAgICAgICJidXQgaXQgZG9lc24ndCBoYXZlIGFuIChpbi1vcmRlcikgZW50cnkgZm9yIG1vb2Zfb2Zmc2V0ICIKKyAgICAgICAgICAgICAgICAgICAiJSJQUklkNjQiXG4iLCBmcmFnLT50cmFja19pZCwgZnJhZy0+aW1wbGljaXRfb2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9kbG9nKGMtPmZjLCAiZnJhZyBmbGFncyAweCV4XG4iLCBmcmFnLT5mbGFncyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfY2hhcChNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBjLT5jaGFwdGVyX3RyYWNrID0gYXZpb19yYjMyKHBiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF90cmV4KE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIE1PVlRyYWNrRXh0ICp0cmV4OworICAgIGludCBlcnI7CisKKyAgICBpZiAoKHVpbnQ2NF90KWMtPnRyZXhfY291bnQrMSA+PSBVSU5UX01BWCAvIHNpemVvZigqYy0+dHJleF9kYXRhKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcF9hcnJheSgmYy0+dHJleF9kYXRhLCBjLT50cmV4X2NvdW50ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqYy0+dHJleF9kYXRhKSkpIDwgMCkgeworICAgICAgICBjLT50cmV4X2NvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBjLT5mYy0+ZHVyYXRpb24gPSBBVl9OT1BUU19WQUxVRTsgLy8gdGhlIGR1cmF0aW9uIGZyb20gbXZoZCBpcyBub3QgcmVwcmVzZW50aW5nIHRoZSB3aG9sZSBmaWxlIHdoZW4gZnJhZ21lbnRzIGFyZSB1c2VkLgorCisgICAgdHJleCA9ICZjLT50cmV4X2RhdGFbYy0+dHJleF9jb3VudCsrXTsKKyAgICBhdmlvX3I4KHBiKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fcmIyNChwYik7IC8qIGZsYWdzICovCisgICAgdHJleC0+dHJhY2tfaWQgPSBhdmlvX3JiMzIocGIpOworICAgIHRyZXgtPnN0c2RfaWQgID0gYXZpb19yYjMyKHBiKTsKKyAgICB0cmV4LT5kdXJhdGlvbiA9IGF2aW9fcmIzMihwYik7CisgICAgdHJleC0+c2l6ZSAgICAgPSBhdmlvX3JiMzIocGIpOworICAgIHRyZXgtPmZsYWdzICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF90ZmR0KE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIE1PVkZyYWdtZW50ICpmcmFnID0gJmMtPmZyYWdtZW50OworICAgIEFWU3RyZWFtICpzdCA9IE5VTEw7CisgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7CisgICAgaW50IHZlcnNpb24sIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+ZmMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpZiAoYy0+ZmMtPnN0cmVhbXNbaV0tPmlkID09IGZyYWctPnRyYWNrX2lkKSB7CisgICAgICAgICAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzdCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgdHJhY2sgaWQgJWRcbiIsIGZyYWctPnRyYWNrX2lkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHNjID0gc3QtPnByaXZfZGF0YTsKKyAgICBpZiAoc2MtPnBzZXVkb19zdHJlYW1faWQgKyAxICE9IGZyYWctPnN0c2RfaWQpCisgICAgICAgIHJldHVybiAwOworICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsKKyAgICBhdmlvX3JiMjQocGIpOyAvKiBmbGFncyAqLworICAgIGlmICh2ZXJzaW9uKSB7CisgICAgICAgIHNjLT50cmFja19lbmQgPSBhdmlvX3JiNjQocGIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNjLT50cmFja19lbmQgPSBhdmlvX3JiMzIocGIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF90cnVuKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIE1PVkZyYWdtZW50ICpmcmFnID0gJmMtPmZyYWdtZW50OworICAgIEFWU3RyZWFtICpzdCA9IE5VTEw7CisgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7CisgICAgTU9WU3R0cyAqY3R0c19kYXRhOworICAgIHVpbnQ2NF90IG9mZnNldDsKKyAgICBpbnQ2NF90IGR0czsKKyAgICBpbnQgZGF0YV9vZmZzZXQgPSAwOworICAgIHVuc2lnbmVkIGVudHJpZXMsIGZpcnN0X3NhbXBsZV9mbGFncyA9IGZyYWctPmZsYWdzOworICAgIGludCBmbGFncywgZGlzdGFuY2UsIGksIGZvdW5kX2tleWZyYW1lID0gMCwgZXJyOworCisgICAgZm9yIChpID0gMDsgaSA8IGMtPmZjLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKGMtPmZjLT5zdHJlYW1zW2ldLT5pZCA9PSBmcmFnLT50cmFja19pZCkgeworICAgICAgICAgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghc3QpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgZmluZCBjb3JyZXNwb25kaW5nIHRyYWNrIGlkICVkXG4iLCBmcmFnLT50cmFja19pZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgaWYgKHNjLT5wc2V1ZG9fc3RyZWFtX2lkKzEgIT0gZnJhZy0+c3RzZF9pZCAmJiBzYy0+cHNldWRvX3N0cmVhbV9pZCAhPSAtMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYXZpb19yOChwYik7IC8qIHZlcnNpb24gKi8KKyAgICBmbGFncyA9IGF2aW9fcmIyNChwYik7CisgICAgZW50cmllcyA9IGF2aW9fcmIzMihwYik7CisgICAgYXZfZGxvZyhjLT5mYywgImZsYWdzIDB4JXggZW50cmllcyAlZFxuIiwgZmxhZ3MsIGVudHJpZXMpOworCisgICAgLyogQWx3YXlzIGFzc3VtZSB0aGUgcHJlc2VuY2Ugb2YgY29tcG9zaXRpb24gdGltZSBvZmZzZXRzLgorICAgICAqIFdpdGhvdXQgdGhpcyBhc3N1bXB0aW9uLCBmb3IgaW5zdGFuY2UsIHdlIGNhbm5vdCBkZWFsIHdpdGggYSB0cmFjayBpbiBmcmFnbWVudGVkIG1vdmllcyB0aGF0IG1lZXQgdGhlIGZvbGxvd2luZy4KKyAgICAgKiAgMSkgaW4gdGhlIGluaXRpYWwgbW92aWUsIHRoZXJlIGFyZSBubyBzYW1wbGVzLgorICAgICAqICAyKSBpbiB0aGUgZmlyc3QgbW92aWUgZnJhZ21lbnQsIHRoZXJlIGlzIG9ubHkgb25lIHNhbXBsZSB3aXRob3V0IGNvbXBvc2l0aW9uIHRpbWUgb2Zmc2V0LgorICAgICAqICAzKSBpbiB0aGUgc3Vic2VxdWVudCBtb3ZpZSBmcmFnbWVudHMsIHRoZXJlIGFyZSBzYW1wbGVzIHdpdGggY29tcG9zaXRpb24gdGltZSBvZmZzZXQuICovCisgICAgaWYgKCFzYy0+Y3R0c19jb3VudCAmJiBzYy0+c2FtcGxlX2NvdW50KQorICAgIHsKKyAgICAgICAgLyogQ29tcGxlbWVudCBjdHRzIHRhYmxlIGlmIG1vb3YgYXRvbSBkb2Vzbid0IGhhdmUgY3R0cyBhdG9tLiAqLworICAgICAgICBjdHRzX2RhdGEgPSBhdl9yZWFsbG9jKE5VTEwsIHNpemVvZigqc2MtPmN0dHNfZGF0YSkpOworICAgICAgICBpZiAoIWN0dHNfZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHNjLT5jdHRzX2RhdGEgPSBjdHRzX2RhdGE7CisgICAgICAgIHNjLT5jdHRzX2RhdGFbc2MtPmN0dHNfY291bnRdLmNvdW50ID0gc2MtPnNhbXBsZV9jb3VudDsKKyAgICAgICAgc2MtPmN0dHNfZGF0YVtzYy0+Y3R0c19jb3VudF0uZHVyYXRpb24gPSAwOworICAgICAgICBzYy0+Y3R0c19jb3VudCsrOworICAgIH0KKyAgICBpZiAoKHVpbnQ2NF90KWVudHJpZXMrc2MtPmN0dHNfY291bnQgPj0gVUlOVF9NQVgvc2l6ZW9mKCpzYy0+Y3R0c19kYXRhKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcF9hcnJheSgmc2MtPmN0dHNfZGF0YSwgZW50cmllcyArIHNjLT5jdHRzX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzYy0+Y3R0c19kYXRhKSkpIDwgMCkgeworICAgICAgICBzYy0+Y3R0c19jb3VudCA9IDA7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmIChmbGFncyAmIE1PVl9UUlVOX0RBVEFfT0ZGU0VUKSAgICAgICAgZGF0YV9vZmZzZXQgICAgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZiAoZmxhZ3MgJiBNT1ZfVFJVTl9GSVJTVF9TQU1QTEVfRkxBR1MpIGZpcnN0X3NhbXBsZV9mbGFncyA9IGF2aW9fcmIzMihwYik7CisgICAgZHRzICAgID0gc2MtPnRyYWNrX2VuZCAtIHNjLT50aW1lX29mZnNldDsKKyAgICBvZmZzZXQgPSBmcmFnLT5iYXNlX2RhdGFfb2Zmc2V0ICsgZGF0YV9vZmZzZXQ7CisgICAgZGlzdGFuY2UgPSAwOworICAgIGF2X2Rsb2coYy0+ZmMsICJmaXJzdCBzYW1wbGUgZmxhZ3MgMHgleFxuIiwgZmlyc3Rfc2FtcGxlX2ZsYWdzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllcyAmJiAhcGItPmVvZl9yZWFjaGVkOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgc2FtcGxlX3NpemUgPSBmcmFnLT5zaXplOworICAgICAgICBpbnQgc2FtcGxlX2ZsYWdzID0gaSA/IGZyYWctPmZsYWdzIDogZmlyc3Rfc2FtcGxlX2ZsYWdzOworICAgICAgICB1bnNpZ25lZCBzYW1wbGVfZHVyYXRpb24gPSBmcmFnLT5kdXJhdGlvbjsKKyAgICAgICAgaW50IGtleWZyYW1lID0gMDsKKworICAgICAgICBpZiAoZmxhZ3MgJiBNT1ZfVFJVTl9TQU1QTEVfRFVSQVRJT04pIHNhbXBsZV9kdXJhdGlvbiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGlmIChmbGFncyAmIE1PVl9UUlVOX1NBTVBMRV9TSVpFKSAgICAgc2FtcGxlX3NpemUgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgaWYgKGZsYWdzICYgTU9WX1RSVU5fU0FNUExFX0ZMQUdTKSAgICBzYW1wbGVfZmxhZ3MgICAgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBzYy0+Y3R0c19kYXRhW3NjLT5jdHRzX2NvdW50XS5jb3VudCA9IDE7CisgICAgICAgIHNjLT5jdHRzX2RhdGFbc2MtPmN0dHNfY291bnRdLmR1cmF0aW9uID0gKGZsYWdzICYgTU9WX1RSVU5fU0FNUExFX0NUUykgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3JiMzIocGIpIDogMDsKKyAgICAgICAgbW92X3VwZGF0ZV9kdHNfc2hpZnQoc2MsIHNjLT5jdHRzX2RhdGFbc2MtPmN0dHNfY291bnRdLmR1cmF0aW9uKTsKKyAgICAgICAgaWYgKGZyYWctPnRpbWUgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIGlmIChjLT51c2VfbWZyYV9mb3IgPT0gRkZfTU9WX0ZMQUdfTUZSQV9QVFMpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cyA9IGZyYWctPnRpbWU7CisgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfREVCVUcsICJmb3VuZCBmcmFnIHRpbWUgJSJQUklkNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICIgc2MtPmR0c19zaGlmdCAlZCBjdHRzLmR1cmF0aW9uICVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBzYy0+dGltZV9vZmZzZXQgJSJQUklkNjQiIGZsYWdzICYgTU9WX1RSVU5fU0FNUExFX0NUUyAlZFxuIiwgcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmR0c19zaGlmdCwgc2MtPmN0dHNfZGF0YVtzYy0+Y3R0c19jb3VudF0uZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzYy0+dGltZV9vZmZzZXQsIGZsYWdzICYgTU9WX1RSVU5fU0FNUExFX0NUUyk7CisgICAgICAgICAgICAgICAgZHRzID0gcHRzIC0gc2MtPmR0c19zaGlmdDsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNT1ZfVFJVTl9TQU1QTEVfQ1RTKSB7CisgICAgICAgICAgICAgICAgICAgIGR0cyAtPSBzYy0+Y3R0c19kYXRhW3NjLT5jdHRzX2NvdW50XS5kdXJhdGlvbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkdHMgLT0gc2MtPnRpbWVfb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19ERUJVRywgImNhbGN1bGF0ZWQgaW50byBkdHMgJSJQUklkNjQiXG4iLCBkdHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkdHMgPSBmcmFnLT50aW1lOworICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiZm91bmQgZnJhZyB0aW1lICUiUFJJZDY0CisgICAgICAgICAgICAgICAgICAgICAgICAiLCB1c2luZyBpdCBmb3IgZHRzXG4iLCBkdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZy0+dGltZSA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHNjLT5jdHRzX2NvdW50Kys7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICAgICAga2V5ZnJhbWUgPSAxOworICAgICAgICBlbHNlIGlmICghZm91bmRfa2V5ZnJhbWUpCisgICAgICAgICAgICBrZXlmcmFtZSA9IGZvdW5kX2tleWZyYW1lID0KKyAgICAgICAgICAgICAgICAhKHNhbXBsZV9mbGFncyAmIChNT1ZfRlJBR19TQU1QTEVfRkxBR19JU19OT05fU1lOQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9WX0ZSQUdfU0FNUExFX0ZMQUdfREVQRU5EU19ZRVMpKTsKKyAgICAgICAgaWYgKGtleWZyYW1lKQorICAgICAgICAgICAgZGlzdGFuY2UgPSAwOworICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIG9mZnNldCwgZHRzLCBzYW1wbGVfc2l6ZSwgZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlmcmFtZSA/IEFWSU5ERVhfS0VZRlJBTUUgOiAwKTsKKyAgICAgICAgYXZfZGxvZyhjLT5mYywgIkFWSW5kZXggc3RyZWFtICVkLCBzYW1wbGUgJWQsIG9mZnNldCAlIlBSSXg2NCIsIGR0cyAlIlBSSWQ2NCIsICIKKyAgICAgICAgICAgICAgICAic2l6ZSAlZCwgZGlzdGFuY2UgJWQsIGtleWZyYW1lICVkXG4iLCBzdC0+aW5kZXgsIHNjLT5zYW1wbGVfY291bnQraSwKKyAgICAgICAgICAgICAgICBvZmZzZXQsIGR0cywgc2FtcGxlX3NpemUsIGRpc3RhbmNlLCBrZXlmcmFtZSk7CisgICAgICAgIGRpc3RhbmNlKys7CisgICAgICAgIGR0cyArPSBzYW1wbGVfZHVyYXRpb247CisgICAgICAgIG9mZnNldCArPSBzYW1wbGVfc2l6ZTsKKyAgICAgICAgc2MtPmRhdGFfc2l6ZSArPSBzYW1wbGVfc2l6ZTsKKyAgICAgICAgc2MtPmR1cmF0aW9uX2Zvcl9mcHMgKz0gc2FtcGxlX2R1cmF0aW9uOworICAgICAgICBzYy0+bmJfZnJhbWVzX2Zvcl9mcHMgKys7CisgICAgfQorCisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgZnJhZy0+aW1wbGljaXRfb2Zmc2V0ID0gb2Zmc2V0OworICAgIHN0LT5kdXJhdGlvbiA9IHNjLT50cmFja19lbmQgPSBkdHMgKyBzYy0+dGltZV9vZmZzZXQ7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHRoaXMgYXRvbSBzaG91bGQgYmUgbnVsbCAoZnJvbSBzcGVjcyksIGJ1dCBzb21lIGJ1Z2d5IGZpbGVzIHB1dCB0aGUgJ21vb3YnIGF0b20gaW5zaWRlIGl0Li4uICovCisvKiBsaWtlIHRoZSBmaWxlcyBjcmVhdGVkIHdpdGggQWRvYmUgUHJlbWllcmUgNS4wLCBmb3Igc2FtcGxlcyBzZWUgKi8KKy8qIGh0dHA6Ly9ncmFwaGljcy50dWRlbGZ0Lm5sL353b3V0ZXIvcHVibGljYXRpb25zL3NvdW5kdGVzdHMvICovCitzdGF0aWMgaW50IG1vdl9yZWFkX3dpZGUoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgaW50IGVycjsKKworICAgIGlmIChhdG9tLnNpemUgPCA4KQorICAgICAgICByZXR1cm4gMDsgLyogY29udGludWUgKi8KKyAgICBpZiAoYXZpb19yYjMyKHBiKSAhPSAwKSB7IC8qIDAgc2l6ZWQgbWRhdCBhdG9tLi4uIHVzZSB0aGUgJ3dpZGUnIGF0b20gc2l6ZSAqLworICAgICAgICBhdmlvX3NraXAocGIsIGF0b20uc2l6ZSAtIDQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXRvbS50eXBlID0gYXZpb19ybDMyKHBiKTsKKyAgICBhdG9tLnNpemUgLT0gODsKKyAgICBpZiAoYXRvbS50eXBlICE9IE1LVEFHKCdtJywnZCcsJ2EnLCd0JykpIHsKKyAgICAgICAgYXZpb19za2lwKHBiLCBhdG9tLnNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZXJyID0gbW92X3JlYWRfbWRhdChjLCBwYiwgYXRvbSk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9jbW92KE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworI2lmIENPTkZJR19aTElCCisgICAgQVZJT0NvbnRleHQgY3R4OworICAgIHVpbnQ4X3QgKmNtb3ZfZGF0YTsKKyAgICB1aW50OF90ICptb292X2RhdGE7IC8qIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgbG9uZyBjbW92X2xlbiwgbW9vdl9sZW47CisgICAgaW50IHJldCA9IC0xOworCisgICAgYXZpb19yYjMyKHBiKTsgLyogZGNvbSBhdG9tICovCisgICAgaWYgKGF2aW9fcmwzMihwYikgIT0gTUtUQUcoJ2QnLCdjJywnbycsJ20nKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKGF2aW9fcmwzMihwYikgIT0gTUtUQUcoJ3onLCdsJywnaScsJ2InKSkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgInVua25vd24gY29tcHJlc3Npb24gZm9yIGNtb3YgYXRvbSAhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2aW9fcmIzMihwYik7IC8qIGNtdmQgYXRvbSAqLworICAgIGlmIChhdmlvX3JsMzIocGIpICE9IE1LVEFHKCdjJywnbScsJ3YnLCdkJykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIG1vb3ZfbGVuID0gYXZpb19yYjMyKHBiKTsgLyogdW5jb21wcmVzc2VkIHNpemUgKi8KKyAgICBjbW92X2xlbiA9IGF0b20uc2l6ZSAtIDYgKiA0OworCisgICAgY21vdl9kYXRhID0gYXZfbWFsbG9jKGNtb3ZfbGVuKTsKKyAgICBpZiAoIWNtb3ZfZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtb292X2RhdGEgPSBhdl9tYWxsb2MobW9vdl9sZW4pOworICAgIGlmICghbW9vdl9kYXRhKSB7CisgICAgICAgIGF2X2ZyZWUoY21vdl9kYXRhKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZpb19yZWFkKHBiLCBjbW92X2RhdGEsIGNtb3ZfbGVuKTsKKyAgICBpZiAodW5jb21wcmVzcyAobW9vdl9kYXRhLCAodUxvbmdmICopICZtb292X2xlbiwgKGNvbnN0IEJ5dGVmICopY21vdl9kYXRhLCBjbW92X2xlbikgIT0gWl9PSykKKyAgICAgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgaWYgKGZmaW9faW5pdF9jb250ZXh0KCZjdHgsIG1vb3ZfZGF0YSwgbW9vdl9sZW4sIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpICE9IDApCisgICAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICAgIGF0b20udHlwZSA9IE1LVEFHKCdtJywnbycsJ28nLCd2Jyk7CisgICAgYXRvbS5zaXplID0gbW9vdl9sZW47CisgICAgcmV0ID0gbW92X3JlYWRfZGVmYXVsdChjLCAmY3R4LCBhdG9tKTsKK2ZyZWVfYW5kX3JldHVybjoKKyAgICBhdl9mcmVlKG1vb3ZfZGF0YSk7CisgICAgYXZfZnJlZShjbW92X2RhdGEpOworICAgIHJldHVybiByZXQ7CisjZWxzZQorICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAidGhpcyBmaWxlIHJlcXVpcmVzIHpsaWIgc3VwcG9ydCBjb21waWxlZCBpblxuIik7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyNlbmRpZgorfQorCisvKiBlZGl0IGxpc3QgYXRvbSAqLworc3RhdGljIGludCBtb3ZfcmVhZF9lbHN0KE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOworICAgIGludCBpLCBlZGl0X2NvdW50LCB2ZXJzaW9uLCBlZGl0X3N0YXJ0X2luZGV4ID0gMDsKKyAgICBpbnQgdW5zdXBwb3J0ZWQgPSAwOworCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSB8fCBjLT5pZ25vcmVfZWRpdGxpc3QpCisgICAgICAgIHJldHVybiAwOworICAgIHNjID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMtMV0tPnByaXZfZGF0YTsKKworICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fcmIyNChwYik7IC8qIGZsYWdzICovCisgICAgZWRpdF9jb3VudCA9IGF2aW9fcmIzMihwYik7IC8qIGVudHJpZXMgKi8KKworICAgIGlmICgodWludDY0X3QpZWRpdF9jb3VudCoxMis4ID4gYXRvbS5zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2X2Rsb2coYy0+ZmMsICJ0cmFja1slaV0uZWRpdF9jb3VudCA9ICVpXG4iLCBjLT5mYy0+bmJfc3RyZWFtcy0xLCBlZGl0X2NvdW50KTsKKyAgICBmb3IgKGk9MDsgaTxlZGl0X2NvdW50OyBpKyspeworICAgICAgICBpbnQ2NF90IHRpbWU7CisgICAgICAgIGludDY0X3QgZHVyYXRpb247CisgICAgICAgIGludCByYXRlOworICAgICAgICBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICBkdXJhdGlvbiA9IGF2aW9fcmI2NChwYik7CisgICAgICAgICAgICB0aW1lICAgICA9IGF2aW9fcmI2NChwYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkdXJhdGlvbiA9IGF2aW9fcmIzMihwYik7IC8qIHNlZ21lbnQgZHVyYXRpb24gKi8KKyAgICAgICAgICAgIHRpbWUgICAgID0gKGludDMyX3QpYXZpb19yYjMyKHBiKTsgLyogbWVkaWEgdGltZSAqLworICAgICAgICB9CisgICAgICAgIHJhdGUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBpZiAoaSA9PSAwICYmIHRpbWUgPT0gLTEpIHsKKyAgICAgICAgICAgIHNjLT5lbXB0eV9kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICAgICAgZWRpdF9zdGFydF9pbmRleCA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoaSA9PSBlZGl0X3N0YXJ0X2luZGV4ICYmIHRpbWUgPj0gMCkKKyAgICAgICAgICAgIHNjLT5zdGFydF90aW1lID0gdGltZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdW5zdXBwb3J0ZWQgPSAxOworCisgICAgICAgIGF2X2Rsb2coYy0+ZmMsICJkdXJhdGlvbj0lIlBSSWQ2NCIgdGltZT0lIlBSSWQ2NCIgcmF0ZT0lZlxuIiwKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiwgdGltZSwgcmF0ZSAvIDY1NTM2LjApOworICAgIH0KKworICAgIGlmICh1bnN1cHBvcnRlZCkKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgIm11bHRpcGxlIGVkaXQgbGlzdCBlbnRyaWVzLCAiCisgICAgICAgICAgICAgICAiYS92IGRlc3luYyBtaWdodCBvY2N1ciwgcGF0Y2ggd2VsY29tZVxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF90bWNkKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOworCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgc2MgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcyAtIDFdLT5wcml2X2RhdGE7CisgICAgc2MtPnRpbWVjb2RlX3RyYWNrID0gYXZpb19yYjMyKHBiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF91dWlkKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIGludCByZXQ7CisgICAgdWludDhfdCB1dWlkWzE2XTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCB1dWlkX2lzbWxfbWFuaWZlc3RbXSA9IHsKKyAgICAgICAgMHhhNSwgMHhkNCwgMHgwYiwgMHgzMCwgMHhlOCwgMHgxNCwgMHgxMSwgMHhkZCwKKyAgICAgICAgMHhiYSwgMHgyZiwgMHgwOCwgMHgwMCwgMHgyMCwgMHgwYywgMHg5YSwgMHg2NgorICAgIH07CisKKyAgICBpZiAoYXRvbS5zaXplIDwgc2l6ZW9mKHV1aWQpIHx8IGF0b20uc2l6ZSA9PSBJTlQ2NF9NQVgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0ID0gYXZpb19yZWFkKHBiLCB1dWlkLCBzaXplb2YodXVpZCkpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIGlmIChyZXQgIT0gc2l6ZW9mKHV1aWQpKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoIW1lbWNtcCh1dWlkLCB1dWlkX2lzbWxfbWFuaWZlc3QsIHNpemVvZih1dWlkKSkpIHsKKyAgICAgICAgdWludDhfdCAqYnVmZmVyLCAqcHRyOworICAgICAgICBjaGFyICplbmRwdHI7CisgICAgICAgIHNpemVfdCBsZW4gPSBhdG9tLnNpemUgLSBzaXplb2YodXVpZCk7CisKKyAgICAgICAgaWYgKGxlbiA8IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHJldCA9IGF2aW9fc2tpcChwYiwgNCk7IC8vIHplcm9lcworICAgICAgICBsZW4gLT0gNDsKKworICAgICAgICBidWZmZXIgPSBhdl9tYWxsb2N6KGxlbiArIDEpOworICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBhdmlvX3JlYWQocGIsIGJ1ZmZlciwgbGVuKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWUoYnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSBpZiAocmV0ICE9IGxlbikgeworICAgICAgICAgICAgYXZfZnJlZShidWZmZXIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBwdHIgPSBidWZmZXI7CisgICAgICAgIHdoaWxlICgocHRyID0gYXZfc3RyaXN0cihwdHIsICJzeXN0ZW1CaXRyYXRlPVwiIikpKSB7CisgICAgICAgICAgICBwdHIgKz0gc2l6ZW9mKCJzeXN0ZW1CaXRyYXRlPVwiIikgLSAxOworICAgICAgICAgICAgYy0+Yml0cmF0ZXNfY291bnQrKzsKKyAgICAgICAgICAgIGMtPmJpdHJhdGVzID0gYXZfcmVhbGxvY19mKGMtPmJpdHJhdGVzLCBjLT5iaXRyYXRlc19jb3VudCwgc2l6ZW9mKCpjLT5iaXRyYXRlcykpOworICAgICAgICAgICAgaWYgKCFjLT5iaXRyYXRlcykgeworICAgICAgICAgICAgICAgIGMtPmJpdHJhdGVzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIHJldCA9IHN0cnRvbChwdHIsICZlbmRwdHIsIDEwKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwIHx8IGVycm5vIHx8ICplbmRwdHIgIT0gJyInKSB7CisgICAgICAgICAgICAgICAgYy0+Yml0cmF0ZXNbYy0+Yml0cmF0ZXNfY291bnQgLSAxXSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMtPmJpdHJhdGVzW2MtPmJpdHJhdGVzX2NvdW50IC0gMV0gPSByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmVlKGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX2ZyZWUoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgaW50IHJldDsKKyAgICB1aW50OF90IGNvbnRlbnRbMTZdOworCisgICAgaWYgKGF0b20uc2l6ZSA8IDgpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBjb250ZW50LCBGRk1JTihzaXplb2YoY29udGVudCksIGF0b20uc2l6ZSkpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCAgICFjLT5mb3VuZF9tb292CisgICAgICAgICYmICFjLT5mb3VuZF9tZGF0CisgICAgICAgICYmICFtZW1jbXAoY29udGVudCwgIkFuZXZpYVx4MUFceDFBIiwgOCkKKyAgICAgICAgJiYgYy0+dXNlX21mcmFfZm9yID09IEZGX01PVl9GTEFHX01GUkFfQVVUTykgeworICAgICAgICBjLT51c2VfbWZyYV9mb3IgPSBGRl9NT1ZfRkxBR19NRlJBX1BUUzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IE1PVlBhcnNlVGFibGVFbnRyeSBtb3ZfZGVmYXVsdF9wYXJzZV90YWJsZVtdID0geworeyBNS1RBRygnQScsJ0MnLCdMJywnUicpLCBtb3ZfcmVhZF9hdmlkIH0sCit7IE1LVEFHKCdBJywnUCcsJ1InLCdHJyksIG1vdl9yZWFkX2F2aWQgfSwKK3sgTUtUQUcoJ0EnLCdBJywnTCcsJ1AnKSwgbW92X3JlYWRfYXZpZCB9LAoreyBNS1RBRygnQScsJ1InLCdFJywnUycpLCBtb3ZfcmVhZF9hcmVzIH0sCit7IE1LVEFHKCdhJywndicsJ3MnLCdzJyksIG1vdl9yZWFkX2F2c3MgfSwKK3sgTUtUQUcoJ2MnLCdoJywncCcsJ2wnKSwgbW92X3JlYWRfY2hwbCB9LAoreyBNS1RBRygnYycsJ28nLCc2JywnNCcpLCBtb3ZfcmVhZF9zdGNvIH0sCit7IE1LVEFHKCdjJywnbycsJ2wnLCdyJyksIG1vdl9yZWFkX2NvbHIgfSwKK3sgTUtUQUcoJ2MnLCd0JywndCcsJ3MnKSwgbW92X3JlYWRfY3R0cyB9LCAvKiBjb21wb3NpdGlvbiB0aW1lIHRvIHNhbXBsZSAqLworeyBNS1RBRygnZCcsJ2knLCduJywnZicpLCBtb3ZfcmVhZF9kZWZhdWx0IH0sCit7IE1LVEFHKCdkJywncicsJ2UnLCdmJyksIG1vdl9yZWFkX2RyZWYgfSwKK3sgTUtUQUcoJ2UnLCdkJywndCcsJ3MnKSwgbW92X3JlYWRfZGVmYXVsdCB9LAoreyBNS1RBRygnZScsJ2wnLCdzJywndCcpLCBtb3ZfcmVhZF9lbHN0IH0sCit7IE1LVEFHKCdlJywnbicsJ2QnLCdhJyksIG1vdl9yZWFkX2VuZGEgfSwKK3sgTUtUQUcoJ2YnLCdpJywnZScsJ2wnKSwgbW92X3JlYWRfZmllbCB9LAoreyBNS1RBRygnZicsJ3QnLCd5JywncCcpLCBtb3ZfcmVhZF9mdHlwIH0sCit7IE1LVEFHKCdnJywnbCcsJ2InLCdsJyksIG1vdl9yZWFkX2dsYmwgfSwKK3sgTUtUQUcoJ2gnLCdkJywnbCcsJ3InKSwgbW92X3JlYWRfaGRsciB9LAoreyBNS1RBRygnaScsJ2wnLCdzJywndCcpLCBtb3ZfcmVhZF9pbHN0IH0sCit7IE1LVEFHKCdqJywncCcsJzInLCdoJyksIG1vdl9yZWFkX2pwMmggfSwKK3sgTUtUQUcoJ20nLCdkJywnYScsJ3QnKSwgbW92X3JlYWRfbWRhdCB9LAoreyBNS1RBRygnbScsJ2QnLCdoJywnZCcpLCBtb3ZfcmVhZF9tZGhkIH0sCit7IE1LVEFHKCdtJywnZCcsJ2knLCdhJyksIG1vdl9yZWFkX2RlZmF1bHQgfSwKK3sgTUtUQUcoJ20nLCdlJywndCcsJ2EnKSwgbW92X3JlYWRfbWV0YSB9LAoreyBNS1RBRygnbScsJ2knLCduJywnZicpLCBtb3ZfcmVhZF9kZWZhdWx0IH0sCit7IE1LVEFHKCdtJywnbycsJ28nLCdmJyksIG1vdl9yZWFkX21vb2YgfSwKK3sgTUtUQUcoJ20nLCdvJywnbycsJ3YnKSwgbW92X3JlYWRfbW9vdiB9LAoreyBNS1RBRygnbScsJ3YnLCdlJywneCcpLCBtb3ZfcmVhZF9kZWZhdWx0IH0sCit7IE1LVEFHKCdtJywndicsJ2gnLCdkJyksIG1vdl9yZWFkX212aGQgfSwKK3sgTUtUQUcoJ1MnLCdNJywnSScsJyAnKSwgbW92X3JlYWRfc3ZxMyB9LAoreyBNS1RBRygnYScsJ2wnLCdhJywnYycpLCBtb3ZfcmVhZF9hbGFjIH0sIC8qIGFsYWMgc3BlY2lmaWMgYXRvbSAqLworeyBNS1RBRygnYScsJ3YnLCdjJywnQycpLCBtb3ZfcmVhZF9nbGJsIH0sCit7IE1LVEFHKCdwJywnYScsJ3MnLCdwJyksIG1vdl9yZWFkX3Bhc3AgfSwKK3sgTUtUQUcoJ3MnLCd0JywnYicsJ2wnKSwgbW92X3JlYWRfZGVmYXVsdCB9LAoreyBNS1RBRygncycsJ3QnLCdjJywnbycpLCBtb3ZfcmVhZF9zdGNvIH0sCit7IE1LVEFHKCdzJywndCcsJ3AnLCdzJyksIG1vdl9yZWFkX3N0cHMgfSwKK3sgTUtUQUcoJ3MnLCd0JywncicsJ2YnKSwgbW92X3JlYWRfc3RyZiB9LAoreyBNS1RBRygncycsJ3QnLCdzJywnYycpLCBtb3ZfcmVhZF9zdHNjIH0sCit7IE1LVEFHKCdzJywndCcsJ3MnLCdkJyksIG1vdl9yZWFkX3N0c2QgfSwgLyogc2FtcGxlIGRlc2NyaXB0aW9uICovCit7IE1LVEFHKCdzJywndCcsJ3MnLCdzJyksIG1vdl9yZWFkX3N0c3MgfSwgLyogc3luYyBzYW1wbGUgKi8KK3sgTUtUQUcoJ3MnLCd0JywncycsJ3onKSwgbW92X3JlYWRfc3RzeiB9LCAvKiBzYW1wbGUgc2l6ZSAqLworeyBNS1RBRygncycsJ3QnLCd0JywncycpLCBtb3ZfcmVhZF9zdHRzIH0sCit7IE1LVEFHKCdzJywndCcsJ3onLCcyJyksIG1vdl9yZWFkX3N0c3ogfSwgLyogY29tcGFjdCBzYW1wbGUgc2l6ZSAqLworeyBNS1RBRygndCcsJ2snLCdoJywnZCcpLCBtb3ZfcmVhZF90a2hkIH0sIC8qIHRyYWNrIGhlYWRlciAqLworeyBNS1RBRygndCcsJ2YnLCdkJywndCcpLCBtb3ZfcmVhZF90ZmR0IH0sCit7IE1LVEFHKCd0JywnZicsJ2gnLCdkJyksIG1vdl9yZWFkX3RmaGQgfSwgLyogdHJhY2sgZnJhZ21lbnQgaGVhZGVyICovCit7IE1LVEFHKCd0JywncicsJ2EnLCdrJyksIG1vdl9yZWFkX3RyYWsgfSwKK3sgTUtUQUcoJ3QnLCdyJywnYScsJ2YnKSwgbW92X3JlYWRfZGVmYXVsdCB9LAoreyBNS1RBRygndCcsJ3InLCdlJywnZicpLCBtb3ZfcmVhZF9kZWZhdWx0IH0sCit7IE1LVEFHKCd0JywnbScsJ2MnLCdkJyksIG1vdl9yZWFkX3RtY2QgfSwKK3sgTUtUQUcoJ2MnLCdoJywnYScsJ3AnKSwgbW92X3JlYWRfY2hhcCB9LAoreyBNS1RBRygndCcsJ3InLCdlJywneCcpLCBtb3ZfcmVhZF90cmV4IH0sCit7IE1LVEFHKCd0JywncicsJ3UnLCduJyksIG1vdl9yZWFkX3RydW4gfSwKK3sgTUtUQUcoJ3UnLCdkJywndCcsJ2EnKSwgbW92X3JlYWRfZGVmYXVsdCB9LAoreyBNS1RBRygndycsJ2EnLCd2JywnZScpLCBtb3ZfcmVhZF93YXZlIH0sCit7IE1LVEFHKCdlJywncycsJ2QnLCdzJyksIG1vdl9yZWFkX2VzZHMgfSwKK3sgTUtUQUcoJ2QnLCdhJywnYycsJzMnKSwgbW92X3JlYWRfZGFjMyB9LCAvKiBBQy0zIGluZm8gKi8KK3sgTUtUQUcoJ2QnLCdlJywnYycsJzMnKSwgbW92X3JlYWRfZGVjMyB9LCAvKiBFQUMtMyBpbmZvICovCit7IE1LVEFHKCd3JywnaScsJ2QnLCdlJyksIG1vdl9yZWFkX3dpZGUgfSwgLyogcGxhY2UgaG9sZGVyICovCit7IE1LVEFHKCd3JywnZicsJ2UnLCd4JyksIG1vdl9yZWFkX3dmZXggfSwKK3sgTUtUQUcoJ2MnLCdtJywnbycsJ3YnKSwgbW92X3JlYWRfY21vdiB9LAoreyBNS1RBRygnYycsJ2gnLCdhJywnbicpLCBtb3ZfcmVhZF9jaGFuIH0sIC8qIGNoYW5uZWwgbGF5b3V0ICovCit7IE1LVEFHKCdkJywndicsJ2MnLCcxJyksIG1vdl9yZWFkX2R2YzEgfSwKK3sgTUtUQUcoJ3MnLCdiJywnZycsJ3AnKSwgbW92X3JlYWRfc2JncCB9LAoreyBNS1RBRygnaCcsJ3YnLCdjJywnQycpLCBtb3ZfcmVhZF9nbGJsIH0sCit7IE1LVEFHKCd1JywndScsJ2knLCdkJyksIG1vdl9yZWFkX3V1aWQgfSwKK3sgTUtUQUcoJ0MnLCdpJywnbicsIDB4OGUpLCBtb3ZfcmVhZF90YXJnYV95MjE2IH0sCit7IE1LVEFHKCdmJywncicsJ2UnLCdlJyksIG1vdl9yZWFkX2ZyZWUgfSwKK3sgTUtUQUcoJy0nLCctJywnLScsJy0nKSwgbW92X3JlYWRfY3VzdG9tIH0sCit7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIGludCBtb3ZfcmVhZF9kZWZhdWx0KE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIGludDY0X3QgdG90YWxfc2l6ZSA9IDA7CisgICAgTU9WQXRvbSBhOworICAgIGludCBpOworCisgICAgaWYgKGF0b20uc2l6ZSA8IDApCisgICAgICAgIGF0b20uc2l6ZSA9IElOVDY0X01BWDsKKyAgICB3aGlsZSAodG90YWxfc2l6ZSArIDggPD0gYXRvbS5zaXplICYmICFhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgIGludCAoKnBhcnNlKShNT1ZDb250ZXh0KiwgQVZJT0NvbnRleHQqLCBNT1ZBdG9tKSA9IE5VTEw7CisgICAgICAgIGEuc2l6ZSA9IGF0b20uc2l6ZTsKKyAgICAgICAgYS50eXBlPTA7CisgICAgICAgIGlmIChhdG9tLnNpemUgPj0gOCkgeworICAgICAgICAgICAgYS5zaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGEudHlwZSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBpZiAoYS50eXBlID09IE1LVEFHKCdmJywncicsJ2UnLCdlJykgJiYKKyAgICAgICAgICAgICAgICBhLnNpemUgPj0gOCAmJgorICAgICAgICAgICAgICAgIGMtPm1vb3ZfcmV0cnkpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGJ1Zls4XTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAqdHlwZSA9ICh1aW50MzJfdCAqKWJ1ZiArIDE7CisgICAgICAgICAgICAgICAgYXZpb19yZWFkKHBiLCBidWYsIDgpOworICAgICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgLTgsIFNFRUtfQ1VSKTsKKyAgICAgICAgICAgICAgICBpZiAoKnR5cGUgPT0gTUtUQUcoJ20nLCd2JywnaCcsJ2QnKSB8fAorICAgICAgICAgICAgICAgICAgICAqdHlwZSA9PSBNS1RBRygnYycsJ20nLCdvJywndicpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiRGV0ZWN0ZWQgbW9vdiBpbiBhIGZyZWUgYXRvbS5cbiIpOworICAgICAgICAgICAgICAgICAgICBhLnR5cGUgPSBNS1RBRygnbScsJ28nLCdvJywndicpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdG9tLnR5cGUgIT0gTUtUQUcoJ3InLCdvJywnbycsJ3QnKSAmJgorICAgICAgICAgICAgICAgIGF0b20udHlwZSAhPSBNS1RBRygnbScsJ28nLCdvJywndicpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhLnR5cGUgPT0gTUtUQUcoJ3QnLCdyJywnYScsJ2snKSB8fCBhLnR5cGUgPT0gTUtUQUcoJ20nLCdkJywnYScsJ3QnKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiQnJva2VuIGZpbGUsIHRyYWsvbWRhdCBub3QgYXQgdG9wLWxldmVsXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCAtOCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvdGFsX3NpemUgKz0gODsKKyAgICAgICAgICAgIGlmIChhLnNpemUgPT0gMSkgeyAvKiA2NCBiaXQgZXh0ZW5kZWQgc2l6ZSAqLworICAgICAgICAgICAgICAgIGEuc2l6ZSA9IGF2aW9fcmI2NChwYikgLSA4OworICAgICAgICAgICAgICAgIHRvdGFsX3NpemUgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9kbG9nKGMtPmZjLCAidHlwZTogJTA4eCAnJS40cycgcGFyZW50OiclLjRzJyBzejogJSJQUklkNjQiICUiUFJJZDY0IiAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgYS50eXBlLCAoY2hhciopJmEudHlwZSwgKGNoYXIqKSZhdG9tLnR5cGUsIGEuc2l6ZSwgdG90YWxfc2l6ZSwgYXRvbS5zaXplKTsKKyAgICAgICAgaWYgKGEuc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBhLnNpemUgPSBhdG9tLnNpemUgLSB0b3RhbF9zaXplICsgODsKKyAgICAgICAgfQorICAgICAgICBhLnNpemUgLT0gODsKKyAgICAgICAgaWYgKGEuc2l6ZSA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYS5zaXplID0gRkZNSU4oYS5zaXplLCBhdG9tLnNpemUgLSB0b3RhbF9zaXplKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBtb3ZfZGVmYXVsdF9wYXJzZV90YWJsZVtpXS50eXBlOyBpKyspCisgICAgICAgICAgICBpZiAobW92X2RlZmF1bHRfcGFyc2VfdGFibGVbaV0udHlwZSA9PSBhLnR5cGUpIHsKKyAgICAgICAgICAgICAgICBwYXJzZSA9IG1vdl9kZWZhdWx0X3BhcnNlX3RhYmxlW2ldLnBhcnNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIC8vIGNvbnRhaW5lciBpcyB1c2VyIGRhdGEKKyAgICAgICAgaWYgKCFwYXJzZSAmJiAoYXRvbS50eXBlID09IE1LVEFHKCd1JywnZCcsJ3QnLCdhJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgYXRvbS50eXBlID09IE1LVEFHKCdpJywnbCcsJ3MnLCd0JykpKQorICAgICAgICAgICAgcGFyc2UgPSBtb3ZfcmVhZF91ZHRhX3N0cmluZzsKKworICAgICAgICBpZiAoIXBhcnNlKSB7IC8qIHNraXAgbGVhZiBhdG9tcyBkYXRhICovCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIGEuc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0X3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBpbnQ2NF90IGxlZnQ7CisgICAgICAgICAgICBpbnQgZXJyID0gcGFyc2UoYywgcGIsIGEpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIGlmIChjLT5mb3VuZF9tb292ICYmIGMtPmZvdW5kX21kYXQgJiYKKyAgICAgICAgICAgICAgICAoKCFwYi0+c2Vla2FibGUgfHwgYy0+ZmMtPmZsYWdzICYgQVZGTVRfRkxBR19JR05JRFgpIHx8CisgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcyArIGEuc2l6ZSA9PSBhdmlvX3NpemUocGIpKSkgeworICAgICAgICAgICAgICAgIGlmICghcGItPnNlZWthYmxlIHx8IGMtPmZjLT5mbGFncyAmIEFWRk1UX0ZMQUdfSUdOSURYKQorICAgICAgICAgICAgICAgICAgICBjLT5uZXh0X3Jvb3RfYXRvbSA9IHN0YXJ0X3BvcyArIGEuc2l6ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlZnQgPSBhLnNpemUgLSBhdmlvX3RlbGwocGIpICsgc3RhcnRfcG9zOworICAgICAgICAgICAgaWYgKGxlZnQgPiAwKSAvKiBza2lwIGdhcmJhZ2UgYXQgYXRvbSBlbmQgKi8KKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIGxlZnQpOworICAgICAgICAgICAgZWxzZSBpZiAobGVmdCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAib3ZlcnJlYWQgZW5kIG9mIGF0b20gJyUuNHMnIGJ5ICUiUFJJZDY0IiBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSZhLnR5cGUsIC1sZWZ0KTsKKyAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGxlZnQsIFNFRUtfQ1VSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRvdGFsX3NpemUgKz0gYS5zaXplOworICAgIH0KKworICAgIGlmICh0b3RhbF9zaXplIDwgYXRvbS5zaXplICYmIGF0b20uc2l6ZSA8IDB4N2ZmZmYpCisgICAgICAgIGF2aW9fc2tpcChwYiwgYXRvbS5zaXplIC0gdG90YWxfc2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50NjRfdCBvZmZzZXQ7CisgICAgdWludDMyX3QgdGFnOworICAgIGludCBzY29yZSA9IDA7CisgICAgaW50IG1vb3Zfb2Zmc2V0ID0gLTE7CisKKyAgICAvKiBjaGVjayBmaWxlIGhlYWRlciAqLworICAgIG9mZnNldCA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICAvKiBpZ25vcmUgaW52YWxpZCBvZmZzZXQgKi8KKyAgICAgICAgaWYgKChvZmZzZXQgKyA4KSA+ICh1bnNpZ25lZCBpbnQpcC0+YnVmX3NpemUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdGFnID0gQVZfUkwzMihwLT5idWYgKyBvZmZzZXQgKyA0KTsKKyAgICAgICAgc3dpdGNoKHRhZykgeworICAgICAgICAvKiBjaGVjayBmb3Igb2J2aW91cyB0YWdzICovCisgICAgICAgIGNhc2UgTUtUQUcoJ20nLCdvJywnbycsJ3YnKToKKyAgICAgICAgICAgIG1vb3Zfb2Zmc2V0ID0gb2Zmc2V0ICsgNDsKKyAgICAgICAgY2FzZSBNS1RBRygnbScsJ2QnLCdhJywndCcpOgorICAgICAgICBjYXNlIE1LVEFHKCdwJywnbicsJ28nLCd0Jyk6IC8qIGRldGVjdCBtb3ZzIHdpdGggcHJldmlldyBwaWNzIGxpa2UgZXcubW92IGFuZCBhcHJpbC5tb3YgKi8KKyAgICAgICAgY2FzZSBNS1RBRygndScsJ2QnLCd0JywnYScpOiAvKiBQYWNrZXQgVmlkZW8gUFZBdXRob3IgYWRkcyB0aGlzIGFuZCBhIGxvdCBvZiBtb3JlIGp1bmsgKi8KKyAgICAgICAgY2FzZSBNS1RBRygnZicsJ3QnLCd5JywncCcpOgorICAgICAgICAgICAgaWYgKEFWX1JCMzIocC0+YnVmK29mZnNldCkgPCA4ICYmCisgICAgICAgICAgICAgICAgKEFWX1JCMzIocC0+YnVmK29mZnNldCkgIT0gMSB8fAorICAgICAgICAgICAgICAgICBvZmZzZXQgKyAxMiA+ICh1bnNpZ25lZCBpbnQpcC0+YnVmX3NpemUgfHwKKyAgICAgICAgICAgICAgICAgQVZfUkI2NChwLT5idWYrb2Zmc2V0ICsgOCkgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICBzY29yZSA9IEZGTUFYKHNjb3JlLCBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBNS1RBRygnZicsJ3QnLCd5JywncCcpICYmCisgICAgICAgICAgICAgICAgICAgICAgIEFWX1JMMzIocC0+YnVmICsgb2Zmc2V0ICsgOCkgPT0gTUtUQUcoJ2onLCdwJywnMicsJyAnKSkgeworICAgICAgICAgICAgICAgIHNjb3JlID0gRkZNQVgoc2NvcmUsIDUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY29yZSA9IEFWUFJPQkVfU0NPUkVfTUFYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2Zmc2V0ID0gRkZNQVgoNCwgQVZfUkIzMihwLT5idWYrb2Zmc2V0KSkgKyBvZmZzZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogdGhvc2UgYXJlIG1vcmUgY29tbW9uIHdvcmRzLCBzbyByYXRlIHRoZW4gYSBiaXQgbGVzcyAqLworICAgICAgICBjYXNlIE1LVEFHKCdlJywnZCcsJ2knLCd3Jyk6IC8qIHhkY2FtIGZpbGVzIGhhdmUgcmV2ZXJ0ZWQgZmlyc3QgdGFncyAqLworICAgICAgICBjYXNlIE1LVEFHKCd3JywnaScsJ2QnLCdlJyk6CisgICAgICAgIGNhc2UgTUtUQUcoJ2YnLCdyJywnZScsJ2UnKToKKyAgICAgICAgY2FzZSBNS1RBRygnaicsJ3UnLCduJywnaycpOgorICAgICAgICBjYXNlIE1LVEFHKCdwJywnaScsJ2MnLCd0Jyk6CisgICAgICAgICAgICBzY29yZSAgPSBGRk1BWChzY29yZSwgQVZQUk9CRV9TQ09SRV9NQVggLSA1KTsKKyAgICAgICAgICAgIG9mZnNldCA9IEZGTUFYKDQsIEFWX1JCMzIocC0+YnVmK29mZnNldCkpICsgb2Zmc2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoMHg4MiwweDgyLDB4N2YsMHg3ZCk6CisgICAgICAgIGNhc2UgTUtUQUcoJ3MnLCdrJywnaScsJ3AnKToKKyAgICAgICAgY2FzZSBNS1RBRygndScsJ3UnLCdpJywnZCcpOgorICAgICAgICBjYXNlIE1LVEFHKCdwJywncicsJ2YnLCdsJyk6CisgICAgICAgICAgICAvKiBpZiB3ZSBvbmx5IGZpbmQgdGhvc2UgY2F1c2UgcHJvYmVkYXRhIGlzIHRvbyBzbWFsbCBhdCBsZWFzdCByYXRlIHRoZW0gKi8KKyAgICAgICAgICAgIHNjb3JlICA9IEZGTUFYKHNjb3JlLCBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTik7CisgICAgICAgICAgICBvZmZzZXQgPSBGRk1BWCg0LCBBVl9SQjMyKHAtPmJ1ZitvZmZzZXQpKSArIG9mZnNldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb2Zmc2V0ID0gRkZNQVgoNCwgQVZfUkIzMihwLT5idWYrb2Zmc2V0KSkgKyBvZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoc2NvcmUgPiBBVlBST0JFX1NDT1JFX01BWCAtIDUwICYmIG1vb3Zfb2Zmc2V0ICE9IC0xKSB7CisgICAgICAgIC8qIG1vb3YgYXRvbSBpbiB0aGUgaGVhZGVyIC0gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgbm90IGEKKyAgICAgICAgICogTU9WLXBhY2tlZCBNUEVHLVBTICovCisgICAgICAgIG9mZnNldCA9IG1vb3Zfb2Zmc2V0OworCisgICAgICAgIHdoaWxlKG9mZnNldCA8IChwLT5idWZfc2l6ZSAtIDE2KSl7IC8qIFN1ZmZpY2llbnQgc3BhY2UgKi8KKyAgICAgICAgICAgICAgIC8qIFdlIGZvdW5kIGFuIGFjdHVhbCBoZGxyIGF0b20gKi8KKyAgICAgICAgICAgIGlmKEFWX1JMMzIocC0+YnVmICsgb2Zmc2V0ICAgICApID09IE1LVEFHKCdoJywnZCcsJ2wnLCdyJykgJiYKKyAgICAgICAgICAgICAgIEFWX1JMMzIocC0+YnVmICsgb2Zmc2V0ICsgIDgpID09IE1LVEFHKCdtJywnaCcsJ2wnLCdyJykgJiYKKyAgICAgICAgICAgICAgIEFWX1JMMzIocC0+YnVmICsgb2Zmc2V0ICsgMTIpID09IE1LVEFHKCdNJywnUCcsJ0UnLCdHJykpeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIkZvdW5kIG1lZGlhIGRhdGEgdGFnIE1QRUcgaW5kaWNhdGluZyB0aGlzIGlzIGEgTU9WLXBhY2tlZCBNUEVHLVBTLlxuIik7CisgICAgICAgICAgICAgICAgLyogV2UgZm91bmQgYSBtZWRpYSBoYW5kbGVyIHJlZmVyZW5jZSBhdG9tIGRlc2NyaWJpbmcgYW4KKyAgICAgICAgICAgICAgICAgKiBNUEVHLVBTLWluLU1PViwgcmV0dXJuIGEKKyAgICAgICAgICAgICAgICAgKiBsb3cgc2NvcmUgdG8gZm9yY2UgZXhwYW5kaW5nIHRoZSBwcm9iZSB3aW5kb3cgdW50aWwKKyAgICAgICAgICAgICAgICAgKiBtcGVncHNfcHJvYmUgZmluZHMgd2hhdCBpdCBuZWVkcyAqLworICAgICAgICAgICAgICAgIHJldHVybiA1OworICAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgICAgICAvKiBLZWVwIGxvb2tpbmcgKi8KKyAgICAgICAgICAgICAgICBvZmZzZXQrPTI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2NvcmU7Cit9CisKKy8vIG11c3QgYmUgZG9uZSBhZnRlciBwYXJzaW5nIGFsbCB0cmFrIGJlY2F1c2UgdGhlcmUncyBubyBvcmRlciByZXF1aXJlbWVudAorc3RhdGljIHZvaWQgbW92X3JlYWRfY2hhcHRlcnMoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1PVkNvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBOVUxMOworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOworICAgIGludDY0X3QgY3VyX3BvczsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIGlmIChzLT5zdHJlYW1zW2ldLT5pZCA9PSBtb3YtPmNoYXB0ZXJfdHJhY2spIHsKKyAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgaWYgKCFzdCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUmVmZXJlbmNlZCBRVCBjaGFwdGVyIHRyYWNrIG5vdCBmb3VuZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdC0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9BTEw7CisgICAgc2MgPSBzdC0+cHJpdl9kYXRhOworICAgIGN1cl9wb3MgPSBhdmlvX3RlbGwoc2MtPnBiKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+bmJfaW5kZXhfZW50cmllczsgaSsrKSB7CisgICAgICAgIEFWSW5kZXhFbnRyeSAqc2FtcGxlID0gJnN0LT5pbmRleF9lbnRyaWVzW2ldOworICAgICAgICBpbnQ2NF90IGVuZCA9IGkrMSA8IHN0LT5uYl9pbmRleF9lbnRyaWVzID8gc3QtPmluZGV4X2VudHJpZXNbaSsxXS50aW1lc3RhbXAgOiBzdC0+ZHVyYXRpb247CisgICAgICAgIHVpbnQ4X3QgKnRpdGxlOworICAgICAgICB1aW50MTZfdCBjaDsKKyAgICAgICAgaW50IGxlbiwgdGl0bGVfbGVuOworCisgICAgICAgIGlmIChlbmQgPCBzYW1wbGUtPnRpbWVzdGFtcCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiaWdub3Jpbmcgc3RyZWFtIGR1cmF0aW9uIHdoaWNoIGlzIHNob3J0ZXIgdGhhbiBjaGFwdGVyc1xuIik7CisgICAgICAgICAgICBlbmQgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdmlvX3NlZWsoc2MtPnBiLCBzYW1wbGUtPnBvcywgU0VFS19TRVQpICE9IHNhbXBsZS0+cG9zKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2hhcHRlciAlZCBub3QgZm91bmQgaW4gZmlsZVxuIiwgaSk7CisgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSBmaXJzdCB0d28gYnl0ZXMgYXJlIHRoZSBsZW5ndGggb2YgdGhlIHRpdGxlCisgICAgICAgIGxlbiA9IGF2aW9fcmIxNihzYy0+cGIpOworICAgICAgICBpZiAobGVuID4gc2FtcGxlLT5zaXplLTIpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdGl0bGVfbGVuID0gMipsZW4gKyAxOworICAgICAgICBpZiAoISh0aXRsZSA9IGF2X21hbGxvY3oodGl0bGVfbGVuKSkpCisgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKworICAgICAgICAvLyBUaGUgc2FtcGxlcyBjb3VsZCB0aGVvcmV0aWNhbGx5IGJlIGluIGFueSBlbmNvZGluZyBpZiB0aGVyZSdzIGFuIGVuY2QKKyAgICAgICAgLy8gYXRvbSBmb2xsb3dpbmcsIGJ1dCBpbiBwcmFjdGljZSBhcmUgb25seSB1dGYtOCBvciB1dGYtMTYsIGRpc3Rpbmd1aXNoZWQKKyAgICAgICAgLy8gaW5zdGVhZCBieSB0aGUgcHJlc2VuY2Ugb2YgYSBCT00KKyAgICAgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgICAgIHRpdGxlWzBdID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoID0gYXZpb19yYjE2KHNjLT5wYik7CisgICAgICAgICAgICBpZiAoY2ggPT0gMHhmZWZmKQorICAgICAgICAgICAgICAgIGF2aW9fZ2V0X3N0cjE2YmUoc2MtPnBiLCBsZW4sIHRpdGxlLCB0aXRsZV9sZW4pOworICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gMHhmZmZlKQorICAgICAgICAgICAgICAgIGF2aW9fZ2V0X3N0cjE2bGUoc2MtPnBiLCBsZW4sIHRpdGxlLCB0aXRsZV9sZW4pOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQVZfV0IxNih0aXRsZSwgY2gpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMSB8fCBsZW4gPT0gMikKKyAgICAgICAgICAgICAgICAgICAgdGl0bGVbbGVuXSA9IDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBhdmlvX2dldF9zdHIoc2MtPnBiLCBJTlRfTUFYLCB0aXRsZSArIDIsIGxlbiAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXZwcml2X25ld19jaGFwdGVyKHMsIGksIHN0LT50aW1lX2Jhc2UsIHNhbXBsZS0+dGltZXN0YW1wLCBlbmQsIHRpdGxlKTsKKyAgICAgICAgYXZfZnJlZXAoJnRpdGxlKTsKKyAgICB9CitmaW5pc2g6CisgICAgYXZpb19zZWVrKHNjLT5wYiwgY3VyX3BvcywgU0VFS19TRVQpOworfQorCitzdGF0aWMgaW50IHBhcnNlX3RpbWVjb2RlX2luX2ZyYW1lbnVtX2Zvcm1hdChBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlLCBpbnQgZmxhZ3MpCit7CisgICAgQVZUaW1lY29kZSB0YzsKKyAgICBjaGFyIGJ1ZltBVl9USU1FQ09ERV9TVFJfU0laRV07CisgICAgQVZSYXRpb25hbCByYXRlID0ge3N0LT5jb2RlYy0+dGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT50aW1lX2Jhc2UubnVtfTsKKyAgICBpbnQgcmV0ID0gYXZfdGltZWNvZGVfaW5pdCgmdGMsIHJhdGUsIGZsYWdzLCAwLCBzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAidGltZWNvZGUiLAorICAgICAgICAgICAgICAgIGF2X3RpbWVjb2RlX21ha2Vfc3RyaW5nKCZ0YywgYnVmLCB2YWx1ZSksIDApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX3RpbWVjb2RlX3RyYWNrKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0KQoreworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKKyAgICBpbnQgZmxhZ3MgPSAwOworICAgIGludDY0X3QgY3VyX3BvcyA9IGF2aW9fdGVsbChzYy0+cGIpOworICAgIHVpbnQzMl90IHZhbHVlOworCisgICAgaWYgKCFzdC0+bmJfaW5kZXhfZW50cmllcykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYXZpb19zZWVrKHNjLT5wYiwgc3QtPmluZGV4X2VudHJpZXMtPnBvcywgU0VFS19TRVQpOworICAgIHZhbHVlID0gYXZpb19yYjMyKHMtPnBiKTsKKworICAgIGlmIChzYy0+dG1jZF9mbGFncyAmIDB4MDAwMSkgZmxhZ3MgfD0gQVZfVElNRUNPREVfRkxBR19EUk9QRlJBTUU7CisgICAgaWYgKHNjLT50bWNkX2ZsYWdzICYgMHgwMDAyKSBmbGFncyB8PSBBVl9USU1FQ09ERV9GTEFHXzI0SE9VUlNNQVg7CisgICAgaWYgKHNjLT50bWNkX2ZsYWdzICYgMHgwMDA0KSBmbGFncyB8PSBBVl9USU1FQ09ERV9GTEFHX0FMTE9XTkVHQVRJVkU7CisKKyAgICAvKiBBc3N1bWUgQ291bnRlciBmbGFnIGlzIHNldCB0byAxIGluIHRtY2QgdHJhY2sgKGV2ZW4gdGhvdWdoIGl0IGlzIGxpa2VseQorICAgICAqIG5vdCB0aGUgY2FzZSkgYW5kIHRodXMgYXNzdW1lICJmcmFtZSBudW1iZXIgZm9ybWF0IiBpbnN0ZWFkIG9mIFFUIG9uZS4KKyAgICAgKiBObyBzYW1wbGUgd2l0aCB0bWNkIHRyYWNrIGNhbiBiZSBmb3VuZCB3aXRoIGEgUVQgdGltZWNvZGUgYXQgdGhlIG1vbWVudCwKKyAgICAgKiBkZXNwaXRlIHdoYXQgdGhlIHRtY2QgdHJhY2sgInN1Z2dlc3RzIiAoQ291bnRlciBmbGFnIHNldCB0byAwIG1lYW5zIFFUCisgICAgICogZm9ybWF0KS4gKi8KKyAgICBwYXJzZV90aW1lY29kZV9pbl9mcmFtZW51bV9mb3JtYXQocywgc3QsIHZhbHVlLCBmbGFncyk7CisKKyAgICBhdmlvX3NlZWsoc2MtPnBiLCBjdXJfcG9zLCBTRUVLX1NFVCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1PVkNvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgTU9WU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOworCisgICAgICAgIGF2X2ZyZWVwKCZzYy0+Y3R0c19kYXRhKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNjLT5kcmVmc19jb3VudDsgaisrKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmc2MtPmRyZWZzW2pdLnBhdGgpOworICAgICAgICAgICAgYXZfZnJlZXAoJnNjLT5kcmVmc1tqXS5kaXIpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVwKCZzYy0+ZHJlZnMpOworCisgICAgICAgIHNjLT5kcmVmc19jb3VudCA9IDA7CisKKyAgICAgICAgaWYgKCFzYy0+cGJfaXNfY29waWVkKQorICAgICAgICAgICAgYXZpb19jbG9zZShzYy0+cGIpOworCisgICAgICAgIHNjLT5wYiA9IE5VTEw7CisgICAgICAgIGF2X2ZyZWVwKCZzYy0+Y2h1bmtfb2Zmc2V0cyk7CisgICAgICAgIGF2X2ZyZWVwKCZzYy0+c3RzY19kYXRhKTsKKyAgICAgICAgYXZfZnJlZXAoJnNjLT5zYW1wbGVfc2l6ZXMpOworICAgICAgICBhdl9mcmVlcCgmc2MtPmtleWZyYW1lcyk7CisgICAgICAgIGF2X2ZyZWVwKCZzYy0+c3R0c19kYXRhKTsKKyAgICAgICAgYXZfZnJlZXAoJnNjLT5zdHBzX2RhdGEpOworICAgICAgICBhdl9mcmVlcCgmc2MtPnJhcF9ncm91cCk7CisgICAgICAgIGF2X2ZyZWVwKCZzYy0+ZGlzcGxheV9tYXRyaXgpOworICAgIH0KKworICAgIGlmIChtb3YtPmR2X2RlbXV4KSB7CisgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChtb3YtPmR2X2ZjdHgpOworICAgICAgICBtb3YtPmR2X2ZjdHggPSBOVUxMOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZtb3YtPnRyZXhfZGF0YSk7CisgICAgYXZfZnJlZXAoJm1vdi0+Yml0cmF0ZXMpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1vdi0+ZnJhZ21lbnRfaW5kZXhfY291bnQ7IGkrKykgeworICAgICAgICBNT1ZGcmFnbWVudEluZGV4KiBpbmRleCA9IG1vdi0+ZnJhZ21lbnRfaW5kZXhfZGF0YVtpXTsKKyAgICAgICAgYXZfZnJlZXAoJmluZGV4LT5pdGVtcyk7CisgICAgICAgIGF2X2ZyZWVwKCZtb3YtPmZyYWdtZW50X2luZGV4X2RhdGFbaV0pOworICAgIH0KKyAgICBhdl9mcmVlcCgmbW92LT5mcmFnbWVudF9pbmRleF9kYXRhKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRtY2RfaXNfcmVmZXJlbmNlZChBVkZvcm1hdENvbnRleHQgKnMsIGludCB0bWNkX2lkKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CisKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICAgICAgICAgIHNjLT50aW1lY29kZV90cmFjayA9PSB0bWNkX2lkKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBsb29rIGZvciBhIHRtY2QgdHJhY2sgbm90IHJlZmVyZW5jZWQgYnkgYW55IHZpZGVvIHRyYWNrLCBhbmQgZXhwb3J0IGl0IGdsb2JhbGx5ICovCitzdGF0aWMgdm9pZCBleHBvcnRfb3JwaGFuX3RpbWVjb2RlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190YWcgID09IE1LVEFHKCd0JywnbScsJ2MnLCdkJykgJiYKKyAgICAgICAgICAgICF0bWNkX2lzX3JlZmVyZW5jZWQocywgaSArIDEpKSB7CisgICAgICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGNyID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAidGltZWNvZGUiLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmICh0Y3IpIHsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJ0aW1lY29kZSIsIHRjci0+dmFsdWUsIDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IHJlYWRfdGZyYShNT1ZDb250ZXh0ICptb3YsIEFWSU9Db250ZXh0ICpmKQoreworICAgIE1PVkZyYWdtZW50SW5kZXgqIGluZGV4ID0gTlVMTDsKKyAgICBpbnQgdmVyc2lvbiwgZmllbGRsZW5ndGgsIGksIGosIGVycjsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChmKTsKKyAgICB1aW50MzJfdCBzaXplID0gYXZpb19yYjMyKGYpOworICAgIGlmIChhdmlvX3JiMzIoZikgIT0gTUtCRVRBRygndCcsICdmJywgJ3InLCAnYScpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19WRVJCT1NFLCAiZm91bmQgdGZyYVxuIik7CisgICAgaW5kZXggPSBhdl9tYWxsb2N6KHNpemVvZihNT1ZGcmFnbWVudEluZGV4KSk7CisgICAgaWYgKCFpbmRleCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBtb3YtPmZyYWdtZW50X2luZGV4X2NvdW50Kys7CisgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmbW92LT5mcmFnbWVudF9pbmRleF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92LT5mcmFnbWVudF9pbmRleF9jb3VudCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTU9WRnJhZ21lbnRJbmRleCopKSkgPCAwKSB7CisgICAgICAgIGF2X2ZyZWVwKCZpbmRleCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIG1vdi0+ZnJhZ21lbnRfaW5kZXhfZGF0YVttb3YtPmZyYWdtZW50X2luZGV4X2NvdW50IC0gMV0gPQorICAgICAgICBpbmRleDsKKworICAgIHZlcnNpb24gPSBhdmlvX3I4KGYpOworICAgIGF2aW9fcmIyNChmKTsKKyAgICBpbmRleC0+dHJhY2tfaWQgPSBhdmlvX3JiMzIoZik7CisgICAgZmllbGRsZW5ndGggPSBhdmlvX3JiMzIoZik7CisgICAgaW5kZXgtPml0ZW1fY291bnQgPSBhdmlvX3JiMzIoZik7CisgICAgaW5kZXgtPml0ZW1zID0gYXZfbWFsbG9jeigKKyAgICAgICAgICAgIGluZGV4LT5pdGVtX2NvdW50ICogc2l6ZW9mKE1PVkZyYWdtZW50SW5kZXhJdGVtKSk7CisgICAgaWYgKCFpbmRleC0+aXRlbXMpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGluZGV4LT5pdGVtX2NvdW50OyBpKyspIHsKKyAgICAgICAgaW50NjRfdCB0aW1lLCBvZmZzZXQ7CisgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgIHRpbWUgICA9IGF2aW9fcmI2NChmKTsKKyAgICAgICAgICAgIG9mZnNldCA9IGF2aW9fcmI2NChmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRpbWUgICA9IGF2aW9fcmIzMihmKTsKKyAgICAgICAgICAgIG9mZnNldCA9IGF2aW9fcmIzMihmKTsKKyAgICAgICAgfQorICAgICAgICBpbmRleC0+aXRlbXNbaV0udGltZSA9IHRpbWU7CisgICAgICAgIGluZGV4LT5pdGVtc1tpXS5tb29mX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8ICgoZmllbGRsZW5ndGggPj4gNCkgJiAzKSArIDE7IGorKykKKyAgICAgICAgICAgIGF2aW9fcjgoZik7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAoKGZpZWxkbGVuZ3RoID4+IDIpICYgMykgKyAxOyBqKyspCisgICAgICAgICAgICBhdmlvX3I4KGYpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgKChmaWVsZGxlbmd0aCA+PiAwKSAmIDMpICsgMTsgaisrKQorICAgICAgICAgICAgYXZpb19yOChmKTsKKyAgICB9CisKKyAgICBhdmlvX3NlZWsoZiwgcG9zICsgc2l6ZSwgU0VFS19TRVQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX21mcmEoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKmYpCit7CisgICAgaW50NjRfdCBzdHJlYW1fc2l6ZSA9IGF2aW9fc2l6ZShmKTsKKyAgICBpbnQ2NF90IG9yaWdpbmFsX3BvcyA9IGF2aW9fdGVsbChmKTsKKyAgICBpbnQ2NF90IHNlZWtfcmV0OworICAgIGludDMyX3QgbWZyYV9zaXplOworICAgIGludCByZXQgPSAtMTsKKyAgICBpZiAoKHNlZWtfcmV0ID0gYXZpb19zZWVrKGYsIHN0cmVhbV9zaXplIC0gNCwgU0VFS19TRVQpKSA8IDApIHsKKyAgICAgICAgcmV0ID0gc2Vla19yZXQ7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgbWZyYV9zaXplID0gYXZpb19yYjMyKGYpOworICAgIGlmIChtZnJhX3NpemUgPCAwIHx8IG1mcmFfc2l6ZSA+IHN0cmVhbV9zaXplKSB7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiZG9lc24ndCBsb29rIGxpa2UgbWZyYSAodW5yZWFzb25hYmxlIHNpemUpXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoKHNlZWtfcmV0ID0gYXZpb19zZWVrKGYsIC1tZnJhX3NpemUsIFNFRUtfQ1VSKSkgPCAwKSB7CisgICAgICAgIHJldCA9IHNlZWtfcmV0OworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChhdmlvX3JiMzIoZikgIT0gbWZyYV9zaXplKSB7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiZG9lc24ndCBsb29rIGxpa2UgbWZyYSAoc2l6ZSBtaXNtYXRjaClcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChhdmlvX3JiMzIoZikgIT0gTUtCRVRBRygnbScsICdmJywgJ3InLCAnYScpKSB7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiZG9lc24ndCBsb29rIGxpa2UgbWZyYSAodGFnIG1pc21hdGNoKVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcmV0ID0gMDsKKyAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19WRVJCT1NFLCAic3RyZWFtIGhhcyBtZnJhXG4iKTsKKyAgICB3aGlsZSAoIXJlYWRfdGZyYShjLCBmKSkgeworICAgICAgICAvKiBFbXB0eSAqLworICAgIH0KK2ZhaWw6CisgICAgc2Vla19yZXQgPSBhdmlvX3NlZWsoZiwgb3JpZ2luYWxfcG9zLCBTRUVLX1NFVCk7CisgICAgaWYgKHNlZWtfcmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2VlayBiYWNrIGFmdGVyIGxvb2tpbmcgZm9yIG1mcmFcbiIpOworICAgICAgICByZXQgPSBzZWVrX3JldDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1PVkNvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgaiwgZXJyOworICAgIE1PVkF0b20gYXRvbSA9IHsgQVZfUkwzMigicm9vdCIpIH07CisgICAgaW50IGk7CisKKyAgICBtb3YtPmZjID0gczsKKyAgICAvKiAubW92IGFuZCAubXA0IGFyZW4ndCBzdHJlYW1hYmxlIGFueXdheSAob25seSBwcm9ncmVzc2l2ZSBkb3dubG9hZCBpZiBtb292IGlzIGJlZm9yZSBtZGF0KSAqLworICAgIGlmIChwYi0+c2Vla2FibGUpCisgICAgICAgIGF0b20uc2l6ZSA9IGF2aW9fc2l6ZShwYik7CisgICAgZWxzZQorICAgICAgICBhdG9tLnNpemUgPSBJTlQ2NF9NQVg7CisKKyAgICAvKiBjaGVjayBNT1YgaGVhZGVyICovCisgICAgZG8geworICAgIGlmIChtb3YtPm1vb3ZfcmV0cnkpCisgICAgICAgIGF2aW9fc2VlayhwYiwgMCwgU0VFS19TRVQpOworICAgIGlmICgoZXJyID0gbW92X3JlYWRfZGVmYXVsdChtb3YsIHBiLCBhdG9tKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJlcnJvciByZWFkaW5nIGhlYWRlclxuIik7CisgICAgICAgIG1vdl9yZWFkX2Nsb3NlKHMpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICB9IHdoaWxlIChwYi0+c2Vla2FibGUgJiYgIW1vdi0+Zm91bmRfbW9vdiAmJiAhbW92LT5tb292X3JldHJ5KyspOworICAgIGlmICghbW92LT5mb3VuZF9tb292KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJtb292IGF0b20gbm90IGZvdW5kXG4iKTsKKyAgICAgICAgbW92X3JlYWRfY2xvc2Uocyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhdl9kbG9nKG1vdi0+ZmMsICJvbl9wYXJzZV9leGl0X29mZnNldD0lIlBSSWQ2NCJcbiIsIGF2aW9fdGVsbChwYikpOworCisgICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgICAgICBpZiAobW92LT5jaGFwdGVyX3RyYWNrID4gMCkKKyAgICAgICAgICAgIG1vdl9yZWFkX2NoYXB0ZXJzKHMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190YWcgPT0gQVZfUkwzMigidG1jZCIpKQorICAgICAgICAgICAgICAgIG1vdl9yZWFkX3RpbWVjb2RlX3RyYWNrKHMsIHMtPnN0cmVhbXNbaV0pOworICAgIH0KKworICAgIC8qIGNvcHkgdGltZWNvZGUgbWV0YWRhdGEgZnJvbSB0bWNkIHRyYWNrcyB0byB0aGUgcmVsYXRlZCB2aWRlbyBzdHJlYW1zICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgIGlmIChzYy0+dGltZWNvZGVfdHJhY2sgPiAwKSB7CisgICAgICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGNyOworICAgICAgICAgICAgaW50IHRtY2Rfc3RfaWQgPSAtMTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPm5iX3N0cmVhbXM7IGorKykKKyAgICAgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tqXS0+aWQgPT0gc2MtPnRpbWVjb2RlX3RyYWNrKQorICAgICAgICAgICAgICAgICAgICB0bWNkX3N0X2lkID0gajsKKworICAgICAgICAgICAgaWYgKHRtY2Rfc3RfaWQgPCAwIHx8IHRtY2Rfc3RfaWQgPT0gaSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHRjciA9IGF2X2RpY3RfZ2V0KHMtPnN0cmVhbXNbdG1jZF9zdF9pZF0tPm1ldGFkYXRhLCAidGltZWNvZGUiLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmICh0Y3IpCisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgdGNyLT52YWx1ZSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZXhwb3J0X29ycGhhbl90aW1lY29kZShzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgTU9WU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOworICAgICAgICBmaXhfdGltZXNjYWxlKG1vdiwgc2MpOworICAgICAgICBpZihzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgICAgICBzdC0+c2tpcF9zYW1wbGVzID0gc2MtPnN0YXJ0X3BhZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBzYy0+bmJfZnJhbWVzX2Zvcl9mcHMgPiAwICYmIHNjLT5kdXJhdGlvbl9mb3JfZnBzID4gMCkKKyAgICAgICAgICAgIGF2X3JlZHVjZSgmc3QtPmF2Z19mcmFtZV9yYXRlLm51bSwgJnN0LT5hdmdfZnJhbWVfcmF0ZS5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgc2MtPnRpbWVfc2NhbGUqKGludDY0X3Qpc2MtPm5iX2ZyYW1lc19mb3JfZnBzLCBzYy0+ZHVyYXRpb25fZm9yX2ZwcywgSU5UX01BWCk7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT53aWR0aCA8PSAwIHx8IHN0LT5jb2RlYy0+aGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICA9IHNjLT53aWR0aDsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHNjLT5oZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGVyciA9IG1vdl9yZXdyaXRlX2R2ZF9zdWJfZXh0cmFkYXRhKHN0KSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1vdi0+dHJleF9kYXRhKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgICAgICBpZiAoc3QtPmR1cmF0aW9uID4gMCkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc2MtPmRhdGFfc2l6ZSAqIDggKiBzYy0+dGltZV9zY2FsZSAvIHN0LT5kdXJhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtb3YtPnVzZV9tZnJhX2ZvciA+IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKKyAgICAgICAgICAgIGlmIChzYy0+ZHVyYXRpb25fZm9yX2ZwcyA+IDApIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc2MtPmRhdGFfc2l6ZSAqIDggKiBzYy0+dGltZV9zY2FsZSAvCisgICAgICAgICAgICAgICAgICAgIHNjLT5kdXJhdGlvbl9mb3JfZnBzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG1vdi0+Yml0cmF0ZXNfY291bnQgJiYgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpZiAobW92LT5iaXRyYXRlc1tpXSkgeworICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmJpdF9yYXRlID0gbW92LT5iaXRyYXRlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZmX3JmcHNfY2FsY3VsYXRlKHMpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CisKKyAgICAgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICBlcnIgPSBmZl9yZXBsYXlnYWluX2V4cG9ydChzdCwgcy0+bWV0YWRhdGEpOworICAgICAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgICAgICBtb3ZfcmVhZF9jbG9zZShzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgaWYgKHNjLT5kaXNwbGF5X21hdHJpeCkgeworICAgICAgICAgICAgICAgIEFWUGFja2V0U2lkZURhdGEgKnNkLCAqdG1wOworCisgICAgICAgICAgICAgICAgdG1wID0gYXZfcmVhbGxvY19hcnJheShzdC0+c2lkZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPm5iX3NpZGVfZGF0YSArIDEsIHNpemVvZigqdG1wKSk7CisgICAgICAgICAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgICAgICBzdC0+c2lkZV9kYXRhID0gdG1wOworICAgICAgICAgICAgICAgIHN0LT5uYl9zaWRlX2RhdGErKzsKKworICAgICAgICAgICAgICAgIHNkID0gJnN0LT5zaWRlX2RhdGFbc3QtPm5iX3NpZGVfZGF0YSAtIDFdOworICAgICAgICAgICAgICAgIHNkLT50eXBlID0gQVZfUEtUX0RBVEFfRElTUExBWU1BVFJJWDsKKyAgICAgICAgICAgICAgICBzZC0+c2l6ZSA9IHNpemVvZihpbnQzMl90KSAqIDk7CisgICAgICAgICAgICAgICAgc2QtPmRhdGEgPSAodWludDhfdCopc2MtPmRpc3BsYXlfbWF0cml4OworICAgICAgICAgICAgICAgIHNjLT5kaXNwbGF5X21hdHJpeCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQVZJbmRleEVudHJ5ICptb3ZfZmluZF9uZXh0X3NhbXBsZShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICoqc3QpCit7CisgICAgQVZJbmRleEVudHJ5ICpzYW1wbGUgPSBOVUxMOworICAgIGludDY0X3QgYmVzdF9kdHMgPSBJTlQ2NF9NQVg7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqYXZzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIE1PVlN0cmVhbUNvbnRleHQgKm1zYyA9IGF2c3QtPnByaXZfZGF0YTsKKyAgICAgICAgaWYgKG1zYy0+cGIgJiYgbXNjLT5jdXJyZW50X3NhbXBsZSA8IGF2c3QtPm5iX2luZGV4X2VudHJpZXMpIHsKKyAgICAgICAgICAgIEFWSW5kZXhFbnRyeSAqY3VycmVudF9zYW1wbGUgPSAmYXZzdC0+aW5kZXhfZW50cmllc1ttc2MtPmN1cnJlbnRfc2FtcGxlXTsKKyAgICAgICAgICAgIGludDY0X3QgZHRzID0gYXZfcmVzY2FsZShjdXJyZW50X3NhbXBsZS0+dGltZXN0YW1wLCBBVl9USU1FX0JBU0UsIG1zYy0+dGltZV9zY2FsZSk7CisgICAgICAgICAgICBhdl9kbG9nKHMsICJzdHJlYW0gJWQsIHNhbXBsZSAlZCwgZHRzICUiUFJJZDY0IlxuIiwgaSwgbXNjLT5jdXJyZW50X3NhbXBsZSwgZHRzKTsKKyAgICAgICAgICAgIGlmICghc2FtcGxlIHx8ICghcy0+cGItPnNlZWthYmxlICYmIGN1cnJlbnRfc2FtcGxlLT5wb3MgPCBzYW1wbGUtPnBvcykgfHwKKyAgICAgICAgICAgICAgICAocy0+cGItPnNlZWthYmxlICYmCisgICAgICAgICAgICAgICAgICgobXNjLT5wYiAhPSBzLT5wYiAmJiBkdHMgPCBiZXN0X2R0cykgfHwgKG1zYy0+cGIgPT0gcy0+cGIgJiYKKyAgICAgICAgICAgICAgICAgKChGRkFCUyhiZXN0X2R0cyAtIGR0cykgPD0gQVZfVElNRV9CQVNFICYmIGN1cnJlbnRfc2FtcGxlLT5wb3MgPCBzYW1wbGUtPnBvcykgfHwKKyAgICAgICAgICAgICAgICAgIChGRkFCUyhiZXN0X2R0cyAtIGR0cykgPiBBVl9USU1FX0JBU0UgJiYgZHRzIDwgYmVzdF9kdHMpKSkpKSkgeworICAgICAgICAgICAgICAgIHNhbXBsZSA9IGN1cnJlbnRfc2FtcGxlOworICAgICAgICAgICAgICAgIGJlc3RfZHRzID0gZHRzOworICAgICAgICAgICAgICAgICpzdCA9IGF2c3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNhbXBsZTsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE1PVkNvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICBBVkluZGV4RW50cnkgKnNhbXBsZTsKKyAgICBBVlN0cmVhbSAqc3QgPSBOVUxMOworICAgIGludCByZXQ7CisgICAgbW92LT5mYyA9IHM7CisgcmV0cnk6CisgICAgc2FtcGxlID0gbW92X2ZpbmRfbmV4dF9zYW1wbGUocywgJnN0KTsKKyAgICBpZiAoIXNhbXBsZSkgeworICAgICAgICBtb3YtPmZvdW5kX21kYXQgPSAwOworICAgICAgICBpZiAoIW1vdi0+bmV4dF9yb290X2F0b20pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgbW92LT5uZXh0X3Jvb3RfYXRvbSwgU0VFS19TRVQpOworICAgICAgICBtb3YtPm5leHRfcm9vdF9hdG9tID0gMDsKKyAgICAgICAgaWYgKG1vdl9yZWFkX2RlZmF1bHQobW92LCBzLT5wYiwgKE1PVkF0b20peyBBVl9STDMyKCJyb290IiksIElOVDY0X01BWCB9KSA8IDAgfHwKKyAgICAgICAgICAgIGF2aW9fZmVvZihzLT5wYikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIGF2X2Rsb2cocywgInJlYWQgZnJhZ21lbnRzLCBvZmZzZXQgMHglIlBSSXg2NCJcbiIsIGF2aW9fdGVsbChzLT5wYikpOworICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICBzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgLyogbXVzdCBiZSBkb25lIGp1c3QgYmVmb3JlIHJlYWRpbmcsIHRvIGF2b2lkIGluZmluaXRlIGxvb3Agb24gc2FtcGxlICovCisgICAgc2MtPmN1cnJlbnRfc2FtcGxlKys7CisKKyAgICBpZiAobW92LT5uZXh0X3Jvb3RfYXRvbSkgeworICAgICAgICBzYW1wbGUtPnBvcyA9IEZGTUlOKHNhbXBsZS0+cG9zLCBtb3YtPm5leHRfcm9vdF9hdG9tKTsKKyAgICAgICAgc2FtcGxlLT5zaXplID0gRkZNSU4oc2FtcGxlLT5zaXplLCAobW92LT5uZXh0X3Jvb3RfYXRvbSAtIHNhbXBsZS0+cG9zKSk7CisgICAgfQorCisgICAgaWYgKHN0LT5kaXNjYXJkICE9IEFWRElTQ0FSRF9BTEwpIHsKKyAgICAgICAgaWYgKGF2aW9fc2VlayhzYy0+cGIsIHNhbXBsZS0+cG9zLCBTRUVLX1NFVCkgIT0gc2FtcGxlLT5wb3MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfRVJST1IsICJzdHJlYW0gJWQsIG9mZnNldCAweCUiUFJJeDY0IjogcGFydGlhbCBmaWxlXG4iLAorICAgICAgICAgICAgICAgICAgIHNjLT5mZmluZGV4LCBzYW1wbGUtPnBvcyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHNjLT5wYiwgcGt0LCBzYW1wbGUtPnNpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmIChzYy0+aGFzX3BhbGV0dGUpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnBhbDsKKworICAgICAgICAgICAgcGFsID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgICAgICBpZiAoIXBhbCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYXBwZW5kIHBhbGV0dGUgdG8gcGFja2V0XG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBhbCwgc2MtPnBhbGV0dGUsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgICAgICBzYy0+aGFzX3BhbGV0dGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWYgQ09ORklHX0RWX0RFTVVYRVIKKyAgICAgICAgaWYgKG1vdi0+ZHZfZGVtdXggJiYgc2MtPmR2X2F1ZGlvX2NvbnRhaW5lcikgeworICAgICAgICAgICAgYXZwcml2X2R2X3Byb2R1Y2VfcGFja2V0KG1vdi0+ZHZfZGVtdXgsIHBrdCwgcGt0LT5kYXRhLCBwa3QtPnNpemUsIHBrdC0+cG9zKTsKKyAgICAgICAgICAgIGF2X2ZyZWUocGt0LT5kYXRhKTsKKyAgICAgICAgICAgIHBrdC0+c2l6ZSA9IDA7CisgICAgICAgICAgICByZXQgPSBhdnByaXZfZHZfZ2V0X3BhY2tldChtb3YtPmR2X2RlbXV4LCBwa3QpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzYy0+ZmZpbmRleDsKKyAgICBwa3QtPmR0cyA9IHNhbXBsZS0+dGltZXN0YW1wOworICAgIGlmIChzYy0+Y3R0c19kYXRhICYmIHNjLT5jdHRzX2luZGV4IDwgc2MtPmN0dHNfY291bnQpIHsKKyAgICAgICAgcGt0LT5wdHMgPSBwa3QtPmR0cyArIHNjLT5kdHNfc2hpZnQgKyBzYy0+Y3R0c19kYXRhW3NjLT5jdHRzX2luZGV4XS5kdXJhdGlvbjsKKyAgICAgICAgLyogdXBkYXRlIGN0dHMgY29udGV4dCAqLworICAgICAgICBzYy0+Y3R0c19zYW1wbGUrKzsKKyAgICAgICAgaWYgKHNjLT5jdHRzX2luZGV4IDwgc2MtPmN0dHNfY291bnQgJiYKKyAgICAgICAgICAgIHNjLT5jdHRzX2RhdGFbc2MtPmN0dHNfaW5kZXhdLmNvdW50ID09IHNjLT5jdHRzX3NhbXBsZSkgeworICAgICAgICAgICAgc2MtPmN0dHNfaW5kZXgrKzsKKyAgICAgICAgICAgIHNjLT5jdHRzX3NhbXBsZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjLT53cm9uZ19kdHMpCisgICAgICAgICAgICBwa3QtPmR0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgbmV4dF9kdHMgPSAoc2MtPmN1cnJlbnRfc2FtcGxlIDwgc3QtPm5iX2luZGV4X2VudHJpZXMpID8KKyAgICAgICAgICAgIHN0LT5pbmRleF9lbnRyaWVzW3NjLT5jdXJyZW50X3NhbXBsZV0udGltZXN0YW1wIDogc3QtPmR1cmF0aW9uOworICAgICAgICBwa3QtPmR1cmF0aW9uID0gbmV4dF9kdHMgLSBwa3QtPmR0czsKKyAgICAgICAgcGt0LT5wdHMgPSBwa3QtPmR0czsKKyAgICB9CisgICAgaWYgKHN0LT5kaXNjYXJkID09IEFWRElTQ0FSRF9BTEwpCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgcGt0LT5mbGFncyB8PSBzYW1wbGUtPmZsYWdzICYgQVZJTkRFWF9LRVlGUkFNRSA/IEFWX1BLVF9GTEFHX0tFWSA6IDA7CisgICAgcGt0LT5wb3MgPSBzYW1wbGUtPnBvczsKKyAgICBhdl9kbG9nKHMsICJzdHJlYW0gJWQsIHB0cyAlIlBSSWQ2NCIsIGR0cyAlIlBSSWQ2NCIsIHBvcyAweCUiUFJJeDY0IiwgZHVyYXRpb24gJWRcbiIsCisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCwgcGt0LT5wdHMsIHBrdC0+ZHRzLCBwa3QtPnBvcywgcGt0LT5kdXJhdGlvbik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3NlZWtfc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQoreworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKKyAgICBpbnQgc2FtcGxlLCB0aW1lX3NhbXBsZTsKKyAgICBpbnQgaTsKKworICAgIHNhbXBsZSA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QsIHRpbWVzdGFtcCwgZmxhZ3MpOworICAgIGF2X2Rsb2cocywgInN0cmVhbSAlZCwgdGltZXN0YW1wICUiUFJJZDY0Iiwgc2FtcGxlICVkXG4iLCBzdC0+aW5kZXgsIHRpbWVzdGFtcCwgc2FtcGxlKTsKKyAgICBpZiAoc2FtcGxlIDwgMCAmJiBzdC0+bmJfaW5kZXhfZW50cmllcyAmJiB0aW1lc3RhbXAgPCBzdC0+aW5kZXhfZW50cmllc1swXS50aW1lc3RhbXApCisgICAgICAgIHNhbXBsZSA9IDA7CisgICAgaWYgKHNhbXBsZSA8IDApIC8qIG5vdCBzdXJlIHdoYXQgdG8gZG8gKi8KKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgc2MtPmN1cnJlbnRfc2FtcGxlID0gc2FtcGxlOworICAgIGF2X2Rsb2cocywgInN0cmVhbSAlZCwgZm91bmQgc2FtcGxlICVkXG4iLCBzdC0+aW5kZXgsIHNjLT5jdXJyZW50X3NhbXBsZSk7CisgICAgLyogYWRqdXN0IGN0dHMgaW5kZXggKi8KKyAgICBpZiAoc2MtPmN0dHNfZGF0YSkgeworICAgICAgICB0aW1lX3NhbXBsZSA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzYy0+Y3R0c19jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbmV4dCA9IHRpbWVfc2FtcGxlICsgc2MtPmN0dHNfZGF0YVtpXS5jb3VudDsKKyAgICAgICAgICAgIGlmIChuZXh0ID4gc2MtPmN1cnJlbnRfc2FtcGxlKSB7CisgICAgICAgICAgICAgICAgc2MtPmN0dHNfaW5kZXggPSBpOworICAgICAgICAgICAgICAgIHNjLT5jdHRzX3NhbXBsZSA9IHNjLT5jdXJyZW50X3NhbXBsZSAtIHRpbWVfc2FtcGxlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZV9zYW1wbGUgPSBuZXh0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzYW1wbGU7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3Qgc2FtcGxlX3RpbWUsIGludCBmbGFncykKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50NjRfdCBzZWVrX3RpbWVzdGFtcCwgdGltZXN0YW1wOworICAgIGludCBzYW1wbGU7CisgICAgaW50IGk7CisKKyAgICBpZiAoc3RyZWFtX2luZGV4ID49IHMtPm5iX3N0cmVhbXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgc2FtcGxlID0gbW92X3NlZWtfc3RyZWFtKHMsIHN0LCBzYW1wbGVfdGltZSwgZmxhZ3MpOworICAgIGlmIChzYW1wbGUgPCAwKQorICAgICAgICByZXR1cm4gc2FtcGxlOworCisgICAgLyogYWRqdXN0IHNlZWsgdGltZXN0YW1wIHRvIGZvdW5kIHNhbXBsZSB0aW1lc3RhbXAgKi8KKyAgICBzZWVrX3RpbWVzdGFtcCA9IHN0LT5pbmRleF9lbnRyaWVzW3NhbXBsZV0udGltZXN0YW1wOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYyA9IHMtPnN0cmVhbXNbaV0tPnByaXZfZGF0YTsKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBzdC0+c2tpcF9zYW1wbGVzID0gKHNhbXBsZV90aW1lIDw9IDApID8gc2MtPnN0YXJ0X3BhZCA6IDA7CisKKyAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA9PSBpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgdGltZXN0YW1wID0gYXZfcmVzY2FsZV9xKHNlZWtfdGltZXN0YW1wLCBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPnRpbWVfYmFzZSwgc3QtPnRpbWVfYmFzZSk7CisgICAgICAgIG1vdl9zZWVrX3N0cmVhbShzLCBzdCwgdGltZXN0YW1wLCBmbGFncyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihNT1ZDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbW92X29wdGlvbnNbXSA9IHsKKyAgICB7InVzZV9hYnNvbHV0ZV9wYXRoIiwKKyAgICAgICAgImFsbG93IHVzaW5nIGFic29sdXRlIHBhdGggd2hlbiBvcGVuaW5nIGFsaWFzLCB0aGlzIGlzIGEgcG9zc2libGUgc2VjdXJpdHkgaXNzdWUiLAorICAgICAgICBvZmZzZXRvZihNT1ZDb250ZXh0LCB1c2VfYWJzb2x1dGVfcGF0aCksIEZGX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwKKyAgICAgICAgMCwgMSwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU19LAorICAgIHsiaWdub3JlX2VkaXRsaXN0IiwgIiIsIG9mZnNldG9mKE1PVkNvbnRleHQsIGlnbm9yZV9lZGl0bGlzdCksIEZGX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwKKyAgICAgICAgMCwgMSwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU19LAorICAgIHsidXNlX21mcmFfZm9yIiwKKyAgICAgICAgInVzZSBtZnJhIGZvciBmcmFnbWVudCB0aW1lc3RhbXBzIiwKKyAgICAgICAgb2Zmc2V0b2YoTU9WQ29udGV4dCwgdXNlX21mcmFfZm9yKSwgRkZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEZGX01PVl9GTEFHX01GUkFfQVVUT30sCisgICAgICAgIC0xLCBGRl9NT1ZfRkxBR19NRlJBX1BUUywgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sCisgICAgICAgICJ1c2VfbWZyYV9mb3IifSwKKyAgICB7ImF1dG8iLCAiYXV0byIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX01GUkFfQVVUT30sIDAsIDAsCisgICAgICAgIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAidXNlX21mcmFfZm9yIiB9LAorICAgIHsiZHRzIiwgImR0cyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX01GUkFfRFRTfSwgMCwgMCwKKyAgICAgICAgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJ1c2VfbWZyYV9mb3IiIH0sCisgICAgeyJwdHMiLCAicHRzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfTU9WX0ZMQUdfTUZSQV9QVFN9LCAwLCAwLAorICAgICAgICBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgInVzZV9tZnJhX2ZvciIgfSwKKyAgICB7ICJleHBvcnRfYWxsIiwgIkV4cG9ydCB1bnJlY29nbml6ZWQgbWV0YWRhdGEgZW50cmllcyIsIE9GRlNFVChleHBvcnRfYWxsKSwKKyAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBtb3ZfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibW92LG1wNCxtNGEsM2dwLDNnMixtajIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBtb3Zfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfbW92X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1vdixtcDQsbTRhLDNncCwzZzIsbWoyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUXVpY2tUaW1lIC8gTU9WIiksCisgICAgLnByaXZfY2xhc3MgICAgID0gJm1vdl9jbGFzcywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTU9WQ29udGV4dCksCisgICAgLmV4dGVuc2lvbnMgICAgID0gIm1vdixtcDQsbTRhLDNncCwzZzIsbWoyIiwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBtb3ZfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gbW92X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IG1vdl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBtb3ZfcmVhZF9jbG9zZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSBtb3ZfcmVhZF9zZWVrLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PX0JZVEVfU0VFSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbW92X2NoYW4uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tb3ZfY2hhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTFlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbW92X2NoYW4uYwpAQCAtMCwwICsxLDU5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBKdXN0aW4gUnVnZ2xlcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIG1vdiAnY2hhbicgdGFnIHJlYWRpbmcvd3JpdGluZy4KKyAqIEBhdXRob3IgSnVzdGluIFJ1Z2dsZXMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJtb3ZfY2hhbi5oIgorCisvKioKKyAqIENoYW5uZWwgTGF5b3V0IFRhZworICogVGhpcyB0ZWxscyB3aGljaCBjaGFubmVscyBhcmUgcHJlc2VudCBpbiB0aGUgYXVkaW8gc3RyZWFtIGFuZCB0aGUgb3JkZXIgaW4KKyAqIHdoaWNoIHRoZXkgYXBwZWFyLgorICoKKyAqIEBub3RlIFdlJ3JlIHVzaW5nIHRoZSBjaGFubmVsIGxheW91dCB0YWcgdG8gaW5kaWNhdGUgY2hhbm5lbCBvcmRlcgorICogICAgICAgd2hlbiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDB4MTAwMDAuIFRoZSBBcHBsZSBkb2N1bWVudGF0aW9uIGhhcworICogICAgICAgc29tZSBjb250cmFkaWN0aW9ucyBhcyB0byBob3cgdGhpcyBpcyBhY3R1YWxseSBzdXBwb3NlZCB0byBiZSBoYW5kbGVkLgorICoKKyAqICAgICAgIENvcmUgQXVkaW8gRmlsZSBGb3JtYXQgU3BlYzoKKyAqICAgICAgICAgICAiVGhlIGhpZ2ggMTYgYml0cyBpbmRpY2F0ZXMgYSBzcGVjaWZpYyBvcmRlcmluZyBvZiB0aGUgY2hhbm5lbHMuIgorICogICAgICAgQ29yZSBBdWRpbyBEYXRhIFR5cGVzIFJlZmVyZW5jZToKKyAqICAgICAgICAgICAiVGhlc2UgaWRlbnRpZmllcnMgc3BlY2lmeSB0aGUgY2hhbm5lbHMgaW5jbHVkZWQgaW4gYSBsYXlvdXQgYnV0CisgKiAgICAgICAgICAgIGRvIG5vdCBzcGVjaWZ5IGEgcGFydGljdWxhciBvcmRlcmluZyBvZiB0aG9zZSBjaGFubmVscy4iCisgKi8KK2VudW0gTW92Q2hhbm5lbExheW91dFRhZyB7CisgICAgTU9WX0NIX0xBWU9VVF9VTktOT1dOICAgICAgICAgICAgICAgPSAweEZGRkYwMDAwLAorICAgIE1PVl9DSF9MQVlPVVRfVVNFX0RFU0NSSVBUSU9OUyAgICAgID0gKCAgMCA8PCAxNikgfCAwLAorICAgIE1PVl9DSF9MQVlPVVRfVVNFX0JJVE1BUCAgICAgICAgICAgID0gKCAgMSA8PCAxNikgfCAwLAorICAgIE1PVl9DSF9MQVlPVVRfRElTQ1JFVEVJTk9SREVSICAgICAgID0gKDE0NyA8PCAxNikgfCAwLAorICAgIE1PVl9DSF9MQVlPVVRfTU9OTyAgICAgICAgICAgICAgICAgID0gKDEwMCA8PCAxNikgfCAxLAorICAgIE1PVl9DSF9MQVlPVVRfU1RFUkVPICAgICAgICAgICAgICAgID0gKDEwMSA8PCAxNikgfCAyLAorICAgIE1PVl9DSF9MQVlPVVRfU1RFUkVPSEVBRFBIT05FUyAgICAgID0gKDEwMiA8PCAxNikgfCAyLAorICAgIE1PVl9DSF9MQVlPVVRfTUFUUklYU1RFUkVPICAgICAgICAgID0gKDEwMyA8PCAxNikgfCAyLAorICAgIE1PVl9DSF9MQVlPVVRfTUlEU0lERSAgICAgICAgICAgICAgID0gKDEwNCA8PCAxNikgfCAyLAorICAgIE1PVl9DSF9MQVlPVVRfWFkgICAgICAgICAgICAgICAgICAgID0gKDEwNSA8PCAxNikgfCAyLAorICAgIE1PVl9DSF9MQVlPVVRfQklOQVVSQUwgICAgICAgICAgICAgID0gKDEwNiA8PCAxNikgfCAyLAorICAgIE1PVl9DSF9MQVlPVVRfQU1CSVNPTklDX0JfRk9STUFUICAgID0gKDEwNyA8PCAxNikgfCA0LAorICAgIE1PVl9DSF9MQVlPVVRfUVVBRFJBUEhPTklDICAgICAgICAgID0gKDEwOCA8PCAxNikgfCA0LAorICAgIE1PVl9DSF9MQVlPVVRfUEVOVEFHT05BTCAgICAgICAgICAgID0gKDEwOSA8PCAxNikgfCA1LAorICAgIE1PVl9DSF9MQVlPVVRfSEVYQUdPTkFMICAgICAgICAgICAgID0gKDExMCA8PCAxNikgfCA2LAorICAgIE1PVl9DSF9MQVlPVVRfT0NUQUdPTkFMICAgICAgICAgICAgID0gKDExMSA8PCAxNikgfCA4LAorICAgIE1PVl9DSF9MQVlPVVRfQ1VCRSAgICAgICAgICAgICAgICAgID0gKDExMiA8PCAxNikgfCA4LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR18zXzBfQSAgICAgICAgICAgID0gKDExMyA8PCAxNikgfCAzLAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR18zXzBfQiAgICAgICAgICAgID0gKDExNCA8PCAxNikgfCAzLAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR180XzBfQSAgICAgICAgICAgID0gKDExNSA8PCAxNikgfCA0LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR180XzBfQiAgICAgICAgICAgID0gKDExNiA8PCAxNikgfCA0LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR181XzBfQSAgICAgICAgICAgID0gKDExNyA8PCAxNikgfCA1LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR181XzBfQiAgICAgICAgICAgID0gKDExOCA8PCAxNikgfCA1LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR181XzBfQyAgICAgICAgICAgID0gKDExOSA8PCAxNikgfCA1LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR181XzBfRCAgICAgICAgICAgID0gKDEyMCA8PCAxNikgfCA1LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR181XzFfQSAgICAgICAgICAgID0gKDEyMSA8PCAxNikgfCA2LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR181XzFfQiAgICAgICAgICAgID0gKDEyMiA8PCAxNikgfCA2LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR181XzFfQyAgICAgICAgICAgID0gKDEyMyA8PCAxNikgfCA2LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR181XzFfRCAgICAgICAgICAgID0gKDEyNCA8PCAxNikgfCA2LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR182XzFfQSAgICAgICAgICAgID0gKDEyNSA8PCAxNikgfCA3LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR183XzFfQSAgICAgICAgICAgID0gKDEyNiA8PCAxNikgfCA4LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR183XzFfQiAgICAgICAgICAgID0gKDEyNyA8PCAxNikgfCA4LAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR183XzFfQyAgICAgICAgICAgID0gKDEyOCA8PCAxNikgfCA4LAorICAgIE1PVl9DSF9MQVlPVVRfRU1BR0lDX0RFRkFVTFRfN18xICAgID0gKDEyOSA8PCAxNikgfCA4LAorICAgIE1PVl9DSF9MQVlPVVRfU01QVEVfRFRWICAgICAgICAgICAgID0gKDEzMCA8PCAxNikgfCA4LAorICAgIE1PVl9DSF9MQVlPVVRfSVRVXzJfMSAgICAgICAgICAgICAgID0gKDEzMSA8PCAxNikgfCAzLAorICAgIE1PVl9DSF9MQVlPVVRfSVRVXzJfMiAgICAgICAgICAgICAgID0gKDEzMiA8PCAxNikgfCA0LAorICAgIE1PVl9DSF9MQVlPVVRfRFZEXzQgICAgICAgICAgICAgICAgID0gKDEzMyA8PCAxNikgfCAzLAorICAgIE1PVl9DSF9MQVlPVVRfRFZEXzUgICAgICAgICAgICAgICAgID0gKDEzNCA8PCAxNikgfCA0LAorICAgIE1PVl9DSF9MQVlPVVRfRFZEXzYgICAgICAgICAgICAgICAgID0gKDEzNSA8PCAxNikgfCA1LAorICAgIE1PVl9DSF9MQVlPVVRfRFZEXzEwICAgICAgICAgICAgICAgID0gKDEzNiA8PCAxNikgfCA0LAorICAgIE1PVl9DSF9MQVlPVVRfRFZEXzExICAgICAgICAgICAgICAgID0gKDEzNyA8PCAxNikgfCA1LAorICAgIE1PVl9DSF9MQVlPVVRfRFZEXzE4ICAgICAgICAgICAgICAgID0gKDEzOCA8PCAxNikgfCA1LAorICAgIE1PVl9DSF9MQVlPVVRfQVVESU9VTklUXzZfMCAgICAgICAgID0gKDEzOSA8PCAxNikgfCA2LAorICAgIE1PVl9DSF9MQVlPVVRfQVVESU9VTklUXzdfMCAgICAgICAgID0gKDE0MCA8PCAxNikgfCA3LAorICAgIE1PVl9DSF9MQVlPVVRfQVVESU9VTklUXzdfMF9GUk9OVCAgID0gKDE0OCA8PCAxNikgfCA3LAorICAgIE1PVl9DSF9MQVlPVVRfQUFDXzZfMCAgICAgICAgICAgICAgID0gKDE0MSA8PCAxNikgfCA2LAorICAgIE1PVl9DSF9MQVlPVVRfQUFDXzZfMSAgICAgICAgICAgICAgID0gKDE0MiA8PCAxNikgfCA3LAorICAgIE1PVl9DSF9MQVlPVVRfQUFDXzdfMCAgICAgICAgICAgICAgID0gKDE0MyA8PCAxNikgfCA3LAorICAgIE1PVl9DSF9MQVlPVVRfQUFDX09DVEFHT05BTCAgICAgICAgID0gKDE0NCA8PCAxNikgfCA4LAorICAgIE1PVl9DSF9MQVlPVVRfVE1IXzEwXzJfU1REICAgICAgICAgID0gKDE0NSA8PCAxNikgfCAxNiwKKyAgICBNT1ZfQ0hfTEFZT1VUX1RNSF8xMF8yX0ZVTEwgICAgICAgICA9ICgxNDYgPDwgMTYpIHwgMjEsCisgICAgTU9WX0NIX0xBWU9VVF9BQzNfMV8wXzEgICAgICAgICAgICAgPSAoMTQ5IDw8IDE2KSB8IDIsCisgICAgTU9WX0NIX0xBWU9VVF9BQzNfM18wICAgICAgICAgICAgICAgPSAoMTUwIDw8IDE2KSB8IDMsCisgICAgTU9WX0NIX0xBWU9VVF9BQzNfM18xICAgICAgICAgICAgICAgPSAoMTUxIDw8IDE2KSB8IDQsCisgICAgTU9WX0NIX0xBWU9VVF9BQzNfM18wXzEgICAgICAgICAgICAgPSAoMTUyIDw8IDE2KSB8IDQsCisgICAgTU9WX0NIX0xBWU9VVF9BQzNfMl8xXzEgICAgICAgICAgICAgPSAoMTUzIDw8IDE2KSB8IDQsCisgICAgTU9WX0NIX0xBWU9VVF9BQzNfM18xXzEgICAgICAgICAgICAgPSAoMTU0IDw8IDE2KSB8IDUsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzZfMF9BICAgICAgICAgICAgPSAoMTU1IDw8IDE2KSB8IDYsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMF9BICAgICAgICAgICAgPSAoMTU2IDw8IDE2KSB8IDcsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzZfMV9BICAgICAgICAgICAgPSAoMTU3IDw8IDE2KSB8IDcsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzZfMV9CICAgICAgICAgICAgPSAoMTU4IDw8IDE2KSB8IDcsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzZfMV9DICAgICAgICAgICAgPSAoMTU5IDw8IDE2KSB8IDcsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMV9BICAgICAgICAgICAgPSAoMTYwIDw8IDE2KSB8IDgsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMV9CICAgICAgICAgICAgPSAoMTYxIDw8IDE2KSB8IDgsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMV9DICAgICAgICAgICAgPSAoMTYyIDw8IDE2KSB8IDgsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMV9EICAgICAgICAgICAgPSAoMTYzIDw8IDE2KSB8IDgsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMV9FICAgICAgICAgICAgPSAoMTY0IDw8IDE2KSB8IDgsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMV9GICAgICAgICAgICAgPSAoMTY1IDw8IDE2KSB8IDgsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMV9HICAgICAgICAgICAgPSAoMTY2IDw8IDE2KSB8IDgsCisgICAgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMV9IICAgICAgICAgICAgPSAoMTY3IDw8IDE2KSB8IDgsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfM18xICAgICAgICAgICAgICAgPSAoMTY4IDw8IDE2KSB8IDQsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfNF8xICAgICAgICAgICAgICAgPSAoMTY5IDw8IDE2KSB8IDUsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfNl8wX0EgICAgICAgICAgICAgPSAoMTcwIDw8IDE2KSB8IDYsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfNl8wX0IgICAgICAgICAgICAgPSAoMTcxIDw8IDE2KSB8IDYsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfNl8wX0MgICAgICAgICAgICAgPSAoMTcyIDw8IDE2KSB8IDYsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfNl8xX0EgICAgICAgICAgICAgPSAoMTczIDw8IDE2KSB8IDcsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfNl8xX0IgICAgICAgICAgICAgPSAoMTc0IDw8IDE2KSB8IDcsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfNl8xX0MgICAgICAgICAgICAgPSAoMTc1IDw8IDE2KSB8IDcsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfNl8xX0QgICAgICAgICAgICAgPSAoMTgyIDw8IDE2KSB8IDcsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfN18wICAgICAgICAgICAgICAgPSAoMTc2IDw8IDE2KSB8IDcsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfN18xICAgICAgICAgICAgICAgPSAoMTc3IDw8IDE2KSB8IDgsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfOF8wX0EgICAgICAgICAgICAgPSAoMTc4IDw8IDE2KSB8IDgsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfOF8wX0IgICAgICAgICAgICAgPSAoMTc5IDw8IDE2KSB8IDgsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfOF8xX0EgICAgICAgICAgICAgPSAoMTgwIDw8IDE2KSB8IDksCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfOF8xX0IgICAgICAgICAgICAgPSAoMTgxIDw8IDE2KSB8IDksCit9OworCitzdHJ1Y3QgTW92Q2hhbm5lbExheW91dE1hcCB7CisgICAgdWludDMyX3QgdGFnOworICAgIHVpbnQ2NF90IGxheW91dDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgTW92Q2hhbm5lbExheW91dE1hcCBtb3ZfY2hfbGF5b3V0X21hcF9taXNjW10gPSB7CisgICAgeyBNT1ZfQ0hfTEFZT1VUX1VTRV9ERVNDUklQVElPTlMsICAgMCB9LAorICAgIHsgTU9WX0NIX0xBWU9VVF9VU0VfQklUTUFQLCAgICAgICAgIDAgfSwKKyAgICB7IE1PVl9DSF9MQVlPVVRfRElTQ1JFVEVJTk9SREVSLCAgICAwIH0sCisgICAgeyBNT1ZfQ0hfTEFZT1VUX1VOS05PV04sICAgICAgICAgICAgMCB9LAorICAgIHsgTU9WX0NIX0xBWU9VVF9UTUhfMTBfMl9TVEQsICAgICAgIDAgfSwgLy8gTCwgICBSLCAgQywgICAgVmhjLCBMc2QsIFJzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExzLCAgUnMsIFZobCwgIFZociwgTHcsICBSdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENzZCwgQ3MsIExGRTEsIExGRTIKKyAgICB7IE1PVl9DSF9MQVlPVVRfVE1IXzEwXzJfRlVMTCwgICAgICAwIH0sIC8vIEwsICAgUiwgIEMsICAgIFZoYywgIExzZCwgUnNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTHMsICBScywgVmhsLCAgVmhyLCAgTHcsICBSdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENzZCwgQ3MsIExGRTEsIExGRTIsIExjLCAgUmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBISSwgIFZJLCBIYXB0aWMKKyAgICB7IDAsIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgTW92Q2hhbm5lbExheW91dE1hcCBtb3ZfY2hfbGF5b3V0X21hcF8xY2hbXSA9IHsKKyAgICB7IE1PVl9DSF9MQVlPVVRfTU9OTywgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfTU9OTyB9LCAvLyBDCisgICAgeyAwLCAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IE1vdkNoYW5uZWxMYXlvdXRNYXAgbW92X2NoX2xheW91dF9tYXBfMmNoW10gPSB7CisgICAgeyBNT1ZfQ0hfTEFZT1VUX1NURVJFTywgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTyAgICAgICAgIH0sIC8vIEwsIFIKKyAgICB7IE1PVl9DSF9MQVlPVVRfU1RFUkVPSEVBRFBIT05FUywgICBBVl9DSF9MQVlPVVRfU1RFUkVPICAgICAgICAgfSwgLy8gTCwgUgorICAgIHsgTU9WX0NIX0xBWU9VVF9CSU5BVVJBTCwgICAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8gICAgICAgICB9LCAvLyBMLCBSCisgICAgeyBNT1ZfQ0hfTEFZT1VUX01JRFNJREUsICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTyAgICAgICAgIH0sIC8vIEMsIHNpZGVzCisgICAgeyBNT1ZfQ0hfTEFZT1VUX1hZLCAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTyAgICAgICAgIH0sIC8vIFggKGxlZnQpLCBZIChyaWdodCkKKworICAgIHsgTU9WX0NIX0xBWU9VVF9NQVRSSVhTVEVSRU8sICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU9fRE9XTk1JWCB9LCAvLyBMdCwgUnQKKworICAgIHsgTU9WX0NIX0xBWU9VVF9BQzNfMV8wXzEsICAgICAgICAgIEFWX0NIX0xBWU9VVF9NT05PIHwgICAgICAgICAgICAvLyBDLCBMRkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9MT1dfRlJFUVVFTkNZICAgICAgICAgfSwKKyAgICB7IDAsIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgTW92Q2hhbm5lbExheW91dE1hcCBtb3ZfY2hfbGF5b3V0X21hcF8zY2hbXSA9IHsKKyAgICB7IE1PVl9DSF9MQVlPVVRfTVBFR18zXzBfQSwgICAgICAgICBBVl9DSF9MQVlPVVRfU1VSUk9VTkQgfSwgLy8gTCwgUiwgQworICAgIHsgTU9WX0NIX0xBWU9VVF9NUEVHXzNfMF9CLCAgICAgICAgIEFWX0NIX0xBWU9VVF9TVVJST1VORCB9LCAvLyBDLCBMLCBSCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0FDM18zXzAsICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NVUlJPVU5EIH0sIC8vIEwsIEMsIFIKKworICAgIHsgTU9WX0NIX0xBWU9VVF9JVFVfMl8xLCAgICAgICAgICAgIEFWX0NIX0xBWU9VVF8yXzEgICAgICB9LCAvLyBMLCBSLCBDcworCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0RWRF80LCAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzJQT0lOVDEgIH0sIC8vIEwsIFIsIExGRQorICAgIHsgMCwgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBNb3ZDaGFubmVsTGF5b3V0TWFwIG1vdl9jaF9sYXlvdXRfbWFwXzRjaFtdID0geworICAgIHsgTU9WX0NIX0xBWU9VVF9BTUJJU09OSUNfQl9GT1JNQVQsIDAgfSwgICAgICAgICAgICAgICAgICAgIC8vIFcsIFgsIFksIFoKKworICAgIHsgTU9WX0NIX0xBWU9VVF9RVUFEUkFQSE9OSUMsICAgICAgIEFWX0NIX0xBWU9VVF9RVUFEICAgIH0sIC8vIEwsIFIsIFJscywgUnJzCisKKyAgICB7IE1PVl9DSF9MQVlPVVRfTVBFR180XzBfQSwgICAgICAgICBBVl9DSF9MQVlPVVRfNFBPSU5UMCB9LCAvLyBMLCBSLCBDLCBDcworICAgIHsgTU9WX0NIX0xBWU9VVF9NUEVHXzRfMF9CLCAgICAgICAgIEFWX0NIX0xBWU9VVF80UE9JTlQwIH0sIC8vIEMsIEwsIFIsIENzCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0FDM18zXzEsICAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzRQT0lOVDAgfSwgLy8gTCwgQywgUiwgQ3MKKworICAgIHsgTU9WX0NIX0xBWU9VVF9JVFVfMl8yLCAgICAgICAgICAgIEFWX0NIX0xBWU9VVF8yXzIgICAgIH0sIC8vIEwsIFIsIExzLCBScworCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0RWRF81LCAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzJfMSB8ICAgICAgLy8gTCwgUiwgTEZFLCBDcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xPV19GUkVRVUVOQ1kgIH0sCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0FDM18yXzFfMSwgICAgICAgICAgQVZfQ0hfTEFZT1VUXzJfMSB8ICAgICAgLy8gTCwgUiwgQ3MsIExGRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xPV19GUkVRVUVOQ1kgIH0sCisKKyAgICB7IE1PVl9DSF9MQVlPVVRfRFZEXzEwLCAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfM1BPSU5UMSB9LCAvLyBMLCBSLCBDLCBMRkUKKyAgICB7IE1PVl9DSF9MQVlPVVRfQUMzXzNfMF8xLCAgICAgICAgICBBVl9DSF9MQVlPVVRfM1BPSU5UMSB9LCAvLyBMLCBDLCBSLCBMRkUKKyAgICB7IE1PVl9DSF9MQVlPVVRfRFRTXzNfMSwgICAgICAgICAgICBBVl9DSF9MQVlPVVRfM1BPSU5UMSB9LCAvLyBDLCBMLCBSLCBMRkUKKyAgICB7IDAsIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgTW92Q2hhbm5lbExheW91dE1hcCBtb3ZfY2hfbGF5b3V0X21hcF81Y2hbXSA9IHsKKyAgICB7IE1PVl9DSF9MQVlPVVRfUEVOVEFHT05BTCwgICAgICAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLIH0sIC8vIEwsIFIsIFJscywgUnJzLCBDCisKKyAgICB7IE1PVl9DSF9MQVlPVVRfTVBFR181XzBfQSwgICAgICAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMCB9LCAgICAgIC8vIEwsIFIsIEMsICBMcywgUnMKKyAgICB7IE1PVl9DSF9MQVlPVVRfTVBFR181XzBfQiwgICAgICAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMCB9LCAgICAgIC8vIEwsIFIsIExzLCBScywgQworICAgIHsgTU9WX0NIX0xBWU9VVF9NUEVHXzVfMF9DLCAgICAgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwIH0sICAgICAgLy8gTCwgQywgUiwgIExzLCBScworICAgIHsgTU9WX0NIX0xBWU9VVF9NUEVHXzVfMF9ELCAgICAgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwIH0sICAgICAgLy8gQywgTCwgUiwgIExzLCBScworCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0RWRF82LCAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzJfMiB8ICAgICAgICAgICAvLyBMLCBSLCBMRkUsIExzLCBScworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xPV19GUkVRVUVOQ1kgfSwKKyAgICB7IE1PVl9DSF9MQVlPVVRfRFZEXzE4LCAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfMl8yIHwgICAgICAgICAgIC8vIEwsIFIsIExzLCBScywgTEZFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTE9XX0ZSRVFVRU5DWSB9LAorCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0RWRF8xMSwgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzRQT0lOVDEgfSwgICAgICAvLyBMLCBSLCBDLCBMRkUsIENzCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0FDM18zXzFfMSwgICAgICAgICAgQVZfQ0hfTEFZT1VUXzRQT0lOVDEgfSwgICAgICAvLyBMLCBDLCBSLCBDcywgIExGRQorICAgIHsgTU9WX0NIX0xBWU9VVF9EVFNfNF8xLCAgICAgICAgICAgIEFWX0NIX0xBWU9VVF80UE9JTlQxIH0sICAgICAgLy8gQywgTCwgUiwgQ3MsICBMRkUKKyAgICB7IDAsIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgTW92Q2hhbm5lbExheW91dE1hcCBtb3ZfY2hfbGF5b3V0X21hcF82Y2hbXSA9IHsKKyAgICB7IE1PVl9DSF9MQVlPVVRfSEVYQUdPTkFMLCAgICAgICAgICBBVl9DSF9MQVlPVVRfSEVYQUdPTkFMIH0sICAgICAgLy8gTCwgUiwgIFJscywgUnJzLCBDLCAgIENzCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0RUU182XzBfQywgICAgICAgICAgQVZfQ0hfTEFZT1VUX0hFWEFHT05BTCB9LCAgICAgIC8vIEMsIENzLCBMLCAgIFIsICAgUmxzLCBScnMKKworICAgIHsgTU9WX0NIX0xBWU9VVF9NUEVHXzVfMV9BLCAgICAgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxIH0sICAgICAgICAvLyBMLCBSLCBDLCAgTEZFLCBMcywgUnMKKyAgICB7IE1PVl9DSF9MQVlPVVRfTVBFR181XzFfQiwgICAgICAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMSB9LCAgICAgICAgLy8gTCwgUiwgTHMsIFJzLCAgQywgIExGRQorICAgIHsgTU9WX0NIX0xBWU9VVF9NUEVHXzVfMV9DLCAgICAgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxIH0sICAgICAgICAvLyBMLCBDLCBSLCAgTHMsICBScywgTEZFCisgICAgeyBNT1ZfQ0hfTEFZT1VUX01QRUdfNV8xX0QsICAgICAgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDEgfSwgICAgICAgIC8vIEMsIEwsIFIsICBMcywgIFJzLCBMRkUKKworICAgIHsgTU9WX0NIX0xBWU9VVF9BVURJT1VOSVRfNl8wLCAgICAgIEFWX0NIX0xBWU9VVF82UE9JTlQwIH0sICAgICAgICAvLyBMLCBSLCBMcywgUnMsIEMsICBDcworICAgIHsgTU9WX0NIX0xBWU9VVF9BQUNfNl8wLCAgICAgICAgICAgIEFWX0NIX0xBWU9VVF82UE9JTlQwIH0sICAgICAgICAvLyBDLCBMLCBSLCAgTHMsIFJzLCBDcworICAgIHsgTU9WX0NIX0xBWU9VVF9FQUMzXzZfMF9BLCAgICAgICAgIEFWX0NIX0xBWU9VVF82UE9JTlQwIH0sICAgICAgICAvLyBMLCBDLCBSLCAgTHMsIFJzLCBDcworCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0RUU182XzBfQSwgICAgICAgICAgQVZfQ0hfTEFZT1VUXzZQT0lOVDBfRlJPTlQgfSwgIC8vIExjLCBSYywgTCwgUiwgTHMsIFJzCisKKyAgICB7IE1PVl9DSF9MQVlPVVRfRFRTXzZfMF9CLCAgICAgICAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLIHwgICAgLy8gQywgTCwgUiwgUmxzLCBScnMsIFRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfVE9QX0NFTlRFUiB9LAorICAgIHsgMCwgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBNb3ZDaGFubmVsTGF5b3V0TWFwIG1vdl9jaF9sYXlvdXRfbWFwXzdjaFtdID0geworICAgIHsgTU9WX0NIX0xBWU9VVF9NUEVHXzZfMV9BLCAgICAgICAgICBBVl9DSF9MQVlPVVRfNlBPSU5UMSB9LCAgICAgICAgLy8gTCwgUiwgQywgTEZFLCBMcywgUnMsICBDcworICAgIHsgTU9WX0NIX0xBWU9VVF9BQUNfNl8xLCAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfNlBPSU5UMSB9LCAgICAgICAgLy8gQywgTCwgUiwgTHMsICBScywgQ3MsICBMRkUKKyAgICB7IE1PVl9DSF9MQVlPVVRfRUFDM182XzFfQSwgICAgICAgICAgQVZfQ0hfTEFZT1VUXzZQT0lOVDEgfSwgICAgICAgIC8vIEwsIEMsIFIsIExzLCAgUnMsIExGRSwgQ3MKKyAgICB7IE1PVl9DSF9MQVlPVVRfRFRTXzZfMV9ELCAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzZQT0lOVDEgfSwgICAgICAgIC8vIEMsIEwsIFIsIExzLCAgUnMsIExGRSwgQ3MKKworICAgIHsgTU9WX0NIX0xBWU9VVF9BVURJT1VOSVRfN18wLCAgICAgICBBVl9DSF9MQVlPVVRfN1BPSU5UMCB9LCAgICAgICAgLy8gTCwgUiwgTHMsIFJzLCBDLCAgUmxzLCBScnMKKyAgICB7IE1PVl9DSF9MQVlPVVRfQUFDXzdfMCwgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDAgfSwgICAgICAgIC8vIEMsIEwsIFIsICBMcywgUnMsIFJscywgUnJzCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0VBQzNfN18wX0EsICAgICAgICAgIEFWX0NIX0xBWU9VVF83UE9JTlQwIH0sICAgICAgICAvLyBMLCBDLCBSLCAgTHMsIFJzLCBSbHMsIFJycworCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0FVRElPVU5JVF83XzBfRlJPTlQsIEFWX0NIX0xBWU9VVF83UE9JTlQwX0ZST05UIH0sICAvLyBMLCAgUiwgTHMsIFJzLCBDLCBMYywgUmMKKyAgICB7IE1PVl9DSF9MQVlPVVRfRFRTXzdfMCwgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDBfRlJPTlQgfSwgIC8vIExjLCBDLCBSYywgTCwgIFIsIExzLCBScworCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0VBQzNfNl8xX0IsICAgICAgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxIHwgICAgICAgICAvLyBMLCBDLCBSLCBMcywgUnMsIExGRSwgVHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfVE9QX0NFTlRFUiB9LAorCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0VBQzNfNl8xX0MsICAgICAgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxIHwgICAgICAgICAvLyBMLCBDLCBSLCBMcywgUnMsIExGRSwgVmhjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX1RPUF9GUk9OVF9DRU5URVIgfSwKKworICAgIHsgTU9WX0NIX0xBWU9VVF9EVFNfNl8xX0EsICAgICAgICAgICBBVl9DSF9MQVlPVVRfNlBPSU5UMV9GUk9OVCB9LCAgLy8gTGMsIFJjLCBMLCBSLCBMcywgUnMsIExGRQorCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0RUU182XzFfQiwgICAgICAgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0sgfCAgICAvLyBDLCBMLCBSLCBSbHMsIFJycywgVHMsIExGRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9UT1BfQ0VOVEVSIH0sCisKKyAgICB7IE1PVl9DSF9MQVlPVVRfRFRTXzZfMV9DLCAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzZQT0lOVDFfQkFDSyB9LCAgIC8vIEMsIENzLCBMLCBSLCBSbHMsIFJycywgTEZFCisgICAgeyAwLCAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IE1vdkNoYW5uZWxMYXlvdXRNYXAgbW92X2NoX2xheW91dF9tYXBfOGNoW10gPSB7CisgICAgeyBNT1ZfQ0hfTEFZT1VUX09DVEFHT05BTCwgICAgICAgICAgIEFWX0NIX0xBWU9VVF9PQ1RBR09OQUwgfSwgICAgICAvLyBMLCBSLCBSbHMsIFJycywgQywgIENzLCAgTHMsICBScworICAgIHsgTU9WX0NIX0xBWU9VVF9BQUNfT0NUQUdPTkFMLCAgICAgICBBVl9DSF9MQVlPVVRfT0NUQUdPTkFMIH0sICAgICAgLy8gQywgTCwgUiwgICBMcywgIFJzLCBSbHMsIFJycywgQ3MKKworICAgIHsgTU9WX0NIX0xBWU9VVF9DVUJFLCAgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfUVVBRCAgICAgfCAgICAgICAgLy8gTCwgUiwgUmxzLCBScnMsIFZobCwgVmhyLCBSbHQsIFJydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9UT1BfRlJPTlRfTEVGVCAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9UT1BfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9UT1BfQkFDS19MRUZUICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9UT1BfQkFDS19SSUdIVCB9LAorCisgICAgeyBNT1ZfQ0hfTEFZT1VUX01QRUdfN18xX0EsICAgICAgICAgIEFWX0NIX0xBWU9VVF83UE9JTlQxX1dJREUgfSwgICAvLyBMLCAgUiwgIEMsICBMRkUsIExzLCBScywgIExjLCBSYworICAgIHsgTU9WX0NIX0xBWU9VVF9NUEVHXzdfMV9CLCAgICAgICAgICBBVl9DSF9MQVlPVVRfN1BPSU5UMV9XSURFIH0sICAgLy8gQywgIExjLCBSYywgTCwgICBSLCAgTHMsICBScywgTEZFCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0VNQUdJQ19ERUZBVUxUXzdfMSwgIEFWX0NIX0xBWU9VVF83UE9JTlQxX1dJREUgfSwgICAvLyBMLCAgUiwgIExzLCBScywgIEMsICBMRkUsIExjLCBSYworICAgIHsgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMV9CLCAgICAgICAgICBBVl9DSF9MQVlPVVRfN1BPSU5UMV9XSURFIH0sICAgLy8gTCwgIEMsICBSLCAgTHMsICBScywgTEZFLCBMYywgUmMKKyAgICB7IE1PVl9DSF9MQVlPVVRfRFRTXzdfMSwgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDFfV0lERSB9LCAgIC8vIExjLCBDLCAgUmMsIEwsICAgUiwgIExzLCAgUnMsIExGRQorCisgICAgeyBNT1ZfQ0hfTEFZT1VUX01QRUdfN18xX0MsICAgICAgICAgIEFWX0NIX0xBWU9VVF83UE9JTlQxIH0sICAgICAgICAvLyBMLCBSLCBDLCBMRkUsIExzLCBScywgIFJscywgUnJzCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0VBQzNfN18xX0EsICAgICAgICAgIEFWX0NIX0xBWU9VVF83UE9JTlQxIH0sICAgICAgICAvLyBMLCBDLCBSLCBMcywgIFJzLCBMRkUsIFJscywgUnJzCisKKyAgICB7IE1PVl9DSF9MQVlPVVRfU01QVEVfRFRWLCAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDEgfCAgICAgICAgIC8vIEwsIFIsIEMsIExGRSwgTHMsIFJzLCBMdCwgUnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFT19ET1dOTUlYIH0sCisKKyAgICB7IE1PVl9DSF9MQVlPVVRfRUFDM183XzFfQywgICAgICAgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDEgICAgICAgIHwgIC8vIEwsIEMsIFIsIExzLCBScywgTEZFLCBMc2QsIFJzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9TVVJST1VORF9ESVJFQ1RfTEVGVCAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9TVVJST1VORF9ESVJFQ1RfUklHSFQgfSwKKworICAgIHsgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMV9ELCAgICAgICAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMSB8ICAgICAgICAgLy8gTCwgQywgUiwgTHMsIFJzLCBMRkUsIEx3LCBSdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9XSURFX0xFRlQgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX1dJREVfUklHSFQgfSwKKworICAgIHsgTU9WX0NIX0xBWU9VVF9FQUMzXzdfMV9FLCAgICAgICAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMSB8ICAgICAgICAgLy8gTCwgQywgUiwgTHMsIFJzLCBMRkUsIFZobCwgVmhyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX1RPUF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfVE9QX0ZST05UX1JJR0hUIH0sCisKKyAgICB7IE1PVl9DSF9MQVlPVVRfRUFDM183XzFfRiwgICAgICAgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDEgfCAgICAgICAgIC8vIEwsIEMsIFIsIExzLCBScywgTEZFLCBDcywgVHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfQkFDS19DRU5URVIgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9UT1BfQ0VOVEVSIH0sCisKKyAgICB7IE1PVl9DSF9MQVlPVVRfRUFDM183XzFfRywgICAgICAgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDEgfCAgICAgICAgIC8vIEwsIEMsIFIsIExzLCBScywgTEZFLCBDcywgVmhjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0JBQ0tfQ0VOVEVSICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfVE9QX0ZST05UX0NFTlRFUiB9LAorCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0VBQzNfN18xX0gsICAgICAgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxIHwgICAgICAgICAvLyBMLCBDLCBSLCBMcywgUnMsIExGRSwgVHMsIFZoYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9UT1BfQ0VOVEVSICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX1RPUF9GUk9OVF9DRU5URVIgfSwKKworICAgIHsgTU9WX0NIX0xBWU9VVF9EVFNfOF8wX0EsICAgICAgICAgICBBVl9DSF9MQVlPVVRfMl8yICAgICAgICAgICB8ICAgLy8gTGMsIFJjLCBMLCBSLCBMcywgUnMsIFJscywgUnJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0JBQ0tfTEVGVCAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfQkFDS19SSUdIVCAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0ZST05UX1JJR0hUX09GX0NFTlRFUiB9LAorCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0RUU184XzBfQiwgICAgICAgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwICAgICAgICB8ICAvLyBMYywgQywgUmMsIEwsIFIsIExzLCBDcywgUnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfRlJPTlRfTEVGVF9PRl9DRU5URVIgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfQkFDS19DRU5URVIgfSwKKyAgICB7IDAsIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgTW92Q2hhbm5lbExheW91dE1hcCBtb3ZfY2hfbGF5b3V0X21hcF85Y2hbXSA9IHsKKyAgICB7IE1PVl9DSF9MQVlPVVRfRFRTXzhfMV9BLCAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzJfMiAgICAgICAgICAgIHwgLy8gTGMsIFJjLCBMLCBSLCBMcywgUnMsIFJscywgUnJzLCBMRkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfQkFDS19MRUZUICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfQkFDS19SSUdIVCAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfRlJPTlRfTEVGVF9PRl9DRU5URVIgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTE9XX0ZSRVFVRU5DWSB9LAorCisgICAgeyBNT1ZfQ0hfTEFZT1VUX0RUU184XzFfQiwgICAgICAgICAgIEFWX0NIX0xBWU9VVF83UE9JTlQxX1dJREUgICB8IC8vIExjLCBDLCBSYywgTCwgUiwgTHMsIENzLCBScywgTEZFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0JBQ0tfQ0VOVEVSIH0sCisgICAgeyAwLCAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IE1vdkNoYW5uZWxMYXlvdXRNYXAgKiBjb25zdCBtb3ZfY2hfbGF5b3V0X21hcFtdID0geworICAgIG1vdl9jaF9sYXlvdXRfbWFwX21pc2MsCisgICAgbW92X2NoX2xheW91dF9tYXBfMWNoLAorICAgIG1vdl9jaF9sYXlvdXRfbWFwXzJjaCwKKyAgICBtb3ZfY2hfbGF5b3V0X21hcF8zY2gsCisgICAgbW92X2NoX2xheW91dF9tYXBfNGNoLAorICAgIG1vdl9jaF9sYXlvdXRfbWFwXzVjaCwKKyAgICBtb3ZfY2hfbGF5b3V0X21hcF82Y2gsCisgICAgbW92X2NoX2xheW91dF9tYXBfN2NoLAorICAgIG1vdl9jaF9sYXlvdXRfbWFwXzhjaCwKKyAgICBtb3ZfY2hfbGF5b3V0X21hcF85Y2gsCit9OworCitzdGF0aWMgY29uc3QgZW51bSBNb3ZDaGFubmVsTGF5b3V0VGFnIG1vdl9jaF9sYXlvdXRzX2FhY1tdID0geworICAgIE1PVl9DSF9MQVlPVVRfTU9OTywKKyAgICBNT1ZfQ0hfTEFZT1VUX1NURVJFTywKKyAgICBNT1ZfQ0hfTEFZT1VUX0FDM18xXzBfMSwKKyAgICBNT1ZfQ0hfTEFZT1VUX01QRUdfM18wX0IsCisgICAgTU9WX0NIX0xBWU9VVF9JVFVfMl8xLAorICAgIE1PVl9DSF9MQVlPVVRfRFZEXzQsCisgICAgTU9WX0NIX0xBWU9VVF9RVUFEUkFQSE9OSUMsCisgICAgTU9WX0NIX0xBWU9VVF9NUEVHXzRfMF9CLAorICAgIE1PVl9DSF9MQVlPVVRfSVRVXzJfMiwKKyAgICBNT1ZfQ0hfTEFZT1VUX0FDM18yXzFfMSwKKyAgICBNT1ZfQ0hfTEFZT1VUX0RUU18zXzEsCisgICAgTU9WX0NIX0xBWU9VVF9NUEVHXzVfMF9ELAorICAgIE1PVl9DSF9MQVlPVVRfRFZEXzE4LAorICAgIE1PVl9DSF9MQVlPVVRfRFRTXzRfMSwKKyAgICBNT1ZfQ0hfTEFZT1VUX01QRUdfNV8xX0QsCisgICAgTU9WX0NIX0xBWU9VVF9BQUNfNl8wLAorICAgIE1PVl9DSF9MQVlPVVRfRFRTXzZfMF9BLAorICAgIE1PVl9DSF9MQVlPVVRfQUFDXzZfMSwKKyAgICBNT1ZfQ0hfTEFZT1VUX0FBQ183XzAsCisgICAgTU9WX0NIX0xBWU9VVF9EVFNfNl8xX0EsCisgICAgTU9WX0NIX0xBWU9VVF9BQUNfT0NUQUdPTkFMLAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR183XzFfQiwKKyAgICBNT1ZfQ0hfTEFZT1VUX0RUU184XzBfQSwKKyAgICAwLAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gTW92Q2hhbm5lbExheW91dFRhZyBtb3ZfY2hfbGF5b3V0c19hYzNbXSA9IHsKKyAgICBNT1ZfQ0hfTEFZT1VUX01PTk8sCisgICAgTU9WX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgTU9WX0NIX0xBWU9VVF9BQzNfMV8wXzEsCisgICAgTU9WX0NIX0xBWU9VVF9BQzNfM18wLAorICAgIE1PVl9DSF9MQVlPVVRfSVRVXzJfMSwKKyAgICBNT1ZfQ0hfTEFZT1VUX0RWRF80LAorICAgIE1PVl9DSF9MQVlPVVRfQUMzXzNfMSwKKyAgICBNT1ZfQ0hfTEFZT1VUX0lUVV8yXzIsCisgICAgTU9WX0NIX0xBWU9VVF9BQzNfMl8xXzEsCisgICAgTU9WX0NIX0xBWU9VVF9BQzNfM18wXzEsCisgICAgTU9WX0NIX0xBWU9VVF9NUEVHXzVfMF9DLAorICAgIE1PVl9DSF9MQVlPVVRfRFZEXzE4LAorICAgIE1PVl9DSF9MQVlPVVRfQUMzXzNfMV8xLAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR181XzFfQywKKyAgICAwLAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gTW92Q2hhbm5lbExheW91dFRhZyBtb3ZfY2hfbGF5b3V0c19hbGFjW10gPSB7CisgICAgTU9WX0NIX0xBWU9VVF9NT05PLAorICAgIE1PVl9DSF9MQVlPVVRfU1RFUkVPLAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR18zXzBfQiwKKyAgICBNT1ZfQ0hfTEFZT1VUX01QRUdfNF8wX0IsCisgICAgTU9WX0NIX0xBWU9VVF9NUEVHXzVfMF9ELAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR181XzFfRCwKKyAgICBNT1ZfQ0hfTEFZT1VUX0FBQ182XzEsCisgICAgTU9WX0NIX0xBWU9VVF9NUEVHXzdfMV9CLAorICAgIDAsCit9OworCitzdGF0aWMgY29uc3QgZW51bSBNb3ZDaGFubmVsTGF5b3V0VGFnIG1vdl9jaF9sYXlvdXRzX3dhdltdID0geworICAgIE1PVl9DSF9MQVlPVVRfTU9OTywKKyAgICBNT1ZfQ0hfTEFZT1VUX1NURVJFTywKKyAgICBNT1ZfQ0hfTEFZT1VUX01BVFJJWFNURVJFTywKKyAgICBNT1ZfQ0hfTEFZT1VUX01QRUdfM18wX0EsCisgICAgTU9WX0NIX0xBWU9VVF9RVUFEUkFQSE9OSUMsCisgICAgTU9WX0NIX0xBWU9VVF9NUEVHXzVfMF9BLAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR181XzFfQSwKKyAgICBNT1ZfQ0hfTEFZT1VUX01QRUdfNl8xX0EsCisgICAgTU9WX0NIX0xBWU9VVF9NUEVHXzdfMV9BLAorICAgIE1PVl9DSF9MQVlPVVRfTVBFR183XzFfQywKKyAgICBNT1ZfQ0hfTEFZT1VUX1NNUFRFX0RUViwKKyAgICAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQ7CisgICAgY29uc3QgZW51bSBNb3ZDaGFubmVsTGF5b3V0VGFnICpsYXlvdXRzOworfSBtb3ZfY29kZWNfY2hfbGF5b3V0c1tdID0geworICAgIHsgQVZfQ09ERUNfSURfQUFDLCAgICAgbW92X2NoX2xheW91dHNfYWFjICAgICAgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FDMywgICAgIG1vdl9jaF9sYXlvdXRzX2FjMyAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BTEFDLCAgICBtb3ZfY2hfbGF5b3V0c19hbGFjICAgICB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1U4LCAgICBtb3ZfY2hfbGF5b3V0c193YXYgICAgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TOCwgICAgbW92X2NoX2xheW91dHNfd2F2ICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsIG1vdl9jaF9sYXlvdXRzX3dhdiAgICB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MxNkJFLCBtb3ZfY2hfbGF5b3V0c193YXYgICAgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMjRMRSwgbW92X2NoX2xheW91dHNfd2F2ICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzI0QkUsIG1vdl9jaF9sYXlvdXRzX3dhdiAgICB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MzMkxFLCBtb3ZfY2hfbGF5b3V0c193YXYgICAgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMzJCRSwgbW92X2NoX2xheW91dHNfd2F2ICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjMyTEUsIG1vdl9jaF9sYXlvdXRzX3dhdiAgICB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX0YzMkJFLCBtb3ZfY2hfbGF5b3V0c193YXYgICAgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9GNjRMRSwgbW92X2NoX2xheW91dHNfd2F2ICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjY0QkUsIG1vdl9jaF9sYXlvdXRzX3dhdiAgICB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgfSwKK307CisKK3VpbnQ2NF90IGZmX21vdl9nZXRfY2hhbm5lbF9sYXlvdXQodWludDMyX3QgdGFnLCB1aW50MzJfdCBiaXRtYXApCit7CisgICAgaW50IGksIGNoYW5uZWxzOworICAgIGNvbnN0IHN0cnVjdCBNb3ZDaGFubmVsTGF5b3V0TWFwICpsYXlvdXRfbWFwOworCisgICAgLyogdXNlIGZmX21vdl9nZXRfY2hhbm5lbF9sYWJlbCgpIHRvIGJ1aWxkIGEgbGF5b3V0IGluc3RlYWQgKi8KKyAgICBpZiAodGFnID09IE1PVl9DSF9MQVlPVVRfVVNFX0RFU0NSSVBUSU9OUykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBoYW5kbGUgdGhlIHVzZSBvZiB0aGUgY2hhbm5lbCBiaXRtYXAgKi8KKyAgICBpZiAodGFnID09IE1PVl9DSF9MQVlPVVRfVVNFX0JJVE1BUCkKKyAgICAgICAgcmV0dXJuIGJpdG1hcCA8IDB4NDAwMDAgPyBiaXRtYXAgOiAwOworCisgICAgLyogZ2V0IHRoZSBsYXlvdXQgbWFwIGJhc2VkIG9uIHRoZSBjaGFubmVsIGNvdW50IGZvciB0aGUgc3BlY2lmaWVkIGxheW91dCB0YWcgKi8KKyAgICBjaGFubmVscyA9IHRhZyAmIDB4RkZGRjsKKyAgICBpZiAoY2hhbm5lbHMgPiA5KQorICAgICAgICBjaGFubmVscyA9IDA7CisgICAgbGF5b3V0X21hcCA9IG1vdl9jaF9sYXlvdXRfbWFwW2NoYW5uZWxzXTsKKworICAgIC8qIGZpbmQgdGhlIGNoYW5uZWwgbGF5b3V0IGZvciB0aGUgc3BlY2lmaWVkIGxheW91dCB0YWcgKi8KKyAgICBmb3IgKGkgPSAwOyBsYXlvdXRfbWFwW2ldLnRhZyAhPSAwOyBpKyspIHsKKyAgICAgICAgaWYgKGxheW91dF9tYXBbaV0udGFnID09IHRhZykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbGF5b3V0X21hcFtpXS5sYXlvdXQ7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBtb3ZfZ2V0X2NoYW5uZWxfbGFiZWwodWludDMyX3QgbGFiZWwpCit7CisgICAgaWYgKGxhYmVsID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChsYWJlbCA8PSAxOCkKKyAgICAgICAgcmV0dXJuIDFVIDw8IChsYWJlbCAtIDEpOworICAgIGlmIChsYWJlbCA9PSAzOCkKKyAgICAgICAgcmV0dXJuIEFWX0NIX1NURVJFT19MRUZUOworICAgIGlmIChsYWJlbCA9PSAzOSkKKyAgICAgICAgcmV0dXJuIEFWX0NIX1NURVJFT19SSUdIVDsKKyAgICByZXR1cm4gMDsKK30KKwordWludDMyX3QgZmZfbW92X2dldF9jaGFubmVsX2xheW91dF90YWcoZW51bSBBVkNvZGVjSUQgY29kZWNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpiaXRtYXApCit7CisgICAgaW50IGksIGo7CisgICAgdWludDMyX3QgdGFnID0gMDsKKyAgICBjb25zdCBlbnVtIE1vdkNoYW5uZWxMYXlvdXRUYWcgKmxheW91dHMgPSBOVUxMOworCisgICAgLyogZmluZCB0aGUgbGF5b3V0IGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgY29kZWMgKi8KKyAgICBmb3IgKGkgPSAwOyBtb3ZfY29kZWNfY2hfbGF5b3V0c1tpXS5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FOyBpKyspIHsKKyAgICAgICAgaWYgKG1vdl9jb2RlY19jaF9sYXlvdXRzW2ldLmNvZGVjX2lkID09IGNvZGVjX2lkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChtb3ZfY29kZWNfY2hfbGF5b3V0c1tpXS5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICBsYXlvdXRzID0gbW92X2NvZGVjX2NoX2xheW91dHNbaV0ubGF5b3V0czsKKworICAgIGlmIChsYXlvdXRzKSB7CisgICAgICAgIGludCBjaGFubmVsczsKKyAgICAgICAgY29uc3Qgc3RydWN0IE1vdkNoYW5uZWxMYXlvdXRNYXAgKmxheW91dF9tYXA7CisKKyAgICAgICAgLyogZ2V0IHRoZSBsYXlvdXQgbWFwIGJhc2VkIG9uIHRoZSBjaGFubmVsIGNvdW50ICovCisgICAgICAgIGNoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgaWYgKGNoYW5uZWxzID4gOSkKKyAgICAgICAgICAgIGNoYW5uZWxzID0gMDsKKyAgICAgICAgbGF5b3V0X21hcCA9IG1vdl9jaF9sYXlvdXRfbWFwW2NoYW5uZWxzXTsKKworICAgICAgICAvKiBmaW5kIHRoZSBsYXlvdXQgdGFnIGZvciB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgbGF5b3V0ICovCisgICAgICAgIGZvciAoaSA9IDA7IGxheW91dHNbaV0gIT0gMDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKGxheW91dHNbaV0gJiAweEZGRkYpICE9IGNoYW5uZWxzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZm9yIChqID0gMDsgbGF5b3V0X21hcFtqXS50YWcgIT0gMDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxheW91dF9tYXBbal0udGFnICAgID09IGxheW91dHNbaV0gJiYKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0X21hcFtqXS5sYXlvdXQgPT0gY2hhbm5lbF9sYXlvdXQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxheW91dF9tYXBbal0udGFnKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRhZyA9IGxheW91dHNbaV07CisgICAgfQorCisgICAgLyogaWYgbm8gdGFnIHdhcyBmb3VuZCwgdXNlIGNoYW5uZWwgYml0bWFwIGFzIGEgYmFja3VwIGlmIHBvc3NpYmxlICovCisgICAgaWYgKHRhZyA9PSAwICYmIGNoYW5uZWxfbGF5b3V0ID4gMCAmJiBjaGFubmVsX2xheW91dCA8IDB4NDAwMDApIHsKKyAgICAgICAgdGFnICAgICA9IE1PVl9DSF9MQVlPVVRfVVNFX0JJVE1BUDsKKyAgICAgICAgKmJpdG1hcCA9ICh1aW50MzJfdCljaGFubmVsX2xheW91dDsKKyAgICB9IGVsc2UKKyAgICAgICAgKmJpdG1hcCA9IDA7CisKKyAgICAvKiBUT0RPOiBzZXQgY2hhbm5lbCBkZXNjcmlwdGlvbnMgYXMgYSBzZWNvbmRhcnkgYmFja3VwICovCisKKyAgICByZXR1cm4gdGFnOworfQorCitpbnQgZmZfbW92X3JlYWRfY2hhbihBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplKQoreworICAgIHVpbnQzMl90IGxheW91dF90YWcsIGJpdG1hcCwgbnVtX2Rlc2NyLCBsYWJlbF9tYXNrOworICAgIGludCBpOworCisgICAgaWYgKHNpemUgPCAxMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBsYXlvdXRfdGFnID0gYXZpb19yYjMyKHBiKTsKKyAgICBiaXRtYXAgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICBudW1fZGVzY3IgID0gYXZpb19yYjMyKHBiKTsKKworICAgIGF2X2Rsb2cocywgImNoYW46IGxheW91dD0ldSBiaXRtYXA9JXUgbnVtX2Rlc2NyPSV1XG4iLAorICAgICAgICAgICAgbGF5b3V0X3RhZywgYml0bWFwLCBudW1fZGVzY3IpOworCisgICAgaWYgKHNpemUgPCAxMlVMTCArIG51bV9kZXNjciAqIDIwVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGxhYmVsX21hc2sgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZGVzY3I7IGkrKykgeworICAgICAgICB1aW50MzJfdCBsYWJlbDsKKyAgICAgICAgbGFiZWwgICAgID0gYXZpb19yYjMyKHBiKTsgICAgICAgICAgLy8gbUNoYW5uZWxMYWJlbAorICAgICAgICBhdmlvX3JiMzIocGIpOyAgICAgICAgICAgICAgICAgICAgICAvLyBtQ2hhbm5lbEZsYWdzCisgICAgICAgIGF2aW9fcmwzMihwYik7ICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db29yZGluYXRlc1swXQorICAgICAgICBhdmlvX3JsMzIocGIpOyAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29vcmRpbmF0ZXNbMV0KKyAgICAgICAgYXZpb19ybDMyKHBiKTsgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvb3JkaW5hdGVzWzJdCisgICAgICAgIHNpemUgLT0gMjA7CisgICAgICAgIGlmIChsYXlvdXRfdGFnID09IDApIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1hc2tfaW5jciA9IG1vdl9nZXRfY2hhbm5lbF9sYWJlbChsYWJlbCk7CisgICAgICAgICAgICBpZiAobWFza19pbmNyID09IDApIHsKKyAgICAgICAgICAgICAgICBsYWJlbF9tYXNrID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhYmVsX21hc2sgfD0gbWFza19pbmNyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChsYXlvdXRfdGFnID09IDApIHsKKyAgICAgICAgaWYgKGxhYmVsX21hc2spCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gbGFiZWxfbWFzazsKKyAgICB9IGVsc2UKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IGZmX21vdl9nZXRfY2hhbm5lbF9sYXlvdXQobGF5b3V0X3RhZywgYml0bWFwKTsKKyAgICBhdmlvX3NraXAocGIsIHNpemUgLSAxMik7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tb3ZfY2hhbi5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21vdl9jaGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyODM0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tb3ZfY2hhbi5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSnVzdGluIFJ1Z2dsZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBtb3YgJ2NoYW4nIHRhZyByZWFkaW5nL3dyaXRpbmcuCisgKiBAYXV0aG9yIEp1c3RpbiBSdWdnbGVzCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9NT1ZfQ0hBTl9ICisjZGVmaW5lIEFWRk9STUFUX01PVl9DSEFOX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworLyoqCisgKiBHZXQgdGhlIGNoYW5uZWwgbGF5b3V0IGZvciB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgbGF5b3V0IHRhZy4KKyAqCisgKiBAcGFyYW1baW5dICB0YWcgICAgIGNoYW5uZWwgbGF5b3V0IHRhZworICogQHBhcmFtW291dF0gYml0bWFwICBjaGFubmVsIGJpdG1hcCAob25seSB1c2VkIGlmIG5lZWRlZCkKKyAqIEByZXR1cm4gICAgICAgICAgICAgY2hhbm5lbCBsYXlvdXQKKyAqLwordWludDY0X3QgZmZfbW92X2dldF9jaGFubmVsX2xheW91dCh1aW50MzJfdCB0YWcsIHVpbnQzMl90IGJpdG1hcCk7CisKKy8qKgorICogR2V0IHRoZSBjaGFubmVsIGxheW91dCB0YWcgZm9yIHRoZSBzcGVjaWZpZWQgY29kZWMgaWQgYW5kIGNoYW5uZWwgbGF5b3V0LgorICogSWYgdGhlIGxheW91dCB0YWcgd2FzIG5vdCBmb3VuZCwgdXNlIGEgY2hhbm5lbCBiaXRtYXAgaWYgcG9zc2libGUuCisgKgorICogQHBhcmFtW2luXSAgY29kZWNfaWQgICAgICAgIGNvZGVjIGlkCisgKiBAcGFyYW1baW5dICBjaGFubmVsX2xheW91dCAgY2hhbm5lbCBsYXlvdXQKKyAqIEBwYXJhbVtvdXRdIGJpdG1hcCAgICAgICAgICBjaGFubmVsIGJpdG1hcAorICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgbGF5b3V0IHRhZworICovCit1aW50MzJfdCBmZl9tb3ZfZ2V0X2NoYW5uZWxfbGF5b3V0X3RhZyhlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmJpdG1hcCk7CisKKy8qKgorICogUmVhZCAnY2hhbicgdGFnIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gcyAgICAgQVZGb3JtYXRDb250ZXh0CisgKiBAcGFyYW0gcGIgICAgQVZJT0NvbnRleHQKKyAqIEBwYXJhbSBzdCAgICBUaGUgc3RyZWFtIHRvIHNldCBjb2RlYyB2YWx1ZXMgZm9yCisgKiBAcGFyYW0gc2l6ZSAgUmVtYWluaW5nIHNpemUgaW4gdGhlICdjaGFuJyB0YWcKKyAqIEByZXR1cm4gICAgICAwIGlmIG9rLCBvciBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgZmZfbW92X3JlYWRfY2hhbihBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplKTsKKworI2VuZGlmIC8qIEFWRk9STUFUX01PVl9DSEFOX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tb3ZlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tb3ZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGU4ODNjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21vdmVuYy5jCkBAIC0wLDAgKzEsNTI1NSBAQAorLyoKKyAqIE1PViwgM0dQLCBNUDQgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaG9tYXMgUmFpdmlvCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgR2lsZGFzIEJhemluIDxnYmF6aW4gYXQgdmlkZW9sYW4gZG90IG9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwOSBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlIGRvdCBjb3VkdXJpZXIgYXQgZ21haWwgZG90IGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJtb3ZlbmMuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyaWZmLmgiCisjaW5jbHVkZSAiYXZpby5oIgorI2luY2x1ZGUgImlzb20uaCIKKyNpbmNsdWRlICJhdmMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2FjM19wYXJzZXIuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9wdXRfYml0cy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdmMxX2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvcmF3LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lY29kZS5oIgorI2luY2x1ZGUgImhldmMuaCIKKyNpbmNsdWRlICJydHBlbmMuaCIKKyNpbmNsdWRlICJtb3ZfY2hhbi5oIgorCisjdW5kZWYgTkRFQlVHCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAibW92ZmxhZ3MiLCAiTU9WIG11eGVyIGZsYWdzIiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSAwfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJtb3ZmbGFncyIgfSwKKyAgICB7ICJydHBoaW50IiwgIkFkZCBSVFAgaGludCB0cmFja3MiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NT1ZfRkxBR19SVFBfSElOVH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCisgICAgeyAibW9vdl9zaXplIiwgIm1heGltdW0gbW9vdiBzaXplIHNvIGl0IGNhbiBiZSBwbGFjZWQgYXQgdGhlIGJlZ2luIiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgcmVzZXJ2ZWRfbW9vdl9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgMCB9LAorICAgIHsgImVtcHR5X21vb3YiLCAiTWFrZSB0aGUgaW5pdGlhbCBtb292IGF0b20gZW1wdHkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NT1ZfRkxBR19FTVBUWV9NT09WfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJtb3ZmbGFncyIgfSwKKyAgICB7ICJmcmFnX2tleWZyYW1lIiwgIkZyYWdtZW50IGF0IHZpZGVvIGtleWZyYW1lcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX0ZSQUdfS0VZRlJBTUV9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgIm1vdmZsYWdzIiB9LAorICAgIHsgInNlcGFyYXRlX21vb2YiLCAiV3JpdGUgc2VwYXJhdGUgbW9vZi9tZGF0IGF0b21zIGZvciBlYWNoIHRyYWNrIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfTU9WX0ZMQUdfU0VQQVJBVEVfTU9PRn0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCisgICAgeyAiZnJhZ19jdXN0b20iLCAiRmx1c2ggZnJhZ21lbnRzIG9uIGNhbGxlciByZXF1ZXN0cyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX0ZSQUdfQ1VTVE9NfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJtb3ZmbGFncyIgfSwKKyAgICB7ICJpc21sIiwgIkNyZWF0ZSBhIGxpdmUgc21vb3RoIHN0cmVhbWluZyBmZWVkIChmb3IgcHVzaGluZyB0byBhIHB1Ymxpc2hpbmcgcG9pbnQpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfTU9WX0ZMQUdfSVNNTH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCisgICAgeyAiZmFzdHN0YXJ0IiwgIlJ1biBhIHNlY29uZCBwYXNzIHRvIHB1dCB0aGUgaW5kZXggKG1vb3YgYXRvbSkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX0ZBU1RTVEFSVH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCisgICAgeyAib21pdF90ZmhkX29mZnNldCIsICJPbWl0IHRoZSBiYXNlIGRhdGEgb2Zmc2V0IGluIHRmaGQgYXRvbXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NT1ZfRkxBR19PTUlUX1RGSERfT0ZGU0VUfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJtb3ZmbGFncyIgfSwKKyAgICB7ICJkaXNhYmxlX2NocGwiLCAiRGlzYWJsZSBOZXJvIGNoYXB0ZXIgYXRvbSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX0RJU0FCTEVfQ0hQTH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCisgICAgeyAiZGVmYXVsdF9iYXNlX21vb2YiLCAiU2V0IHRoZSBkZWZhdWx0LWJhc2UtaXMtbW9vZiBmbGFnIGluIHRmaGQgYXRvbXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NT1ZfRkxBR19ERUZBVUxUX0JBU0VfTU9PRn0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCisgICAgeyAiZGFzaCIsICJXcml0ZSBEQVNIIGNvbXBhdGlibGUgZnJhZ21lbnRlZCBNUDQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NT1ZfRkxBR19EQVNIfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJtb3ZmbGFncyIgfSwKKyAgICB7ICJmcmFnX2Rpc2NvbnQiLCAiU2lnbmFsIHRoYXQgdGhlIG5leHQgZnJhZ21lbnQgaXMgZGlzY29udGludW91cyBmcm9tIGVhcmxpZXIgb25lcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX0ZSQUdfRElTQ09OVH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCisgICAgRkZfUlRQX0ZMQUdfT1BUUyhNT1ZNdXhDb250ZXh0LCBydHBfZmxhZ3MpLAorICAgIHsgInNraXBfaW9kcyIsICJTa2lwIHdyaXRpbmcgaW9kcyBhdG9tLiIsIG9mZnNldG9mKE1PVk11eENvbnRleHQsIGlvZHNfc2tpcCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgMCwgMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU19LAorICAgIHsgImlvZHNfYXVkaW9fcHJvZmlsZSIsICJpb2RzIGF1ZGlvIHByb2ZpbGUgYXRvbS4iLCBvZmZzZXRvZihNT1ZNdXhDb250ZXh0LCBpb2RzX2F1ZGlvX3Byb2ZpbGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgMjU1LCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTX0sCisgICAgeyAiaW9kc192aWRlb19wcm9maWxlIiwgImlvZHMgdmlkZW8gcHJvZmlsZSBhdG9tLiIsIG9mZnNldG9mKE1PVk11eENvbnRleHQsIGlvZHNfdmlkZW9fcHJvZmlsZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCAyNTUsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKyAgICB7ICJmcmFnX2R1cmF0aW9uIiwgIk1heGltdW0gZnJhZ21lbnQgZHVyYXRpb24iLCBvZmZzZXRvZihNT1ZNdXhDb250ZXh0LCBtYXhfZnJhZ21lbnRfZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKyAgICB7ICJtaW5fZnJhZ19kdXJhdGlvbiIsICJNaW5pbXVtIGZyYWdtZW50IGR1cmF0aW9uIiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgbWluX2ZyYWdtZW50X2R1cmF0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTX0sCisgICAgeyAiZnJhZ19zaXplIiwgIk1heGltdW0gZnJhZ21lbnQgc2l6ZSIsIG9mZnNldG9mKE1PVk11eENvbnRleHQsIG1heF9mcmFnbWVudF9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTX0sCisgICAgeyAiaXNtX2xvb2thaGVhZCIsICJOdW1iZXIgb2YgbG9va2FoZWFkIGVudHJpZXMgZm9yIElTTSBmaWxlcyIsIG9mZnNldG9mKE1PVk11eENvbnRleHQsIGlzbV9sb29rYWhlYWQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKyAgICB7ICJ2aWRlb190cmFja190aW1lc2NhbGUiLCAic2V0IHRpbWVzY2FsZSBvZiBhbGwgdmlkZW8gdHJhY2tzIiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgdmlkZW9fdHJhY2tfdGltZXNjYWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTX0sCisgICAgeyAiYnJhbmQiLCAgICAiT3ZlcnJpZGUgbWFqb3IgYnJhbmQiLCBvZmZzZXRvZihNT1ZNdXhDb250ZXh0LCBtYWpvcl9icmFuZCksICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAuZmxhZ3MgPSBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgInVzZV9lZGl0bGlzdCIsICJ1c2UgZWRpdCBsaXN0Iiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgdXNlX2VkaXRsaXN0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIDEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKyAgICB7ICJmcmFnbWVudF9pbmRleCIsICJGcmFnbWVudCBudW1iZXIgb2YgdGhlIG5leHQgZnJhZ21lbnQiLCBvZmZzZXRvZihNT1ZNdXhDb250ZXh0LCBmcmFnbWVudHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKyAgICB7IE5VTEwgfSwKK307CisKKyNkZWZpbmUgTU9WX0NMQVNTKGZsYXZvcilcCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmbGF2b3IgIyMgX211eGVyX2NsYXNzID0ge1wKKyAgICAuY2xhc3NfbmFtZSA9ICNmbGF2b3IgIiBtdXhlciIsXAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsXAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucyxcCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsXAorfTsKKworc3RhdGljIGludCBnZXRfbW9vdl9zaXplKEFWRm9ybWF0Q29udGV4dCAqcyk7CisKK3N0YXRpYyBpbnQgdXRmOGxlbihjb25zdCB1aW50OF90ICpiKQoreworICAgIGludCBsZW4gPSAwOworICAgIGludCB2YWw7CisgICAgd2hpbGUgKCpiKSB7CisgICAgICAgIEdFVF9VVEY4KHZhbCwgKmIrKywgcmV0dXJuIC0xOykKKyAgICAgICAgbGVuKys7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKKy8vRklYTUUgc3VwcG9ydCA2NCBiaXQgdmFyaWFudCB3aXRoIHdpZGUgcGxhY2Vob2xkZXJzCitzdGF0aWMgaW50NjRfdCB1cGRhdGVfc2l6ZShBVklPQ29udGV4dCAqcGIsIGludDY0X3QgcG9zKQoreworICAgIGludDY0X3QgY3VycG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3NlZWsocGIsIHBvcywgU0VFS19TRVQpOworICAgIGF2aW9fd2IzMihwYiwgY3VycG9zIC0gcG9zKTsgLyogcmV3cml0ZSBzaXplICovCisgICAgYXZpb19zZWVrKHBiLCBjdXJwb3MsIFNFRUtfU0VUKTsKKworICAgIHJldHVybiBjdXJwb3MgLSBwb3M7Cit9CisKK3N0YXRpYyBpbnQgY282NF9yZXF1aXJlZChjb25zdCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaWYgKHRyYWNrLT5lbnRyeSA+IDAgJiYgdHJhY2stPmNsdXN0ZXJbdHJhY2stPmVudHJ5IC0gMV0ucG9zICsgdHJhY2stPmRhdGFfb2Zmc2V0ID4gVUlOVDMyX01BWCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIENodW5rIG9mZnNldCBhdG9tICovCitzdGF0aWMgaW50IG1vdl93cml0ZV9zdGNvX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbW9kZTY0ID0gY282NF9yZXF1aXJlZCh0cmFjayk7IC8vIHVzZSAzMiBiaXQgc2l6ZSB2YXJpYW50IGlmIHBvc3NpYmxlCisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgKi8KKyAgICBpZiAobW9kZTY0KQorICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJjbzY0Iik7CisgICAgZWxzZQorICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJzdGNvIik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogdmVyc2lvbiAmIGZsYWdzICovCisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+Y2h1bmtDb3VudCk7IC8qIGVudHJ5IGNvdW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IHRyYWNrLT5lbnRyeTsgaSsrKSB7CisgICAgICAgIGlmICghdHJhY2stPmNsdXN0ZXJbaV0uY2h1bmtOdW0pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKG1vZGU2NCA9PSAxKQorICAgICAgICAgICAgYXZpb193YjY0KHBiLCB0cmFjay0+Y2x1c3RlcltpXS5wb3MgKyB0cmFjay0+ZGF0YV9vZmZzZXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5jbHVzdGVyW2ldLnBvcyArIHRyYWNrLT5kYXRhX29mZnNldCk7CisgICAgfQorICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworLyogU2FtcGxlIHNpemUgYXRvbSAqLworc3RhdGljIGludCBtb3Zfd3JpdGVfc3Rzel90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50IGVxdWFsQ2h1bmtzID0gMTsKKyAgICBpbnQgaSwgaiwgZW50cmllcyA9IDAsIHRzdCA9IC0xLCBvbGR0c3QgPSAtMTsKKworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAic3RzeiIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHZlcnNpb24gJiBmbGFncyAqLworCisgICAgZm9yIChpID0gMDsgaSA8IHRyYWNrLT5lbnRyeTsgaSsrKSB7CisgICAgICAgIHRzdCA9IHRyYWNrLT5jbHVzdGVyW2ldLnNpemUgLyB0cmFjay0+Y2x1c3RlcltpXS5lbnRyaWVzOworICAgICAgICBpZiAob2xkdHN0ICE9IC0xICYmIHRzdCAhPSBvbGR0c3QpCisgICAgICAgICAgICBlcXVhbENodW5rcyA9IDA7CisgICAgICAgIG9sZHRzdCA9IHRzdDsKKyAgICAgICAgZW50cmllcyArPSB0cmFjay0+Y2x1c3RlcltpXS5lbnRyaWVzOworICAgIH0KKyAgICBpZiAoZXF1YWxDaHVua3MgJiYgdHJhY2stPmVudHJ5KSB7CisgICAgICAgIGludCBzU2l6ZSA9IHRyYWNrLT5lbnRyeSA/IHRyYWNrLT5jbHVzdGVyWzBdLnNpemUgLyB0cmFjay0+Y2x1c3RlclswXS5lbnRyaWVzIDogMDsKKyAgICAgICAgc1NpemUgPSBGRk1BWCgxLCBzU2l6ZSk7IC8vIGFkcGNtIG1vbm8gY2FzZSBjb3VsZCBtYWtlIHNTaXplID09IDAKKyAgICAgICAgYXZpb193YjMyKHBiLCBzU2l6ZSk7IC8vIHNhbXBsZSBzaXplCisgICAgICAgIGF2aW9fd2IzMihwYiwgZW50cmllcyk7IC8vIHNhbXBsZSBjb3VudAorICAgIH0gZWxzZSB7CisgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7IC8vIHNhbXBsZSBzaXplCisgICAgICAgIGF2aW9fd2IzMihwYiwgZW50cmllcyk7IC8vIHNhbXBsZSBjb3VudAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHJhY2stPmVudHJ5OyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0cmFjay0+Y2x1c3RlcltpXS5lbnRyaWVzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5jbHVzdGVyW2ldLnNpemUgLworICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Y2x1c3RlcltpXS5lbnRyaWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKKy8qIFNhbXBsZSB0byBjaHVuayBhdG9tICovCitzdGF0aWMgaW50IG1vdl93cml0ZV9zdHNjX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQgaW5kZXggPSAwLCBvbGR2YWwgPSAtMSwgaTsKKyAgICBpbnQ2NF90IGVudHJ5UG9zLCBjdXJwb3M7CisKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInN0c2MiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvLyB2ZXJzaW9uICYgZmxhZ3MKKyAgICBlbnRyeVBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+Y2h1bmtDb3VudCk7IC8vIGVudHJ5IGNvdW50CisgICAgZm9yIChpID0gMDsgaSA8IHRyYWNrLT5lbnRyeTsgaSsrKSB7CisgICAgICAgIGlmIChvbGR2YWwgIT0gdHJhY2stPmNsdXN0ZXJbaV0uc2FtcGxlc19pbl9jaHVuayAmJiB0cmFjay0+Y2x1c3RlcltpXS5jaHVua051bSkgeworICAgICAgICAgICAgYXZpb193YjMyKHBiLCB0cmFjay0+Y2x1c3RlcltpXS5jaHVua051bSk7IC8vIGZpcnN0IGNodW5rCisgICAgICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5jbHVzdGVyW2ldLnNhbXBsZXNfaW5fY2h1bmspOyAvLyBzYW1wbGVzIHBlciBjaHVuaworICAgICAgICAgICAgYXZpb193YjMyKHBiLCAweDEpOyAvLyBzYW1wbGUgZGVzY3JpcHRpb24gaW5kZXgKKyAgICAgICAgICAgIG9sZHZhbCA9IHRyYWNrLT5jbHVzdGVyW2ldLnNhbXBsZXNfaW5fY2h1bms7CisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisgICAgfQorICAgIGN1cnBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb19zZWVrKHBiLCBlbnRyeVBvcywgU0VFS19TRVQpOworICAgIGF2aW9fd2IzMihwYiwgaW5kZXgpOyAvLyByZXdyaXRlIHNpemUKKyAgICBhdmlvX3NlZWsocGIsIGN1cnBvcywgU0VFS19TRVQpOworCisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCisvKiBTeW5jIHNhbXBsZSBhdG9tICovCitzdGF0aWMgaW50IG1vdl93cml0ZV9zdHNzX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaywgdWludDMyX3QgZmxhZykKK3sKKyAgICBpbnQ2NF90IGN1cnBvcywgZW50cnlQb3M7CisgICAgaW50IGksIGluZGV4ID0gMDsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLy8gc2l6ZQorICAgIGZmaW9fd2ZvdXJjYyhwYiwgZmxhZyA9PSBNT1ZfU1lOQ19TQU1QTEUgPyAic3RzcyIgOiAic3RwcyIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8vIHZlcnNpb24gJiBmbGFncworICAgIGVudHJ5UG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5lbnRyeSk7IC8vIGVudHJ5IGNvdW50CisgICAgZm9yIChpID0gMDsgaSA8IHRyYWNrLT5lbnRyeTsgaSsrKSB7CisgICAgICAgIGlmICh0cmFjay0+Y2x1c3RlcltpXS5mbGFncyAmIGZsYWcpIHsKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgaSArIDEpOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBjdXJwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fc2VlayhwYiwgZW50cnlQb3MsIFNFRUtfU0VUKTsKKyAgICBhdmlvX3diMzIocGIsIGluZGV4KTsgLy8gcmV3cml0ZSBzaXplCisgICAgYXZpb19zZWVrKHBiLCBjdXJwb3MsIFNFRUtfU0VUKTsKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2Ftcl90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgYXZpb193YjMyKHBiLCAweDExKTsgLyogc2l6ZSAqLworICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01PVikgZmZpb193Zm91cmNjKHBiLCAic2FtciIpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiZGFtciIpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkZGTVAiKTsKKyAgICBhdmlvX3c4KHBiLCAwKTsgLyogZGVjb2RlciB2ZXJzaW9uICovCisKKyAgICBhdmlvX3diMTYocGIsIDB4ODFGRik7IC8qIE1vZGUgc2V0IChhbGwgbW9kZXMgZm9yIEFNUl9OQikgKi8KKyAgICBhdmlvX3c4KHBiLCAweDAwKTsgLyogTW9kZSBjaGFuZ2UgcGVyaW9kIChubyByZXN0cmljdGlvbikgKi8KKyAgICBhdmlvX3c4KHBiLCAweDAxKTsgLyogRnJhbWVzIHBlciBzYW1wbGUgKi8KKyAgICByZXR1cm4gMHgxMTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfYWMzX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiYzsKKyAgICBQdXRCaXRDb250ZXh0IHBiYzsKKyAgICB1aW50OF90IGJ1ZlszXTsKKyAgICBpbnQgZnNjb2QsIGJzaWQsIGJzbW9kLCBhY21vZCwgbGZlb24sIGZybXNpemVjb2Q7CisKKyAgICBpZiAodHJhY2stPnZvc19sZW4gPCA3KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBhdmlvX3diMzIocGIsIDExKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJkYWMzIik7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYmMsIHRyYWNrLT52b3NfZGF0YSArIDQsICh0cmFjay0+dm9zX2xlbiAtIDQpICogOCk7CisgICAgZnNjb2QgICAgICA9IGdldF9iaXRzKCZnYmMsIDIpOworICAgIGZybXNpemVjb2QgPSBnZXRfYml0cygmZ2JjLCA2KTsKKyAgICBic2lkICAgICAgID0gZ2V0X2JpdHMoJmdiYywgNSk7CisgICAgYnNtb2QgICAgICA9IGdldF9iaXRzKCZnYmMsIDMpOworICAgIGFjbW9kICAgICAgPSBnZXRfYml0cygmZ2JjLCAzKTsKKyAgICBpZiAoYWNtb2QgPT0gMikgeworICAgICAgICBza2lwX2JpdHMoJmdiYywgMik7IC8vIGRzdXJtb2QKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGFjbW9kICYgMSkgJiYgYWNtb2QgIT0gMSkKKyAgICAgICAgICAgIHNraXBfYml0cygmZ2JjLCAyKTsgLy8gY21peGxldgorICAgICAgICBpZiAoYWNtb2QgJiA0KQorICAgICAgICAgICAgc2tpcF9iaXRzKCZnYmMsIDIpOyAvLyBzdXJtaXhsZXYKKyAgICB9CisgICAgbGZlb24gPSBnZXRfYml0czEoJmdiYyk7CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYmMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIHB1dF9iaXRzKCZwYmMsIDIsIGZzY29kKTsKKyAgICBwdXRfYml0cygmcGJjLCA1LCBic2lkKTsKKyAgICBwdXRfYml0cygmcGJjLCAzLCBic21vZCk7CisgICAgcHV0X2JpdHMoJnBiYywgMywgYWNtb2QpOworICAgIHB1dF9iaXRzKCZwYmMsIDEsIGxmZW9uKTsKKyAgICBwdXRfYml0cygmcGJjLCA1LCBmcm1zaXplY29kID4+IDEpOyAvLyBiaXRfcmF0ZV9jb2RlCisgICAgcHV0X2JpdHMoJnBiYywgNSwgMCk7IC8vIHJlc2VydmVkCisKKyAgICBmbHVzaF9wdXRfYml0cygmcGJjKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBidWYsIHNpemVvZihidWYpKTsKKworICAgIHJldHVybiAxMTsKK30KKworc3RydWN0IGVhYzNfaW5mbyB7CisgICAgQVZQYWNrZXQgcGt0OworICAgIHVpbnQ4X3QgZWMzX2RvbmU7CisgICAgdWludDhfdCBudW1fYmxvY2tzOworCisgICAgLyogTGF5b3V0IG9mIHRoZSBFQzNTcGVjaWZpY0JveCAqLworICAgIC8qIG1heGltdW0gYml0cmF0ZSAqLworICAgIHVpbnQxNl90IGRhdGFfcmF0ZTsKKyAgICAvKiBudW1iZXIgb2YgaW5kZXBlbmRlbnQgc3Vic3RyZWFtcyAqLworICAgIHVpbnQ4X3QgIG51bV9pbmRfc3ViOworICAgIHN0cnVjdCB7CisgICAgICAgIC8qIHNhbXBsZSByYXRlIGNvZGUgKHNlZSBmZl9hYzNfc2FtcGxlX3JhdGVfdGFiKSAyIGJpdHMgKi8KKyAgICAgICAgdWludDhfdCBmc2NvZDsKKyAgICAgICAgLyogYml0IHN0cmVhbSBpZGVudGlmaWNhdGlvbiA1IGJpdHMgKi8KKyAgICAgICAgdWludDhfdCBic2lkOworICAgICAgICAvKiBvbmUgYml0IHJlc2VydmVkICovCisgICAgICAgIC8qIGF1ZGlvIHNlcnZpY2UgbWl4aW5nIChub3Qgc3VwcG9ydGVkIHlldCkgMSBiaXQgKi8KKyAgICAgICAgLyogYml0IHN0cmVhbSBtb2RlIDMgYml0cyAqLworICAgICAgICB1aW50OF90IGJzbW9kOworICAgICAgICAvKiBhdWRpbyBjb2RpbmcgbW9kZSAzIGJpdHMgKi8KKyAgICAgICAgdWludDhfdCBhY21vZDsKKyAgICAgICAgLyogc3ViIHdvb2ZlciBvbiAxIGJpdCAqLworICAgICAgICB1aW50OF90IGxmZW9uOworICAgICAgICAvKiAzIGJpdHMgcmVzZXJ2ZWQgKi8KKyAgICAgICAgLyogbnVtYmVyIG9mIGRlcGVuZGVudCBzdWJzdHJlYW1zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnN0cmVhbSA0IGJpdHMgKi8KKyAgICAgICAgdWludDhfdCBudW1fZGVwX3N1YjsKKyAgICAgICAgLyogY2hhbm5lbCBsb2NhdGlvbnMgb2YgdGhlIGRlcGVuZGVudCBzdWJzdHJlYW0ocyksIGlmIGFueSwgOSBiaXRzICovCisgICAgICAgIHVpbnQxNl90IGNoYW5fbG9jOworICAgICAgICAvKiBpZiB0aGVyZSBpcyBubyBkZXBlbmRlbnQgc3Vic3RyZWFtLCB0aGVuIG9uZSBiaXQgcmVzZXJ2ZWQgaW5zdGVhZCAqLworICAgIH0gc3Vic3RyZWFtWzFdOyAvKiBUT0RPOiBzdXBwb3J0IDggaW5kZXBlbmRlbnQgc3Vic3RyZWFtcyAqLworfTsKKworc3RhdGljIGludCBoYW5kbGVfZWFjMyhNT1ZNdXhDb250ZXh0ICptb3YsIEFWUGFja2V0ICpwa3QsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiYzsKKyAgICBBQzNIZWFkZXJJbmZvIHRtcCwgKmhkciA9ICZ0bXA7CisgICAgc3RydWN0IGVhYzNfaW5mbyAqaW5mbzsKKyAgICBpbnQgbnVtX2Jsb2NrczsKKworICAgIGlmICghdHJhY2stPmVhYzNfcHJpdiAmJiAhKHRyYWNrLT5lYWMzX3ByaXYgPSBhdl9tYWxsb2N6KHNpemVvZigqaW5mbykpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpbmZvID0gdHJhY2stPmVhYzNfcHJpdjsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiYywgcGt0LT5kYXRhLCBwa3QtPnNpemUgKiA4KTsKKyAgICBpZiAoYXZwcml2X2FjM19wYXJzZV9oZWFkZXIyKCZnYmMsICZoZHIpIDwgMCkgeworICAgICAgICAvKiBkcm9wIHRoZSBwYWNrZXRzIHVudGlsIHdlIHNlZSBhIGdvb2Qgb25lICovCisgICAgICAgIGlmICghdHJhY2stPmVudHJ5KSB7CisgICAgICAgICAgICBhdl9sb2cobW92LCBBVl9MT0dfV0FSTklORywgIkRyb3BwaW5nIGludmFsaWQgcGFja2V0IGZyb20gc3RhcnQgb2YgdGhlIHN0cmVhbVxuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpbmZvLT5kYXRhX3JhdGUgPSBGRk1BWChpbmZvLT5kYXRhX3JhdGUsIGhkci0+Yml0X3JhdGUgLyAxMDAwKTsKKyAgICBudW1fYmxvY2tzID0gaGRyLT5udW1fYmxvY2tzOworCisgICAgaWYgKCFpbmZvLT5lYzNfZG9uZSkgeworICAgICAgICAvKiBBQy0zIHN1YnN0cmVhbSBtdXN0IGJlIHRoZSBmaXJzdCBvbmUgKi8KKyAgICAgICAgaWYgKGhkci0+Yml0c3RyZWFtX2lkIDw9IDEwICYmIGhkci0+c3Vic3RyZWFtaWQgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAgICAgLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBjYXNlLCBnaXZlbiB0aGF0IG91ciBBQy0zIHBhcnNlcgorICAgICAgICAgKiBjb25jYXRlbmF0ZXMgZGVwZW5kZW50IGZyYW1lcyB0byB0aGVpciBpbmRlcGVuZGVudCBwYXJlbnQgKi8KKyAgICAgICAgaWYgKGhkci0+ZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfSU5ERVBFTkRFTlQpIHsKKyAgICAgICAgICAgIC8qIHN1YnN0cmVhbSBpZHMgbXVzdCBiZSBpbmNyZW1lbnRhbCAqLworICAgICAgICAgICAgaWYgKGhkci0+c3Vic3RyZWFtaWQgPiBpbmZvLT5udW1faW5kX3N1YiArIDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICAgICAgICAgaWYgKGhkci0+c3Vic3RyZWFtaWQgPT0gaW5mby0+bnVtX2luZF9zdWIgKyAxKSB7CisgICAgICAgICAgICAgICAgLy9pbmZvLT5udW1faW5kX3N1YisrOworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZSh0cmFjay0+ZW5jLCAiTXVsdGlwbGUgaW5kZXBlbmRlbnQgc3Vic3RyZWFtcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaGRyLT5zdWJzdHJlYW1pZCA8IGluZm8tPm51bV9pbmRfc3ViIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGhkci0+c3Vic3RyZWFtaWQgPT0gMCAmJiBpbmZvLT5zdWJzdHJlYW1bMF0uYnNpZCkgeworICAgICAgICAgICAgICAgIGluZm8tPmVjM19kb25lID0gMTsKKyAgICAgICAgICAgICAgICBnb3RvIGNvbmNhdGVuYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogZmlsbCB0aGUgaW5mbyBuZWVkZWQgZm9yIHRoZSAiZGVjMyIgYXRvbSAqLworICAgICAgICBpbmZvLT5zdWJzdHJlYW1baGRyLT5zdWJzdHJlYW1pZF0uZnNjb2QgPSBoZHItPnNyX2NvZGU7CisgICAgICAgIGluZm8tPnN1YnN0cmVhbVtoZHItPnN1YnN0cmVhbWlkXS5ic2lkICA9IGhkci0+Yml0c3RyZWFtX2lkOworICAgICAgICBpbmZvLT5zdWJzdHJlYW1baGRyLT5zdWJzdHJlYW1pZF0uYnNtb2QgPSBoZHItPmJpdHN0cmVhbV9tb2RlOworICAgICAgICBpbmZvLT5zdWJzdHJlYW1baGRyLT5zdWJzdHJlYW1pZF0uYWNtb2QgPSBoZHItPmNoYW5uZWxfbW9kZTsKKyAgICAgICAgaW5mby0+c3Vic3RyZWFtW2hkci0+c3Vic3RyZWFtaWRdLmxmZW9uID0gaGRyLT5sZmVfb247CisKKyAgICAgICAgLyogUGFyc2UgZGVwZW5kZW50IHN1YnN0cmVhbShzKSwgaWYgYW55ICovCisgICAgICAgIGlmIChwa3QtPnNpemUgIT0gaGRyLT5mcmFtZV9zaXplKSB7CisgICAgICAgICAgICBpbnQgY3VtdWxfc2l6ZSA9IGhkci0+ZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgIGludCBwYXJlbnQgPSBoZHItPnN1YnN0cmVhbWlkOworCisgICAgICAgICAgICB3aGlsZSAoY3VtdWxfc2l6ZSAhPSBwa3QtPnNpemUpIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYmMsIHBrdC0+ZGF0YSArIGN1bXVsX3NpemUsIChwa3QtPnNpemUgLSBjdW11bF9zaXplKSAqIDgpOworICAgICAgICAgICAgICAgIGlmIChhdnByaXZfYWMzX3BhcnNlX2hlYWRlcjIoJmdiYywgJmhkcikgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBpZiAoaGRyLT5mcmFtZV90eXBlICE9IEVBQzNfRlJBTUVfVFlQRV9ERVBFTkRFTlQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgY3VtdWxfc2l6ZSArPSBoZHItPmZyYW1lX3NpemU7CisgICAgICAgICAgICAgICAgaW5mby0+c3Vic3RyZWFtW3BhcmVudF0ubnVtX2RlcF9zdWIrKzsKKworICAgICAgICAgICAgICAgIC8qIGhlYWRlciBpcyBwYXJzZWQgdXAgdG8gbGZlb24sIGJ1dCBjdXN0b20gY2hhbm5lbCBtYXAgbWF5IGJlIG5lZWRlZCAqLworICAgICAgICAgICAgICAgIC8qIHNraXAgYnNpZCAqLworICAgICAgICAgICAgICAgIHNraXBfYml0cygmZ2JjLCA1KTsKKyAgICAgICAgICAgICAgICAvKiBza2lwIHZvbHVtZSBjb250cm9sIHBhcmFtcyAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaGRyLT5jaGFubmVsX21vZGUgPyAxIDogMik7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmdiYywgNSk7IC8vIHNraXAgZGlhbG9nIG5vcm1hbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmZ2JjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZnYmMsIDgpOyAvLyBza2lwIGNvbXByZXNzaW9uIGdhaW4gd29yZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgZGVwZW5kZW50IHN0cmVhbSBjaGFubmVsIG1hcCwgaWYgZXhpc3RzICovCisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmZ2JjKSkKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c3Vic3RyZWFtW3BhcmVudF0uY2hhbl9sb2MgfD0gKGdldF9iaXRzKCZnYmMsIDE2KSA+PiA1KSAmIDB4MWY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpbmZvLT5zdWJzdHJlYW1bcGFyZW50XS5jaGFuX2xvYyB8PSBoZHItPmNoYW5uZWxfbW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworY29uY2F0ZW5hdGU6CisgICAgaWYgKCFpbmZvLT5udW1fYmxvY2tzICYmIG51bV9ibG9ja3MgPT0gNikKKyAgICAgICAgcmV0dXJuIHBrdC0+c2l6ZTsKKyAgICBlbHNlIGlmIChpbmZvLT5udW1fYmxvY2tzICsgbnVtX2Jsb2NrcyA+IDYpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKCFpbmZvLT5udW1fYmxvY2tzKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIGlmICgocmV0ID0gYXZfY29weV9wYWNrZXQoJmluZm8tPnBrdCwgcGt0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaW5mby0+bnVtX2Jsb2NrcyA9IG51bV9ibG9ja3M7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIGlmICgocmV0ID0gYXZfZ3Jvd19wYWNrZXQoJmluZm8tPnBrdCwgcGt0LT5zaXplKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgbWVtY3B5KGluZm8tPnBrdC5kYXRhICsgaW5mby0+cGt0LnNpemUgLSBwa3QtPnNpemUsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICAgICAgaW5mby0+bnVtX2Jsb2NrcyArPSBudW1fYmxvY2tzOworICAgICAgICBpbmZvLT5wa3QuZHVyYXRpb24gKz0gcGt0LT5kdXJhdGlvbjsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9jb3B5X3BhY2tldF9zaWRlX2RhdGEoJmluZm8tPnBrdCwgcGt0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKGluZm8tPm51bV9ibG9ja3MgIT0gNikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICBpZiAoKHJldCA9IGF2X2NvcHlfcGFja2V0KHBrdCwgJmluZm8tPnBrdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZpbmZvLT5wa3QpOworICAgICAgICBpbmZvLT5udW1fYmxvY2tzID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcGt0LT5zaXplOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9lYWMzX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBQdXRCaXRDb250ZXh0IHBiYzsKKyAgICB1aW50OF90ICpidWY7CisgICAgc3RydWN0IGVhYzNfaW5mbyAqaW5mbzsKKyAgICBpbnQgc2l6ZSwgaTsKKworICAgIGlmICghdHJhY2stPmVhYzNfcHJpdikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGluZm8gPSB0cmFjay0+ZWFjM19wcml2OworICAgIHNpemUgPSAyICsgNCAqIChpbmZvLT5udW1faW5kX3N1YiArIDEpOworICAgIGJ1ZiA9IGF2X21hbGxvYyhzaXplKTsKKyAgICBpZiAoIWJ1ZikgeworICAgICAgICBzaXplID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYmMsIGJ1Ziwgc2l6ZSk7CisgICAgcHV0X2JpdHMoJnBiYywgMTMsIGluZm8tPmRhdGFfcmF0ZSk7CisgICAgcHV0X2JpdHMoJnBiYywgIDMsIGluZm8tPm51bV9pbmRfc3ViKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IGluZm8tPm51bV9pbmRfc3ViOyBpKyspIHsKKyAgICAgICAgcHV0X2JpdHMoJnBiYywgMiwgaW5mby0+c3Vic3RyZWFtW2ldLmZzY29kKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiYywgNSwgaW5mby0+c3Vic3RyZWFtW2ldLmJzaWQpOworICAgICAgICBwdXRfYml0cygmcGJjLCAxLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgcHV0X2JpdHMoJnBiYywgMSwgMCk7IC8qIGFzdmMgKi8KKyAgICAgICAgcHV0X2JpdHMoJnBiYywgMywgaW5mby0+c3Vic3RyZWFtW2ldLmJzbW9kKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiYywgMywgaW5mby0+c3Vic3RyZWFtW2ldLmFjbW9kKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiYywgMSwgaW5mby0+c3Vic3RyZWFtW2ldLmxmZW9uKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiYywgNSwgMCk7IC8qIHJlc2VydmVkICovCisgICAgICAgIHB1dF9iaXRzKCZwYmMsIDQsIGluZm8tPnN1YnN0cmVhbVtpXS5udW1fZGVwX3N1Yik7CisgICAgICAgIGlmICghaW5mby0+c3Vic3RyZWFtW2ldLm51bV9kZXBfc3ViKSB7CisgICAgICAgICAgICBwdXRfYml0cygmcGJjLCAxLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYmMsIDksIGluZm8tPnN1YnN0cmVhbVtpXS5jaGFuX2xvYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZmx1c2hfcHV0X2JpdHMoJnBiYyk7CisKKyAgICBhdmlvX3diMzIocGIsIHNpemUgKyA4KTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJkZWMzIik7CisgICAgYXZpb193cml0ZShwYiwgYnVmLCBzaXplKTsKKworICAgIGF2X2ZyZWUoYnVmKTsKKworZW5kOgorICAgIGF2X2ZyZWVfcGFja2V0KCZpbmZvLT5wa3QpOworICAgIGF2X2ZyZWVwKCZ0cmFjay0+ZWFjM19wcml2KTsKKworICAgIHJldHVybiBzaXplOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGV4dHJhZGF0YSAiYXMgaXMiLgorICogRXh0cmFkYXRhIG11c3QgYmUgZm9ybWF0dGVkIGxpa2UgYSB2YWxpZCBhdG9tICh3aXRoIHNpemUgYW5kIHRhZykuCisgKi8KK3N0YXRpYyBpbnQgbW92X3dyaXRlX2V4dHJhZGF0YV90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgYXZpb193cml0ZShwYiwgdHJhY2stPmVuYy0+ZXh0cmFkYXRhLCB0cmFjay0+ZW5jLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgcmV0dXJuIHRyYWNrLT5lbmMtPmV4dHJhZGF0YV9zaXplOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9lbmRhX3RhZyhBVklPQ29udGV4dCAqcGIpCit7CisgICAgYXZpb193YjMyKHBiLCAxMCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAiZW5kYSIpOworICAgIGF2aW9fd2IxNihwYiwgMSk7IC8qIGxpdHRsZSBlbmRpYW4gKi8KKyAgICByZXR1cm4gMTA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2VuZGFfdGFnX2JlKEFWSU9Db250ZXh0ICpwYikKK3sKKyAgYXZpb193YjMyKHBiLCAxMCk7CisgIGZmaW9fd2ZvdXJjYyhwYiwgImVuZGEiKTsKKyAgYXZpb193YjE2KHBiLCAwKTsgLyogYmlnIGVuZGlhbiAqLworICByZXR1cm4gMTA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9kZXNjcihBVklPQ29udGV4dCAqcGIsIGludCB0YWcsIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIGludCBpID0gMzsKKyAgICBhdmlvX3c4KHBiLCB0YWcpOworICAgIGZvciAoOyBpID4gMDsgaS0tKQorICAgICAgICBhdmlvX3c4KHBiLCAoc2l6ZSA+PiAoNyAqIGkpKSB8IDB4ODApOworICAgIGF2aW9fdzgocGIsIHNpemUgJiAweDdGKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVfYXZnX2JpdHJhdGUoTU9WVHJhY2sgKnRyYWNrKQoreworICAgIHVpbnQ2NF90IHNpemUgPSAwOworICAgIGludCBpOworICAgIGlmICghdHJhY2stPnRyYWNrX2R1cmF0aW9uKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdHJhY2stPmVudHJ5OyBpKyspCisgICAgICAgIHNpemUgKz0gdHJhY2stPmNsdXN0ZXJbaV0uc2l6ZTsKKyAgICByZXR1cm4gc2l6ZSAqIDggKiB0cmFjay0+dGltZXNjYWxlIC8gdHJhY2stPnRyYWNrX2R1cmF0aW9uOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9lc2RzX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykgLy8gQmFzaWMKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgaW50IGRlY29kZXJfc3BlY2lmaWNfaW5mb19sZW4gPSB0cmFjay0+dm9zX2xlbiA/IDUgKyB0cmFjay0+dm9zX2xlbiA6IDA7CisgICAgdW5zaWduZWQgYXZnX2JpdHJhdGU7CisKKyAgICBhdmlvX3diMzIocGIsIDApOyAvLyBzaXplCisgICAgZmZpb193Zm91cmNjKHBiLCAiZXNkcyIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8vIFZlcnNpb24KKworICAgIC8vIEVTIGRlc2NyaXB0b3IKKyAgICBwdXRfZGVzY3IocGIsIDB4MDMsIDMgKyA1KzEzICsgZGVjb2Rlcl9zcGVjaWZpY19pbmZvX2xlbiArIDUrMSk7CisgICAgYXZpb193YjE2KHBiLCB0cmFjay0+dHJhY2tfaWQpOworICAgIGF2aW9fdzgocGIsIDB4MDApOyAvLyBmbGFncyAoPSBubyBmbGFncykKKworICAgIC8vIERlY29kZXJDb25maWcgZGVzY3JpcHRvcgorICAgIHB1dF9kZXNjcihwYiwgMHgwNCwgMTMgKyBkZWNvZGVyX3NwZWNpZmljX2luZm9fbGVuKTsKKworICAgIC8vIE9iamVjdCB0eXBlIGluZGljYXRpb24KKyAgICBpZiAoKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMiB8fAorICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzKSAmJgorICAgICAgICB0cmFjay0+ZW5jLT5zYW1wbGVfcmF0ZSA+IDI0MDAwKQorICAgICAgICBhdmlvX3c4KHBiLCAweDZCKTsgLy8gMTExNzItMworICAgIGVsc2UKKyAgICAgICAgYXZpb193OChwYiwgZmZfY29kZWNfZ2V0X3RhZyhmZl9tcDRfb2JqX3R5cGUsIHRyYWNrLT5lbmMtPmNvZGVjX2lkKSk7CisKKyAgICAvLyB0aGUgZm9sbG93aW5nIGZpZWxkcyBpcyBtYWRlIG9mIDYgYml0cyB0byBpZGVudGlmeSB0aGUgc3RyZWFtdHlwZSAoNCBmb3IgdmlkZW8sIDUgZm9yIGF1ZGlvKQorICAgIC8vIHBsdXMgMSBiaXQgdG8gaW5kaWNhdGUgdXBzdHJlYW0gYW5kIDEgYml0IHNldCB0byAxIChyZXNlcnZlZCkKKyAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZEX1NVQlRJVExFKQorICAgICAgICBhdmlvX3c4KHBiLCAoMHgzOCA8PCAyKSB8IDEpOyAvLyBmbGFncyAoPSBOZXJvU3VicGljU3RyZWFtKQorICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICBhdmlvX3c4KHBiLCAweDE1KTsgLy8gZmxhZ3MgKD0gQXVkaW9zdHJlYW0pCisgICAgZWxzZQorICAgICAgICBhdmlvX3c4KHBiLCAweDExKTsgLy8gZmxhZ3MgKD0gVmlzdWFsc3RyZWFtKQorCisgICAgYXZpb193YjI0KHBiLCB0cmFjay0+ZW5jLT5yY19idWZmZXJfc2l6ZSA+PiAzKTsgLy8gQnVmZmVyc2l6ZSBEQgorCisgICAgYXZnX2JpdHJhdGUgPSBjb21wdXRlX2F2Z19iaXRyYXRlKHRyYWNrKTsKKyAgICAvLyBtYXhiaXRyYXRlIChGSVhNRSBzaG91bGQgYmUgbWF4IHJhdGUgaW4gYW55IDEgc2VjIHdpbmRvdykKKyAgICBhdmlvX3diMzIocGIsIEZGTUFYMyh0cmFjay0+ZW5jLT5iaXRfcmF0ZSwgdHJhY2stPmVuYy0+cmNfbWF4X3JhdGUsIGF2Z19iaXRyYXRlKSk7CisgICAgYXZpb193YjMyKHBiLCBhdmdfYml0cmF0ZSk7CisKKyAgICBpZiAodHJhY2stPnZvc19sZW4pIHsKKyAgICAgICAgLy8gRGVjb2RlclNwZWNpZmljIGluZm8gZGVzY3JpcHRvcgorICAgICAgICBwdXRfZGVzY3IocGIsIDB4MDUsIHRyYWNrLT52b3NfbGVuKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgdHJhY2stPnZvc19kYXRhLCB0cmFjay0+dm9zX2xlbik7CisgICAgfQorCisgICAgLy8gU0wgZGVzY3JpcHRvcgorICAgIHB1dF9kZXNjcihwYiwgMHgwNiwgMSk7CisgICAgYXZpb193OChwYiwgMHgwMik7CisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IG1vdl9wY21fbGVfZ3QxNihlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCkKK3sKKyAgICByZXR1cm4gY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MyNExFIHx8CisgICAgICAgICAgIGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMzJMRSB8fAorICAgICAgICAgICBjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fRjMyTEUgfHwKKyAgICAgICAgICAgY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX0Y2NExFOworfQorCitzdGF0aWMgaW50IG1vdl9wY21fYmVfZ3QxNihlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCkKK3sKKyAgICByZXR1cm4gY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MyNEJFIHx8CisgICAgICAgICAgIGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMzJCRSB8fAorICAgICAgICAgICBjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fRjMyQkUgfHwKKyAgICAgICAgICAgY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX0Y2NEJFOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9tc190YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50IHJldDsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBhdmlvX3dsMzIocGIsIHRyYWNrLT50YWcpOyAvLyBzdG9yZSBpdCBieXRlc3dhcHBlZAorICAgIHRyYWNrLT5lbmMtPmNvZGVjX3RhZyA9IGF2X2Jzd2FwMTYodHJhY2stPnRhZyA+PiAxNik7CisgICAgaWYgKChyZXQgPSBmZl9wdXRfd2F2X2hlYWRlcihwYiwgdHJhY2stPmVuYywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3dmZXhfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludCByZXQ7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAid2ZleCIpOworICAgIGlmICgocmV0ID0gZmZfcHV0X3dhdl9oZWFkZXIocGIsIHRyYWNrLT5lbmMsIEZGX1BVVF9XQVZfSEVBREVSX0ZPUkNFX1dBVkVGT1JNQVRFWCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2NoYW5fdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIHVpbnQzMl90IGxheW91dF90YWcsIGJpdG1hcDsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICBsYXlvdXRfdGFnID0gZmZfbW92X2dldF9jaGFubmVsX2xheW91dF90YWcodHJhY2stPmVuYy0+Y29kZWNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmNoYW5uZWxfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYml0bWFwKTsKKyAgICBpZiAoIWxheW91dF90YWcpIHsKKyAgICAgICAgYXZfbG9nKHRyYWNrLT5lbmMsIEFWX0xPR19XQVJOSU5HLCAibm90IHdyaXRpbmcgJ2NoYW4nIHRhZyBkdWUgdG8gIgorICAgICAgICAgICAgICAgImxhY2sgb2YgY2hhbm5lbCBpbmZvcm1hdGlvblxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICh0cmFjay0+bXVsdGljaGFubmVsX2FzX21vbm8pCisgICAgICAgIHJldHVybiAwOworCisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgIC8vIFNpemUKKyAgICBmZmlvX3dmb3VyY2MocGIsICJjaGFuIik7ICAgLy8gVHlwZQorICAgIGF2aW9fdzgocGIsIDApOyAgICAgICAgICAgICAvLyBWZXJzaW9uCisgICAgYXZpb193YjI0KHBiLCAwKTsgICAgICAgICAgIC8vIEZsYWdzCisgICAgYXZpb193YjMyKHBiLCBsYXlvdXRfdGFnKTsgIC8vIG1DaGFubmVsTGF5b3V0VGFnCisgICAgYXZpb193YjMyKHBiLCBiaXRtYXApOyAgICAgIC8vIG1DaGFubmVsQml0bWFwCisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgIC8vIG1OdW1iZXJDaGFubmVsRGVzY3JpcHRpb25zCisKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3dhdmVfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgICAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAid2F2ZSIpOworCisgICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1FETTIpIHsKKyAgICBhdmlvX3diMzIocGIsIDEyKTsgICAgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImZybWEiKTsKKyAgICBhdmlvX3dsMzIocGIsIHRyYWNrLT50YWcpOworICAgIH0KKworICAgIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKKyAgICAgICAgLyogdXNlbGVzcyBhdG9tIG5lZWRlZCBieSBtcGxheWVyLCBpcG9kLCBub3QgbmVlZGVkIGJ5IHF1aWNrdGltZSAqLworICAgICAgICBhdmlvX3diMzIocGIsIDEyKTsgLyogc2l6ZSAqLworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJtcDRhIik7CisgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgICAgIG1vdl93cml0ZV9lc2RzX3RhZyhwYiwgdHJhY2spOworICAgIH0gZWxzZSBpZiAobW92X3BjbV9sZV9ndDE2KHRyYWNrLT5lbmMtPmNvZGVjX2lkKSkgIHsKKyAgICAgIG1vdl93cml0ZV9lbmRhX3RhZyhwYik7CisgICAgfSBlbHNlIGlmIChtb3ZfcGNtX2JlX2d0MTYodHJhY2stPmVuYy0+Y29kZWNfaWQpKSAgeworICAgICAgbW92X3dyaXRlX2VuZGFfdGFnX2JlKHBiKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikgeworICAgICAgICBtb3Zfd3JpdGVfYW1yX3RhZyhwYiwgdHJhY2spOworICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKSB7CisgICAgICAgIG1vdl93cml0ZV9hYzNfdGFnKHBiLCB0cmFjayk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9FQUMzKSB7CisgICAgICAgIG1vdl93cml0ZV9lYWMzX3RhZyhwYiwgdHJhY2spOworICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUxBQyB8fAorICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUURNMikgeworICAgICAgICBtb3Zfd3JpdGVfZXh0cmFkYXRhX3RhZyhwYiwgdHJhY2spOworICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fTVMgfHwKKyAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYpIHsKKyAgICAgICAgbW92X3dyaXRlX21zX3RhZyhwYiwgdHJhY2spOworICAgIH0KKworICAgIGF2aW9fd2IzMihwYiwgOCk7ICAgICAvKiBzaXplICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgIC8qIG51bGwgdGFnICovCisKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2R2YzFfc3RydWN0cyhNT1ZUcmFjayAqdHJhY2ssIHVpbnQ4X3QgKmJ1ZikKK3sKKyAgICB1aW50OF90ICp1bmVzY2FwZWQ7CisgICAgY29uc3QgdWludDhfdCAqc3RhcnQsICpuZXh0LCAqZW5kID0gdHJhY2stPnZvc19kYXRhICsgdHJhY2stPnZvc19sZW47CisgICAgaW50IHVuZXNjYXBlZF9zaXplLCBzZXFfZm91bmQgPSAwOworICAgIGludCBsZXZlbCA9IDAsIGludGVybGFjZSA9IDA7CisgICAgaW50IHBhY2tldF9zZXEgICA9IHRyYWNrLT52YzFfaW5mby5wYWNrZXRfc2VxOworICAgIGludCBwYWNrZXRfZW50cnkgPSB0cmFjay0+dmMxX2luZm8ucGFja2V0X2VudHJ5OworICAgIGludCBzbGljZXMgICAgICAgPSB0cmFjay0+dmMxX2luZm8uc2xpY2VzOworICAgIFB1dEJpdENvbnRleHQgcGJjOworCisgICAgaWYgKHRyYWNrLT5zdGFydF9kdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgLyogTm8gcGFja2V0cyB3cml0dGVuIHlldCwgdmMxX2luZm8gaXNuJ3QgYXV0aG9yaXRhdGl2ZSB5ZXQuICovCisgICAgICAgIC8qIEFzc3VtZSBpbmxpbmUgc2VxdWVuY2UgYW5kIGVudHJ5IGhlYWRlcnMuIFRoaXMgd2lsbCBiZQorICAgICAgICAgKiBvdmVyd3JpdHRlbiBhdCB0aGUgZW5kIGlmIHRoZSBmaWxlIGlzIHNlZWthYmxlLiAqLworICAgICAgICBwYWNrZXRfc2VxID0gcGFja2V0X2VudHJ5ID0gMTsKKyAgICB9CisKKyAgICB1bmVzY2FwZWQgPSBhdl9tYWxsb2N6KHRyYWNrLT52b3NfbGVuICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCF1bmVzY2FwZWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3RhcnQgPSBmaW5kX25leHRfbWFya2VyKHRyYWNrLT52b3NfZGF0YSwgZW5kKTsKKyAgICBmb3IgKG5leHQgPSBzdGFydDsgbmV4dCA8IGVuZDsgc3RhcnQgPSBuZXh0KSB7CisgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgICAgIGludCBzaXplOworICAgICAgICBuZXh0ID0gZmluZF9uZXh0X21hcmtlcihzdGFydCArIDQsIGVuZCk7CisgICAgICAgIHNpemUgPSBuZXh0IC0gc3RhcnQgLSA0OworICAgICAgICBpZiAoc2l6ZSA8PSAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHVuZXNjYXBlZF9zaXplID0gdmMxX3VuZXNjYXBlX2J1ZmZlcihzdGFydCArIDQsIHNpemUsIHVuZXNjYXBlZCk7CisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCB1bmVzY2FwZWQsIDggKiB1bmVzY2FwZWRfc2l6ZSk7CisgICAgICAgIGlmIChBVl9SQjMyKHN0YXJ0KSA9PSBWQzFfQ09ERV9TRVFIRFIpIHsKKyAgICAgICAgICAgIGludCBwcm9maWxlID0gZ2V0X2JpdHMoJmdiLCAyKTsKKyAgICAgICAgICAgIGlmIChwcm9maWxlICE9IFBST0ZJTEVfQURWQU5DRUQpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHVuZXNjYXBlZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcV9mb3VuZCA9IDE7CisgICAgICAgICAgICBsZXZlbCA9IGdldF9iaXRzKCZnYiwgMyk7CisgICAgICAgICAgICAvKiBjaHJvbWFmb3JtYXQsIGZybXJ0cV9wb3N0cHJvYywgYml0cnRxX3Bvc3Rwcm9jLCBwb3N0cHJvY2ZsYWcsCisgICAgICAgICAgICAgKiB3aWR0aCwgaGVpZ2h0ICovCisgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDIgKyAzICsgNSArIDEgKyAyKjEyKTsKKyAgICAgICAgICAgIHNraXBfYml0cygmZ2IsIDEpOyAvKiBicm9hZGNhc3QgKi8KKyAgICAgICAgICAgIGludGVybGFjZSA9IGdldF9iaXRzMSgmZ2IpOworICAgICAgICAgICAgc2tpcF9iaXRzKCZnYiwgNCk7IC8qIHRmY250cmZsYWcsIGZpbnRlcnBmbGFnLCByZXNlcnZlZCwgcHNmICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzZXFfZm91bmQpIHsKKyAgICAgICAgYXZfZnJlZSh1bmVzY2FwZWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGluaXRfcHV0X2JpdHMoJnBiYywgYnVmLCA3KTsKKyAgICAvKiBWQzFEZWNTcGVjU3RydWMgKi8KKyAgICBwdXRfYml0cygmcGJjLCA0LCAxMik7IC8qIHByb2ZpbGUgLSBhZHZhbmNlZCAqLworICAgIHB1dF9iaXRzKCZwYmMsIDMsIGxldmVsKTsKKyAgICBwdXRfYml0cygmcGJjLCAxLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAvKiBWQzFBZHZEZWNTcGVjU3RydWMgKi8KKyAgICBwdXRfYml0cygmcGJjLCAzLCBsZXZlbCk7CisgICAgcHV0X2JpdHMoJnBiYywgMSwgMCk7IC8qIGNiciAqLworICAgIHB1dF9iaXRzKCZwYmMsIDYsIDApOyAvKiByZXNlcnZlZCAqLworICAgIHB1dF9iaXRzKCZwYmMsIDEsICFpbnRlcmxhY2UpOyAvKiBubyBpbnRlcmxhY2UgKi8KKyAgICBwdXRfYml0cygmcGJjLCAxLCAhcGFja2V0X3NlcSk7IC8qIG5vIG11bHRpcGxlIHNlcSAqLworICAgIHB1dF9iaXRzKCZwYmMsIDEsICFwYWNrZXRfZW50cnkpOyAvKiBubyBtdWx0aXBsZSBlbnRyeSAqLworICAgIHB1dF9iaXRzKCZwYmMsIDEsICFzbGljZXMpOyAvKiBubyBzbGljZSBjb2RlICovCisgICAgcHV0X2JpdHMoJnBiYywgMSwgMCk7IC8qIG5vIGJmcmFtZSAqLworICAgIHB1dF9iaXRzKCZwYmMsIDEsIDApOyAvKiByZXNlcnZlZCAqLworCisgICAgLyogZnJhbWVyYXRlICovCisgICAgaWYgKHRyYWNrLT5zdC0+YXZnX2ZyYW1lX3JhdGUubnVtID4gMCAmJiB0cmFjay0+c3QtPmF2Z19mcmFtZV9yYXRlLmRlbiA+IDApCisgICAgICAgIHB1dF9iaXRzMzIoJnBiYywgdHJhY2stPnN0LT5hdmdfZnJhbWVfcmF0ZS5udW0gLyB0cmFjay0+c3QtPmF2Z19mcmFtZV9yYXRlLmRlbik7CisgICAgZWxzZQorICAgICAgICBwdXRfYml0czMyKCZwYmMsIDB4ZmZmZmZmZmYpOworCisgICAgZmx1c2hfcHV0X2JpdHMoJnBiYyk7CisKKyAgICBhdl9mcmVlKHVuZXNjYXBlZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfZHZjMV90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgdWludDhfdCBidWZbN10gPSB7IDAgfTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBtb3Zfd3JpdGVfZHZjMV9zdHJ1Y3RzKHRyYWNrLCBidWYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdmlvX3diMzIocGIsIHRyYWNrLT52b3NfbGVuICsgOCArIHNpemVvZihidWYpKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJkdmMxIik7CisgICAgdHJhY2stPnZjMV9pbmZvLnN0cnVjdF9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fd3JpdGUocGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIGF2aW9fd3JpdGUocGIsIHRyYWNrLT52b3NfZGF0YSwgdHJhY2stPnZvc19sZW4pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2dsYmxfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPnZvc19sZW4gKyA4KTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJnbGJsIik7CisgICAgYXZpb193cml0ZShwYiwgdHJhY2stPnZvc19kYXRhLCB0cmFjay0+dm9zX2xlbik7CisgICAgcmV0dXJuIDggKyB0cmFjay0+dm9zX2xlbjsKK30KKworLyoqCisgKiBDb21wdXRlIGZsYWdzIGZvciAnbHBjbScgdGFnLgorICogU2VlIENvcmVBdWRpb1R5cGVzIGFuZCBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gYXQgQXBwbGUuCisgKi8KK3N0YXRpYyBpbnQgbW92X2dldF9scGNtX2ZsYWdzKGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKQoreworICAgIHN3aXRjaCAoY29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMzJCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRCRToKKyAgICAgICAgcmV0dXJuIDExOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkxFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NExFOgorICAgICAgICByZXR1cm4gOTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VODoKKyAgICAgICAgcmV0dXJuIDEwOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MyNEJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MzMkJFOgorICAgICAgICByZXR1cm4gMTQ7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzg6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzI0TEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyTEU6CisgICAgICAgIHJldHVybiAxMjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NsdXN0ZXJfZHVyYXRpb24oTU9WVHJhY2sgKnRyYWNrLCBpbnQgY2x1c3Rlcl9pZHgpCit7CisgICAgaW50NjRfdCBuZXh0X2R0czsKKworICAgIGlmIChjbHVzdGVyX2lkeCA+PSB0cmFjay0+ZW50cnkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGNsdXN0ZXJfaWR4ICsgMSA9PSB0cmFjay0+ZW50cnkpCisgICAgICAgIG5leHRfZHRzID0gdHJhY2stPnRyYWNrX2R1cmF0aW9uICsgdHJhY2stPnN0YXJ0X2R0czsKKyAgICBlbHNlCisgICAgICAgIG5leHRfZHRzID0gdHJhY2stPmNsdXN0ZXJbY2x1c3Rlcl9pZHggKyAxXS5kdHM7CisKKyAgICBuZXh0X2R0cyAtPSB0cmFjay0+Y2x1c3RlcltjbHVzdGVyX2lkeF0uZHRzOworCisgICAgYXZfYXNzZXJ0MChuZXh0X2R0cyA+PSAwKTsKKyAgICBhdl9hc3NlcnQwKG5leHRfZHRzIDw9IElOVF9NQVgpOworCisgICAgcmV0dXJuIG5leHRfZHRzOworfQorCitzdGF0aWMgaW50IGdldF9zYW1wbGVzX3Blcl9wYWNrZXQoTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludCBpLCBmaXJzdF9kdXJhdGlvbjsKKworLy8gcmV0dXJuIHRyYWNrLT5lbmMtPmZyYW1lX3NpemU7CisKKyAgICAvKiB1c2UgMSBmb3IgcmF3IFBDTSAqLworICAgIGlmICghdHJhY2stPmF1ZGlvX3ZicikKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBjaGVjayB0byBzZWUgaWYgZHVyYXRpb24gaXMgY29uc3RhbnQgZm9yIGFsbCBjbHVzdGVycyAqLworICAgIGlmICghdHJhY2stPmVudHJ5KQorICAgICAgICByZXR1cm4gMDsKKyAgICBmaXJzdF9kdXJhdGlvbiA9IGdldF9jbHVzdGVyX2R1cmF0aW9uKHRyYWNrLCAwKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgdHJhY2stPmVudHJ5OyBpKyspIHsKKyAgICAgICAgaWYgKGdldF9jbHVzdGVyX2R1cmF0aW9uKHRyYWNrLCBpKSAhPSBmaXJzdF9kdXJhdGlvbikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gZmlyc3RfZHVyYXRpb247Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2F1ZGlvX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgaW50IHZlcnNpb24gPSAwOworICAgIHVpbnQzMl90IHRhZyA9IHRyYWNrLT50YWc7CisKKyAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YpIHsKKyAgICAgICAgaWYgKHRyYWNrLT50aW1lc2NhbGUgPiBVSU5UMTZfTUFYKSB7CisgICAgICAgICAgICBpZiAobW92X2dldF9scGNtX2ZsYWdzKHRyYWNrLT5lbmMtPmNvZGVjX2lkKSkKKyAgICAgICAgICAgICAgICB0YWcgPSBBVl9STDMyKCJscGNtIik7CisgICAgICAgICAgICB2ZXJzaW9uID0gMjsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+YXVkaW9fdmJyIHx8IG1vdl9wY21fbGVfZ3QxNih0cmFjay0+ZW5jLT5jb2RlY19pZCkgfHwKKyAgICAgICAgICAgICAgICAgICBtb3ZfcGNtX2JlX2d0MTYodHJhY2stPmVuYy0+Y29kZWNfaWQpIHx8CisgICAgICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fTVMgfHwKKyAgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWIHx8CisgICAgICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUURNMikgeworICAgICAgICAgICAgdmVyc2lvbiA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgYXZpb193bDMyKHBiLCB0YWcpOyAvLyBzdG9yZSBpdCBieXRlc3dhcHBlZAorICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIFJlc2VydmVkICovCisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogUmVzZXJ2ZWQgKi8KKyAgICBhdmlvX3diMTYocGIsIDEpOyAvKiBEYXRhLXJlZmVyZW5jZSBpbmRleCwgWFhYICA9PSAxICovCisKKyAgICAvKiBTb3VuZERlc2NyaXB0aW9uICovCisgICAgYXZpb193YjE2KHBiLCB2ZXJzaW9uKTsgLyogVmVyc2lvbiAqLworICAgIGF2aW9fd2IxNihwYiwgMCk7IC8qIFJldmlzaW9uIGxldmVsICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogUmVzZXJ2ZWQgKi8KKworICAgIGlmICh2ZXJzaW9uID09IDIpIHsKKyAgICAgICAgYXZpb193YjE2KHBiLCAzKTsKKyAgICAgICAgYXZpb193YjE2KHBiLCAxNik7CisgICAgICAgIGF2aW9fd2IxNihwYiwgMHhmZmZlKTsKKyAgICAgICAgYXZpb193YjE2KHBiLCAwKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAweDAwMDEwMDAwKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCA3Mik7CisgICAgICAgIGF2aW9fd2I2NChwYiwgYXZfZG91YmxlMmludCh0cmFjay0+ZW5jLT5zYW1wbGVfcmF0ZSkpOworICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5lbmMtPmNoYW5uZWxzKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAweDdGMDAwMDAwKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHRyYWNrLT5lbmMtPmNvZGVjX2lkKSk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgbW92X2dldF9scGNtX2ZsYWdzKHRyYWNrLT5lbmMtPmNvZGVjX2lkKSk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPnNhbXBsZV9zaXplKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBnZXRfc2FtcGxlc19wZXJfcGFja2V0KHRyYWNrKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfTU9WKSB7CisgICAgICAgICAgICBhdmlvX3diMTYocGIsIHRyYWNrLT5lbmMtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fVTggfHwKKyAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzgpCisgICAgICAgICAgICAgICAgYXZpb193YjE2KHBiLCA4KTsgLyogYml0cyBwZXIgc2FtcGxlICovCisgICAgICAgICAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2KQorICAgICAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgdHJhY2stPmVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdmlvX3diMTYocGIsIDE2KTsKKyAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgdHJhY2stPmF1ZGlvX3ZiciA/IC0yIDogMCk7IC8qIGNvbXByZXNzaW9uIElEICovCisgICAgICAgIH0gZWxzZSB7IC8qIHJlc2VydmVkIGZvciBtcDQvM2dwICovCisgICAgICAgICAgICBhdmlvX3diMTYocGIsIDIpOworICAgICAgICAgICAgYXZpb193YjE2KHBiLCAxNik7CisgICAgICAgICAgICBhdmlvX3diMTYocGIsIDApOworICAgICAgICB9CisKKyAgICAgICAgYXZpb193YjE2KHBiLCAwKTsgLyogcGFja2V0IHNpemUgKD0gMCkgKi8KKyAgICAgICAgYXZpb193YjE2KHBiLCB0cmFjay0+ZW5jLT5zYW1wbGVfcmF0ZSA8PSBVSU5UMTZfTUFYID8KKyAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5zYW1wbGVfcmF0ZSA6IDApOworICAgICAgICBhdmlvX3diMTYocGIsIDApOyAvKiBSZXNlcnZlZCAqLworICAgIH0KKworICAgIGlmICh2ZXJzaW9uID09IDEpIHsgLyogU291bmREZXNjcmlwdGlvbiBWMSBleHRlbmRlZCBpbmZvICovCisgICAgICAgIGlmIChtb3ZfcGNtX2xlX2d0MTYodHJhY2stPmVuYy0+Y29kZWNfaWQpIHx8CisgICAgICAgICAgICBtb3ZfcGNtX2JlX2d0MTYodHJhY2stPmVuYy0+Y29kZWNfaWQpKQorICAgICAgICAgICAgYXZpb193YjMyKHBiLCAxKTsgLyogIG11c3QgYmUgMSBmb3IgIHVuY29tcHJlc3NlZCBmb3JtYXRzICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPmVuYy0+ZnJhbWVfc2l6ZSk7IC8qIFNhbXBsZXMgcGVyIHBhY2tldCAqLworICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5zYW1wbGVfc2l6ZSAvIHRyYWNrLT5lbmMtPmNoYW5uZWxzKTsgLyogQnl0ZXMgcGVyIHBhY2tldCAqLworICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5zYW1wbGVfc2l6ZSk7IC8qIEJ5dGVzIHBlciBmcmFtZSAqLworICAgICAgICBhdmlvX3diMzIocGIsIDIpOyAvKiBCeXRlcyBwZXIgc2FtcGxlICovCisgICAgfQorCisgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfTU9WICYmCisgICAgICAgICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgICAgICAgICAgIHx8CisgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMgICAgICAgICAgIHx8CisgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9FQUMzICAgICAgICAgIHx8CisgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTVJfTkIgICAgICAgIHx8CisgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTEFDICAgICAgICAgIHx8CisgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9NUyAgICAgIHx8CisgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWIHx8CisgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE0yICAgICAgICAgIHx8CisgICAgICAgICAobW92X3BjbV9sZV9ndDE2KHRyYWNrLT5lbmMtPmNvZGVjX2lkKSAmJiB2ZXJzaW9uPT0xKSB8fAorICAgICAgICAgKG1vdl9wY21fYmVfZ3QxNih0cmFjay0+ZW5jLT5jb2RlY19pZCkgJiYgdmVyc2lvbj09MSkpKQorICAgICAgICBtb3Zfd3JpdGVfd2F2ZV90YWcocGIsIHRyYWNrKTsKKyAgICBlbHNlIGlmICh0cmFjay0+dGFnID09IE1LVEFHKCdtJywncCcsJzQnLCdhJykpCisgICAgICAgIG1vdl93cml0ZV9lc2RzX3RhZyhwYiwgdHJhY2spOworICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikKKyAgICAgICAgbW92X3dyaXRlX2Ftcl90YWcocGIsIHRyYWNrKTsKKyAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpCisgICAgICAgIG1vdl93cml0ZV9hYzNfdGFnKHBiLCB0cmFjayk7CisgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRUFDMykKKyAgICAgICAgbW92X3dyaXRlX2VhYzNfdGFnKHBiLCB0cmFjayk7CisgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUxBQykKKyAgICAgICAgbW92X3dyaXRlX2V4dHJhZGF0YV90YWcocGIsIHRyYWNrKTsKKyAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XTUFQUk8pCisgICAgICAgIG1vdl93cml0ZV93ZmV4X3RhZyhwYiwgdHJhY2spOworICAgIGVsc2UgaWYgKHRyYWNrLT52b3NfbGVuID4gMCkKKyAgICAgICAgbW92X3dyaXRlX2dsYmxfdGFnKHBiLCB0cmFjayk7CisKKyAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YgJiYgdHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgIG1vdl93cml0ZV9jaGFuX3RhZyhwYiwgdHJhY2spOworCisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9kMjYzX3RhZyhBVklPQ29udGV4dCAqcGIpCit7CisgICAgYXZpb193YjMyKHBiLCAweGYpOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAiZDI2MyIpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkZGTVAiKTsKKyAgICBhdmlvX3c4KHBiLCAwKTsgLyogZGVjb2RlciB2ZXJzaW9uICovCisgICAgLyogRklYTUUgdXNlIEFWQ29kZWNDb250ZXh0IGxldmVsL3Byb2ZpbGUsIHdoZW4gZW5jb2RlciB3aWxsIHNldCB2YWx1ZXMgKi8KKyAgICBhdmlvX3c4KHBiLCAweGEpOyAvKiBsZXZlbCAqLworICAgIGF2aW9fdzgocGIsIDApOyAvKiBwcm9maWxlICovCisgICAgcmV0dXJuIDB4ZjsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfYXZjY190YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJhdmNDIik7CisgICAgZmZfaXNvbV93cml0ZV9hdmNjKHBiLCB0cmFjay0+dm9zX2RhdGEsIHRyYWNrLT52b3NfbGVuKTsKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2h2Y2NfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAiaHZjQyIpOworICAgIGZmX2lzb21fd3JpdGVfaHZjYyhwYiwgdHJhY2stPnZvc19kYXRhLCB0cmFjay0+dm9zX2xlbiwgMCk7CisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCisvKiBhbHNvIHVzZWQgYnkgYWxsIGF2aWQgY29kZWNzIChkdiwgaW14LCBtZXJpZGllbikgYW5kIHRoZWlyIHZhcmlhbnRzICovCitzdGF0aWMgaW50IG1vdl93cml0ZV9hdmlkX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQgaTsKKyAgICBhdmlvX3diMzIocGIsIDI0KTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkFDTFIiKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJBQ0xSIik7CisgICAgZmZpb193Zm91cmNjKHBiLCAiMDAwMSIpOworICAgIGlmICh0cmFjay0+ZW5jLT5jb2xvcl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9NUEVHKSB7IC8qIExlZ2FsIHJhbmdlICgxNi0yMzUpICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgMSk7IC8qIENvcnJlc3BvbmRzIHRvIDcwOSBpbiBvZmZpY2lhbCBlbmNvZGVyICovCisgICAgfSBlbHNlIHsgLyogRnVsbCByYW5nZSAoMC0yNTUpICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgMik7IC8qIENvcnJlc3BvbmRzIHRvIFJHQiBpbiBvZmZpY2lhbCBlbmNvZGVyICovCisgICAgfQorICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHVua25vd24gKi8KKworICAgIGF2aW9fd2IzMihwYiwgMjQpOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAiQVBSRyIpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkFQUkciKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICIwMDAxIik7CisgICAgYXZpb193YjMyKHBiLCAxKTsgLyogdW5rbm93biAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHVua25vd24gKi8KKworICAgIGF2aW9fd2IzMihwYiwgMTIwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkFSRVMiKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJBUkVTIik7CisgICAgZmZpb193Zm91cmNjKHBiLCAiMDAwMSIpOworICAgIGF2aW9fd2IzMihwYiwgQVZfUkIzMih0cmFjay0+dm9zX2RhdGEgKyAweDI4KSk7IC8qIGRueGhkIGNpZCwgc29tZSBpZCA/ICovCisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+ZW5jLT53aWR0aCk7CisgICAgLyogdmFsdWVzIGJlbG93IGFyZSBiYXNlZCBvbiBzYW1wbGVzIGNyZWF0ZWQgd2l0aCBxdWlja3RpbWUgYW5kIGF2aWQgY29kZWNzICovCisgICAgaWYgKHRyYWNrLT52b3NfZGF0YVs1XSAmIDIpIHsgLy8gaW50ZXJsYWNlZAorICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5lbmMtPmhlaWdodCAvIDIpOworICAgICAgICBhdmlvX3diMzIocGIsIDIpOyAvKiB1bmtub3duICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHVua25vd24gKi8KKyAgICAgICAgYXZpb193YjMyKHBiLCA0KTsgLyogdW5rbm93biAqLworICAgIH0gZWxzZSB7CisgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPmVuYy0+aGVpZ2h0KTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAxKTsgLyogdW5rbm93biAqLworICAgICAgICBhdmlvX3diMzIocGIsIDApOyAvKiB1bmtub3duICovCisgICAgICAgIGlmICh0cmFjay0+ZW5jLT5oZWlnaHQgPT0gMTA4MCkKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgNSk7IC8qIHVua25vd24gKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZpb193YjMyKHBiLCA2KTsgLyogdW5rbm93biAqLworICAgIH0KKyAgICAvKiBwYWRkaW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisgICAgICAgIGF2aW9fd2I2NChwYiwgMCk7CisKKyAgICAvKiBleHRyYSBwYWRkaW5nIGZvciBzdHNkIG5lZWRlZCAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXA0X2dldF9jb2RlY190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50IHRhZyA9IHRyYWNrLT5lbmMtPmNvZGVjX3RhZzsKKworICAgIGlmICghZmZfY29kZWNfZ2V0X3RhZyhmZl9tcDRfb2JqX3R5cGUsIHRyYWNrLT5lbmMtPmNvZGVjX2lkKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAgICAgICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSAgICAgIHRhZyA9IE1LVEFHKCdhJywndicsJ2MnLCcxJyk7CisgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQykgICAgICB0YWcgPSBNS1RBRygnaCcsJ2UnLCd2JywnMScpOworICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FDMykgICAgICAgdGFnID0gTUtUQUcoJ2EnLCdjJywnLScsJzMnKTsKKyAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9FQUMzKSAgICAgIHRhZyA9IE1LVEFHKCdlJywnYycsJy0nLCczJyk7CisgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRElSQUMpICAgICB0YWcgPSBNS1RBRygnZCcsJ3InLCdhJywnYycpOworICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01PVl9URVhUKSAgdGFnID0gTUtUQUcoJ3QnLCd4JywnMycsJ2cnKTsKKyAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEpICAgICAgIHRhZyA9IE1LVEFHKCd2JywnYycsJy0nLCcxJyk7CisgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pICB0YWcgPSBNS1RBRygnbScsJ3AnLCc0JywndicpOworICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSAgdGFnID0gTUtUQUcoJ20nLCdwJywnNCcsJ2EnKTsKKyAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEUpICB0YWcgPSBNS1RBRygnbScsJ3AnLCc0JywncycpOworCisgICAgcmV0dXJuIHRhZzsKK30KKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgY29kZWNfaXBvZF90YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgICAgTUtUQUcoJ2EnLCd2JywnYycsJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgIE1LVEFHKCdtJywncCcsJzQnLCd2JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FBQywgICAgICBNS1RBRygnbScsJ3AnLCc0JywnYScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BTEFDLCAgICAgTUtUQUcoJ2EnLCdsJywnYScsJ2MnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQUMzLCAgICAgIE1LVEFHKCdhJywnYycsJy0nLCczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01PVl9URVhULCBNS1RBRygndCcsJ3gnLCczJywnZycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NT1ZfVEVYVCwgTUtUQUcoJ3QnLCdlJywneCcsJ3QnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgMCB9LAorfTsKKworc3RhdGljIGludCBpcG9kX2dldF9jb2RlY190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50IHRhZyA9IHRyYWNrLT5lbmMtPmNvZGVjX3RhZzsKKworICAgIC8vIGtlZXAgb3JpZ2luYWwgdGFnIGZvciBzdWJzLCBpcG9kIHN1cHBvcnRzIGJvdGggZm9ybWF0cworICAgIGlmICghKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFICYmCisgICAgICAgICAgKHRhZyA9PSBNS1RBRygndCcsICd4JywgJzMnLCAnZycpIHx8CisgICAgICAgICAgIHRhZyA9PSBNS1RBRygndCcsICdlJywgJ3gnLCAndCcpKSkpCisgICAgICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoY29kZWNfaXBvZF90YWdzLCB0cmFjay0+ZW5jLT5jb2RlY19pZCk7CisKKyAgICBpZiAoIWF2X21hdGNoX2V4dChzLT5maWxlbmFtZSwgIm00YSIpICYmCisgICAgICAgICFhdl9tYXRjaF9leHQocy0+ZmlsZW5hbWUsICJtNGIiKSAmJgorICAgICAgICAhYXZfbWF0Y2hfZXh0KHMtPmZpbGVuYW1lLCAibTR2IikpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIldhcm5pbmcsIGV4dGVuc2lvbiBpcyBub3QgLm00YSwgLm00diBub3IgIC5tNGIgIgorICAgICAgICAgICAgICAgIlF1aWNrdGltZS9JcG9kIG1pZ2h0IG5vdCBwbGF5IHRoZSBmaWxlXG4iKTsKKworICAgIHJldHVybiB0YWc7Cit9CisKK3N0YXRpYyBpbnQgbW92X2dldF9kdl9jb2RlY190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50IHRhZzsKKworICAgIGlmICh0cmFjay0+ZW5jLT53aWR0aCA9PSA3MjApIHsgLyogU0QgKi8KKyAgICAgICAgaWYgKHRyYWNrLT5lbmMtPmhlaWdodCA9PSA0ODApIHsgLyogTlRTQyAqLworICAgICAgICAgICAgaWYgICh0cmFjay0+ZW5jLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgdGFnID0gTUtUQUcoJ2QnLCd2JywnNScsJ24nKTsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9IE1LVEFHKCdkJywndicsJ2MnLCcgJyk7CisgICAgICAgfWVsc2UgaWYgKHRyYWNrLT5lbmMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQKSB0YWcgPSBNS1RBRygnZCcsJ3YnLCc1JywncCcpOworICAgICAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgdGFnID0gTUtUQUcoJ2QnLCd2JywnYycsJ3AnKTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9IE1LVEFHKCdkJywndicsJ3AnLCdwJyk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5oZWlnaHQgPT0gNzIwKSB7IC8qIEhEIDcyMCBsaW5lICovCisgICAgICAgIGlmICAodHJhY2stPnN0LT50aW1lX2Jhc2UuZGVuID09IDUwKSAgICAgICAgICAgICAgICB0YWcgPSBNS1RBRygnZCcsJ3YnLCdoJywncScpOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnID0gTUtUQUcoJ2QnLCd2JywnaCcsJ3AnKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPmhlaWdodCA9PSAxMDgwKSB7IC8qIEhEIDEwODAgbGluZSAqLworICAgICAgICBpZiAgKHRyYWNrLT5zdC0+dGltZV9iYXNlLmRlbiA9PSAyNSkgICAgICAgICAgICAgICAgdGFnID0gTUtUQUcoJ2QnLCd2JywnaCcsJzUnKTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9IE1LVEFHKCdkJywndicsJ2gnLCc2Jyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGhlaWdodCBmb3IgZHYgY29kZWNcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gdGFnOworfQorCitzdGF0aWMgQVZSYXRpb25hbCBmaW5kX2ZwcyhBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCkKK3sKKyAgICBBVlJhdGlvbmFsIHJhdGUgPSB7c3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuLCBzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW19OworICAgIC8qIGlmIHRoZSBjb2RlYyB0aW1lIGJhc2UgbWFrZXMgbm8gc2Vuc2UsIHRyeSB0byBmYWxsYmFjayBvbiBzdHJlYW0gZnJhbWUgcmF0ZSAqLworICAgIGlmIChhdl90aW1lY29kZV9jaGVja19mcmFtZV9yYXRlKHJhdGUpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAidGltZWNvZGU6IHRiYz0lZC8lZCBpbnZhbGlkLCBmYWxsYmFjayBvbiAlZC8lZFxuIiwKKyAgICAgICAgICAgICAgIHJhdGUubnVtLCByYXRlLmRlbiwgc3QtPmF2Z19mcmFtZV9yYXRlLm51bSwgc3QtPmF2Z19mcmFtZV9yYXRlLmRlbik7CisgICAgICAgIHJhdGUgPSBzdC0+YXZnX2ZyYW1lX3JhdGU7CisgICAgfQorCisgICAgcmV0dXJuIHJhdGU7Cit9CisKK3N0YXRpYyBpbnQgbW92X2dldF9tcGVnMl94ZGNhbV9jb2RlY190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50IHRhZyA9IHRyYWNrLT5lbmMtPmNvZGVjX3RhZzsKKyAgICBpbnQgaW50ZXJsYWNlZCA9IHRyYWNrLT5lbmMtPmZpZWxkX29yZGVyID4gQVZfRklFTERfUFJPR1JFU1NJVkU7CisgICAgQVZTdHJlYW0gKnN0ID0gdHJhY2stPnN0OworICAgIGludCByYXRlID0gYXZfcTJkKGZpbmRfZnBzKHMsIHN0KSk7CisKKyAgICBpZiAoIXRhZykKKyAgICAgICAgdGFnID0gTUtUQUcoJ20nLCAnMicsICd2JywgJzEnKTsgLy9mYWxsYmFjayB0YWcKKworICAgIGlmICh0cmFjay0+ZW5jLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgeworICAgICAgICBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gMTI4MCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gNzIwKSB7CisgICAgICAgICAgICBpZiAoIWludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAgICAgIChyYXRlID09IDI0KSB0YWcgPSBNS1RBRygneCcsJ2QnLCd2JywnNCcpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMjUpIHRhZyA9IE1LVEFHKCd4JywnZCcsJ3YnLCc1Jyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSAzMCkgdGFnID0gTUtUQUcoJ3gnLCdkJywndicsJzEnKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDUwKSB0YWcgPSBNS1RBRygneCcsJ2QnLCd2JywnYScpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gNjApIHRhZyA9IE1LVEFHKCd4JywnZCcsJ3YnLCc5Jyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gMTQ0MCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gMTA4MCkgeworICAgICAgICAgICAgaWYgKCFpbnRlcmxhY2VkKSB7CisgICAgICAgICAgICAgICAgaWYgICAgICAocmF0ZSA9PSAyNCkgdGFnID0gTUtUQUcoJ3gnLCdkJywndicsJzYnKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDI1KSB0YWcgPSBNS1RBRygneCcsJ2QnLCd2JywnNycpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMzApIHRhZyA9IE1LVEFHKCd4JywnZCcsJ3YnLCc4Jyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICAgICAgKHJhdGUgPT0gMjUpIHRhZyA9IE1LVEFHKCd4JywnZCcsJ3YnLCczJyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSAzMCkgdGFnID0gTUtUQUcoJ3gnLCdkJywndicsJzInKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT53aWR0aCA9PSAxOTIwICYmIHRyYWNrLT5lbmMtPmhlaWdodCA9PSAxMDgwKSB7CisgICAgICAgICAgICBpZiAoIWludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAgICAgIChyYXRlID09IDI0KSB0YWcgPSBNS1RBRygneCcsJ2QnLCd2JywnZCcpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMjUpIHRhZyA9IE1LVEFHKCd4JywnZCcsJ3YnLCdlJyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSAzMCkgdGFnID0gTUtUQUcoJ3gnLCdkJywndicsJ2YnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgICAgICAocmF0ZSA9PSAyNSkgdGFnID0gTUtUQUcoJ3gnLCdkJywndicsJ2MnKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDMwKSB0YWcgPSBNS1RBRygneCcsJ2QnLCd2JywnYicpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgeworICAgICAgICBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gMTI4MCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gNzIwKSB7CisgICAgICAgICAgICBpZiAoIWludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAgICAgIChyYXRlID09IDI0KSB0YWcgPSBNS1RBRygneCcsJ2QnLCc1JywnNCcpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMjUpIHRhZyA9IE1LVEFHKCd4JywnZCcsJzUnLCc1Jyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSAzMCkgdGFnID0gTUtUQUcoJ3gnLCdkJywnNScsJzEnKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDUwKSB0YWcgPSBNS1RBRygneCcsJ2QnLCc1JywnYScpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gNjApIHRhZyA9IE1LVEFHKCd4JywnZCcsJzUnLCc5Jyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gMTkyMCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gMTA4MCkgeworICAgICAgICAgICAgaWYgKCFpbnRlcmxhY2VkKSB7CisgICAgICAgICAgICAgICAgaWYgICAgICAocmF0ZSA9PSAyNCkgdGFnID0gTUtUQUcoJ3gnLCdkJywnNScsJ2QnKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDI1KSB0YWcgPSBNS1RBRygneCcsJ2QnLCc1JywnZScpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMzApIHRhZyA9IE1LVEFHKCd4JywnZCcsJzUnLCdmJyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICAgICAgKHJhdGUgPT0gMjUpIHRhZyA9IE1LVEFHKCd4JywnZCcsJzUnLCdjJyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSAzMCkgdGFnID0gTUtUQUcoJ3gnLCdkJywnNScsJ2InKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0YWc7Cit9CisKK3N0YXRpYyBpbnQgbW92X2dldF9oMjY0X2NvZGVjX3RhZyhBVkZvcm1hdENvbnRleHQgKnMsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQgdGFnID0gdHJhY2stPmVuYy0+Y29kZWNfdGFnOworICAgIGludCBpbnRlcmxhY2VkID0gdHJhY2stPmVuYy0+ZmllbGRfb3JkZXIgPiBBVl9GSUVMRF9QUk9HUkVTU0lWRTsKKyAgICBBVlN0cmVhbSAqc3QgPSB0cmFjay0+c3Q7CisgICAgaW50IHJhdGUgPSBhdl9xMmQoZmluZF9mcHMocywgc3QpKTsKKworICAgIGlmICghdGFnKQorICAgICAgICB0YWcgPSBNS1RBRygnYScsICd2JywgJ2MnLCAnaScpOyAvL2ZhbGxiYWNrIHRhZworCisgICAgaWYgKHRyYWNrLT5lbmMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQMTApIHsKKyAgICAgICAgaWYgKHRyYWNrLT5lbmMtPndpZHRoID09IDk2MCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gNzIwKSB7CisgICAgICAgICAgICBpZiAoIWludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAgICAgIChyYXRlID09IDI0KSB0YWcgPSBNS1RBRygnYScsJ2knLCc1JywncCcpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMjUpIHRhZyA9IE1LVEFHKCdhJywnaScsJzUnLCdxJyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSAzMCkgdGFnID0gTUtUQUcoJ2EnLCdpJywnNScsJ3AnKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDUwKSB0YWcgPSBNS1RBRygnYScsJ2knLCc1JywncScpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gNjApIHRhZyA9IE1LVEFHKCdhJywnaScsJzUnLCdwJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gMTQ0MCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gMTA4MCkgeworICAgICAgICAgICAgaWYgKCFpbnRlcmxhY2VkKSB7CisgICAgICAgICAgICAgICAgaWYgICAgICAocmF0ZSA9PSAyNCkgdGFnID0gTUtUQUcoJ2EnLCdpJywnNScsJzMnKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDI1KSB0YWcgPSBNS1RBRygnYScsJ2knLCc1JywnMicpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMzApIHRhZyA9IE1LVEFHKCdhJywnaScsJzUnLCczJyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICAgICAgKHJhdGUgPT0gNTApIHRhZyA9IE1LVEFHKCdhJywnaScsJzUnLCc1Jyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSA2MCkgdGFnID0gTUtUQUcoJ2EnLCdpJywnNScsJzYnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlAxMCkgeworICAgICAgICBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gMTI4MCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gNzIwKSB7CisgICAgICAgICAgICBpZiAoIWludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAgICAgIChyYXRlID09IDI0KSB0YWcgPSBNS1RBRygnYScsJ2knLCcxJywncCcpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMjUpIHRhZyA9IE1LVEFHKCdhJywnaScsJzEnLCdxJyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSAzMCkgdGFnID0gTUtUQUcoJ2EnLCdpJywnMScsJ3AnKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDUwKSB0YWcgPSBNS1RBRygnYScsJ2knLCcxJywncScpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gNjApIHRhZyA9IE1LVEFHKCdhJywnaScsJzEnLCdwJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gMTkyMCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gMTA4MCkgeworICAgICAgICAgICAgaWYgKCFpbnRlcmxhY2VkKSB7CisgICAgICAgICAgICAgICAgaWYgICAgICAocmF0ZSA9PSAyNCkgdGFnID0gTUtUQUcoJ2EnLCdpJywnMScsJzMnKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDI1KSB0YWcgPSBNS1RBRygnYScsJ2knLCcxJywnMicpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMzApIHRhZyA9IE1LVEFHKCdhJywnaScsJzEnLCczJyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICAgICAgKHJhdGUgPT0gMjUpIHRhZyA9IE1LVEFHKCdhJywnaScsJzEnLCc1Jyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSA1MCkgdGFnID0gTUtUQUcoJ2EnLCdpJywnMScsJzUnKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDYwKSB0YWcgPSBNS1RBRygnYScsJ2knLCcxJywnNicpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCAgIHRyYWNrLT5lbmMtPndpZHRoID09IDQwOTYgJiYgdHJhY2stPmVuYy0+aGVpZ2h0ID09IDIxNjAKKyAgICAgICAgICAgICAgICAgICB8fCB0cmFjay0+ZW5jLT53aWR0aCA9PSAzODQwICYmIHRyYWNrLT5lbmMtPmhlaWdodCA9PSAyMTYwKSB7CisgICAgICAgICAgICB0YWcgPSBNS1RBRygnYScsJ2knLCd2JywneCcpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRhZzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgdWludDMyX3QgdGFnOworICAgIHVuc2lnbmVkIGJwczsKK30gbW92X3BpeF9mbXRfdGFnc1tdID0geworICAgIHsgQVZfUElYX0ZNVF9ZVVlWNDIyLCBNS1RBRygneScsJ3UnLCd2JywnMicpLCAgMCB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVlWNDIyLCBNS1RBRygneScsJ3UnLCd2JywncycpLCAgMCB9LAorICAgIHsgQVZfUElYX0ZNVF9VWVZZNDIyLCBNS1RBRygnMicsJ3YnLCd1JywneScpLCAgMCB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NTVCRSxNS1RBRygncicsJ2EnLCd3JywnICcpLCAxNiB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NTVMRSxNS1RBRygnTCcsJzUnLCc1JywnNScpLCAxNiB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NjVMRSxNS1RBRygnTCcsJzUnLCc2JywnNScpLCAxNiB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NjVCRSxNS1RBRygnQicsJzUnLCc2JywnNScpLCAxNiB9LAorICAgIHsgQVZfUElYX0ZNVF9HUkFZMTZCRSxNS1RBRygnYicsJzEnLCc2JywnZycpLCAxNiB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0IyNCwgICBNS1RBRygncicsJ2EnLCd3JywnICcpLCAyNCB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1IyNCwgICBNS1RBRygnMicsJzQnLCdCJywnRycpLCAyNCB9LAorICAgIHsgQVZfUElYX0ZNVF9BUkdCLCAgICBNS1RBRygncicsJ2EnLCd3JywnICcpLCAzMiB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1JBLCAgICBNS1RBRygnQicsJ0cnLCdSJywnQScpLCAzMiB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0JBLCAgICBNS1RBRygnUicsJ0cnLCdCJywnQScpLCAzMiB9LAorICAgIHsgQVZfUElYX0ZNVF9BQkdSLCAgICBNS1RBRygnQScsJ0InLCdHJywnUicpLCAzMiB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I0OEJFLCBNS1RBRygnYicsJzQnLCc4JywncicpLCA0OCB9LAorfTsKKworc3RhdGljIGludCBtb3ZfZ2V0X3Jhd3ZpZGVvX2NvZGVjX3RhZyhBVkZvcm1hdENvbnRleHQgKnMsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQgdGFnID0gdHJhY2stPmVuYy0+Y29kZWNfdGFnOworICAgIGludCBpOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKG1vdl9waXhfZm10X3RhZ3MpOyBpKyspIHsKKyAgICAgICAgaWYgKHRyYWNrLT5lbmMtPnBpeF9mbXQgPT0gbW92X3BpeF9mbXRfdGFnc1tpXS5waXhfZm10KSB7CisgICAgICAgICAgICB0YWcgPSBtb3ZfcGl4X2ZtdF90YWdzW2ldLnRhZzsKKyAgICAgICAgICAgIHRyYWNrLT5lbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IG1vdl9waXhfZm10X3RhZ3NbaV0uYnBzOworICAgICAgICAgICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3RhZyA9PSBtb3ZfcGl4X2ZtdF90YWdzW2ldLnRhZykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBpeF9mbXQgPSBhdnByaXZfZmluZF9waXhfZm10KGF2cHJpdl9waXhfZm10X2Jwc19tb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICBpZiAodGFnID09IE1LVEFHKCdyJywnYScsJ3cnLCcgJykgJiYKKyAgICAgICAgdHJhY2stPmVuYy0+cGl4X2ZtdCAhPSBwaXhfZm10ICYmCisgICAgICAgIHRyYWNrLT5lbmMtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9OT05FKQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJXMgcmF3dmlkZW8gY2Fubm90IGJlIHdyaXR0ZW4gdG8gbW92LCBvdXRwdXQgZmlsZSB3aWxsIGJlIHVucmVhZGFibGVcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKHRyYWNrLT5lbmMtPnBpeF9mbXQpKTsKKyAgICByZXR1cm4gdGFnOworfQorCitzdGF0aWMgaW50IG1vdl9nZXRfY29kZWNfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludCB0YWcgPSB0cmFjay0+ZW5jLT5jb2RlY190YWc7CisKKyAgICBpZiAoIXRhZyB8fCAocy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID49IEZGX0NPTVBMSUFOQ0VfTk9STUFMICYmCisgICAgICAgICAgICAgICAgICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVlZJREVPIHx8CisgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTyB8fAorICAgICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2MyB8fAorICAgICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fAorICAgICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTyB8fAorICAgICAgICAgICAgICAgICAgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZSh0cmFjay0+ZW5jLT5jb2RlY19pZCkpKSkgeyAvLyBwY20gYXVkaW8KKyAgICAgICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8pCisgICAgICAgICAgICB0YWcgPSBtb3ZfZ2V0X2R2X2NvZGVjX3RhZyhzLCB0cmFjayk7CisgICAgICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPKQorICAgICAgICAgICAgdGFnID0gbW92X2dldF9yYXd2aWRlb19jb2RlY190YWcocywgdHJhY2spOworICAgICAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKQorICAgICAgICAgICAgdGFnID0gbW92X2dldF9tcGVnMl94ZGNhbV9jb2RlY190YWcocywgdHJhY2spOworICAgICAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQorICAgICAgICAgICAgdGFnID0gbW92X2dldF9oMjY0X2NvZGVjX3RhZyhzLCB0cmFjayk7CisgICAgICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICB0YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIHRyYWNrLT5lbmMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIGlmICghdGFnKSB7IC8vIGlmIG5vIG1hYyBmY2MgZm91bmQsIHRyeSB3aXRoIE1pY3Jvc29mdCB0YWdzCisgICAgICAgICAgICAgICAgdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19ibXBfdGFncywgdHJhY2stPmVuYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgICAgIGlmICh0YWcpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVzaW5nIE1TIHN0eWxlIHZpZGVvIGNvZGVjIHRhZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBmaWxlIG1heSBiZSB1bnBsYXlhYmxlIVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfbW92YXVkaW9fdGFncywgdHJhY2stPmVuYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgaWYgKCF0YWcpIHsgLy8gaWYgbm8gbWFjIGZjYyBmb3VuZCwgdHJ5IHdpdGggTWljcm9zb2Z0IHRhZ3MKKyAgICAgICAgICAgICAgICBpbnQgbXNfdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY193YXZfdGFncywgdHJhY2stPmVuYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgICAgIGlmIChtc190YWcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFnID0gTUtUQUcoJ20nLCAncycsICgobXNfdGFnID4+IDgpICYgMHhmZiksIChtc190YWcgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVzaW5nIE1TIHN0eWxlIGF1ZGlvIGNvZGVjIHRhZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBmaWxlIG1heSBiZSB1bnBsYXlhYmxlIVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKQorICAgICAgICAgICAgdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19tb3ZzdWJ0aXRsZV90YWdzLCB0cmFjay0+ZW5jLT5jb2RlY19pZCk7CisgICAgfQorCisgICAgcmV0dXJuIHRhZzsKK30KKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgY29kZWNfM2dwX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX0gyNjMsICAgICBNS1RBRygncycsJzInLCc2JywnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgICAgTUtUQUcoJ2EnLCd2JywnYycsJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgIE1LVEFHKCdtJywncCcsJzQnLCd2JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FBQywgICAgICBNS1RBRygnbScsJ3AnLCc0JywnYScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BTVJfTkIsICAgTUtUQUcoJ3MnLCdhJywnbScsJ3InKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQU1SX1dCLCAgIE1LVEFHKCdzJywnYScsJ3cnLCdiJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01PVl9URVhULCBNS1RBRygndCcsJ3gnLCczJywnZycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAwIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY1RhZyBjb2RlY19mNHZfdGFnc1tdID0geyAvLyBYWFg6IGFkZCBHSUYvUE5HL0pQRUc/CisgICAgeyBBVl9DT0RFQ19JRF9NUDMsICAgIE1LVEFHKCcuJywnbScsJ3AnLCczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FBQywgICAgTUtUQUcoJ20nLCdwJywnNCcsJ2EnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgICBNS1RBRygnYScsJ3YnLCdjJywnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WUDZBLCAgIE1LVEFHKCdWJywnUCcsJzYnLCdBJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQNkYsICAgTUtUQUcoJ1YnLCdQJywnNicsJ0YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgMCB9LAorfTsKKworc3RhdGljIGludCBtb3ZfZmluZF9jb2RlY190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50IHRhZzsKKworICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01QNCB8fCB0cmFjay0+bW9kZSA9PSBNT0RFX1BTUCkKKyAgICAgICAgdGFnID0gbXA0X2dldF9jb2RlY190YWcocywgdHJhY2spOworICAgIGVsc2UgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfSVNNKSB7CisgICAgICAgIHRhZyA9IG1wNF9nZXRfY29kZWNfdGFnKHMsIHRyYWNrKTsKKyAgICAgICAgaWYgKCF0YWcgJiYgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01BUFJPKQorICAgICAgICAgICAgdGFnID0gTUtUQUcoJ3cnLCAnbScsICdhJywgJyAnKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfSVBPRCkKKyAgICAgICAgdGFnID0gaXBvZF9nZXRfY29kZWNfdGFnKHMsIHRyYWNrKTsKKyAgICBlbHNlIGlmICh0cmFjay0+bW9kZSAmIE1PREVfM0dQKQorICAgICAgICB0YWcgPSBmZl9jb2RlY19nZXRfdGFnKGNvZGVjXzNncF90YWdzLCB0cmFjay0+ZW5jLT5jb2RlY19pZCk7CisgICAgZWxzZSBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9GNFYpCisgICAgICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoY29kZWNfZjR2X3RhZ3MsIHRyYWNrLT5lbmMtPmNvZGVjX2lkKTsKKyAgICBlbHNlCisgICAgICAgIHRhZyA9IG1vdl9nZXRfY29kZWNfdGFnKHMsIHRyYWNrKTsKKworICAgIHJldHVybiB0YWc7Cit9CisKKy8qKiBXcml0ZSB1dWlkIGF0b20uCisgKiBOZWVkZWQgdG8gbWFrZSBmaWxlIHBsYXkgaW4gaVBvZHMgcnVubmluZyBuZXdlc3QgZmlybXdhcmUKKyAqIGdvZXMgYWZ0ZXIgYXZjQyBhdG9tIGluIG1vb3YudHJhay5tZGlhLm1pbmYuc3RibC5zdHNkLmF2YzEKKyAqLworc3RhdGljIGludCBtb3Zfd3JpdGVfdXVpZF90YWdfaXBvZChBVklPQ29udGV4dCAqcGIpCit7CisgICAgYXZpb193YjMyKHBiLCAyOCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAidXVpZCIpOworICAgIGF2aW9fd2IzMihwYiwgMHg2YjY4NDBmMik7CisgICAgYXZpb193YjMyKHBiLCAweDVmMjQ0ZmM1KTsKKyAgICBhdmlvX3diMzIocGIsIDB4YmEzOWE1MWIpOworICAgIGF2aW9fd2IzMihwYiwgMHhjZjAzMjNmMyk7CisgICAgYXZpb193YjMyKHBiLCAweDApOworICAgIHJldHVybiAyODsKK30KKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGZpZWxfZGF0YVtdID0geworICAgIDB4MDAwMCwgMHgwMTAwLCAweDAyMDEsIDB4MDIwNiwgMHgwMjA5LCAweDAyMGUKK307CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2ZpZWxfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIHVuc2lnbmVkIG1vdl9maWVsZF9vcmRlciA9IDA7CisgICAgaWYgKHRyYWNrLT5lbmMtPmZpZWxkX29yZGVyIDwgRkZfQVJSQVlfRUxFTVMoZmllbF9kYXRhKSkKKyAgICAgICAgbW92X2ZpZWxkX29yZGVyID0gZmllbF9kYXRhW3RyYWNrLT5lbmMtPmZpZWxkX29yZGVyXTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworICAgIGF2aW9fd2IzMihwYiwgMTApOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImZpZWwiKTsKKyAgICBhdmlvX3diMTYocGIsIG1vdl9maWVsZF9vcmRlcik7CisgICAgcmV0dXJuIDEwOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9zdWJ0aXRsZV90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgIC8qIHNpemUgKi8KKyAgICBhdmlvX3dsMzIocGIsIHRyYWNrLT50YWcpOyAvLyBzdG9yZSBpdCBieXRlc3dhcHBlZAorICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgIC8qIFJlc2VydmVkICovCisgICAgYXZpb193YjE2KHBiLCAwKTsgICAgLyogUmVzZXJ2ZWQgKi8KKyAgICBhdmlvX3diMTYocGIsIDEpOyAgICAvKiBEYXRhLXJlZmVyZW5jZSBpbmRleCAqLworCisgICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWRF9TVUJUSVRMRSkKKyAgICAgICAgbW92X3dyaXRlX2VzZHNfdGFnKHBiLCB0cmFjayk7CisgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+ZXh0cmFkYXRhX3NpemUpCisgICAgICAgIGF2aW9fd3JpdGUocGIsIHRyYWNrLT5lbmMtPmV4dHJhZGF0YSwgdHJhY2stPmVuYy0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9wYXNwX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBBVlJhdGlvbmFsIHNhcjsKKyAgICBhdl9yZWR1Y2UoJnNhci5udW0sICZzYXIuZGVuLCB0cmFjay0+ZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgdHJhY2stPmVuYy0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sIElOVF9NQVgpOworCisgICAgYXZpb193YjMyKHBiLCAxNik7CisgICAgZmZpb193Zm91cmNjKHBiLCAicGFzcCIpOworICAgIGF2aW9fd2IzMihwYiwgc2FyLm51bSk7CisgICAgYXZpb193YjMyKHBiLCBzYXIuZGVuKTsKKyAgICByZXR1cm4gMTY7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmRfY29tcHJlc3NvcihjaGFyICogY29tcHJlc3Nvcl9uYW1lLCBpbnQgbGVuLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmVuY29kZXI7CisgICAgaW50IHhkY2FtX3JlcyA9ICAodHJhY2stPmVuYy0+d2lkdGggPT0gMTI4MCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gNzIwKQorICAgICAgICAgICAgICAgICAgfHwgKHRyYWNrLT5lbmMtPndpZHRoID09IDE0NDAgJiYgdHJhY2stPmVuYy0+aGVpZ2h0ID09IDEwODApCisgICAgICAgICAgICAgICAgICB8fCAodHJhY2stPmVuYy0+d2lkdGggPT0gMTkyMCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gMTA4MCk7CisKKyAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YgJiYKKyAgICAgICAgKGVuY29kZXIgPSBhdl9kaWN0X2dldCh0cmFjay0+c3QtPm1ldGFkYXRhLCAiZW5jb2RlciIsIE5VTEwsIDApKSkgeworICAgICAgICBhdl9zdHJsY3B5KGNvbXByZXNzb3JfbmFtZSwgZW5jb2Rlci0+dmFsdWUsIDMyKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYgeGRjYW1fcmVzKSB7CisgICAgICAgIGludCBpbnRlcmxhY2VkID0gdHJhY2stPmVuYy0+ZmllbGRfb3JkZXIgPiBBVl9GSUVMRF9QUk9HUkVTU0lWRTsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gdHJhY2stPnN0OworICAgICAgICBpbnQgcmF0ZSA9IGF2X3EyZChmaW5kX2ZwcyhOVUxMLCBzdCkpOworICAgICAgICBhdl9zdHJsY2F0Zihjb21wcmVzc29yX25hbWUsIGxlbiwgIlhEQ0FNIik7CisgICAgICAgIGlmICh0cmFjay0+ZW5jLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgeworICAgICAgICAgICAgYXZfc3RybGNhdGYoY29tcHJlc3Nvcl9uYW1lLCBsZW4sICIgSEQ0MjIiKTsKKyAgICAgICAgfSBlbHNlIGlmKHRyYWNrLT5lbmMtPndpZHRoID09IDE0NDApIHsKKyAgICAgICAgICAgIGF2X3N0cmxjYXRmKGNvbXByZXNzb3JfbmFtZSwgbGVuLCAiIEhEIik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYXZfc3RybGNhdGYoY29tcHJlc3Nvcl9uYW1lLCBsZW4sICIgRVgiKTsKKworICAgICAgICBhdl9zdHJsY2F0Zihjb21wcmVzc29yX25hbWUsIGxlbiwgIiAlZCVjIiwgdHJhY2stPmVuYy0+aGVpZ2h0LCBpbnRlcmxhY2VkID8gJ2knIDogJ3AnKTsKKworICAgICAgICBhdl9zdHJsY2F0Zihjb21wcmVzc29yX25hbWUsIGxlbiwgIiVkIiwgcmF0ZSAqIChpbnRlcmxhY2VkICsgMSkpOworICAgIH0KK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfdmlkZW9fdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBjaGFyIGNvbXByZXNzb3JfbmFtZVszMl0gPSB7IDAgfTsKKworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgKi8KKyAgICBhdmlvX3dsMzIocGIsIHRyYWNrLT50YWcpOyAvLyBzdG9yZSBpdCBieXRlc3dhcHBlZAorICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIFJlc2VydmVkICovCisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogUmVzZXJ2ZWQgKi8KKyAgICBhdmlvX3diMTYocGIsIDEpOyAvKiBEYXRhLXJlZmVyZW5jZSBpbmRleCAqLworCisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogQ29kZWMgc3RyZWFtIHZlcnNpb24gKi8KKyAgICBhdmlvX3diMTYocGIsIDApOyAvKiBDb2RlYyBzdHJlYW0gcmV2aXNpb24gKD0wKSAqLworICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01PVikgeworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJGRk1QIik7IC8qIFZlbmRvciAqLworICAgICAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIFRlbXBvcmFsIFF1YWxpdHkgKi8KKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgMHg0MDApOyAvKiBTcGF0aWFsIFF1YWxpdHkgPSBsb3NzbGVzcyovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdmlvX3diMzIocGIsIDB4MjAwKTsgLyogVGVtcG9yYWwgUXVhbGl0eSA9IG5vcm1hbCAqLworICAgICAgICAgICAgYXZpb193YjMyKHBiLCAweDIwMCk7IC8qIFNwYXRpYWwgUXVhbGl0eSA9IG5vcm1hbCAqLworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogUmVzZXJ2ZWQgKi8KKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogUmVzZXJ2ZWQgKi8KKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogUmVzZXJ2ZWQgKi8KKyAgICB9CisgICAgYXZpb193YjE2KHBiLCB0cmFjay0+ZW5jLT53aWR0aCk7IC8qIFZpZGVvIHdpZHRoICovCisgICAgYXZpb193YjE2KHBiLCB0cmFjay0+aGVpZ2h0KTsgLyogVmlkZW8gaGVpZ2h0ICovCisgICAgYXZpb193YjMyKHBiLCAweDAwNDgwMDAwKTsgLyogSG9yaXpvbnRhbCByZXNvbHV0aW9uIDcyZHBpICovCisgICAgYXZpb193YjMyKHBiLCAweDAwNDgwMDAwKTsgLyogVmVydGljYWwgcmVzb2x1dGlvbiA3MmRwaSAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIERhdGEgc2l6ZSAoPSAwKSAqLworICAgIGF2aW9fd2IxNihwYiwgMSk7IC8qIEZyYW1lIGNvdW50ICg9IDEpICovCisKKyAgICAvKiBGSVhNRSBub3Qgc3VyZSwgSVNPIDE0NDk2LTEgZHJhZnQgd2hlcmUgaXQgc2hhbGwgYmUgc2V0IHRvIDAgKi8KKyAgICBmaW5kX2NvbXByZXNzb3IoY29tcHJlc3Nvcl9uYW1lLCAzMiwgdHJhY2spOworICAgIGF2aW9fdzgocGIsIHN0cmxlbihjb21wcmVzc29yX25hbWUpKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBjb21wcmVzc29yX25hbWUsIDMxKTsKKworICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01PViAmJiB0cmFjay0+ZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpCisgICAgICAgIGF2aW9fd2IxNihwYiwgdHJhY2stPmVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICBlbHNlCisgICAgICAgIGF2aW9fd2IxNihwYiwgMHgxOCk7IC8qIFJlc2VydmVkICovCisgICAgYXZpb193YjE2KHBiLCAweGZmZmYpOyAvKiBSZXNlcnZlZCAqLworICAgIGlmICh0cmFjay0+dGFnID09IE1LVEFHKCdtJywncCcsJzQnLCd2JykpCisgICAgICAgIG1vdl93cml0ZV9lc2RzX3RhZyhwYiwgdHJhY2spOworICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjMpCisgICAgICAgIG1vdl93cml0ZV9kMjYzX3RhZyhwYik7CisgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVZVSSB8fAorICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1ZRMykgeworICAgICAgICBtb3Zfd3JpdGVfZXh0cmFkYXRhX3RhZyhwYiwgdHJhY2spOworICAgICAgICBhdmlvX3diMzIocGIsIDApOworICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRE5YSEQpCisgICAgICAgIG1vdl93cml0ZV9hdmlkX3RhZyhwYiwgdHJhY2spOworICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0hFVkMpCisgICAgICAgIG1vdl93cml0ZV9odmNjX3RhZyhwYiwgdHJhY2spOworICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgJiYgIVRBR19JU19BVkNJKHRyYWNrLT50YWcpKSB7CisgICAgICAgIG1vdl93cml0ZV9hdmNjX3RhZyhwYiwgdHJhY2spOworICAgICAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9JUE9EKQorICAgICAgICAgICAgbW92X3dyaXRlX3V1aWRfdGFnX2lwb2QocGIpOworICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVkMxICYmIHRyYWNrLT52b3NfbGVuID4gMCkKKyAgICAgICAgbW92X3dyaXRlX2R2YzFfdGFnKHBiLCB0cmFjayk7CisgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2RiB8fAorICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNkEpIHsKKyAgICAgICAgLyogRG9uJ3Qgd3JpdGUgYW55IHBvdGVudGlhbCBleHRyYWRhdGEgaGVyZSAtIHRoZSBjcm9wcGluZworICAgICAgICAgKiBpcyBzaWduYWxsZWQgdmlhIHRoZSBub3JtYWwgd2lkdGgvaGVpZ2h0IGZpZWxkcy4gKi8KKyAgICB9IGVsc2UgaWYgKHRyYWNrLT52b3NfbGVuID4gMCkKKyAgICAgICAgbW92X3dyaXRlX2dsYmxfdGFnKHBiLCB0cmFjayk7CisKKyAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSDI2NCAmJgorICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUEVHNCAmJgorICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9ETlhIRCkKKyAgICAgICAgaWYgKHRyYWNrLT5lbmMtPmZpZWxkX29yZGVyICE9IEFWX0ZJRUxEX1VOS05PV04pCisgICAgICAgICAgICBtb3Zfd3JpdGVfZmllbF90YWcocGIsIHRyYWNrKTsKKworICAgIGlmICh0cmFjay0+ZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAmJiB0cmFjay0+ZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAmJgorICAgICAgICB0cmFjay0+ZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAhPSB0cmFjay0+ZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkgeworICAgICAgICBtb3Zfd3JpdGVfcGFzcF90YWcocGIsIHRyYWNrKTsKKyAgICB9CisKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3J0cF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJydHAgIik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogUmVzZXJ2ZWQgKi8KKyAgICBhdmlvX3diMTYocGIsIDApOyAvKiBSZXNlcnZlZCAqLworICAgIGF2aW9fd2IxNihwYiwgMSk7IC8qIERhdGEtcmVmZXJlbmNlIGluZGV4ICovCisKKyAgICBhdmlvX3diMTYocGIsIDEpOyAvKiBIaW50IHRyYWNrIHZlcnNpb24gKi8KKyAgICBhdmlvX3diMTYocGIsIDEpOyAvKiBIaWdoZXN0IGNvbXBhdGlibGUgdmVyc2lvbiAqLworICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPm1heF9wYWNrZXRfc2l6ZSk7IC8qIE1heCBwYWNrZXQgc2l6ZSAqLworCisgICAgYXZpb193YjMyKHBiLCAxMik7IC8qIHNpemUgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJ0aW1zIik7CisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+dGltZXNjYWxlKTsKKworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfc291cmNlX3JlZmVyZW5jZV90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2ssIGNvbnN0IGNoYXIgKnJlZWxfbmFtZSkKK3sKKyAgICB1aW50NjRfdCBzdHJfc2l6ZSA9c3RybGVuKHJlZWxfbmFtZSk7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgaWYgKHN0cl9zaXplID49IFVJTlQxNl9NQVgpeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAicmVlbF9uYW1lIGxlbmd0aCAlIlBSSXU2NCIgaXMgdG9vIGxhcmdlXG4iLCBzdHJfc2l6ZSk7CisgICAgICAgIGF2aW9fd2IxNihwYiwgMCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAibmFtZSIpOyAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIGZvcm1hdCAqLworICAgIGF2aW9fd2IxNihwYiwgc3RyX3NpemUpOyAgICAgICAgICAgICAgICAgICAgICAgLyogc3RyaW5nIHNpemUgKi8KKyAgICBhdmlvX3diMTYocGIsIHRyYWNrLT5sYW5ndWFnZSk7ICAgICAgICAgICAgICAgIC8qIGxhbmdjb2RlICovCisgICAgYXZpb193cml0ZShwYiwgcmVlbF9uYW1lLCBzdHJfc2l6ZSk7ICAgICAgICAgICAvKiByZWVsIG5hbWUgKi8KKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIscG9zKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfdG1jZF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworI2lmIDEKKyAgICBpbnQgZnJhbWVfZHVyYXRpb24gPSBhdl9yZXNjYWxlKHRyYWNrLT50aW1lc2NhbGUsIHRyYWNrLT5lbmMtPnRpbWVfYmFzZS5udW0sIHRyYWNrLT5lbmMtPnRpbWVfYmFzZS5kZW4pOworICAgIGludCBuYl9mcmFtZXMgPSAxLjAvYXZfcTJkKHRyYWNrLT5lbmMtPnRpbWVfYmFzZSkgKyAwLjU7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBOVUxMOworCisgICAgaWYgKG5iX2ZyYW1lcyA+IDI1NSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiZnBzICVkIGlzIHRvbyBsYXJnZVxuIiwgbmJfZnJhbWVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAidG1jZCIpOyAgICAgICAgICAgICAgIC8qIERhdGEgZm9ybWF0ICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCisgICAgYXZpb193YjMyKHBiLCAxKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgcmVmZXJlbmNlIGluZGV4ICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWdzICovCisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+dGltZWNvZGVfZmxhZ3MpOyAgIC8qIEZsYWdzICh0aW1lY29kZSkgKi8KKyAgICBhdmlvX3diMzIocGIsIHRyYWNrLT50aW1lc2NhbGUpOyAgICAgICAgLyogVGltZXNjYWxlICovCisgICAgYXZpb193YjMyKHBiLCBmcmFtZV9kdXJhdGlvbik7ICAgICAgICAgIC8qIEZyYW1lIGR1cmF0aW9uICovCisgICAgYXZpb193OChwYiwgbmJfZnJhbWVzKTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICBhdmlvX3c4KHBiLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKworICAgIGlmICh0cmFjay0+c3QpCisgICAgICAgIHQgPSBhdl9kaWN0X2dldCh0cmFjay0+c3QtPm1ldGFkYXRhLCAicmVlbF9uYW1lIiwgTlVMTCwgMCk7CisKKyAgICBpZiAodCAmJiB1dGY4bGVuKHQtPnZhbHVlKSkKKyAgICAgICAgbW92X3dyaXRlX3NvdXJjZV9yZWZlcmVuY2VfdGFnKHBiLCB0cmFjaywgdC0+dmFsdWUpOworICAgIGVsc2UKKyAgICAgICAgYXZpb193YjE2KHBiLCAwKTsgLyogemVybyBzaXplICovCisjZWxzZQorCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInRtY2QiKTsgICAgICAgICAgICAgICAvKiBEYXRhIGZvcm1hdCAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLworICAgIGF2aW9fd2IzMihwYiwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIHJlZmVyZW5jZSBpbmRleCAqLworICAgIGlmICh0cmFjay0+ZW5jLT5leHRyYWRhdGFfc2l6ZSkKKyAgICAgICAgYXZpb193cml0ZShwYiwgdHJhY2stPmVuYy0+ZXh0cmFkYXRhLCB0cmFjay0+ZW5jLT5leHRyYWRhdGFfc2l6ZSk7CisjZW5kaWYKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3N0c2RfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAic3RzZCIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHZlcnNpb24gJiBmbGFncyAqLworICAgIGF2aW9fd2IzMihwYiwgMSk7IC8qIGVudHJ5IGNvdW50ICovCisgICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICBtb3Zfd3JpdGVfdmlkZW9fdGFnKHBiLCB0cmFjayk7CisgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgIG1vdl93cml0ZV9hdWRpb190YWcocGIsIHRyYWNrKTsKKyAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKKyAgICAgICAgbW92X3dyaXRlX3N1YnRpdGxlX3RhZyhwYiwgdHJhY2spOworICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3RhZyA9PSBNS1RBRygncicsJ3QnLCdwJywnICcpKQorICAgICAgICBtb3Zfd3JpdGVfcnRwX3RhZyhwYiwgdHJhY2spOworICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3RhZyA9PSBNS1RBRygndCcsJ20nLCdjJywnZCcpKQorICAgICAgICBtb3Zfd3JpdGVfdG1jZF90YWcocGIsIHRyYWNrKTsKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2N0dHNfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIE1PVlN0dHMgKmN0dHNfZW50cmllczsKKyAgICB1aW50MzJfdCBlbnRyaWVzID0gMDsKKyAgICB1aW50MzJfdCBhdG9tX3NpemU7CisgICAgaW50IGk7CisKKyAgICBjdHRzX2VudHJpZXMgPSBhdl9tYWxsb2NfYXJyYXkoKHRyYWNrLT5lbnRyeSArIDEpLCBzaXplb2YoKmN0dHNfZW50cmllcykpOyAvKiB3b3JzdCBjYXNlICovCisgICAgY3R0c19lbnRyaWVzWzBdLmNvdW50ID0gMTsKKyAgICBjdHRzX2VudHJpZXNbMF0uZHVyYXRpb24gPSB0cmFjay0+Y2x1c3RlclswXS5jdHM7CisgICAgZm9yIChpID0gMTsgaSA8IHRyYWNrLT5lbnRyeTsgaSsrKSB7CisgICAgICAgIGlmICh0cmFjay0+Y2x1c3RlcltpXS5jdHMgPT0gY3R0c19lbnRyaWVzW2VudHJpZXNdLmR1cmF0aW9uKSB7CisgICAgICAgICAgICBjdHRzX2VudHJpZXNbZW50cmllc10uY291bnQrKzsgLyogY29tcHJlc3MgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudHJpZXMrKzsKKyAgICAgICAgICAgIGN0dHNfZW50cmllc1tlbnRyaWVzXS5kdXJhdGlvbiA9IHRyYWNrLT5jbHVzdGVyW2ldLmN0czsKKyAgICAgICAgICAgIGN0dHNfZW50cmllc1tlbnRyaWVzXS5jb3VudCA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZW50cmllcysrOyAvKiBsYXN0IG9uZSAqLworICAgIGF0b21fc2l6ZSA9IDE2ICsgKGVudHJpZXMgKiA4KTsKKyAgICBhdmlvX3diMzIocGIsIGF0b21fc2l6ZSk7IC8qIHNpemUgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJjdHRzIik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogdmVyc2lvbiAmIGZsYWdzICovCisgICAgYXZpb193YjMyKHBiLCBlbnRyaWVzKTsgLyogZW50cnkgY291bnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisgICAgICAgIGF2aW9fd2IzMihwYiwgY3R0c19lbnRyaWVzW2ldLmNvdW50KTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBjdHRzX2VudHJpZXNbaV0uZHVyYXRpb24pOworICAgIH0KKyAgICBhdl9mcmVlKGN0dHNfZW50cmllcyk7CisgICAgcmV0dXJuIGF0b21fc2l6ZTsKK30KKworLyogVGltZSB0byBzYW1wbGUgYXRvbSAqLworc3RhdGljIGludCBtb3Zfd3JpdGVfc3R0c190YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgTU9WU3R0cyAqc3R0c19lbnRyaWVzOworICAgIHVpbnQzMl90IGVudHJpZXMgPSAtMTsKKyAgICB1aW50MzJfdCBhdG9tX3NpemU7CisgICAgaW50IGk7CisKKyAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgIXRyYWNrLT5hdWRpb192YnIpIHsKKyAgICAgICAgc3R0c19lbnRyaWVzID0gYXZfbWFsbG9jKHNpemVvZigqc3R0c19lbnRyaWVzKSk7IC8qIG9uZSBlbnRyeSAqLworICAgICAgICBzdHRzX2VudHJpZXNbMF0uY291bnQgPSB0cmFjay0+c2FtcGxlX2NvdW50OworICAgICAgICBzdHRzX2VudHJpZXNbMF0uZHVyYXRpb24gPSAxOworICAgICAgICBlbnRyaWVzID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHRzX2VudHJpZXMgPSB0cmFjay0+ZW50cnkgPworICAgICAgICAgICAgICAgICAgICAgICBhdl9tYWxsb2NfYXJyYXkodHJhY2stPmVudHJ5LCBzaXplb2YoKnN0dHNfZW50cmllcykpIDogLyogd29yc3QgY2FzZSAqLworICAgICAgICAgICAgICAgICAgICAgICBOVUxMOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHJhY2stPmVudHJ5OyBpKyspIHsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IGdldF9jbHVzdGVyX2R1cmF0aW9uKHRyYWNrLCBpKTsKKyAgICAgICAgICAgIGlmIChpICYmIGR1cmF0aW9uID09IHN0dHNfZW50cmllc1tlbnRyaWVzXS5kdXJhdGlvbikgeworICAgICAgICAgICAgICAgIHN0dHNfZW50cmllc1tlbnRyaWVzXS5jb3VudCsrOyAvKiBjb21wcmVzcyAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbnRyaWVzKys7CisgICAgICAgICAgICAgICAgc3R0c19lbnRyaWVzW2VudHJpZXNdLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgc3R0c19lbnRyaWVzW2VudHJpZXNdLmNvdW50ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbnRyaWVzKys7IC8qIGxhc3Qgb25lICovCisgICAgfQorICAgIGF0b21fc2l6ZSA9IDE2ICsgKGVudHJpZXMgKiA4KTsKKyAgICBhdmlvX3diMzIocGIsIGF0b21fc2l6ZSk7IC8qIHNpemUgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJzdHRzIik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogdmVyc2lvbiAmIGZsYWdzICovCisgICAgYXZpb193YjMyKHBiLCBlbnRyaWVzKTsgLyogZW50cnkgY291bnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc3R0c19lbnRyaWVzW2ldLmNvdW50KTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBzdHRzX2VudHJpZXNbaV0uZHVyYXRpb24pOworICAgIH0KKyAgICBhdl9mcmVlKHN0dHNfZW50cmllcyk7CisgICAgcmV0dXJuIGF0b21fc2l6ZTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfZHJlZl90YWcoQVZJT0NvbnRleHQgKnBiKQoreworICAgIGF2aW9fd2IzMihwYiwgMjgpOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAiZHJlZiIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHZlcnNpb24gJiBmbGFncyAqLworICAgIGF2aW9fd2IzMihwYiwgMSk7IC8qIGVudHJ5IGNvdW50ICovCisKKyAgICBhdmlvX3diMzIocGIsIDB4Yyk7IC8qIHNpemUgKi8KKyAgICAvL0ZJWE1FIGFkZCB0aGUgYWxpcyBhbmQgcnNyYyBhdG9tCisgICAgZmZpb193Zm91cmNjKHBiLCAidXJsICIpOworICAgIGF2aW9fd2IzMihwYiwgMSk7IC8qIHZlcnNpb24gJiBmbGFncyAqLworCisgICAgcmV0dXJuIDI4OworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9zdGJsX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInN0YmwiKTsKKyAgICBtb3Zfd3JpdGVfc3RzZF90YWcocGIsIHRyYWNrKTsKKyAgICBtb3Zfd3JpdGVfc3R0c190YWcocGIsIHRyYWNrKTsKKyAgICBpZiAoKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY190YWcgPT0gTUtUQUcoJ3InLCd0JywncCcsJyAnKSkgJiYKKyAgICAgICAgdHJhY2stPmhhc19rZXlmcmFtZXMgJiYgdHJhY2stPmhhc19rZXlmcmFtZXMgPCB0cmFjay0+ZW50cnkpCisgICAgICAgIG1vdl93cml0ZV9zdHNzX3RhZyhwYiwgdHJhY2ssIE1PVl9TWU5DX1NBTVBMRSk7CisgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfTU9WICYmIHRyYWNrLT5mbGFncyAmIE1PVl9UUkFDS19TVFBTKQorICAgICAgICBtb3Zfd3JpdGVfc3Rzc190YWcocGIsIHRyYWNrLCBNT1ZfUEFSVElBTF9TWU5DX1NBTVBMRSk7CisgICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgICAgIHRyYWNrLT5mbGFncyAmIE1PVl9UUkFDS19DVFRTKQorICAgICAgICBtb3Zfd3JpdGVfY3R0c190YWcocGIsIHRyYWNrKTsKKyAgICBtb3Zfd3JpdGVfc3RzY190YWcocGIsIHRyYWNrKTsKKyAgICBtb3Zfd3JpdGVfc3Rzel90YWcocGIsIHRyYWNrKTsKKyAgICBtb3Zfd3JpdGVfc3Rjb190YWcocGIsIHRyYWNrKTsKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2RpbmZfdGFnKEFWSU9Db250ZXh0ICpwYikKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImRpbmYiKTsKKyAgICBtb3Zfd3JpdGVfZHJlZl90YWcocGIpOworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfbm1oZF90YWcoQVZJT0NvbnRleHQgKnBiKQoreworICAgIGF2aW9fd2IzMihwYiwgMTIpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm5taGQiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOworICAgIHJldHVybiAxMjsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfdGNtaV90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGNvbnN0IGNoYXIgKmZvbnQgPSAiTHVjaWRhIEdyYW5kZSI7CisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInRjbWkiKTsgICAgICAgICAgIC8qIHRpbWVjb2RlIG1lZGlhIGluZm9ybWF0aW9uIGF0b20gKi8KKyAgICBhdmlvX3diMzIocGIsIDApOyAgICAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uICYgZmxhZ3MgKi8KKyAgICBhdmlvX3diMTYocGIsIDApOyAgICAgICAgICAgICAgICAgICAvKiB0ZXh0IGZvbnQgKi8KKyAgICBhdmlvX3diMTYocGIsIDApOyAgICAgICAgICAgICAgICAgICAvKiB0ZXh0IGZhY2UgKi8KKyAgICBhdmlvX3diMTYocGIsIDEyKTsgICAgICAgICAgICAgICAgICAvKiB0ZXh0IHNpemUgKi8KKyAgICBhdmlvX3diMTYocGIsIDApOyAgICAgICAgICAgICAgICAgICAvKiAodW5rbm93biwgbm90IGluIHRoZSBRVCBzcGVjcy4uLikgKi8KKyAgICBhdmlvX3diMTYocGIsIDB4MDAwMCk7ICAgICAgICAgICAgICAvKiB0ZXh0IGNvbG9yIChyZWQpICovCisgICAgYXZpb193YjE2KHBiLCAweDAwMDApOyAgICAgICAgICAgICAgLyogdGV4dCBjb2xvciAoZ3JlZW4pICovCisgICAgYXZpb193YjE2KHBiLCAweDAwMDApOyAgICAgICAgICAgICAgLyogdGV4dCBjb2xvciAoYmx1ZSkgKi8KKyAgICBhdmlvX3diMTYocGIsIDB4ZmZmZik7ICAgICAgICAgICAgICAvKiBiYWNrZ3JvdW5kIGNvbG9yIChyZWQpICovCisgICAgYXZpb193YjE2KHBiLCAweGZmZmYpOyAgICAgICAgICAgICAgLyogYmFja2dyb3VuZCBjb2xvciAoZ3JlZW4pICovCisgICAgYXZpb193YjE2KHBiLCAweGZmZmYpOyAgICAgICAgICAgICAgLyogYmFja2dyb3VuZCBjb2xvciAoYmx1ZSkgKi8KKyAgICBhdmlvX3c4KHBiLCBzdHJsZW4oZm9udCkpOyAgICAgICAgICAvKiBmb250IGxlbiAocGFydCBvZiB0aGUgcGFzY2FsIHN0cmluZykgKi8KKyAgICBhdmlvX3dyaXRlKHBiLCBmb250LCBzdHJsZW4oZm9udCkpOyAvKiBmb250IG5hbWUgKi8KKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2dtaGRfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAgICAgIC8qIHNpemUgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJnbWhkIik7CisgICAgYXZpb193YjMyKHBiLCAweDE4KTsgICAvKiBnbWluIHNpemUgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJnbWluIik7LyogZ2VuZXJpYyBtZWRpYSBpbmZvICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAvKiB2ZXJzaW9uICYgZmxhZ3MgKi8KKyAgICBhdmlvX3diMTYocGIsIDB4NDApOyAgIC8qIGdyYXBoaWNzIG1vZGUgPSAqLworICAgIGF2aW9fd2IxNihwYiwgMHg4MDAwKTsgLyogb3BDb2xvciAocj8pICovCisgICAgYXZpb193YjE2KHBiLCAweDgwMDApOyAvKiBvcENvbG9yIChnPykgKi8KKyAgICBhdmlvX3diMTYocGIsIDB4ODAwMCk7IC8qIG9wQ29sb3IgKGI/KSAqLworICAgIGF2aW9fd2IxNihwYiwgMCk7ICAgICAgLyogYmFsYW5jZSAqLworICAgIGF2aW9fd2IxNihwYiwgMCk7ICAgICAgLyogcmVzZXJ2ZWQgKi8KKworICAgIC8qCisgICAgICogVGhpcyBzcGVjaWFsIHRleHQgYXRvbSBpcyByZXF1aXJlZCBmb3IKKyAgICAgKiBBcHBsZSBRdWlja3RpbWUgY2hhcHRlcnMuIFRoZSBjb250ZW50cworICAgICAqIGRvbid0IGFwcGVhciB0byBiZSBkb2N1bWVudGVkLCBzbyB0aGUKKyAgICAgKiBieXRlcyBhcmUgY29waWVkIHZlcmJhdGltLgorICAgICAqLworICAgIGlmICh0cmFjay0+dGFnICE9IE1LVEFHKCdjJywnNicsJzAnLCc4JykpIHsKKyAgICBhdmlvX3diMzIocGIsIDB4MkMpOyAgIC8qIHNpemUgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJ0ZXh0Iik7CisgICAgYXZpb193YjE2KHBiLCAweDAxKTsKKyAgICBhdmlvX3diMzIocGIsIDB4MDApOworICAgIGF2aW9fd2IzMihwYiwgMHgwMCk7CisgICAgYXZpb193YjMyKHBiLCAweDAwKTsKKyAgICBhdmlvX3diMzIocGIsIDB4MDEpOworICAgIGF2aW9fd2IzMihwYiwgMHgwMCk7CisgICAgYXZpb193YjMyKHBiLCAweDAwKTsKKyAgICBhdmlvX3diMzIocGIsIDB4MDApOworICAgIGF2aW9fd2IzMihwYiwgMHgwMDAwNDAwMCk7CisgICAgYXZpb193YjE2KHBiLCAweDAwMDApOworICAgIH0KKworICAgIGlmICh0cmFjay0+ZW5jLT5jb2RlY190YWcgPT0gTUtUQUcoJ3QnLCdtJywnYycsJ2QnKSkgeworICAgICAgICBpbnQ2NF90IHRtY2RfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJ0bWNkIik7CisgICAgICAgIG1vdl93cml0ZV90Y21pX3RhZyhwYiwgdHJhY2spOworICAgICAgICB1cGRhdGVfc2l6ZShwYiwgdG1jZF9wb3MpOworICAgIH0KKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3NtaGRfdGFnKEFWSU9Db250ZXh0ICpwYikKK3sKKyAgICBhdmlvX3diMzIocGIsIDE2KTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInNtaGQiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiB2ZXJzaW9uICYgZmxhZ3MgKi8KKyAgICBhdmlvX3diMTYocGIsIDApOyAvKiByZXNlcnZlZCAoYmFsYW5jZSwgbm9ybWFsbHkgPSAwKSAqLworICAgIGF2aW9fd2IxNihwYiwgMCk7IC8qIHJlc2VydmVkICovCisgICAgcmV0dXJuIDE2OworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV92bWhkX3RhZyhBVklPQ29udGV4dCAqcGIpCit7CisgICAgYXZpb193YjMyKHBiLCAweDE0KTsgLyogc2l6ZSAoYWx3YXlzIDB4MTQpICovCisgICAgZmZpb193Zm91cmNjKHBiLCAidm1oZCIpOworICAgIGF2aW9fd2IzMihwYiwgMHgwMSk7IC8qIHZlcnNpb24gJiBmbGFncyAqLworICAgIGF2aW9fd2I2NChwYiwgMCk7IC8qIHJlc2VydmVkIChncmFwaGljcyBtb2RlID0gY29weSkgKi8KKyAgICByZXR1cm4gMHgxNDsKK30KKworc3RhdGljIGludCBpc19jbGNwX3RyYWNrKE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICByZXR1cm4gdHJhY2stPnRhZyA9PSBNS1RBRygnYycsJzcnLCcwJywnOCcpIHx8CisgICAgICAgICAgIHRyYWNrLT50YWcgPT0gTUtUQUcoJ2MnLCc2JywnMCcsJzgnKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfaGRscl90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgY29uc3QgY2hhciAqaGRsciwgKmRlc2NyID0gTlVMTCwgKmhkbHJfdHlwZSA9IE5VTEw7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgaGRsciAgICAgID0gImRobHIiOworICAgIGhkbHJfdHlwZSA9ICJ1cmwgIjsKKyAgICBkZXNjciAgICAgPSAiRGF0YUhhbmRsZXIiOworCisgICAgaWYgKHRyYWNrKSB7CisgICAgICAgIGhkbHIgPSAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YpID8gIm1obHIiIDogIlwwXDBcMFwwIjsKKyAgICAgICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBoZGxyX3R5cGUgPSAidmlkZSI7CisgICAgICAgICAgICBkZXNjciAgICAgPSAiVmlkZW9IYW5kbGVyIjsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgaGRscl90eXBlID0gInNvdW4iOworICAgICAgICAgICAgZGVzY3IgICAgID0gIlNvdW5kSGFuZGxlciI7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgICAgIGlmIChpc19jbGNwX3RyYWNrKHRyYWNrKSkgeworICAgICAgICAgICAgICAgIGhkbHJfdHlwZSA9ICJjbGNwIjsKKyAgICAgICAgICAgICAgICBkZXNjciA9ICJDbG9zZWRDYXB0aW9uSGFuZGxlciI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+dGFnID09IE1LVEFHKCd0JywneCcsJzMnLCdnJykpIHsKKyAgICAgICAgICAgICAgICAgICAgaGRscl90eXBlID0gInNidGwiOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPnRhZyA9PSBNS1RBRygnbScsJ3AnLCc0JywncycpKSB7CisgICAgICAgICAgICAgICAgICAgIGhkbHJfdHlwZSA9ICJzdWJwIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBoZGxyX3R5cGUgPSAidGV4dCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzY3IgPSAiU3VidGl0bGVIYW5kbGVyIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190YWcgPT0gTUtUQUcoJ3InLCd0JywncCcsJyAnKSkgeworICAgICAgICAgICAgaGRscl90eXBlID0gImhpbnQiOworICAgICAgICAgICAgZGVzY3IgICAgID0gIkhpbnRIYW5kbGVyIjsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190YWcgPT0gTUtUQUcoJ3QnLCdtJywnYycsJ2QnKSkgeworICAgICAgICAgICAgaGRscl90eXBlID0gInRtY2QiOworICAgICAgICAgICAgZGVzY3IgPSAiVGltZUNvZGVIYW5kbGVyIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgdGFnX2J1ZlszMl07CisgICAgICAgICAgICBhdl9nZXRfY29kZWNfdGFnX3N0cmluZyh0YWdfYnVmLCBzaXplb2YodGFnX2J1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY190YWcpOworCisgICAgICAgICAgICBhdl9sb2codHJhY2stPmVuYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIlVua25vd24gaGxkcl90eXBlIGZvciAlcyAvIDB4JTA0WCwgd3JpdGluZyBkdW1teSB2YWx1ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgdGFnX2J1ZiwgdHJhY2stPmVuYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhY2stPnN0KSB7CisgICAgICAgICAgICAvLyBoZGxyLm5hbWUgaXMgdXNlZCBieSBzb21lIHBsYXllcnMgdG8gaWRlbnRpZnkgdGhlIGNvbnRlbnQgdGl0bGUKKyAgICAgICAgICAgIC8vIG9mIHRoZSB0cmFjay4gU28gaWYgYW4gYWx0ZXJuYXRlIGhhbmRsZXIgZGVzY3JpcHRpb24gaXMKKyAgICAgICAgICAgIC8vIHNwZWNpZmllZCwgdXNlIGl0LgorICAgICAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQ7CisgICAgICAgICAgICB0ID0gYXZfZGljdF9nZXQodHJhY2stPnN0LT5tZXRhZGF0YSwgImhhbmRsZXIiLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmICh0ICYmIHV0ZjhsZW4odC0+dmFsdWUpKQorICAgICAgICAgICAgICAgIGRlc2NyID0gdC0+dmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAiaGRsciIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIFZlcnNpb24gJiBmbGFncyAqLworICAgIGF2aW9fd3JpdGUocGIsIGhkbHIsIDQpOyAvKiBoYW5kbGVyICovCisgICAgZmZpb193Zm91cmNjKHBiLCBoZGxyX3R5cGUpOyAvKiBoYW5kbGVyIHR5cGUgKi8KKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiByZXNlcnZlZCAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHJlc2VydmVkICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBpZiAoIXRyYWNrIHx8IHRyYWNrLT5tb2RlID09IE1PREVfTU9WKQorICAgICAgICBhdmlvX3c4KHBiLCBzdHJsZW4oZGVzY3IpKTsgLyogcGFzY2FsIHN0cmluZyAqLworICAgIGF2aW9fd3JpdGUocGIsIGRlc2NyLCBzdHJsZW4oZGVzY3IpKTsgLyogaGFuZGxlciBkZXNjcmlwdGlvbiAqLworICAgIGlmICh0cmFjayAmJiB0cmFjay0+bW9kZSAhPSBNT0RFX01PVikKKyAgICAgICAgYXZpb193OChwYiwgMCk7IC8qIGMgc3RyaW5nICovCisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9obWhkX3RhZyhBVklPQ29udGV4dCAqcGIpCit7CisgICAgLyogVGhpcyBhdG9tIG11c3QgYmUgcHJlc2VudCwgYnV0IGxlYXZpbmcgdGhlIHZhbHVlcyBhdCB6ZXJvCisgICAgICogc2VlbXMgaGFybWxlc3MuICovCisgICAgYXZpb193YjMyKHBiLCAyOCk7IC8qIHNpemUgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJobWhkIik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogdmVyc2lvbiwgZmxhZ3MgKi8KKyAgICBhdmlvX3diMTYocGIsIDApOyAvKiBtYXhQRFVzaXplICovCisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogYXZnUERVc2l6ZSAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIG1heGJpdHJhdGUgKi8KKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBhdmdiaXRyYXRlICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICByZXR1cm4gMjg7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX21pbmZfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAibWluZiIpOworICAgIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgbW92X3dyaXRlX3ZtaGRfdGFnKHBiKTsKKyAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgbW92X3dyaXRlX3NtaGRfdGFnKHBiKTsKKyAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBpZiAodHJhY2stPnRhZyA9PSBNS1RBRygndCcsJ2UnLCd4JywndCcpIHx8IGlzX2NsY3BfdHJhY2sodHJhY2spKSB7CisgICAgICAgICAgICBtb3Zfd3JpdGVfZ21oZF90YWcocGIsIHRyYWNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vdl93cml0ZV9ubWhkX3RhZyhwYik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRyYWNrLT50YWcgPT0gTUtUQUcoJ3InLCd0JywncCcsJyAnKSkgeworICAgICAgICBtb3Zfd3JpdGVfaG1oZF90YWcocGIpOworICAgIH0gZWxzZSBpZiAodHJhY2stPnRhZyA9PSBNS1RBRygndCcsJ20nLCdjJywnZCcpKSB7CisgICAgICAgIG1vdl93cml0ZV9nbWhkX3RhZyhwYiwgdHJhY2spOworICAgIH0KKyAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YpIC8qIEZJWE1FOiBXaHkgZG8gaXQgZm9yIE1PREVfTU9WIG9ubHkgPyAqLworICAgICAgICBtb3Zfd3JpdGVfaGRscl90YWcocGIsIE5VTEwpOworICAgIG1vdl93cml0ZV9kaW5mX3RhZyhwYik7CisgICAgbW92X3dyaXRlX3N0YmxfdGFnKHBiLCB0cmFjayk7CisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9tZGhkX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQgdmVyc2lvbiA9IHRyYWNrLT50cmFja19kdXJhdGlvbiA8IElOVDMyX01BWCA/IDAgOiAxOworCisgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfSVNNKQorICAgICAgICB2ZXJzaW9uID0gMTsKKworICAgICh2ZXJzaW9uID09IDEpID8gYXZpb193YjMyKHBiLCA0NCkgOiBhdmlvX3diMzIocGIsIDMyKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1kaGQiKTsKKyAgICBhdmlvX3c4KHBiLCB2ZXJzaW9uKTsKKyAgICBhdmlvX3diMjQocGIsIDApOyAvKiBmbGFncyAqLworICAgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgYXZpb193YjY0KHBiLCB0cmFjay0+dGltZSk7CisgICAgICAgIGF2aW9fd2I2NChwYiwgdHJhY2stPnRpbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPnRpbWUpOyAvKiBjcmVhdGlvbiB0aW1lICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPnRpbWUpOyAvKiBtb2RpZmljYXRpb24gdGltZSAqLworICAgIH0KKyAgICBhdmlvX3diMzIocGIsIHRyYWNrLT50aW1lc2NhbGUpOyAvKiB0aW1lIHNjYWxlIChzYW1wbGUgcmF0ZSBmb3IgYXVkaW8pICovCisgICAgaWYgKCF0cmFjay0+ZW50cnkgJiYgbW92LT5tb2RlID09IE1PREVfSVNNKQorICAgICAgICAodmVyc2lvbiA9PSAxKSA/IGF2aW9fd2I2NChwYiwgVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSkgOiBhdmlvX3diMzIocGIsIDB4ZmZmZmZmZmYpOworICAgIGVsc2UgaWYgKCF0cmFjay0+ZW50cnkpCisgICAgICAgICh2ZXJzaW9uID09IDEpID8gYXZpb193YjY0KHBiLCAwKSA6IGF2aW9fd2IzMihwYiwgMCk7CisgICAgZWxzZQorICAgICAgICAodmVyc2lvbiA9PSAxKSA/IGF2aW9fd2I2NChwYiwgdHJhY2stPnRyYWNrX2R1cmF0aW9uKSA6IGF2aW9fd2IzMihwYiwgdHJhY2stPnRyYWNrX2R1cmF0aW9uKTsgLyogZHVyYXRpb24gKi8KKyAgICBhdmlvX3diMTYocGIsIHRyYWNrLT5sYW5ndWFnZSk7IC8qIGxhbmd1YWdlICovCisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogcmVzZXJ2ZWQgKHF1YWxpdHkpICovCisKKyAgICBpZiAodmVyc2lvbiAhPSAwICYmIHRyYWNrLT5tb2RlID09IE1PREVfTU9WKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRkFUQUwgZXJyb3IsIGZpbGUgZHVyYXRpb24gdG9vIGxvbmcgZm9yIHRpbWViYXNlLCB0aGlzIGZpbGUgd2lsbCBub3QgYmVcbiIKKyAgICAgICAgICAgICAgICJwbGF5YWJsZSB3aXRoIHF1aWNrdGltZS4gQ2hvb3NlIGEgZGlmZmVyZW50IHRpbWViYXNlIG9yIGEgZGlmZmVyZW50XG4iCisgICAgICAgICAgICAgICAiY29udGFpbmVyIGZvcm1hdFxuIik7CisgICAgfQorCisgICAgcmV0dXJuIDMyOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9tZGlhX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1kaWEiKTsKKyAgICBtb3Zfd3JpdGVfbWRoZF90YWcocGIsIG1vdiwgdHJhY2spOworICAgIG1vdl93cml0ZV9oZGxyX3RhZyhwYiwgdHJhY2spOworICAgIG1vdl93cml0ZV9taW5mX3RhZyhwYiwgdHJhY2spOworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworLyogdHJhbnNmb3JtYXRpb24gbWF0cml4CisgICAgIHxhICBiICB1fAorICAgICB8YyAgZCAgdnwKKyAgICAgfHR4IHR5IHd8ICovCitzdGF0aWMgdm9pZCB3cml0ZV9tYXRyaXgoQVZJT0NvbnRleHQgKnBiLCBpbnQxNl90IGEsIGludDE2X3QgYiwgaW50MTZfdCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgZCwgaW50MTZfdCB0eCwgaW50MTZfdCB0eSkKK3sKKyAgICBhdmlvX3diMzIocGIsIGEgPDwgMTYpOyAgLyogMTYuMTYgZm9ybWF0ICovCisgICAgYXZpb193YjMyKHBiLCBiIDw8IDE2KTsgIC8qIDE2LjE2IGZvcm1hdCAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgICAgICAvKiB1IGluIDIuMzAgZm9ybWF0ICovCisgICAgYXZpb193YjMyKHBiLCBjIDw8IDE2KTsgIC8qIDE2LjE2IGZvcm1hdCAqLworICAgIGF2aW9fd2IzMihwYiwgZCA8PCAxNik7ICAvKiAxNi4xNiBmb3JtYXQgKi8KKyAgICBhdmlvX3diMzIocGIsIDApOyAgICAgICAgLyogdiBpbiAyLjMwIGZvcm1hdCAqLworICAgIGF2aW9fd2IzMihwYiwgdHggPDwgMTYpOyAvKiAxNi4xNiBmb3JtYXQgKi8KKyAgICBhdmlvX3diMzIocGIsIHR5IDw8IDE2KTsgLyogMTYuMTYgZm9ybWF0ICovCisgICAgYXZpb193YjMyKHBiLCAxIDw8IDMwKTsgIC8qIHcgaW4gMi4zMCBmb3JtYXQgKi8KK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfdGtoZF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT1ZUcmFjayAqdHJhY2ssIEFWU3RyZWFtICpzdCkKK3sKKyAgICBpbnQ2NF90IGR1cmF0aW9uID0gYXZfcmVzY2FsZV9ybmQodHJhY2stPnRyYWNrX2R1cmF0aW9uLCBNT1ZfVElNRVNDQUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlLCBBVl9ST1VORF9VUCk7CisgICAgaW50IHZlcnNpb24gPSBkdXJhdGlvbiA8IElOVDMyX01BWCA/IDAgOiAxOworICAgIGludCBmbGFncyAgID0gTU9WX1RLSERfRkxBR19JTl9NT1ZJRTsKKyAgICBpbnQgcm90YXRpb24gPSAwOworICAgIGludCBncm91cCAgID0gMDsKKworCisgICAgaWYgKHN0KSB7CisgICAgICAgIGlmIChtb3YtPnBlcl9zdHJlYW1fZ3JvdXBpbmcpCisgICAgICAgICAgICBncm91cCA9IHN0LT5pbmRleDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ3JvdXAgPSBzdC0+Y29kZWMtPmNvZGVjX3R5cGU7CisgICAgfQorCisgICAgaWYgKHRyYWNrLT5mbGFncyAmIE1PVl9UUkFDS19FTkFCTEVEKQorICAgICAgICBmbGFncyB8PSBNT1ZfVEtIRF9GTEFHX0VOQUJMRUQ7CisKKyAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9JU00pCisgICAgICAgIHZlcnNpb24gPSAxOworCisgICAgKHZlcnNpb24gPT0gMSkgPyBhdmlvX3diMzIocGIsIDEwNCkgOiBhdmlvX3diMzIocGIsIDkyKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInRraGQiKTsKKyAgICBhdmlvX3c4KHBiLCB2ZXJzaW9uKTsKKyAgICBhdmlvX3diMjQocGIsIGZsYWdzKTsKKyAgICBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgIGF2aW9fd2I2NChwYiwgdHJhY2stPnRpbWUpOworICAgICAgICBhdmlvX3diNjQocGIsIHRyYWNrLT50aW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT50aW1lKTsgLyogY3JlYXRpb24gdGltZSAqLworICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT50aW1lKTsgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi8KKyAgICB9CisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+dHJhY2tfaWQpOyAvKiB0cmFjay1pZCAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHJlc2VydmVkICovCisgICAgaWYgKCF0cmFjay0+ZW50cnkgJiYgbW92LT5tb2RlID09IE1PREVfSVNNKQorICAgICAgICAodmVyc2lvbiA9PSAxKSA/IGF2aW9fd2I2NChwYiwgVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSkgOiBhdmlvX3diMzIocGIsIDB4ZmZmZmZmZmYpOworICAgIGVsc2UgaWYgKCF0cmFjay0+ZW50cnkpCisgICAgICAgICh2ZXJzaW9uID09IDEpID8gYXZpb193YjY0KHBiLCAwKSA6IGF2aW9fd2IzMihwYiwgMCk7CisgICAgZWxzZQorICAgICAgICAodmVyc2lvbiA9PSAxKSA/IGF2aW9fd2I2NChwYiwgZHVyYXRpb24pIDogYXZpb193YjMyKHBiLCBkdXJhdGlvbik7CisKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiByZXNlcnZlZCAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHJlc2VydmVkICovCisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogbGF5ZXIgKi8KKyAgICBhdmlvX3diMTYocGIsIGdyb3VwKTsgLyogYWx0ZXJuYXRlIGdyb3VwKSAqLworICAgIC8qIFZvbHVtZSwgb25seSBmb3IgYXVkaW8gKi8KKyAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgIGF2aW9fd2IxNihwYiwgMHgwMTAwKTsKKyAgICBlbHNlCisgICAgICAgIGF2aW9fd2IxNihwYiwgMCk7CisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKworICAgIC8qIE1hdHJpeCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoc3QgJiYgc3QtPm1ldGFkYXRhKSB7CisgICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICpyb3QgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJyb3RhdGUiLCBOVUxMLCAwKTsKKyAgICAgICAgcm90YXRpb24gPSAocm90ICYmIHJvdC0+dmFsdWUpID8gYXRvaShyb3QtPnZhbHVlKSA6IDA7CisgICAgfQorICAgIGlmIChyb3RhdGlvbiA9PSA5MCkgeworICAgICAgICB3cml0ZV9tYXRyaXgocGIsICAwLCAgMSwgLTEsICAwLCB0cmFjay0+ZW5jLT5oZWlnaHQsIDApOworICAgIH0gZWxzZSBpZiAocm90YXRpb24gPT0gMTgwKSB7CisgICAgICAgIHdyaXRlX21hdHJpeChwYiwgLTEsICAwLCAgMCwgLTEsIHRyYWNrLT5lbmMtPndpZHRoLCB0cmFjay0+ZW5jLT5oZWlnaHQpOworICAgIH0gZWxzZSBpZiAocm90YXRpb24gPT0gMjcwKSB7CisgICAgICAgIHdyaXRlX21hdHJpeChwYiwgIDAsIC0xLCAgMSwgIDAsIDAsIHRyYWNrLT5lbmMtPndpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZV9tYXRyaXgocGIsICAxLCAgMCwgIDAsICAxLCAwLCAwKTsKKyAgICB9CisgICAgLyogVHJhY2sgd2lkdGggYW5kIGhlaWdodCwgZm9yIHZpc3VhbCBvbmx5ICovCisgICAgaWYgKHN0ICYmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fAorICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpKSB7CisgICAgICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01PVikgeworICAgICAgICAgICAgYXZpb193YjMyKHBiLCB0cmFjay0+ZW5jLT53aWR0aCA8PCAxNik7CisgICAgICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5oZWlnaHQgPDwgMTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG91YmxlIHNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhdl9xMmQoc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworICAgICAgICAgICAgaWYgKCFzYW1wbGVfYXNwZWN0X3JhdGlvIHx8IHRyYWNrLT5oZWlnaHQgIT0gdHJhY2stPmVuYy0+aGVpZ2h0KQorICAgICAgICAgICAgICAgIHNhbXBsZV9hc3BlY3RfcmF0aW8gPSAxOworICAgICAgICAgICAgYXZpb193YjMyKHBiLCBzYW1wbGVfYXNwZWN0X3JhdGlvICogdHJhY2stPmVuYy0+d2lkdGggKiAweDEwMDAwKTsKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPmhlaWdodCAqIDB4MTAwMDApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIDB4NWM7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3RhcHRfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludDMyX3Qgd2lkdGggPSBhdl9yZXNjYWxlKHRyYWNrLT5lbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCB0cmFjay0+ZW5jLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAidGFwdCIpOworCisgICAgYXZpb193YjMyKHBiLCAyMCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAiY2xlZiIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgYXZpb193YjMyKHBiLCB3aWR0aCA8PCAxNik7CisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+ZW5jLT5oZWlnaHQgPDwgMTYpOworCisgICAgYXZpb193YjMyKHBiLCAyMCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAicHJvZiIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgYXZpb193YjMyKHBiLCB3aWR0aCA8PCAxNik7CisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+ZW5jLT5oZWlnaHQgPDwgMTYpOworCisgICAgYXZpb193YjMyKHBiLCAyMCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAiZW5vZiIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+ZW5jLT53aWR0aCA8PCAxNik7CisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+ZW5jLT5oZWlnaHQgPDwgMTYpOworCisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCisvLyBUaGlzIGJveCBzZWVtcyBpbXBvcnRhbnQgZm9yIHRoZSBwc3AgcGxheWJhY2sgLi4uIHdpdGhvdXQgaXQgdGhlIG1vdmllIHNlZW1zIHRvIGhhbmcKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2VkdHNfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludDY0X3QgZHVyYXRpb24gPSBhdl9yZXNjYWxlX3JuZCh0cmFjay0+dHJhY2tfZHVyYXRpb24sIE1PVl9USU1FU0NBTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUsIEFWX1JPVU5EX1VQKTsKKyAgICBpbnQgdmVyc2lvbiA9IGR1cmF0aW9uIDwgSU5UMzJfTUFYID8gMCA6IDE7CisgICAgaW50IGVudHJ5X3NpemUsIGVudHJ5X2NvdW50LCBzaXplOworICAgIGludDY0X3QgZGVsYXksIHN0YXJ0X2N0ID0gdHJhY2stPmNsdXN0ZXJbMF0uY3RzOworICAgIGRlbGF5ID0gYXZfcmVzY2FsZV9ybmQodHJhY2stPmNsdXN0ZXJbMF0uZHRzICsgc3RhcnRfY3QsIE1PVl9USU1FU0NBTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlLCBBVl9ST1VORF9ET1dOKTsKKyAgICB2ZXJzaW9uIHw9IGRlbGF5IDwgSU5UMzJfTUFYID8gMCA6IDE7CisKKyAgICBlbnRyeV9zaXplID0gKHZlcnNpb24gPT0gMSkgPyAyMCA6IDEyOworICAgIGVudHJ5X2NvdW50ID0gMSArIChkZWxheSA+IDApOworICAgIHNpemUgPSAyNCArIGVudHJ5X2NvdW50ICogZW50cnlfc2l6ZTsKKworICAgIC8qIHdyaXRlIHRoZSBhdG9tIGRhdGEgKi8KKyAgICBhdmlvX3diMzIocGIsIHNpemUpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImVkdHMiKTsKKyAgICBhdmlvX3diMzIocGIsIHNpemUgLSA4KTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJlbHN0Iik7CisgICAgYXZpb193OChwYiwgdmVyc2lvbik7CisgICAgYXZpb193YjI0KHBiLCAwKTsgLyogZmxhZ3MgKi8KKworICAgIGF2aW9fd2IzMihwYiwgZW50cnlfY291bnQpOworICAgIGlmIChkZWxheSA+IDApIHsgLyogYWRkIGFuIGVtcHR5IGVkaXQgdG8gZGVsYXkgcHJlc2VudGF0aW9uICovCisgICAgICAgIC8qIEluIHRoZSBwb3NpdGl2ZSBkZWxheSBjYXNlLCB0aGUgZGVsYXkgaW5jbHVkZXMgdGhlIGN0cworICAgICAgICAgKiBvZmZzZXQsIGFuZCB0aGUgc2Vjb25kIGVkaXQgbGlzdCBlbnRyeSBiZWxvdyB0cmltcyBvdXQKKyAgICAgICAgICogdGhlIHNhbWUgYW1vdW50IGZyb20gdGhlIGFjdHVhbCBjb250ZW50LiBUaGlzIG1ha2VzIHN1cmUKKyAgICAgICAgICogdGhhdCB0aGUgb2Zmc2V0dGVkIGxhc3Qgc2FtcGxlIGlzIGluY2x1ZGVkIGluIHRoZSBlZGl0CisgICAgICAgICAqIGxpc3QgZHVyYXRpb24gYXMgd2VsbC4gKi8KKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgYXZpb193YjY0KHBiLCBkZWxheSk7CisgICAgICAgICAgICBhdmlvX3diNjQocGIsIC0xKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgZGVsYXkpOworICAgICAgICAgICAgYXZpb193YjMyKHBiLCAtMSk7CisgICAgICAgIH0KKyAgICAgICAgYXZpb193YjMyKHBiLCAweDAwMDEwMDAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBBdm9pZCBhY2NpZGVudGFsbHkgZW5kaW5nIHVwIHdpdGggc3RhcnRfY3QgPSAtMSB3aGljaCBoYXMgZ290IGEKKyAgICAgICAgICogc3BlY2lhbCBtZWFuaW5nLiBOb3JtYWxseSBzdGFydF9jdCBzaG91bGQgZW5kIHVwIHBvc2l0aXZlIG9yIHplcm8KKyAgICAgICAgICogaGVyZSwgYnV0IHVzZSBGRk1JTiBpbiBjYXNlIGR0cyBpcyBhIGEgc21hbGwgcG9zaXRpdmUgaW50ZWdlcgorICAgICAgICAgKiByb3VuZGVkIHRvIDAgd2hlbiByZXByZXNlbnRlZCBpbiBNT1ZfVElNRVNDQUxFIHVuaXRzLiAqLworICAgICAgICBhdl9hc3NlcnQwKGF2X3Jlc2NhbGVfcm5kKHRyYWNrLT5jbHVzdGVyWzBdLmR0cywgTU9WX1RJTUVTQ0FMRSwgdHJhY2stPnRpbWVzY2FsZSwgQVZfUk9VTkRfRE9XTikgPD0gMCk7CisgICAgICAgIHN0YXJ0X2N0ICA9IC1GRk1JTih0cmFjay0+Y2x1c3RlclswXS5kdHMsIDApOworICAgICAgICAvKiBOb3RlLCB0aGlzIGRlbGF5IGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcHRzIG9mIHRoZSBmaXJzdCBzYW1wbGUsCisgICAgICAgICAqIGVuc3VyaW5nIHRoYXQgd2UgZG9uJ3QgcmVkdWNlIHRoZSBkdXJhdGlvbiBmb3IgY2FzZXMgd2l0aAorICAgICAgICAgKiBkdHM8MCBwdHM9MC4gKi8KKyAgICAgICAgZHVyYXRpb24gKz0gZGVsYXk7CisgICAgfQorCisgICAgLyogRm9yIGZyYWdtZW50ZWQgZmlsZXMsIHdlIGRvbid0IGtub3cgdGhlIGZ1bGwgbGVuZ3RoIHlldC4gU2V0dGluZworICAgICAqIGR1cmF0aW9uIHRvIDAgYWxsb3dzIHVzIHRvIG9ubHkgc3BlY2lmeSB0aGUgb2Zmc2V0LCBpbmNsdWRpbmcKKyAgICAgKiB0aGUgcmVzdCBvZiB0aGUgY29udGVudCAoZnJvbSBhbGwgZnV0dXJlIGZyYWdtZW50cykgd2l0aG91dCBzcGVjaWZ5aW5nCisgICAgICogYW4gZXhwbGljaXQgZHVyYXRpb24uICovCisgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19GUkFHTUVOVCkKKyAgICAgICAgZHVyYXRpb24gPSAwOworCisgICAgLyogZHVyYXRpb24gKi8KKyAgICBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgIGF2aW9fd2I2NChwYiwgZHVyYXRpb24pOworICAgICAgICBhdmlvX3diNjQocGIsIHN0YXJ0X2N0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3diMzIocGIsIGR1cmF0aW9uKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBzdGFydF9jdCk7CisgICAgfQorICAgIGF2aW9fd2IzMihwYiwgMHgwMDAxMDAwMCk7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3RyZWZfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGF2aW9fd2IzMihwYiwgMjApOyAgIC8vIHNpemUKKyAgICBmZmlvX3dmb3VyY2MocGIsICJ0cmVmIik7CisgICAgYXZpb193YjMyKHBiLCAxMik7ICAgLy8gc2l6ZSAoc3ViYXRvbSkKKyAgICBhdmlvX3dsMzIocGIsIHRyYWNrLT50cmVmX3RhZyk7CisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+dHJlZl9pZCk7CisgICAgcmV0dXJuIDIwOworfQorCisvLyBnb2VzIGF0IHRoZSBlbmQgb2YgZWFjaCB0cmFjayEgIC4uLiBDcml0aWNhbCBmb3IgUFNQIHBsYXliYWNrICgiSW5jb21wYXRpYmxlIGRhdGEiIHdpdGhvdXQgaXQpCitzdGF0aWMgaW50IG1vdl93cml0ZV91dWlkX3RhZ19wc3AoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqbW92KQoreworICAgIGF2aW9fd2IzMihwYiwgMHgzNCk7IC8qIHNpemUgLi4uIHJlcG9ydHMgYXMgMjggaW4gbXA0Ym94ISAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInV1aWQiKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJVU01UIik7CisgICAgYXZpb193YjMyKHBiLCAweDIxZDI0ZmNlKTsKKyAgICBhdmlvX3diMzIocGIsIDB4YmI4ODY5NWMpOworICAgIGF2aW9fd2IzMihwYiwgMHhmYWM5Yzc0MCk7CisgICAgYXZpb193YjMyKHBiLCAweDFjKTsgICAgIC8vIGFub3RoZXIgc2l6ZSBoZXJlIQorICAgIGZmaW9fd2ZvdXJjYyhwYiwgIk1URFQiKTsKKyAgICBhdmlvX3diMzIocGIsIDB4MDAwMTAwMTIpOworICAgIGF2aW9fd2IzMihwYiwgMHgwYSk7CisgICAgYXZpb193YjMyKHBiLCAweDU1YzQwMDAwKTsKKyAgICBhdmlvX3diMzIocGIsIDB4MSk7CisgICAgYXZpb193YjMyKHBiLCAweDApOworICAgIHJldHVybiAweDM0OworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV91ZHRhX3NkcChBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKmN0eCA9IHRyYWNrLT5ydHBfY3R4OworICAgIGNoYXIgYnVmWzEwMDBdID0gIiI7CisgICAgaW50IGxlbjsKKworICAgIGZmX3NkcF93cml0ZV9tZWRpYShidWYsIHNpemVvZihidWYpLCBjdHgtPnN0cmVhbXNbMF0sIHRyYWNrLT5zcmNfdHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDAsIDAsIGN0eCk7CisgICAgYXZfc3RybGNhdGYoYnVmLCBzaXplb2YoYnVmKSwgImE9Y29udHJvbDpzdHJlYW1pZD0lZFxyXG4iLCB0cmFjay0+dHJhY2tfaWQpOworICAgIGxlbiA9IHN0cmxlbihidWYpOworCisgICAgYXZpb193YjMyKHBiLCBsZW4gKyAyNCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAidWR0YSIpOworICAgIGF2aW9fd2IzMihwYiwgbGVuICsgMTYpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImhudGkiKTsKKyAgICBhdmlvX3diMzIocGIsIGxlbiArIDgpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInNkcCAiKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBidWYsIGxlbik7CisgICAgcmV0dXJuIGxlbiArIDI0OworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV90cmFja19tZXRhZGF0YShBVklPQ29udGV4dCAqcGIsIEFWU3RyZWFtICpzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqc3RyKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgc3RyLCBOVUxMLCAwKTsKKyAgICBpZiAoIXQgfHwgIXV0ZjhsZW4odC0+dmFsdWUpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgdGFnKTsgLyogdHlwZSAqLworICAgIGF2aW9fd3JpdGUocGIsIHQtPnZhbHVlLCBzdHJsZW4odC0+dmFsdWUpKTsgLyogVVRGOCBzdHJpbmcgdmFsdWUgKi8KKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3RyYWNrX3VkdGFfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0KQoreworICAgIEFWSU9Db250ZXh0ICpwYl9idWY7CisgICAgaW50IHJldCwgc2l6ZTsKKyAgICB1aW50OF90ICpidWY7CisKKyAgICBpZiAoIXN0IHx8IG1vdi0+ZmMtPmZsYWdzICYgQVZGTVRfRkxBR19CSVRFWEFDVCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmcGJfYnVmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChtb3YtPm1vZGUgJiBNT0RFX01QNCkKKyAgICAgICAgbW92X3dyaXRlX3RyYWNrX21ldGFkYXRhKHBiX2J1Ziwgc3QsICJuYW1lIiwgInRpdGxlIik7CisKKyAgICBpZiAoKHNpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYocGJfYnVmLCAmYnVmKSkgPiAwKSB7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc2l6ZSArIDgpOworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJ1ZHRhIik7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIGJ1Ziwgc2l6ZSk7CisgICAgfQorICAgIGF2X2ZyZWUoYnVmKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV90cmFrX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVlRyYWNrICp0cmFjaywgQVZTdHJlYW0gKnN0KQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAidHJhayIpOworICAgIG1vdl93cml0ZV90a2hkX3RhZyhwYiwgbW92LCB0cmFjaywgc3QpOworCisgICAgYXZfYXNzZXJ0Mihtb3YtPnVzZV9lZGl0bGlzdCA+PSAwKTsKKworCisgICAgaWYgKHRyYWNrLT5lbnRyeSkgeworICAgICAgICBpZiAobW92LT51c2VfZWRpdGxpc3QpCisgICAgICAgICAgICBtb3Zfd3JpdGVfZWR0c190YWcocGIsIG1vdiwgdHJhY2spOyAgLy8gUFNQIE1vdmllcyBhbmQgc2V2ZXJhbCBvdGhlciBjYXNlcyByZXF1aXJlIGVkdHMgYm94CisgICAgICAgIGVsc2UgaWYgKCh0cmFjay0+ZW50cnkgJiYgdHJhY2stPmNsdXN0ZXJbMF0uZHRzKSB8fCB0cmFjay0+bW9kZSA9PSBNT0RFX1BTUCB8fCBpc19jbGNwX3RyYWNrKHRyYWNrKSkKKyAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiTm90IHdyaXRpbmcgYW55IGVkaXQgbGlzdCBldmVuIHRob3VnaCBvbmUgd291bGQgaGF2ZSBiZWVuIHJlcXVpcmVkXG4iKTsKKyAgICB9CisKKyAgICBpZiAodHJhY2stPnRyZWZfdGFnKQorICAgICAgICBtb3Zfd3JpdGVfdHJlZl90YWcocGIsIHRyYWNrKTsKKyAgICBtb3Zfd3JpdGVfbWRpYV90YWcocGIsIG1vdiwgdHJhY2spOworICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX1BTUCkKKyAgICAgICAgbW92X3dyaXRlX3V1aWRfdGFnX3BzcChwYiwgdHJhY2spOyAvLyBQU1AgTW92aWVzIHJlcXVpcmUgdGhpcyB1dWlkIGJveAorICAgIGlmICh0cmFjay0+dGFnID09IE1LVEFHKCdyJywndCcsJ3AnLCcgJykpCisgICAgICAgIG1vdl93cml0ZV91ZHRhX3NkcChwYiwgdHJhY2spOworICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01PVikgeworICAgICAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIGRvdWJsZSBzYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfcTJkKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvKTsKKyAgICAgICAgICAgIGlmIChzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gJiYgMS4wICE9IHNhbXBsZV9hc3BlY3RfcmF0aW8pIHsKKyAgICAgICAgICAgICAgICBtb3Zfd3JpdGVfdGFwdF90YWcocGIsIHRyYWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNfY2xjcF90cmFjayh0cmFjaykgJiYgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKSB7CisgICAgICAgICAgICBtb3Zfd3JpdGVfdGFwdF90YWcocGIsIHRyYWNrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtb3Zfd3JpdGVfdHJhY2tfdWR0YV90YWcocGIsIG1vdiwgc3QpOworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfaW9kc190YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YpCit7CisgICAgaW50IGksIGhhc19hdWRpbyA9IDAsIGhhc192aWRlbyA9IDA7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBhdWRpb19wcm9maWxlID0gbW92LT5pb2RzX2F1ZGlvX3Byb2ZpbGU7CisgICAgaW50IHZpZGVvX3Byb2ZpbGUgPSBtb3YtPmlvZHNfdmlkZW9fcHJvZmlsZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKG1vdi0+dHJhY2tzW2ldLmVudHJ5ID4gMCB8fCBtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRU1QVFlfTU9PVikgeworICAgICAgICAgICAgaGFzX2F1ZGlvIHw9IG1vdi0+dHJhY2tzW2ldLmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBoYXNfdmlkZW8gfD0gbW92LT50cmFja3NbaV0uZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYXVkaW9fcHJvZmlsZSA8IDApCisgICAgICAgIGF1ZGlvX3Byb2ZpbGUgPSAweEZGIC0gaGFzX2F1ZGlvOworICAgIGlmICh2aWRlb19wcm9maWxlIDwgMCkKKyAgICAgICAgdmlkZW9fcHJvZmlsZSA9IDB4RkYgLSBoYXNfdmlkZW87CisgICAgYXZpb193YjMyKHBiLCAweDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAiaW9kcyIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgIC8qIHZlcnNpb24gJiBmbGFncyAqLworICAgIHB1dF9kZXNjcihwYiwgMHgxMCwgNyk7CisgICAgYXZpb193YjE2KHBiLCAweDAwNGYpOworICAgIGF2aW9fdzgocGIsIDB4ZmYpOworICAgIGF2aW9fdzgocGIsIDB4ZmYpOworICAgIGF2aW9fdzgocGIsIGF1ZGlvX3Byb2ZpbGUpOworICAgIGF2aW9fdzgocGIsIHZpZGVvX3Byb2ZpbGUpOworICAgIGF2aW9fdzgocGIsIDB4ZmYpOworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfdHJleF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgYXZpb193YjMyKHBiLCAweDIwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInRyZXgiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAgIC8qIHZlcnNpb24gJiBmbGFncyAqLworICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPnRyYWNrX2lkKTsgLyogdHJhY2sgSUQgKi8KKyAgICBhdmlvX3diMzIocGIsIDEpOyAgIC8qIGRlZmF1bHQgc2FtcGxlIGRlc2NyaXB0aW9uIGluZGV4ICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgICAvKiBkZWZhdWx0IHNhbXBsZSBkdXJhdGlvbiAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgLyogZGVmYXVsdCBzYW1wbGUgc2l6ZSAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgLyogZGVmYXVsdCBzYW1wbGUgZmxhZ3MgKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfbXZleF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YpCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBpOworICAgIGF2aW9fd2IzMihwYiwgMHgwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm12ZXgiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIG1vdl93cml0ZV90cmV4X3RhZyhwYiwgJm1vdi0+dHJhY2tzW2ldKTsKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX212aGRfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92KQoreworICAgIGludCBtYXhfdHJhY2tfaWQgPSAxLCBpOworICAgIGludDY0X3QgbWF4X3RyYWNrX2xlbl90ZW1wLCBtYXhfdHJhY2tfbGVuID0gMDsKKyAgICBpbnQgdmVyc2lvbjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpZiAobW92LT50cmFja3NbaV0uZW50cnkgPiAwICYmIG1vdi0+dHJhY2tzW2ldLnRpbWVzY2FsZSkgeworICAgICAgICAgICAgbWF4X3RyYWNrX2xlbl90ZW1wID0gYXZfcmVzY2FsZV9ybmQobW92LT50cmFja3NbaV0udHJhY2tfZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT1ZfVElNRVNDQUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92LT50cmFja3NbaV0udGltZXNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUk9VTkRfVVApOworICAgICAgICAgICAgaWYgKG1heF90cmFja19sZW4gPCBtYXhfdHJhY2tfbGVuX3RlbXApCisgICAgICAgICAgICAgICAgbWF4X3RyYWNrX2xlbiA9IG1heF90cmFja19sZW5fdGVtcDsKKyAgICAgICAgICAgIGlmIChtYXhfdHJhY2tfaWQgPCBtb3YtPnRyYWNrc1tpXS50cmFja19pZCkKKyAgICAgICAgICAgICAgICBtYXhfdHJhY2tfaWQgPSBtb3YtPnRyYWNrc1tpXS50cmFja19pZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZlcnNpb24gPSBtYXhfdHJhY2tfbGVuIDwgVUlOVDMyX01BWCA/IDAgOiAxOworICAgICh2ZXJzaW9uID09IDEpID8gYXZpb193YjMyKHBiLCAxMjApIDogYXZpb193YjMyKHBiLCAxMDgpOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAibXZoZCIpOworICAgIGF2aW9fdzgocGIsIHZlcnNpb24pOworICAgIGF2aW9fd2IyNChwYiwgMCk7IC8qIGZsYWdzICovCisgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICBhdmlvX3diNjQocGIsIG1vdi0+dGltZSk7CisgICAgICAgIGF2aW9fd2I2NChwYiwgbW92LT50aW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3diMzIocGIsIG1vdi0+dGltZSk7IC8qIGNyZWF0aW9uIHRpbWUgKi8KKyAgICAgICAgYXZpb193YjMyKHBiLCBtb3YtPnRpbWUpOyAvKiBtb2RpZmljYXRpb24gdGltZSAqLworICAgIH0KKyAgICBhdmlvX3diMzIocGIsIE1PVl9USU1FU0NBTEUpOworICAgICh2ZXJzaW9uID09IDEpID8gYXZpb193YjY0KHBiLCBtYXhfdHJhY2tfbGVuKSA6IGF2aW9fd2IzMihwYiwgbWF4X3RyYWNrX2xlbik7IC8qIGR1cmF0aW9uIG9mIGxvbmdlc3QgdHJhY2sgKi8KKworICAgIGF2aW9fd2IzMihwYiwgMHgwMDAxMDAwMCk7IC8qIHJlc2VydmVkIChwcmVmZXJyZWQgcmF0ZSkgMS4wID0gbm9ybWFsICovCisgICAgYXZpb193YjE2KHBiLCAweDAxMDApOyAvKiByZXNlcnZlZCAocHJlZmVycmVkIHZvbHVtZSkgMS4wID0gbm9ybWFsICovCisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiByZXNlcnZlZCAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHJlc2VydmVkICovCisKKyAgICAvKiBNYXRyaXggc3RydWN0dXJlICovCisgICAgd3JpdGVfbWF0cml4KHBiLCAxLCAwLCAwLCAxLCAwLCAwKTsKKworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHJlc2VydmVkIChwcmV2aWV3IHRpbWUpICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogcmVzZXJ2ZWQgKHByZXZpZXcgZHVyYXRpb24pICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogcmVzZXJ2ZWQgKHBvc3RlciB0aW1lKSAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHJlc2VydmVkIChzZWxlY3Rpb24gdGltZSkgKi8KKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiByZXNlcnZlZCAoc2VsZWN0aW9uIGR1cmF0aW9uKSAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHJlc2VydmVkIChjdXJyZW50IHRpbWUpICovCisgICAgYXZpb193YjMyKHBiLCBtYXhfdHJhY2tfaWQgKyAxKTsgLyogTmV4dCB0cmFjayBpZCAqLworICAgIHJldHVybiAweDZjOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9pdHVuZXNfaGRscl90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGF2aW9fd2IzMihwYiwgMzMpOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAiaGRsciIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJtZGlyIik7CisgICAgZmZpb193Zm91cmNjKHBiLCAiYXBwbCIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBhdmlvX3c4KHBiLCAwKTsKKyAgICByZXR1cm4gMzM7Cit9CisKKy8qIGhlbHBlciBmdW5jdGlvbiB0byB3cml0ZSBhIGRhdGEgdGFnIHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcgYXMgZGF0YSAqLworc3RhdGljIGludCBtb3Zfd3JpdGVfc3RyaW5nX2RhdGFfdGFnKEFWSU9Db250ZXh0ICpwYiwgY29uc3QgY2hhciAqZGF0YSwgaW50IGxhbmcsIGludCBsb25nX3N0eWxlKQoreworICAgIGlmIChsb25nX3N0eWxlKSB7CisgICAgICAgIGludCBzaXplID0gMTYgKyBzdHJsZW4oZGF0YSk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc2l6ZSk7IC8qIHNpemUgKi8KKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiZGF0YSIpOworICAgICAgICBhdmlvX3diMzIocGIsIDEpOworICAgICAgICBhdmlvX3diMzIocGIsIDApOworICAgICAgICBhdmlvX3dyaXRlKHBiLCBkYXRhLCBzdHJsZW4oZGF0YSkpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWxhbmcpCisgICAgICAgICAgICBsYW5nID0gZmZfbW92X2lzbzYzOV90b19sYW5nKCJ1bmQiLCAxKTsKKyAgICAgICAgYXZpb193YjE2KHBiLCBzdHJsZW4oZGF0YSkpOyAvKiBzdHJpbmcgbGVuZ3RoICovCisgICAgICAgIGF2aW9fd2IxNihwYiwgbGFuZyk7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIGRhdGEsIHN0cmxlbihkYXRhKSk7CisgICAgICAgIHJldHVybiBzdHJsZW4oZGF0YSkgKyA0OworICAgIH0KK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfc3RyaW5nX3RhZyhBVklPQ29udGV4dCAqcGIsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgbGFuZywgaW50IGxvbmdfc3R5bGUpCit7CisgICAgaW50IHNpemUgPSAwOworICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVswXSkgeworICAgICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgKi8KKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCBuYW1lKTsKKyAgICAgICAgbW92X3dyaXRlX3N0cmluZ19kYXRhX3RhZyhwYiwgdmFsdWUsIGxhbmcsIGxvbmdfc3R5bGUpOworICAgICAgICBzaXplID0gdXBkYXRlX3NpemUocGIsIHBvcyk7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb25nX3N0eWxlKQoreworICAgIGludCBsLCBsYW5nID0gMCwgbGVuLCBsZW4yOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0LCAqdDIgPSBOVUxMOworICAgIGNoYXIgdGFnMlsxNl07CisKKyAgICBpZiAoISh0ID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsIHRhZywgTlVMTCwgMCkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGxlbiA9IHN0cmxlbih0LT5rZXkpOworICAgIHNucHJpbnRmKHRhZzIsIHNpemVvZih0YWcyKSwgIiVzLSIsIHRhZyk7CisgICAgd2hpbGUgKCh0MiA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCB0YWcyLCB0MiwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgbGVuMiA9IHN0cmxlbih0Mi0+a2V5KTsKKyAgICAgICAgaWYgKGxlbjIgPT0gbGVuICsgNCAmJiAhc3RyY21wKHQtPnZhbHVlLCB0Mi0+dmFsdWUpCisgICAgICAgICAgICAmJiAobCA9IGZmX21vdl9pc282MzlfdG9fbGFuZygmdDItPmtleVtsZW4yIC0gM10sIDEpKSA+PSAwKSB7CisgICAgICAgICAgICBsYW5nID0gbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtb3Zfd3JpdGVfc3RyaW5nX3RhZyhwYiwgbmFtZSwgdC0+dmFsdWUsIGxhbmcsIGxvbmdfc3R5bGUpOworfQorCisvKiBpVHVuZXMgYnBtIG51bWJlciAqLworc3RhdGljIGludCBtb3Zfd3JpdGVfdG1wb190YWcoQVZJT0NvbnRleHQgKnBiLCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInRtcG8iLCBOVUxMLCAwKTsKKyAgICBpbnQgc2l6ZSA9IDAsIHRtcG8gPSB0ID8gYXRvaSh0LT52YWx1ZSkgOiAwOworICAgIGlmICh0bXBvKSB7CisgICAgICAgIHNpemUgPSAyNjsKKyAgICAgICAgYXZpb193YjMyKHBiLCBzaXplKTsKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAidG1wbyIpOworICAgICAgICBhdmlvX3diMzIocGIsIHNpemUtOCk7IC8qIHNpemUgKi8KKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiZGF0YSIpOworICAgICAgICBhdmlvX3diMzIocGIsIDB4MTUpOyAgLy90eXBlIHNwZWNpZmllcgorICAgICAgICBhdmlvX3diMzIocGIsIDApOworICAgICAgICBhdmlvX3diMTYocGIsIHRtcG8pOyAgICAgICAgLy8gZGF0YQorICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKworLyogaVR1bmVzIHRyYWNrIG9yIGRpc2MgbnVtYmVyICovCitzdGF0aWMgaW50IG1vdl93cml0ZV90cmtuX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGRpc2MpCit7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2MgPyAiZGlzYyIgOiAidHJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7CisgICAgaW50IHNpemUgPSAwLCB0cmFjayA9IHQgPyBhdG9pKHQtPnZhbHVlKSA6IDA7CisgICAgaWYgKHRyYWNrKSB7CisgICAgICAgIGludCB0cmFja3MgPSAwOworICAgICAgICBjaGFyICpzbGFzaCA9IHN0cmNocih0LT52YWx1ZSwgJy8nKTsKKyAgICAgICAgaWYgKHNsYXNoKQorICAgICAgICAgICAgdHJhY2tzID0gYXRvaShzbGFzaCArIDEpOworICAgICAgICBhdmlvX3diMzIocGIsIDMyKTsgLyogc2l6ZSAqLworICAgICAgICBmZmlvX3dmb3VyY2MocGIsIGRpc2MgPyAiZGlzayIgOiAidHJrbiIpOworICAgICAgICBhdmlvX3diMzIocGIsIDI0KTsgLyogc2l6ZSAqLworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJkYXRhIik7CisgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgICAgICAvLyA4IGJ5dGVzIGVtcHR5CisgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgICAgIGF2aW9fd2IxNihwYiwgMCk7ICAgICAgICAvLyBlbXB0eQorICAgICAgICBhdmlvX3diMTYocGIsIHRyYWNrKTsgICAgLy8gdHJhY2sgLyBkaXNjIG51bWJlcgorICAgICAgICBhdmlvX3diMTYocGIsIHRyYWNrcyk7ICAgLy8gdG90YWwgdHJhY2sgLyBkaXNjIG51bWJlcgorICAgICAgICBhdmlvX3diMTYocGIsIDApOyAgICAgICAgLy8gZW1wdHkKKyAgICAgICAgc2l6ZSA9IDMyOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfaW50OF9tZXRhZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICB1aW50OF90IG51bTsKKyAgICBpbnQgc2l6ZSA9IDI0ICsgbGVuOworCisgICAgaWYgKGxlbiAhPSAxICYmIGxlbiAhPSA0KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoISh0ID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsIHRhZywgTlVMTCwgMCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBudW0gPSBhdG9pKHQtPnZhbHVlKTsKKworICAgIGF2aW9fd2IzMihwYiwgc2l6ZSk7CisgICAgZmZpb193Zm91cmNjKHBiLCBuYW1lKTsKKyAgICBhdmlvX3diMzIocGIsIHNpemUgLSA4KTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJkYXRhIik7CisgICAgYXZpb193YjMyKHBiLCAweDE1KTsKKyAgICBhdmlvX3diMzIocGIsIDApOworICAgIGlmIChsZW49PTQpIGF2aW9fd2IzMihwYiwgbnVtKTsKKyAgICBlbHNlICAgICAgICBhdmlvX3c4IChwYiwgbnVtKTsKKworICAgIHJldHVybiBzaXplOworfQorCisvKiBpVHVuZXMgbWV0YSBkYXRhIGxpc3QgKi8KK3N0YXRpYyBpbnQgbW92X3dyaXRlX2lsc3RfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAiaWxzdCIpOworICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJcMjUxbmFtIiwgInRpdGxlIiAgICAsIDEpOworICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJcMjUxQVJUIiwgImFydGlzdCIgICAsIDEpOworICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJhQVJUIiwgImFsYnVtX2FydGlzdCIsIDEpOworICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJcMjUxd3J0IiwgImNvbXBvc2VyIiAsIDEpOworICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJcMjUxYWxiIiwgImFsYnVtIiAgICAsIDEpOworICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJcMjUxZGF5IiwgImRhdGUiICAgICAsIDEpOworICAgIGlmICghbW92LT5leGFjdCAmJgorICAgICAgICAhbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYiwgIlwyNTF0b28iLCAiZW5jb2RpbmdfdG9vbCIsIDEpKQorICAgICAgICBtb3Zfd3JpdGVfc3RyaW5nX3RhZyhwYiwgIlwyNTF0b28iLCBMSUJBVkZPUk1BVF9JREVOVCwgMCwgMSk7CisgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYiwgIlwyNTFjbXQiLCAiY29tbWVudCIgICwgMSk7CisgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYiwgIlwyNTFnZW4iLCAiZ2VucmUiICAgICwgMSk7CisgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYiwgIlwyNTFjcHkiLCAiY29weXJpZ2h0IiwgMSk7CisgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYiwgIlwyNTFncnAiLCAiZ3JvdXBpbmciICwgMSk7CisgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYiwgIlwyNTFseXIiLCAibHlyaWNzIiAgICwgMSk7CisgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYiwgImRlc2MiLCAgICAiZGVzY3JpcHRpb24iLDEpOworICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJsZGVzIiwgICAgInN5bm9wc2lzIiAsIDEpOworICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJ0dnNoIiwgICAgInNob3ciICAgICAsIDEpOworICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJ0dmVuIiwgICAgImVwaXNvZGVfaWQiLDEpOworICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJ0dm5uIiwgICAgIm5ldHdvcmsiICAsIDEpOworICAgIG1vdl93cml0ZV9pbnQ4X21ldGFkYXRhICAocywgcGIsICJ0dmVzIiwgICAgImVwaXNvZGVfc29ydCIsNCk7CisgICAgbW92X3dyaXRlX2ludDhfbWV0YWRhdGEgIChzLCBwYiwgInR2c24iLCAgICAic2Vhc29uX251bWJlciIsNCk7CisgICAgbW92X3dyaXRlX2ludDhfbWV0YWRhdGEgIChzLCBwYiwgInN0aWsiLCAgICAibWVkaWFfdHlwZSIsMSk7CisgICAgbW92X3dyaXRlX2ludDhfbWV0YWRhdGEgIChzLCBwYiwgImhkdmQiLCAgICAiaGRfdmlkZW8iLCAgMSk7CisgICAgbW92X3dyaXRlX2ludDhfbWV0YWRhdGEgIChzLCBwYiwgInBnYXAiLCAgICAiZ2FwbGVzc19wbGF5YmFjayIsMSk7CisgICAgbW92X3dyaXRlX2ludDhfbWV0YWRhdGEgIChzLCBwYiwgImNwaWwiLCAgICAiY29tcGlsYXRpb24iLCAxKTsKKyAgICBtb3Zfd3JpdGVfdHJrbl90YWcocGIsIG1vdiwgcywgMCk7IC8vIHRyYWNrIG51bWJlcgorICAgIG1vdl93cml0ZV90cmtuX3RhZyhwYiwgbW92LCBzLCAxKTsgLy8gZGlzYyBudW1iZXIKKyAgICBtb3Zfd3JpdGVfdG1wb190YWcocGIsIHMpOworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworLyogaVR1bmVzIG1ldGEgZGF0YSB0YWcgKi8KK3N0YXRpYyBpbnQgbW92X3dyaXRlX21ldGFfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBzaXplID0gMDsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1ldGEiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOworICAgIG1vdl93cml0ZV9pdHVuZXNfaGRscl90YWcocGIsIG1vdiwgcyk7CisgICAgbW92X3dyaXRlX2lsc3RfdGFnKHBiLCBtb3YsIHMpOworICAgIHNpemUgPSB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfcmF3X21ldGFkYXRhX3RhZyhBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqa2V5KQoreworICAgIGludCBsZW47CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQ7CisKKyAgICBpZiAoISh0ID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsIGtleSwgTlVMTCwgMCkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGxlbiA9IHN0cmxlbih0LT52YWx1ZSk7CisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgaW50IHNpemUgPSBsZW4gKyA4OworICAgICAgICBhdmlvX3diMzIocGIsIHNpemUpOworICAgICAgICBmZmlvX3dmb3VyY2MocGIsIG5hbWUpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCB0LT52YWx1ZSwgbGVuKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzY2lpX3RvX3djKEFWSU9Db250ZXh0ICpwYiwgY29uc3QgdWludDhfdCAqYikKK3sKKyAgICBpbnQgdmFsOworICAgIHdoaWxlICgqYikgeworICAgICAgICBHRVRfVVRGOCh2YWwsICpiKyssIHJldHVybiAtMTspCisgICAgICAgIGF2aW9fd2IxNihwYiwgdmFsKTsKKyAgICB9CisgICAgYXZpb193YjE2KHBiLCAweDAwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQxNl90IGxhbmd1YWdlX2NvZGUoY29uc3QgY2hhciAqc3RyKQoreworICAgIHJldHVybiAoKChzdHJbMF0gLSAweDYwKSAmIDB4MUYpIDw8IDEwKSArCisgICAgICAgICAgICgoKHN0clsxXSAtIDB4NjApICYgMHgxRikgPDwgIDUpICsKKyAgICAgICAgICAgKCggc3RyWzJdIC0gMHg2MCkgJiAweDFGKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfM2dwX3VkdGFfdGFnKEFWSU9Db250ZXh0ICpwYiwgQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqc3RyKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCBzdHIsIE5VTEwsIDApOworICAgIGlmICghdCB8fCAhdXRmOGxlbih0LT52YWx1ZSkpCisgICAgICAgIHJldHVybiAwOworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgdGFnKTsgLyogdHlwZSAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgLyogdmVyc2lvbiArIGZsYWdzICovCisgICAgaWYgKCFzdHJjbXAodGFnLCAieXJyYyIpKQorICAgICAgICBhdmlvX3diMTYocGIsIGF0b2kodC0+dmFsdWUpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgYXZpb193YjE2KHBiLCBsYW5ndWFnZV9jb2RlKCJlbmciKSk7IC8qIGxhbmd1YWdlICovCisgICAgICAgIGF2aW9fd3JpdGUocGIsIHQtPnZhbHVlLCBzdHJsZW4odC0+dmFsdWUpICsgMSk7IC8qIFVURjggc3RyaW5nIHZhbHVlICovCisgICAgICAgIGlmICghc3RyY21wKHRhZywgImFsYm0iKSAmJgorICAgICAgICAgICAgKHQgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInRyYWNrIiwgTlVMTCwgMCkpKQorICAgICAgICAgICAgYXZpb193OChwYiwgYXRvaSh0LT52YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2NocGxfdGFnKEFWSU9Db250ZXh0ICpwYiwgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBpbnQgaSwgbmJfY2hhcHRlcnMgPSBGRk1JTihzLT5uYl9jaGFwdGVycywgMjU1KTsKKworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgICAgICAgICAgLy8gc2l6ZQorICAgIGZmaW9fd2ZvdXJjYyhwYiwgImNocGwiKTsKKyAgICBhdmlvX3diMzIocGIsIDB4MDEwMDAwMDApOyAgIC8vIHZlcnNpb24gKyBmbGFncworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgICAgICAgICAgLy8gdW5rbm93bgorICAgIGF2aW9fdzgocGIsIG5iX2NoYXB0ZXJzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jaGFwdGVyczsgaSsrKSB7CisgICAgICAgIEFWQ2hhcHRlciAqYyA9IHMtPmNoYXB0ZXJzW2ldOworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdDsKKyAgICAgICAgYXZpb193YjY0KHBiLCBhdl9yZXNjYWxlX3EoYy0+c3RhcnQsIGMtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsMTAwMDAwMDB9KSk7CisKKyAgICAgICAgaWYgKCh0ID0gYXZfZGljdF9nZXQoYy0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApKSkgeworICAgICAgICAgICAgaW50IGxlbiA9IEZGTUlOKHN0cmxlbih0LT52YWx1ZSksIDI1NSk7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCBsZW4pOworICAgICAgICAgICAgYXZpb193cml0ZShwYiwgdC0+dmFsdWUsIGxlbik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYXZpb193OChwYiwgMCk7CisgICAgfQorICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfdWR0YV90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiX2J1ZjsKKyAgICBpbnQgcmV0LCBzaXplOworICAgIHVpbnQ4X3QgKmJ1ZjsKKworICAgIHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZwYl9idWYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKG1vdi0+bW9kZSAmIE1PREVfM0dQKSB7CisgICAgICAgIG1vdl93cml0ZV8zZ3BfdWR0YV90YWcocGJfYnVmLCBzLCAicGVyZiIsICJhcnRpc3QiKTsKKyAgICAgICAgbW92X3dyaXRlXzNncF91ZHRhX3RhZyhwYl9idWYsIHMsICJ0aXRsIiwgInRpdGxlIik7CisgICAgICAgIG1vdl93cml0ZV8zZ3BfdWR0YV90YWcocGJfYnVmLCBzLCAiYXV0aCIsICJhdXRob3IiKTsKKyAgICAgICAgbW92X3dyaXRlXzNncF91ZHRhX3RhZyhwYl9idWYsIHMsICJnbnJlIiwgImdlbnJlIik7CisgICAgICAgIG1vdl93cml0ZV8zZ3BfdWR0YV90YWcocGJfYnVmLCBzLCAiZHNjcCIsICJjb21tZW50Iik7CisgICAgICAgIG1vdl93cml0ZV8zZ3BfdWR0YV90YWcocGJfYnVmLCBzLCAiYWxibSIsICJhbGJ1bSIpOworICAgICAgICBtb3Zfd3JpdGVfM2dwX3VkdGFfdGFnKHBiX2J1ZiwgcywgImNwcnQiLCAiY29weXJpZ2h0Iik7CisgICAgICAgIG1vdl93cml0ZV8zZ3BfdWR0YV90YWcocGJfYnVmLCBzLCAieXJyYyIsICJkYXRlIik7CisgICAgfSBlbHNlIGlmIChtb3YtPm1vZGUgPT0gTU9ERV9NT1YpIHsgLy8gdGhlIHRpdGxlIGZpZWxkIGJyZWFrcyBndGtwb2Qgd2l0aCBtcDQgYW5kIG15IHN1c3BpY2lvbiBpcyB0aGF0IHN0dWZmIGlzIG5vdCB2YWxpZCBpbiBtcDQKKyAgICAgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYl9idWYsICJcMjUxQVJUIiwgImFydGlzdCIsICAgICAgMCk7CisgICAgICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGJfYnVmLCAiXDI1MW5hbSIsICJ0aXRsZSIsICAgICAgIDApOworICAgICAgICBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKHMsIHBiX2J1ZiwgIlwyNTFhdXQiLCAiYXV0aG9yIiwgICAgICAwKTsKKyAgICAgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYl9idWYsICJcMjUxYWxiIiwgImFsYnVtIiwgICAgICAgMCk7CisgICAgICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGJfYnVmLCAiXDI1MWRheSIsICJkYXRlIiwgICAgICAgIDApOworICAgICAgICBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKHMsIHBiX2J1ZiwgIlwyNTFzd3IiLCAiZW5jb2RlciIsICAgICAwKTsKKyAgICAgICAgLy8gY3VycmVudGx5IGlnbm9yZWQgYnkgbW92LmMKKyAgICAgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYl9idWYsICJcMjUxZGVzIiwgImNvbW1lbnQiLCAgICAgMCk7CisgICAgICAgIC8vIGFkZCBzdXBwb3J0IGZvciBsaWJxdWlja3RpbWUsIHRoaXMgYXRvbSBpcyBhbHNvIGFjdHVhbGx5IHJlYWQgYnkgbW92LmMKKyAgICAgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYl9idWYsICJcMjUxY210IiwgImNvbW1lbnQiLCAgICAgMCk7CisgICAgICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGJfYnVmLCAiXDI1MWdlbiIsICJnZW5yZSIsICAgICAgIDApOworICAgICAgICBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKHMsIHBiX2J1ZiwgIlwyNTFjcHkiLCAiY29weXJpZ2h0IiwgICAwKTsKKyAgICAgICAgbW92X3dyaXRlX3Jhd19tZXRhZGF0YV90YWcocywgcGJfYnVmLCAiWE1QXyIsICJ4bXAiKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBpVHVuZXMgbWV0YSBkYXRhICovCisgICAgICAgIG1vdl93cml0ZV9tZXRhX3RhZyhwYl9idWYsIG1vdiwgcyk7CisgICAgfQorCisgICAgaWYgKHMtPm5iX2NoYXB0ZXJzICYmICEobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0RJU0FCTEVfQ0hQTCkpCisgICAgICAgIG1vdl93cml0ZV9jaHBsX3RhZyhwYl9idWYsIHMpOworCisgICAgaWYgKChzaXplID0gYXZpb19jbG9zZV9keW5fYnVmKHBiX2J1ZiwgJmJ1ZikpID4gMCkgeworICAgICAgICBhdmlvX3diMzIocGIsIHNpemUgKyA4KTsKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAidWR0YSIpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCBidWYsIHNpemUpOworICAgIH0KKyAgICBhdl9mcmVlKGJ1Zik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbW92X3dyaXRlX3BzcF91ZHRhX3RhZyhBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqbGFuZywgaW50IHR5cGUpCit7CisgICAgaW50IGxlbiA9IHV0ZjhsZW4oc3RyKSArIDE7CisgICAgaWYgKGxlbiA8PSAwKQorICAgICAgICByZXR1cm47CisgICAgYXZpb193YjE2KHBiLCBsZW4gKiAyICsgMTApOyAgICAgICAgLyogc2l6ZSAqLworICAgIGF2aW9fd2IzMihwYiwgdHlwZSk7ICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8KKyAgICBhdmlvX3diMTYocGIsIGxhbmd1YWdlX2NvZGUobGFuZykpOyAvKiBsYW5ndWFnZSAqLworICAgIGF2aW9fd2IxNihwYiwgMHgwMSk7ICAgICAgICAgICAgICAgIC8qID8gKi8KKyAgICBhc2NpaV90b193YyhwYiwgc3RyKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfdXVpZHVzbXRfdGFnKEFWSU9Db250ZXh0ICpwYiwgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1PVk11eENvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGl0bGUgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInRpdGxlIiwgTlVMTCwgMCk7CisgICAgaW50NjRfdCBwb3MsIHBvczI7CisKKyAgICBpZiAodGl0bGUpIHsKKyAgICAgICAgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSBwbGFjZWhvbGRlciovCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgInV1aWQiKTsKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiVVNNVCIpOworICAgICAgICBhdmlvX3diMzIocGIsIDB4MjFkMjRmY2UpOyAvKiA5NiBiaXQgVVVJRCAqLworICAgICAgICBhdmlvX3diMzIocGIsIDB4YmI4ODY5NWMpOworICAgICAgICBhdmlvX3diMzIocGIsIDB4ZmFjOWM3NDApOworCisgICAgICAgIHBvczIgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplIHBsYWNlaG9sZGVyKi8KKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiTVREVCIpOworICAgICAgICBhdmlvX3diMTYocGIsIDQpOworCisgICAgICAgIC8vID8KKyAgICAgICAgYXZpb193YjE2KHBiLCAweDBDKTsgICAgICAgICAgICAgICAgIC8qIHNpemUgKi8KKyAgICAgICAgYXZpb193YjMyKHBiLCAweDBCKTsgICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8KKyAgICAgICAgYXZpb193YjE2KHBiLCBsYW5ndWFnZV9jb2RlKCJ1bmQiKSk7IC8qIGxhbmd1YWdlICovCisgICAgICAgIGF2aW9fd2IxNihwYiwgMHgwKTsgICAgICAgICAgICAgICAgICAvKiA/ICovCisgICAgICAgIGF2aW9fd2IxNihwYiwgMHgwMjFDKTsgICAgICAgICAgICAgICAvKiBkYXRhICovCisKKyAgICAgICAgaWYgKCFtb3YtPmV4YWN0KQorICAgICAgICAgICAgbW92X3dyaXRlX3BzcF91ZHRhX3RhZyhwYiwgTElCQVZDT0RFQ19JREVOVCwgICAgICAiZW5nIiwgMHgwNCk7CisgICAgICAgIG1vdl93cml0ZV9wc3BfdWR0YV90YWcocGIsIHRpdGxlLT52YWx1ZSwgICAgICAgICAgImVuZyIsIDB4MDEpOworICAgICAgICBtb3Zfd3JpdGVfcHNwX3VkdGFfdGFnKHBiLCAiMjAwNi8wNC8wMSAxMToxMToxMSIsICJ1bmQiLCAweDAzKTsKKworICAgICAgICB1cGRhdGVfc2l6ZShwYiwgcG9zMik7CisgICAgICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfY2h1bmtzKE1PVlRyYWNrICp0cmspCit7CisgICAgaW50IGk7CisgICAgTU9WSWVudHJ5ICpjaHVuayA9ICZ0cmstPmNsdXN0ZXJbMF07CisgICAgdWludDY0X3QgY2h1bmtTaXplID0gY2h1bmstPnNpemU7CisgICAgY2h1bmstPmNodW5rTnVtID0gMTsKKyAgICBpZiAodHJrLT5jaHVua0NvdW50KQorICAgICAgICByZXR1cm47CisgICAgdHJrLT5jaHVua0NvdW50ID0gMTsKKyAgICBmb3IgKGkgPSAxOyBpPHRyay0+ZW50cnk7IGkrKyl7CisgICAgICAgIGlmIChjaHVuay0+cG9zICsgY2h1bmtTaXplID09IHRyay0+Y2x1c3RlcltpXS5wb3MgJiYKKyAgICAgICAgICAgIGNodW5rU2l6ZSArIHRyay0+Y2x1c3RlcltpXS5zaXplIDwgKDE8PDIwKSl7CisgICAgICAgICAgICBjaHVua1NpemUgICAgICAgICAgICAgKz0gdHJrLT5jbHVzdGVyW2ldLnNpemU7CisgICAgICAgICAgICBjaHVuay0+c2FtcGxlc19pbl9jaHVuayArPSB0cmstPmNsdXN0ZXJbaV0uZW50cmllczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyay0+Y2x1c3RlcltpXS5jaHVua051bSA9IGNodW5rLT5jaHVua051bSsxOworICAgICAgICAgICAgY2h1bms9JnRyay0+Y2x1c3RlcltpXTsKKyAgICAgICAgICAgIGNodW5rU2l6ZSA9IGNodW5rLT5zaXplOworICAgICAgICAgICAgdHJrLT5jaHVua0NvdW50Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX21vb3ZfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplIHBsYWNlaG9sZGVyKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJtb292Iik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKG1vdi0+dHJhY2tzW2ldLmVudHJ5IDw9IDAgJiYgIShtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR01FTlQpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbW92LT50cmFja3NbaV0udGltZSAgICAgPSBtb3YtPnRpbWU7CisgICAgICAgIG1vdi0+dHJhY2tzW2ldLnRyYWNrX2lkID0gaSArIDE7CisKKyAgICAgICAgaWYgKG1vdi0+dHJhY2tzW2ldLmVudHJ5KQorICAgICAgICAgICAgYnVpbGRfY2h1bmtzKCZtb3YtPnRyYWNrc1tpXSk7CisgICAgfQorCisgICAgaWYgKG1vdi0+Y2hhcHRlcl90cmFjaykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgbW92LT50cmFja3NbaV0udHJlZl90YWcgPSBNS1RBRygnYycsJ2gnLCdhJywncCcpOworICAgICAgICAgICAgbW92LT50cmFja3NbaV0udHJlZl9pZCAgPSBtb3YtPnRyYWNrc1ttb3YtPmNoYXB0ZXJfdHJhY2tdLnRyYWNrX2lkOworICAgICAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG1vdi0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChtb3YtPnRyYWNrc1tpXS50YWcgPT0gTUtUQUcoJ3InLCd0JywncCcsJyAnKSkgeworICAgICAgICAgICAgbW92LT50cmFja3NbaV0udHJlZl90YWcgPSBNS1RBRygnaCcsJ2knLCduJywndCcpOworICAgICAgICAgICAgbW92LT50cmFja3NbaV0udHJlZl9pZCA9CisgICAgICAgICAgICAgICAgbW92LT50cmFja3NbbW92LT50cmFja3NbaV0uc3JjX3RyYWNrXS50cmFja19pZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKG1vdi0+dHJhY2tzW2ldLnRhZyA9PSBNS1RBRygndCcsJ20nLCdjJywnZCcpKSB7CisgICAgICAgICAgICBpbnQgc3JjX3RyayA9IG1vdi0+dHJhY2tzW2ldLnNyY190cmFjazsKKyAgICAgICAgICAgIG1vdi0+dHJhY2tzW3NyY190cmtdLnRyZWZfdGFnID0gbW92LT50cmFja3NbaV0udGFnOworICAgICAgICAgICAgbW92LT50cmFja3Nbc3JjX3Rya10udHJlZl9pZCAgPSBtb3YtPnRyYWNrc1tpXS50cmFja19pZDsKKyAgICAgICAgICAgIC8vc3JjX3RyayBtYXkgaGF2ZSBhIGRpZmZlcmVudCB0aW1lc2NhbGUgdGhhbiB0aGUgdG1jZCB0cmFjaworICAgICAgICAgICAgbW92LT50cmFja3NbaV0udHJhY2tfZHVyYXRpb24gPSBhdl9yZXNjYWxlKG1vdi0+dHJhY2tzW3NyY190cmtdLnRyYWNrX2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdi0+dHJhY2tzW2ldLnRpbWVzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YtPnRyYWNrc1tzcmNfdHJrXS50aW1lc2NhbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgbW92X3dyaXRlX212aGRfdGFnKHBiLCBtb3YpOworICAgIGlmIChtb3YtPm1vZGUgIT0gTU9ERV9NT1YgJiYgIW1vdi0+aW9kc19za2lwKQorICAgICAgICBtb3Zfd3JpdGVfaW9kc190YWcocGIsIG1vdik7CisgICAgZm9yIChpID0gMDsgaSA8IG1vdi0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChtb3YtPnRyYWNrc1tpXS5lbnRyeSA+IDAgfHwgbW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZSQUdNRU5UKSB7CisgICAgICAgICAgICBtb3Zfd3JpdGVfdHJha190YWcocGIsIG1vdiwgJihtb3YtPnRyYWNrc1tpXSksIGkgPCBzLT5uYl9zdHJlYW1zID8gcy0+c3RyZWFtc1tpXSA6IE5VTEwpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR01FTlQpCisgICAgICAgIG1vdl93cml0ZV9tdmV4X3RhZyhwYiwgbW92KTsgLyogUXVpY2tUaW1lIHJlcXVpcmVzIHRyYWsgdG8gcHJlY2VkZSB0aGlzICovCisKKyAgICBpZiAobW92LT5tb2RlID09IE1PREVfUFNQKQorICAgICAgICBtb3Zfd3JpdGVfdXVpZHVzbXRfdGFnKHBiLCBzKTsKKyAgICBlbHNlCisgICAgICAgIG1vdl93cml0ZV91ZHRhX3RhZyhwYiwgbW92LCBzKTsKKworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworc3RhdGljIHZvaWQgcGFyYW1fd3JpdGVfaW50KEFWSU9Db250ZXh0ICpwYiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbHVlKQoreworICAgIGF2aW9fcHJpbnRmKHBiLCAiPHBhcmFtIG5hbWU9XCIlc1wiIHZhbHVlPVwiJWRcIiB2YWx1ZXR5cGU9XCJkYXRhXCIvPlxuIiwgbmFtZSwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBwYXJhbV93cml0ZV9zdHJpbmcoQVZJT0NvbnRleHQgKnBiLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICBhdmlvX3ByaW50ZihwYiwgIjxwYXJhbSBuYW1lPVwiJXNcIiB2YWx1ZT1cIiVzXCIgdmFsdWV0eXBlPVwiZGF0YVwiLz5cbiIsIG5hbWUsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgcGFyYW1fd3JpdGVfaGV4KEFWSU9Db250ZXh0ICpwYiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdWludDhfdCAqdmFsdWUsIGludCBsZW4pCit7CisgICAgY2hhciBidWZbMTUwXTsKKyAgICBsZW4gPSBGRk1JTihzaXplb2YoYnVmKSAvIDIgLSAxLCBsZW4pOworICAgIGZmX2RhdGFfdG9faGV4KGJ1ZiwgdmFsdWUsIGxlbiwgMCk7CisgICAgYnVmWzIgKiBsZW5dID0gJ1wwJzsKKyAgICBhdmlvX3ByaW50ZihwYiwgIjxwYXJhbSBuYW1lPVwiJXNcIiB2YWx1ZT1cIiVzXCIgdmFsdWV0eXBlPVwiZGF0YVwiLz5cbiIsIG5hbWUsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2lzbWxfbWFuaWZlc3QoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YpCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBpOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHV1aWRbXSA9IHsKKyAgICAgICAgMHhhNSwgMHhkNCwgMHgwYiwgMHgzMCwgMHhlOCwgMHgxNCwgMHgxMSwgMHhkZCwKKyAgICAgICAgMHhiYSwgMHgyZiwgMHgwOCwgMHgwMCwgMHgyMCwgMHgwYywgMHg5YSwgMHg2NgorICAgIH07CisKKyAgICBhdmlvX3diMzIocGIsIDApOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInV1aWQiKTsKKyAgICBhdmlvX3dyaXRlKHBiLCB1dWlkLCBzaXplb2YodXVpZCkpOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisKKyAgICBhdmlvX3ByaW50ZihwYiwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxuIik7CisgICAgYXZpb19wcmludGYocGIsICI8c21pbCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvU01JTDIwL0xhbmd1YWdlXCI+XG4iKTsKKyAgICBhdmlvX3ByaW50ZihwYiwgIjxoZWFkPlxuIik7CisgICAgaWYgKCFtb3YtPmV4YWN0KQorICAgICAgICBhdmlvX3ByaW50ZihwYiwgIjxtZXRhIG5hbWU9XCJjcmVhdG9yXCIgY29udGVudD1cIiVzXCIgLz5cbiIsCisgICAgICAgICAgICAgICAgICAgIExJQkFWRk9STUFUX0lERU5UKTsKKyAgICBhdmlvX3ByaW50ZihwYiwgIjwvaGVhZD5cbiIpOworICAgIGF2aW9fcHJpbnRmKHBiLCAiPGJvZHk+XG4iKTsKKyAgICBhdmlvX3ByaW50ZihwYiwgIjxzd2l0Y2g+XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgTU9WVHJhY2sgKnRyYWNrID0gJm1vdi0+dHJhY2tzW2ldOworICAgICAgICBjb25zdCBjaGFyICp0eXBlOworICAgICAgICAvKiB0cmFjay0+dHJhY2tfaWQgaXMgaW5pdGlhbGl6ZWQgaW4gd3JpdGVfbW9vdiwgYW5kIHRodXMgaXNuJ3Qga25vd24KKyAgICAgICAgICogaGVyZSB5ZXQgKi8KKyAgICAgICAgaW50IHRyYWNrX2lkID0gaSArIDE7CisKKyAgICAgICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICB0eXBlID0gInZpZGVvIjsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgdHlwZSA9ICJhdWRpbyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdmlvX3ByaW50ZihwYiwgIjwlcyBzeXN0ZW1CaXRyYXRlPVwiJWRcIj5cbiIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Yml0X3JhdGUpOworICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJzeXN0ZW1CaXRyYXRlIiwgdHJhY2stPmVuYy0+Yml0X3JhdGUpOworICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJ0cmFja0lEIiwgdHJhY2tfaWQpOworICAgICAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyOworICAgICAgICAgICAgICAgIGludCBzaXplID0gdHJhY2stPmVuYy0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgICAgICAgICAgaWYgKCFmZl9hdmNfd3JpdGVfYW5uZXhiX2V4dHJhZGF0YSh0cmFjay0+ZW5jLT5leHRyYWRhdGEsICZwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1fd3JpdGVfaGV4KHBiLCAiQ29kZWNQcml2YXRlRGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPyBwdHIgOiB0cmFjay0+ZW5jLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShwdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXJhbV93cml0ZV9zdHJpbmcocGIsICJGb3VyQ0MiLCAiSDI2NCIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEpIHsKKyAgICAgICAgICAgICAgICBwYXJhbV93cml0ZV9zdHJpbmcocGIsICJGb3VyQ0MiLCAiV1ZDMSIpOworICAgICAgICAgICAgICAgIHBhcmFtX3dyaXRlX2hleChwYiwgIkNvZGVjUHJpdmF0ZURhdGEiLCB0cmFjay0+ZW5jLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcmFtX3dyaXRlX2ludChwYiwgIk1heFdpZHRoIiwgdHJhY2stPmVuYy0+d2lkdGgpOworICAgICAgICAgICAgcGFyYW1fd3JpdGVfaW50KHBiLCAiTWF4SGVpZ2h0IiwgdHJhY2stPmVuYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIHBhcmFtX3dyaXRlX2ludChwYiwgIkRpc3BsYXlXaWR0aCIsIHRyYWNrLT5lbmMtPndpZHRoKTsKKyAgICAgICAgICAgIHBhcmFtX3dyaXRlX2ludChwYiwgIkRpc3BsYXlIZWlnaHQiLCB0cmFjay0+ZW5jLT5oZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgeworICAgICAgICAgICAgICAgIHBhcmFtX3dyaXRlX3N0cmluZyhwYiwgIkZvdXJDQyIsICJBQUNMIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNQVBSTykgeworICAgICAgICAgICAgICAgIHBhcmFtX3dyaXRlX3N0cmluZyhwYiwgIkZvdXJDQyIsICJXTUFQIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJhbV93cml0ZV9oZXgocGIsICJDb2RlY1ByaXZhdGVEYXRhIiwgdHJhY2stPmVuYy0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIHBhcmFtX3dyaXRlX2ludChwYiwgIkF1ZGlvVGFnIiwgZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY193YXZfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCkpOworICAgICAgICAgICAgcGFyYW1fd3JpdGVfaW50KHBiLCAiQ2hhbm5lbHMiLCB0cmFjay0+ZW5jLT5jaGFubmVscyk7CisgICAgICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJTYW1wbGluZ1JhdGUiLCB0cmFjay0+ZW5jLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJCaXRzUGVyU2FtcGxlIiwgMTYpOworICAgICAgICAgICAgcGFyYW1fd3JpdGVfaW50KHBiLCAiUGFja2V0U2l6ZSIsIHRyYWNrLT5lbmMtPmJsb2NrX2FsaWduID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5ibG9ja19hbGlnbiA6IDQpOworICAgICAgICB9CisgICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiPC8lcz5cbiIsIHR5cGUpOworICAgIH0KKyAgICBhdmlvX3ByaW50ZihwYiwgIjwvc3dpdGNoPlxuIik7CisgICAgYXZpb19wcmludGYocGIsICI8L2JvZHk+XG4iKTsKKyAgICBhdmlvX3ByaW50ZihwYiwgIjwvc21pbD5cbiIpOworCisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9tZmhkX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdikKK3sKKyAgICBhdmlvX3diMzIocGIsIDE2KTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJtZmhkIik7CisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBhdmlvX3diMzIocGIsIG1vdi0+ZnJhZ21lbnRzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfdGZoZF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT1ZUcmFjayAqdHJhY2ssIGludDY0X3QgbW9vZl9vZmZzZXQpCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIHVpbnQzMl90IGZsYWdzID0gTU9WX1RGSERfREVGQVVMVF9TSVpFIHwgTU9WX1RGSERfREVGQVVMVF9EVVJBVElPTiB8CisgICAgICAgICAgICAgICAgICAgICBNT1ZfVEZIRF9CQVNFX0RBVEFfT0ZGU0VUOworICAgIGlmICghdHJhY2stPmVudHJ5KSB7CisgICAgICAgIGZsYWdzIHw9IE1PVl9URkhEX0RVUkFUSU9OX0lTX0VNUFRZOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsYWdzIHw9IE1PVl9URkhEX0RFRkFVTFRfRkxBR1M7CisgICAgfQorICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfT01JVF9URkhEX09GRlNFVCkKKyAgICAgICAgZmxhZ3MgJj0gfk1PVl9URkhEX0JBU0VfREFUQV9PRkZTRVQ7CisgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19ERUZBVUxUX0JBU0VfTU9PRikgeworICAgICAgICBmbGFncyAmPSB+TU9WX1RGSERfQkFTRV9EQVRBX09GRlNFVDsKKyAgICAgICAgZmxhZ3MgfD0gTU9WX1RGSERfREVGQVVMVF9CQVNFX0lTX01PT0Y7CisgICAgfQorCisgICAgLyogRG9uJ3Qgc2V0IGEgZGVmYXVsdCBzYW1wbGUgc2l6ZSwgdGhlIHNpbHZlcmxpZ2h0IHBsYXllciByZWZ1c2VzCisgICAgICogdG8gcGxheSBmaWxlcyB3aXRoIHRoYXQgc2V0LiBEb24ndCBzZXQgYSBkZWZhdWx0IHNhbXBsZSBkdXJhdGlvbiwKKyAgICAgKiBXTVAgZnJlYWtzIG91dCBpZiBpdCBpcyBzZXQuIERvbid0IHNldCBhIGJhc2UgZGF0YSBvZmZzZXQsIFBJRkYKKyAgICAgKiBmaWxlIGZvcm1hdCBzYXlzIGl0IE1VU1QgTk9UIGJlIHNldC4gKi8KKyAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9JU00pCisgICAgICAgIGZsYWdzICY9IH4oTU9WX1RGSERfREVGQVVMVF9TSVpFIHwgTU9WX1RGSERfREVGQVVMVF9EVVJBVElPTiB8CisgICAgICAgICAgICAgICAgICAgTU9WX1RGSERfQkFTRV9EQVRBX09GRlNFVCk7CisKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplIHBsYWNlaG9sZGVyICovCisgICAgZmZpb193Zm91cmNjKHBiLCAidGZoZCIpOworICAgIGF2aW9fdzgocGIsIDApOyAvKiB2ZXJzaW9uICovCisgICAgYXZpb193YjI0KHBiLCBmbGFncyk7CisKKyAgICBhdmlvX3diMzIocGIsIHRyYWNrLT50cmFja19pZCk7IC8qIHRyYWNrLWlkICovCisgICAgaWYgKGZsYWdzICYgTU9WX1RGSERfQkFTRV9EQVRBX09GRlNFVCkKKyAgICAgICAgYXZpb193YjY0KHBiLCBtb29mX29mZnNldCk7CisgICAgaWYgKGZsYWdzICYgTU9WX1RGSERfREVGQVVMVF9EVVJBVElPTikgeworICAgICAgICB0cmFjay0+ZGVmYXVsdF9kdXJhdGlvbiA9IGdldF9jbHVzdGVyX2R1cmF0aW9uKHRyYWNrLCAwKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCB0cmFjay0+ZGVmYXVsdF9kdXJhdGlvbik7CisgICAgfQorICAgIGlmIChmbGFncyAmIE1PVl9URkhEX0RFRkFVTFRfU0laRSkgeworICAgICAgICB0cmFjay0+ZGVmYXVsdF9zaXplID0gdHJhY2stPmVudHJ5ID8gdHJhY2stPmNsdXN0ZXJbMF0uc2l6ZSA6IDE7CisgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPmRlZmF1bHRfc2l6ZSk7CisgICAgfSBlbHNlCisgICAgICAgIHRyYWNrLT5kZWZhdWx0X3NpemUgPSAtMTsKKworICAgIGlmIChmbGFncyAmIE1PVl9URkhEX0RFRkFVTFRfRkxBR1MpIHsKKyAgICAgICAgdHJhY2stPmRlZmF1bHRfc2FtcGxlX2ZsYWdzID0KKyAgICAgICAgICAgIHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPID8KKyAgICAgICAgICAgIChNT1ZfRlJBR19TQU1QTEVfRkxBR19ERVBFTkRTX1lFUyB8IE1PVl9GUkFHX1NBTVBMRV9GTEFHX0lTX05PTl9TWU5DKSA6CisgICAgICAgICAgICBNT1ZfRlJBR19TQU1QTEVfRkxBR19ERVBFTkRTX05POworICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5kZWZhdWx0X3NhbXBsZV9mbGFncyk7CisgICAgfQorCisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgdWludDMyX3QgZ2V0X3NhbXBsZV9mbGFncyhNT1ZUcmFjayAqdHJhY2ssIE1PVkllbnRyeSAqZW50cnkpCit7CisgICAgcmV0dXJuIGVudHJ5LT5mbGFncyAmIE1PVl9TWU5DX1NBTVBMRSA/IE1PVl9GUkFHX1NBTVBMRV9GTEFHX0RFUEVORFNfTk8gOgorICAgICAgICAgICAoTU9WX0ZSQUdfU0FNUExFX0ZMQUdfREVQRU5EU19ZRVMgfCBNT1ZfRlJBR19TQU1QTEVfRkxBR19JU19OT05fU1lOQyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3RydW5fdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9WVHJhY2sgKnRyYWNrLCBpbnQgbW9vZl9zaXplKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICB1aW50MzJfdCBmbGFncyA9IE1PVl9UUlVOX0RBVEFfT0ZGU0VUOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHRyYWNrLT5lbnRyeTsgaSsrKSB7CisgICAgICAgIGlmIChnZXRfY2x1c3Rlcl9kdXJhdGlvbih0cmFjaywgaSkgIT0gdHJhY2stPmRlZmF1bHRfZHVyYXRpb24pCisgICAgICAgICAgICBmbGFncyB8PSBNT1ZfVFJVTl9TQU1QTEVfRFVSQVRJT047CisgICAgICAgIGlmICh0cmFjay0+Y2x1c3RlcltpXS5zaXplICE9IHRyYWNrLT5kZWZhdWx0X3NpemUpCisgICAgICAgICAgICBmbGFncyB8PSBNT1ZfVFJVTl9TQU1QTEVfU0laRTsKKyAgICAgICAgaWYgKGkgPiAwICYmIGdldF9zYW1wbGVfZmxhZ3ModHJhY2ssICZ0cmFjay0+Y2x1c3RlcltpXSkgIT0gdHJhY2stPmRlZmF1bHRfc2FtcGxlX2ZsYWdzKQorICAgICAgICAgICAgZmxhZ3MgfD0gTU9WX1RSVU5fU0FNUExFX0ZMQUdTOworICAgIH0KKyAgICBpZiAoIShmbGFncyAmIE1PVl9UUlVOX1NBTVBMRV9GTEFHUykpCisgICAgICAgIGZsYWdzIHw9IE1PVl9UUlVOX0ZJUlNUX1NBTVBMRV9GTEFHUzsKKyAgICBpZiAodHJhY2stPmZsYWdzICYgTU9WX1RSQUNLX0NUVFMpCisgICAgICAgIGZsYWdzIHw9IE1PVl9UUlVOX1NBTVBMRV9DVFM7CisKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplIHBsYWNlaG9sZGVyICovCisgICAgZmZpb193Zm91cmNjKHBiLCAidHJ1biIpOworICAgIGF2aW9fdzgocGIsIDApOyAvKiB2ZXJzaW9uICovCisgICAgYXZpb193YjI0KHBiLCBmbGFncyk7CisKKyAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5lbnRyeSk7IC8qIHNhbXBsZSBjb3VudCAqLworICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfT01JVF9URkhEX09GRlNFVCAmJgorICAgICAgICAhKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19ERUZBVUxUX0JBU0VfTU9PRikgJiYKKyAgICAgICAgIW1vdi0+Zmlyc3RfdHJ1bikKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogTGF0ZXIgdHJhY2tzIGZvbGxvdyBpbW1lZGlhdGVseSBhZnRlciB0aGUgcHJldmlvdXMgb25lICovCisgICAgZWxzZQorICAgICAgICBhdmlvX3diMzIocGIsIG1vb2Zfc2l6ZSArIDggKyB0cmFjay0+ZGF0YV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5jbHVzdGVyWzBdLnBvcyk7IC8qIGRhdGEgb2Zmc2V0ICovCisgICAgaWYgKGZsYWdzICYgTU9WX1RSVU5fRklSU1RfU0FNUExFX0ZMQUdTKQorICAgICAgICBhdmlvX3diMzIocGIsIGdldF9zYW1wbGVfZmxhZ3ModHJhY2ssICZ0cmFjay0+Y2x1c3RlclswXSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IHRyYWNrLT5lbnRyeTsgaSsrKSB7CisgICAgICAgIGlmIChmbGFncyAmIE1PVl9UUlVOX1NBTVBMRV9EVVJBVElPTikKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgZ2V0X2NsdXN0ZXJfZHVyYXRpb24odHJhY2ssIGkpKTsKKyAgICAgICAgaWYgKGZsYWdzICYgTU9WX1RSVU5fU0FNUExFX1NJWkUpCisgICAgICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5jbHVzdGVyW2ldLnNpemUpOworICAgICAgICBpZiAoZmxhZ3MgJiBNT1ZfVFJVTl9TQU1QTEVfRkxBR1MpCisgICAgICAgICAgICBhdmlvX3diMzIocGIsIGdldF9zYW1wbGVfZmxhZ3ModHJhY2ssICZ0cmFjay0+Y2x1c3RlcltpXSkpOworICAgICAgICBpZiAoZmxhZ3MgJiBNT1ZfVFJVTl9TQU1QTEVfQ1RTKQorICAgICAgICAgICAgYXZpb193YjMyKHBiLCB0cmFjay0+Y2x1c3RlcltpXS5jdHMpOworICAgIH0KKworICAgIG1vdi0+Zmlyc3RfdHJ1biA9IDA7CisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV90ZnhkX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdXVpZFtdID0geworICAgICAgICAweDZkLCAweDFkLCAweDliLCAweDA1LCAweDQyLCAweGQ1LCAweDQ0LCAweGU2LAorICAgICAgICAweDgwLCAweGUyLCAweDE0LCAweDFkLCAweGFmLCAweGY3LCAweDU3LCAweGIyCisgICAgfTsKKworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgcGxhY2Vob2xkZXIgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJ1dWlkIik7CisgICAgYXZpb193cml0ZShwYiwgdXVpZCwgc2l6ZW9mKHV1aWQpKTsKKyAgICBhdmlvX3c4KHBiLCAxKTsKKyAgICBhdmlvX3diMjQocGIsIDApOworICAgIGF2aW9fd2I2NChwYiwgdHJhY2stPmZyYWdfc3RhcnQpOworICAgIGF2aW9fd2I2NChwYiwgdHJhY2stPnN0YXJ0X2R0cyArIHRyYWNrLT50cmFja19kdXJhdGlvbiAtCisgICAgICAgICAgICAgICAgICB0cmFjay0+Y2x1c3RlclswXS5kdHMpOworCisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV90ZnJmX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVlRyYWNrICp0cmFjaywgaW50IGVudHJ5KQoreworICAgIGludCBuID0gdHJhY2stPm5iX2ZyYWdfaW5mbyAtIDEgLSBlbnRyeSwgaTsKKyAgICBpbnQgc2l6ZSA9IDggKyAxNiArIDQgKyAxICsgMTYqbjsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCB1dWlkW10gPSB7CisgICAgICAgIDB4ZDQsIDB4ODAsIDB4N2UsIDB4ZjIsIDB4Y2EsIDB4MzksIDB4NDYsIDB4OTUsCisgICAgICAgIDB4OGUsIDB4NTQsIDB4MjYsIDB4Y2IsIDB4OWUsIDB4NDYsIDB4YTcsIDB4OWYKKyAgICB9OworCisgICAgaWYgKGVudHJ5IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBhdmlvX3NlZWsocGIsIHRyYWNrLT5mcmFnX2luZm9bZW50cnldLnRmcmZfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgYXZpb193YjMyKHBiLCBzaXplKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJ1dWlkIik7CisgICAgYXZpb193cml0ZShwYiwgdXVpZCwgc2l6ZW9mKHV1aWQpKTsKKyAgICBhdmlvX3c4KHBiLCAxKTsKKyAgICBhdmlvX3diMjQocGIsIDApOworICAgIGF2aW9fdzgocGIsIG4pOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaW50IGluZGV4ID0gZW50cnkgKyAxICsgaTsKKyAgICAgICAgYXZpb193YjY0KHBiLCB0cmFjay0+ZnJhZ19pbmZvW2luZGV4XS50aW1lKTsKKyAgICAgICAgYXZpb193YjY0KHBiLCB0cmFjay0+ZnJhZ19pbmZvW2luZGV4XS5kdXJhdGlvbik7CisgICAgfQorICAgIGlmIChuIDwgbW92LT5pc21fbG9va2FoZWFkKSB7CisgICAgICAgIGludCBmcmVlX3NpemUgPSAxNiAqIChtb3YtPmlzbV9sb29rYWhlYWQgLSBuKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBmcmVlX3NpemUpOworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJmcmVlIik7CisgICAgICAgIGZmaW9fZmlsbChwYiwgMCwgZnJlZV9zaXplIC0gOCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3RmcmZfdGFncyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPmlzbV9sb29rYWhlYWQ7IGkrKykgeworICAgICAgICAvKiBVcGRhdGUgdGhlIHRmcmYgdGFnIGZvciB0aGUgbGFzdCBpc21fbG9va2FoZWFkIGZyYWdtZW50cywKKyAgICAgICAgICogbmJfZnJhZ19pbmZvIC0gMSBpcyB0aGUgbmV4dCBmcmFnbWVudCB0byBiZSB3cml0dGVuLiAqLworICAgICAgICBtb3Zfd3JpdGVfdGZyZl90YWcocGIsIG1vdiwgdHJhY2ssIHRyYWNrLT5uYl9mcmFnX2luZm8gLSAyIC0gaSk7CisgICAgfQorICAgIGF2aW9fc2VlayhwYiwgcG9zLCBTRUVLX1NFVCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X2FkZF90ZnJhX2VudHJpZXMoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YsIGludCB0cmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBNT1ZUcmFjayAqdHJhY2sgPSAmbW92LT50cmFja3NbaV07CisgICAgICAgIE1PVkZyYWdtZW50SW5mbyAqaW5mbzsKKyAgICAgICAgaWYgKCh0cmFja3MgPj0gMCAmJiBpICE9IHRyYWNrcykgfHwgIXRyYWNrLT5lbnRyeSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB0cmFjay0+bmJfZnJhZ19pbmZvKys7CisgICAgICAgIGlmICh0cmFjay0+bmJfZnJhZ19pbmZvID49IHRyYWNrLT5mcmFnX2luZm9fY2FwYWNpdHkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG5ld19jYXBhY2l0eSA9IHRyYWNrLT5uYl9mcmFnX2luZm8gKyBNT1ZfRlJBR19JTkZPX0FMTE9DX0lOQ1JFTUVOVDsKKyAgICAgICAgICAgIGlmIChhdl9yZWFsbG9jcF9hcnJheSgmdHJhY2stPmZyYWdfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCp0cmFjay0+ZnJhZ19pbmZvKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIHRyYWNrLT5mcmFnX2luZm9fY2FwYWNpdHkgPSBuZXdfY2FwYWNpdHk7CisgICAgICAgIH0KKyAgICAgICAgaW5mbyA9ICZ0cmFjay0+ZnJhZ19pbmZvW3RyYWNrLT5uYl9mcmFnX2luZm8gLSAxXTsKKyAgICAgICAgaW5mby0+b2Zmc2V0ICAgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBpbmZvLT5zaXplICAgICA9IHNpemU7CisgICAgICAgIC8vIFRyeSB0byByZWNyZWF0ZSB0aGUgb3JpZ2luYWwgcHRzIGZvciB0aGUgZmlyc3QgcGFja2V0CisgICAgICAgIC8vIGZyb20gdGhlIGZpZWxkcyB3ZSBoYXZlIHN0b3JlZAorICAgICAgICBpbmZvLT50aW1lICAgICA9IHRyYWNrLT5zdGFydF9kdHMgKyB0cmFjay0+ZnJhZ19zdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmNsdXN0ZXJbMF0uY3RzOworICAgICAgICAvLyBJZiB0aGUgcHRzIGlzIGxlc3MgdGhhbiB6ZXJvLCB3ZSB3aWxsIGhhdmUgdHJpbW1lZAorICAgICAgICAvLyBhd2F5IHBhcnRzIG9mIHRoZSBtZWRpYSB0cmFjayB1c2luZyBhbiBlZGl0IGxpc3QsCisgICAgICAgIC8vIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzdGFydCBwcmVzZW50YXRpb24gdGltZSBpcyB6ZXJvLgorICAgICAgICBpZiAoaW5mby0+dGltZSA8IDApCisgICAgICAgICAgICBpbmZvLT50aW1lID0gMDsKKyAgICAgICAgaW5mby0+ZHVyYXRpb24gPSB0cmFjay0+c3RhcnRfZHRzICsgdHJhY2stPnRyYWNrX2R1cmF0aW9uIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Y2x1c3RlclswXS5kdHM7CisgICAgICAgIGluZm8tPnRmcmZfb2Zmc2V0ID0gMDsKKyAgICAgICAgbW92X3dyaXRlX3RmcmZfdGFncyhwYiwgbW92LCB0cmFjayk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV90ZmR0X3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAidGZkdCIpOworICAgIGF2aW9fdzgocGIsIDEpOyAvKiB2ZXJzaW9uICovCisgICAgYXZpb193YjI0KHBiLCAwKTsKKyAgICBhdmlvX3diNjQocGIsIHRyYWNrLT5mcmFnX3N0YXJ0KTsKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3RyYWZfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9WVHJhY2sgKnRyYWNrLCBpbnQ2NF90IG1vb2Zfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vb2Zfc2l6ZSkKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSBwbGFjZWhvbGRlciAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInRyYWYiKTsKKworICAgIG1vdl93cml0ZV90ZmhkX3RhZyhwYiwgbW92LCB0cmFjaywgbW9vZl9vZmZzZXQpOworICAgIGlmIChtb3YtPm1vZGUgIT0gTU9ERV9JU00pCisgICAgICAgIG1vdl93cml0ZV90ZmR0X3RhZyhwYiwgdHJhY2spOworICAgIG1vdl93cml0ZV90cnVuX3RhZyhwYiwgbW92LCB0cmFjaywgbW9vZl9zaXplKTsKKyAgICBpZiAobW92LT5tb2RlID09IE1PREVfSVNNKSB7CisgICAgICAgIG1vdl93cml0ZV90ZnhkX3RhZyhwYiwgdHJhY2spOworCisgICAgICAgIGlmIChtb3YtPmlzbV9sb29rYWhlYWQpIHsKKyAgICAgICAgICAgIGludCBpLCBzaXplID0gMTYgKyA0ICsgMSArIDE2ICogbW92LT5pc21fbG9va2FoZWFkOworCisgICAgICAgICAgICBpZiAodHJhY2stPm5iX2ZyYWdfaW5mbyA+IDApIHsKKyAgICAgICAgICAgICAgICBNT1ZGcmFnbWVudEluZm8gKmluZm8gPSAmdHJhY2stPmZyYWdfaW5mb1t0cmFjay0+bmJfZnJhZ19pbmZvIC0gMV07CisgICAgICAgICAgICAgICAgaWYgKCFpbmZvLT50ZnJmX29mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+dGZyZl9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb193YjMyKHBiLCA4ICsgc2l6ZSk7CisgICAgICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJmcmVlIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9tb29mX3RhZ19pbnRlcm5hbChBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFja3MsIGludCBtb29mX3NpemUpCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBpOworCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSBwbGFjZWhvbGRlciAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1vb2YiKTsKKyAgICBtb3YtPmZpcnN0X3RydW4gPSAxOworCisgICAgbW92X3dyaXRlX21maGRfdGFnKHBiLCBtb3YpOworICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBNT1ZUcmFjayAqdHJhY2sgPSAmbW92LT50cmFja3NbaV07CisgICAgICAgIGlmICh0cmFja3MgPj0gMCAmJiBpICE9IHRyYWNrcykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIXRyYWNrLT5lbnRyeSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBtb3Zfd3JpdGVfdHJhZl90YWcocGIsIG1vdiwgdHJhY2ssIHBvcywgbW9vZl9zaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3NpZHhfdGFnKEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVlRyYWNrICp0cmFjaywgaW50IHJlZl9zaXplLCBpbnQgdG90YWxfc2lkeF9zaXplKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKSwgb2Zmc2V0X3BvcywgZW5kX3BvczsKKyAgICBpbnQ2NF90IHByZXNlbnRhdGlvbl90aW1lLCBkdXJhdGlvbiwgb2Zmc2V0OworICAgIGludCBzdGFydHNfd2l0aF9TQVAsIGksIGVudHJpZXM7CisKKyAgICBpZiAodHJhY2stPmVudHJ5KSB7CisgICAgICAgIGVudHJpZXMgPSAxOworICAgICAgICBwcmVzZW50YXRpb25fdGltZSA9IHRyYWNrLT5zdGFydF9kdHMgKyB0cmFjay0+ZnJhZ19zdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmNsdXN0ZXJbMF0uY3RzOworICAgICAgICBkdXJhdGlvbiA9IHRyYWNrLT5zdGFydF9kdHMgKyB0cmFjay0+dHJhY2tfZHVyYXRpb24gLQorICAgICAgICAgICAgICAgICAgIHRyYWNrLT5jbHVzdGVyWzBdLmR0czsKKyAgICAgICAgc3RhcnRzX3dpdGhfU0FQID0gdHJhY2stPmNsdXN0ZXJbMF0uZmxhZ3MgJiBNT1ZfU1lOQ19TQU1QTEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW50cmllcyA9IHRyYWNrLT5uYl9mcmFnX2luZm87CisgICAgICAgIHByZXNlbnRhdGlvbl90aW1lID0gdHJhY2stPmZyYWdfaW5mb1swXS50aW1lOworICAgIH0KKworICAgIC8vIHB0czwwIHNob3VsZCBiZSBjdXQgYXdheSB1c2luZyBlZHRzCisgICAgaWYgKHByZXNlbnRhdGlvbl90aW1lIDwgMCkKKyAgICAgICAgcHJlc2VudGF0aW9uX3RpbWUgPSAwOworCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInNpZHgiKTsKKyAgICBhdmlvX3c4KHBiLCAxKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fd2IyNChwYiwgMCk7CisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+dHJhY2tfaWQpOyAvKiByZWZlcmVuY2VfSUQgKi8KKyAgICBhdmlvX3diMzIocGIsIHRyYWNrLT50aW1lc2NhbGUpOyAvKiB0aW1lc2NhbGUgKi8KKyAgICBhdmlvX3diNjQocGIsIHByZXNlbnRhdGlvbl90aW1lKTsgLyogZWFybGllc3RfcHJlc2VudGF0aW9uX3RpbWUgKi8KKyAgICBvZmZzZXRfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diNjQocGIsIDApOyAvKiBmaXJzdF9vZmZzZXQgKG9mZnNldCB0byByZWZlcmVuY2VkIG1vb2YpICovCisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogcmVzZXJ2ZWQgKi8KKworICAgIGF2aW9fd2IxNihwYiwgZW50cmllcyk7IC8qIHJlZmVyZW5jZV9jb3VudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKyAgICAgICAgaWYgKCF0cmFjay0+ZW50cnkpIHsKKyAgICAgICAgICAgIGlmIChpID4gMSAmJiB0cmFjay0+ZnJhZ19pbmZvW2ldLm9mZnNldCAhPSB0cmFjay0+ZnJhZ19pbmZvW2kgLSAxXS5vZmZzZXQgKyB0cmFjay0+ZnJhZ19pbmZvW2kgLSAxXS5zaXplKSB7CisgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTm9uLWNvbnNlY3V0aXZlIGZyYWdtZW50cywgd3JpdGluZyBpbmNvcnJlY3Qgc2lkeFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkdXJhdGlvbiA9IHRyYWNrLT5mcmFnX2luZm9baV0uZHVyYXRpb247CisgICAgICAgICAgICByZWZfc2l6ZSA9IHRyYWNrLT5mcmFnX2luZm9baV0uc2l6ZTsKKyAgICAgICAgICAgIHN0YXJ0c193aXRoX1NBUCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYXZpb193YjMyKHBiLCAoMCA8PCAzMSkgfCAocmVmX3NpemUgJiAweDdmZmZmZmZmKSk7IC8qIHJlZmVyZW5jZV90eXBlICgwID0gbWVkaWEpIHwgcmVmZXJlbmNlZF9zaXplICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgZHVyYXRpb24pOyAvKiBzdWJzZWdtZW50X2R1cmF0aW9uICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgKHN0YXJ0c193aXRoX1NBUCA8PCAzMSkgfCAoMCA8PCAyOCkgfCAwKTsgLyogc3RhcnRzX3dpdGhfU0FQIHwgU0FQX3R5cGUgfCBTQVBfZGVsdGFfdGltZSAqLworICAgIH0KKworICAgIGVuZF9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgIG9mZnNldCA9IHBvcyArIHRvdGFsX3NpZHhfc2l6ZSAtIGVuZF9wb3M7CisgICAgYXZpb19zZWVrKHBiLCBvZmZzZXRfcG9zLCBTRUVLX1NFVCk7CisgICAgYXZpb193YjY0KHBiLCBvZmZzZXQpOworICAgIGF2aW9fc2VlayhwYiwgZW5kX3BvcywgU0VFS19TRVQpOworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfc2lkeF90YWdzKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFja3MsIGludCByZWZfc2l6ZSkKK3sKKyAgICBpbnQgaSwgcm91bmQsIHJldDsKKyAgICBBVklPQ29udGV4dCAqYXZpb19idWY7CisgICAgaW50IHRvdGFsX3NpemUgPSAwOworICAgIGZvciAocm91bmQgPSAwOyByb3VuZCA8IDI7IHJvdW5kKyspIHsKKyAgICAgICAgLy8gRmlyc3QgcnVuIG9uZSByb3VuZCB0byBjYWxjdWxhdGUgdGhlIHRvdGFsIHNpemUgb2YgYWxsCisgICAgICAgIC8vIHNpZHggYXRvbXMuCisgICAgICAgIC8vIFRoaXMgd291bGQgYmUgbXVjaCBzaW1wbGVyIGlmIHdlJ2Qgb25seSB3cml0ZSBvbmUgc2lkeAorICAgICAgICAvLyBhdG9tLCBmb3IgdGhlIGZpcnN0IHRyYWNrIGluIHRoZSBtb29mLgorICAgICAgICBpZiAocm91bmQgPT0gMCkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBmZmlvX29wZW5fbnVsbF9idWYoJmF2aW9fYnVmKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdmlvX2J1ZiA9IHBiOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgTU9WVHJhY2sgKnRyYWNrID0gJm1vdi0+dHJhY2tzW2ldOworICAgICAgICAgICAgaWYgKHRyYWNrcyA+PSAwICYmIGkgIT0gdHJhY2tzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgLy8gV2hlbiB3cml0aW5nIGEgc2lkeCBmb3IgdGhlIGZ1bGwgZmlsZSwgZW50cnkgaXMgMCwgYnV0CisgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIGluY2x1ZGUgYWxsIHRyYWNrcy4gcmVmX3NpemUgaXMgMCBpbiB0aGlzIGNhc2UsCisgICAgICAgICAgICAvLyBzaW5jZSB3ZSByZWFkIGl0IGZyb20gZnJhZ19pbmZvIGluc3RlYWQuCisgICAgICAgICAgICBpZiAoIXRyYWNrLT5lbnRyeSAmJiByZWZfc2l6ZSA+IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB0b3RhbF9zaXplIC09IG1vdl93cml0ZV9zaWR4X3RhZyhhdmlvX2J1ZiwgdHJhY2ssIHJlZl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvdW5kID09IDApCisgICAgICAgICAgICB0b3RhbF9zaXplID0gZmZpb19jbG9zZV9udWxsX2J1ZihhdmlvX2J1Zik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9tb29mX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwgaW50IHRyYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWRhdF9zaXplKQoreworICAgIEFWSU9Db250ZXh0ICphdmlvX2J1ZjsKKyAgICBpbnQgcmV0LCBtb29mX3NpemU7CisKKyAgICBpZiAoKHJldCA9IGZmaW9fb3Blbl9udWxsX2J1ZigmYXZpb19idWYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgbW92X3dyaXRlX21vb2ZfdGFnX2ludGVybmFsKGF2aW9fYnVmLCBtb3YsIHRyYWNrcywgMCk7CisgICAgbW9vZl9zaXplID0gZmZpb19jbG9zZV9udWxsX2J1ZihhdmlvX2J1Zik7CisKKyAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0RBU0ggJiYgIShtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRkFTVFNUQVJUKSkKKyAgICAgICAgbW92X3dyaXRlX3NpZHhfdGFncyhwYiwgbW92LCB0cmFja3MsIG1vb2Zfc2l6ZSArIDggKyBtZGF0X3NpemUpOworCisgICAgaWYgKChyZXQgPSBtb3ZfYWRkX3RmcmFfZW50cmllcyhwYiwgbW92LCB0cmFja3MsIG1vb2Zfc2l6ZSArIDggKyBtZGF0X3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gbW92X3dyaXRlX21vb2ZfdGFnX2ludGVybmFsKHBiLCBtb3YsIHRyYWNrcywgbW9vZl9zaXplKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfdGZyYV90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBpOworCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSBwbGFjZWhvbGRlciAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInRmcmEiKTsKKyAgICBhdmlvX3c4KHBiLCAxKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fd2IyNChwYiwgMCk7CisKKyAgICBhdmlvX3diMzIocGIsIHRyYWNrLT50cmFja19pZCk7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogbGVuZ3RoIG9mIHRyYWYvdHJ1bi9zYW1wbGUgbnVtICovCisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+bmJfZnJhZ19pbmZvKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdHJhY2stPm5iX2ZyYWdfaW5mbzsgaSsrKSB7CisgICAgICAgIGF2aW9fd2I2NChwYiwgdHJhY2stPmZyYWdfaW5mb1tpXS50aW1lKTsKKyAgICAgICAgYXZpb193YjY0KHBiLCB0cmFjay0+ZnJhZ19pbmZvW2ldLm9mZnNldCArIHRyYWNrLT5kYXRhX29mZnNldCk7CisgICAgICAgIGF2aW9fdzgocGIsIDEpOyAvKiB0cmFmIG51bWJlciAqLworICAgICAgICBhdmlvX3c4KHBiLCAxKTsgLyogdHJ1biBudW1iZXIgKi8KKyAgICAgICAgYXZpb193OChwYiwgMSk7IC8qIHNhbXBsZSBudW1iZXIgKi8KKyAgICB9CisKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX21mcmFfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92KQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBpbnQgaTsKKworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgcGxhY2Vob2xkZXIgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJtZnJhIik7CisgICAgLyogQW4gZW1wdHkgbWZyYSBhdG9tIGlzIGVub3VnaCB0byBpbmRpY2F0ZSB0byB0aGUgcHVibGlzaGluZyBwb2ludCB0aGF0CisgICAgICogdGhlIHN0cmVhbSBoYXMgZW5kZWQuICovCisgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19JU01MKQorICAgICAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgTU9WVHJhY2sgKnRyYWNrID0gJm1vdi0+dHJhY2tzW2ldOworICAgICAgICBpZiAodHJhY2stPm5iX2ZyYWdfaW5mbykKKyAgICAgICAgICAgIG1vdl93cml0ZV90ZnJhX3RhZyhwYiwgdHJhY2spOworICAgIH0KKworICAgIGF2aW9fd2IzMihwYiwgMTYpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1mcm8iKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiB2ZXJzaW9uICsgZmxhZ3MgKi8KKyAgICBhdmlvX3diMzIocGIsIGF2aW9fdGVsbChwYikgKyA0IC0gcG9zKTsKKworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfbWRhdF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YpCit7CisgICAgYXZpb193YjMyKHBiLCA4KTsgICAgLy8gcGxhY2Vob2xkZXIgZm9yIGV4dGVuZGVkIHNpemUgZmllbGQgKDY0IGJpdCkKKyAgICBmZmlvX3dmb3VyY2MocGIsIG1vdi0+bW9kZSA9PSBNT0RFX01PViA/ICJ3aWRlIiA6ICJmcmVlIik7CisKKyAgICBtb3YtPm1kYXRfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplIHBsYWNlaG9sZGVyKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJtZGF0Iik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFRPRE86IFRoaXMgbmVlZHMgdG8gYmUgbW9yZSBnZW5lcmFsICovCitzdGF0aWMgaW50IG1vdl93cml0ZV9mdHlwX3RhZyhBVklPQ29udGV4dCAqcGIsIEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNT1ZNdXhDb250ZXh0ICptb3YgPSBzLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBoYXNfaDI2NCA9IDAsIGhhc192aWRlbyA9IDA7CisgICAgaW50IG1pbm9yID0gMHgyMDA7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgaGFzX3ZpZGVvID0gMTsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkKKyAgICAgICAgICAgIGhhc19oMjY0ID0gMTsKKyAgICB9CisKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAiZnR5cCIpOworCisgICAgaWYgKG1vdi0+bWFqb3JfYnJhbmQgJiYgc3RybGVuKG1vdi0+bWFqb3JfYnJhbmQpID49IDQpCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgbW92LT5tYWpvcl9icmFuZCk7CisgICAgZWxzZSBpZiAobW92LT5tb2RlID09IE1PREVfM0dQKSB7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgaGFzX2gyNjQgPyAiM2dwNiIgIDogIjNncDQiKTsKKyAgICAgICAgbWlub3IgPSAgICAgaGFzX2gyNjQgPyAgIDB4MTAwIDogICAweDIwMDsKKyAgICB9IGVsc2UgaWYgKG1vdi0+bW9kZSAmIE1PREVfM0cyKSB7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgaGFzX2gyNjQgPyAiM2cyYiIgIDogIjNnMmEiKTsKKyAgICAgICAgbWlub3IgPSAgICAgaGFzX2gyNjQgPyAweDIwMDAwIDogMHgxMDAwMDsKKyAgICB9IGVsc2UgaWYgKG1vdi0+bW9kZSA9PSBNT0RFX1BTUCkKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiTVNOViIpOworICAgIGVsc2UgaWYgKG1vdi0+bW9kZSA9PSBNT0RFX01QNCAmJiBtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfREVGQVVMVF9CQVNFX01PT0YpCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImlzbzUiKTsgLy8gUmVxdWlyZWQgd2hlbiB1c2luZyBkZWZhdWx0LWJhc2UtaXMtbW9vZgorICAgIGVsc2UgaWYgKG1vdi0+bW9kZSA9PSBNT0RFX01QNCkKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiaXNvbSIpOworICAgIGVsc2UgaWYgKG1vdi0+bW9kZSA9PSBNT0RFX0lQT0QpCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgaGFzX3ZpZGVvID8gIk00ViAiOiJNNEEgIik7CisgICAgZWxzZSBpZiAobW92LT5tb2RlID09IE1PREVfSVNNKQorICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJpc21sIik7CisgICAgZWxzZSBpZiAobW92LT5tb2RlID09IE1PREVfRjRWKQorICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJmNHYgIik7CisgICAgZWxzZQorICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJxdCAgIik7CisKKyAgICBhdmlvX3diMzIocGIsIG1pbm9yKTsKKworICAgIGlmIChtb3YtPm1vZGUgPT0gTU9ERV9NT1YpCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgInF0ICAiKTsKKyAgICBlbHNlIGlmIChtb3YtPm1vZGUgPT0gTU9ERV9JU00pIHsKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAicGlmZiIpOworICAgIH0gZWxzZSBpZiAoIShtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfREVGQVVMVF9CQVNFX01PT0YpKSB7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImlzb20iKTsKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiaXNvMiIpOworICAgICAgICBpZiAoaGFzX2gyNjQpCisgICAgICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJhdmMxIik7CisgICAgfQorCisgICAgLy8gV2UgYWRkIHRmZHQgYXRvbXMgd2hlbiBmcmFnbWVudGluZywgc2lnbmFsIHRoaXMgd2l0aCB0aGUgaXNvNiBjb21wYXRpYmxlCisgICAgLy8gYnJhbmQuIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIHVzZXJzIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCB0ZmR0LgorICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR01FTlQgJiYgbW92LT5tb2RlICE9IE1PREVfSVNNKQorICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJpc282Iik7CisKKyAgICBpZiAobW92LT5tb2RlID09IE1PREVfM0dQKQorICAgICAgICBmZmlvX3dmb3VyY2MocGIsIGhhc19oMjY0ID8gIjNncDYiOiIzZ3A0Iik7CisgICAgZWxzZSBpZiAobW92LT5tb2RlICYgTU9ERV8zRzIpCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgaGFzX2gyNjQgPyAiM2cyYiI6IjNnMmEiKTsKKyAgICBlbHNlIGlmIChtb3YtPm1vZGUgPT0gTU9ERV9QU1ApCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgIk1TTlYiKTsKKyAgICBlbHNlIGlmIChtb3YtPm1vZGUgPT0gTU9ERV9NUDQpCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1wNDEiKTsKKworICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfREFTSCAmJiBtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRkFTVFNUQVJUKQorICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJkYXNoIik7CisKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyB2b2lkIG1vdl93cml0ZV91dWlkcHJvZl90YWcoQVZJT0NvbnRleHQgKnBiLCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gICAgICAgKnZpZGVvX3N0ICAgID0gcy0+c3RyZWFtc1swXTsKKyAgICBBVkNvZGVjQ29udGV4dCAqdmlkZW9fY29kZWMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXVkaW9fY29kZWMgPSBzLT5zdHJlYW1zWzFdLT5jb2RlYzsKKyAgICBpbnQgYXVkaW9fcmF0ZSA9IGF1ZGlvX2NvZGVjLT5zYW1wbGVfcmF0ZTsKKyAgICAvLyBUT0RPOiBzaG91bGQgYmUgYXZnX2ZyYW1lX3JhdGUKKyAgICBpbnQgZnJhbWVfcmF0ZSA9ICgodmlkZW9fc3QtPnRpbWVfYmFzZS5kZW4pICogKDB4MTAwMDApKSAvICh2aWRlb19zdC0+dGltZV9iYXNlLm51bSk7CisgICAgaW50IGF1ZGlvX2tiaXRyYXRlID0gYXVkaW9fY29kZWMtPmJpdF9yYXRlIC8gMTAwMDsKKyAgICBpbnQgdmlkZW9fa2JpdHJhdGUgPSBGRk1JTih2aWRlb19jb2RlYy0+Yml0X3JhdGUgLyAxMDAwLCA4MDAgLSBhdWRpb19rYml0cmF0ZSk7CisKKyAgICBhdmlvX3diMzIocGIsIDB4OTQpOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAidXVpZCIpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIlBST0YiKTsKKworICAgIGF2aW9fd2IzMihwYiwgMHgyMWQyNGZjZSk7IC8qIDk2IGJpdCBVVUlEICovCisgICAgYXZpb193YjMyKHBiLCAweGJiODg2OTVjKTsKKyAgICBhdmlvX3diMzIocGIsIDB4ZmFjOWM3NDApOworCisgICAgYXZpb193YjMyKHBiLCAweDApOyAgLyogPyAqLworICAgIGF2aW9fd2IzMihwYiwgMHgzKTsgIC8qIDMgc2VjdGlvbnMgPyAqLworCisgICAgYXZpb193YjMyKHBiLCAweDE0KTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkZQUkYiKTsKKyAgICBhdmlvX3diMzIocGIsIDB4MCk7ICAvKiA/ICovCisgICAgYXZpb193YjMyKHBiLCAweDApOyAgLyogPyAqLworICAgIGF2aW9fd2IzMihwYiwgMHgwKTsgIC8qID8gKi8KKworICAgIGF2aW9fd2IzMihwYiwgMHgyYyk7ICAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAiQVBSRiIpOyAvKiBhdWRpbyAqLworICAgIGF2aW9fd2IzMihwYiwgMHgwKTsKKyAgICBhdmlvX3diMzIocGIsIDB4Mik7ICAgLyogVHJhY2tJRCAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1wNGEiKTsKKyAgICBhdmlvX3diMzIocGIsIDB4MjBmKTsKKyAgICBhdmlvX3diMzIocGIsIDB4MCk7CisgICAgYXZpb193YjMyKHBiLCBhdWRpb19rYml0cmF0ZSk7CisgICAgYXZpb193YjMyKHBiLCBhdWRpb19rYml0cmF0ZSk7CisgICAgYXZpb193YjMyKHBiLCBhdWRpb19yYXRlKTsKKyAgICBhdmlvX3diMzIocGIsIGF1ZGlvX2NvZGVjLT5jaGFubmVscyk7CisKKyAgICBhdmlvX3diMzIocGIsIDB4MzQpOyAgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIlZQUkYiKTsgICAvKiB2aWRlbyAqLworICAgIGF2aW9fd2IzMihwYiwgMHgwKTsKKyAgICBhdmlvX3diMzIocGIsIDB4MSk7ICAgIC8qIFRyYWNrSUQgKi8KKyAgICBpZiAodmlkZW9fY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiYXZjMSIpOworICAgICAgICBhdmlvX3diMTYocGIsIDB4MDE0RCk7CisgICAgICAgIGF2aW9fd2IxNihwYiwgMHgwMDE1KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJtcDR2Iik7CisgICAgICAgIGF2aW9fd2IxNihwYiwgMHgwMDAwKTsKKyAgICAgICAgYXZpb193YjE2KHBiLCAweDAxMDMpOworICAgIH0KKyAgICBhdmlvX3diMzIocGIsIDB4MCk7CisgICAgYXZpb193YjMyKHBiLCB2aWRlb19rYml0cmF0ZSk7CisgICAgYXZpb193YjMyKHBiLCB2aWRlb19rYml0cmF0ZSk7CisgICAgYXZpb193YjMyKHBiLCBmcmFtZV9yYXRlKTsKKyAgICBhdmlvX3diMzIocGIsIGZyYW1lX3JhdGUpOworICAgIGF2aW9fd2IxNihwYiwgdmlkZW9fY29kZWMtPndpZHRoKTsKKyAgICBhdmlvX3diMTYocGIsIHZpZGVvX2NvZGVjLT5oZWlnaHQpOworICAgIGF2aW9fd2IzMihwYiwgMHgwMTAwMDEpOyAvKiA/ICovCit9CisKK3N0YXRpYyBpbnQgbW92X3BhcnNlX21wZWcyX2ZyYW1lKEFWUGFja2V0ICpwa3QsIHVpbnQzMl90ICpmbGFncykKK3sKKyAgICB1aW50MzJfdCBjID0gLTE7CisgICAgaW50IGksIGNsb3NlZF9nb3AgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHBrdC0+c2l6ZSAtIDQ7IGkrKykgeworICAgICAgICBjID0gKGMgPDwgOCkgKyBwa3QtPmRhdGFbaV07CisgICAgICAgIGlmIChjID09IDB4MWI4KSB7IC8vIGdvcAorICAgICAgICAgICAgY2xvc2VkX2dvcCA9IHBrdC0+ZGF0YVtpICsgNF0gPj4gNiAmIDB4MDE7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAweDEwMCkgeyAvLyBwaWMKKyAgICAgICAgICAgIGludCB0ZW1wX3JlZiA9IChwa3QtPmRhdGFbaSArIDFdIDw8IDIpIHwgKHBrdC0+ZGF0YVtpICsgMl0gPj4gNik7CisgICAgICAgICAgICBpZiAoIXRlbXBfcmVmIHx8IGNsb3NlZF9nb3ApIC8vIEkgcGljdHVyZSBpcyBub3QgcmVvcmRlcmVkCisgICAgICAgICAgICAgICAgKmZsYWdzID0gTU9WX1NZTkNfU0FNUExFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpmbGFncyA9IE1PVl9QQVJUSUFMX1NZTkNfU0FNUExFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1vdl9wYXJzZV92YzFfZnJhbWUoQVZQYWNrZXQgKnBrdCwgTU9WVHJhY2sgKnRyaywgaW50IGZyYWdtZW50KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnN0YXJ0LCAqbmV4dCwgKmVuZCA9IHBrdC0+ZGF0YSArIHBrdC0+c2l6ZTsKKyAgICBpbnQgc2VxID0gMCwgZW50cnkgPSAwOworICAgIGludCBrZXkgPSBwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZOworICAgIHN0YXJ0ID0gZmluZF9uZXh0X21hcmtlcihwa3QtPmRhdGEsIGVuZCk7CisgICAgZm9yIChuZXh0ID0gc3RhcnQ7IG5leHQgPCBlbmQ7IHN0YXJ0ID0gbmV4dCkgeworICAgICAgICBuZXh0ID0gZmluZF9uZXh0X21hcmtlcihzdGFydCArIDQsIGVuZCk7CisgICAgICAgIHN3aXRjaCAoQVZfUkIzMihzdGFydCkpIHsKKyAgICAgICAgY2FzZSBWQzFfQ09ERV9TRVFIRFI6CisgICAgICAgICAgICBzZXEgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVkMxX0NPREVfRU5UUllQT0lOVDoKKyAgICAgICAgICAgIGVudHJ5ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZDMV9DT0RFX1NMSUNFOgorICAgICAgICAgICAgdHJrLT52YzFfaW5mby5zbGljZXMgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCF0cmstPmVudHJ5ICYmICFmcmFnbWVudCkgeworICAgICAgICAvKiBGaXJzdCBwYWNrZXQgaW4gZmlyc3QgZnJhZ21lbnQgKi8KKyAgICAgICAgdHJrLT52YzFfaW5mby5maXJzdF9wYWNrZXRfc2VxICAgPSBzZXE7CisgICAgICAgIHRyay0+dmMxX2luZm8uZmlyc3RfcGFja2V0X2VudHJ5ID0gZW50cnk7CisgICAgfSBlbHNlIGlmICgoc2VxICYmICF0cmstPnZjMV9pbmZvLnBhY2tldF9zZXEpIHx8CisgICAgICAgICAgICAgICAoZW50cnkgJiYgIXRyay0+dmMxX2luZm8ucGFja2V0X2VudHJ5KSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRyay0+ZW50cnk7IGkrKykKKyAgICAgICAgICAgIHRyay0+Y2x1c3RlcltpXS5mbGFncyAmPSB+TU9WX1NZTkNfU0FNUExFOworICAgICAgICB0cmstPmhhc19rZXlmcmFtZXMgPSAwOworICAgICAgICBpZiAoc2VxKQorICAgICAgICAgICAgdHJrLT52YzFfaW5mby5wYWNrZXRfc2VxID0gMTsKKyAgICAgICAgaWYgKGVudHJ5KQorICAgICAgICAgICAgdHJrLT52YzFfaW5mby5wYWNrZXRfZW50cnkgPSAxOworICAgICAgICBpZiAoIWZyYWdtZW50KSB7CisgICAgICAgICAgICAvKiBGaXJzdCBmcmFnbWVudCAqLworICAgICAgICAgICAgaWYgKCghc2VxICAgfHwgdHJrLT52YzFfaW5mby5maXJzdF9wYWNrZXRfc2VxKSAmJgorICAgICAgICAgICAgICAgICghZW50cnkgfHwgdHJrLT52YzFfaW5mby5maXJzdF9wYWNrZXRfZW50cnkpKSB7CisgICAgICAgICAgICAgICAgLyogRmlyc3QgcGFja2V0IGhhZCB0aGUgc2FtZSBoZWFkZXJzIGFzIHRoaXMgb25lLCByZWFkZCB0aGUKKyAgICAgICAgICAgICAgICAgKiBzeW5jIHNhbXBsZSBmbGFnLiAqLworICAgICAgICAgICAgICAgIHRyay0+Y2x1c3RlclswXS5mbGFncyB8PSBNT1ZfU1lOQ19TQU1QTEU7CisgICAgICAgICAgICAgICAgdHJrLT5oYXNfa2V5ZnJhbWVzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodHJrLT52YzFfaW5mby5wYWNrZXRfc2VxICYmIHRyay0+dmMxX2luZm8ucGFja2V0X2VudHJ5KQorICAgICAgICBrZXkgPSBzZXEgJiYgZW50cnk7CisgICAgZWxzZSBpZiAodHJrLT52YzFfaW5mby5wYWNrZXRfc2VxKQorICAgICAgICBrZXkgPSBzZXE7CisgICAgZWxzZSBpZiAodHJrLT52YzFfaW5mby5wYWNrZXRfZW50cnkpCisgICAgICAgIGtleSA9IGVudHJ5OworICAgIGlmIChrZXkpIHsKKyAgICAgICAgdHJrLT5jbHVzdGVyW3Ryay0+ZW50cnldLmZsYWdzIHw9IE1PVl9TWU5DX1NBTVBMRTsKKyAgICAgICAgdHJrLT5oYXNfa2V5ZnJhbWVzKys7CisgICAgfQorfQorCitzdGF0aWMgaW50IG1vdl9mbHVzaF9mcmFnbWVudChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTU9WTXV4Q29udGV4dCAqbW92ID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpLCBmaXJzdF90cmFjayA9IC0xOworICAgIGludDY0X3QgbWRhdF9zaXplID0gMDsKKworICAgIGlmICghKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19GUkFHTUVOVCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCEobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0VNUFRZX01PT1YpICYmIG1vdi0+ZnJhZ21lbnRzID09IDApIHsKKyAgICAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICB1aW50OF90ICpidWY7CisgICAgICAgIGludCBidWZfc2l6ZSwgbW9vdl9zaXplOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgICAgIGlmICghbW92LT50cmFja3NbaV0uZW50cnkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIERvbid0IHdyaXRlIHRoZSBpbml0aWFsIG1vb3YgdW5sZXNzIGFsbCB0cmFja3MgaGF2ZSBkYXRhICovCisgICAgICAgIGlmIChpIDwgbW92LT5uYl9zdHJlYW1zKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgbW9vdl9zaXplID0gZ2V0X21vb3Zfc2l6ZShzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vdi0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICAgICAgbW92LT50cmFja3NbaV0uZGF0YV9vZmZzZXQgPSBwb3MgKyBtb292X3NpemUgKyA4OworCisgICAgICAgIG1vdl93cml0ZV9tb292X3RhZyhzLT5wYiwgbW92LCBzKTsKKworICAgICAgICBidWZfc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1Zihtb3YtPm1kYXRfYnVmLCAmYnVmKTsKKyAgICAgICAgbW92LT5tZGF0X2J1ZiA9IE5VTEw7CisgICAgICAgIGF2aW9fd2IzMihzLT5wYiwgYnVmX3NpemUgKyA4KTsKKyAgICAgICAgZmZpb193Zm91cmNjKHMtPnBiLCAibWRhdCIpOworICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgYXZfZnJlZShidWYpOworCisgICAgICAgIG1vdi0+ZnJhZ21lbnRzKys7CisgICAgICAgIG1vdi0+bWRhdF9zaXplID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vdi0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBpZiAobW92LT50cmFja3NbaV0uZW50cnkpCisgICAgICAgICAgICAgICAgbW92LT50cmFja3NbaV0uZnJhZ19zdGFydCArPSBtb3YtPnRyYWNrc1tpXS5zdGFydF9kdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92LT50cmFja3NbaV0udHJhY2tfZHVyYXRpb24gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92LT50cmFja3NbaV0uY2x1c3RlclswXS5kdHM7CisgICAgICAgICAgICBtb3YtPnRyYWNrc1tpXS5lbnRyeSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19mbHVzaChzLT5wYik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBNT1ZUcmFjayAqdHJhY2sgPSAmbW92LT50cmFja3NbaV07CisgICAgICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfU0VQQVJBVEVfTU9PRikKKyAgICAgICAgICAgIHRyYWNrLT5kYXRhX29mZnNldCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRyYWNrLT5kYXRhX29mZnNldCA9IG1kYXRfc2l6ZTsKKyAgICAgICAgaWYgKCF0cmFjay0+bWRhdF9idWYpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbWRhdF9zaXplICs9IGF2aW9fdGVsbCh0cmFjay0+bWRhdF9idWYpOworICAgICAgICBpZiAoZmlyc3RfdHJhY2sgPCAwKQorICAgICAgICAgICAgZmlyc3RfdHJhY2sgPSBpOworICAgIH0KKworICAgIGlmICghbWRhdF9zaXplKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBNT1ZUcmFjayAqdHJhY2sgPSAmbW92LT50cmFja3NbaV07CisgICAgICAgIGludCBidWZfc2l6ZSwgd3JpdGVfbW9vZiA9IDEsIG1vb2ZfdHJhY2tzID0gLTE7CisgICAgICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbiA9IDA7CisKKyAgICAgICAgaWYgKHRyYWNrLT5lbnRyeSkKKyAgICAgICAgICAgIGR1cmF0aW9uID0gdHJhY2stPnN0YXJ0X2R0cyArIHRyYWNrLT50cmFja19kdXJhdGlvbiAtCisgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5jbHVzdGVyWzBdLmR0czsKKyAgICAgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19TRVBBUkFURV9NT09GKSB7CisgICAgICAgICAgICBpZiAoIXRyYWNrLT5tZGF0X2J1ZikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG1kYXRfc2l6ZSA9IGF2aW9fdGVsbCh0cmFjay0+bWRhdF9idWYpOworICAgICAgICAgICAgbW9vZl90cmFja3MgPSBpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVfbW9vZiA9IGkgPT0gZmlyc3RfdHJhY2s7CisgICAgICAgIH0KKworICAgICAgICBpZiAod3JpdGVfbW9vZikgeworICAgICAgICAgICAgYXZpb19mbHVzaChzLT5wYik7CisKKyAgICAgICAgICAgIG1vdl93cml0ZV9tb29mX3RhZyhzLT5wYiwgbW92LCBtb29mX3RyYWNrcywgbWRhdF9zaXplKTsKKyAgICAgICAgICAgIG1vdi0+ZnJhZ21lbnRzKys7CisKKyAgICAgICAgICAgIGF2aW9fd2IzMihzLT5wYiwgbWRhdF9zaXplICsgOCk7CisgICAgICAgICAgICBmZmlvX3dmb3VyY2Mocy0+cGIsICJtZGF0Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhY2stPmVudHJ5KQorICAgICAgICAgICAgdHJhY2stPmZyYWdfc3RhcnQgKz0gZHVyYXRpb247CisgICAgICAgIHRyYWNrLT5lbnRyeSA9IDA7CisgICAgICAgIGlmICghdHJhY2stPm1kYXRfYnVmKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGJ1Zl9zaXplID0gYXZpb19jbG9zZV9keW5fYnVmKHRyYWNrLT5tZGF0X2J1ZiwgJmJ1Zik7CisgICAgICAgIHRyYWNrLT5tZGF0X2J1ZiA9IE5VTEw7CisKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgIGF2X2ZyZWUoYnVmKTsKKyAgICB9CisKKyAgICBtb3YtPm1kYXRfc2l6ZSA9IDA7CisKKyAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX21vdl93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE1PVk11eENvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBNT1ZUcmFjayAqdHJrID0gJm1vdi0+dHJhY2tzW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gdHJrLT5lbmM7CisgICAgdW5zaWduZWQgaW50IHNhbXBsZXNfaW5fY2h1bmsgPSAwOworICAgIGludCBzaXplID0gcGt0LT5zaXplLCByZXQgPSAwOworICAgIHVpbnQ4X3QgKnJlZm9ybWF0dGVkX2RhdGEgPSBOVUxMOworCisgICAgaWYgKHRyay0+ZW50cnkpIHsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbiA9IHBrdC0+ZHRzIC0gdHJrLT5jbHVzdGVyW3Ryay0+ZW50cnkgLSAxXS5kdHM7CisgICAgICAgIGlmIChkdXJhdGlvbiA8IDAgfHwgZHVyYXRpb24gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQXBwbGljYXRpb24gcHJvdmlkZWQgZHVyYXRpb246ICUiUFJJZDY0IiAvIHRpbWVzdGFtcDogJSJQUklkNjQiIGlzIG91dCBvZiByYW5nZSBmb3IgbW92L21wNCBmb3JtYXRcbiIsCisgICAgICAgICAgICAgICAgZHVyYXRpb24sIHBrdC0+ZHRzCisgICAgICAgICAgICApOworCisgICAgICAgICAgICBwa3QtPmR0cyA9IHRyay0+Y2x1c3Rlclt0cmstPmVudHJ5IC0gMV0uZHRzICsgMTsKKyAgICAgICAgICAgIHBrdC0+cHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBrdC0+ZHVyYXRpb24gPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQXBwbGljYXRpb24gcHJvdmlkZWQgZHVyYXRpb246ICVkIGlzIGludmFsaWRcbiIsIHBrdC0+ZHVyYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZSQUdNRU5UKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIGlmIChtb3YtPmZyYWdtZW50cyA+IDApIHsKKyAgICAgICAgICAgIGlmICghdHJrLT5tZGF0X2J1ZikgeworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJnRyay0+bWRhdF9idWYpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYiA9IHRyay0+bWRhdF9idWY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1vdi0+bWRhdF9idWYpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZtb3YtPm1kYXRfYnVmKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGIgPSBtb3YtPm1kYXRfYnVmOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX05CKSB7CisgICAgICAgIC8qIFdlIG11c3QgZmluZCBvdXQgaG93IG1hbnkgQU1SIGJsb2NrcyB0aGVyZSBhcmUgaW4gb25lIHBhY2tldCAqLworICAgICAgICBzdGF0aWMgdWludDE2X3QgcGFja2VkX3NpemVbMTZdID0KKyAgICAgICAgICAgIHsxMywgMTQsIDE2LCAxOCwgMjAsIDIxLCAyNywgMzIsIDYsIDAsIDAsIDAsIDAsIDAsIDAsIDF9OworICAgICAgICBpbnQgbGVuID0gMDsKKworICAgICAgICB3aGlsZSAobGVuIDwgc2l6ZSAmJiBzYW1wbGVzX2luX2NodW5rIDwgMTAwKSB7CisgICAgICAgICAgICBsZW4gKz0gcGFja2VkX3NpemVbKHBrdC0+ZGF0YVtsZW5dID4+IDMpICYgMHgwRl07CisgICAgICAgICAgICBzYW1wbGVzX2luX2NodW5rKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNhbXBsZXNfaW5fY2h1bmsgPiAxKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZmF0YWwgZXJyb3IsIGlucHV0IGlzIG5vdCBhIHNpbmdsZSBwYWNrZXQsIGltcGxlbWVudCBhIEFWUGFyc2VyIGZvciBpdFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fTVMgfHwKKyAgICAgICAgICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVikgeworICAgICAgICBzYW1wbGVzX2luX2NodW5rID0gZW5jLT5mcmFtZV9zaXplOworICAgIH0gZWxzZSBpZiAodHJrLT5zYW1wbGVfc2l6ZSkKKyAgICAgICAgc2FtcGxlc19pbl9jaHVuayA9IHNpemUgLyB0cmstPnNhbXBsZV9zaXplOworICAgIGVsc2UKKyAgICAgICAgc2FtcGxlc19pbl9jaHVuayA9IDE7CisKKyAgICAvKiBjb3B5IGV4dHJhZGF0YSBpZiBpdCBleGlzdHMgKi8KKyAgICBpZiAodHJrLT52b3NfbGVuID09IDAgJiYgZW5jLT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYgIVRBR19JU19BVkNJKHRyay0+dGFnKSkgeworICAgICAgICB0cmstPnZvc19sZW4gID0gZW5jLT5leHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgdHJrLT52b3NfZGF0YSA9IGF2X21hbGxvYyh0cmstPnZvc19sZW4pOworICAgICAgICBtZW1jcHkodHJrLT52b3NfZGF0YSwgZW5jLT5leHRyYWRhdGEsIHRyay0+dm9zX2xlbik7CisgICAgfQorCisgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmIHBrdC0+c2l6ZSA+IDIgJiYKKyAgICAgICAgKEFWX1JCMTYocGt0LT5kYXRhKSAmIDB4ZmZmMCkgPT0gMHhmZmYwKSB7CisgICAgICAgIGlmICghcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPm5iX2ZyYW1lcykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk1hbGZvcm1lZCBBQUMgYml0c3RyZWFtIGRldGVjdGVkOiAiCisgICAgICAgICAgICAgICAgICAgInVzZSB0aGUgYXVkaW8gYml0c3RyZWFtIGZpbHRlciAnYWFjX2FkdHN0b2FzYycgdG8gZml4IGl0ICIKKyAgICAgICAgICAgICAgICAgICAiKCctYnNmOmEgYWFjX2FkdHN0b2FzYycgb3B0aW9uIHdpdGggZmZtcGVnKVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiYWFjIGJpdHN0cmVhbSBlcnJvclxuIik7CisgICAgfQorICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgJiYgdHJrLT52b3NfbGVuID4gMCAmJiAqKHVpbnQ4X3QgKil0cmstPnZvc19kYXRhICE9IDEgJiYgIVRBR19JU19BVkNJKHRyay0+dGFnKSkgeworICAgICAgICAvKiBmcm9tIHgyNjQgb3IgZnJvbSBieXRlc3RyZWFtIGgyNjQgKi8KKyAgICAgICAgLyogbmFsIHJlZm9ybWF0aW5nIG5lZWRlZCAqLworICAgICAgICBpZiAodHJrLT5oaW50X3RyYWNrID49IDAgJiYgdHJrLT5oaW50X3RyYWNrIDwgbW92LT5uYl9zdHJlYW1zKSB7CisgICAgICAgICAgICBmZl9hdmNfcGFyc2VfbmFsX3VuaXRzX2J1Zihwa3QtPmRhdGEsICZyZWZvcm1hdHRlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgICAgICAgICAgYXZpb193cml0ZShwYiwgcmVmb3JtYXR0ZWRfZGF0YSwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplID0gZmZfYXZjX3BhcnNlX25hbF91bml0cyhwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0hFVkMgJiYgdHJrLT52b3NfbGVuID4gNiAmJgorICAgICAgICAgICAgICAgKEFWX1JCMjQodHJrLT52b3NfZGF0YSkgPT0gMSB8fCBBVl9SQjMyKHRyay0+dm9zX2RhdGEpID09IDEpKSB7CisgICAgICAgIC8qIGV4dHJhZGF0YSBpcyBBbm5leCBCLCBhc3N1bWUgdGhlIGJpdHN0cmVhbSBpcyB0b28gYW5kIGNvbnZlcnQgaXQgKi8KKyAgICAgICAgaWYgKHRyay0+aGludF90cmFjayA+PSAwICYmIHRyay0+aGludF90cmFjayA8IG1vdi0+bmJfc3RyZWFtcykgeworICAgICAgICAgICAgZmZfaGV2Y19hbm5leGIybXA0X2J1Zihwa3QtPmRhdGEsICZyZWZvcm1hdHRlZF9kYXRhLCAmc2l6ZSwgMCwgTlVMTCk7CisgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCByZWZvcm1hdHRlZF9kYXRhLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgPSBmZl9oZXZjX2FubmV4YjJtcDQocGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplLCAwLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9FQUMzKSB7CisgICAgICAgIHNpemUgPSBoYW5kbGVfZWFjMyhtb3YsIHBrdCwgdHJrKTsKKyAgICAgICAgaWYgKHNpemUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIGVsc2UgaWYgKCFzaXplKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICBpZiAoKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRE5YSEQgfHwKKyAgICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKSAmJiAhdHJrLT52b3NfbGVuKSB7CisgICAgICAgIC8qIGNvcHkgZnJhbWUgdG8gY3JlYXRlIG5lZWRlZCBhdG9tcyAqLworICAgICAgICB0cmstPnZvc19sZW4gID0gc2l6ZTsKKyAgICAgICAgdHJrLT52b3NfZGF0YSA9IGF2X21hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCF0cmstPnZvc19kYXRhKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkodHJrLT52b3NfZGF0YSwgcGt0LT5kYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICBpZiAodHJrLT5lbnRyeSA+PSB0cmstPmNsdXN0ZXJfY2FwYWNpdHkpIHsKKyAgICAgICAgdW5zaWduZWQgbmV3X2NhcGFjaXR5ID0gMiAqICh0cmstPmVudHJ5ICsgTU9WX0lOREVYX0NMVVNURVJfU0laRSk7CisgICAgICAgIGlmIChhdl9yZWFsbG9jcF9hcnJheSgmdHJrLT5jbHVzdGVyLCBuZXdfY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnRyay0+Y2x1c3RlcikpKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICB0cmstPmNsdXN0ZXJfY2FwYWNpdHkgPSBuZXdfY2FwYWNpdHk7CisgICAgfQorCisgICAgdHJrLT5jbHVzdGVyW3Ryay0+ZW50cnldLnBvcyAgICAgICAgICAgICAgPSBhdmlvX3RlbGwocGIpIC0gc2l6ZTsKKyAgICB0cmstPmNsdXN0ZXJbdHJrLT5lbnRyeV0uc2FtcGxlc19pbl9jaHVuayA9IHNhbXBsZXNfaW5fY2h1bms7CisgICAgdHJrLT5jbHVzdGVyW3Ryay0+ZW50cnldLmNodW5rTnVtICAgICAgICAgPSAwOworICAgIHRyay0+Y2x1c3Rlclt0cmstPmVudHJ5XS5zaXplICAgICAgICAgICAgID0gc2l6ZTsKKyAgICB0cmstPmNsdXN0ZXJbdHJrLT5lbnRyeV0uZW50cmllcyAgICAgICAgICA9IHNhbXBsZXNfaW5fY2h1bms7CisgICAgdHJrLT5jbHVzdGVyW3Ryay0+ZW50cnldLmR0cyAgICAgICAgICAgICAgPSBwa3QtPmR0czsKKyAgICBpZiAoIXRyay0+ZW50cnkgJiYgdHJrLT5zdGFydF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaWYgKCF0cmstPmZyYWdfZGlzY29udCkgeworICAgICAgICAgICAgLyogRmlyc3QgcGFja2V0IG9mIGEgbmV3IGZyYWdtZW50LiBXZSBhbHJlYWR5IHdyb3RlIHRoZSBkdXJhdGlvbgorICAgICAgICAgICAgICogb2YgdGhlIGxhc3QgcGFja2V0IG9mIHRoZSBwcmV2aW91cyBmcmFnbWVudCBiYXNlZCBvbiB0cmFja19kdXJhdGlvbiwKKyAgICAgICAgICAgICAqIHdoaWNoIG1pZ2h0IG5vdCBleGFjdGx5IG1hdGNoIG91ciBkdHMuIFRoZXJlZm9yZSBhZGp1c3QgdGhlIGR0cworICAgICAgICAgICAgICogb2YgdGhpcyBwYWNrZXQgdG8gYmUgd2hhdCB0aGUgcHJldmlvdXMgcGFja2V0cyBkdXJhdGlvbiBpbXBsaWVzLiAqLworICAgICAgICAgICAgdHJrLT5jbHVzdGVyW3Ryay0+ZW50cnldLmR0cyA9IHRyay0+c3RhcnRfZHRzICsgdHJrLT50cmFja19kdXJhdGlvbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5ldyBmcmFnbWVudCwgYnV0IGRpc2NvbnRpbnVvdXMgZnJvbSBwcmV2aW91cyBmcmFnbWVudHMuCisgICAgICAgICAgICAgKiBQcmV0ZW5kIHRoZSBkdXJhdGlvbiBzdW0gb2YgdGhlIGVhcmxpZXIgZnJhZ21lbnRzIGlzCisgICAgICAgICAgICAgKiBwa3QtPmR0cyAtIHRyay0+c3RhcnRfZHRzLiAqLworICAgICAgICAgICAgdHJrLT5mcmFnX3N0YXJ0ID0gcGt0LT5kdHMgLSB0cmstPnN0YXJ0X2R0czsKKyAgICAgICAgICAgIHRyay0+ZnJhZ19kaXNjb250ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdHJrLT5lbnRyeSAmJiB0cmstPnN0YXJ0X2R0cyA9PSBBVl9OT1BUU19WQUxVRSAmJiAhbW92LT51c2VfZWRpdGxpc3QgJiYKKyAgICAgICAgcy0+YXZvaWRfbmVnYXRpdmVfdHMgPT0gQVZGTVRfQVZPSURfTkVHX1RTX01BS0VfWkVSTykgeworICAgICAgICAvKiBOb3QgdXNpbmcgZWRpdCBsaXN0cyBhbmQgc2hpZnRpbmcgdGhlIGZpcnN0IHRyYWNrIHRvIHN0YXJ0IGZyb20gemVyby4KKyAgICAgICAgICogSWYgdGhlIG90aGVyIHN0cmVhbXMgc3RhcnQgZnJvbSBhIGxhdGVyIHRpbWVzdGFtcCwgd2Ugd29uJ3QgYmUgYWJsZQorICAgICAgICAgKiB0byBzaWduYWwgdGhlIGRpZmZlcmVuY2UgaW4gc3RhcnRpbmcgdGltZSB3aXRob3V0IGFuIGVkaXQgbGlzdC4KKyAgICAgICAgICogVGh1cyBtb3ZlIHRoZSB0aW1lc3RhbXAgZm9yIHRoaXMgZmlyc3Qgc2FtcGxlIHRvIDAsIGluY3JlYXNpbmcKKyAgICAgICAgICogaXRzIGR1cmF0aW9uIGluc3RlYWQuICovCisgICAgICAgIHRyay0+Y2x1c3Rlclt0cmstPmVudHJ5XS5kdHMgPSB0cmstPnN0YXJ0X2R0cyA9IDA7CisgICAgfQorICAgIGlmICh0cmstPnN0YXJ0X2R0cyA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICB0cmstPnN0YXJ0X2R0cyA9IHBrdC0+ZHRzOworICAgICAgICBpZiAodHJrLT5mcmFnX2Rpc2NvbnQpIHsKKyAgICAgICAgICAgIC8qIFByZXRlbmQgdGhlIHdob2xlIHN0cmVhbSBzdGFydGVkIGF0IGR0cz0wLCB3aXRoIGVhcmxpZXIgZnJhbWdlbnRzCisgICAgICAgICAgICAgKiBhbHJlYWR5IHdyaXR0ZW4sIHdpdGggYSBkdXJhdGlvbiBzdW1taW5nIHVwIHRvIHBrdC0+ZHRzLiAqLworICAgICAgICAgICAgdHJrLT5mcmFnX3N0YXJ0ICAgPSBwa3QtPmR0czsKKyAgICAgICAgICAgIHRyay0+c3RhcnRfZHRzICAgID0gMDsKKyAgICAgICAgICAgIHRyay0+ZnJhZ19kaXNjb250ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChwa3QtPmR0cyAmJiBtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRU1QVFlfTU9PVikKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgc3RhcnRzIHdpdGggYSBub256ZXJvIGR0cyAlIlBSSWQ2NCIuIFRoaXMgIgorICAgICAgICAgICAgICAgICAgICJjdXJyZW50bHkgaXNuJ3QgaGFuZGxlZCBjb3JyZWN0bHkgaW4gY29tYmluYXRpb24gd2l0aCAiCisgICAgICAgICAgICAgICAgICAgImVtcHR5X21vb3YuXG4iLCBwa3QtPnN0cmVhbV9pbmRleCwgcGt0LT5kdHMpOworICAgIH0KKyAgICB0cmstPnRyYWNrX2R1cmF0aW9uID0gcGt0LT5kdHMgLSB0cmstPnN0YXJ0X2R0cyArIHBrdC0+ZHVyYXRpb247CisgICAgdHJrLT5sYXN0X3NhbXBsZV9pc19zdWJ0aXRsZV9lbmQgPSAwOworCisgICAgaWYgKHBrdC0+cHRzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInB0cyBoYXMgbm8gdmFsdWVcbiIpOworICAgICAgICBwa3QtPnB0cyA9IHBrdC0+ZHRzOworICAgIH0KKyAgICBpZiAocGt0LT5kdHMgIT0gcGt0LT5wdHMpCisgICAgICAgIHRyay0+ZmxhZ3MgfD0gTU9WX1RSQUNLX0NUVFM7CisgICAgdHJrLT5jbHVzdGVyW3Ryay0+ZW50cnldLmN0cyAgID0gcGt0LT5wdHMgLSBwa3QtPmR0czsKKyAgICB0cmstPmNsdXN0ZXJbdHJrLT5lbnRyeV0uZmxhZ3MgPSAwOworICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMSkgeworICAgICAgICBtb3ZfcGFyc2VfdmMxX2ZyYW1lKHBrdCwgdHJrLCBtb3YtPmZyYWdtZW50cyk7CisgICAgfSBlbHNlIGlmIChwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSB7CisgICAgICAgIGlmIChtb3YtPm1vZGUgPT0gTU9ERV9NT1YgJiYgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICYmCisgICAgICAgICAgICB0cmstPmVudHJ5ID4gMCkgeyAvLyBmb3JjZSBzeW5jIHNhbXBsZSBmb3IgdGhlIGZpcnN0IGtleSBmcmFtZQorICAgICAgICAgICAgbW92X3BhcnNlX21wZWcyX2ZyYW1lKHBrdCwgJnRyay0+Y2x1c3Rlclt0cmstPmVudHJ5XS5mbGFncyk7CisgICAgICAgICAgICBpZiAodHJrLT5jbHVzdGVyW3Ryay0+ZW50cnldLmZsYWdzICYgTU9WX1BBUlRJQUxfU1lOQ19TQU1QTEUpCisgICAgICAgICAgICAgICAgdHJrLT5mbGFncyB8PSBNT1ZfVFJBQ0tfU1RQUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyay0+Y2x1c3Rlclt0cmstPmVudHJ5XS5mbGFncyA9IE1PVl9TWU5DX1NBTVBMRTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJrLT5jbHVzdGVyW3Ryay0+ZW50cnldLmZsYWdzICYgTU9WX1NZTkNfU0FNUExFKQorICAgICAgICAgICAgdHJrLT5oYXNfa2V5ZnJhbWVzKys7CisgICAgfQorICAgIHRyay0+ZW50cnkrKzsKKyAgICB0cmstPnNhbXBsZV9jb3VudCArPSBzYW1wbGVzX2luX2NodW5rOworICAgIG1vdi0+bWRhdF9zaXplICAgICs9IHNpemU7CisKKyAgICBpZiAodHJrLT5oaW50X3RyYWNrID49IDAgJiYgdHJrLT5oaW50X3RyYWNrIDwgbW92LT5uYl9zdHJlYW1zKQorICAgICAgICBmZl9tb3ZfYWRkX2hpbnRlZF9wYWNrZXQocywgcGt0LCB0cmstPmhpbnRfdHJhY2ssIHRyay0+ZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZvcm1hdHRlZF9kYXRhLCBzaXplKTsKKworZW5kOgorZXJyOgorCisgICAgYXZfZnJlZShyZWZvcm1hdHRlZF9kYXRhKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9zaW5nbGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICAgICAgTU9WTXV4Q29udGV4dCAqbW92ID0gcy0+cHJpdl9kYXRhOworICAgICAgICBNT1ZUcmFjayAqdHJrID0gJm1vdi0+dHJhY2tzW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICAgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHRyay0+ZW5jOworICAgICAgICBpbnQ2NF90IGZyYWdfZHVyYXRpb24gPSAwOworICAgICAgICBpbnQgc2l6ZSA9IHBrdC0+c2l6ZTsKKworICAgICAgICBpZiAoIXBrdC0+c2l6ZSkKKyAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAvKiBEaXNjYXJkIDAgc2l6ZWQgcGFja2V0cyAqLworCisgICAgICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR19ESVNDT05UKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgICAgICAgICAgbW92LT50cmFja3NbaV0uZnJhZ19kaXNjb250ID0gMTsKKyAgICAgICAgICAgIG1vdi0+ZmxhZ3MgJj0gfkZGX01PVl9GTEFHX0ZSQUdfRElTQ09OVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0cmstPmVudHJ5ICYmIHBrdC0+c3RyZWFtX2luZGV4IDwgcy0+bmJfc3RyZWFtcykKKyAgICAgICAgICAgIGZyYWdfZHVyYXRpb24gPSBhdl9yZXNjYWxlX3EocGt0LT5kdHMgLSB0cmstPmNsdXN0ZXJbMF0uZHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgIGlmICgobW92LT5tYXhfZnJhZ21lbnRfZHVyYXRpb24gJiYKKyAgICAgICAgICAgICBmcmFnX2R1cmF0aW9uID49IG1vdi0+bWF4X2ZyYWdtZW50X2R1cmF0aW9uKSB8fAorICAgICAgICAgICAgIChtb3YtPm1heF9mcmFnbWVudF9zaXplICYmIG1vdi0+bWRhdF9zaXplICsgc2l6ZSA+PSBtb3YtPm1heF9mcmFnbWVudF9zaXplKSB8fAorICAgICAgICAgICAgIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR19LRVlGUkFNRSAmJgorICAgICAgICAgICAgICBlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgICAgICAgICAgIHRyay0+ZW50cnkgJiYgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkpIHsKKyAgICAgICAgICAgIGlmIChmcmFnX2R1cmF0aW9uID49IG1vdi0+bWluX2ZyYWdtZW50X2R1cmF0aW9uKQorICAgICAgICAgICAgICAgIG1vdl9mbHVzaF9mcmFnbWVudChzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmZl9tb3Zfd3JpdGVfcGFja2V0KHMsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3N1YnRpdGxlX2VuZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR0cykgeworICAgIEFWUGFja2V0IGVuZDsKKyAgICB1aW50OF90IGRhdGFbMl0gPSB7MH07CisgICAgaW50IHJldDsKKworICAgIGF2X2luaXRfcGFja2V0KCZlbmQpOworICAgIGVuZC5zaXplID0gc2l6ZW9mKGRhdGEpOworICAgIGVuZC5kYXRhID0gZGF0YTsKKyAgICBlbmQucHRzID0gZHRzOworICAgIGVuZC5kdHMgPSBkdHM7CisgICAgZW5kLmR1cmF0aW9uID0gMDsKKyAgICBlbmQuc3RyZWFtX2luZGV4ID0gc3RyZWFtX2luZGV4OworCisgICAgcmV0ID0gbW92X3dyaXRlX3NpbmdsZV9wYWNrZXQocywgJmVuZCk7CisgICAgYXZfZnJlZV9wYWNrZXQoJmVuZCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGlmICghcGt0KSB7CisgICAgICAgIG1vdl9mbHVzaF9mcmFnbWVudChzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIE1PVk11eENvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKKworICAgICAgICBpZiAoIXBrdC0+c2l6ZSkgcmV0dXJuIDA7IC8qIERpc2NhcmQgMCBzaXplZCBwYWNrZXRzICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3VidGl0bGVzIHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogMSkgRm9yIGZ1bGwgY29tcGxhaW5jZSwgZXZlcnkgdHJhY2sgbXVzdCBoYXZlIGEgc2FtcGxlIGF0CisgICAgICAgICAqIGR0cyA9PSAwLCB3aGljaCBpcyByYXJlbHkgdHJ1ZSBmb3Igc3VidGl0bGVzLiBTbywgYXMgc29vbgorICAgICAgICAgKiBhcyB3ZSBzZWUgYW55IHBhY2tldCB3aXRoIGR0cyA+IDAsIHdyaXRlIGFuIGVtcHR5IHN1YnRpdGxlCisgICAgICAgICAqIGF0IGR0cyA9PSAwIGZvciBhbnkgc3VidGl0bGUgdHJhY2sgd2l0aCBubyBzYW1wbGVzIGluIGl0LgorICAgICAgICAgKgorICAgICAgICAgKiAyKSBGb3IgZWFjaCBzdWJ0aXRsZSB0cmFjaywgY2hlY2sgaWYgdGhlIGN1cnJlbnQgcGFja2V0J3MKKyAgICAgICAgICogZHRzIGlzIHBhc3QgdGhlIGR1cmF0aW9uIG9mIHRoZSBsYXN0IHN1YnRpdGxlIHNhbXBsZS4gSWYKKyAgICAgICAgICogc28sIHdlIG5vdyBuZWVkIHRvIHdyaXRlIGFuIGVuZCBzYW1wbGUgZm9yIHRoYXQgc3VidGl0bGUuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgbXVzdCBiZSBkb25lIGNvbmRpdGlvbmFsbHkgdG8gYWxsb3cgZm9yIHN1YnRpdGxlcyB0aGF0CisgICAgICAgICAqIGltbWVkaWF0ZWx5IHJlcGxhY2UgZWFjaCBvdGhlciwgaW4gd2hpY2ggY2FzZSBhbiBlbmQgc2FtcGxlCisgICAgICAgICAqIGlzIG5vdCBuZWVkZWQsIGFuZCBpcywgaW4gZmFjdCwgYWN0aXZlbHkgaGFybWZ1bC4KKyAgICAgICAgICoKKyAgICAgICAgICogMykgU2VlIG1vdl93cml0ZV90cmFpbGVyIGZvciBob3cgdGhlIGZpbmFsIGVuZCBzYW1wbGUgaXMKKyAgICAgICAgICogaGFuZGxlZC4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgTU9WVHJhY2sgKnRyayA9ICZtb3YtPnRyYWNrc1tpXTsKKyAgICAgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgICAgIGlmICh0cmstPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTU9WX1RFWFQgJiYKKyAgICAgICAgICAgICAgICB0cmstPnRyYWNrX2R1cmF0aW9uIDwgcGt0LT5kdHMgJiYKKyAgICAgICAgICAgICAgICAodHJrLT5lbnRyeSA9PSAwIHx8ICF0cmstPmxhc3Rfc2FtcGxlX2lzX3N1YnRpdGxlX2VuZCkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBtb3Zfd3JpdGVfc3VidGl0bGVfZW5kX3BhY2tldChzLCBpLCB0cmstPnRyYWNrX2R1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB0cmstPmxhc3Rfc2FtcGxlX2lzX3N1YnRpdGxlX2VuZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbW92X3dyaXRlX3NpbmdsZV9wYWNrZXQocywgcGt0KTsKKyAgICB9Cit9CisKKy8vIFF1aWNrVGltZSBjaGFwdGVycyBpbnZvbHZlIGFuIGFkZGl0aW9uYWwgdGV4dCB0cmFjayB3aXRoIHRoZSBjaGFwdGVyIG5hbWVzCisvLyBhcyBzYW1wbGVzLCBhbmQgYSB0cmVmIHBvaW50aW5nIGZyb20gdGhlIG90aGVyIHRyYWNrcyB0byB0aGUgY2hhcHRlciBvbmUuCitzdGF0aWMgaW50IG1vdl9jcmVhdGVfY2hhcHRlcl90cmFjayhBVkZvcm1hdENvbnRleHQgKnMsIGludCB0cmFja251bSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGI7CisKKyAgICBNT1ZNdXhDb250ZXh0ICptb3YgPSBzLT5wcml2X2RhdGE7CisgICAgTU9WVHJhY2sgKnRyYWNrID0gJm1vdi0+dHJhY2tzW3RyYWNrbnVtXTsKKyAgICBBVlBhY2tldCBwa3QgPSB7IC5zdHJlYW1faW5kZXggPSB0cmFja251bSwgLmZsYWdzID0gQVZfUEtUX0ZMQUdfS0VZIH07CisgICAgaW50IGksIGxlbjsKKworICAgIHRyYWNrLT5tb2RlID0gbW92LT5tb2RlOworICAgIHRyYWNrLT50YWcgPSBNS1RBRygndCcsJ2UnLCd4JywndCcpOworICAgIHRyYWNrLT50aW1lc2NhbGUgPSBNT1ZfVElNRVNDQUxFOworICAgIHRyYWNrLT5lbmMgPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOworICAgIGlmICghdHJhY2stPmVuYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB0cmFjay0+ZW5jLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworI2lmIDAKKyAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSByZXF1aXJlZCB0byBtYWtlIFFUIHJlY29nbml6ZSB0aGUgY2hhcHRlciB0cmFjaworICAgIHVpbnQ4X3QgY2hhcHRlcl9wcm9wZXJ0aWVzWzQzXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgfTsKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHRyYWNrLT5lbmMsIHNpemVvZihjaGFwdGVyX3Byb3BlcnRpZXMpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtZW1jcHkodHJhY2stPmVuYy0+ZXh0cmFkYXRhLCBjaGFwdGVyX3Byb3BlcnRpZXMsIHNpemVvZihjaGFwdGVyX3Byb3BlcnRpZXMpKTsKKyNlbHNlCisgICAgaWYgKGF2aW9fb3Blbl9keW5fYnVmKCZwYikgPj0gMCkgeworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgdWludDhfdCAqYnVmOworCisgICAgICAgIC8qIFN0dWIgaGVhZGVyICh1c3VhbGx5IGZvciBRdWlja3RpbWUgY2hhcHRlciB0cmFjaykgKi8KKyAgICAgICAgLy8gVGV4dFNhbXBsZUVudHJ5CisgICAgICAgIGF2aW9fd2IzMihwYiwgMHgwMSk7IC8vIGRpc3BsYXlGbGFncworICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsgICAvLyBob3Jpem9udGFsIGp1c3RpZmljYXRpb24KKyAgICAgICAgYXZpb193OChwYiwgMHgwMCk7ICAgLy8gdmVydGljYWwganVzdGlmaWNhdGlvbgorICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsgICAvLyBiZ0NvbG91clJlZAorICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsgICAvLyBiZ0NvbG91ckdyZWVuCisgICAgICAgIGF2aW9fdzgocGIsIDB4MDApOyAgIC8vIGJnQ29sb3VyQmx1ZQorICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsgICAvLyBiZ0NvbG91ckFscGhhCisgICAgICAgIC8vIEJveFJlY29yZAorICAgICAgICBhdmlvX3diMTYocGIsIDB4MDApOyAvLyBkZWZUZXh0Qm94VG9wCisgICAgICAgIGF2aW9fd2IxNihwYiwgMHgwMCk7IC8vIGRlZlRleHRCb3hMZWZ0CisgICAgICAgIGF2aW9fd2IxNihwYiwgMHgwMCk7IC8vIGRlZlRleHRCb3hCb3R0b20KKyAgICAgICAgYXZpb193YjE2KHBiLCAweDAwKTsgLy8gZGVmVGV4dEJveFJpZ2h0CisgICAgICAgIC8vIFN0eWxlUmVjb3JkCisgICAgICAgIGF2aW9fd2IxNihwYiwgMHgwMCk7IC8vIHN0YXJ0Q2hhcgorICAgICAgICBhdmlvX3diMTYocGIsIDB4MDApOyAvLyBlbmRDaGFyCisgICAgICAgIGF2aW9fd2IxNihwYiwgMHgwMSk7IC8vIGZvbnRJRAorICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsgICAvLyBmb250U3R5bGVGbGFncworICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsgICAvLyBmb250U2l6ZQorICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsgICAvLyBmZ0NvbG91clJlZAorICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsgICAvLyBmZ0NvbG91ckdyZWVuCisgICAgICAgIGF2aW9fdzgocGIsIDB4MDApOyAgIC8vIGZnQ29sb3VyQmx1ZQorICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsgICAvLyBmZ0NvbG91ckFscGhhCisgICAgICAgIC8vIEZvbnRUYWJsZUJveAorICAgICAgICBhdmlvX3diMzIocGIsIDB4MEQpOyAvLyBib3ggc2l6ZQorICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJmdGFiIik7IC8vIGJveCBhdG9tIG5hbWUKKyAgICAgICAgYXZpb193YjE2KHBiLCAweDAxKTsgLy8gZW50cnkgY291bnQKKyAgICAgICAgLy8gRm9udFJlY29yZAorICAgICAgICBhdmlvX3diMTYocGIsIDB4MDEpOyAvLyBmb250IElECisgICAgICAgIGF2aW9fdzgocGIsIDB4MDApOyAgIC8vIGZvbnQgbmFtZSBsZW5ndGgKKworICAgICAgICBpZiAoKHNpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYocGIsICZidWYpKSA+IDApIHsKKyAgICAgICAgICAgIHRyYWNrLT5lbmMtPmV4dHJhZGF0YSA9IGJ1ZjsKKyAgICAgICAgICAgIHRyYWNrLT5lbmMtPmV4dHJhZGF0YV9zaXplID0gc2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZidWYpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhcHRlcnM7IGkrKykgeworICAgICAgICBBVkNoYXB0ZXIgKmMgPSBzLT5jaGFwdGVyc1tpXTsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQ7CisKKyAgICAgICAgaW50NjRfdCBlbmQgPSBhdl9yZXNjYWxlX3EoYy0+ZW5kLCBjLT50aW1lX2Jhc2UsIChBVlJhdGlvbmFsKXsxLE1PVl9USU1FU0NBTEV9KTsKKyAgICAgICAgcGt0LnB0cyA9IHBrdC5kdHMgPSBhdl9yZXNjYWxlX3EoYy0+c3RhcnQsIGMtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsTU9WX1RJTUVTQ0FMRX0pOworICAgICAgICBwa3QuZHVyYXRpb24gPSBlbmQgLSBwa3QuZHRzOworCisgICAgICAgIGlmICgodCA9IGF2X2RpY3RfZ2V0KGMtPm1ldGFkYXRhLCAidGl0bGUiLCBOVUxMLCAwKSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgZW5jZFsxMl0gPSB7CisgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywKKyAgICAgICAgICAgICAgICAnZScsICAnbicsICAnYycsICAnZCcsCisgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCB9OworICAgICAgICAgICAgbGVuICAgICAgPSBzdHJsZW4odC0+dmFsdWUpOworICAgICAgICAgICAgcGt0LnNpemUgPSBsZW4gKyAyICsgMTI7CisgICAgICAgICAgICBwa3QuZGF0YSA9IGF2X21hbGxvYyhwa3Quc2l6ZSk7CisgICAgICAgICAgICBpZiAoIXBrdC5kYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBBVl9XQjE2KHBrdC5kYXRhLCBsZW4pOworICAgICAgICAgICAgbWVtY3B5KHBrdC5kYXRhICsgMiwgdC0+dmFsdWUsIGxlbik7CisgICAgICAgICAgICBtZW1jcHkocGt0LmRhdGEgKyBsZW4gKyAyLCBlbmNkLCBzaXplb2YoZW5jZCkpOworICAgICAgICAgICAgZmZfbW92X3dyaXRlX3BhY2tldChzLCAmcGt0KTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwa3QuZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfY3JlYXRlX3RpbWVjb2RlX3RyYWNrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGluZGV4LCBpbnQgc3JjX2luZGV4LCBjb25zdCBjaGFyICp0Y3N0cikKK3sKKyAgICBpbnQgcmV0OworICAgIE1PVk11eENvbnRleHQgKm1vdiAgPSBzLT5wcml2X2RhdGE7CisgICAgTU9WVHJhY2sgKnRyYWNrICAgICA9ICZtb3YtPnRyYWNrc1tpbmRleF07CisgICAgQVZTdHJlYW0gKnNyY19zdCAgICA9IHMtPnN0cmVhbXNbc3JjX2luZGV4XTsKKyAgICBBVlRpbWVjb2RlIHRjOworICAgIEFWUGFja2V0IHBrdCAgICA9IHsuc3RyZWFtX2luZGV4ID0gaW5kZXgsIC5mbGFncyA9IEFWX1BLVF9GTEFHX0tFWSwgLnNpemUgPSA0fTsKKyAgICBBVlJhdGlvbmFsIHJhdGUgPSBmaW5kX2ZwcyhzLCBzcmNfc3QpOworCisgICAgLyogY29tcHV0ZSB0aGUgZnJhbWUgbnVtYmVyICovCisgICAgcmV0ID0gYXZfdGltZWNvZGVfaW5pdF9mcm9tX3N0cmluZygmdGMsIHJhdGUsIHRjc3RyLCBzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIHRtY2QgdHJhY2sgYmFzZWQgb24gdmlkZW8gc3RyZWFtICovCisgICAgdHJhY2stPm1vZGUgICAgICA9IG1vdi0+bW9kZTsKKyAgICB0cmFjay0+dGFnICAgICAgID0gTUtUQUcoJ3QnLCdtJywnYycsJ2QnKTsKKyAgICB0cmFjay0+c3JjX3RyYWNrID0gc3JjX2luZGV4OworICAgIHRyYWNrLT50aW1lc2NhbGUgPSBtb3YtPnRyYWNrc1tzcmNfaW5kZXhdLnRpbWVzY2FsZTsKKyAgICBpZiAodGMuZmxhZ3MgJiBBVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRSkKKyAgICAgICAgdHJhY2stPnRpbWVjb2RlX2ZsYWdzIHw9IE1PVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRTsKKworICAgIC8qIHNldCBzdCB0byBzcmNfc3QgZm9yIG1ldGFkYXRhIGFjY2VzcyovCisgICAgdHJhY2stPnN0ID0gc3JjX3N0OworCisgICAgLyogZW5jb2RlIGNvbnRleHQ6IHRtY2QgZGF0YSBzdHJlYW0gKi8KKyAgICB0cmFjay0+ZW5jID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhOVUxMKTsKKyAgICB0cmFjay0+ZW5jLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgdHJhY2stPmVuYy0+Y29kZWNfdGFnICA9IHRyYWNrLT50YWc7CisgICAgdHJhY2stPmVuYy0+dGltZV9iYXNlICA9IGF2X2ludl9xKHJhdGUpOworCisgICAgLyogdGhlIHRtY2QgdHJhY2sganVzdCBjb250YWlucyBvbmUgcGFja2V0IHdpdGggdGhlIGZyYW1lIG51bWJlciAqLworICAgIHBrdC5kYXRhID0gYXZfbWFsbG9jKHBrdC5zaXplKTsKKyAgICBBVl9XQjMyKHBrdC5kYXRhLCB0Yy5zdGFydCk7CisgICAgcmV0ID0gZmZfbW92X3dyaXRlX3BhY2tldChzLCAmcGt0KTsKKyAgICBhdl9mcmVlKHBrdC5kYXRhKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogc3QtPmRpc3Bvc2l0aW9uIGNvbnRyb2xzIHRoZSAiZW5hYmxlZCIgZmxhZyBpbiB0aGUgdGtoZCB0YWcuCisgKiBRdWlja1RpbWUgd2lsbCBub3QgcGxheSBhIHRyYWNrIGlmIGl0IGlzIG5vdCBlbmFibGVkLiAgU28gbWFrZSBzdXJlCisgKiB0aGF0IG9uZSB0cmFjayBvZiBlYWNoIHR5cGUgKGF1ZGlvLCB2aWRlbywgc3VidGl0bGUpIGlzIGVuYWJsZWQuCisgKgorICogU3VidGl0bGVzIGFyZSBzcGVjaWFsLiAgRm9yIGF1ZGlvIGFuZCB2aWRlbywgc2V0dGluZyAiZW5hYmxlZCIgYWxzbworICogbWFrZXMgdGhlIHRyYWNrICJkZWZhdWx0IiAoaS5lLiBpdCBpcyByZW5kZXJlZCB3aGVuIHBsYXllZCkuIEZvcgorICogc3VidGl0bGVzLCBhbiAiZW5hYmxlZCIgc3VidGl0bGUgaXMgbm90IHJlbmRlcmVkIGJ5IGRlZmF1bHQsIGJ1dAorICogaWYgbm8gc3VidGl0bGUgaXMgZW5hYmxlZCwgdGhlIHN1YnRpdGxlIG1lbnUgaW4gUXVpY2tUaW1lIHdpbGwgYmUKKyAqIGVtcHR5IQorICovCitzdGF0aWMgdm9pZCBlbmFibGVfdHJhY2tzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNT1ZNdXhDb250ZXh0ICptb3YgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisgICAgaW50IGVuYWJsZWRbQVZNRURJQV9UWVBFX05CXTsKKyAgICBpbnQgZmlyc3RbQVZNRURJQV9UWVBFX05CXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBVk1FRElBX1RZUEVfTkI7IGkrKykgeworICAgICAgICBlbmFibGVkW2ldID0gMDsKKyAgICAgICAgZmlyc3RbaV0gPSAtMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA8PSBBVk1FRElBX1RZUEVfVU5LTk9XTiB8fAorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID49IEFWTUVESUFfVFlQRV9OQikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChmaXJzdFtzdC0+Y29kZWMtPmNvZGVjX3R5cGVdIDwgMCkKKyAgICAgICAgICAgIGZpcnN0W3N0LT5jb2RlYy0+Y29kZWNfdHlwZV0gPSBpOworICAgICAgICBpZiAoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fREVGQVVMVCkgeworICAgICAgICAgICAgbW92LT50cmFja3NbaV0uZmxhZ3MgfD0gTU9WX1RSQUNLX0VOQUJMRUQ7CisgICAgICAgICAgICBlbmFibGVkW3N0LT5jb2RlYy0+Y29kZWNfdHlwZV0rKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBBVk1FRElBX1RZUEVfTkI7IGkrKykgeworICAgICAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgICAgIGlmIChlbmFibGVkW2ldID4gMSkKKyAgICAgICAgICAgICAgICBtb3YtPnBlcl9zdHJlYW1fZ3JvdXBpbmcgPSAxOworICAgICAgICAgICAgaWYgKCFlbmFibGVkW2ldICYmIGZpcnN0W2ldID49IDApCisgICAgICAgICAgICAgICAgbW92LT50cmFja3NbZmlyc3RbaV1dLmZsYWdzIHw9IE1PVl9UUkFDS19FTkFCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1vdl9mcmVlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNT1ZNdXhDb250ZXh0ICptb3YgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBpZiAobW92LT5jaGFwdGVyX3RyYWNrKSB7CisgICAgICAgIGlmIChtb3YtPnRyYWNrc1ttb3YtPmNoYXB0ZXJfdHJhY2tdLmVuYykKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZtb3YtPnRyYWNrc1ttb3YtPmNoYXB0ZXJfdHJhY2tdLmVuYy0+ZXh0cmFkYXRhKTsKKyAgICAgICAgYXZfZnJlZXAoJm1vdi0+dHJhY2tzW21vdi0+Y2hhcHRlcl90cmFja10uZW5jKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKG1vdi0+dHJhY2tzW2ldLnRhZyA9PSBNS1RBRygncicsJ3QnLCdwJywnICcpKQorICAgICAgICAgICAgZmZfbW92X2Nsb3NlX2hpbnRpbmcoJm1vdi0+dHJhY2tzW2ldKTsKKyAgICAgICAgZWxzZSBpZiAobW92LT50cmFja3NbaV0udGFnID09IE1LVEFHKCd0JywnbScsJ2MnLCdkJykgJiYgbW92LT5uYl9tZXRhX3RtY2QpCisgICAgICAgICAgICBhdl9mcmVlcCgmbW92LT50cmFja3NbaV0uZW5jKTsKKyAgICAgICAgYXZfZnJlZXAoJm1vdi0+dHJhY2tzW2ldLmNsdXN0ZXIpOworICAgICAgICBhdl9mcmVlcCgmbW92LT50cmFja3NbaV0uZnJhZ19pbmZvKTsKKworICAgICAgICBpZiAobW92LT50cmFja3NbaV0udm9zX2xlbikKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZtb3YtPnRyYWNrc1tpXS52b3NfZGF0YSk7CisgICAgfQorCisgICAgYXZfZnJlZXAoJm1vdi0+dHJhY2tzKTsKK30KKworc3RhdGljIHVpbnQzMl90IHJnYl90b195dXYodWludDMyX3QgcmdiKQoreworICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICBpbnQgeSwgY2IsIGNyOworCisgICAgciA9IChyZ2IgPj4gMTYpICYgMHhGRjsKKyAgICBnID0gKHJnYiA+PiAgOCkgJiAweEZGOworICAgIGIgPSAocmdiICAgICAgKSAmIDB4RkY7CisKKyAgICB5ICA9IGF2X2NsaXBfdWludDgoIDE2LiArICAwLjI1NyAqIHIgKyAwLjUwNCAqIGcgKyAwLjA5OCAqIGIpOworICAgIGNiID0gYXZfY2xpcF91aW50OCgxMjguIC0gIDAuMTQ4ICogciAtIDAuMjkxICogZyArIDAuNDM5ICogYik7CisgICAgY3IgPSBhdl9jbGlwX3VpbnQ4KDEyOC4gKyAgMC40MzkgKiByIC0gMC4zNjggKiBnIC0gMC4wNzEgKiBiKTsKKworICAgIHJldHVybiAoeSA8PCAxNikgfCAoY3IgPDwgOCkgfCBjYjsKK30KKworc3RhdGljIGludCBtb3ZfY3JlYXRlX2R2ZF9zdWJfZGVjb2Rlcl9zcGVjaWZpY19pbmZvKE1PVlRyYWNrICp0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QpCit7CisgICAgaW50IGksIHdpZHRoID0gNzIwLCBoZWlnaHQgPSA0ODA7CisgICAgaW50IGhhdmVfcGFsZXR0ZSA9IDAsIGhhdmVfc2l6ZSA9IDA7CisgICAgdWludDMyX3QgcGFsZXR0ZVsxNl07CisgICAgY2hhciAqY3VyID0gc3QtPmNvZGVjLT5leHRyYWRhdGE7CisKKyAgICB3aGlsZSAoY3VyICYmICpjdXIpIHsKKyAgICAgICAgaWYgKHN0cm5jbXAoInBhbGV0dGU6IiwgY3VyLCA4KSA9PSAwKSB7CisgICAgICAgICAgICBpbnQgaSwgY291bnQ7CisgICAgICAgICAgICBjb3VudCA9IHNzY2FuZihjdXIgKyA4LAorICAgICAgICAgICAgICAgICIlMDYiUFJJeDMyIiwgJTA2IlBSSXgzMiIsICUwNiJQUkl4MzIiLCAlMDYiUFJJeDMyIiwgIgorICAgICAgICAgICAgICAgICIlMDYiUFJJeDMyIiwgJTA2IlBSSXgzMiIsICUwNiJQUkl4MzIiLCAlMDYiUFJJeDMyIiwgIgorICAgICAgICAgICAgICAgICIlMDYiUFJJeDMyIiwgJTA2IlBSSXgzMiIsICUwNiJQUkl4MzIiLCAlMDYiUFJJeDMyIiwgIgorICAgICAgICAgICAgICAgICIlMDYiUFJJeDMyIiwgJTA2IlBSSXgzMiIsICUwNiJQUkl4MzIiLCAlMDYiUFJJeDMyIiIsCisgICAgICAgICAgICAgICAgJnBhbGV0dGVbIDBdLCAmcGFsZXR0ZVsgMV0sICZwYWxldHRlWyAyXSwgJnBhbGV0dGVbIDNdLAorICAgICAgICAgICAgICAgICZwYWxldHRlWyA0XSwgJnBhbGV0dGVbIDVdLCAmcGFsZXR0ZVsgNl0sICZwYWxldHRlWyA3XSwKKyAgICAgICAgICAgICAgICAmcGFsZXR0ZVsgOF0sICZwYWxldHRlWyA5XSwgJnBhbGV0dGVbMTBdLCAmcGFsZXR0ZVsxMV0sCisgICAgICAgICAgICAgICAgJnBhbGV0dGVbMTJdLCAmcGFsZXR0ZVsxM10sICZwYWxldHRlWzE0XSwgJnBhbGV0dGVbMTVdKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBwYWxldHRlW2ldID0gcmdiX3RvX3l1dihwYWxldHRlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhdmVfcGFsZXR0ZSA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoInNpemU6IiwgY3VyLCA1KSkgeworICAgICAgICAgICAgc3NjYW5mKGN1ciArIDUsICIlZHglZCIsICZ3aWR0aCwgJmhlaWdodCk7CisgICAgICAgICAgICBoYXZlX3NpemUgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChoYXZlX3BhbGV0dGUgJiYgaGF2ZV9zaXplKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGN1ciArPSBzdHJjc3BuKGN1ciwgIlxuXHIiKTsKKyAgICAgICAgY3VyICs9IHN0cnNwbihjdXIsICJcblxyIik7CisgICAgfQorICAgIGlmIChoYXZlX3BhbGV0dGUpIHsKKyAgICAgICAgdHJhY2stPnZvc19kYXRhID0gYXZfbWFsbG9jKDE2KjQpOworICAgICAgICBpZiAoIXRyYWNrLT52b3NfZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBBVl9XQjMyKHRyYWNrLT52b3NfZGF0YSArIGkgKiA0LCBwYWxldHRlW2ldKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjay0+dm9zX2xlbiA9IDE2ICogNDsKKyAgICB9CisgICAgc3QtPmNvZGVjLT53aWR0aCA9IHdpZHRoOworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gdHJhY2stPmhlaWdodCA9IGhlaWdodDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIE1PVk11eENvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCwgKmdsb2JhbF90Y3IgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgTlVMTCwgMCk7CisgICAgaW50IGksIHJldCwgaGludF90cmFjayA9IDAsIHRtY2RfdHJhY2sgPSAwOworCisgICAgbW92LT5mYyA9IHM7CisKKyAgICAvKiBEZWZhdWx0IG1vZGUgPT0gTVA0ICovCisgICAgbW92LT5tb2RlID0gTU9ERV9NUDQ7CisKKyAgICBpZiAocy0+b2Zvcm1hdCkgeworICAgICAgICBpZiAoIXN0cmNtcCgiM2dwIiwgcy0+b2Zvcm1hdC0+bmFtZSkpIG1vdi0+bW9kZSA9IE1PREVfM0dQOworICAgICAgICBlbHNlIGlmICghc3RyY21wKCIzZzIiLCBzLT5vZm9ybWF0LT5uYW1lKSkgbW92LT5tb2RlID0gTU9ERV8zR1B8TU9ERV8zRzI7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoIm1vdiIsIHMtPm9mb3JtYXQtPm5hbWUpKSBtb3YtPm1vZGUgPSBNT0RFX01PVjsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCgicHNwIiwgcy0+b2Zvcm1hdC0+bmFtZSkpIG1vdi0+bW9kZSA9IE1PREVfUFNQOworICAgICAgICBlbHNlIGlmICghc3RyY21wKCJpcG9kIixzLT5vZm9ybWF0LT5uYW1lKSkgbW92LT5tb2RlID0gTU9ERV9JUE9EOworICAgICAgICBlbHNlIGlmICghc3RyY21wKCJpc212IixzLT5vZm9ybWF0LT5uYW1lKSkgbW92LT5tb2RlID0gTU9ERV9JU007CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoImY0diIsIHMtPm9mb3JtYXQtPm5hbWUpKSBtb3YtPm1vZGUgPSBNT0RFX0Y0VjsKKyAgICB9CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0JJVEVYQUNUKQorICAgICAgICBtb3YtPmV4YWN0ID0gMTsKKworICAgIC8qIFNldCB0aGUgRlJBR01FTlQgZmxhZyBpZiBhbnkgb2YgdGhlIGZyYWdtZW50YXRpb24gbWV0aG9kcyBhcmUKKyAgICAgKiBlbmFibGVkLiAqLworICAgIGlmIChtb3YtPm1heF9mcmFnbWVudF9kdXJhdGlvbiB8fCBtb3YtPm1heF9mcmFnbWVudF9zaXplIHx8CisgICAgICAgIG1vdi0+ZmxhZ3MgJiAoRkZfTU9WX0ZMQUdfRU1QVFlfTU9PViB8CisgICAgICAgICAgICAgICAgICAgICAgRkZfTU9WX0ZMQUdfRlJBR19LRVlGUkFNRSB8CisgICAgICAgICAgICAgICAgICAgICAgRkZfTU9WX0ZMQUdfRlJBR19DVVNUT00pKQorICAgICAgICBtb3YtPmZsYWdzIHw9IEZGX01PVl9GTEFHX0ZSQUdNRU5UOworCisgICAgLyogU2V0IG90aGVyIGltcGxpY2l0IGZsYWdzIGltbWVkaWF0ZWx5ICovCisgICAgaWYgKG1vdi0+bW9kZSA9PSBNT0RFX0lTTSkKKyAgICAgICAgbW92LT5mbGFncyB8PSBGRl9NT1ZfRkxBR19FTVBUWV9NT09WIHwgRkZfTU9WX0ZMQUdfU0VQQVJBVEVfTU9PRiB8CisgICAgICAgICAgICAgICAgICAgICAgRkZfTU9WX0ZMQUdfRlJBR01FTlQ7CisgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19EQVNIKQorICAgICAgICBtb3YtPmZsYWdzIHw9IEZGX01PVl9GTEFHX0ZSQUdNRU5UIHwgRkZfTU9WX0ZMQUdfRU1QVFlfTU9PViB8CisgICAgICAgICAgICAgICAgICAgICAgRkZfTU9WX0ZMQUdfREVGQVVMVF9CQVNFX01PT0Y7CisKKyAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZBU1RTVEFSVCkgeworICAgICAgICBtb3YtPnJlc2VydmVkX21vb3Zfc2l6ZSA9IC0xOworICAgIH0KKworICAgIGlmIChtb3YtPnVzZV9lZGl0bGlzdCA8IDApIHsKKyAgICAgICAgbW92LT51c2VfZWRpdGxpc3QgPSAxOworICAgICAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZSQUdNRU5UKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBjYW4gYXZvaWQgbmVlZGluZyBhbiBlZGl0IGxpc3QgYnkgc2hpZnRpbmcgdGhlCisgICAgICAgICAgICAvLyB0cmFja3MsIHByZWZlciB0aGF0IG92ZXIgKHRyeWluZyB0bykgd3JpdGUgZWRpdCBsaXN0cworICAgICAgICAgICAgLy8gaW4gZnJhZ21lbnRlZCBvdXRwdXQuCisgICAgICAgICAgICBpZiAocy0+YXZvaWRfbmVnYXRpdmVfdHMgPT0gQVZGTVRfQVZPSURfTkVHX1RTX0FVVE8gfHwKKyAgICAgICAgICAgICAgICBzLT5hdm9pZF9uZWdhdGl2ZV90cyA9PSBBVkZNVF9BVk9JRF9ORUdfVFNfTUFLRV9aRVJPKQorICAgICAgICAgICAgICAgIG1vdi0+dXNlX2VkaXRsaXN0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0VNUFRZX01PT1YgJiYgbW92LT51c2VfZWRpdGxpc3QpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIk5vIG1lYW5pbmdmdWwgZWRpdCBsaXN0IHdpbGwgYmUgd3JpdHRlbiB3aGVuIHVzaW5nIGVtcHR5X21vb3ZcbiIpOworCisgICAgaWYgKCFtb3YtPnVzZV9lZGl0bGlzdCAmJiBzLT5hdm9pZF9uZWdhdGl2ZV90cyA9PSBBVkZNVF9BVk9JRF9ORUdfVFNfQVVUTykKKyAgICAgICAgcy0+YXZvaWRfbmVnYXRpdmVfdHMgPSBBVkZNVF9BVk9JRF9ORUdfVFNfTUFLRV9aRVJPOworCisgICAgLyogTm9uLXNlZWthYmxlIG91dHB1dCBpcyBvayBpZiB1c2luZyBmcmFnbWVudGF0aW9uLiBJZiBpc21fbG9va2FoZWFkCisgICAgICogaXMgZW5hYmxlZCwgd2UgZG9uJ3Qgc3VwcG9ydCBub24tc2Vla2FibGUgb3V0cHV0IGF0IGFsbC4gKi8KKyAgICBpZiAoIXMtPnBiLT5zZWVrYWJsZSAmJgorICAgICAgICAoIShtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR01FTlQpIHx8IG1vdi0+aXNtX2xvb2thaGVhZCkpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm11eGVyIGRvZXMgbm90IHN1cHBvcnQgbm9uIHNlZWthYmxlIG91dHB1dFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgbW92X3dyaXRlX2Z0eXBfdGFnKHBiLHMpOworICAgIGlmIChtb3YtPm1vZGUgPT0gTU9ERV9QU1ApIHsKKyAgICAgICAgaW50IHZpZGVvX3N0cmVhbXNfbmIgPSAwLCBhdWRpb19zdHJlYW1zX25iID0gMCwgb3RoZXJfc3RyZWFtc19uYiA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgICAgICAgICB2aWRlb19zdHJlYW1zX25iKys7CisgICAgICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbXNfbmIrKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvdGhlcl9zdHJlYW1zX25iKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKHZpZGVvX3N0cmVhbXNfbmIgIT0gMSB8fCBhdWRpb19zdHJlYW1zX25iICE9IDEgfHwgb3RoZXJfc3RyZWFtc19uYikgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlBTUCBtb2RlIG5lZWQgb25lIHZpZGVvIGFuZCBvbmUgYXVkaW8gc3RyZWFtXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgbW92X3dyaXRlX3V1aWRwcm9mX3RhZyhwYiwgcyk7CisgICAgfQorCisgICAgbW92LT5uYl9zdHJlYW1zID0gcy0+bmJfc3RyZWFtczsKKyAgICBpZiAobW92LT5tb2RlICYgKE1PREVfTVA0fE1PREVfTU9WfE1PREVfSVBPRCkgJiYgcy0+bmJfY2hhcHRlcnMpCisgICAgICAgIG1vdi0+Y2hhcHRlcl90cmFjayA9IG1vdi0+bmJfc3RyZWFtcysrOworCisgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19SVFBfSElOVCkgeworICAgICAgICAvKiBBZGQgaGludCB0cmFja3MgZm9yIGVhY2ggYXVkaW8gYW5kIHZpZGVvIHN0cmVhbSAqLworICAgICAgICBoaW50X3RyYWNrID0gbW92LT5uYl9zdHJlYW1zOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICAgICAgbW92LT5uYl9zdHJlYW1zKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobW92LT5tb2RlID09IE1PREVfTU9WKSB7CisgICAgICAgIHRtY2RfdHJhY2sgPSBtb3YtPm5iX3N0cmVhbXM7CisKKyAgICAgICAgLyogKzEgdG1jZCB0cmFjayBmb3IgZWFjaCB2aWRlbyBzdHJlYW0gd2l0aCBhIHRpbWVjb2RlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgICAgICAgICAgICAgIChnbG9iYWxfdGNyIHx8IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgTlVMTCwgMCkpKQorICAgICAgICAgICAgICAgIG1vdi0+bmJfbWV0YV90bWNkKys7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGVjayBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgdG1jZCB0cmFjayB0byByZW11eCAqLworICAgICAgICBpZiAobW92LT5uYl9tZXRhX3RtY2QpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSBNS1RBRygndCcsJ20nLCdjJywnZCcpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIllvdSByZXF1ZXN0ZWQgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCB0aW1lY29kZSB0cmFjayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic28gdGltZWNvZGUgbWV0YWRhdGEgYXJlIG5vdyBpZ25vcmVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgbW92LT5uYl9tZXRhX3RtY2QgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1vdi0+bmJfc3RyZWFtcyArPSBtb3YtPm5iX21ldGFfdG1jZDsKKyAgICB9CisKKyAgICAvLyBSZXNlcnZlIGFuIGV4dHJhIHN0cmVhbSBmb3IgY2hhcHRlcnMgZm9yIHRoZSBjYXNlIHdoZXJlIGNoYXB0ZXJzCisgICAgLy8gYXJlIHdyaXR0ZW4gaW4gdGhlIHRyYWlsZXIKKyAgICBtb3YtPnRyYWNrcyA9IGF2X21hbGxvY3pfYXJyYXkoKG1vdi0+bmJfc3RyZWFtcyArIDEpLCBzaXplb2YoKm1vdi0+dHJhY2tzKSk7CisgICAgaWYgKCFtb3YtPnRyYWNrcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0PSBzLT5zdHJlYW1zW2ldOworICAgICAgICBNT1ZUcmFjayAqdHJhY2s9ICZtb3YtPnRyYWNrc1tpXTsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmxhbmcgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIE5VTEwsMCk7CisKKyAgICAgICAgdHJhY2stPnN0ICA9IHN0OworICAgICAgICB0cmFjay0+ZW5jID0gc3QtPmNvZGVjOworICAgICAgICB0cmFjay0+bGFuZ3VhZ2UgPSBmZl9tb3ZfaXNvNjM5X3RvX2xhbmcobGFuZz9sYW5nLT52YWx1ZToidW5kIiwgbW92LT5tb2RlIT1NT0RFX01PVik7CisgICAgICAgIGlmICh0cmFjay0+bGFuZ3VhZ2UgPCAwKQorICAgICAgICAgICAgdHJhY2stPmxhbmd1YWdlID0gMDsKKyAgICAgICAgdHJhY2stPm1vZGUgPSBtb3YtPm1vZGU7CisgICAgICAgIHRyYWNrLT50YWcgID0gbW92X2ZpbmRfY29kZWNfdGFnKHMsIHRyYWNrKTsKKyAgICAgICAgaWYgKCF0cmFjay0+dGFnKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGZpbmQgdGFnIGZvciBjb2RlYyAlcyBpbiBzdHJlYW0gIyVkLCAiCisgICAgICAgICAgICAgICAgICAgImNvZGVjIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIGNvbnRhaW5lclxuIiwKKyAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKHN0LT5jb2RlYy0+Y29kZWNfaWQpLCBpKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgaGludGluZyBvZiB0aGlzIHRyYWNrIGlzIGVuYWJsZWQgYnkgYSBsYXRlciBoaW50IHRyYWNrLAorICAgICAgICAgKiB0aGlzIGlzIHVwZGF0ZWQuICovCisgICAgICAgIHRyYWNrLT5oaW50X3RyYWNrID0gLTE7CisgICAgICAgIHRyYWNrLT5zdGFydF9kdHMgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBpZiAodHJhY2stPnRhZyA9PSBNS1RBRygnbScsJ3gnLCczJywncCcpIHx8IHRyYWNrLT50YWcgPT0gTUtUQUcoJ20nLCd4JywnMycsJ24nKSB8fAorICAgICAgICAgICAgICAgIHRyYWNrLT50YWcgPT0gTUtUQUcoJ20nLCd4JywnNCcsJ3AnKSB8fCB0cmFjay0+dGFnID09IE1LVEFHKCdtJywneCcsJzQnLCduJykgfHwKKyAgICAgICAgICAgICAgICB0cmFjay0+dGFnID09IE1LVEFHKCdtJywneCcsJzUnLCdwJykgfHwgdHJhY2stPnRhZyA9PSBNS1RBRygnbScsJ3gnLCc1JywnbicpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+d2lkdGggIT0gNzIwIHx8IChzdC0+Y29kZWMtPmhlaWdodCAhPSA2MDggJiYgc3QtPmNvZGVjLT5oZWlnaHQgIT0gNTEyKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRC0xMC9JTVggbXVzdCB1c2UgNzIweDYwOCBvciA3MjB4NTEyIHZpZGVvIHJlc29sdXRpb25cbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYWNrLT5oZWlnaHQgPSB0cmFjay0+dGFnID4+IDI0ID09ICduJyA/IDQ4NiA6IDU3NjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtb3YtPnZpZGVvX3RyYWNrX3RpbWVzY2FsZSkgeworICAgICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSBtb3YtPnZpZGVvX3RyYWNrX3RpbWVzY2FsZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2stPnRpbWVzY2FsZSA9IHN0LT50aW1lX2Jhc2UuZGVuOworICAgICAgICAgICAgICAgIHdoaWxlKHRyYWNrLT50aW1lc2NhbGUgPCAxMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnRpbWVzY2FsZSAqPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+d2lkdGggPiA2NTUzNSB8fCBzdC0+Y29kZWMtPmhlaWdodCA+IDY1NTM1KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlJlc29sdXRpb24gJWR4JWQgdG9vIGxhcmdlIGZvciBtb3YvbXA0XG4iLCBzdC0+Y29kZWMtPndpZHRoLCBzdC0+Y29kZWMtPmhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YgJiYgdHJhY2stPnRpbWVzY2FsZSA+IDEwMDAwMCkKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HIGNvZGVjIHRpbWViYXNlIGlzIHZlcnkgaGlnaC4gSWYgZHVyYXRpb24gaXMgdG9vIGxvbmcsXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIG1heSBub3QgYmUgcGxheWFibGUgYnkgcXVpY2t0aW1lLiBTcGVjaWZ5IGEgc2hvcnRlciB0aW1lYmFzZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAib3IgY2hvb3NlIGRpZmZlcmVudCBjb250YWluZXIuXG4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5mcmFtZV9zaXplICYmICFhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlYy0+Y29kZWNfaWQpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAidHJhY2sgJWQ6IGNvZGVjIGZyYW1lIHNpemUgaXMgbm90IHNldFxuIiwgaSk7CisgICAgICAgICAgICAgICAgdHJhY2stPmF1ZGlvX3ZiciA9IDE7CisgICAgICAgICAgICB9ZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9NUyB8fAorICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWIHx8CisgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0lMQkMpeworICAgICAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5ibG9ja19hbGlnbikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidHJhY2sgJWQ6IGNvZGVjIGJsb2NrIGFsaWduIGlzIG5vdCBzZXQgZm9yIGFkcGNtXG4iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjay0+c2FtcGxlX3NpemUgPSBzdC0+Y29kZWMtPmJsb2NrX2FsaWduOworICAgICAgICAgICAgfWVsc2UgaWYgKHN0LT5jb2RlYy0+ZnJhbWVfc2l6ZSA+IDEpeyAvKiBhc3N1bWUgY29tcHJlc3NlZCBhdWRpbyAqLworICAgICAgICAgICAgICAgIHRyYWNrLT5hdWRpb192YnIgPSAxOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgdHJhY2stPnNhbXBsZV9zaXplID0gKGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCkgPj4gMykgKiBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSUxCQyB8fAorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1FUKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPmF1ZGlvX3ZiciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHJhY2stPm1vZGUgIT0gTU9ERV9NT1YgJiYKKyAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMgJiYgdHJhY2stPnRpbWVzY2FsZSA8IDE2MDAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInRyYWNrICVkOiBtdXhpbmcgbXAzIGF0ICVkaHogaXMgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaSwgdHJhY2stPmVuYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSBzdC0+dGltZV9iYXNlLmRlbjsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0RBVEEpIHsKKyAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSBzdC0+dGltZV9iYXNlLmRlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSBNT1ZfVElNRVNDQUxFOworICAgICAgICB9CisgICAgICAgIGlmICghdHJhY2stPmhlaWdodCkKKyAgICAgICAgICAgIHRyYWNrLT5oZWlnaHQgPSBzdC0+Y29kZWMtPmhlaWdodDsKKyAgICAgICAgLyogVGhlIGlzbSBzcGVjaWZpYyB0aW1lc2NhbGUgaXNuJ3QgbWFuZGF0b3J5LCBidXQgaXMgYXNzdW1lZCBieQorICAgICAgICAgKiBzb21lIHRvb2xzLCBzdWNoIGFzIG1wNHNwbGl0LiAqLworICAgICAgICBpZiAobW92LT5tb2RlID09IE1PREVfSVNNKQorICAgICAgICAgICAgdHJhY2stPnRpbWVzY2FsZSA9IDEwMDAwMDAwOworCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCB0cmFjay0+dGltZXNjYWxlKTsKKworICAgICAgICAvKiBjb3B5IGV4dHJhZGF0YSBpZiBpdCBleGlzdHMgKi8KKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWRF9TVUJUSVRMRSkKKyAgICAgICAgICAgICAgICBtb3ZfY3JlYXRlX2R2ZF9zdWJfZGVjb2Rlcl9zcGVjaWZpY19pbmZvKHRyYWNrLCBzdCk7CisgICAgICAgICAgICBlbHNlIGlmICghVEFHX0lTX0FWQ0kodHJhY2stPnRhZykpeworICAgICAgICAgICAgICAgIHRyYWNrLT52b3NfbGVuICA9IHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgICAgICAgICAgdHJhY2stPnZvc19kYXRhID0gYXZfbWFsbG9jKHRyYWNrLT52b3NfbGVuKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkodHJhY2stPnZvc19kYXRhLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSwgdHJhY2stPnZvc19sZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpbnQgajsKKyAgICAgICAgQVZTdHJlYW0gKnN0PSBzLT5zdHJlYW1zW2ldOworICAgICAgICBNT1ZUcmFjayAqdHJhY2s9ICZtb3YtPnRyYWNrc1tpXTsKKworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyB8fAorICAgICAgICAgICAgdHJhY2stPmVuYy0+Y2hhbm5lbF9sYXlvdXQgIT0gQVZfQ0hfTEFZT1VUX01PTk8pCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+bmJfc3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3RqPSBzLT5zdHJlYW1zW2pdOworICAgICAgICAgICAgTU9WVHJhY2sgKnRyYWNraj0gJm1vdi0+dHJhY2tzW2pdOworICAgICAgICAgICAgaWYgKGogPT0gaSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKHN0ai0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPIHx8CisgICAgICAgICAgICAgICAgdHJhY2tqLT5lbmMtPmNoYW5uZWxfbGF5b3V0ICE9IEFWX0NIX0xBWU9VVF9NT05PIHx8CisgICAgICAgICAgICAgICAgdHJhY2tqLT5sYW5ndWFnZSAhPSB0cmFjay0+bGFuZ3VhZ2UgfHwKKyAgICAgICAgICAgICAgICB0cmFja2otPnRhZyAhPSB0cmFjay0+dGFnCisgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB0cmFjay0+bXVsdGljaGFubmVsX2FzX21vbm8rKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVuYWJsZV90cmFja3Mocyk7CisKKworICAgIGlmIChtb3YtPnJlc2VydmVkX21vb3Zfc2l6ZSl7CisgICAgICAgIG1vdi0+cmVzZXJ2ZWRfbW9vdl9wb3M9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGlmIChtb3YtPnJlc2VydmVkX21vb3Zfc2l6ZSA+IDApCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIG1vdi0+cmVzZXJ2ZWRfbW9vdl9zaXplKTsKKyAgICB9CisKKyAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZSQUdNRU5UKSB7CisgICAgICAgIC8qIElmIG5vIGZyYWdtZW50YXRpb24gb3B0aW9ucyBoYXZlIGJlZW4gc2V0LCBzZXQgYSBkZWZhdWx0LiAqLworICAgICAgICBpZiAoIShtb3YtPmZsYWdzICYgKEZGX01PVl9GTEFHX0ZSQUdfS0VZRlJBTUUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX01PVl9GTEFHX0ZSQUdfQ1VTVE9NKSkgJiYKKyAgICAgICAgICAgICFtb3YtPm1heF9mcmFnbWVudF9kdXJhdGlvbiAmJiAhbW92LT5tYXhfZnJhZ21lbnRfc2l6ZSkKKyAgICAgICAgICAgIG1vdi0+ZmxhZ3MgfD0gRkZfTU9WX0ZMQUdfRlJBR19LRVlGUkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZBU1RTVEFSVCkKKyAgICAgICAgICAgIG1vdi0+cmVzZXJ2ZWRfbW9vdl9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBtb3Zfd3JpdGVfbWRhdF90YWcocGIsIG1vdik7CisgICAgfQorCisgICAgaWYgKHQgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgImNyZWF0aW9uX3RpbWUiLCBOVUxMLCAwKSkKKyAgICAgICAgbW92LT50aW1lID0gZmZfaXNvODYwMV90b191bml4X3RpbWUodC0+dmFsdWUpOworICAgIGlmIChtb3YtPnRpbWUpCisgICAgICAgIG1vdi0+dGltZSArPSAweDdDMjVCMDgwOyAvLyAxOTcwIGJhc2VkIC0+IDE5MDQgYmFzZWQKKworICAgIGlmIChtb3YtPmNoYXB0ZXJfdHJhY2spCisgICAgICAgIGlmICgocmV0ID0gbW92X2NyZWF0ZV9jaGFwdGVyX3RyYWNrKHMsIG1vdi0+Y2hhcHRlcl90cmFjaykpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX1JUUF9ISU5UKSB7CisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGhpbnQgdHJhY2tzIGZvciBlYWNoIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW0gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmZfbW92X2luaXRfaGludGluZyhzLCBoaW50X3RyYWNrLCBpKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGhpbnRfdHJhY2srKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtb3YtPm5iX21ldGFfdG1jZCkgeworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSB0bWNkIHRyYWNrcyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgdCA9IGdsb2JhbF90Y3I7CisKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgaWYgKCF0KQorICAgICAgICAgICAgICAgICAgICB0ID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAidGltZWNvZGUiLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIXQpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gbW92X2NyZWF0ZV90aW1lY29kZV90cmFjayhzLCB0bWNkX3RyYWNrLCBpLCB0LT52YWx1ZSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB0bWNkX3RyYWNrKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfSVNNTCkKKyAgICAgICAgbW92X3dyaXRlX2lzbWxfbWFuaWZlc3QocGIsIG1vdik7CisKKyAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0VNUFRZX01PT1YpIHsKKyAgICAgICAgbW92X3dyaXRlX21vb3ZfdGFnKHBiLCBtb3YsIHMpOworICAgICAgICBtb3YtPmZyYWdtZW50cysrOworICAgICAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZBU1RTVEFSVCkKKyAgICAgICAgICAgIG1vdi0+cmVzZXJ2ZWRfbW9vdl9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgIH0KKworICAgIHJldHVybiAwOworIGVycm9yOgorICAgIG1vdl9mcmVlKHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X21vb3Zfc2l6ZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IHJldDsKKyAgICBBVklPQ29udGV4dCAqbW9vdl9idWY7CisgICAgTU9WTXV4Q29udGV4dCAqbW92ID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKChyZXQgPSBmZmlvX29wZW5fbnVsbF9idWYoJm1vb3ZfYnVmKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG1vdl93cml0ZV9tb292X3RhZyhtb292X2J1ZiwgbW92LCBzKTsKKyAgICByZXR1cm4gZmZpb19jbG9zZV9udWxsX2J1Zihtb292X2J1Zik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NpZHhfc2l6ZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IHJldDsKKyAgICBBVklPQ29udGV4dCAqYnVmOworICAgIE1PVk11eENvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmICgocmV0ID0gZmZpb19vcGVuX251bGxfYnVmKCZidWYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgbW92X3dyaXRlX3NpZHhfdGFncyhidWYsIG1vdiwgLTEsIDApOworICAgIHJldHVybiBmZmlvX2Nsb3NlX251bGxfYnVmKGJ1Zik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIG1vb3Ygc2l6ZSBpZiBtb3ZlZCB0byB0aGUgdG9wIG9mIHRoZSBmaWxlOiB0aGUgY2h1bmsKKyAqIG9mZnNldCB0YWJsZSBjYW4gc3dpdGNoIGJldHdlZW4gc3RjbyAoMzItYml0IGVudHJpZXMpIHRvIGNvNjQgKDY0LWJpdAorICogZW50cmllcykgd2hlbiB0aGUgbW9vdiBpcyBtb3ZlZCB0byB0aGUgYmVnaW5uaW5nLCBzbyB0aGUgc2l6ZSBvZiB0aGUgbW9vdgorICogd291bGQgY2hhbmdlLiBJdCBhbHNvIHVwZGF0ZXMgdGhlIGNodW5rIG9mZnNldCB0YWJsZXMuCisgKi8KK3N0YXRpYyBpbnQgY29tcHV0ZV9tb292X3NpemUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpLCBtb292X3NpemUsIG1vb3Zfc2l6ZTI7CisgICAgTU9WTXV4Q29udGV4dCAqbW92ID0gcy0+cHJpdl9kYXRhOworCisgICAgbW9vdl9zaXplID0gZ2V0X21vb3Zfc2l6ZShzKTsKKyAgICBpZiAobW9vdl9zaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIG1vb3Zfc2l6ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgbW92LT50cmFja3NbaV0uZGF0YV9vZmZzZXQgKz0gbW9vdl9zaXplOworCisgICAgbW9vdl9zaXplMiA9IGdldF9tb292X3NpemUocyk7CisgICAgaWYgKG1vb3Zfc2l6ZTIgPCAwKQorICAgICAgICByZXR1cm4gbW9vdl9zaXplMjsKKworICAgIC8qIGlmIHRoZSBzaXplIGNoYW5nZWQsIHdlIGp1c3Qgc3dpdGNoZWQgZnJvbSBzdGNvIHRvIGNvNjQgYW5kIG5lZWQgdG8KKyAgICAgKiB1cGRhdGUgdGhlIG9mZnNldHMgKi8KKyAgICBpZiAobW9vdl9zaXplMiAhPSBtb292X3NpemUpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgICAgIG1vdi0+dHJhY2tzW2ldLmRhdGFfb2Zmc2V0ICs9IG1vb3Zfc2l6ZTIgLSBtb292X3NpemU7CisKKyAgICByZXR1cm4gbW9vdl9zaXplMjsKK30KKworc3RhdGljIGludCBjb21wdXRlX3NpZHhfc2l6ZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGksIHNpZHhfc2l6ZTsKKyAgICBNT1ZNdXhDb250ZXh0ICptb3YgPSBzLT5wcml2X2RhdGE7CisKKyAgICBzaWR4X3NpemUgPSBnZXRfc2lkeF9zaXplKHMpOworICAgIGlmIChzaWR4X3NpemUgPCAwKQorICAgICAgICByZXR1cm4gc2lkeF9zaXplOworCisgICAgZm9yIChpID0gMDsgaSA8IG1vdi0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICBtb3YtPnRyYWNrc1tpXS5kYXRhX29mZnNldCArPSBzaWR4X3NpemU7CisKKyAgICByZXR1cm4gc2lkeF9zaXplOworfQorCitzdGF0aWMgaW50IHNoaWZ0X2RhdGEoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCByZXQgPSAwLCBtb292X3NpemU7CisgICAgTU9WTXV4Q29udGV4dCAqbW92ID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgcG9zLCBwb3NfZW5kID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICB1aW50OF90ICpidWYsICpyZWFkX2J1ZlsyXTsKKyAgICBpbnQgcmVhZF9idWZfaWQgPSAwOworICAgIGludCByZWFkX3NpemVbMl07CisgICAgQVZJT0NvbnRleHQgKnJlYWRfcGI7CisKKyAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZSQUdNRU5UKQorICAgICAgICBtb292X3NpemUgPSBjb21wdXRlX3NpZHhfc2l6ZShzKTsKKyAgICBlbHNlCisgICAgICAgIG1vb3Zfc2l6ZSA9IGNvbXB1dGVfbW9vdl9zaXplKHMpOworICAgIGlmIChtb292X3NpemUgPCAwKQorICAgICAgICByZXR1cm4gbW9vdl9zaXplOworCisgICAgYnVmID0gYXZfbWFsbG9jKG1vb3Zfc2l6ZSAqIDIpOworICAgIGlmICghYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJlYWRfYnVmWzBdID0gYnVmOworICAgIHJlYWRfYnVmWzFdID0gYnVmICsgbW9vdl9zaXplOworCisgICAgLyogU2hpZnQgdGhlIGRhdGE6IHRoZSBBVklPIGNvbnRleHQgb2YgdGhlIG91dHB1dCBjYW4gb25seSBiZSB1c2VkIGZvcgorICAgICAqIHdyaXRpbmcsIHNvIHdlIHJlLW9wZW4gdGhlIHNhbWUgb3V0cHV0LCBidXQgZm9yIHJlYWRpbmcuIEl0IGFsc28gYXZvaWRzCisgICAgICogYSByZWFkL3NlZWsvd3JpdGUvc2VlayBiYWNrIGFuZCBmb3J0aC4gKi8KKyAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKyAgICByZXQgPSBhdmlvX29wZW4oJnJlYWRfcGIsIHMtPmZpbGVuYW1lLCBBVklPX0ZMQUdfUkVBRCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byByZS1vcGVuICVzIG91dHB1dCBmaWxlIGZvciAiCisgICAgICAgICAgICAgICAidGhlIHNlY29uZCBwYXNzIChmYXN0c3RhcnQpXG4iLCBzLT5maWxlbmFtZSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8qIG1hcmsgdGhlIGVuZCBvZiB0aGUgc2hpZnQgdG8gdXAgdG8gdGhlIGxhc3QgZGF0YSB3ZSB3cm90ZSwgYW5kIGdldCByZWFkeQorICAgICAqIGZvciB3cml0aW5nICovCisgICAgcG9zX2VuZCA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgYXZpb19zZWVrKHMtPnBiLCBtb3YtPnJlc2VydmVkX21vb3ZfcG9zICsgbW9vdl9zaXplLCBTRUVLX1NFVCk7CisKKyAgICAvKiBzdGFydCByZWFkaW5nIGF0IHdoZXJlIHRoZSBuZXcgbW9vdiB3aWxsIGJlIHBsYWNlZCAqLworICAgIGF2aW9fc2VlayhyZWFkX3BiLCBtb3YtPnJlc2VydmVkX21vb3ZfcG9zLCBTRUVLX1NFVCk7CisgICAgcG9zID0gYXZpb190ZWxsKHJlYWRfcGIpOworCisjZGVmaW5lIFJFQURfQkxPQ0sgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVhZF9zaXplW3JlYWRfYnVmX2lkXSA9IGF2aW9fcmVhZChyZWFkX3BiLCByZWFkX2J1ZltyZWFkX2J1Zl9pZF0sIG1vb3Zfc2l6ZSk7ICBcCisgICAgcmVhZF9idWZfaWQgXj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgLyogc2hpZnQgZGF0YSBieSBjaHVuayBvZiBhdCBtb3N0IG1vb3Zfc2l6ZSAqLworICAgIFJFQURfQkxPQ0s7CisgICAgZG8geworICAgICAgICBpbnQgbjsKKyAgICAgICAgUkVBRF9CTE9DSzsKKyAgICAgICAgbiA9IHJlYWRfc2l6ZVtyZWFkX2J1Zl9pZF07CisgICAgICAgIGlmIChuIDw9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgcmVhZF9idWZbcmVhZF9idWZfaWRdLCBuKTsKKyAgICAgICAgcG9zICs9IG47CisgICAgfSB3aGlsZSAocG9zIDwgcG9zX2VuZCk7CisgICAgYXZpb19jbG9zZShyZWFkX3BiKTsKKworZW5kOgorICAgIGF2X2ZyZWUoYnVmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNT1ZNdXhDb250ZXh0ICptb3YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHJlcyA9IDA7CisgICAgaW50IGk7CisgICAgaW50NjRfdCBtb292X3BvczsKKworICAgIC8qCisgICAgICogQmVmb3JlIGFjdHVhbGx5IHdyaXRpbmcgdGhlIHRyYWlsZXIsIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubworICAgICAqIGRhbmdsaW5nIHN1YnRpdGxlcywgdGhhdCBuZWVkIGEgdGVybWluYXRpbmcgc2FtcGxlLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBNT1ZUcmFjayAqdHJrID0gJm1vdi0+dHJhY2tzW2ldOworICAgICAgICBpZiAodHJrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01PVl9URVhUICYmCisgICAgICAgICAgICAhdHJrLT5sYXN0X3NhbXBsZV9pc19zdWJ0aXRsZV9lbmQpIHsKKyAgICAgICAgICAgIG1vdl93cml0ZV9zdWJ0aXRsZV9lbmRfcGFja2V0KHMsIGksIHRyay0+dHJhY2tfZHVyYXRpb24pOworICAgICAgICAgICAgdHJrLT5sYXN0X3NhbXBsZV9pc19zdWJ0aXRsZV9lbmQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlcmUgd2VyZSBubyBjaGFwdGVycyB3aGVuIHRoZSBoZWFkZXIgd2FzIHdyaXR0ZW4sIGJ1dCB0aGVyZQorICAgIC8vIGFyZSBjaGFwdGVycyBub3csIHdyaXRlIHRoZW0gaW4gdGhlIHRyYWlsZXIuICBUaGlzIG9ubHkgd29ya3MKKyAgICAvLyB3aGVuIHdlIGFyZSBub3QgZG9pbmcgZnJhZ21lbnRzLgorICAgIGlmICghbW92LT5jaGFwdGVyX3RyYWNrICYmICEobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZSQUdNRU5UKSkgeworICAgICAgICBpZiAobW92LT5tb2RlICYgKE1PREVfTVA0fE1PREVfTU9WfE1PREVfSVBPRCkgJiYgcy0+bmJfY2hhcHRlcnMpIHsKKyAgICAgICAgICAgIG1vdi0+Y2hhcHRlcl90cmFjayA9IG1vdi0+bmJfc3RyZWFtcysrOworICAgICAgICAgICAgaWYgKChyZXMgPSBtb3ZfY3JlYXRlX2NoYXB0ZXJfdHJhY2socywgbW92LT5jaGFwdGVyX3RyYWNrKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIShtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR01FTlQpKSB7CisgICAgICAgIG1vb3ZfcG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgICAgICAvKiBXcml0ZSBzaXplIG9mIG1kYXQgdGFnICovCisgICAgICAgIGlmIChtb3YtPm1kYXRfc2l6ZSArIDggPD0gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBtb3YtPm1kYXRfcG9zLCBTRUVLX1NFVCk7CisgICAgICAgICAgICBhdmlvX3diMzIocGIsIG1vdi0+bWRhdF9zaXplICsgOCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBvdmVyd3JpdGUgJ3dpZGUnIHBsYWNlaG9sZGVyIGF0b20gKi8KKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgbW92LT5tZGF0X3BvcyAtIDgsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIC8qIHNwZWNpYWwgdmFsdWU6IHJlYWwgYXRvbSBzaXplIHdpbGwgYmUgNjQgYml0IHZhbHVlIGFmdGVyCisgICAgICAgICAgICAgKiB0YWcgZmllbGQgKi8KKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgMSk7CisgICAgICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJtZGF0Iik7CisgICAgICAgICAgICBhdmlvX3diNjQocGIsIG1vdi0+bWRhdF9zaXplICsgMTYpOworICAgICAgICB9CisgICAgICAgIGF2aW9fc2VlayhwYiwgbW92LT5yZXNlcnZlZF9tb292X3NpemUgPiAwID8gbW92LT5yZXNlcnZlZF9tb292X3BvcyA6IG1vb3ZfcG9zLCBTRUVLX1NFVCk7CisKKyAgICAgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19GQVNUU1RBUlQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIlN0YXJ0aW5nIHNlY29uZCBwYXNzOiBtb3ZpbmcgdGhlIG1vb3YgYXRvbSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlXG4iKTsKKyAgICAgICAgICAgIHJlcyA9IHNoaWZ0X2RhdGEocyk7CisgICAgICAgICAgICBpZiAocmVzID09IDApIHsKKyAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIG1vdi0+cmVzZXJ2ZWRfbW9vdl9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICBtb3Zfd3JpdGVfbW9vdl90YWcocGIsIG1vdiwgcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobW92LT5yZXNlcnZlZF9tb292X3NpemUgPiAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IHNpemU7CisgICAgICAgICAgICBtb3Zfd3JpdGVfbW9vdl90YWcocGIsIG1vdiwgcyk7CisgICAgICAgICAgICBzaXplID0gbW92LT5yZXNlcnZlZF9tb292X3NpemUgLSAoYXZpb190ZWxsKHBiKSAtIG1vdi0+cmVzZXJ2ZWRfbW9vdl9wb3MpOworICAgICAgICAgICAgaWYgKHNpemUgPCA4KXsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicmVzZXJ2ZWRfbW9vdl9zaXplIGlzIHRvbyBzbWFsbCwgbmVlZGVkICUiUFJJZDY0IiBhZGRpdGlvbmFsXG4iLCA4LXNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgc2l6ZSk7CisgICAgICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJmcmVlIik7CisgICAgICAgICAgICBmZmlvX2ZpbGwocGIsIDAsIHNpemUgLSA4KTsKKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgbW9vdl9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vdl93cml0ZV9tb292X3RhZyhwYiwgbW92LCBzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1vdl9mbHVzaF9mcmFnbWVudChzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vdi0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICAgICBtb3YtPnRyYWNrc1tpXS5kYXRhX29mZnNldCA9IDA7CisgICAgICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRkFTVFNUQVJUKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJTdGFydGluZyBzZWNvbmQgcGFzczogaW5zZXJ0aW5nIHNpZHggYXRvbXNcbiIpOworICAgICAgICAgICAgcmVzID0gc2hpZnRfZGF0YShzKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZW5kID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIG1vdi0+cmVzZXJ2ZWRfbW9vdl9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICBtb3Zfd3JpdGVfc2lkeF90YWdzKHBiLCBtb3YsIC0xLCAwKTsKKyAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGVuZCwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgIG1vdl93cml0ZV9tZnJhX3RhZyhwYiwgbW92KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vdl93cml0ZV9tZnJhX3RhZyhwYiwgbW92KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZSQUdNRU5UICYmCisgICAgICAgICAgICBtb3YtPnRyYWNrc1tpXS52YzFfaW5mby5zdHJ1Y3Rfb2Zmc2V0ICYmIHMtPnBiLT5zZWVrYWJsZSkgeworICAgICAgICAgICAgaW50NjRfdCBvZmYgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgdWludDhfdCBidWZbN107CisgICAgICAgICAgICBpZiAobW92X3dyaXRlX2R2YzFfc3RydWN0cygmbW92LT50cmFja3NbaV0sIGJ1ZikgPj0gMCkgeworICAgICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgbW92LT50cmFja3NbaV0udmMxX2luZm8uc3RydWN0X29mZnNldCwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgIGF2aW9fd3JpdGUocGIsIGJ1ZiwgNyk7CisgICAgICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBvZmYsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworZXJyb3I6CisgICAgbW92X2ZyZWUocyk7CisKKyAgICByZXR1cm4gcmVzOworfQorCisjaWYgQ09ORklHX01PVl9NVVhFUgorTU9WX0NMQVNTKG1vdikKK0FWT3V0cHV0Rm9ybWF0IGZmX21vdl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAibW92IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUXVpY2tUaW1lIC8gTU9WIiksCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gIm1vdiIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKE1PVk11eENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0FBQywKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBDT05GSUdfTElCWDI2NF9FTkNPREVSID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19JRF9IMjY0IDogQVZfQ09ERUNfSURfTVBFRzQsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gbW92X3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBtb3Zfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IG1vdl93cml0ZV90cmFpbGVyLAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX0dMT0JBTEhFQURFUiB8IEFWRk1UX0FMTE9XX0ZMVVNIIHwgQVZGTVRfVFNfTkVHQVRJVkUsCisgICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsKKyAgICAgICAgZmZfY29kZWNfbW92dmlkZW9fdGFncywgZmZfY29kZWNfbW92YXVkaW9fdGFncywgMAorICAgIH0sCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJm1vdl9tdXhlcl9jbGFzcywKK307CisjZW5kaWYKKyNpZiBDT05GSUdfVEdQX01VWEVSCitNT1ZfQ0xBU1ModGdwKQorQVZPdXRwdXRGb3JtYXQgZmZfdGdwX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICIzZ3AiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCIzR1AgKDNHUFAgZmlsZSBmb3JtYXQpIiksCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gIjNncCIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKE1PVk11eENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0FNUl9OQiwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYzLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1vdl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbW92X3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBtb3Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9BTExPV19GTFVTSCB8IEFWRk1UX1RTX05FR0FUSVZFLAorICAgIC5jb2RlY190YWcgICAgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7IGNvZGVjXzNncF90YWdzLCAwIH0sCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJnRncF9tdXhlcl9jbGFzcywKK307CisjZW5kaWYKKyNpZiBDT05GSUdfTVA0X01VWEVSCitNT1ZfQ0xBU1MobXA0KQorQVZPdXRwdXRGb3JtYXQgZmZfbXA0X211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJtcDQiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUDQgKE1QRUctNCBQYXJ0IDE0KSIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhcHBsaWNhdGlvbi9tcDQiLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJtcDQiLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihNT1ZNdXhDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9BQUMsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQ09ORklHX0xJQlgyNjRfRU5DT0RFUiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSURfSDI2NCA6IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1vdl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbW92X3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBtb3Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9BTExPV19GTFVTSCB8IEFWRk1UX1RTX05FR0FUSVZFLAorICAgIC5jb2RlY190YWcgICAgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7IGZmX21wNF9vYmpfdHlwZSwgMCB9LAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZtcDRfbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmCisjaWYgQ09ORklHX1BTUF9NVVhFUgorTU9WX0NMQVNTKHBzcCkKK0FWT3V0cHV0Rm9ybWF0IGZmX3BzcF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAicHNwIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUFNQIE1QNCAoTVBFRy00IFBhcnQgMTQpIiksCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gIm1wNCxwc3AiLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihNT1ZNdXhDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9BQUMsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQ09ORklHX0xJQlgyNjRfRU5DT0RFUiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSURfSDI2NCA6IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1vdl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbW92X3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBtb3Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9BTExPV19GTFVTSCB8IEFWRk1UX1RTX05FR0FUSVZFLAorICAgIC5jb2RlY190YWcgICAgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7IGZmX21wNF9vYmpfdHlwZSwgMCB9LAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZwc3BfbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmCisjaWYgQ09ORklHX1RHMl9NVVhFUgorTU9WX0NMQVNTKHRnMikKK0FWT3V0cHV0Rm9ybWF0IGZmX3RnMl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAiM2cyIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiM0dQMiAoM0dQUDIgZmlsZSBmb3JtYXQpIiksCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gIjNnMiIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKE1PVk11eENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0FNUl9OQiwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYzLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1vdl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbW92X3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBtb3Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9BTExPV19GTFVTSCB8IEFWRk1UX1RTX05FR0FUSVZFLAorICAgIC5jb2RlY190YWcgICAgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7IGNvZGVjXzNncF90YWdzLCAwIH0sCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJnRnMl9tdXhlcl9jbGFzcywKK307CisjZW5kaWYKKyNpZiBDT05GSUdfSVBPRF9NVVhFUgorTU9WX0NMQVNTKGlwb2QpCitBVk91dHB1dEZvcm1hdCBmZl9pcG9kX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJpcG9kIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiaVBvZCBILjI2NCBNUDQgKE1QRUctNCBQYXJ0IDE0KSIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhcHBsaWNhdGlvbi9tcDQiLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJtNHYsbTRhIiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTU9WTXV4Q29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gbW92X3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBtb3Zfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IG1vdl93cml0ZV90cmFpbGVyLAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX0dMT0JBTEhFQURFUiB8IEFWRk1UX0FMTE9XX0ZMVVNIIHwgQVZGTVRfVFNfTkVHQVRJVkUsCisgICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgY29kZWNfaXBvZF90YWdzLCAwIH0sCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJmlwb2RfbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmCisjaWYgQ09ORklHX0lTTVZfTVVYRVIKK01PVl9DTEFTUyhpc212KQorQVZPdXRwdXRGb3JtYXQgZmZfaXNtdl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAiaXNtdiIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIklTTVYvSVNNQSAoU21vb3RoIFN0cmVhbWluZykiKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAiYXBwbGljYXRpb24vbXA0IiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAiaXNtdixpc21hIiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTU9WTXV4Q29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gbW92X3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBtb3Zfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IG1vdl93cml0ZV90cmFpbGVyLAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX0dMT0JBTEhFQURFUiB8IEFWRk1UX0FMTE9XX0ZMVVNIIHwgQVZGTVRfVFNfTkVHQVRJVkUsCisgICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgZmZfbXA0X29ial90eXBlLCAwIH0sCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJmlzbXZfbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmCisjaWYgQ09ORklHX0Y0Vl9NVVhFUgorTU9WX0NMQVNTKGY0dikKK0FWT3V0cHV0Rm9ybWF0IGZmX2Y0dl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAiZjR2IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRjRWIEFkb2JlIEZsYXNoIFZpZGVvIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImFwcGxpY2F0aW9uL2Y0diIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gImY0diIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKE1PVk11eENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0FBQywKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1vdl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbW92X3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBtb3Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9BTExPV19GTFVTSCwKKyAgICAuY29kZWNfdGFnICAgICAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyogY29uc3QgW10peyBjb2RlY19mNHZfdGFncywgMCB9LAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZmNHZfbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbW92ZW5jLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvbW92ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmNmUzYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tb3ZlbmMuaApAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIE1PViwgM0dQLCBNUDQgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaG9tYXMgUmFpdmlvCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgR2lsZGFzIEJhemluIDxnYmF6aW4gYXQgdmlkZW9sYW4gZG90IG9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwOSBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlIGRvdCBjb3VkdXJpZXIgYXQgZ21haWwgZG90IGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9NT1ZFTkNfSAorI2RlZmluZSBBVkZPUk1BVF9NT1ZFTkNfSAorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworI2RlZmluZSBNT1ZfRlJBR19JTkZPX0FMTE9DX0lOQ1JFTUVOVCA2NAorI2RlZmluZSBNT1ZfSU5ERVhfQ0xVU1RFUl9TSVpFIDEwMjQKKyNkZWZpbmUgTU9WX1RJTUVTQ0FMRSAxMDAwCisKKyNkZWZpbmUgUlRQX01BWF9QQUNLRVRfU0laRSAxNDUwCisKKyNkZWZpbmUgTU9ERV9NUDQgIDB4MDEKKyNkZWZpbmUgTU9ERV9NT1YgIDB4MDIKKyNkZWZpbmUgTU9ERV8zR1AgIDB4MDQKKyNkZWZpbmUgTU9ERV9QU1AgIDB4MDggLy8gZXhhbXBsZSB3b3JraW5nIFBTUCBjb21tYW5kIGxpbmU6CisvLyBmZm1wZWcgLWkgdGVzdGlucHV0LmF2aSAgLWYgcHNwIC1yIDE0Ljk4NSAtcyAzMjB4MjQwIC1iIDc2OCAtYXIgMjQwMDAgLWFiIDMyIE00VjAwMDAxLk1QNAorI2RlZmluZSBNT0RFXzNHMiAgMHgxMAorI2RlZmluZSBNT0RFX0lQT0QgMHgyMAorI2RlZmluZSBNT0RFX0lTTSAgMHg0MAorI2RlZmluZSBNT0RFX0Y0ViAgMHg4MAorCit0eXBlZGVmIHN0cnVjdCBNT1ZJZW50cnkgeworICAgIHVpbnQ2NF90ICAgICBwb3M7CisgICAgaW50NjRfdCAgICAgIGR0czsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgc2FtcGxlc19pbl9jaHVuazsKKyAgICB1bnNpZ25lZCBpbnQgY2h1bmtOdW07ICAgICAgICAgICAgICAvLy88IENodW5rIG51bWJlciBpZiB0aGUgY3VycmVudCBlbnRyeSBpcyBhIGNodW5rIHN0YXJ0IG90aGVyd2lzZSAwCisgICAgdW5zaWduZWQgaW50IGVudHJpZXM7CisgICAgaW50ICAgICAgICAgIGN0czsKKyNkZWZpbmUgTU9WX1NZTkNfU0FNUExFICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1PVl9QQVJUSUFMX1NZTkNfU0FNUExFIDB4MDAwMgorICAgIHVpbnQzMl90ICAgICBmbGFnczsKK30gTU9WSWVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBIaW50U2FtcGxlIHsKKyAgICB1aW50OF90ICpkYXRhOworICAgIGludCBzaXplOworICAgIGludCBzYW1wbGVfbnVtYmVyOworICAgIGludCBvZmZzZXQ7CisgICAgaW50IG93bl9kYXRhOworfSBIaW50U2FtcGxlOworCit0eXBlZGVmIHN0cnVjdCBIaW50U2FtcGxlUXVldWUgeworICAgIGludCBzaXplOworICAgIGludCBsZW47CisgICAgSGludFNhbXBsZSAqc2FtcGxlczsKK30gSGludFNhbXBsZVF1ZXVlOworCit0eXBlZGVmIHN0cnVjdCBNT1ZGcmFnbWVudEluZm8geworICAgIGludDY0X3Qgb2Zmc2V0OworICAgIGludDY0X3QgdGltZTsKKyAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgIGludDY0X3QgdGZyZl9vZmZzZXQ7CisgICAgaW50IHNpemU7Cit9IE1PVkZyYWdtZW50SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgTU9WVHJhY2sgeworICAgIGludCAgICAgICAgIG1vZGU7CisgICAgaW50ICAgICAgICAgZW50cnk7CisgICAgdW5zaWduZWQgICAgdGltZXNjYWxlOworICAgIHVpbnQ2NF90ICAgIHRpbWU7CisgICAgaW50NjRfdCAgICAgdHJhY2tfZHVyYXRpb247CisgICAgaW50ICAgICAgICAgbGFzdF9zYW1wbGVfaXNfc3VidGl0bGVfZW5kOworICAgIGxvbmcgICAgICAgIHNhbXBsZV9jb3VudDsKKyAgICBsb25nICAgICAgICBzYW1wbGVfc2l6ZTsKKyAgICBsb25nICAgICAgICBjaHVua0NvdW50OworICAgIGludCAgICAgICAgIGhhc19rZXlmcmFtZXM7CisjZGVmaW5lIE1PVl9UUkFDS19DVFRTICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1PVl9UUkFDS19TVFBTICAgICAgICAgMHgwMDAyCisjZGVmaW5lIE1PVl9UUkFDS19FTkFCTEVEICAgICAgMHgwMDA0CisgICAgdWludDMyX3QgICAgZmxhZ3M7CisjZGVmaW5lIE1PVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRSAgICAgMHgwMDAxCisjZGVmaW5lIE1PVl9USU1FQ09ERV9GTEFHXzI0SE9VUlNNQVggICAgMHgwMDAyCisjZGVmaW5lIE1PVl9USU1FQ09ERV9GTEFHX0FMTE9XTkVHQVRJVkUgMHgwMDA0CisgICAgdWludDMyX3QgICAgdGltZWNvZGVfZmxhZ3M7CisgICAgaW50ICAgICAgICAgbGFuZ3VhZ2U7CisgICAgaW50ICAgICAgICAgdHJhY2tfaWQ7CisgICAgaW50ICAgICAgICAgdGFnOyAvLy88IHN0c2QgZm91cmNjCisgICAgQVZTdHJlYW0gICAgICAgICpzdDsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jOworICAgIGludCBtdWx0aWNoYW5uZWxfYXNfbW9ubzsKKworICAgIGludCAgICAgICAgIHZvc19sZW47CisgICAgdWludDhfdCAgICAgKnZvc19kYXRhOworICAgIE1PVkllbnRyeSAgICpjbHVzdGVyOworICAgIHVuc2lnbmVkICAgIGNsdXN0ZXJfY2FwYWNpdHk7CisgICAgaW50ICAgICAgICAgYXVkaW9fdmJyOworICAgIGludCAgICAgICAgIGhlaWdodDsgLy8vPCBhY3RpdmUgcGljdHVyZSAody9vIFZCSSkgaGVpZ2h0IGZvciBELTEwL0lNWAorICAgIHVpbnQzMl90ICAgIHRyZWZfdGFnOworICAgIGludCAgICAgICAgIHRyZWZfaWQ7IC8vLzwgdHJhY2tJRCBvZiB0aGUgcmVmZXJlbmNlZCB0cmFjaworICAgIGludDY0X3QgICAgIHN0YXJ0X2R0czsKKworICAgIGludCAgICAgICAgIGhpbnRfdHJhY2s7ICAgLy8vPCB0aGUgdHJhY2sgdGhhdCBoaW50cyB0aGlzIHRyYWNrLCAtMSBpZiBubyBoaW50IHRyYWNrIGlzIHNldAorICAgIGludCAgICAgICAgIHNyY190cmFjazsgICAgLy8vPCB0aGUgdHJhY2sgdGhhdCB0aGlzIGhpbnQgKG9yIHRtY2QpIHRyYWNrIGRlc2NyaWJlcworICAgIEFWRm9ybWF0Q29udGV4dCAqcnRwX2N0eDsgLy8vPCB0aGUgZm9ybWF0IGNvbnRleHQgZm9yIHRoZSBoaW50aW5nIHJ0cCBtdXhlcgorICAgIHVpbnQzMl90ICAgIHByZXZfcnRwX3RzOworICAgIGludDY0X3QgICAgIGN1cl9ydHBfdHNfdW53cmFwcGVkOworICAgIHVpbnQzMl90ICAgIG1heF9wYWNrZXRfc2l6ZTsKKworICAgIGludDY0X3QgICAgIGRlZmF1bHRfZHVyYXRpb247CisgICAgdWludDMyX3QgICAgZGVmYXVsdF9zYW1wbGVfZmxhZ3M7CisgICAgdWludDMyX3QgICAgZGVmYXVsdF9zaXplOworCisgICAgSGludFNhbXBsZVF1ZXVlIHNhbXBsZV9xdWV1ZTsKKworICAgIEFWSU9Db250ZXh0ICptZGF0X2J1ZjsKKyAgICBpbnQ2NF90ICAgICBkYXRhX29mZnNldDsKKyAgICBpbnQ2NF90ICAgICBmcmFnX3N0YXJ0OworICAgIGludCAgICAgICAgIGZyYWdfZGlzY29udDsKKworICAgIGludCAgICAgICAgIG5iX2ZyYWdfaW5mbzsKKyAgICBNT1ZGcmFnbWVudEluZm8gKmZyYWdfaW5mbzsKKyAgICB1bnNpZ25lZCAgICBmcmFnX2luZm9fY2FwYWNpdHk7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQ2NF90IHN0cnVjdF9vZmZzZXQ7CisgICAgICAgIGludCAgICAgZmlyc3RfcGFja2V0X3NlcTsKKyAgICAgICAgaW50ICAgICBmaXJzdF9wYWNrZXRfZW50cnk7CisgICAgICAgIGludCAgICAgcGFja2V0X3NlcTsKKyAgICAgICAgaW50ICAgICBwYWNrZXRfZW50cnk7CisgICAgICAgIGludCAgICAgc2xpY2VzOworICAgIH0gdmMxX2luZm87CisKKyAgICB2b2lkICAgICAgICplYWMzX3ByaXY7Cit9IE1PVlRyYWNrOworCit0eXBlZGVmIHN0cnVjdCBNT1ZNdXhDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKKyAgICBpbnQgICAgIG1vZGU7CisgICAgaW50NjRfdCB0aW1lOworICAgIGludCAgICAgbmJfc3RyZWFtczsKKyAgICBpbnQgICAgIG5iX21ldGFfdG1jZDsgIC8vLzwgbnVtYmVyIG9mIG5ldyBjcmVhdGVkIHRtY2QgdHJhY2sgYmFzZWQgb24gbWV0YWRhdGEgKGFrYSBub3QgZGF0YSBjb3B5KQorICAgIGludCAgICAgY2hhcHRlcl90cmFjazsgLy8vPCBxdCBjaGFwdGVyIHRyYWNrIG51bWJlcgorICAgIGludDY0X3QgbWRhdF9wb3M7CisgICAgdWludDY0X3QgbWRhdF9zaXplOworICAgIE1PVlRyYWNrICp0cmFja3M7CisKKyAgICBpbnQgZmxhZ3M7CisgICAgaW50IHJ0cF9mbGFnczsKKyAgICBpbnQgZXhhY3Q7CisKKyAgICBpbnQgaW9kc19za2lwOworICAgIGludCBpb2RzX3ZpZGVvX3Byb2ZpbGU7CisgICAgaW50IGlvZHNfYXVkaW9fcHJvZmlsZTsKKworICAgIGludCBmcmFnbWVudHM7CisgICAgaW50IG1heF9mcmFnbWVudF9kdXJhdGlvbjsKKyAgICBpbnQgbWluX2ZyYWdtZW50X2R1cmF0aW9uOworICAgIGludCBtYXhfZnJhZ21lbnRfc2l6ZTsKKyAgICBpbnQgaXNtX2xvb2thaGVhZDsKKyAgICBBVklPQ29udGV4dCAqbWRhdF9idWY7CisgICAgaW50IGZpcnN0X3RydW47CisKKyAgICBpbnQgdmlkZW9fdHJhY2tfdGltZXNjYWxlOworCisgICAgaW50IHJlc2VydmVkX21vb3Zfc2l6ZTsgLy8vPCAwIGZvciBkaXNhYmxlZCwgLTEgZm9yIGF1dG9tYXRpYywgc2l6ZSBvdGhlcndpc2UKKyAgICBpbnQ2NF90IHJlc2VydmVkX21vb3ZfcG9zOworCisgICAgY2hhciAqbWFqb3JfYnJhbmQ7CisKKyAgICBpbnQgcGVyX3N0cmVhbV9ncm91cGluZzsKKyAgICBBVkZvcm1hdENvbnRleHQgKmZjOworCisgICAgaW50IHVzZV9lZGl0bGlzdDsKK30gTU9WTXV4Q29udGV4dDsKKworI2RlZmluZSBGRl9NT1ZfRkxBR19SVFBfSElOVCAgICAgICAgICAgICAgKDEgPDwgIDApCisjZGVmaW5lIEZGX01PVl9GTEFHX0ZSQUdNRU5UICAgICAgICAgICAgICAoMSA8PCAgMSkKKyNkZWZpbmUgRkZfTU9WX0ZMQUdfRU1QVFlfTU9PViAgICAgICAgICAgICgxIDw8ICAyKQorI2RlZmluZSBGRl9NT1ZfRkxBR19GUkFHX0tFWUZSQU1FICAgICAgICAgKDEgPDwgIDMpCisjZGVmaW5lIEZGX01PVl9GTEFHX1NFUEFSQVRFX01PT0YgICAgICAgICAoMSA8PCAgNCkKKyNkZWZpbmUgRkZfTU9WX0ZMQUdfRlJBR19DVVNUT00gICAgICAgICAgICgxIDw8ICA1KQorI2RlZmluZSBGRl9NT1ZfRkxBR19JU01MICAgICAgICAgICAgICAgICAgKDEgPDwgIDYpCisjZGVmaW5lIEZGX01PVl9GTEFHX0ZBU1RTVEFSVCAgICAgICAgICAgICAoMSA8PCAgNykKKyNkZWZpbmUgRkZfTU9WX0ZMQUdfT01JVF9URkhEX09GRlNFVCAgICAgICgxIDw8ICA4KQorI2RlZmluZSBGRl9NT1ZfRkxBR19ESVNBQkxFX0NIUEwgICAgICAgICAgKDEgPDwgIDkpCisjZGVmaW5lIEZGX01PVl9GTEFHX0RFRkFVTFRfQkFTRV9NT09GICAgICAoMSA8PCAxMCkKKyNkZWZpbmUgRkZfTU9WX0ZMQUdfREFTSCAgICAgICAgICAgICAgICAgICgxIDw8IDExKQorI2RlZmluZSBGRl9NT1ZfRkxBR19GUkFHX0RJU0NPTlQgICAgICAgICAgKDEgPDwgMTIpCisKK2ludCBmZl9tb3Zfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCk7CisKK2ludCBmZl9tb3ZfaW5pdF9oaW50aW5nKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGluZGV4LCBpbnQgc3JjX2luZGV4KTsKK2ludCBmZl9tb3ZfYWRkX2hpbnRlZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhY2tfaW5kZXgsIGludCBzYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNhbXBsZV9kYXRhLCBpbnQgc2FtcGxlX3NpemUpOwordm9pZCBmZl9tb3ZfY2xvc2VfaGludGluZyhNT1ZUcmFjayAqdHJhY2spOworCisjZW5kaWYgLyogQVZGT1JNQVRfTU9WRU5DX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tb3ZlbmNoaW50LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbW92ZW5jaGludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmFhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbW92ZW5jaGludC5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogTU9WLCAzR1AsIE1QNCBtdXhlciBSVFAgaGludGluZworICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJtb3ZlbmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJydHBlbmNfY2hhaW4uaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAicnRwLmgiCisKK2ludCBmZl9tb3ZfaW5pdF9oaW50aW5nKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGluZGV4LCBpbnQgc3JjX2luZGV4KQoreworICAgIE1PVk11eENvbnRleHQgKm1vdiAgPSBzLT5wcml2X2RhdGE7CisgICAgTU9WVHJhY2sgKnRyYWNrICAgICA9ICZtb3YtPnRyYWNrc1tpbmRleF07CisgICAgTU9WVHJhY2sgKnNyY190cmFjayA9ICZtb3YtPnRyYWNrc1tzcmNfaW5kZXhdOworICAgIEFWU3RyZWFtICpzcmNfc3QgICAgPSBzLT5zdHJlYW1zW3NyY19pbmRleF07CisgICAgaW50IHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKworICAgIHRyYWNrLT50YWcgPSBNS1RBRygncicsJ3QnLCdwJywnICcpOworICAgIHRyYWNrLT5zcmNfdHJhY2sgPSBzcmNfaW5kZXg7CisKKyAgICB0cmFjay0+ZW5jID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhOVUxMKTsKKyAgICBpZiAoIXRyYWNrLT5lbmMpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB0cmFjay0+ZW5jLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgdHJhY2stPmVuYy0+Y29kZWNfdGFnICA9IHRyYWNrLT50YWc7CisKKyAgICByZXQgPSBmZl9ydHBfY2hhaW5fbXV4X29wZW4oJnRyYWNrLT5ydHBfY3R4LCBzLCBzcmNfc3QsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUF9NQVhfUEFDS0VUX1NJWkUsIHNyY19pbmRleCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIC8qIENvcHkgdGhlIFJUUCBBVlN0cmVhbSB0aW1lYmFzZSBiYWNrIHRvIHRoZSBoaW50IEFWU3RyZWFtICovCisgICAgdHJhY2stPnRpbWVzY2FsZSA9IHRyYWNrLT5ydHBfY3R4LT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UuZGVuOworCisgICAgLyogTWFyayB0aGUgaGludGVkIHRyYWNrIHRoYXQgcGFja2V0cyB3cml0dGVuIHRvIGl0IHNob3VsZCBiZQorICAgICAqIHNlbnQgdG8gdGhpcyB0cmFjayBmb3IgaGludGluZy4gKi8KKyAgICBzcmNfdHJhY2stPmhpbnRfdHJhY2sgPSBpbmRleDsKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAiVW5hYmxlIHRvIGluaXRpYWxpemUgaGludGluZyBvZiBzdHJlYW0gJWRcbiIsIHNyY19pbmRleCk7CisgICAgYXZfZnJlZXAoJnRyYWNrLT5lbmMpOworICAgIC8qIFNldCBhIGRlZmF1bHQgdGltZXNjYWxlLCB0byBhdm9pZCBjcmFzaGVzIGluIGF2X2R1bXBfZm9ybWF0ICovCisgICAgdHJhY2stPnRpbWVzY2FsZSA9IDkwMDAwOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogUmVtb3ZlIHRoZSBmaXJzdCBzYW1wbGUgZnJvbSB0aGUgc2FtcGxlIHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBzYW1wbGVfcXVldWVfcG9wKEhpbnRTYW1wbGVRdWV1ZSAqcXVldWUpCit7CisgICAgaWYgKHF1ZXVlLT5sZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChxdWV1ZS0+c2FtcGxlc1swXS5vd25fZGF0YSkKKyAgICAgICAgYXZfZnJlZXAoJnF1ZXVlLT5zYW1wbGVzWzBdLmRhdGEpOworICAgIHF1ZXVlLT5sZW4tLTsKKyAgICBtZW1tb3ZlKHF1ZXVlLT5zYW1wbGVzLCBxdWV1ZS0+c2FtcGxlcyArIDEsIHNpemVvZihIaW50U2FtcGxlKSpxdWV1ZS0+bGVuKTsKK30KKworLyoqCisgKiBFbXB0eSB0aGUgc2FtcGxlIHF1ZXVlLCByZWxlYXNpbmcgYWxsIG1lbW9yeS4KKyAqLworc3RhdGljIHZvaWQgc2FtcGxlX3F1ZXVlX2ZyZWUoSGludFNhbXBsZVF1ZXVlICpxdWV1ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUtPmxlbjsgaSsrKQorICAgICAgICBpZiAocXVldWUtPnNhbXBsZXNbaV0ub3duX2RhdGEpCisgICAgICAgICAgICBhdl9mcmVlcCgmcXVldWUtPnNhbXBsZXNbaV0uZGF0YSk7CisgICAgYXZfZnJlZXAoJnF1ZXVlLT5zYW1wbGVzKTsKKyAgICBxdWV1ZS0+bGVuICA9IDA7CisgICAgcXVldWUtPnNpemUgPSAwOworfQorCisvKioKKyAqIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgc2FtcGxlIGRhdGEgdG8gdGhlIHNhbXBsZSBxdWV1ZS4gVGhlIGRhdGEgaXMKKyAqIG5vdCBjb3BpZWQuIHNhbXBsZV9xdWV1ZV9yZXRhaW4gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgcGt0LT5kYXRhCisgKiBpcyByZXVzZWQvZnJlZWQuCisgKi8KK3N0YXRpYyB2b2lkIHNhbXBsZV9xdWV1ZV9wdXNoKEhpbnRTYW1wbGVRdWV1ZSAqcXVldWUsIHVpbnQ4X3QgKmRhdGEsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZSkKK3sKKyAgICAvKiBObyBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygc21hbGxlciBzYW1wbGVzLCBzaW5jZSBkZXNjcmliaW5nIHRoZW0KKyAgICAgKiB3aXRoIGltbWVkaWF0ZXMgaXMgbW9yZSBlZmZpY2llbnQuICovCisgICAgaWYgKHNpemUgPD0gMTQpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIXF1ZXVlLT5zYW1wbGVzIHx8IHF1ZXVlLT5sZW4gPj0gcXVldWUtPnNpemUpIHsKKyAgICAgICAgSGludFNhbXBsZSAqc2FtcGxlczsKKyAgICAgICAgc2FtcGxlcyA9IGF2X3JlYWxsb2NfYXJyYXkocXVldWUtPnNhbXBsZXMsIHF1ZXVlLT5zaXplICsgMTAsIHNpemVvZihIaW50U2FtcGxlKSk7CisgICAgICAgIGlmICghc2FtcGxlcykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcXVldWUtPnNpemUgKz0gMTA7CisgICAgICAgIHF1ZXVlLT5zYW1wbGVzID0gc2FtcGxlczsKKyAgICB9CisgICAgcXVldWUtPnNhbXBsZXNbcXVldWUtPmxlbl0uZGF0YSA9IGRhdGE7CisgICAgcXVldWUtPnNhbXBsZXNbcXVldWUtPmxlbl0uc2l6ZSA9IHNpemU7CisgICAgcXVldWUtPnNhbXBsZXNbcXVldWUtPmxlbl0uc2FtcGxlX251bWJlciA9IHNhbXBsZTsKKyAgICBxdWV1ZS0+c2FtcGxlc1txdWV1ZS0+bGVuXS5vZmZzZXQgICA9IDA7CisgICAgcXVldWUtPnNhbXBsZXNbcXVldWUtPmxlbl0ub3duX2RhdGEgPSAwOworICAgIHF1ZXVlLT5sZW4rKzsKK30KKworLyoqCisgKiBNYWtlIGxvY2FsIGNvcGllcyBvZiBhbGwgcmVmZXJlbmNlZCBzYW1wbGUgZGF0YSBpbiB0aGUgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHNhbXBsZV9xdWV1ZV9yZXRhaW4oSGludFNhbXBsZVF1ZXVlICpxdWV1ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUtPmxlbjsgKSB7CisgICAgICAgIEhpbnRTYW1wbGUgKnNhbXBsZSA9ICZxdWV1ZS0+c2FtcGxlc1tpXTsKKyAgICAgICAgaWYgKCFzYW1wbGUtPm93bl9kYXRhKSB7CisgICAgICAgICAgICB1aW50OF90ICpwdHIgPSBhdl9tYWxsb2Moc2FtcGxlLT5zaXplKTsKKyAgICAgICAgICAgIGlmICghcHRyKSB7CisgICAgICAgICAgICAgICAgLyogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBvbmUsIHJlbW92ZSBpdCAqLworICAgICAgICAgICAgICAgIG1lbW1vdmUocXVldWUtPnNhbXBsZXMgKyBpLCBxdWV1ZS0+c2FtcGxlcyArIGkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhpbnRTYW1wbGUpKihxdWV1ZS0+bGVuIC0gaSAtIDEpKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+bGVuLS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkocHRyLCBzYW1wbGUtPmRhdGEsIHNhbXBsZS0+c2l6ZSk7CisgICAgICAgICAgICBzYW1wbGUtPmRhdGEgPSBwdHI7CisgICAgICAgICAgICBzYW1wbGUtPm93bl9kYXRhID0gMTsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorfQorCisvKioKKyAqIEZpbmQgbWF0Y2hlcyBvZiBuZWVkbGVbbl9wb3MgLT5dIHdpdGhpbiBoYXlzdGFjay4gSWYgYSBzdWZmaWNpZW50bHkKKyAqIGxhcmdlIG1hdGNoIGlzIGZvdW5kLCBtYXRjaGluZyBieXRlcyBiZWZvcmUgbl9wb3MgYXJlIGluY2x1ZGVkCisgKiBpbiB0aGUgbWF0Y2gsIHRvbyAod2l0aGluIHRoZSBsaW1pdHMgb2YgdGhlIGFycmF5cykuCisgKgorICogQHBhcmFtIGhheXN0YWNrIGJ1ZmZlciB0aGF0IG1heSBjb250YWluIHBhcnRzIG9mIG5lZWRsZQorICogQHBhcmFtIGhfbGVuIGxlbmd0aCBvZiB0aGUgaGF5c3RhY2sgYnVmZmVyCisgKiBAcGFyYW0gbmVlZGxlIGJ1ZmZlciBjb250YWluaW5nIHNvdXJjZSBkYXRhIHRoYXQgaGF2ZSBiZWVuIHVzZWQgdG8KKyAqICAgICAgICAgICAgICAgY29uc3RydWN0IGhheXN0YWNrCisgKiBAcGFyYW0gbl9wb3Mgc3RhcnQgcG9zaXRpb24gaW4gbmVlZGxlIHVzZWQgZm9yIGxvb2tpbmcgZm9yIG1hdGNoZXMKKyAqIEBwYXJhbSBuX2xlbiBsZW5ndGggb2YgdGhlIG5lZWRsZSBidWZmZXIKKyAqIEBwYXJhbSBtYXRjaF9oX29mZnNldF9wdHIgb2Zmc2V0IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBieXRlIHdpdGhpbiBoYXlzdGFjaworICogQHBhcmFtIG1hdGNoX25fb2Zmc2V0X3B0ciBvZmZzZXQgb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGJ5dGUgd2l0aGluIG5lZWRsZQorICogQHBhcmFtIG1hdGNoX2xlbl9wdHIgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHNlZ21lbnQKKyAqIEByZXR1cm4gMCBpZiBhIG1hdGNoIHdhcyBmb3VuZCwgPCAwIGlmIG5vIG1hdGNoIHdhcyBmb3VuZAorICovCitzdGF0aWMgaW50IG1hdGNoX3NlZ21lbnRzKGNvbnN0IHVpbnQ4X3QgKmhheXN0YWNrLCBpbnQgaF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm5lZWRsZSwgaW50IG5fcG9zLCBpbnQgbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbWF0Y2hfaF9vZmZzZXRfcHRyLCBpbnQgKm1hdGNoX25fb2Zmc2V0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICptYXRjaF9sZW5fcHRyKQoreworICAgIGludCBoX3BvczsKKyAgICBmb3IgKGhfcG9zID0gMDsgaF9wb3MgPCBoX2xlbjsgaF9wb3MrKykgeworICAgICAgICBpbnQgbWF0Y2hfbGVuID0gMDsKKyAgICAgICAgaW50IG1hdGNoX2hfcG9zLCBtYXRjaF9uX3BvczsKKworICAgICAgICAvKiBDaGVjayBob3cgbWFueSBieXRlcyBtYXRjaCBhdCBuZWVkbGVbbl9wb3NdIGFuZCBoYXlzdGFja1toX3Bvc10gKi8KKyAgICAgICAgd2hpbGUgKGhfcG9zICsgbWF0Y2hfbGVuIDwgaF9sZW4gJiYgbl9wb3MgKyBtYXRjaF9sZW4gPCBuX2xlbiAmJgorICAgICAgICAgICAgICAgbmVlZGxlW25fcG9zICsgbWF0Y2hfbGVuXSA9PSBoYXlzdGFja1toX3BvcyArIG1hdGNoX2xlbl0pCisgICAgICAgICAgICBtYXRjaF9sZW4rKzsKKyAgICAgICAgaWYgKG1hdGNoX2xlbiA8PSA4KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogSWYgYSBzdWZmaWNpZW50bHkgbGFyZ2UgbWF0Y2ggd2FzIGZvdW5kLCB0cnkgdG8gZXhwYW5kCisgICAgICAgICAqIHRoZSBtYXRjaGVkIHNlZ21lbnQgYmFja3dhcmRzLiAqLworICAgICAgICBtYXRjaF9oX3BvcyA9IGhfcG9zOworICAgICAgICBtYXRjaF9uX3BvcyA9IG5fcG9zOworICAgICAgICB3aGlsZSAobWF0Y2hfbl9wb3MgPiAwICYmIG1hdGNoX2hfcG9zID4gMCAmJgorICAgICAgICAgICAgICAgbmVlZGxlW21hdGNoX25fcG9zIC0gMV0gPT0gaGF5c3RhY2tbbWF0Y2hfaF9wb3MgLSAxXSkgeworICAgICAgICAgICAgbWF0Y2hfbl9wb3MtLTsKKyAgICAgICAgICAgIG1hdGNoX2hfcG9zLS07CisgICAgICAgICAgICBtYXRjaF9sZW4rKzsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF0Y2hfbGVuIDw9IDE0KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICptYXRjaF9oX29mZnNldF9wdHIgPSBtYXRjaF9oX3BvczsKKyAgICAgICAgKm1hdGNoX25fb2Zmc2V0X3B0ciA9IG1hdGNoX25fcG9zOworICAgICAgICAqbWF0Y2hfbGVuX3B0ciA9IG1hdGNoX2xlbjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLyoqCisgKiBMb29rIGZvciBzZWdtZW50cyBpbiBzYW1wbGVzIGluIHRoZSBzYW1wbGUgcXVldWUgbWF0Y2hpbmcgdGhlIGRhdGEKKyAqIGluIHB0ci4gU2FtcGxlcyBub3QgbWF0Y2hpbmcgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUuIElmIGEgbWF0Y2gKKyAqIGlzIGZvdW5kLCB0aGUgbmV4dCB0aW1lIGl0IHdpbGwgbG9vayBmb3IgbWF0Y2hlcyBzdGFydGluZyBmcm9tIHRoZQorICogZW5kIG9mIHRoZSBwcmV2aW91cyBtYXRjaGVkIHNlZ21lbnQuCisgKgorICogQHBhcmFtIGRhdGEgZGF0YSB0byBmaW5kIG1hdGNoZXMgZm9yIGluIHRoZSBzYW1wbGUgcXVldWUKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHRoZSBkYXRhIGJ1ZmZlcgorICogQHBhcmFtIHF1ZXVlIHNhbXBsZXMgdXNlZCBmb3IgbG9va2luZyBmb3IgbWF0Y2hpbmcgc2VnbWVudHMKKyAqIEBwYXJhbSBwb3MgdGhlIG9mZnNldCBpbiBkYXRhIG9mIHRoZSBtYXRjaGVkIHNlZ21lbnQKKyAqIEBwYXJhbSBtYXRjaF9zYW1wbGUgdGhlIG51bWJlciBvZiB0aGUgc2FtcGxlIHRoYXQgY29udGFpbmVkIHRoZSBtYXRjaAorICogQHBhcmFtIG1hdGNoX29mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSBtYXRjaGVkIHNlZ21lbnQgd2l0aGluIHRoZSBzYW1wbGUKKyAqIEBwYXJhbSBtYXRjaF9sZW4gdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCBzZWdtZW50CisgKiBAcmV0dXJuIDAgaWYgYSBtYXRjaCB3YXMgZm91bmQsIDwgMCBpZiBubyBtYXRjaCB3YXMgZm91bmQKKyAqLworc3RhdGljIGludCBmaW5kX3NhbXBsZV9tYXRjaChjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaW50U2FtcGxlUXVldWUgKnF1ZXVlLCBpbnQgKnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICptYXRjaF9zYW1wbGUsIGludCAqbWF0Y2hfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm1hdGNoX2xlbikKK3sKKyAgICB3aGlsZSAocXVldWUtPmxlbiA+IDApIHsKKyAgICAgICAgSGludFNhbXBsZSAqc2FtcGxlID0gJnF1ZXVlLT5zYW1wbGVzWzBdOworICAgICAgICAvKiBJZiBsb29raW5nIGZvciBtYXRjaGVzIGluIGEgbmV3IHNhbXBsZSwgc2tpcCB0aGUgZmlyc3QgNSBieXRlcywKKyAgICAgICAgICogc2luY2UgdGhleSBvZnRlbiBtYXkgYmUgbW9kaWZpZWQvcmVtb3ZlZCBpbiB0aGUgb3V0cHV0IHBhY2tldC4gKi8KKyAgICAgICAgaWYgKHNhbXBsZS0+b2Zmc2V0ID09IDAgJiYgc2FtcGxlLT5zaXplID4gNSkKKyAgICAgICAgICAgIHNhbXBsZS0+b2Zmc2V0ID0gNTsKKworICAgICAgICBpZiAobWF0Y2hfc2VnbWVudHMoZGF0YSwgbGVuLCBzYW1wbGUtPmRhdGEsIHNhbXBsZS0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLT5zaXplLCBwb3MsIG1hdGNoX29mZnNldCwgbWF0Y2hfbGVuKSA9PSAwKSB7CisgICAgICAgICAgICAqbWF0Y2hfc2FtcGxlID0gc2FtcGxlLT5zYW1wbGVfbnVtYmVyOworICAgICAgICAgICAgLyogTmV4dCB0aW1lLCBsb29rIGZvciBtYXRjaGVzIGF0IHRoaXMgb2Zmc2V0LCB3aXRoIGEgbGl0dGxlCisgICAgICAgICAgICAgKiBtYXJnaW4gdG8gdGhpcyBtYXRjaC4gKi8KKyAgICAgICAgICAgIHNhbXBsZS0+b2Zmc2V0ID0gKm1hdGNoX29mZnNldCArICptYXRjaF9sZW4gKyA1OworICAgICAgICAgICAgaWYgKHNhbXBsZS0+b2Zmc2V0ICsgMTAgPj0gc2FtcGxlLT5zaXplKQorICAgICAgICAgICAgICAgIHNhbXBsZV9xdWV1ZV9wb3AocXVldWUpOyAvKiBOb3QgZW5vdWdoIHVzZWZ1bCBkYXRhIGxlZnQgKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNhbXBsZS0+b2Zmc2V0IDwgMTAgJiYgc2FtcGxlLT5zaXplID4gMjApIHsKKyAgICAgICAgICAgIC8qIE5vIG1hdGNoIGZvdW5kIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzYW1wbGUsCisgICAgICAgICAgICAgKiB0cnkgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSBzYW1wbGUgaW5zdGVhZC4gKi8KKyAgICAgICAgICAgIHNhbXBsZS0+b2Zmc2V0ID0gc2FtcGxlLT5zaXplLzI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBObyBtYXRjaCBmb3IgdGhpcyBzYW1wbGUsIHJlbW92ZSBpdCAqLworICAgICAgICAgICAgc2FtcGxlX3F1ZXVlX3BvcChxdWV1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBvdXRwdXRfaW1tZWRpYXRlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVklPQ29udGV4dCAqb3V0LCBpbnQgKmVudHJpZXMpCit7CisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGludCBsZW4gPSBzaXplOworICAgICAgICBpZiAobGVuID4gMTQpCisgICAgICAgICAgICBsZW4gPSAxNDsKKyAgICAgICAgYXZpb193OChvdXQsIDEpOyAvKiBpbW1lZGlhdGUgY29uc3RydWN0b3IgKi8KKyAgICAgICAgYXZpb193OChvdXQsIGxlbik7IC8qIGFtb3VudCBvZiB2YWxpZCBkYXRhICovCisgICAgICAgIGF2aW9fd3JpdGUob3V0LCBkYXRhLCBsZW4pOworICAgICAgICBkYXRhICs9IGxlbjsKKyAgICAgICAgc2l6ZSAtPSBsZW47CisKKyAgICAgICAgZm9yICg7IGxlbiA8IDE0OyBsZW4rKykKKyAgICAgICAgICAgIGF2aW9fdzgob3V0LCAwKTsKKworICAgICAgICAoKmVudHJpZXMpKys7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBvdXRwdXRfbWF0Y2goQVZJT0NvbnRleHQgKm91dCwgaW50IG1hdGNoX3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF0Y2hfb2Zmc2V0LCBpbnQgbWF0Y2hfbGVuLCBpbnQgKmVudHJpZXMpCit7CisgICAgYXZpb193OChvdXQsIDIpOyAvKiBzYW1wbGUgY29uc3RydWN0b3IgKi8KKyAgICBhdmlvX3c4KG91dCwgMCk7IC8qIHRyYWNrIHJlZmVyZW5jZSAqLworICAgIGF2aW9fd2IxNihvdXQsIG1hdGNoX2xlbik7CisgICAgYXZpb193YjMyKG91dCwgbWF0Y2hfc2FtcGxlKTsKKyAgICBhdmlvX3diMzIob3V0LCBtYXRjaF9vZmZzZXQpOworICAgIGF2aW9fd2IxNihvdXQsIDEpOyAvKiBieXRlcyBwZXIgYmxvY2sgKi8KKyAgICBhdmlvX3diMTYob3V0LCAxKTsgLyogc2FtcGxlcyBwZXIgYmxvY2sgKi8KKyAgICAoKmVudHJpZXMpKys7Cit9CisKK3N0YXRpYyB2b2lkIGRlc2NyaWJlX3BheWxvYWQoY29uc3QgdWludDhfdCAqZGF0YSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSU9Db250ZXh0ICpvdXQsIGludCAqZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGludFNhbXBsZVF1ZXVlICpxdWV1ZSkKK3sKKyAgICAvKiBEZXNjcmliZSB0aGUgcGF5bG9hZCB1c2luZyBkaWZmZXJlbnQgY29uc3RydWN0b3JzICovCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGludCBtYXRjaF9zYW1wbGUsIG1hdGNoX29mZnNldCwgbWF0Y2hfbGVuLCBwb3M7CisgICAgICAgIGlmIChmaW5kX3NhbXBsZV9tYXRjaChkYXRhLCBzaXplLCBxdWV1ZSwgJnBvcywgJm1hdGNoX3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXRjaF9vZmZzZXQsICZtYXRjaF9sZW4pIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBvdXRwdXRfaW1tZWRpYXRlKGRhdGEsIHBvcywgb3V0LCBlbnRyaWVzKTsKKyAgICAgICAgZGF0YSArPSBwb3M7CisgICAgICAgIHNpemUgLT0gcG9zOworICAgICAgICBvdXRwdXRfbWF0Y2gob3V0LCBtYXRjaF9zYW1wbGUsIG1hdGNoX29mZnNldCwgbWF0Y2hfbGVuLCBlbnRyaWVzKTsKKyAgICAgICAgZGF0YSArPSBtYXRjaF9sZW47CisgICAgICAgIHNpemUgLT0gbWF0Y2hfbGVuOworICAgIH0KKyAgICBvdXRwdXRfaW1tZWRpYXRlKGRhdGEsIHNpemUsIG91dCwgZW50cmllcyk7Cit9CisKKy8qKgorICogV3JpdGUgYW4gUlRQIGhpbnQgKHRoYXQgbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUgUlRQIHBhY2tldHMpCisgKiBmb3IgdGhlIHBhY2tldHMgaW4gZGF0YS4gZGF0YSBjb250YWlucyBvbmUgb3IgbW9yZSBwYWNrZXRzIHdpdGggYQorICogQkUzMiBzaXplIGhlYWRlci4KKyAqCisgKiBAcGFyYW0gb3V0IGJ1ZmZlciB3aGVyZSB0aGUgaGludHMgYXJlIHdyaXR0ZW4KKyAqIEBwYXJhbSBkYXRhIGJ1ZmZlciBjb250YWluaW5nIFJUUCBwYWNrZXRzCisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIKKyAqIEBwYXJhbSB0cmsgdGhlIE1PVlRyYWNrIGZvciB0aGUgaGludCB0cmFjaworICogQHBhcmFtIGR0cyBwb2ludGVyIHdoZXJlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSB3cml0dGVuIFJUUCBoaW50IGlzIHN0b3JlZAorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIFJUUCBwYWNrZXRzIGluIHRoZSB3cml0dGVuIGhpbnQKKyAqLworc3RhdGljIGludCB3cml0ZV9oaW50X3BhY2tldHMoQVZJT0NvbnRleHQgKm91dCwgY29uc3QgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBNT1ZUcmFjayAqdHJrLCBpbnQ2NF90ICpkdHMpCit7CisgICAgaW50NjRfdCBjdXJwb3M7CisgICAgaW50NjRfdCBjb3VudF9wb3MsIGVudHJpZXNfcG9zOworICAgIGludCBjb3VudCA9IDAsIGVudHJpZXM7CisKKyAgICBjb3VudF9wb3MgPSBhdmlvX3RlbGwob3V0KTsKKyAgICAvKiBSVFBzYW1wbGUgaGVhZGVyICovCisgICAgYXZpb193YjE2KG91dCwgMCk7IC8qIHBhY2tldCBjb3VudCAqLworICAgIGF2aW9fd2IxNihvdXQsIDApOyAvKiByZXNlcnZlZCAqLworCisgICAgd2hpbGUgKHNpemUgPiA0KSB7CisgICAgICAgIHVpbnQzMl90IHBhY2tldF9sZW4gPSBBVl9SQjMyKGRhdGEpOworICAgICAgICB1aW50MTZfdCBzZXE7CisgICAgICAgIHVpbnQzMl90IHRzOworICAgICAgICBpbnQzMl90ICB0c19kaWZmOworCisgICAgICAgIGRhdGEgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSA0OworICAgICAgICBpZiAocGFja2V0X2xlbiA+IHNpemUgfHwgcGFja2V0X2xlbiA8PSAxMikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoUlRQX1BUX0lTX1JUQ1AoZGF0YVsxXSkpIHsKKyAgICAgICAgICAgIC8qIFJUQ1AgcGFja2V0LCBqdXN0IHNraXAgKi8KKyAgICAgICAgICAgIGRhdGEgKz0gcGFja2V0X2xlbjsKKyAgICAgICAgICAgIHNpemUgLT0gcGFja2V0X2xlbjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhY2tldF9sZW4gPiB0cmstPm1heF9wYWNrZXRfc2l6ZSkKKyAgICAgICAgICAgIHRyay0+bWF4X3BhY2tldF9zaXplID0gcGFja2V0X2xlbjsKKworICAgICAgICBzZXEgPSBBVl9SQjE2KCZkYXRhWzJdKTsKKyAgICAgICAgdHMgID0gQVZfUkIzMigmZGF0YVs0XSk7CisKKyAgICAgICAgaWYgKHRyay0+cHJldl9ydHBfdHMgPT0gMCkKKyAgICAgICAgICAgIHRyay0+cHJldl9ydHBfdHMgPSB0czsKKyAgICAgICAgLyogVW53cmFwIHRoZSAzMi1iaXQgUlRQIHRpbWVzdGFtcCB0aGF0IHdyYXBzIGFyb3VuZCBvZnRlbgorICAgICAgICAgKiBpbnRvIGEgbm90IChhcyBvZnRlbikgd3JhcHBpbmcgNjQtYml0IHRpbWVzdGFtcC4gKi8KKyAgICAgICAgdHNfZGlmZiA9IHRzIC0gdHJrLT5wcmV2X3J0cF90czsKKyAgICAgICAgaWYgKHRzX2RpZmYgPiAwKSB7CisgICAgICAgICAgICB0cmstPmN1cl9ydHBfdHNfdW53cmFwcGVkICs9IHRzX2RpZmY7CisgICAgICAgICAgICB0cmstPnByZXZfcnRwX3RzID0gdHM7CisgICAgICAgICAgICB0c19kaWZmID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKmR0cyA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgICpkdHMgPSB0cmstPmN1cl9ydHBfdHNfdW53cmFwcGVkOworCisgICAgICAgIGNvdW50Kys7CisgICAgICAgIC8qIFJUUHBhY2tldCBoZWFkZXIgKi8KKyAgICAgICAgYXZpb193YjMyKG91dCwgMCk7IC8qIHJlbGF0aXZlX3RpbWUgKi8KKyAgICAgICAgYXZpb193cml0ZShvdXQsIGRhdGEsIDIpOyAvKiBSVFAgaGVhZGVyICovCisgICAgICAgIGF2aW9fd2IxNihvdXQsIHNlcSk7IC8qIFJUUHNlcXVlbmNlc2VlZCAqLworICAgICAgICBhdmlvX3diMTYob3V0LCB0c19kaWZmID8gNCA6IDApOyAvKiByZXNlcnZlZCArIGZsYWdzIChleHRyYV9mbGFnKSAqLworICAgICAgICBlbnRyaWVzX3BvcyA9IGF2aW9fdGVsbChvdXQpOworICAgICAgICBhdmlvX3diMTYob3V0LCAwKTsgLyogZW50cnkgY291bnQgKi8KKyAgICAgICAgaWYgKHRzX2RpZmYpIHsgLyogaWYgZXh0cmFfZmxhZyBpcyBzZXQgKi8KKyAgICAgICAgICAgIGF2aW9fd2IzMihvdXQsIDE2KTsgLyogZXh0cmFfaW5mb3JtYXRpb25fbGVuZ3RoICovCisgICAgICAgICAgICBhdmlvX3diMzIob3V0LCAxMik7IC8qIHJ0cG9mZnNldFRMViBib3ggKi8KKyAgICAgICAgICAgIGF2aW9fd3JpdGUob3V0LCAicnRwbyIsIDQpOworICAgICAgICAgICAgYXZpb193YjMyKG91dCwgdHNfZGlmZik7CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IDEyOworICAgICAgICBzaXplIC09IDEyOworICAgICAgICBwYWNrZXRfbGVuIC09IDEyOworCisgICAgICAgIGVudHJpZXMgPSAwOworICAgICAgICAvKiBXcml0ZSBvbmUgb3IgbW9yZSBjb25zdHJ1Y3RvcnMgZGVzY3JpYmluZyB0aGUgcGF5bG9hZCBkYXRhICovCisgICAgICAgIGRlc2NyaWJlX3BheWxvYWQoZGF0YSwgcGFja2V0X2xlbiwgb3V0LCAmZW50cmllcywgJnRyay0+c2FtcGxlX3F1ZXVlKTsKKyAgICAgICAgZGF0YSArPSBwYWNrZXRfbGVuOworICAgICAgICBzaXplIC09IHBhY2tldF9sZW47CisKKyAgICAgICAgY3VycG9zID0gYXZpb190ZWxsKG91dCk7CisgICAgICAgIGF2aW9fc2VlayhvdXQsIGVudHJpZXNfcG9zLCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fd2IxNihvdXQsIGVudHJpZXMpOworICAgICAgICBhdmlvX3NlZWsob3V0LCBjdXJwb3MsIFNFRUtfU0VUKTsKKyAgICB9CisKKyAgICBjdXJwb3MgPSBhdmlvX3RlbGwob3V0KTsKKyAgICBhdmlvX3NlZWsob3V0LCBjb3VudF9wb3MsIFNFRUtfU0VUKTsKKyAgICBhdmlvX3diMTYob3V0LCBjb3VudCk7CisgICAgYXZpb19zZWVrKG91dCwgY3VycG9zLCBTRUVLX1NFVCk7CisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgZmZfbW92X2FkZF9oaW50ZWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYWNrX2luZGV4LCBpbnQgc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzYW1wbGVfZGF0YSwgaW50IHNhbXBsZV9zaXplKQoreworICAgIE1PVk11eENvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKKyAgICBNT1ZUcmFjayAqdHJrID0gJm1vdi0+dHJhY2tzW3RyYWNrX2luZGV4XTsKKyAgICBBVkZvcm1hdENvbnRleHQgKnJ0cF9jdHggPSB0cmstPnJ0cF9jdHg7CisgICAgdWludDhfdCAqYnVmID0gTlVMTDsKKyAgICBpbnQgc2l6ZTsKKyAgICBBVklPQ29udGV4dCAqaGludGJ1ZiA9IE5VTEw7CisgICAgQVZQYWNrZXQgaGludF9wa3Q7CisgICAgaW50IHJldCA9IDAsIGNvdW50OworCisgICAgaWYgKCFydHBfY3R4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9FTlQpOworICAgIGlmICghcnRwX2N0eC0+cGIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoc2FtcGxlX2RhdGEpCisgICAgICAgIHNhbXBsZV9xdWV1ZV9wdXNoKCZ0cmstPnNhbXBsZV9xdWV1ZSwgc2FtcGxlX2RhdGEsIHNhbXBsZV9zaXplLCBzYW1wbGUpOworICAgIGVsc2UKKyAgICAgICAgc2FtcGxlX3F1ZXVlX3B1c2goJnRyay0+c2FtcGxlX3F1ZXVlLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwgc2FtcGxlKTsKKworICAgIC8qIEZlZWQgdGhlIHBhY2tldCB0byB0aGUgUlRQIG11eGVyICovCisgICAgZmZfd3JpdGVfY2hhaW5lZChydHBfY3R4LCAwLCBwa3QsIHMsIDApOworCisgICAgLyogRmV0Y2ggdGhlIG91dHB1dCBmcm9tIHRoZSBSVFAgbXV4ZXIsIG9wZW4gYSBuZXcgb3V0cHV0IGJ1ZmZlcgorICAgICAqIGZvciBuZXh0IHRpbWUuICovCisgICAgc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1ZihydHBfY3R4LT5wYiwgJmJ1Zik7CisgICAgaWYgKChyZXQgPSBmZmlvX29wZW5fZHluX3BhY2tldF9idWYoJnJ0cF9jdHgtPnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUF9NQVhfUEFDS0VUX1NJWkUpKSA8IDApCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgIGlmIChzaXplIDw9IDApCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgIC8qIE9wZW4gYSBidWZmZXIgZm9yIHdyaXRpbmcgdGhlIGhpbnQgKi8KKyAgICBpZiAoKHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZoaW50YnVmKSkgPCAwKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgYXZfaW5pdF9wYWNrZXQoJmhpbnRfcGt0KTsKKyAgICBjb3VudCA9IHdyaXRlX2hpbnRfcGFja2V0cyhoaW50YnVmLCBidWYsIHNpemUsIHRyaywgJmhpbnRfcGt0LmR0cyk7CisgICAgYXZfZnJlZXAoJmJ1Zik7CisKKyAgICAvKiBXcml0ZSB0aGUgaGludCBkYXRhIGludG8gdGhlIGhpbnQgdHJhY2sgKi8KKyAgICBoaW50X3BrdC5zaXplID0gc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1ZihoaW50YnVmLCAmYnVmKTsKKyAgICBoaW50X3BrdC5kYXRhID0gYnVmOworICAgIGhpbnRfcGt0LnB0cyAgPSBoaW50X3BrdC5kdHM7CisgICAgaGludF9wa3Quc3RyZWFtX2luZGV4ID0gdHJhY2tfaW5kZXg7CisgICAgaWYgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpCisgICAgICAgIGhpbnRfcGt0LmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICBpZiAoY291bnQgPiAwKQorICAgICAgICBmZl9tb3Zfd3JpdGVfcGFja2V0KHMsICZoaW50X3BrdCk7Citkb25lOgorICAgIGF2X2ZyZWUoYnVmKTsKKyAgICBzYW1wbGVfcXVldWVfcmV0YWluKCZ0cmstPnNhbXBsZV9xdWV1ZSk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBmZl9tb3ZfY2xvc2VfaGludGluZyhNT1ZUcmFjayAqdHJhY2spCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpydHBfY3R4ID0gdHJhY2stPnJ0cF9jdHg7CisgICAgdWludDhfdCAqcHRyOworCisgICAgYXZfZnJlZXAoJnRyYWNrLT5lbmMpOworICAgIHNhbXBsZV9xdWV1ZV9mcmVlKCZ0cmFjay0+c2FtcGxlX3F1ZXVlKTsKKyAgICBpZiAoIXJ0cF9jdHgpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAocnRwX2N0eC0+cGIpIHsKKyAgICAgICAgYXZfd3JpdGVfdHJhaWxlcihydHBfY3R4KTsKKyAgICAgICAgYXZpb19jbG9zZV9keW5fYnVmKHJ0cF9jdHgtPnBiLCAmcHRyKTsKKyAgICAgICAgYXZfZnJlZShwdHIpOworICAgIH0KKyAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQocnRwX2N0eCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbXAzZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbXAzZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjMWJiNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tcDNkZWMuYwpAQCAtMCwwICsxLDUxNCBAQAorLyoKKyAqIE1QMyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaWQzdjIuaCIKKyNpbmNsdWRlICJpZDN2MS5oIgorI2luY2x1ZGUgInJlcGxheWdhaW4uaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjaGVhZGVyLmgiCisKKyNkZWZpbmUgWElOR19GTEFHX0ZSQU1FUyAweDAxCisjZGVmaW5lIFhJTkdfRkxBR19TSVpFICAgMHgwMgorI2RlZmluZSBYSU5HX0ZMQUdfVE9DICAgIDB4MDQKKyNkZWZpbmUgWElOR19GTEFDX1FTQ0FMRSAweDA4CisKKyNkZWZpbmUgWElOR19UT0NfQ09VTlQgMTAwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQ2NF90IGZpbGVzaXplOworICAgIGludCB4aW5nX3RvYzsKKyAgICBpbnQgc3RhcnRfcGFkOworICAgIGludCBlbmRfcGFkOworICAgIGludCB1c2V0b2M7CisgICAgdW5zaWduZWQgZnJhbWVzOyAvKiBUb3RhbCBudW1iZXIgb2YgZnJhbWVzIGluIGZpbGUgKi8KKyAgICB1bnNpZ25lZCBoZWFkZXJfZmlsZXNpemU7ICAgLyogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJlYW0gKi8KKyAgICBpbnQgaXNfY2JyOworfSBNUDNEZWNDb250ZXh0OworCisvKiBtcDMgcmVhZCAqLworCitzdGF0aWMgaW50IG1wM19yZWFkX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGludCBtYXhfZnJhbWVzLCBmaXJzdF9mcmFtZXMgPSAwOworICAgIGludCBmc2l6ZSwgZnJhbWVzLCBzYW1wbGVfcmF0ZTsKKyAgICB1aW50MzJfdCBoZWFkZXI7CisgICAgY29uc3QgdWludDhfdCAqYnVmLCAqYnVmMCwgKmJ1ZjIsICplbmQ7CisgICAgQVZDb2RlY0NvbnRleHQgYXZjdHg7CisKKyAgICBidWYwID0gcC0+YnVmOworICAgIGVuZCA9IHAtPmJ1ZiArIHAtPmJ1Zl9zaXplIC0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICB3aGlsZShidWYwIDwgZW5kICYmICEqYnVmMCkKKyAgICAgICAgYnVmMCsrOworCisgICAgbWF4X2ZyYW1lcyA9IDA7CisgICAgYnVmID0gYnVmMDsKKworICAgIGZvcig7IGJ1ZiA8IGVuZDsgYnVmPSBidWYyKzEpIHsKKyAgICAgICAgYnVmMiA9IGJ1ZjsKKyAgICAgICAgaWYoZmZfbXBhX2NoZWNrX2hlYWRlcihBVl9SQjMyKGJ1ZjIpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvcihmcmFtZXMgPSAwOyBidWYyIDwgZW5kOyBmcmFtZXMrKykgeworICAgICAgICAgICAgaGVhZGVyID0gQVZfUkIzMihidWYyKTsKKyAgICAgICAgICAgIGZzaXplID0gYXZwcml2X21wYV9kZWNvZGVfaGVhZGVyKCZhdmN0eCwgaGVhZGVyLCAmc2FtcGxlX3JhdGUsICZzYW1wbGVfcmF0ZSwgJnNhbXBsZV9yYXRlLCAmc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgaWYoZnNpemUgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYnVmMiArPSBmc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBtYXhfZnJhbWVzID0gRkZNQVgobWF4X2ZyYW1lcywgZnJhbWVzKTsKKyAgICAgICAgaWYoYnVmID09IGJ1ZjApCisgICAgICAgICAgICBmaXJzdF9mcmFtZXM9IGZyYW1lczsKKyAgICB9CisgICAgLy8ga2VlcCB0aGlzIGluIHN5bmMgd2l0aCBhYzMgcHJvYmUsIGJvdGggbmVlZCB0byBhdm9pZAorICAgIC8vIGlzc3VlcyB3aXRoIE1QRUctZmlsZXMhCisgICAgaWYgICAoZmlyc3RfZnJhbWVzPj00KSByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAxOworICAgIGVsc2UgaWYobWF4X2ZyYW1lcz4yMDApcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworICAgIGVsc2UgaWYobWF4X2ZyYW1lcz49NCAmJiBtYXhfZnJhbWVzID49IHAtPmJ1Zl9zaXplLzEwMDAwKSByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLyAyOworICAgIGVsc2UgaWYoZmZfaWQzdjJfbWF0Y2goYnVmMCwgSUQzdjJfREVGQVVMVF9NQUdJQykgJiYgMipmZl9pZDN2Ml90YWdfbGVuKGJ1ZjApID49IHAtPmJ1Zl9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAtPmJ1Zl9zaXplIDwgUFJPQkVfQlVGX01BWCA/IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIC8gNCA6IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIC0gMjsKKyAgICBlbHNlIGlmKG1heF9mcmFtZXM+PTEgJiYgbWF4X2ZyYW1lcyA+PSBwLT5idWZfc2l6ZS8xMDAwMCkgcmV0dXJuIDE7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKy8vbXBlZ3BzX21wM191bnJlY29nbml6ZWRfZm9ybWF0Lm1wZyBoYXMgbWF4X2ZyYW1lcz0zCit9CisKK3N0YXRpYyB2b2lkIHJlYWRfeGluZ190b2MoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IGZpbGVzaXplLCBpbnQ2NF90IGR1cmF0aW9uKQoreworICAgIGludCBpOworICAgIE1QM0RlY0NvbnRleHQgKm1wMyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgZmlsbF9pbmRleCA9IG1wMy0+dXNldG9jICYmIGR1cmF0aW9uID4gMDsKKworICAgIGlmICghZmlsZXNpemUgJiYKKyAgICAgICAgIShmaWxlc2l6ZSA9IGF2aW9fc2l6ZShzLT5wYikpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkNhbm5vdCBkZXRlcm1pbmUgZmlsZSBzaXplLCBza2lwcGluZyBUT0MgdGFibGUuXG4iKTsKKyAgICAgICAgZmlsbF9pbmRleCA9IDA7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IFhJTkdfVE9DX0NPVU5UOyBpKyspIHsKKyAgICAgICAgdWludDhfdCBiID0gYXZpb19yOChzLT5wYik7CisgICAgICAgIGlmIChmaWxsX2luZGV4KQorICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHMtPnN0cmVhbXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlKGIsIGZpbGVzaXplLCAyNTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZShpLCBkdXJhdGlvbiwgWElOR19UT0NfQ09VTlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgfQorICAgIGlmIChmaWxsX2luZGV4KQorICAgICAgICBtcDMtPnhpbmdfdG9jID0gMTsKK30KKworc3RhdGljIHZvaWQgbXAzX3BhcnNlX2luZm9fdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QQURlY29kZUhlYWRlciAqYywgdWludDMyX3Qgc3BmKQoreworI2RlZmluZSBMQVNUX0JJVFMoaywgbikgKChrKSAmICgoMSA8PCAobikpIC0gMSkpCisjZGVmaW5lIE1JRERMRV9CSVRTKGssIG0sIG4pIExBU1RfQklUUygoaykgPj4gKG0pLCAoKG4pIC0gKG0pKSkKKworICAgIHVpbnQxNl90IGNyYzsKKyAgICB1aW50MzJfdCB2OworCisgICAgY2hhciB2ZXJzaW9uWzEwXTsKKworICAgIHVpbnQzMl90IHBlYWsgICA9IDA7CisgICAgaW50MzJfdCAgcl9nYWluID0gSU5UMzJfTUlOLCBhX2dhaW4gPSBJTlQzMl9NSU47CisKKyAgICBNUDNEZWNDb250ZXh0ICptcDMgPSBzLT5wcml2X2RhdGE7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgeGluZ19vZmZ0YmxbMl1bMl0gPSB7ezMyLCAxN30sIHsxNyw5fX07CisgICAgdWludDY0X3QgZnNpemUgPSBhdmlvX3NpemUocy0+cGIpOworCisgICAgLyogQ2hlY2sgZm9yIFhpbmcgLyBJbmZvIHRhZyAqLworICAgIGF2aW9fc2tpcChzLT5wYiwgeGluZ19vZmZ0YmxbYy0+bHNmID09IDFdW2MtPm5iX2NoYW5uZWxzID09IDFdKTsKKyAgICB2ID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBtcDMtPmlzX2NiciA9IHYgPT0gTUtCRVRBRygnSScsICduJywgJ2YnLCAnbycpOworICAgIGlmICh2ICE9IE1LQkVUQUcoJ1gnLCAnaScsICduJywgJ2cnKSAmJiAhbXAzLT5pc19jYnIpCisgICAgICAgIHJldHVybjsKKworICAgIHYgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGlmICh2ICYgWElOR19GTEFHX0ZSQU1FUykKKyAgICAgICAgbXAzLT5mcmFtZXMgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGlmICh2ICYgWElOR19GTEFHX1NJWkUpCisgICAgICAgIG1wMy0+aGVhZGVyX2ZpbGVzaXplID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBpZiAoZnNpemUgJiYgbXAzLT5oZWFkZXJfZmlsZXNpemUpIHsKKyAgICAgICAgdWludDY0X3QgbWluLCBkZWx0YTsKKyAgICAgICAgbWluID0gRkZNSU4oZnNpemUsIG1wMy0+aGVhZGVyX2ZpbGVzaXplKTsKKyAgICAgICAgZGVsdGEgPSBGRk1BWChmc2l6ZSwgbXAzLT5oZWFkZXJfZmlsZXNpemUpIC0gbWluOworICAgICAgICBpZiAoZnNpemUgPiBtcDMtPmhlYWRlcl9maWxlc2l6ZSAmJiBkZWx0YSA+IG1pbiA+PiA0KSB7CisgICAgICAgICAgICBtcDMtPmZyYW1lcyA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoZGVsdGEgPiBtaW4gPj4gNCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJmaWxlc2l6ZSBhbmQgZHVyYXRpb24gZG8gbm90IG1hdGNoIChncm93aW5nIGZpbGU/KVxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHYgJiBYSU5HX0ZMQUdfVE9DKQorICAgICAgICByZWFkX3hpbmdfdG9jKHMsIG1wMy0+aGVhZGVyX2ZpbGVzaXplLCBhdl9yZXNjYWxlX3EobXAzLT5mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7c3BmLCBjLT5zYW1wbGVfcmF0ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlKSk7CisgICAgLyogVkJSIHF1YWxpdHkgKi8KKyAgICBpZiAodiAmIFhJTkdfRkxBQ19RU0NBTEUpCisgICAgICAgIGF2aW9fcmIzMihzLT5wYik7CisKKyAgICAvKiBFbmNvZGVyIHNob3J0IHZlcnNpb24gc3RyaW5nICovCisgICAgbWVtc2V0KHZlcnNpb24sIDAsIHNpemVvZih2ZXJzaW9uKSk7CisgICAgYXZpb19yZWFkKHMtPnBiLCB2ZXJzaW9uLCA5KTsKKworICAgIC8qIEluZm8gVGFnIHJldmlzaW9uICsgVkJSIG1ldGhvZCAqLworICAgIGF2aW9fcjgocy0+cGIpOworCisgICAgLyogTG93cGFzcyBmaWx0ZXIgdmFsdWUgKi8KKyAgICBhdmlvX3I4KHMtPnBiKTsKKworICAgIC8qIFJlcGxheUdhaW4gcGVhayAqLworICAgIHYgICAgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIHBlYWsgPSBhdl9yZXNjYWxlKHYsIDEwMDAwMCwgMSA8PCAyMyk7CisKKyAgICAvKiBSYWRpbyBSZXBsYXlHYWluICovCisgICAgdiA9IGF2aW9fcmIxNihzLT5wYik7CisKKyAgICBpZiAoTUlERExFX0JJVFModiwgMTMsIDE1KSA9PSAxKSB7CisgICAgICAgIHJfZ2FpbiA9IE1JRERMRV9CSVRTKHYsIDAsIDgpICogMTAwMDA7CisKKyAgICAgICAgaWYgKHYgJiAoMSA8PCA5KSkKKyAgICAgICAgICAgIHJfZ2FpbiAqPSAtMTsKKyAgICB9CisKKyAgICAvKiBBdWRpb3BoaWxlIFJlcGxheUdhaW4gKi8KKyAgICB2ID0gYXZpb19yYjE2KHMtPnBiKTsKKworICAgIGlmIChNSURETEVfQklUUyh2LCAxMywgMTUpID09IDIpIHsKKyAgICAgICAgYV9nYWluID0gTUlERExFX0JJVFModiwgMCwgOCkgKiAxMDAwMDsKKworICAgICAgICBpZiAodiAmICgxIDw8IDkpKQorICAgICAgICAgICAgYV9nYWluICo9IC0xOworICAgIH0KKworICAgIC8qIEVuY29kaW5nIGZsYWdzICsgQVRIIFR5cGUgKi8KKyAgICBhdmlvX3I4KHMtPnBiKTsKKworICAgIC8qIGlmIEFCUiB7c3BlY2lmaWVkIGJpdHJhdGV9IGVsc2Uge21pbmltYWwgYml0cmF0ZX0gKi8KKyAgICBhdmlvX3I4KHMtPnBiKTsKKworICAgIC8qIEVuY29kZXIgZGVsYXlzICovCisgICAgdj0gYXZpb19yYjI0KHMtPnBiKTsKKyAgICBpZihBVl9SQjMyKHZlcnNpb24pID09IE1LQkVUQUcoJ0wnLCAnQScsICdNJywgJ0UnKQorICAgICAgICB8fCBBVl9SQjMyKHZlcnNpb24pID09IE1LQkVUQUcoJ0wnLCAnYScsICd2JywgJ2YnKQorICAgICAgICB8fCBBVl9SQjMyKHZlcnNpb24pID09IE1LQkVUQUcoJ0wnLCAnYScsICd2JywgJ2MnKQorICAgICkgeworCisgICAgICAgIG1wMy0+c3RhcnRfcGFkID0gdj4+MTI7CisgICAgICAgIG1wMy0+ICBlbmRfcGFkID0gdiY0MDk1OworICAgICAgICBzdC0+c2tpcF9zYW1wbGVzID0gbXAzLT5zdGFydF9wYWQgKyA1MjggKyAxOworICAgICAgICBpZiAobXAzLT5mcmFtZXMpIHsKKyAgICAgICAgICAgIHN0LT5maXJzdF9kaXNjYXJkX3NhbXBsZSA9IC1tcDMtPmVuZF9wYWQgKyA1MjggKyAxICsgbXAzLT5mcmFtZXMgKiAoaW50NjRfdClzcGY7CisgICAgICAgICAgICBzdC0+bGFzdF9kaXNjYXJkX3NhbXBsZSA9IG1wMy0+ZnJhbWVzICogKGludDY0X3Qpc3BmOworICAgICAgICB9CisgICAgICAgIGlmICghc3QtPnN0YXJ0X3RpbWUpCisgICAgICAgICAgICBzdC0+c3RhcnRfdGltZSA9IGF2X3Jlc2NhbGVfcShzdC0+c2tpcF9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgYy0+c2FtcGxlX3JhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInBhZCAlZCAlZFxuIiwgbXAzLT5zdGFydF9wYWQsIG1wMy0+ICBlbmRfcGFkKTsKKyAgICB9CisKKyAgICAvKiBNaXNjICovCisgICAgYXZpb19yOChzLT5wYik7CisKKyAgICAvKiBNUDMgZ2FpbiAqLworICAgIGF2aW9fcjgocy0+cGIpOworCisgICAgLyogUHJlc2V0IGFuZCBzdXJyb3VuZCBpbmZvICovCisgICAgYXZpb19yYjE2KHMtPnBiKTsKKworICAgIC8qIE11c2ljIGxlbmd0aCAqLworICAgIGF2aW9fcmIzMihzLT5wYik7CisKKyAgICAvKiBNdXNpYyBDUkMgKi8KKyAgICBhdmlvX3JiMTYocy0+cGIpOworCisgICAgLyogSW5mbyBUYWcgQ1JDICovCisgICAgY3JjID0gZmZpb19nZXRfY2hlY2tzdW0ocy0+cGIpOworICAgIHYgICA9IGF2aW9fcmIxNihzLT5wYik7CisKKyAgICBpZiAodiA9PSBjcmMpIHsKKyAgICAgICAgZmZfcmVwbGF5Z2Fpbl9leHBvcnRfcmF3KHN0LCByX2dhaW4sIHBlYWssIGFfZ2FpbiwgMCk7CisgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJlbmNvZGVyIiwgdmVyc2lvbiwgMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtcDNfcGFyc2VfdmJyaV90YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIGludDY0X3QgYmFzZSkKK3sKKyAgICB1aW50MzJfdCB2OworICAgIE1QM0RlY0NvbnRleHQgKm1wMyA9IHMtPnByaXZfZGF0YTsKKworICAgIC8qIENoZWNrIGZvciBWQlJJIHRhZyAoYWx3YXlzIDMyIGJ5dGVzIGFmdGVyIGVuZCBvZiBtcGVnYXVkaW8gaGVhZGVyKSAqLworICAgIGF2aW9fc2VlayhzLT5wYiwgYmFzZSArIDQgKyAzMiwgU0VFS19TRVQpOworICAgIHYgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGlmICh2ID09IE1LQkVUQUcoJ1YnLCAnQicsICdSJywgJ0knKSkgeworICAgICAgICAvKiBDaGVjayB0YWcgdmVyc2lvbiAqLworICAgICAgICBpZiAoYXZpb19yYjE2KHMtPnBiKSA9PSAxKSB7CisgICAgICAgICAgICAvKiBza2lwIGRlbGF5IGFuZCBxdWFsaXR5ICovCisgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIDQpOworICAgICAgICAgICAgbXAzLT5oZWFkZXJfZmlsZXNpemUgPSBhdmlvX3JiMzIocy0+cGIpOworICAgICAgICAgICAgbXAzLT5mcmFtZXMgPSBhdmlvX3JiMzIocy0+cGIpOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIFRyeSB0byBmaW5kIFhpbmcvSW5mby9WQlJJIHRhZ3MgYW5kIGNvbXB1dGUgZHVyYXRpb24gZnJvbSBpbmZvIHRoZXJlaW4KKyAqLworc3RhdGljIGludCBtcDNfcGFyc2VfdmJyX3RhZ3MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIGludDY0X3QgYmFzZSkKK3sKKyAgICB1aW50MzJfdCB2LCBzcGY7CisgICAgTVBBRGVjb2RlSGVhZGVyIGM7CisgICAgaW50IHZicnRhZ19zaXplID0gMDsKKyAgICBNUDNEZWNDb250ZXh0ICptcDMgPSBzLT5wcml2X2RhdGE7CisKKyAgICBmZmlvX2luaXRfY2hlY2tzdW0ocy0+cGIsIGZmX2NyY0EwMDFfdXBkYXRlLCAwKTsKKworICAgIHYgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGlmKGZmX21wYV9jaGVja19oZWFkZXIodikgPCAwKQorICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGF2cHJpdl9tcGVnYXVkaW9fZGVjb2RlX2hlYWRlcigmYywgdikgPT0gMCkKKyAgICAgICAgdmJydGFnX3NpemUgPSBjLmZyYW1lX3NpemU7CisgICAgaWYoYy5sYXllciAhPSAzKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzcGYgPSBjLmxzZiA/IDU3NiA6IDExNTI7IC8qIFNhbXBsZXMgcGVyIGZyYW1lLCBsYXllciAzICovCisKKyAgICBtcDMtPmZyYW1lcyA9IDA7CisgICAgbXAzLT5oZWFkZXJfZmlsZXNpemUgICA9IDA7CisKKyAgICBtcDNfcGFyc2VfaW5mb190YWcocywgc3QsICZjLCBzcGYpOworICAgIG1wM19wYXJzZV92YnJpX3RhZyhzLCBzdCwgYmFzZSk7CisKKyAgICBpZiAoIW1wMy0+ZnJhbWVzICYmICFtcDMtPmhlYWRlcl9maWxlc2l6ZSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogU2tpcCB0aGUgdmJyIHRhZyBmcmFtZSAqLworICAgIGF2aW9fc2VlayhzLT5wYiwgYmFzZSArIHZicnRhZ19zaXplLCBTRUVLX1NFVCk7CisKKyAgICBpZiAobXAzLT5mcmFtZXMpCisgICAgICAgIHN0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShtcDMtPmZyYW1lcywgKEFWUmF0aW9uYWwpe3NwZiwgYy5zYW1wbGVfcmF0ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlKTsKKyAgICBpZiAobXAzLT5oZWFkZXJfZmlsZXNpemUgJiYgbXAzLT5mcmFtZXMgJiYgIW1wMy0+aXNfY2JyKQorICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gYXZfcmVzY2FsZShtcDMtPmhlYWRlcl9maWxlc2l6ZSwgOCAqIGMuc2FtcGxlX3JhdGUsIG1wMy0+ZnJhbWVzICogKGludDY0X3Qpc3BmKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wM19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVAzRGVjQ29udGV4dCAqbXAzID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQ2NF90IG9mZjsKKyAgICBpbnQgcmV0OworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QMzsKKyAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CisgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOworCisgICAgLy8gbGNtIG9mIGFsbCBtcDMgc2FtcGxlIHJhdGVzCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDE0MTEyMDAwKTsKKworICAgIHMtPnBiLT5tYXhzaXplID0gLTE7CisgICAgb2ZmID0gYXZpb190ZWxsKHMtPnBiKTsKKworICAgIGlmICghYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICIiLCBOVUxMLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKQorICAgICAgICBmZl9pZDN2MV9yZWFkKHMpOworCisgICAgaWYocy0+cGItPnNlZWthYmxlKQorICAgICAgICBtcDMtPmZpbGVzaXplID0gYXZpb19zaXplKHMtPnBiKTsKKworICAgIGlmIChtcDNfcGFyc2VfdmJyX3RhZ3Mocywgc3QsIG9mZikgPCAwKQorICAgICAgICBhdmlvX3NlZWsocy0+cGIsIG9mZiwgU0VFS19TRVQpOworCisgICAgcmV0ID0gZmZfcmVwbGF5Z2Fpbl9leHBvcnQoc3QsIHMtPm1ldGFkYXRhKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgZXh0cmFjdGVkIGZyb20gdGhlIGNvbXByZXNzZWQgYml0c3RyZWFtICovCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTVAzX1BBQ0tFVF9TSVpFIDEwMjQKKworc3RhdGljIGludCBtcDNfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE1QM0RlY0NvbnRleHQgKm1wMyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBzaXplOworICAgIGludDY0X3QgcG9zOworCisgICAgc2l6ZT0gTVAzX1BBQ0tFVF9TSVpFOworICAgIHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgaWYobXAzLT5maWxlc2l6ZSA+IElEM3YxX1RBR19TSVpFICYmIHBvcyA8IG1wMy0+ZmlsZXNpemUpCisgICAgICAgIHNpemU9IEZGTUlOKHNpemUsIG1wMy0+ZmlsZXNpemUgLSBwb3MpOworCisgICAgcmV0PSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOworICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICBpZihyZXQ8MCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisKKyAgICBwa3QtPmZsYWdzICY9IH5BVl9QS1RfRkxBR19DT1JSVVBUOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKworICAgIGlmIChyZXQgPj0gSUQzdjFfVEFHX1NJWkUgJiYKKyAgICAgICAgbWVtY21wKCZwa3QtPmRhdGFbcmV0IC0gSUQzdjFfVEFHX1NJWkVdLCAiVEFHIiwgMykgPT0gMCkKKyAgICAgICAgcmV0IC09IElEM3YxX1RBR19TSVpFOworCisgICAgLyogbm90ZTogd2UgbmVlZCB0byBtb2RpZnkgdGhlIHBhY2tldCBzaXplIGhlcmUgdG8gaGFuZGxlIHRoZSBsYXN0CisgICAgICAgcGFja2V0ICovCisgICAgcGt0LT5zaXplID0gcmV0OworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2soQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IHBvcykKK3sKKyAgICBpbnQ2NF90IHJldCA9IGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCk7CisgICAgdW5zaWduZWQgaGVhZGVyOworICAgIE1QQURlY29kZUhlYWRlciBzZDsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBoZWFkZXIgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGlmIChmZl9tcGFfY2hlY2tfaGVhZGVyKGhlYWRlcikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGF2cHJpdl9tcGVnYXVkaW9fZGVjb2RlX2hlYWRlcigmc2QsIGhlYWRlcikgPT0gMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBzZC5mcmFtZV9zaXplOworfQorCitzdGF0aWMgaW50IG1wM19zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBNUDNEZWNDb250ZXh0ICptcDMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJbmRleEVudHJ5ICppZSwgaWUxOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgaW50NjRfdCByZXQgID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdCwgdGltZXN0YW1wLCBmbGFncyk7CisgICAgaW50IGksIGo7CisgICAgaW50IGRpciA9IChmbGFncyZBVlNFRUtfRkxBR19CQUNLV0FSRCkgPyAtMSA6IDE7CisgICAgaW50NjRfdCBiZXN0X3BvczsKKyAgICBpbnQgYmVzdF9zY29yZTsKKworICAgIGlmICggICBtcDMtPmlzX2NicgorICAgICAgICAmJiBzdC0+ZHVyYXRpb24gPiAwCisgICAgICAgICYmIG1wMy0+aGVhZGVyX2ZpbGVzaXplID4gcy0+ZGF0YV9vZmZzZXQKKyAgICAgICAgJiYgbXAzLT5mcmFtZXMpIHsKKyAgICAgICAgaW50NjRfdCBmaWxlc2l6ZSA9IGF2aW9fc2l6ZShzLT5wYik7CisgICAgICAgIGludDY0X3QgZHVyYXRpb247CisgICAgICAgIGlmIChmaWxlc2l6ZSA8PSBzLT5kYXRhX29mZnNldCkKKyAgICAgICAgICAgIGZpbGVzaXplID0gbXAzLT5oZWFkZXJfZmlsZXNpemU7CisgICAgICAgIGZpbGVzaXplIC09IHMtPmRhdGFfb2Zmc2V0OworICAgICAgICBkdXJhdGlvbiA9IGF2X3Jlc2NhbGUoc3QtPmR1cmF0aW9uLCBmaWxlc2l6ZSwgbXAzLT5oZWFkZXJfZmlsZXNpemUgLSBzLT5kYXRhX29mZnNldCk7CisgICAgICAgIGllID0gJmllMTsKKyAgICAgICAgdGltZXN0YW1wID0gYXZfY2xpcDY0KHRpbWVzdGFtcCwgMCwgZHVyYXRpb24pOworICAgICAgICBpZS0+dGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICBpZS0+cG9zICAgICAgID0gYXZfcmVzY2FsZSh0aW1lc3RhbXAsIGZpbGVzaXplLCBkdXJhdGlvbikgKyBzLT5kYXRhX29mZnNldDsKKyAgICB9IGVsc2UgaWYgKG1wMy0+eGluZ190b2MpIHsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGllID0gJnN0LT5pbmRleF9lbnRyaWVzW3JldF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3QtPnNraXBfc2FtcGxlcyA9IHRpbWVzdGFtcCA8PSAwID8gbXAzLT5zdGFydF9wYWQgKyA1MjggKyAxIDogMDsKKworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYXZpb19zZWVrKHMtPnBiLCBGRk1BWChpZS0+cG9zIC0gNDA5NiwgMCksIFNFRUtfU0VUKTsKKyAgICByZXQgPSBhdmlvX3NlZWsocy0+cGIsIGllLT5wb3MsIFNFRUtfU0VUKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworI2RlZmluZSBNSU5fVkFMSUQgMworICAgIGJlc3RfcG9zID0gaWUtPnBvczsKKyAgICBiZXN0X3Njb3JlID0gOTk5OworICAgIGZvcihpPTA7IGk8NDA5NjsgaSsrKSB7CisgICAgICAgIGludDY0X3QgcG9zID0gaWUtPnBvcyArIChkaXIgPiAwID8gaSAtIDEwMjQgOiAtaSk7CisgICAgICAgIGludDY0X3QgY2FuZGlkYXRlID0gLTE7CisgICAgICAgIGludCBzY29yZSA9IDk5OTsKKworICAgICAgICBpZiAocG9zIDwgMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvcihqPTA7IGo8TUlOX1ZBTElEOyBqKyspIHsKKyAgICAgICAgICAgIHJldCA9IGNoZWNrKHMsIHBvcyk7CisgICAgICAgICAgICBpZihyZXQgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKChpZS0+cG9zIC0gcG9zKSpkaXIgPD0gMCAmJiBhYnMoTUlOX1ZBTElELzItaikgPCBzY29yZSkgeworICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IHBvczsKKyAgICAgICAgICAgICAgICBzY29yZSA9IGFicyhNSU5fVkFMSUQvMi1qKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcyArPSByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJlc3Rfc2NvcmUgPiBzY29yZSAmJiBqID09IE1JTl9WQUxJRCkgeworICAgICAgICAgICAgYmVzdF9wb3MgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7CisgICAgICAgICAgICBpZihzY29yZSA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gYXZpb19zZWVrKHMtPnBiLCBiZXN0X3BvcywgU0VFS19TRVQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGZmX3VwZGF0ZV9jdXJfZHRzKHMsIHN0LCBpZS0+dGltZXN0YW1wKTsKKyAgICBzdC0+c2tpcF9zYW1wbGVzID0gaWUtPnRpbWVzdGFtcCA8PSAwID8gbXAzLT5zdGFydF9wYWQgKyA1MjggKyAxIDogMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJ1c2V0b2MiLCAidXNlIHRhYmxlIG9mIGNvbnRlbnRzIiwgb2Zmc2V0b2YoTVAzRGVjQ29udGV4dCwgdXNldG9jKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIDEsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGRlbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibXAzIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFTVVYRVIsCit9OworCitBVklucHV0Rm9ybWF0IGZmX21wM19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcDMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUDIvMyAoTVBFRyBhdWRpbyBsYXllciAyLzMpIiksCisgICAgLnJlYWRfcHJvYmUgICAgID0gbXAzX3JlYWRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gbXAzX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IG1wM19yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSBtcDNfc2VlaywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTVAzRGVjQ29udGV4dCksCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAibXAyLG1wMyxtMmEsbXBhIiwgLyogWFhYOiB1c2UgcHJvYmUgKi8KKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZGVtdXhlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbXAzZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbXAzZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiNmFmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tcDNlbmMuYwpAQCAtMCwwICsxLDYzMSBAQAorLyoKKyAqIE1QMyBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaWQzdjEuaCIKKyNpbmNsdWRlICJpZDN2Mi5oIgorI2luY2x1ZGUgInJhd2VuYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZ2F1ZGlvLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVnYXVkaW9kYXRhLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVnYXVkaW9kZWNoZWFkZXIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yZXBsYXlnYWluLmgiCisKK3N0YXRpYyBpbnQgaWQzdjFfc2V0X3N0cmluZyhBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnOworICAgIGlmICgodGFnID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsIGtleSwgTlVMTCwgMCkpKQorICAgICAgICBhdl9zdHJsY3B5KGJ1ZiwgdGFnLT52YWx1ZSwgYnVmX3NpemUpOworICAgIHJldHVybiAhIXRhZzsKK30KKworc3RhdGljIGludCBpZDN2MV9jcmVhdGVfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgdWludDhfdCAqYnVmKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0YWc7CisgICAgaW50IGksIGNvdW50ID0gMDsKKworICAgIG1lbXNldChidWYsIDAsIElEM3YxX1RBR19TSVpFKTsgLyogZmFpbCBzYWZlICovCisgICAgYnVmWzBdID0gJ1QnOworICAgIGJ1ZlsxXSA9ICdBJzsKKyAgICBidWZbMl0gPSAnRyc7CisgICAgLyogd2Uga25vd2luZ2x5IG92ZXJzcGVjaWZ5IGVhY2ggdGFnIGxlbmd0aCBieSBvbmUgYnl0ZSB0byBjb21wZW5zYXRlIGZvciB0aGUgbWFuZGF0b3J5IG51bGwgYnl0ZSBhZGRlZCBieSBhdl9zdHJsY3B5ICovCisgICAgY291bnQgKz0gaWQzdjFfc2V0X3N0cmluZyhzLCAiVElUMiIsICAgIGJ1ZiArICAzLCAzMCArIDEpOyAgICAgICAvL3RpdGxlCisgICAgY291bnQgKz0gaWQzdjFfc2V0X3N0cmluZyhzLCAiVFBFMSIsICAgIGJ1ZiArIDMzLCAzMCArIDEpOyAgICAgICAvL2F1dGhvcnxhcnRpc3QKKyAgICBjb3VudCArPSBpZDN2MV9zZXRfc3RyaW5nKHMsICJUQUxCIiwgICAgYnVmICsgNjMsIDMwICsgMSk7ICAgICAgIC8vYWxidW0KKyAgICBjb3VudCArPSBpZDN2MV9zZXRfc3RyaW5nKHMsICJURFJDIiwgICAgYnVmICsgOTMsICA0ICsgMSk7ICAgICAgIC8vZGF0ZQorICAgIGNvdW50ICs9IGlkM3YxX3NldF9zdHJpbmcocywgImNvbW1lbnQiLCBidWYgKyA5NywgMzAgKyAxKTsKKyAgICBpZiAoKHRhZyA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiVFJDSyIsIE5VTEwsIDApKSkgeyAvL3RyYWNrCisgICAgICAgIGJ1ZlsxMjVdID0gMDsKKyAgICAgICAgYnVmWzEyNl0gPSBhdG9pKHRhZy0+dmFsdWUpOworICAgICAgICBjb3VudCsrOworICAgIH0KKyAgICBidWZbMTI3XSA9IDB4RkY7IC8qIGRlZmF1bHQgdG8gdW5rbm93biBnZW5yZSAqLworICAgIGlmICgodGFnID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJUQ09OIiwgTlVMTCwgMCkpKSB7IC8vZ2VucmUKKyAgICAgICAgZm9yKGkgPSAwOyBpIDw9IElEM3YxX0dFTlJFX01BWDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAodGFnLT52YWx1ZSwgZmZfaWQzdjFfZ2VucmVfc3RyW2ldKSkgeworICAgICAgICAgICAgICAgIGJ1ZlsxMjddID0gaTsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBYSU5HX05VTV9CQUdTIDQwMAorI2RlZmluZSBYSU5HX1RPQ19TSVpFIDEwMAorLy8gc2l6ZSBvZiB0aGUgWElORy9MQU1FIGRhdGEsIHN0YXJ0aW5nIGZyb20gdGhlIFhpbmcgdGFnCisjZGVmaW5lIFhJTkdfU0laRSAxNTYKKwordHlwZWRlZiBzdHJ1Y3QgTVAzQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgSUQzdjJFbmNDb250ZXh0IGlkMzsKKyAgICBpbnQgaWQzdjJfdmVyc2lvbjsKKyAgICBpbnQgd3JpdGVfaWQzdjE7CisgICAgaW50IHdyaXRlX3hpbmc7CisKKyAgICAvKiB4aW5nIGhlYWRlciAqLworICAgIC8vIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHdob2xlIFhJTkcvTEFNRSBmcmFtZQorICAgIHVpbnQ4X3QgKnhpbmdfZnJhbWU7CisgICAgaW50ICAgICAgeGluZ19mcmFtZV9zaXplOworCisgICAgQVZDUkMgICAgYXVkaW9fY3JjOyAgICAgLy8gQ1JDIG9mIHRoZSBhdWRpbyBkYXRhCisgICAgdWludDMyX3QgYXVkaW9fc2l6ZTsgICAgLy8gdG90YWwgc2l6ZSBvZiB0aGUgYXVkaW8gZGF0YQorCisgICAgLy8gb2Zmc2V0IG9mIHRoZSBYSU5HL0xBTUUgZnJhbWUgaW4gdGhlIGZpbGUKKyAgICBpbnQ2NF90ICB4aW5nX2ZyYW1lX29mZnNldDsKKyAgICAvLyBvZmZzZXQgb2YgdGhlIFhJTkcvSU5GTyB0YWcgaW4gdGhlIGZyYW1lCisgICAgaW50IHhpbmdfb2Zmc2V0OworCisgICAgaW50MzJfdCBmcmFtZXM7CisgICAgaW50MzJfdCBzaXplOworICAgIHVpbnQzMl90IHdhbnQ7CisgICAgdWludDMyX3Qgc2VlbjsKKyAgICB1aW50MzJfdCBwb3M7CisgICAgdWludDY0X3QgYmFnW1hJTkdfTlVNX0JBR1NdOworICAgIGludCBpbml0aWFsX2JpdHJhdGU7CisgICAgaW50IGhhc192YXJpYWJsZV9iaXRyYXRlOworCisgICAgLyogaW5kZXggb2YgdGhlIGF1ZGlvIHN0cmVhbSAqLworICAgIGludCBhdWRpb19zdHJlYW1faWR4OworICAgIC8qIG51bWJlciBvZiBhdHRhY2hlZCBwaWN0dXJlcyB3ZSBzdGlsbCBuZWVkIHRvIHdyaXRlICovCisgICAgaW50IHBpY3NfdG9fd3JpdGU7CisKKyAgICAvKiBhdWRpbyBwYWNrZXRzIGFyZSBxdWV1ZWQgaGVyZSB1bnRpbCB3ZSBnZXQgYWxsIHRoZSBhdHRhY2hlZCBwaWN0dXJlcyAqLworICAgIEFWUGFja2V0TGlzdCAqcXVldWUsICpxdWV1ZV9lbmQ7Cit9IE1QM0NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHhpbmdfb2ZmdGJsWzJdWzJdID0ge3szMiwgMTd9LCB7MTcsIDl9fTsKKworLyoKKyAqIFdyaXRlIGFuIGVtcHR5IFhJTkcgaGVhZGVyIGFuZCBpbml0aWFsaXplIHJlc3BlY3RpdmUgZGF0YS4KKyAqLworc3RhdGljIGludCBtcDNfd3JpdGVfeGluZyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVAzQ29udGV4dCAgICAgICAqbXAzID0gcy0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbbXAzLT5hdWRpb19zdHJlYW1faWR4XS0+Y29kZWM7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmVuYyA9IGF2X2RpY3RfZ2V0KHMtPnN0cmVhbXNbbXAzLT5hdWRpb19zdHJlYW1faWR4XS0+bWV0YWRhdGEsICJlbmNvZGVyIiwgTlVMTCwgMCk7CisgICAgQVZJT0NvbnRleHQgKmR5bl9jdHg7CisgICAgaW50MzJfdCAgICAgICAgaGVhZGVyOworICAgIE1QQURlY29kZUhlYWRlciAgbXBhaDsKKyAgICBpbnQgc3JhdGVfaWR4LCBpLCBjaGFubmVsczsKKyAgICBpbnQgYml0cmF0ZV9pZHg7CisgICAgaW50IGJlc3RfYml0cmF0ZV9pZHggPSAtMTsKKyAgICBpbnQgYmVzdF9iaXRyYXRlX2Vycm9yID0gSU5UX01BWDsKKyAgICBpbnQgcmV0OworICAgIGludCB2ZXIgPSAwOworICAgIGludCBieXRlc19uZWVkZWQ7CisKKyAgICBpZiAoIXMtPnBiLT5zZWVrYWJsZSB8fCAhbXAzLT53cml0ZV94aW5nKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhhdnByaXZfbXBhX2ZyZXFfdGFiKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90IGJhc2VfZnJlcSA9IGF2cHJpdl9tcGFfZnJlcV90YWJbaV07CisKKyAgICAgICAgaWYgICAgICAoY29kZWMtPnNhbXBsZV9yYXRlID09IGJhc2VfZnJlcSkgICAgIHZlciA9IDB4MzsgLy8gTVBFRyAxCisgICAgICAgIGVsc2UgaWYgKGNvZGVjLT5zYW1wbGVfcmF0ZSA9PSBiYXNlX2ZyZXEgLyAyKSB2ZXIgPSAweDI7IC8vIE1QRUcgMgorICAgICAgICBlbHNlIGlmIChjb2RlYy0+c2FtcGxlX3JhdGUgPT0gYmFzZV9mcmVxIC8gNCkgdmVyID0gMHgwOyAvLyBNUEVHIDIuNQorICAgICAgICBlbHNlIGNvbnRpbnVlOworCisgICAgICAgIHNyYXRlX2lkeCA9IGk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA9PSBGRl9BUlJBWV9FTEVNUyhhdnByaXZfbXBhX2ZyZXFfdGFiKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSwgbm90IHdyaXRpbmcgWGluZyBoZWFkZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHN3aXRjaCAoY29kZWMtPmNoYW5uZWxzKSB7CisgICAgY2FzZSAxOiAgY2hhbm5lbHMgPSBNUEFfTU9OTzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6ICBjaGFubmVscyA9IE1QQV9TVEVSRU87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscywgIgorICAgICAgICAgICAgICAgICAgICAibm90IHdyaXRpbmcgWGluZyBoZWFkZXIuXG4iKTsKKyAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogZHVtbXkgTVBFRyBhdWRpbyBoZWFkZXIgKi8KKyAgICBoZWFkZXIgID0gIDB4ZmZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMjQ7IC8vIHN5bmMKKyAgICBoZWFkZXIgfD0gKDB4NyA8PCA1IHwgdmVyIDw8IDMgfCAweDEgPDwgMSB8IDB4MSkgPDwgMTY7IC8vIHN5bmMvYXVkaW8tdmVyc2lvbi9sYXllciAzL25vIGNyYyovCisgICAgaGVhZGVyIHw9IChzcmF0ZV9pZHggPDwgMikgPDwgODsKKyAgICBoZWFkZXIgfD0gY2hhbm5lbHMgPDwgNjsKKworICAgIGZvciAoYml0cmF0ZV9pZHggPSAxOyBiaXRyYXRlX2lkeCA8IDE1OyBiaXRyYXRlX2lkeCsrKSB7CisgICAgICAgIGludCBiaXRfcmF0ZSA9IDEwMDAgKiBhdnByaXZfbXBhX2JpdHJhdGVfdGFiW3ZlciAhPSAzXVszIC0gMV1bYml0cmF0ZV9pZHhdOworICAgICAgICBpbnQgZXJyb3IgICAgPSBGRkFCUyhiaXRfcmF0ZSAtIGNvZGVjLT5iaXRfcmF0ZSk7CisKKyAgICAgICAgaWYgKGVycm9yIDwgYmVzdF9iaXRyYXRlX2Vycm9yKSB7CisgICAgICAgICAgICBiZXN0X2JpdHJhdGVfZXJyb3IgPSBlcnJvcjsKKyAgICAgICAgICAgIGJlc3RfYml0cmF0ZV9pZHggICA9IGJpdHJhdGVfaWR4OworICAgICAgICB9CisgICAgfQorICAgIGF2X2Fzc2VydDAoYmVzdF9iaXRyYXRlX2lkeCA+PSAwKTsKKworICAgIGZvciAoYml0cmF0ZV9pZHggPSBiZXN0X2JpdHJhdGVfaWR4OyA7IGJpdHJhdGVfaWR4KyspIHsKKyAgICAgICAgaW50MzJfdCBtYXNrID0gYml0cmF0ZV9pZHggPDwgKDQgKyA4KTsKKyAgICAgICAgaWYgKDE1ID09IGJpdHJhdGVfaWR4KQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBoZWFkZXIgfD0gbWFzazsKKworICAgICAgICBhdnByaXZfbXBlZ2F1ZGlvX2RlY29kZV9oZWFkZXIoJm1wYWgsIGhlYWRlcik7CisgICAgICAgIG1wMy0+eGluZ19vZmZzZXQgPSB4aW5nX29mZnRibFttcGFoLmxzZiA9PSAxXVttcGFoLm5iX2NoYW5uZWxzID09IDFdICsgNDsKKyAgICAgICAgYnl0ZXNfbmVlZGVkICAgICA9IG1wMy0+eGluZ19vZmZzZXQgKyBYSU5HX1NJWkU7CisKKyAgICAgICAgaWYgKGJ5dGVzX25lZWRlZCA8PSBtcGFoLmZyYW1lX3NpemUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBoZWFkZXIgJj0gfm1hc2s7CisgICAgfQorCisgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJmR5bl9jdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZpb193YjMyKGR5bl9jdHgsIGhlYWRlcik7CisKKyAgICBmZmlvX2ZpbGwoZHluX2N0eCwgMCwgbXAzLT54aW5nX29mZnNldCAtIDQpOworICAgIGZmaW9fd2ZvdXJjYyhkeW5fY3R4LCAiWGluZyIpOworICAgIGF2aW9fd2IzMihkeW5fY3R4LCAweDAxIHwgMHgwMiB8IDB4MDQgfCAweDA4KTsgIC8vIGZyYW1lcyAvIHNpemUgLyBUT0MgLyB2YnIgc2NhbGUKKworICAgIG1wMy0+c2l6ZSA9IG1wYWguZnJhbWVfc2l6ZTsKKyAgICBtcDMtPndhbnQ9MTsKKyAgICBtcDMtPnNlZW49MDsKKyAgICBtcDMtPnBvcz0wOworCisgICAgYXZpb193YjMyKGR5bl9jdHgsIDApOyAgLy8gZnJhbWVzCisgICAgYXZpb193YjMyKGR5bl9jdHgsIDApOyAgLy8gc2l6ZQorCisgICAgLy8gVE9DCisgICAgZm9yIChpID0gMDsgaSA8IFhJTkdfVE9DX1NJWkU7IGkrKykKKyAgICAgICAgYXZpb193OChkeW5fY3R4LCAodWludDhfdCkoMjU1ICogaSAvIFhJTkdfVE9DX1NJWkUpKTsKKworICAgIC8vIHZiciBxdWFsaXR5CisgICAgLy8gd2Ugd3JpdGUgaXQsIGJlY2F1c2Ugc29tZSAoYnJva2VuKSB0b29scyBhbHdheXMgZXhwZWN0IGl0IHRvIGJlIHByZXNlbnQKKyAgICBhdmlvX3diMzIoZHluX2N0eCwgMCk7CisKKyAgICAvLyBlbmNvZGVyIHNob3J0IHZlcnNpb24gc3RyaW5nCisgICAgaWYgKGVuYykgeworICAgICAgICB1aW50OF90IGVuY29kZXJfc3RyWzldID0geyAwIH07CisgICAgICAgIGlmICggICBzdHJsZW4oZW5jLT52YWx1ZSkgPiBzaXplb2YoZW5jb2Rlcl9zdHIpCisgICAgICAgICAgICAmJiAhc3RyY21wKCJMYXZjIGxpYm1wM2xhbWUiLCBlbmMtPnZhbHVlKSkgeworICAgICAgICAgICAgbWVtY3B5KGVuY29kZXJfc3RyLCAiTGF2ZiBsYW1lIiwgOSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbWVtY3B5KGVuY29kZXJfc3RyLCBlbmMtPnZhbHVlLCBGRk1JTihzdHJsZW4oZW5jLT52YWx1ZSksIHNpemVvZihlbmNvZGVyX3N0cikpKTsKKworICAgICAgICBhdmlvX3dyaXRlKGR5bl9jdHgsIGVuY29kZXJfc3RyLCBzaXplb2YoZW5jb2Rlcl9zdHIpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgYXZpb193cml0ZShkeW5fY3R4LCAiTGF2ZlwwXDBcMFwwXDAiLCA5KTsKKworICAgIGF2aW9fdzgoZHluX2N0eCwgMCk7ICAgICAgLy8gdGFnIHJldmlzaW9uIDAgLyB1bmtub3duIHZiciBtZXRob2QKKyAgICBhdmlvX3c4KGR5bl9jdHgsIDApOyAgICAgIC8vIHVua25vd24gbG93cGFzcyBmaWx0ZXIgdmFsdWUKKyAgICBmZmlvX2ZpbGwoZHluX2N0eCwgMCwgOCk7IC8vIGVtcHR5IHJlcGxheWdhaW4gZmllbGRzCisgICAgYXZpb193OChkeW5fY3R4LCAwKTsgICAgICAvLyB1bmtub3duIGVuY29kaW5nIGZsYWdzCisgICAgYXZpb193OChkeW5fY3R4LCAwKTsgICAgICAvLyB1bmtub3duIGFici9taW5pbWFsIGJpdHJhdGUKKworICAgIC8vIGVuY29kZXIgZGVsYXkKKyAgICBpZiAoY29kZWMtPmluaXRpYWxfcGFkZGluZyAtIDUyOCAtIDEgPj0gMSA8PCAxMikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJUb28gbWFueSBzYW1wbGVzIG9mIGluaXRpYWwgcGFkZGluZy5cbiIpOworICAgIH0KKyAgICBhdmlvX3diMjQoZHluX2N0eCwgRkZNQVgoY29kZWMtPmluaXRpYWxfcGFkZGluZyAtIDUyOCAtIDEsIDApPDwxMik7CisKKyAgICBhdmlvX3c4KGR5bl9jdHgsICAgMCk7IC8vIG1pc2MKKyAgICBhdmlvX3c4KGR5bl9jdHgsICAgMCk7IC8vIG1wM2dhaW4KKyAgICBhdmlvX3diMTYoZHluX2N0eCwgMCk7IC8vIHByZXNldAorCisgICAgLy8gYXVkaW8gbGVuZ3RoIGFuZCBDUkNzICh3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIpCisgICAgYXZpb193YjMyKGR5bl9jdHgsIDApOyAvLyBtdXNpYyBsZW5ndGgKKyAgICBhdmlvX3diMTYoZHluX2N0eCwgMCk7IC8vIG11c2ljIGNyYworICAgIGF2aW9fd2IxNihkeW5fY3R4LCAwKTsgLy8gdGFnIGNyYworCisgICAgZmZpb19maWxsKGR5bl9jdHgsIDAsIG1wYWguZnJhbWVfc2l6ZSAtIGJ5dGVzX25lZWRlZCk7CisKKyAgICBtcDMtPnhpbmdfZnJhbWVfc2l6ZSAgID0gYXZpb19jbG9zZV9keW5fYnVmKGR5bl9jdHgsICZtcDMtPnhpbmdfZnJhbWUpOworICAgIG1wMy0+eGluZ19mcmFtZV9vZmZzZXQgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIGF2aW9fd3JpdGUocy0+cGIsIG1wMy0+eGluZ19mcmFtZSwgbXAzLT54aW5nX2ZyYW1lX3NpemUpOworCisgICAgbXAzLT5hdWRpb19zaXplID0gbXAzLT54aW5nX2ZyYW1lX3NpemU7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEFkZCBhIGZyYW1lIHRvIFhJTkcgZGF0YS4KKyAqIEZvbGxvd2luZyBsYW1lJ3MgIlZiclRhZy5jIi4KKyAqLworc3RhdGljIHZvaWQgbXAzX3hpbmdfYWRkX2ZyYW1lKE1QM0NvbnRleHQgKm1wMywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgaTsKKworICAgIG1wMy0+ZnJhbWVzKys7CisgICAgbXAzLT5zZWVuKys7CisgICAgbXAzLT5zaXplICs9IHBrdC0+c2l6ZTsKKworICAgIGlmIChtcDMtPndhbnQgPT0gbXAzLT5zZWVuKSB7CisgICAgICAgIG1wMy0+YmFnW21wMy0+cG9zXSA9IG1wMy0+c2l6ZTsKKworICAgICAgICBpZiAoWElOR19OVU1fQkFHUyA9PSArK21wMy0+cG9zKSB7CisgICAgICAgICAgICAvKiBzaHJpbmsgdGFibGUgdG8gaGFsZiBzaXplIGJ5IHRocm93aW5nIGF3YXkgZWFjaCBzZWNvbmQgYmFnLiAqLworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IFhJTkdfTlVNX0JBR1M7IGkgKz0gMikKKyAgICAgICAgICAgICAgICBtcDMtPmJhZ1tpID4+IDFdID0gbXAzLT5iYWdbaV07CisKKyAgICAgICAgICAgIC8qIGRvdWJsZSB3YW50ZWQgYW1vdW50IHBlciBiYWcuICovCisgICAgICAgICAgICBtcDMtPndhbnQgKj0gMjsKKyAgICAgICAgICAgIC8qIGFkanVzdCBjdXJyZW50IHBvc2l0aW9uIHRvIGhhbGYgb2YgdGFibGUgc2l6ZS4gKi8KKyAgICAgICAgICAgIG1wMy0+cG9zID0gWElOR19OVU1fQkFHUyAvIDI7CisgICAgICAgIH0KKworICAgICAgICBtcDMtPnNlZW4gPSAwOworICAgIH0KK30KKworc3RhdGljIGludCBtcDNfd3JpdGVfYXVkaW9fcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNUDNDb250ZXh0ICAqbXAzID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKHBrdC0+ZGF0YSAmJiBwa3QtPnNpemUgPj0gNCkgeworICAgICAgICBNUEFEZWNvZGVIZWFkZXIgbXBhaDsKKyAgICAgICAgaW50IGF2X3VudXNlZCBiYXNlOworICAgICAgICB1aW50MzJfdCBoOworCisgICAgICAgIGggPSBBVl9SQjMyKHBrdC0+ZGF0YSk7CisgICAgICAgIGlmIChmZl9tcGFfY2hlY2tfaGVhZGVyKGgpID09IDApIHsKKyAgICAgICAgICAgIGF2cHJpdl9tcGVnYXVkaW9fZGVjb2RlX2hlYWRlcigmbXBhaCwgaCk7CisgICAgICAgICAgICBpZiAoIW1wMy0+aW5pdGlhbF9iaXRyYXRlKQorICAgICAgICAgICAgICAgIG1wMy0+aW5pdGlhbF9iaXRyYXRlID0gbXBhaC5iaXRfcmF0ZTsKKyAgICAgICAgICAgIGlmICgobXBhaC5iaXRfcmF0ZSA9PSAwKSB8fCAobXAzLT5pbml0aWFsX2JpdHJhdGUgIT0gbXBhaC5iaXRfcmF0ZSkpCisgICAgICAgICAgICAgICAgbXAzLT5oYXNfdmFyaWFibGVfYml0cmF0ZSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJBdWRpbyBwYWNrZXQgb2Ygc2l6ZSAlZCAoc3RhcnRpbmcgd2l0aCAlMDhYLi4uKSAiCisgICAgICAgICAgICAgICAgICAgImlzIGludmFsaWQsIHdyaXRpbmcgaXQgYW55d2F5LlxuIiwgcGt0LT5zaXplLCBoKTsKKyAgICAgICAgfQorCisjaWZkZWYgRklMVEVSX1ZCUl9IRUFERVJTCisgICAgICAgIC8qIGZpbHRlciBvdXQgWElORyBhbmQgSU5GTyBoZWFkZXJzLiAqLworICAgICAgICBiYXNlID0gNCArIHhpbmdfb2ZmdGJsW21wYWgubHNmID09IDFdW21wYWgubmJfY2hhbm5lbHMgPT0gMV07CisKKyAgICAgICAgaWYgKGJhc2UgKyA0IDw9IHBrdC0+c2l6ZSkgeworICAgICAgICAgICAgdWludDMyX3QgdiA9IEFWX1JCMzIocGt0LT5kYXRhICsgYmFzZSk7CisKKyAgICAgICAgICAgIGlmIChNS0JFVEFHKCdYJywnaScsJ24nLCdnJykgPT0gdiB8fCBNS0JFVEFHKCdJJywnbicsJ2YnLCdvJykgPT0gdikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGZpbHRlciBvdXQgVkJSSSBoZWFkZXJzLiAqLworICAgICAgICBiYXNlID0gNCArIDMyOworCisgICAgICAgIGlmIChiYXNlICsgNCA8PSBwa3QtPnNpemUgJiYgTUtCRVRBRygnVicsJ0InLCdSJywnSScpID09IEFWX1JCMzIocGt0LT5kYXRhICsgYmFzZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorCisgICAgICAgIGlmIChtcDMtPnhpbmdfb2Zmc2V0KSB7CisgICAgICAgICAgICBtcDNfeGluZ19hZGRfZnJhbWUobXAzLCBwa3QpOworICAgICAgICAgICAgbXAzLT5hdWRpb19zaXplICs9IHBrdC0+c2l6ZTsKKyAgICAgICAgICAgIG1wMy0+YXVkaW9fY3JjICAgPSBhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMTZfQU5TSV9MRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wMy0+YXVkaW9fY3JjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmZfcmF3X3dyaXRlX3BhY2tldChzLCBwa3QpOworfQorCitzdGF0aWMgaW50IG1wM19xdWV1ZV9mbHVzaChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVAzQ29udGV4dCAqbXAzID0gcy0+cHJpdl9kYXRhOworICAgIEFWUGFja2V0TGlzdCAqcGt0bDsKKyAgICBpbnQgcmV0ID0gMCwgd3JpdGUgPSAxOworCisgICAgZmZfaWQzdjJfZmluaXNoKCZtcDMtPmlkMywgcy0+cGIsIHMtPm1ldGFkYXRhX2hlYWRlcl9wYWRkaW5nKTsKKyAgICBtcDNfd3JpdGVfeGluZyhzKTsKKworICAgIHdoaWxlICgocGt0bCA9IG1wMy0+cXVldWUpKSB7CisgICAgICAgIGlmICh3cml0ZSAmJiAocmV0ID0gbXAzX3dyaXRlX2F1ZGlvX3BhY2tldChzLCAmcGt0bC0+cGt0KSkgPCAwKQorICAgICAgICAgICAgd3JpdGUgPSAwOworICAgICAgICBhdl9mcmVlX3BhY2tldCgmcGt0bC0+cGt0KTsKKyAgICAgICAgbXAzLT5xdWV1ZSA9IHBrdGwtPm5leHQ7CisgICAgICAgIGF2X2ZyZWVwKCZwa3RsKTsKKyAgICB9CisgICAgbXAzLT5xdWV1ZV9lbmQgPSBOVUxMOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1wM191cGRhdGVfeGluZyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVAzQ29udGV4dCAgKm1wMyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlJlcGxheUdhaW4gKnJnOworICAgIHVpbnQxNl90IHRhZ19jcmM7CisgICAgdWludDhfdCAqdG9jOworICAgIGludCBpLCByZ19zaXplOworCisgICAgLyogcmVwbGFjZSAiWGluZyIgaWRlbnRpZmljYXRpb24gc3RyaW5nIHdpdGggIkluZm8iIGZvciBDQlIgZmlsZXMuICovCisgICAgaWYgKCFtcDMtPmhhc192YXJpYWJsZV9iaXRyYXRlKQorICAgICAgICBBVl9XTDMyKG1wMy0+eGluZ19mcmFtZSArIG1wMy0+eGluZ19vZmZzZXQsIE1LVEFHKCdJJywgJ24nLCAnZicsICdvJykpOworCisgICAgQVZfV0IzMihtcDMtPnhpbmdfZnJhbWUgKyBtcDMtPnhpbmdfb2Zmc2V0ICsgOCwgIG1wMy0+ZnJhbWVzKTsKKyAgICBBVl9XQjMyKG1wMy0+eGluZ19mcmFtZSArIG1wMy0+eGluZ19vZmZzZXQgKyAxMiwgbXAzLT5zaXplKTsKKworICAgIHRvYyAgICA9IG1wMy0+eGluZ19mcmFtZSArIG1wMy0+eGluZ19vZmZzZXQgKyAxNjsKKyAgICB0b2NbMF0gPSAwOyAgLy8gZmlyc3QgdG9jIGVudHJ5IGhhcyB0byBiZSB6ZXJvLgorICAgIGZvciAoaSA9IDE7IGkgPCBYSU5HX1RPQ19TSVpFOyArK2kpIHsKKyAgICAgICAgaW50IGogPSBpICogbXAzLT5wb3MgLyBYSU5HX1RPQ19TSVpFOworICAgICAgICBpbnQgc2Vla19wb2ludCA9IDI1NkxMICogbXAzLT5iYWdbal0gLyBtcDMtPnNpemU7CisgICAgICAgIHRvY1tpXSA9IEZGTUlOKHNlZWtfcG9pbnQsIDI1NSk7CisgICAgfQorCisgICAgLyogd3JpdGUgcmVwbGF5Z2FpbiAqLworICAgIHJnID0gKEFWUmVwbGF5R2FpbiopYXZfc3RyZWFtX2dldF9zaWRlX2RhdGEocy0+c3RyZWFtc1swXSwgQVZfUEtUX0RBVEFfUkVQTEFZR0FJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ19zaXplKTsKKyAgICBpZiAocmcgJiYgcmdfc2l6ZSA+PSBzaXplb2YoKnJnKSkgeworICAgICAgICB1aW50MTZfdCB2YWw7CisKKyAgICAgICAgQVZfV0IzMihtcDMtPnhpbmdfZnJhbWUgKyBtcDMtPnhpbmdfb2Zmc2V0ICsgMTMxLAorICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGUocmctPnRyYWNrX3BlYWssIDEgPDwgMjMsIDEwMDAwMCkpOworCisgICAgICAgIGlmIChyZy0+dHJhY2tfZ2FpbiAhPSBJTlQzMl9NSU4pIHsKKyAgICAgICAgICAgIHZhbCAgPSBGRkFCUyhyZy0+dHJhY2tfZ2FpbiAvIDEwMDAwKSAmICgoMSA8PCA5KSAtIDEpOworICAgICAgICAgICAgdmFsIHw9IChyZy0+dHJhY2tfZ2FpbiA8IDApIDw8IDk7CisgICAgICAgICAgICB2YWwgfD0gMSA8PCAxMzsKKyAgICAgICAgICAgIEFWX1dCMTYobXAzLT54aW5nX2ZyYW1lICsgbXAzLT54aW5nX29mZnNldCArIDEzNSwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZy0+YWxidW1fZ2FpbiAhPSBJTlQzMl9NSU4pIHsKKyAgICAgICAgICAgIHZhbCAgPSBGRkFCUyhyZy0+YWxidW1fZ2FpbiAvIDEwMDAwKSAmICgoMSA8PCA5KSAtIDEpOworICAgICAgICAgICAgdmFsIHw9IChyZy0+YWxidW1fZ2FpbiA8IDApIDw8IDk7CisgICAgICAgICAgICB2YWwgfD0gMSA8PCAxNDsKKyAgICAgICAgICAgIEFWX1dCMTYobXAzLT54aW5nX2ZyYW1lICsgbXAzLT54aW5nX29mZnNldCArIDEzNywgdmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFWX1dCMzIobXAzLT54aW5nX2ZyYW1lICsgbXAzLT54aW5nX29mZnNldCArIFhJTkdfU0laRSAtIDgsIG1wMy0+YXVkaW9fc2l6ZSk7CisgICAgQVZfV0IxNihtcDMtPnhpbmdfZnJhbWUgKyBtcDMtPnhpbmdfb2Zmc2V0ICsgWElOR19TSVpFIC0gNCwgbXAzLT5hdWRpb19jcmMpOworCisgICAgdGFnX2NyYyA9IGF2X2NyYyhhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18xNl9BTlNJX0xFKSwgMCwgbXAzLT54aW5nX2ZyYW1lLCAxOTApOworICAgIEFWX1dCMTYobXAzLT54aW5nX2ZyYW1lICsgbXAzLT54aW5nX29mZnNldCArIFhJTkdfU0laRSAtIDIsIHRhZ19jcmMpOworCisgICAgYXZpb19zZWVrKHMtPnBiLCAgbXAzLT54aW5nX2ZyYW1lX29mZnNldCwgU0VFS19TRVQpOworICAgIGF2aW9fd3JpdGUocy0+cGIsIG1wMy0+eGluZ19mcmFtZSwgbXAzLT54aW5nX2ZyYW1lX3NpemUpOworICAgIGF2aW9fc2VlayhzLT5wYiwgMCwgU0VFS19FTkQpOworfQorCitzdGF0aWMgaW50IG1wM193cml0ZV90cmFpbGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgdWludDhfdCBidWZbSUQzdjFfVEFHX1NJWkVdOworICAgIE1QM0NvbnRleHQgKm1wMyA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmIChtcDMtPnBpY3NfdG9fd3JpdGUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiTm8gcGFja2V0cyB3ZXJlIHNlbnQgZm9yIHNvbWUgb2YgdGhlICIKKyAgICAgICAgICAgICAgICJhdHRhY2hlZCBwaWN0dXJlcy5cbiIpOworICAgICAgICBtcDNfcXVldWVfZmx1c2gocyk7CisgICAgfQorCisgICAgLyogd3JpdGUgdGhlIGlkM3YxIHRhZyAqLworICAgIGlmIChtcDMtPndyaXRlX2lkM3YxICYmIGlkM3YxX2NyZWF0ZV90YWcocywgYnVmKSA+IDApIHsKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgYnVmLCBJRDN2MV9UQUdfU0laRSk7CisgICAgfQorCisgICAgaWYgKG1wMy0+eGluZ19vZmZzZXQpCisgICAgICAgIG1wM191cGRhdGVfeGluZyhzKTsKKworICAgIGF2X2ZyZWVwKCZtcDMtPnhpbmdfZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfY29kZWMoZW51bSBBVkNvZGVjSUQgaWQsIGludCBzdGRfY29tcGxpYW5jZSkKK3sKKyAgICBjb25zdCBDb2RlY01pbWUgKmNtPSBmZl9pZDN2Ml9taW1lX3RhZ3M7CisgICAgd2hpbGUoY20tPmlkICE9IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgaWYoaWQgPT0gY20tPmlkKQorICAgICAgICAgICAgcmV0dXJuIE1LVEFHKCdBJywgJ1AnLCAnSScsICdDJyk7CisgICAgICAgIGNtKys7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworI2lmIENPTkZJR19NUDJfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX21wMl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAibXAyIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVAyIChNUEVHIGF1ZGlvIGxheWVyIDIpIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImF1ZGlvL21wZWciLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJtcDIsbTJhLG1wYSIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTVAyLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfTVAzX01VWEVSCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiaWQzdjJfdmVyc2lvbiIsICJTZWxlY3QgSUQzdjIgdmVyc2lvbiB0byB3cml0ZS4gQ3VycmVudGx5IDMgYW5kIDQgYXJlIHN1cHBvcnRlZC4iLAorICAgICAgb2Zmc2V0b2YoTVAzQ29udGV4dCwgaWQzdjJfdmVyc2lvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA0fSwgMCwgNCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU19LAorICAgIHsgIndyaXRlX2lkM3YxIiwgIkVuYWJsZSBJRDN2MSB3cml0aW5nLiBJRDN2MSB0YWdzIGFyZSB3cml0dGVuIGluIFVURi04IHdoaWNoIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IG1vc3Qgc29mdHdhcmUuIiwKKyAgICAgIG9mZnNldG9mKE1QM0NvbnRleHQsIHdyaXRlX2lkM3YxKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTX0sCisgICAgeyAid3JpdGVfeGluZyIsICAiV3JpdGUgdGhlIFhpbmcgaGVhZGVyIGNvbnRhaW5pbmcgZmlsZSBkdXJhdGlvbi4iLAorICAgICAgb2Zmc2V0b2YoTVAzQ29udGV4dCwgd3JpdGVfeGluZyksICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMX0sIDAsIDEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG1wM19tdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAiTVAzIG11eGVyIiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBpbnQgbXAzX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTVAzQ29udGV4dCAqbXAzID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKHBrdC0+c3RyZWFtX2luZGV4ID09IG1wMy0+YXVkaW9fc3RyZWFtX2lkeCkgeworICAgICAgICBpZiAobXAzLT5waWNzX3RvX3dyaXRlKSB7CisgICAgICAgICAgICAvKiBidWZmZXIgYXVkaW8gcGFja2V0cyB1bnRpbCB3ZSBnZXQgYWxsIHRoZSBwaWN0dXJlcyAqLworICAgICAgICAgICAgQVZQYWNrZXRMaXN0ICpwa3RsID0gYXZfbWFsbG9jeihzaXplb2YoKnBrdGwpKTsKKyAgICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgICBpZiAoIXBrdGwpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBidWZmZXIgYXVkaW8uIFNraXBwaW5nIHBpY3R1cmUgc3RyZWFtc1xuIik7CisgICAgICAgICAgICAgICAgbXAzLT5waWNzX3RvX3dyaXRlID0gMDsKKyAgICAgICAgICAgICAgICBtcDNfcXVldWVfZmx1c2gocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1wM193cml0ZV9hdWRpb19wYWNrZXQocywgcGt0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gYXZfY29weV9wYWNrZXQoJnBrdGwtPnBrdCwgcGt0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnBrdGwpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtcDMtPnF1ZXVlX2VuZCkKKyAgICAgICAgICAgICAgICBtcDMtPnF1ZXVlX2VuZC0+bmV4dCA9IHBrdGw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbXAzLT5xdWV1ZSA9IHBrdGw7CisgICAgICAgICAgICBtcDMtPnF1ZXVlX2VuZCA9IHBrdGw7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIG1wM193cml0ZV9hdWRpb19wYWNrZXQocywgcGt0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIC8qIHdhcm4gb25seSBvbmNlIGZvciBlYWNoIHN0cmVhbSAqLworICAgICAgICBpZiAocy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPm5iX2ZyYW1lcyA9PSAxKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJHb3QgbW9yZSB0aGFuIG9uZSBwaWN0dXJlIGluIHN0cmVhbSAlZCwiCisgICAgICAgICAgICAgICAgICAgIiBpZ25vcmluZy5cbiIsIHBrdC0+c3RyZWFtX2luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1wMy0+cGljc190b193cml0ZSB8fCBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+bmJfZnJhbWVzID49IDEpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoKHJldCA9IGZmX2lkM3YyX3dyaXRlX2FwaWMocywgJm1wMy0+aWQzLCBwa3QpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBtcDMtPnBpY3NfdG9fd3JpdGUtLTsKKworICAgICAgICAvKiBmbHVzaCB0aGUgYnVmZmVyZWQgYXVkaW8gcGFja2V0cyAqLworICAgICAgICBpZiAoIW1wMy0+cGljc190b193cml0ZSAmJgorICAgICAgICAgICAgKHJldCA9IG1wM19xdWV1ZV9mbHVzaChzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBXcml0ZSBhbiBJRDN2MiBoZWFkZXIgYXQgYmVnaW5uaW5nIG9mIHN0cmVhbQorICovCisKK3N0YXRpYyBpbnQgbXAzX3dyaXRlX2hlYWRlcihzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1QM0NvbnRleHQgICptcDMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldCwgaTsKKworICAgIGlmIChtcDMtPmlkM3YyX3ZlcnNpb24gICAgICAmJgorICAgICAgICBtcDMtPmlkM3YyX3ZlcnNpb24gIT0gMyAmJgorICAgICAgICBtcDMtPmlkM3YyX3ZlcnNpb24gIT0gNCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBJRDN2MiB2ZXJzaW9uIHJlcXVlc3RlZDogJWQuIE9ubHkgIgorICAgICAgICAgICAgICAgIjMsIDQgb3IgMCAoZGlzYWJsZWQpIGFyZSBhbGxvd2VkLlxuIiwgbXAzLT5pZDN2Ml92ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGUgc3RyZWFtcyAtLSB3ZSB3YW50IGV4YWN0bHkgb25lIGF1ZGlvIGFuZCBhcmJpdHJhcnkgbnVtYmVyIG9mCisgICAgICogdmlkZW8gKGF0dGFjaGVkIHBpY3R1cmVzKSAqLworICAgIG1wMy0+YXVkaW9fc3RyZWFtX2lkeCA9IC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGlmIChtcDMtPmF1ZGlvX3N0cmVhbV9pZHggPj0gMCB8fCBzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QMykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGF1ZGlvIHN0cmVhbS4gRXhhY3RseSBvbmUgTVAzICIKKyAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvIHN0cmVhbSBpcyByZXF1aXJlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtcDMtPmF1ZGlvX3N0cmVhbV9pZHggPSBpOworICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPbmx5IGF1ZGlvIHN0cmVhbXMgYW5kIHBpY3R1cmVzIGFyZSBhbGxvd2VkIGluIE1QMy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobXAzLT5hdWRpb19zdHJlYW1faWR4IDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm8gYXVkaW8gc3RyZWFtIHByZXNlbnQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgbXAzLT5waWNzX3RvX3dyaXRlID0gcy0+bmJfc3RyZWFtcyAtIDE7CisKKyAgICBpZiAobXAzLT5waWNzX3RvX3dyaXRlICYmICFtcDMtPmlkM3YyX3ZlcnNpb24pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkF0dGFjaGVkIHBpY3R1cmVzIHdlcmUgcmVxdWVzdGVkLCBidXQgdGhlICIKKyAgICAgICAgICAgICAgICJJRDN2MiBoZWFkZXIgaXMgZGlzYWJsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAobXAzLT5pZDN2Ml92ZXJzaW9uKSB7CisgICAgICAgIGZmX2lkM3YyX3N0YXJ0KCZtcDMtPmlkMywgcy0+cGIsIG1wMy0+aWQzdjJfdmVyc2lvbiwgSUQzdjJfREVGQVVMVF9NQUdJQyk7CisgICAgICAgIHJldCA9IGZmX2lkM3YyX3dyaXRlX21ldGFkYXRhKHMsICZtcDMtPmlkMyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoIW1wMy0+cGljc190b193cml0ZSkgeworICAgICAgICBpZiAobXAzLT5pZDN2Ml92ZXJzaW9uKQorICAgICAgICAgICAgZmZfaWQzdjJfZmluaXNoKCZtcDMtPmlkMywgcy0+cGIsIHMtPm1ldGFkYXRhX2hlYWRlcl9wYWRkaW5nKTsKKyAgICAgICAgbXAzX3dyaXRlX3hpbmcocyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX21wM19tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAibXAzIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVAzIChNUEVHIGF1ZGlvIGxheWVyIDMpIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImF1ZGlvL21wZWciLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJtcDMiLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihNUDNDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUDMsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUE5HLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1wM193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbXAzX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBtcDNfd3JpdGVfdHJhaWxlciwKKyAgICAucXVlcnlfY29kZWMgICAgICAgPSBxdWVyeV9jb2RlYywKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJm1wM19tdXhlcl9jbGFzcywKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjhhYzljCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21wYy5jCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogTXVzZXBhY2sgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA2IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXBldGFnLmgiCisjaW5jbHVkZSAiaWQzdjEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorCisjZGVmaW5lIE1QQ19GUkFNRVNJWkUgIDExNTIKKyNkZWZpbmUgREVMQVlfRlJBTUVTICAgMzIKKworc3RhdGljIGNvbnN0IGludCBtcGNfcmF0ZVs0XSA9IHsgNDQxMDAsIDQ4MDAwLCAzNzgwMCwgMzIwMDAgfTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQ2NF90IHBvczsKKyAgICBpbnQgc2l6ZSwgc2tpcDsKK31NUENGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB2ZXI7CisgICAgdWludDMyX3QgY3VyZnJhbWUsIGxhc3RmcmFtZTsKKyAgICB1aW50MzJfdCBmY291bnQ7CisgICAgTVBDRnJhbWUgKmZyYW1lczsKKyAgICBpbnQgY3VyYml0czsKKyAgICBpbnQgZnJhbWVzX25vdGVkOworfSBNUENDb250ZXh0OworCitzdGF0aWMgaW50IG1wY19wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpkID0gcC0+YnVmOworICAgIGlmIChkWzBdID09ICdNJyAmJiBkWzFdID09ICdQJyAmJiBkWzJdID09ICcrJyAmJiAoZFszXSA9PSAweDE3IHx8IGRbM10gPT0gMHg3KSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wY19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVBDQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBpZihhdmlvX3JsMjQocy0+cGIpICE9IE1LVEFHKCdNJywgJ1AnLCAnKycsIDApKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vdCBhIE11c2VwYWNrIGZpbGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYy0+dmVyID0gYXZpb19yOChzLT5wYik7CisgICAgaWYoYy0+dmVyICE9IDB4MDcgJiYgYy0+dmVyICE9IDB4MTcpeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2FuIGRlbXV4IE11c2VwYWNrIFNWNywgZ290IHZlcnNpb24gJTAyWFxuIiwgYy0+dmVyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGMtPmZjb3VudCA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgaWYoKGludDY0X3QpYy0+ZmNvdW50ICogc2l6ZW9mKE1QQ0ZyYW1lKSA+PSBVSU5UX01BWCl7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBmcmFtZXMsIHNlZWtpbmcgaXMgbm90IHBvc3NpYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmKGMtPmZjb3VudCl7CisgICAgICAgIGMtPmZyYW1lcyA9IGF2X21hbGxvYyhjLT5mY291bnQgKiBzaXplb2YoTVBDRnJhbWUpKTsKKyAgICAgICAgaWYoIWMtPmZyYW1lcyl7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIHNlZWt0YWJsZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkNvbnRhaW5lciByZXBvcnRzIG5vIGZyYW1lc1xuIik7CisgICAgfQorICAgIGMtPmN1cmZyYW1lID0gMDsKKyAgICBjLT5sYXN0ZnJhbWUgPSAtMTsKKyAgICBjLT5jdXJiaXRzID0gODsKKyAgICBjLT5mcmFtZXNfbm90ZWQgPSAwOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NVVNFUEFDSzc7CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDI7CisgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKKworICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcy0+cGIsIDE2KSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IG1wY19yYXRlW3N0LT5jb2RlYy0+ZXh0cmFkYXRhWzJdICYgM107CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIE1QQ19GUkFNRVNJWkUsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIC8qIHNjYW4gZm9yIHNlZWtwb2ludHMgKi8KKyAgICBzdC0+c3RhcnRfdGltZSA9IDA7CisgICAgc3QtPmR1cmF0aW9uID0gYy0+ZmNvdW50OworCisgICAgLyogdHJ5IHRvIHJlYWQgQVBFIHRhZ3MgKi8KKyAgICBpZiAocy0+cGItPnNlZWthYmxlKSB7CisgICAgICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICAgICAgZmZfYXBlX3BhcnNlX3RhZyhzKTsKKyAgICAgICAgaWYgKCFhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgIiIsIE5VTEwsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpCisgICAgICAgICAgICBmZl9pZDN2MV9yZWFkKHMpOworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIHBvcywgU0VFS19TRVQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wY19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTVBDQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBzaXplLCBzaXplMiwgY3VyYml0cywgY3VyID0gYy0+Y3VyZnJhbWU7CisgICAgdW5zaWduZWQgdG1wOworICAgIGludDY0X3QgcG9zOworCisgICAgaWYgKGMtPmN1cmZyYW1lID49IGMtPmZjb3VudCAmJiBjLT5mY291bnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGlmKGMtPmN1cmZyYW1lICE9IGMtPmxhc3RmcmFtZSArIDEpeworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIGMtPmZyYW1lc1tjLT5jdXJmcmFtZV0ucG9zLCBTRUVLX1NFVCk7CisgICAgICAgIGMtPmN1cmJpdHMgPSBjLT5mcmFtZXNbYy0+Y3VyZnJhbWVdLnNraXA7CisgICAgfQorICAgIGMtPmxhc3RmcmFtZSA9IGMtPmN1cmZyYW1lOworICAgIGMtPmN1cmZyYW1lKys7CisgICAgY3VyYml0cyA9IGMtPmN1cmJpdHM7CisgICAgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICB0bXAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIGlmKGN1cmJpdHMgPD0gMTIpeworICAgICAgICBzaXplMiA9ICh0bXAgPj4gKDEyIC0gY3VyYml0cykpICYgMHhGRkZGRjsKKyAgICB9ZWxzZXsKKyAgICAgICAgc2l6ZTIgPSAodG1wIDw8IChjdXJiaXRzIC0gMTIpIHwgYXZpb19ybDMyKHMtPnBiKSA+PiAoNDQgLSBjdXJiaXRzKSkgJiAweEZGRkZGOworICAgIH0KKyAgICBjdXJiaXRzICs9IDIwOworICAgIGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCk7CisKKyAgICBzaXplID0gKChzaXplMiArIGN1cmJpdHMgKyAzMSkgJiB+MzEpID4+IDM7CisgICAgaWYoY3VyID09IGMtPmZyYW1lc19ub3RlZCAmJiBjLT5mY291bnQpeworICAgICAgICBjLT5mcmFtZXNbY3VyXS5wb3MgPSBwb3M7CisgICAgICAgIGMtPmZyYW1lc1tjdXJdLnNpemUgPSBzaXplOworICAgICAgICBjLT5mcmFtZXNbY3VyXS5za2lwID0gY3VyYml0cyAtIDIwOworICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkocy0+c3RyZWFtc1swXSwgY3VyLCBjdXIsIHNpemUsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOworICAgICAgICBjLT5mcmFtZXNfbm90ZWQrKzsKKyAgICB9CisgICAgYy0+Y3VyYml0cyA9IChjdXJiaXRzICsgc2l6ZTIpICYgMHgxRjsKKworICAgIGlmICgocmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIHNpemUgKyA0KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGt0LT5kYXRhWzBdID0gY3VyYml0czsKKyAgICBwa3QtPmRhdGFbMV0gPSAoYy0+Y3VyZnJhbWUgPiBjLT5mY291bnQpICYmIGMtPmZjb3VudDsKKyAgICBwa3QtPmRhdGFbMl0gPSAwOworICAgIHBrdC0+ZGF0YVszXSA9IDA7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcGt0LT5wdHMgPSBjdXI7CisgICAgcmV0ID0gYXZpb19yZWFkKHMtPnBiLCBwa3QtPmRhdGEgKyA0LCBzaXplKTsKKyAgICBpZihjLT5jdXJiaXRzKQorICAgICAgICBhdmlvX3NlZWsocy0+cGIsIC00LCBTRUVLX0NVUik7CisgICAgaWYocmV0IDwgc2l6ZSl7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBwa3QtPnNpemUgPSByZXQgKyA0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBjX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1QQ0NvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmYy0+ZnJhbWVzKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBTZWVrIHRvIHRoZSBnaXZlbiBwb3NpdGlvbgorICogSWYgcG9zaXRpb24gaXMgdW5rbm93biBidXQgaXMgd2l0aGluIHRoZSBsaW1pdHMgb2YgZmlsZQorICogdGhlbiBwYWNrZXRzIGFyZSBza2lwcGVkIHVubGVzcyBkZXNpcmVkIHBvc2l0aW9uIGlzIHJlYWNoZWQKKyAqCisgKiBBbHNvIHRoaXMgZnVuY3Rpb24gbWFrZXMgdXNlIG9mIHRoZSBmYWN0IHRoYXQgdGltZXN0YW1wID09IGZyYW1lbm8KKyAqLworc3RhdGljIGludCBtcGNfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgTVBDQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlBhY2tldCBwa3QxLCAqcGt0ID0gJnBrdDE7CisgICAgaW50IHJldDsKKyAgICBpbnQgaW5kZXggPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHN0LCBGRk1BWCh0aW1lc3RhbXAgLSBERUxBWV9GUkFNRVMsIDApLCBmbGFncyk7CisgICAgdWludDMyX3QgbGFzdGZyYW1lOworCisgICAgLyogaWYgZm91bmQsIHNlZWsgdGhlcmUgKi8KKyAgICBpZiAoaW5kZXggPj0gMCAmJiBzdC0+aW5kZXhfZW50cmllc1tzdC0+bmJfaW5kZXhfZW50cmllcy0xXS50aW1lc3RhbXAgPj0gdGltZXN0YW1wIC0gREVMQVlfRlJBTUVTKXsKKyAgICAgICAgYy0+Y3VyZnJhbWUgPSBzdC0+aW5kZXhfZW50cmllc1tpbmRleF0ucG9zOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogaWYgdGltZXN0YW1wIGlzIG91dCBvZiBib3VuZHMsIHJldHVybiBlcnJvciAqLworICAgIGlmKHRpbWVzdGFtcCA8IDAgfHwgdGltZXN0YW1wID49IGMtPmZjb3VudCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHRpbWVzdGFtcCAtPSBERUxBWV9GUkFNRVM7CisgICAgLyogc2VlayB0byB0aGUgZnVydGhlc3Qga25vd24gcG9zaXRpb24gYW5kIHJlYWQgcGFja2V0cyB1bnRpbAorICAgICAgIHdlIHJlYWNoIGRlc2lyZWQgcG9zaXRpb24gKi8KKyAgICBsYXN0ZnJhbWUgPSBjLT5jdXJmcmFtZTsKKyAgICBpZihjLT5mcmFtZXNfbm90ZWQpIGMtPmN1cmZyYW1lID0gYy0+ZnJhbWVzX25vdGVkIC0gMTsKKyAgICB3aGlsZShjLT5jdXJmcmFtZSA8IHRpbWVzdGFtcCl7CisgICAgICAgIHJldCA9IGF2X3JlYWRfZnJhbWUocywgcGt0KTsKKyAgICAgICAgaWYgKHJldCA8IDApeworICAgICAgICAgICAgYy0+Y3VyZnJhbWUgPSBsYXN0ZnJhbWU7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK0FWSW5wdXRGb3JtYXQgZmZfbXBjX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk11c2VwYWNrIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1QQ0NvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IG1wY19wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBtcGNfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gbXBjX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IG1wY19yZWFkX2Nsb3NlLAorICAgIC5yZWFkX3NlZWsgICAgICA9IG1wY19yZWFkX3NlZWssCisgICAgLmV4dGVuc2lvbnMgICAgID0gIm1wYyIsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L21wYzguYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGM4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1ZGMyNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGM4LmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBNdXNlcGFjayBTVjggZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3VuYXJ5LmgiCisjaW5jbHVkZSAiYXBldGFnLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKworLy8vIFR3by1ieXRlIE1QQyB0YWcKKyNkZWZpbmUgTUtNUENUQUcoYSwgYikgKGEgfCAoYiA8PCA4KSkKKworI2RlZmluZSBUQUdfTVBDSyBNS1RBRygnTScsJ1AnLCdDJywnSycpCisKKy8vLyBSZXNlcnZlZCBNUEMgdGFncworZW51bSBNUENQYWNrZXRUYWdzeworICAgIFRBR19TVFJFQU1IRFIgICA9IE1LTVBDVEFHKCdTJywnSCcpLAorICAgIFRBR19TVFJFQU1FTkQgICA9IE1LTVBDVEFHKCdTJywnRScpLAorCisgICAgVEFHX0FVRElPUEFDS0VUID0gTUtNUENUQUcoJ0EnLCdQJyksCisKKyAgICBUQUdfU0VFS1RCTE9GRiAgPSBNS01QQ1RBRygnUycsJ08nKSwKKyAgICBUQUdfU0VFS1RBQkxFICAgPSBNS01QQ1RBRygnUycsJ1QnKSwKKworICAgIFRBR19SRVBMQVlHQUlOICA9IE1LTVBDVEFHKCdSJywnRycpLAorICAgIFRBR19FTkNJTkZPICAgICA9IE1LTVBDVEFHKCdFJywnSScpLAorfTsKKworc3RhdGljIGNvbnN0IGludCBtcGM4X3JhdGVbOF0gPSB7IDQ0MTAwLCA0ODAwMCwgMzc4MDAsIDMyMDAwLCAtMSwgLTEsIC0xLCAtMSB9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHZlcjsKKyAgICBpbnQ2NF90IGhlYWRlcl9wb3M7CisgICAgaW50NjRfdCBzYW1wbGVzOworCisgICAgaW50NjRfdCBhcGV0YWdfc3RhcnQ7Cit9IE1QQ0NvbnRleHQ7CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBic19nZXRfdihjb25zdCB1aW50OF90ICoqYnMpCit7CisgICAgaW50NjRfdCB2ID0gMDsKKyAgICBpbnQgYnIgPSAwOworICAgIGludCBjOworCisgICAgZG8geworICAgICAgICBjID0gKipiczsgKCpicykrKzsKKyAgICAgICAgdiA8PD0gNzsKKyAgICAgICAgdiB8PSBjICYgMHg3RjsKKyAgICAgICAgYnIrKzsKKyAgICAgICAgaWYgKGJyID4gMTApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSB3aGlsZSAoYyAmIDB4ODApOworCisgICAgcmV0dXJuIHYgLSBicjsKK30KKworc3RhdGljIGludCBtcGM4X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJzID0gcC0+YnVmICsgNDsKKyAgICBjb25zdCB1aW50OF90ICpic19lbmQgPSBicyArIHAtPmJ1Zl9zaXplOworICAgIGludDY0X3Qgc2l6ZTsKKworICAgIGlmIChwLT5idWZfc2l6ZSA8IDE2KQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoQVZfUkwzMihwLT5idWYpICE9IFRBR19NUENLKQorICAgICAgICByZXR1cm4gMDsKKyAgICB3aGlsZSAoYnMgPCBic19lbmQgKyAzKSB7CisgICAgICAgIGludCBoZWFkZXJfZm91bmQgPSAoYnNbMF0gPT0gJ1MnICYmIGJzWzFdID09ICdIJyk7CisgICAgICAgIGlmIChic1swXSA8ICdBJyB8fCBic1swXSA+ICdaJyB8fCBic1sxXSA8ICdBJyB8fCBic1sxXSA+ICdaJykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBicyArPSAyOworICAgICAgICBzaXplID0gYnNfZ2V0X3YoJmJzKTsKKyAgICAgICAgaWYgKHNpemUgPCAyKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChicyArIHNpemUgLSAyID49IGJzX2VuZCkKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAtIDE7IC8vIHNlZW1zIHRvIGJlIHZhbGlkIE1QQyBidXQgbm8gaGVhZGVyIHlldAorICAgICAgICBpZiAoaGVhZGVyX2ZvdW5kKSB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDExIHx8IHNpemUgPiAyOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICghQVZfUkwzMihicykpIC8vemVybyBDUkMgaXMgaW52YWxpZAorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnMgKz0gc2l6ZSAtIDI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBnYl9nZXRfdihHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQ2NF90IHYgPSAwOworICAgIGludCBiaXRzID0gMDsKKyAgICB3aGlsZShnZXRfYml0czEoZ2IpICYmIGJpdHMgPCA2NC03KXsKKyAgICAgICAgdiA8PD0gNzsKKyAgICAgICAgdiB8PSBnZXRfYml0cyhnYiwgNyk7CisgICAgICAgIGJpdHMgKz0gNzsKKyAgICB9CisgICAgdiA8PD0gNzsKKyAgICB2IHw9IGdldF9iaXRzKGdiLCA3KTsKKworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgdm9pZCBtcGM4X2dldF9jaHVua19oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCBpbnQgKnRhZywgaW50NjRfdCAqc2l6ZSkKK3sKKyAgICBpbnQ2NF90IHBvczsKKyAgICBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgICp0YWcgPSBhdmlvX3JsMTYocGIpOworICAgICpzaXplID0gZmZpb19yZWFkX3ZhcmxlbihwYik7CisgICAgKnNpemUgLT0gYXZpb190ZWxsKHBiKSAtIHBvczsKK30KKworc3RhdGljIHZvaWQgbXBjOF9wYXJzZV9zZWVrdGFibGUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IG9mZikKK3sKKyAgICBNUENDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCB0YWc7CisgICAgaW50NjRfdCBzaXplLCBwb3MsIHBwb3NbMl07CisgICAgdWludDhfdCAqYnVmOworICAgIGludCBpLCB0LCBzZWVrZCwgcmV0OworICAgIEdldEJpdENvbnRleHQgZ2I7CisKKyAgICBpZiAocy0+bmJfc3RyZWFtcyA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyBzdHJlYW0gYWRkZWQgYmVmb3JlIHBhcnNpbmcgc2VlayB0YWJsZVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdmlvX3NlZWsocy0+cGIsIG9mZiwgU0VFS19TRVQpOworICAgIG1wYzhfZ2V0X2NodW5rX2hlYWRlcihzLT5wYiwgJnRhZywgJnNpemUpOworICAgIGlmKHRhZyAhPSBUQUdfU0VFS1RBQkxFKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vIHNlZWsgdGFibGUgYXQgZ2l2ZW4gcG9zaXRpb25cbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzaXplID4gSU5UX01BWC8xMCB8fCBzaXplPD0wKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJCYWQgc2VlayB0YWJsZSBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZighKGJ1ZiA9IGF2X21hbGxvYyhzaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkpKQorICAgICAgICByZXR1cm47CisgICAgcmV0ID0gYXZpb19yZWFkKHMtPnBiLCBidWYsIHNpemUpOworICAgIGlmIChyZXQgIT0gc2l6ZSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAic2VlayB0YWJsZSB0cnVuY2F0ZWRcbiIpOworICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtc2V0KGJ1ZitzaXplLCAwLCBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIHNpemUgKiA4KTsKKyAgICBzaXplID0gZ2JfZ2V0X3YoJmdiKTsKKyAgICBpZihzaXplID4gVUlOVF9NQVgvNCB8fCBzaXplID4gYy0+c2FtcGxlcy8xMTUyKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlNlZWsgdGFibGUgaXMgdG9vIGJpZ1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2Vla2QgPSBnZXRfYml0cygmZ2IsIDQpOworICAgIGZvcihpID0gMDsgaSA8IDI7IGkrKyl7CisgICAgICAgIHBvcyA9IGdiX2dldF92KCZnYikgKyBjLT5oZWFkZXJfcG9zOworICAgICAgICBwcG9zWzEgLSBpXSA9IHBvczsKKyAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHMtPnN0cmVhbXNbMF0sIHBvcywgaSwgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgfQorICAgIGZvcig7IGkgPCBzaXplOyBpKyspeworICAgICAgICB0ID0gZ2V0X3VuYXJ5KCZnYiwgMSwgMzMpIDw8IDEyOworICAgICAgICB0ICs9IGdldF9iaXRzKCZnYiwgMTIpOworICAgICAgICBpZih0ICYgMSkKKyAgICAgICAgICAgIHQgPSAtKHQgJiB+MSk7CisgICAgICAgIHBvcyA9ICh0ID4+IDEpICsgcHBvc1swXSoyIC0gcHBvc1sxXTsKKyAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHMtPnN0cmVhbXNbMF0sIHBvcywgaSA8PCBzZWVrZCwgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgICAgIHBwb3NbMV0gPSBwcG9zWzBdOworICAgICAgICBwcG9zWzBdID0gcG9zOworICAgIH0KKyAgICBhdl9mcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzhfaGFuZGxlX2NodW5rKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHRhZywgaW50NjRfdCBjaHVua19wb3MsIGludDY0X3Qgc2l6ZSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQ2NF90IHBvcywgb2ZmOworCisgICAgc3dpdGNoKHRhZyl7CisgICAgY2FzZSBUQUdfU0VFS1RCTE9GRjoKKyAgICAgICAgcG9zID0gYXZpb190ZWxsKHBiKSArIHNpemU7CisgICAgICAgIG9mZiA9IGZmaW9fcmVhZF92YXJsZW4ocGIpOworICAgICAgICBtcGM4X3BhcnNlX3NlZWt0YWJsZShzLCBjaHVua19wb3MgKyBvZmYpOworICAgICAgICBhdmlvX3NlZWsocGIsIHBvcywgU0VFS19TRVQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgIH0KK30KKworc3RhdGljIGludCBtcGM4X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNUENDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgdGFnID0gMDsKKyAgICBpbnQ2NF90IHNpemUsIHBvczsKKworICAgIGMtPmhlYWRlcl9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGlmKGF2aW9fcmwzMihwYikgIT0gVEFHX01QQ0speworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm90IGEgTXVzZXBhY2s4IGZpbGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB3aGlsZSghYXZpb19mZW9mKHBiKSl7CisgICAgICAgIHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIG1wYzhfZ2V0X2NodW5rX2hlYWRlcihwYiwgJnRhZywgJnNpemUpOworICAgICAgICBpZih0YWcgPT0gVEFHX1NUUkVBTUhEUikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBtcGM4X2hhbmRsZV9jaHVuayhzLCB0YWcsIHBvcywgc2l6ZSk7CisgICAgfQorICAgIGlmKHRhZyAhPSBUQUdfU1RSRUFNSERSKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlN0cmVhbSBoZWFkZXIgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb19za2lwKHBiLCA0KTsgLy9DUkMKKyAgICBjLT52ZXIgPSBhdmlvX3I4KHBiKTsKKyAgICBpZihjLT52ZXIgIT0gOCl7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmtub3duIHN0cmVhbSB2ZXJzaW9uICVkXG4iLCBjLT52ZXIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIGMtPnNhbXBsZXMgPSBmZmlvX3JlYWRfdmFybGVuKHBiKTsKKyAgICBmZmlvX3JlYWRfdmFybGVuKHBiKTsgLy9zaWxlbmNlIHNhbXBsZXMgYXQgdGhlIGJlZ2lubmluZworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NVVNFUEFDSzg7CisgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKKworICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIDIpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAoc3QtPmNvZGVjLT5leHRyYWRhdGFbMV0gPj4gNCkgKyAxOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBtcGM4X3JhdGVbc3QtPmNvZGVjLT5leHRyYWRhdGFbMF0gPj4gNV07CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDExNTIgIDw8IChzdC0+Y29kZWMtPmV4dHJhZGF0YVsxXSYzKSoyLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBzdC0+c3RhcnRfdGltZSA9IDA7CisgICAgc3QtPmR1cmF0aW9uID0gYy0+c2FtcGxlcyAvICgxMTUyIDw8IChzdC0+Y29kZWMtPmV4dHJhZGF0YVsxXSYzKSoyKTsKKyAgICBzaXplIC09IGF2aW9fdGVsbChwYikgLSBwb3M7CisgICAgaWYgKHNpemUgPiAwKQorICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworCisgICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgIGMtPmFwZXRhZ19zdGFydCA9IGZmX2FwZV9wYXJzZV90YWcocyk7CisgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBjOF9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTVBDQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgdGFnOworICAgIGludDY0X3QgcG9zLCBzaXplOworCisgICAgd2hpbGUoIWF2aW9fZmVvZihzLT5wYikpeworICAgICAgICBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworCisgICAgICAgIC8qIGRvbid0IHJldHVybiBib2d1cyBwYWNrZXRzIHdpdGggdGhlIGFwZSB0YWcgZGF0YSAqLworICAgICAgICBpZiAoYy0+YXBldGFnX3N0YXJ0ICYmIHBvcyA+PSBjLT5hcGV0YWdfc3RhcnQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICAgICAgbXBjOF9nZXRfY2h1bmtfaGVhZGVyKHMtPnBiLCAmdGFnLCAmc2l6ZSk7CisgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYodGFnID09IFRBR19BVURJT1BBQ0tFVCl7CisgICAgICAgICAgICBpZihhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiAgICAgPSAxOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYodGFnID09IFRBR19TVFJFQU1FTkQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICBtcGM4X2hhbmRsZV9jaHVuayhzLCB0YWcsIHBvcywgc2l6ZSk7CisgICAgfQorICAgIHJldHVybiBBVkVSUk9SX0VPRjsKK30KKworc3RhdGljIGludCBtcGM4X3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgIGludCBpbmRleCA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QsIHRpbWVzdGFtcCwgZmxhZ3MpOworCisgICAgaWYoaW5kZXggPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgc3QtPmluZGV4X2VudHJpZXNbaW5kZXhdLnBvcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGZmX3VwZGF0ZV9jdXJfZHRzKHMsIHN0LCBzdC0+aW5kZXhfZW50cmllc1tpbmRleF0udGltZXN0YW1wKTsKKyAgICByZXR1cm4gMDsKK30KKworCitBVklucHV0Rm9ybWF0IGZmX21wYzhfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXBjOCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk11c2VwYWNrIFNWOCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNUENDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBtcGM4X3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IG1wYzhfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gbXBjOF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSBtcGM4X3JlYWRfc2VlaywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbXBlZy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21wZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjdhM2MyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21wZWcuYwpAQCAtMCwwICsxLDEwMDEgQEAKKy8qCisgKiBNUEVHMS8yIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtcGVnLmgiCisKKyNpZiBDT05GSUdfVk9CU1VCX0RFTVVYRVIKKyMgaW5jbHVkZSAic3VidGl0bGVzLmgiCisjIGluY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNlbmRpZgorCisjdW5kZWYgTkRFQlVHCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkZW11eCBjb2RlICovCisKKyNkZWZpbmUgTUFYX1NZTkNfU0laRSAxMDAwMDAKKworc3RhdGljIGludCBjaGVja19wZXMoY29uc3QgdWludDhfdCAqcCwgY29uc3QgdWludDhfdCAqZW5kKQoreworICAgIGludCBwZXMxOworICAgIGludCBwZXMyID0gKHBbM10gJiAweEMwKSA9PSAweDgwICYmCisgICAgICAgICAgICAgICAocFs0XSAmIDB4QzApICE9IDB4NDAgJiYKKyAgICAgICAgICAgICAgICgocFs0XSAmIDB4QzApID09IDB4MDAgfHwKKyAgICAgICAgICAgICAgICAocFs0XSAmIDB4QzApID4+IDIgPT0gKHBbNl0gJiAweEYwKSk7CisKKyAgICBmb3IgKHAgKz0gMzsgcCA8IGVuZCAmJiAqcCA9PSAweEZGOyBwKyspIDsKKyAgICBpZiAoKCpwICYgMHhDMCkgPT0gMHg0MCkKKyAgICAgICAgcCArPSAyOworCisgICAgaWYgKCgqcCAmIDB4RjApID09IDB4MjApCisgICAgICAgIHBlczEgPSBwWzBdICYgcFsyXSAmIHBbNF0gJiAxOworICAgIGVsc2UgaWYgKCgqcCAmIDB4RjApID09IDB4MzApCisgICAgICAgIHBlczEgPSBwWzBdICYgcFsyXSAmIHBbNF0gJiBwWzVdICYgcFs3XSAmIHBbOV0gJiAxOworICAgIGVsc2UKKyAgICAgICAgcGVzMSA9ICpwID09IDB4MEY7CisKKyAgICByZXR1cm4gcGVzMSB8fCBwZXMyOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BhY2tfaGVhZGVyKGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJ1ZlsxXSAmIDB4QzApID09IDB4NDAgfHwgKGJ1ZlsxXSAmIDB4RjApID09IDB4MjA7Cit9CisKK3N0YXRpYyBpbnQgbXBlZ3BzX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIHVpbnQzMl90IGNvZGUgPSAtMTsKKyAgICBpbnQgaTsKKyAgICBpbnQgc3lzID0gMCwgcHNwYWNrID0gMCwgcHJpdjEgPSAwLCB2aWQgPSAwOworICAgIGludCBhdWRpbyA9IDAsIGludmFsaWQgPSAwLCBzY29yZSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+YnVmX3NpemU7IGkrKykgeworICAgICAgICBjb2RlID0gKGNvZGUgPDwgOCkgKyBwLT5idWZbaV07CisgICAgICAgIGlmICgoY29kZSAmIDB4ZmZmZmZmMDApID09IDB4MTAwKSB7CisgICAgICAgICAgICBpbnQgbGVuICA9IHAtPmJ1ZltpICsgMV0gPDwgOCB8IHAtPmJ1ZltpICsgMl07CisgICAgICAgICAgICBpbnQgcGVzICA9IGNoZWNrX3BlcyhwLT5idWYgKyBpLCBwLT5idWYgKyBwLT5idWZfc2l6ZSk7CisgICAgICAgICAgICBpbnQgcGFjayA9IGNoZWNrX3BhY2tfaGVhZGVyKHAtPmJ1ZiArIGkpOworCisgICAgICAgICAgICBpZiAoY29kZSA9PSBTWVNURU1fSEVBREVSX1NUQVJUX0NPREUpCisgICAgICAgICAgICAgICAgc3lzKys7CisgICAgICAgICAgICBlbHNlIGlmIChjb2RlID09IFBBQ0tfU1RBUlRfQ09ERSAmJiBwYWNrKQorICAgICAgICAgICAgICAgIHBzcGFjaysrOworICAgICAgICAgICAgZWxzZSBpZiAoKGNvZGUgJiAweGYwKSA9PSBWSURFT19JRCAmJiBwZXMpCisgICAgICAgICAgICAgICAgdmlkKys7CisgICAgICAgICAgICAvLyBza2lwIHBlcyBwYXlsb2FkIHRvIGF2b2lkIHN0YXJ0IGNvZGUgZW11bGF0aW9uIGZvciBwcml2YXRlCisgICAgICAgICAgICAvLyBhbmQgYXVkaW8gc3RyZWFtcworICAgICAgICAgICAgZWxzZSBpZiAoKGNvZGUgJiAweGUwKSA9PSBBVURJT19JRCAmJiAgcGVzKSB7YXVkaW8rKzsgaSs9bGVuO30KKyAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gUFJJVkFURV9TVFJFQU1fMSAgJiYgIHBlcykge3ByaXYxKys7IGkrPWxlbjt9CisgICAgICAgICAgICBlbHNlIGlmIChjb2RlID09IDB4MWZkICAgICAgICAgICAgICYmICBwZXMpIHZpZCsrOyAvL1ZDMQorCisgICAgICAgICAgICBlbHNlIGlmICgoY29kZSAmIDB4ZjApID09IFZJREVPX0lEICYmICFwZXMpIGludmFsaWQrKzsKKyAgICAgICAgICAgIGVsc2UgaWYgKChjb2RlICYgMHhlMCkgPT0gQVVESU9fSUQgJiYgIXBlcykgaW52YWxpZCsrOworICAgICAgICAgICAgZWxzZSBpZiAoY29kZSA9PSBQUklWQVRFX1NUUkVBTV8xICAmJiAhcGVzKSBpbnZhbGlkKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmlkICsgYXVkaW8gPiBpbnZhbGlkICsgMSkgLyogaW52YWxpZCBWRFIgZmlsZXMgbmQgc2hvcnQgUEVTIHN0cmVhbXMgKi8KKyAgICAgICAgc2NvcmUgPSBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDI7CisKKyAgICBpZiAoc3lzID4gaW52YWxpZCAmJiBzeXMgKiA5IDw9IHBzcGFjayAqIDEwKQorICAgICAgICByZXR1cm4gKGF1ZGlvID4gMTIgfHwgdmlkID4gMyB8fCBwc3BhY2sgPiAyKSA/IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIC8gMiArIDE7IC8vIDEgbW9yZSB0aGFuIG1wMworICAgIGlmIChwc3BhY2sgPiBpbnZhbGlkICYmIChwcml2MSArIHZpZCArIGF1ZGlvKSAqIDEwID49IHBzcGFjayAqIDkpCisgICAgICAgIHJldHVybiBwc3BhY2sgPiAyID8gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLyAyOyAvLyAxIG1vcmUgdGhhbiAubXBnCisgICAgaWYgKCghIXZpZCBeICEhYXVkaW8pICYmIChhdWRpbyA+IDQgfHwgdmlkID4gMSkgJiYgIXN5cyAmJgorICAgICAgICAhcHNwYWNrICYmIHAtPmJ1Zl9zaXplID4gMjA0OCAmJiB2aWQgKyBhdWRpbyA+IGludmFsaWQpIC8qIFBFUyBzdHJlYW0gKi8KKyAgICAgICAgcmV0dXJuIChhdWRpbyA+IDEyIHx8IHZpZCA+IDMgKyAyICogaW52YWxpZCkgPyBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDI7CisKKyAgICAvLyAwMi1QZW5ndWluLmZsYWMgaGFzIHN5czowIHByaXYxOjAgcHNwYWNrOjAgdmlkOjAgYXVkaW86MQorICAgIC8vIG1wM19taXNpZGVudGlmaWVkXzIubXAzIGhhcyBzeXM6MCBwcml2MTowIHBzcGFjazowIHZpZDowIGF1ZGlvOjYKKyAgICAvLyBIYXZlXCBZb3Vyc2VsZlwgYVwgTWVycnlcIExpdHRsZVwgQ2hyaXN0bWFzLm1wMyAwIDAgMCA1IDAgMSBsZW46MjE2MTgKKyAgICByZXR1cm4gc2NvcmU7Cit9CisKK3R5cGVkZWYgc3RydWN0IE1wZWdEZW11eENvbnRleHQgeworICAgIGludDMyX3QgaGVhZGVyX3N0YXRlOworICAgIHVuc2lnbmVkIGNoYXIgcHNtX2VzX3R5cGVbMjU2XTsKKyAgICBpbnQgc29mZGVjOworICAgIGludCBkdmQ7CisgICAgaW50IGlta2hfY2N0djsKKyNpZiBDT05GSUdfVk9CU1VCX0RFTVVYRVIKKyAgICBBVkZvcm1hdENvbnRleHQgKnN1Yl9jdHg7CisgICAgRkZEZW11eFN1YnRpdGxlc1F1ZXVlIHFbMzJdOworI2VuZGlmCit9IE1wZWdEZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgbXBlZ3BzX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNcGVnRGVtdXhDb250ZXh0ICptID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgYnVmZmVyWzddOworICAgIGludDY0X3QgbGFzdF9wb3MgPSBhdmlvX3RlbGwocy0+cGIpOworCisgICAgbS0+aGVhZGVyX3N0YXRlID0gMHhmZjsKKyAgICBzLT5jdHhfZmxhZ3MgICB8PSBBVkZNVENUWF9OT0hFQURFUjsKKworICAgIGF2aW9fZ2V0X3N0cihzLT5wYiwgNiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgaWYgKCFtZW1jbXAoIklNS0giLCBidWZmZXIsIDQpKSB7CisgICAgICAgIG0tPmlta2hfY2N0diA9IDE7CisgICAgfSBlbHNlIGlmICghbWVtY21wKCJTb2ZkZWMiLCBidWZmZXIsIDYpKSB7CisgICAgICAgIG0tPnNvZmRlYyA9IDE7CisgICAgfSBlbHNlCisgICAgICAgYXZpb19zZWVrKHMtPnBiLCBsYXN0X3BvcywgU0VFS19TRVQpOworCisgICAgLyogbm8gbmVlZCB0byBkbyBtb3JlICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldF9wdHMoQVZJT0NvbnRleHQgKnBiLCBpbnQgYykKK3sKKyAgICB1aW50OF90IGJ1Zls1XTsKKworICAgIGJ1ZlswXSA9IGMgPCAwID8gYXZpb19yOChwYikgOiBjOworICAgIGF2aW9fcmVhZChwYiwgYnVmICsgMSwgNCk7CisKKyAgICByZXR1cm4gZmZfcGFyc2VfcGVzX3B0cyhidWYpOworfQorCitzdGF0aWMgaW50IGZpbmRfbmV4dF9zdGFydF9jb2RlKEFWSU9Db250ZXh0ICpwYiwgaW50ICpzaXplX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqaGVhZGVyX3N0YXRlKQoreworICAgIHVuc2lnbmVkIGludCBzdGF0ZSwgdjsKKyAgICBpbnQgdmFsLCBuOworCisgICAgc3RhdGUgPSAqaGVhZGVyX3N0YXRlOworICAgIG4gICAgID0gKnNpemVfcHRyOworICAgIHdoaWxlIChuID4gMCkgeworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB2ID0gYXZpb19yOChwYik7CisgICAgICAgIG4tLTsKKyAgICAgICAgaWYgKHN0YXRlID09IDB4MDAwMDAxKSB7CisgICAgICAgICAgICBzdGF0ZSA9ICgoc3RhdGUgPDwgOCkgfCB2KSAmIDB4ZmZmZmZmOworICAgICAgICAgICAgdmFsICAgPSBzdGF0ZTsKKyAgICAgICAgICAgIGdvdG8gZm91bmQ7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUgPSAoKHN0YXRlIDw8IDgpIHwgdikgJiAweGZmZmZmZjsKKyAgICB9CisgICAgdmFsID0gLTE7CisKK2ZvdW5kOgorICAgICpoZWFkZXJfc3RhdGUgPSBzdGF0ZTsKKyAgICAqc2l6ZV9wdHIgICAgID0gbjsKKyAgICByZXR1cm4gdmFsOworfQorCisvKioKKyAqIEV4dHJhY3Qgc3RyZWFtIHR5cGVzIGZyb20gYSBwcm9ncmFtIHN0cmVhbSBtYXAKKyAqIEFjY29yZGluZyB0byBJU08vSUVDIDEzODE4LTEgKCdNUEVHLTIgU3lzdGVtcycpIHRhYmxlIDItMzUKKyAqCisgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSBQU00gaW4gdGhlIGJpdHN0cmVhbQorICovCitzdGF0aWMgbG9uZyBtcGVncHNfcHNtX3BhcnNlKE1wZWdEZW11eENvbnRleHQgKm0sIEFWSU9Db250ZXh0ICpwYikKK3sKKyAgICBpbnQgcHNtX2xlbmd0aCwgcHNfaW5mb19sZW5ndGgsIGVzX21hcF9sZW5ndGg7CisKKyAgICBwc21fbGVuZ3RoID0gYXZpb19yYjE2KHBiKTsKKyAgICBhdmlvX3I4KHBiKTsKKyAgICBhdmlvX3I4KHBiKTsKKyAgICBwc19pbmZvX2xlbmd0aCA9IGF2aW9fcmIxNihwYik7CisKKyAgICAvKiBza2lwIHByb2dyYW1fc3RyZWFtX2luZm8gKi8KKyAgICBhdmlvX3NraXAocGIsIHBzX2luZm9fbGVuZ3RoKTsKKyAgICBlc19tYXBfbGVuZ3RoID0gYXZpb19yYjE2KHBiKTsKKyAgICAvKiBJZ25vcmUgZXNfbWFwX2xlbmd0aCwgdHJ1c3QgcHNtX2xlbmd0aCAqLworICAgIGVzX21hcF9sZW5ndGggPSBwc21fbGVuZ3RoIC0gcHNfaW5mb19sZW5ndGggLSAxMDsKKworICAgIC8qIGF0IGxlYXN0IG9uZSBlcyBhdmFpbGFibGU/ICovCisgICAgd2hpbGUgKGVzX21hcF9sZW5ndGggPj0gNCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGUgICAgICA9IGF2aW9fcjgocGIpOworICAgICAgICB1bnNpZ25lZCBjaGFyIGVzX2lkICAgICA9IGF2aW9fcjgocGIpOworICAgICAgICB1aW50MTZfdCBlc19pbmZvX2xlbmd0aCA9IGF2aW9fcmIxNihwYik7CisKKyAgICAgICAgLyogcmVtZW1iZXIgbWFwcGluZyBmcm9tIHN0cmVhbSBpZCB0byBzdHJlYW0gdHlwZSAqLworICAgICAgICBtLT5wc21fZXNfdHlwZVtlc19pZF0gPSB0eXBlOworICAgICAgICAvKiBza2lwIHByb2dyYW1fc3RyZWFtX2luZm8gKi8KKyAgICAgICAgYXZpb19za2lwKHBiLCBlc19pbmZvX2xlbmd0aCk7CisgICAgICAgIGVzX21hcF9sZW5ndGggLT0gNCArIGVzX2luZm9fbGVuZ3RoOworICAgIH0KKyAgICBhdmlvX3JiMzIocGIpOyAvKiBjcmMzMiAqLworICAgIHJldHVybiAyICsgcHNtX2xlbmd0aDsKK30KKworLyogcmVhZCB0aGUgbmV4dCBQRVMgaGVhZGVyLiBSZXR1cm4gaXRzIHBvc2l0aW9uIGluIHBwb3MKKyAqIChpZiBub3QgTlVMTCksIGFuZCBpdHMgc3RhcnQgY29kZSwgcHRzIGFuZCBkdHMuCisgKi8KK3N0YXRpYyBpbnQgbXBlZ3BzX3JlYWRfcGVzX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqcHBvcywgaW50ICpwc3RhcnRfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpwcHRzLCBpbnQ2NF90ICpwZHRzKQoreworICAgIE1wZWdEZW11eENvbnRleHQgKm0gPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGxlbiwgc2l6ZSwgc3RhcnRjb2RlLCBjLCBmbGFncywgaGVhZGVyX2xlbjsKKyAgICBpbnQgcGVzX2V4dCwgZXh0Ml9sZW4sIGlkX2V4dCwgc2tpcDsKKyAgICBpbnQ2NF90IHB0cywgZHRzOworICAgIGludDY0X3QgbGFzdF9zeW5jID0gYXZpb190ZWxsKHMtPnBiKTsKKworZXJyb3JfcmVkbzoKKyAgICBhdmlvX3NlZWsocy0+cGIsIGxhc3Rfc3luYywgU0VFS19TRVQpOworcmVkbzoKKyAgICAvKiBuZXh0IHN0YXJ0IGNvZGUgKHNob3VsZCBiZSBpbW1lZGlhdGVseSBhZnRlcikgKi8KKyAgICBtLT5oZWFkZXJfc3RhdGUgPSAweGZmOworICAgIHNpemUgICAgICA9IE1BWF9TWU5DX1NJWkU7CisgICAgc3RhcnRjb2RlID0gZmluZF9uZXh0X3N0YXJ0X2NvZGUocy0+cGIsICZzaXplLCAmbS0+aGVhZGVyX3N0YXRlKTsKKyAgICBsYXN0X3N5bmMgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIGlmIChzdGFydGNvZGUgPCAwKSB7CisgICAgICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAvLyBGSVhNRSB3ZSBzaG91bGQgcmVtZW1iZXIgaGVhZGVyX3N0YXRlCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgfQorCisgICAgaWYgKHN0YXJ0Y29kZSA9PSBQQUNLX1NUQVJUX0NPREUpCisgICAgICAgIGdvdG8gcmVkbzsKKyAgICBpZiAoc3RhcnRjb2RlID09IFNZU1RFTV9IRUFERVJfU1RBUlRfQ09ERSkKKyAgICAgICAgZ290byByZWRvOworICAgIGlmIChzdGFydGNvZGUgPT0gUEFERElOR19TVFJFQU0pIHsKKyAgICAgICAgYXZpb19za2lwKHMtPnBiLCBhdmlvX3JiMTYocy0+cGIpKTsKKyAgICAgICAgZ290byByZWRvOworICAgIH0KKyAgICBpZiAoc3RhcnRjb2RlID09IFBSSVZBVEVfU1RSRUFNXzIpIHsKKyAgICAgICAgaWYgKCFtLT5zb2ZkZWMpIHsKKyAgICAgICAgICAgIC8qIE5lZWQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhpcyBmcm9tIGEgRFZEIG9yIGEgJ1NvZmRlYycgc3RyZWFtICovCisgICAgICAgICAgICBpbnQgbGVuID0gYXZpb19yYjE2KHMtPnBiKTsKKyAgICAgICAgICAgIGludCBieXRlc3JlYWQgPSAwOworICAgICAgICAgICAgdWludDhfdCAqcHMyYnVmID0gYXZfbWFsbG9jKGxlbik7CisKKyAgICAgICAgICAgIGlmIChwczJidWYpIHsKKyAgICAgICAgICAgICAgICBieXRlc3JlYWQgPSBhdmlvX3JlYWQocy0+cGIsIHBzMmJ1ZiwgbGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChieXRlc3JlYWQgIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgbGVuIC0gYnl0ZXNyZWFkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+PSA2KQorICAgICAgICAgICAgICAgICAgICAgICAgcCA9IG1lbWNocihwczJidWYsICdTJywgbGVuIC0gNSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHApCisgICAgICAgICAgICAgICAgICAgICAgICBtLT5zb2ZkZWMgPSAhbWVtY21wKHArMSwgIm9mZGVjIiwgNSk7CisKKyAgICAgICAgICAgICAgICAgICAgbS0+c29mZGVjIC09ICFtLT5zb2ZkZWM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG0tPnNvZmRlYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gOTgwICAmJiBwczJidWZbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDSSBzdHJ1Y3R1cmU/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRwdHMgPSBBVl9SQjMyKHBzMmJ1ZiArIDB4MGQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVuZHB0cyA9IEFWX1JCMzIocHMyYnVmICsgMHgxMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBob3VycyA9ICgocHMyYnVmWzB4MTldID4+IDQpICogMTApICsgKHBzMmJ1ZlsweDE5XSAmIDB4MGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWlucyAgPSAoKHBzMmJ1ZlsweDFhXSA+PiA0KSAqIDEwKSArIChwczJidWZbMHgxYV0gJiAweDBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlY3MgID0gKChwczJidWZbMHgxYl0gPj4gNCkgKiAxMCkgKyAocHMyYnVmWzB4MWJdICYgMHgwZik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5kdmQgPSAoaG91cnMgPD0gMjMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlucyAgPD0gNTkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjcyAgPD0gNTkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBzMmJ1ZlsweDE5XSAmIDB4MGYpIDwgMTAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBzMmJ1ZlsweDFhXSAmIDB4MGYpIDwgMTAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBzMmJ1ZlsweDFiXSAmIDB4MGYpIDwgMTAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHRzID49IHN0YXJ0cHRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuID09IDEwMTggJiYgcHMyYnVmWzBdID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEU0kgc3RydWN0dXJlPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaG91cnMgPSAoKHBzMmJ1ZlsweDFkXSA+PiA0KSAqIDEwKSArIChwczJidWZbMHgxZF0gJiAweDBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1pbnMgID0gKChwczJidWZbMHgxZV0gPj4gNCkgKiAxMCkgKyAocHMyYnVmWzB4MWVdICYgMHgwZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZWNzICA9ICgocHMyYnVmWzB4MWZdID4+IDQpICogMTApICsgKHBzMmJ1ZlsweDFmXSAmIDB4MGYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+ZHZkID0gKGhvdXJzIDw9IDIzICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnMgIDw9IDU5ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3MgIDw9IDU5ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwczJidWZbMHgxZF0gJiAweDBmKSA8IDEwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwczJidWZbMHgxZV0gJiAweDBmKSA8IDEwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwczJidWZbMHgxZl0gJiAweDBmKSA8IDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF2X2ZyZWUocHMyYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIElmIHRoaXMgaXNuJ3QgYSBEVkQgcGFja2V0IG9yIG5vIG1lbW9yeQorICAgICAgICAgICAgICAgICAqIGNvdWxkIGJlIGFsbG9jYXRlZCwganVzdCBpZ25vcmUgaXQuCisgICAgICAgICAgICAgICAgICogSWYgd2UgZGlkLCBtb3ZlIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICAgICAgICAgICAgICAgICAqIHBhY2tldCAocGx1cyAnbGVuZ3RoJyBmaWVsZCkgKi8KKyAgICAgICAgICAgICAgICBpZiAoIW0tPmR2ZCB8fCBhdmlvX3NraXAocy0+cGIsIC0obGVuICsgMikpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBTa2lwIGJhY2sgZmFpbGVkLgorICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIHBhY2tldCB3aWxsIGJlIGxvc3QgYnV0IHRoYXQgY2FuJ3QgYmUgaGVscGVkCisgICAgICAgICAgICAgICAgICAgICAqIGlmIHdlIGNhbid0IHNraXAgYmFjaworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byByZWRvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogTm8gbWVtb3J5ICovCisgICAgICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCBsZW4pOworICAgICAgICAgICAgICAgIGdvdG8gcmVkbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghbS0+ZHZkKSB7CisgICAgICAgICAgICBpbnQgbGVuID0gYXZpb19yYjE2KHMtPnBiKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgbGVuKTsKKyAgICAgICAgICAgIGdvdG8gcmVkbzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhcnRjb2RlID09IFBST0dSQU1fU1RSRUFNX01BUCkgeworICAgICAgICBtcGVncHNfcHNtX3BhcnNlKG0sIHMtPnBiKTsKKyAgICAgICAgZ290byByZWRvOworICAgIH0KKworICAgIC8qIGZpbmQgbWF0Y2hpbmcgc3RyZWFtICovCisgICAgaWYgKCEoKHN0YXJ0Y29kZSA+PSAweDFjMCAmJiBzdGFydGNvZGUgPD0gMHgxZGYpIHx8CisgICAgICAgICAgKHN0YXJ0Y29kZSA+PSAweDFlMCAmJiBzdGFydGNvZGUgPD0gMHgxZWYpIHx8CisgICAgICAgICAgKHN0YXJ0Y29kZSA9PSAweDFiZCkgfHwKKyAgICAgICAgICAoc3RhcnRjb2RlID09IFBSSVZBVEVfU1RSRUFNXzIpIHx8CisgICAgICAgICAgKHN0YXJ0Y29kZSA9PSAweDFmZCkpKQorICAgICAgICBnb3RvIHJlZG87CisgICAgaWYgKHBwb3MpIHsKKyAgICAgICAgKnBwb3MgPSBhdmlvX3RlbGwocy0+cGIpIC0gNDsKKyAgICB9CisgICAgbGVuID0gYXZpb19yYjE2KHMtPnBiKTsKKyAgICBwdHMgPQorICAgIGR0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIGlmIChzdGFydGNvZGUgIT0gUFJJVkFURV9TVFJFQU1fMikKKyAgICB7CisgICAgLyogc3R1ZmZpbmcgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChsZW4gPCAxKQorICAgICAgICAgICAgZ290byBlcnJvcl9yZWRvOworICAgICAgICBjID0gYXZpb19yOChzLT5wYik7CisgICAgICAgIGxlbi0tOworICAgICAgICAvKiBYWFg6IGZvciBtcGVnMSwgc2hvdWxkIHRlc3Qgb25seSBiaXQgNyAqLworICAgICAgICBpZiAoYyAhPSAweGZmKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgoYyAmIDB4YzApID09IDB4NDApIHsKKyAgICAgICAgLyogYnVmZmVyIHNjYWxlICYgc2l6ZSAqLworICAgICAgICBhdmlvX3I4KHMtPnBiKTsKKyAgICAgICAgYyAgICA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICBsZW4gLT0gMjsKKyAgICB9CisgICAgaWYgKChjICYgMHhlMCkgPT0gMHgyMCkgeworICAgICAgICBkdHMgID0KKyAgICAgICAgcHRzICA9IGdldF9wdHMocy0+cGIsIGMpOworICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgaWYgKGMgJiAweDEwKSB7CisgICAgICAgICAgICBkdHMgID0gZ2V0X3B0cyhzLT5wYiwgLTEpOworICAgICAgICAgICAgbGVuIC09IDU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChjICYgMHhjMCkgPT0gMHg4MCkgeworICAgICAgICAvKiBtcGVnIDIgUEVTICovCisgICAgICAgIGZsYWdzICAgICAgPSBhdmlvX3I4KHMtPnBiKTsKKyAgICAgICAgaGVhZGVyX2xlbiA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICBsZW4gICAgICAgLT0gMjsKKyAgICAgICAgaWYgKGhlYWRlcl9sZW4gPiBsZW4pCisgICAgICAgICAgICBnb3RvIGVycm9yX3JlZG87CisgICAgICAgIGxlbiAtPSBoZWFkZXJfbGVuOworICAgICAgICBpZiAoZmxhZ3MgJiAweDgwKSB7CisgICAgICAgICAgICBkdHMgICAgICAgICA9IHB0cyA9IGdldF9wdHMocy0+cGIsIC0xKTsKKyAgICAgICAgICAgIGhlYWRlcl9sZW4gLT0gNTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIDB4NDApIHsKKyAgICAgICAgICAgICAgICBkdHMgICAgICAgICA9IGdldF9wdHMocy0+cGIsIC0xKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJfbGVuIC09IDU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICYgMHgzZiAmJiBoZWFkZXJfbGVuID09IDApIHsKKyAgICAgICAgICAgIGZsYWdzICY9IDB4QzA7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJGdXJ0aGVyIGZsYWdzIHNldCBidXQgbm8gYnl0ZXMgbGVmdFxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICYgMHgwMSkgeyAvKiBQRVMgZXh0ZW5zaW9uICovCisgICAgICAgICAgICBwZXNfZXh0ID0gYXZpb19yOChzLT5wYik7CisgICAgICAgICAgICBoZWFkZXJfbGVuLS07CisgICAgICAgICAgICAvKiBTa2lwIFBFUyBwcml2YXRlIGRhdGEsIHByb2dyYW0gcGFja2V0IHNlcXVlbmNlIGNvdW50ZXIKKyAgICAgICAgICAgICAqIGFuZCBQLVNURCBidWZmZXIgKi8KKyAgICAgICAgICAgIHNraXAgID0gKHBlc19leHQgPj4gNCkgJiAweGI7CisgICAgICAgICAgICBza2lwICs9IHNraXAgJiAweDk7CisgICAgICAgICAgICBpZiAocGVzX2V4dCAmIDB4NDAgfHwgc2tpcCA+IGhlYWRlcl9sZW4pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJwZXNfZXh0ICVYIGlzIGludmFsaWRcbiIsIHBlc19leHQpOworICAgICAgICAgICAgICAgIHBlc19leHQgPSBza2lwID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgc2tpcCk7CisgICAgICAgICAgICBoZWFkZXJfbGVuIC09IHNraXA7CisKKyAgICAgICAgICAgIGlmIChwZXNfZXh0ICYgMHgwMSkgeyAvKiBQRVMgZXh0ZW5zaW9uIDIgKi8KKyAgICAgICAgICAgICAgICBleHQyX2xlbiA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4tLTsKKyAgICAgICAgICAgICAgICBpZiAoKGV4dDJfbGVuICYgMHg3ZikgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlkX2V4dCA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGlkX2V4dCAmIDB4ODApID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGNvZGUgPSAoKHN0YXJ0Y29kZSAmIDB4ZmYpIDw8IDgpIHwgaWRfZXh0OworICAgICAgICAgICAgICAgICAgICBoZWFkZXJfbGVuLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChoZWFkZXJfbGVuIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfcmVkbzsKKyAgICAgICAgYXZpb19za2lwKHMtPnBiLCBoZWFkZXJfbGVuKTsKKyAgICB9IGVsc2UgaWYgKGMgIT0gMHhmKQorICAgICAgICBnb3RvIHJlZG87CisgICAgfQorCisgICAgaWYgKHN0YXJ0Y29kZSA9PSBQUklWQVRFX1NUUkVBTV8xKSB7CisgICAgICAgIHN0YXJ0Y29kZSA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICBsZW4tLTsKKyAgICB9CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIGdvdG8gZXJyb3JfcmVkbzsKKyAgICBpZiAoZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIHBwb3MpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdGFydGNvZGUgPT0gcy0+c3RyZWFtc1tpXS0+aWQgJiYKKyAgICAgICAgICAgICAgICBzLT5wYi0+c2Vla2FibGUgLyogaW5kZXggdXNlbGVzcyBvbiBzdHJlYW1zIGFueXdheSAqLykgeworICAgICAgICAgICAgICAgIGZmX3JlZHVjZV9pbmRleChzLCBpKTsKKyAgICAgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkocy0+c3RyZWFtc1tpXSwgKnBwb3MsIGR0cywgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJTkRFWF9LRVlGUkFNRSAvKiBGSVhNRSBrZXlmcmFtZT8gKi8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKnBzdGFydF9jb2RlID0gc3RhcnRjb2RlOworICAgICpwcHRzICAgICAgICA9IHB0czsKKyAgICAqcGR0cyAgICAgICAgPSBkdHM7CisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBtcGVncHNfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNcGVnRGVtdXhDb250ZXh0ICptID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgbGVuLCBzdGFydGNvZGUsIGksIGVzX3R5cGUsIHJldDsKKyAgICBpbnQgbHBjbV9oZWFkZXJfbGVuID0gLTE7IC8vSW5pdCB0byBzdXBwcmVzcyB3YXJuaW5nCisgICAgaW50IHJlcXVlc3RfcHJvYmU9IDA7CisgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOworICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZTsKKyAgICBpbnQ2NF90IHB0cywgZHRzLCBkdW1teV9wb3M7IC8vIGR1bW15X3BvcyBpcyBuZWVkZWQgZm9yIHRoZSBpbmRleCBidWlsZGluZyB0byB3b3JrCisKK3JlZG86CisgICAgbGVuID0gbXBlZ3BzX3JlYWRfcGVzX2hlYWRlcihzLCAmZHVtbXlfcG9zLCAmc3RhcnRjb2RlLCAmcHRzLCAmZHRzKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIGxlbjsKKworICAgIGlmIChzdGFydGNvZGUgPj0gMHg4MCAmJiBzdGFydGNvZGUgPD0gMHhjZikgeworICAgICAgICBpZiAobGVuIDwgNCkKKyAgICAgICAgICAgIGdvdG8gc2tpcDsKKworICAgICAgICAvKiBhdWRpbzogc2tpcCBoZWFkZXIgKi8KKyAgICAgICAgYXZpb19yOChzLT5wYik7CisgICAgICAgIGxwY21faGVhZGVyX2xlbiA9IGF2aW9fcmIxNihzLT5wYik7CisgICAgICAgIGxlbiAtPSAzOworICAgICAgICBpZiAoc3RhcnRjb2RlID49IDB4YjAgJiYgc3RhcnRjb2RlIDw9IDB4YmYpIHsKKyAgICAgICAgICAgIC8qIE1MUC9UcnVlSEQgYXVkaW8gaGFzIGEgNC1ieXRlIGhlYWRlciAqLworICAgICAgICAgICAgYXZpb19yOChzLT5wYik7CisgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG5vdyBmaW5kIHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoc3QtPmlkID09IHN0YXJ0Y29kZSkKKyAgICAgICAgICAgIGdvdG8gZm91bmQ7CisgICAgfQorCisgICAgZXNfdHlwZSA9IG0tPnBzbV9lc190eXBlW3N0YXJ0Y29kZSAmIDB4ZmZdOworICAgICAgICBpZiAoZXNfdHlwZSA9PSBTVFJFQU1fVFlQRV9WSURFT19NUEVHMSkgeworICAgICAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOworICAgICAgICAgICAgdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIH0gZWxzZSBpZiAoZXNfdHlwZSA9PSBTVFJFQU1fVFlQRV9WSURFT19NUEVHMikgeworICAgICAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOworICAgICAgICAgICAgdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIH0gZWxzZSBpZiAoZXNfdHlwZSA9PSBTVFJFQU1fVFlQRV9BVURJT19NUEVHMSB8fAorICAgICAgICAgICAgICAgICAgIGVzX3R5cGUgPT0gU1RSRUFNX1RZUEVfQVVESU9fTVBFRzIpIHsKKyAgICAgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVAzOworICAgICAgICAgICAgdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIH0gZWxzZSBpZiAoZXNfdHlwZSA9PSBTVFJFQU1fVFlQRV9BVURJT19BQUMpIHsKKyAgICAgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfQUFDOworICAgICAgICAgICAgdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIH0gZWxzZSBpZiAoZXNfdHlwZSA9PSBTVFJFQU1fVFlQRV9WSURFT19NUEVHNCkgeworICAgICAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUEVHNDsKKyAgICAgICAgICAgIHR5cGUgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICB9IGVsc2UgaWYgKGVzX3R5cGUgPT0gU1RSRUFNX1RZUEVfVklERU9fSDI2NCkgeworICAgICAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9IMjY0OworICAgICAgICAgICAgdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIH0gZWxzZSBpZiAoZXNfdHlwZSA9PSBTVFJFQU1fVFlQRV9BVURJT19BQzMpIHsKKyAgICAgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfQUMzOworICAgICAgICAgICAgdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIH0gZWxzZSBpZiAobS0+aW1raF9jY3R2ICYmIGVzX3R5cGUgPT0gMHg5MSkgeworICAgICAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc7CisgICAgICAgICAgICB0eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICB9IGVsc2UgaWYgKHN0YXJ0Y29kZSA+PSAweDFlMCAmJiBzdGFydGNvZGUgPD0gMHgxZWYpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXZzX3NlcWhbNF0gPSB7IDAsIDAsIDEsIDB4YjAgfTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBidWZbOF07CisKKyAgICAgICAgYXZpb19yZWFkKHMtPnBiLCBidWYsIDgpOworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIC04LCBTRUVLX0NVUik7CisgICAgICAgIGlmICghbWVtY21wKGJ1ZiwgYXZzX3NlcWgsIDQpICYmIChidWZbNl0gIT0gMCB8fCBidWZbN10gIT0gMSkpCisgICAgICAgICAgICBjb2RlY19pZCA9IEFWX0NPREVDX0lEX0NBVlM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcXVlc3RfcHJvYmU9IDE7CisgICAgICAgIHR5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgfSBlbHNlIGlmIChzdGFydGNvZGUgPT0gUFJJVkFURV9TVFJFQU1fMikgeworICAgICAgICB0eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfRFZEX05BVjsKKyAgICB9IGVsc2UgaWYgKHN0YXJ0Y29kZSA+PSAweDFjMCAmJiBzdGFydGNvZGUgPD0gMHgxZGYpIHsKKyAgICAgICAgdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIGlmIChtLT5zb2ZkZWMgPiAwKSB7CisgICAgICAgICAgICBjb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0FEWDsKKyAgICAgICAgICAgIC8vIEF1dG8tZGV0ZWN0IEFDLTMKKyAgICAgICAgICAgIHJlcXVlc3RfcHJvYmUgPSA1MDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVAyOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdGFydGNvZGUgPj0gMHg4MCAmJiBzdGFydGNvZGUgPD0gMHg4NykgeworICAgICAgICB0eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BQzM7CisgICAgfSBlbHNlIGlmICgoc3RhcnRjb2RlID49IDB4ODggJiYgc3RhcnRjb2RlIDw9IDB4OGYpIHx8CisgICAgICAgICAgICAgICAoc3RhcnRjb2RlID49IDB4OTggJiYgc3RhcnRjb2RlIDw9IDB4OWYpKSB7CisgICAgICAgIC8qIDB4OTAgLSAweDk3IGlzIHJlc2VydmVkIGZvciBTRERTIGluIERWRCBzcGVjcyAqLworICAgICAgICB0eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9EVFM7CisgICAgfSBlbHNlIGlmIChzdGFydGNvZGUgPj0gMHhhMCAmJiBzdGFydGNvZGUgPD0gMHhhZikgeworICAgICAgICB0eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgaWYgKGxwY21faGVhZGVyX2xlbiA9PSA2KSB7CisgICAgICAgICAgICBjb2RlY19pZCA9IEFWX0NPREVDX0lEX01MUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX0RWRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RhcnRjb2RlID49IDB4YjAgJiYgc3RhcnRjb2RlIDw9IDB4YmYpIHsKKyAgICAgICAgdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfVFJVRUhEOworICAgIH0gZWxzZSBpZiAoc3RhcnRjb2RlID49IDB4YzAgJiYgc3RhcnRjb2RlIDw9IDB4Y2YpIHsKKyAgICAgICAgLyogVXNlZCBmb3IgYm90aCBBQy0zIGFuZCBFLUFDLTMgaW4gRVZPQiBmaWxlcyAqLworICAgICAgICB0eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BQzM7CisgICAgfSBlbHNlIGlmIChzdGFydGNvZGUgPj0gMHgyMCAmJiBzdGFydGNvZGUgPD0gMHgzZikgeworICAgICAgICB0eXBlICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEU7CisgICAgfSBlbHNlIGlmIChzdGFydGNvZGUgPj0gMHhmZDU1ICYmIHN0YXJ0Y29kZSA8PSAweGZkNWYpIHsKKyAgICAgICAgdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfVkMxOworICAgIH0gZWxzZSB7Citza2lwOgorICAgICAgICAvKiBza2lwIHBhY2tldCAqLworICAgICAgICBhdmlvX3NraXAocy0+cGIsIGxlbik7CisgICAgICAgIGdvdG8gcmVkbzsKKyAgICB9CisgICAgLyogbm8gc3RyZWFtIGZvdW5kOiBhZGQgYSBuZXcgc3RyZWFtICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIGdvdG8gc2tpcDsKKyAgICBzdC0+aWQgICAgICAgICAgICAgICAgPSBzdGFydGNvZGU7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gdHlwZTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBjb2RlY19pZDsKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fTVVMQVcpIHsKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgfQorICAgIHN0LT5yZXF1ZXN0X3Byb2JlICAgICA9IHJlcXVlc3RfcHJvYmU7CisgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKworZm91bmQ6CisgICAgaWYgKHN0LT5kaXNjYXJkID49IEFWRElTQ0FSRF9BTEwpCisgICAgICAgIGdvdG8gc2tpcDsKKyAgICBpZiAoc3RhcnRjb2RlID49IDB4YTAgJiYgc3RhcnRjb2RlIDw9IDB4YWYpIHsKKyAgICAgIGlmIChscGNtX2hlYWRlcl9sZW4gPT0gNiAmJiBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01MUCkgeworICAgICAgICAgICAgaWYgKGxlbiA8IDYpCisgICAgICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCA2KTsKKyAgICAgICAgICAgIGxlbiAtPTY7CisgICAgICB9CisgICAgfQorICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgbGVuKTsKKworICAgIHBrdC0+cHRzICAgICAgICAgID0gcHRzOworICAgIHBrdC0+ZHRzICAgICAgICAgID0gZHRzOworICAgIHBrdC0+cG9zICAgICAgICAgID0gZHVtbXlfcG9zOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIGF2X2Rsb2cocywgIiVkOiBwdHM9JTAuM2YgZHRzPSUwLjNmIHNpemU9JWRcbiIsCisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCwgcGt0LT5wdHMgLyA5MDAwMC4wLCBwa3QtPmR0cyAvIDkwMDAwLjAsCisgICAgICAgICAgICBwa3QtPnNpemUpOworCisgICAgcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IDA7Cit9CisKK3N0YXRpYyBpbnQ2NF90IG1wZWdwc19yZWFkX2R0cyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqcHBvcywgaW50NjRfdCBwb3NfbGltaXQpCit7CisgICAgaW50IGxlbiwgc3RhcnRjb2RlOworICAgIGludDY0X3QgcG9zLCBwdHMsIGR0czsKKworICAgIHBvcyA9ICpwcG9zOworICAgIGlmIChhdmlvX3NlZWsocy0+cGIsIHBvcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworCisgICAgZm9yICg7OykgeworICAgICAgICBsZW4gPSBtcGVncHNfcmVhZF9wZXNfaGVhZGVyKHMsICZwb3MsICZzdGFydGNvZGUsICZwdHMsICZkdHMpOworICAgICAgICBpZiAobGVuIDwgMCkgeworICAgICAgICAgICAgYXZfZGxvZyhzLCAibm9uZSAocmV0PSVkKVxuIiwgbGVuKTsKKyAgICAgICAgICAgIHJldHVybiBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhcnRjb2RlID09IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+aWQgJiYKKyAgICAgICAgICAgIGR0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19za2lwKHMtPnBiLCBsZW4pOworICAgIH0KKyAgICBhdl9kbG9nKHMsICJwb3M9MHglIlBSSXg2NCIgZHRzPTB4JSJQUkl4NjQiICUwLjNmXG4iLAorICAgICAgICAgICAgcG9zLCBkdHMsIGR0cyAvIDkwMDAwLjApOworICAgICpwcG9zID0gcG9zOworICAgIHJldHVybiBkdHM7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbXBlZ3BzX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wZWciLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLVBTIChNUEVHLTIgUHJvZ3JhbSBTdHJlYW0pIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1wZWdEZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IG1wZWdwc19wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBtcGVncHNfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gbXBlZ3BzX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3RpbWVzdGFtcCA9IG1wZWdwc19yZWFkX2R0cywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9TSE9XX0lEUyB8IEFWRk1UX1RTX0RJU0NPTlQsCit9OworCisjaWYgQ09ORklHX1ZPQlNVQl9ERU1VWEVSCisKKyNkZWZpbmUgUkVGX1NUUklORyAiIyBWb2JTdWIgaW5kZXggZmlsZSwiCisjZGVmaW5lIE1BWF9MSU5FX1NJWkUgMjA0OAorCitzdGF0aWMgaW50IHZvYnN1Yl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoIXN0cm5jbXAocC0+YnVmLCBSRUZfU1RSSU5HLCBzaXplb2YoUkVGX1NUUklORykgLSAxKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZvYnN1Yl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGksIHJldCA9IDAsIGhlYWRlcl9wYXJzZWQgPSAwLCBsYW5naWR4ID0gMDsKKyAgICBNcGVnRGVtdXhDb250ZXh0ICp2b2JzdWIgPSBzLT5wcml2X2RhdGE7CisgICAgY2hhciAqc3ViX25hbWUgPSBOVUxMOworICAgIHNpemVfdCBmbmFtZV9sZW47CisgICAgY2hhciAqZXh0LCAqaGVhZGVyX3N0cjsKKyAgICBBVkJQcmludCBoZWFkZXI7CisgICAgaW50NjRfdCBkZWxheSA9IDA7CisgICAgQVZTdHJlYW0gKnN0ID0gTlVMTDsKKyAgICBpbnQgc3RyZWFtX2lkID0gLTE7CisgICAgY2hhciBpZFs2NF0gPSB7MH07CisgICAgY2hhciBhbHRbTUFYX0xJTkVfU0laRV0gPSB7MH07CisgICAgQVZJbnB1dEZvcm1hdCAqaWZvcm1hdDsKKworICAgIHN1Yl9uYW1lID0gYXZfc3RyZHVwKHMtPmZpbGVuYW1lKTsKKyAgICBmbmFtZV9sZW4gPSBzdHJsZW4oc3ViX25hbWUpOworICAgIGV4dCA9IHN1Yl9uYW1lIC0gMyArIGZuYW1lX2xlbjsKKyAgICBpZiAoZm5hbWVfbGVuIDwgNCB8fCAqKGV4dCAtIDEpICE9ICcuJykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVGhlIGlucHV0IGluZGV4IGZpbGVuYW1lIGlzIHRvbyBzaG9ydCAiCisgICAgICAgICAgICAgICAidG8gZ3Vlc3MgdGhlIGFzc29jaWF0ZWQgLlNVQiBmaWxlXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIG1lbWNweShleHQsICFzdHJuY21wKGV4dCwgIklEWCIsIDMpID8gIlNVQiIgOiAic3ViIiwgMyk7CisgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiSURYL1NVQjogJXMgLT4gJXNcbiIsIHMtPmZpbGVuYW1lLCBzdWJfbmFtZSk7CisKKyAgICBpZiAoIShpZm9ybWF0ID0gYXZfZmluZF9pbnB1dF9mb3JtYXQoIm1wZWciKSkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9ERU1VWEVSX05PVF9GT1VORDsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgdm9ic3ViLT5zdWJfY3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOworICAgIGlmICghdm9ic3ViLT5zdWJfY3R4KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9jb3B5X3doaXRlbGlzdHModm9ic3ViLT5zdWJfY3R4LCBzKSkgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIHJldCA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJnZvYnN1Yi0+c3ViX2N0eCwgc3ViX25hbWUsIGlmb3JtYXQsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiAlcyBhcyBNUEVHIHN1YnRpdGxlc1xuIiwgc3ViX25hbWUpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBhdl9icHJpbnRfaW5pdCgmaGVhZGVyLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgIHdoaWxlICghYXZpb19mZW9mKHMtPnBiKSkgeworICAgICAgICBjaGFyIGxpbmVbTUFYX0xJTkVfU0laRV07CisgICAgICAgIGludCBsZW4gPSBmZl9nZXRfbGluZShzLT5wYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKworICAgICAgICBpZiAoIWxlbikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGxpbmVbc3RyY3NwbihsaW5lLCAiXHJcbiIpXSA9IDA7CisKKyAgICAgICAgaWYgKCFzdHJuY21wKGxpbmUsICJpZDoiLCAzKSkgeworICAgICAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiaWQ6ICU2M1teLF0sIGluZGV4OiAldSIsIGlkLCAmc3RyZWFtX2lkKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5hYmxlIHRvIHBhcnNlIGluZGV4IGxpbmUgJyVzJywgIgorICAgICAgICAgICAgICAgICAgICAgICAiYXNzdW1pbmcgJ2lkOiB1bmQsIGluZGV4OiAwJ1xuIiwgbGluZSk7CisgICAgICAgICAgICAgICAgc3RyY3B5KGlkLCAidW5kIik7CisgICAgICAgICAgICAgICAgc3RyZWFtX2lkID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0cmVhbV9pZCA+PSBGRl9BUlJBWV9FTEVNUyh2b2JzdWItPnEpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk1heGltdW0gbnVtYmVyIG9mIHN1YnRpdGxlcyBzdHJlYW1zIHJlYWNoZWRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGVhZGVyX3BhcnNlZCA9IDE7CisgICAgICAgICAgICBhbHRbMF0gPSAnXDAnOworICAgICAgICAgICAgLyogV2UgZG8gbm90IGNyZWF0ZSB0aGUgc3RyZWFtIGltbWVkaWF0ZWx5IHRvIGF2b2lkIGFkZGluZyBlbXB0eQorICAgICAgICAgICAgICogc3RyZWFtcy4gU2VlIHRoZSBmb2xsb3dpbmcgdGltZXN0YW1wIGVudHJ5LiAqLworCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiSURYIHN0cmVhbVslZF0gaWQ9JXNcbiIsIHN0cmVhbV9pZCwgaWQpOworCisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobGluZSwgInRpbWVzdGFtcDoiLCAxMCkpIHsKKyAgICAgICAgICAgIEFWUGFja2V0ICpzdWI7CisgICAgICAgICAgICBpbnQgaGgsIG1tLCBzcywgbXM7CisgICAgICAgICAgICBpbnQ2NF90IHBvcywgdGltZXN0YW1wOworICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IGxpbmUgKyAxMDsKKworICAgICAgICAgICAgaWYgKHN0cmVhbV9pZCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJUaW1lc3RhbXAgZGVjbGFyZWQgYmVmb3JlIGFueSBzdHJlYW1cbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghc3QgfHwgc3QtPmlkICE9IHN0cmVhbV9pZCkgeworICAgICAgICAgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0LT5pZCA9IHN0cmVhbV9pZDsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfRFZEX1NVQlRJVExFOworICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwKTsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAibGFuZ3VhZ2UiLCBpZCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKGFsdFswXSkKKyAgICAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgInRpdGxlIiwgYWx0LCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNzY2FuZihwLCAiJTAyZDolMDJkOiUwMmQ6JTAzZCwgZmlsZXBvczogJSJTQ054NjQsCisgICAgICAgICAgICAgICAgICAgICAgICZoaCwgJm1tLCAmc3MsICZtcywgJnBvcykgIT0gNSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcGFyc2UgdGltZXN0YW1wIGxpbmUgJyVzJywgIgorICAgICAgICAgICAgICAgICAgICAgICAiYWJvcnQgcGFyc2luZ1xuIiwgbGluZSk7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVzdGFtcCA9IChoaCozNjAwTEwgKyBtbSo2MExMICsgc3MpICogMTAwMExMICsgbXMgKyBkZWxheTsKKyAgICAgICAgICAgIHRpbWVzdGFtcCA9IGF2X3Jlc2NhbGVfcSh0aW1lc3RhbXAsIGF2X21ha2VfcSgxLCAxMDAwKSwgc3QtPnRpbWVfYmFzZSk7CisKKyAgICAgICAgICAgIHN1YiA9IGZmX3N1YnRpdGxlc19xdWV1ZV9pbnNlcnQoJnZvYnN1Yi0+cVtzLT5uYl9zdHJlYW1zIC0gMV0sICIiLCAwLCAwKTsKKyAgICAgICAgICAgIGlmICghc3ViKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ViLT5wb3MgPSBwb3M7CisgICAgICAgICAgICBzdWItPnB0cyA9IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIHN1Yi0+c3RyZWFtX2luZGV4ID0gcy0+bmJfc3RyZWFtcyAtIDE7CisKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChsaW5lLCAiYWx0OiIsIDQpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwID0gbGluZSArIDQ7CisKKyAgICAgICAgICAgIHdoaWxlICgqcCA9PSAnICcpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIklEWCBzdHJlYW1bJWRdIG5hbWU9JXNcbiIsIHN0cmVhbV9pZCwgcCk7CisgICAgICAgICAgICBhdl9zdHJsY3B5KGFsdCwgcCwgc2l6ZW9mKGFsdCkpOworICAgICAgICAgICAgaGVhZGVyX3BhcnNlZCA9IDE7CisKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChsaW5lLCAiZGVsYXk6IiwgNikpIHsKKyAgICAgICAgICAgIGludCBzaWduID0gMSwgaGggPSAwLCBtbSA9IDAsIHNzID0gMCwgbXMgPSAwOworICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IGxpbmUgKyA2OworCisgICAgICAgICAgICB3aGlsZSAoKnAgPT0gJyAnKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKSB7CisgICAgICAgICAgICAgICAgc2lnbiA9ICpwID09ICctJyA/IC0xIDogMTsKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzc2NhbmYocCwgIiVkOiVkOiVkOiVkIiwgJmhoLCAmbW0sICZzcywgJm1zKTsKKyAgICAgICAgICAgIGRlbGF5ID0gKChoaCozNjAwTEwgKyBtbSo2MExMICsgc3MpICogMTAwMExMICsgbXMpICogc2lnbjsKKworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGxpbmUsICJsYW5naWR4OiIsIDgpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwID0gbGluZSArIDg7CisKKyAgICAgICAgICAgIGlmIChzc2NhbmYocCwgIiVkIiwgJmxhbmdpZHgpICE9IDEpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbGFuZ2lkeCBzcGVjaWZpZWRcbiIpOworCisgICAgICAgIH0gZWxzZSBpZiAoIWhlYWRlcl9wYXJzZWQpIHsKKyAgICAgICAgICAgIGlmIChsaW5lWzBdICYmIGxpbmVbMF0gIT0gJyMnKQorICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmhlYWRlciwgIiVzXG4iLCBsaW5lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsYW5naWR4IDwgcy0+bmJfc3RyZWFtcykKKyAgICAgICAgcy0+c3RyZWFtc1tsYW5naWR4XS0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fREVGQVVMVDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgdm9ic3ViLT5xW2ldLnNvcnQgPSBTVUJfU09SVF9QT1NfVFM7CisgICAgICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9maW5hbGl6ZSgmdm9ic3ViLT5xW2ldKTsKKyAgICB9CisKKyAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZSgmaGVhZGVyKSkgeworICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmhlYWRlciwgTlVMTCk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGF2X2JwcmludF9maW5hbGl6ZSgmaGVhZGVyLCAmaGVhZGVyX3N0cik7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3ViX3N0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgc3ViX3N0LT5jb2RlYy0+ZXh0cmFkYXRhICAgICAgPSBhdl9zdHJkdXAoaGVhZGVyX3N0cik7CisgICAgICAgIHN1Yl9zdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gaGVhZGVyLmxlbjsKKyAgICB9CisgICAgYXZfZnJlZShoZWFkZXJfc3RyKTsKKworZW5kOgorICAgIGF2X2ZyZWUoc3ViX25hbWUpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9ic3ViX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNcGVnRGVtdXhDb250ZXh0ICp2b2JzdWIgPSBzLT5wcml2X2RhdGE7CisgICAgRkZEZW11eFN1YnRpdGxlc1F1ZXVlICpxOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHZvYnN1Yi0+c3ViX2N0eC0+cGI7CisgICAgaW50IHJldCwgcHNpemUsIHRvdGFsX3JlYWQgPSAwLCBpOworICAgIEFWUGFja2V0IGlkeF9wa3Q7CisKKyAgICBpbnQ2NF90IG1pbl90cyA9IElOVDY0X01BWDsKKyAgICBpbnQgc2lkID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSAqdG1wcSA9ICZ2b2JzdWItPnFbaV07CisgICAgICAgIGludDY0X3QgdHM7CisgICAgICAgIGF2X2Fzc2VydDAodG1wcS0+bmJfc3Vicyk7CisgICAgICAgIHRzID0gdG1wcS0+c3Vic1t0bXBxLT5jdXJyZW50X3N1Yl9pZHhdLnB0czsKKyAgICAgICAgaWYgKHRzIDwgbWluX3RzKSB7CisgICAgICAgICAgICBtaW5fdHMgPSB0czsKKyAgICAgICAgICAgIHNpZCA9IGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcSA9ICZ2b2JzdWItPnFbc2lkXTsKKyAgICByZXQgPSBmZl9zdWJ0aXRsZXNfcXVldWVfcmVhZF9wYWNrZXQocSwgJmlkeF9wa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogY29tcHV0ZSBtYXhpbXVtIHBhY2tldCBzaXplIHVzaW5nIHRoZSBuZXh0IHBhY2tldCBwb3NpdGlvbi4gVGhpcyBpcworICAgICAqIHVzZWZ1bCB3aGVuIHRoZSBsZW4gaW4gdGhlIGhlYWRlciBpcyBub24tc2Vuc2UgKi8KKyAgICBpZiAocS0+Y3VycmVudF9zdWJfaWR4IDwgcS0+bmJfc3VicykgeworICAgICAgICBwc2l6ZSA9IHEtPnN1YnNbcS0+Y3VycmVudF9zdWJfaWR4XS5wb3MgLSBpZHhfcGt0LnBvczsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IGZzaXplID0gYXZpb19zaXplKHBiKTsKKyAgICAgICAgcHNpemUgPSBmc2l6ZSA8IDAgPyAweGZmZmYgOiBmc2l6ZSAtIGlkeF9wa3QucG9zOworICAgIH0KKworICAgIGF2aW9fc2VlayhwYiwgaWR4X3BrdC5wb3MsIFNFRUtfU0VUKTsKKworICAgIGF2X2luaXRfcGFja2V0KHBrdCk7CisgICAgcGt0LT5zaXplID0gMDsKKyAgICBwa3QtPmRhdGEgPSBOVUxMOworCisgICAgZG8geworICAgICAgICBpbnQgbiwgdG9fcmVhZCwgc3RhcnRjb2RlOworICAgICAgICBpbnQ2NF90IHB0cywgZHRzOworICAgICAgICBpbnQ2NF90IG9sZF9wb3MgPSBhdmlvX3RlbGwocGIpLCBuZXdfcG9zOworICAgICAgICBpbnQgcGt0X3NpemU7CisKKyAgICAgICAgcmV0ID0gbXBlZ3BzX3JlYWRfcGVzX2hlYWRlcih2b2JzdWItPnN1Yl9jdHgsIE5VTEwsICZzdGFydGNvZGUsICZwdHMsICZkdHMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYgKHBrdC0+c2l6ZSkgLy8gcmFpc2UgcGFja2V0IGV2ZW4gaWYgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHRvX3JlYWQgPSByZXQgJiAweGZmZmY7CisgICAgICAgIG5ld19wb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBwa3Rfc2l6ZSA9IHJldCArIChuZXdfcG9zIC0gb2xkX3Bvcyk7CisKKyAgICAgICAgLyogdGhpcyBwcmV2ZW50cyByZWFkcyBhYm92ZSB0aGUgY3VycmVudCBwYWNrZXQgKi8KKyAgICAgICAgaWYgKHRvdGFsX3JlYWQgKyBwa3Rfc2l6ZSA+IHBzaXplKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHRvdGFsX3JlYWQgKz0gcGt0X3NpemU7CisKKyAgICAgICAgLyogdGhlIGN1cnJlbnQgY2h1bmsgZG9lc24ndCBtYXRjaCB0aGUgc3RyZWFtIGluZGV4ICh1bmxpa2VseSkgKi8KKyAgICAgICAgaWYgKChzdGFydGNvZGUgJiAweDFmKSAhPSBpZHhfcGt0LnN0cmVhbV9pbmRleCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHJldCA9IGF2X2dyb3dfcGFja2V0KHBrdCwgdG9fcmVhZCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIG4gPSBhdmlvX3JlYWQocGIsIHBrdC0+ZGF0YSArIChwa3QtPnNpemUgLSB0b19yZWFkKSwgdG9fcmVhZCk7CisgICAgICAgIGlmIChuIDwgdG9fcmVhZCkKKyAgICAgICAgICAgIHBrdC0+c2l6ZSAtPSB0b19yZWFkIC0gbjsKKyAgICB9IHdoaWxlICh0b3RhbF9yZWFkIDwgcHNpemUpOworCisgICAgcGt0LT5wdHMgPSBwa3QtPmR0cyA9IGlkeF9wa3QucHRzOworICAgIHBrdC0+cG9zID0gaWR4X3BrdC5wb3M7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBpZHhfcGt0LnN0cmVhbV9pbmRleDsKKworICAgIGF2X2ZyZWVfcGFja2V0KCZpZHhfcGt0KTsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgIGF2X2ZyZWVfcGFja2V0KCZpZHhfcGt0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvYnN1Yl9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3RzLCBpbnQ2NF90IHRzLCBpbnQ2NF90IG1heF90cywgaW50IGZsYWdzKQoreworICAgIE1wZWdEZW11eENvbnRleHQgKnZvYnN1YiA9IHMtPnByaXZfZGF0YTsKKworICAgIC8qIFJlc2NhbGUgcmVxdWVzdGVkIHRpbWVzdGFtcHMgYmFzZWQgb24gdGhlIGZpcnN0IHN0cmVhbSAodGltZWJhc2UgaXMgdGhlCisgICAgICogc2FtZSBmb3IgYWxsIHN1YnRpdGxlcyBzdHJlYW0gd2l0aGluIGEgLmlkeC8uc3ViKS4gUmVzY2FsaW5nIGlzIGRvbmUganVzdAorICAgICAqIGxpa2UgaW4gYXZmb3JtYXRfc2Vla19maWxlKCkuICovCisgICAgaWYgKHN0cmVhbV9pbmRleCA9PSAtMSAmJiBzLT5uYl9zdHJlYW1zICE9IDEpIHsKKyAgICAgICAgaW50IGksIHJldCA9IDA7CisgICAgICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlID0gcy0+c3RyZWFtc1swXS0+dGltZV9iYXNlOworICAgICAgICB0cyA9IGF2X3Jlc2NhbGVfcSh0cywgQVZfVElNRV9CQVNFX1EsIHRpbWVfYmFzZSk7CisgICAgICAgIG1pbl90cyA9IGF2X3Jlc2NhbGVfcm5kKG1pbl90cywgdGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9iYXNlLm51bSAqIChpbnQ2NF90KUFWX1RJTUVfQkFTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUk9VTkRfVVAgICB8IEFWX1JPVU5EX1BBU1NfTUlOTUFYKTsKKyAgICAgICAgbWF4X3RzID0gYXZfcmVzY2FsZV9ybmQobWF4X3RzLCB0aW1lX2Jhc2UuZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2Jhc2UubnVtICogKGludDY0X3QpQVZfVElNRV9CQVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ST1VORF9ET1dOIHwgQVZfUk9VTkRfUEFTU19NSU5NQVgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBpbnQgciA9IGZmX3N1YnRpdGxlc19xdWV1ZV9zZWVrKCZ2b2JzdWItPnFbaV0sIHMsIHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncyk7CisgICAgICAgICAgICBpZiAociA8IDApCisgICAgICAgICAgICAgICAgcmV0ID0gcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChzdHJlYW1faW5kZXggPT0gLTEpIC8vIG9ubHkgMSBzdHJlYW0KKyAgICAgICAgc3RyZWFtX2luZGV4ID0gMDsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJnZvYnN1Yi0+cVtzdHJlYW1faW5kZXhdLCBzLCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl90cywgdHMsIG1heF90cywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHZvYnN1Yl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBNcGVnRGVtdXhDb250ZXh0ICp2b2JzdWIgPSBzLT5wcml2X2RhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICBmZl9zdWJ0aXRsZXNfcXVldWVfY2xlYW4oJnZvYnN1Yi0+cVtpXSk7CisgICAgaWYgKHZvYnN1Yi0+c3ViX2N0eCkKKyAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJnZvYnN1Yi0+c3ViX2N0eCk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfdm9ic3ViX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZvYnN1YiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZvYlN1YiBzdWJ0aXRsZSBmb3JtYXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ0RlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gdm9ic3ViX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHZvYnN1Yl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSB2b2JzdWJfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlazIgICAgID0gdm9ic3ViX3JlYWRfc2VlaywKKyAgICAucmVhZF9jbG9zZSAgICAgPSB2b2JzdWJfcmVhZF9jbG9zZSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9TSE9XX0lEUywKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiaWR4IiwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGVnLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvbXBlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MzUxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbXBlZy5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBNUEVHMS8yIG11eGVyIGFuZCBkZW11eGVyIGNvbW1vbiBkZWZpbmVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfTVBFR19ICisjZGVmaW5lIEFWRk9STUFUX01QRUdfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjZGVmaW5lIFBBQ0tfU1RBUlRfQ09ERSAgICAgICAgICAgICAoKHVuc2lnbmVkIGludCkweDAwMDAwMWJhKQorI2RlZmluZSBTWVNURU1fSEVBREVSX1NUQVJUX0NPREUgICAgKCh1bnNpZ25lZCBpbnQpMHgwMDAwMDFiYikKKyNkZWZpbmUgU0VRVUVOQ0VfRU5EX0NPREUgICAgICAgICAgICgodW5zaWduZWQgaW50KTB4MDAwMDAxYjcpCisjZGVmaW5lIFBBQ0tFVF9TVEFSVF9DT0RFX01BU0sgICAgICAoKHVuc2lnbmVkIGludCkweGZmZmZmZjAwKQorI2RlZmluZSBQQUNLRVRfU1RBUlRfQ09ERV9QUkVGSVggICAgKCh1bnNpZ25lZCBpbnQpMHgwMDAwMDEwMCkKKyNkZWZpbmUgSVNPXzExMTcyX0VORF9DT0RFICAgICAgICAgICgodW5zaWduZWQgaW50KTB4MDAwMDAxYjkpCisKKy8qIG1wZWcyICovCisjZGVmaW5lIFBST0dSQU1fU1RSRUFNX01BUCAweDFiYworI2RlZmluZSBQUklWQVRFX1NUUkVBTV8xICAgMHgxYmQKKyNkZWZpbmUgUEFERElOR19TVFJFQU0gICAgIDB4MWJlCisjZGVmaW5lIFBSSVZBVEVfU1RSRUFNXzIgICAweDFiZgorCisjZGVmaW5lIEFVRElPX0lEIDB4YzAKKyNkZWZpbmUgVklERU9fSUQgMHhlMAorI2RlZmluZSBIMjY0X0lEICAweGUyCisjZGVmaW5lIEFDM19JRCAgIDB4ODAKKyNkZWZpbmUgRFRTX0lEICAgMHg4OAorI2RlZmluZSBMUENNX0lEICAweGEwCisjZGVmaW5lIFNVQl9JRCAgIDB4MjAKKworI2RlZmluZSBTVFJFQU1fVFlQRV9WSURFT19NUEVHMSAgICAgMHgwMQorI2RlZmluZSBTVFJFQU1fVFlQRV9WSURFT19NUEVHMiAgICAgMHgwMgorI2RlZmluZSBTVFJFQU1fVFlQRV9BVURJT19NUEVHMSAgICAgMHgwMworI2RlZmluZSBTVFJFQU1fVFlQRV9BVURJT19NUEVHMiAgICAgMHgwNAorI2RlZmluZSBTVFJFQU1fVFlQRV9QUklWQVRFX1NFQ1RJT04gMHgwNQorI2RlZmluZSBTVFJFQU1fVFlQRV9QUklWQVRFX0RBVEEgICAgMHgwNgorI2RlZmluZSBTVFJFQU1fVFlQRV9BVURJT19BQUMgICAgICAgMHgwZgorI2RlZmluZSBTVFJFQU1fVFlQRV9WSURFT19NUEVHNCAgICAgMHgxMAorI2RlZmluZSBTVFJFQU1fVFlQRV9WSURFT19IMjY0ICAgICAgMHgxYgorI2RlZmluZSBTVFJFQU1fVFlQRV9WSURFT19DQVZTICAgICAgMHg0MgorCisjZGVmaW5lIFNUUkVBTV9UWVBFX0FVRElPX0FDMyAgICAgICAweDgxCisKK3N0YXRpYyBjb25zdCBpbnQgbHBjbV9mcmVxX3RhYls0XSA9IHsgNDgwMDAsIDk2MDAwLCA0NDEwMCwgMzIwMDAgfTsKKworLyoqCisgKiBQYXJzZSBNUEVHLVBFUyBmaXZlLWJ5dGUgdGltZXN0YW1wCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBmZl9wYXJzZV9wZXNfcHRzKGNvbnN0IHVpbnQ4X3QgKmJ1ZikgeworICAgIHJldHVybiAoaW50NjRfdCkoKmJ1ZiAmIDB4MGUpIDw8IDI5IHwKKyAgICAgICAgICAgIChBVl9SQjE2KGJ1ZisxKSA+PiAxKSA8PCAxNSB8CisgICAgICAgICAgICAgQVZfUkIxNihidWYrMykgPj4gMTsKK30KKworI2VuZGlmIC8qIEFWRk9STUFUX01QRUdfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L21wZWdlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGVnZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1MTUwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGVnZW5jLmMKQEAgLTAsMCArMSwxMjk1IEBACisvKgorICogTVBFRzEvMiBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9maWZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvcHV0X2JpdHMuaCIKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtcGVnLmgiCisKKyNkZWZpbmUgTUFYX1BBWUxPQURfU0laRSA0MDk2CisKKyN1bmRlZiBOREVCVUcKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgUGFja2V0RGVzYyB7CisgICAgaW50NjRfdCBwdHM7CisgICAgaW50NjRfdCBkdHM7CisgICAgaW50IHNpemU7CisgICAgaW50IHVud3JpdHRlbl9zaXplOworICAgIGludCBmbGFnczsKKyAgICBzdHJ1Y3QgUGFja2V0RGVzYyAqbmV4dDsKK30gUGFja2V0RGVzYzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWRmlmb0J1ZmZlciAqZmlmbzsKKyAgICB1aW50OF90IGlkOworICAgIGludCBtYXhfYnVmZmVyX3NpemU7IC8qIGluIGJ5dGVzICovCisgICAgaW50IGJ1ZmZlcl9pbmRleDsKKyAgICBQYWNrZXREZXNjICpwcmVkZWNvZGVfcGFja2V0OworICAgIFBhY2tldERlc2MgKnByZW11eF9wYWNrZXQ7CisgICAgUGFja2V0RGVzYyAqKm5leHRfcGFja2V0OworICAgIGludCBwYWNrZXRfbnVtYmVyOworICAgIHVpbnQ4X3QgbHBjbV9oZWFkZXJbM107CisgICAgaW50IGxwY21fYWxpZ247CisgICAgaW50IGJ5dGVzX3RvX2lmcmFtZTsKKyAgICBpbnQgYWxpZ25faWZyYW1lOworICAgIGludDY0X3Qgdm9idV9zdGFydF9wdHM7Cit9IFN0cmVhbUluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgcGFja2V0X3NpemU7IC8qIHJlcXVpcmVkIHBhY2tldCBzaXplICovCisgICAgaW50IHBhY2tldF9udW1iZXI7CisgICAgaW50IHBhY2tfaGVhZGVyX2ZyZXE7ICAgICAvKiBmcmVxdWVuY3kgKGluIHBhY2tldHNeLTEpIGF0IHdoaWNoIHdlIHNlbmQgcGFjayBoZWFkZXJzICovCisgICAgaW50IHN5c3RlbV9oZWFkZXJfZnJlcTsKKyAgICBpbnQgc3lzdGVtX2hlYWRlcl9zaXplOworICAgIGludCB1c2VyX211eF9yYXRlOyAvKiBiaXRyYXRlIGluIHVuaXRzIG9mIGJpdHMvcyAqLworICAgIGludCBtdXhfcmF0ZTsgLyogYml0cmF0ZSBpbiB1bml0cyBvZiA1MCBieXRlcy9zICovCisgICAgLyogc3RyZWFtIGluZm8gKi8KKyAgICBpbnQgYXVkaW9fYm91bmQ7CisgICAgaW50IHZpZGVvX2JvdW5kOworICAgIGludCBpc19tcGVnMjsKKyAgICBpbnQgaXNfdmNkOworICAgIGludCBpc19zdmNkOworICAgIGludCBpc19kdmQ7CisgICAgaW50NjRfdCBsYXN0X3NjcjsgLyogY3VycmVudCBzeXN0ZW0gY2xvY2sgKi8KKworICAgIGRvdWJsZSB2Y2RfcGFkZGluZ19iaXRyYXRlOyAvLyBGSVhNRSBmbG9hdHMKKyAgICBpbnQ2NF90IHZjZF9wYWRkaW5nX2J5dGVzX3dyaXR0ZW47CisKKyAgICBpbnQgcHJlbG9hZDsKK30gTXBlZ011eENvbnRleHQ7CisKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9tcGVnMXZjZF9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9tcGVnMmR2ZF9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9tcGVnMnN2Y2RfbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfbXBlZzJ2b2JfbXV4ZXI7CisKK3N0YXRpYyBpbnQgcHV0X3BhY2tfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqY3R4LCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCkKK3sKKyAgICBNcGVnTXV4Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIFB1dEJpdENvbnRleHQgcGI7CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgYnVmLCAxMjgpOworCisgICAgcHV0X2JpdHMzMigmcGIsIFBBQ0tfU1RBUlRfQ09ERSk7CisgICAgaWYgKHMtPmlzX21wZWcyKQorICAgICAgICBwdXRfYml0cygmcGIsIDIsIDB4MSk7CisgICAgZWxzZQorICAgICAgICBwdXRfYml0cygmcGIsIDQsIDB4Mik7CisgICAgcHV0X2JpdHMoJnBiLCAgMywgKHVpbnQzMl90KSgodGltZXN0YW1wID4+IDMwKSAmIDB4MDcpKTsKKyAgICBwdXRfYml0cygmcGIsICAxLCAxKTsKKyAgICBwdXRfYml0cygmcGIsIDE1LCAodWludDMyX3QpKCh0aW1lc3RhbXAgPj4gMTUpICYgMHg3ZmZmKSk7CisgICAgcHV0X2JpdHMoJnBiLCAgMSwgMSk7CisgICAgcHV0X2JpdHMoJnBiLCAxNSwgKHVpbnQzMl90KSgodGltZXN0YW1wKSAgICAgICAmIDB4N2ZmZikpOworICAgIHB1dF9iaXRzKCZwYiwgIDEsIDEpOworICAgIGlmIChzLT5pc19tcGVnMikKKyAgICAgICAgLyogY2xvY2sgZXh0ZW5zaW9uICovCisgICAgICAgIHB1dF9iaXRzKCZwYiwgOSwgMCk7CisgICAgcHV0X2JpdHMoJnBiLCAxLCAxKTsKKyAgICBwdXRfYml0cygmcGIsIDIyLCBzLT5tdXhfcmF0ZSk7CisgICAgcHV0X2JpdHMoJnBiLCAxLCAxKTsKKyAgICBpZiAocy0+aXNfbXBlZzIpIHsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAxKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCA1LCAweDFmKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgcHV0X2JpdHMoJnBiLCAzLCAwKTsgLyogc3R1ZmZpbmcgbGVuZ3RoICovCisgICAgfQorICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgcmV0dXJuIHB1dF9iaXRzX3B0cigmcGIpIC0gcGIuYnVmOworfQorCitzdGF0aWMgaW50IHB1dF9zeXN0ZW1faGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqY3R4LCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvbmx5X2Zvcl9zdHJlYW1faWQpCit7CisgICAgTXBlZ011eENvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgc2l6ZSwgaSwgcHJpdmF0ZV9zdHJlYW1fY29kZWQsIGlkOworICAgIFB1dEJpdENvbnRleHQgcGI7CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgYnVmLCAxMjgpOworCisgICAgcHV0X2JpdHMzMigmcGIsIFNZU1RFTV9IRUFERVJfU1RBUlRfQ09ERSk7CisgICAgcHV0X2JpdHMoJnBiLCAxNiwgMCk7CisgICAgcHV0X2JpdHMoJnBiLCAxLCAxKTsKKworICAgIC8qIG1heGltdW0gYml0IHJhdGUgb2YgdGhlIG11bHRpcGxleGVkIHN0cmVhbSAqLworICAgIHB1dF9iaXRzKCZwYiwgMjIsIHMtPm11eF9yYXRlKTsKKyAgICBwdXRfYml0cygmcGIsIDEsIDEpOyAvKiBtYXJrZXIgKi8KKyAgICBpZiAocy0+aXNfdmNkICYmIG9ubHlfZm9yX3N0cmVhbV9pZCA9PSBWSURFT19JRCkgeworICAgICAgICAvKiBUaGlzIGhlYWRlciBhcHBsaWVzIG9ubHkgdG8gdGhlIHZpZGVvIHN0cmVhbQorICAgICAgICAgKiAoc2VlIFZDRCBzdGFuZGFyZCBwLiBJVi03KSAqLworICAgICAgICBwdXRfYml0cygmcGIsIDYsIDApOworICAgIH0gZWxzZQorICAgICAgICBwdXRfYml0cygmcGIsIDYsIHMtPmF1ZGlvX2JvdW5kKTsKKworICAgIGlmIChzLT5pc192Y2QpIHsKKyAgICAgICAgLyogc2VlIFZDRCBzdGFuZGFyZCwgcC4gSVYtNyAqLworICAgICAgICBwdXRfYml0cygmcGIsIDEsIDApOworICAgICAgICBwdXRfYml0cygmcGIsIDEsIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7IC8qIHZhcmlhYmxlIGJpdHJhdGUgKi8KKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgLyogbm9uIGNvbnN0cmFpbnRlZCBiaXQgc3RyZWFtICovCisgICAgfQorCisgICAgaWYgKHMtPmlzX3ZjZCB8fCBzLT5pc19kdmQpIHsKKyAgICAgICAgLyogc2VlIFZDRCBzdGFuZGFyZCBwIElWLTcgKi8KKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAxKTsgLyogYXVkaW8gbG9ja2VkICovCisgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMSk7IC8qIHZpZGVvIGxvY2tlZCAqLworICAgIH0gZWxzZSB7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7IC8qIGF1ZGlvIGxvY2tlZCAqLworICAgICAgICBwdXRfYml0cygmcGIsIDEsIDApOyAvKiB2aWRlbyBsb2NrZWQgKi8KKyAgICB9CisKKyAgICBwdXRfYml0cygmcGIsIDEsIDEpOyAvKiBtYXJrZXIgKi8KKworICAgIGlmIChzLT5pc192Y2QgJiYgKG9ubHlfZm9yX3N0cmVhbV9pZCAmIDB4ZTApID09IEFVRElPX0lEKSB7CisgICAgICAgIC8qIFRoaXMgaGVhZGVyIGFwcGxpZXMgb25seSB0byB0aGUgYXVkaW8gc3RyZWFtCisgICAgICAgICAqIChzZWUgVkNEIHN0YW5kYXJkIHAuIElWLTcpICovCisgICAgICAgIHB1dF9iaXRzKCZwYiwgNSwgMCk7CisgICAgfSBlbHNlCisgICAgICAgIHB1dF9iaXRzKCZwYiwgNSwgcy0+dmlkZW9fYm91bmQpOworCisgICAgaWYgKHMtPmlzX2R2ZCkgeworICAgICAgICBwdXRfYml0cygmcGIsIDEsIDApOyAgICAvKiBwYWNrZXRfcmF0ZV9yZXN0cmljdGlvbl9mbGFnICovCisgICAgICAgIHB1dF9iaXRzKCZwYiwgNywgMHg3Zik7IC8qIHJlc2VydmVkIGJ5dGUgKi8KKyAgICB9IGVsc2UKKyAgICAgICAgcHV0X2JpdHMoJnBiLCA4LCAweGZmKTsgLyogcmVzZXJ2ZWQgYnl0ZSAqLworCisgICAgLyogRFZELVZpZGVvIFN0cmVhbV9ib3VuZCBlbnRyaWVzCisgICAgICogaWQgKDB4QjkpIHZpZGVvLCBtYXhpbXVtIFAtU1REIGZvciBzdHJlYW0gMHhFMC4gKFAtU1REX2J1ZmZlcl9ib3VuZF9zY2FsZSA9IDEpCisgICAgICogaWQgKDB4QjgpIGF1ZGlvLCBtYXhpbXVtIFAtU1REIGZvciBhbnkgTVBFRyBhdWRpbyAoMHhDMCB0byAweEM3KSBzdHJlYW1zLiBJZiB0aGVyZSBhcmUgbm9uZSBzZXQgdG8gNDA5NiAoMzJ4MTI4KS4gKFAtU1REX2J1ZmZlcl9ib3VuZF9zY2FsZSA9IDApCisgICAgICogaWQgKDB4QkQpIHByaXZhdGUgc3RyZWFtIDEgKGF1ZGlvIG90aGVyIHRoYW4gTVBFRyBhbmQgc3VicGljdHVyZXMpLiAoUC1TVERfYnVmZmVyX2JvdW5kX3NjYWxlID0gMSkKKyAgICAgKiBpZCAoMHhCRikgcHJpdmF0ZSBzdHJlYW0gMiwgTkFWIHBhY2tzLCBzZXQgdG8gMngxMDI0LiAqLworICAgIGlmIChzLT5pc19kdmQpIHsKKworICAgICAgICBpbnQgUF9TVERfbWF4X3ZpZGVvID0gMDsKKyAgICAgICAgaW50IFBfU1REX21heF9tcGVnX2F1ZGlvID0gMDsKKyAgICAgICAgaW50IFBfU1REX21heF9tcGVnX1BTMSA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBTdHJlYW1JbmZvICpzdHJlYW0gPSBjdHgtPnN0cmVhbXNbaV0tPnByaXZfZGF0YTsKKworICAgICAgICAgICAgaWQgPSBzdHJlYW0tPmlkOworICAgICAgICAgICAgaWYgKGlkID09IDB4YmQgJiYgc3RyZWFtLT5tYXhfYnVmZmVyX3NpemUgPiBQX1NURF9tYXhfbXBlZ19QUzEpIHsKKyAgICAgICAgICAgICAgICBQX1NURF9tYXhfbXBlZ19QUzEgPSBzdHJlYW0tPm1heF9idWZmZXJfc2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPj0gMHhjMCAmJiBpZCA8PSAweGM3ICYmCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+bWF4X2J1ZmZlcl9zaXplID4gUF9TVERfbWF4X21wZWdfYXVkaW8pIHsKKyAgICAgICAgICAgICAgICBQX1NURF9tYXhfbXBlZ19hdWRpbyA9IHN0cmVhbS0+bWF4X2J1ZmZlcl9zaXplOworICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSAweGUwICYmCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+bWF4X2J1ZmZlcl9zaXplID4gUF9TVERfbWF4X3ZpZGVvKSB7CisgICAgICAgICAgICAgICAgUF9TVERfbWF4X3ZpZGVvID0gc3RyZWFtLT5tYXhfYnVmZmVyX3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiB2aWRlbyAqLworICAgICAgICBwdXRfYml0cygmcGIsIDgsIDB4YjkpOyAvKiBzdHJlYW0gSUQgKi8KKyAgICAgICAgcHV0X2JpdHMoJnBiLCAyLCAzKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAxKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxMywgUF9TVERfbWF4X3ZpZGVvIC8gMTAyNCk7CisKKyAgICAgICAgLyogYXVkaW8gKi8KKyAgICAgICAgaWYgKFBfU1REX21heF9tcGVnX2F1ZGlvID09IDApCisgICAgICAgICAgICBQX1NURF9tYXhfbXBlZ19hdWRpbyA9IDQwOTY7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgMHhiOCk7IC8qIHN0cmVhbSBJRCAqLworICAgICAgICBwdXRfYml0cygmcGIsIDIsIDMpOworICAgICAgICBwdXRfYml0cygmcGIsIDEsIDApOworICAgICAgICBwdXRfYml0cygmcGIsIDEzLCBQX1NURF9tYXhfbXBlZ19hdWRpbyAvIDEyOCk7CisKKyAgICAgICAgLyogcHJpdmF0ZSBzdHJlYW0gMSAqLworICAgICAgICBwdXRfYml0cygmcGIsIDgsIDB4YmQpOyAvKiBzdHJlYW0gSUQgKi8KKyAgICAgICAgcHV0X2JpdHMoJnBiLCAyLCAzKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxMywgUF9TVERfbWF4X21wZWdfUFMxIC8gMTI4KTsKKworICAgICAgICAvKiBwcml2YXRlIHN0cmVhbSAyICovCisgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgMHhiZik7IC8qIHN0cmVhbSBJRCAqLworICAgICAgICBwdXRfYml0cygmcGIsIDIsIDMpOworICAgICAgICBwdXRfYml0cygmcGIsIDEsIDEpOworICAgICAgICBwdXRfYml0cygmcGIsIDEzLCAyKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBhdWRpbyBzdHJlYW0gaW5mbyAqLworICAgICAgICBwcml2YXRlX3N0cmVhbV9jb2RlZCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgU3RyZWFtSW5mbyAqc3RyZWFtID0gY3R4LT5zdHJlYW1zW2ldLT5wcml2X2RhdGE7CisKKyAgICAgICAgICAgIC8qIEZvciBWQ0RzLCBvbmx5IGluY2x1ZGUgdGhlIHN0cmVhbSBpbmZvIGZvciB0aGUgc3RyZWFtCisgICAgICAgICAgICAgKiB0aGF0IHRoZSBwYWNrIHdoaWNoIGNvbnRhaW5zIHRoaXMgc3lzdGVtIGJlbG9uZ3MgdG8uCisgICAgICAgICAgICAgKiAoc2VlIFZDRCBzdGFuZGFyZCBwLiBJVi03KSAqLworICAgICAgICAgICAgaWYgKCFzLT5pc192Y2QgfHwgc3RyZWFtLT5pZCA9PSBvbmx5X2Zvcl9zdHJlYW1faWQgfHwKKyAgICAgICAgICAgICAgICBvbmx5X2Zvcl9zdHJlYW1faWQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlkID0gc3RyZWFtLT5pZDsKKyAgICAgICAgICAgICAgICBpZiAoaWQgPCAweGMwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgcHJpdmF0ZSBzdHJlYW1zIChBQy0zIHVzZXMgdGhhdCkgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByaXZhdGVfc3RyZWFtX2NvZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIHByaXZhdGVfc3RyZWFtX2NvZGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSAweGJkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcGIsIDgsIGlkKTsgICAgICAgICAvKiBzdHJlYW0gSUQgKi8KKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcGIsIDIsIDMpOworICAgICAgICAgICAgICAgIGlmIChpZCA8IDB4ZTApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYXVkaW8gKi8KKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCAxMywgc3RyZWFtLT5tYXhfYnVmZmVyX3NpemUgLyAxMjgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHZpZGVvICovCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgMTMsIHN0cmVhbS0+bWF4X2J1ZmZlcl9zaXplIC8gMTAyNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKyAgICBzaXplID0gcHV0X2JpdHNfcHRyKCZwYikgLSBwYi5idWY7CisgICAgLyogcGF0Y2ggcGFja2V0IHNpemUgKi8KKyAgICBBVl9XQjE2KGJ1ZiArIDQsIHNpemUgLSA2KTsKKworICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGdldF9zeXN0ZW1faGVhZGVyX3NpemUoQVZGb3JtYXRDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGJ1Zl9pbmRleCwgaSwgcHJpdmF0ZV9zdHJlYW1fY29kZWQ7CisgICAgU3RyZWFtSW5mbyAqc3RyZWFtOworICAgIE1wZWdNdXhDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAocy0+aXNfZHZkKQorICAgICAgICByZXR1cm4gMTg7IC8vIERWRC1WaWRlbyBzeXN0ZW0gaGVhZGVycyBhcmUgMTggYnl0ZXMgZml4ZWQgbGVuZ3RoLgorCisgICAgYnVmX2luZGV4ID0gMTI7CisgICAgcHJpdmF0ZV9zdHJlYW1fY29kZWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzdHJlYW0gPSBjdHgtPnN0cmVhbXNbaV0tPnByaXZfZGF0YTsKKyAgICAgICAgaWYgKHN0cmVhbS0+aWQgPCAweGMwKSB7CisgICAgICAgICAgICBpZiAocHJpdmF0ZV9zdHJlYW1fY29kZWQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBwcml2YXRlX3N0cmVhbV9jb2RlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnVmX2luZGV4ICs9IDM7CisgICAgfQorICAgIHJldHVybiBidWZfaW5kZXg7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtcGVnX211eF9pbml0KEFWRm9ybWF0Q29udGV4dCAqY3R4KQoreworICAgIE1wZWdNdXhDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGJpdHJhdGUsIGksIG1wYV9pZCwgbXB2X2lkLCBoMjY0X2lkLCBtcHNfaWQsIGFjM19pZCwgZHRzX2lkLCBscGNtX2lkLCBqOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBTdHJlYW1JbmZvICpzdHJlYW07CisgICAgaW50IGF1ZGlvX2JpdHJhdGU7CisgICAgaW50IHZpZGVvX2JpdHJhdGU7CisKKyAgICBzLT5wYWNrZXRfbnVtYmVyID0gMDsKKyAgICBzLT5pc192Y2QgICA9ICAoQ09ORklHX01QRUcxVkNEX01VWEVSICAmJiBjdHgtPm9mb3JtYXQgPT0gJmZmX21wZWcxdmNkX211eGVyKTsKKyAgICBzLT5pc19zdmNkICA9ICAoQ09ORklHX01QRUcyU1ZDRF9NVVhFUiAmJiBjdHgtPm9mb3JtYXQgPT0gJmZmX21wZWcyc3ZjZF9tdXhlcik7CisgICAgcy0+aXNfbXBlZzIgPSAoKENPTkZJR19NUEVHMlZPQl9NVVhFUiAgJiYgY3R4LT5vZm9ybWF0ID09ICZmZl9tcGVnMnZvYl9tdXhlcikgfHwKKyAgICAgICAgICAgICAgICAgICAoQ09ORklHX01QRUcyRFZEX01VWEVSICAmJiBjdHgtPm9mb3JtYXQgPT0gJmZmX21wZWcyZHZkX211eGVyKSB8fAorICAgICAgICAgICAgICAgICAgIChDT05GSUdfTVBFRzJTVkNEX01VWEVSICYmIGN0eC0+b2Zvcm1hdCA9PSAmZmZfbXBlZzJzdmNkX211eGVyKSk7CisgICAgcy0+aXNfZHZkICAgPSAgKENPTkZJR19NUEVHMkRWRF9NVVhFUiAgJiYgY3R4LT5vZm9ybWF0ID09ICZmZl9tcGVnMmR2ZF9tdXhlcik7CisKKyAgICBpZiAoY3R4LT5wYWNrZXRfc2l6ZSkgeworICAgICAgICBpZiAoY3R4LT5wYWNrZXRfc2l6ZSA8IDIwIHx8IGN0eC0+cGFja2V0X3NpemUgPiAoMSA8PCAyMykgKyAxMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYWNrZXQgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBjdHgtPnBhY2tldF9zaXplKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBzLT5wYWNrZXRfc2l6ZSA9IGN0eC0+cGFja2V0X3NpemU7CisgICAgfSBlbHNlCisgICAgICAgIHMtPnBhY2tldF9zaXplID0gMjA0ODsKKyAgICBpZiAoY3R4LT5tYXhfZGVsYXkgPCAwKSAgICAgLyogTm90IHNldCBieSB0aGUgY2FsbGVyICovCisgICAgICAgIGN0eC0+bWF4X2RlbGF5ID0gMC43KkFWX1RJTUVfQkFTRTsKKworICAgIHMtPnZjZF9wYWRkaW5nX2J5dGVzX3dyaXR0ZW4gPSAwOworICAgIHMtPnZjZF9wYWRkaW5nX2JpdHJhdGUgICAgICAgPSAwOworCisgICAgcy0+YXVkaW9fYm91bmQgPSAwOworICAgIHMtPnZpZGVvX2JvdW5kID0gMDsKKworICAgIG1wYV9pZCAgPSBBVURJT19JRDsKKyAgICBhYzNfaWQgID0gQUMzX0lEOworICAgIGR0c19pZCAgPSBEVFNfSUQ7CisgICAgbXB2X2lkICA9IFZJREVPX0lEOworICAgIGgyNjRfaWQgPSBIMjY0X0lEOworICAgIG1wc19pZCAgPSBTVUJfSUQ7CisgICAgbHBjbV9pZCA9IExQQ01fSUQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgc3QgICAgID0gY3R4LT5zdHJlYW1zW2ldOworICAgICAgICBzdHJlYW0gPSBhdl9tYWxsb2N6KHNpemVvZihTdHJlYW1JbmZvKSk7CisgICAgICAgIGlmICghc3RyZWFtKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBzdC0+cHJpdl9kYXRhID0gc3RyZWFtOworCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCA5MDAwMCk7CisKKyAgICAgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICBpZiAoIXMtPmlzX21wZWcyICYmCisgICAgICAgICAgICAgICAgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzIHx8CisgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFRTIHx8CisgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFKSkKKyAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaW4gTVBFRy0xIHN5c3RlbSBzdHJlYW1zIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY29uc2lkZXIgdXNpbmcgdGhlIHZvYiBvciB0aGUgZHZkIG11eGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0byBmb3JjZSBhIE1QRUctMiBwcm9ncmFtIHN0cmVhbS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKHN0LT5jb2RlYy0+Y29kZWNfaWQpKTsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FDMykgeworICAgICAgICAgICAgICAgIHN0cmVhbS0+aWQgPSBhYzNfaWQrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVFMpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmlkID0gZHRzX2lkKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5pZCA9IGxwY21faWQrKzsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChscGNtX2ZyZXFfdGFiW2pdID09IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID4gOCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHN0cmVhbS0+bHBjbV9oZWFkZXJbMF0gPSAweDBjOworICAgICAgICAgICAgICAgIHN0cmVhbS0+bHBjbV9oZWFkZXJbMV0gPSAoc3QtPmNvZGVjLT5jaGFubmVscyAtIDEpIHwgKGogPDwgNCk7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5scGNtX2hlYWRlclsyXSA9IDB4ODA7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5scGNtX2FsaWduICAgICA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmlkID0gbXBhX2lkKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFRoaXMgdmFsdWUgSEFTIHRvIGJlIHVzZWQgZm9yIFZDRCAoc2VlIFZDRCBzdGFuZGFyZCwgcC4gSVYtNykuCisgICAgICAgICAgICAgKiBSaWdodCBub3cgaXQgaXMgYWxzbyB1c2VkIGZvciBldmVyeXRoaW5nIGVsc2UuICovCisgICAgICAgICAgICBzdHJlYW0tPm1heF9idWZmZXJfc2l6ZSA9IDQgKiAxMDI0OworICAgICAgICAgICAgcy0+YXVkaW9fYm91bmQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpCisgICAgICAgICAgICAgICAgc3RyZWFtLT5pZCA9IGgyNjRfaWQrKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmlkID0gbXB2X2lkKys7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5yY19idWZmZXJfc2l6ZSkKKyAgICAgICAgICAgICAgICBzdHJlYW0tPm1heF9idWZmZXJfc2l6ZSA9IDYgKiAxMDI0ICsgc3QtPmNvZGVjLT5yY19idWZmZXJfc2l6ZSAvIDg7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIlZCViBidWZmZXIgc2l6ZSBub3Qgc2V0LCB1c2luZyBkZWZhdWx0IHNpemUgb2YgMTMwS0JcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIklmIHlvdSB3YW50IHRoZSBtcGVnIGZpbGUgdG8gYmUgY29tcGxpYW50IHRvIHNvbWUgc3BlY2lmaWNhdGlvblxuIgorICAgICAgICAgICAgICAgICAgICAgICAiTGlrZSBEVkQsIFZDRCBvciBvdGhlcnMsIG1ha2Ugc3VyZSB5b3Ugc2V0IHRoZSBjb3JyZWN0IGJ1ZmZlciBzaXplXG4iKTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBwcm9iYWJseSB0b28gc21hbGwgYXMgZGVmYXVsdAorICAgICAgICAgICAgICAgIHN0cmVhbS0+bWF4X2J1ZmZlcl9zaXplID0gMjMwICogMTAyNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJlYW0tPm1heF9idWZmZXJfc2l6ZSA+IDEwMjQgKiA4MTkxKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJidWZmZXIgc2l6ZSAlZCwgdG9vIGxhcmdlXG4iLCBzdHJlYW0tPm1heF9idWZmZXJfc2l6ZSk7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5tYXhfYnVmZmVyX3NpemUgPSAxMDI0ICogODE5MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnZpZGVvX2JvdW5kKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6CisgICAgICAgICAgICBzdHJlYW0tPmlkICAgICAgICAgICAgICA9IG1wc19pZCsrOworICAgICAgICAgICAgc3RyZWFtLT5tYXhfYnVmZmVyX3NpemUgPSAxNiAqIDEwMjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW0tPmZpZm8gPSBhdl9maWZvX2FsbG9jKDE2KTsKKyAgICAgICAgaWYgKCFzdHJlYW0tPmZpZm8pCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGJpdHJhdGUgICAgICAgPSAwOworICAgIGF1ZGlvX2JpdHJhdGUgPSAwOworICAgIHZpZGVvX2JpdHJhdGUgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpbnQgY29kZWNfcmF0ZTsKKyAgICAgICAgc3QgICAgID0gY3R4LT5zdHJlYW1zW2ldOworICAgICAgICBzdHJlYW0gPSAoU3RyZWFtSW5mbyAqKXN0LT5wcml2X2RhdGE7CisKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+cmNfbWF4X3JhdGUgfHwKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICBjb2RlY19yYXRlID0gc3QtPmNvZGVjLT5yY19tYXhfcmF0ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29kZWNfcmF0ZSA9IHN0LT5jb2RlYy0+Yml0X3JhdGU7CisKKyAgICAgICAgaWYgKCFjb2RlY19yYXRlKQorICAgICAgICAgICAgY29kZWNfcmF0ZSA9ICgxIDw8IDIxKSAqIDggKiA1MCAvIGN0eC0+bmJfc3RyZWFtczsKKworICAgICAgICBiaXRyYXRlICs9IGNvZGVjX3JhdGU7CisKKyAgICAgICAgaWYgKChzdHJlYW0tPmlkICYgMHhlMCkgPT0gQVVESU9fSUQpCisgICAgICAgICAgICBhdWRpb19iaXRyYXRlICs9IGNvZGVjX3JhdGU7CisgICAgICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICB2aWRlb19iaXRyYXRlICs9IGNvZGVjX3JhdGU7CisgICAgfQorCisgICAgaWYgKHMtPnVzZXJfbXV4X3JhdGUpIHsKKyAgICAgICAgcy0+bXV4X3JhdGUgPSAocy0+dXNlcl9tdXhfcmF0ZSArICg4ICogNTApIC0gMSkgLyAoOCAqIDUwKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiB3ZSBpbmNyZWFzZSBzbGlnaHRseSB0aGUgYml0cmF0ZSB0byB0YWtlIGludG8gYWNjb3VudCB0aGUKKyAgICAgICAgICogaGVhZGVycy4gWFhYOiBjb21wdXRlIGl0IGV4YWN0bHkgKi8KKyAgICAgICAgYml0cmF0ZSAgICArPSBiaXRyYXRlIC8gMjA7CisgICAgICAgIGJpdHJhdGUgICAgKz0gMTAwMDA7CisgICAgICAgIHMtPm11eF9yYXRlID0gKGJpdHJhdGUgKyAoOCAqIDUwKSAtIDEpIC8gKDggKiA1MCk7CisgICAgICAgIGlmIChzLT5tdXhfcmF0ZSA+PSAoMTw8MjIpKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIm11eCByYXRlICVkIGlzIHRvbyBsYXJnZVxuIiwgcy0+bXV4X3JhdGUpOworICAgICAgICAgICAgcy0+bXV4X3JhdGUgPSAoMTw8MjIpIC0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5pc192Y2QpIHsKKyAgICAgICAgZG91YmxlIG92ZXJoZWFkX3JhdGU7CisKKyAgICAgICAgLyogVGhlIFZDRCBzdGFuZGFyZCBtYW5kYXRlcyB0aGF0IHRoZSBtdXhfcmF0ZSBmaWVsZCBpcyAzNTI4CisgICAgICAgICAqIChzZWUgc3RhbmRhcmQgcC4gSVYtNikuCisgICAgICAgICAqIFRoZSB2YWx1ZSBpcyBhY3R1YWxseSAid3JvbmciLCBpLmUuIGlmIHlvdSBjYWxjdWxhdGUKKyAgICAgICAgICogaXQgdXNpbmcgdGhlIG5vcm1hbCBmb3JtdWxhIGFuZCB0aGUgNzUgc2VjdG9ycyBwZXIgc2Vjb25kIHRyYW5zZmVyCisgICAgICAgICAqIHJhdGUgeW91IGdldCBhIGRpZmZlcmVudCB2YWx1ZSBiZWNhdXNlIHRoZSByZWFsIHBhY2sgc2l6ZSBpcyAyMzI0LAorICAgICAgICAgKiBub3QgMjM1Mi4gQnV0IHRoZSBzdGFuZGFyZCBleHBsaWNpdGx5IHNwZWNpZmllcyB0aGF0IHRoZSBtdXhfcmF0ZQorICAgICAgICAgKiBmaWVsZCBpbiB0aGUgaGVhZGVyIG11c3QgaGF2ZSB0aGlzIHZhbHVlLiAqLworICAgICAgICAvLyBzLT5tdXhfcmF0ZSA9IDIzNTIgKiA3NSAvIDUwOyAgICAvKiA9IDM1MjggKi8KKworICAgICAgICAvKiBUaGUgVkNEIHN0YW5kYXJkIHN0YXRlcyB0aGF0IHRoZSBtdXhlZCBzdHJlYW0gbXVzdCBiZQorICAgICAgICAgKiBleGFjdGx5IDc1IHBhY2tzIC8gc2Vjb25kICh0aGUgZGF0YSByYXRlIG9mIGEgc2luZ2xlIHNwZWVkIGNkcm9tKS4KKyAgICAgICAgICogU2luY2UgdGhlIHZpZGVvIGJpdHJhdGUgKHByb2JhYmx5IDExNTAwMDAgYml0cy9zZWMpIHdpbGwgYmUgYmVsb3cKKyAgICAgICAgICogdGhlIHRoZW9yZXRpY2FsIG1heGltdW0gd2UgaGF2ZSB0byBhZGQgc29tZSBwYWRkaW5nIHBhY2tldHMKKyAgICAgICAgICogdG8gbWFrZSB1cCBmb3IgdGhlIGxvd2VyIGRhdGEgcmF0ZS4KKyAgICAgICAgICogKGNmLiBWQ0Qgc3RhbmRhcmQgcC4gSVYtNiApICovCisKKyAgICAgICAgLyogQWRkIHRoZSBoZWFkZXIgb3ZlcmhlYWQgdG8gdGhlIGRhdGEgcmF0ZS4KKyAgICAgICAgICogMjI3OSBkYXRhIGJ5dGVzIHBlciBhdWRpbyBwYWNrLCAyMjk0IGRhdGEgYnl0ZXMgcGVyIHZpZGVvIHBhY2sgKi8KKyAgICAgICAgb3ZlcmhlYWRfcmF0ZSAgPSAoKGF1ZGlvX2JpdHJhdGUgLyA4LjApIC8gMjI3OSkgKiAoMjMyNCAtIDIyNzkpOworICAgICAgICBvdmVyaGVhZF9yYXRlICs9ICgodmlkZW9fYml0cmF0ZSAvIDguMCkgLyAyMjk0KSAqICgyMzI0IC0gMjI5NCk7CisgICAgICAgIG92ZXJoZWFkX3JhdGUgKj0gODsKKworICAgICAgICAvKiBBZGQgcGFkZGluZyBzbyB0aGF0IHRoZSBmdWxsIGJpdHJhdGUgaXMgMjMyNCo3NSBieXRlcy9zZWMgKi8KKyAgICAgICAgcy0+dmNkX3BhZGRpbmdfYml0cmF0ZSA9IDIzMjQgKiA3NSAqIDggLSAoYml0cmF0ZSArIG92ZXJoZWFkX3JhdGUpOworICAgIH0KKworICAgIGlmIChzLT5pc192Y2QgfHwgcy0+aXNfbXBlZzIpCisgICAgICAgIC8qIGV2ZXJ5IHBhY2tldCAqLworICAgICAgICBzLT5wYWNrX2hlYWRlcl9mcmVxID0gMTsKKyAgICBlbHNlCisgICAgICAgIC8qIGV2ZXJ5IDIgc2Vjb25kcyAqLworICAgICAgICBzLT5wYWNrX2hlYWRlcl9mcmVxID0gMiAqIGJpdHJhdGUgLyBzLT5wYWNrZXRfc2l6ZSAvIDg7CisKKyAgICAvKiB0aGUgYWJvdmUgc2VlbXMgdG8gbWFrZSBwYWNrX2hlYWRlcl9mcmVxIHplcm8gc29tZXRpbWVzICovCisgICAgaWYgKHMtPnBhY2tfaGVhZGVyX2ZyZXEgPT0gMCkKKyAgICAgICAgcy0+cGFja19oZWFkZXJfZnJlcSA9IDE7CisKKyAgICBpZiAocy0+aXNfbXBlZzIpCisgICAgICAgIC8qIGV2ZXJ5IDIwMCBwYWNrZXRzLiBOZWVkIHRvIGxvb2sgYXQgdGhlIHNwZWMuICAqLworICAgICAgICBzLT5zeXN0ZW1faGVhZGVyX2ZyZXEgPSBzLT5wYWNrX2hlYWRlcl9mcmVxICogNDA7CisgICAgZWxzZSBpZiAocy0+aXNfdmNkKQorICAgICAgICAvKiB0aGUgc3RhbmRhcmQgbWFuZGF0ZXMgdGhhdCB0aGVyZSBhcmUgb25seSB0d28gc3lzdGVtIGhlYWRlcnMKKyAgICAgICAgICogaW4gdGhlIHdob2xlIGZpbGU6IG9uZSBpbiB0aGUgZmlyc3QgcGFja2V0IG9mIGVhY2ggc3RyZWFtLgorICAgICAgICAgKiAoc2VlIHN0YW5kYXJkIHAuIElWLTcgYW5kIElWLTgpICovCisgICAgICAgIHMtPnN5c3RlbV9oZWFkZXJfZnJlcSA9IDB4N2ZmZmZmZmY7CisgICAgZWxzZQorICAgICAgICBzLT5zeXN0ZW1faGVhZGVyX2ZyZXEgPSBzLT5wYWNrX2hlYWRlcl9mcmVxICogNTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzdHJlYW0gICAgICAgICAgICAgICAgPSBjdHgtPnN0cmVhbXNbaV0tPnByaXZfZGF0YTsKKyAgICAgICAgc3RyZWFtLT5wYWNrZXRfbnVtYmVyID0gMDsKKyAgICB9CisgICAgcy0+c3lzdGVtX2hlYWRlcl9zaXplID0gZ2V0X3N5c3RlbV9oZWFkZXJfc2l6ZShjdHgpOworICAgIHMtPmxhc3Rfc2NyICAgICAgICAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgYXZfZnJlZShjdHgtPnN0cmVhbXNbaV0tPnByaXZfZGF0YSk7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF90aW1lc3RhbXAoQVZJT0NvbnRleHQgKnBiLCBpbnQgaWQsIGludDY0X3QgdGltZXN0YW1wKQoreworICAgIGF2aW9fdzgocGIsIChpZCA8PCA0KSB8ICAoKCh0aW1lc3RhbXAgPj4gMzApICYgMHgwNykgICA8PCAxKSB8IDEpOworICAgIGF2aW9fd2IxNihwYiwgKHVpbnQxNl90KSgoKCh0aW1lc3RhbXAgPj4gMTUpICYgMHg3ZmZmKSA8PCAxKSB8IDEpKTsKKyAgICBhdmlvX3diMTYocGIsICh1aW50MTZfdCkoKCgodGltZXN0YW1wKSAgICAgICAmIDB4N2ZmZikgPDwgMSkgfCAxKSk7Cit9CisKKy8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgdGhhdCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50bworICogdGhlIG11bHRpcGxleGVkIHN0cmVhbS4gKi8KK3N0YXRpYyBpbnQgZ2V0X3ZjZF9wYWRkaW5nX3NpemUoQVZGb3JtYXRDb250ZXh0ICpjdHgsIGludDY0X3QgcHRzKQoreworICAgIE1wZWdNdXhDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IHBhZF9ieXRlcyA9IDA7CisKKyAgICBpZiAocy0+dmNkX3BhZGRpbmdfYml0cmF0ZSA+IDAgJiYgcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGludDY0X3QgZnVsbF9wYWRfYnl0ZXM7CisKKyAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgd3JvbmcKKyAgICAgICAgZnVsbF9wYWRfYnl0ZXMgPQorICAgICAgICAgICAgKGludDY0X3QpKChzLT52Y2RfcGFkZGluZ19iaXRyYXRlICogKHB0cyAvIDkwMDAwLjApKSAvIDguMCk7CisgICAgICAgIHBhZF9ieXRlcyA9IChpbnQpKGZ1bGxfcGFkX2J5dGVzIC0gcy0+dmNkX3BhZGRpbmdfYnl0ZXNfd3JpdHRlbik7CisKKyAgICAgICAgaWYgKHBhZF9ieXRlcyA8IDApCisgICAgICAgICAgICAvKiBtaWdodCBoYXBwZW4gaWYgd2UgaGF2ZSBhbHJlYWR5IHBhZGRlZCB0byBhIGxhdGVyIHRpbWVzdGFtcC4gVGhpcworICAgICAgICAgICAgICogY2FuIG9jY3VyIGlmIGFub3RoZXIgc3RyZWFtIGhhcyBhbHJlYWR5IGFkdmFuY2VkIGZ1cnRoZXIuICovCisgICAgICAgICAgICBwYWRfYnl0ZXMgPSAwOworICAgIH0KKworICAgIHJldHVybiBwYWRfYnl0ZXM7Cit9CisKKy8qIFdyaXRlIGFuIE1QRUcgcGFkZGluZyBwYWNrZXQgaGVhZGVyLiAqLworc3RhdGljIHZvaWQgcHV0X3BhZGRpbmdfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhY2tldF9ieXRlcykKK3sKKyAgICBNcGVnTXV4Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgYXZpb193YjMyKHBiLCBQQURESU5HX1NUUkVBTSk7CisgICAgYXZpb193YjE2KHBiLCBwYWNrZXRfYnl0ZXMgLSA2KTsKKyAgICBpZiAoIXMtPmlzX21wZWcyKSB7CisgICAgICAgIGF2aW9fdzgocGIsIDB4MGYpOworICAgICAgICBwYWNrZXRfYnl0ZXMgLT0gNzsKKyAgICB9IGVsc2UKKyAgICAgICAgcGFja2V0X2J5dGVzIC09IDY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFja2V0X2J5dGVzOyBpKyspCisgICAgICAgIGF2aW9fdzgocGIsIDB4ZmYpOworfQorCitzdGF0aWMgaW50IGdldF9uYl9mcmFtZXMoQVZGb3JtYXRDb250ZXh0ICpjdHgsIFN0cmVhbUluZm8gKnN0cmVhbSwgaW50IGxlbikKK3sKKyAgICBpbnQgbmJfZnJhbWVzICAgICAgICA9IDA7CisgICAgUGFja2V0RGVzYyAqcGt0X2Rlc2MgPSBzdHJlYW0tPnByZW11eF9wYWNrZXQ7CisKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBpZiAocGt0X2Rlc2MtPnNpemUgPT0gcGt0X2Rlc2MtPnVud3JpdHRlbl9zaXplKQorICAgICAgICAgICAgbmJfZnJhbWVzKys7CisgICAgICAgIGxlbiAgICAgLT0gcGt0X2Rlc2MtPnVud3JpdHRlbl9zaXplOworICAgICAgICBwa3RfZGVzYyA9IHBrdF9kZXNjLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBuYl9mcmFtZXM7Cit9CisKKy8qIGZsdXNoIHRoZSBwYWNrZXQgb24gc3RyZWFtIHN0cmVhbV9pbmRleCAqLworc3RhdGljIGludCBmbHVzaF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cywgaW50NjRfdCBkdHMsIGludDY0X3Qgc2NyLCBpbnQgdHJhaWxlcl9zaXplKQoreworICAgIE1wZWdNdXhDb250ZXh0ICpzICA9IGN0eC0+cHJpdl9kYXRhOworICAgIFN0cmVhbUluZm8gKnN0cmVhbSA9IGN0eC0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqYnVmX3B0cjsKKyAgICBpbnQgc2l6ZSwgcGF5bG9hZF9zaXplLCBzdGFydGNvZGUsIGlkLCBzdHVmZmluZ19zaXplLCBpLCBoZWFkZXJfbGVuOworICAgIGludCBwYWNrZXRfc2l6ZTsKKyAgICB1aW50OF90IGJ1ZmZlclsxMjhdOworICAgIGludCB6ZXJvX3RyYWlsX2J5dGVzID0gMDsKKyAgICBpbnQgcGFkX3BhY2tldF9ieXRlcyA9IDA7CisgICAgaW50IHBlc19mbGFnczsKKyAgICAvKiAiZ2VuZXJhbCIgcGFjayB3aXRob3V0IGRhdGEgc3BlY2lmaWMgdG8gb25lIHN0cmVhbT8gKi8KKyAgICBpbnQgZ2VuZXJhbF9wYWNrID0gMDsKKyAgICBpbnQgbmJfZnJhbWVzOworCisgICAgaWQgPSBzdHJlYW0tPmlkOworCisgICAgYXZfZGxvZyhjdHgsICJwYWNrZXQgSUQ9JTJ4IFBUUz0lMC4zZlxuIiwgaWQsIHB0cyAvIDkwMDAwLjApOworCisgICAgYnVmX3B0ciA9IGJ1ZmZlcjsKKworICAgIGlmICgocy0+cGFja2V0X251bWJlciAlIHMtPnBhY2tfaGVhZGVyX2ZyZXEpID09IDAgfHwgcy0+bGFzdF9zY3IgIT0gc2NyKSB7CisgICAgICAgIC8qIG91dHB1dCBwYWNrIGFuZCBzeXN0ZW1zIGhlYWRlciBpZiBuZWVkZWQgKi8KKyAgICAgICAgc2l6ZSAgICAgICAgPSBwdXRfcGFja19oZWFkZXIoY3R4LCBidWZfcHRyLCBzY3IpOworICAgICAgICBidWZfcHRyICAgICs9IHNpemU7CisgICAgICAgIHMtPmxhc3Rfc2NyID0gc2NyOworCisgICAgICAgIGlmIChzLT5pc192Y2QpIHsKKyAgICAgICAgICAgIC8qIHRoZXJlIGlzIGV4YWN0bHkgb25lIHN5c3RlbSBoZWFkZXIgZm9yIGVhY2ggc3RyZWFtIGluIGEgVkNEIE1QRUcsCisgICAgICAgICAgICAgKiBPbmUgaW4gdGhlIHZlcnkgZmlyc3QgdmlkZW8gcGFja2V0IGFuZCBvbmUgaW4gdGhlIHZlcnkgZmlyc3QKKyAgICAgICAgICAgICAqIGF1ZGlvIHBhY2tldCAoc2VlIFZDRCBzdGFuZGFyZCBwLiBJVi03IGFuZCBJVi04KS4gKi8KKworICAgICAgICAgICAgaWYgKHN0cmVhbS0+cGFja2V0X251bWJlciA9PSAwKSB7CisgICAgICAgICAgICAgICAgc2l6ZSAgICAgPSBwdXRfc3lzdGVtX2hlYWRlcihjdHgsIGJ1Zl9wdHIsIGlkKTsKKyAgICAgICAgICAgICAgICBidWZfcHRyICs9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+aXNfZHZkKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtLT5hbGlnbl9pZnJhbWUgfHwgcy0+cGFja2V0X251bWJlciA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW50IFBFU19ieXRlc190b19maWxsID0gcy0+cGFja2V0X3NpemUgLSBzaXplIC0gMTA7CisKKyAgICAgICAgICAgICAgICBpZiAocHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkdHMgIT0gcHRzKQorICAgICAgICAgICAgICAgICAgICAgICAgUEVTX2J5dGVzX3RvX2ZpbGwgLT0gNSArIDU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFBFU19ieXRlc190b19maWxsIC09IDU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS0+Ynl0ZXNfdG9faWZyYW1lID09IDAgfHwgcy0+cGFja2V0X251bWJlciA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgICAgID0gcHV0X3N5c3RlbV9oZWFkZXIoY3R4LCBidWZfcHRyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmX3B0ciArPSBzaXplOworICAgICAgICAgICAgICAgICAgICBzaXplICAgICA9IGJ1Zl9wdHIgLSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGF2aW9fd3JpdGUoY3R4LT5wYiwgYnVmZmVyLCBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBhdmlvX3diMzIoY3R4LT5wYiwgUFJJVkFURV9TVFJFQU1fMik7CisgICAgICAgICAgICAgICAgICAgIGF2aW9fd2IxNihjdHgtPnBiLCAweDAzZDQpOyAgICAgLy8gbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIGF2aW9fdzgoY3R4LT5wYiwgMHgwMCk7ICAgICAgICAgLy8gc3Vic3RyZWFtIElELCAwMD1QQ0kKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDk3OTsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZpb193OChjdHgtPnBiLCAweDAwKTsKKworICAgICAgICAgICAgICAgICAgICBhdmlvX3diMzIoY3R4LT5wYiwgUFJJVkFURV9TVFJFQU1fMik7CisgICAgICAgICAgICAgICAgICAgIGF2aW9fd2IxNihjdHgtPnBiLCAweDAzZmEpOyAgICAgLy8gbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIGF2aW9fdzgoY3R4LT5wYiwgMHgwMSk7ICAgICAgICAgLy8gc3Vic3RyZWFtIElELCAwMT1EU0kKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMTc7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2aW9fdzgoY3R4LT5wYiwgMHgwMCk7CisKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgMTI4KTsKKyAgICAgICAgICAgICAgICAgICAgYnVmX3B0ciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgcy0+cGFja2V0X251bWJlcisrOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmFsaWduX2lmcmFtZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiByb3VuZGluZyBhbmQgZmlyc3QgZmV3IGJ5dGVzIG9mIGVhY2ggcGFja2V0CisgICAgICAgICAgICAgICAgICAgIHNjciAgICAgICAgKz0gcy0+cGFja2V0X3NpemUgKiA5MDAwMExMIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+bXV4X3JhdGUgKiA1MExMKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSAgICAgICAgPSBwdXRfcGFja19oZWFkZXIoY3R4LCBidWZfcHRyLCBzY3IpOworICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X3NjciA9IHNjcjsKKyAgICAgICAgICAgICAgICAgICAgYnVmX3B0ciAgICArPSBzaXplOworICAgICAgICAgICAgICAgICAgICAvKiBHT1AgU3RhcnQgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS0+Ynl0ZXNfdG9faWZyYW1lIDwgUEVTX2J5dGVzX3RvX2ZpbGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFkX3BhY2tldF9ieXRlcyA9IFBFU19ieXRlc190b19maWxsIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Ynl0ZXNfdG9faWZyYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocy0+cGFja2V0X251bWJlciAlIHMtPnN5c3RlbV9oZWFkZXJfZnJlcSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHNpemUgICAgID0gcHV0X3N5c3RlbV9oZWFkZXIoY3R4LCBidWZfcHRyLCAwKTsKKyAgICAgICAgICAgICAgICBidWZfcHRyICs9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc2l6ZSA9IGJ1Zl9wdHIgLSBidWZmZXI7CisgICAgYXZpb193cml0ZShjdHgtPnBiLCBidWZmZXIsIHNpemUpOworCisgICAgcGFja2V0X3NpemUgPSBzLT5wYWNrZXRfc2l6ZSAtIHNpemU7CisKKyAgICBpZiAocy0+aXNfdmNkICYmIChpZCAmIDB4ZTApID09IEFVRElPX0lEKQorICAgICAgICAvKiBUaGUgVkNEIHN0YW5kYXJkIGRlbWFuZHMgdGhhdCAyMCB6ZXJvIGJ5dGVzIGZvbGxvdworICAgICAgICAgKiBlYWNoIGF1ZGlvIHBhY2sgKHNlZSBzdGFuZGFyZCBwLiBJVi04KS4gKi8KKyAgICAgICAgemVyb190cmFpbF9ieXRlcyArPSAyMDsKKworICAgIGlmICgocy0+aXNfdmNkICYmIHN0cmVhbS0+cGFja2V0X251bWJlciA9PSAwKSB8fAorICAgICAgICAocy0+aXNfc3ZjZCAmJiBzLT5wYWNrZXRfbnVtYmVyID09IDApKSB7CisgICAgICAgIC8qIGZvciBWQ0QgdGhlIGZpcnN0IHBhY2sgb2YgZWFjaCBzdHJlYW0gY29udGFpbnMgb25seSB0aGUgcGFjayBoZWFkZXIsCisgICAgICAgICAqIHRoZSBzeXN0ZW0gaGVhZGVyIGFuZCBsb3RzIG9mIHBhZGRpbmcgKHNlZSBWQ0Qgc3RhbmRhcmQgcC4gSVYtNikuCisgICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGFuIGF1ZGlvIHBhY2ssIDIwIHplcm8gYnl0ZXMgYXJlIGFsc28gYWRkZWQgYXQKKyAgICAgICAgICogdGhlIGVuZC4gKi8KKyAgICAgICAgLyogRm9yIFNWQ0Qgd2UgZmlsbCB0aGUgdmVyeSBmaXJzdCBwYWNrIHRvIGluY3JlYXNlIGNvbXBhdGliaWxpdHkgd2l0aAorICAgICAgICAgKiBzb21lIERWRCBwbGF5ZXJzLiBOb3QgbWFuZGF0ZWQgYnkgdGhlIHN0YW5kYXJkLiAqLworICAgICAgICBpZiAocy0+aXNfc3ZjZCkKKyAgICAgICAgICAgIC8qIHRoZSBzeXN0ZW0gaGVhZGVyIHJlZmVycyB0byBib3RoIHN0cmVhbXMgYW5kIG5vIHN0cmVhbSBkYXRhICovCisgICAgICAgICAgICBnZW5lcmFsX3BhY2sgPSAxOworICAgICAgICBwYWRfcGFja2V0X2J5dGVzID0gcGFja2V0X3NpemUgLSB6ZXJvX3RyYWlsX2J5dGVzOworICAgIH0KKworICAgIHBhY2tldF9zaXplIC09IHBhZF9wYWNrZXRfYnl0ZXMgKyB6ZXJvX3RyYWlsX2J5dGVzOworCisgICAgaWYgKHBhY2tldF9zaXplID4gMCkgeworICAgICAgICAvKiBwYWNrZXQgaGVhZGVyIHNpemUgKi8KKyAgICAgICAgcGFja2V0X3NpemUgLT0gNjsKKworICAgICAgICAvKiBwYWNrZXQgaGVhZGVyICovCisgICAgICAgIGlmIChzLT5pc19tcGVnMikgeworICAgICAgICAgICAgaGVhZGVyX2xlbiA9IDM7CisgICAgICAgICAgICBpZiAoc3RyZWFtLT5wYWNrZXRfbnVtYmVyID09IDApCisgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiArPSAzOyAvKiBQRVMgZXh0ZW5zaW9uICovCisgICAgICAgICAgICBoZWFkZXJfbGVuICs9IDE7IC8qIG9ibGlnYXRvcnkgc3R1ZmZpbmcgYnl0ZSAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGVhZGVyX2xlbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgaWYgKGR0cyAhPSBwdHMpCisgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiArPSA1ICsgNTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBoZWFkZXJfbGVuICs9IDU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXMtPmlzX21wZWcyKQorICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4rKzsKKyAgICAgICAgfQorCisgICAgICAgIHBheWxvYWRfc2l6ZSA9IHBhY2tldF9zaXplIC0gaGVhZGVyX2xlbjsKKyAgICAgICAgaWYgKGlkIDwgMHhjMCkgeworICAgICAgICAgICAgc3RhcnRjb2RlICAgICA9IFBSSVZBVEVfU1RSRUFNXzE7CisgICAgICAgICAgICBwYXlsb2FkX3NpemUgLT0gMTsKKyAgICAgICAgICAgIGlmIChpZCA+PSAweDQwKSB7CisgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IDM7CisgICAgICAgICAgICAgICAgaWYgKGlkID49IDB4YTApCisgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSAtPSAzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnRjb2RlID0gMHgxMDAgKyBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHN0dWZmaW5nX3NpemUgPSBwYXlsb2FkX3NpemUgLSBhdl9maWZvX3NpemUoc3RyZWFtLT5maWZvKTsKKworICAgICAgICAvLyBmaXJzdCBieXRlIGRvZXMgbm90IGZpdCAtPiByZXNldCBwdHMvZHRzICsgc3R1ZmZpbmcKKyAgICAgICAgaWYgKHBheWxvYWRfc2l6ZSA8PSB0cmFpbGVyX3NpemUgJiYgcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBpbnQgdGltZXN0YW1wX2xlbiA9IDA7CisgICAgICAgICAgICBpZiAoZHRzICE9IHB0cykKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBfbGVuICs9IDU7CisgICAgICAgICAgICBpZiAocHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgIHRpbWVzdGFtcF9sZW4gKz0gcy0+aXNfbXBlZzIgPyA1IDogNDsKKyAgICAgICAgICAgIHB0cyAgICAgICAgID0KKyAgICAgICAgICAgIGR0cyAgICAgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgICAgICBoZWFkZXJfbGVuIC09IHRpbWVzdGFtcF9sZW47CisgICAgICAgICAgICBpZiAocy0+aXNfZHZkICYmIHN0cmVhbS0+YWxpZ25faWZyYW1lKSB7CisgICAgICAgICAgICAgICAgcGFkX3BhY2tldF9ieXRlcyArPSB0aW1lc3RhbXBfbGVuOworICAgICAgICAgICAgICAgIHBhY2tldF9zaXplICAgICAgLT0gdGltZXN0YW1wX2xlbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplICs9IHRpbWVzdGFtcF9sZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHVmZmluZ19zaXplICs9IHRpbWVzdGFtcF9sZW47CisgICAgICAgICAgICBpZiAocGF5bG9hZF9zaXplID4gdHJhaWxlcl9zaXplKQorICAgICAgICAgICAgICAgIHN0dWZmaW5nX3NpemUgKz0gcGF5bG9hZF9zaXplIC0gdHJhaWxlcl9zaXplOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2FuJ3QgdXNlIHBhZGRpbmcsIHNvIHVzZSBzdHVmZmluZworICAgICAgICBpZiAocGFkX3BhY2tldF9ieXRlcyA+IDAgJiYgcGFkX3BhY2tldF9ieXRlcyA8PSA3KSB7CisgICAgICAgICAgICBwYWNrZXRfc2l6ZSAgKz0gcGFkX3BhY2tldF9ieXRlczsKKyAgICAgICAgICAgIHBheWxvYWRfc2l6ZSArPSBwYWRfcGFja2V0X2J5dGVzOyAvLyB1bmRvIHRoZSBwcmV2aW91cyBhZGp1c3RtZW50CisgICAgICAgICAgICBpZiAoc3R1ZmZpbmdfc2l6ZSA8IDApCisgICAgICAgICAgICAgICAgc3R1ZmZpbmdfc2l6ZSA9IHBhZF9wYWNrZXRfYnl0ZXM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3R1ZmZpbmdfc2l6ZSArPSBwYWRfcGFja2V0X2J5dGVzOworICAgICAgICAgICAgcGFkX3BhY2tldF9ieXRlcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3R1ZmZpbmdfc2l6ZSA8IDApCisgICAgICAgICAgICBzdHVmZmluZ19zaXplID0gMDsKKworICAgICAgICBpZiAoc3RhcnRjb2RlID09IFBSSVZBVEVfU1RSRUFNXzEgJiYgaWQgPj0gMHhhMCkgeworICAgICAgICAgICAgaWYgKHBheWxvYWRfc2l6ZSA8IGF2X2ZpZm9fc2l6ZShzdHJlYW0tPmZpZm8pKQorICAgICAgICAgICAgICAgIHN0dWZmaW5nX3NpemUgKz0gcGF5bG9hZF9zaXplICUgc3RyZWFtLT5scGNtX2FsaWduOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0dWZmaW5nX3NpemUgPiAxNikgeyAgIC8qIDw9MTYgZm9yIE1QRUctMSwgPD0zMiBmb3IgTVBFRy0yICovCisgICAgICAgICAgICBwYWRfcGFja2V0X2J5dGVzICs9IHN0dWZmaW5nX3NpemU7CisgICAgICAgICAgICBwYWNrZXRfc2l6ZSAgICAgIC09IHN0dWZmaW5nX3NpemU7CisgICAgICAgICAgICBwYXlsb2FkX3NpemUgICAgIC09IHN0dWZmaW5nX3NpemU7CisgICAgICAgICAgICBzdHVmZmluZ19zaXplICAgICA9IDA7CisgICAgICAgIH0KKworICAgICAgICBuYl9mcmFtZXMgPSBnZXRfbmJfZnJhbWVzKGN0eCwgc3RyZWFtLCBwYXlsb2FkX3NpemUgLSBzdHVmZmluZ19zaXplKTsKKworICAgICAgICBhdmlvX3diMzIoY3R4LT5wYiwgc3RhcnRjb2RlKTsKKworICAgICAgICBhdmlvX3diMTYoY3R4LT5wYiwgcGFja2V0X3NpemUpOworCisgICAgICAgIGlmICghcy0+aXNfbXBlZzIpCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3R1ZmZpbmdfc2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgIGF2aW9fdzgoY3R4LT5wYiwgMHhmZik7CisKKyAgICAgICAgaWYgKHMtPmlzX21wZWcyKSB7CisgICAgICAgICAgICBhdmlvX3c4KGN0eC0+cGIsIDB4ODApOyAvKiBtcGVnMiBpZCAqLworCisgICAgICAgICAgICBwZXNfZmxhZ3MgPSAwOworCisgICAgICAgICAgICBpZiAocHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgcGVzX2ZsYWdzIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgaWYgKGR0cyAhPSBwdHMpCisgICAgICAgICAgICAgICAgICAgIHBlc19mbGFncyB8PSAweDQwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBCb3RoIHRoZSBNUEVHLTIgYW5kIHRoZSBTVkNEIHN0YW5kYXJkcyBkZW1hbmQgdGhhdCB0aGUKKyAgICAgICAgICAgICAqIFAtU1REX2J1ZmZlcl9zaXplIGZpZWxkIGJlIGluY2x1ZGVkIGluIHRoZSBmaXJzdCBwYWNrZXQgb2YKKyAgICAgICAgICAgICAqIGV2ZXJ5IHN0cmVhbS4gKHNlZSBTVkNEIHN0YW5kYXJkIHAuIDI2IFYuMi4zLjEgYW5kIFYuMi4zLjIKKyAgICAgICAgICAgICAqIGFuZCBNUEVHLTIgc3RhbmRhcmQgMi43LjcpICovCisgICAgICAgICAgICBpZiAoc3RyZWFtLT5wYWNrZXRfbnVtYmVyID09IDApCisgICAgICAgICAgICAgICAgcGVzX2ZsYWdzIHw9IDB4MDE7CisKKyAgICAgICAgICAgIGF2aW9fdzgoY3R4LT5wYiwgcGVzX2ZsYWdzKTsgLyogZmxhZ3MgKi8KKyAgICAgICAgICAgIGF2aW9fdzgoY3R4LT5wYiwgaGVhZGVyX2xlbiAtIDMgKyBzdHVmZmluZ19zaXplKTsKKworICAgICAgICAgICAgaWYgKHBlc19mbGFncyAmIDB4ODApICAvKiB3cml0ZSBwdHMgKi8KKyAgICAgICAgICAgICAgICBwdXRfdGltZXN0YW1wKGN0eC0+cGIsIChwZXNfZmxhZ3MgJiAweDQwKSA/IDB4MDMgOiAweDAyLCBwdHMpOworICAgICAgICAgICAgaWYgKHBlc19mbGFncyAmIDB4NDApICAvKiB3cml0ZSBkdHMgKi8KKyAgICAgICAgICAgICAgICBwdXRfdGltZXN0YW1wKGN0eC0+cGIsIDB4MDEsIGR0cyk7CisKKyAgICAgICAgICAgIGlmIChwZXNfZmxhZ3MgJiAweDAxKSB7ICAvKiB3cml0ZSBwZXMgZXh0ZW5zaW9uICovCisgICAgICAgICAgICAgICAgYXZpb193OChjdHgtPnBiLCAweDEwKTsgLyogZmxhZ3MgKi8KKworICAgICAgICAgICAgICAgIC8qIFAtU1REIGJ1ZmZlciBpbmZvICovCisgICAgICAgICAgICAgICAgaWYgKChpZCAmIDB4ZTApID09IEFVRElPX0lEKQorICAgICAgICAgICAgICAgICAgICBhdmlvX3diMTYoY3R4LT5wYiwgMHg0MDAwIHwgc3RyZWFtLT5tYXhfYnVmZmVyX3NpemUgLyAxMjgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYXZpb193YjE2KGN0eC0+cGIsIDB4NjAwMCB8IHN0cmVhbS0+bWF4X2J1ZmZlcl9zaXplIC8gMTAyNCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgaWYgKGR0cyAhPSBwdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3RpbWVzdGFtcChjdHgtPnBiLCAweDAzLCBwdHMpOworICAgICAgICAgICAgICAgICAgICBwdXRfdGltZXN0YW1wKGN0eC0+cGIsIDB4MDEsIGR0cyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3RpbWVzdGFtcChjdHgtPnBiLCAweDAyLCBwdHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZpb193OChjdHgtPnBiLCAweDBmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5pc19tcGVnMikgeworICAgICAgICAgICAgLyogc3BlY2lhbCBzdHVmZmluZyBieXRlIHRoYXQgaXMgYWx3YXlzIHdyaXR0ZW4KKyAgICAgICAgICAgICAqIHRvIHByZXZlbnQgYWNjaWRlbnRhbCBnZW5lcmF0aW9uIG9mIHN0YXJ0IGNvZGVzLiAqLworICAgICAgICAgICAgYXZpb193OChjdHgtPnBiLCAweGZmKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0dWZmaW5nX3NpemU7IGkrKykKKyAgICAgICAgICAgICAgICBhdmlvX3c4KGN0eC0+cGIsIDB4ZmYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXJ0Y29kZSA9PSBQUklWQVRFX1NUUkVBTV8xKSB7CisgICAgICAgICAgICBhdmlvX3c4KGN0eC0+cGIsIGlkKTsKKyAgICAgICAgICAgIGlmIChpZCA+PSAweGEwKSB7CisgICAgICAgICAgICAgICAgLyogTFBDTSAoWFhYOiBjaGVjayBuYl9mcmFtZXMpICovCisgICAgICAgICAgICAgICAgYXZpb193OChjdHgtPnBiLCA3KTsKKyAgICAgICAgICAgICAgICBhdmlvX3diMTYoY3R4LT5wYiwgNCk7IC8qIHNraXAgMyBoZWFkZXIgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICBhdmlvX3c4KGN0eC0+cGIsIHN0cmVhbS0+bHBjbV9oZWFkZXJbMF0pOworICAgICAgICAgICAgICAgIGF2aW9fdzgoY3R4LT5wYiwgc3RyZWFtLT5scGNtX2hlYWRlclsxXSk7CisgICAgICAgICAgICAgICAgYXZpb193OChjdHgtPnBiLCBzdHJlYW0tPmxwY21faGVhZGVyWzJdKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPj0gMHg0MCkgeworICAgICAgICAgICAgICAgIC8qIEFDLTMgKi8KKyAgICAgICAgICAgICAgICBhdmlvX3c4KGN0eC0+cGIsIG5iX2ZyYW1lcyk7CisgICAgICAgICAgICAgICAgYXZpb193YjE2KGN0eC0+cGIsIHRyYWlsZXJfc2l6ZSArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgYXNzZXJ0KHBheWxvYWRfc2l6ZSAtIHN0dWZmaW5nX3NpemUgPD0gYXZfZmlmb19zaXplKHN0cmVhbS0+ZmlmbykpOworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzdHJlYW0tPmZpZm8sIGN0eC0+cGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSAtIHN0dWZmaW5nX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICgqKSh2b2lkKiwgdm9pZCosIGludCkpYXZpb193cml0ZSk7CisgICAgICAgIHN0cmVhbS0+Ynl0ZXNfdG9faWZyYW1lIC09IHBheWxvYWRfc2l6ZSAtIHN0dWZmaW5nX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGF5bG9hZF9zaXplICA9CisgICAgICAgIHN0dWZmaW5nX3NpemUgPSAwOworICAgIH0KKworICAgIGlmIChwYWRfcGFja2V0X2J5dGVzID4gMCkKKyAgICAgICAgcHV0X3BhZGRpbmdfcGFja2V0KGN0eCwgY3R4LT5wYiwgcGFkX3BhY2tldF9ieXRlcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgemVyb190cmFpbF9ieXRlczsgaSsrKQorICAgICAgICBhdmlvX3c4KGN0eC0+cGIsIDB4MDApOworCisgICAgYXZpb19mbHVzaChjdHgtPnBiKTsKKworICAgIHMtPnBhY2tldF9udW1iZXIrKzsKKworICAgIC8qIG9ubHkgaW5jcmVhc2UgdGhlIHN0cmVhbSBwYWNrZXQgbnVtYmVyIGlmIHRoaXMgcGFjayBhY3R1YWxseSBjb250YWlucworICAgICAqIHNvbWV0aGluZyB0aGF0IGlzIHNwZWNpZmljIHRvIHRoaXMgc3RyZWFtISBJLmUuIGEgZGVkaWNhdGVkIGhlYWRlcgorICAgICAqIG9yIHNvbWUgZGF0YS4gKi8KKyAgICBpZiAoIWdlbmVyYWxfcGFjaykKKyAgICAgICAgc3RyZWFtLT5wYWNrZXRfbnVtYmVyKys7CisKKyAgICByZXR1cm4gcGF5bG9hZF9zaXplIC0gc3R1ZmZpbmdfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgcHV0X3ZjZF9wYWRkaW5nX3NlY3RvcihBVkZvcm1hdENvbnRleHQgKmN0eCkKK3sKKyAgICAvKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gZG8gdGhpcyBwYWRkaW5nOiB3cml0aW5nIGEgc2VjdG9yL3BhY2sKKyAgICAgKiBvZiAwIHZhbHVlcywgb3Igd3JpdGluZyBhbiBNUEVHIHBhZGRpbmcgcGFjay4gQm90aCBzZWVtIHRvCisgICAgICogd29yayB3aXRoIG1vc3QgZGVjb2RlcnMsIEJVVCB0aGUgVkNEIHN0YW5kYXJkIG9ubHkgYWxsb3dzIGEgMC1zZWN0b3IKKyAgICAgKiAoc2VlIHN0YW5kYXJkIHAuIElWLTQsIElWLTUpLgorICAgICAqIFNvIGEgMC1zZWN0b3IgaXQgaXMuLi4gKi8KKworICAgIE1wZWdNdXhDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cGFja2V0X3NpemU7IGkrKykKKyAgICAgICAgYXZpb193OChjdHgtPnBiLCAwKTsKKworICAgIHMtPnZjZF9wYWRkaW5nX2J5dGVzX3dyaXR0ZW4gKz0gcy0+cGFja2V0X3NpemU7CisKKyAgICBhdmlvX2ZsdXNoKGN0eC0+cGIpOworCisgICAgLyogaW5jcmVhc2luZyB0aGUgcGFja2V0IG51bWJlciBpcyBjb3JyZWN0LiBUaGUgU0NSIG9mIHRoZSBmb2xsb3dpbmcgcGFja3MKKyAgICAgKiBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHBhY2tldF9udW1iZXIgYW5kIGl0IGhhcyB0byBpbmNsdWRlIHRoZSBwYWRkaW5nCisgICAgICogc2VjdG9yIChpdCByZXByZXNlbnRzIHRoZSBzZWN0b3IgaW5kZXgsIG5vdCB0aGUgTVBFRyBwYWNrIGluZGV4KQorICAgICAqIChzZWUgVkNEIHN0YW5kYXJkIHAuIElWLTYpICovCisgICAgcy0+cGFja2V0X251bWJlcisrOworfQorCitzdGF0aWMgaW50IHJlbW92ZV9kZWNvZGVkX3BhY2tldHMoQVZGb3JtYXRDb250ZXh0ICpjdHgsIGludDY0X3Qgc2NyKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IGN0eC0+c3RyZWFtc1tpXTsKKyAgICAgICAgU3RyZWFtSW5mbyAqc3RyZWFtID0gc3QtPnByaXZfZGF0YTsKKyAgICAgICAgUGFja2V0RGVzYyAqcGt0X2Rlc2M7CisKKyAgICAgICAgd2hpbGUgKChwa3RfZGVzYyA9IHN0cmVhbS0+cHJlZGVjb2RlX3BhY2tldCkgJiYKKyAgICAgICAgICAgICAgIHNjciA+IHBrdF9kZXNjLT5kdHMpIHsgLy8gRklYTUU6ID4gdnMgPj0KKyAgICAgICAgICAgIGlmIChzdHJlYW0tPmJ1ZmZlcl9pbmRleCA8IHBrdF9kZXNjLT5zaXplIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtLT5wcmVkZWNvZGVfcGFja2V0ID09IHN0cmVhbS0+cHJlbXV4X3BhY2tldCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciB1bmRlcmZsb3cgc3Q9JWQgYnVmaT0lZCBzaXplPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBpLCBzdHJlYW0tPmJ1ZmZlcl9pbmRleCwgcGt0X2Rlc2MtPnNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtLT5idWZmZXJfaW5kZXggICAgLT0gcGt0X2Rlc2MtPnNpemU7CisgICAgICAgICAgICBzdHJlYW0tPnByZWRlY29kZV9wYWNrZXQgPSBwa3RfZGVzYy0+bmV4dDsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwa3RfZGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdXRwdXRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBpbnQgZmx1c2gpCit7CisgICAgTXBlZ011eENvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgU3RyZWFtSW5mbyAqc3RyZWFtOworICAgIGludCBpLCBhdmFpbF9zcGFjZSA9IDAsIGVzX3NpemUsIHRyYWlsZXJfc2l6ZTsKKyAgICBpbnQgYmVzdF9pID0gLTE7CisgICAgaW50IGJlc3Rfc2NvcmUgPSBJTlRfTUlOOworICAgIGludCBpZ25vcmVfY29uc3RyYWludHMgPSAwOworICAgIGludDY0X3Qgc2NyID0gcy0+bGFzdF9zY3I7CisgICAgUGFja2V0RGVzYyAqdGltZXN0YW1wX3BhY2tldDsKKyAgICBjb25zdCBpbnQ2NF90IG1heF9kZWxheSA9IGF2X3Jlc2NhbGUoY3R4LT5tYXhfZGVsYXksIDkwMDAwLCBBVl9USU1FX0JBU0UpOworCityZXRyeToKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gY3R4LT5zdHJlYW1zW2ldOworICAgICAgICBTdHJlYW1JbmZvICpzdHJlYW0gPSBzdC0+cHJpdl9kYXRhOworICAgICAgICBjb25zdCBpbnQgYXZhaWxfZGF0YSA9IGF2X2ZpZm9fc2l6ZShzdHJlYW0tPmZpZm8pOworICAgICAgICBjb25zdCBpbnQgc3BhY2UgPSBzdHJlYW0tPm1heF9idWZmZXJfc2l6ZSAtIHN0cmVhbS0+YnVmZmVyX2luZGV4OworICAgICAgICBpbnQgcmVsX3NwYWNlID0gMTAyNExMICogc3BhY2UgLyBzdHJlYW0tPm1heF9idWZmZXJfc2l6ZTsKKyAgICAgICAgUGFja2V0RGVzYyAqbmV4dF9wa3QgPSBzdHJlYW0tPnByZW11eF9wYWNrZXQ7CisKKyAgICAgICAgLyogZm9yIHN1YnRpdGxlLCBhIHNpbmdsZSBQRVMgcGFja2V0IG11c3QgYmUgZ2VuZXJhdGVkLAorICAgICAgICAgKiBzbyB3ZSBmbHVzaCBhZnRlciBldmVyeSBzaW5nbGUgc3VidGl0bGUgcGFja2V0ICovCisgICAgICAgIGlmIChzLT5wYWNrZXRfc2l6ZSA+IGF2YWlsX2RhdGEgJiYgIWZsdXNoCisgICAgICAgICAgICAmJiBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChhdmFpbF9kYXRhID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYXZfYXNzZXJ0MChhdmFpbF9kYXRhID4gMCk7CisKKyAgICAgICAgaWYgKHNwYWNlIDwgcy0+cGFja2V0X3NpemUgJiYgIWlnbm9yZV9jb25zdHJhaW50cykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChuZXh0X3BrdCAmJiBuZXh0X3BrdC0+ZHRzIC0gc2NyID4gbWF4X2RlbGF5KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICggICBzdHJlYW0tPnByZWRlY29kZV9wYWNrZXQKKyAgICAgICAgICAgICYmIHN0cmVhbS0+cHJlZGVjb2RlX3BhY2tldC0+c2l6ZSA+IHN0cmVhbS0+YnVmZmVyX2luZGV4KQorICAgICAgICAgICAgcmVsX3NwYWNlICs9IDE8PDI4OworICAgICAgICBpZiAocmVsX3NwYWNlID4gYmVzdF9zY29yZSkgeworICAgICAgICAgICAgYmVzdF9zY29yZSAgPSByZWxfc3BhY2U7CisgICAgICAgICAgICBiZXN0X2kgICAgICA9IGk7CisgICAgICAgICAgICBhdmFpbF9zcGFjZSA9IHNwYWNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJlc3RfaSA8IDApIHsKKyAgICAgICAgaW50NjRfdCBiZXN0X2R0cyA9IElOVDY0X01BWDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IGN0eC0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIFN0cmVhbUluZm8gKnN0cmVhbSA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgICAgICBQYWNrZXREZXNjICpwa3RfZGVzYyA9IHN0cmVhbS0+cHJlZGVjb2RlX3BhY2tldDsKKyAgICAgICAgICAgIGlmIChwa3RfZGVzYyAmJiBwa3RfZGVzYy0+ZHRzIDwgYmVzdF9kdHMpCisgICAgICAgICAgICAgICAgYmVzdF9kdHMgPSBwa3RfZGVzYy0+ZHRzOworICAgICAgICB9CisKKyAgICAgICAgYXZfZGxvZyhjdHgsICJidW1waW5nIHNjciwgc2NyOiVmLCBkdHM6JWZcbiIsCisgICAgICAgICAgICAgICAgc2NyIC8gOTAwMDAuMCwgYmVzdF9kdHMgLyA5MDAwMC4wKTsKKyAgICAgICAgaWYgKGJlc3RfZHRzID09IElOVDY0X01BWCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChzY3IgPj0gYmVzdF9kdHMgKyAxICYmICFpZ25vcmVfY29uc3RyYWludHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAicGFja2V0IHRvbyBsYXJnZSwgaWdub3JpbmcgYnVmZmVyIGxpbWl0cyB0byBtdXggaXRcbiIpOworICAgICAgICAgICAgaWdub3JlX2NvbnN0cmFpbnRzID0gMTsKKyAgICAgICAgfQorICAgICAgICBzY3IgPSBGRk1BWChiZXN0X2R0cyArIDEsIHNjcik7CisgICAgICAgIGlmIChyZW1vdmVfZGVjb2RlZF9wYWNrZXRzKGN0eCwgc2NyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorCisgICAgYXNzZXJ0KGJlc3RfaSA+PSAwKTsKKworICAgIHN0ICAgICA9IGN0eC0+c3RyZWFtc1tiZXN0X2ldOworICAgIHN0cmVhbSA9IHN0LT5wcml2X2RhdGE7CisKKyAgICBhc3NlcnQoYXZfZmlmb19zaXplKHN0cmVhbS0+ZmlmbykgPiAwKTsKKworICAgIGFzc2VydChhdmFpbF9zcGFjZSA+PSBzLT5wYWNrZXRfc2l6ZSB8fCBpZ25vcmVfY29uc3RyYWludHMpOworCisgICAgdGltZXN0YW1wX3BhY2tldCA9IHN0cmVhbS0+cHJlbXV4X3BhY2tldDsKKyAgICBpZiAodGltZXN0YW1wX3BhY2tldC0+dW53cml0dGVuX3NpemUgPT0gdGltZXN0YW1wX3BhY2tldC0+c2l6ZSkgeworICAgICAgICB0cmFpbGVyX3NpemUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyYWlsZXJfc2l6ZSAgICAgPSB0aW1lc3RhbXBfcGFja2V0LT51bndyaXR0ZW5fc2l6ZTsKKyAgICAgICAgdGltZXN0YW1wX3BhY2tldCA9IHRpbWVzdGFtcF9wYWNrZXQtPm5leHQ7CisgICAgfQorCisgICAgaWYgKHRpbWVzdGFtcF9wYWNrZXQpIHsKKyAgICAgICAgYXZfZGxvZyhjdHgsICJkdHM6JWYgcHRzOiVmIHNjcjolZiBzdHJlYW06JWRcbiIsCisgICAgICAgICAgICAgICAgdGltZXN0YW1wX3BhY2tldC0+ZHRzIC8gOTAwMDAuMCwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBfcGFja2V0LT5wdHMgLyA5MDAwMC4wLAorICAgICAgICAgICAgICAgIHNjciAvIDkwMDAwLjAsIGJlc3RfaSk7CisgICAgICAgIGVzX3NpemUgPSBmbHVzaF9wYWNrZXQoY3R4LCBiZXN0X2ksIHRpbWVzdGFtcF9wYWNrZXQtPnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBfcGFja2V0LT5kdHMsIHNjciwgdHJhaWxlcl9zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoYXZfZmlmb19zaXplKHN0cmVhbS0+ZmlmbykgPT0gdHJhaWxlcl9zaXplKTsKKyAgICAgICAgZXNfc2l6ZSA9IGZsdXNoX3BhY2tldChjdHgsIGJlc3RfaSwgQVZfTk9QVFNfVkFMVUUsIEFWX05PUFRTX1ZBTFVFLCBzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxlcl9zaXplKTsKKyAgICB9CisKKyAgICBpZiAocy0+aXNfdmNkKSB7CisgICAgICAgIC8qIFdyaXRlIG9uZSBvciBtb3JlIHBhZGRpbmcgc2VjdG9ycywgaWYgbmVjZXNzYXJ5LCB0byByZWFjaAorICAgICAgICAgKiB0aGUgY29uc3RhbnQgb3ZlcmFsbCBiaXRyYXRlLiAqLworICAgICAgICBpbnQgdmNkX3BhZF9ieXRlczsKKworICAgICAgICAvLyBGSVhNRTogcHRzIGNhbm5vdCBiZSBjb3JyZWN0IGhlcmUKKyAgICAgICAgd2hpbGUgKCh2Y2RfcGFkX2J5dGVzID0gZ2V0X3ZjZF9wYWRkaW5nX3NpemUoY3R4LCBzdHJlYW0tPnByZW11eF9wYWNrZXQtPnB0cykpID49IHMtPnBhY2tldF9zaXplKSB7CisgICAgICAgICAgICBwdXRfdmNkX3BhZGRpbmdfc2VjdG9yKGN0eCk7CisgICAgICAgICAgICAvLyBGSVhNRTogcm91bmRpbmcgYW5kIGZpcnN0IGZldyBieXRlcyBvZiBlYWNoIHBhY2tldAorICAgICAgICAgICAgcy0+bGFzdF9zY3IgKz0gcy0+cGFja2V0X3NpemUgKiA5MDAwMExMIC8gKHMtPm11eF9yYXRlICogNTBMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdHJlYW0tPmJ1ZmZlcl9pbmRleCArPSBlc19zaXplOworICAgIC8vIEZJWE1FOiByb3VuZGluZyBhbmQgZmlyc3QgZmV3IGJ5dGVzIG9mIGVhY2ggcGFja2V0CisgICAgcy0+bGFzdF9zY3IgICAgICAgICAgKz0gcy0+cGFja2V0X3NpemUgKiA5MDAwMExMIC8gKHMtPm11eF9yYXRlICogNTBMTCk7CisKKyAgICB3aGlsZSAoc3RyZWFtLT5wcmVtdXhfcGFja2V0ICYmCisgICAgICAgICAgIHN0cmVhbS0+cHJlbXV4X3BhY2tldC0+dW53cml0dGVuX3NpemUgPD0gZXNfc2l6ZSkgeworICAgICAgICBlc19zaXplICAgICAgICAgICAgICAtPSBzdHJlYW0tPnByZW11eF9wYWNrZXQtPnVud3JpdHRlbl9zaXplOworICAgICAgICBzdHJlYW0tPnByZW11eF9wYWNrZXQgPSBzdHJlYW0tPnByZW11eF9wYWNrZXQtPm5leHQ7CisgICAgfQorICAgIGlmIChlc19zaXplKSB7CisgICAgICAgIGF2X2Fzc2VydDAoc3RyZWFtLT5wcmVtdXhfcGFja2V0KTsKKyAgICAgICAgc3RyZWFtLT5wcmVtdXhfcGFja2V0LT51bndyaXR0ZW5fc2l6ZSAtPSBlc19zaXplOworICAgIH0KKworICAgIGlmIChyZW1vdmVfZGVjb2RlZF9wYWNrZXRzKGN0eCwgcy0+bGFzdF9zY3IpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXBlZ19tdXhfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIGludCBzdHJlYW1faW5kZXggPSBwa3QtPnN0cmVhbV9pbmRleDsKKyAgICBpbnQgc2l6ZSAgICAgICAgID0gcGt0LT5zaXplOworICAgIHVpbnQ4X3QgKmJ1ZiAgICAgPSBwa3QtPmRhdGE7CisgICAgTXBlZ011eENvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgICAgICA9IGN0eC0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgIFN0cmVhbUluZm8gKnN0cmVhbSA9IHN0LT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBwdHMsIGR0czsKKyAgICBQYWNrZXREZXNjICpwa3RfZGVzYzsKKyAgICBpbnQgcHJlbG9hZDsKKyAgICBjb25zdCBpbnQgaXNfaWZyYW1lID0gc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSk7CisKKyAgICBwcmVsb2FkID0gYXZfcmVzY2FsZShzLT5wcmVsb2FkLCA5MDAwMCwgQVZfVElNRV9CQVNFKTsKKworICAgIHB0cyA9IHBrdC0+cHRzOworICAgIGR0cyA9IHBrdC0+ZHRzOworCisgICAgaWYgKHMtPmxhc3Rfc2NyID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGlmIChkdHMgPT0gQVZfTk9QVFNfVkFMVUUgfHwgKGR0cyA8IHByZWxvYWQgJiYgY3R4LT5hdm9pZF9uZWdhdGl2ZV90cykgfHwgcy0+aXNfZHZkKSB7CisgICAgICAgICAgICBpZiAoZHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgIHMtPnByZWxvYWQgKz0gYXZfcmVzY2FsZSgtZHRzLCBBVl9USU1FX0JBU0UsIDkwMDAwKTsKKyAgICAgICAgICAgIHMtPmxhc3Rfc2NyID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPmxhc3Rfc2NyID0gZHRzIC0gcHJlbG9hZDsKKyAgICAgICAgICAgIHMtPnByZWxvYWQgPSAwOworICAgICAgICB9CisgICAgICAgIHByZWxvYWQgPSBhdl9yZXNjYWxlKHMtPnByZWxvYWQsIDkwMDAwLCBBVl9USU1FX0JBU0UpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJGaXJzdCBTQ1I6ICUiUFJJZDY0IiBGaXJzdCBEVFM6ICUiUFJJZDY0IlxuIiwgcy0+bGFzdF9zY3IsIGR0cyArIHByZWxvYWQpOworICAgIH0KKworICAgIGlmIChkdHMgIT0gQVZfTk9QVFNfVkFMVUUpIGR0cyArPSBwcmVsb2FkOworICAgIGlmIChwdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHB0cyArPSBwcmVsb2FkOworCisgICAgYXZfZGxvZyhjdHgsICJkdHM6JWYgcHRzOiVmIGZsYWdzOiVkIHN0cmVhbTolZCBub3B0czolZFxuIiwKKyAgICAgICAgICAgIGR0cyAvIDkwMDAwLjAsIHB0cyAvIDkwMDAwLjAsIHBrdC0+ZmxhZ3MsCisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCwgcHRzICE9IEFWX05PUFRTX1ZBTFVFKTsKKyAgICBpZiAoIXN0cmVhbS0+cHJlbXV4X3BhY2tldCkKKyAgICAgICAgc3RyZWFtLT5uZXh0X3BhY2tldCA9ICZzdHJlYW0tPnByZW11eF9wYWNrZXQ7CisgICAgKnN0cmVhbS0+bmV4dF9wYWNrZXQgICAgID0KKyAgICBwa3RfZGVzYyAgICAgICAgICAgICAgICAgPSBhdl9tYWxsb2N6KHNpemVvZihQYWNrZXREZXNjKSk7CisgICAgcGt0X2Rlc2MtPnB0cyAgICAgICAgICAgID0gcHRzOworICAgIHBrdF9kZXNjLT5kdHMgICAgICAgICAgICA9IGR0czsKKyAgICBwa3RfZGVzYy0+dW53cml0dGVuX3NpemUgPQorICAgIHBrdF9kZXNjLT5zaXplICAgICAgICAgICA9IHNpemU7CisgICAgaWYgKCFzdHJlYW0tPnByZWRlY29kZV9wYWNrZXQpCisgICAgICAgIHN0cmVhbS0+cHJlZGVjb2RlX3BhY2tldCA9IHBrdF9kZXNjOworICAgIHN0cmVhbS0+bmV4dF9wYWNrZXQgPSAmcGt0X2Rlc2MtPm5leHQ7CisKKyAgICBpZiAoYXZfZmlmb19yZWFsbG9jMihzdHJlYW0tPmZpZm8sIGF2X2ZpZm9fc2l6ZShzdHJlYW0tPmZpZm8pICsgc2l6ZSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAocy0+aXNfZHZkKSB7CisgICAgICAgIC8vIG1pbiBWT0JVIGxlbmd0aCAwLjQgc2Vjb25kcyAobXB1Y29kZXIpCisgICAgICAgIGlmIChpc19pZnJhbWUgJiYKKyAgICAgICAgICAgIChzLT5wYWNrZXRfbnVtYmVyID09IDAgfHwKKyAgICAgICAgICAgICAocHRzIC0gc3RyZWFtLT52b2J1X3N0YXJ0X3B0cyA+PSAzNjAwMCkpKSB7CisgICAgICAgICAgICBzdHJlYW0tPmJ5dGVzX3RvX2lmcmFtZSA9IGF2X2ZpZm9fc2l6ZShzdHJlYW0tPmZpZm8pOworICAgICAgICAgICAgc3RyZWFtLT5hbGlnbl9pZnJhbWUgICAgPSAxOworICAgICAgICAgICAgc3RyZWFtLT52b2J1X3N0YXJ0X3B0cyAgPSBwdHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoc3RyZWFtLT5maWZvLCBidWYsIHNpemUsIE5VTEwpOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgcmV0ID0gb3V0cHV0X3BhY2tldChjdHgsIDApOworICAgICAgICBpZiAocmV0IDw9IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworc3RhdGljIGludCBtcGVnX211eF9lbmQoQVZGb3JtYXRDb250ZXh0ICpjdHgpCit7CisgICAgU3RyZWFtSW5mbyAqc3RyZWFtOworICAgIGludCBpOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgcmV0ID0gb3V0cHV0X3BhY2tldChjdHgsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGVsc2UgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogRW5kIGhlYWRlciBhY2NvcmRpbmcgdG8gTVBFRzEgc3lzdGVtcyBzdGFuZGFyZC4gV2UgZG8gbm90IHdyaXRlCisgICAgICogaXQgYXMgaXQgaXMgdXN1YWxseSBub3QgbmVlZGVkIGJ5IGRlY29kZXJzIGFuZCBiZWNhdXNlIGl0CisgICAgICogY29tcGxpY2F0ZXMgTVBFRyBzdHJlYW0gY29uY2F0ZW5hdGlvbi4gKi8KKyAgICAvLyBhdmlvX3diMzIoY3R4LT5wYiwgSVNPXzExMTcyX0VORF9DT0RFKTsKKyAgICAvLyBhdmlvX2ZsdXNoKGN0eC0+cGIpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHN0cmVhbSA9IGN0eC0+c3RyZWFtc1tpXS0+cHJpdl9kYXRhOworCisgICAgICAgIGFzc2VydChhdl9maWZvX3NpemUoc3RyZWFtLT5maWZvKSA9PSAwKTsKKyAgICAgICAgYXZfZmlmb19mcmVlcCgmc3RyZWFtLT5maWZvKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE1wZWdNdXhDb250ZXh0LCB4KQorI2RlZmluZSBFIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgIm11eHJhdGUiLCBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVCh1c2VyX211eF9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsICgoMTw8MjIpIC0gMSkgKiAoOCAqIDUwKSwgRSB9LAorICAgIHsgInByZWxvYWQiLCAiSW5pdGlhbCBkZW11eC1kZWNvZGUgZGVsYXkgaW4gbWljcm9zZWNvbmRzLiIsIE9GRlNFVChwcmVsb2FkKSwgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gNTAwMDAwIH0sIDAsIElOVF9NQVgsIEUgfSwKKyAgICB7IE5VTEwgfSwKK307CisKKyNkZWZpbmUgTVBFR0VOQ19DTEFTUyhmbGF2b3IpICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGZsYXZvciAjIyBfY2xhc3MgPSB7ICAgICAgIFwKKyAgICAuY2xhc3NfbmFtZSA9ICNmbGF2b3IgIiBtdXhlciIsICAgICAgICAgICAgIFwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLCAgICAgICAgIFwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwgICAgICAgIFwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsICAgICAgICAgICAgICAgICAgICAgIFwKK307CisKKyNpZiBDT05GSUdfTVBFRzFTWVNURU1fTVVYRVIKK01QRUdFTkNfQ0xBU1MobXBlZykKK0FWT3V0cHV0Rm9ybWF0IGZmX21wZWcxc3lzdGVtX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJtcGVnIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy0xIFN5c3RlbXMgLyBNUEVHIHByb2dyYW0gc3RyZWFtIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gInZpZGVvL21wZWciLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJtcGcsbXBlZyIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKE1wZWdNdXhDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUDIsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzFWSURFTywKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBtcGVnX211eF9pbml0LAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IG1wZWdfbXV4X3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBtcGVnX211eF9lbmQsCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJm1wZWdfY2xhc3MsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfTVBFRzFWQ0RfTVVYRVIKK01QRUdFTkNfQ0xBU1ModmNkKQorQVZPdXRwdXRGb3JtYXQgZmZfbXBlZzF2Y2RfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gInZjZCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctMSBTeXN0ZW1zIC8gTVBFRyBwcm9ncmFtIHN0cmVhbSAoVkNEKSIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJ2aWRlby9tcGVnIiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTXBlZ011eENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01QMiwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1wZWdfbXV4X2luaXQsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbXBlZ19tdXhfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IG1wZWdfbXV4X2VuZCwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmdmNkX2NsYXNzLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX01QRUcyVk9CX01VWEVSCitNUEVHRU5DX0NMQVNTKHZvYikKK0FWT3V0cHV0Rm9ybWF0IGZmX21wZWcydm9iX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJ2b2IiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTIgUFMgKFZPQikiKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAidmlkZW8vbXBlZyIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gInZvYiIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKE1wZWdNdXhDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUDIsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFTywKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBtcGVnX211eF9pbml0LAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IG1wZWdfbXV4X3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBtcGVnX211eF9lbmQsCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJnZvYl9jbGFzcywKK307CisjZW5kaWYKKworLyogU2FtZSBhcyBtcGVnMnZvYl9tdXggZXhjZXB0IHRoYXQgdGhlIHBhY2sgc2l6ZSBpcyAyMzI0ICovCisjaWYgQ09ORklHX01QRUcyU1ZDRF9NVVhFUgorTVBFR0VOQ19DTEFTUyhzdmNkKQorQVZPdXRwdXRGb3JtYXQgZmZfbXBlZzJzdmNkX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJzdmNkIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy0yIFBTIChTVkNEKSIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJ2aWRlby9tcGVnIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAidm9iIiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTXBlZ011eENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01QMiwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1wZWdfbXV4X2luaXQsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbXBlZ19tdXhfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IG1wZWdfbXV4X2VuZCwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmc3ZjZF9jbGFzcywKK307CisjZW5kaWYKKworLyogIFNhbWUgYXMgbXBlZzJ2b2JfbXV4IGV4Y2VwdCB0aGUgJ2lzX2R2ZCcgZmxhZyBpcyBzZXQgdG8gcHJvZHVjZSBOQVYgcGt0cyAqLworI2lmIENPTkZJR19NUEVHMkRWRF9NVVhFUgorTVBFR0VOQ19DTEFTUyhkdmQpCitBVk91dHB1dEZvcm1hdCBmZl9tcGVnMmR2ZF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAiZHZkIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy0yIFBTIChEVkQgVk9CKSIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJ2aWRlby9tcGVnIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAiZHZkIiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTXBlZ011eENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01QMiwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1wZWdfbXV4X2luaXQsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbXBlZ19tdXhfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IG1wZWdfbXV4X2VuZCwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmZHZkX2NsYXNzLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L21wZWd0cy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21wZWd0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGEwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbXBlZ3RzLmMKQEAgLTAsMCArMSwyNzg0IEBACisvKgorICogTVBFRzIgdHJhbnNwb3J0IHN0cmVhbSAoYWthIERWQikgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvb3B1cy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAibXBlZ3RzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAic2Vlay5oIgorI2luY2x1ZGUgIm1wZWcuaCIKKyNpbmNsdWRlICJpc29tLmgiCisKKy8qIG1heGltdW0gc2l6ZSBpbiB3aGljaCB3ZSBsb29rIGZvciBzeW5jaHJvbmlzYXRpb24gaWYKKyAqIHN5bmNocm9uaXNhdGlvbiBpcyBsb3N0ICovCisjZGVmaW5lIE1BWF9SRVNZTkNfU0laRSA2NTUzNgorCisjZGVmaW5lIE1BWF9QRVNfUEFZTE9BRCAyMDAgKiAxMDI0CisKKyNkZWZpbmUgTUFYX01QNF9ERVNDUl9DT1VOVCAxNgorCisjZGVmaW5lIE1PRF9VTkxJS0VMWShtb2R1bHVzLCBkaXZpZGVuZCwgZGl2aXNvciwgcHJldl9kaXZpZGVuZCkgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChwcmV2X2RpdmlkZW5kKSA9PSAwIHx8IChkaXZpZGVuZCkgLSAocHJldl9kaXZpZGVuZCkgIT0gKGRpdmlzb3IpKSBcCisgICAgICAgICAgICAobW9kdWx1cykgPSAoZGl2aWRlbmQpICUgKGRpdmlzb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAocHJldl9kaXZpZGVuZCkgPSAoZGl2aWRlbmQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitlbnVtIE1wZWdUU0ZpbHRlclR5cGUgeworICAgIE1QRUdUU19QRVMsCisgICAgTVBFR1RTX1NFQ1RJT04sCisgICAgTVBFR1RTX1BDUiwKK307CisKK3R5cGVkZWYgc3RydWN0IE1wZWdUU0ZpbHRlciBNcGVnVFNGaWx0ZXI7CisKK3R5cGVkZWYgaW50IFBFU0NhbGxiYWNrIChNcGVnVFNGaWx0ZXIgKmYsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfc3RhcnQsIGludDY0X3QgcG9zKTsKKwordHlwZWRlZiBzdHJ1Y3QgTXBlZ1RTUEVTRmlsdGVyIHsKKyAgICBQRVNDYWxsYmFjayAqcGVzX2NiOworICAgIHZvaWQgKm9wYXF1ZTsKK30gTXBlZ1RTUEVTRmlsdGVyOworCit0eXBlZGVmIHZvaWQgU2VjdGlvbkNhbGxiYWNrIChNcGVnVFNGaWx0ZXIgKmYsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbik7CisKK3R5cGVkZWYgdm9pZCBTZXRTZXJ2aWNlQ2FsbGJhY2sgKHZvaWQgKm9wYXF1ZSwgaW50IHJldCk7CisKK3R5cGVkZWYgc3RydWN0IE1wZWdUU1NlY3Rpb25GaWx0ZXIgeworICAgIGludCBzZWN0aW9uX2luZGV4OworICAgIGludCBzZWN0aW9uX2hfc2l6ZTsKKyAgICB1aW50OF90ICpzZWN0aW9uX2J1ZjsKKyAgICB1bnNpZ25lZCBpbnQgY2hlY2tfY3JjIDogMTsKKyAgICB1bnNpZ25lZCBpbnQgZW5kX29mX3NlY3Rpb25fcmVhY2hlZCA6IDE7CisgICAgU2VjdGlvbkNhbGxiYWNrICpzZWN0aW9uX2NiOworICAgIHZvaWQgKm9wYXF1ZTsKK30gTXBlZ1RTU2VjdGlvbkZpbHRlcjsKKworc3RydWN0IE1wZWdUU0ZpbHRlciB7CisgICAgaW50IHBpZDsKKyAgICBpbnQgZXNfaWQ7CisgICAgaW50IGxhc3RfY2M7IC8qIGxhc3QgY2MgY29kZSAoLTEgaWYgZmlyc3QgcGFja2V0KSAqLworICAgIGludDY0X3QgbGFzdF9wY3I7CisgICAgZW51bSBNcGVnVFNGaWx0ZXJUeXBlIHR5cGU7CisgICAgdW5pb24geworICAgICAgICBNcGVnVFNQRVNGaWx0ZXIgcGVzX2ZpbHRlcjsKKyAgICAgICAgTXBlZ1RTU2VjdGlvbkZpbHRlciBzZWN0aW9uX2ZpbHRlcjsKKyAgICB9IHU7Cit9OworCisjZGVmaW5lIE1BWF9QSURTX1BFUl9QUk9HUkFNIDY0CitzdHJ1Y3QgUHJvZ3JhbSB7CisgICAgdW5zaWduZWQgaW50IGlkOyAvLyBwcm9ncmFtIGlkL3NlcnZpY2UgaWQKKyAgICB1bnNpZ25lZCBpbnQgbmJfcGlkczsKKyAgICB1bnNpZ25lZCBpbnQgcGlkc1tNQVhfUElEU19QRVJfUFJPR1JBTV07CisKKyAgICAvKiogaGF2ZSB3ZSBmb3VuZCBwbXQgZm9yIHRoaXMgcHJvZ3JhbSAqLworICAgIGludCBwbXRfZm91bmQ7Cit9OworCitzdHJ1Y3QgTXBlZ1RTQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgLyogdXNlciBkYXRhICovCisgICAgQVZGb3JtYXRDb250ZXh0ICpzdHJlYW07CisgICAgLyoqIHJhdyBwYWNrZXQgc2l6ZSwgaW5jbHVkaW5nIEZFQyBpZiBwcmVzZW50ICovCisgICAgaW50IHJhd19wYWNrZXRfc2l6ZTsKKworICAgIGludCBzaXplX3N0YXRbM107CisgICAgaW50IHNpemVfc3RhdF9jb3VudDsKKyNkZWZpbmUgU0laRV9TVEFUX1RIUkVTSE9MRCAxMAorCisgICAgaW50NjRfdCBwb3M0N19mdWxsOworCisgICAgLyoqIGlmIHRydWUsIGFsbCBwaWRzIGFyZSBhbmFseXplZCB0byBmaW5kIHN0cmVhbXMgKi8KKyAgICBpbnQgYXV0b19ndWVzczsKKworICAgIC8qKiBjb21wdXRlIGV4YWN0IFBDUiBmb3IgZWFjaCB0cmFuc3BvcnQgc3RyZWFtIHBhY2tldCAqLworICAgIGludCBtcGVnMnRzX2NvbXB1dGVfcGNyOworCisgICAgLyoqIGZpeCBkdmIgdGVsZXRleHQgcHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgZml4X3RlbGV0ZXh0X3B0czsKKworICAgIGludDY0X3QgY3VyX3BjcjsgICAgLyoqPCB1c2VkIHRvIGVzdGltYXRlIHRoZSBleGFjdCBQQ1IgKi8KKyAgICBpbnQgcGNyX2luY3I7ICAgICAgIC8qKjwgdXNlZCB0byBlc3RpbWF0ZSB0aGUgZXhhY3QgUENSICovCisKKyAgICAvKiBkYXRhIG5lZWRlZCB0byBoYW5kbGUgZmlsZSBiYXNlZCB0cyAqLworICAgIC8qKiBzdG9wIHBhcnNpbmcgbG9vcCAqLworICAgIGludCBzdG9wX3BhcnNlOworICAgIC8qKiBwYWNrZXQgY29udGFpbmluZyBBdWRpby9WaWRlbyBkYXRhICovCisgICAgQVZQYWNrZXQgKnBrdDsKKyAgICAvKiogdG8gZGV0ZWN0IHNlZWsgKi8KKyAgICBpbnQ2NF90IGxhc3RfcG9zOworCisgICAgaW50IHNraXBfY2hhbmdlczsKKyAgICBpbnQgc2tpcF9jbGVhcjsKKworICAgIGludCBzY2FuX2FsbF9wbXRzOworCisgICAgaW50IHJlc3luY19zaXplOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBwcml2YXRlIG1wZWd0cyBkYXRhICovCisgICAgLyogc2NhbiBjb250ZXh0ICovCisgICAgLyoqIHN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIFByb2dyYW0tPnBpZHMgbWFwcGluZyAqLworICAgIHVuc2lnbmVkIGludCBuYl9wcmc7CisgICAgc3RydWN0IFByb2dyYW0gKnByZzsKKworICAgIGludDhfdCBjcmNfdmFsaWRpdHlbTkJfUElEX01BWF07CisgICAgLyoqIGZpbHRlcnMgZm9yIHZhcmlvdXMgc3RyZWFtcyBzcGVjaWZpZWQgYnkgUE1UICsgZm9yIHRoZSBQQVQgYW5kIFBNVCAqLworICAgIE1wZWdUU0ZpbHRlciAqcGlkc1tOQl9QSURfTUFYXTsKKyAgICBpbnQgY3VycmVudF9waWQ7Cit9OworCisjZGVmaW5lIE1QRUdUU19PUFRJT05TIFwKKyAgICB7ICJyZXN5bmNfc2l6ZSIsICAgIlNpemUgbGltaXQgZm9yIGxvb2tpbmcgdXAgYSBuZXcgc3luY2hyb25pemF0aW9uLiIsIG9mZnNldG9mKE1wZWdUU0NvbnRleHQsIHJlc3luY19zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCAgeyAuaTY0ID0gIE1BWF9SRVNZTkNfU0laRX0sIDAsIElOVF9NQVgsICBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgTVBFR1RTX09QVElPTlMsCisgICAgeyJmaXhfdGVsZXRleHRfcHRzIiwgIlRyeSB0byBmaXggcHRzIHZhbHVlcyBvZiBkdmIgdGVsZXRleHQgc3RyZWFtcy4iLCBvZmZzZXRvZihNcGVnVFNDb250ZXh0LCBmaXhfdGVsZXRleHRfcHRzKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICB7Lmk2NCA9IDF9LCAwLCAxLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsidHNfcGFja2V0c2l6ZSIsICJPdXRwdXQgb3B0aW9uIGNhcnJ5aW5nIHRoZSByYXcgcGFja2V0IHNpemUuIiwgb2Zmc2V0b2YoTXBlZ1RTQ29udGV4dCwgcmF3X3BhY2tldF9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICB7Lmk2NCA9IDB9LCAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB8IEFWX09QVF9GTEFHX0VYUE9SVCB8IEFWX09QVF9GTEFHX1JFQURPTkxZIH0sCisgICAgeyJzY2FuX2FsbF9wbXRzIiwgICAiU2NhbiBhbmQgY29tYmluZSBhbGwgUE1UcyIsIG9mZnNldG9mKE1wZWdUU0NvbnRleHQsIHNjYW5fYWxsX3BtdHMpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgIHsgLmk2NCA9ICAtMX0sIC0xLCAxLCAgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7InNraXBfY2hhbmdlcyIsICJTa2lwIGNoYW5naW5nIC8gYWRkaW5nIHN0cmVhbXMgLyBwcm9ncmFtcy4iLCBvZmZzZXRvZihNcGVnVFNDb250ZXh0LCBza2lwX2NoYW5nZXMpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgIHsuaTY0ID0gMH0sIDAsIDEsIDAgfSwKKyAgICB7InNraXBfY2xlYXIiLCAiU2tpcCBjbGVhcmluZyBwcm9ncmFtcy4iLCBvZmZzZXRvZihNcGVnVFNDb250ZXh0LCBza2lwX2NsZWFyKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICB7Lmk2NCA9IDB9LCAwLCAxLCAwIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBtcGVndHNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibXBlZ3RzIGRlbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHJhd19vcHRpb25zW10gPSB7CisgICAgTVBFR1RTX09QVElPTlMsCisgICAgeyAiY29tcHV0ZV9wY3IiLCAgICJDb21wdXRlIGV4YWN0IFBDUiBmb3IgZWFjaCB0cmFuc3BvcnQgc3RyZWFtIHBhY2tldC4iLAorICAgICAgICAgIG9mZnNldG9mKE1wZWdUU0NvbnRleHQsIG1wZWcydHNfY29tcHV0ZV9wY3IpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgICAgeyAuaTY0ID0gMCB9LCAwLCAxLCAgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJ0c19wYWNrZXRzaXplIiwgIk91dHB1dCBvcHRpb24gY2FycnlpbmcgdGhlIHJhdyBwYWNrZXQgc2l6ZS4iLAorICAgICAgb2Zmc2V0b2YoTXBlZ1RTQ29udGV4dCwgcmF3X3BhY2tldF9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgeyAuaTY0ID0gMCB9LCAwLCAwLAorICAgICAgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19FWFBPUlQgfCBBVl9PUFRfRkxBR19SRUFET05MWSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgbXBlZ3RzcmF3X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIm1wZWd0c3JhdyBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gcmF3X29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCisvKiBUUyBzdHJlYW0gaGFuZGxpbmcgKi8KKworZW51bSBNcGVnVFNTdGF0ZSB7CisgICAgTVBFR1RTX0hFQURFUiA9IDAsCisgICAgTVBFR1RTX1BFU0hFQURFUiwKKyAgICBNUEVHVFNfUEVTSEVBREVSX0ZJTEwsCisgICAgTVBFR1RTX1BBWUxPQUQsCisgICAgTVBFR1RTX1NLSVAsCit9OworCisvKiBlbm91Z2ggZm9yIFBFUyBoZWFkZXIgKyBsZW5ndGggKi8KKyNkZWZpbmUgUEVTX1NUQVJUX1NJWkUgIDYKKyNkZWZpbmUgUEVTX0hFQURFUl9TSVpFIDkKKyNkZWZpbmUgTUFYX1BFU19IRUFERVJfU0laRSAoOSArIDI1NSkKKwordHlwZWRlZiBzdHJ1Y3QgUEVTQ29udGV4dCB7CisgICAgaW50IHBpZDsKKyAgICBpbnQgcGNyX3BpZDsgLyoqPCBpZiAtMSB0aGVuIGFsbCBwYWNrZXRzIGNvbnRhaW5pbmcgUENSIGFyZSBjb25zaWRlcmVkICovCisgICAgaW50IHN0cmVhbV90eXBlOworICAgIE1wZWdUU0NvbnRleHQgKnRzOworICAgIEFWRm9ybWF0Q29udGV4dCAqc3RyZWFtOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBBVlN0cmVhbSAqc3ViX3N0OyAvKio8IHN0cmVhbSBmb3IgdGhlIGVtYmVkZGVkIEFDMyBzdHJlYW0gaW4gSERNViBUcnVlSEQgKi8KKyAgICBlbnVtIE1wZWdUU1N0YXRlIHN0YXRlOworICAgIC8qIHVzZWQgdG8gZ2V0IHRoZSBmb3JtYXQgKi8KKyAgICBpbnQgZGF0YV9pbmRleDsKKyAgICBpbnQgZmxhZ3M7IC8qKjwgY29waWVkIHRvIHRoZSBBVlBhY2tldCBmbGFncyAqLworICAgIGludCB0b3RhbF9zaXplOworICAgIGludCBwZXNfaGVhZGVyX3NpemU7CisgICAgaW50IGV4dGVuZGVkX3N0cmVhbV9pZDsKKyAgICBpbnQ2NF90IHB0cywgZHRzOworICAgIGludDY0X3QgdHNfcGFja2V0X3BvczsgLyoqPCBwb3NpdGlvbiBvZiBmaXJzdCBUUyBwYWNrZXQgb2YgdGhpcyBQRVMgcGFja2V0ICovCisgICAgdWludDhfdCBoZWFkZXJbTUFYX1BFU19IRUFERVJfU0laRV07CisgICAgQVZCdWZmZXJSZWYgKmJ1ZmZlcjsKKyAgICBTTENvbmZpZ0Rlc2NyIHNsOworfSBQRVNDb250ZXh0OworCitleHRlcm4gQVZJbnB1dEZvcm1hdCBmZl9tcGVndHNfZGVtdXhlcjsKKworc3RhdGljIHN0cnVjdCBQcm9ncmFtICogZ2V0X3Byb2dyYW0oTXBlZ1RTQ29udGV4dCAqdHMsIHVuc2lnbmVkIGludCBwcm9ncmFtaWQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHRzLT5uYl9wcmc7IGkrKykgeworICAgICAgICBpZiAodHMtPnByZ1tpXS5pZCA9PSBwcm9ncmFtaWQpIHsKKyAgICAgICAgICAgIHJldHVybiAmdHMtPnByZ1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfYXZwcm9ncmFtKE1wZWdUU0NvbnRleHQgKnRzLCB1bnNpZ25lZCBpbnQgcHJvZ3JhbWlkKQoreworICAgIEFWUHJvZ3JhbSAqcHJnID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0cy0+c3RyZWFtLT5uYl9wcm9ncmFtczsgaSsrKQorICAgICAgICBpZiAodHMtPnN0cmVhbS0+cHJvZ3JhbXNbaV0tPmlkID09IHByb2dyYW1pZCkgeworICAgICAgICAgICAgcHJnID0gdHMtPnN0cmVhbS0+cHJvZ3JhbXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGlmICghcHJnKQorICAgICAgICByZXR1cm47CisgICAgcHJnLT5uYl9zdHJlYW1faW5kZXhlcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX3Byb2dyYW0oTXBlZ1RTQ29udGV4dCAqdHMsIHVuc2lnbmVkIGludCBwcm9ncmFtaWQpCit7CisgICAgaW50IGk7CisKKyAgICBjbGVhcl9hdnByb2dyYW0odHMsIHByb2dyYW1pZCk7CisgICAgZm9yIChpID0gMDsgaSA8IHRzLT5uYl9wcmc7IGkrKykKKyAgICAgICAgaWYgKHRzLT5wcmdbaV0uaWQgPT0gcHJvZ3JhbWlkKSB7CisgICAgICAgICAgICB0cy0+cHJnW2ldLm5iX3BpZHMgPSAwOworICAgICAgICAgICAgdHMtPnByZ1tpXS5wbXRfZm91bmQgPSAwOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX3Byb2dyYW1zKE1wZWdUU0NvbnRleHQgKnRzKQoreworICAgIGF2X2ZyZWVwKCZ0cy0+cHJnKTsKKyAgICB0cy0+bmJfcHJnID0gMDsKK30KKworc3RhdGljIHZvaWQgYWRkX3BhdF9lbnRyeShNcGVnVFNDb250ZXh0ICp0cywgdW5zaWduZWQgaW50IHByb2dyYW1pZCkKK3sKKyAgICBzdHJ1Y3QgUHJvZ3JhbSAqcDsKKyAgICBpZiAoYXZfcmVhbGxvY3BfYXJyYXkoJnRzLT5wcmcsIHRzLT5uYl9wcmcgKyAxLCBzaXplb2YoKnRzLT5wcmcpKSA8IDApIHsKKyAgICAgICAgdHMtPm5iX3ByZyA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcCA9ICZ0cy0+cHJnW3RzLT5uYl9wcmddOworICAgIHAtPmlkID0gcHJvZ3JhbWlkOworICAgIHAtPm5iX3BpZHMgPSAwOworICAgIHAtPnBtdF9mb3VuZCA9IDA7CisgICAgdHMtPm5iX3ByZysrOworfQorCitzdGF0aWMgdm9pZCBhZGRfcGlkX3RvX3BtdChNcGVnVFNDb250ZXh0ICp0cywgdW5zaWduZWQgaW50IHByb2dyYW1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaWQpCit7CisgICAgc3RydWN0IFByb2dyYW0gKnAgPSBnZXRfcHJvZ3JhbSh0cywgcHJvZ3JhbWlkKTsKKyAgICBpbnQgaTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwLT5uYl9waWRzID49IE1BWF9QSURTX1BFUl9QUk9HUkFNKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+bmJfcGlkczsgaSsrKQorICAgICAgICBpZiAocC0+cGlkc1tpXSA9PSBwaWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICBwLT5waWRzW3AtPm5iX3BpZHMrK10gPSBwaWQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wbXRfZm91bmQoTXBlZ1RTQ29udGV4dCAqdHMsIHVuc2lnbmVkIGludCBwcm9ncmFtaWQpCit7CisgICAgc3RydWN0IFByb2dyYW0gKnAgPSBnZXRfcHJvZ3JhbSh0cywgcHJvZ3JhbWlkKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybjsKKworICAgIHAtPnBtdF9mb3VuZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wY3JfcGlkKEFWRm9ybWF0Q29udGV4dCAqcywgdW5zaWduZWQgaW50IHByb2dyYW1pZCwgdW5zaWduZWQgaW50IHBpZCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcHJvZ3JhbXM7IGkrKykgeworICAgICAgICBpZiAocy0+cHJvZ3JhbXNbaV0tPmlkID09IHByb2dyYW1pZCkgeworICAgICAgICAgICAgcy0+cHJvZ3JhbXNbaV0tPnBjcl9waWQgPSBwaWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBAYnJpZWYgZGlzY2FyZF9waWQoKSBkZWNpZGVzIGlmIHRoZSBwaWQgaXMgdG8gYmUgZGlzY2FyZGVkIGFjY29yZGluZworICogICAgICAgICAgICAgICAgICAgICAgdG8gY2FsbGVyJ3MgcHJvZ3JhbXMgc2VsZWN0aW9uCisgKiBAcGFyYW0gdHMgICAgOiAtIFRTIGNvbnRleHQKKyAqIEBwYXJhbSBwaWQgICA6IC0gcGlkCisgKiBAcmV0dXJuIDEgaWYgdGhlIHBpZCBpcyBvbmx5IGNvbXByaXNlZCBpbiBwcm9ncmFtcyB0aGF0IGhhdmUgLmRpc2NhcmQ9QVZESVNDQVJEX0FMTAorICogICAgICAgICAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGRpc2NhcmRfcGlkKE1wZWdUU0NvbnRleHQgKnRzLCB1bnNpZ25lZCBpbnQgcGlkKQoreworICAgIGludCBpLCBqLCBrOworICAgIGludCB1c2VkID0gMCwgZGlzY2FyZGVkID0gMDsKKyAgICBzdHJ1Y3QgUHJvZ3JhbSAqcDsKKworICAgIC8qIElmIG5vbmUgb2YgdGhlIHByb2dyYW1zIGhhdmUgLmRpc2NhcmQ9QVZESVNDQVJEX0FMTCB0aGVuIHRoZXJlJ3MKKyAgICAgKiBubyB3YXkgd2UgaGF2ZSB0byBkaXNjYXJkIHRoaXMgcGFja2V0ICovCisgICAgZm9yIChrID0gMDsgayA8IHRzLT5zdHJlYW0tPm5iX3Byb2dyYW1zOyBrKyspCisgICAgICAgIGlmICh0cy0+c3RyZWFtLT5wcm9ncmFtc1trXS0+ZGlzY2FyZCA9PSBBVkRJU0NBUkRfQUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGsgPT0gdHMtPnN0cmVhbS0+bmJfcHJvZ3JhbXMpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHRzLT5uYl9wcmc7IGkrKykgeworICAgICAgICBwID0gJnRzLT5wcmdbaV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBwLT5uYl9waWRzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChwLT5waWRzW2pdICE9IHBpZCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIGlzIHByb2dyYW0gd2l0aCBpZCBwLT5pZCBzZXQgdG8gYmUgZGlzY2FyZGVkPworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHRzLT5zdHJlYW0tPm5iX3Byb2dyYW1zOyBrKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodHMtPnN0cmVhbS0+cHJvZ3JhbXNba10tPmlkID09IHAtPmlkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cy0+c3RyZWFtLT5wcm9ncmFtc1trXS0+ZGlzY2FyZCA9PSBBVkRJU0NBUkRfQUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZGVkKys7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gIXVzZWQgJiYgZGlzY2FyZGVkOworfQorCisvKioKKyAqICBBc3NlbWJsZSBQRVMgcGFja2V0cyBvdXQgb2YgVFMgcGFja2V0cywgYW5kIHRoZW4gY2FsbCB0aGUgInNlY3Rpb25fY2IiCisgKiAgZnVuY3Rpb24gd2hlbiB0aGV5IGFyZSBjb21wbGV0ZS4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfc2VjdGlvbl9kYXRhKE1wZWdUU0NvbnRleHQgKnRzLCBNcGVnVFNGaWx0ZXIgKnRzczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBpc19zdGFydCkKK3sKKyAgICBNcGVnVFNTZWN0aW9uRmlsdGVyICp0c3MgPSAmdHNzMS0+dS5zZWN0aW9uX2ZpbHRlcjsKKyAgICBpbnQgbGVuOworCisgICAgaWYgKGlzX3N0YXJ0KSB7CisgICAgICAgIG1lbWNweSh0c3MtPnNlY3Rpb25fYnVmLCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgdHNzLT5zZWN0aW9uX2luZGV4ID0gYnVmX3NpemU7CisgICAgICAgIHRzcy0+c2VjdGlvbl9oX3NpemUgPSAtMTsKKyAgICAgICAgdHNzLT5lbmRfb2Zfc2VjdGlvbl9yZWFjaGVkID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodHNzLT5lbmRfb2Zfc2VjdGlvbl9yZWFjaGVkKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBsZW4gPSA0MDk2IC0gdHNzLT5zZWN0aW9uX2luZGV4OworICAgICAgICBpZiAoYnVmX3NpemUgPCBsZW4pCisgICAgICAgICAgICBsZW4gPSBidWZfc2l6ZTsKKyAgICAgICAgbWVtY3B5KHRzcy0+c2VjdGlvbl9idWYgKyB0c3MtPnNlY3Rpb25faW5kZXgsIGJ1ZiwgbGVuKTsKKyAgICAgICAgdHNzLT5zZWN0aW9uX2luZGV4ICs9IGxlbjsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHNlY3Rpb24gbGVuZ3RoIGlmIHBvc3NpYmxlICovCisgICAgaWYgKHRzcy0+c2VjdGlvbl9oX3NpemUgPT0gLTEgJiYgdHNzLT5zZWN0aW9uX2luZGV4ID49IDMpIHsKKyAgICAgICAgbGVuID0gKEFWX1JCMTYodHNzLT5zZWN0aW9uX2J1ZiArIDEpICYgMHhmZmYpICsgMzsKKyAgICAgICAgaWYgKGxlbiA+IDQwOTYpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRzcy0+c2VjdGlvbl9oX3NpemUgPSBsZW47CisgICAgfQorCisgICAgaWYgKHRzcy0+c2VjdGlvbl9oX3NpemUgIT0gLTEgJiYKKyAgICAgICAgdHNzLT5zZWN0aW9uX2luZGV4ID49IHRzcy0+c2VjdGlvbl9oX3NpemUpIHsKKyAgICAgICAgaW50IGNyY192YWxpZCA9IDE7CisgICAgICAgIHRzcy0+ZW5kX29mX3NlY3Rpb25fcmVhY2hlZCA9IDE7CisKKyAgICAgICAgaWYgKHRzcy0+Y2hlY2tfY3JjKSB7CisgICAgICAgICAgICBjcmNfdmFsaWQgPSAhYXZfY3JjKGF2X2NyY19nZXRfdGFibGUoQVZfQ1JDXzMyX0lFRUUpLCAtMSwgdHNzLT5zZWN0aW9uX2J1ZiwgdHNzLT5zZWN0aW9uX2hfc2l6ZSk7CisgICAgICAgICAgICBpZiAoY3JjX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgdHMtPmNyY192YWxpZGl0eVsgdHNzMS0+cGlkIF0gPSAxMDA7CisgICAgICAgICAgICB9ZWxzZSBpZiAodHMtPmNyY192YWxpZGl0eVsgdHNzMS0+cGlkIF0gPiAtMTApIHsKKyAgICAgICAgICAgICAgICB0cy0+Y3JjX3ZhbGlkaXR5WyB0c3MxLT5waWQgXS0tOworICAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgICAgICBjcmNfdmFsaWQgPSAyOworICAgICAgICB9CisgICAgICAgIGlmIChjcmNfdmFsaWQpCisgICAgICAgICAgICB0c3MtPnNlY3Rpb25fY2IodHNzMSwgdHNzLT5zZWN0aW9uX2J1ZiwgdHNzLT5zZWN0aW9uX2hfc2l6ZSk7CisgICAgfQorfQorCitzdGF0aWMgTXBlZ1RTRmlsdGVyICptcGVndHNfb3Blbl9maWx0ZXIoTXBlZ1RTQ29udGV4dCAqdHMsIHVuc2lnbmVkIGludCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBNcGVnVFNGaWx0ZXJUeXBlIHR5cGUpCit7CisgICAgTXBlZ1RTRmlsdGVyICpmaWx0ZXI7CisKKyAgICBhdl9kbG9nKHRzLT5zdHJlYW0sICJGaWx0ZXI6IHBpZD0weCV4XG4iLCBwaWQpOworCisgICAgaWYgKHBpZCA+PSBOQl9QSURfTUFYIHx8IHRzLT5waWRzW3BpZF0pCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZpbHRlciA9IGF2X21hbGxvY3ooc2l6ZW9mKE1wZWdUU0ZpbHRlcikpOworICAgIGlmICghZmlsdGVyKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0cy0+cGlkc1twaWRdID0gZmlsdGVyOworCisgICAgZmlsdGVyLT50eXBlICAgID0gdHlwZTsKKyAgICBmaWx0ZXItPnBpZCAgICAgPSBwaWQ7CisgICAgZmlsdGVyLT5lc19pZCAgID0gLTE7CisgICAgZmlsdGVyLT5sYXN0X2NjID0gLTE7CisgICAgZmlsdGVyLT5sYXN0X3Bjcj0gLTE7CisKKyAgICByZXR1cm4gZmlsdGVyOworfQorCitzdGF0aWMgTXBlZ1RTRmlsdGVyICptcGVndHNfb3Blbl9zZWN0aW9uX2ZpbHRlcihNcGVnVFNDb250ZXh0ICp0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uQ2FsbGJhY2sgKnNlY3Rpb25fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hlY2tfY3JjKQoreworICAgIE1wZWdUU0ZpbHRlciAqZmlsdGVyOworICAgIE1wZWdUU1NlY3Rpb25GaWx0ZXIgKnNlYzsKKworICAgIGlmICghKGZpbHRlciA9IG1wZWd0c19vcGVuX2ZpbHRlcih0cywgcGlkLCBNUEVHVFNfU0VDVElPTikpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWMgPSAmZmlsdGVyLT51LnNlY3Rpb25fZmlsdGVyOworICAgIHNlYy0+c2VjdGlvbl9jYiAgPSBzZWN0aW9uX2NiOworICAgIHNlYy0+b3BhcXVlICAgICAgPSBvcGFxdWU7CisgICAgc2VjLT5zZWN0aW9uX2J1ZiA9IGF2X21hbGxvYyhNQVhfU0VDVElPTl9TSVpFKTsKKyAgICBzZWMtPmNoZWNrX2NyYyAgID0gY2hlY2tfY3JjOworICAgIGlmICghc2VjLT5zZWN0aW9uX2J1ZikgeworICAgICAgICBhdl9mcmVlKGZpbHRlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZmlsdGVyOworfQorCitzdGF0aWMgTXBlZ1RTRmlsdGVyICptcGVndHNfb3Blbl9wZXNfZmlsdGVyKE1wZWdUU0NvbnRleHQgKnRzLCB1bnNpZ25lZCBpbnQgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRVNDYWxsYmFjayAqcGVzX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgTXBlZ1RTRmlsdGVyICpmaWx0ZXI7CisgICAgTXBlZ1RTUEVTRmlsdGVyICpwZXM7CisKKyAgICBpZiAoIShmaWx0ZXIgPSBtcGVndHNfb3Blbl9maWx0ZXIodHMsIHBpZCwgTVBFR1RTX1BFUykpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHBlcyA9ICZmaWx0ZXItPnUucGVzX2ZpbHRlcjsKKyAgICBwZXMtPnBlc19jYiA9IHBlc19jYjsKKyAgICBwZXMtPm9wYXF1ZSA9IG9wYXF1ZTsKKyAgICByZXR1cm4gZmlsdGVyOworfQorCitzdGF0aWMgTXBlZ1RTRmlsdGVyICptcGVndHNfb3Blbl9wY3JfZmlsdGVyKE1wZWdUU0NvbnRleHQgKnRzLCB1bnNpZ25lZCBpbnQgcGlkKQoreworICAgIHJldHVybiBtcGVndHNfb3Blbl9maWx0ZXIodHMsIHBpZCwgTVBFR1RTX1BDUik7Cit9CisKK3N0YXRpYyB2b2lkIG1wZWd0c19jbG9zZV9maWx0ZXIoTXBlZ1RTQ29udGV4dCAqdHMsIE1wZWdUU0ZpbHRlciAqZmlsdGVyKQoreworICAgIGludCBwaWQ7CisKKyAgICBwaWQgPSBmaWx0ZXItPnBpZDsKKyAgICBpZiAoZmlsdGVyLT50eXBlID09IE1QRUdUU19TRUNUSU9OKQorICAgICAgICBhdl9mcmVlcCgmZmlsdGVyLT51LnNlY3Rpb25fZmlsdGVyLnNlY3Rpb25fYnVmKTsKKyAgICBlbHNlIGlmIChmaWx0ZXItPnR5cGUgPT0gTVBFR1RTX1BFUykgeworICAgICAgICBQRVNDb250ZXh0ICpwZXMgPSBmaWx0ZXItPnUucGVzX2ZpbHRlci5vcGFxdWU7CisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcGVzLT5idWZmZXIpOworICAgICAgICAvKiByZWZlcmVuY2VkIHByaXZhdGUgZGF0YSB3aWxsIGJlIGZyZWVkIGxhdGVyIGluCisgICAgICAgICAqIGF2Zm9ybWF0X2Nsb3NlX2lucHV0ICovCisgICAgICAgIGlmICghKChQRVNDb250ZXh0ICopZmlsdGVyLT51LnBlc19maWx0ZXIub3BhcXVlKS0+c3QpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZmaWx0ZXItPnUucGVzX2ZpbHRlci5vcGFxdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJlZShmaWx0ZXIpOworICAgIHRzLT5waWRzW3BpZF0gPSBOVUxMOworfQorCitzdGF0aWMgaW50IGFuYWx5emUoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSwgaW50IHBhY2tldF9zaXplLCBpbnQgKmluZGV4KQoreworICAgIGludCBzdGF0W1RTX01BWF9QQUNLRVRfU0laRV07CisgICAgaW50IHN0YXRfYWxsID0gMDsKKyAgICBpbnQgaTsKKyAgICBpbnQgYmVzdF9zY29yZSA9IDA7CisKKyAgICBtZW1zZXQoc3RhdCwgMCwgcGFja2V0X3NpemUgKiBzaXplb2YoKnN0YXQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplIC0gMzsgaSsrKSB7CisgICAgICAgIGlmIChidWZbaV0gPT0gMHg0NyAmJiAhKGJ1ZltpICsgMV0gJiAweDgwKSAmJiBidWZbaSArIDNdICE9IDB4NDcpIHsKKyAgICAgICAgICAgIGludCB4ID0gaSAlIHBhY2tldF9zaXplOworICAgICAgICAgICAgc3RhdFt4XSsrOworICAgICAgICAgICAgc3RhdF9hbGwrKzsKKyAgICAgICAgICAgIGlmIChzdGF0W3hdID4gYmVzdF9zY29yZSkgeworICAgICAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzdGF0W3hdOworICAgICAgICAgICAgICAgIGlmIChpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgKmluZGV4ID0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiZXN0X3Njb3JlIC0gRkZNQVgoc3RhdF9hbGwgLSAxMCpiZXN0X3Njb3JlLCAwKS8xMDsKK30KKworLyogYXV0b2RldGVjdCBmZWMgcHJlc2VuY2UuIE11c3QgaGF2ZSBhdCBsZWFzdCAxMDI0IGJ5dGVzICAqLworc3RhdGljIGludCBnZXRfcGFja2V0X3NpemUoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgc2NvcmUsIGZlY19zY29yZSwgZHZoc19zY29yZTsKKworICAgIGlmIChzaXplIDwgKFRTX0ZFQ19QQUNLRVRfU0laRSAqIDUgKyAxKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzY29yZSAgICAgID0gYW5hbHl6ZShidWYsIHNpemUsIFRTX1BBQ0tFVF9TSVpFLCBOVUxMKTsKKyAgICBkdmhzX3Njb3JlID0gYW5hbHl6ZShidWYsIHNpemUsIFRTX0RWSFNfUEFDS0VUX1NJWkUsIE5VTEwpOworICAgIGZlY19zY29yZSAgPSBhbmFseXplKGJ1Ziwgc2l6ZSwgVFNfRkVDX1BBQ0tFVF9TSVpFLCBOVUxMKTsKKyAgICBhdl9kbG9nKE5VTEwsICJzY29yZTogJWQsIGR2aHNfc2NvcmU6ICVkLCBmZWNfc2NvcmU6ICVkIFxuIiwKKyAgICAgICAgICAgIHNjb3JlLCBkdmhzX3Njb3JlLCBmZWNfc2NvcmUpOworCisgICAgaWYgKHNjb3JlID4gZmVjX3Njb3JlICYmIHNjb3JlID4gZHZoc19zY29yZSkKKyAgICAgICAgcmV0dXJuIFRTX1BBQ0tFVF9TSVpFOworICAgIGVsc2UgaWYgKGR2aHNfc2NvcmUgPiBzY29yZSAmJiBkdmhzX3Njb3JlID4gZmVjX3Njb3JlKQorICAgICAgICByZXR1cm4gVFNfRFZIU19QQUNLRVRfU0laRTsKKyAgICBlbHNlIGlmIChzY29yZSA8IGZlY19zY29yZSAmJiBkdmhzX3Njb3JlIDwgZmVjX3Njb3JlKQorICAgICAgICByZXR1cm4gVFNfRkVDX1BBQ0tFVF9TSVpFOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKK3R5cGVkZWYgc3RydWN0IFNlY3Rpb25IZWFkZXIgeworICAgIHVpbnQ4X3QgdGlkOworICAgIHVpbnQxNl90IGlkOworICAgIHVpbnQ4X3QgdmVyc2lvbjsKKyAgICB1aW50OF90IHNlY19udW07CisgICAgdWludDhfdCBsYXN0X3NlY19udW07Cit9IFNlY3Rpb25IZWFkZXI7CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldDgoY29uc3QgdWludDhfdCAqKnBwLCBjb25zdCB1aW50OF90ICpwX2VuZCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpwOworICAgIGludCBjOworCisgICAgcCA9ICpwcDsKKyAgICBpZiAocCA+PSBwX2VuZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgYyAgID0gKnArKzsKKyAgICAqcHAgPSBwOworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXQxNihjb25zdCB1aW50OF90ICoqcHAsIGNvbnN0IHVpbnQ4X3QgKnBfZW5kKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnA7CisgICAgaW50IGM7CisKKyAgICBwID0gKnBwOworICAgIGlmICgocCArIDEpID49IHBfZW5kKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBjICAgPSBBVl9SQjE2KHApOworICAgIHAgICs9IDI7CisgICAgKnBwID0gcDsKKyAgICByZXR1cm4gYzsKK30KKworLyogcmVhZCBhbmQgYWxsb2NhdGUgYSBEVkIgc3RyaW5nIHByZWNlZGVkIGJ5IGl0cyBsZW5ndGggKi8KK3N0YXRpYyBjaGFyICpnZXRzdHI4KGNvbnN0IHVpbnQ4X3QgKipwcCwgY29uc3QgdWludDhfdCAqcF9lbmQpCit7CisgICAgaW50IGxlbjsKKyAgICBjb25zdCB1aW50OF90ICpwOworICAgIGNoYXIgKnN0cjsKKworICAgIHAgICA9ICpwcDsKKyAgICBsZW4gPSBnZXQ4KCZwLCBwX2VuZCk7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgocCArIGxlbikgPiBwX2VuZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3RyID0gYXZfbWFsbG9jKGxlbiArIDEpOworICAgIGlmICghc3RyKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoc3RyLCBwLCBsZW4pOworICAgIHN0cltsZW5dID0gJ1wwJzsKKyAgICBwICArPSBsZW47CisgICAgKnBwID0gcDsKKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgaW50IHBhcnNlX3NlY3Rpb25faGVhZGVyKFNlY3Rpb25IZWFkZXIgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwcCwgY29uc3QgdWludDhfdCAqcF9lbmQpCit7CisgICAgaW50IHZhbDsKKworICAgIHZhbCA9IGdldDgocHAsIHBfZW5kKTsKKyAgICBpZiAodmFsIDwgMCkKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICBoLT50aWQgPSB2YWw7CisgICAgKnBwICs9IDI7CisgICAgdmFsICA9IGdldDE2KHBwLCBwX2VuZCk7CisgICAgaWYgKHZhbCA8IDApCisgICAgICAgIHJldHVybiB2YWw7CisgICAgaC0+aWQgPSB2YWw7CisgICAgdmFsID0gZ2V0OChwcCwgcF9lbmQpOworICAgIGlmICh2YWwgPCAwKQorICAgICAgICByZXR1cm4gdmFsOworICAgIGgtPnZlcnNpb24gPSAodmFsID4+IDEpICYgMHgxZjsKKyAgICB2YWwgPSBnZXQ4KHBwLCBwX2VuZCk7CisgICAgaWYgKHZhbCA8IDApCisgICAgICAgIHJldHVybiB2YWw7CisgICAgaC0+c2VjX251bSA9IHZhbDsKKyAgICB2YWwgPSBnZXQ4KHBwLCBwX2VuZCk7CisgICAgaWYgKHZhbCA8IDApCisgICAgICAgIHJldHVybiB2YWw7CisgICAgaC0+bGFzdF9zZWNfbnVtID0gdmFsOworICAgIHJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgc3RyZWFtX3R5cGU7CisgICAgZW51bSBBVk1lZGlhVHlwZSBjb2RlY190eXBlOworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkOworfSBTdHJlYW1UeXBlOworCitzdGF0aWMgY29uc3QgU3RyZWFtVHlwZSBJU09fdHlwZXNbXSA9IHsKKyAgICB7IDB4MDEsIEFWTUVESUFfVFlQRV9WSURFTywgQVZfQ09ERUNfSURfTVBFRzJWSURFTyB9LAorICAgIHsgMHgwMiwgQVZNRURJQV9UWVBFX1ZJREVPLCBBVl9DT0RFQ19JRF9NUEVHMlZJREVPIH0sCisgICAgeyAweDAzLCBBVk1FRElBX1RZUEVfQVVESU8sIEFWX0NPREVDX0lEX01QMyAgICAgICAgfSwKKyAgICB7IDB4MDQsIEFWTUVESUFfVFlQRV9BVURJTywgQVZfQ09ERUNfSURfTVAzICAgICAgICB9LAorICAgIHsgMHgwZiwgQVZNRURJQV9UWVBFX0FVRElPLCBBVl9DT0RFQ19JRF9BQUMgICAgICAgIH0sCisgICAgeyAweDEwLCBBVk1FRElBX1RZUEVfVklERU8sIEFWX0NPREVDX0lEX01QRUc0ICAgICAgfSwKKyAgICAvKiBNYWtpdG8gZW5jb2RlciBzZXRzIHN0cmVhbSB0eXBlIDB4MTEgZm9yIEFBQywKKyAgICAgKiBzbyBhdXRvLWRldGVjdCBMT0FTL0xBVE0gaW5zdGVhZCBvZiBoYXJkY29kaW5nIGl0LiAqLworI2lmICFDT05GSUdfTE9BU19ERU1VWEVSCisgICAgeyAweDExLCBBVk1FRElBX1RZUEVfQVVESU8sIEFWX0NPREVDX0lEX0FBQ19MQVRNICAgfSwgLyogTEFUTSBzeW50YXggKi8KKyNlbmRpZgorICAgIHsgMHgxYiwgQVZNRURJQV9UWVBFX1ZJREVPLCBBVl9DT0RFQ19JRF9IMjY0ICAgICAgIH0sCisgICAgeyAweDI0LCBBVk1FRElBX1RZUEVfVklERU8sIEFWX0NPREVDX0lEX0hFVkMgICAgICAgfSwKKyAgICB7IDB4NDIsIEFWTUVESUFfVFlQRV9WSURFTywgQVZfQ09ERUNfSURfQ0FWUyAgICAgICB9LAorICAgIHsgMHhkMSwgQVZNRURJQV9UWVBFX1ZJREVPLCBBVl9DT0RFQ19JRF9ESVJBQyAgICAgIH0sCisgICAgeyAweGVhLCBBVk1FRElBX1RZUEVfVklERU8sIEFWX0NPREVDX0lEX1ZDMSAgICAgICAgfSwKKyAgICB7IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBTdHJlYW1UeXBlIEhETVZfdHlwZXNbXSA9IHsKKyAgICB7IDB4ODAsIEFWTUVESUFfVFlQRV9BVURJTywgICAgQVZfQ09ERUNfSURfUENNX0JMVVJBWSAgICAgICAgfSwKKyAgICB7IDB4ODEsIEFWTUVESUFfVFlQRV9BVURJTywgICAgQVZfQ09ERUNfSURfQUMzICAgICAgICAgICAgICAgfSwKKyAgICB7IDB4ODIsIEFWTUVESUFfVFlQRV9BVURJTywgICAgQVZfQ09ERUNfSURfRFRTICAgICAgICAgICAgICAgfSwKKyAgICB7IDB4ODMsIEFWTUVESUFfVFlQRV9BVURJTywgICAgQVZfQ09ERUNfSURfVFJVRUhEICAgICAgICAgICAgfSwKKyAgICB7IDB4ODQsIEFWTUVESUFfVFlQRV9BVURJTywgICAgQVZfQ09ERUNfSURfRUFDMyAgICAgICAgICAgICAgfSwKKyAgICB7IDB4ODUsIEFWTUVESUFfVFlQRV9BVURJTywgICAgQVZfQ09ERUNfSURfRFRTICAgICAgICAgICAgICAgfSwgLyogRFRTIEhEICovCisgICAgeyAweDg2LCBBVk1FRElBX1RZUEVfQVVESU8sICAgIEFWX0NPREVDX0lEX0RUUyAgICAgICAgICAgICAgIH0sIC8qIERUUyBIRCBNQVNURVIqLworICAgIHsgMHhhMSwgQVZNRURJQV9UWVBFX0FVRElPLCAgICBBVl9DT0RFQ19JRF9FQUMzICAgICAgICAgICAgICB9LCAvKiBFLUFDMyBTZWNvbmRhcnkgQXVkaW8gKi8KKyAgICB7IDB4YTIsIEFWTUVESUFfVFlQRV9BVURJTywgICAgQVZfQ09ERUNfSURfRFRTICAgICAgICAgICAgICAgfSwgLyogRFRTIEV4cHJlc3MgU2Vjb25kYXJ5IEF1ZGlvICovCisgICAgeyAweDkwLCBBVk1FRElBX1RZUEVfU1VCVElUTEUsIEFWX0NPREVDX0lEX0hETVZfUEdTX1NVQlRJVExFIH0sCisgICAgeyAwIH0sCit9OworCisvKiBBVFNDID8gKi8KK3N0YXRpYyBjb25zdCBTdHJlYW1UeXBlIE1JU0NfdHlwZXNbXSA9IHsKKyAgICB7IDB4ODEsIEFWTUVESUFfVFlQRV9BVURJTywgQVZfQ09ERUNfSURfQUMzIH0sCisgICAgeyAweDhhLCBBVk1FRElBX1RZUEVfQVVESU8sIEFWX0NPREVDX0lEX0RUUyB9LAorICAgIHsgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IFN0cmVhbVR5cGUgUkVHRF90eXBlc1tdID0geworICAgIHsgTUtUQUcoJ2QnLCAncicsICdhJywgJ2MnKSwgQVZNRURJQV9UWVBFX1ZJREVPLCBBVl9DT0RFQ19JRF9ESVJBQyB9LAorICAgIHsgTUtUQUcoJ0EnLCAnQycsICctJywgJzMnKSwgQVZNRURJQV9UWVBFX0FVRElPLCBBVl9DT0RFQ19JRF9BQzMgICB9LAorICAgIHsgTUtUQUcoJ0InLCAnUycsICdTJywgJ0QnKSwgQVZNRURJQV9UWVBFX0FVRElPLCBBVl9DT0RFQ19JRF9TMzAyTSB9LAorICAgIHsgTUtUQUcoJ0QnLCAnVCcsICdTJywgJzEnKSwgQVZNRURJQV9UWVBFX0FVRElPLCBBVl9DT0RFQ19JRF9EVFMgICB9LAorICAgIHsgTUtUQUcoJ0QnLCAnVCcsICdTJywgJzInKSwgQVZNRURJQV9UWVBFX0FVRElPLCBBVl9DT0RFQ19JRF9EVFMgICB9LAorICAgIHsgTUtUQUcoJ0QnLCAnVCcsICdTJywgJzMnKSwgQVZNRURJQV9UWVBFX0FVRElPLCBBVl9DT0RFQ19JRF9EVFMgICB9LAorICAgIHsgTUtUQUcoJ0gnLCAnRScsICdWJywgJ0MnKSwgQVZNRURJQV9UWVBFX1ZJREVPLCBBVl9DT0RFQ19JRF9IRVZDICB9LAorICAgIHsgTUtUQUcoJ0snLCAnTCcsICdWJywgJ0EnKSwgQVZNRURJQV9UWVBFX0RBVEEsICBBVl9DT0RFQ19JRF9TTVBURV9LTFYgfSwKKyAgICB7IE1LVEFHKCdWJywgJ0MnLCAnLScsICcxJyksIEFWTUVESUFfVFlQRV9WSURFTywgQVZfQ09ERUNfSURfVkMxICAgfSwKKyAgICB7IE1LVEFHKCdPJywgJ3AnLCAndScsICdzJyksIEFWTUVESUFfVFlQRV9BVURJTywgQVZfQ09ERUNfSURfT1BVUyAgfSwKKyAgICB7IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBTdHJlYW1UeXBlIE1FVEFEQVRBX3R5cGVzW10gPSB7CisgICAgeyBNS1RBRygnSycsJ0wnLCdWJywnQScpLCBBVk1FRElBX1RZUEVfREFUQSwgQVZfQ09ERUNfSURfU01QVEVfS0xWIH0sCisgICAgeyBNS1RBRygnSScsJ0QnLCczJywnICcpLCBBVk1FRElBX1RZUEVfREFUQSwgQVZfQ09ERUNfSURfVElNRURfSUQzIH0sCisgICAgeyAwIH0sCit9OworCisvKiBkZXNjcmlwdG9yIHByZXNlbnQgKi8KK3N0YXRpYyBjb25zdCBTdHJlYW1UeXBlIERFU0NfdHlwZXNbXSA9IHsKKyAgICB7IDB4NmEsIEFWTUVESUFfVFlQRV9BVURJTywgICAgQVZfQ09ERUNfSURfQUMzICAgICAgICAgIH0sIC8qIEFDLTMgZGVzY3JpcHRvciAqLworICAgIHsgMHg3YSwgQVZNRURJQV9UWVBFX0FVRElPLCAgICBBVl9DT0RFQ19JRF9FQUMzICAgICAgICAgfSwgLyogRS1BQy0zIGRlc2NyaXB0b3IgKi8KKyAgICB7IDB4N2IsIEFWTUVESUFfVFlQRV9BVURJTywgICAgQVZfQ09ERUNfSURfRFRTICAgICAgICAgIH0sCisgICAgeyAweDU2LCBBVk1FRElBX1RZUEVfU1VCVElUTEUsIEFWX0NPREVDX0lEX0RWQl9URUxFVEVYVCB9LAorICAgIHsgMHg1OSwgQVZNRURJQV9UWVBFX1NVQlRJVExFLCBBVl9DT0RFQ19JRF9EVkJfU1VCVElUTEUgfSwgLyogc3VidGl0bGluZyBkZXNjcmlwdG9yICovCisgICAgeyAwIH0sCit9OworCitzdGF0aWMgdm9pZCBtcGVndHNfZmluZF9zdHJlYW1fdHlwZShBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbVR5cGUgKnR5cGVzKQoreworICAgIGlmIChhdmNvZGVjX2lzX29wZW4oc3QtPmNvZGVjKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiY2Fubm90IHNldCBzdHJlYW0gaW5mbywgY29kZWMgaXMgb3BlblxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKDsgdHlwZXMtPnN0cmVhbV90eXBlOyB0eXBlcysrKQorICAgICAgICBpZiAoc3RyZWFtX3R5cGUgPT0gdHlwZXMtPnN0cmVhbV90eXBlKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSB0eXBlcy0+Y29kZWNfdHlwZTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IHR5cGVzLT5jb2RlY19pZDsKKyAgICAgICAgICAgIHN0LT5yZXF1ZXN0X3Byb2JlICAgICA9IDA7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBtcGVndHNfc2V0X3N0cmVhbV9pbmZvKEFWU3RyZWFtICpzdCwgUEVTQ29udGV4dCAqcGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV90eXBlLCB1aW50MzJfdCBwcm9nX3JlZ19kZXNjKQoreworICAgIGludCBvbGRfY29kZWNfdHlwZSA9IHN0LT5jb2RlYy0+Y29kZWNfdHlwZTsKKyAgICBpbnQgb2xkX2NvZGVjX2lkICA9IHN0LT5jb2RlYy0+Y29kZWNfaWQ7CisKKyAgICBpZiAoYXZjb2RlY19pc19vcGVuKHN0LT5jb2RlYykpIHsKKyAgICAgICAgYXZfbG9nKHBlcy0+c3RyZWFtLCBBVl9MT0dfREVCVUcsICJjYW5ub3Qgc2V0IHN0cmVhbSBpbmZvLCBjb2RlYyBpcyBvcGVuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzMsIDEsIDkwMDAwKTsKKyAgICBzdC0+cHJpdl9kYXRhICAgICAgICAgPSBwZXM7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTk9ORTsKKyAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworICAgIHBlcy0+c3QgICAgICAgICAgPSBzdDsKKyAgICBwZXMtPnN0cmVhbV90eXBlID0gc3RyZWFtX3R5cGU7CisKKyAgICBhdl9sb2cocGVzLT5zdHJlYW0sIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgInN0cmVhbT0lZCBzdHJlYW1fdHlwZT0leCBwaWQ9JXggcHJvZ19yZWdfZGVzYz0lLjRzXG4iLAorICAgICAgICAgICBzdC0+aW5kZXgsIHBlcy0+c3RyZWFtX3R5cGUsIHBlcy0+cGlkLCAoY2hhciAqKSZwcm9nX3JlZ19kZXNjKTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gcGVzLT5zdHJlYW1fdHlwZTsKKworICAgIG1wZWd0c19maW5kX3N0cmVhbV90eXBlKHN0LCBwZXMtPnN0cmVhbV90eXBlLCBJU09fdHlwZXMpOworICAgIGlmICgocHJvZ19yZWdfZGVzYyA9PSBBVl9STDMyKCJIRE1WIikgfHwKKyAgICAgICAgIHByb2dfcmVnX2Rlc2MgPT0gQVZfUkwzMigiSERQUiIpKSAmJgorICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgbXBlZ3RzX2ZpbmRfc3RyZWFtX3R5cGUoc3QsIHBlcy0+c3RyZWFtX3R5cGUsIEhETVZfdHlwZXMpOworICAgICAgICBpZiAocGVzLT5zdHJlYW1fdHlwZSA9PSAweDgzKSB7CisgICAgICAgICAgICAvLyBIRE1WIFRydWVIRCBzdHJlYW1zIGFsc28gY29udGFpbiBhbiBBQzMgY29kZWQgdmVyc2lvbiBvZiB0aGUKKyAgICAgICAgICAgIC8vIGF1ZGlvIHRyYWNrIC0gYWRkIGEgc2Vjb25kIHN0cmVhbSBmb3IgdGhpcworICAgICAgICAgICAgQVZTdHJlYW0gKnN1Yl9zdDsKKyAgICAgICAgICAgIC8vIHByaXZfZGF0YSBjYW5ub3QgYmUgc2hhcmVkIGJldHdlZW4gc3RyZWFtcworICAgICAgICAgICAgUEVTQ29udGV4dCAqc3ViX3BlcyA9IGF2X21hbGxvYyhzaXplb2YoKnN1Yl9wZXMpKTsKKyAgICAgICAgICAgIGlmICghc3ViX3BlcykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgbWVtY3B5KHN1Yl9wZXMsIHBlcywgc2l6ZW9mKCpzdWJfcGVzKSk7CisKKyAgICAgICAgICAgIHN1Yl9zdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocGVzLT5zdHJlYW0sIE5VTEwpOworICAgICAgICAgICAgaWYgKCFzdWJfc3QpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHN1Yl9wZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN1Yl9zdC0+aWQgPSBwZXMtPnBpZDsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3ViX3N0LCAzMywgMSwgOTAwMDApOworICAgICAgICAgICAgc3ViX3N0LT5wcml2X2RhdGEgICAgICAgICA9IHN1Yl9wZXM7CisgICAgICAgICAgICBzdWJfc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgc3ViX3N0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0FDMzsKKyAgICAgICAgICAgIHN1Yl9zdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworICAgICAgICAgICAgc3ViX3Blcy0+c3ViX3N0ICAgICAgICAgICA9IHBlcy0+c3ViX3N0ID0gc3ViX3N0OworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCisgICAgICAgIG1wZWd0c19maW5kX3N0cmVhbV90eXBlKHN0LCBwZXMtPnN0cmVhbV90eXBlLCBNSVNDX3R5cGVzKTsKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgID0gb2xkX2NvZGVjX2lkOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBvbGRfY29kZWNfdHlwZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfcGVzX3BhY2tldF9zdGF0ZShQRVNDb250ZXh0ICpwZXMpCit7CisgICAgcGVzLT5wdHMgICAgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgcGVzLT5kdHMgICAgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgcGVzLT5kYXRhX2luZGV4ID0gMDsKKyAgICBwZXMtPmZsYWdzICAgICAgPSAwOworICAgIGF2X2J1ZmZlcl91bnJlZigmcGVzLT5idWZmZXIpOworfQorCitzdGF0aWMgdm9pZCBuZXdfcGVzX3BhY2tldChQRVNDb250ZXh0ICpwZXMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgYXZfaW5pdF9wYWNrZXQocGt0KTsKKworICAgIHBrdC0+YnVmICA9IHBlcy0+YnVmZmVyOworICAgIHBrdC0+ZGF0YSA9IHBlcy0+YnVmZmVyLT5kYXRhOworICAgIHBrdC0+c2l6ZSA9IHBlcy0+ZGF0YV9pbmRleDsKKworICAgIGlmIChwZXMtPnRvdGFsX3NpemUgIT0gTUFYX1BFU19QQVlMT0FEICYmCisgICAgICAgIHBlcy0+cGVzX2hlYWRlcl9zaXplICsgcGVzLT5kYXRhX2luZGV4ICE9IHBlcy0+dG90YWxfc2l6ZSArCisgICAgICAgIFBFU19TVEFSVF9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhwZXMtPnN0cmVhbSwgQVZfTE9HX1dBUk5JTkcsICJQRVMgcGFja2V0IHNpemUgbWlzbWF0Y2hcbiIpOworICAgICAgICBwZXMtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0NPUlJVUFQ7CisgICAgfQorICAgIG1lbXNldChwa3QtPmRhdGEgKyBwa3QtPnNpemUsIDAsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCisgICAgLy8gU2VwYXJhdGUgb3V0IHRoZSBBQzMgc3Vic3RyZWFtIGZyb20gYW4gSERNViBjb21iaW5lZCBUcnVlSEQvQUMzIFBJRAorICAgIGlmIChwZXMtPnN1Yl9zdCAmJiBwZXMtPnN0cmVhbV90eXBlID09IDB4ODMgJiYgcGVzLT5leHRlbmRlZF9zdHJlYW1faWQgPT0gMHg3NikKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBwZXMtPnN1Yl9zdC0+aW5kZXg7CisgICAgZWxzZQorICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHBlcy0+c3QtPmluZGV4OworICAgIHBrdC0+cHRzID0gcGVzLT5wdHM7CisgICAgcGt0LT5kdHMgPSBwZXMtPmR0czsKKyAgICAvKiBzdG9yZSBwb3NpdGlvbiBvZiBmaXJzdCBUUyBwYWNrZXQgb2YgdGhpcyBQRVMgcGFja2V0ICovCisgICAgcGt0LT5wb3MgICA9IHBlcy0+dHNfcGFja2V0X3BvczsKKyAgICBwa3QtPmZsYWdzID0gcGVzLT5mbGFnczsKKworICAgIHBlcy0+YnVmZmVyID0gTlVMTDsKKyAgICByZXNldF9wZXNfcGFja2V0X3N0YXRlKHBlcyk7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBnZXRfdHM2NChHZXRCaXRDb250ZXh0ICpnYiwgaW50IGJpdHMpCit7CisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgYml0cykKKyAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworICAgIHJldHVybiBnZXRfYml0czY0KGdiLCBiaXRzKTsKK30KKworc3RhdGljIGludCByZWFkX3NsX2hlYWRlcihQRVNDb250ZXh0ICpwZXMsIFNMQ29uZmlnRGVzY3IgKnNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBhdV9zdGFydF9mbGFnID0gMCwgYXVfZW5kX2ZsYWcgPSAwLCBvY3JfZmxhZyA9IDAsIGlkbGVfZmxhZyA9IDA7CisgICAgaW50IHBhZGRpbmdfZmxhZyA9IDAsIHBhZGRpbmdfYml0cyA9IDAsIGluc3RfYml0cmF0ZV9mbGFnID0gMDsKKyAgICBpbnQgZHRzX2ZsYWcgPSAtMSwgY3RzX2ZsYWcgPSAtMTsKKyAgICBpbnQ2NF90IGR0cyA9IEFWX05PUFRTX1ZBTFVFLCBjdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICB1aW50OF90IGJ1Zl9wYWRkZWRbMTI4ICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV07CisgICAgaW50IGJ1Zl9wYWRkZWRfc2l6ZSA9IEZGTUlOKGJ1Zl9zaXplLCBzaXplb2YoYnVmX3BhZGRlZCkgLSBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgIG1lbWNweShidWZfcGFkZGVkLCBidWYsIGJ1Zl9wYWRkZWRfc2l6ZSk7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmX3BhZGRlZCwgYnVmX3BhZGRlZF9zaXplICogOCk7CisKKyAgICBpZiAoc2wtPnVzZV9hdV9zdGFydCkKKyAgICAgICAgYXVfc3RhcnRfZmxhZyA9IGdldF9iaXRzMSgmZ2IpOworICAgIGlmIChzbC0+dXNlX2F1X2VuZCkKKyAgICAgICAgYXVfZW5kX2ZsYWcgPSBnZXRfYml0czEoJmdiKTsKKyAgICBpZiAoIXNsLT51c2VfYXVfc3RhcnQgJiYgIXNsLT51c2VfYXVfZW5kKQorICAgICAgICBhdV9zdGFydF9mbGFnID0gYXVfZW5kX2ZsYWcgPSAxOworICAgIGlmIChzbC0+b2NyX2xlbiA+IDApCisgICAgICAgIG9jcl9mbGFnID0gZ2V0X2JpdHMxKCZnYik7CisgICAgaWYgKHNsLT51c2VfaWRsZSkKKyAgICAgICAgaWRsZV9mbGFnID0gZ2V0X2JpdHMxKCZnYik7CisgICAgaWYgKHNsLT51c2VfcGFkZGluZykKKyAgICAgICAgcGFkZGluZ19mbGFnID0gZ2V0X2JpdHMxKCZnYik7CisgICAgaWYgKHBhZGRpbmdfZmxhZykKKyAgICAgICAgcGFkZGluZ19iaXRzID0gZ2V0X2JpdHMoJmdiLCAzKTsKKworICAgIGlmICghaWRsZV9mbGFnICYmICghcGFkZGluZ19mbGFnIHx8IHBhZGRpbmdfYml0cyAhPSAwKSkgeworICAgICAgICBpZiAoc2wtPnBhY2tldF9zZXFfbnVtX2xlbikKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZnYiwgc2wtPnBhY2tldF9zZXFfbnVtX2xlbik7CisgICAgICAgIGlmIChzbC0+ZGVncl9wcmlvcl9sZW4pCisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZnYikpCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZnYiwgc2wtPmRlZ3JfcHJpb3JfbGVuKTsKKyAgICAgICAgaWYgKG9jcl9mbGFnKQorICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCBzbC0+b2NyX2xlbik7CisgICAgICAgIGlmIChhdV9zdGFydF9mbGFnKSB7CisgICAgICAgICAgICBpZiAoc2wtPnVzZV9yYW5kX2FjY19wdCkKKyAgICAgICAgICAgICAgICBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgICAgIGlmIChzbC0+YXVfc2VxX251bV9sZW4gPiAwKQorICAgICAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZnYiwgc2wtPmF1X3NlcV9udW1fbGVuKTsKKyAgICAgICAgICAgIGlmIChzbC0+dXNlX3RpbWVzdGFtcHMpIHsKKyAgICAgICAgICAgICAgICBkdHNfZmxhZyA9IGdldF9iaXRzMSgmZ2IpOworICAgICAgICAgICAgICAgIGN0c19mbGFnID0gZ2V0X2JpdHMxKCZnYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNsLT5pbnN0X2JpdHJhdGVfbGVuKQorICAgICAgICAgICAgaW5zdF9iaXRyYXRlX2ZsYWcgPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgaWYgKGR0c19mbGFnID09IDEpCisgICAgICAgICAgICBkdHMgPSBnZXRfdHM2NCgmZ2IsIHNsLT50aW1lc3RhbXBfbGVuKTsKKyAgICAgICAgaWYgKGN0c19mbGFnID09IDEpCisgICAgICAgICAgICBjdHMgPSBnZXRfdHM2NCgmZ2IsIHNsLT50aW1lc3RhbXBfbGVuKTsKKyAgICAgICAgaWYgKHNsLT5hdV9sZW4gPiAwKQorICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCBzbC0+YXVfbGVuKTsKKyAgICAgICAgaWYgKGluc3RfYml0cmF0ZV9mbGFnKQorICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCBzbC0+aW5zdF9iaXRyYXRlX2xlbik7CisgICAgfQorCisgICAgaWYgKGR0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcGVzLT5kdHMgPSBkdHM7CisgICAgaWYgKGN0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcGVzLT5wdHMgPSBjdHM7CisKKyAgICBpZiAoc2wtPnRpbWVzdGFtcF9sZW4gJiYgc2wtPnRpbWVzdGFtcF9yZXMpCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocGVzLT5zdCwgc2wtPnRpbWVzdGFtcF9sZW4sIDEsIHNsLT50aW1lc3RhbXBfcmVzKTsKKworICAgIHJldHVybiAoZ2V0X2JpdHNfY291bnQoJmdiKSArIDcpID4+IDM7Cit9CisKKy8qIHJldHVybiBub24gemVybyBpZiBhIHBhY2tldCBjb3VsZCBiZSBjb25zdHJ1Y3RlZCAqLworc3RhdGljIGludCBtcGVndHNfcHVzaF9kYXRhKE1wZWdUU0ZpbHRlciAqZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQgaXNfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3MpCit7CisgICAgUEVTQ29udGV4dCAqcGVzICAgPSBmaWx0ZXItPnUucGVzX2ZpbHRlci5vcGFxdWU7CisgICAgTXBlZ1RTQ29udGV4dCAqdHMgPSBwZXMtPnRzOworICAgIGNvbnN0IHVpbnQ4X3QgKnA7CisgICAgaW50IGxlbiwgY29kZTsKKworICAgIGlmICghdHMtPnBrdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoaXNfc3RhcnQpIHsKKyAgICAgICAgaWYgKHBlcy0+c3RhdGUgPT0gTVBFR1RTX1BBWUxPQUQgJiYgcGVzLT5kYXRhX2luZGV4ID4gMCkgeworICAgICAgICAgICAgbmV3X3Blc19wYWNrZXQocGVzLCB0cy0+cGt0KTsKKyAgICAgICAgICAgIHRzLT5zdG9wX3BhcnNlID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc2V0X3Blc19wYWNrZXRfc3RhdGUocGVzKTsKKyAgICAgICAgfQorICAgICAgICBwZXMtPnN0YXRlICAgICAgICAgPSBNUEVHVFNfSEVBREVSOworICAgICAgICBwZXMtPnRzX3BhY2tldF9wb3MgPSBwb3M7CisgICAgfQorICAgIHAgPSBidWY7CisgICAgd2hpbGUgKGJ1Zl9zaXplID4gMCkgeworICAgICAgICBzd2l0Y2ggKHBlcy0+c3RhdGUpIHsKKyAgICAgICAgY2FzZSBNUEVHVFNfSEVBREVSOgorICAgICAgICAgICAgbGVuID0gUEVTX1NUQVJUX1NJWkUgLSBwZXMtPmRhdGFfaW5kZXg7CisgICAgICAgICAgICBpZiAobGVuID4gYnVmX3NpemUpCisgICAgICAgICAgICAgICAgbGVuID0gYnVmX3NpemU7CisgICAgICAgICAgICBtZW1jcHkocGVzLT5oZWFkZXIgKyBwZXMtPmRhdGFfaW5kZXgsIHAsIGxlbik7CisgICAgICAgICAgICBwZXMtPmRhdGFfaW5kZXggKz0gbGVuOworICAgICAgICAgICAgcCArPSBsZW47CisgICAgICAgICAgICBidWZfc2l6ZSAtPSBsZW47CisgICAgICAgICAgICBpZiAocGVzLT5kYXRhX2luZGV4ID09IFBFU19TVEFSVF9TSVpFKSB7CisgICAgICAgICAgICAgICAgLyogd2UgZ290IGFsbCB0aGUgUEVTIG9yIHNlY3Rpb24gaGVhZGVyLiBXZSBjYW4gbm93CisgICAgICAgICAgICAgICAgICogZGVjaWRlICovCisgICAgICAgICAgICAgICAgaWYgKHBlcy0+aGVhZGVyWzBdID09IDB4MDAgJiYgcGVzLT5oZWFkZXJbMV0gPT0gMHgwMCAmJgorICAgICAgICAgICAgICAgICAgICBwZXMtPmhlYWRlclsyXSA9PSAweDAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGl0IG11c3QgYmUgYW4gbXBlZzIgUEVTIHN0cmVhbSAqLworICAgICAgICAgICAgICAgICAgICBjb2RlID0gcGVzLT5oZWFkZXJbM10gfCAweDEwMDsKKyAgICAgICAgICAgICAgICAgICAgYXZfZGxvZyhwZXMtPnN0cmVhbSwgInBpZD0leCBwZXNfY29kZT0lI3hcbiIsIHBlcy0+cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUpOworCisgICAgICAgICAgICAgICAgICAgIGlmICgocGVzLT5zdCAmJiBwZXMtPnN0LT5kaXNjYXJkID09IEFWRElTQ0FSRF9BTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoIXBlcy0+c3ViX3N0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcy0+c3ViX3N0LT5kaXNjYXJkID09IEFWRElTQ0FSRF9BTEwpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9PSAweDFiZSkgLyogcGFkZGluZ19zdHJlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKKworICAgICAgICAgICAgICAgICAgICAvKiBzdHJlYW0gbm90IHByZXNlbnQgaW4gUE1UICovCisgICAgICAgICAgICAgICAgICAgIGlmICghcGVzLT5zdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzLT5za2lwX2NoYW5nZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOworCisgICAgICAgICAgICAgICAgICAgICAgICBwZXMtPnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbSh0cy0+c3RyZWFtLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGVzLT5zdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICAgICAgcGVzLT5zdC0+aWQgPSBwZXMtPnBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wZWd0c19zZXRfc3RyZWFtX2luZm8ocGVzLT5zdCwgcGVzLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBlcy0+dG90YWxfc2l6ZSA9IEFWX1JCMTYocGVzLT5oZWFkZXIgKyA0KTsKKyAgICAgICAgICAgICAgICAgICAgLyogTk9URTogYSB6ZXJvIHRvdGFsIHNpemUgbWVhbnMgdGhlIFBFUyBzaXplIGlzCisgICAgICAgICAgICAgICAgICAgICAqIHVuYm91bmRlZCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIXBlcy0+dG90YWxfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcy0+dG90YWxfc2l6ZSA9IE1BWF9QRVNfUEFZTE9BRDsKKworICAgICAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBwZXMgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIHBlcy0+YnVmZmVyID0gYXZfYnVmZmVyX2FsbG9jKHBlcy0+dG90YWxfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBlcy0+YnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSAweDFiYyAmJiBjb2RlICE9IDB4MWJmICYmIC8qIHByb2dyYW1fc3RyZWFtX21hcCwgcHJpdmF0ZV9zdHJlYW1fMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAhPSAweDFmMCAmJiBjb2RlICE9IDB4MWYxICYmIC8qIEVDTSwgRU1NICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlICE9IDB4MWZmICYmIGNvZGUgIT0gMHgxZjIgJiYgLyogcHJvZ3JhbV9zdHJlYW1fZGlyZWN0b3J5LCBEU01DQ19zdHJlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgIT0gMHgxZjgpIHsgICAgICAgICAgICAgICAgICAvKiBJVFUtVCBSZWMuIEguMjIyLjEgdHlwZSBFIHN0cmVhbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcGVzLT5zdGF0ZSA9IE1QRUdUU19QRVNIRUFERVI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVzLT5zdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUgJiYgIXBlcy0+c3QtPnJlcXVlc3RfcHJvYmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKHBlcy0+c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpZD0leCBzdHJlYW1fdHlwZT0leCBwcm9iaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVzLT5waWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXMtPnN0cmVhbV90eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXMtPnN0LT5yZXF1ZXN0X3Byb2JlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcy0+c3RhdGUgICAgICA9IE1QRUdUU19QQVlMT0FEOworICAgICAgICAgICAgICAgICAgICAgICAgcGVzLT5kYXRhX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSwgaXQgc2hvdWxkIGJlIGEgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBwYWNrZXQgKi8KK3NraXA6CisgICAgICAgICAgICAgICAgICAgIHBlcy0+c3RhdGUgPSBNUEVHVFNfU0tJUDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBQRVMgcGFja2luZyBwYXJzaW5nICovCisgICAgICAgIGNhc2UgTVBFR1RTX1BFU0hFQURFUjoKKyAgICAgICAgICAgIGxlbiA9IFBFU19IRUFERVJfU0laRSAtIHBlcy0+ZGF0YV9pbmRleDsKKyAgICAgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaWYgKGxlbiA+IGJ1Zl9zaXplKQorICAgICAgICAgICAgICAgIGxlbiA9IGJ1Zl9zaXplOworICAgICAgICAgICAgbWVtY3B5KHBlcy0+aGVhZGVyICsgcGVzLT5kYXRhX2luZGV4LCBwLCBsZW4pOworICAgICAgICAgICAgcGVzLT5kYXRhX2luZGV4ICs9IGxlbjsKKyAgICAgICAgICAgIHAgKz0gbGVuOworICAgICAgICAgICAgYnVmX3NpemUgLT0gbGVuOworICAgICAgICAgICAgaWYgKHBlcy0+ZGF0YV9pbmRleCA9PSBQRVNfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBwZXMtPnBlc19oZWFkZXJfc2l6ZSA9IHBlcy0+aGVhZGVyWzhdICsgOTsKKyAgICAgICAgICAgICAgICBwZXMtPnN0YXRlICAgICAgICAgICA9IE1QRUdUU19QRVNIRUFERVJfRklMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1QRUdUU19QRVNIRUFERVJfRklMTDoKKyAgICAgICAgICAgIGxlbiA9IHBlcy0+cGVzX2hlYWRlcl9zaXplIC0gcGVzLT5kYXRhX2luZGV4OworICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAobGVuID4gYnVmX3NpemUpCisgICAgICAgICAgICAgICAgbGVuID0gYnVmX3NpemU7CisgICAgICAgICAgICBtZW1jcHkocGVzLT5oZWFkZXIgKyBwZXMtPmRhdGFfaW5kZXgsIHAsIGxlbik7CisgICAgICAgICAgICBwZXMtPmRhdGFfaW5kZXggKz0gbGVuOworICAgICAgICAgICAgcCArPSBsZW47CisgICAgICAgICAgICBidWZfc2l6ZSAtPSBsZW47CisgICAgICAgICAgICBpZiAocGVzLT5kYXRhX2luZGV4ID09IHBlcy0+cGVzX2hlYWRlcl9zaXplKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcjsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHBlc19leHQsIHNraXA7CisKKyAgICAgICAgICAgICAgICBmbGFncyA9IHBlcy0+aGVhZGVyWzddOworICAgICAgICAgICAgICAgIHIgPSBwZXMtPmhlYWRlciArIDk7CisgICAgICAgICAgICAgICAgcGVzLT5wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgICAgICAgICBwZXMtPmR0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAweGMwKSA9PSAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcy0+ZHRzID0gcGVzLT5wdHMgPSBmZl9wYXJzZV9wZXNfcHRzKHIpOworICAgICAgICAgICAgICAgICAgICByICs9IDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiAweGMwKSA9PSAweGMwKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcy0+cHRzID0gZmZfcGFyc2VfcGVzX3B0cyhyKTsKKyAgICAgICAgICAgICAgICAgICAgciArPSA1OworICAgICAgICAgICAgICAgICAgICBwZXMtPmR0cyA9IGZmX3BhcnNlX3Blc19wdHMocik7CisgICAgICAgICAgICAgICAgICAgIHIgKz0gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVzLT5leHRlbmRlZF9zdHJlYW1faWQgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDAxKSB7IC8qIFBFUyBleHRlbnNpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgcGVzX2V4dCA9ICpyKys7CisgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgUEVTIHByaXZhdGUgZGF0YSwgcHJvZ3JhbSBwYWNrZXQgc2VxdWVuY2UgY291bnRlciBhbmQgUC1TVEQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIHNraXAgID0gKHBlc19leHQgPj4gNCkgJiAweGI7CisgICAgICAgICAgICAgICAgICAgIHNraXAgKz0gc2tpcCAmIDB4OTsKKyAgICAgICAgICAgICAgICAgICAgciAgICArPSBza2lwOworICAgICAgICAgICAgICAgICAgICBpZiAoKHBlc19leHQgJiAweDQxKSA9PSAweDAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICAociArIDIpIDw9IChwZXMtPmhlYWRlciArIHBlcy0+cGVzX2hlYWRlcl9zaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogUEVTIGV4dGVuc2lvbiAyICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJbMF0gJiAweDdmKSA+IDAgJiYgKHJbMV0gJiAweDgwKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcy0+ZXh0ZW5kZWRfc3RyZWFtX2lkID0gclsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHdlIGdvdCB0aGUgZnVsbCBoZWFkZXIuIFdlIHBhcnNlIGl0IGFuZCBnZXQgdGhlIHBheWxvYWQgKi8KKyAgICAgICAgICAgICAgICBwZXMtPnN0YXRlID0gTVBFR1RTX1BBWUxPQUQ7CisgICAgICAgICAgICAgICAgcGVzLT5kYXRhX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAocGVzLT5zdHJlYW1fdHlwZSA9PSAweDEyICYmIGJ1Zl9zaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2xfaGVhZGVyX2J5dGVzID0gcmVhZF9zbF9oZWFkZXIocGVzLCAmcGVzLT5zbCwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcGVzLT5wZXNfaGVhZGVyX3NpemUgKz0gc2xfaGVhZGVyX2J5dGVzOworICAgICAgICAgICAgICAgICAgICBwICs9IHNsX2hlYWRlcl9ieXRlczsKKyAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUgLT0gc2xfaGVhZGVyX2J5dGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGVzLT5zdHJlYW1fdHlwZSA9PSAweDE1ICYmIGJ1Zl9zaXplID49IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBtZXRhZGF0YSBhY2Nlc3MgdW5pdCBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgcGVzLT5wZXNfaGVhZGVyX3NpemUgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgcCArPSA1OworICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSAtPSA1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGVzLT50cy0+Zml4X3RlbGV0ZXh0X3B0cyAmJiBwZXMtPnN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1RFTEVURVhUKSB7CisgICAgICAgICAgICAgICAgICAgIEFWUHJvZ3JhbSAqcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocCA9IGF2X2ZpbmRfcHJvZ3JhbV9mcm9tX3N0cmVhbShwZXMtPnN0cmVhbSwgcCwgcGVzLT5zdC0+aW5kZXgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAtPnBjcl9waWQgIT0gLTEgJiYgcC0+ZGlzY2FyZCAhPSBBVkRJU0NBUkRfQUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXBlZ1RTRmlsdGVyICpmID0gcGVzLT50cy0+cGlkc1twLT5wY3JfcGlkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi0+dHlwZSA9PSBNUEVHVFNfUEVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRVNDb250ZXh0ICpwY3JwZXMgPSBmLT51LnBlc19maWx0ZXIub3BhcXVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBjcnBlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdCA9IHBjcnBlcy0+c3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZi0+dHlwZSA9PSBNUEVHVFNfUENSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwLT5uYl9zdHJlYW1faW5kZXhlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnBzdCA9IHBlcy0+c3RyZWFtLT5zdHJlYW1zW3AtPnN0cmVhbV9pbmRleFtpXV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdCA9IHBzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi0+bGFzdF9wY3IgIT0gLTEgJiYgc3QgJiYgc3QtPmRpc2NhcmQgIT0gQVZESVNDQVJEX0FMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsZXRleHQgcGFja2V0cyBkbyBub3QgYWx3YXlzIGhhdmUgY29ycmVjdCB0aW1lc3RhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YW5kYXJkIHNheXMgdGhleSBzaG91bGQgYmUgaGFuZGxlZCBhZnRlciA0MC42IG1zIGF0IG1vc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIHBjciBlcnJvciB0byB0aGlzIHBhY2tldCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuIDEwMCBtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBpbnRlcnBvbGF0ZSB0aGUgUENSLCBub3QganVzdCB1c2UgdGhlIGxhc3Qgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBjciA9IGYtPmxhc3RfcGNyIC8gMzAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVzLT5zdC0+cHRzX3dyYXBfcmVmZXJlbmNlID0gc3QtPnB0c193cmFwX3JlZmVyZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcy0+c3QtPnB0c193cmFwX2JlaGF2aW9yID0gc3QtPnB0c193cmFwX2JlaGF2aW9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlcy0+ZHRzID09IEFWX05PUFRTX1ZBTFVFIHx8IHBlcy0+ZHRzIDwgcGNyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVzLT5wdHMgPSBwZXMtPmR0cyA9IHBjcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVzLT5kdHMgPiBwY3IgKyAzNjU0ICsgOTAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcy0+cHRzID0gcGVzLT5kdHMgPSBwY3IgKyAzNjU0ICsgOTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVBFR1RTX1BBWUxPQUQ6CisgICAgICAgICAgICBpZiAocGVzLT5idWZmZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAocGVzLT5kYXRhX2luZGV4ID4gMCAmJgorICAgICAgICAgICAgICAgICAgICBwZXMtPmRhdGFfaW5kZXggKyBidWZfc2l6ZSA+IHBlcy0+dG90YWxfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBuZXdfcGVzX3BhY2tldChwZXMsIHRzLT5wa3QpOworICAgICAgICAgICAgICAgICAgICBwZXMtPnRvdGFsX3NpemUgPSBNQVhfUEVTX1BBWUxPQUQ7CisgICAgICAgICAgICAgICAgICAgIHBlcy0+YnVmZmVyID0gYXZfYnVmZmVyX2FsbG9jKHBlcy0+dG90YWxfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBlcy0+YnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgdHMtPnN0b3BfcGFyc2UgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVzLT5kYXRhX2luZGV4ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplID4gcGVzLT50b3RhbF9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHBlcyBwYWNrZXQgc2l6ZSBpcyA8IHRzIHNpemUgcGFja2V0IGFuZCBwZXMgZGF0YSBpcyBwYWRkZWQgd2l0aCAweGZmCisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgbGVnYWwgaW4gdHMgYnV0IHNlZSBpc3N1ZSAjMjM5MgorICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSA9IHBlcy0+dG90YWxfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KHBlcy0+YnVmZmVyLT5kYXRhICsgcGVzLT5kYXRhX2luZGV4LCBwLCBidWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgcGVzLT5kYXRhX2luZGV4ICs9IGJ1Zl9zaXplOworICAgICAgICAgICAgICAgIC8qIGVtaXQgY29tcGxldGUgcGFja2V0cyB3aXRoIGtub3duIHBhY2tldCBzaXplCisgICAgICAgICAgICAgICAgICogZGVjcmVhc2VzIGRlbXV4ZXIgZGVsYXkgZm9yIGluZnJlcXVlbnQgcGFja2V0cyBsaWtlIHN1YnRpdGxlcyBmcm9tCisgICAgICAgICAgICAgICAgICogYSBjb3VwbGUgb2Ygc2Vjb25kcyB0byBtaWxsaXNlY29uZHMgZm9yIHByb3Blcmx5IG11eGVkIGZpbGVzLgorICAgICAgICAgICAgICAgICAqIHRvdGFsX3NpemUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBmb2xsb3dpbmcgcGVzX3BhY2tldF9sZW5ndGgKKyAgICAgICAgICAgICAgICAgKiBpbiB0aGUgcGVzIGhlYWRlciwgaS5lLiBub3QgY291bnRpbmcgdGhlIGZpcnN0IFBFU19TVEFSVF9TSVpFIGJ5dGVzICovCisgICAgICAgICAgICAgICAgaWYgKCF0cy0+c3RvcF9wYXJzZSAmJiBwZXMtPnRvdGFsX3NpemUgPCBNQVhfUEVTX1BBWUxPQUQgJiYKKyAgICAgICAgICAgICAgICAgICAgcGVzLT5wZXNfaGVhZGVyX3NpemUgKyBwZXMtPmRhdGFfaW5kZXggPT0gcGVzLT50b3RhbF9zaXplICsgUEVTX1NUQVJUX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHMtPnN0b3BfcGFyc2UgPSAxOworICAgICAgICAgICAgICAgICAgICBuZXdfcGVzX3BhY2tldChwZXMsIHRzLT5wa3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zl9zaXplID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1QRUdUU19TS0lQOgorICAgICAgICAgICAgYnVmX3NpemUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFBFU0NvbnRleHQgKmFkZF9wZXNfc3RyZWFtKE1wZWdUU0NvbnRleHQgKnRzLCBpbnQgcGlkLCBpbnQgcGNyX3BpZCkKK3sKKyAgICBNcGVnVFNGaWx0ZXIgKnRzczsKKyAgICBQRVNDb250ZXh0ICpwZXM7CisKKyAgICAvKiBpZiBubyBwaWQgZm91bmQsIHRoZW4gYWRkIGEgcGlkIGNvbnRleHQgKi8KKyAgICBwZXMgPSBhdl9tYWxsb2N6KHNpemVvZihQRVNDb250ZXh0KSk7CisgICAgaWYgKCFwZXMpCisgICAgICAgIHJldHVybiAwOworICAgIHBlcy0+dHMgICAgICA9IHRzOworICAgIHBlcy0+c3RyZWFtICA9IHRzLT5zdHJlYW07CisgICAgcGVzLT5waWQgICAgID0gcGlkOworICAgIHBlcy0+cGNyX3BpZCA9IHBjcl9waWQ7CisgICAgcGVzLT5zdGF0ZSAgID0gTVBFR1RTX1NLSVA7CisgICAgcGVzLT5wdHMgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgcGVzLT5kdHMgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgdHNzICAgICAgICAgID0gbXBlZ3RzX29wZW5fcGVzX2ZpbHRlcih0cywgcGlkLCBtcGVndHNfcHVzaF9kYXRhLCBwZXMpOworICAgIGlmICghdHNzKSB7CisgICAgICAgIGF2X2ZyZWUocGVzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBwZXM7Cit9CisKKyNkZWZpbmUgTUFYX0xFVkVMIDQKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkZvcm1hdENvbnRleHQgKnM7CisgICAgQVZJT0NvbnRleHQgcGI7CisgICAgTXA0RGVzY3IgKmRlc2NyOworICAgIE1wNERlc2NyICphY3RpdmVfZGVzY3I7CisgICAgaW50IGRlc2NyX2NvdW50OworICAgIGludCBtYXhfZGVzY3JfY291bnQ7CisgICAgaW50IGxldmVsOworICAgIGludCBwcmVkZWZpbmVkX1NMQ29uZmlnRGVzY3JpcHRvcl9zZWVuOworfSBNUDREZXNjclBhcnNlQ29udGV4dDsKKworc3RhdGljIGludCBpbml0X01QNERlc2NyUGFyc2VDb250ZXh0KE1QNERlc2NyUGFyc2VDb250ZXh0ICpkLCBBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCB1bnNpZ25lZCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1wNERlc2NyICpkZXNjciwgaW50IG1heF9kZXNjcl9jb3VudCkKK3sKKyAgICBpbnQgcmV0OworICAgIGlmIChzaXplID4gKDEgPDwgMzApKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICgocmV0ID0gZmZpb19pbml0X2NvbnRleHQoJmQtPnBiLCAodW5zaWduZWQgY2hhciAqKWJ1Ziwgc2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBkLT5zICAgICAgICAgICAgICAgPSBzOworICAgIGQtPmxldmVsICAgICAgICAgICA9IDA7CisgICAgZC0+ZGVzY3JfY291bnQgICAgID0gMDsKKyAgICBkLT5kZXNjciAgICAgICAgICAgPSBkZXNjcjsKKyAgICBkLT5hY3RpdmVfZGVzY3IgICAgPSBOVUxMOworICAgIGQtPm1heF9kZXNjcl9jb3VudCA9IG1heF9kZXNjcl9jb3VudDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfb2Zmc2V0cyhBVklPQ29udGV4dCAqcGIsIGludDY0X3QgKm9mZiwgaW50ICpsZW4pCit7CisgICAgaW50NjRfdCBuZXdfb2ZmID0gYXZpb190ZWxsKHBiKTsKKyAgICAoKmxlbikgLT0gbmV3X29mZiAtICpvZmY7CisgICAgKm9mZiAgICA9IG5ld19vZmY7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbXA0X2Rlc2NyKE1QNERlc2NyUGFyc2VDb250ZXh0ICpkLCBpbnQ2NF90IG9mZiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRfdGFnKTsKKworc3RhdGljIGludCBwYXJzZV9tcDRfZGVzY3JfYXJyKE1QNERlc2NyUGFyc2VDb250ZXh0ICpkLCBpbnQ2NF90IG9mZiwgaW50IGxlbikKK3sKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBpbnQgcmV0ID0gcGFyc2VfbXA0X2Rlc2NyKGQsIG9mZiwgbGVuLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB1cGRhdGVfb2Zmc2V0cygmZC0+cGIsICZvZmYsICZsZW4pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9NUDRJT0Rlc2NyVGFnKE1QNERlc2NyUGFyc2VDb250ZXh0ICpkLCBpbnQ2NF90IG9mZiwgaW50IGxlbikKK3sKKyAgICBhdmlvX3JiMTYoJmQtPnBiKTsgLy8gSUQKKyAgICBhdmlvX3I4KCZkLT5wYik7CisgICAgYXZpb19yOCgmZC0+cGIpOworICAgIGF2aW9fcjgoJmQtPnBiKTsKKyAgICBhdmlvX3I4KCZkLT5wYik7CisgICAgYXZpb19yOCgmZC0+cGIpOworICAgIHVwZGF0ZV9vZmZzZXRzKCZkLT5wYiwgJm9mZiwgJmxlbik7CisgICAgcmV0dXJuIHBhcnNlX21wNF9kZXNjcl9hcnIoZCwgb2ZmLCBsZW4pOworfQorCitzdGF0aWMgaW50IHBhcnNlX01QNE9EZXNjclRhZyhNUDREZXNjclBhcnNlQ29udGV4dCAqZCwgaW50NjRfdCBvZmYsIGludCBsZW4pCit7CisgICAgaW50IGlkX2ZsYWdzOworICAgIGlmIChsZW4gPCAyKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZF9mbGFncyA9IGF2aW9fcmIxNigmZC0+cGIpOworICAgIGlmICghKGlkX2ZsYWdzICYgMHgwMDIwKSkgeyAvLyBVUkxfRmxhZworICAgICAgICB1cGRhdGVfb2Zmc2V0cygmZC0+cGIsICZvZmYsICZsZW4pOworICAgICAgICByZXR1cm4gcGFyc2VfbXA0X2Rlc2NyX2FycihkLCBvZmYsIGxlbik7IC8vIEVTX0Rlc2NyaXB0b3JbXQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCBwYXJzZV9NUDRFU0Rlc2NyVGFnKE1QNERlc2NyUGFyc2VDb250ZXh0ICpkLCBpbnQ2NF90IG9mZiwgaW50IGxlbikKK3sKKyAgICBpbnQgZXNfaWQgPSAwOworICAgIGlmIChkLT5kZXNjcl9jb3VudCA+PSBkLT5tYXhfZGVzY3JfY291bnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGZmX21wNF9wYXJzZV9lc19kZXNjcigmZC0+cGIsICZlc19pZCk7CisgICAgZC0+YWN0aXZlX2Rlc2NyID0gZC0+ZGVzY3IgKyAoZC0+ZGVzY3JfY291bnQrKyk7CisKKyAgICBkLT5hY3RpdmVfZGVzY3ItPmVzX2lkID0gZXNfaWQ7CisgICAgdXBkYXRlX29mZnNldHMoJmQtPnBiLCAmb2ZmLCAmbGVuKTsKKyAgICBwYXJzZV9tcDRfZGVzY3IoZCwgb2ZmLCBsZW4sIE1QNERlY0NvbmZpZ0Rlc2NyVGFnKTsKKyAgICB1cGRhdGVfb2Zmc2V0cygmZC0+cGIsICZvZmYsICZsZW4pOworICAgIGlmIChsZW4gPiAwKQorICAgICAgICBwYXJzZV9tcDRfZGVzY3IoZCwgb2ZmLCBsZW4sIE1QNFNMRGVzY3JUYWcpOworICAgIGQtPmFjdGl2ZV9kZXNjciA9IE5VTEw7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfTVA0RGVjQ29uZmlnRGVzY3JUYWcoTVA0RGVzY3JQYXJzZUNvbnRleHQgKmQsIGludDY0X3Qgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIE1wNERlc2NyICpkZXNjciA9IGQtPmFjdGl2ZV9kZXNjcjsKKyAgICBpZiAoIWRlc2NyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBkLT5hY3RpdmVfZGVzY3ItPmRlY19jb25maWdfZGVzY3IgPSBhdl9tYWxsb2MobGVuKTsKKyAgICBpZiAoIWRlc2NyLT5kZWNfY29uZmlnX2Rlc2NyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGRlc2NyLT5kZWNfY29uZmlnX2Rlc2NyX2xlbiA9IGxlbjsKKyAgICBhdmlvX3JlYWQoJmQtPnBiLCBkZXNjci0+ZGVjX2NvbmZpZ19kZXNjciwgbGVuKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9NUDRTTERlc2NyVGFnKE1QNERlc2NyUGFyc2VDb250ZXh0ICpkLCBpbnQ2NF90IG9mZiwgaW50IGxlbikKK3sKKyAgICBNcDREZXNjciAqZGVzY3IgPSBkLT5hY3RpdmVfZGVzY3I7CisgICAgaW50IHByZWRlZmluZWQ7CisgICAgaWYgKCFkZXNjcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBwcmVkZWZpbmVkID0gYXZpb19yOCgmZC0+cGIpOworICAgIGlmICghcHJlZGVmaW5lZCkgeworICAgICAgICBpbnQgbGVuZ3RoczsKKyAgICAgICAgaW50IGZsYWdzID0gYXZpb19yOCgmZC0+cGIpOworICAgICAgICBkZXNjci0+c2wudXNlX2F1X3N0YXJ0ICAgID0gISEoZmxhZ3MgJiAweDgwKTsKKyAgICAgICAgZGVzY3ItPnNsLnVzZV9hdV9lbmQgICAgICA9ICEhKGZsYWdzICYgMHg0MCk7CisgICAgICAgIGRlc2NyLT5zbC51c2VfcmFuZF9hY2NfcHQgPSAhIShmbGFncyAmIDB4MjApOworICAgICAgICBkZXNjci0+c2wudXNlX3BhZGRpbmcgICAgID0gISEoZmxhZ3MgJiAweDA4KTsKKyAgICAgICAgZGVzY3ItPnNsLnVzZV90aW1lc3RhbXBzICA9ICEhKGZsYWdzICYgMHgwNCk7CisgICAgICAgIGRlc2NyLT5zbC51c2VfaWRsZSAgICAgICAgPSAhIShmbGFncyAmIDB4MDIpOworICAgICAgICBkZXNjci0+c2wudGltZXN0YW1wX3JlcyAgID0gYXZpb19yYjMyKCZkLT5wYik7CisgICAgICAgIGF2aW9fcmIzMigmZC0+cGIpOworICAgICAgICBkZXNjci0+c2wudGltZXN0YW1wX2xlbiAgICAgID0gYXZpb19yOCgmZC0+cGIpOworICAgICAgICBpZiAoZGVzY3ItPnNsLnRpbWVzdGFtcF9sZW4gPiA2NCkgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKE5VTEwsICJ0aW1lc3RhbXBfbGVuID4gNjQiKTsKKyAgICAgICAgICAgIGRlc2NyLT5zbC50aW1lc3RhbXBfbGVuID0gNjQ7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICAgICAgZGVzY3ItPnNsLm9jcl9sZW4gICAgICAgICAgICA9IGF2aW9fcjgoJmQtPnBiKTsKKyAgICAgICAgZGVzY3ItPnNsLmF1X2xlbiAgICAgICAgICAgICA9IGF2aW9fcjgoJmQtPnBiKTsKKyAgICAgICAgZGVzY3ItPnNsLmluc3RfYml0cmF0ZV9sZW4gICA9IGF2aW9fcjgoJmQtPnBiKTsKKyAgICAgICAgbGVuZ3RocyAgICAgICAgICAgICAgICAgICAgICA9IGF2aW9fcmIxNigmZC0+cGIpOworICAgICAgICBkZXNjci0+c2wuZGVncl9wcmlvcl9sZW4gICAgID0gbGVuZ3RocyA+PiAxMjsKKyAgICAgICAgZGVzY3ItPnNsLmF1X3NlcV9udW1fbGVuICAgICA9IChsZW5ndGhzID4+IDcpICYgMHgxZjsKKyAgICAgICAgZGVzY3ItPnNsLnBhY2tldF9zZXFfbnVtX2xlbiA9IChsZW5ndGhzID4+IDIpICYgMHgxZjsKKyAgICB9IGVsc2UgaWYgKCFkLT5wcmVkZWZpbmVkX1NMQ29uZmlnRGVzY3JpcHRvcl9zZWVuKXsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoZC0+cywgIlByZWRlZmluZWQgU0xDb25maWdEZXNjcmlwdG9yIik7CisgICAgICAgIGQtPnByZWRlZmluZWRfU0xDb25maWdEZXNjcmlwdG9yX3NlZW4gPSAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9tcDRfZGVzY3IoTVA0RGVzY3JQYXJzZUNvbnRleHQgKmQsIGludDY0X3Qgb2ZmLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldF90YWcpCit7CisgICAgaW50IHRhZzsKKyAgICBpbnQgbGVuMSA9IGZmX21wNF9yZWFkX2Rlc2NyKGQtPnMsICZkLT5wYiwgJnRhZyk7CisgICAgdXBkYXRlX29mZnNldHMoJmQtPnBiLCAmb2ZmLCAmbGVuKTsKKyAgICBpZiAobGVuIDwgMCB8fCBsZW4xID4gbGVuIHx8IGxlbjEgPD0gMCkgeworICAgICAgICBhdl9sb2coZC0+cywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRhZyAleCBsZW5ndGggdmlvbGF0aW9uIG5ldyBsZW5ndGggJWQgYnl0ZXMgcmVtYWluaW5nICVkXG4iLAorICAgICAgICAgICAgICAgdGFnLCBsZW4xLCBsZW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoZC0+bGV2ZWwrKyA+PSBNQVhfTEVWRUwpIHsKKyAgICAgICAgYXZfbG9nKGQtPnMsIEFWX0xPR19FUlJPUiwgIk1heGltdW0gTVA0IGRlc2NyaXB0b3IgbGV2ZWwgZXhjZWVkZWRcbiIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKHRhcmdldF90YWcgJiYgdGFnICE9IHRhcmdldF90YWcpIHsKKyAgICAgICAgYXZfbG9nKGQtPnMsIEFWX0xPR19FUlJPUiwgIkZvdW5kIHRhZyAleCBleHBlY3RlZCAleFxuIiwgdGFnLAorICAgICAgICAgICAgICAgdGFyZ2V0X3RhZyk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRhZykgeworICAgIGNhc2UgTVA0SU9EZXNjclRhZzoKKyAgICAgICAgcGFyc2VfTVA0SU9EZXNjclRhZyhkLCBvZmYsIGxlbjEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1QNE9EZXNjclRhZzoKKyAgICAgICAgcGFyc2VfTVA0T0Rlc2NyVGFnKGQsIG9mZiwgbGVuMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVA0RVNEZXNjclRhZzoKKyAgICAgICAgcGFyc2VfTVA0RVNEZXNjclRhZyhkLCBvZmYsIGxlbjEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1QNERlY0NvbmZpZ0Rlc2NyVGFnOgorICAgICAgICBwYXJzZV9NUDREZWNDb25maWdEZXNjclRhZyhkLCBvZmYsIGxlbjEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1QNFNMRGVzY3JUYWc6CisgICAgICAgIHBhcnNlX01QNFNMRGVzY3JUYWcoZCwgb2ZmLCBsZW4xKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisKK2RvbmU6CisgICAgZC0+bGV2ZWwtLTsKKyAgICBhdmlvX3NlZWsoJmQtPnBiLCBvZmYgKyBsZW4xLCBTRUVLX1NFVCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXA0X3JlYWRfaW9kcyhBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNcDREZXNjciAqZGVzY3IsIGludCAqZGVzY3JfY291bnQsIGludCBtYXhfZGVzY3JfY291bnQpCit7CisgICAgTVA0RGVzY3JQYXJzZUNvbnRleHQgZDsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gaW5pdF9NUDREZXNjclBhcnNlQ29udGV4dCgmZCwgcywgYnVmLCBzaXplLCBkZXNjciwgbWF4X2Rlc2NyX2NvdW50KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IHBhcnNlX21wNF9kZXNjcigmZCwgYXZpb190ZWxsKCZkLnBiKSwgc2l6ZSwgTVA0SU9EZXNjclRhZyk7CisKKyAgICAqZGVzY3JfY291bnQgPSBkLmRlc2NyX2NvdW50OworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXA0X3JlYWRfb2QoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIE1wNERlc2NyICpkZXNjciwgaW50ICpkZXNjcl9jb3VudCwgaW50IG1heF9kZXNjcl9jb3VudCkKK3sKKyAgICBNUDREZXNjclBhcnNlQ29udGV4dCBkOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBpbml0X01QNERlc2NyUGFyc2VDb250ZXh0KCZkLCBzLCBidWYsIHNpemUsIGRlc2NyLCBtYXhfZGVzY3JfY291bnQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gcGFyc2VfbXA0X2Rlc2NyX2FycigmZCwgYXZpb190ZWxsKCZkLnBiKSwgc2l6ZSk7CisKKyAgICAqZGVzY3JfY291bnQgPSBkLmRlc2NyX2NvdW50OworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG00c2xfY2IoTXBlZ1RTRmlsdGVyICpmaWx0ZXIsIGNvbnN0IHVpbnQ4X3QgKnNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIGludCBzZWN0aW9uX2xlbikKK3sKKyAgICBNcGVnVFNDb250ZXh0ICp0cyA9IGZpbHRlci0+dS5zZWN0aW9uX2ZpbHRlci5vcGFxdWU7CisgICAgU2VjdGlvbkhlYWRlciBoOworICAgIGNvbnN0IHVpbnQ4X3QgKnAsICpwX2VuZDsKKyAgICBBVklPQ29udGV4dCBwYjsKKyAgICBpbnQgbXA0X2Rlc2NyX2NvdW50ID0gMDsKKyAgICBNcDREZXNjciBtcDRfZGVzY3JbTUFYX01QNF9ERVNDUl9DT1VOVF0gPSB7IHsgMCB9IH07CisgICAgaW50IGksIHBpZDsKKyAgICBBVkZvcm1hdENvbnRleHQgKnMgPSB0cy0+c3RyZWFtOworCisgICAgcF9lbmQgPSBzZWN0aW9uICsgc2VjdGlvbl9sZW4gLSA0OworICAgIHAgPSBzZWN0aW9uOworICAgIGlmIChwYXJzZV9zZWN0aW9uX2hlYWRlcigmaCwgJnAsIHBfZW5kKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoaC50aWQgIT0gTTRPRF9USUQpCisgICAgICAgIHJldHVybjsKKworICAgIG1wNF9yZWFkX29kKHMsIHAsICh1bnNpZ25lZCkgKHBfZW5kIC0gcCksIG1wNF9kZXNjciwgJm1wNF9kZXNjcl9jb3VudCwKKyAgICAgICAgICAgICAgICBNQVhfTVA0X0RFU0NSX0NPVU5UKTsKKworICAgIGZvciAocGlkID0gMDsgcGlkIDwgTkJfUElEX01BWDsgcGlkKyspIHsKKyAgICAgICAgaWYgKCF0cy0+cGlkc1twaWRdKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtcDRfZGVzY3JfY291bnQ7IGkrKykgeworICAgICAgICAgICAgUEVTQ29udGV4dCAqcGVzOworICAgICAgICAgICAgQVZTdHJlYW0gKnN0OworICAgICAgICAgICAgaWYgKHRzLT5waWRzW3BpZF0tPmVzX2lkICE9IG1wNF9kZXNjcltpXS5lc19pZCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICh0cy0+cGlkc1twaWRdLT50eXBlICE9IE1QRUdUU19QRVMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicGlkICV4IGlzIG5vdCBQRVNcbiIsIHBpZCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZXMgPSB0cy0+cGlkc1twaWRdLT51LnBlc19maWx0ZXIub3BhcXVlOworICAgICAgICAgICAgc3QgID0gcGVzLT5zdDsKKyAgICAgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHBlcy0+c2wgPSBtcDRfZGVzY3JbaV0uc2w7CisKKyAgICAgICAgICAgIGZmaW9faW5pdF9jb250ZXh0KCZwYiwgbXA0X2Rlc2NyW2ldLmRlY19jb25maWdfZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRfZGVzY3JbaV0uZGVjX2NvbmZpZ19kZXNjcl9sZW4sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGZmX21wNF9yZWFkX2RlY19jb25maWdfZGVzY3Iocywgc3QsICZwYik7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID4gMCkKKyAgICAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gMDsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgJiYKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID4gMCkKKyAgICAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gMDsKKworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPD0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA8IEFWX0NPREVDX0lEX0ZJUlNUX0FVRElPKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPCBBVl9DT0RFQ19JRF9GSVJTVF9TVUJUSVRMRSkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkIDwgQVZfQ09ERUNfSURfRklSU1RfVU5LTk9XTikKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG1wNF9kZXNjcl9jb3VudDsgaSsrKQorICAgICAgICBhdl9mcmVlKG1wNF9kZXNjcltpXS5kZWNfY29uZmlnX2Rlc2NyKTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb3B1c19jb3VwbGVkX3N0cmVhbV9jbnRbOV0gPSB7CisgICAgMSwgMCwgMSwgMSwgMiwgMiwgMiwgMywgMworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb3B1c19jaGFubmVsX21hcFs4XVs4XSA9IHsKKyAgICB7IDAgfSwKKyAgICB7IDAsMSB9LAorICAgIHsgMCwyLDEgfSwKKyAgICB7IDAsMSwyLDMgfSwKKyAgICB7IDAsNCwxLDIsMyB9LAorICAgIHsgMCw0LDEsMiwzLDUgfSwKKyAgICB7IDAsNCwxLDIsMyw1LDYgfSwKKyAgICB7IDAsNiwxLDIsMyw0LDUsNyB9LAorfTsKKworaW50IGZmX3BhcnNlX21wZWcyX2Rlc2NyaXB0b3IoQVZGb3JtYXRDb250ZXh0ICpmYywgQVZTdHJlYW0gKnN0LCBpbnQgc3RyZWFtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqcHAsIGNvbnN0IHVpbnQ4X3QgKmRlc2NfbGlzdF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNcDREZXNjciAqbXA0X2Rlc2NyLCBpbnQgbXA0X2Rlc2NyX2NvdW50LCBpbnQgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXBlZ1RTQ29udGV4dCAqdHMpCit7CisgICAgY29uc3QgdWludDhfdCAqZGVzY19lbmQ7CisgICAgaW50IGRlc2NfbGVuLCBkZXNjX3RhZywgZGVzY19lc19pZCwgZXh0X2Rlc2NfdGFnLCBjaGFubmVscywgY2hhbm5lbF9jb25maWdfY29kZTsKKyAgICBjaGFyIGxhbmd1YWdlWzI1Ml07CisgICAgaW50IGk7CisKKyAgICBkZXNjX3RhZyA9IGdldDgocHAsIGRlc2NfbGlzdF9lbmQpOworICAgIGlmIChkZXNjX3RhZyA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGRlc2NfbGVuID0gZ2V0OChwcCwgZGVzY19saXN0X2VuZCk7CisgICAgaWYgKGRlc2NfbGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgZGVzY19lbmQgPSAqcHAgKyBkZXNjX2xlbjsKKyAgICBpZiAoZGVzY19lbmQgPiBkZXNjX2xpc3RfZW5kKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2X2Rsb2coZmMsICJ0YWc6IDB4JTAyeCBsZW49JWRcbiIsIGRlc2NfdGFnLCBkZXNjX2xlbik7CisKKyAgICBpZiAoKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSB8fCBzdC0+cmVxdWVzdF9wcm9iZSA+IDApICYmCisgICAgICAgIHN0cmVhbV90eXBlID09IFNUUkVBTV9UWVBFX1BSSVZBVEVfREFUQSkKKyAgICAgICAgbXBlZ3RzX2ZpbmRfc3RyZWFtX3R5cGUoc3QsIGRlc2NfdGFnLCBERVNDX3R5cGVzKTsKKworICAgIHN3aXRjaCAoZGVzY190YWcpIHsKKyAgICBjYXNlIDB4MUU6IC8qIFNMIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgZGVzY19lc19pZCA9IGdldDE2KHBwLCBkZXNjX2VuZCk7CisgICAgICAgIGlmICh0cyAmJiB0cy0+cGlkc1twaWRdKQorICAgICAgICAgICAgdHMtPnBpZHNbcGlkXS0+ZXNfaWQgPSBkZXNjX2VzX2lkOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXA0X2Rlc2NyX2NvdW50OyBpKyspCisgICAgICAgICAgICBpZiAobXA0X2Rlc2NyW2ldLmRlY19jb25maWdfZGVzY3JfbGVuICYmCisgICAgICAgICAgICAgICAgbXA0X2Rlc2NyW2ldLmVzX2lkID09IGRlc2NfZXNfaWQpIHsKKyAgICAgICAgICAgICAgICBBVklPQ29udGV4dCBwYjsKKyAgICAgICAgICAgICAgICBmZmlvX2luaXRfY29udGV4dCgmcGIsIG1wNF9kZXNjcltpXS5kZWNfY29uZmlnX2Rlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wNF9kZXNjcltpXS5kZWNfY29uZmlnX2Rlc2NyX2xlbiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBmZl9tcDRfcmVhZF9kZWNfY29uZmlnX2Rlc2NyKGZjLCBzdCwgJnBiKTsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA+IDApCisgICAgICAgICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSAwOworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0U1lTVEVNUykKKyAgICAgICAgICAgICAgICAgICAgbXBlZ3RzX29wZW5fc2VjdGlvbl9maWx0ZXIodHMsIHBpZCwgbTRzbF9jYiwgdHMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MUY6IC8qIEZNQyBkZXNjcmlwdG9yICovCisgICAgICAgIGdldDE2KHBwLCBkZXNjX2VuZCk7CisgICAgICAgIGlmIChtcDRfZGVzY3JfY291bnQgPiAwICYmCisgICAgICAgICAgICAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUNfTEFUTSB8fCBzdC0+cmVxdWVzdF9wcm9iZSA+IDApICYmCisgICAgICAgICAgICBtcDRfZGVzY3ItPmRlY19jb25maWdfZGVzY3JfbGVuICYmIG1wNF9kZXNjci0+ZXNfaWQgPT0gcGlkKSB7CisgICAgICAgICAgICBBVklPQ29udGV4dCBwYjsKKyAgICAgICAgICAgIGZmaW9faW5pdF9jb250ZXh0KCZwYiwgbXA0X2Rlc2NyLT5kZWNfY29uZmlnX2Rlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXA0X2Rlc2NyLT5kZWNfY29uZmlnX2Rlc2NyX2xlbiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgZmZfbXA0X3JlYWRfZGVjX2NvbmZpZ19kZXNjcihmYywgc3QsICZwYik7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID4gMCkgeworICAgICAgICAgICAgICAgIHN0LT5yZXF1ZXN0X3Byb2JlID0gc3QtPm5lZWRfcGFyc2luZyA9IDA7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg1NjogLyogRFZCIHRlbGV0ZXh0IGRlc2NyaXB0b3IgKi8KKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCAqZXh0cmFkYXRhID0gTlVMTDsKKyAgICAgICAgICAgIGludCBsYW5ndWFnZV9jb3VudCA9IGRlc2NfbGVuIC8gNTsKKworICAgICAgICAgICAgaWYgKGRlc2NfbGVuID4gMCAmJiBkZXNjX2xlbiAlIDUgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgaWYgKGxhbmd1YWdlX2NvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIC8qIDQgYnl0ZXMgcGVyIGxhbmd1YWdlIGNvZGUgKDMgYnl0ZXMpIHdpdGggY29tbWEgb3IgTlVMIGJ5dGUgc2hvdWxkIGZpdCBsYW5ndWFnZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAobGFuZ3VhZ2VfY291bnQgPiBzaXplb2YobGFuZ3VhZ2UpIC8gNCkgeworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZV9jb3VudCA9IHNpemVvZihsYW5ndWFnZSkgLyA0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBsYW5ndWFnZV9jb3VudCAqIDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA8IGxhbmd1YWdlX2NvdW50ICogMikKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgICAgZXh0cmFkYXRhID0gc3QtPmNvZGVjLT5leHRyYWRhdGE7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGFuZ3VhZ2VfY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVtpICogNCArIDBdID0gZ2V0OChwcCwgZGVzY19lbmQpOworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVtpICogNCArIDFdID0gZ2V0OChwcCwgZGVzY19lbmQpOworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVtpICogNCArIDJdID0gZ2V0OChwcCwgZGVzY19lbmQpOworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVtpICogNCArIDNdID0gJywnOworCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShleHRyYWRhdGEsICpwcCwgMik7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhZGF0YSArPSAyOworCisgICAgICAgICAgICAgICAgICAgICpwcCArPSAyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxhbmd1YWdlW2kgKiA0IC0gMV0gPSAwOworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIGxhbmd1YWdlLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NTk6IC8qIHN1YnRpdGxpbmcgZGVzY3JpcHRvciAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiA4IGJ5dGVzIHBlciBEVkIgc3VidGl0bGUgc3Vic3RyZWFtIGRhdGE6CisgICAgICAgICAgICAgKiBJU09fNjM5X2xhbmd1YWdlX2NvZGUgKDMgYnl0ZXMpLAorICAgICAgICAgICAgICogc3VidGl0bGluZ190eXBlICgxIGJ5dGUpLAorICAgICAgICAgICAgICogY29tcG9zaXRpb25fcGFnZV9pZCAoMiBieXRlcyksCisgICAgICAgICAgICAgKiBhbmNpbGxhcnlfcGFnZV9pZCAoMiBieXRlcykgKi8KKyAgICAgICAgICAgIGludCBsYW5ndWFnZV9jb3VudCA9IGRlc2NfbGVuIC8gODsKKworICAgICAgICAgICAgaWYgKGRlc2NfbGVuID4gMCAmJiBkZXNjX2xlbiAlIDggIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgaWYgKGxhbmd1YWdlX2NvdW50ID4gMSkgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShmYywgIkRWQiBzdWJ0aXRsZXMgd2l0aCBtdWx0aXBsZSBsYW5ndWFnZXMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxhbmd1YWdlX2NvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmV4dHJhZGF0YTsKKworICAgICAgICAgICAgICAgIC8qIDQgYnl0ZXMgcGVyIGxhbmd1YWdlIGNvZGUgKDMgYnl0ZXMpIHdpdGggY29tbWEgb3IgTlVMIGJ5dGUgc2hvdWxkIGZpdCBsYW5ndWFnZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAobGFuZ3VhZ2VfY291bnQgPiBzaXplb2YobGFuZ3VhZ2UpIC8gNCkgeworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZV9jb3VudCA9IHNpemVvZihsYW5ndWFnZSkgLyA0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBsYW5ndWFnZV9jb3VudCAqIDUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPCBsYW5ndWFnZV9jb3VudCAqIDUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgZXh0cmFkYXRhID0gc3QtPmNvZGVjLT5leHRyYWRhdGE7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGFuZ3VhZ2VfY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVtpICogNCArIDBdID0gZ2V0OChwcCwgZGVzY19lbmQpOworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVtpICogNCArIDFdID0gZ2V0OChwcCwgZGVzY19lbmQpOworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVtpICogNCArIDJdID0gZ2V0OChwcCwgZGVzY19lbmQpOworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVtpICogNCArIDNdID0gJywnOworCisgICAgICAgICAgICAgICAgICAgIC8qIGhlYXJpbmcgaW1wYWlyZWQgc3VidGl0bGVzIGRldGVjdGlvbiB1c2luZyBzdWJ0aXRsaW5nX3R5cGUgKi8KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgqcHBbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDIwOiAvKiBEVkIgc3VidGl0bGVzIChmb3IgdGhlIGhhcmQgb2YgaGVhcmluZykgd2l0aCBubyBtb25pdG9yIGFzcGVjdCByYXRpbyBjcml0aWNhbGl0eSAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjE6IC8qIERWQiBzdWJ0aXRsZXMgKGZvciB0aGUgaGFyZCBvZiBoZWFyaW5nKSBmb3IgZGlzcGxheSBvbiA0OjMgYXNwZWN0IHJhdGlvIG1vbml0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDIyOiAvKiBEVkIgc3VidGl0bGVzIChmb3IgdGhlIGhhcmQgb2YgaGVhcmluZykgZm9yIGRpc3BsYXkgb24gMTY6OSBhc3BlY3QgcmF0aW8gbW9uaXRvciAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjM6IC8qIERWQiBzdWJ0aXRsZXMgKGZvciB0aGUgaGFyZCBvZiBoZWFyaW5nKSBmb3IgZGlzcGxheSBvbiAyLjIxOjEgYXNwZWN0IHJhdGlvIG1vbml0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDI0OiAvKiBEVkIgc3VidGl0bGVzIChmb3IgdGhlIGhhcmQgb2YgaGVhcmluZykgZm9yIGRpc3BsYXkgb24gYSBoaWdoIGRlZmluaXRpb24gbW9uaXRvciAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjU6IC8qIERWQiBzdWJ0aXRsZXMgKGZvciB0aGUgaGFyZCBvZiBoZWFyaW5nKSB3aXRoIHBsYW5vLXN0ZXJlb3Njb3BpYyBkaXNwYXJpdHkgZm9yIGRpc3BsYXkgb24gYSBoaWdoIGRlZmluaXRpb24gbW9uaXRvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmRpc3Bvc2l0aW9uIHw9IEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGV4dHJhZGF0YVs0XSA9IGdldDgocHAsIGRlc2NfZW5kKTsgLyogc3VidGl0bGluZ190eXBlICovCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShleHRyYWRhdGEsICpwcCwgNCk7IC8qIGNvbXBvc2l0aW9uX3BhZ2VfaWQgYW5kIGFuY2lsbGFyeV9wYWdlX2lkICovCisgICAgICAgICAgICAgICAgICAgIGV4dHJhZGF0YSArPSA1OworCisgICAgICAgICAgICAgICAgICAgICpwcCArPSA0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxhbmd1YWdlW2kgKiA0IC0gMV0gPSAwOworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIGxhbmd1YWdlLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MGE6IC8qIElTTyA2MzkgbGFuZ3VhZ2UgZGVzY3JpcHRvciAqLworICAgICAgICBmb3IgKGkgPSAwOyBpICsgNCA8PSBkZXNjX2xlbjsgaSArPSA0KSB7CisgICAgICAgICAgICBsYW5ndWFnZVtpICsgMF0gPSBnZXQ4KHBwLCBkZXNjX2VuZCk7CisgICAgICAgICAgICBsYW5ndWFnZVtpICsgMV0gPSBnZXQ4KHBwLCBkZXNjX2VuZCk7CisgICAgICAgICAgICBsYW5ndWFnZVtpICsgMl0gPSBnZXQ4KHBwLCBkZXNjX2VuZCk7CisgICAgICAgICAgICBsYW5ndWFnZVtpICsgM10gPSAnLCc7CisgICAgICAgICAgICBzd2l0Y2ggKGdldDgocHAsIGRlc2NfZW5kKSkgeworICAgICAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiB8PSBBVl9ESVNQT1NJVElPTl9DTEVBTl9FRkZFQ1RTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDAyOgorICAgICAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiB8PSBBVl9ESVNQT1NJVElPTl9IRUFSSU5HX0lNUEFJUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiB8PSBBVl9ESVNQT1NJVElPTl9WSVNVQUxfSU1QQUlSRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgJiYgbGFuZ3VhZ2VbMF0pIHsKKyAgICAgICAgICAgIGxhbmd1YWdlW2kgLSAxXSA9IDA7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAibGFuZ3VhZ2UiLCBsYW5ndWFnZSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDA1OiAvKiByZWdpc3RyYXRpb24gZGVzY3JpcHRvciAqLworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIocHApOworICAgICAgICBhdl9kbG9nKGZjLCAicmVnX2Rlc2M9JS40c1xuIiwgKGNoYXIgKikmc3QtPmNvZGVjLT5jb2RlY190YWcpOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAgICAgbXBlZ3RzX2ZpbmRfc3RyZWFtX3R5cGUoc3QsIHN0LT5jb2RlYy0+Y29kZWNfdGFnLCBSRUdEX3R5cGVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDUyOiAvKiBzdHJlYW0gaWRlbnRpZmllciBkZXNjcmlwdG9yICovCisgICAgICAgIHN0LT5zdHJlYW1faWRlbnRpZmllciA9IDEgKyBnZXQ4KHBwLCBkZXNjX2VuZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgyNjogLyogbWV0YWRhdGEgZGVzY3JpcHRvciAqLworICAgICAgICBpZiAoZ2V0MTYocHAsIGRlc2NfZW5kKSA9PSAweEZGRkYpCisgICAgICAgICAgICAqcHAgKz0gNDsKKyAgICAgICAgaWYgKGdldDgocHAsIGRlc2NfZW5kKSA9PSAweEZGKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIocHApOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgICAgICAgICBtcGVndHNfZmluZF9zdHJlYW1fdHlwZShzdCwgc3QtPmNvZGVjLT5jb2RlY190YWcsIE1FVEFEQVRBX3R5cGVzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4N2Y6IC8qIERWQiBleHRlbnNpb24gZGVzY3JpcHRvciAqLworICAgICAgICBleHRfZGVzY190YWcgPSBnZXQ4KHBwLCBkZXNjX2VuZCk7CisgICAgICAgIGlmIChleHRfZGVzY190YWcgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMgJiYKKyAgICAgICAgICAgIGV4dF9kZXNjX3RhZyA9PSAweDgwKSB7IC8qIFVzZXIgZGVmaW5lZCAocHJvdmlzaW9uYWwgT3B1cykgKi8KKyAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3ooc2l6ZW9mKG9wdXNfZGVmYXVsdF9leHRyYWRhdGEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBzaXplb2Yob3B1c19kZWZhdWx0X2V4dHJhZGF0YSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBvcHVzX2RlZmF1bHRfZXh0cmFkYXRhLCBzaXplb2Yob3B1c19kZWZhdWx0X2V4dHJhZGF0YSkpOworCisgICAgICAgICAgICAgICAgY2hhbm5lbF9jb25maWdfY29kZSA9IGdldDgocHAsIGRlc2NfZW5kKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbF9jb25maWdfY29kZSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGlmIChjaGFubmVsX2NvbmZpZ19jb2RlIDw9IDB4OCkgeworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVs5XSAgPSBjaGFubmVscyA9IGNoYW5uZWxfY29uZmlnX2NvZGUgPyBjaGFubmVsX2NvbmZpZ19jb2RlIDogMjsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbMThdID0gY2hhbm5lbHMgPiAyOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVsxOV0gPSBjaGFubmVsX2NvbmZpZ19jb2RlOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbF9jb25maWdfY29kZSA9PSAwKSB7IC8qIER1YWwgTW9ubyAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbMThdID0gMjU1OyAvKiBNYXBwaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVsxOV0gPSAyOyAgIC8qIFN0cmVhbSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzIwXSA9IG9wdXNfY291cGxlZF9zdHJlYW1fY250W2NoYW5uZWxfY29uZmlnX2NvZGVdOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhWzIxXSwgb3B1c19jaGFubmVsX21hcFtjaGFubmVscyAtIDFdLCBjaGFubmVscyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGZjLCAiT3B1cyBpbiBNUEVHLVRTIC0gY2hhbm5lbF9jb25maWdfY29kZSA+IDB4OCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKnBwID0gZGVzY19lbmQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBtdF9jYihNcGVnVFNGaWx0ZXIgKmZpbHRlciwgY29uc3QgdWludDhfdCAqc2VjdGlvbiwgaW50IHNlY3Rpb25fbGVuKQoreworICAgIE1wZWdUU0NvbnRleHQgKnRzID0gZmlsdGVyLT51LnNlY3Rpb25fZmlsdGVyLm9wYXF1ZTsKKyAgICBTZWN0aW9uSGVhZGVyIGgxLCAqaCA9ICZoMTsKKyAgICBQRVNDb250ZXh0ICpwZXM7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGNvbnN0IHVpbnQ4X3QgKnAsICpwX2VuZCwgKmRlc2NfbGlzdF9lbmQ7CisgICAgaW50IHByb2dyYW1faW5mb19sZW5ndGgsIHBjcl9waWQsIHBpZCwgc3RyZWFtX3R5cGU7CisgICAgaW50IGRlc2NfbGlzdF9sZW47CisgICAgdWludDMyX3QgcHJvZ19yZWdfZGVzYyA9IDA7IC8qIHJlZ2lzdHJhdGlvbiBkZXNjcmlwdG9yICovCisKKyAgICBpbnQgbXA0X2Rlc2NyX2NvdW50ID0gMDsKKyAgICBNcDREZXNjciBtcDRfZGVzY3JbTUFYX01QNF9ERVNDUl9DT1VOVF0gPSB7IHsgMCB9IH07CisgICAgaW50IGk7CisKKyAgICBhdl9kbG9nKHRzLT5zdHJlYW0sICJQTVQ6IGxlbiAlaVxuIiwgc2VjdGlvbl9sZW4pOworICAgIGhleF9kdW1wX2RlYnVnKHRzLT5zdHJlYW0sIHNlY3Rpb24sIHNlY3Rpb25fbGVuKTsKKworICAgIHBfZW5kID0gc2VjdGlvbiArIHNlY3Rpb25fbGVuIC0gNDsKKyAgICBwID0gc2VjdGlvbjsKKyAgICBpZiAocGFyc2Vfc2VjdGlvbl9oZWFkZXIoaCwgJnAsIHBfZW5kKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIGF2X2Rsb2codHMtPnN0cmVhbSwgInNpZD0weCV4IHNlY19udW09JWQvJWQgdmVyc2lvbj0lZFxuIiwKKyAgICAgICAgICAgIGgtPmlkLCBoLT5zZWNfbnVtLCBoLT5sYXN0X3NlY19udW0sIGgtPnZlcnNpb24pOworCisgICAgaWYgKGgtPnRpZCAhPSBQTVRfVElEKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCF0cy0+c2Nhbl9hbGxfcG10cyAmJiB0cy0+c2tpcF9jaGFuZ2VzKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIXRzLT5za2lwX2NsZWFyKQorICAgICAgICBjbGVhcl9wcm9ncmFtKHRzLCBoLT5pZCk7CisKKyAgICBwY3JfcGlkID0gZ2V0MTYoJnAsIHBfZW5kKTsKKyAgICBpZiAocGNyX3BpZCA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBwY3JfcGlkICY9IDB4MWZmZjsKKyAgICBhZGRfcGlkX3RvX3BtdCh0cywgaC0+aWQsIHBjcl9waWQpOworICAgIHNldF9wY3JfcGlkKHRzLT5zdHJlYW0sIGgtPmlkLCBwY3JfcGlkKTsKKworICAgIGF2X2Rsb2codHMtPnN0cmVhbSwgInBjcl9waWQ9MHgleFxuIiwgcGNyX3BpZCk7CisKKyAgICBwcm9ncmFtX2luZm9fbGVuZ3RoID0gZ2V0MTYoJnAsIHBfZW5kKTsKKyAgICBpZiAocHJvZ3JhbV9pbmZvX2xlbmd0aCA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBwcm9ncmFtX2luZm9fbGVuZ3RoICY9IDB4ZmZmOworICAgIHdoaWxlIChwcm9ncmFtX2luZm9fbGVuZ3RoID49IDIpIHsKKyAgICAgICAgdWludDhfdCB0YWcsIGxlbjsKKyAgICAgICAgdGFnID0gZ2V0OCgmcCwgcF9lbmQpOworICAgICAgICBsZW4gPSBnZXQ4KCZwLCBwX2VuZCk7CisKKyAgICAgICAgYXZfZGxvZyh0cy0+c3RyZWFtLCAicHJvZ3JhbSB0YWc6IDB4JTAyeCBsZW49JWRcbiIsIHRhZywgbGVuKTsKKworICAgICAgICBpZiAobGVuID4gcHJvZ3JhbV9pbmZvX2xlbmd0aCAtIDIpCisgICAgICAgICAgICAvLyBzb21ldGhpbmcgZWxzZSBpcyBicm9rZW4sIGV4aXQgdGhlIHByb2dyYW1fZGVzY3JpcHRvcnNfbG9vcAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHByb2dyYW1faW5mb19sZW5ndGggLT0gbGVuICsgMjsKKyAgICAgICAgaWYgKHRhZyA9PSAweDFkKSB7IC8vIElPRCBkZXNjcmlwdG9yCisgICAgICAgICAgICBnZXQ4KCZwLCBwX2VuZCk7IC8vIHNjb3BlCisgICAgICAgICAgICBnZXQ4KCZwLCBwX2VuZCk7IC8vIGxhYmVsCisgICAgICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgICAgIG1wNF9yZWFkX2lvZHModHMtPnN0cmVhbSwgcCwgbGVuLCBtcDRfZGVzY3IgKyBtcDRfZGVzY3JfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtcDRfZGVzY3JfY291bnQsIE1BWF9NUDRfREVTQ1JfQ09VTlQpOworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSAweDA1ICYmIGxlbiA+PSA0KSB7IC8vIHJlZ2lzdHJhdGlvbiBkZXNjcmlwdG9yCisgICAgICAgICAgICBwcm9nX3JlZ19kZXNjID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcCk7CisgICAgICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgfQorICAgICAgICBwICs9IGxlbjsKKyAgICB9CisgICAgcCArPSBwcm9ncmFtX2luZm9fbGVuZ3RoOworICAgIGlmIChwID49IHBfZW5kKQorICAgICAgICBnb3RvIG91dDsKKworICAgIC8vIHN0b3AgcGFyc2luZyBhZnRlciBwbXQsIHdlIGZvdW5kIGhlYWRlcgorICAgIGlmICghdHMtPnN0cmVhbS0+bmJfc3RyZWFtcykKKyAgICAgICAgdHMtPnN0b3BfcGFyc2UgPSAyOworCisgICAgc2V0X3BtdF9mb3VuZCh0cywgaC0+aWQpOworCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHN0ID0gMDsKKyAgICAgICAgcGVzID0gTlVMTDsKKyAgICAgICAgc3RyZWFtX3R5cGUgPSBnZXQ4KCZwLCBwX2VuZCk7CisgICAgICAgIGlmIChzdHJlYW1fdHlwZSA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcGlkID0gZ2V0MTYoJnAsIHBfZW5kKTsKKyAgICAgICAgaWYgKHBpZCA8IDApCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgcGlkICY9IDB4MWZmZjsKKyAgICAgICAgaWYgKHBpZCA9PSB0cy0+Y3VycmVudF9waWQpCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAvKiBub3cgY3JlYXRlIHN0cmVhbSAqLworICAgICAgICBpZiAodHMtPnBpZHNbcGlkXSAmJiB0cy0+cGlkc1twaWRdLT50eXBlID09IE1QRUdUU19QRVMpIHsKKyAgICAgICAgICAgIHBlcyA9IHRzLT5waWRzW3BpZF0tPnUucGVzX2ZpbHRlci5vcGFxdWU7CisgICAgICAgICAgICBpZiAoIXBlcy0+c3QpIHsKKyAgICAgICAgICAgICAgICBwZXMtPnN0ICAgICA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocGVzLT5zdHJlYW0sIE5VTEwpOworICAgICAgICAgICAgICAgIGlmICghcGVzLT5zdCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgcGVzLT5zdC0+aWQgPSBwZXMtPnBpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ID0gcGVzLT5zdDsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1fdHlwZSAhPSAweDEzKSB7CisgICAgICAgICAgICBpZiAodHMtPnBpZHNbcGlkXSkKKyAgICAgICAgICAgICAgICBtcGVndHNfY2xvc2VfZmlsdGVyKHRzLCB0cy0+cGlkc1twaWRdKTsgLy8gd3JvbmdseSBhZGRlZCBzZHQgZmlsdGVyIHByb2JhYmx5CisgICAgICAgICAgICBwZXMgPSBhZGRfcGVzX3N0cmVhbSh0cywgcGlkLCBwY3JfcGlkKTsKKyAgICAgICAgICAgIGlmIChwZXMpIHsKKyAgICAgICAgICAgICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocGVzLT5zdHJlYW0sIE5VTEwpOworICAgICAgICAgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIHN0LT5pZCA9IHBlcy0+cGlkOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGlkeCA9IGZmX2ZpbmRfc3RyZWFtX2luZGV4KHRzLT5zdHJlYW0sIHBpZCk7CisgICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgICAgICAgICBzdCA9IHRzLT5zdHJlYW0tPnN0cmVhbXNbaWR4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHRzLT5zdHJlYW0sIE5VTEwpOworICAgICAgICAgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIHN0LT5pZCA9IHBpZDsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICBpZiAocGVzICYmICFwZXMtPnN0cmVhbV90eXBlKQorICAgICAgICAgICAgbXBlZ3RzX3NldF9zdHJlYW1faW5mbyhzdCwgcGVzLCBzdHJlYW1fdHlwZSwgcHJvZ19yZWdfZGVzYyk7CisKKyAgICAgICAgYWRkX3BpZF90b19wbXQodHMsIGgtPmlkLCBwaWQpOworCisgICAgICAgIGZmX3Byb2dyYW1fYWRkX3N0cmVhbV9pbmRleCh0cy0+c3RyZWFtLCBoLT5pZCwgc3QtPmluZGV4KTsKKworICAgICAgICBkZXNjX2xpc3RfbGVuID0gZ2V0MTYoJnAsIHBfZW5kKTsKKyAgICAgICAgaWYgKGRlc2NfbGlzdF9sZW4gPCAwKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIGRlc2NfbGlzdF9sZW4gJj0gMHhmZmY7CisgICAgICAgIGRlc2NfbGlzdF9lbmQgID0gcCArIGRlc2NfbGlzdF9sZW47CisgICAgICAgIGlmIChkZXNjX2xpc3RfZW5kID4gcF9lbmQpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaWYgKGZmX3BhcnNlX21wZWcyX2Rlc2NyaXB0b3IodHMtPnN0cmVhbSwgc3QsIHN0cmVhbV90eXBlLCAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NfbGlzdF9lbmQsIG1wNF9kZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wNF9kZXNjcl9jb3VudCwgcGlkLCB0cykgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAocGVzICYmIHByb2dfcmVnX2Rlc2MgPT0gQVZfUkwzMigiSERNViIpICYmCisgICAgICAgICAgICAgICAgc3RyZWFtX3R5cGUgPT0gMHg4MyAmJiBwZXMtPnN1Yl9zdCkgeworICAgICAgICAgICAgICAgIGZmX3Byb2dyYW1fYWRkX3N0cmVhbV9pbmRleCh0cy0+c3RyZWFtLCBoLT5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVzLT5zdWJfc3QtPmluZGV4KTsKKyAgICAgICAgICAgICAgICBwZXMtPnN1Yl9zdC0+Y29kZWMtPmNvZGVjX3RhZyA9IHN0LT5jb2RlYy0+Y29kZWNfdGFnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHAgPSBkZXNjX2xpc3RfZW5kOworICAgIH0KKworICAgIGlmICghdHMtPnBpZHNbcGNyX3BpZF0pCisgICAgICAgIG1wZWd0c19vcGVuX3Bjcl9maWx0ZXIodHMsIHBjcl9waWQpOworCitvdXQ6CisgICAgZm9yIChpID0gMDsgaSA8IG1wNF9kZXNjcl9jb3VudDsgaSsrKQorICAgICAgICBhdl9mcmVlKG1wNF9kZXNjcltpXS5kZWNfY29uZmlnX2Rlc2NyKTsKK30KKworc3RhdGljIHZvaWQgcGF0X2NiKE1wZWdUU0ZpbHRlciAqZmlsdGVyLCBjb25zdCB1aW50OF90ICpzZWN0aW9uLCBpbnQgc2VjdGlvbl9sZW4pCit7CisgICAgTXBlZ1RTQ29udGV4dCAqdHMgPSBmaWx0ZXItPnUuc2VjdGlvbl9maWx0ZXIub3BhcXVlOworICAgIFNlY3Rpb25IZWFkZXIgaDEsICpoID0gJmgxOworICAgIGNvbnN0IHVpbnQ4X3QgKnAsICpwX2VuZDsKKyAgICBpbnQgc2lkLCBwbXRfcGlkOworICAgIEFWUHJvZ3JhbSAqcHJvZ3JhbTsKKworICAgIGF2X2Rsb2codHMtPnN0cmVhbSwgIlBBVDpcbiIpOworICAgIGhleF9kdW1wX2RlYnVnKHRzLT5zdHJlYW0sIHNlY3Rpb24sIHNlY3Rpb25fbGVuKTsKKworICAgIHBfZW5kID0gc2VjdGlvbiArIHNlY3Rpb25fbGVuIC0gNDsKKyAgICBwICAgICA9IHNlY3Rpb247CisgICAgaWYgKHBhcnNlX3NlY3Rpb25faGVhZGVyKGgsICZwLCBwX2VuZCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGgtPnRpZCAhPSBQQVRfVElEKQorICAgICAgICByZXR1cm47CisgICAgaWYgKHRzLT5za2lwX2NoYW5nZXMpCisgICAgICAgIHJldHVybjsKKworICAgIHRzLT5zdHJlYW0tPnRzX2lkID0gaC0+aWQ7CisKKyAgICBjbGVhcl9wcm9ncmFtcyh0cyk7CisgICAgZm9yICg7OykgeworICAgICAgICBzaWQgPSBnZXQxNigmcCwgcF9lbmQpOworICAgICAgICBpZiAoc2lkIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwbXRfcGlkID0gZ2V0MTYoJnAsIHBfZW5kKTsKKyAgICAgICAgaWYgKHBtdF9waWQgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHBtdF9waWQgJj0gMHgxZmZmOworCisgICAgICAgIGlmIChwbXRfcGlkID09IHRzLT5jdXJyZW50X3BpZCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGF2X2Rsb2codHMtPnN0cmVhbSwgInNpZD0weCV4IHBpZD0weCV4XG4iLCBzaWQsIHBtdF9waWQpOworCisgICAgICAgIGlmIChzaWQgPT0gMHgwMDAwKSB7CisgICAgICAgICAgICAvKiBOSVQgaW5mbyAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTXBlZ1RTRmlsdGVyICpmaWwgPSB0cy0+cGlkc1twbXRfcGlkXTsKKyAgICAgICAgICAgIHByb2dyYW0gPSBhdl9uZXdfcHJvZ3JhbSh0cy0+c3RyZWFtLCBzaWQpOworICAgICAgICAgICAgaWYgKHByb2dyYW0pIHsKKyAgICAgICAgICAgICAgICBwcm9ncmFtLT5wcm9ncmFtX251bSA9IHNpZDsKKyAgICAgICAgICAgICAgICBwcm9ncmFtLT5wbXRfcGlkID0gcG10X3BpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWwpCisgICAgICAgICAgICAgICAgaWYgKCAgIGZpbC0+dHlwZSAhPSBNUEVHVFNfU0VDVElPTgorICAgICAgICAgICAgICAgICAgICB8fCBmaWwtPnBpZCAhPSBwbXRfcGlkCisgICAgICAgICAgICAgICAgICAgIHx8IGZpbC0+dS5zZWN0aW9uX2ZpbHRlci5zZWN0aW9uX2NiICE9IHBtdF9jYikKKyAgICAgICAgICAgICAgICAgICAgbXBlZ3RzX2Nsb3NlX2ZpbHRlcih0cywgdHMtPnBpZHNbcG10X3BpZF0pOworCisgICAgICAgICAgICBpZiAoIXRzLT5waWRzW3BtdF9waWRdKQorICAgICAgICAgICAgICAgIG1wZWd0c19vcGVuX3NlY3Rpb25fZmlsdGVyKHRzLCBwbXRfcGlkLCBwbXRfY2IsIHRzLCAxKTsKKyAgICAgICAgICAgIGFkZF9wYXRfZW50cnkodHMsIHNpZCk7CisgICAgICAgICAgICBhZGRfcGlkX3RvX3BtdCh0cywgc2lkLCAwKTsgLy8gYWRkIHBhdCBwaWQgdG8gcHJvZ3JhbQorICAgICAgICAgICAgYWRkX3BpZF90b19wbXQodHMsIHNpZCwgcG10X3BpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2lkIDwgMCkgeworICAgICAgICBpbnQgaSxqOworICAgICAgICBmb3IgKGo9MDsgajx0cy0+c3RyZWFtLT5uYl9wcm9ncmFtczsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHMtPm5iX3ByZzsgaSsrKQorICAgICAgICAgICAgICAgIGlmICh0cy0+cHJnW2ldLmlkID09IHRzLT5zdHJlYW0tPnByb2dyYW1zW2pdLT5pZCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoaT09dHMtPm5iX3ByZyAmJiAhdHMtPnNraXBfY2xlYXIpCisgICAgICAgICAgICAgICAgY2xlYXJfYXZwcm9ncmFtKHRzLCB0cy0+c3RyZWFtLT5wcm9ncmFtc1tqXS0+aWQpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZHRfY2IoTXBlZ1RTRmlsdGVyICpmaWx0ZXIsIGNvbnN0IHVpbnQ4X3QgKnNlY3Rpb24sIGludCBzZWN0aW9uX2xlbikKK3sKKyAgICBNcGVnVFNDb250ZXh0ICp0cyA9IGZpbHRlci0+dS5zZWN0aW9uX2ZpbHRlci5vcGFxdWU7CisgICAgU2VjdGlvbkhlYWRlciBoMSwgKmggPSAmaDE7CisgICAgY29uc3QgdWludDhfdCAqcCwgKnBfZW5kLCAqZGVzY19saXN0X2VuZCwgKmRlc2NfZW5kOworICAgIGludCBvbmlkLCB2YWwsIHNpZCwgZGVzY19saXN0X2xlbiwgZGVzY190YWcsIGRlc2NfbGVuLCBzZXJ2aWNlX3R5cGU7CisgICAgY2hhciAqbmFtZSwgKnByb3ZpZGVyX25hbWU7CisKKyAgICBhdl9kbG9nKHRzLT5zdHJlYW0sICJTRFQ6XG4iKTsKKyAgICBoZXhfZHVtcF9kZWJ1Zyh0cy0+c3RyZWFtLCBzZWN0aW9uLCBzZWN0aW9uX2xlbik7CisKKyAgICBwX2VuZCA9IHNlY3Rpb24gKyBzZWN0aW9uX2xlbiAtIDQ7CisgICAgcCAgICAgPSBzZWN0aW9uOworICAgIGlmIChwYXJzZV9zZWN0aW9uX2hlYWRlcihoLCAmcCwgcF9lbmQpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChoLT50aWQgIT0gU0RUX1RJRCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICh0cy0+c2tpcF9jaGFuZ2VzKQorICAgICAgICByZXR1cm47CisgICAgb25pZCA9IGdldDE2KCZwLCBwX2VuZCk7CisgICAgaWYgKG9uaWQgPCAwKQorICAgICAgICByZXR1cm47CisgICAgdmFsID0gZ2V0OCgmcCwgcF9lbmQpOworICAgIGlmICh2YWwgPCAwKQorICAgICAgICByZXR1cm47CisgICAgZm9yICg7OykgeworICAgICAgICBzaWQgPSBnZXQxNigmcCwgcF9lbmQpOworICAgICAgICBpZiAoc2lkIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB2YWwgPSBnZXQ4KCZwLCBwX2VuZCk7CisgICAgICAgIGlmICh2YWwgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlc2NfbGlzdF9sZW4gPSBnZXQxNigmcCwgcF9lbmQpOworICAgICAgICBpZiAoZGVzY19saXN0X2xlbiA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVzY19saXN0X2xlbiAmPSAweGZmZjsKKyAgICAgICAgZGVzY19saXN0X2VuZCAgPSBwICsgZGVzY19saXN0X2xlbjsKKyAgICAgICAgaWYgKGRlc2NfbGlzdF9lbmQgPiBwX2VuZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBkZXNjX3RhZyA9IGdldDgoJnAsIGRlc2NfbGlzdF9lbmQpOworICAgICAgICAgICAgaWYgKGRlc2NfdGFnIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlc2NfbGVuID0gZ2V0OCgmcCwgZGVzY19saXN0X2VuZCk7CisgICAgICAgICAgICBkZXNjX2VuZCA9IHAgKyBkZXNjX2xlbjsKKyAgICAgICAgICAgIGlmIChkZXNjX2xlbiA8IDAgfHwgZGVzY19lbmQgPiBkZXNjX2xpc3RfZW5kKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBhdl9kbG9nKHRzLT5zdHJlYW0sICJ0YWc6IDB4JTAyeCBsZW49JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGRlc2NfdGFnLCBkZXNjX2xlbik7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZGVzY190YWcpIHsKKyAgICAgICAgICAgIGNhc2UgMHg0ODoKKyAgICAgICAgICAgICAgICBzZXJ2aWNlX3R5cGUgPSBnZXQ4KCZwLCBwX2VuZCk7CisgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VfdHlwZSA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHByb3ZpZGVyX25hbWUgPSBnZXRzdHI4KCZwLCBwX2VuZCk7CisgICAgICAgICAgICAgICAgaWYgKCFwcm92aWRlcl9uYW1lKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBuYW1lID0gZ2V0c3RyOCgmcCwgcF9lbmQpOworICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIEFWUHJvZ3JhbSAqcHJvZ3JhbSA9IGF2X25ld19wcm9ncmFtKHRzLT5zdHJlYW0sIHNpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmcHJvZ3JhbS0+bWV0YWRhdGEsICJzZXJ2aWNlX25hbWUiLCBuYW1lLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZwcm9ncmFtLT5tZXRhZGF0YSwgInNlcnZpY2VfcHJvdmlkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJfbmFtZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfZnJlZShuYW1lKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHByb3ZpZGVyX25hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAgPSBkZXNjX2VuZDsKKyAgICAgICAgfQorICAgICAgICBwID0gZGVzY19saXN0X2VuZDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfcGNyKGludDY0X3QgKnBwY3JfaGlnaCwgaW50ICpwcGNyX2xvdywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBhY2tldCk7CisKKy8qIGhhbmRsZSBvbmUgVFMgcGFja2V0ICovCitzdGF0aWMgaW50IGhhbmRsZV9wYWNrZXQoTXBlZ1RTQ29udGV4dCAqdHMsIGNvbnN0IHVpbnQ4X3QgKnBhY2tldCkKK3sKKyAgICBNcGVnVFNGaWx0ZXIgKnRzczsKKyAgICBpbnQgbGVuLCBwaWQsIGNjLCBleHBlY3RlZF9jYywgY2Nfb2ssIGFmYywgaXNfc3RhcnQsIGlzX2Rpc2NvbnRpbnVpdHksCisgICAgICAgIGhhc19hZGFwdGF0aW9uLCBoYXNfcGF5bG9hZDsKKyAgICBjb25zdCB1aW50OF90ICpwLCAqcF9lbmQ7CisgICAgaW50NjRfdCBwb3M7CisKKyAgICBwaWQgPSBBVl9SQjE2KHBhY2tldCArIDEpICYgMHgxZmZmOworICAgIGlmIChwaWQgJiYgZGlzY2FyZF9waWQodHMsIHBpZCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlzX3N0YXJ0ID0gcGFja2V0WzFdICYgMHg0MDsKKyAgICB0c3MgPSB0cy0+cGlkc1twaWRdOworICAgIGlmICh0cy0+YXV0b19ndWVzcyAmJiAhdHNzICYmIGlzX3N0YXJ0KSB7CisgICAgICAgIGFkZF9wZXNfc3RyZWFtKHRzLCBwaWQsIC0xKTsKKyAgICAgICAgdHNzID0gdHMtPnBpZHNbcGlkXTsKKyAgICB9CisgICAgaWYgKCF0c3MpCisgICAgICAgIHJldHVybiAwOworICAgIHRzLT5jdXJyZW50X3BpZCA9IHBpZDsKKworICAgIGFmYyA9IChwYWNrZXRbM10gPj4gNCkgJiAzOworICAgIGlmIChhZmMgPT0gMCkgLyogcmVzZXJ2ZWQgdmFsdWUgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgaGFzX2FkYXB0YXRpb24gICA9IGFmYyAmIDI7CisgICAgaGFzX3BheWxvYWQgICAgICA9IGFmYyAmIDE7CisgICAgaXNfZGlzY29udGludWl0eSA9IGhhc19hZGFwdGF0aW9uICYmCisgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldFs0XSAhPSAwICYmIC8qIHdpdGggbGVuZ3RoID4gMCAqLworICAgICAgICAgICAgICAgICAgICAgICAocGFja2V0WzVdICYgMHg4MCk7IC8qIGFuZCBkaXNjb250aW51aXR5IGluZGljYXRlZCAqLworCisgICAgLyogY29udGludWl0eSBjaGVjayAoY3VycmVudGx5IG5vdCB1c2VkKSAqLworICAgIGNjID0gKHBhY2tldFszXSAmIDB4Zik7CisgICAgZXhwZWN0ZWRfY2MgPSBoYXNfcGF5bG9hZCA/ICh0c3MtPmxhc3RfY2MgKyAxKSAmIDB4MGYgOiB0c3MtPmxhc3RfY2M7CisgICAgY2Nfb2sgPSBwaWQgPT0gMHgxRkZGIHx8IC8vIG51bGwgcGFja2V0IFBJRAorICAgICAgICAgICAgaXNfZGlzY29udGludWl0eSB8fAorICAgICAgICAgICAgdHNzLT5sYXN0X2NjIDwgMCB8fAorICAgICAgICAgICAgZXhwZWN0ZWRfY2MgPT0gY2M7CisKKyAgICB0c3MtPmxhc3RfY2MgPSBjYzsKKyAgICBpZiAoIWNjX29rKSB7CisgICAgICAgIGF2X2xvZyh0cy0+c3RyZWFtLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiQ29udGludWl0eSBjaGVjayBmYWlsZWQgZm9yIHBpZCAlZCBleHBlY3RlZCAlZCBnb3QgJWRcbiIsCisgICAgICAgICAgICAgICBwaWQsIGV4cGVjdGVkX2NjLCBjYyk7CisgICAgICAgIGlmICh0c3MtPnR5cGUgPT0gTVBFR1RTX1BFUykgeworICAgICAgICAgICAgUEVTQ29udGV4dCAqcGMgPSB0c3MtPnUucGVzX2ZpbHRlci5vcGFxdWU7CisgICAgICAgICAgICBwYy0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfQ09SUlVQVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHAgPSBwYWNrZXQgKyA0OworICAgIGlmIChoYXNfYWRhcHRhdGlvbikgeworICAgICAgICBpbnQ2NF90IHBjcl9oOworICAgICAgICBpbnQgcGNyX2w7CisgICAgICAgIGlmIChwYXJzZV9wY3IoJnBjcl9oLCAmcGNyX2wsIHBhY2tldCkgPT0gMCkKKyAgICAgICAgICAgIHRzcy0+bGFzdF9wY3IgPSBwY3JfaCAqIDMwMCArIHBjcl9sOworICAgICAgICAvKiBza2lwIGFkYXB0YXRpb24gZmllbGQgKi8KKyAgICAgICAgcCArPSBwWzBdICsgMTsKKyAgICB9CisgICAgLyogaWYgcGFzdCB0aGUgZW5kIG9mIHBhY2tldCwgaWdub3JlICovCisgICAgcF9lbmQgPSBwYWNrZXQgKyBUU19QQUNLRVRfU0laRTsKKyAgICBpZiAocCA+PSBwX2VuZCB8fCAhaGFzX3BheWxvYWQpCisgICAgICAgIHJldHVybiAwOworCisgICAgcG9zID0gYXZpb190ZWxsKHRzLT5zdHJlYW0tPnBiKTsKKyAgICBpZiAocG9zID49IDApIHsKKyAgICAgICAgYXZfYXNzZXJ0MChwb3MgPj0gVFNfUEFDS0VUX1NJWkUpOworICAgICAgICB0cy0+cG9zNDdfZnVsbCA9IHBvcyAtIFRTX1BBQ0tFVF9TSVpFOworICAgIH0KKworICAgIGlmICh0c3MtPnR5cGUgPT0gTVBFR1RTX1NFQ1RJT04pIHsKKyAgICAgICAgaWYgKGlzX3N0YXJ0KSB7CisgICAgICAgICAgICAvKiBwb2ludGVyIGZpZWxkIHByZXNlbnQgKi8KKyAgICAgICAgICAgIGxlbiA9ICpwKys7CisgICAgICAgICAgICBpZiAocCArIGxlbiA+IHBfZW5kKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKGxlbiAmJiBjY19vaykgeworICAgICAgICAgICAgICAgIC8qIHdyaXRlIHJlbWFpbmluZyBzZWN0aW9uIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVfc2VjdGlvbl9kYXRhKHRzLCB0c3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsIGxlbiwgMCk7CisgICAgICAgICAgICAgICAgLyogY2hlY2sgd2hldGhlciBmaWx0ZXIgaGFzIGJlZW4gY2xvc2VkICovCisgICAgICAgICAgICAgICAgaWYgKCF0cy0+cGlkc1twaWRdKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAgKz0gbGVuOworICAgICAgICAgICAgaWYgKHAgPCBwX2VuZCkgeworICAgICAgICAgICAgICAgIHdyaXRlX3NlY3Rpb25fZGF0YSh0cywgdHNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBwX2VuZCAtIHAsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNjX29rKSB7CisgICAgICAgICAgICAgICAgd3JpdGVfc2VjdGlvbl9kYXRhKHRzLCB0c3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsIHBfZW5kIC0gcCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzdG9wIGZpbmRfc3RyZWFtX2luZm8gZnJvbSB3YWl0aW5nIGZvciBtb3JlIHN0cmVhbXMKKyAgICAgICAgLy8gd2hlbiBhbGwgcHJvZ3JhbXMgaGF2ZSByZWNlaXZlZCBhIFBNVAorICAgICAgICBpZiAodHMtPnN0cmVhbS0+Y3R4X2ZsYWdzICYgQVZGTVRDVFhfTk9IRUFERVIgJiYgdHMtPnNjYW5fYWxsX3BtdHMgPD0gMCkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHMtPm5iX3ByZzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCF0cy0+cHJnW2ldLnBtdF9mb3VuZCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSB0cy0+bmJfcHJnICYmIHRzLT5uYl9wcmcgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IHR5cGVzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHMtPnN0cmVhbS0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHRzLT5zdHJlYW0tPnN0cmVhbXNbaV07CisgICAgICAgICAgICAgICAgICAgIHR5cGVzIHw9IDE8PHN0LT5jb2RlYy0+Y29kZWNfdHlwZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCh0eXBlcyAmICgxPDxBVk1FRElBX1RZUEVfQVVESU8pICYmIHR5cGVzICYgKDE8PEFWTUVESUFfVFlQRV9WSURFTykpIHx8IHBvcyA+IDEwMDAwMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2codHMtPnN0cmVhbSwgQVZfTE9HX0RFQlVHLCAiQWxsIHByb2dyYW1zIGhhdmUgcG10LCBoZWFkZXJzIGZvdW5kXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgdHMtPnN0cmVhbS0+Y3R4X2ZsYWdzICY9IH5BVkZNVENUWF9OT0hFQURFUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIC8vIE5vdGU6IFRoZSBwb3NpdGlvbiBoZXJlIHBvaW50cyBhY3R1YWxseSBiZWhpbmQgdGhlIGN1cnJlbnQgcGFja2V0LgorICAgICAgICBpZiAodHNzLT50eXBlID09IE1QRUdUU19QRVMpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gdHNzLT51LnBlc19maWx0ZXIucGVzX2NiKHRzcywgcCwgcF9lbmQgLSBwLCBpc19zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyAtIHRzLT5yYXdfcGFja2V0X3NpemUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZWFuYWx5emUoTXBlZ1RTQ29udGV4dCAqdHMpIHsKKyAgICBBVklPQ29udGV4dCAqcGIgPSB0cy0+c3RyZWFtLT5wYjsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgaWYgKHBvcyA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBwb3MgLT0gdHMtPnBvczQ3X2Z1bGw7CisgICAgaWYgKHBvcyA9PSBUU19QQUNLRVRfU0laRSkgeworICAgICAgICB0cy0+c2l6ZV9zdGF0WzBdICsrOworICAgIH0gZWxzZSBpZiAocG9zID09IFRTX0RWSFNfUEFDS0VUX1NJWkUpIHsKKyAgICAgICAgdHMtPnNpemVfc3RhdFsxXSArKzsKKyAgICB9IGVsc2UgaWYgKHBvcyA9PSBUU19GRUNfUEFDS0VUX1NJWkUpIHsKKyAgICAgICAgdHMtPnNpemVfc3RhdFsyXSArKzsKKyAgICB9CisKKyAgICB0cy0+c2l6ZV9zdGF0X2NvdW50ICsrOworICAgIGlmICh0cy0+c2l6ZV9zdGF0X2NvdW50ID4gU0laRV9TVEFUX1RIUkVTSE9MRCkgeworICAgICAgICBpbnQgbmV3c2l6ZSA9IDA7CisgICAgICAgIGlmICh0cy0+c2l6ZV9zdGF0WzBdID4gU0laRV9TVEFUX1RIUkVTSE9MRCkgeworICAgICAgICAgICAgbmV3c2l6ZSA9IFRTX1BBQ0tFVF9TSVpFOworICAgICAgICB9IGVsc2UgaWYgKHRzLT5zaXplX3N0YXRbMV0gPiBTSVpFX1NUQVRfVEhSRVNIT0xEKSB7CisgICAgICAgICAgICBuZXdzaXplID0gVFNfRFZIU19QQUNLRVRfU0laRTsKKyAgICAgICAgfSBlbHNlIGlmICh0cy0+c2l6ZV9zdGF0WzJdID4gU0laRV9TVEFUX1RIUkVTSE9MRCkgeworICAgICAgICAgICAgbmV3c2l6ZSA9IFRTX0ZFQ19QQUNLRVRfU0laRTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmV3c2l6ZSAmJiBuZXdzaXplICE9IHRzLT5yYXdfcGFja2V0X3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyh0cy0+c3RyZWFtLCBBVl9MT0dfV0FSTklORywgImNoYW5naW5nIHBhY2tldCBzaXplIHRvICVkXG4iLCBuZXdzaXplKTsKKyAgICAgICAgICAgIHRzLT5yYXdfcGFja2V0X3NpemUgPSBuZXdzaXplOworICAgICAgICB9CisgICAgICAgIHRzLT5zaXplX3N0YXRfY291bnQgPSAwOworICAgICAgICBtZW1zZXQodHMtPnNpemVfc3RhdCwgMCwgc2l6ZW9mKHRzLT5zaXplX3N0YXQpKTsKKyAgICB9Cit9CisKKy8qIFhYWDogdHJ5IHRvIGZpbmQgYSBiZXR0ZXIgc3luY2hybyBvdmVyIHNldmVyYWwgcGFja2V0cyAodXNlCisgKiBnZXRfcGFja2V0X3NpemUoKSA/KSAqLworc3RhdGljIGludCBtcGVndHNfcmVzeW5jKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNcGVnVFNDb250ZXh0ICp0cyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgYywgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0cy0+cmVzeW5jX3NpemU7IGkrKykgeworICAgICAgICBjID0gYXZpb19yOChwYik7CisgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICBpZiAoYyA9PSAweDQ3KSB7CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIC0xLCBTRUVLX0NVUik7CisgICAgICAgICAgICByZWFuYWx5emUocy0+cHJpdl9kYXRhKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICJtYXggcmVzeW5jIHNpemUgcmVhY2hlZCwgY291bGQgbm90IGZpbmQgc3luYyBieXRlXG4iKTsKKyAgICAvKiBubyBzeW5jIGZvdW5kICovCisgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKKy8qIHJldHVybiBBVkVSUk9SX3NvbWV0aGluZyBpZiBlcnJvciBvciBFT0YuIFJldHVybiAwIGlmIE9LLiAqLworc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIHVpbnQ4X3QgKmJ1ZiwgaW50IHJhd19wYWNrZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKmRhdGEpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGxlbjsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgbGVuID0gZmZpb19yZWFkX2luZGlyZWN0KHBiLCBidWYsIFRTX1BBQ0tFVF9TSVpFLCBkYXRhKTsKKyAgICAgICAgaWYgKGxlbiAhPSBUU19QQUNLRVRfU0laRSkKKyAgICAgICAgICAgIHJldHVybiBsZW4gPCAwID8gbGVuIDogQVZFUlJPUl9FT0Y7CisgICAgICAgIC8qIGNoZWNrIHBhY2tldCBzeW5jIGJ5dGUgKi8KKyAgICAgICAgaWYgKCgqZGF0YSlbMF0gIT0gMHg0NykgeworICAgICAgICAgICAgLyogZmluZCBhIG5ldyBwYWNrZXQgc3RhcnQgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIC1GRk1JTihyYXdfcGFja2V0X3NpemUsIHBvcyksIFNFRUtfQ1VSKTsKKworICAgICAgICAgICAgaWYgKG1wZWd0c19yZXN5bmMocykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmluaXNoZWRfcmVhZGluZ19wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgcmF3X3BhY2tldF9zaXplKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCBza2lwID0gcmF3X3BhY2tldF9zaXplIC0gVFNfUEFDS0VUX1NJWkU7CisgICAgaWYgKHNraXAgPiAwKQorICAgICAgICBhdmlvX3NraXAocGIsIHNraXApOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9wYWNrZXRzKE1wZWdUU0NvbnRleHQgKnRzLCBpbnQ2NF90IG5iX3BhY2tldHMpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpzID0gdHMtPnN0cmVhbTsKKyAgICB1aW50OF90IHBhY2tldFtUU19QQUNLRVRfU0laRSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkVdOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisgICAgaW50NjRfdCBwYWNrZXRfbnVtOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGF2aW9fdGVsbChzLT5wYikgIT0gdHMtPmxhc3RfcG9zKSB7CisgICAgICAgIGludCBpOworICAgICAgICBhdl9kbG9nKHRzLT5zdHJlYW0sICJTa2lwcGluZyBhZnRlciBzZWVrXG4iKTsKKyAgICAgICAgLyogc2VlayBkZXRlY3RlZCwgZmx1c2ggcGVzIGJ1ZmZlciAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJfUElEX01BWDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodHMtPnBpZHNbaV0pIHsKKyAgICAgICAgICAgICAgICBpZiAodHMtPnBpZHNbaV0tPnR5cGUgPT0gTVBFR1RTX1BFUykgeworICAgICAgICAgICAgICAgICAgICBQRVNDb250ZXh0ICpwZXMgPSB0cy0+cGlkc1tpXS0+dS5wZXNfZmlsdGVyLm9wYXF1ZTsKKyAgICAgICAgICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZwZXMtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHBlcy0+ZGF0YV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBlcy0+c3RhdGUgPSBNUEVHVFNfU0tJUDsgLyogc2tpcCB1bnRpbCBwZXMgaGVhZGVyICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRzLT5waWRzW2ldLT5sYXN0X2NjID0gLTE7CisgICAgICAgICAgICAgICAgdHMtPnBpZHNbaV0tPmxhc3RfcGNyID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0cy0+c3RvcF9wYXJzZSA9IDA7CisgICAgcGFja2V0X251bSA9IDA7CisgICAgbWVtc2V0KHBhY2tldCArIFRTX1BBQ0tFVF9TSVpFLCAwLCBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHBhY2tldF9udW0rKzsKKyAgICAgICAgaWYgKG5iX3BhY2tldHMgIT0gMCAmJiBwYWNrZXRfbnVtID49IG5iX3BhY2tldHMgfHwKKyAgICAgICAgICAgIHRzLT5zdG9wX3BhcnNlID4gMSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFQUdBSU4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRzLT5zdG9wX3BhcnNlID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHJldCA9IHJlYWRfcGFja2V0KHMsIHBhY2tldCwgdHMtPnJhd19wYWNrZXRfc2l6ZSwgJmRhdGEpOworICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0ID0gaGFuZGxlX3BhY2tldCh0cywgZGF0YSk7CisgICAgICAgIGZpbmlzaGVkX3JlYWRpbmdfcGFja2V0KHMsIHRzLT5yYXdfcGFja2V0X3NpemUpOworICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgdHMtPmxhc3RfcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1wZWd0c19wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBjb25zdCBpbnQgc2l6ZSA9IHAtPmJ1Zl9zaXplOworICAgIGludCBtYXhzY29yZSA9IDA7CisgICAgaW50IHN1bXNjb3JlID0gMDsKKyAgICBpbnQgaTsKKyAgICBpbnQgY2hlY2tfY291bnQgPSBzaXplIC8gVFNfRkVDX1BBQ0tFVF9TSVpFOworI2RlZmluZSBDSEVDS19DT1VOVCAxMAorI2RlZmluZSBDSEVDS19CTE9DSyAxMDAKKworICAgIGlmIChjaGVja19jb3VudCA8IENIRUNLX0NPVU5UKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGZvciAoaSA9IDA7IGk8Y2hlY2tfY291bnQ7IGkrPUNIRUNLX0JMT0NLKSB7CisgICAgICAgIGludCBsZWZ0ID0gRkZNSU4oY2hlY2tfY291bnQgLSBpLCBDSEVDS19CTE9DSyk7CisgICAgICAgIGludCBzY29yZSAgICAgID0gYW5hbHl6ZShwLT5idWYgKyBUU19QQUNLRVRfU0laRSAgICAgKmksIFRTX1BBQ0tFVF9TSVpFICAgICAqbGVmdCwgVFNfUEFDS0VUX1NJWkUgICAgICwgTlVMTCk7CisgICAgICAgIGludCBkdmhzX3Njb3JlID0gYW5hbHl6ZShwLT5idWYgKyBUU19EVkhTX1BBQ0tFVF9TSVpFKmksIFRTX0RWSFNfUEFDS0VUX1NJWkUqbGVmdCwgVFNfRFZIU19QQUNLRVRfU0laRSwgTlVMTCk7CisgICAgICAgIGludCBmZWNfc2NvcmUgID0gYW5hbHl6ZShwLT5idWYgKyBUU19GRUNfUEFDS0VUX1NJWkUgKmksIFRTX0ZFQ19QQUNLRVRfU0laRSAqbGVmdCwgVFNfRkVDX1BBQ0tFVF9TSVpFICwgTlVMTCk7CisgICAgICAgIHNjb3JlID0gRkZNQVgzKHNjb3JlLCBkdmhzX3Njb3JlLCBmZWNfc2NvcmUpOworICAgICAgICBzdW1zY29yZSArPSBzY29yZTsKKyAgICAgICAgbWF4c2NvcmUgPSBGRk1BWChtYXhzY29yZSwgc2NvcmUpOworICAgIH0KKworICAgIHN1bXNjb3JlID0gc3Vtc2NvcmUgKiBDSEVDS19DT1VOVCAvIGNoZWNrX2NvdW50OworICAgIG1heHNjb3JlID0gbWF4c2NvcmUgKiBDSEVDS19DT1VOVCAvIENIRUNLX0JMT0NLOworCisgICAgYXZfZGxvZygwLCAiVFMgc2NvcmU6ICVkICVkXG4iLCBzdW1zY29yZSwgbWF4c2NvcmUpOworCisgICAgaWYgICAgICAoc3Vtc2NvcmUgPiA2KSByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggICArIHN1bXNjb3JlIC0gQ0hFQ0tfQ09VTlQ7CisgICAgZWxzZSBpZiAobWF4c2NvcmUgPiA2KSByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVgvMiArIHN1bXNjb3JlIC0gQ0hFQ0tfQ09VTlQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworLyogcmV0dXJuIHRoZSA5MGtIeiBQQ1IgYW5kIHRoZSBleHRlbnNpb24gZm9yIHRoZSAyN01IeiBQQ1IuIHJldHVybgorICogKC0xKSBpZiBub3QgYXZhaWxhYmxlICovCitzdGF0aWMgaW50IHBhcnNlX3BjcihpbnQ2NF90ICpwcGNyX2hpZ2gsIGludCAqcHBjcl9sb3csIGNvbnN0IHVpbnQ4X3QgKnBhY2tldCkKK3sKKyAgICBpbnQgYWZjLCBsZW4sIGZsYWdzOworICAgIGNvbnN0IHVpbnQ4X3QgKnA7CisgICAgdW5zaWduZWQgaW50IHY7CisKKyAgICBhZmMgPSAocGFja2V0WzNdID4+IDQpICYgMzsKKyAgICBpZiAoYWZjIDw9IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHAgICA9IHBhY2tldCArIDQ7CisgICAgbGVuID0gcFswXTsKKyAgICBwKys7CisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBmbGFncyA9ICpwKys7CisgICAgbGVuLS07CisgICAgaWYgKCEoZmxhZ3MgJiAweDEwKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKGxlbiA8IDYpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHYgICAgICAgICAgPSBBVl9SQjMyKHApOworICAgICpwcGNyX2hpZ2ggPSAoKGludDY0X3QpIHYgPDwgMSkgfCAocFs0XSA+PiA3KTsKKyAgICAqcHBjcl9sb3cgID0gKChwWzRdICYgMSkgPDwgOCkgfCBwWzVdOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZWVrX2JhY2soQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIGludDY0X3QgcG9zKSB7CisKKyAgICAvKiBOT1RFOiBXZSBhdHRlbXB0IHRvIHNlZWsgb24gbm9uLXNlZWthYmxlIGZpbGVzIGFzIHdlbGwsIGFzIHRoZQorICAgICAqIHByb2JlIGJ1ZmZlciB1c3VhbGx5IGlzIGJpZyBlbm91Z2guIE9ubHkgd2FybiBpZiB0aGUgc2VlayBmYWlsZWQKKyAgICAgKiBvbiBmaWxlcyB3aGVyZSB0aGUgc2VlayBzaG91bGQgd29yay4gKi8KKyAgICBpZiAoYXZpb19zZWVrKHBiLCBwb3MsIFNFRUtfU0VUKSA8IDApCisgICAgICAgIGF2X2xvZyhzLCBwYi0+c2Vla2FibGUgPyBBVl9MT0dfRVJST1IgOiBBVl9MT0dfSU5GTywgIlVuYWJsZSB0byBzZWVrIGJhY2sgdG8gdGhlIHN0YXJ0XG4iKTsKK30KKworc3RhdGljIGludCBtcGVndHNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1wZWdUU0NvbnRleHQgKnRzID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiAgID0gcy0+cGI7CisgICAgdWludDhfdCBidWZbOCAqIDEwMjRdID0gezB9OworICAgIGludCBsZW47CisgICAgaW50NjRfdCBwb3MsIHByb2Jlc2l6ZSA9IHMtPnByb2Jlc2l6ZSA/IHMtPnByb2Jlc2l6ZSA6IHMtPnByb2Jlc2l6ZTI7CisKKyAgICBmZmlvX2Vuc3VyZV9zZWVrYmFjayhwYiwgcHJvYmVzaXplKTsKKworICAgIC8qIHJlYWQgdGhlIGZpcnN0IDgxOTIgYnl0ZXMgdG8gZ2V0IHBhY2tldCBzaXplICovCisgICAgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBsZW4gPSBhdmlvX3JlYWQocGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIHRzLT5yYXdfcGFja2V0X3NpemUgPSBnZXRfcGFja2V0X3NpemUoYnVmLCBsZW4pOworICAgIGlmICh0cy0+cmF3X3BhY2tldF9zaXplIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiQ291bGQgbm90IGRldGVjdCBUUyBwYWNrZXQgc2l6ZSwgZGVmYXVsdGluZyB0byBub24tRkVDL0RWSFNcbiIpOworICAgICAgICB0cy0+cmF3X3BhY2tldF9zaXplID0gVFNfUEFDS0VUX1NJWkU7CisgICAgfQorICAgIHRzLT5zdHJlYW0gICAgID0gczsKKyAgICB0cy0+YXV0b19ndWVzcyA9IDA7CisKKyAgICBpZiAocy0+aWZvcm1hdCA9PSAmZmZfbXBlZ3RzX2RlbXV4ZXIpIHsKKyAgICAgICAgLyogbm9ybWFsIGRlbXV4ICovCisKKyAgICAgICAgLyogZmlyc3QgZG8gYSBzY2FuIHRvIGdldCBhbGwgdGhlIHNlcnZpY2VzICovCisgICAgICAgIHNlZWtfYmFjayhzLCBwYiwgcG9zKTsKKworICAgICAgICBtcGVndHNfb3Blbl9zZWN0aW9uX2ZpbHRlcih0cywgU0RUX1BJRCwgc2R0X2NiLCB0cywgMSk7CisKKyAgICAgICAgbXBlZ3RzX29wZW5fc2VjdGlvbl9maWx0ZXIodHMsIFBBVF9QSUQsIHBhdF9jYiwgdHMsIDEpOworCisgICAgICAgIGhhbmRsZV9wYWNrZXRzKHRzLCBwcm9iZXNpemUgLyB0cy0+cmF3X3BhY2tldF9zaXplKTsKKyAgICAgICAgLyogaWYgY291bGQgbm90IGZpbmQgc2VydmljZSwgZW5hYmxlIGF1dG9fZ3Vlc3MgKi8KKworICAgICAgICB0cy0+YXV0b19ndWVzcyA9IDE7CisKKyAgICAgICAgYXZfZGxvZyh0cy0+c3RyZWFtLCAidHVuaW5nIGRvbmVcbiIpOworCisgICAgICAgIHMtPmN0eF9mbGFncyB8PSBBVkZNVENUWF9OT0hFQURFUjsKKyAgICB9IGVsc2UgeworICAgICAgICBBVlN0cmVhbSAqc3Q7CisgICAgICAgIGludCBwY3JfcGlkLCBwaWQsIG5iX3BhY2tldHMsIG5iX3BjcnMsIHJldCwgcGNyX2w7CisgICAgICAgIGludDY0X3QgcGNyc1syXSwgcGNyX2g7CisgICAgICAgIGludCBwYWNrZXRfY291bnRbMl07CisgICAgICAgIHVpbnQ4X3QgcGFja2V0W1RTX1BBQ0tFVF9TSVpFXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YTsKKworICAgICAgICAvKiBvbmx5IHJlYWQgcGFja2V0cyAqLworCisgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDYwLCAxLCAyNzAwMDAwMCk7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NUEVHMlRTOworCisgICAgICAgIC8qIHdlIGl0ZXJhdGUgdW50aWwgd2UgZmluZCB0d28gUENScyB0byBlc3RpbWF0ZSB0aGUgYml0cmF0ZSAqLworICAgICAgICBwY3JfcGlkICAgID0gLTE7CisgICAgICAgIG5iX3BjcnMgICAgPSAwOworICAgICAgICBuYl9wYWNrZXRzID0gMDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgcmV0ID0gcmVhZF9wYWNrZXQocywgcGFja2V0LCB0cy0+cmF3X3BhY2tldF9zaXplLCAmZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcGlkID0gQVZfUkIxNihkYXRhICsgMSkgJiAweDFmZmY7CisgICAgICAgICAgICBpZiAoKHBjcl9waWQgPT0gLTEgfHwgcGNyX3BpZCA9PSBwaWQpICYmCisgICAgICAgICAgICAgICAgcGFyc2VfcGNyKCZwY3JfaCwgJnBjcl9sLCBkYXRhKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZmluaXNoZWRfcmVhZGluZ19wYWNrZXQocywgdHMtPnJhd19wYWNrZXRfc2l6ZSk7CisgICAgICAgICAgICAgICAgcGNyX3BpZCA9IHBpZDsKKyAgICAgICAgICAgICAgICBwYWNrZXRfY291bnRbbmJfcGNyc10gPSBuYl9wYWNrZXRzOworICAgICAgICAgICAgICAgIHBjcnNbbmJfcGNyc10gPSBwY3JfaCAqIDMwMCArIHBjcl9sOworICAgICAgICAgICAgICAgIG5iX3BjcnMrKzsKKyAgICAgICAgICAgICAgICBpZiAobmJfcGNycyA+PSAyKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluaXNoZWRfcmVhZGluZ19wYWNrZXQocywgdHMtPnJhd19wYWNrZXRfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYl9wYWNrZXRzKys7CisgICAgICAgIH0KKworICAgICAgICAvKiBOT1RFMTogdGhlIGJpdHJhdGUgaXMgY29tcHV0ZWQgd2l0aG91dCB0aGUgRkVDICovCisgICAgICAgIC8qIE5PVEUyOiBpdCBpcyBvbmx5IHRoZSBiaXRyYXRlIG9mIHRoZSBzdGFydCBvZiB0aGUgc3RyZWFtICovCisgICAgICAgIHRzLT5wY3JfaW5jciA9IChwY3JzWzFdIC0gcGNyc1swXSkgLyAocGFja2V0X2NvdW50WzFdIC0gcGFja2V0X2NvdW50WzBdKTsKKyAgICAgICAgdHMtPmN1cl9wY3IgID0gcGNyc1swXSAtIHRzLT5wY3JfaW5jciAqIHBhY2tldF9jb3VudFswXTsKKyAgICAgICAgcy0+Yml0X3JhdGUgID0gVFNfUEFDS0VUX1NJWkUgKiA4ICogMjdlNiAvIHRzLT5wY3JfaW5jcjsKKyAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHMtPmJpdF9yYXRlOworICAgICAgICBzdC0+c3RhcnRfdGltZSAgICAgID0gdHMtPmN1cl9wY3I7CisgICAgICAgIGF2X2Rsb2codHMtPnN0cmVhbSwgInN0YXJ0PSUwLjNmIHBjcj0lMC4zZiBpbmNyPSVkXG4iLAorICAgICAgICAgICAgICAgIHN0LT5zdGFydF90aW1lIC8gMTAwMDAwMC4wLCBwY3JzWzBdIC8gMjdlNiwgdHMtPnBjcl9pbmNyKTsKKyAgICB9CisKKyAgICBzZWVrX2JhY2socywgcGIsIHBvcyk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX1BBQ0tFVF9SRUFEQUhFQUQgKCgxMjggKiAxMDI0KSAvIDE4OCkKKworc3RhdGljIGludCBtcGVndHNfcmF3X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNcGVnVFNDb250ZXh0ICp0cyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBpOworICAgIGludDY0X3QgcGNyX2gsIG5leHRfcGNyX2gsIHBvczsKKyAgICBpbnQgcGNyX2wsIG5leHRfcGNyX2w7CisgICAgdWludDhfdCBwY3JfYnVmWzEyXTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhOworCisgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBUU19QQUNLRVRfU0laRSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldCA9IHJlYWRfcGFja2V0KHMsIHBrdC0+ZGF0YSwgdHMtPnJhd19wYWNrZXRfc2l6ZSwgJmRhdGEpOworICAgIHBrdC0+cG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoZGF0YSAhPSBwa3QtPmRhdGEpCisgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIGRhdGEsIHRzLT5yYXdfcGFja2V0X3NpemUpOworICAgIGZpbmlzaGVkX3JlYWRpbmdfcGFja2V0KHMsIHRzLT5yYXdfcGFja2V0X3NpemUpOworICAgIGlmICh0cy0+bXBlZzJ0c19jb21wdXRlX3BjcikgeworICAgICAgICAvKiBjb21wdXRlIGV4YWN0IFBDUiBmb3IgZWFjaCBwYWNrZXQgKi8KKyAgICAgICAgaWYgKHBhcnNlX3BjcigmcGNyX2gsICZwY3JfbCwgcGt0LT5kYXRhKSA9PSAwKSB7CisgICAgICAgICAgICAvKiB3ZSByZWFkIHRoZSBuZXh0IFBDUiAoWFhYOiBvcHRpbWl6ZSBpdCBieSB1c2luZyBhIGJpZ2dlciBidWZmZXIgKi8KKyAgICAgICAgICAgIHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BBQ0tFVF9SRUFEQUhFQUQ7IGkrKykgeworICAgICAgICAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgcG9zICsgaSAqIHRzLT5yYXdfcGFja2V0X3NpemUsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICBhdmlvX3JlYWQocy0+cGIsIHBjcl9idWYsIDEyKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VfcGNyKCZuZXh0X3Bjcl9oLCAmbmV4dF9wY3JfbCwgcGNyX2J1ZikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBYWFg6IG5vdCBwcmVjaXNlIGVub3VnaCAqLworICAgICAgICAgICAgICAgICAgICB0cy0+cGNyX2luY3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgKChuZXh0X3Bjcl9oIC0gcGNyX2gpICogMzAwICsgKG5leHRfcGNyX2wgLSBwY3JfbCkpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgIChpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCk7CisgICAgICAgICAgICAvKiBubyBuZXh0IFBDUiBmb3VuZDogd2UgdXNlIHByZXZpb3VzIGluY3JlbWVudCAqLworICAgICAgICAgICAgdHMtPmN1cl9wY3IgPSBwY3JfaCAqIDMwMCArIHBjcl9sOworICAgICAgICB9CisgICAgICAgIHBrdC0+cHRzICAgICAgPSB0cy0+Y3VyX3BjcjsKKyAgICAgICAgcGt0LT5kdXJhdGlvbiA9IHRzLT5wY3JfaW5jcjsKKyAgICAgICAgdHMtPmN1cl9wY3IgICs9IHRzLT5wY3JfaW5jcjsKKyAgICB9CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wZWd0c19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTXBlZ1RTQ29udGV4dCAqdHMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldCwgaTsKKworICAgIHBrdC0+c2l6ZSA9IC0xOworICAgIHRzLT5wa3QgPSBwa3Q7CisgICAgcmV0ID0gaGFuZGxlX3BhY2tldHModHMsIDApOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHRzLT5wa3QpOworICAgICAgICAvKiBmbHVzaCBwZXMgZGF0YSBsZWZ0ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQl9QSURfTUFYOyBpKyspCisgICAgICAgICAgICBpZiAodHMtPnBpZHNbaV0gJiYgdHMtPnBpZHNbaV0tPnR5cGUgPT0gTVBFR1RTX1BFUykgeworICAgICAgICAgICAgICAgIFBFU0NvbnRleHQgKnBlcyA9IHRzLT5waWRzW2ldLT51LnBlc19maWx0ZXIub3BhcXVlOworICAgICAgICAgICAgICAgIGlmIChwZXMtPnN0YXRlID09IE1QRUdUU19QQVlMT0FEICYmIHBlcy0+ZGF0YV9pbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3X3Blc19wYWNrZXQocGVzLCBwa3QpOworICAgICAgICAgICAgICAgICAgICBwZXMtPnN0YXRlID0gTVBFR1RTX1NLSVA7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXJldCAmJiBwa3QtPnNpemUgPCAwKQorICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlRSKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtcGVndHNfZnJlZShNcGVnVFNDb250ZXh0ICp0cykKK3sKKyAgICBpbnQgaTsKKworICAgIGNsZWFyX3Byb2dyYW1zKHRzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOQl9QSURfTUFYOyBpKyspCisgICAgICAgIGlmICh0cy0+cGlkc1tpXSkKKyAgICAgICAgICAgIG1wZWd0c19jbG9zZV9maWx0ZXIodHMsIHRzLT5waWRzW2ldKTsKK30KKworc3RhdGljIGludCBtcGVndHNfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTXBlZ1RTQ29udGV4dCAqdHMgPSBzLT5wcml2X2RhdGE7CisgICAgbXBlZ3RzX2ZyZWUodHMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfdW51c2VkIGludDY0X3QgbXBlZ3RzX2dldF9wY3IoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqcHBvcywgaW50NjRfdCBwb3NfbGltaXQpCit7CisgICAgTXBlZ1RTQ29udGV4dCAqdHMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBwb3MsIHRpbWVzdGFtcDsKKyAgICB1aW50OF90IGJ1ZltUU19QQUNLRVRfU0laRV07CisgICAgaW50IHBjcl9sLCBwY3JfcGlkID0KKyAgICAgICAgKChQRVNDb250ZXh0ICopcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5wcml2X2RhdGEpLT5wY3JfcGlkOworICAgIGludCBwb3M0NyA9IHRzLT5wb3M0N19mdWxsICUgdHMtPnJhd19wYWNrZXRfc2l6ZTsKKyAgICBwb3MgPQorICAgICAgICAoKCpwcG9zICsgdHMtPnJhd19wYWNrZXRfc2l6ZSAtIDEgLSBwb3M0NykgLyB0cy0+cmF3X3BhY2tldF9zaXplKSAqCisgICAgICAgIHRzLT5yYXdfcGFja2V0X3NpemUgKyBwb3M0NzsKKyAgICB3aGlsZShwb3MgPCBwb3NfbGltaXQpIHsKKyAgICAgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworICAgICAgICBpZiAoYXZpb19yZWFkKHMtPnBiLCBidWYsIFRTX1BBQ0tFVF9TSVpFKSAhPSBUU19QQUNLRVRfU0laRSkKKyAgICAgICAgICAgIHJldHVybiBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgaWYgKGJ1ZlswXSAhPSAweDQ3KSB7CisgICAgICAgICAgICBhdmlvX3NlZWsocy0+cGIsIC1UU19QQUNLRVRfU0laRSwgU0VFS19DVVIpOworICAgICAgICAgICAgaWYgKG1wZWd0c19yZXN5bmMocykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgICAgIHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBjcl9waWQgPCAwIHx8IChBVl9SQjE2KGJ1ZiArIDEpICYgMHgxZmZmKSA9PSBwY3JfcGlkKSAmJgorICAgICAgICAgICAgcGFyc2VfcGNyKCZ0aW1lc3RhbXAsICZwY3JfbCwgYnVmKSA9PSAwKSB7CisgICAgICAgICAgICAqcHBvcyA9IHBvczsKKyAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXA7CisgICAgICAgIH0KKyAgICAgICAgcG9zICs9IHRzLT5yYXdfcGFja2V0X3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworfQorCitzdGF0aWMgaW50NjRfdCBtcGVndHNfZ2V0X2R0cyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpwcG9zLCBpbnQ2NF90IHBvc19saW1pdCkKK3sKKyAgICBNcGVnVFNDb250ZXh0ICp0cyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IHBvczsKKyAgICBpbnQgcG9zNDcgPSB0cy0+cG9zNDdfZnVsbCAlIHRzLT5yYXdfcGFja2V0X3NpemU7CisgICAgcG9zID0gKCgqcHBvcyAgKyB0cy0+cmF3X3BhY2tldF9zaXplIC0gMSAtIHBvczQ3KSAvIHRzLT5yYXdfcGFja2V0X3NpemUpICogdHMtPnJhd19wYWNrZXRfc2l6ZSArIHBvczQ3OworICAgIGZmX3JlYWRfZnJhbWVfZmx1c2gocyk7CisgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCkgPCAwKQorICAgICAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7CisgICAgd2hpbGUocG9zIDwgcG9zX2xpbWl0KSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIEFWUGFja2V0IHBrdDsKKyAgICAgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7CisgICAgICAgIHJldCA9IGF2X3JlYWRfZnJhbWUocywgJnBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworICAgICAgICBhdl9mcmVlX3BhY2tldCgmcGt0KTsKKyAgICAgICAgaWYgKHBrdC5kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0LnBvcyA+PSAwKSB7CisgICAgICAgICAgICBmZl9yZWR1Y2VfaW5kZXgocywgcGt0LnN0cmVhbV9pbmRleCk7CisgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkocy0+c3RyZWFtc1twa3Quc3RyZWFtX2luZGV4XSwgcGt0LnBvcywgcGt0LmR0cywgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSAvKiBGSVhNRSBrZXlmcmFtZT8gKi8pOworICAgICAgICAgICAgaWYgKHBrdC5zdHJlYW1faW5kZXggPT0gc3RyZWFtX2luZGV4ICYmIHBrdC5wb3MgPj0gKnBwb3MpIHsKKyAgICAgICAgICAgICAgICAqcHBvcyA9IHBrdC5wb3M7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBrdC5kdHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gcGt0LnBvczsKKyAgICB9CisKKyAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHBhcnNpbmcgZnVuY3Rpb25zIC0gY2FsbGVkIGZyb20gb3RoZXIgZGVtdXhlcnMgc3VjaCBhcyBSVFAgKi8KKworTXBlZ1RTQ29udGV4dCAqYXZwcml2X21wZWd0c19wYXJzZV9vcGVuKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNcGVnVFNDb250ZXh0ICp0czsKKworICAgIHRzID0gYXZfbWFsbG9jeihzaXplb2YoTXBlZ1RTQ29udGV4dCkpOworICAgIGlmICghdHMpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIG5vIHN0cmVhbSBjYXNlLCBjdXJyZW50bHkgdXNlZCBieSBSVFAgKi8KKyAgICB0cy0+cmF3X3BhY2tldF9zaXplID0gVFNfUEFDS0VUX1NJWkU7CisgICAgdHMtPnN0cmVhbSA9IHM7CisgICAgdHMtPmF1dG9fZ3Vlc3MgPSAxOworICAgIG1wZWd0c19vcGVuX3NlY3Rpb25fZmlsdGVyKHRzLCBTRFRfUElELCBzZHRfY2IsIHRzLCAxKTsKKyAgICBtcGVndHNfb3Blbl9zZWN0aW9uX2ZpbHRlcih0cywgUEFUX1BJRCwgcGF0X2NiLCB0cywgMSk7CisKKyAgICByZXR1cm4gdHM7Cit9CisKKy8qIHJldHVybiB0aGUgY29uc3VtZWQgbGVuZ3RoIGlmIGEgcGFja2V0IHdhcyBvdXRwdXQsIG9yIC0xIGlmIG5vCisgKiBwYWNrZXQgaXMgb3V0cHV0ICovCitpbnQgYXZwcml2X21wZWd0c19wYXJzZV9wYWNrZXQoTXBlZ1RTQ29udGV4dCAqdHMsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIGludCBsZW4xOworCisgICAgbGVuMSA9IGxlbjsKKyAgICB0cy0+cGt0ID0gcGt0OworICAgIGZvciAoOzspIHsKKyAgICAgICAgdHMtPnN0b3BfcGFyc2UgPSAwOworICAgICAgICBpZiAobGVuIDwgVFNfUEFDS0VUX1NJWkUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKGJ1ZlswXSAhPSAweDQ3KSB7CisgICAgICAgICAgICBidWYrKzsKKyAgICAgICAgICAgIGxlbi0tOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFuZGxlX3BhY2tldCh0cywgYnVmKTsKKyAgICAgICAgICAgIGJ1ZiArPSBUU19QQUNLRVRfU0laRTsKKyAgICAgICAgICAgIGxlbiAtPSBUU19QQUNLRVRfU0laRTsKKyAgICAgICAgICAgIGlmICh0cy0+c3RvcF9wYXJzZSA9PSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZW4xIC0gbGVuOworfQorCit2b2lkIGF2cHJpdl9tcGVndHNfcGFyc2VfY2xvc2UoTXBlZ1RTQ29udGV4dCAqdHMpCit7CisgICAgbXBlZ3RzX2ZyZWUodHMpOworICAgIGF2X2ZyZWUodHMpOworfQorCitBVklucHV0Rm9ybWF0IGZmX21wZWd0c19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVndHMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLVRTIChNUEVHLTIgVHJhbnNwb3J0IFN0cmVhbSkiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ1RTQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gbXBlZ3RzX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IG1wZWd0c19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBtcGVndHNfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gbXBlZ3RzX3JlYWRfY2xvc2UsCisgICAgLnJlYWRfdGltZXN0YW1wID0gbXBlZ3RzX2dldF9kdHMsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfU0hPV19JRFMgfCBBVkZNVF9UU19ESVNDT05ULAorICAgIC5wcml2X2NsYXNzICAgICA9ICZtcGVndHNfY2xhc3MsCit9OworCitBVklucHV0Rm9ybWF0IGZmX21wZWd0c3Jhd19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVndHNyYXciLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgTVBFRy1UUyAoTVBFRy0yIFRyYW5zcG9ydCBTdHJlYW0pIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1wZWdUU0NvbnRleHQpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IG1wZWd0c19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBtcGVndHNfcmF3X3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IG1wZWd0c19yZWFkX2Nsb3NlLAorICAgIC5yZWFkX3RpbWVzdGFtcCA9IG1wZWd0c19nZXRfZHRzLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX1NIT1dfSURTIHwgQVZGTVRfVFNfRElTQ09OVCwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmbXBlZ3RzcmF3X2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGVndHMuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGVndHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGYzMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21wZWd0cy5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogTVBFRzIgdHJhbnNwb3J0IHN0cmVhbSBkZWZpbmVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfTVBFR1RTX0gKKyNkZWZpbmUgQVZGT1JNQVRfTVBFR1RTX0gKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisKKyNkZWZpbmUgVFNfRkVDX1BBQ0tFVF9TSVpFIDIwNAorI2RlZmluZSBUU19EVkhTX1BBQ0tFVF9TSVpFIDE5MgorI2RlZmluZSBUU19QQUNLRVRfU0laRSAxODgKKyNkZWZpbmUgVFNfTUFYX1BBQ0tFVF9TSVpFIDIwNAorCisjZGVmaW5lIE5CX1BJRF9NQVggODE5MgorI2RlZmluZSBNQVhfU0VDVElPTl9TSVpFIDQwOTYKKworLyogcGlkcyAqLworI2RlZmluZSBQQVRfUElEICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgU0RUX1BJRCAgICAgICAgICAgICAgICAgMHgwMDExCisKKy8qIHRhYmxlIGlkcyAqLworI2RlZmluZSBQQVRfVElEICAgMHgwMAorI2RlZmluZSBQTVRfVElEICAgMHgwMgorI2RlZmluZSBNNE9EX1RJRCAgMHgwNQorI2RlZmluZSBTRFRfVElEICAgMHg0MgorCisjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX01QRUcxICAgICAweDAxCisjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX01QRUcyICAgICAweDAyCisjZGVmaW5lIFNUUkVBTV9UWVBFX0FVRElPX01QRUcxICAgICAweDAzCisjZGVmaW5lIFNUUkVBTV9UWVBFX0FVRElPX01QRUcyICAgICAweDA0CisjZGVmaW5lIFNUUkVBTV9UWVBFX1BSSVZBVEVfU0VDVElPTiAweDA1CisjZGVmaW5lIFNUUkVBTV9UWVBFX1BSSVZBVEVfREFUQSAgICAweDA2CisjZGVmaW5lIFNUUkVBTV9UWVBFX0FVRElPX0FBQyAgICAgICAweDBmCisjZGVmaW5lIFNUUkVBTV9UWVBFX0FVRElPX0FBQ19MQVRNICAweDExCisjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX01QRUc0ICAgICAweDEwCisjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX0gyNjQgICAgICAweDFiCisjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX0hFVkMgICAgICAweDI0CisjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX0NBVlMgICAgICAweDQyCisjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX1ZDMSAgICAgICAweGVhCisjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX0RJUkFDICAgICAweGQxCisKKyNkZWZpbmUgU1RSRUFNX1RZUEVfQVVESU9fQUMzICAgICAgIDB4ODEKKyNkZWZpbmUgU1RSRUFNX1RZUEVfQVVESU9fRFRTICAgICAgIDB4ODIKKyNkZWZpbmUgU1RSRUFNX1RZUEVfQVVESU9fVFJVRUhEICAgIDB4ODMKKwordHlwZWRlZiBzdHJ1Y3QgTXBlZ1RTQ29udGV4dCBNcGVnVFNDb250ZXh0OworCitNcGVnVFNDb250ZXh0ICphdnByaXZfbXBlZ3RzX3BhcnNlX29wZW4oQVZGb3JtYXRDb250ZXh0ICpzKTsKK2ludCBhdnByaXZfbXBlZ3RzX3BhcnNlX3BhY2tldChNcGVnVFNDb250ZXh0ICp0cywgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pOwordm9pZCBhdnByaXZfbXBlZ3RzX3BhcnNlX2Nsb3NlKE1wZWdUU0NvbnRleHQgKnRzKTsKKwordHlwZWRlZiBzdHJ1Y3QgU0xDb25maWdEZXNjciB7CisgICAgaW50IHVzZV9hdV9zdGFydDsKKyAgICBpbnQgdXNlX2F1X2VuZDsKKyAgICBpbnQgdXNlX3JhbmRfYWNjX3B0OworICAgIGludCB1c2VfcGFkZGluZzsKKyAgICBpbnQgdXNlX3RpbWVzdGFtcHM7CisgICAgaW50IHVzZV9pZGxlOworICAgIGludCB0aW1lc3RhbXBfcmVzOworICAgIGludCB0aW1lc3RhbXBfbGVuOworICAgIGludCBvY3JfbGVuOworICAgIGludCBhdV9sZW47CisgICAgaW50IGluc3RfYml0cmF0ZV9sZW47CisgICAgaW50IGRlZ3JfcHJpb3JfbGVuOworICAgIGludCBhdV9zZXFfbnVtX2xlbjsKKyAgICBpbnQgcGFja2V0X3NlcV9udW1fbGVuOworfSBTTENvbmZpZ0Rlc2NyOworCit0eXBlZGVmIHN0cnVjdCBNcDREZXNjciB7CisgICAgaW50IGVzX2lkOworICAgIGludCBkZWNfY29uZmlnX2Rlc2NyX2xlbjsKKyAgICB1aW50OF90ICpkZWNfY29uZmlnX2Rlc2NyOworICAgIFNMQ29uZmlnRGVzY3Igc2w7Cit9IE1wNERlc2NyOworCisvKioKKyAqIFBhcnNlIGFuIE1QRUctMiBkZXNjcmlwdG9yCisgKiBAcGFyYW1baW5dIGZjICAgICAgICAgICAgICAgICAgICBGb3JtYXQgY29udGV4dCAodXNlZCBmb3IgbG9nZ2luZyBvbmx5KQorICogQHBhcmFtIHN0ICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtCisgKiBAcGFyYW0gc3RyZWFtX3R5cGUgICAgICAgICAgICAgICBTVFJFQU1fVFlQRV94eHgKKyAqIEBwYXJhbSBwcCAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgYnVmZmVyIHBvaW50ZXIKKyAqIEBwYXJhbSBkZXNjX2xpc3RfZW5kICAgICAgICAgICAgIEVuZCBvZiBidWZmZXIKKyAqIEByZXR1cm4gPDAgdG8gc3RvcCBwcm9jZXNzaW5nCisgKi8KK2ludCBmZl9wYXJzZV9tcGVnMl9kZXNjcmlwdG9yKEFWRm9ybWF0Q29udGV4dCAqZmMsIEFWU3RyZWFtICpzdCwgaW50IHN0cmVhbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBwLCBjb25zdCB1aW50OF90ICpkZXNjX2xpc3RfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXA0RGVzY3IgKm1wNF9kZXNjciwgaW50IG1wNF9kZXNjcl9jb3VudCwgaW50IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1wZWdUU0NvbnRleHQgKnRzKTsKKworLyoqCisgKiBDaGVjayBwcmVzZW5jZSBvZiBIMjY0IHN0YXJ0Y29kZQorICogQHJldHVybiA8MCB0byBzdG9wIHByb2Nlc3NpbmcKKyAqLworaW50IGZmX2NoZWNrX2gyNjRfc3RhcnRjb2RlKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgQVZTdHJlYW0gKnN0LCBjb25zdCBBVlBhY2tldCAqcGt0KTsKKworI2VuZGlmIC8qIEFWRk9STUFUX01QRUdUU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbXBlZ3RzZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbXBlZ3RzZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyYzZkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGVndHNlbmMuYwpAQCAtMCwwICsxLDE0OTkgQEAKKy8qCisgKiBNUEVHMiB0cmFuc3BvcnQgc3RyZWFtIChha2EgRFZCKSBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtcGVndHMuaCIKKworI2RlZmluZSBQQ1JfVElNRV9CQVNFIDI3MDAwMDAwCisKKy8qIHdyaXRlIERWQiBTSSBzZWN0aW9ucyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbXBlZ3RzIHNlY3Rpb24gd3JpdGVyICovCisKK3R5cGVkZWYgc3RydWN0IE1wZWdUU1NlY3Rpb24geworICAgIGludCBwaWQ7CisgICAgaW50IGNjOworICAgIHZvaWQgKCp3cml0ZV9wYWNrZXQpKHN0cnVjdCBNcGVnVFNTZWN0aW9uICpzLCBjb25zdCB1aW50OF90ICpwYWNrZXQpOworICAgIHZvaWQgKm9wYXF1ZTsKK30gTXBlZ1RTU2VjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgTXBlZ1RTU2VydmljZSB7CisgICAgTXBlZ1RTU2VjdGlvbiBwbXQ7IC8qIE1QRUcyIHBtdCB0YWJsZSBjb250ZXh0ICovCisgICAgaW50IHNpZDsgICAgICAgICAgIC8qIHNlcnZpY2UgSUQgKi8KKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKnByb3ZpZGVyX25hbWU7CisgICAgaW50IHBjcl9waWQ7CisgICAgaW50IHBjcl9wYWNrZXRfY291bnQ7CisgICAgaW50IHBjcl9wYWNrZXRfcGVyaW9kOworfSBNcGVnVFNTZXJ2aWNlOworCit0eXBlZGVmIHN0cnVjdCBNcGVnVFNXcml0ZSB7CisgICAgY29uc3QgQVZDbGFzcyAqYXZfY2xhc3M7CisgICAgTXBlZ1RTU2VjdGlvbiBwYXQ7IC8qIE1QRUcyIHBhdCB0YWJsZSAqLworICAgIE1wZWdUU1NlY3Rpb24gc2R0OyAvKiBNUEVHMiBzZHQgdGFibGUgY29udGV4dCAqLworICAgIE1wZWdUU1NlcnZpY2UgKipzZXJ2aWNlczsKKyAgICBpbnQgc2R0X3BhY2tldF9jb3VudDsKKyAgICBpbnQgc2R0X3BhY2tldF9wZXJpb2Q7CisgICAgaW50IHBhdF9wYWNrZXRfY291bnQ7CisgICAgaW50IHBhdF9wYWNrZXRfcGVyaW9kOworICAgIGludCBuYl9zZXJ2aWNlczsKKyAgICBpbnQgb25pZDsKKyAgICBpbnQgdHNpZDsKKyAgICBpbnQ2NF90IGZpcnN0X3BjcjsKKyAgICBpbnQgbXV4X3JhdGU7IC8vLzwgc2V0IHRvIDEgd2hlbiBWQlIKKyAgICBpbnQgcGVzX3BheWxvYWRfc2l6ZTsKKworICAgIGludCB0cmFuc3BvcnRfc3RyZWFtX2lkOworICAgIGludCBvcmlnaW5hbF9uZXR3b3JrX2lkOworICAgIGludCBzZXJ2aWNlX2lkOworCisgICAgaW50IHBtdF9zdGFydF9waWQ7CisgICAgaW50IHN0YXJ0X3BpZDsKKyAgICBpbnQgbTJ0c19tb2RlOworCisgICAgaW50IHJlZW1pdF9wYXRfcG10OyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisKKyAgICBpbnQgcGNyX3BlcmlvZDsKKyNkZWZpbmUgTVBFR1RTX0ZMQUdfUkVFTUlUX1BBVF9QTVQgIDB4MDEKKyNkZWZpbmUgTVBFR1RTX0ZMQUdfQUFDX0xBVE0gICAgICAgIDB4MDIKKyAgICBpbnQgZmxhZ3M7CisgICAgaW50IGNvcHl0czsKKyAgICBpbnQgdGFibGVzX3ZlcnNpb247CisKKyAgICBpbnQgb21pdF92aWRlb19wZXNfbGVuZ3RoOworfSBNcGVnVFNXcml0ZTsKKworLyogYSBQRVMgcGFja2V0IGhlYWRlciBpcyBnZW5lcmF0ZWQgZXZlcnkgREVGQVVMVF9QRVNfSEVBREVSX0ZSRVEgcGFja2V0cyAqLworI2RlZmluZSBERUZBVUxUX1BFU19IRUFERVJfRlJFUSAgMTYKKyNkZWZpbmUgREVGQVVMVF9QRVNfUEFZTE9BRF9TSVpFICgoREVGQVVMVF9QRVNfSEVBREVSX0ZSRVEgLSAxKSAqIDE4NCArIDE3MCkKKworLyogVGhlIHNlY3Rpb24gbGVuZ3RoIGlzIDEyIGJpdHMuIFRoZSBmaXJzdCAyIGFyZSBzZXQgdG8gMCwgdGhlIHJlbWFpbmluZworICogMTAgYml0cyBzaG91bGQgbm90IGV4Y2VlZCAxMDIxLiAqLworI2RlZmluZSBTRUNUSU9OX0xFTkdUSCAxMDIwCisKKy8qIE5PVEU6IDQgYnl0ZXMgbXVzdCBiZSBsZWZ0IGF0IHRoZSBlbmQgZm9yIHRoZSBjcmMzMiAqLworc3RhdGljIHZvaWQgbXBlZ3RzX3dyaXRlX3NlY3Rpb24oTXBlZ1RTU2VjdGlvbiAqcywgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIHVuc2lnbmVkIGludCBjcmM7CisgICAgdW5zaWduZWQgY2hhciBwYWNrZXRbVFNfUEFDS0VUX1NJWkVdOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Zl9wdHI7CisgICAgdW5zaWduZWQgY2hhciAqcTsKKyAgICBpbnQgZmlyc3QsIGIsIGxlbjEsIGxlZnQ7CisKKyAgICBjcmMgPSBhdl9ic3dhcDMyKGF2X2NyYyhhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18zMl9JRUVFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgYnVmLCBsZW4gLSA0KSk7CisKKyAgICBidWZbbGVuIC0gNF0gPSAoY3JjID4+IDI0KSAmIDB4ZmY7CisgICAgYnVmW2xlbiAtIDNdID0gKGNyYyA+PiAxNikgJiAweGZmOworICAgIGJ1ZltsZW4gLSAyXSA9IChjcmMgPj4gIDgpICYgMHhmZjsKKyAgICBidWZbbGVuIC0gMV0gPSAgY3JjICAgICAgICAmIDB4ZmY7CisKKyAgICAvKiBzZW5kIGVhY2ggcGFja2V0ICovCisgICAgYnVmX3B0ciA9IGJ1ZjsKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBmaXJzdCA9IGJ1ZiA9PSBidWZfcHRyOworICAgICAgICBxICAgICA9IHBhY2tldDsKKyAgICAgICAgKnErKyAgPSAweDQ3OworICAgICAgICBiICAgICA9IHMtPnBpZCA+PiA4OworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICBiIHw9IDB4NDA7CisgICAgICAgICpxKysgID0gYjsKKyAgICAgICAgKnErKyAgPSBzLT5waWQ7CisgICAgICAgIHMtPmNjID0gcy0+Y2MgKyAxICYgMHhmOworICAgICAgICAqcSsrICA9IDB4MTAgfCBzLT5jYzsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgKnErKyA9IDA7IC8qIDAgb2Zmc2V0ICovCisgICAgICAgIGxlbjEgPSBUU19QQUNLRVRfU0laRSAtIChxIC0gcGFja2V0KTsKKyAgICAgICAgaWYgKGxlbjEgPiBsZW4pCisgICAgICAgICAgICBsZW4xID0gbGVuOworICAgICAgICBtZW1jcHkocSwgYnVmX3B0ciwgbGVuMSk7CisgICAgICAgIHEgKz0gbGVuMTsKKyAgICAgICAgLyogYWRkIGtub3duIHBhZGRpbmcgZGF0YSAqLworICAgICAgICBsZWZ0ID0gVFNfUEFDS0VUX1NJWkUgLSAocSAtIHBhY2tldCk7CisgICAgICAgIGlmIChsZWZ0ID4gMCkKKyAgICAgICAgICAgIG1lbXNldChxLCAweGZmLCBsZWZ0KTsKKworICAgICAgICBzLT53cml0ZV9wYWNrZXQocywgcGFja2V0KTsKKworICAgICAgICBidWZfcHRyICs9IGxlbjE7CisgICAgICAgIGxlbiAgICAgLT0gbGVuMTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXQxNih1aW50OF90ICoqcV9wdHIsIGludCB2YWwpCit7CisgICAgdWludDhfdCAqcTsKKyAgICBxICAgICAgPSAqcV9wdHI7CisgICAgKnErKyAgID0gdmFsID4+IDg7CisgICAgKnErKyAgID0gdmFsOworICAgICpxX3B0ciA9IHE7Cit9CisKK3N0YXRpYyBpbnQgbXBlZ3RzX3dyaXRlX3NlY3Rpb24xKE1wZWdUU1NlY3Rpb24gKnMsIGludCB0aWQsIGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uLCBpbnQgc2VjX251bSwgaW50IGxhc3Rfc2VjX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICB1aW50OF90IHNlY3Rpb25bMTAyNF0sICpxOworICAgIHVuc2lnbmVkIGludCB0b3RfbGVuOworICAgIC8qIHJlc2VydmVkX2Z1dHVyZV91c2UgZmllbGQgbXVzdCBiZSBzZXQgdG8gMSBmb3IgU0RUICovCisgICAgdW5zaWduZWQgaW50IGZsYWdzID0gdGlkID09IFNEVF9USUQgPyAweGYwMDAgOiAweGIwMDA7CisKKyAgICB0b3RfbGVuID0gMyArIDUgKyBsZW4gKyA0OworICAgIC8qIGNoZWNrIGlmIG5vdCB0b28gYmlnICovCisgICAgaWYgKHRvdF9sZW4gPiAxMDI0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHEgICAgPSBzZWN0aW9uOworICAgICpxKysgPSB0aWQ7CisgICAgcHV0MTYoJnEsIGZsYWdzIHwgKGxlbiArIDUgKyA0KSk7IC8qIDUgYnl0ZSBoZWFkZXIgKyA0IGJ5dGUgQ1JDICovCisgICAgcHV0MTYoJnEsIGlkKTsKKyAgICAqcSsrID0gMHhjMSB8ICh2ZXJzaW9uIDw8IDEpOyAvKiBjdXJyZW50X25leHRfaW5kaWNhdG9yID0gMSAqLworICAgICpxKysgPSBzZWNfbnVtOworICAgICpxKysgPSBsYXN0X3NlY19udW07CisgICAgbWVtY3B5KHEsIGJ1ZiwgbGVuKTsKKworICAgIG1wZWd0c193cml0ZV9zZWN0aW9uKHMsIHNlY3Rpb24sIHRvdF9sZW4pOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbXBlZ3RzIHdyaXRlciAqLworCisjZGVmaW5lIERFRkFVTFRfUFJPVklERVJfTkFNRSAgICJGRm1wZWciCisjZGVmaW5lIERFRkFVTFRfU0VSVklDRV9OQU1FICAgICJTZXJ2aWNlMDEiCisKKy8qIHdlIHJldHJhbnNtaXQgdGhlIFNJIGluZm8gYXQgdGhpcyByYXRlICovCisjZGVmaW5lIFNEVF9SRVRSQU5TX1RJTUUgNTAwCisjZGVmaW5lIFBBVF9SRVRSQU5TX1RJTUUgMTAwCisjZGVmaW5lIFBDUl9SRVRSQU5TX1RJTUUgMjAKKwordHlwZWRlZiBzdHJ1Y3QgTXBlZ1RTV3JpdGVTdHJlYW0geworICAgIHN0cnVjdCBNcGVnVFNTZXJ2aWNlICpzZXJ2aWNlOworICAgIGludCBwaWQ7IC8qIHN0cmVhbSBhc3NvY2lhdGVkIHBpZCAqLworICAgIGludCBjYzsKKyAgICBpbnQgcGF5bG9hZF9zaXplOworICAgIGludCBmaXJzdF9wdHNfY2hlY2s7IC8vLzwgZmlyc3QgcHRzIGNoZWNrIG5lZWRlZAorICAgIGludCBwcmV2X3BheWxvYWRfa2V5OworICAgIGludDY0X3QgcGF5bG9hZF9wdHM7CisgICAgaW50NjRfdCBwYXlsb2FkX2R0czsKKyAgICBpbnQgcGF5bG9hZF9mbGFnczsKKyAgICB1aW50OF90ICpwYXlsb2FkOworICAgIEFWRm9ybWF0Q29udGV4dCAqYW11eDsKKyAgICBBVlJhdGlvbmFsIHVzZXJfdGI7Cit9IE1wZWdUU1dyaXRlU3RyZWFtOworCitzdGF0aWMgdm9pZCBtcGVndHNfd3JpdGVfcGF0KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNcGVnVFNXcml0ZSAqdHMgPSBzLT5wcml2X2RhdGE7CisgICAgTXBlZ1RTU2VydmljZSAqc2VydmljZTsKKyAgICB1aW50OF90IGRhdGFbU0VDVElPTl9MRU5HVEhdLCAqcTsKKyAgICBpbnQgaTsKKworICAgIHEgPSBkYXRhOworICAgIGZvciAoaSA9IDA7IGkgPCB0cy0+bmJfc2VydmljZXM7IGkrKykgeworICAgICAgICBzZXJ2aWNlID0gdHMtPnNlcnZpY2VzW2ldOworICAgICAgICBwdXQxNigmcSwgc2VydmljZS0+c2lkKTsKKyAgICAgICAgcHV0MTYoJnEsIDB4ZTAwMCB8IHNlcnZpY2UtPnBtdC5waWQpOworICAgIH0KKyAgICBtcGVndHNfd3JpdGVfc2VjdGlvbjEoJnRzLT5wYXQsIFBBVF9USUQsIHRzLT50c2lkLCB0cy0+dGFibGVzX3ZlcnNpb24sIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHEgLSBkYXRhKTsKK30KKworc3RhdGljIGludCBtcGVndHNfd3JpdGVfcG10KEFWRm9ybWF0Q29udGV4dCAqcywgTXBlZ1RTU2VydmljZSAqc2VydmljZSkKK3sKKyAgICBNcGVnVFNXcml0ZSAqdHMgPSBzLT5wcml2X2RhdGE7CisgICAgdWludDhfdCBkYXRhW1NFQ1RJT05fTEVOR1RIXSwgKnEsICpkZXNjX2xlbmd0aF9wdHIsICpwcm9ncmFtX2luZm9fbGVuZ3RoX3B0cjsKKyAgICBpbnQgdmFsLCBzdHJlYW1fdHlwZSwgaSwgZXJyID0gMDsKKworICAgIHEgPSBkYXRhOworICAgIHB1dDE2KCZxLCAweGUwMDAgfCBzZXJ2aWNlLT5wY3JfcGlkKTsKKworICAgIHByb2dyYW1faW5mb19sZW5ndGhfcHRyID0gcTsKKyAgICBxICs9IDI7IC8qIHBhdGNoZWQgYWZ0ZXIgKi8KKworICAgIC8qIHB1dCBwcm9ncmFtIGluZm8gaGVyZSAqLworCisgICAgdmFsID0gMHhmMDAwIHwgKHEgLSBwcm9ncmFtX2luZm9fbGVuZ3RoX3B0ciAtIDIpOworICAgIHByb2dyYW1faW5mb19sZW5ndGhfcHRyWzBdID0gdmFsID4+IDg7CisgICAgcHJvZ3JhbV9pbmZvX2xlbmd0aF9wdHJbMV0gPSB2YWw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIE1wZWdUU1dyaXRlU3RyZWFtICp0c19zdCA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICpsYW5nID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAibGFuZ3VhZ2UiLCBOVUxMLCAwKTsKKworICAgICAgICBpZiAocSAtIGRhdGEgPiBTRUNUSU9OX0xFTkdUSCAtIDMyKSB7CisgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTzoKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOgorICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBTVFJFQU1fVFlQRV9WSURFT19NUEVHMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OgorICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBTVFJFQU1fVFlQRV9WSURFT19NUEVHNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjQ6CisgICAgICAgICAgICBzdHJlYW1fdHlwZSA9IFNUUkVBTV9UWVBFX1ZJREVPX0gyNjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IRVZDOgorICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBTVFJFQU1fVFlQRV9WSURFT19IRVZDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQ0FWUzoKKyAgICAgICAgICAgIHN0cmVhbV90eXBlID0gU1RSRUFNX1RZUEVfVklERU9fQ0FWUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0RJUkFDOgorICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBTVFJFQU1fVFlQRV9WSURFT19ESVJBQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01QMjoKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDM6CisgICAgICAgICAgICBzdHJlYW1fdHlwZSA9IFNUUkVBTV9UWVBFX0FVRElPX01QRUcxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQUFDOgorICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSAodHMtPmZsYWdzICYgTVBFR1RTX0ZMQUdfQUFDX0xBVE0pCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gU1RSRUFNX1RZUEVfQVVESU9fQUFDX0xBVE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTVFJFQU1fVFlQRV9BVURJT19BQUM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BQUNfTEFUTToKKyAgICAgICAgICAgIHN0cmVhbV90eXBlID0gU1RSRUFNX1RZUEVfQVVESU9fQUFDX0xBVE07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BQzM6CisgICAgICAgICAgICBzdHJlYW1fdHlwZSA9IFNUUkVBTV9UWVBFX0FVRElPX0FDMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0RUUzoKKyAgICAgICAgICAgIHN0cmVhbV90eXBlID0gU1RSRUFNX1RZUEVfQVVESU9fRFRTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfVFJVRUhEOgorICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBTVFJFQU1fVFlQRV9BVURJT19UUlVFSEQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0cmVhbV90eXBlID0gU1RSRUFNX1RZUEVfUFJJVkFURV9EQVRBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAqcSsrID0gc3RyZWFtX3R5cGU7CisgICAgICAgIHB1dDE2KCZxLCAweGUwMDAgfCB0c19zdC0+cGlkKTsKKyAgICAgICAgZGVzY19sZW5ndGhfcHRyID0gcTsKKyAgICAgICAgcSArPSAyOyAvKiBwYXRjaGVkIGFmdGVyICovCisKKyAgICAgICAgLyogd3JpdGUgb3B0aW9uYWwgZGVzY3JpcHRvcnMgaGVyZSAqLworICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSkgeworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkPT1BVl9DT0RFQ19JRF9FQUMzKSB7CisgICAgICAgICAgICAgICAgKnErKz0weDdhOyAvLyBFQUMzIGRlc2NyaXB0b3Igc2VlIEEwMzggRFZCIFNJCisgICAgICAgICAgICAgICAgKnErKz0xOyAvLyAxIGJ5dGUsIGFsbCBmbGFncyBzZXRzIHRvIDAKKyAgICAgICAgICAgICAgICAqcSsrPTA7IC8vIG9taXQgYWxsIGZpZWxkcy4uLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX1MzMDJNKSB7CisgICAgICAgICAgICAgICAgKnErKyA9IDB4MDU7IC8qIE1QRUctMiByZWdpc3RyYXRpb24gZGVzY3JpcHRvciovCisgICAgICAgICAgICAgICAgKnErKyA9IDQ7CisgICAgICAgICAgICAgICAgKnErKyA9ICdCJzsKKyAgICAgICAgICAgICAgICAqcSsrID0gJ1MnOworICAgICAgICAgICAgICAgICpxKysgPSAnUyc7CisgICAgICAgICAgICAgICAgKnErKyA9ICdEJzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxhbmcpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpwOworICAgICAgICAgICAgICAgIGNoYXIgKm5leHQgPSBsYW5nLT52YWx1ZTsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpsZW5fcHRyOworCisgICAgICAgICAgICAgICAgKnErKyAgICAgPSAweDBhOyAvKiBJU08gNjM5IGxhbmd1YWdlIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgICAgICAgICBsZW5fcHRyICA9IHErKzsKKyAgICAgICAgICAgICAgICAqbGVuX3B0ciA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSBsYW5nLT52YWx1ZTsgbmV4dCAmJiAqbGVuX3B0ciA8IDI1NSAvIDQgKiA0OyBwID0gbmV4dCArIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHEgLSBkYXRhID4gU0VDVElPTl9MRU5HVEggLSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHN0cmNocihwLCAnLCcpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKHApICE9IDMgJiYgKCFuZXh0IHx8IG5leHQgIT0gcCArIDMpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIG5vdCBhIDMtbGV0dGVyIGNvZGUgKi8KKworICAgICAgICAgICAgICAgICAgICAqcSsrID0gKnArKzsKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9ICpwKys7CisgICAgICAgICAgICAgICAgICAgICpxKysgPSAqcCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9DTEVBTl9FRkZFQ1RTKQorICAgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IDB4MDE7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gMHgwMjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fVklTVUFMX0lNUEFJUkVEKQorICAgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IDB4MDM7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICpxKysgPSAwOyAvKiB1bmRlZmluZWQgdHlwZSAqLworCisgICAgICAgICAgICAgICAgICAgICpsZW5fcHRyICs9IDQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCpsZW5fcHRyID09IDApCisgICAgICAgICAgICAgICAgICAgIHEgLT0gMjsgLyogbm8gbGFuZ3VhZ2UgY29kZXMgd2VyZSB3cml0dGVuICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6CisgICAgICAgIHsKKyAgICAgICAgICAgY29uc3QgY2hhciBkZWZhdWx0X2xhbmd1YWdlW10gPSAidW5kIjsKKyAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2UgPSBsYW5nICYmIHN0cmxlbihsYW5nLT52YWx1ZSkgPj0gMyA/IGxhbmctPnZhbHVlIDogZGVmYXVsdF9sYW5ndWFnZTsKKworICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkJfU1VCVElUTEUpIHsKKyAgICAgICAgICAgICAgIHVpbnQ4X3QgKmxlbl9wdHI7CisgICAgICAgICAgICAgICBpbnQgZXh0cmFkYXRhX2NvcGllZCA9IDA7CisKKyAgICAgICAgICAgICAgICpxKysgPSAweDU5OyAvKiBzdWJ0aXRsaW5nX2Rlc2NyaXB0b3IgKi8KKyAgICAgICAgICAgICAgIGxlbl9wdHIgPSBxKys7CisKKyAgICAgICAgICAgICAgIHdoaWxlIChzdHJsZW4obGFuZ3VhZ2UpID49IDMpIHsKKyAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZW9mKGRhdGEpIC0gKHEgLSBkYXRhKSA8IDgpIHsgLyogOCBieXRlcyBwZXIgRFZCIHN1YnRpdGxlIHN1YnN0cmVhbSBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAqcSsrID0gKmxhbmd1YWdlKys7CisgICAgICAgICAgICAgICAgICAgKnErKyA9ICpsYW5ndWFnZSsrOworICAgICAgICAgICAgICAgICAgICpxKysgPSAqbGFuZ3VhZ2UrKzsKKyAgICAgICAgICAgICAgICAgICAvKiBTa2lwIGNvbW1hICovCisgICAgICAgICAgICAgICAgICAgaWYgKCpsYW5ndWFnZSAhPSAnXDAnKQorICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSsrOworCisgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgLSBleHRyYWRhdGFfY29waWVkID49IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IHN0LT5jb2RlYy0+ZXh0cmFkYXRhW2V4dHJhZGF0YV9jb3BpZWQgKyA0XTsgLyogc3VidGl0bGluZ190eXBlICovCisgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShxLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIGV4dHJhZGF0YV9jb3BpZWQsIDQpOyAvKiBjb21wb3NpdGlvbl9wYWdlX2lkIGFuZCBhbmNpbGxhcnlfcGFnZV9pZCAqLworICAgICAgICAgICAgICAgICAgICAgICBleHRyYWRhdGFfY29waWVkICs9IDU7CisgICAgICAgICAgICAgICAgICAgICAgIHEgKz0gNDsKKyAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWJ0aXRsaW5nX3R5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICAqIDB4MTAgLSBub3JtYWwgd2l0aCBubyBtb25pdG9yIGFzcGVjdCByYXRpbyBjcml0aWNhbGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgKiAweDIwIC0gZm9yIHRoZSBoYXJkIG9mIGhlYXJpbmcgd2l0aCBubyBtb25pdG9yIGFzcGVjdCByYXRpbyBjcml0aWNhbGl0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQpID8gMHgyMCA6IDB4MTA7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9PSA0KSAmJiAoZXh0cmFkYXRhX2NvcGllZCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBvZiBvbGQgNC1ieXRlIGV4dHJhZGF0YSBmb3JtYXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShxLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSwgNCk7IC8qIGNvbXBvc2l0aW9uX3BhZ2VfaWQgYW5kIGFuY2lsbGFyeV9wYWdlX2lkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWRhdGFfY29waWVkICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBxICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXQxNigmcSwgMSk7IC8qIGNvbXBvc2l0aW9uX3BhZ2VfaWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dDE2KCZxLCAxKTsgLyogYW5jaWxsYXJ5X3BhZ2VfaWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgKmxlbl9wdHIgPSBxIC0gbGVuX3B0ciAtIDE7CisgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkJfVEVMRVRFWFQpIHsKKyAgICAgICAgICAgICAgIHVpbnQ4X3QgKmxlbl9wdHIgPSBOVUxMOworICAgICAgICAgICAgICAgaW50IGV4dHJhZGF0YV9jb3BpZWQgPSAwOworCisgICAgICAgICAgICAgICAvKiBUaGUgZGVzY3JpcHRvciB0YWcuIHRlbGV0ZXh0X2Rlc2NyaXB0b3IgKi8KKyAgICAgICAgICAgICAgICpxKysgPSAweDU2OworICAgICAgICAgICAgICAgbGVuX3B0ciA9IHErKzsKKworICAgICAgICAgICAgICAgd2hpbGUgKHN0cmxlbihsYW5ndWFnZSkgPj0gMyAmJiBxIC0gZGF0YSA8IHNpemVvZihkYXRhKSAtIDYpIHsKKyAgICAgICAgICAgICAgICAgICAqcSsrID0gKmxhbmd1YWdlKys7CisgICAgICAgICAgICAgICAgICAgKnErKyA9ICpsYW5ndWFnZSsrOworICAgICAgICAgICAgICAgICAgICpxKysgPSAqbGFuZ3VhZ2UrKzsKKyAgICAgICAgICAgICAgICAgICAvKiBTa2lwIGNvbW1hICovCisgICAgICAgICAgICAgICAgICAgaWYgKCpsYW5ndWFnZSAhPSAnXDAnKQorICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSsrOworCisgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgLSAxID4gZXh0cmFkYXRhX2NvcGllZCkgeworICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocSwgc3QtPmNvZGVjLT5leHRyYWRhdGEgKyBleHRyYWRhdGFfY29waWVkLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFkYXRhX2NvcGllZCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICBxICs9IDI7CisgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIFRlbGV0ZXh0IGRlc2NyaXB0b3I6CisgICAgICAgICAgICAgICAgICAgICAgICAqIHRlbGV0ZXh0X3R5cGU6IFRoaXMgNS1iaXQgZmllbGQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIFRlbGV0ZXh0IHBhZ2UgaW5kaWNhdGVkLiAoMHgwMSBJbml0aWFsIFRlbGV0ZXh0IHBhZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAqIHRlbGV0ZXh0X21hZ2F6aW5lX251bWJlcjogVGhpcyBpcyBhIDMtYml0IGZpZWxkIHdoaWNoIGlkZW50aWZpZXMgdGhlIG1hZ2F6aW5lIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICogdGVsZXRleHRfcGFnZV9udW1iZXI6IFRoaXMgaXMgYW4gOC1iaXQgZmllbGQgZ2l2aW5nIHR3byA0LWJpdCBoZXggZGlnaXRzIGlkZW50aWZ5aW5nIHRoZSBwYWdlIG51bWJlci4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IDB4MDg7CisgICAgICAgICAgICAgICAgICAgICAgICpxKysgPSAweDAwOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgKmxlbl9wdHIgPSBxIC0gbGVuX3B0ciAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgaWYgKHN0cmVhbV90eXBlID09IFNUUkVBTV9UWVBFX1ZJREVPX0RJUkFDKSB7CisgICAgICAgICAgICAgICAgKnErKyA9IDB4MDU7IC8qTVBFRy0yIHJlZ2lzdHJhdGlvbiBkZXNjcmlwdG9yKi8KKyAgICAgICAgICAgICAgICAqcSsrID0gNDsKKyAgICAgICAgICAgICAgICAqcSsrID0gJ2QnOworICAgICAgICAgICAgICAgICpxKysgPSAncic7CisgICAgICAgICAgICAgICAgKnErKyA9ICdhJzsKKyAgICAgICAgICAgICAgICAqcSsrID0gJ2MnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0RBVEE6CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TTVBURV9LTFYpIHsKKyAgICAgICAgICAgICAgICAqcSsrID0gMHgwNTsgLyogTVBFRy0yIHJlZ2lzdHJhdGlvbiBkZXNjcmlwdG9yICovCisgICAgICAgICAgICAgICAgKnErKyA9IDQ7CisgICAgICAgICAgICAgICAgKnErKyA9ICdLJzsKKyAgICAgICAgICAgICAgICAqcSsrID0gJ0wnOworICAgICAgICAgICAgICAgICpxKysgPSAnVic7CisgICAgICAgICAgICAgICAgKnErKyA9ICdBJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdmFsID0gMHhmMDAwIHwgKHEgLSBkZXNjX2xlbmd0aF9wdHIgLSAyKTsKKyAgICAgICAgZGVzY19sZW5ndGhfcHRyWzBdID0gdmFsID4+IDg7CisgICAgICAgIGRlc2NfbGVuZ3RoX3B0clsxXSA9IHZhbDsKKyAgICB9CisKKyAgICBpZiAoZXJyKQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoZSBQTVQgc2VjdGlvbiBjYW5ub3QgZml0IHN0cmVhbSAlZCBhbmQgYWxsIGZvbGxvd2luZyBzdHJlYW1zLlxuIgorICAgICAgICAgICAgICAgIlRyeSByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGxhbmd1YWdlcyBpbiB0aGUgYXVkaW8gc3RyZWFtcyAiCisgICAgICAgICAgICAgICAib3IgdGhlIHRvdGFsIG51bWJlciBvZiBzdHJlYW1zLlxuIiwgaSk7CisKKyAgICBtcGVndHNfd3JpdGVfc2VjdGlvbjEoJnNlcnZpY2UtPnBtdCwgUE1UX1RJRCwgc2VydmljZS0+c2lkLCB0cy0+dGFibGVzX3ZlcnNpb24sIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHEgLSBkYXRhKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogTk9URTogIXN0ciBpcyBhY2NlcHRlZCBmb3IgYW4gZW1wdHkgc3RyaW5nICovCitzdGF0aWMgdm9pZCBwdXRzdHI4KHVpbnQ4X3QgKipxX3B0ciwgY29uc3QgY2hhciAqc3RyKQoreworICAgIHVpbnQ4X3QgKnE7CisgICAgaW50IGxlbjsKKworICAgIHEgPSAqcV9wdHI7CisgICAgaWYgKCFzdHIpCisgICAgICAgIGxlbiA9IDA7CisgICAgZWxzZQorICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKKyAgICAqcSsrID0gbGVuOworICAgIG1lbWNweShxLCBzdHIsIGxlbik7CisgICAgcSAgICAgKz0gbGVuOworICAgICpxX3B0ciA9IHE7Cit9CisKK3N0YXRpYyB2b2lkIG1wZWd0c193cml0ZV9zZHQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1wZWdUU1dyaXRlICp0cyA9IHMtPnByaXZfZGF0YTsKKyAgICBNcGVnVFNTZXJ2aWNlICpzZXJ2aWNlOworICAgIHVpbnQ4X3QgZGF0YVtTRUNUSU9OX0xFTkdUSF0sICpxLCAqZGVzY19saXN0X2xlbl9wdHIsICpkZXNjX2xlbl9wdHI7CisgICAgaW50IGksIHJ1bm5pbmdfc3RhdHVzLCBmcmVlX2NhX21vZGUsIHZhbDsKKworICAgIHEgPSBkYXRhOworICAgIHB1dDE2KCZxLCB0cy0+b25pZCk7CisgICAgKnErKyA9IDB4ZmY7CisgICAgZm9yIChpID0gMDsgaSA8IHRzLT5uYl9zZXJ2aWNlczsgaSsrKSB7CisgICAgICAgIHNlcnZpY2UgPSB0cy0+c2VydmljZXNbaV07CisgICAgICAgIHB1dDE2KCZxLCBzZXJ2aWNlLT5zaWQpOworICAgICAgICAqcSsrICAgICAgICAgICAgICA9IDB4ZmMgfCAweDAwOyAvKiBjdXJyZW50bHkgbm8gRUlUIGluZm8gKi8KKyAgICAgICAgZGVzY19saXN0X2xlbl9wdHIgPSBxOworICAgICAgICBxICAgICAgICAgICAgICAgICs9IDI7CisgICAgICAgIHJ1bm5pbmdfc3RhdHVzICAgID0gNDsgLyogcnVubmluZyAqLworICAgICAgICBmcmVlX2NhX21vZGUgICAgICA9IDA7CisKKyAgICAgICAgLyogd3JpdGUgb25seSBvbmUgZGVzY3JpcHRvciBmb3IgdGhlIHNlcnZpY2UgbmFtZSBhbmQgcHJvdmlkZXIgKi8KKyAgICAgICAgKnErKyAgICAgICAgID0gMHg0ODsKKyAgICAgICAgZGVzY19sZW5fcHRyID0gcTsKKyAgICAgICAgcSsrOworICAgICAgICAqcSsrICAgICAgICAgPSAweDAxOyAvKiBkaWdpdGFsIHRlbGV2aXNpb24gc2VydmljZSAqLworICAgICAgICBwdXRzdHI4KCZxLCBzZXJ2aWNlLT5wcm92aWRlcl9uYW1lKTsKKyAgICAgICAgcHV0c3RyOCgmcSwgc2VydmljZS0+bmFtZSk7CisgICAgICAgIGRlc2NfbGVuX3B0clswXSA9IHEgLSBkZXNjX2xlbl9wdHIgLSAxOworCisgICAgICAgIC8qIGZpbGwgZGVzY3JpcHRvciBsZW5ndGggKi8KKyAgICAgICAgdmFsID0gKHJ1bm5pbmdfc3RhdHVzIDw8IDEzKSB8IChmcmVlX2NhX21vZGUgPDwgMTIpIHwKKyAgICAgICAgICAgICAgKHEgLSBkZXNjX2xpc3RfbGVuX3B0ciAtIDIpOworICAgICAgICBkZXNjX2xpc3RfbGVuX3B0clswXSA9IHZhbCA+PiA4OworICAgICAgICBkZXNjX2xpc3RfbGVuX3B0clsxXSA9IHZhbDsKKyAgICB9CisgICAgbXBlZ3RzX3dyaXRlX3NlY3Rpb24xKCZ0cy0+c2R0LCBTRFRfVElELCB0cy0+dHNpZCwgdHMtPnRhYmxlc192ZXJzaW9uLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBxIC0gZGF0YSk7Cit9CisKK3N0YXRpYyBNcGVnVFNTZXJ2aWNlICptcGVndHNfYWRkX3NlcnZpY2UoTXBlZ1RTV3JpdGUgKnRzLCBpbnQgc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm92aWRlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIE1wZWdUU1NlcnZpY2UgKnNlcnZpY2U7CisKKyAgICBzZXJ2aWNlID0gYXZfbWFsbG9jeihzaXplb2YoTXBlZ1RTU2VydmljZSkpOworICAgIGlmICghc2VydmljZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VydmljZS0+cG10LnBpZCAgICAgICA9IHRzLT5wbXRfc3RhcnRfcGlkICsgdHMtPm5iX3NlcnZpY2VzOworICAgIHNlcnZpY2UtPnNpZCAgICAgICAgICAgPSBzaWQ7CisgICAgc2VydmljZS0+cGNyX3BpZCAgICAgICA9IDB4MWZmZjsKKyAgICBzZXJ2aWNlLT5wcm92aWRlcl9uYW1lID0gYXZfc3RyZHVwKHByb3ZpZGVyX25hbWUpOworICAgIHNlcnZpY2UtPm5hbWUgICAgICAgICAgPSBhdl9zdHJkdXAobmFtZSk7CisgICAgaWYgKCFzZXJ2aWNlLT5wcm92aWRlcl9uYW1lIHx8ICFzZXJ2aWNlLT5uYW1lKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKGF2X2R5bmFycmF5X2FkZF9ub2ZyZWUoJnRzLT5zZXJ2aWNlcywgJnRzLT5uYl9zZXJ2aWNlcywgc2VydmljZSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXR1cm4gc2VydmljZTsKK2ZhaWw6CisgICAgYXZfZnJlZXAoJnNlcnZpY2UtPnByb3ZpZGVyX25hbWUpOworICAgIGF2X2ZyZWVwKCZzZXJ2aWNlLT5uYW1lKTsKKyAgICBhdl9mcmVlKHNlcnZpY2UpOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50NjRfdCBnZXRfcGNyKGNvbnN0IE1wZWdUU1dyaXRlICp0cywgQVZJT0NvbnRleHQgKnBiKQoreworICAgIHJldHVybiBhdl9yZXNjYWxlKGF2aW9fdGVsbChwYikgKyAxMSwgOCAqIFBDUl9USU1FX0JBU0UsIHRzLT5tdXhfcmF0ZSkgKworICAgICAgICAgICB0cy0+Zmlyc3RfcGNyOworfQorCitzdGF0aWMgdm9pZCBtcGVndHNfcHJlZml4X20ydHNfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNcGVnVFNXcml0ZSAqdHMgPSBzLT5wcml2X2RhdGE7CisgICAgaWYgKHRzLT5tMnRzX21vZGUpIHsKKyAgICAgICAgaW50NjRfdCBwY3IgPSBnZXRfcGNyKHMtPnByaXZfZGF0YSwgcy0+cGIpOworICAgICAgICB1aW50MzJfdCB0cF9leHRyYV9oZWFkZXIgPSBwY3IgJSAweDNmZmZmZmZmOworICAgICAgICB0cF9leHRyYV9oZWFkZXIgPSBBVl9SQjMyKCZ0cF9leHRyYV9oZWFkZXIpOworICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCAodW5zaWduZWQgY2hhciAqKSAmdHBfZXh0cmFfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgIHNpemVvZih0cF9leHRyYV9oZWFkZXIpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNlY3Rpb25fd3JpdGVfcGFja2V0KE1wZWdUU1NlY3Rpb24gKnMsIGNvbnN0IHVpbnQ4X3QgKnBhY2tldCkKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKmN0eCA9IHMtPm9wYXF1ZTsKKyAgICBtcGVndHNfcHJlZml4X20ydHNfaGVhZGVyKGN0eCk7CisgICAgYXZpb193cml0ZShjdHgtPnBiLCBwYWNrZXQsIFRTX1BBQ0tFVF9TSVpFKTsKK30KKworc3RhdGljIGludCBtcGVndHNfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNcGVnVFNXcml0ZSAqdHMgPSBzLT5wcml2X2RhdGE7CisgICAgTXBlZ1RTV3JpdGVTdHJlYW0gKnRzX3N0OworICAgIE1wZWdUU1NlcnZpY2UgKnNlcnZpY2U7CisgICAgQVZTdHJlYW0gKnN0LCAqcGNyX3N0ID0gTlVMTDsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGl0bGUsICpwcm92aWRlcjsKKyAgICBpbnQgaSwgajsKKyAgICBjb25zdCBjaGFyICpzZXJ2aWNlX25hbWU7CisgICAgY29uc3QgY2hhciAqcHJvdmlkZXJfbmFtZTsKKyAgICBpbnQgKnBpZHM7CisgICAgaW50IHJldDsKKworICAgIGlmIChzLT5tYXhfZGVsYXkgPCAwKSAvKiBOb3Qgc2V0IGJ5IHRoZSBjYWxsZXIgKi8KKyAgICAgICAgcy0+bWF4X2RlbGF5ID0gMDsKKworICAgIC8vIHJvdW5kIHVwIHRvIGEgd2hvbGUgbnVtYmVyIG9mIFRTIHBhY2tldHMKKyAgICB0cy0+cGVzX3BheWxvYWRfc2l6ZSA9ICh0cy0+cGVzX3BheWxvYWRfc2l6ZSArIDE0ICsgMTgzKSAvIDE4NCAqIDE4NCAtIDE0OworCisgICAgdHMtPnRzaWQgPSB0cy0+dHJhbnNwb3J0X3N0cmVhbV9pZDsKKyAgICB0cy0+b25pZCA9IHRzLT5vcmlnaW5hbF9uZXR3b3JrX2lkOworICAgIC8qIGFsbG9jYXRlIGEgc2luZ2xlIERWQiBzZXJ2aWNlICovCisgICAgdGl0bGUgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInNlcnZpY2VfbmFtZSIsIE5VTEwsIDApOworICAgIGlmICghdGl0bGUpCisgICAgICAgIHRpdGxlID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApOworICAgIHNlcnZpY2VfbmFtZSAgPSB0aXRsZSA/IHRpdGxlLT52YWx1ZSA6IERFRkFVTFRfU0VSVklDRV9OQU1FOworICAgIHByb3ZpZGVyICAgICAgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInNlcnZpY2VfcHJvdmlkZXIiLCBOVUxMLCAwKTsKKyAgICBwcm92aWRlcl9uYW1lID0gcHJvdmlkZXIgPyBwcm92aWRlci0+dmFsdWUgOiBERUZBVUxUX1BST1ZJREVSX05BTUU7CisgICAgc2VydmljZSAgICAgICA9IG1wZWd0c19hZGRfc2VydmljZSh0cywgdHMtPnNlcnZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcl9uYW1lLCBzZXJ2aWNlX25hbWUpOworCisgICAgaWYgKCFzZXJ2aWNlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc2VydmljZS0+cG10LndyaXRlX3BhY2tldCA9IHNlY3Rpb25fd3JpdGVfcGFja2V0OworICAgIHNlcnZpY2UtPnBtdC5vcGFxdWUgICAgICAgPSBzOworICAgIHNlcnZpY2UtPnBtdC5jYyAgICAgICAgICAgPSAxNTsKKworICAgIHRzLT5wYXQucGlkICAgICAgICAgID0gUEFUX1BJRDsKKyAgICAvKiBJbml0aWFsaXplIGF0IDE1IHNvIHRoYXQgaXQgd3JhcHMgYW5kIGlzIGVxdWFsIHRvIDAgZm9yIHRoZQorICAgICAqIGZpcnN0IHBhY2tldCB3ZSB3cml0ZS4gKi8KKyAgICB0cy0+cGF0LmNjICAgICAgICAgICA9IDE1OworICAgIHRzLT5wYXQud3JpdGVfcGFja2V0ID0gc2VjdGlvbl93cml0ZV9wYWNrZXQ7CisgICAgdHMtPnBhdC5vcGFxdWUgICAgICAgPSBzOworCisgICAgdHMtPnNkdC5waWQgICAgICAgICAgPSBTRFRfUElEOworICAgIHRzLT5zZHQuY2MgICAgICAgICAgID0gMTU7CisgICAgdHMtPnNkdC53cml0ZV9wYWNrZXQgPSBzZWN0aW9uX3dyaXRlX3BhY2tldDsKKyAgICB0cy0+c2R0Lm9wYXF1ZSAgICAgICA9IHM7CisKKyAgICBwaWRzID0gYXZfbWFsbG9jX2FycmF5KHMtPm5iX3N0cmVhbXMsIHNpemVvZigqcGlkcykpOworICAgIGlmICghcGlkcykgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiBhc3NpZ24gcGlkcyB0byBlYWNoIHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworCisgICAgICAgIHRzX3N0ID0gYXZfbWFsbG9jeihzaXplb2YoTXBlZ1RTV3JpdGVTdHJlYW0pKTsKKyAgICAgICAgaWYgKCF0c19zdCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHN0LT5wcml2X2RhdGEgPSB0c19zdDsKKworICAgICAgICB0c19zdC0+dXNlcl90YiA9IHN0LT50aW1lX2Jhc2U7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCA5MDAwMCk7CisKKyAgICAgICAgdHNfc3QtPnBheWxvYWQgPSBhdl9tYWxsb2N6KHRzLT5wZXNfcGF5bG9hZF9zaXplKTsKKyAgICAgICAgaWYgKCF0c19zdC0+cGF5bG9hZCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHRzX3N0LT5zZXJ2aWNlID0gc2VydmljZTsKKyAgICAgICAgLyogTVBFRyBwaWQgdmFsdWVzIDwgMTYgYXJlIHJlc2VydmVkLiBBcHBsaWNhdGlvbnMgd2hpY2ggc2V0IHN0LT5pZCBpbgorICAgICAgICAgKiB0aGlzIHJhbmdlIGFyZSBhc3NpZ25lZCBhIGNhbGN1bGF0ZWQgcGlkLiAqLworICAgICAgICBpZiAoc3QtPmlkIDwgMTYpIHsKKyAgICAgICAgICAgIHRzX3N0LT5waWQgPSB0cy0+c3RhcnRfcGlkICsgaTsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+aWQgPCAweDFGRkYpIHsKKyAgICAgICAgICAgIHRzX3N0LT5waWQgPSBzdC0+aWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHN0cmVhbSBpZCAlZCwgbXVzdCBiZSBsZXNzIHRoYW4gODE5MVxuIiwgc3QtPmlkKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAodHNfc3QtPnBpZCA9PSBzZXJ2aWNlLT5wbXQucGlkKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRHVwbGljYXRlIHN0cmVhbSBpZCAlZFxuIiwgdHNfc3QtPnBpZCk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgaWYgKHBpZHNbal0gPT0gdHNfc3QtPnBpZCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJEdXBsaWNhdGUgc3RyZWFtIGlkICVkXG4iLCB0c19zdC0+cGlkKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBpZHNbaV0gICAgICAgICAgICAgICAgPSB0c19zdC0+cGlkOworICAgICAgICB0c19zdC0+cGF5bG9hZF9wdHMgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHRzX3N0LT5wYXlsb2FkX2R0cyAgICAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgdHNfc3QtPmZpcnN0X3B0c19jaGVjayA9IDE7CisgICAgICAgIHRzX3N0LT5jYyAgICAgICAgICAgICAgPSAxNTsKKyAgICAgICAgLyogdXBkYXRlIFBDUiBwaWQgYnkgdXNpbmcgdGhlIGZpcnN0IHZpZGVvIHN0cmVhbSAqLworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgICAgICAgICAgc2VydmljZS0+cGNyX3BpZCA9PSAweDFmZmYpIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPnBjcl9waWQgPSB0c19zdC0+cGlkOworICAgICAgICAgICAgcGNyX3N0ICAgICAgICAgICA9IHN0OworICAgICAgICB9CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAmJgorICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICphc3Q7CisgICAgICAgICAgICB0c19zdC0+YW11eCA9IGF2Zm9ybWF0X2FsbG9jX2NvbnRleHQoKTsKKyAgICAgICAgICAgIGlmICghdHNfc3QtPmFtdXgpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHNfc3QtPmFtdXgtPm9mb3JtYXQgPQorICAgICAgICAgICAgICAgIGF2X2d1ZXNzX2Zvcm1hdCgodHMtPmZsYWdzICYgTVBFR1RTX0ZMQUdfQUFDX0xBVE0pID8gImxhdG0iIDogImFkdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghdHNfc3QtPmFtdXgtPm9mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEoYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbSh0c19zdC0+YW11eCwgTlVMTCkpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfY29weV9jb250ZXh0KGFzdC0+Y29kZWMsIHN0LT5jb2RlYyk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgYXN0LT50aW1lX2Jhc2UgPSBzdC0+dGltZV9iYXNlOworICAgICAgICAgICAgcmV0ID0gYXZmb3JtYXRfd3JpdGVfaGVhZGVyKHRzX3N0LT5hbXV4LCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2ZyZWVwKCZwaWRzKTsKKworICAgIC8qIGlmIG5vIHZpZGVvIHN0cmVhbSwgdXNlIHRoZSBmaXJzdCBzdHJlYW0gYXMgUENSICovCisgICAgaWYgKHNlcnZpY2UtPnBjcl9waWQgPT0gMHgxZmZmICYmIHMtPm5iX3N0cmVhbXMgPiAwKSB7CisgICAgICAgIHBjcl9zdCAgICAgICAgICAgPSBzLT5zdHJlYW1zWzBdOworICAgICAgICB0c19zdCAgICAgICAgICAgID0gcGNyX3N0LT5wcml2X2RhdGE7CisgICAgICAgIHNlcnZpY2UtPnBjcl9waWQgPSB0c19zdC0+cGlkOworICAgIH0gZWxzZQorICAgICAgICB0c19zdCA9IHBjcl9zdC0+cHJpdl9kYXRhOworCisgICAgaWYgKHRzLT5tdXhfcmF0ZSA+IDEpIHsKKyAgICAgICAgc2VydmljZS0+cGNyX3BhY2tldF9wZXJpb2QgPSAodHMtPm11eF9yYXRlICogdHMtPnBjcl9wZXJpb2QpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFNfUEFDS0VUX1NJWkUgKiA4ICogMTAwMCk7CisgICAgICAgIHRzLT5zZHRfcGFja2V0X3BlcmlvZCAgICAgID0gKHRzLT5tdXhfcmF0ZSAqIFNEVF9SRVRSQU5TX1RJTUUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFNfUEFDS0VUX1NJWkUgKiA4ICogMTAwMCk7CisgICAgICAgIHRzLT5wYXRfcGFja2V0X3BlcmlvZCAgICAgID0gKHRzLT5tdXhfcmF0ZSAqIFBBVF9SRVRSQU5TX1RJTUUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFNfUEFDS0VUX1NJWkUgKiA4ICogMTAwMCk7CisKKyAgICAgICAgaWYgKHRzLT5jb3B5dHMgPCAxKQorICAgICAgICAgICAgdHMtPmZpcnN0X3BjciA9IGF2X3Jlc2NhbGUocy0+bWF4X2RlbGF5LCBQQ1JfVElNRV9CQVNFLCBBVl9USU1FX0JBU0UpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEFyYml0cmFyeSB2YWx1ZXMsIFBBVC9QTVQgd2lsbCBhbHNvIGJlIHdyaXR0ZW4gb24gdmlkZW8ga2V5IGZyYW1lcyAqLworICAgICAgICB0cy0+c2R0X3BhY2tldF9wZXJpb2QgPSAyMDA7CisgICAgICAgIHRzLT5wYXRfcGFja2V0X3BlcmlvZCA9IDQwOworICAgICAgICBpZiAocGNyX3N0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGlmICghcGNyX3N0LT5jb2RlYy0+ZnJhbWVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgImZyYW1lIHNpemUgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgc2VydmljZS0+cGNyX3BhY2tldF9wZXJpb2QgPQorICAgICAgICAgICAgICAgICAgICBwY3Jfc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAvICgxMCAqIDUxMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlcnZpY2UtPnBjcl9wYWNrZXRfcGVyaW9kID0KKyAgICAgICAgICAgICAgICAgICAgcGNyX3N0LT5jb2RlYy0+c2FtcGxlX3JhdGUgLyAoMTAgKiBwY3Jfc3QtPmNvZGVjLT5mcmFtZV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG1heCBkZWx0YSBQQ1IgMC4xcworICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIGJlIGF2Z19mcmFtZV9yYXRlCisgICAgICAgICAgICBzZXJ2aWNlLT5wY3JfcGFja2V0X3BlcmlvZCA9CisgICAgICAgICAgICAgICAgdHNfc3QtPnVzZXJfdGIuZGVuIC8gKDEwICogdHNfc3QtPnVzZXJfdGIubnVtKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNlcnZpY2UtPnBjcl9wYWNrZXRfcGVyaW9kKQorICAgICAgICAgICAgc2VydmljZS0+cGNyX3BhY2tldF9wZXJpb2QgPSAxOworICAgIH0KKworICAgIC8vIG91dHB1dCBhIFBDUiBhcyBzb29uIGFzIHBvc3NpYmxlCisgICAgc2VydmljZS0+cGNyX3BhY2tldF9jb3VudCA9IHNlcnZpY2UtPnBjcl9wYWNrZXRfcGVyaW9kOworICAgIHRzLT5wYXRfcGFja2V0X2NvdW50ICAgICAgPSB0cy0+cGF0X3BhY2tldF9wZXJpb2QgLSAxOworICAgIHRzLT5zZHRfcGFja2V0X2NvdW50ICAgICAgPSB0cy0+c2R0X3BhY2tldF9wZXJpb2QgLSAxOworCisgICAgaWYgKHRzLT5tdXhfcmF0ZSA9PSAxKQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJtdXhyYXRlIFZCUiwgIik7CisgICAgZWxzZQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJtdXhyYXRlICVkLCAiLCB0cy0+bXV4X3JhdGUpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgInBjciBldmVyeSAlZCBwa3RzLCBzZHQgZXZlcnkgJWQsIHBhdC9wbXQgZXZlcnkgJWQgcGt0c1xuIiwKKyAgICAgICAgICAgc2VydmljZS0+cGNyX3BhY2tldF9wZXJpb2QsCisgICAgICAgICAgIHRzLT5zZHRfcGFja2V0X3BlcmlvZCwgdHMtPnBhdF9wYWNrZXRfcGVyaW9kKTsKKworICAgIGlmICh0cy0+bTJ0c19tb2RlID09IC0xKSB7CisgICAgICAgIGlmIChhdl9tYXRjaF9leHQocy0+ZmlsZW5hbWUsICJtMnRzIikpIHsKKyAgICAgICAgICAgIHRzLT5tMnRzX21vZGUgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHMtPm0ydHNfbW9kZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9mcmVlcCgmcGlkcyk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzdCAgICA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIHRzX3N0ID0gc3QtPnByaXZfZGF0YTsKKyAgICAgICAgaWYgKHRzX3N0KSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmdHNfc3QtPnBheWxvYWQpOworICAgICAgICAgICAgaWYgKHRzX3N0LT5hbXV4KSB7CisgICAgICAgICAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHRzX3N0LT5hbXV4KTsKKyAgICAgICAgICAgICAgICB0c19zdC0+YW11eCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZXAoJnN0LT5wcml2X2RhdGEpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCB0cy0+bmJfc2VydmljZXM7IGkrKykgeworICAgICAgICBzZXJ2aWNlID0gdHMtPnNlcnZpY2VzW2ldOworICAgICAgICBhdl9mcmVlcCgmc2VydmljZS0+cHJvdmlkZXJfbmFtZSk7CisgICAgICAgIGF2X2ZyZWVwKCZzZXJ2aWNlLT5uYW1lKTsKKyAgICAgICAgYXZfZnJlZShzZXJ2aWNlKTsKKyAgICB9CisgICAgYXZfZnJlZSh0cy0+c2VydmljZXMpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIHNlbmQgU0RULCBQQVQgYW5kIFBNVCB0YWJsZXMgcmVndWxhcnkgKi8KK3N0YXRpYyB2b2lkIHJldHJhbnNtaXRfc2lfaW5mbyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBmb3JjZV9wYXQpCit7CisgICAgTXBlZ1RTV3JpdGUgKnRzID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgaWYgKCsrdHMtPnNkdF9wYWNrZXRfY291bnQgPT0gdHMtPnNkdF9wYWNrZXRfcGVyaW9kKSB7CisgICAgICAgIHRzLT5zZHRfcGFja2V0X2NvdW50ID0gMDsKKyAgICAgICAgbXBlZ3RzX3dyaXRlX3NkdChzKTsKKyAgICB9CisgICAgaWYgKCsrdHMtPnBhdF9wYWNrZXRfY291bnQgPT0gdHMtPnBhdF9wYWNrZXRfcGVyaW9kIHx8IGZvcmNlX3BhdCkgeworICAgICAgICB0cy0+cGF0X3BhY2tldF9jb3VudCA9IDA7CisgICAgICAgIG1wZWd0c193cml0ZV9wYXQocyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0cy0+bmJfc2VydmljZXM7IGkrKykKKyAgICAgICAgICAgIG1wZWd0c193cml0ZV9wbXQocywgdHMtPnNlcnZpY2VzW2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfcGNyX2JpdHModWludDhfdCAqYnVmLCBpbnQ2NF90IHBjcikKK3sKKyAgICBpbnQ2NF90IHBjcl9sb3cgPSBwY3IgJSAzMDAsIHBjcl9oaWdoID0gcGNyIC8gMzAwOworCisgICAgKmJ1ZisrID0gcGNyX2hpZ2ggPj4gMjU7CisgICAgKmJ1ZisrID0gcGNyX2hpZ2ggPj4gMTc7CisgICAgKmJ1ZisrID0gcGNyX2hpZ2ggPj4gIDk7CisgICAgKmJ1ZisrID0gcGNyX2hpZ2ggPj4gIDE7CisgICAgKmJ1ZisrID0gcGNyX2hpZ2ggPDwgIDcgfCBwY3JfbG93ID4+IDggfCAweDdlOworICAgICpidWYrKyA9IHBjcl9sb3c7CisKKyAgICByZXR1cm4gNjsKK30KKworLyogV3JpdGUgYSBzaW5nbGUgbnVsbCB0cmFuc3BvcnQgc3RyZWFtIHBhY2tldCAqLworc3RhdGljIHZvaWQgbXBlZ3RzX2luc2VydF9udWxsX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgdWludDhfdCAqcTsKKyAgICB1aW50OF90IGJ1ZltUU19QQUNLRVRfU0laRV07CisKKyAgICBxICAgID0gYnVmOworICAgICpxKysgPSAweDQ3OworICAgICpxKysgPSAweDAwIHwgMHgxZjsKKyAgICAqcSsrID0gMHhmZjsKKyAgICAqcSsrID0gMHgxMDsKKyAgICBtZW1zZXQocSwgMHgwRkYsIFRTX1BBQ0tFVF9TSVpFIC0gKHEgLSBidWYpKTsKKyAgICBtcGVndHNfcHJlZml4X20ydHNfaGVhZGVyKHMpOworICAgIGF2aW9fd3JpdGUocy0+cGIsIGJ1ZiwgVFNfUEFDS0VUX1NJWkUpOworfQorCisvKiBXcml0ZSBhIHNpbmdsZSB0cmFuc3BvcnQgc3RyZWFtIHBhY2tldCB3aXRoIGEgUENSIGFuZCBubyBwYXlsb2FkICovCitzdGF0aWMgdm9pZCBtcGVndHNfaW5zZXJ0X3Bjcl9vbmx5KEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0KQoreworICAgIE1wZWdUU1dyaXRlICp0cyA9IHMtPnByaXZfZGF0YTsKKyAgICBNcGVnVFNXcml0ZVN0cmVhbSAqdHNfc3QgPSBzdC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKnE7CisgICAgdWludDhfdCBidWZbVFNfUEFDS0VUX1NJWkVdOworCisgICAgcSAgICA9IGJ1ZjsKKyAgICAqcSsrID0gMHg0NzsKKyAgICAqcSsrID0gdHNfc3QtPnBpZCA+PiA4OworICAgICpxKysgPSB0c19zdC0+cGlkOworICAgICpxKysgPSAweDIwIHwgdHNfc3QtPmNjOyAgIC8qIEFkYXB0YXRpb24gb25seSAqLworICAgIC8qIENvbnRpbnVpdHkgQ291bnQgZmllbGQgZG9lcyBub3QgaW5jcmVtZW50IChzZWUgMTM4MTgtMSBzZWN0aW9uIDIuNC4zLjMpICovCisgICAgKnErKyA9IFRTX1BBQ0tFVF9TSVpFIC0gNTsgLyogQWRhcHRhdGlvbiBGaWVsZCBMZW5ndGggKi8KKyAgICAqcSsrID0gMHgxMDsgICAgICAgICAgICAgICAvKiBBZGFwdGF0aW9uIGZsYWdzOiBQQ1IgcHJlc2VudCAqLworCisgICAgLyogUENSIGNvZGVkIGludG8gNiBieXRlcyAqLworICAgIHEgKz0gd3JpdGVfcGNyX2JpdHMocSwgZ2V0X3Bjcih0cywgcy0+cGIpKTsKKworICAgIC8qIHN0dWZmaW5nIGJ5dGVzICovCisgICAgbWVtc2V0KHEsIDB4RkYsIFRTX1BBQ0tFVF9TSVpFIC0gKHEgLSBidWYpKTsKKyAgICBtcGVndHNfcHJlZml4X20ydHNfaGVhZGVyKHMpOworICAgIGF2aW9fd3JpdGUocy0+cGIsIGJ1ZiwgVFNfUEFDS0VUX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9wdHModWludDhfdCAqcSwgaW50IGZvdXJiaXRzLCBpbnQ2NF90IHB0cykKK3sKKyAgICBpbnQgdmFsOworCisgICAgdmFsICA9IGZvdXJiaXRzIDw8IDQgfCAoKChwdHMgPj4gMzApICYgMHgwNykgPDwgMSkgfCAxOworICAgICpxKysgPSB2YWw7CisgICAgdmFsICA9ICgoKHB0cyA+PiAxNSkgJiAweDdmZmYpIDw8IDEpIHwgMTsKKyAgICAqcSsrID0gdmFsID4+IDg7CisgICAgKnErKyA9IHZhbDsKKyAgICB2YWwgID0gKCgocHRzKSAmIDB4N2ZmZikgPDwgMSkgfCAxOworICAgICpxKysgPSB2YWwgPj4gODsKKyAgICAqcSsrID0gdmFsOworfQorCisvKiBTZXQgYW4gYWRhcHRhdGlvbiBmaWVsZCBmbGFnIGluIGFuIE1QRUctVFMgcGFja2V0Ki8KK3N0YXRpYyB2b2lkIHNldF9hZl9mbGFnKHVpbnQ4X3QgKnBrdCwgaW50IGZsYWcpCit7CisgICAgLy8gZXhwZWN0IGF0IGxlYXN0IG9uZSBmbGFnIHRvIHNldAorICAgIGF2X2Fzc2VydDAoZmxhZyk7CisKKyAgICBpZiAoKHBrdFszXSAmIDB4MjApID09IDApIHsKKyAgICAgICAgLy8gbm8gQUYgeWV0LCBzZXQgYWRhcHRhdGlvbiBmaWVsZCBmbGFnCisgICAgICAgIHBrdFszXSB8PSAweDIwOworICAgICAgICAvLyAxIGJ5dGUgbGVuZ3RoLCBubyBmbGFncworICAgICAgICBwa3RbNF0gPSAxOworICAgICAgICBwa3RbNV0gPSAwOworICAgIH0KKyAgICBwa3RbNV0gfD0gZmxhZzsKK30KKworLyogRXh0ZW5kIHRoZSBhZGFwdGF0aW9uIGZpZWxkIGJ5IHNpemUgYnl0ZXMgKi8KK3N0YXRpYyB2b2lkIGV4dGVuZF9hZih1aW50OF90ICpwa3QsIGludCBzaXplKQoreworICAgIC8vIGV4cGVjdCBhbHJlYWR5IGV4aXN0aW5nIGFkYXB0YXRpb24gZmllbGQKKyAgICBhdl9hc3NlcnQwKHBrdFszXSAmIDB4MjApOworICAgIHBrdFs0XSArPSBzaXplOworfQorCisvKiBHZXQgYSBwb2ludGVyIHRvIE1QRUctVFMgcGF5bG9hZCAocmlnaHQgYWZ0ZXIgVFMgcGFja2V0IGhlYWRlcikgKi8KK3N0YXRpYyB1aW50OF90ICpnZXRfdHNfcGF5bG9hZF9zdGFydCh1aW50OF90ICpwa3QpCit7CisgICAgaWYgKHBrdFszXSAmIDB4MjApCisgICAgICAgIHJldHVybiBwa3QgKyA1ICsgcGt0WzRdOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHBrdCArIDQ7Cit9CisKKy8qIEFkZCBhIFBFUyBoZWFkZXIgdG8gdGhlIGZyb250IG9mIHRoZSBwYXlsb2FkLCBhbmQgc2VnbWVudCBpbnRvIGFuIGludGVnZXIKKyAqIG51bWJlciBvZiBUUyBwYWNrZXRzLiBUaGUgZmluYWwgVFMgcGFja2V0IGlzIHBhZGRlZCB1c2luZyBhbiBvdmVyc2l6ZWQKKyAqIGFkYXB0YXRpb24gaGVhZGVyIHRvIGV4YWN0bHkgZmlsbCB0aGUgbGFzdCBUUyBwYWNrZXQuCisgKiBOT1RFOiAncGF5bG9hZCcgY29udGFpbnMgYSBjb21wbGV0ZSBQRVMgcGF5bG9hZC4gKi8KK3N0YXRpYyB2b2lkIG1wZWd0c193cml0ZV9wZXMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBheWxvYWQsIGludCBwYXlsb2FkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzLCBpbnQ2NF90IGR0cywgaW50IGtleSkKK3sKKyAgICBNcGVnVFNXcml0ZVN0cmVhbSAqdHNfc3QgPSBzdC0+cHJpdl9kYXRhOworICAgIE1wZWdUU1dyaXRlICp0cyA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50OF90IGJ1ZltUU19QQUNLRVRfU0laRV07CisgICAgdWludDhfdCAqcTsKKyAgICBpbnQgdmFsLCBpc19zdGFydCwgbGVuLCBoZWFkZXJfbGVuLCB3cml0ZV9wY3IsIGlzX2R2Yl9zdWJ0aXRsZSwgaXNfZHZiX3RlbGV0ZXh0LCBmbGFnczsKKyAgICBpbnQgYWZjX2xlbiwgc3R1ZmZpbmdfbGVuOworICAgIGludDY0X3QgcGNyID0gLTE7IC8qIGF2b2lkIHdhcm5pbmcgKi8KKyAgICBpbnQ2NF90IGRlbGF5ID0gYXZfcmVzY2FsZShzLT5tYXhfZGVsYXksIDkwMDAwLCBBVl9USU1FX0JBU0UpOworICAgIGludCBmb3JjZV9wYXQgPSBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIGtleSAmJiAhdHNfc3QtPnByZXZfcGF5bG9hZF9rZXk7CisKKyAgICBpc19zdGFydCA9IDE7CisgICAgd2hpbGUgKHBheWxvYWRfc2l6ZSA+IDApIHsKKyAgICAgICAgcmV0cmFuc21pdF9zaV9pbmZvKHMsIGZvcmNlX3BhdCk7CisgICAgICAgIGZvcmNlX3BhdCA9IDA7CisKKyAgICAgICAgd3JpdGVfcGNyID0gMDsKKyAgICAgICAgaWYgKHRzX3N0LT5waWQgPT0gdHNfc3QtPnNlcnZpY2UtPnBjcl9waWQpIHsKKyAgICAgICAgICAgIGlmICh0cy0+bXV4X3JhdGUgPiAxIHx8IGlzX3N0YXJ0KSAvLyBWQlIgcGNyIHBlcmlvZCBpcyBiYXNlZCBvbiBmcmFtZXMKKyAgICAgICAgICAgICAgICB0c19zdC0+c2VydmljZS0+cGNyX3BhY2tldF9jb3VudCsrOworICAgICAgICAgICAgaWYgKHRzX3N0LT5zZXJ2aWNlLT5wY3JfcGFja2V0X2NvdW50ID49CisgICAgICAgICAgICAgICAgdHNfc3QtPnNlcnZpY2UtPnBjcl9wYWNrZXRfcGVyaW9kKSB7CisgICAgICAgICAgICAgICAgdHNfc3QtPnNlcnZpY2UtPnBjcl9wYWNrZXRfY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdyaXRlX3BjciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodHMtPm11eF9yYXRlID4gMSAmJiBkdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgICAgIChkdHMgLSBnZXRfcGNyKHRzLCBzLT5wYikgLyAzMDApID4gZGVsYXkpIHsKKyAgICAgICAgICAgIC8qIHBjciBpbnNlcnQgZ2V0cyBwcmlvcml0eSBvdmVyIG51bGwgcGFja2V0IGluc2VydCAqLworICAgICAgICAgICAgaWYgKHdyaXRlX3BjcikKKyAgICAgICAgICAgICAgICBtcGVndHNfaW5zZXJ0X3Bjcl9vbmx5KHMsIHN0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtcGVndHNfaW5zZXJ0X251bGxfcGFja2V0KHMpOworICAgICAgICAgICAgLyogcmVjYWxjdWxhdGUgd3JpdGVfcGNyIGFuZCBwb3NzaWJseSByZXRyYW5zbWl0IHNpX2luZm8gKi8KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogcHJlcGFyZSBwYWNrZXQgaGVhZGVyICovCisgICAgICAgIHEgICAgPSBidWY7CisgICAgICAgICpxKysgPSAweDQ3OworICAgICAgICB2YWwgID0gdHNfc3QtPnBpZCA+PiA4OworICAgICAgICBpZiAoaXNfc3RhcnQpCisgICAgICAgICAgICB2YWwgfD0gMHg0MDsKKyAgICAgICAgKnErKyAgICAgID0gdmFsOworICAgICAgICAqcSsrICAgICAgPSB0c19zdC0+cGlkOworICAgICAgICB0c19zdC0+Y2MgPSB0c19zdC0+Y2MgKyAxICYgMHhmOworICAgICAgICAqcSsrICAgICAgPSAweDEwIHwgdHNfc3QtPmNjOyAvLyBwYXlsb2FkIGluZGljYXRvciArIENDCisgICAgICAgIGlmIChrZXkgJiYgaXNfc3RhcnQgJiYgcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAvLyBzZXQgUmFuZG9tIEFjY2VzcyBmb3Iga2V5IGZyYW1lcworICAgICAgICAgICAgaWYgKHRzX3N0LT5waWQgPT0gdHNfc3QtPnNlcnZpY2UtPnBjcl9waWQpCisgICAgICAgICAgICAgICAgd3JpdGVfcGNyID0gMTsKKyAgICAgICAgICAgIHNldF9hZl9mbGFnKGJ1ZiwgMHg0MCk7CisgICAgICAgICAgICBxID0gZ2V0X3RzX3BheWxvYWRfc3RhcnQoYnVmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JpdGVfcGNyKSB7CisgICAgICAgICAgICBzZXRfYWZfZmxhZyhidWYsIDB4MTApOworICAgICAgICAgICAgcSA9IGdldF90c19wYXlsb2FkX3N0YXJ0KGJ1Zik7CisgICAgICAgICAgICAvLyBhZGQgMTEsIHBjciByZWZlcmVuY2VzIHRoZSBsYXN0IGJ5dGUgb2YgcHJvZ3JhbSBjbG9jayByZWZlcmVuY2UgYmFzZQorICAgICAgICAgICAgaWYgKHRzLT5tdXhfcmF0ZSA+IDEpCisgICAgICAgICAgICAgICAgcGNyID0gZ2V0X3Bjcih0cywgcy0+cGIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBjciA9IChkdHMgLSBkZWxheSkgKiAzMDA7CisgICAgICAgICAgICBpZiAoZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIGR0cyA8IHBjciAvIDMwMCkKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJkdHMgPCBwY3IsIFRTIGlzIGludmFsaWRcbiIpOworICAgICAgICAgICAgZXh0ZW5kX2FmKGJ1Ziwgd3JpdGVfcGNyX2JpdHMocSwgcGNyKSk7CisgICAgICAgICAgICBxID0gZ2V0X3RzX3BheWxvYWRfc3RhcnQoYnVmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNfc3RhcnQpIHsKKyAgICAgICAgICAgIGludCBwZXNfZXh0ZW5zaW9uID0gMDsKKyAgICAgICAgICAgIGludCBwZXNfaGVhZGVyX3N0dWZmaW5nX2J5dGVzID0gMDsKKyAgICAgICAgICAgIC8qIHdyaXRlIFBFUyBoZWFkZXIgKi8KKyAgICAgICAgICAgICpxKysgPSAweDAwOworICAgICAgICAgICAgKnErKyA9IDB4MDA7CisgICAgICAgICAgICAqcSsrID0gMHgwMTsKKyAgICAgICAgICAgIGlzX2R2Yl9zdWJ0aXRsZSA9IDA7CisgICAgICAgICAgICBpc19kdmJfdGVsZXRleHQgPSAwOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ESVJBQykKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9IDB4ZmQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqcSsrID0gMHhlMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgICAgICAgICAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykpIHsKKyAgICAgICAgICAgICAgICAqcSsrID0gMHhjMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRzLT5tMnRzX21vZGUpIHsKKyAgICAgICAgICAgICAgICAqcSsrID0gMHhmZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKnErKyA9IDB4YmQ7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc19kdmJfc3VidGl0bGUgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1RFTEVURVhUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc19kdmJfdGVsZXRleHQgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaGVhZGVyX2xlbiA9IDA7CisgICAgICAgICAgICBmbGFncyAgICAgID0gMDsKKyAgICAgICAgICAgIGlmIChwdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJfbGVuICs9IDU7CisgICAgICAgICAgICAgICAgZmxhZ3MgICAgICB8PSAweDgwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGR0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBwdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgZHRzICE9IHB0cykgeworICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4gKz0gNTsKKyAgICAgICAgICAgICAgICBmbGFncyAgICAgIHw9IDB4NDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRElSQUMpIHsKKyAgICAgICAgICAgICAgICAvKiBzZXQgUEVTX2V4dGVuc2lvbl9mbGFnICovCisgICAgICAgICAgICAgICAgcGVzX2V4dGVuc2lvbiA9IDE7CisgICAgICAgICAgICAgICAgZmxhZ3MgICAgICAgIHw9IDB4MDE7CisKKyAgICAgICAgICAgICAgICAvKiBPbmUgYnl0ZSBmb3IgUEVTMiBleHRlbnNpb24gZmxhZyArCisgICAgICAgICAgICAgICAgICogb25lIGJ5dGUgZm9yIGV4dGVuc2lvbiBsZW5ndGggKworICAgICAgICAgICAgICAgICAqIG9uZSBieXRlIGZvciBleHRlbnNpb24gaWQgKi8KKyAgICAgICAgICAgICAgICBoZWFkZXJfbGVuICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBmb3IgQmx1LXJheSBBQzMgQXVkaW8gdGhlIFBFUyBFeHRlbnNpb24gZmxhZyBzaG91bGQgYmUgYXMgZm9sbG93CisgICAgICAgICAgICAgKiBvdGhlcndpc2UgaXQgd2lsbCBub3QgcGxheSBzb3VuZCBvbiBibHUtcmF5CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh0cy0+bTJ0c19tb2RlICYmCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgUEVTX2V4dGVuc2lvbl9mbGFnICovCisgICAgICAgICAgICAgICAgICAgICAgICBwZXNfZXh0ZW5zaW9uID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IDB4MDE7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfbGVuICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNfZHZiX3RlbGV0ZXh0KSB7CisgICAgICAgICAgICAgICAgcGVzX2hlYWRlcl9zdHVmZmluZ19ieXRlcyA9IDB4MjQgLSBoZWFkZXJfbGVuOworICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4gPSAweDI0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuID0gcGF5bG9hZF9zaXplICsgaGVhZGVyX2xlbiArIDM7CisgICAgICAgICAgICAvKiAzIGV4dHJhIGJ5dGVzIHNob3VsZCBiZSBhZGRlZCB0byBEVkIgc3VidGl0bGUgcGF5bG9hZDogMHgyMCAweDAwIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHRyYWlsaW5nIDB4ZmYgKi8KKyAgICAgICAgICAgIGlmIChpc19kdmJfc3VidGl0bGUpIHsKKyAgICAgICAgICAgICAgICBsZW4gKz0gMzsKKyAgICAgICAgICAgICAgICBwYXlsb2FkX3NpemUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW4gPiAweGZmZmYpCisgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgIGlmICh0cy0+b21pdF92aWRlb19wZXNfbGVuZ3RoICYmIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnErKyA9IGxlbiA+PiA4OworICAgICAgICAgICAgKnErKyA9IGxlbjsKKyAgICAgICAgICAgIHZhbCAgPSAweDgwOworICAgICAgICAgICAgLyogZGF0YSBhbGlnbm1lbnQgaW5kaWNhdG9yIGlzIHJlcXVpcmVkIGZvciBzdWJ0aXRsZSBhbmQgZGF0YSBzdHJlYW1zICovCisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSB8fCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0RBVEEpCisgICAgICAgICAgICAgICAgdmFsIHw9IDB4MDQ7CisgICAgICAgICAgICAqcSsrID0gdmFsOworICAgICAgICAgICAgKnErKyA9IGZsYWdzOworICAgICAgICAgICAgKnErKyA9IGhlYWRlcl9sZW47CisgICAgICAgICAgICBpZiAocHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgd3JpdGVfcHRzKHEsIGZsYWdzID4+IDYsIHB0cyk7CisgICAgICAgICAgICAgICAgcSArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGR0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBwdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgZHRzICE9IHB0cykgeworICAgICAgICAgICAgICAgIHdyaXRlX3B0cyhxLCAxLCBkdHMpOworICAgICAgICAgICAgICAgIHEgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwZXNfZXh0ZW5zaW9uICYmIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRElSQUMpIHsKKyAgICAgICAgICAgICAgICBmbGFncyA9IDB4MDE7ICAvKiBzZXQgUEVTX2V4dGVuc2lvbl9mbGFnXzIgKi8KKyAgICAgICAgICAgICAgICAqcSsrICA9IGZsYWdzOworICAgICAgICAgICAgICAgICpxKysgID0gMHg4MCB8IDB4MDE7IC8qIG1hcmtlciBiaXQgKyBleHRlbnNpb24gbGVuZ3RoICovCisgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBzdHJlYW0gSUQgZXh0ZW5zaW9uIGZsYWcgYml0IHRvIDAgYW5kCisgICAgICAgICAgICAgICAgICogd3JpdGUgdGhlIGV4dGVuZGVkIHN0cmVhbSBJRC4gKi8KKyAgICAgICAgICAgICAgICAqcSsrID0gMHgwMCB8IDB4NjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBGb3IgQmx1LXJheSBBQzMgQXVkaW8gU2V0dGluZyBleHRlbmRlZCBmbGFncyAqLworICAgICAgICAgIGlmICh0cy0+bTJ0c19tb2RlICYmCisgICAgICAgICAgICAgIHBlc19leHRlbnNpb24gJiYKKyAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpIHsKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IDB4MDE7IC8qIHNldCBQRVNfZXh0ZW5zaW9uX2ZsYWdfMiAqLworICAgICAgICAgICAgICAgICAgICAgICpxKysgPSBmbGFnczsKKyAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gMHg4MCB8IDB4MDE7IC8qIG1hcmtlciBiaXQgKyBleHRlbnNpb24gbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IDB4MDAgfCAweDcxOyAvKiBmb3IgQUMzIEF1ZGlvIChzcGVjaWZpY2FsbHkgb24gYmx1ZS1yYXlzKSAqLworICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKGlzX2R2Yl9zdWJ0aXRsZSkgeworICAgICAgICAgICAgICAgIC8qIEZpcnN0IHR3byBmaWVsZHMgb2YgRFZCIHN1YnRpdGxlcyBQRVMgZGF0YToKKyAgICAgICAgICAgICAgICAgKiBkYXRhX2lkZW50aWZpZXI6IGZvciBEVkIgc3VidGl0bGUgc3RyZWFtcyBzaGFsbCBiZSBjb2RlZCB3aXRoIHRoZSB2YWx1ZSAweDIwCisgICAgICAgICAgICAgICAgICogc3VidGl0bGVfc3RyZWFtX2lkOiBmb3IgRFZCIHN1YnRpdGxlIHN0cmVhbSBzaGFsbCBiZSBpZGVudGlmaWVkIGJ5IHRoZSB2YWx1ZSAweDAwICovCisgICAgICAgICAgICAgICAgKnErKyA9IDB4MjA7CisgICAgICAgICAgICAgICAgKnErKyA9IDB4MDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNfZHZiX3RlbGV0ZXh0KSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHEsIDB4ZmYsIHBlc19oZWFkZXJfc3R1ZmZpbmdfYnl0ZXMpOworICAgICAgICAgICAgICAgIHEgKz0gcGVzX2hlYWRlcl9zdHVmZmluZ19ieXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzX3N0YXJ0ID0gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBoZWFkZXIgc2l6ZSAqLworICAgICAgICBoZWFkZXJfbGVuID0gcSAtIGJ1ZjsKKyAgICAgICAgLyogZGF0YSBsZW4gKi8KKyAgICAgICAgbGVuID0gVFNfUEFDS0VUX1NJWkUgLSBoZWFkZXJfbGVuOworICAgICAgICBpZiAobGVuID4gcGF5bG9hZF9zaXplKQorICAgICAgICAgICAgbGVuID0gcGF5bG9hZF9zaXplOworICAgICAgICBzdHVmZmluZ19sZW4gPSBUU19QQUNLRVRfU0laRSAtIGhlYWRlcl9sZW4gLSBsZW47CisgICAgICAgIGlmIChzdHVmZmluZ19sZW4gPiAwKSB7CisgICAgICAgICAgICAvKiBhZGQgc3R1ZmZpbmcgd2l0aCBBRkMgKi8KKyAgICAgICAgICAgIGlmIChidWZbM10gJiAweDIwKSB7CisgICAgICAgICAgICAgICAgLyogc3R1ZmZpbmcgYWxyZWFkeSBwcmVzZW50OiBpbmNyZWFzZSBpdHMgc2l6ZSAqLworICAgICAgICAgICAgICAgIGFmY19sZW4gPSBidWZbNF0gKyAxOworICAgICAgICAgICAgICAgIG1lbW1vdmUoYnVmICsgNCArIGFmY19sZW4gKyBzdHVmZmluZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBidWYgKyA0ICsgYWZjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4gLSAoNCArIGFmY19sZW4pKTsKKyAgICAgICAgICAgICAgICBidWZbNF0gKz0gc3R1ZmZpbmdfbGVuOworICAgICAgICAgICAgICAgIG1lbXNldChidWYgKyA0ICsgYWZjX2xlbiwgMHhmZiwgc3R1ZmZpbmdfbGVuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogYWRkIHN0dWZmaW5nICovCisgICAgICAgICAgICAgICAgbWVtbW92ZShidWYgKyA0ICsgc3R1ZmZpbmdfbGVuLCBidWYgKyA0LCBoZWFkZXJfbGVuIC0gNCk7CisgICAgICAgICAgICAgICAgYnVmWzNdIHw9IDB4MjA7CisgICAgICAgICAgICAgICAgYnVmWzRdICA9IHN0dWZmaW5nX2xlbiAtIDE7CisgICAgICAgICAgICAgICAgaWYgKHN0dWZmaW5nX2xlbiA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zls1XSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChidWYgKyA2LCAweGZmLCBzdHVmZmluZ19sZW4gLSAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNfZHZiX3N1YnRpdGxlICYmIHBheWxvYWRfc2l6ZSA9PSBsZW4pIHsKKyAgICAgICAgICAgIG1lbWNweShidWYgKyBUU19QQUNLRVRfU0laRSAtIGxlbiwgcGF5bG9hZCwgbGVuIC0gMSk7CisgICAgICAgICAgICBidWZbVFNfUEFDS0VUX1NJWkUgLSAxXSA9IDB4ZmY7IC8qIGVuZF9vZl9QRVNfZGF0YV9maWVsZF9tYXJrZXI6IGFuIDgtYml0IGZpZWxkIHdpdGggZml4ZWQgY29udGVudHMgMHhmZiBmb3IgRFZCIHN1YnRpdGxlICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkoYnVmICsgVFNfUEFDS0VUX1NJWkUgLSBsZW4sIHBheWxvYWQsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwYXlsb2FkICAgICAgKz0gbGVuOworICAgICAgICBwYXlsb2FkX3NpemUgLT0gbGVuOworICAgICAgICBtcGVndHNfcHJlZml4X20ydHNfaGVhZGVyKHMpOworICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCBidWYsIFRTX1BBQ0tFVF9TSVpFKTsKKyAgICB9CisgICAgdHNfc3QtPnByZXZfcGF5bG9hZF9rZXkgPSBrZXk7Cit9CisKK2ludCBmZl9jaGVja19oMjY0X3N0YXJ0Y29kZShBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IEFWU3RyZWFtICpzdCwgY29uc3QgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpZiAocGt0LT5zaXplIDwgNSB8fCBBVl9SQjMyKHBrdC0+ZGF0YSkgIT0gMHgwMDAwMDAxKSB7CisgICAgICAgIGlmICghc3QtPm5iX2ZyYW1lcykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkguMjY0IGJpdHN0cmVhbSBtYWxmb3JtZWQsICIKKyAgICAgICAgICAgICAgICAgICAibm8gc3RhcnRjb2RlIGZvdW5kLCB1c2UgdGhlIHZpZGVvIGJpdHN0cmVhbSBmaWx0ZXIgJ2gyNjRfbXA0dG9hbm5leGInIHRvIGZpeCBpdCAiCisgICAgICAgICAgICAgICAgICAgIignLWJzZjp2IGgyNjRfbXA0dG9hbm5leGInIG9wdGlvbiB3aXRoIGZmbXBlZylcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiSC4yNjQgYml0c3RyZWFtIGVycm9yLCBzdGFydGNvZGUgbWlzc2luZywgc2l6ZSAlZCIsIHBrdC0+c2l6ZSk7CisgICAgICAgIGlmIChwa3QtPnNpemUpIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIiBkYXRhICUwOFgiLCBBVl9SQjMyKHBrdC0+ZGF0YSkpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJcbiIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19oZXZjX3N0YXJ0Y29kZShBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IEFWU3RyZWFtICpzdCwgY29uc3QgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpZiAocGt0LT5zaXplIDwgNSB8fCBBVl9SQjMyKHBrdC0+ZGF0YSkgIT0gMHgwMDAwMDAxKSB7CisgICAgICAgIGlmICghc3QtPm5iX2ZyYW1lcykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkhFVkMgYml0c3RyZWFtIG1hbGZvcm1lZCwgbm8gc3RhcnRjb2RlIGZvdW5kXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJIRVZDIGJpdHN0cmVhbSBlcnJvciwgc3RhcnRjb2RlIG1pc3NpbmcsIHNpemUgJWQiLCBwa3QtPnNpemUpOworICAgICAgICBpZiAocGt0LT5zaXplKSBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICIgZGF0YSAlMDhYIiwgQVZfUkIzMihwa3QtPmRhdGEpKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBlZ3RzX3dyaXRlX3BhY2tldF9pbnRlcm5hbChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgaW50IHNpemUgPSBwa3QtPnNpemU7CisgICAgdWludDhfdCAqYnVmID0gcGt0LT5kYXRhOworICAgIHVpbnQ4X3QgKmRhdGEgPSBOVUxMOworICAgIE1wZWdUU1dyaXRlICp0cyA9IHMtPnByaXZfZGF0YTsKKyAgICBNcGVnVFNXcml0ZVN0cmVhbSAqdHNfc3QgPSBzdC0+cHJpdl9kYXRhOworICAgIGNvbnN0IGludDY0X3QgZGVsYXkgPSBhdl9yZXNjYWxlKHMtPm1heF9kZWxheSwgOTAwMDAsIEFWX1RJTUVfQkFTRSkgKiAyOworICAgIGludDY0X3QgZHRzID0gcGt0LT5kdHMsIHB0cyA9IHBrdC0+cHRzOworCisgICAgaWYgKHRzLT5yZWVtaXRfcGF0X3BtdCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAicmVzZW5kX2hlYWRlcnMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQsIHVzZSAtbXBlZ3RzX2ZsYWdzIHJlc2VuZF9oZWFkZXJzXG4iKTsKKyAgICAgICAgdHMtPnJlZW1pdF9wYXRfcG10ID0gMDsKKyAgICAgICAgdHMtPmZsYWdzICAgICAgICAgfD0gTVBFR1RTX0ZMQUdfUkVFTUlUX1BBVF9QTVQ7CisgICAgfQorCisgICAgaWYgKHRzLT5mbGFncyAmIE1QRUdUU19GTEFHX1JFRU1JVF9QQVRfUE1UKSB7CisgICAgICAgIHRzLT5wYXRfcGFja2V0X2NvdW50ID0gdHMtPnBhdF9wYWNrZXRfcGVyaW9kIC0gMTsKKyAgICAgICAgdHMtPnNkdF9wYWNrZXRfY291bnQgPSB0cy0+c2R0X3BhY2tldF9wZXJpb2QgLSAxOworICAgICAgICB0cy0+ZmxhZ3MgICAgICAgICAgICY9IH5NUEVHVFNfRkxBR19SRUVNSVRfUEFUX1BNVDsKKyAgICB9CisKKyAgICBpZiAodHMtPmNvcHl0cyA8IDEpIHsKKyAgICAgICAgaWYgKHB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHB0cyArPSBkZWxheTsKKyAgICAgICAgaWYgKGR0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIGR0cyArPSBkZWxheTsKKyAgICB9CisKKyAgICBpZiAodHNfc3QtPmZpcnN0X3B0c19jaGVjayAmJiBwdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImZpcnN0IHB0cyB2YWx1ZSBtdXN0IGJlIHNldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICB0c19zdC0+Zmlyc3RfcHRzX2NoZWNrID0gMDsKKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcCA9IGJ1ZiwgKmJ1Zl9lbmQgPSBwICsgc2l6ZTsKKyAgICAgICAgdWludDMyX3Qgc3RhdGUgPSAtMTsKKyAgICAgICAgaW50IHJldCA9IGZmX2NoZWNrX2gyNjRfc3RhcnRjb2RlKHMsIHN0LCBwa3QpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgcCA9IGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUocCwgYnVmX2VuZCwgJnN0YXRlKTsKKyAgICAgICAgICAgIGF2X2Rsb2cocywgIm5hbCAlZFxuIiwgc3RhdGUgJiAweDFmKTsKKyAgICAgICAgfSB3aGlsZSAocCA8IGJ1Zl9lbmQgJiYgKHN0YXRlICYgMHgxZikgIT0gOSAmJgorICAgICAgICAgICAgICAgICAoc3RhdGUgJiAweDFmKSAhPSA1ICYmIChzdGF0ZSAmIDB4MWYpICE9IDEpOworCisgICAgICAgIGlmICgoc3RhdGUgJiAweDFmKSAhPSA5KSB7IC8vIEFVRCBOQUwKKyAgICAgICAgICAgIGRhdGEgPSBhdl9tYWxsb2MocGt0LT5zaXplICsgNik7CisgICAgICAgICAgICBpZiAoIWRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG1lbWNweShkYXRhICsgNiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgICAgICAgICAgQVZfV0IzMihkYXRhLCAweDAwMDAwMDAxKTsKKyAgICAgICAgICAgIGRhdGFbNF0gPSAweDA5OworICAgICAgICAgICAgZGF0YVs1XSA9IDB4ZjA7IC8vIGFueSBzbGljZSB0eXBlICgweGUpICsgcmJzcCBzdG9wIG9uZSBiaXQKKyAgICAgICAgICAgIGJ1ZiAgICAgPSBkYXRhOworICAgICAgICAgICAgc2l6ZSAgICA9IHBrdC0+c2l6ZSArIDY7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgIGlmIChwa3QtPnNpemUgPCAyKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQUFDIHBhY2tldCB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChBVl9SQjE2KHBrdC0+ZGF0YSkgJiAweGZmZjApICE9IDB4ZmZmMCkgeworICAgICAgICAgICAgaW50IHJldDsKKyAgICAgICAgICAgIEFWUGFja2V0IHBrdDI7CisKKyAgICAgICAgICAgIGlmICghdHNfc3QtPmFtdXgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQUFDIGJpdHN0cmVhbSBub3QgaW4gQURUUyBmb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgZXh0cmFkYXRhIG1pc3NpbmdcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9pbml0X3BhY2tldCgmcGt0Mik7CisgICAgICAgICAgICBwa3QyLmRhdGEgPSBwa3QtPmRhdGE7CisgICAgICAgICAgICBwa3QyLnNpemUgPSBwa3QtPnNpemU7CisgICAgICAgICAgICBhdl9hc3NlcnQwKHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFKTsKKyAgICAgICAgICAgIHBrdDIuZHRzID0gYXZfcmVzY2FsZV9xKHBrdC0+ZHRzLCBzdC0+dGltZV9iYXNlLCB0c19zdC0+YW11eC0+c3RyZWFtc1swXS0+dGltZV9iYXNlKTsKKworICAgICAgICAgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJnRzX3N0LT5hbXV4LT5wYik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICByZXQgPSBhdl93cml0ZV9mcmFtZSh0c19zdC0+YW11eCwgJnBrdDIpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdmlvX2Nsb3NlX2R5bl9idWYodHNfc3QtPmFtdXgtPnBiLCAmZGF0YSk7CisgICAgICAgICAgICAgICAgdHNfc3QtPmFtdXgtPnBiID0gTlVMTDsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKGRhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplICAgICAgICAgICAgPSBhdmlvX2Nsb3NlX2R5bl9idWYodHNfc3QtPmFtdXgtPnBiLCAmZGF0YSk7CisgICAgICAgICAgICB0c19zdC0+YW11eC0+cGIgPSBOVUxMOworICAgICAgICAgICAgYnVmICAgICAgICAgICAgID0gZGF0YTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IRVZDKSB7CisgICAgICAgIGludCByZXQgPSBjaGVja19oZXZjX3N0YXJ0Y29kZShzLCBzdCwgcGt0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKGk9MDsgaTxzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdDIgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgTXBlZ1RTV3JpdGVTdHJlYW0gKnRzX3N0MiA9IHN0Mi0+cHJpdl9kYXRhOworICAgICAgICAgICAgaWYgKCAgIHRzX3N0Mi0+cGF5bG9hZF9zaXplCisgICAgICAgICAgICAgICAmJiAodHNfc3QyLT5wYXlsb2FkX2R0cyA9PSBBVl9OT1BUU19WQUxVRSB8fCBkdHMgLSB0c19zdDItPnBheWxvYWRfZHRzID4gZGVsYXkvMikpIHsKKyAgICAgICAgICAgICAgICBtcGVndHNfd3JpdGVfcGVzKHMsIHN0MiwgdHNfc3QyLT5wYXlsb2FkLCB0c19zdDItPnBheWxvYWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNfc3QyLT5wYXlsb2FkX3B0cywgdHNfc3QyLT5wYXlsb2FkX2R0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNfc3QyLT5wYXlsb2FkX2ZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKTsKKyAgICAgICAgICAgICAgICB0c19zdDItPnBheWxvYWRfc2l6ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHNfc3QtPnBheWxvYWRfc2l6ZSAmJiB0c19zdC0+cGF5bG9hZF9zaXplICsgc2l6ZSA+IHRzLT5wZXNfcGF5bG9hZF9zaXplKSB7CisgICAgICAgIG1wZWd0c193cml0ZV9wZXMocywgc3QsIHRzX3N0LT5wYXlsb2FkLCB0c19zdC0+cGF5bG9hZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRzX3N0LT5wYXlsb2FkX3B0cywgdHNfc3QtPnBheWxvYWRfZHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRzX3N0LT5wYXlsb2FkX2ZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKTsKKyAgICAgICAgdHNfc3QtPnBheWxvYWRfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8gfHwgc2l6ZSA+IHRzLT5wZXNfcGF5bG9hZF9zaXplKSB7CisgICAgICAgIGF2X2Fzc2VydDAoIXRzX3N0LT5wYXlsb2FkX3NpemUpOworICAgICAgICAvLyBmb3IgdmlkZW8gYW5kIHN1YnRpdGxlLCB3cml0ZSBhIHNpbmdsZSBwZXMgcGFja2V0CisgICAgICAgIG1wZWd0c193cml0ZV9wZXMocywgc3QsIGJ1Ziwgc2l6ZSwgcHRzLCBkdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSk7CisgICAgICAgIGF2X2ZyZWUoZGF0YSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghdHNfc3QtPnBheWxvYWRfc2l6ZSkgeworICAgICAgICB0c19zdC0+cGF5bG9hZF9wdHMgICA9IHB0czsKKyAgICAgICAgdHNfc3QtPnBheWxvYWRfZHRzICAgPSBkdHM7CisgICAgICAgIHRzX3N0LT5wYXlsb2FkX2ZsYWdzID0gcGt0LT5mbGFnczsKKyAgICB9CisKKyAgICBtZW1jcHkodHNfc3QtPnBheWxvYWQgKyB0c19zdC0+cGF5bG9hZF9zaXplLCBidWYsIHNpemUpOworICAgIHRzX3N0LT5wYXlsb2FkX3NpemUgKz0gc2l6ZTsKKworICAgIGF2X2ZyZWUoZGF0YSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXBlZ3RzX3dyaXRlX2ZsdXNoKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIGZsdXNoIGN1cnJlbnQgcGFja2V0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgTXBlZ1RTV3JpdGVTdHJlYW0gKnRzX3N0ID0gc3QtPnByaXZfZGF0YTsKKyAgICAgICAgaWYgKHRzX3N0LT5wYXlsb2FkX3NpemUgPiAwKSB7CisgICAgICAgICAgICBtcGVndHNfd3JpdGVfcGVzKHMsIHN0LCB0c19zdC0+cGF5bG9hZCwgdHNfc3QtPnBheWxvYWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNfc3QtPnBheWxvYWRfcHRzLCB0c19zdC0+cGF5bG9hZF9kdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzX3N0LT5wYXlsb2FkX2ZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKTsKKyAgICAgICAgICAgIHRzX3N0LT5wYXlsb2FkX3NpemUgPSAwOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IG1wZWd0c193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGlmICghcGt0KSB7CisgICAgICAgIG1wZWd0c193cml0ZV9mbHVzaChzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1wZWd0c193cml0ZV9wYWNrZXRfaW50ZXJuYWwocywgcGt0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbXBlZ3RzX3dyaXRlX2VuZChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTXBlZ1RTV3JpdGUgKnRzID0gcy0+cHJpdl9kYXRhOworICAgIE1wZWdUU1NlcnZpY2UgKnNlcnZpY2U7CisgICAgaW50IGk7CisKKyAgICBtcGVndHNfd3JpdGVfZmx1c2gocyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIE1wZWdUU1dyaXRlU3RyZWFtICp0c19zdCA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgIGF2X2ZyZWVwKCZ0c19zdC0+cGF5bG9hZCk7CisgICAgICAgIGlmICh0c19zdC0+YW11eCkgeworICAgICAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHRzX3N0LT5hbXV4KTsKKyAgICAgICAgICAgIHRzX3N0LT5hbXV4ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCB0cy0+bmJfc2VydmljZXM7IGkrKykgeworICAgICAgICBzZXJ2aWNlID0gdHMtPnNlcnZpY2VzW2ldOworICAgICAgICBhdl9mcmVlcCgmc2VydmljZS0+cHJvdmlkZXJfbmFtZSk7CisgICAgICAgIGF2X2ZyZWVwKCZzZXJ2aWNlLT5uYW1lKTsKKyAgICAgICAgYXZfZnJlZShzZXJ2aWNlKTsKKyAgICB9CisgICAgYXZfZnJlZSh0cy0+c2VydmljZXMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAibXBlZ3RzX3RyYW5zcG9ydF9zdHJlYW1faWQiLCAiU2V0IHRyYW5zcG9ydF9zdHJlYW1faWQgZmllbGQuIiwKKyAgICAgIG9mZnNldG9mKE1wZWdUU1dyaXRlLCB0cmFuc3BvcnRfc3RyZWFtX2lkKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgeyAuaTY0ID0gMHgwMDAxIH0sIDB4MDAwMSwgMHhmZmZmLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgIm1wZWd0c19vcmlnaW5hbF9uZXR3b3JrX2lkIiwgIlNldCBvcmlnaW5hbF9uZXR3b3JrX2lkIGZpZWxkLiIsCisgICAgICBvZmZzZXRvZihNcGVnVFNXcml0ZSwgb3JpZ2luYWxfbmV0d29ya19pZCksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgIHsgLmk2NCA9IDB4MDAwMSB9LCAweDAwMDEsIDB4ZmZmZiwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJtcGVndHNfc2VydmljZV9pZCIsICJTZXQgc2VydmljZV9pZCBmaWVsZC4iLAorICAgICAgb2Zmc2V0b2YoTXBlZ1RTV3JpdGUsIHNlcnZpY2VfaWQpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICB7IC5pNjQgPSAweDAwMDEgfSwgMHgwMDAxLCAweGZmZmYsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAibXBlZ3RzX3BtdF9zdGFydF9waWQiLCAiU2V0IHRoZSBmaXJzdCBwaWQgb2YgdGhlIFBNVC4iLAorICAgICAgb2Zmc2V0b2YoTXBlZ1RTV3JpdGUsIHBtdF9zdGFydF9waWQpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICB7IC5pNjQgPSAweDEwMDAgfSwgMHgwMDEwLCAweDFmMDAsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAibXBlZ3RzX3N0YXJ0X3BpZCIsICJTZXQgdGhlIGZpcnN0IHBpZC4iLAorICAgICAgb2Zmc2V0b2YoTXBlZ1RTV3JpdGUsIHN0YXJ0X3BpZCksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgIHsgLmk2NCA9IDB4MDEwMCB9LCAweDAwMjAsIDB4MGYwMCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJtcGVndHNfbTJ0c19tb2RlIiwgIkVuYWJsZSBtMnRzIG1vZGUuIiwKKyAgICAgIG9mZnNldG9mKE1wZWdUU1dyaXRlLCBtMnRzX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJtdXhyYXRlIiwgTlVMTCwKKyAgICAgIG9mZnNldG9mKE1wZWdUU1dyaXRlLCBtdXhfcmF0ZSksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgIHsgLmk2NCA9IDEgfSwgMCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJwZXNfcGF5bG9hZF9zaXplIiwgIk1pbmltdW0gUEVTIHBhY2tldCBwYXlsb2FkIGluIGJ5dGVzIiwKKyAgICAgIG9mZnNldG9mKE1wZWdUU1dyaXRlLCBwZXNfcGF5bG9hZF9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgeyAuaTY0ID0gREVGQVVMVF9QRVNfUEFZTE9BRF9TSVpFIH0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAibXBlZ3RzX2ZsYWdzIiwgIk1QRUctVFMgbXV4aW5nIGZsYWdzIiwKKyAgICAgIG9mZnNldG9mKE1wZWdUU1dyaXRlLCBmbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsCisgICAgICBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgIm1wZWd0c19mbGFncyIgfSwKKyAgICB7ICJyZXNlbmRfaGVhZGVycyIsICJSZWVtaXQgUEFUL1BNVCBiZWZvcmUgd3JpdGluZyB0aGUgbmV4dCBwYWNrZXQiLAorICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE1QRUdUU19GTEFHX1JFRU1JVF9QQVRfUE1UIH0sIDAsIElOVF9NQVgsCisgICAgICBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgIm1wZWd0c19mbGFncyIgfSwKKyAgICB7ICJsYXRtIiwgIlVzZSBMQVRNIHBhY2tldGl6YXRpb24gZm9yIEFBQyIsCisgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTVBFR1RTX0ZMQUdfQUFDX0xBVE0gfSwgMCwgSU5UX01BWCwKKyAgICAgIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibXBlZ3RzX2ZsYWdzIiB9LAorICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICB7ICJyZXNlbmRfaGVhZGVycyIsICJSZWVtaXQgUEFUL1BNVCBiZWZvcmUgd3JpdGluZyB0aGUgbmV4dCBwYWNrZXQiLAorICAgICAgb2Zmc2V0b2YoTXBlZ1RTV3JpdGUsIHJlZW1pdF9wYXRfcG10KSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgIm1wZWd0c19jb3B5dHMiLCAiZG9uJ3Qgb2Zmc2V0IGR0cy9wdHMiLAorICAgICAgb2Zmc2V0b2YoTXBlZ1RTV3JpdGUsIGNvcHl0cyksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCAxLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgInRhYmxlc192ZXJzaW9uIiwgInNldCBQQVQsIFBNVCBhbmQgU0RUIHZlcnNpb24iLAorICAgICAgb2Zmc2V0b2YoTXBlZ1RTV3JpdGUsIHRhYmxlc192ZXJzaW9uKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgeyAuaTY0ID0gMCB9LCAwLCAzMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJvbWl0X3ZpZGVvX3Blc19sZW5ndGgiLCAiT21pdCB0aGUgUEVTIHBhY2tldCBsZW5ndGggZm9yIHZpZGVvIHBhY2tldHMiLAorICAgICAgb2Zmc2V0b2YoTXBlZ1RTV3JpdGUsIG9taXRfdmlkZW9fcGVzX2xlbmd0aCksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgIHsgLmk2NCA9IDEgfSwgMCwgMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJwY3JfcGVyaW9kIiwgIlBDUiByZXRyYW5zbWlzc2lvbiB0aW1lIiwKKyAgICAgIG9mZnNldG9mKE1wZWdUU1dyaXRlLCBwY3JfcGVyaW9kKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgeyAuaTY0ID0gUENSX1JFVFJBTlNfVElNRSB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgbXBlZ3RzX211eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIk1QRUdUUyBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9tcGVndHNfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wZWd0cyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctVFMgKE1QRUctMiBUcmFuc3BvcnQgU3RyZWFtKSIpLAorICAgIC5taW1lX3R5cGUgICAgICA9ICJ2aWRlby9NUDJUIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAidHMsbTJ0LG0ydHMsbXRzIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZ1RTV3JpdGUpLAorICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX01QMiwKKyAgICAudmlkZW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICA9IG1wZWd0c193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gbXBlZ3RzX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgPSBtcGVndHNfd3JpdGVfZW5kLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0FMTE9XX0ZMVVNILAorICAgIC5wcml2X2NsYXNzICAgICA9ICZtcGVndHNfbXV4ZXJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L21wZWd2aWRlb2RlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21wZWd2aWRlb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZTc2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbXBlZ3ZpZGVvZGVjLmMKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIFJBVyBNUEVHIHZpZGVvIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJhd2RlYy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjZGVmaW5lIFNFUV9TVEFSVF9DT0RFICAgICAgICAgIDB4MDAwMDAxYjMKKyNkZWZpbmUgR09QX1NUQVJUX0NPREUgICAgICAgICAgMHgwMDAwMDFiOAorI2RlZmluZSBQSUNUVVJFX1NUQVJUX0NPREUgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFNMSUNFX1NUQVJUX0NPREUgICAgICAgIDB4MDAwMDAxMDEKKyNkZWZpbmUgUEFDS19TVEFSVF9DT0RFICAgICAgICAgMHgwMDAwMDFiYQorI2RlZmluZSBWSURFT19JRCAgICAgICAgICAgICAgICAweDAwMDAwMWUwCisjZGVmaW5lIEFVRElPX0lEICAgICAgICAgICAgICAgIDB4MDAwMDAxYzAKKworc3RhdGljIGludCBtcGVndmlkZW9fcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgdWludDMyX3QgY29kZT0gLTE7CisgICAgaW50IHBpYz0wLCBzZXE9MCwgc2xpY2U9MCwgcHNwYWNrPTAsIHZwZXM9MCwgYXBlcz0wLCByZXM9MCwgc2ljbGU9MDsKKyAgICBpbnQgaSwgajsKKyAgICB1aW50MzJfdCBsYXN0ID0gMDsKKworICAgIGZvcihpPTA7IGk8cC0+YnVmX3NpemU7IGkrKyl7CisgICAgICAgIGNvZGUgPSAoY29kZTw8OCkgKyBwLT5idWZbaV07CisgICAgICAgIGlmICgoY29kZSAmIDB4ZmZmZmZmMDApID09IDB4MTAwKSB7CisgICAgICAgICAgICBzd2l0Y2goY29kZSl7CisgICAgICAgICAgICBjYXNlICAgICBTRVFfU1RBUlRfQ09ERToKKyAgICAgICAgICAgICAgICBpZiAoIShwLT5idWZbaSsxKzMrMSsyXSAmIDB4MjApKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICBpZiAocC0+YnVmW2orOF0gJiAyKQorICAgICAgICAgICAgICAgICAgICBqKz0gNjQ7CisgICAgICAgICAgICAgICAgaWYgKGogPj0gcC0+YnVmX3NpemUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChwLT5idWZbais4XSAmIDEpCisgICAgICAgICAgICAgICAgICAgIGorPSA2NDsKKyAgICAgICAgICAgICAgICBpZiAoaiA+PSBwLT5idWZfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKEFWX1JCMjQocC0+YnVmICsgaiArIDkpICYgMHhGRkZGRkUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHNlcSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBJQ1RVUkVfU1RBUlRfQ09ERTogICBwaWMrKzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICAgIFBBQ0tfU1RBUlRfQ09ERTogcHNwYWNrKys7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAgICAgICAgICAgICAgMHgxYjY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKys7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvZGUgPj0gU0xJQ0VfU1RBUlRfQ09ERSAmJiBjb2RlIDw9IDB4MWFmKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3QgPj0gU0xJQ0VfU1RBUlRfQ09ERSAmJiBsYXN0IDw9IDB4MWFmKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID49IGxhc3QpIHNsaWNlKys7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgIHNpY2xlKys7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IFNMSUNFX1NUQVJUX0NPREUpIHNsaWNlKys7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIHNpY2xlKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgICAgICgoY29kZSAmIDB4MWYwKSA9PSBWSURFT19JRCkgICB2cGVzKys7CisgICAgICAgICAgICBlbHNlIGlmKChjb2RlICYgMHgxZTApID09IEFVRElPX0lEKSAgIGFwZXMrKzsKKyAgICAgICAgICAgIGxhc3QgPSBjb2RlOworICAgICAgICB9CisgICAgfQorICAgIGlmKHNlcSAmJiBzZXEqOTw9cGljKjEwICYmIHBpYyo5PD1zbGljZSoxMCAmJiAhcHNwYWNrICYmICFhcGVzICYmICFyZXMgJiYgc2xpY2UgPiBzaWNsZSkgeworICAgICAgICBpZih2cGVzKSByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLyA0OworICAgICAgICBlbHNlICAgICByZXR1cm4gcGljPjEgPyBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDEgOiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDI7IC8vICsxIGZvciAubXBnCisgICAgfQorICAgIHJldHVybiAwOworfQorCitGRl9ERUZfUkFXVklERU9fREVNVVhFUihtcGVndmlkZW8sICJyYXcgTVBFRyB2aWRlbyIsIG1wZWd2aWRlb19wcm9iZSwgTlVMTCwgQVZfQ09ERUNfSURfTVBFRzFWSURFTykKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGpwZWcuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tcGpwZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk3NWUyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21wanBlZy5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBNdWx0aXBhcnQgSlBFRyBmb3JtYXQKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworLyogTXVsdGlwYXJ0IEpQRUcgKi8KKworI2RlZmluZSBCT1VOREFSWV9UQUcgImZmc2VydmVyIgorCit0eXBlZGVmIHN0cnVjdCBNUEpQRUdDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBjaGFyICpib3VuZGFyeV90YWc7Cit9IE1QSlBFR0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgbXBqcGVnX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVBKUEVHQ29udGV4dCAqbXBqID0gcy0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgYnVmMVsyNTZdOworCisgICAgc25wcmludGYoYnVmMSwgc2l6ZW9mKGJ1ZjEpLCAiLS0lc1xyXG4iLCBtcGotPmJvdW5kYXJ5X3RhZyk7CisgICAgYXZpb193cml0ZShzLT5wYiwgYnVmMSwgc3RybGVuKGJ1ZjEpKTsKKyAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGpwZWdfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNUEpQRUdDb250ZXh0ICptcGogPSBzLT5wcml2X2RhdGE7CisgICAgdWludDhfdCBidWYxWzI1Nl07CisKKyAgICBzbnByaW50ZihidWYxLCBzaXplb2YoYnVmMSksICJDb250ZW50LXR5cGU6IGltYWdlL2pwZWdcclxuIik7CisgICAgYXZpb193cml0ZShzLT5wYiwgYnVmMSwgc3RybGVuKGJ1ZjEpKTsKKworICAgIHNucHJpbnRmKGJ1ZjEsIHNpemVvZihidWYxKSwgIkNvbnRlbnQtbGVuZ3RoOiAlZFxyXG5cclxuIiwgcGt0LT5zaXplKTsKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBidWYxLCBzdHJsZW4oYnVmMSkpOworICAgIGF2aW9fd3JpdGUocy0+cGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKworICAgIHNucHJpbnRmKGJ1ZjEsIHNpemVvZihidWYxKSwgIlxyXG4tLSVzXHJcbiIsIG1wai0+Ym91bmRhcnlfdGFnKTsKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBidWYxLCBzdHJsZW4oYnVmMSkpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wanBlZ193cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJib3VuZGFyeV90YWciLCAgICAiQm91bmRhcnkgdGFnIiwgb2Zmc2V0b2YoTVBKUEVHQ29udGV4dCwgYm91bmRhcnlfdGFnKSwgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gQk9VTkRBUllfVEFHfSwgLmZsYWdzID0gQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG1wanBlZ19tdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJtcGpwZWdfbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfbXBqcGVnX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJtcGpwZWciLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNSU1FIG11bHRpcGFydCBKUEVHIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gIm11bHRpcGFydC94LW1peGVkLXJlcGxhY2U7Ym91bmRhcnk9IiBCT1VOREFSWV9UQUcsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gIm1qcGciLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihNUEpQRUdDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01KUEVHLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1wanBlZ193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gbXBqcGVnX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBtcGpwZWdfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJm1wanBlZ19tdXhlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbXBsMmRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21wbDJkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjBiN2JlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L21wbDJkZWMuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVBMMiBzdWJ0aXRsZXMgZm9ybWF0IGRlbXV4ZXIKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInN1YnRpdGxlcy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRkZEZW11eFN1YnRpdGxlc1F1ZXVlIHE7Cit9IE1QTDJDb250ZXh0OworCitzdGF0aWMgaW50IG1wbDJfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IGk7CisgICAgY2hhciBjOworICAgIGludDY0X3Qgc3RhcnQsIGVuZDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdHIgPSBwLT5idWY7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyX2VuZCA9IHB0ciArIHAtPmJ1Zl9zaXplOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpZiAoc3NjYW5mKHB0ciwgIlslIlNDTmQ2NCJdWyUiU0NOZDY0Il0lYyIsICZzdGFydCwgJmVuZCwgJmMpICE9IDMgJiYKKyAgICAgICAgICAgIHNzY2FuZihwdHIsICJbJSJTQ05kNjQiXVtdJWMiLCAgICAgICAgICAmc3RhcnQsICAgICAgICZjKSAhPSAyKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHB0ciArPSBmZl9zdWJ0aXRsZXNfbmV4dF9saW5lKHB0cik7CisgICAgICAgIGlmIChwdHIgPj0gcHRyX2VuZCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90cyhjaGFyICoqbGluZSwgaW50NjRfdCAqcHRzX3N0YXJ0LCBpbnQgKmR1cmF0aW9uKQoreworICAgIGNoYXIgYzsKKyAgICBpbnQgbGVuOworICAgIGludDY0X3QgZW5kOworCisgICAgaWYgKHNzY2FuZigqbGluZSwgIlslIlNDTmQ2NCJdW10lYyVuIiwKKyAgICAgICAgICAgICAgIHB0c19zdGFydCwgJmMsICZsZW4pID49IDIpIHsKKyAgICAgICAgKmR1cmF0aW9uID0gLTE7CisgICAgICAgICpsaW5lICs9IGxlbiAtIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoc3NjYW5mKCpsaW5lLCAiWyUiU0NOZDY0Il1bJSJTQ05kNjQiXSVjJW4iLAorICAgICAgICAgICAgICAgcHRzX3N0YXJ0LCAmZW5kLCAmYywgJmxlbikgPj0gMykgeworICAgICAgICAqZHVyYXRpb24gPSBlbmQgLSAqcHRzX3N0YXJ0OworICAgICAgICAqbGluZSArPSBsZW4gLSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IG1wbDJfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1QTDJDb250ZXh0ICptcGwyID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaW50IHJlcyA9IDA7CisKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMCk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01QTDI7CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihzLT5wYikpIHsKKyAgICAgICAgY2hhciBsaW5lWzQwOTZdOworICAgICAgICBjaGFyICpwID0gbGluZTsKKyAgICAgICAgY29uc3QgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICBpbnQgbGVuID0gZmZfZ2V0X2xpbmUocy0+cGIsIGxpbmUsIHNpemVvZihsaW5lKSk7CisgICAgICAgIGludDY0X3QgcHRzX3N0YXJ0OworICAgICAgICBpbnQgZHVyYXRpb247CisKKyAgICAgICAgaWYgKCFsZW4pCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBsaW5lW3N0cmNzcG4obGluZSwgIlxyXG4iKV0gPSAwOworCisgICAgICAgIGlmICghcmVhZF90cygmcCwgJnB0c19zdGFydCwgJmR1cmF0aW9uKSkgeworICAgICAgICAgICAgQVZQYWNrZXQgKnN1YjsKKworICAgICAgICAgICAgc3ViID0gZmZfc3VidGl0bGVzX3F1ZXVlX2luc2VydCgmbXBsMi0+cSwgcCwgc3RybGVuKHApLCAwKTsKKyAgICAgICAgICAgIGlmICghc3ViKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBzdWItPnBvcyA9IHBvczsKKyAgICAgICAgICAgIHN1Yi0+cHRzID0gcHRzX3N0YXJ0OworICAgICAgICAgICAgc3ViLT5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2ZpbmFsaXplKCZtcGwyLT5xKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IG1wbDJfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE1QTDJDb250ZXh0ICptcGwyID0gcy0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl9zdWJ0aXRsZXNfcXVldWVfcmVhZF9wYWNrZXQoJm1wbDItPnEsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgbXBsMl9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncykKK3sKKyAgICBNUEwyQ29udGV4dCAqbXBsMiA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJm1wbDItPnEsIHMsIHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbXBsMl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNUEwyQ29udGV4dCAqbXBsMiA9IHMtPnByaXZfZGF0YTsKKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfY2xlYW4oJm1wbDItPnEpOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX21wbDJfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXBsMiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QTDIgc3VidGl0bGVzIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1QTDJDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBtcGwyX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IG1wbDJfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gbXBsMl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrMiAgICAgPSBtcGwyX3JlYWRfc2VlaywKKyAgICAucmVhZF9jbG9zZSAgICAgPSBtcGwyX3JlYWRfY2xvc2UsCisgICAgLmV4dGVuc2lvbnMgICAgID0gInR4dCxtcGwyIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbXBzdWJkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tcHN1YmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZGM1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbXBzdWJkZWMuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVBsYXllciBzdWJ0aXRsZXMgZm9ybWF0IGRlbXV4ZXIKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInN1YnRpdGxlcy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRkZEZW11eFN1YnRpdGxlc1F1ZXVlIHE7Cit9IE1QU3ViQ29udGV4dDsKKworc3RhdGljIGludCBtcHN1Yl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBjb25zdCBjaGFyICpwdHIgICAgID0gcC0+YnVmOworICAgIGNvbnN0IGNoYXIgKnB0cl9lbmQgPSBwLT5idWYgKyBwLT5idWZfc2l6ZTsKKworICAgIHdoaWxlIChwdHIgPCBwdHJfZW5kKSB7CisgICAgICAgIGludCBpbmM7CisKKyAgICAgICAgaWYgKCFtZW1jbXAocHRyLCAiRk9STUFUPVRJTUUiLCAxMSkpCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047CisgICAgICAgIGlmICghbWVtY21wKHB0ciwgIkZPUk1BVD0iLCA3KSkKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDM7CisgICAgICAgIGluYyA9IGZmX3N1YnRpdGxlc19uZXh0X2xpbmUocHRyKTsKKyAgICAgICAgaWYgKCFpbmMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcHRyICs9IGluYzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBzdWJfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1QU3ViQ29udGV4dCAqbXBzdWIgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIEFWQlByaW50IGJ1ZjsKKyAgICBBVlJhdGlvbmFsIHB0c19pbmZvID0gKEFWUmF0aW9uYWwpeyAxMDAsIDEgfTsgLy8gdHMgYmFzZWQgYnkgZGVmYXVsdAorICAgIGludCByZXMgPSAwOworICAgIGZsb2F0IG11bHRpcGxpZXIgPSAxMDAuMDsKKyAgICBmbG9hdCBjdXJyZW50X3B0cyA9IDA7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworCisgICAgd2hpbGUgKCFhdmlvX2Zlb2Yocy0+cGIpKSB7CisgICAgICAgIGNoYXIgbGluZVsxMDI0XTsKKyAgICAgICAgZmxvYXQgc3RhcnQsIGR1cmF0aW9uOworICAgICAgICBpbnQgZnBzLCBsZW4gPSBmZl9nZXRfbGluZShzLT5wYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKworICAgICAgICBpZiAoIWxlbikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGxpbmVbc3RyY3NwbihsaW5lLCAiXHJcbiIpXSA9IDA7CisKKyAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiRk9STUFUPSVkIiwgJmZwcykgPT0gMSAmJiBmcHMgPiAzICYmIGZwcyA8IDEwMCkgeworICAgICAgICAgICAgLyogZnJhbWUgYmFzZWQgdGltaW5nICovCisgICAgICAgICAgICBwdHNfaW5mbyA9IChBVlJhdGlvbmFsKXsgZnBzLCAxIH07CisgICAgICAgICAgICBtdWx0aXBsaWVyID0gMS4wOworICAgICAgICB9IGVsc2UgaWYgKHNzY2FuZihsaW5lLCAiJWYgJWYiLCAmc3RhcnQsICZkdXJhdGlvbikgPT0gMikgeworICAgICAgICAgICAgQVZQYWNrZXQgKnN1YjsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKworICAgICAgICAgICAgZmZfc3VidGl0bGVzX3JlYWRfY2h1bmsocy0+cGIsICZidWYpOworICAgICAgICAgICAgaWYgKGJ1Zi5sZW4pIHsKKyAgICAgICAgICAgICAgICBzdWIgPSBmZl9zdWJ0aXRsZXNfcXVldWVfaW5zZXJ0KCZtcHN1Yi0+cSwgYnVmLnN0ciwgYnVmLmxlbiwgMCk7CisgICAgICAgICAgICAgICAgaWYgKCFzdWIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3ViLT5wdHMgPSAoaW50NjRfdCkoY3VycmVudF9wdHMgKyBzdGFydCptdWx0aXBsaWVyKTsKKyAgICAgICAgICAgICAgICBzdWItPmR1cmF0aW9uID0gKGludCkoZHVyYXRpb24gKiBtdWx0aXBsaWVyKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3B0cyArPSAoc3RhcnQgKyBkdXJhdGlvbikgKiBtdWx0aXBsaWVyOworICAgICAgICAgICAgICAgIHN1Yi0+cG9zID0gcG9zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHB0c19pbmZvLmRlbiwgcHRzX2luZm8ubnVtKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVEVYVDsKKworICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9maW5hbGl6ZSgmbXBzdWItPnEpOworCitlbmQ6CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgbXBzdWJfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE1QU3ViQ29udGV4dCAqbXBzdWIgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3N1YnRpdGxlc19xdWV1ZV9yZWFkX3BhY2tldCgmbXBzdWItPnEsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgbXBzdWJfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3RzLCBpbnQ2NF90IHRzLCBpbnQ2NF90IG1heF90cywgaW50IGZsYWdzKQoreworICAgIE1QU3ViQ29udGV4dCAqbXBzdWIgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3N1YnRpdGxlc19xdWV1ZV9zZWVrKCZtcHN1Yi0+cSwgcywgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdHMsIHRzLCBtYXhfdHMsIGZsYWdzKTsKK30KKworc3RhdGljIGludCBtcHN1Yl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNUFN1YkNvbnRleHQgKm1wc3ViID0gcy0+cHJpdl9kYXRhOworICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9jbGVhbigmbXBzdWItPnEpOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX21wc3ViX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wc3ViIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBsYXllciBzdWJ0aXRsZXMiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTVBTdWJDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBtcHN1Yl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBtcHN1Yl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBtcHN1Yl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrMiAgICAgPSBtcHN1Yl9yZWFkX3NlZWssCisgICAgLnJlYWRfY2xvc2UgICAgID0gbXBzdWJfcmVhZF9jbG9zZSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAic3ViIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbXNud2NfdGNwLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbXNud2NfdGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyMjVhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tc253Y190Y3AuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCAgUmFtaXJvIFBvbGxhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgSEVBREVSX1NJWkUgICAgICAgICAyNAorCisvKgorICogSGVhZGVyIHN0cnVjdHVyZToKKyAqICB1aW50MTZfdCAgICBzczsgICAgIC8vIHN0cnVjdCBzaXplCisgKiAgdWludDE2X3QgICAgd2lkdGg7ICAvLyBmcmFtZSB3aWR0aAorICogIHVpbnQxNl90ICAgIGhlaWdodDsgLy8gZnJhbWUgaGVpZ2h0CisgKiAgdWludDE2X3QgICAgZmY7ICAgICAvLyBrZXlmcmFtZSArIHNvbWUgb3RoZXIgaW5mbyg/Pz8pCisgKiAgdWludDMyX3QgICAgc2l6ZTsgICAvLyBzaXplIG9mIGRhdGEKKyAqICB1aW50MzJfdCAgICBmb3VyY2M7IC8vIE1MMjAKKyAqICB1aW50MzJfdCAgICB1MzsgICAgIC8vID8KKyAqICB1aW50MzJfdCAgICB0czsgICAgIC8vIHRpbWUKKyAqLworCitzdGF0aWMgaW50IG1zbndjX3RjcF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMCA7IGkgKyBIRUFERVJfU0laRSA8PSBwLT5idWZfc2l6ZSA7IGkrKykgeworICAgICAgICB1aW50MTZfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICB1aW50MzJfdCBmb3VyY2M7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ5dGVzdHJlYW0gPSBwLT5idWYraTsKKworICAgICAgICBpZihieXRlc3RyZWFtX2dldF9sZTE2KCZieXRlc3RyZWFtKSAhPSBIRUFERVJfU0laRSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB3aWR0aCAgPSBieXRlc3RyZWFtX2dldF9sZTE2KCZieXRlc3RyZWFtKTsKKyAgICAgICAgaGVpZ2h0ID0gYnl0ZXN0cmVhbV9nZXRfbGUxNigmYnl0ZXN0cmVhbSk7CisgICAgICAgIGlmKCEod2lkdGg9PTMyMCAmJiBoZWlnaHQ9PTI0MCkgJiYgISh3aWR0aD09MTYwICYmIGhlaWdodD09MTIwKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBieXRlc3RyZWFtICs9IDI7IC8vIGtleWZyYW1lCisgICAgICAgIGJ5dGVzdHJlYW0gKz0gNDsgLy8gc2l6ZQorICAgICAgICBmb3VyY2MgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZieXRlc3RyZWFtKTsKKyAgICAgICAgaWYoZm91cmNjICE9IE1LVEFHKCdNJywgJ0wnLCAnMicsICcwJykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZihpKSB7CisgICAgICAgICAgICBpZihpIDwgMTQpICAvKiBzdGFydHMgd2l0aCBTd2l0Y2hCb2FyZCBjb25uZWN0aW9uIGluZm8gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLyAyOworICAgICAgICAgICAgZWxzZSAgICAgICAgLyogc3RhcnRzIGluIHRoZSBtaWRkbGUgb2Ygc3RyZWFtICovCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBtc253Y190Y3BfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpjdHgpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gY3R4LT5wYjsKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWM7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGN0eCwgTlVMTCk7CisgICAgaWYoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY29kZWMgPSBzdC0+Y29kZWM7CisgICAgY29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgY29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTUlNSUM7CisgICAgY29kZWMtPmNvZGVjX3RhZyA9IE1LVEFHKCdNJywgJ0wnLCAnMicsICcwJyk7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgMTAwMCk7CisKKyAgICAvKiBTb21lIGZpbGVzIHN0YXJ0IHdpdGggImNvbm5lY3RlZFxyXG5cclxuIi4KKyAgICAgKiBTbyBza2lwIHVudGlsIHdlIGZpbmQgdGhlIGZpcnN0IGJ5dGUgb2Ygc3RydWN0IHNpemUgKi8KKyAgICB3aGlsZShhdmlvX3I4KHBiKSAhPSBIRUFERVJfU0laRSAmJiAhYXZpb19mZW9mKHBiKSk7CisKKyAgICBpZihhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBmaW5kIHZhbGlkIHN0YXJ0LlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc253Y190Y3BfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gY3R4LT5wYjsKKyAgICB1aW50MTZfdCBrZXlmcmFtZTsKKyAgICB1aW50MzJfdCBzaXplLCB0aW1lc3RhbXA7CisKKyAgICBhdmlvX3NraXAocGIsIDEpOyAvKiBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkIGFoZWFkICovCisgICAgYXZpb19za2lwKHBiLCAyKTsKKyAgICBhdmlvX3NraXAocGIsIDIpOworICAgIGtleWZyYW1lID0gYXZpb19ybDE2KHBiKTsKKyAgICBzaXplID0gYXZpb19ybDMyKHBiKTsKKyAgICBhdmlvX3NraXAocGIsIDQpOworICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgdGltZXN0YW1wID0gYXZpb19ybDMyKHBiKTsKKworICAgIGlmKCFzaXplIHx8IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgc2l6ZSkgIT0gc2l6ZSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYXZpb19za2lwKHBiLCAxKTsgLyogUmVhZCBhaGVhZCBvbmUgYnl0ZSBvZiBzdHJ1Y3Qgc2l6ZSBsaWtlIHJlYWRfaGVhZGVyICovCisKKyAgICBwa3QtPnB0cyA9IHRpbWVzdGFtcDsKKyAgICBwa3QtPmR0cyA9IHRpbWVzdGFtcDsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisKKyAgICAvKiBTb21lIGFNc24gZ2VuZXJhdGVkIHZpZGVvcyAob3Igd2FzIGl0IE1lcmN1cnkgTWVzc2VuZ2VyPykgZG9uJ3Qgc2V0CisgICAgICogdGhpcyBiaXQgYW5kIHJlbHkgb24gdGhlIGNvZGVjIHRvIGdldCBrZXlmcmFtZSBpbmZvcm1hdGlvbiAqLworICAgIGlmKGtleWZyYW1lJjEpCisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgcmV0dXJuIEhFQURFUl9TSVpFICsgc2l6ZTsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9tc253Y190Y3BfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXNud2N0Y3AiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNU04gVENQIFdlYmNhbSBzdHJlYW0iKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBtc253Y190Y3BfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gbXNud2NfdGNwX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IG1zbndjX3RjcF9yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbXR2LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbXR2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkYWQyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tdHYuYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIG10diBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNVFYgZGVtdXhlci4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBNVFZfQVNVQkNIVU5LX0RBVEFfU0laRSA1MDAKKyNkZWZpbmUgTVRWX0hFQURFUl9TSVpFIDUxMgorI2RlZmluZSBNVFZfQVVESU9fUEFERElOR19TSVpFIDEyCisjZGVmaW5lIE1UVl9JTUFHRV9ERUZBVUxUX0JQUCAxNgorI2RlZmluZSBNVFZfQVVESU9fU0FNUExJTkdfUkFURSA0NDEwMAorCit0eXBlZGVmIHN0cnVjdCBNVFZEZW11eENvbnRleHQgeworCisgICAgdW5zaWduZWQgaW50IGZpbGVfc2l6ZTsgICAgICAgICAvLy88IGZpbGVzaXplLCBub3QgYWx3YXlzIHJpZ2h0CisgICAgdW5zaWduZWQgaW50IHNlZ21lbnRzOyAgICAgICAgICAvLy88IG51bWJlciBvZiA1MTIgYnl0ZSBzZWdtZW50cworICAgIHVuc2lnbmVkIGludCBhdWRpb19pZGVudGlmaWVyOyAgLy8vPCAnTVAzJyBvbiBhbGwgZmlsZXMgSSBoYXZlIHNlZW4KKyAgICB1bnNpZ25lZCBpbnQgYXVkaW9fYnI7ICAgICAgICAgIC8vLzwgYml0cmF0ZSBvZiBhdWRpbyBjaGFubmVsIChtcDMpCisgICAgdW5zaWduZWQgaW50IGltZ19jb2xvcmZtdDsgICAgICAvLy88IGZyYW1lIGNvbG9yZm10IHJnYiA1NjUvNTU1CisgICAgdW5zaWduZWQgaW50IGltZ19icHA7ICAgICAgICAgICAvLy88IGZyYW1lIGJpdHMgcGVyIHBpeGVsCisgICAgdW5zaWduZWQgaW50IGltZ193aWR0aDsKKyAgICB1bnNpZ25lZCBpbnQgaW1nX2hlaWdodDsKKyAgICB1bnNpZ25lZCBpbnQgaW1nX3NlZ21lbnRfc2l6ZTsgIC8vLzwgc2l6ZSBvZiBpbWFnZSBzZWdtZW50CisgICAgdW5zaWduZWQgaW50IHZpZGVvX2ZwczsKKyAgICB1bnNpZ25lZCBpbnQgZnVsbF9zZWdtZW50X3NpemU7CisKK30gTVRWRGVtdXhDb250ZXh0OworCitzdGF0aWMgaW50IG10dl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICAvKiB3ZSBuZWVkIGF0IGxlYXN0IDU3IGJ5dGVzIGZyb20gdGhlIGhlYWRlcgorICAgICAqIHRvIHRyeSBwYXJzaW5nIGFsbCByZXF1aXJlZCBmaWVsZHMKKyAgICAgKi8KKyAgICBpZiAocC0+YnVmX3NpemUgPCA1NykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBNYWdpYyBpcyAnQU1WJyAqLworICAgIGlmICgqcC0+YnVmICE9ICdBJyB8fCAqKHAtPmJ1ZiArIDEpICE9ICdNJyB8fCAqKHAtPmJ1ZiArIDIpICE9ICdWJykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBBdWRpbyBtYWdpYyBpcyBhbHdheXMgTVAzICovCisgICAgaWYgKHAtPmJ1Zls0M10gIT0gJ00nIHx8IHAtPmJ1Zls0NF0gIT0gJ1AnIHx8IHAtPmJ1Zls0NV0gIT0gJzMnKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIENoZWNrIGZvciBub256ZXJvIGluIGJwcCBhbmQgKHdpZHRofGhlaWdodCkgaGVhZGVyIGZpZWxkcyAqLworICAgIGlmKCEocC0+YnVmWzUxXSAmJiBBVl9STDE2KCZwLT5idWZbNTJdKSB8IEFWX1JMMTYoJnAtPmJ1Zls1NF0pKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBJZiB3aWR0aCBvciBoZWlnaHQgYXJlIDAgdGhlbiBpbWFnZXNpemUgaGVhZGVyIGZpZWxkIHNob3VsZCBub3QgKi8KKyAgICBpZighQVZfUkwxNigmcC0+YnVmWzUyXSkgfHwgIUFWX1JMMTYoJnAtPmJ1Zls1NF0pKQorICAgIHsKKyAgICAgICAgaWYoISFBVl9STDE2KCZwLT5idWZbNTZdKSkKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogSW1hZ2UgYnBwIGlzIG5vdCBhbiBhYnNvbHV0ZWx5IHJlcXVpcmVkCisgICAgICogZmllbGQgYXMgd2UgbGF0dGVyIGNsYWltIGl0IHNob3VsZCBiZSAxNgorICAgICAqIG5vIG1hdHRlciB3aGF0LiBBbGwgc2FtcGxlcyBpbiB0aGUgd2lsZAorICAgICAqIGFyZSBSR0I1NjUvNTU1LgorICAgICAqLworICAgIGlmKHAtPmJ1Zls1MV0gIT0gTVRWX0lNQUdFX0RFRkFVTFRfQlBQKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLyAyOworCisgICAgLyogV2UgaGFkIGVub3VnaCBkYXRhIHRvIHBhcnNlIGhlYWRlciB2YWx1ZXMKKyAgICAgKiBidXQgd2UgZXhwZWN0IHRvIGJlIGFibGUgdG8gZ2V0IDUxMiBieXRlcworICAgICAqIG9mIGhlYWRlciB0byBiZSBzdXJlLgorICAgICAqLworICAgIGlmIChwLT5idWZfc2l6ZSA8IE1UVl9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCitzdGF0aWMgaW50IG10dl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVRWRGVtdXhDb250ZXh0ICptdHYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgICAqcGIgID0gcy0+cGI7CisgICAgQVZTdHJlYW0gICAgICAgICpzdDsKKyAgICB1bnNpZ25lZCBpbnQgICAgYXVkaW9fc3Vic2VnbWVudHM7CisKKyAgICBhdmlvX3NraXAocGIsIDMpOworICAgIG10di0+ZmlsZV9zaXplICAgICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgIG10di0+c2VnbWVudHMgICAgICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgIGF2aW9fc2tpcChwYiwgMzIpOworICAgIG10di0+YXVkaW9faWRlbnRpZmllciAgPSBhdmlvX3JsMjQocGIpOworICAgIG10di0+YXVkaW9fYnIgICAgICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIG10di0+aW1nX2NvbG9yZm10ICAgICAgPSBhdmlvX3JsMjQocGIpOworICAgIG10di0+aW1nX2JwcCAgICAgICAgICAgPSBhdmlvX3I4KHBiKTsKKyAgICBtdHYtPmltZ193aWR0aCAgICAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBtdHYtPmltZ19oZWlnaHQgICAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBtdHYtPmltZ19zZWdtZW50X3NpemUgID0gYXZpb19ybDE2KHBiKTsKKworICAgIC8qIEFzc3VtZSAxNmJwcCBldmVuIGlmIGNsYWltZWQgb3RoZXJ3aXNlLgorICAgICAqIFdlIGtub3cgaXRzIGdvaW5nIHRvIGJlIFJHQkc1NjUvNTU1IGFueXdheQorICAgICAqLworICAgIGlmIChtdHYtPmltZ19icHAgIT0gTVRWX0lNQUdFX0RFRkFVTFRfQlBQKSB7CisgICAgICAgIGF2X2xvZyAocywgQVZfTE9HX1dBUk5JTkcsICJIZWFkZXIgY2xhaW1zICVkYnBwICghPSAxNikuIElnbm9yaW5nXG4iLAorICAgICAgICAgICAgICAgIG10di0+aW1nX2JwcCk7CisgICAgICAgIG10di0+aW1nX2JwcCA9IE1UVl9JTUFHRV9ERUZBVUxUX0JQUDsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodCBpZiBtaXNzaW5nIGZyb20gaGVhZGVyICovCisKKyAgICBpZiAoIW10di0+aW1nX3dpZHRoICYmIG10di0+aW1nX2hlaWdodCA+IDAgJiYgbXR2LT5pbWdfYnBwID49IDgpCisgICAgICAgIG10di0+aW1nX3dpZHRoPW10di0+aW1nX3NlZ21lbnRfc2l6ZSAvIChtdHYtPmltZ19icHA+PjMpCisgICAgICAgICAgICAgICAgICAgICAgICAvIG10di0+aW1nX2hlaWdodDsKKworICAgIGlmICghbXR2LT5pbWdfaGVpZ2h0ICYmIG10di0+aW1nX3dpZHRoID4gMCAmJiBtdHYtPmltZ19icHAgPj0gOCkKKyAgICAgICAgbXR2LT5pbWdfaGVpZ2h0PW10di0+aW1nX3NlZ21lbnRfc2l6ZSAvIChtdHYtPmltZ19icHA+PjMpCisgICAgICAgICAgICAgICAgICAgICAgICAvIG10di0+aW1nX3dpZHRoOworCisgICAgaWYoIW10di0+aW1nX2hlaWdodCB8fCAhbXR2LT5pbWdfd2lkdGggfHwgIW10di0+aW1nX3NlZ21lbnRfc2l6ZSl7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ3aWR0aCBvciBoZWlnaHQgb3Igc2VnbWVudF9zaXplIGlzIGludmFsaWQgYW5kIEkgY2Fubm90IGNhbGN1bGF0ZSB0aGVtIGZyb20gb3RoZXIgaW5mb3JtYXRpb25cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdmlvX3NraXAocGIsIDQpOworICAgIGF1ZGlvX3N1YnNlZ21lbnRzID0gYXZpb19ybDE2KHBiKTsKKworICAgIGlmIChhdWRpb19zdWJzZWdtZW50cyA9PSAwKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiTVRWIGZpbGVzIHdpdGhvdXQgYXVkaW8iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIG10di0+ZnVsbF9zZWdtZW50X3NpemUgPQorICAgICAgICBhdWRpb19zdWJzZWdtZW50cyAqIChNVFZfQVVESU9fUEFERElOR19TSVpFICsgTVRWX0FTVUJDSFVOS19EQVRBX1NJWkUpICsKKyAgICAgICAgbXR2LT5pbWdfc2VnbWVudF9zaXplOworICAgIG10di0+dmlkZW9fZnBzICAgICAgICAgPSAobXR2LT5hdWRpb19iciAvIDQpIC8gYXVkaW9fc3Vic2VnbWVudHM7CisKKyAgICAvLyBGSVhNRSBBZGQgc2FuaXR5IGNoZWNrIGhlcmUKKworICAgIC8vIGFsbCBzeXN0ZW1zIGdvISBpbml0IGRlY29kZXJzCisKKyAgICAvLyB2aWRlbyAtIHJhdyByZ2I1NjUKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZighc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgbXR2LT52aWRlb19mcHMpOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgc3QtPmNvZGVjLT5waXhfZm10ICAgICAgICAgPSBBVl9QSVhfRk1UX1JHQjU2NUJFOworICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICAgICAgID0gbXR2LT5pbWdfd2lkdGg7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgICAgICAgPSBtdHYtPmltZ19oZWlnaHQ7CisgICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgICAgICAgPSBhdl9zdHJkdXAoIkJvdHRvbVVwIik7CisgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAgPSA5OworCisgICAgLy8gYXVkaW8gLSBtcDMKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZighc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgTVRWX0FVRElPX1NBTVBMSU5HX1JBVEUpOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVAzOworICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICAgICAgID0gbXR2LT5hdWRpb19icjsKKyAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgICAgICA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CisKKyAgICAvLyBKdW1wIG92ZXIgaGVhZGVyCisKKyAgICBpZihhdmlvX3NlZWsocGIsIE1UVl9IRUFERVJfU0laRSwgU0VFS19TRVQpICE9IE1UVl9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIHJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgbXR2X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNVFZEZW11eENvbnRleHQgKm10diA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgcmV0OworCisgICAgaWYoKGF2aW9fdGVsbChwYikgLSBzLT5kYXRhX29mZnNldCArIG10di0+aW1nX3NlZ21lbnRfc2l6ZSkgJSBtdHYtPmZ1bGxfc2VnbWVudF9zaXplKQorICAgIHsKKyAgICAgICAgYXZpb19za2lwKHBiLCBNVFZfQVVESU9fUEFERElOR19TSVpFKTsKKworICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIE1UVl9BU1VCQ0hVTktfREFUQV9TSVpFKTsKKyAgICAgICAgaWYocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcGt0LT5wb3MgLT0gTVRWX0FVRElPX1BBRERJTkdfU0laRTsKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAxOworCisgICAgfWVsc2UKKyAgICB7CisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgbXR2LT5pbWdfc2VnbWVudF9zaXplKTsKKyAgICAgICAgaWYocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbXR2X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm10diIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1UViIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNVFZEZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IG10dl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBtdHZfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gbXR2X3JlYWRfcGFja2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tdXguYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjM4MzJjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L211eC5jCkBAIC0wLDAgKzEsMTA1MSBAQAorLyoKKyAqIG11eGluZyBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoaW4gRkZtcGVnCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lc3RhbXAuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgImlkM3YyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgInJpZmYuaCIKKyNpbmNsdWRlICJhdWRpb2ludGVybGVhdmUuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpZiBDT05GSUdfTkVUV09SSworI2luY2x1ZGUgIm5ldHdvcmsuaCIKKyNlbmRpZgorCisjdW5kZWYgTkRFQlVHCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8qKgorICogQGZpbGUKKyAqIG11eGluZyBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoaW4gbGliYXZmb3JtYXQKKyAqLworCisvKiBmcmFjdGlvbiBoYW5kbGluZyAqLworCisvKioKKyAqIGYgPSB2YWwgKyAobnVtIC8gZGVuKSArIDAuNS4KKyAqCisgKiAnbnVtJyBpcyBub3JtYWxpemVkIHNvIHRoYXQgaXQgaXMgc3VjaCBhcyAwIDw9IG51bSA8IGRlbi4KKyAqCisgKiBAcGFyYW0gZiBmcmFjdGlvbmFsIG51bWJlcgorICogQHBhcmFtIHZhbCBpbnRlZ2VyIHZhbHVlCisgKiBAcGFyYW0gbnVtIG11c3QgYmUgPj0gMAorICogQHBhcmFtIGRlbiBtdXN0IGJlID49IDEKKyAqLworc3RhdGljIHZvaWQgZnJhY19pbml0KEFWRnJhYyAqZiwgaW50NjRfdCB2YWwsIGludDY0X3QgbnVtLCBpbnQ2NF90IGRlbikKK3sKKyAgICBudW0gKz0gKGRlbiA+PiAxKTsKKyAgICBpZiAobnVtID49IGRlbikgeworICAgICAgICB2YWwgKz0gbnVtIC8gZGVuOworICAgICAgICBudW0gID0gbnVtICUgZGVuOworICAgIH0KKyAgICBmLT52YWwgPSB2YWw7CisgICAgZi0+bnVtID0gbnVtOworICAgIGYtPmRlbiA9IGRlbjsKK30KKworLyoqCisgKiBGcmFjdGlvbmFsIGFkZGl0aW9uIHRvIGY6IGYgPSBmICsgKGluY3IgLyBmLT5kZW4pLgorICoKKyAqIEBwYXJhbSBmIGZyYWN0aW9uYWwgbnVtYmVyCisgKiBAcGFyYW0gaW5jciBpbmNyZW1lbnQsIGNhbiBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZQorICovCitzdGF0aWMgdm9pZCBmcmFjX2FkZChBVkZyYWMgKmYsIGludDY0X3QgaW5jcikKK3sKKyAgICBpbnQ2NF90IG51bSwgZGVuOworCisgICAgbnVtID0gZi0+bnVtICsgaW5jcjsKKyAgICBkZW4gPSBmLT5kZW47CisgICAgaWYgKG51bSA8IDApIHsKKyAgICAgICAgZi0+dmFsICs9IG51bSAvIGRlbjsKKyAgICAgICAgbnVtICAgICA9IG51bSAlIGRlbjsKKyAgICAgICAgaWYgKG51bSA8IDApIHsKKyAgICAgICAgICAgIG51bSArPSBkZW47CisgICAgICAgICAgICBmLT52YWwtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobnVtID49IGRlbikgeworICAgICAgICBmLT52YWwgKz0gbnVtIC8gZGVuOworICAgICAgICBudW0gICAgID0gbnVtICUgZGVuOworICAgIH0KKyAgICBmLT5udW0gPSBudW07Cit9CisKK0FWUmF0aW9uYWwgZmZfY2hvb3NlX3RpbWViYXNlKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBpbnQgbWluX3ByZWNpc2lvbikKK3sKKyAgICBBVlJhdGlvbmFsIHE7CisgICAgaW50IGo7CisKKyAgICBxID0gc3QtPnRpbWVfYmFzZTsKKworICAgIGZvciAoaj0yOyBqPDE0OyBqKz0gMSsoaj4yKSkKKyAgICAgICAgd2hpbGUgKHEuZGVuIC8gcS5udW0gPCBtaW5fcHJlY2lzaW9uICYmIHEubnVtICUgaiA9PSAwKQorICAgICAgICAgICAgcS5udW0gLz0gajsKKyAgICB3aGlsZSAocS5kZW4gLyBxLm51bSA8IG1pbl9wcmVjaXNpb24gJiYgcS5kZW4gPCAoMTw8MjQpKQorICAgICAgICBxLmRlbiA8PD0gMTsKKworICAgIHJldHVybiBxOworfQorCitpbnQgYXZmb3JtYXRfYWxsb2Nfb3V0cHV0X2NvbnRleHQyKEFWRm9ybWF0Q29udGV4dCAqKmF2Y3R4LCBBVk91dHB1dEZvcm1hdCAqb2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKnMgPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7CisgICAgaW50IHJldCA9IDA7CisKKyAgICAqYXZjdHggPSBOVUxMOworICAgIGlmICghcykKKyAgICAgICAgZ290byBub21lbTsKKworICAgIGlmICghb2Zvcm1hdCkgeworICAgICAgICBpZiAoZm9ybWF0KSB7CisgICAgICAgICAgICBvZm9ybWF0ID0gYXZfZ3Vlc3NfZm9ybWF0KGZvcm1hdCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIW9mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUmVxdWVzdGVkIG91dHB1dCBmb3JtYXQgJyVzJyBpcyBub3QgYSBzdWl0YWJsZSBvdXRwdXQgZm9ybWF0XG4iLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2Zvcm1hdCA9IGF2X2d1ZXNzX2Zvcm1hdChOVUxMLCBmaWxlbmFtZSwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIW9mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBmaW5kIGEgc3VpdGFibGUgb3V0cHV0IGZvcm1hdCBmb3IgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5vZm9ybWF0ID0gb2Zvcm1hdDsKKyAgICBpZiAocy0+b2Zvcm1hdC0+cHJpdl9kYXRhX3NpemUgPiAwKSB7CisgICAgICAgIHMtPnByaXZfZGF0YSA9IGF2X21hbGxvY3oocy0+b2Zvcm1hdC0+cHJpdl9kYXRhX3NpemUpOworICAgICAgICBpZiAoIXMtPnByaXZfZGF0YSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIGlmIChzLT5vZm9ybWF0LT5wcml2X2NsYXNzKSB7CisgICAgICAgICAgICAqKGNvbnN0IEFWQ2xhc3MqKilzLT5wcml2X2RhdGE9IHMtPm9mb3JtYXQtPnByaXZfY2xhc3M7CisgICAgICAgICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKHMtPnByaXZfZGF0YSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgcy0+cHJpdl9kYXRhID0gTlVMTDsKKworICAgIGlmIChmaWxlbmFtZSkKKyAgICAgICAgYXZfc3RybGNweShzLT5maWxlbmFtZSwgZmlsZW5hbWUsIHNpemVvZihzLT5maWxlbmFtZSkpOworICAgICphdmN0eCA9IHM7CisgICAgcmV0dXJuIDA7Citub21lbToKKyAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT3V0IG9mIG1lbW9yeVxuIik7CisgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworZXJyb3I6CisgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfY29kZWNfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0KQoreworICAgIGNvbnN0IEFWQ29kZWNUYWcgKmF2Y3RhZzsKKyAgICBpbnQgbjsKKyAgICBlbnVtIEFWQ29kZWNJRCBpZCA9IEFWX0NPREVDX0lEX05PTkU7CisgICAgaW50NjRfdCB0YWcgID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGF0IHRhZyArIGlkIGlzIGluIHRoZSB0YWJsZQorICAgICAqIElmIG5laXRoZXIgaXMgaW4gdGhlIHRhYmxlIC0+IE9LCisgICAgICogSWYgdGFnIGlzIGluIHRoZSB0YWJsZSB3aXRoIGFub3RoZXIgaWQgLT4gRkFJTAorICAgICAqIElmIGlkIGlzIGluIHRoZSB0YWJsZSB3aXRoIGFub3RoZXIgdGFnIC0+IEZBSUwgdW5sZXNzIHN0cmljdCA8IG5vcm1hbAorICAgICAqLworICAgIGZvciAobiA9IDA7IHMtPm9mb3JtYXQtPmNvZGVjX3RhZ1tuXTsgbisrKSB7CisgICAgICAgIGF2Y3RhZyA9IHMtPm9mb3JtYXQtPmNvZGVjX3RhZ1tuXTsKKyAgICAgICAgd2hpbGUgKGF2Y3RhZy0+aWQgIT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgaWYgKGF2cHJpdl90b3VwcGVyNChhdmN0YWctPnRhZykgPT0gYXZwcml2X3RvdXBwZXI0KHN0LT5jb2RlYy0+Y29kZWNfdGFnKSkgeworICAgICAgICAgICAgICAgIGlkID0gYXZjdGFnLT5pZDsKKyAgICAgICAgICAgICAgICBpZiAoaWQgPT0gc3QtPmNvZGVjLT5jb2RlY19pZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZjdGFnLT5pZCA9PSBzdC0+Y29kZWMtPmNvZGVjX2lkKQorICAgICAgICAgICAgICAgIHRhZyA9IGF2Y3RhZy0+dGFnOworICAgICAgICAgICAgYXZjdGFnKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGlkICE9IEFWX0NPREVDX0lEX05PTkUpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh0YWcgPj0gMCAmJiAocy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID49IEZGX0NPTVBMSUFOQ0VfTk9STUFMKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBpbml0X211eGVyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykKK3sKKyAgICBpbnQgcmV0ID0gMCwgaTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgQVZEaWN0aW9uYXJ5ICp0bXAgPSBOVUxMOworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IE5VTEw7CisgICAgQVZPdXRwdXRGb3JtYXQgKm9mID0gcy0+b2Zvcm1hdDsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZTsKKworICAgIGlmIChvcHRpb25zKQorICAgICAgICBhdl9kaWN0X2NvcHkoJnRtcCwgKm9wdGlvbnMsIDApOworCisgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0X2RpY3QocywgJnRtcCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmIChzLT5wcml2X2RhdGEgJiYgcy0+b2Zvcm1hdC0+cHJpdl9jbGFzcyAmJiAqKGNvbnN0IEFWQ2xhc3MqKilzLT5wcml2X2RhdGE9PXMtPm9mb3JtYXQtPnByaXZfY2xhc3MgJiYKKyAgICAgICAgKHJldCA9IGF2X29wdF9zZXRfZGljdDIocy0+cHJpdl9kYXRhLCAmdG1wLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyNpZiBGRl9BUElfTEFWRl9CSVRFWEFDVAorICAgIGlmIChzLT5uYl9zdHJlYW1zICYmIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5mbGFncyAmIENPREVDX0ZMQUdfQklURVhBQ1QpCisgICAgICAgIHMtPmZsYWdzIHw9IEFWRk1UX0ZMQUdfQklURVhBQ1Q7CisjZW5kaWYKKworICAgIC8vIHNvbWUgc2FuaXR5IGNoZWNrcworICAgIGlmIChzLT5uYl9zdHJlYW1zID09IDAgJiYgIShvZi0+ZmxhZ3MgJiBBVkZNVF9OT1NUUkVBTVMpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyBzdHJlYW1zIHRvIG11eCB3ZXJlIHNwZWNpZmllZFxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgc3QgICAgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBjb2RlYyA9IHN0LT5jb2RlYzsKKworI2lmIEZGX0FQSV9MQVZGX0NPREVDX1RCCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgIGlmICghc3QtPnRpbWVfYmFzZS5udW0gJiYgY29kZWMtPnRpbWVfYmFzZS5udW0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVzaW5nIEFWU3RyZWFtLmNvZGVjLnRpbWVfYmFzZSBhcyBhICIKKyAgICAgICAgICAgICAgICAgICAidGltZWJhc2UgaGludCB0byB0aGUgbXV4ZXIgaXMgZGVwcmVjYXRlZC4gU2V0ICIKKyAgICAgICAgICAgICAgICAgICAiQVZTdHJlYW0udGltZV9iYXNlIGluc3RlYWQuXG4iKTsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBjb2RlYy0+dGltZV9iYXNlLm51bSwgY29kZWMtPnRpbWVfYmFzZS5kZW4pOworICAgICAgICB9CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorCisgICAgICAgIGlmICghc3QtPnRpbWVfYmFzZS5udW0pIHsKKyAgICAgICAgICAgIC8qIGZhbGwgYmFjayBvbiB0aGUgZGVmYXVsdCB0aW1lYmFzZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgY29kZWMtPnNhbXBsZV9yYXRlKQorICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBjb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCA5MDAwMCk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgaWYgKGNvZGVjLT5zYW1wbGVfcmF0ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInNhbXBsZSByYXRlIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNvZGVjLT5ibG9ja19hbGlnbikKKyAgICAgICAgICAgICAgICBjb2RlYy0+YmxvY2tfYWxpZ24gPSBjb2RlYy0+Y2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoY29kZWMtPmNvZGVjX2lkKSA+PiAzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgaWYgKChjb2RlYy0+d2lkdGggPD0gMCB8fCBjb2RlYy0+aGVpZ2h0IDw9IDApICYmCisgICAgICAgICAgICAgICAgIShvZi0+ZmxhZ3MgJiBBVkZNVF9OT0RJTUVOU0lPTlMpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImRpbWVuc2lvbnMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdl9jbXBfcShzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbywgY29kZWMtPnNhbXBsZV9hc3BlY3RfcmF0aW8pCisgICAgICAgICAgICAgICAgJiYgRkZBQlMoYXZfcTJkKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvKSAtIGF2X3EyZChjb2RlYy0+c2FtcGxlX2FzcGVjdF9yYXRpbykpID4gMC4wMDQqYXZfcTJkKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvKQorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBc3BlY3QgcmF0aW8gbWlzbWF0Y2ggYmV0d2VlbiBtdXhlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCVkLyVkKSBhbmQgZW5jb2RlciBsYXllciAoJWQvJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZi0+Y29kZWNfdGFnKSB7CisgICAgICAgICAgICBpZiAoICAgY29kZWMtPmNvZGVjX3RhZworICAgICAgICAgICAgICAgICYmIGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTworICAgICAgICAgICAgICAgICYmICggICBhdl9jb2RlY19nZXRfdGFnKG9mLT5jb2RlY190YWcsIGNvZGVjLT5jb2RlY19pZCkgPT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBhdl9jb2RlY19nZXRfdGFnKG9mLT5jb2RlY190YWcsIGNvZGVjLT5jb2RlY19pZCkgPT0gTUtUQUcoJ3InLCAnYScsICd3JywgJyAnKSkKKyAgICAgICAgICAgICAgICAmJiAhdmFsaWRhdGVfY29kZWNfdGFnKHMsIHN0KSkgeworICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHJhd3ZpZGVvIGVuY29kaW5nIHN5c3RlbSBlbmRzIHVwIHNldHRpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGUgd3JvbmcgY29kZWNfdGFnIGZvciBhdmkvbW92LCB3ZSBvdmVycmlkZSBpdCBoZXJlCisgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX3RhZyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29kZWMtPmNvZGVjX3RhZykgeworICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGVfY29kZWNfdGFnKHMsIHN0KSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIHRhZ2J1ZlszMl0sIHRhZ2J1ZjJbMzJdOworICAgICAgICAgICAgICAgICAgICBhdl9nZXRfY29kZWNfdGFnX3N0cmluZyh0YWdidWYsIHNpemVvZih0YWdidWYpLCBjb2RlYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2NvZGVjX3RhZ19zdHJpbmcodGFnYnVmMiwgc2l6ZW9mKHRhZ2J1ZjIpLCBhdl9jb2RlY19nZXRfdGFnKHMtPm9mb3JtYXQtPmNvZGVjX3RhZywgY29kZWMtPmNvZGVjX2lkKSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFnICVzLzB4JTA4eCBpbmNvbXBhdGlibGUgd2l0aCBvdXRwdXQgY29kZWMgaWQgJyVkJyAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnYnVmLCBjb2RlYy0+Y29kZWNfdGFnLCBjb2RlYy0+Y29kZWNfaWQsIHRhZ2J1ZjIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX3RhZyA9IGF2X2NvZGVjX2dldF90YWcob2YtPmNvZGVjX3RhZywgY29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZi0+ZmxhZ3MgJiBBVkZNVF9HTE9CQUxIRUFERVIgJiYKKyAgICAgICAgICAgICEoY29kZWMtPmZsYWdzICYgQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiQ29kZWMgZm9yIHN0cmVhbSAlZCBkb2VzIG5vdCB1c2UgZ2xvYmFsIGhlYWRlcnMgIgorICAgICAgICAgICAgICAgICAgICJidXQgY29udGFpbmVyIGZvcm1hdCByZXF1aXJlcyBnbG9iYWwgaGVhZGVyc1xuIiwgaSk7CisKKyAgICAgICAgaWYgKGNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UKQorICAgICAgICAgICAgcy0+aW50ZXJuYWwtPm5iX2ludGVybGVhdmVkX3N0cmVhbXMrKzsKKyAgICB9CisKKyAgICBpZiAoIXMtPnByaXZfZGF0YSAmJiBvZi0+cHJpdl9kYXRhX3NpemUgPiAwKSB7CisgICAgICAgIHMtPnByaXZfZGF0YSA9IGF2X21hbGxvY3oob2YtPnByaXZfZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKCFzLT5wcml2X2RhdGEpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAob2YtPnByaXZfY2xhc3MpIHsKKyAgICAgICAgICAgICooY29uc3QgQVZDbGFzcyAqKilzLT5wcml2X2RhdGEgPSBvZi0+cHJpdl9jbGFzczsKKyAgICAgICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHMocy0+cHJpdl9kYXRhKTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZfb3B0X3NldF9kaWN0MihzLT5wcml2X2RhdGEsICZ0bXAsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc2V0IG11eGVyIGlkZW50aWZpY2F0aW9uIHN0cmluZyAqLworICAgIGlmICghKHMtPmZsYWdzICYgQVZGTVRfRkxBR19CSVRFWEFDVCkpIHsKKyAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCAiZW5jb2RlciIsIExJQkFWRk9STUFUX0lERU5ULCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJlbmNvZGVyIiwgTlVMTCwgMCk7CisgICAgfQorCisgICAgZm9yIChlID0gTlVMTDsgZSA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiZW5jb2Rlci0iLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpOyApIHsKKyAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBlLT5rZXksIE5VTEwsIDApOworICAgIH0KKworICAgIGlmIChvcHRpb25zKSB7CisgICAgICAgICBhdl9kaWN0X2ZyZWUob3B0aW9ucyk7CisgICAgICAgICAqb3B0aW9ucyA9IHRtcDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9kaWN0X2ZyZWUoJnRtcCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbml0X3B0cyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgLyogaW5pdCBQVFMgZ2VuZXJhdGlvbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaW50NjRfdCBkZW4gPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworCisgICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgZGVuID0gKGludDY0X3Qpc3QtPnRpbWVfYmFzZS5udW0gKiBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgZGVuID0gKGludDY0X3Qpc3QtPnRpbWVfYmFzZS5udW0gKiBzdC0+Y29kZWMtPnRpbWVfYmFzZS5kZW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChkZW4gIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIGlmIChkZW4gPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgZnJhY19pbml0KCZzdC0+cHRzLCAwLCAwLCBkZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdmZvcm1hdF93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKQoreworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKHJldCA9IGluaXRfbXV4ZXIocywgb3B0aW9ucykpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+b2Zvcm1hdC0+d3JpdGVfaGVhZGVyKSB7CisgICAgICAgIHJldCA9IHMtPm9mb3JtYXQtPndyaXRlX2hlYWRlcihzKTsKKyAgICAgICAgaWYgKHJldCA+PSAwICYmIHMtPnBiICYmIHMtPnBiLT5lcnJvciA8IDApCisgICAgICAgICAgICByZXQgPSBzLT5wYi0+ZXJyb3I7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHMtPmZsdXNoX3BhY2tldHMgJiYgcy0+cGIgJiYgcy0+cGItPmVycm9yID49IDAgJiYgcy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0ZMVVNIX1BBQ0tFVFMpCisgICAgICAgICAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGluaXRfcHRzKHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+YXZvaWRfbmVnYXRpdmVfdHMgPCAwKSB7CisgICAgICAgIGF2X2Fzc2VydDIocy0+YXZvaWRfbmVnYXRpdmVfdHMgPT0gQVZGTVRfQVZPSURfTkVHX1RTX0FVVE8pOworICAgICAgICBpZiAocy0+b2Zvcm1hdC0+ZmxhZ3MgJiAoQVZGTVRfVFNfTkVHQVRJVkUgfCBBVkZNVF9OT1RJTUVTVEFNUFMpKSB7CisgICAgICAgICAgICBzLT5hdm9pZF9uZWdhdGl2ZV90cyA9IDA7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcy0+YXZvaWRfbmVnYXRpdmVfdHMgPSBBVkZNVF9BVk9JRF9ORUdfVFNfTUFLRV9OT05fTkVHQVRJVkU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQVZfUEtUX0ZMQUdfVU5DT0RFRF9GUkFNRSAweDIwMDAKKworLyogTm90ZTogdXNpbmcgc2l6ZW9mKEFWRnJhbWUpIGZyb20gb3V0c2lkZSBsYXZ1IGlzIHVuc2FmZSBpbiBnZW5lcmFsLCBidXQKKyAgIGl0IGlzIG9ubHkgYmVpbmcgdXNlZCBpbnRlcm5hbGx5IHRvIHRoaXMgZmlsZSBhcyBhIGNvbnNpc3RlbmN5IGNoZWNrLgorICAgVGhlIHZhbHVlIGlzIGNob3NlbiB0byBiZSB2ZXJ5IHVubGlrZWx5IHRvIGFwcGVhciBvbiBpdHMgb3duIGFuZCB0byBjYXVzZQorICAgaW1tZWRpYXRlIGZhaWx1cmUgaWYgdXNlZCBhbnl3aGVyZSBhcyBhIHJlYWwgc2l6ZS4gKi8KKyNkZWZpbmUgVU5DT0RFRF9GUkFNRV9QQUNLRVRfU0laRSAoSU5UX01JTiAvIDMgKiAyICsgKGludClzaXplb2YoQVZGcmFtZSkpCisKKworLy9GSVhNRSBtZXJnZSB3aXRoIGNvbXB1dGVfcGt0X2ZpZWxkcworc3RhdGljIGludCBjb21wdXRlX3BrdF9maWVsZHMyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0KQoreworICAgIGludCBkZWxheSA9IEZGTUFYKHN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzLCBzdC0+Y29kZWMtPm1heF9iX2ZyYW1lcyA+IDApOworICAgIGludCBudW0sIGRlbiwgaTsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKworICAgIGF2X2Rsb2cocywgImNvbXB1dGVfcGt0X2ZpZWxkczI6IHB0czolcyBkdHM6JXMgY3VyX2R0czolcyBiOiVkIHNpemU6JWQgc3Q6JWRcbiIsCisgICAgICAgICAgICBhdl90czJzdHIocGt0LT5wdHMpLCBhdl90czJzdHIocGt0LT5kdHMpLCBhdl90czJzdHIoc3QtPmN1cl9kdHMpLCBkZWxheSwgcGt0LT5zaXplLCBwa3QtPnN0cmVhbV9pbmRleCk7CisKKyAgICBpZiAocGt0LT5kdXJhdGlvbiA8IDAgJiYgc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJQYWNrZXQgd2l0aCBpbnZhbGlkIGR1cmF0aW9uICVkIGluIHN0cmVhbSAlZFxuIiwKKyAgICAgICAgICAgICAgIHBrdC0+ZHVyYXRpb24sIHBrdC0+c3RyZWFtX2luZGV4KTsKKyAgICAgICAgcGt0LT5kdXJhdGlvbiA9IDA7CisgICAgfQorCisgICAgLyogZHVyYXRpb24gZmllbGQgKi8KKyAgICBpZiAocGt0LT5kdXJhdGlvbiA9PSAwKSB7CisgICAgICAgIGZmX2NvbXB1dGVfZnJhbWVfZHVyYXRpb24ocywgJm51bSwgJmRlbiwgc3QsIE5VTEwsIHBrdCk7CisgICAgICAgIGlmIChkZW4gJiYgbnVtKSB7CisgICAgICAgICAgICBwa3QtPmR1cmF0aW9uID0gYXZfcmVzY2FsZSgxLCBudW0gKiAoaW50NjRfdClzdC0+dGltZV9iYXNlLmRlbiAqIHN0LT5jb2RlYy0+dGlja3NfcGVyX2ZyYW1lLCBkZW4gKiAoaW50NjRfdClzdC0+dGltZV9iYXNlLm51bSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGt0LT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgZGVsYXkgPT0gMCkKKyAgICAgICAgcGt0LT5wdHMgPSBwa3QtPmR0czsKKworICAgIC8vWFhYL0ZJWE1FIHRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjayB1bnRpbCBhbGwgZW5jb2RlcnMgb3V0cHV0IHB0cworICAgIGlmICgocGt0LT5wdHMgPT0gMCB8fCBwa3QtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkgJiYgcGt0LT5kdHMgPT0gQVZfTk9QVFNfVkFMVUUgJiYgIWRlbGF5KSB7CisgICAgICAgIHN0YXRpYyBpbnQgd2FybmVkOworICAgICAgICBpZiAoIXdhcm5lZCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiRW5jb2RlciBkaWQgbm90IHByb2R1Y2UgcHJvcGVyIHB0cywgbWFraW5nIHNvbWUgdXAuXG4iKTsKKyAgICAgICAgICAgIHdhcm5lZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcGt0LT5kdHMgPQorLy8gICAgICAgIHBrdC0+cHRzPSBzdC0+Y3VyX2R0czsKKyAgICAgICAgICAgIHBrdC0+cHRzID0gc3QtPnB0cy52YWw7CisgICAgfQorCisgICAgLy9jYWxjdWxhdGUgZHRzIGZyb20gcHRzCisgICAgaWYgKHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIHBrdC0+ZHRzID09IEFWX05PUFRTX1ZBTFVFICYmIGRlbGF5IDw9IE1BWF9SRU9SREVSX0RFTEFZKSB7CisgICAgICAgIHN0LT5wdHNfYnVmZmVyWzBdID0gcGt0LT5wdHM7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBkZWxheSArIDEgJiYgc3QtPnB0c19idWZmZXJbaV0gPT0gQVZfTk9QVFNfVkFMVUU7IGkrKykKKyAgICAgICAgICAgIHN0LT5wdHNfYnVmZmVyW2ldID0gcGt0LT5wdHMgKyAoaSAtIGRlbGF5IC0gMSkgKiBwa3QtPmR1cmF0aW9uOworICAgICAgICBmb3IgKGkgPSAwOyBpPGRlbGF5ICYmIHN0LT5wdHNfYnVmZmVyW2ldID4gc3QtPnB0c19idWZmZXJbaSArIDFdOyBpKyspCisgICAgICAgICAgICBGRlNXQVAoaW50NjRfdCwgc3QtPnB0c19idWZmZXJbaV0sIHN0LT5wdHNfYnVmZmVyW2kgKyAxXSk7CisKKyAgICAgICAgcGt0LT5kdHMgPSBzdC0+cHRzX2J1ZmZlclswXTsKKyAgICB9CisKKyAgICBpZiAoc3QtPmN1cl9kdHMgJiYgc3QtPmN1cl9kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgKCghKHMtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfVFNfTk9OU1RSSUNUKSAmJgorICAgICAgICAgIHN0LT5jdXJfZHRzID49IHBrdC0+ZHRzKSB8fCBzdC0+Y3VyX2R0cyA+IHBrdC0+ZHRzKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkFwcGxpY2F0aW9uIHByb3ZpZGVkIGludmFsaWQsIG5vbiBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgZHRzIHRvIG11eGVyIGluIHN0cmVhbSAlZDogJXMgPj0gJXNcbiIsCisgICAgICAgICAgICAgICBzdC0+aW5kZXgsIGF2X3RzMnN0cihzdC0+Y3VyX2R0cyksIGF2X3RzMnN0cihwa3QtPmR0cykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAocGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0LT5wdHMgPCBwa3QtPmR0cykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInB0cyAoJXMpIDwgZHRzICglcykgaW4gc3RyZWFtICVkXG4iLAorICAgICAgICAgICAgICAgYXZfdHMyc3RyKHBrdC0+cHRzKSwgYXZfdHMyc3RyKHBrdC0+ZHRzKSwKKyAgICAgICAgICAgICAgIHN0LT5pbmRleCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZfZGxvZyhzLCAiYXZfd3JpdGVfZnJhbWU6IHB0czI6JXMgZHRzMjolc1xuIiwKKyAgICAgICAgICAgIGF2X3RzMnN0cihwa3QtPnB0cyksIGF2X3RzMnN0cihwa3QtPmR0cykpOworICAgIHN0LT5jdXJfZHRzID0gcGt0LT5kdHM7CisgICAgc3QtPnB0cy52YWwgPSBwa3QtPmR0czsKKworICAgIC8qIHVwZGF0ZSBwdHMgKi8KKyAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBmcmFtZV9zaXplID0gKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19VTkNPREVEX0ZSQU1FKSA/CisgICAgICAgICAgICAgICAgICAgICAoKEFWRnJhbWUgKilwa3QtPmRhdGEpLT5uYl9zYW1wbGVzIDoKKyAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihzdC0+Y29kZWMsIHBrdC0+c2l6ZSk7CisKKyAgICAgICAgLyogSEFDSy9GSVhNRSwgd2Ugc2tpcCB0aGUgaW5pdGlhbCAwIHNpemUgcGFja2V0cyBhcyB0aGV5IGFyZSBtb3N0CisgICAgICAgICAqIGxpa2VseSBlcXVhbCB0byB0aGUgZW5jb2RlciBkZWxheSwgYnV0IGl0IHdvdWxkIGJlIGJldHRlciBpZiB3ZQorICAgICAgICAgKiBoYWQgdGhlIHJlYWwgdGltZXN0YW1wcyBmcm9tIHRoZSBlbmNvZGVyICovCisgICAgICAgIGlmIChmcmFtZV9zaXplID49IDAgJiYgKHBrdC0+c2l6ZSB8fCBzdC0+cHRzLm51bSAhPSBzdC0+cHRzLmRlbiA+PiAxIHx8IHN0LT5wdHMudmFsKSkgeworICAgICAgICAgICAgZnJhY19hZGQoJnN0LT5wdHMsIChpbnQ2NF90KXN0LT50aW1lX2Jhc2UuZGVuICogZnJhbWVfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIGZyYWNfYWRkKCZzdC0+cHRzLCAoaW50NjRfdClzdC0+dGltZV9iYXNlLmRlbiAqIHN0LT5jb2RlYy0+dGltZV9iYXNlLm51bSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBNYWtlIHRpbWVzdGFtcHMgbm9uIG5lZ2F0aXZlLCBtb3ZlIHNpZGUgZGF0YSBmcm9tIHBheWxvYWQgdG8gaW50ZXJuYWwgc3RydWN0LCBjYWxsIG11eGVyLCBhbmQgcmVzdG9yZQorICogc2lkZWRhdGEuCisgKgorICogRklYTUU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIE5FVkVSIGdldCB1bmRlZmluZWQgcHRzL2R0cyBiZXNpZGUgd2hlbiB0aGUKKyAqIEFWRk1UX05PVElNRVNUQU1QUyBpcyBzZXQuCisgKiBUaG9zZSBhZGRpdGlvbmFsIHNhZmV0eSBjaGVja3Mgc2hvdWxkIGJlIGRyb3BwZWQgb25jZSB0aGUgY29ycmVjdCBjaGVja3MKKyAqIGFyZSBzZXQgaW4gdGhlIGNhbGxlcnMuCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0LCBkaWRfc3BsaXQ7CisKKyAgICBpZiAocy0+b3V0cHV0X3RzX29mZnNldCkgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICAgICAgaW50NjRfdCBvZmZzZXQgPSBhdl9yZXNjYWxlX3Eocy0+b3V0cHV0X3RzX29mZnNldCwgQVZfVElNRV9CQVNFX1EsIHN0LT50aW1lX2Jhc2UpOworCisgICAgICAgIGlmIChwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHBrdC0+ZHRzICs9IG9mZnNldDsKKyAgICAgICAgaWYgKHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgcGt0LT5wdHMgKz0gb2Zmc2V0OworICAgIH0KKworICAgIGlmIChzLT5hdm9pZF9uZWdhdGl2ZV90cyA+IDApIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gc3QtPm11eF90c19vZmZzZXQ7CisKKyAgICAgICAgaWYgKHMtPm9mZnNldCA9PSBBVl9OT1BUU19WQUxVRSAmJiBwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICAgICAgKHBrdC0+ZHRzIDwgMCB8fCBzLT5hdm9pZF9uZWdhdGl2ZV90cyA9PSBBVkZNVF9BVk9JRF9ORUdfVFNfTUFLRV9aRVJPKSkgeworICAgICAgICAgICAgcy0+b2Zmc2V0ID0gLXBrdC0+ZHRzOworICAgICAgICAgICAgcy0+b2Zmc2V0X3RpbWViYXNlID0gc3QtPnRpbWVfYmFzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5vZmZzZXQgIT0gQVZfTk9QVFNfVkFMVUUgJiYgIW9mZnNldCkgeworICAgICAgICAgICAgb2Zmc2V0ID0gc3QtPm11eF90c19vZmZzZXQgPQorICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcV9ybmQocy0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+b2Zmc2V0X3RpbWViYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1JPVU5EX1VQKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHBrdC0+ZHRzICs9IG9mZnNldDsKKyAgICAgICAgaWYgKHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgcGt0LT5wdHMgKz0gb2Zmc2V0OworCisgICAgICAgIGF2X2Fzc2VydDIocGt0LT5kdHMgPT0gQVZfTk9QVFNfVkFMVUUgfHwgcGt0LT5kdHMgPj0gMCB8fCBzLT5tYXhfaW50ZXJsZWF2ZV9kZWx0YSA+IDApOworICAgICAgICBpZiAocGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0LT5kdHMgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIlBhY2tldHMgcG9vcmx5IGludGVybGVhdmVkLCBmYWlsZWQgdG8gYXZvaWQgbmVnYXRpdmUgIgorICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgJXMgaW4gc3RyZWFtICVkLlxuIgorICAgICAgICAgICAgICAgICAgICJUcnkgLW1heF9pbnRlcmxlYXZlX2RlbHRhIDAgYXMgYSBwb3NzaWJsZSB3b3JrYXJvdW5kLlxuIiwKKyAgICAgICAgICAgICAgICAgICBhdl90czJzdHIocGt0LT5kdHMpLAorICAgICAgICAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4CisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorCisgICAgZGlkX3NwbGl0ID0gYXZfcGFja2V0X3NwbGl0X3NpZGVfZGF0YShwa3QpOworICAgIGlmICgocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX1VOQ09ERURfRlJBTUUpKSB7CisgICAgICAgIEFWRnJhbWUgKmZyYW1lID0gKEFWRnJhbWUgKilwa3QtPmRhdGE7CisgICAgICAgIGF2X2Fzc2VydDAocGt0LT5zaXplID09IFVOQ09ERURfRlJBTUVfUEFDS0VUX1NJWkUpOworICAgICAgICByZXQgPSBzLT5vZm9ybWF0LT53cml0ZV91bmNvZGVkX2ZyYW1lKHMsIHBrdC0+c3RyZWFtX2luZGV4LCAmZnJhbWUsIDApOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gcy0+b2Zvcm1hdC0+d3JpdGVfcGFja2V0KHMsIHBrdCk7CisgICAgfQorCisgICAgaWYgKHMtPmZsdXNoX3BhY2tldHMgJiYgcy0+cGIgJiYgcmV0ID49IDAgJiYgcy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0ZMVVNIX1BBQ0tFVFMpCisgICAgICAgIGF2aW9fZmx1c2gocy0+cGIpOworCisgICAgaWYgKGRpZF9zcGxpdCkKKyAgICAgICAgYXZfcGFja2V0X21lcmdlX3NpZGVfZGF0YShwa3QpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjaGVja19wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGlmICghcGt0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChwa3QtPnN0cmVhbV9pbmRleCA8IDAgfHwgcGt0LT5zdHJlYW1faW5kZXggPj0gcy0+bmJfc3RyZWFtcykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYWNrZXQgc3RyZWFtIGluZGV4OiAlZFxuIiwKKyAgICAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAocy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJSZWNlaXZlZCBhIHBhY2tldCBmb3IgYW4gYXR0YWNobWVudCBzdHJlYW0uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X3dyaXRlX2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gY2hlY2tfcGFja2V0KHMsIHBrdCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIXBrdCkgeworICAgICAgICBpZiAocy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9BTExPV19GTFVTSCkgeworICAgICAgICAgICAgcmV0ID0gcy0+b2Zvcm1hdC0+d3JpdGVfcGFja2V0KHMsIE5VTEwpOworICAgICAgICAgICAgaWYgKHMtPmZsdXNoX3BhY2tldHMgJiYgcy0+cGIgJiYgcy0+cGItPmVycm9yID49IDAgJiYgcy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0ZMVVNIX1BBQ0tFVFMpCisgICAgICAgICAgICAgICAgYXZpb19mbHVzaChzLT5wYik7CisgICAgICAgICAgICBpZiAocmV0ID49IDAgJiYgcy0+cGIgJiYgcy0+cGItPmVycm9yIDwgMCkKKyAgICAgICAgICAgICAgICByZXQgPSBzLT5wYi0+ZXJyb3I7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldCA9IGNvbXB1dGVfcGt0X2ZpZWxkczIocywgcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0sIHBrdCk7CisKKyAgICBpZiAocmV0IDwgMCAmJiAhKHMtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9USU1FU1RBTVBTKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IHdyaXRlX3BhY2tldChzLCBwa3QpOworICAgIGlmIChyZXQgPj0gMCAmJiBzLT5wYiAmJiBzLT5wYi0+ZXJyb3IgPCAwKQorICAgICAgICByZXQgPSBzLT5wYi0+ZXJyb3I7CisKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5uYl9mcmFtZXMrKzsKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIENIVU5LX1NUQVJUIDB4MTAwMAorCitpbnQgZmZfaW50ZXJsZWF2ZV9hZGRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY29tcGFyZSkoQVZGb3JtYXRDb250ZXh0ICosIEFWUGFja2V0ICosIEFWUGFja2V0ICopKQoreworICAgIGludCByZXQ7CisgICAgQVZQYWNrZXRMaXN0ICoqbmV4dF9wb2ludCwgKnRoaXNfcGt0bDsKKyAgICBBVlN0cmVhbSAqc3QgICA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworICAgIGludCBjaHVua2VkICAgID0gcy0+bWF4X2NodW5rX3NpemUgfHwgcy0+bWF4X2NodW5rX2R1cmF0aW9uOworCisgICAgdGhpc19wa3RsICAgICAgPSBhdl9tYWxsb2N6KHNpemVvZihBVlBhY2tldExpc3QpKTsKKyAgICBpZiAoIXRoaXNfcGt0bCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB0aGlzX3BrdGwtPnBrdCA9ICpwa3Q7CisjaWYgRkZfQVBJX0RFU1RSVUNUX1BBQ0tFVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIHBrdC0+ZGVzdHJ1Y3QgID0gTlVMTDsgICAgICAgICAgIC8vIGRvIG5vdCBmcmVlIG9yaWdpbmFsIGJ1dCBvbmx5IHRoZSBjb3B5CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorICAgIHBrdC0+YnVmICAgICAgID0gTlVMTDsKKyAgICBwa3QtPnNpZGVfZGF0YSA9IE5VTEw7CisgICAgcGt0LT5zaWRlX2RhdGFfZWxlbXMgPSAwOworICAgIGlmICgocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX1VOQ09ERURfRlJBTUUpKSB7CisgICAgICAgIGF2X2Fzc2VydDAocGt0LT5zaXplID09IFVOQ09ERURfRlJBTUVfUEFDS0VUX1NJWkUpOworICAgICAgICBhdl9hc3NlcnQwKCgoQVZGcmFtZSAqKXBrdC0+ZGF0YSktPmJ1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRHVwbGljYXRlIHRoZSBwYWNrZXQgaWYgaXQgdXNlcyBub24tYWxsb2NhdGVkIG1lbW9yeQorICAgICAgICBpZiAoKHJldCA9IGF2X2R1cF9wYWNrZXQoJnRoaXNfcGt0bC0+cGt0KSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlKHRoaXNfcGt0bCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5sYXN0X2luX3BhY2tldF9idWZmZXIpIHsKKyAgICAgICAgbmV4dF9wb2ludCA9ICYoc3QtPmxhc3RfaW5fcGFja2V0X2J1ZmZlci0+bmV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbmV4dF9wb2ludCA9ICZzLT5wYWNrZXRfYnVmZmVyOworICAgIH0KKworICAgIGlmIChjaHVua2VkKSB7CisgICAgICAgIHVpbnQ2NF90IG1heD0gYXZfcmVzY2FsZV9xX3JuZChzLT5tYXhfY2h1bmtfZHVyYXRpb24sIEFWX1RJTUVfQkFTRV9RLCBzdC0+dGltZV9iYXNlLCBBVl9ST1VORF9VUCk7CisgICAgICAgIHN0LT5pbnRlcmxlYXZlcl9jaHVua19zaXplICAgICArPSBwa3QtPnNpemU7CisgICAgICAgIHN0LT5pbnRlcmxlYXZlcl9jaHVua19kdXJhdGlvbiArPSBwa3QtPmR1cmF0aW9uOworICAgICAgICBpZiAoICAgKHMtPm1heF9jaHVua19zaXplICYmIHN0LT5pbnRlcmxlYXZlcl9jaHVua19zaXplID4gcy0+bWF4X2NodW5rX3NpemUpCisgICAgICAgICAgICB8fCAobWF4ICYmIHN0LT5pbnRlcmxlYXZlcl9jaHVua19kdXJhdGlvbiAgICAgICAgICAgPiBtYXgpKSB7CisgICAgICAgICAgICBzdC0+aW50ZXJsZWF2ZXJfY2h1bmtfc2l6ZSAgICAgID0gMDsKKyAgICAgICAgICAgIHRoaXNfcGt0bC0+cGt0LmZsYWdzIHw9IENIVU5LX1NUQVJUOworICAgICAgICAgICAgaWYgKG1heCAmJiBzdC0+aW50ZXJsZWF2ZXJfY2h1bmtfZHVyYXRpb24gPiBtYXgpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHN5bmNvZmZzZXQgPSAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykqbWF4LzI7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzeW5jdG8gPSBhdl9yZXNjYWxlKHBrdC0+ZHRzICsgc3luY29mZnNldCwgMSwgbWF4KSptYXggLSBzeW5jb2Zmc2V0OworCisgICAgICAgICAgICAgICAgc3QtPmludGVybGVhdmVyX2NodW5rX2R1cmF0aW9uICs9IChwa3QtPmR0cyAtIHN5bmN0bykvOCAtIG1heDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHN0LT5pbnRlcmxlYXZlcl9jaHVua19kdXJhdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCpuZXh0X3BvaW50KSB7CisgICAgICAgIGlmIChjaHVua2VkICYmICEodGhpc19wa3RsLT5wa3QuZmxhZ3MgJiBDSFVOS19TVEFSVCkpCisgICAgICAgICAgICBnb3RvIG5leHRfbm9uX251bGw7CisKKyAgICAgICAgaWYgKGNvbXBhcmUocywgJnMtPnBhY2tldF9idWZmZXJfZW5kLT5wa3QsIHBrdCkpIHsKKyAgICAgICAgICAgIHdoaWxlICggICAqbmV4dF9wb2ludAorICAgICAgICAgICAgICAgICAgICYmICgoY2h1bmtlZCAmJiAhKCgqbmV4dF9wb2ludCktPnBrdC5mbGFncyZDSFVOS19TVEFSVCkpCisgICAgICAgICAgICAgICAgICAgICAgIHx8ICFjb21wYXJlKHMsICYoKm5leHRfcG9pbnQpLT5wa3QsIHBrdCkpKQorICAgICAgICAgICAgICAgIG5leHRfcG9pbnQgPSAmKCpuZXh0X3BvaW50KS0+bmV4dDsKKyAgICAgICAgICAgIGlmICgqbmV4dF9wb2ludCkKKyAgICAgICAgICAgICAgICBnb3RvIG5leHRfbm9uX251bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXh0X3BvaW50ID0gJihzLT5wYWNrZXRfYnVmZmVyX2VuZC0+bmV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfYXNzZXJ0MSghKm5leHRfcG9pbnQpOworCisgICAgcy0+cGFja2V0X2J1ZmZlcl9lbmQgPSB0aGlzX3BrdGw7CituZXh0X25vbl9udWxsOgorCisgICAgdGhpc19wa3RsLT5uZXh0ID0gKm5leHRfcG9pbnQ7CisKKyAgICBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+bGFzdF9pbl9wYWNrZXRfYnVmZmVyID0KKyAgICAgICAgKm5leHRfcG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdGhpc19wa3RsOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZXJsZWF2ZV9jb21wYXJlX2R0cyhBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZTdHJlYW0gKnN0ICA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworICAgIEFWU3RyZWFtICpzdDIgPSBzLT5zdHJlYW1zW25leHQtPnN0cmVhbV9pbmRleF07CisgICAgaW50IGNvbXAgICAgICA9IGF2X2NvbXBhcmVfdHMobmV4dC0+ZHRzLCBzdDItPnRpbWVfYmFzZSwgcGt0LT5kdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSk7CisgICAgaWYgKHMtPmF1ZGlvX3ByZWxvYWQgJiYgKChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSAhPSAoc3QyLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pKSkgeworICAgICAgICBpbnQ2NF90IHRzID0gYXZfcmVzY2FsZV9xKHBrdCAtPmR0cywgc3QgLT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKSAtIHMtPmF1ZGlvX3ByZWxvYWQqKHN0IC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKTsKKyAgICAgICAgaW50NjRfdCB0czI9IGF2X3Jlc2NhbGVfcShuZXh0LT5kdHMsIHN0Mi0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSkgLSBzLT5hdWRpb19wcmVsb2FkKihzdDItPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyk7CisgICAgICAgIGlmICh0cyA9PSB0czIpIHsKKyAgICAgICAgICAgIHRzPSAoIHBrdCAtPmR0cyogc3QtPnRpbWVfYmFzZS5udW0qQVZfVElNRV9CQVNFIC0gcy0+YXVkaW9fcHJlbG9hZCooaW50NjRfdCkoc3QgLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pKiBzdC0+dGltZV9iYXNlLmRlbikqc3QyLT50aW1lX2Jhc2UuZGVuCisgICAgICAgICAgICAgICAtKCBuZXh0LT5kdHMqc3QyLT50aW1lX2Jhc2UubnVtKkFWX1RJTUVfQkFTRSAtIHMtPmF1ZGlvX3ByZWxvYWQqKGludDY0X3QpKHN0Mi0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSpzdDItPnRpbWVfYmFzZS5kZW4pKiBzdC0+dGltZV9iYXNlLmRlbjsKKyAgICAgICAgICAgIHRzMj0wOworICAgICAgICB9CisgICAgICAgIGNvbXA9ICh0cz50czIpIC0gKHRzPHRzMik7CisgICAgfQorCisgICAgaWYgKGNvbXAgPT0gMCkKKyAgICAgICAgcmV0dXJuIHBrdC0+c3RyZWFtX2luZGV4IDwgbmV4dC0+c3RyZWFtX2luZGV4OworICAgIHJldHVybiBjb21wID4gMDsKK30KKworaW50IGZmX2ludGVybGVhdmVfcGFja2V0X3Blcl9kdHMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCwgaW50IGZsdXNoKQoreworICAgIEFWUGFja2V0TGlzdCAqcGt0bDsKKyAgICBpbnQgc3RyZWFtX2NvdW50ID0gMDsKKyAgICBpbnQgbm9uaW50ZXJsZWF2ZWRfY291bnQgPSAwOworICAgIGludCBpLCByZXQ7CisKKyAgICBpZiAocGt0KSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfaW50ZXJsZWF2ZV9hZGRfcGFja2V0KHMsIHBrdCwgaW50ZXJsZWF2ZV9jb21wYXJlX2R0cykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+bGFzdF9pbl9wYWNrZXRfYnVmZmVyKSB7CisgICAgICAgICAgICArK3N0cmVhbV9jb3VudDsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVCAmJgorICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WUDggJiYKKyAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVlA5KSB7CisgICAgICAgICAgICArK25vbmludGVybGVhdmVkX2NvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPmludGVybmFsLT5uYl9pbnRlcmxlYXZlZF9zdHJlYW1zID09IHN0cmVhbV9jb3VudCkKKyAgICAgICAgZmx1c2ggPSAxOworCisgICAgaWYgKHMtPm1heF9pbnRlcmxlYXZlX2RlbHRhID4gMCAmJgorICAgICAgICBzLT5wYWNrZXRfYnVmZmVyICYmCisgICAgICAgICFmbHVzaCAmJgorICAgICAgICBzLT5pbnRlcm5hbC0+bmJfaW50ZXJsZWF2ZWRfc3RyZWFtcyA9PSBzdHJlYW1fY291bnQrbm9uaW50ZXJsZWF2ZWRfY291bnQKKyAgICApIHsKKyAgICAgICAgQVZQYWNrZXQgKnRvcF9wa3QgPSAmcy0+cGFja2V0X2J1ZmZlci0+cGt0OworICAgICAgICBpbnQ2NF90IGRlbHRhX2R0cyA9IElOVDY0X01JTjsKKyAgICAgICAgaW50NjRfdCB0b3BfZHRzID0gYXZfcmVzY2FsZV9xKHRvcF9wa3QtPmR0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbdG9wX3BrdC0+c3RyZWFtX2luZGV4XS0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdF9kdHM7CisgICAgICAgICAgICBjb25zdCBBVlBhY2tldExpc3QgKmxhc3QgPSBzLT5zdHJlYW1zW2ldLT5sYXN0X2luX3BhY2tldF9idWZmZXI7CisKKyAgICAgICAgICAgIGlmICghbGFzdCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbGFzdF9kdHMgPSBhdl9yZXNjYWxlX3EobGFzdC0+cGt0LmR0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgICAgIGRlbHRhX2R0cyA9IEZGTUFYKGRlbHRhX2R0cywgbGFzdF9kdHMgLSB0b3BfZHRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWx0YV9kdHMgPiBzLT5tYXhfaW50ZXJsZWF2ZV9kZWx0YSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAiRGVsYXkgYmV0d2VlbiB0aGUgZmlyc3QgcGFja2V0IGFuZCBsYXN0IHBhY2tldCBpbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICJtdXhpbmcgcXVldWUgaXMgJSJQUklkNjQiID4gJSJQUklkNjQiOiBmb3JjaW5nIG91dHB1dFxuIiwKKyAgICAgICAgICAgICAgICAgICBkZWx0YV9kdHMsIHMtPm1heF9pbnRlcmxlYXZlX2RlbHRhKTsKKyAgICAgICAgICAgIGZsdXNoID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdHJlYW1fY291bnQgJiYgZmx1c2gpIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0OworICAgICAgICBwa3RsID0gcy0+cGFja2V0X2J1ZmZlcjsKKyAgICAgICAgKm91dCA9IHBrdGwtPnBrdDsKKyAgICAgICAgc3QgICA9IHMtPnN0cmVhbXNbb3V0LT5zdHJlYW1faW5kZXhdOworCisgICAgICAgIHMtPnBhY2tldF9idWZmZXIgPSBwa3RsLT5uZXh0OworICAgICAgICBpZiAoIXMtPnBhY2tldF9idWZmZXIpCisgICAgICAgICAgICBzLT5wYWNrZXRfYnVmZmVyX2VuZCA9IE5VTEw7CisKKyAgICAgICAgaWYgKHN0LT5sYXN0X2luX3BhY2tldF9idWZmZXIgPT0gcGt0bCkKKyAgICAgICAgICAgIHN0LT5sYXN0X2luX3BhY2tldF9idWZmZXIgPSBOVUxMOworICAgICAgICBhdl9mcmVlcCgmcGt0bCk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfaW5pdF9wYWNrZXQob3V0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKioKKyAqIEludGVybGVhdmUgYW4gQVZQYWNrZXQgY29ycmVjdGx5IHNvIGl0IGNhbiBiZSBtdXhlZC4KKyAqIEBwYXJhbSBvdXQgdGhlIGludGVybGVhdmVkIHBhY2tldCB3aWxsIGJlIG91dHB1dCBoZXJlCisgKiBAcGFyYW0gaW4gdGhlIGlucHV0IHBhY2tldAorICogQHBhcmFtIGZsdXNoIDEgaWYgbm8gZnVydGhlciBwYWNrZXRzIGFyZSBhdmFpbGFibGUgYXMgaW5wdXQgYW5kIGFsbAorICogICAgICAgICAgICAgIHJlbWFpbmluZyBwYWNrZXRzIHNob3VsZCBiZSBvdXRwdXQKKyAqIEByZXR1cm4gMSBpZiBhIHBhY2tldCB3YXMgb3V0cHV0LCAwIGlmIG5vIHBhY2tldCBjb3VsZCBiZSBvdXRwdXQsCisgKiAgICAgICAgIDwgMCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitzdGF0aWMgaW50IGludGVybGVhdmVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKm91dCwgQVZQYWNrZXQgKmluLCBpbnQgZmx1c2gpCit7CisgICAgaWYgKHMtPm9mb3JtYXQtPmludGVybGVhdmVfcGFja2V0KSB7CisgICAgICAgIGludCByZXQgPSBzLT5vZm9ybWF0LT5pbnRlcmxlYXZlX3BhY2tldChzLCBvdXQsIGluLCBmbHVzaCk7CisgICAgICAgIGlmIChpbikKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KGluKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIGZmX2ludGVybGVhdmVfcGFja2V0X3Blcl9kdHMocywgb3V0LCBpbiwgZmx1c2gpOworfQorCitpbnQgYXZfaW50ZXJsZWF2ZWRfd3JpdGVfZnJhbWUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGludCByZXQsIGZsdXNoID0gMDsKKworICAgIHJldCA9IGNoZWNrX3BhY2tldChzLCBwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAocGt0KSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworCisgICAgICAgIGF2X2Rsb2cocywgImF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lIHNpemU6JWQgZHRzOiVzIHB0czolc1xuIiwKKyAgICAgICAgICAgICAgICBwa3QtPnNpemUsIGF2X3RzMnN0cihwa3QtPmR0cyksIGF2X3RzMnN0cihwa3QtPnB0cykpOworICAgICAgICBpZiAoKHJldCA9IGNvbXB1dGVfcGt0X2ZpZWxkczIocywgc3QsIHBrdCkpIDwgMCAmJiAhKHMtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9USU1FU1RBTVBTKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBpZiAocGt0LT5kdHMgPT0gQVZfTk9QVFNfVkFMVUUgJiYgIShzLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX05PVElNRVNUQU1QUykpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2Rsb2cocywgImF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lIEZMVVNIXG4iKTsKKyAgICAgICAgZmx1c2ggPSAxOworICAgIH0KKworICAgIGZvciAoOzsgKSB7CisgICAgICAgIEFWUGFja2V0IG9wa3Q7CisgICAgICAgIGludCByZXQgPSBpbnRlcmxlYXZlX3BhY2tldChzLCAmb3BrdCwgcGt0LCBmbHVzaCk7CisgICAgICAgIGlmIChwa3QpIHsKKyAgICAgICAgICAgIG1lbXNldChwa3QsIDAsIHNpemVvZigqcGt0KSk7CisgICAgICAgICAgICBhdl9pbml0X3BhY2tldChwa3QpOworICAgICAgICAgICAgcGt0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0IDw9IDApIC8vRklYTUUgY2xlYW51cCBuZWVkZWQgZm9yIHJldDwwID8KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0ID0gd3JpdGVfcGFja2V0KHMsICZvcGt0KTsKKyAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgcy0+c3RyZWFtc1tvcGt0LnN0cmVhbV9pbmRleF0tPm5iX2ZyYW1lcysrOworCisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZvcGt0KTsKKworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmKHMtPnBiICYmIHMtPnBiLT5lcnJvcikKKyAgICAgICAgICAgIHJldHVybiBzLT5wYi0+ZXJyb3I7CisgICAgfQorZmFpbDoKKyAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IHJldCwgaTsKKworICAgIGZvciAoOzsgKSB7CisgICAgICAgIEFWUGFja2V0IHBrdDsKKyAgICAgICAgcmV0ID0gaW50ZXJsZWF2ZV9wYWNrZXQocywgJnBrdCwgTlVMTCwgMSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHJldCA9IHdyaXRlX3BhY2tldChzLCAmcGt0KTsKKyAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgcy0+c3RyZWFtc1twa3Quc3RyZWFtX2luZGV4XS0+bmJfZnJhbWVzKys7CisKKyAgICAgICAgYXZfZnJlZV9wYWNrZXQoJnBrdCk7CisKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGlmKHMtPnBiICYmIHMtPnBiLT5lcnJvcikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKK2ZhaWw6CisgICAgaWYgKHMtPm9mb3JtYXQtPndyaXRlX3RyYWlsZXIpCisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICByZXQgPSBzLT5vZm9ybWF0LT53cml0ZV90cmFpbGVyKHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+b2Zvcm1hdC0+d3JpdGVfdHJhaWxlcihzKTsKKyAgICAgICAgfQorCisgICAgaWYgKHMtPnBiKQorICAgICAgIGF2aW9fZmx1c2gocy0+cGIpOworICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICByZXQgPSBzLT5wYiA/IHMtPnBiLT5lcnJvciA6IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmcy0+c3RyZWFtc1tpXS0+cHJpdl9kYXRhKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnN0cmVhbXNbaV0tPmluZGV4X2VudHJpZXMpOworICAgIH0KKyAgICBpZiAocy0+b2Zvcm1hdC0+cHJpdl9jbGFzcykKKyAgICAgICAgYXZfb3B0X2ZyZWUocy0+cHJpdl9kYXRhKTsKKyAgICBhdl9mcmVlcCgmcy0+cHJpdl9kYXRhKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZfZ2V0X291dHB1dF90aW1lc3RhbXAoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpkdHMsIGludDY0X3QgKndhbGwpCit7CisgICAgaWYgKCFzLT5vZm9ybWF0IHx8ICFzLT5vZm9ybWF0LT5nZXRfb3V0cHV0X3RpbWVzdGFtcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICBzLT5vZm9ybWF0LT5nZXRfb3V0cHV0X3RpbWVzdGFtcChzLCBzdHJlYW0sIGR0cywgd2FsbCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl93cml0ZV9jaGFpbmVkKEFWRm9ybWF0Q29udGV4dCAqZHN0LCBpbnQgZHN0X3N0cmVhbSwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqc3JjLCBpbnQgaW50ZXJsZWF2ZSkKK3sKKyAgICBBVlBhY2tldCBsb2NhbF9wa3Q7CisgICAgaW50IHJldDsKKworICAgIGxvY2FsX3BrdCA9ICpwa3Q7CisgICAgbG9jYWxfcGt0LnN0cmVhbV9pbmRleCA9IGRzdF9zdHJlYW07CisgICAgaWYgKHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBsb2NhbF9wa3QucHRzID0gYXZfcmVzY2FsZV9xKHBrdC0+cHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnN0cmVhbXNbZHN0X3N0cmVhbV0tPnRpbWVfYmFzZSk7CisgICAgaWYgKHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBsb2NhbF9wa3QuZHRzID0gYXZfcmVzY2FsZV9xKHBrdC0+ZHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnN0cmVhbXNbZHN0X3N0cmVhbV0tPnRpbWVfYmFzZSk7CisgICAgaWYgKHBrdC0+ZHVyYXRpb24pCisgICAgICAgIGxvY2FsX3BrdC5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShwa3QtPmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5zdHJlYW1zW2RzdF9zdHJlYW1dLT50aW1lX2Jhc2UpOworCisgICAgaWYgKGludGVybGVhdmUpIHJldCA9IGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKGRzdCwgJmxvY2FsX3BrdCk7CisgICAgZWxzZSAgICAgICAgICAgIHJldCA9IGF2X3dyaXRlX2ZyYW1lKGRzdCwgJmxvY2FsX3BrdCk7CisgICAgcGt0LT5idWYgPSBsb2NhbF9wa3QuYnVmOworICAgIHBrdC0+ZGVzdHJ1Y3QgPSBsb2NhbF9wa3QuZGVzdHJ1Y3Q7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdl93cml0ZV91bmNvZGVkX2ZyYW1lX2ludGVybmFsKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSwgaW50IGludGVybGVhdmVkKQoreworICAgIEFWUGFja2V0IHBrdCwgKnBrdHA7CisKKyAgICBhdl9hc3NlcnQwKHMtPm9mb3JtYXQpOworICAgIGlmICghcy0+b2Zvcm1hdC0+d3JpdGVfdW5jb2RlZF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKworICAgIGlmICghZnJhbWUpIHsKKyAgICAgICAgcGt0cCA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGt0cCA9ICZwa3Q7CisgICAgICAgIGF2X2luaXRfcGFja2V0KCZwa3QpOworICAgICAgICBwa3QuZGF0YSA9ICh2b2lkICopZnJhbWU7CisgICAgICAgIHBrdC5zaXplICAgICAgICAgPSBVTkNPREVEX0ZSQU1FX1BBQ0tFVF9TSVpFOworICAgICAgICBwa3QucHRzICAgICAgICAgID0KKyAgICAgICAgcGt0LmR0cyAgICAgICAgICA9IGZyYW1lLT5wdHM7CisgICAgICAgIHBrdC5kdXJhdGlvbiAgICAgPSBhdl9mcmFtZV9nZXRfcGt0X2R1cmF0aW9uKGZyYW1lKTsKKyAgICAgICAgcGt0LnN0cmVhbV9pbmRleCA9IHN0cmVhbV9pbmRleDsKKyAgICAgICAgcGt0LmZsYWdzIHw9IEFWX1BLVF9GTEFHX1VOQ09ERURfRlJBTUU7CisgICAgfQorCisgICAgcmV0dXJuIGludGVybGVhdmVkID8gYXZfaW50ZXJsZWF2ZWRfd3JpdGVfZnJhbWUocywgcGt0cCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3dyaXRlX2ZyYW1lKHMsIHBrdHApOworfQorCitpbnQgYXZfd3JpdGVfdW5jb2RlZF9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICByZXR1cm4gYXZfd3JpdGVfdW5jb2RlZF9mcmFtZV9pbnRlcm5hbChzLCBzdHJlYW1faW5kZXgsIGZyYW1lLCAwKTsKK30KKworaW50IGF2X2ludGVybGVhdmVkX3dyaXRlX3VuY29kZWRfZnJhbWUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgcmV0dXJuIGF2X3dyaXRlX3VuY29kZWRfZnJhbWVfaW50ZXJuYWwocywgc3RyZWFtX2luZGV4LCBmcmFtZSwgMSk7Cit9CisKK2ludCBhdl93cml0ZV91bmNvZGVkX2ZyYW1lX3F1ZXJ5KEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCkKK3sKKyAgICBhdl9hc3NlcnQwKHMtPm9mb3JtYXQpOworICAgIGlmICghcy0+b2Zvcm1hdC0+d3JpdGVfdW5jb2RlZF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICByZXR1cm4gcy0+b2Zvcm1hdC0+d3JpdGVfdW5jb2RlZF9mcmFtZShzLCBzdHJlYW1faW5kZXgsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfV1JJVEVfVU5DT0RFRF9GUkFNRV9RVUVSWSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbXZkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tdmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTVlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbXZkZWMuYwpAQCAtMCwwICsxLDQ4MiBAQAorLyoKKyAqIFNpbGljb24gR3JhcGhpY3MgTW92aWUgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU2lsaWNvbiBHcmFwaGljcyBNb3ZpZSBkZW11eGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYXRpb25hbC5oIgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBNdkNvbnRleHQgeworICAgIGludCBuYl92aWRlb190cmFja3M7CisgICAgaW50IG5iX2F1ZGlvX3RyYWNrczsKKworICAgIGludCBlb2ZfY291bnQ7ICAgICAgICAvLy88IG51bWJlciBvZiBzdHJlYW1zIHRoYXQgaGF2ZSBmaW5pc2hlZAorICAgIGludCBzdHJlYW1faW5kZXg7ICAgICAvLy88IGN1cnJlbnQgc3RyZWFtIGluZGV4CisgICAgaW50IGZyYW1lWzJdOyAgICAgICAgIC8vLzwgZnJhbWUgbmIgZm9yIGN1cnJlbnQgc3RyZWFtCisKKyAgICBpbnQgYWNvbXByZXNzaW9uOyAgICAgLy8vPCBjb21wcmVzc2lvbiBsZXZlbCBmb3IgYXVkaW8gc3RyZWFtCisgICAgaW50IGFmb3JtYXQ7ICAgICAgICAgIC8vLzwgYXVkaW8gZm9ybWF0Cit9IE12Q29udGV4dDsKKworI2RlZmluZSBBVURJT19GT1JNQVRfU0lHTkVEIDQwMQorCitzdGF0aWMgaW50IG12X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChBVl9SQjMyKHAtPmJ1ZikgPT0gTUtCRVRBRygnTScsICdPJywgJ1YnLCAnSScpICYmCisgICAgICAgIEFWX1JCMTYocC0+YnVmICsgNCkgPCAzKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICp2YXJfcmVhZF9zdHJpbmcoQVZJT0NvbnRleHQgKnBiLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgbjsKKyAgICBjaGFyICpzdHI7CisKKyAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA9PSBJTlRfTUFYKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHN0ciA9IGF2X21hbGxvYyhzaXplICsgMSk7CisgICAgaWYgKCFzdHIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG4gPSBhdmlvX2dldF9zdHIocGIsIHNpemUsIHN0ciwgc2l6ZSArIDEpOworICAgIGlmIChuIDwgc2l6ZSkKKyAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gbik7CisgICAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGludCB2YXJfcmVhZF9pbnQoQVZJT0NvbnRleHQgKnBiLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgdjsKKyAgICBjaGFyICpzID0gdmFyX3JlYWRfc3RyaW5nKHBiLCBzaXplKTsKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybiAwOworICAgIHYgPSBzdHJ0b2wocywgTlVMTCwgMTApOworICAgIGF2X2ZyZWUocyk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBBVlJhdGlvbmFsIHZhcl9yZWFkX2Zsb2F0KEFWSU9Db250ZXh0ICpwYiwgaW50IHNpemUpCit7CisgICAgQVZSYXRpb25hbCB2OworICAgIGNoYXIgKnMgPSB2YXJfcmVhZF9zdHJpbmcocGIsIHNpemUpOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIChBVlJhdGlvbmFsKSB7IDAsIDAgfTsKKyAgICB2ID0gYXZfZDJxKGF2X3N0cnRvZChzLCBOVUxMKSwgSU5UX01BWCk7CisgICAgYXZfZnJlZShzKTsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIHZvaWQgdmFyX3JlYWRfbWV0YWRhdGEoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgY29uc3QgY2hhciAqdGFnLCBpbnQgc2l6ZSkKK3sKKyAgICBjaGFyICp2YWx1ZSA9IHZhcl9yZWFkX3N0cmluZyhhdmN0eC0+cGIsIHNpemUpOworICAgIGlmICh2YWx1ZSkKKyAgICAgICAgYXZfZGljdF9zZXQoJmF2Y3R4LT5tZXRhZGF0YSwgdGFnLCB2YWx1ZSwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworfQorCitzdGF0aWMgaW50IHNldF9jaGFubmVscyhBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlN0cmVhbSAqc3QsIGludCBjaGFubmVscykKK3sKKyAgICBpZiAoY2hhbm5lbHMgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNoYW5uZWwgY291bnQgJWQgaW52YWxpZC5cbiIsIGNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSBjaGFubmVsczsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPT0gMSkgPyBBVl9DSF9MQVlPVVRfTU9OTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGFyc2UgZ2xvYmFsIHZhcmlhYmxlCisgKiBAcmV0dXJuIDwgMCBpZiB1bmtub3duCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfZ2xvYmFsX3ZhcihBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IHNpemUpCit7CisgICAgTXZDb250ZXh0ICptdiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gYXZjdHgtPnBiOworICAgIGlmICghc3RyY21wKG5hbWUsICJfX05VTV9JX1RSQUNLUyIpKSB7CisgICAgICAgIG12LT5uYl92aWRlb190cmFja3MgPSB2YXJfcmVhZF9pbnQocGIsIHNpemUpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiX19OVU1fQV9UUkFDS1MiKSkgeworICAgICAgICBtdi0+bmJfYXVkaW9fdHJhY2tzID0gdmFyX3JlYWRfaW50KHBiLCBzaXplKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkNPTU1FTlQiKSB8fCAhc3RyY21wKG5hbWUsICJUSVRMRSIpKSB7CisgICAgICAgIHZhcl9yZWFkX21ldGFkYXRhKGF2Y3R4LCBuYW1lLCBzaXplKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkxPT1BfTU9ERSIpIHx8ICFzdHJjbXAobmFtZSwgIk5VTV9MT09QUyIpIHx8CisgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJPUFRJTUlaRUQiKSkgeworICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOyAvLyBpZ25vcmUKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBQYXJzZSBhdWRpbyB2YXJpYWJsZQorICogQHJldHVybiA8IDAgaWYgdW5rbm93bgorICovCitzdGF0aWMgaW50IHBhcnNlX2F1ZGlvX3ZhcihBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgc2l6ZSkKK3sKKyAgICBNdkNvbnRleHQgKm12ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBhdmN0eC0+cGI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIl9fRElSX0NPVU5UIikpIHsKKyAgICAgICAgc3QtPm5iX2ZyYW1lcyA9IHZhcl9yZWFkX2ludChwYiwgc2l6ZSk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJBVURJT19GT1JNQVQiKSkgeworICAgICAgICBtdi0+YWZvcm1hdCA9IHZhcl9yZWFkX2ludChwYiwgc2l6ZSk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJDT01QUkVTU0lPTiIpKSB7CisgICAgICAgIG12LT5hY29tcHJlc3Npb24gPSB2YXJfcmVhZF9pbnQocGIsIHNpemUpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiREVGQVVMVF9WT0wiKSkgeworICAgICAgICB2YXJfcmVhZF9tZXRhZGF0YShhdmN0eCwgbmFtZSwgc2l6ZSk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJOVU1fQ0hBTk5FTFMiKSkgeworICAgICAgICByZXR1cm4gc2V0X2NoYW5uZWxzKGF2Y3R4LCBzdCwgdmFyX3JlYWRfaW50KHBiLCBzaXplKSk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJTQU1QTEVfUkFURSIpKSB7CisgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSB2YXJfcmVhZF9pbnQocGIsIHNpemUpOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMywgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJTQU1QTEVfV0lEVEgiKSkgeworICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IHZhcl9yZWFkX2ludChwYiwgc2l6ZSkgKiA4OworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFBhcnNlIHZpZGVvIHZhcmlhYmxlCisgKiBAcmV0dXJuIDwgMCBpZiB1bmtub3duCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfdmlkZW9fdmFyKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWU3RyZWFtICpzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzaXplKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IGF2Y3R4LT5wYjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiX19ESVJfQ09VTlQiKSkgeworICAgICAgICBzdC0+bmJfZnJhbWVzID0gc3QtPmR1cmF0aW9uID0gdmFyX3JlYWRfaW50KHBiLCBzaXplKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkNPTVBSRVNTSU9OIikpIHsKKyAgICAgICAgY2hhciAqc3RyID0gdmFyX3JlYWRfc3RyaW5nKHBiLCBzaXplKTsKKyAgICAgICAgaWYgKCFzdHIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKCFzdHJjbXAoc3RyLCAiMSIpKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVZDMTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIjIiKSkgeworICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ICA9IEFWX1BJWF9GTVRfQUJHUjsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIjMiKSkgeworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1NHSVJMRTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIjEwIikpIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NSlBFRzsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIk1WQzIiKSkgeworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01WQzI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJWaWRlbyBjb21wcmVzc2lvbiAlcyIsIHN0cik7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZShzdHIpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiRlBTIikpIHsKKyAgICAgICAgQVZSYXRpb25hbCBmcHMgPSB2YXJfcmVhZF9mbG9hdChwYiwgc2l6ZSk7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBmcHMuZGVuLCBmcHMubnVtKTsKKyAgICAgICAgc3QtPmF2Z19mcmFtZV9yYXRlID0gZnBzOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiSEVJR0hUIikpIHsKKyAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSB2YXJfcmVhZF9pbnQocGIsIHNpemUpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiUElYRUxfQVNQRUNUIikpIHsKKyAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSB2YXJfcmVhZF9mbG9hdChwYiwgc2l6ZSk7CisgICAgICAgIGF2X3JlZHVjZSgmc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCAmc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAorICAgICAgICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgICBJTlRfTUFYKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIldJRFRIIikpIHsKKyAgICAgICAgc3QtPmNvZGVjLT53aWR0aCA9IHZhcl9yZWFkX2ludChwYiwgc2l6ZSk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJPUklFTlRBVElPTiIpKSB7CisgICAgICAgIGlmICh2YXJfcmVhZF9pbnQocGIsIHNpemUpID09IDExMDEpIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICAgICAgPSBhdl9zdHJkdXAoIkJvdHRvbVVwIik7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gOTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiUV9TUEFUSUFMIikgfHwgIXN0cmNtcChuYW1lLCAiUV9URU1QT1JBTCIpKSB7CisgICAgICAgIHZhcl9yZWFkX21ldGFkYXRhKGF2Y3R4LCBuYW1lLCBzaXplKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIklOVEVSTEFDSU5HIikgfHwgIXN0cmNtcChuYW1lLCAiUEFDS0lORyIpKSB7CisgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7IC8vIGlnbm9yZQorICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfdGFibGUoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpwYXJzZSkoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IHNpemUpKQoreworICAgIGludCBjb3VudCwgaTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBhdmN0eC0+cGI7CisgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICBjb3VudCA9IGF2aW9fcmIzMihwYik7CisgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBjaGFyIG5hbWVbMTddOworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgYXZpb19yZWFkKHBiLCBuYW1lLCAxNik7CisgICAgICAgIG5hbWVbc2l6ZW9mKG5hbWUpIC0gMV0gPSAwOworICAgICAgICBzaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVudHJ5IHNpemUgJWQgaXMgaW52YWxpZFxuIiwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyc2UoYXZjdHgsIHN0LCBuYW1lLCBzaXplKSA8IDApIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIlZhcmlhYmxlICVzIiwgbmFtZSk7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZWFkX2luZGV4KEFWSU9Db250ZXh0ICpwYiwgQVZTdHJlYW0gKnN0KQoreworICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IDA7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHN0LT5uYl9mcmFtZXM7IGkrKykgeworICAgICAgICB1aW50MzJfdCBwb3MgID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeShzdCwgcG9zLCB0aW1lc3RhbXAsIHNpemUsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgdGltZXN0YW1wICs9IHNpemUgLyAoc3QtPmNvZGVjLT5jaGFubmVscyAqIDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGltZXN0YW1wKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbXZfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNdkNvbnRleHQgKm12ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBhdmN0eC0+cGI7CisgICAgQVZTdHJlYW0gKmFzdCA9IE5VTEwsICp2c3QgPSBOVUxMOyAvL2luaXRpYWxpemF0aW9uIHRvIHN1cHByZXNzIHdhcm5pbmcKKyAgICBpbnQgdmVyc2lvbiwgaTsKKyAgICBpbnQgcmV0OworCisgICAgYXZpb19za2lwKHBiLCA0KTsKKworICAgIHZlcnNpb24gPSBhdmlvX3JiMTYocGIpOworICAgIGlmICh2ZXJzaW9uID09IDIpIHsKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wOworICAgICAgICBpbnQgdjsKKyAgICAgICAgYXZpb19za2lwKHBiLCAyMik7CisKKyAgICAgICAgLyogYWxsb2NhdGUgYXVkaW8gdHJhY2sgZmlyc3QgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBzZWVraW5nCisgICAgICAgICAqIChhdWRpbyBwYWNrZXQgYWx3YXlzIHByZWNlZGUgdmlkZW8gcGFja2V0IGZvciBhIGdpdmVuIGZyYW1lKSAqLworICAgICAgICBhc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2Y3R4LCBOVUxMKTsKKyAgICAgICAgaWYgKCFhc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHZzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYXZjdHgsIE5VTEwpOworICAgICAgICBpZiAoIXZzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgMSwgMTUpOworICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICB2c3QtPmF2Z19mcmFtZV9yYXRlICAgID0gYXZfaW52X3EodnN0LT50aW1lX2Jhc2UpOworICAgICAgICB2c3QtPm5iX2ZyYW1lcyAgICAgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgdiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIHN3aXRjaCAodikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01WQzE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdnN0LT5jb2RlYy0+cGl4X2ZtdCAgPSBBVl9QSVhfRk1UX0FSR0I7CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJWaWRlbyBjb21wcmVzc2lvbiAlaSIsIHYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsKKyAgICAgICAgdnN0LT5jb2RlYy0+d2lkdGggICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgdnN0LT5jb2RlYy0+aGVpZ2h0ICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYXZpb19za2lwKHBiLCAxMik7CisKKyAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIGFzdC0+bmJfZnJhbWVzICAgICAgICAgID0gdnN0LT5uYl9mcmFtZXM7CisgICAgICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDMzLCAxLCBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGlmIChzZXRfY2hhbm5lbHMoYXZjdHgsIGFzdCwgYXZpb19yYjMyKHBiKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgdiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGlmICh2ID09IEFVRElPX0ZPUk1BVF9TSUdORUQpIHsKKyAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkJFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiQXVkaW8gY29tcHJlc3Npb24gKGZvcm1hdCAlaSkiLCB2KTsKKyAgICAgICAgfQorCisgICAgICAgIGF2aW9fc2tpcChwYiwgMTIpOworICAgICAgICB2YXJfcmVhZF9tZXRhZGF0YShhdmN0eCwgInRpdGxlIiwgMHg4MCk7CisgICAgICAgIHZhcl9yZWFkX21ldGFkYXRhKGF2Y3R4LCAiY29tbWVudCIsIDB4MTAwKTsKKyAgICAgICAgYXZpb19za2lwKHBiLCAweDgwKTsKKworICAgICAgICB0aW1lc3RhbXAgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdnN0LT5uYl9mcmFtZXM7IGkrKykgeworICAgICAgICAgICAgdWludDMyX3QgcG9zICAgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgdWludDMyX3QgYXNpemUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgdWludDMyX3QgdnNpemUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCA4KTsKKyAgICAgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeShhc3QsIHBvcywgdGltZXN0YW1wLCBhc2l6ZSwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkodnN0LCBwb3MgKyBhc2l6ZSwgaSwgdnNpemUsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOworICAgICAgICAgICAgdGltZXN0YW1wICs9IGFzaXplIC8gKGFzdC0+Y29kZWMtPmNoYW5uZWxzICogMik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCF2ZXJzaW9uICYmIGF2aW9fcmIxNihwYikgPT0gMykgeworICAgICAgICBhdmlvX3NraXAocGIsIDQpOworCisgICAgICAgIGlmICgocmV0ID0gcmVhZF90YWJsZShhdmN0eCwgTlVMTCwgcGFyc2VfZ2xvYmFsX3ZhcikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKG12LT5uYl9hdWRpb190cmFja3MgPiAxKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJNdWx0aXBsZSBhdWRpbyBzdHJlYW1zIHN1cHBvcnQiKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfSBlbHNlIGlmIChtdi0+bmJfYXVkaW9fdHJhY2tzKSB7CisgICAgICAgICAgICBhc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2Y3R4LCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghYXN0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgaWYgKChyZWFkX3RhYmxlKGF2Y3R4LCBhc3QsIHBhcnNlX2F1ZGlvX3ZhcikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKG12LT5hY29tcHJlc3Npb24gPT0gMTAwICYmCisgICAgICAgICAgICAgICAgbXYtPmFmb3JtYXQgPT0gQVVESU9fRk9STUFUX1NJR05FRCAmJgorICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNikgeworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkJFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdWRpbyBjb21wcmVzc2lvbiAlaSAoZm9ybWF0ICVpLCBzciAlaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi0+YWNvbXByZXNzaW9uLCBtdi0+YWZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICAgICAgICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXN0LT5jb2RlYy0+Y2hhbm5lbHMgPD0gMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gdmFsaWQgY2hhbm5lbCBjb3VudCBmb3VuZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG12LT5uYl92aWRlb190cmFja3MgPiAxKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJNdWx0aXBsZSB2aWRlbyBzdHJlYW1zIHN1cHBvcnQiKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfSBlbHNlIGlmIChtdi0+bmJfdmlkZW9fdHJhY2tzKSB7CisgICAgICAgICAgICB2c3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2Y3R4LCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghdnN0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgaWYgKChyZXQgPSByZWFkX3RhYmxlKGF2Y3R4LCB2c3QsIHBhcnNlX3ZpZGVvX3ZhcikpPDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtdi0+bmJfYXVkaW9fdHJhY2tzKQorICAgICAgICAgICAgcmVhZF9pbmRleChwYiwgYXN0KTsKKworICAgICAgICBpZiAobXYtPm5iX3ZpZGVvX3RyYWNrcykKKyAgICAgICAgICAgIHJlYWRfaW5kZXgocGIsIHZzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiVmVyc2lvbiAlaSIsIHZlcnNpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNdkNvbnRleHQgKm12ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBhdmN0eC0+cGI7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZjdHgtPnN0cmVhbXNbbXYtPnN0cmVhbV9pbmRleF07CisgICAgY29uc3QgQVZJbmRleEVudHJ5ICppbmRleDsKKyAgICBpbnQgZnJhbWUgPSBtdi0+ZnJhbWVbbXYtPnN0cmVhbV9pbmRleF07CisgICAgaW50IHJldDsKKyAgICB1aW50NjRfdCBwb3M7CisKKyAgICBpZiAoZnJhbWUgPCBzdC0+bmJfaW5kZXhfZW50cmllcykgeworICAgICAgICBpbmRleCA9ICZzdC0+aW5kZXhfZW50cmllc1tmcmFtZV07CisgICAgICAgIHBvcyAgID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgaWYgKGluZGV4LT5wb3MgPiBwb3MpCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIGluZGV4LT5wb3MgLSBwb3MpOworICAgICAgICBlbHNlIGlmIChpbmRleC0+cG9zIDwgcG9zKSB7CisgICAgICAgICAgICBpZiAoIXBiLT5zZWVrYWJsZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgcmV0ID0gYXZpb19zZWVrKHBiLCBpbmRleC0+cG9zLCBTRUVLX1NFVCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgaW5kZXgtPnNpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBtdi0+c3RyZWFtX2luZGV4OworICAgICAgICBwa3QtPnB0cyAgICAgICAgICA9IGluZGV4LT50aW1lc3RhbXA7CisgICAgICAgIHBrdC0+ZmxhZ3MgICAgICAgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgICAgIG12LT5mcmFtZVttdi0+c3RyZWFtX2luZGV4XSsrOworICAgICAgICBtdi0+ZW9mX2NvdW50ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBtdi0+ZW9mX2NvdW50Kys7CisgICAgICAgIGlmIChtdi0+ZW9mX2NvdW50ID49IGF2Y3R4LT5uYl9zdHJlYW1zKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgICAgIC8vIGF2b2lkIHJldHVybmluZyAwIHdpdGhvdXQgYSBwYWNrZXQKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKKyAgICBtdi0+c3RyZWFtX2luZGV4Kys7CisgICAgaWYgKG12LT5zdHJlYW1faW5kZXggPj0gYXZjdHgtPm5iX3N0cmVhbXMpCisgICAgICAgIG12LT5zdHJlYW1faW5kZXggPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQoreworICAgIE12Q29udGV4dCAqbXYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IGF2Y3R4LT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgaW50IGZyYW1lLCBpOworCisgICAgaWYgKChmbGFncyAmIEFWU0VFS19GTEFHX0ZSQU1FKSB8fCAoZmxhZ3MgJiBBVlNFRUtfRkxBR19CWVRFKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKworICAgIGlmICghYXZjdHgtPnBiLT5zZWVrYWJsZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIGZyYW1lID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdCwgdGltZXN0YW1wLCBmbGFncyk7CisgICAgaWYgKGZyYW1lIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgbXYtPmZyYW1lW2ldID0gZnJhbWU7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbXZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibXYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTaWxpY29uIEdyYXBoaWNzIE1vdmllIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE12Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gbXZfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gbXZfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gbXZfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlayAgICAgID0gbXZfcmVhZF9zZWVrLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9tdmkuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9tdmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NmY2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L212aS5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogTW90aW9uIFBpeGVscyBNVkkgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA4IEdyZWdvcnkgTW9udG9pciAoY3l4QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTVZJX0ZSQUNfQklUUyAxMAorCisjZGVmaW5lIE1WSV9BVURJT19TVFJFQU1fSU5ERVggMAorI2RlZmluZSBNVklfVklERU9fU1RSRUFNX0lOREVYIDEKKwordHlwZWRlZiBzdHJ1Y3QgTXZpRGVtdXhDb250ZXh0IHsKKyAgICB1bnNpZ25lZCBpbnQgKCpnZXRfaW50KShBVklPQ29udGV4dCAqKTsKKyAgICB1aW50MzJfdCBhdWRpb19kYXRhX3NpemU7CisgICAgdWludDY0X3QgYXVkaW9fc2l6ZV9jb3VudGVyOworICAgIHVpbnQ2NF90IGF1ZGlvX2ZyYW1lX3NpemU7CisgICAgaW50IGF1ZGlvX3NpemVfbGVmdDsKKyAgICBpbnQgdmlkZW9fZnJhbWVfc2l6ZTsKK30gTXZpRGVtdXhDb250ZXh0OworCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNdmlEZW11eENvbnRleHQgKm12aSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqYXN0LCAqdnN0OworICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uLCBmcmFtZXNfY291bnQsIG1zZWNzX3Blcl9mcmFtZSwgcGxheWVyX3ZlcnNpb247CisKKyAgICBhc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghYXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXZzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEodnN0LT5jb2RlYywgMikpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgPSBhdmlvX3I4KHBiKTsKKyAgICB2c3QtPmNvZGVjLT5leHRyYWRhdGFbMF0gPSBhdmlvX3I4KHBiKTsKKyAgICB2c3QtPmNvZGVjLT5leHRyYWRhdGFbMV0gPSBhdmlvX3I4KHBiKTsKKyAgICBmcmFtZXNfY291bnQgICAgICAgICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgIG1zZWNzX3Blcl9mcmFtZSAgICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgdnN0LT5jb2RlYy0+d2lkdGggICAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICB2c3QtPmNvZGVjLT5oZWlnaHQgICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIGF2aW9fcjgocGIpOworICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICA9IGF2aW9fcmwxNihwYik7CisgICAgbXZpLT5hdWRpb19kYXRhX3NpemUgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICBhdmlvX3I4KHBiKTsKKyAgICBwbGF5ZXJfdmVyc2lvbiAgICAgICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgIGF2aW9fcmwxNihwYik7CisgICAgYXZpb19yOChwYik7CisKKyAgICBpZiAoZnJhbWVzX2NvdW50ID09IDAgfHwgbXZpLT5hdWRpb19kYXRhX3NpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAodmVyc2lvbiAhPSA3IHx8IHBsYXllcl92ZXJzaW9uID4gMjEzKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmhhbmRsZWQgdmVyc2lvbiAoJWQsJWQpXG4iLCB2ZXJzaW9uLCBwbGF5ZXJfdmVyc2lvbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGFzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgID0gMTsKKyAgICBhc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCAgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA4OworICAgIGFzdC0+Y29kZWMtPmJpdF9yYXRlICAgICAgICA9IGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICogODsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgbXNlY3NfcGVyX2ZyYW1lLCAxMDAwMDAwKTsKKyAgICB2c3QtPmF2Z19mcmFtZV9yYXRlICAgID0gYXZfaW52X3EodnN0LT50aW1lX2Jhc2UpOworICAgIHZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01PVElPTlBJWEVMUzsKKworICAgIG12aS0+Z2V0X2ludCA9ICh2c3QtPmNvZGVjLT53aWR0aCAqIHZzdC0+Y29kZWMtPmhlaWdodCA8ICgxIDw8IDE2KSkgPyBhdmlvX3JsMTYgOiBhdmlvX3JsMjQ7CisKKyAgICBtdmktPmF1ZGlvX2ZyYW1lX3NpemUgICA9ICgodWludDY0X3QpbXZpLT5hdWRpb19kYXRhX3NpemUgPDwgTVZJX0ZSQUNfQklUUykgLyBmcmFtZXNfY291bnQ7CisgICAgaWYgKG12aS0+YXVkaW9fZnJhbWVfc2l6ZSA8PSAxIDw8IE1WSV9GUkFDX0JJVFMgLSAxKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBhdWRpb19kYXRhX3NpemUgKCUiUFJJdTMyIikgb3IgZnJhbWVzX2NvdW50ICgldSlcbiIsCisgICAgICAgICAgICAgICBtdmktPmF1ZGlvX2RhdGFfc2l6ZSwgZnJhbWVzX2NvdW50KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgbXZpLT5hdWRpb19zaXplX2NvdW50ZXIgPSAoYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiA4MzAgLyBtdmktPmF1ZGlvX2ZyYW1lX3NpemUgLSAxKSAqIG12aS0+YXVkaW9fZnJhbWVfc2l6ZTsKKyAgICBtdmktPmF1ZGlvX3NpemVfbGVmdCAgICA9IG12aS0+YXVkaW9fZGF0YV9zaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGludCByZXQsIGNvdW50OworICAgIE12aURlbXV4Q29udGV4dCAqbXZpID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworCisgICAgaWYgKG12aS0+dmlkZW9fZnJhbWVfc2l6ZSA9PSAwKSB7CisgICAgICAgIG12aS0+dmlkZW9fZnJhbWVfc2l6ZSA9IChtdmktPmdldF9pbnQpKHBiKTsKKyAgICAgICAgaWYgKG12aS0+YXVkaW9fc2l6ZV9sZWZ0ID09IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICBjb3VudCA9IChtdmktPmF1ZGlvX3NpemVfY291bnRlciArIG12aS0+YXVkaW9fZnJhbWVfc2l6ZSArIDUxMikgPj4gTVZJX0ZSQUNfQklUUzsKKyAgICAgICAgaWYgKGNvdW50ID4gbXZpLT5hdWRpb19zaXplX2xlZnQpCisgICAgICAgICAgICBjb3VudCA9IG12aS0+YXVkaW9fc2l6ZV9sZWZ0OworICAgICAgICBpZiAoKHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgY291bnQpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IE1WSV9BVURJT19TVFJFQU1fSU5ERVg7CisgICAgICAgIG12aS0+YXVkaW9fc2l6ZV9sZWZ0IC09IGNvdW50OworICAgICAgICBtdmktPmF1ZGlvX3NpemVfY291bnRlciArPSBtdmktPmF1ZGlvX2ZyYW1lX3NpemUgLSAoY291bnQgPDwgTVZJX0ZSQUNfQklUUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIG12aS0+dmlkZW9fZnJhbWVfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gTVZJX1ZJREVPX1NUUkVBTV9JTkRFWDsKKyAgICAgICAgbXZpLT52aWRlb19mcmFtZV9zaXplID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbXZpX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm12aSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1vdGlvbiBQaXhlbHMgTVZJIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE12aURlbXV4Q29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgID0gcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcmVhZF9wYWNrZXQsCisgICAgLmV4dGVuc2lvbnMgICAgID0gIm12aSIsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L214Zi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L214Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZDE0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbXhmLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBNWEYKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTbWFydEpvZyBTLkEuLCBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlIGRvdCBjb3VkdXJpZXIgYXQgc21hcnRqb2cgZG90IGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJteGYuaCIKKworLyoqCisgKiBTTVBURSBSUDIyNCBodHRwOi8vd3d3LnNtcHRlLXJhLm9yZy9tZGQvaW5kZXguaHRtbAorICovCitjb25zdCBNWEZDb2RlY1VMIGZmX214Zl9kYXRhX2RlZmluaXRpb25fdWxzW10gPSB7CisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDMsMHgwMiwweDAyLDB4MDEsMHgwMCwweDAwLDB4MDAgfSwgMTMsIEFWTUVESUFfVFlQRV9WSURFTyB9LAorICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAzLDB4MDIsMHgwMiwweDAyLDB4MDAsMHgwMCwweDAwIH0sIDEzLCBBVk1FRElBX1RZUEVfQVVESU8gfSwKKyAgICB7IHsgMHg4MCwweDdELDB4MDAsMHg2MCwweDA4LDB4MTQsMHgzRSwweDZGLDB4NkYsMHgzQywweDhDLDB4RTEsMHg2QywweEVGLDB4MTEsMHhEMiB9LCAxNiwgQVZNRURJQV9UWVBFX1ZJREVPIH0sIC8qIExlZ2FjeVBpY3R1cmUgQXZpZCBNZWRpYSBDb21wb3NlciBNWEYgKi8KKyAgICB7IHsgMHg4MCwweDdELDB4MDAsMHg2MCwweDA4LDB4MTQsMHgzRSwweDZGLDB4NzgsMHhFMSwweEVCLDB4RTEsMHg2QywweEVGLDB4MTEsMHhEMiB9LCAxNiwgQVZNRURJQV9UWVBFX0FVRElPIH0sIC8qIExlZ2FjeVNvdW5kIEF2aWQgTWVkaWEgQ29tcG9zZXIgTVhGICovCisgICAgeyB7IDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgIDAsICBBVk1FRElBX1RZUEVfREFUQSB9LAorfTsKKworY29uc3QgTVhGQ29kZWNVTCBmZl9teGZfY29kZWNfdWxzW10gPSB7CisgICAgLyogUGljdHVyZUVzc2VuY2VDb2RpbmcgKi8KKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAzLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDAxLDB4MTEsMHgwMCB9LCAxNCwgQVZfQ09ERUNfSURfTVBFRzJWSURFTyB9LCAvKiBNUEBNTCBMb25nIEdvUCAqLworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MDIsMHgwMSwweDAxIH0sIDE0LCBBVl9DT0RFQ19JRF9NUEVHMlZJREVPIH0sIC8qIEQtMTAgNTBNYnBzIFBBTCAqLworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDMsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MDMsMHgwMywweDAwIH0sIDE0LCBBVl9DT0RFQ19JRF9NUEVHMlZJREVPIH0sIC8qIE1QQEhMIExvbmcgR29QICovCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMywweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgwNCwweDAyLDB4MDAgfSwgMTQsIEFWX0NPREVDX0lEX01QRUcyVklERU8gfSwgLyogNDIyUEBITCBJLUZyYW1lICovCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMywweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgyMCwweDAyLDB4MDMgfSwgMTQsICAgICAgQVZfQ09ERUNfSURfTVBFRzQgfSwgLyogWERDQU0gcHJveHlfcGFsMDMwOTI2Lm14ZiAqLworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAyLDB4MDEsMHgwMiwweDAwIH0sIDEzLCAgICBBVl9DT0RFQ19JRF9EVlZJREVPIH0sIC8qIERWMjUgSUVDIFBBTCAqLworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDcsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAzLDB4MDEsMHgwMSwweDAwIH0sIDE0LCAgIEFWX0NPREVDX0lEX0pQRUcyMDAwIH0sIC8qIEpQRUcyMDAwIENvZGVzdHJlYW0gKi8KKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAyLDB4MDEsMHg3RiwweDAwLDB4MDAsMHgwMCB9LCAxMywgICBBVl9DT0RFQ19JRF9SQVdWSURFTyB9LCAvKiBVbmNvbXByZXNzZWQgKi8KKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDAyLDB4MDEsMHgwMCB9LCAxNSwgICBBVl9DT0RFQ19JRF9SQVdWSURFTyB9LCAvKiBVbmNvbXByZXNzZWQgNDIyIDgtYml0ICovCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAyLDB4NzEsMHgwMCwweDAwLDB4MDAgfSwgMTMsICAgICAgQVZfQ09ERUNfSURfRE5YSEQgfSwgLyogU01QVEUgVkMtMy9ETnhIRCAqLworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAzLDB4MDIsMHgwMCwweDAwIH0sIDE0LCAgICAgIEFWX0NPREVDX0lEX0ROWEhEIH0sIC8qIFNNUFRFIFZDLTMvRE54SEQgKi8KKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEUsMHgwNCwweDAyLDB4MDEsMHgwMiwweDA0LDB4MDEsMHgwMCB9LCAxNiwgICAgICBBVl9DT0RFQ19JRF9ETlhIRCB9LCAvKiBTTVBURSBWQy0zL0ROeEhEIExlZ2FjeSBBdmlkIE1lZGlhIENvbXBvc2VyIE1YRiAqLworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MEEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MzIsMHgwMCwweDAwIH0sIDE0LCAgICAgICBBVl9DT0RFQ19JRF9IMjY0IH0sIC8qIEguMjY0L01QRUctNCBBVkMgSW50cmEgKi8KKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDMxLDB4MTEsMHgwMSB9LCAxNCwgICAgICAgQVZfQ09ERUNfSURfSDI2NCB9LCAvKiBILjI2NC9NUEVHLTQgQVZDIFNQUy9QUFMgaW4tYmFuZCAqLworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MEEsMHgwNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MDIsMHgwMiwweDAxIH0sIDE2LCAgICAgICBBVl9DT0RFQ19JRF9WMjEwIH0sIC8qIFYyMTAgKi8KKyAgICAvKiBTb3VuZEVzc2VuY2VDb21wcmVzc2lvbiAqLworICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDMsMHgwNCwweDAyLDB4MDIsMHgwMiwweDAzLDB4MDMsMHgwMSwweDAwIH0sIDE0LCAgICAgICAgQVZfQ09ERUNfSURfQUFDIH0sIC8qIE1QRUcyIEFBQyBBRFRTIChsZWdhY3kpICovCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDIsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgMTMsICBBVl9DT0RFQ19JRF9QQ01fUzE2TEUgfSwgLyogVW5jb21wcmVzc2VkICovCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDIsMHgwMiwweDAxLDB4N0YsMHgwMCwweDAwLDB4MDAgfSwgMTMsICBBVl9DT0RFQ19JRF9QQ01fUzE2TEUgfSwKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDA3LDB4MDQsMHgwMiwweDAyLDB4MDEsMHg3RSwweDAwLDB4MDAsMHgwMCB9LCAxMywgIEFWX0NPREVDX0lEX1BDTV9TMTZCRSB9LCAvKiBGcm9tIE9tbmVvbiBNWEYgZmlsZSAqLworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDQsMHgwNCwweDAyLDB4MDIsMHgwMiwweDAzLDB4MDEsMHgwMSwweDAwIH0sIDE1LCAgIEFWX0NPREVDX0lEX1BDTV9BTEFXIH0sIC8qIFhEQ0FNIFByb3h5IEMwMDIzUzAxLm14ZiAqLworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAyLDB4MDIsMHgwMiwweDAzLDB4MDIsMHgwMSwweDAwIH0sIDE1LCAgICAgICAgQVZfQ09ERUNfSURfQUMzIH0sCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDIsMHgwMiwweDAyLDB4MDMsMHgwMiwweDA1LDB4MDAgfSwgMTUsICAgICAgICBBVl9DT0RFQ19JRF9NUDIgfSwgLyogTVAyIG9yIE1QMyAqLworICAvL3sgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAyLDB4MDIsMHgwMiwweDAzLDB4MDIsMHgxQywweDAwIH0sIDE1LCAgICBBVl9DT0RFQ19JRF9ET0xCWV9FIH0sIC8qIERvbGJ5LUUgKi8KKyAgICB7IHsgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCB9LCAgMCwgICAgICAgQVZfQ09ERUNfSURfTk9ORSB9LAorfTsKKworY29uc3QgTVhGQ29kZWNVTCBmZl9teGZfcGl4ZWxfZm9ybWF0X3Vsc1tdID0geworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MEEsMHgwNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MDIsMHgwMSwweDAxIH0sIDE2LCBBVl9QSVhfRk1UX1VZVlk0MjIgfSwKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDAyLDB4MDEsMHgwMiB9LCAxNiwgQVZfUElYX0ZNVF9ZVVlWNDIyIH0sCisgICAgeyB7IDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgIDAsICAgIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgY29uc3QgY2hhciBkYXRhWzE2XTsKK30gZmZfbXhmX3BpeGVsX2xheW91dHNbXSA9IHsKKyAgICAvKioKKyAgICAgKiBTZWUgU01QVEUgMzc3TSBFLjIuNDYKKyAgICAgKgorICAgICAqIE5vdGU6IE9ubHkgUkdCLCBwYWxldHRlIGJhc2VkIGFuZCAiYWJub3JtYWwiIFlVViBwaXhlbCBmb3JtYXRzIGxpa2UgNDoyOjI6NCBnbyBoZXJlLgorICAgICAqICAgICAgIEZvciByZWd1bGFyIFlVViwgdXNlIENEQ0lQaWN0dXJlRXNzZW5jZURlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBOb3RlOiBEbyBub3QgdXNlIHRoZXNlIGZvciBlbmNvZGluZyBkZXNjcmlwdG9ycyBmb3IgbGl0dGxlLWVuZGlhbiBmb3JtYXRzIHVudGlsIHdlCisgICAgICogICAgICAgZ2V0IHNhbXBsZXMgb3Igb2ZmaWNpYWwgd29yZCBmcm9tIFNNUFRFIG9uIGhvdy9pZiB0aG9zZSBjYW4gYmUgZW5jb2RlZC4KKyAgICAgKi8KKyAgICB7QVZfUElYX0ZNVF9BQkdSLCAgICB7J0EnLCA4LCAgJ0InLCA4LCAgJ0cnLCA4LCAnUicsIDggICAgICAgICAgICAgICAgIH19LAorICAgIHtBVl9QSVhfRk1UX0FSR0IsICAgIHsnQScsIDgsICAnUicsIDgsICAnRycsIDgsICdCJywgOCAgICAgICAgICAgICAgICAgfX0sCisgICAge0FWX1BJWF9GTVRfQkdSMjQsICAgeydCJywgOCwgICdHJywgOCwgICdSJywgOCAgICAgICAgICAgICAgICAgICAgICAgICB9fSwKKyAgICB7QVZfUElYX0ZNVF9CR1JBLCAgICB7J0InLCA4LCAgJ0cnLCA4LCAgJ1InLCA4LCAnQScsIDggICAgICAgICAgICAgICAgIH19LAorICAgIHtBVl9QSVhfRk1UX1JHQjI0LCAgIHsnUicsIDgsICAnRycsIDgsICAnQicsIDggICAgICAgICAgICAgICAgICAgICAgICAgfX0sCisgICAge0FWX1BJWF9GTVRfUkdCNDQ0QkUseydGJywgNCwgICdSJywgNCwgICdHJywgNCwgJ0InLCA0ICAgICAgICAgICAgICAgICB9fSwKKyAgICB7QVZfUElYX0ZNVF9SR0I0OEJFLCB7J1InLCA4LCAgJ3InLCA4LCAgJ0cnLCA4LCAnZycsIDgsICdCJywgOCwgJ2InLCA4IH19LAorICAgIHtBVl9QSVhfRk1UX1JHQjQ4QkUsIHsnUicsIDE2LCAnRycsIDE2LCAnQicsIDE2ICAgICAgICAgICAgICAgICAgICAgICAgfX0sCisgICAge0FWX1BJWF9GTVRfUkdCNDhMRSwgeydyJywgOCwgICdSJywgOCwgICdnJywgOCwgJ0cnLCA4LCAnYicsIDgsICdCJywgOCB9fSwKKyAgICB7QVZfUElYX0ZNVF9SR0I1NTVCRSx7J0YnLCAxLCAgJ1InLCA1LCAgJ0cnLCA1LCAnQicsIDUgICAgICAgICAgICAgICAgIH19LAorICAgIHtBVl9QSVhfRk1UX1JHQjU2NUJFLHsnUicsIDUsICAnRycsIDYsICAnQicsIDUgICAgICAgICAgICAgICAgICAgICAgICAgfX0sCisgICAge0FWX1BJWF9GTVRfUkdCQSwgICAgeydSJywgOCwgICdHJywgOCwgICdCJywgOCwgJ0EnLCA4ICAgICAgICAgICAgICAgICB9fSwKKyAgICB7QVZfUElYX0ZNVF9QQUw4LCAgICB7J1AnLCA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LAorICAgIHtBVl9QSVhfRk1UX0dSQVk4LCAgIHsnQScsIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sCit9OworCitzdGF0aWMgY29uc3QgaW50IG51bV9waXhlbF9sYXlvdXRzID0gRkZfQVJSQVlfRUxFTVMoZmZfbXhmX3BpeGVsX2xheW91dHMpOworCitpbnQgZmZfbXhmX2RlY29kZV9waXhlbF9sYXlvdXQoY29uc3QgY2hhciBwaXhlbF9sYXlvdXRbMTZdLCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnBpeF9mbXQpCit7CisgICAgaW50IHg7CisKKyAgICBmb3IoeCA9IDA7IHggPCBudW1fcGl4ZWxfbGF5b3V0czsgeCsrKSB7CisgICAgICAgIGlmICghbWVtY21wKHBpeGVsX2xheW91dCwgZmZfbXhmX3BpeGVsX2xheW91dHNbeF0uZGF0YSwgMTYpKSB7CisgICAgICAgICAgICAqcGl4X2ZtdCA9IGZmX214Zl9waXhlbF9sYXlvdXRzW3hdLnBpeF9mbXQ7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGNvbnN0IE1YRlNhbXBsZXNQZXJGcmFtZSBteGZfc3BmW10gPSB7CisgICAgeyB7IDEwMDEsIDI0MDAwIH0sIHsgMjAwMiwgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9IH0sIC8vIEZJTE0gMjMuOTc2CisgICAgeyB7IDEsIDI0fSwgICAgICAgIHsgMjAwMCwgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9IH0sIC8vIEZJTE0gMjQKKyAgICB7IHsgMTAwMSwgMzAwMDAgfSwgeyAxNjAyLCAxNjAxLCAxNjAyLCAxNjAxLCAxNjAyLCAwIH0gfSwgLy8gTlRTQyAyOS45NworICAgIHsgeyAxMDAxLCA2MDAwMCB9LCB7IDgwMSwgIDgwMSwgIDgwMSwgIDgwMSwgIDgwMCwgIDAgfSB9LCAvLyBOVFNDIDU5Ljk0CisgICAgeyB7IDEsIDI1IH0sICAgICAgIHsgMTkyMCwgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9IH0sIC8vIFBBTCAyNQorICAgIHsgeyAxLCA1MCB9LCAgICAgICB7IDk2MCwgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSB9LCAvLyBQQUwgNTAKK307CisKK3N0YXRpYyBjb25zdCBBVlJhdGlvbmFsIG14Zl90aW1lX2Jhc2VbXSA9IHsKKyAgICB7IDEwMDEsIDI0MDAwIH0sCisgICAgeyAxLCAyNH0sCisgICAgeyAxMDAxLCAzMDAwMCB9LAorICAgIHsgMTAwMSwgNjAwMDAgfSwKKyAgICB7IDEsIDI1IH0sCisgICAgeyAxLCA1MCB9LAorICAgIHsgMCwgMH0KK307CisKK2NvbnN0IE1YRlNhbXBsZXNQZXJGcmFtZSAqZmZfbXhmX2dldF9zYW1wbGVzX3Blcl9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2UpCit7CisgICAgaW50IGlkeCA9IGF2X2ZpbmRfbmVhcmVzdF9xX2lkeCh0aW1lX2Jhc2UsIG14Zl90aW1lX2Jhc2UpOworICAgIEFWUmF0aW9uYWwgZGlmZiA9IGF2X3N1Yl9xKHRpbWVfYmFzZSwgbXhmX3RpbWVfYmFzZVtpZHhdKTsKKworICAgIGRpZmYubnVtID0gYWJzKGRpZmYubnVtKTsKKworICAgIGlmIChhdl9jbXBfcShkaWZmLCAoQVZSYXRpb25hbCl7MSwgMTAwMH0pID49IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGF2X2NtcF9xKHRpbWVfYmFzZSwgbXhmX3RpbWVfYmFzZVtpZHhdKSkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIiVkLyVkIGlucHV0IHRpbWUgYmFzZSBtYXRjaGVkICVkLyVkIGNvbnRhaW5lciB0aW1lIGJhc2VcbiIsCisgICAgICAgICAgICAgICB0aW1lX2Jhc2UubnVtLCB0aW1lX2Jhc2UuZGVuLAorICAgICAgICAgICAgICAgbXhmX3NwZltpZHhdLnRpbWVfYmFzZS5udW0sCisgICAgICAgICAgICAgICBteGZfc3BmW2lkeF0udGltZV9iYXNlLmRlbik7CisKKyAgICByZXR1cm4gJm14Zl9zcGZbaWR4XTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9teGYuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9teGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWUxN2M2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L214Zi5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogTVhGCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU21hcnRKb2cgUy5BLiwgQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZSBkb3QgY291ZHVyaWVyIGF0IHNtYXJ0am9nIGRvdCBjb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaWZuZGVmIEFWRk9STUFUX01YRl9ICisjZGVmaW5lIEFWRk9STUFUX01YRl9ICisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHVpbnQ4X3QgVUlEWzE2XTsKKworZW51bSBNWEZNZXRhZGF0YVNldFR5cGUgeworICAgIEFueVR5cGUsCisgICAgTWF0ZXJpYWxQYWNrYWdlLAorICAgIFNvdXJjZVBhY2thZ2UsCisgICAgU291cmNlQ2xpcCwKKyAgICBUaW1lY29kZUNvbXBvbmVudCwKKyAgICBQdWxsZG93bkNvbXBvbmVudCwKKyAgICBTZXF1ZW5jZSwKKyAgICBNdWx0aXBsZURlc2NyaXB0b3IsCisgICAgRGVzY3JpcHRvciwKKyAgICBUcmFjaywKKyAgICBDcnlwdG9Db250ZXh0LAorICAgIFByZWZhY2UsCisgICAgSWRlbnRpZmljYXRpb24sCisgICAgQ29udGVudFN0b3JhZ2UsCisgICAgU3ViRGVzY3JpcHRvciwKKyAgICBJbmRleFRhYmxlU2VnbWVudCwKKyAgICBFc3NlbmNlQ29udGFpbmVyRGF0YSwKKyAgICBUeXBlQm90dG9tLC8vIGFkZCBtZXRhZGF0YSB0eXBlIGJlZm9yZSB0aGlzCisgICAgRXNzZW5jZUdyb3VwLAorfTsKKworZW51bSBNWEZGcmFtZUxheW91dCB7CisgICAgRnVsbEZyYW1lID0gMCwKKyAgICBTZXBhcmF0ZUZpZWxkcywKKyAgICBPbmVGaWVsZCwKKyAgICBNaXhlZEZpZWxkcywKKyAgICBTZWdtZW50ZWRGcmFtZSwKK307CisKK3R5cGVkZWYgc3RydWN0IEtMVlBhY2tldCB7CisgICAgVUlEIGtleTsKKyAgICBpbnQ2NF90IG9mZnNldDsKKyAgICB1aW50NjRfdCBsZW5ndGg7Cit9IEtMVlBhY2tldDsKKwordHlwZWRlZiBzdHJ1Y3QgTVhGQ29kZWNVTCB7CisgICAgVUlEIHVpZDsKKyAgICB1bnNpZ25lZCBtYXRjaGluZ19sZW47CisgICAgaW50IGlkOworfSBNWEZDb2RlY1VMOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3RydWN0IEFWUmF0aW9uYWwgdGltZV9iYXNlOworICAgIGludCBzYW1wbGVzX3Blcl9mcmFtZVs2XTsKK30gTVhGU2FtcGxlc1BlckZyYW1lOworCitleHRlcm4gY29uc3QgTVhGQ29kZWNVTCBmZl9teGZfZGF0YV9kZWZpbml0aW9uX3Vsc1tdOworZXh0ZXJuIGNvbnN0IE1YRkNvZGVjVUwgZmZfbXhmX2NvZGVjX3Vsc1tdOworZXh0ZXJuIGNvbnN0IE1YRkNvZGVjVUwgZmZfbXhmX3BpeGVsX2Zvcm1hdF91bHNbXTsKKworaW50IGZmX214Zl9kZWNvZGVfcGl4ZWxfbGF5b3V0KGNvbnN0IGNoYXIgcGl4ZWxfbGF5b3V0WzE2XSwgZW51bSBBVlBpeGVsRm9ybWF0ICpwaXhfZm10KTsKK2NvbnN0IE1YRlNhbXBsZXNQZXJGcmFtZSAqZmZfbXhmX2dldF9zYW1wbGVzX3Blcl9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIEFWUmF0aW9uYWwgdGltZV9iYXNlKTsKKworI2RlZmluZSBQUkl4VUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiUwMnguJTAyeC4lMDJ4LiUwMnguIiAgICAgICAgICAgICAgICAgIFwKKyAgICAiJTAyeC4lMDJ4LiUwMnguJTAyeC4iICAgICAgICAgICAgICAgICAgXAorICAgICIlMDJ4LiUwMnguJTAyeC4lMDJ4LiIgICAgICAgICAgICAgICAgICBcCisgICAgIiUwMnguJTAyeC4lMDJ4LiUwMngiCisKKyNkZWZpbmUgVUlEX0FSRyh4KSBcCisgICAgKHgpWzBdLCAgKHgpWzFdLCAgKHgpWzJdLCAgKHgpWzNdLCAgICAgIFwKKyAgICAoeClbNF0sICAoeClbNV0sICAoeClbNl0sICAoeClbN10sICAgICAgXAorICAgICh4KVs4XSwgICh4KVs5XSwgICh4KVsxMF0sICh4KVsxMV0sICAgICBcCisgICAgKHgpWzEyXSwgKHgpWzEzXSwgKHgpWzE0XSwgKHgpWzE1XSAgICAgIFwKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIFBSSU5UX0tFWShwYywgcywgeCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2xvZyhwYywgQVZfTE9HX1ZFUkJPU0UsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIiVzICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICIweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsIiAgICAgICAgICAgXAorICAgICAgICAgICAiMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LCIgICAgICAgICAgIFwKKyAgICAgICAgICAgIjB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwiICAgICAgICAgICBcCisgICAgICAgICAgICIweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMnggIiwgICAgICAgICAgXAorICAgICAgICAgICAgcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh4KVswXSwgICh4KVsxXSwgICh4KVsyXSwgICh4KVszXSwgICAgICBcCisgICAgICAgICAgICAoeClbNF0sICAoeClbNV0sICAoeClbNl0sICAoeClbN10sICAgICAgXAorICAgICAgICAgICAgKHgpWzhdLCAgKHgpWzldLCAgKHgpWzEwXSwgKHgpWzExXSwgICAgIFwKKyAgICAgICAgICAgICh4KVsxMl0sICh4KVsxM10sICh4KVsxNF0sICh4KVsxNV0pOyAgICBcCisgICAgYXZfbG9nKHBjLCBBVl9MT0dfSU5GTywgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAiJXMgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIiUwMnguJTAyeC4lMDJ4LiUwMnguIiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICIlMDJ4LiUwMnguJTAyeC4lMDJ4LiIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAiJTAyeC4lMDJ4LiUwMnguJTAyeC4iICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIiUwMnguJTAyeC4lMDJ4LiUwMnhcbiIsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKHgpWzBdLCAgKHgpWzFdLCAgKHgpWzJdLCAgKHgpWzNdLCAgICAgIFwKKyAgICAgICAgICAgICh4KVs0XSwgICh4KVs1XSwgICh4KVs2XSwgICh4KVs3XSwgICAgICBcCisgICAgICAgICAgICAoeClbOF0sICAoeClbOV0sICAoeClbMTBdLCAoeClbMTFdLCAgICAgXAorICAgICAgICAgICAgKHgpWzEyXSwgKHgpWzEzXSwgKHgpWzE0XSwgKHgpWzE1XSkKKyNlbHNlCisjZGVmaW5lIFBSSU5UX0tFWShwYywgcywgeCkKKyNlbmRpZgorCisjZW5kaWYgLyogQVZGT1JNQVRfTVhGX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9teGZkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9teGZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzg4YThhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L214ZmRlYy5jCkBAIC0wLDAgKzEsMjk4MCBAQAorLyoKKyAqIE1YRiBkZW11eGVyLgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNtYXJ0Sm9nIFMuQS4sIEJhcHRpc3RlIENvdWR1cmllciA8YmFwdGlzdGUgZG90IGNvdWR1cmllciBhdCBzbWFydGpvZyBkb3QgY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogUmVmZXJlbmNlcworICogU01QVEUgMzM2TSBLTFYgRGF0YSBFbmNvZGluZyBQcm90b2NvbCBVc2luZyBLZXktTGVuZ3RoLVZhbHVlCisgKiBTTVBURSAzNzdNIE1YRiBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9ucworICogU01QVEUgMzc4TSBPcGVyYXRpb25hbCBQYXR0ZXJuIDFhCisgKiBTTVBURSAzNzlNIE1YRiBHZW5lcmljIENvbnRhaW5lcgorICogU01QVEUgMzgxTSBNYXBwaW5nIE1QRUcgU3RyZWFtcyBpbnRvIHRoZSBNWEYgR2VuZXJpYyBDb250YWluZXIKKyAqIFNNUFRFIDM4Mk0gTWFwcGluZyBBRVMzIGFuZCBCcm9hZGNhc3QgV2F2ZSBBdWRpbyBpbnRvIHRoZSBNWEYgR2VuZXJpYyBDb250YWluZXIKKyAqIFNNUFRFIDM4M00gTWFwcGluZyBEVi1ESUYgRGF0YSB0byB0aGUgTVhGIEdlbmVyaWMgQ29udGFpbmVyCisgKgorICogUHJpbmNpcGxlCisgKiBTZWFyY2ggZm9yIFRyYWNrIG51bWJlcnMgd2hpY2ggd2lsbCBpZGVudGlmeSBlc3NlbmNlIGVsZW1lbnQgS0xWIHBhY2tldHMuCisgKiBTZWFyY2ggZm9yIFNvdXJjZVBhY2thZ2Ugd2hpY2ggZGVmaW5lIHRyYWNrcyB3aGljaCBjb250YWlucyBUcmFjayBudW1iZXJzLgorICogTWF0ZXJpYWwgUGFja2FnZSBjb250YWlucyB0cmFja3Mgd2l0aCByZWZlcmVuY2UgdG8gU291cmNlUGFja2FnZSB0cmFja3MuCisgKiBTZWFyY2ggZm9yIERlc2NyaXB0b3JzIChQaWN0dXJlLCBTb3VuZCkgd2hpY2ggY29udGFpbnMgY29kZWMgaW5mbyBhbmQgcGFyYW1ldGVycy4KKyAqIEFzc2lnbiBEZXNjcmlwdG9ycyB0byBjb3JyZWN0IFRyYWNrcy4KKyAqCisgKiBNZXRhZGF0YSByZWFkaW5nIGZ1bmN0aW9ucyByZWFkIExvY2FsIFRhZ3MsIGdldCBJbnN0YW5jZVVJRCgweDNDMEEpIHRoZW4gYWRkIE1ldGFEYXRhU2V0IHRvIE1YRkNvbnRleHQuCisgKiBNZXRhZGF0YSBwYXJzaW5nIHJlc29sdmVzIFN0cm9uZyBSZWZlcmVuY2VzIHRvIG9iamVjdHMuCisgKgorICogU2ltcGxlIGRlbXV4ZXIsIG9ubHkgT1AxQSBzdXBwb3J0ZWQgYW5kIHNvbWUgZmlsZXMgbWlnaHQgbm90IHdvcmsgYXQgYWxsLgorICogT25seSB0cmFja3Mgd2l0aCBhc3NvY2lhdGVkIGRlc2NyaXB0b3JzIHdpbGwgYmUgZGVjb2RlZC4gIkhpZ2hseSBEZXNpcmFibGUiIFNNUFRFIDM3N00gRC4xCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lY29kZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJteGYuaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBIZWFkZXIsCisgICAgQm9keVBhcnRpdGlvbiwKKyAgICBGb290ZXIKK30gTVhGUGFydGl0aW9uVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBPUDFhID0gMSwKKyAgICBPUDFiLAorICAgIE9QMWMsCisgICAgT1AyYSwKKyAgICBPUDJiLAorICAgIE9QMmMsCisgICAgT1AzYSwKKyAgICBPUDNiLAorICAgIE9QM2MsCisgICAgT1BBdG9tLAorICAgIE9QU09OWU9wdCwgIC8qIEZBVEUgc2FtcGxlLCB2aW9sYXRlcyB0aGUgc3BlYyBpbiBwbGFjZXMgKi8KK30gTVhGT1A7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgY2xvc2VkOworICAgIGludCBjb21wbGV0ZTsKKyAgICBNWEZQYXJ0aXRpb25UeXBlIHR5cGU7CisgICAgdWludDY0X3QgcHJldmlvdXNfcGFydGl0aW9uOworICAgIGludCBpbmRleF9zaWQ7CisgICAgaW50IGJvZHlfc2lkOworICAgIGludDY0X3QgdGhpc19wYXJ0aXRpb247CisgICAgaW50NjRfdCBlc3NlbmNlX29mZnNldDsgICAgICAgICAvLy88IGFic29sdXRlIG9mZnNldCBvZiBlc3NlbmNlCisgICAgaW50NjRfdCBlc3NlbmNlX2xlbmd0aDsKKyAgICBpbnQzMl90IGthZ19zaXplOworICAgIGludDY0X3QgaGVhZGVyX2J5dGVfY291bnQ7CisgICAgaW50NjRfdCBpbmRleF9ieXRlX2NvdW50OworICAgIGludCBwYWNrX2xlbmd0aDsKKyAgICBpbnQ2NF90IHBhY2tfb2ZzOyAgICAgICAgICAgICAgIC8vLzwgYWJzb2x1dGUgb2Zmc2V0IG9mIHBhY2sgaW4gZmlsZSwgaW5jbHVkaW5nIHJ1bi1pbgorfSBNWEZQYXJ0aXRpb247CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSUQgdWlkOworICAgIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGU7CisgICAgVUlEIHNvdXJjZV9jb250YWluZXJfdWw7Cit9IE1YRkNyeXB0b0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSUQgdWlkOworICAgIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGU7CisgICAgVUlEIHNvdXJjZV9wYWNrYWdlX3VpZDsKKyAgICBVSUQgZGF0YV9kZWZpbml0aW9uX3VsOworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgaW50NjRfdCBzdGFydF9wb3NpdGlvbjsKKyAgICBpbnQgc291cmNlX3RyYWNrX2lkOworfSBNWEZTdHJ1Y3R1cmFsQ29tcG9uZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlEIHVpZDsKKyAgICBlbnVtIE1YRk1ldGFkYXRhU2V0VHlwZSB0eXBlOworICAgIFVJRCBkYXRhX2RlZmluaXRpb25fdWw7CisgICAgVUlEICpzdHJ1Y3R1cmFsX2NvbXBvbmVudHNfcmVmczsKKyAgICBpbnQgc3RydWN0dXJhbF9jb21wb25lbnRzX2NvdW50OworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgdWludDhfdCBvcmlnaW47Cit9IE1YRlNlcXVlbmNlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlEIHVpZDsKKyAgICBlbnVtIE1YRk1ldGFkYXRhU2V0VHlwZSB0eXBlOworICAgIGludCBkcm9wX2ZyYW1lOworICAgIGludCBzdGFydF9mcmFtZTsKKyAgICBzdHJ1Y3QgQVZSYXRpb25hbCByYXRlOworICAgIEFWVGltZWNvZGUgdGM7Cit9IE1YRlRpbWVjb2RlQ29tcG9uZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlEIHVpZDsKKyAgICBlbnVtIE1YRk1ldGFkYXRhU2V0VHlwZSB0eXBlOworICAgIFVJRCBpbnB1dF9zZWdtZW50X3JlZjsKK30gTVhGUHVsbGRvd25Db21wb25lbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSUQgdWlkOworICAgIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGU7CisgICAgVUlEICpzdHJ1Y3R1cmFsX2NvbXBvbmVudHNfcmVmczsKKyAgICBpbnQgc3RydWN0dXJhbF9jb21wb25lbnRzX2NvdW50OworICAgIGludDY0X3QgZHVyYXRpb247Cit9IE1YRkVzc2VuY2VHcm91cDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJRCB1aWQ7CisgICAgZW51bSBNWEZNZXRhZGF0YVNldFR5cGUgdHlwZTsKKyAgICBNWEZTZXF1ZW5jZSAqc2VxdWVuY2U7IC8qIG1hbmRhdG9yeSwgYW5kIG9ubHkgb25lICovCisgICAgVUlEIHNlcXVlbmNlX3JlZjsKKyAgICBpbnQgdHJhY2tfaWQ7CisgICAgdWludDhfdCB0cmFja19udW1iZXJbNF07CisgICAgQVZSYXRpb25hbCBlZGl0X3JhdGU7CisgICAgaW50IGludHJhX29ubHk7CisgICAgdWludDY0X3Qgc2FtcGxlX2NvdW50OworICAgIGludDY0X3Qgb3JpZ2luYWxfZHVyYXRpb247IC8qIHN0LT5kdXJhdGlvbiBpbiBTYW1wbGVSYXRlL0VkaXRSYXRlIHVuaXRzICovCit9IE1YRlRyYWNrOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlEIHVpZDsKKyAgICBlbnVtIE1YRk1ldGFkYXRhU2V0VHlwZSB0eXBlOworICAgIFVJRCBlc3NlbmNlX2NvbnRhaW5lcl91bDsKKyAgICBVSUQgZXNzZW5jZV9jb2RlY191bDsKKyAgICBBVlJhdGlvbmFsIHNhbXBsZV9yYXRlOworICAgIEFWUmF0aW9uYWwgYXNwZWN0X3JhdGlvOworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OyAvKiBGaWVsZCBoZWlnaHQsIG5vdCBmcmFtZSBoZWlnaHQgKi8KKyAgICBpbnQgZnJhbWVfbGF5b3V0OyAvKiBTZWUgTVhGRnJhbWVMYXlvdXQgZW51bSAqLworI2RlZmluZSBNWEZfVEZGIDEKKyNkZWZpbmUgTVhGX0JGRiAyCisgICAgaW50IGZpZWxkX2RvbWluYW5jZTsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IGJpdHNfcGVyX3NhbXBsZTsKKyAgICBpbnQ2NF90IGR1cmF0aW9uOyAvKiBDb250YWluZXJEdXJhdGlvbiBvcHRpb25hbCBwcm9wZXJ0eSAqLworICAgIHVuc2lnbmVkIGludCBjb21wb25lbnRfZGVwdGg7CisgICAgdW5zaWduZWQgaW50IGhvcml6X3N1YnNhbXBsaW5nOworICAgIHVuc2lnbmVkIGludCB2ZXJ0X3N1YnNhbXBsaW5nOworICAgIFVJRCAqc3ViX2Rlc2NyaXB0b3JzX3JlZnM7CisgICAgaW50IHN1Yl9kZXNjcmlwdG9yc19jb3VudDsKKyAgICBpbnQgbGlua2VkX3RyYWNrX2lkOworICAgIHVpbnQ4X3QgKmV4dHJhZGF0YTsKKyAgICBpbnQgZXh0cmFkYXRhX3NpemU7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7Cit9IE1YRkRlc2NyaXB0b3I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSUQgdWlkOworICAgIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGU7CisgICAgaW50IGVkaXRfdW5pdF9ieXRlX2NvdW50OworICAgIGludCBpbmRleF9zaWQ7CisgICAgaW50IGJvZHlfc2lkOworICAgIEFWUmF0aW9uYWwgaW5kZXhfZWRpdF9yYXRlOworICAgIHVpbnQ2NF90IGluZGV4X3N0YXJ0X3Bvc2l0aW9uOworICAgIHVpbnQ2NF90IGluZGV4X2R1cmF0aW9uOworICAgIGludDhfdCAqdGVtcG9yYWxfb2Zmc2V0X2VudHJpZXM7CisgICAgaW50ICpmbGFnX2VudHJpZXM7CisgICAgdWludDY0X3QgKnN0cmVhbV9vZmZzZXRfZW50cmllczsKKyAgICBpbnQgbmJfaW5kZXhfZW50cmllczsKK30gTVhGSW5kZXhUYWJsZVNlZ21lbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSUQgdWlkOworICAgIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGU7CisgICAgVUlEIHBhY2thZ2VfdWlkOworICAgIFVJRCAqdHJhY2tzX3JlZnM7CisgICAgaW50IHRyYWNrc19jb3VudDsKKyAgICBNWEZEZXNjcmlwdG9yICpkZXNjcmlwdG9yOyAvKiBvbmx5IG9uZSAqLworICAgIFVJRCBkZXNjcmlwdG9yX3JlZjsKKyAgICBjaGFyICpuYW1lOworfSBNWEZQYWNrYWdlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlEIHVpZDsKKyAgICBlbnVtIE1YRk1ldGFkYXRhU2V0VHlwZSB0eXBlOworfSBNWEZNZXRhZGF0YVNldDsKKworLyogZGVjb2RlZCBpbmRleCB0YWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBpbmRleF9zaWQ7CisgICAgaW50IGJvZHlfc2lkOworICAgIGludCBuYl9wdHNlczsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgUFRTZXMgb3IgdG90YWwgZHVyYXRpb24gb2YgaW5kZXggKi8KKyAgICBpbnQ2NF90IGZpcnN0X2R0czsgICAgICAgICAgLyogRFRTID0gRWRpdFVuaXQgKyBmaXJzdF9kdHMgKi8KKyAgICBpbnQ2NF90ICpwdHNlczsgICAgICAgICAgICAgLyogbWFwcyBFZGl0VW5pdCAtPiBQVFMgKi8KKyAgICBpbnQgbmJfc2VnbWVudHM7CisgICAgTVhGSW5kZXhUYWJsZVNlZ21lbnQgKipzZWdtZW50czsgICAgLyogc29ydGVkIGJ5IEluZGV4U3RhcnRQb3NpdGlvbiAqLworICAgIEFWSW5kZXhFbnRyeSAqZmFrZV9pbmRleDsgICAvKiB1c2VkIGZvciBjYWxsaW5nIGZmX2luZGV4X3NlYXJjaF90aW1lc3RhbXAoKSAqLworfSBNWEZJbmRleFRhYmxlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTVhGUGFydGl0aW9uICpwYXJ0aXRpb25zOworICAgIHVuc2lnbmVkIHBhcnRpdGlvbnNfY291bnQ7CisgICAgTVhGT1Agb3A7CisgICAgVUlEICpwYWNrYWdlc19yZWZzOworICAgIGludCBwYWNrYWdlc19jb3VudDsKKyAgICBNWEZNZXRhZGF0YVNldCAqKm1ldGFkYXRhX3NldHM7CisgICAgaW50IG1ldGFkYXRhX3NldHNfY291bnQ7CisgICAgQVZGb3JtYXRDb250ZXh0ICpmYzsKKyAgICBzdHJ1Y3QgQVZBRVMgKmFlc2M7CisgICAgdWludDhfdCAqbG9jYWxfdGFnczsKKyAgICBpbnQgbG9jYWxfdGFnc19jb3VudDsKKyAgICB1aW50NjRfdCBmb290ZXJfcGFydGl0aW9uOworICAgIEtMVlBhY2tldCBjdXJyZW50X2tsdl9kYXRhOworICAgIGludCBjdXJyZW50X2tsdl9pbmRleDsKKyAgICBpbnQgcnVuX2luOworICAgIE1YRlBhcnRpdGlvbiAqY3VycmVudF9wYXJ0aXRpb247CisgICAgaW50IHBhcnNpbmdfYmFja3dhcmQ7CisgICAgaW50NjRfdCBsYXN0X2ZvcndhcmRfdGVsbDsKKyAgICBpbnQgbGFzdF9mb3J3YXJkX3BhcnRpdGlvbjsKKyAgICBpbnQgY3VycmVudF9lZGl0X3VuaXQ7CisgICAgaW50IG5iX2luZGV4X3RhYmxlczsKKyAgICBNWEZJbmRleFRhYmxlICppbmRleF90YWJsZXM7CisgICAgaW50IGVkaXRfdW5pdHNfcGVyX3BhY2tldDsgICAgICAvLy88IGhvdyBtYW55IGVkaXQgdW5pdHMgdG8gcmVhZCBhdCBhIHRpbWUgKFBDTSwgT1BBdG9tKQorfSBNWEZDb250ZXh0OworCitlbnVtIE1YRldyYXBwaW5nU2NoZW1lIHsKKyAgICBGcmFtZSwKKyAgICBDbGlwLAorfTsKKworLyogTk9URToga2x2X29mZnNldCBpcyBub3Qgc2V0ICgtMSkgZm9yIGxvY2FsIGtleXMgKi8KK3R5cGVkZWYgaW50IE1YRk1ldGFkYXRhUmVhZEZ1bmModm9pZCAqYXJnLCBBVklPQ29udGV4dCAqcGIsIGludCB0YWcsIGludCBzaXplLCBVSUQgdWlkLCBpbnQ2NF90IGtsdl9vZmZzZXQpOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgVUlEIGtleTsKKyAgICBNWEZNZXRhZGF0YVJlYWRGdW5jICpyZWFkOworICAgIGludCBjdHhfc2l6ZTsKKyAgICBlbnVtIE1YRk1ldGFkYXRhU2V0VHlwZSB0eXBlOworfSBNWEZNZXRhZGF0YVJlYWRUYWJsZUVudHJ5OworCitzdGF0aWMgaW50IG14Zl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcyk7CisKKy8qIHBhcnRpYWwga2V5cyB0byBtYXRjaCAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXhmX2hlYWRlcl9wYXJ0aXRpb25fcGFja19rZXlbXSAgICAgICA9IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4MDUsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDAyIH07CitzdGF0aWMgY29uc3QgdWludDhfdCBteGZfZXNzZW5jZV9lbGVtZW50X2tleVtdICAgICAgICAgICAgID0geyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDMsMHgwMSB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXhmX2F2aWRfZXNzZW5jZV9lbGVtZW50X2tleVtdICAgICAgICA9IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MGUsMHgwNCwweDAzLDB4MDEgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IG14Zl9zeXN0ZW1faXRlbV9rZXlbXSAgICAgICAgICAgICAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDA1LDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MDQgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IG14Zl9rbHZfa2V5W10gICAgICAgICAgICAgICAgICAgICAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQgfTsKKy8qIGNvbXBsZXRlIGtleXMgdG8gbWF0Y2ggKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IG14Zl9jcnlwdG9fc291cmNlX2NvbnRhaW5lcl91bFtdICAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwOSwweDA2LDB4MDEsMHgwMSwweDAyLDB4MDIsMHgwMCwweDAwLDB4MDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IG14Zl9lbmNyeXB0ZWRfdHJpcGxldF9rZXlbXSAgICAgICAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDA0LDB4MDEsMHgwNywweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHg3ZSwweDAxLDB4MDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IG14Zl9lbmNyeXB0ZWRfZXNzZW5jZV9jb250YWluZXJbXSAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwNywweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwYiwweDAxLDB4MDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IG14Zl9yYW5kb21faW5kZXhfcGFja19rZXlbXSAgICAgICAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDA1LDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMiwweDAxLDB4MDEsMHgxMSwweDAxLDB4MDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IG14Zl9zb255X21wZWc0X2V4dHJhZGF0YVtdICAgICAgICAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBlLDB4MDYsMHgwNiwweDAyLDB4MDIsMHgwMSwweDAwLDB4MDAgfTsKKworI2RlZmluZSBJU19LTFZfS0VZKHgsIHkpICghbWVtY21wKHgsIHksIHNpemVvZih5KSkpCisKK3N0YXRpYyBpbnQ2NF90IGtsdl9kZWNvZGVfYmVyX2xlbmd0aChBVklPQ29udGV4dCAqcGIpCit7CisgICAgdWludDY0X3Qgc2l6ZSA9IGF2aW9fcjgocGIpOworICAgIGlmIChzaXplICYgMHg4MCkgeyAvKiBsb25nIGZvcm0gKi8KKyAgICAgICAgaW50IGJ5dGVzX251bSA9IHNpemUgJiAweDdmOworICAgICAgICAvKiBTTVBURSAzNzlNIDUuMy40IGd1YXJhbnRlZSB0aGF0IGJ5dGVzX251bSBtdXN0IG5vdCBleGNlZWQgOCBieXRlcyAqLworICAgICAgICBpZiAoYnl0ZXNfbnVtID4gOCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgd2hpbGUgKGJ5dGVzX251bS0tKQorICAgICAgICAgICAgc2l6ZSA9IHNpemUgPDwgOCB8IGF2aW9fcjgocGIpOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBteGZfcmVhZF9zeW5jKEFWSU9Db250ZXh0ICpwYiwgY29uc3QgdWludDhfdCAqa2V5LCB1bnNpZ25lZCBzaXplKQoreworICAgIGludCBpLCBiOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplICYmICFhdmlvX2Zlb2YocGIpOyBpKyspIHsKKyAgICAgICAgYiA9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAoYiA9PSBrZXlbMF0pCisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgZWxzZSBpZiAoYiAhPSBrZXlbaV0pCisgICAgICAgICAgICBpID0gLTE7CisgICAgfQorICAgIHJldHVybiBpID09IHNpemU7Cit9CisKK3N0YXRpYyBpbnQga2x2X3JlYWRfcGFja2V0KEtMVlBhY2tldCAqa2x2LCBBVklPQ29udGV4dCAqcGIpCit7CisgICAgaWYgKCFteGZfcmVhZF9zeW5jKHBiLCBteGZfa2x2X2tleSwgNCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGtsdi0+b2Zmc2V0ID0gYXZpb190ZWxsKHBiKSAtIDQ7CisgICAgbWVtY3B5KGtsdi0+a2V5LCBteGZfa2x2X2tleSwgNCk7CisgICAgYXZpb19yZWFkKHBiLCBrbHYtPmtleSArIDQsIDEyKTsKKyAgICBrbHYtPmxlbmd0aCA9IGtsdl9kZWNvZGVfYmVyX2xlbmd0aChwYik7CisgICAgcmV0dXJuIGtsdi0+bGVuZ3RoID09IC0xID8gLTEgOiAwOworfQorCitzdGF0aWMgaW50IG14Zl9nZXRfc3RyZWFtX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcywgS0xWUGFja2V0ICprbHYpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIE1YRlRyYWNrICp0cmFjayA9IHMtPnN0cmVhbXNbaV0tPnByaXZfZGF0YTsKKyAgICAgICAgLyogU01QVEUgMzc5TSA3LjMgKi8KKyAgICAgICAgaWYgKCFtZW1jbXAoa2x2LT5rZXkgKyBzaXplb2YobXhmX2Vzc2VuY2VfZWxlbWVudF9rZXkpLCB0cmFjay0+dHJhY2tfbnVtYmVyLCBzaXplb2YodHJhY2stPnRyYWNrX251bWJlcikpKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIC8qIHJldHVybiAwIGlmIG9ubHkgb25lIHN0cmVhbSwgZm9yIE9QIEF0b20gZmlsZXMgd2l0aCAwIGFzIHRyYWNrIG51bWJlciAqLworICAgIHJldHVybiBzLT5uYl9zdHJlYW1zID09IDEgPyAwIDogLTE7Cit9CisKKy8qIFhYWDogdXNlIEFWQml0U3RyZWFtRmlsdGVyICovCitzdGF0aWMgaW50IG14Zl9nZXRfZDEwX2FlczNfcGFja2V0KEFWSU9Db250ZXh0ICpwYiwgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0LCBpbnQ2NF90IGxlbmd0aCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWZfcHRyLCAqZW5kX3B0cjsKKyAgICB1aW50OF90ICpkYXRhX3B0cjsKKyAgICBpbnQgaTsKKworICAgIGlmIChsZW5ndGggPiA2MTQ0NCkgLyogd29yc3QgY2FzZSBQQUwgMTkyMCBzYW1wbGVzIDggY2hhbm5lbHMgKi8KKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgbGVuZ3RoID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBsZW5ndGgpOworICAgIGlmIChsZW5ndGggPCAwKQorICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgIGRhdGFfcHRyID0gcGt0LT5kYXRhOworICAgIGVuZF9wdHIgPSBwa3QtPmRhdGEgKyBsZW5ndGg7CisgICAgYnVmX3B0ciA9IHBrdC0+ZGF0YSArIDQ7IC8qIHNraXAgU01QVEUgMzMxTSBoZWFkZXIgKi8KKyAgICBmb3IgKDsgZW5kX3B0ciAtIGJ1Zl9wdHIgPj0gc3QtPmNvZGVjLT5jaGFubmVscyAqIDQ7ICkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPmNvZGVjLT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGUgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZidWZfcHRyKTsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAyNCkKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTI0KCZkYXRhX3B0ciwgKHNhbXBsZSA+PiA0KSAmIDB4ZmZmZmZmKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZkYXRhX3B0ciwgKHNhbXBsZSA+PiAxMikgJiAweGZmZmYpOworICAgICAgICB9CisgICAgICAgIGJ1Zl9wdHIgKz0gMzIgLSBzdC0+Y29kZWMtPmNoYW5uZWxzKjQ7IC8vIGFsd2F5cyA4IGNoYW5uZWxzIHN0b3JlZCBTTVBURSAzMzFNCisgICAgfQorICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCBkYXRhX3B0ciAtIHBrdC0+ZGF0YSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhmX2RlY3J5cHRfdHJpcGxldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsIEtMVlBhY2tldCAqa2x2KQoreworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGNoZWNrdlsxNl0gPSB7MHg0MywgMHg0OCwgMHg1NSwgMHg0YiwgMHg0MywgMHg0OCwgMHg1NSwgMHg0YiwgMHg0MywgMHg0OCwgMHg1NSwgMHg0YiwgMHg0MywgMHg0OCwgMHg1NSwgMHg0Yn07CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludDY0X3QgZW5kID0gYXZpb190ZWxsKHBiKSArIGtsdi0+bGVuZ3RoOworICAgIGludDY0X3Qgc2l6ZTsKKyAgICB1aW50NjRfdCBvcmlnX3NpemU7CisgICAgdWludDY0X3QgcGxhaW50ZXh0X3NpemU7CisgICAgdWludDhfdCBpdmVjWzE2XTsKKyAgICB1aW50OF90IHRtcGJ1ZlsxNl07CisgICAgaW50IGluZGV4OworCisgICAgaWYgKCFteGYtPmFlc2MgJiYgcy0+a2V5ICYmIHMtPmtleWxlbiA9PSAxNikgeworICAgICAgICBteGYtPmFlc2MgPSBhdl9hZXNfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFteGYtPmFlc2MpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhdl9hZXNfaW5pdChteGYtPmFlc2MsIHMtPmtleSwgMTI4LCAxKTsKKyAgICB9CisgICAgLy8gY3J5cHRvIGNvbnRleHQKKyAgICBhdmlvX3NraXAocGIsIGtsdl9kZWNvZGVfYmVyX2xlbmd0aChwYikpOworICAgIC8vIHBsYWludGV4dCBvZmZzZXQKKyAgICBrbHZfZGVjb2RlX2Jlcl9sZW5ndGgocGIpOworICAgIHBsYWludGV4dF9zaXplID0gYXZpb19yYjY0KHBiKTsKKyAgICAvLyBzb3VyY2Uga2x2IGtleQorICAgIGtsdl9kZWNvZGVfYmVyX2xlbmd0aChwYik7CisgICAgYXZpb19yZWFkKHBiLCBrbHYtPmtleSwgMTYpOworICAgIGlmICghSVNfS0xWX0tFWShrbHYsIG14Zl9lc3NlbmNlX2VsZW1lbnRfa2V5KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaW5kZXggPSBteGZfZ2V0X3N0cmVhbV9pbmRleChzLCBrbHYpOworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIC8vIHNvdXJjZSBzaXplCisgICAga2x2X2RlY29kZV9iZXJfbGVuZ3RoKHBiKTsKKyAgICBvcmlnX3NpemUgPSBhdmlvX3JiNjQocGIpOworICAgIGlmIChvcmlnX3NpemUgPCBwbGFpbnRleHRfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgLy8gZW5jLiBjb2RlCisgICAgc2l6ZSA9IGtsdl9kZWNvZGVfYmVyX2xlbmd0aChwYik7CisgICAgaWYgKHNpemUgPCAzMiB8fCBzaXplIC0gMzIgPCBvcmlnX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGF2aW9fcmVhZChwYiwgaXZlYywgMTYpOworICAgIGF2aW9fcmVhZChwYiwgdG1wYnVmLCAxNik7CisgICAgaWYgKG14Zi0+YWVzYykKKyAgICAgICAgYXZfYWVzX2NyeXB0KG14Zi0+YWVzYywgdG1wYnVmLCB0bXBidWYsIDEsIGl2ZWMsIDEpOworICAgIGlmIChtZW1jbXAodG1wYnVmLCBjaGVja3YsIDE2KSkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInByb2JhYmx5IGluY29ycmVjdCBkZWNyeXB0aW9uIGtleVxuIik7CisgICAgc2l6ZSAtPSAzMjsKKyAgICBzaXplID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBzaXplKTsKKyAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBzaXplOworICAgIGVsc2UgaWYgKHNpemUgPCBwbGFpbnRleHRfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgc2l6ZSAtPSBwbGFpbnRleHRfc2l6ZTsKKyAgICBpZiAobXhmLT5hZXNjKQorICAgICAgICBhdl9hZXNfY3J5cHQobXhmLT5hZXNjLCAmcGt0LT5kYXRhW3BsYWludGV4dF9zaXplXSwKKyAgICAgICAgICAgICAgICAgICAgICZwa3QtPmRhdGFbcGxhaW50ZXh0X3NpemVdLCBzaXplID4+IDQsIGl2ZWMsIDEpOworICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCBvcmlnX3NpemUpOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gaW5kZXg7CisgICAgYXZpb19za2lwKHBiLCBlbmQgLSBhdmlvX3RlbGwocGIpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGZfcmVhZF9wcmltZXJfcGFjayh2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCB1aWQsIGludDY0X3Qga2x2X29mZnNldCkKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBhcmc7CisgICAgaW50IGl0ZW1fbnVtID0gYXZpb19yYjMyKHBiKTsKKyAgICBpbnQgaXRlbV9sZW4gPSBhdmlvX3JiMzIocGIpOworCisgICAgaWYgKGl0ZW1fbGVuICE9IDE4KSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShwYiwgIlByaW1lciBwYWNrIGl0ZW0gbGVuZ3RoICVkIiwgaXRlbV9sZW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIGlmIChpdGVtX251bSA+IDY1NTM2KSB7CisgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsICJpdGVtX251bSAlZCBpcyB0b28gbGFyZ2VcbiIsIGl0ZW1fbnVtKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChteGYtPmxvY2FsX3RhZ3MpCisgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfVkVSQk9TRSwgIk11bHRpcGxlIHByaW1lciBwYWNrc1xuIik7CisgICAgYXZfZnJlZShteGYtPmxvY2FsX3RhZ3MpOworICAgIG14Zi0+bG9jYWxfdGFnc19jb3VudCA9IDA7CisgICAgbXhmLT5sb2NhbF90YWdzID0gYXZfY2FsbG9jKGl0ZW1fbnVtLCBpdGVtX2xlbik7CisgICAgaWYgKCFteGYtPmxvY2FsX3RhZ3MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbXhmLT5sb2NhbF90YWdzX2NvdW50ID0gaXRlbV9udW07CisgICAgYXZpb19yZWFkKHBiLCBteGYtPmxvY2FsX3RhZ3MsIGl0ZW1fbnVtKml0ZW1fbGVuKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGZfcmVhZF9wYXJ0aXRpb25fcGFjayh2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCB1aWQsIGludDY0X3Qga2x2X29mZnNldCkKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBhcmc7CisgICAgTVhGUGFydGl0aW9uICpwYXJ0aXRpb24sICp0bXBfcGFydDsKKyAgICBVSUQgb3A7CisgICAgdWludDY0X3QgZm9vdGVyX3BhcnRpdGlvbjsKKyAgICB1aW50MzJfdCBuYl9lc3NlbmNlX2NvbnRhaW5lcnM7CisKKyAgICB0bXBfcGFydCA9IGF2X3JlYWxsb2NfYXJyYXkobXhmLT5wYXJ0aXRpb25zLCBteGYtPnBhcnRpdGlvbnNfY291bnQgKyAxLCBzaXplb2YoKm14Zi0+cGFydGl0aW9ucykpOworICAgIGlmICghdG1wX3BhcnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbXhmLT5wYXJ0aXRpb25zID0gdG1wX3BhcnQ7CisKKyAgICBpZiAobXhmLT5wYXJzaW5nX2JhY2t3YXJkKSB7CisgICAgICAgIC8qIGluc2VydCB0aGUgbmV3IHBhcnRpdGlvbiBwYWNrIGluIHRoZSBtaWRkbGUKKyAgICAgICAgICogdGhpcyBtYWtlcyB0aGUgZW50cmllcyBpbiBteGYtPnBhcnRpdGlvbnMgc29ydGVkIGJ5IG9mZnNldCAqLworICAgICAgICBtZW1tb3ZlKCZteGYtPnBhcnRpdGlvbnNbbXhmLT5sYXN0X2ZvcndhcmRfcGFydGl0aW9uKzFdLAorICAgICAgICAgICAgICAgICZteGYtPnBhcnRpdGlvbnNbbXhmLT5sYXN0X2ZvcndhcmRfcGFydGl0aW9uXSwKKyAgICAgICAgICAgICAgICAobXhmLT5wYXJ0aXRpb25zX2NvdW50IC0gbXhmLT5sYXN0X2ZvcndhcmRfcGFydGl0aW9uKSpzaXplb2YoKm14Zi0+cGFydGl0aW9ucykpOworICAgICAgICBwYXJ0aXRpb24gPSBteGYtPmN1cnJlbnRfcGFydGl0aW9uID0gJm14Zi0+cGFydGl0aW9uc1tteGYtPmxhc3RfZm9yd2FyZF9wYXJ0aXRpb25dOworICAgIH0gZWxzZSB7CisgICAgICAgIG14Zi0+bGFzdF9mb3J3YXJkX3BhcnRpdGlvbisrOworICAgICAgICBwYXJ0aXRpb24gPSBteGYtPmN1cnJlbnRfcGFydGl0aW9uID0gJm14Zi0+cGFydGl0aW9uc1tteGYtPnBhcnRpdGlvbnNfY291bnRdOworICAgIH0KKworICAgIG1lbXNldChwYXJ0aXRpb24sIDAsIHNpemVvZigqcGFydGl0aW9uKSk7CisgICAgbXhmLT5wYXJ0aXRpb25zX2NvdW50Kys7CisgICAgcGFydGl0aW9uLT5wYWNrX2xlbmd0aCA9IGF2aW9fdGVsbChwYikgLSBrbHZfb2Zmc2V0ICsgc2l6ZTsKKyAgICBwYXJ0aXRpb24tPnBhY2tfb2ZzICAgID0ga2x2X29mZnNldDsKKworICAgIHN3aXRjaCh1aWRbMTNdKSB7CisgICAgY2FzZSAyOgorICAgICAgICBwYXJ0aXRpb24tPnR5cGUgPSBIZWFkZXI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgcGFydGl0aW9uLT50eXBlID0gQm9keVBhcnRpdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBwYXJ0aXRpb24tPnR5cGUgPSBGb290ZXI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIHBhcnRpdGlvbiB0eXBlICVpXG4iLCB1aWRbMTNdKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogY29uc2lkZXIgYm90aCBmb290ZXJzIHRvIGJlIGNsb3NlZCAodGhlcmUgaXMgb25seSBGb290ZXIgYW5kIENvbXBsZXRlRm9vdGVyKSAqLworICAgIHBhcnRpdGlvbi0+Y2xvc2VkID0gcGFydGl0aW9uLT50eXBlID09IEZvb3RlciB8fCAhKHVpZFsxNF0gJiAxKTsKKyAgICBwYXJ0aXRpb24tPmNvbXBsZXRlID0gdWlkWzE0XSA+IDI7CisgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICBwYXJ0aXRpb24tPmthZ19zaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICBwYXJ0aXRpb24tPnRoaXNfcGFydGl0aW9uID0gYXZpb19yYjY0KHBiKTsKKyAgICBwYXJ0aXRpb24tPnByZXZpb3VzX3BhcnRpdGlvbiA9IGF2aW9fcmI2NChwYik7CisgICAgZm9vdGVyX3BhcnRpdGlvbiA9IGF2aW9fcmI2NChwYik7CisgICAgcGFydGl0aW9uLT5oZWFkZXJfYnl0ZV9jb3VudCA9IGF2aW9fcmI2NChwYik7CisgICAgcGFydGl0aW9uLT5pbmRleF9ieXRlX2NvdW50ID0gYXZpb19yYjY0KHBiKTsKKyAgICBwYXJ0aXRpb24tPmluZGV4X3NpZCA9IGF2aW9fcmIzMihwYik7CisgICAgYXZpb19za2lwKHBiLCA4KTsKKyAgICBwYXJ0aXRpb24tPmJvZHlfc2lkID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBvcCwgc2l6ZW9mKFVJRCkpICE9IHNpemVvZihVSUQpKSB7CisgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgcmVhZGluZyBVSURcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgbmJfZXNzZW5jZV9jb250YWluZXJzID0gYXZpb19yYjMyKHBiKTsKKworICAgIGlmIChwYXJ0aXRpb24tPnRoaXNfcGFydGl0aW9uICYmCisgICAgICAgIHBhcnRpdGlvbi0+cHJldmlvdXNfcGFydGl0aW9uID09IHBhcnRpdGlvbi0+dGhpc19wYXJ0aXRpb24pIHsKKyAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJQcmV2aW91c1BhcnRpdGlvbiBlcXVhbCB0byBUaGlzUGFydGl0aW9uICUiUFJJeDY0IlxuIiwKKyAgICAgICAgICAgICAgIHBhcnRpdGlvbi0+cHJldmlvdXNfcGFydGl0aW9uKTsKKyAgICAgICAgLyogb3ZlcnJpZGUgd2l0aCB0aGUgYWN0dWFsIHByZXZpb3VzIHBhcnRpdGlvbiBvZmZzZXQgKi8KKyAgICAgICAgaWYgKCFteGYtPnBhcnNpbmdfYmFja3dhcmQgJiYgbXhmLT5sYXN0X2ZvcndhcmRfcGFydGl0aW9uID4gMSkgeworICAgICAgICAgICAgTVhGUGFydGl0aW9uICpwcmV2ID0KKyAgICAgICAgICAgICAgICBteGYtPnBhcnRpdGlvbnMgKyBteGYtPmxhc3RfZm9yd2FyZF9wYXJ0aXRpb24gLSAyOworICAgICAgICAgICAgcGFydGl0aW9uLT5wcmV2aW91c19wYXJ0aXRpb24gPSBwcmV2LT50aGlzX3BhcnRpdGlvbjsKKyAgICAgICAgfQorICAgICAgICAvKiBpZiBubyBwcmV2aW91cyBib2R5IHBhcnRpdGlvbiBhcmUgZm91bmQgcG9pbnQgdG8gdGhlIGhlYWRlcgorICAgICAgICAgKiBwYXJ0aXRpb24gKi8KKyAgICAgICAgaWYgKHBhcnRpdGlvbi0+cHJldmlvdXNfcGFydGl0aW9uID09IHBhcnRpdGlvbi0+dGhpc19wYXJ0aXRpb24pCisgICAgICAgICAgICBwYXJ0aXRpb24tPnByZXZpb3VzX3BhcnRpdGlvbiA9IDA7CisgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiT3ZlcnJpZGluZyBQcmV2aW91c1BhcnRpdGlvbiB3aXRoICUiUFJJeDY0IlxuIiwKKyAgICAgICAgICAgICAgIHBhcnRpdGlvbi0+cHJldmlvdXNfcGFydGl0aW9uKTsKKyAgICB9CisKKyAgICAvKiBzb21lIGZpbGVzIGRvbid0aGF2ZSBGb290ZXJQYXJ0aXRpb24gc2V0IGluIGV2ZXJ5IHBhcnRpdGlvbiAqLworICAgIGlmIChmb290ZXJfcGFydGl0aW9uKSB7CisgICAgICAgIGlmIChteGYtPmZvb3Rlcl9wYXJ0aXRpb24gJiYgbXhmLT5mb290ZXJfcGFydGl0aW9uICE9IGZvb3Rlcl9wYXJ0aXRpb24pIHsKKyAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImluY29uc2lzdGVudCBGb290ZXJQYXJ0aXRpb24gdmFsdWU6ICUiUFJJdTY0IiAhPSAlIlBSSXU2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgbXhmLT5mb290ZXJfcGFydGl0aW9uLCBmb290ZXJfcGFydGl0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG14Zi0+Zm9vdGVyX3BhcnRpdGlvbiA9IGZvb3Rlcl9wYXJ0aXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9kbG9nKG14Zi0+ZmMsCisgICAgICAgICAgICAiUGFydGl0aW9uUGFjazogVGhpc1BhcnRpdGlvbiA9IDB4JSJQUklYNjQKKyAgICAgICAgICAgICIsIFByZXZpb3VzUGFydGl0aW9uID0gMHglIlBSSVg2NCIsICIKKyAgICAgICAgICAgICJGb290ZXJQYXJ0aXRpb24gPSAweCUiUFJJWDY0IiwgSW5kZXhTSUQgPSAlaSwgQm9keVNJRCA9ICVpXG4iLAorICAgICAgICAgICAgcGFydGl0aW9uLT50aGlzX3BhcnRpdGlvbiwKKyAgICAgICAgICAgIHBhcnRpdGlvbi0+cHJldmlvdXNfcGFydGl0aW9uLCBmb290ZXJfcGFydGl0aW9uLAorICAgICAgICAgICAgcGFydGl0aW9uLT5pbmRleF9zaWQsIHBhcnRpdGlvbi0+Ym9keV9zaWQpOworCisgICAgLyogc2FuaXR5IGNoZWNrIFByZXZpb3VzUGFydGl0aW9uIGlmIHNldCAqLworICAgIC8vTk9URTogdGhpcyBpc24ndCBhY3R1YWxseSBlbm91Z2gsIHNlZSBteGZfc2Vla190b19wcmV2aW91c19wYXJ0aXRpb24oKQorICAgIGlmIChwYXJ0aXRpb24tPnByZXZpb3VzX3BhcnRpdGlvbiAmJgorICAgICAgICBteGYtPnJ1bl9pbiArIHBhcnRpdGlvbi0+cHJldmlvdXNfcGFydGl0aW9uID49IGtsdl9vZmZzZXQpIHsKKyAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJQcmV2aW91c1BhcnRpdGlvbiBwb2ludHMgdG8gdGhpcyBwYXJ0aXRpb24gb3IgZm9yd2FyZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICAgICAgKG9wWzEyXSA9PSAxICYmIG9wWzEzXSA9PSAxKSBteGYtPm9wID0gT1AxYTsKKyAgICBlbHNlIGlmIChvcFsxMl0gPT0gMSAmJiBvcFsxM10gPT0gMikgbXhmLT5vcCA9IE9QMWI7CisgICAgZWxzZSBpZiAob3BbMTJdID09IDEgJiYgb3BbMTNdID09IDMpIG14Zi0+b3AgPSBPUDFjOworICAgIGVsc2UgaWYgKG9wWzEyXSA9PSAyICYmIG9wWzEzXSA9PSAxKSBteGYtPm9wID0gT1AyYTsKKyAgICBlbHNlIGlmIChvcFsxMl0gPT0gMiAmJiBvcFsxM10gPT0gMikgbXhmLT5vcCA9IE9QMmI7CisgICAgZWxzZSBpZiAob3BbMTJdID09IDIgJiYgb3BbMTNdID09IDMpIG14Zi0+b3AgPSBPUDJjOworICAgIGVsc2UgaWYgKG9wWzEyXSA9PSAzICYmIG9wWzEzXSA9PSAxKSBteGYtPm9wID0gT1AzYTsKKyAgICBlbHNlIGlmIChvcFsxMl0gPT0gMyAmJiBvcFsxM10gPT0gMikgbXhmLT5vcCA9IE9QM2I7CisgICAgZWxzZSBpZiAob3BbMTJdID09IDMgJiYgb3BbMTNdID09IDMpIG14Zi0+b3AgPSBPUDNjOworICAgIGVsc2UgaWYgKG9wWzEyXSA9PSA2NCYmIG9wWzEzXSA9PSAxKSBteGYtPm9wID0gT1BTT05ZT3B0OworICAgIGVsc2UgaWYgKG9wWzEyXSA9PSAweDEwKSB7CisgICAgICAgIC8qIFNNUFRFIDM5MG06ICJUaGVyZSBzaGFsbCBiZSBleGFjdGx5IG9uZSBlc3NlbmNlIGNvbnRhaW5lciIKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyBibG9jayBkZWFscyB3aXRoIGZpbGVzIHRoYXQgdmlvbGF0ZSB0aGlzLCBuYW1lbHk6CisgICAgICAgICAqIDIwMTFfRENQVEVTVF8yNEZQUy5WLm14ZiAtIHR3byBFQ3MsIE9QMWEKKyAgICAgICAgICogYWJjZGVmZ2hpdjAxNmY1NjQxNWUubXhmIC0gemVybyBFQ3MsIE9QQXRvbSwgb3V0cHV0IGJ5IEF2aWQgQWlyU3BlZWQgKi8KKyAgICAgICAgaWYgKG5iX2Vzc2VuY2VfY29udGFpbmVycyAhPSAxKSB7CisgICAgICAgICAgICBNWEZPUCBvcCA9IG5iX2Vzc2VuY2VfY29udGFpbmVycyA/IE9QMWEgOiBPUEF0b207CisKKyAgICAgICAgICAgIC8qIG9ubHkgbmFnIG9uY2UgKi8KKyAgICAgICAgICAgIGlmICghbXhmLT5vcCkKKyAgICAgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJcIk9QQXRvbVwiIHdpdGggJSJQUkl1MzIiIEVDcyAtIGFzc3VtaW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBuYl9lc3NlbmNlX2NvbnRhaW5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgIG9wID09IE9QMWEgPyAiT1AxYSIgOiAiT1BBdG9tIik7CisKKyAgICAgICAgICAgIG14Zi0+b3AgPSBvcDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBteGYtPm9wID0gT1BBdG9tOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIG9wZXJhdGlvbmFsIHBhdHRlcm46ICUwMnhoICUwMnhoIC0gZ3Vlc3NpbmcgT1AxYVxuIiwgb3BbMTJdLCBvcFsxM10pOworICAgICAgICBteGYtPm9wID0gT1AxYTsKKyAgICB9CisKKyAgICBpZiAocGFydGl0aW9uLT5rYWdfc2l6ZSA8PSAwIHx8IHBhcnRpdGlvbi0+a2FnX3NpemUgPiAoMSA8PCAyMCkpIHsKKyAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiaW52YWxpZCBLQUdTaXplICUiUFJJZDMyIiAtIGd1ZXNzaW5nICIsCisgICAgICAgICAgICAgICBwYXJ0aXRpb24tPmthZ19zaXplKTsKKworICAgICAgICBpZiAobXhmLT5vcCA9PSBPUFNPTllPcHQpCisgICAgICAgICAgICBwYXJ0aXRpb24tPmthZ19zaXplID0gNTEyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXJ0aXRpb24tPmthZ19zaXplID0gMTsKKworICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX1dBUk5JTkcsICIlIlBSSWQzMiJcbiIsIHBhcnRpdGlvbi0+a2FnX3NpemUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9hZGRfbWV0YWRhdGFfc2V0KE1YRkNvbnRleHQgKm14Ziwgdm9pZCAqbWV0YWRhdGFfc2V0KQoreworICAgIE1YRk1ldGFkYXRhU2V0ICoqdG1wOworCisgICAgdG1wID0gYXZfcmVhbGxvY19hcnJheShteGYtPm1ldGFkYXRhX3NldHMsIG14Zi0+bWV0YWRhdGFfc2V0c19jb3VudCArIDEsIHNpemVvZigqbXhmLT5tZXRhZGF0YV9zZXRzKSk7CisgICAgaWYgKCF0bXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbXhmLT5tZXRhZGF0YV9zZXRzID0gdG1wOworICAgIG14Zi0+bWV0YWRhdGFfc2V0c1tteGYtPm1ldGFkYXRhX3NldHNfY291bnRdID0gbWV0YWRhdGFfc2V0OworICAgIG14Zi0+bWV0YWRhdGFfc2V0c19jb3VudCsrOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX2NyeXB0b2dyYXBoaWNfY29udGV4dCh2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCB1aWQsIGludDY0X3Qga2x2X29mZnNldCkKK3sKKyAgICBNWEZDcnlwdG9Db250ZXh0ICpjcnlwdG9jb250ZXh0ID0gYXJnOworICAgIGlmIChzaXplICE9IDE2KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoSVNfS0xWX0tFWSh1aWQsIG14Zl9jcnlwdG9fc291cmNlX2NvbnRhaW5lcl91bCkpCisgICAgICAgIGF2aW9fcmVhZChwYiwgY3J5cHRvY29udGV4dC0+c291cmNlX2NvbnRhaW5lcl91bCwgMTYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX2NvbnRlbnRfc3RvcmFnZSh2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCB1aWQsIGludDY0X3Qga2x2X29mZnNldCkKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBhcmc7CisgICAgc3dpdGNoICh0YWcpIHsKKyAgICBjYXNlIDB4MTkwMToKKyAgICAgICAgaWYgKG14Zi0+cGFja2FnZXNfcmVmcykKKyAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfVkVSQk9TRSwgIk11bHRpcGxlIHBhY2thZ2VzX3JlZnNcbiIpOworICAgICAgICBhdl9mcmVlKG14Zi0+cGFja2FnZXNfcmVmcyk7CisgICAgICAgIG14Zi0+cGFja2FnZXNfY291bnQgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBteGYtPnBhY2thZ2VzX3JlZnMgPSBhdl9jYWxsb2MobXhmLT5wYWNrYWdlc19jb3VudCwgc2l6ZW9mKFVJRCkpOworICAgICAgICBpZiAoIW14Zi0+cGFja2FnZXNfcmVmcykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7IC8qIHVzZWxlc3Mgc2l6ZSBvZiBvYmplY3RzLCBhbHdheXMgMTYgYWNjb3JkaW5nIHRvIHNwZWNzICovCisgICAgICAgIGF2aW9fcmVhZChwYiwgKHVpbnQ4X3QgKilteGYtPnBhY2thZ2VzX3JlZnMsIG14Zi0+cGFja2FnZXNfY291bnQgKiBzaXplb2YoVUlEKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGZfcmVhZF9zb3VyY2VfY2xpcCh2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCB1aWQsIGludDY0X3Qga2x2X29mZnNldCkKK3sKKyAgICBNWEZTdHJ1Y3R1cmFsQ29tcG9uZW50ICpzb3VyY2VfY2xpcCA9IGFyZzsKKyAgICBzd2l0Y2godGFnKSB7CisgICAgY2FzZSAweDAyMDI6CisgICAgICAgIHNvdXJjZV9jbGlwLT5kdXJhdGlvbiA9IGF2aW9fcmI2NChwYik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMjAxOgorICAgICAgICBzb3VyY2VfY2xpcC0+c3RhcnRfcG9zaXRpb24gPSBhdmlvX3JiNjQocGIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTEwMToKKyAgICAgICAgLyogVU1JRCwgb25seSBnZXQgbGFzdCAxNiBieXRlcyAqLworICAgICAgICBhdmlvX3NraXAocGIsIDE2KTsKKyAgICAgICAgYXZpb19yZWFkKHBiLCBzb3VyY2VfY2xpcC0+c291cmNlX3BhY2thZ2VfdWlkLCAxNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMTAyOgorICAgICAgICBzb3VyY2VfY2xpcC0+c291cmNlX3RyYWNrX2lkID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX3RpbWVjb2RlX2NvbXBvbmVudCh2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCB1aWQsIGludDY0X3Qga2x2X29mZnNldCkKK3sKKyAgICBNWEZUaW1lY29kZUNvbXBvbmVudCAqbXhmX3RpbWVjb2RlID0gYXJnOworICAgIHN3aXRjaCh0YWcpIHsKKyAgICBjYXNlIDB4MTUwMToKKyAgICAgICAgbXhmX3RpbWVjb2RlLT5zdGFydF9mcmFtZSA9IGF2aW9fcmI2NChwYik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxNTAyOgorICAgICAgICBteGZfdGltZWNvZGUtPnJhdGUgPSAoQVZSYXRpb25hbCl7YXZpb19yYjE2KHBiKSwgMX07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxNTAzOgorICAgICAgICBteGZfdGltZWNvZGUtPmRyb3BfZnJhbWUgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX3B1bGxkb3duX2NvbXBvbmVudCh2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCB1aWQsIGludDY0X3Qga2x2X29mZnNldCkKK3sKKyAgICBNWEZQdWxsZG93bkNvbXBvbmVudCAqbXhmX3B1bGxkb3duID0gYXJnOworICAgIHN3aXRjaCh0YWcpIHsKKyAgICBjYXNlIDB4MGQwMToKKyAgICAgICAgYXZpb19yZWFkKHBiLCBteGZfcHVsbGRvd24tPmlucHV0X3NlZ21lbnRfcmVmLCAxNik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGZfcmVhZF90cmFjayh2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCB1aWQsIGludDY0X3Qga2x2X29mZnNldCkKK3sKKyAgICBNWEZUcmFjayAqdHJhY2sgPSBhcmc7CisgICAgc3dpdGNoKHRhZykgeworICAgIGNhc2UgMHg0ODAxOgorICAgICAgICB0cmFjay0+dHJhY2tfaWQgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NDgwNDoKKyAgICAgICAgYXZpb19yZWFkKHBiLCB0cmFjay0+dHJhY2tfbnVtYmVyLCA0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDRiMDE6CisgICAgICAgIHRyYWNrLT5lZGl0X3JhdGUubnVtID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgdHJhY2stPmVkaXRfcmF0ZS5kZW4gPSBhdmlvX3JiMzIocGIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NDgwMzoKKyAgICAgICAgYXZpb19yZWFkKHBiLCB0cmFjay0+c2VxdWVuY2VfcmVmLCAxNik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGZfcmVhZF9zZXF1ZW5jZSh2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCB1aWQsIGludDY0X3Qga2x2X29mZnNldCkKK3sKKyAgICBNWEZTZXF1ZW5jZSAqc2VxdWVuY2UgPSBhcmc7CisgICAgc3dpdGNoKHRhZykgeworICAgIGNhc2UgMHgwMjAyOgorICAgICAgICBzZXF1ZW5jZS0+ZHVyYXRpb24gPSBhdmlvX3JiNjQocGIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDIwMToKKyAgICAgICAgYXZpb19yZWFkKHBiLCBzZXF1ZW5jZS0+ZGF0YV9kZWZpbml0aW9uX3VsLCAxNik7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NGIwMjoKKyAgICAgICAgc2VxdWVuY2UtPm9yaWdpbiA9IGF2aW9fcjgocGIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTAwMToKKyAgICAgICAgc2VxdWVuY2UtPnN0cnVjdHVyYWxfY29tcG9uZW50c19jb3VudCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIHNlcXVlbmNlLT5zdHJ1Y3R1cmFsX2NvbXBvbmVudHNfcmVmcyA9IGF2X2NhbGxvYyhzZXF1ZW5jZS0+c3RydWN0dXJhbF9jb21wb25lbnRzX2NvdW50LCBzaXplb2YoVUlEKSk7CisgICAgICAgIGlmICghc2VxdWVuY2UtPnN0cnVjdHVyYWxfY29tcG9uZW50c19yZWZzKSB7CisgICAgICAgICAgICBzZXF1ZW5jZS0+c3RydWN0dXJhbF9jb21wb25lbnRzX2NvdW50ID0gMDsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19za2lwKHBiLCA0KTsgLyogdXNlbGVzcyBzaXplIG9mIG9iamVjdHMsIGFsd2F5cyAxNiBhY2NvcmRpbmcgdG8gc3BlY3MgKi8KKyAgICAgICAgYXZpb19yZWFkKHBiLCAodWludDhfdCAqKXNlcXVlbmNlLT5zdHJ1Y3R1cmFsX2NvbXBvbmVudHNfcmVmcywgc2VxdWVuY2UtPnN0cnVjdHVyYWxfY29tcG9uZW50c19jb3VudCAqIHNpemVvZihVSUQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX2Vzc2VuY2VfZ3JvdXAodm9pZCAqYXJnLCBBVklPQ29udGV4dCAqcGIsIGludCB0YWcsIGludCBzaXplLCBVSUQgdWlkLCBpbnQ2NF90IGtsdl9vZmZzZXQpCit7CisgICAgTVhGRXNzZW5jZUdyb3VwICplc3NlbmNlX2dyb3VwID0gYXJnOworICAgIHN3aXRjaCAodGFnKSB7CisgICAgY2FzZSAweDAyMDI6CisgICAgICAgIGVzc2VuY2VfZ3JvdXAtPmR1cmF0aW9uID0gYXZpb19yYjY0KHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDA1MDE6CisgICAgICAgIGVzc2VuY2VfZ3JvdXAtPnN0cnVjdHVyYWxfY29tcG9uZW50c19jb3VudCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGVzc2VuY2VfZ3JvdXAtPnN0cnVjdHVyYWxfY29tcG9uZW50c19yZWZzID0gYXZfY2FsbG9jKGVzc2VuY2VfZ3JvdXAtPnN0cnVjdHVyYWxfY29tcG9uZW50c19jb3VudCwgc2l6ZW9mKFVJRCkpOworICAgICAgICBpZiAoIWVzc2VuY2VfZ3JvdXAtPnN0cnVjdHVyYWxfY29tcG9uZW50c19yZWZzKSB7CisgICAgICAgICAgICBlc3NlbmNlX2dyb3VwLT5zdHJ1Y3R1cmFsX2NvbXBvbmVudHNfY291bnQgPSAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdmlvX3NraXAocGIsIDQpOyAvKiB1c2VsZXNzIHNpemUgb2Ygb2JqZWN0cywgYWx3YXlzIDE2IGFjY29yZGluZyB0byBzcGVjcyAqLworICAgICAgICBhdmlvX3JlYWQocGIsICh1aW50OF90ICopZXNzZW5jZV9ncm91cC0+c3RydWN0dXJhbF9jb21wb25lbnRzX3JlZnMsIGVzc2VuY2VfZ3JvdXAtPnN0cnVjdHVyYWxfY29tcG9uZW50c19jb3VudCAqIHNpemVvZihVSUQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX3V0ZjE2X3N0cmluZyhBVklPQ29udGV4dCAqcGIsIGludCBzaXplLCBjaGFyKiogc3RyKQoreworICAgIGludCByZXQ7CisgICAgc2l6ZV90IGJ1Zl9zaXplOworCisgICAgaWYgKHNpemUgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgYnVmX3NpemUgPSBzaXplICsgc2l6ZSAvIDIgKyAxOworICAgICpzdHIgPSBhdl9tYWxsb2MoYnVmX3NpemUpOworICAgIGlmICghKnN0cikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmICgocmV0ID0gYXZpb19nZXRfc3RyMTZiZShwYiwgc2l6ZSwgKnN0ciwgYnVmX3NpemUpKSA8IDApIHsKKyAgICAgICAgYXZfZnJlZXAoc3RyKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX3BhY2thZ2Uodm9pZCAqYXJnLCBBVklPQ29udGV4dCAqcGIsIGludCB0YWcsIGludCBzaXplLCBVSUQgdWlkLCBpbnQ2NF90IGtsdl9vZmZzZXQpCit7CisgICAgTVhGUGFja2FnZSAqcGFja2FnZSA9IGFyZzsKKyAgICBzd2l0Y2godGFnKSB7CisgICAgY2FzZSAweDQ0MDM6CisgICAgICAgIHBhY2thZ2UtPnRyYWNrc19jb3VudCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIHBhY2thZ2UtPnRyYWNrc19yZWZzID0gYXZfY2FsbG9jKHBhY2thZ2UtPnRyYWNrc19jb3VudCwgc2l6ZW9mKFVJRCkpOworICAgICAgICBpZiAoIXBhY2thZ2UtPnRyYWNrc19yZWZzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZpb19za2lwKHBiLCA0KTsgLyogdXNlbGVzcyBzaXplIG9mIG9iamVjdHMsIGFsd2F5cyAxNiBhY2NvcmRpbmcgdG8gc3BlY3MgKi8KKyAgICAgICAgYXZpb19yZWFkKHBiLCAodWludDhfdCAqKXBhY2thZ2UtPnRyYWNrc19yZWZzLCBwYWNrYWdlLT50cmFja3NfY291bnQgKiBzaXplb2YoVUlEKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg0NDAxOgorICAgICAgICAvKiBVTUlELCBvbmx5IGdldCBsYXN0IDE2IGJ5dGVzICovCisgICAgICAgIGF2aW9fc2tpcChwYiwgMTYpOworICAgICAgICBhdmlvX3JlYWQocGIsIHBhY2thZ2UtPnBhY2thZ2VfdWlkLCAxNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg0NzAxOgorICAgICAgICBhdmlvX3JlYWQocGIsIHBhY2thZ2UtPmRlc2NyaXB0b3JfcmVmLCAxNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg0NDAyOgorICAgICAgICByZXR1cm4gbXhmX3JlYWRfdXRmMTZfc3RyaW5nKHBiLCBzaXplLCAmcGFja2FnZS0+bmFtZSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX2luZGV4X2VudHJ5X2FycmF5KEFWSU9Db250ZXh0ICpwYiwgTVhGSW5kZXhUYWJsZVNlZ21lbnQgKnNlZ21lbnQpCit7CisgICAgaW50IGksIGxlbmd0aDsKKworICAgIHNlZ21lbnQtPm5iX2luZGV4X2VudHJpZXMgPSBhdmlvX3JiMzIocGIpOworCisgICAgbGVuZ3RoID0gYXZpb19yYjMyKHBiKTsKKworICAgIGlmICghKHNlZ21lbnQtPnRlbXBvcmFsX29mZnNldF9lbnRyaWVzPWF2X2NhbGxvYyhzZWdtZW50LT5uYl9pbmRleF9lbnRyaWVzLCBzaXplb2YoKnNlZ21lbnQtPnRlbXBvcmFsX29mZnNldF9lbnRyaWVzKSkpIHx8CisgICAgICAgICEoc2VnbWVudC0+ZmxhZ19lbnRyaWVzICAgICAgICAgID0gYXZfY2FsbG9jKHNlZ21lbnQtPm5iX2luZGV4X2VudHJpZXMsIHNpemVvZigqc2VnbWVudC0+ZmxhZ19lbnRyaWVzKSkpIHx8CisgICAgICAgICEoc2VnbWVudC0+c3RyZWFtX29mZnNldF9lbnRyaWVzID0gYXZfY2FsbG9jKHNlZ21lbnQtPm5iX2luZGV4X2VudHJpZXMsIHNpemVvZigqc2VnbWVudC0+c3RyZWFtX29mZnNldF9lbnRyaWVzKSkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IHNlZ21lbnQtPm5iX2luZGV4X2VudHJpZXM7IGkrKykgeworICAgICAgICBzZWdtZW50LT50ZW1wb3JhbF9vZmZzZXRfZW50cmllc1tpXSA9IGF2aW9fcjgocGIpOworICAgICAgICBhdmlvX3I4KHBiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogS2V5RnJhbWVPZmZzZXQgKi8KKyAgICAgICAgc2VnbWVudC0+ZmxhZ19lbnRyaWVzW2ldID0gYXZpb19yOChwYik7CisgICAgICAgIHNlZ21lbnQtPnN0cmVhbV9vZmZzZXRfZW50cmllc1tpXSA9IGF2aW9fcmI2NChwYik7CisgICAgICAgIGF2aW9fc2tpcChwYiwgbGVuZ3RoIC0gMTEpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGZfcmVhZF9pbmRleF90YWJsZV9zZWdtZW50KHZvaWQgKmFyZywgQVZJT0NvbnRleHQgKnBiLCBpbnQgdGFnLCBpbnQgc2l6ZSwgVUlEIHVpZCwgaW50NjRfdCBrbHZfb2Zmc2V0KQoreworICAgIE1YRkluZGV4VGFibGVTZWdtZW50ICpzZWdtZW50ID0gYXJnOworICAgIHN3aXRjaCh0YWcpIHsKKyAgICBjYXNlIDB4M0YwNToKKyAgICAgICAgc2VnbWVudC0+ZWRpdF91bml0X2J5dGVfY291bnQgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBhdl9kbG9nKE5VTEwsICJFZGl0VW5pdEJ5dGVDb3VudCAlZFxuIiwgc2VnbWVudC0+ZWRpdF91bml0X2J5dGVfY291bnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4M0YwNjoKKyAgICAgICAgc2VnbWVudC0+aW5kZXhfc2lkID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiSW5kZXhTSUQgJWRcbiIsIHNlZ21lbnQtPmluZGV4X3NpZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzRjA3OgorICAgICAgICBzZWdtZW50LT5ib2R5X3NpZCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGF2X2Rsb2coTlVMTCwgIkJvZHlTSUQgJWRcbiIsIHNlZ21lbnQtPmJvZHlfc2lkKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDNGMEE6CisgICAgICAgIGF2X2Rsb2coTlVMTCwgIkluZGV4RW50cnlBcnJheSBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiBteGZfcmVhZF9pbmRleF9lbnRyeV9hcnJheShwYiwgc2VnbWVudCk7CisgICAgY2FzZSAweDNGMEI6CisgICAgICAgIHNlZ21lbnQtPmluZGV4X2VkaXRfcmF0ZS5udW0gPSBhdmlvX3JiMzIocGIpOworICAgICAgICBzZWdtZW50LT5pbmRleF9lZGl0X3JhdGUuZGVuID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiSW5kZXhFZGl0UmF0ZSAlZC8lZFxuIiwgc2VnbWVudC0+aW5kZXhfZWRpdF9yYXRlLm51bSwKKyAgICAgICAgICAgICAgICBzZWdtZW50LT5pbmRleF9lZGl0X3JhdGUuZGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDNGMEM6CisgICAgICAgIHNlZ21lbnQtPmluZGV4X3N0YXJ0X3Bvc2l0aW9uID0gYXZpb19yYjY0KHBiKTsKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAiSW5kZXhTdGFydFBvc2l0aW9uICUiUFJJZDY0IlxuIiwgc2VnbWVudC0+aW5kZXhfc3RhcnRfcG9zaXRpb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4M0YwRDoKKyAgICAgICAgc2VnbWVudC0+aW5kZXhfZHVyYXRpb24gPSBhdmlvX3JiNjQocGIpOworICAgICAgICBhdl9kbG9nKE5VTEwsICJJbmRleER1cmF0aW9uICUiUFJJZDY0IlxuIiwgc2VnbWVudC0+aW5kZXhfZHVyYXRpb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG14Zl9yZWFkX3BpeGVsX2xheW91dChBVklPQ29udGV4dCAqcGIsIE1YRkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpCit7CisgICAgaW50IGNvZGUsIHZhbHVlLCBvZnMgPSAwOworICAgIGNoYXIgbGF5b3V0WzE2XSA9IHswfTsgLyogbm90IGZvciBwcmludGluZywgbWF5IGVuZCB1cCBub3QgdGVybWluYXRlZCBvbiBwdXJwb3NlICovCisKKyAgICBkbyB7CisgICAgICAgIGNvZGUgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgdmFsdWUgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgYXZfZGxvZyhOVUxMLCAicGl4ZWwgbGF5b3V0OiBjb2RlICUjeFxuIiwgY29kZSk7CisKKyAgICAgICAgaWYgKG9mcyA8PSAxNCkgeworICAgICAgICAgICAgbGF5b3V0W29mcysrXSA9IGNvZGU7CisgICAgICAgICAgICBsYXlvdXRbb2ZzKytdID0gdmFsdWU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYnJlYWs7ICAvKiBkb24ndCByZWFkIGJ5dGUgYnkgYnl0ZSBvbiBzbmVha3kgZmlsZXMgZmlsbGVkIHdpdGggbG90cyBvZiBub24temVyb2VzICovCisgICAgfSB3aGlsZSAoY29kZSAhPSAwKTsgLyogU01QVEUgMzc3TSBFLjIuNDYgKi8KKworICAgIGZmX214Zl9kZWNvZGVfcGl4ZWxfbGF5b3V0KGxheW91dCwgJmRlc2NyaXB0b3ItPnBpeF9mbXQpOworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX2dlbmVyaWNfZGVzY3JpcHRvcih2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCB1aWQsIGludDY0X3Qga2x2X29mZnNldCkKK3sKKyAgICBNWEZEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gYXJnOworICAgIHN3aXRjaCh0YWcpIHsKKyAgICBjYXNlIDB4M0YwMToKKyAgICAgICAgZGVzY3JpcHRvci0+c3ViX2Rlc2NyaXB0b3JzX2NvdW50ID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgZGVzY3JpcHRvci0+c3ViX2Rlc2NyaXB0b3JzX3JlZnMgPSBhdl9jYWxsb2MoZGVzY3JpcHRvci0+c3ViX2Rlc2NyaXB0b3JzX2NvdW50LCBzaXplb2YoVUlEKSk7CisgICAgICAgIGlmICghZGVzY3JpcHRvci0+c3ViX2Rlc2NyaXB0b3JzX3JlZnMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhdmlvX3NraXAocGIsIDQpOyAvKiB1c2VsZXNzIHNpemUgb2Ygb2JqZWN0cywgYWx3YXlzIDE2IGFjY29yZGluZyB0byBzcGVjcyAqLworICAgICAgICBhdmlvX3JlYWQocGIsICh1aW50OF90ICopZGVzY3JpcHRvci0+c3ViX2Rlc2NyaXB0b3JzX3JlZnMsIGRlc2NyaXB0b3ItPnN1Yl9kZXNjcmlwdG9yc19jb3VudCAqIHNpemVvZihVSUQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMwMDI6IC8qIENvbnRhaW5lckR1cmF0aW9uICovCisgICAgICAgIGRlc2NyaXB0b3ItPmR1cmF0aW9uID0gYXZpb19yYjY0KHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMwMDQ6CisgICAgICAgIGF2aW9fcmVhZChwYiwgZGVzY3JpcHRvci0+ZXNzZW5jZV9jb250YWluZXJfdWwsIDE2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMwMDY6CisgICAgICAgIGRlc2NyaXB0b3ItPmxpbmtlZF90cmFja19pZCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzMjAxOiAvKiBQaWN0dXJlRXNzZW5jZUNvZGluZyAqLworICAgICAgICBhdmlvX3JlYWQocGIsIGRlc2NyaXB0b3ItPmVzc2VuY2VfY29kZWNfdWwsIDE2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMyMDM6CisgICAgICAgIGRlc2NyaXB0b3ItPndpZHRoID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMyMDI6CisgICAgICAgIGRlc2NyaXB0b3ItPmhlaWdodCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzMjBDOgorICAgICAgICBkZXNjcmlwdG9yLT5mcmFtZV9sYXlvdXQgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMyMEU6CisgICAgICAgIGRlc2NyaXB0b3ItPmFzcGVjdF9yYXRpby5udW0gPSBhdmlvX3JiMzIocGIpOworICAgICAgICBkZXNjcmlwdG9yLT5hc3BlY3RfcmF0aW8uZGVuID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMyMTI6CisgICAgICAgIGRlc2NyaXB0b3ItPmZpZWxkX2RvbWluYW5jZSA9IGF2aW9fcjgocGIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MzMwMToKKyAgICAgICAgZGVzY3JpcHRvci0+Y29tcG9uZW50X2RlcHRoID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMzMDI6CisgICAgICAgIGRlc2NyaXB0b3ItPmhvcml6X3N1YnNhbXBsaW5nID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMzMDg6CisgICAgICAgIGRlc2NyaXB0b3ItPnZlcnRfc3Vic2FtcGxpbmcgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4M0QwMzoKKyAgICAgICAgZGVzY3JpcHRvci0+c2FtcGxlX3JhdGUubnVtID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgZGVzY3JpcHRvci0+c2FtcGxlX3JhdGUuZGVuID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDNEMDY6IC8qIFNvdW5kRXNzZW5jZUNvbXByZXNzaW9uICovCisgICAgICAgIGF2aW9fcmVhZChwYiwgZGVzY3JpcHRvci0+ZXNzZW5jZV9jb2RlY191bCwgMTYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4M0QwNzoKKyAgICAgICAgZGVzY3JpcHRvci0+Y2hhbm5lbHMgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4M0QwMToKKyAgICAgICAgZGVzY3JpcHRvci0+Yml0c19wZXJfc2FtcGxlID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDM0MDE6CisgICAgICAgIG14Zl9yZWFkX3BpeGVsX2xheW91dChwYiwgZGVzY3JpcHRvcik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFByaXZhdGUgdWlkIHVzZWQgYnkgU09OWSBDMDAyM1MwMS5teGYgKi8KKyAgICAgICAgaWYgKElTX0tMVl9LRVkodWlkLCBteGZfc29ueV9tcGVnNF9leHRyYWRhdGEpKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIkR1cGxpY2F0ZSBzb255X21wZWc0X2V4dHJhZGF0YVxuIik7CisgICAgICAgICAgICBhdl9mcmVlKGRlc2NyaXB0b3ItPmV4dHJhZGF0YSk7CisgICAgICAgICAgICBkZXNjcmlwdG9yLT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICBkZXNjcmlwdG9yLT5leHRyYWRhdGEgPSBhdl9tYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3ItPmV4dHJhZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZGVzY3JpcHRvci0+ZXh0cmFkYXRhX3NpemUgPSBzaXplOworICAgICAgICAgICAgYXZpb19yZWFkKHBiLCBkZXNjcmlwdG9yLT5leHRyYWRhdGEsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIE1hdGNoIGFuIHVpZCBpbmRlcGVuZGVudGx5IG9mIHRoZSB2ZXJzaW9uIGJ5dGUgYW5kIHVwIHRvIGxlbiBjb21tb24gYnl0ZXMKKyAqIFJldHVybnM6IGJvb2xlYW4KKyAqLworc3RhdGljIGludCBteGZfbWF0Y2hfdWlkKGNvbnN0IFVJRCBrZXksIGNvbnN0IFVJRCB1aWQsIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGlmIChpICE9IDcgJiYga2V5W2ldICE9IHVpZFtpXSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IE1YRkNvZGVjVUwgKm14Zl9nZXRfY29kZWNfdWwoY29uc3QgTVhGQ29kZWNVTCAqdWxzLCBVSUQgKnVpZCkKK3sKKyAgICB3aGlsZSAodWxzLT51aWRbMF0pIHsKKyAgICAgICAgaWYobXhmX21hdGNoX3VpZCh1bHMtPnVpZCwgKnVpZCwgdWxzLT5tYXRjaGluZ19sZW4pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHVscysrOworICAgIH0KKyAgICByZXR1cm4gdWxzOworfQorCitzdGF0aWMgdm9pZCAqbXhmX3Jlc29sdmVfc3Ryb25nX3JlZihNWEZDb250ZXh0ICpteGYsIFVJRCAqc3Ryb25nX3JlZiwgZW51bSBNWEZNZXRhZGF0YVNldFR5cGUgdHlwZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmICghc3Ryb25nX3JlZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IG14Zi0+bWV0YWRhdGFfc2V0c19jb3VudDsgaSsrKSB7CisgICAgICAgIGlmICghbWVtY21wKCpzdHJvbmdfcmVmLCBteGYtPm1ldGFkYXRhX3NldHNbaV0tPnVpZCwgMTYpICYmCisgICAgICAgICAgICAodHlwZSA9PSBBbnlUeXBlIHx8IG14Zi0+bWV0YWRhdGFfc2V0c1tpXS0+dHlwZSA9PSB0eXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIG14Zi0+bWV0YWRhdGFfc2V0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IE1YRkNvZGVjVUwgbXhmX3BpY3R1cmVfZXNzZW5jZV9jb250YWluZXJfdWxzW10gPSB7CisgICAgLy8gdmlkZW8gZXNzZW5jZSBjb250YWluZXIgdWxzCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMiwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwNCwweDYwLDB4MDEgfSwgMTQsIEFWX0NPREVDX0lEX01QRUcyVklERU8gfSwgLyogTVBFRy1FUyBGcmFtZSB3cmFwcGVkICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwMiwweDQxLDB4MDEgfSwgMTQsICAgIEFWX0NPREVDX0lEX0RWVklERU8gfSwgLyogRFYgNjI1IDI1bWJwcyAqLworICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDUsMHgwMCwweDAwIH0sIDE0LCAgIEFWX0NPREVDX0lEX1JBV1ZJREVPIH0sIC8qIFVuY29tcHJlc3NlZCBQaWN0dXJlICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMSwweDAxLDB4MDEsMHhmZiwweDRiLDB4NDYsMHg0MSwweDQxLDB4MDAsMHgwZCwweDRkLDB4NGYgfSwgMTQsICAgQVZfQ09ERUNfSURfUkFXVklERU8gfSwgLyogTGVnYWN5ID8/IFVuY29tcHJlc3NlZCBQaWN0dXJlICovCisgICAgeyB7IDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgIDAsICAgICAgQVZfQ09ERUNfSURfTk9ORSB9LAorfTsKKworLyogRUMgVUxzIGZvciBpbnRyYS1vbmx5IGZvcm1hdHMgKi8KK3N0YXRpYyBjb25zdCBNWEZDb2RlY1VMIG14Zl9pbnRyYV9vbmx5X2Vzc2VuY2VfY29udGFpbmVyX3Vsc1tdID0geworICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDEsMHgwMCwweDAwIH0sIDE0LCBBVl9DT0RFQ19JRF9NUEVHMlZJREVPIH0sIC8qIE1YRi1HQyBTTVBURSBELTEwIE1hcHBpbmdzICovCisgICAgeyB7IDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgIDAsICAgICAgIEFWX0NPREVDX0lEX05PTkUgfSwKK307CisKKy8qIGludHJhLW9ubHkgUGljdHVyZUVzc2VuY2VDb2RpbmcgVUxzLCB3aGVyZSBubyBjb3JyZXNwb25kaW5nIEVDIFVMIGV4aXN0cyAqLworc3RhdGljIGNvbnN0IE1YRkNvZGVjVUwgbXhmX2ludHJhX29ubHlfcGljdHVyZV9lc3NlbmNlX2NvZGluZ191bHNbXSA9IHsKKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDMyLDB4MDAsMHgwMCB9LCAxNCwgICAgICAgQVZfQ09ERUNfSURfSDI2NCB9LCAvKiBILjI2NC9NUEVHLTQgQVZDIEludHJhIFByb2ZpbGVzICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwNywweDA0LDB4MDEsMHgwMiwweDAyLDB4MDMsMHgwMSwweDAxLDB4MDAgfSwgMTQsICAgQVZfQ09ERUNfSURfSlBFRzIwMDAgfSwgLyogSlBFRzIwMDAgQ29kZXN0cmVhbSAqLworICAgIHsgeyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwIH0sICAwLCAgICAgICBBVl9DT0RFQ19JRF9OT05FIH0sCit9OworCitzdGF0aWMgY29uc3QgTVhGQ29kZWNVTCBteGZfc291bmRfZXNzZW5jZV9jb250YWluZXJfdWxzW10gPSB7CisgICAgLy8gc291bmQgZXNzZW5jZSBjb250YWluZXIgdWxzCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwNiwweDAxLDB4MDAgfSwgMTQsIEFWX0NPREVDX0lEX1BDTV9TMTZMRSB9LCAvKiBCV0YgRnJhbWUgd3JhcHBlZCAqLworICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDIsMHgwZCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDQsMHg0MCwweDAxIH0sIDE0LCAgICAgICBBVl9DT0RFQ19JRF9NUDIgfSwgLyogTVBFRy1FUyBGcmFtZSB3cmFwcGVkLCAweDQwID8/PyBzdHJlYW0gaWQgKi8KKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwMSB9LCAxNCwgQVZfQ09ERUNfSURfUENNX1MxNkxFIH0sIC8qIEQtMTAgTWFwcGluZyA1ME1icHMgUEFMIEV4dGVuZGVkIFRlbXBsYXRlICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMSwweDAxLDB4MDEsMHhmZiwweDRiLDB4NDYsMHg0MSwweDQxLDB4MDAsMHgwZCwweDRkLDB4NEYgfSwgMTQsIEFWX0NPREVDX0lEX1BDTV9TMTZMRSB9LCAvKiAwMDAxR0wwMC5NWEYuQTEubXhmX29wYXRvbS5teGYgKi8KKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAzLDB4MDQsMHgwMiwweDAyLDB4MDIsMHgwMywweDAzLDB4MDEsMHgwMCB9LCAxNCwgICAgICAgQVZfQ09ERUNfSURfQUFDIH0sIC8qIE1QRUcyIEFBQyBBRFRTIChsZWdhY3kpICovCisgICAgeyB7IDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgIDAsICAgICAgQVZfQ09ERUNfSURfTk9ORSB9LAorfTsKKworc3RhdGljIGNvbnN0IE1YRkNvZGVjVUwgbXhmX2RhdGFfZXNzZW5jZV9jb250YWluZXJfdWxzW10gPSB7CisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwOSwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwZSwweDAwLDB4MDAgfSwgMTYsIDAgfSwKKyAgICB7IHsgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCB9LCAgMCwgQVZfQ09ERUNfSURfTk9ORSB9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IG14Zl9kYXRhX2Vzc2VuY2VfZGVzY3JpcHRvcltdID0geworICAgICJ2YmlfdmFuY19zbXB0ZV80MzZNIiwKK307CisKK3N0YXRpYyBpbnQgbXhmX2dldF9zb3J0ZWRfdGFibGVfc2VnbWVudHMoTVhGQ29udGV4dCAqbXhmLCBpbnQgKm5iX3NvcnRlZF9zZWdtZW50cywgTVhGSW5kZXhUYWJsZVNlZ21lbnQgKioqc29ydGVkX3NlZ21lbnRzKQoreworICAgIGludCBpLCBqLCBuYl9zZWdtZW50cyA9IDA7CisgICAgTVhGSW5kZXhUYWJsZVNlZ21lbnQgKip1bnNvcnRlZF9zZWdtZW50czsKKyAgICBpbnQgbGFzdF9ib2R5X3NpZCA9IC0xLCBsYXN0X2luZGV4X3NpZCA9IC0xLCBsYXN0X2luZGV4X3N0YXJ0ID0gLTE7CisKKyAgICAvKiBjb3VudCBudW1iZXIgb2Ygc2VnbWVudHMsIGFsbG9jYXRlIGFycmF5cyBhbmQgY29weSB1bnNvcnRlZCBzZWdtZW50cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBteGYtPm1ldGFkYXRhX3NldHNfY291bnQ7IGkrKykKKyAgICAgICAgaWYgKG14Zi0+bWV0YWRhdGFfc2V0c1tpXS0+dHlwZSA9PSBJbmRleFRhYmxlU2VnbWVudCkKKyAgICAgICAgICAgIG5iX3NlZ21lbnRzKys7CisKKyAgICBpZiAoIW5iX3NlZ21lbnRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICghKHVuc29ydGVkX3NlZ21lbnRzID0gYXZfY2FsbG9jKG5iX3NlZ21lbnRzLCBzaXplb2YoKnVuc29ydGVkX3NlZ21lbnRzKSkpIHx8CisgICAgICAgICEoKnNvcnRlZF9zZWdtZW50cyAgPSBhdl9jYWxsb2MobmJfc2VnbWVudHMsIHNpemVvZigqKnNvcnRlZF9zZWdtZW50cykpKSkgeworICAgICAgICBhdl9mcmVlcChzb3J0ZWRfc2VnbWVudHMpOworICAgICAgICBhdl9mcmVlKHVuc29ydGVkX3NlZ21lbnRzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBqID0gMDsgaSA8IG14Zi0+bWV0YWRhdGFfc2V0c19jb3VudDsgaSsrKQorICAgICAgICBpZiAobXhmLT5tZXRhZGF0YV9zZXRzW2ldLT50eXBlID09IEluZGV4VGFibGVTZWdtZW50KQorICAgICAgICAgICAgdW5zb3J0ZWRfc2VnbWVudHNbaisrXSA9IChNWEZJbmRleFRhYmxlU2VnbWVudCopbXhmLT5tZXRhZGF0YV9zZXRzW2ldOworCisgICAgKm5iX3NvcnRlZF9zZWdtZW50cyA9IDA7CisKKyAgICAvKiBzb3J0IHNlZ21lbnRzIGJ5IHtCb2R5U0lELCBJbmRleFNJRCwgSW5kZXhTdGFydFBvc2l0aW9ufSwgcmVtb3ZlIGR1cGxpY2F0ZXMgd2hpbGUgd2UncmUgYXQgaXQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2VnbWVudHM7IGkrKykgeworICAgICAgICBpbnQgYmVzdCA9IC0xLCBiZXN0X2JvZHlfc2lkID0gLTEsIGJlc3RfaW5kZXhfc2lkID0gLTEsIGJlc3RfaW5kZXhfc3RhcnQgPSAtMTsKKyAgICAgICAgdWludDY0X3QgYmVzdF9pbmRleF9kdXJhdGlvbiA9IDA7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG5iX3NlZ21lbnRzOyBqKyspIHsKKyAgICAgICAgICAgIE1YRkluZGV4VGFibGVTZWdtZW50ICpzID0gdW5zb3J0ZWRfc2VnbWVudHNbal07CisKKyAgICAgICAgICAgIC8qIFJlcXVpcmUgbGFyZ2VyIEJvc3lTSUQsIEluZGV4U0lEIG9yIEluZGV4U3RhcnRQb3NpdGlvbiB0aGVuIHRoZSBwcmV2aW91cyBlbnRyeS4gVGhpcyByZW1vdmVzIGR1cGxpY2F0ZXMuCisgICAgICAgICAgICAgKiBXZSB3YW50IHRoZSBzbWFsbGVzdCB2YWx1ZXMgZm9yIHRoZSBrZXlzIHRoYW4gd2hhdCB3ZSBjdXJyZW50bHkgaGF2ZSwgdW5sZXNzIHRoaXMgaXMgdGhlIGZpcnN0IHN1Y2ggZW50cnkgdGhpcyB0aW1lIGFyb3VuZC4KKyAgICAgICAgICAgICAqIElmIHdlIGNvbWUgYWNyb3NzIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUgSW5kZXhTdGFydFBvc2l0aW9uIGJ1dCBsYXJnZXIgSW5kZXhEdXJhdGlvbiwgdGhlbiB3ZSdsbCBwcmVmZXIgaXQgb3ZlciB0aGUgb25lIHdlIGN1cnJlbnRseSBoYXZlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKGkgPT0gMCAgICAgfHwgcy0+Ym9keV9zaWQgPiBsYXN0X2JvZHlfc2lkIHx8IHMtPmluZGV4X3NpZCA+IGxhc3RfaW5kZXhfc2lkIHx8IHMtPmluZGV4X3N0YXJ0X3Bvc2l0aW9uID4gbGFzdF9pbmRleF9zdGFydCkgJiYKKyAgICAgICAgICAgICAgICAoYmVzdCA9PSAtMSB8fCBzLT5ib2R5X3NpZCA8IGJlc3RfYm9keV9zaWQgfHwgcy0+aW5kZXhfc2lkIDwgYmVzdF9pbmRleF9zaWQgfHwgcy0+aW5kZXhfc3RhcnRfcG9zaXRpb24gPCBiZXN0X2luZGV4X3N0YXJ0IHx8CisgICAgICAgICAgICAgICAgKHMtPmluZGV4X3N0YXJ0X3Bvc2l0aW9uID09IGJlc3RfaW5kZXhfc3RhcnQgJiYgcy0+aW5kZXhfZHVyYXRpb24gPiBiZXN0X2luZGV4X2R1cmF0aW9uKSkpIHsKKyAgICAgICAgICAgICAgICBiZXN0ICAgICAgICAgICAgID0gajsKKyAgICAgICAgICAgICAgICBiZXN0X2JvZHlfc2lkICAgID0gcy0+Ym9keV9zaWQ7CisgICAgICAgICAgICAgICAgYmVzdF9pbmRleF9zaWQgICA9IHMtPmluZGV4X3NpZDsKKyAgICAgICAgICAgICAgICBiZXN0X2luZGV4X3N0YXJ0ID0gcy0+aW5kZXhfc3RhcnRfcG9zaXRpb247CisgICAgICAgICAgICAgICAgYmVzdF9pbmRleF9kdXJhdGlvbiA9IHMtPmluZGV4X2R1cmF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogbm8gc3VpdGFibGUgZW50cnkgZm91bmQgLT4gd2UncmUgZG9uZSAqLworICAgICAgICBpZiAoYmVzdCA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICgqc29ydGVkX3NlZ21lbnRzKVsoKm5iX3NvcnRlZF9zZWdtZW50cykrK10gPSB1bnNvcnRlZF9zZWdtZW50c1tiZXN0XTsKKyAgICAgICAgbGFzdF9ib2R5X3NpZCAgICA9IGJlc3RfYm9keV9zaWQ7CisgICAgICAgIGxhc3RfaW5kZXhfc2lkICAgPSBiZXN0X2luZGV4X3NpZDsKKyAgICAgICAgbGFzdF9pbmRleF9zdGFydCA9IGJlc3RfaW5kZXhfc3RhcnQ7CisgICAgfQorCisgICAgYXZfZnJlZSh1bnNvcnRlZF9zZWdtZW50cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDb21wdXRlcyB0aGUgYWJzb2x1dGUgZmlsZSBvZmZzZXQgb2YgdGhlIGdpdmVuIGVzc2VuY2UgY29udGFpbmVyIG9mZnNldAorICovCitzdGF0aWMgaW50IG14Zl9hYnNvbHV0ZV9ib2R5c2lkX29mZnNldChNWEZDb250ZXh0ICpteGYsIGludCBib2R5X3NpZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgKm9mZnNldF9vdXQpCit7CisgICAgaW50IHg7CisgICAgaW50NjRfdCBvZmZzZXRfaW4gPSBvZmZzZXQ7ICAgICAvKiBmb3IgbG9nZ2luZyAqLworCisgICAgZm9yICh4ID0gMDsgeCA8IG14Zi0+cGFydGl0aW9uc19jb3VudDsgeCsrKSB7CisgICAgICAgIE1YRlBhcnRpdGlvbiAqcCA9ICZteGYtPnBhcnRpdGlvbnNbeF07CisKKyAgICAgICAgaWYgKHAtPmJvZHlfc2lkICE9IGJvZHlfc2lkKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKG9mZnNldCA8IHAtPmVzc2VuY2VfbGVuZ3RoIHx8ICFwLT5lc3NlbmNlX2xlbmd0aCkgeworICAgICAgICAgICAgKm9mZnNldF9vdXQgPSBwLT5lc3NlbmNlX29mZnNldCArIG9mZnNldDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0IC09IHAtPmVzc2VuY2VfbGVuZ3RoOworICAgIH0KKworICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICJmYWlsZWQgdG8gZmluZCBhYnNvbHV0ZSBvZmZzZXQgb2YgJSJQUklYNjQiIGluIEJvZHlTSUQgJWkgLSBwYXJ0aWFsIGZpbGU/XG4iLAorICAgICAgICAgICBvZmZzZXRfaW4sIGJvZHlfc2lkKTsKKworICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgZXNzZW5jZSBjb250YWluZXIgd2l0aCBnaXZlbiBCb2R5U0lELCBvciB6ZXJvIGlmIHVua25vd24KKyAqLworc3RhdGljIGludDY0X3QgbXhmX2Vzc2VuY2VfY29udGFpbmVyX2VuZChNWEZDb250ZXh0ICpteGYsIGludCBib2R5X3NpZCkKK3sKKyAgICBpbnQgeDsKKyAgICBpbnQ2NF90IHJldCA9IDA7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgbXhmLT5wYXJ0aXRpb25zX2NvdW50OyB4KyspIHsKKyAgICAgICAgTVhGUGFydGl0aW9uICpwID0gJm14Zi0+cGFydGl0aW9uc1t4XTsKKworICAgICAgICBpZiAocC0+Ym9keV9zaWQgIT0gYm9keV9zaWQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoIXAtPmVzc2VuY2VfbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgcmV0ID0gcC0+ZXNzZW5jZV9vZmZzZXQgKyBwLT5lc3NlbmNlX2xlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBFZGl0VW5pdCAtPiBhYnNvbHV0ZSBvZmZzZXQgKi8KK3N0YXRpYyBpbnQgbXhmX2VkaXRfdW5pdF9hYnNvbHV0ZV9vZmZzZXQoTVhGQ29udGV4dCAqbXhmLCBNWEZJbmRleFRhYmxlICppbmRleF90YWJsZSwgaW50NjRfdCBlZGl0X3VuaXQsIGludDY0X3QgKmVkaXRfdW5pdF9vdXQsIGludDY0X3QgKm9mZnNldF9vdXQsIGludCBuYWcpCit7CisgICAgaW50IGk7CisgICAgaW50NjRfdCBvZmZzZXRfdGVtcCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZXhfdGFibGUtPm5iX3NlZ21lbnRzOyBpKyspIHsKKyAgICAgICAgTVhGSW5kZXhUYWJsZVNlZ21lbnQgKnMgPSBpbmRleF90YWJsZS0+c2VnbWVudHNbaV07CisKKyAgICAgICAgZWRpdF91bml0ID0gRkZNQVgoZWRpdF91bml0LCBzLT5pbmRleF9zdGFydF9wb3NpdGlvbik7ICAvKiBjbGFtcCBpZiB0cnlpbmcgdG8gc2VlayBiZWZvcmUgc3RhcnQgKi8KKworICAgICAgICBpZiAoZWRpdF91bml0IDwgcy0+aW5kZXhfc3RhcnRfcG9zaXRpb24gKyBzLT5pbmRleF9kdXJhdGlvbikgeworICAgICAgICAgICAgaW50NjRfdCBpbmRleCA9IGVkaXRfdW5pdCAtIHMtPmluZGV4X3N0YXJ0X3Bvc2l0aW9uOworCisgICAgICAgICAgICBpZiAocy0+ZWRpdF91bml0X2J5dGVfY291bnQpCisgICAgICAgICAgICAgICAgb2Zmc2V0X3RlbXAgKz0gcy0+ZWRpdF91bml0X2J5dGVfY291bnQgKiBpbmRleDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHMtPm5iX2luZGV4X2VudHJpZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+bmJfaW5kZXhfZW50cmllcyA9PSAyICogcy0+aW5kZXhfZHVyYXRpb24gKyAxKQorICAgICAgICAgICAgICAgICAgICBpbmRleCAqPSAyOyAgICAgLyogQXZpZCBpbmRleCAqLworCisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzLT5uYl9pbmRleF9lbnRyaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsICJJbmRleFNJRCAlaSBzZWdtZW50IGF0ICUiUFJJZDY0IiBJbmRleEVudHJ5QXJyYXkgdG9vIHNtYWxsXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhfdGFibGUtPmluZGV4X3NpZCwgcy0+aW5kZXhfc3RhcnRfcG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvZmZzZXRfdGVtcCA9IHMtPnN0cmVhbV9vZmZzZXRfZW50cmllc1tpbmRleF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsICJJbmRleFNJRCAlaSBzZWdtZW50IGF0ICUiUFJJZDY0IiBtaXNzaW5nIEVkaXRVbml0Qnl0ZUNvdW50IGFuZCBJbmRleEVudHJ5QXJyYXlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X3RhYmxlLT5pbmRleF9zaWQsIHMtPmluZGV4X3N0YXJ0X3Bvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVkaXRfdW5pdF9vdXQpCisgICAgICAgICAgICAgICAgKmVkaXRfdW5pdF9vdXQgPSBlZGl0X3VuaXQ7CisKKyAgICAgICAgICAgIHJldHVybiBteGZfYWJzb2x1dGVfYm9keXNpZF9vZmZzZXQobXhmLCBpbmRleF90YWJsZS0+Ym9keV9zaWQsIG9mZnNldF90ZW1wLCBvZmZzZXRfb3V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEVkaXRVbml0Qnl0ZUNvdW50ID09IDAgZm9yIFZCUiBpbmRleGVzLCB3aGljaCBpcyBmaW5lIHNpbmNlIHRoZXkgdXNlIGV4cGxpY2l0IFN0cmVhbU9mZnNldHMgKi8KKyAgICAgICAgICAgIG9mZnNldF90ZW1wICs9IHMtPmVkaXRfdW5pdF9ieXRlX2NvdW50ICogcy0+aW5kZXhfZHVyYXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmFnKQorICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLCAiZmFpbGVkIHRvIG1hcCBFZGl0VW5pdCAlIlBSSWQ2NCIgaW4gSW5kZXhTSUQgJWkgdG8gYW4gb2Zmc2V0XG4iLCBlZGl0X3VuaXQsIGluZGV4X3RhYmxlLT5pbmRleF9zaWQpOworCisgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKK3N0YXRpYyBpbnQgbXhmX2NvbXB1dGVfcHRzZXNfZmFrZV9pbmRleChNWEZDb250ZXh0ICpteGYsIE1YRkluZGV4VGFibGUgKmluZGV4X3RhYmxlKQoreworICAgIGludCBpLCBqLCB4OworICAgIGludDhfdCBtYXhfdGVtcG9yYWxfb2Zmc2V0ID0gLTEyODsKKworICAgIC8qIGZpcnN0IGNvbXB1dGUgaG93IG1hbnkgZW50cmllcyB3ZSBoYXZlICovCisgICAgZm9yIChpID0gMDsgaSA8IGluZGV4X3RhYmxlLT5uYl9zZWdtZW50czsgaSsrKSB7CisgICAgICAgIE1YRkluZGV4VGFibGVTZWdtZW50ICpzID0gaW5kZXhfdGFibGUtPnNlZ21lbnRzW2ldOworCisgICAgICAgIGlmICghcy0+bmJfaW5kZXhfZW50cmllcykgeworICAgICAgICAgICAgaW5kZXhfdGFibGUtPm5iX3B0c2VzID0gMDsKKyAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBUZW1wb3JhbE9mZnNldHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIGluZGV4X3RhYmxlLT5uYl9wdHNlcyArPSBzLT5pbmRleF9kdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKiBwYXJhbm9pZCBjaGVjayAqLworICAgIGlmIChpbmRleF90YWJsZS0+bmJfcHRzZXMgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIShpbmRleF90YWJsZS0+cHRzZXMgICAgICA9IGF2X2NhbGxvYyhpbmRleF90YWJsZS0+bmJfcHRzZXMsIHNpemVvZihpbnQ2NF90KSkpIHx8CisgICAgICAgICEoaW5kZXhfdGFibGUtPmZha2VfaW5kZXggPSBhdl9jYWxsb2MoaW5kZXhfdGFibGUtPm5iX3B0c2VzLCBzaXplb2YoQVZJbmRleEVudHJ5KSkpKSB7CisgICAgICAgIGF2X2ZyZWVwKCZpbmRleF90YWJsZS0+cHRzZXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIC8qIHdlIG1heSBoYXZlIGEgZmV3IGJhZCBUZW1wb3JhbE9mZnNldHMKKyAgICAgKiBtYWtlIHN1cmUgdGhlIGNvcnJlc3BvbmRpbmcgUFRTZXMgZG9uJ3QgaGF2ZSB0aGUgYm9ndXMgdmFsdWUgMCAqLworICAgIGZvciAoeCA9IDA7IHggPCBpbmRleF90YWJsZS0+bmJfcHRzZXM7IHgrKykKKyAgICAgICAgaW5kZXhfdGFibGUtPnB0c2VzW3hdID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICAvKioKKyAgICAgKiBXZSBoYXZlIHRoaXM6CisgICAgICoKKyAgICAgKiB4ICBUZW1wb3JhbE9mZnNldAorICAgICAqIDA6ICAwCisgICAgICogMTogIDEKKyAgICAgKiAyOiAgMQorICAgICAqIDM6IC0yCisgICAgICogNDogIDEKKyAgICAgKiA1OiAgMQorICAgICAqIDY6IC0yCisgICAgICoKKyAgICAgKiBXZSB3YW50IHRvIHRyYW5zZm9ybSBpdCBpbnRvIHRoaXM6CisgICAgICoKKyAgICAgKiB4ICBEVFMgUFRTCisgICAgICogMDogLTEgICAwCisgICAgICogMTogIDAgICAzCisgICAgICogMjogIDEgICAxCisgICAgICogMzogIDIgICAyCisgICAgICogNDogIDMgICA2CisgICAgICogNTogIDQgICA0CisgICAgICogNjogIDUgICA1CisgICAgICoKKyAgICAgKiBXZSBkbyB0aGlzIGJ5IGJ1Y2tldCBzb3J0aW5nIHggYnkgeCtUZW1wb3JhbE9mZnNldFt4XSBpbnRvIG14Zi0+cHRzZXMsCisgICAgICogdGhlbiBzZXR0aW5ncyBteGYtPmZpcnN0X2R0cyA9IC1tYXgoVGVtcG9yYWxPZmZzZXRbeF0pLgorICAgICAqIFRoZSBsYXR0ZXIgbWFrZXMgRFRTIDw9IFBUUy4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSB4ID0gMDsgaSA8IGluZGV4X3RhYmxlLT5uYl9zZWdtZW50czsgaSsrKSB7CisgICAgICAgIE1YRkluZGV4VGFibGVTZWdtZW50ICpzID0gaW5kZXhfdGFibGUtPnNlZ21lbnRzW2ldOworICAgICAgICBpbnQgaW5kZXhfZGVsdGEgPSAxOworICAgICAgICBpbnQgbiA9IHMtPm5iX2luZGV4X2VudHJpZXM7CisKKyAgICAgICAgaWYgKHMtPm5iX2luZGV4X2VudHJpZXMgPT0gMiAqIHMtPmluZGV4X2R1cmF0aW9uICsgMSkgeworICAgICAgICAgICAgaW5kZXhfZGVsdGEgPSAyOyAgICAvKiBBdmlkIGluZGV4ICovCisgICAgICAgICAgICAvKiBpZ25vcmUgdGhlIGxhc3QgZW50cnkgLSBpdCdzIHRoZSBzaXplIG9mIHRoZSBlc3NlbmNlIGNvbnRhaW5lciAqLworICAgICAgICAgICAgbi0tOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGogKz0gaW5kZXhfZGVsdGEsIHgrKykgeworICAgICAgICAgICAgaW50IG9mZnNldCA9IHMtPnRlbXBvcmFsX29mZnNldF9lbnRyaWVzW2pdIC8gaW5kZXhfZGVsdGE7CisgICAgICAgICAgICBpbnQgaW5kZXggID0geCArIG9mZnNldDsKKworICAgICAgICAgICAgaWYgKHggPj0gaW5kZXhfdGFibGUtPm5iX3B0c2VzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgInggPj0gbmJfcHRzZXMgLSBJbmRleEVudHJ5Q291bnQgJWkgPCBJbmRleER1cmF0aW9uICUiUFJJZDY0Ij9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPm5iX2luZGV4X2VudHJpZXMsIHMtPmluZGV4X2R1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5kZXhfdGFibGUtPmZha2VfaW5kZXhbeF0udGltZXN0YW1wID0geDsKKyAgICAgICAgICAgIGluZGV4X3RhYmxlLT5mYWtlX2luZGV4W3hdLmZsYWdzID0gIShzLT5mbGFnX2VudHJpZXNbal0gJiAweDMwKSA/IEFWSU5ERVhfS0VZRlJBTUUgOiAwOworCisgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGluZGV4X3RhYmxlLT5uYl9wdHNlcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJpbmRleCBlbnRyeSAlaSArIFRlbXBvcmFsT2Zmc2V0ICVpID0gJWksIHdoaWNoIGlzIG91dCBvZiBib3VuZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHgsIG9mZnNldCwgaW5kZXgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmRleF90YWJsZS0+cHRzZXNbaW5kZXhdID0geDsKKyAgICAgICAgICAgIG1heF90ZW1wb3JhbF9vZmZzZXQgPSBGRk1BWChtYXhfdGVtcG9yYWxfb2Zmc2V0LCBvZmZzZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgaW5kZXhfdGFibGUtPmZpcnN0X2R0cyA9IC1tYXhfdGVtcG9yYWxfb2Zmc2V0OworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogU29ydHMgYW5kIGNvbGxlY3RzIGluZGV4IHRhYmxlIHNlZ21lbnRzIGludG8gaW5kZXggdGFibGVzLgorICogQWxzbyBjb21wdXRlcyBQVFNlcyBpZiBwb3NzaWJsZS4KKyAqLworc3RhdGljIGludCBteGZfY29tcHV0ZV9pbmRleF90YWJsZXMoTVhGQ29udGV4dCAqbXhmKQoreworICAgIGludCBpLCBqLCBrLCByZXQsIG5iX3NvcnRlZF9zZWdtZW50czsKKyAgICBNWEZJbmRleFRhYmxlU2VnbWVudCAqKnNvcnRlZF9zZWdtZW50cyA9IE5VTEw7CisKKyAgICBpZiAoKHJldCA9IG14Zl9nZXRfc29ydGVkX3RhYmxlX3NlZ21lbnRzKG14ZiwgJm5iX3NvcnRlZF9zZWdtZW50cywgJnNvcnRlZF9zZWdtZW50cykpIHx8CisgICAgICAgIG5iX3NvcnRlZF9zZWdtZW50cyA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfV0FSTklORywgImJyb2tlbiBvciBlbXB0eSBpbmRleFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIHNhbml0eSBjaGVjayBhbmQgY291bnQgdW5pcXVlIEJvZHlTSURzL0luZGV4U0lEcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zb3J0ZWRfc2VnbWVudHM7IGkrKykgeworICAgICAgICBpZiAoaSA9PSAwIHx8IHNvcnRlZF9zZWdtZW50c1tpLTFdLT5pbmRleF9zaWQgIT0gc29ydGVkX3NlZ21lbnRzW2ldLT5pbmRleF9zaWQpCisgICAgICAgICAgICBteGYtPm5iX2luZGV4X3RhYmxlcysrOworICAgICAgICBlbHNlIGlmIChzb3J0ZWRfc2VnbWVudHNbaS0xXS0+Ym9keV9zaWQgIT0gc29ydGVkX3NlZ21lbnRzW2ldLT5ib2R5X3NpZCkgeworICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwgImZvdW5kIGluY29uc2lzdGVudCBCb2R5U0lEXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGZpbmlzaF9kZWNvZGluZ19pbmRleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG14Zi0+aW5kZXhfdGFibGVzID0gYXZfbWFsbG9jel9hcnJheShteGYtPm5iX2luZGV4X3RhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpteGYtPmluZGV4X3RhYmxlcykpOworICAgIGlmICghbXhmLT5pbmRleF90YWJsZXMpIHsKKyAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwgImZhaWxlZCB0byBhbGxvY2F0ZSBpbmRleCB0YWJsZXNcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmluaXNoX2RlY29kaW5nX2luZGV4OworICAgIH0KKworICAgIC8qIGRpc3RyaWJ1dGUgc29ydGVkIHNlZ21lbnRzIHRvIGluZGV4IHRhYmxlcyAqLworICAgIGZvciAoaSA9IGogPSAwOyBpIDwgbmJfc29ydGVkX3NlZ21lbnRzOyBpKyspIHsKKyAgICAgICAgaWYgKGkgIT0gMCAmJiBzb3J0ZWRfc2VnbWVudHNbaS0xXS0+aW5kZXhfc2lkICE9IHNvcnRlZF9zZWdtZW50c1tpXS0+aW5kZXhfc2lkKSB7CisgICAgICAgICAgICAvKiBuZXh0IEluZGV4U0lEICovCisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKworICAgICAgICBteGYtPmluZGV4X3RhYmxlc1tqXS5uYl9zZWdtZW50cysrOworICAgIH0KKworICAgIGZvciAoaSA9IGogPSAwOyBqIDwgbXhmLT5uYl9pbmRleF90YWJsZXM7IGkgKz0gbXhmLT5pbmRleF90YWJsZXNbaisrXS5uYl9zZWdtZW50cykgeworICAgICAgICBNWEZJbmRleFRhYmxlICp0ID0gJm14Zi0+aW5kZXhfdGFibGVzW2pdOworCisgICAgICAgIHQtPnNlZ21lbnRzID0gYXZfbWFsbG9jel9hcnJheSh0LT5uYl9zZWdtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqdC0+c2VnbWVudHMpKTsKKworICAgICAgICBpZiAoIXQtPnNlZ21lbnRzKSB7CisgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLCAiZmFpbGVkIHRvIGFsbG9jYXRlIEluZGV4VGFibGVTZWdtZW50IgorICAgICAgICAgICAgICAgICAgICIgcG9pbnRlciBhcnJheVxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZpbmlzaF9kZWNvZGluZ19pbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzb3J0ZWRfc2VnbWVudHNbaV0tPmluZGV4X3N0YXJ0X3Bvc2l0aW9uKQorICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiSW5kZXhTSUQgJWkgc3RhcnRzIGF0IEVkaXRVbml0ICUiUFJJZDY0IiAtIHNlZWtpbmcgbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkXG4iLAorICAgICAgICAgICAgICAgICAgIHNvcnRlZF9zZWdtZW50c1tpXS0+aW5kZXhfc2lkLCBzb3J0ZWRfc2VnbWVudHNbaV0tPmluZGV4X3N0YXJ0X3Bvc2l0aW9uKTsKKworICAgICAgICBtZW1jcHkodC0+c2VnbWVudHMsICZzb3J0ZWRfc2VnbWVudHNbaV0sIHQtPm5iX3NlZ21lbnRzICogc2l6ZW9mKE1YRkluZGV4VGFibGVTZWdtZW50KikpOworICAgICAgICB0LT5pbmRleF9zaWQgPSBzb3J0ZWRfc2VnbWVudHNbaV0tPmluZGV4X3NpZDsKKyAgICAgICAgdC0+Ym9keV9zaWQgPSBzb3J0ZWRfc2VnbWVudHNbaV0tPmJvZHlfc2lkOworCisgICAgICAgIGlmICgocmV0ID0gbXhmX2NvbXB1dGVfcHRzZXNfZmFrZV9pbmRleChteGYsIHQpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmlzaF9kZWNvZGluZ19pbmRleDsKKworICAgICAgICAvKiBmaXggemVybyBJbmRleER1cmF0aW9ucyAqLworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdC0+bmJfc2VnbWVudHM7IGsrKykgeworICAgICAgICAgICAgaWYgKHQtPnNlZ21lbnRzW2tdLT5pbmRleF9kdXJhdGlvbikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKHQtPm5iX3NlZ21lbnRzID4gMSkKKyAgICAgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX1dBUk5JTkcsICJJbmRleFNJRCAlaSBzZWdtZW50ICVpIGhhcyB6ZXJvIEluZGV4RHVyYXRpb24gYW5kIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBzZWdtZW50XG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0LT5pbmRleF9zaWQsIGspOworCisgICAgICAgICAgICBpZiAobXhmLT5mYy0+bmJfc3RyZWFtcyA8PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19XQVJOSU5HLCAibm8gc3RyZWFtcz9cbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBhc3N1bWUgdGhlIGZpcnN0IHN0cmVhbSdzIGR1cmF0aW9uIGlzIHJlYXNvbmFibGUKKyAgICAgICAgICAgICAqIGxlYXZlIGluZGV4X2R1cmF0aW9uID0gMCBvbiBmdXJ0aGVyIHNlZ21lbnRzIGluIGNhc2Ugd2UgaGF2ZSBhbnkgKHVubGlrZWx5KQorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0LT5zZWdtZW50c1trXS0+aW5kZXhfZHVyYXRpb24gPSBteGYtPmZjLT5zdHJlYW1zWzBdLT5kdXJhdGlvbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gMDsKK2ZpbmlzaF9kZWNvZGluZ19pbmRleDoKKyAgICBhdl9mcmVlKHNvcnRlZF9zZWdtZW50cyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGZfaXNfaW50cmFfb25seShNWEZEZXNjcmlwdG9yICpkZXNjcmlwdG9yKQoreworICAgIHJldHVybiBteGZfZ2V0X2NvZGVjX3VsKG14Zl9pbnRyYV9vbmx5X2Vzc2VuY2VfY29udGFpbmVyX3VscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvci0+ZXNzZW5jZV9jb250YWluZXJfdWwpLT5pZCAhPSBBVl9DT0RFQ19JRF9OT05FIHx8CisgICAgICAgICAgIG14Zl9nZXRfY29kZWNfdWwobXhmX2ludHJhX29ubHlfcGljdHVyZV9lc3NlbmNlX2NvZGluZ191bHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3ItPmVzc2VuY2VfY29kZWNfdWwpLT5pZCAgICAgIT0gQVZfQ09ERUNfSURfTk9ORTsKK30KKworc3RhdGljIGludCBteGZfdWlkX3RvX3N0cihVSUQgdWlkLCBjaGFyICoqc3RyKQoreworICAgIGludCBpOworICAgIGNoYXIgKnA7CisgICAgcCA9ICpzdHIgPSBhdl9tYWxsb2N6KHNpemVvZihVSUQpICogMiArIDQgKyAxKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihVSUQpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYocCwgMiArIDEsICIlLjJ4IiwgdWlkW2ldKTsKKyAgICAgICAgcCArPSAyOworICAgICAgICBpZiAoaSA9PSAzIHx8IGkgPT0gNSB8fCBpID09IDcgfHwgaSA9PSA5KSB7CisgICAgICAgICAgICBzbnByaW50ZihwLCAxICsgMSwgIi0iKTsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGZfYWRkX3VpZF9tZXRhZGF0YShBVkRpY3Rpb25hcnkgKipwbSwgY29uc3QgY2hhciAqa2V5LCBVSUQgdWlkKQoreworICAgIGNoYXIgKnN0cjsKKyAgICBpbnQgcmV0OworICAgIGlmICgocmV0ID0gbXhmX3VpZF90b19zdHIodWlkLCAmc3RyKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGF2X2RpY3Rfc2V0KHBtLCBrZXksIHN0ciwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9hZGRfdGltZWNvZGVfbWV0YWRhdGEoQVZEaWN0aW9uYXJ5ICoqcG0sIGNvbnN0IGNoYXIgKmtleSwgQVZUaW1lY29kZSAqdGMpCit7CisgICAgY2hhciBidWZbQVZfVElNRUNPREVfU1RSX1NJWkVdOworICAgIGF2X2RpY3Rfc2V0KHBtLCBrZXksIGF2X3RpbWVjb2RlX21ha2Vfc3RyaW5nKHRjLCBidWYsIDApLCAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgTVhGVGltZWNvZGVDb21wb25lbnQqIG14Zl9yZXNvbHZlX3RpbWVjb2RlX2NvbXBvbmVudChNWEZDb250ZXh0ICpteGYsIFVJRCAqc3Ryb25nX3JlZikKK3sKKyAgICBNWEZTdHJ1Y3R1cmFsQ29tcG9uZW50ICpjb21wb25lbnQgPSBOVUxMOworICAgIE1YRlB1bGxkb3duQ29tcG9uZW50ICpwdWxsZG93biA9IE5VTEw7CisKKyAgICBjb21wb25lbnQgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14Ziwgc3Ryb25nX3JlZiwgQW55VHlwZSk7CisgICAgaWYgKCFjb21wb25lbnQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc3dpdGNoIChjb21wb25lbnQtPnR5cGUpIHsKKyAgICBjYXNlIFRpbWVjb2RlQ29tcG9uZW50OgorICAgICAgICByZXR1cm4gKE1YRlRpbWVjb2RlQ29tcG9uZW50Kiljb21wb25lbnQ7CisgICAgY2FzZSBQdWxsZG93bkNvbXBvbmVudDogLyogdGltY29kZSBjb21wb25lbnQgbWF5IGJlIGxvY2F0ZWQgb24gYSBwdWxsZG93biBjb21wb25lbnQgKi8KKyAgICAgICAgcHVsbGRvd24gPSAoTVhGUHVsbGRvd25Db21wb25lbnQqKWNvbXBvbmVudDsKKyAgICAgICAgcmV0dXJuIG14Zl9yZXNvbHZlX3N0cm9uZ19yZWYobXhmLCAmcHVsbGRvd24tPmlucHV0X3NlZ21lbnRfcmVmLCBUaW1lY29kZUNvbXBvbmVudCk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgTVhGUGFja2FnZSogbXhmX3Jlc29sdmVfc291cmNlX3BhY2thZ2UoTVhGQ29udGV4dCAqbXhmLCBVSUQgcGFja2FnZV91aWQpCit7CisgICAgTVhGUGFja2FnZSAqcGFja2FnZSA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXhmLT5wYWNrYWdlc19jb3VudDsgaSsrKSB7CisgICAgICAgIHBhY2thZ2UgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14ZiwgJm14Zi0+cGFja2FnZXNfcmVmc1tpXSwgU291cmNlUGFja2FnZSk7CisgICAgICAgIGlmICghcGFja2FnZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICghbWVtY21wKHBhY2thZ2UtPnBhY2thZ2VfdWlkLCBwYWNrYWdlX3VpZCwgMTYpKQorICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2U7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgTVhGU3RydWN0dXJhbENvbXBvbmVudCogbXhmX3Jlc29sdmVfZXNzZW5jZV9ncm91cF9jaG9pY2UoTVhGQ29udGV4dCAqbXhmLCBNWEZFc3NlbmNlR3JvdXAgKmVzc2VuY2VfZ3JvdXApCit7CisgICAgTVhGU3RydWN0dXJhbENvbXBvbmVudCAqY29tcG9uZW50ID0gTlVMTDsKKyAgICBNWEZQYWNrYWdlICpwYWNrYWdlID0gTlVMTDsKKyAgICBNWEZEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIGlmICghZXNzZW5jZV9ncm91cCB8fCAhZXNzZW5jZV9ncm91cC0+c3RydWN0dXJhbF9jb21wb25lbnRzX2NvdW50KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIGVzc2VuY2UgZ3JvdXBzIGNvbnRhaW5zIG11bHRpcGxlIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgc2FtZSBtZWRpYSwKKyAgICAgICB0aGlzIHJldHVybiB0aGUgZmlyc3QgY29tcG9uZW50cyB3aXRoIGEgdmFsaWQgRGVzY3JpcHRvciB0eXBpY2FsbHkgaW5kZXggMCAqLworICAgIGZvciAoaSA9MDsgaSA8IGVzc2VuY2VfZ3JvdXAtPnN0cnVjdHVyYWxfY29tcG9uZW50c19jb3VudDsgaSsrKXsKKyAgICAgICAgY29tcG9uZW50ID0gbXhmX3Jlc29sdmVfc3Ryb25nX3JlZihteGYsICZlc3NlbmNlX2dyb3VwLT5zdHJ1Y3R1cmFsX2NvbXBvbmVudHNfcmVmc1tpXSwgU291cmNlQ2xpcCk7CisgICAgICAgIGlmICghY29tcG9uZW50KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKCEocGFja2FnZSA9IG14Zl9yZXNvbHZlX3NvdXJjZV9wYWNrYWdlKG14ZiwgY29tcG9uZW50LT5zb3VyY2VfcGFja2FnZV91aWQpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGRlc2NyaXB0b3IgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14ZiwgJnBhY2thZ2UtPmRlc2NyaXB0b3JfcmVmLCBEZXNjcmlwdG9yKTsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IpeworICAgICAgICAgICAgLyogSEFDSzogZm9yY2UgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQgdG8gbWF0Y2ggdGhlIGR1cmF0aW9uIG9mIHRoZSBkZXNjcmlwdG9yICovCisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci0+ZHVyYXRpb24gIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgY29tcG9uZW50LT5kdXJhdGlvbiA9IGRlc2NyaXB0b3ItPmR1cmF0aW9uOworICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIE1YRlN0cnVjdHVyYWxDb21wb25lbnQqIG14Zl9yZXNvbHZlX3NvdXJjZWNsaXAoTVhGQ29udGV4dCAqbXhmLCBVSUQgKnN0cm9uZ19yZWYpCit7CisgICAgTVhGU3RydWN0dXJhbENvbXBvbmVudCAqY29tcG9uZW50ID0gTlVMTDsKKworICAgIGNvbXBvbmVudCA9IG14Zl9yZXNvbHZlX3N0cm9uZ19yZWYobXhmLCBzdHJvbmdfcmVmLCBBbnlUeXBlKTsKKyAgICBpZiAoIWNvbXBvbmVudCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3dpdGNoIChjb21wb25lbnQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBTb3VyY2VDbGlwOgorICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKKyAgICAgICAgY2FzZSBFc3NlbmNlR3JvdXA6CisgICAgICAgICAgICByZXR1cm4gbXhmX3Jlc29sdmVfZXNzZW5jZV9ncm91cF9jaG9pY2UobXhmLCAoTVhGRXNzZW5jZUdyb3VwKikgY29tcG9uZW50KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBteGZfcGFyc2VfcGh5c2ljYWxfc291cmNlX3BhY2thZ2UoTVhGQ29udGV4dCAqbXhmLCBNWEZUcmFjayAqc291cmNlX3RyYWNrLCBBVlN0cmVhbSAqc3QpCit7CisgICAgTVhGUGFja2FnZSAqcGh5c2ljYWxfcGFja2FnZSA9IE5VTEw7CisgICAgTVhGVHJhY2sgKnBoeXNpY2FsX3RyYWNrID0gTlVMTDsKKyAgICBNWEZTdHJ1Y3R1cmFsQ29tcG9uZW50ICpzb3VyY2VjbGlwID0gTlVMTDsKKyAgICBNWEZUaW1lY29kZUNvbXBvbmVudCAqbXhmX3RjID0gTlVMTDsKKyAgICBpbnQgaSwgaiwgazsKKyAgICBBVlRpbWVjb2RlIHRjOworICAgIGludCBmbGFnczsKKyAgICBpbnQ2NF90IHN0YXJ0X3Bvc2l0aW9uOworCisgICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZV90cmFjay0+c2VxdWVuY2UtPnN0cnVjdHVyYWxfY29tcG9uZW50c19jb3VudDsgaSsrKSB7CisgICAgICAgIHNvdXJjZWNsaXAgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14ZiwgJnNvdXJjZV90cmFjay0+c2VxdWVuY2UtPnN0cnVjdHVyYWxfY29tcG9uZW50c19yZWZzW2ldLCBTb3VyY2VDbGlwKTsKKyAgICAgICAgaWYgKCFzb3VyY2VjbGlwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKCEocGh5c2ljYWxfcGFja2FnZSA9IG14Zl9yZXNvbHZlX3NvdXJjZV9wYWNrYWdlKG14Ziwgc291cmNlY2xpcC0+c291cmNlX3BhY2thZ2VfdWlkKSkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBteGZfYWRkX3VpZF9tZXRhZGF0YSgmc3QtPm1ldGFkYXRhLCAicmVlbF91aWQiLCBwaHlzaWNhbF9wYWNrYWdlLT5wYWNrYWdlX3VpZCk7CisKKyAgICAgICAgLyogdGhlIG5hbWUgb2YgcGh5c2ljYWwgc291cmNlIHBhY2thZ2UgaXMgbmFtZSBvZiB0aGUgcmVlbCBvciB0YXBlICovCisgICAgICAgIGlmIChwaHlzaWNhbF9wYWNrYWdlLT5uYW1lICYmIHBoeXNpY2FsX3BhY2thZ2UtPm5hbWVbMF0pCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAicmVlbF9uYW1lIiwgcGh5c2ljYWxfcGFja2FnZS0+bmFtZSwgMCk7CisKKyAgICAgICAgLyogdGhlIHNvdXJjZSB0aW1lY29kZSBpcyBjYWxjdWxhdGVkIGJ5IGFkZGluZyB0aGUgc3RhcnRfcG9zaXRpb24gb2YgdGhlIHNvdXJjZWNsaXAgZnJvbSB0aGUgZmlsZSBzb3VyY2UgcGFja2FnZSB0cmFjaworICAgICAgICAgKiB0byB0aGUgc3RhcnRfZnJhbWUgb2YgdGhlIHRpbWVjb2RlIGNvbXBvbmVudCBsb2NhdGVkIG9uIG9uZSBvZiB0aGUgdHJhY2tzIG9mIHRoZSBwaHlzaWNhbCBzb3VyY2UgcGFja2FnZS4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBwaHlzaWNhbF9wYWNrYWdlLT50cmFja3NfY291bnQ7IGorKykgeworICAgICAgICAgICAgaWYgKCEocGh5c2ljYWxfdHJhY2sgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14ZiwgJnBoeXNpY2FsX3BhY2thZ2UtPnRyYWNrc19yZWZzW2pdLCBUcmFjaykpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCByZXNvbHZlIHNvdXJjZSB0cmFjayBzdHJvbmcgcmVmXG4iKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEocGh5c2ljYWxfdHJhY2stPnNlcXVlbmNlID0gbXhmX3Jlc29sdmVfc3Ryb25nX3JlZihteGYsICZwaHlzaWNhbF90cmFjay0+c2VxdWVuY2VfcmVmLCBTZXF1ZW5jZSkpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCByZXNvbHZlIHNvdXJjZSB0cmFjayBzZXF1ZW5jZSBzdHJvbmcgcmVmXG4iKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHBoeXNpY2FsX3RyYWNrLT5zZXF1ZW5jZS0+c3RydWN0dXJhbF9jb21wb25lbnRzX2NvdW50OyBrKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIShteGZfdGMgPSBteGZfcmVzb2x2ZV90aW1lY29kZV9jb21wb25lbnQobXhmLCAmcGh5c2ljYWxfdHJhY2stPnNlcXVlbmNlLT5zdHJ1Y3R1cmFsX2NvbXBvbmVudHNfcmVmc1trXSkpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGZsYWdzID0gbXhmX3RjLT5kcm9wX2ZyYW1lID09IDEgPyBBVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRSA6IDA7CisgICAgICAgICAgICAgICAgLyogc2NhbGUgc291cmNlY2xpcCBzdGFydF9wb3NpdGlvbiB0byBtYXRjaCBwaHlzaWNhbCB0cmFjayBlZGl0IHJhdGUgKi8KKyAgICAgICAgICAgICAgICBzdGFydF9wb3NpdGlvbiA9IGF2X3Jlc2NhbGVfcShzb3VyY2VjbGlwLT5zdGFydF9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbF90cmFjay0+ZWRpdF9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV90cmFjay0+ZWRpdF9yYXRlKTsKKworICAgICAgICAgICAgICAgIGlmIChhdl90aW1lY29kZV9pbml0KCZ0YywgbXhmX3RjLT5yYXRlLCBmbGFncywgc3RhcnRfcG9zaXRpb24gKyBteGZfdGMtPnN0YXJ0X2ZyYW1lLCBteGYtPmZjKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG14Zl9hZGRfdGltZWNvZGVfbWV0YWRhdGEoJnN0LT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgJnRjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhmX3BhcnNlX3N0cnVjdHVyYWxfbWV0YWRhdGEoTVhGQ29udGV4dCAqbXhmKQoreworICAgIE1YRlBhY2thZ2UgKm1hdGVyaWFsX3BhY2thZ2UgPSBOVUxMOworICAgIGludCBpLCBqLCBrLCByZXQ7CisKKyAgICBhdl9kbG9nKG14Zi0+ZmMsICJtZXRhZGF0YSBzZXRzIGNvdW50ICVkXG4iLCBteGYtPm1ldGFkYXRhX3NldHNfY291bnQpOworICAgIC8qIFRPRE86IGhhbmRsZSBtdWx0aXBsZSBtYXRlcmlhbCBwYWNrYWdlcyAoT1AzeCkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbXhmLT5wYWNrYWdlc19jb3VudDsgaSsrKSB7CisgICAgICAgIG1hdGVyaWFsX3BhY2thZ2UgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14ZiwgJm14Zi0+cGFja2FnZXNfcmVmc1tpXSwgTWF0ZXJpYWxQYWNrYWdlKTsKKyAgICAgICAgaWYgKG1hdGVyaWFsX3BhY2thZ2UpIGJyZWFrOworICAgIH0KKyAgICBpZiAoIW1hdGVyaWFsX3BhY2thZ2UpIHsKKyAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwgIm5vIG1hdGVyaWFsIHBhY2thZ2UgZm91bmRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBteGZfYWRkX3VpZF9tZXRhZGF0YSgmbXhmLT5mYy0+bWV0YWRhdGEsICJtYXRlcmlhbF9wYWNrYWdlX3VpZCIsIG1hdGVyaWFsX3BhY2thZ2UtPnBhY2thZ2VfdWlkKTsKKyAgICBpZiAobWF0ZXJpYWxfcGFja2FnZS0+bmFtZSAmJiBtYXRlcmlhbF9wYWNrYWdlLT5uYW1lWzBdKQorICAgICAgICBhdl9kaWN0X3NldCgmbXhmLT5mYy0+bWV0YWRhdGEsICJtYXRlcmlhbF9wYWNrYWdlX25hbWUiLCBtYXRlcmlhbF9wYWNrYWdlLT5uYW1lLCAwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXRlcmlhbF9wYWNrYWdlLT50cmFja3NfY291bnQ7IGkrKykgeworICAgICAgICBNWEZQYWNrYWdlICpzb3VyY2VfcGFja2FnZSA9IE5VTEw7CisgICAgICAgIE1YRlRyYWNrICptYXRlcmlhbF90cmFjayA9IE5VTEw7CisgICAgICAgIE1YRlRyYWNrICpzb3VyY2VfdHJhY2sgPSBOVUxMOworICAgICAgICBNWEZUcmFjayAqdGVtcF90cmFjayA9IE5VTEw7CisgICAgICAgIE1YRkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBOVUxMOworICAgICAgICBNWEZTdHJ1Y3R1cmFsQ29tcG9uZW50ICpjb21wb25lbnQgPSBOVUxMOworICAgICAgICBNWEZUaW1lY29kZUNvbXBvbmVudCAqbXhmX3RjID0gTlVMTDsKKyAgICAgICAgVUlEICplc3NlbmNlX2NvbnRhaW5lcl91bCA9IE5VTEw7CisgICAgICAgIGNvbnN0IE1YRkNvZGVjVUwgKmNvZGVjX3VsID0gTlVMTDsKKyAgICAgICAgY29uc3QgTVhGQ29kZWNVTCAqY29udGFpbmVyX3VsID0gTlVMTDsKKyAgICAgICAgY29uc3QgTVhGQ29kZWNVTCAqcGl4X2ZtdF91bCA9IE5VTEw7CisgICAgICAgIEFWU3RyZWFtICpzdDsKKyAgICAgICAgQVZUaW1lY29kZSB0YzsKKyAgICAgICAgaW50IGZsYWdzOworCisgICAgICAgIGlmICghKG1hdGVyaWFsX3RyYWNrID0gbXhmX3Jlc29sdmVfc3Ryb25nX3JlZihteGYsICZtYXRlcmlhbF9wYWNrYWdlLT50cmFja3NfcmVmc1tpXSwgVHJhY2spKSkgeworICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCByZXNvbHZlIG1hdGVyaWFsIHRyYWNrIHN0cm9uZyByZWZcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGNvbXBvbmVudCA9IG14Zl9yZXNvbHZlX3N0cm9uZ19yZWYobXhmLCAmbWF0ZXJpYWxfdHJhY2stPnNlcXVlbmNlX3JlZiwgVGltZWNvZGVDb21wb25lbnQpKSkgeworICAgICAgICAgICAgbXhmX3RjID0gKE1YRlRpbWVjb2RlQ29tcG9uZW50Kiljb21wb25lbnQ7CisgICAgICAgICAgICBmbGFncyA9IG14Zl90Yy0+ZHJvcF9mcmFtZSA9PSAxID8gQVZfVElNRUNPREVfRkxBR19EUk9QRlJBTUUgOiAwOworICAgICAgICAgICAgaWYgKGF2X3RpbWVjb2RlX2luaXQoJnRjLCBteGZfdGMtPnJhdGUsIGZsYWdzLCBteGZfdGMtPnN0YXJ0X2ZyYW1lLCBteGYtPmZjKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbXhmX2FkZF90aW1lY29kZV9tZXRhZGF0YSgmbXhmLT5mYy0+bWV0YWRhdGEsICJ0aW1lY29kZSIsICZ0Yyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShtYXRlcmlhbF90cmFjay0+c2VxdWVuY2UgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14ZiwgJm1hdGVyaWFsX3RyYWNrLT5zZXF1ZW5jZV9yZWYsIFNlcXVlbmNlKSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgcmVzb2x2ZSBtYXRlcmlhbCB0cmFjayBzZXF1ZW5jZSBzdHJvbmcgcmVmXG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG1hdGVyaWFsX3RyYWNrLT5zZXF1ZW5jZS0+c3RydWN0dXJhbF9jb21wb25lbnRzX2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgIGNvbXBvbmVudCA9IG14Zl9yZXNvbHZlX3N0cm9uZ19yZWYobXhmLCAmbWF0ZXJpYWxfdHJhY2stPnNlcXVlbmNlLT5zdHJ1Y3R1cmFsX2NvbXBvbmVudHNfcmVmc1tqXSwgVGltZWNvZGVDb21wb25lbnQpOworICAgICAgICAgICAgaWYgKCFjb21wb25lbnQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIG14Zl90YyA9IChNWEZUaW1lY29kZUNvbXBvbmVudCopY29tcG9uZW50OworICAgICAgICAgICAgZmxhZ3MgPSBteGZfdGMtPmRyb3BfZnJhbWUgPT0gMSA/IEFWX1RJTUVDT0RFX0ZMQUdfRFJPUEZSQU1FIDogMDsKKyAgICAgICAgICAgIGlmIChhdl90aW1lY29kZV9pbml0KCZ0YywgbXhmX3RjLT5yYXRlLCBmbGFncywgbXhmX3RjLT5zdGFydF9mcmFtZSwgbXhmLT5mYykgPT0gMCkgeworICAgICAgICAgICAgICAgIG14Zl9hZGRfdGltZWNvZGVfbWV0YWRhdGEoJm14Zi0+ZmMtPm1ldGFkYXRhLCAidGltZWNvZGUiLCAmdGMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogVE9ETzogaGFuZGxlIG11bHRpcGxlIHNvdXJjZSBjbGlwcyAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWF0ZXJpYWxfdHJhY2stPnNlcXVlbmNlLT5zdHJ1Y3R1cmFsX2NvbXBvbmVudHNfY291bnQ7IGorKykgeworICAgICAgICAgICAgY29tcG9uZW50ID0gbXhmX3Jlc29sdmVfc291cmNlY2xpcChteGYsICZtYXRlcmlhbF90cmFjay0+c2VxdWVuY2UtPnN0cnVjdHVyYWxfY29tcG9uZW50c19yZWZzW2pdKTsKKyAgICAgICAgICAgIGlmICghY29tcG9uZW50KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBzb3VyY2VfcGFja2FnZSA9IG14Zl9yZXNvbHZlX3NvdXJjZV9wYWNrYWdlKG14ZiwgY29tcG9uZW50LT5zb3VyY2VfcGFja2FnZV91aWQpOworICAgICAgICAgICAgaWYgKCFzb3VyY2VfcGFja2FnZSkgeworICAgICAgICAgICAgICAgIGF2X2Rsb2cobXhmLT5mYywgIm1hdGVyaWFsIHRyYWNrICVkOiBubyBjb3JyZXNwb25kaW5nIHNvdXJjZSBwYWNrYWdlIGZvdW5kXG4iLCBtYXRlcmlhbF90cmFjay0+dHJhY2tfaWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNvdXJjZV9wYWNrYWdlLT50cmFja3NfY291bnQ7IGsrKykgeworICAgICAgICAgICAgICAgIGlmICghKHRlbXBfdHJhY2sgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14ZiwgJnNvdXJjZV9wYWNrYWdlLT50cmFja3NfcmVmc1trXSwgVHJhY2spKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IHJlc29sdmUgc291cmNlIHRyYWNrIHN0cm9uZyByZWZcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxfYW5kX2ZyZWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0ZW1wX3RyYWNrLT50cmFja19pZCA9PSBjb21wb25lbnQtPnNvdXJjZV90cmFja19pZCkgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2VfdHJhY2sgPSB0ZW1wX3RyYWNrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNvdXJjZV90cmFjaykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsICJtYXRlcmlhbCB0cmFjayAlZDogbm8gY29ycmVzcG9uZGluZyBzb3VyY2UgdHJhY2sgZm91bmRcbiIsIG1hdGVyaWFsX3RyYWNrLT50cmFja19pZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzb3VyY2VfdHJhY2sgfHwgIWNvbXBvbmVudCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICghKHNvdXJjZV90cmFjay0+c2VxdWVuY2UgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14ZiwgJnNvdXJjZV90cmFjay0+c2VxdWVuY2VfcmVmLCBTZXF1ZW5jZSkpKSB7CisgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IHJlc29sdmUgc291cmNlIHRyYWNrIHNlcXVlbmNlIHN0cm9uZyByZWZcbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZmFpbF9hbmRfZnJlZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIDAwMDFHTDAwLk1YRi5BMS5teGZfb3BhdG9tLm14ZiBoYXMgdGhlIHNhbWUgU291cmNlUGFja2FnZUlEIGFzIDAwMDFHTC5NWEYuVjEubXhmX29wYXRvbS5teGYKKyAgICAgICAgICogVGhpcyB3b3VsZCByZXN1bHQgaW4gYm90aCBmaWxlcyBhcHBlYXJpbmcgdG8gaGF2ZSB0d28gc3RyZWFtcy4gV29yayBhcm91bmQgdGhpcyBieSBzYW5pdHkgY2hlY2tpbmcgRGF0YURlZmluaXRpb24gKi8KKyAgICAgICAgaWYgKG1lbWNtcChtYXRlcmlhbF90cmFjay0+c2VxdWVuY2UtPmRhdGFfZGVmaW5pdGlvbl91bCwgc291cmNlX3RyYWNrLT5zZXF1ZW5jZS0+ZGF0YV9kZWZpbml0aW9uX3VsLCAxNikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsICJtYXRlcmlhbCB0cmFjayAlZDogRGF0YURlZmluaXRpb24gbWlzbWF0Y2hcbiIsIG1hdGVyaWFsX3RyYWNrLT50cmFja19pZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShteGYtPmZjLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzdCkgeworICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBzdHJlYW1cbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsX2FuZF9mcmVlOworICAgICAgICB9CisgICAgICAgIHN0LT5pZCA9IHNvdXJjZV90cmFjay0+dHJhY2tfaWQ7CisgICAgICAgIHN0LT5wcml2X2RhdGEgPSBzb3VyY2VfdHJhY2s7CisgICAgICAgIHNvdXJjZV90cmFjay0+b3JpZ2luYWxfZHVyYXRpb24gPSBzdC0+ZHVyYXRpb24gPSBjb21wb25lbnQtPmR1cmF0aW9uOworICAgICAgICBpZiAoc3QtPmR1cmF0aW9uID09IC0xKQorICAgICAgICAgICAgc3QtPmR1cmF0aW9uID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHN0LT5zdGFydF90aW1lID0gY29tcG9uZW50LT5zdGFydF9wb3NpdGlvbjsKKyAgICAgICAgaWYgKG1hdGVyaWFsX3RyYWNrLT5lZGl0X3JhdGUubnVtIDw9IDAgfHwKKyAgICAgICAgICAgIG1hdGVyaWFsX3RyYWNrLT5lZGl0X3JhdGUuZGVuIDw9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBlZGl0IHJhdGUgKCVkLyVkKSBmb3VuZCBvbiBzdHJlYW0gIyVkLCAiCisgICAgICAgICAgICAgICAgICAgImRlZmF1bHRpbmcgdG8gMjUvMVxuIiwKKyAgICAgICAgICAgICAgICAgICBtYXRlcmlhbF90cmFjay0+ZWRpdF9yYXRlLm51bSwKKyAgICAgICAgICAgICAgICAgICBtYXRlcmlhbF90cmFjay0+ZWRpdF9yYXRlLmRlbiwgc3QtPmluZGV4KTsKKyAgICAgICAgICAgIG1hdGVyaWFsX3RyYWNrLT5lZGl0X3JhdGUgPSAoQVZSYXRpb25hbCl7MjUsIDF9OworICAgICAgICB9CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBtYXRlcmlhbF90cmFjay0+ZWRpdF9yYXRlLmRlbiwgbWF0ZXJpYWxfdHJhY2stPmVkaXRfcmF0ZS5udW0pOworCisgICAgICAgIC8qIGVuc3VyZSBTb3VyY2VUcmFjayBFZGl0UmF0ZSA9PSBNYXRlcmlhbFRyYWNrIEVkaXRSYXRlIHNpbmNlIG9ubHkKKyAgICAgICAgICogdGhlIGZvcm1lciBpcyBhY2Nlc3NpYmxlIHZpYSBzdC0+cHJpdl9kYXRhICovCisgICAgICAgIHNvdXJjZV90cmFjay0+ZWRpdF9yYXRlID0gbWF0ZXJpYWxfdHJhY2stPmVkaXRfcmF0ZTsKKworICAgICAgICBQUklOVF9LRVkobXhmLT5mYywgImRhdGEgZGVmaW5pdGlvbiAgIHVsIiwgc291cmNlX3RyYWNrLT5zZXF1ZW5jZS0+ZGF0YV9kZWZpbml0aW9uX3VsKTsKKyAgICAgICAgY29kZWNfdWwgPSBteGZfZ2V0X2NvZGVjX3VsKGZmX214Zl9kYXRhX2RlZmluaXRpb25fdWxzLCAmc291cmNlX3RyYWNrLT5zZXF1ZW5jZS0+ZGF0YV9kZWZpbml0aW9uX3VsKTsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gY29kZWNfdWwtPmlkOworCisgICAgICAgIHNvdXJjZV9wYWNrYWdlLT5kZXNjcmlwdG9yID0gbXhmX3Jlc29sdmVfc3Ryb25nX3JlZihteGYsICZzb3VyY2VfcGFja2FnZS0+ZGVzY3JpcHRvcl9yZWYsIEFueVR5cGUpOworICAgICAgICBpZiAoc291cmNlX3BhY2thZ2UtPmRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2VfcGFja2FnZS0+ZGVzY3JpcHRvci0+dHlwZSA9PSBNdWx0aXBsZURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc291cmNlX3BhY2thZ2UtPmRlc2NyaXB0b3ItPnN1Yl9kZXNjcmlwdG9yc19jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIE1YRkRlc2NyaXB0b3IgKnN1Yl9kZXNjcmlwdG9yID0gbXhmX3Jlc29sdmVfc3Ryb25nX3JlZihteGYsICZzb3VyY2VfcGFja2FnZS0+ZGVzY3JpcHRvci0+c3ViX2Rlc2NyaXB0b3JzX3JlZnNbal0sIERlc2NyaXB0b3IpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghc3ViX2Rlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgcmVzb2x2ZSBzdWIgZGVzY3JpcHRvciBzdHJvbmcgcmVmXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJfZGVzY3JpcHRvci0+bGlua2VkX3RyYWNrX2lkID09IHNvdXJjZV90cmFjay0+dHJhY2tfaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBzdWJfZGVzY3JpcHRvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VfcGFja2FnZS0+ZGVzY3JpcHRvci0+dHlwZSA9PSBEZXNjcmlwdG9yKQorICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBzb3VyY2VfcGFja2FnZS0+ZGVzY3JpcHRvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfSU5GTywgInNvdXJjZSB0cmFjayAlZDogc3RyZWFtICVkLCBubyBkZXNjcmlwdG9yIGZvdW5kXG4iLCBzb3VyY2VfdHJhY2stPnRyYWNrX2lkLCBzdC0+aW5kZXgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgUFJJTlRfS0VZKG14Zi0+ZmMsICJlc3NlbmNlIGNvZGVjICAgICB1bCIsIGRlc2NyaXB0b3ItPmVzc2VuY2VfY29kZWNfdWwpOworICAgICAgICBQUklOVF9LRVkobXhmLT5mYywgImVzc2VuY2UgY29udGFpbmVyIHVsIiwgZGVzY3JpcHRvci0+ZXNzZW5jZV9jb250YWluZXJfdWwpOworICAgICAgICBlc3NlbmNlX2NvbnRhaW5lcl91bCA9ICZkZXNjcmlwdG9yLT5lc3NlbmNlX2NvbnRhaW5lcl91bDsKKyAgICAgICAgLyogSEFDSzogcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBrZXkgd2l0aCBteGZfZW5jcnlwdGVkX2Vzc2VuY2VfY29udGFpbmVyCisgICAgICAgICAqIGlzIG5vdCBhbGxvd2VkIGFjY29yZGluZyB0byBzNDI5LTYsIHRyeSB0byBmaW5kIGNvcnJlY3QgaW5mb3JtYXRpb24gYW55d2F5ICovCisgICAgICAgIGlmIChJU19LTFZfS0VZKGVzc2VuY2VfY29udGFpbmVyX3VsLCBteGZfZW5jcnlwdGVkX2Vzc2VuY2VfY29udGFpbmVyKSkgeworICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19JTkZPLCAiYnJva2VuIGVuY3J5cHRlZCBteGYgZmlsZVxuIik7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbXhmLT5tZXRhZGF0YV9zZXRzX2NvdW50OyBrKyspIHsKKyAgICAgICAgICAgICAgICBNWEZNZXRhZGF0YVNldCAqbWV0YWRhdGEgPSBteGYtPm1ldGFkYXRhX3NldHNba107CisgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLT50eXBlID09IENyeXB0b0NvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXNzZW5jZV9jb250YWluZXJfdWwgPSAmKChNWEZDcnlwdG9Db250ZXh0ICopbWV0YWRhdGEpLT5zb3VyY2VfY29udGFpbmVyX3VsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBUT0RPOiBkcm9wIFBpY3R1cmVFc3NlbmNlQ29kaW5nIGFuZCBTb3VuZEVzc2VuY2VDb21wcmVzc2lvbiwgb25seSBjaGVjayBFc3NlbmNlQ29udGFpbmVyICovCisgICAgICAgIGNvZGVjX3VsID0gbXhmX2dldF9jb2RlY191bChmZl9teGZfY29kZWNfdWxzLCAmZGVzY3JpcHRvci0+ZXNzZW5jZV9jb2RlY191bCk7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSAoZW51bSBBVkNvZGVjSUQpY29kZWNfdWwtPmlkOworICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX1ZFUkJPU0UsICIlczogVW5pdmVyc2FsIExhYmVsOiAiLAorICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShzdC0+Y29kZWMtPmNvZGVjX2lkKSk7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKSB7CisgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX1ZFUkJPU0UsICIlLjJ4IiwKKyAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5lc3NlbmNlX2NvZGVjX3VsW2tdKTsKKyAgICAgICAgICAgIGlmICghKGsrMSAmIDE5KSB8fCBrID09IDUpCisgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19WRVJCT1NFLCAiLiIpOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfVkVSQk9TRSwgIlxuIik7CisKKyAgICAgICAgbXhmX2FkZF91aWRfbWV0YWRhdGEoJnN0LT5tZXRhZGF0YSwgImZpbGVfcGFja2FnZV91aWQiLCBzb3VyY2VfcGFja2FnZS0+cGFja2FnZV91aWQpOworICAgICAgICBpZiAoc291cmNlX3BhY2thZ2UtPm5hbWUgJiYgc291cmNlX3BhY2thZ2UtPm5hbWVbMF0pCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAiZmlsZV9wYWNrYWdlX25hbWUiLCBzb3VyY2VfcGFja2FnZS0+bmFtZSwgMCk7CisKKyAgICAgICAgbXhmX3BhcnNlX3BoeXNpY2FsX3NvdXJjZV9wYWNrYWdlKG14Ziwgc291cmNlX3RyYWNrLCBzdCk7CisKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIHNvdXJjZV90cmFjay0+aW50cmFfb25seSA9IG14Zl9pc19pbnRyYV9vbmx5KGRlc2NyaXB0b3IpOworICAgICAgICAgICAgY29udGFpbmVyX3VsID0gbXhmX2dldF9jb2RlY191bChteGZfcGljdHVyZV9lc3NlbmNlX2NvbnRhaW5lcl91bHMsIGVzc2VuY2VfY29udGFpbmVyX3VsKTsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGNvbnRhaW5lcl91bC0+aWQ7CisgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoID0gZGVzY3JpcHRvci0+d2lkdGg7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGRlc2NyaXB0b3ItPmhlaWdodDsgLyogRmllbGQgaGVpZ2h0LCBub3QgZnJhbWUgaGVpZ2h0ICovCisgICAgICAgICAgICBzd2l0Y2ggKGRlc2NyaXB0b3ItPmZyYW1lX2xheW91dCkgeworICAgICAgICAgICAgICAgIGNhc2UgU2VnbWVudGVkRnJhbWU6CisgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgb25lIGlzIGEgd2VpcmQgbGF5b3V0IEkgZG9uJ3QgZnVsbHkgdW5kZXJzdGFuZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19JTkZPLCAiU2VnbWVudGVkRnJhbWUgbGF5b3V0IGlzbid0IGN1cnJlbnRseSBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZ1bGxGcmFtZToKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1BST0dSRVNTSVZFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9uZUZpZWxkOgorICAgICAgICAgICAgICAgICAgICAvKiBFdmVyeSBvdGhlciBsaW5lIGlzIHN0b3JlZCBhbmQgbmVlZHMgdG8gYmUgZHVwbGljYXRlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19JTkZPLCAiT25lRmllbGQgZnJhbWUgbGF5b3V0IGlzbid0IGN1cnJlbnRseSBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogVGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8gaGVyZSBpcyBmYWxsIHRocm91Z2gsIGJ1dCBieSBicmVha2luZyB3ZSBtaWdodCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJsZSB0byBkZWNvZGUgc29tZSBzdHJlYW1zIGF0IGhhbGYgdGhlIHZlcnRpY2FsIHJlc29sdXRpb24sIHJhdGhlciB0aGFuIG5vdCBhbCBhbGwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCdzIGFsc28gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIGJlaGF2aW9yLiAqLworICAgICAgICAgICAgICAgIGNhc2UgTWl4ZWRGaWVsZHM6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2VwYXJhdGVGaWVsZHM6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVzY3JpcHRvci0+ZmllbGRfZG9taW5hbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTVhGX1RGRjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZmllbGRfb3JkZXIgPSBBVl9GSUVMRF9UVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1YRl9CRkY6CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfQkI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShteGYtPmZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWVsZCBkb21pbmFuY2UgJWQgc3VwcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+ZmllbGRfZG9taW5hbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyB3ZSBhbHJlYWR5IGhhdmUgbWFueSBzYW1wbGVzIHdpdGggZmllbGRfZG9taW5hbmNlID09IHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIFR1cm4gZmllbGQgaGVpZ2h0IGludG8gZnJhbWUgaGVpZ2h0LiAqLworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAqPSAyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0lORk8sICJVbmtub3duIGZyYW1lIGxheW91dCB0eXBlOiAlZFxuIiwgZGVzY3JpcHRvci0+ZnJhbWVfbGF5b3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gZGVzY3JpcHRvci0+cGl4X2ZtdDsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICBwaXhfZm10X3VsID0gbXhmX2dldF9jb2RlY191bChmZl9teGZfcGl4ZWxfZm9ybWF0X3VscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3ItPmVzc2VuY2VfY29kZWNfdWwpOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSAoZW51bSBBVlBpeGVsRm9ybWF0KXBpeF9mbXRfdWwtPmlkOworICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBmaWxlcyBjcmVhdGVkIGJlZm9yZSBSUDIyNHYxMCBieSBkZWZhdWx0aW5nIHRvIFVZVlk0MjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN1YnNhbXBsaW5nIGlzIDQ6MjoyIGFuZCBjb21wb25lbnQgZGVwdGggaXMgOC1iaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLT5ob3Jpel9zdWJzYW1wbGluZyA9PSAyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+dmVydF9zdWJzYW1wbGluZyA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+Y29tcG9uZW50X2RlcHRoID09IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1VZVlk0MjI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKKyAgICAgICAgICAgIGlmIChtYXRlcmlhbF90cmFjay0+c2VxdWVuY2UtPm9yaWdpbikgeworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0X2ludCgmc3QtPm1ldGFkYXRhLCAibWF0ZXJpYWxfdHJhY2tfb3JpZ2luIiwgbWF0ZXJpYWxfdHJhY2stPnNlcXVlbmNlLT5vcmlnaW4sIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNvdXJjZV90cmFjay0+c2VxdWVuY2UtPm9yaWdpbikgeworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0X2ludCgmc3QtPm1ldGFkYXRhLCAic291cmNlX3RyYWNrX29yaWdpbiIsIHNvdXJjZV90cmFjay0+c2VxdWVuY2UtPm9yaWdpbiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci0+YXNwZWN0X3JhdGlvLm51bSAmJiBkZXNjcmlwdG9yLT5hc3BlY3RfcmF0aW8uZGVuKQorICAgICAgICAgICAgICAgIHN0LT5kaXNwbGF5X2FzcGVjdF9yYXRpbyA9IGRlc2NyaXB0b3ItPmFzcGVjdF9yYXRpbzsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBjb250YWluZXJfdWwgPSBteGZfZ2V0X2NvZGVjX3VsKG14Zl9zb3VuZF9lc3NlbmNlX2NvbnRhaW5lcl91bHMsIGVzc2VuY2VfY29udGFpbmVyX3VsKTsKKyAgICAgICAgICAgIC8qIE9ubHkgb3ZlcndyaXRlIGV4aXN0aW5nIGNvZGVjIElEIGlmIGl0IGlzIHVuc2V0IG9yIEEtbGF3LCB3aGljaCBpcyB0aGUgZGVmYXVsdCBhY2NvcmRpbmcgdG8gU01QVEUgUlAgMjI0LiAqLworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSB8fCAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fQUxBVyAmJiAoZW51bSBBVkNvZGVjSUQpY29udGFpbmVyX3VsLT5pZCAhPSBBVl9DT0RFQ19JRF9OT05FKSkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gKGVudW0gQVZDb2RlY0lEKWNvbnRhaW5lcl91bC0+aWQ7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gZGVzY3JpcHRvci0+Y2hhbm5lbHM7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGRlc2NyaXB0b3ItPmJpdHNfcGVyX3NhbXBsZTsKKworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3ItPnNhbXBsZV9yYXRlLmRlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gZGVzY3JpcHRvci0+c2FtcGxlX3JhdGUubnVtIC8gZGVzY3JpcHRvci0+c2FtcGxlX3JhdGUuZGVuOworICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBkZXNjcmlwdG9yLT5zYW1wbGVfcmF0ZS5kZW4sIGRlc2NyaXB0b3ItPnNhbXBsZV9yYXRlLm51bSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfV0FSTklORywgImludmFsaWQgc2FtcGxlIHJhdGUgKCVkLyVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICJmb3VuZCBmb3Igc3RyZWFtICMlZCwgdGltZSBiYXNlIGZvcmNlZCB0byAxLzQ4MDAwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5zYW1wbGVfcmF0ZS5udW0sIGRlc2NyaXB0b3ItPnNhbXBsZV9yYXRlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3QtPmluZGV4KTsKKyAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgNDgwMDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBpZiBkdXJhdGlvbiBpcyBzZXQsIHJlc2NhbGUgaXQgZnJvbSBFZGl0UmF0ZSB0byBTYW1wbGVSYXRlICovCisgICAgICAgICAgICBpZiAoc3QtPmR1cmF0aW9uICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShzdC0+ZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ludl9xKG1hdGVyaWFsX3RyYWNrLT5lZGl0X3JhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlKTsKKworICAgICAgICAgICAgLyogVE9ETzogaW1wbGVtZW50IEFWX0NPREVDX0lEX1JBV0FVRElPICovCisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci0+Yml0c19wZXJfc2FtcGxlID4gMTYgJiYgZGVzY3JpcHRvci0+Yml0c19wZXJfc2FtcGxlIDw9IDI0KQorICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MyNExFOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlc2NyaXB0b3ItPmJpdHNfcGVyX3NhbXBsZSA9PSAzMikKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMzJMRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2QkUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci0+Yml0c19wZXJfc2FtcGxlID4gMTYgJiYgZGVzY3JpcHRvci0+Yml0c19wZXJfc2FtcGxlIDw9IDI0KQorICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MyNEJFOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlc2NyaXB0b3ItPmJpdHNfcGVyX3NhbXBsZSA9PSAzMikKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMzJCRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDIpIHsKKyAgICAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0RBVEEpIHsKKyAgICAgICAgICAgIGludCBjb2RlY19pZCA9IG14Zl9nZXRfY29kZWNfdWwobXhmX2RhdGFfZXNzZW5jZV9jb250YWluZXJfdWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3NlbmNlX2NvbnRhaW5lcl91bCktPmlkOworICAgICAgICAgICAgaWYgKGNvZGVjX2lkID49IDAgJiYKKyAgICAgICAgICAgICAgICBjb2RlY19pZCA8IEZGX0FSUkFZX0VMRU1TKG14Zl9kYXRhX2Vzc2VuY2VfZGVzY3JpcHRvcikpIHsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAiZGF0YV90eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteGZfZGF0YV9lc3NlbmNlX2Rlc2NyaXB0b3JbY29kZWNfaWRdLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRvci0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICBpZiAoIWZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIGRlc2NyaXB0b3ItPmV4dHJhZGF0YV9zaXplKSkgeworICAgICAgICAgICAgICAgIG1lbWNweShzdC0+Y29kZWMtPmV4dHJhZGF0YSwgZGVzY3JpcHRvci0+ZXh0cmFkYXRhLCBkZXNjcmlwdG9yLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgICAgICAgICByZXQgPSBmZl9nZW5lcmF0ZV9hdmNpX2V4dHJhZGF0YShzdCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0RBVEEgJiYgKCplc3NlbmNlX2NvbnRhaW5lcl91bClbMTVdID4gMHgwMSkgeworICAgICAgICAgICAgLyogVE9ETzogZGVjb2RlIHRpbWVzdGFtcHMgKi8KKyAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9USU1FU1RBTVBTOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gMDsKK2ZhaWxfYW5kX2ZyZWU6CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGZfdGltZXN0YW1wX3RvX3N0cih1aW50NjRfdCB0aW1lc3RhbXAsIGNoYXIgKipzdHIpCit7CisgICAgc3RydWN0IHRtIHRpbWUgPSB7IDAgfTsKKyAgICB0aW1lLnRtX3llYXIgPSAodGltZXN0YW1wID4+IDQ4KSAtIDE5MDA7CisgICAgdGltZS50bV9tb24gID0gKHRpbWVzdGFtcCA+PiA0MCAmIDB4RkYpIC0gMTsKKyAgICB0aW1lLnRtX21kYXkgPSAodGltZXN0YW1wID4+IDMyICYgMHhGRik7CisgICAgdGltZS50bV9ob3VyID0gKHRpbWVzdGFtcCA+PiAyNCAmIDB4RkYpOworICAgIHRpbWUudG1fbWluICA9ICh0aW1lc3RhbXAgPj4gMTYgJiAweEZGKTsKKyAgICB0aW1lLnRtX3NlYyAgPSAodGltZXN0YW1wID4+IDggICYgMHhGRik7CisKKyAgICAvKiBtc3ZjcnQgdmVyc2lvbnMgb2Ygc3RyZnRpbWUgY2FsbHMgdGhlIGludmFsaWQgcGFyYW1ldGVyIGhhbmRsZXIKKyAgICAgKiAoYWJvcnRpbmcgdGhlIHByb2Nlc3MgaWYgb25lIGlzbid0IHNldCkgaWYgdGhlIHBhcmFtZXRlcnMgYXJlIG91dAorICAgICAqIG9mIHJhbmdlLiAqLworICAgIHRpbWUudG1fbW9uICA9IGF2X2NsaXAodGltZS50bV9tb24sICAwLCAxMSk7CisgICAgdGltZS50bV9tZGF5ID0gYXZfY2xpcCh0aW1lLnRtX21kYXksIDEsIDMxKTsKKyAgICB0aW1lLnRtX2hvdXIgPSBhdl9jbGlwKHRpbWUudG1faG91ciwgMCwgMjMpOworICAgIHRpbWUudG1fbWluICA9IGF2X2NsaXAodGltZS50bV9taW4sICAwLCA1OSk7CisgICAgdGltZS50bV9zZWMgID0gYXZfY2xpcCh0aW1lLnRtX3NlYywgIDAsIDU5KTsKKworICAgICpzdHIgPSBhdl9tYWxsb2N6KDMyKTsKKyAgICBpZiAoISpzdHIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaWYgKCFzdHJmdGltZSgqc3RyLCAzMiwgIiVZLSVtLSVkICVIOiVNOiVTIiwgJnRpbWUpKQorICAgICAgICBzdHJbMF0gPSAnXDAnOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU0VUX1NUUl9NRVRBREFUQShwYiwgbmFtZSwgc3RyKSBkbyB7IFwKKyAgICBpZiAoKHJldCA9IG14Zl9yZWFkX3V0ZjE2X3N0cmluZyhwYiwgc2l6ZSwgJnN0cikpIDwgMCkgXAorICAgICAgICByZXR1cm4gcmV0OyBcCisgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBuYW1lLCBzdHIsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTRVRfVUlEX01FVEFEQVRBKHBiLCBuYW1lLCB2YXIsIHN0cikgZG8geyBcCisgICAgYXZpb19yZWFkKHBiLCB2YXIsIDE2KTsgXAorICAgIGlmICgocmV0ID0gbXhmX3VpZF90b19zdHIodmFyLCAmc3RyKSkgPCAwKSBcCisgICAgICAgIHJldHVybiByZXQ7IFwKKyAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsIG5hbWUsIHN0ciwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFVF9UU19NRVRBREFUQShwYiwgbmFtZSwgdmFyLCBzdHIpIGRvIHsgXAorICAgIHZhciA9IGF2aW9fcmI2NChwYik7IFwKKyAgICBpZiAoKHJldCA9IG14Zl90aW1lc3RhbXBfdG9fc3RyKHZhciwgJnN0cikpIDwgMCkgXAorICAgICAgICByZXR1cm4gcmV0OyBcCisgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBuYW1lLCBzdHIsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBteGZfcmVhZF9pZGVudGlmaWNhdGlvbl9tZXRhZGF0YSh2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCBfdWlkLCBpbnQ2NF90IGtsdl9vZmZzZXQpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gYXJnOworICAgIEFWRm9ybWF0Q29udGV4dCAqcyA9IG14Zi0+ZmM7CisgICAgaW50IHJldDsKKyAgICBVSUQgdWlkID0geyAwIH07CisgICAgY2hhciAqc3RyID0gTlVMTDsKKyAgICB1aW50NjRfdCB0czsKKyAgICBzd2l0Y2ggKHRhZykgeworICAgIGNhc2UgMHgzQzAxOgorICAgICAgICBTRVRfU1RSX01FVEFEQVRBKHBiLCAiY29tcGFueV9uYW1lIiwgc3RyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDNDMDI6CisgICAgICAgIFNFVF9TVFJfTUVUQURBVEEocGIsICJwcm9kdWN0X25hbWUiLCBzdHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4M0MwNDoKKyAgICAgICAgU0VUX1NUUl9NRVRBREFUQShwYiwgInByb2R1Y3RfdmVyc2lvbiIsIHN0cik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzQzA1OgorICAgICAgICBTRVRfVUlEX01FVEFEQVRBKHBiLCAicHJvZHVjdF91aWQiLCB1aWQsIHN0cik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzQzA2OgorICAgICAgICBTRVRfVFNfTUVUQURBVEEocGIsICJtb2RpZmljYXRpb25fZGF0ZSIsIHRzLCBzdHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4M0MwODoKKyAgICAgICAgU0VUX1NUUl9NRVRBREFUQShwYiwgImFwcGxpY2F0aW9uX3BsYXRmb3JtIiwgc3RyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDNDMDk6CisgICAgICAgIFNFVF9VSURfTUVUQURBVEEocGIsICJnZW5lcmF0aW9uX3VpZCIsIHVpZCwgc3RyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDNDMEE6CisgICAgICAgIFNFVF9VSURfTUVUQURBVEEocGIsICJ1aWQiLCB1aWQsIHN0cik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IE1YRk1ldGFkYXRhUmVhZFRhYmxlRW50cnkgbXhmX21ldGFkYXRhX3JlYWRfdGFibGVbXSA9IHsKKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4MDUsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDA1LDB4MDEsMHgwMCB9LCBteGZfcmVhZF9wcmltZXJfcGFjayB9LAorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHgwNSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MDIsMHgwMSwweDAwIH0sIG14Zl9yZWFkX3BhcnRpdGlvbl9wYWNrIH0sCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDA1LDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwMiwweDAyLDB4MDAgfSwgbXhmX3JlYWRfcGFydGl0aW9uX3BhY2sgfSwKKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4MDUsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDAyLDB4MDMsMHgwMCB9LCBteGZfcmVhZF9wYXJ0aXRpb25fcGFjayB9LAorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHgwNSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MDIsMHgwNCwweDAwIH0sIG14Zl9yZWFkX3BhcnRpdGlvbl9wYWNrIH0sCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDA1LDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwMywweDAxLDB4MDAgfSwgbXhmX3JlYWRfcGFydGl0aW9uX3BhY2sgfSwKKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4MDUsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDAzLDB4MDIsMHgwMCB9LCBteGZfcmVhZF9wYXJ0aXRpb25fcGFjayB9LAorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHgwNSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MDMsMHgwMywweDAwIH0sIG14Zl9yZWFkX3BhcnRpdGlvbl9wYWNrIH0sCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDA1LDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwMywweDA0LDB4MDAgfSwgbXhmX3JlYWRfcGFydGl0aW9uX3BhY2sgfSwKKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4MDUsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDA0LDB4MDIsMHgwMCB9LCBteGZfcmVhZF9wYXJ0aXRpb25fcGFjayB9LAorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHgwNSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MDQsMHgwNCwweDAwIH0sIG14Zl9yZWFkX3BhcnRpdGlvbl9wYWNrIH0sCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDUzLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDMwLDB4MDAgfSwgbXhmX3JlYWRfaWRlbnRpZmljYXRpb25fbWV0YWRhdGEgfSwKKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4NTMsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MTgsMHgwMCB9LCBteGZfcmVhZF9jb250ZW50X3N0b3JhZ2UsIDAsIEFueVR5cGUgfSwKKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4NTMsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MzcsMHgwMCB9LCBteGZfcmVhZF9wYWNrYWdlLCBzaXplb2YoTVhGUGFja2FnZSksIFNvdXJjZVBhY2thZ2UgfSwKKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4NTMsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MzYsMHgwMCB9LCBteGZfcmVhZF9wYWNrYWdlLCBzaXplb2YoTVhGUGFja2FnZSksIE1hdGVyaWFsUGFja2FnZSB9LAorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwZiwweDAwIH0sIG14Zl9yZWFkX3NlcXVlbmNlLCBzaXplb2YoTVhGU2VxdWVuY2UpLCBTZXF1ZW5jZSB9LAorICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwRCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwNSwweDAwIH0sIG14Zl9yZWFkX2Vzc2VuY2VfZ3JvdXAsIHNpemVvZihNWEZFc3NlbmNlR3JvdXApLCBFc3NlbmNlR3JvdXB9LAorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgxMSwweDAwIH0sIG14Zl9yZWFkX3NvdXJjZV9jbGlwLCBzaXplb2YoTVhGU3RydWN0dXJhbENvbXBvbmVudCksIFNvdXJjZUNsaXAgfSwKKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4NTMsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4NDQsMHgwMCB9LCBteGZfcmVhZF9nZW5lcmljX2Rlc2NyaXB0b3IsIHNpemVvZihNWEZEZXNjcmlwdG9yKSwgTXVsdGlwbGVEZXNjcmlwdG9yIH0sCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDUzLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDQyLDB4MDAgfSwgbXhmX3JlYWRfZ2VuZXJpY19kZXNjcmlwdG9yLCBzaXplb2YoTVhGRGVzY3JpcHRvciksIERlc2NyaXB0b3IgfSwgLyogR2VuZXJpYyBTb3VuZCAqLworICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgyOCwweDAwIH0sIG14Zl9yZWFkX2dlbmVyaWNfZGVzY3JpcHRvciwgc2l6ZW9mKE1YRkRlc2NyaXB0b3IpLCBEZXNjcmlwdG9yIH0sIC8qIENEQ0kgKi8KKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4NTMsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MjksMHgwMCB9LCBteGZfcmVhZF9nZW5lcmljX2Rlc2NyaXB0b3IsIHNpemVvZihNWEZEZXNjcmlwdG9yKSwgRGVzY3JpcHRvciB9LCAvKiBSR0JBICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDUzLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDUxLDB4MDAgfSwgbXhmX3JlYWRfZ2VuZXJpY19kZXNjcmlwdG9yLCBzaXplb2YoTVhGRGVzY3JpcHRvciksIERlc2NyaXB0b3IgfSwgLyogTVBFRyAyIFZpZGVvICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDUzLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDQ4LDB4MDAgfSwgbXhmX3JlYWRfZ2VuZXJpY19kZXNjcmlwdG9yLCBzaXplb2YoTVhGRGVzY3JpcHRvciksIERlc2NyaXB0b3IgfSwgLyogV2F2ZSAqLworICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHg0NywweDAwIH0sIG14Zl9yZWFkX2dlbmVyaWNfZGVzY3JpcHRvciwgc2l6ZW9mKE1YRkRlc2NyaXB0b3IpLCBEZXNjcmlwdG9yIH0sIC8qIEFFUzMgKi8KKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4NTMsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4NTEsMHgwMCB9LCBteGZfcmVhZF9nZW5lcmljX2Rlc2NyaXB0b3IsIHNpemVvZihNWEZEZXNjcmlwdG9yKSwgRGVzY3JpcHRvciB9LCAvKiBNUEVHMlZpZGVvRGVzY3JpcHRvciAqLworICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHg1YywweDAwIH0sIG14Zl9yZWFkX2dlbmVyaWNfZGVzY3JpcHRvciwgc2l6ZW9mKE1YRkRlc2NyaXB0b3IpLCBEZXNjcmlwdG9yIH0sIC8qIFZBTkMvVkJJIC0gU01QVEUgNDM2TSAqLworICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHg1ZSwweDAwIH0sIG14Zl9yZWFkX2dlbmVyaWNfZGVzY3JpcHRvciwgc2l6ZW9mKE1YRkRlc2NyaXB0b3IpLCBEZXNjcmlwdG9yIH0sIC8qIE1QRUcyQXVkaW9EZXNjcmlwdG9yICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDUzLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDNBLDB4MDAgfSwgbXhmX3JlYWRfdHJhY2ssIHNpemVvZihNWEZUcmFjayksIFRyYWNrIH0sIC8qIFN0YXRpYyBUcmFjayAqLworICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgzQiwweDAwIH0sIG14Zl9yZWFkX3RyYWNrLCBzaXplb2YoTVhGVHJhY2spLCBUcmFjayB9LCAvKiBHZW5lcmljIFRyYWNrICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDUzLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDE0LDB4MDAgfSwgbXhmX3JlYWRfdGltZWNvZGVfY29tcG9uZW50LCBzaXplb2YoTVhGVGltZWNvZGVDb21wb25lbnQpLCBUaW1lY29kZUNvbXBvbmVudCB9LAorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwYywweDAwIH0sIG14Zl9yZWFkX3B1bGxkb3duX2NvbXBvbmVudCwgc2l6ZW9mKE1YRlB1bGxkb3duQ29tcG9uZW50KSwgUHVsbGRvd25Db21wb25lbnQgfSwKKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4NTMsMHgwMSwweDAxLDB4MGQsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDAsMHgwMCB9LCBteGZfcmVhZF9jcnlwdG9ncmFwaGljX2NvbnRleHQsIHNpemVvZihNWEZDcnlwdG9Db250ZXh0KSwgQ3J5cHRvQ29udGV4dCB9LAorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MTAsMHgwMSwweDAwIH0sIG14Zl9yZWFkX2luZGV4X3RhYmxlX3NlZ21lbnQsIHNpemVvZihNWEZJbmRleFRhYmxlU2VnbWVudCksIEluZGV4VGFibGVTZWdtZW50IH0sCisgICAgeyB7IDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgTlVMTCwgMCwgQW55VHlwZSB9LAorfTsKKworc3RhdGljIGludCBteGZfbWV0YWRhdGFzZXRfaW5pdChNWEZNZXRhZGF0YVNldCAqY3R4LCBlbnVtIE1YRk1ldGFkYXRhU2V0VHlwZSB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSl7CisgICAgY2FzZSBNdWx0aXBsZURlc2NyaXB0b3I6CisgICAgY2FzZSBEZXNjcmlwdG9yOgorICAgICAgICAoKE1YRkRlc2NyaXB0b3IqKWN0eCktPnBpeF9mbXQgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgICAgICgoTVhGRGVzY3JpcHRvciopY3R4KS0+ZHVyYXRpb24gPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX2xvY2FsX3RhZ3MoTVhGQ29udGV4dCAqbXhmLCBLTFZQYWNrZXQgKmtsdiwgTVhGTWV0YWRhdGFSZWFkRnVuYyAqcmVhZF9jaGlsZCwgaW50IGN0eF9zaXplLCBlbnVtIE1YRk1ldGFkYXRhU2V0VHlwZSB0eXBlKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IG14Zi0+ZmMtPnBiOworICAgIE1YRk1ldGFkYXRhU2V0ICpjdHggPSBjdHhfc2l6ZSA/IGF2X21hbGxvY3ooY3R4X3NpemUpIDogbXhmOworICAgIHVpbnQ2NF90IGtsdl9lbmQgPSBhdmlvX3RlbGwocGIpICsga2x2LT5sZW5ndGg7CisKKyAgICBpZiAoIWN0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBteGZfbWV0YWRhdGFzZXRfaW5pdChjdHgsIHR5cGUpOworICAgIHdoaWxlIChhdmlvX3RlbGwocGIpICsgNCA8IGtsdl9lbmQgJiYgIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgaW50IHRhZyA9IGF2aW9fcmIxNihwYik7CisgICAgICAgIGludCBzaXplID0gYXZpb19yYjE2KHBiKTsgLyogS0xWIHNwZWNpZmllZCBieSAweDUzICovCisgICAgICAgIHVpbnQ2NF90IG5leHQgPSBhdmlvX3RlbGwocGIpICsgc2l6ZTsKKyAgICAgICAgVUlEIHVpZCA9IHswfTsKKworICAgICAgICBhdl9kbG9nKG14Zi0+ZmMsICJsb2NhbCB0YWcgJSMwNHggc2l6ZSAlZFxuIiwgdGFnLCBzaXplKTsKKyAgICAgICAgaWYgKCFzaXplKSB7IC8qIGlnbm9yZSBlbXB0eSB0YWcsIG5lZWRlZCBmb3Igc29tZSBmaWxlcyB3aXRoIGVtcHR5IFVNSUQgdGFnICovCisgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLCAibG9jYWwgdGFnICUjMDR4IHdpdGggMCBzaXplXG4iLCB0YWcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhZyA+IDB4N0ZGRikgeyAvKiBkeW5hbWljIHRhZyAqLworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXhmLT5sb2NhbF90YWdzX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgbG9jYWxfdGFnID0gQVZfUkIxNihteGYtPmxvY2FsX3RhZ3MraSoxOCk7CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3RhZyA9PSB0YWcpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHVpZCwgbXhmLT5sb2NhbF90YWdzK2kqMTgrMiwgMTYpOworICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKG14Zi0+ZmMsICJsb2NhbCB0YWcgJSMwNHhcbiIsIGxvY2FsX3RhZyk7CisgICAgICAgICAgICAgICAgICAgIFBSSU5UX0tFWShteGYtPmZjLCAidWlkIiwgdWlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN0eF9zaXplICYmIHRhZyA9PSAweDNDMEEpCisgICAgICAgICAgICBhdmlvX3JlYWQocGIsIGN0eC0+dWlkLCAxNik7CisgICAgICAgIGVsc2UgaWYgKChyZXQgPSByZWFkX2NoaWxkKGN0eCwgcGIsIHRhZywgc2l6ZSwgdWlkLCAtMSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgLyogQWNjZXB0IHRoZSA2NGsgbG9jYWwgc2V0IGxpbWl0IGJlaW5nIGV4Y2VlZGVkIChBdmlkKS4gRG9uJ3QgYWNjZXB0CisgICAgICAgICAqIGl0IGV4dGVuZGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIEtMViB0aG91Z2ggKHp6dWY1Lm14ZikuICovCisgICAgICAgIGlmIChhdmlvX3RlbGwocGIpID4ga2x2X2VuZCkgeworICAgICAgICAgICAgaWYgKGN0eF9zaXplKQorICAgICAgICAgICAgICAgIGF2X2ZyZWUoY3R4KTsKKworICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAibG9jYWwgdGFnICUjMDR4IGV4dGVuZHMgcGFzdCBlbmQgb2YgbG9jYWwgc2V0IEAgJSMiUFJJeDY0IlxuIiwKKyAgICAgICAgICAgICAgICAgICB0YWcsIGtsdi0+b2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9IGVsc2UgaWYgKGF2aW9fdGVsbChwYikgPD0gbmV4dCkgICAvKiBvbmx5IHNlZWsgZm9yd2FyZCwgZWxzZSB0aGlzIGNhbiBsb29wIGZvciBhIGxvbmcgdGltZSAqLworICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBuZXh0LCBTRUVLX1NFVCk7CisgICAgfQorICAgIGlmIChjdHhfc2l6ZSkgY3R4LT50eXBlID0gdHlwZTsKKyAgICByZXR1cm4gY3R4X3NpemUgPyBteGZfYWRkX21ldGFkYXRhX3NldChteGYsIGN0eCkgOiAwOworfQorCisvKioKKyAqIE1hdGNoZXMgYW55IHBhcnRpdGlvbiBwYWNrIGtleSwgaW4gb3RoZXIgd29yZHM6CisgKiAtIEhlYWRlclBhcnRpdGlvbgorICogLSBCb2R5UGFydGl0aW9uCisgKiAtIEZvb3RlclBhcnRpdGlvbgorICogQHJldHVybiBub24temVybyBpZiB0aGUga2V5IGlzIGEgcGFydGl0aW9uIHBhY2sga2V5LCB6ZXJvIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IG14Zl9pc19wYXJ0aXRpb25fcGFja19rZXkoVUlEIGtleSkKK3sKKyAgICAvL05PVEU6IHRoaXMgaXMgYSBsaXR0bGUgbGF4IHNpbmNlIGl0IGRvZXNuJ3QgY29uc3RyYWludCBrZXlbMTRdCisgICAgcmV0dXJuICFtZW1jbXAoa2V5LCBteGZfaGVhZGVyX3BhcnRpdGlvbl9wYWNrX2tleSwgMTMpICYmCisgICAgICAgICAgICBrZXlbMTNdID49IDIgJiYga2V5WzEzXSA8PSA0OworfQorCisvKioKKyAqIFBhcnNlcyBhIG1ldGFkYXRhIEtMVgorICogQHJldHVybiA8MCBvbiBlcnJvciwgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBteGZfcGFyc2Vfa2x2KE1YRkNvbnRleHQgKm14ZiwgS0xWUGFja2V0IGtsdiwgTVhGTWV0YWRhdGFSZWFkRnVuYyAqcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4X3NpemUsIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGUpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpzID0gbXhmLT5mYzsKKyAgICBpbnQgcmVzOworICAgIGlmIChrbHYua2V5WzVdID09IDB4NTMpIHsKKyAgICAgICAgcmVzID0gbXhmX3JlYWRfbG9jYWxfdGFncyhteGYsICZrbHYsIHJlYWQsIGN0eF9zaXplLCB0eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50NjRfdCBuZXh0ID0gYXZpb190ZWxsKHMtPnBiKSArIGtsdi5sZW5ndGg7CisgICAgICAgIHJlcyA9IHJlYWQobXhmLCBzLT5wYiwgMCwga2x2Lmxlbmd0aCwga2x2LmtleSwga2x2Lm9mZnNldCk7CisKKyAgICAgICAgLyogb25seSBzZWVrIGZvcndhcmQsIGVsc2UgdGhpcyBjYW4gbG9vcCBmb3IgYSBsb25nIHRpbWUgKi8KKyAgICAgICAgaWYgKGF2aW9fdGVsbChzLT5wYikgPiBuZXh0KSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicmVhZCBwYXN0IGVuZCBvZiBLTFYgQCAlIyJQUkl4NjQiXG4iLAorICAgICAgICAgICAgICAgICAgIGtsdi5vZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIG5leHQsIFNFRUtfU0VUKTsKKyAgICB9CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImVycm9yIHJlYWRpbmcgaGVhZGVyIG1ldGFkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2Vla3MgdG8gdGhlIHByZXZpb3VzIHBhcnRpdGlvbiBhbmQgcGFyc2VzIGl0LCBpZiBwb3NzaWJsZQorICogQHJldHVybiA8PSAwIGlmIHdlIHNob3VsZCBzdG9wIHBhcnNpbmcsID4gMCBpZiB3ZSBzaG91bGQga2VlcCBnb2luZworICovCitzdGF0aWMgaW50IG14Zl9zZWVrX3RvX3ByZXZpb3VzX3BhcnRpdGlvbihNWEZDb250ZXh0ICpteGYpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gbXhmLT5mYy0+cGI7CisgICAgS0xWUGFja2V0IGtsdjsKKyAgICBpbnQ2NF90IGN1cnJlbnRfcGFydGl0aW9uX29mczsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFteGYtPmN1cnJlbnRfcGFydGl0aW9uIHx8CisgICAgICAgIG14Zi0+cnVuX2luICsgbXhmLT5jdXJyZW50X3BhcnRpdGlvbi0+cHJldmlvdXNfcGFydGl0aW9uIDw9IG14Zi0+bGFzdF9mb3J3YXJkX3RlbGwpCisgICAgICAgIHJldHVybiAwOyAgIC8qIHdlJ3ZlIHBhcnNlZCBhbGwgcGFydGl0aW9ucyAqLworCisgICAgLyogc2VlayB0byBwcmV2aW91cyBwYXJ0aXRpb24gKi8KKyAgICBjdXJyZW50X3BhcnRpdGlvbl9vZnMgPSBteGYtPmN1cnJlbnRfcGFydGl0aW9uLT5wYWNrX29mczsgICAvL2luY2x1ZGVzIHJ1bi1pbgorICAgIGF2aW9fc2VlayhwYiwgbXhmLT5ydW5faW4gKyBteGYtPmN1cnJlbnRfcGFydGl0aW9uLT5wcmV2aW91c19wYXJ0aXRpb24sIFNFRUtfU0VUKTsKKyAgICBteGYtPmN1cnJlbnRfcGFydGl0aW9uID0gTlVMTDsKKworICAgIGF2X2Rsb2cobXhmLT5mYywgInNlZWtpbmcgdG8gcHJldmlvdXMgcGFydGl0aW9uXG4iKTsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGlzIGlzIGFjdHVhbGx5IGEgUGFydGl0aW9uUGFjaywgYW5kIGlmIHNvIHBhcnNlIGl0LgorICAgICAqIFNlZSBkZWFkbG9jazIubXhmCisgICAgICovCisgICAgaWYgKChyZXQgPSBrbHZfcmVhZF9wYWNrZXQoJmtsdiwgcGIpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwgImZhaWxlZCB0byByZWFkIFBhcnRpdGlvblBhY2sgS0xWXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoIW14Zl9pc19wYXJ0aXRpb25fcGFja19rZXkoa2x2LmtleSkpIHsKKyAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwgIlByZXZpb3VzUGFydGl0aW9uIEAgJSIgUFJJeDY0ICIgaXNuJ3QgYSBQYXJ0aXRpb25QYWNrXG4iLCBrbHYub2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogV2UgY2FuJ3QganVzdCBjaGVjayBvZnMgPj0gY3VycmVudF9wYXJ0aXRpb25fb2ZzIGJlY2F1c2UgUHJldmlvdXNQYXJ0aXRpb24KKyAgICAgKiBjYW4gcG9pbnQgdG8ganVzdCBiZWZvcmUgdGhlIGN1cnJlbnQgcGFydGl0aW9uLCBjYXVzaW5nIGtsdl9yZWFkX3BhY2tldCgpCisgICAgICogdG8gc3luYyBiYWNrIHVwIHRvIGl0LiBTZWUgZGVhZGxvY2szLm14ZgorICAgICAqLworICAgIGlmIChrbHYub2Zmc2V0ID49IGN1cnJlbnRfcGFydGl0aW9uX29mcykgeworICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLCAiUHJldmlvdXNQYXJ0aXRpb24gZm9yIFBhcnRpdGlvblBhY2sgQCAlIgorICAgICAgICAgICAgICAgUFJJeDY0ICIgaW5kaXJlY3RseSBwb2ludHMgdG8gaXRzZWxmXG4iLCBjdXJyZW50X3BhcnRpdGlvbl9vZnMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IG14Zl9wYXJzZV9rbHYobXhmLCBrbHYsIG14Zl9yZWFkX3BhcnRpdGlvbl9wYWNrLCAwLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gZXNzZW5jZSBpcyBlbmNvdW50ZXJlZAorICogQHJldHVybiA8PSAwIGlmIHdlIHNob3VsZCBzdG9wIHBhcnNpbmcsID4gMCBpZiB3ZSBzaG91bGQga2VlcCBnb2luZworICovCitzdGF0aWMgaW50IG14Zl9wYXJzZV9oYW5kbGVfZXNzZW5jZShNWEZDb250ZXh0ICpteGYpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gbXhmLT5mYy0+cGI7CisgICAgaW50NjRfdCByZXQ7CisKKyAgICBpZiAobXhmLT5wYXJzaW5nX2JhY2t3YXJkKSB7CisgICAgICAgIHJldHVybiBteGZfc2Vla190b19wcmV2aW91c19wYXJ0aXRpb24obXhmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW14Zi0+Zm9vdGVyX3BhcnRpdGlvbikgeworICAgICAgICAgICAgYXZfZGxvZyhteGYtPmZjLCAibm8gRm9vdGVyUGFydGl0aW9uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgYXZfZGxvZyhteGYtPmZjLCAic2Vla2luZyB0byBGb290ZXJQYXJ0aXRpb25cbiIpOworCisgICAgICAgIC8qIHJlbWVtYmVyIHdoZXJlIHdlIHdlcmUgc28gd2UgZG9uJ3QgZW5kIHVwIHNlZWtpbmcgZnVydGhlciBiYWNrIHRoYW4gdGhpcyAqLworICAgICAgICBteGYtPmxhc3RfZm9yd2FyZF90ZWxsID0gYXZpb190ZWxsKHBiKTsKKworICAgICAgICBpZiAoIXBiLT5zZWVrYWJsZSkgeworICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19JTkZPLCAiZmlsZSBpcyBub3Qgc2Vla2FibGUgLSBub3QgcGFyc2luZyBGb290ZXJQYXJ0aXRpb25cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogc2VlayB0byBGb290ZXJQYXJ0aXRpb24gYW5kIHBhcnNlIGJhY2t3YXJkICovCisgICAgICAgIGlmICgocmV0ID0gYXZpb19zZWVrKHBiLCBteGYtPnJ1bl9pbiArIG14Zi0+Zm9vdGVyX3BhcnRpdGlvbiwgU0VFS19TRVQpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZWVrIHRvIEZvb3RlclBhcnRpdGlvbiBAIDB4JSIgUFJJeDY0CisgICAgICAgICAgICAgICAgICAgIiAoJSJQUklkNjQiKSAtIHBhcnRpYWwgZmlsZT9cbiIsCisgICAgICAgICAgICAgICAgICAgbXhmLT5ydW5faW4gKyBteGYtPmZvb3Rlcl9wYXJ0aXRpb24sIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgbXhmLT5jdXJyZW50X3BhcnRpdGlvbiA9IE5VTEw7CisgICAgICAgIG14Zi0+cGFyc2luZ19iYWNrd2FyZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gdGhlIG5leHQgcGFydGl0aW9uIG9yIEVPRiBpcyBlbmNvdW50ZXJlZAorICogQHJldHVybiA8PSAwIGlmIHdlIHNob3VsZCBzdG9wIHBhcnNpbmcsID4gMCBpZiB3ZSBzaG91bGQga2VlcCBnb2luZworICovCitzdGF0aWMgaW50IG14Zl9wYXJzZV9oYW5kbGVfcGFydGl0aW9uX29yX2VvZihNWEZDb250ZXh0ICpteGYpCit7CisgICAgcmV0dXJuIG14Zi0+cGFyc2luZ19iYWNrd2FyZCA/IG14Zl9zZWVrX3RvX3ByZXZpb3VzX3BhcnRpdGlvbihteGYpIDogMTsKK30KKworLyoqCisgKiBGaWd1cmVzIG91dCB0aGUgcHJvcGVyIG9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBlc3NlbmNlIGNvbnRhaW5lciBpbiBlYWNoIHBhcnRpdGlvbgorICovCitzdGF0aWMgdm9pZCBteGZfY29tcHV0ZV9lc3NlbmNlX2NvbnRhaW5lcnMoTVhGQ29udGV4dCAqbXhmKQoreworICAgIGludCB4OworCisgICAgLyogZXZlcnl0aGluZyBpcyBhbHJlYWR5IGNvcnJlY3QgKi8KKyAgICBpZiAobXhmLT5vcCA9PSBPUEF0b20pCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoeCA9IDA7IHggPCBteGYtPnBhcnRpdGlvbnNfY291bnQ7IHgrKykgeworICAgICAgICBNWEZQYXJ0aXRpb24gKnAgPSAmbXhmLT5wYXJ0aXRpb25zW3hdOworCisgICAgICAgIGlmICghcC0+Ym9keV9zaWQpCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgLyogQm9keVNJRCA9PSAwIC0+IG5vIGVzc2VuY2UgKi8KKworICAgICAgICBpZiAoeCA+PSBteGYtPnBhcnRpdGlvbnNfY291bnQgLSAxKQorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIEZvb3RlclBhcnRpdGlvbiAtIGNhbid0IGNvbXB1dGUgbGVuZ3RoIChhbmQgd2UgZG9uJ3QgbmVlZCB0bykgKi8KKworICAgICAgICAvKiBlc3NlbmNlIGNvbnRhaW5lciBzcGFucyB0byB0aGUgbmV4dCBwYXJ0aXRpb24gKi8KKyAgICAgICAgcC0+ZXNzZW5jZV9sZW5ndGggPSBteGYtPnBhcnRpdGlvbnNbeCsxXS50aGlzX3BhcnRpdGlvbiAtIHAtPmVzc2VuY2Vfb2Zmc2V0OworCisgICAgICAgIGlmIChwLT5lc3NlbmNlX2xlbmd0aCA8IDApIHsKKyAgICAgICAgICAgIC8qIG5leHQgVGhpc1BhcnRpdGlvbiA8IGVzc2VuY2Vfb2Zmc2V0ICovCisgICAgICAgICAgICBwLT5lc3NlbmNlX2xlbmd0aCA9IDA7CisgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJwYXJ0aXRpb24gJWk6IGJhZCBUaGlzUGFydGl0aW9uID0gJSJQUklYNjQiXG4iLAorICAgICAgICAgICAgICAgICAgIHgrMSwgbXhmLT5wYXJ0aXRpb25zW3grMV0udGhpc19wYXJ0aXRpb24pOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50NjRfdCByb3VuZF90b19rYWcoaW50NjRfdCBwb3NpdGlvbiwgaW50IGthZ19zaXplKQoreworICAgIC8qIFRPRE86IGFjY291bnQgZm9yIHJ1bi1pbj8gdGhlIHNwZWMgaXNuJ3QgY2xlYXIgd2hldGhlciBLQUcgc2hvdWxkIGFjY291bnQgZm9yIGl0ICovCisgICAgLyogTk9URToga2FnX3NpemUgbWF5IGJlIGFueSBpbnRlZ2VyIGJldHdlZW4gMSAtIDJeMTAgKi8KKyAgICBpbnQ2NF90IHJldCA9IChwb3NpdGlvbiAvIGthZ19zaXplKSAqIGthZ19zaXplOworICAgIHJldHVybiByZXQgPT0gcG9zaXRpb24gPyByZXQgOiByZXQgKyBrYWdfc2l6ZTsKK30KKworc3RhdGljIGludCBpc19wY20oZW51bSBBVkNvZGVjSUQgY29kZWNfaWQpCit7CisgICAgLyogd2Ugb25seSBjYXJlIGFib3V0ICJub3JtYWwiIFBDTSBjb2RlY3MgdW50aWwgd2UgZ2V0IHNhbXBsZXMgKi8KKyAgICByZXR1cm4gY29kZWNfaWQgPj0gQVZfQ09ERUNfSURfUENNX1MxNkxFICYmIGNvZGVjX2lkIDwgQVZfQ09ERUNfSURfUENNX1MyNERBVUQ7Cit9CisKKy8qKgorICogRGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIGZvciBzb21lIGF1ZGlvIGF0b21zIEVkaXRVbml0Qnl0ZUNvdW50IGlzCisgKiB2ZXJ5IHNtYWxsICgyLCA0Li4pLiBJbiB0aG9zZSBjYXNlcyB3ZSBzaG91bGQgcmVhZCBtb3JlIHRoYW4gb25lCisgKiBzYW1wbGUgcGVyIGNhbGwgdG8gbXhmX3JlYWRfcGFja2V0KCkuCisgKi8KK3N0YXRpYyB2b2lkIG14Zl9oYW5kbGVfc21hbGxfZXViYyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworCisgICAgLyogYXNzdW1pbmcgbm9uLU9QQXRvbSA9PSBmcmFtZSB3cmFwcGVkCisgICAgICogbm8gc2FuZSB3cml0ZXIgd291bGQgd3JhcCAyIGJ5dGUgUENNIHBhY2tldHMgd2l0aCAyMCBieXRlIGhlYWRlcnMuLiAqLworICAgIGlmIChteGYtPm9wICE9IE9QQXRvbSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogZXhwZWN0IFBDTSB3aXRoIGV4YWN0bHkgb25lIGluZGV4IHRhYmxlIHNlZ21lbnQgYW5kIGEgc21hbGwgKDwgMzIpIEVVQkMgKi8KKyAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyB8fAorICAgICAgICAhaXNfcGNtKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY19pZCkgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgbXhmLT5uYl9pbmRleF90YWJsZXMgIT0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgIG14Zi0+aW5kZXhfdGFibGVzWzBdLm5iX3NlZ21lbnRzICE9IDEgICAgICAgICAgICAgICAgICB8fAorICAgICAgICBteGYtPmluZGV4X3RhYmxlc1swXS5zZWdtZW50c1swXS0+ZWRpdF91bml0X2J5dGVfY291bnQgPj0gMzIpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIGFyYml0cmFyaWx5IGRlZmF1bHQgdG8gNDgga0h6IFBBTCBhdWRpbyBmcmFtZSBzaXplICovCisgICAgLyogVE9ETzogV2UgY291bGQgY29tcHV0ZSB0aGlzIGZyb20gdGhlIHJhdGlvIGJldHdlZW4gdGhlIGF1ZGlvCisgICAgICogICAgICAgYW5kIHZpZGVvIGVkaXQgcmF0ZXMgZm9yIDQ4IGtIeiBOVFNDIHdlIGNvdWxkIHVzZSB0aGUKKyAgICAgKiAgICAgICAxODAyLTE4MDItMTgwMi0xODAyLTE4MDEgcGF0dGVybi4gKi8KKyAgICBteGYtPmVkaXRfdW5pdHNfcGVyX3BhY2tldCA9IDE5MjA7Cit9CisKK3N0YXRpYyB2b2lkIG14Zl9yZWFkX3JhbmRvbV9pbmRleF9wYWNrKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBzLT5wcml2X2RhdGE7CisgICAgdWludDMyX3QgbGVuZ3RoOworICAgIGludDY0X3QgZmlsZV9zaXplLCBtYXhfcmlwX2xlbmd0aCwgbWluX3JpcF9sZW5ndGg7CisgICAgS0xWUGFja2V0IGtsdjsKKworICAgIGlmICghcy0+cGItPnNlZWthYmxlKQorICAgICAgICByZXR1cm47CisKKyAgICBmaWxlX3NpemUgPSBhdmlvX3NpemUocy0+cGIpOworCisgICAgLyogUzM3N20gc2F5cyB0byBjaGVjayB0aGUgUklQIGxlbmd0aCBmb3IgInNpbGx5IiB2YWx1ZXMsIHdpdGhvdXQgZGVmaW5pbmcgInNpbGx5Ii4KKyAgICAgKiBUaGUgbGltaXQgYmVsb3cgYXNzdW1lcyBhIGZpbGUgd2l0aCBub3RoaW5nIGJ1dCBwYXJ0aXRpb24gcGFja3MgYW5kIGEgUklQLgorICAgICAqIEJlZm9yZSBjaGFuZ2luZyB0aGlzLCBjb25zaWRlciB0aGF0IGEgbXV4ZXIgbWF5IHBsYWNlIGVhY2ggc2FtcGxlIGluIGl0cyBvd24gcGFydGl0aW9uLgorICAgICAqCisgICAgICogMTA1IGlzIHRoZSBzaXplIG9mIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBQYXJ0aXRpb25QYWNrCisgICAgICogMTIgaXMgdGhlIHNpemUgb2YgZWFjaCBSSVAgZW50cnkKKyAgICAgKiAyOCBpcyB0aGUgc2l6ZSBvZiB0aGUgUklQIGhlYWRlciBhbmQgZm9vdGVyLCBhc3N1bWluZyBhbiA4LWJ5dGUgQkVSCisgICAgICovCisgICAgbWF4X3JpcF9sZW5ndGggPSAoKGZpbGVfc2l6ZSAtIG14Zi0+cnVuX2luKSAvIDEwNSkgKiAxMiArIDI4OworICAgIG1heF9yaXBfbGVuZ3RoID0gRkZNSU4obWF4X3JpcF9sZW5ndGgsIElOVF9NQVgpOyAvLzIgR2lCIGFuZCB1cCBpcyBhbHNvIHNpbGx5CisKKyAgICAvKiBXZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gUklQcyB3aXRoIGF0IGxlYXN0IHR3byBlbnRyaWVzLi4gKi8KKyAgICBtaW5fcmlwX2xlbmd0aCA9IDE2KzErMjQrNDsKKworICAgIC8qIFNlZSBTMzc3bSBzZWN0aW9uIDExICovCisgICAgYXZpb19zZWVrKHMtPnBiLCBmaWxlX3NpemUgLSA0LCBTRUVLX1NFVCk7CisgICAgbGVuZ3RoID0gYXZpb19yYjMyKHMtPnBiKTsKKworICAgIGlmIChsZW5ndGggPCBtaW5fcmlwX2xlbmd0aCB8fCBsZW5ndGggPiBtYXhfcmlwX2xlbmd0aCkKKyAgICAgICAgZ290byBlbmQ7CisgICAgYXZpb19zZWVrKHMtPnBiLCBmaWxlX3NpemUgLSBsZW5ndGgsIFNFRUtfU0VUKTsKKyAgICBpZiAoa2x2X3JlYWRfcGFja2V0KCZrbHYsIHMtPnBiKSA8IDAgfHwKKyAgICAgICAgIUlTX0tMVl9LRVkoa2x2LmtleSwgbXhmX3JhbmRvbV9pbmRleF9wYWNrX2tleSkgfHwKKyAgICAgICAga2x2Lmxlbmd0aCAhPSBsZW5ndGggLSAyMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBhdmlvX3NraXAocy0+cGIsIGtsdi5sZW5ndGggLSAxMik7CisgICAgbXhmLT5mb290ZXJfcGFydGl0aW9uID0gYXZpb19yYjY0KHMtPnBiKTsKKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmIChteGYtPnJ1bl9pbiArIG14Zi0+Zm9vdGVyX3BhcnRpdGlvbiA+PSBmaWxlX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiYmFkIEZvb3RlclBhcnRpdGlvbiBpbiBSSVAgLSBpZ25vcmluZ1xuIik7CisgICAgICAgIG14Zi0+Zm9vdGVyX3BhcnRpdGlvbiA9IDA7CisgICAgfQorCitlbmQ6CisgICAgYXZpb19zZWVrKHMtPnBiLCBteGYtPnJ1bl9pbiwgU0VFS19TRVQpOworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIEtMVlBhY2tldCBrbHY7CisgICAgaW50NjRfdCBlc3NlbmNlX29mZnNldCA9IDA7CisgICAgaW50IHJldDsKKworICAgIG14Zi0+bGFzdF9mb3J3YXJkX3RlbGwgPSBJTlQ2NF9NQVg7CisgICAgbXhmLT5lZGl0X3VuaXRzX3Blcl9wYWNrZXQgPSAxOworCisgICAgaWYgKCFteGZfcmVhZF9zeW5jKHMtPnBiLCBteGZfaGVhZGVyX3BhcnRpdGlvbl9wYWNrX2tleSwgMTQpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgZmluZCBoZWFkZXIgcGFydGl0aW9uIHBhY2sga2V5XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2aW9fc2VlayhzLT5wYiwgLTE0LCBTRUVLX0NVUik7CisgICAgbXhmLT5mYyA9IHM7CisgICAgbXhmLT5ydW5faW4gPSBhdmlvX3RlbGwocy0+cGIpOworCisgICAgbXhmX3JlYWRfcmFuZG9tX2luZGV4X3BhY2socyk7CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihzLT5wYikpIHsKKyAgICAgICAgY29uc3QgTVhGTWV0YWRhdGFSZWFkVGFibGVFbnRyeSAqbWV0YWRhdGE7CisKKyAgICAgICAgaWYgKGtsdl9yZWFkX3BhY2tldCgma2x2LCBzLT5wYikgPCAwKSB7CisgICAgICAgICAgICAvKiBFT0YgLSBzZWVrIHRvIHByZXZpb3VzIHBhcnRpdGlvbiBvciBzdG9wICovCisgICAgICAgICAgICBpZihteGZfcGFyc2VfaGFuZGxlX3BhcnRpdGlvbl9vcl9lb2YobXhmKSA8PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgUFJJTlRfS0VZKHMsICJyZWFkIGhlYWRlciIsIGtsdi5rZXkpOworICAgICAgICBhdl9kbG9nKHMsICJzaXplICUiUFJJdTY0IiBvZmZzZXQgJSMiUFJJeDY0IlxuIiwga2x2Lmxlbmd0aCwga2x2Lm9mZnNldCk7CisgICAgICAgIGlmIChJU19LTFZfS0VZKGtsdi5rZXksIG14Zl9lbmNyeXB0ZWRfdHJpcGxldF9rZXkpIHx8CisgICAgICAgICAgICBJU19LTFZfS0VZKGtsdi5rZXksIG14Zl9lc3NlbmNlX2VsZW1lbnRfa2V5KSB8fAorICAgICAgICAgICAgSVNfS0xWX0tFWShrbHYua2V5LCBteGZfYXZpZF9lc3NlbmNlX2VsZW1lbnRfa2V5KSB8fAorICAgICAgICAgICAgSVNfS0xWX0tFWShrbHYua2V5LCBteGZfc3lzdGVtX2l0ZW1fa2V5KSkgeworCisgICAgICAgICAgICBpZiAoIW14Zi0+Y3VycmVudF9wYXJ0aXRpb24pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLCAiZm91bmQgZXNzZW5jZSBwcmlvciB0byBmaXJzdCBQYXJ0aXRpb25QYWNrXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFteGYtPmN1cnJlbnRfcGFydGl0aW9uLT5lc3NlbmNlX29mZnNldCkgeworICAgICAgICAgICAgICAgIC8qIGZvciBPUDFhIHdlIGNvbXB1dGUgZXNzZW5jZV9vZmZzZXQKKyAgICAgICAgICAgICAgICAgKiBmb3IgT1BBdG9tIHdlIHBvaW50IGVzc2VuY2Vfb2Zmc2V0IGFmdGVyIHRoZSBLTCAodXN1YWxseSBvcDFhX2Vzc2VuY2Vfb2Zmc2V0ICsgMjAgb3IgMjUpCisgICAgICAgICAgICAgICAgICogVE9ETzogZm9yIE9QMWEgd2UgY291bGQgZWxpbWluYXRlIHRoaXMgZW50aXJlIGlmIHN0YXRlbWVudCwgYWx3YXlzIHN0b3BwaW5nIHBhcnNpbmcgYXQgb3AxYV9lc3NlbmNlX29mZnNldAorICAgICAgICAgICAgICAgICAqICAgICAgIGZvciBPUEF0b20gd2Ugc3RpbGwgbmVlZCB0aGUgYWN0dWFsIGVzc2VuY2Vfb2Zmc2V0IHRob3VnaCAodGhlIEtMJ3MgbGVuZ3RoIGNhbiB2YXJ5KQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGludDY0X3Qgb3AxYV9lc3NlbmNlX29mZnNldCA9CisgICAgICAgICAgICAgICAgICAgIHJvdW5kX3RvX2thZyhteGYtPmN1cnJlbnRfcGFydGl0aW9uLT50aGlzX3BhcnRpdGlvbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteGYtPmN1cnJlbnRfcGFydGl0aW9uLT5wYWNrX2xlbmd0aCwgICAgICAgbXhmLT5jdXJyZW50X3BhcnRpdGlvbi0+a2FnX3NpemUpICsKKyAgICAgICAgICAgICAgICAgICAgcm91bmRfdG9fa2FnKG14Zi0+Y3VycmVudF9wYXJ0aXRpb24tPmhlYWRlcl9ieXRlX2NvdW50LCBteGYtPmN1cnJlbnRfcGFydGl0aW9uLT5rYWdfc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICByb3VuZF90b19rYWcobXhmLT5jdXJyZW50X3BhcnRpdGlvbi0+aW5kZXhfYnl0ZV9jb3VudCwgIG14Zi0+Y3VycmVudF9wYXJ0aXRpb24tPmthZ19zaXplKTsKKworICAgICAgICAgICAgICAgIGlmIChteGYtPm9wID09IE9QQXRvbSkgeworICAgICAgICAgICAgICAgICAgICAvKiBwb2ludCBlc3NlbmNlX29mZnNldCB0byB0aGUgYWN0dWFsIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgKiBPUEF0b20gaGFzIGFsbCB0aGUgZXNzZW5jZSBpbiBvbmUgYmlnIEtMVgorICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBteGYtPmN1cnJlbnRfcGFydGl0aW9uLT5lc3NlbmNlX29mZnNldCA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgICAgICAgICAgICAgIG14Zi0+Y3VycmVudF9wYXJ0aXRpb24tPmVzc2VuY2VfbGVuZ3RoID0ga2x2Lmxlbmd0aDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBOT1RFOiBvcDFhX2Vzc2VuY2Vfb2Zmc2V0IG1heSBiZSBsZXNzIHRoYW4gdG8ga2x2Lm9mZnNldCAoQzAwMjNTMDEubXhmKSAgKi8KKyAgICAgICAgICAgICAgICAgICAgbXhmLT5jdXJyZW50X3BhcnRpdGlvbi0+ZXNzZW5jZV9vZmZzZXQgPSBvcDFhX2Vzc2VuY2Vfb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFlc3NlbmNlX29mZnNldCkKKyAgICAgICAgICAgICAgICBlc3NlbmNlX29mZnNldCA9IGtsdi5vZmZzZXQ7CisKKyAgICAgICAgICAgIC8qIHNlZWsgdG8gZm9vdGVyLCBwcmV2aW91cyBwYXJ0aXRpb24gb3Igc3RvcCAqLworICAgICAgICAgICAgaWYgKG14Zl9wYXJzZV9oYW5kbGVfZXNzZW5jZShteGYpIDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChteGZfaXNfcGFydGl0aW9uX3BhY2tfa2V5KGtsdi5rZXkpICYmIG14Zi0+Y3VycmVudF9wYXJ0aXRpb24pIHsKKyAgICAgICAgICAgIC8qIG5leHQgcGFydGl0aW9uIHBhY2sgLSBrZWVwIGdvaW5nLCBzZWVrIHRvIHByZXZpb3VzIHBhcnRpdGlvbiBvciBzdG9wICovCisgICAgICAgICAgICBpZihteGZfcGFyc2VfaGFuZGxlX3BhcnRpdGlvbl9vcl9lb2YobXhmKSA8PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZSBpZiAobXhmLT5wYXJzaW5nX2JhY2t3YXJkKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgLyogd2UncmUgc3RpbGwgcGFyc2luZyBmb3J3YXJkLiBwcm9jZWVkIHRvIHBhcnNpbmcgdGhpcyBwYXJ0aXRpb24gcGFjayAqLworICAgICAgICB9CisKKyAgICAgICAgZm9yIChtZXRhZGF0YSA9IG14Zl9tZXRhZGF0YV9yZWFkX3RhYmxlOyBtZXRhZGF0YS0+cmVhZDsgbWV0YWRhdGErKykgeworICAgICAgICAgICAgaWYgKElTX0tMVl9LRVkoa2x2LmtleSwgbWV0YWRhdGEtPmtleSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IG14Zl9wYXJzZV9rbHYobXhmLCBrbHYsIG1ldGFkYXRhLT5yZWFkLCBtZXRhZGF0YS0+Y3R4X3NpemUsIG1ldGFkYXRhLT50eXBlKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgIkRhcmsga2V5ICIgUFJJeFVJRCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBVSURfQVJHKGtsdi5rZXkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1ldGFkYXRhLT5yZWFkKQorICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCBrbHYubGVuZ3RoKTsKKyAgICB9CisgICAgLyogRklYTUUgYXZvaWQgc2VlayAqLworICAgIGlmICghZXNzZW5jZV9vZmZzZXQpICB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJubyBlc3NlbmNlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2aW9fc2VlayhzLT5wYiwgZXNzZW5jZV9vZmZzZXQsIFNFRUtfU0VUKTsKKworICAgIG14Zl9jb21wdXRlX2Vzc2VuY2VfY29udGFpbmVycyhteGYpOworCisgICAgLyogd2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSBjb21wdXRpbmcgdGhlIGluZGV4IHRhYmxlcworICAgICAqIHRvIGJlIGFibGUgdG8gZmlsbCBpbiB6ZXJvIEluZGV4RHVyYXRpb25zIHdpdGggc3QtPmR1cmF0aW9uICovCisgICAgaWYgKChyZXQgPSBteGZfcGFyc2Vfc3RydWN0dXJhbF9tZXRhZGF0YShteGYpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmICgocmV0ID0gbXhmX2NvbXB1dGVfaW5kZXhfdGFibGVzKG14ZikpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKG14Zi0+bmJfaW5kZXhfdGFibGVzID4gMSkgeworICAgICAgICAvKiBUT0RPOiBsb29rIHVwIHdoaWNoIEluZGV4U0lEIHRvIHVzZSB2aWEgRXNzZW5jZUNvbnRhaW5lckRhdGEgKi8KKyAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19JTkZPLCAiZ290ICVpIGluZGV4IHRhYmxlcyAtIG9ubHkgdGhlIGZpcnN0IG9uZSAoSW5kZXhTSUQgJWkpIHdpbGwgYmUgdXNlZFxuIiwKKyAgICAgICAgICAgICAgIG14Zi0+bmJfaW5kZXhfdGFibGVzLCBteGYtPmluZGV4X3RhYmxlc1swXS5pbmRleF9zaWQpOworICAgIH0gZWxzZSBpZiAobXhmLT5uYl9pbmRleF90YWJsZXMgPT0gMCAmJiBteGYtPm9wID09IE9QQXRvbSkgeworICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLCAiY2Fubm90IGRlbXV4IE9QQXRvbSB3aXRob3V0IGFuIGluZGV4XG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG14Zl9oYW5kbGVfc21hbGxfZXViYyhzKTsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBteGZfcmVhZF9jbG9zZShzKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogU2V0cyBteGYtPmN1cnJlbnRfZWRpdF91bml0IGJhc2VkIG9uIHdoYXQgb2Zmc2V0IHdlJ3JlIGN1cnJlbnRseSBhdC4KKyAqIEByZXR1cm4gbmV4dF9vZnMgaWYgT0ssIDwwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQ2NF90IG14Zl9zZXRfY3VycmVudF9lZGl0X3VuaXQoTVhGQ29udGV4dCAqbXhmLCBpbnQ2NF90IGN1cnJlbnRfb2Zmc2V0KQoreworICAgIGludDY0X3QgbGFzdF9vZnMgPSAtMSwgbmV4dF9vZnMgPSAtMTsKKyAgICBNWEZJbmRleFRhYmxlICp0ID0gJm14Zi0+aW5kZXhfdGFibGVzWzBdOworCisgICAgLyogdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgT1AxYSBkZW11eGluZyBsb2dpYywgd2hpY2ggbWVhbnMgdGhlcmUKKyAgICAgKiBtYXkgYmUgbm8gaW5kZXggdGFibGVzICovCisgICAgaWYgKG14Zi0+bmJfaW5kZXhfdGFibGVzIDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGZpbmQgbXhmLT5jdXJyZW50X2VkaXRfdW5pdCBzbyB0aGF0IHRoZSBuZXh0IGVkaXQgdW5pdCBzdGFydHMgYWhlYWQgb2YgY3VycmVudF9vZmZzZXQgKi8KKyAgICB3aGlsZSAobXhmLT5jdXJyZW50X2VkaXRfdW5pdCA+PSAwKSB7CisgICAgICAgIGlmIChteGZfZWRpdF91bml0X2Fic29sdXRlX29mZnNldChteGYsIHQsIG14Zi0+Y3VycmVudF9lZGl0X3VuaXQgKyAxLCBOVUxMLCAmbmV4dF9vZnMsIDApIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZiAobmV4dF9vZnMgPD0gbGFzdF9vZnMpIHsKKyAgICAgICAgICAgIC8qIGxhcmdlIG5leHRfb2ZzIGRpZG4ndCBjaGFuZ2Ugb3IgY3VycmVudF9lZGl0X3VuaXQgd3JhcHBlZAorICAgICAgICAgICAgICogYXJvdW5kIHRoaXMgZml4ZXMgdGhlIGluZmluaXRlIGxvb3Agb24genp1ZjMubXhmICovCisgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJuZXh0X29mcyBkaWRuJ3QgY2hhbmdlLiBub3QgZGVyaXZpbmcgcGFja2V0IHRpbWVzdGFtcHNcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5leHRfb2ZzID4gY3VycmVudF9vZmZzZXQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBsYXN0X29mcyA9IG5leHRfb2ZzOworICAgICAgICBteGYtPmN1cnJlbnRfZWRpdF91bml0Kys7CisgICAgfQorCisgICAgLyogbm90IGNoZWNraW5nIG14Zi0+Y3VycmVudF9lZGl0X3VuaXQgPj0gdC0+bmJfcHRzZXMgaGVyZSBzaW5jZSBDQlIgZmlsZXMgbWF5IGxhY2sgSW5kZXhFbnRyeUFycmF5cyAqLworICAgIGlmIChteGYtPmN1cnJlbnRfZWRpdF91bml0IDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIG5leHRfb2ZzOworfQorCitzdGF0aWMgaW50IG14Zl9jb21wdXRlX3NhbXBsZV9jb3VudChNWEZDb250ZXh0ICpteGYsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqc2FtcGxlX2NvdW50KQoreworICAgIGludCBpLCB0b3RhbCA9IDAsIHNpemUgPSAwOworICAgIEFWU3RyZWFtICpzdCA9IG14Zi0+ZmMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKKyAgICBNWEZUcmFjayAqdHJhY2sgPSBzdC0+cHJpdl9kYXRhOworICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlID0gYXZfaW52X3EodHJhY2stPmVkaXRfcmF0ZSk7CisgICAgQVZSYXRpb25hbCBzYW1wbGVfcmF0ZSA9IGF2X2ludl9xKHN0LT50aW1lX2Jhc2UpOworICAgIGNvbnN0IE1YRlNhbXBsZXNQZXJGcmFtZSAqc3BmID0gTlVMTDsKKworICAgIGlmICgoc2FtcGxlX3JhdGUubnVtIC8gc2FtcGxlX3JhdGUuZGVuKSA9PSA0ODAwMCkKKyAgICAgICAgc3BmID0gZmZfbXhmX2dldF9zYW1wbGVzX3Blcl9mcmFtZShteGYtPmZjLCB0aW1lX2Jhc2UpOworICAgIGlmICghc3BmKSB7CisgICAgICAgIGludCByZW1haW5kZXIgPSAoc2FtcGxlX3JhdGUubnVtICogdGltZV9iYXNlLm51bSkgJQorICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVfYmFzZS5kZW4gKiBzYW1wbGVfcmF0ZS5kZW4pOworICAgICAgICAqc2FtcGxlX2NvdW50ID0gYXZfcTJkKGF2X211bF9xKChBVlJhdGlvbmFsKXtteGYtPmN1cnJlbnRfZWRpdF91bml0LCAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9tdWxfcShzYW1wbGVfcmF0ZSwgdGltZV9iYXNlKSkpOworICAgICAgICBpZiAocmVtYWluZGVyKQorICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJzZWVraW5nIGRldGVjdGVkIG9uIHN0cmVhbSAjJWQgd2l0aCB0aW1lIGJhc2UgKCVkLyVkKSBhbmQgIgorICAgICAgICAgICAgICAgICAgICJzYW1wbGUgcmF0ZSAoJWQvJWQpLCBhdWRpbyBwdHMgd29uJ3QgYmUgYWNjdXJhdGUuXG4iLAorICAgICAgICAgICAgICAgICAgIHN0cmVhbV9pbmRleCwgdGltZV9iYXNlLm51bSwgdGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZS5udW0sIHNhbXBsZV9yYXRlLmRlbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHdoaWxlIChzcGYtPnNhbXBsZXNfcGVyX2ZyYW1lW3NpemVdKSB7CisgICAgICAgIHRvdGFsICs9IHNwZi0+c2FtcGxlc19wZXJfZnJhbWVbc2l6ZV07CisgICAgICAgIHNpemUrKzsKKyAgICB9CisKKyAgICBhdl9hc3NlcnQyKHNpemUpOworCisgICAgKnNhbXBsZV9jb3VudCA9IChteGYtPmN1cnJlbnRfZWRpdF91bml0IC8gc2l6ZSkgKiAodWludDY0X3QpdG90YWw7CisgICAgZm9yIChpID0gMDsgaSA8IG14Zi0+Y3VycmVudF9lZGl0X3VuaXQgJSBzaXplOyBpKyspIHsKKyAgICAgICAgKnNhbXBsZV9jb3VudCArPSBzcGYtPnNhbXBsZXNfcGVyX2ZyYW1lW2ldOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9zZXRfYXVkaW9fcHRzKE1YRkNvbnRleHQgKm14ZiwgQVZDb2RlY0NvbnRleHQgKmNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIE1YRlRyYWNrICp0cmFjayA9IG14Zi0+ZmMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBiaXRzX3Blcl9zYW1wbGUgPSBjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworCisgICAgaWYgKCFiaXRzX3Blcl9zYW1wbGUpCisgICAgICAgIGJpdHNfcGVyX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoY29kZWMtPmNvZGVjX2lkKTsKKworICAgIHBrdC0+cHRzID0gdHJhY2stPnNhbXBsZV9jb3VudDsKKworICAgIGlmICggICBjb2RlYy0+Y2hhbm5lbHMgPD0gMAorICAgICAgICB8fCBiaXRzX3Blcl9zYW1wbGUgPD0gMAorICAgICAgICB8fCBjb2RlYy0+Y2hhbm5lbHMgKiAoaW50NjRfdCliaXRzX3Blcl9zYW1wbGUgPCA4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIHRyYWNrLT5zYW1wbGVfY291bnQgKz0gcGt0LT5zaXplIC8gKGNvZGVjLT5jaGFubmVscyAqIChpbnQ2NF90KWJpdHNfcGVyX3NhbXBsZSAvIDgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9yZWFkX3BhY2tldF9vbGQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEtMVlBhY2tldCBrbHY7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICB3aGlsZSAoKHJldCA9IGtsdl9yZWFkX3BhY2tldCgma2x2LCBzLT5wYikpID09IDApIHsKKyAgICAgICAgUFJJTlRfS0VZKHMsICJyZWFkIHBhY2tldCIsIGtsdi5rZXkpOworICAgICAgICBhdl9kbG9nKHMsICJzaXplICUiUFJJdTY0IiBvZmZzZXQgJSMiUFJJeDY0IlxuIiwga2x2Lmxlbmd0aCwga2x2Lm9mZnNldCk7CisgICAgICAgIGlmIChJU19LTFZfS0VZKGtsdi5rZXksIG14Zl9lbmNyeXB0ZWRfdHJpcGxldF9rZXkpKSB7CisgICAgICAgICAgICByZXQgPSBteGZfZGVjcnlwdF90cmlwbGV0KHMsIHBrdCwgJmtsdik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGVuY29kZWQgdHJpcGxldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChJU19LTFZfS0VZKGtsdi5rZXksIG14Zl9lc3NlbmNlX2VsZW1lbnRfa2V5KSB8fAorICAgICAgICAgICAgSVNfS0xWX0tFWShrbHYua2V5LCBteGZfYXZpZF9lc3NlbmNlX2VsZW1lbnRfa2V5KSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gbXhmX2dldF9zdHJlYW1faW5kZXgocywgJmtsdik7CisgICAgICAgICAgICBpbnQ2NF90IG5leHRfb2ZzLCBuZXh0X2tsdjsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdDsKKyAgICAgICAgICAgIE1YRlRyYWNrICp0cmFjazsKKyAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYzsKKworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBnZXR0aW5nIHN0cmVhbSBpbmRleCAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIEFWX1JCMzIoa2x2LmtleSArIDEyKSk7CisgICAgICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaW5kZXhdOworICAgICAgICAgICAgdHJhY2sgPSBzdC0+cHJpdl9kYXRhOworCisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpbmRleF0tPmRpc2NhcmQgPT0gQVZESVNDQVJEX0FMTCkKKyAgICAgICAgICAgICAgICBnb3RvIHNraXA7CisKKyAgICAgICAgICAgIG5leHRfa2x2ID0gYXZpb190ZWxsKHMtPnBiKSArIGtsdi5sZW5ndGg7CisgICAgICAgICAgICBuZXh0X29mcyA9IG14Zl9zZXRfY3VycmVudF9lZGl0X3VuaXQobXhmLCBrbHYub2Zmc2V0KTsKKworICAgICAgICAgICAgaWYgKG5leHRfb2ZzID49IDAgJiYgbmV4dF9rbHYgPiBuZXh0X29mcykgeworICAgICAgICAgICAgICAgIC8qIGlmIHRoaXMgY2hlY2sgaXMgaGl0IHRoZW4gaXQncyBwb3NzaWJsZSBPUEF0b20gd2FzIHRyZWF0ZWQgYXMgT1AxYQorICAgICAgICAgICAgICAgICAqIHRydW5jYXRlIHRoZSBwYWNrZXQgc2luY2UgaXQncyBwcm9iYWJseSB2ZXJ5IGxhcmdlICg+MiBHaUIgaXMgY29tbW9uKSAqLworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1BBdG9tIG1pc2ludGVycHJldGVkIGFzIE9QMWE/IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0xWIGZvciBlZGl0IHVuaXQgJWkgZXh0ZW5kaW5nIGludG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV4dCBlZGl0IHVuaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteGYtPmN1cnJlbnRfZWRpdF91bml0KTsKKyAgICAgICAgICAgICAgICBrbHYubGVuZ3RoID0gbmV4dF9vZnMgLSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgOCBjaGFubmVscyBBRVMzIGVsZW1lbnQgKi8KKyAgICAgICAgICAgIGlmIChrbHYua2V5WzEyXSA9PSAweDA2ICYmIGtsdi5rZXlbMTNdID09IDB4MDEgJiYga2x2LmtleVsxNF0gPT0gMHgxMCkgeworICAgICAgICAgICAgICAgIHJldCA9IG14Zl9nZXRfZDEwX2FlczNfcGFja2V0KHMtPnBiLCBzLT5zdHJlYW1zW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QsIGtsdi5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJlcnJvciByZWFkaW5nIEQtMTAgYWVzMyBmcmFtZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIGtsdi5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIHBrdC0+cG9zID0ga2x2Lm9mZnNldDsKKworICAgICAgICAgICAgY29kZWMgPSBzdC0+Y29kZWM7CisKKyAgICAgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgbmV4dF9vZnMgPj0gMCkgeworICAgICAgICAgICAgICAgIC8qIG14Zi0+Y3VycmVudF9lZGl0X3VuaXQgZ29vZCAtIHNlZSBpZiB3ZSBoYXZlIGFuCisgICAgICAgICAgICAgICAgICogaW5kZXggdGFibGUgdG8gZGVyaXZlIHRpbWVzdGFtcHMgZnJvbSAqLworICAgICAgICAgICAgICAgIE1YRkluZGV4VGFibGUgKnQgPSAmbXhmLT5pbmRleF90YWJsZXNbMF07CisKKyAgICAgICAgICAgICAgICBpZiAobXhmLT5uYl9pbmRleF90YWJsZXMgPj0gMSAmJiBteGYtPmN1cnJlbnRfZWRpdF91bml0IDwgdC0+bmJfcHRzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5kdHMgPSBteGYtPmN1cnJlbnRfZWRpdF91bml0ICsgdC0+Zmlyc3RfZHRzOworICAgICAgICAgICAgICAgICAgICBwa3QtPnB0cyA9IHQtPnB0c2VzW214Zi0+Y3VycmVudF9lZGl0X3VuaXRdOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmludHJhX29ubHkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaW50cmEtb25seSAtPiBQVFMgPSBFZGl0VW5pdC4KKyAgICAgICAgICAgICAgICAgICAgICogbGV0IHV0aWxzLmMgZmlndXJlIG91dCBEVFMgc2luY2UgaXQgY2FuIGJlIDwgUFRTIGlmIGxvd19kZWxheSA9IDAgKFNvbnkgSU1YMzApICovCisgICAgICAgICAgICAgICAgICAgIHBrdC0+cHRzID0gbXhmLT5jdXJyZW50X2VkaXRfdW5pdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgICAgIHJldCA9IG14Zl9zZXRfYXVkaW9fcHRzKG14ZiwgY29kZWMsIHBrdCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHNlZWsgZm9yIHRydW5jYXRlZCBwYWNrZXRzICovCisgICAgICAgICAgICBhdmlvX3NlZWsocy0+cGIsIG5leHRfa2x2LCBTRUVLX1NFVCk7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgc2tpcDoKKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwga2x2Lmxlbmd0aCk7CisgICAgfQorICAgIHJldHVybiBhdmlvX2Zlb2Yocy0+cGIpID8gQVZFUlJPUl9FT0YgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhmX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldCwgc2l6ZTsKKyAgICBpbnQ2NF90IHJldDY0LCBwb3MsIG5leHRfcG9zOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBNWEZJbmRleFRhYmxlICp0OworICAgIGludCBlZGl0X3VuaXRzOworCisgICAgaWYgKG14Zi0+b3AgIT0gT1BBdG9tKQorICAgICAgICByZXR1cm4gbXhmX3JlYWRfcGFja2V0X29sZChzLCBwa3QpOworCisgICAgLyogT1BBdG9tIC0gY2xpcCB3cmFwcGVkIGRlbXV4aW5nICovCisgICAgLyogTk9URTogbXhmX3JlYWRfaGVhZGVyKCkgbWFrZXMgc3VyZSBuYl9pbmRleF90YWJsZXMgPiAwIGZvciBPUEF0b20gKi8KKyAgICBzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgdCA9ICZteGYtPmluZGV4X3RhYmxlc1swXTsKKworICAgIGlmIChteGYtPmN1cnJlbnRfZWRpdF91bml0ID49IHN0LT5kdXJhdGlvbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgZWRpdF91bml0cyA9IEZGTUlOKG14Zi0+ZWRpdF91bml0c19wZXJfcGFja2V0LCBzdC0+ZHVyYXRpb24gLSBteGYtPmN1cnJlbnRfZWRpdF91bml0KTsKKworICAgIGlmICgocmV0ID0gbXhmX2VkaXRfdW5pdF9hYnNvbHV0ZV9vZmZzZXQobXhmLCB0LCBteGYtPmN1cnJlbnRfZWRpdF91bml0LCBOVUxMLCAmcG9zLCAxKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogY29tcHV0ZSBzaXplIGJ5IGZpbmRpbmcgdGhlIG5leHQgZWRpdCB1bml0IG9yIHRoZSBlbmQgb2YgdGhlIGVzc2VuY2UgY29udGFpbmVyCisgICAgICogbm90IHByZXR0eSwgYnV0IGl0IHdvcmtzICovCisgICAgaWYgKChyZXQgPSBteGZfZWRpdF91bml0X2Fic29sdXRlX29mZnNldChteGYsIHQsIG14Zi0+Y3VycmVudF9lZGl0X3VuaXQgKyBlZGl0X3VuaXRzLCBOVUxMLCAmbmV4dF9wb3MsIDApKSA8IDAgJiYKKyAgICAgICAgKG5leHRfcG9zID0gbXhmX2Vzc2VuY2VfY29udGFpbmVyX2VuZChteGYsIHQtPmJvZHlfc2lkKSkgPD0gMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5hYmxlIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGxhc3QgcGFja2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChzaXplID0gbmV4dF9wb3MgLSBwb3MpIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImJhZCBzaXplOiAlaVxuIiwgc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0NjQgPSBhdmlvX3NlZWsocy0+cGIsIHBvcywgU0VFS19TRVQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ2NDsKKworICAgIGlmICgoc2l6ZSA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHNpemU7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiB0LT5wdHNlcyAmJgorICAgICAgICBteGYtPmN1cnJlbnRfZWRpdF91bml0ID49IDAgJiYgbXhmLT5jdXJyZW50X2VkaXRfdW5pdCA8IHQtPm5iX3B0c2VzKSB7CisgICAgICAgIHBrdC0+ZHRzID0gbXhmLT5jdXJyZW50X2VkaXRfdW5pdCArIHQtPmZpcnN0X2R0czsKKyAgICAgICAgcGt0LT5wdHMgPSB0LT5wdHNlc1tteGYtPmN1cnJlbnRfZWRpdF91bml0XTsKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgaW50IHJldCA9IG14Zl9zZXRfYXVkaW9fcHRzKG14Ziwgc3QtPmNvZGVjLCBwa3QpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgbXhmLT5jdXJyZW50X2VkaXRfdW5pdCArPSBlZGl0X3VuaXRzOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhmX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1YRkNvbnRleHQgKm14ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBNWEZJbmRleFRhYmxlU2VnbWVudCAqc2VnOworICAgIGludCBpOworCisgICAgYXZfZnJlZXAoJm14Zi0+cGFja2FnZXNfcmVmcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGEgPSBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IG14Zi0+bWV0YWRhdGFfc2V0c19jb3VudDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobXhmLT5tZXRhZGF0YV9zZXRzW2ldLT50eXBlKSB7CisgICAgICAgIGNhc2UgRGVzY3JpcHRvcjoKKyAgICAgICAgICAgIGF2X2ZyZWVwKCYoKE1YRkRlc2NyaXB0b3IgKilteGYtPm1ldGFkYXRhX3NldHNbaV0pLT5leHRyYWRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTXVsdGlwbGVEZXNjcmlwdG9yOgorICAgICAgICAgICAgYXZfZnJlZXAoJigoTVhGRGVzY3JpcHRvciAqKW14Zi0+bWV0YWRhdGFfc2V0c1tpXSktPnN1Yl9kZXNjcmlwdG9yc19yZWZzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNlcXVlbmNlOgorICAgICAgICAgICAgYXZfZnJlZXAoJigoTVhGU2VxdWVuY2UgKilteGYtPm1ldGFkYXRhX3NldHNbaV0pLT5zdHJ1Y3R1cmFsX2NvbXBvbmVudHNfcmVmcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFc3NlbmNlR3JvdXA6CisgICAgICAgICAgICBhdl9mcmVlcCgmKChNWEZFc3NlbmNlR3JvdXAgKilteGYtPm1ldGFkYXRhX3NldHNbaV0pLT5zdHJ1Y3R1cmFsX2NvbXBvbmVudHNfcmVmcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTb3VyY2VQYWNrYWdlOgorICAgICAgICBjYXNlIE1hdGVyaWFsUGFja2FnZToKKyAgICAgICAgICAgIGF2X2ZyZWVwKCYoKE1YRlBhY2thZ2UgKilteGYtPm1ldGFkYXRhX3NldHNbaV0pLT50cmFja3NfcmVmcyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmKChNWEZQYWNrYWdlICopbXhmLT5tZXRhZGF0YV9zZXRzW2ldKS0+bmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJbmRleFRhYmxlU2VnbWVudDoKKyAgICAgICAgICAgIHNlZyA9IChNWEZJbmRleFRhYmxlU2VnbWVudCAqKW14Zi0+bWV0YWRhdGFfc2V0c1tpXTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzZWctPnRlbXBvcmFsX29mZnNldF9lbnRyaWVzKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzZWctPmZsYWdfZW50cmllcyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmc2VnLT5zdHJlYW1fb2Zmc2V0X2VudHJpZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmbXhmLT5tZXRhZGF0YV9zZXRzW2ldKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJm14Zi0+cGFydGl0aW9ucyk7CisgICAgYXZfZnJlZXAoJm14Zi0+bWV0YWRhdGFfc2V0cyk7CisgICAgYXZfZnJlZXAoJm14Zi0+YWVzYyk7CisgICAgYXZfZnJlZXAoJm14Zi0+bG9jYWxfdGFncyk7CisKKyAgICBpZiAobXhmLT5pbmRleF90YWJsZXMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG14Zi0+bmJfaW5kZXhfdGFibGVzOyBpKyspIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZteGYtPmluZGV4X3RhYmxlc1tpXS5zZWdtZW50cyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmbXhmLT5pbmRleF90YWJsZXNbaV0ucHRzZXMpOworICAgICAgICAgICAgYXZfZnJlZXAoJm14Zi0+aW5kZXhfdGFibGVzW2ldLmZha2VfaW5kZXgpOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWVwKCZteGYtPmluZGV4X3RhYmxlcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGZfcHJvYmUoQVZQcm9iZURhdGEgKnApIHsKKyAgICBjb25zdCB1aW50OF90ICpidWZwID0gcC0+YnVmOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IHAtPmJ1ZiArIHAtPmJ1Zl9zaXplOworCisgICAgaWYgKHAtPmJ1Zl9zaXplIDwgc2l6ZW9mKG14Zl9oZWFkZXJfcGFydGl0aW9uX3BhY2tfa2V5KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBNdXN0IHNraXAgUnVuLUluIFNlcXVlbmNlIGFuZCBzZWFyY2ggZm9yIE1YRiBoZWFkZXIgcGFydGl0aW9uIHBhY2sga2V5IFNNUFRFIDM3N00gNS41ICovCisgICAgZW5kIC09IHNpemVvZihteGZfaGVhZGVyX3BhcnRpdGlvbl9wYWNrX2tleSk7CisKKyAgICBmb3IgKDsgYnVmcCA8IGVuZDspIHsKKyAgICAgICAgaWYgKCEoKGJ1ZnBbMTNdIC0gMSkgJiAweEYyKSl7CisgICAgICAgICAgICBpZiAoQVZfUk4zMihidWZwICAgKSA9PSBBVl9STjMyKG14Zl9oZWFkZXJfcGFydGl0aW9uX3BhY2tfa2V5ICAgKSAmJgorICAgICAgICAgICAgICAgIEFWX1JOMzIoYnVmcCsgNCkgPT0gQVZfUk4zMihteGZfaGVhZGVyX3BhcnRpdGlvbl9wYWNrX2tleSsgNCkgJiYKKyAgICAgICAgICAgICAgICBBVl9STjMyKGJ1ZnArIDgpID09IEFWX1JOMzIobXhmX2hlYWRlcl9wYXJ0aXRpb25fcGFja19rZXkrIDgpICYmCisgICAgICAgICAgICAgICAgQVZfUk4xNihidWZwKzEyKSA9PSBBVl9STjE2KG14Zl9oZWFkZXJfcGFydGl0aW9uX3BhY2tfa2V5KzEyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgICAgICAgICBidWZwICsrOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJ1ZnAgKz0gMTA7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHJ1ZGltZW50YXJ5IGJ5dGUgc2VlayAqLworLyogWFhYOiB1c2UgTVhGIEluZGV4ICovCitzdGF0aWMgaW50IG14Zl9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LCBpbnQ2NF90IHNhbXBsZV90aW1lLCBpbnQgZmxhZ3MpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgIGludDY0X3Qgc2Vjb25kczsKKyAgICBNWEZDb250ZXh0KiBteGYgPSBzLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBzZWVrcG9zOworICAgIGludCBpLCByZXQ7CisgICAgTVhGSW5kZXhUYWJsZSAqdDsKKyAgICBNWEZUcmFjayAqc291cmNlX3RyYWNrID0gc3QtPnByaXZfZGF0YTsKKworICAgIC8qIGlmIGF1ZGlvIHRoZW4gdHJ1bmNhdGUgc2FtcGxlX3RpbWUgdG8gRWRpdFJhdGUgKi8KKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgc2FtcGxlX3RpbWUgPSBhdl9yZXNjYWxlX3Eoc2FtcGxlX3RpbWUsIHN0LT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ludl9xKHNvdXJjZV90cmFjay0+ZWRpdF9yYXRlKSk7CisKKyAgICBpZiAobXhmLT5uYl9pbmRleF90YWJsZXMgPD0gMCkgeworICAgIGlmICghcy0+Yml0X3JhdGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChzYW1wbGVfdGltZSA8IDApCisgICAgICAgIHNhbXBsZV90aW1lID0gMDsKKyAgICBzZWNvbmRzID0gYXZfcmVzY2FsZShzYW1wbGVfdGltZSwgc3QtPnRpbWVfYmFzZS5udW0sIHN0LT50aW1lX2Jhc2UuZGVuKTsKKworICAgIHNlZWtwb3MgPSBhdmlvX3NlZWsocy0+cGIsIChzLT5iaXRfcmF0ZSAqIHNlY29uZHMpID4+IDMsIFNFRUtfU0VUKTsKKyAgICBpZiAoc2Vla3BvcyA8IDApCisgICAgICAgIHJldHVybiBzZWVrcG9zOworCisgICAgZmZfdXBkYXRlX2N1cl9kdHMocywgc3QsIHNhbXBsZV90aW1lKTsKKyAgICBteGYtPmN1cnJlbnRfZWRpdF91bml0ID0gc2FtcGxlX3RpbWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdCA9ICZteGYtPmluZGV4X3RhYmxlc1swXTsKKworICAgICAgICAvKiBjbGFtcCBhYm92ZSB6ZXJvLCBlbHNlIGZmX2luZGV4X3NlYXJjaF90aW1lc3RhbXAoKSByZXR1cm5zIG5lZ2F0aXZlCisgICAgICAgICAqIHRoaXMgYWxzbyBtZWFucyB3ZSBhbGxvdyBzZWVraW5nIGJlZm9yZSB0aGUgc3RhcnQgKi8KKyAgICAgICAgc2FtcGxlX3RpbWUgPSBGRk1BWChzYW1wbGVfdGltZSwgMCk7CisKKyAgICAgICAgaWYgKHQtPmZha2VfaW5kZXgpIHsKKyAgICAgICAgICAgIC8qIGJlaGF2ZSBhcyBpZiB3ZSBoYXZlIGEgcHJvcGVyIGluZGV4ICovCisgICAgICAgICAgICBpZiAoKHNhbXBsZV90aW1lID0gZmZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcCh0LT5mYWtlX2luZGV4LCB0LT5uYl9wdHNlcywgc2FtcGxlX3RpbWUsIGZsYWdzKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBzYW1wbGVfdGltZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5vIEluZGV4RW50cnlBcnJheSAob25lIG9yIG1vcmUgQ0JSIHNlZ21lbnRzKQorICAgICAgICAgICAgICogbWFrZSBzdXJlIHdlIGRvbid0IHNlZWsgcGFzdCB0aGUgZW5kICovCisgICAgICAgICAgICBzYW1wbGVfdGltZSA9IEZGTUlOKHNhbXBsZV90aW1lLCBzb3VyY2VfdHJhY2stPm9yaWdpbmFsX2R1cmF0aW9uIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldCA9IG14Zl9lZGl0X3VuaXRfYWJzb2x1dGVfb2Zmc2V0KG14ZiwgdCwgc2FtcGxlX3RpbWUsICZzYW1wbGVfdGltZSwgJnNlZWtwb3MsIDEpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGZmX3VwZGF0ZV9jdXJfZHRzKHMsIHN0LCBzYW1wbGVfdGltZSk7CisgICAgICAgIG14Zi0+Y3VycmVudF9lZGl0X3VuaXQgPSBzYW1wbGVfdGltZTsKKyAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBzZWVrcG9zLCBTRUVLX1NFVCk7CisgICAgfQorCisgICAgLy8gVXBkYXRlIGFsbCB0cmFja3Mgc2FtcGxlIGNvdW50CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqY3VyX3N0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgTVhGVHJhY2sgKmN1cl90cmFjayA9IGN1cl9zdC0+cHJpdl9kYXRhOworICAgICAgICB1aW50NjRfdCBjdXJyZW50X3NhbXBsZV9jb3VudCA9IDA7CisgICAgICAgIGlmIChjdXJfc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgcmV0ID0gbXhmX2NvbXB1dGVfc2FtcGxlX2NvdW50KG14ZiwgaSwgJmN1cnJlbnRfc2FtcGxlX2NvdW50KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIGN1cl90cmFjay0+c2FtcGxlX2NvdW50ID0gY3VycmVudF9zYW1wbGVfY291bnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbXhmX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm14ZiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1YRiAoTWF0ZXJpYWwgZVhjaGFuZ2UgRm9ybWF0KSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNWEZDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBteGZfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gbXhmX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IG14Zl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBteGZfcmVhZF9jbG9zZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSBteGZfcmVhZF9zZWVrLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9teGZlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9teGZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODUwMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L214ZmVuYy5jCkBAIC0wLDAgKzEsMjMzMiBAQAorLyoKKyAqIE1YRiBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA4IEdVQ0FTLCBaaGVudGFuIEZlbmcgPHNweWZlbmcgYXQgZ21haWwgZG90IGNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlIGRvdCBjb3VkdXJpZXIgYXQgZ21haWwgZG90IGNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIFJlZmVyZW5jZXMKKyAqIFNNUFRFIDMzNk0gS0xWIERhdGEgRW5jb2RpbmcgUHJvdG9jb2wgVXNpbmcgS2V5LUxlbmd0aC1WYWx1ZQorICogU01QVEUgMzc3TSBNWEYgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbnMKKyAqIFNNUFRFIDM3OU0gTVhGIEdlbmVyaWMgQ29udGFpbmVyCisgKiBTTVBURSAzODFNIE1hcHBpbmcgTVBFRyBTdHJlYW1zIGludG8gdGhlIE1YRiBHZW5lcmljIENvbnRhaW5lcgorICogU01QVEUgNDIyTSBNYXBwaW5nIEpQRUcgMjAwMCBDb2Rlc3RyZWFtcyBpbnRvIHRoZSBNWEYgR2VuZXJpYyBDb250YWluZXIKKyAqIFNNUFRFIFJQMjEwOiBTTVBURSBNZXRhZGF0YSBEaWN0aW9uYXJ5CisgKiBTTVBURSBSUDIyNDogUmVnaXN0cnkgb2YgU01QVEUgVW5pdmVyc2FsIExhYmVscworICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhbmRvbV9zZWVkLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVjb2RlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2RueGhkZGF0YS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaDI2NC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdWRpb2ludGVybGVhdmUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm14Zi5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfbXhmX2QxMF9tdXhlcjsKKworI2RlZmluZSBFRElUX1VOSVRTX1BFUl9CT0RZIDI1MAorI2RlZmluZSBLQUdfU0laRSA1MTIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBsb2NhbF90YWc7CisgICAgVUlEIHVpZDsKK30gTVhGTG9jYWxUYWdQYWlyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBmbGFnczsKKyAgICB1aW50NjRfdCBvZmZzZXQ7CisgICAgdW5zaWduZWQgc2xpY2Vfb2Zmc2V0OyAvLy88IG9mZnNldCBvZiBhdWRpbyBzbGljZQorICAgIHVpbnQxNl90IHRlbXBvcmFsX3JlZjsKK30gTVhGSW5kZXhFbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEF1ZGlvSW50ZXJsZWF2ZUNvbnRleHQgYWljOworICAgIFVJRCB0cmFja19lc3NlbmNlX2VsZW1lbnRfa2V5OworICAgIGludCBpbmRleDsgICAgICAgICAgICAgICAvLy88IGluZGV4IGluIG14Zl9lc3NlbmNlX2NvbnRhaW5lcl91bHMgdGFibGUKKyAgICBjb25zdCBVSUQgKmNvZGVjX3VsOworICAgIGludCBvcmRlcjsgICAgICAgICAgICAgICAvLy88IGludGVybGVhdmluZyBvcmRlciBpZiBkdHMgYXJlIGVxdWFsCisgICAgaW50IGludGVybGFjZWQ7ICAgICAgICAgIC8vLzwgd2hldGhlciBwaWN0dXJlIGlzIGludGVybGFjZWQKKyAgICBpbnQgZmllbGRfZG9taW5hbmNlOyAgICAgLy8vPCB0ZmY9MSwgYmZmPTIKKyAgICBpbnQgY29tcG9uZW50X2RlcHRoOworICAgIGludCB0ZW1wb3JhbF9yZW9yZGVyaW5nOworICAgIEFWUmF0aW9uYWwgYXNwZWN0X3JhdGlvOyAvLy88IGRpc3BsYXkgYXNwZWN0IHJhdGlvCisgICAgaW50IGNsb3NlZF9nb3A7ICAgICAgICAgIC8vLzwgZ29wIGlzIGNsb3NlZCwgdXNlZCBpbiBtcGVnLTIgZnJhbWUgcGFyc2luZworICAgIGludCB2aWRlb19iaXRfcmF0ZTsKK30gTVhGU3RyZWFtQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJRCBjb250YWluZXJfdWw7CisgICAgVUlEIGVsZW1lbnRfdWw7CisgICAgVUlEIGNvZGVjX3VsOworICAgIHZvaWQgKCp3cml0ZV9kZXNjKShBVkZvcm1hdENvbnRleHQgKiwgQVZTdHJlYW0gKik7Cit9IE1YRkNvbnRhaW5lckVzc2VuY2VFbnRyeTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgZW51bSBBVkNvZGVjSUQgaWQ7CisgICAgaW50IGluZGV4OworfSBteGZfZXNzZW5jZV9tYXBwaW5nc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgMCB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MyNExFLCAgMSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MxNkxFLCAgMSB9LAorICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgICAxNSB9LAorICAgIHsgQVZfQ09ERUNfSURfRE5YSEQsICAgICAyNCB9LAorICAgIHsgQVZfQ09ERUNfSURfSlBFRzIwMDAsICAzNCB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgICAgICAzNSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSB9Cit9OworCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfd2F2X2Rlc2MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpOworc3RhdGljIHZvaWQgbXhmX3dyaXRlX2FlczNfZGVzYyhBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCk7CitzdGF0aWMgdm9pZCBteGZfd3JpdGVfbXBlZ3ZpZGVvX2Rlc2MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpOworc3RhdGljIHZvaWQgbXhmX3dyaXRlX2NkY2lfZGVzYyhBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCk7CitzdGF0aWMgdm9pZCBteGZfd3JpdGVfZ2VuZXJpY19zb3VuZF9kZXNjKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0KTsKKworc3RhdGljIGNvbnN0IE1YRkNvbnRhaW5lckVzc2VuY2VFbnRyeSBteGZfZXNzZW5jZV9jb250YWluZXJfdWxzW10gPSB7CisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMiwweDBELDB4MDEsMHgwMywweDAxLDB4MDIsMHgwNCwweDYwLDB4MDEgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxNSwweDAxLDB4MDUsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDMsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwIH0sCisgICAgICBteGZfd3JpdGVfbXBlZ3ZpZGVvX2Rlc2MgfSwKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDA2LDB4MDMsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDE2LDB4MDEsMHgwMywweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDIsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwKKyAgICAgIG14Zl93cml0ZV9hZXMzX2Rlc2MgfSwKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDA2LDB4MDEsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDE2LDB4MDEsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDIsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwKKyAgICAgIG14Zl93cml0ZV93YXZfZGVzYyB9LAorICAgIC8vIEQtMTAgNjI1LzUwIFBBTCA1MG1iL3MKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwMSB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDA1LDB4MDEsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgwMiwweDAxLDB4MDEgfSwKKyAgICAgIG14Zl93cml0ZV9jZGNpX2Rlc2MgfSwKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwMSB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDA2LDB4MDEsMHgxMCwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDIsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwKKyAgICAgIG14Zl93cml0ZV9nZW5lcmljX3NvdW5kX2Rlc2MgfSwKKyAgICAvLyBELTEwIDUyNS82MCBOVFNDIDUwbWIvcworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDEsMHgwMiwweDAxIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDUsMHgwMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDAyLDB4MDEsMHgwMiB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDEsMHgwMiwweDAxIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDYsMHgwMSwweDEwLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMiwweDAyLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2dlbmVyaWNfc291bmRfZGVzYyB9LAorICAgIC8vIEQtMTAgNjI1LzUwIFBBTCA0MG1iL3MKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDAxLDB4MDMsMHgwMSB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDA1LDB4MDEsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgwMiwweDAxLDB4MDMgfSwKKyAgICAgIG14Zl93cml0ZV9jZGNpX2Rlc2MgfSwKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDAxLDB4MDMsMHgwMSB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDA2LDB4MDEsMHgxMCwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDIsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwKKyAgICAgIG14Zl93cml0ZV9nZW5lcmljX3NvdW5kX2Rlc2MgfSwKKyAgICAvLyBELTEwIDUyNS82MCBOVFNDIDQwbWIvcworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDEsMHgwNCwweDAxIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDUsMHgwMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDAyLDB4MDEsMHgwNCB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDEsMHgwNCwweDAxIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDYsMHgwMSwweDEwLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMiwweDAyLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2dlbmVyaWNfc291bmRfZGVzYyB9LAorICAgIC8vIEQtMTAgNjI1LzUwIFBBTCAzMG1iL3MKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDAxLDB4MDUsMHgwMSB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDA1LDB4MDEsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgwMiwweDAxLDB4MDUgfSwKKyAgICAgIG14Zl93cml0ZV9jZGNpX2Rlc2MgfSwKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDAxLDB4MDUsMHgwMSB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDA2LDB4MDEsMHgxMCwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDIsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwKKyAgICAgIG14Zl93cml0ZV9nZW5lcmljX3NvdW5kX2Rlc2MgfSwKKyAgICAvLyBELTEwIDUyNS82MCBOVFNDIDMwbWIvcworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDEsMHgwNiwweDAxIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDUsMHgwMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDAyLDB4MDEsMHgwNiB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDEsMHgwNiwweDAxIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDYsMHgwMSwweDEwLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMiwweDAyLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2dlbmVyaWNfc291bmRfZGVzYyB9LAorICAgIC8vIERWIFVua25vd24KKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDAyLDB4N0YsMHgwMSB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDE4LDB4MDEsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDIsMHgwMCwweDAwLDB4MDAgfSwKKyAgICAgIG14Zl93cml0ZV9jZGNpX2Rlc2MgfSwKKyAgICAvLyBEVjI1IDUyNS82MAorICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDIsMHg0MCwweDAxIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MTgsMHgwMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDEsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorICAgIC8vIERWMjUgNjI1LzUwCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDIsMHgwMiwweDQxLDB4MDEgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxOCwweDAxLDB4MDEsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAwIH0sCisgICAgICBteGZfd3JpdGVfY2RjaV9kZXNjIH0sCisgICAgLy8gRFY1MCA1MjUvNjAKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDAyLDB4NTAsMHgwMSB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDE4LDB4MDEsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAzLDB4MDAgfSwKKyAgICAgIG14Zl93cml0ZV9jZGNpX2Rlc2MgfSwKKyAgICAvLyBEVjUwIDYyNS81MAorICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDIsMHg1MSwweDAxIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MTgsMHgwMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDQsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorICAgIC8vIERWMTAwIDEwODAvNjAKKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDAyLDB4NjAsMHgwMSB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDE4LDB4MDEsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDIsMHgwMiwweDA1LDB4MDAgfSwKKyAgICAgIG14Zl93cml0ZV9jZGNpX2Rlc2MgfSwKKyAgICAvLyBEVjEwMCAxMDgwLzUwCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDIsMHgwMiwweDYxLDB4MDEgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxOCwweDAxLDB4MDEsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwNiwweDAwIH0sCisgICAgICBteGZfd3JpdGVfY2RjaV9kZXNjIH0sCisgICAgLy8gRFYxMDAgNzIwLzYwCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDIsMHgwMiwweDYyLDB4MDEgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxOCwweDAxLDB4MDEsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwNywweDAwIH0sCisgICAgICBteGZfd3JpdGVfY2RjaV9kZXNjIH0sCisgICAgLy8gRFYxMDAgNzIwLzUwCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDIsMHgwMiwweDYzLDB4MDEgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxOCwweDAxLDB4MDEsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwOCwweDAwIH0sCisgICAgICBteGZfd3JpdGVfY2RjaV9kZXNjIH0sCisgICAgLy8gRE54SEQgMTA4MHAgMTBiaXQgaGlnaAorICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MTEsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MTUsMHgwMSwweDA1LDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHg3MSwweDAxLDB4MDAsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorICAgIC8vIEROeEhEIDEwODBwIDhiaXQgbWVkaXVtCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDIsMHgxMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxNSwweDAxLDB4MDUsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MEEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDcxLDB4MDMsMHgwMCwweDAwIH0sCisgICAgICBteGZfd3JpdGVfY2RjaV9kZXNjIH0sCisgICAgLy8gRE54SEQgMTA4MHAgOGJpdCBoaWdoCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDIsMHgxMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxNSwweDAxLDB4MDUsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MEEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDcxLDB4MDQsMHgwMCwweDAwIH0sCisgICAgICBteGZfd3JpdGVfY2RjaV9kZXNjIH0sCisgICAgLy8gRE54SEQgMTA4MGkgMTBiaXQgaGlnaAorICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MTEsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MTUsMHgwMSwweDA1LDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHg3MSwweDA3LDB4MDAsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorICAgIC8vIEROeEhEIDEwODBpIDhiaXQgbWVkaXVtCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDIsMHgxMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxNSwweDAxLDB4MDUsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MEEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDcxLDB4MDgsMHgwMCwweDAwIH0sCisgICAgICBteGZfd3JpdGVfY2RjaV9kZXNjIH0sCisgICAgLy8gRE54SEQgMTA4MGkgOGJpdCBoaWdoCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MDIsMHgxMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxNSwweDAxLDB4MDUsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MEEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDcxLDB4MDksMHgwMCwweDAwIH0sCisgICAgICBteGZfd3JpdGVfY2RjaV9kZXNjIH0sCisgICAgLy8gRE54SEQgNzIwcCAxMGJpdAorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MTEsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MTUsMHgwMSwweDA1LDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHg3MSwweDEwLDB4MDAsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorICAgIC8vIEROeEhEIDcyMHAgOGJpdCBoaWdoCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgxMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAzLDB4MDEsMHgxNSwweDAxLDB4MDUsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MEEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDcxLDB4MTEsMHgwMCwweDAwIH0sCisgICAgICBteGZfd3JpdGVfY2RjaV9kZXNjIH0sCisgICAgLy8gRE54SEQgNzIwcCA4Yml0IG1lZGl1bQorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MTEsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MTUsMHgwMSwweDA1LDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHg3MSwweDEyLDB4MDAsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorICAgIC8vIEROeEhEIDcyMHAgOGJpdCBsb3cKKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDExLDB4MDEsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDMsMHgwMSwweDE1LDB4MDEsMHgwNSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwQSwweDA0LDB4MDEsMHgwMiwweDAyLDB4NzEsMHgxMywweDAwLDB4MDAgfSwKKyAgICAgIG14Zl93cml0ZV9jZGNpX2Rlc2MgfSwKKyAgICAvLyBKUEVHMjAwMAorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDcsMHgwZCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MGMsMHgwMSwweDAwIH0sCisgICAgICB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MTUsMHgwMSwweDA4LDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDA3LDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMywweDAxLDB4MDEsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorICAgIC8vIEguMjY0CisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwYSwweDBELDB4MDEsMHgwMywweDAxLDB4MDIsMHgxMCwweDYwLDB4MDEgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxNSwweDAxLDB4MDUsMHgwMCB9LAorICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MGEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwIH0sCisgICAgICBteGZfd3JpdGVfbXBlZ3ZpZGVvX2Rlc2MgfSwKKyAgICB7IHsgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCB9LAorICAgICAgeyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwIH0sCisgICAgICB7IDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwKKyAgICAgIE5VTEwgfSwKK307CisKK3R5cGVkZWYgc3RydWN0IE1YRkNvbnRleHQgeworICAgIEFWQ2xhc3MgKmF2X2NsYXNzOworICAgIGludDY0X3QgZm9vdGVyX3BhcnRpdGlvbl9vZmZzZXQ7CisgICAgaW50IGVzc2VuY2VfY29udGFpbmVyX2NvdW50OworICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlOworICAgIGludCBoZWFkZXJfd3JpdHRlbjsKKyAgICBNWEZJbmRleEVudHJ5ICppbmRleF9lbnRyaWVzOworICAgIHVuc2lnbmVkIGVkaXRfdW5pdHNfY291bnQ7CisgICAgdWludDY0X3QgdGltZXN0YW1wOyAgIC8vLzwgdGltZXN0YW1wLCBhcyB5ZWFyKDE2KSxtb250aCg4KSxkYXkoOCksaG91cig4KSxtaW51dGVzKDgpLG1zZWMvNCg4KQorICAgIHVpbnQ4X3Qgc2xpY2VfY291bnQ7ICAvLy88IGluZGV4IHNsaWNlIGNvdW50IG1pbnVzIDEgKDEgaWYgbm8gYXVkaW8sIDAgb3RoZXJ3aXNlKQorICAgIGludCBsYXN0X2luZGV4ZWRfZWRpdF91bml0OworICAgIHVpbnQ2NF90ICpib2R5X3BhcnRpdGlvbl9vZmZzZXQ7CisgICAgdW5zaWduZWQgYm9keV9wYXJ0aXRpb25zX2NvdW50OworICAgIGludCBsYXN0X2tleV9pbmRleDsgIC8vLzwgaW5kZXggb2YgbGFzdCBrZXkgZnJhbWUKKyAgICB1aW50NjRfdCBkdXJhdGlvbjsKKyAgICBBVlRpbWVjb2RlIHRjOyAgICAgICAvLy88IHRpbWVjb2RlIGNvbnRleHQKKyAgICBBVlN0cmVhbSAqdGltZWNvZGVfdHJhY2s7CisgICAgaW50IHRpbWVjb2RlX2Jhc2U7ICAgICAgIC8vLzwgcm91bmRlZCB0aW1lIGNvZGUgYmFzZSAoMjUgb3IgMzApCisgICAgaW50IGVkaXRfdW5pdF9ieXRlX2NvdW50OyAvLy88IGZpeGVkIGVkaXQgdW5pdCBieXRlIGNvdW50CisgICAgdWludDY0X3QgYm9keV9vZmZzZXQ7CisgICAgdWludDMyX3QgaW5zdGFuY2VfbnVtYmVyOworICAgIHVpbnQ4X3QgdW1pZFsxNl07ICAgICAgICAvLy88IHVuaXF1ZSBtYXRlcmlhbCBpZGVudGlmaWVyCisgICAgaW50IGNoYW5uZWxfY291bnQ7Cit9IE1YRkNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHV1aWRfYmFzZVtdICAgICAgICAgICAgPSB7IDB4QUQsMHhBQiwweDQ0LDB4MjQsMHgyZiwweDI1LDB4NGQsMHhjNywweDkyLDB4ZmYsMHgyOSwweGJkIH07CitzdGF0aWMgY29uc3QgdWludDhfdCB1bWlkX3VsW10gICAgICAgICAgICAgID0geyAweDA2LDB4MEEsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDUsMHgwMSwweDAxLDB4MEQsMHgwMCwweDEzIH07CisKKy8qKgorICogY29tcGxldGUga2V5IGZvciBvcGVyYXRpb24gcGF0dGVybiwgcGFydGl0aW9ucywgYW5kIHByaW1lciBwYWNrCisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IG9wMWFfdWxbXSAgICAgICAgICAgICAgICAgICAgID0geyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MDEsMHgwOSwweDAwIH07CitzdGF0aWMgY29uc3QgdWludDhfdCBmb290ZXJfcGFydGl0aW9uX2tleVtdICAgICAgICA9IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAyLDB4MDUsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDA0LDB4MDQsMHgwMCB9OyAvLyBDbG9zZWRDb21wbGV0ZQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgcHJpbWVyX3BhY2tfa2V5W10gICAgICAgICAgICAgPSB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMiwweDA1LDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwNSwweDAxLDB4MDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGluZGV4X3RhYmxlX3NlZ21lbnRfa2V5W10gICAgID0geyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MTAsMHgwMSwweDAwIH07CitzdGF0aWMgY29uc3QgdWludDhfdCByYW5kb21faW5kZXhfcGFja19rZXlbXSAgICAgICA9IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAyLDB4MDUsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDExLDB4MDEsMHgwMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaGVhZGVyX29wZW5fcGFydGl0aW9uX2tleVtdICAgPSB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMiwweDA1LDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwMiwweDAxLDB4MDAgfTsgLy8gT3BlbkluY29tcGxldGUKK3N0YXRpYyBjb25zdCB1aW50OF90IGhlYWRlcl9jbG9zZWRfcGFydGl0aW9uX2tleVtdID0geyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDIsMHgwNSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MDIsMHgwNCwweDAwIH07IC8vIENsb3NlZENvbXBsZXRlCitzdGF0aWMgY29uc3QgdWludDhfdCBrbHZfZmlsbF9rZXlbXSAgICAgICAgICAgICAgICA9IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDMsMHgwMSwweDAyLDB4MTAsMHgwMSwweDAwLDB4MDAsMHgwMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYm9keV9wYXJ0aXRpb25fa2V5W10gICAgICAgICAgPSB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMiwweDA1LDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwMywweDA0LDB4MDAgfTsgLy8gQ2xvc2VkQ29tcGxldGUKKworLyoqCisgKiBwYXJ0aWFsIGtleSBmb3IgaGVhZGVyIG1ldGFkYXRhCisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGhlYWRlcl9tZXRhZGF0YV9rZXlbXSAgPSB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMiwweDUzLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMSwweDAxLDB4MDEgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IG11bHRpcGxlX2Rlc2NfdWxbXSAgICAgPSB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMywweDBELDB4MDEsMHgwMywweDAxLDB4MDIsMHg3RiwweDAxLDB4MDAgfTsKKworLyoqCisgKiBTTVBURSBSUDIxMCBodHRwOi8vd3d3LnNtcHRlLXJhLm9yZy9tZGQvaW5kZXguaHRtbAorICovCitzdGF0aWMgY29uc3QgTVhGTG9jYWxUYWdQYWlyIG14Zl9sb2NhbF90YWdfYmF0Y2hbXSA9IHsKKyAgICAvLyBwcmVmYWNlIHNldAorICAgIHsgMHgzQzBBLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDE1LDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMH19LCAvKiBJbnN0YW5jZSBVSUQgKi8KKyAgICB7IDB4M0IwMiwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA3LDB4MDIsMHgwMSwweDEwLDB4MDIsMHgwNCwweDAwLDB4MDB9fSwgLyogTGFzdCBNb2RpZmllZCBEYXRlICovCisgICAgeyAweDNCMDUsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDIsMHgwMywweDAxLDB4MDIsMHgwMSwweDA1LDB4MDAsMHgwMCwweDAwfX0sIC8qIFZlcnNpb24gKi8KKyAgICB7IDB4M0IwNiwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA2LDB4MDEsMHgwMSwweDA0LDB4MDYsMHgwNCwweDAwLDB4MDB9fSwgLyogSWRlbnRpZmljYXRpb25zIHJlZmVyZW5jZSAqLworICAgIHsgMHgzQjAzLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDYsMHgwMSwweDAxLDB4MDQsMHgwMiwweDAxLDB4MDAsMHgwMH19LCAvKiBDb250ZW50IFN0b3JhZ2UgcmVmZXJlbmNlICovCisgICAgeyAweDNCMDksIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDUsMHgwMSwweDAyLDB4MDIsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwfX0sIC8qIE9wZXJhdGlvbmFsIFBhdHRlcm4gVUwgKi8KKyAgICB7IDB4M0IwQSwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwNSwweDAxLDB4MDIsMHgwMiwweDEwLDB4MDIsMHgwMSwweDAwLDB4MDB9fSwgLyogRXNzZW5jZSBDb250YWluZXJzIFVMIGJhdGNoICovCisgICAgeyAweDNCMEIsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDUsMHgwMSwweDAyLDB4MDIsMHgxMCwweDAyLDB4MDIsMHgwMCwweDAwfX0sIC8qIERNIFNjaGVtZXMgVUwgYmF0Y2ggKi8KKyAgICAvLyBJZGVudGlmaWNhdGlvbgorICAgIHsgMHgzQzA5LCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDUsMHgyMCwweDA3LDB4MDEsMHgwMSwweDAwLDB4MDAsMHgwMH19LCAvKiBUaGlzIEdlbmVyYXRpb24gVUlEICovCisgICAgeyAweDNDMDEsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDIsMHgwNSwweDIwLDB4MDcsMHgwMSwweDAyLDB4MDEsMHgwMCwweDAwfX0sIC8qIENvbXBhbnkgTmFtZSAqLworICAgIHsgMHgzQzAyLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDUsMHgyMCwweDA3LDB4MDEsMHgwMywweDAxLDB4MDAsMHgwMH19LCAvKiBQcm9kdWN0IE5hbWUgKi8KKyAgICB7IDB4M0MwNCwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA1LDB4MjAsMHgwNywweDAxLDB4MDUsMHgwMSwweDAwLDB4MDB9fSwgLyogVmVyc2lvbiBTdHJpbmcgKi8KKyAgICB7IDB4M0MwNSwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA1LDB4MjAsMHgwNywweDAxLDB4MDcsMHgwMCwweDAwLDB4MDB9fSwgLyogUHJvZHVjdCBJRCAqLworICAgIHsgMHgzQzA2LCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDcsMHgwMiwweDAxLDB4MTAsMHgwMiwweDAzLDB4MDAsMHgwMH19LCAvKiBNb2RpZmljYXRpb24gRGF0ZSAqLworICAgIC8vIENvbnRlbnQgU3RvcmFnZQorICAgIHsgMHgxOTAxLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDYsMHgwMSwweDAxLDB4MDQsMHgwNSwweDAxLDB4MDAsMHgwMH19LCAvKiBQYWNrYWdlIHN0cm9uZyByZWZlcmVuY2UgYmF0Y2ggKi8KKyAgICB7IDB4MTkwMiwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA2LDB4MDEsMHgwMSwweDA0LDB4MDUsMHgwMiwweDAwLDB4MDB9fSwgLyogUGFja2FnZSBzdHJvbmcgcmVmZXJlbmNlIGJhdGNoICovCisgICAgLy8gRXNzZW5jZSBDb250YWluZXIgRGF0YQorICAgIHsgMHgyNzAxLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDYsMHgwMSwweDAxLDB4MDYsMHgwMSwweDAwLDB4MDAsMHgwMH19LCAvKiBMaW5rZWQgUGFja2FnZSBVSUQgKi8KKyAgICB7IDB4M0YwNywgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDMsMHgwNCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDB9fSwgLyogQm9keVNJRCAqLworICAgIC8vIFBhY2thZ2UKKyAgICB7IDB4NDQwMSwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgxNSwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDB9fSwgLyogUGFja2FnZSBVSUQgKi8KKyAgICB7IDB4NDQwNSwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA3LDB4MDIsMHgwMSwweDEwLDB4MDEsMHgwMywweDAwLDB4MDB9fSwgLyogUGFja2FnZSBDcmVhdGlvbiBEYXRlICovCisgICAgeyAweDQ0MDQsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDIsMHgwNywweDAyLDB4MDEsMHgxMCwweDAyLDB4MDUsMHgwMCwweDAwfX0sIC8qIFBhY2thZ2UgTW9kaWZpZWQgRGF0ZSAqLworICAgIHsgMHg0NDAzLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDYsMHgwMSwweDAxLDB4MDQsMHgwNiwweDA1LDB4MDAsMHgwMH19LCAvKiBUcmFja3MgU3Ryb25nIHJlZmVyZW5jZSBhcnJheSAqLworICAgIHsgMHg0NzAxLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDYsMHgwMSwweDAxLDB4MDQsMHgwMiwweDAzLDB4MDAsMHgwMH19LCAvKiBEZXNjcmlwdG9yICovCisgICAgLy8gVHJhY2sKKyAgICB7IDB4NDgwMSwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDAxLDB4MDcsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDB9fSwgLyogVHJhY2sgSUQgKi8KKyAgICB7IDB4NDgwNCwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDAxLDB4MDQsMHgwMSwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDB9fSwgLyogVHJhY2sgTnVtYmVyICovCisgICAgeyAweDRCMDEsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDIsMHgwNSwweDMwLDB4MDQsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwfX0sIC8qIEVkaXQgUmF0ZSAqLworICAgIHsgMHg0QjAyLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDcsMHgwMiwweDAxLDB4MDMsMHgwMSwweDAzLDB4MDAsMHgwMH19LCAvKiBPcmlnaW4gKi8KKyAgICB7IDB4NDgwMywgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA2LDB4MDEsMHgwMSwweDA0LDB4MDIsMHgwNCwweDAwLDB4MDB9fSwgLyogU2VxdWVuY2UgcmVmZXJlbmNlICovCisgICAgLy8gU2VxdWVuY2UKKyAgICB7IDB4MDIwMSwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA0LDB4MDcsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fSwgLyogRGF0YSBEZWZpbml0aW9uIFVMICovCisgICAgeyAweDAyMDIsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDIsMHgwNywweDAyLDB4MDIsMHgwMSwweDAxLDB4MDMsMHgwMCwweDAwfX0sIC8qIER1cmF0aW9uICovCisgICAgeyAweDEwMDEsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDIsMHgwNiwweDAxLDB4MDEsMHgwNCwweDA2LDB4MDksMHgwMCwweDAwfX0sIC8qIFN0cnVjdHVyYWwgQ29tcG9uZW50cyByZWZlcmVuY2UgYXJyYXkgKi8KKyAgICAvLyBTb3VyY2UgQ2xpcAorICAgIHsgMHgxMjAxLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDcsMHgwMiwweDAxLDB4MDMsMHgwMSwweDA0LDB4MDAsMHgwMH19LCAvKiBTdGFydCBwb3NpdGlvbiAqLworICAgIHsgMHgxMTAxLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDYsMHgwMSwweDAxLDB4MDMsMHgwMSwweDAwLDB4MDAsMHgwMH19LCAvKiBTb3VyY2VQYWNrYWdlSUQgKi8KKyAgICB7IDB4MTEwMiwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA2LDB4MDEsMHgwMSwweDAzLDB4MDIsMHgwMCwweDAwLDB4MDB9fSwgLyogU291cmNlVHJhY2tJRCAqLworICAgIC8vIFRpbWVjb2RlIENvbXBvbmVudAorICAgIHsgMHgxNTAxLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDcsMHgwMiwweDAxLDB4MDMsMHgwMSwweDA1LDB4MDAsMHgwMH19LCAvKiBTdGFydCBUaW1lIENvZGUgKi8KKyAgICB7IDB4MTUwMiwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA0LDB4MDQsMHgwMSwweDAxLDB4MDIsMHgwNiwweDAwLDB4MDB9fSwgLyogUm91bmRlZCBUaW1lIENvZGUgQmFzZSAqLworICAgIHsgMHgxNTAzLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwNCwweDAxLDB4MDEsMHgwNSwweDAwLDB4MDAsMHgwMH19LCAvKiBEcm9wIEZyYW1lICovCisgICAgLy8gRmlsZSBEZXNjcmlwdG9yCisgICAgeyAweDNGMDEsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwNiwweDAxLDB4MDEsMHgwNCwweDA2LDB4MEIsMHgwMCwweDAwfX0sIC8qIFN1YiBEZXNjcmlwdG9ycyByZWZlcmVuY2UgYXJyYXkgKi8KKyAgICB7IDB4MzAwNiwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwNSwweDA2LDB4MDEsMHgwMSwweDAzLDB4MDUsMHgwMCwweDAwLDB4MDB9fSwgLyogTGlua2VkIFRyYWNrIElEICovCisgICAgeyAweDMwMDEsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwNCwweDA2LDB4MDEsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwfX0sIC8qIFNhbXBsZVJhdGUgKi8KKyAgICB7IDB4MzAwNCwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA2LDB4MDEsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAwLDB4MDB9fSwgLyogRXNzZW5jZSBDb250YWluZXIgKi8KKyAgICAvLyBHZW5lcmljIFBpY3R1cmUgRXNzZW5jZSBEZXNjcmlwdG9yCisgICAgeyAweDMyMEMsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDMsMHgwMSwweDA0LDB4MDAsMHgwMCwweDAwfX0sIC8qIEZyYW1lIExheW91dCAqLworICAgIHsgMHgzMjBELCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDQsMHgwMSwweDAzLDB4MDIsMHgwNSwweDAwLDB4MDAsMHgwMH19LCAvKiBWaWRlbyBMaW5lIE1hcCAqLworICAgIHsgMHgzMjAzLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDA1LDB4MDIsMHgwMiwweDAwLDB4MDAsMHgwMH19LCAvKiBTdG9yZWQgV2lkdGggKi8KKyAgICB7IDB4MzIwMiwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDEsMHgwNSwweDAyLDB4MDEsMHgwMCwweDAwLDB4MDB9fSwgLyogU3RvcmVkIEhlaWdodCAqLworICAgIHsgMHgzMjA5LCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDA1LDB4MDEsMHgwQywweDAwLDB4MDAsMHgwMH19LCAvKiBEaXNwbGF5IFdpZHRoICovCisgICAgeyAweDMyMDgsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDUsMHgwMSwweDBCLDB4MDAsMHgwMCwweDAwfX0sIC8qIERpc3BsYXkgSGVpZ2h0ICovCisgICAgeyAweDMyMEUsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwfX0sIC8qIEFzcGVjdCBSYXRpbyAqLworICAgIHsgMHgzMjAxLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDQsMHgwMSwweDA2LDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMH19LCAvKiBQaWN0dXJlIEVzc2VuY2UgQ29kaW5nICovCisgICAgeyAweDMyMTIsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDIsMHgwNCwweDAxLDB4MDMsMHgwMSwweDA2LDB4MDAsMHgwMCwweDAwfX0sIC8qIEZpZWxkIERvbWluYW5jZSAoT3B0KSAqLworICAgIC8vIENEQ0kgUGljdHVyZSBFc3NlbmNlIERlc2NyaXB0b3IKKyAgICB7IDB4MzMwMSwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA0LDB4MDEsMHgwNSwweDAzLDB4MEEsMHgwMCwweDAwLDB4MDB9fSwgLyogQ29tcG9uZW50IERlcHRoICovCisgICAgeyAweDMzMDIsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDUsMHgwMSwweDA1LDB4MDAsMHgwMCwweDAwfX0sIC8qIEhvcml6b250YWwgU3Vic2FtcGxpbmcgKi8KKyAgICAvLyBHZW5lcmljIFNvdW5kIEVzc2VuY2UgRGVzY3JpcHRvcgorICAgIHsgMHgzRDAyLCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDQsMHgwMiwweDAzLDB4MDEsMHgwNCwweDAwLDB4MDAsMHgwMH19LCAvKiBMb2NrZWQvVW5sb2NrZWQgKi8KKyAgICB7IDB4M0QwMywgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwNSwweDA0LDB4MDIsMHgwMywweDAxLDB4MDEsMHgwMSwweDAwLDB4MDB9fSwgLyogQXVkaW8gc2FtcGxpbmcgcmF0ZSAqLworICAgIHsgMHgzRDA3LCB7MHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDEsMHgwMSwweDA1LDB4MDQsMHgwMiwweDAxLDB4MDEsMHgwNCwweDAwLDB4MDAsMHgwMH19LCAvKiBDaGFubmVsQ291bnQgKi8KKyAgICB7IDB4M0QwMSwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDA0LDB4MDIsMHgwMywweDAzLDB4MDQsMHgwMCwweDAwLDB4MDB9fSwgLyogUXVhbnRpemF0aW9uIGJpdHMgKi8KKyAgICB7IDB4M0QwNiwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwMiwweDA0LDB4MDIsMHgwNCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDB9fSwgLyogU291bmQgRXNzZW5jZSBDb21wcmVzc2lvbiAqLworICAgIC8vIEluZGV4IFRhYmxlIFNlZ21lbnQKKyAgICB7IDB4M0YwQiwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwNSwweDA1LDB4MzAsMHgwNCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDB9fSwgLyogSW5kZXggRWRpdCBSYXRlICovCisgICAgeyAweDNGMEMsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDUsMHgwNywweDAyLDB4MDEsMHgwMywweDAxLDB4MEEsMHgwMCwweDAwfX0sIC8qIEluZGV4IFN0YXJ0IFBvc2l0aW9uICovCisgICAgeyAweDNGMEQsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDUsMHgwNywweDAyLDB4MDIsMHgwMSwweDAxLDB4MDIsMHgwMCwweDAwfX0sIC8qIEluZGV4IER1cmF0aW9uICovCisgICAgeyAweDNGMDUsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwNCwweDA2LDB4MDIsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwfX0sIC8qIEVkaXQgVW5pdCBCeXRlIENvdW50ICovCisgICAgeyAweDNGMDYsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAzLDB4MDQsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwfX0sIC8qIEluZGV4U0lEICovCisgICAgeyAweDNGMDgsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwfX0sIC8qIFNsaWNlIENvdW50ICovCisgICAgeyAweDNGMDksIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDUsMHgwNCwweDA0LDB4MDQsMHgwMSwweDA2LDB4MDAsMHgwMCwweDAwfX0sIC8qIERlbHRhIEVudHJ5IEFycmF5ICovCisgICAgeyAweDNGMEEsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDUsMHgwNCwweDA0LDB4MDQsMHgwMiwweDA1LDB4MDAsMHgwMCwweDAwfX0sIC8qIEluZGV4IEVudHJ5IEFycmF5ICovCisgICAgLy8gTVBFRyB2aWRlbyBEZXNjcmlwdG9yCisgICAgeyAweDgwMDAsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDUsMHgwNCwweDAxLDB4MDYsMHgwMiwweDAxLDB4MEIsMHgwMCwweDAwfX0sIC8qIEJpdFJhdGUgKi8KKyAgICB7IDB4ODAwNywgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwNSwweDA0LDB4MDEsMHgwNiwweDAyLDB4MDEsMHgwQSwweDAwLDB4MDB9fSwgLyogUHJvZmlsZUFuZExldmVsICovCisgICAgLy8gV2F2ZSBBdWRpbyBFc3NlbmNlIERlc2NyaXB0b3IKKyAgICB7IDB4M0QwOSwgezB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwNSwweDA0LDB4MDIsMHgwMywweDAzLDB4MDUsMHgwMCwweDAwLDB4MDB9fSwgLyogQXZlcmFnZSBCeXRlcyBQZXIgU2Vjb25kICovCisgICAgeyAweDNEMEEsIHsweDA2LDB4MEUsMHgyQiwweDM0LDB4MDEsMHgwMSwweDAxLDB4MDUsMHgwNCwweDAyLDB4MDMsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwfX0sIC8qIEJsb2NrIEFsaWduICovCit9OworCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfdXVpZChBVklPQ29udGV4dCAqcGIsIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGUsIGludCB2YWx1ZSkKK3sKKyAgICBhdmlvX3dyaXRlKHBiLCB1dWlkX2Jhc2UsIDEyKTsKKyAgICBhdmlvX3diMTYocGIsIHR5cGUpOworICAgIGF2aW9fd2IxNihwYiwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfdW1pZChBVkZvcm1hdENvbnRleHQgKnMsIGludCB0eXBlKQoreworICAgIE1YRkNvbnRleHQgKm14ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCB1bWlkX3VsLCAxMyk7CisgICAgYXZpb193YjI0KHMtPnBiLCBteGYtPmluc3RhbmNlX251bWJlcik7CisgICAgYXZpb193cml0ZShzLT5wYiwgbXhmLT51bWlkLCAxNSk7CisgICAgYXZpb193OChzLT5wYiwgdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9yZWZzX2NvdW50KEFWSU9Db250ZXh0ICpwYiwgaW50IHJlZl9jb3VudCkKK3sKKyAgICBhdmlvX3diMzIocGIsIHJlZl9jb3VudCk7CisgICAgYXZpb193YjMyKHBiLCAxNik7Cit9CisKK3N0YXRpYyBpbnQga2x2X2Jlcl9sZW5ndGgodWludDY0X3QgbGVuKQoreworICAgIGlmIChsZW4gPCAxMjgpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIChhdl9sb2cyKGxlbikgPj4gMykgKyAyOworfQorCitzdGF0aWMgaW50IGtsdl9lbmNvZGVfYmVyX2xlbmd0aChBVklPQ29udGV4dCAqcGIsIHVpbnQ2NF90IGxlbikKK3sKKyAgICAvLyBEZXRlcm1pbmUgdGhlIGJlc3QgQkVSIHNpemUKKyAgICBpbnQgc2l6ZTsKKyAgICBpZiAobGVuIDwgMTI4KSB7CisgICAgICAgIC8vc2hvcnQgZm9ybQorICAgICAgICBhdmlvX3c4KHBiLCBsZW4pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzaXplID0gKGF2X2xvZzIobGVuKSA+PiAzKSArIDE7CisKKyAgICAvLyBsb25nIGZvcm0KKyAgICBhdmlvX3c4KHBiLCAweDgwICsgc2l6ZSk7CisgICAgd2hpbGUoc2l6ZSkgeworICAgICAgICBzaXplLS07CisgICAgICAgIGF2aW9fdzgocGIsIGxlbiA+PiA4ICogc2l6ZSAmIDB4ZmYpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQga2x2X2VuY29kZV9iZXI0X2xlbmd0aChBVklPQ29udGV4dCAqcGIsIGludCBsZW4pCit7CisgICAgYXZpb193OChwYiwgMHg4MCArIDMpOworICAgIGF2aW9fd2IyNChwYiwgbGVuKTsKK30KKworLyoKKyAqIEdldCBlc3NlbmNlIGNvbnRhaW5lciB1bCBpbmRleAorICovCitzdGF0aWMgaW50IG14Zl9nZXRfZXNzZW5jZV9jb250YWluZXJfdWxfaW5kZXgoZW51bSBBVkNvZGVjSUQgaWQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgbXhmX2Vzc2VuY2VfbWFwcGluZ3NbaV0uaWQ7IGkrKykKKyAgICAgICAgaWYgKG14Zl9lc3NlbmNlX21hcHBpbmdzW2ldLmlkID09IGlkKQorICAgICAgICAgICAgcmV0dXJuIG14Zl9lc3NlbmNlX21hcHBpbmdzW2ldLmluZGV4OworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgbXhmX3dyaXRlX3ByaW1lcl9wYWNrKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgbG9jYWxfdGFnX251bWJlciwgaSA9IDA7CisKKyAgICBsb2NhbF90YWdfbnVtYmVyID0gRkZfQVJSQVlfRUxFTVMobXhmX2xvY2FsX3RhZ19iYXRjaCk7CisKKyAgICBhdmlvX3dyaXRlKHBiLCBwcmltZXJfcGFja19rZXksIDE2KTsKKyAgICBrbHZfZW5jb2RlX2Jlcl9sZW5ndGgocGIsIGxvY2FsX3RhZ19udW1iZXIgKiAxOCArIDgpOworCisgICAgYXZpb193YjMyKHBiLCBsb2NhbF90YWdfbnVtYmVyKTsgLy8gbG9jYWxfdGFnIG51bQorICAgIGF2aW9fd2IzMihwYiwgMTgpOyAvLyBpdGVtIHNpemUsIGFsd2F5cyAxOCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNzCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9jYWxfdGFnX251bWJlcjsgaSsrKSB7CisgICAgICAgIGF2aW9fd2IxNihwYiwgbXhmX2xvY2FsX3RhZ19iYXRjaFtpXS5sb2NhbF90YWcpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCBteGZfbG9jYWxfdGFnX2JhdGNoW2ldLnVpZCwgMTYpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbXhmX3dyaXRlX2xvY2FsX3RhZyhBVklPQ29udGV4dCAqcGIsIGludCBzaXplLCBpbnQgdGFnKQoreworICAgIGF2aW9fd2IxNihwYiwgdGFnKTsKKyAgICBhdmlvX3diMTYocGIsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfbWV0YWRhdGFfa2V5KEFWSU9Db250ZXh0ICpwYiwgdW5zaWduZWQgaW50IHZhbHVlKQoreworICAgIGF2aW9fd3JpdGUocGIsIGhlYWRlcl9tZXRhZGF0YV9rZXksIDEzKTsKKyAgICBhdmlvX3diMjQocGIsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgbXhmX2ZyZWUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBhdl9mcmVlcCgmc3QtPnByaXZfZGF0YSk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgTVhGQ29kZWNVTCAqbXhmX2dldF9kYXRhX2RlZmluaXRpb25fdWwoaW50IHR5cGUpCit7CisgICAgY29uc3QgTVhGQ29kZWNVTCAqdWxzID0gZmZfbXhmX2RhdGFfZGVmaW5pdGlvbl91bHM7CisgICAgd2hpbGUgKHVscy0+dWlkWzBdKSB7CisgICAgICAgIGlmICh0eXBlID09IHVscy0+aWQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdWxzKys7CisgICAgfQorICAgIHJldHVybiB1bHM7Cit9CisKKy8vb25lIEVDIC0+IG9uZSBkZXNjcmlwdG9yLiBOIEVDcyAtPiBNdWx0aXBsZURlc2NyaXB0b3IgKyBOIGRlc2NyaXB0b3JzCisjZGVmaW5lIERFU0NSSVBUT1JfQ09VTlQoZXNzZW5jZV9jb250YWluZXJfY291bnQpIFwKKyAgICAoZXNzZW5jZV9jb250YWluZXJfY291bnQgPiAxID8gZXNzZW5jZV9jb250YWluZXJfY291bnQgKyAxIDogZXNzZW5jZV9jb250YWluZXJfY291bnQpCisKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9lc3NlbmNlX2NvbnRhaW5lcl9yZWZzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNWEZDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCBpOworCisgICAgbXhmX3dyaXRlX3JlZnNfY291bnQocGIsIERFU0NSSVBUT1JfQ09VTlQoYy0+ZXNzZW5jZV9jb250YWluZXJfY291bnQpKTsKKyAgICBhdl9sb2cocyxBVl9MT0dfREVCVUcsICJlc3NlbmNlIGNvbnRhaW5lciBjb3VudDolZFxuIiwgYy0+ZXNzZW5jZV9jb250YWluZXJfY291bnQpOworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5lc3NlbmNlX2NvbnRhaW5lcl9jb3VudDsgaSsrKSB7CisgICAgICAgIE1YRlN0cmVhbUNvbnRleHQgKnNjID0gcy0+c3RyZWFtc1tpXS0+cHJpdl9kYXRhOworICAgICAgICBhdmlvX3dyaXRlKHBiLCBteGZfZXNzZW5jZV9jb250YWluZXJfdWxzW3NjLT5pbmRleF0uY29udGFpbmVyX3VsLCAxNik7CisgICAgfQorCisgICAgaWYgKGMtPmVzc2VuY2VfY29udGFpbmVyX2NvdW50ID4gMSkKKyAgICAgICAgYXZpb193cml0ZShwYiwgbXVsdGlwbGVfZGVzY191bCwgMTYpOworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfcHJlZmFjZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworCisgICAgbXhmX3dyaXRlX21ldGFkYXRhX2tleShwYiwgMHgwMTJmMDApOworICAgIFBSSU5UX0tFWShzLCAicHJlZmFjZSBrZXkiLCBwYi0+YnVmX3B0ciAtIDE2KTsKKyAgICBrbHZfZW5jb2RlX2Jlcl9sZW5ndGgocGIsIDEzMCArIDE2TEwgKiBERVNDUklQVE9SX0NPVU5UKG14Zi0+ZXNzZW5jZV9jb250YWluZXJfY291bnQpKTsKKworICAgIC8vIHdyaXRlIHByZWZhY2Ugc2V0IHVpZAorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDNDMEEpOworICAgIG14Zl93cml0ZV91dWlkKHBiLCBQcmVmYWNlLCAwKTsKKyAgICBQUklOVF9LRVkocywgInByZWZhY2UgdWlkIiwgcGItPmJ1Zl9wdHIgLSAxNik7CisKKyAgICAvLyBsYXN0IG1vZGlmaWVkIGRhdGUKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA4LCAweDNCMDIpOworICAgIGF2aW9fd2I2NChwYiwgbXhmLT50aW1lc3RhbXApOworCisgICAgLy8gd3JpdGUgdmVyc2lvbgorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDIsIDB4M0IwNSk7CisgICAgYXZpb193YjE2KHBiLCAyNTgpOyAvLyB2MS4yCisKKyAgICAvLyB3cml0ZSBpZGVudGlmaWNhdGlvbl9yZWZzCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMTYgKyA4LCAweDNCMDYpOworICAgIG14Zl93cml0ZV9yZWZzX2NvdW50KHBiLCAxKTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgSWRlbnRpZmljYXRpb24sIDApOworCisgICAgLy8gd3JpdGUgY29udGVudF9zdG9yYWdlX3JlZnMKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHgzQjAzKTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgQ29udGVudFN0b3JhZ2UsIDApOworCisgICAgLy8gb3BlcmF0aW9uYWwgcGF0dGVybgorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDNCMDkpOworICAgIGF2aW9fd3JpdGUocGIsIG9wMWFfdWwsIDE2KTsKKworICAgIC8vIHdyaXRlIGVzc2VuY2VfY29udGFpbmVyX3JlZnMKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA4ICsgMTZMTCAqIERFU0NSSVBUT1JfQ09VTlQobXhmLT5lc3NlbmNlX2NvbnRhaW5lcl9jb3VudCksIDB4M0IwQSk7CisgICAgbXhmX3dyaXRlX2Vzc2VuY2VfY29udGFpbmVyX3JlZnMocyk7CisKKyAgICAvLyB3cml0ZSBkbV9zY2hlbWVfcmVmcworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDgsIDB4M0IwQik7CisgICAgYXZpb193YjY0KHBiLCAwKTsKK30KKworLyoKKyAqIFdyaXRlIGEgbG9jYWwgdGFnIGNvbnRhaW5pbmcgYW4gYXNjaWkgc3RyaW5nIGFzIHV0Zi0xNgorICovCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfbG9jYWxfdGFnX3V0ZjE2KEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgaW50IGksIHNpemUgPSBzdHJsZW4odmFsdWUpOworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIHNpemUqMiwgdGFnKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICBhdmlvX3diMTYocGIsIHZhbHVlW2ldKTsKK30KKworc3RhdGljIHZvaWQgbXhmX3dyaXRlX2lkZW50aWZpY2F0aW9uKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgY29uc3QgY2hhciAqY29tcGFueSA9ICJGRm1wZWciOworICAgIGNvbnN0IGNoYXIgKnByb2R1Y3QgPSAiT1AxYSBNdXhlciI7CisgICAgY29uc3QgY2hhciAqdmVyc2lvbjsKKyAgICBpbnQgbGVuZ3RoOworCisgICAgbXhmX3dyaXRlX21ldGFkYXRhX2tleShwYiwgMHgwMTMwMDApOworICAgIFBSSU5UX0tFWShzLCAiaWRlbnRpZmljYXRpb24ga2V5IiwgcGItPmJ1Zl9wdHIgLSAxNik7CisKKyAgICB2ZXJzaW9uID0gcy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0JJVEVYQUNUID8KKyAgICAgICAgIjAuMC4wIiA6IEFWX1NUUklOR0lGWShMSUJBVkZPUk1BVF9WRVJTSU9OKTsKKyAgICBsZW5ndGggPSA4NCArIChzdHJsZW4oY29tcGFueSkrc3RybGVuKHByb2R1Y3QpK3N0cmxlbih2ZXJzaW9uKSkqMjsgLy8gdXRmLTE2CisgICAga2x2X2VuY29kZV9iZXJfbGVuZ3RoKHBiLCBsZW5ndGgpOworCisgICAgLy8gd3JpdGUgdWlkCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMTYsIDB4M0MwQSk7CisgICAgbXhmX3dyaXRlX3V1aWQocGIsIElkZW50aWZpY2F0aW9uLCAwKTsKKyAgICBQUklOVF9LRVkocywgImlkZW50aWZpY2F0aW9uIHVpZCIsIHBiLT5idWZfcHRyIC0gMTYpOworCisgICAgLy8gd3JpdGUgZ2VuZXJhdGlvbiB1aWQKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHgzQzA5KTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgSWRlbnRpZmljYXRpb24sIDEpOworCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZ191dGYxNihwYiwgMHgzQzAxLCBjb21wYW55KTsgLy8gQ29tcGFueSBOYW1lCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZ191dGYxNihwYiwgMHgzQzAyLCBwcm9kdWN0KTsgLy8gUHJvZHVjdCBOYW1lCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZ191dGYxNihwYiwgMHgzQzA0LCB2ZXJzaW9uKTsgLy8gVmVyc2lvbiBTdHJpbmcKKworICAgIC8vIHdyaXRlIHByb2R1Y3QgdWlkCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMTYsIDB4M0MwNSk7CisgICAgbXhmX3dyaXRlX3V1aWQocGIsIElkZW50aWZpY2F0aW9uLCAyKTsKKworICAgIC8vIG1vZGlmaWNhdGlvbiBkYXRlCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgOCwgMHgzQzA2KTsKKyAgICBhdmlvX3diNjQocGIsIG14Zi0+dGltZXN0YW1wKTsKK30KKworc3RhdGljIHZvaWQgbXhmX3dyaXRlX2NvbnRlbnRfc3RvcmFnZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICBteGZfd3JpdGVfbWV0YWRhdGFfa2V5KHBiLCAweDAxMTgwMCk7CisgICAgUFJJTlRfS0VZKHMsICJjb250ZW50IHN0b3JhZ2Uga2V5IiwgcGItPmJ1Zl9wdHIgLSAxNik7CisgICAga2x2X2VuY29kZV9iZXJfbGVuZ3RoKHBiLCA5Mik7CisKKyAgICAvLyB3cml0ZSB1aWQKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHgzQzBBKTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgQ29udGVudFN0b3JhZ2UsIDApOworICAgIFBSSU5UX0tFWShzLCAiY29udGVudCBzdG9yYWdlIHVpZCIsIHBiLT5idWZfcHRyIC0gMTYpOworCisgICAgLy8gd3JpdGUgcGFja2FnZSByZWZlcmVuY2UKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiAqIDIgKyA4LCAweDE5MDEpOworICAgIG14Zl93cml0ZV9yZWZzX2NvdW50KHBiLCAyKTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgTWF0ZXJpYWxQYWNrYWdlLCAwKTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgU291cmNlUGFja2FnZSwgMCk7CisKKyAgICAvLyB3cml0ZSBlc3NlbmNlIGNvbnRhaW5lciBkYXRhCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgOCArIDE2LCAweDE5MDIpOworICAgIG14Zl93cml0ZV9yZWZzX2NvdW50KHBiLCAxKTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgRXNzZW5jZUNvbnRhaW5lckRhdGEsIDApOworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfdHJhY2soQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGUpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIE1YRlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKKworICAgIG14Zl93cml0ZV9tZXRhZGF0YV9rZXkocGIsIDB4MDEzYjAwKTsKKyAgICBQUklOVF9LRVkocywgInRyYWNrIGtleSIsIHBiLT5idWZfcHRyIC0gMTYpOworICAgIGtsdl9lbmNvZGVfYmVyX2xlbmd0aChwYiwgODApOworCisgICAgLy8gd3JpdGUgdHJhY2sgdWlkCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMTYsIDB4M0MwQSk7CisgICAgbXhmX3dyaXRlX3V1aWQocGIsIHR5cGUgPT0gTWF0ZXJpYWxQYWNrYWdlID8gVHJhY2sgOiBUcmFjayArIFR5cGVCb3R0b20sIHN0LT5pbmRleCk7CisgICAgUFJJTlRfS0VZKHMsICJ0cmFjayB1aWQiLCBwYi0+YnVmX3B0ciAtIDE2KTsKKworICAgIC8vIHdyaXRlIHRyYWNrIGlkCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgNCwgMHg0ODAxKTsKKyAgICBhdmlvX3diMzIocGIsIHN0LT5pbmRleCsyKTsKKworICAgIC8vIHdyaXRlIHRyYWNrIG51bWJlcgorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4NDgwNCk7CisgICAgaWYgKHR5cGUgPT0gTWF0ZXJpYWxQYWNrYWdlKQorICAgICAgICBhdmlvX3diMzIocGIsIDApOyAvLyB0cmFjayBudW1iZXIgb2YgbWF0ZXJpYWwgcGFja2FnZSBpcyAwCisgICAgZWxzZQorICAgICAgICBhdmlvX3dyaXRlKHBiLCBzYy0+dHJhY2tfZXNzZW5jZV9lbGVtZW50X2tleSArIDEyLCA0KTsKKworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDgsIDB4NEIwMSk7CisgICAgYXZpb193YjMyKHBiLCBteGYtPnRpbWVfYmFzZS5kZW4pOworICAgIGF2aW9fd2IzMihwYiwgbXhmLT50aW1lX2Jhc2UubnVtKTsKKworICAgIC8vIHdyaXRlIG9yaWdpbgorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDgsIDB4NEIwMik7CisgICAgYXZpb193YjY0KHBiLCAwKTsKKworICAgIC8vIHdyaXRlIHNlcXVlbmNlIHJlZnMKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHg0ODAzKTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgdHlwZSA9PSBNYXRlcmlhbFBhY2thZ2UgPyBTZXF1ZW5jZTogU2VxdWVuY2UgKyBUeXBlQm90dG9tLCBzdC0+aW5kZXgpOworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCBzbXB0ZV8xMm1fdGltZWNvZGVfdHJhY2tfZGF0YV91bFtdID0geyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAzLDB4MDIsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwIH07CisKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9jb21tb25fZmllbGRzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0KQoreworICAgIE1YRkNvbnRleHQgKm14ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKworICAgIC8vIGZpbmQgZGF0YSBkZWZpbmUgdWxzCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMTYsIDB4MDIwMSk7CisgICAgaWYgKHN0ID09IG14Zi0+dGltZWNvZGVfdHJhY2spCisgICAgICAgIGF2aW9fd3JpdGUocGIsIHNtcHRlXzEybV90aW1lY29kZV90cmFja19kYXRhX3VsLCAxNik7CisgICAgZWxzZSB7CisgICAgICAgIGNvbnN0IE1YRkNvZGVjVUwgKmRhdGFfZGVmX3VsID0gbXhmX2dldF9kYXRhX2RlZmluaXRpb25fdWwoc3QtPmNvZGVjLT5jb2RlY190eXBlKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgZGF0YV9kZWZfdWwtPnVpZCwgMTYpOworICAgIH0KKworICAgIC8vIHdyaXRlIGR1cmF0aW9uCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgOCwgMHgwMjAyKTsKKyAgICBhdmlvX3diNjQocGIsIG14Zi0+ZHVyYXRpb24pOworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfc2VxdWVuY2UoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGUpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIGNvbXBvbmVudDsKKworICAgIG14Zl93cml0ZV9tZXRhZGF0YV9rZXkocGIsIDB4MDEwZjAwKTsKKyAgICBQUklOVF9LRVkocywgInNlcXVlbmNlIGtleSIsIHBiLT5idWZfcHRyIC0gMTYpOworICAgIGtsdl9lbmNvZGVfYmVyX2xlbmd0aChwYiwgODApOworCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMTYsIDB4M0MwQSk7CisgICAgbXhmX3dyaXRlX3V1aWQocGIsIHR5cGUgPT0gTWF0ZXJpYWxQYWNrYWdlID8gU2VxdWVuY2U6IFNlcXVlbmNlICsgVHlwZUJvdHRvbSwgc3QtPmluZGV4KTsKKworICAgIFBSSU5UX0tFWShzLCAic2VxdWVuY2UgdWlkIiwgcGItPmJ1Zl9wdHIgLSAxNik7CisgICAgbXhmX3dyaXRlX2NvbW1vbl9maWVsZHMocywgc3QpOworCisgICAgLy8gd3JpdGUgc3RydWN0dXJhbCBjb21wb25lbnQKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiArIDgsIDB4MTAwMSk7CisgICAgbXhmX3dyaXRlX3JlZnNfY291bnQocGIsIDEpOworICAgIGlmIChzdCA9PSBteGYtPnRpbWVjb2RlX3RyYWNrKQorICAgICAgICBjb21wb25lbnQgPSBUaW1lY29kZUNvbXBvbmVudDsKKyAgICBlbHNlCisgICAgICAgIGNvbXBvbmVudCA9IFNvdXJjZUNsaXA7CisgICAgaWYgKHR5cGUgPT0gU291cmNlUGFja2FnZSkKKyAgICAgICAgY29tcG9uZW50ICs9IFR5cGVCb3R0b207CisgICAgbXhmX3dyaXRlX3V1aWQocGIsIGNvbXBvbmVudCwgc3QtPmluZGV4KTsKK30KKworc3RhdGljIHZvaWQgbXhmX3dyaXRlX3RpbWVjb2RlX2NvbXBvbmVudChBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgZW51bSBNWEZNZXRhZGF0YVNldFR5cGUgdHlwZSkKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICBteGZfd3JpdGVfbWV0YWRhdGFfa2V5KHBiLCAweDAxMTQwMCk7CisgICAga2x2X2VuY29kZV9iZXJfbGVuZ3RoKHBiLCA3NSk7CisKKyAgICAvLyBVSUQKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHgzQzBBKTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgdHlwZSA9PSBNYXRlcmlhbFBhY2thZ2UgPyBUaW1lY29kZUNvbXBvbmVudCA6CisgICAgICAgICAgICAgICAgICAgVGltZWNvZGVDb21wb25lbnQgKyBUeXBlQm90dG9tLCBzdC0+aW5kZXgpOworCisgICAgbXhmX3dyaXRlX2NvbW1vbl9maWVsZHMocywgc3QpOworCisgICAgLy8gU3RhcnQgVGltZSBDb2RlCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgOCwgMHgxNTAxKTsKKyAgICBhdmlvX3diNjQocGIsIG14Zi0+dGMuc3RhcnQpOworCisgICAgLy8gUm91bmRlZCBUaW1lIENvZGUgQmFzZQorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDIsIDB4MTUwMik7CisgICAgYXZpb193YjE2KHBiLCBteGYtPnRpbWVjb2RlX2Jhc2UpOworCisgICAgLy8gRHJvcCBGcmFtZQorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDEsIDB4MTUwMyk7CisgICAgYXZpb193OChwYiwgISEobXhmLT50Yy5mbGFncyAmIEFWX1RJTUVDT0RFX0ZMQUdfRFJPUEZSQU1FKSk7Cit9CisKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9zdHJ1Y3R1cmFsX2NvbXBvbmVudChBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgZW51bSBNWEZNZXRhZGF0YVNldFR5cGUgdHlwZSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgaTsKKworICAgIG14Zl93cml0ZV9tZXRhZGF0YV9rZXkocGIsIDB4MDExMTAwKTsKKyAgICBQUklOVF9LRVkocywgInN0dXJjdHVyYWwgY29tcG9uZW50IGtleSIsIHBiLT5idWZfcHRyIC0gMTYpOworICAgIGtsdl9lbmNvZGVfYmVyX2xlbmd0aChwYiwgMTA4KTsKKworICAgIC8vIHdyaXRlIHVpZAorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDNDMEEpOworICAgIG14Zl93cml0ZV91dWlkKHBiLCB0eXBlID09IE1hdGVyaWFsUGFja2FnZSA/IFNvdXJjZUNsaXA6IFNvdXJjZUNsaXAgKyBUeXBlQm90dG9tLCBzdC0+aW5kZXgpOworCisgICAgUFJJTlRfS0VZKHMsICJzdHJ1Y3R1cmFsIGNvbXBvbmVudCB1aWQiLCBwYi0+YnVmX3B0ciAtIDE2KTsKKyAgICBteGZfd3JpdGVfY29tbW9uX2ZpZWxkcyhzLCBzdCk7CisKKyAgICAvLyB3cml0ZSBzdGFydF9wb3NpdGlvbgorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDgsIDB4MTIwMSk7CisgICAgYXZpb193YjY0KHBiLCAwKTsKKworICAgIC8vIHdyaXRlIHNvdXJjZSBwYWNrYWdlIHVpZCwgZW5kIG9mIHRoZSByZWZlcmVuY2UKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAzMiwgMHgxMTAxKTsKKyAgICBpZiAodHlwZSA9PSBTb3VyY2VQYWNrYWdlKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBhdmlvX3diNjQocGIsIDApOworICAgIH0gZWxzZQorICAgICAgICBteGZfd3JpdGVfdW1pZChzLCAxKTsKKworICAgIC8vIHdyaXRlIHNvdXJjZSB0cmFjayBpZAorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4MTEwMik7CisgICAgaWYgKHR5cGUgPT0gU291cmNlUGFja2FnZSkKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBlbHNlCisgICAgICAgIGF2aW9fd2IzMihwYiwgc3QtPmluZGV4KzIpOworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfbXVsdGlfZGVzY3JpcHRvcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGNvbnN0IHVpbnQ4X3QgKnVsOworICAgIGludCBpOworCisgICAgbXhmX3dyaXRlX21ldGFkYXRhX2tleShwYiwgMHgwMTQ0MDApOworICAgIFBSSU5UX0tFWShzLCAibXVsdGlwbGUgZGVzY3JpcHRvciBrZXkiLCBwYi0+YnVmX3B0ciAtIDE2KTsKKyAgICBrbHZfZW5jb2RlX2Jlcl9sZW5ndGgocGIsIDY0ICsgMTZMTCAqIHMtPm5iX3N0cmVhbXMpOworCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMTYsIDB4M0MwQSk7CisgICAgbXhmX3dyaXRlX3V1aWQocGIsIE11bHRpcGxlRGVzY3JpcHRvciwgMCk7CisgICAgUFJJTlRfS0VZKHMsICJtdWx0aV9kZXNjIHVpZCIsIHBiLT5idWZfcHRyIC0gMTYpOworCisgICAgLy8gd3JpdGUgc2FtcGxlIHJhdGUKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA4LCAweDMwMDEpOworICAgIGF2aW9fd2IzMihwYiwgbXhmLT50aW1lX2Jhc2UuZGVuKTsKKyAgICBhdmlvX3diMzIocGIsIG14Zi0+dGltZV9iYXNlLm51bSk7CisKKyAgICAvLyB3cml0ZSBlc3NlbmNlIGNvbnRhaW5lciB1bAorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDMwMDQpOworICAgIGlmIChteGYtPmVzc2VuY2VfY29udGFpbmVyX2NvdW50ID4gMSkKKyAgICAgICAgdWwgPSBtdWx0aXBsZV9kZXNjX3VsOworICAgIGVsc2UgeworICAgICAgICBNWEZTdHJlYW1Db250ZXh0ICpzYyA9IHMtPnN0cmVhbXNbMF0tPnByaXZfZGF0YTsKKyAgICAgICAgdWwgPSBteGZfZXNzZW5jZV9jb250YWluZXJfdWxzW3NjLT5pbmRleF0uY29udGFpbmVyX3VsOworICAgIH0KKyAgICBhdmlvX3dyaXRlKHBiLCB1bCwgMTYpOworCisgICAgLy8gd3JpdGUgc3ViIGRlc2NyaXB0b3IgcmVmcworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIHMtPm5iX3N0cmVhbXMgKiAxNiArIDgsIDB4M0YwMSk7CisgICAgbXhmX3dyaXRlX3JlZnNfY291bnQocGIsIHMtPm5iX3N0cmVhbXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIG14Zl93cml0ZV91dWlkKHBiLCBTdWJEZXNjcmlwdG9yLCBpKTsKK30KKworc3RhdGljIHZvaWQgbXhmX3dyaXRlX2dlbmVyaWNfZGVzYyhBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgY29uc3QgVUlEIGtleSwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBzLT5wcml2X2RhdGE7CisgICAgTVhGU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworCisgICAgYXZpb193cml0ZShwYiwga2V5LCAxNik7CisgICAga2x2X2VuY29kZV9iZXI0X2xlbmd0aChwYiwgc2l6ZSsyMCs4KzEyKzIwKTsKKworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDNDMEEpOworICAgIG14Zl93cml0ZV91dWlkKHBiLCBTdWJEZXNjcmlwdG9yLCBzdC0+aW5kZXgpOworCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgNCwgMHgzMDA2KTsKKyAgICBhdmlvX3diMzIocGIsIHN0LT5pbmRleCsyKTsKKworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDgsIDB4MzAwMSk7CisgICAgYXZpb193YjMyKHBiLCBteGYtPnRpbWVfYmFzZS5kZW4pOworICAgIGF2aW9fd2IzMihwYiwgbXhmLT50aW1lX2Jhc2UubnVtKTsKKworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDMwMDQpOworICAgIGF2aW9fd3JpdGUocGIsIG14Zl9lc3NlbmNlX2NvbnRhaW5lcl91bHNbc2MtPmluZGV4XS5jb250YWluZXJfdWwsIDE2KTsKK30KKworc3RhdGljIGNvbnN0IFVJRCBteGZfbXBlZ3ZpZGVvX2Rlc2NyaXB0b3Jfa2V5ID0geyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHg1MSwweDAwIH07CitzdGF0aWMgY29uc3QgVUlEIG14Zl93YXZfZGVzY3JpcHRvcl9rZXkgICAgICAgPSB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMiwweDUzLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDQ4LDB4MDAgfTsKK3N0YXRpYyBjb25zdCBVSUQgbXhmX2FlczNfZGVzY3JpcHRvcl9rZXkgICAgICA9IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAyLDB4NTMsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4NDcsMHgwMCB9Oworc3RhdGljIGNvbnN0IFVJRCBteGZfY2RjaV9kZXNjcmlwdG9yX2tleSAgICAgID0geyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwRCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgyOCwweDAwIH07CitzdGF0aWMgY29uc3QgVUlEIG14Zl9nZW5lcmljX3NvdW5kX2Rlc2NyaXB0b3Jfa2V5ID0geyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwRCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHg0MiwweDAwIH07CisKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9jZGNpX2NvbW1vbihBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgY29uc3QgVUlEIGtleSwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBNWEZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHN0b3JlZF9oZWlnaHQgPSAoc3QtPmNvZGVjLT5oZWlnaHQrMTUpLzE2KjE2OworICAgIGludCBkaXNwbGF5X2hlaWdodDsKKyAgICBpbnQgZjEsIGYyOworICAgIHVuc2lnbmVkIGRlc2Nfc2l6ZSA9IHNpemUrOCs4KzgrOCs4KzgrNSsxNitzYy0+aW50ZXJsYWNlZCo0KzEyKzIwOworICAgIGlmIChzYy0+aW50ZXJsYWNlZCAmJiBzYy0+ZmllbGRfZG9taW5hbmNlKQorICAgICAgICBkZXNjX3NpemUgKz0gNTsKKworICAgIG14Zl93cml0ZV9nZW5lcmljX2Rlc2Mocywgc3QsIGtleSwgZGVzY19zaXplKTsKKworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4MzIwMyk7CisgICAgYXZpb193YjMyKHBiLCBzdC0+Y29kZWMtPndpZHRoKTsKKworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4MzIwMik7CisgICAgYXZpb193YjMyKHBiLCBzdG9yZWRfaGVpZ2h0Pj5zYy0+aW50ZXJsYWNlZCk7CisKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA0LCAweDMyMDkpOworICAgIGF2aW9fd2IzMihwYiwgc3QtPmNvZGVjLT53aWR0aCk7CisKKyAgICBpZiAoc3QtPmNvZGVjLT5oZWlnaHQgPT0gNjA4KSAvLyBQQUwgKyBWQkkKKyAgICAgICAgZGlzcGxheV9oZWlnaHQgPSA1NzY7CisgICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5oZWlnaHQgPT0gNTEyKSAgLy8gTlRTQyArIFZCSQorICAgICAgICBkaXNwbGF5X2hlaWdodCA9IDQ4NjsKKyAgICBlbHNlCisgICAgICAgIGRpc3BsYXlfaGVpZ2h0ID0gc3QtPmNvZGVjLT5oZWlnaHQ7CisKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA0LCAweDMyMDgpOworICAgIGF2aW9fd2IzMihwYiwgZGlzcGxheV9oZWlnaHQ+PnNjLT5pbnRlcmxhY2VkKTsKKworICAgIC8vIGNvbXBvbmVudCBkZXB0aAorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4MzMwMSk7CisgICAgYXZpb193YjMyKHBiLCBzYy0+Y29tcG9uZW50X2RlcHRoKTsKKworICAgIC8vIGhvcml6b250YWwgc3Vic2FtcGxpbmcKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA0LCAweDMzMDIpOworICAgIGF2aW9fd2IzMihwYiwgMik7CisKKyAgICAvLyBmcmFtZSBsYXlvdXQKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxLCAweDMyMEMpOworICAgIGF2aW9fdzgocGIsIHNjLT5pbnRlcmxhY2VkKTsKKworICAgIC8vIHZpZGVvIGxpbmUgbWFwCisgICAgc3dpdGNoIChzdC0+Y29kZWMtPmhlaWdodCkgeworICAgIGNhc2UgIDU3NjogZjEgPSAyMzsgZjIgPSBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8gPyAzMzUgOiAzMzY7IGJyZWFrOworICAgIGNhc2UgIDYwODogZjEgPSAgNzsgZjIgPSAzMjA7IGJyZWFrOworICAgIGNhc2UgIDQ4MDogZjEgPSAyMDsgZjIgPSBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8gPyAyODUgOiAyODM7IGJyZWFrOworICAgIGNhc2UgIDUxMjogZjEgPSAgNzsgZjIgPSAyNzA7IGJyZWFrOworICAgIGNhc2UgIDcyMDogZjEgPSAyNjsgZjIgPSAgIDA7IGJyZWFrOyAvLyBwcm9ncmVzc2l2ZQorICAgIGNhc2UgMTA4MDogZjEgPSAyMTsgZjIgPSA1ODQ7IGJyZWFrOworICAgIGRlZmF1bHQ6ICAgZjEgPSAgMDsgZjIgPSAgIDA7IGJyZWFrOworICAgIH0KKworICAgIGlmICghc2MtPmludGVybGFjZWQpIHsKKyAgICAgICAgZjIgID0gMDsKKyAgICAgICAgZjEgKj0gMjsKKyAgICB9CisKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxMitzYy0+aW50ZXJsYWNlZCo0LCAweDMyMEQpOworICAgIGF2aW9fd2IzMihwYiwgc2MtPmludGVybGFjZWQgPyAyIDogMSk7CisgICAgYXZpb193YjMyKHBiLCA0KTsKKyAgICBhdmlvX3diMzIocGIsIGYxKTsKKyAgICBpZiAoc2MtPmludGVybGFjZWQpCisgICAgICAgIGF2aW9fd2IzMihwYiwgZjIpOworCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgOCwgMHgzMjBFKTsKKyAgICBhdmlvX3diMzIocGIsIHNjLT5hc3BlY3RfcmF0aW8ubnVtKTsKKyAgICBhdmlvX3diMzIocGIsIHNjLT5hc3BlY3RfcmF0aW8uZGVuKTsKKworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDMyMDEpOworICAgIGF2aW9fd3JpdGUocGIsICpzYy0+Y29kZWNfdWwsIDE2KTsKKworICAgIGlmIChzYy0+aW50ZXJsYWNlZCAmJiBzYy0+ZmllbGRfZG9taW5hbmNlKSB7CisgICAgICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDEsIDB4MzIxMik7CisgICAgICAgIGF2aW9fdzgocGIsIHNjLT5maWVsZF9kb21pbmFuY2UpOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfY2RjaV9kZXNjKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0KQoreworICAgIG14Zl93cml0ZV9jZGNpX2NvbW1vbihzLCBzdCwgbXhmX2NkY2lfZGVzY3JpcHRvcl9rZXksIDApOworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfbXBlZ3ZpZGVvX2Rlc2MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgTVhGU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOworICAgIGludCBwcm9maWxlX2FuZF9sZXZlbCA9IChzdC0+Y29kZWMtPnByb2ZpbGU8PDQpIHwgc3QtPmNvZGVjLT5sZXZlbDsKKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgbXhmX3dyaXRlX2NkY2lfY29tbW9uKHMsIHN0LCBteGZfbXBlZ3ZpZGVvX2Rlc2NyaXB0b3Jfa2V5LCA4KzUpOworCisgICAgICAgIC8vIGJpdCByYXRlCisgICAgICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4ODAwMCk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc2MtPnZpZGVvX2JpdF9yYXRlKTsKKworICAgICAgICAvLyBwcm9maWxlIGFuZCBsZXZlbAorICAgICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxLCAweDgwMDcpOworICAgICAgICBpZiAoIXN0LT5jb2RlYy0+cHJvZmlsZSkKKyAgICAgICAgICAgIHByb2ZpbGVfYW5kX2xldmVsIHw9IDB4ODA7IC8vIGVzY2FwZSBiaXQKKyAgICAgICAgYXZpb193OChwYiwgcHJvZmlsZV9hbmRfbGV2ZWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIG14Zl93cml0ZV9jZGNpX2NvbW1vbihzLCBzdCwgbXhmX21wZWd2aWRlb19kZXNjcmlwdG9yX2tleSwgMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfZ2VuZXJpY19zb3VuZF9jb21tb24oQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIGNvbnN0IFVJRCBrZXksIHVuc2lnbmVkIHNpemUpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIGludCBzaG93X3dhcm5pbmdzID0gIW14Zi0+Zm9vdGVyX3BhcnRpdGlvbl9vZmZzZXQ7CisKKyAgICBteGZfd3JpdGVfZ2VuZXJpY19kZXNjKHMsIHN0LCBrZXksIHNpemUrNSsxMis4KzgpOworCisgICAgLy8gYXVkaW8gbG9ja2VkCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMSwgMHgzRDAyKTsKKyAgICBhdmlvX3c4KHBiLCAxKTsKKworICAgIC8vIHdyaXRlIGF1ZGlvIHNhbXBsaW5nIHJhdGUKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA4LCAweDNEMDMpOworICAgIGF2aW9fd2IzMihwYiwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZpb193YjMyKHBiLCAxKTsKKworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4M0QwNyk7CisgICAgaWYgKG14Zi0+Y2hhbm5lbF9jb3VudCA9PSAtMSkgeworICAgICAgICBpZiAoc2hvd193YXJuaW5ncyAmJiAocy0+b2Zvcm1hdCA9PSAmZmZfbXhmX2QxMF9tdXhlcikgJiYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgIT0gNCkgJiYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgIT0gOCkpCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJ0aGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHNoYWxsIGJlIDQgb3IgOCA6IHRoZSBvdXRwdXQgd2lsbCBub3QgY29tcGx5IHRvIE1YRiBELTEwIHNwZWNzLCB1c2UgLWQxMF9jaGFubmVsY291bnQgdG8gZml4IHRoaXNcbiIpOworICAgICAgICBhdmlvX3diMzIocGIsIHN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgIH0gZWxzZSBpZiAocy0+b2Zvcm1hdCA9PSAmZmZfbXhmX2QxMF9tdXhlcikgeworICAgICAgICBpZiAoc2hvd193YXJuaW5ncyAmJiAobXhmLT5jaGFubmVsX2NvdW50IDwgc3QtPmNvZGVjLT5jaGFubmVscykpCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJkMTBfY2hhbm5lbGNvdW50IDwgYWN0dWFsIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyA6IHNvbWUgY2hhbm5lbHMgd2lsbCBiZSBkaXNjYXJkZWRcbiIpOworICAgICAgICBpZiAoc2hvd193YXJuaW5ncyAmJiAobXhmLT5jaGFubmVsX2NvdW50ICE9IDQpICYmIChteGYtPmNoYW5uZWxfY291bnQgIT0gOCkpCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJkMTBfY2hhbm5lbGNvdW50IHNoYWxsIGJlIHNldCB0byA0IG9yIDggOiB0aGUgb3V0cHV0IHdpbGwgbm90IGNvbXBseSB0byBNWEYgRC0xMCBzcGVjc1xuIik7CisgICAgICAgIGF2aW9fd2IzMihwYiwgbXhmLT5jaGFubmVsX2NvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2hvd193YXJuaW5ncyAmJiBteGYtPmNoYW5uZWxfY291bnQgIT0gLTEpCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiLWQxMF9jaGFubmVsY291bnQgcmVxdWlyZXMgTVhGIEQtMTAgYW5kIHdpbGwgYmUgaWdub3JlZFxuIik7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc3QtPmNvZGVjLT5jaGFubmVscyk7CisgICAgfQorCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgNCwgMHgzRDAxKTsKKyAgICBhdmlvX3diMzIocGIsIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCkpOworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfd2F2X2NvbW1vbihBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgY29uc3QgVUlEIGtleSwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKworICAgIG14Zl93cml0ZV9nZW5lcmljX3NvdW5kX2NvbW1vbihzLCBzdCwga2V5LCBzaXplKzYrOCk7CisKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAyLCAweDNEMEEpOworICAgIGF2aW9fd2IxNihwYiwgc3QtPmNvZGVjLT5ibG9ja19hbGlnbik7CisKKyAgICAvLyBhdmcgYnl0ZXMgcGVyIHNlYworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4M0QwOSk7CisgICAgYXZpb193YjMyKHBiLCBzdC0+Y29kZWMtPmJsb2NrX2FsaWduKnN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfd2F2X2Rlc2MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCit7CisgICAgbXhmX3dyaXRlX3dhdl9jb21tb24ocywgc3QsIG14Zl93YXZfZGVzY3JpcHRvcl9rZXksIDApOworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfYWVzM19kZXNjKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0KQoreworICAgIG14Zl93cml0ZV93YXZfY29tbW9uKHMsIHN0LCBteGZfYWVzM19kZXNjcmlwdG9yX2tleSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9nZW5lcmljX3NvdW5kX2Rlc2MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCit7CisgICAgbXhmX3dyaXRlX2dlbmVyaWNfc291bmRfY29tbW9uKHMsIHN0LCBteGZfZ2VuZXJpY19zb3VuZF9kZXNjcmlwdG9yX2tleSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9wYWNrYWdlKEFWRm9ybWF0Q29udGV4dCAqcywgZW51bSBNWEZNZXRhZGF0YVNldFR5cGUgdHlwZSkKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGksIHRyYWNrX2NvdW50ID0gcy0+bmJfc3RyZWFtcysxOworCisgICAgaWYgKHR5cGUgPT0gTWF0ZXJpYWxQYWNrYWdlKSB7CisgICAgICAgIG14Zl93cml0ZV9tZXRhZGF0YV9rZXkocGIsIDB4MDEzNjAwKTsKKyAgICAgICAgUFJJTlRfS0VZKHMsICJNYXRlcmlhbCBQYWNrYWdlIGtleSIsIHBiLT5idWZfcHRyIC0gMTYpOworICAgICAgICBrbHZfZW5jb2RlX2Jlcl9sZW5ndGgocGIsIDkyICsgMTYqdHJhY2tfY291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG14Zl93cml0ZV9tZXRhZGF0YV9rZXkocGIsIDB4MDEzNzAwKTsKKyAgICAgICAgUFJJTlRfS0VZKHMsICJTb3VyY2UgUGFja2FnZSBrZXkiLCBwYi0+YnVmX3B0ciAtIDE2KTsKKyAgICAgICAga2x2X2VuY29kZV9iZXJfbGVuZ3RoKHBiLCAxMTIgKyAxNip0cmFja19jb3VudCk7IC8vIDIwIGJ5dGVzIGxlbmd0aCBmb3IgZGVzY3JpcHRvciByZWZlcmVuY2UKKyAgICB9CisKKyAgICAvLyB3cml0ZSB1aWQKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHgzQzBBKTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgdHlwZSwgMCk7CisgICAgYXZfbG9nKHMsQVZfTE9HX0RFQlVHLCAicGFja2FnZSB0eXBlOiVkXG4iLCB0eXBlKTsKKyAgICBQUklOVF9LRVkocywgInBhY2thZ2UgdWlkIiwgcGItPmJ1Zl9wdHIgLSAxNik7CisKKyAgICAvLyB3cml0ZSBwYWNrYWdlIHVtaWQKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAzMiwgMHg0NDAxKTsKKyAgICBteGZfd3JpdGVfdW1pZChzLCB0eXBlID09IFNvdXJjZVBhY2thZ2UpOworICAgIFBSSU5UX0tFWShzLCAicGFja2FnZSB1bWlkIHNlY29uZCBwYXJ0IiwgcGItPmJ1Zl9wdHIgLSAxNik7CisKKyAgICAvLyBwYWNrYWdlIGNyZWF0aW9uIGRhdGUKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA4LCAweDQ0MDUpOworICAgIGF2aW9fd2I2NChwYiwgbXhmLT50aW1lc3RhbXApOworCisgICAgLy8gcGFja2FnZSBtb2RpZmllZCBkYXRlCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgOCwgMHg0NDA0KTsKKyAgICBhdmlvX3diNjQocGIsIG14Zi0+dGltZXN0YW1wKTsKKworICAgIC8vIHdyaXRlIHRyYWNrIHJlZnMKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCB0cmFja19jb3VudCoxNiArIDgsIDB4NDQwMyk7CisgICAgbXhmX3dyaXRlX3JlZnNfY291bnQocGIsIHRyYWNrX2NvdW50KTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgdHlwZSA9PSBNYXRlcmlhbFBhY2thZ2UgPyBUcmFjayA6CisgICAgICAgICAgICAgICAgICAgVHJhY2sgKyBUeXBlQm90dG9tLCAtMSk7IC8vIHRpbWVjb2RlIHRyYWNrCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgbXhmX3dyaXRlX3V1aWQocGIsIHR5cGUgPT0gTWF0ZXJpYWxQYWNrYWdlID8gVHJhY2sgOiBUcmFjayArIFR5cGVCb3R0b20sIGkpOworCisgICAgLy8gd3JpdGUgbXVsdGlwbGUgZGVzY3JpcHRvciByZWZlcmVuY2UKKyAgICBpZiAodHlwZSA9PSBTb3VyY2VQYWNrYWdlKSB7CisgICAgICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDQ3MDEpOworICAgICAgICBpZiAocy0+bmJfc3RyZWFtcyA+IDEpIHsKKyAgICAgICAgICAgIG14Zl93cml0ZV91dWlkKHBiLCBNdWx0aXBsZURlc2NyaXB0b3IsIDApOworICAgICAgICAgICAgbXhmX3dyaXRlX211bHRpX2Rlc2NyaXB0b3Iocyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbXhmX3dyaXRlX3V1aWQocGIsIFN1YkRlc2NyaXB0b3IsIDApOworICAgIH0KKworICAgIC8vIHdyaXRlIHRpbWVjb2RlIHRyYWNrCisgICAgbXhmX3dyaXRlX3RyYWNrKHMsIG14Zi0+dGltZWNvZGVfdHJhY2ssIHR5cGUpOworICAgIG14Zl93cml0ZV9zZXF1ZW5jZShzLCBteGYtPnRpbWVjb2RlX3RyYWNrLCB0eXBlKTsKKyAgICBteGZfd3JpdGVfdGltZWNvZGVfY29tcG9uZW50KHMsIG14Zi0+dGltZWNvZGVfdHJhY2ssIHR5cGUpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBteGZfd3JpdGVfdHJhY2socywgc3QsIHR5cGUpOworICAgICAgICBteGZfd3JpdGVfc2VxdWVuY2Uocywgc3QsIHR5cGUpOworICAgICAgICBteGZfd3JpdGVfc3RydWN0dXJhbF9jb21wb25lbnQocywgc3QsIHR5cGUpOworCisgICAgICAgIGlmICh0eXBlID09IFNvdXJjZVBhY2thZ2UpIHsKKyAgICAgICAgICAgIE1YRlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKKyAgICAgICAgICAgIG14Zl9lc3NlbmNlX2NvbnRhaW5lcl91bHNbc2MtPmluZGV4XS53cml0ZV9kZXNjKHMsIHN0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBteGZfd3JpdGVfZXNzZW5jZV9jb250YWluZXJfZGF0YShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICBteGZfd3JpdGVfbWV0YWRhdGFfa2V5KHBiLCAweDAxMjMwMCk7CisgICAga2x2X2VuY29kZV9iZXJfbGVuZ3RoKHBiLCA3Mik7CisKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHgzQzBBKTsgLy8gSW5zdGFuY2UgVUlECisgICAgbXhmX3dyaXRlX3V1aWQocGIsIEVzc2VuY2VDb250YWluZXJEYXRhLCAwKTsKKworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDMyLCAweDI3MDEpOyAvLyBMaW5rZWQgUGFja2FnZSBVSUQKKyAgICBteGZfd3JpdGVfdW1pZChzLCAxKTsKKworICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4M0YwNyk7IC8vIEJvZHlTSUQKKyAgICBhdmlvX3diMzIocGIsIDEpOworCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgNCwgMHgzRjA2KTsgLy8gSW5kZXhTSUQKKyAgICBhdmlvX3diMzIocGIsIDIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhmX3dyaXRlX2hlYWRlcl9tZXRhZGF0YV9zZXRzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBteGZfd3JpdGVfcHJlZmFjZShzKTsKKyAgICBteGZfd3JpdGVfaWRlbnRpZmljYXRpb24ocyk7CisgICAgbXhmX3dyaXRlX2NvbnRlbnRfc3RvcmFnZShzKTsKKyAgICBteGZfd3JpdGVfcGFja2FnZShzLCBNYXRlcmlhbFBhY2thZ2UpOworICAgIG14Zl93cml0ZV9wYWNrYWdlKHMsIFNvdXJjZVBhY2thZ2UpOworICAgIG14Zl93cml0ZV9lc3NlbmNlX2NvbnRhaW5lcl9kYXRhKHMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQga2x2X2ZpbGxfc2l6ZSh1aW50NjRfdCBzaXplKQoreworICAgIHVuc2lnbmVkIHBhZCA9IEtBR19TSVpFIC0gKHNpemUgJiAoS0FHX1NJWkUtMSkpOworICAgIGlmIChwYWQgPCAyMCkgLy8gc21hbGxlc3QgZmlsbCBpdGVtIHBvc3NpYmxlCisgICAgICAgIHJldHVybiBwYWQgKyBLQUdfU0laRTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBwYWQgJiAoS0FHX1NJWkUtMSk7Cit9CisKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9pbmRleF90YWJsZV9zZWdtZW50KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGksIGosIHRlbXBvcmFsX3Jlb3JkZXJpbmcgPSAwOworICAgIGludCBrZXlfaW5kZXggPSBteGYtPmxhc3Rfa2V5X2luZGV4OworCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImVkaXQgdW5pdHMgY291bnQgJWRcbiIsIG14Zi0+ZWRpdF91bml0c19jb3VudCk7CisKKyAgICBpZiAoIW14Zi0+ZWRpdF91bml0c19jb3VudCAmJiAhbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXZpb193cml0ZShwYiwgaW5kZXhfdGFibGVfc2VnbWVudF9rZXksIDE2KTsKKworICAgIGlmIChteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50KSB7CisgICAgICAgIGtsdl9lbmNvZGVfYmVyX2xlbmd0aChwYiwgODApOworICAgIH0gZWxzZSB7CisgICAgICAgIGtsdl9lbmNvZGVfYmVyX2xlbmd0aChwYiwgODUgKyAxMisocy0+bmJfc3RyZWFtcysxTEwpKjYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIrbXhmLT5lZGl0X3VuaXRzX2NvdW50KigxMStteGYtPnNsaWNlX2NvdW50KjRMTCkpOworICAgIH0KKworICAgIC8vIGluc3RhbmNlIGlkCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMTYsIDB4M0MwQSk7CisgICAgbXhmX3dyaXRlX3V1aWQocGIsIEluZGV4VGFibGVTZWdtZW50LCAwKTsKKworICAgIC8vIGluZGV4IGVkaXQgcmF0ZQorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDgsIDB4M0YwQik7CisgICAgYXZpb193YjMyKHBiLCBteGYtPnRpbWVfYmFzZS5kZW4pOworICAgIGF2aW9fd2IzMihwYiwgbXhmLT50aW1lX2Jhc2UubnVtKTsKKworICAgIC8vIGluZGV4IHN0YXJ0IHBvc2l0aW9uCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgOCwgMHgzRjBDKTsKKyAgICBhdmlvX3diNjQocGIsIG14Zi0+bGFzdF9pbmRleGVkX2VkaXRfdW5pdCk7CisKKyAgICAvLyBpbmRleCBkdXJhdGlvbgorICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDgsIDB4M0YwRCk7CisgICAgaWYgKG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQpCisgICAgICAgIGF2aW9fd2I2NChwYiwgMCk7IC8vIGluZGV4IHRhYmxlIGNvdmVycyB3aG9sZSBjb250YWluZXIKKyAgICBlbHNlCisgICAgICAgIGF2aW9fd2I2NChwYiwgbXhmLT5lZGl0X3VuaXRzX2NvdW50KTsKKworICAgIC8vIGVkaXQgdW5pdCBieXRlIGNvdW50CisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgNCwgMHgzRjA1KTsKKyAgICBhdmlvX3diMzIocGIsIG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQpOworCisgICAgLy8gaW5kZXggc2lkCisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgNCwgMHgzRjA2KTsKKyAgICBhdmlvX3diMzIocGIsIDIpOworCisgICAgLy8gYm9keSBzaWQKKyAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA0LCAweDNGMDcpOworICAgIGF2aW9fd2IzMihwYiwgMSk7CisKKyAgICBpZiAoIW14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQpIHsKKyAgICAgICAgLy8gcmVhbCBzbGljZSBjb3VudCAtIDEKKyAgICAgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMSwgMHgzRjA4KTsKKyAgICAgICAgYXZpb193OChwYiwgbXhmLT5zbGljZV9jb3VudCk7CisKKyAgICAgICAgLy8gZGVsdGEgZW50cnkgYXJyYXkKKyAgICAgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgOCArIChzLT5uYl9zdHJlYW1zKzEpKjYsIDB4M0YwOSk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgcy0+bmJfc3RyZWFtcysxKTsgLy8gbnVtIG9mIGVudHJpZXMKKyAgICAgICAgYXZpb193YjMyKHBiLCA2KTsgICAgICAgICAgICAgICAvLyBzaXplIG9mIG9uZSBlbnRyeQorICAgICAgICAvLyB3cml0ZSBzeXN0ZW0gaXRlbSBkZWx0YSBlbnRyeQorICAgICAgICBhdmlvX3c4KHBiLCAwKTsKKyAgICAgICAgYXZpb193OChwYiwgMCk7IC8vIHNsaWNlIGVudHJ5CisgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7IC8vIGVsZW1lbnQgZGVsdGEKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIE1YRlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIHNjLT50ZW1wb3JhbF9yZW9yZGVyaW5nKTsKKyAgICAgICAgICAgIGlmIChzYy0+dGVtcG9yYWxfcmVvcmRlcmluZykKKyAgICAgICAgICAgICAgICB0ZW1wb3JhbF9yZW9yZGVyaW5nID0gMTsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsgLy8gdmlkZW8gdHJhY2sKKyAgICAgICAgICAgICAgICBhdmlvX3c4KHBiLCAwKTsgLy8gc2xpY2UgbnVtYmVyCisgICAgICAgICAgICAgICAgYXZpb193YjMyKHBiLCBLQUdfU0laRSk7IC8vIHN5c3RlbSBpdGVtIHNpemUgaW5jbHVkaW5nIGtsdiBmaWxsCisgICAgICAgICAgICB9IGVsc2UgeyAvLyBhdWRpbyB0cmFjaworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGF1ZGlvX2ZyYW1lX3NpemUgPSBzYy0+YWljLnNhbXBsZXNbMF0qc2MtPmFpYy5zYW1wbGVfc2l6ZTsKKyAgICAgICAgICAgICAgICBhdWRpb19mcmFtZV9zaXplICs9IGtsdl9maWxsX3NpemUoYXVkaW9fZnJhbWVfc2l6ZSk7CisgICAgICAgICAgICAgICAgYXZpb193OChwYiwgMSk7CisgICAgICAgICAgICAgICAgYXZpb193YjMyKHBiLCAoaS0xKSphdWRpb19mcmFtZV9zaXplKTsgLy8gZWxlbWVudCBkZWx0YQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgOCArIG14Zi0+ZWRpdF91bml0c19jb3VudCooMTErbXhmLT5zbGljZV9jb3VudCo0KSwgMHgzRjBBKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBteGYtPmVkaXRfdW5pdHNfY291bnQpOyAgLy8gbnVtIG9mIGVudHJpZXMKKyAgICAgICAgYXZpb193YjMyKHBiLCAxMStteGYtPnNsaWNlX2NvdW50KjQpOyAgLy8gc2l6ZSBvZiBvbmUgZW50cnkKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXhmLT5lZGl0X3VuaXRzX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGludCB0ZW1wb3JhbF9vZmZzZXQgPSAwOworCisgICAgICAgICAgICBpZiAoIShteGYtPmluZGV4X2VudHJpZXNbaV0uZmxhZ3MgJiAweDMzKSkgeyAvLyBJIGZyYW1lCisgICAgICAgICAgICAgICAgbXhmLT5sYXN0X2tleV9pbmRleCA9IGtleV9pbmRleDsKKyAgICAgICAgICAgICAgICBrZXlfaW5kZXggPSBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGVtcG9yYWxfcmVvcmRlcmluZykgeworICAgICAgICAgICAgICAgIGludCBwaWNfbnVtX2luX2dvcCA9IGkgLSBrZXlfaW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKHBpY19udW1faW5fZ29wICE9IG14Zi0+aW5kZXhfZW50cmllc1tpXS50ZW1wb3JhbF9yZWYpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0ga2V5X2luZGV4OyBqIDwgbXhmLT5lZGl0X3VuaXRzX2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaWNfbnVtX2luX2dvcCA9PSBteGYtPmluZGV4X2VudHJpZXNbal0udGVtcG9yYWxfcmVmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChqID09IG14Zi0+ZWRpdF91bml0c19jb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIm1pc3NpbmcgZnJhbWVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxfb2Zmc2V0ID0gaiAtIGtleV9pbmRleCAtIHBpY19udW1faW5fZ29wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fdzgocGIsIHRlbXBvcmFsX29mZnNldCk7CisKKyAgICAgICAgICAgIGlmICgobXhmLT5pbmRleF9lbnRyaWVzW2ldLmZsYWdzICYgMHgzMCkgPT0gMHgzMCkgeyAvLyBiYWNrIGFuZCBmb3J3YXJkIHByZWRpY3Rpb24KKyAgICAgICAgICAgICAgICBhdmlvX3c4KHBiLCBteGYtPmxhc3Rfa2V5X2luZGV4IC0gaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIGtleV9pbmRleCAtIGkpOyAvLyBrZXkgZnJhbWUgb2Zmc2V0CisgICAgICAgICAgICAgICAgaWYgKChteGYtPmluZGV4X2VudHJpZXNbaV0uZmxhZ3MgJiAweDIwKSA9PSAweDIwKSAvLyBvbmx5IGZvcndhcmQKKyAgICAgICAgICAgICAgICAgICAgbXhmLT5sYXN0X2tleV9pbmRleCA9IGtleV9pbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEobXhmLT5pbmRleF9lbnRyaWVzW2ldLmZsYWdzICYgMHgzMykgJiYgLy8gSSBmcmFtZQorICAgICAgICAgICAgICAgIG14Zi0+aW5kZXhfZW50cmllc1tpXS5mbGFncyAmIDB4NDAgJiYgIXRlbXBvcmFsX29mZnNldCkKKyAgICAgICAgICAgICAgICBteGYtPmluZGV4X2VudHJpZXNbaV0uZmxhZ3MgfD0gMHg4MDsgLy8gcmFuZG9tIGFjY2VzcworICAgICAgICAgICAgYXZpb193OChwYiwgbXhmLT5pbmRleF9lbnRyaWVzW2ldLmZsYWdzKTsKKyAgICAgICAgICAgIC8vIHN0cmVhbSBvZmZzZXQKKyAgICAgICAgICAgIGF2aW9fd2I2NChwYiwgbXhmLT5pbmRleF9lbnRyaWVzW2ldLm9mZnNldCk7CisgICAgICAgICAgICBpZiAocy0+bmJfc3RyZWFtcyA+IDEpCisgICAgICAgICAgICAgICAgYXZpb193YjMyKHBiLCBteGYtPmluZGV4X2VudHJpZXNbaV0uc2xpY2Vfb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIG14Zi0+bGFzdF9rZXlfaW5kZXggPSBrZXlfaW5kZXggLSBteGYtPmVkaXRfdW5pdHNfY291bnQ7CisgICAgICAgIG14Zi0+bGFzdF9pbmRleGVkX2VkaXRfdW5pdCArPSBteGYtPmVkaXRfdW5pdHNfY291bnQ7CisgICAgICAgIG14Zi0+ZWRpdF91bml0c19jb3VudCA9IDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfa2x2X2ZpbGwoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHVuc2lnbmVkIHBhZCA9IGtsdl9maWxsX3NpemUoYXZpb190ZWxsKHMtPnBiKSk7CisgICAgaWYgKHBhZCkgeworICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCBrbHZfZmlsbF9rZXksIDE2KTsKKyAgICAgICAgcGFkIC09IDE2ICsgNDsKKyAgICAgICAga2x2X2VuY29kZV9iZXI0X2xlbmd0aChzLT5wYiwgcGFkKTsKKyAgICAgICAgZmZpb19maWxsKHMtPnBiLCAwLCBwYWQpOworICAgICAgICBhdl9hc3NlcnQxKCEoYXZpb190ZWxsKHMtPnBiKSAmIChLQUdfU0laRS0xKSkpOworICAgIH0KK30KKworc3RhdGljIGludCBteGZfd3JpdGVfcGFydGl0aW9uKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGJvZHlzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleHNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5LCBpbnQgd3JpdGVfbWV0YWRhdGEpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludDY0X3QgaGVhZGVyX2J5dGVfY291bnRfb2Zmc2V0OworICAgIHVuc2lnbmVkIGluZGV4X2J5dGVfY291bnQgPSAwOworICAgIHVpbnQ2NF90IHBhcnRpdGlvbl9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBlcnI7CisKKyAgICBpZiAoIW14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQgJiYgbXhmLT5lZGl0X3VuaXRzX2NvdW50KQorICAgICAgICBpbmRleF9ieXRlX2NvdW50ID0gODUgKyAxMisocy0+bmJfc3RyZWFtcysxKSo2ICsKKyAgICAgICAgICAgIDEyK214Zi0+ZWRpdF91bml0c19jb3VudCooMTErbXhmLT5zbGljZV9jb3VudCo0KTsKKyAgICBlbHNlIGlmIChteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ICYmIGluZGV4c2lkKQorICAgICAgICBpbmRleF9ieXRlX2NvdW50ID0gODA7CisKKyAgICBpZiAoaW5kZXhfYnl0ZV9jb3VudCkgeworICAgICAgICAvLyBhZGQgZW5jb2RlZCBiZXIgbGVuZ3RoCisgICAgICAgIGluZGV4X2J5dGVfY291bnQgKz0gMTYgKyBrbHZfYmVyX2xlbmd0aChpbmRleF9ieXRlX2NvdW50KTsKKyAgICAgICAgaW5kZXhfYnl0ZV9jb3VudCArPSBrbHZfZmlsbF9zaXplKGluZGV4X2J5dGVfY291bnQpOworICAgIH0KKworICAgIGlmICghbWVtY21wKGtleSwgYm9keV9wYXJ0aXRpb25fa2V5LCAxNikpIHsKKyAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcF9hcnJheSgmbXhmLT5ib2R5X3BhcnRpdGlvbl9vZmZzZXQsIG14Zi0+Ym9keV9wYXJ0aXRpb25zX2NvdW50ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKm14Zi0+Ym9keV9wYXJ0aXRpb25fb2Zmc2V0KSkpIDwgMCkgeworICAgICAgICAgICAgbXhmLT5ib2R5X3BhcnRpdGlvbnNfY291bnQgPSAwOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBteGYtPmJvZHlfcGFydGl0aW9uX29mZnNldFtteGYtPmJvZHlfcGFydGl0aW9uc19jb3VudCsrXSA9IHBhcnRpdGlvbl9vZmZzZXQ7CisgICAgfQorCisgICAgLy8gd3JpdGUga2x2CisgICAgYXZpb193cml0ZShwYiwga2V5LCAxNik7CisgICAga2x2X2VuY29kZV9iZXJfbGVuZ3RoKHBiLCA4OCArIDE2TEwgKiBERVNDUklQVE9SX0NPVU5UKG14Zi0+ZXNzZW5jZV9jb250YWluZXJfY291bnQpKTsKKworICAgIC8vIHdyaXRlIHBhcnRpdGlvbiB2YWx1ZQorICAgIGF2aW9fd2IxNihwYiwgMSk7IC8vIG1ham9yVmVyc2lvbgorICAgIGF2aW9fd2IxNihwYiwgMik7IC8vIG1pbm9yVmVyc2lvbgorICAgIGF2aW9fd2IzMihwYiwgS0FHX1NJWkUpOyAvLyBLQUdTaXplCisKKyAgICBhdmlvX3diNjQocGIsIHBhcnRpdGlvbl9vZmZzZXQpOyAvLyBUaGlzUGFydGl0aW9uCisKKyAgICBpZiAoIW1lbWNtcChrZXksIGJvZHlfcGFydGl0aW9uX2tleSwgMTYpICYmIG14Zi0+Ym9keV9wYXJ0aXRpb25zX2NvdW50ID4gMSkKKyAgICAgICAgYXZpb193YjY0KHBiLCBteGYtPmJvZHlfcGFydGl0aW9uX29mZnNldFtteGYtPmJvZHlfcGFydGl0aW9uc19jb3VudC0yXSk7IC8vIFByZXZpb3VzUGFydGl0aW9uCisgICAgZWxzZSBpZiAoIW1lbWNtcChrZXksIGZvb3Rlcl9wYXJ0aXRpb25fa2V5LCAxNikgJiYgbXhmLT5ib2R5X3BhcnRpdGlvbnNfY291bnQpCisgICAgICAgIGF2aW9fd2I2NChwYiwgbXhmLT5ib2R5X3BhcnRpdGlvbl9vZmZzZXRbbXhmLT5ib2R5X3BhcnRpdGlvbnNfY291bnQtMV0pOyAvLyBQcmV2aW91c1BhcnRpdGlvbgorICAgIGVsc2UKKyAgICAgICAgYXZpb193YjY0KHBiLCAwKTsKKworICAgIGF2aW9fd2I2NChwYiwgbXhmLT5mb290ZXJfcGFydGl0aW9uX29mZnNldCk7IC8vIGZvb3RlclBhcnRpdGlvbgorCisgICAgLy8gc2V0IG9mZnNldAorICAgIGhlYWRlcl9ieXRlX2NvdW50X29mZnNldCA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjY0KHBiLCAwKTsgLy8gaGVhZGVyQnl0ZUNvdW50LCB1cGRhdGUgbGF0ZXIKKworICAgIC8vIGluZGV4VGFibGUKKyAgICBhdmlvX3diNjQocGIsIGluZGV4X2J5dGVfY291bnQpOyAvLyBpbmRleEJ5dGVDb3VudAorICAgIGF2aW9fd2IzMihwYiwgaW5kZXhfYnl0ZV9jb3VudCA/IGluZGV4c2lkIDogMCk7IC8vIGluZGV4U0lECisKKyAgICAvLyBCb2R5T2Zmc2V0CisgICAgaWYgKGJvZHlzaWQgJiYgbXhmLT5lZGl0X3VuaXRzX2NvdW50ICYmIG14Zi0+Ym9keV9wYXJ0aXRpb25zX2NvdW50KSB7CisgICAgICAgIGF2aW9fd2I2NChwYiwgbXhmLT5ib2R5X29mZnNldCk7CisgICAgfSBlbHNlCisgICAgICAgIGF2aW9fd2I2NChwYiwgMCk7CisKKyAgICBhdmlvX3diMzIocGIsIGJvZHlzaWQpOyAvLyBib2R5U0lECisKKyAgICAvLyBvcGVyYXRpb25hbCBwYXR0ZXJuCisgICAgYXZpb193cml0ZShwYiwgb3AxYV91bCwgMTYpOworCisgICAgLy8gZXNzZW5jZSBjb250YWluZXIKKyAgICBteGZfd3JpdGVfZXNzZW5jZV9jb250YWluZXJfcmVmcyhzKTsKKworICAgIGlmICh3cml0ZV9tZXRhZGF0YSkgeworICAgICAgICAvLyBtYXJrIHRoZSBzdGFydCBvZiB0aGUgaGVhZGVybWV0YWRhdGEgYW5kIGNhbGN1bGF0ZSBtZXRhZGF0YSBzaXplCisgICAgICAgIGludDY0X3QgcG9zLCBzdGFydDsKKyAgICAgICAgdW5zaWduZWQgaGVhZGVyX2J5dGVfY291bnQ7CisKKyAgICAgICAgbXhmX3dyaXRlX2tsdl9maWxsKHMpOworICAgICAgICBzdGFydCA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgIG14Zl93cml0ZV9wcmltZXJfcGFjayhzKTsKKyAgICAgICAgbXhmX3dyaXRlX2hlYWRlcl9tZXRhZGF0YV9zZXRzKHMpOworICAgICAgICBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICBoZWFkZXJfYnl0ZV9jb3VudCA9IHBvcyAtIHN0YXJ0ICsga2x2X2ZpbGxfc2l6ZShwb3MpOworCisgICAgICAgIC8vIHVwZGF0ZSBoZWFkZXJfYnl0ZV9jb3VudAorICAgICAgICBhdmlvX3NlZWsocGIsIGhlYWRlcl9ieXRlX2NvdW50X29mZnNldCwgU0VFS19TRVQpOworICAgICAgICBhdmlvX3diNjQocGIsIGhlYWRlcl9ieXRlX2NvdW50KTsKKyAgICAgICAgYXZpb19zZWVrKHBiLCBwb3MsIFNFRUtfU0VUKTsKKyAgICB9CisKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Zl9wYXJzZV9kbnhoZF9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwKK0FWUGFja2V0ICpwa3QpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIE1YRlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgY2lkOworICAgIHVpbnQ4X3QqIGhlYWRlcl9jaWQ7CisgICAgaW50IGZyYW1lX3NpemUgPSAwOworCisgICAgaWYgKG14Zi0+aGVhZGVyX3dyaXR0ZW4pCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKHBrdC0+c2l6ZSA8IDQzKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBoZWFkZXJfY2lkID0gcGt0LT5kYXRhICsgMHgyODsKKyAgICBjaWQgPSBoZWFkZXJfY2lkWzBdIDw8IDI0IHwgaGVhZGVyX2NpZFsxXSA8PCAxNiB8IGhlYWRlcl9jaWRbMl0gPDwgOCB8IGhlYWRlcl9jaWRbM107CisKKyAgICBpZiAoKGZyYW1lX3NpemUgPSBhdnByaXZfZG54aGRfZ2V0X2ZyYW1lX3NpemUoY2lkKSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzd2l0Y2ggKGNpZCkgeworICAgIGNhc2UgMTIzNToKKyAgICAgICAgc2MtPmluZGV4ID0gMjQ7CisgICAgICAgIHNjLT5jb21wb25lbnRfZGVwdGggPSAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjM3OgorICAgICAgICBzYy0+aW5kZXggPSAyNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjM4OgorICAgICAgICBzYy0+aW5kZXggPSAyNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjQxOgorICAgICAgICBzYy0+aW5kZXggPSAyNzsKKyAgICAgICAgc2MtPmNvbXBvbmVudF9kZXB0aCA9IDEwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyNDI6CisgICAgICAgIHNjLT5pbmRleCA9IDI4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyNDM6CisgICAgICAgIHNjLT5pbmRleCA9IDI5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTA6CisgICAgICAgIHNjLT5pbmRleCA9IDMwOworICAgICAgICBzYy0+Y29tcG9uZW50X2RlcHRoID0gMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1MToKKyAgICAgICAgc2MtPmluZGV4ID0gMzE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1MjoKKyAgICAgICAgc2MtPmluZGV4ID0gMzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1MzoKKyAgICAgICAgc2MtPmluZGV4ID0gMzM7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzYy0+Y29kZWNfdWwgPSAmbXhmX2Vzc2VuY2VfY29udGFpbmVyX3Vsc1tzYy0+aW5kZXhdLmNvZGVjX3VsOworICAgIHNjLT5hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7IDE2LCA5IH07CisKKyAgICBteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ID0gS0FHX1NJWkU7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBNWEZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ICs9IDE2ICsgNCArIHNjLT5haWMuc2FtcGxlc1swXSpzYy0+YWljLnNhbXBsZV9zaXplOworICAgICAgICAgICAgbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCArPSBrbHZfZmlsbF9zaXplKG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQpOworICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQgKz0gMTYgKyA0ICsgZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgIG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQgKz0ga2x2X2ZpbGxfc2l6ZShteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG14Zl9wYXJzZV9kdl9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBzLT5wcml2X2RhdGE7CisgICAgTVhGU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKnZzX3BhY2ssICp2c2NfcGFjazsKKyAgICBpbnQgaSwgdWxfaW5kZXgsIGZyYW1lX3NpemUsIHN0eXBlLCBwYWw7CisKKyAgICBpZiAobXhmLT5oZWFkZXJfd3JpdHRlbikKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvLyBDaGVjayBmb3IgbWluaW1hbCBmcmFtZSBzaXplCisgICAgaWYgKHBrdC0+c2l6ZSA8IDEyMDAwMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgdnNfcGFjayAgPSBwa3QtPmRhdGEgKyA4MCo1ICsgNDg7CisgICAgdnNjX3BhY2sgPSBwa3QtPmRhdGEgKyA4MCo1ICsgNTM7CisgICAgc3R5cGUgICAgPSB2c19wYWNrWzNdICYgMHgxZjsKKyAgICBwYWwgICAgICA9ICh2c19wYWNrWzNdID4+IDUpICYgMHgxOworCisgICAgaWYgKCh2c19wYWNrWzJdICYgMHgwNykgPT0gMHgwMikKKyAgICAgICAgc2MtPmFzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsgMTYsIDkgfTsKKyAgICBlbHNlCisgICAgICAgIHNjLT5hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7IDQsIDMgfTsKKworICAgIHNjLT5pbnRlcmxhY2VkID0gKHZzY19wYWNrWzNdID4+IDQpICYgMHgwMTsKKyAgICAvLyBUT0RPOiBmaXggZHYgZW5jb2RlciB0byBzZXQgcHJvcGVyIEZGL0ZTIHZhbHVlIGluIFZTQyBwYWNrCisgICAgLy8gYW5kIHNldCBmaWVsZCBkb21pbmFuY2UgYWNjb3JkaW5nbHkKKyAgICAvLyBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiRFYgdnNjIHBhY2sgZmYvc3MgPSAleFxuIiwgdnNjX3BhY2tbMl0gPj4gNik7CisKKyAgICBzd2l0Y2ggKHN0eXBlKSB7CisgICAgY2FzZSAweDE4OiAvLyBEVjEwMCA3MjBwCisgICAgICAgIHVsX2luZGV4ID0gNiArIHBhbDsKKyAgICAgICAgZnJhbWVfc2l6ZSA9IHBhbCA/IDI4ODAwMCA6IDI0MDAwMDsKKyAgICAgICAgaWYgKHNjLT5pbnRlcmxhY2VkKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAic291cmNlIG1hcmtlZCBhcyBpbnRlcmxhY2VkIGJ1dCBjb2RlYyBwcm9maWxlIGlzIHByb2dyZXNzaXZlXG4iKTsKKyAgICAgICAgICAgIHNjLT5pbnRlcmxhY2VkID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTQ6IC8vIERWMTAwIDEwODBpCisgICAgICAgIHVsX2luZGV4ID0gNCArIHBhbDsKKyAgICAgICAgZnJhbWVfc2l6ZSA9IHBhbCA/IDU3NjAwMCA6IDQ4MDAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDA0OiAvLyBEVjUwCisgICAgICAgIHVsX2luZGV4ID0gMiArIHBhbDsKKyAgICAgICAgZnJhbWVfc2l6ZSA9IHBhbCA/IDI4ODAwMCA6IDI0MDAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogLy8gRFYyNQorICAgICAgICB1bF9pbmRleCA9IDAgKyBwYWw7CisgICAgICAgIGZyYW1lX3NpemUgPSBwYWwgPyAxNDQwMDAgOiAxMjAwMDA7CisgICAgfQorCisgICAgc2MtPmluZGV4ID0gdWxfaW5kZXggKyAxNjsKKyAgICBzYy0+Y29kZWNfdWwgPSAgJm14Zl9lc3NlbmNlX2NvbnRhaW5lcl91bHNbc2MtPmluZGV4XS5jb2RlY191bDsKKworICAgIG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQgPSBLQUdfU0laRTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIE1YRlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQgKz0gMTYgKyA0ICsgc2MtPmFpYy5zYW1wbGVzWzBdKnNjLT5haWMuc2FtcGxlX3NpemU7CisgICAgICAgICAgICBteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ICs9IGtsdl9maWxsX3NpemUobXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCArPSAxNiArIDQgKyBmcmFtZV9zaXplOworICAgICAgICAgICAgbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCArPSBrbHZfZmlsbF9zaXplKG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIFVJRCB1aWQ7CisgICAgaW50IGZyYW1lX3NpemU7CisgICAgaW50IHByb2ZpbGU7CisgICAgdWludDhfdCBpbnRlcmxhY2VkOworfSBteGZfaDI2NF9jb2RlY191bHNbXSA9IHsKKyAgICB7eyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MGEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MzIsMHgyMCwweDAxIH0sICAgICAgMCwgMTEwLCAwIH0sIC8vIEFWQyBIaWdoIDEwIEludHJhCisgICAge3sgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBhLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDMyLDB4MjEsMHgwMSB9LCAyMzI5NjAsICAgMCwgMSB9LCAvLyBBVkMgSW50cmEgNTAgMTA4MGk2MAorICAgIHt7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwYSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgzMiwweDIxLDB4MDIgfSwgMjgxMDg4LCAgIDAsIDEgfSwgLy8gQVZDIEludHJhIDUwIDEwODBpNTAKKyAgICB7eyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MGEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MzIsMHgyMSwweDAzIH0sIDIzMjk2MCwgICAwLCAwIH0sIC8vIEFWQyBJbnRyYSA1MCAxMDgwcDMwCisgICAge3sgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBhLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDMyLDB4MjEsMHgwNCB9LCAyODEwODgsICAgMCwgMCB9LCAvLyBBVkMgSW50cmEgNTAgMTA4MHAyNQorICAgIHt7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwYSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgzMiwweDIxLDB4MDggfSwgMTE2NzM2LCAgIDAsIDAgfSwgLy8gQVZDIEludHJhIDUwIDcyMHA2MAorICAgIHt7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwYSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgzMiwweDIxLDB4MDkgfSwgMTQwODAwLCAgIDAsIDAgfSwgLy8gQVZDIEludHJhIDUwIDcyMHA1MAorICAgIHt7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwYSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgzMiwweDMwLDB4MDEgfSwgICAgICAwLCAxMjIsIDAgfSwgLy8gQVZDIEhpZ2ggNDIyIEludHJhCisgICAge3sgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBhLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDMyLDB4MzEsMHgwMSB9LCA0NzI1NzYsICAgMCwgMSB9LCAvLyBBVkMgSW50cmEgMTAwIDEwODBpNjAKKyAgICB7eyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MGEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MzIsMHgzMSwweDAyIH0sIDU2ODgzMiwgICAwLCAxIH0sIC8vIEFWQyBJbnRyYSAxMDAgMTA4MGk1MAorICAgIHt7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwYSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgzMiwweDMxLDB4MDMgfSwgNDcyNTc2LCAgIDAsIDAgfSwgLy8gQVZDIEludHJhIDEwMCAxMDgwcDMwCisgICAge3sgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBhLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDMyLDB4MzEsMHgwNCB9LCA1Njg4MzIsICAgMCwgMCB9LCAvLyBBVkMgSW50cmEgMTAwIDEwODBwMjUKKyAgICB7eyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MGEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MzIsMHgzMSwweDA4IH0sIDIzNjU0NCwgICAwLCAwIH0sIC8vIEFWQyBJbnRyYSAxMDAgNzIwcDYwCisgICAge3sgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBhLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDMyLDB4MzEsMHgwOSB9LCAyODQ2NzIsICAgMCwgMCB9LCAvLyBBVkMgSW50cmEgMTAwIDcyMHA1MAorfTsKKworc3RhdGljIGludCBteGZfcGFyc2VfaDI2NF9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCwgTVhGSW5kZXhFbnRyeSAqZSkKK3sKKyAgICBNWEZDb250ZXh0ICpteGYgPSBzLT5wcml2X2RhdGE7CisgICAgTVhGU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOworICAgIHN0YXRpYyBjb25zdCBpbnQgbXhmX2gyNjRfbnVtX2NvZGVjX3VscyA9IHNpemVvZihteGZfaDI2NF9jb2RlY191bHMpIC8gc2l6ZW9mKG14Zl9oMjY0X2NvZGVjX3Vsc1swXSk7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gcGt0LT5kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBwa3QtPmRhdGEgKyBwa3QtPnNpemU7CisgICAgdWludDMyX3Qgc3RhdGUgPSAtMTsKKyAgICBpbnQgZXh0cmFfc2l6ZSA9IDUxMjsgLy8gc3VwcG9ydCBBVkMgSW50cmEgZmlsZXMgd2l0aG91dCBTUFMvUFBTIGhlYWRlcgorICAgIGludCBpLCBmcmFtZV9zaXplOworICAgIHVpbnQ4X3QgdWlkX2ZvdW5kOworCisgICAgaWYgKHBrdC0+c2l6ZSA+IGV4dHJhX3NpemUpCisgICAgICAgIGJ1Zl9lbmQgLT0gcGt0LT5zaXplIC0gZXh0cmFfc2l6ZTsgLy8gbm8gbmVlZCB0byBwYXJzZSBiZXlvbmQgU1BTL1BQUyBoZWFkZXIKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgYnVmID0gYXZwcml2X2ZpbmRfc3RhcnRfY29kZShidWYsIGJ1Zl9lbmQsICZzdGF0ZSk7CisgICAgICAgIGlmIChidWYgPj0gYnVmX2VuZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAtLWJ1ZjsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSAmIDB4MWYpIHsKKyAgICAgICAgY2FzZSBOQUxfU1BTOgorICAgICAgICAgICAgc3QtPmNvZGVjLT5wcm9maWxlID0gYnVmWzFdOworICAgICAgICAgICAgZS0+ZmxhZ3MgfD0gMHg0MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5BTF9QUFM6CisgICAgICAgICAgICBpZiAoZS0+ZmxhZ3MgJiAweDQwKSB7IC8vIHNlcXVlbmNlIGhlYWRlciBwcmVzZW50CisgICAgICAgICAgICAgICAgZS0+ZmxhZ3MgfD0gMHg4MDsgLy8gcmFuZG9tIGFjY2VzcworICAgICAgICAgICAgICAgIGV4dHJhX3NpemUgPSAwOworICAgICAgICAgICAgICAgIGJ1ZiA9IGJ1Zl9lbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG14Zi0+aGVhZGVyX3dyaXR0ZW4pCisgICAgICAgIHJldHVybiAxOworCisgICAgc2MtPmFzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsgMTYsIDkgfTsgLy8gMTY6OSBpcyBtYW5kYXRvcnkgZm9yIGJyb2FkY2FzdCBIRAorICAgIHNjLT5jb21wb25lbnRfZGVwdGggPSAxMDsgLy8gQVZDIEludHJhIGlzIGFsd2F5cyAxMCBCaXQKKyAgICBzYy0+aW50ZXJsYWNlZCA9IHN0LT5jb2RlYy0+ZmllbGRfb3JkZXIgIT0gQVZfRklFTERfUFJPR1JFU1NJVkUgPyAxIDogMDsKKyAgICBpZiAoc2MtPmludGVybGFjZWQpCisgICAgICAgIHNjLT5maWVsZF9kb21pbmFuY2UgPSAxOyAvLyB0b3AgZmllbGQgZmlyc3QgaXMgbWFuZGF0b3J5IGZvciBBVkMgSW50cmEKKworICAgIHVpZF9mb3VuZCA9IDA7CisgICAgZnJhbWVfc2l6ZSA9IHBrdC0+c2l6ZSArIGV4dHJhX3NpemU7CisgICAgZm9yIChpID0gMDsgaSA8IG14Zl9oMjY0X251bV9jb2RlY191bHM7IGkrKykgeworICAgICAgICBpZiAoZnJhbWVfc2l6ZSA9PSBteGZfaDI2NF9jb2RlY191bHNbaV0uZnJhbWVfc2l6ZSAmJiBzYy0+aW50ZXJsYWNlZCA9PSBteGZfaDI2NF9jb2RlY191bHNbaV0uaW50ZXJsYWNlZCkgeworICAgICAgICAgICAgc2MtPmNvZGVjX3VsID0gJm14Zl9oMjY0X2NvZGVjX3Vsc1tpXS51aWQ7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPnByb2ZpbGUgPT0gbXhmX2gyNjRfY29kZWNfdWxzW2ldLnByb2ZpbGUpIHsKKyAgICAgICAgICAgIHNjLT5jb2RlY191bCA9ICZteGZfaDI2NF9jb2RlY191bHNbaV0udWlkOworICAgICAgICAgICAgdWlkX2ZvdW5kID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdWlkX2ZvdW5kKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBVkMgSW50cmEgNTAvMTAwIHN1cHBvcnRlZCBvbmx5XG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBVSUQgbXhmX21wZWcyX2NvZGVjX3Vsc1tdID0geworICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAzLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDAxLDB4MTAsMHgwMCB9LCAvLyBNUC1NTCBJLUZyYW1lCisgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDMsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MDEsMHgxMSwweDAwIH0sIC8vIE1QLU1MIExvbmcgR09QCisgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDMsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MDIsMHgwMiwweDAwIH0sIC8vIDQyMlAtTUwgSS1GcmFtZQorICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAzLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDAyLDB4MDMsMHgwMCB9LCAvLyA0MjJQLU1MIExvbmcgR09QCisgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDMsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MDMsMHgwMiwweDAwIH0sIC8vIE1QLUhMIEktRnJhbWUKKyAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMywweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgwMywweDAzLDB4MDAgfSwgLy8gTVAtSEwgTG9uZyBHT1AKKyAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMywweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgwNCwweDAyLDB4MDAgfSwgLy8gNDIyUC1ITCBJLUZyYW1lCisgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDMsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MDQsMHgwMywweDAwIH0sIC8vIDQyMlAtSEwgTG9uZyBHT1AKKyAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMywweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgwNSwweDAyLDB4MDAgfSwgLy8gTVBASC0xNCBJLUZyYW1lCisgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDMsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MDUsMHgwMywweDAwIH0sIC8vIE1QQEgtMTQgTG9uZyBHT1AKK307CisKK3N0YXRpYyBjb25zdCBVSUQgKm14Zl9nZXRfbXBlZzJfY29kZWNfdWwoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBsb25nX2dvcCA9IGF2Y3R4LT5nb3Bfc2l6ZSA+IDEgfHwgYXZjdHgtPmhhc19iX2ZyYW1lczsKKworICAgIGlmIChhdmN0eC0+cHJvZmlsZSA9PSA0KSB7IC8vIE1haW4KKyAgICAgICAgaWYgKGF2Y3R4LT5sZXZlbCA9PSA4KSAvLyBNYWluCisgICAgICAgICAgICByZXR1cm4gJm14Zl9tcGVnMl9jb2RlY191bHNbMCtsb25nX2dvcF07CisgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5sZXZlbCA9PSA0KSAvLyBIaWdoCisgICAgICAgICAgICByZXR1cm4gJm14Zl9tcGVnMl9jb2RlY191bHNbNCtsb25nX2dvcF07CisgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5sZXZlbCA9PSA2KSAvLyBIaWdoIDE0CisgICAgICAgICAgICByZXR1cm4gJm14Zl9tcGVnMl9jb2RlY191bHNbOCtsb25nX2dvcF07CisgICAgfSBlbHNlIGlmIChhdmN0eC0+cHJvZmlsZSA9PSAwKSB7IC8vIDQyMgorICAgICAgICBpZiAoYXZjdHgtPmxldmVsID09IDUpIC8vIE1haW4KKyAgICAgICAgICAgIHJldHVybiAmbXhmX21wZWcyX2NvZGVjX3Vsc1syK2xvbmdfZ29wXTsKKyAgICAgICAgZWxzZSBpZiAoYXZjdHgtPmxldmVsID09IDIpIC8vIEhpZ2gKKyAgICAgICAgICAgIHJldHVybiAmbXhmX21wZWcyX2NvZGVjX3Vsc1s2K2xvbmdfZ29wXTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbXhmX3BhcnNlX21wZWcyX2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCwgTVhGSW5kZXhFbnRyeSAqZSkKK3sKKyAgICBNWEZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgdWludDMyX3QgYyA9IC0xOworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgcGt0LT5zaXplIC0gNDsgaSsrKSB7CisgICAgICAgIGMgPSAoYzw8OCkgKyBwa3QtPmRhdGFbaV07CisgICAgICAgIGlmIChjID09IDB4MWI1KSB7CisgICAgICAgICAgICBpZiAoKHBrdC0+ZGF0YVtpKzFdICYgMHhmMCkgPT0gMHgxMCkgeyAvLyBzZXEgZXh0CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5wcm9maWxlID0gcGt0LT5kYXRhW2krMV0gJiAweDA3OworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+bGV2ZWwgICA9IHBrdC0+ZGF0YVtpKzJdID4+IDQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGkgKyA1IDwgcGt0LT5zaXplICYmIChwa3QtPmRhdGFbaSsxXSAmIDB4ZjApID09IDB4ODApIHsgLy8gcGljdCBjb2RpbmcgZXh0CisgICAgICAgICAgICAgICAgc2MtPmludGVybGFjZWQgPSAhKHBrdC0+ZGF0YVtpKzVdICYgMHg4MCk7IC8vIHByb2dyZXNzaXZlIGZyYW1lCisgICAgICAgICAgICAgICAgaWYgKHNjLT5pbnRlcmxhY2VkKQorICAgICAgICAgICAgICAgICAgICBzYy0+ZmllbGRfZG9taW5hbmNlID0gMSArICEocGt0LT5kYXRhW2krNF0gJiAweDgwKTsgLy8gdG9wIGZpZWxkIGZpcnN0CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAweDFiOCkgeyAvLyBnb3AKKyAgICAgICAgICAgIGlmIChwa3QtPmRhdGFbaSs0XT4+NiAmIDB4MDEpIHsgLy8gY2xvc2VkCisgICAgICAgICAgICAgICAgc2MtPmNsb3NlZF9nb3AgPSAxOworICAgICAgICAgICAgICAgIGlmIChlLT5mbGFncyAmIDB4NDApIC8vIHNlcXVlbmNlIGhlYWRlciBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgIGUtPmZsYWdzIHw9IDB4ODA7IC8vIHJhbmRvbSBhY2Nlc3MKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjID09IDB4MWIzKSB7IC8vIHNlcQorICAgICAgICAgICAgZS0+ZmxhZ3MgfD0gMHg0MDsKKyAgICAgICAgICAgIHN3aXRjaCAoKHBrdC0+ZGF0YVtpKzRdPj40KSAmIDB4ZikgeworICAgICAgICAgICAgY2FzZSAyOiAgc2MtPmFzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsgIDQsICAzfTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6ICBzYy0+YXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpeyAxNiwgIDl9OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDogIHNjLT5hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7MjIxLDEwMH07IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9yZWR1Y2UoJnNjLT5hc3BlY3RfcmF0aW8ubnVtLCAmc2MtPmFzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGgsIHN0LT5jb2RlYy0+aGVpZ2h0LCAxMDI0KjEwMjQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGMgPT0gMHgxMDApIHsgLy8gcGljCisgICAgICAgICAgICBpbnQgcGljdF90eXBlID0gKHBrdC0+ZGF0YVtpKzJdPj4zKSAmIDB4MDc7CisgICAgICAgICAgICBlLT50ZW1wb3JhbF9yZWYgPSAocGt0LT5kYXRhW2krMV08PDIpIHwgKHBrdC0+ZGF0YVtpKzJdPj42KTsKKyAgICAgICAgICAgIGlmIChwaWN0X3R5cGUgPT0gMikgeyAvLyBQIGZyYW1lCisgICAgICAgICAgICAgICAgZS0+ZmxhZ3MgfD0gMHgyMjsKKyAgICAgICAgICAgICAgICBzYy0+Y2xvc2VkX2dvcCA9IDA7IC8vIHJlc2V0IGNsb3NlZCBnb3AsIGRvbid0IG1hdHRlciBhbnltb3JlCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBpY3RfdHlwZSA9PSAzKSB7IC8vIEIgZnJhbWUKKyAgICAgICAgICAgICAgICBpZiAoc2MtPmNsb3NlZF9nb3ApCisgICAgICAgICAgICAgICAgICAgIGUtPmZsYWdzIHw9IDB4MTM7IC8vIG9ubHkgYmFja3dhcmQgcHJlZGljdGlvbgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZS0+ZmxhZ3MgfD0gMHgzMzsKKyAgICAgICAgICAgICAgICBzYy0+dGVtcG9yYWxfcmVvcmRlcmluZyA9IC0xOworICAgICAgICAgICAgfSBlbHNlIGlmICghcGljdF90eXBlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImVycm9yIHBhcnNpbmcgbXBlZzIgZnJhbWVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5vZm9ybWF0ICE9ICZmZl9teGZfZDEwX211eGVyKQorICAgICAgICBzYy0+Y29kZWNfdWwgPSBteGZfZ2V0X21wZWcyX2NvZGVjX3VsKHN0LT5jb2RlYyk7CisgICAgcmV0dXJuICEhc2MtPmNvZGVjX3VsOworfQorCitzdGF0aWMgdWludDY0X3QgbXhmX3BhcnNlX3RpbWVzdGFtcCh0aW1lX3QgdGltZXN0YW1wKQoreworICAgIHN0cnVjdCB0bSB0bWJ1ZjsKKyAgICBzdHJ1Y3QgdG0gKnRpbWUgPSBnbXRpbWVfcigmdGltZXN0YW1wLCAmdG1idWYpOworICAgIGlmICghdGltZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuICh1aW50NjRfdCkodGltZS0+dG1feWVhcisxOTAwKSA8PCA0OCB8CisgICAgICAgICAgICh1aW50NjRfdCkodGltZS0+dG1fbW9uKzEpICAgICA8PCA0MCB8CisgICAgICAgICAgICh1aW50NjRfdCkgdGltZS0+dG1fbWRheSAgICAgICA8PCAzMiB8CisgICAgICAgICAgICAgICAgICAgICAgdGltZS0+dG1faG91ciAgICAgICA8PCAyNCB8CisgICAgICAgICAgICAgICAgICAgICAgdGltZS0+dG1fbWluICAgICAgICA8PCAxNiB8CisgICAgICAgICAgICAgICAgICAgICAgdGltZS0+dG1fc2VjICAgICAgICA8PCA4OworfQorCitzdGF0aWMgdm9pZCBteGZfZ2VuX3VtaWQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1YRkNvbnRleHQgKm14ZiA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50MzJfdCBzZWVkID0gYXZfZ2V0X3JhbmRvbV9zZWVkKCk7CisgICAgdWludDY0X3QgdW1pZCA9IHNlZWQgKyAweDUyOTQ3MTM0MDAwMDAwMDBMTDsKKworICAgIEFWX1dCNjQobXhmLT51bWlkICAsIHVtaWQpOworICAgIEFWX1dCNjQobXhmLT51bWlkKzgsIHVtaWQ+PjgpOworCisgICAgbXhmLT5pbnN0YW5jZV9udW1iZXIgPSBzZWVkICYgMHhGRkZGRkY7Cit9CisKK3N0YXRpYyBpbnQgbXhmX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpLCByZXQ7CisgICAgdWludDhfdCBwcmVzZW50W0ZGX0FSUkFZX0VMRU1TKG14Zl9lc3NlbmNlX2NvbnRhaW5lcl91bHMpXSA9IHswfTsKKyAgICBjb25zdCBNWEZTYW1wbGVzUGVyRnJhbWUgKnNwZiA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQ7CisgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0Y3IgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgTlVMTCwgMCk7CisKKyAgICBpZiAoIXMtPm5iX3N0cmVhbXMpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgTVhGU3RyZWFtQ29udGV4dCAqc2MgPSBhdl9tYWxsb2N6KHNpemVvZigqc2MpKTsKKyAgICAgICAgaWYgKCFzYykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHN0LT5wcml2X2RhdGEgPSBzYzsKKworICAgICAgICBpZiAoKGkgPT0gMCkgXiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0aGVyZSBtdXN0IGJlIGV4YWN0bHkgb25lIHZpZGVvIHN0cmVhbSBhbmQgaXQgbXVzdCBiZSB0aGUgZmlyc3Qgb25lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgYmUgYXZnX2ZyYW1lX3JhdGUKKyAgICAgICAgICAgIEFWUmF0aW9uYWwgcmF0ZSwgdGJjID0gc3QtPnRpbWVfYmFzZTsKKyAgICAgICAgICAgIC8vIERlZmF1bHQgY29tcG9uZW50IGRlcHRoIHRvIDgKKyAgICAgICAgICAgIHNjLT5jb21wb25lbnRfZGVwdGggPSA4OworICAgICAgICAgICAgbXhmLT50aW1lY29kZV9iYXNlID0gKHRiYy5kZW4gKyB0YmMubnVtLzIpIC8gdGJjLm51bTsKKyAgICAgICAgICAgIHNwZiA9IGZmX214Zl9nZXRfc2FtcGxlc19wZXJfZnJhbWUocywgdGJjKTsKKyAgICAgICAgICAgIGlmICghc3BmKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHZpZGVvIGZyYW1lIHJhdGUgJWQvJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRiYy5kZW4sIHRiYy5udW0pOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBteGYtPnRpbWVfYmFzZSA9IHNwZi0+dGltZV9iYXNlOworICAgICAgICAgICAgcmF0ZSA9IGF2X2ludl9xKG14Zi0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBteGYtPnRpbWVfYmFzZS5udW0sIG14Zi0+dGltZV9iYXNlLmRlbik7CisgICAgICAgICAgICBpZiAoIXRjcikKKyAgICAgICAgICAgICAgICB0Y3IgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJ0aW1lY29kZSIsIE5VTEwsIDApOworICAgICAgICAgICAgaWYgKHRjcikKKyAgICAgICAgICAgICAgICByZXQgPSBhdl90aW1lY29kZV9pbml0X2Zyb21fc3RyaW5nKCZteGYtPnRjLCByYXRlLCB0Y3ItPnZhbHVlLCBzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXQgPSBhdl90aW1lY29kZV9pbml0KCZteGYtPnRjLCByYXRlLCAwLCAwLCBzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBzYy0+dmlkZW9fYml0X3JhdGUgPSBzdC0+Y29kZWMtPmJpdF9yYXRlID8gc3QtPmNvZGVjLT5iaXRfcmF0ZSA6IHN0LT5jb2RlYy0+cmNfbWF4X3JhdGU7CisgICAgICAgICAgICBpZiAocy0+b2Zvcm1hdCA9PSAmZmZfbXhmX2QxMF9tdXhlcikgeworICAgICAgICAgICAgICAgIGlmIChzYy0+dmlkZW9fYml0X3JhdGUgPT0gNTAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG14Zi0+dGltZV9iYXNlLmRlbiA9PSAyNSkgc2MtPmluZGV4ID0gMzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmluZGV4ID0gNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjLT52aWRlb19iaXRfcmF0ZSA9PSA0MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobXhmLT50aW1lX2Jhc2UuZGVuID09IDI1KSBzYy0+aW5kZXggPSA3OworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICBzYy0+aW5kZXggPSA5OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2MtPnZpZGVvX2JpdF9yYXRlID09IDMwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChteGYtPnRpbWVfYmFzZS5kZW4gPT0gMjUpIHNjLT5pbmRleCA9IDExOworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICBzYy0+aW5kZXggPSAxMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZXJyb3IgTVhGIEQtMTAgb25seSBzdXBwb3J0IDMwLzQwLzUwIG1iaXQvc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ID0gS0FHX1NJWkU7IC8vIHN5c3RlbSBlbGVtZW50CisgICAgICAgICAgICAgICAgbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCArPSAxNiArIDQgKyAodWludDY0X3Qpc2MtPnZpZGVvX2JpdF9yYXRlICoKKyAgICAgICAgICAgICAgICAgICAgbXhmLT50aW1lX2Jhc2UubnVtIC8gKDgqbXhmLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgICAgICAgICBteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ICs9IGtsdl9maWxsX3NpemUobXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCk7CisgICAgICAgICAgICAgICAgbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCArPSAxNiArIDQgKyA0ICsgc3BmLT5zYW1wbGVzX3Blcl9mcmFtZVswXSo4KjQ7CisgICAgICAgICAgICAgICAgbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCArPSBrbHZfZmlsbF9zaXplKG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICE9IDQ4MDAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm9ubHkgNDhraHogaXMgaW1wbGVtZW50ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIGlmIChzLT5vZm9ybWF0ID09ICZmZl9teGZfZDEwX211eGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5pbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJNWEYgRC0xMCBvbmx5IHN1cHBvcnQgb25lIGF1ZGlvIHRyYWNrXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUgJiYKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9QQ01fUzI0TEUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk1YRiBELTEwIG9ubHkgc3VwcG9ydCAxNiBvciAyNCBiaXRzIGxlIGF1ZGlvXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2MtPmluZGV4ID0gKChNWEZTdHJlYW1Db250ZXh0KilzLT5zdHJlYW1zWzBdLT5wcml2X2RhdGEpLT5pbmRleCArIDE7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG14Zi0+c2xpY2VfY291bnQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzYy0+aW5kZXgpIHsKKyAgICAgICAgICAgIHNjLT5pbmRleCA9IG14Zl9nZXRfZXNzZW5jZV9jb250YWluZXJfdWxfaW5kZXgoc3QtPmNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgICAgICBpZiAoc2MtPmluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInRyYWNrICVkOiBjb3VsZCBub3QgZmluZCBlc3NlbmNlIGNvbnRhaW5lciB1bCwgIgorICAgICAgICAgICAgICAgICAgICAgICAiY29kZWMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gY29udGFpbmVyXG4iLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzYy0+Y29kZWNfdWwgPSAmbXhmX2Vzc2VuY2VfY29udGFpbmVyX3Vsc1tzYy0+aW5kZXhdLmNvZGVjX3VsOworCisgICAgICAgIG1lbWNweShzYy0+dHJhY2tfZXNzZW5jZV9lbGVtZW50X2tleSwgbXhmX2Vzc2VuY2VfY29udGFpbmVyX3Vsc1tzYy0+aW5kZXhdLmVsZW1lbnRfdWwsIDE1KTsKKyAgICAgICAgc2MtPnRyYWNrX2Vzc2VuY2VfZWxlbWVudF9rZXlbMTVdID0gcHJlc2VudFtzYy0+aW5kZXhdOworICAgICAgICBQUklOVF9LRVkocywgInRyYWNrIGVzc2VuY2UgZWxlbWVudCBrZXkiLCBzYy0+dHJhY2tfZXNzZW5jZV9lbGVtZW50X2tleSk7CisKKyAgICAgICAgaWYgKCFwcmVzZW50W3NjLT5pbmRleF0pCisgICAgICAgICAgICBteGYtPmVzc2VuY2VfY29udGFpbmVyX2NvdW50Kys7CisgICAgICAgIHByZXNlbnRbc2MtPmluZGV4XSsrOworICAgIH0KKworICAgIGlmIChzLT5vZm9ybWF0ID09ICZmZl9teGZfZDEwX211eGVyKSB7CisgICAgICAgIG14Zi0+ZXNzZW5jZV9jb250YWluZXJfY291bnQgPSAxOworICAgIH0KKworICAgIGlmICghKHMtPmZsYWdzICYgQVZGTVRfRkxBR19CSVRFWEFDVCkpCisgICAgICAgIG14Zl9nZW5fdW1pZChzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgTVhGU3RyZWFtQ29udGV4dCAqc2MgPSBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGE7CisgICAgICAgIC8vIHVwZGF0ZSBlbGVtZW50IGNvdW50CisgICAgICAgIHNjLT50cmFja19lc3NlbmNlX2VsZW1lbnRfa2V5WzEzXSA9IHByZXNlbnRbc2MtPmluZGV4XTsKKyAgICAgICAgaWYgKCFtZW1jbXAoc2MtPnRyYWNrX2Vzc2VuY2VfZWxlbWVudF9rZXksIG14Zl9lc3NlbmNlX2NvbnRhaW5lcl91bHNbMTVdLmVsZW1lbnRfdWwsIDEzKSkgLy8gRFYKKyAgICAgICAgICAgIHNjLT5vcmRlciA9ICgweDE1IDw8IDI0KSB8IEFWX1JCMzIoc2MtPnRyYWNrX2Vzc2VuY2VfZWxlbWVudF9rZXkrMTMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzYy0+b3JkZXIgPSBBVl9SQjMyKHNjLT50cmFja19lc3NlbmNlX2VsZW1lbnRfa2V5KzEyKTsKKyAgICB9CisKKyAgICBpZiAodCA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiY3JlYXRpb25fdGltZSIsIE5VTEwsIDApKQorICAgICAgICB0aW1lc3RhbXAgPSBmZl9pc284NjAxX3RvX3VuaXhfdGltZSh0LT52YWx1ZSk7CisgICAgaWYgKHRpbWVzdGFtcCkKKyAgICAgICAgbXhmLT50aW1lc3RhbXAgPSBteGZfcGFyc2VfdGltZXN0YW1wKHRpbWVzdGFtcCk7CisgICAgbXhmLT5kdXJhdGlvbiA9IC0xOworCisgICAgbXhmLT50aW1lY29kZV90cmFjayA9IGF2X21hbGxvY3ooc2l6ZW9mKCpteGYtPnRpbWVjb2RlX3RyYWNrKSk7CisgICAgaWYgKCFteGYtPnRpbWVjb2RlX3RyYWNrKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG14Zi0+dGltZWNvZGVfdHJhY2stPnByaXZfZGF0YSA9IGF2X21hbGxvY3ooc2l6ZW9mKE1YRlN0cmVhbUNvbnRleHQpKTsKKyAgICBpZiAoIW14Zi0+dGltZWNvZGVfdHJhY2stPnByaXZfZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBteGYtPnRpbWVjb2RlX3RyYWNrLT5pbmRleCA9IC0xOworCisgICAgaWYgKCFzcGYpCisgICAgICAgIHNwZiA9IGZmX214Zl9nZXRfc2FtcGxlc19wZXJfZnJhbWUocywgKEFWUmF0aW9uYWwpeyAxLCAyNSB9KTsKKworICAgIGlmIChmZl9hdWRpb19pbnRlcmxlYXZlX2luaXQocywgc3BmLT5zYW1wbGVzX3Blcl9mcmFtZSwgbXhmLT50aW1lX2Jhc2UpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHN5c3RlbV9tZXRhZGF0YV9wYWNrX2tleVtdICAgICAgICA9IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAyLDB4MDUsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgwNCwweDAxLDB4MDEsMHgwMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3lzdGVtX21ldGFkYXRhX3BhY2thZ2Vfc2V0X2tleVtdID0geyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDIsMHg0MywweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAxIH07CisKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9zeXN0ZW1faXRlbShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVuc2lnbmVkIGZyYW1lOworICAgIHVpbnQzMl90IHRpbWVfY29kZTsKKworICAgIGZyYW1lID0gbXhmLT5sYXN0X2luZGV4ZWRfZWRpdF91bml0ICsgbXhmLT5lZGl0X3VuaXRzX2NvdW50OworCisgICAgLy8gd3JpdGUgc3lzdGVtIG1ldGFkYXRhIHBhY2sKKyAgICBhdmlvX3dyaXRlKHBiLCBzeXN0ZW1fbWV0YWRhdGFfcGFja19rZXksIDE2KTsKKyAgICBrbHZfZW5jb2RlX2JlcjRfbGVuZ3RoKHBiLCA1Nyk7CisgICAgYXZpb193OChwYiwgMHg1Yyk7IC8vIFVMLCB1c2VyIGRhdGUvdGltZSBzdGFtcCwgcGljdHVyZSBhbmQgc291bmQgaXRlbSBwcmVzZW50CisgICAgYXZpb193OChwYiwgMHgwNCk7IC8vIGNvbnRlbnQgcGFja2FnZSByYXRlCisgICAgYXZpb193OChwYiwgMHgwMCk7IC8vIGNvbnRlbnQgcGFja2FnZSB0eXBlCisgICAgYXZpb193YjE2KHBiLCAweDAwKTsgLy8gY2hhbm5lbCBoYW5kbGUKKyAgICBhdmlvX3diMTYocGIsIChteGYtPnRjLnN0YXJ0ICsgZnJhbWUpICYgMHhGRkZGKTsgLy8gY29udGludWl0eSBjb3VudCwgc3VwcG9zZWQgdG8gb3ZlcmZsb3cKKyAgICBpZiAobXhmLT5lc3NlbmNlX2NvbnRhaW5lcl9jb3VudCA+IDEpCisgICAgICAgIGF2aW9fd3JpdGUocGIsIG11bHRpcGxlX2Rlc2NfdWwsIDE2KTsKKyAgICBlbHNlIHsKKyAgICAgICAgTVhGU3RyZWFtQ29udGV4dCAqc2MgPSBzLT5zdHJlYW1zWzBdLT5wcml2X2RhdGE7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIG14Zl9lc3NlbmNlX2NvbnRhaW5lcl91bHNbc2MtPmluZGV4XS5jb250YWluZXJfdWwsIDE2KTsKKyAgICB9CisgICAgYXZpb193OChwYiwgMCk7CisgICAgYXZpb193YjY0KHBiLCAwKTsKKyAgICBhdmlvX3diNjQocGIsIDApOyAvLyBjcmVhdGlvbiBkYXRlL3RpbWUgc3RhbXAKKworICAgIGF2aW9fdzgocGIsIDB4ODEpOyAvLyBTTVBURSAxMk0gdGltZSBjb2RlCisgICAgdGltZV9jb2RlID0gYXZfdGltZWNvZGVfZ2V0X3NtcHRlX2Zyb21fZnJhbWVudW0oJm14Zi0+dGMsIGZyYW1lKTsKKyAgICBhdmlvX3diMzIocGIsIHRpbWVfY29kZSk7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLy8gYmluYXJ5IGdyb3VwIGRhdGEKKyAgICBhdmlvX3diNjQocGIsIDApOworCisgICAgLy8gd3JpdGUgc3lzdGVtIG1ldGFkYXRhIHBhY2thZ2Ugc2V0CisgICAgYXZpb193cml0ZShwYiwgc3lzdGVtX21ldGFkYXRhX3BhY2thZ2Vfc2V0X2tleSwgMTYpOworICAgIGtsdl9lbmNvZGVfYmVyNF9sZW5ndGgocGIsIDM1KTsKKyAgICBhdmlvX3c4KHBiLCAweDgzKTsgLy8gVU1JRAorICAgIGF2aW9fd2IxNihwYiwgMHgyMCk7CisgICAgbXhmX3dyaXRlX3VtaWQocywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9kMTBfdmlkZW9fcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0KQoreworICAgIE1YRkNvbnRleHQgKm14ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBNWEZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgaW50IHBhY2tldF9zaXplID0gKHVpbnQ2NF90KXNjLT52aWRlb19iaXRfcmF0ZSpteGYtPnRpbWVfYmFzZS5udW0gLworICAgICAgICAoOCpteGYtPnRpbWVfYmFzZS5kZW4pOyAvLyBmcmFtZSBzaXplCisgICAgaW50IHBhZDsKKworICAgIHBhY2tldF9zaXplICs9IDE2ICsgNDsKKyAgICBwYWNrZXRfc2l6ZSArPSBrbHZfZmlsbF9zaXplKHBhY2tldF9zaXplKTsKKworICAgIGtsdl9lbmNvZGVfYmVyNF9sZW5ndGgocGIsIHBrdC0+c2l6ZSk7CisgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworCisgICAgLy8gZW5zdXJlIENCUiBtdXhpbmcgYnkgcGFkZGluZyB0byBjb3JyZWN0IHZpZGVvIGZyYW1lIHNpemUKKyAgICBwYWQgPSBwYWNrZXRfc2l6ZSAtIHBrdC0+c2l6ZSAtIDE2IC0gNDsKKyAgICBpZiAocGFkID4gMjApIHsKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwga2x2X2ZpbGxfa2V5LCAxNik7CisgICAgICAgIHBhZCAtPSAxNiArIDQ7CisgICAgICAgIGtsdl9lbmNvZGVfYmVyNF9sZW5ndGgocy0+cGIsIHBhZCk7CisgICAgICAgIGZmaW9fZmlsbChzLT5wYiwgMCwgcGFkKTsKKyAgICAgICAgYXZfYXNzZXJ0MSghKGF2aW9fdGVsbChzLT5wYikgJiAoS0FHX1NJWkUtMSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJjYW5ub3QgZmlsbCBkLTEwIHZpZGVvIHBhY2tldFxuIik7CisgICAgICAgIGZmaW9fZmlsbChzLT5wYiwgMCwgcGFkKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9kMTBfYXVkaW9fcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0KQoreworICAgIE1YRkNvbnRleHQgKm14ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgZnJhbWVfc2l6ZSA9IHBrdC0+c2l6ZSAvIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgdWludDhfdCAqc2FtcGxlcyA9IHBrdC0+ZGF0YTsKKyAgICB1aW50OF90ICplbmQgPSBwa3QtPmRhdGEgKyBwa3QtPnNpemU7CisgICAgaW50IGk7CisKKyAgICBrbHZfZW5jb2RlX2JlcjRfbGVuZ3RoKHBiLCA0ICsgZnJhbWVfc2l6ZSo0KjgpOworCisgICAgYXZpb193OChwYiwgKGZyYW1lX3NpemUgPT0gMTkyMCA/IDAgOiAobXhmLT5lZGl0X3VuaXRzX2NvdW50LTEpICUgNSArIDEpKTsKKyAgICBhdmlvX3dsMTYocGIsIGZyYW1lX3NpemUpOworICAgIGF2aW9fdzgocGIsICgxPDxzdC0+Y29kZWMtPmNoYW5uZWxzKS0xKTsKKworICAgIHdoaWxlIChzYW1wbGVzIDwgZW5kKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+Y29kZWMtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZTsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMjRMRSkgeworICAgICAgICAgICAgICAgIHNhbXBsZSA9IEFWX1JMMjQoc2FtcGxlcyk8PCA0OworICAgICAgICAgICAgICAgIHNhbXBsZXMgKz0gMzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2FtcGxlID0gQVZfUkwxNihzYW1wbGVzKTw8MTI7CisgICAgICAgICAgICAgICAgc2FtcGxlcyArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb193bDMyKHBiLCBzYW1wbGUgfCBpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgaSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IG14Zl93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE1YRkNvbnRleHQgKm14ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICBNWEZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgTVhGSW5kZXhFbnRyeSBpZSA9IHswfTsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKCFteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ICYmICEobXhmLT5lZGl0X3VuaXRzX2NvdW50ICUgRURJVF9VTklUU19QRVJfQk9EWSkpIHsKKyAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcF9hcnJheSgmbXhmLT5pbmRleF9lbnRyaWVzLCBteGYtPmVkaXRfdW5pdHNfY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEVESVRfVU5JVFNfUEVSX0JPRFksIHNpemVvZigqbXhmLT5pbmRleF9lbnRyaWVzKSkpIDwgMCkgeworICAgICAgICAgICAgbXhmLT5lZGl0X3VuaXRzX2NvdW50ID0gMDsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgYWxsb2NhdGUgaW5kZXggZW50cmllc1xuIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykgeworICAgICAgICBpZiAoIW14Zl9wYXJzZV9tcGVnMl9mcmFtZShzLCBzdCwgcGt0LCAmaWUpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IGdldCBtcGVnMiBwcm9maWxlIGFuZCBsZXZlbFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRE5YSEQpIHsKKyAgICAgICAgaWYgKCFteGZfcGFyc2VfZG54aGRfZnJhbWUocywgc3QsIHBrdCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgZ2V0IGRueGhkIHByb2ZpbGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8pIHsKKyAgICAgICAgaWYgKCFteGZfcGFyc2VfZHZfZnJhbWUocywgc3QsIHBrdCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgZ2V0IGR2IHByb2ZpbGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgaWYgKCFteGZfcGFyc2VfaDI2NF9mcmFtZShzLCBzdCwgcGt0LCAmaWUpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IGdldCBoMjY0IHByb2ZpbGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFteGYtPmhlYWRlcl93cml0dGVuKSB7CisgICAgICAgIGlmIChteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50KSB7CisgICAgICAgICAgICBpZiAoKGVyciA9IG14Zl93cml0ZV9wYXJ0aXRpb24ocywgMSwgMiwgaGVhZGVyX29wZW5fcGFydGl0aW9uX2tleSwgMSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgbXhmX3dyaXRlX2tsdl9maWxsKHMpOworICAgICAgICAgICAgbXhmX3dyaXRlX2luZGV4X3RhYmxlX3NlZ21lbnQocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKGVyciA9IG14Zl93cml0ZV9wYXJ0aXRpb24ocywgMCwgMCwgaGVhZGVyX29wZW5fcGFydGl0aW9uX2tleSwgMSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIG14Zi0+aGVhZGVyX3dyaXR0ZW4gPSAxOworICAgIH0KKworICAgIGlmIChzdC0+aW5kZXggPT0gMCkgeworICAgICAgICBpZiAoIW14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQgJiYKKyAgICAgICAgICAgICghbXhmLT5lZGl0X3VuaXRzX2NvdW50IHx8IG14Zi0+ZWRpdF91bml0c19jb3VudCA+IEVESVRfVU5JVFNfUEVSX0JPRFkpICYmCisgICAgICAgICAgICAhKGllLmZsYWdzICYgMHgzMykpIHsgLy8gSSBmcmFtZSwgR29wIHN0YXJ0CisgICAgICAgICAgICBteGZfd3JpdGVfa2x2X2ZpbGwocyk7CisgICAgICAgICAgICBpZiAoKGVyciA9IG14Zl93cml0ZV9wYXJ0aXRpb24ocywgMSwgMiwgYm9keV9wYXJ0aXRpb25fa2V5LCAwKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICBteGZfd3JpdGVfa2x2X2ZpbGwocyk7CisgICAgICAgICAgICBteGZfd3JpdGVfaW5kZXhfdGFibGVfc2VnbWVudChzKTsKKyAgICAgICAgfQorCisgICAgICAgIG14Zl93cml0ZV9rbHZfZmlsbChzKTsKKyAgICAgICAgbXhmX3dyaXRlX3N5c3RlbV9pdGVtKHMpOworCisgICAgICAgIGlmICghbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCkgeworICAgICAgICAgICAgbXhmLT5pbmRleF9lbnRyaWVzW214Zi0+ZWRpdF91bml0c19jb3VudF0ub2Zmc2V0ID0gbXhmLT5ib2R5X29mZnNldDsKKyAgICAgICAgICAgIG14Zi0+aW5kZXhfZW50cmllc1tteGYtPmVkaXRfdW5pdHNfY291bnRdLmZsYWdzID0gaWUuZmxhZ3M7CisgICAgICAgICAgICBteGYtPmluZGV4X2VudHJpZXNbbXhmLT5lZGl0X3VuaXRzX2NvdW50XS50ZW1wb3JhbF9yZWYgPSBpZS50ZW1wb3JhbF9yZWY7CisgICAgICAgICAgICBteGYtPmJvZHlfb2Zmc2V0ICs9IEtBR19TSVpFOyAvLyBzaXplIG9mIHN5c3RlbSBlbGVtZW50CisgICAgICAgIH0KKyAgICAgICAgbXhmLT5lZGl0X3VuaXRzX2NvdW50Kys7CisgICAgfSBlbHNlIGlmICghbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCAmJiBzdC0+aW5kZXggPT0gMSkgeworICAgICAgICBteGYtPmluZGV4X2VudHJpZXNbbXhmLT5lZGl0X3VuaXRzX2NvdW50LTFdLnNsaWNlX29mZnNldCA9CisgICAgICAgICAgICBteGYtPmJvZHlfb2Zmc2V0IC0gbXhmLT5pbmRleF9lbnRyaWVzW214Zi0+ZWRpdF91bml0c19jb3VudC0xXS5vZmZzZXQ7CisgICAgfQorCisgICAgbXhmX3dyaXRlX2tsdl9maWxsKHMpOworICAgIGF2aW9fd3JpdGUocGIsIHNjLT50cmFja19lc3NlbmNlX2VsZW1lbnRfa2V5LCAxNik7IC8vIHdyaXRlIGtleQorICAgIGlmIChzLT5vZm9ybWF0ID09ICZmZl9teGZfZDEwX211eGVyKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgbXhmX3dyaXRlX2QxMF92aWRlb19wYWNrZXQocywgc3QsIHBrdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG14Zl93cml0ZV9kMTBfYXVkaW9fcGFja2V0KHMsIHN0LCBwa3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIGtsdl9lbmNvZGVfYmVyNF9sZW5ndGgocGIsIHBrdC0+c2l6ZSk7IC8vIHdyaXRlIGxlbmd0aAorICAgICAgICBhdmlvX3dyaXRlKHBiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgICAgIG14Zi0+Ym9keV9vZmZzZXQgKz0gMTYrNCtwa3QtPnNpemUgKyBrbHZfZmlsbF9zaXplKDE2KzQrcGt0LT5zaXplKTsKKyAgICB9CisKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfcmFuZG9tX2luZGV4X3BhY2soQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE1YRkNvbnRleHQgKm14ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1aW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGludCBpOworCisgICAgYXZpb193cml0ZShwYiwgcmFuZG9tX2luZGV4X3BhY2tfa2V5LCAxNik7CisgICAga2x2X2VuY29kZV9iZXJfbGVuZ3RoKHBiLCAyOCArIDEyTEwqbXhmLT5ib2R5X3BhcnRpdGlvbnNfY291bnQpOworCisgICAgaWYgKG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQpCisgICAgICAgIGF2aW9fd2IzMihwYiwgMSk7IC8vIEJvZHlTSUQgb2YgaGVhZGVyIHBhcnRpdGlvbgorICAgIGVsc2UKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBhdmlvX3diNjQocGIsIDApOyAvLyBvZmZzZXQgb2YgaGVhZGVyIHBhcnRpdGlvbgorCisgICAgZm9yIChpID0gMDsgaSA8IG14Zi0+Ym9keV9wYXJ0aXRpb25zX2NvdW50OyBpKyspIHsKKyAgICAgICAgYXZpb193YjMyKHBiLCAxKTsgLy8gQm9keVNJRAorICAgICAgICBhdmlvX3diNjQocGIsIG14Zi0+Ym9keV9wYXJ0aXRpb25fb2Zmc2V0W2ldKTsKKyAgICB9CisKKyAgICBhdmlvX3diMzIocGIsIDApOyAvLyBCb2R5U0lEIG9mIGZvb3RlciBwYXJ0aXRpb24KKyAgICBhdmlvX3diNjQocGIsIG14Zi0+Zm9vdGVyX3BhcnRpdGlvbl9vZmZzZXQpOworCisgICAgYXZpb193YjMyKHBiLCBhdmlvX3RlbGwocGIpIC0gcG9zICsgNCk7Cit9CisKK3N0YXRpYyBpbnQgbXhmX3dyaXRlX2Zvb3RlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCBlcnI7CisKKyAgICBteGYtPmR1cmF0aW9uID0gbXhmLT5sYXN0X2luZGV4ZWRfZWRpdF91bml0ICsgbXhmLT5lZGl0X3VuaXRzX2NvdW50OworCisgICAgbXhmX3dyaXRlX2tsdl9maWxsKHMpOworICAgIG14Zi0+Zm9vdGVyX3BhcnRpdGlvbl9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgIGlmIChteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50KSB7IC8vIG5vIG5lZWQgdG8gcmVwZWF0IGluZGV4CisgICAgICAgIGlmICgoZXJyID0gbXhmX3dyaXRlX3BhcnRpdGlvbihzLCAwLCAwLCBmb290ZXJfcGFydGl0aW9uX2tleSwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChlcnIgPSBteGZfd3JpdGVfcGFydGl0aW9uKHMsIDAsIDIsIGZvb3Rlcl9wYXJ0aXRpb25fa2V5LCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgbXhmX3dyaXRlX2tsdl9maWxsKHMpOworICAgICAgICBteGZfd3JpdGVfaW5kZXhfdGFibGVfc2VnbWVudChzKTsKKyAgICB9CisKKyAgICBteGZfd3JpdGVfa2x2X2ZpbGwocyk7CisgICAgbXhmX3dyaXRlX3JhbmRvbV9pbmRleF9wYWNrKHMpOworCisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSkgeworICAgICAgICBhdmlvX3NlZWsocGIsIDAsIFNFRUtfU0VUKTsKKyAgICAgICAgaWYgKG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQpIHsKKyAgICAgICAgICAgIGlmICgoZXJyID0gbXhmX3dyaXRlX3BhcnRpdGlvbihzLCAxLCAyLCBoZWFkZXJfY2xvc2VkX3BhcnRpdGlvbl9rZXksIDEpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIG14Zl93cml0ZV9rbHZfZmlsbChzKTsKKyAgICAgICAgICAgIG14Zl93cml0ZV9pbmRleF90YWJsZV9zZWdtZW50KHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChlcnIgPSBteGZfd3JpdGVfcGFydGl0aW9uKHMsIDAsIDAsIGhlYWRlcl9jbG9zZWRfcGFydGl0aW9uX2tleSwgMSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgZmZfYXVkaW9faW50ZXJsZWF2ZV9jbG9zZShzKTsKKworICAgIGF2X2ZyZWVwKCZteGYtPmluZGV4X2VudHJpZXMpOworICAgIGF2X2ZyZWVwKCZteGYtPmJvZHlfcGFydGl0aW9uX29mZnNldCk7CisgICAgYXZfZnJlZXAoJm14Zi0+dGltZWNvZGVfdHJhY2stPnByaXZfZGF0YSk7CisgICAgYXZfZnJlZXAoJm14Zi0+dGltZWNvZGVfdHJhY2spOworCisgICAgbXhmX2ZyZWUocyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGZfaW50ZXJsZWF2ZV9nZXRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKm91dCwgQVZQYWNrZXQgKnBrdCwgaW50IGZsdXNoKQoreworICAgIGludCBpLCBzdHJlYW1fY291bnQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgc3RyZWFtX2NvdW50ICs9ICEhcy0+c3RyZWFtc1tpXS0+bGFzdF9pbl9wYWNrZXRfYnVmZmVyOworCisgICAgaWYgKHN0cmVhbV9jb3VudCAmJiAocy0+bmJfc3RyZWFtcyA9PSBzdHJlYW1fY291bnQgfHwgZmx1c2gpKSB7CisgICAgICAgIEFWUGFja2V0TGlzdCAqcGt0bCA9IHMtPnBhY2tldF9idWZmZXI7CisgICAgICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IHN0cmVhbV9jb3VudCkgeworICAgICAgICAgICAgQVZQYWNrZXRMaXN0ICpsYXN0ID0gTlVMTDsKKyAgICAgICAgICAgIC8vIGZpbmQgbGFzdCBwYWNrZXQgaW4gZWRpdCB1bml0CisgICAgICAgICAgICB3aGlsZSAocGt0bCkgeworICAgICAgICAgICAgICAgIGlmICghc3RyZWFtX2NvdW50IHx8IHBrdGwtPnBrdC5zdHJlYW1faW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbGFzdCA9IHBrdGw7CisgICAgICAgICAgICAgICAgcGt0bCA9IHBrdGwtPm5leHQ7CisgICAgICAgICAgICAgICAgc3RyZWFtX2NvdW50LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBwdXJnZSBwYWNrZXQgcXVldWUKKyAgICAgICAgICAgIHdoaWxlIChwa3RsKSB7CisgICAgICAgICAgICAgICAgQVZQYWNrZXRMaXN0ICpuZXh0ID0gcGt0bC0+bmV4dDsKKworICAgICAgICAgICAgICAgIGlmKHMtPnN0cmVhbXNbcGt0bC0+cGt0LnN0cmVhbV9pbmRleF0tPmxhc3RfaW5fcGFja2V0X2J1ZmZlciA9PSBwa3RsKQorICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW3BrdGwtPnBrdC5zdHJlYW1faW5kZXhdLT5sYXN0X2luX3BhY2tldF9idWZmZXI9IE5VTEw7CisgICAgICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQoJnBrdGwtPnBrdCk7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnBrdGwpOworICAgICAgICAgICAgICAgIHBrdGwgPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxhc3QpCisgICAgICAgICAgICAgICAgbGFzdC0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5wYWNrZXRfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzLT5wYWNrZXRfYnVmZmVyX2VuZD0gTlVMTDsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBrdGwgPSBzLT5wYWNrZXRfYnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgKm91dCA9IHBrdGwtPnBrdDsKKyAgICAgICAgYXZfZGxvZyhzLCAib3V0IHN0OiVkIGR0czolIlBSSWQ2NCJcbiIsICgqb3V0KS5zdHJlYW1faW5kZXgsICgqb3V0KS5kdHMpOworICAgICAgICBzLT5wYWNrZXRfYnVmZmVyID0gcGt0bC0+bmV4dDsKKyAgICAgICAgaWYocy0+c3RyZWFtc1twa3RsLT5wa3Quc3RyZWFtX2luZGV4XS0+bGFzdF9pbl9wYWNrZXRfYnVmZmVyID09IHBrdGwpCisgICAgICAgICAgICBzLT5zdHJlYW1zW3BrdGwtPnBrdC5zdHJlYW1faW5kZXhdLT5sYXN0X2luX3BhY2tldF9idWZmZXI9IE5VTEw7CisgICAgICAgIGlmKCFzLT5wYWNrZXRfYnVmZmVyKQorICAgICAgICAgICAgcy0+cGFja2V0X2J1ZmZlcl9lbmQ9IE5VTEw7CisgICAgICAgIGF2X2ZyZWVwKCZwa3RsKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICBvdXQ6CisgICAgICAgIGF2X2luaXRfcGFja2V0KG91dCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCBteGZfY29tcGFyZV90aW1lc3RhbXBzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKm5leHQsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTVhGU3RyZWFtQ29udGV4dCAqc2MgID0gcy0+c3RyZWFtc1twa3QgLT5zdHJlYW1faW5kZXhdLT5wcml2X2RhdGE7CisgICAgTVhGU3RyZWFtQ29udGV4dCAqc2MyID0gcy0+c3RyZWFtc1tuZXh0LT5zdHJlYW1faW5kZXhdLT5wcml2X2RhdGE7CisKKyAgICByZXR1cm4gbmV4dC0+ZHRzID4gcGt0LT5kdHMgfHwKKyAgICAgICAgKG5leHQtPmR0cyA9PSBwa3QtPmR0cyAmJiBzYy0+b3JkZXIgPCBzYzItPm9yZGVyKTsKK30KKworc3RhdGljIGludCBteGZfaW50ZXJsZWF2ZShBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpvdXQsIEFWUGFja2V0ICpwa3QsIGludCBmbHVzaCkKK3sKKyAgICByZXR1cm4gZmZfYXVkaW9fcmVjaHVua19pbnRlcmxlYXZlKHMsIG91dCwgcGt0LCBmbHVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteGZfaW50ZXJsZWF2ZV9nZXRfcGFja2V0LCBteGZfY29tcGFyZV90aW1lc3RhbXBzKTsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGQxMF9vcHRpb25zW10gPSB7CisgICAgeyAiZDEwX2NoYW5uZWxjb3VudCIsICJGb3JjZS9zZXQgY2hhbm5lbGNvdW50IGluIGdlbmVyaWMgc291bmQgZXNzZW5jZSBkZXNjcmlwdG9yIiwKKyAgICAgIG9mZnNldG9mKE1YRkNvbnRleHQsIGNoYW5uZWxfY291bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgOCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU19LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgbXhmX2QxMF9tdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAiTVhGLUQxMCBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgID0gZDEwX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfbXhmX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJteGYiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNWEYgKE1hdGVyaWFsIGVYY2hhbmdlIEZvcm1hdCkiKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAiYXBwbGljYXRpb24vbXhmIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAibXhmIiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTVhGQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gbXhmX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBteGZfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IG14Zl93cml0ZV9mb290ZXIsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorICAgIC5pbnRlcmxlYXZlX3BhY2tldCA9IG14Zl9pbnRlcmxlYXZlLAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfbXhmX2QxMF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAibXhmX2QxMCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1YRiAoTWF0ZXJpYWwgZVhjaGFuZ2UgRm9ybWF0KSBELTEwIE1hcHBpbmciKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAiYXBwbGljYXRpb24vbXhmIiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTVhGQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gbXhmX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBteGZfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IG14Zl93cml0ZV9mb290ZXIsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorICAgIC5pbnRlcmxlYXZlX3BhY2tldCA9IG14Zl9pbnRlcmxlYXZlLAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZteGZfZDEwX211eGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9teGcuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9teGcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDk3N2I4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L214Zy5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogTXhQRUcgY2xpcCBmaWxlIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBbmF0b2x5IE5lbmFzaGV2CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tanBlZy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmlvLmgiCisKKyNkZWZpbmUgREVGQVVMVF9QQUNLRVRfU0laRSAxMDI0CisjZGVmaW5lIE9WRVJSRUFEX1NJWkUgMworCit0eXBlZGVmIHN0cnVjdCBNWEdDb250ZXh0IHsKKyAgICB1aW50OF90ICpidWZmZXI7CisgICAgdWludDhfdCAqYnVmZmVyX3B0cjsKKyAgICB1aW50OF90ICpzb2lfcHRyOworICAgIHVuc2lnbmVkIGludCBidWZmZXJfc2l6ZTsKKyAgICBpbnQ2NF90IGR0czsKKyAgICB1bnNpZ25lZCBpbnQgY2FjaGVfc2l6ZTsKK30gTVhHQ29udGV4dDsKKworc3RhdGljIGludCBteGdfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICp2aWRlb19zdCwgKmF1ZGlvX3N0OworICAgIE1YR0NvbnRleHQgKm14ZyA9IHMtPnByaXZfZGF0YTsKKworICAgIC8qIHZpZGVvIHBhcmFtZXRlcnMgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0gKi8KKyAgICB2aWRlb19zdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCF2aWRlb19zdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB2aWRlb19zdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdmlkZW9fc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01YUEVHOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odmlkZW9fc3QsIDY0LCAxLCAxMDAwMDAwKTsKKworICAgIGF1ZGlvX3N0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIWF1ZGlvX3N0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF1ZGlvX3N0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhdWRpb19zdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX0FMQVc7CisgICAgYXVkaW9fc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7CisgICAgYXVkaW9fc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIGF1ZGlvX3N0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSA4MDAwOworICAgIGF1ZGlvX3N0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKKyAgICBhdWRpb19zdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKGF1ZGlvX3N0LCA2NCwgMSwgMTAwMDAwMCk7CisKKyAgICBteGctPnNvaV9wdHIgPSBteGctPmJ1ZmZlcl9wdHIgPSBteGctPmJ1ZmZlciA9IDA7CisgICAgbXhnLT5idWZmZXJfc2l6ZSA9IDA7CisgICAgbXhnLT5kdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBteGctPmNhY2hlX3NpemUgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50OF90KiBteGdfZmluZF9zdGFydG1hcmtlcih1aW50OF90ICpwLCB1aW50OF90ICplbmQpCit7CisgICAgZm9yICg7IHAgPCBlbmQgLSAzOyBwICs9IDQpIHsKKyAgICAgICAgdWludDMyX3QgeCA9IEFWX1JOMzIocCk7CisKKyAgICAgICAgaWYgKHggJiAofih4KzB4MDEwMTAxMDEpKSAmIDB4ODA4MDgwODApIHsKKyAgICAgICAgICAgIGlmIChwWzBdID09IDB4ZmYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocFsxXSA9PSAweGZmKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHArMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocFsyXSA9PSAweGZmKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHArMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocFszXSA9PSAweGZmKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHArMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoOyBwIDwgZW5kOyArK3ApIHsKKyAgICAgICAgaWYgKCpwID09IDB4ZmYpIHJldHVybiBwOworICAgIH0KKworICAgIHJldHVybiBlbmQ7Cit9CisKK3N0YXRpYyBpbnQgbXhnX3VwZGF0ZV9jYWNoZShBVkZvcm1hdENvbnRleHQgKnMsIHVuc2lnbmVkIGludCBjYWNoZV9zaXplKQoreworICAgIE1YR0NvbnRleHQgKm14ZyA9IHMtPnByaXZfZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgY3VycmVudF9wb3MgPSBteGctPmJ1ZmZlcl9wdHIgLSBteGctPmJ1ZmZlcjsKKyAgICB1bnNpZ25lZCBpbnQgc29pX3BvczsKKyAgICB1aW50OF90ICpidWZmZXI7CisgICAgaW50IHJldDsKKworICAgIC8qIHJlYWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyICovCisgICAgaWYgKGN1cnJlbnRfcG9zID4gY3VycmVudF9wb3MgKyBjYWNoZV9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHNvaV9wb3MgPSBteGctPnNvaV9wdHIgLSBteGctPmJ1ZmZlcjsKKyAgICBidWZmZXIgPSBhdl9mYXN0X3JlYWxsb2MobXhnLT5idWZmZXIsICZteGctPmJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3BvcyArIGNhY2hlX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBteGctPmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBteGctPmJ1ZmZlcl9wdHIgPSBteGctPmJ1ZmZlciArIGN1cnJlbnRfcG9zOworICAgIGlmIChteGctPnNvaV9wdHIpIG14Zy0+c29pX3B0ciA9IG14Zy0+YnVmZmVyICsgc29pX3BvczsKKworICAgIC8qIGdldCBkYXRhICovCisgICAgcmV0ID0gYXZpb19yZWFkKHMtPnBiLCBteGctPmJ1ZmZlcl9wdHIgKyBteGctPmNhY2hlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBjYWNoZV9zaXplIC0gbXhnLT5jYWNoZV9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG14Zy0+Y2FjaGVfc2l6ZSArPSByZXQ7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG14Z19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICB1aW50OF90ICpzdGFydG1hcmtlcl9wdHIsICplbmQsICpzZWFyY2hfZW5kLCBtYXJrZXI7CisgICAgTVhHQ29udGV4dCAqbXhnID0gcy0+cHJpdl9kYXRhOworCisgICAgd2hpbGUgKCFhdmlvX2Zlb2Yocy0+cGIpICYmICFzLT5wYi0+ZXJyb3IpeworICAgICAgICBpZiAobXhnLT5jYWNoZV9zaXplIDw9IE9WRVJSRUFEX1NJWkUpIHsKKyAgICAgICAgICAgIC8qIHVwZGF0ZSBpbnRlcm5hbCBidWZmZXIgKi8KKyAgICAgICAgICAgIHJldCA9IG14Z191cGRhdGVfY2FjaGUocywgREVGQVVMVF9QQUNLRVRfU0laRSArIE9WRVJSRUFEX1NJWkUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBlbmQgPSBteGctPmJ1ZmZlcl9wdHIgKyBteGctPmNhY2hlX3NpemU7CisKKyAgICAgICAgLyogZmluZCBzdGFydCBtYXJrZXIgLSAweGZmICovCisgICAgICAgIGlmIChteGctPmNhY2hlX3NpemUgPiBPVkVSUkVBRF9TSVpFKSB7CisgICAgICAgICAgICBzZWFyY2hfZW5kID0gZW5kIC0gT1ZFUlJFQURfU0laRTsKKyAgICAgICAgICAgIHN0YXJ0bWFya2VyX3B0ciA9IG14Z19maW5kX3N0YXJ0bWFya2VyKG14Zy0+YnVmZmVyX3B0ciwgc2VhcmNoX2VuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWFyY2hfZW5kID0gZW5kOworICAgICAgICAgICAgc3RhcnRtYXJrZXJfcHRyID0gbXhnX2ZpbmRfc3RhcnRtYXJrZXIobXhnLT5idWZmZXJfcHRyLCBzZWFyY2hfZW5kKTsKKyAgICAgICAgICAgIGlmIChzdGFydG1hcmtlcl9wdHIgPj0gc2VhcmNoX2VuZCAtIDEgfHwKKyAgICAgICAgICAgICAgICAqKHN0YXJ0bWFya2VyX3B0ciArIDEpICE9IEVPSSkgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhcnRtYXJrZXJfcHRyICE9IHNlYXJjaF9lbmQpIHsgLyogc3RhcnQgbWFya2VyIGZvdW5kICovCisgICAgICAgICAgICBtYXJrZXIgPSAqKHN0YXJ0bWFya2VyX3B0ciArIDEpOworICAgICAgICAgICAgbXhnLT5idWZmZXJfcHRyID0gc3RhcnRtYXJrZXJfcHRyICsgMjsKKyAgICAgICAgICAgIG14Zy0+Y2FjaGVfc2l6ZSA9IGVuZCAtIG14Zy0+YnVmZmVyX3B0cjsKKworICAgICAgICAgICAgaWYgKG1hcmtlciA9PSBTT0kpIHsKKyAgICAgICAgICAgICAgICBteGctPnNvaV9wdHIgPSBzdGFydG1hcmtlcl9wdHI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcmtlciA9PSBFT0kpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW14Zy0+c29pX3B0cikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJGb3VuZCBFT0kgYmVmb3JlIFNPSSwgc2tpcHBpbmdcbiIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwa3QtPnB0cyA9IHBrdC0+ZHRzID0gbXhnLT5kdHM7CisgICAgICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgICAgICAgICBwa3QtPmRlc3RydWN0ID0gTlVMTDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgICAgICAgICAgICAgcGt0LT5idWYgID0gTlVMTDsKKyAgICAgICAgICAgICAgICBwa3QtPnNpemUgPSBteGctPmJ1ZmZlcl9wdHIgLSBteGctPnNvaV9wdHI7CisgICAgICAgICAgICAgICAgcGt0LT5kYXRhID0gbXhnLT5zb2lfcHRyOworCisgICAgICAgICAgICAgICAgaWYgKG14Zy0+c29pX3B0ciAtIG14Zy0+YnVmZmVyID4gbXhnLT5jYWNoZV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChteGctPmNhY2hlX3NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobXhnLT5idWZmZXIsIG14Zy0+YnVmZmVyX3B0ciwgbXhnLT5jYWNoZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG14Zy0+YnVmZmVyX3B0ciA9IG14Zy0+YnVmZmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBteGctPnNvaV9wdHIgPSAwOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHBrdC0+c2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIChTT0YwIDw9IG1hcmtlciAmJiBtYXJrZXIgPD0gU09GMTUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoU09TICA8PSBtYXJrZXIgJiYgbWFya2VyIDw9IENPTSkgKSB7CisgICAgICAgICAgICAgICAgLyogYWxsIG90aGVyIG1hcmtlcnMgdGhhdCBzdGFydCBtYXJrZXIgc2VnbWVudCBhbHNvIGNvbnRhaW4KKyAgICAgICAgICAgICAgICAgICBsZW5ndGggdmFsdWUgKHNlZSBzcGVjaWZpY2F0aW9uIGZvciBKUEVHIEFubmV4IEIuMSkgKi8KKyAgICAgICAgICAgICAgICBzaXplID0gQVZfUkIxNihteGctPmJ1ZmZlcl9wdHIpOworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICAgICAgICAgICAgIGlmIChteGctPmNhY2hlX3NpemUgPCBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IG14Z191cGRhdGVfY2FjaGUocywgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRtYXJrZXJfcHRyID0gbXhnLT5idWZmZXJfcHRyIC0gMjsKKyAgICAgICAgICAgICAgICAgICAgbXhnLT5jYWNoZV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBteGctPmNhY2hlX3NpemUgLT0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBteGctPmJ1ZmZlcl9wdHIgKz0gc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmIChtYXJrZXIgPT0gQVBQMTMgJiYgc2l6ZSA+PSAxNikgeyAvKiBhdWRpbyBkYXRhICovCisgICAgICAgICAgICAgICAgICAgIC8qIHRpbWUgKEdNVCkgb2YgZmlyc3Qgc2FtcGxlIGluIHVzZWMgc2luY2UgMTk3MCwgbGl0dGxlLWVuZGlhbiAqLworICAgICAgICAgICAgICAgICAgICBwa3QtPnB0cyA9IHBrdC0+ZHRzID0gQVZfUkw2NChzdGFydG1hcmtlcl9wdHIgKyA4KTsKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAxOworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5kZXN0cnVjdCA9IE5VTEw7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBwa3QtPmJ1ZiAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBwa3QtPnNpemUgPSBzaXplIC0gMTQ7CisgICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YSA9IHN0YXJ0bWFya2VyX3B0ciArIDE2OworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydG1hcmtlcl9wdHIgLSBteGctPmJ1ZmZlciA+IG14Zy0+Y2FjaGVfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG14Zy0+Y2FjaGVfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobXhnLT5idWZmZXIsIG14Zy0+YnVmZmVyX3B0ciwgbXhnLT5jYWNoZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG14Zy0+YnVmZmVyX3B0ciA9IG14Zy0+YnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBrdC0+c2l6ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcmtlciA9PSBDT00gJiYgc2l6ZSA+PSAxOCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cm5jbXAoc3RhcnRtYXJrZXJfcHRyICsgNCwgIk1YRiIsIDMpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHRpbWUgKEdNVCkgb2YgdmlkZW8gZnJhbWUgaW4gdXNlYyBzaW5jZSAxOTcwLCBsaXR0bGUtZW5kaWFuICovCisgICAgICAgICAgICAgICAgICAgIG14Zy0+ZHRzID0gQVZfUkw2NChzdGFydG1hcmtlcl9wdHIgKyAxMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc3RhcnQgbWFya2VyIG5vdCBmb3VuZCAqLworICAgICAgICAgICAgbXhnLT5idWZmZXJfcHRyID0gc2VhcmNoX2VuZDsKKyAgICAgICAgICAgIG14Zy0+Y2FjaGVfc2l6ZSA9IE9WRVJSRUFEX1NJWkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Cit9CisKK3N0YXRpYyBpbnQgbXhnX2Nsb3NlKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTVhHQ29udGV4dCAqbXhnID0gcy0+cHJpdl9kYXRhOworICAgIGF2X2ZyZWVwKCZteGctPmJ1ZmZlcik7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbXhnX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm14ZyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk14UEVHIGNsaXAiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTVhHQ29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgID0gbXhnX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IG14Z19yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBteGdfY2xvc2UsCisgICAgLmV4dGVuc2lvbnMgICAgID0gIm14ZyIsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L25jZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbmNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjI4OTlmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L25jZGVjLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBOQyBjYW1lcmEgZmVlZCBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgIE5pY29sYXMgTWFydGluIChtYXJ0aW5pYyBhdCBpcm8gZG90IHVtb250cmVhbCBkb3QgY2EpCisgKiAgICAgICAgICAgICAgICAgICAgIEVkb3VhcmQgQXV2aW5ldAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBOQ19WSURFT19GTEFHIDB4MUE1CisKK3N0YXRpYyBpbnQgbmNfcHJvYmUoQVZQcm9iZURhdGEgKnByb2JlX3BhY2tldCkKK3sKKyAgICBpbnQgc2l6ZTsKKworICAgIGlmIChBVl9SQjMyKHByb2JlX3BhY2tldC0+YnVmKSAhPSBOQ19WSURFT19GTEFHKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHNpemUgPSBBVl9STDE2KHByb2JlX3BhY2tldC0+YnVmICsgNSk7CisKKyAgICBpZiAoc2l6ZSArIDIwID4gcHJvYmVfcGFja2V0LT5idWZfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYLzQ7CisKKyAgICBpZiAoQVZfUkIzMihwcm9iZV9wYWNrZXQtPmJ1ZisxNitzaXplKSA9PSBOQ19WSURFT19GTEFHKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuY19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTVBFRzQ7CisgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmNfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGludCBzaXplOworICAgIGludCByZXQ7CisKKyAgICB1aW50MzJfdCBzdGF0ZT0tMTsKKyAgICB3aGlsZSAoc3RhdGUgIT0gTkNfVklERU9fRkxBRykgeworICAgICAgICBpZiAoYXZpb19mZW9mKHMtPnBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIHN0YXRlID0gKHN0YXRlPDw4KSArIGF2aW9fcjgocy0+cGIpOworICAgIH0KKworICAgIGF2aW9fcjgocy0+cGIpOworICAgIHNpemUgPSBhdmlvX3JsMTYocy0+cGIpOworICAgIGF2aW9fc2tpcChzLT5wYiwgOSk7CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJOZXh0IHBhY2tldCBzaXplIGlzIHplcm9cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgIH0KKworICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisgICAgaWYgKHJldCAhPSBzaXplKSB7CisgICAgICAgIGlmIChyZXQgPiAwKSBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9uY19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJuYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5DIGNhbWVyYSBmZWVkIiksCisgICAgLnJlYWRfcHJvYmUgICAgID0gbmNfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gbmNfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gbmNfcmVhZF9wYWNrZXQsCisgICAgLmV4dGVuc2lvbnMgICAgID0gInYiLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9uZXR3b3JrLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbmV0d29yay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDJlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbmV0d29yay5jCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAidXJsLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKworI2lmIEhBVkVfVEhSRUFEUworI2lmIEhBVkVfUFRIUkVBRFMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZWxpZiBIQVZFX09TMlRIUkVBRFMKKyNpbmNsdWRlICJjb21wYXQvb3MydGhyZWFkcy5oIgorI2Vsc2UKKyNpbmNsdWRlICJjb21wYXQvdzMycHRocmVhZHMuaCIKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBDT05GSUdfT1BFTlNTTAorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CitzdGF0aWMgaW50IG9wZW5zc2xfaW5pdDsKKyNpZiBIQVZFX1RIUkVBRFMKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorcHRocmVhZF9tdXRleF90ICpvcGVuc3NsX211dGV4ZXM7CitzdGF0aWMgdm9pZCBvcGVuc3NsX2xvY2soaW50IG1vZGUsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKyAgICBpZiAobW9kZSAmIENSWVBUT19MT0NLKQorICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm9wZW5zc2xfbXV0ZXhlc1t0eXBlXSk7CisgICAgZWxzZQorICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmb3BlbnNzbF9tdXRleGVzW3R5cGVdKTsKK30KKyNpZiAhZGVmaW5lZChXSU4zMikgJiYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MTAwMDAwMDAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9wZW5zc2xfdGhyZWFkX2lkKHZvaWQpCit7CisgICAgcmV0dXJuIChpbnRwdHJfdCkgcHRocmVhZF9zZWxmKCk7Cit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgQ09ORklHX0dOVVRMUworI2luY2x1ZGUgPGdudXRscy9nbnV0bHMuaD4KKyNpZiBIQVZFX1RIUkVBRFMgJiYgR05VVExTX1ZFUlNJT05fTlVNQkVSIDw9IDB4MDIwYjAwCisjaW5jbHVkZSA8Z2NyeXB0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KK0dDUllfVEhSRUFEX09QVElPTl9QVEhSRUFEX0lNUEw7CisjZW5kaWYKKyNlbmRpZgorCit2b2lkIGZmX3Rsc19pbml0KHZvaWQpCit7CisgICAgYXZwcml2X2xvY2tfYXZmb3JtYXQoKTsKKyNpZiBDT05GSUdfT1BFTlNTTAorICAgIGlmICghb3BlbnNzbF9pbml0KSB7CisgICAgICAgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyAgICAgICAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworI2lmIEhBVkVfVEhSRUFEUworICAgICAgICBpZiAoIUNSWVBUT19nZXRfbG9ja2luZ19jYWxsYmFjaygpKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIG9wZW5zc2xfbXV0ZXhlcyA9IGF2X21hbGxvY19hcnJheShzaXplb2YocHRocmVhZF9tdXRleF90KSwgQ1JZUFRPX251bV9sb2NrcygpKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJm9wZW5zc2xfbXV0ZXhlc1tpXSwgTlVMTCk7CisgICAgICAgICAgICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2sob3BlbnNzbF9sb2NrKTsKKyNpZiAhZGVmaW5lZChXSU4zMikgJiYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MTAwMDAwMDAKKyAgICAgICAgICAgIENSWVBUT19zZXRfaWRfY2FsbGJhY2sob3BlbnNzbF90aHJlYWRfaWQpOworI2VuZGlmCisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBvcGVuc3NsX2luaXQrKzsKKyNlbmRpZgorI2lmIENPTkZJR19HTlVUTFMKKyNpZiBIQVZFX1RIUkVBRFMgJiYgR05VVExTX1ZFUlNJT05fTlVNQkVSIDwgMHgwMjBiMDAKKyAgICBpZiAoZ2NyeV9jb250cm9sKEdDUllDVExfQU5ZX0lOSVRJQUxJWkFUSU9OX1ApID09IDApCisgICAgICAgIGdjcnlfY29udHJvbChHQ1JZQ1RMX1NFVF9USFJFQURfQ0JTLCAmZ2NyeV90aHJlYWRzX3B0aHJlYWQpOworI2VuZGlmCisgICAgZ251dGxzX2dsb2JhbF9pbml0KCk7CisjZW5kaWYKKyAgICBhdnByaXZfdW5sb2NrX2F2Zm9ybWF0KCk7Cit9CisKK3ZvaWQgZmZfdGxzX2RlaW5pdCh2b2lkKQoreworICAgIGF2cHJpdl9sb2NrX2F2Zm9ybWF0KCk7CisjaWYgQ09ORklHX09QRU5TU0wKKyAgICBvcGVuc3NsX2luaXQtLTsKKyAgICBpZiAoIW9wZW5zc2xfaW5pdCkgeworI2lmIEhBVkVfVEhSRUFEUworICAgICAgICBpZiAoQ1JZUFRPX2dldF9sb2NraW5nX2NhbGxiYWNrKCkgPT0gb3BlbnNzbF9sb2NrKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhOVUxMKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm9wZW5zc2xfbXV0ZXhlc1tpXSk7CisgICAgICAgICAgICBhdl9mcmVlKG9wZW5zc2xfbXV0ZXhlcyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNlbmRpZgorI2lmIENPTkZJR19HTlVUTFMKKyAgICBnbnV0bHNfZ2xvYmFsX2RlaW5pdCgpOworI2VuZGlmCisgICAgYXZwcml2X3VubG9ja19hdmZvcm1hdCgpOworfQorCitpbnQgZmZfbmV0d29ya19pbml0ZWRfZ2xvYmFsbHk7CisKK2ludCBmZl9uZXR3b3JrX2luaXQodm9pZCkKK3sKKyNpZiBIQVZFX1dJTlNPQ0syX0gKKyAgICBXU0FEQVRBIHdzYURhdGE7CisjZW5kaWYKKworICAgIGlmICghZmZfbmV0d29ya19pbml0ZWRfZ2xvYmFsbHkpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlVzaW5nIG5ldHdvcmsgcHJvdG9jb2xzIHdpdGhvdXQgZ2xvYmFsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV0d29yayBpbml0aWFsaXphdGlvbi4gUGxlYXNlIHVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF2Zm9ybWF0X25ldHdvcmtfaW5pdCgpLCB0aGlzIHdpbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWNvbWUgbWFuZGF0b3J5IGxhdGVyLlxuIik7CisjaWYgSEFWRV9XSU5TT0NLMl9ICisgICAgaWYgKFdTQVN0YXJ0dXAoTUFLRVdPUkQoMSwxKSwgJndzYURhdGEpKQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIHJldHVybiAxOworfQorCitpbnQgZmZfbmV0d29ya193YWl0X2ZkKGludCBmZCwgaW50IHdyaXRlKQoreworICAgIGludCBldiA9IHdyaXRlID8gUE9MTE9VVCA6IFBPTExJTjsKKyAgICBzdHJ1Y3QgcG9sbGZkIHAgPSB7IC5mZCA9IGZkLCAuZXZlbnRzID0gZXYsIC5yZXZlbnRzID0gMCB9OworICAgIGludCByZXQ7CisgICAgcmV0ID0gcG9sbCgmcCwgMSwgMTAwKTsKKyAgICByZXR1cm4gcmV0IDwgMCA/IGZmX25ldGVycm5vKCkgOiBwLnJldmVudHMgJiAoZXYgfCBQT0xMRVJSIHwgUE9MTEhVUCkgPyAwIDogQVZFUlJPUihFQUdBSU4pOworfQorCitpbnQgZmZfbmV0d29ya193YWl0X2ZkX3RpbWVvdXQoaW50IGZkLCBpbnQgd3JpdGUsIGludDY0X3QgdGltZW91dCwgQVZJT0ludGVycnVwdENCICppbnRfY2IpCit7CisgICAgaW50IHJldDsKKyAgICBpbnQ2NF90IHdhaXRfc3RhcnQgPSAwOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGZmX2NoZWNrX2ludGVycnVwdChpbnRfY2IpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhJVDsKKyAgICAgICAgcmV0ID0gZmZfbmV0d29ya193YWl0X2ZkKGZkLCB3cml0ZSk7CisgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUihFQUdBSU4pKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7CisgICAgICAgICAgICBpZiAoIXdhaXRfc3RhcnQpCisgICAgICAgICAgICAgICAgd2FpdF9zdGFydCA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGF2X2dldHRpbWVfcmVsYXRpdmUoKSAtIHdhaXRfc3RhcnQgPiB0aW1lb3V0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVUSU1FRE9VVCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZmZfbmV0d29ya19jbG9zZSh2b2lkKQoreworI2lmIEhBVkVfV0lOU09DSzJfSAorICAgIFdTQUNsZWFudXAoKTsKKyNlbmRpZgorfQorCisjaWYgSEFWRV9XSU5TT0NLMl9ICitpbnQgZmZfbmV0ZXJybm8odm9pZCkKK3sKKyAgICBpbnQgZXJyID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgc3dpdGNoIChlcnIpIHsKKyAgICBjYXNlIFdTQUVXT1VMREJMT0NLOgorICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgIGNhc2UgV1NBRUlOVFI6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlRSKTsKKyAgICBjYXNlIFdTQUVQUk9UT05PU1VQUE9SVDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRVBST1RPTk9TVVBQT1JUKTsKKyAgICBjYXNlIFdTQUVUSU1FRE9VVDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRVRJTUVET1VUKTsKKyAgICBjYXNlIFdTQUVDT05OUkVGVVNFRDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUNPTk5SRUZVU0VEKTsKKyAgICBjYXNlIFdTQUVJTlBST0dSRVNTOgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5QUk9HUkVTUyk7CisgICAgfQorICAgIHJldHVybiAtZXJyOworfQorI2VuZGlmCisKK2ludCBmZl9pc19tdWx0aWNhc3RfYWRkcmVzcyhzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpCit7CisgICAgaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICAgIHJldHVybiBJTl9NVUxUSUNBU1QobnRvaGwoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyKS0+c2luX2FkZHIuc19hZGRyKSk7CisgICAgfQorI2lmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX0lONgorICAgIGlmIChhZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgcmV0dXJuIElONl9JU19BRERSX01VTFRJQ0FTVCgmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkciktPnNpbjZfYWRkcik7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZl9wb2xsX2ludGVycnVwdChzdHJ1Y3QgcG9sbGZkICpwLCBuZmRzX3QgbmZkcywgaW50IHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSU9JbnRlcnJ1cHRDQiAqY2IpCit7CisgICAgaW50IHJ1bnMgPSB0aW1lb3V0IC8gUE9MTElOR19USU1FOworICAgIGludCByZXQgPSAwOworCisgICAgZG8geworICAgICAgICBpZiAoZmZfY2hlY2tfaW50ZXJydXB0KGNiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisgICAgICAgIHJldCA9IHBvbGwocCwgbmZkcywgUE9MTElOR19USU1FKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfSB3aGlsZSAodGltZW91dCA8PSAwIHx8IHJ1bnMtLSA+IDApOworCisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVUSU1FRE9VVCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKGVycm5vKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfc29ja2V0KGludCBhZiwgaW50IHR5cGUsIGludCBwcm90bykKK3sKKyAgICBpbnQgZmQ7CisKKyNpZmRlZiBTT0NLX0NMT0VYRUMKKyAgICBmZCA9IHNvY2tldChhZiwgdHlwZSB8IFNPQ0tfQ0xPRVhFQywgcHJvdG8pOworICAgIGlmIChmZCA9PSAtMSAmJiBlcnJubyA9PSBFSU5WQUwpCisjZW5kaWYKKyAgICB7CisgICAgICAgIGZkID0gc29ja2V0KGFmLCB0eXBlLCBwcm90byk7CisjaWYgSEFWRV9GQ05UTAorICAgICAgICBpZiAoZmQgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQykgPT0gLTEpCisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIkZhaWxlZCB0byBzZXQgY2xvc2Ugb24gZXhlY1xuIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gZmQ7Cit9CisKK2ludCBmZl9saXN0ZW5fYmluZChpbnQgZmQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKyAgICAgICAgICAgICAgICAgICBzb2NrbGVuX3QgYWRkcmxlbiwgaW50IHRpbWVvdXQsIFVSTENvbnRleHQgKmgpCit7CisgICAgaW50IHJldDsKKyAgICBpbnQgcmV1c2UgPSAxOworICAgIHN0cnVjdCBwb2xsZmQgbHAgPSB7IGZkLCBQT0xMSU4sIDAgfTsKKyAgICBpZiAoc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmcmV1c2UsIHNpemVvZihyZXVzZSkpKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgInNldHNvY2tvcHQoU09fUkVVU0VBRERSKSBmYWlsZWRcbiIpOworICAgIH0KKyAgICByZXQgPSBiaW5kKGZkLCBhZGRyLCBhZGRybGVuKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gZmZfbmV0ZXJybm8oKTsKKworICAgIHJldCA9IGxpc3RlbihmZCwgMSk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIGZmX25ldGVycm5vKCk7CisKKyAgICByZXQgPSBmZl9wb2xsX2ludGVycnVwdCgmbHAsIDEsIHRpbWVvdXQsICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2spOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gYWNjZXB0KGZkLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIGZmX25ldGVycm5vKCk7CisKKyAgICBjbG9zZXNvY2tldChmZCk7CisKKyAgICBpZiAoZmZfc29ja2V0X25vbmJsb2NrKHJldCwgMSkgPCAwKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiZmZfc29ja2V0X25vbmJsb2NrIGZhaWxlZFxuIik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfbGlzdGVuX2Nvbm5lY3QoaW50IGZkLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgc29ja2xlbl90IGFkZHJsZW4sIGludCB0aW1lb3V0LCBVUkxDb250ZXh0ICpoLAorICAgICAgICAgICAgICAgICAgICAgIGludCB3aWxsX3RyeV9uZXh0KQoreworICAgIHN0cnVjdCBwb2xsZmQgcCA9IHtmZCwgUE9MTE9VVCwgMH07CisgICAgaW50IHJldDsKKyAgICBzb2NrbGVuX3Qgb3B0bGVuOworCisgICAgaWYgKGZmX3NvY2tldF9ub25ibG9jayhmZCwgMSkgPCAwKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiZmZfc29ja2V0X25vbmJsb2NrIGZhaWxlZFxuIik7CisKKyAgICB3aGlsZSAoKHJldCA9IGNvbm5lY3QoZmQsIGFkZHIsIGFkZHJsZW4pKSkgeworICAgICAgICByZXQgPSBmZl9uZXRlcnJubygpOworICAgICAgICBzd2l0Y2ggKHJldCkgeworICAgICAgICBjYXNlIEFWRVJST1IoRUlOVFIpOgorICAgICAgICAgICAgaWYgKGZmX2NoZWNrX2ludGVycnVwdCgmaC0+aW50ZXJydXB0X2NhbGxiYWNrKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgQVZFUlJPUihFSU5QUk9HUkVTUyk6CisgICAgICAgIGNhc2UgQVZFUlJPUihFQUdBSU4pOgorICAgICAgICAgICAgcmV0ID0gZmZfcG9sbF9pbnRlcnJ1cHQoJnAsIDEsIHRpbWVvdXQsICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2spOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIG9wdGxlbiA9IHNpemVvZihyZXQpOworICAgICAgICAgICAgaWYgKGdldHNvY2tvcHQgKGZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwgJnJldCwgJm9wdGxlbikpCisgICAgICAgICAgICAgICAgcmV0ID0gQVZVTkVSUk9SKGZmX25ldGVycm5vKCkpOworICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciBlcnJidWZbMTAwXTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKHJldCk7CisgICAgICAgICAgICAgICAgYXZfc3RyZXJyb3IocmV0LCBlcnJidWYsIHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgICAgICBpZiAod2lsbF90cnlfbmV4dCkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gdG8gJXMgZmFpbGVkICglcyksIHRyeWluZyBuZXh0IGFkZHJlc3NcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5maWxlbmFtZSwgZXJyYnVmKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJDb25uZWN0aW9uIHRvICVzIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5maWxlbmFtZSwgZXJyYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYXRjaF9ob3N0X3BhdHRlcm4oY29uc3QgY2hhciAqcGF0dGVybiwgY29uc3QgY2hhciAqaG9zdG5hbWUpCit7CisgICAgaW50IGxlbl9wLCBsZW5faDsKKyAgICBpZiAoIXN0cmNtcChwYXR0ZXJuLCAiKiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICAvLyBTa2lwIGEgcG9zc2libGUgKi4gYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXR0ZXJuCisgICAgaWYgKHBhdHRlcm5bMF0gPT0gJyonKQorICAgICAgICBwYXR0ZXJuKys7CisgICAgaWYgKHBhdHRlcm5bMF0gPT0gJy4nKQorICAgICAgICBwYXR0ZXJuKys7CisgICAgbGVuX3AgPSBzdHJsZW4ocGF0dGVybik7CisgICAgbGVuX2ggPSBzdHJsZW4oaG9zdG5hbWUpOworICAgIGlmIChsZW5fcCA+IGxlbl9oKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBTaW1wbHkgY2hlY2sgaWYgdGhlIGVuZCBvZiBob3N0bmFtZSBpcyBlcXVhbCB0byAncGF0dGVybicKKyAgICBpZiAoIXN0cmNtcChwYXR0ZXJuLCAmaG9zdG5hbWVbbGVuX2ggLSBsZW5fcF0pKSB7CisgICAgICAgIGlmIChsZW5faCA9PSBsZW5fcCkKKyAgICAgICAgICAgIHJldHVybiAxOyAvLyBFeGFjdCBtYXRjaAorICAgICAgICBpZiAoaG9zdG5hbWVbbGVuX2ggLSBsZW5fcCAtIDFdID09ICcuJykKKyAgICAgICAgICAgIHJldHVybiAxOyAvLyBUaGUgbWF0Y2hlZCBzdWJzdHJpbmcgaXMgYSBkb21haW4gYW5kIG5vdCBqdXN0IGEgc3Vic3RyaW5nIG9mIGEgZG9tYWluCisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgZmZfaHR0cF9tYXRjaF9ub19wcm94eShjb25zdCBjaGFyICpub19wcm94eSwgY29uc3QgY2hhciAqaG9zdG5hbWUpCit7CisgICAgY2hhciAqYnVmLCAqc3RhcnQ7CisgICAgaW50IHJldCA9IDA7CisgICAgaWYgKCFub19wcm94eSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFob3N0bmFtZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnVmID0gYXZfc3RyZHVwKG5vX3Byb3h5KTsKKyAgICBpZiAoIWJ1ZikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RhcnQgPSBidWY7CisgICAgd2hpbGUgKHN0YXJ0KSB7CisgICAgICAgIGNoYXIgKnNlcCwgKm5leHQgPSBOVUxMOworICAgICAgICBzdGFydCArPSBzdHJzcG4oc3RhcnQsICIgLCIpOworICAgICAgICBzZXAgPSBzdGFydCArIHN0cmNzcG4oc3RhcnQsICIgLCIpOworICAgICAgICBpZiAoKnNlcCkgeworICAgICAgICAgICAgbmV4dCA9IHNlcCArIDE7CisgICAgICAgICAgICAqc2VwID0gJ1wwJzsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF0Y2hfaG9zdF9wYXR0ZXJuKHN0YXJ0LCBob3N0bmFtZSkpIHsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzdGFydCA9IG5leHQ7CisgICAgfQorICAgIGF2X2ZyZWUoYnVmKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L25ldHdvcmsuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9uZXR3b3JrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxMDgxYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9uZXR3b3JrLmgKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfTkVUV09SS19ICisjZGVmaW5lIEFWRk9STUFUX05FVFdPUktfSAorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9lcnJvci5oIgorI2luY2x1ZGUgIm9zX3N1cHBvcnQuaCIKKyNpbmNsdWRlICJhdmlvLmgiCisjaW5jbHVkZSAidXJsLmgiCisKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmIEhBVkVfV0lOU09DSzJfSAorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjaW5jbHVkZSA8d3MydGNwaXAuaD4KKworI2lmbmRlZiBFUFJPVE9OT1NVUFBPUlQKKyNkZWZpbmUgRVBST1RPTk9TVVBQT1JUIFdTQUVQUk9UT05PU1VQUE9SVAorI2VuZGlmCisjaWZuZGVmIEVUSU1FRE9VVAorI2RlZmluZSBFVElNRURPVVQgICAgICAgV1NBRVRJTUVET1VUCisjZW5kaWYKKyNpZm5kZWYgRUNPTk5SRUZVU0VECisjZGVmaW5lIEVDT05OUkVGVVNFRCAgICBXU0FFQ09OTlJFRlVTRUQKKyNlbmRpZgorI2lmbmRlZiBFSU5QUk9HUkVTUworI2RlZmluZSBFSU5QUk9HUkVTUyAgICAgV1NBRUlOUFJPR1JFU1MKKyNlbmRpZgorCisjZGVmaW5lIGdldHNvY2tvcHQoYSwgYiwgYywgZCwgZSkgZ2V0c29ja29wdChhLCBiLCBjLCAoY2hhciopIGQsIGUpCisjZGVmaW5lIHNldHNvY2tvcHQoYSwgYiwgYywgZCwgZSkgc2V0c29ja29wdChhLCBiLCBjLCAoY29uc3QgY2hhciopIGQsIGUpCisKK2ludCBmZl9uZXRlcnJubyh2b2lkKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCisjZGVmaW5lIGZmX25ldGVycm5vKCkgQVZFUlJPUihlcnJubykKKyNlbmRpZiAvKiBIQVZFX1dJTlNPQ0syX0ggKi8KKworI2lmIEhBVkVfQVJQQV9JTkVUX0gKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNlbmRpZgorCisjaWYgSEFWRV9QT0xMX0gKKyNpbmNsdWRlIDxwb2xsLmg+CisjZW5kaWYKKworaW50IGZmX3NvY2tldF9ub25ibG9jayhpbnQgc29ja2V0LCBpbnQgZW5hYmxlKTsKKworZXh0ZXJuIGludCBmZl9uZXR3b3JrX2luaXRlZF9nbG9iYWxseTsKK2ludCBmZl9uZXR3b3JrX2luaXQodm9pZCk7Cit2b2lkIGZmX25ldHdvcmtfY2xvc2Uodm9pZCk7CisKK3ZvaWQgZmZfdGxzX2luaXQodm9pZCk7Cit2b2lkIGZmX3Rsc19kZWluaXQodm9pZCk7CisKK2ludCBmZl9uZXR3b3JrX3dhaXRfZmQoaW50IGZkLCBpbnQgd3JpdGUpOworCisvKioKKyAqIFRoaXMgd29ya3Mgc2ltaWxhcmx5IHRvIGZmX25ldHdvcmtfd2FpdF9mZCwgYnV0IHdhaXRzIHVwIHRvICd0aW1lb3V0JyBtaWNyb3NlY29uZHMKKyAqIFVzZXMgZmZfbmV0d29ya193YWl0X2ZkIGluIGEgbG9vcAorICoKKyAqIEBmZCBTb2NrZXQgZGVzY3JpcHRvcgorICogQHdyaXRlIFNldCAxIHRvIHdhaXQgZm9yIHNvY2tldCBhYmxlIHRvIGJlIHJlYWQsIDAgdG8gYmUgd3JpdHRlbgorICogQHRpbWVvdXQgVGltZW91dCBpbnRlcnZhbCwgaW4gbWljcm9zZWNvbmRzLiBBY3R1YWwgcHJlY2lzaW9uIGlzIDEwMDAwMCBtY3MsIGR1ZSB0byBmZl9uZXR3b3JrX3dhaXRfZmQgdXNhZ2UKKyAqIEBwYXJhbSBpbnRfY2IgSW50ZXJydXB0IGNhbGxiYWNrLCBpcyBjaGVja2VkIGJlZm9yZSBlYWNoIGZmX25ldHdvcmtfd2FpdF9mZCBjYWxsCisgKiBAcmV0dXJuIDAgaWYgZGF0YSBjYW4gYmUgcmVhZC93cml0dGVuLCBBVkVSUk9SKEVUSU1FRE9VVCkgaWYgdGltZW91dCBleHBpcmVkLCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK2ludCBmZl9uZXR3b3JrX3dhaXRfZmRfdGltZW91dChpbnQgZmQsIGludCB3cml0ZSwgaW50NjRfdCB0aW1lb3V0LCBBVklPSW50ZXJydXB0Q0IgKmludF9jYik7CisKK2ludCBmZl9pbmV0X2F0b24gKGNvbnN0IGNoYXIgKiBzdHIsIHN0cnVjdCBpbl9hZGRyICogYWRkKTsKKworI2lmICFIQVZFX1NUUlVDVF9TT0NLQUREUl9TVE9SQUdFCitzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSB7CisjaWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfU0FfTEVOCisgICAgdWludDhfdCBzc19sZW47CisgICAgdWludDhfdCBzc19mYW1pbHk7CisjZWxzZQorICAgIHVpbnQxNl90IHNzX2ZhbWlseTsKKyNlbmRpZiAvKiBIQVZFX1NUUlVDVF9TT0NLQUREUl9TQV9MRU4gKi8KKyAgICBjaGFyIHNzX3BhZDFbNl07CisgICAgaW50NjRfdCBzc19hbGlnbjsKKyAgICBjaGFyIHNzX3BhZDJbMTEyXTsKK307CisjZW5kaWYgLyogIUhBVkVfU1RSVUNUX1NPQ0tBRERSX1NUT1JBR0UgKi8KKwordHlwZWRlZiB1bmlvbiBzb2NrYWRkcl91bmlvbiB7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3RvcmFnZTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gaW47CisjaWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBpbjY7CisjZW5kaWYKK30gc29ja2FkZHJfdW5pb247CisKKyNpZm5kZWYgTVNHX05PU0lHTkFMCisjZGVmaW5lIE1TR19OT1NJR05BTCAwCisjZW5kaWYKKworI2lmICFIQVZFX1NUUlVDVF9BRERSSU5GTworc3RydWN0IGFkZHJpbmZvIHsKKyAgICBpbnQgYWlfZmxhZ3M7CisgICAgaW50IGFpX2ZhbWlseTsKKyAgICBpbnQgYWlfc29ja3R5cGU7CisgICAgaW50IGFpX3Byb3RvY29sOworICAgIGludCBhaV9hZGRybGVuOworICAgIHN0cnVjdCBzb2NrYWRkciAqYWlfYWRkcjsKKyAgICBjaGFyICphaV9jYW5vbm5hbWU7CisgICAgc3RydWN0IGFkZHJpbmZvICphaV9uZXh0OworfTsKKyNlbmRpZiAvKiAhSEFWRV9TVFJVQ1RfQUREUklORk8gKi8KKworLyogZ2V0YWRkcmluZm8gY29uc3RhbnRzICovCisjaWZuZGVmIEVBSV9BR0FJTgorI2RlZmluZSBFQUlfQUdBSU4gMgorI2VuZGlmCisjaWZuZGVmIEVBSV9CQURGTEFHUworI2RlZmluZSBFQUlfQkFERkxBR1MgMworI2VuZGlmCisjaWZuZGVmIEVBSV9GQUlMCisjZGVmaW5lIEVBSV9GQUlMIDQKKyNlbmRpZgorI2lmbmRlZiBFQUlfRkFNSUxZCisjZGVmaW5lIEVBSV9GQU1JTFkgNQorI2VuZGlmCisjaWZuZGVmIEVBSV9NRU1PUlkKKyNkZWZpbmUgRUFJX01FTU9SWSA2CisjZW5kaWYKKyNpZm5kZWYgRUFJX05PREFUQQorI2RlZmluZSBFQUlfTk9EQVRBIDcKKyNlbmRpZgorI2lmbmRlZiBFQUlfTk9OQU1FCisjZGVmaW5lIEVBSV9OT05BTUUgOAorI2VuZGlmCisjaWZuZGVmIEVBSV9TRVJWSUNFCisjZGVmaW5lIEVBSV9TRVJWSUNFIDkKKyNlbmRpZgorI2lmbmRlZiBFQUlfU09DS1RZUEUKKyNkZWZpbmUgRUFJX1NPQ0tUWVBFIDEwCisjZW5kaWYKKworI2lmbmRlZiBBSV9QQVNTSVZFCisjZGVmaW5lIEFJX1BBU1NJVkUgMQorI2VuZGlmCisKKyNpZm5kZWYgQUlfQ0FOT05OQU1FCisjZGVmaW5lIEFJX0NBTk9OTkFNRSAyCisjZW5kaWYKKworI2lmbmRlZiBBSV9OVU1FUklDSE9TVAorI2RlZmluZSBBSV9OVU1FUklDSE9TVCA0CisjZW5kaWYKKworI2lmbmRlZiBOSV9OT0ZRRE4KKyNkZWZpbmUgTklfTk9GUUROIDEKKyNlbmRpZgorCisjaWZuZGVmIE5JX05VTUVSSUNIT1NUCisjZGVmaW5lIE5JX05VTUVSSUNIT1NUIDIKKyNlbmRpZgorCisjaWZuZGVmIE5JX05BTUVSUUQKKyNkZWZpbmUgTklfTkFNRVJRRCA0CisjZW5kaWYKKworI2lmbmRlZiBOSV9OVU1FUklDU0VSVgorI2RlZmluZSBOSV9OVU1FUklDU0VSViA4CisjZW5kaWYKKworI2lmbmRlZiBOSV9ER1JBTQorI2RlZmluZSBOSV9ER1JBTSAxNgorI2VuZGlmCisKKyNpZiAhSEFWRV9HRVRBRERSSU5GTworaW50IGZmX2dldGFkZHJpbmZvKGNvbnN0IGNoYXIgKm5vZGUsIGNvbnN0IGNoYXIgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50cywgc3RydWN0IGFkZHJpbmZvICoqcmVzKTsKK3ZvaWQgZmZfZnJlZWFkZHJpbmZvKHN0cnVjdCBhZGRyaW5mbyAqcmVzKTsKK2ludCBmZl9nZXRuYW1laW5mbyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBpbnQgc2FsZW4sCisgICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdCwgaW50IGhvc3RsZW4sCisgICAgICAgICAgICAgICAgICAgY2hhciAqc2VydiwgaW50IHNlcnZsZW4sIGludCBmbGFncyk7CisjZGVmaW5lIGdldGFkZHJpbmZvIGZmX2dldGFkZHJpbmZvCisjZGVmaW5lIGZyZWVhZGRyaW5mbyBmZl9mcmVlYWRkcmluZm8KKyNkZWZpbmUgZ2V0bmFtZWluZm8gZmZfZ2V0bmFtZWluZm8KKyNlbmRpZiAvKiAhSEFWRV9HRVRBRERSSU5GTyAqLworCisjaWYgIUhBVkVfR0VUQUREUklORk8gfHwgSEFWRV9XSU5TT0NLMl9ICitjb25zdCBjaGFyICpmZl9nYWlfc3RyZXJyb3IoaW50IGVjb2RlKTsKKyN1bmRlZiBnYWlfc3RyZXJyb3IKKyNkZWZpbmUgZ2FpX3N0cmVycm9yIGZmX2dhaV9zdHJlcnJvcgorI2VuZGlmIC8qICFIQVZFX0dFVEFERFJJTkZPIHx8IEhBVkVfV0lOU09DSzJfSCAqLworCisjaWZuZGVmIElOQUREUl9MT09QQkFDSworI2RlZmluZSBJTkFERFJfTE9PUEJBQ0sgMHg3ZjAwMDAwMQorI2VuZGlmCisKKyNpZm5kZWYgSU5FVF9BRERSU1RSTEVOCisjZGVmaW5lIElORVRfQUREUlNUUkxFTiAxNgorI2VuZGlmCisKKyNpZm5kZWYgSU5FVDZfQUREUlNUUkxFTgorI2RlZmluZSBJTkVUNl9BRERSU1RSTEVOIElORVRfQUREUlNUUkxFTgorI2VuZGlmCisKKyNpZm5kZWYgSU5fTVVMVElDQVNUCisjZGVmaW5lIElOX01VTFRJQ0FTVChhKSAoKCgodWludDMyX3QpKGEpKSAmIDB4ZjAwMDAwMDApID09IDB4ZTAwMDAwMDApCisjZW5kaWYKKyNpZm5kZWYgSU42X0lTX0FERFJfTVVMVElDQVNUCisjZGVmaW5lIElONl9JU19BRERSX01VTFRJQ0FTVChhKSAoKCh1aW50OF90ICopIChhKSlbMF0gPT0gMHhmZikKKyNlbmRpZgorCitpbnQgZmZfaXNfbXVsdGljYXN0X2FkZHJlc3Moc3RydWN0IHNvY2thZGRyICphZGRyKTsKKworI2RlZmluZSBQT0xMSU5HX1RJTUUgMTAwIC8vLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGludGVycnVwdCBjaGVjaworCisvKioKKyAqIEJpbmQgdG8gYSBmaWxlIGRlc2NyaXB0b3IgYW5kIHBvbGwgZm9yIGEgY29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gZmQgICAgICBGaXJzdCBhcmd1bWVudCBvZiBiaW5kKCkuCisgKiBAcGFyYW0gYWRkciAgICBTZWNvbmQgYXJndW1lbnQgb2YgYmluZCgpLgorICogQHBhcmFtIGFkZHJsZW4gVGhpcmQgYXJndW1lbnQgb2YgYmluZCgpLgorICogQHBhcmFtIHRpbWVvdXQgUG9sbGluZyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KKyAqIEBwYXJhbSBoICAgICAgIFVSTENvbnRleHQgcHJvdmlkaW5nIGludGVycnVwdCBjaGVjaworICogICAgICAgICAgICAgICAgY2FsbGJhY2sgYW5kIGxvZ2dpbmcgY29udGV4dC4KKyAqIEByZXR1cm4gICAgICAgIEEgbm9uLWJsb2NraW5nIGZpbGUgZGVzY3JpcHRvciBvbiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgICBvciBhbiBBVkVSUk9SIG9uIGZhaWx1cmUuCisgKi8KK2ludCBmZl9saXN0ZW5fYmluZChpbnQgZmQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKyAgICAgICAgICAgICAgICAgICBzb2NrbGVuX3QgYWRkcmxlbiwgaW50IHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgVVJMQ29udGV4dCAqaCk7CisKKy8qKgorICogQ29ubmVjdCB0byBhIGZpbGUgZGVzY3JpcHRvciBhbmQgcG9sbCBmb3IgcmVzdWx0LgorICoKKyAqIEBwYXJhbSBmZCAgICAgICBGaXJzdCBhcmd1bWVudCBvZiBjb25uZWN0KCksCisgKiAgICAgICAgICAgICAgICAgd2lsbCBiZSBzZXQgYXMgbm9uLWJsb2NraW5nLgorICogQHBhcmFtIGFkZHIgICAgIFNlY29uZCBhcmd1bWVudCBvZiBjb25uZWN0KCkuCisgKiBAcGFyYW0gYWRkcmxlbiAgVGhpcmQgYXJndW1lbnQgb2YgY29ubmVjdCgpLgorICogQHBhcmFtIHRpbWVvdXQgIFBvbGxpbmcgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgKiBAcGFyYW0gaCAgICAgICAgVVJMQ29udGV4dCBwcm92aWRpbmcgaW50ZXJydXB0IGNoZWNrCisgKiAgICAgICAgICAgICAgICAgY2FsbGJhY2sgYW5kIGxvZ2dpbmcgY29udGV4dC4KKyAqIEBwYXJhbSB3aWxsX3RyeV9uZXh0IFdoZXRoZXIgdGhlIGNhbGxlciB3aWxsIHRyeSB0byBjb25uZWN0IHRvIGFub3RoZXIKKyAqICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciB0aGUgc2FtZSBob3N0IG5hbWUsIGFmZmVjdGluZyB0aGUgZm9ybSBvZgorICogICAgICAgICAgICAgICAgIGxvZ2dlZCBlcnJvcnMuCisgKiBAcmV0dXJuICAgICAgICAgMCBvbiBzdWNjZXNzLCBBVkVSUk9SIG9uIGZhaWx1cmUuCisgKi8KK2ludCBmZl9saXN0ZW5fY29ubmVjdChpbnQgZmQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBzb2NrbGVuX3QgYWRkcmxlbiwgaW50IHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgVVJMQ29udGV4dCAqaCwgaW50IHdpbGxfdHJ5X25leHQpOworCitpbnQgZmZfaHR0cF9tYXRjaF9ub19wcm94eShjb25zdCBjaGFyICpub19wcm94eSwgY29uc3QgY2hhciAqaG9zdG5hbWUpOworCitpbnQgZmZfc29ja2V0KGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpOworCisjZW5kaWYgLyogQVZGT1JNQVRfTkVUV09SS19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbmlzdHNwaGVyZWRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L25pc3RzcGhlcmVkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjE3ZjllCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L25pc3RzcGhlcmVkZWMuYwpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIE5JU1QgU3BoZXJlIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicGNtLmgiCisKK3N0YXRpYyBpbnQgbmlzdF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoQVZfUkw2NChwLT5idWYpID09IEFWX1JMNjQoIk5JU1RfMUFceDBhIikpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuaXN0X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBjaGFyIGJ1ZmZlclszMl0sIGNvZGluZ1szMl0gPSAicGNtIiwgZm9ybWF0WzMyXSA9ICIwMSI7CisgICAgaW50IGJwcyA9IDAsIGJlID0gMDsKKyAgICBpbnQzMl90IGhlYWRlcl9zaXplID0gLTE7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisKKyAgICBmZl9nZXRfbGluZShzLT5wYiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgZmZfZ2V0X2xpbmUocy0+cGIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIHNzY2FuZihidWZmZXIsICIlIlNDTmQzMiwgJmhlYWRlcl9zaXplKTsKKyAgICBpZiAoaGVhZGVyX3NpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihzLT5wYikpIHsKKyAgICAgICAgZmZfZ2V0X2xpbmUocy0+cGIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCisgICAgICAgIGlmIChhdmlvX3RlbGwocy0+cGIpID49IGhlYWRlcl9zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKCFtZW1jbXAoYnVmZmVyLCAiZW5kX2hlYWQiLCA4KSkgeworICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGJwcyA8PCAzOworCisgICAgICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAoY29kaW5nLCAicGNtIikpIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfZ2V0X3BjbV9jb2RlY19pZChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBiZSwgMHhGRkZGKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY29kaW5nLCAiYWxhdyIpKSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9BTEFXOworICAgICAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjb2RpbmcsICJ1bGF3IikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIWF2X3N0cmNhc2VjbXAoY29kaW5nLCAibXUtbGF3IikpIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX01VTEFXOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImNvZGluZyAlcyIsIGNvZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKworICAgICAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogc3QtPmNvZGVjLT5jaGFubmVscyAvIDg7CisKKyAgICAgICAgICAgIGlmIChhdmlvX3RlbGwocy0+cGIpID4gaGVhZGVyX3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgaGVhZGVyX3NpemUgLSBhdmlvX3RlbGwocy0+cGIpKTsKKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChidWZmZXIsICJjaGFubmVsX2NvdW50IiwgMTMpKSB7CisgICAgICAgICAgICBzc2NhbmYoYnVmZmVyLCAiJSpzICUqcyAlIlNDTmQzMiwgJnN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoYnVmZmVyLCAic2FtcGxlX2J5dGVfZm9ybWF0IiwgMTgpKSB7CisgICAgICAgICAgICBzc2NhbmYoYnVmZmVyLCAiJSpzICUqcyAlMzFzIiwgZm9ybWF0KTsKKworICAgICAgICAgICAgaWYgKCFhdl9zdHJjYXNlY21wKGZvcm1hdCwgIjAxIikpIHsKKyAgICAgICAgICAgICAgICBiZSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGZvcm1hdCwgIjEwIikpIHsKKyAgICAgICAgICAgICAgICBiZSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cmNhc2VjbXAoZm9ybWF0LCAiMSIpKSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJzYW1wbGUgYnl0ZSBmb3JtYXQgJXMiLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghbWVtY21wKGJ1ZmZlciwgInNhbXBsZV9jb2RpbmciLCAxMykpIHsKKyAgICAgICAgICAgIHNzY2FuZihidWZmZXIsICIlKnMgJSpzICUzMXMiLCBjb2RpbmcpOworICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoYnVmZmVyLCAic2FtcGxlX2NvdW50IiwgMTIpKSB7CisgICAgICAgICAgICBzc2NhbmYoYnVmZmVyLCAiJSpzICUqcyAlIlNDTmQ2NCwgJnN0LT5kdXJhdGlvbik7CisgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChidWZmZXIsICJzYW1wbGVfbl9ieXRlcyIsIDE0KSkgeworICAgICAgICAgICAgc3NjYW5mKGJ1ZmZlciwgIiUqcyAlKnMgJSJTQ05kMzIsICZicHMpOworICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoYnVmZmVyLCAic2FtcGxlX3JhdGUiLCAxMSkpIHsKKyAgICAgICAgICAgIHNzY2FuZihidWZmZXIsICIlKnMgJSpzICUiU0NOZDMyLCAmc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChidWZmZXIsICJzYW1wbGVfc2lnX2JpdHMiLCAxNSkpIHsKKyAgICAgICAgICAgIHNzY2FuZihidWZmZXIsICIlKnMgJSpzICUiU0NOZDMyLCAmc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciBrZXlbMzJdLCB2YWx1ZVszMl07CisgICAgICAgICAgICBpZiAoc3NjYW5mKGJ1ZmZlciwgIiUzMXMgJSpzICUzMXMiLCBrZXksIHZhbHVlKSA9PSAzKSB7CisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBrZXksIHZhbHVlLCBBVl9ESUNUX0FQUEVORCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcGFyc2UgJyVzJyBhcyBtZXRhZGF0YVxuIiwgYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBBVkVSUk9SX0VPRjsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9uaXN0c3BoZXJlX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm5pc3RzcGhlcmUiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJOSVNUIFNQZWVjaCBIRWFkZXIgUkVzb3VyY2VzIiksCisgICAgLnJlYWRfcHJvYmUgICAgID0gbmlzdF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBuaXN0X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZmX3BjbV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSBmZl9wY21fcmVhZF9zZWVrLAorICAgIC5leHRlbnNpb25zICAgICA9ICJuaXN0LHNwaCIsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbm9wcm94eS10ZXN0LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbm9wcm94eS10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyNDc2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ub3Byb3h5LXRlc3QuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisKK3N0YXRpYyB2b2lkIHRlc3QoY29uc3QgY2hhciAqcGF0dGVybiwgY29uc3QgY2hhciAqaG9zdCkKK3sKKyAgICBpbnQgcmVzID0gZmZfaHR0cF9tYXRjaF9ub19wcm94eShwYXR0ZXJuLCBob3N0KTsKKyAgICBwcmludGYoIlRoZSBwYXR0ZXJuIFwiJXNcIiAlcyB0aGUgaG9zdG5hbWUgJXNcbiIsCisgICAgICAgICAgIHBhdHRlcm4gPyBwYXR0ZXJuIDogIihudWxsKSIsIHJlcyA/ICJtYXRjaGVzIiA6ICJkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgIGhvc3QpOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIHRlc3QoTlVMTCwgImRvbWFpbi5jb20iKTsKKyAgICB0ZXN0KCJleGFtcGxlLmNvbSBkb21haW4uY29tIiwgImRvbWFpbi5jb20iKTsKKyAgICB0ZXN0KCJleGFtcGxlLmNvbSBvdGhlci5jb20iLCAiZG9tYWluLmNvbSIpOworICAgIHRlc3QoImV4YW1wbGUuY29tLGRvbWFpbi5jb20iLCAiZG9tYWluLmNvbSIpOworICAgIHRlc3QoImV4YW1wbGUuY29tLGRvbWFpbi5jb20iLCAib3RoZXJkb21haW4uY29tIik7CisgICAgdGVzdCgiZXhhbXBsZS5jb20sICouZG9tYWluLmNvbSIsICJzdWIuZG9tYWluLmNvbSIpOworICAgIHRlc3QoImV4YW1wbGUuY29tLCAqLmRvbWFpbi5jb20iLCAiZG9tYWluLmNvbSIpOworICAgIHRlc3QoImV4YW1wbGUuY29tLCAuZG9tYWluLmNvbSIsICJkb21haW4uY29tIik7CisgICAgdGVzdCgiKiIsICJkb21haW4uY29tIik7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbnN2ZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvbnN2ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkZmQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9uc3ZkZWMuYwpAQCAtMCwwICsxLDc2MSBAQAorLyoKKyAqIE5TViBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogZmlyc3QgdmVyc2lvbiBieSBGcmFuY29pcyBSZXZvbCA8cmV2b2xAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisvKiBtYXggYnl0ZXMgdG8gY3Jhd2wgZm9yIHRyeWluZyB0byByZXN5bmMKKyAqIHN0dXBpZCBzdHJlYW1pbmcgc2VydmVycyBkb24ndCBzdGFydCBhdCBjaHVuayBib3VuZGFyaWVzLi4uCisgKi8KKyNkZWZpbmUgTlNWX01BWF9SRVNZTkMgKDUwMCoxMDI0KQorI2RlZmluZSBOU1ZfTUFYX1JFU1lOQ19UUklFUyAzMDAKKworLyoKKyAqIFJlZmVyZW5jZXM6CisgKiAoMSkgaHR0cDovL3d3dy5tdWx0aW1lZGlhLmN4L25zdi1mb3JtYXQudHh0CisgKiBzZWVtcyBzb21lb25lIGNhbWUgdG8gdGhlIHNhbWUgY29uY2x1c2lvbnMgYXMgbWUsIGFuZCB1cGRhdGVkIGl0OgorICogKDIpIGh0dHA6Ly93d3cuc3R1ZC5rdHUubHQvfnZpdHNsYXYvbnN2L25zdi1mb3JtYXQudHh0CisgKiAgICAgaHR0cDovL3d3dy5zdHVkLmt0dS5sdC9+dml0c2xhdi9uc3YvCisgKiBvZmZpY2lhbCBkb2NzCisgKiAoMykgaHR0cDovL3VsdHJhdm94LmFvbC5jb20vTlNWRm9ybWF0LnJ0ZgorICogU2FtcGxlIGZpbGVzOgorICogKFMxKSBodHRwOi8vd3d3Lm51bGxzb2Z0LmNvbS9uc3Yvc2FtcGxlcy8KKyAqIGh0dHA6Ly93d3cubnVsbHNvZnQuY29tL25zdi9zYW1wbGVzL2Zhc3Rlci5uc3YKKyAqIGh0dHA6Ly9zdHJlYW1yaXBwZXIuc291cmNlZm9yZ2UubmV0L29wZW5iYi9yZWFkLnBocD9USUQ9NDkyJnBhZ2U9NAorICovCisKKy8qCisgKiBub3RlcyBvbiB0aGUgaGVhZGVyIChGcmFuY29pcyBSZXZvbCk6CisgKgorICogSXQgaXMgZm9sbG93ZWQgYnkgc3RyaW5ncywgdGhlbiBhIHRhYmxlLCBidXQgbm90aGluZyB0ZWxscworICogd2hlcmUgdGhlIHRhYmxlIGJlZ2lucyBhY2NvcmRpbmcgdG8gKDEpLiBBZnRlciBjaGVja2luZyBmYXN0ZXIubnN2LAorICogSSBiZWxpZXZlIE5WU2ZbMTYtMTldIGdpdmVzIHRoZSBzaXplIG9mIHRoZSBzdHJpbmdzIGRhdGEKKyAqICh0aGF0IGlzIHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdGFibGUgYWZ0ZXIgdGhlIGhlYWRlcikuCisgKiBBZnRlciBjaGVja2luZyBhbGwgc2FtcGxlcyBmcm9tIChTMSkgYWxsIGNvbmZpcm1zIHRoaXMuCisgKgorICogVGhlbiwgYWJvdXQgTlNWZlsxMi0xNV0sIGZhc3Rlci5uc2YgaGFzIDE3OTcwMC4gV2hlbiB2ZWl3aW5nIGl0IGluIFZMQywKKyAqIEkgbm90aWNlZCB0aGVyZSB3YXMgYWJvdXQgMSBOVlNzIGNodW5rL3MsIHNvIEkgcmFuCisgKiBzdHJpbmdzIGZhc3Rlci5uc3YgfCBncmVwIE5TVnMgfCB3YyAtbAorICogd2hpY2ggZ2F2ZSBtZSAxODAuIFRoYXQgbGVhZHMgbWUgdG8gdGhpbmsgdGhhdCBOU1ZmWzEyLTE1XSBtaWdodCBiZSB0aGUKKyAqIGZpbGUgbGVuZ3RoIGluIG1pbGxpc2Vjb25kcy4KKyAqIExldCdzIHRyeSB0aGF0OgorICogZm9yIGYgaW4gKi5uc3Y7IGRvIEhUSU1FPSIkKG9kIC10IHg0ICIkZiIgfCBoZWFkIC0xIHwgc2VkICdzLy4qIC8vJykiOyBlY2hvICInJGYnICQoKDB4JEhUSU1FKSlzID0gJCgoMHgkSFRJTUUvMTAwMC82MCkpOiQoKDB4JEhUSU1FLzEwMDAlNjApKSI7IGRvbmUKKyAqIGV4Y2VwdCBmb3IgbnN0cmFpbGVyICh3aGljaCBkb2Vzbid0IGhhdmUgYW4gTlNWZiBoZWFkZXIpLCBpdCByZXBwb3J0cyBjb3JyZWN0IHRpbWUuCisgKgorICogbnN2dHJhaWxlci5uc3YgKFMxKSBkb2VzIG5vdCBoYXZlIGFueSBOU1ZmIGhlYWRlciwgb25seSBOU1ZzIGNodW5rcywKKyAqIHNvIHRoZSBoZWFkZXIgc2VlbXMgdG8gbm90IGJlIG1hbmRhdG9yeS4gKGZvciBzdHJlYW1pbmcpLgorICoKKyAqIGluZGV4IHNsaWNlIGR1cmF0aW9uIGNoZWNrIChleGNlcHRzIG5zdnRyYWlsZXIubnN2KToKKyAqIGZvciBmIGluIFtebl0qLm5zdjsgZG8gRFVSPSIkKGZmbXBlZyAtaSAiJGYiIDI+L2Rldi9udWxsIHwgZ3JlcCAnTlNWZiBkdXJhdGlvbicgfCBjdXQgLWQgJyAnIC1mIDQpIjsgSUM9IiQoZmZtcGVnIC1pICIkZiIgMj4vZGV2L251bGwgfCBncmVwICdJTkRFWCBFTlRSSUVTJyB8IGN1dCAtZCAnICcgLWYgMikiOyBlY2hvICJkdXJhdGlvbiAkRFVSLCBzbGl0ZSB0aW1lICQoKCREVVIvJElDKSkiOyBkb25lCisgKi8KKworLyoKKyAqIFRPRE86CisgKiAtIGhhbmRsZSB0aW1lc3RhbXBzICEhIQorICogLSB1c2UgaW5kZXgKKyAqIC0gbWltZS10eXBlIGluIHByb2JlKCkKKyAqIC0gc2VlaworICovCisKKyNpZiAwCitzdHJ1Y3QgTlNWZl9oZWFkZXIgeworICAgIHVpbnQzMl90IGNodW5rX3RhZzsgLyogJ05TVmYnICovCisgICAgdWludDMyX3QgY2h1bmtfc2l6ZTsKKyAgICB1aW50MzJfdCBmaWxlX3NpemU7IC8qIG1heCA0R0IgPz8/IG5vIG9uZSBsZWFybnMgYW55dGhpbmcgaXQgc2VlbXMgOl4pICovCisgICAgdWludDMyX3QgZmlsZV9sZW5ndGg7IC8vdW5rbm93bjE7ICAvKiB3aGF0IGFib3V0IE1TQiBvZiBmaWxlX3NpemUgPyAqLworICAgIHVpbnQzMl90IGluZm9fc3RyaW5nc19zaXplOyAvKiBzaXplIG9mIHRoZSBpbmZvIHN0cmluZ3MgKi8gLy91bmtub3duMjsKKyAgICB1aW50MzJfdCB0YWJsZV9lbnRyaWVzOworICAgIHVpbnQzMl90IHRhYmxlX2VudHJpZXNfdXNlZDsgLyogdGhlIGxlZnQgb25lcyBzaG91bGQgYmUgLTEgKi8KK307CisKK3N0cnVjdCBOU1ZzX2hlYWRlciB7CisgICAgdWludDMyX3QgY2h1bmtfdGFnOyAvKiAnTlNWcycgKi8KKyAgICB1aW50MzJfdCB2NGNjOyAgICAgIC8qIG9yICdOT05FJyAqLworICAgIHVpbnQzMl90IGE0Y2M7ICAgICAgLyogb3IgJ05PTkUnICovCisgICAgdWludDE2X3QgdndpZHRoOyAgICAvKiBhdl9hc3NlcnQwKHZ3aWR0aCUxNj09MCkgKi8KKyAgICB1aW50MTZfdCB2aGVpZ2h0OyAgIC8qIGF2X2Fzc2VydDAodmhlaWdodCUxNj09MCkgKi8KKyAgICB1aW50OF90IGZyYW1lcmF0ZTsgIC8qIHZhbHVlID0gKGZyYW1lcmF0ZSYweDgwKT9mcnRhYmxlW2ZyYW1lcmF0ZXgweDdmXTpmcmFtZXJhdGUgKi8KKyAgICB1aW50MTZfdCB1bmtub3duOworfTsKKworc3RydWN0IG5zdl9hdmNodW5rX2hlYWRlciB7CisgICAgdWludDhfdCB2Y2h1bmtfc2l6ZV9sc2I7CisgICAgdWludDE2X3QgdmNodW5rX3NpemVfbXNiOyAvKiB2YWx1ZSA9ICh2Y2h1bmtfc2l6ZV9tc2IgPDwgNCkgfCAodmNodW5rX3NpemVfbHNiID4+IDQpICovCisgICAgdWludDE2X3QgYWNodW5rX3NpemU7Cit9OworCitzdHJ1Y3QgbnN2X3BjbV9oZWFkZXIgeworICAgIHVpbnQ4X3QgYml0c19wZXJfc2FtcGxlOworICAgIHVpbnQ4X3QgY2hhbm5lbF9jb3VudDsKKyAgICB1aW50MTZfdCBzYW1wbGVfcmF0ZTsKK307CisjZW5kaWYKKworLyogdmFyaWF0aW9uIGZyb20gYXZpLmggKi8KKy8qdHlwZWRlZiBzdHJ1Y3QgQ29kZWNUYWcgeworICAgIGludCBpZDsKKyAgICB1bnNpZ25lZCBpbnQgdGFnOworfSBDb2RlY1RhZzsqLworCisvKiB0YWdzICovCisKKyNkZWZpbmUgVF9OU1ZGIE1LVEFHKCdOJywgJ1MnLCAnVicsICdmJykgLyogZmlsZSBoZWFkZXIgKi8KKyNkZWZpbmUgVF9OU1ZTIE1LVEFHKCdOJywgJ1MnLCAnVicsICdzJykgLyogY2h1bmsgaGVhZGVyICovCisjZGVmaW5lIFRfVE9DMiBNS1RBRygnVCcsICdPJywgJ0MnLCAnMicpIC8qIGV4dHJhIGluZGV4IG1hcmtlciAqLworI2RlZmluZSBUX05PTkUgTUtUQUcoJ04nLCAnTycsICdOJywgJ0UnKSAvKiBudWxsIGEvdiA0Q0MgKi8KKyNkZWZpbmUgVF9TVUJUIE1LVEFHKCdTJywgJ1UnLCAnQicsICdUJykgLyogc3VidGl0bGUgYXV4IGRhdGEgKi8KKyNkZWZpbmUgVF9BU1lOIE1LVEFHKCdBJywgJ1MnLCAnWScsICdOJykgLyogYXN5bmMgYS92IGF1eCBtYXJrZXIgKi8KKyNkZWZpbmUgVF9LRVlGIE1LVEFHKCdLJywgJ0UnLCAnWScsICdGJykgLyogdmlkZW8ga2V5ZnJhbWUgYXV4IG1hcmtlciAoYWRkaXRpb24pICovCisKKyNkZWZpbmUgVEJfTlNWRiBNS0JFVEFHKCdOJywgJ1MnLCAnVicsICdmJykKKyNkZWZpbmUgVEJfTlNWUyBNS0JFVEFHKCdOJywgJ1MnLCAnVicsICdzJykKKworLyogaGFyZGNvZGVkIHN0cmVhbSBpbmRleGVzICovCisjZGVmaW5lIE5TVl9TVF9WSURFTyAwCisjZGVmaW5lIE5TVl9TVF9BVURJTyAxCisjZGVmaW5lIE5TVl9TVF9TVUJUIDIKKworZW51bSBOU1ZTdGF0dXMgeworICAgIE5TVl9VTlNZTkMsCisgICAgTlNWX0ZPVU5EX05TVkYsCisgICAgTlNWX0hBU19SRUFEX05TVkYsCisgICAgTlNWX0ZPVU5EX05TVlMsCisgICAgTlNWX0hBU19SRUFEX05TVlMsCisgICAgTlNWX0ZPVU5EX0JFRUYsCisgICAgTlNWX0dPVF9WSURFTywKKyAgICBOU1ZfR09UX0FVRElPLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgTlNWU3RyZWFtIHsKKyAgICBpbnQgZnJhbWVfb2Zmc2V0OyAvKiBjdXJyZW50IGZyYW1lICh2aWRlbykgb3IgYnl0ZSAoYXVkaW8pIGNvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAodXNlZCB0byBjb21wdXRlIHRoZSBwdHMpICovCisgICAgaW50IHNjYWxlOworICAgIGludCByYXRlOworICAgIGludCBzYW1wbGVfc2l6ZTsgLyogYXVkaW8gb25seSBkYXRhICovCisgICAgaW50IHN0YXJ0OworCisgICAgaW50IG5ld19mcmFtZV9vZmZzZXQ7IC8qIHRlbXBvcmFyeSBzdG9yYWdlICh1c2VkIGR1cmluZyBzZWVrKSAqLworICAgIGludCBjdW1fbGVuOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSAodXNlZCBkdXJpbmcgc2VlaykgKi8KK30gTlNWU3RyZWFtOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICBiYXNlX29mZnNldDsKKyAgICBpbnQgIE5TVmZfZW5kOworICAgIHVpbnQzMl90ICpuc3ZzX2ZpbGVfb2Zmc2V0OworICAgIGludCBpbmRleF9lbnRyaWVzOworICAgIGVudW0gTlNWU3RhdHVzIHN0YXRlOworICAgIEFWUGFja2V0IGFoZWFkWzJdOyAvKiBbdiwgYV0gaWYgLmRhdGEgaXMgIU5VTEwgdGhlcmUgaXMgc29tZXRoaW5nICovCisgICAgLyogY2FjaGVkICovCisgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICB1aW50MzJfdCB2dGFnLCBhdGFnOworICAgIHVpbnQxNl90IHZ3aWR0aCwgdmhlaWdodDsKKyAgICBpbnQxNl90IGF2c3luYzsKKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZTsKKyAgICB1aW50MzJfdCAqbnN2c190aW1lc3RhbXBzOworICAgIC8vRFZEZW11eENvbnRleHQqIGR2X2RlbXV4OworfSBOU1ZDb250ZXh0OworCitzdGF0aWMgY29uc3QgQVZDb2RlY1RhZyBuc3ZfY29kZWNfdmlkZW9fdGFnc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfVlAzLCBNS1RBRygnVicsICdQJywgJzMnLCAnICcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WUDMsIE1LVEFHKCdWJywgJ1AnLCAnMycsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQMywgTUtUQUcoJ1YnLCAnUCcsICczJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVlA1LCBNS1RBRygnVicsICdQJywgJzUnLCAnICcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WUDUsIE1LVEFHKCdWJywgJ1AnLCAnNScsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQNiwgTUtUQUcoJ1YnLCAnUCcsICc2JywgJyAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVlA2LCBNS1RBRygnVicsICdQJywgJzYnLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WUDYsIE1LVEFHKCdWJywgJ1AnLCAnNicsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQNiwgTUtUQUcoJ1YnLCAnUCcsICc2JywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVlA4LCBNS1RBRygnVicsICdQJywgJzgnLCAnMCcpIH0sCisvKgorICAgIHsgQVZfQ09ERUNfSURfVlA0LCBNS1RBRygnVicsICdQJywgJzQnLCAnICcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WUDQsIE1LVEFHKCdWJywgJ1AnLCAnNCcsICcwJykgfSwKKyovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgTUtUQUcoJ1gnLCAnVicsICdJJywgJ0QnKSB9LCAvKiBjZiBzYW1wbGUgeHZpZCBkZWNvZGVyIGZyb20gbnN2X2NvZGVjX3Nkay56aXAgKi8KKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnUicsICdHJywgJ0InLCAnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAwIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY1RhZyBuc3ZfY29kZWNfYXVkaW9fdGFnc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfTVAzLCAgICAgICBNS1RBRygnTScsICdQJywgJzMnLCAnICcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BQUMsICAgICAgIE1LVEFHKCdBJywgJ0EnLCAnQycsICcgJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FBQywgICAgICAgTUtUQUcoJ0EnLCAnQScsICdDJywgJ1AnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQUFDLCAgICAgICBNS1RBRygnVicsICdMJywgJ0InLCAnICcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TUEVFWCwgICAgIE1LVEFHKCdTJywgJ1AnLCAnWCcsICcgJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9VMTZMRSwgTUtUQUcoJ1AnLCAnQycsICdNJywgJyAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgICAwIH0sCit9OworCisvL3N0YXRpYyBpbnQgbnN2X2xvYWRfaW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzKTsKK3N0YXRpYyBpbnQgbnN2X3JlYWRfY2h1bmsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgZmlsbF9oZWFkZXIpOworCisjZGVmaW5lIHByaW50X3RhZyhzdHIsIHRhZywgc2l6ZSkgICAgICAgXAorICAgIGF2X2Rsb2coTlVMTCwgIiVzOiB0YWc9JWMlYyVjJWNcbiIsIFwKKyAgICAgICAgICAgIHN0ciwgdGFnICYgMHhmZiwgICAgICAgICAgICBcCisgICAgICAgICAgICAodGFnID4+IDgpICYgMHhmZiwgICAgICAgICAgXAorICAgICAgICAgICAgKHRhZyA+PiAxNikgJiAweGZmLCAgICAgICAgIFwKKyAgICAgICAgICAgICh0YWcgPj4gMjQpICYgMHhmZik7CisKKy8qIHRyeSB0byBmaW5kIHNvbWV0aGluZyB3ZSByZWNvZ25pemUsIGFuZCBzZXQgdGhlIHN0YXRlIGFjY29yZGluZ2x5ICovCitzdGF0aWMgaW50IG5zdl9yZXN5bmMoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE5TVkNvbnRleHQgKm5zdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1aW50MzJfdCB2ID0gMDsKKyAgICBpbnQgaTsKKworICAgIGF2X2Rsb2cocywgIiVzKCksIG9mZnNldCA9ICUiUFJJZDY0Iiwgc3RhdGUgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBhdmlvX3RlbGwocGIpLCBuc3YtPnN0YXRlKTsKKworICAgIC8vbnN2LT5zdGF0ZSA9IE5TVl9VTlNZTkM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlNWX01BWF9SRVNZTkM7IGkrKykgeworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkgeworICAgICAgICAgICAgYXZfZGxvZyhzLCAiTlNWIEVPRlxuIik7CisgICAgICAgICAgICBuc3YtPnN0YXRlID0gTlNWX1VOU1lOQzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB2IDw8PSA4OworICAgICAgICB2IHw9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAoaSA8IDgpIHsKKyAgICAgICAgICAgIGF2X2Rsb2cocywgIk5TViByZXN5bmM6IFslZF0gPSAlMDJ4XG4iLCBpLCB2ICYgMHgwRkYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh2ICYgMHgwMDAwZmZmZikgPT0gMHhlZmJlKSB7IC8qIEJFRUYgKi8KKyAgICAgICAgICAgIGF2X2Rsb2cocywgIk5TViByZXN5bmNlZCBvbiBCRUVGIGFmdGVyICVkIGJ5dGVzXG4iLCBpKzEpOworICAgICAgICAgICAgbnN2LT5zdGF0ZSA9IE5TVl9GT1VORF9CRUVGOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLyogd2UgcmVhZCBhcyBiaWctZW5kaWFuLCB0aHVzIHRoZSBNSypCRSogKi8KKyAgICAgICAgaWYgKHYgPT0gVEJfTlNWRikgeyAvKiBOU1ZmICovCisgICAgICAgICAgICBhdl9kbG9nKHMsICJOU1YgcmVzeW5jZWQgb24gTlNWZiBhZnRlciAlZCBieXRlc1xuIiwgaSsxKTsKKyAgICAgICAgICAgIG5zdi0+c3RhdGUgPSBOU1ZfRk9VTkRfTlNWRjsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICh2ID09IE1LQkVUQUcoJ04nLCAnUycsICdWJywgJ3MnKSkgeyAvKiBOU1ZzICovCisgICAgICAgICAgICBhdl9kbG9nKHMsICJOU1YgcmVzeW5jZWQgb24gTlNWcyBhZnRlciAlZCBieXRlc1xuIiwgaSsxKTsKKyAgICAgICAgICAgIG5zdi0+c3RhdGUgPSBOU1ZfRk9VTkRfTlNWUzsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICB9CisgICAgYXZfZGxvZyhzLCAiTlNWIHN5bmMgbG9zdFxuIik7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IG5zdl9wYXJzZV9OU1ZmX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTlNWQ29udGV4dCAqbnN2ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVuc2lnbmVkIGludCBhdl91bnVzZWQgZmlsZV9zaXplOworICAgIHVuc2lnbmVkIGludCBzaXplOworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgaW50IHN0cmluZ3Nfc2l6ZTsKKyAgICBpbnQgdGFibGVfZW50cmllczsKKyAgICBpbnQgdGFibGVfZW50cmllc191c2VkOworCisgICAgYXZfZGxvZyhzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICAgIG5zdi0+c3RhdGUgPSBOU1ZfVU5TWU5DOyAvKiBpbiBjYXNlIHdlIGZhaWwgKi8KKworICAgIHNpemUgPSBhdmlvX3JsMzIocGIpOworICAgIGlmIChzaXplIDwgMjgpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBuc3YtPk5TVmZfZW5kID0gc2l6ZTsKKworICAgIC8vcy0+ZmlsZV9zaXplID0gKHVpbnQzMl90KWF2aW9fcmwzMihwYik7CisgICAgZmlsZV9zaXplID0gKHVpbnQzMl90KWF2aW9fcmwzMihwYik7CisgICAgYXZfZGxvZyhzLCAiTlNWIE5TVmYgY2h1bmtfc2l6ZSAldVxuIiwgc2l6ZSk7CisgICAgYXZfZGxvZyhzLCAiTlNWIE5TVmYgZmlsZV9zaXplICV1XG4iLCBmaWxlX3NpemUpOworCisgICAgbnN2LT5kdXJhdGlvbiA9IGR1cmF0aW9uID0gYXZpb19ybDMyKHBiKTsgLyogaW4gbXMgKi8KKyAgICBhdl9kbG9nKHMsICJOU1YgTlNWZiBkdXJhdGlvbiAlIlBSSWQ2NCIgbXNcbiIsIGR1cmF0aW9uKTsKKyAgICAvLyBYWFg6IHN0b3JlIGl0IGluIEFWU3RyZWFtcworCisgICAgc3RyaW5nc19zaXplID0gYXZpb19ybDMyKHBiKTsKKyAgICB0YWJsZV9lbnRyaWVzID0gYXZpb19ybDMyKHBiKTsKKyAgICB0YWJsZV9lbnRyaWVzX3VzZWQgPSBhdmlvX3JsMzIocGIpOworICAgIGF2X2Rsb2cocywgIk5TViBOU1ZmIGluZm8tc3RyaW5ncyBzaXplOiAlZCwgdGFibGUgZW50cmllczogJWQsIGJpcyAlZFxuIiwKKyAgICAgICAgICAgIHN0cmluZ3Nfc2l6ZSwgdGFibGVfZW50cmllcywgdGFibGVfZW50cmllc191c2VkKTsKKyAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYXZfZGxvZyhzLCAiTlNWIGdvdCBoZWFkZXI7IGZpbGVwb3MgJSJQUklkNjQiXG4iLCBhdmlvX3RlbGwocGIpKTsKKworICAgIGlmIChzdHJpbmdzX3NpemUgPiAwKSB7CisgICAgICAgIGNoYXIgKnN0cmluZ3M7IC8qIGxhc3QgYnl0ZSB3aWxsIGJlICdcMCcgdG8gcGxheSBzYWZlIHdpdGggc3RyKigpICovCisgICAgICAgIGNoYXIgKnAsICplbmRwOworICAgICAgICBjaGFyICp0b2tlbiwgKnZhbHVlOworICAgICAgICBjaGFyIHF1b3RlOworCisgICAgICAgIHAgPSBzdHJpbmdzID0gYXZfbWFsbG9jeigoc2l6ZV90KXN0cmluZ3Nfc2l6ZSArIDEpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBlbmRwID0gc3RyaW5ncyArIHN0cmluZ3Nfc2l6ZTsKKyAgICAgICAgYXZpb19yZWFkKHBiLCBzdHJpbmdzLCBzdHJpbmdzX3NpemUpOworICAgICAgICB3aGlsZSAocCA8IGVuZHApIHsKKyAgICAgICAgICAgIHdoaWxlICgqcCA9PSAnICcpCisgICAgICAgICAgICAgICAgcCsrOyAvKiBzdHJpcCBvdXQgc3BhY2VzICovCisgICAgICAgICAgICBpZiAocCA+PSBlbmRwLTIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB0b2tlbiA9IHA7CisgICAgICAgICAgICBwID0gc3RyY2hyKHAsICc9Jyk7CisgICAgICAgICAgICBpZiAoIXAgfHwgcCA+PSBlbmRwLTIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqcCsrID0gJ1wwJzsKKyAgICAgICAgICAgIHF1b3RlID0gKnArKzsKKyAgICAgICAgICAgIHZhbHVlID0gcDsKKyAgICAgICAgICAgIHAgPSBzdHJjaHIocCwgcXVvdGUpOworICAgICAgICAgICAgaWYgKCFwIHx8IHAgPj0gZW5kcCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICpwKysgPSAnXDAnOworICAgICAgICAgICAgYXZfZGxvZyhzLCAiTlNWIE5TVmYgSU5GTzogJXM9JyVzJ1xuIiwgdG9rZW4sIHZhbHVlKTsKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgdG9rZW4sIHZhbHVlLCAwKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlKHN0cmluZ3MpOworICAgIH0KKyAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYXZfZGxvZyhzLCAiTlNWIGdvdCBpbmZvczsgZmlsZXBvcyAlIlBSSWQ2NCJcbiIsIGF2aW9fdGVsbChwYikpOworCisgICAgaWYgKHRhYmxlX2VudHJpZXNfdXNlZCA+IDApIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIG5zdi0+aW5kZXhfZW50cmllcyA9IHRhYmxlX2VudHJpZXNfdXNlZDsKKyAgICAgICAgaWYoKHVuc2lnbmVkKXRhYmxlX2VudHJpZXNfdXNlZCA+PSBVSU5UX01BWCAvIHNpemVvZih1aW50MzJfdCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG5zdi0+bnN2c19maWxlX29mZnNldCA9IGF2X21hbGxvYygodW5zaWduZWQpdGFibGVfZW50cmllc191c2VkICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGlmICghbnN2LT5uc3ZzX2ZpbGVfb2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBmb3IoaT0wO2k8dGFibGVfZW50cmllc191c2VkO2krKykKKyAgICAgICAgICAgIG5zdi0+bnN2c19maWxlX29mZnNldFtpXSA9IGF2aW9fcmwzMihwYikgKyBzaXplOworCisgICAgICAgIGlmKHRhYmxlX2VudHJpZXMgPiB0YWJsZV9lbnRyaWVzX3VzZWQgJiYKKyAgICAgICAgICAgYXZpb19ybDMyKHBiKSA9PSBNS1RBRygnVCcsJ08nLCdDJywnMicpKSB7CisgICAgICAgICAgICBuc3YtPm5zdnNfdGltZXN0YW1wcyA9IGF2X21hbGxvYygodW5zaWduZWQpdGFibGVfZW50cmllc191c2VkKnNpemVvZih1aW50MzJfdCkpOworICAgICAgICAgICAgaWYgKCFuc3YtPm5zdnNfdGltZXN0YW1wcykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZm9yKGk9MDtpPHRhYmxlX2VudHJpZXNfdXNlZDtpKyspIHsKKyAgICAgICAgICAgICAgICBuc3YtPm5zdnNfdGltZXN0YW1wc1tpXSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9kbG9nKHMsICJOU1YgZ290IGluZGV4OyBmaWxlcG9zICUiUFJJZDY0IlxuIiwgYXZpb190ZWxsKHBiKSk7CisKKyAgICBhdmlvX3NlZWsocGIsIG5zdi0+YmFzZV9vZmZzZXQgKyBzaXplLCBTRUVLX1NFVCk7IC8qIHJlcXVpcmVkIGZvciBkdW1iZHJpdmluZy0yNzEubnN2ICgyIGV4dHJhIGJ5dGVzKSAqLworCisgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBuc3YtPnN0YXRlID0gTlNWX0hBU19SRUFEX05TVkY7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnN2X3BhcnNlX05TVnNfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBOU1ZDb250ZXh0ICpuc3YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgdWludDMyX3QgdnRhZywgYXRhZzsKKyAgICB1aW50MTZfdCB2d2lkdGgsIHZoZWlnaHQ7CisgICAgQVZSYXRpb25hbCBmcmFtZXJhdGU7CisgICAgaW50IGk7CisgICAgQVZTdHJlYW0gKnN0OworICAgIE5TVlN0cmVhbSAqbnN0OworICAgIGF2X2Rsb2cocywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICB2dGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICBhdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICB2d2lkdGggPSBhdmlvX3JsMTYocGIpOworICAgIHZoZWlnaHQgPSBhdmlvX3JsMTYocGIpOworICAgIGkgPSBhdmlvX3I4KHBiKTsKKworICAgIGF2X2Rsb2cocywgIk5TViBOU1ZzIGZyYW1lcmF0ZSBjb2RlICUyeFxuIiwgaSk7CisgICAgaWYoaSYweDgwKSB7IC8qIG9kZCB3YXkgb2YgZ2l2aW5nIG5hdGl2ZSBmcmFtZXJhdGVzIGZyb20gZG9jcyAqLworICAgICAgICBpbnQgdD0oaSAmIDB4N0YpPj4yOworICAgICAgICBpZih0PDE2KSBmcmFtZXJhdGUgPSAoQVZSYXRpb25hbCl7MSwgdCsxfTsKKyAgICAgICAgZWxzZSAgICAgZnJhbWVyYXRlID0gKEFWUmF0aW9uYWwpe3QtMTUsIDF9OworCisgICAgICAgIGlmKGkmMSl7CisgICAgICAgICAgICBmcmFtZXJhdGUubnVtICo9IDEwMDA7CisgICAgICAgICAgICBmcmFtZXJhdGUuZGVuICo9IDEwMDE7CisgICAgICAgIH0KKworICAgICAgICBpZigoaSYzKT09MykgICAgICBmcmFtZXJhdGUubnVtICo9IDI0OworICAgICAgICBlbHNlIGlmKChpJjMpPT0yKSBmcmFtZXJhdGUubnVtICo9IDI1OworICAgICAgICBlbHNlICAgICAgICAgICAgICBmcmFtZXJhdGUubnVtICo9IDMwOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGZyYW1lcmF0ZT0gKEFWUmF0aW9uYWwpe2ksIDF9OworCisgICAgbnN2LT5hdnN5bmMgPSBhdmlvX3JsMTYocGIpOworICAgIG5zdi0+ZnJhbWVyYXRlID0gZnJhbWVyYXRlOworCisgICAgcHJpbnRfdGFnKCJOU1YgTlNWcyB2dGFnIiwgdnRhZywgMCk7CisgICAgcHJpbnRfdGFnKCJOU1YgTlNWcyBhdGFnIiwgYXRhZywgMCk7CisgICAgYXZfZGxvZyhzLCAiTlNWIE5TVnMgdnNpemUgJWR4JWRcbiIsIHZ3aWR0aCwgdmhlaWdodCk7CisKKyAgICAvKiBYWFggY2hhbmdlIHRvIGFwICE9IE5VTEwgPyAqLworICAgIGlmIChzLT5uYl9zdHJlYW1zID09IDApIHsgLyogc3RyZWFtcyBub3QgeWV0IHB1Ymxpc2hlZCwgbGV0J3MgZG8gdGhhdCAqLworICAgICAgICBuc3YtPnZ0YWcgPSB2dGFnOworICAgICAgICBuc3YtPmF0YWcgPSBhdGFnOworICAgICAgICBuc3YtPnZ3aWR0aCA9IHZ3aWR0aDsKKyAgICAgICAgbnN2LT52aGVpZ2h0ID0gdndpZHRoOworICAgICAgICBpZiAodnRhZyAhPSBUX05PTkUpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgICAgIHN0LT5pZCA9IE5TVl9TVF9WSURFTzsKKyAgICAgICAgICAgIG5zdCA9IGF2X21hbGxvY3ooc2l6ZW9mKE5TVlN0cmVhbSkpOworICAgICAgICAgICAgaWYgKCFuc3QpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgc3QtPnByaXZfZGF0YSA9IG5zdDsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gdnRhZzsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQobnN2X2NvZGVjX3ZpZGVvX3RhZ3MsIHZ0YWcpOworICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCA9IHZ3aWR0aDsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gdmhlaWdodDsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMjQ7IC8qIGRlcHRoIFhYWCAqLworCisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgZnJhbWVyYXRlLmRlbiwgZnJhbWVyYXRlLm51bSk7CisgICAgICAgICAgICBzdC0+c3RhcnRfdGltZSA9IDA7CisgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSBhdl9yZXNjYWxlKG5zdi0+ZHVyYXRpb24sIGZyYW1lcmF0ZS5udW0sIDEwMDAqZnJhbWVyYXRlLmRlbik7CisKKyAgICAgICAgICAgIGZvcihpPTA7aTxuc3YtPmluZGV4X2VudHJpZXM7aSsrKSB7CisgICAgICAgICAgICAgICAgaWYobnN2LT5uc3ZzX3RpbWVzdGFtcHMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LCBuc3YtPm5zdnNfZmlsZV9vZmZzZXRbaV0sIG5zdi0+bnN2c190aW1lc3RhbXBzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0cyA9IGF2X3Jlc2NhbGUoaSpuc3YtPmR1cmF0aW9uL25zdi0+aW5kZXhfZW50cmllcywgZnJhbWVyYXRlLm51bSwgMTAwMCpmcmFtZXJhdGUuZGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LCBuc3YtPm5zdnNfZmlsZV9vZmZzZXRbaV0sIHRzLCAwLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0YWcgIT0gVF9OT05FKSB7CisgICAgICAgICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICAgICAgc3QtPmlkID0gTlNWX1NUX0FVRElPOworICAgICAgICAgICAgbnN0ID0gYXZfbWFsbG9jeihzaXplb2YoTlNWU3RyZWFtKSk7CisgICAgICAgICAgICBpZiAoIW5zdCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBzdC0+cHJpdl9kYXRhID0gbnN0OworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBhdGFnOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChuc3ZfY29kZWNfYXVkaW9fdGFncywgYXRhZyk7CisKKyAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOyAvKiBmb3IgUENNIHdlIHdpbGwgcmVhZCBhIGNodW5rIGxhdGVyIGFuZCBwdXQgY29ycmVjdCBpbmZvICovCisKKyAgICAgICAgICAgIC8qIHNldCB0aW1lYmFzZSB0byBjb21tb24gZGVub21pbmF0b3Igb2YgbXMgYW5kIGZyYW1lcmF0ZSAqLworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGZyYW1lcmF0ZS5udW0qMTAwMCk7CisgICAgICAgICAgICBzdC0+c3RhcnRfdGltZSA9IDA7CisgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSAoaW50NjRfdCluc3YtPmR1cmF0aW9uICogZnJhbWVyYXRlLm51bTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChuc3YtPnZ0YWcgIT0gdnRhZyB8fCBuc3YtPmF0YWcgIT0gYXRhZyB8fCBuc3YtPnZ3aWR0aCAhPSB2d2lkdGggfHwgbnN2LT52aGVpZ2h0ICE9IHZ3aWR0aCkgeworICAgICAgICAgICAgYXZfZGxvZyhzLCAiTlNWIE5TVnMgaGVhZGVyIHZhbHVlcyBkaWZmZXIgZnJvbSB0aGUgZmlyc3Qgb25lISEhXG4iKTsKKyAgICAgICAgICAgIC8vcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgbnN2LT5zdGF0ZSA9IE5TVl9IQVNfUkVBRF9OU1ZTOworICAgIHJldHVybiAwOworZmFpbDoKKyAgICAvKiBYWFggKi8KKyAgICBuc3YtPnN0YXRlID0gTlNWX1VOU1lOQzsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbnN2X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBOU1ZDb250ZXh0ICpuc3YgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGksIGVycjsKKworICAgIGF2X2Rsb2cocywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgYXZfZGxvZyhzLCAiZmlsZW5hbWUgJyVzJ1xuIiwgcy0+ZmlsZW5hbWUpOworCisgICAgbnN2LT5zdGF0ZSA9IE5TVl9VTlNZTkM7CisgICAgbnN2LT5haGVhZFswXS5kYXRhID0gbnN2LT5haGVhZFsxXS5kYXRhID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOU1ZfTUFYX1JFU1lOQ19UUklFUzsgaSsrKSB7CisgICAgICAgIGlmIChuc3ZfcmVzeW5jKHMpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKG5zdi0+c3RhdGUgPT0gTlNWX0ZPVU5EX05TVkYpIHsKKyAgICAgICAgICAgIGVyciA9IG5zdl9wYXJzZV9OU1ZmX2hlYWRlcihzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHdlIG5lZWQgdGhlIGZpcnN0IE5TVnMgYWxzby4uLiAqLworICAgICAgICBpZiAobnN2LT5zdGF0ZSA9PSBOU1ZfRk9VTkRfTlNWUykgeworICAgICAgICAgICAgZXJyID0gbnN2X3BhcnNlX05TVnNfaGVhZGVyKHMpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIGJyZWFrOyAvKiB3ZSBqdXN0IHdhbnQgdGhlIGZpcnN0IG9uZSAqLworICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5uYl9zdHJlYW1zIDwgMSkgLyogbm8gbHVjayBzbyBmYXIgKi8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIG5vdyByZWFkIHRoZSBmaXJzdCBjaHVuaywgc28gd2UgY2FuIGF0dGVtcHQgdG8gZGVjb2RlIG1vcmUgaW5mbyAqLworICAgIGVyciA9IG5zdl9yZWFkX2NodW5rKHMsIDEpOworCisgICAgYXZfZGxvZyhzLCAicGFyc2VkIGhlYWRlclxuIik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBuc3ZfcmVhZF9jaHVuayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBmaWxsX2hlYWRlcikKK3sKKyAgICBOU1ZDb250ZXh0ICpuc3YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0WzJdID0ge05VTEwsIE5VTEx9OworICAgIE5TVlN0cmVhbSAqbnN0OworICAgIEFWUGFja2V0ICpwa3Q7CisgICAgaW50IGksIGVyciA9IDA7CisgICAgdWludDhfdCBhdXhjb3VudDsgLyogbnVtYmVyIG9mIGF1eCBtZXRhZGF0YSwgYWxzbyA0IGJpdHMgb2YgdnNpemUgKi8KKyAgICB1aW50MzJfdCB2c2l6ZTsKKyAgICB1aW50MTZfdCBhc2l6ZTsKKyAgICB1aW50MTZfdCBhdXhzaXplOworCisgICAgYXZfZGxvZyhzLCAiJXMoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIGZpbGxfaGVhZGVyKTsKKworICAgIGlmIChuc3YtPmFoZWFkWzBdLmRhdGEgfHwgbnN2LT5haGVhZFsxXS5kYXRhKQorICAgICAgICByZXR1cm4gMDsgLy8tMTsgLyogaGV5ISBlYXQgd2hhdCB5b3UndmUgaW4geW91ciBwbGF0ZSBmaXJzdCEgKi8KKworbnVsbF9jaHVua19yZXRyeToKKyAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IE5TVl9NQVhfUkVTWU5DX1RSSUVTICYmIG5zdi0+c3RhdGUgPCBOU1ZfRk9VTkRfTlNWUyAmJiAhZXJyOyBpKyspCisgICAgICAgIGVyciA9IG5zdl9yZXN5bmMocyk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisgICAgaWYgKG5zdi0+c3RhdGUgPT0gTlNWX0ZPVU5EX05TVlMpCisgICAgICAgIGVyciA9IG5zdl9wYXJzZV9OU1ZzX2hlYWRlcihzKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICBpZiAobnN2LT5zdGF0ZSAhPSBOU1ZfSEFTX1JFQURfTlNWUyAmJiBuc3YtPnN0YXRlICE9IE5TVl9GT1VORF9CRUVGKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBhdXhjb3VudCA9IGF2aW9fcjgocGIpOworICAgIHZzaXplID0gYXZpb19ybDE2KHBiKTsKKyAgICBhc2l6ZSA9IGF2aW9fcmwxNihwYik7CisgICAgdnNpemUgPSAodnNpemUgPDwgNCkgfCAoYXV4Y291bnQgPj4gNCk7CisgICAgYXV4Y291bnQgJj0gMHgwZjsKKyAgICBhdl9kbG9nKHMsICJOU1YgQ0hVTksgJWQgYXV4LCAldSBieXRlcyB2aWRlbywgJWQgYnl0ZXMgYXVkaW9cbiIsIGF1eGNvdW50LCB2c2l6ZSwgYXNpemUpOworICAgIC8qIHNraXAgYXV4IHN0dWZmICovCisgICAgZm9yIChpID0gMDsgaSA8IGF1eGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgYXZfdW51c2VkIGF1eHRhZzsKKyAgICAgICAgYXV4c2l6ZSA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIGF1eHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGF2X2Rsb2cocywgIk5TViBhdXggZGF0YTogJyVjJWMlYyVjJywgJWQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgIChhdXh0YWcgJiAweDBmZiksCisgICAgICAgICAgICAgICgoYXV4dGFnID4+IDgpICYgMHgwZmYpLAorICAgICAgICAgICAgICAoKGF1eHRhZyA+PiAxNikgJiAweDBmZiksCisgICAgICAgICAgICAgICgoYXV4dGFnID4+IDI0KSAmIDB4MGZmKSwKKyAgICAgICAgICAgICAgYXV4c2l6ZSk7CisgICAgICAgIGF2aW9fc2tpcChwYiwgYXV4c2l6ZSk7CisgICAgICAgIHZzaXplIC09IGF1eHNpemUgKyBzaXplb2YodWludDE2X3QpICsgc2l6ZW9mKHVpbnQzMl90KTsgLyogdGhhdCdzIGJlY29taW5nIGJyYWluZGVhZCAqLworICAgIH0KKworICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCF2c2l6ZSAmJiAhYXNpemUpIHsKKyAgICAgICAgbnN2LT5zdGF0ZSA9IE5TVl9VTlNZTkM7CisgICAgICAgIGdvdG8gbnVsbF9jaHVua19yZXRyeTsKKyAgICB9CisKKyAgICAvKiBtYXAgYmFjayBzdHJlYW1zIHRvIHYsYSAqLworICAgIGlmIChzLT5uYl9zdHJlYW1zID4gMCkKKyAgICAgICAgc3Rbcy0+c3RyZWFtc1swXS0+aWRdID0gcy0+c3RyZWFtc1swXTsKKyAgICBpZiAocy0+bmJfc3RyZWFtcyA+IDEpCisgICAgICAgIHN0W3MtPnN0cmVhbXNbMV0tPmlkXSA9IHMtPnN0cmVhbXNbMV07CisKKyAgICBpZiAodnNpemUgJiYgc3RbTlNWX1NUX1ZJREVPXSkgeworICAgICAgICBuc3QgPSBzdFtOU1ZfU1RfVklERU9dLT5wcml2X2RhdGE7CisgICAgICAgIHBrdCA9ICZuc3YtPmFoZWFkW05TVl9TVF9WSURFT107CisgICAgICAgIGF2X2dldF9wYWNrZXQocGIsIHBrdCwgdnNpemUpOworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0W05TVl9TVF9WSURFT10tPmluZGV4Oy8vTlNWX1NUX1ZJREVPOworICAgICAgICBwa3QtPmR0cyA9IG5zdC0+ZnJhbWVfb2Zmc2V0OworICAgICAgICBwa3QtPmZsYWdzIHw9IG5zdi0+c3RhdGUgPT0gTlNWX0hBU19SRUFEX05TVlMgPyBBVl9QS1RfRkxBR19LRVkgOiAwOyAvKiBrZXlmcmFtZSBvbmx5IGxpa2VseSBvbiBhIHN5bmMgZnJhbWUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGTUlOKDgsIHZzaXplKTsgaSsrKQorICAgICAgICAgICAgYXZfZGxvZyhzLCAiTlNWIHZpZGVvOiBbJWRdID0gJTAyeFxuIiwgaSwgcGt0LT5kYXRhW2ldKTsKKyAgICB9CisgICAgaWYoc3RbTlNWX1NUX1ZJREVPXSkKKyAgICAgICAgKChOU1ZTdHJlYW0qKXN0W05TVl9TVF9WSURFT10tPnByaXZfZGF0YSktPmZyYW1lX29mZnNldCsrOworCisgICAgaWYgKGFzaXplICYmIHN0W05TVl9TVF9BVURJT10pIHsKKyAgICAgICAgbnN0ID0gc3RbTlNWX1NUX0FVRElPXS0+cHJpdl9kYXRhOworICAgICAgICBwa3QgPSAmbnN2LT5haGVhZFtOU1ZfU1RfQVVESU9dOworICAgICAgICAvKiByZWFkIHJhdyBhdWRpbyBzcGVjaWZpYyBoZWFkZXIgb24gdGhlIGZpcnN0IGF1ZGlvIGNodW5rLi4uICovCisgICAgICAgIC8qIG9uIEFMTCBhdWRpbyBjaHVua3MgPz8gc2VlbXMgc28hICovCisgICAgICAgIGlmIChhc2l6ZSAmJiBzdFtOU1ZfU1RfQVVESU9dLT5jb2RlYy0+Y29kZWNfdGFnID09IE1LVEFHKCdQJywgJ0MnLCAnTScsICcgJykvKiAmJiBmaWxsX2hlYWRlciovKSB7CisgICAgICAgICAgICB1aW50OF90IGJwczsKKyAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbHM7CisgICAgICAgICAgICB1aW50MTZfdCBzYW1wbGVyYXRlOworICAgICAgICAgICAgYnBzID0gYXZpb19yOChwYik7CisgICAgICAgICAgICBjaGFubmVscyA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgc2FtcGxlcmF0ZSA9IGF2aW9fcmwxNihwYik7CisgICAgICAgICAgICBhc2l6ZS09NDsKKyAgICAgICAgICAgIGF2X2Rsb2cocywgIk5TViBSQVdBVURJTzogYnBzICVkLCBuY2hhbiAlZCwgc3JhdGUgJWRcbiIsIGJwcywgY2hhbm5lbHMsIHNhbXBsZXJhdGUpOworICAgICAgICAgICAgaWYgKGZpbGxfaGVhZGVyKSB7CisgICAgICAgICAgICAgICAgc3RbTlNWX1NUX0FVRElPXS0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfTk9ORTsgLyogd2Uga25vdyBldmVyeXRoaW5nICovCisgICAgICAgICAgICAgICAgaWYgKGJwcyAhPSAxNikgeworICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKHMsICJOU1YgQVVESU8gYml0L3NhbXBsZSAhPSAxNiAoJWQpISEhXG4iLCBicHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihjaGFubmVscykKKyAgICAgICAgICAgICAgICAgICAgYnBzIC89IGNoYW5uZWxzOyAvLyA/Pz8KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkNoYW5uZWxzIGlzIDBcbiIpOworICAgICAgICAgICAgICAgIGlmIChicHMgPT0gOCkKKyAgICAgICAgICAgICAgICAgICAgc3RbTlNWX1NUX0FVRElPXS0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUgLz0gNDsvKiBVR0ggPz8/IFhYWCAqLworICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICBzdFtOU1ZfU1RfQVVESU9dLT5jb2RlYy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICAgICAgICAgICAgICBzdFtOU1ZfU1RfQVVESU9dLT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzYW1wbGVyYXRlOworICAgICAgICAgICAgICAgIGF2X2Rsb2cocywgIk5TViBSQVdBVURJTzogYnBzICVkLCBuY2hhbiAlZCwgc3JhdGUgJWRcbiIsIGJwcywgY2hhbm5lbHMsIHNhbXBsZXJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2X2dldF9wYWNrZXQocGIsIHBrdCwgYXNpemUpOworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0W05TVl9TVF9BVURJT10tPmluZGV4Oy8vTlNWX1NUX0FVRElPOworICAgICAgICBwa3QtPmZsYWdzIHw9IG5zdi0+c3RhdGUgPT0gTlNWX0hBU19SRUFEX05TVlMgPyBBVl9QS1RfRkxBR19LRVkgOiAwOyAvKiBrZXlmcmFtZSBvbmx5IGxpa2VseSBvbiBhIHN5bmMgZnJhbWUgKi8KKyAgICAgICAgaWYoIG5zdi0+c3RhdGUgPT0gTlNWX0hBU19SRUFEX05TVlMgJiYgc3RbTlNWX1NUX1ZJREVPXSApIHsKKyAgICAgICAgICAgIC8qIG9uIGEgbnN2cyBmcmFtZSB3ZSBoYXZlIG5ldyBpbmZvcm1hdGlvbiBvbiBhL3Ygc3luYyAqLworICAgICAgICAgICAgcGt0LT5kdHMgPSAoKChOU1ZTdHJlYW0qKXN0W05TVl9TVF9WSURFT10tPnByaXZfZGF0YSktPmZyYW1lX29mZnNldC0xKTsKKyAgICAgICAgICAgIHBrdC0+ZHRzICo9IChpbnQ2NF90KTEwMDAgICAgICAgICogbnN2LT5mcmFtZXJhdGUuZGVuOworICAgICAgICAgICAgcGt0LT5kdHMgKz0gKGludDY0X3QpbnN2LT5hdnN5bmMgKiBuc3YtPmZyYW1lcmF0ZS5udW07CisgICAgICAgICAgICBhdl9kbG9nKHMsICJOU1YgQVVESU86IHN5bmM6JWQsIGR0czolIlBSSWQ2NCwgbnN2LT5hdnN5bmMsIHBrdC0+ZHRzKTsKKyAgICAgICAgfQorICAgICAgICBuc3QtPmZyYW1lX29mZnNldCsrOworICAgIH0KKworICAgIG5zdi0+c3RhdGUgPSBOU1ZfVU5TWU5DOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbnN2X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBOU1ZDb250ZXh0ICpuc3YgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGksIGVyciA9IDA7CisKKyAgICBhdl9kbG9nKHMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgICAgLyogaW4gY2FzZSB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgc29tZXRoaW5nIHRvIGVhdCAuLi4gKi8KKyAgICBpZiAoIW5zdi0+YWhlYWRbMF0uZGF0YSAmJiAhbnN2LT5haGVhZFsxXS5kYXRhKQorICAgICAgICBlcnIgPSBuc3ZfcmVhZF9jaHVuayhzLCAwKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIC8qIG5vdyBwaWNrIG9uZSBvZiB0aGUgcGxhdGVzICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpZiAobnN2LT5haGVhZFtpXS5kYXRhKSB7CisgICAgICAgICAgICBhdl9kbG9nKHMsICIlczogdXNpbmcgY2FjaGVkIHBhY2tldFslZF1cbiIsIF9fRlVOQ1RJT05fXywgaSk7CisgICAgICAgICAgICAvKiBhdm9pZCB0aGUgY29zdCBvZiBuZXdfcGFja2V0ICsgbWVtY3B5KC0+ZGF0YSkgKi8KKyAgICAgICAgICAgIG1lbWNweShwa3QsICZuc3YtPmFoZWFkW2ldLCBzaXplb2YoQVZQYWNrZXQpKTsKKyAgICAgICAgICAgIG5zdi0+YWhlYWRbaV0uZGF0YSA9IE5VTEw7IC8qIHdlIGF0ZSB0aGF0IG9uZSAqLworICAgICAgICAgICAgcmV0dXJuIHBrdC0+c2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHRoaXMgcmVzdGF1cmFudCBpcyBub3QgYXBwcm92aXNpb25uZWQgOl5dICovCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IG5zdl9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQoreworICAgIE5TVkNvbnRleHQgKm5zdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgTlNWU3RyZWFtICpuc3QgPSBzdC0+cHJpdl9kYXRhOworICAgIGludCBpbmRleDsKKworICAgIGluZGV4ID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdCwgdGltZXN0YW1wLCBmbGFncyk7CisgICAgaWYoaW5kZXggPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoYXZpb19zZWVrKHMtPnBiLCBzdC0+aW5kZXhfZW50cmllc1tpbmRleF0ucG9zLCBTRUVLX1NFVCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBuc3QtPmZyYW1lX29mZnNldCA9IHN0LT5pbmRleF9lbnRyaWVzW2luZGV4XS50aW1lc3RhbXA7CisgICAgbnN2LT5zdGF0ZSA9IE5TVl9VTlNZTkM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnN2X3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE5TVkNvbnRleHQgKm5zdiA9IHMtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZuc3YtPm5zdnNfZmlsZV9vZmZzZXQpOworICAgIGF2X2ZyZWVwKCZuc3YtPm5zdnNfdGltZXN0YW1wcyk7CisgICAgaWYgKG5zdi0+YWhlYWRbMF0uZGF0YSkKKyAgICAgICAgYXZfZnJlZV9wYWNrZXQoJm5zdi0+YWhlYWRbMF0pOworICAgIGlmIChuc3YtPmFoZWFkWzFdLmRhdGEpCisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZuc3YtPmFoZWFkWzFdKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuc3ZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IGksIHNjb3JlID0gMDsKKworICAgIGF2X2Rsb2coTlVMTCwgIm5zdl9wcm9iZSgpLCBidWZfc2l6ZSAlZFxuIiwgcC0+YnVmX3NpemUpOworICAgIC8qIGNoZWNrIGZpbGUgaGVhZGVyICovCisgICAgLyogc3RyZWFtZWQgZmlsZXMgbWlnaHQgbm90IGhhdmUgYW55IGhlYWRlciAqLworICAgIGlmIChwLT5idWZbMF0gPT0gJ04nICYmIHAtPmJ1ZlsxXSA9PSAnUycgJiYKKyAgICAgICAgcC0+YnVmWzJdID09ICdWJyAmJiAocC0+YnVmWzNdID09ICdmJyB8fCBwLT5idWZbM10gPT0gJ3MnKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIC8qIFhYWDogZG8gc3RyZWFtZWQgZmlsZXMgYWx3YXlzIHN0YXJ0IGF0IGNodW5rIGJvdW5kYXJ5ID8/ICovCisgICAgLyogb3IgZG8gd2UgbmVlZCB0byBzZWFyY2ggTlNWcyBpbiB0aGUgYnl0ZSBzdHJlYW0gPyAqLworICAgIC8qIHNlZW1zIHRoZSBzZXJ2ZXJzIGRvbid0IGJvdGhlciBzdGFydGluZyBjbGVhbiBjaHVua3MuLi4gKi8KKyAgICAvKiBzb21ldGltZXMgZXZlbiB0aGUgZmlyc3QgaGVhZGVyIGlzIGF0IDlLQiBvciBzb21ldGhpbmcgOl4pICovCisgICAgZm9yIChpID0gMTsgaSA8IHAtPmJ1Zl9zaXplIC0gMzsgaSsrKSB7CisgICAgICAgIGlmIChBVl9STDMyKHAtPmJ1ZiArIGkpID09IEFWX1JMMzIoIk5TVnMiKSkgeworICAgICAgICAgICAgLyogR2V0IHRoZSBjaHVuayBzaXplIGFuZCBjaGVjayBpZiBhdCB0aGUgZW5kIHdlIGFyZSBnZXR0aW5nIDB4QkVFRiAqLworICAgICAgICAgICAgaW50IHZzaXplID0gQVZfUkwyNChwLT5idWYraSsxOSkgPj4gNDsKKyAgICAgICAgICAgIGludCBhc2l6ZSA9IEFWX1JMMTYocC0+YnVmK2krMjIpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IGkgKyAyMyArIGFzaXplICsgdnNpemUgKyAxOworICAgICAgICAgICAgaWYgKG9mZnNldCA8PSBwLT5idWZfc2l6ZSAtIDIgJiYgQVZfUkwxNihwLT5idWYgKyBvZmZzZXQpID09IDB4QkVFRikKKyAgICAgICAgICAgICAgICByZXR1cm4gNCpBVlBST0JFX1NDT1JFX01BWC81OworICAgICAgICAgICAgc2NvcmUgPSBBVlBST0JFX1NDT1JFX01BWC81OworICAgICAgICB9CisgICAgfQorICAgIC8qIHNvIHdlJ2xsIGhhdmUgbW9yZSBsdWNrIG9uIGV4dGVuc2lvbi4uLiAqLworICAgIGlmIChhdl9tYXRjaF9leHQocC0+ZmlsZW5hbWUsICJuc3YiKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworICAgIC8qIEZJWE1FOiBhZGQgbWltZS10eXBlIGNoZWNrICovCisgICAgcmV0dXJuIHNjb3JlOworfQorCitBVklucHV0Rm9ybWF0IGZmX25zdl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJuc3YiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJOdWxsc29mdCBTdHJlYW1pbmcgVmlkZW8iKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTlNWQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gbnN2X3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IG5zdl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBuc3ZfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gbnN2X3JlYWRfY2xvc2UsCisgICAgLnJlYWRfc2VlayAgICAgID0gbnN2X3JlYWRfc2VlaywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvbnVsbGVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L251bGxlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzA4YzM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L251bGxlbmMuYwpAQCAtMCwwICsxLDM2IEBACisvKgorICogUkFXIG51bGwgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisKK3N0YXRpYyBpbnQgbnVsbF93cml0ZV9wYWNrZXQoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfbnVsbF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAibnVsbCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBudWxsIHZpZGVvIiksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfTkUoQVZfQ09ERUNfSURfUENNX1MxNkJFLCBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IG51bGxfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX1ZBUklBQkxFX0ZQUyB8IEFWRk1UX05PRklMRSB8IEFWRk1UX05PVElNRVNUQU1QUyB8IEFWRk1UX1JBV1BJQ1RVUkUsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L251dC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L251dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTAzMDEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbnV0LmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBudXQKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA3IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90cmVlLmgiCisjaW5jbHVkZSAibnV0LmgiCisjaW5jbHVkZSAicmlmZi5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2NvbnN0IEFWQ29kZWNUYWcgZmZfbnV0X3N1YnRpdGxlX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX1RFWFQsICAgICAgICAgICAgIE1LVEFHKCdVJywgJ1QnLCAnRicsICc4JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1NTQSwgICAgICAgICAgICAgIE1LVEFHKCdTJywgJ1MnLCAnQScsICAwICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX0RWRF9TVUJUSVRMRSwgICAgIE1LVEFHKCdEJywgJ1YnLCAnRCcsICdTJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0RWQl9TVUJUSVRMRSwgICAgIE1LVEFHKCdEJywgJ1YnLCAnQicsICdTJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0RWQl9URUxFVEVYVCwgICAgIE1LVEFHKCdEJywgJ1YnLCAnQicsICdUJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX05PTkUsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgfQorfTsKKworY29uc3QgQVZDb2RlY1RhZyBmZl9udXRfZGF0YV90YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9URVhULCAgICAgICAgICAgICBNS1RBRygnVScsICdUJywgJ0YnLCAnOCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAgICAgICAgICAgICAwIH0KK307CisKK2NvbnN0IEFWQ29kZWNUYWcgZmZfbnV0X3ZpZGVvX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX1hGQUNFLCAgICAgICAgICAgIE1LVEFHKCdYJywgJ0YnLCAnQScsICdDJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQOSwgICAgICAgICAgICAgIE1LVEFHKCdWJywgJ1AnLCAnOScsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdSJywgJ0cnLCAnQicsIDE1ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJ0cnLCAnUicsIDE1ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdSJywgJ0cnLCAnQicsIDE2ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJ0cnLCAnUicsIDE2ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE1ICwgJ0InLCAnRycsICdSJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE1ICwgJ1InLCAnRycsICdCJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2ICwgJ0InLCAnRycsICdSJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2ICwgJ1InLCAnRycsICdCJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdSJywgJ0cnLCAnQicsIDEyICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJ0cnLCAnUicsIDEyICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDEyICwgJ0InLCAnRycsICdSJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDEyICwgJ1InLCAnRycsICdCJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdSJywgJ0cnLCAnQicsICdBJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdSJywgJ0cnLCAnQicsICAwICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJ0cnLCAnUicsICdBJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJ0cnLCAnUicsICAwICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdBJywgJ0InLCAnRycsICdSJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCAwICwgJ0InLCAnRycsICdSJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdBJywgJ1InLCAnRycsICdCJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCAwICwgJ1InLCAnRycsICdCJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdSJywgJ0cnLCAnQicsIDI0ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJ0cnLCAnUicsIDI0ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCc0JywgJzEnLCAnMScsICdQJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCc0JywgJzInLCAnMicsICdQJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCc0JywgJzInLCAnMicsICdQJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCc0JywgJzQnLCAnMCcsICdQJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCc0JywgJzQnLCAnMCcsICdQJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCc0JywgJzQnLCAnNCcsICdQJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCc0JywgJzQnLCAnNCcsICdQJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJzEnLCAnVycsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJzAnLCAnVycsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJ0cnLCAnUicsICA4ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdSJywgJ0cnLCAnQicsICA4ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJ0cnLCAnUicsICA0ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdSJywgJ0cnLCAnQicsICA0ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJzQnLCAnQicsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdSJywgJzQnLCAnQicsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJ0cnLCAnUicsIDQ4ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdSJywgJ0cnLCAnQicsIDQ4ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDQ4ICwgJ0InLCAnRycsICdSJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDQ4ICwgJ1InLCAnRycsICdCJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdSJywgJ0InLCAnQScsIDY0ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdCJywgJ1InLCAnQScsIDY0ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDY0ICwgJ1InLCAnQicsICdBJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDY0ICwgJ0InLCAnUicsICdBJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAxMSAsIDEwICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDEwICwgMTEgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAxMCAsIDEwICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDEwICwgMTAgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAgMCAsIDEwICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDEwICwgIDAgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAxMSAsIDEyICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDEyICwgMTEgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAxMCAsIDEyICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDEyICwgMTAgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAgMCAsIDEyICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDEyICwgIDAgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAxMSAsIDE0ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE0ICwgMTEgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAxMCAsIDE0ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE0ICwgMTAgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAgMCAsIDE0ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE0ICwgIDAgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzEnLCAgMCAsIDE2ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2ICwgIDAgLCAnMScsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAxMSAsIDE2ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2ICwgMTEgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAxMCAsIDE2ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2ICwgMTAgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzMnLCAgMCAsIDE2ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2ICwgIDAgLCAnMycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzQnLCAxMSAsICA4ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzQnLCAxMCAsICA4ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzQnLCAgMCAsICA4ICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzInLCAgMCAsICA4ICkgfSwKKworICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoJ1knLCAnMScsICAgMCwgICA5KSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoOSwgICAgIDAsICcxJywgJ1knKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoJ1knLCAnNCcsICAxMSwgICA5KSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoOSwgICAgMTEsICc0JywgJ1knKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoJ1knLCAnNCcsICAxMCwgICA5KSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoOSwgICAgMTAsICc0JywgJ1knKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoJ1knLCAnNCcsICAgMCwgICA5KSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoOSwgICAgIDAsICc0JywgJ1knKSB9LAorCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnWScsICcxJywgICAwLCAgMTApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxMCwgICAgMCwgJzEnLCAnWScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnWScsICc0JywgIDExLCAgMTApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxMCwgICAxMSwgJzQnLCAnWScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnWScsICc0JywgIDEwLCAgMTApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxMCwgICAxMCwgJzQnLCAnWScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnWScsICc0JywgICAwLCAgMTApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxMCwgICAgMCwgJzQnLCAnWScpIH0sCisKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzEnLCAgIDAsICAxNikgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2LCAgICAwLCAnMScsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzQnLCAgMTEsICAxNikgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2LCAgIDExLCAnNCcsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzQnLCAgMTAsICAxNikgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2LCAgIDEwLCAnNCcsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzQnLCAgIDAsICAxNikgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2LCAgICAwLCAnNCcsICdZJykgfSwKKworICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoJ0cnLCAnMycsICAgMCwgICA4KSB9LAorCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnRycsICczJywgICAwLCAgIDkpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRyggOSwgICAgMCwgJzMnLCAnRycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnRycsICczJywgICAwLCAgMTApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxMCwgICAgMCwgJzMnLCAnRycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnRycsICczJywgICAwLCAgMTIpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxMiwgICAgMCwgJzMnLCAnRycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnRycsICczJywgICAwLCAgMTQpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxNCwgICAgMCwgJzMnLCAnRycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnRycsICczJywgICAwLCAgMTYpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxNiwgICAgMCwgJzMnLCAnRycpIH0sCisKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdYJywgJ1knLCAnWicgLCAzNiApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygzNiAsICdaJyAsICdZJywgJ1gnKSB9LAorCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMHhCQSwgJ0InLCAnRycsIDggICApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMHhCQSwgJ0InLCAnRycsIDE2ICApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMTYgICwgJ0cnLCAnQicsIDB4QkEpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMHhCQSwgJ1InLCAnRycsIDggICApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMHhCQSwgJ1InLCAnRycsIDE2ICApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMTYgICwgJ0cnLCAnUicsIDB4QkEpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMHhCQSwgJ0cnLCAnQicsIDggICApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMHhCQSwgJ0cnLCAnQicsIDE2ICApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMTYsICAgJ0InLCAnRycsIDB4QkEpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMHhCQSwgJ0cnLCAnUicsIDggICApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMHhCQSwgJ0cnLCAnUicsIDE2ICApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoMTYsICAgJ1InLCAnRycsIDB4QkEpIH0sCisKKyAgICB7IEFWX0NPREVDX0lEX05PTkUsICAgICAgICAgICAgIDAgfQorfTsKKworY29uc3QgQVZDb2RlY1RhZyBmZl9udXRfYXVkaW9fZXh0cmFfdGFnc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfQ09NRk9SVF9OT0lTRSwgICAgTUtUQUcoJzMnLCAnMycsICc4JywgJzknKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX0FMQVcsICAgICAgICAgTUtUQUcoJ0EnLCAnTCcsICdBJywgJ1cnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX01VTEFXLCAgICAgICAgTUtUQUcoJ1UnLCAnTCcsICdBJywgJ1cnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVAzLCAgICAgICAgICAgICAgTUtUQUcoJ00nLCAnUCcsICczJywgJyAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICB9Cit9OworCitjb25zdCBBVkNvZGVjVGFnIGZmX251dF9hdWRpb190YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjMyQkUsICAgICAgICBNS1RBRygzMiAsICdEJywgJ0YnLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjMyTEUsICAgICAgICBNS1RBRygnUCcsICdGJywgJ0QnLCAzMiApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjY0QkUsICAgICAgICBNS1RBRyg2NCAsICdEJywgJ0YnLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjY0TEUsICAgICAgICBNS1RBRygnUCcsICdGJywgJ0QnLCA2NCApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2QkUsICAgICAgICBNS1RBRygxNiAsICdEJywgJ1MnLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsICAgICAgICBNS1RBRygnUCcsICdTJywgJ0QnLCAxNiApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzI0QkUsICAgICAgICBNS1RBRygyNCAsICdEJywgJ1MnLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzI0TEUsICAgICAgICBNS1RBRygnUCcsICdTJywgJ0QnLCAyNCApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzMyQkUsICAgICAgICBNS1RBRygzMiAsICdEJywgJ1MnLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzMyTEUsICAgICAgICBNS1RBRygnUCcsICdTJywgJ0QnLCAzMiApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzgsICAgICAgICAgICBNS1RBRygnUCcsICdTJywgJ0QnLCAgOCApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fVTE2QkUsICAgICAgICBNS1RBRygxNiAsICdEJywgJ1UnLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fVTE2TEUsICAgICAgICBNS1RBRygnUCcsICdVJywgJ0QnLCAxNiApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fVTI0QkUsICAgICAgICBNS1RBRygyNCAsICdEJywgJ1UnLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fVTI0TEUsICAgICAgICBNS1RBRygnUCcsICdVJywgJ0QnLCAyNCApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fVTMyQkUsICAgICAgICBNS1RBRygzMiAsICdEJywgJ1UnLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fVTMyTEUsICAgICAgICBNS1RBRygnUCcsICdVJywgJ0QnLCAzMiApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fVTgsICAgICAgICAgICBNS1RBRygnUCcsICdVJywgJ0QnLCAgOCApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzhfUExBTkFSLCAgICBNS1RBRygnUCcsICdTJywgJ1AnLCAgOCApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2QkVfUExBTkFSLCBNS1RBRygxNiAsICdQJywgJ1MnLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2TEVfUExBTkFSLCBNS1RBRygnUCcsICdTJywgJ1AnLCAxNiApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzI0TEVfUExBTkFSLCBNS1RBRygnUCcsICdTJywgJ1AnLCAyNCApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzMyTEVfUExBTkFSLCBNS1RBRygnUCcsICdTJywgJ1AnLCAzMiApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgIH0KK307CisKK2NvbnN0IEFWQ29kZWNUYWcgKiBjb25zdCBmZl9udXRfY29kZWNfdGFnc1tdID0geworICAgIGZmX251dF92aWRlb190YWdzLCBmZl9udXRfYXVkaW9fdGFncywgZmZfbnV0X3N1YnRpdGxlX3RhZ3MsCisgICAgZmZfY29kZWNfYm1wX3RhZ3MsIGZmX2NvZGVjX3dhdl90YWdzLCBmZl9udXRfYXVkaW9fZXh0cmFfdGFncywgZmZfbnV0X2RhdGFfdGFncywgMAorfTsKKwordm9pZCBmZl9udXRfcmVzZXRfdHMoTlVUQ29udGV4dCAqbnV0LCBBVlJhdGlvbmFsIHRpbWVfYmFzZSwgaW50NjRfdCB2YWwpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG51dC0+YXZmLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIG51dC0+c3RyZWFtW2ldLmxhc3RfcHRzID0KKyAgICAgICAgICAgIGF2X3Jlc2NhbGVfcm5kKHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfYmFzZS5udW0gKiAoaW50NjRfdCludXQtPnN0cmVhbVtpXS50aW1lX2Jhc2UtPmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfYmFzZS5kZW4gKiAoaW50NjRfdCludXQtPnN0cmVhbVtpXS50aW1lX2Jhc2UtPm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1JPVU5EX0RPV04pOworfQorCitpbnQ2NF90IGZmX2xzYjJmdWxsKFN0cmVhbUNvbnRleHQgKnN0cmVhbSwgaW50NjRfdCBsc2IpCit7CisgICAgaW50NjRfdCBtYXNrICA9ICgxVUxMIDw8IHN0cmVhbS0+bXNiX3B0c19zaGlmdCkgLSAxOworICAgIGludDY0X3QgZGVsdGEgPSBzdHJlYW0tPmxhc3RfcHRzIC0gbWFzayAvIDI7CisgICAgcmV0dXJuICgobHNiIC0gZGVsdGEpICYgbWFzaykgKyBkZWx0YTsKK30KKworaW50IGZmX251dF9zcF9wb3NfY21wKGNvbnN0IFN5bmNwb2ludCAqYSwgY29uc3QgU3luY3BvaW50ICpiKQoreworICAgIHJldHVybiAoKGEtPnBvcyAtIGItPnBvcykgPj4gMzIpIC0gKChiLT5wb3MgLSBhLT5wb3MpID4+IDMyKTsKK30KKworaW50IGZmX251dF9zcF9wdHNfY21wKGNvbnN0IFN5bmNwb2ludCAqYSwgY29uc3QgU3luY3BvaW50ICpiKQoreworICAgIHJldHVybiAoKGEtPnRzIC0gYi0+dHMpID4+IDMyKSAtICgoYi0+dHMgLSBhLT50cykgPj4gMzIpOworfQorCitpbnQgZmZfbnV0X2FkZF9zcChOVVRDb250ZXh0ICpudXQsIGludDY0X3QgcG9zLCBpbnQ2NF90IGJhY2tfcHRyLCBpbnQ2NF90IHRzKQoreworICAgIFN5bmNwb2ludCAqc3AgICAgICAgICAgID0gYXZfbWFsbG9jeihzaXplb2YoU3luY3BvaW50KSk7CisgICAgc3RydWN0IEFWVHJlZU5vZGUgKm5vZGUgPSBhdl90cmVlX25vZGVfYWxsb2MoKTsKKworICAgIGlmICghc3AgfHwgIW5vZGUpIHsKKyAgICAgICAgYXZfZnJlZXAoJnNwKTsKKyAgICAgICAgYXZfZnJlZXAoJm5vZGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIG51dC0+c3BfY291bnQrKzsKKworICAgIHNwLT5wb3MgICAgICA9IHBvczsKKyAgICBzcC0+YmFja19wdHIgPSBiYWNrX3B0cjsKKyAgICBzcC0+dHMgICAgICAgPSB0czsKKyAgICBhdl90cmVlX2luc2VydCgmbnV0LT5zeW5jcG9pbnRzLCBzcCwgKHZvaWQgKikgZmZfbnV0X3NwX3Bvc19jbXAsICZub2RlKTsKKyAgICBpZiAobm9kZSkgeworICAgICAgICBhdl9mcmVlKHNwKTsKKyAgICAgICAgYXZfZnJlZShub2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbnVfZnJlZSh2b2lkICpvcGFxdWUsIHZvaWQgKmVsZW0pCit7CisgICAgYXZfZnJlZShlbGVtKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl9udXRfZnJlZV9zcChOVVRDb250ZXh0ICpudXQpCit7CisgICAgYXZfdHJlZV9lbnVtZXJhdGUobnV0LT5zeW5jcG9pbnRzLCBOVUxMLCBOVUxMLCBlbnVfZnJlZSk7CisgICAgYXZfdHJlZV9kZXN0cm95KG51dC0+c3luY3BvaW50cyk7Cit9CisKK2NvbnN0IERpc3Bvc2l0aW9ucyBmZl9udXRfZGlzcG9zaXRpb25zW10gPSB7CisgICAgeyAiZGVmYXVsdCIsICAgICAgICBBVl9ESVNQT1NJVElPTl9ERUZBVUxUICB9LAorICAgIHsgImR1YiIsICAgICAgICAgICAgQVZfRElTUE9TSVRJT05fRFVCICAgICAgfSwKKyAgICB7ICJvcmlnaW5hbCIsICAgICAgIEFWX0RJU1BPU0lUSU9OX09SSUdJTkFMIH0sCisgICAgeyAiY29tbWVudCIsICAgICAgICBBVl9ESVNQT1NJVElPTl9DT01NRU5UICB9LAorICAgIHsgImx5cmljcyIsICAgICAgICAgQVZfRElTUE9TSVRJT05fTFlSSUNTICAgfSwKKyAgICB7ICJrYXJhb2tlIiwgICAgICAgIEFWX0RJU1BPU0lUSU9OX0tBUkFPS0UgIH0sCisgICAgeyAiIiwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICB9Cit9OworCitjb25zdCBBVk1ldGFkYXRhQ29udiBmZl9udXRfbWV0YWRhdGFfY29udltdID0geworICAgIHsgIkF1dGhvciIsICAgICAgICAgImFydGlzdCIgICAgICB9LAorICAgIHsgIlgtQ3JlYXRpb25UaW1lIiwgImRhdGUiICAgICAgICB9LAorICAgIHsgIkNyZWF0aW9uVGltZSIsICAgImRhdGUiICAgICAgICB9LAorICAgIHsgIlNvdXJjZUZpbGVuYW1lIiwgImZpbGVuYW1lIiAgICB9LAorICAgIHsgIlgtTGFuZ3VhZ2UiLCAgICAgImxhbmd1YWdlIiAgICB9LAorICAgIHsgIlgtRGlzcG9zaXRpb24iLCAgImRpc3Bvc2l0aW9uIiB9LAorICAgIHsgIlgtUmVwbGFjZXMiLCAgICAgInJlcGxhY2VzIiAgICB9LAorICAgIHsgIlgtRGVwZW5kcyIsICAgICAgImRlcGVuZHMiICAgICB9LAorICAgIHsgIlgtVXNlcyIsICAgICAgICAgInVzZXMiICAgICAgICB9LAorICAgIHsgIlgtVXNlc0ZvbnQiLCAgICAgInVzZXNmb250IiAgICB9LAorICAgIHsgMCB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9udXQuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9udXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDMwODFjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L251dC5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogIk5VVCIgQ29udGFpbmVyIEZvcm1hdCAoZGUpbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfTlVUX0gKKyNkZWZpbmUgQVZGT1JNQVRfTlVUX0gKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorCisjZGVmaW5lICAgICAgTUFJTl9TVEFSVENPREUgKDB4N0E1NjFGNUYwNEFEVUxMICsgKCgodWludDY0X3QpKCdOJzw8OCkgKyAnTScpPDw0OCkpCisjZGVmaW5lICAgIFNUUkVBTV9TVEFSVENPREUgKDB4MTE0MDVCRjJGOURCVUxMICsgKCgodWludDY0X3QpKCdOJzw8OCkgKyAnUycpPDw0OCkpCisjZGVmaW5lIFNZTkNQT0lOVF9TVEFSVENPREUgKDB4RTRBREVFQ0E0NTY5VUxMICsgKCgodWludDY0X3QpKCdOJzw8OCkgKyAnSycpPDw0OCkpCisjZGVmaW5lICAgICBJTkRFWF9TVEFSVENPREUgKDB4REQ2NzJGMjNFNjRFVUxMICsgKCgodWludDY0X3QpKCdOJzw8OCkgKyAnWCcpPDw0OCkpCisjZGVmaW5lICAgICAgSU5GT19TVEFSVENPREUgKDB4QUI2OEI1OTZCQTc4VUxMICsgKCgodWludDY0X3QpKCdOJzw8OCkgKyAnSScpPDw0OCkpCisKKyNkZWZpbmUgSURfU1RSSU5HICJudXQvbXVsdGltZWRpYSBjb250YWluZXJcMCIKKworI2RlZmluZSBNQVhfRElTVEFOQ0UgKDEwMjQqMzItMSkKKworI2RlZmluZSBOVVRfTUFYX1ZFUlNJT04gNAorI2RlZmluZSBOVVRfU1RBQkxFX1ZFUlNJT04gMworI2RlZmluZSBOVVRfTUlOX1ZFUlNJT04gMgorCit0eXBlZGVmIGVudW17CisgICAgRkxBR19LRVkgICAgICAgID0gICAxLCAvLy88aWYgc2V0LCBmcmFtZSBpcyBrZXlmcmFtZQorICAgIEZMQUdfRU9SICAgICAgICA9ICAgMiwgLy8vPGlmIHNldCwgc3RyZWFtIGhhcyBubyByZWxldmFuY2Ugb24gcHJlc2VudGF0aW9uLiAoRU9SKQorICAgIEZMQUdfQ09ERURfUFRTICA9ICAgOCwgLy8vPGlmIHNldCwgY29kZWRfcHRzIGlzIGluIHRoZSBmcmFtZSBoZWFkZXIKKyAgICBGTEFHX1NUUkVBTV9JRCAgPSAgMTYsIC8vLzxpZiBzZXQsIHN0cmVhbV9pZCBpcyBjb2RlZCBpbiB0aGUgZnJhbWUgaGVhZGVyCisgICAgRkxBR19TSVpFX01TQiAgID0gIDMyLCAvLy88aWYgc2V0LCBkYXRhX3NpemVfbXNiIGlzIGF0IGZyYW1lIGhlYWRlciwgb3RoZXJ3aXNlIGRhdGFfc2l6ZV9tc2IgaXMgMAorICAgIEZMQUdfQ0hFQ0tTVU0gICA9ICA2NCwgLy8vPGlmIHNldCwgdGhlIGZyYW1lIGhlYWRlciBjb250YWlucyBhIGNoZWNrc3VtCisgICAgRkxBR19SRVNFUlZFRCAgID0gMTI4LCAvLy88aWYgc2V0LCByZXNlcnZlZF9jb3VudCBpcyBjb2RlZCBpbiB0aGUgZnJhbWUgaGVhZGVyCisgICAgRkxBR19TTV9EQVRBICAgID0gMjU2LCAvLy88aWYgc2V0LCBzaWRlIC8gbWV0YSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgZnJhbWUgaGVhZGVyLgorICAgIEZMQUdfSEVBREVSX0lEWCA9MTAyNCwgLy8vPElmIHNldCwgaGVhZGVyX2lkeCBpcyBjb2RlZCBpbiB0aGUgZnJhbWUgaGVhZGVyLgorICAgIEZMQUdfTUFUQ0hfVElNRSA9MjA0OCwgLy8vPElmIHNldCwgbWF0Y2hfdGltZV9kZWx0YSBpcyBjb2RlZCBpbiB0aGUgZnJhbWUgaGVhZGVyCisgICAgRkxBR19DT0RFRCAgICAgID00MDk2LCAvLy88aWYgc2V0LCBjb2RlZF9mbGFncyBhcmUgc3RvcmVkIGluIHRoZSBmcmFtZSBoZWFkZXIKKyAgICBGTEFHX0lOVkFMSUQgICAgPTgxOTIsIC8vLzxpZiBzZXQsIGZyYW1lX2NvZGUgaXMgaW52YWxpZAorfSBGbGFnOworCit0eXBlZGVmIHN0cnVjdCBTeW5jcG9pbnQgeworICAgIHVpbnQ2NF90IHBvczsKKyAgICB1aW50NjRfdCBiYWNrX3B0cjsKKy8vICAgIHVpbnQ2NF90IGdsb2JhbF9rZXlfcHRzOworICAgIGludDY0X3QgdHM7Cit9IFN5bmNwb2ludDsKKwordHlwZWRlZiBzdHJ1Y3QgRnJhbWVDb2RlIHsKKyAgICB1aW50MTZfdCBmbGFnczsKKyAgICB1aW50OF90ICBzdHJlYW1faWQ7CisgICAgdWludDE2X3Qgc2l6ZV9tdWw7CisgICAgdWludDE2X3Qgc2l6ZV9sc2I7CisgICAgaW50MTZfdCAgcHRzX2RlbHRhOworICAgIHVpbnQ4X3QgIHJlc2VydmVkX2NvdW50OworICAgIHVpbnQ4X3QgIGhlYWRlcl9pZHg7Cit9IEZyYW1lQ29kZTsKKwordHlwZWRlZiBzdHJ1Y3QgU3RyZWFtQ29udGV4dCB7CisgICAgaW50IGxhc3RfZmxhZ3M7CisgICAgaW50IHNraXBfdW50aWxfa2V5X2ZyYW1lOworICAgIGludDY0X3QgbGFzdF9wdHM7CisgICAgaW50IHRpbWVfYmFzZV9pZDsKKyAgICBBVlJhdGlvbmFsICp0aW1lX2Jhc2U7CisgICAgaW50IG1zYl9wdHNfc2hpZnQ7CisgICAgaW50IG1heF9wdHNfZGlzdGFuY2U7CisgICAgaW50IGRlY29kZV9kZWxheTsgLy9GSVhNRSBkdXBsaWNhdGUgb2YgaGFzX2JfZnJhbWVzCisgICAgaW50NjRfdCAqa2V5ZnJhbWVfcHRzOworfSBTdHJlYW1Db250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBDaGFwdGVyQ29udGV4dCB7CisgICAgQVZSYXRpb25hbCAqdGltZV9iYXNlOworfSBDaGFwdGVyQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgTlVUQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqYXZfY2xhc3M7CisgICAgQVZGb3JtYXRDb250ZXh0ICphdmY7CisvLyAgICBpbnQgd3JpdHRlbl9wYWNrZXRfc2l6ZTsKKy8vICAgIGludDY0X3QgcGFja2V0X3N0YXJ0OworICAgIEZyYW1lQ29kZSBmcmFtZV9jb2RlWzI1Nl07CisgICAgdWludDhfdCBoZWFkZXJfbGVuWzEyOF07CisgICAgY29uc3QgdWludDhfdCAqaGVhZGVyWzEyOF07CisgICAgdWludDY0X3QgbmV4dF9zdGFydGNvZGU7ICAgICAvLy88IHN0b3JlcyB0aGUgbmV4dCBzdGFydGNvZGUgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBwYXJzZWQgYnV0IHRoZSBzdHJlYW0gaXMgbm90IHNlZWthYmxlCisgICAgU3RyZWFtQ29udGV4dCAqc3RyZWFtOworICAgIENoYXB0ZXJDb250ZXh0ICpjaGFwdGVyOworICAgIHVuc2lnbmVkIGludCBtYXhfZGlzdGFuY2U7CisgICAgdW5zaWduZWQgaW50IHRpbWVfYmFzZV9jb3VudDsKKyAgICBpbnQ2NF90IGxhc3Rfc3luY3BvaW50X3BvczsKKyAgICBpbnQgaGVhZGVyX2NvdW50OworICAgIEFWUmF0aW9uYWwgKnRpbWVfYmFzZTsKKyAgICBzdHJ1Y3QgQVZUcmVlTm9kZSAqc3luY3BvaW50czsKKyAgICBpbnQgc3BfY291bnQ7CisgICAgaW50IHdyaXRlX2luZGV4OworICAgIGludDY0X3QgbWF4X3B0czsKKyAgICBBVlJhdGlvbmFsICptYXhfcHRzX3RiOworI2RlZmluZSBOVVRfQlJPQURDQVNUIDEgLy8gdXNlIGV4dGVuZGVkIHN5bmNwb2ludHMKKyNkZWZpbmUgTlVUX1BJUEUgMiAgICAgIC8vIGRvIG5vdCB3cml0ZSBzeW5jcG9pbnRzCisgICAgaW50IGZsYWdzOworICAgIGludCB2ZXJzaW9uOyAvLyB2ZXJzaW9uIGN1cnJlbnRseSBpbiB1c2UKKyAgICBpbnQgbWlub3JfdmVyc2lvbjsKK30gTlVUQ29udGV4dDsKKworZXh0ZXJuIGNvbnN0IEFWQ29kZWNUYWcgZmZfbnV0X3N1YnRpdGxlX3RhZ3NbXTsKK2V4dGVybiBjb25zdCBBVkNvZGVjVGFnIGZmX251dF92aWRlb190YWdzW107CitleHRlcm4gY29uc3QgQVZDb2RlY1RhZyBmZl9udXRfYXVkaW9fdGFnc1tdOworZXh0ZXJuIGNvbnN0IEFWQ29kZWNUYWcgZmZfbnV0X2F1ZGlvX2V4dHJhX3RhZ3NbXTsKK2V4dGVybiBjb25zdCBBVkNvZGVjVGFnIGZmX251dF9kYXRhX3RhZ3NbXTsKKworZXh0ZXJuIGNvbnN0IEFWQ29kZWNUYWcgKiBjb25zdCBmZl9udXRfY29kZWNfdGFnc1tdOworCit0eXBlZGVmIHN0cnVjdCBEaXNwb3NpdGlvbnMgeworICAgIGNoYXIgc3RyWzldOworICAgIGludCBmbGFnOworfSBEaXNwb3NpdGlvbnM7CisKK3ZvaWQgZmZfbnV0X3Jlc2V0X3RzKE5VVENvbnRleHQgKm51dCwgQVZSYXRpb25hbCB0aW1lX2Jhc2UsIGludDY0X3QgdmFsKTsKK2ludDY0X3QgZmZfbHNiMmZ1bGwoU3RyZWFtQ29udGV4dCAqc3RyZWFtLCBpbnQ2NF90IGxzYik7CitpbnQgZmZfbnV0X3NwX3Bvc19jbXAoY29uc3QgU3luY3BvaW50ICphLCBjb25zdCBTeW5jcG9pbnQgKmIpOworaW50IGZmX251dF9zcF9wdHNfY21wKGNvbnN0IFN5bmNwb2ludCAqYSwgY29uc3QgU3luY3BvaW50ICpiKTsKK2ludCBmZl9udXRfYWRkX3NwKE5VVENvbnRleHQgKm51dCwgaW50NjRfdCBwb3MsIGludDY0X3QgYmFja19wdHIsIGludDY0X3QgdHMpOwordm9pZCBmZl9udXRfZnJlZV9zcChOVVRDb250ZXh0ICpudXQpOworCitleHRlcm4gY29uc3QgRGlzcG9zaXRpb25zIGZmX251dF9kaXNwb3NpdGlvbnNbXTsKKworZXh0ZXJuIGNvbnN0IEFWTWV0YWRhdGFDb252IGZmX251dF9tZXRhZGF0YV9jb252W107CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9OVVRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L251dGRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L251dGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMjliZGYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbnV0ZGVjLmMKQEAgLTAsMCArMSwxMjMwIEBACisvKgorICogIk5VVCIgQ29udGFpbmVyIEZvcm1hdCBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RyZWUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaXNvbS5oIgorI2luY2x1ZGUgIm51dC5oIgorI2luY2x1ZGUgInJpZmYuaCIKKworI2RlZmluZSBOVVRfTUFYX1NUUkVBTVMgMjU2ICAgIC8qIGFyYml0cmFyeSBzYW5pdHkgY2hlY2sgdmFsdWUgKi8KKworc3RhdGljIGludDY0X3QgbnV0X3JlYWRfdGltZXN0YW1wKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpwb3NfYXJnLCBpbnQ2NF90IHBvc19saW1pdCk7CisKK3N0YXRpYyBpbnQgZ2V0X3N0cihBVklPQ29udGV4dCAqYmMsIGNoYXIgKnN0cmluZywgdW5zaWduZWQgaW50IG1heGxlbikKK3sKKyAgICB1bnNpZ25lZCBpbnQgbGVuID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisKKyAgICBpZiAobGVuICYmIG1heGxlbikKKyAgICAgICAgYXZpb19yZWFkKGJjLCBzdHJpbmcsIEZGTUlOKGxlbiwgbWF4bGVuKSk7CisgICAgd2hpbGUgKGxlbiA+IG1heGxlbikgeworICAgICAgICBhdmlvX3I4KGJjKTsKKyAgICAgICAgbGVuLS07CisgICAgfQorCisgICAgaWYgKG1heGxlbikKKyAgICAgICAgc3RyaW5nW0ZGTUlOKGxlbiwgbWF4bGVuIC0gMSldID0gMDsKKworICAgIGlmIChtYXhsZW4gPT0gbGVuKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludDY0X3QgZ2V0X3MoQVZJT0NvbnRleHQgKmJjKQoreworICAgIGludDY0X3QgdiA9IGZmaW9fcmVhZF92YXJsZW4oYmMpICsgMTsKKworICAgIGlmICh2ICYgMSkKKyAgICAgICAgcmV0dXJuIC0odiA+PiAxKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAgKHYgPj4gMSk7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBnZXRfZm91cmNjKEFWSU9Db250ZXh0ICpiYykKK3sKKyAgICB1bnNpZ25lZCBpbnQgbGVuID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisKKyAgICBpZiAobGVuID09IDIpCisgICAgICAgIHJldHVybiBhdmlvX3JsMTYoYmMpOworICAgIGVsc2UgaWYgKGxlbiA9PSA0KQorICAgICAgICByZXR1cm4gYXZpb19ybDMyKGJjKTsKKyAgICBlbHNlIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGZvdXJjYyBsZW5ndGggJWRcbiIsIGxlbik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKKyNpZmRlZiBUUkFDRQorc3RhdGljIGlubGluZSB1aW50NjRfdCBnZXRfdl90cmFjZShBVklPQ29udGV4dCAqYmMsIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQoreworICAgIHVpbnQ2NF90IHYgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJnZXRfdiAlNSJQUklkNjQiIC8gJSJQUklYNjQiIGluICVzICVzOiVkXG4iLAorICAgICAgICAgICB2LCB2LCBmaWxlLCBmdW5jLCBsaW5lKTsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIGlubGluZSBpbnQ2NF90IGdldF9zX3RyYWNlKEFWSU9Db250ZXh0ICpiYywgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKK3sKKyAgICBpbnQ2NF90IHYgPSBnZXRfcyhiYyk7CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiZ2V0X3MgJTUiUFJJZDY0IiAvICUiUFJJWDY0IiBpbiAlcyAlczolZFxuIiwKKyAgICAgICAgICAgdiwgdiwgZmlsZSwgZnVuYywgbGluZSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZ2V0XzRjY190cmFjZShBVklPQ29udGV4dCAqYmMsIGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmdW5jLCBpbnQgbGluZSkKK3sKKyAgICB1aW50NjRfdCB2ID0gZ2V0X2ZvdXJjYyhiYyk7CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiZ2V0X2ZvdXJjYyAlNSJQUklkNjQiIC8gJSJQUklYNjQiIGluICVzICVzOiVkXG4iLAorICAgICAgICAgICB2LCB2LCBmaWxlLCBmdW5jLCBsaW5lKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgZmZpb19yZWFkX3ZhcmxlbihiYykgZ2V0X3ZfdHJhY2UoYmMsICBfX0ZJTEVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18pCisjZGVmaW5lIGdldF9zKGJjKSAgICAgICAgICAgIGdldF9zX3RyYWNlKGJjLCAgX19GSUxFX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fKQorI2RlZmluZSBnZXRfZm91cmNjKGJjKSAgICAgICBnZXRfNGNjX3RyYWNlKGJjLCBfX0ZJTEVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18pCisjZW5kaWYKKworc3RhdGljIGludCBnZXRfcGFja2V0aGVhZGVyKE5VVENvbnRleHQgKm51dCwgQVZJT0NvbnRleHQgKmJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWxjdWxhdGVfY2hlY2tzdW0sIHVpbnQ2NF90IHN0YXJ0Y29kZSkKK3sKKyAgICBpbnQ2NF90IHNpemU7CisvLyAgICBzdGFydCA9IGF2aW9fdGVsbChiYykgLSA4OworCisgICAgc3RhcnRjb2RlID0gYXZfYmUybmU2NChzdGFydGNvZGUpOworICAgIHN0YXJ0Y29kZSA9IGZmX2NyYzA0QzExREI3X3VwZGF0ZSgwLCAodWludDhfdCopICZzdGFydGNvZGUsIDgpOworCisgICAgZmZpb19pbml0X2NoZWNrc3VtKGJjLCBmZl9jcmMwNEMxMURCN191cGRhdGUsIHN0YXJ0Y29kZSk7CisgICAgc2l6ZSA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgIGlmIChzaXplID4gNDA5NikKKyAgICAgICAgYXZpb19yYjMyKGJjKTsKKyAgICBpZiAoZmZpb19nZXRfY2hlY2tzdW0oYmMpICYmIHNpemUgPiA0MDk2KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmZmlvX2luaXRfY2hlY2tzdW0oYmMsIGNhbGN1bGF0ZV9jaGVja3N1bSA/IGZmX2NyYzA0QzExREI3X3VwZGF0ZSA6IE5VTEwsIDApOworCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBmaW5kX2FueV9zdGFydGNvZGUoQVZJT0NvbnRleHQgKmJjLCBpbnQ2NF90IHBvcykKK3sKKyAgICB1aW50NjRfdCBzdGF0ZSA9IDA7CisKKyAgICBpZiAocG9zID49IDApCisgICAgICAgIC8qIE5vdGUsIHRoaXMgbWF5IGZhaWwgaWYgdGhlIHN0cmVhbSBpcyBub3Qgc2Vla2FibGUsIGJ1dCB0aGF0IHNob3VsZAorICAgICAgICAgKiBub3QgbWF0dGVyLCBhcyBpbiB0aGlzIGNhc2Ugd2Ugc2ltcGx5IHN0YXJ0IHdoZXJlIHdlIGN1cnJlbnRseSBhcmUgKi8KKyAgICAgICAgYXZpb19zZWVrKGJjLCBwb3MsIFNFRUtfU0VUKTsKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihiYykpIHsKKyAgICAgICAgc3RhdGUgPSAoc3RhdGUgPDwgOCkgfCBhdmlvX3I4KGJjKTsKKyAgICAgICAgaWYgKChzdGF0ZSA+PiA1NikgIT0gJ04nKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBNQUlOX1NUQVJUQ09ERToKKyAgICAgICAgY2FzZSBTVFJFQU1fU1RBUlRDT0RFOgorICAgICAgICBjYXNlIFNZTkNQT0lOVF9TVEFSVENPREU6CisgICAgICAgIGNhc2UgSU5GT19TVEFSVENPREU6CisgICAgICAgIGNhc2UgSU5ERVhfU1RBUlRDT0RFOgorICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmluZCB0aGUgZ2l2ZW4gc3RhcnRjb2RlLgorICogQHBhcmFtIGNvZGUgdGhlIHN0YXJ0Y29kZQorICogQHBhcmFtIHBvcyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHNlYXJjaCwgb3IgLTEgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24KKyAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBzdGFydGNvZGUgb3IgLTEgaWYgbm90IGZvdW5kCisgKi8KK3N0YXRpYyBpbnQ2NF90IGZpbmRfc3RhcnRjb2RlKEFWSU9Db250ZXh0ICpiYywgdWludDY0X3QgY29kZSwgaW50NjRfdCBwb3MpCit7CisgICAgZm9yICg7OykgeworICAgICAgICB1aW50NjRfdCBzdGFydGNvZGUgPSBmaW5kX2FueV9zdGFydGNvZGUoYmMsIHBvcyk7CisgICAgICAgIGlmIChzdGFydGNvZGUgPT0gY29kZSkKKyAgICAgICAgICAgIHJldHVybiBhdmlvX3RlbGwoYmMpIC0gODsKKyAgICAgICAgZWxzZSBpZiAoc3RhcnRjb2RlID09IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHBvcyA9IC0xOworICAgIH0KK30KKworc3RhdGljIGludCBudXRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+YnVmX3NpemUtODsgaSsrKSB7CisgICAgICAgIGlmIChBVl9SQjMyKHAtPmJ1ZitpKSAhPSBNQUlOX1NUQVJUQ09ERT4+MzIpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKEFWX1JCMzIocC0+YnVmK2krNCkgPT0gKE1BSU5fU1RBUlRDT0RFICYgMHhGRkZGRkZGRikpCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEdFVF9WKGRzdCwgY2hlY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRtcCA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKGNoZWNrKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3IgIiAjZHN0ICIgaXMgKCUiUFJJZDY0IilcbiIsIHRtcCk7ICBcCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdCA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBza2lwX3Jlc2VydmVkKEFWSU9Db250ZXh0ICpiYywgaW50NjRfdCBwb3MpCit7CisgICAgcG9zIC09IGF2aW9fdGVsbChiYyk7CisgICAgaWYgKHBvcyA8IDApIHsKKyAgICAgICAgYXZpb19zZWVrKGJjLCBwb3MsIFNFRUtfQ1VSKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKHBvcy0tKQorICAgICAgICAgICAgYXZpb19yOChiYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCBkZWNvZGVfbWFpbl9oZWFkZXIoTlVUQ29udGV4dCAqbnV0KQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqcyA9IG51dC0+YXZmOworICAgIEFWSU9Db250ZXh0ICpiYyAgICA9IHMtPnBiOworICAgIHVpbnQ2NF90IHRtcCwgZW5kOworICAgIHVuc2lnbmVkIGludCBzdHJlYW1fY291bnQ7CisgICAgaW50IGksIGosIGNvdW50OworICAgIGludCB0bXBfc3RyZWFtLCB0bXBfbXVsLCB0bXBfcHRzLCB0bXBfc2l6ZSwgdG1wX3JlcywgdG1wX2hlYWRfaWR4OworCisgICAgZW5kICA9IGdldF9wYWNrZXRoZWFkZXIobnV0LCBiYywgMSwgTUFJTl9TVEFSVENPREUpOworICAgIGVuZCArPSBhdmlvX3RlbGwoYmMpOworCisgICAgbnV0LT52ZXJzaW9uID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisgICAgaWYgKG51dC0+dmVyc2lvbiA8IE5VVF9NSU5fVkVSU0lPTiAmJgorICAgICAgICBudXQtPnZlcnNpb24gPiBOVVRfTUFYX1ZFUlNJT04pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlZlcnNpb24gJWQgbm90IHN1cHBvcnRlZC5cbiIsCisgICAgICAgICAgICAgICBudXQtPnZlcnNpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKyAgICBpZiAobnV0LT52ZXJzaW9uID4gMykKKyAgICAgICAgbnV0LT5taW5vcl92ZXJzaW9uID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisKKyAgICBHRVRfVihzdHJlYW1fY291bnQsIHRtcCA+IDAgJiYgdG1wIDw9IE5VVF9NQVhfU1RSRUFNUyk7CisKKyAgICBudXQtPm1heF9kaXN0YW5jZSA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgIGlmIChudXQtPm1heF9kaXN0YW5jZSA+IDY1NTM2KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJtYXhfZGlzdGFuY2UgJWRcbiIsIG51dC0+bWF4X2Rpc3RhbmNlKTsKKyAgICAgICAgbnV0LT5tYXhfZGlzdGFuY2UgPSA2NTUzNjsKKyAgICB9CisKKyAgICBHRVRfVihudXQtPnRpbWVfYmFzZV9jb3VudCwgdG1wID4gMCAmJiB0bXAgPCBJTlRfTUFYIC8gc2l6ZW9mKEFWUmF0aW9uYWwpKTsKKyAgICBudXQtPnRpbWVfYmFzZSA9IGF2X21hbGxvYyhudXQtPnRpbWVfYmFzZV9jb3VudCAqIHNpemVvZihBVlJhdGlvbmFsKSk7CisgICAgaWYgKCFudXQtPnRpbWVfYmFzZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudXQtPnRpbWVfYmFzZV9jb3VudDsgaSsrKSB7CisgICAgICAgIEdFVF9WKG51dC0+dGltZV9iYXNlW2ldLm51bSwgdG1wID4gMCAmJiB0bXAgPCAoMVVMTCA8PCAzMSkpOworICAgICAgICBHRVRfVihudXQtPnRpbWVfYmFzZVtpXS5kZW4sIHRtcCA+IDAgJiYgdG1wIDwgKDFVTEwgPDwgMzEpKTsKKyAgICAgICAgaWYgKGF2X2djZChudXQtPnRpbWVfYmFzZVtpXS5udW0sIG51dC0+dGltZV9iYXNlW2ldLmRlbikgIT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInRpbWUgYmFzZSBpbnZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorICAgIHRtcF9wdHMgICAgICA9IDA7CisgICAgdG1wX211bCAgICAgID0gMTsKKyAgICB0bXBfc3RyZWFtICAgPSAwOworICAgIHRtcF9oZWFkX2lkeCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjspIHsKKyAgICAgICAgaW50IHRtcF9mbGFncyAgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICAgICAgaW50IHRtcF9maWVsZHMgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKworICAgICAgICBpZiAodG1wX2ZpZWxkcyA+IDApCisgICAgICAgICAgICB0bXBfcHRzID0gZ2V0X3MoYmMpOworICAgICAgICBpZiAodG1wX2ZpZWxkcyA+IDEpCisgICAgICAgICAgICB0bXBfbXVsID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisgICAgICAgIGlmICh0bXBfZmllbGRzID4gMikKKyAgICAgICAgICAgIHRtcF9zdHJlYW0gPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICAgICAgaWYgKHRtcF9maWVsZHMgPiAzKQorICAgICAgICAgICAgdG1wX3NpemUgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdG1wX3NpemUgPSAwOworICAgICAgICBpZiAodG1wX2ZpZWxkcyA+IDQpCisgICAgICAgICAgICB0bXBfcmVzID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRtcF9yZXMgPSAwOworICAgICAgICBpZiAodG1wX2ZpZWxkcyA+IDUpCisgICAgICAgICAgICBjb3VudCA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb3VudCA9IHRtcF9tdWwgLSB0bXBfc2l6ZTsKKyAgICAgICAgaWYgKHRtcF9maWVsZHMgPiA2KQorICAgICAgICAgICAgZ2V0X3MoYmMpOworICAgICAgICBpZiAodG1wX2ZpZWxkcyA+IDcpCisgICAgICAgICAgICB0bXBfaGVhZF9pZHggPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKworICAgICAgICB3aGlsZSAodG1wX2ZpZWxkcy0tID4gOCkKKyAgICAgICAgICAgIGZmaW9fcmVhZF92YXJsZW4oYmMpOworCisgICAgICAgIGlmIChjb3VudCA9PSAwIHx8IGkgKyBjb3VudCA+IDI1NikgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgY291bnQgJWQgYXQgJWRcbiIsIGNvdW50LCBpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmICh0bXBfc3RyZWFtID49IHN0cmVhbV9jb3VudCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgc3RyZWFtIG51bWJlclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb3VudDsgaisrLCBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID09ICdOJykgeworICAgICAgICAgICAgICAgIG51dC0+ZnJhbWVfY29kZVtpXS5mbGFncyA9IEZMQUdfSU5WQUxJRDsKKyAgICAgICAgICAgICAgICBqLS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudXQtPmZyYW1lX2NvZGVbaV0uZmxhZ3MgICAgICAgICAgPSB0bXBfZmxhZ3M7CisgICAgICAgICAgICBudXQtPmZyYW1lX2NvZGVbaV0ucHRzX2RlbHRhICAgICAgPSB0bXBfcHRzOworICAgICAgICAgICAgbnV0LT5mcmFtZV9jb2RlW2ldLnN0cmVhbV9pZCAgICAgID0gdG1wX3N0cmVhbTsKKyAgICAgICAgICAgIG51dC0+ZnJhbWVfY29kZVtpXS5zaXplX211bCAgICAgICA9IHRtcF9tdWw7CisgICAgICAgICAgICBudXQtPmZyYW1lX2NvZGVbaV0uc2l6ZV9sc2IgICAgICAgPSB0bXBfc2l6ZSArIGo7CisgICAgICAgICAgICBudXQtPmZyYW1lX2NvZGVbaV0ucmVzZXJ2ZWRfY291bnQgPSB0bXBfcmVzOworICAgICAgICAgICAgbnV0LT5mcmFtZV9jb2RlW2ldLmhlYWRlcl9pZHggICAgID0gdG1wX2hlYWRfaWR4OworICAgICAgICB9CisgICAgfQorICAgIGF2X2Fzc2VydDAobnV0LT5mcmFtZV9jb2RlWydOJ10uZmxhZ3MgPT0gRkxBR19JTlZBTElEKTsKKworICAgIGlmIChlbmQgPiBhdmlvX3RlbGwoYmMpICsgNCkgeworICAgICAgICBpbnQgcmVtID0gMTAyNDsKKyAgICAgICAgR0VUX1YobnV0LT5oZWFkZXJfY291bnQsIHRtcCA8IDEyOFUpOworICAgICAgICBudXQtPmhlYWRlcl9jb3VudCsrOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnV0LT5oZWFkZXJfY291bnQ7IGkrKykgeworICAgICAgICAgICAgdWludDhfdCAqaGRyOworICAgICAgICAgICAgR0VUX1YobnV0LT5oZWFkZXJfbGVuW2ldLCB0bXAgPiAwICYmIHRtcCA8IDI1Nik7CisgICAgICAgICAgICByZW0gLT0gbnV0LT5oZWFkZXJfbGVuW2ldOworICAgICAgICAgICAgaWYgKHJlbSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBlbGlzaW9uIGhlYWRlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZHIgPSBhdl9tYWxsb2MobnV0LT5oZWFkZXJfbGVuW2ldKTsKKyAgICAgICAgICAgIGlmICghaGRyKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBhdmlvX3JlYWQoYmMsIGhkciwgbnV0LT5oZWFkZXJfbGVuW2ldKTsKKyAgICAgICAgICAgIG51dC0+aGVhZGVyW2ldID0gaGRyOworICAgICAgICB9CisgICAgICAgIGF2X2Fzc2VydDAobnV0LT5oZWFkZXJfbGVuWzBdID09IDApOworICAgIH0KKworICAgIC8vIGZsYWdzIGhhZCBiZWVuIGVmZmVjdGl2ZWx5IGludHJvZHVjZWQgaW4gdmVyc2lvbiA0CisgICAgaWYgKG51dC0+dmVyc2lvbiA+IDMgJiYgZW5kID4gYXZpb190ZWxsKGJjKSArIDQpIHsKKyAgICAgICAgbnV0LT5mbGFncyA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgIH0KKworICAgIGlmIChza2lwX3Jlc2VydmVkKGJjLCBlbmQpIHx8IGZmaW9fZ2V0X2NoZWNrc3VtKGJjKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibWFpbiBoZWFkZXIgY2hlY2tzdW0gbWlzbWF0Y2hcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBudXQtPnN0cmVhbSA9IGF2X2NhbGxvYyhzdHJlYW1fY291bnQsIHNpemVvZihTdHJlYW1Db250ZXh0KSk7CisgICAgaWYgKCFudXQtPnN0cmVhbSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3RyZWFtX2NvdW50OyBpKyspCisgICAgICAgIGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfc3RyZWFtX2hlYWRlcihOVVRDb250ZXh0ICpudXQpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpzID0gbnV0LT5hdmY7CisgICAgQVZJT0NvbnRleHQgKmJjICAgID0gcy0+cGI7CisgICAgU3RyZWFtQ29udGV4dCAqc3RjOworICAgIGludCBjbGFzcywgc3RyZWFtX2lkOworICAgIHVpbnQ2NF90IHRtcCwgZW5kOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIGVuZCAgPSBnZXRfcGFja2V0aGVhZGVyKG51dCwgYmMsIDEsIFNUUkVBTV9TVEFSVENPREUpOworICAgIGVuZCArPSBhdmlvX3RlbGwoYmMpOworCisgICAgR0VUX1Yoc3RyZWFtX2lkLCB0bXAgPCBzLT5uYl9zdHJlYW1zICYmICFudXQtPnN0cmVhbVt0bXBdLnRpbWVfYmFzZSk7CisgICAgc3RjID0gJm51dC0+c3RyZWFtW3N0cmVhbV9pZF07CisgICAgc3QgID0gcy0+c3RyZWFtc1tzdHJlYW1faWRdOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBjbGFzcyAgICAgICAgICAgICAgICA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgIHRtcCAgICAgICAgICAgICAgICAgID0gZ2V0X2ZvdXJjYyhiYyk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSB0bXA7CisgICAgc3dpdGNoIChjbGFzcykgeworICAgIGNhc2UgMDoKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBhdl9jb2RlY19nZXRfaWQoKGNvbnN0IEFWQ29kZWNUYWcgKiBjb25zdCBbXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX251dF92aWRlb190YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NvZGVjX2JtcF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBhdl9jb2RlY19nZXRfaWQoKGNvbnN0IEFWQ29kZWNUYWcgKiBjb25zdCBbXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX251dF9hdWRpb190YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NvZGVjX3dhdl90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX251dF9hdWRpb19leHRyYV90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX251dF9zdWJ0aXRsZV90YWdzLCB0bXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfbnV0X2RhdGFfdGFncywgdG1wKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVua25vd24gc3RyZWFtIGNsYXNzICglZClcbiIsIGNsYXNzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisgICAgaWYgKGNsYXNzIDwgMyAmJiBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5rbm93biBjb2RlYyB0YWcgJzB4JTA0eCcgZm9yIHN0cmVhbSBudW1iZXIgJWRcbiIsCisgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSB0bXAsIHN0cmVhbV9pZCk7CisKKyAgICBHRVRfVihzdGMtPnRpbWVfYmFzZV9pZCwgdG1wIDwgbnV0LT50aW1lX2Jhc2VfY291bnQpOworICAgIEdFVF9WKHN0Yy0+bXNiX3B0c19zaGlmdCwgdG1wIDwgMTYpOworICAgIHN0Yy0+bWF4X3B0c19kaXN0YW5jZSA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgIEdFVF9WKHN0Yy0+ZGVjb2RlX2RlbGF5LCB0bXAgPCAxMDAwKTsgLy8gc2FuaXR5IGxpbWl0LCByYWlzZSB0aGlzIGlmIE1vb3JlJ3MgbGF3IGlzIHRydWUKKyAgICBzdC0+Y29kZWMtPmhhc19iX2ZyYW1lcyA9IHN0Yy0+ZGVjb2RlX2RlbGF5OworICAgIGZmaW9fcmVhZF92YXJsZW4oYmMpOyAvLyBzdHJlYW0gZmxhZ3MKKworICAgIEdFVF9WKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUsIHRtcCA8ICgxIDw8IDMwKSk7CisgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgaWYgKGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBiYywgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBHRVRfVihzdC0+Y29kZWMtPndpZHRoLCAgdG1wID4gMCk7CisgICAgICAgIEdFVF9WKHN0LT5jb2RlYy0+aGVpZ2h0LCB0bXAgPiAwKTsKKyAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgICAgICBpZiAoKCFzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pICE9ICghc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgYXNwZWN0IHJhdGlvICVkLyVkXG4iLAorICAgICAgICAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGZmaW9fcmVhZF92YXJsZW4oYmMpOyAvKiBjc3AgdHlwZSAqLworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBHRVRfVihzdC0+Y29kZWMtPnNhbXBsZV9yYXRlLCB0bXAgPiAwKTsKKyAgICAgICAgZmZpb19yZWFkX3ZhcmxlbihiYyk7IC8vIHNhbXBsZXJhdGVfZGVuCisgICAgICAgIEdFVF9WKHN0LT5jb2RlYy0+Y2hhbm5lbHMsIHRtcCA+IDApOworICAgIH0KKyAgICBpZiAoc2tpcF9yZXNlcnZlZChiYywgZW5kKSB8fCBmZmlvX2dldF9jaGVja3N1bShiYykpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJzdHJlYW0gaGVhZGVyICVkIGNoZWNrc3VtIG1pc21hdGNoXG4iLCBzdHJlYW1faWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgc3RjLT50aW1lX2Jhc2UgPSAmbnV0LT50aW1lX2Jhc2Vbc3RjLT50aW1lX2Jhc2VfaWRdOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1tzdHJlYW1faWRdLCA2Mywgc3RjLT50aW1lX2Jhc2UtPm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0Yy0+dGltZV9iYXNlLT5kZW4pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGlzcG9zaXRpb25fYml0cyhBVkZvcm1hdENvbnRleHQgKmF2ZiwgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX2lkKQoreworICAgIGludCBmbGFnID0gMCwgaTsKKworICAgIGZvciAoaSA9IDA7IGZmX251dF9kaXNwb3NpdGlvbnNbaV0uZmxhZzsgKytpKQorICAgICAgICBpZiAoIXN0cmNtcChmZl9udXRfZGlzcG9zaXRpb25zW2ldLnN0ciwgdmFsdWUpKQorICAgICAgICAgICAgZmxhZyA9IGZmX251dF9kaXNwb3NpdGlvbnNbaV0uZmxhZzsKKyAgICBpZiAoIWZsYWcpCisgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19JTkZPLCAidW5rbm93biBkaXNwb3NpdGlvbiB0eXBlICclcydcbiIsIHZhbHVlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZmLT5uYl9zdHJlYW1zOyArK2kpCisgICAgICAgIGlmIChzdHJlYW1faWQgPT0gaSB8fCBzdHJlYW1faWQgPT0gLTEpCisgICAgICAgICAgICBhdmYtPnN0cmVhbXNbaV0tPmRpc3Bvc2l0aW9uIHw9IGZsYWc7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2luZm9faGVhZGVyKE5VVENvbnRleHQgKm51dCkKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKnMgPSBudXQtPmF2ZjsKKyAgICBBVklPQ29udGV4dCAqYmMgICAgPSBzLT5wYjsKKyAgICB1aW50NjRfdCB0bXAsIGNoYXB0ZXJfc3RhcnQsIGNoYXB0ZXJfbGVuOworICAgIHVuc2lnbmVkIGludCBzdHJlYW1faWRfcGx1czEsIGNvdW50OworICAgIGludCBjaGFwdGVyX2lkLCBpOworICAgIGludDY0X3QgdmFsdWUsIGVuZDsKKyAgICBjaGFyIG5hbWVbMjU2XSwgc3RyX3ZhbHVlWzEwMjRdLCB0eXBlX3N0clsyNTZdOworICAgIGNvbnN0IGNoYXIgKnR5cGU7CisgICAgaW50ICpldmVudF9mbGFncyAgICAgICAgPSBOVUxMOworICAgIEFWQ2hhcHRlciAqY2hhcHRlciAgICAgID0gTlVMTDsKKyAgICBBVlN0cmVhbSAqc3QgICAgICAgICAgICA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEgPSBOVUxMOworICAgIGludCBtZXRhZGF0YV9mbGFnICAgICAgID0gMDsKKworICAgIGVuZCAgPSBnZXRfcGFja2V0aGVhZGVyKG51dCwgYmMsIDEsIElORk9fU1RBUlRDT0RFKTsKKyAgICBlbmQgKz0gYXZpb190ZWxsKGJjKTsKKworICAgIEdFVF9WKHN0cmVhbV9pZF9wbHVzMSwgdG1wIDw9IHMtPm5iX3N0cmVhbXMpOworICAgIGNoYXB0ZXJfaWQgICAgPSBnZXRfcyhiYyk7CisgICAgY2hhcHRlcl9zdGFydCA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgIGNoYXB0ZXJfbGVuICAgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICBjb3VudCAgICAgICAgID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisKKyAgICBpZiAoY2hhcHRlcl9pZCAmJiAhc3RyZWFtX2lkX3BsdXMxKSB7CisgICAgICAgIGludDY0X3Qgc3RhcnQgPSBjaGFwdGVyX3N0YXJ0IC8gbnV0LT50aW1lX2Jhc2VfY291bnQ7CisgICAgICAgIGNoYXB0ZXIgPSBhdnByaXZfbmV3X2NoYXB0ZXIocywgY2hhcHRlcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudXQtPnRpbWVfYmFzZVtjaGFwdGVyX3N0YXJ0ICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudXQtPnRpbWVfYmFzZV9jb3VudF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIHN0YXJ0ICsgY2hhcHRlcl9sZW4sIE5VTEwpOworICAgICAgICBtZXRhZGF0YSA9ICZjaGFwdGVyLT5tZXRhZGF0YTsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbV9pZF9wbHVzMSkgeworICAgICAgICBzdCAgICAgICA9IHMtPnN0cmVhbXNbc3RyZWFtX2lkX3BsdXMxIC0gMV07CisgICAgICAgIG1ldGFkYXRhID0gJnN0LT5tZXRhZGF0YTsKKyAgICAgICAgZXZlbnRfZmxhZ3MgPSAmc3QtPmV2ZW50X2ZsYWdzOworICAgICAgICBtZXRhZGF0YV9mbGFnID0gQVZTVFJFQU1fRVZFTlRfRkxBR19NRVRBREFUQV9VUERBVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgIG1ldGFkYXRhID0gJnMtPm1ldGFkYXRhOworICAgICAgICBldmVudF9mbGFncyA9ICZzLT5ldmVudF9mbGFnczsKKyAgICAgICAgbWV0YWRhdGFfZmxhZyA9IEFWRk1UX0VWRU5UX0ZMQUdfTUVUQURBVEFfVVBEQVRFRDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBnZXRfc3RyKGJjLCBuYW1lLCBzaXplb2YobmFtZSkpOworICAgICAgICB2YWx1ZSA9IGdldF9zKGJjKTsKKyAgICAgICAgaWYgKHZhbHVlID09IC0xKSB7CisgICAgICAgICAgICB0eXBlID0gIlVURi04IjsKKyAgICAgICAgICAgIGdldF9zdHIoYmMsIHN0cl92YWx1ZSwgc2l6ZW9mKHN0cl92YWx1ZSkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC0yKSB7CisgICAgICAgICAgICBnZXRfc3RyKGJjLCB0eXBlX3N0ciwgc2l6ZW9mKHR5cGVfc3RyKSk7CisgICAgICAgICAgICB0eXBlID0gdHlwZV9zdHI7CisgICAgICAgICAgICBnZXRfc3RyKGJjLCBzdHJfdmFsdWUsIHNpemVvZihzdHJfdmFsdWUpKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtMykgeworICAgICAgICAgICAgdHlwZSAgPSAicyI7CisgICAgICAgICAgICB2YWx1ZSA9IGdldF9zKGJjKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtNCkgeworICAgICAgICAgICAgdHlwZSAgPSAidCI7CisgICAgICAgICAgICB2YWx1ZSA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgLTQpIHsKKyAgICAgICAgICAgIHR5cGUgPSAiciI7CisgICAgICAgICAgICBnZXRfcyhiYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0eXBlID0gInYiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cmVhbV9pZF9wbHVzMSA+IHMtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHN0cmVhbSBpZCBmb3IgaW5mbyBwYWNrZXRcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN0cmNtcCh0eXBlLCAiVVRGLTgiKSkgeworICAgICAgICAgICAgaWYgKGNoYXB0ZXJfaWQgPT0gMCAmJiAhc3RyY21wKG5hbWUsICJEaXNwb3NpdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgc2V0X2Rpc3Bvc2l0aW9uX2JpdHMocywgc3RyX3ZhbHVlLCBzdHJlYW1faWRfcGx1czEgLSAxKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0cmVhbV9pZF9wbHVzMSAmJiAhc3RyY21wKG5hbWUsICJyX2ZyYW1lX3JhdGUiKSkgeworICAgICAgICAgICAgICAgIHNzY2FuZihzdHJfdmFsdWUsICIlZC8lZCIsICZzdC0+cl9mcmFtZV9yYXRlLm51bSwgJnN0LT5yX2ZyYW1lX3JhdGUuZGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPnJfZnJhbWVfcmF0ZS5udW0gPj0gMTAwMExMKnN0LT5yX2ZyYW1lX3JhdGUuZGVuKQorICAgICAgICAgICAgICAgICAgICBzdC0+cl9mcmFtZV9yYXRlLm51bSA9IHN0LT5yX2ZyYW1lX3JhdGUuZGVuID0gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1ldGFkYXRhICYmIGF2X3N0cmNhc2VjbXAobmFtZSwgIlVzZXMiKSAmJgorICAgICAgICAgICAgICAgIGF2X3N0cmNhc2VjbXAobmFtZSwgIkRlcGVuZHMiKSAmJiBhdl9zdHJjYXNlY21wKG5hbWUsICJSZXBsYWNlcyIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50X2ZsYWdzKQorICAgICAgICAgICAgICAgICAgICAqZXZlbnRfZmxhZ3MgfD0gbWV0YWRhdGFfZmxhZzsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldChtZXRhZGF0YSwgbmFtZSwgc3RyX3ZhbHVlLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChza2lwX3Jlc2VydmVkKGJjLCBlbmQpIHx8IGZmaW9fZ2V0X2NoZWNrc3VtKGJjKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW5mbyBoZWFkZXIgY2hlY2tzdW0gbWlzbWF0Y2hcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3N5bmNwb2ludChOVVRDb250ZXh0ICpudXQsIGludDY0X3QgKnRzLCBpbnQ2NF90ICpiYWNrX3B0cikKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKnMgPSBudXQtPmF2ZjsKKyAgICBBVklPQ29udGV4dCAqYmMgICAgPSBzLT5wYjsKKyAgICBpbnQ2NF90IGVuZDsKKyAgICB1aW50NjRfdCB0bXA7CisgICAgaW50IHJldDsKKworICAgIG51dC0+bGFzdF9zeW5jcG9pbnRfcG9zID0gYXZpb190ZWxsKGJjKSAtIDg7CisKKyAgICBlbmQgID0gZ2V0X3BhY2tldGhlYWRlcihudXQsIGJjLCAxLCBTWU5DUE9JTlRfU1RBUlRDT0RFKTsKKyAgICBlbmQgKz0gYXZpb190ZWxsKGJjKTsKKworICAgIHRtcCAgICAgICA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgICpiYWNrX3B0ciA9IG51dC0+bGFzdF9zeW5jcG9pbnRfcG9zIC0gMTYgKiBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICBpZiAoKmJhY2tfcHRyIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBmZl9udXRfcmVzZXRfdHMobnV0LCBudXQtPnRpbWVfYmFzZVt0bXAgJSBudXQtPnRpbWVfYmFzZV9jb3VudF0sCisgICAgICAgICAgICAgICAgICAgIHRtcCAvIG51dC0+dGltZV9iYXNlX2NvdW50KTsKKworICAgIGlmIChudXQtPmZsYWdzICYgTlVUX0JST0FEQ0FTVCkgeworICAgICAgICB0bXAgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiU3luY3BvaW50IHdhbGxjbG9jayAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3EodG1wIC8gbnV0LT50aW1lX2Jhc2VfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnV0LT50aW1lX2Jhc2VbdG1wICUgbnV0LT50aW1lX2Jhc2VfY291bnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RKSk7CisgICAgfQorCisgICAgaWYgKHNraXBfcmVzZXJ2ZWQoYmMsIGVuZCkgfHwgZmZpb19nZXRfY2hlY2tzdW0oYmMpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJzeW5jIHBvaW50IGNoZWNrc3VtIG1pc21hdGNoXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgKnRzID0gdG1wIC8gbnV0LT50aW1lX2Jhc2VfY291bnQgKgorICAgICAgICAgIGF2X3EyZChudXQtPnRpbWVfYmFzZVt0bXAgJSBudXQtPnRpbWVfYmFzZV9jb3VudF0pICogQVZfVElNRV9CQVNFOworCisgICAgaWYgKChyZXQgPSBmZl9udXRfYWRkX3NwKG51dCwgbnV0LT5sYXN0X3N5bmNwb2ludF9wb3MsICpiYWNrX3B0ciwgKnRzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKKy8vRklYTUUgY2FsY3VsYXRlIGV4YWN0bHksIHRoaXMgaXMganVzdCBhIGdvb2QgYXBwcm94aW1hdGlvbi4KK3N0YXRpYyBpbnQ2NF90IGZpbmRfZHVyYXRpb24oTlVUQ29udGV4dCAqbnV0LCBpbnQ2NF90IGZpbGVzaXplKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqcyA9IG51dC0+YXZmOworICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworCisgICAgZmZfZmluZF9sYXN0X3RzKHMsIC0xLCAmZHVyYXRpb24sIE5VTEwsIG51dF9yZWFkX3RpbWVzdGFtcCk7CisKKyAgICBpZihkdXJhdGlvbiA+IDApCisgICAgICAgIHMtPmR1cmF0aW9uX2VzdGltYXRpb25fbWV0aG9kID0gQVZGTVRfRFVSQVRJT05fRlJPTV9QVFM7CisgICAgcmV0dXJuIGR1cmF0aW9uOworfQorCitzdGF0aWMgaW50IGZpbmRfYW5kX2RlY29kZV9pbmRleChOVVRDb250ZXh0ICpudXQpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpzID0gbnV0LT5hdmY7CisgICAgQVZJT0NvbnRleHQgKmJjICAgID0gcy0+cGI7CisgICAgdWludDY0X3QgdG1wLCBlbmQ7CisgICAgaW50IGksIGosIHN5bmNwb2ludF9jb3VudDsKKyAgICBpbnQ2NF90IGZpbGVzaXplID0gYXZpb19zaXplKGJjKTsKKyAgICBpbnQ2NF90ICpzeW5jcG9pbnRzOworICAgIHVpbnQ2NF90IG1heF9wdHM7CisgICAgaW50OF90ICpoYXNfa2V5ZnJhbWU7CisgICAgaW50IHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZihmaWxlc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBhdmlvX3NlZWsoYmMsIGZpbGVzaXplIC0gMTIsIFNFRUtfU0VUKTsKKyAgICBhdmlvX3NlZWsoYmMsIGZpbGVzaXplIC0gYXZpb19yYjY0KGJjKSwgU0VFS19TRVQpOworICAgIGlmIChhdmlvX3JiNjQoYmMpICE9IElOREVYX1NUQVJUQ09ERSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibm8gaW5kZXggYXQgdGhlIGVuZFxuIik7CisKKyAgICAgICAgaWYocy0+ZHVyYXRpb248PTApCisgICAgICAgICAgICBzLT5kdXJhdGlvbiA9IGZpbmRfZHVyYXRpb24obnV0LCBmaWxlc2l6ZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZW5kICA9IGdldF9wYWNrZXRoZWFkZXIobnV0LCBiYywgMSwgSU5ERVhfU1RBUlRDT0RFKTsKKyAgICBlbmQgKz0gYXZpb190ZWxsKGJjKTsKKworICAgIG1heF9wdHMgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICBzLT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShtYXhfcHRzIC8gbnV0LT50aW1lX2Jhc2VfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnV0LT50aW1lX2Jhc2VbbWF4X3B0cyAlIG51dC0+dGltZV9iYXNlX2NvdW50XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSk7CisgICAgcy0+ZHVyYXRpb25fZXN0aW1hdGlvbl9tZXRob2QgPSBBVkZNVF9EVVJBVElPTl9GUk9NX1BUUzsKKworICAgIEdFVF9WKHN5bmNwb2ludF9jb3VudCwgdG1wIDwgSU5UX01BWCAvIDggJiYgdG1wID4gMCk7CisgICAgc3luY3BvaW50cyAgID0gYXZfbWFsbG9jX2FycmF5KHN5bmNwb2ludF9jb3VudCwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICBoYXNfa2V5ZnJhbWUgPSBhdl9tYWxsb2NfYXJyYXkoc3luY3BvaW50X2NvdW50ICsgMSwgc2l6ZW9mKGludDhfdCkpOworICAgIGlmICghc3luY3BvaW50cyB8fCAhaGFzX2tleWZyYW1lKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgc3luY3BvaW50X2NvdW50OyBpKyspIHsKKyAgICAgICAgc3luY3BvaW50c1tpXSA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgICAgICBpZiAoc3luY3BvaW50c1tpXSA8PSAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBpZiAoaSkKKyAgICAgICAgICAgIHN5bmNwb2ludHNbaV0gKz0gc3luY3BvaW50c1tpIC0gMV07CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpbnQ2NF90IGxhc3RfcHRzID0gLTE7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzeW5jcG9pbnRfY291bnQ7KSB7CisgICAgICAgICAgICB1aW50NjRfdCB4ID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisgICAgICAgICAgICBpbnQgdHlwZSAgID0geCAmIDE7CisgICAgICAgICAgICBpbnQgbiAgICAgID0gajsKKyAgICAgICAgICAgIHggPj49IDE7CisgICAgICAgICAgICBpZiAodHlwZSkgeworICAgICAgICAgICAgICAgIGludCBmbGFnID0geCAmIDE7CisgICAgICAgICAgICAgICAgeCA+Pj0gMTsKKyAgICAgICAgICAgICAgICBpZiAobiArIHggPj0gc3luY3BvaW50X2NvdW50ICsgMSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW5kZXggb3ZlcmZsb3cgQSAlZCArICUiUFJJdTY0IiA+PSAlZFxuIiwgbiwgeCwgc3luY3BvaW50X2NvdW50ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKHgtLSkKKyAgICAgICAgICAgICAgICAgICAgaGFzX2tleWZyYW1lW24rK10gPSBmbGFnOworICAgICAgICAgICAgICAgIGhhc19rZXlmcmFtZVtuKytdID0gIWZsYWc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlICh4ICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPj0gc3luY3BvaW50X2NvdW50ICsgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImluZGV4IG92ZXJmbG93IEJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhhc19rZXlmcmFtZVtuKytdID0geCAmIDE7CisgICAgICAgICAgICAgICAgICAgIHggPj49IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc19rZXlmcmFtZVswXSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJrZXlmcmFtZSBiZWZvcmUgZmlyc3Qgc3luY3BvaW50IGluIGluZGV4XG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9hc3NlcnQwKG4gPD0gc3luY3BvaW50X2NvdW50ICsgMSk7CisgICAgICAgICAgICBmb3IgKDsgaiA8IG4gJiYgaiA8IHN5bmNwb2ludF9jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc19rZXlmcmFtZVtqXSkgeworICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBCLCBBID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghQSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQSA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgICAgICAgICAgICAgICAgICAgICAgQiA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW9yX3B0c1tqXVtpXSA9IGxhc3RfcHRzICsgQSArIEIKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBCID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHMtPnN0cmVhbXNbaV0sIDE2ICogc3luY3BvaW50c1tqIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3B0cyArIEEsIDAsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOworICAgICAgICAgICAgICAgICAgICBsYXN0X3B0cyArPSBBICsgQjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2tpcF9yZXNlcnZlZChiYywgZW5kKSB8fCBmZmlvX2dldF9jaGVja3N1bShiYykpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImluZGV4IGNoZWNrc3VtIG1pc21hdGNoXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICByZXQgPSAwOworCitmYWlsOgorICAgIGF2X2ZyZWUoc3luY3BvaW50cyk7CisgICAgYXZfZnJlZShoYXNfa2V5ZnJhbWUpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbnV0X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBOVVRDb250ZXh0ICpudXQgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKmJjID0gcy0+cGI7CisgICAgaW50NjRfdCBwb3M7CisgICAgaW50IGluaXRpYWxpemVkX3N0cmVhbV9jb3VudDsKKworICAgIG51dC0+YXZmID0gczsKKworICAgIC8qIG1haW4gaGVhZGVyICovCisgICAgcG9zID0gMDsKKyAgICBkbyB7CisgICAgICAgIHBvcyA9IGZpbmRfc3RhcnRjb2RlKGJjLCBNQUlOX1NUQVJUQ09ERSwgcG9zKSArIDE7CisgICAgICAgIGlmIChwb3MgPCAwICsgMSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vIG1haW4gc3RhcnRjb2RlIGZvdW5kLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGRlY29kZV9tYWluX2hlYWRlcihudXQpIDwgMCk7CisKKyAgICAvKiBzdHJlYW0gaGVhZGVycyAqLworICAgIHBvcyA9IDA7CisgICAgZm9yIChpbml0aWFsaXplZF9zdHJlYW1fY291bnQgPSAwOyBpbml0aWFsaXplZF9zdHJlYW1fY291bnQgPCBzLT5uYl9zdHJlYW1zOykgeworICAgICAgICBwb3MgPSBmaW5kX3N0YXJ0Y29kZShiYywgU1RSRUFNX1NUQVJUQ09ERSwgcG9zKSArIDE7CisgICAgICAgIGlmIChwb3MgPCAwICsgMSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vdCBhbGwgc3RyZWFtIGhlYWRlcnMgZm91bmQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChkZWNvZGVfc3RyZWFtX2hlYWRlcihudXQpID49IDApCisgICAgICAgICAgICBpbml0aWFsaXplZF9zdHJlYW1fY291bnQrKzsKKyAgICB9CisKKyAgICAvKiBpbmZvIGhlYWRlcnMgKi8KKyAgICBwb3MgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgdWludDY0X3Qgc3RhcnRjb2RlID0gZmluZF9hbnlfc3RhcnRjb2RlKGJjLCBwb3MpOworICAgICAgICBwb3MgPSBhdmlvX3RlbGwoYmMpOworCisgICAgICAgIGlmIChzdGFydGNvZGUgPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVPRiBiZWZvcmUgdmlkZW8gZnJhbWVzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSBTWU5DUE9JTlRfU1RBUlRDT0RFKSB7CisgICAgICAgICAgICBudXQtPm5leHRfc3RhcnRjb2RlID0gc3RhcnRjb2RlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRjb2RlICE9IElORk9fU1RBUlRDT0RFKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlY29kZV9pbmZvX2hlYWRlcihudXQpOworICAgIH0KKworICAgIHMtPmRhdGFfb2Zmc2V0ID0gcG9zIC0gODsKKworICAgIGlmIChiYy0+c2Vla2FibGUpIHsKKyAgICAgICAgaW50NjRfdCBvcmlnX3BvcyA9IGF2aW9fdGVsbChiYyk7CisgICAgICAgIGZpbmRfYW5kX2RlY29kZV9pbmRleChudXQpOworICAgICAgICBhdmlvX3NlZWsoYmMsIG9yaWdfcG9zLCBTRUVLX1NFVCk7CisgICAgfQorICAgIGF2X2Fzc2VydDAobnV0LT5uZXh0X3N0YXJ0Y29kZSA9PSBTWU5DUE9JTlRfU1RBUlRDT0RFKTsKKworICAgIGZmX21ldGFkYXRhX2NvbnZfY3R4KHMsIE5VTEwsIGZmX251dF9tZXRhZGF0YV9jb252KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfc21fZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpiYywgQVZQYWNrZXQgKnBrdCwgaW50IGlzX21ldGEsIGludDY0X3QgbWF4cG9zKQoreworICAgIGludCBjb3VudCA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOworICAgIGludCBza2lwX3N0YXJ0ID0gMDsKKyAgICBpbnQgc2tpcF9lbmQgPSAwOworICAgIGludCBjaGFubmVscyA9IDA7CisgICAgaW50NjRfdCBjaGFubmVsX2xheW91dCA9IDA7CisgICAgaW50IHNhbXBsZV9yYXRlID0gMDsKKyAgICBpbnQgd2lkdGggPSAwOworICAgIGludCBoZWlnaHQgPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgeworICAgICAgICB1aW50OF90IG5hbWVbMjU2XSwgc3RyX3ZhbHVlWzI1Nl0sIHR5cGVfc3RyWzI1Nl07CisgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgaWYgKGF2aW9fdGVsbChiYykgPj0gbWF4cG9zKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdldF9zdHIoYmMsIG5hbWUsIHNpemVvZihuYW1lKSk7CisgICAgICAgIHZhbHVlID0gZ2V0X3MoYmMpOworCisgICAgICAgIGlmICh2YWx1ZSA9PSAtMSkgeworICAgICAgICAgICAgZ2V0X3N0cihiYywgc3RyX3ZhbHVlLCBzaXplb2Yoc3RyX3ZhbHVlKSk7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIHN0cmluZyAlcyAvICVzXG4iLCBuYW1lLCBzdHJfdmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC0yKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBOVUxMOworICAgICAgICAgICAgaW50NjRfdCB2NjQsIHZhbHVlX2xlbjsKKworICAgICAgICAgICAgZ2V0X3N0cihiYywgdHlwZV9zdHIsIHNpemVvZih0eXBlX3N0cikpOworICAgICAgICAgICAgdmFsdWVfbGVuID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisgICAgICAgICAgICBpZiAoYXZpb190ZWxsKGJjKSArIHZhbHVlX2xlbiA+PSBtYXhwb3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiUGFsZXR0ZSIpKSB7CisgICAgICAgICAgICAgICAgZHN0ID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLCB2YWx1ZV9sZW4pOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJFeHRyYWRhdGEiKSkgeworICAgICAgICAgICAgICAgIGRzdCA9IGF2X3BhY2tldF9uZXdfc2lkZV9kYXRhKHBrdCwgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQSwgdmFsdWVfbGVuKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mKG5hbWUsICJDb2RlY1NwZWNpZmljU2lkZSUiU0NOZDY0IiIsICZ2NjQpID09IDEpIHsKKyAgICAgICAgICAgICAgICBkc3QgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX01BVFJPU0tBX0JMT0NLQURESVRJT05BTCwgdmFsdWVfbGVuICsgOCk7CisgICAgICAgICAgICAgICAgaWYoIWRzdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBBVl9XQjY0KGRzdCwgdjY0KTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiQ2hhbm5lbExheW91dCIpICYmIHZhbHVlX2xlbiA9PSA4KSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbF9sYXlvdXQgPSBhdmlvX3JsNjQoYmMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIGRhdGEgJXMgLyAlc1xuIiwgbmFtZSwgdHlwZV9zdHIpOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChiYywgdmFsdWVfbGVuKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFkc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGF2aW9fcmVhZChiYywgZHN0LCB2YWx1ZV9sZW4pOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC0zKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldF9zKGJjKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtNCkgeworICAgICAgICAgICAgdmFsdWUgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8IC00KSB7CisgICAgICAgICAgICBnZXRfcyhiYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiU2tpcFN0YXJ0IikpIHsKKyAgICAgICAgICAgICAgICBza2lwX3N0YXJ0ID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlNraXBFbmQiKSkgeworICAgICAgICAgICAgICAgIHNraXBfZW5kID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkNoYW5uZWxzIikpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVscyA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJTYW1wbGVSYXRlIikpIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZSA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJXaWR0aCIpKSB7CisgICAgICAgICAgICAgICAgd2lkdGggPSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiSGVpZ2h0IikpIHsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBpbnRlZ2VyICVzXG4iLCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjaGFubmVscyB8fCBjaGFubmVsX2xheW91dCB8fCBzYW1wbGVfcmF0ZSB8fCB3aWR0aCB8fCBoZWlnaHQpIHsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9QQVJBTV9DSEFOR0UsIDI4KTsKKyAgICAgICAgaWYgKCFkc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9DSEFOTkVMX0NPVU5UKighIWNoYW5uZWxzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9DSEFOTkVMX0xBWU9VVCooISFjaGFubmVsX2xheW91dCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NJREVfREFUQV9QQVJBTV9DSEFOR0VfU0FNUExFX1JBVEUqKCEhc2FtcGxlX3JhdGUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0RJTUVOU0lPTlMqKCEhKHdpZHRofGhlaWdodCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBpZiAoY2hhbm5lbHMpCisgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZkc3QsIGNoYW5uZWxzKTsKKyAgICAgICAgaWYgKGNoYW5uZWxfbGF5b3V0KQorICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGU2NCgmZHN0LCBjaGFubmVsX2xheW91dCk7CisgICAgICAgIGlmIChzYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmRzdCwgc2FtcGxlX3JhdGUpOworICAgICAgICBpZiAod2lkdGggfHwgaGVpZ2h0KXsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmRzdCwgd2lkdGgpOworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmZHN0LCBoZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNraXBfc3RhcnQgfHwgc2tpcF9lbmQpIHsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9TS0lQX1NBTVBMRVMsIDEwKTsKKyAgICAgICAgaWYgKCFkc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBBVl9XTDMyKGRzdCwgc2tpcF9zdGFydCk7CisgICAgICAgIEFWX1dMMzIoZHN0KzQsIHNraXBfZW5kKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWVfaGVhZGVyKE5VVENvbnRleHQgKm51dCwgaW50NjRfdCAqcHRzLCBpbnQgKnN0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpoZWFkZXJfaWR4LCBpbnQgZnJhbWVfY29kZSkKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKnMgPSBudXQtPmF2ZjsKKyAgICBBVklPQ29udGV4dCAqYmMgICAgPSBzLT5wYjsKKyAgICBTdHJlYW1Db250ZXh0ICpzdGM7CisgICAgaW50IHNpemUsIGZsYWdzLCBzaXplX211bCwgcHRzX2RlbHRhLCBpLCByZXNlcnZlZF9jb3VudDsKKyAgICB1aW50NjRfdCB0bXA7CisKKyAgICBpZiAoIShudXQtPmZsYWdzICYgTlVUX1BJUEUpICYmCisgICAgICAgIGF2aW9fdGVsbChiYykgPiBudXQtPmxhc3Rfc3luY3BvaW50X3BvcyArIG51dC0+bWF4X2Rpc3RhbmNlKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTGFzdCBmcmFtZSBtdXN0IGhhdmUgYmVlbiBkYW1hZ2VkICUiUFJJZDY0IiA+ICUiUFJJZDY0IiArICVkXG4iLAorICAgICAgICAgICAgICAgYXZpb190ZWxsKGJjKSwgbnV0LT5sYXN0X3N5bmNwb2ludF9wb3MsIG51dC0+bWF4X2Rpc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZmxhZ3MgICAgICAgICAgPSBudXQtPmZyYW1lX2NvZGVbZnJhbWVfY29kZV0uZmxhZ3M7CisgICAgc2l6ZV9tdWwgICAgICAgPSBudXQtPmZyYW1lX2NvZGVbZnJhbWVfY29kZV0uc2l6ZV9tdWw7CisgICAgc2l6ZSAgICAgICAgICAgPSBudXQtPmZyYW1lX2NvZGVbZnJhbWVfY29kZV0uc2l6ZV9sc2I7CisgICAgKnN0cmVhbV9pZCAgICAgPSBudXQtPmZyYW1lX2NvZGVbZnJhbWVfY29kZV0uc3RyZWFtX2lkOworICAgIHB0c19kZWx0YSAgICAgID0gbnV0LT5mcmFtZV9jb2RlW2ZyYW1lX2NvZGVdLnB0c19kZWx0YTsKKyAgICByZXNlcnZlZF9jb3VudCA9IG51dC0+ZnJhbWVfY29kZVtmcmFtZV9jb2RlXS5yZXNlcnZlZF9jb3VudDsKKyAgICAqaGVhZGVyX2lkeCAgICA9IG51dC0+ZnJhbWVfY29kZVtmcmFtZV9jb2RlXS5oZWFkZXJfaWR4OworCisgICAgaWYgKGZsYWdzICYgRkxBR19JTlZBTElEKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX0NPREVEKQorICAgICAgICBmbGFncyBePSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX1NUUkVBTV9JRCkgeworICAgICAgICBHRVRfVigqc3RyZWFtX2lkLCB0bXAgPCBzLT5uYl9zdHJlYW1zKTsKKyAgICB9CisgICAgc3RjID0gJm51dC0+c3RyZWFtWypzdHJlYW1faWRdOworICAgIGlmIChmbGFncyAmIEZMQUdfQ09ERURfUFRTKSB7CisgICAgICAgIGludCBjb2RlZF9wdHMgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICAgICAgLy8gRklYTUUgY2hlY2sgbGFzdF9wdHMgdmFsaWRpdHk/CisgICAgICAgIGlmIChjb2RlZF9wdHMgPCAoMSA8PCBzdGMtPm1zYl9wdHNfc2hpZnQpKSB7CisgICAgICAgICAgICAqcHRzID0gZmZfbHNiMmZ1bGwoc3RjLCBjb2RlZF9wdHMpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICpwdHMgPSBjb2RlZF9wdHMgLSAoMUxMIDw8IHN0Yy0+bXNiX3B0c19zaGlmdCk7CisgICAgfSBlbHNlCisgICAgICAgICpwdHMgPSBzdGMtPmxhc3RfcHRzICsgcHRzX2RlbHRhOworICAgIGlmIChmbGFncyAmIEZMQUdfU0laRV9NU0IpCisgICAgICAgIHNpemUgKz0gc2l6ZV9tdWwgKiBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX01BVENIX1RJTUUpCisgICAgICAgIGdldF9zKGJjKTsKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX0hFQURFUl9JRFgpCisgICAgICAgICpoZWFkZXJfaWR4ID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CisgICAgaWYgKGZsYWdzICYgRkxBR19SRVNFUlZFRCkKKyAgICAgICAgcmVzZXJ2ZWRfY291bnQgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVzZXJ2ZWRfY291bnQ7IGkrKykKKyAgICAgICAgZmZpb19yZWFkX3ZhcmxlbihiYyk7CisKKyAgICBpZiAoKmhlYWRlcl9pZHggPj0gKHVuc2lnbmVkKW51dC0+aGVhZGVyX2NvdW50KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJoZWFkZXJfaWR4IGludmFsaWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKHNpemUgPiA0MDk2KQorICAgICAgICAqaGVhZGVyX2lkeCA9IDA7CisgICAgc2l6ZSAtPSBudXQtPmhlYWRlcl9sZW5bKmhlYWRlcl9pZHhdOworCisgICAgaWYgKGZsYWdzICYgRkxBR19DSEVDS1NVTSkgeworICAgICAgICBhdmlvX3JiMzIoYmMpOyAvLyBGSVhNRSBjaGVjayB0aGlzCisgICAgfSBlbHNlIGlmICghKG51dC0+ZmxhZ3MgJiBOVVRfUElQRSkgJiYKKyAgICAgICAgICAgICAgIHNpemUgPiAyICogbnV0LT5tYXhfZGlzdGFuY2UgfHwKKyAgICAgICAgICAgICAgIEZGQUJTKHN0Yy0+bGFzdF9wdHMgLSAqcHRzKSA+IHN0Yy0+bWF4X3B0c19kaXN0YW5jZSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZnJhbWUgc2l6ZSA+IDJtYXhfZGlzdGFuY2UgYW5kIG5vIGNoZWNrc3VtXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3RjLT5sYXN0X3B0cyAgID0gKnB0czsKKyAgICBzdGMtPmxhc3RfZmxhZ3MgPSBmbGFnczsKKworICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShOVVRDb250ZXh0ICpudXQsIEFWUGFja2V0ICpwa3QsIGludCBmcmFtZV9jb2RlKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqcyA9IG51dC0+YXZmOworICAgIEFWSU9Db250ZXh0ICpiYyAgICA9IHMtPnBiOworICAgIGludCBzaXplLCBzdHJlYW1faWQsIGRpc2NhcmQsIHJldDsKKyAgICBpbnQ2NF90IHB0cywgbGFzdF9JUF9wdHM7CisgICAgU3RyZWFtQ29udGV4dCAqc3RjOworICAgIHVpbnQ4X3QgaGVhZGVyX2lkeDsKKworICAgIHNpemUgPSBkZWNvZGVfZnJhbWVfaGVhZGVyKG51dCwgJnB0cywgJnN0cmVhbV9pZCwgJmhlYWRlcl9pZHgsIGZyYW1lX2NvZGUpOworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIHNpemU7CisKKyAgICBzdGMgPSAmbnV0LT5zdHJlYW1bc3RyZWFtX2lkXTsKKworICAgIGlmIChzdGMtPmxhc3RfZmxhZ3MgJiBGTEFHX0tFWSkKKyAgICAgICAgc3RjLT5za2lwX3VudGlsX2tleV9mcmFtZSA9IDA7CisKKyAgICBkaXNjYXJkICAgICA9IHMtPnN0cmVhbXNbc3RyZWFtX2lkXS0+ZGlzY2FyZDsKKyAgICBsYXN0X0lQX3B0cyA9IHMtPnN0cmVhbXNbc3RyZWFtX2lkXS0+bGFzdF9JUF9wdHM7CisgICAgaWYgKChkaXNjYXJkID49IEFWRElTQ0FSRF9OT05LRVkgJiYgIShzdGMtPmxhc3RfZmxhZ3MgJiBGTEFHX0tFWSkpIHx8CisgICAgICAgIChkaXNjYXJkID49IEFWRElTQ0FSRF9CSURJUiAgJiYgbGFzdF9JUF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgIGxhc3RfSVBfcHRzID4gcHRzKSB8fAorICAgICAgICBkaXNjYXJkID49IEFWRElTQ0FSRF9BTEwgfHwKKyAgICAgICAgc3RjLT5za2lwX3VudGlsX2tleV9mcmFtZSkgeworICAgICAgICBhdmlvX3NraXAoYmMsIHNpemUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSArIG51dC0+aGVhZGVyX2xlbltoZWFkZXJfaWR4XSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgbWVtY3B5KHBrdC0+ZGF0YSwgbnV0LT5oZWFkZXJbaGVhZGVyX2lkeF0sIG51dC0+aGVhZGVyX2xlbltoZWFkZXJfaWR4XSk7CisgICAgcGt0LT5wb3MgPSBhdmlvX3RlbGwoYmMpOyAvLyBGSVhNRQorICAgIGlmIChzdGMtPmxhc3RfZmxhZ3MgJiBGTEFHX1NNX0RBVEEpIHsKKyAgICAgICAgaW50IHNtX3NpemU7CisgICAgICAgIGlmIChyZWFkX3NtX2RhdGEocywgYmMsIHBrdCwgMCwgcGt0LT5wb3MgKyBzaXplKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKHJlYWRfc21fZGF0YShzLCBiYywgcGt0LCAxLCBwa3QtPnBvcyArIHNpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBzbV9zaXplID0gYXZpb190ZWxsKGJjKSAtIHBrdC0+cG9zOworICAgICAgICBzaXplICAgICAgLT0gc21fc2l6ZTsKKyAgICAgICAgcGt0LT5zaXplIC09IHNtX3NpemU7CisgICAgfQorCisgICAgcmV0ID0gYXZpb19yZWFkKGJjLCBwa3QtPmRhdGEgKyBudXQtPmhlYWRlcl9sZW5baGVhZGVyX2lkeF0sIHNpemUpOworICAgIGlmIChyZXQgIT0gc2l6ZSkgeworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCBudXQtPmhlYWRlcl9sZW5baGVhZGVyX2lkeF0gKyByZXQpOworCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdHJlYW1faWQ7CisgICAgaWYgKHN0Yy0+bGFzdF9mbGFncyAmIEZMQUdfS0VZKQorICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICBwa3QtPnB0cyA9IHB0czsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG51dF9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTlVUQ29udGV4dCAqbnV0ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpiYyA9IHMtPnBiOworICAgIGludCBpLCBmcmFtZV9jb2RlID0gMCwgcmV0LCBza2lwOworICAgIGludDY0X3QgdHMsIGJhY2tfcHRyOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQ2NF90IHBvcyAgPSBhdmlvX3RlbGwoYmMpOworICAgICAgICB1aW50NjRfdCB0bXAgPSBudXQtPm5leHRfc3RhcnRjb2RlOworICAgICAgICBudXQtPm5leHRfc3RhcnRjb2RlID0gMDsKKworICAgICAgICBpZiAodG1wKSB7CisgICAgICAgICAgICBwb3MgLT0gODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lX2NvZGUgPSBhdmlvX3I4KGJjKTsKKyAgICAgICAgICAgIGlmIChhdmlvX2Zlb2YoYmMpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICAgICAgICAgIGlmIChmcmFtZV9jb2RlID09ICdOJykgeworICAgICAgICAgICAgICAgIHRtcCA9IGZyYW1lX2NvZGU7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcCA8PCA4KSArIGF2aW9fcjgoYmMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAodG1wKSB7CisgICAgICAgIGNhc2UgTUFJTl9TVEFSVENPREU6CisgICAgICAgIGNhc2UgU1RSRUFNX1NUQVJUQ09ERToKKyAgICAgICAgY2FzZSBJTkRFWF9TVEFSVENPREU6CisgICAgICAgICAgICBza2lwID0gZ2V0X3BhY2tldGhlYWRlcihudXQsIGJjLCAwLCB0bXApOworICAgICAgICAgICAgYXZpb19za2lwKGJjLCBza2lwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElORk9fU1RBUlRDT0RFOgorICAgICAgICAgICAgaWYgKGRlY29kZV9pbmZvX2hlYWRlcihudXQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIHJlc3luYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNZTkNQT0lOVF9TVEFSVENPREU6CisgICAgICAgICAgICBpZiAoZGVjb2RlX3N5bmNwb2ludChudXQsICZ0cywgJmJhY2tfcHRyKSA8IDApCisgICAgICAgICAgICAgICAgZ290byByZXN5bmM7CisgICAgICAgICAgICBmcmFtZV9jb2RlID0gYXZpb19yOChiYyk7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9mcmFtZShudXQsIHBrdCwgZnJhbWVfY29kZSk7CisgICAgICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIGlmIChyZXQgPT0gMSkgLy8gT0sgYnV0IGRpc2NhcmQgcGFja2V0CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CityZXN5bmM6CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAic3luY2luZyBmcm9tICUiUFJJZDY0IlxuIiwgcG9zKTsKKyAgICAgICAgICAgIHRtcCA9IGZpbmRfYW55X3N0YXJ0Y29kZShiYywgbnV0LT5sYXN0X3N5bmNwb2ludF9wb3MgKyAxKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJzeW5jXG4iKTsKKyAgICAgICAgICAgIG51dC0+bmV4dF9zdGFydGNvZGUgPSB0bXA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQ2NF90IG51dF9yZWFkX3RpbWVzdGFtcChBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqcG9zX2FyZywgaW50NjRfdCBwb3NfbGltaXQpCit7CisgICAgTlVUQ29udGV4dCAqbnV0ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpiYyA9IHMtPnBiOworICAgIGludDY0X3QgcG9zLCBwdHMsIGJhY2tfcHRyOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJyZWFkX3RpbWVzdGFtcChYLCVkLCUiUFJJZDY0IiwlIlBSSWQ2NCIpXG4iLAorICAgICAgICAgICBzdHJlYW1faW5kZXgsICpwb3NfYXJnLCBwb3NfbGltaXQpOworCisgICAgcG9zID0gKnBvc19hcmc7CisgICAgZG8geworICAgICAgICBwb3MgPSBmaW5kX3N0YXJ0Y29kZShiYywgU1lOQ1BPSU5UX1NUQVJUQ09ERSwgcG9zKSArIDE7CisgICAgICAgIGlmIChwb3MgPCAxKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicmVhZF90aW1lc3RhbXAgZmFpbGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChkZWNvZGVfc3luY3BvaW50KG51dCwgJnB0cywgJmJhY2tfcHRyKSA8IDApOworICAgICpwb3NfYXJnID0gcG9zIC0gMTsKKyAgICBhdl9hc3NlcnQwKG51dC0+bGFzdF9zeW5jcG9pbnRfcG9zID09ICpwb3NfYXJnKTsKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJyZXR1cm4gJSJQUklkNjQiICUiUFJJZDY0IlxuIiwgcHRzLCBiYWNrX3B0cik7CisgICAgaWYgKHN0cmVhbV9pbmRleCA9PSAtMikKKyAgICAgICAgcmV0dXJuIGJhY2tfcHRyOworICAgIGF2X2Fzc2VydDAoc3RyZWFtX2luZGV4ID09IC0xKTsKKyAgICByZXR1cm4gcHRzOworfQorCitzdGF0aWMgaW50IHJlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cywgaW50IGZsYWdzKQoreworICAgIE5VVENvbnRleHQgKm51dCAgICA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgICAgICAgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgU3luY3BvaW50IGR1bW15ICAgID0geyAudHMgPSBwdHMgKiBhdl9xMmQoc3QtPnRpbWVfYmFzZSkgKiBBVl9USU1FX0JBU0UgfTsKKyAgICBTeW5jcG9pbnQgbm9wdHNfc3AgPSB7IC50cyA9IEFWX05PUFRTX1ZBTFVFLCAuYmFja19wdHIgPSBBVl9OT1BUU19WQUxVRSB9OworICAgIFN5bmNwb2ludCAqc3AsICpuZXh0X25vZGVbMl0gPSB7ICZub3B0c19zcCwgJm5vcHRzX3NwIH07CisgICAgaW50NjRfdCBwb3MsIHBvczIsIHRzOworICAgIGludCBpOworCisgICAgaWYgKG51dC0+ZmxhZ3MgJiBOVVRfUElQRSkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGlmIChzdC0+aW5kZXhfZW50cmllcykgeworICAgICAgICBpbnQgaW5kZXggPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHN0LCBwdHMsIGZsYWdzKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgIGluZGV4ID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdCwgcHRzLCBmbGFncyBeIEFWU0VFS19GTEFHX0JBQ0tXQVJEKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBwb3MyID0gc3QtPmluZGV4X2VudHJpZXNbaW5kZXhdLnBvczsKKyAgICAgICAgdHMgICA9IHN0LT5pbmRleF9lbnRyaWVzW2luZGV4XS50aW1lc3RhbXA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfdHJlZV9maW5kKG51dC0+c3luY3BvaW50cywgJmR1bW15LCAodm9pZCAqKSBmZl9udXRfc3BfcHRzX2NtcCwKKyAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSBuZXh0X25vZGUpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiJSJQUkl1NjQiLSUiUFJJdTY0IiAlIlBSSWQ2NCItJSJQUklkNjQiXG4iLAorICAgICAgICAgICAgICAgbmV4dF9ub2RlWzBdLT5wb3MsIG5leHRfbm9kZVsxXS0+cG9zLCBuZXh0X25vZGVbMF0tPnRzLAorICAgICAgICAgICAgICAgbmV4dF9ub2RlWzFdLT50cyk7CisgICAgICAgIHBvcyA9IGZmX2dlbl9zZWFyY2gocywgLTEsIGR1bW15LnRzLCBuZXh0X25vZGVbMF0tPnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X25vZGVbMV0tPnBvcywgbmV4dF9ub2RlWzFdLT5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9ub2RlWzBdLT50cywgbmV4dF9ub2RlWzFdLT50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlNFRUtfRkxBR19CQUNLV0FSRCwgJnRzLCBudXRfcmVhZF90aW1lc3RhbXApOworCisgICAgICAgIGlmICghKGZsYWdzICYgQVZTRUVLX0ZMQUdfQkFDS1dBUkQpKSB7CisgICAgICAgICAgICBkdW1teS5wb3MgICAgPSBwb3MgKyAxNjsKKyAgICAgICAgICAgIG5leHRfbm9kZVsxXSA9ICZub3B0c19zcDsKKyAgICAgICAgICAgIGF2X3RyZWVfZmluZChudXQtPnN5bmNwb2ludHMsICZkdW1teSwgKHZvaWQgKikgZmZfbnV0X3NwX3Bvc19jbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopIG5leHRfbm9kZSk7CisgICAgICAgICAgICBwb3MyID0gZmZfZ2VuX3NlYXJjaChzLCAtMiwgZHVtbXkucG9zLCBuZXh0X25vZGVbMF0tPnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfbm9kZVsxXS0+cG9zLCBuZXh0X25vZGVbMV0tPnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfbm9kZVswXS0+YmFja19wdHIsIG5leHRfbm9kZVsxXS0+YmFja19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgJnRzLCBudXRfcmVhZF90aW1lc3RhbXApOworICAgICAgICAgICAgaWYgKHBvczIgPj0gMCkKKyAgICAgICAgICAgICAgICBwb3MgPSBwb3MyOworICAgICAgICAgICAgLy8gRklYTUUgZGlyIGJ1dCBJIHRoaW5rIGl0IGRvZXMgbm90IG1hdHRlcgorICAgICAgICB9CisgICAgICAgIGR1bW15LnBvcyA9IHBvczsKKyAgICAgICAgc3AgPSBhdl90cmVlX2ZpbmQobnV0LT5zeW5jcG9pbnRzLCAmZHVtbXksICh2b2lkICopIGZmX251dF9zcF9wb3NfY21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICBhdl9hc3NlcnQwKHNwKTsKKyAgICAgICAgcG9zMiA9IHNwLT5iYWNrX3B0ciAtIDE1OworICAgIH0KKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiU0VFS1RPOiAlIlBSSWQ2NCJcbiIsIHBvczIpOworICAgIHBvcyA9IGZpbmRfc3RhcnRjb2RlKHMtPnBiLCBTWU5DUE9JTlRfU1RBUlRDT0RFLCBwb3MyKTsKKyAgICBhdmlvX3NlZWsocy0+cGIsIHBvcywgU0VFS19TRVQpOworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJTUDogJSJQUklkNjQiXG4iLCBwb3MpOworICAgIGlmIChwb3MyID4gcG9zIHx8IHBvczIgKyAxNSA8IHBvcykKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIm5vIHN5bmNwb2ludCBhdCBiYWNrcHRyIHBvc1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgbnV0LT5zdHJlYW1baV0uc2tpcF91bnRpbF9rZXlfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnV0X3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIE5VVENvbnRleHQgKm51dCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGF2X2ZyZWVwKCZudXQtPnRpbWVfYmFzZSk7CisgICAgYXZfZnJlZXAoJm51dC0+c3RyZWFtKTsKKyAgICBmZl9udXRfZnJlZV9zcChudXQpOworICAgIGZvciAoaSA9IDE7IGkgPCBudXQtPmhlYWRlcl9jb3VudDsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmbnV0LT5oZWFkZXJbaV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbnV0X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm51dCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5VVCIpLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX1NFRUtfVE9fUFRTLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihOVVRDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBudXRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gbnV0X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IG51dF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBudXRfcmVhZF9jbG9zZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSByZWFkX3NlZWssCisgICAgLmV4dGVuc2lvbnMgICAgID0gIm51dCIsCisgICAgLmNvZGVjX3RhZyAgICAgID0gZmZfbnV0X2NvZGVjX3RhZ3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L251dGVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L251dGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MjRlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbnV0ZW5jLmMKQEAgLTAsMCArMSwxMjM0IEBACisvKgorICogbnV0IG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNyBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdHJlZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVnYXVkaW9kYXRhLmgiCisjaW5jbHVkZSAibnV0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAicmlmZi5oIgorCitzdGF0aWMgaW50IGZpbmRfZXhwZWN0ZWRfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICpjLCBpbnQgc2l6ZSwgaW50IGtleV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvdXRbNjRdKQoreworICAgIGludCBzYW1wbGVfcmF0ZSA9IGMtPnNhbXBsZV9yYXRlOworCisgICAgaWYgKHNpemUgPiA0MDk2KQorICAgICAgICByZXR1cm4gMDsKKworICAgIEFWX1dCMjQob3V0LCAxKTsKKworICAgIGlmIChjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgeworICAgICAgICBpZiAoa2V5X2ZyYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dFszXSA9IDB4QjY7CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzFWSURFTyB8fAorICAgICAgICAgICAgICAgYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykgeworICAgICAgICByZXR1cm4gMzsKKyAgICB9IGVsc2UgaWYgKGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgcmV0dXJuIDM7CisgICAgfSBlbHNlIGlmIChjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMgfHwKKyAgICAgICAgICAgICAgIGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMikgeworICAgICAgICBpbnQgbHNmLCBtcGVnMjUsIHNhbXBsZV9yYXRlX2luZGV4LCBiaXRyYXRlX2luZGV4LCBmcmFtZV9zaXplOworICAgICAgICBpbnQgbGF5ZXIgICAgICAgICAgID0gYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzID8gMyA6IDI7CisgICAgICAgIHVuc2lnbmVkIGludCBoZWFkZXIgPSAweEZGRjAwMDAwOworCisgICAgICAgIGxzZiAgICAgICAgICAgPSBzYW1wbGVfcmF0ZSA8ICgyNDAwMCArIDMyMDAwKSAvIDI7CisgICAgICAgIG1wZWcyNSAgICAgICAgPSBzYW1wbGVfcmF0ZSA8ICgxMjAwMCArIDE2MDAwKSAvIDI7CisgICAgICAgIHNhbXBsZV9yYXRlIDw8PSBsc2YgKyBtcGVnMjU7CisgICAgICAgIGlmICAgICAgKHNhbXBsZV9yYXRlIDwgKDMyMDAwICsgNDQxMDApIC8gMikgc2FtcGxlX3JhdGVfaW5kZXggPSAyOworICAgICAgICBlbHNlIGlmIChzYW1wbGVfcmF0ZSA8ICg0NDEwMCArIDQ4MDAwKSAvIDIpIHNhbXBsZV9yYXRlX2luZGV4ID0gMDsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZV9pbmRleCA9IDE7CisKKyAgICAgICAgc2FtcGxlX3JhdGUgPSBhdnByaXZfbXBhX2ZyZXFfdGFiW3NhbXBsZV9yYXRlX2luZGV4XSA+PiAobHNmICsgbXBlZzI1KTsKKworICAgICAgICBmb3IgKGJpdHJhdGVfaW5kZXggPSAyOyBiaXRyYXRlX2luZGV4IDwgMzA7IGJpdHJhdGVfaW5kZXgrKykgeworICAgICAgICAgICAgZnJhbWVfc2l6ZSA9CisgICAgICAgICAgICAgICAgYXZwcml2X21wYV9iaXRyYXRlX3RhYltsc2ZdW2xheWVyIC0gMV1bYml0cmF0ZV9pbmRleCA+PiAxXTsKKyAgICAgICAgICAgIGZyYW1lX3NpemUgPSAoZnJhbWVfc2l6ZSAqIDE0NDAwMCkgLyAoc2FtcGxlX3JhdGUgPDwgbHNmKSArCisgICAgICAgICAgICAgICAgKGJpdHJhdGVfaW5kZXggJiAxKTsKKworICAgICAgICAgICAgaWYgKGZyYW1lX3NpemUgPT0gc2l6ZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGhlYWRlciB8PSAoIWxzZikgPDwgMTk7CisgICAgICAgIGhlYWRlciB8PSAoNCAtIGxheWVyKSA8PCAxNzsKKyAgICAgICAgaGVhZGVyIHw9IDEgPDwgMTY7IC8vbm8gY3JjCisgICAgICAgIEFWX1dCMzIob3V0LCBoZWFkZXIpOworICAgICAgICBpZiAoc2l6ZSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIDI7ICAvL3dlIGd1ZXNzIHRoZXJlIGlzIG5vIGNyYywgaWYgdGhlcmUgaXMgb25lIHRoZSB1c2VyIGNsZWFybHkgZG9lcyBub3QgY2FyZSBhYm91dCBvdmVyaGVhZAorICAgICAgICBpZiAoYml0cmF0ZV9pbmRleCA9PSAzMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsgIC8vc29tZXRoaW5nIGlzIHdyb25nIC4uLgorCisgICAgICAgIGhlYWRlciB8PSAoYml0cmF0ZV9pbmRleCA+PiAxKSA8PCAxMjsKKyAgICAgICAgaGVhZGVyIHw9IHNhbXBsZV9yYXRlX2luZGV4IDw8IDEwOworICAgICAgICBoZWFkZXIgfD0gKGJpdHJhdGVfaW5kZXggJiAxKSA8PCA5OworCisgICAgICAgIHJldHVybiAyOyAvL0ZJWE1FIGFjdHVhbGx5IHB1dCB0aGUgbmVlZGVkIG9uZXMgaW4gYnVpbGRfZWxpc2lvbl9oZWFkZXJzKCkKKyAgICAgICAgLy9yZXR1cm4gMzsgLy93ZSBndWVzcyB0aGF0IHRoZSBwcml2YXRlIGJpdCBpcyBub3Qgc2V0CisvL0ZJWE1FIHRoZSBhYm92ZSBhc3N1bXB0aW9ucyBzaG91bGQgYmUgY2hlY2tlZCwgaWYgdGhlc2UgdHVybiBvdXQgZmFsc2UgdG9vIG9mdGVuIHNvbWV0aGluZyBzaG91bGQgYmUgZG9uZQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW5kX2hlYWRlcl9pZHgoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqYywgaW50IHNpemUsIGludCBmcmFtZV90eXBlKQoreworICAgIE5VVENvbnRleHQgKm51dCA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50OF90IG91dFs2NF07CisgICAgaW50IGk7CisgICAgaW50IGxlbiA9IGZpbmRfZXhwZWN0ZWRfaGVhZGVyKGMsIHNpemUsIGZyYW1lX3R5cGUsIG91dCk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgbnV0LT5oZWFkZXJfY291bnQ7IGkrKykgeworICAgICAgICBpZiAobGVuID09IG51dC0+aGVhZGVyX2xlbltpXSAmJiAhbWVtY21wKG91dCwgbnV0LT5oZWFkZXJbaV0sIGxlbikpIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2VsaXNpb25faGVhZGVycyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTlVUQ29udGV4dCAqbnV0ID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpOworICAgIC8vRklYTUUgdGhpcyBpcyBsYW1lCisgICAgLy9GSVhNRSB3cml0ZSBhIDJwYXNzIG1vZGUgdG8gZmluZCB0aGUgbWF4aW1hbCBoZWFkZXJzCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaGVhZGVyc1tdWzVdID0geworICAgICAgICB7IDMsIDB4MDAsIDB4MDAsIDB4MDEgfSwKKyAgICAgICAgeyA0LCAweDAwLCAweDAwLCAweDAxLCAweEI2fSwKKyAgICAgICAgeyAyLCAweEZGLCAweEZBIH0sIC8vbXAzK2NyYworICAgICAgICB7IDIsIDB4RkYsIDB4RkIgfSwgLy9tcDMKKyAgICAgICAgeyAyLCAweEZGLCAweEZDIH0sIC8vbXAyK2NyYworICAgICAgICB7IDIsIDB4RkYsIDB4RkQgfSwgLy9tcDIKKyAgICB9OworCisgICAgbnV0LT5oZWFkZXJfY291bnQgPSA3OworICAgIGZvciAoaSA9IDE7IGkgPCBudXQtPmhlYWRlcl9jb3VudDsgaSsrKSB7CisgICAgICAgIG51dC0+aGVhZGVyX2xlbltpXSA9IGhlYWRlcnNbaSAtIDFdWzBdOworICAgICAgICBudXQtPmhlYWRlcltpXSAgICAgPSAmaGVhZGVyc1tpIC0gMV1bMV07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBidWlsZF9mcmFtZV9jb2RlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBOVVRDb250ZXh0ICpudXQgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGtleV9mcmFtZSwgaW5kZXgsIHByZWQsIHN0cmVhbV9pZDsKKyAgICBpbnQgc3RhcnQgPSAxOworICAgIGludCBlbmQgICA9IDI1NDsKKyAgICBpbnQga2V5ZnJhbWVfMF9lc2MgPSBzLT5uYl9zdHJlYW1zID4gMjsKKyAgICBpbnQgcHJlZF90YWJsZVsxMF07CisgICAgRnJhbWVDb2RlICpmdDsKKworICAgIGZ0ICAgICAgICAgICAgPSAmbnV0LT5mcmFtZV9jb2RlW3N0YXJ0XTsKKyAgICBmdC0+ZmxhZ3MgICAgID0gRkxBR19DT0RFRDsKKyAgICBmdC0+c2l6ZV9tdWwgID0gMTsKKyAgICBmdC0+cHRzX2RlbHRhID0gMTsKKyAgICBzdGFydCsrOworCisgICAgaWYgKGtleWZyYW1lXzBfZXNjKSB7CisgICAgICAgIC8qIGtleWZyYW1lID0gMCBlc2NhcGUgKi8KKyAgICAgICAgRnJhbWVDb2RlICpmdCA9ICZudXQtPmZyYW1lX2NvZGVbc3RhcnRdOworICAgICAgICBmdC0+ZmxhZ3MgICAgPSBGTEFHX1NUUkVBTV9JRCB8IEZMQUdfU0laRV9NU0IgfCBGTEFHX0NPREVEX1BUUzsKKyAgICAgICAgZnQtPnNpemVfbXVsID0gMTsKKyAgICAgICAgc3RhcnQrKzsKKyAgICB9CisKKyAgICBmb3IgKHN0cmVhbV9pZCA9IDA7IHN0cmVhbV9pZCA8IHMtPm5iX3N0cmVhbXM7IHN0cmVhbV9pZCsrKSB7CisgICAgICAgIGludCBzdGFydDIgPSBzdGFydCArIChlbmQgLSBzdGFydCkgKiBzdHJlYW1faWQgICAgICAgLyBzLT5uYl9zdHJlYW1zOworICAgICAgICBpbnQgZW5kMiAgID0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpICogKHN0cmVhbV9pZCArIDEpIC8gcy0+bmJfc3RyZWFtczsKKyAgICAgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gcy0+c3RyZWFtc1tzdHJlYW1faWRdLT5jb2RlYzsKKyAgICAgICAgaW50IGlzX2F1ZGlvICAgICAgICAgID0gY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBpbnQgaW50cmFfb25seSAgICAgICAgPSAvKmNvZGVjLT5pbnRyYV9vbmx5IHx8ICovIGlzX2F1ZGlvOworICAgICAgICBpbnQgcHJlZF9jb3VudDsKKyAgICAgICAgaW50IGZyYW1lX3NpemUgPSAwOworCisgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGZyYW1lX3NpemUgPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oY29kZWMsIDApOworICAgICAgICAgICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WT1JCSVMgJiYgIWZyYW1lX3NpemUpCisgICAgICAgICAgICAgICAgZnJhbWVfc2l6ZSA9IDY0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVZSYXRpb25hbCBmID0gYXZfZGl2X3EoY29kZWMtPnRpbWVfYmFzZSwgKm51dC0+c3RyZWFtW3N0cmVhbV9pZF0udGltZV9iYXNlKTsKKyAgICAgICAgICAgIGlmIChmLmRlbiA9PSAxICYmIGYubnVtPjApCisgICAgICAgICAgICAgICAgZnJhbWVfc2l6ZSA9IGYubnVtOworICAgICAgICB9CisgICAgICAgIGlmICghZnJhbWVfc2l6ZSkKKyAgICAgICAgICAgIGZyYW1lX3NpemUgPSAxOworCisgICAgICAgIGZvciAoa2V5X2ZyYW1lID0gMDsga2V5X2ZyYW1lIDwgMjsga2V5X2ZyYW1lKyspIHsKKyAgICAgICAgICAgIGlmICghaW50cmFfb25seSB8fCAha2V5ZnJhbWVfMF9lc2MgfHwga2V5X2ZyYW1lICE9IDApIHsKKyAgICAgICAgICAgICAgICBGcmFtZUNvZGUgKmZ0ID0gJm51dC0+ZnJhbWVfY29kZVtzdGFydDJdOworICAgICAgICAgICAgICAgIGZ0LT5mbGFncyAgICAgPSBGTEFHX0tFWSAqIGtleV9mcmFtZTsKKyAgICAgICAgICAgICAgICBmdC0+ZmxhZ3MgICAgfD0gRkxBR19TSVpFX01TQiB8IEZMQUdfQ09ERURfUFRTOworICAgICAgICAgICAgICAgIGZ0LT5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CisgICAgICAgICAgICAgICAgZnQtPnNpemVfbXVsICA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGlzX2F1ZGlvKQorICAgICAgICAgICAgICAgICAgICBmdC0+aGVhZGVyX2lkeCA9IGZpbmRfaGVhZGVyX2lkeChzLCBjb2RlYywgLTEsIGtleV9mcmFtZSk7CisgICAgICAgICAgICAgICAgc3RhcnQyKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBrZXlfZnJhbWUgPSBpbnRyYV9vbmx5OworI2lmIDEKKyAgICAgICAgaWYgKGlzX2F1ZGlvKSB7CisgICAgICAgICAgICBpbnQgZnJhbWVfYnl0ZXMgPSBjb2RlYy0+ZnJhbWVfc2l6ZSAqIChpbnQ2NF90KWNvZGVjLT5iaXRfcmF0ZSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCAqIGNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBpbnQgcHRzOworICAgICAgICAgICAgZm9yIChwdHMgPSAwOyBwdHMgPCAyOyBwdHMrKykgeworICAgICAgICAgICAgICAgIGZvciAocHJlZCA9IDA7IHByZWQgPCAyOyBwcmVkKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRnJhbWVDb2RlICpmdCAgPSAmbnV0LT5mcmFtZV9jb2RlW3N0YXJ0Ml07CisgICAgICAgICAgICAgICAgICAgIGZ0LT5mbGFncyAgICAgID0gRkxBR19LRVkgKiBrZXlfZnJhbWU7CisgICAgICAgICAgICAgICAgICAgIGZ0LT5zdHJlYW1faWQgID0gc3RyZWFtX2lkOworICAgICAgICAgICAgICAgICAgICBmdC0+c2l6ZV9tdWwgICA9IGZyYW1lX2J5dGVzICsgMjsKKyAgICAgICAgICAgICAgICAgICAgZnQtPnNpemVfbHNiICAgPSBmcmFtZV9ieXRlcyArIHByZWQ7CisgICAgICAgICAgICAgICAgICAgIGZ0LT5wdHNfZGVsdGEgID0gcHRzICogZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgZnQtPmhlYWRlcl9pZHggPSBmaW5kX2hlYWRlcl9pZHgocywgY29kZWMsIGZyYW1lX2J5dGVzICsgcHJlZCwga2V5X2ZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRnJhbWVDb2RlICpmdCA9ICZudXQtPmZyYW1lX2NvZGVbc3RhcnQyXTsKKyAgICAgICAgICAgIGZ0LT5mbGFncyAgICAgPSBGTEFHX0tFWSB8IEZMQUdfU0laRV9NU0I7CisgICAgICAgICAgICBmdC0+c3RyZWFtX2lkID0gc3RyZWFtX2lkOworICAgICAgICAgICAgZnQtPnNpemVfbXVsICA9IDE7CisgICAgICAgICAgICBmdC0+cHRzX2RlbHRhID0gZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgIHN0YXJ0MisrOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAoY29kZWMtPmhhc19iX2ZyYW1lcykgeworICAgICAgICAgICAgcHJlZF9jb3VudCAgICA9IDU7CisgICAgICAgICAgICBwcmVkX3RhYmxlWzBdID0gLTI7CisgICAgICAgICAgICBwcmVkX3RhYmxlWzFdID0gLTE7CisgICAgICAgICAgICBwcmVkX3RhYmxlWzJdID0gMTsKKyAgICAgICAgICAgIHByZWRfdGFibGVbM10gPSAzOworICAgICAgICAgICAgcHJlZF90YWJsZVs0XSA9IDQ7CisgICAgICAgIH0gZWxzZSBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZPUkJJUykgeworICAgICAgICAgICAgcHJlZF9jb3VudCAgICA9IDM7CisgICAgICAgICAgICBwcmVkX3RhYmxlWzBdID0gMjsKKyAgICAgICAgICAgIHByZWRfdGFibGVbMV0gPSA5OworICAgICAgICAgICAgcHJlZF90YWJsZVsyXSA9IDE2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJlZF9jb3VudCAgICA9IDE7CisgICAgICAgICAgICBwcmVkX3RhYmxlWzBdID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAocHJlZCA9IDA7IHByZWQgPCBwcmVkX2NvdW50OyBwcmVkKyspIHsKKyAgICAgICAgICAgIGludCBzdGFydDMgPSBzdGFydDIgKyAoZW5kMiAtIHN0YXJ0MikgKiBwcmVkIC8gcHJlZF9jb3VudDsKKyAgICAgICAgICAgIGludCBlbmQzICAgPSBzdGFydDIgKyAoZW5kMiAtIHN0YXJ0MikgKiAocHJlZCArIDEpIC8gcHJlZF9jb3VudDsKKworICAgICAgICAgICAgcHJlZF90YWJsZVtwcmVkXSAqPSBmcmFtZV9zaXplOworCisgICAgICAgICAgICBmb3IgKGluZGV4ID0gc3RhcnQzOyBpbmRleCA8IGVuZDM7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBGcmFtZUNvZGUgKmZ0ID0gJm51dC0+ZnJhbWVfY29kZVtpbmRleF07CisgICAgICAgICAgICAgICAgZnQtPmZsYWdzICAgICA9IEZMQUdfS0VZICoga2V5X2ZyYW1lOworICAgICAgICAgICAgICAgIGZ0LT5mbGFncyAgICB8PSBGTEFHX1NJWkVfTVNCOworICAgICAgICAgICAgICAgIGZ0LT5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CisvL0ZJWE1FIHVzZSBzaW5nbGUgYnl0ZSBzaXplIGFuZCBwcmVkIGZyb20gbGFzdAorICAgICAgICAgICAgICAgIGZ0LT5zaXplX211bCAgPSBlbmQzIC0gc3RhcnQzOworICAgICAgICAgICAgICAgIGZ0LT5zaXplX2xzYiAgPSBpbmRleCAtIHN0YXJ0MzsKKyAgICAgICAgICAgICAgICBmdC0+cHRzX2RlbHRhID0gcHJlZF90YWJsZVtwcmVkXTsKKyAgICAgICAgICAgICAgICBpZiAoaXNfYXVkaW8pCisgICAgICAgICAgICAgICAgICAgIGZ0LT5oZWFkZXJfaWR4ID0gZmluZF9oZWFkZXJfaWR4KHMsIGNvZGVjLCAtMSwga2V5X2ZyYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtZW1tb3ZlKCZudXQtPmZyYW1lX2NvZGVbJ04nICsgMV0sICZudXQtPmZyYW1lX2NvZGVbJ04nXSwgc2l6ZW9mKEZyYW1lQ29kZSkgKiAoMjU1IC0gJ04nKSk7CisgICAgbnV0LT5mcmFtZV9jb2RlWzBdLmZsYWdzICAgICAgID0KKyAgICAgICAgbnV0LT5mcmFtZV9jb2RlWzI1NV0uZmxhZ3MgPQorICAgICAgICBudXQtPmZyYW1lX2NvZGVbJ04nXS5mbGFncyA9IEZMQUdfSU5WQUxJRDsKK30KKworc3RhdGljIHZvaWQgcHV0X3R0KE5VVENvbnRleHQgKm51dCwgQVZSYXRpb25hbCAqdGltZV9iYXNlLCBBVklPQ29udGV4dCAqYmMsIHVpbnQ2NF90IHZhbCkKK3sKKyAgICB2YWwgKj0gbnV0LT50aW1lX2Jhc2VfY291bnQ7CisgICAgdmFsICs9IHRpbWVfYmFzZSAtIG51dC0+dGltZV9iYXNlOworICAgIGZmX3B1dF92KGJjLCB2YWwpOworfQorLyoqCisgKiBTdG9yZSBhIHN0cmluZyBhcyB2Yi4KKyAqLworc3RhdGljIHZvaWQgcHV0X3N0cihBVklPQ29udGV4dCAqYmMsIGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKyAgICBpbnQgbGVuID0gc3RybGVuKHN0cmluZyk7CisKKyAgICBmZl9wdXRfdihiYywgbGVuKTsKKyAgICBhdmlvX3dyaXRlKGJjLCBzdHJpbmcsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9zKEFWSU9Db250ZXh0ICpiYywgaW50NjRfdCB2YWwpCit7CisgICAgZmZfcHV0X3YoYmMsIDIgKiBGRkFCUyh2YWwpIC0gKHZhbCA+IDApKTsKK30KKworI2lmZGVmIFRSQUNFCitzdGF0aWMgaW5saW5lIHZvaWQgZmZfcHV0X3ZfdHJhY2UoQVZJT0NvbnRleHQgKmJjLCB1aW50NjRfdCB2LCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQoreworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJmZl9wdXRfdiAlNSJQUklkNjQiIC8gJSJQUklYNjQiIGluICVzICVzOiVkXG4iLCB2LCB2LCBmaWxlLCBmdW5jLCBsaW5lKTsKKworICAgIGZmX3B1dF92KGJjLCB2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9zX3RyYWNlKEFWSU9Db250ZXh0ICpiYywgaW50NjRfdCB2LCBjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKK3sKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAicHV0X3MgJTUiUFJJZDY0IiAvICUiUFJJWDY0IiBpbiAlcyAlczolZFxuIiwgdiwgdiwgZmlsZSwgZnVuYywgbGluZSk7CisKKyAgICBwdXRfcyhiYywgdik7Cit9CisjZGVmaW5lIGZmX3B1dF92KGJjLCB2KSAgZmZfcHV0X3ZfdHJhY2UoYmMsIHYsIF9fRklMRV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNkZWZpbmUgcHV0X3MoYmMsIHYpICBwdXRfc190cmFjZShiYywgdiwgX19GSUxFX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fKQorI2VuZGlmCisKKy8vRklYTUUgcmVtb3ZlIGNhbGN1bGF0ZV9jaGVja3N1bQorc3RhdGljIHZvaWQgcHV0X3BhY2tldChOVVRDb250ZXh0ICpudXQsIEFWSU9Db250ZXh0ICpiYywgQVZJT0NvbnRleHQgKmR5bl9iYywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbGN1bGF0ZV9jaGVja3N1bSwgdWludDY0X3Qgc3RhcnRjb2RlKQoreworICAgIHVpbnQ4X3QgKmR5bl9idWYgPSBOVUxMOworICAgIGludCBkeW5fc2l6ZSAgICAgPSBhdmlvX2Nsb3NlX2R5bl9idWYoZHluX2JjLCAmZHluX2J1Zik7CisgICAgaW50IGZvcndfcHRyICAgICA9IGR5bl9zaXplICsgNCAqIGNhbGN1bGF0ZV9jaGVja3N1bTsKKworICAgIGlmIChmb3J3X3B0ciA+IDQwOTYpCisgICAgICAgIGZmaW9faW5pdF9jaGVja3N1bShiYywgZmZfY3JjMDRDMTFEQjdfdXBkYXRlLCAwKTsKKyAgICBhdmlvX3diNjQoYmMsIHN0YXJ0Y29kZSk7CisgICAgZmZfcHV0X3YoYmMsIGZvcndfcHRyKTsKKyAgICBpZiAoZm9yd19wdHIgPiA0MDk2KQorICAgICAgICBhdmlvX3dsMzIoYmMsIGZmaW9fZ2V0X2NoZWNrc3VtKGJjKSk7CisKKyAgICBpZiAoY2FsY3VsYXRlX2NoZWNrc3VtKQorICAgICAgICBmZmlvX2luaXRfY2hlY2tzdW0oYmMsIGZmX2NyYzA0QzExREI3X3VwZGF0ZSwgMCk7CisgICAgYXZpb193cml0ZShiYywgZHluX2J1ZiwgZHluX3NpemUpOworICAgIGlmIChjYWxjdWxhdGVfY2hlY2tzdW0pCisgICAgICAgIGF2aW9fd2wzMihiYywgZmZpb19nZXRfY2hlY2tzdW0oYmMpKTsKKworICAgIGF2X2ZyZWUoZHluX2J1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX21haW5oZWFkZXIoTlVUQ29udGV4dCAqbnV0LCBBVklPQ29udGV4dCAqYmMpCit7CisgICAgaW50IGksIGosIHRtcF9wdHMsIHRtcF9mbGFncywgdG1wX3N0cmVhbSwgdG1wX211bCwgdG1wX3NpemUsIHRtcF9maWVsZHMsCisgICAgICAgIHRtcF9oZWFkX2lkeDsKKyAgICBpbnQ2NF90IHRtcF9tYXRjaDsKKworICAgIGZmX3B1dF92KGJjLCBudXQtPnZlcnNpb24pOworICAgIGlmIChudXQtPnZlcnNpb24gPiAzKQorICAgICAgICBmZl9wdXRfdihiYywgbnV0LT5taW5vcl92ZXJzaW9uID0gMSk7CisgICAgZmZfcHV0X3YoYmMsIG51dC0+YXZmLT5uYl9zdHJlYW1zKTsKKyAgICBmZl9wdXRfdihiYywgbnV0LT5tYXhfZGlzdGFuY2UpOworICAgIGZmX3B1dF92KGJjLCBudXQtPnRpbWVfYmFzZV9jb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnV0LT50aW1lX2Jhc2VfY291bnQ7IGkrKykgeworICAgICAgICBmZl9wdXRfdihiYywgbnV0LT50aW1lX2Jhc2VbaV0ubnVtKTsKKyAgICAgICAgZmZfcHV0X3YoYmMsIG51dC0+dGltZV9iYXNlW2ldLmRlbik7CisgICAgfQorCisgICAgdG1wX3B0cyAgICAgID0gMDsKKyAgICB0bXBfbXVsICAgICAgPSAxOworICAgIHRtcF9zdHJlYW0gICA9IDA7CisgICAgdG1wX21hdGNoICAgID0gMSAtICgxTEwgPDwgNjIpOworICAgIHRtcF9oZWFkX2lkeCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKSB7CisgICAgICAgIHRtcF9maWVsZHMgPSAwOworICAgICAgICB0bXBfc2l6ZSAgID0gMDsKKy8vICAgICAgICB0bXBfcmVzPTA7CisgICAgICAgIGlmICh0bXBfcHRzICAgICAgIT0gbnV0LT5mcmFtZV9jb2RlW2ldLnB0c19kZWx0YSApIHRtcF9maWVsZHMgPSAxOworICAgICAgICBpZiAodG1wX211bCAgICAgICE9IG51dC0+ZnJhbWVfY29kZVtpXS5zaXplX211bCAgKSB0bXBfZmllbGRzID0gMjsKKyAgICAgICAgaWYgKHRtcF9zdHJlYW0gICAhPSBudXQtPmZyYW1lX2NvZGVbaV0uc3RyZWFtX2lkICkgdG1wX2ZpZWxkcyA9IDM7CisgICAgICAgIGlmICh0bXBfc2l6ZSAgICAgIT0gbnV0LT5mcmFtZV9jb2RlW2ldLnNpemVfbHNiICApIHRtcF9maWVsZHMgPSA0OworLy8gICAgICAgIGlmICh0bXBfcmVzICAgICE9IG51dC0+ZnJhbWVfY29kZVtpXS5yZXMgICAgICAgICAgICApIHRtcF9maWVsZHM9NTsKKyAgICAgICAgaWYgKHRtcF9oZWFkX2lkeCAhPSBudXQtPmZyYW1lX2NvZGVbaV0uaGVhZGVyX2lkeCkgdG1wX2ZpZWxkcyA9IDg7CisKKyAgICAgICAgdG1wX3B0cyAgICA9IG51dC0+ZnJhbWVfY29kZVtpXS5wdHNfZGVsdGE7CisgICAgICAgIHRtcF9mbGFncyAgPSBudXQtPmZyYW1lX2NvZGVbaV0uZmxhZ3M7CisgICAgICAgIHRtcF9zdHJlYW0gPSBudXQtPmZyYW1lX2NvZGVbaV0uc3RyZWFtX2lkOworICAgICAgICB0bXBfbXVsICAgID0gbnV0LT5mcmFtZV9jb2RlW2ldLnNpemVfbXVsOworICAgICAgICB0bXBfc2l6ZSAgID0gbnV0LT5mcmFtZV9jb2RlW2ldLnNpemVfbHNiOworLy8gICAgICAgIHRtcF9yZXMgICA9IG51dC0+ZnJhbWVfY29kZVtpXS5yZXM7CisgICAgICAgIHRtcF9oZWFkX2lkeCA9IG51dC0+ZnJhbWVfY29kZVtpXS5oZWFkZXJfaWR4OworCisgICAgICAgIGZvciAoaiA9IDA7IGkgPCAyNTY7IGorKywgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA9PSAnTicpIHsKKyAgICAgICAgICAgICAgICBqLS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnV0LT5mcmFtZV9jb2RlW2ldLnB0c19kZWx0YSAgIT0gdG1wX3B0cyAgICAgIHx8CisgICAgICAgICAgICAgICAgbnV0LT5mcmFtZV9jb2RlW2ldLmZsYWdzICAgICAgIT0gdG1wX2ZsYWdzICAgIHx8CisgICAgICAgICAgICAgICAgbnV0LT5mcmFtZV9jb2RlW2ldLnN0cmVhbV9pZCAgIT0gdG1wX3N0cmVhbSAgIHx8CisgICAgICAgICAgICAgICAgbnV0LT5mcmFtZV9jb2RlW2ldLnNpemVfbXVsICAgIT0gdG1wX211bCAgICAgIHx8CisgICAgICAgICAgICAgICAgbnV0LT5mcmFtZV9jb2RlW2ldLnNpemVfbHNiICAgIT0gdG1wX3NpemUgKyBqIHx8CisvLyAgICAgICAgICAgICAgbnV0LT5mcmFtZV9jb2RlW2ldLnJlcyAgICAgICAgIT0gdG1wX3JlcyAgICAgIHx8CisgICAgICAgICAgICAgICAgbnV0LT5mcmFtZV9jb2RlW2ldLmhlYWRlcl9pZHggIT0gdG1wX2hlYWRfaWR4KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChqICE9IHRtcF9tdWwgLSB0bXBfc2l6ZSkKKyAgICAgICAgICAgIHRtcF9maWVsZHMgPSA2OworCisgICAgICAgIGZmX3B1dF92KGJjLCB0bXBfZmxhZ3MpOworICAgICAgICBmZl9wdXRfdihiYywgdG1wX2ZpZWxkcyk7CisgICAgICAgIGlmICh0bXBfZmllbGRzID4gMCkgcHV0X3MoYmMsIHRtcF9wdHMpOworICAgICAgICBpZiAodG1wX2ZpZWxkcyA+IDEpIGZmX3B1dF92KGJjLCB0bXBfbXVsKTsKKyAgICAgICAgaWYgKHRtcF9maWVsZHMgPiAyKSBmZl9wdXRfdihiYywgdG1wX3N0cmVhbSk7CisgICAgICAgIGlmICh0bXBfZmllbGRzID4gMykgZmZfcHV0X3YoYmMsIHRtcF9zaXplKTsKKyAgICAgICAgaWYgKHRtcF9maWVsZHMgPiA0KSBmZl9wdXRfdihiYywgMCAvKnRtcF9yZXMqLyk7CisgICAgICAgIGlmICh0bXBfZmllbGRzID4gNSkgZmZfcHV0X3YoYmMsIGopOworICAgICAgICBpZiAodG1wX2ZpZWxkcyA+IDYpIGZmX3B1dF92KGJjLCB0bXBfbWF0Y2gpOworICAgICAgICBpZiAodG1wX2ZpZWxkcyA+IDcpIGZmX3B1dF92KGJjLCB0bXBfaGVhZF9pZHgpOworICAgIH0KKyAgICBmZl9wdXRfdihiYywgbnV0LT5oZWFkZXJfY291bnQgLSAxKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbnV0LT5oZWFkZXJfY291bnQ7IGkrKykgeworICAgICAgICBmZl9wdXRfdihiYywgbnV0LT5oZWFkZXJfbGVuW2ldKTsKKyAgICAgICAgYXZpb193cml0ZShiYywgbnV0LT5oZWFkZXJbaV0sIG51dC0+aGVhZGVyX2xlbltpXSk7CisgICAgfQorICAgIC8vIGZsYWdzIGhhZCBiZWVuIGVmZmVjdGl2ZWx5IGludHJvZHVjZWQgaW4gdmVyc2lvbiA0CisgICAgaWYgKG51dC0+dmVyc2lvbiA+IDMpCisgICAgICAgIGZmX3B1dF92KGJjLCBudXQtPmZsYWdzKTsKK30KKworc3RhdGljIGludCB3cml0ZV9zdHJlYW1oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZJT0NvbnRleHQgKmJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBpbnQgaSkKK3sKKyAgICBOVVRDb250ZXh0ICpudXQgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHN0LT5jb2RlYzsKKworICAgIGZmX3B1dF92KGJjLCBpKTsKKyAgICBzd2l0Y2ggKGNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86ICAgIGZmX3B1dF92KGJjLCAwKTsgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86ICAgIGZmX3B1dF92KGJjLCAxKTsgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6IGZmX3B1dF92KGJjLCAyKTsgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIGZmX3B1dF92KGJjLCAzKTsgYnJlYWs7CisgICAgfQorICAgIGZmX3B1dF92KGJjLCA0KTsKKyAgICBpZiAoY29kZWMtPmNvZGVjX3RhZykgeworICAgICAgICBhdmlvX3dsMzIoYmMsIGNvZGVjLT5jb2RlY190YWcpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gY29kZWMgdGFnIGRlZmluZWQgZm9yIHN0cmVhbSAlZFxuIiwgaSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZmZfcHV0X3YoYmMsIG51dC0+c3RyZWFtW2ldLnRpbWVfYmFzZSAtIG51dC0+dGltZV9iYXNlKTsKKyAgICBmZl9wdXRfdihiYywgbnV0LT5zdHJlYW1baV0ubXNiX3B0c19zaGlmdCk7CisgICAgZmZfcHV0X3YoYmMsIG51dC0+c3RyZWFtW2ldLm1heF9wdHNfZGlzdGFuY2UpOworICAgIGZmX3B1dF92KGJjLCBjb2RlYy0+aGFzX2JfZnJhbWVzKTsKKyAgICBhdmlvX3c4KGJjLCAwKTsgLyogZmxhZ3M6IDB4MSAtIGZpeGVkX2ZwcywgMHgyIC0gaW5kZXhfcHJlc2VudCAqLworCisgICAgZmZfcHV0X3YoYmMsIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgYXZpb193cml0ZShiYywgY29kZWMtPmV4dHJhZGF0YSwgY29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKworICAgIHN3aXRjaCAoY29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgZmZfcHV0X3YoYmMsIGNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGZmX3B1dF92KGJjLCAxKTsKKyAgICAgICAgZmZfcHV0X3YoYmMsIGNvZGVjLT5jaGFubmVscyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBmZl9wdXRfdihiYywgY29kZWMtPndpZHRoKTsKKyAgICAgICAgZmZfcHV0X3YoYmMsIGNvZGVjLT5oZWlnaHQpOworCisgICAgICAgIGlmIChzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPD0gMCB8fAorICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuIDw9IDApIHsKKyAgICAgICAgICAgIGZmX3B1dF92KGJjLCAwKTsKKyAgICAgICAgICAgIGZmX3B1dF92KGJjLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZmX3B1dF92KGJjLCBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pOworICAgICAgICAgICAgZmZfcHV0X3YoYmMsIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisgICAgICAgIH0KKyAgICAgICAgZmZfcHV0X3YoYmMsIDApOyAvKiBjc3AgdHlwZSAtLSB1bmtub3duICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfaW5mbyhBVklPQ29udGV4dCAqYmMsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIHB1dF9zdHIoYmMsIHR5cGUpOworICAgIHB1dF9zKGJjLCAtMSk7CisgICAgcHV0X3N0cihiYywgdmFsdWUpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHdyaXRlX2dsb2JhbGluZm8oTlVUQ29udGV4dCAqbnV0LCBBVklPQ29udGV4dCAqYmMpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpzICAgPSBudXQtPmF2ZjsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IE5VTEw7CisgICAgQVZJT0NvbnRleHQgKmR5bl9iYzsKKyAgICB1aW50OF90ICpkeW5fYnVmID0gTlVMTDsKKyAgICBpbnQgY291bnQgICAgICAgID0gMCwgZHluX3NpemU7CisgICAgaW50IHJldCAgICAgICAgICA9IGF2aW9fb3Blbl9keW5fYnVmKCZkeW5fYmMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKKyAgICAgICAgY291bnQgKz0gYWRkX2luZm8oZHluX2JjLCB0LT5rZXksIHQtPnZhbHVlKTsKKworICAgIGZmX3B1dF92KGJjLCAwKTsgLy9zdHJlYW1faWZfcGx1czEKKyAgICBmZl9wdXRfdihiYywgMCk7IC8vY2hhcHRlcl9pZAorICAgIGZmX3B1dF92KGJjLCAwKTsgLy90aW1lc3RhbXBfc3RhcnQKKyAgICBmZl9wdXRfdihiYywgMCk7IC8vbGVuZ3RoCisKKyAgICBmZl9wdXRfdihiYywgY291bnQpOworCisgICAgZHluX3NpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYoZHluX2JjLCAmZHluX2J1Zik7CisgICAgYXZpb193cml0ZShiYywgZHluX2J1ZiwgZHluX3NpemUpOworICAgIGF2X2ZyZWUoZHluX2J1Zik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfc3RyZWFtaW5mbyhOVVRDb250ZXh0ICpudXQsIEFWSU9Db250ZXh0ICpiYywgaW50IHN0cmVhbV9pZCkgeworICAgIEFWRm9ybWF0Q29udGV4dCAqcz0gbnV0LT5hdmY7CisgICAgQVZTdHJlYW0qIHN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faWRdOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICBBVklPQ29udGV4dCAqZHluX2JjOworICAgIHVpbnQ4X3QgKmR5bl9idWY9TlVMTDsKKyAgICBpbnQgY291bnQ9MCwgZHluX3NpemUsIGk7CisgICAgaW50IHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZkeW5fYmMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAiIiwgdCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpCisgICAgICAgIGNvdW50ICs9IGFkZF9pbmZvKGR5bl9iYywgdC0+a2V5LCB0LT52YWx1ZSk7CisgICAgZm9yIChpPTA7IGZmX251dF9kaXNwb3NpdGlvbnNbaV0uZmxhZzsgKytpKSB7CisgICAgICAgIGlmIChzdC0+ZGlzcG9zaXRpb24gJiBmZl9udXRfZGlzcG9zaXRpb25zW2ldLmZsYWcpCisgICAgICAgICAgICBjb3VudCArPSBhZGRfaW5mbyhkeW5fYmMsICJEaXNwb3NpdGlvbiIsIGZmX251dF9kaXNwb3NpdGlvbnNbaV0uc3RyKTsKKyAgICB9CisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgdWludDhfdCBidWZbMjU2XTsKKyAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkLyVkIiwgc3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuLCBzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW0pOworICAgICAgICBjb3VudCArPSBhZGRfaW5mbyhkeW5fYmMsICJyX2ZyYW1lX3JhdGUiLCBidWYpOworICAgIH0KKyAgICBkeW5fc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1ZihkeW5fYmMsICZkeW5fYnVmKTsKKworICAgIGlmIChjb3VudCkgeworICAgICAgICBmZl9wdXRfdihiYywgc3RyZWFtX2lkICsgMSk7IC8vc3RyZWFtX2lkX3BsdXMxCisgICAgICAgIGZmX3B1dF92KGJjLCAwKTsgLy9jaGFwdGVyX2lkCisgICAgICAgIGZmX3B1dF92KGJjLCAwKTsgLy90aW1lc3RhbXBfc3RhcnQKKyAgICAgICAgZmZfcHV0X3YoYmMsIDApOyAvL2xlbmd0aAorCisgICAgICAgIGZmX3B1dF92KGJjLCBjb3VudCk7CisKKyAgICAgICAgYXZpb193cml0ZShiYywgZHluX2J1ZiwgZHluX3NpemUpOworICAgIH0KKworICAgIGF2X2ZyZWUoZHluX2J1Zik7CisgICAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHdyaXRlX2NoYXB0ZXIoTlVUQ29udGV4dCAqbnV0LCBBVklPQ29udGV4dCAqYmMsIGludCBpZCkKK3sKKyAgICBBVklPQ29udGV4dCAqZHluX2JjOworICAgIHVpbnQ4X3QgKmR5bl9idWYgICAgID0gTlVMTDsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IE5VTEw7CisgICAgQVZDaGFwdGVyICpjaCAgICAgICAgPSBudXQtPmF2Zi0+Y2hhcHRlcnNbaWRdOworICAgIGludCByZXQsIGR5bl9zaXplLCBjb3VudCA9IDA7CisKKyAgICByZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmZHluX2JjKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZmX3B1dF92KGJjLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtX2lkX3BsdXMxCisgICAgcHV0X3MoYmMsIGlkICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFwdGVyX2lkCisgICAgcHV0X3R0KG51dCwgbnV0LT5jaGFwdGVyW2lkXS50aW1lX2Jhc2UsIGJjLCBjaC0+c3RhcnQpOyAvLyBjaGFwdGVyX3N0YXJ0CisgICAgZmZfcHV0X3YoYmMsIGNoLT5lbmQgLSBjaC0+c3RhcnQpOyAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFwdGVyX2xlbgorCisgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQoY2gtPm1ldGFkYXRhLCAiIiwgdCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpCisgICAgICAgIGNvdW50ICs9IGFkZF9pbmZvKGR5bl9iYywgdC0+a2V5LCB0LT52YWx1ZSk7CisKKyAgICBmZl9wdXRfdihiYywgY291bnQpOworCisgICAgZHluX3NpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYoZHluX2JjLCAmZHluX2J1Zik7CisgICAgYXZpb193cml0ZShiYywgZHluX2J1ZiwgZHluX3NpemUpOworICAgIGF2X2ZyZWVwKCZkeW5fYnVmKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9pbmRleChOVVRDb250ZXh0ICpudXQsIEFWSU9Db250ZXh0ICpiYykgeworICAgIGludCBpOworICAgIFN5bmNwb2ludCBkdW1teT0geyAucG9zPSAwIH07CisgICAgU3luY3BvaW50ICpuZXh0X25vZGVbMl0gPSB7IE5VTEwgfTsKKyAgICBpbnQ2NF90IHN0YXJ0cG9zID0gYXZpb190ZWxsKGJjKTsKKyAgICBpbnQ2NF90IHBheWxvYWRfc2l6ZTsKKworICAgIHB1dF90dChudXQsIG51dC0+bWF4X3B0c190YiwgYmMsIG51dC0+bWF4X3B0cyk7CisKKyAgICBmZl9wdXRfdihiYywgbnV0LT5zcF9jb3VudCk7CisKKyAgICBmb3IgKGk9MDsgaTxudXQtPnNwX2NvdW50OyBpKyspIHsKKyAgICAgICAgYXZfdHJlZV9maW5kKG51dC0+c3luY3BvaW50cywgJmR1bW15LCAodm9pZCAqKSBmZl9udXRfc3BfcG9zX2NtcCwgKHZvaWQqKiluZXh0X25vZGUpOworICAgICAgICBmZl9wdXRfdihiYywgKG5leHRfbm9kZVsxXS0+cG9zID4+IDQpIC0gKGR1bW15LnBvcz4+NCkpOworICAgICAgICBkdW1teS5wb3MgPSBuZXh0X25vZGVbMV0tPnBvczsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxudXQtPmF2Zi0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIFN0cmVhbUNvbnRleHQgKm51cz0gJm51dC0+c3RyZWFtW2ldOworICAgICAgICBpbnQ2NF90IGxhc3RfcHRzPSAtMTsKKyAgICAgICAgaW50IGosIGs7CisgICAgICAgIGZvciAoaj0wOyBqPG51dC0+c3BfY291bnQ7IGorKykgeworICAgICAgICAgICAgaW50IGZsYWc7CisgICAgICAgICAgICBpbnQgbiA9IDA7CisKKyAgICAgICAgICAgIGlmIChqICYmIG51cy0+a2V5ZnJhbWVfcHRzW2pdID09IG51cy0+a2V5ZnJhbWVfcHRzW2otMV0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobnV0LT5hdmYsIEFWX0xPR19XQVJOSU5HLCAiTXVsdGlwbGUga2V5ZnJhbWVzIHdpdGggc2FtZSBQVFNcbiIpOworICAgICAgICAgICAgICAgIG51cy0+a2V5ZnJhbWVfcHRzW2pdID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsYWcgPSAobnVzLT5rZXlmcmFtZV9wdHNbal0gIT0gQVZfTk9QVFNfVkFMVUUpIF4gKGorMSA9PSBudXQtPnNwX2NvdW50KTsKKyAgICAgICAgICAgIGZvciAoOyBqPG51dC0+c3BfY291bnQgJiYgKG51cy0+a2V5ZnJhbWVfcHRzW2pdICE9IEFWX05PUFRTX1ZBTFVFKSA9PSBmbGFnOyBqKyspCisgICAgICAgICAgICAgICAgbisrOworCisgICAgICAgICAgICBmZl9wdXRfdihiYywgMSArIDIqZmxhZyArIDQqbik7CisgICAgICAgICAgICBmb3IgKGs9IGogLSBuOyBrPD1qICYmIGs8bnV0LT5zcF9jb3VudDsgaysrKSB7CisgICAgICAgICAgICAgICAgaWYgKG51cy0+a2V5ZnJhbWVfcHRzW2tdID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKG51cy0+a2V5ZnJhbWVfcHRzW2tdID4gbGFzdF9wdHMpOworICAgICAgICAgICAgICAgIGZmX3B1dF92KGJjLCBudXMtPmtleWZyYW1lX3B0c1trXSAtIGxhc3RfcHRzKTsKKyAgICAgICAgICAgICAgICBsYXN0X3B0cyA9IG51cy0+a2V5ZnJhbWVfcHRzW2tdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcGF5bG9hZF9zaXplID0gYXZpb190ZWxsKGJjKSAtIHN0YXJ0cG9zICsgOCArIDQ7CisKKyAgICBhdmlvX3diNjQoYmMsIDggKyBwYXlsb2FkX3NpemUgKyBhdl9sb2cyKHBheWxvYWRfc2l6ZSkgLyA3ICsgMSArIDQqKHBheWxvYWRfc2l6ZSA+IDQwOTYpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2hlYWRlcnMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZJT0NvbnRleHQgKmJjKQoreworICAgIE5VVENvbnRleHQgKm51dCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKmR5bl9iYzsKKyAgICBpbnQgaSwgcmV0OworCisgICAgZmZfbWV0YWRhdGFfY29udl9jdHgoYXZjdHgsIGZmX251dF9tZXRhZGF0YV9jb252LCBOVUxMKTsKKworICAgIHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZkeW5fYmMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHdyaXRlX21haW5oZWFkZXIobnV0LCBkeW5fYmMpOworICAgIHB1dF9wYWNrZXQobnV0LCBiYywgZHluX2JjLCAxLCBNQUlOX1NUQVJUQ09ERSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnV0LT5hdmYtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICByZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmZHluX2JjKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSB3cml0ZV9zdHJlYW1oZWFkZXIoYXZjdHgsIGR5bl9iYywgbnV0LT5hdmYtPnN0cmVhbXNbaV0sIGkpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHB1dF9wYWNrZXQobnV0LCBiYywgZHluX2JjLCAxLCBTVFJFQU1fU1RBUlRDT0RFKTsKKyAgICB9CisKKyAgICByZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmZHluX2JjKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB3cml0ZV9nbG9iYWxpbmZvKG51dCwgZHluX2JjKTsKKyAgICBwdXRfcGFja2V0KG51dCwgYmMsIGR5bl9iYywgMSwgSU5GT19TVEFSVENPREUpOworCisgICAgZm9yIChpID0gMDsgaSA8IG51dC0+YXZmLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJmR5bl9iYyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0ID0gd3JpdGVfc3RyZWFtaW5mbyhudXQsIGR5bl9iYywgaSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHJldCA+IDApCisgICAgICAgICAgICBwdXRfcGFja2V0KG51dCwgYmMsIGR5bl9iYywgMSwgSU5GT19TVEFSVENPREUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICAgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1ZihkeW5fYmMsICZidWYpOworICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG51dC0+YXZmLT5uYl9jaGFwdGVyczsgaSsrKSB7CisgICAgICAgIHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZkeW5fYmMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IHdyaXRlX2NoYXB0ZXIobnV0LCBkeW5fYmMsIGkpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgdWludDhfdCAqYnVmOworICAgICAgICAgICAgYXZpb19jbG9zZV9keW5fYnVmKGR5bl9iYywgJmJ1Zik7CisgICAgICAgICAgICBhdl9mcmVlcCgmYnVmKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcHV0X3BhY2tldChudXQsIGJjLCBkeW5fYmMsIDEsIElORk9fU1RBUlRDT0RFKTsKKyAgICB9CisKKyAgICBudXQtPmxhc3Rfc3luY3BvaW50X3BvcyA9IElOVF9NSU47CisgICAgbnV0LT5oZWFkZXJfY291bnQrKzsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudXRfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBOVVRDb250ZXh0ICpudXQgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKmJjID0gcy0+cGI7CisgICAgaW50IGksIGosIHJldDsKKworICAgIG51dC0+YXZmID0gczsKKworICAgIG51dC0+dmVyc2lvbiA9IEZGTUFYKE5VVF9TVEFCTEVfVkVSU0lPTiwgMyArICEhbnV0LT5mbGFncyk7CisgICAgaWYgKG51dC0+dmVyc2lvbiA+IDMgJiYgcy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID4gRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUaGUgYWRkaXRpb25hbCBzeW5jcG9pbnQgbW9kZXMgcmVxdWlyZSB2ZXJzaW9uICVkLCAiCisgICAgICAgICAgICAgICAidGhhdCBpcyBjdXJyZW50bHkgbm90IGZpbmFsaXplZCwgIgorICAgICAgICAgICAgICAgInBsZWFzZSBzZXQgLWZfc3RyaWN0IGV4cGVyaW1lbnRhbCBpbiBvcmRlciB0byBlbmFibGUgaXQuXG4iLAorICAgICAgICAgICAgICAgbnV0LT52ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhQRVJJTUVOVEFMOworICAgIH0KKworICAgIG51dC0+c3RyZWFtICAgPSBhdl9jYWxsb2Mocy0+bmJfc3RyZWFtcywgIHNpemVvZigqbnV0LT5zdHJlYW0gKSk7CisgICAgbnV0LT5jaGFwdGVyICA9IGF2X2NhbGxvYyhzLT5uYl9jaGFwdGVycywgc2l6ZW9mKCpudXQtPmNoYXB0ZXIpKTsKKyAgICBudXQtPnRpbWVfYmFzZT0gYXZfY2FsbG9jKHMtPm5iX3N0cmVhbXMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmJfY2hhcHRlcnMsIHNpemVvZigqbnV0LT50aW1lX2Jhc2UpKTsKKyAgICBpZiAoIW51dC0+c3RyZWFtIHx8ICFudXQtPmNoYXB0ZXIgfHwgIW51dC0+dGltZV9iYXNlKSB7CisgICAgICAgIGF2X2ZyZWVwKCZudXQtPnN0cmVhbSk7CisgICAgICAgIGF2X2ZyZWVwKCZudXQtPmNoYXB0ZXIpOworICAgICAgICBhdl9mcmVlcCgmbnV0LT50aW1lX2Jhc2UpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaW50IHNzaXplOworICAgICAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsKKyAgICAgICAgZmZfcGFyc2Vfc3BlY2lmaWNfcGFyYW1zKHN0LCAmdGltZV9iYXNlLmRlbiwgJnNzaXplLCAmdGltZV9iYXNlLm51bSk7CisKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSkgeworICAgICAgICAgICAgdGltZV9iYXNlID0gKEFWUmF0aW9uYWwpIHsxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRpbWVfYmFzZSA9IGZmX2Nob29zZV90aW1lYmFzZShzLCBzdCwgNDgwMDApOworICAgICAgICB9CisKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHRpbWVfYmFzZS5udW0sIHRpbWVfYmFzZS5kZW4pOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBudXQtPnRpbWVfYmFzZV9jb3VudDsgaisrKQorICAgICAgICAgICAgaWYgKCFtZW1jbXAoJnRpbWVfYmFzZSwgJm51dC0+dGltZV9iYXNlW2pdLCBzaXplb2YoQVZSYXRpb25hbCkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIG51dC0+dGltZV9iYXNlW2pdICAgICAgICA9IHRpbWVfYmFzZTsKKyAgICAgICAgbnV0LT5zdHJlYW1baV0udGltZV9iYXNlID0gJm51dC0+dGltZV9iYXNlW2pdOworICAgICAgICBpZiAoaiA9PSBudXQtPnRpbWVfYmFzZV9jb3VudCkKKyAgICAgICAgICAgIG51dC0+dGltZV9iYXNlX2NvdW50Kys7CisKKyAgICAgICAgaWYgKElOVDY0X0MoMTAwMCkgKiB0aW1lX2Jhc2UubnVtID49IHRpbWVfYmFzZS5kZW4pCisgICAgICAgICAgICBudXQtPnN0cmVhbVtpXS5tc2JfcHRzX3NoaWZ0ID0gNzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbnV0LT5zdHJlYW1baV0ubXNiX3B0c19zaGlmdCA9IDE0OworICAgICAgICBudXQtPnN0cmVhbVtpXS5tYXhfcHRzX2Rpc3RhbmNlID0KKyAgICAgICAgICAgIEZGTUFYKHRpbWVfYmFzZS5kZW4sIHRpbWVfYmFzZS5udW0pIC8gdGltZV9iYXNlLm51bTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhcHRlcnM7IGkrKykgeworICAgICAgICBBVkNoYXB0ZXIgKmNoID0gcy0+Y2hhcHRlcnNbaV07CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG51dC0+dGltZV9iYXNlX2NvdW50OyBqKyspCisgICAgICAgICAgICBpZiAoIW1lbWNtcCgmY2gtPnRpbWVfYmFzZSwgJm51dC0+dGltZV9iYXNlW2pdLCBzaXplb2YoQVZSYXRpb25hbCkpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIG51dC0+dGltZV9iYXNlW2pdICAgICAgICAgPSBjaC0+dGltZV9iYXNlOworICAgICAgICBudXQtPmNoYXB0ZXJbaV0udGltZV9iYXNlID0gJm51dC0+dGltZV9iYXNlW2pdOworICAgICAgICBpZiAoaiA9PSBudXQtPnRpbWVfYmFzZV9jb3VudCkKKyAgICAgICAgICAgIG51dC0+dGltZV9iYXNlX2NvdW50Kys7CisgICAgfQorCisgICAgbnV0LT5tYXhfZGlzdGFuY2UgPSBNQVhfRElTVEFOQ0U7CisgICAgYnVpbGRfZWxpc2lvbl9oZWFkZXJzKHMpOworICAgIGJ1aWxkX2ZyYW1lX2NvZGUocyk7CisgICAgYXZfYXNzZXJ0MChudXQtPmZyYW1lX2NvZGVbJ04nXS5mbGFncyA9PSBGTEFHX0lOVkFMSUQpOworCisgICAgYXZpb193cml0ZShiYywgSURfU1RSSU5HLCBzdHJsZW4oSURfU1RSSU5HKSk7CisgICAgYXZpb193OChiYywgMCk7CisKKyAgICBpZiAoKHJldCA9IHdyaXRlX2hlYWRlcnMocywgYmMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+YXZvaWRfbmVnYXRpdmVfdHMgPCAwKQorICAgICAgICBzLT5hdm9pZF9uZWdhdGl2ZV90cyA9IDE7CisKKyAgICBhdmlvX2ZsdXNoKGJjKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9uZWVkZWRfZmxhZ3MoTlVUQ29udGV4dCAqbnV0LCBTdHJlYW1Db250ZXh0ICpudXMsIEZyYW1lQ29kZSAqZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgaWYgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpCisgICAgICAgIGZsYWdzIHw9IEZMQUdfS0VZOworICAgIGlmIChwa3QtPnN0cmVhbV9pbmRleCAhPSBmYy0+c3RyZWFtX2lkKQorICAgICAgICBmbGFncyB8PSBGTEFHX1NUUkVBTV9JRDsKKyAgICBpZiAocGt0LT5zaXplIC8gZmMtPnNpemVfbXVsKQorICAgICAgICBmbGFncyB8PSBGTEFHX1NJWkVfTVNCOworICAgIGlmIChwa3QtPnB0cyAtIG51cy0+bGFzdF9wdHMgIT0gZmMtPnB0c19kZWx0YSkKKyAgICAgICAgZmxhZ3MgfD0gRkxBR19DT0RFRF9QVFM7CisgICAgaWYgKHBrdC0+c2lkZV9kYXRhX2VsZW1zICYmIG51dC0+dmVyc2lvbiA+IDMpCisgICAgICAgIGZsYWdzIHw9IEZMQUdfU01fREFUQTsKKyAgICBpZiAocGt0LT5zaXplID4gMiAqIG51dC0+bWF4X2Rpc3RhbmNlKQorICAgICAgICBmbGFncyB8PSBGTEFHX0NIRUNLU1VNOworICAgIGlmIChGRkFCUyhwa3QtPnB0cyAtIG51cy0+bGFzdF9wdHMpID4gbnVzLT5tYXhfcHRzX2Rpc3RhbmNlKQorICAgICAgICBmbGFncyB8PSBGTEFHX0NIRUNLU1VNOworICAgIGlmIChwa3QtPnNpemUgPCBudXQtPmhlYWRlcl9sZW5bZmMtPmhlYWRlcl9pZHhdIHx8CisgICAgICAgIChwa3QtPnNpemUgPiA0MDk2ICYmIGZjLT5oZWFkZXJfaWR4KSAgICAgICAgfHwKKyAgICAgICAgbWVtY21wKHBrdC0+ZGF0YSwgbnV0LT5oZWFkZXJbZmMtPmhlYWRlcl9pZHhdLAorICAgICAgICAgICAgICAgbnV0LT5oZWFkZXJfbGVuW2ZjLT5oZWFkZXJfaWR4XSkpCisgICAgICAgIGZsYWdzIHw9IEZMQUdfSEVBREVSX0lEWDsKKworICAgIHJldHVybiBmbGFncyB8IChmYy0+ZmxhZ3MgJiBGTEFHX0NPREVEKTsKK30KKworc3RhdGljIGludCBmaW5kX2Jlc3RfaGVhZGVyX2lkeChOVVRDb250ZXh0ICpudXQsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IGk7CisgICAgaW50IGJlc3RfaSAgID0gMDsKKyAgICBpbnQgYmVzdF9sZW4gPSAwOworCisgICAgaWYgKHBrdC0+c2l6ZSA+IDQwOTYpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpID0gMTsgaSA8IG51dC0+aGVhZGVyX2NvdW50OyBpKyspCisgICAgICAgIGlmIChwa3QtPnNpemUgPj0gbnV0LT5oZWFkZXJfbGVuW2ldCisgICAgICAgICAgICAmJiBudXQtPmhlYWRlcl9sZW5baV0gPiBiZXN0X2xlbgorICAgICAgICAgICAgJiYgIW1lbWNtcChwa3QtPmRhdGEsIG51dC0+aGVhZGVyW2ldLCBudXQtPmhlYWRlcl9sZW5baV0pKSB7CisgICAgICAgICAgICBiZXN0X2kgICA9IGk7CisgICAgICAgICAgICBiZXN0X2xlbiA9IG51dC0+aGVhZGVyX2xlbltpXTsKKyAgICAgICAgfQorICAgIHJldHVybiBiZXN0X2k7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfc21fZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpiYywgQVZQYWNrZXQgKnBrdCwgaW50IGlzX21ldGEpCit7CisgICAgaW50IHJldCwgaSwgZHluX3NpemU7CisgICAgdW5zaWduZWQgZmxhZ3M7CisgICAgQVZJT0NvbnRleHQgKmR5bl9iYzsKKyAgICBpbnQgc21fZGF0YV9jb3VudCA9IDA7CisgICAgdWludDhfdCB0bXBbMjU2XTsKKyAgICB1aW50OF90ICpkeW5fYnVmOworCisgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJmR5bl9iYyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpPHBrdC0+c2lkZV9kYXRhX2VsZW1zOyBpKyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IHBrdC0+c2lkZV9kYXRhW2ldLmRhdGE7CisgICAgICAgIGludCBzaXplID0gcGt0LT5zaWRlX2RhdGFbaV0uc2l6ZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YV9lbmQgPSBkYXRhICsgc2l6ZTsKKworICAgICAgICBpZiAoaXNfbWV0YSkgeworICAgICAgICAgICAgaWYgKCAgIHBrdC0+c2lkZV9kYXRhW2ldLnR5cGUgPT0gQVZfUEtUX0RBVEFfTUVUQURBVEFfVVBEQVRFCisgICAgICAgICAgICAgICAgfHwgcGt0LT5zaWRlX2RhdGFbaV0udHlwZSA9PSBBVl9QS1RfREFUQV9TVFJJTkdTX01FVEFEQVRBKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzaXplIHx8IGRhdGFbc2l6ZS0xXSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGRhdGEgPCBkYXRhX2VuZCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICprZXkgPSBkYXRhOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp2YWwgPSBkYXRhICsgc3RybGVuKGtleSkgKyAxOworCisgICAgICAgICAgICAgICAgICAgIGlmKHZhbCA+PSBkYXRhX2VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1dF9zdHIoZHluX2JjLCBrZXkpOworICAgICAgICAgICAgICAgICAgICBwdXRfcyhkeW5fYmMsIC0xKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3N0cihkeW5fYmMsIHZhbCk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB2YWwgKyBzdHJsZW4odmFsKSArIDE7CisgICAgICAgICAgICAgICAgICAgIHNtX2RhdGFfY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBrdC0+c2lkZV9kYXRhW2ldLnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQVZfUEtUX0RBVEFfUEFMRVRURToKKyAgICAgICAgICAgIGNhc2UgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQToKKyAgICAgICAgICAgIGNhc2UgQVZfUEtUX0RBVEFfTUFUUk9TS0FfQkxPQ0tBRERJVElPTkFMOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAocGt0LT5zaWRlX2RhdGFbaV0udHlwZSA9PSBBVl9QS1RfREFUQV9QQUxFVFRFKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9zdHIoZHluX2JjLCAiUGFsZXR0ZSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZihwa3QtPnNpZGVfZGF0YVtpXS50eXBlID09IEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEpIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3N0cihkeW5fYmMsICJFeHRyYWRhdGEiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYocGt0LT5zaWRlX2RhdGFbaV0udHlwZSA9PSBBVl9QS1RfREFUQV9NQVRST1NLQV9CTE9DS0FERElUSU9OQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIkNvZGVjU3BlY2lmaWNTaWRlJSJQUklkNjQiIiwgQVZfUkI2NChkYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIHB1dF9zdHIoZHluX2JjLCB0bXApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJVc2VyRGF0YSVzLVNELSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0JJVEVYQUNUKSA/ICJMYXZmIiA6IExJQkFWRk9STUFUX0lERU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+c2lkZV9kYXRhW2ldLnR5cGUpOworICAgICAgICAgICAgICAgICAgICBwdXRfc3RyKGR5bl9iYywgdG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHV0X3MoZHluX2JjLCAtMik7CisgICAgICAgICAgICAgICAgcHV0X3N0cihkeW5fYmMsICJiaW4iKTsKKyAgICAgICAgICAgICAgICBmZl9wdXRfdihkeW5fYmMsIHBrdC0+c2lkZV9kYXRhW2ldLnNpemUpOworICAgICAgICAgICAgICAgIGF2aW9fd3JpdGUoZHluX2JjLCBkYXRhLCBwa3QtPnNpZGVfZGF0YVtpXS5zaXplKTsKKyAgICAgICAgICAgICAgICBzbV9kYXRhX2NvdW50Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1BLVF9EQVRBX1BBUkFNX0NIQU5HRToKKyAgICAgICAgICAgICAgICBmbGFncyA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmRhdGEpOworICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEFWX1NJREVfREFUQV9QQVJBTV9DSEFOR0VfQ0hBTk5FTF9DT1VOVCkgeworICAgICAgICAgICAgICAgICAgICBwdXRfc3RyKGR5bl9iYywgIkNoYW5uZWxzIik7CisgICAgICAgICAgICAgICAgICAgIHB1dF9zKGR5bl9iYywgYnl0ZXN0cmVhbV9nZXRfbGUzMigmZGF0YSkpOworICAgICAgICAgICAgICAgICAgICBzbV9kYXRhX2NvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEFWX1NJREVfREFUQV9QQVJBTV9DSEFOR0VfQ0hBTk5FTF9MQVlPVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3N0cihkeW5fYmMsICJDaGFubmVsTGF5b3V0Iik7CisgICAgICAgICAgICAgICAgICAgIHB1dF9zKGR5bl9iYywgLTIpOworICAgICAgICAgICAgICAgICAgICBwdXRfc3RyKGR5bl9iYywgInU2NCIpOworICAgICAgICAgICAgICAgICAgICBmZl9wdXRfdihiYywgOCk7CisgICAgICAgICAgICAgICAgICAgIGF2aW9fd3JpdGUoZHluX2JjLCBkYXRhLCA4KTsgZGF0YSs9ODsKKyAgICAgICAgICAgICAgICAgICAgc21fZGF0YV9jb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX1NBTVBMRV9SQVRFKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9zdHIoZHluX2JjLCAiU2FtcGxlUmF0ZSIpOworICAgICAgICAgICAgICAgICAgICBwdXRfcyhkeW5fYmMsIGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgc21fZGF0YV9jb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0RJTUVOU0lPTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3N0cihkeW5fYmMsICJXaWR0aCIpOworICAgICAgICAgICAgICAgICAgICBwdXRfcyhkeW5fYmMsIGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3N0cihkeW5fYmMsICJIZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3MoZHluX2JjLCBieXRlc3RyZWFtX2dldF9sZTMyKCZkYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIHNtX2RhdGFfY291bnQrPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9QS1RfREFUQV9TS0lQX1NBTVBMRVM6CisgICAgICAgICAgICAgICAgaWYgKEFWX1JMMzIoZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3N0cihkeW5fYmMsICJTa2lwU3RhcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3MoZHluX2JjLCAodW5zaWduZWQpQVZfUkwzMihkYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIHNtX2RhdGFfY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKEFWX1JMMzIoZGF0YSs0KSkgeworICAgICAgICAgICAgICAgICAgICBwdXRfc3RyKGR5bl9iYywgIlNraXBFbmQiKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X3MoZHluX2JjLCAodW5zaWduZWQpQVZfUkwzMihkYXRhKzQpKTsKKyAgICAgICAgICAgICAgICAgICAgc21fZGF0YV9jb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUEtUX0RBVEFfTUVUQURBVEFfVVBEQVRFOgorICAgICAgICAgICAgY2FzZSBBVl9QS1RfREFUQV9TVFJJTkdTX01FVEFEQVRBOgorICAgICAgICAgICAgICAgIC8vIGJlbG9uZ3MgaW50byBtZXRhLCBub3Qgc2lkZSBkYXRhCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK2ZhaWw6CisgICAgZmZfcHV0X3YoYmMsIHNtX2RhdGFfY291bnQpOworICAgIGR5bl9zaXplID0gYXZpb19jbG9zZV9keW5fYnVmKGR5bl9iYywgJmR5bl9idWYpOworICAgIGF2aW9fd3JpdGUoYmMsIGR5bl9idWYsIGR5bl9zaXplKTsKKyAgICBhdl9mcmVlcCgmZHluX2J1Zik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG51dF93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE5VVENvbnRleHQgKm51dCAgICA9IHMtPnByaXZfZGF0YTsKKyAgICBTdHJlYW1Db250ZXh0ICpudXMgPSAmbnV0LT5zdHJlYW1bcGt0LT5zdHJlYW1faW5kZXhdOworICAgIEFWSU9Db250ZXh0ICpiYyAgICA9IHMtPnBiLCAqZHluX2JjLCAqc21fYmMgPSBOVUxMOworICAgIEZyYW1lQ29kZSAqZmM7CisgICAgaW50NjRfdCBjb2RlZF9wdHM7CisgICAgaW50IGJlc3RfbGVuZ3RoLCBmcmFtZV9jb2RlLCBmbGFncywgbmVlZGVkX2ZsYWdzLCBpLCBoZWFkZXJfaWR4OworICAgIGludCBiZXN0X2hlYWRlcl9pZHg7CisgICAgaW50IGtleV9mcmFtZSA9ICEhKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpOworICAgIGludCBzdG9yZV9zcCAgPSAwOworICAgIGludCByZXQgPSAwOworICAgIGludCBzbV9zaXplID0gMDsKKyAgICBpbnQgZGF0YV9zaXplID0gcGt0LT5zaXplOworICAgIHVpbnQ4X3QgKnNtX2J1ZiA9IE5VTEw7CisKKyAgICBpZiAocGt0LT5wdHMgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTmVnYXRpdmUgcHRzIG5vdCBzdXBwb3J0ZWQgc3RyZWFtICVkLCBwdHMgJSJQUklkNjQiXG4iLAorICAgICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXgsIHBrdC0+cHRzKTsKKyAgICAgICAgaWYgKHBrdC0+cHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlRyeSB0byBlbmFibGUgdGhlIGdlbnB0cyBmbGFnXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAocGt0LT5zaWRlX2RhdGFfZWxlbXMgJiYgbnV0LT52ZXJzaW9uID4gMykgeworICAgICAgICByZXQgPSBhdmlvX29wZW5fZHluX2J1Zigmc21fYmMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IHdyaXRlX3NtX2RhdGEocywgc21fYmMsIHBrdCwgMCk7CisgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgIHJldCA9IHdyaXRlX3NtX2RhdGEocywgc21fYmMsIHBrdCwgMSk7CisgICAgICAgIHNtX3NpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYoc21fYmMsICZzbV9idWYpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgZGF0YV9zaXplICs9IHNtX3NpemU7CisgICAgfQorCisgICAgaWYgKDFMTCA8PCAoMjAgKyAzICogbnV0LT5oZWFkZXJfY291bnQpIDw9IGF2aW9fdGVsbChiYykpCisgICAgICAgIHdyaXRlX2hlYWRlcnMocywgYmMpOworCisgICAgaWYgKGtleV9mcmFtZSAmJiAhKG51cy0+bGFzdF9mbGFncyAmIEZMQUdfS0VZKSkKKyAgICAgICAgc3RvcmVfc3AgPSAxOworCisgICAgaWYgKGRhdGFfc2l6ZSArIDMwIC8qRklYTUUgY2hlY2sqLyArIGF2aW9fdGVsbChiYykgPj0gbnV0LT5sYXN0X3N5bmNwb2ludF9wb3MgKyBudXQtPm1heF9kaXN0YW5jZSkKKyAgICAgICAgc3RvcmVfc3AgPSAxOworCisvL0ZJWE1FOiBFbnN1cmUgc3RvcmVfc3AgaXMgMSBpbiB0aGUgZmlyc3QgcGxhY2UuCisKKyAgICBpZiAoc3RvcmVfc3AgJiYKKyAgICAgICAgKCEobnV0LT5mbGFncyAmIE5VVF9QSVBFKSB8fCBudXQtPmxhc3Rfc3luY3BvaW50X3BvcyA9PSBJTlRfTUlOKSkgeworICAgICAgICBpbnQ2NF90IHNwX3BvcyA9IElOVDY0X01BWDsKKworICAgICAgICBmZl9udXRfcmVzZXRfdHMobnV0LCAqbnVzLT50aW1lX2Jhc2UsIHBrdC0+ZHRzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ICAgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgaW50NjRfdCBkdHNfdGIgPSBhdl9yZXNjYWxlX3JuZChwa3QtPmR0cywKKyAgICAgICAgICAgICAgICBudXMtPnRpbWVfYmFzZS0+bnVtICogKGludDY0X3QpbnV0LT5zdHJlYW1baV0udGltZV9iYXNlLT5kZW4sCisgICAgICAgICAgICAgICAgbnVzLT50aW1lX2Jhc2UtPmRlbiAqIChpbnQ2NF90KW51dC0+c3RyZWFtW2ldLnRpbWVfYmFzZS0+bnVtLAorICAgICAgICAgICAgICAgIEFWX1JPVU5EX0RPV04pOworICAgICAgICAgICAgaW50IGluZGV4ID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdCwgZHRzX3RiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlNFRUtfRkxBR19CQUNLV0FSRCk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHNwX3BvcyA9IEZGTUlOKHNwX3Bvcywgc3QtPmluZGV4X2VudHJpZXNbaW5kZXhdLnBvcyk7CisgICAgICAgICAgICAgICAgaWYgKCFudXQtPndyaXRlX2luZGV4ICYmIDIqaW5kZXggPiBzdC0+bmJfaW5kZXhfZW50cmllcykgeworICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKHN0LT5pbmRleF9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5pbmRleF9lbnRyaWVzICsgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzdC0+aW5kZXhfZW50cmllcykgKiAoc3QtPm5iX2luZGV4X2VudHJpZXMgLSBpbmRleCkpOworICAgICAgICAgICAgICAgICAgICBzdC0+bmJfaW5kZXhfZW50cmllcyAtPSAgaW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbnV0LT5sYXN0X3N5bmNwb2ludF9wb3MgPSBhdmlvX3RlbGwoYmMpOworICAgICAgICByZXQgICAgICAgICAgICAgICAgICAgICA9IGF2aW9fb3Blbl9keW5fYnVmKCZkeW5fYmMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgcHV0X3R0KG51dCwgbnVzLT50aW1lX2Jhc2UsIGR5bl9iYywgcGt0LT5kdHMpOworICAgICAgICBmZl9wdXRfdihkeW5fYmMsIHNwX3BvcyAhPSBJTlQ2NF9NQVggPyAobnV0LT5sYXN0X3N5bmNwb2ludF9wb3MgLSBzcF9wb3MpID4+IDQgOiAwKTsKKworICAgICAgICBpZiAobnV0LT5mbGFncyAmIE5VVF9CUk9BRENBU1QpIHsKKyAgICAgICAgICAgIHB1dF90dChudXQsIG51cy0+dGltZV9iYXNlLCBkeW5fYmMsCisgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKGF2X2dldHRpbWUoKSwgQVZfVElNRV9CQVNFX1EsICpudXMtPnRpbWVfYmFzZSkpOworICAgICAgICB9CisgICAgICAgIHB1dF9wYWNrZXQobnV0LCBiYywgZHluX2JjLCAxLCBTWU5DUE9JTlRfU1RBUlRDT0RFKTsKKworICAgICAgICBpZiAobnV0LT53cml0ZV9pbmRleCkgeworICAgICAgICBpZiAoKHJldCA9IGZmX251dF9hZGRfc3AobnV0LCBudXQtPmxhc3Rfc3luY3BvaW50X3BvcywgMCAvKnVudXNlZCovLCBwa3QtPmR0cykpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBpZiAoKDFsbDw8NjApICUgbnV0LT5zcF9jb3VudCA9PSAwKQorICAgICAgICAgICAgZm9yIChpPTA7IGk8cy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgU3RyZWFtQ29udGV4dCAqbnVzID0gJm51dC0+c3RyZWFtW2ldOworICAgICAgICAgICAgICAgIGF2X3JlYWxsb2NwX2FycmF5KCZudXMtPmtleWZyYW1lX3B0cywgMipudXQtPnNwX2NvdW50LCBzaXplb2YoKm51cy0+a2V5ZnJhbWVfcHRzKSk7CisgICAgICAgICAgICAgICAgaWYgKCFudXMtPmtleWZyYW1lX3B0cykgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChqPW51dC0+c3BfY291bnQgPT0gMSA/IDAgOiBudXQtPnNwX2NvdW50OyBqPDIqbnV0LT5zcF9jb3VudDsgaisrKQorICAgICAgICAgICAgICAgICAgICBudXMtPmtleWZyYW1lX3B0c1tqXSA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfYXNzZXJ0MChudXMtPmxhc3RfcHRzICE9IEFWX05PUFRTX1ZBTFVFKTsKKworICAgIGNvZGVkX3B0cyA9IHBrdC0+cHRzICYgKCgxIDw8IG51cy0+bXNiX3B0c19zaGlmdCkgLSAxKTsKKyAgICBpZiAoZmZfbHNiMmZ1bGwobnVzLCBjb2RlZF9wdHMpICE9IHBrdC0+cHRzKQorICAgICAgICBjb2RlZF9wdHMgPSBwa3QtPnB0cyArICgxIDw8IG51cy0+bXNiX3B0c19zaGlmdCk7CisKKyAgICBiZXN0X2hlYWRlcl9pZHggPSBmaW5kX2Jlc3RfaGVhZGVyX2lkeChudXQsIHBrdCk7CisKKyAgICBiZXN0X2xlbmd0aCA9IElOVF9NQVg7CisgICAgZnJhbWVfY29kZSAgPSAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgaW50IGxlbmd0aCAgICA9IDA7CisgICAgICAgIEZyYW1lQ29kZSAqZmMgPSAmbnV0LT5mcmFtZV9jb2RlW2ldOworICAgICAgICBpbnQgZmxhZ3MgICAgID0gZmMtPmZsYWdzOworCisgICAgICAgIGlmIChmbGFncyAmIEZMQUdfSU5WQUxJRCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBuZWVkZWRfZmxhZ3MgPSBnZXRfbmVlZGVkX2ZsYWdzKG51dCwgbnVzLCBmYywgcGt0KTsKKworICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX0NPREVEKSB7CisgICAgICAgICAgICBsZW5ndGgrKzsKKyAgICAgICAgICAgIGZsYWdzID0gbmVlZGVkX2ZsYWdzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChmbGFncyAmIG5lZWRlZF9mbGFncykgIT0gbmVlZGVkX2ZsYWdzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKChmbGFncyBeIG5lZWRlZF9mbGFncykgJiBGTEFHX0tFWSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChmbGFncyAmIEZMQUdfU1RSRUFNX0lEKQorICAgICAgICAgICAgbGVuZ3RoICs9IGZmX2dldF92X2xlbmd0aChwa3QtPnN0cmVhbV9pbmRleCk7CisKKyAgICAgICAgaWYgKGRhdGFfc2l6ZSAlIGZjLT5zaXplX211bCAhPSBmYy0+c2l6ZV9sc2IpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGZsYWdzICYgRkxBR19TSVpFX01TQikKKyAgICAgICAgICAgIGxlbmd0aCArPSBmZl9nZXRfdl9sZW5ndGgoZGF0YV9zaXplIC8gZmMtPnNpemVfbXVsKTsKKworICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX0NIRUNLU1VNKQorICAgICAgICAgICAgbGVuZ3RoICs9IDQ7CisKKyAgICAgICAgaWYgKGZsYWdzICYgRkxBR19DT0RFRF9QVFMpCisgICAgICAgICAgICBsZW5ndGggKz0gZmZfZ2V0X3ZfbGVuZ3RoKGNvZGVkX3B0cyk7CisKKyAgICAgICAgaWYgKCAgIChmbGFncyAmIEZMQUdfQ09ERUQpCisgICAgICAgICAgICAmJiBudXQtPmhlYWRlcl9sZW5bYmVzdF9oZWFkZXJfaWR4XSA+IG51dC0+aGVhZGVyX2xlbltmYy0+aGVhZGVyX2lkeF0gKyAxKSB7CisgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0hFQURFUl9JRFg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX0hFQURFUl9JRFgpIHsKKyAgICAgICAgICAgIGxlbmd0aCArPSAxIC0gbnV0LT5oZWFkZXJfbGVuW2Jlc3RfaGVhZGVyX2lkeF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZW5ndGggLT0gbnV0LT5oZWFkZXJfbGVuW2ZjLT5oZWFkZXJfaWR4XTsKKyAgICAgICAgfQorCisgICAgICAgIGxlbmd0aCAqPSA0OworICAgICAgICBsZW5ndGggKz0gIShmbGFncyAmIEZMQUdfQ09ERURfUFRTKTsKKyAgICAgICAgbGVuZ3RoICs9ICEoZmxhZ3MgJiBGTEFHX0NIRUNLU1VNKTsKKworICAgICAgICBpZiAobGVuZ3RoIDwgYmVzdF9sZW5ndGgpIHsKKyAgICAgICAgICAgIGJlc3RfbGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgZnJhbWVfY29kZSAgPSBpOworICAgICAgICB9CisgICAgfQorICAgIGF2X2Fzc2VydDAoZnJhbWVfY29kZSAhPSAtMSk7CisKKyAgICBmYyAgICAgICAgICAgPSAmbnV0LT5mcmFtZV9jb2RlW2ZyYW1lX2NvZGVdOworICAgIGZsYWdzICAgICAgICA9IGZjLT5mbGFnczsKKyAgICBuZWVkZWRfZmxhZ3MgPSBnZXRfbmVlZGVkX2ZsYWdzKG51dCwgbnVzLCBmYywgcGt0KTsKKyAgICBoZWFkZXJfaWR4ICAgPSBmYy0+aGVhZGVyX2lkeDsKKworICAgIGZmaW9faW5pdF9jaGVja3N1bShiYywgZmZfY3JjMDRDMTFEQjdfdXBkYXRlLCAwKTsKKyAgICBhdmlvX3c4KGJjLCBmcmFtZV9jb2RlKTsKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX0NPREVEKSB7CisgICAgICAgIGZmX3B1dF92KGJjLCAoZmxhZ3MgXiBuZWVkZWRfZmxhZ3MpICYgfihGTEFHX0NPREVEKSk7CisgICAgICAgIGZsYWdzID0gbmVlZGVkX2ZsYWdzOworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBGTEFHX1NUUkVBTV9JRCkgIGZmX3B1dF92KGJjLCBwa3QtPnN0cmVhbV9pbmRleCk7CisgICAgaWYgKGZsYWdzICYgRkxBR19DT0RFRF9QVFMpICBmZl9wdXRfdihiYywgY29kZWRfcHRzKTsKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfTVNCICkgIGZmX3B1dF92KGJjLCBkYXRhX3NpemUgLyBmYy0+c2l6ZV9tdWwpOworICAgIGlmIChmbGFncyAmIEZMQUdfSEVBREVSX0lEWCkgZmZfcHV0X3YoYmMsIGhlYWRlcl9pZHggPSBiZXN0X2hlYWRlcl9pZHgpOworCisgICAgaWYgKGZsYWdzICYgRkxBR19DSEVDS1NVTSkgICBhdmlvX3dsMzIoYmMsIGZmaW9fZ2V0X2NoZWNrc3VtKGJjKSk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICBmZmlvX2dldF9jaGVja3N1bShiYyk7CisKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX1NNX0RBVEEpIHsKKyAgICAgICAgYXZpb193cml0ZShiYywgc21fYnVmLCBzbV9zaXplKTsKKyAgICB9CisgICAgYXZpb193cml0ZShiYywgcGt0LT5kYXRhICsgbnV0LT5oZWFkZXJfbGVuW2hlYWRlcl9pZHhdLCBwa3QtPnNpemUgLSBudXQtPmhlYWRlcl9sZW5baGVhZGVyX2lkeF0pOworCisgICAgbnVzLT5sYXN0X2ZsYWdzID0gZmxhZ3M7CisgICAgbnVzLT5sYXN0X3B0cyAgID0gcGt0LT5wdHM7CisKKyAgICAvL0ZJWE1FIGp1c3Qgc3RvcmUgb25lIHBlciBzeW5jcG9pbnQKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX0tFWSAmJiAhKG51dC0+ZmxhZ3MgJiBOVVRfUElQRSkpIHsKKyAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KAorICAgICAgICAgICAgcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0sCisgICAgICAgICAgICBudXQtPmxhc3Rfc3luY3BvaW50X3BvcywKKyAgICAgICAgICAgIHBrdC0+cHRzLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBBVklOREVYX0tFWUZSQU1FKTsKKyAgICAgICAgaWYgKG51cy0+a2V5ZnJhbWVfcHRzICYmIG51cy0+a2V5ZnJhbWVfcHRzW251dC0+c3BfY291bnRdID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgbnVzLT5rZXlmcmFtZV9wdHNbbnV0LT5zcF9jb3VudF0gPSBwa3QtPnB0czsKKyAgICB9CisKKyAgICBpZiAoIW51dC0+bWF4X3B0c190YiB8fCBhdl9jb21wYXJlX3RzKG51dC0+bWF4X3B0cywgKm51dC0+bWF4X3B0c190YiwgcGt0LT5wdHMsICpudXMtPnRpbWVfYmFzZSkgPCAwKSB7CisgICAgICAgIG51dC0+bWF4X3B0cyA9IHBrdC0+cHRzOworICAgICAgICBudXQtPm1heF9wdHNfdGIgPSBudXMtPnRpbWVfYmFzZTsKKyAgICB9CisKK2ZhaWw6CisgICAgYXZfZnJlZXAoJnNtX2J1Zik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG51dF93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBOVVRDb250ZXh0ICpudXQgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKmJjID0gcy0+cGIsICpkeW5fYmM7CisgICAgaW50IGksIHJldDsKKworICAgIHdoaWxlIChudXQtPmhlYWRlcl9jb3VudCA8IDMpCisgICAgICAgIHdyaXRlX2hlYWRlcnMocywgYmMpOworCisgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJmR5bl9iYyk7CisgICAgaWYgKHJldCA+PSAwICYmIG51dC0+c3BfY291bnQpIHsKKyAgICAgICAgYXZfYXNzZXJ0MShudXQtPndyaXRlX2luZGV4KTsKKyAgICAgICAgd3JpdGVfaW5kZXgobnV0LCBkeW5fYmMpOworICAgICAgICBwdXRfcGFja2V0KG51dCwgYmMsIGR5bl9iYywgMSwgSU5ERVhfU1RBUlRDT0RFKTsKKyAgICB9CisKKyAgICBmZl9udXRfZnJlZV9zcChudXQpOworICAgIGZvciAoaT0wOyBpPHMtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJm51dC0+c3RyZWFtW2ldLmtleWZyYW1lX3B0cyk7CisKKyAgICBhdl9mcmVlcCgmbnV0LT5zdHJlYW0pOworICAgIGF2X2ZyZWVwKCZudXQtPmNoYXB0ZXIpOworICAgIGF2X2ZyZWVwKCZudXQtPnRpbWVfYmFzZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTlVUQ29udGV4dCwgeCkKKyNkZWZpbmUgRSBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJzeW5jcG9pbnRzIiwgICJOVVQgc3luY3BvaW50IGJlaGF2aW91ciIsICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChmbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IDB9LCAgICAgICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBFLCAic3luY3BvaW50cyIgfSwKKyAgICB7ICJkZWZhdWx0IiwgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IDB9LCAgICAgICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBFLCAic3luY3BvaW50cyIgfSwKKyAgICB7ICJub25lIiwgICAgICAgICJEaXNhYmxlIHN5bmNwb2ludHMsIGxvdyBvdmVyaGVhZCBhbmQgdW5zZWVrYWJsZSIsIDAsICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE5VVF9QSVBFfSwgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBFLCAic3luY3BvaW50cyIgfSwKKyAgICB7ICJ0aW1lc3RhbXBlZCIsICJFeHRlbmQgc3luY3BvaW50cyB3aXRoIGEgd2FsbGNsb2NrIHRpbWVzdGFtcCIsICAgIDAsICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE5VVF9CUk9BRENBU1R9LCBJTlRfTUlOLCBJTlRfTUFYLCBFLCAic3luY3BvaW50cyIgfSwKKyAgICB7ICJ3cml0ZV9pbmRleCIsICJXcml0ZSBpbmRleCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVCh3cml0ZV9pbmRleCksIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2NCA9IDF9LCAgICAgICAgICAgICAgICAgICAwLCAgICAgICAxLCBFLCB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibnV0ZW5jIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWT3V0cHV0Rm9ybWF0IGZmX251dF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibnV0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTlVUIiksCisgICAgLm1pbWVfdHlwZSAgICAgID0gInZpZGVvL3gtbnV0IiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAibnV0IiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTlVUQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgID0gQ09ORklHX0xJQlZPUkJJUyA/IEFWX0NPREVDX0lEX1ZPUkJJUyA6CisgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0xJQk1QM0xBTUUgPyBBVl9DT0RFQ19JRF9NUDMgOiBBVl9DT0RFQ19JRF9NUDIsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfTVBFRzQsCisgICAgLndyaXRlX2hlYWRlciAgID0gbnV0X3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBudXRfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICA9IG51dF93cml0ZV90cmFpbGVyLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dMT0JBTEhFQURFUiB8IEFWRk1UX1ZBUklBQkxFX0ZQUywKKyAgICAuY29kZWNfdGFnICAgICAgPSBmZl9udXRfY29kZWNfdGFncywKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L251di5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L251di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZjBlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvbnV2LmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBOdXBwZWxWaWRlbyBkZW11eGVyLgorICogQ29weXJpZ2h0IChjKSAyMDA2IFJlaW1hciBEb2VmZmluZ2VyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGZsb2F0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInJpZmYuaCIKKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgbnV2X2F1ZGlvX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMTZMRSwgTUtUQUcoJ1InLCAnQScsICdXJywgJ0EnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVAzLCAgICAgICBNS1RBRygnTCcsICdBJywgJ00nLCAnRScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAgICAgIDAgfSwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdl9pZDsKKyAgICBpbnQgYV9pZDsKKyAgICBpbnQgcnRqcGdfdmlkZW87Cit9IE5VVkNvbnRleHQ7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTlVWX1ZJREVPICAgICA9ICdWJywKKyAgICBOVVZfRVhUUkFEQVRBID0gJ0QnLAorICAgIE5VVl9BVURJTyAgICAgPSAnQScsCisgICAgTlVWX1NFRUtQICAgICA9ICdSJywKKyAgICBOVVZfTVlUSEVYVCAgID0gJ1gnCit9IG51dl9mcmFtZXR5cGU7CisKK3N0YXRpYyBpbnQgbnV2X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmICghbWVtY21wKHAtPmJ1ZiwgIk51cHBlbFZpZGVvIiwgMTIpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgaWYgKCFtZW1jbXAocC0+YnVmLCAiTXl0aFRWVmlkZW8iLCAxMikpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworLy8vIGxpdHRsZSBtYWNybyB0byBzYW5pdGl6ZSBwYWNrZXQgc2l6ZQorI2RlZmluZSBQS1RTSVpFKHMpIChzICYgIDB4ZmZmZmZmKQorCisvKioKKyAqIEBicmllZiByZWFkIHVudGlsIHdlIGZvdW5kIGFsbCBkYXRhIG5lZWRlZCBmb3IgZGVjb2RpbmcKKyAqIEBwYXJhbSB2c3QgdmlkZW8gc3RyZWFtIG9mIHdoaWNoIHRvIGNoYW5nZSBwYXJhbWV0ZXJzCisgKiBAcGFyYW0gYXN0IHZpZGVvIHN0cmVhbSBvZiB3aGljaCB0byBjaGFuZ2UgcGFyYW1ldGVycworICogQHBhcmFtIG15dGggc2V0IGlmIHRoaXMgaXMgYSBNeXRoVFZWaWRlbyBmb3JtYXQgZmlsZQorICogQHJldHVybiAwIG9yIEFWRVJST1IgY29kZQorICovCitzdGF0aWMgaW50IGdldF9jb2RlY19kYXRhKEFWSU9Db250ZXh0ICpwYiwgQVZTdHJlYW0gKnZzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKmFzdCwgaW50IG15dGgpCit7CisgICAgbnV2X2ZyYW1ldHlwZSBmcmFtZXR5cGU7CisKKyAgICBpZiAoIXZzdCAmJiAhbXl0aCkKKyAgICAgICAgcmV0dXJuIDE7IC8vIG5vIGNvZGVjIGRhdGEgbmVlZGVkCisgICAgd2hpbGUgKCFhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgIGludCBzaXplLCBzdWJ0eXBlOworCisgICAgICAgIGZyYW1ldHlwZSA9IGF2aW9fcjgocGIpOworICAgICAgICBzd2l0Y2ggKGZyYW1ldHlwZSkgeworICAgICAgICBjYXNlIE5VVl9FWFRSQURBVEE6CisgICAgICAgICAgICBzdWJ0eXBlID0gYXZpb19yOChwYik7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDYpOworICAgICAgICAgICAgc2l6ZSA9IFBLVFNJWkUoYXZpb19ybDMyKHBiKSk7CisgICAgICAgICAgICBpZiAodnN0ICYmIHN1YnR5cGUgPT0gJ1InKSB7CisgICAgICAgICAgICAgICAgaWYgKHZzdC0+Y29kZWMtPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmdnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgdnN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YSh2c3QtPmNvZGVjLCBwYiwgc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICAgICAgICAgIGlmICghbXl0aCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVVZfTVlUSEVYVDoKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNyk7CisgICAgICAgICAgICBzaXplID0gUEtUU0laRShhdmlvX3JsMzIocGIpKTsKKyAgICAgICAgICAgIGlmIChzaXplICE9IDEyOCAqIDQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBhdmlvX3JsMzIocGIpOyAvLyB2ZXJzaW9uCisgICAgICAgICAgICBpZiAodnN0KSB7CisgICAgICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9CisgICAgICAgICAgICAgICAgICAgIGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywgdnN0LT5jb2RlYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgICAgICAgICBpZiAodnN0LT5jb2RlYy0+Y29kZWNfdGFnID09IE1LVEFHKCdSJywgJ0onLCAnUCcsICdHJykpCisgICAgICAgICAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTlVWOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCA0KTsKKworICAgICAgICAgICAgaWYgKGFzdCkgeworICAgICAgICAgICAgICAgIGludCBpZDsKKworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX3RhZyAgICAgICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgICAgICBhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgICAgICAgID0gMDsKKworICAgICAgICAgICAgICAgIGlkID0gZmZfd2F2X2NvZGVjX2dldF9pZChhc3QtPmNvZGVjLT5jb2RlY190YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgICAgICAgICAgICAgaWYgKGlkID09IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSBmZl9jb2RlY19nZXRfaWQobnV2X2F1ZGlvX3RhZ3MsIGFzdC0+Y29kZWMtPmNvZGVjX3RhZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IGZmX2dldF9wY21fY29kZWNfaWQoYXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIH4xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPSBpZDsKKworICAgICAgICAgICAgICAgIGFzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNCAqIDQpOworCisgICAgICAgICAgICBzaXplIC09IDYgKiA0OworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIE5VVl9TRUVLUDoKKyAgICAgICAgICAgIHNpemUgPSAxMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZpb19za2lwKHBiLCA3KTsKKyAgICAgICAgICAgIHNpemUgPSBQS1RTSVpFKGF2aW9fcmwzMihwYikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudXZfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBOVVZDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgY2hhciBpZF9zdHJpbmdbMTJdOworICAgIGRvdWJsZSBhc3BlY3QsIGZwczsKKyAgICBpbnQgaXNfbXl0aHR2LCB3aWR0aCwgaGVpZ2h0LCB2X3BhY2tzLCBhX3BhY2tzLCByZXQ7CisgICAgQVZTdHJlYW0gKnZzdCA9IE5VTEwsICphc3QgPSBOVUxMOworCisgICAgYXZpb19yZWFkKHBiLCBpZF9zdHJpbmcsIDEyKTsKKyAgICBpc19teXRodHYgPSAhbWVtY21wKGlkX3N0cmluZywgIk15dGhUVlZpZGVvIiwgMTIpOworICAgIGF2aW9fc2tpcChwYiwgNSk7ICAgICAgIC8vIHZlcnNpb24gc3RyaW5nCisgICAgYXZpb19za2lwKHBiLCAzKTsgICAgICAgLy8gcGFkZGluZworICAgIHdpZHRoICA9IGF2aW9fcmwzMihwYik7CisgICAgaGVpZ2h0ID0gYXZpb19ybDMyKHBiKTsKKyAgICBhdmlvX3JsMzIocGIpOyAgICAgICAgICAvLyB1bnVzZWQsICJkZXNpcmVkd2lkdGgiCisgICAgYXZpb19ybDMyKHBiKTsgICAgICAgICAgLy8gdW51c2VkLCAiZGVzaXJlZGhlaWdodCIKKyAgICBhdmlvX3I4KHBiKTsgICAgICAgICAgICAvLyAnUCcgPT0gcHJvZ3Jlc3NpdmUsICdJJyA9PSBpbnRlcmxhY2VkCisgICAgYXZpb19za2lwKHBiLCAzKTsgICAgICAgLy8gcGFkZGluZworICAgIGFzcGVjdCA9IGF2X2ludDJkb3VibGUoYXZpb19ybDY0KHBiKSk7CisgICAgaWYgKGFzcGVjdCA+IDAuOTk5OSAmJiBhc3BlY3QgPCAxLjAwMDEpCisgICAgICAgIGFzcGVjdCA9IDQuMCAvIDMuMDsKKyAgICBmcHMgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmw2NChwYikpOworCisgICAgLy8gbnVtYmVyIG9mIHBhY2tldHMgcGVyIHN0cmVhbSB0eXBlLCAtMSBtZWFucyB1bmtub3duLCBlLmcuIHN0cmVhbWluZworICAgIHZfcGFja3MgPSBhdmlvX3JsMzIocGIpOworICAgIGFfcGFja3MgPSBhdmlvX3JsMzIocGIpOworICAgIGF2aW9fcmwzMihwYik7IC8vIHRleHQKKworICAgIGF2aW9fcmwzMihwYik7IC8vIGtleWZyYW1lIGRpc3RhbmNlICg/KQorCisgICAgaWYgKHZfcGFja3MpIHsKKyAgICAgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCF2c3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBjdHgtPnZfaWQgPSB2c3QtPmluZGV4OworCisgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTlVWOworICAgICAgICB2c3QtPmNvZGVjLT53aWR0aCAgICAgICAgICAgICAgICAgPSB3aWR0aDsKKyAgICAgICAgdnN0LT5jb2RlYy0+aGVpZ2h0ICAgICAgICAgICAgICAgID0gaGVpZ2h0OworICAgICAgICB2c3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxMDsKKyAgICAgICAgdnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvICAgICAgICAgID0gYXZfZDJxKGFzcGVjdCAqIGhlaWdodCAvIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDApOworI2lmIEZGX0FQSV9SX0ZSQU1FX1JBVEUKKyAgICAgICAgdnN0LT5yX2ZyYW1lX3JhdGUgPQorI2VuZGlmCisgICAgICAgIHZzdC0+YXZnX2ZyYW1lX3JhdGUgPSBhdl9kMnEoZnBzLCA2MDAwMCk7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCAzMiwgMSwgMTAwMCk7CisgICAgfSBlbHNlCisgICAgICAgIGN0eC0+dl9pZCA9IC0xOworCisgICAgaWYgKGFfcGFja3MpIHsKKyAgICAgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCFhc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBjdHgtPmFfaWQgPSBhc3QtPmluZGV4OworCisgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgICAgICAgPSAyOworICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCAgICAgICAgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSA0NDEwMDsKKyAgICAgICAgYXN0LT5jb2RlYy0+Yml0X3JhdGUgICAgICAgICAgICAgID0gMiAqIDIgKiA0NDEwMCAqIDg7CisgICAgICAgIGFzdC0+Y29kZWMtPmJsb2NrX2FsaWduICAgICAgICAgICA9IDIgKiAyOworICAgICAgICBhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDMyLCAxLCAxMDAwKTsKKyAgICB9IGVsc2UKKyAgICAgICAgY3R4LT5hX2lkID0gLTE7CisKKyAgICBpZiAoKHJldCA9IGdldF9jb2RlY19kYXRhKHBiLCB2c3QsIGFzdCwgaXNfbXl0aHR2KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgY3R4LT5ydGpwZ192aWRlbyA9IHZzdCAmJiB2c3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OVVY7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBIRFJTSVpFIDEyCisKK3N0YXRpYyBpbnQgbnV2X3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTlVWQ29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVpbnQ4X3QgaGRyW0hEUlNJWkVdOworICAgIG51dl9mcmFtZXR5cGUgZnJhbWV0eXBlOworICAgIGludCByZXQsIHNpemU7CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgaW50IGNvcHloZHJzaXplID0gY3R4LT5ydGpwZ192aWRlbyA/IEhEUlNJWkUgOiAwOworICAgICAgICB1aW50NjRfdCBwb3MgICAgPSBhdmlvX3RlbGwocGIpOworCisgICAgICAgIHJldCA9IGF2aW9fcmVhZChwYiwgaGRyLCBIRFJTSVpFKTsKKyAgICAgICAgaWYgKHJldCA8IEhEUlNJWkUpCisgICAgICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1IoRUlPKTsKKworICAgICAgICBmcmFtZXR5cGUgPSBoZHJbMF07CisgICAgICAgIHNpemUgICAgICA9IFBLVFNJWkUoQVZfUkwzMigmaGRyWzhdKSk7CisKKyAgICAgICAgc3dpdGNoIChmcmFtZXR5cGUpIHsKKyAgICAgICAgY2FzZSBOVVZfRVhUUkFEQVRBOgorICAgICAgICAgICAgaWYgKCFjdHgtPnJ0anBnX3ZpZGVvKSB7CisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBOVVZfVklERU86CisgICAgICAgICAgICBpZiAoY3R4LT52X2lkIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJWaWRlbyBwYWNrZXQgaW4gZmlsZSB3aXRob3V0IHZpZGVvIHN0cmVhbSFcbiIpOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgY29weWhkcnNpemUgKyBzaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIHBrdC0+cG9zICAgICAgICAgID0gcG9zOworICAgICAgICAgICAgcGt0LT5mbGFncyAgICAgICB8PSBoZHJbMl0gPT0gMCA/IEFWX1BLVF9GTEFHX0tFWSA6IDA7CisgICAgICAgICAgICBwa3QtPnB0cyAgICAgICAgICA9IEFWX1JMMzIoJmhkcls0XSk7CisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGN0eC0+dl9pZDsKKyAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIGhkciwgY29weWhkcnNpemUpOworICAgICAgICAgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBwa3QtPmRhdGEgKyBjb3B5aGRyc2l6ZSwgc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXQgPCBzaXplKQorICAgICAgICAgICAgICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCBjb3B5aGRyc2l6ZSArIHJldCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBOVVZfQVVESU86CisgICAgICAgICAgICBpZiAoY3R4LT5hX2lkIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBdWRpbyBwYWNrZXQgaW4gZmlsZSB3aXRob3V0IGF1ZGlvIHN0cmVhbSFcbiIpOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgICAgICAgICAgICAgICA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgc2l6ZSk7CisgICAgICAgICAgICBwa3QtPmZsYWdzICAgICAgIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgICAgIHBrdC0+cG9zICAgICAgICAgID0gcG9zOworICAgICAgICAgICAgcGt0LT5wdHMgICAgICAgICAgPSBBVl9STDMyKCZoZHJbNF0pOworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBjdHgtPmFfaWQ7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgTlVWX1NFRUtQOgorICAgICAgICAgICAgLy8gY29udGFpbnMgbm8gZGF0YSwgc2l6ZSB2YWx1ZSBpcyBpbnZhbGlkCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Cit9CisKKy8qKgorICogXGJyaWVmIGxvb2tzIGZvciB0aGUgc3RyaW5nIFJUampqampqampqaiBpbiB0aGUgc3RyZWFtIHRvbyByZXN5bmMgcmVhZGluZworICogXHJldHVybiAxIGlmIHRoZSBzeW5jd29yZCBpcyBmb3VuZCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBudXZfcmVzeW5jKEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCBwb3NfbGltaXQpIHsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1aW50MzJfdCB0YWcgPSAwOworICAgIHdoaWxlKCFhdmlvX2Zlb2YocGIpICYmIGF2aW9fdGVsbChwYikgPCBwb3NfbGltaXQpIHsKKyAgICAgICAgdGFnID0gKHRhZyA8PCA4KSB8IGF2aW9fcjgocGIpOworICAgICAgICBpZiAodGFnICAgICAgICAgICAgICAgICAgPT0gTUtCRVRBRygnUicsJ1QnLCdqJywnaicpICYmCisgICAgICAgICAgICh0YWcgPSBhdmlvX3JiMzIocGIpKSA9PSBNS0JFVEFHKCdqJywnaicsJ2onLCdqJykgJiYKKyAgICAgICAgICAgKHRhZyA9IGF2aW9fcmIzMihwYikpID09IE1LQkVUQUcoJ2onLCdqJywnaicsJ2onKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBcYnJpZWYgYXR0ZW1wdHMgdG8gcmVhZCBhIHRpbWVzdGFtcCBmcm9tIHN0cmVhbSBhdCB0aGUgZ2l2ZW4gc3RyZWFtIHBvc2l0aW9uCisgKiBccmV0dXJuIHRpbWVzdGFtcCBpZiBzdWNjZXNzZnVsIGFuZCBBVl9OT1BUU19WQUxVRSBpZiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQ2NF90IG51dl9yZWFkX2R0cyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqcHBvcywgaW50NjRfdCBwb3NfbGltaXQpCit7CisgICAgTlVWQ29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVpbnQ4X3QgaGRyW0hEUlNJWkVdOworICAgIG51dl9mcmFtZXR5cGUgZnJhbWV0eXBlOworICAgIGludCBzaXplLCBrZXksIGlkeDsKKyAgICBpbnQ2NF90IHBvcywgZHRzOworCisgICAgaWYgKGF2aW9fc2VlayhwYiwgKnBwb3MsIFNFRUtfU0VUKSA8IDApCisgICAgICAgIHJldHVybiBBVl9OT1BUU19WQUxVRTsKKworICAgIGlmICghbnV2X3Jlc3luYyhzLCBwb3NfbGltaXQpKQorICAgICAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihwYikgJiYgYXZpb190ZWxsKHBiKSA8IHBvc19saW1pdCkgeworICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBoZHIsIEhEUlNJWkUpIDwgSERSU0laRSkKKyAgICAgICAgICAgIHJldHVybiBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgZnJhbWV0eXBlID0gaGRyWzBdOworICAgICAgICBzaXplID0gUEtUU0laRShBVl9STDMyKCZoZHJbOF0pKTsKKyAgICAgICAgc3dpdGNoIChmcmFtZXR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTlVWX1NFRUtQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOVVZfQVVESU86CisgICAgICAgICAgICBjYXNlIE5VVl9WSURFTzoKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWV0eXBlID09IE5VVl9WSURFTykgeworICAgICAgICAgICAgICAgICAgICBpZHggPSBjdHgtPnZfaWQ7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IGhkclsyXSA9PSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlkeCA9IGN0eC0+YV9pZDsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA9PSBpZHgpIHsKKworICAgICAgICAgICAgICAgICAgICBwb3MgPSBhdmlvX3RlbGwocy0+cGIpIC0gSERSU0laRTsKKyAgICAgICAgICAgICAgICAgICAgZHRzID0gQVZfUkwzMigmaGRyWzRdKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gYWRkIGdlbmVyYWwgc3VwcG9ydCBpbiBhdl9nZW5fc2VhcmNoLCBzbyBpdCBhZGRzIHBvc2l0aW9ucyBhZnRlciByZWFkaW5nIHRpbWVzdGFtcHMKKyAgICAgICAgICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XSwgcG9zLCBkdHMsIHNpemUgKyBIRFJTSVpFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA/IEFWSU5ERVhfS0VZRlJBTUUgOiAwKTsKKworICAgICAgICAgICAgICAgICAgICAqcHBvcyA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGR0czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworfQorCisKK0FWSW5wdXRGb3JtYXQgZmZfbnV2X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm51diIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk51cHBlbFZpZGVvIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE5VVkNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IG51dl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBudXZfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IG51dl9wYWNrZXQsCisgICAgLnJlYWRfdGltZXN0YW1wID0gbnV2X3JlYWRfZHRzLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ2RlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTQ2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvb2dnZGVjLmMKQEAgLTAsMCArMSw5MDggQEAKKy8qCisgKiBPZ2cgYml0c3RyZWFtIHN1cHBvcnQKKyAqIEx1Y2EgQmFyYmF0byA8bHVfemVyb0BnZW50b28ub3JnPgorICogQmFzZWQgb24gdGN2cCBpbXBsZW1lbnRhdGlvbgorICovCisKKy8qCisgICAgQ29weXJpZ2h0IChDKSAyMDA1ICBNaWNoYWVsIEFobGJlcmcsIE3DpW5zIFJ1bGxnw6VyZAorCisgICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAgICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAgICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAgICBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAgICBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICAgIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICAgIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgIm9nZ2RlYy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2b3JiaXNjb21tZW50LmgiCisKKyNkZWZpbmUgTUFYX1BBR0VfU0laRSA2NTMwNworI2RlZmluZSBERUNPREVSX0JVRkZFUl9TSVpFIE1BWF9QQUdFX1NJWkUKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZ2dfY29kZWMgKiBjb25zdCBvZ2dfY29kZWNzW10gPSB7CisgICAgJmZmX3NrZWxldG9uX2NvZGVjLAorICAgICZmZl9kaXJhY19jb2RlYywKKyAgICAmZmZfc3BlZXhfY29kZWMsCisgICAgJmZmX3ZvcmJpc19jb2RlYywKKyAgICAmZmZfdGhlb3JhX2NvZGVjLAorICAgICZmZl9mbGFjX2NvZGVjLAorICAgICZmZl9jZWx0X2NvZGVjLAorICAgICZmZl9vcHVzX2NvZGVjLAorICAgICZmZl92cDhfY29kZWMsCisgICAgJmZmX29sZF9kaXJhY19jb2RlYywKKyAgICAmZmZfb2xkX2ZsYWNfY29kZWMsCisgICAgJmZmX29nbV92aWRlb19jb2RlYywKKyAgICAmZmZfb2dtX2F1ZGlvX2NvZGVjLAorICAgICZmZl9vZ21fdGV4dF9jb2RlYywKKyAgICAmZmZfb2dtX29sZF9jb2RlYywKKyAgICBOVUxMCit9OworCitzdGF0aWMgaW50NjRfdCBvZ2dfY2FsY19wdHMoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWR4LCBpbnQ2NF90ICpkdHMpOworc3RhdGljIGludCBvZ2dfbmV3X3N0cmVhbShBVkZvcm1hdENvbnRleHQgKnMsIHVpbnQzMl90IHNlcmlhbCk7CisKKy8vRklYTUUgV2UgY291bGQgYXZvaWQgc29tZSBzdHJ1Y3R1cmUgZHVwbGljYXRpb24KK3N0YXRpYyBpbnQgb2dnX3NhdmUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0YXRlICpvc3QgPQorICAgICAgICBhdl9tYWxsb2Moc2l6ZW9mKCpvc3QpICsgKG9nZy0+bnN0cmVhbXMgLSAxKSAqIHNpemVvZigqb2dnLT5zdHJlYW1zKSk7CisgICAgaW50IGk7CisgICAgb3N0LT5wb3MgICAgICA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgb3N0LT5jdXJpZHggICA9IG9nZy0+Y3VyaWR4OworICAgIG9zdC0+bmV4dCAgICAgPSBvZ2ctPnN0YXRlOworICAgIG9zdC0+bnN0cmVhbXMgPSBvZ2ctPm5zdHJlYW1zOworICAgIG1lbWNweShvc3QtPnN0cmVhbXMsIG9nZy0+c3RyZWFtcywgb2dnLT5uc3RyZWFtcyAqIHNpemVvZigqb2dnLT5zdHJlYW1zKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgb2dnLT5uc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGk7CisgICAgICAgIG9zLT5idWYgPSBhdl9tYWxsb2N6KG9zLT5idWZzaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIG1lbWNweShvcy0+YnVmLCBvc3QtPnN0cmVhbXNbaV0uYnVmLCBvcy0+YnVmcG9zKTsKKyAgICAgICAgb3MtPm5ld19tZXRhZGF0YSAgICAgID0gTlVMTDsKKyAgICAgICAgb3MtPm5ld19tZXRhZGF0YV9zaXplID0gMDsKKyAgICB9CisKKyAgICBvZ2ctPnN0YXRlID0gb3N0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2dnX3Jlc3RvcmUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgZGlzY2FyZCkKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKmJjID0gcy0+cGI7CisgICAgc3RydWN0IG9nZ19zdGF0ZSAqb3N0ID0gb2dnLT5zdGF0ZTsKKyAgICBpbnQgaSwgZXJyOworCisgICAgaWYgKCFvc3QpCisgICAgICAgIHJldHVybiAwOworCisgICAgb2dnLT5zdGF0ZSA9IG9zdC0+bmV4dDsKKworICAgIGlmICghZGlzY2FyZCkgeworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvZ2ctPm5zdHJlYW1zOyBpKyspCisgICAgICAgICAgICBhdl9mcmVlcCgmb2dnLT5zdHJlYW1zW2ldLmJ1Zik7CisKKyAgICAgICAgYXZpb19zZWVrKGJjLCBvc3QtPnBvcywgU0VFS19TRVQpOworICAgICAgICBvZ2ctPnBhZ2VfcG9zID0gLTE7CisgICAgICAgIG9nZy0+Y3VyaWR4ICAgPSBvc3QtPmN1cmlkeDsKKyAgICAgICAgb2dnLT5uc3RyZWFtcyA9IG9zdC0+bnN0cmVhbXM7CisgICAgICAgIGlmICgoZXJyID0gYXZfcmVhbGxvY3BfYXJyYXkoJm9nZy0+c3RyZWFtcywgb2dnLT5uc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKm9nZy0+c3RyZWFtcykpKSA8IDApIHsKKyAgICAgICAgICAgIG9nZy0+bnN0cmVhbXMgPSAwOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtZW1jcHkob2dnLT5zdHJlYW1zLCBvc3QtPnN0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgb3N0LT5uc3RyZWFtcyAqIHNpemVvZigqb2dnLT5zdHJlYW1zKSk7CisgICAgfQorCisgICAgYXZfZnJlZShvc3QpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2dnX3Jlc2V0KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisgICAgaW50NjRfdCBzdGFydF9wb3MgPSBhdmlvX3RlbGwocy0+cGIpOworCisgICAgZm9yIChpID0gMDsgaSA8IG9nZy0+bnN0cmVhbXM7IGkrKykgeworICAgICAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpOworICAgICAgICBvcy0+YnVmcG9zICAgICA9IDA7CisgICAgICAgIG9zLT5wc3RhcnQgICAgID0gMDsKKyAgICAgICAgb3MtPnBzaXplICAgICAgPSAwOworICAgICAgICBvcy0+Z3JhbnVsZSAgICA9IC0xOworICAgICAgICBvcy0+bGFzdHB0cyAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBvcy0+bGFzdGR0cyAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBvcy0+c3luY19wb3MgICA9IC0xOworICAgICAgICBvcy0+cGFnZV9wb3MgICA9IDA7CisgICAgICAgIG9zLT5uc2VncyAgICAgID0gMDsKKyAgICAgICAgb3MtPnNlZ3AgICAgICAgPSAwOworICAgICAgICBvcy0+aW5jb21wbGV0ZSA9IDA7CisgICAgICAgIG9zLT5nb3RfZGF0YSA9IDA7CisgICAgICAgIGlmIChzdGFydF9wb3MgPD0gcy0+ZGF0YV9vZmZzZXQpIHsKKyAgICAgICAgICAgIG9zLT5sYXN0cHRzID0gMDsKKyAgICAgICAgfQorICAgICAgICBvcy0+ZW5kX3RyaW1taW5nID0gMDsKKyAgICAgICAgYXZfZnJlZXAoJm9zLT5uZXdfbWV0YWRhdGEpOworICAgICAgICBvcy0+bmV3X21ldGFkYXRhX3NpemUgPSAwOworICAgIH0KKworICAgIG9nZy0+cGFnZV9wb3MgPSAtMTsKKyAgICBvZ2ctPmN1cmlkeCA9IC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjICpvZ2dfZmluZF9jb2RlYyh1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgb2dnX2NvZGVjc1tpXTsgaSsrKQorICAgICAgICBpZiAoc2l6ZSA+PSBvZ2dfY29kZWNzW2ldLT5tYWdpY3NpemUgJiYKKyAgICAgICAgICAgICFtZW1jbXAoYnVmLCBvZ2dfY29kZWNzW2ldLT5tYWdpYywgb2dnX2NvZGVjc1tpXS0+bWFnaWNzaXplKSkKKyAgICAgICAgICAgIHJldHVybiBvZ2dfY29kZWNzW2ldOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgY3VycmVudCBzdHJlYW0gd2l0aCBhIG5ldyBvbmUuIFRoaXMgaXMgYSB0eXBpY2FsIHdlYnJhZGlvCisgKiBzaXR1YXRpb24gd2hlcmUgYSBuZXcgYXVkaW8gc3RyZWFtIHNwYXduIChpZGVudGlmaWVkIHdpdGggYSBuZXcgc2VyaWFsKSBhbmQKKyAqIG11c3QgcmVwbGFjZSB0aGUgcHJldmlvdXMgb25lICh0cmFjayBzd2l0Y2gpLgorICovCitzdGF0aWMgaW50IG9nZ19yZXBsYWNlX3N0cmVhbShBVkZvcm1hdENvbnRleHQgKnMsIHVpbnQzMl90IHNlcmlhbCwgaW50IG5zZWdzKQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3M7CisgICAgY29uc3Qgc3RydWN0IG9nZ19jb2RlYyAqY29kZWM7CisgICAgaW50IGkgPSAwOworCisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSkgeworICAgICAgICB1aW50OF90IG1hZ2ljWzhdOworICAgICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgbnNlZ3MpOworICAgICAgICBhdmlvX3JlYWQocy0+cGIsIG1hZ2ljLCBzaXplb2YobWFnaWMpKTsKKyAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBwb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgY29kZWMgPSBvZ2dfZmluZF9jb2RlYyhtYWdpYywgc2l6ZW9mKG1hZ2ljKSk7CisgICAgICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgaWRlbnRpZnkgbmV3IHN0cmVhbVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2dnLT5uc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBpZiAob2dnLT5zdHJlYW1zW2ldLmNvZGVjID09IGNvZGVjKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpID49IG9nZy0+bnN0cmVhbXMpCisgICAgICAgICAgICByZXR1cm4gb2dnX25ld19zdHJlYW0ocywgc2VyaWFsKTsKKyAgICB9IGVsc2UgaWYgKG9nZy0+bnN0cmVhbXMgIT0gMSkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLCAiQ2hhbmdpbmcgc3RyZWFtIHBhcmFtZXRlcnMgaW4gbXVsdGlzdHJlYW0gb2dnIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBvcyA9ICZvZ2ctPnN0cmVhbXNbaV07CisKKyAgICBvcy0+c2VyaWFsICA9IHNlcmlhbDsKKyAgICByZXR1cm4gaTsKKworI2lmIDAKKyAgICBidWYgICAgID0gb3MtPmJ1ZjsKKyAgICBidWZzaXplID0gb3MtPmJ1ZnNpemU7CisgICAgY29kZWMgICA9IG9zLT5jb2RlYzsKKworICAgIGlmICghb2dnLT5zdGF0ZSB8fCBvZ2ctPnN0YXRlLT5zdHJlYW1zW2ldLnByaXZhdGUgIT0gb3MtPnByaXZhdGUpCisgICAgICAgIGF2X2ZyZWVwKCZvZ2ctPnN0cmVhbXNbaV0ucHJpdmF0ZSk7CisKKyAgICAvKiBTZXQgT2dnIHN0cmVhbSBzZXR0aW5ncyBzaW1pbGFyIHRvIHdoYXQgaXMgZG9uZSBpbiBvZ2dfbmV3X3N0cmVhbSgpLiBXZQorICAgICAqIGFsc28gcmUtdXNlIHRoZSBvZ2dfc3RyZWFtIGFsbG9jYXRlZCBidWZmZXIgKi8KKyAgICBtZW1zZXQob3MsIDAsIHNpemVvZigqb3MpKTsKKyAgICBvcy0+c2VyaWFsICA9IHNlcmlhbDsKKyAgICBvcy0+YnVmc2l6ZSA9IGJ1ZnNpemU7CisgICAgb3MtPmJ1ZiAgICAgPSBidWY7CisgICAgb3MtPmhlYWRlciAgPSAtMTsKKyAgICBvcy0+Y29kZWMgICA9IGNvZGVjOworCisgICAgcmV0dXJuIGk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBvZ2dfbmV3X3N0cmVhbShBVkZvcm1hdENvbnRleHQgKnMsIHVpbnQzMl90IHNlcmlhbCkKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGlkeCAgICAgICAgID0gb2dnLT5uc3RyZWFtczsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zOworICAgIHNpemVfdCBzaXplOworCisgICAgaWYgKG9nZy0+c3RhdGUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5ldyBzdHJlYW1zIGFyZSBub3Qgc3VwcG9zZWQgdG8gYmUgYWRkZWQgIgorICAgICAgICAgICAgICAgImluIGJldHdlZW4gT2dnIGNvbnRleHQgc2F2ZS9yZXN0b3JlIG9wZXJhdGlvbnMuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGFuZCBpbml0IGEgbmV3IE9nZyBTdHJlYW0gKi8KKyAgICBpZiAoYXZfc2l6ZV9tdWx0KG9nZy0+bnN0cmVhbXMgKyAxLCBzaXplb2YoKm9nZy0+c3RyZWFtcyksICZzaXplKSA8IDAgfHwKKyAgICAgICAgIShvcyA9IGF2X3JlYWxsb2Mob2dnLT5zdHJlYW1zLCBzaXplKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgb2dnLT5zdHJlYW1zID0gb3M7CisgICAgb3MgICAgICAgICAgID0gb2dnLT5zdHJlYW1zICsgaWR4OworICAgIG1lbXNldChvcywgMCwgc2l6ZW9mKCpvcykpOworICAgIG9zLT5zZXJpYWwgICAgICAgID0gc2VyaWFsOworICAgIG9zLT5idWZzaXplICAgICAgID0gREVDT0RFUl9CVUZGRVJfU0laRTsKKyAgICBvcy0+YnVmICAgICAgICAgICA9IGF2X21hbGxvYyhvcy0+YnVmc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIG9zLT5oZWFkZXIgICAgICAgID0gLTE7CisgICAgb3MtPnN0YXJ0X2dyYW51bGUgPSBPR0dfTk9HUkFOVUxFX1ZBTFVFOworICAgIGlmICghb3MtPmJ1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8qIENyZWF0ZSB0aGUgYXNzb2NpYXRlZCBBVlN0cmVhbSAqLworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KSB7CisgICAgICAgIGF2X2ZyZWVwKCZvcy0+YnVmKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgc3QtPmlkID0gaWR4OworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsKKworICAgIG9nZy0+bnN0cmVhbXMrKzsKKyAgICByZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW50IG9nZ19uZXdfYnVmKHN0cnVjdCBvZ2cgKm9nZywgaW50IGlkeCkKK3sKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisgICAgdWludDhfdCAqbmIgPSBhdl9tYWxsb2Mob3MtPmJ1ZnNpemUgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpbnQgc2l6ZSA9IG9zLT5idWZwb3MgLSBvcy0+cHN0YXJ0OworCisgICAgaWYgKG9zLT5idWYpIHsKKyAgICAgICAgbWVtY3B5KG5iLCBvcy0+YnVmICsgb3MtPnBzdGFydCwgc2l6ZSk7CisgICAgICAgIGF2X2ZyZWUob3MtPmJ1Zik7CisgICAgfQorCisgICAgb3MtPmJ1ZiAgICA9IG5iOworICAgIG9zLT5idWZwb3MgPSBzaXplOworICAgIG9zLT5wc3RhcnQgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGF0YV9wYWNrZXRzX3NlZW4oY29uc3Qgc3RydWN0IG9nZyAqb2dnKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG9nZy0+bnN0cmVhbXM7IGkrKykKKyAgICAgICAgaWYgKG9nZy0+c3RyZWFtc1tpXS5nb3RfZGF0YSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9nZ19yZWFkX3BhZ2UoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgKnNpZCkKK3sKKyAgICBBVklPQ29udGV4dCAqYmMgPSBzLT5wYjsKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgPSBzLT5wcml2X2RhdGE7CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zOworICAgIGludCByZXQsIGkgPSAwOworICAgIGludCBmbGFncywgbnNlZ3M7CisgICAgdWludDY0X3QgZ3A7CisgICAgdWludDMyX3Qgc2VyaWFsOworICAgIGludCBzaXplLCBpZHg7CisgICAgdWludDhfdCBzeW5jWzRdOworICAgIGludCBzcCA9IDA7CisKKyAgICByZXQgPSBhdmlvX3JlYWQoYmMsIHN5bmMsIDQpOworICAgIGlmIChyZXQgPCA0KQorICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1JfRU9GOworCisgICAgZG8geworICAgICAgICBpbnQgYzsKKworICAgICAgICBpZiAoc3luY1tzcCAmIDNdID09ICdPJyAmJgorICAgICAgICAgICAgc3luY1soc3AgKyAxKSAmIDNdID09ICdnJyAmJgorICAgICAgICAgICAgc3luY1soc3AgKyAyKSAmIDNdID09ICdnJyAmJiBzeW5jWyhzcCArIDMpICYgM10gPT0gJ1MnKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYoIWkgJiYgYmMtPnNlZWthYmxlICYmIG9nZy0+cGFnZV9wb3MgPiAwKSB7CisgICAgICAgICAgICBtZW1zZXQoc3luYywgMCwgNCk7CisgICAgICAgICAgICBhdmlvX3NlZWsoYmMsIG9nZy0+cGFnZV9wb3MrNCwgU0VFS19TRVQpOworICAgICAgICAgICAgb2dnLT5wYWdlX3BvcyA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgYyA9IGF2aW9fcjgoYmMpOworCisgICAgICAgIGlmIChhdmlvX2Zlb2YoYmMpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgICAgIHN5bmNbc3ArKyAmIDNdID0gYzsKKyAgICB9IHdoaWxlIChpKysgPCBNQVhfUEFHRV9TSVpFKTsKKworICAgIGlmIChpID49IE1BWF9QQUdFX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiY2Fubm90IGZpbmQgc3luYyB3b3JkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGF2aW9fcjgoYmMpICE9IDApIHsgICAgICAvKiB2ZXJzaW9uICovCisgICAgICAgIGF2X2xvZyAocywgQVZfTE9HX0VSUk9SLCAib2dnIHBhZ2UsIHVuc3VwcG9ydGVkIHZlcnNpb25cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmbGFncyAgPSBhdmlvX3I4KGJjKTsKKyAgICBncCAgICAgPSBhdmlvX3JsNjQoYmMpOworICAgIHNlcmlhbCA9IGF2aW9fcmwzMihiYyk7CisgICAgYXZpb19za2lwKGJjLCA4KTsgLyogc2VxLCBjcmMgKi8KKyAgICBuc2VncyAgPSBhdmlvX3I4KGJjKTsKKworICAgIGlkeCA9IG9nZ19maW5kX3N0cmVhbShvZ2csIHNlcmlhbCk7CisgICAgaWYgKGlkeCA8IDApIHsKKyAgICAgICAgaWYgKGRhdGFfcGFja2V0c19zZWVuKG9nZykpCisgICAgICAgICAgICBpZHggPSBvZ2dfcmVwbGFjZV9zdHJlYW0ocywgc2VyaWFsLCBuc2Vncyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlkeCA9IG9nZ19uZXdfc3RyZWFtKHMsIHNlcmlhbCk7CisKKyAgICAgICAgaWYgKGlkeCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJmYWlsZWQgdG8gY3JlYXRlIG9yIHJlcGxhY2Ugc3RyZWFtXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBpZHg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKKyAgICBvZ2ctPnBhZ2VfcG9zID0KKyAgICBvcy0+cGFnZV9wb3MgPSBhdmlvX3RlbGwoYmMpIC0gMjc7CisKKyAgICBpZiAob3MtPnBzaXplID4gMCkKKyAgICAgICAgb2dnX25ld19idWYob2dnLCBpZHgpOworCisgICAgcmV0ID0gYXZpb19yZWFkKGJjLCBvcy0+c2VnbWVudHMsIG5zZWdzKTsKKyAgICBpZiAocmV0IDwgbnNlZ3MpCisgICAgICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogQVZFUlJPUl9FT0Y7CisKKyAgICBvcy0+bnNlZ3MgPSBuc2VnczsKKyAgICBvcy0+c2VncCAgPSAwOworCisgICAgc2l6ZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG5zZWdzOyBpKyspCisgICAgICAgIHNpemUgKz0gb3MtPnNlZ21lbnRzW2ldOworCisgICAgaWYgKCEoZmxhZ3MgJiBPR0dfRkxBR19CT1MpKQorICAgICAgICBvcy0+Z290X2RhdGEgPSAxOworCisgICAgaWYgKGZsYWdzICYgT0dHX0ZMQUdfQ09OVCB8fCBvcy0+aW5jb21wbGV0ZSkgeworICAgICAgICBpZiAoIW9zLT5wc2l6ZSkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgdmVyeSBmaXJzdCBzZWdtZW50IHdlIHN0YXJ0ZWQKKyAgICAgICAgICAgIC8vIHBsYXliYWNrIGluIHRoZSBtaWRkbGUgb2YgYSBjb250aW51YXRpb24gcGFja2V0LgorICAgICAgICAgICAgLy8gRGlzY2FyZCBpdCBzaW5jZSB3ZSBtaXNzZWQgdGhlIHN0YXJ0IG9mIGl0LgorICAgICAgICAgICAgd2hpbGUgKG9zLT5zZWdwIDwgb3MtPm5zZWdzKSB7CisgICAgICAgICAgICAgICAgaW50IHNlZyA9IG9zLT5zZWdtZW50c1tvcy0+c2VncCsrXTsKKyAgICAgICAgICAgICAgICBvcy0+cHN0YXJ0ICs9IHNlZzsKKyAgICAgICAgICAgICAgICBpZiAoc2VnIDwgMjU1KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9zLT5zeW5jX3BvcyA9IG9zLT5wYWdlX3BvczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG9zLT5wc2l6ZSAgICA9IDA7CisgICAgICAgIG9zLT5zeW5jX3BvcyA9IG9zLT5wYWdlX3BvczsKKyAgICB9CisKKyAgICBpZiAob3MtPmJ1ZnNpemUgLSBvcy0+YnVmcG9zIDwgc2l6ZSkgeworICAgICAgICB1aW50OF90ICpuYiA9IGF2X21hbGxvYygob3MtPmJ1ZnNpemUgKj0gMikgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgaWYgKCFuYikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbWNweShuYiwgb3MtPmJ1Ziwgb3MtPmJ1ZnBvcyk7CisgICAgICAgIGF2X2ZyZWUob3MtPmJ1Zik7CisgICAgICAgIG9zLT5idWYgPSBuYjsKKyAgICB9CisKKyAgICByZXQgPSBhdmlvX3JlYWQoYmMsIG9zLT5idWYgKyBvcy0+YnVmcG9zLCBzaXplKTsKKyAgICBpZiAocmV0IDwgc2l6ZSkKKyAgICAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiBBVkVSUk9SX0VPRjsKKworICAgIG9zLT5idWZwb3MgKz0gc2l6ZTsKKyAgICBvcy0+Z3JhbnVsZSA9IGdwOworICAgIG9zLT5mbGFncyAgID0gZmxhZ3M7CisKKyAgICBtZW1zZXQob3MtPmJ1ZiArIG9zLT5idWZwb3MsIDAsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmIChzaWQpCisgICAgICAgICpzaWQgPSBpZHg7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBAYnJpZWYgZmluZCB0aGUgbmV4dCBPZ2cgcGFja2V0CisgKiBAcGFyYW0gKnNpZCBpcyBzZXQgdG8gdGhlIHN0cmVhbSBmb3IgdGhlIHBhY2tldCBvciAtMSBpZiB0aGVyZSBpcworICogICAgICAgICAgICAgbm8gbWF0Y2hpbmcgc3RyZWFtLCBpbiB0aGF0IGNhc2UgYXNzdW1lIGFsbCBvdGhlciByZXR1cm4KKyAqICAgICAgICAgICAgIHZhbHVlcyB0byBiZSB1bmluaXRpYWxpemVkLgorICogQHJldHVybiBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvciBvciBFT0YuCisgKi8KK3N0YXRpYyBpbnQgb2dnX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIGludCAqc2lkLCBpbnQgKmRzdGFydCwgaW50ICpkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcG9zKQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaWR4LCBpLCByZXQ7CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zOworICAgIGludCBjb21wbGV0ZSA9IDA7CisgICAgaW50IHNlZ3AgICAgID0gMCwgcHNpemUgPSAwOworCisgICAgYXZfZGxvZyhzLCAib2dnX3BhY2tldDogY3VyaWR4PSVpXG4iLCBvZ2ctPmN1cmlkeCk7CisgICAgaWYgKHNpZCkKKyAgICAgICAgKnNpZCA9IC0xOworCisgICAgZG8geworICAgICAgICBpZHggPSBvZ2ctPmN1cmlkeDsKKworICAgICAgICB3aGlsZSAoaWR4IDwgMCkgeworICAgICAgICAgICAgcmV0ID0gb2dnX3JlYWRfcGFnZShzLCAmaWR4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKKworICAgICAgICBhdl9kbG9nKHMsICJvZ2dfcGFja2V0OiBpZHg9JWQgcHN0YXJ0PSVkIHBzaXplPSVkIHNlZ3A9JWQgbnNlZ3M9JWRcbiIsCisgICAgICAgICAgICAgICAgaWR4LCBvcy0+cHN0YXJ0LCBvcy0+cHNpemUsIG9zLT5zZWdwLCBvcy0+bnNlZ3MpOworCisgICAgICAgIGlmICghb3MtPmNvZGVjKSB7CisgICAgICAgICAgICBpZiAob3MtPmhlYWRlciA8IDApIHsKKyAgICAgICAgICAgICAgICBvcy0+Y29kZWMgPSBvZ2dfZmluZF9jb2RlYyhvcy0+YnVmLCBvcy0+YnVmcG9zKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9zLT5jb2RlYykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJDb2RlYyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgICAgICAgICBvcy0+aGVhZGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNlZ3AgID0gb3MtPnNlZ3A7CisgICAgICAgIHBzaXplID0gb3MtPnBzaXplOworCisgICAgICAgIHdoaWxlIChvcy0+c2VncCA8IG9zLT5uc2VncykgeworICAgICAgICAgICAgaW50IHNzID0gb3MtPnNlZ21lbnRzW29zLT5zZWdwKytdOworICAgICAgICAgICAgb3MtPnBzaXplICs9IHNzOworICAgICAgICAgICAgaWYgKHNzIDwgMjU1KSB7CisgICAgICAgICAgICAgICAgY29tcGxldGUgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjb21wbGV0ZSAmJiBvcy0+c2VncCA9PSBvcy0+bnNlZ3MpIHsKKyAgICAgICAgICAgIG9nZy0+Y3VyaWR4ICAgID0gLTE7CisgICAgICAgICAgICAvLyBEbyBub3Qgc2V0IGluY29tcGxldGUgZm9yIGVtcHR5IHBhY2tldHMuCisgICAgICAgICAgICAvLyBUb2dldGhlciB3aXRoIHRoZSBjb2RlIGluIG9nZ19yZWFkX3BhZ2UKKyAgICAgICAgICAgIC8vIHRoYXQgZGlzY2FyZHMgYWxsIGNvbnRpbnVhdGlvbiBvZiBlbXB0eSBwYWNrZXRzCisgICAgICAgICAgICAvLyB3ZSB3b3VsZCBnZXQgYW4gaW5maW5pdGUgbG9vcC4KKyAgICAgICAgICAgIG9zLT5pbmNvbXBsZXRlID0gISFvcy0+cHNpemU7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICghY29tcGxldGUpOworCisKKyAgICBpZiAob3MtPmdyYW51bGUgPT0gLTEpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJQYWdlIGF0ICUiUFJJZDY0IiBpcyBtaXNzaW5nIGdyYW51bGVcbiIsCisgICAgICAgICAgICAgICBvcy0+cGFnZV9wb3MpOworCisgICAgb2dnLT5jdXJpZHggICAgPSBpZHg7CisgICAgb3MtPmluY29tcGxldGUgPSAwOworCisgICAgaWYgKG9zLT5oZWFkZXIpIHsKKyAgICAgICAgb3MtPmhlYWRlciA9IG9zLT5jb2RlYy0+aGVhZGVyKHMsIGlkeCk7CisgICAgICAgIGlmICghb3MtPmhlYWRlcikgeworICAgICAgICAgICAgb3MtPnNlZ3AgID0gc2VncDsKKyAgICAgICAgICAgIG9zLT5wc2l6ZSA9IHBzaXplOworCisgICAgICAgICAgICAvLyBXZSBoYXZlIHJlYWNoZWQgdGhlIGZpcnN0IG5vbi1oZWFkZXIgcGFja2V0IGluIHRoaXMgc3RyZWFtLgorICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSBtb3JlIGhlYWRlciBwYWNrZXRzIG1heSBzdGlsbCBmb2xsb3cgZm9yIG90aGVycywKKyAgICAgICAgICAgIC8vIGJ1dCBpZiB3ZSBjb250aW51ZSB3aXRoIGhlYWRlciBwYXJzaW5nIHdlIG1heSBsb3NlIGRhdGEgcGFja2V0cy4KKyAgICAgICAgICAgIG9nZy0+aGVhZGVycyA9IDE7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaGVhZGVyIHN0YXRlIGZvciBhbGwgc3RyZWFtcyBhbmQKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGRhdGFfb2Zmc2V0LgorICAgICAgICAgICAgaWYgKCFzLT5kYXRhX29mZnNldCkKKyAgICAgICAgICAgICAgICBzLT5kYXRhX29mZnNldCA9IG9zLT5zeW5jX3BvczsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9nZy0+bnN0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpjdXJfb3MgPSBvZ2ctPnN0cmVhbXMgKyBpOworCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHBhcnRpYWwgbm9uLWhlYWRlciBwYWNrZXQsIGl0cyBzdGFydCBpcworICAgICAgICAgICAgICAgIC8vIG9idmlvdXNseSBhdCBvciBhZnRlciB0aGUgZGF0YSBzdGFydAorICAgICAgICAgICAgICAgIGlmIChjdXJfb3MtPmluY29tcGxldGUpCisgICAgICAgICAgICAgICAgICAgIHMtPmRhdGFfb2Zmc2V0ID0gRkZNSU4ocy0+ZGF0YV9vZmZzZXQsIGN1cl9vcy0+c3luY19wb3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3MtPm5iX2hlYWRlcisrOworICAgICAgICAgICAgb3MtPnBzdGFydCArPSBvcy0+cHNpemU7CisgICAgICAgICAgICBvcy0+cHNpemUgICA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBvcy0+cGZsYWdzICAgID0gMDsKKyAgICAgICAgb3MtPnBkdXJhdGlvbiA9IDA7CisgICAgICAgIGlmIChvcy0+Y29kZWMgJiYgb3MtPmNvZGVjLT5wYWNrZXQpCisgICAgICAgICAgICBvcy0+Y29kZWMtPnBhY2tldChzLCBpZHgpOworICAgICAgICBpZiAoc2lkKQorICAgICAgICAgICAgKnNpZCA9IGlkeDsKKyAgICAgICAgaWYgKGRzdGFydCkKKyAgICAgICAgICAgICpkc3RhcnQgPSBvcy0+cHN0YXJ0OworICAgICAgICBpZiAoZHNpemUpCisgICAgICAgICAgICAqZHNpemUgPSBvcy0+cHNpemU7CisgICAgICAgIGlmIChmcG9zKQorICAgICAgICAgICAgKmZwb3MgPSBvcy0+c3luY19wb3M7CisgICAgICAgIG9zLT5wc3RhcnQgICs9IG9zLT5wc2l6ZTsKKyAgICAgICAgb3MtPnBzaXplICAgID0gMDsKKyAgICAgICAgaWYob3MtPnBzdGFydCA9PSBvcy0+YnVmcG9zKQorICAgICAgICAgICAgb3MtPmJ1ZnBvcyA9IG9zLT5wc3RhcnQgPSAwOworICAgICAgICBvcy0+c3luY19wb3MgPSBvcy0+cGFnZV9wb3M7CisgICAgfQorCisgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgY29tcGxldGUgcGFja2V0cyBpbiB0aGlzIHBhZ2UKKyAgICAvLyBpZiBub3QsIHRoZSBwYWdlJ3MgZ3JhbnVsZSB3aWxsIGFwcGx5IHRvIHRoaXMgcGFja2V0CisgICAgb3MtPnBhZ2VfZW5kID0gMTsKKyAgICBmb3IgKGkgPSBvcy0+c2VncDsgaSA8IG9zLT5uc2VnczsgaSsrKQorICAgICAgICBpZiAob3MtPnNlZ21lbnRzW2ldIDwgMjU1KSB7CisgICAgICAgICAgICBvcy0+cGFnZV9lbmQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGlmIChvcy0+c2VncCA9PSBvcy0+bnNlZ3MpCisgICAgICAgIG9nZy0+Y3VyaWR4ID0gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvZ2dfZ2V0X2xlbmd0aChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpOworICAgIGludDY0X3Qgc2l6ZSwgZW5kOworICAgIGludCBzdHJlYW1zX2xlZnQ9MDsKKworICAgIGlmICghcy0+cGItPnNlZWthYmxlKQorICAgICAgICByZXR1cm4gMDsKKworLy8gYWxyZWFkeSBzZXQKKyAgICBpZiAocy0+ZHVyYXRpb24gIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHJldHVybiAwOworCisgICAgc2l6ZSA9IGF2aW9fc2l6ZShzLT5wYik7CisgICAgaWYgKHNpemUgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlbmQgPSBzaXplID4gTUFYX1BBR0VfU0laRSA/IHNpemUgLSBNQVhfUEFHRV9TSVpFIDogMDsKKworICAgIG9nZ19zYXZlKHMpOworICAgIGF2aW9fc2VlayhzLT5wYiwgZW5kLCBTRUVLX1NFVCk7CisgICAgb2dnLT5wYWdlX3BvcyA9IC0xOworCisgICAgd2hpbGUgKCFvZ2dfcmVhZF9wYWdlKHMsICZpKSkgeworICAgICAgICBpZiAob2dnLT5zdHJlYW1zW2ldLmdyYW51bGUgIT0gLTEgJiYgb2dnLT5zdHJlYW1zW2ldLmdyYW51bGUgIT0gMCAmJgorICAgICAgICAgICAgb2dnLT5zdHJlYW1zW2ldLmNvZGVjKSB7CisgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5kdXJhdGlvbiA9CisgICAgICAgICAgICAgICAgb2dnX2dwdG9wdHMocywgaSwgb2dnLT5zdHJlYW1zW2ldLmdyYW51bGUsIE5VTEwpOworICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5kdXJhdGlvbiAtPSBzLT5zdHJlYW1zW2ldLT5zdGFydF90aW1lOworICAgICAgICAgICAgICAgIHN0cmVhbXNfbGVmdC09IChvZ2ctPnN0cmVhbXNbaV0uZ290X3N0YXJ0PT0tMSk7CisgICAgICAgICAgICAgICAgb2dnLT5zdHJlYW1zW2ldLmdvdF9zdGFydD0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZighb2dnLT5zdHJlYW1zW2ldLmdvdF9zdGFydCkgeworICAgICAgICAgICAgICAgIG9nZy0+c3RyZWFtc1tpXS5nb3Rfc3RhcnQ9IC0xOworICAgICAgICAgICAgICAgIHN0cmVhbXNfbGVmdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgb2dnX3Jlc3RvcmUocywgMCk7CisKKyAgICBvZ2dfc2F2ZSAocyk7CisgICAgYXZpb19zZWVrIChzLT5wYiwgcy0+ZGF0YV9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBvZ2dfcmVzZXQocyk7CisgICAgd2hpbGUgKHN0cmVhbXNfbGVmdCA+IDAgJiYgIW9nZ19wYWNrZXQocywgJmksIE5VTEwsIE5VTEwsIE5VTEwpKSB7CisgICAgICAgIGludDY0X3QgcHRzOworICAgICAgICBpZiAoaSA8IDApIGNvbnRpbnVlOworICAgICAgICBwdHMgPSBvZ2dfY2FsY19wdHMocywgaSwgTlVMTCk7CisgICAgICAgIGlmIChwdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcy0+c3RyZWFtc1tpXS0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSAmJiAhb2dnLT5zdHJlYW1zW2ldLmdvdF9zdGFydCkgeworICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+ZHVyYXRpb24gLT0gcHRzOworICAgICAgICAgICAgb2dnLT5zdHJlYW1zW2ldLmdvdF9zdGFydD0gMTsKKyAgICAgICAgICAgIHN0cmVhbXNfbGVmdC0tOworICAgICAgICB9ZWxzZSBpZihzLT5zdHJlYW1zW2ldLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFICYmICFvZ2ctPnN0cmVhbXNbaV0uZ290X3N0YXJ0KSB7CisgICAgICAgICAgICBvZ2ctPnN0cmVhbXNbaV0uZ290X3N0YXJ0PSAxOworICAgICAgICAgICAgc3RyZWFtc19sZWZ0LS07CisgICAgICAgIH0KKyAgICB9CisgICAgb2dnX3Jlc3RvcmUgKHMsIDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2dnX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBvZ2ctPm5zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJm9nZy0+c3RyZWFtc1tpXS5idWYpOworICAgICAgICBpZiAob2dnLT5zdHJlYW1zW2ldLmNvZGVjICYmCisgICAgICAgICAgICBvZ2ctPnN0cmVhbXNbaV0uY29kZWMtPmNsZWFudXApIHsKKyAgICAgICAgICAgIG9nZy0+c3RyZWFtc1tpXS5jb2RlYy0+Y2xlYW51cChzLCBpKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmb2dnLT5zdHJlYW1zW2ldLnByaXZhdGUpOworICAgICAgICBhdl9mcmVlcCgmb2dnLT5zdHJlYW1zW2ldLm5ld19tZXRhZGF0YSk7CisgICAgfQorCisgICAgb2dnLT5uc3RyZWFtcyA9IDA7CisKKyAgICBhdl9mcmVlcCgmb2dnLT5zdHJlYW1zKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvZ2dfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBpOworCisgICAgb2dnLT5jdXJpZHggPSAtMTsKKworICAgIC8vbGluZWFyIGhlYWRlcnMgc2VlayBmcm9tIHN0YXJ0CisgICAgZG8geworICAgICAgICByZXQgPSBvZ2dfcGFja2V0KHMsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgb2dnX3JlYWRfY2xvc2Uocyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfSB3aGlsZSAoIW9nZy0+aGVhZGVycyk7CisgICAgYXZfZGxvZyhzLCAiZm91bmQgaGVhZGVyc1xuIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgb2dnLT5uc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGk7CisKKyAgICAgICAgaWYgKG9nZy0+c3RyZWFtc1tpXS5oZWFkZXIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSGVhZGVyIHBhcnNpbmcgZmFpbGVkIGZvciBzdHJlYW0gJWRcbiIsIGkpOworICAgICAgICAgICAgb2dnLT5zdHJlYW1zW2ldLmNvZGVjID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmIChvcy0+Y29kZWMgJiYgb3MtPm5iX2hlYWRlciA8IG9zLT5jb2RlYy0+bmJfaGVhZGVyKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkhlYWRlcnMgbWlzbWF0Y2ggZm9yIHN0cmVhbSAlZDogIgorICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlZCByZWNlaXZlZCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgaSwgb3MtPmNvZGVjLT5uYl9oZWFkZXIsIG9zLT5uYl9oZWFkZXIpOworICAgICAgICAgICAgaWYgKHMtPmVycm9yX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3MtPnN0YXJ0X2dyYW51bGUgIT0gT0dHX05PR1JBTlVMRV9WQUxVRSkKKyAgICAgICAgICAgIG9zLT5sYXN0cHRzID0gcy0+c3RyZWFtc1tpXS0+c3RhcnRfdGltZSA9CisgICAgICAgICAgICAgICAgb2dnX2dwdG9wdHMocywgaSwgb3MtPnN0YXJ0X2dyYW51bGUsIE5VTEwpOworICAgIH0KKworICAgIC8vbGluZWFyIGdyYW51bGVwb3Mgc2VlayBmcm9tIGVuZAorICAgIG9nZ19nZXRfbGVuZ3RoKHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQ2NF90IG9nZ19jYWxjX3B0cyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZHgsIGludDY0X3QgKmR0cykKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgICAgICAgPSBzLT5wcml2X2RhdGE7CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zID0gb2dnLT5zdHJlYW1zICsgaWR4OworICAgIGludDY0X3QgcHRzICAgICAgICAgICA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgaWYgKGR0cykKKyAgICAgICAgKmR0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgaWYgKG9zLT5sYXN0cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIHB0cyAgICAgICAgID0gb3MtPmxhc3RwdHM7CisgICAgICAgIG9zLT5sYXN0cHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgfQorICAgIGlmIChvcy0+bGFzdGR0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBpZiAoZHRzKQorICAgICAgICAgICAgKmR0cyA9IG9zLT5sYXN0ZHRzOworICAgICAgICBvcy0+bGFzdGR0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIH0KKyAgICBpZiAob3MtPnBhZ2VfZW5kKSB7CisgICAgICAgIGlmIChvcy0+Z3JhbnVsZSAhPSAtMUxMKSB7CisgICAgICAgICAgICBpZiAob3MtPmNvZGVjICYmIG9zLT5jb2RlYy0+Z3JhbnVsZV9pc19zdGFydCkKKyAgICAgICAgICAgICAgICBwdHMgPSBvZ2dfZ3B0b3B0cyhzLCBpZHgsIG9zLT5ncmFudWxlLCBkdHMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9zLT5sYXN0cHRzID0gb2dnX2dwdG9wdHMocywgaWR4LCBvcy0+Z3JhbnVsZSwgJm9zLT5sYXN0ZHRzKTsKKyAgICAgICAgICAgIG9zLT5ncmFudWxlID0gLTFMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcHRzOworfQorCitzdGF0aWMgdm9pZCBvZ2dfdmFsaWRhdGVfa2V5ZnJhbWUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWR4LCBpbnQgcHN0YXJ0LCBpbnQgcHNpemUpCit7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKKyAgICBpbnQgaW52YWxpZCA9IDA7CisgICAgaWYgKHBzaXplKSB7CisgICAgICAgIHN3aXRjaCAocy0+c3RyZWFtc1tpZHhdLT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9USEVPUkE6CisgICAgICAgICAgICBpbnZhbGlkID0gISEob3MtPnBmbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkgIT0gIShvcy0+YnVmW3BzdGFydF0gJiAweDQwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfVlA4OgorICAgICAgICAgICAgaW52YWxpZCA9ICEhKG9zLT5wZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpICE9ICEob3MtPmJ1Zltwc3RhcnRdICYgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludmFsaWQpIHsKKyAgICAgICAgICAgIG9zLT5wZmxhZ3MgXj0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiQnJva2VuIGZpbGUsICVza2V5ZnJhbWUgbm90IGNvcnJlY3RseSBtYXJrZWQuXG4iLAorICAgICAgICAgICAgICAgICAgIChvcy0+cGZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSA/ICIiIDogIm5vbi0iKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBvZ2dfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIHN0cnVjdCBvZ2cgKm9nZzsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3M7CisgICAgaW50IGlkeCwgcmV0OworICAgIGludCBwc3RhcnQsIHBzaXplOworICAgIGludDY0X3QgZnBvcywgcHRzLCBkdHM7CisKKyAgICBpZiAocy0+aW9fcmVwb3NpdGlvbmVkKSB7CisgICAgICAgIG9nZ19yZXNldChzKTsKKyAgICAgICAgcy0+aW9fcmVwb3NpdGlvbmVkID0gMDsKKyAgICB9CisKKyAgICAvL0dldCBhbiBvZ2cgcGFja2V0CityZXRyeToKKyAgICBkbyB7CisgICAgICAgIHJldCA9IG9nZ19wYWNrZXQocywgJmlkeCwgJnBzdGFydCwgJnBzaXplLCAmZnBvcyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IHdoaWxlIChpZHggPCAwIHx8ICFzLT5zdHJlYW1zW2lkeF0pOworCisgICAgb2dnID0gcy0+cHJpdl9kYXRhOworICAgIG9zICA9IG9nZy0+c3RyZWFtcyArIGlkeDsKKworICAgIC8vIHBmbGFncyBtaWdodCBub3QgYmUgc2V0IHVudGlsIGFmdGVyIHRoaXMKKyAgICBwdHMgPSBvZ2dfY2FsY19wdHMocywgaWR4LCAmZHRzKTsKKyAgICBvZ2dfdmFsaWRhdGVfa2V5ZnJhbWUocywgaWR4LCBwc3RhcnQsIHBzaXplKTsKKworICAgIGlmIChvcy0+a2V5ZnJhbWVfc2VlayAmJiAhKG9zLT5wZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKQorICAgICAgICBnb3RvIHJldHJ5OworICAgIG9zLT5rZXlmcmFtZV9zZWVrID0gMDsKKworICAgIC8vQWxsb2MgYSBwa3QKKyAgICByZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgcHNpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gaWR4OworICAgIG1lbWNweShwa3QtPmRhdGEsIG9zLT5idWYgKyBwc3RhcnQsIHBzaXplKTsKKworICAgIHBrdC0+cHRzICAgICAgPSBwdHM7CisgICAgcGt0LT5kdHMgICAgICA9IGR0czsKKyAgICBwa3QtPmZsYWdzICAgID0gb3MtPnBmbGFnczsKKyAgICBwa3QtPmR1cmF0aW9uID0gb3MtPnBkdXJhdGlvbjsKKyAgICBwa3QtPnBvcyAgICAgID0gZnBvczsKKworICAgIGlmIChvcy0+ZW5kX3RyaW1taW5nKSB7CisgICAgICAgIHVpbnQ4X3QgKnNpZGVfZGF0YSA9IGF2X3BhY2tldF9uZXdfc2lkZV9kYXRhKHBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfU0tJUF9TQU1QTEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCk7CisgICAgICAgIGlmKCFzaWRlX2RhdGEpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIEFWX1dMMzIoc2lkZV9kYXRhICsgNCwgb3MtPmVuZF90cmltbWluZyk7CisgICAgICAgIG9zLT5lbmRfdHJpbW1pbmcgPSAwOworICAgIH0KKworICAgIGlmIChvcy0+bmV3X21ldGFkYXRhKSB7CisgICAgICAgIHVpbnQ4X3QgKnNpZGVfZGF0YSA9IGF2X3BhY2tldF9uZXdfc2lkZV9kYXRhKHBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfTUVUQURBVEFfVVBEQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy0+bmV3X21ldGFkYXRhX3NpemUpOworICAgICAgICBpZighc2lkZV9kYXRhKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIG1lbWNweShzaWRlX2RhdGEsIG9zLT5uZXdfbWV0YWRhdGEsIG9zLT5uZXdfbWV0YWRhdGFfc2l6ZSk7CisgICAgICAgIGF2X2ZyZWVwKCZvcy0+bmV3X21ldGFkYXRhKTsKKyAgICAgICAgb3MtPm5ld19tZXRhZGF0YV9zaXplID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcHNpemU7CitmYWlsOgorICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworc3RhdGljIGludDY0X3Qgb2dnX3JlYWRfdGltZXN0YW1wKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpwb3NfYXJnLCBpbnQ2NF90IHBvc19saW1pdCkKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKmJjID0gcy0+cGI7CisgICAgaW50NjRfdCBwdHMgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgaW50NjRfdCBrZXlwb3MgID0gLTE7CisgICAgaW50IGk7CisgICAgaW50IHBzdGFydCwgcHNpemU7CisgICAgYXZpb19zZWVrKGJjLCAqcG9zX2FyZywgU0VFS19TRVQpOworICAgIG9nZ19yZXNldChzKTsKKworICAgIHdoaWxlICggICBhdmlvX3RlbGwoYmMpIDw9IHBvc19saW1pdAorICAgICAgICAgICAmJiAhb2dnX3BhY2tldChzLCAmaSwgJnBzdGFydCwgJnBzaXplLCBwb3NfYXJnKSkgeworICAgICAgICBpZiAoaSA9PSBzdHJlYW1faW5kZXgpIHsKKyAgICAgICAgICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIHN0cmVhbV9pbmRleDsKKyAgICAgICAgICAgIC8vIERvIG5vdCB0cnVzdCB0aGUgbGFzdCB0aW1lc3RhbXBzIG9mIGEgb2dtIHZpZGVvCisgICAgICAgICAgICBpZiAoICAgIChvcy0+ZmxhZ3MgJiBPR0dfRkxBR19FT1MpCisgICAgICAgICAgICAgICAgJiYgIShvcy0+ZmxhZ3MgJiBPR0dfRkxBR19CT1MpCisgICAgICAgICAgICAgICAgJiYgb3MtPmNvZGVjID09ICZmZl9vZ21fdmlkZW9fY29kZWMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBwdHMgPSBvZ2dfY2FsY19wdHMocywgaSwgTlVMTCk7CisgICAgICAgICAgICBvZ2dfdmFsaWRhdGVfa2V5ZnJhbWUocywgaSwgcHN0YXJ0LCBwc2l6ZSk7CisgICAgICAgICAgICBpZiAob3MtPnBmbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkgeworICAgICAgICAgICAgICAgIGtleXBvcyA9ICpwb3NfYXJnOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcy0+a2V5ZnJhbWVfc2VlaykgeworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhZCBhIHByZXZpb3VzIGtleWZyYW1lIGJ1dCBubyBwdHMgZm9yIGl0LAorICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGF0IGtleWZyYW1lIHdpdGggdGhpcyBwdHMgdmFsdWUuCisgICAgICAgICAgICAgICAgaWYgKGtleXBvcyA+PSAwKQorICAgICAgICAgICAgICAgICAgICAqcG9zX2FyZyA9IGtleXBvczsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHB0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgb2dnX3Jlc2V0KHMpOworICAgIHJldHVybiBwdHM7Cit9CisKK3N0YXRpYyBpbnQgb2dnX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgICAgICAgPSBzLT5wcml2X2RhdGE7CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zID0gb2dnLT5zdHJlYW1zICsgc3RyZWFtX2luZGV4OworICAgIGludCByZXQ7CisKKyAgICBhdl9hc3NlcnQwKHN0cmVhbV9pbmRleCA8IG9nZy0+bnN0cmVhbXMpOworICAgIC8vIEVuc3VyZSBldmVyeXRoaW5nIGlzIHJlc2V0IGV2ZW4gd2hlbiBzZWVraW5nIHZpYQorICAgIC8vIHRoZSBnZW5lcmF0ZWQgaW5kZXguCisgICAgb2dnX3Jlc2V0KHMpOworCisgICAgLy8gVHJ5IHNlZWtpbmcgdG8gYSBrZXlmcmFtZSBmaXJzdC4gSWYgdGhpcyBmYWlscyAodmVyeSBwb3NzaWJsZSksCisgICAgLy8gYXZfc2Vla19mcmFtZSB3aWxsIGZhbGwgYmFjayB0byBpZ25vcmluZyBrZXlmcmFtZXMKKyAgICBpZiAocy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8KKyAgICAgICAgJiYgIShmbGFncyAmIEFWU0VFS19GTEFHX0FOWSkpCisgICAgICAgIG9zLT5rZXlmcmFtZV9zZWVrID0gMTsKKworICAgIHJldCA9IGZmX3NlZWtfZnJhbWVfYmluYXJ5KHMsIHN0cmVhbV9pbmRleCwgdGltZXN0YW1wLCBmbGFncyk7CisgICAgb3MgID0gb2dnLT5zdHJlYW1zICsgc3RyZWFtX2luZGV4OworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBvcy0+a2V5ZnJhbWVfc2VlayA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvZ2dfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKCFtZW1jbXAoIk9nZ1MiLCBwLT5idWYsIDUpICYmIHAtPmJ1Zls1XSA8PSAweDcpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9vZ2dfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAib2dnIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT2dnIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBvZ2cpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IG9nZ19wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBvZ2dfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gb2dnX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IG9nZ19yZWFkX2Nsb3NlLAorICAgIC5yZWFkX3NlZWsgICAgICA9IG9nZ19yZWFkX3NlZWssCisgICAgLnJlYWRfdGltZXN0YW1wID0gb2dnX3JlYWRfdGltZXN0YW1wLAorICAgIC5leHRlbnNpb25zICAgICA9ICJvZ2ciLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVggfCBBVkZNVF9UU19ESVNDT05UIHwgQVZGTVRfTk9CSU5TRUFSQ0gsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ2RlYy5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzc3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvb2dnZGVjLmgKQEAgLTAsMCArMSwxNjggQEAKKy8qKgorICAgIENvcHlyaWdodCAoQykgMjAwNSAgTWljaGFlbCBBaGxiZXJnLCBNw6VucyBSdWxsZ8OlcmQKKworICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAgICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgICAgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgICAgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAgICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKiovCisKKyNpZm5kZWYgQVZGT1JNQVRfT0dHREVDX0gKKyNkZWZpbmUgQVZGT1JNQVRfT0dHREVDX0gKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKworc3RydWN0IG9nZ19jb2RlYyB7CisgICAgY29uc3QgaW50OF90ICptYWdpYzsKKyAgICB1aW50OF90IG1hZ2ljc2l6ZTsKKyAgICBjb25zdCBpbnQ4X3QgKm5hbWU7CisgICAgLyoqCisgICAgICogQXR0ZW1wdCB0byBwcm9jZXNzIGEgcGFja2V0IGFzIGEgaGVhZGVyCisgICAgICogQHJldHVybiAxIGlmIHRoZSBwYWNrZXQgd2FzIGEgdmFsaWQgaGVhZGVyLAorICAgICAqICAgICAgICAgMCBpZiB0aGUgcGFja2V0IHdhcyBub3QgYSBoZWFkZXIgKHdhcyBhIGRhdGEgcGFja2V0KQorICAgICAqICAgICAgICAgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQgb3IgZm9yIHVuc3VwcG9ydGVkIHN0cmVhbQorICAgICAqLworICAgIGludCAoKmhlYWRlcikoQVZGb3JtYXRDb250ZXh0ICosIGludCk7CisgICAgaW50ICgqcGFja2V0KShBVkZvcm1hdENvbnRleHQgKiwgaW50KTsKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgYSBncmFudWxlIGludG8gYSB0aW1lc3RhbXAuCisgICAgICogV2lsbCBzZXQgZHRzIGlmIG5vbi1udWxsIGFuZCBrbm93bi4KKyAgICAgKiBAcmV0dXJuIHB0cworICAgICAqLworICAgIHVpbnQ2NF90ICgqZ3B0b3B0cykoQVZGb3JtYXRDb250ZXh0ICosIGludCwgdWludDY0X3QsIGludDY0X3QgKmR0cyk7CisgICAgLyoqCisgICAgICogMSBpZiBncmFudWxlIGlzIHRoZSBzdGFydCB0aW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhY2tldC4KKyAgICAgKiAwIGlmIGdyYW51bGUgaXMgdGhlIGVuZCB0aW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhY2tldC4KKyAgICAgKi8KKyAgICBpbnQgZ3JhbnVsZV9pc19zdGFydDsKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgZXhwZWN0ZWQgaGVhZGVycworICAgICAqLworICAgIGludCBuYl9oZWFkZXI7CisgICAgdm9pZCAoKmNsZWFudXApKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGlkeCk7Cit9OworCitzdHJ1Y3Qgb2dnX3N0cmVhbSB7CisgICAgdWludDhfdCAqYnVmOworICAgIHVuc2lnbmVkIGludCBidWZzaXplOworICAgIHVuc2lnbmVkIGludCBidWZwb3M7CisgICAgdW5zaWduZWQgaW50IHBzdGFydDsKKyAgICB1bnNpZ25lZCBpbnQgcHNpemU7CisgICAgdW5zaWduZWQgaW50IHBmbGFnczsKKyAgICB1bnNpZ25lZCBpbnQgcGR1cmF0aW9uOworICAgIHVpbnQzMl90IHNlcmlhbDsKKyAgICB1aW50NjRfdCBncmFudWxlOworICAgIHVpbnQ2NF90IHN0YXJ0X2dyYW51bGU7CisgICAgaW50NjRfdCBsYXN0cHRzOworICAgIGludDY0X3QgbGFzdGR0czsKKyAgICBpbnQ2NF90IHN5bmNfcG9zOyAgIC8vLzwgZmlsZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHBhZ2UgbmVlZGVkIHRvIHJlY29uc3RydWN0IHRoZSBjdXJyZW50IHBhY2tldAorICAgIGludDY0X3QgcGFnZV9wb3M7ICAgLy8vPCBmaWxlIG9mZnNldCBvZiB0aGUgY3VycmVudCBwYWdlCisgICAgaW50IGZsYWdzOworICAgIGNvbnN0IHN0cnVjdCBvZ2dfY29kZWMgKmNvZGVjOworICAgIGludCBoZWFkZXI7CisgICAgaW50IG5zZWdzLCBzZWdwOworICAgIHVpbnQ4X3Qgc2VnbWVudHNbMjU1XTsKKyAgICBpbnQgaW5jb21wbGV0ZTsgLy8vPCB3aGV0aGVyIHdlJ3JlIGV4cGVjdGluZyBhIGNvbnRpbnVhdGlvbiBpbiB0aGUgbmV4dCBwYWdlCisgICAgaW50IHBhZ2VfZW5kOyAgIC8vLzwgY3VycmVudCBwYWNrZXQgaXMgdGhlIGxhc3Qgb25lIGNvbXBsZXRlZCBpbiB0aGUgcGFnZQorICAgIGludCBrZXlmcmFtZV9zZWVrOworICAgIGludCBnb3Rfc3RhcnQ7CisgICAgaW50IGdvdF9kYXRhOyAgIC8vLzwgMSBpZiB0aGUgc3RyZWFtIGdvdCBzb21lIGRhdGEgKG5vbi1pbml0aWFsIHBhY2tldHMpLCAwIG90aGVyd2lzZQorICAgIGludCBuYl9oZWFkZXI7IC8vLzwgc2V0IHRvIHRoZSBudW1iZXIgb2YgcGFyc2VkIGhlYWRlcnMKKyAgICBpbnQgZW5kX3RyaW1taW5nOyAvLy88IHNldCB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdG8gZHJvcCBmcm9tIHRoZSBlbmQKKyAgICB1aW50OF90ICpuZXdfbWV0YWRhdGE7CisgICAgdW5zaWduZWQgaW50IG5ld19tZXRhZGF0YV9zaXplOworICAgIHZvaWQgKnByaXZhdGU7Cit9OworCitzdHJ1Y3Qgb2dnX3N0YXRlIHsKKyAgICB1aW50NjRfdCBwb3M7CisgICAgaW50IGN1cmlkeDsKKyAgICBzdHJ1Y3Qgb2dnX3N0YXRlICpuZXh0OworICAgIGludCBuc3RyZWFtczsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSBzdHJlYW1zWzFdOworfTsKKworc3RydWN0IG9nZyB7CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKnN0cmVhbXM7CisgICAgaW50IG5zdHJlYW1zOworICAgIGludCBoZWFkZXJzOworICAgIGludCBjdXJpZHg7CisgICAgaW50NjRfdCBwYWdlX3BvczsgICAgICAgICAgICAgICAgICAgLy8vPCBmaWxlIG9mZnNldCBvZiB0aGUgY3VycmVudCBwYWdlCisgICAgc3RydWN0IG9nZ19zdGF0ZSAqc3RhdGU7Cit9OworCisjZGVmaW5lIE9HR19GTEFHX0NPTlQgMQorI2RlZmluZSBPR0dfRkxBR19CT1MgIDIKKyNkZWZpbmUgT0dHX0ZMQUdfRU9TICA0CisKKyNkZWZpbmUgT0dHX05PR1JBTlVMRV9WQUxVRSAoLTF1bGwpCisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjIGZmX2NlbHRfY29kZWM7CitleHRlcm4gY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9kaXJhY19jb2RlYzsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjIGZmX2ZsYWNfY29kZWM7CitleHRlcm4gY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9vZ21fYXVkaW9fY29kZWM7CitleHRlcm4gY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9vZ21fb2xkX2NvZGVjOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvZ2dfY29kZWMgZmZfb2dtX3RleHRfY29kZWM7CitleHRlcm4gY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9vZ21fdmlkZW9fY29kZWM7CitleHRlcm4gY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9vbGRfZGlyYWNfY29kZWM7CitleHRlcm4gY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9vbGRfZmxhY19jb2RlYzsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjIGZmX29wdXNfY29kZWM7CitleHRlcm4gY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9za2VsZXRvbl9jb2RlYzsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjIGZmX3NwZWV4X2NvZGVjOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvZ2dfY29kZWMgZmZfdGhlb3JhX2NvZGVjOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvZ2dfY29kZWMgZmZfdm9yYmlzX2NvZGVjOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvZ2dfY29kZWMgZmZfdnA4X2NvZGVjOworCitpbnQgZmZfdm9yYmlzX2NvbW1lbnQoQVZGb3JtYXRDb250ZXh0ICptcywgQVZEaWN0aW9uYXJ5ICoqbSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplLCBpbnQgcGFyc2VfcGljdHVyZSk7CisKK2ludCBmZl92b3JiaXNfc3RyZWFtX2NvbW1lbnQoQVZGb3JtYXRDb250ZXh0ICphcywgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKTsKKworc3RhdGljIGlubGluZSBpbnQKK29nZ19maW5kX3N0cmVhbSAoc3RydWN0IG9nZyAqIG9nZywgaW50IHNlcmlhbCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBvZ2ctPm5zdHJlYW1zOyBpKyspCisgICAgICAgIGlmIChvZ2ctPnN0cmVhbXNbaV0uc2VyaWFsID09IHNlcmlhbCkKKyAgICAgICAgICAgIHJldHVybiBpOworCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90CitvZ2dfZ3B0b3B0cyAoQVZGb3JtYXRDb250ZXh0ICogcywgaW50IGksIHVpbnQ2NF90IGdwLCBpbnQ2NF90ICpkdHMpCit7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGk7CisgICAgdWludDY0X3QgcHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBpZihvcy0+Y29kZWMgJiYgb3MtPmNvZGVjLT5ncHRvcHRzKXsKKyAgICAgICAgcHRzID0gb3MtPmNvZGVjLT5ncHRvcHRzKHMsIGksIGdwLCBkdHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0cyA9IGdwOworICAgICAgICBpZiAoZHRzKQorICAgICAgICAgICAgKmR0cyA9IHB0czsKKyAgICB9CisKKyAgICByZXR1cm4gcHRzOworfQorCisjZW5kaWYgLyogQVZGT1JNQVRfT0dHREVDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9vZ2dlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vZ2dlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQxM2M1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ2VuYy5jCkBAIC0wLDAgKzEsNzI1IEBACisvKgorICogT2dnIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZSBkb3QgY291ZHVyaWVyIGF0IGZyZWUgZG90IGZyPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYW5kb21fc2VlZC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMveGlwaC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZmxhYy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidm9yYmlzY29tbWVudC5oIgorCisjZGVmaW5lIE1BWF9QQUdFX1NJWkUgNjUwMjUKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDY0X3Qgc3RhcnRfZ3JhbnVsZTsKKyAgICBpbnQ2NF90IGdyYW51bGU7CisgICAgaW50IHN0cmVhbV9pbmRleDsKKyAgICB1aW50OF90IGZsYWdzOworICAgIHVpbnQ4X3Qgc2VnbWVudHNfY291bnQ7CisgICAgdWludDhfdCBzZWdtZW50c1syNTVdOworICAgIHVpbnQ4X3QgZGF0YVtNQVhfUEFHRV9TSVpFXTsKKyAgICB1aW50MTZfdCBzaXplOworfSBPR0dQYWdlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgcGFnZV9jb3VudGVyOworICAgIHVpbnQ4X3QgKmhlYWRlclszXTsKKyAgICBpbnQgaGVhZGVyX2xlblszXTsKKyAgICAvKiogZm9yIHRoZW9yYSBncmFudWxlICovCisgICAgaW50IGtmZ3NoaWZ0OworICAgIGludDY0X3QgbGFzdF9rZl9wdHM7CisgICAgaW50IHZyZXY7CisgICAgaW50IGVvczsKKyAgICB1bnNpZ25lZCBwYWdlX2NvdW50OyAvLy88IG51bWJlciBvZiBwYWdlIGJ1ZmZlcmVkCisgICAgT0dHUGFnZSBwYWdlOyAvLy88IGN1cnJlbnQgcGFnZQorICAgIHVuc2lnbmVkIHNlcmlhbF9udW07IC8vLzwgc2VyaWFsIG51bWJlcgorICAgIGludDY0X3QgbGFzdF9ncmFudWxlOyAvLy88IGxhc3QgcGFja2V0IGdyYW51bGUKK30gT0dHU3RyZWFtQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgT0dHUGFnZUxpc3QgeworICAgIE9HR1BhZ2UgcGFnZTsKKyAgICBzdHJ1Y3QgT0dHUGFnZUxpc3QgKm5leHQ7Cit9IE9HR1BhZ2VMaXN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgT0dHUGFnZUxpc3QgKnBhZ2VfbGlzdDsKKyAgICBpbnQgcHJlZl9zaXplOyAvLy88IHByZWZlcnJlZCBwYWdlIHNpemUgKDAgPT4gZmlsbCBhbGwgc2VnbWVudHMpCisgICAgaW50NjRfdCBwcmVmX2R1cmF0aW9uOyAgICAgIC8vLzwgcHJlZmVycmVkIHBhZ2UgZHVyYXRpb24gKDAgPT4gZmlsbCBhbGwgc2VnbWVudHMpCit9IE9HR0NvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE9HR0NvbnRleHQsIHgpCisjZGVmaW5lIFBBUkFNIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAib2dncGFnZXNpemUiLCAiU2V0IHByZWZlcnJlZCBPZ2cgcGFnZSBzaXplLiIsCisgICAgICBvZmZzZXRvZihPR0dDb250ZXh0LCBwcmVmX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIE1BWF9QQUdFX1NJWkUsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKyAgICB7ICJwYWdlc2l6ZSIsICJwcmVmZXJyZWQgcGFnZSBzaXplIGluIGJ5dGVzIChkZXByZWNhdGVkKSIsCisgICAgICAgIE9GRlNFVChwcmVmX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgTUFYX1BBR0VfU0laRSwgUEFSQU0gfSwKKyAgICB7ICJwYWdlX2R1cmF0aW9uIiwgInByZWZlcnJlZCBwYWdlIGR1cmF0aW9uLCBpbiBtaWNyb3NlY29uZHMiLAorICAgICAgICBPRkZTRVQocHJlZl9kdXJhdGlvbiksIEFWX09QVF9UWVBFX0lOVDY0LCB7IC5pNjQgPSAxMDAwMDAwIH0sIDAsIElOVDY0X01BWCwgUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKKyNkZWZpbmUgT0dHX0NMQVNTKGZsYXZvciwgbmFtZSlcCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmbGF2b3IgIyMgX211eGVyX2NsYXNzID0ge1wKKyAgICAuY2xhc3NfbmFtZSA9ICNuYW1lICIgbXV4ZXIiLFwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLFwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsXAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULFwKK307CisKK3N0YXRpYyB2b2lkIG9nZ191cGRhdGVfY2hlY2tzdW0oQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIGludDY0X3QgY3JjX29mZnNldCkKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgdWludDMyX3QgY2hlY2tzdW0gPSBmZmlvX2dldF9jaGVja3N1bShwYik7CisgICAgYXZpb19zZWVrKHBiLCBjcmNfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgYXZpb193YjMyKHBiLCBjaGVja3N1bSk7CisgICAgYXZpb19zZWVrKHBiLCBwb3MsIFNFRUtfU0VUKTsKK30KKworc3RhdGljIGludCBvZ2dfd3JpdGVfcGFnZShBVkZvcm1hdENvbnRleHQgKnMsIE9HR1BhZ2UgKnBhZ2UsIGludCBleHRyYV9mbGFncykKK3sKKyAgICBPR0dTdHJlYW1Db250ZXh0ICpvZ2dzdHJlYW0gPSBzLT5zdHJlYW1zW3BhZ2UtPnN0cmVhbV9pbmRleF0tPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGI7CisgICAgaW50NjRfdCBjcmNfb2Zmc2V0OworICAgIGludCByZXQsIHNpemU7CisgICAgdWludDhfdCAqYnVmOworCisgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJnBiKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBmZmlvX2luaXRfY2hlY2tzdW0ocGIsIGZmX2NyYzA0QzExREI3X3VwZGF0ZSwgMCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAiT2dnUyIpOworICAgIGF2aW9fdzgocGIsIDApOworICAgIGF2aW9fdzgocGIsIHBhZ2UtPmZsYWdzIHwgZXh0cmFfZmxhZ3MpOworICAgIGF2aW9fd2w2NChwYiwgcGFnZS0+Z3JhbnVsZSk7CisgICAgYXZpb193bDMyKHBiLCBvZ2dzdHJlYW0tPnNlcmlhbF9udW0pOworICAgIGF2aW9fd2wzMihwYiwgb2dnc3RyZWFtLT5wYWdlX2NvdW50ZXIrKyk7CisgICAgY3JjX29mZnNldCA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193bDMyKHBiLCAwKTsgLy8gY3JjCisgICAgYXZpb193OChwYiwgcGFnZS0+c2VnbWVudHNfY291bnQpOworICAgIGF2aW9fd3JpdGUocGIsIHBhZ2UtPnNlZ21lbnRzLCBwYWdlLT5zZWdtZW50c19jb3VudCk7CisgICAgYXZpb193cml0ZShwYiwgcGFnZS0+ZGF0YSwgcGFnZS0+c2l6ZSk7CisKKyAgICBvZ2dfdXBkYXRlX2NoZWNrc3VtKHMsIHBiLCBjcmNfb2Zmc2V0KTsKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIHNpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYocGIsICZidWYpOworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIHNpemU7CisKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBidWYsIHNpemUpOworICAgIGF2aW9fZmx1c2gocy0+cGIpOworICAgIGF2X2ZyZWUoYnVmKTsKKyAgICBvZ2dzdHJlYW0tPnBhZ2VfY291bnQtLTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvZ2dfa2V5X2dyYW51bGUoT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtLCBpbnQ2NF90IGdyYW51bGUpCit7CisgICAgcmV0dXJuIG9nZ3N0cmVhbS0+a2Znc2hpZnQgJiYgIShncmFudWxlICYgKCgxPDxvZ2dzdHJlYW0tPmtmZ3NoaWZ0KS0xKSk7Cit9CisKK3N0YXRpYyBpbnQ2NF90IG9nZ19ncmFudWxlX3RvX3RpbWVzdGFtcChPR0dTdHJlYW1Db250ZXh0ICpvZ2dzdHJlYW0sIGludDY0X3QgZ3JhbnVsZSkKK3sKKyAgICBpZiAob2dnc3RyZWFtLT5rZmdzaGlmdCkKKyAgICAgICAgcmV0dXJuIChncmFudWxlPj5vZ2dzdHJlYW0tPmtmZ3NoaWZ0KSArCisgICAgICAgICAgICAoZ3JhbnVsZSAmICgoMTw8b2dnc3RyZWFtLT5rZmdzaGlmdCktMSkpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGdyYW51bGU7Cit9CisKK3N0YXRpYyBpbnQgb2dnX2NvbXBhcmVfZ3JhbnVsZShBVkZvcm1hdENvbnRleHQgKnMsIE9HR1BhZ2UgKm5leHQsIE9HR1BhZ2UgKnBhZ2UpCit7CisgICAgQVZTdHJlYW0gKnN0MiA9IHMtPnN0cmVhbXNbbmV4dC0+c3RyZWFtX2luZGV4XTsKKyAgICBBVlN0cmVhbSAqc3QgID0gcy0+c3RyZWFtc1twYWdlLT5zdHJlYW1faW5kZXhdOworICAgIGludDY0X3QgbmV4dF9ncmFudWxlLCBjdXJfZ3JhbnVsZTsKKworICAgIGlmIChuZXh0LT5ncmFudWxlID09IC0xIHx8IHBhZ2UtPmdyYW51bGUgPT0gLTEpCisgICAgICAgIHJldHVybiAwOworCisgICAgbmV4dF9ncmFudWxlID0gYXZfcmVzY2FsZV9xKG9nZ19ncmFudWxlX3RvX3RpbWVzdGFtcChzdDItPnByaXZfZGF0YSwgbmV4dC0+Z3JhbnVsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Mi0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7CisgICAgY3VyX2dyYW51bGUgID0gYXZfcmVzY2FsZV9xKG9nZ19ncmFudWxlX3RvX3RpbWVzdGFtcChzdC0+cHJpdl9kYXRhLCBwYWdlLT5ncmFudWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QgLT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKKyAgICByZXR1cm4gbmV4dF9ncmFudWxlID4gY3VyX2dyYW51bGU7Cit9CisKK3N0YXRpYyBpbnQgb2dnX3Jlc2V0X2N1cl9wYWdlKE9HR1N0cmVhbUNvbnRleHQgKm9nZ3N0cmVhbSkKK3sKKyAgICBvZ2dzdHJlYW0tPnBhZ2UuZ3JhbnVsZSA9IC0xOworICAgIG9nZ3N0cmVhbS0+cGFnZS5mbGFncyA9IDA7CisgICAgb2dnc3RyZWFtLT5wYWdlLnNlZ21lbnRzX2NvdW50ID0gMDsKKyAgICBvZ2dzdHJlYW0tPnBhZ2Uuc2l6ZSA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2dnX2J1ZmZlcl9wYWdlKEFWRm9ybWF0Q29udGV4dCAqcywgT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtKQoreworICAgIE9HR0NvbnRleHQgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBPR0dQYWdlTGlzdCAqKnAgPSAmb2dnLT5wYWdlX2xpc3Q7CisgICAgT0dHUGFnZUxpc3QgKmwgPSBhdl9tYWxsb2N6KHNpemVvZigqbCkpOworCisgICAgaWYgKCFsKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGwtPnBhZ2UgPSBvZ2dzdHJlYW0tPnBhZ2U7CisKKyAgICBvZ2dzdHJlYW0tPnBhZ2Uuc3RhcnRfZ3JhbnVsZSA9IG9nZ3N0cmVhbS0+cGFnZS5ncmFudWxlOworICAgIG9nZ3N0cmVhbS0+cGFnZV9jb3VudCsrOworICAgIG9nZ19yZXNldF9jdXJfcGFnZShvZ2dzdHJlYW0pOworCisgICAgd2hpbGUgKCpwKSB7CisgICAgICAgIGlmIChvZ2dfY29tcGFyZV9ncmFudWxlKHMsICYoKnApLT5wYWdlLCAmbC0+cGFnZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcCA9ICYoKnApLT5uZXh0OworICAgIH0KKyAgICBsLT5uZXh0ID0gKnA7CisgICAgKnAgPSBsOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2dnX2J1ZmZlcl9kYXRhKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwgdW5zaWduZWQgc2l6ZSwgaW50NjRfdCBncmFudWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlcikKK3sKKyAgICBPR0dTdHJlYW1Db250ZXh0ICpvZ2dzdHJlYW0gPSBzdC0+cHJpdl9kYXRhOworICAgIE9HR0NvbnRleHQgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgdG90YWxfc2VnbWVudHMgPSBzaXplIC8gMjU1ICsgMTsKKyAgICB1aW50OF90ICpwID0gZGF0YTsKKyAgICBpbnQgaSwgc2VnbWVudHMsIGxlbiwgZmx1c2ggPSAwOworCisgICAgLy8gSGFuZGxlcyBWRlIgYnkgZmx1c2hpbmcgcGFnZSBiZWNhdXNlIHRoaXMgZnJhbWUgbmVlZHMgdG8gaGF2ZSBhIHRpbWVzdGFtcAorICAgIC8vIEZvciB0aGVvcmEsIGtleWZyYW1lcyBhbHNvIG5lZWQgdG8gaGF2ZSBhIHRpbWVzdGFtcCB0byBjb3JyZWN0bHkgbWFyaworICAgIC8vIHRoZW0gYXMgc3VjaCwgb3RoZXJ3aXNlIHNlZWtpbmcgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgYXQgdGhlIHZlcnkKKyAgICAvLyBsZWFzdCB3aXRoIG9sZCBsaWJvZ2cgdmVyc2lvbnMuCisgICAgLy8gRG8gbm90IHRyeSB0byBmbHVzaCBoZWFkZXIgcGFja2V0cyB0aG91Z2gsIHRoYXQgd2lsbCBjcmVhdGUgYnJva2VuIGZpbGVzLgorICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RIRU9SQSAmJiAhaGVhZGVyICYmCisgICAgICAgIChvZ2dfZ3JhbnVsZV90b190aW1lc3RhbXAob2dnc3RyZWFtLCBncmFudWxlKSA+CisgICAgICAgICBvZ2dfZ3JhbnVsZV90b190aW1lc3RhbXAob2dnc3RyZWFtLCBvZ2dzdHJlYW0tPmxhc3RfZ3JhbnVsZSkgKyAxIHx8CisgICAgICAgICBvZ2dfa2V5X2dyYW51bGUob2dnc3RyZWFtLCBncmFudWxlKSkpIHsKKyAgICAgICAgaWYgKG9nZ3N0cmVhbS0+cGFnZS5ncmFudWxlICE9IC0xKQorICAgICAgICAgICAgb2dnX2J1ZmZlcl9wYWdlKHMsIG9nZ3N0cmVhbSk7CisgICAgICAgIGZsdXNoID0gMTsKKyAgICB9CisKKyAgICAvLyBhdm9pZCBhIGNvbnRpbnVlZCBwYWdlCisgICAgaWYgKCFoZWFkZXIgJiYgb2dnc3RyZWFtLT5wYWdlLnNpemUgPiAwICYmCisgICAgICAgIE1BWF9QQUdFX1NJWkUgLSBvZ2dzdHJlYW0tPnBhZ2Uuc2l6ZSA8IHNpemUpIHsKKyAgICAgICAgb2dnX2J1ZmZlcl9wYWdlKHMsIG9nZ3N0cmVhbSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3NlZ21lbnRzOyApIHsKKyAgICAgICAgT0dHUGFnZSAqcGFnZSA9ICZvZ2dzdHJlYW0tPnBhZ2U7CisKKyAgICAgICAgc2VnbWVudHMgPSBGRk1JTih0b3RhbF9zZWdtZW50cyAtIGksIDI1NSAtIHBhZ2UtPnNlZ21lbnRzX2NvdW50KTsKKworICAgICAgICBpZiAoaSAmJiAhcGFnZS0+c2VnbWVudHNfY291bnQpCisgICAgICAgICAgICBwYWdlLT5mbGFncyB8PSAxOyAvLyBjb250aW51ZWQgcGFja2V0CisKKyAgICAgICAgbWVtc2V0KHBhZ2UtPnNlZ21lbnRzK3BhZ2UtPnNlZ21lbnRzX2NvdW50LCAyNTUsIHNlZ21lbnRzIC0gMSk7CisgICAgICAgIHBhZ2UtPnNlZ21lbnRzX2NvdW50ICs9IHNlZ21lbnRzIC0gMTsKKworICAgICAgICBsZW4gPSBGRk1JTihzaXplLCBzZWdtZW50cyoyNTUpOworICAgICAgICBwYWdlLT5zZWdtZW50c1twYWdlLT5zZWdtZW50c19jb3VudCsrXSA9IGxlbiAtIChzZWdtZW50cy0xKSoyNTU7CisgICAgICAgIG1lbWNweShwYWdlLT5kYXRhK3BhZ2UtPnNpemUsIHAsIGxlbik7CisgICAgICAgIHAgKz0gbGVuOworICAgICAgICBzaXplIC09IGxlbjsKKyAgICAgICAgaSArPSBzZWdtZW50czsKKyAgICAgICAgcGFnZS0+c2l6ZSArPSBsZW47CisKKyAgICAgICAgaWYgKGkgPT0gdG90YWxfc2VnbWVudHMpCisgICAgICAgICAgICBwYWdlLT5ncmFudWxlID0gZ3JhbnVsZTsKKworICAgICAgICBpZiAoIWhlYWRlcikgeworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twYWdlLT5zdHJlYW1faW5kZXhdOworCisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0ID0gYXZfcmVzY2FsZV9xKHBhZ2UtPnN0YXJ0X2dyYW51bGUsIHN0LT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgICAgIGludDY0X3QgbmV4dCAgPSBhdl9yZXNjYWxlX3EocGFnZS0+Z3JhbnVsZSwgc3QtPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EpOworCisgICAgICAgICAgICBpZiAocGFnZS0+c2VnbWVudHNfY291bnQgPT0gMjU1IHx8CisgICAgICAgICAgICAgICAgKG9nZy0+cHJlZl9zaXplICAgICA+IDAgJiYgcGFnZS0+c2l6ZSAgID49IG9nZy0+cHJlZl9zaXplKSB8fAorICAgICAgICAgICAgICAgIChvZ2ctPnByZWZfZHVyYXRpb24gPiAwICYmIG5leHQgLSBzdGFydCA+PSBvZ2ctPnByZWZfZHVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgb2dnX2J1ZmZlcl9wYWdlKHMsIG9nZ3N0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmx1c2ggJiYgb2dnc3RyZWFtLT5wYWdlLmdyYW51bGUgIT0gLTEpCisgICAgICAgIG9nZ19idWZmZXJfcGFnZShzLCBvZ2dzdHJlYW0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50OF90ICpvZ2dfd3JpdGVfdm9yYmlzY29tbWVudChpbnQgb2Zmc2V0LCBpbnQgYml0ZXhhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpoZWFkZXJfbGVuLCBBVkRpY3Rpb25hcnkgKiptLCBpbnQgZnJhbWluZ19iaXQpCit7CisgICAgY29uc3QgY2hhciAqdmVuZG9yID0gYml0ZXhhY3QgPyAiZmZtcGVnIiA6IExJQkFWRk9STUFUX0lERU5UOworICAgIGludCBzaXplOworICAgIHVpbnQ4X3QgKnAsICpwMDsKKworICAgIGZmX21ldGFkYXRhX2NvbnYobSwgZmZfdm9yYmlzY29tbWVudF9tZXRhZGF0YV9jb252LCBOVUxMKTsKKworICAgIHNpemUgPSBvZmZzZXQgKyBmZl92b3JiaXNjb21tZW50X2xlbmd0aCgqbSwgdmVuZG9yKSArIGZyYW1pbmdfYml0OworICAgIHAgPSBhdl9tYWxsb2N6KHNpemUpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcDAgPSBwOworCisgICAgcCArPSBvZmZzZXQ7CisgICAgZmZfdm9yYmlzY29tbWVudF93cml0ZSgmcCwgbSwgdmVuZG9yKTsKKyAgICBpZiAoZnJhbWluZ19iaXQpCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIDEpOworCisgICAgKmhlYWRlcl9sZW4gPSBzaXplOworICAgIHJldHVybiBwMDsKK30KKworc3RhdGljIGludCBvZ2dfYnVpbGRfZmxhY19oZWFkZXJzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPR0dTdHJlYW1Db250ZXh0ICpvZ2dzdHJlYW0sIGludCBiaXRleGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKiptKQoreworICAgIHVpbnQ4X3QgKnA7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgRkxBQ19TVFJFQU1JTkZPX1NJWkUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAvLyBmaXJzdCBwYWNrZXQ6IFNUUkVBTUlORk8KKyAgICBvZ2dzdHJlYW0tPmhlYWRlcl9sZW5bMF0gPSA1MTsKKyAgICBvZ2dzdHJlYW0tPmhlYWRlclswXSA9IGF2X21hbGxvY3ooNTEpOyAvLyBwZXIgb2dnIGZsYWMgc3BlY3MKKyAgICBwID0gb2dnc3RyZWFtLT5oZWFkZXJbMF07CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIDB4N0YpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmcCwgIkZMQUMiLCA0KTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCAxKTsgLy8gbWFqb3IgdmVyc2lvbgorICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIDApOyAvLyBtaW5vciB2ZXJzaW9uCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcCwgMSk7IC8vIGhlYWRlcnMgcGFja2V0cyB3aXRob3V0IHRoaXMgb25lCisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZwLCAiZkxhQyIsIDQpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIDB4MDApOyAvLyBzdHJlYW1pbmZvCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUyNCgmcCwgMzQpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmcCwgYXZjdHgtPmV4dHJhZGF0YSwgRkxBQ19TVFJFQU1JTkZPX1NJWkUpOworCisgICAgLy8gc2Vjb25kIHBhY2tldDogVm9yYmlzQ29tbWVudAorICAgIHAgPSBvZ2dfd3JpdGVfdm9yYmlzY29tbWVudCg0LCBiaXRleGFjdCwgJm9nZ3N0cmVhbS0+aGVhZGVyX2xlblsxXSwgbSwgMCk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG9nZ3N0cmVhbS0+aGVhZGVyWzFdID0gcDsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCAweDg0KTsgLy8gbGFzdCBtZXRhZGF0YSBibG9jayBhbmQgdm9yYmlzIGNvbW1lbnQKKyAgICBieXRlc3RyZWFtX3B1dF9iZTI0KCZwLCBvZ2dzdHJlYW0tPmhlYWRlcl9sZW5bMV0gLSA0KTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFNQRUVYX0hFQURFUl9TSVpFIDgwCisKK3N0YXRpYyBpbnQgb2dnX2J1aWxkX3NwZWV4X2hlYWRlcnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPR0dTdHJlYW1Db250ZXh0ICpvZ2dzdHJlYW0sIGludCBiaXRleGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqbSkKK3sKKyAgICB1aW50OF90ICpwOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IFNQRUVYX0hFQURFUl9TSVpFKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8vIGZpcnN0IHBhY2tldDogU3BlZXggaGVhZGVyCisgICAgcCA9IGF2X21hbGxvY3ooU1BFRVhfSEVBREVSX1NJWkUpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBvZ2dzdHJlYW0tPmhlYWRlclswXSA9IHA7CisgICAgb2dnc3RyZWFtLT5oZWFkZXJfbGVuWzBdID0gU1BFRVhfSEVBREVSX1NJWkU7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZwLCBhdmN0eC0+ZXh0cmFkYXRhLCBTUEVFWF9IRUFERVJfU0laRSk7CisgICAgQVZfV0wzMigmb2dnc3RyZWFtLT5oZWFkZXJbMF1bNjhdLCAwKTsgIC8vIHNldCBleHRyYV9oZWFkZXJzIHRvIDAKKworICAgIC8vIHNlY29uZCBwYWNrZXQ6IFZvcmJpc0NvbW1lbnQKKyAgICBwID0gb2dnX3dyaXRlX3ZvcmJpc2NvbW1lbnQoMCwgYml0ZXhhY3QsICZvZ2dzdHJlYW0tPmhlYWRlcl9sZW5bMV0sIG0sIDApOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBvZ2dzdHJlYW0tPmhlYWRlclsxXSA9IHA7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPUFVTX0hFQURFUl9TSVpFIDE5CisKK3N0YXRpYyBpbnQgb2dnX2J1aWxkX29wdXNfaGVhZGVycyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtLCBpbnQgYml0ZXhhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqbSkKK3sKKyAgICB1aW50OF90ICpwOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IE9QVVNfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLyogZmlyc3QgcGFja2V0OiBPcHVzIGhlYWRlciAqLworICAgIHAgPSBhdl9tYWxsb2N6KGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG9nZ3N0cmVhbS0+aGVhZGVyWzBdID0gcDsKKyAgICBvZ2dzdHJlYW0tPmhlYWRlcl9sZW5bMF0gPSBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZwLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgLyogc2Vjb25kIHBhY2tldDogVm9yYmlzQ29tbWVudCAqLworICAgIHAgPSBvZ2dfd3JpdGVfdm9yYmlzY29tbWVudCg4LCBiaXRleGFjdCwgJm9nZ3N0cmVhbS0+aGVhZGVyX2xlblsxXSwgbSwgMCk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG9nZ3N0cmVhbS0+aGVhZGVyWzFdID0gcDsKKyAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnAsICJPcHVzVGFncyIsIDgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9nZ193cml0ZV9wYWdlcyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBmbHVzaCkKK3sKKyAgICBPR0dDb250ZXh0ICpvZ2cgPSBzLT5wcml2X2RhdGE7CisgICAgT0dHUGFnZUxpc3QgKm5leHQsICpwOworCisgICAgaWYgKCFvZ2ctPnBhZ2VfbGlzdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChwID0gb2dnLT5wYWdlX2xpc3Q7IHA7ICkgeworICAgICAgICBPR0dTdHJlYW1Db250ZXh0ICpvZ2dzdHJlYW0gPQorICAgICAgICAgICAgcy0+c3RyZWFtc1twLT5wYWdlLnN0cmVhbV9pbmRleF0tPnByaXZfZGF0YTsKKyAgICAgICAgaWYgKG9nZ3N0cmVhbS0+cGFnZV9jb3VudCA8IDIgJiYgIWZsdXNoKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG9nZ193cml0ZV9wYWdlKHMsICZwLT5wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBmbHVzaCA9PSAxICYmIG9nZ3N0cmVhbS0+cGFnZV9jb3VudCA9PSAxID8gNCA6IDApOyAvLyBlb3MKKyAgICAgICAgbmV4dCA9IHAtPm5leHQ7CisgICAgICAgIGF2X2ZyZWVwKCZwKTsKKyAgICAgICAgcCA9IG5leHQ7CisgICAgfQorICAgIG9nZy0+cGFnZV9saXN0ID0gcDsKK30KKworc3RhdGljIGludCBvZ2dfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBPR0dDb250ZXh0ICpvZ2cgPSBzLT5wcml2X2RhdGE7CisgICAgT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtID0gTlVMTDsKKyAgICBpbnQgaSwgajsKKworICAgIGlmIChvZ2ctPnByZWZfc2l6ZSkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVGhlIHBhZ2VzaXplIG9wdGlvbiBpcyBkZXByZWNhdGVkXG4iKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgdW5zaWduZWQgc2VyaWFsX251bSA9IGk7CisKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpCisgICAgICAgICAgICAgICAgLyogT3B1cyByZXF1aXJlcyBhIGZpeGVkIDQ4a0h6IGNsb2NrICovCisgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDQ4MDAwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WT1JCSVMgJiYKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEhFT1JBICYmCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1NQRUVYICAmJgorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9GTEFDICAgJiYKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfT1BVUykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvZGVjIGlkIGluIHN0cmVhbSAlZFxuIiwgaSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YSB8fCAhc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vIGV4dHJhZGF0YSBwcmVzZW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIG9nZ3N0cmVhbSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpvZ2dzdHJlYW0pKTsKKyAgICAgICAgaWYgKCFvZ2dzdHJlYW0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIG9nZ3N0cmVhbS0+cGFnZS5zdHJlYW1faW5kZXggPSBpOworCisgICAgICAgIGlmICghKHMtPmZsYWdzICYgQVZGTVRfRkxBR19CSVRFWEFDVCkpCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgc2VyaWFsX251bSA9IGF2X2dldF9yYW5kb21fc2VlZCgpOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgT0dHU3RyZWFtQ29udGV4dCAqc2MgPSBzLT5zdHJlYW1zW2pdLT5wcml2X2RhdGE7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxfbnVtID09IHNjLT5zZXJpYWxfbnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoaiA8IGkpOworICAgICAgICBvZ2dzdHJlYW0tPnNlcmlhbF9udW0gPSBzZXJpYWxfbnVtOworCisgICAgICAgIGF2X2RpY3RfY29weSgmc3QtPm1ldGFkYXRhLCBzLT5tZXRhZGF0YSwgQVZfRElDVF9ET05UX09WRVJXUklURSk7CisKKyAgICAgICAgc3QtPnByaXZfZGF0YSA9IG9nZ3N0cmVhbTsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxBQykgeworICAgICAgICAgICAgaW50IGVyciA9IG9nZ19idWlsZF9mbGFjX2hlYWRlcnMoc3QtPmNvZGVjLCBvZ2dzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQklURVhBQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3QtPm1ldGFkYXRhKTsKKyAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBGTEFDIGhlYWRlcnNcbiIpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzdC0+cHJpdl9kYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1BFRVgpIHsKKyAgICAgICAgICAgIGludCBlcnIgPSBvZ2dfYnVpbGRfc3BlZXhfaGVhZGVycyhzdC0+Y29kZWMsIG9nZ3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQklURVhBQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0LT5tZXRhZGF0YSk7CisgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVycm9yIHdyaXRpbmcgU3BlZXggaGVhZGVyc1xuIik7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5wcml2X2RhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9PUFVTKSB7CisgICAgICAgICAgICBpbnQgZXJyID0gb2dnX2J1aWxkX29wdXNfaGVhZGVycyhzdC0+Y29kZWMsIG9nZ3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZsYWdzICYgQVZGTVRfRkxBR19CSVRFWEFDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdC0+bWV0YWRhdGEpOworICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFcnJvciB3cml0aW5nIE9wdXMgaGVhZGVyc1xuIik7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5wcml2X2RhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50OF90ICpwOworICAgICAgICAgICAgY29uc3QgY2hhciAqY3N0ciA9IHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVk9SQklTID8gInZvcmJpcyIgOiAidGhlb3JhIjsKKyAgICAgICAgICAgIGludCBoZWFkZXJfdHlwZSA9IHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVk9SQklTID8gMyA6IDB4ODE7CisgICAgICAgICAgICBpbnQgZnJhbWluZ19iaXQgPSBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZPUkJJUyA/IDEgOiAwOworCisgICAgICAgICAgICBpZiAoYXZwcml2X3NwbGl0X3hpcGhfaGVhZGVycyhzdC0+Y29kZWMtPmV4dHJhZGF0YSwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WT1JCSVMgPyAzMCA6IDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZ2dzdHJlYW0tPmhlYWRlciwgb2dnc3RyZWFtLT5oZWFkZXJfbGVuKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXh0cmFkYXRhIGNvcnJ1cHRlZFxuIik7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5wcml2X2RhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwID0gb2dnX3dyaXRlX3ZvcmJpc2NvbW1lbnQoNywgcy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0JJVEVYQUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZ2dzdHJlYW0tPmhlYWRlcl9sZW5bMV0sICZzdC0+bWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ19iaXQpOworICAgICAgICAgICAgb2dnc3RyZWFtLT5oZWFkZXJbMV0gPSBwOworICAgICAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIGhlYWRlcl90eXBlKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmcCwgY3N0ciwgNik7CisKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RIRU9SQSkgeworICAgICAgICAgICAgICAgIC8qKiBLRkdTSElGVCBpcyB0aGUgd2lkdGggb2YgdGhlIGxlc3Mgc2lnbmlmaWNhbnQgc2VjdGlvbiBvZiB0aGUgZ3JhbnVsZSBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICBUaGUgbGVzcyBzaWduaWZpY2FudCBzZWN0aW9uIGlzIHRoZSBmcmFtZSBjb3VudCBzaW5jZSB0aGUgbGFzdCBrZXlmcmFtZSAqLworICAgICAgICAgICAgICAgIG9nZ3N0cmVhbS0+a2Znc2hpZnQgPSAoKG9nZ3N0cmVhbS0+aGVhZGVyWzBdWzQwXSYzKTw8Myl8KG9nZ3N0cmVhbS0+aGVhZGVyWzBdWzQxXT4+NSk7CisgICAgICAgICAgICAgICAgb2dnc3RyZWFtLT52cmV2ID0gb2dnc3RyZWFtLT5oZWFkZXJbMF1bOV07CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInRoZW9yYSBrZmdzaGlmdCAlZCwgdnJldiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgb2dnc3RyZWFtLT5rZmdzaGlmdCwgb2dnc3RyZWFtLT52cmV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBzLT5uYl9zdHJlYW1zOyBqKyspIHsKKyAgICAgICAgT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtID0gcy0+c3RyZWFtc1tqXS0+cHJpdl9kYXRhOworICAgICAgICBvZ2dfYnVmZmVyX2RhdGEocywgcy0+c3RyZWFtc1tqXSwgb2dnc3RyZWFtLT5oZWFkZXJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBvZ2dzdHJlYW0tPmhlYWRlcl9sZW5bMF0sIDAsIDEpOworICAgICAgICBvZ2dzdHJlYW0tPnBhZ2UuZmxhZ3MgfD0gMjsgLy8gYm9zCisgICAgICAgIG9nZ19idWZmZXJfcGFnZShzLCBvZ2dzdHJlYW0pOworICAgIH0KKyAgICBmb3IgKGogPSAwOyBqIDwgcy0+bmJfc3RyZWFtczsgaisrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbal07CisgICAgICAgIE9HR1N0cmVhbUNvbnRleHQgKm9nZ3N0cmVhbSA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChvZ2dzdHJlYW0tPmhlYWRlcl9sZW5baV0pCisgICAgICAgICAgICAgICAgb2dnX2J1ZmZlcl9kYXRhKHMsIHN0LCBvZ2dzdHJlYW0tPmhlYWRlcltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2dnc3RyZWFtLT5oZWFkZXJfbGVuW2ldLCAwLCAxKTsKKyAgICAgICAgfQorICAgICAgICBvZ2dfYnVmZmVyX3BhZ2Uocywgb2dnc3RyZWFtKTsKKyAgICB9CisKKyAgICBvZ2dzdHJlYW0tPnBhZ2Uuc3RhcnRfZ3JhbnVsZSA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgb2dnX3dyaXRlX3BhZ2VzKHMsIDIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2dnX3dyaXRlX3BhY2tldF9pbnRlcm5hbChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtID0gc3QtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworICAgIGludDY0X3QgZ3JhbnVsZTsKKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RIRU9SQSkgeworICAgICAgICBpbnQ2NF90IHB0cyA9IG9nZ3N0cmVhbS0+dnJldiA8IDEgPyBwa3QtPnB0cyA6IHBrdC0+cHRzICsgcGt0LT5kdXJhdGlvbjsKKyAgICAgICAgaW50IHBmcmFtZV9jb3VudDsKKyAgICAgICAgaWYgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpCisgICAgICAgICAgICBvZ2dzdHJlYW0tPmxhc3Rfa2ZfcHRzID0gcHRzOworICAgICAgICBwZnJhbWVfY291bnQgPSBwdHMgLSBvZ2dzdHJlYW0tPmxhc3Rfa2ZfcHRzOworICAgICAgICAvLyBwcmV2ZW50IGZyYW1lIGNvdW50IGZyb20gb3ZlcmZsb3cgaWYga2V5IGZyYW1lIGZsYWcgaXMgbm90IHNldAorICAgICAgICBpZiAocGZyYW1lX2NvdW50ID49ICgxPDxvZ2dzdHJlYW0tPmtmZ3NoaWZ0KSkgeworICAgICAgICAgICAgb2dnc3RyZWFtLT5sYXN0X2tmX3B0cyArPSBwZnJhbWVfY291bnQ7CisgICAgICAgICAgICBwZnJhbWVfY291bnQgPSAwOworICAgICAgICB9CisgICAgICAgIGdyYW51bGUgPSAob2dnc3RyZWFtLT5sYXN0X2tmX3B0czw8b2dnc3RyZWFtLT5rZmdzaGlmdCkgfCBwZnJhbWVfY291bnQ7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpCisgICAgICAgIGdyYW51bGUgPSBwa3QtPnB0cyArIHBrdC0+ZHVyYXRpb24gKworICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKHN0LT5jb2RlYy0+aW5pdGlhbF9wYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UpOworICAgIGVsc2UKKyAgICAgICAgZ3JhbnVsZSA9IHBrdC0+cHRzICsgcGt0LT5kdXJhdGlvbjsKKworICAgIGlmIChvZ2dzdHJlYW0tPnBhZ2Uuc3RhcnRfZ3JhbnVsZSA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgb2dnc3RyZWFtLT5wYWdlLnN0YXJ0X2dyYW51bGUgPSBwa3QtPnB0czsKKworICAgIHJldCA9IG9nZ19idWZmZXJfZGF0YShzLCBzdCwgcGt0LT5kYXRhLCBwa3QtPnNpemUsIGdyYW51bGUsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgb2dnX3dyaXRlX3BhZ2VzKHMsIDApOworCisgICAgb2dnc3RyZWFtLT5sYXN0X2dyYW51bGUgPSBncmFudWxlOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2dnX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAocGt0KQorICAgICAgICByZXR1cm4gb2dnX3dyaXRlX3BhY2tldF9pbnRlcm5hbChzLCBwa3QpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBPR0dTdHJlYW1Db250ZXh0ICpvZ2dzdHJlYW0gPSBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGE7CisgICAgICAgIGlmIChvZ2dzdHJlYW0tPnBhZ2Uuc2VnbWVudHNfY291bnQpCisgICAgICAgICAgICBvZ2dfYnVmZmVyX3BhZ2Uocywgb2dnc3RyZWFtKTsKKyAgICB9CisKKyAgICBvZ2dfd3JpdGVfcGFnZXMocywgMik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2dnX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpOworCisgICAgLyogZmx1c2ggY3VycmVudCBwYWdlIGlmIG5lZWRlZCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtID0gcy0+c3RyZWFtc1tpXS0+cHJpdl9kYXRhOworCisgICAgICAgIGlmIChvZ2dzdHJlYW0tPnBhZ2Uuc2l6ZSA+IDApCisgICAgICAgICAgICBvZ2dfYnVmZmVyX3BhZ2Uocywgb2dnc3RyZWFtKTsKKyAgICB9CisKKyAgICBvZ2dfd3JpdGVfcGFnZXMocywgMSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIE9HR1N0cmVhbUNvbnRleHQgKm9nZ3N0cmVhbSA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZMQUMgfHwKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1BFRVggfHwKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUykgeworICAgICAgICAgICAgYXZfZnJlZXAoJm9nZ3N0cmVhbS0+aGVhZGVyWzBdKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmb2dnc3RyZWFtLT5oZWFkZXJbMV0pOworICAgICAgICBhdl9mcmVlcCgmc3QtPnByaXZfZGF0YSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX09HR19NVVhFUgorT0dHX0NMQVNTKG9nZywgT2dnKQorQVZPdXRwdXRGb3JtYXQgZmZfb2dnX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJvZ2ciLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPZ2ciKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAiYXBwbGljYXRpb24vb2dnIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAib2dnLG9ndiIKKyNpZiAhQ09ORklHX1NQWF9NVVhFUgorICAgICAgICAgICAgICAgICAgICAgICAgICIsc3B4IgorI2VuZGlmCisjaWYgIUNPTkZJR19PUFVTX01VWEVSCisgICAgICAgICAgICAgICAgICAgICAgICAgIixvcHVzIgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihPR0dDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBDT05GSUdfTElCVk9SQklTX0VOQ09ERVIgPworICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0lEX1ZPUkJJUyA6IEFWX0NPREVDX0lEX0ZMQUMsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfVEhFT1JBLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG9nZ193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gb2dnX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBvZ2dfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9UU19ORUdBVElWRSB8IEFWRk1UX0FMTE9XX0ZMVVNILAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZvZ2dfbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfT0dBX01VWEVSCitPR0dfQ0xBU1Mob2dhLCBPZ2cgYXVkaW8pCitBVk91dHB1dEZvcm1hdCBmZl9vZ2FfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gIm9nYSIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9nZyBBdWRpbyIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhdWRpby9vZ2ciLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJvZ2EiLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihPR0dDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBDT05GSUdfTElCVk9SQklTX0VOQ09ERVIgPworICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0lEX1ZPUkJJUyA6IEFWX0NPREVDX0lEX0ZMQUMsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gb2dnX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBvZ2dfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IG9nZ193cml0ZV90cmFpbGVyLAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX1RTX05FR0FUSVZFIHwgQVZGTVRfQUxMT1dfRkxVU0gsCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJm9nYV9tdXhlcl9jbGFzcywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19TUFhfTVVYRVIKK09HR19DTEFTUyhzcHgsIE9nZyBTcGVleCkKK0FWT3V0cHV0Rm9ybWF0IGZmX3NweF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAic3B4IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT2dnIFNwZWV4IiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImF1ZGlvL29nZyIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gInNweCIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKE9HR0NvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1NQRUVYLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG9nZ193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gb2dnX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBvZ2dfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9UU19ORUdBVElWRSB8IEFWRk1UX0FMTE9XX0ZMVVNILAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZzcHhfbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfT1BVU19NVVhFUgorT0dHX0NMQVNTKG9wdXMsIE9nZyBPcHVzKQorQVZPdXRwdXRGb3JtYXQgZmZfb3B1c19tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAib3B1cyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9nZyBPcHVzIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImF1ZGlvL29nZyIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gIm9wdXMiLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihPR0dDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9PUFVTLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG9nZ193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gb2dnX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBvZ2dfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9UU19ORUdBVElWRSB8IEFWRk1UX0FMTE9XX0ZMVVNILAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZvcHVzX211eGVyX2NsYXNzLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ3BhcnNlY2VsdC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ3BhcnNlY2VsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMGM1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2VjZWx0LmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIFhpcGggQ0VMVCBwYXJzZXIgZm9yIE9nZworICogQ29weXJpZ2h0IChjKSAyMDExIE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAib2dnZGVjLmgiCisKK3N0cnVjdCBvZ2djZWx0X3ByaXZhdGUgeworICAgIGludCBleHRyYV9oZWFkZXJzX2xlZnQ7Cit9OworCitzdGF0aWMgaW50IGNlbHRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGlkeCkKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgPSBzLT5wcml2X2RhdGE7CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zID0gb2dnLT5zdHJlYW1zICsgaWR4OworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaWR4XTsKKyAgICBzdHJ1Y3Qgb2dnY2VsdF9wcml2YXRlICpwcml2ID0gb3MtPnByaXZhdGU7CisgICAgdWludDhfdCAqcCA9IG9zLT5idWYgKyBvcy0+cHN0YXJ0OworCisgICAgaWYgKG9zLT5wc2l6ZSA9PSA2MCAmJgorICAgICAgICAhbWVtY21wKHAsIGZmX2NlbHRfY29kZWMubWFnaWMsIGZmX2NlbHRfY29kZWMubWFnaWNzaXplKSkgeworICAgICAgICAvKiBNYWluIGhlYWRlciAqLworCisgICAgICAgIHVpbnQzMl90IHZlcnNpb24sIHNhbXBsZV9yYXRlLCBuYl9jaGFubmVsczsKKyAgICAgICAgdWludDMyX3Qgb3ZlcmxhcCwgZXh0cmFfaGVhZGVyczsKKworICAgICAgICBwcml2ID0gYXZfbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2dnY2VsdF9wcml2YXRlKSk7CisgICAgICAgIGlmICghcHJpdikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCAyICogc2l6ZW9mKHVpbnQzMl90KSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlKHByaXYpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICB2ZXJzaW9uICAgICAgICAgID0gQVZfUkwzMihwICsgMjgpOworICAgICAgICAvKiB1bnVzZWQgaGVhZGVyIHNpemUgZmllbGQgc2tpcHBlZCAqLworICAgICAgICBzYW1wbGVfcmF0ZSAgICAgID0gQVZfUkwzMihwICsgMzYpOworICAgICAgICBuYl9jaGFubmVscyAgICAgID0gQVZfUkwzMihwICsgNDApOworICAgICAgICBvdmVybGFwICAgICAgICAgID0gQVZfUkwzMihwICsgNDgpOworICAgICAgICAvKiB1bnVzZWQgYnl0ZXMgcGVyIHBhY2tldCBmaWVsZCBza2lwcGVkICovCisgICAgICAgIGV4dHJhX2hlYWRlcnMgICAgPSBBVl9STDMyKHAgKyA1Nik7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9DRUxUOworICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgID0gc2FtcGxlX3JhdGU7CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSBuYl9jaGFubmVsczsKKyAgICAgICAgaWYgKHNhbXBsZV9yYXRlKQorICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHNhbXBsZV9yYXRlKTsKKyAgICAgICAgcHJpdi0+ZXh0cmFfaGVhZGVyc19sZWZ0ICA9IDEgKyBleHRyYV9oZWFkZXJzOworICAgICAgICBhdl9mcmVlKG9zLT5wcml2YXRlKTsKKyAgICAgICAgb3MtPnByaXZhdGUgPSBwcml2OworICAgICAgICBBVl9XTDMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMCwgb3ZlcmxhcCk7CisgICAgICAgIEFWX1dMMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA0LCB2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChwcml2ICYmIHByaXYtPmV4dHJhX2hlYWRlcnNfbGVmdCkgeworICAgICAgICAvKiBFeHRyYSBoZWFkZXJzICh2b3JiaXNjb21tZW50KSAqLworCisgICAgICAgIGZmX3ZvcmJpc19zdHJlYW1fY29tbWVudChzLCBzdCwgcCwgb3MtPnBzaXplKTsKKyAgICAgICAgcHJpdi0+ZXh0cmFfaGVhZGVyc19sZWZ0LS07CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9jZWx0X2NvZGVjID0geworICAgIC5tYWdpYyAgICAgPSAiQ0VMVCAgICAiLAorICAgIC5tYWdpY3NpemUgPSA4LAorICAgIC5oZWFkZXIgICAgPSBjZWx0X2hlYWRlciwKKyAgICAubmJfaGVhZGVyID0gMiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2VkaXJhYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ3BhcnNlZGlyYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGZiMDdlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ3BhcnNlZGlyYWMuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCAgRGF2aWQgQ29ucmFkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9kaXJhYy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvZ2dkZWMuaCIKKworc3RhdGljIGludCBkaXJhY19oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWR4KQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpZHhdOworICAgIGRpcmFjX3NvdXJjZV9wYXJhbXMgc291cmNlOworICAgIEdldEJpdENvbnRleHQgZ2I7CisKKyAgICAvLyBhbHJlYWR5IHBhcnNlZCB0aGUgaGVhZGVyCisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRElSQUMpCisgICAgICAgIHJldHVybiAwOworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIG9zLT5idWYgKyBvcy0+cHN0YXJ0ICsgMTMsIChvcy0+cHNpemUgLSAxMykgKiA4KTsKKyAgICBpZiAoYXZwcml2X2RpcmFjX3BhcnNlX3NlcXVlbmNlX2hlYWRlcihzdC0+Y29kZWMsICZnYiwgJnNvdXJjZSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0RJUkFDOworICAgIC8vIGRpcmFjIGluIG9nZyBhbHdheXMgc3RvcmVzIHRpbWVzdGFtcHMgYXMgdGhvdWdoIHRoZSB2aWRlbyB3ZXJlIGludGVybGFjZWQKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgc3QtPmNvZGVjLT5mcmFtZXJhdGUuZGVuLCAyKnN0LT5jb2RlYy0+ZnJhbWVyYXRlLm51bSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8vIHZhcmlvdXMgdW5kb2N1bWVudCB0aGluZ3M6IGdyYW51bGUgaXMgc2lnbmVkIChvbmx5IGZvciBkaXJhYyEpCitzdGF0aWMgdWludDY0X3QgZGlyYWNfZ3B0b3B0cyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZHgsIHVpbnQ2NF90IGdyYW51bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpkdHNfb3V0KQoreworICAgIGludDY0X3QgZ3AgPSBncmFudWxlOworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisKKyAgICB1bnNpZ25lZCBkaXN0ICA9ICgoZ3AgPj4gMTQpICYgMHhmZjAwKSB8IChncCAmIDB4ZmYpOworICAgIGludDY0X3QgIGR0cyAgID0gKGdwID4+IDMxKTsKKyAgICBpbnQ2NF90ICBwdHMgICA9IGR0cyArICgoZ3AgPj4gOSkgJiAweDFmZmYpOworCisgICAgaWYgKCFkaXN0KQorICAgICAgICBvcy0+cGZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKworICAgIGlmIChkdHNfb3V0KQorICAgICAgICAqZHRzX291dCA9IGR0czsKKworICAgIHJldHVybiBwdHM7Cit9CisKK3N0YXRpYyBpbnQgb2xkX2RpcmFjX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZHgpCit7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2lkeF07CisgICAgdWludDhfdCAqYnVmID0gb3MtPmJ1ZiArIG9zLT5wc3RhcnQ7CisKKyAgICBpZiAoYnVmWzBdICE9ICdLJykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0RJUkFDOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBBVl9SQjMyKGJ1ZisxMiksIEFWX1JCMzIoYnVmKzgpKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHVpbnQ2NF90IG9sZF9kaXJhY19ncHRvcHRzKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGlkeCwgdWludDY0X3QgZ3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZHRzKQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisgICAgdWludDY0X3QgaWZyYW1lID0gZ3AgPj4gMzA7CisgICAgdWludDY0X3QgcGZyYW1lID0gZ3AgJiAweDNmZmZmZmZmOworCisgICAgaWYgKCFwZnJhbWUpCisgICAgICAgIG9zLT5wZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgcmV0dXJuIGlmcmFtZSArIHBmcmFtZTsKK30KKworY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9kaXJhY19jb2RlYyA9IHsKKyAgICAubWFnaWMgPSAiQkJDRFwwIiwKKyAgICAubWFnaWNzaXplID0gNSwKKyAgICAuaGVhZGVyID0gZGlyYWNfaGVhZGVyLAorICAgIC5ncHRvcHRzID0gZGlyYWNfZ3B0b3B0cywKKyAgICAuZ3JhbnVsZV9pc19zdGFydCA9IDEsCisgICAgLm5iX2hlYWRlciA9IDEsCit9OworCitjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjIGZmX29sZF9kaXJhY19jb2RlYyA9IHsKKyAgICAubWFnaWMgPSAiS1ctRElSQUMiLAorICAgIC5tYWdpY3NpemUgPSA4LAorICAgIC5oZWFkZXIgPSBvbGRfZGlyYWNfaGVhZGVyLAorICAgIC5ncHRvcHRzID0gb2xkX2RpcmFjX2dwdG9wdHMsCisgICAgLmdyYW51bGVfaXNfc3RhcnQgPSAxLAorICAgIC5uYl9oZWFkZXIgPSAxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9vZ2dwYXJzZWZsYWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vZ2dwYXJzZWZsYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2ZiNDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ3BhcnNlZmxhYy5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogICAgQ29weXJpZ2h0IChDKSAyMDA1ICBNYXR0aGlldSBDQVNURVQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ZsYWMuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAib2dnZGVjLmgiCisKKyNkZWZpbmUgT0dHX0ZMQUNfTUVUQURBVEFfVFlQRV9TVFJFQU1JTkZPIDB4N0YKKworc3RhdGljIGludAorZmxhY19oZWFkZXIgKEFWRm9ybWF0Q29udGV4dCAqIHMsIGludCBpZHgpCit7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2lkeF07CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgbWR0OworCisgICAgaWYgKG9zLT5idWZbb3MtPnBzdGFydF0gPT0gMHhmZikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgb3MtPmJ1ZiArIG9zLT5wc3RhcnQsIG9zLT5wc2l6ZSo4KTsKKyAgICBza2lwX2JpdHMxKCZnYik7IC8qIG1ldGFkYXRhX2xhc3QgKi8KKyAgICBtZHQgPSBnZXRfYml0cygmZ2IsIDcpOworCisgICAgaWYgKG1kdCA9PSBPR0dfRkxBQ19NRVRBREFUQV9UWVBFX1NUUkVBTUlORk8pIHsKKyAgICAgICAgdWludDhfdCAqc3RyZWFtaW5mb19zdGFydCA9IG9zLT5idWYgKyBvcy0+cHN0YXJ0ICsgNSArIDQgKyA0ICsgNDsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlcmF0ZTsKKworICAgICAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDQqOCk7IC8qICJGTEFDIiAqLworICAgICAgICBpZihnZXRfYml0cygmZ2IsIDgpICE9IDEpIC8qIHVuc3VwcG9ydGVkIG1ham9yIHZlcnNpb24gKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCA4ICsgMTYpOyAvKiBtaW5vciB2ZXJzaW9uICsgaGVhZGVyIGNvdW50ICovCisgICAgICAgIHNraXBfYml0c19sb25nKCZnYiwgNCo4KTsgLyogImZMYUMiICovCisKKyAgICAgICAgLyogTUVUQURBVEFfQkxPQ0tfSEVBREVSICovCisgICAgICAgIGlmIChnZXRfYml0c19sb25nKCZnYiwgMzIpICE9IEZMQUNfU1RSRUFNSU5GT19TSVpFKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZMQUM7CisgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOworCisgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBGTEFDX1NUUkVBTUlORk9fU0laRSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBzdHJlYW1pbmZvX3N0YXJ0LCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKworICAgICAgICBzYW1wbGVyYXRlID0gQVZfUkIyNChzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDEwKSA+PiA0OworICAgICAgICBpZiAoIXNhbXBsZXJhdGUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc2FtcGxlcmF0ZSk7CisgICAgfSBlbHNlIGlmIChtZHQgPT0gRkxBQ19NRVRBREFUQV9UWVBFX1ZPUkJJU19DT01NRU5UKSB7CisgICAgICAgIGZmX3ZvcmJpc19zdHJlYW1fY29tbWVudChzLCBzdCwgb3MtPmJ1ZiArIG9zLT5wc3RhcnQgKyA0LCBvcy0+cHNpemUgLSA0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorb2xkX2ZsYWNfaGVhZGVyIChBVkZvcm1hdENvbnRleHQgKiBzLCBpbnQgaWR4KQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2lkeF07CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zID0gb2dnLT5zdHJlYW1zICsgaWR4OworICAgIEFWQ29kZWNQYXJzZXJDb250ZXh0ICpwYXJzZXIgPSBhdl9wYXJzZXJfaW5pdChBVl9DT0RFQ19JRF9GTEFDKTsKKyAgICBpbnQgc2l6ZTsKKyAgICB1aW50OF90ICpkYXRhOworCisgICAgaWYgKCFwYXJzZXIpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRkxBQzsKKworICAgIHBhcnNlci0+ZmxhZ3MgPSBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVM7CisgICAgYXZfcGFyc2VyX3BhcnNlMihwYXJzZXIsIHN0LT5jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICZkYXRhLCAmc2l6ZSwgb3MtPmJ1ZiArIG9zLT5wc3RhcnQsIG9zLT5wc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIEFWX05PUFRTX1ZBTFVFLCBBVl9OT1BUU19WQUxVRSwgLTEpOworCisgICAgYXZfcGFyc2VyX2Nsb3NlKHBhcnNlcik7CisKKyAgICBpZiAoc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSkgeworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCitjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjIGZmX2ZsYWNfY29kZWMgPSB7CisgICAgLm1hZ2ljID0gIlwxNzdGTEFDIiwKKyAgICAubWFnaWNzaXplID0gNSwKKyAgICAuaGVhZGVyID0gZmxhY19oZWFkZXIsCisgICAgLm5iX2hlYWRlciA9IDIsCit9OworCitjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjIGZmX29sZF9mbGFjX2NvZGVjID0geworICAgIC5tYWdpYyA9ICJmTGFDIiwKKyAgICAubWFnaWNzaXplID0gNCwKKyAgICAuaGVhZGVyID0gb2xkX2ZsYWNfaGVhZGVyLAorICAgIC5uYl9oZWFkZXIgPSAwLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9vZ2dwYXJzZW9nbS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ3BhcnNlb2dtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQwMjRlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vZ2dwYXJzZW9nbS5jCkBAIC0wLDAgKzEsMjE2IEBACisvKioKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUgIE1pY2hhZWwgQWhsYmVyZywgTcOlbnMgUnVsbGfDpXJkCisKKyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICAgIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICAgIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgICAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyoqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAib2dnZGVjLmgiCisjaW5jbHVkZSAicmlmZi5oIgorCitzdGF0aWMgaW50CitvZ21faGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGlkeCkKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgPSBzLT5wcml2X2RhdGE7CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zID0gb2dnLT5zdHJlYW1zICsgaWR4OworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaWR4XTsKKyAgICBHZXRCeXRlQ29udGV4dCBwOworICAgIHVpbnQ2NF90IHRpbWVfdW5pdDsKKyAgICB1aW50NjRfdCBzcHU7CisgICAgdWludDMyX3Qgc2l6ZTsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnAsIG9zLT5idWYgKyBvcy0+cHN0YXJ0LCBvcy0+cHNpemUpOworICAgIGlmICghKGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZSgmcCkgJiAxKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZwKSA9PSAxKSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnAsIDEpOworCisgICAgICAgIGlmIChieXRlc3RyZWFtMl9wZWVrX2J5dGUoJnApID09ICd2Jyl7CisgICAgICAgICAgICBpbnQgdGFnOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcCwgOCk7CisgICAgICAgICAgICB0YWcgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcCk7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2JtcF90YWdzLCB0YWcpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSB0YWc7CisgICAgICAgIH0gZWxzZSBpZiAoYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZwKSA9PSAndCcpIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9URVhUOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcCwgMTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCBhY2lkWzVdID0geyAwIH07CisgICAgICAgICAgICBpbnQgY2lkOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcCwgOCk7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZwLCBhY2lkLCA0KTsKKyAgICAgICAgICAgIGFjaWRbNF0gPSAwOworICAgICAgICAgICAgY2lkID0gc3RydG9sKGFjaWQsIE5VTEwsIDE2KTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfd2F2X3RhZ3MsIGNpZCk7CisgICAgICAgICAgICAvLyBvdXIgcGFyc2VyIGNvbXBsZXRlbHkgYnJlYWtzIEFBQyBpbiBPZ2cKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0FBQykKKyAgICAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHNpemUgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnApOworICAgICAgICBzaXplICAgICAgICA9IEZGTUlOKHNpemUsIG9zLT5wc2l6ZSk7CisgICAgICAgIHRpbWVfdW5pdCAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlNjQoJnApOworICAgICAgICBzcHUgICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTY0KCZwKTsKKyAgICAgICAgaWYgKCF0aW1lX3VuaXQgfHwgIXNwdSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdGltaW5nIHZhbHVlcy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZwLCA0KTsgICAgLyogZGVmYXVsdF9sZW4gKi8KKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcCwgOCk7ICAgIC8qIGJ1ZmZlcnNpemUgKyBiaXRzX3Blcl9zYW1wbGUgKi8KKworICAgICAgICBpZihzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKXsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcCk7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZwKTsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCB0aW1lX3VuaXQsIHNwdSAqIDEwMDAwMDAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmcCk7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZwLCAyKTsgLyogYmxvY2tfYWxpZ24gKi8KKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcCkgKiA4OworICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNwdSAqIDEwMDAwMDAwIC8gdGltZV91bml0OworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgaWYgKHNpemUgPj0gNTYgJiYgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZwLCA0KTsKKyAgICAgICAgICAgICAgICBzaXplIC09IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDUyKSB7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFIDw9IDUyKTsKKyAgICAgICAgICAgICAgICBzaXplIC09IDUyOworICAgICAgICAgICAgICAgIGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIHNpemUpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJnAsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZwKSA9PSAzKSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnAsIDcpOworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnApID4gMSkKKyAgICAgICAgICAgIGZmX3ZvcmJpc19zdHJlYW1fY29tbWVudChzLCBzdCwgcC5idWZmZXIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZwKSAtIDEpOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitvZ21fZHNob3dfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGlkeCkKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgPSBzLT5wcml2X2RhdGE7CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zID0gb2dnLT5zdHJlYW1zICsgaWR4OworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaWR4XTsKKyAgICB1aW50OF90ICpwID0gb3MtPmJ1ZiArIG9zLT5wc3RhcnQ7CisgICAgdWludDMyX3QgdDsKKworICAgIGlmKCEoKnAgJiAxKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYoKnAgIT0gMSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAob3MtPnBzaXplIDwgMTAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB0ID0gQVZfUkwzMihwICsgOTYpOworCisgICAgaWYodCA9PSAweDA1NTg5ZjgwKXsKKyAgICAgICAgaWYgKG9zLT5wc2l6ZSA8IDE4NCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywgQVZfUkwzMihwICsgNjgpKTsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIEFWX1JMNjQocCArIDE2NCksIDEwMDAwMDAwKTsKKyAgICAgICAgc3QtPmNvZGVjLT53aWR0aCA9IEFWX1JMMzIocCArIDE3Nik7CisgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gQVZfUkwzMihwICsgMTgwKTsKKyAgICB9IGVsc2UgaWYodCA9PSAweDA1NTg5ZjgxKXsKKyAgICAgICAgaWYgKG9zLT5wc2l6ZSA8IDEzNikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY193YXZfdGFncywgQVZfUkwxNihwICsgMTI0KSk7CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBBVl9STDE2KHAgKyAxMjYpOworICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gQVZfUkwzMihwICsgMTI4KTsKKyAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IEFWX1JMMzIocCArIDEzMikgKiA4OworICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitvZ21fcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGlkeCkKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgPSBzLT5wcml2X2RhdGE7CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zID0gb2dnLT5zdHJlYW1zICsgaWR4OworICAgIHVpbnQ4X3QgKnAgPSBvcy0+YnVmICsgb3MtPnBzdGFydDsKKyAgICBpbnQgbGI7CisKKyAgICBpZigqcCAmIDgpCisgICAgICAgIG9zLT5wZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgbGIgPSAoKCpwICYgMikgPDwgMSkgfCAoKCpwID4+IDYpICYgMyk7CisgICAgb3MtPnBzdGFydCArPSBsYiArIDE7CisgICAgb3MtPnBzaXplIC09IGxiICsgMTsKKworICAgIHdoaWxlIChsYi0tKQorICAgICAgICBvcy0+cGR1cmF0aW9uICs9IHBbbGIrMV0gPDwgKGxiKjgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBvZ2dfY29kZWMgZmZfb2dtX3ZpZGVvX2NvZGVjID0geworICAgIC5tYWdpYyA9ICJcMDAxdmlkZW8iLAorICAgIC5tYWdpY3NpemUgPSA2LAorICAgIC5oZWFkZXIgPSBvZ21faGVhZGVyLAorICAgIC5wYWNrZXQgPSBvZ21fcGFja2V0LAorICAgIC5ncmFudWxlX2lzX3N0YXJ0ID0gMSwKKyAgICAubmJfaGVhZGVyID0gMiwKK307CisKK2NvbnN0IHN0cnVjdCBvZ2dfY29kZWMgZmZfb2dtX2F1ZGlvX2NvZGVjID0geworICAgIC5tYWdpYyA9ICJcMDAxYXVkaW8iLAorICAgIC5tYWdpY3NpemUgPSA2LAorICAgIC5oZWFkZXIgPSBvZ21faGVhZGVyLAorICAgIC5wYWNrZXQgPSBvZ21fcGFja2V0LAorICAgIC5ncmFudWxlX2lzX3N0YXJ0ID0gMSwKKyAgICAubmJfaGVhZGVyID0gMiwKK307CisKK2NvbnN0IHN0cnVjdCBvZ2dfY29kZWMgZmZfb2dtX3RleHRfY29kZWMgPSB7CisgICAgLm1hZ2ljID0gIlwwMDF0ZXh0IiwKKyAgICAubWFnaWNzaXplID0gNSwKKyAgICAuaGVhZGVyID0gb2dtX2hlYWRlciwKKyAgICAucGFja2V0ID0gb2dtX3BhY2tldCwKKyAgICAuZ3JhbnVsZV9pc19zdGFydCA9IDEsCisgICAgLm5iX2hlYWRlciA9IDIsCit9OworCitjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjIGZmX29nbV9vbGRfY29kZWMgPSB7CisgICAgLm1hZ2ljID0gIlwwMDFEaXJlY3QgU2hvdyBTYW1wbGVzIGVtYmVkZGVkIGluIE9nZyIsCisgICAgLm1hZ2ljc2l6ZSA9IDM1LAorICAgIC5oZWFkZXIgPSBvZ21fZHNob3dfaGVhZGVyLAorICAgIC5wYWNrZXQgPSBvZ21fcGFja2V0LAorICAgIC5ncmFudWxlX2lzX3N0YXJ0ID0gMSwKKyAgICAubmJfaGVhZGVyID0gMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2VvcHVzLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2VvcHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiMDJmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vZ2dwYXJzZW9wdXMuYwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIE9wdXMgcGFyc2VyIGZvciBPZ2cKKyAqIENvcHlyaWdodCAoYykgMjAxMiBOaWNvbGFzIEdlb3JnZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9nZ2RlYy5oIgorCitzdHJ1Y3Qgb2dnb3B1c19wcml2YXRlIHsKKyAgICBpbnQgbmVlZF9jb21tZW50czsKKyAgICB1bnNpZ25lZCBwcmVfc2tpcDsKKyAgICBpbnQ2NF90IGN1cl9kdHM7Cit9OworCisjZGVmaW5lIE9QVVNfU0VFS19QUkVST0xMX01TIDgwCisjZGVmaW5lIE9QVVNfSEVBRF9TSVpFIDE5CisKK3N0YXRpYyBpbnQgb3B1c19oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmYsIGludCBpZHgpCit7CisgICAgc3RydWN0IG9nZyAqb2dnICAgICAgICAgICAgICA9IGF2Zi0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyAgICAgICAgPSAmb2dnLT5zdHJlYW1zW2lkeF07CisgICAgQVZTdHJlYW0gKnN0ICAgICAgICAgICAgICAgICA9IGF2Zi0+c3RyZWFtc1tpZHhdOworICAgIHN0cnVjdCBvZ2dvcHVzX3ByaXZhdGUgKnByaXYgPSBvcy0+cHJpdmF0ZTsKKyAgICB1aW50OF90ICpwYWNrZXQgICAgICAgICAgICAgID0gb3MtPmJ1ZiArIG9zLT5wc3RhcnQ7CisKKyAgICBpZiAoIXByaXYpIHsKKyAgICAgICAgcHJpdiA9IG9zLT5wcml2YXRlID0gYXZfbWFsbG9jeihzaXplb2YoKnByaXYpKTsKKyAgICAgICAgaWYgKCFwcml2KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBpZiAob3MtPmZsYWdzICYgT0dHX0ZMQUdfQk9TKSB7CisgICAgICAgIGlmIChvcy0+cHNpemUgPCBPUFVTX0hFQURfU0laRSB8fCAoQVZfUkw4KHBhY2tldCArIDgpICYgMHhGMCkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX09QVVM7CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICA9IEFWX1JMOCAocGFja2V0ICsgOSk7CisgICAgICAgIHByaXYtPnByZV9za2lwICAgICAgICA9IEFWX1JMMTYocGFja2V0ICsgMTApOworICAgICAgICBzdC0+Y29kZWMtPmRlbGF5ICAgICAgPSBwcml2LT5wcmVfc2tpcDsKKyAgICAgICAgLypvcmlnX3NhbXBsZV9yYXRlICAgID0gQVZfUkwzMihwYWNrZXQgKyAxMik7Ki8KKyAgICAgICAgLypnYWluICAgICAgICAgICAgICAgID0gQVZfUkwxNihwYWNrZXQgKyAxNik7Ki8KKyAgICAgICAgLypjaGFubmVsX21hcCAgICAgICAgID0gQVZfUkw4IChwYWNrZXQgKyAxOCk7Ki8KKworICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgb3MtPnBzaXplKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBwYWNrZXQsIG9zLT5wc2l6ZSk7CisKKyAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgICAgICBhdl9jb2RlY19zZXRfc2Vla19wcmVyb2xsKHN0LT5jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlKE9QVVNfU0VFS19QUkVST0xMX01TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSwgMTAwMCkpOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgNDgwMDApOworICAgICAgICBwcml2LT5uZWVkX2NvbW1lbnRzID0gMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKHByaXYtPm5lZWRfY29tbWVudHMpIHsKKyAgICAgICAgaWYgKG9zLT5wc2l6ZSA8IDggfHwgbWVtY21wKHBhY2tldCwgIk9wdXNUYWdzIiwgOCkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZmZfdm9yYmlzX3N0cmVhbV9jb21tZW50KGF2Ziwgc3QsIHBhY2tldCArIDgsIG9zLT5wc2l6ZSAtIDgpOworICAgICAgICBwcml2LT5uZWVkX2NvbW1lbnRzLS07CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wdXNfZHVyYXRpb24odWludDhfdCAqc3JjLCBpbnQgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBuYl9mcmFtZXMgID0gMTsKKyAgICB1bnNpZ25lZCB0b2MgICAgICAgID0gc3JjWzBdOworICAgIHVuc2lnbmVkIHRvY19jb25maWcgPSB0b2MgPj4gMzsKKyAgICB1bnNpZ25lZCB0b2NfY291bnQgID0gdG9jICYgMzsKKyAgICB1bnNpZ25lZCBmcmFtZV9zaXplID0gdG9jX2NvbmZpZyA8IDEyID8gRkZNQVgoNDgwLCA5NjAgKiAodG9jX2NvbmZpZyAmIDMpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvY19jb25maWcgPCAxNiA/IDQ4MCA8PCAodG9jX2NvbmZpZyAmIDEpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwIDw8ICh0b2NfY29uZmlnICYgMyk7CisgICAgaWYgKHRvY19jb3VudCA9PSAzKSB7CisgICAgICAgIGlmIChzaXplPDIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgbmJfZnJhbWVzID0gc3JjWzFdICYgMHgzRjsKKyAgICB9IGVsc2UgaWYgKHRvY19jb3VudCkgeworICAgICAgICBuYl9mcmFtZXMgPSAyOworICAgIH0KKworICAgIHJldHVybiBmcmFtZV9zaXplICogbmJfZnJhbWVzOworfQorCitzdGF0aWMgaW50IG9wdXNfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZmLCBpbnQgaWR4KQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyAgICAgICAgICAgICAgPSBhdmYtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgICAgICAgID0gJm9nZy0+c3RyZWFtc1tpZHhdOworICAgIEFWU3RyZWFtICpzdCAgICAgICAgICAgICAgICAgPSBhdmYtPnN0cmVhbXNbaWR4XTsKKyAgICBzdHJ1Y3Qgb2dnb3B1c19wcml2YXRlICpwcml2ID0gb3MtPnByaXZhdGU7CisgICAgdWludDhfdCAqcGFja2V0ICAgICAgICAgICAgICA9IG9zLT5idWYgKyBvcy0+cHN0YXJ0OworICAgIGludCByZXQ7CisKKyAgICBpZiAoIW9zLT5wc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoKCFvcy0+bGFzdHB0cyB8fCBvcy0+bGFzdHB0cyA9PSBBVl9OT1BUU19WQUxVRSkgJiYgIShvcy0+ZmxhZ3MgJiBPR0dfRkxBR19FT1MpKSB7CisgICAgICAgIGludCBzZWcsIGQ7CisgICAgICAgIGludCBkdXJhdGlvbjsKKyAgICAgICAgdWludDhfdCAqbGFzdF9wa3QgID0gb3MtPmJ1ZiArIG9zLT5wc3RhcnQ7CisgICAgICAgIHVpbnQ4X3QgKm5leHRfcGt0ICA9IGxhc3RfcGt0OworCisgICAgICAgIGR1cmF0aW9uID0gMDsKKyAgICAgICAgc2VnID0gb3MtPnNlZ3A7CisgICAgICAgIGQgPSBvcHVzX2R1cmF0aW9uKGxhc3RfcGt0LCBvcy0+cHNpemUpOworICAgICAgICBpZiAoZCA8IDApIHsKKyAgICAgICAgICAgIG9zLT5wZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfQ09SUlVQVDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGR1cmF0aW9uICs9IGQ7CisgICAgICAgIGxhc3RfcGt0ID0gbmV4dF9wa3QgPSAgbmV4dF9wa3QgKyBvcy0+cHNpemU7CisgICAgICAgIGZvciAoOyBzZWcgPCBvcy0+bnNlZ3M7IHNlZysrKSB7CisgICAgICAgICAgICBuZXh0X3BrdCArPSBvcy0+c2VnbWVudHNbc2VnXTsKKyAgICAgICAgICAgIGlmIChvcy0+c2VnbWVudHNbc2VnXSA8IDI1NSAmJiBuZXh0X3BrdCAhPSBsYXN0X3BrdCkgeworICAgICAgICAgICAgICAgIGludCBkID0gb3B1c19kdXJhdGlvbihsYXN0X3BrdCwgbmV4dF9wa3QgLSBsYXN0X3BrdCk7CisgICAgICAgICAgICAgICAgaWYgKGQgPiAwKQorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiArPSBkOworICAgICAgICAgICAgICAgIGxhc3RfcGt0ID0gbmV4dF9wa3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3MtPmxhc3RwdHMgICAgICAgICAgICAgICAgID0KKyAgICAgICAgb3MtPmxhc3RkdHMgICAgICAgICAgICAgICAgID0gb3MtPmdyYW51bGUgLSBkdXJhdGlvbjsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IG9wdXNfZHVyYXRpb24ocGFja2V0LCBvcy0+cHNpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBvcy0+cGR1cmF0aW9uID0gcmV0OworICAgIGlmIChvcy0+bGFzdHB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBpZiAoc3QtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBzdC0+c3RhcnRfdGltZSA9IG9zLT5sYXN0cHRzOworICAgICAgICBwcml2LT5jdXJfZHRzID0gb3MtPmxhc3RkdHMgPSBvcy0+bGFzdHB0cyAtPSBwcml2LT5wcmVfc2tpcDsKKyAgICB9CisKKyAgICBwcml2LT5jdXJfZHRzICs9IG9zLT5wZHVyYXRpb247CisgICAgaWYgKChvcy0+ZmxhZ3MgJiBPR0dfRkxBR19FT1MpKSB7CisgICAgICAgIGludDY0X3Qgc2tpcCA9IHByaXYtPmN1cl9kdHMgLSBvcy0+Z3JhbnVsZSArIHByaXYtPnByZV9za2lwOworICAgICAgICBza2lwID0gRkZNSU4oc2tpcCwgb3MtPnBkdXJhdGlvbik7CisgICAgICAgIGlmIChza2lwID4gMCkgeworICAgICAgICAgICAgb3MtPnBkdXJhdGlvbiA9IHNraXAgPCBvcy0+cGR1cmF0aW9uID8gb3MtPnBkdXJhdGlvbiAtIHNraXAgOiAxOworICAgICAgICAgICAgb3MtPmVuZF90cmltbWluZyA9IHNraXA7CisgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgIkxhc3QgcGFja2V0IHdhcyB0cnVuY2F0ZWQgdG8gJWQgZHVlIHRvIGVuZCB0cmltbWluZy5cbiIsCisgICAgICAgICAgICAgICAgICAgb3MtPnBkdXJhdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9vcHVzX2NvZGVjID0geworICAgIC5uYW1lICAgICAgICAgICAgID0gIk9wdXMiLAorICAgIC5tYWdpYyAgICAgICAgICAgID0gIk9wdXNIZWFkIiwKKyAgICAubWFnaWNzaXplICAgICAgICA9IDgsCisgICAgLmhlYWRlciAgICAgICAgICAgPSBvcHVzX2hlYWRlciwKKyAgICAucGFja2V0ICAgICAgICAgICA9IG9wdXNfcGFja2V0LAorICAgIC5uYl9oZWFkZXIgICAgICAgID0gMSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2Vza2VsZXRvbi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ3BhcnNlc2tlbGV0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzIxMDVmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ3BhcnNlc2tlbGV0b24uYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBEYXZpZCBDb25yYWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvZ2dkZWMuaCIKKworc3RhdGljIGludCBza2VsZXRvbl9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWR4KQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpZHhdOworICAgIHVpbnQ4X3QgKmJ1ZiA9IG9zLT5idWYgKyBvcy0+cHN0YXJ0OworICAgIGludCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yOworICAgIGludDY0X3Qgc3RhcnRfbnVtLCBzdGFydF9kZW47CisgICAgdWludDY0X3Qgc3RhcnRfZ3JhbnVsZTsKKyAgICBpbnQgdGFyZ2V0X2lkeCwgc3RhcnRfdGltZTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOworCisgICAgaWYgKChvcy0+ZmxhZ3MgJiBPR0dfRkxBR19FT1MpICYmIG9zLT5wc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGlmIChvcy0+cHNpemUgPCA4KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIXN0cm5jbXAoYnVmLCAiZmlzaGVhZCIsIDgpKSB7CisgICAgICAgIGlmIChvcy0+cHNpemUgPCA2NCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICB2ZXJzaW9uX21ham9yID0gQVZfUkwxNihidWYrOCk7CisgICAgICAgIHZlcnNpb25fbWlub3IgPSBBVl9STDE2KGJ1ZisxMCk7CisKKyAgICAgICAgaWYgKHZlcnNpb25fbWFqb3IgIT0gMyAmJiB2ZXJzaW9uX21ham9yICE9IDQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVua25vd24gc2tlbGV0b24gdmVyc2lvbiAlZC4lZFxuIiwKKyAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgaXMgdGhlIG92ZXJhbGwgc3RhcnQgdGltZS4gV2UgdXNlIGl0IGZvciB0aGUgc3RhcnQgdGltZSBvZgorICAgICAgICAvLyBvZiB0aGUgc2tlbGV0b24gc3RyZWFtIHNpbmNlIGlmIGxlZnQgdW5zZXQgbGF2ZiBhc3N1bWVzIDAsCisgICAgICAgIC8vIHdoaWNoIHdlIGRvbid0IHdhbnQgc2luY2Ugc2tlbGV0b24gaXMgdGltZWxlc3MKKyAgICAgICAgLy8gRklYTUU6IHRoZSByZWFsIG1lYW5pbmcgb2YgdGhpcyBmaWVsZCBpcyAic3RhcnQgcGxheWJhY2sgYXQKKyAgICAgICAgLy8gdGhpcyB0aW1lIHdoaWNoIGNhbiBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgcGFja2V0CisgICAgICAgIHN0YXJ0X251bSA9IEFWX1JMNjQoYnVmKzEyKTsKKyAgICAgICAgc3RhcnRfZGVuID0gQVZfUkw2NChidWYrMjApOworCisgICAgICAgIGlmIChzdGFydF9kZW4gPiAwICYmIHN0YXJ0X251bSA+IDApIHsKKyAgICAgICAgICAgIGludCBiYXNlX2RlbjsKKyAgICAgICAgICAgIGF2X3JlZHVjZSgmc3RhcnRfdGltZSwgJmJhc2VfZGVuLCBzdGFydF9udW0sIHN0YXJ0X2RlbiwgSU5UX01BWCk7CisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgYmFzZV9kZW4pOworICAgICAgICAgICAgb3MtPmxhc3RwdHMgPQorICAgICAgICAgICAgc3QtPnN0YXJ0X3RpbWUgPSBzdGFydF90aW1lOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RybmNtcChidWYsICJmaXNib25lIiwgOCkpIHsKKyAgICAgICAgaWYgKG9zLT5wc2l6ZSA8IDUyKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIHRhcmdldF9pZHggPSBvZ2dfZmluZF9zdHJlYW0ob2dnLCBBVl9STDMyKGJ1ZisxMikpOworICAgICAgICBzdGFydF9ncmFudWxlID0gQVZfUkw2NChidWYrMzYpOworICAgICAgICBpZiAodGFyZ2V0X2lkeCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlNlcmlhbCBudW1iZXIgaW4gZmlzYm9uZSBkb2Vzbid0IG1hdGNoIGFueSBzdHJlYW1cbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgb3MgPSBvZ2ctPnN0cmVhbXMgKyB0YXJnZXRfaWR4OworICAgICAgICBpZiAob3MtPnN0YXJ0X2dyYW51bGUgIT0gT0dHX05PR1JBTlVMRV9WQUxVRSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiTXVsdGlwbGUgZmlzYm9uZSBmb3IgdGhlIHNhbWUgc3RyZWFtXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFydF9ncmFudWxlICE9IE9HR19OT0dSQU5VTEVfVkFMVUUpIHsKKyAgICAgICAgICAgIG9zLT5zdGFydF9ncmFudWxlID0gc3RhcnRfZ3JhbnVsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCitjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjIGZmX3NrZWxldG9uX2NvZGVjID0geworICAgIC5tYWdpYyA9ICJmaXNoZWFkIiwKKyAgICAubWFnaWNzaXplID0gOCwKKyAgICAuaGVhZGVyID0gc2tlbGV0b25faGVhZGVyLAorICAgIC5uYl9oZWFkZXIgPSAwLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9vZ2dwYXJzZXNwZWV4LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2VzcGVleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNWM2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2VzcGVleC5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICAgICAgQ29weXJpZ2h0IChDKSAyMDA4ICBSZWltYXIgRMO2ZmZpbmdlcgorCisgICAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICAgICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAgICAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAgICAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICAgICAgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgICAgICBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICAgICAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAgICAgIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICAgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgICAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKiovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9nZ2RlYy5oIgorCitzdHJ1Y3Qgc3BlZXhfcGFyYW1zIHsKKyAgICBpbnQgcGFja2V0X3NpemU7CisgICAgaW50IGZpbmFsX3BhY2tldF9kdXJhdGlvbjsKKyAgICBpbnQgc2VxOworfTsKKworc3RhdGljIGludCBzcGVleF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWR4KSB7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKKyAgICBzdHJ1Y3Qgc3BlZXhfcGFyYW1zICpzcHhwID0gb3MtPnByaXZhdGU7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpZHhdOworICAgIHVpbnQ4X3QgKnAgPSBvcy0+YnVmICsgb3MtPnBzdGFydDsKKworICAgIGlmICghc3B4cCkgeworICAgICAgICBzcHhwID0gYXZfbWFsbG9jeihzaXplb2YoKnNweHApKTsKKyAgICAgICAgb3MtPnByaXZhdGUgPSBzcHhwOworICAgIH0KKworICAgIGlmIChzcHhwLT5zZXEgPiAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzcHhwLT5zZXEgPT0gMCkgeworICAgICAgICBpbnQgZnJhbWVzX3Blcl9wYWNrZXQ7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1NQRUVYOworCisgICAgICAgIGlmIChvcy0+cHNpemUgPCA2OCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInNwZWV4IHBhY2tldCB0b28gc21hbGxcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gQVZfUkwzMihwICsgMzYpOworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gQVZfUkwzMihwICsgNDgpOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jaGFubmVscyA8IDEgfHwgc3QtPmNvZGVjLT5jaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGNoYW5uZWwgY291bnQuIFNwZWV4IG11c3QgYmUgbW9ubyBvciBzdGVyZW8uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBzdC0+Y29kZWMtPmNoYW5uZWxzID09IDEgPyBBVl9DSF9MQVlPVVRfTU9OTyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfU1RFUkVPOworCisgICAgICAgIHNweHAtPnBhY2tldF9zaXplICA9IEFWX1JMMzIocCArIDU2KTsKKyAgICAgICAgZnJhbWVzX3Blcl9wYWNrZXQgID0gQVZfUkwzMihwICsgNjQpOworICAgICAgICBpZiAoZnJhbWVzX3Blcl9wYWNrZXQpCisgICAgICAgICAgICBzcHhwLT5wYWNrZXRfc2l6ZSAqPSBmcmFtZXNfcGVyX3BhY2tldDsKKworICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgb3MtPnBzaXplKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsIHAsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICB9IGVsc2UKKyAgICAgICAgZmZfdm9yYmlzX3N0cmVhbV9jb21tZW50KHMsIHN0LCBwLCBvcy0+cHNpemUpOworCisgICAgc3B4cC0+c2VxKys7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgb2dnX3BhZ2VfcGFja2V0cyhzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MpCit7CisgICAgaW50IGk7CisgICAgaW50IHBhY2tldHMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBvcy0+bnNlZ3M7IGkrKykKKyAgICAgICAgaWYgKG9zLT5zZWdtZW50c1tpXSA8IDI1NSkKKyAgICAgICAgICAgIHBhY2tldHMrKzsKKyAgICByZXR1cm4gcGFja2V0czsKK30KKworc3RhdGljIGludCBzcGVleF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWR4KQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisgICAgc3RydWN0IHNwZWV4X3BhcmFtcyAqc3B4cCA9IG9zLT5wcml2YXRlOworICAgIGludCBwYWNrZXRfc2l6ZSA9IHNweHAtPnBhY2tldF9zaXplOworCisgICAgaWYgKG9zLT5mbGFncyAmIE9HR19GTEFHX0VPUyAmJiBvcy0+bGFzdHB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICBvcy0+Z3JhbnVsZSA+IDApIHsKKyAgICAgICAgLyogZmlyc3QgcGFja2V0IG9mIGZpbmFsIHBhZ2UuIHdlIGhhdmUgdG8gY2FsY3VsYXRlIHRoZSBmaW5hbCBwYWNrZXQKKyAgICAgICAgICAgZHVyYXRpb24gaGVyZSBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IHBsYWNlIHdlIGtub3cgdGhlIG5leHQtdG8tbGFzdAorICAgICAgICAgICBncmFudWxlIHBvc2l0aW9uLiAqLworICAgICAgICBzcHhwLT5maW5hbF9wYWNrZXRfZHVyYXRpb24gPSBvcy0+Z3JhbnVsZSAtIG9zLT5sYXN0cHRzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X3NpemUgKiAob2dnX3BhZ2VfcGFja2V0cyhvcykgLSAxKTsKKyAgICB9CisKKyAgICBpZiAoIW9zLT5sYXN0cHRzICYmIG9zLT5ncmFudWxlID4gMCkKKyAgICAgICAgLyogZmlyc3QgcGFja2V0ICovCisgICAgICAgIG9zLT5sYXN0cHRzID0gb3MtPmxhc3RkdHMgPSBvcy0+Z3JhbnVsZSAtIHBhY2tldF9zaXplICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9nZ19wYWdlX3BhY2tldHMob3MpOworICAgIGlmIChvcy0+ZmxhZ3MgJiBPR0dfRkxBR19FT1MgJiYgb3MtPnNlZ3AgPT0gb3MtPm5zZWdzICYmCisgICAgICAgIHNweHAtPmZpbmFsX3BhY2tldF9kdXJhdGlvbikKKyAgICAgICAgLyogZmluYWwgcGFja2V0ICovCisgICAgICAgIG9zLT5wZHVyYXRpb24gPSBzcHhwLT5maW5hbF9wYWNrZXRfZHVyYXRpb247CisgICAgZWxzZQorICAgICAgICBvcy0+cGR1cmF0aW9uID0gcGFja2V0X3NpemU7CisKKyAgICByZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9zcGVleF9jb2RlYyA9IHsKKyAgICAubWFnaWMgPSAiU3BlZXggICAiLAorICAgIC5tYWdpY3NpemUgPSA4LAorICAgIC5oZWFkZXIgPSBzcGVleF9oZWFkZXIsCisgICAgLnBhY2tldCA9IHNwZWV4X3BhY2tldCwKKyAgICAubmJfaGVhZGVyID0gMiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2V0aGVvcmEuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vZ2dwYXJzZXRoZW9yYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYzcwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2V0aGVvcmEuYwpAQCAtMCwwICsxLDIxNCBAQAorLyoqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDUgIE1hdHRoaWV1IENBU1RFVCwgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiAgICBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqICAgIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiAgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiAgICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvZ2dkZWMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVGhlb3JhUGFyYW1zIHsKKyAgICBpbnQgZ3BzaGlmdDsKKyAgICBpbnQgZ3BtYXNrOworICAgIHVuc2lnbmVkIHZlcnNpb247Cit9IFRoZW9yYVBhcmFtczsKKworc3RhdGljIGludCB0aGVvcmFfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGlkeCkKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgICAgICAgPSBzLT5wcml2X2RhdGE7CisgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zID0gb2dnLT5zdHJlYW1zICsgaWR4OworICAgIEFWU3RyZWFtICpzdCAgICAgICAgICA9IHMtPnN0cmVhbXNbaWR4XTsKKyAgICBUaGVvcmFQYXJhbXMgKnRocCAgICAgPSBvcy0+cHJpdmF0ZTsKKyAgICBpbnQgY2RzICAgICAgICAgICAgICAgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICsgb3MtPnBzaXplICsgMjsKKyAgICBpbnQgZXJyOworICAgIHVpbnQ4X3QgKmNkcDsKKworICAgIGlmICghKG9zLT5idWZbb3MtPnBzdGFydF0gJiAweDgwKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIXRocCkgeworICAgICAgICB0aHAgPSBhdl9tYWxsb2N6KHNpemVvZigqdGhwKSk7CisgICAgICAgIGlmICghdGhwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgb3MtPnByaXZhdGUgPSB0aHA7CisgICAgfQorCisgICAgc3dpdGNoIChvcy0+YnVmW29zLT5wc3RhcnRdKSB7CisgICAgY2FzZSAweDgwOiB7CisgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgICAgIEFWUmF0aW9uYWwgdGltZWJhc2U7CisKKyAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIG9zLT5idWYgKyBvcy0+cHN0YXJ0LCBvcy0+cHNpemUgKiA4KTsKKworICAgICAgICAvKiAweDgwInRoZW9yYSIgKi8KKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCA3ICogOCk7CisKKyAgICAgICAgdGhwLT52ZXJzaW9uID0gZ2V0X2JpdHNfbG9uZygmZ2IsIDI0KTsKKyAgICAgICAgaWYgKHRocC0+dmVyc2lvbiA8IDB4MDMwMTAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJUb28gb2xkIG9yIHVuc3VwcG9ydGVkIFRoZW9yYSAoJXgpXG4iLCB0aHAtPnZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggID0gZ2V0X2JpdHMoJmdiLCAxNikgPDwgNDsKKyAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBnZXRfYml0cygmZ2IsIDE2KSA8PCA0OworCisgICAgICAgIGlmICh0aHAtPnZlcnNpb24gPj0gMHgwMzA0MDApCisgICAgICAgICAgICBza2lwX2JpdHMoJmdiLCAxMDApOworCisgICAgICAgIGlmICh0aHAtPnZlcnNpb24gPj0gMHgwMzAyMDApIHsKKyAgICAgICAgICAgIGludCB3aWR0aCAgPSBnZXRfYml0c19sb25nKCZnYiwgMjQpOworICAgICAgICAgICAgaW50IGhlaWdodCA9IGdldF9iaXRzX2xvbmcoJmdiLCAyNCk7CisgICAgICAgICAgICBpZiAod2lkdGggIDw9IHN0LT5jb2RlYy0+d2lkdGggICYmIHdpZHRoICA+IHN0LT5jb2RlYy0+d2lkdGggIC0gMTYgJiYKKyAgICAgICAgICAgICAgICBoZWlnaHQgPD0gc3QtPmNvZGVjLT5oZWlnaHQgJiYgaGVpZ2h0ID4gc3QtPmNvZGVjLT5oZWlnaHQgLSAxNikgeworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggID0gd2lkdGg7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNraXBfYml0cygmZ2IsIDE2KTsKKyAgICAgICAgfQorCisgICAgICAgIHRpbWViYXNlLmRlbiA9IGdldF9iaXRzX2xvbmcoJmdiLCAzMik7CisgICAgICAgIHRpbWViYXNlLm51bSA9IGdldF9iaXRzX2xvbmcoJmdiLCAzMik7CisgICAgICAgIGlmICghKHRpbWViYXNlLm51bSA+IDAgJiYgdGltZWJhc2UuZGVuID4gMCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgdGltZSBiYXNlIGluIHRoZW9yYSBzdHJlYW0sIGFzc3VtaW5nIDI1IEZQU1xuIik7CisgICAgICAgICAgICB0aW1lYmFzZS5udW0gPSAxOworICAgICAgICAgICAgdGltZWJhc2UuZGVuID0gMjU7CisgICAgICAgIH0KKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHRpbWViYXNlLm51bSwgdGltZWJhc2UuZGVuKTsKKworICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPSBnZXRfYml0c19sb25nKCZnYiwgMjQpOworICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPSBnZXRfYml0c19sb25nKCZnYiwgMjQpOworCisgICAgICAgIGlmICh0aHAtPnZlcnNpb24gPj0gMHgwMzAyMDApCisgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDM4KTsKKyAgICAgICAgaWYgKHRocC0+dmVyc2lvbiA+PSAweDMwNDAwMCkKKyAgICAgICAgICAgIHNraXBfYml0cygmZ2IsIDIpOworCisgICAgICAgIHRocC0+Z3BzaGlmdCA9IGdldF9iaXRzKCZnYiwgNSk7CisgICAgICAgIHRocC0+Z3BtYXNrICA9ICgxIDw8IHRocC0+Z3BzaGlmdCkgLSAxOworCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVEhFT1JBOworICAgICAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOworICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIDB4ODE6CisgICAgICAgIGZmX3ZvcmJpc19zdHJlYW1fY29tbWVudChzLCBzdCwgb3MtPmJ1ZiArIG9zLT5wc3RhcnQgKyA3LCBvcy0+cHNpemUgLSA3KTsKKyAgICBjYXNlIDB4ODI6CisgICAgICAgIGlmICghdGhwLT52ZXJzaW9uKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmtub3duIGhlYWRlciB0eXBlICVYXG4iLCBvcy0+YnVmW29zLT5wc3RhcnRdKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjZHMgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSkgPCAwKSB7CisgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBtZW1zZXQoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyBjZHMsIDAsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCisgICAgY2RwICAgID0gc3QtPmNvZGVjLT5leHRyYWRhdGEgKyBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplOworICAgICpjZHArKyA9IG9zLT5wc2l6ZSA+PiA4OworICAgICpjZHArKyA9IG9zLT5wc2l6ZSAmIDB4ZmY7CisgICAgbWVtY3B5KGNkcCwgb3MtPmJ1ZiArIG9zLT5wc3RhcnQsIG9zLT5wc2l6ZSk7CisgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IGNkczsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdWludDY0X3QgdGhlb3JhX2dwdG9wdHMoQVZGb3JtYXRDb250ZXh0ICpjdHgsIGludCBpZHgsIHVpbnQ2NF90IGdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmR0cykKK3sKKyAgICBzdHJ1Y3Qgb2dnICpvZ2cgICAgICAgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisgICAgVGhlb3JhUGFyYW1zICp0aHAgICAgID0gb3MtPnByaXZhdGU7CisgICAgdWludDY0X3QgaWZyYW1lLCBwZnJhbWU7CisKKyAgICBpZiAoIXRocCkKKyAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworCisgICAgaWZyYW1lID0gZ3AgPj4gdGhwLT5ncHNoaWZ0OworICAgIHBmcmFtZSA9IGdwICYgdGhwLT5ncG1hc2s7CisKKyAgICBpZiAodGhwLT52ZXJzaW9uIDwgMHgwMzAyMDEpCisgICAgICAgIGlmcmFtZSsrOworCisgICAgaWYgKCFwZnJhbWUpCisgICAgICAgIG9zLT5wZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgaWYgKGR0cykKKyAgICAgICAgKmR0cyA9IGlmcmFtZSArIHBmcmFtZTsKKworICAgIHJldHVybiBpZnJhbWUgKyBwZnJhbWU7Cit9CisKK3N0YXRpYyBpbnQgdGhlb3JhX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZHgpCit7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKKyAgICBpbnQgZHVyYXRpb247CisKKyAgICAvKiBmaXJzdCBwYWNrZXQgaGFuZGxpbmcKKyAgICAgICBoZXJlIHdlIHBhcnNlIHRoZSBkdXJhdGlvbiBvZiBlYWNoIHBhY2tldCBpbiB0aGUgZmlyc3QgcGFnZSBhbmQgY29tcGFyZQorICAgICAgIHRoZSB0b3RhbCBkdXJhdGlvbiB0byB0aGUgcGFnZSBncmFudWxlIHRvIGZpbmQgdGhlIGVuY29kZXIgZGVsYXkgYW5kCisgICAgICAgc2V0IHRoZSBmaXJzdCB0aW1lc3RhbXAgKi8KKworICAgIGlmICgoIW9zLT5sYXN0cHRzIHx8IG9zLT5sYXN0cHRzID09IEFWX05PUFRTX1ZBTFVFKSAmJiAhKG9zLT5mbGFncyAmIE9HR19GTEFHX0VPUykpIHsKKyAgICAgICAgaW50IHNlZzsKKworICAgICAgICBkdXJhdGlvbiA9IDE7CisgICAgICAgIGZvciAoc2VnID0gb3MtPnNlZ3A7IHNlZyA8IG9zLT5uc2Vnczsgc2VnKyspIHsKKyAgICAgICAgICAgIGlmIChvcy0+c2VnbWVudHNbc2VnXSA8IDI1NSkKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiArKzsKKyAgICAgICAgfQorCisgICAgICAgIG9zLT5sYXN0cHRzID0gb3MtPmxhc3RkdHMgICA9IHRoZW9yYV9ncHRvcHRzKHMsIGlkeCwgb3MtPmdyYW51bGUsIE5VTEwpIC0gZHVyYXRpb247CisgICAgICAgIGlmKHMtPnN0cmVhbXNbaWR4XS0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgcy0+c3RyZWFtc1tpZHhdLT5zdGFydF90aW1lID0gb3MtPmxhc3RwdHM7CisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpZHhdLT5kdXJhdGlvbikKKyAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW2lkeF0tPmR1cmF0aW9uIC09IHMtPnN0cmVhbXNbaWR4XS0+c3RhcnRfdGltZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhcnNlIHBhY2tldCBkdXJhdGlvbiAqLworICAgIGlmIChvcy0+cHNpemUgPiAwKSB7CisgICAgICAgIG9zLT5wZHVyYXRpb24gPSAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjIGZmX3RoZW9yYV9jb2RlYyA9IHsKKyAgICAubWFnaWMgICAgID0gIlwyMDB0aGVvcmEiLAorICAgIC5tYWdpY3NpemUgPSA3LAorICAgIC5oZWFkZXIgICAgPSB0aGVvcmFfaGVhZGVyLAorICAgIC5wYWNrZXQgICAgPSB0aGVvcmFfcGFja2V0LAorICAgIC5ncHRvcHRzICAgPSB0aGVvcmFfZ3B0b3B0cywKKyAgICAubmJfaGVhZGVyID0gMywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2V2b3JiaXMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vZ2dwYXJzZXZvcmJpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDQzMzcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2V2b3JiaXMuYwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgTWljaGFlbCBBaGxiZXJnLCBNw6VucyBSdWxsZ8OlcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorICogbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jhc2U2NC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdm9yYmlzX3BhcnNlci5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiZmxhY19waWN0dXJlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvZ2dkZWMuaCIKKyNpbmNsdWRlICJ2b3JiaXNjb21tZW50LmgiCisjaW5jbHVkZSAicmVwbGF5Z2Fpbi5oIgorCitzdGF0aWMgaW50IG9nbV9jaGFwdGVyKEFWRm9ybWF0Q29udGV4dCAqYXMsIHVpbnQ4X3QgKmtleSwgdWludDhfdCAqdmFsKQoreworICAgIGludCBpLCBjbnVtLCBoLCBtLCBzLCBtcywga2V5bGVuID0gc3RybGVuKGtleSk7CisgICAgQVZDaGFwdGVyICpjaGFwdGVyID0gTlVMTDsKKworICAgIGlmIChrZXlsZW4gPCA5IHx8IHNzY2FuZihrZXksICJDSEFQVEVSJTAzZCIsICZjbnVtKSAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChrZXlsZW4gPD0gMTApIHsKKyAgICAgICAgaWYgKHNzY2FuZih2YWwsICIlMDJkOiUwMmQ6JTAyZC4lMDNkIiwgJmgsICZtLCAmcywgJm1zKSA8IDQpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBhdnByaXZfbmV3X2NoYXB0ZXIoYXMsIGNudW0sIChBVlJhdGlvbmFsKSB7IDEsIDEwMDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zICsgMTAwMCAqIChzICsgNjAgKiAobSArIDYwICogaCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTk9QVFNfVkFMVUUsIE5VTEwpOworICAgICAgICBhdl9mcmVlKHZhbCk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSArIGtleWxlbiAtIDQsICJOQU1FIikpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFzLT5uYl9jaGFwdGVyczsgaSsrKQorICAgICAgICAgICAgaWYgKGFzLT5jaGFwdGVyc1tpXS0+aWQgPT0gY251bSkgeworICAgICAgICAgICAgICAgIGNoYXB0ZXIgPSBhcy0+Y2hhcHRlcnNbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmICghY2hhcHRlcikKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGF2X2RpY3Rfc2V0KCZjaGFwdGVyLT5tZXRhZGF0YSwgInRpdGxlIiwgdmFsLCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiAwOworCisgICAgYXZfZnJlZShrZXkpOworICAgIHJldHVybiAxOworfQorCitpbnQgZmZfdm9yYmlzX3N0cmVhbV9jb21tZW50KEFWRm9ybWF0Q29udGV4dCAqYXMsIEFWU3RyZWFtICpzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgdXBkYXRlcyA9IGZmX3ZvcmJpc19jb21tZW50KGFzLCAmc3QtPm1ldGFkYXRhLCBidWYsIHNpemUsIDEpOworCisgICAgaWYgKHVwZGF0ZXMgPiAwKSB7CisgICAgICAgIHN0LT5ldmVudF9mbGFncyB8PSBBVlNUUkVBTV9FVkVOVF9GTEFHX01FVEFEQVRBX1VQREFURUQ7CisgICAgfQorCisgICAgcmV0dXJuIHVwZGF0ZXM7Cit9CisKK2ludCBmZl92b3JiaXNfY29tbWVudChBVkZvcm1hdENvbnRleHQgKmFzLCBBVkRpY3Rpb25hcnkgKiptLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcnNlX3BpY3R1cmUpCit7CisgICAgY29uc3QgdWludDhfdCAqcCAgID0gYnVmOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IGJ1ZiArIHNpemU7CisgICAgaW50IHVwZGF0ZXMgICAgICAgID0gMDsKKyAgICB1bnNpZ25lZCBuLCBqOworICAgIGludCBzOworCisgICAgLyogbXVzdCBoYXZlIHZlbmRvcl9sZW5ndGggYW5kIHVzZXJfY29tbWVudF9saXN0X2xlbmd0aCAqLworICAgIGlmIChzaXplIDwgOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcCk7CisKKyAgICBpZiAoZW5kIC0gcCAtIDQgPCBzIHx8IHMgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHAgKz0gczsKKworICAgIG4gPSBieXRlc3RyZWFtX2dldF9sZTMyKCZwKTsKKworICAgIHdoaWxlIChlbmQgLSBwID49IDQgJiYgbiA+IDApIHsKKyAgICAgICAgY29uc3QgY2hhciAqdCwgKnY7CisgICAgICAgIGludCB0bCwgdmw7CisKKyAgICAgICAgcyA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJnApOworCisgICAgICAgIGlmIChlbmQgLSBwIDwgcyB8fCBzIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHQgID0gcDsKKyAgICAgICAgcCArPSBzOworICAgICAgICBuLS07CisKKyAgICAgICAgdiA9IG1lbWNocih0LCAnPScsIHMpOworICAgICAgICBpZiAoIXYpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICB0bCA9IHYgLSB0OworICAgICAgICB2bCA9IHMgLSB0bCAtIDE7CisgICAgICAgIHYrKzsKKworICAgICAgICBpZiAodGwgJiYgdmwpIHsKKyAgICAgICAgICAgIGNoYXIgKnR0LCAqY3Q7CisKKyAgICAgICAgICAgIHR0ID0gYXZfbWFsbG9jKHRsICsgMSk7CisgICAgICAgICAgICBjdCA9IGF2X21hbGxvYyh2bCArIDEpOworICAgICAgICAgICAgaWYgKCF0dCB8fCAhY3QpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmdHQpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZjdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRsOyBqKyspCisgICAgICAgICAgICAgICAgdHRbal0gPSBhdl90b3VwcGVyKHRbal0pOworICAgICAgICAgICAgdHRbdGxdID0gMDsKKworICAgICAgICAgICAgbWVtY3B5KGN0LCB2LCB2bCk7CisgICAgICAgICAgICBjdFt2bF0gPSAwOworCisgICAgICAgICAgICAvKiBUaGUgZm9ybWF0IGluIHdoaWNoIHRoZSBwaWN0dXJlcyBhcmUgc3RvcmVkIGlzIHRoZSBGTEFDIGZvcm1hdC4KKyAgICAgICAgICAgICAqIFhpcGggc2F5czogIlRoZSBiaW5hcnkgRkxBQyBwaWN0dXJlIHN0cnVjdHVyZSBpcyBiYXNlNjQgZW5jb2RlZAorICAgICAgICAgICAgICogYW5kIHBsYWNlZCB3aXRoaW4gYSBWb3JiaXNDb21tZW50IHdpdGggdGhlIHRhZyBuYW1lCisgICAgICAgICAgICAgKiAnTUVUQURBVEFfQkxPQ0tfUElDVFVSRScuIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBhbmQKKyAgICAgICAgICAgICAqIHJlY29tbWVuZGVkIHdheSBvZiBlbWJlZGRpbmcgY292ZXIgYXJ0IHdpdGhpbiBWb3JiaXNDb21tZW50cy4iCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghc3RyY21wKHR0LCAiTUVUQURBVEFfQkxPQ0tfUElDVFVSRSIpICYmIHBhcnNlX3BpY3R1cmUpIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgICAgIGNoYXIgKnBpY3QgPSBhdl9tYWxsb2ModmwpOworCisgICAgICAgICAgICAgICAgaWYgKCFwaWN0KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhcywgQVZfTE9HX1dBUk5JTkcsICJvdXQtb2YtbWVtb3J5IGVycm9yLiBTa2lwcGluZyBjb3ZlciBhcnQgYmxvY2suXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnR0KTsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmN0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZfYmFzZTY0X2RlY29kZShwaWN0LCBjdCwgdmwpKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHJldCA9IGZmX2ZsYWNfcGFyc2VfcGljdHVyZShhcywgcGljdCwgcmV0KTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmdHQpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZjdCk7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnBpY3QpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhcywgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gcGFyc2UgY292ZXIgYXJ0IGJsb2NrLlxuIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9nbV9jaGFwdGVyKGFzLCB0dCwgY3QpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlcysrOworICAgICAgICAgICAgICAgIGlmIChhdl9kaWN0X2dldCgqbSwgdHQsIE5VTEwsIDApKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KG0sIHR0LCAiOyIsIEFWX0RJQ1RfQVBQRU5EKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQobSwgdHQsIGN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ESUNUX0FQUEVORCk7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwICE9IGVuZCkKKyAgICAgICAgYXZfbG9nKGFzLCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICIlIlBUUkRJRkZfU1BFQ0lGSUVSIiBieXRlcyBvZiBjb21tZW50IGhlYWRlciByZW1haW5cbiIsIGVuZCAtIHApOworICAgIGlmIChuID4gMCkKKyAgICAgICAgYXZfbG9nKGFzLCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICJ0cnVuY2F0ZWQgY29tbWVudCBoZWFkZXIsICVpIGNvbW1lbnRzIG5vdCBmb3VuZFxuIiwgbik7CisKKyAgICBmZl9tZXRhZGF0YV9jb252KG0sIE5VTEwsIGZmX3ZvcmJpc2NvbW1lbnRfbWV0YWRhdGFfY29udik7CisKKyAgICByZXR1cm4gdXBkYXRlczsKK30KKworLyoKKyAqIFBhcnNlIHRoZSB2b3JiaXMgaGVhZGVyCisgKgorICogVm9yYmlzIElkZW50aWZpY2F0aW9uIGhlYWRlciBmcm9tIFZvcmJpc19JX3NwZWMuaHRtbCN2b3JiaXMtc3BlYy1jb2RlYworICogW3ZvcmJpc192ZXJzaW9uXSA9IHJlYWQgMzIgYml0cyBhcyB1bnNpZ25lZCBpbnRlZ2VyIHwgTm90IHVzZWQKKyAqIFthdWRpb19jaGFubmVsc10gPSByZWFkIDggYml0IGludGVnZXIgYXMgdW5zaWduZWQgfCBVc2VkCisgKiBbYXVkaW9fc2FtcGxlX3JhdGVdID0gcmVhZCAzMiBiaXRzIGFzIHVuc2lnbmVkIGludGVnZXIgfCBVc2VkCisgKiBbYml0cmF0ZV9tYXhpbXVtXSA9IHJlYWQgMzIgYml0cyBhcyBzaWduZWQgaW50ZWdlciB8IE5vdCB1c2VkIHlldAorICogW2JpdHJhdGVfbm9taW5hbF0gPSByZWFkIDMyIGJpdHMgYXMgc2lnbmVkIGludGVnZXIgfCBOb3QgdXNlZCB5ZXQKKyAqIFtiaXRyYXRlX21pbmltdW1dID0gcmVhZCAzMiBiaXRzIGFzIHNpZ25lZCBpbnRlZ2VyIHwgVXNlZCBhcyBiaXRyYXRlCisgKiBbYmxvY2tzaXplXzBdID0gcmVhZCA0IGJpdHMgYXMgdW5zaWduZWQgaW50ZWdlciB8IE5vdCBVc2VkCisgKiBbYmxvY2tzaXplXzFdID0gcmVhZCA0IGJpdHMgYXMgdW5zaWduZWQgaW50ZWdlciB8IE5vdCBVc2VkCisgKiBbZnJhbWluZ19mbGFnXSA9IHJlYWQgb25lIGJpdCB8IE5vdCBVc2VkCisgKi8KKworc3RydWN0IG9nZ3ZvcmJpc19wcml2YXRlIHsKKyAgICB1bnNpZ25lZCBpbnQgbGVuWzNdOworICAgIHVuc2lnbmVkIGNoYXIgKnBhY2tldFszXTsKKyAgICBBVlZvcmJpc1BhcnNlQ29udGV4dCAqdnA7CisgICAgaW50NjRfdCBmaW5hbF9wdHM7CisgICAgaW50IGZpbmFsX2R1cmF0aW9uOworfTsKKworc3RhdGljIGludCBmaXh1cF92b3JiaXNfaGVhZGVycyhBVkZvcm1hdENvbnRleHQgKmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb2dndm9yYmlzX3ByaXZhdGUgKnByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipidWYpCit7CisgICAgaW50IGksIG9mZnNldCwgbGVuLCBlcnI7CisgICAgaW50IGJ1Zl9sZW47CisgICAgdW5zaWduZWQgY2hhciAqcHRyOworCisgICAgbGVuID0gcHJpdi0+bGVuWzBdICsgcHJpdi0+bGVuWzFdICsgcHJpdi0+bGVuWzJdOworICAgIGJ1Zl9sZW4gPSBsZW4gKyBsZW4gLyAyNTUgKyA2NDsKKyAgICBwdHIgPSAqYnVmID0gYXZfcmVhbGxvYyhOVUxMLCBidWZfbGVuKTsKKyAgICBpZiAoIXB0cikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtZW1zZXQoKmJ1ZiwgJ1wwJywgYnVmX2xlbik7CisKKyAgICBwdHJbMF0gID0gMjsKKyAgICBvZmZzZXQgID0gMTsKKyAgICBvZmZzZXQgKz0gYXZfeGlwaGxhY2luZygmcHRyW29mZnNldF0sIHByaXYtPmxlblswXSk7CisgICAgb2Zmc2V0ICs9IGF2X3hpcGhsYWNpbmcoJnB0cltvZmZzZXRdLCBwcml2LT5sZW5bMV0pOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KCZwdHJbb2Zmc2V0XSwgcHJpdi0+cGFja2V0W2ldLCBwcml2LT5sZW5baV0pOworICAgICAgICBvZmZzZXQgKz0gcHJpdi0+bGVuW2ldOworICAgICAgICBhdl9mcmVlcCgmcHJpdi0+cGFja2V0W2ldKTsKKyAgICB9CisgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcChidWYsIG9mZnNldCArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpKSA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisgICAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHZvaWQgdm9yYmlzX2NsZWFudXAoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWR4KQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisgICAgc3RydWN0IG9nZ3ZvcmJpc19wcml2YXRlICpwcml2ID0gb3MtPnByaXZhdGU7CisgICAgaW50IGk7CisgICAgaWYgKG9zLT5wcml2YXRlKSB7CisgICAgICAgIGF2X3ZvcmJpc19wYXJzZV9mcmVlKCZwcml2LT52cCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICBhdl9mcmVlcCgmcHJpdi0+cGFja2V0W2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdm9yYmlzX3VwZGF0ZV9tZXRhZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZHgpCit7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2lkeF07CisgICAgaW50IHJldDsKKworICAgIGlmIChvcy0+cHNpemUgPD0gOCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBOZXcgbWV0YWRhdGEgcGFja2V0OyByZWxlYXNlIG9sZCBkYXRhLiAqLworICAgIGF2X2RpY3RfZnJlZSgmc3QtPm1ldGFkYXRhKTsKKyAgICByZXQgPSBmZl92b3JiaXNfc3RyZWFtX2NvbW1lbnQocywgc3QsIG9zLT5idWYgKyBvcy0+cHN0YXJ0ICsgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MtPnBzaXplIC0gOCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBVcGRhdGUgdGhlIG1ldGFkYXRhIGlmIHBvc3NpYmxlLiAqLworICAgIGF2X2ZyZWVwKCZvcy0+bmV3X21ldGFkYXRhKTsKKyAgICBpZiAoc3QtPm1ldGFkYXRhKSB7CisgICAgICAgIG9zLT5uZXdfbWV0YWRhdGEgPSBhdl9wYWNrZXRfcGFja19kaWN0aW9uYXJ5KHN0LT5tZXRhZGF0YSwgJm9zLT5uZXdfbWV0YWRhdGFfc2l6ZSk7CisgICAgLyogU2VuZCBhbiBlbXB0eSBkaWN0aW9uYXJ5IHRvIGluZGljYXRlIHRoYXQgbWV0YWRhdGEgaGFzIGJlZW4gY2xlYXJlZC4gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBvcy0+bmV3X21ldGFkYXRhID0gYXZfbWFsbG9jKDEpOworICAgICAgICBvcy0+bmV3X21ldGFkYXRhX3NpemUgPSAwOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9yYmlzX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZHgpCit7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCAgICA9IHMtPnN0cmVhbXNbaWR4XTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisgICAgc3RydWN0IG9nZ3ZvcmJpc19wcml2YXRlICpwcml2OworICAgIGludCBwa3RfdHlwZSA9IG9zLT5idWZbb3MtPnBzdGFydF07CisKKyAgICBpZiAoIW9zLT5wcml2YXRlKSB7CisgICAgICAgIG9zLT5wcml2YXRlID0gYXZfbWFsbG9jeihzaXplb2Yoc3RydWN0IG9nZ3ZvcmJpc19wcml2YXRlKSk7CisgICAgICAgIGlmICghb3MtPnByaXZhdGUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHByaXYgPSBvcy0+cHJpdmF0ZTsKKworICAgIGlmICghKHBrdF90eXBlICYgMSkpCisgICAgICAgIHJldHVybiBwcml2LT52cCA/IDAgOiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKG9zLT5wc2l6ZSA8IDEgfHwgcGt0X3R5cGUgPiA1KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChwcml2LT5wYWNrZXRbcGt0X3R5cGUgPj4gMV0pCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChwa3RfdHlwZSA+IDEgJiYgIXByaXYtPnBhY2tldFswXSB8fCBwa3RfdHlwZSA+IDMgJiYgIXByaXYtPnBhY2tldFsxXSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBwcml2LT5sZW5bcGt0X3R5cGUgPj4gMV0gICAgPSBvcy0+cHNpemU7CisgICAgcHJpdi0+cGFja2V0W3BrdF90eXBlID4+IDFdID0gYXZfbWFsbG9jeihvcy0+cHNpemUpOworICAgIGlmICghcHJpdi0+cGFja2V0W3BrdF90eXBlID4+IDFdKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG1lbWNweShwcml2LT5wYWNrZXRbcGt0X3R5cGUgPj4gMV0sIG9zLT5idWYgKyBvcy0+cHN0YXJ0LCBvcy0+cHNpemUpOworICAgIGlmIChvcy0+YnVmW29zLT5wc3RhcnRdID09IDEpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcCA9IG9zLT5idWYgKyBvcy0+cHN0YXJ0ICsgNzsgLyogc2tpcCAiXDAwMXZvcmJpcyIgdGFnICovCisgICAgICAgIHVuc2lnbmVkIGJsb2Nrc2l6ZSwgYnMwLCBiczE7CisgICAgICAgIGludCBzcmF0ZTsKKyAgICAgICAgaW50IGNoYW5uZWxzOworCisgICAgICAgIGlmIChvcy0+cHNpemUgIT0gMzApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBpZiAoYnl0ZXN0cmVhbV9nZXRfbGUzMigmcCkgIT0gMCkgLyogdm9yYmlzX3ZlcnNpb24gKi8KKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGNoYW5uZWxzID0gYnl0ZXN0cmVhbV9nZXRfYnl0ZSgmcCk7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzICYmIGNoYW5uZWxzICE9IHN0LT5jb2RlYy0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDaGFubmVsIGNoYW5nZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgICAgIHNyYXRlICAgICAgICAgICAgICAgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZwKTsKKyAgICAgICAgcCArPSA0OyAvLyBza2lwIG1heGltdW0gYml0cmF0ZQorICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcCk7IC8vIG5vbWluYWwgYml0cmF0ZQorICAgICAgICBwICs9IDQ7IC8vIHNraXAgbWluaW11bSBiaXRyYXRlCisKKyAgICAgICAgYmxvY2tzaXplID0gYnl0ZXN0cmVhbV9nZXRfYnl0ZSgmcCk7CisgICAgICAgIGJzMCAgICAgICA9IGJsb2Nrc2l6ZSAmIDE1OworICAgICAgICBiczEgICAgICAgPSBibG9ja3NpemUgPj4gNDsKKworICAgICAgICBpZiAoYnMwID4gYnMxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmIChiczAgPCA2IHx8IGJzMSA+IDEzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJnApICE9IDEpIC8qIGZyYW1pbmdfZmxhZyAqLworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9WT1JCSVM7CisKKyAgICAgICAgaWYgKHNyYXRlID4gMCkgeworICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNyYXRlOworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHNyYXRlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob3MtPmJ1Zltvcy0+cHN0YXJ0XSA9PSAzKSB7CisgICAgICAgIGlmICh2b3JiaXNfdXBkYXRlX21ldGFkYXRhKHMsIGlkeCkgPj0gMCAmJiBwcml2LT5sZW5bMV0gPiAxMCkgeworICAgICAgICAgICAgdW5zaWduZWQgbmV3X2xlbjsKKworICAgICAgICAgICAgaW50IHJldCA9IGZmX3JlcGxheWdhaW5fZXhwb3J0KHN0LCBzdC0+bWV0YWRhdGEpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgLy8gZHJvcCBhbGwgbWV0YWRhdGEgd2UgcGFyc2VkIGFuZCB3aGljaCBpcyBub3QgcmVxdWlyZWQgYnkgbGlidm9yYmlzCisgICAgICAgICAgICBuZXdfbGVuID0gNyArIDQgKyBBVl9STDMyKHByaXYtPnBhY2tldFsxXSArIDcpICsgNCArIDE7CisgICAgICAgICAgICBpZiAobmV3X2xlbiA+PSAxNiAmJiBuZXdfbGVuIDwgb3MtPnBzaXplKSB7CisgICAgICAgICAgICAgICAgQVZfV0wzMihwcml2LT5wYWNrZXRbMV0gKyBuZXdfbGVuIC0gNSwgMCk7CisgICAgICAgICAgICAgICAgcHJpdi0+cGFja2V0WzFdW25ld19sZW4gLSAxXSA9IDE7CisgICAgICAgICAgICAgICAgcHJpdi0+bGVuWzFdICAgICAgICAgICAgICAgICA9IG5ld19sZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcmV0ID0gZml4dXBfdm9yYmlzX2hlYWRlcnMocywgcHJpdiwgJnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gcmV0OworCisgICAgICAgIHByaXYtPnZwID0gYXZfdm9yYmlzX3BhcnNlX2luaXQoc3QtPmNvZGVjLT5leHRyYWRhdGEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBpZiAoIXByaXYtPnZwKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdm9yYmlzX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZHgpCit7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKKyAgICBzdHJ1Y3Qgb2dndm9yYmlzX3ByaXZhdGUgKnByaXYgPSBvcy0+cHJpdmF0ZTsKKyAgICBpbnQgZHVyYXRpb24sIGZsYWdzID0gMDsKKworICAgIC8qIGZpcnN0IHBhY2tldCBoYW5kbGluZworICAgICAqIGhlcmUgd2UgcGFyc2UgdGhlIGR1cmF0aW9uIG9mIGVhY2ggcGFja2V0IGluIHRoZSBmaXJzdCBwYWdlIGFuZCBjb21wYXJlCisgICAgICogdGhlIHRvdGFsIGR1cmF0aW9uIHRvIHRoZSBwYWdlIGdyYW51bGUgdG8gZmluZCB0aGUgZW5jb2RlciBkZWxheSBhbmQKKyAgICAgKiBzZXQgdGhlIGZpcnN0IHRpbWVzdGFtcCAqLworICAgIGlmICgoIW9zLT5sYXN0cHRzIHx8IG9zLT5sYXN0cHRzID09IEFWX05PUFRTX1ZBTFVFKSAmJiAhKG9zLT5mbGFncyAmIE9HR19GTEFHX0VPUykgJiYgKGludDY0X3Qpb3MtPmdyYW51bGU+PTApIHsKKyAgICAgICAgaW50IHNlZywgZDsKKyAgICAgICAgdWludDhfdCAqbGFzdF9wa3QgID0gb3MtPmJ1ZiArIG9zLT5wc3RhcnQ7CisgICAgICAgIHVpbnQ4X3QgKm5leHRfcGt0ICA9IGxhc3RfcGt0OworCisgICAgICAgIGF2X3ZvcmJpc19wYXJzZV9yZXNldChwcml2LT52cCk7CisgICAgICAgIGR1cmF0aW9uID0gMDsKKyAgICAgICAgc2VnID0gb3MtPnNlZ3A7CisgICAgICAgIGQgPSBhdl92b3JiaXNfcGFyc2VfZnJhbWVfZmxhZ3MocHJpdi0+dnAsIGxhc3RfcGt0LCAxLCAmZmxhZ3MpOworICAgICAgICBpZiAoZCA8IDApIHsKKyAgICAgICAgICAgIG9zLT5wZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfQ09SUlVQVDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgVk9SQklTX0ZMQUdfQ09NTUVOVCkgeworICAgICAgICAgICAgdm9yYmlzX3VwZGF0ZV9tZXRhZGF0YShzLCBpZHgpOworICAgICAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICB9CisgICAgICAgIGR1cmF0aW9uICs9IGQ7CisgICAgICAgIGxhc3RfcGt0ID0gbmV4dF9wa3QgPSAgbmV4dF9wa3QgKyBvcy0+cHNpemU7CisgICAgICAgIGZvciAoOyBzZWcgPCBvcy0+bnNlZ3M7IHNlZysrKSB7CisgICAgICAgICAgICBpZiAob3MtPnNlZ21lbnRzW3NlZ10gPCAyNTUpIHsKKyAgICAgICAgICAgICAgICBpbnQgZCA9IGF2X3ZvcmJpc19wYXJzZV9mcmFtZV9mbGFncyhwcml2LT52cCwgbGFzdF9wa3QsIDEsICZmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKGQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gb3MtPmdyYW51bGU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBWT1JCSVNfRkxBR19DT01NRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIHZvcmJpc191cGRhdGVfbWV0YWRhdGEocywgaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvbiArPSBkOworICAgICAgICAgICAgICAgIGxhc3RfcGt0ICA9IG5leHRfcGt0ICsgb3MtPnNlZ21lbnRzW3NlZ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0X3BrdCArPSBvcy0+c2VnbWVudHNbc2VnXTsKKyAgICAgICAgfQorICAgICAgICBvcy0+bGFzdHB0cyAgICAgICAgICAgICAgICAgPQorICAgICAgICBvcy0+bGFzdGR0cyAgICAgICAgICAgICAgICAgPSBvcy0+Z3JhbnVsZSAtIGR1cmF0aW9uOworCisgICAgICAgIGlmICghb3MtPmdyYW51bGUgJiYgZHVyYXRpb24pIC8vaGFjayB0byBkZWFsIHdpdGggYnJva2VuIGZpbGVzIChUaWNrZXQzNzEwKQorICAgICAgICAgICAgb3MtPmxhc3RwdHMgPSBvcy0+bGFzdGR0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgICAgIGlmIChzLT5zdHJlYW1zW2lkeF0tPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIHMtPnN0cmVhbXNbaWR4XS0+c3RhcnRfdGltZSA9IEZGTUFYKG9zLT5sYXN0cHRzLCAwKTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2lkeF0tPmR1cmF0aW9uICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbaWR4XS0+ZHVyYXRpb24gLT0gcy0+c3RyZWFtc1tpZHhdLT5zdGFydF90aW1lOworICAgICAgICB9CisgICAgICAgIHByaXYtPmZpbmFsX3B0cyAgICAgICAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBhdl92b3JiaXNfcGFyc2VfcmVzZXQocHJpdi0+dnApOworICAgIH0KKworICAgIC8qIHBhcnNlIHBhY2tldCBkdXJhdGlvbiAqLworICAgIGlmIChvcy0+cHNpemUgPiAwKSB7CisgICAgICAgIGR1cmF0aW9uID0gYXZfdm9yYmlzX3BhcnNlX2ZyYW1lX2ZsYWdzKHByaXYtPnZwLCBvcy0+YnVmICsgb3MtPnBzdGFydCwgMSwgJmZsYWdzKTsKKyAgICAgICAgaWYgKGR1cmF0aW9uIDwgMCkgeworICAgICAgICAgICAgb3MtPnBmbGFncyB8PSBBVl9QS1RfRkxBR19DT1JSVVBUOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBWT1JCSVNfRkxBR19DT01NRU5UKSB7CisgICAgICAgICAgICB2b3JiaXNfdXBkYXRlX21ldGFkYXRhKHMsIGlkeCk7CisgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgb3MtPnBkdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIH0KKworICAgIC8qIGZpbmFsIHBhY2tldCBoYW5kbGluZworICAgICAqIGhlcmUgd2Ugc2F2ZSB0aGUgcHRzIG9mIHRoZSBmaXJzdCBwYWNrZXQgaW4gdGhlIGZpbmFsIHBhZ2UsIHN1bSB1cCBhbGwKKyAgICAgKiBwYWNrZXQgZHVyYXRpb25zIGluIHRoZSBmaW5hbCBwYWdlIGV4Y2VwdCBmb3IgdGhlIGxhc3Qgb25lLCBhbmQgY29tcGFyZQorICAgICAqIHRvIHRoZSBwYWdlIGdyYW51bGUgdG8gZmluZCB0aGUgZHVyYXRpb24gb2YgdGhlIGZpbmFsIHBhY2tldCAqLworICAgIGlmIChvcy0+ZmxhZ3MgJiBPR0dfRkxBR19FT1MpIHsKKyAgICAgICAgaWYgKG9zLT5sYXN0cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBwcml2LT5maW5hbF9wdHMgICAgICA9IG9zLT5sYXN0cHRzOworICAgICAgICAgICAgcHJpdi0+ZmluYWxfZHVyYXRpb24gPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChvcy0+c2VncCA9PSBvcy0+bnNlZ3MpCisgICAgICAgICAgICBvcy0+cGR1cmF0aW9uID0gb3MtPmdyYW51bGUgLSBwcml2LT5maW5hbF9wdHMgLSBwcml2LT5maW5hbF9kdXJhdGlvbjsKKyAgICAgICAgcHJpdi0+ZmluYWxfZHVyYXRpb24gKz0gb3MtPnBkdXJhdGlvbjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl92b3JiaXNfY29kZWMgPSB7CisgICAgLm1hZ2ljICAgICA9ICJcMDAxdm9yYmlzIiwKKyAgICAubWFnaWNzaXplID0gNywKKyAgICAuaGVhZGVyICAgID0gdm9yYmlzX2hlYWRlciwKKyAgICAucGFja2V0ICAgID0gdm9yYmlzX3BhY2tldCwKKyAgICAuY2xlYW51cCAgID0gdm9yYmlzX2NsZWFudXAsCisgICAgLm5iX2hlYWRlciA9IDMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ3BhcnNldnA4LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvb2dncGFyc2V2cDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTU5ZDMyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29nZ3BhcnNldnA4LmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBPbjIgVlA4IHBhcnNlciBmb3IgT2dnCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSmFtZXMgQWxtZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAib2dnZGVjLmgiCisKKyNkZWZpbmUgVlA4X0hFQURFUl9TSVpFIDI2CisKK3N0YXRpYyBpbnQgdnA4X2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZHgpCit7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKKyAgICB1aW50OF90ICpwID0gb3MtPmJ1ZiArIG9zLT5wc3RhcnQ7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpZHhdOworICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOworCisgICAgaWYgKG9zLT5wc2l6ZSA8IDcgfHwgcFswXSAhPSAweDRmKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaCAocFs1XSl7CisgICAgY2FzZSAweDAxOgorICAgICAgICBpZiAob3MtPnBzaXplIDwgVlA4X0hFQURFUl9TSVpFKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBPZ2dWUDggaGVhZGVyIHBhY2tldCIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFs2XSAhPSAxKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIE9nZ1ZQOCB2ZXJzaW9uICVkLiVkXG4iLCBwWzZdLCBwWzddKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgICAgICAgID0gQVZfUkIxNihwICsgIDgpOworICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgICAgICAgPSBBVl9SQjE2KHAgKyAxMCk7CisgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA9IEFWX1JCMjQocCArIDEyKTsKKyAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gQVZfUkIyNChwICsgMTUpOworICAgICAgICBmcmFtZXJhdGUuZGVuICAgICAgICAgICAgICAgPSBBVl9SQjMyKHAgKyAxOCk7CisgICAgICAgIGZyYW1lcmF0ZS5udW0gICAgICAgICAgICAgICA9IEFWX1JCMzIocCArIDIyKTsKKworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgZnJhbWVyYXRlLm51bSwgZnJhbWVyYXRlLmRlbik7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVlA4OworICAgICAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDI6CisgICAgICAgIGlmIChwWzZdICE9IDB4MjApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZmZfdm9yYmlzX3N0cmVhbV9jb21tZW50KHMsIHN0LCBwICsgNywgb3MtPnBzaXplIC0gNyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmtub3duIFZQOCBoZWFkZXIgdHlwZSAweCUwMlhcbiIsIHBbNV0pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHVpbnQ2NF90IHZwOF9ncHRvcHRzKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGlkeCwgdWludDY0X3QgZ3JhbnVsZSwgaW50NjRfdCAqZHRzKQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisKKyAgICB1aW50NjRfdCBwdHMgID0gKGdyYW51bGUgPj4gMzIpOworICAgIHVpbnQzMl90IGRpc3QgPSAoZ3JhbnVsZSA+PiAgMykgJiAweDA3ZmZmZmZmOworCisgICAgaWYgKCFkaXN0KQorICAgICAgICBvcy0+cGZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKworICAgIGlmIChkdHMpCisgICAgICAgICpkdHMgPSBwdHM7CisKKyAgICByZXR1cm4gcHRzOworfQorCitzdGF0aWMgaW50IHZwOF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWR4KQoreworICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisgICAgdWludDhfdCAqcCA9IG9zLT5idWYgKyBvcy0+cHN0YXJ0OworCisgICAgaWYgKCghb3MtPmxhc3RwdHMgfHwgb3MtPmxhc3RwdHMgPT0gQVZfTk9QVFNfVkFMVUUpICYmICEob3MtPmZsYWdzICYgT0dHX0ZMQUdfRU9TKSkgeworICAgICAgICBpbnQgc2VnOworICAgICAgICBpbnQgZHVyYXRpb247CisgICAgICAgIHVpbnQ4X3QgKmxhc3RfcGt0ID0gcDsKKyAgICAgICAgdWludDhfdCAqbmV4dF9wa3Q7CisKKyAgICAgICAgc2VnID0gb3MtPnNlZ3A7CisgICAgICAgIGR1cmF0aW9uID0gKGxhc3RfcGt0WzBdID4+IDQpICYgMTsKKyAgICAgICAgbmV4dF9wa3QgPSBsYXN0X3BrdCArPSBvcy0+cHNpemU7CisgICAgICAgIGZvciAoOyBzZWcgPCBvcy0+bnNlZ3M7IHNlZysrKSB7CisgICAgICAgICAgICBpZiAob3MtPnNlZ21lbnRzW3NlZ10gPCAyNTUpIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiArPSAobGFzdF9wa3RbMF0gPj4gNCkgJiAxOworICAgICAgICAgICAgICAgIGxhc3RfcGt0ICA9IG5leHRfcGt0ICsgb3MtPnNlZ21lbnRzW3NlZ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0X3BrdCArPSBvcy0+c2VnbWVudHNbc2VnXTsKKyAgICAgICAgfQorICAgICAgICBvcy0+bGFzdHB0cyA9IG9zLT5sYXN0ZHRzID0gdnA4X2dwdG9wdHMocywgaWR4LCBvcy0+Z3JhbnVsZSwgTlVMTCkgLSBkdXJhdGlvbjsKKyAgICAgICAgaWYocy0+c3RyZWFtc1tpZHhdLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBzLT5zdHJlYW1zW2lkeF0tPnN0YXJ0X3RpbWUgPSBvcy0+bGFzdHB0czsKKyAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2lkeF0tPmR1cmF0aW9uKQorICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbaWR4XS0+ZHVyYXRpb24gLT0gcy0+c3RyZWFtc1tpZHhdLT5zdGFydF90aW1lOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9zLT5wc2l6ZSA+IDApCisgICAgICAgIG9zLT5wZHVyYXRpb24gPSAocFswXSA+PiA0KSAmIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl92cDhfY29kZWMgPSB7CisgICAgLm1hZ2ljICAgICA9ICJPVlA4MCIsCisgICAgLm1hZ2ljc2l6ZSA9IDUsCisgICAgLmhlYWRlciAgICA9IHZwOF9oZWFkZXIsCisgICAgLnBhY2tldCAgICA9IHZwOF9wYWNrZXQsCisgICAgLmdwdG9wdHMgICA9IHZwOF9ncHRvcHRzLAorICAgIC5uYl9oZWFkZXIgPSAxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9vbWEuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzAyODY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29tYS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBTb255IE9wZW5NRyAoT01BKSBjb21tb24gZGF0YQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvbWEuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKworY29uc3QgdWludDE2X3QgZmZfb21hX3NyYXRlX3RhYls4XSA9IHsgMzIwLCA0NDEsIDQ4MCwgODgyLCA5NjAsIDAgfTsKKworY29uc3QgQVZDb2RlY1RhZyBmZl9vbWFfY29kZWNfdGFnc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfQVRSQUMzLCAgICAgIE9NQV9DT0RFQ0lEX0FUUkFDMyAgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FUUkFDM1AsICAgICBPTUFfQ09ERUNJRF9BVFJBQzNQIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUDMsICAgICAgICAgT01BX0NPREVDSURfTVAzICAgICB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MxNkJFLCAgIE9NQV9DT0RFQ0lEX0xQQ00gICAgfSwKKyAgICB7IDAgfSwKK307CisKKy8qKiBtYXAgQVRSQUMtWCBjaGFubmVsIGlkIHRvIGludGVybmFsIGNoYW5uZWwgbGF5b3V0ICovCitjb25zdCB1aW50NjRfdCBmZl9vbWFfY2hpZF90b19uYXRpdmVfbGF5b3V0WzddID0geworICAgIEFWX0NIX0xBWU9VVF9NT05PLAorICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgQVZfQ0hfTEFZT1VUX1NVUlJPVU5ELAorICAgIEFWX0NIX0xBWU9VVF80UE9JTlQwLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0ssCisgICAgQVZfQ0hfTEFZT1VUXzZQT0lOVDFfQkFDSywKKyAgICBBVl9DSF9MQVlPVVRfN1BPSU5UMQorfTsKKworLyoqIG1hcCBBVFJBQy1YIGNoYW5uZWwgaWQgdG8gdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzICovCitjb25zdCBpbnQgZmZfb21hX2NoaWRfdG9fbnVtX2NoYW5uZWxzWzddID0gezEsIDIsIDMsIDQsIDYsIDcsIDh9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L29tYS5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29tYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTE4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvb21hLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIFNvbnkgT3Blbk1HIChPTUEpIGNvbW1vbiBkYXRhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfT01BX0gKKyNkZWZpbmUgQVZGT1JNQVRfT01BX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBFQTNfSEVBREVSX1NJWkUgOTYKKyNkZWZpbmUgSUQzdjJfRUEzX01BR0lDICJlYTMiCisjZGVmaW5lIE9NQV9FTkNfSEVBREVSX1NJWkUgMTYKKworZW51bSB7CisgICAgT01BX0NPREVDSURfQVRSQUMzICA9IDAsCisgICAgT01BX0NPREVDSURfQVRSQUMzUCA9IDEsCisgICAgT01BX0NPREVDSURfTVAzICAgICA9IDMsCisgICAgT01BX0NPREVDSURfTFBDTSAgICA9IDQsCisgICAgT01BX0NPREVDSURfV01BICAgICA9IDUsCit9OworCitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfb21hX3NyYXRlX3RhYls4XTsKKworZXh0ZXJuIGNvbnN0IEFWQ29kZWNUYWcgZmZfb21hX2NvZGVjX3RhZ3NbXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX29tYV9jaGlkX3RvX25hdGl2ZV9sYXlvdXRbN107CitleHRlcm4gY29uc3QgaW50IGZmX29tYV9jaGlkX3RvX251bV9jaGFubmVsc1s3XTsKKworI2VuZGlmIC8qIEFWRk9STUFUX09NQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvb21hZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvb21hZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzZDNhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vbWFkZWMuYwpAQCAtMCwwICsxLDUwMCBAQAorLyoKKyAqIFNvbnkgT3Blbk1HIChPTUEpIGRlbXV4ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTMgTWF4aW0gUG9saWFrb3Zza2kKKyAqICAgICAgICAgICAgICAgMjAwOCBCZW5qYW1pbiBMYXJzc29uCisgKiAgICAgICAgICAgICAgIDIwMTEgRGF2aWQgR29sZHdpY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVGhpcyBpcyBhIGRlbXV4ZXIgZm9yIFNvbnkgT3Blbk1HIE11c2ljIGZpbGVzCisgKgorICogS25vd24gZmlsZSBleHRlbnNpb25zOiAiLm9tYSIsICJhYTMiCisgKiBUaGUgZm9ybWF0IG9mIHN1Y2ggZmlsZXMgY29uc2lzdHMgb2YgdGhyZWUgcGFydHM6CisgKiAtICJlYTMiIGhlYWRlciBjYXJyeWluZyBvdmVyYWxsIGluZm8gYW5kIG1ldGFkYXRhLiBFeGNlcHQgZm9yIHN0YXJ0aW5nIHdpdGgKKyAqICAgImVhIiBpbnN0ZWFkIG9mICJJRCIsIGl0J3MgYW4gSUQzdjIgaGVhZGVyLgorICogLSAiRUEzIiBoZWFkZXIgaXMgYSBTb255LXNwZWNpZmljIGhlYWRlciBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0CisgKiAgIHRoZSBPcGVuTUcgZmlsZTogY29kZWMgdHlwZSAodXN1YWxseSBBVFJBQywgY2FuIGFsc28gYmUgTVAzIG9yIFdNQSksCisgKiAgIGNvZGVjIHNwZWNpZmljIGluZm8gKHBhY2tldCBzaXplLCBzYW1wbGUgcmF0ZSwgY2hhbm5lbHMgYW5kIHNvIG9uKQorICogICBhbmQgRFJNIHJlbGF0ZWQgaW5mbyAoZmlsZSBlbmNyeXB0aW9uLCBjb250ZW50IGlkKS4KKyAqIC0gU291bmQgZGF0YSBvcmdhbml6ZWQgaW4gcGFja2V0cyBmb2xsb3cgdGhlIEVBMyBoZWFkZXIKKyAqICAgKGNhbiBiZSBlbmNyeXB0ZWQgdXNpbmcgdGhlIFNvbnkgRFJNISkuCisgKgorICogU3VwcG9ydGVkIGRlY29kZXJzOiBBVFJBQzMsIEFUUkFDMyssIE1QMywgTFBDTQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGVzLmgiCisjaW5jbHVkZSAib21hLmgiCisjaW5jbHVkZSAicGNtLmgiCisjaW5jbHVkZSAiaWQzdjIuaCIKKworCitzdGF0aWMgY29uc3QgdWludDY0X3QgbGVhZl90YWJsZVtdID0geworICAgIDB4ZDc5ZTgyODNhY2VhNDYyMCwgMHg3YTk3NjJmNDQ1YWZkMGQ4LAorICAgIDB4MzU0ZDYwYTYwYjhjNzlmMSwgMHg1ODRlMWNkZTAwYjA3YWVlLAorICAgIDB4MTU3M2NkOTNkYTdkZjYyMywgMHg0N2Y5OGQ3OTYyMGRkNTM1Cit9OworCit0eXBlZGVmIHN0cnVjdCBPTUFDb250ZXh0IHsKKyAgICB1aW50NjRfdCBjb250ZW50X3N0YXJ0OworICAgIGludCBlbmNyeXB0ZWQ7CisgICAgdWludDE2X3Qga19zaXplOworICAgIHVpbnQxNl90IGVfc2l6ZTsKKyAgICB1aW50MTZfdCBpX3NpemU7CisgICAgdWludDE2X3Qgc19zaXplOworICAgIHVpbnQzMl90IHJpZDsKKyAgICB1aW50OF90IHJfdmFsWzI0XTsKKyAgICB1aW50OF90IG5fdmFsWzI0XTsKKyAgICB1aW50OF90IG1fdmFsWzhdOworICAgIHVpbnQ4X3Qgc192YWxbOF07CisgICAgdWludDhfdCBzbV92YWxbOF07CisgICAgdWludDhfdCBlX3ZhbFs4XTsKKyAgICB1aW50OF90IGl2WzhdOworICAgIHN0cnVjdCBBVkRFUyBhdl9kZXM7Cit9IE9NQUNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIGhleF9sb2coQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHVpbnQ4X3QgKnZhbHVlLCBpbnQgbGVuKQoreworICAgIGNoYXIgYnVmWzMzXTsKKyAgICBsZW4gPSBGRk1JTihsZW4sIDE2KTsKKyAgICBpZiAoYXZfbG9nX2dldF9sZXZlbCgpIDwgbGV2ZWwpCisgICAgICAgIHJldHVybjsKKyAgICBmZl9kYXRhX3RvX2hleChidWYsIHZhbHVlLCBsZW4sIDEpOworICAgIGJ1ZltsZW4gPDwgMV0gPSAnXDAnOworICAgIGF2X2xvZyhzLCBsZXZlbCwgIiVzOiAlc1xuIiwgbmFtZSwgYnVmKTsKK30KKworc3RhdGljIGludCBrc2V0KEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgdWludDhfdCAqcl92YWwsIGNvbnN0IHVpbnQ4X3QgKm5fdmFsLAorICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgT01BQ29udGV4dCAqb2MgPSBzLT5wcml2X2RhdGE7CisKKyAgICBpZiAoIXJfdmFsICYmICFuX3ZhbCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgbGVuID0gRkZNSU4obGVuLCAxNik7CisKKyAgICAvKiB1c2UgZmlyc3QgNjQgYml0cyBpbiB0aGUgdGhpcmQgcm91bmQgYWdhaW4gKi8KKyAgICBpZiAocl92YWwpIHsKKyAgICAgICAgaWYgKHJfdmFsICE9IG9jLT5yX3ZhbCkgeworICAgICAgICAgICAgbWVtc2V0KG9jLT5yX3ZhbCwgMCwgMjQpOworICAgICAgICAgICAgbWVtY3B5KG9jLT5yX3ZhbCwgcl92YWwsIGxlbik7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KCZvYy0+cl92YWxbMTZdLCByX3ZhbCwgOCk7CisgICAgfQorICAgIGlmIChuX3ZhbCkgeworICAgICAgICBpZiAobl92YWwgIT0gb2MtPm5fdmFsKSB7CisgICAgICAgICAgICBtZW1zZXQob2MtPm5fdmFsLCAwLCAyNCk7CisgICAgICAgICAgICBtZW1jcHkob2MtPm5fdmFsLCBuX3ZhbCwgbGVuKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoJm9jLT5uX3ZhbFsxNl0sIG5fdmFsLCA4KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPTUFfUlBST0JFX01fVkFMIDQ4ICsgMQorCitzdGF0aWMgaW50IHJwcm9iZShBVkZvcm1hdENvbnRleHQgKnMsIHVpbnQ4X3QgKmVuY19oZWFkZXIsIHVuc2lnbmVkIHNpemUsCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyX3ZhbCkKK3sKKyAgICBPTUFDb250ZXh0ICpvYyA9IHMtPnByaXZfZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgcG9zOworICAgIHN0cnVjdCBBVkRFUyBhdl9kZXM7CisKKyAgICBpZiAoIWVuY19oZWFkZXIgfHwgIXJfdmFsIHx8CisgICAgICAgIHNpemUgPCBPTUFfRU5DX0hFQURFUl9TSVpFICsgb2MtPmtfc2l6ZSArIG9jLT5lX3NpemUgKyBvYy0+aV9zaXplIHx8CisgICAgICAgIHNpemUgPCBPTUFfUlBST0JFX01fVkFMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBtX3ZhbCAqLworICAgIGF2X2Rlc19pbml0KCZhdl9kZXMsIHJfdmFsLCAxOTIsIDEpOworICAgIGF2X2Rlc19jcnlwdCgmYXZfZGVzLCBvYy0+bV92YWwsICZlbmNfaGVhZGVyWzQ4XSwgMSwgTlVMTCwgMSk7CisKKyAgICAvKiBzX3ZhbCAqLworICAgIGF2X2Rlc19pbml0KCZhdl9kZXMsIG9jLT5tX3ZhbCwgNjQsIDApOworICAgIGF2X2Rlc19jcnlwdCgmYXZfZGVzLCBvYy0+c192YWwsIE5VTEwsIDEsIE5VTEwsIDApOworCisgICAgLyogc21fdmFsICovCisgICAgcG9zID0gT01BX0VOQ19IRUFERVJfU0laRSArIG9jLT5rX3NpemUgKyBvYy0+ZV9zaXplOworICAgIGF2X2Rlc19pbml0KCZhdl9kZXMsIG9jLT5zX3ZhbCwgNjQsIDApOworICAgIGF2X2Rlc19tYWMoJmF2X2Rlcywgb2MtPnNtX3ZhbCwgJmVuY19oZWFkZXJbcG9zXSwgKG9jLT5pX3NpemUgPj4gMykpOworCisgICAgcG9zICs9IG9jLT5pX3NpemU7CisKKyAgICByZXR1cm4gbWVtY21wKCZlbmNfaGVhZGVyW3Bvc10sIG9jLT5zbV92YWwsIDgpID8gLTEgOiAwOworfQorCitzdGF0aWMgaW50IG5wcm9iZShBVkZvcm1hdENvbnRleHQgKnMsIHVpbnQ4X3QgKmVuY19oZWFkZXIsIHVuc2lnbmVkIHNpemUsCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpuX3ZhbCkKK3sKKyAgICBPTUFDb250ZXh0ICpvYyA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50NjRfdCBwb3M7CisgICAgdWludDMyX3QgdGFnbGVuLCBkYXRhbGVuOworICAgIHN0cnVjdCBBVkRFUyBhdl9kZXM7CisKKyAgICBpZiAoIWVuY19oZWFkZXIgfHwgIW5fdmFsIHx8CisgICAgICAgIHNpemUgPCBPTUFfRU5DX0hFQURFUl9TSVpFICsgb2MtPmtfc2l6ZSArIDQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHBvcyA9IE9NQV9FTkNfSEVBREVSX1NJWkUgKyBvYy0+a19zaXplOworICAgIGlmICghbWVtY21wKCZlbmNfaGVhZGVyW3Bvc10sICJFS0IgIiwgNCkpCisgICAgICAgIHBvcyArPSAzMjsKKworICAgIGlmIChzaXplIDwgcG9zICsgNDQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChBVl9SQjMyKCZlbmNfaGVhZGVyW3Bvc10pICE9IG9jLT5yaWQpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJNaXNtYXRjaGluZyBSSURcbiIpOworCisgICAgdGFnbGVuICA9IEFWX1JCMzIoJmVuY19oZWFkZXJbcG9zICsgMzJdKTsKKyAgICBkYXRhbGVuID0gQVZfUkIzMigmZW5jX2hlYWRlcltwb3MgKyAzNl0pID4+IDQ7CisKKyAgICBwb3MgKz0gNDRMICsgdGFnbGVuOworCisgICAgaWYgKHBvcyArICgoKHVpbnQ2NF90KWRhdGFsZW4pIDw8IDQpID4gc2l6ZSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYXZfZGVzX2luaXQoJmF2X2Rlcywgbl92YWwsIDE5MiwgMSk7CisgICAgd2hpbGUgKGRhdGFsZW4tLSA+IDApIHsKKyAgICAgICAgYXZfZGVzX2NyeXB0KCZhdl9kZXMsIG9jLT5yX3ZhbCwgJmVuY19oZWFkZXJbcG9zXSwgMiwgTlVMTCwgMSk7CisgICAgICAgIGtzZXQocywgb2MtPnJfdmFsLCBOVUxMLCAxNik7CisgICAgICAgIGlmICghcnByb2JlKHMsIGVuY19oZWFkZXIsIHNpemUsIG9jLT5yX3ZhbCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcG9zICs9IDE2OworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBkZWNyeXB0X2luaXQoQVZGb3JtYXRDb250ZXh0ICpzLCBJRDN2MkV4dHJhTWV0YSAqZW0sIHVpbnQ4X3QgKmhlYWRlcikKK3sKKyAgICBPTUFDb250ZXh0ICpvYyA9IHMtPnByaXZfZGF0YTsKKyAgICBJRDN2MkV4dHJhTWV0YUdFT0IgKmdlb2IgPSBOVUxMOworICAgIHVpbnQ4X3QgKmdkYXRhOworCisgICAgb2MtPmVuY3J5cHRlZCA9IDE7CisgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiRmlsZSBpcyBlbmNyeXB0ZWRcbiIpOworCisgICAgLyogZmluZCBHRU9CIG1ldGFkYXRhICovCisgICAgd2hpbGUgKGVtKSB7CisgICAgICAgIGlmICghc3RyY21wKGVtLT50YWcsICJHRU9CIikgJiYKKyAgICAgICAgICAgIChnZW9iID0gZW0tPmRhdGEpICYmCisgICAgICAgICAgICAoIXN0cmNtcChnZW9iLT5kZXNjcmlwdGlvbiwgIk9NR19MU0kiKSB8fAorICAgICAgICAgICAgICFzdHJjbXAoZ2VvYi0+ZGVzY3JpcHRpb24sICJPTUdfQktMU0kiKSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVtID0gZW0tPm5leHQ7CisgICAgfQorICAgIGlmICghZW0pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vIGVuY3J5cHRpb24gaGVhZGVyIGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGdlb2ItPmRhdGFzaXplIDwgNjQpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIEdFT0IgZGF0YSBzaXplOiAlIlBSSXUzMiJcbiIsIGdlb2ItPmRhdGFzaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZ2RhdGEgPSBnZW9iLT5kYXRhOworCisgICAgaWYgKEFWX1JCMTYoZ2RhdGEpICE9IDEpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVua25vd24gdmVyc2lvbiBpbiBlbmNyeXB0aW9uIGhlYWRlclxuIik7CisKKyAgICBvYy0+a19zaXplID0gQVZfUkIxNigmZ2RhdGFbMl0pOworICAgIG9jLT5lX3NpemUgPSBBVl9SQjE2KCZnZGF0YVs0XSk7CisgICAgb2MtPmlfc2l6ZSA9IEFWX1JCMTYoJmdkYXRhWzZdKTsKKyAgICBvYy0+c19zaXplID0gQVZfUkIxNigmZ2RhdGFbOF0pOworCisgICAgaWYgKG1lbWNtcCgmZ2RhdGFbT01BX0VOQ19IRUFERVJfU0laRV0sICJLRVlSSU5HICAgICAiLCAxMikpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZW5jcnlwdGlvbiBoZWFkZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKE9NQV9FTkNfSEVBREVSX1NJWkUgKyBvYy0+a19zaXplICsgb2MtPmVfc2l6ZSArIG9jLT5pX3NpemUgKyA4ID4gZ2VvYi0+ZGF0YXNpemUgfHwKKyAgICAgICAgT01BX0VOQ19IRUFERVJfU0laRSArIDQ4ID4gZ2VvYi0+ZGF0YXNpemUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlRvbyBsaXR0bGUgR0VPQiBkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIG9jLT5yaWQgPSBBVl9SQjMyKCZnZGF0YVtPTUFfRU5DX0hFQURFUl9TSVpFICsgMjhdKTsKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiUklEOiAlLjgiUFJJeDMyIlxuIiwgb2MtPnJpZCk7CisKKyAgICBtZW1jcHkob2MtPml2LCAmaGVhZGVyWzB4NThdLCA4KTsKKyAgICBoZXhfbG9nKHMsIEFWX0xPR19ERUJVRywgIklWIiwgb2MtPml2LCA4KTsKKworICAgIGhleF9sb2cocywgQVZfTE9HX0RFQlVHLCAiQ0JDLU1BQyIsCisgICAgICAgICAgICAmZ2RhdGFbT01BX0VOQ19IRUFERVJfU0laRSArIG9jLT5rX3NpemUgKyBvYy0+ZV9zaXplICsgb2MtPmlfc2l6ZV0sCisgICAgICAgICAgICA4KTsKKworICAgIGlmIChzLT5rZXlsZW4gPiAwKSB7CisgICAgICAgIGtzZXQocywgcy0+a2V5LCBzLT5rZXksIHMtPmtleWxlbik7CisgICAgfQorICAgIGlmICghbWVtY21wKG9jLT5yX3ZhbCwgKGNvbnN0IHVpbnQ4X3RbOF0pezB9LCA4KSB8fAorICAgICAgICBycHJvYmUocywgZ2RhdGEsIGdlb2ItPmRhdGFzaXplLCBvYy0+cl92YWwpIDwgMCAmJgorICAgICAgICBucHJvYmUocywgZ2RhdGEsIGdlb2ItPmRhdGFzaXplLCBvYy0+bl92YWwpIDwgMCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGxlYWZfdGFibGUpOyBpICs9IDIpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgYnVmWzE2XTsKKyAgICAgICAgICAgIEFWX1dMNjQoYnVmLCAgICAgbGVhZl90YWJsZVtpXSk7CisgICAgICAgICAgICBBVl9XTDY0KCZidWZbOF0sIGxlYWZfdGFibGVbaSArIDFdKTsKKyAgICAgICAgICAgIGtzZXQocywgYnVmLCBidWYsIDE2KTsKKyAgICAgICAgICAgIGlmICghcnByb2JlKHMsIGdkYXRhLCBnZW9iLT5kYXRhc2l6ZSwgb2MtPnJfdmFsKSB8fAorICAgICAgICAgICAgICAgICFucHJvYmUocywgZ2RhdGEsIGdlb2ItPmRhdGFzaXplLCBvYy0+bl92YWwpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpID49IEZGX0FSUkFZX0VMRU1TKGxlYWZfdGFibGUpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBrZXlcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBlX3ZhbCAqLworICAgIGF2X2Rlc19pbml0KCZvYy0+YXZfZGVzLCBvYy0+bV92YWwsIDY0LCAwKTsKKyAgICBhdl9kZXNfY3J5cHQoJm9jLT5hdl9kZXMsIG9jLT5lX3ZhbCwKKyAgICAgICAgICAgICAgICAgJmdkYXRhW09NQV9FTkNfSEVBREVSX1NJWkUgKyA0MF0sIDEsIE5VTEwsIDApOworICAgIGhleF9sb2cocywgQVZfTE9HX0RFQlVHLCAiRUsiLCBvYy0+ZV92YWwsIDgpOworCisgICAgLyogaW5pdCBlX3ZhbCAqLworICAgIGF2X2Rlc19pbml0KCZvYy0+YXZfZGVzLCBvYy0+ZV92YWwsIDY0LCAxKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50ICAgICByZXQsIGZyYW1lc2l6ZSwganNmbGFnLCBzYW1wbGVyYXRlOworICAgIHVpbnQzMl90IGNvZGVjX3BhcmFtcywgY2hhbm5lbF9pZDsKKyAgICBpbnQxNl90IGVpZDsKKyAgICB1aW50OF90IGJ1ZltFQTNfSEVBREVSX1NJWkVdOworICAgIHVpbnQ4X3QgKmVkYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBJRDN2MkV4dHJhTWV0YSAqZXh0cmFfbWV0YSA9IE5VTEw7CisgICAgT01BQ29udGV4dCAqb2MgPSBzLT5wcml2X2RhdGE7CisKKyAgICBmZl9pZDN2Ml9yZWFkKHMsIElEM3YyX0VBM19NQUdJQywgJmV4dHJhX21ldGEsIDApOworICAgIHJldCA9IGF2aW9fcmVhZChzLT5wYiwgYnVmLCBFQTNfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgPCBFQTNfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChtZW1jbXAoYnVmLCAoKGNvbnN0IHVpbnQ4X3RbXSl7J0UnLCAnQScsICczJ30pLCAzKSB8fAorICAgICAgICBidWZbNF0gIT0gMCB8fCBidWZbNV0gIT0gRUEzX0hFQURFUl9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZG4ndCBmaW5kIHRoZSBFQTMgaGVhZGVyICFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBvYy0+Y29udGVudF9zdGFydCA9IGF2aW9fdGVsbChzLT5wYik7CisKKyAgICAvKiBlbmNyeXB0ZWQgZmlsZSAqLworICAgIGVpZCA9IEFWX1JCMTYoJmJ1Zls2XSk7CisgICAgaWYgKGVpZCAhPSAtMSAmJiBlaWQgIT0gLTEyOCAmJiBkZWNyeXB0X2luaXQocywgZXh0cmFfbWV0YSwgYnVmKSA8IDApIHsKKyAgICAgICAgZmZfaWQzdjJfZnJlZV9leHRyYV9tZXRhKCZleHRyYV9tZXRhKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZmX2lkM3YyX2ZyZWVfZXh0cmFfbWV0YSgmZXh0cmFfbWV0YSk7CisKKyAgICBjb2RlY19wYXJhbXMgPSBBVl9SQjI0KCZidWZbMzNdKTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSBidWZbMzJdOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9vbWFfY29kZWNfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcpOworCisgICAgc3dpdGNoIChidWZbMzJdKSB7CisgICAgY2FzZSBPTUFfQ09ERUNJRF9BVFJBQzM6CisgICAgICAgIHNhbXBsZXJhdGUgPSBmZl9vbWFfc3JhdGVfdGFiWyhjb2RlY19wYXJhbXMgPj4gMTMpICYgN10gKiAxMDA7CisgICAgICAgIGlmICghc2FtcGxlcmF0ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChzYW1wbGVyYXRlICE9IDQ0MTAwKQorICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJTYW1wbGUgcmF0ZSAlZCIsIHNhbXBsZXJhdGUpOworCisgICAgICAgIGZyYW1lc2l6ZSA9IChjb2RlY19wYXJhbXMgJiAweDNGRikgKiA4OworCisgICAgICAgIC8qIGdldCBzdGVyZW8gY29kaW5nIG1vZGUsIDEgZm9yIGpvaW50LXN0ZXJlbyAqLworICAgICAgICBqc2ZsYWcgPSAoY29kZWNfcGFyYW1zID4+IDE3KSAmIDE7CisKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IDI7CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlcmF0ZTsKKyAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSAgICA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiBmcmFtZXNpemUgKiA4IC8gMTAyNDsKKworICAgICAgICAvKiBmYWtlIHRoZSBBVFJBQzMgZXh0cmFkYXRhCisgICAgICAgICAqICh3YXYgZm9ybWF0LCBtYWtlcyBzdHJlYW0gY29weSB0byB3YXYgd29yaykgKi8KKyAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIDE0KSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgZWRhdGEgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YTsKKyAgICAgICAgQVZfV0wxNigmZWRhdGFbMF0sICAxKTsgICAgICAgICAgICAgLy8gYWx3YXlzIDEKKyAgICAgICAgQVZfV0wzMigmZWRhdGFbMl0sICBzYW1wbGVyYXRlKTsgICAgLy8gc2FtcGxlcyByYXRlCisgICAgICAgIEFWX1dMMTYoJmVkYXRhWzZdLCAganNmbGFnKTsgICAgICAgIC8vIGNvZGluZyBtb2RlCisgICAgICAgIEFWX1dMMTYoJmVkYXRhWzhdLCAganNmbGFnKTsgICAgICAgIC8vIGNvZGluZyBtb2RlCisgICAgICAgIEFWX1dMMTYoJmVkYXRhWzEwXSwgMSk7ICAgICAgICAgICAgIC8vIGFsd2F5cyAxCisgICAgICAgIC8vIEFWX1dMMTYoJmVkYXRhWzEyXSwgMCk7ICAgICAgICAgIC8vIGFsd2F5cyAwCisKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NQV9DT0RFQ0lEX0FUUkFDM1A6CisgICAgICAgIGNoYW5uZWxfaWQgPSAoY29kZWNfcGFyYW1zID4+IDEwKSAmIDc7CisgICAgICAgIGlmICghY2hhbm5lbF9pZCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBBVFJBQy1YIGNoYW5uZWwgaWQ6ICUiUFJJdTMyIlxuIiwgY2hhbm5lbF9pZCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gZmZfb21hX2NoaWRfdG9fbmF0aXZlX2xheW91dFtjaGFubmVsX2lkIC0gMV07CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSBmZl9vbWFfY2hpZF90b19udW1fY2hhbm5lbHNbY2hhbm5lbF9pZCAtIDFdOworICAgICAgICBmcmFtZXNpemUgPSAoKGNvZGVjX3BhcmFtcyAmIDB4M0ZGKSAqIDgpICsgODsKKyAgICAgICAgc2FtcGxlcmF0ZSA9IGZmX29tYV9zcmF0ZV90YWJbKGNvZGVjX3BhcmFtcyA+PiAxMykgJiA3XSAqIDEwMDsKKyAgICAgICAgaWYgKCFzYW1wbGVyYXRlKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZXJhdGU7CisgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICAgPSBzYW1wbGVyYXRlICogZnJhbWVzaXplICogOCAvIDIwNDg7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzYW1wbGVyYXRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTUFfQ09ERUNJRF9NUDM6CisgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVzsKKyAgICAgICAgZnJhbWVzaXplID0gMTAyNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTUFfQ09ERUNJRF9MUENNOgorICAgICAgICAvKiBQQ00gNDQuMSBrSHogMTYgYml0IHN0ZXJlbyBiaWctZW5kaWFuICovCisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAyOworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDQ0MTAwOworICAgICAgICBmcmFtZXNpemUgPSAxMDI0OworICAgICAgICAvKiBiaXQgcmF0ZSA9IHNhbXBsZSByYXRlIHggUENNIGJsb2NrIGFsaWduICg9IDQpIHggOCAqLworICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqIDMyOworICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9CisgICAgICAgICAgICBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjb2RlYyAlZCFcbiIsIGJ1ZlszMl0pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBmcmFtZXNpemU7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG9tYV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgT01BQ29udGV4dCAqb2MgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHBhY2tldF9zaXplID0gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmJsb2NrX2FsaWduOworICAgIGludCByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHBhY2tldF9zaXplKTsKKworICAgIGlmIChyZXQgPCBwYWNrZXRfc2l6ZSkKKyAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19DT1JSVVBUOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKworICAgIGlmIChvYy0+ZW5jcnlwdGVkKSB7CisgICAgICAgIC8qIHByZXZpb3VzIHVuZW5jcnlwdGVkIGJsb2NrIHNhdmVkIGluIElWIGZvcgorICAgICAgICAgKiB0aGUgbmV4dCBwYWNrZXQgKENCQyBtb2RlKSAqLworICAgICAgICBpZiAocmV0ID09IHBhY2tldF9zaXplKQorICAgICAgICAgICAgYXZfZGVzX2NyeXB0KCZvYy0+YXZfZGVzLCBwa3QtPmRhdGEsIHBrdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2V0X3NpemUgPj4gMyksIG9jLT5pdiwgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1lbXNldChvYy0+aXYsIDAsIDgpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb21hX3JlYWRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqYnVmID0gcC0+YnVmOworICAgIHVuc2lnbmVkIHRhZ19sZW4gPSAwOworCisgICAgaWYgKHAtPmJ1Zl9zaXplID49IElEM3YyX0hFQURFUl9TSVpFICYmIGZmX2lkM3YyX21hdGNoKGJ1ZiwgSUQzdjJfRUEzX01BR0lDKSkKKyAgICAgICAgdGFnX2xlbiA9IGZmX2lkM3YyX3RhZ19sZW4oYnVmKTsKKworICAgIC8qIFRoaXMgY2hlY2sgY2Fubm90IG92ZXJmbG93IGFzIHRhZ19sZW4gaGFzIGF0IG1vc3QgMjggYml0cyAqLworICAgIGlmIChwLT5idWZfc2l6ZSA8IHRhZ19sZW4gKyA1KQorICAgICAgICAvKiBFQTMgaGVhZGVyIGNvbWVzIGxhdGUsIG1pZ2h0IGJlIG91dHNpZGUgb2YgdGhlIHByb2JlIGJ1ZmZlciAqLworICAgICAgICByZXR1cm4gdGFnX2xlbiA/IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OLzIgOiAwOworCisgICAgYnVmICs9IHRhZ19sZW47CisKKyAgICBpZiAoIW1lbWNtcChidWYsICJFQTMiLCAzKSAmJiAhYnVmWzRdICYmIGJ1Zls1XSA9PSBFQTNfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYV9yZWFkX3NlZWsoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX2luZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQoreworICAgIE9NQUNvbnRleHQgKm9jID0gcy0+cHJpdl9kYXRhOworICAgIGludCBlcnIgPSBmZl9wY21fcmVhZF9zZWVrKHMsIHN0cmVhbV9pbmRleCwgdGltZXN0YW1wLCBmbGFncyk7CisKKyAgICBpZiAoIW9jLT5lbmNyeXB0ZWQpCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAvKiByZWFkanVzdCBJViBmb3IgQ0JDICovCisgICAgaWYgKGVyciB8fCBhdmlvX3RlbGwocy0+cGIpIDwgb2MtPmNvbnRlbnRfc3RhcnQpCisgICAgICAgIGdvdG8gd2lwZTsKKyAgICBpZiAoKGVyciA9IGF2aW9fc2VlayhzLT5wYiwgLTgsIFNFRUtfQ1VSKSkgPCAwKQorICAgICAgICBnb3RvIHdpcGU7CisgICAgaWYgKChlcnIgPSBhdmlvX3JlYWQocy0+cGIsIG9jLT5pdiwgOCkpIDwgOCkgeworICAgICAgICBpZiAoZXJyID49IDApCisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SX0VPRjsKKyAgICAgICAgZ290byB3aXBlOworICAgIH0KKworICAgIHJldHVybiAwOword2lwZToKKyAgICBtZW1zZXQob2MtPml2LCAwLCA4KTsKKyAgICByZXR1cm4gZXJyOworfQorCitBVklucHV0Rm9ybWF0IGZmX29tYV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJvbWEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTb255IE9wZW5NRyBhdWRpbyIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihPTUFDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBvbWFfcmVhZF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBvbWFfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gb21hX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IG9tYV9yZWFkX3NlZWssCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAib21hLG9tZyxhYTMiLAorICAgIC5jb2RlY190YWcgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7ZmZfb21hX2NvZGVjX3RhZ3MsIDB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9vbWFlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vbWFlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTA2NjlmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29tYWVuYy5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogU29ueSBPcGVuTUcgKE9NQSkgbXV4ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTWljaGFlbCBLYXJjaGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpZDN2Mi5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAib21hLmgiCisjaW5jbHVkZSAicmF3ZW5jLmgiCisKK3N0YXRpYyBhdl9jb2xkIGludCBvbWFfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBBVkNvZGVjQ29udGV4dCAqZm9ybWF0OworICAgIGludCBzcmF0ZV9pbmRleDsKKyAgICBpbnQgaXNqb2ludHN0ZXJlbzsKKworICAgIGZvcm1hdCA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIC8qIGNoZWNrIGZvciBzdXBwb3J0IG9mIHRoZSBmb3JtYXQgZmlyc3QgKi8KKworICAgIGZvciAoc3JhdGVfaW5kZXggPSAwOyA7IHNyYXRlX2luZGV4KyspIHsKKyAgICAgICAgaWYgKGZmX29tYV9zcmF0ZV90YWJbc3JhdGVfaW5kZXhdID09IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTYW1wbGUgcmF0ZSAlZCBub3Qgc3VwcG9ydGVkIGluIE9wZW5NRyBhdWRpb1xuIiwKKyAgICAgICAgICAgICAgICAgICBmb3JtYXQtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmZfb21hX3NyYXRlX3RhYltzcmF0ZV9pbmRleF0gKiAxMDAgPT0gZm9ybWF0LT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIE1ldGFkYXRhOyBPcGVuTUcgZG9lcyBub3Qgc3VwcG9ydCBJRDN2Mi40ICovCisgICAgZmZfaWQzdjJfd3JpdGVfc2ltcGxlKHMsIDMsIElEM3YyX0VBM19NQUdJQyk7CisKKyAgICBmZmlvX3dmb3VyY2Mocy0+cGIsICJFQTNcMCIpOworICAgIGF2aW9fdzgocy0+cGIsIEVBM19IRUFERVJfU0laRSA+PiA3KTsKKyAgICBhdmlvX3c4KHMtPnBiLCBFQTNfSEVBREVSX1NJWkUgJiAweDdGKTsKKyAgICBhdmlvX3dsMTYocy0+cGIsIDB4RkZGRik7ICAgICAgIC8qIG5vdCBlbmNyeXB0ZWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICBhdmlvX3dsMzIocy0+cGIsIDApOyAgICAgICAgLyogUGFkZGluZyArIERSTSBpZCAqLworCisgICAgc3dpdGNoKGZvcm1hdC0+Y29kZWNfdGFnKSB7CisgICAgY2FzZSBPTUFfQ09ERUNJRF9BVFJBQzM6CisgICAgICAgIGlmIChmb3JtYXQtPmNoYW5uZWxzICE9IDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBVFJBQzMgaW4gT01BIGlzIG9ubHkgc3VwcG9ydGVkIHdpdGggMiBjaGFubmVsc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPmV4dHJhZGF0YV9zaXplID09IDE0KSAvKiBXQVYgZm9ybWF0IGV4dHJhZGF0YSAqLworICAgICAgICAgICAgaXNqb2ludHN0ZXJlbyA9IGZvcm1hdC0+ZXh0cmFkYXRhWzZdICE9IDA7CisgICAgICAgIGVsc2UgaWYoZm9ybWF0LT5leHRyYWRhdGFfc2l6ZSA9PSAxMCkgLyogUk0gZm9ybWF0IGV4dHJhZGF0YSAqLworICAgICAgICAgICAgaXNqb2ludHN0ZXJlbyA9IGZvcm1hdC0+ZXh0cmFkYXRhWzhdID09IDB4MTI7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkFUUkFDMzogVW5zdXBwb3J0ZWQgZXh0cmFkYXRhIHNpemVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBhdmlvX3diMzIocy0+cGIsIChPTUFfQ09ERUNJRF9BVFJBQzMgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaXNqb2ludHN0ZXJlbyA8PCAxNykgfAorICAgICAgICAgICAgICAgICAgICAgICAgIChzcmF0ZV9pbmRleCA8PCAxMykgfAorICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQtPmJsb2NrX2FsaWduLzgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTUFfQ09ERUNJRF9BVFJBQzNQOgorICAgICAgICBhdmlvX3diMzIocy0+cGIsIChPTUFfQ09ERUNJRF9BVFJBQzNQIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHNyYXRlX2luZGV4IDw8IDEzKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdC0+Y2hhbm5lbHMgPDwgMTApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0LT5ibG9ja19hbGlnbi84IC0gMSkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgY29kZWMgdGFnICVkIGZvciB3cml0ZVxuIiwKKyAgICAgICAgICAgICAgIGZvcm1hdC0+Y29kZWNfdGFnKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IChFQTNfSEVBREVSX1NJWkUgLSAzNikvNDsgaSsrKQorICAgICAgICBhdmlvX3dsMzIocy0+cGIsIDApOyAgICAgICAgLyogUGFkZGluZyAqLworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX29tYV9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAib21hIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU29ueSBPcGVuTUcgYXVkaW8iKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAiYXVkaW8veC1vbWEiLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJvbWEiLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0FUUkFDMywKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBvbWFfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXtmZl9vbWFfY29kZWNfdGFncywgMH0sCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9vcHRpb25zLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvb3B0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNDQwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvb3B0aW9ucy5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisvKioKKyAqIEBmaWxlCisgKiBPcHRpb25zIGRlZmluaXRpb24gZm9yIEFWRm9ybWF0Q29udGV4dC4KKyAqLworCisjaW5jbHVkZSAib3B0aW9uc190YWJsZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciogZm9ybWF0X3RvX25hbWUodm9pZCogcHRyKQoreworICAgIEFWRm9ybWF0Q29udGV4dCogZmMgPSAoQVZGb3JtYXRDb250ZXh0KikgcHRyOworICAgIGlmKGZjLT5pZm9ybWF0KSByZXR1cm4gZmMtPmlmb3JtYXQtPm5hbWU7CisgICAgZWxzZSBpZihmYy0+b2Zvcm1hdCkgcmV0dXJuIGZjLT5vZm9ybWF0LT5uYW1lOworICAgIGVsc2UgcmV0dXJuICJOVUxMIjsKK30KKworc3RhdGljIHZvaWQgKmZvcm1hdF9jaGlsZF9uZXh0KHZvaWQgKm9iaiwgdm9pZCAqcHJldikKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKnMgPSBvYmo7CisgICAgaWYgKCFwcmV2ICYmIHMtPnByaXZfZGF0YSAmJgorICAgICAgICAoKHMtPmlmb3JtYXQgJiYgcy0+aWZvcm1hdC0+cHJpdl9jbGFzcykgfHwKKyAgICAgICAgICBzLT5vZm9ybWF0ICYmIHMtPm9mb3JtYXQtPnByaXZfY2xhc3MpKQorICAgICAgICByZXR1cm4gcy0+cHJpdl9kYXRhOworICAgIGlmIChzLT5wYiAmJiBzLT5wYi0+YXZfY2xhc3MgJiYgcHJldiAhPSBzLT5wYikKKyAgICAgICAgcmV0dXJuIHMtPnBiOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyAqZm9ybWF0X2NoaWxkX2NsYXNzX25leHQoY29uc3QgQVZDbGFzcyAqcHJldikKK3sKKyAgICBBVklucHV0Rm9ybWF0ICAqaWZtdCA9IE5VTEw7CisgICAgQVZPdXRwdXRGb3JtYXQgKm9mbXQgPSBOVUxMOworCisgICAgaWYgKCFwcmV2KQorICAgICAgICByZXR1cm4gJmZmaW9fdXJsX2NsYXNzOworCisgICAgd2hpbGUgKChpZm10ID0gYXZfaWZvcm1hdF9uZXh0KGlmbXQpKSkKKyAgICAgICAgaWYgKGlmbXQtPnByaXZfY2xhc3MgPT0gcHJldikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgaWYgKCFpZm10KQorICAgICAgICB3aGlsZSAoKG9mbXQgPSBhdl9vZm9ybWF0X25leHQob2ZtdCkpKQorICAgICAgICAgICAgaWYgKG9mbXQtPnByaXZfY2xhc3MgPT0gcHJldikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoIW9mbXQpCisgICAgICAgIHdoaWxlIChpZm10ID0gYXZfaWZvcm1hdF9uZXh0KGlmbXQpKQorICAgICAgICAgICAgaWYgKGlmbXQtPnByaXZfY2xhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIGlmbXQtPnByaXZfY2xhc3M7CisKKyAgICB3aGlsZSAob2ZtdCA9IGF2X29mb3JtYXRfbmV4dChvZm10KSkKKyAgICAgICAgaWYgKG9mbXQtPnByaXZfY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gb2ZtdC0+cHJpdl9jbGFzczsKKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgQVZDbGFzc0NhdGVnb3J5IGdldF9jYXRlZ29yeSh2b2lkICpwdHIpCit7CisgICAgQVZGb3JtYXRDb250ZXh0KiBzID0gcHRyOworICAgIGlmKHMtPmlmb3JtYXQpIHJldHVybiBBVl9DTEFTU19DQVRFR09SWV9ERU1VWEVSOworICAgIGVsc2UgICAgICAgICAgIHJldHVybiBBVl9DTEFTU19DQVRFR09SWV9NVVhFUjsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYXZfZm9ybWF0X2NvbnRleHRfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgICAgID0gIkFWRm9ybWF0Q29udGV4dCIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gZm9ybWF0X3RvX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgID0gYXZmb3JtYXRfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNoaWxkX25leHQgICAgID0gZm9ybWF0X2NoaWxkX25leHQsCisgICAgLmNoaWxkX2NsYXNzX25leHQgPSBmb3JtYXRfY2hpbGRfY2xhc3NfbmV4dCwKKyAgICAuY2F0ZWdvcnkgICAgICAgPSBBVl9DTEFTU19DQVRFR09SWV9NVVhFUiwKKyAgICAuZ2V0X2NhdGVnb3J5ICAgPSBnZXRfY2F0ZWdvcnksCit9OworCitzdGF0aWMgdm9pZCBhdmZvcm1hdF9nZXRfY29udGV4dF9kZWZhdWx0cyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgbWVtc2V0KHMsIDAsIHNpemVvZihBVkZvcm1hdENvbnRleHQpKTsKKworICAgIHMtPmF2X2NsYXNzID0gJmF2X2Zvcm1hdF9jb250ZXh0X2NsYXNzOworCisgICAgYXZfb3B0X3NldF9kZWZhdWx0cyhzKTsKK30KKworQVZGb3JtYXRDb250ZXh0ICphdmZvcm1hdF9hbGxvY19jb250ZXh0KHZvaWQpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICppYzsKKyAgICBpYyA9IGF2X21hbGxvYyhzaXplb2YoQVZGb3JtYXRDb250ZXh0KSk7CisgICAgaWYgKCFpYykgcmV0dXJuIGljOworICAgIGF2Zm9ybWF0X2dldF9jb250ZXh0X2RlZmF1bHRzKGljKTsKKyAgICBpYy0+b2Zmc2V0ID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBpYy0+aW50ZXJuYWwgPSBhdl9tYWxsb2N6KHNpemVvZigqaWMtPmludGVybmFsKSk7CisgICAgaWYgKCFpYy0+aW50ZXJuYWwpIHsKKyAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KGljKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGljOworfQorCitlbnVtIEFWRHVyYXRpb25Fc3RpbWF0aW9uTWV0aG9kIGF2X2ZtdF9jdHhfZ2V0X2R1cmF0aW9uX2VzdGltYXRpb25fbWV0aG9kKGNvbnN0IEFWRm9ybWF0Q29udGV4dCogY3R4KQoreworICAgIHJldHVybiBjdHgtPmR1cmF0aW9uX2VzdGltYXRpb25fbWV0aG9kOworfQorCitjb25zdCBBVkNsYXNzICphdmZvcm1hdF9nZXRfY2xhc3Modm9pZCkKK3sKKyAgICByZXR1cm4gJmF2X2Zvcm1hdF9jb250ZXh0X2NsYXNzOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L29wdGlvbnNfdGFibGUuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vcHRpb25zX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmMWUwYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vcHRpb25zX3RhYmxlLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfT1BUSU9OU19UQUJMRV9ICisjZGVmaW5lIEFWRk9STUFUX09QVElPTlNfVEFCTEVfSAorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBVkZvcm1hdENvbnRleHQseCkKKyNkZWZpbmUgREVGQVVMVCAwIC8vc2hvdWxkIGJlIE5BTiBidXQgaXQgZG9lcyBub3Qgd29yayBhcyBpdCBpcyBub3QgYSBjb25zdGFudCBpbiBnbGliYyBhcyByZXF1aXJlZCBieSBBTlNJL0lTTyBDCisvL3RoZXNlIG5hbWVzIGFyZSB0b28gbG9uZyB0byBiZSByZWFkYWJsZQorI2RlZmluZSBFIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCisjZGVmaW5lIEQgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGF2Zm9ybWF0X29wdGlvbnNbXSA9IHsKK3siYXZpb2ZsYWdzIiwgTlVMTCwgT0ZGU0VUKGF2aW9fZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIER8RSwgImF2aW9mbGFncyJ9LAoreyJkaXJlY3QiLCAicmVkdWNlIGJ1ZmZlcmluZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWSU9fRkxBR19ESVJFQ1QgfSwgSU5UX01JTiwgSU5UX01BWCwgRHxFLCAiYXZpb2ZsYWdzIn0sCit7InByb2Jlc2l6ZSIsICJzZXQgcHJvYmluZyBzaXplIiwgT0ZGU0VUKHByb2Jlc2l6ZTIpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSA1MDAwMDAwIH0sIDMyLCBJTlQ2NF9NQVgsIER9LAoreyJmb3JtYXRwcm9iZXNpemUiLCAibnVtYmVyIG9mIGJ5dGVzIHRvIHByb2JlIGZpbGUgZm9ybWF0IiwgT0ZGU0VUKGZvcm1hdF9wcm9iZXNpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gUFJPQkVfQlVGX01BWH0sIDAsIElOVF9NQVgtMSwgRH0sCit7InBhY2tldHNpemUiLCAic2V0IHBhY2tldCBzaXplIiwgT0ZGU0VUKHBhY2tldF9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgSU5UX01BWCwgRX0sCit7ImZmbGFncyIsIE5VTEwsIE9GRlNFVChmbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IEFWRk1UX0ZMQUdfRkxVU0hfUEFDS0VUUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBEfEUsICJmZmxhZ3MifSwKK3siZmx1c2hfcGFja2V0cyIsICJyZWR1Y2UgdGhlIGxhdGVuY3kgYnkgZmx1c2hpbmcgb3V0IHBhY2tldHMgaW1tZWRpYXRlbHkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkZNVF9GTEFHX0ZMVVNIX1BBQ0tFVFMgfSwgSU5UX01JTiwgSU5UX01BWCwgRSwgImZmbGFncyJ9LAoreyJpZ25pZHgiLCAiaWdub3JlIGluZGV4IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZGTVRfRkxBR19JR05JRFggfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImZmbGFncyJ9LAoreyJnZW5wdHMiLCAiZ2VuZXJhdGUgcHRzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZGTVRfRkxBR19HRU5QVFMgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImZmbGFncyJ9LAoreyJub2ZpbGxpbiIsICJkbyBub3QgZmlsbCBpbiBtaXNzaW5nIHZhbHVlcyB0aGF0IGNhbiBiZSBleGFjdGx5IGNhbGN1bGF0ZWQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkZNVF9GTEFHX05PRklMTElOIH0sIElOVF9NSU4sIElOVF9NQVgsIEQsICJmZmxhZ3MifSwKK3sibm9wYXJzZSIsICJkaXNhYmxlIEFWUGFyc2VycywgdGhpcyBuZWVkcyBub2ZpbGxpbiB0b28iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkZNVF9GTEFHX05PUEFSU0UgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImZmbGFncyJ9LAoreyJpZ25kdHMiLCAiaWdub3JlIGR0cyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWRk1UX0ZMQUdfSUdORFRTIH0sIElOVF9NSU4sIElOVF9NQVgsIEQsICJmZmxhZ3MifSwKK3siZGlzY2FyZGNvcnJ1cHQiLCAiZGlzY2FyZCBjb3JydXB0ZWQgZnJhbWVzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZGTVRfRkxBR19ESVNDQVJEX0NPUlJVUFQgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImZmbGFncyJ9LAoreyJzb3J0ZHRzIiwgInRyeSB0byBpbnRlcmxlYXZlIG91dHB1dHRlZCBwYWNrZXRzIGJ5IGR0cyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWRk1UX0ZMQUdfU09SVF9EVFMgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImZmbGFncyJ9LAoreyJrZWVwc2lkZSIsICJkb24ndCBtZXJnZSBzaWRlIGRhdGEiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkZNVF9GTEFHX0tFRVBfU0lERV9EQVRBIH0sIElOVF9NSU4sIElOVF9NQVgsIEQsICJmZmxhZ3MifSwKK3sibGF0bSIsICJlbmFibGUgUlRQIE1QNEEtTEFUTSBwYXlsb2FkIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZGTVRfRkxBR19NUDRBX0xBVE0gfSwgSU5UX01JTiwgSU5UX01BWCwgRSwgImZmbGFncyJ9LAoreyJub2J1ZmZlciIsICJyZWR1Y2UgdGhlIGxhdGVuY3kgaW50cm9kdWNlZCBieSBvcHRpb25hbCBidWZmZXJpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkZNVF9GTEFHX05PQlVGRkVSIH0sIDAsIElOVF9NQVgsIEQsICJmZmxhZ3MifSwKK3sic2VlazJhbnkiLCAiYWxsb3cgc2Vla2luZyB0byBub24ta2V5ZnJhbWVzIG9uIGRlbXV4ZXIgbGV2ZWwgd2hlbiBzdXBwb3J0ZWQiLCBPRkZTRVQoc2VlazJhbnkpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAwLCAxLCBEfSwKK3siYml0ZXhhY3QiLCAiZG8gbm90IHdyaXRlIHJhbmRvbS92b2xhdGlsZSBkYXRhIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWRk1UX0ZMQUdfQklURVhBQ1QgfSwgMCwgMCwgRSwgImZmbGFncyIgfSwKK3siYW5hbHl6ZWR1cmF0aW9uIiwgInNwZWNpZnkgaG93IG1hbnkgbWljcm9zZWNvbmRzIGFyZSBhbmFseXplZCB0byBwcm9iZSB0aGUgaW5wdXQiLCBPRkZTRVQobWF4X2FuYWx5emVfZHVyYXRpb24yKSwgQVZfT1BUX1RZUEVfSU5UNjQsIHsuaTY0ID0gMCB9LCAwLCBJTlQ2NF9NQVgsIER9LAoreyJjcnlwdG9rZXkiLCAiZGVjcnlwdGlvbiBrZXkiLCBPRkZTRVQoa2V5KSwgQVZfT1BUX1RZUEVfQklOQVJZLCB7LmRibCA9IDB9LCAwLCAwLCBEfSwKK3siaW5kZXhtZW0iLCAibWF4IG1lbW9yeSB1c2VkIGZvciB0aW1lc3RhbXAgaW5kZXggKHBlciBzdHJlYW0pIiwgT0ZGU0VUKG1heF9pbmRleF9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDE8PDIwIH0sIDAsIElOVF9NQVgsIER9LAoreyJydGJ1ZnNpemUiLCAibWF4IG1lbW9yeSB1c2VkIGZvciBidWZmZXJpbmcgcmVhbC10aW1lIGZyYW1lcyIsIE9GRlNFVChtYXhfcGljdHVyZV9idWZmZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMzA0MTI4MCB9LCAwLCBJTlRfTUFYLCBEfSwgLyogZGVmYXVsdHMgdG8gMXMgb2YgMTVmcHMgMzUyeDI4OCBZVVlWNDIyIHZpZGVvICovCit7ImZkZWJ1ZyIsICJwcmludCBzcGVjaWZpYyBkZWJ1ZyBpbmZvIiwgT0ZGU0VUKGRlYnVnKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBFfEQsICJmZGVidWcifSwKK3sidHMiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9GREVCVUdfVFMgfSwgSU5UX01JTiwgSU5UX01BWCwgRXxELCAiZmRlYnVnIn0sCit7Im1heF9kZWxheSIsICJtYXhpbXVtIG11eGluZyBvciBkZW11eGluZyBkZWxheSBpbiBtaWNyb3NlY29uZHMiLCBPRkZTRVQobWF4X2RlbGF5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xIH0sIC0xLCBJTlRfTUFYLCBFfER9LAoreyJzdGFydF90aW1lX3JlYWx0aW1lIiwgIndhbGwtY2xvY2sgdGltZSB3aGVuIHN0cmVhbSBiZWdpbnMgKFBUUz09MCkiLCBPRkZTRVQoc3RhcnRfdGltZV9yZWFsdGltZSksIEFWX09QVF9UWVBFX0lOVDY0LCB7Lmk2NCA9IEFWX05PUFRTX1ZBTFVFfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIEV9LAoreyJmcHNwcm9iZXNpemUiLCAibnVtYmVyIG9mIGZyYW1lcyB1c2VkIHRvIHByb2JlIGZwcyIsIE9GRlNFVChmcHNfcHJvYmVfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLTEsIER9LAoreyJhdWRpb19wcmVsb2FkIiwgIm1pY3Jvc2Vjb25kcyBieSB3aGljaCBhdWRpbyBwYWNrZXRzIHNob3VsZCBiZSBpbnRlcmxlYXZlZCBlYXJsaWVyIiwgT0ZGU0VUKGF1ZGlvX3ByZWxvYWQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgtMSwgRX0sCit7ImNodW5rX2R1cmF0aW9uIiwgIm1pY3Jvc2Vjb25kcyBmb3IgZWFjaCBjaHVuayIsIE9GRlNFVChtYXhfY2h1bmtfZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgtMSwgRX0sCit7ImNodW5rX3NpemUiLCAic2l6ZSBpbiBieXRlcyBmb3IgZWFjaCBjaHVuayIsIE9GRlNFVChtYXhfY2h1bmtfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgSU5UX01BWC0xLCBFfSwKKy8qIHRoaXMgaXMgYSBjcnV0Y2ggZm9yIGF2Y29udiwgc2luY2UgaXQgY2Fubm90IGRlYWwgd2l0aCBpZGVudGljYWxseSBuYW1lZCBvcHRpb25zIGluIGRpZmZlcmVudCBjb250ZXh0cy4KKyAqIHRvIGJlIHJlbW92ZWQgd2hlbiBhdmNvbnYgaXMgZml4ZWQgKi8KK3siZl9lcnJfZGV0ZWN0IiwgInNldCBlcnJvciBkZXRlY3Rpb24gZmxhZ3MgKGRlcHJlY2F0ZWQ7IHVzZSBlcnJfZGV0ZWN0LCBzYXZlIHZpYSBhdmNvbnYpIiwgT0ZGU0VUKGVycm9yX3JlY29nbml0aW9uKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gQVZfRUZfQ1JDQ0hFQ0sgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImVycl9kZXRlY3QifSwKK3siZXJyX2RldGVjdCIsICJzZXQgZXJyb3IgZGV0ZWN0aW9uIGZsYWdzIiwgT0ZGU0VUKGVycm9yX3JlY29nbml0aW9uKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gQVZfRUZfQ1JDQ0hFQ0sgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImVycl9kZXRlY3QifSwKK3siY3JjY2hlY2siLCAidmVyaWZ5IGVtYmVkZGVkIENSQ3MiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9FRl9DUkNDSEVDSyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBELCAiZXJyX2RldGVjdCJ9LAoreyJiaXRzdHJlYW0iLCAiZGV0ZWN0IGJpdHN0cmVhbSBzcGVjaWZpY2F0aW9uIGRldmlhdGlvbnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9FRl9CSVRTVFJFQU0gfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImVycl9kZXRlY3QifSwKK3siYnVmZmVyIiwgImRldGVjdCBpbXByb3BlciBiaXRzdHJlYW0gbGVuZ3RoIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfRUZfQlVGRkVSIH0sIElOVF9NSU4sIElOVF9NQVgsIEQsICJlcnJfZGV0ZWN0In0sCit7ImV4cGxvZGUiLCAiYWJvcnQgZGVjb2Rpbmcgb24gbWlub3IgZXJyb3IgZGV0ZWN0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfRUZfRVhQTE9ERSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBELCAiZXJyX2RldGVjdCJ9LAoreyJpZ25vcmVfZXJyIiwgImlnbm9yZSBlcnJvcnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9FRl9JR05PUkVfRVJSIH0sIElOVF9NSU4sIElOVF9NQVgsIEQsICJlcnJfZGV0ZWN0In0sCit7ImNhcmVmdWwiLCAgICAiY29uc2lkZXIgdGhpbmdzIHRoYXQgdmlvbGF0ZSB0aGUgc3BlYywgYXJlIGZhc3QgdG8gY2hlY2sgYW5kIGhhdmUgbm90IGJlZW4gc2VlbiBpbiB0aGUgd2lsZCBhcyBlcnJvcnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9FRl9DQVJFRlVMIH0sIElOVF9NSU4sIElOVF9NQVgsIEQsICJlcnJfZGV0ZWN0In0sCit7ImNvbXBsaWFudCIsICAiY29uc2lkZXIgYWxsIHNwZWMgbm9uIGNvbXBsaWFuY2llcyBhcyBlcnJvcnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9FRl9DT01QTElBTlQgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImVycl9kZXRlY3QifSwKK3siYWdncmVzc2l2ZSIsICJjb25zaWRlciB0aGluZ3MgdGhhdCBhIHNhbmUgZW5jb2RlciBzaG91bGRuJ3QgZG8gYXMgYW4gZXJyb3IiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9FRl9BR0dSRVNTSVZFIH0sIElOVF9NSU4sIElOVF9NQVgsIEQsICJlcnJfZGV0ZWN0In0sCit7InVzZV93YWxsY2xvY2tfYXNfdGltZXN0YW1wcyIsICJ1c2Ugd2FsbGNsb2NrIGFzIHRpbWVzdGFtcHMiLCBPRkZTRVQodXNlX3dhbGxjbG9ja19hc190aW1lc3RhbXBzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLTEsIER9LAoreyJza2lwX2luaXRpYWxfYnl0ZXMiLCAic2V0IG51bWJlciBvZiBieXRlcyB0byBza2lwIGJlZm9yZSByZWFkaW5nIGhlYWRlciBhbmQgZnJhbWVzIiwgT0ZGU0VUKHNraXBfaW5pdGlhbF9ieXRlcyksIEFWX09QVF9UWVBFX0lOVDY0LCB7Lmk2NCA9IDB9LCAwLCBJTlQ2NF9NQVgtMSwgRH0sCit7ImNvcnJlY3RfdHNfb3ZlcmZsb3ciLCAiY29ycmVjdCBzaW5nbGUgdGltZXN0YW1wIG92ZXJmbG93cyIsIE9GRlNFVChjb3JyZWN0X3RzX292ZXJmbG93KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDF9LCAwLCAxLCBEfSwKK3siZmx1c2hfcGFja2V0cyIsICJlbmFibGUgZmx1c2hpbmcgb2YgdGhlIEkvTyBjb250ZXh0IGFmdGVyIGVhY2ggcGFja2V0IiwgT0ZGU0VUKGZsdXNoX3BhY2tldHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMX0sIDAsIDEsIEV9LAoreyJtZXRhZGF0YV9oZWFkZXJfcGFkZGluZyIsICJzZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gYXMgcGFkZGluZyBpbiBhIG1ldGFkYXRhIGhlYWRlciIsIE9GRlNFVChtZXRhZGF0YV9oZWFkZXJfcGFkZGluZyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBFfSwKK3sib3V0cHV0X3RzX29mZnNldCIsICJzZXQgb3V0cHV0IHRpbWVzdGFtcCBvZmZzZXQiLCBPRkZTRVQob3V0cHV0X3RzX29mZnNldCksIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2NCA9IDB9LCAtSU5UNjRfTUFYLCBJTlQ2NF9NQVgsIEV9LAoreyJtYXhfaW50ZXJsZWF2ZV9kZWx0YSIsICJtYXhpbXVtIGJ1ZmZlcmluZyBkdXJhdGlvbiBmb3IgaW50ZXJsZWF2aW5nIiwgT0ZGU0VUKG1heF9pbnRlcmxlYXZlX2RlbHRhKSwgQVZfT1BUX1RZUEVfSU5UNjQsIHsgLmk2NCA9IDEwMDAwMDAwIH0sIDAsIElOVDY0X01BWCwgRSB9LAoreyJmX3N0cmljdCIsICJob3cgc3RyaWN0bHkgdG8gZm9sbG93IHRoZSBzdGFuZGFyZHMgKGRlcHJlY2F0ZWQ7IHVzZSBzdHJpY3QsIHNhdmUgdmlhIGF2Y29udikiLCBPRkZTRVQoc3RyaWN0X3N0ZF9jb21wbGlhbmNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgRHxFLCAic3RyaWN0In0sCit7InN0cmljdCIsICJob3cgc3RyaWN0bHkgdG8gZm9sbG93IHRoZSBzdGFuZGFyZHMiLCBPRkZTRVQoc3RyaWN0X3N0ZF9jb21wbGlhbmNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgRHxFLCAic3RyaWN0In0sCit7InN0cmljdCIsICJzdHJpY3RseSBjb25mb3JtIHRvIGFsbCB0aGUgdGhpbmdzIGluIHRoZSBzcGVjIG5vIG1hdHRlciB3aGF0IHRoZSBjb25zZXF1ZW5jZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DT01QTElBTkNFX1NUUklDVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBEfEUsICJzdHJpY3QifSwKK3sibm9ybWFsIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09NUExJQU5DRV9OT1JNQUwgfSwgSU5UX01JTiwgSU5UX01BWCwgRHxFLCAic3RyaWN0In0sCit7InVub2ZmaWNpYWwiLCAiYWxsb3cgdW5vZmZpY2lhbCBleHRlbnNpb25zIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09NUExJQU5DRV9VTk9GRklDSUFMIH0sIElOVF9NSU4sIElOVF9NQVgsIER8RSwgInN0cmljdCJ9LAoreyJleHBlcmltZW50YWwiLCAiYWxsb3cgbm9uLXN0YW5kYXJkaXplZCBleHBlcmltZW50YWwgdmFyaWFudHMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBEfEUsICJzdHJpY3QifSwKK3sibWF4X3RzX3Byb2JlIiwgIm1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMgdG8gcmVhZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZmlyc3QgdGltZXN0YW1wIiwgT0ZGU0VUKG1heF90c19wcm9iZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gNTAgfSwgMCwgSU5UX01BWCwgRCB9LAoreyJhdm9pZF9uZWdhdGl2ZV90cyIsICJzaGlmdCB0aW1lc3RhbXBzIHNvIHRoZXkgc3RhcnQgYXQgMCIsIE9GRlNFVChhdm9pZF9uZWdhdGl2ZV90cyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCAyLCBFLCAiYXZvaWRfbmVnYXRpdmVfdHMifSwKK3siYXV0byIsICAgICAgICAgICAgICAiZW5hYmxlZCB3aGVuIHJlcXVpcmVkIGJ5IHRhcmdldCBmb3JtYXQiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkZNVF9BVk9JRF9ORUdfVFNfQVVUTyB9LCAgICAgICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgRSwgImF2b2lkX25lZ2F0aXZlX3RzIn0sCit7ImRpc2FibGVkIiwgICAgICAgICAgImRvIG5vdCBjaGFuZ2UgdGltZXN0YW1wcyIsICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIEUsICJhdm9pZF9uZWdhdGl2ZV90cyJ9LAoreyJtYWtlX25vbl9uZWdhdGl2ZSIsICJzaGlmdCB0aW1lc3RhbXBzIHNvIHRoZXkgYXJlIG5vbiBuZWdhdGl2ZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWRk1UX0FWT0lEX05FR19UU19NQUtFX05PTl9ORUdBVElWRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBFLCAiYXZvaWRfbmVnYXRpdmVfdHMifSwKK3sibWFrZV96ZXJvIiwgICAgICAgICAic2hpZnQgdGltZXN0YW1wcyBzbyB0aGV5IHN0YXJ0IGF0IDAiLCAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkZNVF9BVk9JRF9ORUdfVFNfTUFLRV9aRVJPIH0sICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgRSwgImF2b2lkX25lZ2F0aXZlX3RzIn0sCit7ImR1bXBfc2VwYXJhdG9yIiwgInNldCBpbmZvcm1hdGlvbiBkdW1wIGZpZWxkIHNlcGFyYXRvciIsIE9GRlNFVChkdW1wX3NlcGFyYXRvciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiLCAifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBEfEV9LAoreyJjb2RlY193aGl0ZWxpc3QiLCAiTGlzdCBvZiBkZWNvZGVycyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHVzZWQiLCBPRkZTRVQoY29kZWNfd2hpdGVsaXN0KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICBDSEFSX01JTiwgQ0hBUl9NQVgsIEQgfSwKK3siZm9ybWF0X3doaXRlbGlzdCIsICJMaXN0IG9mIGRlbXV4ZXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCIsIE9GRlNFVChmb3JtYXRfd2hpdGVsaXN0KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICBDSEFSX01JTiwgQ0hBUl9NQVgsIEQgfSwKK3tOVUxMfSwKK307CisKKyN1bmRlZiBFCisjdW5kZWYgRAorI3VuZGVmIERFRkFVTFQKKyN1bmRlZiBPRkZTRVQKKworI2VuZGlmIC8qIEFWRk9STUFUX09QVElPTlNfVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L29zX3N1cHBvcnQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vc19zdXBwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkNmVlYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9vc19zdXBwb3J0LmMKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiB2YXJpb3VzIE9TLWZlYXR1cmUgcmVwbGFjZW1lbnQgdXRpbGl0aWVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKiBjb3B5cmlnaHQgKGMpIDIwMDIgRnJhbmNvaXMgUmV2b2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyogbmVlZGVkIGJ5IGluZXRfYXRvbigpICovCisjZGVmaW5lIF9ERUZBVUxUX1NPVVJDRQorI2RlZmluZSBfU1ZJRF9TT1VSQ0UKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAib3Nfc3VwcG9ydC5oIgorCisjaWYgQ09ORklHX05FVFdPUksKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmICFIQVZFX1BPTExfSAorI2lmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYgLyogSEFWRV9TWVNfVElNRV9IICovCisjaWYgSEFWRV9XSU5TT0NLMl9ICisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNlbGlmIEhBVkVfU1lTX1NFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmIC8qIEhBVkVfV0lOU09DSzJfSCAqLworI2VuZGlmIC8qICFIQVZFX1BPTExfSCAqLworCisjaW5jbHVkZSAibmV0d29yay5oIgorCisjaWYgIUhBVkVfSU5FVF9BVE9OCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBmZl9pbmV0X2F0b24oY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgaW5fYWRkciAqYWRkKQoreworICAgIHVuc2lnbmVkIGludCBhZGQxID0gMCwgYWRkMiA9IDAsIGFkZDMgPSAwLCBhZGQ0ID0gMDsKKworICAgIGlmIChzc2NhbmYoc3RyLCAiJWQuJWQuJWQuJWQiLCAmYWRkMSwgJmFkZDIsICZhZGQzLCAmYWRkNCkgIT0gNCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIWFkZDEgfHwgKGFkZDEgfCBhZGQyIHwgYWRkMyB8IGFkZDQpID4gMjU1KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGFkZC0+c19hZGRyID0gaHRvbmwoKGFkZDEgPDwgMjQpICsgKGFkZDIgPDwgMTYpICsgKGFkZDMgPDwgOCkgKyBhZGQ0KTsKKworICAgIHJldHVybiAxOworfQorI2Vsc2UKK2ludCBmZl9pbmV0X2F0b24oY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgaW5fYWRkciAqYWRkKQoreworICAgIHJldHVybiBpbmV0X2F0b24oc3RyLCBhZGQpOworfQorI2VuZGlmIC8qICFIQVZFX0lORVRfQVRPTiAqLworCisjaWYgIUhBVkVfR0VUQUREUklORk8KK2ludCBmZl9nZXRhZGRyaW5mbyhjb25zdCBjaGFyICpub2RlLCBjb25zdCBjaGFyICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqaGludHMsIHN0cnVjdCBhZGRyaW5mbyAqKnJlcykKK3sKKyAgICBzdHJ1Y3QgaG9zdGVudCAqaCA9IE5VTEw7CisgICAgc3RydWN0IGFkZHJpbmZvICphaTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKworI2lmIEhBVkVfV0lOU09DSzJfSAorICAgIGludCAoV1NBQVBJICp3aW5fZ2V0YWRkcmluZm8pKGNvbnN0IGNoYXIgKm5vZGUsIGNvbnN0IGNoYXIgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWRkcmluZm8gKipyZXMpOworICAgIEhNT0RVTEUgd3MybW9kID0gR2V0TW9kdWxlSGFuZGxlKCJ3czJfMzIuZGxsIik7CisgICAgd2luX2dldGFkZHJpbmZvID0gR2V0UHJvY0FkZHJlc3Mod3MybW9kLCAiZ2V0YWRkcmluZm8iKTsKKyAgICBpZiAod2luX2dldGFkZHJpbmZvKQorICAgICAgICByZXR1cm4gd2luX2dldGFkZHJpbmZvKG5vZGUsIHNlcnZpY2UsIGhpbnRzLCByZXMpOworI2VuZGlmIC8qIEhBVkVfV0lOU09DSzJfSCAqLworCisgICAgKnJlcyA9IE5VTEw7CisgICAgc2luICA9IGF2X21hbGxvY3ooc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworICAgIGlmICghc2luKQorICAgICAgICByZXR1cm4gRUFJX0ZBSUw7CisgICAgc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworICAgIGlmIChub2RlKSB7CisgICAgICAgIGlmICghZmZfaW5ldF9hdG9uKG5vZGUsICZzaW4tPnNpbl9hZGRyKSkgeworICAgICAgICAgICAgaWYgKGhpbnRzICYmIChoaW50cy0+YWlfZmxhZ3MgJiBBSV9OVU1FUklDSE9TVCkpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHNpbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVBSV9GQUlMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaCA9IGdldGhvc3RieW5hbWUobm9kZSk7CisgICAgICAgICAgICBpZiAoIWgpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHNpbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVBSV9GQUlMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KCZzaW4tPnNpbl9hZGRyLCBoLT5oX2FkZHJfbGlzdFswXSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaGludHMgJiYgKGhpbnRzLT5haV9mbGFncyAmIEFJX1BBU1NJVkUpKQorICAgICAgICAgICAgc2luLT5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzaW4tPnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9MT09QQkFDSzsKKyAgICB9CisKKyAgICAvKiBOb3RlOiBnZXRhZGRyaW5mbyBhbGxvd3Mgc2VydmljZSB0byBiZSBhIHN0cmluZywgd2hpY2gKKyAgICAgKiBzaG91bGQgYmUgbG9va2VkIHVwIHVzaW5nIGdldHNlcnZieW5hbWUuICovCisgICAgaWYgKHNlcnZpY2UpCisgICAgICAgIHNpbi0+c2luX3BvcnQgPSBodG9ucyhhdG9pKHNlcnZpY2UpKTsKKworICAgIGFpID0gYXZfbWFsbG9jeihzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSk7CisgICAgaWYgKCFhaSkgeworICAgICAgICBhdl9mcmVlKHNpbik7CisgICAgICAgIHJldHVybiBFQUlfRkFJTDsKKyAgICB9CisKKyAgICAqcmVzICAgICAgICAgICAgPSBhaTsKKyAgICBhaS0+YWlfZmFtaWx5ICAgPSBBRl9JTkVUOworICAgIGFpLT5haV9zb2NrdHlwZSA9IGhpbnRzID8gaGludHMtPmFpX3NvY2t0eXBlIDogMDsKKyAgICBzd2l0Y2ggKGFpLT5haV9zb2NrdHlwZSkgeworICAgIGNhc2UgU09DS19TVFJFQU06CisgICAgICAgIGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNPQ0tfREdSQU06CisgICAgICAgIGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhaS0+YWlfcHJvdG9jb2wgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBhaS0+YWlfYWRkciAgICA9IChzdHJ1Y3Qgc29ja2FkZHIgKilzaW47CisgICAgYWktPmFpX2FkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyAgICBpZiAoaGludHMgJiYgKGhpbnRzLT5haV9mbGFncyAmIEFJX0NBTk9OTkFNRSkpCisgICAgICAgIGFpLT5haV9jYW5vbm5hbWUgPSBoID8gYXZfc3RyZHVwKGgtPmhfbmFtZSkgOiBOVUxMOworCisgICAgYWktPmFpX25leHQgPSBOVUxMOworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX2ZyZWVhZGRyaW5mbyhzdHJ1Y3QgYWRkcmluZm8gKnJlcykKK3sKKyNpZiBIQVZFX1dJTlNPQ0syX0gKKyAgICB2b2lkIChXU0FBUEkgKndpbl9mcmVlYWRkcmluZm8pKHN0cnVjdCBhZGRyaW5mbyAqcmVzKTsKKyAgICBITU9EVUxFIHdzMm1vZCA9IEdldE1vZHVsZUhhbmRsZSgid3MyXzMyLmRsbCIpOworICAgIHdpbl9mcmVlYWRkcmluZm8gPSAodm9pZCAoV1NBQVBJICopKHN0cnVjdCBhZGRyaW5mbyAqcmVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgR2V0UHJvY0FkZHJlc3Mod3MybW9kLCAiZnJlZWFkZHJpbmZvIik7CisgICAgaWYgKHdpbl9mcmVlYWRkcmluZm8pIHsKKyAgICAgICAgd2luX2ZyZWVhZGRyaW5mbyhyZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIEhBVkVfV0lOU09DSzJfSCAqLworCisgICAgYXZfZnJlZShyZXMtPmFpX2Nhbm9ubmFtZSk7CisgICAgYXZfZnJlZShyZXMtPmFpX2FkZHIpOworICAgIGF2X2ZyZWUocmVzKTsKK30KKworaW50IGZmX2dldG5hbWVpbmZvKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EsIGludCBzYWxlbiwKKyAgICAgICAgICAgICAgICAgICBjaGFyICpob3N0LCBpbnQgaG9zdGxlbiwKKyAgICAgICAgICAgICAgICAgICBjaGFyICpzZXJ2LCBpbnQgc2VydmxlbiwgaW50IGZsYWdzKQoreworICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhOworCisjaWYgSEFWRV9XSU5TT0NLMl9ICisgICAgaW50IChXU0FBUEkgKndpbl9nZXRuYW1laW5mbykoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSwgc29ja2xlbl90IHNhbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmhvc3QsIERXT1JEIGhvc3RsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc2VydiwgRFdPUkQgc2VydmxlbiwgaW50IGZsYWdzKTsKKyAgICBITU9EVUxFIHdzMm1vZCA9IEdldE1vZHVsZUhhbmRsZSgid3MyXzMyLmRsbCIpOworICAgIHdpbl9nZXRuYW1laW5mbyA9IEdldFByb2NBZGRyZXNzKHdzMm1vZCwgImdldG5hbWVpbmZvIik7CisgICAgaWYgKHdpbl9nZXRuYW1laW5mbykKKyAgICAgICAgcmV0dXJuIHdpbl9nZXRuYW1laW5mbyhzYSwgc2FsZW4sIGhvc3QsIGhvc3RsZW4sIHNlcnYsIHNlcnZsZW4sIGZsYWdzKTsKKyNlbmRpZiAvKiBIQVZFX1dJTlNPQ0syX0ggKi8KKworICAgIGlmIChzYS0+c2FfZmFtaWx5ICE9IEFGX0lORVQpCisgICAgICAgIHJldHVybiBFQUlfRkFNSUxZOworICAgIGlmICghaG9zdCAmJiAhc2VydikKKyAgICAgICAgcmV0dXJuIEVBSV9OT05BTUU7CisKKyAgICBpZiAoaG9zdCAmJiBob3N0bGVuID4gMCkgeworICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqZW50ID0gTlVMTDsKKyAgICAgICAgdWludDMyX3QgYTsKKyAgICAgICAgaWYgKCEoZmxhZ3MgJiBOSV9OVU1FUklDSE9TVCkpCisgICAgICAgICAgICBlbnQgPSBnZXRob3N0YnlhZGRyKChjb25zdCBjaGFyICopJnNpbi0+c2luX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzaW4tPnNpbl9hZGRyKSwgQUZfSU5FVCk7CisKKyAgICAgICAgaWYgKGVudCkgeworICAgICAgICAgICAgc25wcmludGYoaG9zdCwgaG9zdGxlbiwgIiVzIiwgZW50LT5oX25hbWUpOworICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgTklfTkFNRVJRRCkgeworICAgICAgICAgICAgcmV0dXJuIEVBSV9OT05BTUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhID0gbnRvaGwoc2luLT5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICAgICAgc25wcmludGYoaG9zdCwgaG9zdGxlbiwgIiVkLiVkLiVkLiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICgoYSA+PiAyNCkgJiAweGZmKSwgKChhID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgICAgICAgKChhID4+ICA4KSAmIDB4ZmYpLCAgKGEgICAgICAgICYgMHhmZikpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNlcnYgJiYgc2VydmxlbiA+IDApIHsKKyAgICAgICAgc3RydWN0IHNlcnZlbnQgKmVudCA9IE5VTEw7CisjaWYgSEFWRV9HRVRTRVJWQllQT1JUCisgICAgICAgIGlmICghKGZsYWdzICYgTklfTlVNRVJJQ1NFUlYpKQorICAgICAgICAgICAgZW50ID0gZ2V0c2VydmJ5cG9ydChzaW4tPnNpbl9wb3J0LCBmbGFncyAmIE5JX0RHUkFNID8gInVkcCIgOiAidGNwIik7CisjZW5kaWYgLyogSEFWRV9HRVRTRVJWQllQT1JUICovCisKKyAgICAgICAgaWYgKGVudCkKKyAgICAgICAgICAgIHNucHJpbnRmKHNlcnYsIHNlcnZsZW4sICIlcyIsIGVudC0+c19uYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc25wcmludGYoc2Vydiwgc2VydmxlbiwgIiVkIiwgbnRvaHMoc2luLT5zaW5fcG9ydCkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qICFIQVZFX0dFVEFERFJJTkZPICovCisKKyNpZiAhSEFWRV9HRVRBRERSSU5GTyB8fCBIQVZFX1dJTlNPQ0syX0gKK2NvbnN0IGNoYXIgKmZmX2dhaV9zdHJlcnJvcihpbnQgZWNvZGUpCit7CisgICAgc3dpdGNoIChlY29kZSkgeworICAgIGNhc2UgRUFJX0FHQUlOOgorICAgICAgICByZXR1cm4gIlRlbXBvcmFyeSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiI7CisgICAgY2FzZSBFQUlfQkFERkxBR1M6CisgICAgICAgIHJldHVybiAiSW52YWxpZCBmbGFncyBmb3IgYWlfZmxhZ3MiOworICAgIGNhc2UgRUFJX0ZBSUw6CisgICAgICAgIHJldHVybiAiQSBub24tcmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQiOworICAgIGNhc2UgRUFJX0ZBTUlMWToKKyAgICAgICAgcmV0dXJuICJUaGUgYWRkcmVzcyBmYW1pbHkgd2FzIG5vdCByZWNvZ25pemVkIG9yIHRoZSBhZGRyZXNzICIKKyAgICAgICAgICAgICAgICJsZW5ndGggd2FzIGludmFsaWQgZm9yIHRoZSBzcGVjaWZpZWQgZmFtaWx5IjsKKyAgICBjYXNlIEVBSV9NRU1PUlk6CisgICAgICAgIHJldHVybiAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSI7CisjaWYgRUFJX05PREFUQSAhPSBFQUlfTk9OQU1FCisgICAgY2FzZSBFQUlfTk9EQVRBOgorICAgICAgICByZXR1cm4gIk5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lIjsKKyNlbmRpZiAvKiBFQUlfTk9EQVRBICE9IEVBSV9OT05BTUUgKi8KKyAgICBjYXNlIEVBSV9OT05BTUU6CisgICAgICAgIHJldHVybiAiVGhlIG5hbWUgZG9lcyBub3QgcmVzb2x2ZSBmb3IgdGhlIHN1cHBsaWVkIHBhcmFtZXRlcnMiOworICAgIGNhc2UgRUFJX1NFUlZJQ0U6CisgICAgICAgIHJldHVybiAic2Vydm5hbWUgbm90IHN1cHBvcnRlZCBmb3IgYWlfc29ja3R5cGUiOworICAgIGNhc2UgRUFJX1NPQ0tUWVBFOgorICAgICAgICByZXR1cm4gImFpX3NvY2t0eXBlIG5vdCBzdXBwb3J0ZWQiOworICAgIH0KKworICAgIHJldHVybiAiVW5rbm93biBlcnJvciI7Cit9CisjZW5kaWYgLyogIUhBVkVfR0VUQUREUklORk8gfHwgSEFWRV9XSU5TT0NLMl9IICovCisKK2ludCBmZl9zb2NrZXRfbm9uYmxvY2soaW50IHNvY2tldCwgaW50IGVuYWJsZSkKK3sKKyNpZiBIQVZFX1dJTlNPQ0syX0gKKyAgICB1X2xvbmcgcGFyYW0gPSBlbmFibGU7CisgICAgcmV0dXJuIGlvY3Rsc29ja2V0KHNvY2tldCwgRklPTkJJTywgJnBhcmFtKTsKKyNlbHNlCisgICAgaWYgKGVuYWJsZSkKKyAgICAgICAgcmV0dXJuIGZjbnRsKHNvY2tldCwgRl9TRVRGTCwgZmNudGwoc29ja2V0LCBGX0dFVEZMKSB8IE9fTk9OQkxPQ0spOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZjbnRsKHNvY2tldCwgRl9TRVRGTCwgZmNudGwoc29ja2V0LCBGX0dFVEZMKSAmIH5PX05PTkJMT0NLKTsKKyNlbmRpZiAvKiBIQVZFX1dJTlNPQ0syX0ggKi8KK30KKworI2lmICFIQVZFX1BPTExfSAoraW50IGZmX3BvbGwoc3RydWN0IHBvbGxmZCAqZmRzLCBuZmRzX3QgbnVtZmRzLCBpbnQgdGltZW91dCkKK3sKKyAgICBmZF9zZXQgcmVhZF9zZXQ7CisgICAgZmRfc2V0IHdyaXRlX3NldDsKKyAgICBmZF9zZXQgZXhjZXB0aW9uX3NldDsKKyAgICBuZmRzX3QgaTsKKyAgICBpbnQgbjsKKyAgICBpbnQgcmM7CisKKyNpZiBIQVZFX1dJTlNPQ0syX0gKKyAgICBpZiAobnVtZmRzID49IEZEX1NFVFNJWkUpIHsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9XSU5TT0NLMl9IICovCisKKyAgICBGRF9aRVJPKCZyZWFkX3NldCk7CisgICAgRkRfWkVSTygmd3JpdGVfc2V0KTsKKyAgICBGRF9aRVJPKCZleGNlcHRpb25fc2V0KTsKKworICAgIG4gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1mZHM7IGkrKykgeworICAgICAgICBpZiAoZmRzW2ldLmZkIDwgMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworI2lmICFIQVZFX1dJTlNPQ0syX0gKKyAgICAgICAgaWYgKGZkc1tpXS5mZCA+PSBGRF9TRVRTSVpFKSB7CisgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorI2VuZGlmIC8qICFIQVZFX1dJTlNPQ0syX0ggKi8KKworICAgICAgICBpZiAoZmRzW2ldLmV2ZW50cyAmIFBPTExJTikKKyAgICAgICAgICAgIEZEX1NFVChmZHNbaV0uZmQsICZyZWFkX3NldCk7CisgICAgICAgIGlmIChmZHNbaV0uZXZlbnRzICYgUE9MTE9VVCkKKyAgICAgICAgICAgIEZEX1NFVChmZHNbaV0uZmQsICZ3cml0ZV9zZXQpOworICAgICAgICBpZiAoZmRzW2ldLmV2ZW50cyAmIFBPTExFUlIpCisgICAgICAgICAgICBGRF9TRVQoZmRzW2ldLmZkLCAmZXhjZXB0aW9uX3NldCk7CisKKyAgICAgICAgaWYgKGZkc1tpXS5mZCA+PSBuKQorICAgICAgICAgICAgbiA9IGZkc1tpXS5mZCArIDE7CisgICAgfQorCisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgLyogSGV5IT8gTm90aGluZyB0byBwb2xsLCBpbiBmYWN0ISEhICovCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHRpbWVvdXQgPCAwKSB7CisgICAgICAgIHJjID0gc2VsZWN0KG4sICZyZWFkX3NldCwgJndyaXRlX3NldCwgJmV4Y2VwdGlvbl9zZXQsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICB0di50dl9zZWMgID0gdGltZW91dCAvIDEwMDA7CisgICAgICAgIHR2LnR2X3VzZWMgPSAxMDAwICogKHRpbWVvdXQgJSAxMDAwKTsKKyAgICAgICAgcmMgICAgICAgICA9IHNlbGVjdChuLCAmcmVhZF9zZXQsICZ3cml0ZV9zZXQsICZleGNlcHRpb25fc2V0LCAmdHYpOworICAgIH0KKworICAgIGlmIChyYyA8IDApCisgICAgICAgIHJldHVybiByYzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1mZHM7IGkrKykgeworICAgICAgICBmZHNbaV0ucmV2ZW50cyA9IDA7CisKKyAgICAgICAgaWYgKEZEX0lTU0VUKGZkc1tpXS5mZCwgJnJlYWRfc2V0KSkKKyAgICAgICAgICAgIGZkc1tpXS5yZXZlbnRzIHw9IFBPTExJTjsKKyAgICAgICAgaWYgKEZEX0lTU0VUKGZkc1tpXS5mZCwgJndyaXRlX3NldCkpCisgICAgICAgICAgICBmZHNbaV0ucmV2ZW50cyB8PSBQT0xMT1VUOworICAgICAgICBpZiAoRkRfSVNTRVQoZmRzW2ldLmZkLCAmZXhjZXB0aW9uX3NldCkpCisgICAgICAgICAgICBmZHNbaV0ucmV2ZW50cyB8PSBQT0xMRVJSOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKyNlbmRpZiAvKiAhSEFWRV9QT0xMX0ggKi8KKworI2VuZGlmIC8qIENPTkZJR19ORVRXT1JLICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvb3Nfc3VwcG9ydC5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29zX3N1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmFlNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L29zX3N1cHBvcnQuaApAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIHZhcmlvdXMgT1MtZmVhdHVyZSByZXBsYWNlbWVudCB1dGlsaXRpZXMKKyAqIGNvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9PU19TVVBQT1JUX0gKKyNkZWZpbmUgQVZGT1JNQVRfT1NfU1VQUE9SVF9ICisKKy8qKgorICogQGZpbGUKKyAqIG1pc2NlbGxhbmVvdXMgT1Mgc3VwcG9ydCBtYWNyb3MgYW5kIGZ1bmN0aW9ucy4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWZkZWYgX1dJTjMyCisjaWYgSEFWRV9ESVJFQ1RfSAorI2luY2x1ZGUgPGRpcmVjdC5oPgorI2VuZGlmCisjaWYgSEFWRV9JT19ICisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19NSU5HVzMyQ0VfXykKKyMgIGluY2x1ZGUgPGZjbnRsLmg+CisjICBpZmRlZiBsc2VlaworIyAgIHVuZGVmIGxzZWVrCisjICBlbmRpZgorIyAgZGVmaW5lIGxzZWVrKGYscCx3KSBfbHNlZWtpNjQoKGYpLCAocCksICh3KSkKKyMgIGlmZGVmIHN0YXQKKyMgICB1bmRlZiBzdGF0CisjICBlbmRpZgorIyAgZGVmaW5lIHN0YXQgX3N0YXRpNjQKKyMgIGlmZGVmIGZzdGF0CisjICAgdW5kZWYgZnN0YXQKKyMgIGVuZGlmCisjICBkZWZpbmUgZnN0YXQoZixzKSBfZnN0YXRpNjQoKGYpLCAocykpCisjZW5kaWYgLyogZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fTUlOR1czMkNFX18pICovCisKKworI2lmZGVmIF9fQU5EUk9JRF9fCisjICBpZiBIQVZFX1VOSVNURF9ICisjICAgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyAgZW5kaWYKKyMgIGlmZGVmIGxzZWVrCisjICAgdW5kZWYgbHNlZWsKKyMgIGVuZGlmCisjICBkZWZpbmUgbHNlZWsoZixwLHcpIGxzZWVrNjQoKGYpLCAocCksICh3KSkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBpc19kb3NfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworI2lmIEhBVkVfRE9TX1BBVEhTCisgICAgaWYgKHBhdGhbMF0gJiYgcGF0aFsxXSA9PSAnOicpCisgICAgICAgIHJldHVybiAxOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKF9fT1MyX18pIHx8IGRlZmluZWQoX19QbGFuOV9fKQorI2RlZmluZSBTSFVUX1JEIDAKKyNkZWZpbmUgU0hVVF9XUiAxCisjZGVmaW5lIFNIVVRfUkRXUiAyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX1dJTjMyKQorI2RlZmluZSBTSFVUX1JEIFNEX1JFQ0VJVkUKKyNkZWZpbmUgU0hVVF9XUiBTRF9TRU5ECisjZGVmaW5lIFNIVVRfUkRXUiBTRF9CT1RICisKKyNpZm5kZWYgU19JUlVTUgorI2RlZmluZSBTX0lSVVNSIFNfSVJFQUQKKyNlbmRpZgorI2lmbmRlZiBTX0lXVVNSCisjZGVmaW5lIFNfSVdVU1IgU19JV1JJVEUKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBDT05GSUdfTkVUV09SSworI2lmICFIQVZFX1NPQ0tMRU5fVAordHlwZWRlZiBpbnQgc29ja2xlbl90OworI2VuZGlmCisKKy8qIG1vc3Qgb2YgdGhlIHRpbWUgY2xvc2luZyBhIHNvY2tldCBpcyBqdXN0IGNsb3NpbmcgYW4gZmQgKi8KKyNpZiAhSEFWRV9DTE9TRVNPQ0tFVAorI2RlZmluZSBjbG9zZXNvY2tldCBjbG9zZQorI2VuZGlmCisKKyNpZiAhSEFWRV9QT0xMX0gKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBuZmRzX3Q7CisKKyNpZiBIQVZFX1dJTlNPQ0syX0gKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2VuZGlmCisjaWYgIUhBVkVfU1RSVUNUX1BPTExGRAorc3RydWN0IHBvbGxmZCB7CisgICAgaW50IGZkOworICAgIHNob3J0IGV2ZW50czsgIC8qIGV2ZW50cyB0byBsb29rIGZvciAqLworICAgIHNob3J0IHJldmVudHM7IC8qIGV2ZW50cyB0aGF0IG9jY3VycmVkICovCit9OworCisvKiBldmVudHMgJiByZXZlbnRzICovCisjZGVmaW5lIFBPTExJTiAgICAgMHgwMDAxICAvKiBhbnkgcmVhZGFibGUgZGF0YSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgUE9MTE9VVCAgICAweDAwMDIgIC8qIGZpbGUgZGVzY3JpcHRvciBpcyB3cml0ZWFibGUgKi8KKyNkZWZpbmUgUE9MTFJETk9STSBQT0xMSU4KKyNkZWZpbmUgUE9MTFdSTk9STSBQT0xMT1VUCisjZGVmaW5lIFBPTExSREJBTkQgMHgwMDA4ICAvKiBwcmlvcml0eSByZWFkYWJsZSBkYXRhICovCisjZGVmaW5lIFBPTExXUkJBTkQgMHgwMDEwICAvKiBwcmlvcml0eSBkYXRhIGNhbiBiZSB3cml0dGVuICovCisjZGVmaW5lIFBPTExQUkkgICAgMHgwMDIwICAvKiBoaWdoIHByaW9yaXR5IHJlYWRhYmxlIGRhdGEgKi8KKworLyogcmV2ZW50cyBvbmx5ICovCisjZGVmaW5lIFBPTExFUlIgICAgMHgwMDA0ICAvKiBlcnJvcnMgcGVuZGluZyAqLworI2RlZmluZSBQT0xMSFVQICAgIDB4MDA4MCAgLyogZGlzY29ubmVjdGVkICovCisjZGVmaW5lIFBPTExOVkFMICAgMHgxMDAwICAvKiBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvciAqLworI2VuZGlmCisKKworaW50IGZmX3BvbGwoc3RydWN0IHBvbGxmZCAqZmRzLCBuZmRzX3QgbnVtZmRzLCBpbnQgdGltZW91dCk7CisjZGVmaW5lIHBvbGwgZmZfcG9sbAorI2VuZGlmIC8qIEhBVkVfUE9MTF9IICovCisjZW5kaWYgLyogQ09ORklHX05FVFdPUksgKi8KKworI2lmIGRlZmluZWQoX19NSU5HVzMyQ0VfXykKKyNkZWZpbmUgbWtkaXIoYSwgYikgX21rZGlyKGEpCisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvd2NoYXJfZmlsZW5hbWUuaCIKKworI2RlZmluZSBERUZfRlNfRlVOQ1RJT04obmFtZSwgd2Z1bmMsIGFmdW5jKSAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgaW50IHdpbjMyXyMjbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZV91dGY4KSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdjaGFyX3QgKmZpbGVuYW1lX3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh1dGY4dG93Y2hhcihmaWxlbmFtZV91dGY4LCAmZmlsZW5hbWVfdykpICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFmaWxlbmFtZV93KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIGZhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0ID0gd2Z1bmMoZmlsZW5hbWVfdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2ZyZWUoZmlsZW5hbWVfdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZmFsbGJhY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBmaWxlbmFtZSBtYXkgYmUgYmUgaW4gQ1BfQUNQICovICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGFmdW5jKGZpbGVuYW1lX3V0ZjgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitERUZfRlNfRlVOQ1RJT04odW5saW5rLCBfd3VubGluaywgX3VubGluaykKK0RFRl9GU19GVU5DVElPTihta2RpciwgIF93bWtkaXIsICBfbWtkaXIpCitERUZfRlNfRlVOQ1RJT04ocm1kaXIsICBfd3JtZGlyICwgX3JtZGlyKQorCitzdGF0aWMgaW5saW5lIGludCB3aW4zMl9yZW5hbWUoY29uc3QgY2hhciAqc3JjX3V0ZjgsIGNvbnN0IGNoYXIgKmRlc3RfdXRmOCkKK3sKKyAgICB3Y2hhcl90ICpzcmNfdywgKmRlc3RfdzsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHV0Zjh0b3djaGFyKHNyY191dGY4LCAmc3JjX3cpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHV0Zjh0b3djaGFyKGRlc3RfdXRmOCwgJmRlc3RfdykpIHsKKyAgICAgICAgYXZfZnJlZShzcmNfdyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFzcmNfdyB8fCAhZGVzdF93KSB7CisgICAgICAgIGF2X2ZyZWUoc3JjX3cpOworICAgICAgICBhdl9mcmVlKGRlc3Rfdyk7CisgICAgICAgIGdvdG8gZmFsbGJhY2s7CisgICAgfQorCisgICAgcmV0ID0gTW92ZUZpbGVFeFcoc3JjX3csIGRlc3RfdywgTU9WRUZJTEVfUkVQTEFDRV9FWElTVElORyk7CisgICAgYXZfZnJlZShzcmNfdyk7CisgICAgYXZfZnJlZShkZXN0X3cpOworICAgIC8vIExhY2tpbmcgcHJvcGVyIG1hcHBpbmcgZnJvbSBHZXRMYXN0RXJyb3IoKSBlcnJvciBjb2RlcyB0byBlcnJubyBjb2RlcworICAgIGlmIChyZXQpCisgICAgICAgIGVycm5vID0gRVBFUk07CisgICAgcmV0dXJuIHJldDsKKworZmFsbGJhY2s6CisgICAgLyogZmlsZW5hbWUgbWF5IGJlIGJlIGluIENQX0FDUCAqLworI2lmIEhBVkVfTU9WRUZJTEVFWEEKKyAgICByZXQgPSBNb3ZlRmlsZUV4QShzcmNfdXRmOCwgZGVzdF91dGY4LCBNT1ZFRklMRV9SRVBMQUNFX0VYSVNUSU5HKTsKKyAgICBpZiAocmV0KQorICAgICAgICBlcnJubyA9IEVQRVJNOworI2Vsc2UKKyAgICAvKiBXaW5kb3dzIFBob25lIGRvZXNuJ3QgaGF2ZSBNb3ZlRmlsZUV4QS4gSG93ZXZlciwgaXQncyB1bmxpa2VseQorICAgICAqIHRoYXQgYW55Ym9keSB3b3VsZCBpbnB1dCBmaWxlbmFtZXMgaW4gQ1BfQUNQIHRoZXJlLCBzbyB0aGlzCisgICAgICogZmFsbGJhY2sgaXMga2VwdCBtb3N0bHkgZm9yIGNvbXBsZXRlbmVzcy4gQWx0ZXJuYXRpdmVseSB3ZSBjb3VsZAorICAgICAqIGRvIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQKSBhbmQgdXNlIE1vdmVGaWxlRXhXLCBidXQgZG9pbmcKKyAgICAgKiBleHBsaWNpdCBjb252ZXJzaW9ucyB3aXRoIENQX0FDUCBpcyBhbGxlZ2VkbHkgZm9yYmlkZGVuIGluIHdpbmRvd3MKKyAgICAgKiBzdG9yZSBhcHBzIChvciB3aW5kb3dzIHBob25lKSwgYW5kIHRoZSBub3Rpb24gb2YgYSBuYXRpdmUgY29kZSBwYWdlCisgICAgICogZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgdGhlcmUuICovCisgICAgcmV0ID0gcmVuYW1lKHNyY191dGY4LCBkZXN0X3V0ZjgpOworI2VuZGlmCisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBta2RpcihhLCBiKSB3aW4zMl9ta2RpcihhKQorI2RlZmluZSByZW5hbWUgICAgICB3aW4zMl9yZW5hbWUKKyNkZWZpbmUgcm1kaXIgICAgICAgd2luMzJfcm1kaXIKKyNkZWZpbmUgdW5saW5rICAgICAgd2luMzJfdW5saW5rCisKKyNlbmRpZgorCisjZW5kaWYgLyogQVZGT1JNQVRfT1NfU1VQUE9SVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcGFmLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcGFmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4OTk0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9wYWYuYwpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIFBhY2tlZCBBbmltYXRpb24gRmlsZSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3BhZi5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBNQUdJQyAiUGFja2VkIEFuaW1hdGlvbiBGaWxlIFYxLjBcbihjKSAxOTkyLTk2IEFtYXppbmcgU3R1ZGlvXHgwYVx4MWEiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBidWZmZXJfc2l6ZTsKKyAgICB1aW50MzJfdCBmcmFtZV9ibGtzOworICAgIHVpbnQzMl90IG5iX2ZyYW1lczsKKyAgICB1aW50MzJfdCBzdGFydF9vZmZzZXQ7CisgICAgdWludDMyX3QgcHJlbG9hZF9jb3VudDsKKyAgICB1aW50MzJfdCBtYXhfdmlkZW9fYmxrczsKKyAgICB1aW50MzJfdCBtYXhfYXVkaW9fYmxrczsKKworICAgIHVpbnQzMl90IGN1cnJlbnRfZnJhbWU7CisgICAgdWludDMyX3QgY3VycmVudF9mcmFtZV9jb3VudDsKKyAgICB1aW50MzJfdCBjdXJyZW50X2ZyYW1lX2Jsb2NrOworCisgICAgdWludDMyX3QgKmJsb2Nrc19jb3VudF90YWJsZTsKKyAgICB1aW50MzJfdCAqZnJhbWVzX29mZnNldF90YWJsZTsKKyAgICB1aW50MzJfdCAqYmxvY2tzX29mZnNldF90YWJsZTsKKworICAgIHVpbnQ4X3QgICp2aWRlb19mcmFtZTsKKyAgICBpbnQgdmlkZW9fc2l6ZTsKKworICAgIHVpbnQ4X3QgICphdWRpb19mcmFtZTsKKyAgICB1aW50OF90ICAqdGVtcF9hdWRpb19mcmFtZTsKKyAgICBpbnQgYXVkaW9fc2l6ZTsKKworICAgIGludCBnb3RfYXVkaW87Cit9IFBBRkRlbXV4Q29udGV4dDsKKworc3RhdGljIGludCByZWFkX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmICgocC0+YnVmX3NpemUgPj0gc3RybGVuKE1BR0lDKSkgJiYKKyAgICAgICAgIW1lbWNtcChwLT5idWYsIE1BR0lDLCBzdHJsZW4oTUFHSUMpKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFBBRkRlbXV4Q29udGV4dCAqcCA9IHMtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZwLT5ibG9ja3NfY291bnRfdGFibGUpOworICAgIGF2X2ZyZWVwKCZwLT5mcmFtZXNfb2Zmc2V0X3RhYmxlKTsKKyAgICBhdl9mcmVlcCgmcC0+YmxvY2tzX29mZnNldF90YWJsZSk7CisgICAgYXZfZnJlZXAoJnAtPnZpZGVvX2ZyYW1lKTsKKyAgICBhdl9mcmVlcCgmcC0+YXVkaW9fZnJhbWUpOworICAgIGF2X2ZyZWVwKCZwLT50ZW1wX2F1ZGlvX2ZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZWFkX3RhYmxlKEFWRm9ybWF0Q29udGV4dCAqcywgdWludDMyX3QgKnRhYmxlLCB1aW50MzJfdCBjb3VudCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICB0YWJsZVtpXSA9IGF2aW9fcmwzMihzLT5wYik7CisKKyAgICBhdmlvX3NraXAocy0+cGIsIDQgKiAoRkZBTElHTihjb3VudCwgNTEyKSAtIGNvdW50KSk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFBBRkRlbXV4Q29udGV4dCAqcCAgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgICAgICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICAgICAgICAqYXN0LCAqdnN0OworICAgIGludCByZXQgPSAwOworCisgICAgYXZpb19za2lwKHBiLCAxMzIpOworCisgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKKyAgICBpZiAoIXZzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHZzdC0+c3RhcnRfdGltZSA9IDA7CisgICAgdnN0LT5uYl9mcmFtZXMgID0KKyAgICB2c3QtPmR1cmF0aW9uICAgPQorICAgIHAtPm5iX2ZyYW1lcyAgICA9IGF2aW9fcmwzMihwYik7CisgICAgYXZpb19za2lwKHBiLCA0KTsKKworICAgIHZzdC0+Y29kZWMtPndpZHRoICA9IGF2aW9fcmwzMihwYik7CisgICAgdnN0LT5jb2RlYy0+aGVpZ2h0ID0gYXZpb19ybDMyKHBiKTsKKyAgICBhdmlvX3NraXAocGIsIDQpOworCisgICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcgID0gMDsKKyAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUEFGX1ZJREVPOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgMSwgMTApOworCisgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKKyAgICBpZiAoIWFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGFzdC0+c3RhcnRfdGltZSAgICAgICAgICAgID0gMDsKKyAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhc3QtPmNvZGVjLT5jb2RlY190YWcgICAgICA9IDA7CisgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9QQUZfQVVESU87CisgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICA9IDIyMDUwOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgMjIwNTApOworCisgICAgcC0+YnVmZmVyX3NpemUgICAgPSBhdmlvX3JsMzIocGIpOworICAgIHAtPnByZWxvYWRfY291bnQgID0gYXZpb19ybDMyKHBiKTsKKyAgICBwLT5mcmFtZV9ibGtzICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgcC0+c3RhcnRfb2Zmc2V0ICAgPSBhdmlvX3JsMzIocGIpOworICAgIHAtPm1heF92aWRlb19ibGtzID0gYXZpb19ybDMyKHBiKTsKKyAgICBwLT5tYXhfYXVkaW9fYmxrcyA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKHAtPmJ1ZmZlcl9zaXplICAgIDwgMTc1ICB8fAorICAgICAgICBwLT5tYXhfYXVkaW9fYmxrcyA8IDIgICAgfHwKKyAgICAgICAgcC0+bWF4X3ZpZGVvX2Jsa3MgPCAxICAgIHx8CisgICAgICAgIHAtPmZyYW1lX2Jsa3MgICAgIDwgMSAgICB8fAorICAgICAgICBwLT5uYl9mcmFtZXMgICAgICA8IDEgICAgfHwKKyAgICAgICAgcC0+cHJlbG9hZF9jb3VudCAgPCAxICAgIHx8CisgICAgICAgIHAtPmJ1ZmZlcl9zaXplICAgID4gMjA0OCB8fAorICAgICAgICBwLT5tYXhfdmlkZW9fYmxrcyA+IDIwNDggfHwKKyAgICAgICAgcC0+bWF4X2F1ZGlvX2Jsa3MgPiAyMDQ4IHx8CisgICAgICAgIHAtPm5iX2ZyYW1lcyAgICAgID4gSU5UX01BWCAvIHNpemVvZih1aW50MzJfdCkgfHwKKyAgICAgICAgcC0+ZnJhbWVfYmxrcyAgICAgPiBJTlRfTUFYIC8gc2l6ZW9mKHVpbnQzMl90KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBwLT5ibG9ja3NfY291bnRfdGFibGUgID0gYXZfbWFsbG9jeihwLT5uYl9mcmFtZXMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcC0+YmxvY2tzX2NvdW50X3RhYmxlKSk7CisgICAgcC0+ZnJhbWVzX29mZnNldF90YWJsZSA9IGF2X21hbGxvY3oocC0+bmJfZnJhbWVzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnAtPmZyYW1lc19vZmZzZXRfdGFibGUpKTsKKyAgICBwLT5ibG9ja3Nfb2Zmc2V0X3RhYmxlID0gYXZfbWFsbG9jeihwLT5mcmFtZV9ibGtzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnAtPmJsb2Nrc19vZmZzZXRfdGFibGUpKTsKKworICAgIHAtPnZpZGVvX3NpemUgID0gcC0+bWF4X3ZpZGVvX2Jsa3MgKiBwLT5idWZmZXJfc2l6ZTsKKyAgICBwLT52aWRlb19mcmFtZSA9IGF2X21hbGxvY3oocC0+dmlkZW9fc2l6ZSk7CisKKyAgICBwLT5hdWRpb19zaXplICAgICAgID0gcC0+bWF4X2F1ZGlvX2Jsa3MgKiBwLT5idWZmZXJfc2l6ZTsKKyAgICBwLT5hdWRpb19mcmFtZSAgICAgID0gYXZfbWFsbG9jeihwLT5hdWRpb19zaXplKTsKKyAgICBwLT50ZW1wX2F1ZGlvX2ZyYW1lID0gYXZfbWFsbG9jeihwLT5hdWRpb19zaXplKTsKKworICAgIGlmICghcC0+YmxvY2tzX2NvdW50X3RhYmxlICB8fAorICAgICAgICAhcC0+ZnJhbWVzX29mZnNldF90YWJsZSB8fAorICAgICAgICAhcC0+YmxvY2tzX29mZnNldF90YWJsZSB8fAorICAgICAgICAhcC0+dmlkZW9fZnJhbWUgICAgICAgICB8fAorICAgICAgICAhcC0+YXVkaW9fZnJhbWUgICAgICAgICB8fAorICAgICAgICAhcC0+dGVtcF9hdWRpb19mcmFtZSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdmlvX3NlZWsocGIsIHAtPmJ1ZmZlcl9zaXplLCBTRUVLX1NFVCk7CisKKyAgICByZWFkX3RhYmxlKHMsIHAtPmJsb2Nrc19jb3VudF90YWJsZSwgIHAtPm5iX2ZyYW1lcyk7CisgICAgcmVhZF90YWJsZShzLCBwLT5mcmFtZXNfb2Zmc2V0X3RhYmxlLCBwLT5uYl9mcmFtZXMpOworICAgIHJlYWRfdGFibGUocywgcC0+YmxvY2tzX29mZnNldF90YWJsZSwgcC0+ZnJhbWVfYmxrcyk7CisKKyAgICBwLT5nb3RfYXVkaW8gPSAwOworICAgIHAtPmN1cnJlbnRfZnJhbWUgPSAwOworICAgIHAtPmN1cnJlbnRfZnJhbWVfYmxvY2sgPSAwOworCisgICAgYXZpb19zZWVrKHBiLCBwLT5zdGFydF9vZmZzZXQsIFNFRUtfU0VUKTsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIHJlYWRfY2xvc2Uocyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBQQUZEZW11eENvbnRleHQgKnAgID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICAgICAqcGIgPSBzLT5wYjsKKyAgICB1aW50MzJfdCAgICAgICAgY291bnQsIG9mZnNldDsKKyAgICBpbnQgICAgICAgICAgICAgc2l6ZSwgaTsKKworICAgIGlmIChwLT5jdXJyZW50X2ZyYW1lID49IHAtPm5iX2ZyYW1lcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGlmIChwLT5nb3RfYXVkaW8pIHsKKyAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBwLT5hdWRpb19zaXplKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIHAtPnRlbXBfYXVkaW9fZnJhbWUsIHAtPmF1ZGlvX3NpemUpOworICAgICAgICBwa3QtPmR1cmF0aW9uICAgICA9IFBBRl9TT1VORF9TQU1QTEVTICogKHAtPmF1ZGlvX3NpemUgLyBQQUZfU09VTkRfRlJBTUVfU0laRSk7CisgICAgICAgIHBrdC0+ZmxhZ3MgICAgICAgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDE7CisgICAgICAgIHAtPmdvdF9hdWRpbyAgICAgID0gMDsKKyAgICAgICAgcmV0dXJuIHBrdC0+c2l6ZTsKKyAgICB9CisKKyAgICBjb3VudCA9IChwLT5jdXJyZW50X2ZyYW1lID09IDApID8gcC0+cHJlbG9hZF9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwLT5ibG9ja3NfY291bnRfdGFibGVbcC0+Y3VycmVudF9mcmFtZSAtIDFdOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChwLT5jdXJyZW50X2ZyYW1lX2Jsb2NrID49IHAtPmZyYW1lX2Jsa3MpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBvZmZzZXQgPSBwLT5ibG9ja3Nfb2Zmc2V0X3RhYmxlW3AtPmN1cnJlbnRfZnJhbWVfYmxvY2tdICYgfigxVSA8PCAzMSk7CisgICAgICAgIGlmIChwLT5ibG9ja3Nfb2Zmc2V0X3RhYmxlW3AtPmN1cnJlbnRfZnJhbWVfYmxvY2tdICYgKDFVIDw8IDMxKSkgeworICAgICAgICAgICAgaWYgKG9mZnNldCA+IHAtPmF1ZGlvX3NpemUgLSBwLT5idWZmZXJfc2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgYXZpb19yZWFkKHBiLCBwLT5hdWRpb19mcmFtZSArIG9mZnNldCwgcC0+YnVmZmVyX3NpemUpOworICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAocC0+bWF4X2F1ZGlvX2Jsa3MgLSAyKSAqIHAtPmJ1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHAtPnRlbXBfYXVkaW9fZnJhbWUsIHAtPmF1ZGlvX2ZyYW1lLCBwLT5hdWRpb19zaXplKTsKKyAgICAgICAgICAgICAgICBwLT5nb3RfYXVkaW8gPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG9mZnNldCA+IHAtPnZpZGVvX3NpemUgLSBwLT5idWZmZXJfc2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgYXZpb19yZWFkKHBiLCBwLT52aWRlb19mcmFtZSArIG9mZnNldCwgcC0+YnVmZmVyX3NpemUpOworICAgICAgICB9CisgICAgICAgIHAtPmN1cnJlbnRfZnJhbWVfYmxvY2srKzsKKyAgICB9CisKKyAgICBpZiAocC0+ZnJhbWVzX29mZnNldF90YWJsZVtwLT5jdXJyZW50X2ZyYW1lXSA+PSBwLT52aWRlb19zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHNpemUgPSBwLT52aWRlb19zaXplIC0gcC0+ZnJhbWVzX29mZnNldF90YWJsZVtwLT5jdXJyZW50X2ZyYW1lXTsKKworICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIHBrdC0+ZHVyYXRpb24gICAgID0gMTsKKyAgICBtZW1jcHkocGt0LT5kYXRhLCBwLT52aWRlb19mcmFtZSArIHAtPmZyYW1lc19vZmZzZXRfdGFibGVbcC0+Y3VycmVudF9mcmFtZV0sIHNpemUpOworICAgIGlmIChwa3QtPmRhdGFbMF0gJiAweDIwKQorICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICBwLT5jdXJyZW50X2ZyYW1lKys7CisKKyAgICByZXR1cm4gcGt0LT5zaXplOworfQorCitBVklucHV0Rm9ybWF0IGZmX3BhZl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwYWYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBbWF6aW5nIFN0dWRpbyBQYWNrZWQgQW5pbWF0aW9uIEZpbGUiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUEFGRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSByZWFkX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHJlYWRfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3BjbS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3BjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1N2E0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcGNtLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIFBDTSBjb21tb24gZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInBjbS5oIgorCisjZGVmaW5lIFJBV19TQU1QTEVTICAgICAxMDI0CisKK2ludCBmZl9wY21fcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGludCByZXQsIHNpemU7CisKKyAgICBzaXplPSBSQVdfU0FNUExFUypzLT5zdHJlYW1zWzBdLT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgaWYgKHNpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHJldD0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzaXplKTsKKworICAgIHBrdC0+ZmxhZ3MgJj0gfkFWX1BLVF9GTEFHX0NPUlJVUFQ7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX3BjbV9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IGJsb2NrX2FsaWduLCBieXRlX3JhdGU7CisgICAgaW50NjRfdCBwb3MsIHJldDsKKworICAgIHN0ID0gcy0+c3RyZWFtc1swXTsKKworICAgIGJsb2NrX2FsaWduID0gc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA/IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gOgorICAgICAgICAoYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKSAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMpID4+IDM7CisgICAgYnl0ZV9yYXRlID0gc3QtPmNvZGVjLT5iaXRfcmF0ZSA/IHN0LT5jb2RlYy0+Yml0X3JhdGUgPj4gMyA6CisgICAgICAgIGJsb2NrX2FsaWduICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKKworICAgIGlmIChibG9ja19hbGlnbiA8PSAwIHx8IGJ5dGVfcmF0ZSA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHRpbWVzdGFtcCA8IDApIHRpbWVzdGFtcCA9IDA7CisKKyAgICAvKiBjb21wdXRlIHRoZSBwb3NpdGlvbiBieSBhbGlnbmluZyBpdCB0byBibG9ja19hbGlnbiAqLworICAgIHBvcyA9IGF2X3Jlc2NhbGVfcm5kKHRpbWVzdGFtcCAqIGJ5dGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlLmRlbiAqIChpbnQ2NF90KWJsb2NrX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFWU0VFS19GTEFHX0JBQ0tXQVJEKSA/IEFWX1JPVU5EX0RPV04gOiBBVl9ST1VORF9VUCk7CisgICAgcG9zICo9IGJsb2NrX2FsaWduOworCisgICAgLyogcmVjb21wdXRlIGV4YWN0IHBvc2l0aW9uICovCisgICAgc3QtPmN1cl9kdHMgPSBhdl9yZXNjYWxlKHBvcywgc3QtPnRpbWVfYmFzZS5kZW4sIGJ5dGVfcmF0ZSAqIChpbnQ2NF90KXN0LT50aW1lX2Jhc2UubnVtKTsKKyAgICBpZiAoKHJldCA9IGF2aW9fc2VlayhzLT5wYiwgcG9zICsgcy0+ZGF0YV9vZmZzZXQsIFNFRUtfU0VUKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3BjbS5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3BjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjM2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcGNtLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIFBDTSBjb21tb24gZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9QQ01fSAorI2RlZmluZSBBVkZPUk1BVF9QQ01fSAorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworaW50IGZmX3BjbV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpOworaW50IGZmX3BjbV9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncyk7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9QQ01fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3BjbWRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3BjbWRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODRjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcGNtZGVjLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBSQVcgUENNIGRlbXV4ZXJzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicGNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUENNQXVkaW9EZW11eGVyQ29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGludCBjaGFubmVsczsKK30gUENNQXVkaW9EZW11eGVyQ29udGV4dDsKKworc3RhdGljIGludCBwY21fcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFBDTUF1ZGlvRGVtdXhlckNvbnRleHQgKnMxID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBzLT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHMxLT5zYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gczEtPmNoYW5uZWxzOworCisgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPQorICAgICAgICBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlYy0+Y29kZWNfaWQpOworCisgICAgYXZfYXNzZXJ0MChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA+IDApOworCisgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9CisgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogc3QtPmNvZGVjLT5jaGFubmVscyAvIDg7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBwY21fb3B0aW9uc1tdID0geworICAgIHsgInNhbXBsZV9yYXRlIiwgIiIsIG9mZnNldG9mKFBDTUF1ZGlvRGVtdXhlckNvbnRleHQsIHNhbXBsZV9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDQ0MTAwfSwgMCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJjaGFubmVscyIsICAgICIiLCBvZmZzZXRvZihQQ01BdWRpb0RlbXV4ZXJDb250ZXh0LCBjaGFubmVscyksICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgMCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKKyNkZWZpbmUgUENNREVGKG5hbWVfLCBsb25nX25hbWVfLCBleHQsIGNvZGVjKSAgICAgICAgICAgICAgIFwKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG5hbWVfICMjIF9kZW11eGVyX2NsYXNzID0geyAgICAgICAgICAgIFwKKyAgICAuY2xhc3NfbmFtZSA9ICNuYW1lXyAiIGRlbXV4ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub3B0aW9uICAgICA9IHBjbV9vcHRpb25zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwgICAgICAgICAgICAgICAgICAgIFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0FWSW5wdXRGb3JtYXQgZmZfcGNtXyAjIyBuYW1lXyAjIyBfZGVtdXhlciA9IHsgICAgICAgICAgICAgIFwKKyAgICAubmFtZSAgICAgICAgICAgPSAjbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChsb25nX25hbWVfKSwgICAgIFwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUENNQXVkaW9EZW11eGVyQ29udGV4dCksICAgICAgIFwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBwY21fcmVhZF9oZWFkZXIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmZl9wY21fcmVhZF9wYWNrZXQsICAgICAgICAgICAgICAgICAgIFwKKyAgICAucmVhZF9zZWVrICAgICAgPSBmZl9wY21fcmVhZF9zZWVrLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLCAgICAgICAgICAgICAgICAgIFwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSBleHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBjb2RlYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmbmFtZV8gIyMgX2RlbXV4ZXJfY2xhc3MsICAgICAgICAgICAgIFwKK307CisKK1BDTURFRihmNjRiZSwgIlBDTSA2NC1iaXQgZmxvYXRpbmctcG9pbnQgYmlnLWVuZGlhbiIsCisgICAgICAgTlVMTCwgQVZfQ09ERUNfSURfUENNX0Y2NEJFKQorCitQQ01ERUYoZjY0bGUsICJQQ00gNjQtYml0IGZsb2F0aW5nLXBvaW50IGxpdHRsZS1lbmRpYW4iLAorICAgICAgIE5VTEwsIEFWX0NPREVDX0lEX1BDTV9GNjRMRSkKKworUENNREVGKGYzMmJlLCAiUENNIDMyLWJpdCBmbG9hdGluZy1wb2ludCBiaWctZW5kaWFuIiwKKyAgICAgICBOVUxMLCBBVl9DT0RFQ19JRF9QQ01fRjMyQkUpCisKK1BDTURFRihmMzJsZSwgIlBDTSAzMi1iaXQgZmxvYXRpbmctcG9pbnQgbGl0dGxlLWVuZGlhbiIsCisgICAgICAgTlVMTCwgQVZfQ09ERUNfSURfUENNX0YzMkxFKQorCitQQ01ERUYoczMyYmUsICJQQ00gc2lnbmVkIDMyLWJpdCBiaWctZW5kaWFuIiwKKyAgICAgICBOVUxMLCBBVl9DT0RFQ19JRF9QQ01fUzMyQkUpCisKK1BDTURFRihzMzJsZSwgIlBDTSBzaWduZWQgMzItYml0IGxpdHRsZS1lbmRpYW4iLAorICAgICAgIE5VTEwsIEFWX0NPREVDX0lEX1BDTV9TMzJMRSkKKworUENNREVGKHMyNGJlLCAiUENNIHNpZ25lZCAyNC1iaXQgYmlnLWVuZGlhbiIsCisgICAgICAgTlVMTCwgQVZfQ09ERUNfSURfUENNX1MyNEJFKQorCitQQ01ERUYoczI0bGUsICJQQ00gc2lnbmVkIDI0LWJpdCBsaXR0bGUtZW5kaWFuIiwKKyAgICAgICBOVUxMLCBBVl9DT0RFQ19JRF9QQ01fUzI0TEUpCisKK1BDTURFRihzMTZiZSwgIlBDTSBzaWduZWQgMTYtYml0IGJpZy1lbmRpYW4iLAorICAgICAgIEFWX05FKCJzdyIsIE5VTEwpLCBBVl9DT0RFQ19JRF9QQ01fUzE2QkUpCisKK1BDTURFRihzMTZsZSwgIlBDTSBzaWduZWQgMTYtYml0IGxpdHRsZS1lbmRpYW4iLAorICAgICAgIEFWX05FKE5VTEwsICJzdyIpLCBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpCisKK1BDTURFRihzOCwgIlBDTSBzaWduZWQgOC1iaXQiLAorICAgICAgICJzYiIsIEFWX0NPREVDX0lEX1BDTV9TOCkKKworUENNREVGKHUzMmJlLCAiUENNIHVuc2lnbmVkIDMyLWJpdCBiaWctZW5kaWFuIiwKKyAgICAgICBOVUxMLCBBVl9DT0RFQ19JRF9QQ01fVTMyQkUpCisKK1BDTURFRih1MzJsZSwgIlBDTSB1bnNpZ25lZCAzMi1iaXQgbGl0dGxlLWVuZGlhbiIsCisgICAgICAgTlVMTCwgQVZfQ09ERUNfSURfUENNX1UzMkxFKQorCitQQ01ERUYodTI0YmUsICJQQ00gdW5zaWduZWQgMjQtYml0IGJpZy1lbmRpYW4iLAorICAgICAgIE5VTEwsIEFWX0NPREVDX0lEX1BDTV9VMjRCRSkKKworUENNREVGKHUyNGxlLCAiUENNIHVuc2lnbmVkIDI0LWJpdCBsaXR0bGUtZW5kaWFuIiwKKyAgICAgICBOVUxMLCBBVl9DT0RFQ19JRF9QQ01fVTI0TEUpCisKK1BDTURFRih1MTZiZSwgIlBDTSB1bnNpZ25lZCAxNi1iaXQgYmlnLWVuZGlhbiIsCisgICAgICAgQVZfTkUoInV3IiwgTlVMTCksIEFWX0NPREVDX0lEX1BDTV9VMTZCRSkKKworUENNREVGKHUxNmxlLCAiUENNIHVuc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIiwKKyAgICAgICBBVl9ORShOVUxMLCAidXciKSwgQVZfQ09ERUNfSURfUENNX1UxNkxFKQorCitQQ01ERUYodTgsICJQQ00gdW5zaWduZWQgOC1iaXQiLAorICAgICAgICJ1YiIsIEFWX0NPREVDX0lEX1BDTV9VOCkKKworUENNREVGKGFsYXcsICJQQ00gQS1sYXciLAorICAgICAgICJhbCIsIEFWX0NPREVDX0lEX1BDTV9BTEFXKQorCitQQ01ERUYobXVsYXcsICJQQ00gbXUtbGF3IiwKKyAgICAgICAidWwiLCBBVl9DT0RFQ19JRF9QQ01fTVVMQVcpCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzbG5fb3B0aW9uc1tdID0geworICAgIHsgInNhbXBsZV9yYXRlIiwgIiIsIG9mZnNldG9mKFBDTUF1ZGlvRGVtdXhlckNvbnRleHQsIHNhbXBsZV9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDgwMDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgImNoYW5uZWxzIiwgICAgIiIsIG9mZnNldG9mKFBDTUF1ZGlvRGVtdXhlckNvbnRleHQsIGNoYW5uZWxzKSwgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDF9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgc2xuX2RlbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAic2xuIGRlbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBzbG5fb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfc2xuX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInNsbiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFzdGVyaXNrIHJhdyBwY20iKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUENNQXVkaW9EZW11eGVyQ29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgID0gcGNtX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZmX3BjbV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSBmZl9wY21fcmVhZF9zZWVrLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCisgICAgLmV4dGVuc2lvbnMgICAgID0gInNsbiIsCisgICAgLnJhd19jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZzbG5fZGVtdXhlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcGNtZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcGNtZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0ZjMwOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9wY21lbmMuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogUkFXIFBDTSBtdXhlcnMKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicmF3ZW5jLmgiCisKKyNkZWZpbmUgUENNREVGKG5hbWVfLCBsb25nX25hbWVfLCBleHQsIGNvZGVjKSAgICAgICAgICAgICAgIFwKK0FWT3V0cHV0Rm9ybWF0IGZmX3BjbV8gIyMgbmFtZV8gIyMgX211eGVyID0geyAgICAgICAgICAgICAgIFwKKyAgICAubmFtZSAgICAgICAgID0gI25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubG9uZ19uYW1lICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwobG9uZ19uYW1lXyksICAgICAgIFwKKyAgICAuZXh0ZW5zaW9ucyAgID0gZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuYXVkaW9fY29kZWMgID0gY29kZWMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudmlkZW9fY29kZWMgID0gQVZfQ09ERUNfSURfTk9ORSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAud3JpdGVfcGFja2V0ID0gZmZfcmF3X3dyaXRlX3BhY2tldCwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLCAgICAgICAgICAgICAgICAgICAgIFwKK307CisKK1BDTURFRihmNjRiZSwgIlBDTSA2NC1iaXQgZmxvYXRpbmctcG9pbnQgYmlnLWVuZGlhbiIsCisgICAgICAgTlVMTCwgQVZfQ09ERUNfSURfUENNX0Y2NEJFKQorCitQQ01ERUYoZjY0bGUsICJQQ00gNjQtYml0IGZsb2F0aW5nLXBvaW50IGxpdHRsZS1lbmRpYW4iLAorICAgICAgIE5VTEwsIEFWX0NPREVDX0lEX1BDTV9GNjRMRSkKKworUENNREVGKGYzMmJlLCAiUENNIDMyLWJpdCBmbG9hdGluZy1wb2ludCBiaWctZW5kaWFuIiwKKyAgICAgICBOVUxMLCBBVl9DT0RFQ19JRF9QQ01fRjMyQkUpCisKK1BDTURFRihmMzJsZSwgIlBDTSAzMi1iaXQgZmxvYXRpbmctcG9pbnQgbGl0dGxlLWVuZGlhbiIsCisgICAgICAgTlVMTCwgQVZfQ09ERUNfSURfUENNX0YzMkxFKQorCitQQ01ERUYoczMyYmUsICJQQ00gc2lnbmVkIDMyLWJpdCBiaWctZW5kaWFuIiwKKyAgICAgICBOVUxMLCBBVl9DT0RFQ19JRF9QQ01fUzMyQkUpCisKK1BDTURFRihzMzJsZSwgIlBDTSBzaWduZWQgMzItYml0IGxpdHRsZS1lbmRpYW4iLAorICAgICAgIE5VTEwsIEFWX0NPREVDX0lEX1BDTV9TMzJMRSkKKworUENNREVGKHMyNGJlLCAiUENNIHNpZ25lZCAyNC1iaXQgYmlnLWVuZGlhbiIsCisgICAgICAgTlVMTCwgQVZfQ09ERUNfSURfUENNX1MyNEJFKQorCitQQ01ERUYoczI0bGUsICJQQ00gc2lnbmVkIDI0LWJpdCBsaXR0bGUtZW5kaWFuIiwKKyAgICAgICBOVUxMLCBBVl9DT0RFQ19JRF9QQ01fUzI0TEUpCisKK1BDTURFRihzMTZiZSwgIlBDTSBzaWduZWQgMTYtYml0IGJpZy1lbmRpYW4iLAorICAgICAgIEFWX05FKCJzdyIsIE5VTEwpLCBBVl9DT0RFQ19JRF9QQ01fUzE2QkUpCisKK1BDTURFRihzMTZsZSwgIlBDTSBzaWduZWQgMTYtYml0IGxpdHRsZS1lbmRpYW4iLAorICAgICAgIEFWX05FKE5VTEwsICJzdyIpLCBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpCisKK1BDTURFRihzOCwgIlBDTSBzaWduZWQgOC1iaXQiLAorICAgICAgICJzYiIsIEFWX0NPREVDX0lEX1BDTV9TOCkKKworUENNREVGKHUzMmJlLCAiUENNIHVuc2lnbmVkIDMyLWJpdCBiaWctZW5kaWFuIiwKKyAgICAgICBOVUxMLCBBVl9DT0RFQ19JRF9QQ01fVTMyQkUpCisKK1BDTURFRih1MzJsZSwgIlBDTSB1bnNpZ25lZCAzMi1iaXQgbGl0dGxlLWVuZGlhbiIsCisgICAgICAgTlVMTCwgQVZfQ09ERUNfSURfUENNX1UzMkxFKQorCitQQ01ERUYodTI0YmUsICJQQ00gdW5zaWduZWQgMjQtYml0IGJpZy1lbmRpYW4iLAorICAgICAgIE5VTEwsIEFWX0NPREVDX0lEX1BDTV9VMjRCRSkKKworUENNREVGKHUyNGxlLCAiUENNIHVuc2lnbmVkIDI0LWJpdCBsaXR0bGUtZW5kaWFuIiwKKyAgICAgICBOVUxMLCBBVl9DT0RFQ19JRF9QQ01fVTI0TEUpCisKK1BDTURFRih1MTZiZSwgIlBDTSB1bnNpZ25lZCAxNi1iaXQgYmlnLWVuZGlhbiIsCisgICAgICAgQVZfTkUoInV3IiwgTlVMTCksIEFWX0NPREVDX0lEX1BDTV9VMTZCRSkKKworUENNREVGKHUxNmxlLCAiUENNIHVuc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIiwKKyAgICAgICBBVl9ORShOVUxMLCAidXciKSwgQVZfQ09ERUNfSURfUENNX1UxNkxFKQorCitQQ01ERUYodTgsICJQQ00gdW5zaWduZWQgOC1iaXQiLAorICAgICAgICJ1YiIsIEFWX0NPREVDX0lEX1BDTV9VOCkKKworUENNREVGKGFsYXcsICJQQ00gQS1sYXciLAorICAgICAgICJhbCIsIEFWX0NPREVDX0lEX1BDTV9BTEFXKQorCitQQ01ERUYobXVsYXcsICJQQ00gbXUtbGF3IiwKKyAgICAgICAidWwiLCBBVl9DT0RFQ19JRF9QQ01fTVVMQVcpCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcGpzZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcGpzZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyOWI3MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9wanNkZWMuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUEpTIChQaG9lbml4IEphcGFuaW1hdGlvbiBTb2NpZXR5KSBzdWJ0aXRsZXMgZm9ybWF0IGRlbXV4ZXIKKyAqCisgKiBAc2VlIGh0dHA6Ly9zdWJzLmNvbS5ydS9wYWdlLnBocD9hbD1wanMKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInN1YnRpdGxlcy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRkZEZW11eFN1YnRpdGxlc1F1ZXVlIHE7Cit9IFBKU0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgcGpzX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNoYXIgYzsKKyAgICBpbnQ2NF90IHN0YXJ0LCBlbmQ7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyID0gcC0+YnVmOworCisgICAgaWYgKHNzY2FuZihwdHIsICIlIlNDTmQ2NCIsJSJTQ05kNjQiLCVjIiwgJnN0YXJ0LCAmZW5kLCAmYykgPT0gMykgeworICAgICAgICBzaXplX3QgcTFwb3MgPSBzdHJjc3BuKHB0ciwgIlwiIik7CisgICAgICAgIHNpemVfdCBxMnBvcyA9IHExcG9zICsgc3RyY3NwbihwdHIgKyBxMXBvcyArIDEsICJcIiIpICsgMTsKKyAgICAgICAgaWYgKHN0cmNzcG4ocHRyLCAiXHJcbiIpID4gcTJwb3MpCisgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50NjRfdCByZWFkX3RzKGNoYXIgKipsaW5lLCBpbnQgKmR1cmF0aW9uKQoreworICAgIGludDY0X3Qgc3RhcnQsIGVuZDsKKworICAgIGlmIChzc2NhbmYoKmxpbmUsICIlIlNDTmQ2NCIsJSJTQ05kNjQsICZzdGFydCwgJmVuZCkgPT0gMikgeworICAgICAgICAqbGluZSArPSBzdHJjc3BuKCpsaW5lLCAiXCIiKTsKKyAgICAgICAgKmxpbmUgKz0gISEqKmxpbmU7CisgICAgICAgICpkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICByZXR1cm4gc3RhcnQ7CisgICAgfQorICAgIHJldHVybiBBVl9OT1BUU19WQUxVRTsKK30KKworc3RhdGljIGludCBwanNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFBKU0NvbnRleHQgKnBqcyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGludCByZXMgPSAwOworCisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTApOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9QSlM7CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihzLT5wYikpIHsKKyAgICAgICAgY2hhciBsaW5lWzQwOTZdOworICAgICAgICBjaGFyICpwID0gbGluZTsKKyAgICAgICAgY29uc3QgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICBpbnQgbGVuID0gZmZfZ2V0X2xpbmUocy0+cGIsIGxpbmUsIHNpemVvZihsaW5lKSk7CisgICAgICAgIGludDY0X3QgcHRzX3N0YXJ0OworICAgICAgICBpbnQgZHVyYXRpb247CisKKyAgICAgICAgaWYgKCFsZW4pCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBsaW5lW3N0cmNzcG4obGluZSwgIlxyXG4iKV0gPSAwOworCisgICAgICAgIHB0c19zdGFydCA9IHJlYWRfdHMoJnAsICZkdXJhdGlvbik7CisgICAgICAgIGlmIChwdHNfc3RhcnQgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIEFWUGFja2V0ICpzdWI7CisKKyAgICAgICAgICAgIHBbc3RyY3NwbihwLCAiXCIiKV0gPSAwOworICAgICAgICAgICAgc3ViID0gZmZfc3VidGl0bGVzX3F1ZXVlX2luc2VydCgmcGpzLT5xLCBwLCBzdHJsZW4ocCksIDApOworICAgICAgICAgICAgaWYgKCFzdWIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIHN1Yi0+cG9zID0gcG9zOworICAgICAgICAgICAgc3ViLT5wdHMgPSBwdHNfc3RhcnQ7CisgICAgICAgICAgICBzdWItPmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfZmluYWxpemUoJnBqcy0+cSk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBwanNfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFBKU0NvbnRleHQgKnBqcyA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3JlYWRfcGFja2V0KCZwanMtPnEsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgcGpzX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtaW5fdHMsIGludDY0X3QgdHMsIGludDY0X3QgbWF4X3RzLCBpbnQgZmxhZ3MpCit7CisgICAgUEpTQ29udGV4dCAqcGpzID0gcy0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl9zdWJ0aXRsZXNfcXVldWVfc2VlaygmcGpzLT5xLCBzLCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl90cywgdHMsIG1heF90cywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHBqc19yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBQSlNDb250ZXh0ICpwanMgPSBzLT5wcml2X2RhdGE7CisgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2NsZWFuKCZwanMtPnEpOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3Bqc19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwanMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQSlMgKFBob2VuaXggSmFwYW5pbWF0aW9uIFNvY2lldHkpIHN1YnRpdGxlcyIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQSlNDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBwanNfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gcGpzX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHBqc19yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrMiAgICAgPSBwanNfcmVhZF9zZWVrLAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHBqc19yZWFkX2Nsb3NlLAorICAgIC5leHRlbnNpb25zICAgICA9ICJwanMiLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9wbXBkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9wbXBkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzk2NmIzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3BtcGRlYy5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogUE1QIGRlbXV4ZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUmVpbWFyIETDtmZmaW5nZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgY3VyX3N0cmVhbTsKKyAgICBpbnQgbnVtX3N0cmVhbXM7CisgICAgaW50IGF1ZGlvX3BhY2tldHM7CisgICAgaW50IGN1cnJlbnRfcGFja2V0OworICAgIHVpbnQzMl90ICpwYWNrZXRfc2l6ZXM7CisgICAgaW50IHBhY2tldF9zaXplc19hbGxvYzsKK30gUE1QQ29udGV4dDsKKworc3RhdGljIGludCBwbXBfcHJvYmUoQVZQcm9iZURhdGEgKnApIHsKKyAgICBpZiAoQVZfUk4zMihwLT5idWYpID09IEFWX1JOMzIoInBtcG0iKSAmJgorICAgICAgICBBVl9STDMyKHAtPmJ1ZiArIDQpID09IDEpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbXBfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBQTVBDb250ZXh0ICpwbXAgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHRiX251bSwgdGJfZGVuOworICAgIHVpbnQzMl90IGluZGV4X2NudDsKKyAgICBpbnQgYXVkaW9fY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOworICAgIGludCBzcmF0ZSwgY2hhbm5lbHM7CisgICAgdW5zaWduZWQgaTsKKyAgICB1aW50NjRfdCBwb3M7CisgICAgaW50NjRfdCBmc2l6ZSA9IGF2aW9fc2l6ZShwYik7CisKKyAgICBBVlN0cmVhbSAqdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXZzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgc3dpdGNoIChhdmlvX3JsMzIocGIpKSB7CisgICAgY2FzZSAwOgorICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QRUc0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSDI2NDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHZpZGVvIGZvcm1hdFxuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpbmRleF9jbnQgPSBhdmlvX3JsMzIocGIpOworICAgIHZzdC0+Y29kZWMtPndpZHRoICA9IGF2aW9fcmwzMihwYik7CisgICAgdnN0LT5jb2RlYy0+aGVpZ2h0ID0gYXZpb19ybDMyKHBiKTsKKworICAgIHRiX251bSA9IGF2aW9fcmwzMihwYik7CisgICAgdGJfZGVuID0gYXZpb19ybDMyKHBiKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgMzIsIHRiX251bSwgdGJfZGVuKTsKKyAgICB2c3QtPm5iX2ZyYW1lcyA9IGluZGV4X2NudDsKKyAgICB2c3QtPmR1cmF0aW9uID0gaW5kZXhfY250OworCisgICAgc3dpdGNoIChhdmlvX3JsMzIocGIpKSB7CisgICAgY2FzZSAwOgorICAgICAgICBhdWRpb19jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQUFDIG5vdCB5ZXQgY29ycmVjdGx5IHN1cHBvcnRlZFxuIik7CisgICAgICAgIGF1ZGlvX2NvZGVjX2lkID0gQVZfQ09ERUNfSURfQUFDOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHBtcC0+bnVtX3N0cmVhbXMgPSBhdmlvX3JsMTYocGIpICsgMTsKKyAgICBhdmlvX3NraXAocGIsIDEwKTsKKyAgICBzcmF0ZSA9IGF2aW9fcmwzMihwYik7CisgICAgY2hhbm5lbHMgPSBhdmlvX3JsMzIocGIpICsgMTsKKyAgICBwb3MgPSBhdmlvX3RlbGwocGIpICsgNExMKmluZGV4X2NudDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZXhfY250OyBpKyspIHsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGludCBmbGFncyA9IHNpemUgJiAxID8gQVZJTkRFWF9LRVlGUkFNRSA6IDA7CisgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0ZBVEFMLCAiRW5jb3VudGVyZWQgRU9GIHdoaWxlIHJlYWRpbmcgaW5kZXguXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHNpemUgPj49IDE7CisgICAgICAgIGlmIChzaXplIDwgOSArIDQqcG1wLT5udW1fc3RyZWFtcykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlBhY2tldCB0b28gc21hbGxcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHZzdCwgcG9zLCBpLCBzaXplLCAwLCBmbGFncyk7CisgICAgICAgIHBvcyArPSBzaXplOworICAgICAgICBpZiAoZnNpemUgPiAwICYmIGkgPT0gMCAmJiBwb3MgPiBmc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZpbGUgZW5kcyBiZWZvcmUgZmlyc3QgcGFja2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDE7IGkgPCBwbXAtPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKmFzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghYXN0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPSBhdWRpb19jb2RlY19pZDsKKyAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICAgICAgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzcmF0ZTsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDMyLCAxLCBzcmF0ZSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtcF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFBNUENvbnRleHQgKnBtcCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgaTsKKworICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgaWYgKHBtcC0+Y3VyX3N0cmVhbSA9PSAwKSB7CisgICAgICAgIGludCBudW1fcGFja2V0czsKKyAgICAgICAgcG1wLT5hdWRpb19wYWNrZXRzID0gYXZpb19yOChwYik7CisKKyAgICAgICAgaWYgKCFwbXAtPmF1ZGlvX3BhY2tldHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyBhdWRpbyBwYWNrZXRzLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIG51bV9wYWNrZXRzID0gKHBtcC0+bnVtX3N0cmVhbXMgLSAxKSAqIHBtcC0+YXVkaW9fcGFja2V0cyArIDE7CisgICAgICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgICAgIHBtcC0+Y3VycmVudF9wYWNrZXQgPSAwOworICAgICAgICBhdl9mYXN0X21hbGxvYygmcG1wLT5wYWNrZXRfc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICZwbXAtPnBhY2tldF9zaXplc19hbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BhY2tldHMgKiBzaXplb2YoKnBtcC0+cGFja2V0X3NpemVzKSk7CisgICAgICAgIGlmICghcG1wLT5wYWNrZXRfc2l6ZXNfYWxsb2MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgKHJlKWFsbG9jYXRlIHBhY2tldCBidWZmZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2tldHM7IGkrKykKKyAgICAgICAgICAgIHBtcC0+cGFja2V0X3NpemVzW2ldID0gYXZpb19ybDMyKHBiKTsKKyAgICB9CisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBwbXAtPnBhY2tldF9zaXplc1twbXAtPmN1cnJlbnRfcGFja2V0XSk7CisgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gcG1wLT5jdXJfc3RyZWFtOworICAgIH0KKyAgICBpZiAocG1wLT5jdXJyZW50X3BhY2tldCAlIHBtcC0+YXVkaW9fcGFja2V0cyA9PSAwKQorICAgICAgICBwbXAtPmN1cl9zdHJlYW0gPSAocG1wLT5jdXJfc3RyZWFtICsgMSkgJSBwbXAtPm51bV9zdHJlYW1zOworICAgIHBtcC0+Y3VycmVudF9wYWNrZXQrKzsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtcF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0cywgaW50IGZsYWdzKQoreworICAgIFBNUENvbnRleHQgKnBtcCA9IHMtPnByaXZfZGF0YTsKKyAgICBwbXAtPmN1cl9zdHJlYW0gPSAwOworICAgIC8vIGZhbGwgYmFjayBvbiBkZWZhdWx0IHNlZWsgbm93CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHBtcF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUE1QQ29udGV4dCAqcG1wID0gcy0+cHJpdl9kYXRhOworICAgIGF2X2ZyZWVwKCZwbXAtPnBhY2tldF9zaXplcyk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfcG1wX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInBtcCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBsYXlzdGF0aW9uIFBvcnRhYmxlIFBNUCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQTVBDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBwbXBfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gcG1wX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBwbXBfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IHBtcF9zZWVrLAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHBtcF9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcHN4c3RyLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcHN4c3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1MGU1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9wc3hzdHIuYwpAQCAtMCwwICsxLDMyMSBAQAorLyoKKyAqIFNvbnkgUGxheXN0YXRpb24gKFBTWCkgU1RSIEZpbGUgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBQU1ggU1RSIGZpbGUgZGVtdXhlcgorICogYnkgTWlrZSBNZWxhbnNvbiAobWVsYW5zb25AcGNpc3lzLm5ldCkKKyAqIFRoaXMgbW9kdWxlIGhhbmRsZXMgc3RyZWFtcyB0aGF0IGhhdmUgYmVlbiByaXBwZWQgZnJvbSBTb255IFBsYXlzdGF0aW9uCisgKiBDRCBnYW1lcy4gVGhpcyBkZW11eGVyIGNhbiBoYW5kbGUgZWl0aGVyIHJhdyBTVFIgZmlsZXMgKHdoaWNoIGFyZSBqdXN0CisgKiBjb25jYXRlbmF0aW9ucyBvZiByYXcgY29tcGFjdCBkaXNjIHNlY3RvcnMpIG9yIFNUUiBmaWxlcyB3aXRoIDB4MkMtYnl0ZQorICogUklGRiBoZWFkZXJzLCBmb2xsb3dlZCBieSBDRCBzZWN0b3JzLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFJJRkZfVEFHIE1LVEFHKCdSJywgJ0knLCAnRicsICdGJykKKyNkZWZpbmUgQ0RYQV9UQUcgTUtUQUcoJ0MnLCAnRCcsICdYJywgJ0EnKQorCisjZGVmaW5lIFJBV19DRF9TRUNUT1JfU0laRSAgICAgIDIzNTIKKyNkZWZpbmUgUkFXX0NEX1NFQ1RPUl9EQVRBX1NJWkUgMjMwNAorI2RlZmluZSBWSURFT19EQVRBX0NIVU5LX1NJWkUgICAweDdFMAorI2RlZmluZSBWSURFT19EQVRBX0hFQURFUl9TSVpFICAweDM4CisjZGVmaW5lIFJJRkZfSEVBREVSX1NJWkUgICAgICAgIDB4MkMKKworI2RlZmluZSBDRFhBX1RZUEVfTUFTSyAgICAgMHgwRQorI2RlZmluZSBDRFhBX1RZUEVfREFUQSAgICAgMHgwOAorI2RlZmluZSBDRFhBX1RZUEVfQVVESU8gICAgMHgwNAorI2RlZmluZSBDRFhBX1RZUEVfVklERU8gICAgMHgwMgorCisjZGVmaW5lIFNUUl9NQUdJQyAoMHg4MDAxMDE2MCkKKwordHlwZWRlZiBzdHJ1Y3QgU3RyQ2hhbm5lbCB7CisgICAgLyogdmlkZW8gcGFyYW1ldGVycyAqLworICAgIGludCB2aWRlb19zdHJlYW1faW5kZXg7CisgICAgQVZQYWNrZXQgdG1wX3BrdDsKKworICAgIC8qIGF1ZGlvIHBhcmFtZXRlcnMgKi8KKyAgICBpbnQgYXVkaW9fc3RyZWFtX2luZGV4OworfSBTdHJDaGFubmVsOworCit0eXBlZGVmIHN0cnVjdCBTdHJEZW11eENvbnRleHQgeworCisgICAgLyogYSBTVFIgZmlsZSBjYW4gY29udGFpbiB1cCB0byAzMiBjaGFubmVscyBvZiBkYXRhICovCisgICAgU3RyQ2hhbm5lbCBjaGFubmVsc1szMl07Cit9IFN0ckRlbXV4Q29udGV4dDsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3luY19oZWFkZXJbMTJdID0gezB4MDAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAwfTsKKworc3RhdGljIGludCBzdHJfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqc2VjdG9yPSBwLT5idWY7CisgICAgY29uc3QgdWludDhfdCAqZW5kPSBzZWN0b3IgKyBwLT5idWZfc2l6ZTsKKyAgICBpbnQgYXVkPTAsIHZpZD0wOworCisgICAgaWYgKHAtPmJ1Zl9zaXplIDwgUkFXX0NEX1NFQ1RPUl9TSVpFKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICgoQVZfUkwzMigmcC0+YnVmWzBdKSA9PSBSSUZGX1RBRykgJiYKKyAgICAgICAgKEFWX1JMMzIoJnAtPmJ1Zls4XSkgPT0gQ0RYQV9UQUcpKSB7CisKKyAgICAgICAgLyogUklGRiBoZWFkZXIgc2Vlbjsgc2tpcCAweDJDIGJ5dGVzICovCisgICAgICAgIHNlY3RvciArPSBSSUZGX0hFQURFUl9TSVpFOworICAgIH0KKworICAgIHdoaWxlIChlbmQgLSBzZWN0b3IgPj0gUkFXX0NEX1NFQ1RPUl9TSVpFKSB7CisgICAgICAgIC8qIGxvb2sgZm9yIENEIHN5bmMgaGVhZGVyICgwMCwgMHhGRiB4IDEwLCAwMCkgKi8KKyAgICAgICAgaWYgKG1lbWNtcChzZWN0b3Isc3luY19oZWFkZXIsc2l6ZW9mKHN5bmNfaGVhZGVyKSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoc2VjdG9yWzB4MTFdID49IDMyKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgc3dpdGNoIChzZWN0b3JbMHgxMl0gJiBDRFhBX1RZUEVfTUFTSykgeworICAgICAgICBjYXNlIENEWEFfVFlQRV9EQVRBOgorICAgICAgICBjYXNlIENEWEFfVFlQRV9WSURFTzogeworICAgICAgICAgICAgICAgIGludCBjdXJyZW50X3NlY3RvciA9IEFWX1JMMTYoJnNlY3RvclsweDFDXSk7CisgICAgICAgICAgICAgICAgaW50IHNlY3Rvcl9jb3VudCAgID0gQVZfUkwxNigmc2VjdG9yWzB4MUVdKTsKKyAgICAgICAgICAgICAgICBpbnQgZnJhbWVfc2l6ZSA9IEFWX1JMMzIoJnNlY3RvclsweDI0XSk7CisKKyAgICAgICAgICAgICAgICBpZighKCAgIGZyYW1lX3NpemU+PTAKKyAgICAgICAgICAgICAgICAgICAgICYmIGN1cnJlbnRfc2VjdG9yIDwgc2VjdG9yX2NvdW50CisgICAgICAgICAgICAgICAgICAgICAmJiBzZWN0b3JfY291bnQqVklERU9fREFUQV9DSFVOS19TSVpFID49ZnJhbWVfc2l6ZSkpeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKnN0LT5jb2RlYy0+d2lkdGggICAgICA9IEFWX1JMMTYoJnNlY3RvclsweDI4XSk7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gQVZfUkwxNigmc2VjdG9yWzB4MkFdKTsqLworCisvLyAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfc2VjdG9yID09IHNlY3Rvcl9jb3VudC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHZpZCsrOworLy8gICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0RYQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgaWYoc2VjdG9yWzB4MTNdJjB4MkEpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBhdWQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYoc2VjdG9yWzB4MTJdICYgQ0RYQV9UWVBFX01BU0spCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgc2VjdG9yICs9IFJBV19DRF9TRUNUT1JfU0laRTsKKyAgICB9CisgICAgLyogTVBFRyBmaWxlcyAobGlrZSB0aG9zZSByaXBwZWQgZnJvbSBWQ0RzKSBjYW4gYWxzbyBsb29rIGxpa2UgdGhpczsKKyAgICAgKiBvbmx5IHJldHVybiBoYWxmIGNlcnRhaW50eSAqLworICAgIGlmKHZpZCthdWQgPiAzKSAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworICAgIGVsc2UgaWYodmlkK2F1ZCkgcmV0dXJuIDE7CisgICAgZWxzZSAgICAgICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHJfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFN0ckRlbXV4Q29udGV4dCAqc3RyID0gcy0+cHJpdl9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgc2VjdG9yW1JBV19DRF9TRUNUT1JfU0laRV07CisgICAgaW50IHN0YXJ0OworICAgIGludCBpOworCisgICAgLyogc2tpcCBvdmVyIGFueSBSSUZGIGhlYWRlciAqLworICAgIGlmIChhdmlvX3JlYWQocGIsIHNlY3RvciwgUklGRl9IRUFERVJfU0laRSkgIT0gUklGRl9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICBpZiAoQVZfUkwzMigmc2VjdG9yWzBdKSA9PSBSSUZGX1RBRykKKyAgICAgICAgc3RhcnQgPSBSSUZGX0hFQURFUl9TSVpFOworICAgIGVsc2UKKyAgICAgICAgc3RhcnQgPSAwOworCisgICAgYXZpb19zZWVrKHBiLCBzdGFydCwgU0VFS19TRVQpOworCisgICAgZm9yKGk9MDsgaTwzMjsgaSsrKXsKKyAgICAgICAgc3RyLT5jaGFubmVsc1tpXS52aWRlb19zdHJlYW1faW5kZXg9CisgICAgICAgIHN0ci0+Y2hhbm5lbHNbaV0uYXVkaW9fc3RyZWFtX2luZGV4PSAtMTsKKyAgICB9CisKKyAgICBzLT5jdHhfZmxhZ3MgfD0gQVZGTVRDVFhfTk9IRUFERVI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHJfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnJldF9wa3QpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgU3RyRGVtdXhDb250ZXh0ICpzdHIgPSBzLT5wcml2X2RhdGE7CisgICAgdW5zaWduZWQgY2hhciBzZWN0b3JbUkFXX0NEX1NFQ1RPUl9TSVpFXTsKKyAgICBpbnQgY2hhbm5lbDsKKyAgICBBVlBhY2tldCAqcGt0OworICAgIEFWU3RyZWFtICpzdDsKKworICAgIHdoaWxlICgxKSB7CisKKyAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgc2VjdG9yLCBSQVdfQ0RfU0VDVE9SX1NJWkUpICE9IFJBV19DRF9TRUNUT1JfU0laRSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAgICAgY2hhbm5lbCA9IHNlY3RvclsweDExXTsKKyAgICAgICAgaWYgKGNoYW5uZWwgPj0gMzIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBzd2l0Y2ggKHNlY3RvclsweDEyXSAmIENEWEFfVFlQRV9NQVNLKSB7CisKKyAgICAgICAgY2FzZSBDRFhBX1RZUEVfREFUQToKKyAgICAgICAgY2FzZSBDRFhBX1RZUEVfVklERU86CisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpbnQgY3VycmVudF9zZWN0b3IgPSBBVl9STDE2KCZzZWN0b3JbMHgxQ10pOworICAgICAgICAgICAgICAgIGludCBzZWN0b3JfY291bnQgICA9IEFWX1JMMTYoJnNlY3RvclsweDFFXSk7CisgICAgICAgICAgICAgICAgaW50IGZyYW1lX3NpemUgPSBBVl9STDMyKCZzZWN0b3JbMHgyNF0pOworCisgICAgICAgICAgICAgICAgaWYoISggICBmcmFtZV9zaXplPj0wCisgICAgICAgICAgICAgICAgICAgICAmJiBjdXJyZW50X3NlY3RvciA8IHNlY3Rvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICAgJiYgc2VjdG9yX2NvdW50KlZJREVPX0RBVEFfQ0hVTktfU0laRSA+PWZyYW1lX3NpemUpKXsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGFyYW1ldGVycyAlZCAlZCAlZFxuIiwgY3VycmVudF9zZWN0b3IsIHNlY3Rvcl9jb3VudCwgZnJhbWVfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKHN0ci0+Y2hhbm5lbHNbY2hhbm5lbF0udmlkZW9fc3RyZWFtX2luZGV4IDwgMCl7CisgICAgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IEFWU3RyZWFtICovCisgICAgICAgICAgICAgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxNSk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyLT5jaGFubmVsc1tjaGFubmVsXS52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NREVDOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IEFWX1JMMTYoJnNlY3RvclsweDI4XSk7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IEFWX1JMMTYoJnNlY3RvclsweDJBXSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogaWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2VjdG9yIG9mIHRoZSBmcmFtZSwgYWxsb2NhdGUgYSBwa3QgKi8KKyAgICAgICAgICAgICAgICBwa3QgPSAmc3RyLT5jaGFubmVsc1tjaGFubmVsXS50bXBfcGt0OworCisgICAgICAgICAgICAgICAgaWYocGt0LT5zaXplICE9IHNlY3Rvcl9jb3VudCpWSURFT19EQVRBX0NIVU5LX1NJWkUpeworICAgICAgICAgICAgICAgICAgICBpZihwa3QtPmRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibWlzc21hdGNoaW5nIHNlY3Rvcl9jb3VudFxuIik7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgc2VjdG9yX2NvdW50KlZJREVPX0RBVEFfQ0hVTktfU0laRSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQocGt0LT5kYXRhLCAwLCBzZWN0b3JfY291bnQqVklERU9fREFUQV9DSFVOS19TSVpFKTsKKworICAgICAgICAgICAgICAgICAgICBwa3QtPnBvcz0gYXZpb190ZWxsKHBiKSAtIFJBV19DRF9TRUNUT1JfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyLT5jaGFubmVsc1tjaGFubmVsXS52aWRlb19zdHJlYW1faW5kZXg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSArIGN1cnJlbnRfc2VjdG9yKlZJREVPX0RBVEFfQ0hVTktfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VjdG9yICsgVklERU9fREFUQV9IRUFERVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgVklERU9fREFUQV9DSFVOS19TSVpFKTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3NlY3RvciA9PSBzZWN0b3JfY291bnQtMSkgeworICAgICAgICAgICAgICAgICAgICBwa3QtPnNpemU9IGZyYW1lX3NpemU7CisgICAgICAgICAgICAgICAgICAgICpyZXRfcGt0ID0gKnBrdDsKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5kYXRhPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBwa3QtPnNpemU9IC0xOworICAgICAgICAgICAgICAgICAgICBwa3QtPmJ1ZiA9IE5VTEw7CisjaWYgRkZfQVBJX0RFU1RSVUNUX1BBQ0tFVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICAgICAgICAgICAgICBwa3QtPmRlc3RydWN0ID0gTlVMTDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDRFhBX1RZUEVfQVVESU86CisgICAgICAgICAgICBpZihzdHItPmNoYW5uZWxzW2NoYW5uZWxdLmF1ZGlvX3N0cmVhbV9pbmRleCA8IDApeworICAgICAgICAgICAgICAgIGludCBmbXQgPSBzZWN0b3JbMHgxM107CisgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgYSBuZXcgQVZTdHJlYW0gKi8KKyAgICAgICAgICAgICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgICAgIHN0ci0+Y2hhbm5lbHNbY2hhbm5lbF0uYXVkaW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fWEE7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IDA7ICAvKiBubyBmb3VyY2MgKi8KKyAgICAgICAgICAgICAgICBpZiAoZm10ICYgMSkgeworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IChmbXQmNCk/MTg5MDA6Mzc4MDA7CisgICAgICAgICAgICAvLyAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gMDsgLy9GSVhNRTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMTI4OworCisgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDE4ICogMjI0IC8gc3QtPmNvZGVjLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIHN0LT5zdGFydF90aW1lID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBrdCA9IHJldF9wa3Q7CisgICAgICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIDIzMDQpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBtZW1jcHkocGt0LT5kYXRhLHNlY3RvcisyNCwyMzA0KTsKKworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPQorICAgICAgICAgICAgICAgIHN0ci0+Y2hhbm5lbHNbY2hhbm5lbF0uYXVkaW9fc3RyZWFtX2luZGV4OworICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IDE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVua25vd24gc2VjdG9yIHR5cGUgJTAyWFxuIiwgc2VjdG9yWzB4MTJdKTsKKyAgICAgICAgICAgIC8qIGRyb3AgdGhlIHNlY3RvciBhbmQgbW92ZSBvbiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHN0cl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBTdHJEZW11eENvbnRleHQgKnN0ciA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKyAgICBmb3IoaT0wOyBpPDMyOyBpKyspeworICAgICAgICBpZihzdHItPmNoYW5uZWxzW2ldLnRtcF9wa3QuZGF0YSkKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZzdHItPmNoYW5uZWxzW2ldLnRtcF9wa3QpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3N0cl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwc3hzdHIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTb255IFBsYXlzdGF0aW9uIFNUUiIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTdHJEZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHN0cl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBzdHJfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gc3RyX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHN0cl9yZWFkX2Nsb3NlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PX0JZVEVfU0VFSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcHZhLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcHZhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhYjFjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9wdmEuYwpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIFRlY2hub1RyZW5kIFBWQSAoLnB2YSkgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IEl2byB2YW4gUG9vcnRlbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1wZWcuaCIKKworI2RlZmluZSBQVkFfTUFYX1BBWUxPQURfTEVOR1RIICAweDE3ZjgKKyNkZWZpbmUgUFZBX1ZJREVPX1BBWUxPQUQgICAgICAgMHgwMQorI2RlZmluZSBQVkFfQVVESU9fUEFZTE9BRCAgICAgICAweDAyCisjZGVmaW5lIFBWQV9NQUdJQyAgICAgICAgICAgICAgICgoJ0EnIDw8IDgpICsgJ1YnKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGNvbnRpbnVlX3BlczsKK30gUFZBQ29udGV4dDsKKworc3RhdGljIGludCBwdmFfY2hlY2soY29uc3QgdWludDhfdCAqcCkgeworICAgIGludCBsZW5ndGggPSBBVl9SQjE2KHAgKyA2KTsKKyAgICBpZiAoQVZfUkIxNihwKSAhPSBQVkFfTUFHSUMgfHwgIXBbMl0gfHwgcFsyXSA+IDIgfHwgcFs0XSAhPSAweDU1IHx8CisgICAgICAgIChwWzVdICYgMHhlMCkgfHwgbGVuZ3RoID4gUFZBX01BWF9QQVlMT0FEX0xFTkdUSCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBsZW5ndGggKyA4OworfQorCitzdGF0aWMgaW50IHB2YV9wcm9iZShBVlByb2JlRGF0YSAqIHBkKSB7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmID0gcGQtPmJ1ZjsKKyAgICBpbnQgbGVuID0gcHZhX2NoZWNrKGJ1Zik7CisKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocGQtPmJ1Zl9zaXplID49IGxlbiArIDggJiYKKyAgICAgICAgcHZhX2NoZWNrKGJ1ZiArIGxlbikgPj0gMCkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gNDsKK30KKworc3RhdGljIGludCBwdmFfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKSB7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFTzsKKyAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCA5MDAwMCk7CisgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LCAwLCAwLCAwLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKKworICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01QMjsKKyAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCA5MDAwMCk7CisgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LCAwLCAwLCAwLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKKworICAgIC8qIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgZXh0cmFjdGVkIGZyb20gdGhlIGNvbXByZXNzZWQgYml0c3RyZWFtICovCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgcHZhX2xvZyBpZiAocmVhZF9wYWNrZXQpIGF2X2xvZworCitzdGF0aWMgaW50IHJlYWRfcGFydF9vZl9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90ICpwdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZW4sIGludCAqc3RyaWQsIGludCByZWFkX3BhY2tldCkgeworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFBWQUNvbnRleHQgKnB2YWN0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgc3luY3dvcmQsIHN0cmVhbWlkLCByZXNlcnZlZCwgZmxhZ3MsIGxlbmd0aCwgcHRzX2ZsYWc7CisgICAgaW50NjRfdCBwdmFfcHRzID0gQVZfTk9QVFNfVkFMVUUsIHN0YXJ0cG9zOworICAgIGludCByZXQ7CisKK3JlY292ZXI6CisgICAgc3RhcnRwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgc3luY3dvcmQgPSBhdmlvX3JiMTYocGIpOworICAgIHN0cmVhbWlkID0gYXZpb19yOChwYik7CisgICAgYXZpb19yOChwYik7ICAgICAgICAgICAgICAgLyogY291bnRlciBub3QgdXNlZCAqLworICAgIHJlc2VydmVkID0gYXZpb19yOChwYik7CisgICAgZmxhZ3MgICAgPSBhdmlvX3I4KHBiKTsKKyAgICBsZW5ndGggICA9IGF2aW9fcmIxNihwYik7CisKKyAgICBwdHNfZmxhZyA9IGZsYWdzICYgMHgxMDsKKworICAgIGlmIChzeW5jd29yZCAhPSBQVkFfTUFHSUMpIHsKKyAgICAgICAgcHZhX2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHN5bmN3b3JkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgaWYgKHN0cmVhbWlkICE9IFBWQV9WSURFT19QQVlMT0FEICYmIHN0cmVhbWlkICE9IFBWQV9BVURJT19QQVlMT0FEKSB7CisgICAgICAgIHB2YV9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBzdHJlYW1pZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIGlmIChyZXNlcnZlZCAhPSAweDU1KSB7CisgICAgICAgIHB2YV9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJleHBlY3RlZCByZXNlcnZlZCBieXRlIHRvIGJlIDB4NTVcbiIpOworICAgIH0KKyAgICBpZiAobGVuZ3RoID4gUFZBX01BWF9QQVlMT0FEX0xFTkdUSCkgeworICAgICAgICBwdmFfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgcGF5bG9hZCBsZW5ndGggJXVcbiIsIGxlbmd0aCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgaWYgKHN0cmVhbWlkID09IFBWQV9WSURFT19QQVlMT0FEICYmIHB0c19mbGFnKSB7CisgICAgICAgIHB2YV9wdHMgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBsZW5ndGggLT0gNDsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbWlkID09IFBWQV9BVURJT19QQVlMT0FEKSB7CisgICAgICAgIC8qIFBWQSBBdWRpbyBQYWNrZXRzIGVpdGhlciBzdGFydCB3aXRoIGEgc2lnbmFsZWQgUEVTIHBhY2tldCBvcgorICAgICAgICAgKiBhcmUgYSBjb250aW51YXRpb24gb2YgdGhlIHByZXZpb3VzIFBFUyBwYWNrZXQuIE5ldyBQRVMgcGFja2V0cworICAgICAgICAgKiBhbHdheXMgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIFBWQSBQYWNrZXQsIG5ldmVyIHNvbWV3aGVyZSBpbgorICAgICAgICAgKiB0aGUgbWlkZGxlLiAqLworICAgICAgICBpZiAoIXB2YWN0eC0+Y29udGludWVfcGVzKSB7CisgICAgICAgICAgICBpbnQgcGVzX3NpZ25hbCwgcGVzX2hlYWRlcl9kYXRhX2xlbmd0aCwgcGVzX3BhY2tldF9sZW5ndGgsCisgICAgICAgICAgICAgICAgcGVzX2ZsYWdzOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBwZXNfaGVhZGVyX2RhdGFbMjU2XTsKKworICAgICAgICAgICAgcGVzX3NpZ25hbCAgICAgICAgICAgICA9IGF2aW9fcmIyNChwYik7CisgICAgICAgICAgICBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIHBlc19wYWNrZXRfbGVuZ3RoICAgICAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgcGVzX2ZsYWdzICAgICAgICAgICAgICA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBwZXNfaGVhZGVyX2RhdGFfbGVuZ3RoID0gYXZpb19yOChwYik7CisKKyAgICAgICAgICAgIGlmIChwZXNfc2lnbmFsICE9IDEgfHwgcGVzX2hlYWRlcl9kYXRhX2xlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHZhX2xvZyhzLCBBVl9MT0dfV0FSTklORywgImV4cGVjdGVkIG5vbiBlbXB0eSBzaWduYWxlZCBQRVMgcGFja2V0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ5aW5nIHRvIHJlY292ZXJcbiIpOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgbGVuZ3RoIC0gOSk7CisgICAgICAgICAgICAgICAgaWYgKCFyZWFkX3BhY2tldCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICBnb3RvIHJlY292ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldCA9IGF2aW9fcmVhZChwYiwgcGVzX2hlYWRlcl9kYXRhLCBwZXNfaGVhZGVyX2RhdGFfbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gcGVzX2hlYWRlcl9kYXRhX2xlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBsZW5ndGggLT0gOSArIHBlc19oZWFkZXJfZGF0YV9sZW5ndGg7CisKKyAgICAgICAgICAgIHBlc19wYWNrZXRfbGVuZ3RoIC09IDMgKyBwZXNfaGVhZGVyX2RhdGFfbGVuZ3RoOworCisgICAgICAgICAgICBwdmFjdHgtPmNvbnRpbnVlX3BlcyA9IHBlc19wYWNrZXRfbGVuZ3RoOworCisgICAgICAgICAgICBpZiAocGVzX2ZsYWdzICYgMHg4MCAmJiAocGVzX2hlYWRlcl9kYXRhWzBdICYgMHhmMCkgPT0gMHgyMCkgeworICAgICAgICAgICAgICAgIGlmIChwZXNfaGVhZGVyX2RhdGFfbGVuZ3RoIDwgNSkgeworICAgICAgICAgICAgICAgICAgICBwdmFfbG9nKHMsIEFWX0xPR19FUlJPUiwgImhlYWRlciB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdmFfcHRzID0gZmZfcGFyc2VfcGVzX3B0cyhwZXNfaGVhZGVyX2RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHZhY3R4LT5jb250aW51ZV9wZXMgLT0gbGVuZ3RoOworCisgICAgICAgIGlmIChwdmFjdHgtPmNvbnRpbnVlX3BlcyA8IDApIHsKKyAgICAgICAgICAgIHB2YV9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJhdWRpbyBkYXRhIGNvcnJ1cHRpb25cbiIpOworICAgICAgICAgICAgcHZhY3R4LT5jb250aW51ZV9wZXMgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHB2YV9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeShzLT5zdHJlYW1zW3N0cmVhbWlkLTFdLCBzdGFydHBvcywgcHZhX3B0cywgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisKKyAgICAqcHRzICAgPSBwdmFfcHRzOworICAgICpsZW4gICA9IGxlbmd0aDsKKyAgICAqc3RyaWQgPSBzdHJlYW1pZDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdmFfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KSB7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50NjRfdCBwdmFfcHRzOworICAgIGludCByZXQsIGxlbmd0aCwgc3RyZWFtaWQ7CisKKyAgICBpZiAocmVhZF9wYXJ0X29mX3BhY2tldChzLCAmcHZhX3B0cywgJmxlbmd0aCwgJnN0cmVhbWlkLCAxKSA8IDAgfHwKKyAgICAgICAocmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBsZW5ndGgpKSA8PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdHJlYW1pZCAtIDE7CisgICAgcGt0LT5wdHMgPSBwdmFfcHRzOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludDY0X3QgcHZhX3JlYWRfdGltZXN0YW1wKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpwb3MsIGludDY0X3QgcG9zX2xpbWl0KSB7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgUFZBQ29udGV4dCAqcHZhY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIGludCBsZW5ndGgsIHN0cmVhbWlkOworICAgIGludDY0X3QgcmVzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBwb3NfbGltaXQgPSBGRk1JTigqcG9zK1BWQV9NQVhfUEFZTE9BRF9MRU5HVEgqOCwgKHVpbnQ2NF90KSpwb3MrcG9zX2xpbWl0KTsKKworICAgIHdoaWxlICgqcG9zIDwgcG9zX2xpbWl0KSB7CisgICAgICAgIHJlcyA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBhdmlvX3NlZWsocGIsICpwb3MsIFNFRUtfU0VUKTsKKworICAgICAgICBwdmFjdHgtPmNvbnRpbnVlX3BlcyA9IDA7CisgICAgICAgIGlmIChyZWFkX3BhcnRfb2ZfcGFja2V0KHMsICZyZXMsICZsZW5ndGgsICZzdHJlYW1pZCwgMCkpIHsKKyAgICAgICAgICAgICgqcG9zKSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbWlkIC0gMSAhPSBzdHJlYW1faW5kZXggfHwgcmVzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAqcG9zID0gYXZpb190ZWxsKHBiKSArIGxlbmd0aDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHB2YWN0eC0+Y29udGludWVfcGVzID0gMDsKKyAgICByZXR1cm4gcmVzOworfQorCitBVklucHV0Rm9ybWF0IGZmX3B2YV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJwdmEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUZWNobm9UcmVuZCBQVkEiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUFZBQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gcHZhX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHB2YV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBwdmFfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfdGltZXN0YW1wID0gcHZhX3JlYWRfdGltZXN0YW1wLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9wdmZkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9wdmZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjc4MDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3B2ZmRlYy5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBQVkYgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInBjbS5oIgorCitzdGF0aWMgaW50IHB2Zl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoIW1lbWNtcChwLT5idWYsICJQVkYxXG4iLCA1KSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB2Zl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgY2hhciBidWZmZXJbMzJdOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgYnBzLCBjaGFubmVscywgc2FtcGxlX3JhdGU7CisKKyAgICBhdmlvX3NraXAocy0+cGIsIDUpOworICAgIGZmX2dldF9saW5lKHMtPnBiLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICBpZiAoc3NjYW5mKGJ1ZmZlciwgIiVkICVkICVkIiwKKyAgICAgICAgICAgICAgICZjaGFubmVscywKKyAgICAgICAgICAgICAgICZzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICZicHMpICE9IDMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGNoYW5uZWxzIDw9IDAgfHwgYnBzIDw9IDAgfHwgc2FtcGxlX3JhdGUgPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IGNoYW5uZWxzOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gZmZfZ2V0X3BjbV9jb2RlY19pZChicHMsIDAsIDEsIDB4RkZGRik7CisgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBicHM7CisgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IGJwcyAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMgLyA4OworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfcHZmX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInB2ZiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBWRiAoUG9ydGFibGUgVm9pY2UgRm9ybWF0KSIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHB2Zl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBwdmZfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmZfcGNtX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IGZmX3BjbV9yZWFkX3NlZWssCisgICAgLmV4dGVuc2lvbnMgICAgID0gInB2ZiIsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcWNwLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcWNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmYTA0NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9xY3AuYwpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIFFDUCBmb3JtYXQgKC5xY3ApIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBLZW5hbiBHaWxsZXQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUUNQIGZvcm1hdCAoLnFjcCkgZGVtdXhlcgorICogQGF1dGhvciBLZW5hbiBHaWxsZXQKKyAqIEBzZWUgUkZDIDM2MjU6ICJUaGUgUUNQIEZpbGUgRm9ybWF0IGFuZCBNZWRpYSBUeXBlcyBmb3IgU3BlZWNoIERhdGEiCisgKiAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzYyNQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJyaWZmLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBkYXRhX3NpemU7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBzaXplIG9mIGRhdGEgY2h1bmsKKworI2RlZmluZSBRQ1BfTUFYX01PREUgNAorICAgIGludDE2X3QgcmF0ZXNfcGVyX21vZGVbUUNQX01BWF9NT0RFKzFdOyAvLy88IGNvbnRhaW5zIHRoZSBwYWNrZXQgc2l6ZSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdG8gZWFjaCBtb2RlLCAtMSBpZiBubyBzaXplLgorfSBRQ1BDb250ZXh0OworCisvKioKKyAqIExhc3QgMTUgb3V0IG9mIDE2IGJ5dGVzIG9mIFFDRUxQLTEzSyBHVUlELCBhcyBzdG9yZWQgaW4gdGhlIGZpbGU7CisgKiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgR1VJRCBjYW4gYmUgZWl0aGVyIDB4NDEgb3IgMHg0Mi4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ3VpZF9xY2VscF8xM2tfcGFydFsxNV0gPSB7CisgICAgMHg2ZCwgMHg3ZiwgMHg1ZSwgMHgxNSwgMHhiMSwgMHhkMCwgMHgxMSwgMHhiYSwKKyAgICAweDkxLCAweDAwLCAweDgwLCAweDVmLCAweGI0LCAweGI5LCAweDdlCit9OworCisvKioKKyAqIEVWUkMgR1VJRCBhcyBzdG9yZWQgaW4gdGhlIGZpbGUKKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ3VpZF9ldnJjWzE2XSA9IHsKKyAgICAweDhkLCAweGQ0LCAweDg5LCAweGU2LCAweDc2LCAweDkwLCAweGI1LCAweDQ2LAorICAgIDB4OTEsIDB4ZWYsIDB4NzMsIDB4NmEsIDB4NTEsIDB4MDAsIDB4Y2UsIDB4YjQKK307CisKKy8qKgorICogU01WIEdVSUQgYXMgc3RvcmVkIGluIHRoZSBmaWxlCisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGd1aWRfc212WzE2XSA9IHsKKyAgICAweDc1LCAweDJiLCAweDdjLCAweDhkLCAweDk3LCAweGE3LCAweDQ5LCAweGVkLAorICAgIDB4OTgsIDB4NWUsIDB4ZDUsIDB4M2MsIDB4OGMsIDB4YzcsIDB4NWYsIDB4ODQKK307CisKKy8qKgorICogQHBhcmFtIGd1aWQgY29udGFpbnMgYXQgbGVhc3QgMTYgYnl0ZXMKKyAqIEByZXR1cm4gMSBpZiB0aGUgZ3VpZCBpcyBhIHFjZWxwXzEzayBndWlkLCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGlzX3FjZWxwXzEza19ndWlkKGNvbnN0IHVpbnQ4X3QgKmd1aWQpIHsKKyAgICByZXR1cm4gKGd1aWRbMF0gPT0gMHg0MSB8fCBndWlkWzBdID09IDB4NDIpCisgICAgICAgICYmICFtZW1jbXAoZ3VpZCsxLCBndWlkX3FjZWxwXzEza19wYXJ0LCBzaXplb2YoZ3VpZF9xY2VscF8xM2tfcGFydCkpOworfQorCitzdGF0aWMgaW50IHFjcF9wcm9iZShBVlByb2JlRGF0YSAqcGQpCit7CisgICAgaWYgKEFWX1JMMzIocGQtPmJ1ZiAgKSA9PSBBVl9STDMyKCJSSUZGIikgJiYKKyAgICAgICAgQVZfUkw2NChwZC0+YnVmKzgpID09IEFWX1JMNjQoIlFMQ01mbXQgIikpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxY3BfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFFDUENvbnRleHQgICAgKmMgID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICAgICAgKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICB1aW50OF90ICAgICAgIGJ1ZlsxNl07CisgICAgaW50ICAgICAgICAgICBpLCBuYl9yYXRlczsKKworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmlvX3JiMzIocGIpOyAgICAgICAgICAgICAgICAgICAgLy8gIlJJRkYiCisgICAgYXZpb19za2lwKHBiLCA0ICsgOCArIDQgKyAxICsgMSk7ICAgIC8vIGZpbGVzaXplICsgIlFMQ01mbXQgIiArIGNodW5rLXNpemUgKyBtYWpvci12ZXJzaW9uICsgbWlub3ItdmVyc2lvbgorCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICA9IDE7CisgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIGF2aW9fcmVhZChwYiwgYnVmLCAxNik7CisgICAgaWYgKGlzX3FjZWxwXzEza19ndWlkKGJ1ZikpIHsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1FDRUxQOworICAgIH0gZWxzZSBpZiAoIW1lbWNtcChidWYsIGd1aWRfZXZyYywgMTYpKSB7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9FVlJDOworICAgIH0gZWxzZSBpZiAoIW1lbWNtcChidWYsIGd1aWRfc212LCAxNikpIHsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1NNVjsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjb2RlYyBHVUlEICJGRl9QUklfR1VJRCIuXG4iLAorICAgICAgICAgICAgICAgRkZfQVJHX0dVSUQoYnVmKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhdmlvX3NraXAocGIsIDIgKyA4MCk7IC8vIGNvZGVjLXZlcnNpb24gKyBjb2RlYy1uYW1lCisgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IGF2aW9fcmwxNihwYik7CisKKyAgICBzLT5wYWNrZXRfc2l6ZSA9IGF2aW9fcmwxNihwYik7CisgICAgYXZpb19za2lwKHBiLCAyKTsgLy8gYmxvY2stc2l6ZQorICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMTYocGIpOworICAgIGF2aW9fc2tpcChwYiwgMik7IC8vIHNhbXBsZS1zaXplCisKKyAgICBtZW1zZXQoYy0+cmF0ZXNfcGVyX21vZGUsIC0xLCBzaXplb2YoYy0+cmF0ZXNfcGVyX21vZGUpKTsKKyAgICBuYl9yYXRlcyA9IGF2aW9fcmwzMihwYik7CisgICAgbmJfcmF0ZXMgPSBGRk1JTihuYl9yYXRlcywgOCk7CisgICAgZm9yIChpPTA7IGk8bmJfcmF0ZXM7IGkrKykgeworICAgICAgICBpbnQgc2l6ZSA9IGF2aW9fcjgocGIpOworICAgICAgICBpbnQgbW9kZSA9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAobW9kZSA+IFFDUF9NQVhfTU9ERSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBlbnRyeSAlZD0+JWQgaW4gcmF0ZS1tYXAtdGFibGUuXG4gIiwgbW9kZSwgc2l6ZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYy0+cmF0ZXNfcGVyX21vZGVbbW9kZV0gPSBzaXplOworICAgIH0KKyAgICBhdmlvX3NraXAocGIsIDE2IC0gMipuYl9yYXRlcyArIDIwKTsgLy8gZW1wdHkgZW50cmllcyBvZiByYXRlLW1hcC10YWJsZSArIHJlc2VydmVkCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxY3BfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFFDUENvbnRleHQgICAgKmMgID0gcy0+cHJpdl9kYXRhOworICAgIHVuc2lnbmVkIGludCAgY2h1bmtfc2l6ZSwgdGFnOworCisgICAgd2hpbGUoIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgaWYgKGMtPmRhdGFfc2l6ZSkgeworICAgICAgICAgICAgaW50IHBrdF9zaXplLCByZXQsIG1vZGUgPSBhdmlvX3I4KHBiKTsKKworICAgICAgICAgICAgaWYgKHMtPnBhY2tldF9zaXplKSB7CisgICAgICAgICAgICAgICAgcGt0X3NpemUgPSBzLT5wYWNrZXRfc2l6ZSAtIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPiBRQ1BfTUFYX01PREUgfHwgKHBrdF9zaXplID0gYy0+cmF0ZXNfcGVyX21vZGVbbW9kZV0pIDwgMCkgeworICAgICAgICAgICAgICAgIGMtPmRhdGFfc2l6ZS0tOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYy0+ZGF0YV9zaXplIDw9IHBrdF9zaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiRGF0YSBjaHVuayBpcyB0b28gc21hbGwuXG4iKTsKKyAgICAgICAgICAgICAgICBwa3Rfc2l6ZSA9IGMtPmRhdGFfc2l6ZSAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBwa3Rfc2l6ZSkpID49IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGt0X3NpemUgIT0gcmV0KQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUGFja2V0IHNpemUgaXMgdG9vIHNtYWxsLlxuIik7CisKKyAgICAgICAgICAgICAgICBjLT5kYXRhX3NpemUgLT0gcGt0X3NpemUgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdmlvX3RlbGwocGIpICYgMSAmJiBhdmlvX3I4KHBiKSkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlBhZGRpbmcgc2hvdWxkIGJlIDAuXG4iKTsKKworICAgICAgICB0YWcgICAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgY2h1bmtfc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIHN3aXRjaCAodGFnKSB7CisgICAgICAgIGNhc2UgTUtUQUcoJ3YnLCAncicsICdhJywgJ3QnKToKKyAgICAgICAgICAgIGlmIChhdmlvX3JsMzIocGIpKSAvLyB2YXItcmF0ZS1mbGFnCisgICAgICAgICAgICAgICAgcy0+cGFja2V0X3NpemUgPSAwOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCA0KTsgLy8gc2l6ZS1pbi1wYWNrZXRzCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnZCcsICdhJywgJ3QnLCAnYScpOgorICAgICAgICAgICAgYy0+ZGF0YV9zaXplID0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIGNodW5rX3NpemUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBVkVSUk9SX0VPRjsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9xY3BfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicWNwIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUUNQIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFFDUENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHFjcF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBxY3BfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcWNwX3JlYWRfcGFja2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9xdHBhbGV0dGUuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9xdHBhbGV0dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDY4MDJmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3F0cGFsZXR0ZS5oCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogRGVmYXVsdCBQYWxldHRlcyBmb3IgUXVpY2t0aW1lIEZpbGVzCisgKiAgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBhIHV0aWxpdHkgZGVyaXZlZCBmcm9tIFhBbmltOgorICogIGh0dHA6Ly94YW5pbS52YS5wdWJuaXguY29tL2hvbWUuaHRtbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1FUUEFMRVRURV9ICisjZGVmaW5lIEFWRk9STUFUX1FUUEFMRVRURV9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCitzdGF0aWMgY29uc3QgdWludDhfdCBmZl9xdF9kZWZhdWx0X3BhbGV0dGVfNFs0ICogM10gPSB7CisgIDB4OTMsIDB4NjUsIDB4NUUsCisgIDB4RkYsIDB4RkYsIDB4RkYsCisgIDB4REYsIDB4RDAsIDB4QUIsCisgIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGZmX3F0X2RlZmF1bHRfcGFsZXR0ZV8xNlsxNiAqIDNdID0geworICAweEZGLCAweEZCLCAweEZGLAorICAweEVGLCAweEQ5LCAweEJCLAorICAweEU4LCAweEM5LCAweEIxLAorICAweDkzLCAweDY1LCAweDVFLAorICAweEZDLCAweERFLCAweEU4LAorICAweDlELCAweDg4LCAweDkxLAorICAweEZGLCAweEZGLCAweEZGLAorICAweEZGLCAweEZGLCAweEZGLAorICAweEZGLCAweEZGLCAweEZGLAorICAweDQ3LCAweDQ4LCAweDM3LAorICAweDdBLCAweDVFLCAweDU1LAorICAweERGLCAweEQwLCAweEFCLAorICAweEZGLCAweEZCLCAweEY5LAorICAweEU4LCAweENBLCAweEM1LAorICAweDhBLCAweDdDLCAweDc3LAorICAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBmZl9xdF9kZWZhdWx0X3BhbGV0dGVfMjU2WzI1NiAqIDNdID0geworICAvKiAgIDAsIDB4MDAgKi8gIDB4RkYsIDB4RkYsIDB4RkYsCisgIC8qICAgMSwgMHgwMSAqLyAgMHhGRiwgMHhGRiwgMHhDQywKKyAgLyogICAyLCAweDAyICovICAweEZGLCAweEZGLCAweDk5LAorICAvKiAgIDMsIDB4MDMgKi8gIDB4RkYsIDB4RkYsIDB4NjYsCisgIC8qICAgNCwgMHgwNCAqLyAgMHhGRiwgMHhGRiwgMHgzMywKKyAgLyogICA1LCAweDA1ICovICAweEZGLCAweEZGLCAweDAwLAorICAvKiAgIDYsIDB4MDYgKi8gIDB4RkYsIDB4Q0MsIDB4RkYsCisgIC8qICAgNywgMHgwNyAqLyAgMHhGRiwgMHhDQywgMHhDQywKKyAgLyogICA4LCAweDA4ICovICAweEZGLCAweENDLCAweDk5LAorICAvKiAgIDksIDB4MDkgKi8gIDB4RkYsIDB4Q0MsIDB4NjYsCisgIC8qICAxMCwgMHgwQSAqLyAgMHhGRiwgMHhDQywgMHgzMywKKyAgLyogIDExLCAweDBCICovICAweEZGLCAweENDLCAweDAwLAorICAvKiAgMTIsIDB4MEMgKi8gIDB4RkYsIDB4OTksIDB4RkYsCisgIC8qICAxMywgMHgwRCAqLyAgMHhGRiwgMHg5OSwgMHhDQywKKyAgLyogIDE0LCAweDBFICovICAweEZGLCAweDk5LCAweDk5LAorICAvKiAgMTUsIDB4MEYgKi8gIDB4RkYsIDB4OTksIDB4NjYsCisgIC8qICAxNiwgMHgxMCAqLyAgMHhGRiwgMHg5OSwgMHgzMywKKyAgLyogIDE3LCAweDExICovICAweEZGLCAweDk5LCAweDAwLAorICAvKiAgMTgsIDB4MTIgKi8gIDB4RkYsIDB4NjYsIDB4RkYsCisgIC8qICAxOSwgMHgxMyAqLyAgMHhGRiwgMHg2NiwgMHhDQywKKyAgLyogIDIwLCAweDE0ICovICAweEZGLCAweDY2LCAweDk5LAorICAvKiAgMjEsIDB4MTUgKi8gIDB4RkYsIDB4NjYsIDB4NjYsCisgIC8qICAyMiwgMHgxNiAqLyAgMHhGRiwgMHg2NiwgMHgzMywKKyAgLyogIDIzLCAweDE3ICovICAweEZGLCAweDY2LCAweDAwLAorICAvKiAgMjQsIDB4MTggKi8gIDB4RkYsIDB4MzMsIDB4RkYsCisgIC8qICAyNSwgMHgxOSAqLyAgMHhGRiwgMHgzMywgMHhDQywKKyAgLyogIDI2LCAweDFBICovICAweEZGLCAweDMzLCAweDk5LAorICAvKiAgMjcsIDB4MUIgKi8gIDB4RkYsIDB4MzMsIDB4NjYsCisgIC8qICAyOCwgMHgxQyAqLyAgMHhGRiwgMHgzMywgMHgzMywKKyAgLyogIDI5LCAweDFEICovICAweEZGLCAweDMzLCAweDAwLAorICAvKiAgMzAsIDB4MUUgKi8gIDB4RkYsIDB4MDAsIDB4RkYsCisgIC8qICAzMSwgMHgxRiAqLyAgMHhGRiwgMHgwMCwgMHhDQywKKyAgLyogIDMyLCAweDIwICovICAweEZGLCAweDAwLCAweDk5LAorICAvKiAgMzMsIDB4MjEgKi8gIDB4RkYsIDB4MDAsIDB4NjYsCisgIC8qICAzNCwgMHgyMiAqLyAgMHhGRiwgMHgwMCwgMHgzMywKKyAgLyogIDM1LCAweDIzICovICAweEZGLCAweDAwLCAweDAwLAorICAvKiAgMzYsIDB4MjQgKi8gIDB4Q0MsIDB4RkYsIDB4RkYsCisgIC8qICAzNywgMHgyNSAqLyAgMHhDQywgMHhGRiwgMHhDQywKKyAgLyogIDM4LCAweDI2ICovICAweENDLCAweEZGLCAweDk5LAorICAvKiAgMzksIDB4MjcgKi8gIDB4Q0MsIDB4RkYsIDB4NjYsCisgIC8qICA0MCwgMHgyOCAqLyAgMHhDQywgMHhGRiwgMHgzMywKKyAgLyogIDQxLCAweDI5ICovICAweENDLCAweEZGLCAweDAwLAorICAvKiAgNDIsIDB4MkEgKi8gIDB4Q0MsIDB4Q0MsIDB4RkYsCisgIC8qICA0MywgMHgyQiAqLyAgMHhDQywgMHhDQywgMHhDQywKKyAgLyogIDQ0LCAweDJDICovICAweENDLCAweENDLCAweDk5LAorICAvKiAgNDUsIDB4MkQgKi8gIDB4Q0MsIDB4Q0MsIDB4NjYsCisgIC8qICA0NiwgMHgyRSAqLyAgMHhDQywgMHhDQywgMHgzMywKKyAgLyogIDQ3LCAweDJGICovICAweENDLCAweENDLCAweDAwLAorICAvKiAgNDgsIDB4MzAgKi8gIDB4Q0MsIDB4OTksIDB4RkYsCisgIC8qICA0OSwgMHgzMSAqLyAgMHhDQywgMHg5OSwgMHhDQywKKyAgLyogIDUwLCAweDMyICovICAweENDLCAweDk5LCAweDk5LAorICAvKiAgNTEsIDB4MzMgKi8gIDB4Q0MsIDB4OTksIDB4NjYsCisgIC8qICA1MiwgMHgzNCAqLyAgMHhDQywgMHg5OSwgMHgzMywKKyAgLyogIDUzLCAweDM1ICovICAweENDLCAweDk5LCAweDAwLAorICAvKiAgNTQsIDB4MzYgKi8gIDB4Q0MsIDB4NjYsIDB4RkYsCisgIC8qICA1NSwgMHgzNyAqLyAgMHhDQywgMHg2NiwgMHhDQywKKyAgLyogIDU2LCAweDM4ICovICAweENDLCAweDY2LCAweDk5LAorICAvKiAgNTcsIDB4MzkgKi8gIDB4Q0MsIDB4NjYsIDB4NjYsCisgIC8qICA1OCwgMHgzQSAqLyAgMHhDQywgMHg2NiwgMHgzMywKKyAgLyogIDU5LCAweDNCICovICAweENDLCAweDY2LCAweDAwLAorICAvKiAgNjAsIDB4M0MgKi8gIDB4Q0MsIDB4MzMsIDB4RkYsCisgIC8qICA2MSwgMHgzRCAqLyAgMHhDQywgMHgzMywgMHhDQywKKyAgLyogIDYyLCAweDNFICovICAweENDLCAweDMzLCAweDk5LAorICAvKiAgNjMsIDB4M0YgKi8gIDB4Q0MsIDB4MzMsIDB4NjYsCisgIC8qICA2NCwgMHg0MCAqLyAgMHhDQywgMHgzMywgMHgzMywKKyAgLyogIDY1LCAweDQxICovICAweENDLCAweDMzLCAweDAwLAorICAvKiAgNjYsIDB4NDIgKi8gIDB4Q0MsIDB4MDAsIDB4RkYsCisgIC8qICA2NywgMHg0MyAqLyAgMHhDQywgMHgwMCwgMHhDQywKKyAgLyogIDY4LCAweDQ0ICovICAweENDLCAweDAwLCAweDk5LAorICAvKiAgNjksIDB4NDUgKi8gIDB4Q0MsIDB4MDAsIDB4NjYsCisgIC8qICA3MCwgMHg0NiAqLyAgMHhDQywgMHgwMCwgMHgzMywKKyAgLyogIDcxLCAweDQ3ICovICAweENDLCAweDAwLCAweDAwLAorICAvKiAgNzIsIDB4NDggKi8gIDB4OTksIDB4RkYsIDB4RkYsCisgIC8qICA3MywgMHg0OSAqLyAgMHg5OSwgMHhGRiwgMHhDQywKKyAgLyogIDc0LCAweDRBICovICAweDk5LCAweEZGLCAweDk5LAorICAvKiAgNzUsIDB4NEIgKi8gIDB4OTksIDB4RkYsIDB4NjYsCisgIC8qICA3NiwgMHg0QyAqLyAgMHg5OSwgMHhGRiwgMHgzMywKKyAgLyogIDc3LCAweDREICovICAweDk5LCAweEZGLCAweDAwLAorICAvKiAgNzgsIDB4NEUgKi8gIDB4OTksIDB4Q0MsIDB4RkYsCisgIC8qICA3OSwgMHg0RiAqLyAgMHg5OSwgMHhDQywgMHhDQywKKyAgLyogIDgwLCAweDUwICovICAweDk5LCAweENDLCAweDk5LAorICAvKiAgODEsIDB4NTEgKi8gIDB4OTksIDB4Q0MsIDB4NjYsCisgIC8qICA4MiwgMHg1MiAqLyAgMHg5OSwgMHhDQywgMHgzMywKKyAgLyogIDgzLCAweDUzICovICAweDk5LCAweENDLCAweDAwLAorICAvKiAgODQsIDB4NTQgKi8gIDB4OTksIDB4OTksIDB4RkYsCisgIC8qICA4NSwgMHg1NSAqLyAgMHg5OSwgMHg5OSwgMHhDQywKKyAgLyogIDg2LCAweDU2ICovICAweDk5LCAweDk5LCAweDk5LAorICAvKiAgODcsIDB4NTcgKi8gIDB4OTksIDB4OTksIDB4NjYsCisgIC8qICA4OCwgMHg1OCAqLyAgMHg5OSwgMHg5OSwgMHgzMywKKyAgLyogIDg5LCAweDU5ICovICAweDk5LCAweDk5LCAweDAwLAorICAvKiAgOTAsIDB4NUEgKi8gIDB4OTksIDB4NjYsIDB4RkYsCisgIC8qICA5MSwgMHg1QiAqLyAgMHg5OSwgMHg2NiwgMHhDQywKKyAgLyogIDkyLCAweDVDICovICAweDk5LCAweDY2LCAweDk5LAorICAvKiAgOTMsIDB4NUQgKi8gIDB4OTksIDB4NjYsIDB4NjYsCisgIC8qICA5NCwgMHg1RSAqLyAgMHg5OSwgMHg2NiwgMHgzMywKKyAgLyogIDk1LCAweDVGICovICAweDk5LCAweDY2LCAweDAwLAorICAvKiAgOTYsIDB4NjAgKi8gIDB4OTksIDB4MzMsIDB4RkYsCisgIC8qICA5NywgMHg2MSAqLyAgMHg5OSwgMHgzMywgMHhDQywKKyAgLyogIDk4LCAweDYyICovICAweDk5LCAweDMzLCAweDk5LAorICAvKiAgOTksIDB4NjMgKi8gIDB4OTksIDB4MzMsIDB4NjYsCisgIC8qIDEwMCwgMHg2NCAqLyAgMHg5OSwgMHgzMywgMHgzMywKKyAgLyogMTAxLCAweDY1ICovICAweDk5LCAweDMzLCAweDAwLAorICAvKiAxMDIsIDB4NjYgKi8gIDB4OTksIDB4MDAsIDB4RkYsCisgIC8qIDEwMywgMHg2NyAqLyAgMHg5OSwgMHgwMCwgMHhDQywKKyAgLyogMTA0LCAweDY4ICovICAweDk5LCAweDAwLCAweDk5LAorICAvKiAxMDUsIDB4NjkgKi8gIDB4OTksIDB4MDAsIDB4NjYsCisgIC8qIDEwNiwgMHg2QSAqLyAgMHg5OSwgMHgwMCwgMHgzMywKKyAgLyogMTA3LCAweDZCICovICAweDk5LCAweDAwLCAweDAwLAorICAvKiAxMDgsIDB4NkMgKi8gIDB4NjYsIDB4RkYsIDB4RkYsCisgIC8qIDEwOSwgMHg2RCAqLyAgMHg2NiwgMHhGRiwgMHhDQywKKyAgLyogMTEwLCAweDZFICovICAweDY2LCAweEZGLCAweDk5LAorICAvKiAxMTEsIDB4NkYgKi8gIDB4NjYsIDB4RkYsIDB4NjYsCisgIC8qIDExMiwgMHg3MCAqLyAgMHg2NiwgMHhGRiwgMHgzMywKKyAgLyogMTEzLCAweDcxICovICAweDY2LCAweEZGLCAweDAwLAorICAvKiAxMTQsIDB4NzIgKi8gIDB4NjYsIDB4Q0MsIDB4RkYsCisgIC8qIDExNSwgMHg3MyAqLyAgMHg2NiwgMHhDQywgMHhDQywKKyAgLyogMTE2LCAweDc0ICovICAweDY2LCAweENDLCAweDk5LAorICAvKiAxMTcsIDB4NzUgKi8gIDB4NjYsIDB4Q0MsIDB4NjYsCisgIC8qIDExOCwgMHg3NiAqLyAgMHg2NiwgMHhDQywgMHgzMywKKyAgLyogMTE5LCAweDc3ICovICAweDY2LCAweENDLCAweDAwLAorICAvKiAxMjAsIDB4NzggKi8gIDB4NjYsIDB4OTksIDB4RkYsCisgIC8qIDEyMSwgMHg3OSAqLyAgMHg2NiwgMHg5OSwgMHhDQywKKyAgLyogMTIyLCAweDdBICovICAweDY2LCAweDk5LCAweDk5LAorICAvKiAxMjMsIDB4N0IgKi8gIDB4NjYsIDB4OTksIDB4NjYsCisgIC8qIDEyNCwgMHg3QyAqLyAgMHg2NiwgMHg5OSwgMHgzMywKKyAgLyogMTI1LCAweDdEICovICAweDY2LCAweDk5LCAweDAwLAorICAvKiAxMjYsIDB4N0UgKi8gIDB4NjYsIDB4NjYsIDB4RkYsCisgIC8qIDEyNywgMHg3RiAqLyAgMHg2NiwgMHg2NiwgMHhDQywKKyAgLyogMTI4LCAweDgwICovICAweDY2LCAweDY2LCAweDk5LAorICAvKiAxMjksIDB4ODEgKi8gIDB4NjYsIDB4NjYsIDB4NjYsCisgIC8qIDEzMCwgMHg4MiAqLyAgMHg2NiwgMHg2NiwgMHgzMywKKyAgLyogMTMxLCAweDgzICovICAweDY2LCAweDY2LCAweDAwLAorICAvKiAxMzIsIDB4ODQgKi8gIDB4NjYsIDB4MzMsIDB4RkYsCisgIC8qIDEzMywgMHg4NSAqLyAgMHg2NiwgMHgzMywgMHhDQywKKyAgLyogMTM0LCAweDg2ICovICAweDY2LCAweDMzLCAweDk5LAorICAvKiAxMzUsIDB4ODcgKi8gIDB4NjYsIDB4MzMsIDB4NjYsCisgIC8qIDEzNiwgMHg4OCAqLyAgMHg2NiwgMHgzMywgMHgzMywKKyAgLyogMTM3LCAweDg5ICovICAweDY2LCAweDMzLCAweDAwLAorICAvKiAxMzgsIDB4OEEgKi8gIDB4NjYsIDB4MDAsIDB4RkYsCisgIC8qIDEzOSwgMHg4QiAqLyAgMHg2NiwgMHgwMCwgMHhDQywKKyAgLyogMTQwLCAweDhDICovICAweDY2LCAweDAwLCAweDk5LAorICAvKiAxNDEsIDB4OEQgKi8gIDB4NjYsIDB4MDAsIDB4NjYsCisgIC8qIDE0MiwgMHg4RSAqLyAgMHg2NiwgMHgwMCwgMHgzMywKKyAgLyogMTQzLCAweDhGICovICAweDY2LCAweDAwLCAweDAwLAorICAvKiAxNDQsIDB4OTAgKi8gIDB4MzMsIDB4RkYsIDB4RkYsCisgIC8qIDE0NSwgMHg5MSAqLyAgMHgzMywgMHhGRiwgMHhDQywKKyAgLyogMTQ2LCAweDkyICovICAweDMzLCAweEZGLCAweDk5LAorICAvKiAxNDcsIDB4OTMgKi8gIDB4MzMsIDB4RkYsIDB4NjYsCisgIC8qIDE0OCwgMHg5NCAqLyAgMHgzMywgMHhGRiwgMHgzMywKKyAgLyogMTQ5LCAweDk1ICovICAweDMzLCAweEZGLCAweDAwLAorICAvKiAxNTAsIDB4OTYgKi8gIDB4MzMsIDB4Q0MsIDB4RkYsCisgIC8qIDE1MSwgMHg5NyAqLyAgMHgzMywgMHhDQywgMHhDQywKKyAgLyogMTUyLCAweDk4ICovICAweDMzLCAweENDLCAweDk5LAorICAvKiAxNTMsIDB4OTkgKi8gIDB4MzMsIDB4Q0MsIDB4NjYsCisgIC8qIDE1NCwgMHg5QSAqLyAgMHgzMywgMHhDQywgMHgzMywKKyAgLyogMTU1LCAweDlCICovICAweDMzLCAweENDLCAweDAwLAorICAvKiAxNTYsIDB4OUMgKi8gIDB4MzMsIDB4OTksIDB4RkYsCisgIC8qIDE1NywgMHg5RCAqLyAgMHgzMywgMHg5OSwgMHhDQywKKyAgLyogMTU4LCAweDlFICovICAweDMzLCAweDk5LCAweDk5LAorICAvKiAxNTksIDB4OUYgKi8gIDB4MzMsIDB4OTksIDB4NjYsCisgIC8qIDE2MCwgMHhBMCAqLyAgMHgzMywgMHg5OSwgMHgzMywKKyAgLyogMTYxLCAweEExICovICAweDMzLCAweDk5LCAweDAwLAorICAvKiAxNjIsIDB4QTIgKi8gIDB4MzMsIDB4NjYsIDB4RkYsCisgIC8qIDE2MywgMHhBMyAqLyAgMHgzMywgMHg2NiwgMHhDQywKKyAgLyogMTY0LCAweEE0ICovICAweDMzLCAweDY2LCAweDk5LAorICAvKiAxNjUsIDB4QTUgKi8gIDB4MzMsIDB4NjYsIDB4NjYsCisgIC8qIDE2NiwgMHhBNiAqLyAgMHgzMywgMHg2NiwgMHgzMywKKyAgLyogMTY3LCAweEE3ICovICAweDMzLCAweDY2LCAweDAwLAorICAvKiAxNjgsIDB4QTggKi8gIDB4MzMsIDB4MzMsIDB4RkYsCisgIC8qIDE2OSwgMHhBOSAqLyAgMHgzMywgMHgzMywgMHhDQywKKyAgLyogMTcwLCAweEFBICovICAweDMzLCAweDMzLCAweDk5LAorICAvKiAxNzEsIDB4QUIgKi8gIDB4MzMsIDB4MzMsIDB4NjYsCisgIC8qIDE3MiwgMHhBQyAqLyAgMHgzMywgMHgzMywgMHgzMywKKyAgLyogMTczLCAweEFEICovICAweDMzLCAweDMzLCAweDAwLAorICAvKiAxNzQsIDB4QUUgKi8gIDB4MzMsIDB4MDAsIDB4RkYsCisgIC8qIDE3NSwgMHhBRiAqLyAgMHgzMywgMHgwMCwgMHhDQywKKyAgLyogMTc2LCAweEIwICovICAweDMzLCAweDAwLCAweDk5LAorICAvKiAxNzcsIDB4QjEgKi8gIDB4MzMsIDB4MDAsIDB4NjYsCisgIC8qIDE3OCwgMHhCMiAqLyAgMHgzMywgMHgwMCwgMHgzMywKKyAgLyogMTc5LCAweEIzICovICAweDMzLCAweDAwLCAweDAwLAorICAvKiAxODAsIDB4QjQgKi8gIDB4MDAsIDB4RkYsIDB4RkYsCisgIC8qIDE4MSwgMHhCNSAqLyAgMHgwMCwgMHhGRiwgMHhDQywKKyAgLyogMTgyLCAweEI2ICovICAweDAwLCAweEZGLCAweDk5LAorICAvKiAxODMsIDB4QjcgKi8gIDB4MDAsIDB4RkYsIDB4NjYsCisgIC8qIDE4NCwgMHhCOCAqLyAgMHgwMCwgMHhGRiwgMHgzMywKKyAgLyogMTg1LCAweEI5ICovICAweDAwLCAweEZGLCAweDAwLAorICAvKiAxODYsIDB4QkEgKi8gIDB4MDAsIDB4Q0MsIDB4RkYsCisgIC8qIDE4NywgMHhCQiAqLyAgMHgwMCwgMHhDQywgMHhDQywKKyAgLyogMTg4LCAweEJDICovICAweDAwLCAweENDLCAweDk5LAorICAvKiAxODksIDB4QkQgKi8gIDB4MDAsIDB4Q0MsIDB4NjYsCisgIC8qIDE5MCwgMHhCRSAqLyAgMHgwMCwgMHhDQywgMHgzMywKKyAgLyogMTkxLCAweEJGICovICAweDAwLCAweENDLCAweDAwLAorICAvKiAxOTIsIDB4QzAgKi8gIDB4MDAsIDB4OTksIDB4RkYsCisgIC8qIDE5MywgMHhDMSAqLyAgMHgwMCwgMHg5OSwgMHhDQywKKyAgLyogMTk0LCAweEMyICovICAweDAwLCAweDk5LCAweDk5LAorICAvKiAxOTUsIDB4QzMgKi8gIDB4MDAsIDB4OTksIDB4NjYsCisgIC8qIDE5NiwgMHhDNCAqLyAgMHgwMCwgMHg5OSwgMHgzMywKKyAgLyogMTk3LCAweEM1ICovICAweDAwLCAweDk5LCAweDAwLAorICAvKiAxOTgsIDB4QzYgKi8gIDB4MDAsIDB4NjYsIDB4RkYsCisgIC8qIDE5OSwgMHhDNyAqLyAgMHgwMCwgMHg2NiwgMHhDQywKKyAgLyogMjAwLCAweEM4ICovICAweDAwLCAweDY2LCAweDk5LAorICAvKiAyMDEsIDB4QzkgKi8gIDB4MDAsIDB4NjYsIDB4NjYsCisgIC8qIDIwMiwgMHhDQSAqLyAgMHgwMCwgMHg2NiwgMHgzMywKKyAgLyogMjAzLCAweENCICovICAweDAwLCAweDY2LCAweDAwLAorICAvKiAyMDQsIDB4Q0MgKi8gIDB4MDAsIDB4MzMsIDB4RkYsCisgIC8qIDIwNSwgMHhDRCAqLyAgMHgwMCwgMHgzMywgMHhDQywKKyAgLyogMjA2LCAweENFICovICAweDAwLCAweDMzLCAweDk5LAorICAvKiAyMDcsIDB4Q0YgKi8gIDB4MDAsIDB4MzMsIDB4NjYsCisgIC8qIDIwOCwgMHhEMCAqLyAgMHgwMCwgMHgzMywgMHgzMywKKyAgLyogMjA5LCAweEQxICovICAweDAwLCAweDMzLCAweDAwLAorICAvKiAyMTAsIDB4RDIgKi8gIDB4MDAsIDB4MDAsIDB4RkYsCisgIC8qIDIxMSwgMHhEMyAqLyAgMHgwMCwgMHgwMCwgMHhDQywKKyAgLyogMjEyLCAweEQ0ICovICAweDAwLCAweDAwLCAweDk5LAorICAvKiAyMTMsIDB4RDUgKi8gIDB4MDAsIDB4MDAsIDB4NjYsCisgIC8qIDIxNCwgMHhENiAqLyAgMHgwMCwgMHgwMCwgMHgzMywKKyAgLyogMjE1LCAweEQ3ICovICAweEVFLCAweDAwLCAweDAwLAorICAvKiAyMTYsIDB4RDggKi8gIDB4REQsIDB4MDAsIDB4MDAsCisgIC8qIDIxNywgMHhEOSAqLyAgMHhCQiwgMHgwMCwgMHgwMCwKKyAgLyogMjE4LCAweERBICovICAweEFBLCAweDAwLCAweDAwLAorICAvKiAyMTksIDB4REIgKi8gIDB4ODgsIDB4MDAsIDB4MDAsCisgIC8qIDIyMCwgMHhEQyAqLyAgMHg3NywgMHgwMCwgMHgwMCwKKyAgLyogMjIxLCAweEREICovICAweDU1LCAweDAwLCAweDAwLAorICAvKiAyMjIsIDB4REUgKi8gIDB4NDQsIDB4MDAsIDB4MDAsCisgIC8qIDIyMywgMHhERiAqLyAgMHgyMiwgMHgwMCwgMHgwMCwKKyAgLyogMjI0LCAweEUwICovICAweDExLCAweDAwLCAweDAwLAorICAvKiAyMjUsIDB4RTEgKi8gIDB4MDAsIDB4RUUsIDB4MDAsCisgIC8qIDIyNiwgMHhFMiAqLyAgMHgwMCwgMHhERCwgMHgwMCwKKyAgLyogMjI3LCAweEUzICovICAweDAwLCAweEJCLCAweDAwLAorICAvKiAyMjgsIDB4RTQgKi8gIDB4MDAsIDB4QUEsIDB4MDAsCisgIC8qIDIyOSwgMHhFNSAqLyAgMHgwMCwgMHg4OCwgMHgwMCwKKyAgLyogMjMwLCAweEU2ICovICAweDAwLCAweDc3LCAweDAwLAorICAvKiAyMzEsIDB4RTcgKi8gIDB4MDAsIDB4NTUsIDB4MDAsCisgIC8qIDIzMiwgMHhFOCAqLyAgMHgwMCwgMHg0NCwgMHgwMCwKKyAgLyogMjMzLCAweEU5ICovICAweDAwLCAweDIyLCAweDAwLAorICAvKiAyMzQsIDB4RUEgKi8gIDB4MDAsIDB4MTEsIDB4MDAsCisgIC8qIDIzNSwgMHhFQiAqLyAgMHgwMCwgMHgwMCwgMHhFRSwKKyAgLyogMjM2LCAweEVDICovICAweDAwLCAweDAwLCAweERELAorICAvKiAyMzcsIDB4RUQgKi8gIDB4MDAsIDB4MDAsIDB4QkIsCisgIC8qIDIzOCwgMHhFRSAqLyAgMHgwMCwgMHgwMCwgMHhBQSwKKyAgLyogMjM5LCAweEVGICovICAweDAwLCAweDAwLCAweDg4LAorICAvKiAyNDAsIDB4RjAgKi8gIDB4MDAsIDB4MDAsIDB4NzcsCisgIC8qIDI0MSwgMHhGMSAqLyAgMHgwMCwgMHgwMCwgMHg1NSwKKyAgLyogMjQyLCAweEYyICovICAweDAwLCAweDAwLCAweDQ0LAorICAvKiAyNDMsIDB4RjMgKi8gIDB4MDAsIDB4MDAsIDB4MjIsCisgIC8qIDI0NCwgMHhGNCAqLyAgMHgwMCwgMHgwMCwgMHgxMSwKKyAgLyogMjQ1LCAweEY1ICovICAweEVFLCAweEVFLCAweEVFLAorICAvKiAyNDYsIDB4RjYgKi8gIDB4REQsIDB4REQsIDB4REQsCisgIC8qIDI0NywgMHhGNyAqLyAgMHhCQiwgMHhCQiwgMHhCQiwKKyAgLyogMjQ4LCAweEY4ICovICAweEFBLCAweEFBLCAweEFBLAorICAvKiAyNDksIDB4RjkgKi8gIDB4ODgsIDB4ODgsIDB4ODgsCisgIC8qIDI1MCwgMHhGQSAqLyAgMHg3NywgMHg3NywgMHg3NywKKyAgLyogMjUxLCAweEZCICovICAweDU1LCAweDU1LCAweDU1LAorICAvKiAyNTIsIDB4RkMgKi8gIDB4NDQsIDB4NDQsIDB4NDQsCisgIC8qIDI1MywgMHhGRCAqLyAgMHgyMiwgMHgyMiwgMHgyMiwKKyAgLyogMjU0LCAweEZFICovICAweDExLCAweDExLCAweDExLAorICAvKiAyNTUsIDB4RkYgKi8gIDB4MDAsIDB4MDAsIDB4MDAKK307CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9RVFBBTEVUVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3IzZC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3IzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MTlmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcjNkLmMKQEAgLTAsMCArMSw0MDggQEAKKy8qCisgKiBSM0QgUkVEQ09ERSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZSBkb3QgY291ZHVyaWVyIGF0IGdtYWlsIGRvdCBjb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCB2aWRlb19vZmZzZXRzX2NvdW50OworICAgIHVuc2lnbmVkICp2aWRlb19vZmZzZXRzOworICAgIHVuc2lnbmVkIHJkdm9fb2Zmc2V0OworfSBSM0RDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgc2l6ZTsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgdWludDY0X3Qgb2Zmc2V0OworfSBBdG9tOworCitzdGF0aWMgaW50IHJlYWRfYXRvbShBVkZvcm1hdENvbnRleHQgKnMsIEF0b20gKmF0b20pCit7CisgICAgYXRvbS0+b2Zmc2V0ID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBhdG9tLT5zaXplID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBpZiAoYXRvbS0+c2l6ZSA8IDgpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhdG9tLT50YWcgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIGF2X2Rsb2cocywgImF0b20gJXUgJS40cyBvZmZzZXQgJSMiUFJJeDY0IlxuIiwKKyAgICAgICAgICAgIGF0b20tPnNpemUsIChjaGFyKikmYXRvbS0+dGFnLCBhdG9tLT5vZmZzZXQpOworICAgIHJldHVybiBhdG9tLT5zaXplOworfQorCitzdGF0aWMgaW50IHIzZF9yZWFkX3JlZDEoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgY2hhciBmaWxlbmFtZVsyNThdOworICAgIGludCB0bXA7CisgICAgaW50IGF2X3VudXNlZCB0bXAyOworICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOworCisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0pQRUcyMDAwOworCisgICAgdG1wICA9IGF2aW9fcjgocy0+cGIpOyAvLyBtYWpvciB2ZXJzaW9uCisgICAgdG1wMiA9IGF2aW9fcjgocy0+cGIpOyAvLyBtaW5vciB2ZXJzaW9uCisgICAgYXZfZGxvZyhzLCAidmVyc2lvbiAlZC4lZFxuIiwgdG1wLCB0bXAyKTsKKworICAgIHRtcCA9IGF2aW9fcmIxNihzLT5wYik7IC8vIHVua25vd24KKyAgICBhdl9kbG9nKHMsICJ1bmtub3duMSAlZFxuIiwgdG1wKTsKKworICAgIHRtcCA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIHRtcCk7CisKKyAgICB0bXAgPSBhdmlvX3JiMzIocy0+cGIpOyAvLyBmaWxlbnVtCisgICAgYXZfZGxvZyhzLCAiZmlsZW51bSAlZFxuIiwgdG1wKTsKKworICAgIGF2aW9fc2tpcChzLT5wYiwgMzIpOyAvLyB1bmtub3duCisKKyAgICBzdC0+Y29kZWMtPndpZHRoICA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JiMzIocy0+cGIpOworCisgICAgdG1wID0gYXZpb19yYjE2KHMtPnBiKTsgLy8gdW5rbm93bgorICAgIGF2X2Rsb2cocywgInVua25vd24yICVkXG4iLCB0bXApOworCisgICAgZnJhbWVyYXRlLm51bSA9IGF2aW9fcmIxNihzLT5wYik7CisgICAgZnJhbWVyYXRlLmRlbiA9IGF2aW9fcmIxNihzLT5wYik7CisgICAgaWYgKGZyYW1lcmF0ZS5udW0gPiAwICYmIGZyYW1lcmF0ZS5kZW4gPiAwKSB7CisjaWYgRkZfQVBJX1JfRlJBTUVfUkFURQorICAgICAgICBzdC0+cl9mcmFtZV9yYXRlID0KKyNlbmRpZgorICAgICAgICBzdC0+YXZnX2ZyYW1lX3JhdGUgPSBmcmFtZXJhdGU7CisgICAgfQorCisgICAgdG1wID0gYXZpb19yOChzLT5wYik7IC8vIGF1ZGlvIGNoYW5uZWxzCisgICAgYXZfZGxvZyhzLCAiYXVkaW8gY2hhbm5lbHMgJWRcbiIsIHRtcCk7CisgICAgaWYgKHRtcCA+IDApIHsKKyAgICAgICAgQVZTdHJlYW0gKmFzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghYXN0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzMyQkU7CisgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzID0gdG1wOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgMzIsIDEsIHN0LT50aW1lX2Jhc2UuZGVuKTsKKyAgICB9CisKKyAgICBhdmlvX3JlYWQocy0+cGIsIGZpbGVuYW1lLCAyNTcpOworICAgIGZpbGVuYW1lW3NpemVvZihmaWxlbmFtZSktMV0gPSAwOworICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJmaWxlbmFtZSIsIGZpbGVuYW1lLCAwKTsKKworICAgIGF2X2Rsb2cocywgImZpbGVuYW1lICVzXG4iLCBmaWxlbmFtZSk7CisgICAgYXZfZGxvZyhzLCAicmVzb2x1dGlvbiAlZHglZFxuIiwgc3QtPmNvZGVjLT53aWR0aCwgc3QtPmNvZGVjLT5oZWlnaHQpOworICAgIGF2X2Rsb2cocywgInRpbWVzY2FsZSAlZFxuIiwgc3QtPnRpbWVfYmFzZS5kZW4pOworICAgIGF2X2Rsb2cocywgImZyYW1lIHJhdGUgJWQvJWRcbiIsCisgICAgICAgICAgICBmcmFtZXJhdGUubnVtLCBmcmFtZXJhdGUuZGVuKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIzZF9yZWFkX3Jkdm8oQVZGb3JtYXRDb250ZXh0ICpzLCBBdG9tICphdG9tKQoreworICAgIFIzRENvbnRleHQgKnIzZCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIGludCBpOworCisgICAgcjNkLT52aWRlb19vZmZzZXRzX2NvdW50ID0gKGF0b20tPnNpemUgLSA4KSAvIDQ7CisgICAgcjNkLT52aWRlb19vZmZzZXRzID0gYXZfbWFsbG9jKGF0b20tPnNpemUpOworICAgIGlmICghcjNkLT52aWRlb19vZmZzZXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IHIzZC0+dmlkZW9fb2Zmc2V0c19jb3VudDsgaSsrKSB7CisgICAgICAgIHIzZC0+dmlkZW9fb2Zmc2V0c1tpXSA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgICAgIGlmICghcjNkLT52aWRlb19vZmZzZXRzW2ldKSB7CisgICAgICAgICAgICByM2QtPnZpZGVvX29mZnNldHNfY291bnQgPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXZfZGxvZyhzLCAidmlkZW8gb2Zmc2V0ICVkOiAlI3hcbiIsIGksIHIzZC0+dmlkZW9fb2Zmc2V0c1tpXSk7CisgICAgfQorCisgICAgaWYgKHN0LT5hdmdfZnJhbWVfcmF0ZS5udW0pCisgICAgICAgIHN0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShyM2QtPnZpZGVvX29mZnNldHNfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9pbnZfcShzdC0+YXZnX2ZyYW1lX3JhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSk7CisgICAgYXZfZGxvZyhzLCAiZHVyYXRpb24gJSJQUklkNjQiXG4iLCBzdC0+ZHVyYXRpb24pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHIzZF9yZWFkX3Jlb3MoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFIzRENvbnRleHQgKnIzZCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgYXZfdW51c2VkIHRtcDsKKworICAgIHIzZC0+cmR2b19vZmZzZXQgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGF2aW9fcmIzMihzLT5wYik7IC8vIHJkdnMgb2Zmc2V0CisgICAgYXZpb19yYjMyKHMtPnBiKTsgLy8gcmRhbyBvZmZzZXQKKyAgICBhdmlvX3JiMzIocy0+cGIpOyAvLyByZGFzIG9mZnNldAorCisgICAgdG1wID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBhdl9kbG9nKHMsICJudW0gdmlkZW8gY2h1bmtzICVkXG4iLCB0bXApOworCisgICAgdG1wID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBhdl9kbG9nKHMsICJudW0gYXVkaW8gY2h1bmtzICVkXG4iLCB0bXApOworCisgICAgYXZpb19za2lwKHMtPnBiLCA2KjQpOworfQorCitzdGF0aWMgaW50IHIzZF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUjNEQ29udGV4dCAqcjNkID0gcy0+cHJpdl9kYXRhOworICAgIEF0b20gYXRvbTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHJlYWRfYXRvbShzLCAmYXRvbSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJlcnJvciByZWFkaW5nIGF0b21cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChhdG9tLnRhZyA9PSBNS1RBRygnUicsJ0UnLCdEJywnMScpKSB7CisgICAgICAgIGlmICgocmV0ID0gcjNkX3JlYWRfcmVkMShzKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZXJyb3IgcGFyc2luZyAncmVkMScgYXRvbVxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCBmaW5kICdyZWQxJyBhdG9tXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHMtPmRhdGFfb2Zmc2V0ID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBhdl9kbG9nKHMsICJkYXRhIG9mZnNldCAlIyJQUkl4NjQiXG4iLCBzLT5kYXRhX29mZnNldCk7CisgICAgaWYgKCFzLT5wYi0+c2Vla2FibGUpCisgICAgICAgIHJldHVybiAwOworICAgIC8vIGZpbmQgUkVPQi9SRU9GL1JFT1MgdG8gbG9hZCBpbmRleAorICAgIGF2aW9fc2VlayhzLT5wYiwgYXZpb19zaXplKHMtPnBiKS00OC04LCBTRUVLX1NFVCk7CisgICAgaWYgKHJlYWRfYXRvbShzLCAmYXRvbSkgPCAwKQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZXJyb3IgcmVhZGluZyBlbmQgYXRvbVxuIik7CisKKyAgICBpZiAoYXRvbS50YWcgIT0gTUtUQUcoJ1InLCdFJywnTycsJ0InKSAmJgorICAgICAgICBhdG9tLnRhZyAhPSBNS1RBRygnUicsJ0UnLCdPJywnRicpICYmCisgICAgICAgIGF0b20udGFnICE9IE1LVEFHKCdSJywnRScsJ08nLCdTJykpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgcjNkX3JlYWRfcmVvcyhzKTsKKworICAgIGlmIChyM2QtPnJkdm9fb2Zmc2V0KSB7CisgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgcjNkLT5yZHZvX29mZnNldCwgU0VFS19TRVQpOworICAgICAgICBpZiAocmVhZF9hdG9tKHMsICZhdG9tKSA8IDApCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZXJyb3IgcmVhZGluZyAncmR2bycgYXRvbVxuIik7CisgICAgICAgIGlmIChhdG9tLnRhZyA9PSBNS1RBRygnUicsJ0QnLCdWJywnTycpKSB7CisgICAgICAgICAgICBpZiAocjNkX3JlYWRfcmR2byhzLCAmYXRvbSkgPCAwKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJlcnJvciBwYXJzaW5nICdyZHZvJyBhdG9tXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworIG91dDoKKyAgICBhdmlvX3NlZWsocy0+cGIsIHMtPmRhdGFfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjNkX3JlYWRfcmVkdihBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsIEF0b20gKmF0b20pCit7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1swXTsKKyAgICBpbnQgdG1wOworICAgIGludCBhdl91bnVzZWQgdG1wMjsKKyAgICB1aW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIHVuc2lnbmVkIGR0czsKKyAgICBpbnQgcmV0OworCisgICAgZHRzID0gYXZpb19yYjMyKHMtPnBiKTsKKworICAgIHRtcCA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgYXZfZGxvZyhzLCAiZnJhbWUgbnVtICVkXG4iLCB0bXApOworCisgICAgdG1wICA9IGF2aW9fcjgocy0+cGIpOyAvLyBtYWpvciB2ZXJzaW9uCisgICAgdG1wMiA9IGF2aW9fcjgocy0+cGIpOyAvLyBtaW5vciB2ZXJzaW9uCisgICAgYXZfZGxvZyhzLCAidmVyc2lvbiAlZC4lZFxuIiwgdG1wLCB0bXAyKTsKKworICAgIHRtcCA9IGF2aW9fcmIxNihzLT5wYik7IC8vIHVua25vd24KKyAgICBhdl9kbG9nKHMsICJ1bmtub3duICVkXG4iLCB0bXApOworCisgICAgaWYgKHRtcCA+IDQpIHsKKyAgICAgICAgdG1wID0gYXZpb19yYjE2KHMtPnBiKTsgLy8gdW5rbm93bgorICAgICAgICBhdl9kbG9nKHMsICJ1bmtub3duICVkXG4iLCB0bXApOworCisgICAgICAgIHRtcCA9IGF2aW9fcmIxNihzLT5wYik7IC8vIHVua25vd24KKyAgICAgICAgYXZfZGxvZyhzLCAidW5rbm93biAlZFxuIiwgdG1wKTsKKworICAgICAgICB0bXAgPSBhdmlvX3JiMzIocy0+cGIpOworICAgICAgICBhdl9kbG9nKHMsICJ3aWR0aCAlZFxuIiwgdG1wKTsKKyAgICAgICAgdG1wID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICAgICAgYXZfZGxvZyhzLCAiaGVpZ2h0ICVkXG4iLCB0bXApOworCisgICAgICAgIHRtcCA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgICAgIGF2X2Rsb2cocywgIm1ldGFkYXRhIGxlbiAlZFxuIiwgdG1wKTsKKyAgICB9CisgICAgdG1wID0gYXRvbS0+c2l6ZSAtIDggLSAoYXZpb190ZWxsKHMtPnBiKSAtIHBvcyk7CisgICAgaWYgKHRtcCA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHRtcCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImVycm9yIHJlYWRpbmcgdmlkZW8gcGFja2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICBwa3QtPmR0cyA9IGR0czsKKyAgICBpZiAoc3QtPmF2Z19mcmFtZV9yYXRlLm51bSkKKyAgICAgICAgcGt0LT5kdXJhdGlvbiA9ICh1aW50NjRfdClzdC0+dGltZV9iYXNlLmRlbioKKyAgICAgICAgICAgIHN0LT5hdmdfZnJhbWVfcmF0ZS5kZW4vc3QtPmF2Z19mcmFtZV9yYXRlLm51bTsKKyAgICBhdl9kbG9nKHMsICJwa3QgZHRzICUiUFJJZDY0IiBkdXJhdGlvbiAlZFxuIiwgcGt0LT5kdHMsIHBrdC0+ZHVyYXRpb24pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjNkX3JlYWRfcmVkYShBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsIEF0b20gKmF0b20pCit7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1sxXTsKKyAgICBpbnQgYXZfdW51c2VkIHRtcCwgdG1wMjsKKyAgICBpbnQgc2FtcGxlcywgc2l6ZTsKKyAgICB1aW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIHVuc2lnbmVkIGR0czsKKyAgICBpbnQgcmV0OworCisgICAgZHRzID0gYXZpb19yYjMyKHMtPnBiKTsKKworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGlmIChzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkJhZCBzYW1wbGUgcmF0ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHNhbXBsZXMgPSBhdmlvX3JiMzIocy0+cGIpOworCisgICAgdG1wID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBhdl9kbG9nKHMsICJwYWNrZXQgbnVtICVkXG4iLCB0bXApOworCisgICAgdG1wID0gYXZpb19yYjE2KHMtPnBiKTsgLy8gdW5rbm93bgorICAgIGF2X2Rsb2cocywgInVua25vd24gJWRcbiIsIHRtcCk7CisKKyAgICB0bXAgID0gYXZpb19yOChzLT5wYik7IC8vIG1ham9yIHZlcnNpb24KKyAgICB0bXAyID0gYXZpb19yOChzLT5wYik7IC8vIG1pbm9yIHZlcnNpb24KKyAgICBhdl9kbG9nKHMsICJ2ZXJzaW9uICVkLiVkXG4iLCB0bXAsIHRtcDIpOworCisgICAgdG1wID0gYXZpb19yYjMyKHMtPnBiKTsgLy8gdW5rbm93bgorICAgIGF2X2Rsb2cocywgInVua25vd24gJWRcbiIsIHRtcCk7CisKKyAgICBzaXplID0gYXRvbS0+c2l6ZSAtIDggLSAoYXZpb190ZWxsKHMtPnBiKSAtIHBvcyk7CisgICAgaWYgKHNpemUgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZXJyb3IgcmVhZGluZyBhdWRpbyBwYWNrZXRcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMTsKKyAgICBwa3QtPmR0cyA9IGR0czsKKyAgICBpZiAoc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgcGt0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGUoc2FtcGxlcywgc3QtPnRpbWVfYmFzZS5kZW4sIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2X2Rsb2cocywgInBrdCBkdHMgJSJQUklkNjQiIGR1cmF0aW9uICVkIHNhbXBsZXMgJWQgc2FtcGxlIHJhdGUgJWRcbiIsCisgICAgICAgICAgICBwa3QtPmR0cywgcGt0LT5kdXJhdGlvbiwgc2FtcGxlcywgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByM2RfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEF0b20gYXRvbTsKKyAgICBpbnQgZXJyID0gMDsKKworICAgIHdoaWxlICghZXJyKSB7CisgICAgICAgIGlmIChyZWFkX2F0b20ocywgJmF0b20pIDwgMCkgeworICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGF0b20udGFnKSB7CisgICAgICAgIGNhc2UgTUtUQUcoJ1InLCdFJywnRCcsJ1YnKToKKyAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zWzBdLT5kaXNjYXJkID09IEFWRElTQ0FSRF9BTEwpCisgICAgICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgICAgaWYgKCEoZXJyID0gcjNkX3JlYWRfcmVkdihzLCBwa3QsICZhdG9tKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnUicsJ0UnLCdEJywnQScpOgorICAgICAgICAgICAgaWYgKHMtPm5iX3N0cmVhbXMgPCAyKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zWzFdLT5kaXNjYXJkID09IEFWRElTQ0FSRF9BTEwpCisgICAgICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgICAgaWYgKCEoZXJyID0gcjNkX3JlYWRfcmVkYShzLCBwa3QsICZhdG9tKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgc2tpcDoKKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgYXRvbS5zaXplLTgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcjNkX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChBVl9STDMyKHAtPmJ1ZiArIDQpID09IE1LVEFHKCdSJywnRScsJ0QnLCcxJykpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByM2Rfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3Qgc2FtcGxlX3RpbWUsIGludCBmbGFncykKK3sKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOyAvLyB2aWRlbyBzdHJlYW0KKyAgICBSM0RDb250ZXh0ICpyM2QgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGZyYW1lX251bTsKKworICAgIGlmICghc3QtPmF2Z19mcmFtZV9yYXRlLm51bSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZnJhbWVfbnVtID0gYXZfcmVzY2FsZV9xKHNhbXBsZV90aW1lLCBzdC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9pbnZfcShzdC0+YXZnX2ZyYW1lX3JhdGUpKTsKKyAgICBhdl9kbG9nKHMsICJzZWVrIGZyYW1lIG51bSAlZCB0aW1lc3RhbXAgJSJQUklkNjQiXG4iLAorICAgICAgICAgICAgZnJhbWVfbnVtLCBzYW1wbGVfdGltZSk7CisKKyAgICBpZiAoZnJhbWVfbnVtIDwgcjNkLT52aWRlb19vZmZzZXRzX2NvdW50KSB7CisgICAgICAgIGlmIChhdmlvX3NlZWsocy0+cGIsIHIzZC0+dmlkZW9fb2Zmc2V0c19jb3VudCwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IHNlZWsgdG8gZnJhbWUgJWRcbiIsIGZyYW1lX251bSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByM2RfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFIzRENvbnRleHQgKnIzZCA9IHMtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZyM2QtPnZpZGVvX29mZnNldHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfcjNkX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInIzZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJFRENPREUgUjNEIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFIzRENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHIzZF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSByM2RfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcjNkX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHIzZF9jbG9zZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSByM2Rfc2VlaywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcmF3ZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcmF3ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiNzZiNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yYXdkZWMuYwpAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIFJBVyBkZW11eGVycworICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA1IEFsZXggQmVyZWdzemFzemkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAicmF3ZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKKyNkZWZpbmUgUkFXX1BBQ0tFVF9TSVpFIDEwMjQKKworaW50IGZmX3Jhd19yZWFkX3BhcnRpYWxfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0LCBzaXplOworCisgICAgc2l6ZSA9IFJBV19QQUNLRVRfU0laRTsKKworICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcGt0LT5wb3M9IGF2aW9fdGVsbChzLT5wYik7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIHJldCA9IGZmaW9fcmVhZF9wYXJ0aWFsKHMtPnBiLCBwa3QtPmRhdGEsIHNpemUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9yYXdfYXVkaW9fcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IHMtPmlmb3JtYXQtPnJhd19jb2RlY19pZDsKKyAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CisgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOworICAgIC8qIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgZXh0cmFjdGVkIGZyb20gdGhlIGNvbXByZXNzZWQgYml0c3RyZWFtICovCisKKyAgICByZXR1cm4gMDsKK30KKworLyogTVBFRy0xL0guMjYzIGlucHV0ICovCitpbnQgZmZfcmF3X3ZpZGVvX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgRkZSYXdWaWRlb0RlbXV4ZXJDb250ZXh0ICpzMSA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0ID0gMDsKKworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBzLT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CisgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOworCisgICAgc3QtPmNvZGVjLT5mcmFtZXJhdGUgPSBzMS0+ZnJhbWVyYXRlOworICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlID0gYXZfaW52X3EoczEtPmZyYW1lcmF0ZSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEyMDAwMDApOworCitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmZfcmF3X2RhdGFfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gcy0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOworICAgIHN0LT5zdGFydF90aW1lID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworLyogTm90ZTogRG8gbm90IGZvcmdldCB0byBhZGQgbmV3IGVudHJpZXMgdG8gdGhlIE1ha2VmaWxlIGFzIHdlbGwuICovCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZGUmF3VmlkZW9EZW11eGVyQ29udGV4dCwgeCkKKyNkZWZpbmUgREVDIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitjb25zdCBBVk9wdGlvbiBmZl9yYXd2aWRlb19vcHRpb25zW10gPSB7CisgICAgeyAiZnJhbWVyYXRlIiwgIiIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCAwLCBERUN9LAorICAgIHsgTlVMTCB9LAorfTsKKworI2lmIENPTkZJR19EQVRBX0RFTVVYRVIKK0FWSW5wdXRGb3JtYXQgZmZfZGF0YV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJkYXRhIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IGRhdGEiKSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBmZl9yYXdfZGF0YV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmZl9yYXdfcmVhZF9wYXJ0aWFsX3BhY2tldCwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19MQVRNX0RFTVVYRVIKKworQVZJbnB1dEZvcm1hdCBmZl9sYXRtX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxhdG0iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgTE9BUy9MQVRNIiksCisgICAgLnJlYWRfaGVhZGVyICAgID0gZmZfcmF3X2F1ZGlvX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZmX3Jhd19yZWFkX3BhcnRpYWxfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVggfCBBVkZNVF9OT1RJTUVTVEFNUFMsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImxhdG0iLAorICAgIC5yYXdfY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0FBQ19MQVRNLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX01KUEVHX0RFTVVYRVIKK3N0YXRpYyBpbnQgbWpwZWdfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IGk7CisgICAgaW50IHN0YXRlID0gLTE7CisgICAgaW50IG5iX2ludmFsaWQgPSAwOworICAgIGludCBuYl9mcmFtZXMgPSAwOworCisgICAgZm9yIChpPTA7IGk8cC0+YnVmX3NpemUtMjsgaSsrKSB7CisgICAgICAgIGludCBjOworICAgICAgICBpZiAocC0+YnVmW2ldICE9IDB4RkYpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYyA9IHAtPmJ1ZltpKzFdOworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAweEQ4OgorICAgICAgICAgICAgc3RhdGUgPSAweEQ4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhDMDoKKyAgICAgICAgY2FzZSAweEMxOgorICAgICAgICBjYXNlIDB4QzI6CisgICAgICAgIGNhc2UgMHhDMzoKKyAgICAgICAgY2FzZSAweEM1OgorICAgICAgICBjYXNlIDB4QzY6CisgICAgICAgIGNhc2UgMHhDNzoKKyAgICAgICAgY2FzZSAweEY3OgorICAgICAgICAgICAgaWYgKHN0YXRlID09IDB4RDgpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IDB4QzA7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBuYl9pbnZhbGlkKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweERBOgorICAgICAgICAgICAgaWYgKHN0YXRlID09IDB4QzApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IDB4REE7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBuYl9pbnZhbGlkKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweEQ5OgorICAgICAgICAgICAgaWYgKHN0YXRlID09IDB4REEpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IDB4RDk7CisgICAgICAgICAgICAgICAgbmJfZnJhbWVzKys7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBuYl9pbnZhbGlkKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICggIChjID49IDB4MDIgJiYgYyA8PSAweEJGKQorICAgICAgICAgICAgICAgIHx8IGMgPT0gMHhDOCkgeworICAgICAgICAgICAgICAgIG5iX2ludmFsaWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuYl9pbnZhbGlkKjQgKyAxIDwgbmJfZnJhbWVzKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGN0X2pwZWdbXSA9ICJcclxuQ29udGVudC1UeXBlOiBpbWFnZS9qcGVnXHJcblxyXG4iOworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGk9MDsgaTxGRk1JTihwLT5idWZfc2l6ZSAtIHNpemVvZihjdF9qcGVnKSwgMTAwKTsgaSsrKQorICAgICAgICAgICAgaWYgKCFtZW1jbXAocC0+YnVmICsgaSwgY3RfanBlZywgc2l6ZW9mKGN0X2pwZWcpIC0gMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworCisgICAgICAgIGlmIChuYl9pbnZhbGlkID09IDAgJiYgbmJfZnJhbWVzID4gMikKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDI7CisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK0ZGX0RFRl9SQVdWSURFT19ERU1VWEVSMihtanBlZywgInJhdyBNSlBFRyB2aWRlbyIsIG1qcGVnX3Byb2JlLCAibWpwZyxtanBlZyxtcG8iLCBBVl9DT0RFQ19JRF9NSlBFRywgQVZGTVRfR0VORVJJQ19JTkRFWHxBVkZNVF9OT1RJTUVTVEFNUFMpCisjZW5kaWYKKworI2lmIENPTkZJR19NTFBfREVNVVhFUgorQVZJbnB1dEZvcm1hdCBmZl9tbHBfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibWxwIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IE1MUCIpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGZmX3Jhd19hdWRpb19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmZl9yYXdfcmVhZF9wYXJ0aWFsX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYIHwgQVZGTVRfTk9USU1FU1RBTVBTLAorICAgIC5leHRlbnNpb25zICAgICA9ICJtbHAiLAorICAgIC5yYXdfY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01MUCwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19UUlVFSERfREVNVVhFUgorQVZJbnB1dEZvcm1hdCBmZl90cnVlaGRfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidHJ1ZWhkIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IFRydWVIRCIpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGZmX3Jhd19hdWRpb19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmZl9yYXdfcmVhZF9wYXJ0aWFsX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYIHwgQVZGTVRfTk9USU1FU1RBTVBTLAorICAgIC5leHRlbnNpb25zICAgICA9ICJ0aGQiLAorICAgIC5yYXdfY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1RSVUVIRCwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19TSE9SVEVOX0RFTVVYRVIKK0FWSW5wdXRGb3JtYXQgZmZfc2hvcnRlbl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzaG4iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgU2hvcnRlbiIpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGZmX3Jhd19hdWRpb19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmZl9yYXdfcmVhZF9wYXJ0aWFsX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0JJTlNFQVJDSCB8IEFWRk1UX05PR0VOU0VBUkNIIHwgQVZGTVRfTk9fQllURV9TRUVLfEFWRk1UX05PVElNRVNUQU1QUywKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAic2huIiwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9TSE9SVEVOLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1ZDMV9ERU1VWEVSCitGRl9ERUZfUkFXVklERU9fREVNVVhFUjIodmMxLCAicmF3IFZDLTEiLCBOVUxMLCAidmMxIiwgQVZfQ09ERUNfSURfVkMxLCBBVkZNVF9HRU5FUklDX0lOREVYfEFWRk1UX05PVElNRVNUQU1QUykKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jhd2RlYy5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jhd2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOGE0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcmF3ZGVjLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIFJBVyBkZW11eGVycworICogQ29weXJpZ2h0IChDKSAyMDA3ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfUkFXREVDX0gKKyNkZWZpbmUgQVZGT1JNQVRfUkFXREVDX0gKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgRkZSYXdWaWRlb0RlbXV4ZXJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsgICAgIC8qKjwgQ2xhc3MgZm9yIHByaXZhdGUgb3B0aW9ucy4gKi8KKyAgICBjaGFyICp2aWRlb19zaXplOyAgICAgICAgIC8qKjwgU3RyaW5nIGRlc2NyaWJpbmcgdmlkZW8gc2l6ZSwgc2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uICovCisgICAgY2hhciAqcGl4ZWxfZm9ybWF0OyAgICAgICAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLworICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOyAgICAgLyoqPCBBVlJhdGlvbmFsIGRlc2NyaWJpbmcgZnJhbWVyYXRlLCBzZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4gKi8KK30gRkZSYXdWaWRlb0RlbXV4ZXJDb250ZXh0OworCitleHRlcm4gY29uc3QgQVZPcHRpb24gZmZfcmF3dmlkZW9fb3B0aW9uc1tdOworCitpbnQgZmZfcmF3X3JlYWRfcGFydGlhbF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KTsKKworaW50IGZmX3Jhd19hdWRpb19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpOworCitpbnQgZmZfcmF3X3ZpZGVvX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcyk7CisKKyNkZWZpbmUgRkZfUkFXVklERU9fREVNVVhFUl9DTEFTUyhuYW1lKVwKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG5hbWUgIyMgX2RlbXV4ZXJfY2xhc3MgPSB7XAorICAgIC5jbGFzc19uYW1lID0gI25hbWUgIiBkZW11eGVyIixcCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSxcCisgICAgLm9wdGlvbiAgICAgPSBmZl9yYXd2aWRlb19vcHRpb25zLFwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCxcCit9OworCisjZGVmaW5lIEZGX0RFRl9SQVdWSURFT19ERU1VWEVSMihzaG9ydG5hbWUsIGxvbmduYW1lLCBwcm9iZSwgZXh0LCBpZCwgZmxhZylcCitGRl9SQVdWSURFT19ERU1VWEVSX0NMQVNTKHNob3J0bmFtZSlcCitBVklucHV0Rm9ybWF0IGZmXyAjIyBzaG9ydG5hbWUgIyMgX2RlbXV4ZXIgPSB7XAorICAgIC5uYW1lICAgICAgICAgICA9ICNzaG9ydG5hbWUsXAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGxvbmduYW1lKSxcCisgICAgLnJlYWRfcHJvYmUgICAgID0gcHJvYmUsXAorICAgIC5yZWFkX2hlYWRlciAgICA9IGZmX3Jhd192aWRlb19yZWFkX2hlYWRlcixcCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmZfcmF3X3JlYWRfcGFydGlhbF9wYWNrZXQsXAorICAgIC5leHRlbnNpb25zICAgICA9IGV4dCxcCisgICAgLmZsYWdzICAgICAgICAgID0gZmxhZyxcCisgICAgLnJhd19jb2RlY19pZCAgID0gaWQsXAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRlJhd1ZpZGVvRGVtdXhlckNvbnRleHQpLFwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmc2hvcnRuYW1lICMjIF9kZW11eGVyX2NsYXNzLFwKK307CisKKyNkZWZpbmUgRkZfREVGX1JBV1ZJREVPX0RFTVVYRVIoc2hvcnRuYW1lLCBsb25nbmFtZSwgcHJvYmUsIGV4dCwgaWQpXAorRkZfREVGX1JBV1ZJREVPX0RFTVVYRVIyKHNob3J0bmFtZSwgbG9uZ25hbWUsIHByb2JlLCBleHQsIGlkLCBBVkZNVF9HRU5FUklDX0lOREVYKQorCisjZW5kaWYgLyogQVZGT1JNQVRfUkFXREVDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9yYXdlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yYXdlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjUwZmUxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jhd2VuYy5jCkBAIC0wLDAgKzEsMzMxIEBACisvKgorICogUkFXIG11eGVycworICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA1IEFsZXggQmVyZWdzemFzemkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicmF3ZW5jLmgiCisKK2ludCBmZl9yYXdfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm9yY2Vfb25lX3N0cmVhbShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaWYgKHMtPm5iX3N0cmVhbXMgIT0gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJXMgZmlsZXMgaGF2ZSBleGFjdGx5IG9uZSBzdHJlYW1cbiIsCisgICAgICAgICAgICAgICBzLT5vZm9ybWF0LT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIE5vdGU6IERvIG5vdCBmb3JnZXQgdG8gYWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBNYWtlZmlsZSBhcyB3ZWxsLiAqLworCisjaWYgQ09ORklHX0FDM19NVVhFUgorQVZPdXRwdXRGb3JtYXQgZmZfYWMzX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJhYzMiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgQUMtMyIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhdWRpby94LWFjMyIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gImFjMyIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQUMzLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19BRFhfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX2FkeF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAiYWR4IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ1JJIEFEWCIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJhZHgiLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0FEWCwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZvcmNlX29uZV9zdHJlYW0sCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfQ0FWU1ZJREVPX01VWEVSCitBVk91dHB1dEZvcm1hdCBmZl9jYXZzdmlkZW9fbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImNhdnN2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBDaGluZXNlIEFWUyAoQXVkaW8gVmlkZW8gU3RhbmRhcmQpIHZpZGVvIiksCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gImNhdnMiLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQ0FWUywKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBmb3JjZV9vbmVfc3RyZWFtLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0RBVEFfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX2RhdGFfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImRhdGEiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgZGF0YSIpLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZvcmNlX29uZV9zdHJlYW0sCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfRElSQUNfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX2RpcmFjX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJkaXJhYyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBEaXJhYyIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJkcmMiLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfRElSQUMsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19ETlhIRF9NVVhFUgorQVZPdXRwdXRGb3JtYXQgZmZfZG54aGRfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImRueGhkIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IEROeEhEIChTTVBURSBWQy0zKSIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJkbnhoZCIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9ETlhIRCwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBmb3JjZV9vbmVfc3RyZWFtLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0RUU19NVVhFUgorQVZPdXRwdXRGb3JtYXQgZmZfZHRzX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJkdHMiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgRFRTIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImF1ZGlvL3gtZGNhIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAiZHRzIiwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9EVFMsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBmb3JjZV9vbmVfc3RyZWFtLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0VBQzNfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX2VhYzNfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImVhYzMiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgRS1BQy0zIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImF1ZGlvL3gtZWFjMyIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gImVhYzMiLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0VBQzMsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBmb3JjZV9vbmVfc3RyZWFtLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0c3MjJfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX2c3MjJfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImc3MjIiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgRy43MjIiKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAiYXVkaW8vRzcyMiIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gImc3MjIiLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0c3MjIsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBmb3JjZV9vbmVfc3RyZWFtLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0c3MjNfMV9NVVhFUgorQVZPdXRwdXRGb3JtYXQgZmZfZzcyM18xX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJnNzIzXzEiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgRy43MjMuMSIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhdWRpby9nNzIzIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAidGNvLHJjbyIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfRzcyM18xLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19IMjYxX01VWEVSCitBVk91dHB1dEZvcm1hdCBmZl9oMjYxX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJoMjYxIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IEguMjYxIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gInZpZGVvL3gtaDI2MSIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gImgyNjEiLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfSDI2MSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBmb3JjZV9vbmVfc3RyZWFtLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0gyNjNfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX2gyNjNfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImgyNjMiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgSC4yNjMiKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAidmlkZW8veC1oMjYzIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAiaDI2MyIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYzLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZvcmNlX29uZV9zdHJlYW0sCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfSDI2NF9NVVhFUgorQVZPdXRwdXRGb3JtYXQgZmZfaDI2NF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAiaDI2NCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBILjI2NCB2aWRlbyIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJoMjY0IiwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19IRVZDX01VWEVSCitBVk91dHB1dEZvcm1hdCBmZl9oZXZjX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJoZXZjIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IEhFVkMgdmlkZW8iKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAiaGV2YyIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9IRVZDLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX000Vl9NVVhFUgorQVZPdXRwdXRGb3JtYXQgZmZfbTR2X211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJtNHYiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgTVBFRy00IHZpZGVvIiksCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gIm00diIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19NSlBFR19NVVhFUgorQVZPdXRwdXRGb3JtYXQgZmZfbWpwZWdfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gIm1qcGVnIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IE1KUEVHIHZpZGVvIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gInZpZGVvL3gtbWpwZWciLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJtanBnLG1qcGVnIiwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01KUEVHLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZvcmNlX29uZV9zdHJlYW0sCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfTUxQX01VWEVSCitBVk91dHB1dEZvcm1hdCBmZl9tbHBfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gIm1scCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBNTFAiKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAibWxwIiwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NTFAsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBmb3JjZV9vbmVfc3RyZWFtLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX01QRUcxVklERU9fTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX21wZWcxdmlkZW9fbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gIm1wZWcxdmlkZW8iLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgTVBFRy0xIHZpZGVvIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gInZpZGVvL21wZWciLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJtcGcsbXBlZyxtMXYiLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzFWSURFTywKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBmb3JjZV9vbmVfc3RyZWFtLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX01QRUcyVklERU9fTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX21wZWcydmlkZW9fbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gIm1wZWcydmlkZW8iLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgTVBFRy0yIHZpZGVvIiksCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gIm0ydiIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZvcmNlX29uZV9zdHJlYW0sCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfUkFXVklERU9fTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX3Jhd3ZpZGVvX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJyYXd2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyB2aWRlbyIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJ5dXYscmdiIiwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1RSVUVIRF9NVVhFUgorQVZPdXRwdXRGb3JtYXQgZmZfdHJ1ZWhkX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJ0cnVlaGQiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgVHJ1ZUhEIiksCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gInRoZCIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfVFJVRUhELAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19WQzFfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX3ZjMV9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAidmMxIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IFZDLTEgdmlkZW8iKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAidmMxIiwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1ZDMSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBmb3JjZV9vbmVfc3RyZWFtLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jhd2VuYy5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jhd2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTIzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcmF3ZW5jLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIFJBVyBtdXhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAwNyAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1JBV0VOQ19ICisjZGVmaW5lIEFWRk9STUFUX1JBV0VOQ19ICisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCitpbnQgZmZfcmF3X3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpOworCisjZW5kaWYgLyogQVZGT1JNQVRfUkFXRU5DX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9yYXd2aWRlb2RlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jhd3ZpZGVvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjYWU0MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yYXd2aWRlb2RlYy5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogUkFXIHZpZGVvIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCit0eXBlZGVmIHN0cnVjdCBSYXdWaWRlb0RlbXV4ZXJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsgICAgIC8qKjwgQ2xhc3MgZm9yIHByaXZhdGUgb3B0aW9ucy4gKi8KKyAgICBpbnQgd2lkdGgsIGhlaWdodDsgICAgICAgIC8qKjwgSW50ZWdlcnMgZGVzY3JpYmluZyB2aWRlbyBzaXplLCBzZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4gKi8KKyAgICBjaGFyICpwaXhlbF9mb3JtYXQ7ICAgICAgIC8qKjwgU2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uICovCisgICAgQVZSYXRpb25hbCBmcmFtZXJhdGU7ICAgICAvKio8IEFWUmF0aW9uYWwgZGVzY3JpYmluZyBmcmFtZXJhdGUsIHNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLworfSBSYXdWaWRlb0RlbXV4ZXJDb250ZXh0OworCisKK3N0YXRpYyBpbnQgcmF3dmlkZW9fcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpjdHgpCit7CisgICAgUmF3VmlkZW9EZW11eGVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworICAgIEFWU3RyZWFtICpzdDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjdHgsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gY3R4LT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CisKKyAgICBpZiAoKHBpeF9mbXQgPSBhdl9nZXRfcGl4X2ZtdChzLT5waXhlbF9mb3JtYXQpKSA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gc3VjaCBwaXhlbCBmb3JtYXQ6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIHMtPnBpeGVsX2Zvcm1hdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHMtPmZyYW1lcmF0ZS5kZW4sIHMtPmZyYW1lcmF0ZS5udW0pOworCisgICAgc3QtPmNvZGVjLT53aWR0aCAgPSBzLT53aWR0aDsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBwaXhfZm10OworICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBhdl9yZXNjYWxlX3EoYXZwaWN0dXJlX2dldF9zaXplKHN0LT5jb2RlYy0+cGl4X2ZtdCwgcy0+d2lkdGgsIHMtPmhlaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7OCwxfSwgc3QtPnRpbWVfYmFzZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJhd3ZpZGVvX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcGFja2V0X3NpemUsIHJldCwgd2lkdGgsIGhlaWdodDsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworCisgICAgd2lkdGggPSBzdC0+Y29kZWMtPndpZHRoOworICAgIGhlaWdodCA9IHN0LT5jb2RlYy0+aGVpZ2h0OworCisgICAgcGFja2V0X3NpemUgPSBhdnBpY3R1cmVfZ2V0X3NpemUoc3QtPmNvZGVjLT5waXhfZm10LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAocGFja2V0X3NpemUgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHBhY2tldF9zaXplKTsKKyAgICBwa3QtPnB0cyA9IHBrdC0+ZHRzID0gcGt0LT5wb3MgLyBwYWNrZXRfc2l6ZTsKKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUmF3VmlkZW9EZW11eGVyQ29udGV4dCwgeCkKKyNkZWZpbmUgREVDIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gcmF3dmlkZW9fb3B0aW9uc1tdID0geworICAgIHsgInZpZGVvX3NpemUiLCAic2V0IGZyYW1lIHNpemUiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBERUMgfSwKKyAgICB7ICJwaXhlbF9mb3JtYXQiLCAic2V0IHBpeGVsIGZvcm1hdCIsIE9GRlNFVChwaXhlbF9mb3JtYXQpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gInl1djQyMHAifSwgMCwgMCwgREVDIH0sCisgICAgeyAiZnJhbWVyYXRlIiwgInNldCBmcmFtZSByYXRlIiwgT0ZGU0VUKGZyYW1lcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIDAsIERFQyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgcmF3dmlkZW9fZGVtdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJyYXd2aWRlbyBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gcmF3dmlkZW9fb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfcmF3dmlkZW9fZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicmF3dmlkZW8iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgdmlkZW8iKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUmF3VmlkZW9EZW11eGVyQ29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgID0gcmF3dmlkZW9fcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcmF3dmlkZW9fcmVhZF9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAieXV2LGNpZixxY2lmLHJnYiIsCisgICAgLnJhd19jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCisgICAgLnByaXZfY2xhc3MgICAgID0gJnJhd3ZpZGVvX2RlbXV4ZXJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3JkdC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OGE4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcmR0LmMKQEAgLTAsMCArMSw1ODcgQEAKKy8qCisgKiBSZWFsbWVkaWEgUlRTUCBwcm90b2NvbCAoUkRUKSBzdXBwb3J0LgorICogQ29weXJpZ2h0IChjKSAyMDA3IFJvbmFsZCBTLiBCdWx0amUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIFJlYWxtZWRpYSBSVFNQIHByb3RvY29sIChSRFQpIHN1cHBvcnQKKyAqIEBhdXRob3IgUm9uYWxkIFMuIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgInJ0cGRlYy5oIgorI2luY2x1ZGUgInJkdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9iYXNlNjQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWQ1LmgiCisjaW5jbHVkZSAicm0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisKK3N0cnVjdCBSRFREZW11eENvbnRleHQgeworICAgIEFWRm9ybWF0Q29udGV4dCAqaWM7IC8qKjwgdGhlIGNvbnRhaW5pbmcgKFJUU1ApIGRlbXV4IGNvbnRleHQgKi8KKyAgICAvKiogRWFjaCBSRFQgc3RyZWFtLXNldCAocmVwcmVzZW50ZWQgYnkgb25lIFJUU1BTdHJlYW0pIGNhbiBjb250YWluCisgICAgICogbXVsdGlwbGUgc3RyZWFtcyAob2YgdGhlIHNhbWUgY29udGVudCwgYnV0IHdpdGggcG9zc2libHkgZGlmZmVyZW50CisgICAgICogY29kZWNzL2JpdHJhdGVzKS4gRWFjaCBzdWNoIHN0cmVhbSBpcyByZXByZXNlbnRlZCBieSBvbmUgQVZTdHJlYW0KKyAgICAgKiBpbiB0aGUgQVZGb3JtYXRDb250ZXh0LCBhbmQgdGhpcyB2YXJpYWJsZSBwb2ludHMgdG8gdGhlIG9mZnNldCBpbgorICAgICAqIHRoYXQgYXJyYXkgc3VjaCB0aGF0IHRoZSBmaXJzdCBpcyB0aGUgZmlyc3Qgc3RyZWFtIG9mIHRoaXMgc2V0LiAqLworICAgIEFWU3RyZWFtICoqc3RyZWFtczsKKyAgICBpbnQgbl9zdHJlYW1zOyAvKio8IHN0cmVhbXMgd2l0aCBpZGVudGlmaWNhbCBjb250ZW50IGluIHRoaXMgc2V0ICovCisgICAgdm9pZCAqZHluYW1pY19wcm90b2NvbF9jb250ZXh0OworICAgIER5bmFtaWNQYXlsb2FkUGFja2V0SGFuZGxlclByb2MgcGFyc2VfcGFja2V0OworICAgIHVpbnQzMl90IHByZXZfdGltZXN0YW1wOworICAgIGludCBwcmV2X3NldF9pZCwgcHJldl9zdHJlYW1faWQ7Cit9OworCitSRFREZW11eENvbnRleHQgKgorZmZfcmR0X3BhcnNlX29wZW4oQVZGb3JtYXRDb250ZXh0ICppYywgaW50IGZpcnN0X3N0cmVhbV9vZl9zZXRfaWR4LAorICAgICAgICAgICAgICAgICAgdm9pZCAqcHJpdl9kYXRhLCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyKQoreworICAgIFJEVERlbXV4Q29udGV4dCAqcyA9IGF2X21hbGxvY3ooc2l6ZW9mKFJEVERlbXV4Q29udGV4dCkpOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzLT5pYyA9IGljOworICAgIHMtPnN0cmVhbXMgPSAmaWMtPnN0cmVhbXNbZmlyc3Rfc3RyZWFtX29mX3NldF9pZHhdOworICAgIGRvIHsKKyAgICAgICAgcy0+bl9zdHJlYW1zKys7CisgICAgfSB3aGlsZSAoZmlyc3Rfc3RyZWFtX29mX3NldF9pZHggKyBzLT5uX3N0cmVhbXMgPCBpYy0+bmJfc3RyZWFtcyAmJgorICAgICAgICAgICAgIHMtPnN0cmVhbXNbcy0+bl9zdHJlYW1zXS0+aWQgPT0gcy0+c3RyZWFtc1swXS0+aWQpOworICAgIHMtPnByZXZfc2V0X2lkICAgID0gLTE7CisgICAgcy0+cHJldl9zdHJlYW1faWQgPSAtMTsKKyAgICBzLT5wcmV2X3RpbWVzdGFtcCA9IC0xOworICAgIHMtPnBhcnNlX3BhY2tldCA9IGhhbmRsZXIgPyBoYW5kbGVyLT5wYXJzZV9wYWNrZXQgOiBOVUxMOworICAgIHMtPmR5bmFtaWNfcHJvdG9jb2xfY29udGV4dCA9IHByaXZfZGF0YTsKKworICAgIHJldHVybiBzOworfQorCit2b2lkCitmZl9yZHRfcGFyc2VfY2xvc2UoUkRURGVtdXhDb250ZXh0ICpzKQoreworICAgIGF2X2ZyZWUocyk7Cit9CisKK3N0cnVjdCBQYXlsb2FkQ29udGV4dCB7CisgICAgQVZGb3JtYXRDb250ZXh0ICpybWN0eDsKKyAgICBpbnQgbmJfcm1zdDsKKyAgICBSTVN0cmVhbSAqKnJtc3Q7CisgICAgdWludDhfdCAqbWx0aV9kYXRhOworICAgIHVuc2lnbmVkIGludCBtbHRpX2RhdGFfc2l6ZTsKKyAgICBjaGFyIGJ1ZmZlcltSVFBfTUFYX1BBQ0tFVF9MRU5HVEggKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFXTsKKyAgICBpbnQgYXVkaW9fcGt0X2NudDsgLyoqPCByZW1haW5pbmcgYXVkaW8gcGFja2V0cyBpbiBybWRlYyAqLworfTsKKwordm9pZAorZmZfcmR0X2NhbGNfcmVzcG9uc2VfYW5kX2NoZWNrc3VtKGNoYXIgcmVzcG9uc2VbNDFdLCBjaGFyIGNoa3N1bVs5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjaGFsbGVuZ2UpCit7CisgICAgaW50IGNoX2xlbiA9IHN0cmxlbiAoY2hhbGxlbmdlKSwgaTsKKyAgICB1bnNpZ25lZCBjaGFyIHpyZXNbMTZdLAorICAgICAgICBidWZbNjRdID0geyAweGExLCAweGU5LCAweDE0LCAweDlkLCAweDBlLCAweDZiLCAweDNiLCAweDU5IH07CisjZGVmaW5lIFhPUl9UQUJMRV9TSVpFIDM3CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeG9yX3RhYmxlW1hPUl9UQUJMRV9TSVpFXSA9IHsKKyAgICAgICAgMHgwNSwgMHgxOCwgMHg3NCwgMHhkMCwgMHgwZCwgMHgwOSwgMHgwMiwgMHg1MywKKyAgICAgICAgMHhjMCwgMHgwMSwgMHgwNSwgMHgwNSwgMHg2NywgMHgwMywgMHgxOSwgMHg3MCwKKyAgICAgICAgMHgwOCwgMHgyNywgMHg2NiwgMHgxMCwgMHgxMCwgMHg3MiwgMHgwOCwgMHgwOSwKKyAgICAgICAgMHg2MywgMHgxMSwgMHgwMywgMHg3MSwgMHgwOCwgMHgwOCwgMHg3MCwgMHgwMiwKKyAgICAgICAgMHgxMCwgMHg1NywgMHgwNSwgMHgxOCwgMHg1NCB9OworCisgICAgLyogc29tZSAobGVuZ3RoKSBjaGVja3MgKi8KKyAgICBpZiAoY2hfbGVuID09IDQwKSAvKiB3aGF0IGEgaGFjay4uLiAqLworICAgICAgICBjaF9sZW4gPSAzMjsKKyAgICBlbHNlIGlmIChjaF9sZW4gPiA1NikKKyAgICAgICAgY2hfbGVuID0gNTY7CisgICAgbWVtY3B5KGJ1ZiArIDgsIGNoYWxsZW5nZSwgY2hfbGVuKTsKKworICAgIC8qIHhvciBjaGFsbGVuZ2UgYnl0ZXdpc2Ugd2l0aCB4b3JfdGFibGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWE9SX1RBQkxFX1NJWkU7IGkrKykKKyAgICAgICAgYnVmWzggKyBpXSBePSB4b3JfdGFibGVbaV07CisKKyAgICBhdl9tZDVfc3VtKHpyZXMsIGJ1ZiwgNjQpOworICAgIGZmX2RhdGFfdG9faGV4KHJlc3BvbnNlLCB6cmVzLCAxNiwgMSk7CisKKyAgICAvKiBhZGQgdGFpbCAqLworICAgIHN0cmNweSAocmVzcG9uc2UgKyAzMiwgIjAxZDBhOGUzIik7CisKKyAgICAvKiBjYWxjdWxhdGUgY2hlY2tzdW0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBjaGtzdW1baV0gPSByZXNwb25zZVtpICogNF07CisgICAgY2hrc3VtWzhdID0gMDsKK30KKworc3RhdGljIGludAorcmR0X2xvYWRfbWRwciAoUGF5bG9hZENvbnRleHQgKnJkdCwgQVZTdHJlYW0gKnN0LCBpbnQgcnVsZV9ucikKK3sKKyAgICBBVklPQ29udGV4dCBwYjsKKyAgICBpbnQgc2l6ZTsKKyAgICB1aW50MzJfdCB0YWc7CisKKyAgICAvKioKKyAgICAgKiBMYXlvdXQgb2YgdGhlIE1MVEkgY2h1bms6CisgICAgICogNDogTUxUSQorICAgICAqIDI6IG51bWJlciBvZiBzdHJlYW1zCisgICAgICogVGhlbiBmb3IgZWFjaCBzdHJlYW0gKFtudW1iZXJfb2Zfc3RyZWFtc10gdGltZXMpOgorICAgICAqICAgICAyOiBtZHByIGluZGV4CisgICAgICogMjogbnVtYmVyIG9mIG1kcHIgY2h1bmtzCisgICAgICogVGhlbiBmb3IgZWFjaCBtZHByIGNodW5rIChbbnVtYmVyX29mX21kcHJfY2h1bmtzXSB0aW1lcyk6CisgICAgICogICAgIDQ6IHNpemUKKyAgICAgKiAgICAgW3NpemVdOiBkYXRhCisgICAgICogd2Ugc2tpcCBNRFBSIGNodW5rcyB1bnRpbCB3ZSByZWFjaCB0aGUgb25lIG9mIHRoZSBzdHJlYW0KKyAgICAgKiB3ZSdyZSBpbnRlcmVzdGVkIGluLCBhbmQgZm9yd2FyZCB0aGF0IChbc2l6ZV0rW2RhdGFdKSB0bworICAgICAqIHRoZSBSTSBkZW11eGVyIHRvIHBhcnNlIHRoZSBzdHJlYW0tc3BlY2lmaWMgaGVhZGVyIGRhdGEuCisgICAgICovCisgICAgaWYgKCFyZHQtPm1sdGlfZGF0YSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGZmaW9faW5pdF9jb250ZXh0KCZwYiwgcmR0LT5tbHRpX2RhdGEsIHJkdC0+bWx0aV9kYXRhX3NpemUsIDAsCisgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICB0YWcgPSBhdmlvX3JsMzIoJnBiKTsKKyAgICBpZiAodGFnID09IE1LVEFHKCdNJywgJ0wnLCAnVCcsICdJJykpIHsKKyAgICAgICAgaW50IG51bSwgY2h1bmtfbnI7CisKKyAgICAgICAgLyogcmVhZCBpbmRleCBvZiBNRFBSIGNodW5rIG51bWJlcnMgKi8KKyAgICAgICAgbnVtID0gYXZpb19yYjE2KCZwYik7CisgICAgICAgIGlmIChydWxlX25yIDwgMCB8fCBydWxlX25yID49IG51bSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYXZpb19za2lwKCZwYiwgcnVsZV9uciAqIDIpOworICAgICAgICBjaHVua19uciA9IGF2aW9fcmIxNigmcGIpOworICAgICAgICBhdmlvX3NraXAoJnBiLCAobnVtIC0gMSAtIHJ1bGVfbnIpICogMik7CisKKyAgICAgICAgLyogcmVhZCBNRFBSIGNodW5rcyAqLworICAgICAgICBudW0gPSBhdmlvX3JiMTYoJnBiKTsKKyAgICAgICAgaWYgKGNodW5rX25yID49IG51bSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgd2hpbGUgKGNodW5rX25yLS0pCisgICAgICAgICAgICBhdmlvX3NraXAoJnBiLCBhdmlvX3JiMzIoJnBiKSk7CisgICAgICAgIHNpemUgPSBhdmlvX3JiMzIoJnBiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplID0gcmR0LT5tbHRpX2RhdGFfc2l6ZTsKKyAgICAgICAgYXZpb19zZWVrKCZwYiwgMCwgU0VFS19TRVQpOworICAgIH0KKyAgICBpZiAoZmZfcm1fcmVhZF9tZHByX2NvZGVjZGF0YShyZHQtPnJtY3R4LCAmcGIsIHN0LCByZHQtPnJtc3Rbc3QtPmluZGV4XSwgc2l6ZSwgTlVMTCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBBY3R1YWwgZGF0YSBoYW5kbGluZy4KKyAqLworCitpbnQKK2ZmX3JkdF9wYXJzZV9oZWFkZXIoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICBpbnQgKnBzZXRfaWQsIGludCAqcHNlcV9ubywgaW50ICpwc3RyZWFtX2lkLAorICAgICAgICAgICAgICAgICAgICBpbnQgKnBpc19rZXlmcmFtZSwgdWludDMyX3QgKnB0aW1lc3RhbXApCit7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgY29uc3VtZWQgPSAwLCBzZXRfaWQsIHNlcV9ubywgc3RyZWFtX2lkLCBpc19rZXlmcmFtZSwKKyAgICAgICAgbGVuX2luY2x1ZGVkLCBuZWVkX3JlbGlhYmxlOworICAgIHVpbnQzMl90IHRpbWVzdGFtcDsKKworICAgIC8qIHNraXAgc3RhdHVzIHBhY2tldHMgKi8KKyAgICB3aGlsZSAobGVuID49IDUgJiYgYnVmWzFdID09IDB4RkYgLyogc3RhdHVzIHBhY2tldCAqLykgeworICAgICAgICBpbnQgcGt0X2xlbjsKKworICAgICAgICBpZiAoIShidWZbMF0gJiAweDgwKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsgLyogbm90IGZvbGxvd2VkIGJ5IGEgZGF0YSBwYWNrZXQgKi8KKworICAgICAgICBwa3RfbGVuID0gQVZfUkIxNihidWYrMyk7CisgICAgICAgIGJ1ZiArPSBwa3RfbGVuOworICAgICAgICBsZW4gLT0gcGt0X2xlbjsKKyAgICAgICAgY29uc3VtZWQgKz0gcGt0X2xlbjsKKyAgICB9CisgICAgaWYgKGxlbiA8IDE2KQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyoqCisgICAgICogTGF5b3V0IG9mIHRoZSBoZWFkZXIgKGluIGJpdHMpOgorICAgICAqIDE6ICBsZW5faW5jbHVkZWQKKyAgICAgKiAgICAgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBoZWFkZXIgaW5jbHVkZXMgYSBsZW5ndGggZmllbGQ7CisgICAgICogICAgIHRoaXMgY2FuIGJlIHVzZWQgdG8gY29uY2F0ZW5hdGUgbXVsdGlwbGUgUkRUIHBhY2tldHMgaW4gYQorICAgICAqICAgICBzaW5nbGUgVURQL1RDUCBkYXRhIGZyYW1lIGFuZCBpcyB1c2VkIHRvIHByZWNlZGUgUkRUIGRhdGEKKyAgICAgKiAgICAgYnkgc3RyZWFtIHN0YXR1cyBwYWNrZXRzCisgICAgICogMTogIG5lZWRfcmVsaWFibGUKKyAgICAgKiAgICAgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBoZWFkZXIgaW5jbHVkZXMgYSAicmVsaWFibGUKKyAgICAgKiAgICAgc2VxdWVuY2UgbnVtYmVyIjsgdGhlc2UgYXJlIGFwcGFyZW50bHkgc2VxdWVuY2UgbnVtYmVycyBvZgorICAgICAqICAgICBkYXRhIHBhY2tldHMgYWxvbmUuIEZvciBkYXRhIHBhY2tldHMsIHRoaXMgZmxhZyBpcyBhbHdheXMKKyAgICAgKiAgICAgc2V0LCBhY2NvcmRpbmcgdG8gdGhlIFJlYWwgZG9jdW1lbnRhdGlvbiBbMV0KKyAgICAgKiA1OiAgc2V0X2lkCisgICAgICogICAgIElEIG9mIGEgc2V0IG9mIHN0cmVhbXMgb2YgaWRlbnRpY2FsIGNvbnRlbnQsIHBvc3NpYmx5IHdpdGgKKyAgICAgKiAgICAgZGlmZmVyZW50IGNvZGVjcyBvciBiaXRyYXRlcworICAgICAqIDE6ICBpc19yZWxpYWJsZQorICAgICAqICAgICBGbGFnIHNldCBmb3IgY2VydGFpbiBzdHJlYW1zIGRlZW1lZCBsZXNzIHRvbGVyYWJsZSBmb3IgcGFja2V0CisgICAgICogICAgIGxvc3MKKyAgICAgKiAxNjogc2VxX25vCisgICAgICogICAgIFBhY2tldCBzZXF1ZW5jZSBudW1iZXI7IGlmID49MHhGRjAwLCB0aGlzIGlzIGEgbm9uLWRhdGEgcGFja2V0CisgICAgICogICAgIGNvbnRhaW5pbmcgc3RyZWFtIHN0YXR1cyBpbmZvLCB0aGUgc2Vjb25kIGJ5dGUgaW5kaWNhdGVzIHRoZQorICAgICAqICAgICB0eXBlIG9mIHN0YXR1cyBwYWNrZXQgKHNlZSB3aXJlc2hhcmsgZG9jcyAvIHNvdXJjZSBjb2RlIFsyXSkKKyAgICAgKiBpZiAobGVuX2luY2x1ZGVkKSB7CisgICAgICogICAgIDE2OiBwYWNrZXRfbGVuCisgICAgICogfSBlbHNlIHsKKyAgICAgKiAgICAgcGFja2V0X2xlbiA9IHJlbWFpbmRlciBvZiBVRFAvVENQIGZyYW1lCisgICAgICogfQorICAgICAqIDE6ICBpc19iYWNrX3RvX2JhY2sKKyAgICAgKiAgICAgQmFjay10by1CYWNrIGZsYWc7IHVzZWQgZm9yIHRpbWluZywgc2V0IGZvciBvbmUgaW4gZXZlcnkgMTAKKyAgICAgKiAgICAgcGFja2V0cywgYWNjb3JkaW5nIHRvIHRoZSBSZWFsIGRvY3VtZW50YXRpb24gWzFdCisgICAgICogMTogIGlzX3Nsb3dfZGF0YQorICAgICAqICAgICBTbG93LWRhdGEgZmxhZzsgY3VycmVudGx5IHVudXNlZCwgYWNjb3JkaW5nIHRvIFJlYWwgZG9jcyBbMV0KKyAgICAgKiA1OiAgc3RyZWFtX2lkCisgICAgICogICAgIElEIG9mIHRoZSBzdHJlYW0gd2l0aGluIHRoaXMgcGFydGljdWxhciBzZXQgb2Ygc3RyZWFtcworICAgICAqIDE6ICBpc19ub19rZXlmcmFtZQorICAgICAqICAgICBOb24ta2V5ZnJhbWUgZmxhZyAodW5zZXQgaWYgcGFja2V0IGJlbG9uZ3MgdG8gYSBrZXlmcmFtZSkKKyAgICAgKiAzMjogdGltZXN0YW1wIChQVFMpCisgICAgICogaWYgKHNldF9pZCA9PSAweDFGKSB7CisgICAgICogICAgIDE2OiBzZXRfaWQgKGV4dGVuZGVkIHNldC1vZi1zdHJlYW1zIElEOyBzZWUgc2V0X2lkKQorICAgICAqIH0KKyAgICAgKiBpZiAobmVlZF9yZWxpYWJsZSkgeworICAgICAqICAgICAxNjogcmVsaWFibGVfc2VxX25vCisgICAgICogICAgICAgICBSZWxpYWJsZSBzZXF1ZW5jZSBudW1iZXIgKHNlZSBuZWVkX3JlbGlhYmxlKQorICAgICAqIH0KKyAgICAgKiBpZiAoc3RyZWFtX2lkID09IDB4M0YpIHsKKyAgICAgKiAgICAgMTY6IHN0cmVhbV9pZCAoZXh0ZW5kZWQgc3RyZWFtIElEOyBzZWUgc3RyZWFtX2lkKQorICAgICAqIH0KKyAgICAgKiBbMV0gaHR0cHM6Ly9wcm90b2NvbC5oZWxpeGNvbW11bml0eS5vcmcvZmlsZXMvMjAwNS9kZXZkb2NzL1JEVF9GZWF0dXJlX0xldmVsXzIwLnR4dAorICAgICAqIFsyXSBodHRwOi8vd3d3LndpcmVzaGFyay5vcmcvZG9jcy9kZnJlZi9yL3JkdC5odG1sIGFuZAorICAgICAqICAgICBodHRwOi8vYW5vbnN2bi53aXJlc2hhcmsub3JnL3ZpZXd2Yy90cnVuay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJkdC5jCisgICAgICovCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgbGVuIDw8IDMpOworICAgIGxlbl9pbmNsdWRlZCAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBuZWVkX3JlbGlhYmxlID0gZ2V0X2JpdHMxKCZnYik7CisgICAgc2V0X2lkICAgICAgICA9IGdldF9iaXRzKCZnYiwgNSk7CisgICAgc2tpcF9iaXRzKCZnYiwgMSk7CisgICAgc2VxX25vICAgICAgICA9IGdldF9iaXRzKCZnYiwgMTYpOworICAgIGlmIChsZW5faW5jbHVkZWQpCisgICAgICAgIHNraXBfYml0cygmZ2IsIDE2KTsKKyAgICBza2lwX2JpdHMoJmdiLCAyKTsKKyAgICBzdHJlYW1faWQgICAgID0gZ2V0X2JpdHMoJmdiLCA1KTsKKyAgICBpc19rZXlmcmFtZSAgID0gIWdldF9iaXRzMSgmZ2IpOworICAgIHRpbWVzdGFtcCAgICAgPSBnZXRfYml0c19sb25nKCZnYiwgMzIpOworICAgIGlmIChzZXRfaWQgPT0gMHgxZikKKyAgICAgICAgc2V0X2lkICAgID0gZ2V0X2JpdHMoJmdiLCAxNik7CisgICAgaWYgKG5lZWRfcmVsaWFibGUpCisgICAgICAgIHNraXBfYml0cygmZ2IsIDE2KTsKKyAgICBpZiAoc3RyZWFtX2lkID09IDB4MWYpCisgICAgICAgIHN0cmVhbV9pZCA9IGdldF9iaXRzKCZnYiwgMTYpOworCisgICAgaWYgKHBzZXRfaWQpICAgICAgKnBzZXRfaWQgICAgICA9IHNldF9pZDsKKyAgICBpZiAocHNlcV9ubykgICAgICAqcHNlcV9ubyAgICAgID0gc2VxX25vOworICAgIGlmIChwc3RyZWFtX2lkKSAgICpwc3RyZWFtX2lkICAgPSBzdHJlYW1faWQ7CisgICAgaWYgKHBpc19rZXlmcmFtZSkgKnBpc19rZXlmcmFtZSA9IGlzX2tleWZyYW1lOworICAgIGlmIChwdGltZXN0YW1wKSAgICpwdGltZXN0YW1wICAgPSB0aW1lc3RhbXA7CisKKyAgICByZXR1cm4gY29uc3VtZWQgKyAoZ2V0X2JpdHNfY291bnQoJmdiKSA+PiAzKTsKK30KKworLyoqPCByZXR1cm4gMCBvbiBwYWNrZXQsIG5vIG1vcmUgbGVmdCwgMSBvbiBwYWNrZXQsIDEgb24gcGFydGlhbCBwYWNrZXQuLi4gKi8KK3N0YXRpYyBpbnQKK3JkdF9wYXJzZV9wYWNrZXQgKEFWRm9ybWF0Q29udGV4dCAqY3R4LCBQYXlsb2FkQ29udGV4dCAqcmR0LCBBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0LCB1aW50MzJfdCAqdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuLCB1aW50MTZfdCBydHBfc2VxLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IHNlcSA9IDEsIHJlczsKKyAgICBBVklPQ29udGV4dCBwYjsKKworICAgIGlmIChyZHQtPmF1ZGlvX3BrdF9jbnQgPT0gMCkgeworICAgICAgICBpbnQgcG9zOworCisgICAgICAgIGZmaW9faW5pdF9jb250ZXh0KCZwYiwgKHVpbnQ4X3QgKilidWYsIGxlbiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgIGZsYWdzID0gKGZsYWdzICYgUlRQX0ZMQUdfS0VZKSA/IDIgOiAwOworICAgICAgICByZXMgPSBmZl9ybV9wYXJzZV9wYWNrZXQgKHJkdC0+cm1jdHgsICZwYiwgc3QsIHJkdC0+cm1zdFtzdC0+aW5kZXhdLCBsZW4sIHBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VxLCBmbGFncywgKnRpbWVzdGFtcCk7CisgICAgICAgIHBvcyA9IGF2aW9fdGVsbCgmcGIpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIGlmIChyZXMgPiAwKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkgKHJkdC0+YnVmZmVyLCBidWYgKyBwb3MsIGxlbiAtIHBvcyk7CisgICAgICAgICAgICAgICAgcmR0LT5ybWN0eC0+cGIgPSBhdmlvX2FsbG9jX2NvbnRleHQgKHJkdC0+YnVmZmVyLCBsZW4gLSBwb3MsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGdldF9jYWNoZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CitnZXRfY2FjaGU6CisgICAgICAgIHJkdC0+YXVkaW9fcGt0X2NudCA9CisgICAgICAgICAgICBmZl9ybV9yZXRyaWV2ZV9jYWNoZSAocmR0LT5ybWN0eCwgcmR0LT5ybWN0eC0+cGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QsIHJkdC0+cm1zdFtzdC0+aW5kZXhdLCBwa3QpOworICAgICAgICBpZiAocmR0LT5hdWRpb19wa3RfY250ID09IDAgJiYKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKQorICAgICAgICAgICAgYXZfZnJlZXAoJnJkdC0+cm1jdHgtPnBiKTsKKyAgICB9CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgcGt0LT5wdHMgPSAqdGltZXN0YW1wOworCisgICAgcmV0dXJuIHJkdC0+YXVkaW9fcGt0X2NudCA+IDA7Cit9CisKK2ludAorZmZfcmR0X3BhcnNlX3BhY2tldChSRFREZW11eENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipidWZwdHIsIGludCBsZW4pCit7CisgICAgdWludDhfdCAqYnVmID0gYnVmcHRyID8gKmJ1ZnB0ciA6IE5VTEw7CisgICAgaW50IHNlcV9ubywgZmxhZ3MgPSAwLCBzdHJlYW1faWQsIHNldF9pZCwgaXNfa2V5ZnJhbWU7CisgICAgdWludDMyX3QgdGltZXN0YW1wOworICAgIGludCBydj0gMDsKKworICAgIGlmICghcy0+cGFyc2VfcGFja2V0KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIWJ1ZiAmJiBzLT5wcmV2X3N0cmVhbV9pZCAhPSAtMSkgeworICAgICAgICAvKiByZXR1cm4gdGhlIG5leHQgcGFja2V0cywgaWYgYW55ICovCisgICAgICAgIHRpbWVzdGFtcD0gMDsgLy8vPCBTaG91bGQgbm90IGJlIHVzZWQgaWYgYnVmIGlzIE5VTEwsIGJ1dCBzaG91bGQgYmUgc2V0IHRvIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHBhY2tldCByZXR1cm5lZC4uLi4KKyAgICAgICAgcnY9IHMtPnBhcnNlX3BhY2tldChzLT5pYywgcy0+ZHluYW1pY19wcm90b2NvbF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbcy0+cHJldl9zdHJlYW1faWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdCwgJnRpbWVzdGFtcCwgTlVMTCwgMCwgMCwgZmxhZ3MpOworICAgICAgICByZXR1cm4gcnY7CisgICAgfQorCisgICAgaWYgKGxlbiA8IDEyKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcnYgPSBmZl9yZHRfcGFyc2VfaGVhZGVyKGJ1ZiwgbGVuLCAmc2V0X2lkLCAmc2VxX25vLCAmc3RyZWFtX2lkLCAmaXNfa2V5ZnJhbWUsICZ0aW1lc3RhbXApOworICAgIGlmIChydiA8IDApCisgICAgICAgIHJldHVybiBydjsKKyAgICBpZiAoaXNfa2V5ZnJhbWUgJiYKKyAgICAgICAgKHNldF9pZCAhPSBzLT5wcmV2X3NldF9pZCB8fCB0aW1lc3RhbXAgIT0gcy0+cHJldl90aW1lc3RhbXAgfHwKKyAgICAgICAgIHN0cmVhbV9pZCAhPSBzLT5wcmV2X3N0cmVhbV9pZCkpIHsKKyAgICAgICAgZmxhZ3MgfD0gUlRQX0ZMQUdfS0VZOworICAgICAgICBzLT5wcmV2X3NldF9pZCAgICA9IHNldF9pZDsKKyAgICAgICAgcy0+cHJldl90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgfQorICAgIHMtPnByZXZfc3RyZWFtX2lkID0gc3RyZWFtX2lkOworICAgIGJ1ZiArPSBydjsKKyAgICBsZW4gLT0gcnY7CisKKyAgICAgaWYgKHMtPnByZXZfc3RyZWFtX2lkID49IHMtPm5fc3RyZWFtcykgeworICAgICAgICAgcy0+cHJldl9zdHJlYW1faWQgPSAtMTsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgfQorCisgICAgcnYgPSBzLT5wYXJzZV9wYWNrZXQocy0+aWMsIHMtPmR5bmFtaWNfcHJvdG9jb2xfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW3MtPnByZXZfc3RyZWFtX2lkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwa3QsICZ0aW1lc3RhbXAsIGJ1ZiwgbGVuLCAwLCBmbGFncyk7CisKKyAgICByZXR1cm4gcnY7Cit9CisKK3ZvaWQKK2ZmX3JkdF9zdWJzY3JpYmVfcnVsZSAoY2hhciAqY21kLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9uciwgaW50IHJ1bGVfbnIpCit7CisgICAgYXZfc3RybGNhdGYoY21kLCBzaXplLCAic3RyZWFtPSVkO3J1bGU9JWQsc3RyZWFtPSVkO3J1bGU9JWQiLAorICAgICAgICAgICAgICAgIHN0cmVhbV9uciwgcnVsZV9uciAqIDIsIHN0cmVhbV9uciwgcnVsZV9uciAqIDIgKyAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorcmR0X3BhcnNlX2I2NGJ1ZiAodW5zaWduZWQgaW50ICp0YXJnZXRfbGVuLCBjb25zdCBjaGFyICpwKQoreworICAgIHVuc2lnbmVkIGNoYXIgKnRhcmdldDsKKyAgICBpbnQgbGVuID0gc3RybGVuKHApOworICAgIGlmICgqcCA9PSAnXCInKSB7CisgICAgICAgIHArKzsKKyAgICAgICAgbGVuIC09IDI7IC8qIHNraXAgZW1icmFjaW5nICIgYXQgc3RhcnQvZW5kICovCisgICAgfQorICAgICp0YXJnZXRfbGVuID0gbGVuICogMyAvIDQ7CisgICAgdGFyZ2V0ID0gYXZfbWFsbG9jeigqdGFyZ2V0X2xlbiArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghdGFyZ2V0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhdl9iYXNlNjRfZGVjb2RlKHRhcmdldCwgcCwgKnRhcmdldF9sZW4pOworICAgIHJldHVybiB0YXJnZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3JkdF9wYXJzZV9zZHBfbGluZSAoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpyZHQsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisgICAgQVZTdHJlYW0gKnN0cmVhbSA9IHMtPnN0cmVhbXNbc3RfaW5kZXhdOworICAgIGNvbnN0IGNoYXIgKnAgPSBsaW5lOworCisgICAgaWYgKGF2X3N0cnN0YXJ0KHAsICJPcGFxdWVEYXRhOmJ1ZmZlcjsiLCAmcCkpIHsKKyAgICAgICAgcmR0LT5tbHRpX2RhdGEgPSByZHRfcGFyc2VfYjY0YnVmKCZyZHQtPm1sdGlfZGF0YV9zaXplLCBwKTsKKyAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KHAsICJTdGFydFRpbWU6aW50ZWdlcjsiLCAmcCkpCisgICAgICAgIHN0cmVhbS0+Zmlyc3RfZHRzID0gYXRvaShwKTsKKyAgICBlbHNlIGlmIChhdl9zdHJzdGFydChwLCAiQVNNUnVsZUJvb2s6c3RyaW5nOyIsICZwKSkgeworICAgICAgICBpbnQgbiwgZmlyc3QgPSAtMTsKKworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgcy0+bmJfc3RyZWFtczsgbisrKQorICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbbl0tPmlkID09IHN0cmVhbS0+aWQpIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBzLT5zdHJlYW1zW25dLT5pbmRleCArIDEsIGVycjsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPT0gLTEpIGZpcnN0ID0gbjsKKyAgICAgICAgICAgICAgICBpZiAocmR0LT5uYl9ybXN0IDwgY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmcmR0LT5ybXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICogc2l6ZW9mKCpyZHQtPnJtc3QpKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZHQtPm5iX3Jtc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZW1zZXQocmR0LT5ybXN0ICsgcmR0LT5uYl9ybXN0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvdW50IC0gcmR0LT5uYl9ybXN0KSAqIHNpemVvZigqcmR0LT5ybXN0KSk7CisgICAgICAgICAgICAgICAgICAgIHJkdC0+bmJfcm1zdCA9IGNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZHQtPnJtc3Rbcy0+c3RyZWFtc1tuXS0+aW5kZXhdID0gZmZfcm1fYWxsb2Nfcm1zdHJlYW0oKTsKKyAgICAgICAgICAgICAgICByZHRfbG9hZF9tZHByKHJkdCwgcy0+c3RyZWFtc1tuXSwgKG4gLSBmaXJzdCkgKiAyKTsKKyAgICAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcmVhbF9wYXJzZV9hc21fcnVsZShBVlN0cmVhbSAqc3QsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKmVuZCkKK3sKKyAgICBkbyB7CisgICAgICAgIC8qIGNhbiBiZSBlaXRoZXIgYXZlcmFnZWJhbmR3aWR0aD0gb3IgQXZlcmFnZUJhbmR3aWR0aD0gKi8KKyAgICAgICAgaWYgKHNzY2FuZihwLCAiICUqMVtBYV12ZXJhZ2UlKjFbQmJdYW5kd2lkdGg9JWQiLCAmc3QtPmNvZGVjLT5iaXRfcmF0ZSkgPT0gMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIShwID0gc3RyY2hyKHAsICcsJykpIHx8IHAgPiBlbmQpCisgICAgICAgICAgICBwID0gZW5kOworICAgICAgICBwKys7CisgICAgfSB3aGlsZSAocCA8IGVuZCk7Cit9CisKK3N0YXRpYyBBVlN0cmVhbSAqCithZGRfZHN0cmVhbShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpvcmlnX3N0KQoreworICAgIEFWU3RyZWFtICpzdDsKKworICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0LT5pZCA9IG9yaWdfc3QtPmlkOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IG9yaWdfc3QtPmNvZGVjLT5jb2RlY190eXBlOworICAgIHN0LT5maXJzdF9kdHMgICAgICAgICA9IG9yaWdfc3QtPmZpcnN0X2R0czsKKworICAgIHJldHVybiBzdDsKK30KKworc3RhdGljIHZvaWQKK3JlYWxfcGFyc2VfYXNtX3J1bGVib29rKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKm9yaWdfc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwKQoreworICAgIGNvbnN0IGNoYXIgKmVuZDsKKyAgICBpbnQgbl9ydWxlcyA9IDAsIG9kZCA9IDA7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgLyoqCisgICAgICogVGhlIEFTTVJ1bGVCb29rIGNvbnRhaW5zIGEgbGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQgc3RyaW5ncyBwZXIgcnVsZSwKKyAgICAgKiBhbmQgZWFjaCBydWxlIGlzIHNlcGFyYXRlZCBieSBhIDsuIFRoZSBsYXN0IG9uZSBhbHNvIGhhcyBhIDsgYXQgdGhlCisgICAgICogZW5kIHNvIHdlIGNhbiB1c2UgaXQgYXMgZGVsaW1pdGVyLgorICAgICAqIEV2ZXJ5IHJ1bGUgb2NjdXJzIHR3aWNlLCBvbmNlIGZvciB3aGVuIHRoZSBSVFNQIHBhY2tldCBoZWFkZXIgbWFya2VyCisgICAgICogaXMgc2V0IGFuZCBvbmNlIGZvciBpZiBpdCBpc24ndC4gV2Ugb25seSByZWFkIHRoZSBmaXJzdCBiZWNhdXNlIHdlCisgICAgICogZG9uJ3QgY2FyZSBtdWNoICh0aGF0J3Mgd2hhdCB0aGUgIm9kZCIgdmFyaWFibGUgaXMgZm9yKS4KKyAgICAgKiBFYWNoIHJ1bGUgY29udGFpbnMgYSBzZXQgb2Ygb25lIG9yIG1vcmUgc3RhdGVtZW50cywgb3B0aW9uYWxseQorICAgICAqIHByZWNlZGVkIGJ5IGEgc2luZ2xlIGNvbmRpdGlvbi4gSWYgdGhlcmUncyBhIGNvbmRpdGlvbiwgdGhlIHJ1bGUKKyAgICAgKiBzdGFydHMgd2l0aCBhICcjJy4gTXVsdGlwbGUgY29uZGl0aW9ucyBhcmUgbWVyZ2VkIGJldHdlZW4gYnJhY2tldHMsCisgICAgICogc28gdGhlcmUgYXJlIG5ldmVyIG11bHRpcGxlIGNvbmRpdGlvbnMgc3ByZWFkIG91dCBvdmVyIHNlcGFyYXRlCisgICAgICogc3RhdGVtZW50cy4gR2VuZXJhbGx5LCB0aGVzZSBjb25kaXRpb25zIGFyZSBiaXRyYXRlIGxpbWl0cyAobWluL21heCkKKyAgICAgKiBmb3IgbXVsdGktYml0cmF0ZSBzdHJlYW1zLgorICAgICAqLworICAgIGlmICgqcCA9PSAnXCInKSBwKys7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZW5kID0gc3RyY2hyKHAsICc7JykpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmICghb2RkICYmIGVuZCAhPSBwKSB7CisgICAgICAgICAgICBpZiAobl9ydWxlcyA+IDApCisgICAgICAgICAgICAgICAgc3QgPSBhZGRfZHN0cmVhbShzLCBvcmlnX3N0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdCA9IG9yaWdfc3Q7CisgICAgICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmVhbF9wYXJzZV9hc21fcnVsZShzdCwgcCwgZW5kKTsKKyAgICAgICAgICAgIG5fcnVsZXMrKzsKKyAgICAgICAgfQorICAgICAgICBwID0gZW5kICsgMTsKKyAgICAgICAgb2RkIF49IDE7CisgICAgfQorfQorCit2b2lkCitmZl9yZWFsX3BhcnNlX3NkcF9hX2xpbmUgKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGluZSkKK3sKKyAgICBjb25zdCBjaGFyICpwID0gbGluZTsKKworICAgIGlmIChhdl9zdHJzdGFydChwLCAiQVNNUnVsZUJvb2s6c3RyaW5nOyIsICZwKSkKKyAgICAgICAgcmVhbF9wYXJzZV9hc21fcnVsZWJvb2socywgcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLCBwKTsKK30KKworc3RhdGljIFBheWxvYWRDb250ZXh0ICoKK3JkdF9uZXdfY29udGV4dCAodm9pZCkKK3sKKyAgICBQYXlsb2FkQ29udGV4dCAqcmR0ID0gYXZfbWFsbG9jeihzaXplb2YoUGF5bG9hZENvbnRleHQpKTsKKyAgICBpZiAoIXJkdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZHQtPnJtY3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOworICAgIGlmICghcmR0LT5ybWN0eCkKKyAgICAgICAgYXZfZnJlZXAoJnJkdCk7CisKKyAgICByZXR1cm4gcmR0OworfQorCitzdGF0aWMgaW50CityZHRfaW5pdF9jb250ZXh0IChBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdF9pbmRleCwgUGF5bG9hZENvbnRleHQgKnJkdCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9jb3B5X3doaXRlbGlzdHMocmR0LT5ybWN0eCwgcykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiBhdmZvcm1hdF9vcGVuX2lucHV0KCZyZHQtPnJtY3R4LCAiIiwgJmZmX3JkdF9kZW11eGVyLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3JkdF9mcmVlX2NvbnRleHQgKFBheWxvYWRDb250ZXh0ICpyZHQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmR0LT5uYl9ybXN0OyBpKyspCisgICAgICAgIGlmIChyZHQtPnJtc3RbaV0pIHsKKyAgICAgICAgICAgIGZmX3JtX2ZyZWVfcm1zdHJlYW0ocmR0LT5ybXN0W2ldKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZyZHQtPnJtc3RbaV0pOworICAgICAgICB9CisgICAgaWYgKHJkdC0+cm1jdHgpCisgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZyZHQtPnJtY3R4KTsKKyAgICBhdl9mcmVlcCgmcmR0LT5tbHRpX2RhdGEpOworICAgIGF2X2ZyZWVwKCZyZHQtPnJtc3QpOworICAgIGF2X2ZyZWUocmR0KTsKK30KKworI2RlZmluZSBSRFRfSEFORExFUihuLCBzLCB0KSBcCitzdGF0aWMgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciByZHRfICMjIG4gIyMgX2hhbmRsZXIgPSB7IFwKKyAgICAuZW5jX25hbWUgICAgICAgICA9IHMsIFwKKyAgICAuY29kZWNfdHlwZSAgICAgICA9IHQsIFwKKyAgICAuY29kZWNfaWQgICAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsIFwKKyAgICAucGFyc2Vfc2RwX2FfbGluZSA9IHJkdF9wYXJzZV9zZHBfbGluZSwgXAorICAgIC5hbGxvYyAgICAgICAgICAgID0gcmR0X25ld19jb250ZXh0LCBcCisgICAgLmluaXQgICAgICAgICAgICAgPSByZHRfaW5pdF9jb250ZXh0LCBcCisgICAgLmZyZWUgICAgICAgICAgICAgPSByZHRfZnJlZV9jb250ZXh0LCBcCisgICAgLnBhcnNlX3BhY2tldCAgICAgPSByZHRfcGFyc2VfcGFja2V0IFwKK30KKworUkRUX0hBTkRMRVIobGl2ZV92aWRlbywgIngtcG4tbXVsdGlyYXRlLXJlYWx2aWRlby1saXZlIiwgQVZNRURJQV9UWVBFX1ZJREVPKTsKK1JEVF9IQU5ETEVSKGxpdmVfYXVkaW8sICJ4LXBuLW11bHRpcmF0ZS1yZWFsYXVkaW8tbGl2ZSIsIEFWTUVESUFfVFlQRV9BVURJTyk7CitSRFRfSEFORExFUih2aWRlbywgICAgICAieC1wbi1yZWFsdmlkZW8iLCAgICAgICAgICAgICAgICBBVk1FRElBX1RZUEVfVklERU8pOworUkRUX0hBTkRMRVIoYXVkaW8sICAgICAgIngtcG4tcmVhbGF1ZGlvIiwgICAgICAgICAgICAgICAgQVZNRURJQV9UWVBFX0FVRElPKTsKKwordm9pZCBmZl9yZWdpc3Rlcl9yZHRfZHluYW1pY19wYXlsb2FkX2hhbmRsZXJzKHZvaWQpCit7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJnJkdF92aWRlb19oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmcmR0X2F1ZGlvX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZyZHRfbGl2ZV92aWRlb19oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmcmR0X2xpdmVfYXVkaW9faGFuZGxlcik7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcmR0LmggYi9mZm1wZWcvbGliYXZmb3JtYXQvcmR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2MDI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yZHQuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIFJlYWxtZWRpYSBSVFNQIChSRFQpIGRlZmluaXRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgUm9uYWxkIFMuIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1JEVF9ICisjZGVmaW5lIEFWRk9STUFUX1JEVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJ0cGRlYy5oIgorCit0eXBlZGVmIHN0cnVjdCBSRFREZW11eENvbnRleHQgUkRURGVtdXhDb250ZXh0OworCisvKioKKyAqIEFsbG9jYXRlIGFuZCBpbml0IHRoZSBSRFQgcGFyc2luZyBjb250ZXh0LgorICogQHBhcmFtIGljIHRoZSBjb250YWluaW5nIFJUU1AgZGVtdXhlciBjb250ZXh0CisgKiBAcGFyYW0gZmlyc3Rfc3RyZWFtX29mX3NldF9pZHggaW5kZXggdG8gdGhlIGZpcnN0IEFWU3RyZWFtIGluIHRoZSBSVFNQCisgKiAgICAgICAgICAgICAgZGVtdXhlciBjb250ZXh0J3MgaWMtPnN0cmVhbXMgYXJyYXkgdGhhdCBpcyBwYXJ0IG9mIHRoaXMKKyAqICAgICAgICAgICAgICBwYXJ0aWN1bGFyIHN0cmVhbSdzIHNldCBvZiBzdHJlYW1zICh3aXRoIGlkZW50aWNhbCBjb250ZW50KQorICogQHBhcmFtIHByaXZfZGF0YSBwcml2YXRlIGRhdGEgb2YgdGhlIHBheWxvYWQgZGF0YSBoYW5kbGVyIGNvbnRleHQKKyAqIEBwYXJhbSBoYW5kbGVyIHBvaW50ZXIgdG8gdGhlIHBhcnNlX3BhY2tldCgpIHBheWxvYWQgcGFyc2luZyBmdW5jdGlvbgorICogQHJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBSRFREZW11eENvbnRleHQuIEZyZWUgd2l0aCBmZl9yZHRfcGFyc2VfY2xvc2UoKS4KKyAqLworUkRURGVtdXhDb250ZXh0ICpmZl9yZHRfcGFyc2Vfb3BlbihBVkZvcm1hdENvbnRleHQgKmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3Rfc3RyZWFtX29mX3NldF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnByaXZfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqaGFuZGxlcik7Cit2b2lkIGZmX3JkdF9wYXJzZV9jbG9zZShSRFREZW11eENvbnRleHQgKnMpOworCisvKioKKyAqIENhbGN1bGF0ZSB0aGUgcmVzcG9uc2UgKFJlYWxDaGFsbGVuZ2UyIGluIHRoZSBSVFNQIGhlYWRlcikgdG8gdGhlCisgKiBjaGFsbGVuZ2UgKFJlYWxDaGFsbGVuZ2UxIGluIHRoZSBSVFNQIGhlYWRlciBmcm9tIHRoZSBSZWFsL0hlbGl4CisgKiBzZXJ2ZXIpLCB3aGljaCBpcyB1c2VkIGFzIHNvbWUgc29ydCBvZiBjbGllbnQgdmFsaWRhdGlvbi4KKyAqCisgKiBAcGFyYW0gcmVzcG9uc2UgcG9pbnRlciB0byByZXNwb25zZSBidWZmZXIsIGl0IHNob3VsZCBiZSBhdCBsZWFzdCA0MSBieXRlcworICogICAgICAgICAgICAgICAgICg0MCBkYXRhICsgMSB6ZXJvKSBieXRlcyBsb25nLgorICogQHBhcmFtIGNoa3N1bSBwb2ludGVyIHRvIGJ1ZmZlciBjb250YWluaW5nIGEgY2hlY2tzdW0gb2YgdGhlIHJlc3BvbnNlLAorICogICAgICAgICAgICAgICBpdCBzaG91bGQgYmUgYXQgbGVhc3QgOSAoOCBkYXRhICsgMSB6ZXJvKSBieXRlcyBsb25nLgorICogQHBhcmFtIGNoYWxsZW5nZSBwb2ludGVyIHRvIHRoZSBSZWFsQ2hhbGxlbmdlMSB2YWx1ZSBwcm92aWRlZCBieSB0aGUKKyAqICAgICAgICAgICAgICAgICAgc2VydmVyLgorICovCit2b2lkIGZmX3JkdF9jYWxjX3Jlc3BvbnNlX2FuZF9jaGVja3N1bShjaGFyIHJlc3BvbnNlWzQxXSwgY2hhciBjaGtzdW1bOV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjaGFsbGVuZ2UpOworCisvKioKKyAqIFJlZ2lzdGVyIFJEVC1yZWxhdGVkIGR5bmFtaWMgcGF5bG9hZCBoYW5kbGVycyB3aXRoIG91ciBjYWNoZS4KKyAqLwordm9pZCBmZl9yZWdpc3Rlcl9yZHRfZHluYW1pY19wYXlsb2FkX2hhbmRsZXJzKHZvaWQpOworCisvKioKKyAqIEFkZCBzdWJzY3JpcHRpb24gaW5mb3JtYXRpb24gdG8gU3Vic2NyaWJlIHBhcmFtZXRlciBzdHJpbmcuCisgKgorICogQHBhcmFtIGNtZCBzdHJpbmcgdG8gd3JpdGUgdGhlIHN1YnNjcmlwdGlvbiBpbmZvcm1hdGlvbiBpbnRvLgorICogQHBhcmFtIHNpemUgc2l6ZSBvZiBjbWQuCisgKiBAcGFyYW0gc3RyZWFtX25yIHN0cmVhbSBudW1iZXIuCisgKiBAcGFyYW0gcnVsZV9uciBydWxlIG51bWJlciB0byBjb25mb3JtIHRvLgorICovCit2b2lkIGZmX3JkdF9zdWJzY3JpYmVfcnVsZShjaGFyICpjbWQsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9uciwgaW50IHJ1bGVfbnIpOworCisvKioKKyAqIFBhcnNlIFJEVC1zdHlsZSBwYWNrZXQgaGVhZGVyLgorICoKKyAqIEBwYXJhbSBidWYgaW5wdXQgYnVmZmVyCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiBpbnB1dCBidWZmZXIKKyAqIEBwYXJhbSBwc2V0X2lkIHdpbGwgYmUgc2V0IHRvIHRoZSBzZXQgSUQgdGhpcyBwYWNrZXQgYmVsb25ncyB0bworICogQHBhcmFtIHBzZXFfbm8gd2lsbCBiZSBzZXQgdG8gdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgcGFja2V0CisgKiBAcGFyYW0gcHN0cmVhbV9pZCB3aWxsIGJlIHNldCB0byB0aGUgc3RyZWFtIElEIHRoaXMgcGFja2V0IGJlbG9uZ3MgdG8KKyAqIEBwYXJhbSBwaXNfa2V5ZnJhbWUgd2lsbCBiZSB3aGV0aGVyIHRoaXMgcGFja2V0IGJlbG9uZ3MgdG8gYSBrZXlmcmFtZQorICogQHBhcmFtIHB0aW1lc3RhbXAgd2lsbCBiZSBzZXQgdG8gdGhlIHRpbWVzdGFtcCBvZiB0aGUgcGFja2V0CisgKiBAcmV0dXJuIHRoZSBhbW91bnQgb2YgYnl0ZXMgY29uc3VtZWQsIG9yIG5lZ2F0aXZlIG9uIGVycm9yCisgKi8KK2ludCBmZl9yZHRfcGFyc2VfaGVhZGVyKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcHNldF9pZCwgaW50ICpwc2VxX25vLCBpbnQgKnBzdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBpc19rZXlmcmFtZSwgdWludDMyX3QgKnB0aW1lc3RhbXApOworCisvKioKKyAqIFBhcnNlIFJEVC1zdHlsZSBwYWNrZXQgZGF0YSAoaGVhZGVyICsgbWVkaWEgZGF0YSkuCisgKiBVc2FnZSBzaW1pbGFyIHRvIHJ0cF9wYXJzZV9wYWNrZXQoKS4KKyAqLworaW50IGZmX3JkdF9wYXJzZV9wYWNrZXQoUkRURGVtdXhDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKmJ1ZiwgaW50IGxlbik7CisKKy8qKgorICogUGFyc2UgYSBzZXJ2ZXItcmVsYXRlZCBTRFAgbGluZS4KKyAqCisgKiBAcGFyYW0gcyB0aGUgUlRTUCBBVkZvcm1hdENvbnRleHQKKyAqIEBwYXJhbSBzdHJlYW1faW5kZXggdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJlYW0gaW4gdGhlIHNldCByZXByZXNlbnRlZAorICogICAgICAgICAgICAgICBieSB0aGUgU0RQIG09IGxpbmUgKGluIHMtPnN0cmVhbXMpCisgKiBAcGFyYW0gYnVmIHRoZSBTRFAgbGluZQorICovCit2b2lkIGZmX3JlYWxfcGFyc2Vfc2RwX2FfbGluZShBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYpOworCisjZW5kaWYgLyogQVZGT1JNQVRfUkRUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9yZWFsdGV4dGRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JlYWx0ZXh0ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmODVkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yZWFsdGV4dGRlYy5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIENsw6ltZW50IELFk3NjaAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSZWFsVGV4dCBzdWJ0aXRsZSBkZW11eGVyCisgKiBAc2VlIGh0dHA6Ly9zZXJ2aWNlLnJlYWwuY29tL2hlbHAvbGlicmFyeS9ndWlkZXMvUHJvZHVjdGlvbkd1aWRlL3Byb2RndWlkZS9odG1maWxlcy9yZWFsdGV4dC5odG0KKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInN1YnRpdGxlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBGRkRlbXV4U3VidGl0bGVzUXVldWUgcTsKK30gUmVhbFRleHRDb250ZXh0OworCitzdGF0aWMgaW50IHJlYWx0ZXh0X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNoYXIgYnVmWzddOworICAgIEZGVGV4dFJlYWRlciB0cjsKKyAgICBmZl90ZXh0X2luaXRfYnVmKCZ0ciwgcC0+YnVmLCBwLT5idWZfc2l6ZSk7CisgICAgZmZfdGV4dF9yZWFkKCZ0ciwgYnVmLCBzaXplb2YoYnVmKSk7CisKKyAgICByZXR1cm4gIWF2X3N0cm5jYXNlY21wKGJ1ZiwgIjx3aW5kb3ciLCA3KSA/IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIDogMDsKK30KKworc3RhdGljIGludCByZWFkX3RzKGNvbnN0IGNoYXIgKnMpCit7CisgICAgaW50IGhoLCBtbSwgc3MsIG1zOworCisgICAgaWYgKHNzY2FuZihzLCAiJXU6JXU6JXUuJXUiLCAmaGgsICZtbSwgJnNzLCAmbXMpID09IDQpIHJldHVybiAoaGgqMzYwMCArIG1tKjYwICsgc3MpICogMTAwICsgbXM7CisgICAgaWYgKHNzY2FuZihzLCAiJXU6JXU6JXUiICAgLCAmaGgsICZtbSwgJnNzICAgICApID09IDMpIHJldHVybiAoaGgqMzYwMCArIG1tKjYwICsgc3MpICogMTAwOworICAgIGlmIChzc2NhbmYocywgICAgIiV1OiV1LiV1IiwgICAgICAmbW0sICZzcywgJm1zKSA9PSAzKSByZXR1cm4gKCAgICAgICAgICBtbSo2MCArIHNzKSAqIDEwMCArIG1zOworICAgIGlmIChzc2NhbmYocywgICAgIiV1OiV1IiAgICwgICAgICAmbW0sICZzcyAgICAgKSA9PSAyKSByZXR1cm4gKCAgICAgICAgICBtbSo2MCArIHNzKSAqIDEwMDsKKyAgICBpZiAoc3NjYW5mKHMsICAgICAgICIldS4ldSIsICAgICAgICAgICAmc3MsICZtcykgPT0gMikgcmV0dXJuICggICAgICAgICAgICAgICAgICBzcykgKiAxMDAgKyBtczsKKyAgICByZXR1cm4gc3RydG9sKHMsIE5VTEwsIDEwKSAqIDEwMDsKK30KKworc3RhdGljIGludCByZWFsdGV4dF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUmVhbFRleHRDb250ZXh0ICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIEFWQlByaW50IGJ1ZjsKKyAgICBjaGFyIGMgPSAwOworICAgIGludCByZXMgPSAwLCBkdXJhdGlvbiA9IHJlYWRfdHMoIjYwIik7IC8vIGRlZmF1bHQgZHVyYXRpb24gaXMgNjAgc2Vjb25kcworICAgIEZGVGV4dFJlYWRlciB0cjsKKyAgICBmZl90ZXh0X2luaXRfYXZpbyhzLCAmdHIsIHMtPnBiKTsKKworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMCk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1JFQUxURVhUOworCisgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIHdoaWxlICghZmZfdGV4dF9lb2YoJnRyKSkgeworICAgICAgICBBVlBhY2tldCAqc3ViOworICAgICAgICBjb25zdCBpbnQ2NF90IHBvcyA9IGZmX3RleHRfcG9zKCZ0cikgLSAoYyAhPSAwKTsKKyAgICAgICAgaW50IG4gPSBmZl9zbWlsX2V4dHJhY3RfbmV4dF90ZXh0X2NodW5rKCZ0ciwgJmJ1ZiwgJmMpOworCisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIWF2X3N0cm5jYXNlY21wKGJ1Zi5zdHIsICI8d2luZG93IiwgNykpIHsKKyAgICAgICAgICAgIC8qIHNhdmUgaGVhZGVyIHRvIGV4dHJhZGF0YSAqLworICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IGZmX3NtaWxfZ2V0X2F0dHJfcHRyKGJ1Zi5zdHIsICJkdXJhdGlvbiIpOworCisgICAgICAgICAgICBpZiAocCkKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHJlYWRfdHMocCk7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSA9IGF2X3N0cmR1cChidWYuc3RyKTsKKyAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gYnVmLmxlbiArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBpZiB3ZSBqdXN0IHJlYWQgYSA8dGltZT4gdGFnLCBpbnRyb2R1Y2UgYSBuZXcgZXZlbnQsIG90aGVyd2lzZSBtZXJnZQorICAgICAgICAgICAgICogd2l0aCB0aGUgcHJldmlvdXMgb25lICovCisgICAgICAgICAgICBpbnQgbWVyZ2UgPSAhYXZfc3RybmNhc2VjbXAoYnVmLnN0ciwgIjx0aW1lIiwgNSkgPyAwIDogMTsKKyAgICAgICAgICAgIHN1YiA9IGZmX3N1YnRpdGxlc19xdWV1ZV9pbnNlcnQoJnJ0LT5xLCBidWYuc3RyLCBidWYubGVuLCBtZXJnZSk7CisgICAgICAgICAgICBpZiAoIXN1YikgeworICAgICAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbWVyZ2UpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiZWdpbiA9IGZmX3NtaWxfZ2V0X2F0dHJfcHRyKGJ1Zi5zdHIsICJiZWdpbiIpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCAgID0gZmZfc21pbF9nZXRfYXR0cl9wdHIoYnVmLnN0ciwgImVuZCIpOworCisgICAgICAgICAgICAgICAgc3ViLT5wb3MgICAgICA9IHBvczsKKyAgICAgICAgICAgICAgICBzdWItPnB0cyAgICAgID0gYmVnaW4gPyByZWFkX3RzKGJlZ2luKSA6IDA7CisgICAgICAgICAgICAgICAgc3ViLT5kdXJhdGlvbiA9IGVuZCA/IChyZWFkX3RzKGVuZCkgLSBzdWItPnB0cykgOiBkdXJhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9icHJpbnRfY2xlYXIoJmJ1Zik7CisgICAgfQorICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9maW5hbGl6ZSgmcnQtPnEpOworCitlbmQ6CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgcmVhbHRleHRfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFJlYWxUZXh0Q29udGV4dCAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3N1YnRpdGxlc19xdWV1ZV9yZWFkX3BhY2tldCgmcnQtPnEsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgcmVhbHRleHRfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtaW5fdHMsIGludDY0X3QgdHMsIGludDY0X3QgbWF4X3RzLCBpbnQgZmxhZ3MpCit7CisgICAgUmVhbFRleHRDb250ZXh0ICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJnJ0LT5xLCBzLCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl90cywgdHMsIG1heF90cywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHJlYWx0ZXh0X3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFJlYWxUZXh0Q29udGV4dCAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2NsZWFuKCZydC0+cSk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfcmVhbHRleHRfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicmVhbHRleHQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsVGV4dCBzdWJ0aXRsZSBmb3JtYXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUmVhbFRleHRDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSByZWFsdGV4dF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSByZWFsdGV4dF9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSByZWFsdGV4dF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrMiAgICAgPSByZWFsdGV4dF9yZWFkX3NlZWssCisgICAgLnJlYWRfY2xvc2UgICAgID0gcmVhbHRleHRfcmVhZF9jbG9zZSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAicnQiLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9yZWRzcGFyay5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JlZHNwYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhN2IzNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yZWRzcGFyay5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogUmVkU3BhcmsgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEzIEphbWVzIEFsbWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBIRUFERVJfU0laRSA0MDk2CisKK3R5cGVkZWYgc3RydWN0IFJlZFNwYXJrQ29udGV4dCB7CisgICAgaW50ICAgICAgICAgc2FtcGxlc19jb3VudDsKK30gUmVkU3BhcmtDb250ZXh0OworCitzdGF0aWMgaW50IHJlZHNwYXJrX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIHVpbnQzMl90IGtleSwgZGF0YTsKKyAgICB1aW50OF90IGhlYWRlcls4XTsKKworICAgIC8qIERlY3J5cHQgZmlyc3QgOCBieXRlcyBvZiB0aGUgaGVhZGVyICovCisgICAgZGF0YSA9IEFWX1JCMzIocC0+YnVmKTsKKyAgICBkYXRhID0gZGF0YSBeIChrZXkgPSBkYXRhIF4gMHg1MjY1NjQ1Myk7CisgICAgQVZfV0IzMihoZWFkZXIsIGRhdGEpOworICAgIGtleSA9IChrZXkgPDwgMTEpIHwgKGtleSA+PiAyMSk7CisKKyAgICBkYXRhID0gQVZfUkIzMihwLT5idWYgKyA0KSBeICgoKGtleSA8PCAzKSB8IChrZXkgPj4gMjkpKSArIGtleSk7CisgICAgQVZfV0IzMihoZWFkZXIgKyA0LCBkYXRhKTsKKworICAgIGlmIChBVl9SQjY0KGhlYWRlcikgPT0gQVZfUkI2NCgiUmVkU3BhcmsiKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVkc3BhcmtfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFJlZFNwYXJrQ29udGV4dCAqcmVkc3BhcmsgPSBzLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjOworICAgIEdldEJ5dGVDb250ZXh0IGdiYzsKKyAgICBpbnQgaSwgY29lZl9vZmYsIHJldCA9IDA7CisgICAgdWludDMyX3Qga2V5LCBkYXRhOworICAgIHVpbnQ4X3QgKmhlYWRlciwgKnBiYzsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBjb2RlYyA9IHN0LT5jb2RlYzsKKworICAgIGhlYWRlciA9IGF2X21hbGxvYyhIRUFERVJfU0laRSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghaGVhZGVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHBiYyA9IGhlYWRlcjsKKworICAgIC8qIERlY3J5cHQgaGVhZGVyICovCisgICAgZGF0YSA9IGF2aW9fcmIzMihwYik7CisgICAgZGF0YSA9IGRhdGEgXiAoa2V5ID0gZGF0YSBeIDB4NTI2NTY0NTMpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnBiYywgZGF0YSk7CisgICAga2V5ID0gKGtleSA8PCAxMSkgfCAoa2V5ID4+IDIxKTsKKworICAgIGZvciAoaSA9IDQ7IGkgPCBIRUFERVJfU0laRTsgaSArPSA0KSB7CisgICAgICAgIGRhdGEgPSBhdmlvX3JiMzIocGIpIF4gKGtleSA9ICgoa2V5IDw8IDMpIHwgKGtleSA+PiAyOSkpICsga2V5KTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcGJjLCBkYXRhKTsKKyAgICB9CisKKyAgICBjb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9USFA7CisgICAgY29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCBoZWFkZXIsIEhFQURFUl9TSVpFKTsKKyAgICBieXRlc3RyZWFtMl9zZWVrKCZnYmMsIDB4M2MsIFNFRUtfU0VUKTsKKyAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiYyk7CisgICAgaWYgKGNvZGVjLT5zYW1wbGVfcmF0ZSA8PSAwIHx8IGNvZGVjLT5zYW1wbGVfcmF0ZSA+IDk2MDAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSByYXRlOiAlZFxuIiwgY29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHN0LT5kdXJhdGlvbiA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2JjKSAqIDE0OworICAgIHJlZHNwYXJrLT5zYW1wbGVzX2NvdW50ID0gMDsKKyAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2JjLCAxMCk7CisgICAgY29kZWMtPmNoYW5uZWxzID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYmMpOworICAgIGlmICghY29kZWMtPmNoYW5uZWxzKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjb2VmX29mZiA9IDB4NTQgKyBjb2RlYy0+Y2hhbm5lbHMgKiA4OworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiYykpIC8vIExvb3AgZmxhZworICAgICAgICBjb2VmX29mZiArPSAxNjsKKworICAgIGlmIChjb2VmX29mZiArIGNvZGVjLT5jaGFubmVscyAqICgzMiArIDE0KSA+IEhFQURFUl9TSVpFKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKGNvZGVjLCAzMiAqIGNvZGVjLT5jaGFubmVscykpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogR2V0IHRoZSBBRFBDTSB0YWJsZSAqLworICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmdiYywgY29lZl9vZmYsIFNFRUtfU0VUKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9idWZmZXJ1KCZnYmMsIGNvZGVjLT5leHRyYWRhdGEgKyBpICogMzIsIDMyKSAhPSAzMikgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2JjLCAxNCk7CisgICAgfQorCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKK2ZhaWw6CisgICAgYXZfZnJlZShoZWFkZXIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZWRzcGFya19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgUmVkU3BhcmtDb250ZXh0ICpyZWRzcGFyayA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50MzJfdCBzaXplID0gOCAqIGNvZGVjLT5jaGFubmVsczsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGF2aW9fZmVvZihzLT5wYikgfHwgcmVkc3BhcmstPnNhbXBsZXNfY291bnQgPT0gcy0+c3RyZWFtc1swXS0+ZHVyYXRpb24pCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisgICAgaWYgKHJldCAhPSBzaXplKSB7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgcGt0LT5kdXJhdGlvbiA9IDE0OworICAgIHJlZHNwYXJrLT5zYW1wbGVzX2NvdW50ICs9IHBrdC0+ZHVyYXRpb247CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworCisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9yZWRzcGFya19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICAgInJlZHNwYXJrIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSAgIE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWRTcGFyayIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9ICAgc2l6ZW9mKFJlZFNwYXJrQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gICByZWRzcGFya19wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSAgIHJlZHNwYXJrX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9ICAgcmVkc3BhcmtfcmVhZF9wYWNrZXQsCisgICAgLmV4dGVuc2lvbnMgICAgID0gICAicnNkIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcmVwbGF5Z2Fpbi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JlcGxheWdhaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhjODFhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JlcGxheWdhaW4uYwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiByZXBsYXlnYWluIHRhZ3MgcGFyc2luZworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmVwbGF5Z2Fpbi5oIgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJyZXBsYXlnYWluLmgiCisKK3N0YXRpYyBpbnQzMl90IHBhcnNlX3ZhbHVlKGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQzMl90IG1pbikKK3sKKyAgICBjaGFyICpmcmFjdGlvbjsKKyAgICBpbnQgIHNjYWxlID0gMTAwMDA7CisgICAgaW50MzJfdCBtYiA9IDA7CisgICAgaW50IHNpZ24gICA9IDE7CisgICAgaW50IGRiOworCisgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgcmV0dXJuIG1pbjsKKworICAgIHZhbHVlICs9IHN0cnNwbih2YWx1ZSwgIiBcdCIpOworCisgICAgaWYgKCp2YWx1ZSA9PSAnLScpCisgICAgICAgIHNpZ24gPSAtMTsKKworICAgIGRiID0gc3RydG9sKHZhbHVlLCAmZnJhY3Rpb24sIDApOworICAgIGlmICgqZnJhY3Rpb24rKyA9PSAnLicpIHsKKyAgICAgICAgd2hpbGUgKGF2X2lzZGlnaXQoKmZyYWN0aW9uKSAmJiBzY2FsZSkgeworICAgICAgICAgICAgbWIgKz0gc2NhbGUgKiAoKmZyYWN0aW9uIC0gJzAnKTsKKyAgICAgICAgICAgIHNjYWxlIC89IDEwOworICAgICAgICAgICAgZnJhY3Rpb24rKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhYnMoZGIpID4gKElOVDMyX01BWCAtIG1iKSAvIDEwMDAwMCkKKyAgICAgICAgcmV0dXJuIG1pbjsKKworICAgIHJldHVybiBkYiAqIDEwMDAwMCArIHNpZ24gKiBtYjsKK30KKworaW50IGZmX3JlcGxheWdhaW5fZXhwb3J0X3JhdyhBVlN0cmVhbSAqc3QsIGludDMyX3QgdGcsIHVpbnQzMl90IHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFnLCB1aW50MzJfdCBhcCkKK3sKKyAgICBBVlBhY2tldFNpZGVEYXRhICpzZCwgKnRtcDsKKyAgICBBVlJlcGxheUdhaW4gKnJlcGxheWdhaW47CisgICAgaW50IGk7CisKKyAgICBpZiAodGcgPT0gSU5UMzJfTUlOICYmIGFnID09IElOVDMyX01JTikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPm5iX3NpZGVfZGF0YTsgaSsrKSB7CisgICAgICAgIEFWUGFja2V0U2lkZURhdGEgKnNyY19zZCA9ICZzdC0+c2lkZV9kYXRhW2ldOworCisgICAgICAgIGlmIChzcmNfc2QtPnR5cGUgPT0gQVZfUEtUX0RBVEFfUkVQTEFZR0FJTikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJlcGxheWdhaW4gPSBhdl9tYWxsb2N6KHNpemVvZigqcmVwbGF5Z2FpbikpOworICAgIGlmICghcmVwbGF5Z2FpbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHRtcCA9IGF2X3JlYWxsb2NfYXJyYXkoc3QtPnNpZGVfZGF0YSwgc3QtPm5iX3NpZGVfZGF0YSArIDEsIHNpemVvZigqdG1wKSk7CisgICAgaWYgKCF0bXApIHsKKyAgICAgICAgYXZfZnJlZXAoJnJlcGxheWdhaW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBzdC0+c2lkZV9kYXRhID0gdG1wOworICAgIHN0LT5uYl9zaWRlX2RhdGErKzsKKworICAgIHNkID0gJnN0LT5zaWRlX2RhdGFbc3QtPm5iX3NpZGVfZGF0YSAtIDFdOworICAgIHNkLT50eXBlID0gQVZfUEtUX0RBVEFfUkVQTEFZR0FJTjsKKyAgICBzZC0+ZGF0YSA9ICh1aW50OF90KilyZXBsYXlnYWluOworICAgIHNkLT5zaXplID0gc2l6ZW9mKCpyZXBsYXlnYWluKTsKKworICAgIHJlcGxheWdhaW4tPnRyYWNrX2dhaW4gPSB0ZzsKKyAgICByZXBsYXlnYWluLT50cmFja19wZWFrID0gdHA7CisgICAgcmVwbGF5Z2Fpbi0+YWxidW1fZ2FpbiA9IGFnOworICAgIHJlcGxheWdhaW4tPmFsYnVtX3BlYWsgPSBhcDsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfcmVwbGF5Z2Fpbl9leHBvcnQoQVZTdHJlYW0gKnN0LCBBVkRpY3Rpb25hcnkgKm1ldGFkYXRhKQoreworICAgIGNvbnN0IEFWRGljdGlvbmFyeUVudHJ5ICp0ZywgKnRwLCAqYWcsICphcDsKKworICAgIHRnID0gYXZfZGljdF9nZXQobWV0YWRhdGEsICJSRVBMQVlHQUlOX1RSQUNLX0dBSU4iLCBOVUxMLCAwKTsKKyAgICB0cCA9IGF2X2RpY3RfZ2V0KG1ldGFkYXRhLCAiUkVQTEFZR0FJTl9UUkFDS19QRUFLIiwgTlVMTCwgMCk7CisgICAgYWcgPSBhdl9kaWN0X2dldChtZXRhZGF0YSwgIlJFUExBWUdBSU5fQUxCVU1fR0FJTiIsIE5VTEwsIDApOworICAgIGFwID0gYXZfZGljdF9nZXQobWV0YWRhdGEsICJSRVBMQVlHQUlOX0FMQlVNX1BFQUsiLCBOVUxMLCAwKTsKKworICAgIHJldHVybiBmZl9yZXBsYXlnYWluX2V4cG9ydF9yYXcoc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3ZhbHVlKHRnID8gdGctPnZhbHVlIDogTlVMTCwgSU5UMzJfTUlOKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfdmFsdWUodHAgPyB0cC0+dmFsdWUgOiBOVUxMLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfdmFsdWUoYWcgPyBhZy0+dmFsdWUgOiBOVUxMLCBJTlQzMl9NSU4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV92YWx1ZShhcCA/IGFwLT52YWx1ZSA6IE5VTEwsIDApKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9yZXBsYXlnYWluLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvcmVwbGF5Z2Fpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYWNiMjEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcmVwbGF5Z2Fpbi5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9SRVBMQVlHQUlOX0gKKyNkZWZpbmUgQVZGT1JNQVRfUkVQTEFZR0FJTl9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworLyoqCisgKiBQYXJzZSByZXBsYXlnYWluIHRhZ3MgYW5kIGV4cG9ydCB0aGVtIGFzIHBlci1zdHJlYW0gc2lkZSBkYXRhLgorICovCitpbnQgZmZfcmVwbGF5Z2Fpbl9leHBvcnQoQVZTdHJlYW0gKnN0LCBBVkRpY3Rpb25hcnkgKm1ldGFkYXRhKTsKKworCisvKioKKyAqIEV4cG9ydCBhbHJlYWR5IGRlY29kZWQgcmVwbGF5Z2FpbiB2YWx1ZXMgYXMgcGVyLXN0cmVhbSBzaWRlIGRhdGEuCisgKi8KK2ludCBmZl9yZXBsYXlnYWluX2V4cG9ydF9yYXcoQVZTdHJlYW0gKnN0LCBpbnQzMl90IHRnLCB1aW50MzJfdCB0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhZywgdWludDMyX3QgYXApOworCisjZW5kaWYgLyogQVZGT1JNQVRfUkVQTEFZR0FJTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcmlmZi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDdiMWMyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JpZmYuYwpAQCAtMCwwICsxLDQ3NyBAQAorLyoKKyAqIFJJRkYgY29tbW9uIGZ1bmN0aW9ucyBhbmQgZGF0YQorICogQ29weXJpZ2h0IChjKSAyMDAwIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2Vycm9yLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJyaWZmLmgiCisKKy8qIE5vdGU6IFdoZW4gZW5jb2RpbmcsIHRoZSBmaXJzdCBtYXRjaGluZyB0YWcgaXMgdXNlZCwgc28gb3JkZXIgaXMKKyAqIGltcG9ydGFudCBpZiBtdWx0aXBsZSB0YWdzIGFyZSBwb3NzaWJsZSBmb3IgYSBnaXZlbiBjb2RlYy4KKyAqIE5vdGUgYWxzbyB0aGF0IHRoaXMgbGlzdCBpcyB1c2VkIGZvciBtb3JlIHRoYW4ganVzdCByaWZmLCBvdGhlcgorICogZmlsZXMgdXNlIGl0IGFzIHdlbGwuCisgKi8KK2NvbnN0IEFWQ29kZWNUYWcgZmZfY29kZWNfYm1wX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX0gyNjQsICAgICAgICAgTUtUQUcoJ0gnLCAnMicsICc2JywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgICAgICAgICBNS1RBRygnaCcsICcyJywgJzYnLCAnNCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgICAgICAgIE1LVEFHKCdYJywgJzInLCAnNicsICc0JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0gyNjQsICAgICAgICAgTUtUQUcoJ3gnLCAnMicsICc2JywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgICAgICAgICBNS1RBRygnYScsICd2JywgJ2MnLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgICAgICAgIE1LVEFHKCdEJywgJ0EnLCAnVicsICdDJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0gyNjQsICAgICAgICAgTUtUQUcoJ1MnLCAnTScsICdWJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgICAgICAgICBNS1RBRygnVicsICdTJywgJ1MnLCAnSCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgICAgICAgIE1LVEFHKCdRJywgJzInLCAnNicsICc0JykgfSwgLyogUU5BUCBzdXJ2ZWlsbGFuY2Ugc3lzdGVtICovCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgICAgICAgIE1LVEFHKCdWJywgJzInLCAnNicsICc0JykgfSwgLyogQ0NUViByZWNvcmRpbmdzICovCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgICAgICAgIE1LVEFHKCdHJywgJ0EnLCAnVicsICdDJykgfSwgLyogR2VvVmlzaW9uIGNhbWVyYSAqLworICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgICAgICAgICBNS1RBRygnVScsICdNJywgJ1MnLCAnVicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgICAgICAgIE1LVEFHKCdJJywgJ04nLCAnTScsICdDJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0gyNjMsICAgICAgICAgTUtUQUcoJ0gnLCAnMicsICc2JywgJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2MywgICAgICAgICBNS1RBRygnWCcsICcyJywgJzYnLCAnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjYzLCAgICAgICAgIE1LVEFHKCdUJywgJzInLCAnNicsICczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0gyNjMsICAgICAgICAgTUtUQUcoJ0wnLCAnMicsICc2JywgJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2MywgICAgICAgICBNS1RBRygnVicsICdYJywgJzEnLCAnSycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjYzLCAgICAgICAgIE1LVEFHKCdaJywgJ3knLCAnRycsICdvJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0gyNjMsICAgICAgICAgTUtUQUcoJ00nLCAnMicsICc2JywgJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2MywgICAgICAgICBNS1RBRygnbCcsICdzJywgJ3YnLCAnbScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjYzUCwgICAgICAgIE1LVEFHKCdIJywgJzInLCAnNicsICczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0gyNjNJLCAgICAgICAgTUtUQUcoJ0knLCAnMicsICc2JywgJzMnKSB9LCAvKiBJbnRlbCBILjI2MyAqLworICAgIHsgQVZfQ09ERUNfSURfSDI2MSwgICAgICAgICBNS1RBRygnSCcsICcyJywgJzYnLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjYzLCAgICAgICAgIE1LVEFHKCdVJywgJzInLCAnNicsICczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ0YnLCAnTScsICdQJywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnRCcsICdJJywgJ1YnLCAnWCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdEJywgJ1gnLCAnNScsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ1gnLCAnVicsICdJJywgJ0QnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnTScsICdQJywgJzQnLCAnUycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdNJywgJzQnLCAnUycsICcyJykgfSwKKyAgICAvKiBzb21lIGJyb2tlbiBBVklzIHVzZSB0aGlzICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCA0ICwgIDAgLCAgMCAsICAwICkgfSwKKyAgICAvKiBzb21lIGJyb2tlbiBBVklzIHVzZSB0aGlzICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdaJywgJ00nLCAnUCcsICc0JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ0QnLCAnSScsICdWJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnQicsICdMJywgJ1onLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdtJywgJ3AnLCAnNCcsICd2JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ1UnLCAnTScsICdQJywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnVycsICdWJywgJzEnLCAnRicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdTJywgJ0UnLCAnRCcsICdHJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ1InLCAnTScsICdQJywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnMycsICdJJywgJ1YnLCAnMicpIH0sCisgICAgLyogV2FXdiBNUEVHLTQgVmlkZW8gQ29kZWMgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ1cnLCAnQScsICdXJywgJ1YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnRicsICdGJywgJ0QnLCAnUycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdGJywgJ1YnLCAnRicsICdXJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ0QnLCAnQycsICdPJywgJ0QnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnTScsICdWJywgJ1gnLCAnTScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdQJywgJ00nLCAnNCcsICdWJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ1MnLCAnTScsICdQJywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnRCcsICdYJywgJ0cnLCAnTScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdWJywgJ0knLCAnRCcsICdNJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ00nLCAnNCcsICdUJywgJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnRycsICdFJywgJ08nLCAnWCcpIH0sCisgICAgLyogZmxpcHBlZCB2aWRlbyAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnRycsICcyJywgJzYnLCAnNCcpIH0sCisgICAgLyogZmxpcHBlZCB2aWRlbyAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnSCcsICdEJywgJ1gnLCAnNCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdEJywgJ00nLCAnNCcsICdWJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ0QnLCAnTScsICdLJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnRCcsICdZJywgJ00nLCAnNCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdEJywgJ0knLCAnRycsICdJJykgfSwKKyAgICAvKiBFcGh2IE1QRUctNCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnRScsICdQJywgJ0gnLCAnVicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdFJywgJ00nLCAnNCcsICdBJykgfSwKKyAgICAvKiBEaXZpbyBNUEVHLTQgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ00nLCAnNCcsICdDJywgJ0MnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnUycsICdOJywgJzQnLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdWJywgJ1MnLCAnUCcsICdYJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ1UnLCAnTCcsICdEJywgJ1gnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnRycsICdFJywgJ08nLCAnVicpIH0sCisgICAgLyogU2Ftc3VuZyBTSFItNjA0MCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnUycsICdJJywgJ1AnLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdTJywgJ00nLCAnNCcsICdWJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ1gnLCAnVicsICdJJywgJ1gnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnRCcsICdyJywgJ2UnLCAnWCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdRJywgJ00nLCAnUCcsICc0JykgfSwgLyogUU5BUCBTeXN0ZW1zICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdQJywgJ0wnLCAnVicsICcxJykgfSwgLyogUGVsY28gRFZSIE1QRUctNCAqLworICAgIHsgQVZfQ09ERUNfSURfTVNNUEVHNFYzLCAgICBNS1RBRygnTScsICdQJywgJzQnLCAnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NU01QRUc0VjMsICAgIE1LVEFHKCdEJywgJ0knLCAnVicsICczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01TTVBFRzRWMywgICAgTUtUQUcoJ00nLCAnUCcsICdHJywgJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVNNUEVHNFYzLCAgICBNS1RBRygnRCcsICdJJywgJ1YnLCAnNScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NU01QRUc0VjMsICAgIE1LVEFHKCdEJywgJ0knLCAnVicsICc2JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01TTVBFRzRWMywgICAgTUtUQUcoJ0QnLCAnSScsICdWJywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVNNUEVHNFYzLCAgICBNS1RBRygnRCcsICdWJywgJ1gnLCAnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NU01QRUc0VjMsICAgIE1LVEFHKCdBJywgJ1AnLCAnNCcsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01TTVBFRzRWMywgICAgTUtUQUcoJ0MnLCAnTycsICdMJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVNNUEVHNFYzLCAgICBNS1RBRygnQycsICdPJywgJ0wnLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NU01QRUc0VjIsICAgIE1LVEFHKCdNJywgJ1AnLCAnNCcsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01TTVBFRzRWMiwgICAgTUtUQUcoJ0QnLCAnSScsICdWJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVNNUEVHNFYxLCAgICBNS1RBRygnTScsICdQJywgJ0cnLCAnNCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NU01QRUc0VjEsICAgIE1LVEFHKCdNJywgJ1AnLCAnNCcsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1dNVjEsICAgICAgICAgTUtUQUcoJ1cnLCAnTScsICdWJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfV01WMiwgICAgICAgICBNS1RBRygnVycsICdNJywgJ1YnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9XTVYyLCAgICAgICAgIE1LVEFHKCdHJywgJ1gnLCAnVicsICdFJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0RWVklERU8sICAgICAgTUtUQUcoJ2QnLCAndicsICdzJywgJ2QnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgICAgICBNS1RBRygnZCcsICd2JywgJ2gnLCAnZCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCAgICAgIE1LVEFHKCdkJywgJ3YnLCAnaCcsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0RWVklERU8sICAgICAgTUtUQUcoJ2QnLCAndicsICdzJywgJ2wnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgICAgICBNS1RBRygnZCcsICd2JywgJzInLCAnNScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCAgICAgIE1LVEFHKCdkJywgJ3YnLCAnNScsICcwJykgfSwKKyAgICAvKiBDYW5vcHVzIERWICovCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCAgICAgIE1LVEFHKCdjJywgJ2QnLCAndicsICdjJykgfSwKKyAgICAvKiBDYW5vcHVzIERWICovCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCAgICAgIE1LVEFHKCdDJywgJ0QnLCAnVicsICdIJykgfSwKKyAgICAvKiBDYW5vcHVzIERWICovCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCAgICAgIE1LVEFHKCdDJywgJ0QnLCAnVicsICc1JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0RWVklERU8sICAgICAgTUtUQUcoJ2QnLCAndicsICdjJywgJyAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgICAgICBNS1RBRygnZCcsICd2JywgJ2MnLCAncycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCAgICAgIE1LVEFHKCdkJywgJ3YnLCAnaCcsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0RWVklERU8sICAgICAgTUtUQUcoJ2QnLCAndicsICdpJywgJ3MnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgICAgICBNS1RBRygncCcsICdkJywgJ3YnLCAnYycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9EVlZJREVPLCAgICAgIE1LVEFHKCdTJywgJ0wnLCAnMicsICc1JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0RWVklERU8sICAgICAgTUtUQUcoJ1MnLCAnTCcsICdEJywgJ1YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzFWSURFTywgICBNS1RBRygnbScsICdwJywgJ2cnLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLCAgIE1LVEFHKCdtJywgJ3AnLCAnZycsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sICAgTUtUQUcoJ20nLCAncCcsICdnJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgICBNS1RBRygnTScsICdQJywgJ0UnLCAnRycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLCAgIE1LVEFHKCdQJywgJ0knLCAnTScsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sICAgTUtUQUcoJ1AnLCAnSScsICdNJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzFWSURFTywgICBNS1RBRygnVicsICdDJywgJ1InLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLCAgIE1LVEFHKCAxICwgIDAgLCAgMCAsICAxNikgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sICAgTUtUQUcoIDIgLCAgMCAsICAwICwgIDE2KSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRyggNCAsICAwICwgIDAgLCAgMTYpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCAgIE1LVEFHKCdEJywgJ1YnLCAnUicsICcgJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sICAgTUtUQUcoJ00nLCAnTScsICdFJywgJ1MnKSB9LAorICAgIC8qIExlYWQgTVBFRy0yIGluIEFWSSAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgICBNS1RBRygnTCcsICdNJywgJ1AnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCAgIE1LVEFHKCdzJywgJ2wnLCAnaScsICdmJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sICAgTUtUQUcoJ0UnLCAnTScsICcyJywgJ1YnKSB9LAorICAgIC8qIE1hdHJveCBNUEVHLTIgaW50cmEtb25seSAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgICBNS1RBRygnTScsICc3JywgJzAnLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCAgIE1LVEFHKCdtJywgJ3AnLCAnZycsICd2JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUcxVklERU8sICAgTUtUQUcoJ0InLCAnVycsICcxJywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzFWSURFTywgICBNS1RBRygnWCcsICdNJywgJ1AnLCAnRycpIH0sIC8qIFhpbmcgTVBFRyBpbnRyYSBvbmx5ICovCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAgIE1LVEFHKCdNJywgJ0onLCAnUCcsICdHJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01KUEVHLCAgICAgICAgTUtUQUcoJ0wnLCAnSicsICdQJywgJ0cnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUpQRUcsICAgICAgICBNS1RBRygnZCcsICdtJywgJ2InLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAgIE1LVEFHKCdtJywgJ2onLCAncCcsICdhJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0xKUEVHLCAgICAgICAgTUtUQUcoJ0wnLCAnSicsICdQJywgJ0cnKSB9LAorICAgIC8qIFBlZ2FzdXMgbG9zc2xlc3MgSlBFRyAqLworICAgIHsgQVZfQ09ERUNfSURfTUpQRUcsICAgICAgICBNS1RBRygnSicsICdQJywgJ0cnLCAnTCcpIH0sCisgICAgLyogSlBFRy1MUyBjdXN0b20gRk9VUkNDIGZvciBBVkkgLSBlbmNvZGVyICovCisgICAgeyBBVl9DT0RFQ19JRF9KUEVHTFMsICAgICAgIE1LVEFHKCdNJywgJ0onLCAnTCcsICdTJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0pQRUdMUywgICAgICAgTUtUQUcoJ00nLCAnSicsICdQJywgJ0cnKSB9LAorICAgIC8qIEpQRUctTFMgY3VzdG9tIEZPVVJDQyBmb3IgQVZJIC0gZGVjb2RlciAqLworICAgIHsgQVZfQ09ERUNfSURfTUpQRUcsICAgICAgICBNS1RBRygnTScsICdKJywgJ0wnLCAnUycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAgIE1LVEFHKCdqJywgJ3AnLCAnZScsICdnJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01KUEVHLCAgICAgICAgTUtUQUcoJ0knLCAnSicsICdQJywgJ0cnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQVZSTiwgICAgICAgICBNS1RBRygnQScsICdWJywgJ1InLCAnbicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAgIE1LVEFHKCdBJywgJ0MnLCAnRCcsICdWJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01KUEVHLCAgICAgICAgTUtUQUcoJ1EnLCAnSScsICdWJywgJ0cnKSB9LAorICAgIC8qIFNMIE0tSlBFRyAqLworICAgIHsgQVZfQ09ERUNfSURfTUpQRUcsICAgICAgICBNS1RBRygnUycsICdMJywgJ00nLCAnSicpIH0sCisgICAgLyogQ3JlYXRpdmUgV2ViY2FtIEpQRUcgKi8KKyAgICB7IEFWX0NPREVDX0lEX01KUEVHLCAgICAgICAgTUtUQUcoJ0MnLCAnSicsICdQJywgJ0cnKSB9LAorICAgIC8qIEludGVsIEpQRUcgTGlicmFyeSBWaWRlbyBDb2RlYyAqLworICAgIHsgQVZfQ09ERUNfSURfTUpQRUcsICAgICAgICBNS1RBRygnSScsICdKJywgJ0wnLCAnVicpIH0sCisgICAgLyogTWlkdmlkIEpQRUcgVmlkZW8gQ29kZWMgKi8KKyAgICB7IEFWX0NPREVDX0lEX01KUEVHLCAgICAgICAgTUtUQUcoJ00nLCAnVicsICdKJywgJ1AnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUpQRUcsICAgICAgICBNS1RBRygnQScsICdWJywgJ0knLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAgIE1LVEFHKCdBJywgJ1YnLCAnSScsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01KUEVHLCAgICAgICAgTUtUQUcoJ00nLCAnVCcsICdTJywgJ0onKSB9LAorICAgIC8qIFBhcmFkaWdtIE1hdHJpeCBNLUpQRUcgQ29kZWMgKi8KKyAgICB7IEFWX0NPREVDX0lEX01KUEVHLCAgICAgICAgTUtUQUcoJ1onLCAnSicsICdQJywgJ0cnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUpQRUcsICAgICAgICBNS1RBRygnTScsICdNJywgJ0onLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IVUZGWVVWLCAgICAgIE1LVEFHKCdIJywgJ0YnLCAnWScsICdVJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0ZGVkhVRkYsICAgICAgTUtUQUcoJ0YnLCAnRicsICdWJywgJ0gnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQ1lVViwgICAgICAgICBNS1RBRygnQycsICdZJywgJ1UnLCAnVicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCAwICwgIDAgLCAgMCAsICAwICkgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoIDMgLCAgMCAsICAwICwgIDAgKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnSScsICc0JywgJzInLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdZJywgJ1UnLCAnWScsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ1knLCAnNCcsICcyJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnVicsICc0JywgJzInLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdZJywgJ1UnLCAnTicsICdWJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ1UnLCAnWScsICdOJywgJ1YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnVScsICdZJywgJ04nLCAnWScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCd1JywgJ3knLCAndicsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJzInLCAnVicsICd1JywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnMicsICd2JywgJ3UnLCAneScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCd5JywgJ3UnLCAndicsICdzJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ3knLCAndScsICd2JywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnUCcsICc0JywgJzInLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdZJywgJ1YnLCAnMScsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ1knLCAnVicsICcxJywgJzYnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnWScsICdWJywgJzInLCAnNCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdVJywgJ1knLCAnVicsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ1YnLCAnWScsICdVJywgJ1knKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnSScsICdZJywgJ1UnLCAnVicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdZJywgJzgnLCAnMCcsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ1knLCAnOCcsICcgJywgJyAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnSCcsICdEJywgJ1knLCAnQycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdZJywgJ1YnLCAnVScsICc5JykgfSwKKyAgICAvKiBTb2Z0TGFiLU5TSyBWaWRlb1RpemVyICovCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdWJywgJ0QnLCAnVCcsICdaJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ1knLCAnNCcsICcxJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnTicsICdWJywgJzEnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdOJywgJ1YnLCAnMicsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ1knLCAnNCcsICcxJywgJ0InKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnWScsICc0JywgJzInLCAnQicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdZJywgJ1UnLCAnVicsICc5JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ1knLCAnVicsICdVJywgJzknKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnYScsICd1JywgJ3YnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdZJywgJ1YnLCAnWScsICdVJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0ZSV1UsICAgICAgICAgTUtUQUcoJ0YnLCAnUicsICdXJywgJ1UnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUjEwSywgICAgICAgICBNS1RBRygnUicsICcxJywgJzAnLCAnaycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SMjEwLCAgICAgICAgIE1LVEFHKCdyJywgJzInLCAnMScsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1YyMTAsICAgICAgICAgTUtUQUcoJ3YnLCAnMicsICcxJywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVjMwOCwgICAgICAgICBNS1RBRygndicsICczJywgJzAnLCAnOCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WNDA4LCAgICAgICAgIE1LVEFHKCd2JywgJzQnLCAnMCcsICc4JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FZVVYsICAgICAgICAgTUtUQUcoJ0EnLCAnWScsICdVJywgJ1YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVjQxMCwgICAgICAgICBNS1RBRygndicsICc0JywgJzEnLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9ZVVY0LCAgICAgICAgIE1LVEFHKCd5JywgJ3UnLCAndicsICc0JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0lOREVPMywgICAgICAgTUtUQUcoJ0knLCAnVicsICczJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSU5ERU8zLCAgICAgICBNS1RBRygnSScsICdWJywgJzMnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9JTkRFTzQsICAgICAgIE1LVEFHKCdJJywgJ1YnLCAnNCcsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0lOREVPNSwgICAgICAgTUtUQUcoJ0knLCAnVicsICc1JywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVlAzLCAgICAgICAgICBNS1RBRygnVicsICdQJywgJzMnLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WUDMsICAgICAgICAgIE1LVEFHKCdWJywgJ1AnLCAnMycsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQNSwgICAgICAgICAgTUtUQUcoJ1YnLCAnUCcsICc1JywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVlA2LCAgICAgICAgICBNS1RBRygnVicsICdQJywgJzYnLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WUDYsICAgICAgICAgIE1LVEFHKCdWJywgJ1AnLCAnNicsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQNiwgICAgICAgICAgTUtUQUcoJ1YnLCAnUCcsICc2JywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVlA2QSwgICAgICAgICBNS1RBRygnVicsICdQJywgJzYnLCAnQScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WUDZGLCAgICAgICAgIE1LVEFHKCdWJywgJ1AnLCAnNicsICdGJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQNkYsICAgICAgICAgTUtUQUcoJ0YnLCAnTCcsICdWJywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVlA3LCAgICAgICAgICBNS1RBRygnVicsICdQJywgJzcnLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WUDcsICAgICAgICAgIE1LVEFHKCdWJywgJ1AnLCAnNycsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQOCwgICAgICAgICAgTUtUQUcoJ1YnLCAnUCcsICc4JywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVlA5LCAgICAgICAgICBNS1RBRygnVicsICdQJywgJzknLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BU1YxLCAgICAgICAgIE1LVEFHKCdBJywgJ1MnLCAnVicsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FTVjIsICAgICAgICAgTUtUQUcoJ0EnLCAnUycsICdWJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVkNSMSwgICAgICAgICBNS1RBRygnVicsICdDJywgJ1InLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9GRlYxLCAgICAgICAgIE1LVEFHKCdGJywgJ0YnLCAnVicsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1hBTl9XQzQsICAgICAgTUtUQUcoJ1gnLCAneCcsICdhJywgJ24nKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUlNSUMsICAgICAgICBNS1RBRygnTCcsICdNJywgJzInLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NU1JMRSwgICAgICAgIE1LVEFHKCdtJywgJ3InLCAnbCcsICdlJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01TUkxFLCAgICAgICAgTUtUQUcoIDEgLCAgMCAsICAwICwgIDAgKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVNSTEUsICAgICAgICBNS1RBRyggMiAsICAwICwgIDAgLCAgMCApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NU1ZJREVPMSwgICAgIE1LVEFHKCdNJywgJ1MnLCAnVicsICdDJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01TVklERU8xLCAgICAgTUtUQUcoJ20nLCAncycsICd2JywgJ2MnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVNWSURFTzEsICAgICBNS1RBRygnQycsICdSJywgJ0EnLCAnTScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NU1ZJREVPMSwgICAgIE1LVEFHKCdjJywgJ3InLCAnYScsICdtJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01TVklERU8xLCAgICAgTUtUQUcoJ1cnLCAnSCcsICdBJywgJ00nKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVNWSURFTzEsICAgICBNS1RBRygndycsICdoJywgJ2EnLCAnbScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9DSU5FUEFLLCAgICAgIE1LVEFHKCdjJywgJ3YnLCAnaScsICdkJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1RSVUVNT1RJT04xLCAgTUtUQUcoJ0QnLCAnVScsICdDJywgJ0snKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVFJVRU1PVElPTjEsICBNS1RBRygnUCcsICdWJywgJ0UnLCAnWicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NU1pILCAgICAgICAgIE1LVEFHKCdNJywgJ1MnLCAnWicsICdIJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1pMSUIsICAgICAgICAgTUtUQUcoJ1onLCAnTCcsICdJJywgJ0InKSB9LAorICAgIHsgQVZfQ09ERUNfSURfU05PVywgICAgICAgICBNS1RBRygnUycsICdOJywgJ08nLCAnVycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF80WE0sICAgICAgICAgIE1LVEFHKCc0JywgJ1gnLCAnTScsICdWJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0ZMVjEsICAgICAgICAgTUtUQUcoJ0YnLCAnTCcsICdWJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRkxWMSwgICAgICAgICBNS1RBRygnUycsICcyJywgJzYnLCAnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9GTEFTSFNWLCAgICAgIE1LVEFHKCdGJywgJ1MnLCAnVicsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1NWUTEsICAgICAgICAgTUtUQUcoJ3MnLCAndicsICdxJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVFNDQywgICAgICAgICBNS1RBRygndCcsICdzJywgJ2MnLCAnYycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9VTFRJLCAgICAgICAgIE1LVEFHKCdVJywgJ0wnLCAnVCcsICdJJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZJWEwsICAgICAgICAgTUtUQUcoJ1YnLCAnSScsICdYJywgJ0wnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUVBFRywgICAgICAgICBNS1RBRygnUScsICdQJywgJ0UnLCAnRycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9RUEVHLCAgICAgICAgIE1LVEFHKCdRJywgJzEnLCAnLicsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1FQRUcsICAgICAgICAgTUtUQUcoJ1EnLCAnMScsICcuJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfV01WMywgICAgICAgICBNS1RBRygnVycsICdNJywgJ1YnLCAnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9XTVYzSU1BR0UsICAgIE1LVEFHKCdXJywgJ00nLCAnVicsICdQJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZDMSwgICAgICAgICAgTUtUQUcoJ1cnLCAnVicsICdDJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVkMxLCAgICAgICAgICBNS1RBRygnVycsICdNJywgJ1YnLCAnQScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WQzFJTUFHRSwgICAgIE1LVEFHKCdXJywgJ1YnLCAnUCcsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0xPQ08sICAgICAgICAgTUtUQUcoJ0wnLCAnTycsICdDJywgJ08nKSB9LAorICAgIHsgQVZfQ09ERUNfSURfV05WMSwgICAgICAgICBNS1RBRygnVycsICdOJywgJ1YnLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9XTlYxLCAgICAgICAgIE1LVEFHKCdZJywgJ1UnLCAnVicsICc4JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FBU0MsICAgICAgICAgTUtUQUcoJ0EnLCAnQScsICdTJywgJzQnKSB9LCAvKiBBdXRvZGVzayAyNCBiaXQgUkxFIGNvbXByZXNzb3IgKi8KKyAgICB7IEFWX0NPREVDX0lEX0FBU0MsICAgICAgICAgTUtUQUcoJ0EnLCAnQScsICdTJywgJ0MnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSU5ERU8yLCAgICAgICBNS1RBRygnUicsICdUJywgJzInLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9GUkFQUywgICAgICAgIE1LVEFHKCdGJywgJ1AnLCAnUycsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1RIRU9SQSwgICAgICAgTUtUQUcoJ3QnLCAnaCcsICdlJywgJ28nKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVFJVRU1PVElPTjIsICBNS1RBRygnVCcsICdNJywgJzInLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9DU0NELCAgICAgICAgIE1LVEFHKCdDJywgJ1MnLCAnQycsICdEJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1pNQlYsICAgICAgICAgTUtUQUcoJ1onLCAnTScsICdCJywgJ1YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfS01WQywgICAgICAgICBNS1RBRygnSycsICdNJywgJ1YnLCAnQycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9DQVZTLCAgICAgICAgIE1LVEFHKCdDJywgJ0EnLCAnVicsICdTJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0pQRUcyMDAwLCAgICAgTUtUQUcoJ20nLCAnaicsICdwJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSlBFRzIwMDAsICAgICBNS1RBRygnTScsICdKJywgJzInLCAnQycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9KUEVHMjAwMCwgICAgIE1LVEFHKCdMJywgJ0onLCAnMicsICdDJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0pQRUcyMDAwLCAgICAgTUtUQUcoJ0wnLCAnSicsICcyJywgJ0snKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSlBFRzIwMDAsICAgICBNS1RBRygnSScsICdQJywgJ0onLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WTU5DLCAgICAgICAgIE1LVEFHKCdWJywgJ00nLCAnbicsICdjJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1RBUkdBLCAgICAgICAgTUtUQUcoJ3QnLCAnZycsICdhJywgJyAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUE5HLCAgICAgICAgICBNS1RBRygnTScsICdQJywgJ04nLCAnRycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QTkcsICAgICAgICAgIE1LVEFHKCdQJywgJ04nLCAnRycsICcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BORywgICAgICAgICAgTUtUQUcoJ3AnLCAnbicsICdnJywgJyAnKSB9LCAvKiBJbWFnZUogKi8KKyAgICB7IEFWX0NPREVDX0lEX0NMSlIsICAgICAgICAgTUtUQUcoJ0MnLCAnTCcsICdKJywgJ1InKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRElSQUMsICAgICAgICBNS1RBRygnZCcsICdyJywgJ2EnLCAnYycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SUFpBLCAgICAgICAgIE1LVEFHKCdhJywgJ3onLCAncCcsICdyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JQWkEsICAgICAgICAgTUtUQUcoJ1InLCAnUCcsICdaJywgJ0EnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUlBaQSwgICAgICAgICBNS1RBRygncicsICdwJywgJ3onLCAnYScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TUDVYLCAgICAgICAgIE1LVEFHKCdTJywgJ1AnLCAnNScsICc0JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FVUkEsICAgICAgICAgTUtUQUcoJ0EnLCAnVScsICdSJywgJ0EnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQVVSQTIsICAgICAgICBNS1RBRygnQScsICdVJywgJ1InLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9EUFgsICAgICAgICAgIE1LVEFHKCdkJywgJ3AnLCAneCcsICcgJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0tHVjEsICAgICAgICAgTUtUQUcoJ0snLCAnRycsICdWJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTEFHQVJJVEgsICAgICBNS1RBRygnTCcsICdBJywgJ0cnLCAnUycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BTVYsICAgICAgICAgIE1LVEFHKCdBJywgJ00nLCAnVicsICdGJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1VUVklERU8sICAgICAgTUtUQUcoJ1UnLCAnTCcsICdSJywgJ0EnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVVRWSURFTywgICAgICBNS1RBRygnVScsICdMJywgJ1InLCAnRycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9VVFZJREVPLCAgICAgIE1LVEFHKCdVJywgJ0wnLCAnWScsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1VUVklERU8sICAgICAgTUtUQUcoJ1UnLCAnTCcsICdZJywgJzInKSB9LAorICAgIC8qIFV0IFZpZGVvIHZlcnNpb24gMTMuMC4xIEJULjcwOSBjb2RlY3MgKi8KKyAgICB7IEFWX0NPREVDX0lEX1VUVklERU8sICAgICAgTUtUQUcoJ1UnLCAnTCcsICdIJywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVVRWSURFTywgICAgICBNS1RBRygnVScsICdMJywgJ0gnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9VVFZJREVPLCAgICAgIE1LVEFHKCdVJywgJ1EnLCAnWScsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZCTEUsICAgICAgICAgTUtUQUcoJ1YnLCAnQicsICdMJywgJ0UnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRVNDQVBFMTMwLCAgICBNS1RBRygnRScsICcxJywgJzMnLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9EWFRPUlksICAgICAgIE1LVEFHKCd4JywgJ3QnLCAnbycsICdyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1pFUk9DT0RFQywgICAgTUtUQUcoJ1onLCAnRScsICdDJywgJ08nKSB9LAorICAgIHsgQVZfQ09ERUNfSURfWTQxUCwgICAgICAgICBNS1RBRygnWScsICc0JywgJzEnLCAnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9GTElDLCAgICAgICAgIE1LVEFHKCdBJywgJ0YnLCAnTCcsICdDJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01TUzEsICAgICAgICAgTUtUQUcoJ00nLCAnUycsICdTJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVNBMSwgICAgICAgICBNS1RBRygnTScsICdTJywgJ0EnLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9UU0NDMiwgICAgICAgIE1LVEFHKCdUJywgJ1MnLCAnQycsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01UUzIsICAgICAgICAgTUtUQUcoJ00nLCAnVCcsICdTJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQ0xMQywgICAgICAgICBNS1RBRygnQycsICdMJywgJ0wnLCAnQycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NU1MyLCAgICAgICAgIE1LVEFHKCdNJywgJ1MnLCAnUycsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1NWUTMsICAgICAgICAgTUtUQUcoJ1MnLCAnVicsICdRJywgJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfMDEyViwgICAgICAgICBNS1RBRygnMCcsICcxJywgJzInLCAndicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF8wMTJWLCAgICAgICAgIE1LVEFHKCdhJywgJzEnLCAnMicsICd2JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0cyTSwgICAgICAgICAgTUtUQUcoJ0cnLCAnMicsICdNJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRzJNLCAgICAgICAgICBNS1RBRygnRycsICcyJywgJ00nLCAnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9HMk0sICAgICAgICAgIE1LVEFHKCdHJywgJzInLCAnTScsICc0JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0cyTSwgICAgICAgICAgTUtUQUcoJ0cnLCAnMicsICdNJywgJzUnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRklDLCAgICAgICAgICBNS1RBRygnRicsICdJJywgJ0MnLCAnVicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QUk9SRVMsICAgICAgIE1LVEFHKCdBJywgJ1AnLCAnQycsICdOJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX05PTkUsICAgICAgICAgMCB9Cit9OworCitjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX3dhdl90YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsICAgICAgIDB4MDAwMSB9LAorICAgIC8qIG11c3QgY29tZSBhZnRlciBzMTZsZSBpbiB0aGlzIGxpc3QgKi8KKyAgICB7IEFWX0NPREVDX0lEX1BDTV9VOCwgICAgICAgICAgMHgwMDAxIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzI0TEUsICAgICAgIDB4MDAwMSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MzMkxFLCAgICAgICAweDAwMDEgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FEUENNX01TLCAgICAgICAgMHgwMDAyIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjMyTEUsICAgICAgIDB4MDAwMyB9LAorICAgIC8qIG11c3QgY29tZSBhZnRlciBmMzJsZSBpbiB0aGlzIGxpc3QgKi8KKyAgICB7IEFWX0NPREVDX0lEX1BDTV9GNjRMRSwgICAgICAgMHgwMDAzIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fQUxBVywgICAgICAgIDB4MDAwNiB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX01VTEFXLCAgICAgICAweDAwMDcgfSwKKyAgICB7IEFWX0NPREVDX0lEX1dNQVZPSUNFLCAgICAgICAgMHgwMDBBIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfT0tJLCAgIDB4MDAxMCB9LAorICAgIHsgQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBViwgICAweDAwMTEgfSwKKyAgICAvKiBtdXN0IGNvbWUgYWZ0ZXIgYWRwY21faW1hX3dhdiBpbiB0aGlzIGxpc3QgKi8KKyAgICB7IEFWX0NPREVDX0lEX1BDTV9aT1JLLCAgICAgICAgMHgwMDExIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfT0tJLCAgIDB4MDAxNyB9LAorICAgIHsgQVZfQ09ERUNfSURfQURQQ01fWUFNQUhBLCAgICAweDAwMjAgfSwKKyAgICB7IEFWX0NPREVDX0lEX1RSVUVTUEVFQ0gsICAgICAgMHgwMDIyIH0sCisgICAgeyBBVl9DT0RFQ19JRF9HU01fTVMsICAgICAgICAgIDB4MDAzMSB9LAorICAgIHsgQVZfQ09ERUNfSURfR1NNX01TLCAgICAgICAgICAweDAwMzIgfSwgIC8qIG1zbiBhdWRpbyAqLworICAgIHsgQVZfQ09ERUNfSURfQU1SX05CLCAgICAgICAgICAweDAwMzggfSwgIC8qIHJvZ3VlIGZvcm1hdCBudW1iZXIgKi8KKyAgICB7IEFWX0NPREVDX0lEX0c3MjNfMSwgICAgICAgICAgMHgwMDQyIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2LCAgICAgIDB4MDA0NSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVAyLCAgICAgICAgICAgICAweDAwNTAgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QMywgICAgICAgICAgICAgMHgwMDU1IH0sCisgICAgeyBBVl9DT0RFQ19JRF9BTVJfTkIsICAgICAgICAgIDB4MDA1NyB9LAorICAgIHsgQVZfQ09ERUNfSURfQU1SX1dCLCAgICAgICAgICAweDAwNTggfSwKKyAgICAvKiByb2d1ZSBmb3JtYXQgbnVtYmVyICovCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREs0LCAgIDB4MDA2MSB9LAorICAgIC8qIHJvZ3VlIGZvcm1hdCBudW1iZXIgKi8KKyAgICB7IEFWX0NPREVDX0lEX0FEUENNX0lNQV9ESzMsICAgMHgwMDYyIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2LCAgICAgIDB4MDA2NCB9LAorICAgIHsgQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBViwgICAweDAwNjkgfSwKKyAgICB7IEFWX0NPREVDX0lEX01FVEFTT1VORCwgICAgICAgMHgwMDc1IH0sCisgICAgeyBBVl9DT0RFQ19JRF9BQUMsICAgICAgICAgICAgIDB4MDBmZiB9LAorICAgIHsgQVZfQ09ERUNfSURfRzcyM18xLCAgICAgICAgICAweDAxMTEgfSwKKyAgICB7IEFWX0NPREVDX0lEX1NJUFIsICAgICAgICAgICAgMHgwMTMwIH0sCisgICAgeyBBVl9DT0RFQ19JRF9XTUFWMSwgICAgICAgICAgIDB4MDE2MCB9LAorICAgIHsgQVZfQ09ERUNfSURfV01BVjIsICAgICAgICAgICAweDAxNjEgfSwKKyAgICB7IEFWX0NPREVDX0lEX1dNQVBSTywgICAgICAgICAgMHgwMTYyIH0sCisgICAgeyBBVl9DT0RFQ19JRF9XTUFMT1NTTEVTUywgICAgIDB4MDE2MyB9LAorICAgIHsgQVZfQ09ERUNfSURfQURQQ01fQ1QsICAgICAgICAweDAyMDAgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FUUkFDMywgICAgICAgICAgMHgwMjcwIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9HNzIyLCAgICAgIDB4MDI4RiB9LAorICAgIHsgQVZfQ09ERUNfSURfSU1DLCAgICAgICAgICAgICAweDA0MDEgfSwKKyAgICB7IEFWX0NPREVDX0lEX0lBQywgICAgICAgICAgICAgMHgwNDAyIH0sCisgICAgeyBBVl9DT0RFQ19JRF9PTjJBVkMsICAgICAgICAgIDB4MDUwMCB9LAorICAgIHsgQVZfQ09ERUNfSURfT04yQVZDLCAgICAgICAgICAweDA1MDEgfSwKKyAgICB7IEFWX0NPREVDX0lEX0dTTV9NUywgICAgICAgICAgMHgxNTAwIH0sCisgICAgeyBBVl9DT0RFQ19JRF9UUlVFU1BFRUNILCAgICAgIDB4MTUwMSB9LAorICAgIC8qIEFEVFMgQUFDICovCisgICAgeyBBVl9DT0RFQ19JRF9BQUMsICAgICAgICAgICAgIDB4MTYwMCB9LAorICAgIHsgQVZfQ09ERUNfSURfQUFDX0xBVE0sICAgICAgICAweDE2MDIgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FDMywgICAgICAgICAgICAgMHgyMDAwIH0sCisgICAgLyogVGhlcmUgaXMgbm8gTWljcm9zb2Z0IEZvcm1hdCBUYWcgZm9yIEUtQUMzLCB0aGUgR1VJRCBoYXMgdG8gYmUgdXNlZCAqLworICAgIHsgQVZfQ09ERUNfSURfRUFDMywgICAgICAgICAgICAweDIwMDAgfSwKKyAgICB7IEFWX0NPREVDX0lEX0RUUywgICAgICAgICAgICAgMHgyMDAxIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TT05JQywgICAgICAgICAgIDB4MjA0OCB9LAorICAgIHsgQVZfQ09ERUNfSURfU09OSUNfTFMsICAgICAgICAweDIwNDggfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9NVUxBVywgICAgICAgMHg2Yzc1IH0sCisgICAgeyBBVl9DT0RFQ19JRF9BQUMsICAgICAgICAgICAgIDB4NzA2ZCB9LAorICAgIHsgQVZfQ09ERUNfSURfQUFDLCAgICAgICAgICAgICAweDQxNDMgfSwKKyAgICB7IEFWX0NPREVDX0lEX1hBTl9EUENNLCAgICAgICAgMHg1OTRhIH0sCisgICAgeyBBVl9DT0RFQ19JRF9HNzIzXzEsICAgICAgICAgIDB4QTEwMCB9LCAvKiBDb212ZXJzZSBJbmZvc3lzIEx0ZC4gRzcyMyAxICovCisgICAgeyBBVl9DT0RFQ19JRF9BQUMsICAgICAgICAgICAgIDB4QTEwNiB9LAorICAgIHsgQVZfQ09ERUNfSURfU1BFRVgsICAgICAgICAgICAweEExMDkgfSwKKyAgICB7IEFWX0NPREVDX0lEX0ZMQUMsICAgICAgICAgICAgMHhGMUFDIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9TV0YsICAgICAgICgnUycgPDwgOCkgKyAnRicgfSwKKyAgICAvKiBIQUNLL0ZJWE1FOiBEb2VzIFZvcmJpcyBpbiBXQVYvQVZJIGhhdmUgYW4gKGluKW9mZmljaWFsIElEPyAqLworICAgIHsgQVZfQ09ERUNfSURfVk9SQklTLCAgICAgICAgICAoJ1YnIDw8IDgpICsgJ28nIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAgICAgIDAgfSwKK307CisKK2NvbnN0IEFWTWV0YWRhdGFDb252IGZmX3JpZmZfaW5mb19jb252W10gPSB7CisgICAgeyAiSUFSVCIsICJhcnRpc3QiICAgICB9LAorICAgIHsgIklDTVQiLCAiY29tbWVudCIgICAgfSwKKyAgICB7ICJJQ09QIiwgImNvcHlyaWdodCIgIH0sCisgICAgeyAiSUNSRCIsICJkYXRlIiAgICAgICB9LAorICAgIHsgIklHTlIiLCAiZ2VucmUiICAgICAgfSwKKyAgICB7ICJJTE5HIiwgImxhbmd1YWdlIiAgIH0sCisgICAgeyAiSU5BTSIsICJ0aXRsZSIgICAgICB9LAorICAgIHsgIklQUkQiLCAiYWxidW0iICAgICAgfSwKKyAgICB7ICJJUFJUIiwgInRyYWNrIiAgICAgIH0sCisgICAgeyAiSVRSSyIsICJ0cmFjayIgICAgICB9LAorICAgIHsgIklTRlQiLCAiZW5jb2RlciIgICAgfSwKKyAgICB7ICJJU01QIiwgInRpbWVjb2RlIiAgIH0sCisgICAgeyAiSVRDSCIsICJlbmNvZGVkX2J5IiB9LAorICAgIHsgMCB9LAorfTsKKworY29uc3Qgc3RydWN0IEFWQ29kZWNUYWcgKmF2Zm9ybWF0X2dldF9yaWZmX3ZpZGVvX3RhZ3Modm9pZCkKK3sKKyAgICByZXR1cm4gZmZfY29kZWNfYm1wX3RhZ3M7Cit9CisKK2NvbnN0IHN0cnVjdCBBVkNvZGVjVGFnICphdmZvcm1hdF9nZXRfcmlmZl9hdWRpb190YWdzKHZvaWQpCit7CisgICAgcmV0dXJuIGZmX2NvZGVjX3dhdl90YWdzOworfQorCitjb25zdCBBVkNvZGVjR3VpZCBmZl9jb2RlY193YXZfZ3VpZHNbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX0FDMywgICAgICB7IDB4MkMsIDB4ODAsIDB4NkQsIDB4RTAsIDB4NDYsIDB4REIsIDB4Q0YsIDB4MTEsIDB4QjQsIDB4RDEsIDB4MDAsIDB4ODAsIDB4NUYsIDB4NkMsIDB4QkIsIDB4RUEgfSB9LAorICAgIHsgQVZfQ09ERUNfSURfQVRSQUMzUCwgIHsgMHhCRiwgMHhBQSwgMHgyMywgMHhFOSwgMHg1OCwgMHhDQiwgMHg3MSwgMHg0NCwgMHhBMSwgMHgxOSwgMHhGRiwgMHhGQSwgMHgwMSwgMHhFNCwgMHhDRSwgMHg2MiB9IH0sCisgICAgeyBBVl9DT0RFQ19JRF9FQUMzLCAgICAgeyAweEFGLCAweDg3LCAweEZCLCAweEE3LCAweDAyLCAweDJELCAweEZCLCAweDQyLCAweEE0LCAweEQ0LCAweDA1LCAweENELCAweDkzLCAweDg0LCAweDNCLCAweEREIH0gfSwKKyAgICB7IEFWX0NPREVDX0lEX01QMiwgICAgICB7IDB4MkIsIDB4ODAsIDB4NkQsIDB4RTAsIDB4NDYsIDB4REIsIDB4Q0YsIDB4MTEsIDB4QjQsIDB4RDEsIDB4MDAsIDB4ODAsIDB4NUYsIDB4NkMsIDB4QkIsIDB4RUEgfSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSB9Cit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3JpZmYuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yaWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyNTYzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yaWZmLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBSSUZGIGNvbW1vbiBmdW5jdGlvbnMgYW5kIGRhdGEKKyAqIGNvcHlyaWdodCAoYykgMjAwMCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaW50ZXJuYWwgaGVhZGVyIGZvciBSSUZGIGJhc2VkIChkZSltdXhlcnMKKyAqIGRvIE5PVCBpbmNsdWRlIHRoaXMgaW4gZW5kIHVzZXIgYXBwbGljYXRpb25zCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9SSUZGX0gKKyNkZWZpbmUgQVZGT1JNQVRfUklGRl9ICisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJhdmlvLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorCitleHRlcm4gY29uc3QgQVZNZXRhZGF0YUNvbnYgZmZfcmlmZl9pbmZvX2NvbnZbXTsKKworaW50NjRfdCBmZl9zdGFydF90YWcoQVZJT0NvbnRleHQgKnBiLCBjb25zdCBjaGFyICp0YWcpOwordm9pZCBmZl9lbmRfdGFnKEFWSU9Db250ZXh0ICpwYiwgaW50NjRfdCBzdGFydCk7CisKKy8qKgorICogUmVhZCBCSVRNQVBJTkZPSEVBREVSIHN0cnVjdHVyZSBhbmQgc2V0IEFWU3RyZWFtIGNvZGVjIHdpZHRoLCBoZWlnaHQgYW5kCisgKiBiaXRzX3Blcl9lbmNvZGVkX3NhbXBsZSBmaWVsZHMuIERvZXMgbm90IHJlYWQgZXh0cmFkYXRhLgorICogQHJldHVybiBjb2RlYyB0YWcKKyAqLworaW50IGZmX2dldF9ibXBfaGVhZGVyKEFWSU9Db250ZXh0ICpwYiwgQVZTdHJlYW0gKnN0LCB1bnNpZ25lZCAqZXNpemUpOworCit2b2lkIGZmX3B1dF9ibXBfaGVhZGVyKEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY0NvbnRleHQgKmVuYywgY29uc3QgQVZDb2RlY1RhZyAqdGFncywgaW50IGZvcl9hc2YsIGludCBpZ25vcmVfZXh0cmFkYXRhKTsKKworLyoqCisgKiBUZWxsIGZmX3B1dF93YXZfaGVhZGVyKCkgdG8gdXNlIFdBVkVGT1JNQVRFWCBldmVuIGZvciBQQ00gY29kZWNzLgorICovCisjZGVmaW5lIEZGX1BVVF9XQVZfSEVBREVSX0ZPUkNFX1dBVkVGT1JNQVRFWCAgICAweDAwMDAwMDAxCisKKy8qKgorICogV3JpdGUgV0FWRUZPUk1BVCBoZWFkZXIgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBmbGFncyBhIGNvbWJpbmF0aW9uIG9mIEZGX1BVVF9XQVZfSEVBREVSXyogY29uc3RhbnRzCisgKgorICogQHJldHVybiB0aGUgc2l6ZSBvciAtMSBvbiBlcnJvcgorICovCitpbnQgZmZfcHV0X3dhdl9oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCBBVkNvZGVjQ29udGV4dCAqZW5jLCBpbnQgZmxhZ3MpOworCitlbnVtIEFWQ29kZWNJRCBmZl93YXZfY29kZWNfZ2V0X2lkKHVuc2lnbmVkIGludCB0YWcsIGludCBicHMpOworaW50IGZmX2dldF93YXZfaGVhZGVyKEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY0NvbnRleHQgKmNvZGVjLCBpbnQgc2l6ZSk7CisKK2V4dGVybiBjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX2JtcF90YWdzW107IC8vIGV4cG9zZWQgdGhyb3VnaCBhdmZvcm1hdF9nZXRfcmlmZl92aWRlb190YWdzKCkKK2V4dGVybiBjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX3dhdl90YWdzW107CisKK3ZvaWQgZmZfcGFyc2Vfc3BlY2lmaWNfcGFyYW1zKEFWU3RyZWFtICpzdCwgaW50ICphdV9yYXRlLCBpbnQgKmF1X3NzaXplLCBpbnQgKmF1X3NjYWxlKTsKKworaW50IGZmX3JlYWRfcmlmZl9pbmZvKEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCBzaXplKTsKKworLyoqCisgKiBXcml0ZSBhbGwgcmVjb2duaXplZCBSSUZGIHRhZ3MgZnJvbSBzLT5tZXRhZGF0YQorICovCit2b2lkIGZmX3JpZmZfd3JpdGVfaW5mbyhBVkZvcm1hdENvbnRleHQgKnMpOworCisvKioKKyAqIFdyaXRlIGEgc2luZ2xlIFJJRkYgaW5mbyB0YWcKKyAqLwordm9pZCBmZl9yaWZmX3dyaXRlX2luZm9fdGFnKEFWSU9Db250ZXh0ICpwYiwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICpzdHIpOworCit0eXBlZGVmIHVpbnQ4X3QgZmZfYXNmX2d1aWRbMTZdOworCit0eXBlZGVmIHN0cnVjdCBBVkNvZGVjR3VpZCB7CisgICAgZW51bSBBVkNvZGVjSUQgaWQ7CisgICAgZmZfYXNmX2d1aWQgZ3VpZDsKK30gQVZDb2RlY0d1aWQ7CisKK2V4dGVybiBjb25zdCBBVkNvZGVjR3VpZCBmZl9jb2RlY193YXZfZ3VpZHNbXTsKKworI2RlZmluZSBGRl9QUklfR1VJRCBcCisgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIiBcCisgICAgInslMDJ4JTAyeCUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeH0iCisKKyNkZWZpbmUgRkZfQVJHX0dVSUQoZykgXAorICAgIGdbMF0sIGdbMV0sIGdbMl0sICBnWzNdLCAgZ1s0XSwgIGdbNV0sICBnWzZdLCAgZ1s3XSwgXAorICAgIGdbOF0sIGdbOV0sIGdbMTBdLCBnWzExXSwgZ1sxMl0sIGdbMTNdLCBnWzE0XSwgZ1sxNV0sXAorICAgIGdbM10sIGdbMl0sIGdbMV0sICBnWzBdLCAgZ1s1XSwgIGdbNF0sICBnWzddLCAgZ1s2XSwgXAorICAgIGdbOF0sIGdbOV0sIGdbMTBdLCBnWzExXSwgZ1sxMl0sIGdbMTNdLCBnWzE0XSwgZ1sxNV0KKworI2RlZmluZSBGRl9NRURJQVNVQlRZUEVfQkFTRV9HVUlEIFwKKyAgICAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweEFBLCAweDAwLCAweDM4LCAweDlCLCAweDcxCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBmZl9ndWlkY21wKGNvbnN0IHZvaWQgKmcxLCBjb25zdCB2b2lkICpnMikKK3sKKyAgICByZXR1cm4gbWVtY21wKGcxLCBnMiwgc2l6ZW9mKGZmX2FzZl9ndWlkKSk7Cit9CisKK2ludCBmZl9nZXRfZ3VpZChBVklPQ29udGV4dCAqcywgZmZfYXNmX2d1aWQgKmcpOwordm9pZCBmZl9wdXRfZ3VpZChBVklPQ29udGV4dCAqcywgY29uc3QgZmZfYXNmX2d1aWQgKmcpOworY29uc3QgZmZfYXNmX2d1aWQgKmdldF9jb2RlY19ndWlkKGVudW0gQVZDb2RlY0lEIGlkLCBjb25zdCBBVkNvZGVjR3VpZCAqYXZfZ3VpZCk7CisKK2VudW0gQVZDb2RlY0lEIGZmX2NvZGVjX2d1aWRfZ2V0X2lkKGNvbnN0IEFWQ29kZWNHdWlkICpndWlkcywgZmZfYXNmX2d1aWQgZ3VpZCk7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9SSUZGX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9yaWZmZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcmlmZmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTIyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcmlmZmRlYy5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogUklGRiBkZW11eGluZyBmdW5jdGlvbnMgYW5kIGRhdGEKKyAqIENvcHlyaWdodCAoYykgMjAwMCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Vycm9yLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgInJpZmYuaCIKKworaW50IGZmX2dldF9ndWlkKEFWSU9Db250ZXh0ICpzLCBmZl9hc2ZfZ3VpZCAqZykKK3sKKyAgICBhdl9hc3NlcnQwKHNpemVvZigqZykgPT0gMTYpOyAvL2NvbXBpbGVyIHdpbGwgb3B0aW1pemUgdGhpcyBvdXQKKyAgICBpZiAoYXZpb19yZWFkKHMsICpnLCBzaXplb2YoKmcpKSA8IChpbnQpc2l6ZW9mKCpnKSkgeworICAgICAgICBtZW1zZXQoKmcsIDAsIHNpemVvZigqZykpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2VudW0gQVZDb2RlY0lEIGZmX2NvZGVjX2d1aWRfZ2V0X2lkKGNvbnN0IEFWQ29kZWNHdWlkICpndWlkcywgZmZfYXNmX2d1aWQgZ3VpZCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBndWlkc1tpXS5pZCAhPSBBVl9DT0RFQ19JRF9OT05FOyBpKyspCisgICAgICAgIGlmICghZmZfZ3VpZGNtcChndWlkc1tpXS5ndWlkLCBndWlkKSkKKyAgICAgICAgICAgIHJldHVybiBndWlkc1tpXS5pZDsKKyAgICByZXR1cm4gQVZfQ09ERUNfSURfTk9ORTsKK30KKworLyogV2UgY291bGQgYmUgZ2l2ZW4gb25lIG9mIHRoZSB0aHJlZSBwb3NzaWJsZSBzdHJ1Y3R1cmVzIGhlcmU6CisgKiBXQVZFRk9STUFULCBQQ01XQVZFRk9STUFUIG9yIFdBVkVGT1JNQVRFWC4gRWFjaCBzdHJ1Y3R1cmUKKyAqIGlzIGFuIGV4cGFuc2lvbiBvZiB0aGUgcHJldmlvdXMgb25lIHdpdGggdGhlIGZpZWxkcyBhZGRlZAorICogYXQgdGhlIGJvdHRvbS4gUENNV0FWRUZPUk1BVCBhZGRzICdXT1JEIHdCaXRzUGVyU2FtcGxlJyBhbmQKKyAqIFdBVkVGT1JNQVRFWCBhZGRzICdXT1JEICBjYlNpemUnIGFuZCBiYXNpY2FsbHkgbWFrZXMgaXRzZWxmCisgKiBhbiBvcGVuZW5kZWQgc3RydWN0dXJlLgorICovCisKK3N0YXRpYyB2b2lkIHBhcnNlX3dhdmVmb3JtYXRleChBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNDb250ZXh0ICpjKQoreworICAgIGZmX2FzZl9ndWlkIHN1YmZvcm1hdDsKKyAgICBpbnQgYnBzID0gYXZpb19ybDE2KHBiKTsKKyAgICBpZiAoYnBzKQorICAgICAgICBjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBicHM7CisKKyAgICBjLT5jaGFubmVsX2xheW91dCAgICAgICAgPSBhdmlvX3JsMzIocGIpOyAvKiBkd0NoYW5uZWxNYXNrICovCisKKyAgICBmZl9nZXRfZ3VpZChwYiwgJnN1YmZvcm1hdCk7CisgICAgaWYgKCFtZW1jbXAoc3ViZm9ybWF0ICsgNCwKKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdFtdKXsgRkZfTUVESUFTVUJUWVBFX0JBU0VfR1VJRCB9LCAxMikpIHsKKyAgICAgICAgYy0+Y29kZWNfdGFnID0gQVZfUkwzMihzdWJmb3JtYXQpOworICAgICAgICBjLT5jb2RlY19pZCAgPSBmZl93YXZfY29kZWNfZ2V0X2lkKGMtPmNvZGVjX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ3VpZF9nZXRfaWQoZmZfY29kZWNfd2F2X2d1aWRzLCBzdWJmb3JtYXQpOworICAgICAgICBpZiAoIWMtPmNvZGVjX2lkKQorICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHN1YmZvcm1hdDoiRkZfUFJJX0dVSUQiXG4iLAorICAgICAgICAgICAgICAgICAgIEZGX0FSR19HVUlEKHN1YmZvcm1hdCkpOworICAgIH0KK30KKworaW50IGZmX2dldF93YXZfaGVhZGVyKEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY0NvbnRleHQgKmNvZGVjLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaWQ7CisKKyAgICBpZiAoc2l6ZSA8IDE0KQorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoY29kZWMsICJ3YXYgaGVhZGVyIHNpemUgPCAxNCIpOworCisgICAgaWQgICAgICAgICAgICAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBjb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgY29kZWMtPmNoYW5uZWxzICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocGIpOworICAgIGNvZGVjLT5iaXRfcmF0ZSAgICA9IGF2aW9fcmwzMihwYikgKiA4OworICAgIGNvZGVjLT5ibG9ja19hbGlnbiA9IGF2aW9fcmwxNihwYik7CisgICAgaWYgKHNpemUgPT0gMTQpIHsgIC8qIFdlJ3JlIGRlYWxpbmcgd2l0aCBwbGFpbiB2YW5pbGxhIFdBVkVGT1JNQVQgKi8KKyAgICAgICAgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7CisgICAgfSBlbHNlCisgICAgICAgIGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JsMTYocGIpOworICAgIGlmIChpZCA9PSAweEZGRkUpIHsKKyAgICAgICAgY29kZWMtPmNvZGVjX3RhZyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZWMtPmNvZGVjX3RhZyA9IGlkOworICAgICAgICBjb2RlYy0+Y29kZWNfaWQgID0gZmZfd2F2X2NvZGVjX2dldF9pZChpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgfQorICAgIGlmIChzaXplID49IDE4KSB7ICAvKiBXZSdyZSBvYnZpb3VzbHkgZGVhbGluZyB3aXRoIFdBVkVGT1JNQVRFWCAqLworICAgICAgICBpbnQgY2JTaXplID0gYXZpb19ybDE2KHBiKTsgLyogY2JTaXplICovCisgICAgICAgIHNpemUgIC09IDE4OworICAgICAgICBjYlNpemUgPSBGRk1JTihzaXplLCBjYlNpemUpOworICAgICAgICBpZiAoY2JTaXplID49IDIyICYmIGlkID09IDB4ZmZmZSkgeyAvKiBXQVZFRk9STUFURVhURU5TSUJMRSAqLworICAgICAgICAgICAgcGFyc2Vfd2F2ZWZvcm1hdGV4KHBiLCBjb2RlYyk7CisgICAgICAgICAgICBjYlNpemUgLT0gMjI7CisgICAgICAgICAgICBzaXplICAgLT0gMjI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNiU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWUoY29kZWMtPmV4dHJhZGF0YSk7CisgICAgICAgICAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShjb2RlYywgcGIsIGNiU2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBzaXplIC09IGNiU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgY2h1bmsgdG8gY29udGFpbiBnYXJiYWdlIGF0IHRoZSBlbmQgKi8KKyAgICAgICAgaWYgKHNpemUgPiAwKQorICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICB9CisgICAgaWYgKGNvZGVjLT5zYW1wbGVfcmF0ZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBzYW1wbGUgcmF0ZTogJWRcbiIsIGNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQ19MQVRNKSB7CisgICAgICAgIC8qIENoYW5uZWxzIGFuZCBzYW1wbGVfcmF0ZSB2YWx1ZXMgYXJlIHRob3NlIHByaW9yIHRvIGFwcGx5aW5nIFNCUgorICAgICAgICAgKiBhbmQvb3IgUFMuICovCisgICAgICAgIGNvZGVjLT5jaGFubmVscyAgICA9IDA7CisgICAgICAgIGNvZGVjLT5zYW1wbGVfcmF0ZSA9IDA7CisgICAgfQorICAgIC8qIG92ZXJyaWRlIGJpdHNfcGVyX2NvZGVkX3NhbXBsZSBmb3IgRy43MjYgKi8KKyAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0c3MjYgJiYgY29kZWMtPnNhbXBsZV9yYXRlKQorICAgICAgICBjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gY29kZWMtPmJpdF9yYXRlIC8gY29kZWMtPnNhbXBsZV9yYXRlOworCisgICAgcmV0dXJuIDA7Cit9CisKK2VudW0gQVZDb2RlY0lEIGZmX3dhdl9jb2RlY19nZXRfaWQodW5zaWduZWQgaW50IHRhZywgaW50IGJwcykKK3sKKyAgICBlbnVtIEFWQ29kZWNJRCBpZDsKKyAgICBpZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY193YXZfdGFncywgdGFnKTsKKyAgICBpZiAoaWQgPD0gMCkKKyAgICAgICAgcmV0dXJuIGlkOworCisgICAgaWYgKGlkID09IEFWX0NPREVDX0lEX1BDTV9TMTZMRSkKKyAgICAgICAgaWQgPSBmZl9nZXRfcGNtX2NvZGVjX2lkKGJwcywgMCwgMCwgfjEpOworICAgIGVsc2UgaWYgKGlkID09IEFWX0NPREVDX0lEX1BDTV9GMzJMRSkKKyAgICAgICAgaWQgPSBmZl9nZXRfcGNtX2NvZGVjX2lkKGJwcywgMSwgMCwgIDApOworCisgICAgaWYgKGlkID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYgJiYgYnBzID09IDgpCisgICAgICAgIGlkID0gQVZfQ09ERUNfSURfUENNX1pPUks7CisgICAgcmV0dXJuIGlkOworfQorCitpbnQgZmZfZ2V0X2JtcF9oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCBBVlN0cmVhbSAqc3QsIHVuc2lnbmVkICplc2l6ZSkKK3sKKyAgICBpbnQgdGFnMTsKKyAgICBpZihlc2l6ZSkgKmVzaXplICA9IGF2aW9fcmwzMihwYik7CisgICAgZWxzZSAgICAgICAgICAgICAgICBhdmlvX3JsMzIocGIpOworICAgIHN0LT5jb2RlYy0+d2lkdGggID0gYXZpb19ybDMyKHBiKTsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IChpbnQzMl90KWF2aW9fcmwzMihwYik7CisgICAgYXZpb19ybDE2KHBiKTsgLyogcGxhbmVzICovCisgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JsMTYocGIpOyAvKiBkZXB0aCAqLworICAgIHRhZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICBhdmlvX3JsMzIocGIpOyAvKiBJbWFnZVNpemUgKi8KKyAgICBhdmlvX3JsMzIocGIpOyAvKiBYUGVsc1Blck1ldGVyICovCisgICAgYXZpb19ybDMyKHBiKTsgLyogWVBlbHNQZXJNZXRlciAqLworICAgIGF2aW9fcmwzMihwYik7IC8qIENsclVzZWQgKi8KKyAgICBhdmlvX3JsMzIocGIpOyAvKiBDbHJJbXBvcnRhbnQgKi8KKyAgICByZXR1cm4gdGFnMTsKK30KKworaW50IGZmX3JlYWRfcmlmZl9pbmZvKEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCBzaXplKQoreworICAgIGludDY0X3Qgc3RhcnQsIGVuZCwgY3VyOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworCisgICAgc3RhcnQgPSBhdmlvX3RlbGwocGIpOworICAgIGVuZCAgID0gc3RhcnQgKyBzaXplOworCisgICAgd2hpbGUgKChjdXIgPSBhdmlvX3RlbGwocGIpKSA+PSAwICYmCisgICAgICAgICAgIGN1ciA8PSBlbmQgLSA4IC8qID0gdGFnICsgc2l6ZSAqLykgeworICAgICAgICB1aW50MzJfdCBjaHVua19jb2RlOworICAgICAgICBpbnQ2NF90IGNodW5rX3NpemU7CisgICAgICAgIGNoYXIga2V5WzVdID0geyAwIH07CisgICAgICAgIGNoYXIgKnZhbHVlOworCisgICAgICAgIGNodW5rX2NvZGUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBjaHVua19zaXplID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgICAgIGlmIChjaHVua19jb2RlIHx8IGNodW5rX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJJTkZPIHN1YmNodW5rIHRydW5jYXRlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNodW5rX3NpemUgPiBlbmQgfHwKKyAgICAgICAgICAgIGVuZCAtIGNodW5rX3NpemUgPCBjdXIgfHwKKyAgICAgICAgICAgIGNodW5rX3NpemUgPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgLTksIFNFRUtfQ1VSKTsKKyAgICAgICAgICAgIGNodW5rX2NvZGUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA+IGVuZCB8fCBlbmQgLSBjaHVua19zaXplIDwgY3VyIHx8IGNodW5rX3NpemUgPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJ0b28gYmlnIElORk8gc3ViY2h1bmtcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2h1bmtfc2l6ZSArPSAoY2h1bmtfc2l6ZSAmIDEpOworCisgICAgICAgIGlmICghY2h1bmtfY29kZSkgeworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUpCisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBjaHVua19zaXplKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBiLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInRydW5jYXRlZCBmaWxlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gYXZfbWFsbG9jeihjaHVua19zaXplICsgMSk7CisgICAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIm91dCBvZiBtZW1vcnksIHVuYWJsZSB0byByZWFkIElORk8gdGFnXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBBVl9XTDMyKGtleSwgY2h1bmtfY29kZSk7CisKKyAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgdmFsdWUsIGNodW5rX3NpemUpICE9IGNodW5rX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAicHJlbWF0dXJlIGVuZCBvZiBmaWxlIHdoaWxlIHJlYWRpbmcgSU5GTyB0YWdcbiIpOworICAgICAgICB9CisKKyAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBrZXksIHZhbHVlLCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcmlmZmVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JpZmZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTg1ODAwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JpZmZlbmMuYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIFJJRkYgbXV4aW5nIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDAwIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAicmlmZi5oIgorCitpbnQ2NF90IGZmX3N0YXJ0X3RhZyhBVklPQ29udGV4dCAqcGIsIGNvbnN0IGNoYXIgKnRhZykKK3sKKyAgICBmZmlvX3dmb3VyY2MocGIsIHRhZyk7CisgICAgYXZpb193bDMyKHBiLCAtMSk7CisgICAgcmV0dXJuIGF2aW9fdGVsbChwYik7Cit9CisKK3ZvaWQgZmZfZW5kX3RhZyhBVklPQ29udGV4dCAqcGIsIGludDY0X3Qgc3RhcnQpCit7CisgICAgaW50NjRfdCBwb3M7CisKKyAgICBhdl9hc3NlcnQwKChzdGFydCYxKSA9PSAwKTsKKworICAgIHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgaWYgKHBvcyAmIDEpCisgICAgICAgIGF2aW9fdzgocGIsIDApOworICAgIGF2aW9fc2VlayhwYiwgc3RhcnQgLSA0LCBTRUVLX1NFVCk7CisgICAgYXZpb193bDMyKHBiLCAodWludDMyX3QpKHBvcyAtIHN0YXJ0KSk7CisgICAgYXZpb19zZWVrKHBiLCBGRkFMSUdOKHBvcywgMiksIFNFRUtfU0VUKTsKK30KKworLyogV0FWRUZPUk1BVEVYIGhlYWRlciAqLworLyogcmV0dXJucyB0aGUgc2l6ZSBvciAtMSBvbiBlcnJvciAqLworaW50IGZmX3B1dF93YXZfaGVhZGVyKEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY0NvbnRleHQgKmVuYywgaW50IGZsYWdzKQoreworICAgIGludCBicHMsIGJsa2FsaWduLCBieXRlc3BlcnNlYywgZnJhbWVfc2l6ZTsKKyAgICBpbnQgaGRyc2l6ZTsKKyAgICBpbnQ2NF90IGhkcnN0YXJ0ID0gYXZpb190ZWxsKHBiKTsKKyAgICBpbnQgd2F2ZWZvcm1hdGV4dGVuc2libGU7CisgICAgdWludDhfdCB0ZW1wWzI1Nl07CisgICAgdWludDhfdCAqcmlmZl9leHRyYWRhdGEgICAgICAgPSB0ZW1wOworICAgIHVpbnQ4X3QgKnJpZmZfZXh0cmFkYXRhX3N0YXJ0ID0gdGVtcDsKKworICAgIGlmICghZW5jLT5jb2RlY190YWcgfHwgZW5jLT5jb2RlY190YWcgPiAweGZmZmYpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIFdlIHVzZSB0aGUga25vd24gY29uc3RhbnQgZnJhbWUgc2l6ZSBmb3IgdGhlIGNvZGVjIGlmIGtub3duLCBvdGhlcndpc2UKKyAgICAgKiBmYWxsIGJhY2sgb24gdXNpbmcgQVZDb2RlY0NvbnRleHQuZnJhbWVfc2l6ZSwgd2hpY2ggaXMgbm90IGFzIHJlbGlhYmxlCisgICAgICogZm9yIGluZGljYXRpbmcgcGFja2V0IGR1cmF0aW9uLiAqLworICAgIGZyYW1lX3NpemUgPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oZW5jLCBlbmMtPmJsb2NrX2FsaWduKTsKKworICAgIHdhdmVmb3JtYXRleHRlbnNpYmxlID0gKGVuYy0+Y2hhbm5lbHMgPiAyICYmIGVuYy0+Y2hhbm5lbF9sYXlvdXQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPnNhbXBsZV9yYXRlID4gNDgwMDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRUFDMyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShlbmMtPmNvZGVjX2lkKSA+IDE2OworCisgICAgaWYgKHdhdmVmb3JtYXRleHRlbnNpYmxlKQorICAgICAgICBhdmlvX3dsMTYocGIsIDB4ZmZmZSk7CisgICAgZWxzZQorICAgICAgICBhdmlvX3dsMTYocGIsIGVuYy0+Y29kZWNfdGFnKTsKKworICAgIGF2aW9fd2wxNihwYiwgZW5jLT5jaGFubmVscyk7CisgICAgYXZpb193bDMyKHBiLCBlbmMtPnNhbXBsZV9yYXRlKTsKKyAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BVFJBQzMgfHwKKyAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9HNzIzXzEgfHwKKyAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDIgICAgfHwKKyAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMgICAgfHwKKyAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9HU01fTVMpIHsKKyAgICAgICAgYnBzID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIShicHMgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGVuYy0+Y29kZWNfaWQpKSkgeworICAgICAgICAgICAgaWYgKGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKQorICAgICAgICAgICAgICAgIGJwcyA9IGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJwcyA9IDE2OyAgLy8gZGVmYXVsdCB0byAxNgorICAgICAgICB9CisgICAgfQorICAgIGlmIChicHMgIT0gZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgJiYgZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpIHsKKyAgICAgICAgYXZfbG9nKGVuYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAicmVxdWVzdGVkIGJpdHNfcGVyX2NvZGVkX3NhbXBsZSAoJWQpICIKKyAgICAgICAgICAgICAgICJhbmQgYWN0dWFsbHkgc3RvcmVkICglZCkgZGlmZmVyXG4iLAorICAgICAgICAgICAgICAgZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsIGJwcyk7CisgICAgfQorCisgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAyKSB7CisgICAgICAgIGJsa2FsaWduID0gZnJhbWVfc2l6ZTsKKyAgICB9IGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzKSB7CisgICAgICAgIGJsa2FsaWduID0gNTc2ICogKGVuYy0+c2FtcGxlX3JhdGUgPD0gKDI0MDAwICsgMzIwMDApLzIgPyAxIDogMik7CisgICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FDMykgeworICAgICAgICBibGthbGlnbiA9IDM4NDA7ICAgICAgICAgICAgICAgIC8qIG1heGltdW0gYnl0ZXMgcGVyIGZyYW1lICovCisgICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgeworICAgICAgICBibGthbGlnbiA9IDc2OCAqIGVuYy0+Y2hhbm5lbHM7IC8qIG1heGltdW0gYnl0ZXMgcGVyIGZyYW1lICovCisgICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0c3MjNfMSkgeworICAgICAgICBibGthbGlnbiA9IDI0OworICAgIH0gZWxzZSBpZiAoZW5jLT5ibG9ja19hbGlnbiAhPSAwKSB7IC8qIHNwZWNpZmllZCBieSB0aGUgY29kZWMgKi8KKyAgICAgICAgYmxrYWxpZ24gPSBlbmMtPmJsb2NrX2FsaWduOworICAgIH0gZWxzZQorICAgICAgICBibGthbGlnbiA9IGJwcyAqIGVuYy0+Y2hhbm5lbHMgLyBhdl9nY2QoOCwgYnBzKTsKKyAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fVTggfHwKKyAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzI0TEUgfHwKKyAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzMyTEUgfHwKKyAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fRjMyTEUgfHwKKyAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fRjY0TEUgfHwKKyAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpIHsKKyAgICAgICAgYnl0ZXNwZXJzZWMgPSBlbmMtPnNhbXBsZV9yYXRlICogYmxrYWxpZ247CisgICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0c3MjNfMSkgeworICAgICAgICBieXRlc3BlcnNlYyA9IDgwMDsKKyAgICB9IGVsc2UgeworICAgICAgICBieXRlc3BlcnNlYyA9IGVuYy0+Yml0X3JhdGUgLyA4OworICAgIH0KKyAgICBhdmlvX3dsMzIocGIsIGJ5dGVzcGVyc2VjKTsgLyogYnl0ZXMgcGVyIHNlY29uZCAqLworICAgIGF2aW9fd2wxNihwYiwgYmxrYWxpZ24pOyAgICAvKiBibG9jayBhbGlnbiAqLworICAgIGF2aW9fd2wxNihwYiwgYnBzKTsgICAgICAgICAvKiBiaXRzIHBlciBzYW1wbGUgKi8KKyAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMpIHsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmcmlmZl9leHRyYWRhdGEsIDEpOyAgICAvKiB3SUQgKi8KKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmcmlmZl9leHRyYWRhdGEsIDIpOyAgICAvKiBmZHdGbGFncyAqLworICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZyaWZmX2V4dHJhZGF0YSwgMTE1Mik7IC8qIG5CbG9ja1NpemUgKi8KKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmcmlmZl9leHRyYWRhdGEsIDEpOyAgICAvKiBuRnJhbWVzUGVyQmxvY2sgKi8KKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmcmlmZl9leHRyYWRhdGEsIDEzOTMpOyAvKiBuQ29kZWNEZWxheSAqLworICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDIpIHsKKyAgICAgICAgLyogZndIZWFkTGF5ZXIgKi8KKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmcmlmZl9leHRyYWRhdGEsIDIpOworICAgICAgICAvKiBkd0hlYWRCaXRyYXRlICovCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJnJpZmZfZXh0cmFkYXRhLCBlbmMtPmJpdF9yYXRlKTsKKyAgICAgICAgLyogZndIZWFkTW9kZSAqLworICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZyaWZmX2V4dHJhZGF0YSwgZW5jLT5jaGFubmVscyA9PSAyID8gMSA6IDgpOworICAgICAgICAvKiBmd0hlYWRNb2RlRXh0ICovCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJnJpZmZfZXh0cmFkYXRhLCAwKTsKKyAgICAgICAgLyogd0hlYWRFbXBoYXNpcyAqLworICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZyaWZmX2V4dHJhZGF0YSwgMSk7CisgICAgICAgIC8qIGZ3SGVhZEZsYWdzICovCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJnJpZmZfZXh0cmFkYXRhLCAxNik7CisgICAgICAgIC8qIGR3UFRTTG93ICovCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJnJpZmZfZXh0cmFkYXRhLCAwKTsKKyAgICAgICAgLyogZHdQVFNIaWdoICovCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJnJpZmZfZXh0cmFkYXRhLCAwKTsKKyAgICB9IGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRzcyM18xKSB7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJnJpZmZfZXh0cmFkYXRhLCAweDlhY2UwMDAyKTsgLyogZXh0cmFkYXRhIG5lZWRlZCBmb3IgbXNhY20gZzcyMy4xIGNvZGVjICovCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJnJpZmZfZXh0cmFkYXRhLCAweGFlYTJmNzMyKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmcmlmZl9leHRyYWRhdGEsIDB4YWNkZSk7CisgICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0dTTV9NUyB8fAorICAgICAgICAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWKSB7CisgICAgICAgIC8qIHdTYW1wbGVzUGVyQmxvY2sgKi8KKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmcmlmZl9leHRyYWRhdGEsIGZyYW1lX3NpemUpOworICAgIH0gZWxzZSBpZiAoZW5jLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICByaWZmX2V4dHJhZGF0YV9zdGFydCA9IGVuYy0+ZXh0cmFkYXRhOworICAgICAgICByaWZmX2V4dHJhZGF0YSAgICAgICA9IGVuYy0+ZXh0cmFkYXRhICsgZW5jLT5leHRyYWRhdGFfc2l6ZTsKKyAgICB9CisgICAgLyogd3JpdGUgV0FWRUZPUk1BVEVYVEVOU0lCTEUgZXh0ZW5zaW9ucyAqLworICAgIGlmICh3YXZlZm9ybWF0ZXh0ZW5zaWJsZSkgeworICAgICAgICBpbnQgd3JpdGVfY2hhbm5lbF9tYXNrID0gZW5jLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPCBGRl9DT01QTElBTkNFX05PUk1BTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5jaGFubmVsX2xheW91dCA8IDB4NDAwMDA7CisgICAgICAgIC8qIDIyIGlzIFdBVkVGT1JNQVRFWFRFTlNJQkxFIHNpemUgKi8KKyAgICAgICAgYXZpb193bDE2KHBiLCByaWZmX2V4dHJhZGF0YSAtIHJpZmZfZXh0cmFkYXRhX3N0YXJ0ICsgMjIpOworICAgICAgICAvKiBWYWxpZEJpdHNQZXJTYW1wbGUgfHwgU2FtcGxlc1BlckJsb2NrIHx8IFJlc2VydmVkICovCisgICAgICAgIGF2aW9fd2wxNihwYiwgYnBzKTsKKyAgICAgICAgLyogZHdDaGFubmVsTWFzayAqLworICAgICAgICBhdmlvX3dsMzIocGIsIHdyaXRlX2NoYW5uZWxfbWFzayA/IGVuYy0+Y2hhbm5lbF9sYXlvdXQgOiAwKTsKKyAgICAgICAgLyogR1VJRCArIG5leHQgMyAqLworICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9FQUMzKSB7CisgICAgICAgICAgICBmZl9wdXRfZ3VpZChwYiwgZ2V0X2NvZGVjX2d1aWQoZW5jLT5jb2RlY19pZCwgZmZfY29kZWNfd2F2X2d1aWRzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIGF2aW9fd2wzMihwYiwgZW5jLT5jb2RlY190YWcpOworICAgICAgICBhdmlvX3dsMzIocGIsIDB4MDAxMDAwMDApOworICAgICAgICBhdmlvX3dsMzIocGIsIDB4QUEwMDAwODApOworICAgICAgICBhdmlvX3dsMzIocGIsIDB4NzE5QjM4MDApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBGRl9QVVRfV0FWX0hFQURFUl9GT1JDRV9XQVZFRk9STUFURVgpIHx8CisgICAgICAgICAgICAgICBlbmMtPmNvZGVjX3RhZyAhPSAweDAwMDEgLyogUENNICovIHx8CisgICAgICAgICAgICAgICByaWZmX2V4dHJhZGF0YSAtIHJpZmZfZXh0cmFkYXRhX3N0YXJ0KSB7CisgICAgICAgIC8qIFdBVkVGT1JNQVRFWCAqLworICAgICAgICBhdmlvX3dsMTYocGIsIHJpZmZfZXh0cmFkYXRhIC0gcmlmZl9leHRyYWRhdGFfc3RhcnQpOyAvKiBjYlNpemUgKi8KKyAgICB9IC8qIGVsc2UgUENNV0FWRUZPUk1BVCAqLworICAgIGF2aW9fd3JpdGUocGIsIHJpZmZfZXh0cmFkYXRhX3N0YXJ0LCByaWZmX2V4dHJhZGF0YSAtIHJpZmZfZXh0cmFkYXRhX3N0YXJ0KTsKKyAgICBoZHJzaXplID0gYXZpb190ZWxsKHBiKSAtIGhkcnN0YXJ0OworICAgIGlmIChoZHJzaXplICYgMSkgeworICAgICAgICBoZHJzaXplKys7CisgICAgICAgIGF2aW9fdzgocGIsIDApOworICAgIH0KKworICAgIHJldHVybiBoZHJzaXplOworfQorCisvKiBCSVRNQVBJTkZPSEVBREVSIGhlYWRlciAqLwordm9pZCBmZl9wdXRfYm1wX2hlYWRlcihBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNDb250ZXh0ICplbmMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWQ29kZWNUYWcgKnRhZ3MsIGludCBmb3JfYXNmLCBpbnQgaWdub3JlX2V4dHJhZGF0YSkKK3sKKyAgICBpbnQga2VlcF9oZWlnaHQgPSBlbmMtPmV4dHJhZGF0YV9zaXplID49IDkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAhbWVtY21wKGVuYy0+ZXh0cmFkYXRhICsgZW5jLT5leHRyYWRhdGFfc2l6ZSAtIDksICJCb3R0b21VcCIsIDkpOworICAgIGludCBleHRyYWRhdGFfc2l6ZSA9IGVuYy0+ZXh0cmFkYXRhX3NpemUgLSA5KmtlZXBfaGVpZ2h0OworCisgICAgLyogc2l6ZSAqLworICAgIGF2aW9fd2wzMihwYiwgNDAgKyAoaWdub3JlX2V4dHJhZGF0YSA/IDAgOmV4dHJhZGF0YV9zaXplKSk7CisgICAgYXZpb193bDMyKHBiLCBlbmMtPndpZHRoKTsKKyAgICAvL1dlIGFsd2F5cyBzdG9yZSBSR0IgVG9wRG93bgorICAgIGF2aW9fd2wzMihwYiwgZW5jLT5jb2RlY190YWcgfHwga2VlcF9oZWlnaHQgPyBlbmMtPmhlaWdodCA6IC1lbmMtPmhlaWdodCk7CisgICAgLyogcGxhbmVzICovCisgICAgYXZpb193bDE2KHBiLCAxKTsKKyAgICAvKiBkZXB0aCAqLworICAgIGF2aW9fd2wxNihwYiwgZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPyBlbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA6IDI0KTsKKyAgICAvKiBjb21wcmVzc2lvbiB0eXBlICovCisgICAgYXZpb193bDMyKHBiLCBlbmMtPmNvZGVjX3RhZyk7CisgICAgYXZpb193bDMyKHBiLCAoZW5jLT53aWR0aCAqIGVuYy0+aGVpZ2h0ICogKGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID8gZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgOiAyNCkrNykgLyA4KTsKKyAgICBhdmlvX3dsMzIocGIsIDApOworICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgYXZpb193bDMyKHBiLCAwKTsKKyAgICBhdmlvX3dsMzIocGIsIDApOworCisgICAgaWYgKCFpZ25vcmVfZXh0cmFkYXRhKSB7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIGVuYy0+ZXh0cmFkYXRhLCBleHRyYWRhdGFfc2l6ZSk7CisKKyAgICAgICAgaWYgKCFmb3JfYXNmICYmIGV4dHJhZGF0YV9zaXplICYgMSkKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIDApOworICAgIH0KK30KKwordm9pZCBmZl9wYXJzZV9zcGVjaWZpY19wYXJhbXMoQVZTdHJlYW0gKnN0LCBpbnQgKmF1X3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmF1X3NzaXplLCBpbnQgKmF1X3NjYWxlKQoreworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHN0LT5jb2RlYzsKKyAgICBpbnQgZ2NkOworICAgIGludCBhdWRpb19mcmFtZV9zaXplOworCisgICAgLyogV2UgdXNlIHRoZSBrbm93biBjb25zdGFudCBmcmFtZSBzaXplIGZvciB0aGUgY29kZWMgaWYga25vd24sIG90aGVyd2lzZQorICAgICAqIGZhbGwgYmFjayBvbiB1c2luZyBBVkNvZGVjQ29udGV4dC5mcmFtZV9zaXplLCB3aGljaCBpcyBub3QgYXMgcmVsaWFibGUKKyAgICAgKiBmb3IgaW5kaWNhdGluZyBwYWNrZXQgZHVyYXRpb24uICovCisgICAgYXVkaW9fZnJhbWVfc2l6ZSA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihjb2RlYywgMCk7CisgICAgaWYgKCFhdWRpb19mcmFtZV9zaXplKQorICAgICAgICBhdWRpb19mcmFtZV9zaXplID0gY29kZWMtPmZyYW1lX3NpemU7CisKKyAgICAqYXVfc3NpemUgPSBjb2RlYy0+YmxvY2tfYWxpZ247CisgICAgaWYgKGF1ZGlvX2ZyYW1lX3NpemUgJiYgY29kZWMtPnNhbXBsZV9yYXRlKSB7CisgICAgICAgICphdV9zY2FsZSA9IGF1ZGlvX2ZyYW1lX3NpemU7CisgICAgICAgICphdV9yYXRlICA9IGNvZGVjLT5zYW1wbGVfcmF0ZTsKKyAgICB9IGVsc2UgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fAorICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0RBVEEgfHwKKyAgICAgICAgICAgICAgIGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICAqYXVfc2NhbGUgPSBzdC0+dGltZV9iYXNlLm51bTsKKyAgICAgICAgKmF1X3JhdGUgID0gc3QtPnRpbWVfYmFzZS5kZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmF1X3NjYWxlID0gY29kZWMtPmJsb2NrX2FsaWduID8gY29kZWMtPmJsb2NrX2FsaWduICogOCA6IDg7CisgICAgICAgICphdV9yYXRlICA9IGNvZGVjLT5iaXRfcmF0ZSA/IGNvZGVjLT5iaXRfcmF0ZSA6CisgICAgICAgICAgICAgICAgICAgIDggKiBjb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgfQorICAgIGdjZCAgICAgICAgPSBhdl9nY2QoKmF1X3NjYWxlLCAqYXVfcmF0ZSk7CisgICAgKmF1X3NjYWxlIC89IGdjZDsKKyAgICAqYXVfcmF0ZSAgLz0gZ2NkOworfQorCit2b2lkIGZmX3JpZmZfd3JpdGVfaW5mb190YWcoQVZJT0NvbnRleHQgKnBiLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBpbnQgbGVuID0gc3RybGVuKHN0cik7CisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgbGVuKys7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgdGFnKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCBsZW4pOworICAgICAgICBhdmlvX3B1dF9zdHIocGIsIHN0cik7CisgICAgICAgIGlmIChsZW4gJiAxKQorICAgICAgICAgICAgYXZpb193OChwYiwgMCk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciByaWZmX3RhZ3NbXVs1XSA9IHsKKyAgICAiSUFSTCIsICJJQVJUIiwgIklDTVMiLCAiSUNNVCIsICJJQ09QIiwgIklDUkQiLCAiSUNSUCIsICJJRElNIiwgIklEUEkiLAorICAgICJJRU5HIiwgIklHTlIiLCAiSUtFWSIsICJJTEdUIiwgIklMTkciLCAiSU1FRCIsICJJTkFNIiwgIklQTFQiLCAiSVBSRCIsCisgICAgIklQUlQiLCAiSVRSSyIsICJJU0JKIiwgIklTRlQiLCAiSVNIUCIsICJJU01QIiwgIklTUkMiLCAiSVNSRiIsICJJVENIIiwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIGludCByaWZmX2hhc192YWxpZF90YWdzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7ICpyaWZmX3RhZ3NbaV07IGkrKykKKyAgICAgICAgaWYgKGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCByaWZmX3RhZ3NbaV0sIE5VTEwsIEFWX0RJQ1RfTUFUQ0hfQ0FTRSkpCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX3JpZmZfd3JpdGVfaW5mbyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGk7CisgICAgaW50NjRfdCBsaXN0X3BvczsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IE5VTEw7CisKKyAgICBmZl9tZXRhZGF0YV9jb252KCZzLT5tZXRhZGF0YSwgZmZfcmlmZl9pbmZvX2NvbnYsIE5VTEwpOworCisgICAgLyogd3JpdGluZyBlbXB0eSBMSVNUIGlzIG5vdCBuaWNlIGFuZCBtYXkgY2F1c2UgcHJvYmxlbXMgKi8KKyAgICBpZiAoIXJpZmZfaGFzX3ZhbGlkX3RhZ3MocykpCisgICAgICAgIHJldHVybjsKKworICAgIGxpc3RfcG9zID0gZmZfc3RhcnRfdGFnKHBiLCAiTElTVCIpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIklORk8iKTsKKyAgICBmb3IgKGkgPSAwOyAqcmlmZl90YWdzW2ldOyBpKyspCisgICAgICAgIGlmICgodCA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCByaWZmX3RhZ3NbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIEFWX0RJQ1RfTUFUQ0hfQ0FTRSkpKQorICAgICAgICAgICAgZmZfcmlmZl93cml0ZV9pbmZvX3RhZyhzLT5wYiwgdC0+a2V5LCB0LT52YWx1ZSk7CisgICAgZmZfZW5kX3RhZyhwYiwgbGlzdF9wb3MpOworfQorCit2b2lkIGZmX3B1dF9ndWlkKEFWSU9Db250ZXh0ICpzLCBjb25zdCBmZl9hc2ZfZ3VpZCAqZykKK3sKKyAgICBhdl9hc3NlcnQwKHNpemVvZigqZykgPT0gMTYpOworICAgIGF2aW9fd3JpdGUocywgKmcsIHNpemVvZigqZykpOworfQorCitjb25zdCBmZl9hc2ZfZ3VpZCAqZ2V0X2NvZGVjX2d1aWQoZW51bSBBVkNvZGVjSUQgaWQsIGNvbnN0IEFWQ29kZWNHdWlkICphdl9ndWlkKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGF2X2d1aWRbaV0uaWQgIT0gQVZfQ09ERUNfSURfTk9ORTsgaSsrKSB7CisgICAgICAgIGlmIChpZCA9PSBhdl9ndWlkW2ldLmlkKQorICAgICAgICAgICAgcmV0dXJuICYoYXZfZ3VpZFtpXS5ndWlkKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcmwyLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcmwyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1NDMzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ybDIuYwpAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIFJMMiBGb3JtYXQgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNhc2NoYSBTb21tZXIgKHNhc2NoYXNvbW1lckBmcmVlbmV0LmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIFJMMiBmaWxlIGRlbXV4ZXIKKyAqIEBmaWxlCisgKiBAYXV0aG9yIFNhc2NoYSBTb21tZXIgKHNhc2NoYXNvbW1lckBmcmVlbmV0LmRlKQorICogQHNlZSBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1STDIKKyAqCisgKiBleHRyYWRhdGE6CisgKiAyIGJ5dGUgbGUgaW5pdGlhbCBkcmF3aW5nIG9mZnNldCB3aXRoaW4gMzIweDIwMCB2aWV3cG9ydAorICogNCBieXRlIGxlIG51bWJlciBvZiB1c2VkIGNvbG9ycworICogMjU2ICogMyBieXRlcyByZ2IgcGFsZXR0ZQorICogb3B0aW9uYWwgYmFja2dyb3VuZF9mcmFtZQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgRVhUUkFEQVRBMV9TSVpFICg2ICsgMjU2ICogMykgLy8vPCB2aWRlbyBiYXNlLCBjbHIsIHBhbGV0dGUKKworI2RlZmluZSBGT1JNX1RBRyBNS0JFVEFHKCdGJywgJ08nLCAnUicsICdNJykKKyNkZWZpbmUgUkxWMl9UQUcgTUtCRVRBRygnUicsICdMJywgJ1YnLCAnMicpCisjZGVmaW5lIFJMVjNfVEFHIE1LQkVUQUcoJ1InLCAnTCcsICdWJywgJzMnKQorCit0eXBlZGVmIHN0cnVjdCBSbDJEZW11eENvbnRleHQgeworICAgIHVuc2lnbmVkIGludCBpbmRleF9wb3NbMl07ICAgLy8vPCBpbmRleGVzIGluIHRoZSBzYW1wbGUgdGFibGVzCit9IFJsMkRlbXV4Q29udGV4dDsKKworCisvKioKKyAqIGNoZWNrIGlmIHRoZSBmaWxlIGlzIGluIHJsMiBmb3JtYXQKKyAqIEBwYXJhbSBwIHByb2JlIGJ1ZmZlcgorICogQHJldHVybiAwIHdoZW4gdGhlIHByb2JlIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIHJsMiBkYXRhLCA+IDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgcmwyX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworCisgICAgaWYoQVZfUkIzMigmcC0+YnVmWzBdKSAhPSBGT1JNX1RBRykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZihBVl9SQjMyKCZwLT5idWZbOF0pICE9IFJMVjJfVEFHICYmCisgICAgICAgIEFWX1JCMzIoJnAtPmJ1Zls4XSkgIT0gUkxWM19UQUcpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCisvKioKKyAqIHJlYWQgcmwyIGhlYWRlciBkYXRhIGFuZCBzZXR1cCB0aGUgYXZzdHJlYW1zCisgKiBAcGFyYW0gcyBkZW11eGVyIGNvbnRleHQKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBBVkVSUk9SIG90aGVyd2lzZQorICovCitzdGF0aWMgYXZfY29sZCBpbnQgcmwyX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgdW5zaWduZWQgaW50IGZyYW1lX2NvdW50OworICAgIHVuc2lnbmVkIGludCBhdWRpb19mcmFtZV9jb3VudGVyID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdmlkZW9fZnJhbWVfY291bnRlciA9IDA7CisgICAgdW5zaWduZWQgaW50IGJhY2tfc2l6ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzb3VuZF9yYXRlOworICAgIHVuc2lnbmVkIHNob3J0IHJhdGU7CisgICAgdW5zaWduZWQgc2hvcnQgY2hhbm5lbHM7CisgICAgdW5zaWduZWQgc2hvcnQgZGVmX3NvdW5kX3NpemU7CisgICAgdW5zaWduZWQgaW50IHNpZ25hdHVyZTsKKyAgICB1bnNpZ25lZCBpbnQgcHRzX2RlbiA9IDExMDI1OyAvKiB2aWRlbyBvbmx5IGNhc2UgKi8KKyAgICB1bnNpZ25lZCBpbnQgcHRzX251bSA9IDExMDM7CisgICAgdW5zaWduZWQgaW50KiBjaHVua19vZmZzZXQgPSBOVUxMOworICAgIGludCogY2h1bmtfc2l6ZSA9IE5VTEw7CisgICAgaW50KiBhdWRpb19zaXplID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGF2aW9fc2tpcChwYiw0KTsgICAgICAgICAgLyogc2tpcCBGT1JNIHRhZyAqLworICAgIGJhY2tfc2l6ZSA9IGF2aW9fcmwzMihwYik7IC8qKjwgZ2V0IHNpemUgb2YgdGhlIGJhY2tncm91bmQgZnJhbWUgKi8KKyAgICBzaWduYXR1cmUgPSBhdmlvX3JiMzIocGIpOworICAgIGF2aW9fc2tpcChwYiwgNCk7ICAgICAgICAgLyogZGF0YSBzaXplICovCisgICAgZnJhbWVfY291bnQgPSBhdmlvX3JsMzIocGIpOworCisgICAgLyogZGlzYWxsb3cgYmFja19zaXplcyBhbmQgZnJhbWVfY291bnRzIHRoYXQgbWF5IGxlYWQgdG8gb3ZlcmZsb3dzIGxhdGVyICovCisgICAgaWYoYmFja19zaXplID4gSU5UX01BWC8yICB8fCBmcmFtZV9jb3VudCA+IElOVF9NQVggLyBzaXplb2YodWludDMyX3QpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2aW9fc2tpcChwYiwgMik7ICAgICAgICAgLyogZW5jb2RpbmcgbWVudG9kICovCisgICAgc291bmRfcmF0ZSA9IGF2aW9fcmwxNihwYik7CisgICAgcmF0ZSA9IGF2aW9fcmwxNihwYik7CisgICAgY2hhbm5lbHMgPSBhdmlvX3JsMTYocGIpOworICAgIGRlZl9zb3VuZF9zaXplID0gYXZpb19ybDE2KHBiKTsKKworICAgIC8qKiBzZXR1cCB2aWRlbyBzdHJlYW0gKi8KKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYoIXN0KQorICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkwyOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIGZvdXJjYyAqLworICAgIHN0LT5jb2RlYy0+d2lkdGggPSAzMjA7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSAyMDA7CisKKyAgICAvKiogYWxsb2NhdGUgYW5kIGZpbGwgZXh0cmFkYXRhICovCisgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IEVYVFJBREFUQTFfU0laRTsKKworICAgIGlmKHNpZ25hdHVyZSA9PSBSTFYzX1RBRyAmJiBiYWNrX3NpemUgPiAwKQorICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICs9IGJhY2tfc2l6ZTsKKworICAgIGlmKGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyoqIHNldHVwIGF1ZGlvIHN0cmVhbSBpZiBwcmVzZW50ICovCisgICAgaWYoc291bmRfcmF0ZSl7CisgICAgICAgIGlmICghY2hhbm5lbHMgfHwgY2hhbm5lbHMgPiA0MikgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAlZFxuIiwgY2hhbm5lbHMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBwdHNfbnVtID0gZGVmX3NvdW5kX3NpemU7CisgICAgICAgIHB0c19kZW4gPSByYXRlOworCisgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAxOworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKKyAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHJhdGU7CisgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqCisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKgorICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgLyA4OworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LDMyLDEscmF0ZSk7CisgICAgfQorCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzLT5zdHJlYW1zWzBdLCAzMiwgcHRzX251bSwgcHRzX2Rlbik7CisKKyAgICBjaHVua19zaXplID0gICBhdl9tYWxsb2MoZnJhbWVfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICBhdWRpb19zaXplID0gICBhdl9tYWxsb2MoZnJhbWVfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICBjaHVua19vZmZzZXQgPSBhdl9tYWxsb2MoZnJhbWVfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKworICAgIGlmKCFjaHVua19zaXplIHx8ICFhdWRpb19zaXplIHx8ICFjaHVua19vZmZzZXQpeworICAgICAgICBhdl9mcmVlKGNodW5rX3NpemUpOworICAgICAgICBhdl9mcmVlKGF1ZGlvX3NpemUpOworICAgICAgICBhdl9mcmVlKGNodW5rX29mZnNldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLyoqIHJlYWQgb2Zmc2V0IGFuZCBzaXplIHRhYmxlcyAqLworICAgIGZvcihpPTA7IGkgPCBmcmFtZV9jb3VudDtpKyspCisgICAgICAgIGNodW5rX3NpemVbaV0gPSBhdmlvX3JsMzIocGIpOworICAgIGZvcihpPTA7IGkgPCBmcmFtZV9jb3VudDtpKyspCisgICAgICAgIGNodW5rX29mZnNldFtpXSA9IGF2aW9fcmwzMihwYik7CisgICAgZm9yKGk9MDsgaSA8IGZyYW1lX2NvdW50O2krKykKKyAgICAgICAgYXVkaW9fc2l6ZVtpXSA9IGF2aW9fcmwzMihwYikgJiAweEZGRkY7CisKKyAgICAvKiogYnVpbGQgdGhlIHNhbXBsZSBpbmRleCAqLworICAgIGZvcihpPTA7aTxmcmFtZV9jb3VudDtpKyspeworICAgICAgICBpZihjaHVua19zaXplW2ldIDwgMCB8fCBhdWRpb19zaXplW2ldID4gY2h1bmtfc2l6ZVtpXSl7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZihzb3VuZF9yYXRlICYmIGF1ZGlvX3NpemVbaV0peworICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHMtPnN0cmVhbXNbMV0sIGNodW5rX29mZnNldFtpXSwKKyAgICAgICAgICAgICAgICBhdWRpb19mcmFtZV9jb3VudGVyLGF1ZGlvX3NpemVbaV0sIDAsIEFWSU5ERVhfS0VZRlJBTUUpOworICAgICAgICAgICAgYXVkaW9fZnJhbWVfY291bnRlciArPSBhdWRpb19zaXplW2ldIC8gY2hhbm5lbHM7CisgICAgICAgIH0KKyAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHMtPnN0cmVhbXNbMF0sIGNodW5rX29mZnNldFtpXSArIGF1ZGlvX3NpemVbaV0sCisgICAgICAgICAgICB2aWRlb19mcmFtZV9jb3VudGVyLGNodW5rX3NpemVbaV0tYXVkaW9fc2l6ZVtpXSwwLEFWSU5ERVhfS0VZRlJBTUUpOworICAgICAgICArK3ZpZGVvX2ZyYW1lX2NvdW50ZXI7CisgICAgfQorCisKKyAgICBhdl9mcmVlKGNodW5rX3NpemUpOworICAgIGF2X2ZyZWUoYXVkaW9fc2l6ZSk7CisgICAgYXZfZnJlZShjaHVua19vZmZzZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiByZWFkIGEgc2luZ2xlIGF1ZGlvIG9yIHZpZGVvIHBhY2tldAorICogQHBhcmFtIHMgZGVtdXhlciBjb250ZXh0CisgKiBAcGFyYW0gcGt0IHRoZSBwYWNrZXQgdG8gYmUgZmlsbGVkCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgQVZFUlJPUiBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBybDJfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgUmwyRGVtdXhDb250ZXh0ICpybDIgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZJbmRleEVudHJ5ICpzYW1wbGUgPSBOVUxMOworICAgIGludCBpOworICAgIGludCByZXQgPSAwOworICAgIGludCBzdHJlYW1faWQgPSAtMTsKKyAgICBpbnQ2NF90IHBvcyA9IElOVDY0X01BWDsKKworICAgIC8qKiBjaGVjayBpZiB0aGVyZSBpcyBhIHZhbGlkIHZpZGVvIG9yIGF1ZGlvIGVudHJ5IHRoYXQgY2FuIGJlIHVzZWQgKi8KKyAgICBmb3IoaT0wOyBpPHMtPm5iX3N0cmVhbXM7IGkrKyl7CisgICAgICAgIGlmKHJsMi0+aW5kZXhfcG9zW2ldIDwgcy0+c3RyZWFtc1tpXS0+bmJfaW5kZXhfZW50cmllcworICAgICAgICAgICAgICAmJiBzLT5zdHJlYW1zW2ldLT5pbmRleF9lbnRyaWVzWyBybDItPmluZGV4X3Bvc1tpXSBdLnBvcyA8IHBvcyl7CisgICAgICAgICAgICBzYW1wbGUgPSAmcy0+c3RyZWFtc1tpXS0+aW5kZXhfZW50cmllc1sgcmwyLT5pbmRleF9wb3NbaV0gXTsKKyAgICAgICAgICAgIHBvcz0gc2FtcGxlLT5wb3M7CisgICAgICAgICAgICBzdHJlYW1faWQ9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihzdHJlYW1faWQgPT0gLTEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgICsrcmwyLT5pbmRleF9wb3Nbc3RyZWFtX2lkXTsKKworICAgIC8qKiBwb3NpdGlvbiB0aGUgc3RyZWFtICh3aWxsIHByb2JhYmx5IGJlIHRoZXJlIGFueXdheSkgKi8KKyAgICBhdmlvX3NlZWsocGIsIHNhbXBsZS0+cG9zLCBTRUVLX1NFVCk7CisKKyAgICAvKiogZmlsbCB0aGUgcGFja2V0ICovCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBzYW1wbGUtPnNpemUpOworICAgIGlmKHJldCAhPSBzYW1wbGUtPnNpemUpeworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3RyZWFtX2lkOworICAgIHBrdC0+cHRzID0gc2FtcGxlLT50aW1lc3RhbXA7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIHNlZWsgdG8gYSBuZXcgdGltZXN0YW1wCisgKiBAcGFyYW0gcyBkZW11eGVyIGNvbnRleHQKKyAqIEBwYXJhbSBzdHJlYW1faW5kZXggaW5kZXggb2YgdGhlIHN0cmVhbSB0aGF0IHNob3VsZCBiZSBzZWVrZWQKKyAqIEBwYXJhbSB0aW1lc3RhbXAgd2FudGVkIHRpbWVzdGFtcAorICogQHBhcmFtIGZsYWdzIGRpcmVjdGlvbiBhbmQgc2Vla2luZyBtb2RlCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgcmwyX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgIFJsMkRlbXV4Q29udGV4dCAqcmwyID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpOworICAgIGludCBpbmRleCA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QsIHRpbWVzdGFtcCwgZmxhZ3MpOworICAgIGlmKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmwyLT5pbmRleF9wb3Nbc3RyZWFtX2luZGV4XSA9IGluZGV4OworICAgIHRpbWVzdGFtcCA9IHN0LT5pbmRleF9lbnRyaWVzW2luZGV4XS50aW1lc3RhbXA7CisKKyAgICBmb3IoaT0wOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKXsKKyAgICAgICAgQVZTdHJlYW0gKnN0MiA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIGluZGV4ID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdDIsCisgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcSh0aW1lc3RhbXAsIHN0LT50aW1lX2Jhc2UsIHN0Mi0+dGltZV9iYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfCBBVlNFRUtfRkxBR19CQUNLV0FSRCk7CisKKyAgICAgICAgaWYoaW5kZXggPCAwKQorICAgICAgICAgICAgaW5kZXggPSAwOworCisgICAgICAgIHJsMi0+aW5kZXhfcG9zW2ldID0gaW5kZXg7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfcmwyX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInJsMiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJMMiIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihSbDJEZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHJsMl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBybDJfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcmwyX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IHJsMl9yZWFkX3NlZWssCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3JtLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTkxYTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JtLmMKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqICJSZWFsIiBjb21wYXRpYmxlIG11eGVyIGFuZCBkZW11eGVyIGNvbW1vbiBjb2RlLgorICogQ29weXJpZ2h0IChjKSAyMDA5ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJybS5oIgorCitjb25zdCBjaGFyICogY29uc3QgZmZfcm1fbWV0YWRhdGFbNF0gPSB7CisgICAgInRpdGxlIiwKKyAgICAiYXV0aG9yIiwKKyAgICAiY29weXJpZ2h0IiwKKyAgICAiY29tbWVudCIKK307CisKK2NvbnN0IEFWQ29kZWNUYWcgZmZfcm1fY29kZWNfdGFnc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfUlYxMCwgICBNS1RBRygnUicsJ1YnLCcxJywnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SVjIwLCAgIE1LVEFHKCdSJywnVicsJzInLCcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JWMjAsICAgTUtUQUcoJ1InLCdWJywnVCcsJ1InKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUlYzMCwgICBNS1RBRygnUicsJ1YnLCczJywnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SVjQwLCAgIE1LVEFHKCdSJywnVicsJzQnLCcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FDMywgICAgTUtUQUcoJ2QnLCduJywnZScsJ3QnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFfMTQ0LCBNS1RBRygnbCcsJ3AnLCdjJywnSicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQV8yODgsIE1LVEFHKCcyJywnOCcsJ18nLCc4JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0NPT0ssICAgTUtUQUcoJ2MnLCdvJywnbycsJ2snKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQVRSQUMzLCBNS1RBRygnYScsJ3QnLCdyJywnYycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TSVBSLCAgIE1LVEFHKCdzJywnaScsJ3AnLCdyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FBQywgICAgTUtUQUcoJ3InLCdhJywnYScsJ2MnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQUFDLCAgICBNS1RBRygncicsJ2EnLCdjJywncCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQUxGLCAgIE1LVEFHKCdMJywnUycsJ0QnLCc6JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcm0uaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmU4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcm0uaApAQCAtMCwwICsxLDk1IEBACisvKgorICogIlJlYWwiIGNvbXBhdGlibGUgbXV4ZXIgYW5kIGRlbXV4ZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfUk1fSAorI2RlZmluZSBBVkZPUk1BVF9STV9ICisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2V4dGVybiBjb25zdCBjaGFyICogY29uc3QgZmZfcm1fbWV0YWRhdGFbNF07CitleHRlcm4gY29uc3QgQVZDb2RlY1RhZyBmZl9ybV9jb2RlY190YWdzW107CisKK3R5cGVkZWYgc3RydWN0IFJNU3RyZWFtIFJNU3RyZWFtOworCitSTVN0cmVhbSAqZmZfcm1fYWxsb2Nfcm1zdHJlYW0gKHZvaWQpOwordm9pZCAgICAgIGZmX3JtX2ZyZWVfcm1zdHJlYW0gIChSTVN0cmVhbSAqcm1zKTsKKworLyo8IGlucHV0IGZvcm1hdCBmb3IgUmVhbG1lZGlhLXN0eWxlIFJUU1Agc3RyZWFtcyAqLworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgZmZfcmR0X2RlbXV4ZXI7CisKKy8qKgorICogUmVhZCB0aGUgTURQUiBjaHVuaywgd2hpY2ggY29udGFpbnMgc3RyZWFtLXNwZWNpZmljIGNvZGVjIGluaXRpYWxpemF0aW9uCisgKiBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSBzIGNvbnRleHQgY29udGFpbmluZyBSTUNvbnRleHQgYW5kIEFWSU9Db250ZXh0IGZvciBzdHJlYW0gcmVhZGluZworICogQHBhcmFtIHBiIGNvbnRleHQgdG8gcmVhZCB0aGUgZGF0YSBmcm9tCisgKiBAcGFyYW0gc3QgdGhlIHN0cmVhbSB0aGF0IHRoZSBNRFBSIGNodW5rIGJlbG9uZ3MgdG8gYW5kIHdoZXJlIHRvIHN0b3JlIHRoZQorICogICAgICAgICAgIHBhcmFtZXRlcnMgcmVhZCBmcm9tIHRoZSBjaHVuayBpbnRvCisgKiBAcGFyYW0gcnN0IHJlYWwtc3BlY2lmaWMgc3RyZWFtIGluZm9ybWF0aW9uCisgKiBAcGFyYW0gY29kZWNfZGF0YV9zaXplIHNpemUgb2YgdGhlIE1EUFIgY2h1bmsKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBlcnJubyBjb2RlcyBvbiBlcnJvcgorICovCitpbnQgZmZfcm1fcmVhZF9tZHByX2NvZGVjZGF0YSAoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBSTVN0cmVhbSAqcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlY19kYXRhX3NpemUsIGNvbnN0IHVpbnQ4X3QgKm1pbWUpOworCisvKioKKyAqIFBhcnNlIG9uZSBybS1zdHJlYW0gcGFja2V0IGZyb20gdGhlIGlucHV0IGJ5dGVzdHJlYW0uCisgKgorICogQHBhcmFtIHMgY29udGV4dCBjb250YWluaW5nIFJNQ29udGV4dCBhbmQgQVZJT0NvbnRleHQgZm9yIHN0cmVhbSByZWFkaW5nCisgKiBAcGFyYW0gcGIgY29udGV4dCB0byByZWFkIHRoZSBkYXRhIGZyb20KKyAqIEBwYXJhbSBzdCBzdHJlYW0gdG8gd2hpY2ggdGhlIHBhY2tldCB0byBiZSByZWFkIGJlbG9uZ3MKKyAqIEBwYXJhbSByc3QgUmVhbC1zcGVjaWZpYyBzdHJlYW0gaW5mb3JtYXRpb24KKyAqIEBwYXJhbSBsZW4gcGFja2V0IGxlbmd0aCB0byByZWFkIGZyb20gdGhlIGlucHV0CisgKiBAcGFyYW0gcGt0IHBhY2tldCBsb2NhdGlvbiB0byBzdG9yZSB0aGUgcGFyc2VkIHBhY2tldCBkYXRhCisgKiBAcGFyYW0gc2VxIHBvaW50ZXIgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzZXF1ZW5jZSBudW1iZXIsIG1heSBiZQorICogICAgICAgICAgICB1cGRhdGVkCisgKiBAcGFyYW0gZmxhZ3MgdGhlIHBhY2tldCBmbGFncworICogQHBhcmFtIHRzIHRpbWVzdGFtcCBvZiB0aGUgY3VycmVudCBwYWNrZXQKKyAqIEByZXR1cm4gPDAgb24gZXJyb3IsIDAgaWYgYSBwYWNrZXQgd2FzIHBsYWNlZCBpbiB0aGUgcGt0IHBvaW50ZXIuIEEKKyAqICAgICAgICAgdmFsdWUgPjAgbWVhbnMgdGhhdCBubyBkYXRhIHdhcyBwbGFjZWQgaW4gcGt0LCBidXQgdGhhdCBjYWNoZWQKKyAqICAgICAgICAgZGF0YSBpcyBhdmFpbGFibGUgYnkgY2FsbGluZyBmZl9ybV9yZXRyaWV2ZV9jYWNoZSgpLgorICovCitpbnQgZmZfcm1fcGFyc2VfcGFja2V0IChBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgUk1TdHJlYW0gKnJzdCwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QsIGludCAqc2VxLCBpbnQgZmxhZ3MsIGludDY0X3QgdHMpOworCisvKioKKyAqIFJldHJpZXZlIG9uZSBjYWNoZWQgcGFja2V0IGZyb20gdGhlIHJtLWNvbnRleHQuIFRoZSByZWFsIGNvbnRhaW5lciBjYW4KKyAqIHN0b3JlIHNldmVyYWwgcGFja2V0cyAoYXMgaW50ZXJwcmV0ZWQgYnkgdGhlIGNvZGVjKSBpbiBhIHNpbmdsZSBjb250YWluZXIKKyAqIHBhY2tldCwgd2hpY2ggbWVhbnMgdGhlIGRlbXV4ZXIgaG9sZHMgc29tZSBiYWNrIHdoZW4gdGhlIGZpcnN0IGNvbnRhaW5lcgorICogcGFja2V0IGlzIHBhcnNlZCBhbmQgcmV0dXJuZWQuIFRoZSByZXN1bHQgaXMgdGhhdCBybS0+YXVkaW9fcGt0X2NudCBpcworICogYSBwb3NpdGl2ZSBudW1iZXIsIHRoZSBhbW91bnQgb2YgY2FjaGVkIHBhY2tldHMuIFVzaW5nIHRoaXMgZnVuY3Rpb24sIGVhY2gKKyAqIG9mIHRob3NlIHBhY2tldHMgY2FuIGJlIHJldHJpZXZlZCBzZXF1ZW50aWFsbHkuCisgKgorICogQHBhcmFtIHMgY29udGV4dCBjb250YWluaW5nIFJNQ29udGV4dCBhbmQgQVZJT0NvbnRleHQgZm9yIHN0cmVhbSByZWFkaW5nCisgKiBAcGFyYW0gcGIgY29udGV4dCB0byByZWFkIHRoZSBkYXRhIGZyb20KKyAqIEBwYXJhbSBzdCBzdHJlYW0gdGhhdCB0aGlzIHBhY2tldCBiZWxvbmdzIHRvCisgKiBAcGFyYW0gcnN0IFJlYWwtc3BlY2lmaWMgc3RyZWFtIGluZm9ybWF0aW9uCisgKiBAcGFyYW0gcGt0IGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBwYWNrZXQgZGF0YQorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgbGVmdCBmb3Igc3Vic2VxdWVudCBjYWxscyB0byB0aGlzIHNhbWUKKyAqICAgICAgICAgIGZ1bmN0aW9uLCBvciAwIGlmIGFsbCBzYW1wbGVzIGhhdmUgYmVlbiByZXRyaWV2ZWQuCisgKi8KK2ludCBmZl9ybV9yZXRyaWV2ZV9jYWNoZSAoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgUk1TdHJlYW0gKnJzdCwgQVZQYWNrZXQgKnBrdCk7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9STV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcm1kZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ybWRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YmQ3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcm1kZWMuYwpAQCAtMCwwICsxLDEwOTcgQEAKKy8qCisgKiAiUmVhbCIgY29tcGF0aWJsZSBkZW11eGVyLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicm1zaXByLmgiCisjaW5jbHVkZSAicm0uaCIKKworI2RlZmluZSBERUlOVF9JRF9HRU5SIE1LVEFHKCdnJywgJ2UnLCAnbicsICdyJykgLy8vPCBpbnRlcmxlYXZpbmcgZm9yIENvb2tlci9BVFJBQworI2RlZmluZSBERUlOVF9JRF9JTlQwIE1LVEFHKCdJJywgJ24nLCAndCcsICcwJykgLy8vPCBubyBpbnRlcmxlYXZpbmcgbmVlZGVkCisjZGVmaW5lIERFSU5UX0lEX0lOVDQgTUtUQUcoJ0knLCAnbicsICd0JywgJzQnKSAvLy88IGludGVybGVhdmluZyBmb3IgMjguOAorI2RlZmluZSBERUlOVF9JRF9TSVBSIE1LVEFHKCdzJywgJ2knLCAncCcsICdyJykgLy8vPCBpbnRlcmxlYXZpbmcgZm9yIFNpcHJvCisjZGVmaW5lIERFSU5UX0lEX1ZCUkYgTUtUQUcoJ3YnLCAnYicsICdyJywgJ2YnKSAvLy88IFZCUiBjYXNlIGZvciBBQUMKKyNkZWZpbmUgREVJTlRfSURfVkJSUyBNS1RBRygndicsICdiJywgJ3InLCAncycpIC8vLzwgVkJSIGNhc2UgZm9yIEFBQworCitzdHJ1Y3QgUk1TdHJlYW0geworICAgIEFWUGFja2V0IHBrdDsgICAgICAvLy88IHBsYWNlIHRvIHN0b3JlIG1lcmdlZCB2aWRlbyBmcmFtZSAvIHJlb3JkZXJlZCBhdWRpbyBkYXRhCisgICAgaW50IHZpZGVvYnVmc2l6ZTsgIC8vLzwgY3VycmVudCBhc3NlbWJsZWQgZnJhbWUgc2l6ZQorICAgIGludCB2aWRlb2J1ZnBvczsgICAvLy88IHBvc2l0aW9uIGZvciB0aGUgbmV4dCBzbGljZSBpbiB0aGUgdmlkZW8gYnVmZmVyCisgICAgaW50IGN1cnBpY19udW07ICAgIC8vLzwgcGljdHVyZSBudW1iZXIgb2YgY3VycmVudCBmcmFtZQorICAgIGludCBjdXJfc2xpY2UsIHNsaWNlczsKKyAgICBpbnQ2NF90IHBrdHBvczsgICAgLy8vPCBmaXJzdCBzbGljZSBwb3NpdGlvbiBpbiBmaWxlCisgICAgLy8vIEF1ZGlvIGRlc2NyYW1ibGluZyBtYXRyaXggcGFyYW1ldGVycworICAgIGludDY0X3QgYXVkaW90aW1lc3RhbXA7IC8vLzwgQXVkaW8gcGFja2V0IHRpbWVzdGFtcAorICAgIGludCBzdWJfcGFja2V0X2NudDsgLy8gU3VicGFja2V0IGNvdW50ZXIsIHVzZWQgd2hpbGUgcmVhZGluZworICAgIGludCBzdWJfcGFja2V0X3NpemUsIHN1Yl9wYWNrZXRfaCwgY29kZWRfZnJhbWVzaXplOyAvLy88IERlc2NyYW1ibGluZyBwYXJhbWV0ZXJzIGZyb20gY29udGFpbmVyCisgICAgaW50IGF1ZGlvX2ZyYW1lc2l6ZTsgLy8vIEF1ZGlvIGZyYW1lIHNpemUgZnJvbSBjb250YWluZXIKKyAgICBpbnQgc3ViX3BhY2tldF9sZW5ndGhzWzE2XTsgLy8vIExlbmd0aCBvZiBlYWNoIHN1YnBhY2tldAorICAgIGludDMyX3QgZGVpbnRfaWQ7ICAvLy88IGRlaW50ZXJsZWF2ZXIgdXNlZCBpbiBhdWRpbyBzdHJlYW0KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgbmJfcGFja2V0czsKKyAgICBpbnQgb2xkX2Zvcm1hdDsKKyAgICBpbnQgY3VycmVudF9zdHJlYW07CisgICAgaW50IHJlbWFpbmluZ19sZW47CisgICAgaW50IGF1ZGlvX3N0cmVhbV9udW07IC8vLzwgU3RyZWFtIG51bWJlciBmb3IgYXVkaW8gcGFja2V0cworICAgIGludCBhdWRpb19wa3RfY250OyAvLy88IE91dHB1dCBwYWNrZXQgY291bnRlcgorfSBSTURlbXV4Q29udGV4dDsKKworc3RhdGljIGlubGluZSB2b2lkIGdldF9zdHJsKEFWSU9Db250ZXh0ICpwYiwgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgY2hhciAqcSwgcjsKKworICAgIHEgPSBidWY7CisgICAgZm9yKGk9MDtpPGxlbjtpKyspIHsKKyAgICAgICAgciA9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAoaSA8IGJ1Zl9zaXplIC0gMSkKKyAgICAgICAgICAgICpxKysgPSByOworICAgIH0KKyAgICBpZiAoYnVmX3NpemUgPiAwKSAqcSA9ICdcMCc7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zdHI4KEFWSU9Db250ZXh0ICpwYiwgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgZ2V0X3N0cmwocGIsIGJ1ZiwgYnVmX3NpemUsIGF2aW9fcjgocGIpKTsKK30KKworc3RhdGljIGludCBybV9yZWFkX2V4dHJhZGF0YShBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA+PSAxPDwyNCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKGF2Y3R4LCBwYiwgc2l6ZSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBybV9yZWFkX21ldGFkYXRhKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBpbnQgd2lkZSkKK3sKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaT0wOyBpPEZGX0FSUkFZX0VMRU1TKGZmX3JtX21ldGFkYXRhKTsgaSsrKSB7CisgICAgICAgIGludCBsZW4gPSB3aWRlID8gYXZpb19yYjE2KHBiKSA6IGF2aW9fcjgocGIpOworICAgICAgICBnZXRfc3RybChwYiwgYnVmLCBzaXplb2YoYnVmKSwgbGVuKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBmZl9ybV9tZXRhZGF0YVtpXSwgYnVmLCAwKTsKKyAgICB9Cit9CisKK1JNU3RyZWFtICpmZl9ybV9hbGxvY19ybXN0cmVhbSAodm9pZCkKK3sKKyAgICBSTVN0cmVhbSAqcm1zID0gYXZfbWFsbG9jeihzaXplb2YoUk1TdHJlYW0pKTsKKyAgICBybXMtPmN1cnBpY19udW0gPSAtMTsKKyAgICByZXR1cm4gcm1zOworfQorCit2b2lkIGZmX3JtX2ZyZWVfcm1zdHJlYW0gKFJNU3RyZWFtICpybXMpCit7CisgICAgYXZfZnJlZV9wYWNrZXQoJnJtcy0+cGt0KTsKK30KKworc3RhdGljIGludCBybV9yZWFkX2F1ZGlvX3N0cmVhbV9pbmZvKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgUk1TdHJlYW0gKmFzdCwgaW50IHJlYWRfYWxsKQoreworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgdWludDMyX3QgdmVyc2lvbjsKKyAgICBpbnQgcmV0OworCisgICAgLyogcmEgdHlwZSBoZWFkZXIgKi8KKyAgICB2ZXJzaW9uID0gYXZpb19yYjE2KHBiKTsgLyogdmVyc2lvbiAqLworICAgIGlmICh2ZXJzaW9uID09IDMpIHsKKyAgICAgICAgdW5zaWduZWQgYnl0ZXNfcGVyX21pbnV0ZTsKKyAgICAgICAgaW50IGhlYWRlcl9zaXplID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgaW50NjRfdCBzdGFydHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgICAgIGJ5dGVzX3Blcl9taW51dGUgPSBhdmlvX3JiMTYocGIpOworICAgICAgICBhdmlvX3NraXAocGIsIDQpOworICAgICAgICBybV9yZWFkX21ldGFkYXRhKHMsIHBiLCAwKTsKKyAgICAgICAgaWYgKChzdGFydHBvcyArIGhlYWRlcl9zaXplKSA+PSBhdmlvX3RlbGwocGIpICsgMikgeworICAgICAgICAgICAgLy8gZm91cmNjIChzaG91bGQgYWx3YXlzIGJlICJscGNKIikKKyAgICAgICAgICAgIGF2aW9fcjgocGIpOworICAgICAgICAgICAgZ2V0X3N0cjgocGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICB9CisgICAgICAgIC8vIFNraXAgZXh0cmEgaGVhZGVyIGNyYXAgKHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbikKKyAgICAgICAgaWYgKChzdGFydHBvcyArIGhlYWRlcl9zaXplKSA+IGF2aW9fdGVsbChwYikpCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIGhlYWRlcl9zaXplICsgc3RhcnRwb3MgLSBhdmlvX3RlbGwocGIpKTsKKyAgICAgICAgaWYgKGJ5dGVzX3Blcl9taW51dGUpCisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gOExMICogYnl0ZXNfcGVyX21pbnV0ZSAvIDYwOworICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gODAwMDsKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFfMTQ0OworICAgICAgICBhc3QtPmRlaW50X2lkID0gREVJTlRfSURfSU5UMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgZmxhdm9yLCBzdWJfcGFja2V0X2gsIGNvZGVkX2ZyYW1lc2l6ZSwgc3ViX3BhY2tldF9zaXplOworICAgICAgICBpbnQgY29kZWNkYXRhX2xlbmd0aDsKKyAgICAgICAgdW5zaWduZWQgYnl0ZXNfcGVyX21pbnV0ZTsKKyAgICAgICAgLyogb2xkIHZlcnNpb24gKDQpICovCisgICAgICAgIGF2aW9fc2tpcChwYiwgMik7IC8qIHVudXNlZCAqLworICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiAucmE0ICovCisgICAgICAgIGF2aW9fcmIzMihwYik7IC8qIGRhdGEgc2l6ZSAqLworICAgICAgICBhdmlvX3JiMTYocGIpOyAvKiB2ZXJzaW9uMiAqLworICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBoZWFkZXIgc2l6ZSAqLworICAgICAgICBmbGF2b3I9IGF2aW9fcmIxNihwYik7IC8qIGFkZCBjb2RlYyBpbmZvIC8gZmxhdm9yICovCisgICAgICAgIGFzdC0+Y29kZWRfZnJhbWVzaXplID0gY29kZWRfZnJhbWVzaXplID0gYXZpb19yYjMyKHBiKTsgLyogY29kZWQgZnJhbWUgc2l6ZSAqLworICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiA/Pz8gKi8KKyAgICAgICAgYnl0ZXNfcGVyX21pbnV0ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGlmICh2ZXJzaW9uID09IDQpIHsKKyAgICAgICAgICAgIGlmIChieXRlc19wZXJfbWludXRlKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSA4TEwgKiBieXRlc19wZXJfbWludXRlIC8gNjA7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19yYjMyKHBiKTsgLyogPz8/ICovCisgICAgICAgIGFzdC0+c3ViX3BhY2tldF9oID0gc3ViX3BhY2tldF9oID0gYXZpb19yYjE2KHBiKTsgLyogMSAqLworICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduPSBhdmlvX3JiMTYocGIpOyAvKiBmcmFtZSBzaXplICovCisgICAgICAgIGFzdC0+c3ViX3BhY2tldF9zaXplID0gc3ViX3BhY2tldF9zaXplID0gYXZpb19yYjE2KHBiKTsgLyogc3ViIHBhY2tldCBzaXplICovCisgICAgICAgIGF2aW9fcmIxNihwYik7IC8qID8/PyAqLworICAgICAgICBpZiAodmVyc2lvbiA9PSA1KSB7CisgICAgICAgICAgICBhdmlvX3JiMTYocGIpOyBhdmlvX3JiMTYocGIpOyBhdmlvX3JiMTYocGIpOworICAgICAgICB9CisgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMTYocGIpOworICAgICAgICBhdmlvX3JiMzIocGIpOworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gNSkgeworICAgICAgICAgICAgYXN0LT5kZWludF9pZCA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBhdmlvX3JlYWQocGIsIGJ1ZiwgNCk7CisgICAgICAgICAgICBidWZbNF0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVZfV0wzMihidWYsIDApOworICAgICAgICAgICAgZ2V0X3N0cjgocGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOyAvKiBkZXNjICovCisgICAgICAgICAgICBhc3QtPmRlaW50X2lkID0gQVZfUkwzMihidWYpOworICAgICAgICAgICAgZ2V0X3N0cjgocGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOyAvKiBkZXNjICovCisgICAgICAgIH0KKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSBBVl9STDMyKGJ1Zik7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9ybV9jb2RlY190YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcpOworCisgICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FDMzoKKyAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUkFfMjg4OgorICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZT0gMDsKKyAgICAgICAgICAgIGFzdC0+YXVkaW9fZnJhbWVzaXplID0gc3QtPmNvZGVjLT5ibG9ja19hbGlnbjsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBjb2RlZF9mcmFtZXNpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9DT09LOgorICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0hFQURFUlM7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQVRSQUMzOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1NJUFI6CisgICAgICAgICAgICBpZiAocmVhZF9hbGwpIHsKKyAgICAgICAgICAgICAgICBjb2RlY2RhdGFfbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZpb19yYjE2KHBiKTsgYXZpb19yOChwYik7CisgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gNSkKKyAgICAgICAgICAgICAgICAgICAgYXZpb19yOChwYik7CisgICAgICAgICAgICAgICAgY29kZWNkYXRhX2xlbmd0aCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICAgICAgaWYoY29kZWNkYXRhX2xlbmd0aCArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgPD0gKHVuc2lnbmVkKWNvZGVjZGF0YV9sZW5ndGgpeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY29kZWNkYXRhX2xlbmd0aCB0b28gbGFyZ2VcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3QtPmF1ZGlvX2ZyYW1lc2l6ZSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TSVBSKSB7CisgICAgICAgICAgICAgICAgaWYgKGZsYXZvciA+IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImJhZCBTSVBSIGZpbGUgZmxhdm9yICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gZmZfc2lwcl9zdWJwa19zaXplW2ZsYXZvcl07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKHN1Yl9wYWNrZXRfc2l6ZSA8PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInN1Yl9wYWNrZXRfc2l6ZSBpcyBpbnZhbGlkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gYXN0LT5zdWJfcGFja2V0X3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHJldCA9IHJtX3JlYWRfZXh0cmFkYXRhKHBiLCBzdC0+Y29kZWMsIGNvZGVjZGF0YV9sZW5ndGgpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQUFDOgorICAgICAgICAgICAgYXZpb19yYjE2KHBiKTsgYXZpb19yOChwYik7CisgICAgICAgICAgICBpZiAodmVyc2lvbiA9PSA1KQorICAgICAgICAgICAgICAgIGF2aW9fcjgocGIpOworICAgICAgICAgICAgY29kZWNkYXRhX2xlbmd0aCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBpZihjb2RlY2RhdGFfbGVuZ3RoICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSA8PSAodW5zaWduZWQpY29kZWNkYXRhX2xlbmd0aCl7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNvZGVjZGF0YV9sZW5ndGggdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29kZWNkYXRhX2xlbmd0aCA+PSAxKSB7CisgICAgICAgICAgICAgICAgYXZpb19yOChwYik7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBybV9yZWFkX2V4dHJhZGF0YShwYiwgc3QtPmNvZGVjLCBjb2RlY2RhdGFfbGVuZ3RoIC0gMSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYXN0LT5kZWludF9pZCkgeworICAgICAgICBjYXNlIERFSU5UX0lEX0lOVDQ6CisgICAgICAgICAgICBpZiAoYXN0LT5jb2RlZF9mcmFtZXNpemUgPiBhc3QtPmF1ZGlvX2ZyYW1lc2l6ZSB8fAorICAgICAgICAgICAgICAgIHN1Yl9wYWNrZXRfaCA8PSAxIHx8CisgICAgICAgICAgICAgICAgYXN0LT5jb2RlZF9mcmFtZXNpemUgKiBzdWJfcGFja2V0X2ggPiAoMiArIChzdWJfcGFja2V0X2ggJiAxKSkgKiBhc3QtPmF1ZGlvX2ZyYW1lc2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGlmIChhc3QtPmNvZGVkX2ZyYW1lc2l6ZSAqIHN1Yl9wYWNrZXRfaCAhPSAyKmFzdC0+YXVkaW9fZnJhbWVzaXplKSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJtaXNtYXRjaGluZyBpbnRlcmxlYXZlciBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBERUlOVF9JRF9HRU5SOgorICAgICAgICAgICAgaWYgKGFzdC0+c3ViX3BhY2tldF9zaXplIDw9IDAgfHwKKyAgICAgICAgICAgICAgICBhc3QtPnN1Yl9wYWNrZXRfc2l6ZSA+IGFzdC0+YXVkaW9fZnJhbWVzaXplKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaWYgKGFzdC0+YXVkaW9fZnJhbWVzaXplICUgYXN0LT5zdWJfcGFja2V0X3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBERUlOVF9JRF9TSVBSOgorICAgICAgICBjYXNlIERFSU5UX0lEX0lOVDA6CisgICAgICAgIGNhc2UgREVJTlRfSURfVkJSUzoKKyAgICAgICAgY2FzZSBERUlOVF9JRF9WQlJGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SICwiVW5rbm93biBpbnRlcmxlYXZlciAlIlBSSVgzMiJcbiIsIGFzdC0+ZGVpbnRfaWQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFzdC0+ZGVpbnRfaWQgPT0gREVJTlRfSURfSU5UNCB8fAorICAgICAgICAgICAgYXN0LT5kZWludF9pZCA9PSBERUlOVF9JRF9HRU5SIHx8CisgICAgICAgICAgICBhc3QtPmRlaW50X2lkID09IERFSU5UX0lEX1NJUFIpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmJsb2NrX2FsaWduIDw9IDAgfHwKKyAgICAgICAgICAgICAgICBhc3QtPmF1ZGlvX2ZyYW1lc2l6ZSAqIHN1Yl9wYWNrZXRfaCA+ICh1bnNpZ25lZClJTlRfTUFYIHx8CisgICAgICAgICAgICAgICAgYXN0LT5hdWRpb19mcmFtZXNpemUgKiBzdWJfcGFja2V0X2ggPCBzdC0+Y29kZWMtPmJsb2NrX2FsaWduKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaWYgKGF2X25ld19wYWNrZXQoJmFzdC0+cGt0LCBhc3QtPmF1ZGlvX2ZyYW1lc2l6ZSAqIHN1Yl9wYWNrZXRfaCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhZF9hbGwpIHsKKyAgICAgICAgICAgIGF2aW9fcjgocGIpOworICAgICAgICAgICAgYXZpb19yOChwYik7CisgICAgICAgICAgICBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIHJtX3JlYWRfbWV0YWRhdGEocywgcGIsIDApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQKK2ZmX3JtX3JlYWRfbWRwcl9jb2RlY2RhdGEgKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBSTVN0cmVhbSAqcnN0LCBpbnQgY29kZWNfZGF0YV9zaXplLCBjb25zdCB1aW50OF90ICptaW1lKQoreworICAgIHVuc2lnbmVkIGludCB2OworICAgIGludCBzaXplOworICAgIGludDY0X3QgY29kZWNfcG9zOworICAgIGludCByZXQ7CisKKyAgICBpZiAoY29kZWNfZGF0YV9zaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMCk7CisgICAgY29kZWNfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICB2ID0gYXZpb19yYjMyKHBiKTsKKworICAgIGlmICh2ID09IE1LQkVUQUcoJ00nLCAnTCcsICdUJywgJ0knKSkgeworICAgICAgICBpbnQgbnVtYmVyX29mX3N0cmVhbXMgPSBhdmlvX3JiMTYocGIpOworICAgICAgICBpbnQgbnVtYmVyX29mX21kcHI7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpPG51bWJlcl9vZl9zdHJlYW1zOyBpKyspCisgICAgICAgICAgICBhdmlvX3JiMTYocGIpOworICAgICAgICBudW1iZXJfb2ZfbWRwciA9IGF2aW9fcmIxNihwYik7CisgICAgICAgIGlmIChudW1iZXJfb2ZfbWRwciAhPSAxKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIk1MVEkgd2l0aCBtdWx0aXBsZSBNRFBSIik7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19yYjMyKHBiKTsKKyAgICAgICAgdiA9IGF2aW9fcmIzMihwYik7CisgICAgfQorCisgICAgaWYgKHYgPT0gTUtUQUcoMHhmZCwgJ2EnLCAncicsICcuJykpIHsKKyAgICAgICAgLyogcmEgdHlwZSBoZWFkZXIgKi8KKyAgICAgICAgaWYgKHJtX3JlYWRfYXVkaW9fc3RyZWFtX2luZm8ocywgcGIsIHN0LCByc3QsIDApKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAodiA9PSBNS0JFVEFHKCdMJywgJ1MnLCAnRCcsICc6JykpIHsKKyAgICAgICAgYXZpb19zZWVrKHBiLCAtNCwgU0VFS19DVVIpOworICAgICAgICBpZiAoKHJldCA9IHJtX3JlYWRfZXh0cmFkYXRhKHBiLCBzdC0+Y29kZWMsIGNvZGVjX2RhdGFfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSBBVl9STDMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX3JtX2NvZGVjX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyk7CisgICAgfSBlbHNlIGlmKG1pbWUgJiYgIXN0cmNtcChtaW1lLCAibG9naWNhbC1maWxlaW5mbyIpKXsKKyAgICAgICAgaW50IHN0cmVhbV9jb3VudCwgcnVsZV9jb3VudCwgcHJvcGVydHlfY291bnQsIGk7CisgICAgICAgIGZmX2ZyZWVfc3RyZWFtKHMsIHN0KTsKKyAgICAgICAgaWYgKGF2aW9fcmIxNihwYikgIT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgdmVyc2lvblxuIik7CisgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtX2NvdW50ID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgYXZpb19za2lwKHBiLCA2KnN0cmVhbV9jb3VudCk7CisgICAgICAgIHJ1bGVfY291bnQgPSBhdmlvX3JiMTYocGIpOworICAgICAgICBhdmlvX3NraXAocGIsIDIqcnVsZV9jb3VudCk7CisgICAgICAgIHByb3BlcnR5X2NvdW50ID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgZm9yKGk9MDsgaTxwcm9wZXJ0eV9jb3VudDsgaSsrKXsKKyAgICAgICAgICAgIHVpbnQ4X3QgbmFtZVsxMjhdLCB2YWxbMTI4XTsKKyAgICAgICAgICAgIGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBpZiAoYXZpb19yYjE2KHBiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgTmFtZSB2YWx1ZSBwcm9wZXJ0eSB2ZXJzaW9uXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIHNraXA7IC8vRklYTUUgc2tpcCBqdXN0IHRoaXMgb25lCisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXRfc3RyOChwYiwgbmFtZSwgc2l6ZW9mKG5hbWUpKTsKKyAgICAgICAgICAgIHN3aXRjaChhdmlvX3JiMzIocGIpKSB7CisgICAgICAgICAgICBjYXNlIDI6IGdldF9zdHJsKHBiLCB2YWwsIHNpemVvZih2YWwpLCBhdmlvX3JiMTYocGIpKTsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsIG5hbWUsIHZhbCwgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBhdmlvX3NraXAocGIsIGF2aW9fcmIxNihwYikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGZwczsKKyAgICAgICAgaWYgKGF2aW9fcmwzMihwYikgIT0gTUtUQUcoJ1YnLCAnSScsICdEJywgJ08nKSkgeworICAgICAgICBmYWlsMToKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICUwOHhcbiIsIHYpOworICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICB9CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgPSBmZl9jb2RlY19nZXRfaWQoZmZfcm1fY29kZWNfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcpOworICAgICAgICBhdl9kbG9nKHMsICIlWCAlWFxuIiwgc3QtPmNvZGVjLT5jb2RlY190YWcsIE1LVEFHKCdSJywgJ1YnLCAnMicsICcwJykpOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAgICAgZ290byBmYWlsMTsKKyAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmIxNihwYik7CisgICAgICAgIGF2aW9fc2tpcChwYiwgMik7IC8vIGxvb2tzIGxpa2UgYml0cyBwZXIgc2FtcGxlCisgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7IC8vIGFsd2F5cyB6ZXJvPworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9USU1FU1RBTVBTOworICAgICAgICBmcHMgPSBhdmlvX3JiMzIocGIpOworCisgICAgICAgIGlmICgocmV0ID0gcm1fcmVhZF9leHRyYWRhdGEocGIsIHN0LT5jb2RlYywgY29kZWNfZGF0YV9zaXplIC0gKGF2aW9fdGVsbChwYikgLSBjb2RlY19wb3MpKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAoZnBzID4gMCkgeworICAgICAgICAgICAgYXZfcmVkdWNlKCZzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuLCAmc3QtPmF2Z19mcmFtZV9yYXRlLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBmcHMsICgxIDw8IDMwKSAtIDEpOworI2lmIEZGX0FQSV9SX0ZSQU1FX1JBVEUKKyAgICAgICAgICAgIHN0LT5yX2ZyYW1lX3JhdGUgPSBzdC0+YXZnX2ZyYW1lX3JhdGU7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIGlmIChzLT5lcnJvcl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGZyYW1lcmF0ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworc2tpcDoKKyAgICAvKiBza2lwIGNvZGVjIGluZm8gKi8KKyAgICBzaXplID0gYXZpb190ZWxsKHBiKSAtIGNvZGVjX3BvczsKKyAgICBhdmlvX3NraXAocGIsIGNvZGVjX2RhdGFfc2l6ZSAtIHNpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgZGVtdXhlciBoYXMgYWxyZWFkeSBzZWVrZWQgdG8gdGhlIHN0YXJ0CisgKiBvZiB0aGUgSU5EWCBjaHVuaywgYW5kIHdpbGwgYmFpbCBvdXQgaWYgbm90LiAqLworc3RhdGljIGludCBybV9yZWFkX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgbl9wa3RzLCBzdHJfaWQsIG5leHRfb2ZmLCBuLCBwb3MsIHB0czsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBkbyB7CisgICAgICAgIGlmIChhdmlvX3JsMzIocGIpICE9IE1LVEFHKCdJJywnTicsJ0QnLCdYJykpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHNpemUgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgaWYgKHNpemUgPCAyMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYXZpb19za2lwKHBiLCAyKTsKKyAgICAgICAgbl9wa3RzICAgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBzdHJfaWQgICA9IGF2aW9fcmIxNihwYik7CisgICAgICAgIG5leHRfb2ZmID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IHMtPm5iX3N0cmVhbXM7IG4rKykKKyAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW25dLT5pZCA9PSBzdHJfaWQpIHsKKyAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbbl07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChuID09IHMtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgc3RyZWFtIGluZGV4ICVkIGZvciBpbmRleCBhdCBwb3MgJSJQUklkNjQiXG4iLAorICAgICAgICAgICAgICAgICAgIHN0cl9pZCwgYXZpb190ZWxsKHBiKSk7CisgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgICAgIH0gZWxzZSBpZiAoKGF2aW9fc2l6ZShwYikgLSBhdmlvX3RlbGwocGIpKSAvIDE0IDwgbl9wa3RzKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJOci4gb2YgcGFja2V0cyBpbiBwYWNrZXQgaW5kZXggZm9yIHN0cmVhbSBpbmRleCAlZCAiCisgICAgICAgICAgICAgICAgICAgImV4Y2VlZHMgZmlsZXNpemUgKCUiUFJJZDY0IiBhdCAlIlBSSWQ2NCIgPSAlIlBSSWQ2NCIpXG4iLAorICAgICAgICAgICAgICAgICAgIHN0cl9pZCwgYXZpb19zaXplKHBiKSwgYXZpb190ZWxsKHBiKSwKKyAgICAgICAgICAgICAgICAgICAoYXZpb19zaXplKHBiKSAtIGF2aW9fdGVsbChwYikpIC8gMTQpOworICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IG5fcGt0czsgbisrKSB7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDIpOworICAgICAgICAgICAgcHRzID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIHBvcyA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDQpOyAvKiBwYWNrZXQgbm8uICovCisKKyAgICAgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeShzdCwgcG9zLCBwdHMsIDAsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOworICAgICAgICB9CisKK3NraXA6CisgICAgICAgIGlmIChuZXh0X29mZiAmJiBhdmlvX3RlbGwocGIpIDwgbmV4dF9vZmYgJiYKKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgbmV4dF9vZmYsIFNFRUtfU0VUKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIk5vbi1saW5lYXIgaW5kZXggZGV0ZWN0ZWQsIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfSB3aGlsZSAobmV4dF9vZmYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm1fcmVhZF9oZWFkZXJfb2xkKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBSTURlbXV4Q29udGV4dCAqcm0gPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgcm0tPm9sZF9mb3JtYXQgPSAxOworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3QtPnByaXZfZGF0YSA9IGZmX3JtX2FsbG9jX3Jtc3RyZWFtKCk7CisgICAgcmV0dXJuIHJtX3JlYWRfYXVkaW9fc3RyZWFtX2luZm8ocywgcy0+cGIsIHN0LCBzdC0+cHJpdl9kYXRhLCAxKTsKK30KKworc3RhdGljIGludCBybV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUk1EZW11eENvbnRleHQgKnJtID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1bnNpZ25lZCBpbnQgdGFnOworICAgIGludCB0YWdfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgc3RhcnRfdGltZSwgZHVyYXRpb247CisgICAgdW5zaWduZWQgaW50IGRhdGFfb2ZmID0gMCwgaW5keF9vZmYgPSAwOworICAgIGNoYXIgYnVmWzEyOF0sIG1pbWVbMTI4XTsKKyAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZiAodGFnID09IE1LVEFHKCcuJywgJ3InLCAnYScsIDB4ZmQpKSB7CisgICAgICAgIC8qIHZlcnkgb2xkIC5yYSBmb3JtYXQgKi8KKyAgICAgICAgcmV0dXJuIHJtX3JlYWRfaGVhZGVyX29sZChzKTsKKyAgICB9IGVsc2UgaWYgKHRhZyAhPSBNS1RBRygnLicsICdSJywgJ00nLCAnRicpKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgdGFnX3NpemUgPSBhdmlvX3JiMzIocGIpOworICAgIGF2aW9fc2tpcChwYiwgdGFnX3NpemUgLSA4KTsKKworICAgIGZvcig7OykgeworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgdGFnX3NpemUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBhdmlvX3JiMTYocGIpOworICAgICAgICBhdl9kbG9nKHMsICJ0YWc9JWMlYyVjJWMgKCUwOHgpIHNpemU9JWRcbiIsCisgICAgICAgICAgICAgICAgKHRhZyAgICAgICkgJiAweGZmLAorICAgICAgICAgICAgICAgICh0YWcgPj4gIDgpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAodGFnID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgKHRhZyA+PiAyNCkgJiAweGZmLAorICAgICAgICAgICAgICAgIHRhZywKKyAgICAgICAgICAgICAgICB0YWdfc2l6ZSk7CisgICAgICAgIGlmICh0YWdfc2l6ZSA8IDEwICYmIHRhZyAhPSBNS1RBRygnRCcsICdBJywgJ1QnLCAnQScpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzd2l0Y2godGFnKSB7CisgICAgICAgIGNhc2UgTUtUQUcoJ1AnLCAnUicsICdPJywgJ1AnKToKKyAgICAgICAgICAgIC8qIGZpbGUgaGVhZGVyICovCisgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBtYXggYml0IHJhdGUgKi8KKyAgICAgICAgICAgIGF2aW9fcmIzMihwYik7IC8qIGF2ZyBiaXQgcmF0ZSAqLworICAgICAgICAgICAgYXZpb19yYjMyKHBiKTsgLyogbWF4IHBhY2tldCBzaXplICovCisgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBhdmcgcGFja2V0IHNpemUgKi8KKyAgICAgICAgICAgIGF2aW9fcmIzMihwYik7IC8qIG5iIHBhY2tldHMgKi8KKyAgICAgICAgICAgIGR1cmF0aW9uID0gYXZpb19yYjMyKHBiKTsgLyogZHVyYXRpb24gKi8KKyAgICAgICAgICAgIHMtPmR1cmF0aW9uID0gYXZfcmVzY2FsZShkdXJhdGlvbiwgQVZfVElNRV9CQVNFLCAxMDAwKTsKKyAgICAgICAgICAgIGF2aW9fcmIzMihwYik7IC8qIHByZXJvbGwgKi8KKyAgICAgICAgICAgIGluZHhfb2ZmID0gYXZpb19yYjMyKHBiKTsgLyogaW5kZXggb2Zmc2V0ICovCisgICAgICAgICAgICBkYXRhX29mZiA9IGF2aW9fcmIzMihwYik7IC8qIGRhdGEgb2Zmc2V0ICovCisgICAgICAgICAgICBhdmlvX3JiMTYocGIpOyAvKiBuYiBzdHJlYW1zICovCisgICAgICAgICAgICBmbGFncyA9IGF2aW9fcmIxNihwYik7IC8qIGZsYWdzICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnQycsICdPJywgJ04nLCAnVCcpOgorICAgICAgICAgICAgcm1fcmVhZF9tZXRhZGF0YShzLCBwYiwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnTScsICdEJywgJ1AnLCAnUicpOgorICAgICAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgc3QtPmlkID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIGF2aW9fcmIzMihwYik7IC8qIG1heCBiaXQgcmF0ZSAqLworICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IGF2aW9fcmIzMihwYik7IC8qIGJpdCByYXRlICovCisgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBtYXggcGFja2V0IHNpemUgKi8KKyAgICAgICAgICAgIGF2aW9fcmIzMihwYik7IC8qIGF2ZyBwYWNrZXQgc2l6ZSAqLworICAgICAgICAgICAgc3RhcnRfdGltZSA9IGF2aW9fcmIzMihwYik7IC8qIHN0YXJ0IHRpbWUgKi8KKyAgICAgICAgICAgIGF2aW9fcmIzMihwYik7IC8qIHByZXJvbGwgKi8KKyAgICAgICAgICAgIGR1cmF0aW9uID0gYXZpb19yYjMyKHBiKTsgLyogZHVyYXRpb24gKi8KKyAgICAgICAgICAgIHN0LT5zdGFydF90aW1lID0gc3RhcnRfdGltZTsKKyAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICAgICAgaWYoZHVyYXRpb24+MCkKKyAgICAgICAgICAgICAgICBzLT5kdXJhdGlvbiA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgZ2V0X3N0cjgocGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOyAvKiBkZXNjICovCisgICAgICAgICAgICBnZXRfc3RyOChwYiwgbWltZSwgc2l6ZW9mKG1pbWUpKTsgLyogbWltZXR5cGUgKi8KKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOworICAgICAgICAgICAgc3QtPnByaXZfZGF0YSA9IGZmX3JtX2FsbG9jX3Jtc3RyZWFtKCk7CisgICAgICAgICAgICBpZiAoZmZfcm1fcmVhZF9tZHByX2NvZGVjZGF0YShzLCBzLT5wYiwgc3QsIHN0LT5wcml2X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3JiMzIocGIpLCBtaW1lKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ0QnLCAnQScsICdUJywgJ0EnKToKKyAgICAgICAgICAgIGdvdG8gaGVhZGVyX2VuZDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIHVua25vd24gdGFnOiBza2lwIGl0ICovCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIHRhZ19zaXplIC0gMTApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgaGVhZGVyX2VuZDoKKyAgICBybS0+bmJfcGFja2V0cyA9IGF2aW9fcmIzMihwYik7IC8qIG51bWJlciBvZiBwYWNrZXRzICovCisgICAgaWYgKCFybS0+bmJfcGFja2V0cyAmJiAoZmxhZ3MgJiA0KSkKKyAgICAgICAgcm0tPm5iX3BhY2tldHMgPSAzNjAwICogMjU7CisgICAgYXZpb19yYjMyKHBiKTsgLyogbmV4dCBkYXRhIGhlYWRlciAqLworCisgICAgaWYgKCFkYXRhX29mZikKKyAgICAgICAgZGF0YV9vZmYgPSBhdmlvX3RlbGwocGIpIC0gMTg7CisgICAgaWYgKGluZHhfb2ZmICYmIHBiLT5zZWVrYWJsZSAmJiAhKHMtPmZsYWdzICYgQVZGTVRfRkxBR19JR05JRFgpICYmCisgICAgICAgIGF2aW9fc2VlayhwYiwgaW5keF9vZmYsIFNFRUtfU0VUKSA+PSAwKSB7CisgICAgICAgIHJtX3JlYWRfaW5kZXgocyk7CisgICAgICAgIGF2aW9fc2VlayhwYiwgZGF0YV9vZmYgKyAxOCwgU0VFS19TRVQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9udW0oQVZJT0NvbnRleHQgKnBiLCBpbnQgKmxlbikKK3sKKyAgICBpbnQgbiwgbjE7CisKKyAgICBuID0gYXZpb19yYjE2KHBiKTsKKyAgICAoKmxlbiktPTI7CisgICAgbiAmPSAweDdGRkY7CisgICAgaWYgKG4gPj0gMHg0MDAwKSB7CisgICAgICAgIHJldHVybiBuIC0gMHg0MDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG4xID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgKCpsZW4pLT0yOworICAgICAgICByZXR1cm4gKG4gPDwgMTYpIHwgbjE7CisgICAgfQorfQorCisvKiBtdWx0aXBsZSBvZiAyMCBieXRlcyBmb3IgcmExNDQgKHVnbHkpICovCisjZGVmaW5lIFJBV19QQUNLRVRfU0laRSAxMDAwCisKK3N0YXRpYyBpbnQgcm1fc3luYyhBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3QgKnRpbWVzdGFtcCwgaW50ICpmbGFncywgaW50ICpzdHJlYW1faW5kZXgsIGludDY0X3QgKnBvcyl7CisgICAgUk1EZW11eENvbnRleHQgKnJtID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdDsKKyAgICB1aW50MzJfdCBzdGF0ZT0weEZGRkZGRkZGOworCisgICAgd2hpbGUoIWF2aW9fZmVvZihwYikpeworICAgICAgICBpbnQgbGVuLCBudW0sIGk7CisgICAgICAgICpwb3M9IGF2aW9fdGVsbChwYikgLSAzOworICAgICAgICBpZihybS0+cmVtYWluaW5nX2xlbiA+IDApeworICAgICAgICAgICAgbnVtPSBybS0+Y3VycmVudF9zdHJlYW07CisgICAgICAgICAgICBsZW49IHJtLT5yZW1haW5pbmdfbGVuOworICAgICAgICAgICAgKnRpbWVzdGFtcCA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgKmZsYWdzPSAwOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHN0YXRlPSAoc3RhdGU8PDgpICsgYXZpb19yOChwYik7CisKKyAgICAgICAgICAgIGlmKHN0YXRlID09IE1LQkVUQUcoJ0knLCAnTicsICdEJywgJ1gnKSl7CisgICAgICAgICAgICAgICAgaW50IG5fcGt0cywgZXhwZWN0ZWRfbGVuOworICAgICAgICAgICAgICAgIGxlbiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCAyKTsKKyAgICAgICAgICAgICAgICBuX3BrdHMgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkX2xlbiA9IDIwICsgbl9wa3RzICogMTQ7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAyMCkKKyAgICAgICAgICAgICAgICAgICAgLyogc29tZSBmaWxlcyBkb24ndCBhZGQgaW5kZXggZW50cmllcyB0byBjaHVuayBzaXplLi4uICovCisgICAgICAgICAgICAgICAgICAgIGxlbiA9IGV4cGVjdGVkX2xlbjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsZW4gIT0gZXhwZWN0ZWRfbGVuKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kZXggc2l6ZSAlZCAoJWQgcGt0cykgaXMgd3JvbmcsIHNob3VsZCBiZSAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIG5fcGt0cywgZXhwZWN0ZWRfbGVuKTsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMTQ7IC8vIHdlIGFscmVhZHkgcmVhZCBwYXJ0IG9mIHRoZSBpbmRleCBoZWFkZXIKKyAgICAgICAgICAgICAgICBpZihsZW48MCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBNS0JFVEFHKCdEJywnQScsJ1QnLCdBJykpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJEQVRBIHRhZyBpbiBtaWRkbGUgb2YgY2h1bmssIGZpbGUgbWF5IGJlIGJyb2tlbi5cbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihzdGF0ZSA+ICh1bnNpZ25lZCkweEZGRkYgfHwgc3RhdGUgPD0gMTIpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBsZW49c3RhdGUgLSAxMjsKKyAgICAgICAgICAgIHN0YXRlPSAweEZGRkZGRkZGOworCisgICAgICAgICAgICBudW0gPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgKnRpbWVzdGFtcCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBhdmlvX3I4KHBiKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgICpmbGFncyA9IGF2aW9fcjgocGIpOyAvKiBmbGFncyAqLworICAgICAgICB9CisgICAgICAgIGZvcihpPTA7aTxzLT5uYl9zdHJlYW1zO2krKykgeworICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgaWYgKG51bSA9PSBzdC0+aWQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gcy0+bmJfc3RyZWFtcykgeworc2tpcDoKKyAgICAgICAgICAgIC8qIHNraXAgcGFja2V0IGlmIHVua25vd24gbnVtYmVyICovCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIGxlbik7CisgICAgICAgICAgICBybS0+cmVtYWluaW5nX2xlbiA9IDA7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAqc3RyZWFtX2luZGV4PSBpOworCisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBybV9hc3NlbWJsZV92aWRlb19mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk1EZW11eENvbnRleHQgKnJtLCBSTVN0cmVhbSAqdnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0LCBpbnQgbGVuLCBpbnQgKnBzZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcCkKK3sKKyAgICBpbnQgaGRyOworICAgIGludCBzZXEgPSAwLCBwaWNfbnVtID0gMCwgbGVuMiA9IDAsIHBvcyA9IDA7IC8vaW5pdCB0byBzaWxjZW5zZSBjb21waWxlciB3YXJuaW5nCisgICAgaW50IHR5cGU7CisgICAgaW50IHJldDsKKworICAgIGhkciA9IGF2aW9fcjgocGIpOyBsZW4tLTsKKyAgICB0eXBlID0gaGRyID4+IDY7CisKKyAgICBpZih0eXBlICE9IDMpeyAgLy8gbm90IGZyYW1lIGFzIGEgcGFydCBvZiBwYWNrZXQKKyAgICAgICAgc2VxID0gYXZpb19yOChwYik7IGxlbi0tOworICAgIH0KKyAgICBpZih0eXBlICE9IDEpeyAgLy8gbm90IHdob2xlIGZyYW1lCisgICAgICAgIGxlbjIgPSBnZXRfbnVtKHBiLCAmbGVuKTsKKyAgICAgICAgcG9zICA9IGdldF9udW0ocGIsICZsZW4pOworICAgICAgICBwaWNfbnVtID0gYXZpb19yOChwYik7IGxlbi0tOworICAgIH0KKyAgICBpZihsZW48MCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGRhdGFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJtLT5yZW1haW5pbmdfbGVuID0gbGVuOworICAgIGlmKHR5cGUmMSl7ICAgICAvLyBmcmFtZSwgbm90IHNsaWNlCisgICAgICAgIGlmKHR5cGUgPT0gMyl7ICAvLyBmcmFtZSBhcyBhIHBhcnQgb2YgcGFja2V0CisgICAgICAgICAgICBsZW49IGxlbjI7CisgICAgICAgICAgICAqdGltZXN0YW1wID0gcG9zOworICAgICAgICB9CisgICAgICAgIGlmKHJtLT5yZW1haW5pbmdfbGVuIDwgbGVuKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IHJlbWFpbmluZyBsZW5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJtLT5yZW1haW5pbmdfbGVuIC09IGxlbjsKKyAgICAgICAgaWYoYXZfbmV3X3BhY2tldChwa3QsIGxlbiArIDkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIHBrdC0+ZGF0YVswXSA9IDA7CisgICAgICAgIEFWX1dMMzIocGt0LT5kYXRhICsgMSwgMSk7CisgICAgICAgIEFWX1dMMzIocGt0LT5kYXRhICsgNSwgMCk7CisgICAgICAgIGlmICgocmV0ID0gYXZpb19yZWFkKHBiLCBwa3QtPmRhdGEgKyA5LCBsZW4pKSAhPSBsZW4pIHsKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlYWQgJWQgYnl0ZXNcbiIsIGxlbik7CisgICAgICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy9ub3cgd2UgaGF2ZSB0byBkZWFsIHdpdGggc2luZ2xlIHNsaWNlCisKKyAgICAqcHNlcSA9IHNlcTsKKyAgICBpZigoc2VxICYgMHg3RikgPT0gMSB8fCB2c3QtPmN1cnBpY19udW0gIT0gcGljX251bSl7CisgICAgICAgIGlmIChsZW4yID4gZmZpb19saW1pdChwYiwgbGVuMikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbXBvc3NpYmx5IHNpemVkIHBhY2tldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICB2c3QtPnNsaWNlcyA9ICgoaGRyICYgMHgzRikgPDwgMSkgKyAxOworICAgICAgICB2c3QtPnZpZGVvYnVmc2l6ZSA9IGxlbjIgKyA4KnZzdC0+c2xpY2VzICsgMTsKKyAgICAgICAgYXZfZnJlZV9wYWNrZXQoJnZzdC0+cGt0KTsgLy9GSVhNRSB0aGlzIHNob3VsZCBiZSBvdXRwdXQuCisgICAgICAgIGlmKGF2X25ld19wYWNrZXQoJnZzdC0+cGt0LCB2c3QtPnZpZGVvYnVmc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtc2V0KHZzdC0+cGt0LmRhdGEsIDAsIHZzdC0+cGt0LnNpemUpOworICAgICAgICB2c3QtPnZpZGVvYnVmcG9zID0gOCp2c3QtPnNsaWNlcyArIDE7CisgICAgICAgIHZzdC0+Y3VyX3NsaWNlID0gMDsKKyAgICAgICAgdnN0LT5jdXJwaWNfbnVtID0gcGljX251bTsKKyAgICAgICAgdnN0LT5wa3Rwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIH0KKyAgICBpZih0eXBlID09IDIpCisgICAgICAgIGxlbiA9IEZGTUlOKGxlbiwgcG9zKTsKKworICAgIGlmKCsrdnN0LT5jdXJfc2xpY2UgPiB2c3QtPnNsaWNlcykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY3VyIHNsaWNlICVkLCB0b28gbGFyZ2VcbiIsIHZzdC0+Y3VyX3NsaWNlKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCF2c3QtPnBrdC5kYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIEFWX1dMMzIodnN0LT5wa3QuZGF0YSAtIDcgKyA4KnZzdC0+Y3VyX3NsaWNlLCAxKTsKKyAgICBBVl9XTDMyKHZzdC0+cGt0LmRhdGEgLSAzICsgOCp2c3QtPmN1cl9zbGljZSwgdnN0LT52aWRlb2J1ZnBvcyAtIDgqdnN0LT5zbGljZXMgLSAxKTsKKyAgICBpZih2c3QtPnZpZGVvYnVmcG9zICsgbGVuID4gdnN0LT52aWRlb2J1ZnNpemUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm91dHNpZGUgdmlkZW9idWZzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChhdmlvX3JlYWQocGIsIHZzdC0+cGt0LmRhdGEgKyB2c3QtPnZpZGVvYnVmcG9zLCBsZW4pICE9IGxlbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB2c3QtPnZpZGVvYnVmcG9zICs9IGxlbjsKKyAgICBybS0+cmVtYWluaW5nX2xlbi09IGxlbjsKKworICAgIGlmICh0eXBlID09IDIgfHwgdnN0LT52aWRlb2J1ZnBvcyA9PSB2c3QtPnZpZGVvYnVmc2l6ZSkgeworICAgICAgICB2c3QtPnBrdC5kYXRhWzBdID0gdnN0LT5jdXJfc2xpY2UtMTsKKyAgICAgICAgKnBrdD0gdnN0LT5wa3Q7CisgICAgICAgIHZzdC0+cGt0LmRhdGE9IE5VTEw7CisgICAgICAgIHZzdC0+cGt0LnNpemU9IDA7CisgICAgICAgIHZzdC0+cGt0LmJ1ZiA9IE5VTEw7CisjaWYgRkZfQVBJX0RFU1RSVUNUX1BBQ0tFVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICB2c3QtPnBrdC5kZXN0cnVjdCA9IE5VTEw7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorICAgICAgICBpZih2c3QtPnNsaWNlcyAhPSB2c3QtPmN1cl9zbGljZSkgLy9GSVhNRSBmaW5kIG91dCBob3cgdG8gc2V0IHNsaWNlcyBjb3JyZWN0IGZyb20gdGhlIGJlZ2luCisgICAgICAgICAgICBtZW1tb3ZlKHBrdC0+ZGF0YSArIDEgKyA4KnZzdC0+Y3VyX3NsaWNlLCBwa3QtPmRhdGEgKyAxICsgOCp2c3QtPnNsaWNlcywKKyAgICAgICAgICAgICAgICB2c3QtPnZpZGVvYnVmcG9zIC0gMSAtIDgqdnN0LT5zbGljZXMpOworICAgICAgICBwa3QtPnNpemUgPSB2c3QtPnZpZGVvYnVmcG9zICsgOCoodnN0LT5jdXJfc2xpY2UgLSB2c3QtPnNsaWNlcyk7CisgICAgICAgIHBrdC0+cHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHBrdC0+cG9zID0gdnN0LT5wa3Rwb3M7CisgICAgICAgIHZzdC0+c2xpY2VzID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcm1fYWMzX3N3YXBfYnl0ZXMgKEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICB1aW50OF90ICpwdHI7CisgICAgaW50IGo7CisKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpIHsKKyAgICAgICAgcHRyID0gcGt0LT5kYXRhOworICAgICAgICBmb3IgKGo9MDtqPHBrdC0+c2l6ZTtqKz0yKSB7CisgICAgICAgICAgICBGRlNXQVAoaW50LCBwdHJbMF0sIHB0clsxXSk7CisgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCByZWFkZnVsbChBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwgdWludDhfdCAqZHN0LCBpbnQgbikgeworICAgIGludCByZXQgPSBhdmlvX3JlYWQocGIsIGRzdCwgbik7CisgICAgaWYgKHJldCAhPSBuKSB7CisgICAgICAgIGlmIChyZXQgPj0gMCkgbWVtc2V0KGRzdCArIHJldCwgMCwgbiAtIHJldCk7CisgICAgICAgIGVsc2UgICAgICAgICAgbWVtc2V0KGRzdCAgICAgICwgMCwgbik7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZnVsbHkgcmVhZCBibG9ja1xuIik7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludAorZmZfcm1fcGFyc2VfcGFja2V0IChBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBSTVN0cmVhbSAqYXN0LCBpbnQgbGVuLCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICBpbnQgKnNlcSwgaW50IGZsYWdzLCBpbnQ2NF90IHRpbWVzdGFtcCkKK3sKKyAgICBSTURlbXV4Q29udGV4dCAqcm0gPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIHJtLT5jdXJyZW50X3N0cmVhbT0gc3QtPmlkOworICAgICAgICByZXQgPSBybV9hc3NlbWJsZV92aWRlb19mcmFtZShzLCBwYiwgcm0sIGFzdCwgcGt0LCBsZW4sIHNlcSwgJnRpbWVzdGFtcCk7CisgICAgICAgIGlmKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogLTE7IC8vZ290IHBhcnRpYWwgZnJhbWUgb3IgZXJyb3IKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgaWYgKChhc3QtPmRlaW50X2lkID09IERFSU5UX0lEX0dFTlIpIHx8CisgICAgICAgICAgICAoYXN0LT5kZWludF9pZCA9PSBERUlOVF9JRF9JTlQ0KSB8fAorICAgICAgICAgICAgKGFzdC0+ZGVpbnRfaWQgPT0gREVJTlRfSURfU0lQUikpIHsKKyAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgaW50IHNwcyA9IGFzdC0+c3ViX3BhY2tldF9zaXplOworICAgICAgICAgICAgaW50IGNmcyA9IGFzdC0+Y29kZWRfZnJhbWVzaXplOworICAgICAgICAgICAgaW50IGggPSBhc3QtPnN1Yl9wYWNrZXRfaDsKKyAgICAgICAgICAgIGludCB5ID0gYXN0LT5zdWJfcGFja2V0X2NudDsKKyAgICAgICAgICAgIGludCB3ID0gYXN0LT5hdWRpb19mcmFtZXNpemU7CisKKyAgICAgICAgICAgIGlmIChmbGFncyAmIDIpCisgICAgICAgICAgICAgICAgeSA9IGFzdC0+c3ViX3BhY2tldF9jbnQgPSAwOworICAgICAgICAgICAgaWYgKCF5KQorICAgICAgICAgICAgICAgIGFzdC0+YXVkaW90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKKyAgICAgICAgICAgIHN3aXRjaCAoYXN0LT5kZWludF9pZCkgeworICAgICAgICAgICAgICAgIGNhc2UgREVJTlRfSURfSU5UNDoKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGgvMjsgeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGZ1bGwocywgcGIsIGFzdC0+cGt0LmRhdGEreCoyKncreSpjZnMsIGNmcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgREVJTlRfSURfR0VOUjoKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHcvc3BzOyB4KyspCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZnVsbChzLCBwYiwgYXN0LT5wa3QuZGF0YStzcHMqKGgqeCsoKGgrMSkvMikqKHkmMSkrKHk+PjEpKSwgc3BzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBERUlOVF9JRF9TSVBSOgorICAgICAgICAgICAgICAgICAgICByZWFkZnVsbChzLCBwYiwgYXN0LT5wa3QuZGF0YSArIHkgKiB3LCB3KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgrKyhhc3QtPnN1Yl9wYWNrZXRfY250KSA8IGgpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKGFzdC0+ZGVpbnRfaWQgPT0gREVJTlRfSURfU0lQUikKKyAgICAgICAgICAgICAgICBmZl9ybV9yZW9yZGVyX3NpcHJfZGF0YShhc3QtPnBrdC5kYXRhLCBoLCB3KTsKKworICAgICAgICAgICAgIGFzdC0+c3ViX3BhY2tldF9jbnQgPSAwOworICAgICAgICAgICAgIHJtLT5hdWRpb19zdHJlYW1fbnVtID0gc3QtPmluZGV4OworICAgICAgICAgICAgIHJtLT5hdWRpb19wa3RfY250ID0gaCAqIHcgLyBzdC0+Y29kZWMtPmJsb2NrX2FsaWduOworICAgICAgICB9IGVsc2UgaWYgKChhc3QtPmRlaW50X2lkID09IERFSU5UX0lEX1ZCUkYpIHx8CisgICAgICAgICAgICAgICAgICAgKGFzdC0+ZGVpbnRfaWQgPT0gREVJTlRfSURfVkJSUykpIHsKKyAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgcm0tPmF1ZGlvX3N0cmVhbV9udW0gPSBzdC0+aW5kZXg7CisgICAgICAgICAgICBhc3QtPnN1Yl9wYWNrZXRfY250ID0gKGF2aW9fcmIxNihwYikgJiAweGYwKSA+PiA0OworICAgICAgICAgICAgaWYgKGFzdC0+c3ViX3BhY2tldF9jbnQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXN0LT5zdWJfcGFja2V0X2NudDsgeCsrKQorICAgICAgICAgICAgICAgICAgICBhc3QtPnN1Yl9wYWNrZXRfbGVuZ3Roc1t4XSA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICAgICAgcm0tPmF1ZGlvX3BrdF9jbnQgPSBhc3QtPnN1Yl9wYWNrZXRfY250OworICAgICAgICAgICAgICAgIGFzdC0+YXVkaW90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGxlbik7CisgICAgICAgICAgICBybV9hYzNfc3dhcF9ieXRlcyhzdCwgcGt0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGxlbik7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKworI2lmIDAKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBpZihzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWMjApeworICAgICAgICAgICAgaW50IHNlcT0gMTI4Kihwa3QtPmRhdGFbMl0mMHg3RikgKyAocGt0LT5kYXRhWzNdPj4xKTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICIlZCAlIlBSSWQ2NCIgJWRcbiIsICp0aW1lc3RhbXAsICp0aW1lc3RhbXAqNTEyTEwvMjUsIHNlcSk7CisKKyAgICAgICAgICAgIHNlcSB8PSAodGltZXN0YW1wJn4weDNGRkYpOworICAgICAgICAgICAgaWYoc2VxIC0gdGltZXN0YW1wID4gIDB4MjAwMCkgc2VxIC09IDB4NDAwMDsKKyAgICAgICAgICAgIGlmKHNlcSAtIHRpbWVzdGFtcCA8IC0weDIwMDApIHNlcSArPSAweDQwMDA7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHBrdC0+cHRzID0gdGltZXN0YW1wOworICAgIGlmIChmbGFncyAmIDIpCisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgcmV0dXJuIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gPyBybS0+YXVkaW9fcGt0X2NudCA6IDA7Cit9CisKK2ludAorZmZfcm1fcmV0cmlldmVfY2FjaGUgKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgUk1TdHJlYW0gKmFzdCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBSTURlbXV4Q29udGV4dCAqcm0gPSBzLT5wcml2X2RhdGE7CisKKyAgICBhdl9hc3NlcnQwIChybS0+YXVkaW9fcGt0X2NudCA+IDApOworCisgICAgaWYgKGFzdC0+ZGVpbnRfaWQgPT0gREVJTlRfSURfVkJSRiB8fAorICAgICAgICBhc3QtPmRlaW50X2lkID09IERFSU5UX0lEX1ZCUlMpCisgICAgICAgIGF2X2dldF9wYWNrZXQocGIsIHBrdCwgYXN0LT5zdWJfcGFja2V0X2xlbmd0aHNbYXN0LT5zdWJfcGFja2V0X2NudCAtIHJtLT5hdWRpb19wa3RfY250XSk7CisgICAgZWxzZSB7CisgICAgICAgIGludCByZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgc3QtPmNvZGVjLT5ibG9ja19hbGlnbik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgYXN0LT5wa3QuZGF0YSArIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gKiAvL0ZJWE1FIGF2b2lkIHRoaXMKKyAgICAgICAgICAgICAgIChhc3QtPnN1Yl9wYWNrZXRfaCAqIGFzdC0+YXVkaW9fZnJhbWVzaXplIC8gc3QtPmNvZGVjLT5ibG9ja19hbGlnbiAtIHJtLT5hdWRpb19wa3RfY250KSwKKyAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pOworICAgIH0KKyAgICBybS0+YXVkaW9fcGt0X2NudC0tOworICAgIGlmICgocGt0LT5wdHMgPSBhc3QtPmF1ZGlvdGltZXN0YW1wKSAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBhc3QtPmF1ZGlvdGltZXN0YW1wID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHBrdC0+ZmxhZ3MgPSBBVl9QS1RfRkxBR19LRVk7CisgICAgfSBlbHNlCisgICAgICAgIHBrdC0+ZmxhZ3MgPSAwOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworCisgICAgcmV0dXJuIHJtLT5hdWRpb19wa3RfY250OworfQorCitzdGF0aWMgaW50IHJtX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBSTURlbXV4Q29udGV4dCAqcm0gPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gTlVMTDsgLy8gaW5pdCB0byBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcKKyAgICBpbnQgaSwgbGVuLCByZXMsIHNlcSA9IDE7CisgICAgaW50NjRfdCB0aW1lc3RhbXAsIHBvczsKKyAgICBpbnQgZmxhZ3M7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChybS0+YXVkaW9fcGt0X2NudCkgeworICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIHF1ZXVlZCBhdWRpbyBwYWNrZXQgcmV0dXJuIHRoZW0gZmlyc3QKKyAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tybS0+YXVkaW9fc3RyZWFtX251bV07CisgICAgICAgICAgICByZXMgPSBmZl9ybV9yZXRyaWV2ZV9jYWNoZShzLCBzLT5wYiwgc3QsIHN0LT5wcml2X2RhdGEsIHBrdCk7CisgICAgICAgICAgICBpZihyZXMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocm0tPm9sZF9mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBSTVN0cmVhbSAqYXN0OworCisgICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zWzBdOworICAgICAgICAgICAgICAgIGFzdCA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgICAgICAgICAgbGVuID0gIWFzdC0+YXVkaW9fZnJhbWVzaXplID8gUkFXX1BBQ0tFVF9TSVpFIDoKKyAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlZF9mcmFtZXNpemUgKiBhc3QtPnN1Yl9wYWNrZXRfaCAvIDI7CisgICAgICAgICAgICAgICAgZmxhZ3MgPSAoc2VxKysgPT0gMSkgPyAyIDogMDsKKyAgICAgICAgICAgICAgICBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBybV9zeW5jKHMsICZ0aW1lc3RhbXAsICZmbGFncywgJmksICZwb3MpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPiAwKQorICAgICAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZW4gPD0gMCB8fCBhdmlvX2Zlb2Yocy0+cGIpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAgICAgICAgIHJlcyA9IGZmX3JtX3BhcnNlX3BhY2tldCAocywgcy0+cGIsIHN0LCBzdC0+cHJpdl9kYXRhLCBsZW4sIHBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcSwgZmxhZ3MsIHRpbWVzdGFtcCk7CisgICAgICAgICAgICBpZiAocmVzIDwgLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIGlmKChmbGFncyYyKSAmJiAoc2VxJjB4N0YpID09IDEpCisgICAgICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LCBwb3MsIHRpbWVzdGFtcCwgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgICAgICAgICBpZiAocmVzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYoICAoc3QtPmRpc2NhcmQgPj0gQVZESVNDQVJEX05PTktFWSAmJiAhKGZsYWdzJjIpKQorICAgICAgICAgICB8fCBzdC0+ZGlzY2FyZCA+PSBBVkRJU0NBUkRfQUxMKXsKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm1fcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDtpPHMtPm5iX3N0cmVhbXM7aSsrKQorICAgICAgICBmZl9ybV9mcmVlX3Jtc3RyZWFtKHMtPnN0cmVhbXNbaV0tPnByaXZfZGF0YSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBybV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICAvKiBjaGVjayBmaWxlIGhlYWRlciAqLworICAgIGlmICgocC0+YnVmWzBdID09ICcuJyAmJiBwLT5idWZbMV0gPT0gJ1InICYmCisgICAgICAgICBwLT5idWZbMl0gPT0gJ00nICYmIHAtPmJ1ZlszXSA9PSAnRicgJiYKKyAgICAgICAgIHAtPmJ1Zls0XSA9PSAwICYmIHAtPmJ1Zls1XSA9PSAwKSB8fAorICAgICAgICAocC0+YnVmWzBdID09ICcuJyAmJiBwLT5idWZbMV0gPT0gJ3InICYmCisgICAgICAgICBwLT5idWZbMl0gPT0gJ2EnICYmIHAtPmJ1ZlszXSA9PSAweGZkKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQ2NF90IHJtX3JlYWRfZHRzKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpwcG9zLCBpbnQ2NF90IHBvc19saW1pdCkKK3sKKyAgICBSTURlbXV4Q29udGV4dCAqcm0gPSBzLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBwb3MsIGR0czsKKyAgICBpbnQgc3RyZWFtX2luZGV4MiwgZmxhZ3MsIGxlbiwgaDsKKworICAgIHBvcyA9ICpwcG9zOworCisgICAgaWYocm0tPm9sZF9mb3JtYXQpCisgICAgICAgIHJldHVybiBBVl9OT1BUU19WQUxVRTsKKworICAgIGlmIChhdmlvX3NlZWsocy0+cGIsIHBvcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworCisgICAgcm0tPnJlbWFpbmluZ19sZW49MDsKKyAgICBmb3IoOzspeworICAgICAgICBpbnQgc2VxPTE7CisgICAgICAgIEFWU3RyZWFtICpzdDsKKworICAgICAgICBsZW4gPSBybV9zeW5jKHMsICZkdHMsICZmbGFncywgJnN0cmVhbV9pbmRleDIsICZwb3MpOworICAgICAgICBpZihsZW48MCkKKyAgICAgICAgICAgIHJldHVybiBBVl9OT1BUU19WQUxVRTsKKworICAgICAgICBzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4Ml07CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBoPSBhdmlvX3I4KHMtPnBiKTsgbGVuLS07CisgICAgICAgICAgICBpZighKGggJiAweDQwKSl7CisgICAgICAgICAgICAgICAgc2VxID0gYXZpb19yOChzLT5wYik7IGxlbi0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoKGZsYWdzJjIpICYmIChzZXEmMHg3RikgPT0gMSl7CisgICAgICAgICAgICBhdl9kbG9nKHMsICIlZCAlZC0lZCAlIlBSSWQ2NCIgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzdHJlYW1faW5kZXgyLCBzdHJlYW1faW5kZXgsIGR0cywgc2VxKTsKKyAgICAgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeShzdCwgcG9zLCBkdHMsIDAsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOworICAgICAgICAgICAgaWYoc3RyZWFtX2luZGV4MiA9PSBzdHJlYW1faW5kZXgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhdmlvX3NraXAocy0+cGIsIGxlbik7CisgICAgfQorICAgICpwcG9zID0gcG9zOworICAgIHJldHVybiBkdHM7Cit9CisKK3N0YXRpYyBpbnQgcm1fcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzLCBpbnQgZmxhZ3MpCit7CisgICAgUk1EZW11eENvbnRleHQgKnJtID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKGZmX3NlZWtfZnJhbWVfYmluYXJ5KHMsIHN0cmVhbV9pbmRleCwgcHRzLCBmbGFncykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcm0tPmF1ZGlvX3BrdF9jbnQgPSAwOworICAgIHJldHVybiAwOworfQorCisKK0FWSW5wdXRGb3JtYXQgZmZfcm1fZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicm0iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsTWVkaWEiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUk1EZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHJtX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJtX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJtX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHJtX3JlYWRfY2xvc2UsCisgICAgLnJlYWRfdGltZXN0YW1wID0gcm1fcmVhZF9kdHMsCisgICAgLnJlYWRfc2VlayAgICAgID0gcm1fcmVhZF9zZWVrLAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl9yZHRfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicmR0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUkRUIGRlbXV4ZXIiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUk1EZW11eENvbnRleHQpLAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHJtX3JlYWRfY2xvc2UsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ybWVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JtZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1MGVkMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ybWVuYy5jCkBAIC0wLDAgKzEsNDgxIEBACisvKgorICogIlJlYWwiIGNvbXBhdGlibGUgbXV4ZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAicm0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IG5iX3BhY2tldHM7CisgICAgaW50IHBhY2tldF90b3RhbF9zaXplOworICAgIGludCBwYWNrZXRfbWF4X3NpemU7CisgICAgLyogY29kZWMgcmVsYXRlZCBvdXRwdXQgKi8KKyAgICBpbnQgYml0X3JhdGU7CisgICAgZmxvYXQgZnJhbWVfcmF0ZTsKKyAgICBpbnQgbmJfZnJhbWVzOyAgICAvKiBjdXJyZW50IGZyYW1lIG51bWJlciAqLworICAgIGludCB0b3RhbF9mcmFtZXM7IC8qIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgKi8KKyAgICBpbnQgbnVtOworICAgIEFWQ29kZWNDb250ZXh0ICplbmM7Cit9IFN0cmVhbUluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTdHJlYW1JbmZvIHN0cmVhbXNbMl07CisgICAgU3RyZWFtSW5mbyAqYXVkaW9fc3RyZWFtLCAqdmlkZW9fc3RyZWFtOworICAgIGludCBkYXRhX3BvczsgLyogcG9zaXRpb24gb2YgdGhlIGRhdGEgYWZ0ZXIgdGhlIGhlYWRlciAqLworfSBSTU11eENvbnRleHQ7CisKKy8qIGluIG1zICovCisjZGVmaW5lIEJVRkZFUl9EVVJBVElPTiAwCisKKworc3RhdGljIHZvaWQgcHV0X3N0cihBVklPQ29udGV4dCAqcywgY29uc3QgY2hhciAqdGFnKQoreworICAgIGF2aW9fd2IxNihzLHN0cmxlbih0YWcpKTsKKyAgICB3aGlsZSAoKnRhZykgeworICAgICAgICBhdmlvX3c4KHMsICp0YWcrKyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwdXRfc3RyOChBVklPQ29udGV4dCAqcywgY29uc3QgY2hhciAqdGFnKQoreworICAgIGF2aW9fdzgocywgc3RybGVuKHRhZykpOworICAgIHdoaWxlICgqdGFnKSB7CisgICAgICAgIGF2aW9fdzgocywgKnRhZysrKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcnYxMF93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhX3NpemUsIGludCBpbmRleF9wb3MpCit7CisgICAgUk1NdXhDb250ZXh0ICpybSA9IGN0eC0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpzID0gY3R4LT5wYjsKKyAgICBTdHJlYW1JbmZvICpzdHJlYW07CisgICAgdW5zaWduZWQgY2hhciAqZGF0YV9vZmZzZXRfcHRyLCAqc3RhcnRfcHRyOworICAgIGNvbnN0IGNoYXIgKmRlc2MsICptaW1ldHlwZTsKKyAgICBpbnQgbmJfcGFja2V0cywgcGFja2V0X3RvdGFsX3NpemUsIHBhY2tldF9tYXhfc2l6ZSwgc2l6ZSwgcGFja2V0X2F2Z19zaXplLCBpOworICAgIGludCBiaXRfcmF0ZSwgdiwgZHVyYXRpb24sIGZsYWdzLCBkYXRhX3BvczsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnOworCisgICAgc3RhcnRfcHRyID0gcy0+YnVmX3B0cjsKKworICAgIGZmaW9fd2ZvdXJjYyhzLCAiLlJNRiIpOworICAgIGF2aW9fd2IzMihzLDE4KTsgLyogaGVhZGVyIHNpemUgKi8KKyAgICBhdmlvX3diMTYocywwKTsKKyAgICBhdmlvX3diMzIocywwKTsKKyAgICBhdmlvX3diMzIocyw0ICsgY3R4LT5uYl9zdHJlYW1zKTsgLyogbnVtIGhlYWRlcnMgKi8KKworICAgIGZmaW9fd2ZvdXJjYyhzLCJQUk9QIik7CisgICAgYXZpb193YjMyKHMsIDUwKTsKKyAgICBhdmlvX3diMTYocywgMCk7CisgICAgcGFja2V0X21heF9zaXplID0gMDsKKyAgICBwYWNrZXRfdG90YWxfc2l6ZSA9IDA7CisgICAgbmJfcGFja2V0cyA9IDA7CisgICAgYml0X3JhdGUgPSAwOworICAgIGR1cmF0aW9uID0gMDsKKyAgICBmb3IoaT0wO2k8Y3R4LT5uYl9zdHJlYW1zO2krKykgeworICAgICAgICBTdHJlYW1JbmZvICpzdHJlYW0gPSAmcm0tPnN0cmVhbXNbaV07CisgICAgICAgIGJpdF9yYXRlICs9IHN0cmVhbS0+Yml0X3JhdGU7CisgICAgICAgIGlmIChzdHJlYW0tPnBhY2tldF9tYXhfc2l6ZSA+IHBhY2tldF9tYXhfc2l6ZSkKKyAgICAgICAgICAgIHBhY2tldF9tYXhfc2l6ZSA9IHN0cmVhbS0+cGFja2V0X21heF9zaXplOworICAgICAgICBuYl9wYWNrZXRzICs9IHN0cmVhbS0+bmJfcGFja2V0czsKKyAgICAgICAgcGFja2V0X3RvdGFsX3NpemUgKz0gc3RyZWFtLT5wYWNrZXRfdG90YWxfc2l6ZTsKKyAgICAgICAgLyogc2VsZWN0IG1heGltdW0gZHVyYXRpb24gKi8KKyAgICAgICAgdiA9IChpbnQpICgxMDAwLjAgKiAoZmxvYXQpc3RyZWFtLT50b3RhbF9mcmFtZXMgLyBzdHJlYW0tPmZyYW1lX3JhdGUpOworICAgICAgICBpZiAodiA+IGR1cmF0aW9uKQorICAgICAgICAgICAgZHVyYXRpb24gPSB2OworICAgIH0KKyAgICBhdmlvX3diMzIocywgYml0X3JhdGUpOyAvKiBtYXggYml0IHJhdGUgKi8KKyAgICBhdmlvX3diMzIocywgYml0X3JhdGUpOyAvKiBhdmcgYml0IHJhdGUgKi8KKyAgICBhdmlvX3diMzIocywgcGFja2V0X21heF9zaXplKTsgICAgICAgIC8qIG1heCBwYWNrZXQgc2l6ZSAqLworICAgIGlmIChuYl9wYWNrZXRzID4gMCkKKyAgICAgICAgcGFja2V0X2F2Z19zaXplID0gcGFja2V0X3RvdGFsX3NpemUgLyBuYl9wYWNrZXRzOworICAgIGVsc2UKKyAgICAgICAgcGFja2V0X2F2Z19zaXplID0gMDsKKyAgICBhdmlvX3diMzIocywgcGFja2V0X2F2Z19zaXplKTsgICAgICAgIC8qIGF2ZyBwYWNrZXQgc2l6ZSAqLworICAgIGF2aW9fd2IzMihzLCBuYl9wYWNrZXRzKTsgIC8qIG51bSBwYWNrZXRzICovCisgICAgYXZpb193YjMyKHMsIGR1cmF0aW9uKTsgLyogZHVyYXRpb24gKi8KKyAgICBhdmlvX3diMzIocywgQlVGRkVSX0RVUkFUSU9OKTsgICAgICAgICAgIC8qIHByZXJvbGwgKi8KKyAgICBhdmlvX3diMzIocywgaW5kZXhfcG9zKTsgICAgICAgICAgIC8qIGluZGV4IG9mZnNldCAqLworICAgIC8qIGNvbXB1dGF0aW9uIG9mIGRhdGEgdGhlIGRhdGEgb2Zmc2V0ICovCisgICAgZGF0YV9vZmZzZXRfcHRyID0gcy0+YnVmX3B0cjsKKyAgICBhdmlvX3diMzIocywgMCk7ICAgICAgICAgICAvKiBkYXRhIG9mZnNldCA6IHdpbGwgYmUgcGF0Y2hlZCBhZnRlciAqLworICAgIGF2aW9fd2IxNihzLCBjdHgtPm5iX3N0cmVhbXMpOyAgICAvKiBudW0gc3RyZWFtcyAqLworICAgIGZsYWdzID0gMSB8IDI7IC8qIHNhdmUgYWxsb3dlZCAmIHBlcmZlY3QgcGxheSAqLworICAgIGlmICghcy0+c2Vla2FibGUpCisgICAgICAgIGZsYWdzIHw9IDQ7IC8qIGxpdmUgYnJvYWRjYXN0ICovCisgICAgYXZpb193YjE2KHMsIGZsYWdzKTsKKworICAgIC8qIGNvbW1lbnRzICovCisKKyAgICBmZmlvX3dmb3VyY2MocywiQ09OVCIpOworICAgIHNpemUgPSAgNCAqIDIgKyAxMDsKKyAgICBmb3IoaT0wOyBpPEZGX0FSUkFZX0VMRU1TKGZmX3JtX21ldGFkYXRhKTsgaSsrKSB7CisgICAgICAgIHRhZyA9IGF2X2RpY3RfZ2V0KGN0eC0+bWV0YWRhdGEsIGZmX3JtX21ldGFkYXRhW2ldLCBOVUxMLCAwKTsKKyAgICAgICAgaWYodGFnKSBzaXplICs9IHN0cmxlbih0YWctPnZhbHVlKTsKKyAgICB9CisgICAgYXZpb193YjMyKHMsc2l6ZSk7CisgICAgYXZpb193YjE2KHMsMCk7CisgICAgZm9yKGk9MDsgaTxGRl9BUlJBWV9FTEVNUyhmZl9ybV9tZXRhZGF0YSk7IGkrKykgeworICAgICAgICB0YWcgPSBhdl9kaWN0X2dldChjdHgtPm1ldGFkYXRhLCBmZl9ybV9tZXRhZGF0YVtpXSwgTlVMTCwgMCk7CisgICAgICAgIHB1dF9zdHIocywgdGFnID8gdGFnLT52YWx1ZSA6ICIiKTsKKyAgICB9CisKKyAgICBmb3IoaT0wO2k8Y3R4LT5uYl9zdHJlYW1zO2krKykgeworICAgICAgICBpbnQgY29kZWNfZGF0YV9zaXplOworCisgICAgICAgIHN0cmVhbSA9ICZybS0+c3RyZWFtc1tpXTsKKworICAgICAgICBpZiAoc3RyZWFtLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBkZXNjID0gIlRoZSBBdWRpbyBTdHJlYW0iOworICAgICAgICAgICAgbWltZXR5cGUgPSAiYXVkaW8veC1wbi1yZWFsYXVkaW8iOworICAgICAgICAgICAgY29kZWNfZGF0YV9zaXplID0gNzM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXNjID0gIlRoZSBWaWRlbyBTdHJlYW0iOworICAgICAgICAgICAgbWltZXR5cGUgPSAidmlkZW8veC1wbi1yZWFsdmlkZW8iOworICAgICAgICAgICAgY29kZWNfZGF0YV9zaXplID0gMzQ7CisgICAgICAgIH0KKworICAgICAgICBmZmlvX3dmb3VyY2MocywiTURQUiIpOworICAgICAgICBzaXplID0gMTAgKyA5ICogNCArIHN0cmxlbihkZXNjKSArIHN0cmxlbihtaW1ldHlwZSkgKyBjb2RlY19kYXRhX3NpemU7CisgICAgICAgIGF2aW9fd2IzMihzLCBzaXplKTsKKyAgICAgICAgYXZpb193YjE2KHMsIDApOworCisgICAgICAgIGF2aW9fd2IxNihzLCBpKTsgLyogc3RyZWFtIG51bWJlciAqLworICAgICAgICBhdmlvX3diMzIocywgc3RyZWFtLT5iaXRfcmF0ZSk7IC8qIG1heCBiaXQgcmF0ZSAqLworICAgICAgICBhdmlvX3diMzIocywgc3RyZWFtLT5iaXRfcmF0ZSk7IC8qIGF2ZyBiaXQgcmF0ZSAqLworICAgICAgICBhdmlvX3diMzIocywgc3RyZWFtLT5wYWNrZXRfbWF4X3NpemUpOyAgICAgICAgLyogbWF4IHBhY2tldCBzaXplICovCisgICAgICAgIGlmIChzdHJlYW0tPm5iX3BhY2tldHMgPiAwKQorICAgICAgICAgICAgcGFja2V0X2F2Z19zaXplID0gc3RyZWFtLT5wYWNrZXRfdG90YWxfc2l6ZSAvCisgICAgICAgICAgICAgICAgc3RyZWFtLT5uYl9wYWNrZXRzOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYWNrZXRfYXZnX3NpemUgPSAwOworICAgICAgICBhdmlvX3diMzIocywgcGFja2V0X2F2Z19zaXplKTsgICAgICAgIC8qIGF2ZyBwYWNrZXQgc2l6ZSAqLworICAgICAgICBhdmlvX3diMzIocywgMCk7ICAgICAgICAgICAvKiBzdGFydCB0aW1lICovCisgICAgICAgIGF2aW9fd2IzMihzLCBCVUZGRVJfRFVSQVRJT04pOyAgICAgICAgICAgLyogcHJlcm9sbCAqLworICAgICAgICAvKiBkdXJhdGlvbiAqLworICAgICAgICBpZiAoIXMtPnNlZWthYmxlIHx8ICFzdHJlYW0tPnRvdGFsX2ZyYW1lcykKKyAgICAgICAgICAgIGF2aW9fd2IzMihzLCAoaW50KSgzNjAwICogMTAwMCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdmlvX3diMzIocywgKGludCkoc3RyZWFtLT50b3RhbF9mcmFtZXMgKiAxMDAwIC8gc3RyZWFtLT5mcmFtZV9yYXRlKSk7CisgICAgICAgIHB1dF9zdHI4KHMsIGRlc2MpOworICAgICAgICBwdXRfc3RyOChzLCBtaW1ldHlwZSk7CisgICAgICAgIGF2aW9fd2IzMihzLCBjb2RlY19kYXRhX3NpemUpOworCisgICAgICAgIGlmIChzdHJlYW0tPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGludCBjb2RlZF9mcmFtZV9zaXplLCBmc2NvZGUsIHNhbXBsZV9yYXRlOworICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSBzdHJlYW0tPmVuYy0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICBjb2RlZF9mcmFtZV9zaXplID0gKHN0cmVhbS0+ZW5jLT5iaXRfcmF0ZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+ZW5jLT5mcmFtZV9zaXplKSAvICg4ICogc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgLyogYXVkaW8gY29kZWMgaW5mbyAqLworICAgICAgICAgICAgYXZpb193cml0ZShzLCAiLnJhIiwgMyk7CisgICAgICAgICAgICBhdmlvX3c4KHMsIDB4ZmQpOworICAgICAgICAgICAgYXZpb193YjMyKHMsIDB4MDAwNDAwMDApOyAvKiB2ZXJzaW9uICovCisgICAgICAgICAgICBmZmlvX3dmb3VyY2MocywgIi5yYTQiKTsKKyAgICAgICAgICAgIGF2aW9fd2IzMihzLCAweDAxYjUzNTMwKTsgLyogc3RyZWFtIGxlbmd0aCAqLworICAgICAgICAgICAgYXZpb193YjE2KHMsIDQpOyAvKiB1bmtub3duICovCisgICAgICAgICAgICBhdmlvX3diMzIocywgMHgzOSk7IC8qIGhlYWRlciBzaXplICovCisKKyAgICAgICAgICAgIHN3aXRjaChzYW1wbGVfcmF0ZSkgeworICAgICAgICAgICAgY2FzZSA0ODAwMDoKKyAgICAgICAgICAgIGNhc2UgMjQwMDA6CisgICAgICAgICAgICBjYXNlIDEyMDAwOgorICAgICAgICAgICAgICAgIGZzY29kZSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2FzZSA0NDEwMDoKKyAgICAgICAgICAgIGNhc2UgMjIwNTA6CisgICAgICAgICAgICBjYXNlIDExMDI1OgorICAgICAgICAgICAgICAgIGZzY29kZSA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyMDAwOgorICAgICAgICAgICAgY2FzZSAxNjAwMDoKKyAgICAgICAgICAgIGNhc2UgODAwMDoKKyAgICAgICAgICAgICAgICBmc2NvZGUgPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb193YjE2KHMsIGZzY29kZSk7IC8qIGNvZGVjIGFkZGl0aW9uYWwgaW5mbywgZm9yIEFDLTMsIHNlZW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgYSBmcmVxdWVuY3kgY29kZSAqLworICAgICAgICAgICAgLyogc3BlY2lhbCBoYWNrIHRvIGNvbXBlbnNhdGUgcm91bmRpbmcgZXJyb3JzLi4uICovCisgICAgICAgICAgICBpZiAoY29kZWRfZnJhbWVfc2l6ZSA9PSA1NTcpCisgICAgICAgICAgICAgICAgY29kZWRfZnJhbWVfc2l6ZS0tOworICAgICAgICAgICAgYXZpb193YjMyKHMsIGNvZGVkX2ZyYW1lX3NpemUpOyAvKiBmcmFtZSBsZW5ndGggKi8KKyAgICAgICAgICAgIGF2aW9fd2IzMihzLCAweDUxNTQwKTsgLyogdW5rbm93biAqLworICAgICAgICAgICAgYXZpb193YjMyKHMsIHN0cmVhbS0+ZW5jLT5iaXRfcmF0ZSAvIDggKiA2MCk7IC8qIGJ5dGVzIHBlciBtaW51dGUgKi8KKyAgICAgICAgICAgIGF2aW9fd2IzMihzLCBzdHJlYW0tPmVuYy0+Yml0X3JhdGUgLyA4ICogNjApOyAvKiBieXRlcyBwZXIgbWludXRlICovCisgICAgICAgICAgICBhdmlvX3diMTYocywgMHgwMSk7CisgICAgICAgICAgICAvKiBmcmFtZSBsZW5ndGggOiBzZWVtcyB0byBiZSB2ZXJ5IGltcG9ydGFudCAqLworICAgICAgICAgICAgYXZpb193YjE2KHMsIGNvZGVkX2ZyYW1lX3NpemUpOworICAgICAgICAgICAgYXZpb193YjMyKHMsIDApOyAvKiB1bmtub3duICovCisgICAgICAgICAgICBhdmlvX3diMTYocywgc3RyZWFtLT5lbmMtPnNhbXBsZV9yYXRlKTsgLyogc2FtcGxlIHJhdGUgKi8KKyAgICAgICAgICAgIGF2aW9fd2IzMihzLCAweDEwKTsgLyogdW5rbm93biAqLworICAgICAgICAgICAgYXZpb193YjE2KHMsIHN0cmVhbS0+ZW5jLT5jaGFubmVscyk7CisgICAgICAgICAgICBwdXRfc3RyOChzLCAiSW50MCIpOyAvKiBjb2RlYyBuYW1lICovCisgICAgICAgICAgICBpZiAoc3RyZWFtLT5lbmMtPmNvZGVjX3RhZykgeworICAgICAgICAgICAgICAgIGF2aW9fdzgocywgNCk7IC8qIHRhZyBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICBhdmlvX3dsMzIocywgc3RyZWFtLT5lbmMtPmNvZGVjX3RhZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY29kZWMgdGFnXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmlvX3diMTYocywgMCk7IC8qIHRpdGxlIGxlbmd0aCAqLworICAgICAgICAgICAgYXZpb193YjE2KHMsIDApOyAvKiBhdXRob3IgbGVuZ3RoICovCisgICAgICAgICAgICBhdmlvX3diMTYocywgMCk7IC8qIGNvcHlyaWdodCBsZW5ndGggKi8KKyAgICAgICAgICAgIGF2aW9fdzgocywgMCk7IC8qIGVuZCBvZiBoZWFkZXIgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHZpZGVvIGNvZGVjIGluZm8gKi8KKyAgICAgICAgICAgIGF2aW9fd2IzMihzLDM0KTsgLyogc2l6ZSAqLworICAgICAgICAgICAgZmZpb193Zm91cmNjKHMsICJWSURPIik7CisgICAgICAgICAgICBpZihzdHJlYW0tPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlYxMCkKKyAgICAgICAgICAgICAgICBmZmlvX3dmb3VyY2MocywiUlYxMCIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZmaW9fd2ZvdXJjYyhzLCJSVjIwIik7CisgICAgICAgICAgICBhdmlvX3diMTYocywgc3RyZWFtLT5lbmMtPndpZHRoKTsKKyAgICAgICAgICAgIGF2aW9fd2IxNihzLCBzdHJlYW0tPmVuYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGF2aW9fd2IxNihzLCAoaW50KSBzdHJlYW0tPmZyYW1lX3JhdGUpOyAvKiBmcmFtZXMgcGVyIHNlY29uZHMgPyAqLworICAgICAgICAgICAgYXZpb193YjMyKHMsMCk7ICAgICAvKiB1bmtub3duIG1lYW5pbmcgKi8KKyAgICAgICAgICAgIGF2aW9fd2IxNihzLCAoaW50KSBzdHJlYW0tPmZyYW1lX3JhdGUpOyAgLyogdW5rbm93biBtZWFuaW5nICovCisgICAgICAgICAgICBhdmlvX3diMzIocywwKTsgICAgIC8qIHVua25vd24gbWVhbmluZyAqLworICAgICAgICAgICAgYXZpb193YjE2KHMsIDgpOyAgICAvKiB1bmtub3duIG1lYW5pbmcgKi8KKyAgICAgICAgICAgIC8qIFNlZW1zIHRvIGJlIHRoZSBjb2RlYyB2ZXJzaW9uOiBvbmx5IHVzZSBiYXNpYyBIMjYzLiBUaGUgbmV4dAorICAgICAgICAgICAgICAgdmVyc2lvbnMgc2VlbXMgdG8gYWRkIGEgZGlmZmVudGlhbCBEQyBjb2RpbmcgYXMgaW4KKyAgICAgICAgICAgICAgIE1QRUcuLi4gbm90aGluZyBuZXcgdW5kZXIgdGhlIHN1biAqLworICAgICAgICAgICAgaWYoc3RyZWFtLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWMTApCisgICAgICAgICAgICAgICAgYXZpb193YjMyKHMsMHgxMDAwMDAwMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZpb193YjMyKHMsMHgyMDEwMzAwMSk7CisgICAgICAgICAgICAvL2F2aW9fd2IzMihzLDB4MTAwMDMwMDApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGF0Y2ggZGF0YSBvZmZzZXQgZmllbGQgKi8KKyAgICBkYXRhX3BvcyA9IHMtPmJ1Zl9wdHIgLSBzdGFydF9wdHI7CisgICAgcm0tPmRhdGFfcG9zID0gZGF0YV9wb3M7CisgICAgZGF0YV9vZmZzZXRfcHRyWzBdID0gZGF0YV9wb3MgPj4gMjQ7CisgICAgZGF0YV9vZmZzZXRfcHRyWzFdID0gZGF0YV9wb3MgPj4gMTY7CisgICAgZGF0YV9vZmZzZXRfcHRyWzJdID0gZGF0YV9wb3MgPj4gODsKKyAgICBkYXRhX29mZnNldF9wdHJbM10gPSBkYXRhX3BvczsKKworICAgIC8qIGRhdGEgc3RyZWFtICovCisgICAgZmZpb193Zm91cmNjKHMsICJEQVRBIik7CisgICAgYXZpb193YjMyKHMsZGF0YV9zaXplICsgMTAgKyA4KTsKKyAgICBhdmlvX3diMTYocywwKTsKKworICAgIGF2aW9fd2IzMihzLCBuYl9wYWNrZXRzKTsgLyogbnVtYmVyIG9mIHBhY2tldHMgKi8KKyAgICBhdmlvX3diMzIocywwKTsgLyogbmV4dCBkYXRhIGhlYWRlciAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9wYWNrZXRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqY3R4LCBTdHJlYW1JbmZvICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsIGludCBrZXlfZnJhbWUpCit7CisgICAgaW50IHRpbWVzdGFtcDsKKyAgICBBVklPQ29udGV4dCAqcyA9IGN0eC0+cGI7CisKKyAgICBzdHJlYW0tPm5iX3BhY2tldHMrKzsKKyAgICBzdHJlYW0tPnBhY2tldF90b3RhbF9zaXplICs9IGxlbmd0aDsKKyAgICBpZiAobGVuZ3RoID4gc3RyZWFtLT5wYWNrZXRfbWF4X3NpemUpCisgICAgICAgIHN0cmVhbS0+cGFja2V0X21heF9zaXplID0gIGxlbmd0aDsKKworICAgIGF2aW9fd2IxNihzLDApOyAvKiB2ZXJzaW9uICovCisgICAgYXZpb193YjE2KHMsbGVuZ3RoICsgMTIpOworICAgIGF2aW9fd2IxNihzLCBzdHJlYW0tPm51bSk7IC8qIHN0cmVhbSBudW1iZXIgKi8KKyAgICB0aW1lc3RhbXAgPSAoMTAwMCAqIChmbG9hdClzdHJlYW0tPm5iX2ZyYW1lcykgLyBzdHJlYW0tPmZyYW1lX3JhdGU7CisgICAgYXZpb193YjMyKHMsIHRpbWVzdGFtcCk7IC8qIHRpbWVzdGFtcCAqLworICAgIGF2aW9fdzgocywgMCk7IC8qIHJlc2VydmVkICovCisgICAgYXZpb193OChzLCBrZXlfZnJhbWUgPyAyIDogMCk7IC8qIGZsYWdzICovCit9CisKK3N0YXRpYyBpbnQgcm1fd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBSTU11eENvbnRleHQgKnJtID0gcy0+cHJpdl9kYXRhOworICAgIFN0cmVhbUluZm8gKnN0cmVhbTsKKyAgICBpbnQgbjsKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWM7CisKKyAgICBpZiAocy0+bmJfc3RyZWFtcyA+IDIpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkF0IG1vc3QgMiBzdHJlYW1zIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBtdXhpbmcgaW4gUk1cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgZm9yKG49MDtuPHMtPm5iX3N0cmVhbXM7bisrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbbl07CisKKyAgICAgICAgcy0+c3RyZWFtc1tuXS0+aWQgPSBuOworICAgICAgICBjb2RlYyA9IHMtPnN0cmVhbXNbbl0tPmNvZGVjOworICAgICAgICBzdHJlYW0gPSAmcm0tPnN0cmVhbXNbbl07CisgICAgICAgIG1lbXNldChzdHJlYW0sIDAsIHNpemVvZihTdHJlYW1JbmZvKSk7CisgICAgICAgIHN0cmVhbS0+bnVtID0gbjsKKyAgICAgICAgc3RyZWFtLT5iaXRfcmF0ZSA9IGNvZGVjLT5iaXRfcmF0ZTsKKyAgICAgICAgc3RyZWFtLT5lbmMgPSBjb2RlYzsKKworICAgICAgICBzd2l0Y2goY29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICBybS0+YXVkaW9fc3RyZWFtID0gc3RyZWFtOworICAgICAgICAgICAgc3RyZWFtLT5mcmFtZV9yYXRlID0gKGZsb2F0KWNvZGVjLT5zYW1wbGVfcmF0ZSAvIChmbG9hdCljb2RlYy0+ZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgIC8qIFhYWDogZHVtbXkgdmFsdWVzICovCisgICAgICAgICAgICBzdHJlYW0tPnBhY2tldF9tYXhfc2l6ZSA9IDEwMjQ7CisgICAgICAgICAgICBzdHJlYW0tPm5iX3BhY2tldHMgPSAwOworICAgICAgICAgICAgc3RyZWFtLT50b3RhbF9mcmFtZXMgPSBzdHJlYW0tPm5iX3BhY2tldHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICBybS0+dmlkZW9fc3RyZWFtID0gc3RyZWFtOworICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIGJlIGF2Z19mcmFtZV9yYXRlCisgICAgICAgICAgICBzdHJlYW0tPmZyYW1lX3JhdGUgPSAoZmxvYXQpc3QtPnRpbWVfYmFzZS5kZW4gLyAoZmxvYXQpc3QtPnRpbWVfYmFzZS5udW07CisgICAgICAgICAgICAvKiBYWFg6IGR1bW15IHZhbHVlcyAqLworICAgICAgICAgICAgc3RyZWFtLT5wYWNrZXRfbWF4X3NpemUgPSA0MDk2OworICAgICAgICAgICAgc3RyZWFtLT5uYl9wYWNrZXRzID0gMDsKKyAgICAgICAgICAgIHN0cmVhbS0+dG90YWxfZnJhbWVzID0gc3RyZWFtLT5uYl9wYWNrZXRzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocnYxMF93cml0ZV9oZWFkZXIocywgMCwgMCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGF2aW9fZmx1c2gocy0+cGIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJtX3dyaXRlX2F1ZGlvKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworICAgIHVpbnQ4X3QgKmJ1ZjE7CisgICAgUk1NdXhDb250ZXh0ICpybSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBTdHJlYW1JbmZvICpzdHJlYW0gPSBybS0+YXVkaW9fc3RyZWFtOworICAgIGludCBpOworCisgICAgLyogWFhYOiBzdXBwcmVzcyB0aGlzIG1hbGxvYyAqLworICAgIGJ1ZjEgPSBhdl9tYWxsb2Moc2l6ZSAqIHNpemVvZih1aW50OF90KSk7CisKKyAgICB3cml0ZV9wYWNrZXRfaGVhZGVyKHMsIHN0cmVhbSwgc2l6ZSwgISEoZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKTsKKworICAgIGlmIChzdHJlYW0tPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKSB7CisgICAgICAgIC8qIGZvciBBQy0zLCB0aGUgd29yZHMgc2VlbSB0byBiZSByZXZlcnNlZCAqLworICAgICAgICBmb3IoaT0wO2k8c2l6ZTtpKz0yKSB7CisgICAgICAgICAgICBidWYxW2ldID0gYnVmW2krMV07CisgICAgICAgICAgICBidWYxW2krMV0gPSBidWZbaV07CisgICAgICAgIH0KKyAgICAgICAgYXZpb193cml0ZShwYiwgYnVmMSwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZpb193cml0ZShwYiwgYnVmLCBzaXplKTsKKyAgICB9CisgICAgc3RyZWFtLT5uYl9mcmFtZXMrKzsKKyAgICBhdl9mcmVlKGJ1ZjEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJtX3dyaXRlX3ZpZGVvKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworICAgIFJNTXV4Q29udGV4dCAqcm0gPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgU3RyZWFtSW5mbyAqc3RyZWFtID0gcm0tPnZpZGVvX3N0cmVhbTsKKyAgICBpbnQga2V5X2ZyYW1lID0gISEoZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpOworCisgICAgLyogWFhYOiB0aGlzIGlzIGluY29ycmVjdDogc2hvdWxkIGJlIGEgcGFyYW1ldGVyICovCisKKyAgICAvKiBXZWxsLCBJIHNwZW50IHNvbWUgdGltZSBmaW5kaW5nIHRoZSBtZWFuaW5nIG9mIHRoZXNlIGJpdHMuIEkgYW0KKyAgICAgICBub3Qgc3VyZSBJIHVuZGVyc3Rvb2QgZXZlcnl0aGluZywgYnV0IGl0IHdvcmtzICEhICovCisjaWYgMQorICAgIHdyaXRlX3BhY2tldF9oZWFkZXIocywgc3RyZWFtLCBzaXplICsgNyArIChzaXplID49IDB4NDAwMCkqNCwga2V5X2ZyYW1lKTsKKyAgICAvKiBiaXQgNzogJzEnIGlmIGZpbmFsIHBhY2tldCBvZiBhIGZyYW1lIGNvbnZlcnRlZCBpbiBzZXZlcmFsIHBhY2tldHMgKi8KKyAgICBhdmlvX3c4KHBiLCAweDgxKTsKKyAgICAvKiBiaXQgNzogJzEnIGlmIEkgZnJhbWUuIGJpdHMgNi4uMCA6IHNlcXVlbmNlIG51bWJlciBpbiBjdXJyZW50CisgICAgICAgZnJhbWUgc3RhcnRpbmcgZnJvbSAxICovCisgICAgaWYgKGtleV9mcmFtZSkgeworICAgICAgICBhdmlvX3c4KHBiLCAweDgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3c4KHBiLCAweDAxKTsKKyAgICB9CisgICAgaWYoc2l6ZSA+PSAweDQwMDApeworICAgICAgICBhdmlvX3diMzIocGIsIHNpemUpOyAvKiB0b3RhbCBmcmFtZSBzaXplICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgc2l6ZSk7IC8qIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvciB0aGUgZW5kICovCisgICAgfWVsc2V7CisgICAgICAgIGF2aW9fd2IxNihwYiwgMHg0MDAwIHwgc2l6ZSk7IC8qIHRvdGFsIGZyYW1lIHNpemUgKi8KKyAgICAgICAgYXZpb193YjE2KHBiLCAweDQwMDAgfCBzaXplKTsgLyogb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9yIHRoZSBlbmQgKi8KKyAgICB9CisjZWxzZQorICAgIC8qIGZ1bGwgZnJhbWUgKi8KKyAgICB3cml0ZV9wYWNrZXRfaGVhZGVyKHMsIHNpemUgKyA2KTsKKyAgICBhdmlvX3c4KHBiLCAweGMwKTsKKyAgICBhdmlvX3diMTYocGIsIDB4NDAwMCArIHNpemUpOyAvKiB0b3RhbCBmcmFtZSBzaXplICovCisgICAgYXZpb193YjE2KHBiLCAweDQwMDAgKyBwYWNrZXRfbnVtYmVyICogMTI2KTsgLyogcG9zaXRpb24gaW4gc3RyZWFtICovCisjZW5kaWYKKyAgICBhdmlvX3c4KHBiLCBzdHJlYW0tPm5iX2ZyYW1lcyAmIDB4ZmYpOworCisgICAgYXZpb193cml0ZShwYiwgYnVmLCBzaXplKTsKKworICAgIHN0cmVhbS0+bmJfZnJhbWVzKys7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm1fd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpZiAocy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlID09CisgICAgICAgIEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgcmV0dXJuIHJtX3dyaXRlX2F1ZGlvKHMsIHBrdC0+ZGF0YSwgcGt0LT5zaXplLCBwa3QtPmZsYWdzKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBybV93cml0ZV92aWRlbyhzLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwgcGt0LT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcm1fd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUk1NdXhDb250ZXh0ICpybSA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgZGF0YV9zaXplLCBpbmRleF9wb3MsIGk7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICBpZiAocy0+cGItPnNlZWthYmxlKSB7CisgICAgICAgIC8qIGVuZCBvZiBmaWxlOiBmaW5pc2ggdG8gd3JpdGUgaGVhZGVyICovCisgICAgICAgIGluZGV4X3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGRhdGFfc2l6ZSA9IGluZGV4X3BvcyAtIHJtLT5kYXRhX3BvczsKKworICAgICAgICAvKiBGSVhNRTogd3JpdGUgaW5kZXggKi8KKworICAgICAgICAvKiB1bmRvY3VtZW50ZWQgZW5kIGhlYWRlciAqLworICAgICAgICBhdmlvX3diMzIocGIsIDApOworICAgICAgICBhdmlvX3diMzIocGIsIDApOworCisgICAgICAgIGF2aW9fc2VlayhwYiwgMCwgU0VFS19TRVQpOworICAgICAgICBmb3IoaT0wO2k8cy0+bmJfc3RyZWFtcztpKyspCisgICAgICAgICAgICBybS0+c3RyZWFtc1tpXS50b3RhbF9mcmFtZXMgPSBybS0+c3RyZWFtc1tpXS5uYl9mcmFtZXM7CisgICAgICAgIHJ2MTBfd3JpdGVfaGVhZGVyKHMsIGRhdGFfc2l6ZSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogdW5kb2N1bWVudGVkIGVuZCBoZWFkZXIgKi8KKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitBVk91dHB1dEZvcm1hdCBmZl9ybV9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAicm0iLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZWFsTWVkaWEiKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAiYXBwbGljYXRpb24vdm5kLnJuLXJlYWxtZWRpYSIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gInJtLHJhIiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoUk1NdXhDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9BQzMsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUlYxMCwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBybV93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gcm1fd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IHJtX3dyaXRlX3RyYWlsZXIsCisgICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgZmZfcm1fY29kZWNfdGFncywgMCB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ybXNpcHIuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ybXNpcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGVjOGVhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jtc2lwci5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiB0YWJsZXMgYW5kIGZ1bmN0aW9ucyBmb3IgZGVtdXhpbmcgU0lQUiBhdWRpbyBtdXhlZCBSZWFsTWVkaWEgc3R5bGUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAicm1zaXByLmgiCisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgZmZfc2lwcl9zdWJwa19zaXplWzRdID0geyAyOSwgMTksIDM3LCAyMCB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzaXByX3N3YXBzWzM4XVsyXSA9IHsKKyAgICB7ICAwLCA2MyB9LCB7ICAxLCAyMiB9LCB7ICAyLCA0NCB9LCB7ICAzLCA5MCB9LAorICAgIHsgIDUsIDgxIH0sIHsgIDcsIDMxIH0sIHsgIDgsIDg2IH0sIHsgIDksIDU4IH0sCisgICAgeyAxMCwgMzYgfSwgeyAxMiwgNjggfSwgeyAxMywgMzkgfSwgeyAxNCwgNzMgfSwKKyAgICB7IDE1LCA1MyB9LCB7IDE2LCA2OSB9LCB7IDE3LCA1NyB9LCB7IDE5LCA4OCB9LAorICAgIHsgMjAsIDM0IH0sIHsgMjEsIDcxIH0sIHsgMjQsIDQ2IH0sIHsgMjUsIDk0IH0sCisgICAgeyAyNiwgNTQgfSwgeyAyOCwgNzUgfSwgeyAyOSwgNTAgfSwgeyAzMiwgNzAgfSwKKyAgICB7IDMzLCA5MiB9LCB7IDM1LCA3NCB9LCB7IDM4LCA4NSB9LCB7IDQwLCA1NiB9LAorICAgIHsgNDIsIDg3IH0sIHsgNDMsIDY1IH0sIHsgNDUsIDU5IH0sIHsgNDgsIDc5IH0sCisgICAgeyA0OSwgOTMgfSwgeyA1MSwgODkgfSwgeyA1NSwgOTUgfSwgeyA2MSwgNzYgfSwKKyAgICB7IDY3LCA4MyB9LCB7IDc3LCA4MCB9Cit9OworCisvKiBUaGlzIGNhbiBiZSBvcHRpbWl6ZWQsIGUuZy4gdXNlIG1lbWNweSgpIGlmIGRhdGEgYmxvY2tzIGFyZSBhbGlnbmVkLiAqLwordm9pZCBmZl9ybV9yZW9yZGVyX3NpcHJfZGF0YSh1aW50OF90ICpidWYsIGludCBzdWJfcGFja2V0X2gsIGludCBmcmFtZXNpemUpCit7CisgICAgaW50IG4sIGJzID0gc3ViX3BhY2tldF9oICogZnJhbWVzaXplICogMiAvIDk2OyAvLyBuaWJibGVzIHBlciBzdWJwYWNrZXQKKworICAgIGZvciAobiA9IDA7IG4gPCAzODsgbisrKSB7CisgICAgICAgIGludCBqOworICAgICAgICBpbnQgaSA9IGJzICogc2lwcl9zd2Fwc1tuXVswXTsKKyAgICAgICAgaW50IG8gPSBicyAqIHNpcHJfc3dhcHNbbl1bMV07CisKKyAgICAgICAgLyogc3dhcCA0Yml0LW5pYmJsZXMgb2YgYmxvY2sgJ2knIHdpdGggJ28nICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBiczsgaisrLCBpKyssIG8rKykgeworICAgICAgICAgICAgaW50IHggPSAoYnVmW2kgPj4gMV0gPj4gKDQgKiAoaSAmIDEpKSkgJiAweEYsCisgICAgICAgICAgICAgICAgeSA9IChidWZbbyA+PiAxXSA+PiAoNCAqIChvICYgMSkpKSAmIDB4RjsKKworICAgICAgICAgICAgYnVmW28gPj4gMV0gPSAoeCA8PCAoNCAqIChvICYgMSkpKSB8CisgICAgICAgICAgICAgICAgKGJ1ZltvID4+IDFdICYgKDB4RiA8PCAoNCAqICEobyAmIDEpKSkpOworICAgICAgICAgICAgYnVmW2kgPj4gMV0gPSAoeSA8PCAoNCAqIChpICYgMSkpKSB8CisgICAgICAgICAgICAgICAgKGJ1ZltpID4+IDFdICYgKDB4RiA8PCAoNCAqICEoaSAmIDEpKSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jtc2lwci5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jtc2lwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MzczMzYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcm1zaXByLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIHRhYmxlcyBhbmQgZnVuY3Rpb25zIGZvciBkZW11eGluZyBTSVBSIGF1ZGlvIG11eGVkIFJlYWxNZWRpYSBzdHlsZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1JNU0lQUl9ICisjZGVmaW5lIEFWRk9STUFUX1JNU0lQUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZmZfc2lwcl9zdWJwa19zaXplWzRdOworCisvKioKKyAqIFBlcmZvcm0gNC1iaXQgYmxvY2sgcmVvcmRlcmluZyBmb3IgU0lQUiBkYXRhLgorICoKKyAqIEBwYXJhbSBidWYgU0lQUiBkYXRhCisgKi8KK3ZvaWQgZmZfcm1fcmVvcmRlcl9zaXByX2RhdGEodWludDhfdCAqYnVmLCBpbnQgc3ViX3BhY2tldF9oLCBpbnQgZnJhbWVzaXplKTsKKworI2VuZGlmIC8qIEFWRk9STUFUX1JNU0lQUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnBsLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyMjllOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ycGwuYwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIEFSTW92aWUvUlBMIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaHJpc3RpYW4gT2htLCAyMDA4IEVsaSBGcmllZG1hbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFJQTF9TSUdOQVRVUkUgIkFSTW92aWVceDBBIgorI2RlZmluZSBSUExfU0lHTkFUVVJFX1NJWkUgOAorCisvKiogMjU2IGlzIGFyYml0cmFyeSwgYnV0IHNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciBhbnkgcmVhc29uYWJsZSBmaWxlLiAqLworI2RlZmluZSBSUExfTElORV9MRU5HVEggMjU2CisKK3N0YXRpYyBpbnQgcnBsX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChtZW1jbXAocC0+YnVmLCBSUExfU0lHTkFUVVJFLCBSUExfU0lHTkFUVVJFX1NJWkUpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgUlBMQ29udGV4dCB7CisgICAgLy8gUlBMIGhlYWRlciBkYXRhCisgICAgaW50MzJfdCBmcmFtZXNfcGVyX2NodW5rOworCisgICAgLy8gU3RyZWFtIHBvc2l0aW9uIGRhdGEKKyAgICB1aW50MzJfdCBjaHVua19udW1iZXI7CisgICAgdWludDMyX3QgY2h1bmtfcGFydDsKKyAgICB1aW50MzJfdCBmcmFtZV9pbl9wYXJ0OworfSBSUExDb250ZXh0OworCitzdGF0aWMgaW50IHJlYWRfbGluZShBVklPQ29udGV4dCAqIHBiLCBjaGFyKiBsaW5lLCBpbnQgYnVmc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmc2l6ZSAtIDE7IGkrKykgeworICAgICAgICBpbnQgYiA9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAoYiA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChiID09ICdcbicpIHsKKyAgICAgICAgICAgIGxpbmVbaV0gPSAnXDAnOworICAgICAgICAgICAgcmV0dXJuIGF2aW9fZmVvZihwYikgPyAtMSA6IDA7CisgICAgICAgIH0KKyAgICAgICAgbGluZVtpXSA9IGI7CisgICAgfQorICAgIGxpbmVbaV0gPSAnXDAnOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludDMyX3QgcmVhZF9pbnQoY29uc3QgY2hhciogbGluZSwgY29uc3QgY2hhcioqIGVuZHB0ciwgaW50KiBlcnJvcikKK3sKKyAgICB1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisgICAgZm9yICg7ICpsaW5lPj0nMCcgJiYgKmxpbmU8PSc5JzsgbGluZSsrKSB7CisgICAgICAgIGlmIChyZXN1bHQgPiAoMHg3RkZGRkZGRiAtIDkpIC8gMTApCisgICAgICAgICAgICAqZXJyb3IgPSAtMTsKKyAgICAgICAgcmVzdWx0ID0gMTAgKiByZXN1bHQgKyAqbGluZSAtICcwJzsKKyAgICB9CisgICAgKmVuZHB0ciA9IGxpbmU7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludDMyX3QgcmVhZF9saW5lX2FuZF9pbnQoQVZJT0NvbnRleHQgKiBwYiwgaW50KiBlcnJvcikKK3sKKyAgICBjaGFyIGxpbmVbUlBMX0xJTkVfTEVOR1RIXTsKKyAgICBjb25zdCBjaGFyICplbmRwdHI7CisgICAgKmVycm9yIHw9IHJlYWRfbGluZShwYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKyAgICByZXR1cm4gcmVhZF9pbnQobGluZSwgJmVuZHB0ciwgZXJyb3IpOworfQorCisvKiogUGFyc2luZyBmb3IgZnBzLCB3aGljaCBjYW4gYmUgYSBmcmFjdGlvbi4gVW5mb3J0dW5hdGVseSwKKyAgKiB0aGUgc3BlYyBmb3IgdGhlIGhlYWRlciBsZWF2ZXMgb3V0IGEgbG90IG9mIGRldGFpbHMsCisgICogc28gdGhpcyBpcyBtb3N0bHkgZ3Vlc3NpbmcuCisgICovCitzdGF0aWMgQVZSYXRpb25hbCByZWFkX2Zwcyhjb25zdCBjaGFyKiBsaW5lLCBpbnQqIGVycm9yKQoreworICAgIGludDY0X3QgbnVtLCBkZW4gPSAxOworICAgIEFWUmF0aW9uYWwgcmVzdWx0OworICAgIG51bSA9IHJlYWRfaW50KGxpbmUsICZsaW5lLCBlcnJvcik7CisgICAgaWYgKCpsaW5lID09ICcuJykKKyAgICAgICAgbGluZSsrOworICAgIGZvciAoOyAqbGluZT49JzAnICYmICpsaW5lPD0nOSc7IGxpbmUrKykgeworICAgICAgICAvLyBUcnVuY2F0ZSBhbnkgbnVtZXJhdG9yIHRvbyBsYXJnZSB0byBmaXQgaW50byBhbiBpbnQ2NF90CisgICAgICAgIGlmIChudW0gPiAoSU5UNjRfTUFYIC0gOSkgLyAxMCB8fCBkZW4gPiBJTlQ2NF9NQVggLyAxMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBudW0gID0gMTAgKiBudW0gKyAqbGluZSAtICcwJzsKKyAgICAgICAgZGVuICo9IDEwOworICAgIH0KKyAgICBpZiAoIW51bSkKKyAgICAgICAgKmVycm9yID0gLTE7CisgICAgYXZfcmVkdWNlKCZyZXN1bHQubnVtLCAmcmVzdWx0LmRlbiwgbnVtLCBkZW4sIDB4N0ZGRkZGRkYpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcnBsX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBSUExDb250ZXh0ICpycGwgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnZzdCA9IE5VTEwsICphc3QgPSBOVUxMOworICAgIGludCB0b3RhbF9hdWRpb19zaXplOworICAgIGludCBlcnJvciA9IDA7CisKKyAgICB1aW50MzJfdCBpOworCisgICAgaW50MzJfdCBhdWRpb19mb3JtYXQsIGNodW5rX2NhdGFsb2dfb2Zmc2V0LCBudW1iZXJfb2ZfY2h1bmtzOworICAgIEFWUmF0aW9uYWwgZnBzOworCisgICAgY2hhciBsaW5lW1JQTF9MSU5FX0xFTkdUSF07CisKKyAgICAvLyBUaGUgaGVhZGVyIGZvciBSUEwvQVJNb3ZpZSBmaWxlcyBpcyAyMSBsaW5lcyBvZiB0ZXh0CisgICAgLy8gY29udGFpbmluZyB0aGUgdmFyaW91cyBoZWFkZXIgZmllbGRzLiAgVGhlIGZpZWxkcyBhcmUgYWx3YXlzCisgICAgLy8gaW4gdGhlIHNhbWUgb3JkZXIsIGFuZCBvdGhlciB0ZXh0IGJlc2lkZXMgdGhlIGZpcnN0CisgICAgLy8gbnVtYmVyIHVzdWFsbHkgaXNuJ3QgaW1wb3J0YW50LgorICAgIC8vIChUaGUgc3BlYyBzYXlzIHRoYXQgdGhlcmUgZXhpc3RzIHNvbWUgc2lnbmlmaWNhbmNlCisgICAgLy8gZm9yIHRoZSB0ZXh0IGluIGEgZmV3IGNhc2VzOyBzYW1wbGVzIG5lZWRlZC4pCisgICAgZXJyb3IgfD0gcmVhZF9saW5lKHBiLCBsaW5lLCBzaXplb2YobGluZSkpOyAgICAgIC8vIEFSTW92aWUKKyAgICBlcnJvciB8PSByZWFkX2xpbmUocGIsIGxpbmUsIHNpemVvZihsaW5lKSk7ICAgICAgLy8gbW92aWUgbmFtZQorICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgInRpdGxlIiAgICAsIGxpbmUsIDApOworICAgIGVycm9yIHw9IHJlYWRfbGluZShwYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsgICAgICAvLyBkYXRlL2NvcHlyaWdodAorICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgImNvcHlyaWdodCIsIGxpbmUsIDApOworICAgIGVycm9yIHw9IHJlYWRfbGluZShwYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsgICAgICAvLyBhdXRob3IgYW5kIG90aGVyCisgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCAiYXV0aG9yIiAgICwgbGluZSwgMCk7CisKKyAgICAvLyB2aWRlbyBoZWFkZXJzCisgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXZzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdnN0LT5jb2RlYy0+Y29kZWNfdGFnICAgICAgID0gcmVhZF9saW5lX2FuZF9pbnQocGIsICZlcnJvcik7ICAvLyB2aWRlbyBmb3JtYXQKKyAgICB2c3QtPmNvZGVjLT53aWR0aCAgICAgICAgICAgPSByZWFkX2xpbmVfYW5kX2ludChwYiwgJmVycm9yKTsgIC8vIHZpZGVvIHdpZHRoCisgICAgdnN0LT5jb2RlYy0+aGVpZ2h0ICAgICAgICAgID0gcmVhZF9saW5lX2FuZF9pbnQocGIsICZlcnJvcik7ICAvLyB2aWRlbyBoZWlnaHQKKyAgICB2c3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSByZWFkX2xpbmVfYW5kX2ludChwYiwgJmVycm9yKTsgIC8vIHZpZGVvIGJpdHMgcGVyIHNhbXBsZQorICAgIGVycm9yIHw9IHJlYWRfbGluZShwYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8gZnJhbWVzIHBlciBzZWNvbmQKKyAgICBmcHMgPSByZWFkX2ZwcyhsaW5lLCAmZXJyb3IpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCAzMiwgZnBzLmRlbiwgZnBzLm51bSk7CisKKyAgICAvLyBGaWd1cmUgb3V0IHRoZSB2aWRlbyBjb2RlYworICAgIHN3aXRjaCAodnN0LT5jb2RlYy0+Y29kZWNfdGFnKSB7CisjaWYgMAorICAgICAgICBjYXNlIDEyMjoKKyAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRVNDQVBFMTIyOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgY2FzZSAxMjQ6CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0VTQ0FQRTEyNDsKKyAgICAgICAgICAgIC8vIFRoZSBoZWFkZXIgaXMgd3JvbmcgaGVyZSwgYXQgbGVhc3Qgc29tZXRpbWVzCisgICAgICAgICAgICB2c3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzMDoKKyAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRVNDQVBFMTMwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLCAiVmlkZW8gZm9ybWF0ICVpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyk7CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7CisgICAgfQorCisgICAgLy8gQXVkaW8gaGVhZGVycworCisgICAgLy8gQVJNb3ZpZSBzdXBwb3J0cyBtdWx0aXBsZSBhdWRpbyB0cmFja3M7IEkgZG9uJ3QgaGF2ZSBhbnkKKyAgICAvLyBzYW1wbGVzLCB0aG91Z2guIFRoaXMgY29kZSB3aWxsIGlnbm9yZSBhZGRpdGlvbmFsIHRyYWNrcy4KKyAgICBhdWRpb19mb3JtYXQgPSByZWFkX2xpbmVfYW5kX2ludChwYiwgJmVycm9yKTsgIC8vIGF1ZGlvIGZvcm1hdCBJRAorICAgIGlmIChhdWRpb19mb3JtYXQpIHsKKyAgICAgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCFhc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX3RhZyAgICAgICA9IGF1ZGlvX2Zvcm1hdDsKKyAgICAgICAgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgID0gcmVhZF9saW5lX2FuZF9pbnQocGIsICZlcnJvcik7ICAvLyBhdWRpbyBiaXRyYXRlCisgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICA9IHJlYWRfbGluZV9hbmRfaW50KHBiLCAmZXJyb3IpOyAgLy8gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzCisgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IHJlYWRfbGluZV9hbmRfaW50KHBiLCAmZXJyb3IpOyAgLy8gYXVkaW8gYml0cyBwZXIgc2FtcGxlCisgICAgICAgIC8vIEF0IGxlYXN0IG9uZSBzYW1wbGUgdXNlcyAwIGZvciBBRFBDTSwgd2hpY2ggaXMgcmVhbGx5IDQgYml0cworICAgICAgICAvLyBwZXIgc2FtcGxlLgorICAgICAgICBpZiAoYXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDApCisgICAgICAgICAgICBhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA0OworCisgICAgICAgIGFzdC0+Y29kZWMtPmJpdF9yYXRlID0gYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHM7CisKKyAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOworICAgICAgICBzd2l0Y2ggKGF1ZGlvX2Zvcm1hdCkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmIChhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gMTYtYml0IGF1ZGlvIGlzIGFsd2F5cyBzaWduZWQKKyAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgc29tZSBvdGhlciBmb3JtYXRzIGxpc3RlZCBhcyBsZWdhbCBwZXIgdGhlIHNwZWM7CisgICAgICAgICAgICAgICAgLy8gc2FtcGxlcyBuZWVkZWQuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMToKKyAgICAgICAgICAgICAgICBpZiAoYXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNhbXBsZXMgd2l0aCB0aGlzIGtpbmQgb2YgYXVkaW8gdGhhdCBJIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJlIGFsbCB1bnNpZ25lZC4KKyAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfRUFfU0VBRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChhc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJBdWRpbyBmb3JtYXQgJSJQUklkMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0KTsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDMyLCAxLCBhc3QtPmNvZGVjLT5iaXRfcmF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIGVycm9yIHw9IHJlYWRfbGluZShwYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKyAgICB9CisKKyAgICBycGwtPmZyYW1lc19wZXJfY2h1bmsgPSByZWFkX2xpbmVfYW5kX2ludChwYiwgJmVycm9yKTsgIC8vIHZpZGVvIGZyYW1lcyBwZXIgY2h1bmsKKyAgICBpZiAocnBsLT5mcmFtZXNfcGVyX2NodW5rID4gMSAmJiB2c3QtPmNvZGVjLT5jb2RlY190YWcgIT0gMTI0KQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiRG9uJ3Qga25vdyBob3cgdG8gc3BsaXQgZnJhbWVzIGZvciB2aWRlbyBmb3JtYXQgJWkuICIKKyAgICAgICAgICAgICAgICJWaWRlbyBzdHJlYW0gd2lsbCBiZSBicm9rZW4hXG4iLCB2c3QtPmNvZGVjLT5jb2RlY190YWcpOworCisgICAgbnVtYmVyX29mX2NodW5rcyA9IHJlYWRfbGluZV9hbmRfaW50KHBiLCAmZXJyb3IpOyAgLy8gbnVtYmVyIG9mIGNodW5rcyBpbiB0aGUgZmlsZQorICAgIC8vIFRoZSBudW1iZXIgaW4gdGhlIGhlYWRlciBpcyBhY3R1YWxseSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2h1bmsuCisgICAgbnVtYmVyX29mX2NodW5rcysrOworCisgICAgZXJyb3IgfD0gcmVhZF9saW5lKHBiLCBsaW5lLCBzaXplb2YobGluZSkpOyAgLy8gImV2ZW4iIGNodW5rIHNpemUgaW4gYnl0ZXMKKyAgICBlcnJvciB8PSByZWFkX2xpbmUocGIsIGxpbmUsIHNpemVvZihsaW5lKSk7ICAvLyAib2RkIiBjaHVuayBzaXplIGluIGJ5dGVzCisgICAgY2h1bmtfY2F0YWxvZ19vZmZzZXQgPSAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IG9mIHRoZSAiY2h1bmsgY2F0YWxvZyIKKyAgICAgICAgcmVhZF9saW5lX2FuZF9pbnQocGIsICZlcnJvcik7ICAgICAgICAgICAvLyAgIChmaWxlIGluZGV4KQorICAgIGVycm9yIHw9IHJlYWRfbGluZShwYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsgIC8vIG9mZnNldCB0byAiaGVscGZ1bCIgc3ByaXRlCisgICAgZXJyb3IgfD0gcmVhZF9saW5lKHBiLCBsaW5lLCBzaXplb2YobGluZSkpOyAgLy8gc2l6ZSBvZiAiaGVscGZ1bCIgc3ByaXRlCisgICAgZXJyb3IgfD0gcmVhZF9saW5lKHBiLCBsaW5lLCBzaXplb2YobGluZSkpOyAgLy8gb2Zmc2V0IHRvIGtleSBmcmFtZSBsaXN0CisKKyAgICAvLyBSZWFkIHRoZSBpbmRleAorICAgIGF2aW9fc2VlayhwYiwgY2h1bmtfY2F0YWxvZ19vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICB0b3RhbF9hdWRpb19zaXplID0gMDsKKyAgICBmb3IgKGkgPSAwOyAhZXJyb3IgJiYgaSA8IG51bWJlcl9vZl9jaHVua3M7IGkrKykgeworICAgICAgICBpbnQ2NF90IG9mZnNldCwgdmlkZW9fc2l6ZSwgYXVkaW9fc2l6ZTsKKyAgICAgICAgZXJyb3IgfD0gcmVhZF9saW5lKHBiLCBsaW5lLCBzaXplb2YobGluZSkpOworICAgICAgICBpZiAoMyAhPSBzc2NhbmYobGluZSwgIiUiU0NOZDY0IiAsICUiU0NOZDY0IiA7ICUiU0NOZDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwgJnZpZGVvX3NpemUsICZhdWRpb19zaXplKSkgeworICAgICAgICAgICAgZXJyb3IgPSAtMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeSh2c3QsIG9mZnNldCwgaSAqIHJwbC0+ZnJhbWVzX3Blcl9jaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX3NpemUsIHJwbC0+ZnJhbWVzX3Blcl9jaHVuaywgMCk7CisgICAgICAgIGlmIChhc3QpCisgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoYXN0LCBvZmZzZXQgKyB2aWRlb19zaXplLCB0b3RhbF9hdWRpb19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NpemUsIGF1ZGlvX3NpemUgKiA4LCAwKTsKKyAgICAgICAgdG90YWxfYXVkaW9fc2l6ZSArPSBhdWRpb19zaXplICogODsKKyAgICB9CisKKyAgICBpZiAoZXJyb3IpIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBycGxfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFJQTENvbnRleHQgKnJwbCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSogc3RyZWFtOworICAgIEFWSW5kZXhFbnRyeSogaW5kZXhfZW50cnk7CisgICAgdWludDMyX3QgcmV0OworCisgICAgaWYgKHJwbC0+Y2h1bmtfcGFydCA9PSBzLT5uYl9zdHJlYW1zKSB7CisgICAgICAgIHJwbC0+Y2h1bmtfbnVtYmVyKys7CisgICAgICAgIHJwbC0+Y2h1bmtfcGFydCA9IDA7CisgICAgfQorCisgICAgc3RyZWFtID0gcy0+c3RyZWFtc1tycGwtPmNodW5rX3BhcnRdOworCisgICAgaWYgKHJwbC0+Y2h1bmtfbnVtYmVyID49IHN0cmVhbS0+bmJfaW5kZXhfZW50cmllcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgaW5kZXhfZW50cnkgPSAmc3RyZWFtLT5pbmRleF9lbnRyaWVzW3JwbC0+Y2h1bmtfbnVtYmVyXTsKKworICAgIGlmIChycGwtPmZyYW1lX2luX3BhcnQgPT0gMCkKKyAgICAgICAgaWYgKGF2aW9fc2VlayhwYiwgaW5kZXhfZW50cnktPnBvcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBpZiAoc3RyZWFtLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICAgICAgc3RyZWFtLT5jb2RlYy0+Y29kZWNfdGFnID09IDEyNCkgeworICAgICAgICAvLyBXZSBoYXZlIHRvIHNwbGl0IEVzY2FwZSAxMjQgZnJhbWVzIGJlY2F1c2UgdGhlcmUgYXJlCisgICAgICAgIC8vIG11bHRpcGxlIGZyYW1lcyBwZXIgY2h1bmsgaW4gRXNjYXBlIDEyNCBzYW1wbGVzLgorICAgICAgICB1aW50MzJfdCBmcmFtZV9zaXplOworCisgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7IC8qIGZsYWdzICovCisgICAgICAgIGZyYW1lX3NpemUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAoYXZpb19zZWVrKHBiLCAtOCwgU0VFS19DVVIpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBmcmFtZV9zaXplKTsKKyAgICAgICAgaWYgKHJldCAhPSBmcmFtZV9zaXplKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorICAgICAgICBwa3QtPmR1cmF0aW9uID0gMTsKKyAgICAgICAgcGt0LT5wdHMgPSBpbmRleF9lbnRyeS0+dGltZXN0YW1wICsgcnBsLT5mcmFtZV9pbl9wYXJ0OworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHJwbC0+Y2h1bmtfcGFydDsKKworICAgICAgICBycGwtPmZyYW1lX2luX3BhcnQrKzsKKyAgICAgICAgaWYgKHJwbC0+ZnJhbWVfaW5fcGFydCA9PSBycGwtPmZyYW1lc19wZXJfY2h1bmspIHsKKyAgICAgICAgICAgIHJwbC0+ZnJhbWVfaW5fcGFydCA9IDA7CisgICAgICAgICAgICBycGwtPmNodW5rX3BhcnQrKzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgaW5kZXhfZW50cnktPnNpemUpOworICAgICAgICBpZiAocmV0ICE9IGluZGV4X2VudHJ5LT5zaXplKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgLy8gZnJhbWVzX3Blcl9jaHVuayBzaG91bGQgYWx3YXlzIGJlIG9uZSBoZXJlOyB0aGUgaGVhZGVyCisgICAgICAgICAgICAvLyBwYXJzaW5nIHdpbGwgd2FybiBpZiBpdCBpc24ndC4KKyAgICAgICAgICAgIHBrdC0+ZHVyYXRpb24gPSBycGwtPmZyYW1lc19wZXJfY2h1bms7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBbGwgdGhlIGF1ZGlvIGNvZGVjcyBzdXBwb3J0ZWQgaW4gdGhpcyBjb250YWluZXIKKyAgICAgICAgICAgIC8vIChhdCBsZWFzdCBzbyBmYXIpIGFyZSBjb25zdGFudC1iaXRyYXRlLgorICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IHJldCAqIDg7CisgICAgICAgIH0KKyAgICAgICAgcGt0LT5wdHMgPSBpbmRleF9lbnRyeS0+dGltZXN0YW1wOworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHJwbC0+Y2h1bmtfcGFydDsKKyAgICAgICAgcnBsLT5jaHVua19wYXJ0Kys7CisgICAgfQorCisgICAgLy8gTm9uZSBvZiB0aGUgRXNjYXBlIGZvcm1hdHMgaGF2ZSBrZXlmcmFtZXMsIGFuZCB0aGUgQURQQ00KKyAgICAvLyBmb3JtYXQgdXNlZCBkb2Vzbid0IGhhdmUga2V5ZnJhbWVzLgorICAgIGlmIChycGwtPmNodW5rX251bWJlciA9PSAwICYmIHJwbC0+ZnJhbWVfaW5fcGFydCA9PSAwKQorICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfcnBsX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInJwbCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJQTCAvIEFSTW92aWUiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUlBMQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gcnBsX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJwbF9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBycGxfcmVhZF9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3JzZC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3JzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMmYzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnNkLmMKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBSU0QgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEzIEphbWVzIEFsbWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgcnNkX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX0FEUENNX1RIUCwgICAgICAgTUtUQUcoJ0cnLCdBJywnRCcsJ1AnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQURQQ01fSU1BX1JBRCwgICBNS1RBRygnUicsJ0EnLCdEJywnUCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2QkUsICAgICAgIE1LVEFHKCdQJywnQycsJ00nLCdCJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMTZMRSwgICAgICAgTUtUQUcoJ1AnLCdDJywnTScsJyAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHJzZF91bnN1cHBvcnRlZF90YWdzW10gPSB7CisgICAgTUtUQUcoJ08nLCdHJywnRycsJyAnKSwKKyAgICBNS1RBRygnVicsJ0EnLCdHJywnICcpLAorICAgIE1LVEFHKCdXJywnQScsJ0QnLCdQJyksCisgICAgTUtUQUcoJ1gnLCdBJywnRCcsJ1AnKSwKKyAgICBNS1RBRygnWCcsJ00nLCdBJywnICcpLAorfTsKKworc3RhdGljIGludCByc2RfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKG1lbWNtcChwLT5idWYsICJSU0QiLCAzKSB8fCBwLT5idWZbM10gLSAnMCcgPCAyIHx8IHAtPmJ1ZlszXSAtICcwJyA+IDYpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChBVl9STDMyKHAtPmJ1ZiArICA4KSA+IDI1NiB8fCAhQVZfUkwzMihwLT5idWYgKyAgOCkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDg7CisgICAgaWYgKEFWX1JMMzIocC0+YnVmICsgMTYpID4gOCo0ODAwMCB8fCAhQVZfUkwzMihwLT5idWYgKyAxNikpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDg7CisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCitzdGF0aWMgaW50IHJzZF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGksIHZlcnNpb24sIHN0YXJ0ID0gMHg4MDA7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjOworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZpb19za2lwKHBiLCAzKTsgLy8gIlJTRCIKKyAgICB2ZXJzaW9uID0gYXZpb19yOChwYikgLSAnMCc7CisKKyAgICBjb2RlYyA9IHN0LT5jb2RlYzsKKyAgICBjb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBjb2RlYy0+Y29kZWNfdGFnICA9IGF2aW9fcmwzMihwYik7CisgICAgY29kZWMtPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQocnNkX3RhZ3MsIGNvZGVjLT5jb2RlY190YWcpOworICAgIGlmICghY29kZWMtPmNvZGVjX2lkKSB7CisgICAgICAgIGNoYXIgdGFnX2J1Zls1XTsKKworICAgICAgICBhdl9nZXRfY29kZWNfdGFnX3N0cmluZyh0YWdfYnVmLCBzaXplb2YodGFnX2J1ZiksIGNvZGVjLT5jb2RlY190YWcpOworICAgICAgICBmb3IgKGk9MDsgaSA8IEZGX0FSUkFZX0VMRU1TKHJzZF91bnN1cHBvcnRlZF90YWdzKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29kZWMtPmNvZGVjX3RhZyA9PSByc2RfdW5zdXBwb3J0ZWRfdGFnc1tpXSkgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiQ29kZWMgdGFnOiAlcyIsIHRhZ19idWYpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjb2RlYyB0YWc6ICVzXG4iLCB0YWdfYnVmKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY29kZWMtPmNoYW5uZWxzID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZiAoIWNvZGVjLT5jaGFubmVscykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdmlvX3NraXAocGIsIDQpOyAvLyBCaXQgZGVwdGgKKyAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocGIpOworICAgIGlmICghY29kZWMtPnNhbXBsZV9yYXRlKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2aW9fc2tpcChwYiwgNCk7IC8vIFVua25vd24KKworICAgIHN3aXRjaCAoY29kZWMtPmNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUkFEOgorICAgICAgICBjb2RlYy0+YmxvY2tfYWxpZ24gPSAyMCAqIGNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgaWYgKHBiLT5zZWVrYWJsZSkKKyAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihjb2RlYywgYXZpb19zaXplKHBiKSAtIHN0YXJ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9USFA6CisgICAgICAgIC8qIFJTRDNHQURQIGlzIG1vbm8sIHNvIG9ubHkgYWxsb2MgZW5vdWdoIG1lbW9yeQorICAgICAgICAgICB0byBzdG9yZSB0aGUgY29lZmYgdGFibGUgZm9yIGEgc2luZ2xlIGNoYW5uZWwuICovCisKKyAgICAgICAgc3RhcnQgPSBhdmlvX3JsMzIocGIpOworCisgICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKGNvZGVjLCBzLT5wYiwgMzIpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICBBVl9XQjE2KGNvZGVjLT5leHRyYWRhdGEgKyBpICogMiwgQVZfUkwxNihjb2RlYy0+ZXh0cmFkYXRhICsgaSAqIDIpKTsKKworICAgICAgICBpZiAocGItPnNlZWthYmxlKQorICAgICAgICAgICAgc3QtPmR1cmF0aW9uID0gKGF2aW9fc2l6ZShwYikgLSBzdGFydCkgLyA4ICogMTQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkxFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkJFOgorICAgICAgICBpZiAodmVyc2lvbiAhPSA0KQorICAgICAgICAgICAgc3RhcnQgPSBhdmlvX3JsMzIocGIpOworCisgICAgICAgIGlmIChwYi0+c2Vla2FibGUpCisgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSAoYXZpb19zaXplKHBiKSAtIHN0YXJ0KSAvIDIgLyBjb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGF2aW9fc2tpcChwYiwgc3RhcnQgLSBhdmlvX3RlbGwocGIpKTsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBjb2RlYy0+c2FtcGxlX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNkX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBpbnQgcmV0LCBzaXplID0gMTAyNDsKKworICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9SQUQpCisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgY29kZWMtPmJsb2NrX2FsaWduKTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisKKyAgICBpZiAocmV0ICE9IHNpemUpIHsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCByZXQpOworICAgIH0KKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitBVklucHV0Rm9ybWF0IGZmX3JzZF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICAgInJzZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gICBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR2FtZUN1YmUgUlNEIiksCisgICAgLnJlYWRfcHJvYmUgICAgID0gICByc2RfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gICByc2RfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gICByc2RfcmVhZF9wYWNrZXQsCisgICAgLmV4dGVuc2lvbnMgICAgID0gICAicnNkIiwKKyAgICAuY29kZWNfdGFnICAgICAgPSAgIChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7cnNkX3RhZ3MsIDB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9yc28uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yc28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDg4ZjBmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jzby5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBSU08gZm9ybWF0IGNvbW1vbiBkYXRhCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmFmYWVsIENhcnJlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicnNvLmgiCisKK2NvbnN0IEFWQ29kZWNUYWcgZmZfY29kZWNfcnNvX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9VOCwgICAgICAgICAgMHgwMTAwIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWLCAgIDB4MDEwMSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgMCB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9yc28uaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yc28uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjY1ZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jzby5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBSU08gZm9ybWF0IGNvbW1vbiBkYXRhCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmFmYWVsIENhcnJlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfUlNPX0gKKyNkZWZpbmUgQVZGT1JNQVRfUlNPX0gKKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgUlNPX0hFQURFUl9TSVpFIDgKKworLyogVGhlIGxpYmF2Y29kZWMgY29kZWNzIHdlIHN1cHBvcnQsIGFuZCB0aGUgSURzIHRoZXkgaGF2ZSBpbiB0aGUgZmlsZSAqLworZXh0ZXJuIGNvbnN0IEFWQ29kZWNUYWcgZmZfY29kZWNfcnNvX3RhZ3NbXTsKKworI2VuZGlmIC8qIEFWRk9STUFUX1JTT19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnNvZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnNvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzZWEwYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yc29kZWMuYwpAQCAtMCwwICsxLDgzIEBACisvKgorICogUlNPIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQgKG9yaWdpbmFsIEFVIGNvZGUpCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmFmYWVsIENhcnJlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInBjbS5oIgorI2luY2x1ZGUgInJzby5oIgorCitzdGF0aWMgaW50IHJzb19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGlkLCByYXRlLCBicHM7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgZW51bSBBVkNvZGVjSUQgY29kZWM7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgaWQgICA9IGF2aW9fcmIxNihwYik7CisgICAgc2l6ZSA9IGF2aW9fcmIxNihwYik7CisgICAgcmF0ZSA9IGF2aW9fcmIxNihwYik7CisgICAgYXZpb19yYjE2KHBiKTsgICAvKiBwbGF5IG1vZGUgPyAoMHgwMDAwID0gZG9uJ3QgbG9vcCkgKi8KKworICAgIGNvZGVjID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX3Jzb190YWdzLCBpZCk7CisKKyAgICBpZiAoY29kZWMgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVikgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLCAiQURQQ00gaW4gUlNPIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBicHMgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGNvZGVjKTsKKyAgICBpZiAoIWJwcykgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIlVua25vd24gYml0cyBwZXIgc2FtcGxlIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvKiBub3cgd2UgYXJlIHJlYWR5OiBidWlsZCBmb3JtYXQgc3RyZWFtcyAqLworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3QtPmR1cmF0aW9uICAgICAgICAgICAgPSAoc2l6ZSAqIDgpIC8gYnBzOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgID0gaWQ7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgPSBjb2RlYzsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICA9IDE7CisgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgID0gcmF0ZTsKKyAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduICA9IDE7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9yc29fZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAgICJyc28iLAorICAgIC5sb25nX25hbWUgICAgICA9ICAgTlVMTF9JRl9DT05GSUdfU01BTEwoIkxlZ28gTWluZHN0b3JtcyBSU08iKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAgICJyc28iLAorICAgIC5yZWFkX2hlYWRlciAgICA9ICAgcnNvX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9ICAgZmZfcGNtX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9ICAgZmZfcGNtX3JlYWRfc2VlaywKKyAgICAuY29kZWNfdGFnICAgICAgPSAgIChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7ZmZfY29kZWNfcnNvX3RhZ3MsIDB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9yc29lbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9yc29lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGE5NTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Jzb2VuYy5jCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogUlNPIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkIChvcmlnaW5hbCBBVSBjb2RlKQorICogQ29weXJpZ2h0IChjKSAyMDEwIFJhZmFlbCBDYXJyZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInJpZmYuaCIKKyNpbmNsdWRlICJyc28uaCIKKworc3RhdGljIGludCByc29fd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAgKnBiICA9IHMtPnBiOworICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKworICAgIGlmICghZW5jLT5jb2RlY190YWcpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGVuYy0+Y2hhbm5lbHMgIT0gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUlNPIG9ubHkgc3VwcG9ydHMgbW9ub1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICghcy0+cGItPnNlZWthYmxlKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJtdXhlciBkb2VzIG5vdCBzdXBwb3J0IG5vbiBzZWVrYWJsZSBvdXRwdXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBYWFg6IGZpbmQgbGVnYWwgc2FtcGxlIHJhdGVzIChpZiBhbnkpICovCisgICAgaWYgKGVuYy0+c2FtcGxlX3JhdGUgPj0gMXU8PDE2KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTYW1wbGUgcmF0ZSBtdXN0IGJlIDwgNjU1MzZcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBRFBDTSBpbiBSU08gbm90IGltcGxlbWVudGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIC8qIGZvcm1hdCBoZWFkZXIgKi8KKyAgICBhdmlvX3diMTYocGIsIGVuYy0+Y29kZWNfdGFnKTsgICAvKiBjb2RlYyBJRCAqLworICAgIGF2aW9fd2IxNihwYiwgMCk7ICAgICAgICAgICAgICAgIC8qIGRhdGEgc2l6ZSwgd2lsbCBiZSB3cml0dGVuIGF0IEVPRiAqLworICAgIGF2aW9fd2IxNihwYiwgZW5jLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZpb193YjE2KHBiLCAweDAwMDApOyAgICAgICAgICAgLyogcGxheSBtb2RlID8gKDB4MDAwMCA9IGRvbid0IGxvb3ApICovCisKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzb193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGF2aW9fd3JpdGUocy0+cGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc29fd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50NjRfdCBmaWxlX3NpemU7CisgICAgdWludDE2X3QgY29kZWRfZmlsZV9zaXplOworCisgICAgZmlsZV9zaXplID0gYXZpb190ZWxsKHBiKTsKKworICAgIGlmIChmaWxlX3NpemUgPCAwKQorICAgICAgICByZXR1cm4gZmlsZV9zaXplOworCisgICAgaWYgKGZpbGVfc2l6ZSA+IDB4ZmZmZiArIFJTT19IRUFERVJfU0laRSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiT3V0cHV0IGZpbGUgaXMgdG9vIGJpZyAoJSJQUklkNjQiIGJ5dGVzID49IDY0a0IpXG4iLCBmaWxlX3NpemUpOworICAgICAgICBjb2RlZF9maWxlX3NpemUgPSAweGZmZmY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZWRfZmlsZV9zaXplID0gZmlsZV9zaXplIC0gUlNPX0hFQURFUl9TSVpFOworICAgIH0KKworICAgIC8qIHVwZGF0ZSBmaWxlIHNpemUgKi8KKyAgICBhdmlvX3NlZWsocGIsIDIsIFNFRUtfU0VUKTsKKyAgICBhdmlvX3diMTYocGIsIGNvZGVkX2ZpbGVfc2l6ZSk7CisgICAgYXZpb19zZWVrKHBiLCBmaWxlX3NpemUsIFNFRUtfU0VUKTsKKworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9yc29fbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gICAicnNvIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSAgIE5VTExfSUZfQ09ORklHX1NNQUxMKCJMZWdvIE1pbmRzdG9ybXMgUlNPIiksCisgICAgLmV4dGVuc2lvbnMgICAgID0gICAicnNvIiwKKyAgICAuYXVkaW9fY29kZWMgICAgPSAgIEFWX0NPREVDX0lEX1BDTV9VOCwKKyAgICAudmlkZW9fY29kZWMgICAgPSAgIEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgID0gICByc29fd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9ICAgcnNvX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgPSAgIHJzb193cml0ZV90cmFpbGVyLAorICAgIC5jb2RlY190YWcgICAgICA9ICAgKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXtmZl9jb2RlY19yc29fdGFncywgMH0sCisgICAgLmZsYWdzICAgICAgICAgID0gICBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0bXAuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydG1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjODA0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydG1wLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIFJUTVAgZGVmaW5pdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOSBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfUlRNUF9ICisjZGVmaW5lIEFWRk9STUFUX1JUTVBfSAorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworI2RlZmluZSBSVE1QX0RFRkFVTFRfUE9SVCAxOTM1CisjZGVmaW5lIFJUTVBTX0RFRkFVTFRfUE9SVCA0NDMKKworI2RlZmluZSBSVE1QX0hBTkRTSEFLRV9QQUNLRVRfU0laRSAxNTM2CisKKyNkZWZpbmUgSE1BQ19JUEFEX1ZBTCAweDM2CisjZGVmaW5lIEhNQUNfT1BBRF9WQUwgMHg1QworCisvKioKKyAqIGVtdWxhdGVkIEZsYXNoIGNsaWVudCB2ZXJzaW9uIC0gOS4wLjEyNC4yIG9uIExpbnV4CisgKiBAeworICovCisjZGVmaW5lIFJUTVBfQ0xJRU5UX1BMQVRGT1JNICJMTlgiCisjZGVmaW5lIFJUTVBfQ0xJRU5UX1ZFUjEgICAgOQorI2RlZmluZSBSVE1QX0NMSUVOVF9WRVIyICAgIDAKKyNkZWZpbmUgUlRNUF9DTElFTlRfVkVSMyAgMTI0CisjZGVmaW5lIFJUTVBfQ0xJRU5UX1ZFUjQgICAgMgorLyoqIEB9ICovIC8vdmVyc2lvbiBkZWZpbmVzCisKKy8qKgorICogQ2FsY3VsYXRlIEhNQUMtU0hBMiBkaWdlc3QgZm9yIFJUTVAgaGFuZHNoYWtlIHBhY2tldHMuCisgKgorICogQHBhcmFtIHNyYyAgICBpbnB1dCBidWZmZXIKKyAqIEBwYXJhbSBsZW4gICAgaW5wdXQgYnVmZmVyIGxlbmd0aCAoc2hvdWxkIGJlIDE1MzYpCisgKiBAcGFyYW0gZ2FwICAgIG9mZnNldCBpbiBidWZmZXIgd2hlcmUgMzIgYnl0ZXMgc2hvdWxkIG5vdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKKyAqICAgICAgICAgICAgICAgd2hlbiBjYWxjdWxhdGluZyBkaWdlc3QgKHNpbmNlIGl0IHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0aGF0IGRpZ2VzdCkKKyAqIEBwYXJhbSBrZXkgICAgZGlnZXN0IGtleQorICogQHBhcmFtIGtleWxlbiBkaWdlc3Qga2V5IGxlbmd0aAorICogQHBhcmFtIGRzdCAgICBidWZmZXIgd2hlcmUgY2FsY3VsYXRlZCBkaWdlc3Qgd2lsbCBiZSBzdG9yZWQgKDMyIGJ5dGVzKQorICovCitpbnQgZmZfcnRtcF9jYWxjX2RpZ2VzdChjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4sIGludCBnYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICprZXksIGludCBrZXlsZW4sIHVpbnQ4X3QgKmRzdCk7CisKKy8qKgorICogQ2FsY3VsYXRlIGRpZ2VzdCBwb3NpdGlvbiBmb3IgUlRNUCBoYW5kc2hha2UgcGFja2V0cy4KKyAqCisgKiBAcGFyYW0gYnVmIGlucHV0IGJ1ZmZlciAoc2hvdWxkIGJlIDE1MzYgYnl0ZXMpCisgKiBAcGFyYW0gb2ZmIG9mZnNldCBpbiBidWZmZXIgd2hlcmUgdG8gc3RhcnQgY2FsY3VsYXRpbmcgZGlnZXN0IHBvc2l0aW9uCisgKiBAcGFyYW0gbW9kX3ZhbCB2YWx1ZSB1c2VkIGZvciBjb21wdXRpbmcgbW9kdWxvCisgKiBAcGFyYW0gYWRkX3ZhbCB2YWx1ZSBhZGRlZCBhdCB0aGUgZW5kIChhZnRlciBjb21wdXRpbmcgbW9kdWxvKQorICovCitpbnQgZmZfcnRtcF9jYWxjX2RpZ2VzdF9wb3MoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgb2ZmLCBpbnQgbW9kX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkX3ZhbCk7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9SVE1QX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydG1wY3J5cHQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydG1wY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzEyNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0bXBjcnlwdC5jCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogUlRNUEUgbmV0d29yayBwcm90b2NvbAorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgQW5kcmVqIFN0ZXBhbmNodWsKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIEhvd2FyZCBDaHUKKyAqIENvcHlyaWdodCAoYykgMjAxMiBTYW11ZWwgUGl0b2lzZXQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUlRNUEUgcHJvdG9jb2wKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jsb3dmaXNoLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmM0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3h0ZWEuaCIKKworI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicnRtcC5oIgorI2luY2x1ZGUgInJ0bXBkaC5oIgorI2luY2x1ZGUgInJ0bXBjcnlwdC5oIgorI2luY2x1ZGUgInVybC5oIgorCisvKiBwcm90b2NvbCBoYW5kbGVyIGNvbnRleHQgKi8KK3R5cGVkZWYgc3RydWN0IFJUTVBFQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgVVJMQ29udGV4dCAgICpzdHJlYW07ICAgICAgICAgICAgLy8vPCBUQ1Agc3RyZWFtCisgICAgRkZfREggICAgICAgICpkaDsgICAgICAgICAgICAgICAgLy8vPCBEaWZmaWUtSGVsbG1hbiBjb250ZXh0CisgICAgc3RydWN0IEFWUkM0IGtleV9pbjsgICAgICAgICAgICAgLy8vPCBSQzQga2V5IHVzZWQgZm9yIGRlY3J5cHQgZGF0YQorICAgIHN0cnVjdCBBVlJDNCBrZXlfb3V0OyAgICAgICAgICAgIC8vLzwgUkM0IGtleSB1c2VkIGZvciBlbmNyeXB0IGRhdGEKKyAgICBpbnQgICAgICAgICAgaGFuZHNoYWtlZDsgICAgICAgICAvLy88IGZsYWcgaW5kaWNhdGluZyB3aGVuIHRoZSBoYW5kc2hha2UgaXMgcGVyZm9ybWVkCisgICAgaW50ICAgICAgICAgIHR1bm5lbGluZzsgICAgICAgICAgLy8vPCB1c2UgYSBIVFRQIGNvbm5lY3Rpb24gKFJUTVBURSkKK30gUlRNUEVDb250ZXh0OworCitzdGF0aWMgY29uc3QgdWludDhfdCBydG1wZThfa2V5c1sxNl1bMTZdID0geworICAgIHsgMHhiZiwgMHhmMCwgMHgzNCwgMHhiMiwgMHgxMSwgMHhkOSwgMHgwOCwgMHgxZiwKKyAgICAgIDB4Y2MsIDB4ZGYsIDB4YjcsIDB4OTUsIDB4NzQsIDB4OGQsIDB4ZTcsIDB4MzIgfSwKKyAgICB7IDB4MDgsIDB4NmEsIDB4NWUsIDB4YjYsIDB4MTcsIDB4NDMsIDB4MDksIDB4MGUsCisgICAgICAweDZlLCAweGYwLCAweDVhLCAweGI4LCAweGZlLCAweDVhLCAweDM5LCAweGUyIH0sCisgICAgeyAweDdiLCAweDEwLCAweDk1LCAweDZmLCAweDc2LCAweGNlLCAweDA1LCAweDIxLAorICAgICAgMHgyMywgMHg4OCwgMHhhNywgMHgzYSwgMHg0NCwgMHgwMSwgMHg0OSwgMHhhMSB9LAorICAgIHsgMHhhOSwgMHg0MywgMHhmMywgMHgxNywgMHhlYiwgMHhmMSwgMHgxYiwgMHhiMiwKKyAgICAgIDB4YTYsIDB4OTEsIDB4YTUsIDB4ZWUsIDB4MTcsIDB4ZjMsIDB4NjMsIDB4MzkgfSwKKyAgICB7IDB4N2EsIDB4MzAsIDB4ZTAsIDB4MGEsIDB4YjUsIDB4MjksIDB4ZTIsIDB4MmMsCisgICAgICAweGEwLCAweDg3LCAweGFlLCAweGE1LCAweGMwLCAweGNiLCAweDc5LCAweGFjIH0sCisgICAgeyAweGJkLCAweGNlLCAweDBjLCAweDIzLCAweDJmLCAweGViLCAweGRlLCAweGZmLAorICAgICAgMHgxYywgMHhmYSwgMHhhZSwgMHgxNiwgMHgxMSwgMHgyMywgMHgyMywgMHg5ZCB9LAorICAgIHsgMHg1NSwgMHhkZCwgMHgzZiwgMHg3YiwgMHg3NywgMHhlNywgMHhlNiwgMHgyZSwKKyAgICAgIDB4OWIsIDB4YjgsIDB4YzQsIDB4OTksIDB4YzksIDB4NDgsIDB4MWUsIDB4ZTQgfSwKKyAgICB7IDB4NDAsIDB4N2IsIDB4YjYsIDB4YjQsIDB4NzEsIDB4ZTgsIDB4OTEsIDB4MzYsCisgICAgICAweGE3LCAweGFlLCAweGJmLCAweDU1LCAweGNhLCAweDMzLCAweGI4LCAweDM5IH0sCisgICAgeyAweGZjLCAweGY2LCAweGJkLCAweGMzLCAweGI2LCAweDNjLCAweDM2LCAweDk3LAorICAgICAgMHg3YywgMHhlNCwgMHhmOCwgMHgyNSwgMHgwNCwgMHhkOSwgMHg1OSwgMHhiMiB9LAorICAgIHsgMHgyOCwgMHhlMCwgMHg5MSwgMHhmZCwgMHg0MSwgMHg5NSwgMHg0YywgMHg0YywKKyAgICAgIDB4N2YsIDB4YjcsIDB4ZGIsIDB4MDAsIDB4ZTMsIDB4YTAsIDB4NjYsIDB4ZjggfSwKKyAgICB7IDB4NTcsIDB4ODQsIDB4NWIsIDB4NzYsIDB4NGYsIDB4MjUsIDB4MWIsIDB4MDMsCisgICAgICAweDQ2LCAweGQ0LCAweDViLCAweGNkLCAweGEyLCAweGMzLCAweDBkLCAweDI5IH0sCisgICAgeyAweDBhLCAweGNjLCAweGVlLCAweGY4LCAweGRhLCAweDU1LCAweGI1LCAweDQ2LAorICAgICAgMHgwMywgMHg0NywgMHgzNCwgMHg1MiwgMHg1OCwgMHg2MywgMHg3MSwgMHgzYiB9LAorICAgIHsgMHhiOCwgMHgyMCwgMHg3NSwgMHhkYywgMHhhNywgMHg1ZiwgMHgxZiwgMHhlZSwKKyAgICAgIDB4ZDgsIDB4NDIsIDB4NjgsIDB4ZTgsIDB4YTcsIDB4MmEsIDB4NDQsIDB4Y2MgfSwKKyAgICB7IDB4MDcsIDB4Y2YsIDB4NmUsIDB4OWUsIDB4YTEsIDB4NmQsIDB4N2IsIDB4MjUsCisgICAgICAweDlmLCAweGE3LCAweGFlLCAweDZjLCAweGQ5LCAweDJmLCAweDU2LCAweDI5IH0sCisgICAgeyAweGZlLCAweGIxLCAweGVhLCAweGU0LCAweDhjLCAweDhjLCAweDNjLCAweGUxLAorICAgICAgMHg0ZSwgMHgwMCwgMHg2NCwgMHhhNywgMHg2YSwgMHgzOCwgMHg3YywgMHgyYSB9LAorICAgIHsgMHg4OSwgMHgzYSwgMHg5NCwgMHgyNywgMHhjYywgMHgzMCwgMHgxMywgMHhhMiwKKyAgICAgIDB4ZjEsIDB4MDYsIDB4MzgsIDB4NWIsIDB4YTgsIDB4MjksIDB4ZjksIDB4MjcgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnRtcGU5X2tleXNbMTZdWzI0XSA9IHsKKyAgICB7IDB4NzksIDB4MzQsIDB4NzcsIDB4NGMsIDB4NjcsIDB4ZDEsIDB4MzgsIDB4M2EsIDB4ZGYsIDB4YjMsIDB4NTYsIDB4YmUsCisgICAgICAweDhiLCAweDdiLCAweGQwLCAweDI0LCAweDM4LCAweGUwLCAweDczLCAweDU4LCAweDQxLCAweDVkLCAweDY5LCAweDY3LCB9LAorICAgIHsgMHg0NiwgMHhmNiwgMHhiNCwgMHhjYywgMHgwMSwgMHg5MywgMHhlMywgMHhhMSwgMHg5ZSwgMHg3ZCwgMHgzYywgMHg2NSwKKyAgICAgIDB4NTUsIDB4ODYsIDB4ZmQsIDB4MDksIDB4OGYsIDB4ZjcsIDB4YjMsIDB4YzQsIDB4NmYsIDB4NDEsIDB4Y2EsIDB4NWMsIH0sCisgICAgeyAweDFhLCAweGU3LCAweGUyLCAweGYzLCAweGY5LCAweDE0LCAweDc5LCAweDk0LCAweGMwLCAweGQzLCAweDk3LCAweDQzLAorICAgICAgMHgwOCwgMHg3YiwgMHhiMywgMHg4NCwgMHg0MywgMHgyZiwgMHg5ZCwgMHg4NCwgMHgzZiwgMHgyMSwgMHgwMSwgMHg5YiwgfSwKKyAgICB7IDB4ZDMsIDB4ZTMsIDB4NTQsIDB4YjAsIDB4ZjcsIDB4MWQsIDB4ZjYsIDB4MmIsIDB4NWEsIDB4NDMsIDB4NGQsIDB4MDQsCisgICAgICAweDgzLCAweDY0LCAweDNlLCAweDBkLCAweDU5LCAweDJmLCAweDYxLCAweGNiLCAweGIxLCAweDZhLCAweDU5LCAweDBkLCB9LAorICAgIHsgMHhjOCwgMHhjMSwgMHhlOSwgMHhiOCwgMHgxNiwgMHg1NiwgMHg5OSwgMHgyMSwgMHg3YiwgMHg1YiwgMHgzNiwgMHhiNywKKyAgICAgIDB4YjUsIDB4OWIsIDB4ZGYsIDB4MDYsIDB4NDksIDB4MmMsIDB4OTcsIDB4ZjUsIDB4OTUsIDB4NDgsIDB4ODUsIDB4N2UsIH0sCisgICAgeyAweGViLCAweGU1LCAweGU2LCAweDJlLCAweGE0LCAweGJhLCAweGQ0LCAweDJjLCAweGYyLCAweDE2LCAweGUwLCAweDhmLAorICAgICAgMHg2NiwgMHgyMywgMHhhOSwgMHg0MywgMHg0MSwgMHhjZSwgMHgzOCwgMHgxNCwgMHg4NCwgMHg5NSwgMHgwMCwgMHg1MywgfSwKKyAgICB7IDB4NjYsIDB4ZGIsIDB4OTAsIDB4ZjAsIDB4M2IsIDB4NGYsIDB4ZjUsIDB4NmYsIDB4ZTQsIDB4OWMsIDB4MjAsIDB4ODksCisgICAgICAweDM1LCAweDVlLCAweGQyLCAweGIyLCAweGMzLCAweDllLCAweDlmLCAweDdmLCAweDYzLCAweGIyLCAweDI4LCAweDgxLCB9LAorICAgIHsgMHhiYiwgMHgyMCwgMHhhYywgMHhlZCwgMHgyYSwgMHgwNCwgMHg2YSwgMHgxOSwgMHg5NCwgMHg5OCwgMHg5YiwgMHhjOCwKKyAgICAgIDB4ZmYsIDB4Y2QsIDB4OTMsIDB4ZWYsIDB4YzYsIDB4MGQsIDB4NTYsIDB4YTcsIDB4ZWIsIDB4MTMsIDB4ZDksIDB4MzAsIH0sCisgICAgeyAweGJjLCAweGYyLCAweDQzLCAweDgyLCAweDA5LCAweDQwLCAweDhhLCAweDg3LCAweDI1LCAweDQzLCAweDZkLCAweGU2LAorICAgICAgMHhiYiwgMHhhNCwgMHhiOSwgMHg0NCwgMHg1OCwgMHgzZiwgMHgyMSwgMHg3YywgMHg5OSwgMHhiYiwgMHgzZiwgMHgyNCwgfSwKKyAgICB7IDB4ZWMsIDB4MWEsIDB4YWEsIDB4Y2QsIDB4Y2UsIDB4YmQsIDB4NTMsIDB4MTEsIDB4ZDIsIDB4ZmIsIDB4ODMsIDB4YjYsCisgICAgICAweGMzLCAweGJhLCAweGFiLCAweDRmLCAweDYyLCAweDc5LCAweGU4LCAweDY1LCAweGE5LCAweDkyLCAweDI4LCAweDc2LCB9LAorICAgIHsgMHhjNiwgMHgwYywgMHgzMCwgMHgwMywgMHg5MSwgMHgxOCwgMHgyZCwgMHg3YiwgMHg3OSwgMHhkYSwgMHhlMSwgMHhkNSwKKyAgICAgIDB4NjQsIDB4NzcsIDB4OWEsIDB4MTIsIDB4YzUsIDB4YjEsIDB4ZDcsIDB4OTEsIDB4NGYsIDB4OTYsIDB4NGMsIDB4YTMsIH0sCisgICAgeyAweGQ3LCAweDdjLCAweDJhLCAweGJmLCAweGE2LCAweGU3LCAweDg1LCAweDdjLCAweDQ1LCAweGFkLCAweGZmLCAweDEyLAorICAgICAgMHg5NCwgMHhkOCwgMHhkZSwgMHhhNCwgMHg1YywgMHgzZCwgMHg3OSwgMHhhNCwgMHg0NCwgMHgwMiwgMHg1ZCwgMHgyMiwgfSwKKyAgICB7IDB4MTYsIDB4MTksIDB4MGQsIDB4ODEsIDB4NmEsIDB4NGMsIDB4YzcsIDB4ZjgsIDB4YjgsIDB4ZjksIDB4NGUsIDB4Y2QsCisgICAgICAweDJjLCAweDllLCAweDkwLCAweDg0LCAweGIyLCAweDA4LCAweDI1LCAweDYwLCAweGUxLCAweDFlLCAweGFlLCAweDE4LCB9LAorICAgIHsgMHhlOSwgMHg3YywgMHg1OCwgMHgyNiwgMHgxYiwgMHg1MSwgMHg5ZSwgMHg0OSwgMHg4MiwgMHg2MCwgMHg2MSwgMHhmYywKKyAgICAgIDB4YTAsIDB4YTAsIDB4MWIsIDB4Y2QsIDB4ZjUsIDB4MDUsIDB4ZDYsIDB4YTYsIDB4NmQsIDB4MDcsIDB4ODgsIDB4YTMsIH0sCisgICAgeyAweDJiLCAweDk3LCAweDExLCAweDhiLCAweGQ5LCAweDRlLCAweGQ5LCAweGRmLCAweDIwLCAweGUzLCAweDljLCAweDEwLAorICAgICAgMHhlNiwgMHhhMSwgMHgzNSwgMHgyMSwgMHgxMSwgMHhmOSwgMHgxMywgMHgwZCwgMHgwYiwgMHgyNCwgMHg2NSwgMHhiMiwgfSwKKyAgICB7IDB4NTMsIDB4NmEsIDB4NGMsIDB4NTQsIDB4YWMsIDB4OGIsIDB4OWIsIDB4YjgsIDB4OTcsIDB4MjksIDB4ZmMsIDB4NjAsCisgICAgICAweDJjLCAweDViLCAweDNhLCAweDg1LCAweDY4LCAweGI1LCAweGFhLCAweDZhLCAweDQ0LCAweGNkLCAweDNmLCAweGE3LCB9LAorfTsKKworaW50IGZmX3J0bXBlX2dlbl9wdWJfa2V5KFVSTENvbnRleHQgKmgsIHVpbnQ4X3QgKmJ1ZikKK3sKKyAgICBSVE1QRUNvbnRleHQgKnJ0ID0gaC0+cHJpdl9kYXRhOworICAgIGludCBvZmZzZXQsIHJldDsKKworICAgIGlmICghKHJ0LT5kaCA9IGZmX2RoX2luaXQoMTAyNCkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgb2Zmc2V0ID0gZmZfcnRtcF9jYWxjX2RpZ2VzdF9wb3MoYnVmLCA3NjgsIDYzMiwgOCk7CisgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIHJldHVybiBvZmZzZXQ7CisKKyAgICAvKiBnZW5lcmF0ZSBhIERpZmZpZS1IZWxsbWFubiBwdWJsaWMga2V5ICovCisgICAgaWYgKChyZXQgPSBmZl9kaF9nZW5lcmF0ZV9wdWJsaWNfa2V5KHJ0LT5kaCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIHdyaXRlIHRoZSBwdWJsaWMga2V5IGludG8gdGhlIGhhbmRzaGFrZSBidWZmZXIgKi8KKyAgICBpZiAoKHJldCA9IGZmX2RoX3dyaXRlX3B1YmxpY19rZXkocnQtPmRoLCBidWYgKyBvZmZzZXQsIDEyOCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfcnRtcGVfY29tcHV0ZV9zZWNyZXRfa2V5KFVSTENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKnNlcnZlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNsaWVudGRhdGEsIGludCB0eXBlKQoreworICAgIFJUTVBFQ29udGV4dCAqcnQgPSBoLT5wcml2X2RhdGE7CisgICAgdWludDhfdCBzZWNyZXRfa2V5WzEyOF0sIGRpZ2VzdFszMl07CisgICAgaW50IHNlcnZlcl9wb3MsIGNsaWVudF9wb3M7CisgICAgaW50IHJldDsKKworICAgIGlmICh0eXBlKSB7CisgICAgICAgIGlmICgoc2VydmVyX3BvcyA9IGZmX3J0bXBfY2FsY19kaWdlc3RfcG9zKHNlcnZlcmRhdGEsIDE1MzIsIDYzMiwgNzcyKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHNlcnZlcl9wb3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChzZXJ2ZXJfcG9zID0gZmZfcnRtcF9jYWxjX2RpZ2VzdF9wb3Moc2VydmVyZGF0YSwgNzY4LCA2MzIsIDgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gc2VydmVyX3BvczsKKyAgICB9CisKKyAgICBpZiAoKGNsaWVudF9wb3MgPSBmZl9ydG1wX2NhbGNfZGlnZXN0X3BvcyhjbGllbnRkYXRhLCA3NjgsIDYzMiwgOCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIGNsaWVudF9wb3M7CisKKyAgICAvKiBjb21wdXRlIHRoZSBzaGFyZWQgc2VjcmV0IHNlY3JldCBpbiBvcmRlciB0byBjb21wdXRlIFJDNCBrZXlzICovCisgICAgaWYgKChyZXQgPSBmZl9kaF9jb21wdXRlX3NoYXJlZF9zZWNyZXRfa2V5KHJ0LT5kaCwgc2VydmVyZGF0YSArIHNlcnZlcl9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwgc2VjcmV0X2tleSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIHNldCBvdXRwdXQga2V5ICovCisgICAgaWYgKChyZXQgPSBmZl9ydG1wX2NhbGNfZGlnZXN0KHNlcnZlcmRhdGEgKyBzZXJ2ZXJfcG9zLCAxMjgsIDAsIHNlY3JldF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwgZGlnZXN0KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGF2X3JjNF9pbml0KCZydC0+a2V5X291dCwgZGlnZXN0LCAxNiAqIDgsIDEpOworCisgICAgLyogc2V0IGlucHV0IGtleSAqLworICAgIGlmICgocmV0ID0gZmZfcnRtcF9jYWxjX2RpZ2VzdChjbGllbnRkYXRhICsgY2xpZW50X3BvcywgMTI4LCAwLCBzZWNyZXRfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsIGRpZ2VzdCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBhdl9yYzRfaW5pdCgmcnQtPmtleV9pbiwgZGlnZXN0LCAxNiAqIDgsIDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bXBlOF9zaWcoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgaW50IGtleV9pZCkKK3sKKyAgICBzdHJ1Y3QgQVZYVEVBIGN0eDsKKworICAgIGF2X3h0ZWFfaW5pdCgmY3R4LCBydG1wZThfa2V5c1trZXlfaWRdKTsKKyAgICBhdl94dGVhX2NyeXB0KCZjdHgsIG91dCwgaW4sIDEsIE5VTEwsIDApOworfQorCitzdGF0aWMgdm9pZCBydG1wZTlfc2lnKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIGludCBrZXlfaWQpCit7CisgICAgc3RydWN0IEFWQmxvd2Zpc2ggY3R4OworICAgIHVpbnQzMl90IHhsLCB4cjsKKworICAgIHhsID0gQVZfUkwzMihpbik7CisgICAgeHIgPSBBVl9STDMyKGluICsgNCk7CisKKyAgICBhdl9ibG93ZmlzaF9pbml0KCZjdHgsIHJ0bXBlOV9rZXlzW2tleV9pZF0sIDI0KTsKKyAgICBhdl9ibG93ZmlzaF9jcnlwdF9lY2IoJmN0eCwgJnhsLCAmeHIsIDApOworCisgICAgQVZfV0wzMihvdXQsIHhsKTsKKyAgICBBVl9XTDMyKG91dCArIDQsIHhyKTsKK30KKwordm9pZCBmZl9ydG1wZV9lbmNyeXB0X3NpZyhVUkxDb250ZXh0ICpoLCB1aW50OF90ICpzaWcsIGNvbnN0IHVpbnQ4X3QgKmRpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gOCkgeworICAgICAgICBpZiAodHlwZSA9PSA4KSB7CisgICAgICAgICAgICAvKiBSVE1QRSB0eXBlIDggdXNlcyBYVEVBIG9uIHRoZSBzaWduYXR1cmUgKi8KKyAgICAgICAgICAgIHJ0bXBlOF9zaWcoc2lnICsgaSwgc2lnICsgaSwgZGlnZXN0W2ldICUgMTUpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gOSkgeworICAgICAgICAgICAgLyogUlRNUEUgdHlwZSA5IHVzZXMgQmxvd2Zpc2ggb24gdGhlIHNpZ25hdHVyZSAqLworICAgICAgICAgICAgcnRtcGU5X3NpZyhzaWcgKyBpLCBzaWcgKyBpLCBkaWdlc3RbaV0gJSAxNSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBmZl9ydG1wZV91cGRhdGVfa2V5c3RyZWFtKFVSTENvbnRleHQgKmgpCit7CisgICAgUlRNUEVDb250ZXh0ICpydCA9IGgtPnByaXZfZGF0YTsKKyAgICBjaGFyIGJ1ZltSVE1QX0hBTkRTSEFLRV9QQUNLRVRfU0laRV07CisKKyAgICAvKiBza2lwIHBhc3QgMTUzNiBieXRlcyBvZiB0aGUgUkM0IGJ5dGVzdHJlYW0gKi8KKyAgICBhdl9yYzRfY3J5cHQoJnJ0LT5rZXlfaW4sIGJ1ZiwgTlVMTCwgc2l6ZW9mKGJ1ZiksIE5VTEwsIDEpOworICAgIGF2X3JjNF9jcnlwdCgmcnQtPmtleV9vdXQsIGJ1ZiwgTlVMTCwgc2l6ZW9mKGJ1ZiksIE5VTEwsIDEpOworCisgICAgLyogdGhlIG5leHQgcmVxdWVzdHMgd2lsbCBiZSBlbmNyeXB0ZWQgdXNpbmcgUkM0IGtleXMgKi8KKyAgICBydC0+aGFuZHNoYWtlZCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydG1wZV9jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIFJUTVBFQ29udGV4dCAqcnQgPSBoLT5wcml2X2RhdGE7CisKKyAgICBmZl9kaF9mcmVlKHJ0LT5kaCk7CisgICAgZmZ1cmxfY2xvc2UocnQtPnN0cmVhbSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydG1wZV9vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzKQoreworICAgIFJUTVBFQ29udGV4dCAqcnQgPSBoLT5wcml2X2RhdGE7CisgICAgY2hhciBob3N0WzI1Nl0sIHVybFsxMDI0XTsKKyAgICBpbnQgcmV0LCBwb3J0OworCisgICAgYXZfdXJsX3NwbGl0KE5VTEwsIDAsIE5VTEwsIDAsIGhvc3QsIHNpemVvZihob3N0KSwgJnBvcnQsIE5VTEwsIDAsIHVyaSk7CisKKyAgICBpZiAocnQtPnR1bm5lbGluZykgeworICAgICAgICBpZiAocG9ydCA8IDApCisgICAgICAgICAgICBwb3J0ID0gODA7CisgICAgICAgIGZmX3VybF9qb2luKHVybCwgc2l6ZW9mKHVybCksICJmZnJ0bXBodHRwIiwgTlVMTCwgaG9zdCwgcG9ydCwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBvcnQgPCAwKQorICAgICAgICAgICAgcG9ydCA9IDE5MzU7CisgICAgICAgIGZmX3VybF9qb2luKHVybCwgc2l6ZW9mKHVybCksICJ0Y3AiLCBOVUxMLCBob3N0LCBwb3J0LCBOVUxMKTsKKyAgICB9CisKKyAgICAvKiBvcGVuIHRoZSB0Y3Agb3IgZmZydG1waHR0cCBjb25uZWN0aW9uICovCisgICAgaWYgKChyZXQgPSBmZnVybF9vcGVuKCZydC0+c3RyZWFtLCB1cmwsIEFWSU9fRkxBR19SRUFEX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMKSkgPCAwKSB7CisgICAgICAgIHJ0bXBlX2Nsb3NlKGgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bXBlX3JlYWQoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBSVE1QRUNvbnRleHQgKnJ0ID0gaC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBydC0+c3RyZWFtLT5mbGFncyB8PSBoLT5mbGFncyAmIEFWSU9fRkxBR19OT05CTE9DSzsKKyAgICByZXQgPSBmZnVybF9yZWFkKHJ0LT5zdHJlYW0sIGJ1Ziwgc2l6ZSk7CisgICAgcnQtPnN0cmVhbS0+ZmxhZ3MgJj0gfkFWSU9fRkxBR19OT05CTE9DSzsKKworICAgIGlmIChyZXQgPCAwICYmIHJldCAhPSBBVkVSUk9SX0VPRikKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChydC0+aGFuZHNoYWtlZCAmJiByZXQgPiAwKSB7CisgICAgICAgIC8qIGRlY3J5cHQgZGF0YSByZWNlaXZlZCBieSB0aGUgc2VydmVyICovCisgICAgICAgIGF2X3JjNF9jcnlwdCgmcnQtPmtleV9pbiwgYnVmLCBidWYsIHJldCwgTlVMTCwgMSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBydG1wZV93cml0ZShVUkxDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFJUTVBFQ29udGV4dCAqcnQgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmIChydC0+aGFuZHNoYWtlZCkgeworICAgICAgICAvKiBlbmNyeXB0IGRhdGEgdG8gc2VuZCB0byB0aGUgc2VydmVyICovCisgICAgICAgIGF2X3JjNF9jcnlwdCgmcnQtPmtleV9vdXQsIGJ1ZiwgYnVmLCBzaXplLCBOVUxMLCAxKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmdXJsX3dyaXRlKHJ0LT5zdHJlYW0sIGJ1Ziwgc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiBzaXplOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihSVE1QRUNvbnRleHQsIHgpCisjZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZmZydG1wY3J5cHRfb3B0aW9uc1tdID0geworICAgIHsiZmZydG1wY3J5cHRfdHVubmVsaW5nIiwgIlVzZSBhIEhUVFAgdHVubmVsaW5nIGNvbm5lY3Rpb24gKFJUTVBURSkuIiwgT0ZGU0VUKHR1bm5lbGluZyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMSwgREVDfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGZmcnRtcGNyeXB0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImZmcnRtcGNyeXB0IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gZmZydG1wY3J5cHRfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK1VSTFByb3RvY29sIGZmX2ZmcnRtcGNyeXB0X3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICAgPSAiZmZydG1wY3J5cHQiLAorICAgIC51cmxfb3BlbiAgICAgICAgPSBydG1wZV9vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICAgPSBydG1wZV9yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICAgPSBydG1wZV93cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgID0gcnRtcGVfY2xvc2UsCisgICAgLnByaXZfZGF0YV9zaXplICA9IHNpemVvZihSVE1QRUNvbnRleHQpLAorICAgIC5mbGFncyAgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAorICAgIC5wcml2X2RhdGFfY2xhc3MgPSAmZmZydG1wY3J5cHRfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0bXBjcnlwdC5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0bXBjcnlwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MGE4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRtcGNyeXB0LmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIFJUTVBFIGVuY3J5cHRpb24gdXRpbGl0aWVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgU2FtdWVsIFBpdG9pc2V0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfUlRNUENSWVBUX0gKKyNkZWZpbmUgQVZGT1JNQVRfUlRNUENSWVBUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAidXJsLmgiCisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgRGlmZmllLUhlbGxtYW5uIGNvbnRleHQgYW5kIGdlbmVyYXRlIHRoZSBwdWJsaWMga2V5LgorICoKKyAqIEBwYXJhbSBoICAgICBhbiBVUkxDb250ZXh0CisgKiBAcGFyYW0gYnVmICAgaGFuZHNoYWtlIGRhdGEgKDE1MzYgYnl0ZXMpCisgKiBAcmV0dXJuIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK2ludCBmZl9ydG1wZV9nZW5fcHViX2tleShVUkxDb250ZXh0ICpoLCB1aW50OF90ICpidWYpOworCisvKioKKyAqIENvbXB1dGUgdGhlIHNoYXJlZCBzZWNyZXQga2V5IGFuZCBpbml0aWFsaXplIHRoZSBSQzQgZW5jcnlwdGlvbi4KKyAqCisgKiBAcGFyYW0gaCAgICAgICAgICAgICBhbiBVUkxDb250ZXh0CisgKiBAcGFyYW0gc2VydmVyZGF0YSAgICBzZXJ2ZXIgZGF0YSAoMTUzNiBieXRlcykKKyAqIEBwYXJhbSBjbGllbnRkYXRhICAgIGNsaWVudCBkYXRhICgxNTM2IGJ5dGVzKQorICogQHBhcmFtIHR5cGUgICAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZXJ2ZXIgZGlnZXN0CisgKiBAcmV0dXJuIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK2ludCBmZl9ydG1wZV9jb21wdXRlX3NlY3JldF9rZXkoVVJMQ29udGV4dCAqaCwgY29uc3QgdWludDhfdCAqc2VydmVyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY2xpZW50ZGF0YSwgaW50IHR5cGUpOworCisvKioKKyAqIEVuY3J5cHQgdGhlIHNpZ25hdHVyZS4KKyAqCisgKiBAcGFyYW0gaCAgICAgICAgICAgICBhbiBVUkxDb250ZXh0CisgKiBAcGFyYW0gc2lnbmF0dXJlICAgICB0aGUgc2lnbmF0dXJlIHRvIGVuY3J5cHQKKyAqIEBwYXJhbSBkaWdlc3QgICAgICAgIHRoZSBkaWdlc3QgdXNlZCBmb3IgZmluZGluZyB0aGUgZW5jcnlwdGlvbiBrZXkKKyAqIEBwYXJhbSB0eXBlICAgICAgICAgIHR5cGUgb2YgZW5jcnlwdGlvbiAoOCBmb3IgWFRFQSwgOSBmb3IgQmxvd2Zpc2gpCisgKi8KK3ZvaWQgZmZfcnRtcGVfZW5jcnlwdF9zaWcoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaWdlc3QsIGludCB0eXBlKTsKKworLyoqCisgKiBVcGRhdGUgdGhlIGtleXN0cmVhbSBhbmQgc2V0IFJDNCBrZXlzIGZvciBlbmNyeXB0aW9uLgorICoKKyAqIEBwYXJhbSBoIGFuIFVSTENvbnRleHQKKyAqIEByZXR1cm4gemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UKKyAqLworaW50IGZmX3J0bXBlX3VwZGF0ZV9rZXlzdHJlYW0oVVJMQ29udGV4dCAqaCk7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9SVE1QQ1JZUFRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0bXBkaC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0bXBkaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjczNGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRtcGRoLmMKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiBSVE1QIERpZmZpZS1IZWxsbWFubiB1dGlsaXRpZXMKKyAqIENvcHlyaWdodCAoYykgMjAwOSBBbmRyZWogU3RlcGFuY2h1aworICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSG93YXJkIENodQorICogQ29weXJpZ2h0IChjKSAyMDEyIFNhbXVlbCBQaXRvaXNldAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSVE1QIERpZmZpZS1IZWxsbWFubiB1dGlsaXRpZXMKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAicnRtcGRoLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhbmRvbV9zZWVkLmgiCisKKyNkZWZpbmUgUDEwMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIkZGRkZGRkZGRkZGRkZGRkZDOTBGREFBMjIxNjhDMjM0QzRDNjYyOEI4MERDMUNEMSIgXAorICAgICIyOTAyNEUwODhBNjdDQzc0MDIwQkJFQTYzQjEzOUIyMjUxNEEwODc5OEUzNDA0REQiIFwKKyAgICAiRUY5NTE5QjNDRDNBNDMxQjMwMkIwQTZERjI1RjE0Mzc0RkUxMzU2RDZENTFDMjQ1IiBcCisgICAgIkU0ODVCNTc2NjI1RTdFQzZGNDRDNDJFOUE2MzdFRDZCMEJGRjVDQjZGNDA2QjdFRCIgXAorICAgICJFRTM4NkJGQjVBODk5RkE1QUU5RjI0MTE3QzRCMUZFNjQ5Mjg2NjUxRUNFNjUzODEiIFwKKyAgICAiRkZGRkZGRkZGRkZGRkZGRiIKKworI2RlZmluZSBRMTAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiN0ZGRkZGRkZGRkZGRkZGRkU0ODdFRDUxMTBCNDYxMUE2MjYzMzE0NUMwNkUwRTY4IiBcCisgICAgIjk0ODEyNzA0NDUzM0U2M0EwMTA1REY1MzFEODlDRDkxMjhBNTA0M0NDNzFBMDI2RSIgXAorICAgICJGN0NBOENEOUU2OUQyMThEOTgxNTg1MzZGOTJGOEExQkE3RjA5QUI2QjZBOEUxMjIiIFwKKyAgICAiRjI0MkRBQkIzMTJGM0Y2MzdBMjYyMTc0RDMxQkY2QjU4NUZGQUU1QjdBMDM1QkY2IiBcCisgICAgIkY3MUMzNUZEQUQ0NENGRDJENzRGOTIwOEJFMjU4RkYzMjQ5NDMzMjhGNjczMjlDMCIgXAorICAgICJGRkZGRkZGRkZGRkZGRkZGIgorCisjaWYgQ09ORklHX05FVFRMRSB8fCBDT05GSUdfR0NSWVBUCisjaWYgQ09ORklHX05FVFRMRQorI2RlZmluZSBibl9uZXcoYm4pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJuID0gYXZfbWFsbG9jKHNpemVvZigqYm4pKTsgICAgXAorICAgICAgICBpZiAoYm4pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1wel9pbml0MihibiwgMSk7ICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYm5fZnJlZShibikgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbXB6X2NsZWFyKGJuKTsgIFwKKyAgICAgICAgYXZfZnJlZShibik7ICAgIFwKKyAgICB9IHdoaWxlICgwKQorI2RlZmluZSBibl9zZXRfd29yZChibiwgdykgICAgICAgICAgbXB6X3NldF91aShibiwgdykKKyNkZWZpbmUgYm5fY21wKGEsIGIpICAgICAgICAgICAgICAgIG1wel9jbXAoYSwgYikKKyNkZWZpbmUgYm5fY29weSh0bywgZnJvbSkgICAgICAgICAgIG1wel9zZXQodG8sIGZyb20pCisjZGVmaW5lIGJuX3N1Yl93b3JkKGJuLCB3KSAgICAgICAgICBtcHpfc3ViX3VpKGJuLCBibiwgdykKKyNkZWZpbmUgYm5fY21wXzEoYm4pICAgICAgICAgICAgICAgIG1wel9jbXBfdWkoYm4sIDEpCisjZGVmaW5lIGJuX251bV9ieXRlcyhibikgICAgICAgICAgICAobXB6X3NpemVpbmJhc2UoYm4sIDIpICsgNykgLyA4CisjZGVmaW5lIGJuX2JuMmJpbihibiwgYnVmLCBsZW4pICAgICBuZXR0bGVfbXB6X2dldF9zdHJfMjU2KGxlbiwgYnVmLCBibikKKyNkZWZpbmUgYm5fYmluMmJuKGJuLCBidWYsIGxlbikgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBibl9uZXcoYm4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGJuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXR0bGVfbXB6X3NldF9zdHJfMjU2X3UoYm4sIGxlbiwgYnVmKTsgXAorICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIGJuX2hleDJibihibiwgYnVmLCByZXQpICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYm5fbmV3KGJuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChibikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0ID0gKG1wel9zZXRfc3RyKGJuLCBidWYsIDE2KSA9PSAwKTsgIFwKKyAgICB9IHdoaWxlICgwKQorI2RlZmluZSBibl9tb2RleHAoYm4sIHksIHEsIHApICAgICAgbXB6X3Bvd20oYm4sIHksIHEsIHApCisjZGVmaW5lIGJuX3JhbmRvbShibiwgbnVtX2J5dGVzKSAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ21wX3JhbmRzdGF0ZV90IHJzOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdtcF9yYW5kaW5pdF9tdChycyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnbXBfcmFuZHNlZWRfdWkocnMsIGF2X2dldF9yYW5kb21fc2VlZCgpKTsgIFwKKyAgICAgICAgbXB6X3VyYW5kb21iKGJuLCBycywgbnVtX2J5dGVzKTsgICAgICAgICAgICBcCisgICAgICAgIGdtcF9yYW5kY2xlYXIocnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisjZWxpZiBDT05GSUdfR0NSWVBUCisjZGVmaW5lIGJuX25ldyhibikgICAgICAgICAgICAgICAgICBibiA9IGdjcnlfbXBpX25ldygxKQorI2RlZmluZSBibl9mcmVlKGJuKSAgICAgICAgICAgICAgICAgZ2NyeV9tcGlfcmVsZWFzZShibikKKyNkZWZpbmUgYm5fc2V0X3dvcmQoYm4sIHcpICAgICAgICAgIGdjcnlfbXBpX3NldF91aShibiwgdykKKyNkZWZpbmUgYm5fY21wKGEsIGIpICAgICAgICAgICAgICAgIGdjcnlfbXBpX2NtcChhLCBiKQorI2RlZmluZSBibl9jb3B5KHRvLCBmcm9tKSAgICAgICAgICAgZ2NyeV9tcGlfc2V0KHRvLCBmcm9tKQorI2RlZmluZSBibl9zdWJfd29yZChibiwgdykgICAgICAgICAgZ2NyeV9tcGlfc3ViX3VpKGJuLCBibiwgdykKKyNkZWZpbmUgYm5fY21wXzEoYm4pICAgICAgICAgICAgICAgIGdjcnlfbXBpX2NtcF91aShibiwgMSkKKyNkZWZpbmUgYm5fbnVtX2J5dGVzKGJuKSAgICAgICAgICAgIChnY3J5X21waV9nZXRfbmJpdHMoYm4pICsgNykgLyA4CisjZGVmaW5lIGJuX2JuMmJpbihibiwgYnVmLCBsZW4pICAgICBnY3J5X21waV9wcmludChHQ1JZTVBJX0ZNVF9VU0csIGJ1ZiwgbGVuLCBOVUxMLCBibikKKyNkZWZpbmUgYm5fYmluMmJuKGJuLCBidWYsIGxlbikgICAgIGdjcnlfbXBpX3NjYW4oJmJuLCBHQ1JZTVBJX0ZNVF9VU0csIGJ1ZiwgbGVuLCBOVUxMKQorI2RlZmluZSBibl9oZXgyYm4oYm4sIGJ1ZiwgcmV0KSAgICAgcmV0ID0gKGdjcnlfbXBpX3NjYW4oJmJuLCBHQ1JZTVBJX0ZNVF9IRVgsIGJ1ZiwgMCwgMCkgPT0gMCkKKyNkZWZpbmUgYm5fbW9kZXhwKGJuLCB5LCBxLCBwKSAgICAgIGdjcnlfbXBpX3Bvd20oYm4sIHksIHEsIHApCisjZGVmaW5lIGJuX3JhbmRvbShibiwgbnVtX2J5dGVzKSAgICBnY3J5X21waV9yYW5kb21pemUoYm4sIG51bV9ieXRlcywgR0NSWV9XRUFLX1JBTkRPTSkKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9CWVRFUyAxODAwMAorCisjZGVmaW5lIGRoX25ldygpICAgICAgICAgICAgICAgICAgICBhdl9tYWxsb2Moc2l6ZW9mKEZGX0RIKSkKKworc3RhdGljIEZGQmlnTnVtIGRoX2dlbmVyYXRlX2tleShGRl9ESCAqZGgpCit7CisgICAgaW50IG51bV9ieXRlczsKKworICAgIG51bV9ieXRlcyA9IGJuX251bV9ieXRlcyhkaC0+cCkgLSAxOworICAgIGlmIChudW1fYnl0ZXMgPD0gMCB8fCBudW1fYnl0ZXMgPiBNQVhfQllURVMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYm5fbmV3KGRoLT5wcml2X2tleSk7CisgICAgaWYgKCFkaC0+cHJpdl9rZXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJuX3JhbmRvbShkaC0+cHJpdl9rZXksIG51bV9ieXRlcyk7CisKKyAgICBibl9uZXcoZGgtPnB1Yl9rZXkpOworICAgIGlmICghZGgtPnB1Yl9rZXkpIHsKKyAgICAgICAgYm5fZnJlZShkaC0+cHJpdl9rZXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBibl9tb2RleHAoZGgtPnB1Yl9rZXksIGRoLT5nLCBkaC0+cHJpdl9rZXksIGRoLT5wKTsKKworICAgIHJldHVybiBkaC0+cHViX2tleTsKK30KKworc3RhdGljIGludCBkaF9jb21wdXRlX2tleShGRl9ESCAqZGgsIEZGQmlnTnVtIHB1Yl9rZXlfYm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHB1Yl9rZXlfbGVuLCB1aW50OF90ICpzZWNyZXRfa2V5KQoreworICAgIEZGQmlnTnVtIGs7CisgICAgaW50IG51bV9ieXRlczsKKworICAgIG51bV9ieXRlcyA9IGJuX251bV9ieXRlcyhkaC0+cCk7CisgICAgaWYgKG51bV9ieXRlcyA8PSAwIHx8IG51bV9ieXRlcyA+IE1BWF9CWVRFUykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYm5fbmV3KGspOworICAgIGlmICghaykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYm5fbW9kZXhwKGssIHB1Yl9rZXlfYm4sIGRoLT5wcml2X2tleSwgZGgtPnApOworICAgIGJuX2JuMmJpbihrLCBzZWNyZXRfa2V5LCBwdWJfa2V5X2xlbik7CisgICAgYm5fZnJlZShrKTsKKworICAgIC8qIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzaGFyZWQgc2VjcmV0IGtleSBsaWtlIERIX2NvbXB1dGVfa2V5ICovCisgICAgcmV0dXJuIHB1Yl9rZXlfbGVuOworfQorCit2b2lkIGZmX2RoX2ZyZWUoRkZfREggKmRoKQoreworICAgIGJuX2ZyZWUoZGgtPnApOworICAgIGJuX2ZyZWUoZGgtPmcpOworICAgIGJuX2ZyZWUoZGgtPnB1Yl9rZXkpOworICAgIGJuX2ZyZWUoZGgtPnByaXZfa2V5KTsKKyAgICBhdl9mcmVlKGRoKTsKK30KKyNlbGlmIENPTkZJR19PUEVOU1NMCisjZGVmaW5lIGJuX25ldyhibikgICAgICAgICAgICAgICAgICBibiA9IEJOX25ldygpCisjZGVmaW5lIGJuX2ZyZWUoYm4pICAgICAgICAgICAgICAgICBCTl9mcmVlKGJuKQorI2RlZmluZSBibl9zZXRfd29yZChibiwgdykgICAgICAgICAgQk5fc2V0X3dvcmQoYm4sIHcpCisjZGVmaW5lIGJuX2NtcChhLCBiKSAgICAgICAgICAgICAgICBCTl9jbXAoYSwgYikKKyNkZWZpbmUgYm5fY29weSh0bywgZnJvbSkgICAgICAgICAgIEJOX2NvcHkodG8sIGZyb20pCisjZGVmaW5lIGJuX3N1Yl93b3JkKGJuLCB3KSAgICAgICAgICBCTl9zdWJfd29yZChibiwgdykKKyNkZWZpbmUgYm5fY21wXzEoYm4pICAgICAgICAgICAgICAgIEJOX2NtcChibiwgQk5fdmFsdWVfb25lKCkpCisjZGVmaW5lIGJuX251bV9ieXRlcyhibikgICAgICAgICAgICBCTl9udW1fYnl0ZXMoYm4pCisjZGVmaW5lIGJuX2JuMmJpbihibiwgYnVmLCBsZW4pICAgICBCTl9ibjJiaW4oYm4sIGJ1ZikKKyNkZWZpbmUgYm5fYmluMmJuKGJuLCBidWYsIGxlbikgICAgIGJuID0gQk5fYmluMmJuKGJ1ZiwgbGVuLCAwKQorI2RlZmluZSBibl9oZXgyYm4oYm4sIGJ1ZiwgcmV0KSAgICAgcmV0ID0gQk5faGV4MmJuKCZibiwgYnVmKQorI2RlZmluZSBibl9tb2RleHAoYm4sIHksIHEsIHApICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCTl9DVFggKmN0eCA9IEJOX0NUWF9uZXcoKTsgICAgICAgICAgXAorICAgICAgICBpZiAoIWN0eCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsgICAgICAgICAgXAorICAgICAgICBpZiAoIUJOX21vZF9leHAoYm4sIHksIHEsIHAsIGN0eCkpIHsgXAorICAgICAgICAgICAgQk5fQ1RYX2ZyZWUoY3R4KTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCTl9DVFhfZnJlZShjdHgpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgZGhfbmV3KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERIX25ldygpCisjZGVmaW5lIGRoX2dlbmVyYXRlX2tleShkaCkgICAgICAgICAgICAgICAgICAgICBESF9nZW5lcmF0ZV9rZXkoZGgpCisjZGVmaW5lIGRoX2NvbXB1dGVfa2V5KGRoLCBwdWIsIGxlbiwgc2VjcmV0KSAgICBESF9jb21wdXRlX2tleShzZWNyZXQsIHB1YiwgZGgpCisKK3ZvaWQgZmZfZGhfZnJlZShGRl9ESCAqZGgpCit7CisgICAgREhfZnJlZShkaCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBkaF9pc192YWxpZF9wdWJsaWNfa2V5KEZGQmlnTnVtIHksIEZGQmlnTnVtIHAsIEZGQmlnTnVtIHEpCit7CisgICAgRkZCaWdOdW0gYm4gPSBOVUxMOworICAgIGludCByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBibl9uZXcoYm4pOworICAgIGlmICghYm4pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiB5IG11c3QgbGllIGluIFsyLCBwIC0gMV0gKi8KKyAgICBibl9zZXRfd29yZChibiwgMSk7CisgICAgaWYgKCFibl9jbXAoeSwgYm4pKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiBibiA9IHAgLSAyICovCisgICAgYm5fY29weShibiwgcCk7CisgICAgYm5fc3ViX3dvcmQoYm4sIDEpOworICAgIGlmICghYm5fY21wKHksIGJuKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgLyogVmVyaWZ5IHdpdGggU29waGllLUdlcm1haW4gcHJpbWUKKyAgICAgKgorICAgICAqIFRoaXMgaXMgYSBuaWNlIHRlc3QgdG8gbWFrZSBzdXJlIHRoZSBwdWJsaWMga2V5IHBvc2l0aW9uIGlzIGNhbGN1bGF0ZWQKKyAgICAgKiBjb3JyZWN0bHkuIFRoaXMgdGVzdCB3aWxsIGZhaWwgaW4gYWJvdXQgNTAlIG9mIHRoZSBjYXNlcyBpZiBhcHBsaWVkIHRvCisgICAgICogcmFuZG9tIGRhdGEuCisgICAgICovCisgICAgLyogeSBtdXN0IGZ1bGZpbGwgeV5xIG1vZCBwID0gMSAqLworICAgIGJuX21vZGV4cChibiwgeSwgcSwgcCk7CisKKyAgICBpZiAoYm5fY21wXzEoYm4pKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXQgPSAwOworZmFpbDoKKyAgICBibl9mcmVlKGJuKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2F2X2NvbGQgRkZfREggKmZmX2RoX2luaXQoaW50IGtleV9sZW4pCit7CisgICAgRkZfREggKmRoOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIShkaCA9IGRoX25ldygpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBibl9uZXcoZGgtPmcpOworICAgIGlmICghZGgtPmcpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGJuX2hleDJibihkaC0+cCwgUDEwMjQsIHJldCk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGJuX3NldF93b3JkKGRoLT5nLCAyKTsKKyAgICBkaC0+bGVuZ3RoID0ga2V5X2xlbjsKKworICAgIHJldHVybiBkaDsKKworZmFpbDoKKyAgICBmZl9kaF9mcmVlKGRoKTsKKworICAgIHJldHVybiBOVUxMOworfQorCitpbnQgZmZfZGhfZ2VuZXJhdGVfcHVibGljX2tleShGRl9ESCAqZGgpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB3aGlsZSAoIXJldCkgeworICAgICAgICBGRkJpZ051bSBxMSA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFkaF9nZW5lcmF0ZV9rZXkoZGgpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICAgICBibl9oZXgyYm4ocTEsIFExMDI0LCByZXQpOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgcmV0ID0gZGhfaXNfdmFsaWRfcHVibGljX2tleShkaC0+cHViX2tleSwgZGgtPnAsIHExKTsKKyAgICAgICAgYm5fZnJlZShxMSk7CisKKyAgICAgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgICAgIC8qIHRoZSBwdWJsaWMga2V5IGlzIHZhbGlkICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9kaF93cml0ZV9wdWJsaWNfa2V5KEZGX0RIICpkaCwgdWludDhfdCAqcHViX2tleSwgaW50IHB1Yl9rZXlfbGVuKQoreworICAgIGludCBsZW47CisKKyAgICAvKiBjb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIHB1YmxpYyBrZXkgKi8KKyAgICBsZW4gPSBibl9udW1fYnl0ZXMoZGgtPnB1Yl9rZXkpOworICAgIGlmIChsZW4gPD0gMCB8fCBsZW4gPiBwdWJfa2V5X2xlbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIC8qIGNvbnZlcnQgdGhlIHB1YmxpYyBrZXkgdmFsdWUgaW50byBiaWctZW5kaWFuIGZvcm0gKi8KKyAgICBtZW1zZXQocHViX2tleSwgMCwgcHViX2tleV9sZW4pOworICAgIGJuX2JuMmJpbihkaC0+cHViX2tleSwgcHViX2tleSArIHB1Yl9rZXlfbGVuIC0gbGVuLCBsZW4pOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9kaF9jb21wdXRlX3NoYXJlZF9zZWNyZXRfa2V5KEZGX0RIICpkaCwgY29uc3QgdWludDhfdCAqcHViX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwdWJfa2V5X2xlbiwgdWludDhfdCAqc2VjcmV0X2tleSkKK3sKKyAgICBGRkJpZ051bSBxMSA9IE5VTEwsIHB1Yl9rZXlfYm4gPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICAvKiBjb252ZXJ0IHRoZSBiaWctZW5kaWFuIGZvcm0gb2YgdGhlIHB1YmxpYyBrZXkgaW50byBhIGJpZ251bSAqLworICAgIGJuX2JpbjJibihwdWJfa2V5X2JuLCBwdWJfa2V5LCBwdWJfa2V5X2xlbik7CisgICAgaWYgKCFwdWJfa2V5X2JuKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogY29udmVydCB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgYSBoZXhhZGVjaW1hbCBudW1iZXIgaW50byBhIGJpZ251bSAqLworICAgIGJuX2hleDJibihxMSwgUTEwMjQsIHJldCk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogd2hlbiB0aGUgcHVibGljIGtleSBpcyB2YWxpZCB3ZSBoYXZlIHRvIGNvbXB1dGUgdGhlIHNoYXJlZCBzZWNyZXQga2V5ICovCisgICAgaWYgKChyZXQgPSBkaF9pc192YWxpZF9wdWJsaWNfa2V5KHB1Yl9rZXlfYm4sIGRoLT5wLCBxMSkpIDwgMCkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfSBlbHNlIGlmICgocmV0ID0gZGhfY29tcHV0ZV9rZXkoZGgsIHB1Yl9rZXlfYm4sIHB1Yl9rZXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3JldF9rZXkpKSA8IDApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIGJuX2ZyZWUocHViX2tleV9ibik7CisgICAgYm5fZnJlZShxMSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRtcGRoLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRtcGRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyNjJmYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydG1wZGguaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIFJUTVAgRGlmZmllLUhlbGxtYW5uIHV0aWxpdGllcworICogQ29weXJpZ2h0IChjKSAyMDEyIFNhbXVlbCBQaXRvaXNldAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1JUTVBESF9ICisjZGVmaW5lIEFWRk9STUFUX1JUTVBESF9ICisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgQ09ORklHX05FVFRMRSB8fCBDT05GSUdfR0NSWVBUCisjaWYgQ09ORklHX05FVFRMRQorI2luY2x1ZGUgPGdtcC5oPgorI2luY2x1ZGUgPG5ldHRsZS9iaWdudW0uaD4KKwordHlwZWRlZiBtcHpfcHRyIEZGQmlnTnVtOworI2VsaWYgQ09ORklHX0dDUllQVAorI2luY2x1ZGUgPGdjcnlwdC5oPgorCit0eXBlZGVmIGdjcnlfbXBpX3QgRkZCaWdOdW07CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgRkZfREggeworICBGRkJpZ051bSBwOworICBGRkJpZ051bSBnOworICBGRkJpZ051bSBwdWJfa2V5OworICBGRkJpZ051bSBwcml2X2tleTsKKyAgbG9uZyBsZW5ndGg7Cit9IEZGX0RIOworCisjZWxpZiBDT05GSUdfT1BFTlNTTAorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisKK3R5cGVkZWYgQklHTlVNICpGRkJpZ051bTsKK3R5cGVkZWYgREggRkZfREg7CisjZW5kaWYKKworLyoqCisgKiBJbml0aWFsaXplIGEgRGlmZmllLUhlbGxtYW5uIGNvbnRleHQuCisgKgorICogQHBhcmFtIGtleV9sZW4gbGVuZ3RoIG9mIHRoZSBrZXkKKyAqIEByZXR1cm4gYSBuZXcgRGlmZmllLUhlbGxtYW5uIGNvbnRleHQgb24gc3VjY2VzcywgTlVMTCBvdGhlcndpc2UKKyAqLworRkZfREggKmZmX2RoX2luaXQoaW50IGtleV9sZW4pOworCisvKioKKyAqIEZyZWUgYSBEaWZmaWUtSGVsbG1hbm4gY29udGV4dC4KKyAqCisgKiBAcGFyYW0gZGggYSBEaWZmaWUtSGVsbG1hbm4gY29udGV4dCB0byBmcmVlCisgKi8KK3ZvaWQgZmZfZGhfZnJlZShGRl9ESCAqZGgpOworCisvKioKKyAqIEdlbmVyYXRlIGEgcHVibGljIGtleS4KKyAqCisgKiBAcGFyYW0gZGggYSBEaWZmaWUtSGVsbG1hbm4gY29udGV4dAorICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZQorICovCitpbnQgZmZfZGhfZ2VuZXJhdGVfcHVibGljX2tleShGRl9ESCAqZGgpOworCisvKioKKyAqIFdyaXRlIHRoZSBwdWJsaWMga2V5IGludG8gdGhlIGdpdmVuIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gZGggICAgICAgICAgICBhIERpZmZpZS1IZWxsbWFubiBjb250ZXh0LCBjb250YWluaW5nIHRoZSBwdWJsaWMga2V5IHRvIHdyaXRlCisgKiBAcGFyYW0gcHViX2tleSAgICAgICB0aGUgYnVmZmVyIHdoZXJlIHRoZSBwdWJsaWMga2V5IGlzIHdyaXR0ZW4KKyAqIEBwYXJhbSBwdWJfa2V5X2xlbiAgIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlcgorICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZQorICovCitpbnQgZmZfZGhfd3JpdGVfcHVibGljX2tleShGRl9ESCAqZGgsIHVpbnQ4X3QgKnB1Yl9rZXksIGludCBwdWJfa2V5X2xlbik7CisKKy8qKgorICogQ29tcHV0ZSB0aGUgc2hhcmVkIHNlY3JldCBrZXkgZnJvbSB0aGUgcHJpdmF0ZSBGRl9ESCB2YWx1ZSBhbmQgdGhlCisgKiBvdGhlciBwYXJ0eSdzIHB1YmxpYyB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gZGggICAgICAgICAgICBhIERpZmZpZS1IZWxsbWFubiBjb250ZXh0LCBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleQorICogQHBhcmFtIHB1Yl9rZXkgICAgICAgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwdWJsaWMga2V5CisgKiBAcGFyYW0gcHViX2tleV9sZW4gICB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIKKyAqIEBwYXJhbSBzZWNyZXRfa2V5ICAgIHRoZSBidWZmZXIgd2hlcmUgdGhlIHNlY3JldCBrZXkgaXMgd3JpdHRlbgorICogQHJldHVybiBsZW5ndGggb2YgdGhlIHNoYXJlZCBzZWNyZXQga2V5IG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZQorICovCitpbnQgZmZfZGhfY29tcHV0ZV9zaGFyZWRfc2VjcmV0X2tleShGRl9ESCAqZGgsIGNvbnN0IHVpbnQ4X3QgKnB1Yl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHViX2tleV9sZW4sIHVpbnQ4X3QgKnNlY3JldF9rZXkpOworCisjZW5kaWYgLyogQVZGT1JNQVRfUlRNUERIX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydG1waHR0cC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0bXBodHRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzNGJhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydG1waHR0cC5jCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogUlRNUCBIVFRQIG5ldHdvcmsgcHJvdG9jb2wKKyAqIENvcHlyaWdodCAoYykgMjAxMiBTYW11ZWwgUGl0b2lzZXQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUlRNUCBIVFRQIHByb3RvY29sCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiaHR0cC5oIgorI2luY2x1ZGUgInJ0bXAuaCIKKworI2RlZmluZSBSVE1QVF9ERUZBVUxUX1BPUlQgODAKKyNkZWZpbmUgUlRNUFRTX0RFRkFVTFRfUE9SVCBSVE1QU19ERUZBVUxUX1BPUlQKKworLyogcHJvdG9jb2wgaGFuZGxlciBjb250ZXh0ICovCit0eXBlZGVmIHN0cnVjdCBSVE1QX0hUVFBDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBVUkxDb250ZXh0ICAgKnN0cmVhbTsgICAgICAgICAgIC8vLzwgSFRUUCBzdHJlYW0KKyAgICBjaGFyICAgICAgICAgaG9zdFsyNTZdOyAgICAgICAgIC8vLzwgaG9zdG5hbWUgb2YgdGhlIHNlcnZlcgorICAgIGludCAgICAgICAgICBwb3J0OyAgICAgICAgICAgICAgLy8vPCBwb3J0IHRvIGNvbm5lY3QgKGRlZmF1bHQgaXMgODApCisgICAgY2hhciAgICAgICAgIGNsaWVudF9pZFs2NF07ICAgICAvLy88IGNsaWVudCBJRCB1c2VkIGZvciBhbGwgcmVxdWVzdHMgZXhjZXB0IHRoZSBmaXJzdCBvbmUKKyAgICBpbnQgICAgICAgICAgc2VxOyAgICAgICAgICAgICAgIC8vLzwgc2VxdWVuY2UgSUQgdXNlZCBmb3IgYWxsIHJlcXVlc3RzCisgICAgdWludDhfdCAgICAgICpvdXRfZGF0YTsgICAgICAgICAvLy88IG91dHB1dCBidWZmZXIKKyAgICBpbnQgICAgICAgICAgb3V0X3NpemU7ICAgICAgICAgIC8vLzwgY3VycmVudCBvdXRwdXQgYnVmZmVyIHNpemUKKyAgICBpbnQgICAgICAgICAgb3V0X2NhcGFjaXR5OyAgICAgIC8vLzwgY3VycmVudCBvdXRwdXQgYnVmZmVyIGNhcGFjaXR5CisgICAgaW50ICAgICAgICAgIGluaXRpYWxpemVkOyAgICAgICAvLy88IGZsYWcgaW5kaWNhdGluZyB3aGVuIHRoZSBodHRwIGNvbnRleHQgaXMgaW5pdGlhbGl6ZWQKKyAgICBpbnQgICAgICAgICAgZmluaXNoaW5nOyAgICAgICAgIC8vLzwgZmxhZyBpbmRpY2F0aW5nIHdoZW4gdGhlIGNsaWVudCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24KKyAgICBpbnQgICAgICAgICAgbmJfYnl0ZXNfcmVhZDsgICAgIC8vLzwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgc2luY2UgdGhlIGxhc3QgcmVxdWVzdAorICAgIGludCAgICAgICAgICB0bHM7ICAgICAgICAgICAgICAgLy8vPCB1c2UgVHJhbnNwb3J0IFNlY3VyaXR5IExheWVyIChSVE1QVFMpCit9IFJUTVBfSFRUUENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcnRtcF9odHRwX3NlbmRfY21kKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKmNtZCkKK3sKKyAgICBSVE1QX0hUVFBDb250ZXh0ICpydCA9IGgtPnByaXZfZGF0YTsKKyAgICBjaGFyIHVyaVsyMDQ4XTsKKyAgICB1aW50OF90IGM7CisgICAgaW50IHJldDsKKworICAgIGZmX3VybF9qb2luKHVyaSwgc2l6ZW9mKHVyaSksICJodHRwIiwgTlVMTCwgcnQtPmhvc3QsIHJ0LT5wb3J0LAorICAgICAgICAgICAgICAgICIvJXMvJXMvJWQiLCBjbWQsIHJ0LT5jbGllbnRfaWQsIHJ0LT5zZXErKyk7CisKKyAgICBhdl9vcHRfc2V0X2JpbihydC0+c3RyZWFtLT5wcml2X2RhdGEsICJwb3N0X2RhdGEiLCBydC0+b3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgcnQtPm91dF9zaXplLCAwKTsKKworICAgIC8qIHNlbmQgYSBuZXcgcmVxdWVzdCB0byB0aGUgc2VydmVyICovCisgICAgaWYgKChyZXQgPSBmZl9odHRwX2RvX25ld19yZXF1ZXN0KHJ0LT5zdHJlYW0sIHVyaSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIHJlLWluaXQgb3V0cHV0IGJ1ZmZlciAqLworICAgIHJ0LT5vdXRfc2l6ZSA9IDA7CisKKyAgICAvKiByZWFkIHRoZSBmaXJzdCBieXRlIHdoaWNoIGNvbnRhaW5zIHRoZSBwb2xsaW5nIGludGVydmFsICovCisgICAgaWYgKChyZXQgPSBmZnVybF9yZWFkKHJ0LT5zdHJlYW0sICZjLCAxKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogcmUtaW5pdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKi8KKyAgICBydC0+bmJfYnl0ZXNfcmVhZCA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0bXBfaHR0cF93cml0ZShVUkxDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFJUTVBfSFRUUENvbnRleHQgKnJ0ID0gaC0+cHJpdl9kYXRhOworCisgICAgaWYgKHJ0LT5vdXRfc2l6ZSArIHNpemUgPiBydC0+b3V0X2NhcGFjaXR5KSB7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIHJ0LT5vdXRfY2FwYWNpdHkgPSAocnQtPm91dF9zaXplICsgc2l6ZSkgKiAyOworICAgICAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZydC0+b3V0X2RhdGEsIHJ0LT5vdXRfY2FwYWNpdHkpKSA8IDApIHsKKyAgICAgICAgICAgIHJ0LT5vdXRfc2l6ZSA9IDA7CisgICAgICAgICAgICBydC0+b3V0X2NhcGFjaXR5ID0gMDsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1jcHkocnQtPm91dF9kYXRhICsgcnQtPm91dF9zaXplLCBidWYsIHNpemUpOworICAgIHJ0LT5vdXRfc2l6ZSArPSBzaXplOworCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgcnRtcF9odHRwX3JlYWQoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBSVE1QX0hUVFBDb250ZXh0ICpydCA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBvZmYgPSAwOworCisgICAgLyogdHJ5IHRvIHJlYWQgYXQgbGVhc3QgMSBieXRlIG9mIGRhdGEgKi8KKyAgICBkbyB7CisgICAgICAgIHJldCA9IGZmdXJsX3JlYWQocnQtPnN0cmVhbSwgYnVmICsgb2ZmLCBzaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDAgJiYgcmV0ICE9IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAoIXJldCB8fCByZXQgPT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgICAgIGlmIChydC0+ZmluaXNoaW5nKSB7CisgICAgICAgICAgICAgICAgLyogRG8gbm90IHNlbmQgbmV3IHJlcXVlc3RzIHdoZW4gdGhlIGNsaWVudCB3YW50cyB0bworICAgICAgICAgICAgICAgICAqIGNsb3NlIHRoZSBjb25uZWN0aW9uLiAqLworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFdoZW4gdGhlIGNsaWVudCBoYXMgcmVhY2hlZCBlbmQgb2YgZmlsZSBmb3IgdGhlIGxhc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAqIHdlIGhhdmUgdG8gc2VuZCBhIG5ldyByZXF1ZXN0IGlmIHdlIGhhdmUgYnVmZmVyZWQgZGF0YS4KKyAgICAgICAgICAgICAqIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBzZW5kIGFuIGlkbGUgUE9TVC4gKi8KKyAgICAgICAgICAgIGlmIChydC0+b3V0X3NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBydG1wX2h0dHBfc2VuZF9jbWQoaCwgInNlbmQiKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocnQtPm5iX2J5dGVzX3JlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IDUwbXMgYmVmb3JlIHJldHJ5aW5nIHRvIHJlYWQgYSBzZXJ2ZXIgcmVwbHkgaW4KKyAgICAgICAgICAgICAgICAgICAgICogb3JkZXIgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgaWRsZSByZXF1ZXRzLiAqLworICAgICAgICAgICAgICAgICAgICBhdl91c2xlZXAoNTAwMDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gcnRtcF9odHRwX3dyaXRlKGgsICIiLCAxKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBydG1wX2h0dHBfc2VuZF9jbWQoaCwgImlkbGUiKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfTk9OQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAvKiBubyBpbmNvbWluZyBkYXRhIHRvIGhhbmRsZSBpbiBub25ibG9ja2luZyBtb2RlICovCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZiAgKz0gcmV0OworICAgICAgICAgICAgc2l6ZSAtPSByZXQ7CisgICAgICAgICAgICBydC0+bmJfYnl0ZXNfcmVhZCArPSByZXQ7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChvZmYgPD0gMCk7CisKKyAgICByZXR1cm4gb2ZmOworfQorCitzdGF0aWMgaW50IHJ0bXBfaHR0cF9jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIFJUTVBfSFRUUENvbnRleHQgKnJ0ID0gaC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgdG1wX2J1ZlsyMDQ4XTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChydC0+aW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgLyogY2xpZW50IHdhbnRzIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uICovCisgICAgICAgIHJ0LT5maW5pc2hpbmcgPSAxOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJldCA9IHJ0bXBfaHR0cF9yZWFkKGgsIHRtcF9idWYsIHNpemVvZih0bXBfYnVmKSk7CisgICAgICAgIH0gd2hpbGUgKHJldCA+IDApOworCisgICAgICAgIC8qIHJlLWluaXQgb3V0cHV0IGJ1ZmZlciBiZWZvcmUgc2VuZGluZyB0aGUgY2xvc2UgY29tbWFuZCAqLworICAgICAgICBydC0+b3V0X3NpemUgPSAwOworCisgICAgICAgIGlmICgocmV0ID0gcnRtcF9odHRwX3dyaXRlKGgsICIiLCAxKSkgPT0gMSkKKyAgICAgICAgICAgIHJldCA9IHJ0bXBfaHR0cF9zZW5kX2NtZChoLCAiY2xvc2UiKTsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmcnQtPm91dF9kYXRhKTsKKyAgICBmZnVybF9jbG9zZShydC0+c3RyZWFtKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnRtcF9odHRwX29wZW4oVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqdXJpLCBpbnQgZmxhZ3MpCit7CisgICAgUlRNUF9IVFRQQ29udGV4dCAqcnQgPSBoLT5wcml2X2RhdGE7CisgICAgY2hhciBoZWFkZXJzWzEwMjRdLCB1cmxbMTAyNF07CisgICAgaW50IHJldCwgb2ZmID0gMDsKKworICAgIGF2X3VybF9zcGxpdChOVUxMLCAwLCBOVUxMLCAwLCBydC0+aG9zdCwgc2l6ZW9mKHJ0LT5ob3N0KSwgJnJ0LT5wb3J0LAorICAgICAgICAgICAgICAgICBOVUxMLCAwLCB1cmkpOworCisgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgcmVxdWVzdCB0aGF0IGlzIHNlbnQgdG8gdGhlIHNlcnZlciBpbiBvcmRlciB0bworICAgICAqIHJlZ2lzdGVyIGEgY2xpZW50IG9uIHRoZSBzZXJ2ZXIgYW5kIHN0YXJ0IGEgbmV3IHNlc3Npb24uIFRoZSBzZXJ2ZXIKKyAgICAgKiByZXBsaWVzIHdpdGggYSB1bmlxdWUgaWQgKHVzdWFsbHkgYSBudW1iZXIpIHRoYXQgaXMgdXNlZCBieSB0aGUgY2xpZW50CisgICAgICogZm9yIGFsbCBmdXR1cmUgcmVxdWVzdHMuCisgICAgICogTm90ZTogdGhlIHJlcGx5IGRvZXNuJ3QgY29udGFpbiBhIHZhbHVlIGZvciB0aGUgcG9sbGluZyBpbnRlcnZhbC4KKyAgICAgKiBBIHN1Y2Nlc3NmdWwgY29ubmVjdCByZXNldHMgdGhlIGNvbnNlY3V0aXZlIGluZGV4IHRoYXQgaXMgdXNlZAorICAgICAqIGluIHRoZSBVUkxzLiAqLworICAgIGlmIChydC0+dGxzKSB7CisgICAgICAgIGlmIChydC0+cG9ydCA8IDApCisgICAgICAgICAgICBydC0+cG9ydCA9IFJUTVBUU19ERUZBVUxUX1BPUlQ7CisgICAgICAgIGZmX3VybF9qb2luKHVybCwgc2l6ZW9mKHVybCksICJodHRwcyIsIE5VTEwsIHJ0LT5ob3N0LCBydC0+cG9ydCwgIi9vcGVuLzEiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocnQtPnBvcnQgPCAwKQorICAgICAgICAgICAgcnQtPnBvcnQgPSBSVE1QVF9ERUZBVUxUX1BPUlQ7CisgICAgICAgIGZmX3VybF9qb2luKHVybCwgc2l6ZW9mKHVybCksICJodHRwIiwgTlVMTCwgcnQtPmhvc3QsIHJ0LT5wb3J0LCAiL29wZW4vMSIpOworICAgIH0KKworICAgIC8qIGFsbG9jIHRoZSBodHRwIGNvbnRleHQgKi8KKyAgICBpZiAoKHJldCA9IGZmdXJsX2FsbG9jKCZydC0+c3RyZWFtLCB1cmwsIEFWSU9fRkxBR19SRUFEX1dSSVRFLCBOVUxMKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiBzZXQgb3B0aW9ucyAqLworICAgIHNucHJpbnRmKGhlYWRlcnMsIHNpemVvZihoZWFkZXJzKSwKKyAgICAgICAgICAgICAiQ2FjaGUtQ29udHJvbDogbm8tY2FjaGVcclxuIgorICAgICAgICAgICAgICJDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtZmNzXHJcbiIKKyAgICAgICAgICAgICAiVXNlci1BZ2VudDogU2hvY2t3YXZlIEZsYXNoXHJcbiIpOworICAgIGF2X29wdF9zZXQocnQtPnN0cmVhbS0+cHJpdl9kYXRhLCAiaGVhZGVycyIsIGhlYWRlcnMsIDApOworICAgIGF2X29wdF9zZXQocnQtPnN0cmVhbS0+cHJpdl9kYXRhLCAibXVsdGlwbGVfcmVxdWVzdHMiLCAiMSIsIDApOworICAgIGF2X29wdF9zZXRfYmluKHJ0LT5zdHJlYW0tPnByaXZfZGF0YSwgInBvc3RfZGF0YSIsICIiLCAxLCAwKTsKKworICAgIC8qIG9wZW4gdGhlIGh0dHAgY29udGV4dCAqLworICAgIGlmICgocmV0ID0gZmZ1cmxfY29ubmVjdChydC0+c3RyZWFtLCBOVUxMKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiByZWFkIHRoZSBzZXJ2ZXIgcmVwbHkgd2hpY2ggY29udGFpbnMgYSB1bmlxdWUgSUQgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHJldCA9IGZmdXJsX3JlYWQocnQtPnN0cmVhbSwgcnQtPmNsaWVudF9pZCArIG9mZiwgc2l6ZW9mKHJ0LT5jbGllbnRfaWQpIC0gb2ZmKTsKKyAgICAgICAgaWYgKCFyZXQgfHwgcmV0ID09IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBvZmYgKz0gcmV0OworICAgICAgICBpZiAob2ZmID09IHNpemVvZihydC0+Y2xpZW50X2lkKSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlIChvZmYgPiAwICYmIGF2X2lzc3BhY2UocnQtPmNsaWVudF9pZFtvZmYgLSAxXSkpCisgICAgICAgIG9mZi0tOworICAgIHJ0LT5jbGllbnRfaWRbb2ZmXSA9ICdcMCc7CisKKyAgICAvKiBodHRwIGNvbnRleHQgaXMgbm93IGluaXRpYWxpemVkICovCisgICAgcnQtPmluaXRpYWxpemVkID0gMTsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBydG1wX2h0dHBfY2xvc2UoaCk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUlRNUF9IVFRQQ29udGV4dCwgeCkKKyNkZWZpbmUgREVDIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBmZnJ0bXBodHRwX29wdGlvbnNbXSA9IHsKKyAgICB7ImZmcnRtcGh0dHBfdGxzIiwgIlVzZSBhIEhUVFBTIHR1bm5lbGluZyBjb25uZWN0aW9uIChSVE1QVFMpLiIsIE9GRlNFVCh0bHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIERFQ30sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmZnJ0bXBodHRwX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImZmcnRtcGh0dHAiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBmZnJ0bXBodHRwX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitVUkxQcm90b2NvbCBmZl9mZnJ0bXBodHRwX3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJmZnJ0bXBodHRwIiwKKyAgICAudXJsX29wZW4gICAgICAgPSBydG1wX2h0dHBfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgPSBydG1wX2h0dHBfcmVhZCwKKyAgICAudXJsX3dyaXRlICAgICAgPSBydG1wX2h0dHBfd3JpdGUsCisgICAgLnVybF9jbG9zZSAgICAgID0gcnRtcF9odHRwX2Nsb3NlLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihSVE1QX0hUVFBDb250ZXh0KSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAorICAgIC5wcml2X2RhdGFfY2xhc3M9ICZmZnJ0bXBodHRwX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydG1wcGt0LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRtcHBrdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzk0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRtcHBrdC5jCkBAIC0wLDAgKzEsNjU5IEBACisvKgorICogUlRNUCBpbnB1dCBmb3JtYXQKKyAqIENvcHlyaWdodCAoYykgMjAwOSBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCisjaW5jbHVkZSAicnRtcHBrdC5oIgorI2luY2x1ZGUgImZsdi5oIgorI2luY2x1ZGUgInVybC5oIgorCit2b2lkIGZmX2FtZl93cml0ZV9ib29sKHVpbnQ4X3QgKipkc3QsIGludCB2YWwpCit7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZShkc3QsIEFNRl9EQVRBX1RZUEVfQk9PTCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZShkc3QsIHZhbCk7Cit9CisKK3ZvaWQgZmZfYW1mX3dyaXRlX251bWJlcih1aW50OF90ICoqZHN0LCBkb3VibGUgdmFsKQoreworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoZHN0LCBBTUZfREFUQV9UWVBFX05VTUJFUik7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmU2NChkc3QsIGF2X2RvdWJsZTJpbnQodmFsKSk7Cit9CisKK3ZvaWQgZmZfYW1mX3dyaXRlX3N0cmluZyh1aW50OF90ICoqZHN0LCBjb25zdCBjaGFyICpzdHIpCit7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZShkc3QsIEFNRl9EQVRBX1RZUEVfU1RSSU5HKTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KGRzdCwgc3RybGVuKHN0cikpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcihkc3QsIHN0ciwgc3RybGVuKHN0cikpOworfQorCit2b2lkIGZmX2FtZl93cml0ZV9zdHJpbmcyKHVpbnQ4X3QgKipkc3QsIGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIpCit7CisgICAgaW50IGxlbjEgPSAwLCBsZW4yID0gMDsKKyAgICBpZiAoc3RyMSkKKyAgICAgICAgbGVuMSA9IHN0cmxlbihzdHIxKTsKKyAgICBpZiAoc3RyMikKKyAgICAgICAgbGVuMiA9IHN0cmxlbihzdHIyKTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKGRzdCwgQU1GX0RBVEFfVFlQRV9TVFJJTkcpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoZHN0LCBsZW4xICsgbGVuMik7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKGRzdCwgc3RyMSwgbGVuMSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKGRzdCwgc3RyMiwgbGVuMik7Cit9CisKK3ZvaWQgZmZfYW1mX3dyaXRlX251bGwodWludDhfdCAqKmRzdCkKK3sKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKGRzdCwgQU1GX0RBVEFfVFlQRV9OVUxMKTsKK30KKwordm9pZCBmZl9hbWZfd3JpdGVfb2JqZWN0X3N0YXJ0KHVpbnQ4X3QgKipkc3QpCit7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZShkc3QsIEFNRl9EQVRBX1RZUEVfT0JKRUNUKTsKK30KKwordm9pZCBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSh1aW50OF90ICoqZHN0LCBjb25zdCBjaGFyICpzdHIpCit7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNihkc3QsIHN0cmxlbihzdHIpKTsKKyAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoZHN0LCBzdHIsIHN0cmxlbihzdHIpKTsKK30KKwordm9pZCBmZl9hbWZfd3JpdGVfb2JqZWN0X2VuZCh1aW50OF90ICoqZHN0KQoreworICAgIC8qIGZpcnN0IHR3byBieXRlcyBhcmUgZmllbGQgbmFtZSBsZW5ndGggPSAwLAorICAgICAqIEFNRiBvYmplY3Qgc2hvdWxkIGVuZCB3aXRoIGl0IGFuZCBlbmQgbWFya2VyCisgICAgICovCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUyNChkc3QsIEFNRl9EQVRBX1RZUEVfT0JKRUNUX0VORCk7Cit9CisKK2ludCBmZl9hbWZfcmVhZF9ib29sKEdldEJ5dGVDb250ZXh0ICpiYywgaW50ICp2YWwpCit7CisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlKGJjKSAhPSBBTUZfREFUQV9UWVBFX0JPT0wpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICp2YWwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShiYyk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9hbWZfcmVhZF9udW1iZXIoR2V0Qnl0ZUNvbnRleHQgKmJjLCBkb3VibGUgKnZhbCkKK3sKKyAgICB1aW50NjRfdCByZWFkOworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZShiYykgIT0gQU1GX0RBVEFfVFlQRV9OVU1CRVIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHJlYWQgPSBieXRlc3RyZWFtMl9nZXRfYmU2NChiYyk7CisgICAgKnZhbCA9IGF2X2ludDJkb3VibGUocmVhZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9hbWZfZ2V0X3N0cmluZyhHZXRCeXRlQ29udGV4dCAqYmMsIHVpbnQ4X3QgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Ryc2l6ZSwgaW50ICpsZW5ndGgpCit7CisgICAgaW50IHN0cmluZ2xlbiA9IDA7CisgICAgaW50IHJlYWRzaXplOworICAgIHN0cmluZ2xlbiA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KGJjKTsKKyAgICBpZiAoc3RyaW5nbGVuICsgMSA+IHN0cnNpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgcmVhZHNpemUgPSBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKGJjLCBzdHIsIHN0cmluZ2xlbik7CisgICAgaWYgKHJlYWRzaXplICE9IHN0cmluZ2xlbikgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJlYWQgYXMgbWFueSBieXRlcyBhcyBBTUYgc3RyaW5nIHNpZ25hbGVkXG4iKTsKKyAgICB9CisgICAgc3RyW3JlYWRzaXplXSA9ICdcMCc7CisgICAgKmxlbmd0aCA9IEZGTUlOKHN0cmluZ2xlbiwgcmVhZHNpemUpOworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfYW1mX3JlYWRfc3RyaW5nKEdldEJ5dGVDb250ZXh0ICpiYywgdWludDhfdCAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Ryc2l6ZSwgaW50ICpsZW5ndGgpCit7CisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlKGJjKSAhPSBBTUZfREFUQV9UWVBFX1NUUklORykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgcmV0dXJuIGZmX2FtZl9nZXRfc3RyaW5nKGJjLCBzdHIsIHN0cnNpemUsIGxlbmd0aCk7Cit9CisKK2ludCBmZl9hbWZfcmVhZF9udWxsKEdldEJ5dGVDb250ZXh0ICpiYykKK3sKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoYmMpICE9IEFNRl9EQVRBX1RZUEVfTlVMTCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9ydG1wX2NoZWNrX2FsbG9jX2FycmF5KFJUTVBQYWNrZXQgKipwcmV2X3BrdCwgaW50ICpuYl9wcmV2X3BrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsKQoreworICAgIGludCBuYl9hbGxvYzsKKyAgICBSVE1QUGFja2V0ICpwdHI7CisgICAgaWYgKGNoYW5uZWwgPCAqbmJfcHJldl9wa3QpCisgICAgICAgIHJldHVybiAwOworCisgICAgbmJfYWxsb2MgPSBjaGFubmVsICsgMTY7CisgICAgLy8gVGhpcyBjYW4ndCB1c2UgdGhlIGF2X3JlYWxsb2NwIGZhbWlseSBvZiBmdW5jdGlvbnMsIHNpbmNlIHdlCisgICAgLy8gd291bGQgbmVlZCB0byBmcmVlIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgYmVmb3JlIHRoZSBhcnJheQorICAgIC8vIGl0c2VsZiBpcyBmcmVlZC4KKyAgICBwdHIgPSBhdl9yZWFsbG9jX2FycmF5KCpwcmV2X3BrdCwgbmJfYWxsb2MsIHNpemVvZigqKnByZXZfcGt0KSk7CisgICAgaWYgKCFwdHIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWVtc2V0KHB0ciArICpuYl9wcmV2X3BrdCwgMCwgKG5iX2FsbG9jIC0gKm5iX3ByZXZfcGt0KSAqIHNpemVvZigqcHRyKSk7CisgICAgKnByZXZfcGt0ID0gcHRyOworICAgICpuYl9wcmV2X3BrdCA9IG5iX2FsbG9jOworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfcnRtcF9wYWNrZXRfcmVhZChVUkxDb250ZXh0ICpoLCBSVE1QUGFja2V0ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNodW5rX3NpemUsIFJUTVBQYWNrZXQgKipwcmV2X3BrdCwgaW50ICpuYl9wcmV2X3BrdCkKK3sKKyAgICB1aW50OF90IGhkcjsKKworICAgIGlmIChmZnVybF9yZWFkKGgsICZoZHIsIDEpICE9IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICByZXR1cm4gZmZfcnRtcF9wYWNrZXRfcmVhZF9pbnRlcm5hbChoLCBwLCBjaHVua19zaXplLCBwcmV2X3BrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9wcmV2X3BrdCwgaGRyKTsKK30KKworc3RhdGljIGludCBydG1wX3BhY2tldF9yZWFkX29uZV9jaHVuayhVUkxDb250ZXh0ICpoLCBSVE1QUGFja2V0ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2h1bmtfc2l6ZSwgUlRNUFBhY2tldCAqKnByZXZfcGt0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuYl9wcmV2X3BrdCwgdWludDhfdCBoZHIpCit7CisKKyAgICB1aW50OF90IGJ1ZlsxNl07CisgICAgaW50IGNoYW5uZWxfaWQsIHRpbWVzdGFtcCwgc2l6ZTsKKyAgICB1aW50MzJfdCB0c19maWVsZDsgLy8gbm9uLWV4dGVuZGVkIHRpbWVzdGFtcCBvciBkZWx0YSBmaWVsZAorICAgIHVpbnQzMl90IGV4dHJhID0gMDsKKyAgICBlbnVtIFJUTVBQYWNrZXRUeXBlIHR5cGU7CisgICAgaW50IHdyaXR0ZW4gPSAwOworICAgIGludCByZXQsIHRvcmVhZDsKKyAgICBSVE1QUGFja2V0ICpwcmV2X3BrdDsKKworICAgIHdyaXR0ZW4rKzsKKyAgICBjaGFubmVsX2lkID0gaGRyICYgMHgzRjsKKworICAgIGlmIChjaGFubmVsX2lkIDwgMikgeyAvL3NwZWNpYWwgY2FzZSBmb3IgY2hhbm5lbCBudW1iZXIgPj0gNjQKKyAgICAgICAgYnVmWzFdID0gMDsKKyAgICAgICAgaWYgKGZmdXJsX3JlYWRfY29tcGxldGUoaCwgYnVmLCBjaGFubmVsX2lkICsgMSkgIT0gY2hhbm5lbF9pZCArIDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB3cml0dGVuICs9IGNoYW5uZWxfaWQgKyAxOworICAgICAgICBjaGFubmVsX2lkID0gQVZfUkwxNihidWYpICsgNjQ7CisgICAgfQorICAgIGlmICgocmV0ID0gZmZfcnRtcF9jaGVja19hbGxvY19hcnJheShwcmV2X3BrdF9wdHIsIG5iX3ByZXZfcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2lkKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHByZXZfcGt0ID0gKnByZXZfcGt0X3B0cjsKKyAgICBzaXplICA9IHByZXZfcGt0W2NoYW5uZWxfaWRdLnNpemU7CisgICAgdHlwZSAgPSBwcmV2X3BrdFtjaGFubmVsX2lkXS50eXBlOworICAgIGV4dHJhID0gcHJldl9wa3RbY2hhbm5lbF9pZF0uZXh0cmE7CisKKyAgICBoZHIgPj49IDY7IC8vIGhlYWRlciBzaXplIGluZGljYXRvcgorICAgIGlmIChoZHIgPT0gUlRNUF9QU19PTkVCWVRFKSB7CisgICAgICAgIHRzX2ZpZWxkID0gcHJldl9wa3RbY2hhbm5lbF9pZF0udHNfZmllbGQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZmdXJsX3JlYWRfY29tcGxldGUoaCwgYnVmLCAzKSAhPSAzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgd3JpdHRlbiArPSAzOworICAgICAgICB0c19maWVsZCA9IEFWX1JCMjQoYnVmKTsKKyAgICAgICAgaWYgKGhkciAhPSBSVE1QX1BTX0ZPVVJCWVRFUykgeworICAgICAgICAgICAgaWYgKGZmdXJsX3JlYWRfY29tcGxldGUoaCwgYnVmLCAzKSAhPSAzKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICB3cml0dGVuICs9IDM7CisgICAgICAgICAgICBzaXplID0gQVZfUkIyNChidWYpOworICAgICAgICAgICAgaWYgKGZmdXJsX3JlYWRfY29tcGxldGUoaCwgYnVmLCAxKSAhPSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICB3cml0dGVuKys7CisgICAgICAgICAgICB0eXBlID0gYnVmWzBdOworICAgICAgICAgICAgaWYgKGhkciA9PSBSVE1QX1BTX1RXRUxWRUJZVEVTKSB7CisgICAgICAgICAgICAgICAgaWYgKGZmdXJsX3JlYWRfY29tcGxldGUoaCwgYnVmLCA0KSAhPSA0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgIHdyaXR0ZW4gKz0gNDsKKyAgICAgICAgICAgICAgICBleHRyYSA9IEFWX1JMMzIoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodHNfZmllbGQgPT0gMHhGRkZGRkYpIHsKKyAgICAgICAgaWYgKGZmdXJsX3JlYWRfY29tcGxldGUoaCwgYnVmLCA0KSAhPSA0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgdGltZXN0YW1wID0gQVZfUkIzMihidWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVzdGFtcCA9IHRzX2ZpZWxkOworICAgIH0KKyAgICBpZiAoaGRyICE9IFJUTVBfUFNfVFdFTFZFQllURVMpCisgICAgICAgIHRpbWVzdGFtcCArPSBwcmV2X3BrdFtjaGFubmVsX2lkXS50aW1lc3RhbXA7CisKKyAgICBpZiAoIXByZXZfcGt0W2NoYW5uZWxfaWRdLnJlYWQpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUocCwgY2hhbm5lbF9pZCwgdHlwZSwgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcC0+cmVhZCA9IHdyaXR0ZW47CisgICAgICAgIHAtPm9mZnNldCA9IDA7CisgICAgICAgIHByZXZfcGt0W2NoYW5uZWxfaWRdLnRzX2ZpZWxkICAgPSB0c19maWVsZDsKKyAgICAgICAgcHJldl9wa3RbY2hhbm5lbF9pZF0udGltZXN0YW1wICA9IHRpbWVzdGFtcDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBwcmV2aW91cyBwYWNrZXQgaW4gdGhpcyBjaGFubmVsIGhhc24ndCBjb21wbGV0ZWQgcmVhZGluZworICAgICAgICBSVE1QUGFja2V0ICpwcmV2ID0gJnByZXZfcGt0W2NoYW5uZWxfaWRdOworICAgICAgICBwLT5kYXRhICAgICAgICAgID0gcHJldi0+ZGF0YTsKKyAgICAgICAgcC0+c2l6ZSAgICAgICAgICA9IHByZXYtPnNpemU7CisgICAgICAgIHAtPmNoYW5uZWxfaWQgICAgPSBwcmV2LT5jaGFubmVsX2lkOworICAgICAgICBwLT50eXBlICAgICAgICAgID0gcHJldi0+dHlwZTsKKyAgICAgICAgcC0+dHNfZmllbGQgICAgICA9IHByZXYtPnRzX2ZpZWxkOworICAgICAgICBwLT5leHRyYSAgICAgICAgID0gcHJldi0+ZXh0cmE7CisgICAgICAgIHAtPm9mZnNldCAgICAgICAgPSBwcmV2LT5vZmZzZXQ7CisgICAgICAgIHAtPnJlYWQgICAgICAgICAgPSBwcmV2LT5yZWFkICsgd3JpdHRlbjsKKyAgICAgICAgcC0+dGltZXN0YW1wICAgICA9IHByZXYtPnRpbWVzdGFtcDsKKyAgICAgICAgcHJldi0+ZGF0YSAgICAgICA9IE5VTEw7CisgICAgfQorICAgIHAtPmV4dHJhID0gZXh0cmE7CisgICAgLy8gc2F2ZSBoaXN0b3J5CisgICAgcHJldl9wa3RbY2hhbm5lbF9pZF0uY2hhbm5lbF9pZCA9IGNoYW5uZWxfaWQ7CisgICAgcHJldl9wa3RbY2hhbm5lbF9pZF0udHlwZSAgICAgICA9IHR5cGU7CisgICAgcHJldl9wa3RbY2hhbm5lbF9pZF0uc2l6ZSAgICAgICA9IHNpemU7CisgICAgcHJldl9wa3RbY2hhbm5lbF9pZF0uZXh0cmEgICAgICA9IGV4dHJhOworICAgIHNpemUgPSBzaXplIC0gcC0+b2Zmc2V0OworCisgICAgdG9yZWFkID0gRkZNSU4oc2l6ZSwgY2h1bmtfc2l6ZSk7CisgICAgaWYgKGZmdXJsX3JlYWRfY29tcGxldGUoaCwgcC0+ZGF0YSArIHAtPm9mZnNldCwgdG9yZWFkKSAhPSB0b3JlYWQpIHsKKyAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveShwKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgc2l6ZSAgICAgIC09IHRvcmVhZDsKKyAgICBwLT5yZWFkICAgKz0gdG9yZWFkOworICAgIHAtPm9mZnNldCArPSB0b3JlYWQ7CisKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICBSVE1QUGFja2V0ICpwcmV2ID0gJnByZXZfcGt0W2NoYW5uZWxfaWRdOworICAgICAgIHByZXYtPmRhdGEgPSBwLT5kYXRhOworICAgICAgIHByZXYtPnJlYWQgPSBwLT5yZWFkOworICAgICAgIHByZXYtPm9mZnNldCA9IHAtPm9mZnNldDsKKyAgICAgICBwLT5kYXRhICAgICAgPSBOVUxMOworICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgfQorCisgICAgcHJldl9wa3RbY2hhbm5lbF9pZF0ucmVhZCA9IDA7IC8vIHJlYWQgY29tcGxldGU7IHJlc2V0IGlmIG5lZWRlZAorICAgIHJldHVybiBwLT5yZWFkOworfQorCitpbnQgZmZfcnRtcF9wYWNrZXRfcmVhZF9pbnRlcm5hbChVUkxDb250ZXh0ICpoLCBSVE1QUGFja2V0ICpwLCBpbnQgY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBQYWNrZXQgKipwcmV2X3BrdCwgaW50ICpuYl9wcmV2X3BrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaGRyKQoreworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCByZXQgPSBydG1wX3BhY2tldF9yZWFkX29uZV9jaHVuayhoLCBwLCBjaHVua19zaXplLCBwcmV2X3BrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX3ByZXZfcGt0LCBoZHIpOworICAgICAgICBpZiAocmV0ID4gMCB8fCByZXQgIT0gQVZFUlJPUihFQUdBSU4pKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAoZmZ1cmxfcmVhZChoLCAmaGRyLCAxKSAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9Cit9CisKK2ludCBmZl9ydG1wX3BhY2tldF93cml0ZShVUkxDb250ZXh0ICpoLCBSVE1QUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNodW5rX3NpemUsIFJUTVBQYWNrZXQgKipwcmV2X3BrdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuYl9wcmV2X3BrdCkKK3sKKyAgICB1aW50OF90IHBrdF9oZHJbMTZdLCAqcCA9IHBrdF9oZHI7CisgICAgaW50IG1vZGUgPSBSVE1QX1BTX1RXRUxWRUJZVEVTOworICAgIGludCBvZmYgPSAwOworICAgIGludCB3cml0dGVuID0gMDsKKyAgICBpbnQgcmV0OworICAgIFJUTVBQYWNrZXQgKnByZXZfcGt0OworICAgIGludCB1c2VfZGVsdGE7IC8vIGZsYWcgaWYgdXNpbmcgdGltZXN0YW1wIGRlbHRhLCBub3QgUlRNUF9QU19UV0VMVkVCWVRFUworICAgIHVpbnQzMl90IHRpbWVzdGFtcDsgLy8gZnVsbCAzMi1iaXQgdGltZXN0YW1wIG9yIGRlbHRhIHZhbHVlCisKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfY2hlY2tfYWxsb2NfYXJyYXkocHJldl9wa3RfcHRyLCBuYl9wcmV2X3BrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5jaGFubmVsX2lkKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHByZXZfcGt0ID0gKnByZXZfcGt0X3B0cjsKKworICAgIC8vaWYgY2hhbm5lbF9pZCA9IDAsIHRoaXMgaXMgZmlyc3QgcHJlc2VudGF0aW9uIG9mIHByZXZfcGt0LCBzZW5kIGZ1bGwgaGRyLgorICAgIHVzZV9kZWx0YSA9IHByZXZfcGt0W3BrdC0+Y2hhbm5lbF9pZF0uY2hhbm5lbF9pZCAmJgorICAgICAgICBwa3QtPmV4dHJhID09IHByZXZfcGt0W3BrdC0+Y2hhbm5lbF9pZF0uZXh0cmEgJiYKKyAgICAgICAgcGt0LT50aW1lc3RhbXAgPj0gcHJldl9wa3RbcGt0LT5jaGFubmVsX2lkXS50aW1lc3RhbXA7CisKKyAgICB0aW1lc3RhbXAgPSBwa3QtPnRpbWVzdGFtcDsKKyAgICBpZiAodXNlX2RlbHRhKSB7CisgICAgICAgIHRpbWVzdGFtcCAtPSBwcmV2X3BrdFtwa3QtPmNoYW5uZWxfaWRdLnRpbWVzdGFtcDsKKyAgICB9CisgICAgaWYgKHRpbWVzdGFtcCA+PSAweEZGRkZGRikgeworICAgICAgICBwa3QtPnRzX2ZpZWxkID0gMHhGRkZGRkY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGt0LT50c19maWVsZCA9IHRpbWVzdGFtcDsKKyAgICB9CisKKyAgICBpZiAodXNlX2RlbHRhKSB7CisgICAgICAgIGlmIChwa3QtPnR5cGUgPT0gcHJldl9wa3RbcGt0LT5jaGFubmVsX2lkXS50eXBlICYmCisgICAgICAgICAgICBwa3QtPnNpemUgPT0gcHJldl9wa3RbcGt0LT5jaGFubmVsX2lkXS5zaXplKSB7CisgICAgICAgICAgICBtb2RlID0gUlRNUF9QU19GT1VSQllURVM7CisgICAgICAgICAgICBpZiAocGt0LT50c19maWVsZCA9PSBwcmV2X3BrdFtwa3QtPmNoYW5uZWxfaWRdLnRzX2ZpZWxkKQorICAgICAgICAgICAgICAgIG1vZGUgPSBSVE1QX1BTX09ORUJZVEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtb2RlID0gUlRNUF9QU19FSUdIVEJZVEVTOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBrdC0+Y2hhbm5lbF9pZCA8IDY0KSB7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIHBrdC0+Y2hhbm5lbF9pZCB8IChtb2RlIDw8IDYpKTsKKyAgICB9IGVsc2UgaWYgKHBrdC0+Y2hhbm5lbF9pZCA8IDY0ICsgMjU2KSB7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIDAgICAgICAgICAgICAgICB8IChtb2RlIDw8IDYpKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgcGt0LT5jaGFubmVsX2lkIC0gNjQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIDEgICAgICAgICAgICAgICB8IChtb2RlIDw8IDYpKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmcCwgcGt0LT5jaGFubmVsX2lkIC0gNjQpOworICAgIH0KKyAgICBpZiAobW9kZSAhPSBSVE1QX1BTX09ORUJZVEUpIHsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUyNCgmcCwgcGt0LT50c19maWVsZCk7CisgICAgICAgIGlmIChtb2RlICE9IFJUTVBfUFNfRk9VUkJZVEVTKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTI0KCZwLCBwa3QtPnNpemUpOworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgcGt0LT50eXBlKTsKKyAgICAgICAgICAgIGlmIChtb2RlID09IFJUTVBfUFNfVFdFTFZFQllURVMpCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmcCwgcGt0LT5leHRyYSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBrdC0+dHNfZmllbGQgPT0gMHhGRkZGRkYpCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnAsIHRpbWVzdGFtcCk7CisgICAgLy8gc2F2ZSBoaXN0b3J5CisgICAgcHJldl9wa3RbcGt0LT5jaGFubmVsX2lkXS5jaGFubmVsX2lkID0gcGt0LT5jaGFubmVsX2lkOworICAgIHByZXZfcGt0W3BrdC0+Y2hhbm5lbF9pZF0udHlwZSAgICAgICA9IHBrdC0+dHlwZTsKKyAgICBwcmV2X3BrdFtwa3QtPmNoYW5uZWxfaWRdLnNpemUgICAgICAgPSBwa3QtPnNpemU7CisgICAgcHJldl9wa3RbcGt0LT5jaGFubmVsX2lkXS50aW1lc3RhbXAgID0gcGt0LT50aW1lc3RhbXA7CisgICAgcHJldl9wa3RbcGt0LT5jaGFubmVsX2lkXS50c19maWVsZCAgID0gcGt0LT50c19maWVsZDsKKyAgICBwcmV2X3BrdFtwa3QtPmNoYW5uZWxfaWRdLmV4dHJhICAgICAgPSBwa3QtPmV4dHJhOworCisgICAgaWYgKChyZXQgPSBmZnVybF93cml0ZShoLCBwa3RfaGRyLCBwIC0gcGt0X2hkcikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB3cml0dGVuID0gcCAtIHBrdF9oZHIgKyBwa3QtPnNpemU7CisgICAgd2hpbGUgKG9mZiA8IHBrdC0+c2l6ZSkgeworICAgICAgICBpbnQgdG93cml0ZSA9IEZGTUlOKGNodW5rX3NpemUsIHBrdC0+c2l6ZSAtIG9mZik7CisgICAgICAgIGlmICgocmV0ID0gZmZ1cmxfd3JpdGUoaCwgcGt0LT5kYXRhICsgb2ZmLCB0b3dyaXRlKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgb2ZmICs9IHRvd3JpdGU7CisgICAgICAgIGlmIChvZmYgPCBwa3QtPnNpemUpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbWFya2VyID0gMHhDMCB8IHBrdC0+Y2hhbm5lbF9pZDsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZ1cmxfd3JpdGUoaCwgJm1hcmtlciwgMSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgd3JpdHRlbisrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB3cml0dGVuOworfQorCitpbnQgZmZfcnRtcF9wYWNrZXRfY3JlYXRlKFJUTVBQYWNrZXQgKnBrdCwgaW50IGNoYW5uZWxfaWQsIFJUTVBQYWNrZXRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lc3RhbXAsIGludCBzaXplKQoreworICAgIGlmIChzaXplKSB7CisgICAgICAgIHBrdC0+ZGF0YSA9IGF2X3JlYWxsb2MoTlVMTCwgc2l6ZSk7CisgICAgICAgIGlmICghcGt0LT5kYXRhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgcGt0LT5zaXplICAgICAgID0gc2l6ZTsKKyAgICBwa3QtPmNoYW5uZWxfaWQgPSBjaGFubmVsX2lkOworICAgIHBrdC0+dHlwZSAgICAgICA9IHR5cGU7CisgICAgcGt0LT50aW1lc3RhbXAgID0gdGltZXN0YW1wOworICAgIHBrdC0+ZXh0cmEgICAgICA9IDA7CisgICAgcGt0LT50c19maWVsZCAgID0gMDsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koUlRNUFBhY2tldCAqcGt0KQoreworICAgIGlmICghcGt0KQorICAgICAgICByZXR1cm47CisgICAgYXZfZnJlZXAoJnBrdC0+ZGF0YSk7CisgICAgcGt0LT5zaXplID0gMDsKK30KKworaW50IGZmX2FtZl90YWdfc2l6ZShjb25zdCB1aW50OF90ICpkYXRhLCBjb25zdCB1aW50OF90ICpkYXRhX2VuZCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpiYXNlID0gZGF0YTsKKyAgICBBTUZEYXRhVHlwZSB0eXBlOworICAgIHVuc2lnbmVkIG5iICAgPSAtMTsKKyAgICBpbnQgcGFyc2Vfa2V5ID0gMTsKKworICAgIGlmIChkYXRhID49IGRhdGFfZW5kKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3dpdGNoICgodHlwZSA9ICpkYXRhKyspKSB7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX05VTUJFUjogICAgICByZXR1cm4gOTsKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfQk9PTDogICAgICAgIHJldHVybiAyOworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9TVFJJTkc6ICAgICAgcmV0dXJuIDMgKyBBVl9SQjE2KGRhdGEpOworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9MT05HX1NUUklORzogcmV0dXJuIDUgKyBBVl9SQjMyKGRhdGEpOworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9OVUxMOiAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX0FSUkFZOgorICAgICAgICBwYXJzZV9rZXkgPSAwOworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9NSVhFREFSUkFZOgorICAgICAgICBuYiA9IGJ5dGVzdHJlYW1fZ2V0X2JlMzIoJmRhdGEpOworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9PQkpFQ1Q6CisgICAgICAgIHdoaWxlIChuYi0tID4gMCB8fCB0eXBlICE9IEFNRl9EQVRBX1RZUEVfQVJSQVkpIHsKKyAgICAgICAgICAgIGludCB0OworICAgICAgICAgICAgaWYgKHBhcnNlX2tleSkgeworICAgICAgICAgICAgICAgIGludCBzaXplID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmZGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKCFzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGErKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMCB8fCBzaXplID49IGRhdGFfZW5kIC0gZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGRhdGEgKz0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQgPSBmZl9hbWZfdGFnX3NpemUoZGF0YSwgZGF0YV9lbmQpOworICAgICAgICAgICAgaWYgKHQgPCAwIHx8IHQgPj0gZGF0YV9lbmQgLSBkYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGRhdGEgKz0gdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YSAtIGJhc2U7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX09CSkVDVF9FTkQ6ICByZXR1cm4gMTsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK2ludCBmZl9hbWZfZ2V0X2ZpZWxkX3ZhbHVlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGFfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbmFtZSwgdWludDhfdCAqZHN0LCBpbnQgZHN0X3NpemUpCit7CisgICAgaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgaW50IGxlbjsKKworICAgIHdoaWxlICgqZGF0YSAhPSBBTUZfREFUQV9UWVBFX09CSkVDVCAmJiBkYXRhIDwgZGF0YV9lbmQpIHsKKyAgICAgICAgbGVuID0gZmZfYW1mX3RhZ19zaXplKGRhdGEsIGRhdGFfZW5kKTsKKyAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICBsZW4gPSBkYXRhX2VuZCAtIGRhdGE7CisgICAgICAgIGRhdGEgKz0gbGVuOworICAgIH0KKyAgICBpZiAoZGF0YV9lbmQgLSBkYXRhIDwgMykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGRhdGErKzsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBzaXplID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmZGF0YSk7CisgICAgICAgIGlmICghc2l6ZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+PSBkYXRhX2VuZCAtIGRhdGEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGRhdGEgKz0gc2l6ZTsKKyAgICAgICAgaWYgKHNpemUgPT0gbmFtZWxlbiAmJiAhbWVtY21wKGRhdGEtc2l6ZSwgbmFtZSwgbmFtZWxlbikpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoKmRhdGErKykgeworICAgICAgICAgICAgY2FzZSBBTUZfREFUQV9UWVBFX05VTUJFUjoKKyAgICAgICAgICAgICAgICBzbnByaW50Zihkc3QsIGRzdF9zaXplLCAiJWciLCBhdl9pbnQyZG91YmxlKEFWX1JCNjQoZGF0YSkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9CT09MOgorICAgICAgICAgICAgICAgIHNucHJpbnRmKGRzdCwgZHN0X3NpemUsICIlcyIsICpkYXRhID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNRl9EQVRBX1RZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgIGxlbiA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmRhdGEpOworICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkoZHN0LCBkYXRhLCBGRk1JTihsZW4rMSwgZHN0X3NpemUpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gZmZfYW1mX3RhZ19zaXplKGRhdGEsIGRhdGFfZW5kKTsKKyAgICAgICAgaWYgKGxlbiA8IDAgfHwgbGVuID49IGRhdGFfZW5kIC0gZGF0YSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZGF0YSArPSBsZW47CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIHJ0bXBfcGFja2V0X3R5cGUoaW50IHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBSVE1QX1BUX0NIVU5LX1NJWkU6ICAgICByZXR1cm4gImNodW5rIHNpemUiOworICAgIGNhc2UgUlRNUF9QVF9CWVRFU19SRUFEOiAgICAgcmV0dXJuICJieXRlcyByZWFkIjsKKyAgICBjYXNlIFJUTVBfUFRfUElORzogICAgICAgICAgIHJldHVybiAicGluZyI7CisgICAgY2FzZSBSVE1QX1BUX1NFUlZFUl9CVzogICAgICByZXR1cm4gInNlcnZlciBiYW5kd2lkdGgiOworICAgIGNhc2UgUlRNUF9QVF9DTElFTlRfQlc6ICAgICAgcmV0dXJuICJjbGllbnQgYmFuZHdpZHRoIjsKKyAgICBjYXNlIFJUTVBfUFRfQVVESU86ICAgICAgICAgIHJldHVybiAiYXVkaW8gcGFja2V0IjsKKyAgICBjYXNlIFJUTVBfUFRfVklERU86ICAgICAgICAgIHJldHVybiAidmlkZW8gcGFja2V0IjsKKyAgICBjYXNlIFJUTVBfUFRfRkxFWF9TVFJFQU06ICAgIHJldHVybiAiRmxleCBzaGFyZWQgc3RyZWFtIjsKKyAgICBjYXNlIFJUTVBfUFRfRkxFWF9PQkpFQ1Q6ICAgIHJldHVybiAiRmxleCBzaGFyZWQgb2JqZWN0IjsKKyAgICBjYXNlIFJUTVBfUFRfRkxFWF9NRVNTQUdFOiAgIHJldHVybiAiRmxleCBzaGFyZWQgbWVzc2FnZSI7CisgICAgY2FzZSBSVE1QX1BUX05PVElGWTogICAgICAgICByZXR1cm4gIm5vdGlmaWNhdGlvbiI7CisgICAgY2FzZSBSVE1QX1BUX1NIQVJFRF9PQko6ICAgICByZXR1cm4gInNoYXJlZCBvYmplY3QiOworICAgIGNhc2UgUlRNUF9QVF9JTlZPS0U6ICAgICAgICAgcmV0dXJuICJpbnZva2UiOworICAgIGNhc2UgUlRNUF9QVF9NRVRBREFUQTogICAgICAgcmV0dXJuICJtZXRhZGF0YSI7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24iOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYW1mX3RhZ19jb250ZW50cyh2b2lkICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGFfZW5kKQoreworICAgIHVuc2lnbmVkIGludCBzaXplLCBuYiA9IC0xOworICAgIGNoYXIgYnVmWzEwMjRdOworICAgIEFNRkRhdGFUeXBlIHR5cGU7CisgICAgaW50IHBhcnNlX2tleSA9IDE7CisKKyAgICBpZiAoZGF0YSA+PSBkYXRhX2VuZCkKKyAgICAgICAgcmV0dXJuOworICAgIHN3aXRjaCAoKHR5cGUgPSAqZGF0YSsrKSkgeworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9OVU1CRVI6CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiBudW1iZXIgJWdcbiIsIGF2X2ludDJkb3VibGUoQVZfUkI2NChkYXRhKSkpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX0JPT0w6CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiBib29sICVkXG4iLCAqZGF0YSk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfU1RSSU5HOgorICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9MT05HX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUgPT0gQU1GX0RBVEFfVFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICAgIHNpemUgPSBieXRlc3RyZWFtX2dldF9iZTE2KCZkYXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgPSBieXRlc3RyZWFtX2dldF9iZTMyKCZkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBzaXplID0gRkZNSU4oc2l6ZSwgc2l6ZW9mKGJ1ZikgLSAxKTsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgZGF0YSwgc2l6ZSk7CisgICAgICAgIGJ1ZltzaXplXSA9IDA7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiBzdHJpbmcgJyVzJ1xuIiwgYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9OVUxMOgorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICIgTlVMTFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfQVJSQVk6CisgICAgICAgIHBhcnNlX2tleSA9IDA7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX01JWEVEQVJSQVk6CisgICAgICAgIG5iID0gYnl0ZXN0cmVhbV9nZXRfYmUzMigmZGF0YSk7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX09CSkVDVDoKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiIHtcbiIpOworICAgICAgICB3aGlsZSAobmItLSA+IDAgfHwgdHlwZSAhPSBBTUZfREFUQV9UWVBFX0FSUkFZKSB7CisgICAgICAgICAgICBpbnQgdDsKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXkpIHsKKyAgICAgICAgICAgICAgICBzaXplID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmZGF0YSk7CisgICAgICAgICAgICAgICAgc2l6ZSA9IEZGTUlOKHNpemUsIHNpemVvZihidWYpIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKCFzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiB9XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSsrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZiwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgYnVmW3NpemVdID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSBkYXRhX2VuZCAtIGRhdGEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBkYXRhICs9IHNpemU7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiICAlczogIiwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFtZl90YWdfY29udGVudHMoY3R4LCBkYXRhLCBkYXRhX2VuZCk7CisgICAgICAgICAgICB0ID0gZmZfYW1mX3RhZ19zaXplKGRhdGEsIGRhdGFfZW5kKTsKKyAgICAgICAgICAgIGlmICh0IDwgMCB8fCB0ID49IGRhdGFfZW5kIC0gZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBkYXRhICs9IHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9PQkpFQ1RfRU5EOgorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICIgfVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm47CisgICAgfQorfQorCit2b2lkIGZmX3J0bXBfcGFja2V0X2R1bXAodm9pZCAqY3R4LCBSVE1QUGFja2V0ICpwKQoreworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlJUTVAgcGFja2V0IHR5cGUgJyVzJyglZCkgZm9yIGNoYW5uZWwgJWQsIHRpbWVzdGFtcCAlZCwgZXh0cmEgZmllbGQgJWQgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgcnRtcF9wYWNrZXRfdHlwZShwLT50eXBlKSwgcC0+dHlwZSwgcC0+Y2hhbm5lbF9pZCwgcC0+dGltZXN0YW1wLCBwLT5leHRyYSwgcC0+c2l6ZSk7CisgICAgaWYgKHAtPnR5cGUgPT0gUlRNUF9QVF9JTlZPS0UgfHwgcC0+dHlwZSA9PSBSVE1QX1BUX05PVElGWSkgeworICAgICAgICB1aW50OF90ICpzcmMgPSBwLT5kYXRhLCAqc3JjX2VuZCA9IHAtPmRhdGEgKyBwLT5zaXplOworICAgICAgICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgeworICAgICAgICAgICAgaW50IHN6OworICAgICAgICAgICAgYW1mX3RhZ19jb250ZW50cyhjdHgsIHNyYywgc3JjX2VuZCk7CisgICAgICAgICAgICBzeiA9IGZmX2FtZl90YWdfc2l6ZShzcmMsIHNyY19lbmQpOworICAgICAgICAgICAgaWYgKHN6IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHNyYyArPSBzejsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocC0+dHlwZSA9PSBSVE1QX1BUX1NFUlZFUl9CVyl7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlNlcnZlciBCVyA9ICVkXG4iLCBBVl9SQjMyKHAtPmRhdGEpKTsKKyAgICB9IGVsc2UgaWYgKHAtPnR5cGUgPT0gUlRNUF9QVF9DTElFTlRfQlcpeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJDbGllbnQgQlcgPSAlZFxuIiwgQVZfUkIzMihwLT5kYXRhKSk7CisgICAgfSBlbHNlIGlmIChwLT50eXBlICE9IFJUTVBfUFRfQVVESU8gJiYgcC0+dHlwZSAhPSBSVE1QX1BUX1ZJREVPICYmIHAtPnR5cGUgIT0gUlRNUF9QVF9NRVRBREFUQSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHAtPnNpemU7IGkrKykKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiAlMDJYIiwgcC0+ZGF0YVtpXSk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7CisgICAgfQorfQorCitpbnQgZmZfYW1mX21hdGNoX3N0cmluZyhjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSwgY29uc3QgY2hhciAqc3RyKQoreworICAgIGludCBsZW4gPSBzdHJsZW4oc3RyKTsKKyAgICBpbnQgYW1mX2xlbiwgdHlwZTsKKworICAgIGlmIChzaXplIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB0eXBlID0gKmRhdGErKzsKKworICAgIGlmICh0eXBlICE9IEFNRl9EQVRBX1RZUEVfTE9OR19TVFJJTkcgJiYKKyAgICAgICAgdHlwZSAhPSBBTUZfREFUQV9UWVBFX1NUUklORykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAodHlwZSA9PSBBTUZfREFUQV9UWVBFX0xPTkdfU1RSSU5HKSB7CisgICAgICAgIGlmICgoc2l6ZSAtPSA0ICsgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGFtZl9sZW4gPSBieXRlc3RyZWFtX2dldF9iZTMyKCZkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHNpemUgLT0gMiArIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBhbWZfbGVuID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmZGF0YSk7CisgICAgfQorCisgICAgaWYgKGFtZl9sZW4gPiBzaXplKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChhbWZfbGVuICE9IGxlbikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gIW1lbWNtcChkYXRhLCBzdHIsIGxlbik7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRtcHBrdC5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0bXBwa3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDgyYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0bXBwa3QuaApAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIFJUTVAgcGFja2V0IHV0aWxpdGllcworICogQ29weXJpZ2h0IChjKSAyMDA5IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9SVE1QUEtUX0gKKyNkZWZpbmUgQVZGT1JNQVRfUlRNUFBLVF9ICisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInVybC5oIgorCisvKiogbWF4aW11bSBwb3NzaWJsZSBudW1iZXIgb2YgZGlmZmVyZW50IFJUTVAgY2hhbm5lbHMgKi8KKyNkZWZpbmUgUlRNUF9DSEFOTkVMUyA2NTU5OQorCisvKioKKyAqIGNoYW5uZWxzIHVzZWQgdG8gZm9yIFJUTVAgcGFja2V0cyB3aXRoIGRpZmZlcmVudCBwdXJwb3NlcyAoaS5lLiBkYXRhLCBuZXR3b3JrCisgKiBjb250cm9sLCByZW1vdGUgcHJvY2VkdXJlIGNhbGxzLCBldGMuKQorICovCitlbnVtIFJUTVBDaGFubmVsIHsKKyAgICBSVE1QX05FVFdPUktfQ0hBTk5FTCA9IDIsICAgLy8vPCBjaGFubmVsIGZvciBuZXR3b3JrLXJlbGF0ZWQgbWVzc2FnZXMgKGJhbmR3aWR0aCByZXBvcnQsIHBpbmcsIGV0YykKKyAgICBSVE1QX1NZU1RFTV9DSEFOTkVMLCAgICAgICAgLy8vPCBjaGFubmVsIGZvciBzZW5kaW5nIHNlcnZlciBjb250cm9sIG1lc3NhZ2VzCisgICAgUlRNUF9BVURJT19DSEFOTkVMLCAgICAgICAgIC8vLzwgY2hhbm5lbCBmb3IgYXVkaW8gZGF0YQorICAgIFJUTVBfVklERU9fQ0hBTk5FTCAgID0gNiwgICAvLy88IGNoYW5uZWwgZm9yIHZpZGVvIGRhdGEKKyAgICBSVE1QX1NPVVJDRV9DSEFOTkVMICA9IDgsICAgLy8vPCBjaGFubmVsIGZvciBhL3YgaW52b2tlcworfTsKKworLyoqCisgKiBrbm93biBSVE1QIHBhY2tldCB0eXBlcworICovCit0eXBlZGVmIGVudW0gUlRNUFBhY2tldFR5cGUgeworICAgIFJUTVBfUFRfQ0hVTktfU0laRSAgID0gIDEsICAvLy88IGNodW5rIHNpemUgY2hhbmdlCisgICAgUlRNUF9QVF9CWVRFU19SRUFEICAgPSAgMywgIC8vLzwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAgICBSVE1QX1BUX1BJTkcsICAgICAgICAgICAgICAgLy8vPCBwaW5nCisgICAgUlRNUF9QVF9TRVJWRVJfQlcsICAgICAgICAgIC8vLzwgc2VydmVyIGJhbmR3aWR0aAorICAgIFJUTVBfUFRfQ0xJRU5UX0JXLCAgICAgICAgICAvLy88IGNsaWVudCBiYW5kd2lkdGgKKyAgICBSVE1QX1BUX0FVRElPICAgICAgICA9ICA4LCAgLy8vPCBhdWRpbyBwYWNrZXQKKyAgICBSVE1QX1BUX1ZJREVPLCAgICAgICAgICAgICAgLy8vPCB2aWRlbyBwYWNrZXQKKyAgICBSVE1QX1BUX0ZMRVhfU1RSRUFNICA9IDE1LCAgLy8vPCBGbGV4IHNoYXJlZCBzdHJlYW0KKyAgICBSVE1QX1BUX0ZMRVhfT0JKRUNULCAgICAgICAgLy8vPCBGbGV4IHNoYXJlZCBvYmplY3QKKyAgICBSVE1QX1BUX0ZMRVhfTUVTU0FHRSwgICAgICAgLy8vPCBGbGV4IHNoYXJlZCBtZXNzYWdlCisgICAgUlRNUF9QVF9OT1RJRlksICAgICAgICAgICAgIC8vLzwgc29tZSBub3RpZmljYXRpb24KKyAgICBSVE1QX1BUX1NIQVJFRF9PQkosICAgICAgICAgLy8vPCBzaGFyZWQgb2JqZWN0CisgICAgUlRNUF9QVF9JTlZPS0UsICAgICAgICAgICAgIC8vLzwgaW52b2tlIHNvbWUgc3RyZWFtIGFjdGlvbgorICAgIFJUTVBfUFRfTUVUQURBVEEgICAgID0gMjIsICAvLy88IEZMViBtZXRhZGF0YQorfSBSVE1QUGFja2V0VHlwZTsKKworLyoqCisgKiBwb3NzaWJsZSBSVE1QIHBhY2tldCBoZWFkZXIgc2l6ZXMKKyAqLworZW51bSBSVE1QUGFja2V0U2l6ZSB7CisgICAgUlRNUF9QU19UV0VMVkVCWVRFUyA9IDAsIC8vLzwgcGFja2V0IGhhcyAxMi1ieXRlIGhlYWRlcgorICAgIFJUTVBfUFNfRUlHSFRCWVRFUywgICAgICAvLy88IHBhY2tldCBoYXMgOC1ieXRlIGhlYWRlcgorICAgIFJUTVBfUFNfRk9VUkJZVEVTLCAgICAgICAvLy88IHBhY2tldCBoYXMgNC1ieXRlIGhlYWRlcgorICAgIFJUTVBfUFNfT05FQllURSAgICAgICAgICAvLy88IHBhY2tldCBpcyByZWFsbHkgYSBuZXh0IGNodW5rIG9mIGEgcGFja2V0Cit9OworCisvKioKKyAqIHN0cnVjdHVyZSBmb3IgaG9sZGluZyBSVE1QIHBhY2tldHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUlRNUFBhY2tldCB7CisgICAgaW50ICAgICAgICAgICAgY2hhbm5lbF9pZDsgLy8vPCBSVE1QIGNoYW5uZWwgSUQgKG5vdGhpbmcgdG8gZG8gd2l0aCBhdWRpby92aWRlbyBjaGFubmVscyB0aG91Z2gpCisgICAgUlRNUFBhY2tldFR5cGUgdHlwZTsgICAgICAgLy8vPCBwYWNrZXQgcGF5bG9hZCB0eXBlCisgICAgdWludDMyX3QgICAgICAgdGltZXN0YW1wOyAgLy8vPCBwYWNrZXQgZnVsbCB0aW1lc3RhbXAKKyAgICB1aW50MzJfdCAgICAgICB0c19maWVsZDsgICAvLy88IDI0LWJpdCB0aW1lc3RhbXAgb3IgaW5jcmVtZW50IHRvIHRoZSBwcmV2aW91cyBvbmUsIGluIG1pbGxpc2Vjb25kcyAobGF0dGVyIG9ubHkgZm9yIG1lZGlhIHBhY2tldHMpLiBDbGlwcGVkIHRvIGEgbWF4aW11bSBvZiAweEZGRkZGRiwgaW5kaWNhdGluZyBhbiBleHRlbmRlZCB0aW1lc3RhbXAgZmllbGQuCisgICAgdWludDMyX3QgICAgICAgZXh0cmE7ICAgICAgLy8vPCBwcm9iYWJseSBhbiBhZGRpdGlvbmFsIGNoYW5uZWwgSUQgdXNlZCBkdXJpbmcgc3RyZWFtaW5nIGRhdGEKKyAgICB1aW50OF90ICAgICAgICAqZGF0YTsgICAgICAvLy88IHBhY2tldCBwYXlsb2FkCisgICAgaW50ICAgICAgICAgICAgc2l6ZTsgICAgICAgLy8vPCBwYWNrZXQgcGF5bG9hZCBzaXplCisgICAgaW50ICAgICAgICAgICAgb2Zmc2V0OyAgICAgLy8vPCBhbW91bnQgb2YgZGF0YSByZWFkIHNvIGZhcgorICAgIGludCAgICAgICAgICAgIHJlYWQ7ICAgICAgIC8vLzwgYW1vdW50IHJlYWQsIGluY2x1ZGluZyBoZWFkZXJzCit9IFJUTVBQYWNrZXQ7CisKKy8qKgorICogQ3JlYXRlIG5ldyBSVE1QIHBhY2tldCB3aXRoIGdpdmVuIGF0dHJpYnV0ZXMuCisgKgorICogQHBhcmFtIHBrdCAgICAgICAgcGFja2V0CisgKiBAcGFyYW0gY2hhbm5lbF9pZCBwYWNrZXQgY2hhbm5lbCBJRAorICogQHBhcmFtIHR5cGUgICAgICAgcGFja2V0IHR5cGUKKyAqIEBwYXJhbSB0aW1lc3RhbXAgIHBhY2tldCB0aW1lc3RhbXAKKyAqIEBwYXJhbSBzaXplICAgICAgIHBhY2tldCBzaXplCisgKiBAcmV0dXJuIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK2ludCBmZl9ydG1wX3BhY2tldF9jcmVhdGUoUlRNUFBhY2tldCAqcGt0LCBpbnQgY2hhbm5lbF9pZCwgUlRNUFBhY2tldFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVzdGFtcCwgaW50IHNpemUpOworCisvKioKKyAqIEZyZWUgUlRNUCBwYWNrZXQuCisgKgorICogQHBhcmFtIHBrdCBwYWNrZXQKKyAqLwordm9pZCBmZl9ydG1wX3BhY2tldF9kZXN0cm95KFJUTVBQYWNrZXQgKnBrdCk7CisKKy8qKgorICogUmVhZCBSVE1QIHBhY2tldCBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgKgorICogQHBhcmFtIGggICAgICAgICAgcmVhZGVyIGNvbnRleHQKKyAqIEBwYXJhbSBwICAgICAgICAgIHBhY2tldAorICogQHBhcmFtIGNodW5rX3NpemUgY3VycmVudCBjaHVuayBzaXplCisgKiBAcGFyYW0gcHJldl9wa3QgICBwcmV2aW91c2x5IHJlYWQgcGFja2V0IGhlYWRlcnMgZm9yIGFsbCBjaGFubmVscworICogICAgICAgICAgICAgICAgICAgKG1heSBiZSBuZWVkZWQgZm9yIHJlc3RvcmluZyBpbmNvbXBsZXRlIHBhY2tldCBoZWFkZXIpCisgKiBAcGFyYW0gbmJfcHJldl9wa3QgbnVtYmVyIG9mIGFsbG9jYXRlZCBlbGVtZW50cyBpbiBwcmV2X3BrdAorICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UKKyAqLworaW50IGZmX3J0bXBfcGFja2V0X3JlYWQoVVJMQ29udGV4dCAqaCwgUlRNUFBhY2tldCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHVua19zaXplLCBSVE1QUGFja2V0ICoqcHJldl9wa3QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5iX3ByZXZfcGt0KTsKKy8qKgorICogUmVhZCBpbnRlcm5hbCBSVE1QIHBhY2tldCBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgKgorICogQHBhcmFtIGggICAgICAgICAgcmVhZGVyIGNvbnRleHQKKyAqIEBwYXJhbSBwICAgICAgICAgIHBhY2tldAorICogQHBhcmFtIGNodW5rX3NpemUgY3VycmVudCBjaHVuayBzaXplCisgKiBAcGFyYW0gcHJldl9wa3QgICBwcmV2aW91c2x5IHJlYWQgcGFja2V0IGhlYWRlcnMgZm9yIGFsbCBjaGFubmVscworICogICAgICAgICAgICAgICAgICAgKG1heSBiZSBuZWVkZWQgZm9yIHJlc3RvcmluZyBpbmNvbXBsZXRlIHBhY2tldCBoZWFkZXIpCisgKiBAcGFyYW0gbmJfcHJldl9wa3QgbnVtYmVyIG9mIGFsbG9jYXRlZCBlbGVtZW50cyBpbiBwcmV2X3BrdAorICogQHBhcmFtIGMgICAgICAgICAgdGhlIGZpcnN0IGJ5dGUgYWxyZWFkeSByZWFkCisgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZQorICovCitpbnQgZmZfcnRtcF9wYWNrZXRfcmVhZF9pbnRlcm5hbChVUkxDb250ZXh0ICpoLCBSVE1QUGFja2V0ICpwLCBpbnQgY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBQYWNrZXQgKipwcmV2X3BrdCwgaW50ICpuYl9wcmV2X3BrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYyk7CisKKy8qKgorICogU2VuZCBSVE1QIHBhY2tldCB0byB0aGUgc2VydmVyLgorICoKKyAqIEBwYXJhbSBoICAgICAgICAgIHJlYWRlciBjb250ZXh0CisgKiBAcGFyYW0gcCAgICAgICAgICBwYWNrZXQgdG8gc2VuZAorICogQHBhcmFtIGNodW5rX3NpemUgY3VycmVudCBjaHVuayBzaXplCisgKiBAcGFyYW0gcHJldl9wa3QgICBwcmV2aW91c2x5IHNlbnQgcGFja2V0IGhlYWRlcnMgZm9yIGFsbCBjaGFubmVscworICogICAgICAgICAgICAgICAgICAgKG1heSBiZSB1c2VkIGZvciBwYWNrZXQgaGVhZGVyIGNvbXByZXNzaW5nKQorICogQHBhcmFtIG5iX3ByZXZfcGt0IG51bWJlciBvZiBhbGxvY2F0ZWQgZWxlbWVudHMgaW4gcHJldl9wa3QKKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK2ludCBmZl9ydG1wX3BhY2tldF93cml0ZShVUkxDb250ZXh0ICpoLCBSVE1QUGFja2V0ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHVua19zaXplLCBSVE1QUGFja2V0ICoqcHJldl9wa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuYl9wcmV2X3BrdCk7CisKKy8qKgorICogUHJpbnQgaW5mb3JtYXRpb24gYW5kIGNvbnRlbnRzIG9mIFJUTVAgcGFja2V0LgorICoKKyAqIEBwYXJhbSBjdHggICAgICAgIG91dHB1dCBjb250ZXh0CisgKiBAcGFyYW0gcCAgICAgICAgICBwYWNrZXQgdG8gZHVtcAorICovCit2b2lkIGZmX3J0bXBfcGFja2V0X2R1bXAodm9pZCAqY3R4LCBSVE1QUGFja2V0ICpwKTsKKworLyoqCisgKiBFbmxhcmdlIHRoZSBwcmV2X3BrdCBhcnJheSB0byBmaXQgdGhlIGdpdmVuIGNoYW5uZWwKKyAqCisgKiBAcGFyYW0gcHJldl9wa3QgICAgYXJyYXkgd2l0aCBwcmV2aW91c2x5IHNlbnQgcGFja2V0IGhlYWRlcnMKKyAqIEBwYXJhbSBuYl9wcmV2X3BrdCBudW1iZXIgb2YgYWxsb2NhdGVkIGVsZW1lbnRzIGluIHByZXZfcGt0CisgKiBAcGFyYW0gY2hhbm5lbCAgICAgdGhlIGNoYW5uZWwgbnVtYmVyIHRoYXQgbmVlZHMgdG8gYmUgYWxsb2NhdGVkCisgKi8KK2ludCBmZl9ydG1wX2NoZWNrX2FsbG9jX2FycmF5KFJUTVBQYWNrZXQgKipwcmV2X3BrdCwgaW50ICpuYl9wcmV2X3BrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsKTsKKworLyoqCisgKiBAbmFtZSBGdW5jdGlvbnMgdXNlZCB0byB3b3JrIHdpdGggdGhlIEFNRiBmb3JtYXQgKHdoaWNoIGlzIGFsc28gdXNlZCBpbiAuZmx2KQorICogQHNlZSBhbWZfKiBmdW5jcyBpbiBsaWJhdmZvcm1hdC9mbHZkZWMuYworICogQHsKKyAqLworCisvKioKKyAqIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgdGFrZW4gYnkgZmlyc3QgQU1GIGVudHJ5IGluIGRhdGEuCisgKgorICogQHBhcmFtIGRhdGEgaW5wdXQgZGF0YQorICogQHBhcmFtIGRhdGFfZW5kIGlucHV0IGJ1ZmZlciBlbmQKKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYnkgZmlyc3QgQU1GIGVudHJ5CisgKi8KK2ludCBmZl9hbWZfdGFnX3NpemUoY29uc3QgdWludDhfdCAqZGF0YSwgY29uc3QgdWludDhfdCAqZGF0YV9lbmQpOworCisvKioKKyAqIFJldHJpZXZlIHZhbHVlIG9mIGdpdmVuIEFNRiBvYmplY3QgZmllbGQgaW4gc3RyaW5nIGZvcm0uCisgKgorICogQHBhcmFtIGRhdGEgICAgIEFNRiBvYmplY3QgZGF0YQorICogQHBhcmFtIGRhdGFfZW5kIGlucHV0IGJ1ZmZlciBlbmQKKyAqIEBwYXJhbSBuYW1lICAgICBuYW1lIG9mIGZpZWxkIHRvIHJldHJpZXZlCisgKiBAcGFyYW0gZHN0ICAgICAgYnVmZmVyIGZvciBzdG9yaW5nIHJlc3VsdAorICogQHBhcmFtIGRzdF9zaXplIG91dHB1dCBidWZmZXIgc2l6ZQorICogQHJldHVybiAwIGlmIHNlYXJjaCBhbmQgcmV0cmlldmFsIHN1Y2NlZWRlZCwgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK2ludCBmZl9hbWZfZ2V0X2ZpZWxkX3ZhbHVlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGFfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbmFtZSwgdWludDhfdCAqZHN0LCBpbnQgZHN0X3NpemUpOworCisvKioKKyAqIFdyaXRlIGJvb2xlYW4gdmFsdWUgaW4gQU1GIGZvcm1hdCB0byBidWZmZXIuCisgKgorICogQHBhcmFtIGRzdCBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKHdpbGwgYmUgbW9kaWZpZWQpCisgKiBAcGFyYW0gdmFsIHZhbHVlIHRvIHdyaXRlCisgKi8KK3ZvaWQgZmZfYW1mX3dyaXRlX2Jvb2wodWludDhfdCAqKmRzdCwgaW50IHZhbCk7CisKKy8qKgorICogV3JpdGUgbnVtYmVyIGluIEFNRiBmb3JtYXQgdG8gYnVmZmVyLgorICoKKyAqIEBwYXJhbSBkc3QgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyICh3aWxsIGJlIG1vZGlmaWVkKQorICogQHBhcmFtIG51bSB2YWx1ZSB0byB3cml0ZQorICovCit2b2lkIGZmX2FtZl93cml0ZV9udW1iZXIodWludDhfdCAqKmRzdCwgZG91YmxlIG51bSk7CisKKy8qKgorICogV3JpdGUgc3RyaW5nIGluIEFNRiBmb3JtYXQgdG8gYnVmZmVyLgorICoKKyAqIEBwYXJhbSBkc3QgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyICh3aWxsIGJlIG1vZGlmaWVkKQorICogQHBhcmFtIHN0ciBzdHJpbmcgdG8gd3JpdGUKKyAqLwordm9pZCBmZl9hbWZfd3JpdGVfc3RyaW5nKHVpbnQ4X3QgKipkc3QsIGNvbnN0IGNoYXIgKnN0cik7CisKKy8qKgorICogV3JpdGUgYSBzdHJpbmcgY29uc2lzdGluZyBvZiB0d28gcGFydHMgaW4gQU1GIGZvcm1hdCB0byBhIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gZHN0IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAod2lsbCBiZSBtb2RpZmllZCkKKyAqIEBwYXJhbSBzdHIxIGZpcnN0IHN0cmluZyB0byB3cml0ZSwgbWF5IGJlIG51bGwKKyAqIEBwYXJhbSBzdHIyIHNlY29uZCBzdHJpbmcgdG8gd3JpdGUsIG1heSBiZSBudWxsCisgKi8KK3ZvaWQgZmZfYW1mX3dyaXRlX3N0cmluZzIodWludDhfdCAqKmRzdCwgY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMik7CisKKy8qKgorICogV3JpdGUgQU1GIE5VTEwgdmFsdWUgdG8gYnVmZmVyLgorICoKKyAqIEBwYXJhbSBkc3QgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyICh3aWxsIGJlIG1vZGlmaWVkKQorICovCit2b2lkIGZmX2FtZl93cml0ZV9udWxsKHVpbnQ4X3QgKipkc3QpOworCisvKioKKyAqIFdyaXRlIG1hcmtlciBmb3IgQU1GIG9iamVjdCB0byBidWZmZXIuCisgKgorICogQHBhcmFtIGRzdCBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKHdpbGwgYmUgbW9kaWZpZWQpCisgKi8KK3ZvaWQgZmZfYW1mX3dyaXRlX29iamVjdF9zdGFydCh1aW50OF90ICoqZHN0KTsKKworLyoqCisgKiBXcml0ZSBzdHJpbmcgdXNlZCBhcyBmaWVsZCBuYW1lIGluIEFNRiBvYmplY3QgdG8gYnVmZmVyLgorICoKKyAqIEBwYXJhbSBkc3QgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyICh3aWxsIGJlIG1vZGlmaWVkKQorICogQHBhcmFtIHN0ciBzdHJpbmcgdG8gd3JpdGUKKyAqLwordm9pZCBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSh1aW50OF90ICoqZHN0LCBjb25zdCBjaGFyICpzdHIpOworCisvKioKKyAqIFdyaXRlIG1hcmtlciBmb3IgZW5kIG9mIEFNRiBvYmplY3QgdG8gYnVmZmVyLgorICoKKyAqIEBwYXJhbSBkc3QgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyICh3aWxsIGJlIG1vZGlmaWVkKQorICovCit2b2lkIGZmX2FtZl93cml0ZV9vYmplY3RfZW5kKHVpbnQ4X3QgKipkc3QpOworCisvKioKKyAqIFJlYWQgQU1GIGJvb2xlYW4gdmFsdWUuCisgKgorICpAcGFyYW1baW4sb3V0XSBnYmMgR2V0Qnl0ZUNvbnRleHQgaW5pdGlhbGl6ZWQgd2l0aCBBTUYtZm9ybWF0dGVkIGRhdGEKKyAqQHBhcmFtW291dF0gICAgdmFsIDAgb3IgMQorICpAcmV0dXJuIDAgb24gc3VjY2VzcyBvciBhbiBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorKi8KK2ludCBmZl9hbWZfcmVhZF9ib29sKEdldEJ5dGVDb250ZXh0ICpnYmMsIGludCAqdmFsKTsKKworLyoqCisgKiBSZWFkIEFNRiBudW1iZXIgdmFsdWUuCisgKgorICpAcGFyYW1baW4sb3V0XSBnYmMgR2V0Qnl0ZUNvbnRleHQgaW5pdGlhbGl6ZWQgd2l0aCBBTUYtZm9ybWF0dGVkIGRhdGEKKyAqQHBhcmFtW291dF0gICAgdmFsIHJlYWQgdmFsdWUKKyAqQHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgYW4gQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKKyovCitpbnQgZmZfYW1mX3JlYWRfbnVtYmVyKEdldEJ5dGVDb250ZXh0ICpnYmMsIGRvdWJsZSAqdmFsKTsKKworLyoqCisgKiBHZXQgQU1GIHN0cmluZyB2YWx1ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgdGhlIHNhbWUgYXMgZmZfYW1mX3JlYWRfc3RyaW5nIGV4Y2VwdCB0aGF0CisgKiBpdCBkb2VzIG5vdCBleHBlY3QgdGhlIEFNRiB0eXBlIHByZXBlbmRlZCB0byB0aGUgYWN0dWFsIGRhdGEuCisgKiBBcHBlbmRzIGEgdHJhaWxpbmcgbnVsbCBieXRlIHRvIG91dHB1dCBzdHJpbmcgaW4gb3JkZXIgdG8KKyAqIGVhc2UgbGF0ZXIgcGFyc2luZy4KKyAqCisgKkBwYXJhbVtpbixvdXRdIGdiYyAgICAgR2V0Qnl0ZUNvbnRleHQgaW5pdGlhbGl6ZWQgd2l0aCBBTUYtZm9ybWF0dGVkIGRhdGEKKyAqQHBhcmFtW291dF0gICAgc3RyICAgICByZWFkIHN0cmluZworICpAcGFyYW1baW5dICAgICBzdHJzaXplIGJ1ZmZlciBzaXplIGF2YWlsYWJsZSB0byBzdG9yZSB0aGUgcmVhZCBzdHJpbmcKKyAqQHBhcmFtW291dF0gICAgbGVuZ3RoICByZWFkIHN0cmluZyBsZW5ndGgKKyAqQHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgYW4gQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKKyovCitpbnQgZmZfYW1mX2dldF9zdHJpbmcoR2V0Qnl0ZUNvbnRleHQgKmJjLCB1aW50OF90ICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cnNpemUsIGludCAqbGVuZ3RoKTsKKworLyoqCisgKiBSZWFkIEFNRiBzdHJpbmcgdmFsdWUuCisgKgorICogQXBwZW5kcyBhIHRyYWlsaW5nIG51bGwgYnl0ZSB0byBvdXRwdXQgc3RyaW5nIGluIG9yZGVyIHRvCisgKiBlYXNlIGxhdGVyIHBhcnNpbmcuCisgKgorICpAcGFyYW1baW4sb3V0XSBnYmMgICAgIEdldEJ5dGVDb250ZXh0IGluaXRpYWxpemVkIHdpdGggQU1GLWZvcm1hdHRlZCBkYXRhCisgKkBwYXJhbVtvdXRdICAgIHN0ciAgICAgcmVhZCBzdHJpbmcKKyAqQHBhcmFtW2luXSAgICAgc3Ryc2l6ZSBidWZmZXIgc2l6ZSBhdmFpbGFibGUgdG8gc3RvcmUgdGhlIHJlYWQgc3RyaW5nCisgKkBwYXJhbVtvdXRdICAgIGxlbmd0aCAgcmVhZCBzdHJpbmcgbGVuZ3RoCisgKkByZXR1cm4gMCBvbiBzdWNjZXNzIG9yIGFuIEFWRVJST1IgY29kZSBvbiBmYWlsdXJlCisqLworaW50IGZmX2FtZl9yZWFkX3N0cmluZyhHZXRCeXRlQ29udGV4dCAqZ2JjLCB1aW50OF90ICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJzaXplLCBpbnQgKmxlbmd0aCk7CisKKy8qKgorICogUmVhZCBBTUYgTlVMTCB2YWx1ZS4KKyAqCisgKkBwYXJhbVtpbixvdXRdIGdiYyBHZXRCeXRlQ29udGV4dCBpbml0aWFsaXplZCB3aXRoIEFNRi1mb3JtYXR0ZWQgZGF0YQorICpAcmV0dXJuIDAgb24gc3VjY2VzcyBvciBhbiBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorKi8KK2ludCBmZl9hbWZfcmVhZF9udWxsKEdldEJ5dGVDb250ZXh0ICpnYmMpOworCisvKioKKyAqIE1hdGNoIEFNRiBzdHJpbmcgd2l0aCBhIE5VTEwtdGVybWluYXRlZCBzdHJpbmcuCisgKgorICogQHJldHVybiAwIGlmIHRoZSBzdHJpbmdzIGRvIG5vdCBtYXRjaC4KKyAqLworCitpbnQgZmZfYW1mX21hdGNoX3N0cmluZyhjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSwgY29uc3QgY2hhciAqc3RyKTsKKworLyoqIEB9ICovIC8vIEFNRiBmdW5jcworCisjZW5kaWYgLyogQVZGT1JNQVRfUlRNUFBLVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRtcHByb3RvLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRtcHByb3RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjMTYyOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydG1wcHJvdG8uYwpAQCAtMCwwICsxLDMxNDkgQEAKKy8qCisgKiBSVE1QIG5ldHdvcmsgcHJvdG9jb2wKKyAqIENvcHlyaWdodCAoYykgMjAwOSBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFJUTVAgcHJvdG9jb2wKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jhc2U2NC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWQ1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYW5kb21fc2VlZC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zaGEuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisKKyNpbmNsdWRlICJmbHYuaCIKKyNpbmNsdWRlICJydG1wLmgiCisjaW5jbHVkZSAicnRtcGNyeXB0LmgiCisjaW5jbHVkZSAicnRtcHBrdC5oIgorI2luY2x1ZGUgInVybC5oIgorCisjaWYgQ09ORklHX1pMSUIKKyNpbmNsdWRlIDx6bGliLmg+CisjZW5kaWYKKworI2RlZmluZSBBUFBfTUFYX0xFTkdUSCAxMDI0CisjZGVmaW5lIFBMQVlQQVRIX01BWF9MRU5HVEggMjU2CisjZGVmaW5lIFRDVVJMX01BWF9MRU5HVEggNTEyCisjZGVmaW5lIEZMQVNIVkVSX01BWF9MRU5HVEggNjQKKyNkZWZpbmUgUlRNUF9QS1REQVRBX0RFRkFVTFRfU0laRSA0MDk2CisjZGVmaW5lIFJUTVBfSEVBREVSIDExCisKKy8qKiBSVE1QIHByb3RvY29sIGhhbmRsZXIgc3RhdGUgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgU1RBVEVfU1RBUlQsICAgICAgLy8vPCBjbGllbnQgaGFzIG5vdCBkb25lIGFueXRoaW5nIHlldAorICAgIFNUQVRFX0hBTkRTSEFLRUQsIC8vLzwgY2xpZW50IGhhcyBwZXJmb3JtZWQgaGFuZHNoYWtlCisgICAgU1RBVEVfRkNQVUJMSVNILCAgLy8vPCBjbGllbnQgRkNQdWJsaXNoaW5nIHN0cmVhbSAoZm9yIG91dHB1dCkKKyAgICBTVEFURV9QTEFZSU5HLCAgICAvLy88IGNsaWVudCBoYXMgc3RhcnRlZCByZWNlaXZpbmcgbXVsdGltZWRpYSBkYXRhIGZyb20gc2VydmVyCisgICAgU1RBVEVfU0VFS0lORywgICAgLy8vPCBjbGllbnQgaGFzIHN0YXJ0ZWQgdGhlIHNlZWsgb3BlcmF0aW9uLiBCYWNrIG9uIFNUQVRFX1BMQVlJTkcgd2hlbiB0aGUgdGltZSBjb21lcworICAgIFNUQVRFX1BVQkxJU0hJTkcsIC8vLzwgY2xpZW50IGhhcyBzdGFydGVkIHNlbmRpbmcgbXVsdGltZWRpYSBkYXRhIHRvIHNlcnZlciAoZm9yIG91dHB1dCkKKyAgICBTVEFURV9SRUNFSVZJTkcsICAvLy88IHJlY2VpdmVkIGEgcHVibGlzaCBjb21tYW5kIChmb3IgaW5wdXQpCisgICAgU1RBVEVfU0VORElORywgICAgLy8vPCByZWNlaXZlZCBhIHBsYXkgY29tbWFuZCAoZm9yIG91dHB1dCkKKyAgICBTVEFURV9TVE9QUEVELCAgICAvLy88IHRoZSBicm9hZGNhc3QgaGFzIGJlZW4gc3RvcHBlZAorfSBDbGllbnRTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgVHJhY2tlZE1ldGhvZCB7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgaWQ7Cit9IFRyYWNrZWRNZXRob2Q7CisKKy8qKiBwcm90b2NvbCBoYW5kbGVyIGNvbnRleHQgKi8KK3R5cGVkZWYgc3RydWN0IFJUTVBDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBVUkxDb250ZXh0KiAgIHN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAvLy88IFRDUCBzdHJlYW0gdXNlZCBpbiBpbnRlcmFjdGlvbnMgd2l0aCBSVE1QIHNlcnZlcgorICAgIFJUTVBQYWNrZXQgICAgKnByZXZfcGt0WzJdOyAgICAgICAgICAgICAgIC8vLzwgcGFja2V0IGhpc3RvcnkgdXNlZCB3aGVuIHJlYWRpbmcgYW5kIHNlbmRpbmcgcGFja2V0cyAoWzBdIGZvciByZWFkaW5nLCBbMV0gZm9yIHdyaXRpbmcpCisgICAgaW50ICAgICAgICAgICBuYl9wcmV2X3BrdFsyXTsgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgZWxlbWVudHMgaW4gcHJldl9wa3QKKyAgICBpbnQgICAgICAgICAgIGluX2NodW5rX3NpemU7ICAgICAgICAgICAgICAvLy88IHNpemUgb2YgdGhlIGNodW5rcyBpbmNvbWluZyBSVE1QIHBhY2tldHMgYXJlIGRpdmlkZWQgaW50bworICAgIGludCAgICAgICAgICAgb3V0X2NodW5rX3NpemU7ICAgICAgICAgICAgIC8vLzwgc2l6ZSBvZiB0aGUgY2h1bmtzIG91dGdvaW5nIFJUTVAgcGFja2V0cyBhcmUgZGl2aWRlZCBpbnRvCisgICAgaW50ICAgICAgICAgICBpc19pbnB1dDsgICAgICAgICAgICAgICAgICAgLy8vPCBpbnB1dC9vdXRwdXQgZmxhZworICAgIGNoYXIgICAgICAgICAgKnBsYXlwYXRoOyAgICAgICAgICAgICAgICAgIC8vLzwgc3RyZWFtIGlkZW50aWZpZXIgdG8gcGxheSAod2l0aCBwb3NzaWJsZSAibXA0OiIgcHJlZml4KQorICAgIGludCAgICAgICAgICAgbGl2ZTsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMDogcmVjb3JkZWQsIC0xOiBsaXZlLCAtMjogYm90aAorICAgIGNoYXIgICAgICAgICAgKmFwcDsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbmFtZSBvZiBhcHBsaWNhdGlvbgorICAgIGNoYXIgICAgICAgICAgKmNvbm47ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYXBwZW5kIGFyYml0cmFyeSBBTUYgZGF0YSB0byB0aGUgQ29ubmVjdCBtZXNzYWdlCisgICAgQ2xpZW50U3RhdGUgICBzdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IHN0YXRlCisgICAgaW50ICAgICAgICAgICBzdHJlYW1faWQ7ICAgICAgICAgICAgICAgICAgLy8vPCBJRCBhc3NpZ25lZCBieSB0aGUgc2VydmVyIGZvciB0aGUgc3RyZWFtCisgICAgdWludDhfdCogICAgICBmbHZfZGF0YTsgICAgICAgICAgICAgICAgICAgLy8vPCBidWZmZXIgd2l0aCBkYXRhIGZvciBkZW11eGVyCisgICAgaW50ICAgICAgICAgICBmbHZfc2l6ZTsgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGJ1ZmZlciBzaXplCisgICAgaW50ICAgICAgICAgICBmbHZfb2ZmOyAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIGN1cnJlbnQgYnVmZmVyCisgICAgaW50ICAgICAgICAgICBmbHZfbmJfcGFja2V0czsgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgZmx2IHBhY2tldHMgcHVibGlzaGVkCisgICAgUlRNUFBhY2tldCAgICBvdXRfcGt0OyAgICAgICAgICAgICAgICAgICAgLy8vPCBydG1wIHBhY2tldCwgY3JlYXRlZCBmcm9tIGZsdiBhL3Ygb3IgbWV0YWRhdGEgKGZvciBvdXRwdXQpCisgICAgdWludDMyX3QgICAgICBjbGllbnRfcmVwb3J0X3NpemU7ICAgICAgICAgLy8vPCBudW1iZXIgb2YgYnl0ZXMgYWZ0ZXIgd2hpY2ggY2xpZW50IHNob3VsZCByZXBvcnQgdG8gc2VydmVyCisgICAgdWludDMyX3QgICAgICBieXRlc19yZWFkOyAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIHNlcnZlcgorICAgIHVpbnQzMl90ICAgICAgbGFzdF9ieXRlc19yZWFkOyAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgbGFzdCByZXBvcnRlZCB0byBzZXJ2ZXIKKyAgICB1aW50MzJfdCAgICAgIGxhc3RfdGltZXN0YW1wOyAgICAgICAgICAgICAvLy88IGxhc3QgdGltZXN0YW1wIHJlY2VpdmVkIGluIGEgcGFja2V0CisgICAgaW50ICAgICAgICAgICBza2lwX2J5dGVzOyAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcCBmcm9tIHRoZSBpbnB1dCBGTFYgc3RyZWFtIGluIHRoZSBuZXh0IHdyaXRlIGNhbGwKKyAgICBpbnQgICAgICAgICAgIGhhc19hdWRpbzsgICAgICAgICAgICAgICAgICAvLy88IHByZXNlbmNlIG9mIGF1ZGlvIGRhdGEKKyAgICBpbnQgICAgICAgICAgIGhhc192aWRlbzsgICAgICAgICAgICAgICAgICAvLy88IHByZXNlbmNlIG9mIHZpZGVvIGRhdGEKKyAgICBpbnQgICAgICAgICAgIHJlY2VpdmVkX21ldGFkYXRhOyAgICAgICAgICAvLy88IEluZGljYXRlcyBpZiB3ZSBoYXZlIHJlY2VpdmVkIG1ldGFkYXRhIGFib3V0IHRoZSBzdHJlYW1zCisgICAgdWludDhfdCAgICAgICBmbHZfaGVhZGVyW1JUTVBfSEVBREVSXTsgICAgLy8vPCBwYXJ0aWFsIGluY29taW5nIGZsdiBwYWNrZXQgaGVhZGVyCisgICAgaW50ICAgICAgICAgICBmbHZfaGVhZGVyX2J5dGVzOyAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgaW5pdGlhbGl6ZWQgYnl0ZXMgaW4gZmx2X2hlYWRlcgorICAgIGludCAgICAgICAgICAgbmJfaW52b2tlczsgICAgICAgICAgICAgICAgIC8vLzwga2VlcHMgdHJhY2sgb2YgaW52b2tlIG1lc3NhZ2VzCisgICAgY2hhciogICAgICAgICB0Y3VybDsgICAgICAgICAgICAgICAgICAgICAgLy8vPCB1cmwgb2YgdGhlIHRhcmdldCBzdHJlYW0KKyAgICBjaGFyKiAgICAgICAgIGZsYXNodmVyOyAgICAgICAgICAgICAgICAgICAvLy88IHZlcnNpb24gb2YgdGhlIGZsYXNoIHBsdWdpbgorICAgIGNoYXIqICAgICAgICAgc3dmaGFzaDsgICAgICAgICAgICAgICAgICAgIC8vLzwgU0hBMjU2IGhhc2ggb2YgdGhlIGRlY29tcHJlc3NlZCBTV0YgZmlsZSAoMzIgYnl0ZXMpCisgICAgaW50ICAgICAgICAgICBzd2ZoYXNoX2xlbjsgICAgICAgICAgICAgICAgLy8vPCBsZW5ndGggb2YgdGhlIFNIQTI1NiBoYXNoCisgICAgaW50ICAgICAgICAgICBzd2ZzaXplOyAgICAgICAgICAgICAgICAgICAgLy8vPCBzaXplIG9mIHRoZSBkZWNvbXByZXNzZWQgU1dGIGZpbGUKKyAgICBjaGFyKiAgICAgICAgIHN3ZnVybDsgICAgICAgICAgICAgICAgICAgICAvLy88IHVybCBvZiB0aGUgc3dmIHBsYXllcgorICAgIGNoYXIqICAgICAgICAgc3dmdmVyaWZ5OyAgICAgICAgICAgICAgICAgIC8vLzwgVVJMIHRvIHBsYXllciBzd2YgZmlsZSwgY29tcHV0ZSBoYXNoL3NpemUgYXV0b21hdGljYWxseQorICAgIGNoYXIgICAgICAgICAgc3dmdmVyaWZpY2F0aW9uWzQyXTsgICAgICAgIC8vLzwgaGFzaCBvZiB0aGUgU1dGIHZlcmlmaWNhdGlvbgorICAgIGNoYXIqICAgICAgICAgcGFnZXVybDsgICAgICAgICAgICAgICAgICAgIC8vLzwgdXJsIG9mIHRoZSB3ZWIgcGFnZQorICAgIGNoYXIqICAgICAgICAgc3Vic2NyaWJlOyAgICAgICAgICAgICAgICAgIC8vLzwgbmFtZSBvZiBsaXZlIHN0cmVhbSB0byBzdWJzY3JpYmUKKyAgICBpbnQgICAgICAgICAgIHNlcnZlcl9idzsgICAgICAgICAgICAgICAgICAvLy88IHNlcnZlciBiYW5kd2lkdGgKKyAgICBpbnQgICAgICAgICAgIGNsaWVudF9idWZmZXJfdGltZTsgICAgICAgICAvLy88IGNsaWVudCBidWZmZXIgdGltZSBpbiBtcworICAgIGludCAgICAgICAgICAgZmx1c2hfaW50ZXJ2YWw7ICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHBhY2tldHMgZmx1c2hlZCBpbiB0aGUgc2FtZSByZXF1ZXN0IChSVE1QVCBvbmx5KQorICAgIGludCAgICAgICAgICAgZW5jcnlwdGVkOyAgICAgICAgICAgICAgICAgIC8vLzwgdXNlIGFuIGVuY3J5cHRlZCBjb25uZWN0aW9uIChSVE1QRSBvbmx5KQorICAgIFRyYWNrZWRNZXRob2QqdHJhY2tlZF9tZXRob2RzOyAgICAgICAgICAgIC8vLzwgdHJhY2tlZCBtZXRob2RzIGJ1ZmZlcgorICAgIGludCAgICAgICAgICAgbmJfdHJhY2tlZF9tZXRob2RzOyAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHRyYWNrZWQgbWV0aG9kcworICAgIGludCAgICAgICAgICAgdHJhY2tlZF9tZXRob2RzX3NpemU7ICAgICAgIC8vLzwgc2l6ZSBvZiB0aGUgdHJhY2tlZCBtZXRob2RzIGJ1ZmZlcgorICAgIGludCAgICAgICAgICAgbGlzdGVuOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgbGlzdGVuIG1vZGUgZmxhZworICAgIGludCAgICAgICAgICAgbGlzdGVuX3RpbWVvdXQ7ICAgICAgICAgICAgIC8vLzwgbGlzdGVuIHRpbWVvdXQgdG8gd2FpdCBmb3IgbmV3IGNvbm5lY3Rpb25zCisgICAgaW50ICAgICAgICAgICBuYl9zdHJlYW1pZDsgICAgICAgICAgICAgICAgLy8vPCBUaGUgbmV4dCBzdHJlYW0gaWQgdG8gcmV0dXJuIG9uIGNyZWF0ZVN0cmVhbSBjYWxscworICAgIGRvdWJsZSAgICAgICAgZHVyYXRpb247ICAgICAgICAgICAgICAgICAgIC8vLzwgRHVyYXRpb24gb2YgdGhlIHN0cmVhbSBpbiBzZWNvbmRzIGFzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgKG9ubHkgdmFsaWQgaWYgbm9uLXplcm8pCisgICAgY2hhciAgICAgICAgICB1c2VybmFtZVs1MF07CisgICAgY2hhciAgICAgICAgICBwYXNzd29yZFs1MF07CisgICAgY2hhciAgICAgICAgICBhdXRoX3BhcmFtc1s1MDBdOworICAgIGludCAgICAgICAgICAgZG9fcmVjb25uZWN0OworICAgIGludCAgICAgICAgICAgYXV0aF90cmllZDsKK30gUlRNUENvbnRleHQ7CisKKyNkZWZpbmUgUExBWUVSX0tFWV9PUEVOX1BBUlRfTEVOIDMwICAgLy8vPCBsZW5ndGggb2YgcGFydGlhbCBrZXkgdXNlZCBmb3IgZmlyc3QgY2xpZW50IGRpZ2VzdCBzaWduaW5nCisvKiogQ2xpZW50IGtleSB1c2VkIGZvciBkaWdlc3Qgc2lnbmluZyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnRtcF9wbGF5ZXJfa2V5W10gPSB7CisgICAgJ0cnLCAnZScsICduJywgJ3UnLCAnaScsICduJywgJ2UnLCAnICcsICdBJywgJ2QnLCAnbycsICdiJywgJ2UnLCAnICcsCisgICAgJ0YnLCAnbCcsICdhJywgJ3MnLCAnaCcsICcgJywgJ1AnLCAnbCcsICdhJywgJ3knLCAnZScsICdyJywgJyAnLCAnMCcsICcwJywgJzEnLAorCisgICAgMHhGMCwgMHhFRSwgMHhDMiwgMHg0QSwgMHg4MCwgMHg2OCwgMHhCRSwgMHhFOCwgMHgyRSwgMHgwMCwgMHhEMCwgMHhEMSwgMHgwMiwKKyAgICAweDlFLCAweDdFLCAweDU3LCAweDZFLCAweEVDLCAweDVELCAweDJELCAweDI5LCAweDgwLCAweDZGLCAweEFCLCAweDkzLCAweEI4LAorICAgIDB4RTYsIDB4MzYsIDB4Q0YsIDB4RUIsIDB4MzEsIDB4QUUKK307CisKKyNkZWZpbmUgU0VSVkVSX0tFWV9PUEVOX1BBUlRfTEVOIDM2ICAgLy8vPCBsZW5ndGggb2YgcGFydGlhbCBrZXkgdXNlZCBmb3IgZmlyc3Qgc2VydmVyIGRpZ2VzdCBzaWduaW5nCisvKiogS2V5IHVzZWQgZm9yIFJUTVAgc2VydmVyIGRpZ2VzdCBzaWduaW5nICovCitzdGF0aWMgY29uc3QgdWludDhfdCBydG1wX3NlcnZlcl9rZXlbXSA9IHsKKyAgICAnRycsICdlJywgJ24nLCAndScsICdpJywgJ24nLCAnZScsICcgJywgJ0EnLCAnZCcsICdvJywgJ2InLCAnZScsICcgJywKKyAgICAnRicsICdsJywgJ2EnLCAncycsICdoJywgJyAnLCAnTScsICdlJywgJ2QnLCAnaScsICdhJywgJyAnLAorICAgICdTJywgJ2UnLCAncicsICd2JywgJ2UnLCAncicsICcgJywgJzAnLCAnMCcsICcxJywKKworICAgIDB4RjAsIDB4RUUsIDB4QzIsIDB4NEEsIDB4ODAsIDB4NjgsIDB4QkUsIDB4RTgsIDB4MkUsIDB4MDAsIDB4RDAsIDB4RDEsIDB4MDIsCisgICAgMHg5RSwgMHg3RSwgMHg1NywgMHg2RSwgMHhFQywgMHg1RCwgMHgyRCwgMHgyOSwgMHg4MCwgMHg2RiwgMHhBQiwgMHg5MywgMHhCOCwKKyAgICAweEU2LCAweDM2LCAweENGLCAweEVCLCAweDMxLCAweEFFCit9OworCitzdGF0aWMgaW50IGhhbmRsZV9jaHVua19zaXplKFVSTENvbnRleHQgKnMsIFJUTVBQYWNrZXQgKnBrdCk7CisKK3N0YXRpYyBpbnQgYWRkX3RyYWNrZWRfbWV0aG9kKFJUTVBDb250ZXh0ICpydCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGlkKQoreworICAgIGludCBlcnI7CisKKyAgICBpZiAocnQtPm5iX3RyYWNrZWRfbWV0aG9kcyArIDEgPiBydC0+dHJhY2tlZF9tZXRob2RzX3NpemUpIHsKKyAgICAgICAgcnQtPnRyYWNrZWRfbWV0aG9kc19zaXplID0gKHJ0LT5uYl90cmFja2VkX21ldGhvZHMgKyAxKSAqIDI7CisgICAgICAgIGlmICgoZXJyID0gYXZfcmVhbGxvY3AoJnJ0LT50cmFja2VkX21ldGhvZHMsIHJ0LT50cmFja2VkX21ldGhvZHNfc2l6ZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpydC0+dHJhY2tlZF9tZXRob2RzKSkpIDwgMCkgeworICAgICAgICAgICAgcnQtPm5iX3RyYWNrZWRfbWV0aG9kcyA9IDA7CisgICAgICAgICAgICBydC0+dHJhY2tlZF9tZXRob2RzX3NpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJ0LT50cmFja2VkX21ldGhvZHNbcnQtPm5iX3RyYWNrZWRfbWV0aG9kc10ubmFtZSA9IGF2X3N0cmR1cChuYW1lKTsKKyAgICBpZiAoIXJ0LT50cmFja2VkX21ldGhvZHNbcnQtPm5iX3RyYWNrZWRfbWV0aG9kc10ubmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBydC0+dHJhY2tlZF9tZXRob2RzW3J0LT5uYl90cmFja2VkX21ldGhvZHNdLmlkID0gaWQ7CisgICAgcnQtPm5iX3RyYWNrZWRfbWV0aG9kcysrOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlbF90cmFja2VkX21ldGhvZChSVE1QQ29udGV4dCAqcnQsIGludCBpbmRleCkKK3sKKyAgICBtZW1tb3ZlKCZydC0+dHJhY2tlZF9tZXRob2RzW2luZGV4XSwgJnJ0LT50cmFja2VkX21ldGhvZHNbaW5kZXggKyAxXSwKKyAgICAgICAgICAgIHNpemVvZigqcnQtPnRyYWNrZWRfbWV0aG9kcykgKiAocnQtPm5iX3RyYWNrZWRfbWV0aG9kcyAtIGluZGV4IC0gMSkpOworICAgIHJ0LT5uYl90cmFja2VkX21ldGhvZHMtLTsKK30KKworc3RhdGljIGludCBmaW5kX3RyYWNrZWRfbWV0aG9kKFVSTENvbnRleHQgKnMsIFJUTVBQYWNrZXQgKnBrdCwgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdHJhY2tlZF9tZXRob2QpCit7CisgICAgUlRNUENvbnRleHQgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIEdldEJ5dGVDb250ZXh0IGdiYzsKKyAgICBkb3VibGUgcGt0X2lkOworICAgIGludCByZXQ7CisgICAgaW50IGk7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYmMsIHBrdC0+ZGF0YSArIG9mZnNldCwgcGt0LT5zaXplIC0gb2Zmc2V0KTsKKyAgICBpZiAoKHJldCA9IGZmX2FtZl9yZWFkX251bWJlcigmZ2JjLCAmcGt0X2lkKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IHJ0LT5uYl90cmFja2VkX21ldGhvZHM7IGkrKykgeworICAgICAgICBpZiAocnQtPnRyYWNrZWRfbWV0aG9kc1tpXS5pZCAhPSBwa3RfaWQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAqdHJhY2tlZF9tZXRob2QgPSBydC0+dHJhY2tlZF9tZXRob2RzW2ldLm5hbWU7CisgICAgICAgIGRlbF90cmFja2VkX21ldGhvZChydCwgaSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3RyYWNrZWRfbWV0aG9kcyhSVE1QQ29udGV4dCAqcnQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcnQtPm5iX3RyYWNrZWRfbWV0aG9kczsgaSArKykKKyAgICAgICAgYXZfZnJlZShydC0+dHJhY2tlZF9tZXRob2RzW2ldLm5hbWUpOworICAgIGF2X2ZyZWUocnQtPnRyYWNrZWRfbWV0aG9kcyk7CisgICAgcnQtPnRyYWNrZWRfbWV0aG9kcyAgICAgID0gTlVMTDsKKyAgICBydC0+dHJhY2tlZF9tZXRob2RzX3NpemUgPSAwOworICAgIHJ0LT5uYl90cmFja2VkX21ldGhvZHMgICA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcnRtcF9zZW5kX3BhY2tldChSVE1QQ29udGV4dCAqcnQsIFJUTVBQYWNrZXQgKnBrdCwgaW50IHRyYWNrKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAocGt0LT50eXBlID09IFJUTVBfUFRfSU5WT0tFICYmIHRyYWNrKSB7CisgICAgICAgIEdldEJ5dGVDb250ZXh0IGdiYzsKKyAgICAgICAgY2hhciBuYW1lWzEyOF07CisgICAgICAgIGRvdWJsZSBwa3RfaWQ7CisgICAgICAgIGludCBsZW47CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgICAgIGlmICgocmV0ID0gZmZfYW1mX3JlYWRfc3RyaW5nKCZnYmMsIG5hbWUsIHNpemVvZihuYW1lKSwgJmxlbikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBpZiAoKHJldCA9IGZmX2FtZl9yZWFkX251bWJlcigmZ2JjLCAmcGt0X2lkKSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIGlmICgocmV0ID0gYWRkX3RyYWNrZWRfbWV0aG9kKHJ0LCBuYW1lLCBwa3RfaWQpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gZmZfcnRtcF9wYWNrZXRfd3JpdGUocnQtPnN0cmVhbSwgcGt0LCBydC0+b3V0X2NodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJ0LT5wcmV2X3BrdFsxXSwgJnJ0LT5uYl9wcmV2X3BrdFsxXSk7CitmYWlsOgorICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3kocGt0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0bXBfd3JpdGVfYW1mX2RhdGEoVVJMQ29udGV4dCAqcywgY2hhciAqcGFyYW0sIHVpbnQ4X3QgKipwKQoreworICAgIGNoYXIgKmZpZWxkLCAqdmFsdWU7CisgICAgY2hhciB0eXBlOworCisgICAgLyogVGhlIHR5cGUgbXVzdCBiZSBCIGZvciBCb29sZWFuLCBOIGZvciBudW1iZXIsIFMgZm9yIHN0cmluZywgTyBmb3IKKyAgICAgKiBvYmplY3QsIG9yIFogZm9yIG51bGwuIEZvciBCb29sZWFucyB0aGUgZGF0YSBtdXN0IGJlIGVpdGhlciAwIG9yIDEgZm9yCisgICAgICogRkFMU0Ugb3IgVFJVRSwgcmVzcGVjdGl2ZWx5LiBMaWtld2lzZSBmb3IgT2JqZWN0cyB0aGUgZGF0YSBtdXN0IGJlCisgICAgICogMCBvciAxIHRvIGVuZCBvciBiZWdpbiBhbiBvYmplY3QsIHJlc3BlY3RpdmVseS4gRGF0YSBpdGVtcyBpbiBzdWJvYmplY3RzCisgICAgICogbWF5IGJlIG5hbWVkLCBieSBwcmVmaXhpbmcgdGhlIHR5cGUgd2l0aCAnTicgYW5kIHNwZWNpZnlpbmcgdGhlIG5hbWUKKyAgICAgKiBiZWZvcmUgdGhlIHZhbHVlIChpZS4gTkI6bXlGbGFnOjEpLiBUaGlzIG9wdGlvbiBtYXkgYmUgdXNlZCBtdWx0aXBsZSB0aW1lcworICAgICAqIHRvIGNvbnN0cnVjdCBhcmJpdHJhcnkgQU1GIHNlcXVlbmNlcy4gKi8KKyAgICBpZiAocGFyYW1bMF0gJiYgcGFyYW1bMV0gPT0gJzonKSB7CisgICAgICAgIHR5cGUgPSBwYXJhbVswXTsKKyAgICAgICAgdmFsdWUgPSBwYXJhbSArIDI7CisgICAgfSBlbHNlIGlmIChwYXJhbVswXSA9PSAnTicgJiYgcGFyYW1bMV0gJiYgcGFyYW1bMl0gPT0gJzonKSB7CisgICAgICAgIHR5cGUgPSBwYXJhbVsxXTsKKyAgICAgICAgZmllbGQgPSBwYXJhbSArIDM7CisgICAgICAgIHZhbHVlID0gc3RyY2hyKGZpZWxkLCAnOicpOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAqdmFsdWUgPSAnXDAnOworICAgICAgICB2YWx1ZSsrOworCisgICAgICAgIGZmX2FtZl93cml0ZV9maWVsZF9uYW1lKHAsIGZpZWxkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAnQic6CisgICAgICAgIGZmX2FtZl93cml0ZV9ib29sKHAsIHZhbHVlWzBdICE9ICcwJyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ1MnOgorICAgICAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKHAsIHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnTic6CisgICAgICAgIGZmX2FtZl93cml0ZV9udW1iZXIocCwgc3RydG9kKHZhbHVlLCBOVUxMKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ1onOgorICAgICAgICBmZl9hbWZfd3JpdGVfbnVsbChwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnTyc6CisgICAgICAgIGlmICh2YWx1ZVswXSAhPSAnMCcpCisgICAgICAgICAgICBmZl9hbWZfd3JpdGVfb2JqZWN0X3N0YXJ0KHApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmZl9hbWZfd3JpdGVfb2JqZWN0X2VuZChwKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBmYWlsOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBBTUYgcGFyYW1ldGVyOiAlc1xuIiwgcGFyYW0pOworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgJ2Nvbm5lY3QnIGNhbGwgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlci4KKyAqLworc3RhdGljIGludCBnZW5fY29ubmVjdChVUkxDb250ZXh0ICpzLCBSVE1QQ29udGV4dCAqcnQpCit7CisgICAgUlRNUFBhY2tldCBwa3Q7CisgICAgdWludDhfdCAqcDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnBrdCwgUlRNUF9TWVNURU1fQ0hBTk5FTCwgUlRNUF9QVF9JTlZPS0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgNDA5NiArIEFQUF9NQVhfTEVOR1RIKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcCA9IHBrdC5kYXRhOworCisgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgImNvbm5lY3QiKTsKKyAgICBmZl9hbWZfd3JpdGVfbnVtYmVyKCZwLCArK3J0LT5uYl9pbnZva2VzKTsKKyAgICBmZl9hbWZfd3JpdGVfb2JqZWN0X3N0YXJ0KCZwKTsKKyAgICBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSgmcCwgImFwcCIpOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcyKCZwLCBydC0+YXBwLCBydC0+YXV0aF9wYXJhbXMpOworCisgICAgaWYgKCFydC0+aXNfaW5wdXQpIHsKKyAgICAgICAgZmZfYW1mX3dyaXRlX2ZpZWxkX25hbWUoJnAsICJ0eXBlIik7CisgICAgICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsICJub25wcml2YXRlIik7CisgICAgfQorICAgIGZmX2FtZl93cml0ZV9maWVsZF9uYW1lKCZwLCAiZmxhc2hWZXIiKTsKKyAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKCZwLCBydC0+Zmxhc2h2ZXIpOworCisgICAgaWYgKHJ0LT5zd2Z1cmwpIHsKKyAgICAgICAgZmZfYW1mX3dyaXRlX2ZpZWxkX25hbWUoJnAsICJzd2ZVcmwiKTsKKyAgICAgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgcnQtPnN3ZnVybCk7CisgICAgfQorCisgICAgZmZfYW1mX3dyaXRlX2ZpZWxkX25hbWUoJnAsICJ0Y1VybCIpOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcyKCZwLCBydC0+dGN1cmwsIHJ0LT5hdXRoX3BhcmFtcyk7CisgICAgaWYgKHJ0LT5pc19pbnB1dCkgeworICAgICAgICBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSgmcCwgImZwYWQiKTsKKyAgICAgICAgZmZfYW1mX3dyaXRlX2Jvb2woJnAsIDApOworICAgICAgICBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSgmcCwgImNhcGFiaWxpdGllcyIpOworICAgICAgICBmZl9hbWZfd3JpdGVfbnVtYmVyKCZwLCAxNS4wKTsKKworICAgICAgICAvKiBUZWxsIHRoZSBzZXJ2ZXIgd2Ugc3VwcG9ydCBhbGwgdGhlIGF1ZGlvIGNvZGVjcyBleGNlcHQKKyAgICAgICAgICogU1VQUE9SVF9TTkRfSU5URUwgKDB4MDAwOCkgYW5kIFNVUFBPUlRfU05EX1VOVVNFRCAoMHgwMDEwKQorICAgICAgICAgKiB3aGljaCBhcmUgdW51c2VkIGluIHRoZSBSVE1QIHByb3RvY29sIGltcGxlbWVudGF0aW9uLiAqLworICAgICAgICBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSgmcCwgImF1ZGlvQ29kZWNzIik7CisgICAgICAgIGZmX2FtZl93cml0ZV9udW1iZXIoJnAsIDQwNzEuMCk7CisgICAgICAgIGZmX2FtZl93cml0ZV9maWVsZF9uYW1lKCZwLCAidmlkZW9Db2RlY3MiKTsKKyAgICAgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgMjUyLjApOworICAgICAgICBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSgmcCwgInZpZGVvRnVuY3Rpb24iKTsKKyAgICAgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgMS4wKTsKKworICAgICAgICBpZiAocnQtPnBhZ2V1cmwpIHsKKyAgICAgICAgICAgIGZmX2FtZl93cml0ZV9maWVsZF9uYW1lKCZwLCAicGFnZVVybCIpOworICAgICAgICAgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgcnQtPnBhZ2V1cmwpOworICAgICAgICB9CisgICAgfQorICAgIGZmX2FtZl93cml0ZV9vYmplY3RfZW5kKCZwKTsKKworICAgIGlmIChydC0+Y29ubikgeworICAgICAgICBjaGFyICpwYXJhbSA9IHJ0LT5jb25uOworCisgICAgICAgIC8vIFdyaXRlIGFyYml0cmFyeSBBTUYgZGF0YSB0byB0aGUgQ29ubmVjdCBtZXNzYWdlLgorICAgICAgICB3aGlsZSAocGFyYW0pIHsKKyAgICAgICAgICAgIGNoYXIgKnNlcDsKKyAgICAgICAgICAgIHBhcmFtICs9IHN0cnNwbihwYXJhbSwgIiAiKTsKKyAgICAgICAgICAgIGlmICghKnBhcmFtKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgc2VwID0gc3RyY2hyKHBhcmFtLCAnICcpOworICAgICAgICAgICAgaWYgKHNlcCkKKyAgICAgICAgICAgICAgICAqc2VwID0gJ1wwJzsKKyAgICAgICAgICAgIGlmICgocmV0ID0gcnRtcF93cml0ZV9hbWZfZGF0YShzLCBwYXJhbSwgJnApKSA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIEFNRiBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcGt0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2VwKQorICAgICAgICAgICAgICAgIHBhcmFtID0gc2VwICsgMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBrdC5zaXplID0gcCAtIHBrdC5kYXRhOworCisgICAgcmV0dXJuIHJ0bXBfc2VuZF9wYWNrZXQocnQsICZwa3QsIDEpOworfQorCitzdGF0aWMgaW50IHJlYWRfY29ubmVjdChVUkxDb250ZXh0ICpzLCBSVE1QQ29udGV4dCAqcnQpCit7CisgICAgUlRNUFBhY2tldCBwa3QgPSB7IDAgfTsKKyAgICB1aW50OF90ICpwOworICAgIGNvbnN0IHVpbnQ4X3QgKmNwOworICAgIGludCByZXQ7CisgICAgY2hhciBjb21tYW5kWzY0XTsKKyAgICBpbnQgc3RyaW5nbGVuOworICAgIGRvdWJsZSBzZXFudW07CisgICAgdWludDhfdCB0bXBzdHJbMjU2XTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYmM7CisKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X3JlYWQocnQtPnN0cmVhbSwgJnBrdCwgcnQtPmluX2NodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZydC0+cHJldl9wa3RbMF0sICZydC0+bmJfcHJldl9wa3RbMF0pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocGt0LnR5cGUgPT0gUlRNUF9QVF9DSFVOS19TSVpFKSB7CisgICAgICAgIGlmICgocmV0ID0gaGFuZGxlX2NodW5rX3NpemUocywgJnBrdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcGt0KTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9yZWFkKHJ0LT5zdHJlYW0sICZwa3QsIHJ0LT5pbl9jaHVua19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJ0LT5wcmV2X3BrdFswXSwgJnJ0LT5uYl9wcmV2X3BrdFswXSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgY3AgPSBwa3QuZGF0YTsKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYmMsIGNwLCBwa3Quc2l6ZSk7CisgICAgaWYgKGZmX2FtZl9yZWFkX3N0cmluZygmZ2JjLCBjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICZzdHJpbmdsZW4pKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmVhZCBjb21tYW5kIHN0cmluZ1xuIik7CisgICAgICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnBrdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoc3RyY21wKGNvbW1hbmQsICJjb25uZWN0IikpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkV4cGVjdGluZyBjb25uZWN0LCBnb3QgJXNcbiIsIGNvbW1hbmQpOworICAgICAgICBmZl9ydG1wX3BhY2tldF9kZXN0cm95KCZwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcmV0ID0gZmZfYW1mX3JlYWRfbnVtYmVyKCZnYmMsICZzZXFudW0pOworICAgIGlmIChyZXQpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlNlcU51bSBub3QgZm91bmRcbiIpOworICAgIC8qIEhlcmUgb25lIGNvdWxkIHBhcnNlIGFuIEFNRiBPYmplY3Qgd2l0aCBkYXRhIGFzIGZsYXNoVmVycyBhbmQgb3RoZXJzLiAqLworICAgIHJldCA9IGZmX2FtZl9nZXRfZmllbGRfdmFsdWUoZ2JjLmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdiYy5idWZmZXIgKyBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHAiLCB0bXBzdHIsIHNpemVvZih0bXBzdHIpKTsKKyAgICBpZiAocmV0KQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJBcHAgZmllbGQgbm90IGZvdW5kIGluIGNvbm5lY3RcbiIpOworICAgIGlmICghcmV0ICYmIHN0cmNtcCh0bXBzdHIsIHJ0LT5hcHApKQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJBcHAgZmllbGQgZG9uJ3QgbWF0Y2ggdXA6ICVzIDwtPiAlc1xuIiwKKyAgICAgICAgICAgICAgIHRtcHN0ciwgcnQtPmFwcCk7CisgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcGt0KTsKKworICAgIC8vIFNlbmQgV2luZG93IEFja25vd2xlZGdlbWVudCBTaXplIChhcyBkZWZpbmVkIGluIHNwZWZpY2ljYXRpb24pCisgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnBrdCwgUlRNUF9ORVRXT1JLX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRNUF9QVF9TRVJWRVJfQlcsIDAsIDQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcCA9IHBrdC5kYXRhOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnAsIHJ0LT5zZXJ2ZXJfYncpOworICAgIHBrdC5zaXplID0gcCAtIHBrdC5kYXRhOworICAgIHJldCA9IGZmX3J0bXBfcGFja2V0X3dyaXRlKHJ0LT5zdHJlYW0sICZwa3QsIHJ0LT5vdXRfY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnQtPnByZXZfcGt0WzFdLCAmcnQtPm5iX3ByZXZfcGt0WzFdKTsKKyAgICBmZl9ydG1wX3BhY2tldF9kZXN0cm95KCZwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIC8vIFNlbmQgUGVlciBCYW5kd2lkdGgKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX05FVFdPUktfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX1BUX0NMSUVOVF9CVywgMCwgNSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwID0gcGt0LmRhdGE7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcCwgcnQtPnNlcnZlcl9idyk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgMik7IC8vIGR5bmFtaWMKKyAgICBwa3Quc2l6ZSA9IHAgLSBwa3QuZGF0YTsKKyAgICByZXQgPSBmZl9ydG1wX3BhY2tldF93cml0ZShydC0+c3RyZWFtLCAmcGt0LCBydC0+b3V0X2NodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJ0LT5wcmV2X3BrdFsxXSwgJnJ0LT5uYl9wcmV2X3BrdFsxXSk7CisgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcGt0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8vIFBpbmcgcmVxdWVzdAorICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIFJUTVBfTkVUV09SS19DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfUFRfUElORywgMCwgNikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHAgPSBwa3QuZGF0YTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZwLCAwKTsgLy8gMCAtPiBTdHJlYW0gQmVnaW4KKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwLCAwKTsKKyAgICByZXQgPSBmZl9ydG1wX3BhY2tldF93cml0ZShydC0+c3RyZWFtLCAmcGt0LCBydC0+b3V0X2NodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJ0LT5wcmV2X3BrdFsxXSwgJnJ0LT5uYl9wcmV2X3BrdFsxXSk7CisgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcGt0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8vIENodW5rIHNpemUKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX1NZU1RFTV9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfUFRfQ0hVTktfU0laRSwgMCwgNCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHAgPSBwa3QuZGF0YTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwLCBydC0+b3V0X2NodW5rX3NpemUpOworICAgIHJldCA9IGZmX3J0bXBfcGFja2V0X3dyaXRlKHJ0LT5zdHJlYW0sICZwa3QsIHJ0LT5vdXRfY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnQtPnByZXZfcGt0WzFdLCAmcnQtPm5iX3ByZXZfcGt0WzFdKTsKKyAgICBmZl9ydG1wX3BhY2tldF9kZXN0cm95KCZwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLy8gU2VuZCBfcmVzdWx0IE5ldENvbm5lY3Rpb24uQ29ubmVjdC5TdWNjZXNzIHRvIGNvbm5lY3QKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX1NZU1RFTV9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfUFRfSU5WT0tFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfUEtUREFUQV9ERUZBVUxUX1NJWkUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwID0gcGt0LmRhdGE7CisgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgIl9yZXN1bHQiKTsKKyAgICBmZl9hbWZfd3JpdGVfbnVtYmVyKCZwLCBzZXFudW0pOworCisgICAgZmZfYW1mX3dyaXRlX29iamVjdF9zdGFydCgmcCk7CisgICAgZmZfYW1mX3dyaXRlX2ZpZWxkX25hbWUoJnAsICJmbXNWZXIiKTsKKyAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKCZwLCAiRk1TLzMsMCwxLDEyMyIpOworICAgIGZmX2FtZl93cml0ZV9maWVsZF9uYW1lKCZwLCAiY2FwYWJpbGl0aWVzIik7CisgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgMzEpOworICAgIGZmX2FtZl93cml0ZV9vYmplY3RfZW5kKCZwKTsKKworICAgIGZmX2FtZl93cml0ZV9vYmplY3Rfc3RhcnQoJnApOworICAgIGZmX2FtZl93cml0ZV9maWVsZF9uYW1lKCZwLCAibGV2ZWwiKTsKKyAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKCZwLCAic3RhdHVzIik7CisgICAgZmZfYW1mX3dyaXRlX2ZpZWxkX25hbWUoJnAsICJjb2RlIik7CisgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgIk5ldENvbm5lY3Rpb24uQ29ubmVjdC5TdWNjZXNzIik7CisgICAgZmZfYW1mX3dyaXRlX2ZpZWxkX25hbWUoJnAsICJkZXNjcmlwdGlvbiIpOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsICJDb25uZWN0aW9uIHN1Y2NlZWRlZC4iKTsKKyAgICBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSgmcCwgIm9iamVjdEVuY29kaW5nIik7CisgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgMCk7CisgICAgZmZfYW1mX3dyaXRlX29iamVjdF9lbmQoJnApOworCisgICAgcGt0LnNpemUgPSBwIC0gcGt0LmRhdGE7CisgICAgcmV0ID0gZmZfcnRtcF9wYWNrZXRfd3JpdGUocnQtPnN0cmVhbSwgJnBrdCwgcnQtPm91dF9jaHVua19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZydC0+cHJldl9wa3RbMV0sICZydC0+bmJfcHJldl9wa3RbMV0pOworICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnBrdCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX1NZU1RFTV9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfUFRfSU5WT0tFLCAwLCAzMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwID0gcGt0LmRhdGE7CisgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgIm9uQldEb25lIik7CisgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgMCk7CisgICAgZmZfYW1mX3dyaXRlX251bGwoJnApOworICAgIGZmX2FtZl93cml0ZV9udW1iZXIoJnAsIDgxOTIpOworICAgIHBrdC5zaXplID0gcCAtIHBrdC5kYXRhOworICAgIHJldCA9IGZmX3J0bXBfcGFja2V0X3dyaXRlKHJ0LT5zdHJlYW0sICZwa3QsIHJ0LT5vdXRfY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnQtPnByZXZfcGt0WzFdLCAmcnQtPm5iX3ByZXZfcGt0WzFdKTsKKyAgICBmZl9ydG1wX3BhY2tldF9kZXN0cm95KCZwa3QpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSAncmVsZWFzZVN0cmVhbScgY2FsbCBhbmQgc2VuZCBpdCB0byB0aGUgc2VydmVyLiBJdCBzaG91bGQgbWFrZQorICogdGhlIHNlcnZlciByZWxlYXNlIHNvbWUgY2hhbm5lbCBmb3IgbWVkaWEgc3RyZWFtcy4KKyAqLworc3RhdGljIGludCBnZW5fcmVsZWFzZV9zdHJlYW0oVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0KQoreworICAgIFJUTVBQYWNrZXQgcGt0OworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIFJUTVBfU1lTVEVNX0NIQU5ORUwsIFJUTVBfUFRfSU5WT0tFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDI5ICsgc3RybGVuKHJ0LT5wbGF5cGF0aCkpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiUmVsZWFzaW5nIHN0cmVhbS4uLlxuIik7CisgICAgcCA9IHBrdC5kYXRhOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsICJyZWxlYXNlU3RyZWFtIik7CisgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgKytydC0+bmJfaW52b2tlcyk7CisgICAgZmZfYW1mX3dyaXRlX251bGwoJnApOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsIHJ0LT5wbGF5cGF0aCk7CisKKyAgICByZXR1cm4gcnRtcF9zZW5kX3BhY2tldChydCwgJnBrdCwgMSk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgJ0ZDUHVibGlzaCcgY2FsbCBhbmQgc2VuZCBpdCB0byB0aGUgc2VydmVyLiBJdCBzaG91bGQgbWFrZQorICogdGhlIHNlcnZlciBwcmVhcGFyZSBmb3IgcmVjZWl2aW5nIG1lZGlhIHN0cmVhbXMuCisgKi8KK3N0YXRpYyBpbnQgZ2VuX2ZjcHVibGlzaF9zdHJlYW0oVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0KQoreworICAgIFJUTVBQYWNrZXQgcGt0OworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIFJUTVBfU1lTVEVNX0NIQU5ORUwsIFJUTVBfUFRfSU5WT0tFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDI1ICsgc3RybGVuKHJ0LT5wbGF5cGF0aCkpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiRkNQdWJsaXNoIHN0cmVhbS4uLlxuIik7CisgICAgcCA9IHBrdC5kYXRhOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsICJGQ1B1Ymxpc2giKTsKKyAgICBmZl9hbWZfd3JpdGVfbnVtYmVyKCZwLCArK3J0LT5uYl9pbnZva2VzKTsKKyAgICBmZl9hbWZfd3JpdGVfbnVsbCgmcCk7CisgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgcnQtPnBsYXlwYXRoKTsKKworICAgIHJldHVybiBydG1wX3NlbmRfcGFja2V0KHJ0LCAmcGt0LCAxKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSAnRkNVbnB1Ymxpc2gnIGNhbGwgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlci4gSXQgc2hvdWxkIG1ha2UKKyAqIHRoZSBzZXJ2ZXIgZGVzdHJveSBzdHJlYW0uCisgKi8KK3N0YXRpYyBpbnQgZ2VuX2ZjdW5wdWJsaXNoX3N0cmVhbShVUkxDb250ZXh0ICpzLCBSVE1QQ29udGV4dCAqcnQpCit7CisgICAgUlRNUFBhY2tldCBwa3Q7CisgICAgdWludDhfdCAqcDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnBrdCwgUlRNUF9TWVNURU1fQ0hBTk5FTCwgUlRNUF9QVF9JTlZPS0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMjcgKyBzdHJsZW4ocnQtPnBsYXlwYXRoKSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJVblB1Ymxpc2hpbmcgc3RyZWFtLi4uXG4iKTsKKyAgICBwID0gcGt0LmRhdGE7CisgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgIkZDVW5wdWJsaXNoIik7CisgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgKytydC0+bmJfaW52b2tlcyk7CisgICAgZmZfYW1mX3dyaXRlX251bGwoJnApOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsIHJ0LT5wbGF5cGF0aCk7CisKKyAgICByZXR1cm4gcnRtcF9zZW5kX3BhY2tldChydCwgJnBrdCwgMCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgJ2NyZWF0ZVN0cmVhbScgY2FsbCBhbmQgc2VuZCBpdCB0byB0aGUgc2VydmVyLiBJdCBzaG91bGQgbWFrZQorICogdGhlIHNlcnZlciBhbGxvY2F0ZSBzb21lIGNoYW5uZWwgZm9yIG1lZGlhIHN0cmVhbXMuCisgKi8KK3N0YXRpYyBpbnQgZ2VuX2NyZWF0ZV9zdHJlYW0oVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0KQoreworICAgIFJUTVBQYWNrZXQgcGt0OworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IHJldDsKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJDcmVhdGluZyBzdHJlYW0uLi5cbiIpOworCisgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnBrdCwgUlRNUF9TWVNURU1fQ0hBTk5FTCwgUlRNUF9QVF9JTlZPS0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMjUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwID0gcGt0LmRhdGE7CisgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgImNyZWF0ZVN0cmVhbSIpOworICAgIGZmX2FtZl93cml0ZV9udW1iZXIoJnAsICsrcnQtPm5iX2ludm9rZXMpOworICAgIGZmX2FtZl93cml0ZV9udWxsKCZwKTsKKworICAgIHJldHVybiBydG1wX3NlbmRfcGFja2V0KHJ0LCAmcGt0LCAxKTsKK30KKworCisvKioKKyAqIEdlbmVyYXRlICdkZWxldGVTdHJlYW0nIGNhbGwgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlci4gSXQgc2hvdWxkIG1ha2UKKyAqIHRoZSBzZXJ2ZXIgcmVtb3ZlIHNvbWUgY2hhbm5lbCBmb3IgbWVkaWEgc3RyZWFtcy4KKyAqLworc3RhdGljIGludCBnZW5fZGVsZXRlX3N0cmVhbShVUkxDb250ZXh0ICpzLCBSVE1QQ29udGV4dCAqcnQpCit7CisgICAgUlRNUFBhY2tldCBwa3Q7CisgICAgdWludDhfdCAqcDsKKyAgICBpbnQgcmV0OworCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkRlbGV0aW5nIHN0cmVhbS4uLlxuIik7CisKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX1NZU1RFTV9DSEFOTkVMLCBSVE1QX1BUX0lOVk9LRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAzNCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHAgPSBwa3QuZGF0YTsKKyAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKCZwLCAiZGVsZXRlU3RyZWFtIik7CisgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgKytydC0+bmJfaW52b2tlcyk7CisgICAgZmZfYW1mX3dyaXRlX251bGwoJnApOworICAgIGZmX2FtZl93cml0ZV9udW1iZXIoJnAsIHJ0LT5zdHJlYW1faWQpOworCisgICAgcmV0dXJuIHJ0bXBfc2VuZF9wYWNrZXQocnQsICZwa3QsIDApOworfQorCisvKioKKyAqIEdlbmVyYXRlICdnZXRTdHJlYW1MZW5ndGgnIGNhbGwgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlci4gSWYgdGhlIHNlcnZlcgorICoga25vd3MgdGhlIGR1cmF0aW9uIG9mIHRoZSBzZWxlY3RlZCBzdHJlYW0sIGl0IHdpbGwgcmVwbHkgd2l0aCB0aGUgZHVyYXRpb24KKyAqIGluIHNlY29uZHMuCisgKi8KK3N0YXRpYyBpbnQgZ2VuX2dldF9zdHJlYW1fbGVuZ3RoKFVSTENvbnRleHQgKnMsIFJUTVBDb250ZXh0ICpydCkKK3sKKyAgICBSVE1QUGFja2V0IHBrdDsKKyAgICB1aW50OF90ICpwOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX1NPVVJDRV9DSEFOTkVMLCBSVE1QX1BUX0lOVk9LRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAzMSArIHN0cmxlbihydC0+cGxheXBhdGgpKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcCA9IHBrdC5kYXRhOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsICJnZXRTdHJlYW1MZW5ndGgiKTsKKyAgICBmZl9hbWZfd3JpdGVfbnVtYmVyKCZwLCArK3J0LT5uYl9pbnZva2VzKTsKKyAgICBmZl9hbWZfd3JpdGVfbnVsbCgmcCk7CisgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgcnQtPnBsYXlwYXRoKTsKKworICAgIHJldHVybiBydG1wX3NlbmRfcGFja2V0KHJ0LCAmcGt0LCAxKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBjbGllbnQgYnVmZmVyIHRpbWUgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlci4KKyAqLworc3RhdGljIGludCBnZW5fYnVmZmVyX3RpbWUoVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0KQoreworICAgIFJUTVBQYWNrZXQgcGt0OworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIFJUTVBfTkVUV09SS19DSEFOTkVMLCBSVE1QX1BUX1BJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMTApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwID0gcGt0LmRhdGE7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcCwgMyk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcCwgcnQtPnN0cmVhbV9pZCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcCwgcnQtPmNsaWVudF9idWZmZXJfdGltZSk7CisKKyAgICByZXR1cm4gcnRtcF9zZW5kX3BhY2tldChydCwgJnBrdCwgMCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgJ3BsYXknIGNhbGwgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlciwgdGhlbiBwaW5nIHRoZSBzZXJ2ZXIKKyAqIHRvIHN0YXJ0IGFjdHVhbCBwbGF5aW5nLgorICovCitzdGF0aWMgaW50IGdlbl9wbGF5KFVSTENvbnRleHQgKnMsIFJUTVBDb250ZXh0ICpydCkKK3sKKyAgICBSVE1QUGFja2V0IHBrdDsKKyAgICB1aW50OF90ICpwOworICAgIGludCByZXQ7CisKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiU2VuZGluZyBwbGF5IGNvbW1hbmQgZm9yICclcydcbiIsIHJ0LT5wbGF5cGF0aCk7CisKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX1NPVVJDRV9DSEFOTkVMLCBSVE1QX1BUX0lOVk9LRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAyOSArIHN0cmxlbihydC0+cGxheXBhdGgpKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGt0LmV4dHJhID0gcnQtPnN0cmVhbV9pZDsKKworICAgIHAgPSBwa3QuZGF0YTsKKyAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKCZwLCAicGxheSIpOworICAgIGZmX2FtZl93cml0ZV9udW1iZXIoJnAsICsrcnQtPm5iX2ludm9rZXMpOworICAgIGZmX2FtZl93cml0ZV9udWxsKCZwKTsKKyAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKCZwLCBydC0+cGxheXBhdGgpOworICAgIGZmX2FtZl93cml0ZV9udW1iZXIoJnAsIHJ0LT5saXZlICogMTAwMCk7CisKKyAgICByZXR1cm4gcnRtcF9zZW5kX3BhY2tldChydCwgJnBrdCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZ2VuX3NlZWsoVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0LCBpbnQ2NF90IHRpbWVzdGFtcCkKK3sKKyAgICBSVE1QUGFja2V0IHBrdDsKKyAgICB1aW50OF90ICpwOworICAgIGludCByZXQ7CisKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiU2VuZGluZyBzZWVrIGNvbW1hbmQgZm9yIHRpbWVzdGFtcCAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgIHRpbWVzdGFtcCk7CisKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCAzLCBSVE1QX1BUX0lOVk9LRSwgMCwgMjYpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QuZXh0cmEgPSBydC0+c3RyZWFtX2lkOworCisgICAgcCA9IHBrdC5kYXRhOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsICJzZWVrIik7CisgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgMCk7IC8vbm8gdHJhY2tpbmcgYmFjayByZXNwb25zZXMKKyAgICBmZl9hbWZfd3JpdGVfbnVsbCgmcCk7IC8vYXMgdXN1YWwsIHRoZSBmaXJzdCBudWxsIHBhcmFtCisgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgdGltZXN0YW1wKTsgLy93aGVyZSB3ZSB3YW50IHRvIGp1bXAKKworICAgIHJldHVybiBydG1wX3NlbmRfcGFja2V0KHJ0LCAmcGt0LCAxKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHBhdXNlIHBhY2tldCB0aGF0IGVpdGhlciBwYXVzZXMgb3IgdW5wYXVzZXMgdGhlIGN1cnJlbnQgc3RyZWFtLgorICovCitzdGF0aWMgaW50IGdlbl9wYXVzZShVUkxDb250ZXh0ICpzLCBSVE1QQ29udGV4dCAqcnQsIGludCBwYXVzZSwgdWludDMyX3QgdGltZXN0YW1wKQoreworICAgIFJUTVBQYWNrZXQgcGt0OworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IHJldDsKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJTZW5kaW5nIHBhdXNlIGNvbW1hbmQgZm9yIHRpbWVzdGFtcCAlZFxuIiwKKyAgICAgICAgICAgdGltZXN0YW1wKTsKKworICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIDMsIFJUTVBfUFRfSU5WT0tFLCAwLCAyOSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBrdC5leHRyYSA9IHJ0LT5zdHJlYW1faWQ7CisKKyAgICBwID0gcGt0LmRhdGE7CisgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgInBhdXNlIik7CisgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgMCk7IC8vbm8gdHJhY2tpbmcgYmFjayByZXNwb25zZXMKKyAgICBmZl9hbWZfd3JpdGVfbnVsbCgmcCk7IC8vYXMgdXN1YWwsIHRoZSBmaXJzdCBudWxsIHBhcmFtCisgICAgZmZfYW1mX3dyaXRlX2Jvb2woJnAsIHBhdXNlKTsgLy8gcGF1c2Ugb3IgdW5wYXVzZQorICAgIGZmX2FtZl93cml0ZV9udW1iZXIoJnAsIHRpbWVzdGFtcCk7IC8vd2hlcmUgd2UgcGF1c2UgdGhlIHN0cmVhbQorCisgICAgcmV0dXJuIHJ0bXBfc2VuZF9wYWNrZXQocnQsICZwa3QsIDEpOworfQorCisvKioKKyAqIEdlbmVyYXRlICdwdWJsaXNoJyBjYWxsIGFuZCBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXIuCisgKi8KK3N0YXRpYyBpbnQgZ2VuX3B1Ymxpc2goVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0KQoreworICAgIFJUTVBQYWNrZXQgcGt0OworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IHJldDsKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJTZW5kaW5nIHB1Ymxpc2ggY29tbWFuZCBmb3IgJyVzJ1xuIiwgcnQtPnBsYXlwYXRoKTsKKworICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIFJUTVBfU09VUkNFX0NIQU5ORUwsIFJUTVBfUFRfSU5WT0tFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDMwICsgc3RybGVuKHJ0LT5wbGF5cGF0aCkpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QuZXh0cmEgPSBydC0+c3RyZWFtX2lkOworCisgICAgcCA9IHBrdC5kYXRhOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsICJwdWJsaXNoIik7CisgICAgZmZfYW1mX3dyaXRlX251bWJlcigmcCwgKytydC0+bmJfaW52b2tlcyk7CisgICAgZmZfYW1mX3dyaXRlX251bGwoJnApOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsIHJ0LT5wbGF5cGF0aCk7CisgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgImxpdmUiKTsKKworICAgIHJldHVybiBydG1wX3NlbmRfcGFja2V0KHJ0LCAmcGt0LCAxKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBwaW5nIHJlcGx5IGFuZCBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXIuCisgKi8KK3N0YXRpYyBpbnQgZ2VuX3BvbmcoVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0LCBSVE1QUGFja2V0ICpwcGt0KQoreworICAgIFJUTVBQYWNrZXQgcGt0OworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IHJldDsKKworICAgIGlmIChwcGt0LT5zaXplIDwgNikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IHBpbmcgcGFja2V0ICglZClcbiIsCisgICAgICAgICAgICAgICBwcGt0LT5zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnBrdCwgUlRNUF9ORVRXT1JLX0NIQU5ORUwsIFJUTVBfUFRfUElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcGt0LT50aW1lc3RhbXAgKyAxLCA2KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcCA9IHBrdC5kYXRhOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnAsIDcpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnAsIEFWX1JCMzIocHBrdC0+ZGF0YSsyKSk7CisKKyAgICByZXR1cm4gcnRtcF9zZW5kX3BhY2tldChydCwgJnBrdCwgMCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgU1dGIHZlcmlmaWNhdGlvbiBtZXNzYWdlIGFuZCBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXIuCisgKi8KK3N0YXRpYyBpbnQgZ2VuX3N3Zl92ZXJpZmljYXRpb24oVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0KQoreworICAgIFJUTVBQYWNrZXQgcGt0OworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IHJldDsKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJTZW5kaW5nIFNXRiB2ZXJpZmljYXRpb24uLi5cbiIpOworICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIFJUTVBfTkVUV09SS19DSEFOTkVMLCBSVE1QX1BUX1BJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgNDQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwID0gcGt0LmRhdGE7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcCwgMjcpOworICAgIG1lbWNweShwLCBydC0+c3dmdmVyaWZpY2F0aW9uLCA0Mik7CisKKyAgICByZXR1cm4gcnRtcF9zZW5kX3BhY2tldChydCwgJnBrdCwgMCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc2VydmVyIGJhbmR3aWR0aCBtZXNzYWdlIGFuZCBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXIuCisgKi8KK3N0YXRpYyBpbnQgZ2VuX3NlcnZlcl9idyhVUkxDb250ZXh0ICpzLCBSVE1QQ29udGV4dCAqcnQpCit7CisgICAgUlRNUFBhY2tldCBwa3Q7CisgICAgdWludDhfdCAqcDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnBrdCwgUlRNUF9ORVRXT1JLX0NIQU5ORUwsIFJUTVBfUFRfU0VSVkVSX0JXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwID0gcGt0LmRhdGE7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcCwgcnQtPnNlcnZlcl9idyk7CisKKyAgICByZXR1cm4gcnRtcF9zZW5kX3BhY2tldChydCwgJnBrdCwgMCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgY2hlY2sgYmFuZHdpZHRoIG1lc3NhZ2UgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlci4KKyAqLworc3RhdGljIGludCBnZW5fY2hlY2tfYncoVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0KQoreworICAgIFJUTVBQYWNrZXQgcGt0OworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIFJUTVBfU1lTVEVNX0NIQU5ORUwsIFJUTVBfUFRfSU5WT0tFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIxKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcCA9IHBrdC5kYXRhOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsICJfY2hlY2tidyIpOworICAgIGZmX2FtZl93cml0ZV9udW1iZXIoJnAsICsrcnQtPm5iX2ludm9rZXMpOworICAgIGZmX2FtZl93cml0ZV9udWxsKCZwKTsKKworICAgIHJldHVybiBydG1wX3NlbmRfcGFja2V0KHJ0LCAmcGt0LCAxKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSByZXBvcnQgb24gYnl0ZXMgcmVhZCBzbyBmYXIgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlci4KKyAqLworc3RhdGljIGludCBnZW5fYnl0ZXNfcmVhZChVUkxDb250ZXh0ICpzLCBSVE1QQ29udGV4dCAqcnQsIHVpbnQzMl90IHRzKQoreworICAgIFJUTVBQYWNrZXQgcGt0OworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIFJUTVBfTkVUV09SS19DSEFOTkVMLCBSVE1QX1BUX0JZVEVTX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMsIDQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwID0gcGt0LmRhdGE7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcCwgcnQtPmJ5dGVzX3JlYWQpOworCisgICAgcmV0dXJuIHJ0bXBfc2VuZF9wYWNrZXQocnQsICZwa3QsIDApOworfQorCitzdGF0aWMgaW50IGdlbl9mY3N1YnNjcmliZV9zdHJlYW0oVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1YnNjcmliZSkKK3sKKyAgICBSVE1QUGFja2V0IHBrdDsKKyAgICB1aW50OF90ICpwOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX1NZU1RFTV9DSEFOTkVMLCBSVE1QX1BUX0lOVk9LRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAyNyArIHN0cmxlbihzdWJzY3JpYmUpKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcCA9IHBrdC5kYXRhOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnAsICJGQ1N1YnNjcmliZSIpOworICAgIGZmX2FtZl93cml0ZV9udW1iZXIoJnAsICsrcnQtPm5iX2ludm9rZXMpOworICAgIGZmX2FtZl93cml0ZV9udWxsKCZwKTsKKyAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKCZwLCBzdWJzY3JpYmUpOworCisgICAgcmV0dXJuIHJ0bXBfc2VuZF9wYWNrZXQocnQsICZwa3QsIDEpOworfQorCitpbnQgZmZfcnRtcF9jYWxjX2RpZ2VzdChjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4sIGludCBnYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICprZXksIGludCBrZXlsZW4sIHVpbnQ4X3QgKmRzdCkKK3sKKyAgICBzdHJ1Y3QgQVZTSEEgKnNoYTsKKyAgICB1aW50OF90IGhtYWNfYnVmWzY0KzMyXSA9IHswfTsKKyAgICBpbnQgaTsKKworICAgIHNoYSA9IGF2X3NoYV9hbGxvYygpOworICAgIGlmICghc2hhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKGtleWxlbiA8IDY0KSB7CisgICAgICAgIG1lbWNweShobWFjX2J1Ziwga2V5LCBrZXlsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X3NoYV9pbml0KHNoYSwgMjU2KTsKKyAgICAgICAgYXZfc2hhX3VwZGF0ZShzaGEsa2V5LCBrZXlsZW4pOworICAgICAgICBhdl9zaGFfZmluYWwoc2hhLCBobWFjX2J1Zik7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICBobWFjX2J1ZltpXSBePSBITUFDX0lQQURfVkFMOworCisgICAgYXZfc2hhX2luaXQoc2hhLCAyNTYpOworICAgIGF2X3NoYV91cGRhdGUoc2hhLCBobWFjX2J1ZiwgNjQpOworICAgIGlmIChnYXAgPD0gMCkgeworICAgICAgICBhdl9zaGFfdXBkYXRlKHNoYSwgc3JjLCBsZW4pOworICAgIH0gZWxzZSB7IC8vc2tpcCAzMiBieXRlcyB1c2VkIGZvciBzdG9yaW5nIGRpZ2VzdAorICAgICAgICBhdl9zaGFfdXBkYXRlKHNoYSwgc3JjLCBnYXApOworICAgICAgICBhdl9zaGFfdXBkYXRlKHNoYSwgc3JjICsgZ2FwICsgMzIsIGxlbiAtIGdhcCAtIDMyKTsKKyAgICB9CisgICAgYXZfc2hhX2ZpbmFsKHNoYSwgaG1hY19idWYgKyA2NCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgaG1hY19idWZbaV0gXj0gSE1BQ19JUEFEX1ZBTCBeIEhNQUNfT1BBRF9WQUw7IC8vcmV1c2UgWE9SZWQga2V5IGZvciBvcGFkCisgICAgYXZfc2hhX2luaXQoc2hhLCAyNTYpOworICAgIGF2X3NoYV91cGRhdGUoc2hhLCBobWFjX2J1ZiwgNjQrMzIpOworICAgIGF2X3NoYV9maW5hbChzaGEsIGRzdCk7CisKKyAgICBhdl9mcmVlKHNoYSk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3J0bXBfY2FsY19kaWdlc3RfcG9zKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IG9mZiwgaW50IG1vZF92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkZF92YWwpCit7CisgICAgaW50IGksIGRpZ2VzdF9wb3MgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgZGlnZXN0X3BvcyArPSBidWZbaSArIG9mZl07CisgICAgZGlnZXN0X3BvcyA9IGRpZ2VzdF9wb3MgJSBtb2RfdmFsICsgYWRkX3ZhbDsKKworICAgIHJldHVybiBkaWdlc3RfcG9zOworfQorCisvKioKKyAqIFB1dCBITUFDLVNIQTIgZGlnZXN0IG9mIHBhY2tldCBkYXRhIChleGNlcHQgZm9yIHRoZSBieXRlcyB3aGVyZSB0aGlzIGRpZ2VzdAorICogd2lsbCBiZSBzdG9yZWQpIGludG8gdGhhdCBwYWNrZXQuCisgKgorICogQHBhcmFtIGJ1ZiBoYW5kc2hha2UgZGF0YSAoMTUzNiBieXRlcykKKyAqIEBwYXJhbSBlbmNyeXB0ZWQgdXNlIGFuIGVuY3J5cHRlZCBjb25uZWN0aW9uIChSVE1QRSkKKyAqIEByZXR1cm4gb2Zmc2V0IHRvIHRoZSBkaWdlc3QgaW5zaWRlIGlucHV0IGRhdGEKKyAqLworc3RhdGljIGludCBydG1wX2hhbmRzaGFrZV9pbXByaW50X3dpdGhfZGlnZXN0KHVpbnQ4X3QgKmJ1ZiwgaW50IGVuY3J5cHRlZCkKK3sKKyAgICBpbnQgcmV0LCBkaWdlc3RfcG9zOworCisgICAgaWYgKGVuY3J5cHRlZCkKKyAgICAgICAgZGlnZXN0X3BvcyA9IGZmX3J0bXBfY2FsY19kaWdlc3RfcG9zKGJ1ZiwgNzcyLCA3MjgsIDc3Nik7CisgICAgZWxzZQorICAgICAgICBkaWdlc3RfcG9zID0gZmZfcnRtcF9jYWxjX2RpZ2VzdF9wb3MoYnVmLCA4LCA3MjgsIDEyKTsKKworICAgIHJldCA9IGZmX3J0bXBfY2FsY19kaWdlc3QoYnVmLCBSVE1QX0hBTkRTSEFLRV9QQUNLRVRfU0laRSwgZGlnZXN0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0bXBfcGxheWVyX2tleSwgUExBWUVSX0tFWV9PUEVOX1BBUlRfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgZGlnZXN0X3Bvcyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gZGlnZXN0X3BvczsKK30KKworLyoqCisgKiBWZXJpZnkgdGhhdCB0aGUgcmVjZWl2ZWQgc2VydmVyIHJlc3BvbnNlIGhhcyB0aGUgZXhwZWN0ZWQgZGlnZXN0IHZhbHVlLgorICoKKyAqIEBwYXJhbSBidWYgaGFuZHNoYWtlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyICgxNTM2IGJ5dGVzKQorICogQHBhcmFtIG9mZiBwb3NpdGlvbiB0byBzZWFyY2ggZGlnZXN0IG9mZnNldCBmcm9tCisgKiBAcmV0dXJuIDAgaWYgZGlnZXN0IGlzIHZhbGlkLCBkaWdlc3QgcG9zaXRpb24gb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgcnRtcF92YWxpZGF0ZV9kaWdlc3QodWludDhfdCAqYnVmLCBpbnQgb2ZmKQoreworICAgIHVpbnQ4X3QgZGlnZXN0WzMyXTsKKyAgICBpbnQgcmV0LCBkaWdlc3RfcG9zOworCisgICAgZGlnZXN0X3BvcyA9IGZmX3J0bXBfY2FsY19kaWdlc3RfcG9zKGJ1Ziwgb2ZmLCA3MjgsIG9mZiArIDQpOworCisgICAgcmV0ID0gZmZfcnRtcF9jYWxjX2RpZ2VzdChidWYsIFJUTVBfSEFORFNIQUtFX1BBQ0tFVF9TSVpFLCBkaWdlc3RfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRtcF9zZXJ2ZXJfa2V5LCBTRVJWRVJfS0VZX09QRU5fUEFSVF9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCFtZW1jbXAoZGlnZXN0LCBidWYgKyBkaWdlc3RfcG9zLCAzMikpCisgICAgICAgIHJldHVybiBkaWdlc3RfcG9zOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bXBfY2FsY19zd2ZfdmVyaWZpY2F0aW9uKFVSTENvbnRleHQgKnMsIFJUTVBDb250ZXh0ICpydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmKQoreworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IHJldDsKKworICAgIGlmIChydC0+c3dmaGFzaF9sZW4gIT0gMzIpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJIYXNoIG9mIHRoZSBkZWNvbXByZXNzZWQgU1dGIGZpbGUgaXMgbm90IDMyIGJ5dGVzIGxvbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBwID0gJnJ0LT5zd2Z2ZXJpZmljYXRpb25bMF07CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgMSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgMSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcCwgcnQtPnN3ZnNpemUpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnAsIHJ0LT5zd2ZzaXplKTsKKworICAgIGlmICgocmV0ID0gZmZfcnRtcF9jYWxjX2RpZ2VzdChydC0+c3dmaGFzaCwgMzIsIDAsIGJ1ZiwgMzIsIHApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19aTElCCitzdGF0aWMgaW50IHJ0bXBfdW5jb21wcmVzc19zd2ZwbGF5ZXIodWludDhfdCAqaW5fZGF0YSwgaW50NjRfdCBpbl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipvdXRfZGF0YSwgaW50NjRfdCAqb3V0X3NpemUpCit7CisgICAgel9zdHJlYW0genMgPSB7IDAgfTsKKyAgICB2b2lkICpwdHI7CisgICAgaW50IHNpemU7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB6cy5hdmFpbF9pbiA9IGluX3NpemU7CisgICAgenMubmV4dF9pbiAgPSBpbl9kYXRhOworICAgIHJldCA9IGluZmxhdGVJbml0KCZ6cyk7CisgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworCisgICAgZG8geworICAgICAgICB1aW50OF90IHRtcF9idWZbMTYzODRdOworCisgICAgICAgIHpzLmF2YWlsX291dCA9IHNpemVvZih0bXBfYnVmKTsKKyAgICAgICAgenMubmV4dF9vdXQgID0gdG1wX2J1ZjsKKworICAgICAgICByZXQgPSBpbmZsYXRlKCZ6cywgWl9OT19GTFVTSCk7CisgICAgICAgIGlmIChyZXQgIT0gWl9PSyAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBzaXplID0gc2l6ZW9mKHRtcF9idWYpIC0genMuYXZhaWxfb3V0OworICAgICAgICBpZiAoIShwdHIgPSBhdl9yZWFsbG9jKCpvdXRfZGF0YSwgKm91dF9zaXplICsgc2l6ZSkpKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgKm91dF9kYXRhID0gcHRyOworCisgICAgICAgIG1lbWNweSgqb3V0X2RhdGEgKyAqb3V0X3NpemUsIHRtcF9idWYsIHNpemUpOworICAgICAgICAqb3V0X3NpemUgKz0gc2l6ZTsKKyAgICB9IHdoaWxlICh6cy5hdmFpbF9vdXQgPT0gMCk7CisKK2ZhaWw6CisgICAgaW5mbGF0ZUVuZCgmenMpOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBydG1wX2NhbGNfc3dmaGFzaChVUkxDb250ZXh0ICpzKQoreworICAgIFJUTVBDb250ZXh0ICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICppbl9kYXRhID0gTlVMTCwgKm91dF9kYXRhID0gTlVMTCwgKnN3ZmRhdGE7CisgICAgaW50NjRfdCBpbl9zaXplLCBvdXRfc2l6ZTsKKyAgICBVUkxDb250ZXh0ICpzdHJlYW07CisgICAgY2hhciBzd2ZoYXNoWzMyXTsKKyAgICBpbnQgc3dmc2l6ZTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIC8qIEdldCB0aGUgU1dGIHBsYXllciBmaWxlLiAqLworICAgIGlmICgocmV0ID0gZmZ1cmxfb3Blbigmc3RyZWFtLCBydC0+c3dmdmVyaWZ5LCBBVklPX0ZMQUdfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IG9wZW4gY29ubmVjdGlvbiAlcy5cbiIsIHJ0LT5zd2Z2ZXJpZnkpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKChpbl9zaXplID0gZmZ1cmxfc2VlayhzdHJlYW0sIDAsIEFWU0VFS19TSVpFKSkgPCAwKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICghKGluX2RhdGEgPSBhdl9tYWxsb2MoaW5fc2l6ZSkpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZ1cmxfcmVhZF9jb21wbGV0ZShzdHJlYW0sIGluX2RhdGEsIGluX3NpemUpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChpbl9zaXplIDwgMykgeworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKCFtZW1jbXAoaW5fZGF0YSwgIkNXUyIsIDMpKSB7CisgICAgICAgIC8qIERlY29tcHJlc3MgdGhlIFNXRiBwbGF5ZXIgZmlsZSB1c2luZyBabGliLiAqLworICAgICAgICBpZiAoIShvdXRfZGF0YSA9IGF2X21hbGxvYyg4KSkpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICAqaW5fZGF0YSA9ICdGJzsgLy8gbWFnaWMgc3R1ZmYKKyAgICAgICAgbWVtY3B5KG91dF9kYXRhLCBpbl9kYXRhLCA4KTsKKyAgICAgICAgb3V0X3NpemUgPSA4OworCisjaWYgQ09ORklHX1pMSUIKKyAgICAgICAgaWYgKChyZXQgPSBydG1wX3VuY29tcHJlc3Nfc3dmcGxheWVyKGluX2RhdGEgKyA4LCBpbl9zaXplIC0gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfZGF0YSwgJm91dF9zaXplKSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworI2Vsc2UKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJabGliIGlzIHJlcXVpcmVkIGZvciBkZWNvbXByZXNzaW5nIHRoZSBTV0YgcGxheWVyIGZpbGUuXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisjZW5kaWYKKyAgICAgICAgc3dmc2l6ZSA9IG91dF9zaXplOworICAgICAgICBzd2ZkYXRhID0gb3V0X2RhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dmc2l6ZSA9IGluX3NpemU7CisgICAgICAgIHN3ZmRhdGEgPSBpbl9kYXRhOworICAgIH0KKworICAgIC8qIENvbXB1dGUgdGhlIFNIQTI1NiBoYXNoIG9mIHRoZSBTV0YgcGxheWVyIGZpbGUuICovCisgICAgaWYgKChyZXQgPSBmZl9ydG1wX2NhbGNfZGlnZXN0KHN3ZmRhdGEsIHN3ZnNpemUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW51aW5lIEFkb2JlIEZsYXNoIFBsYXllciAwMDEiLCAzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dmaGFzaCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgLyogU2V0IFNXRlZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzLiAqLworICAgIGF2X29wdF9zZXRfYmluKHJ0LCAicnRtcF9zd2ZoYXNoIiwgc3dmaGFzaCwgMzIsIDApOworICAgIHJ0LT5zd2ZzaXplID0gc3dmc2l6ZTsKKworZmFpbDoKKyAgICBhdl9mcmVlcCgmaW5fZGF0YSk7CisgICAgYXZfZnJlZXAoJm91dF9kYXRhKTsKKyAgICBmZnVybF9jbG9zZShzdHJlYW0pOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogUGVyZm9ybSBoYW5kc2hha2Ugd2l0aCB0aGUgc2VydmVyIGJ5IG1lYW5zIG9mIGV4Y2hhbmdpbmcgcHNldWRvcmFuZG9tIGRhdGEKKyAqIHNpZ25lZCB3aXRoIEhNQUMtU0hBMiBkaWdlc3QuCisgKgorICogQHJldHVybiAwIGlmIGhhbmRzaGFrZSBzdWNjZWVkcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgcnRtcF9oYW5kc2hha2UoVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0KQoreworICAgIEFWTEZHIHJuZDsKKyAgICB1aW50OF90IHRvc2VuZCAgICBbUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUrMV0gPSB7CisgICAgICAgIDMsICAgICAgICAgICAgICAgIC8vIHVuZW5jcnlwdGVkIGRhdGEKKyAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgLy8gY2xpZW50IHVwdGltZQorICAgICAgICBSVE1QX0NMSUVOVF9WRVIxLAorICAgICAgICBSVE1QX0NMSUVOVF9WRVIyLAorICAgICAgICBSVE1QX0NMSUVOVF9WRVIzLAorICAgICAgICBSVE1QX0NMSUVOVF9WRVI0LAorICAgIH07CisgICAgdWludDhfdCBjbGllbnRkYXRhW1JUTVBfSEFORFNIQUtFX1BBQ0tFVF9TSVpFXTsKKyAgICB1aW50OF90IHNlcnZlcmRhdGFbUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUrMV07CisgICAgaW50IGk7CisgICAgaW50IHNlcnZlcl9wb3MsIGNsaWVudF9wb3M7CisgICAgdWludDhfdCBkaWdlc3RbMzJdLCBzaWduYXR1cmVbMzJdOworICAgIGludCByZXQsIHR5cGUgPSAwOworCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkhhbmRzaGFraW5nLi4uXG4iKTsKKworICAgIGF2X2xmZ19pbml0KCZybmQsIDB4REVBREMwREUpOworICAgIC8vIGdlbmVyYXRlIGhhbmRzaGFrZSBwYWNrZXQgLSAxNTM2IGJ5dGVzIG9mIHBzZXVkb3JhbmRvbSBkYXRhCisgICAgZm9yIChpID0gOTsgaSA8PSBSVE1QX0hBTkRTSEFLRV9QQUNLRVRfU0laRTsgaSsrKQorICAgICAgICB0b3NlbmRbaV0gPSBhdl9sZmdfZ2V0KCZybmQpID4+IDI0OworCisgICAgaWYgKENPTkZJR19GRlJUTVBDUllQVF9QUk9UT0NPTCAmJiBydC0+ZW5jcnlwdGVkKSB7CisgICAgICAgIC8qIFdoZW4gdGhlIGNsaWVudCB3YW50cyB0byB1c2UgUlRNUEUsIHdlIGhhdmUgdG8gY2hhbmdlIHRoZSBjb21tYW5kCisgICAgICAgICAqIGJ5dGUgdG8gMHgwNiB3aGljaCBtZWFucyB0byB1c2UgZW5jcnlwdGVkIGRhdGEgYW5kIHdlIGhhdmUgdG8gc2V0CisgICAgICAgICAqIHRoZSBmbGFzaCB2ZXJzaW9uIHRvIGF0IGxlYXN0IDkuMC4xMTUuMC4gKi8KKyAgICAgICAgdG9zZW5kWzBdID0gNjsKKyAgICAgICAgdG9zZW5kWzVdID0gMTI4OworICAgICAgICB0b3NlbmRbNl0gPSAwOworICAgICAgICB0b3NlbmRbN10gPSAzOworICAgICAgICB0b3NlbmRbOF0gPSAyOworCisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIERpZmZpZS1IZWxsbWFubiBjb250ZXh0IGFuZCBnZW5lcmF0ZSB0aGUgcHVibGljIGtleQorICAgICAgICAgKiB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuICovCisgICAgICAgIGlmICgocmV0ID0gZmZfcnRtcGVfZ2VuX3B1Yl9rZXkocnQtPnN0cmVhbSwgdG9zZW5kICsgMSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgY2xpZW50X3BvcyA9IHJ0bXBfaGFuZHNoYWtlX2ltcHJpbnRfd2l0aF9kaWdlc3QodG9zZW5kICsgMSwgcnQtPmVuY3J5cHRlZCk7CisgICAgaWYgKGNsaWVudF9wb3MgPCAwKQorICAgICAgICByZXR1cm4gY2xpZW50X3BvczsKKworICAgIGlmICgocmV0ID0gZmZ1cmxfd3JpdGUocnQtPnN0cmVhbSwgdG9zZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUgKyAxKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3Qgd3JpdGUgUlRNUCBoYW5kc2hha2UgcmVxdWVzdFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZnVybF9yZWFkX2NvbXBsZXRlKHJ0LT5zdHJlYW0sIHNlcnZlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfSEFORFNIQUtFX1BBQ0tFVF9TSVpFICsgMSkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IHJlYWQgUlRNUCBoYW5kc2hha2UgcmVzcG9uc2VcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZ1cmxfcmVhZF9jb21wbGV0ZShydC0+c3RyZWFtLCBjbGllbnRkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX0hBTkRTSEFLRV9QQUNLRVRfU0laRSkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IHJlYWQgUlRNUCBoYW5kc2hha2UgcmVzcG9uc2VcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJUeXBlIGFuc3dlciAlZFxuIiwgc2VydmVyZGF0YVswXSk7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIlNlcnZlciB2ZXJzaW9uICVkLiVkLiVkLiVkXG4iLAorICAgICAgICAgICBzZXJ2ZXJkYXRhWzVdLCBzZXJ2ZXJkYXRhWzZdLCBzZXJ2ZXJkYXRhWzddLCBzZXJ2ZXJkYXRhWzhdKTsKKworICAgIGlmIChydC0+aXNfaW5wdXQgJiYgc2VydmVyZGF0YVs1XSA+PSAzKSB7CisgICAgICAgIHNlcnZlcl9wb3MgPSBydG1wX3ZhbGlkYXRlX2RpZ2VzdChzZXJ2ZXJkYXRhICsgMSwgNzcyKTsKKyAgICAgICAgaWYgKHNlcnZlcl9wb3MgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHNlcnZlcl9wb3M7CisKKyAgICAgICAgaWYgKCFzZXJ2ZXJfcG9zKSB7CisgICAgICAgICAgICB0eXBlID0gMTsKKyAgICAgICAgICAgIHNlcnZlcl9wb3MgPSBydG1wX3ZhbGlkYXRlX2RpZ2VzdChzZXJ2ZXJkYXRhICsgMSwgOCk7CisgICAgICAgICAgICBpZiAoc2VydmVyX3BvcyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlcl9wb3M7CisKKyAgICAgICAgICAgIGlmICghc2VydmVyX3BvcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTZXJ2ZXIgcmVzcG9uc2UgdmFsaWRhdGluZyBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBHZW5lcmF0ZSBTV0ZWZXJpZmljYXRpb24gdG9rZW4gKFNIQTI1NiBITUFDIGhhc2ggb2YgZGVjb21wcmVzc2VkIFNXRiwKKyAgICAgICAgICoga2V5IGFyZSB0aGUgbGFzdCAzMiBieXRlcyBvZiB0aGUgc2VydmVyIGhhbmRzaGFrZS4gKi8KKyAgICAgICAgaWYgKHJ0LT5zd2ZzaXplKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IHJ0bXBfY2FsY19zd2ZfdmVyaWZpY2F0aW9uKHMsIHJ0LCBzZXJ2ZXJkYXRhICsgMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfSEFORFNIQUtFX1BBQ0tFVF9TSVpFIC0gMzIpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGZmX3J0bXBfY2FsY19kaWdlc3QodG9zZW5kICsgMSArIGNsaWVudF9wb3MsIDMyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0bXBfc2VydmVyX2tleSwgc2l6ZW9mKHJ0bXBfc2VydmVyX2tleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnZXN0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldCA9IGZmX3J0bXBfY2FsY19kaWdlc3QoY2xpZW50ZGF0YSwgUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUgLSAzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBkaWdlc3QsIDMyLCBzaWduYXR1cmUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKENPTkZJR19GRlJUTVBDUllQVF9QUk9UT0NPTCAmJiBydC0+ZW5jcnlwdGVkKSB7CisgICAgICAgICAgICAvKiBDb21wdXRlIHRoZSBzaGFyZWQgc2VjcmV0IGtleSBzZW50IGJ5IHRoZSBzZXJ2ZXIgYW5kIGluaXRpYWxpemUKKyAgICAgICAgICAgICAqIHRoZSBSQzQgZW5jcnlwdGlvbi4gKi8KKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfcnRtcGVfY29tcHV0ZV9zZWNyZXRfa2V5KHJ0LT5zdHJlYW0sIHNlcnZlcmRhdGEgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9zZW5kICsgMSwgdHlwZSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAvKiBFbmNyeXB0IHRoZSBzaWduYXR1cmUgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlci4gKi8KKyAgICAgICAgICAgIGZmX3J0bXBlX2VuY3J5cHRfc2lnKHJ0LT5zdHJlYW0sIHNpZ25hdHVyZSwgZGlnZXN0LCBzZXJ2ZXJkYXRhWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZW1jbXAoc2lnbmF0dXJlLCBjbGllbnRkYXRhICsgUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUgLSAzMiwgMzIpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU2lnbmF0dXJlIG1pc21hdGNoXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkU7IGkrKykKKyAgICAgICAgICAgIHRvc2VuZFtpXSA9IGF2X2xmZ19nZXQoJnJuZCkgPj4gMjQ7CisgICAgICAgIHJldCA9IGZmX3J0bXBfY2FsY19kaWdlc3Qoc2VydmVyZGF0YSArIDEgKyBzZXJ2ZXJfcG9zLCAzMiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydG1wX3BsYXllcl9rZXksIHNpemVvZihydG1wX3BsYXllcl9rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICByZXQgPSBmZl9ydG1wX2NhbGNfZGlnZXN0KHRvc2VuZCwgUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUgLSAzMiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3QsIDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvc2VuZCArIFJUTVBfSEFORFNIQUtFX1BBQ0tFVF9TSVpFIC0gMzIpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKENPTkZJR19GRlJUTVBDUllQVF9QUk9UT0NPTCAmJiBydC0+ZW5jcnlwdGVkKSB7CisgICAgICAgICAgICAvKiBFbmNyeXB0IHRoZSBzaWduYXR1cmUgdG8gYmUgc2VuZCB0byB0aGUgc2VydmVyLiAqLworICAgICAgICAgICAgZmZfcnRtcGVfZW5jcnlwdF9zaWcocnQtPnN0cmVhbSwgdG9zZW5kICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfSEFORFNIQUtFX1BBQ0tFVF9TSVpFIC0gMzIsIGRpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcmRhdGFbMF0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gd3JpdGUgcmVwbHkgYmFjayB0byB0aGUgc2VydmVyCisgICAgICAgIGlmICgocmV0ID0gZmZ1cmxfd3JpdGUocnQtPnN0cmVhbSwgdG9zZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfSEFORFNIQUtFX1BBQ0tFVF9TSVpFKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAoQ09ORklHX0ZGUlRNUENSWVBUX1BST1RPQ09MICYmIHJ0LT5lbmNyeXB0ZWQpIHsKKyAgICAgICAgICAgIC8qIFNldCBSQzQga2V5cyBmb3IgZW5jcnlwdGlvbiBhbmQgdXBkYXRlIHRoZSBrZXlzdHJlYW1zLiAqLworICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9ydG1wZV91cGRhdGVfa2V5c3RyZWFtKHJ0LT5zdHJlYW0pKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChDT05GSUdfRkZSVE1QQ1JZUFRfUFJPVE9DT0wgJiYgcnQtPmVuY3J5cHRlZCkgeworICAgICAgICAgICAgLyogQ29tcHV0ZSB0aGUgc2hhcmVkIHNlY3JldCBrZXkgc2VudCBieSB0aGUgc2VydmVyIGFuZCBpbml0aWFsaXplCisgICAgICAgICAgICAgKiB0aGUgUkM0IGVuY3J5cHRpb24uICovCisgICAgICAgICAgICBpZiAoKHJldCA9IGZmX3J0bXBlX2NvbXB1dGVfc2VjcmV0X2tleShydC0+c3RyZWFtLCBzZXJ2ZXJkYXRhICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3NlbmQgKyAxLCAxKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJkYXRhWzBdID09IDkpIHsKKyAgICAgICAgICAgICAgICAvKiBFbmNyeXB0IHRoZSBzaWduYXR1cmUgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlci4gKi8KKyAgICAgICAgICAgICAgICBmZl9ydG1wZV9lbmNyeXB0X3NpZyhydC0+c3RyZWFtLCBzaWduYXR1cmUsIGRpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJkYXRhWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gZmZ1cmxfd3JpdGUocnQtPnN0cmVhbSwgc2VydmVyZGF0YSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmIChDT05GSUdfRkZSVE1QQ1JZUFRfUFJPVE9DT0wgJiYgcnQtPmVuY3J5cHRlZCkgeworICAgICAgICAgICAgLyogU2V0IFJDNCBrZXlzIGZvciBlbmNyeXB0aW9uIGFuZCB1cGRhdGUgdGhlIGtleXN0cmVhbXMuICovCisgICAgICAgICAgICBpZiAoKHJldCA9IGZmX3J0bXBlX3VwZGF0ZV9rZXlzdHJlYW0ocnQtPnN0cmVhbSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRtcF9yZWNlaXZlX2hzX3BhY2tldChSVE1QQ29udGV4dCogcnQsIHVpbnQzMl90ICpmaXJzdF9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNlY29uZF9pbnQsIGNoYXIgKmFycmF5ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaW5vdXRzaXplOworCisgICAgaW5vdXRzaXplID0gZmZ1cmxfcmVhZF9jb21wbGV0ZShydC0+c3RyZWFtLCBhcnJheWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX0hBTkRTSEFLRV9QQUNLRVRfU0laRSk7CisgICAgaWYgKGlub3V0c2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIGlmIChpbm91dHNpemUgIT0gUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKHJ0LCBBVl9MT0dfRVJST1IsICJFcnJvbmVvdXMgTWVzc2FnZSBzaXplICVkIgorICAgICAgICAgICAgICAgIiBub3QgZm9sbG93aW5nIHN0YW5kYXJkXG4iLCAoaW50KWlub3V0c2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgKmZpcnN0X2ludCAgPSBBVl9SQjMyKGFycmF5ZGF0YSk7CisgICAgKnNlY29uZF9pbnQgPSBBVl9SQjMyKGFycmF5ZGF0YSArIDQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bXBfc2VuZF9oc19wYWNrZXQoUlRNUENvbnRleHQqIHJ0LCB1aW50MzJfdCBmaXJzdF9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Vjb25kX2ludCwgY2hhciAqYXJyYXlkYXRhLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaW5vdXRzaXplOworCisgICAgQVZfV0IzMihhcnJheWRhdGEsIGZpcnN0X2ludCk7CisgICAgQVZfV0IzMihhcnJheWRhdGEgKyA0LCBzZWNvbmRfaW50KTsKKyAgICBpbm91dHNpemUgPSBmZnVybF93cml0ZShydC0+c3RyZWFtLCBhcnJheWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUpOworICAgIGlmIChpbm91dHNpemUgIT0gUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKHJ0LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gd3JpdGUgYW5zd2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBydG1wIGhhbmRzaGFrZSBzZXJ2ZXIgc2lkZQorICovCitzdGF0aWMgaW50IHJ0bXBfc2VydmVyX2hhbmRzaGFrZShVUkxDb250ZXh0ICpzLCBSVE1QQ29udGV4dCAqcnQpCit7CisgICAgdWludDhfdCBidWZmZXJbUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkVdOworICAgIHVpbnQzMl90IGhzX2Vwb2NoOworICAgIHVpbnQzMl90IGhzX215X2Vwb2NoOworICAgIHVpbnQ4X3QgaHNfYzFbUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkVdOworICAgIHVpbnQ4X3QgaHNfczFbUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkVdOworICAgIHVpbnQzMl90IHplcm9lczsKKyAgICB1aW50MzJfdCB0ZW1wICAgICAgID0gMDsKKyAgICBpbnQgcmFuZG9taWR4ICAgICAgID0gMDsKKyAgICBpbnQgaW5vdXRzaXplICAgICAgID0gMDsKKyAgICBpbnQgcmV0OworCisgICAgaW5vdXRzaXplID0gZmZ1cmxfcmVhZF9jb21wbGV0ZShydC0+c3RyZWFtLCBidWZmZXIsIDEpOyAgICAgICAvLyBSZWNlaXZlIEMwCisgICAgaWYgKGlub3V0c2l6ZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmVhZCBoYW5kc2hha2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICAvLyBDaGVjayBWZXJzaW9uCisgICAgaWYgKGJ1ZmZlclswXSAhPSAzKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJSVE1QIHByb3RvY29sIHZlcnNpb24gbWlzbWF0Y2hcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBpZiAoZmZ1cmxfd3JpdGUocnQtPnN0cmVhbSwgYnVmZmVyLCAxKSA8PSAwKSB7ICAgICAgICAgICAgICAgICAvLyBTZW5kIFMwCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHdyaXRlIGFuc3dlciAtIFJUTVAgUzBcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICAvKiBSZWNlaXZlIEMxICovCisgICAgcmV0ID0gcnRtcF9yZWNlaXZlX2hzX3BhY2tldChydCwgJmhzX2Vwb2NoLCAmemVyb2VzLCBoc19jMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfSEFORFNIQUtFX1BBQ0tFVF9TSVpFKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJSVE1QIEhhbmRzaGFrZSBDMSBFcnJvclxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIC8qIFNlbmQgUzEgKi8KKyAgICAvKiBCeSBub3cgc2FtZSBlcG9jaCB3aWxsIGJlIHNlbnQgKi8KKyAgICBoc19teV9lcG9jaCA9IGhzX2Vwb2NoOworICAgIC8qIEdlbmVyYXRlIHJhbmRvbSAqLworICAgIGZvciAocmFuZG9taWR4ID0gODsgcmFuZG9taWR4IDwgKFJUTVBfSEFORFNIQUtFX1BBQ0tFVF9TSVpFKTsKKyAgICAgICAgIHJhbmRvbWlkeCArPSA0KQorICAgICAgICBBVl9XQjMyKGhzX3MxICsgcmFuZG9taWR4LCBhdl9nZXRfcmFuZG9tX3NlZWQoKSk7CisKKyAgICByZXQgPSBydG1wX3NlbmRfaHNfcGFja2V0KHJ0LCBoc19teV9lcG9jaCwgMCwgaHNfczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX0hBTkRTSEFLRV9QQUNLRVRfU0laRSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUlRNUCBIYW5kc2hha2UgUzEgRXJyb3JcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICAvKiBTZW5kIFMyICovCisgICAgcmV0ID0gcnRtcF9zZW5kX2hzX3BhY2tldChydCwgaHNfZXBvY2gsIDAsIGhzX2MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlJUTVAgSGFuZHNoYWtlIFMyIEVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgLyogUmVjZWl2ZSBDMiAqLworICAgIHJldCA9IHJ0bXBfcmVjZWl2ZV9oc19wYWNrZXQocnQsICZ0ZW1wLCAmemVyb2VzLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX0hBTkRTSEFLRV9QQUNLRVRfU0laRSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUlRNUCBIYW5kc2hha2UgQzIgRXJyb3JcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAodGVtcCAhPSBoc19teV9lcG9jaCkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkVycm9uZW91cyBDMiBNZXNzYWdlIGVwb2NoIGRvZXMgbm90IG1hdGNoIHVwIHdpdGggQzEgZXBvY2hcbiIpOworICAgIGlmIChtZW1jbXAoYnVmZmVyICsgOCwgaHNfczEgKyA4LAorICAgICAgICAgICAgICAgUlRNUF9IQU5EU0hBS0VfUEFDS0VUX1NJWkUgLSA4KSkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkVycm9uZW91cyBDMiBNZXNzYWdlIHJhbmRvbSBkb2VzIG5vdCBtYXRjaCB1cFxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfY2h1bmtfc2l6ZShVUkxDb250ZXh0ICpzLCBSVE1QUGFja2V0ICpwa3QpCit7CisgICAgUlRNUENvbnRleHQgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAocGt0LT5zaXplIDwgNCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRvbyBzaG9ydCBjaHVuayBzaXplIGNoYW5nZSBwYWNrZXQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgIHBrdC0+c2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICghcnQtPmlzX2lucHV0KSB7CisgICAgICAgIC8qIFNlbmQgdGhlIHNhbWUgY2h1bmsgc2l6ZSBjaGFuZ2UgcGFja2V0IGJhY2sgdG8gdGhlIHNlcnZlciwKKyAgICAgICAgICogc2V0dGluZyB0aGUgb3V0Z29pbmcgY2h1bmsgc2l6ZSB0byB0aGUgc2FtZSBhcyB0aGUgaW5jb21pbmcgb25lLiAqLworICAgICAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X3dyaXRlKHJ0LT5zdHJlYW0sIHBrdCwgcnQtPm91dF9jaHVua19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZydC0+cHJldl9wa3RbMV0sICZydC0+bmJfcHJldl9wa3RbMV0pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBydC0+b3V0X2NodW5rX3NpemUgPSBBVl9SQjMyKHBrdC0+ZGF0YSk7CisgICAgfQorCisgICAgcnQtPmluX2NodW5rX3NpemUgPSBBVl9SQjMyKHBrdC0+ZGF0YSk7CisgICAgaWYgKHJ0LT5pbl9jaHVua19zaXplIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkluY29ycmVjdCBjaHVuayBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgcnQtPmluX2NodW5rX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIk5ldyBpbmNvbWluZyBjaHVuayBzaXplID0gJWRcbiIsCisgICAgICAgICAgIHJ0LT5pbl9jaHVua19zaXplKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9waW5nKFVSTENvbnRleHQgKnMsIFJUTVBQYWNrZXQgKnBrdCkKK3sKKyAgICBSVE1QQ29udGV4dCAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHQsIHJldDsKKworICAgIGlmIChwa3QtPnNpemUgPCAyKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJUb28gc2hvcnQgcGluZyBwYWNrZXQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgIHBrdC0+c2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHQgPSBBVl9SQjE2KHBrdC0+ZGF0YSk7CisgICAgaWYgKHQgPT0gNikgeworICAgICAgICBpZiAoKHJldCA9IGdlbl9wb25nKHMsIHJ0LCBwa3QpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSBpZiAodCA9PSAyNikgeworICAgICAgICBpZiAocnQtPnN3ZnNpemUpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZ2VuX3N3Zl92ZXJpZmljYXRpb24ocywgcnQpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIklnbm9yaW5nIFNXRlZlcmlmaWNhdGlvbiByZXF1ZXN0LlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfY2xpZW50X2J3KFVSTENvbnRleHQgKnMsIFJUTVBQYWNrZXQgKnBrdCkKK3sKKyAgICBSVE1QQ29udGV4dCAqcnQgPSBzLT5wcml2X2RhdGE7CisKKyAgICBpZiAocGt0LT5zaXplIDwgNCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNsaWVudCBiYW5kd2lkdGggcmVwb3J0IHBhY2tldCBpcyBsZXNzIHRoYW4gNCBieXRlcyBsb25nICglZClcbiIsCisgICAgICAgICAgICAgICBwa3QtPnNpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBydC0+Y2xpZW50X3JlcG9ydF9zaXplID0gQVZfUkIzMihwa3QtPmRhdGEpOworICAgIGlmIChydC0+Y2xpZW50X3JlcG9ydF9zaXplIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkluY29ycmVjdCBjbGllbnQgYmFuZHdpZHRoICVkXG4iLAorICAgICAgICAgICAgICAgIHJ0LT5jbGllbnRfcmVwb3J0X3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIH0KKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiQ2xpZW50IGJhbmR3aWR0aCA9ICVkXG4iLCBydC0+Y2xpZW50X3JlcG9ydF9zaXplKTsKKyAgICBydC0+Y2xpZW50X3JlcG9ydF9zaXplID4+PSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3NlcnZlcl9idyhVUkxDb250ZXh0ICpzLCBSVE1QUGFja2V0ICpwa3QpCit7CisgICAgUlRNUENvbnRleHQgKnJ0ID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKHBrdC0+c2l6ZSA8IDQpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUb28gc2hvcnQgc2VydmVyIGJhbmR3aWR0aCByZXBvcnQgcGFja2V0ICglZClcbiIsCisgICAgICAgICAgICAgICBwa3QtPnNpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBydC0+c2VydmVyX2J3ID0gQVZfUkIzMihwa3QtPmRhdGEpOworICAgIGlmIChydC0+c2VydmVyX2J3IDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkluY29ycmVjdCBzZXJ2ZXIgYmFuZHdpZHRoICVkXG4iLAorICAgICAgICAgICAgICAgcnQtPnNlcnZlcl9idyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiU2VydmVyIGJhbmR3aWR0aCA9ICVkXG4iLCBydC0+c2VydmVyX2J3KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2Fkb2JlX2F1dGgoUlRNUENvbnRleHQgKnJ0LCBjb25zdCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICpzYWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wYXF1ZSwgY29uc3QgY2hhciAqY2hhbGxlbmdlKQoreworICAgIHVpbnQ4X3QgaGFzaFsxNl07CisgICAgY2hhciBoYXNoc3RyW0FWX0JBU0U2NF9TSVpFKHNpemVvZihoYXNoKSldLCBjaGFsbGVuZ2UyWzEwXTsKKyAgICBzdHJ1Y3QgQVZNRDUgKm1kNSA9IGF2X21kNV9hbGxvYygpOworICAgIGlmICghbWQ1KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc25wcmludGYoY2hhbGxlbmdlMiwgc2l6ZW9mKGNoYWxsZW5nZTIpLCAiJTA4eCIsIGF2X2dldF9yYW5kb21fc2VlZCgpKTsKKworICAgIGF2X21kNV9pbml0KG1kNSk7CisgICAgYXZfbWQ1X3VwZGF0ZShtZDUsIHVzZXIsIHN0cmxlbih1c2VyKSk7CisgICAgYXZfbWQ1X3VwZGF0ZShtZDUsIHNhbHQsIHN0cmxlbihzYWx0KSk7CisgICAgYXZfbWQ1X3VwZGF0ZShtZDUsIHJ0LT5wYXNzd29yZCwgc3RybGVuKHJ0LT5wYXNzd29yZCkpOworICAgIGF2X21kNV9maW5hbChtZDUsIGhhc2gpOworICAgIGF2X2Jhc2U2NF9lbmNvZGUoaGFzaHN0ciwgc2l6ZW9mKGhhc2hzdHIpLCBoYXNoLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhc2gpKTsKKyAgICBhdl9tZDVfaW5pdChtZDUpOworICAgIGF2X21kNV91cGRhdGUobWQ1LCBoYXNoc3RyLCBzdHJsZW4oaGFzaHN0cikpOworICAgIGlmIChvcGFxdWUpCisgICAgICAgIGF2X21kNV91cGRhdGUobWQ1LCBvcGFxdWUsIHN0cmxlbihvcGFxdWUpKTsKKyAgICBlbHNlIGlmIChjaGFsbGVuZ2UpCisgICAgICAgIGF2X21kNV91cGRhdGUobWQ1LCBjaGFsbGVuZ2UsIHN0cmxlbihjaGFsbGVuZ2UpKTsKKyAgICBhdl9tZDVfdXBkYXRlKG1kNSwgY2hhbGxlbmdlMiwgc3RybGVuKGNoYWxsZW5nZTIpKTsKKyAgICBhdl9tZDVfZmluYWwobWQ1LCBoYXNoKTsKKyAgICBhdl9iYXNlNjRfZW5jb2RlKGhhc2hzdHIsIHNpemVvZihoYXNoc3RyKSwgaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYXNoKSk7CisgICAgc25wcmludGYocnQtPmF1dGhfcGFyYW1zLCBzaXplb2YocnQtPmF1dGhfcGFyYW1zKSwKKyAgICAgICAgICAgICAiP2F1dGhtb2Q9JXMmdXNlcj0lcyZjaGFsbGVuZ2U9JXMmcmVzcG9uc2U9JXMiLAorICAgICAgICAgICAgICJhZG9iZSIsIHVzZXIsIGNoYWxsZW5nZTIsIGhhc2hzdHIpOworICAgIGlmIChvcGFxdWUpCisgICAgICAgIGF2X3N0cmxjYXRmKHJ0LT5hdXRoX3BhcmFtcywgc2l6ZW9mKHJ0LT5hdXRoX3BhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICImb3BhcXVlPSVzIiwgb3BhcXVlKTsKKworICAgIGF2X2ZyZWUobWQ1KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19sbG53X2F1dGgoUlRNUENvbnRleHQgKnJ0LCBjb25zdCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICpub25jZSkKK3sKKyAgICB1aW50OF90IGhhc2hbMTZdOworICAgIGNoYXIgaGFzaHN0cjFbMzNdLCBoYXNoc3RyMlszM107CisgICAgY29uc3QgY2hhciAqcmVhbG0gPSAibGl2ZSI7CisgICAgY29uc3QgY2hhciAqbWV0aG9kID0gInB1Ymxpc2giOworICAgIGNvbnN0IGNoYXIgKnFvcCA9ICJhdXRoIjsKKyAgICBjb25zdCBjaGFyICpuYyA9ICIwMDAwMDAwMSI7CisgICAgY2hhciBjbm9uY2VbMTBdOworICAgIHN0cnVjdCBBVk1ENSAqbWQ1ID0gYXZfbWQ1X2FsbG9jKCk7CisgICAgaWYgKCFtZDUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzbnByaW50Zihjbm9uY2UsIHNpemVvZihjbm9uY2UpLCAiJTA4eCIsIGF2X2dldF9yYW5kb21fc2VlZCgpKTsKKworICAgIGF2X21kNV9pbml0KG1kNSk7CisgICAgYXZfbWQ1X3VwZGF0ZShtZDUsIHVzZXIsIHN0cmxlbih1c2VyKSk7CisgICAgYXZfbWQ1X3VwZGF0ZShtZDUsICI6IiwgMSk7CisgICAgYXZfbWQ1X3VwZGF0ZShtZDUsIHJlYWxtLCBzdHJsZW4ocmVhbG0pKTsKKyAgICBhdl9tZDVfdXBkYXRlKG1kNSwgIjoiLCAxKTsKKyAgICBhdl9tZDVfdXBkYXRlKG1kNSwgcnQtPnBhc3N3b3JkLCBzdHJsZW4ocnQtPnBhc3N3b3JkKSk7CisgICAgYXZfbWQ1X2ZpbmFsKG1kNSwgaGFzaCk7CisgICAgZmZfZGF0YV90b19oZXgoaGFzaHN0cjEsIGhhc2gsIDE2LCAxKTsKKyAgICBoYXNoc3RyMVszMl0gPSAnXDAnOworCisgICAgYXZfbWQ1X2luaXQobWQ1KTsKKyAgICBhdl9tZDVfdXBkYXRlKG1kNSwgbWV0aG9kLCBzdHJsZW4obWV0aG9kKSk7CisgICAgYXZfbWQ1X3VwZGF0ZShtZDUsICI6LyIsIDIpOworICAgIGF2X21kNV91cGRhdGUobWQ1LCBydC0+YXBwLCBzdHJsZW4ocnQtPmFwcCkpOworICAgIGlmICghc3RyY2hyKHJ0LT5hcHAsICcvJykpCisgICAgICAgIGF2X21kNV91cGRhdGUobWQ1LCAiL19kZWZpbnN0XyIsIHN0cmxlbigiL19kZWZpbnN0XyIpKTsKKyAgICBhdl9tZDVfZmluYWwobWQ1LCBoYXNoKTsKKyAgICBmZl9kYXRhX3RvX2hleChoYXNoc3RyMiwgaGFzaCwgMTYsIDEpOworICAgIGhhc2hzdHIyWzMyXSA9ICdcMCc7CisKKyAgICBhdl9tZDVfaW5pdChtZDUpOworICAgIGF2X21kNV91cGRhdGUobWQ1LCBoYXNoc3RyMSwgc3RybGVuKGhhc2hzdHIxKSk7CisgICAgYXZfbWQ1X3VwZGF0ZShtZDUsICI6IiwgMSk7CisgICAgaWYgKG5vbmNlKQorICAgICAgICBhdl9tZDVfdXBkYXRlKG1kNSwgbm9uY2UsIHN0cmxlbihub25jZSkpOworICAgIGF2X21kNV91cGRhdGUobWQ1LCAiOiIsIDEpOworICAgIGF2X21kNV91cGRhdGUobWQ1LCBuYywgc3RybGVuKG5jKSk7CisgICAgYXZfbWQ1X3VwZGF0ZShtZDUsICI6IiwgMSk7CisgICAgYXZfbWQ1X3VwZGF0ZShtZDUsIGNub25jZSwgc3RybGVuKGNub25jZSkpOworICAgIGF2X21kNV91cGRhdGUobWQ1LCAiOiIsIDEpOworICAgIGF2X21kNV91cGRhdGUobWQ1LCBxb3AsIHN0cmxlbihxb3ApKTsKKyAgICBhdl9tZDVfdXBkYXRlKG1kNSwgIjoiLCAxKTsKKyAgICBhdl9tZDVfdXBkYXRlKG1kNSwgaGFzaHN0cjIsIHN0cmxlbihoYXNoc3RyMikpOworICAgIGF2X21kNV9maW5hbChtZDUsIGhhc2gpOworICAgIGZmX2RhdGFfdG9faGV4KGhhc2hzdHIxLCBoYXNoLCAxNiwgMSk7CisKKyAgICBzbnByaW50ZihydC0+YXV0aF9wYXJhbXMsIHNpemVvZihydC0+YXV0aF9wYXJhbXMpLAorICAgICAgICAgICAgICI/YXV0aG1vZD0lcyZ1c2VyPSVzJm5vbmNlPSVzJmNub25jZT0lcyZuYz0lcyZyZXNwb25zZT0lcyIsCisgICAgICAgICAgICAgImxsbnciLCB1c2VyLCBub25jZSwgY25vbmNlLCBuYywgaGFzaHN0cjEpOworCisgICAgYXZfZnJlZShtZDUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9jb25uZWN0X2Vycm9yKFVSTENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKmRlc2MpCit7CisgICAgUlRNUENvbnRleHQgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgYnVmWzMwMF0sICpwdHIsIGF1dGhtb2RbMTVdOworICAgIGludCBpID0gMCwgcmV0ID0gMDsKKyAgICBjb25zdCBjaGFyICp1c2VyID0gIiIsICpzYWx0ID0gIiIsICpvcGFxdWUgPSBOVUxMLAorICAgICAgICAgICAgICAgKmNoYWxsZW5nZSA9IE5VTEwsICpjcHRyID0gTlVMTCwgKm5vbmNlID0gTlVMTDsKKworICAgIGlmICghKGNwdHIgPSBzdHJzdHIoZGVzYywgImF1dGhtb2Q9YWRvYmUiKSkgJiYKKyAgICAgICAgIShjcHRyID0gc3Ryc3RyKGRlc2MsICJhdXRobW9kPWxsbnciKSkpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbmtub3duIGNvbm5lY3QgZXJyb3IgKHVuc3VwcG9ydGVkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZD8pXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgY3B0ciArPSBzdHJsZW4oImF1dGhtb2Q9Iik7CisgICAgd2hpbGUgKCpjcHRyICYmICpjcHRyICE9ICcgJyAmJiBpIDwgc2l6ZW9mKGF1dGhtb2QpIC0gMSkKKyAgICAgICAgYXV0aG1vZFtpKytdID0gKmNwdHIrKzsKKyAgICBhdXRobW9kW2ldID0gJ1wwJzsKKworICAgIGlmICghcnQtPnVzZXJuYW1lWzBdIHx8ICFydC0+cGFzc3dvcmRbMF0pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vIGNyZWRlbnRpYWxzIHNldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaWYgKHN0cnN0cihkZXNjLCAiP3JlYXNvbj1hdXRoZmFpbGVkIikpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkluY29ycmVjdCB1c2VybmFtZS9wYXNzd29yZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfSBlbHNlIGlmIChzdHJzdHIoZGVzYywgIj9yZWFzb249bm9zdWNodXNlciIpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgdXNlcm5hbWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGlmIChydC0+YXV0aF90cmllZCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQXV0aGVudGljYXRpb24gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBydC0+YXV0aF9wYXJhbXNbMF0gPSAnXDAnOworCisgICAgaWYgKHN0cnN0cihkZXNjLCAiY29kZT00MDMgbmVlZCBhdXRoIikpIHsKKyAgICAgICAgc25wcmludGYocnQtPmF1dGhfcGFyYW1zLCBzaXplb2YocnQtPmF1dGhfcGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgIj9hdXRobW9kPSVzJnVzZXI9JXMiLCBhdXRobW9kLCBydC0+dXNlcm5hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIShjcHRyID0gc3Ryc3RyKGRlc2MsICI/cmVhc29uPW5lZWRhdXRoIikpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyBhdXRoIHBhcmFtZXRlcnMgZm91bmRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGF2X3N0cmxjcHkoYnVmLCBjcHRyICsgMSwgc2l6ZW9mKGJ1ZikpOworICAgIHB0ciA9IGJ1ZjsKKworICAgIHdoaWxlIChwdHIpIHsKKyAgICAgICAgY2hhciAqbmV4dCAgPSBzdHJjaHIocHRyLCAnJicpOworICAgICAgICBjaGFyICp2YWx1ZSA9IHN0cmNocihwdHIsICc9Jyk7CisgICAgICAgIGlmIChuZXh0KQorICAgICAgICAgICAgKm5leHQrKyA9ICdcMCc7CisgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgKnZhbHVlKysgPSAnXDAnOworICAgICAgICAgICAgaWYgKCFzdHJjbXAocHRyLCAidXNlciIpKSB7CisgICAgICAgICAgICAgICAgdXNlciA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHB0ciwgInNhbHQiKSkgeworICAgICAgICAgICAgICAgIHNhbHQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChwdHIsICJvcGFxdWUiKSkgeworICAgICAgICAgICAgICAgIG9wYXF1ZSA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHB0ciwgImNoYWxsZW5nZSIpKSB7CisgICAgICAgICAgICAgICAgY2hhbGxlbmdlID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAocHRyLCAibm9uY2UiKSkgeworICAgICAgICAgICAgICAgIG5vbmNlID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIklnbm9yaW5nIHVuc3VwcG9ydGVkIHZhciAlc1xuIiwgcHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlZhcmlhYmxlICVzIGhhcyBOVUxMIHZhbHVlXG4iLCBwdHIpOworICAgICAgICB9CisgICAgICAgIHB0ciA9IG5leHQ7CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAoYXV0aG1vZCwgImFkb2JlIikpIHsKKyAgICAgICAgaWYgKChyZXQgPSBkb19hZG9iZV9hdXRoKHJ0LCB1c2VyLCBzYWx0LCBvcGFxdWUsIGNoYWxsZW5nZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChyZXQgPSBkb19sbG53X2F1dGgocnQsIHVzZXIsIG5vbmNlKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBydC0+YXV0aF90cmllZCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2ludm9rZV9lcnJvcihVUkxDb250ZXh0ICpzLCBSVE1QUGFja2V0ICpwa3QpCit7CisgICAgUlRNUENvbnRleHQgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGFfZW5kID0gcGt0LT5kYXRhICsgcGt0LT5zaXplOworICAgIGNoYXIgKnRyYWNrZWRfbWV0aG9kID0gTlVMTDsKKyAgICBpbnQgbGV2ZWwgPSBBVl9MT0dfRVJST1I7CisgICAgdWludDhfdCB0bXBzdHJbMjU2XTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmaW5kX3RyYWNrZWRfbWV0aG9kKHMsIHBrdCwgOSwgJnRyYWNrZWRfbWV0aG9kKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCFmZl9hbWZfZ2V0X2ZpZWxkX3ZhbHVlKHBrdC0+ZGF0YSArIDksIGRhdGFfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iLCB0bXBzdHIsIHNpemVvZih0bXBzdHIpKSkgeworICAgICAgICBpZiAodHJhY2tlZF9tZXRob2QgJiYgKCFzdHJjbXAodHJhY2tlZF9tZXRob2QsICJfY2hlY2tidyIpICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKHRyYWNrZWRfbWV0aG9kLCAicmVsZWFzZVN0cmVhbSIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcCh0cmFja2VkX21ldGhvZCwgIkZDU3Vic2NyaWJlIikgICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAodHJhY2tlZF9tZXRob2QsICJGQ1B1Ymxpc2giKSkpIHsKKyAgICAgICAgICAgIC8qIEdyYWNlZnVsbHkgaWdub3JlIEFkb2JlLXNwZWNpZmljIGhpc3RvcmljYWwgYXJ0aWZhY3QgZXJyb3JzLiAqLworICAgICAgICAgICAgbGV2ZWwgPSBBVl9MT0dfV0FSTklORzsKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2tlZF9tZXRob2QgJiYgIXN0cmNtcCh0cmFja2VkX21ldGhvZCwgImdldFN0cmVhbUxlbmd0aCIpKSB7CisgICAgICAgICAgICBsZXZlbCA9IHJ0LT5saXZlID8gQVZfTE9HX0RFQlVHIDogQVZfTE9HX1dBUk5JTkc7CisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHRyYWNrZWRfbWV0aG9kICYmICFzdHJjbXAodHJhY2tlZF9tZXRob2QsICJjb25uZWN0IikpIHsKKyAgICAgICAgICAgIHJldCA9IGhhbmRsZV9jb25uZWN0X2Vycm9yKHMsIHRtcHN0cik7CisgICAgICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgICAgIHJ0LT5kb19yZWNvbm5lY3QgPSAxOworICAgICAgICAgICAgICAgIGxldmVsID0gQVZfTE9HX1ZFUkJPU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBhdl9sb2cocywgbGV2ZWwsICJTZXJ2ZXIgZXJyb3I6ICVzXG4iLCB0bXBzdHIpOworICAgIH0KKworICAgIGF2X2ZyZWUodHJhY2tlZF9tZXRob2QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfYmVnaW4oVVJMQ29udGV4dCAqcykKK3sKKyAgICBSVE1QQ29udGV4dCAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgUHV0Qnl0ZUNvbnRleHQgcGJjOworICAgIFJUTVBQYWNrZXQgc3BrdCA9IHsgMCB9OworICAgIGludCByZXQ7CisKKyAgICAvLyBTZW5kIFN0cmVhbSBCZWdpbiAxCisgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnNwa3QsIFJUTVBfTkVUV09SS19DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfUFRfUElORywgMCwgNikpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSByZXNwb25zZSBwYWNrZXRcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX2luaXRfd3JpdGVyKCZwYmMsIHNwa3QuZGF0YSwgc3BrdC5zaXplKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfYmUxNigmcGJjLCAwKTsgICAgICAgICAgLy8gMCAtPiBTdHJlYW0gQmVnaW4KKyAgICBieXRlc3RyZWFtMl9wdXRfYmUzMigmcGJjLCBydC0+bmJfc3RyZWFtaWQpOworCisgICAgcmV0ID0gZmZfcnRtcF9wYWNrZXRfd3JpdGUocnQtPnN0cmVhbSwgJnNwa3QsIHJ0LT5vdXRfY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnQtPnByZXZfcGt0WzFdLCAmcnQtPm5iX3ByZXZfcGt0WzFdKTsKKworICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnNwa3QpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3cml0ZV9zdGF0dXMoVVJMQ29udGV4dCAqcywgUlRNUFBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhdHVzLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBSVE1QQ29udGV4dCAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgUlRNUFBhY2tldCBzcGt0ID0geyAwIH07CisgICAgY2hhciBzdGF0dXNtc2dbMTI4XTsKKyAgICB1aW50OF90ICpwcDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnNwa3QsIFJUTVBfU1lTVEVNX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRNUF9QVF9JTlZPS0UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRNUF9QS1REQVRBX0RFRkFVTFRfU0laRSkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSByZXNwb25zZSBwYWNrZXRcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHBwID0gc3BrdC5kYXRhOworICAgIHNwa3QuZXh0cmEgPSBwa3QtPmV4dHJhOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnBwLCAib25TdGF0dXMiKTsKKyAgICBmZl9hbWZfd3JpdGVfbnVtYmVyKCZwcCwgMCk7CisgICAgZmZfYW1mX3dyaXRlX251bGwoJnBwKTsKKworICAgIGZmX2FtZl93cml0ZV9vYmplY3Rfc3RhcnQoJnBwKTsKKyAgICBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSgmcHAsICJsZXZlbCIpOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnBwLCAic3RhdHVzIik7CisgICAgZmZfYW1mX3dyaXRlX2ZpZWxkX25hbWUoJnBwLCAiY29kZSIpOworICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnBwLCBzdGF0dXMpOworICAgIGZmX2FtZl93cml0ZV9maWVsZF9uYW1lKCZwcCwgImRlc2NyaXB0aW9uIik7CisgICAgc25wcmludGYoc3RhdHVzbXNnLCBzaXplb2Yoc3RhdHVzbXNnKSwKKyAgICAgICAgICAgICAiJXMgaXMgbm93IHB1Ymxpc2hlZCIsIGZpbGVuYW1lKTsKKyAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKCZwcCwgc3RhdHVzbXNnKTsKKyAgICBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSgmcHAsICJkZXRhaWxzIik7CisgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcHAsIGZpbGVuYW1lKTsKKyAgICBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSgmcHAsICJjbGllbnRpZCIpOworICAgIHNucHJpbnRmKHN0YXR1c21zZywgc2l6ZW9mKHN0YXR1c21zZyksICIlcyIsIExJQkFWRk9STUFUX0lERU5UKTsKKyAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKCZwcCwgc3RhdHVzbXNnKTsKKyAgICBmZl9hbWZfd3JpdGVfb2JqZWN0X2VuZCgmcHApOworCisgICAgc3BrdC5zaXplID0gcHAgLSBzcGt0LmRhdGE7CisgICAgcmV0ID0gZmZfcnRtcF9wYWNrZXRfd3JpdGUocnQtPnN0cmVhbSwgJnNwa3QsIHJ0LT5vdXRfY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnQtPnByZXZfcGt0WzFdLCAmcnQtPm5iX3ByZXZfcGt0WzFdKTsKKyAgICBmZl9ydG1wX3BhY2tldF9kZXN0cm95KCZzcGt0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9pbnZva2VfcmVzcG9uc2UoVVJMQ29udGV4dCAqcywgUlRNUFBhY2tldCAqcGt0KQoreworICAgIFJUTVBDb250ZXh0ICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBkb3VibGUgc2VxbnVtOworICAgIGNoYXIgZmlsZW5hbWVbNjRdOworICAgIGNoYXIgY29tbWFuZFs2NF07CisgICAgaW50IHN0cmluZ2xlbjsKKyAgICBjaGFyICpwY2hhcjsKKyAgICBjb25zdCB1aW50OF90ICpwID0gcGt0LT5kYXRhOworICAgIHVpbnQ4X3QgKnBwICAgICAgPSBOVUxMOworICAgIFJUTVBQYWNrZXQgc3BrdCAgPSB7IDAgfTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYmM7CisgICAgaW50IHJldDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiYywgcCwgcGt0LT5zaXplKTsKKyAgICBpZiAoZmZfYW1mX3JlYWRfc3RyaW5nKCZnYmMsIGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmdsZW4pKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFcnJvciBpbiBQVF9JTlZPS0VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXQgPSBmZl9hbWZfcmVhZF9udW1iZXIoJmdiYywgJnNlcW51bSk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXQgPSBmZl9hbWZfcmVhZF9udWxsKCZnYmMpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKCFzdHJjbXAoY29tbWFuZCwgIkZDUHVibGlzaCIpIHx8CisgICAgICAgICFzdHJjbXAoY29tbWFuZCwgInB1Ymxpc2giKSkgeworICAgICAgICByZXQgPSBmZl9hbWZfcmVhZF9zdHJpbmcoJmdiYywgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmlsZW5hbWUpLCAmc3RyaW5nbGVuKTsKKyAgICAgICAgLy8gY2hlY2sgd2l0aCB1cmwKKyAgICAgICAgaWYgKHMtPmZpbGVuYW1lKSB7CisgICAgICAgICAgICBwY2hhciA9IHN0cnJjaHIocy0+ZmlsZW5hbWUsICcvJyk7CisgICAgICAgICAgICBpZiAoIXBjaGFyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGZpbmQgLyBpbiB1cmwgJXMsIGJhZCBmb3JtYXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBwY2hhciA9IHMtPmZpbGVuYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGNoYXIrKzsKKyAgICAgICAgICAgIGlmIChzdHJjbXAocGNoYXIsIGZpbGVuYW1lKSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVbmV4cGVjdGVkIHN0cmVhbSAlcywgZXhwZWN0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAiICVzXG4iLCBmaWxlbmFtZSwgcGNoYXIpOworICAgICAgICB9CisgICAgICAgIHJ0LT5zdGF0ZSA9IFNUQVRFX1JFQ0VJVklORzsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcChjb21tYW5kLCAiRkNQdWJsaXNoIikpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnNwa3QsIFJUTVBfU1lTVEVNX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfUFRfSU5WT0tFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX1BLVERBVEFfREVGQVVMVF9TSVpFKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSByZXNwb25zZSBwYWNrZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBwcCA9IHNwa3QuZGF0YTsKKyAgICAgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcHAsICJvbkZDUHVibGlzaCIpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicHVibGlzaCIpKSB7CisgICAgICAgIHJldCA9IHdyaXRlX2JlZ2luKHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgLy8gU2VuZCBvblN0YXR1cyhOZXRTdHJlYW0uUHVibGlzaC5TdGFydCkKKyAgICAgICAgcmV0dXJuIHdyaXRlX3N0YXR1cyhzLCBwa3QsICJOZXRTdHJlYW0uUHVibGlzaC5TdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGF5IikpIHsKKyAgICAgICAgcmV0ID0gd3JpdGVfYmVnaW4ocyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcnQtPnN0YXRlID0gU1RBVEVfU0VORElORzsKKyAgICAgICAgcmV0dXJuIHdyaXRlX3N0YXR1cyhzLCBwa3QsICJOZXRTdHJlYW0uUGxheS5TdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZzcGt0LCBSVE1QX1NZU1RFTV9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX1BUX0lOVk9LRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRNUF9QS1REQVRBX0RFRkFVTFRfU0laRSkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgcmVzcG9uc2UgcGFja2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcHAgPSBzcGt0LmRhdGE7CisgICAgICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnBwLCAiX3Jlc3VsdCIpOworICAgICAgICBmZl9hbWZfd3JpdGVfbnVtYmVyKCZwcCwgc2VxbnVtKTsKKyAgICAgICAgZmZfYW1mX3dyaXRlX251bGwoJnBwKTsKKyAgICAgICAgaWYgKCFzdHJjbXAoY29tbWFuZCwgImNyZWF0ZVN0cmVhbSIpKSB7CisgICAgICAgICAgICBydC0+bmJfc3RyZWFtaWQrKzsKKyAgICAgICAgICAgIGlmIChydC0+bmJfc3RyZWFtaWQgPT0gMCB8fCBydC0+bmJfc3RyZWFtaWQgPT0gMikKKyAgICAgICAgICAgICAgICBydC0+bmJfc3RyZWFtaWQrKzsgLyogVmFsdWVzIDAgYW5kIDIgYXJlIHJlc2VydmVkICovCisgICAgICAgICAgICBmZl9hbWZfd3JpdGVfbnVtYmVyKCZwcCwgcnQtPm5iX3N0cmVhbWlkKTsKKyAgICAgICAgICAgIC8qIEJ5IG5vdyB3ZSBkb24ndCBjb250cm9sIHdoaWNoIHN0cmVhbXMgYXJlIHJlbW92ZWQgaW4KKyAgICAgICAgICAgICAqIGRlbGV0ZVN0cmVhbS4gVGhlcmUgaXMgbm8gc3RyZWFtIGNyZWF0aW9uIGNvbnRyb2wKKyAgICAgICAgICAgICAqIGlmIGEgY2xpZW50IGNyZWF0ZXMgbW9yZSB0aGFuIDJeMzIgLSAyIHN0cmVhbXMuICovCisgICAgICAgIH0KKyAgICB9CisgICAgc3BrdC5zaXplID0gcHAgLSBzcGt0LmRhdGE7CisgICAgcmV0ID0gZmZfcnRtcF9wYWNrZXRfd3JpdGUocnQtPnN0cmVhbSwgJnNwa3QsIHJ0LT5vdXRfY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnQtPnByZXZfcGt0WzFdLCAmcnQtPm5iX3ByZXZfcGt0WzFdKTsKKyAgICBmZl9ydG1wX3BhY2tldF9kZXN0cm95KCZzcGt0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFJlYWQgdGhlIEFNRl9OVU1CRVIgcmVzcG9uc2UgKCJfcmVzdWx0IikgdG8gYSBmdW5jdGlvbiBjYWxsCisgKiAoZS5nLiBjcmVhdGVTdHJlYW0oKSkuIFRoaXMgcmVzcG9uc2Ugc2hvdWxkIGJlIG1hZGUgdXAgb2YgdGhlIEFNRl9TVFJJTkcKKyAqICJyZXN1bHQiLCBhIE5VTEwgb2JqZWN0IGFuZCB0aGVuIHRoZSByZXNwb25zZSBlbmNvZGVkIGFzIEFNRl9OVU1CRVIuIE9uIGEKKyAqIHN1Y2Nlc3NmdWwgcmVzcG9uc2UsIHdlIHdpbGwgcmV0dXJuIHNldCB0aGUgdmFsdWUgdG8gbnVtYmVyIChvdGhlcndpc2UgbnVtYmVyCisgKiB3aWxsIG5vdCBiZSBjaGFuZ2VkKS4KKyAqCisgKiBAcmV0dXJuIDAgaWYgcmVhZGluZyB0aGUgdmFsdWUgc3VjY2VlZHMsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzcworICovCitzdGF0aWMgaW50IHJlYWRfbnVtYmVyX3Jlc3VsdChSVE1QUGFja2V0ICpwa3QsIGRvdWJsZSAqbnVtYmVyKQoreworICAgIC8vIFdlIG9ubHkgbmVlZCB0byBmaXQgIl9yZXN1bHQiIGluIHRoaXMuCisgICAgdWludDhfdCBzdHJidWZmZXJbOF07CisgICAgaW50IHN0cmluZ2xlbjsKKyAgICBkb3VibGUgbnVtYnVmZmVyOworICAgIEdldEJ5dGVDb250ZXh0IGdiYzsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiYywgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworCisgICAgLy8gVmFsdWUgMS80OiAiX3Jlc3VsdCIgYXMgQU1GX1NUUklORworICAgIGlmIChmZl9hbWZfcmVhZF9zdHJpbmcoJmdiYywgc3RyYnVmZmVyLCBzaXplb2Yoc3RyYnVmZmVyKSwgJnN0cmluZ2xlbikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChzdHJjbXAoc3RyYnVmZmVyLCAiX3Jlc3VsdCIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAvLyBWYWx1ZSAyLzQ6IFRoZSBjYWxsZWUgcmVmZXJlbmNlIG51bWJlcgorICAgIGlmIChmZl9hbWZfcmVhZF9udW1iZXIoJmdiYywgJm51bWJ1ZmZlcikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIC8vIFZhbHVlIDMvNDogTnVsbAorICAgIGlmIChmZl9hbWZfcmVhZF9udWxsKCZnYmMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAvLyBWYWx1ZSA0LzQ6IFRoZSByZXNvbnNlIGFzIEFNRl9OVU1CRVIKKyAgICBpZiAoZmZfYW1mX3JlYWRfbnVtYmVyKCZnYmMsICZudW1idWZmZXIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBlbHNlCisgICAgICAgICpudW1iZXIgPSBudW1idWZmZXI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfaW52b2tlX3Jlc3VsdChVUkxDb250ZXh0ICpzLCBSVE1QUGFja2V0ICpwa3QpCit7CisgICAgUlRNUENvbnRleHQgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgKnRyYWNrZWRfbWV0aG9kID0gTlVMTDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmICgocmV0ID0gZmluZF90cmFja2VkX21ldGhvZChzLCBwa3QsIDEwLCAmdHJhY2tlZF9tZXRob2QpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIXRyYWNrZWRfbWV0aG9kKSB7CisgICAgICAgIC8qIElnbm9yZSB0aGlzIHJlcGx5IHdoZW4gdGhlIGN1cnJlbnQgbWV0aG9kIGlzIG5vdCB0cmFja2VkLiAqLworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICghc3RyY21wKHRyYWNrZWRfbWV0aG9kLCAiY29ubmVjdCIpKSB7CisgICAgICAgIGlmICghcnQtPmlzX2lucHV0KSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGdlbl9yZWxlYXNlX3N0cmVhbShzLCBydCkpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gZ2VuX2ZjcHVibGlzaF9zdHJlYW0ocywgcnQpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChyZXQgPSBnZW5fc2VydmVyX2J3KHMsIHJ0KSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gZ2VuX2NyZWF0ZV9zdHJlYW0ocywgcnQpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgaWYgKHJ0LT5pc19pbnB1dCkgeworICAgICAgICAgICAgLyogU2VuZCB0aGUgRkNTdWJzY3JpYmUgY29tbWFuZCB3aGVuIHRoZSBuYW1lIG9mIGxpdmUKKyAgICAgICAgICAgICAqIHN0cmVhbSBpcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIG9yIGlmIGl0J3MgYSBsaXZlIHN0cmVhbS4gKi8KKyAgICAgICAgICAgIGlmIChydC0+c3Vic2NyaWJlKSB7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBnZW5fZmNzdWJzY3JpYmVfc3RyZWFtKHMsIHJ0LCBydC0+c3Vic2NyaWJlKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJ0LT5saXZlID09IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBnZW5fZmNzdWJzY3JpYmVfc3RyZWFtKHMsIHJ0LCBydC0+cGxheXBhdGgpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcCh0cmFja2VkX21ldGhvZCwgImNyZWF0ZVN0cmVhbSIpKSB7CisgICAgICAgIGRvdWJsZSBzdHJlYW1faWQ7CisgICAgICAgIGlmIChyZWFkX251bWJlcl9yZXN1bHQocGt0LCAmc3RyZWFtX2lkKSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5leHBlY3RlZCByZXBseSBvbiBjb25uZWN0KClcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnQtPnN0cmVhbV9pZCA9IHN0cmVhbV9pZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcnQtPmlzX2lucHV0KSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGdlbl9wdWJsaXNoKHMsIHJ0KSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChydC0+bGl2ZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZ2VuX2dldF9zdHJlYW1fbGVuZ3RoKHMsIHJ0KSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHJldCA9IGdlbl9wbGF5KHMsIHJ0KSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZ2VuX2J1ZmZlcl90aW1lKHMsIHJ0KSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcCh0cmFja2VkX21ldGhvZCwgImdldFN0cmVhbUxlbmd0aCIpKSB7CisgICAgICAgIGlmIChyZWFkX251bWJlcl9yZXN1bHQocGt0LCAmcnQtPmR1cmF0aW9uKSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5leHBlY3RlZCByZXBseSBvbiBnZXRTdHJlYW1MZW5ndGgoKVxuIik7CisgICAgICAgIH0KKyAgICB9CisKK2ZhaWw6CisgICAgYXZfZnJlZSh0cmFja2VkX21ldGhvZCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoYW5kbGVfaW52b2tlX3N0YXR1cyhVUkxDb250ZXh0ICpzLCBSVE1QUGFja2V0ICpwa3QpCit7CisgICAgUlRNUENvbnRleHQgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGFfZW5kID0gcGt0LT5kYXRhICsgcGt0LT5zaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IHBrdC0+ZGF0YSArIFJUTVBfSEVBREVSOworICAgIHVpbnQ4X3QgdG1wc3RyWzI1Nl07CisgICAgaW50IGksIHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIHQgPSBmZl9hbWZfdGFnX3NpemUocHRyLCBkYXRhX2VuZCk7CisgICAgICAgIGlmICh0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBwdHIgKz0gdDsKKyAgICB9CisKKyAgICB0ID0gZmZfYW1mX2dldF9maWVsZF92YWx1ZShwdHIsIGRhdGFfZW5kLCAibGV2ZWwiLCB0bXBzdHIsIHNpemVvZih0bXBzdHIpKTsKKyAgICBpZiAoIXQgJiYgIXN0cmNtcCh0bXBzdHIsICJlcnJvciIpKSB7CisgICAgICAgIHQgPSBmZl9hbWZfZ2V0X2ZpZWxkX3ZhbHVlKHB0ciwgZGF0YV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiIsIHRtcHN0ciwgc2l6ZW9mKHRtcHN0cikpOworICAgICAgICBpZiAodCB8fCAhdG1wc3RyWzBdKQorICAgICAgICAgICAgdCA9IGZmX2FtZl9nZXRfZmllbGRfdmFsdWUocHRyLCBkYXRhX2VuZCwgImNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wc3RyLCBzaXplb2YodG1wc3RyKSk7CisgICAgICAgIGlmICghdCkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTZXJ2ZXIgZXJyb3I6ICVzXG4iLCB0bXBzdHIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdCA9IGZmX2FtZl9nZXRfZmllbGRfdmFsdWUocHRyLCBkYXRhX2VuZCwgImNvZGUiLCB0bXBzdHIsIHNpemVvZih0bXBzdHIpKTsKKyAgICBpZiAoIXQgJiYgIXN0cmNtcCh0bXBzdHIsICJOZXRTdHJlYW0uUGxheS5TdGFydCIpKSBydC0+c3RhdGUgPSBTVEFURV9QTEFZSU5HOworICAgIGlmICghdCAmJiAhc3RyY21wKHRtcHN0ciwgIk5ldFN0cmVhbS5QbGF5LlN0b3AiKSkgcnQtPnN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICBpZiAoIXQgJiYgIXN0cmNtcCh0bXBzdHIsICJOZXRTdHJlYW0uUGxheS5VbnB1Ymxpc2hOb3RpZnkiKSkgcnQtPnN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICBpZiAoIXQgJiYgIXN0cmNtcCh0bXBzdHIsICJOZXRTdHJlYW0uUHVibGlzaC5TdGFydCIpKSBydC0+c3RhdGUgPSBTVEFURV9QVUJMSVNISU5HOworICAgIGlmICghdCAmJiAhc3RyY21wKHRtcHN0ciwgIk5ldFN0cmVhbS5TZWVrLk5vdGlmeSIpKSBydC0+c3RhdGUgPSBTVEFURV9QTEFZSU5HOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2ludm9rZShVUkxDb250ZXh0ICpzLCBSVE1QUGFja2V0ICpwa3QpCit7CisgICAgUlRNUENvbnRleHQgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQgPSAwOworCisgICAgLy9UT0RPOiBjaGVjayBmb3IgdGhlIG1lc3NhZ2VzIHNlbnQgZm9yIHdyb25nIHN0YXRlPworICAgIGlmIChmZl9hbWZfbWF0Y2hfc3RyaW5nKHBrdC0+ZGF0YSwgcGt0LT5zaXplLCAiX2Vycm9yIikpIHsKKyAgICAgICAgaWYgKChyZXQgPSBoYW5kbGVfaW52b2tlX2Vycm9yKHMsIHBrdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIGlmIChmZl9hbWZfbWF0Y2hfc3RyaW5nKHBrdC0+ZGF0YSwgcGt0LT5zaXplLCAiX3Jlc3VsdCIpKSB7CisgICAgICAgIGlmICgocmV0ID0gaGFuZGxlX2ludm9rZV9yZXN1bHQocywgcGt0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKGZmX2FtZl9tYXRjaF9zdHJpbmcocGt0LT5kYXRhLCBwa3QtPnNpemUsICJvblN0YXR1cyIpKSB7CisgICAgICAgIGlmICgocmV0ID0gaGFuZGxlX2ludm9rZV9zdGF0dXMocywgcGt0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKGZmX2FtZl9tYXRjaF9zdHJpbmcocGt0LT5kYXRhLCBwa3QtPnNpemUsICJvbkJXRG9uZSIpKSB7CisgICAgICAgIGlmICgocmV0ID0gZ2VuX2NoZWNrX2J3KHMsIHJ0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKGZmX2FtZl9tYXRjaF9zdHJpbmcocGt0LT5kYXRhLCBwa3QtPnNpemUsICJyZWxlYXNlU3RyZWFtIikgfHwKKyAgICAgICAgICAgICAgIGZmX2FtZl9tYXRjaF9zdHJpbmcocGt0LT5kYXRhLCBwa3QtPnNpemUsICJGQ1B1Ymxpc2giKSAgICAgfHwKKyAgICAgICAgICAgICAgIGZmX2FtZl9tYXRjaF9zdHJpbmcocGt0LT5kYXRhLCBwa3QtPnNpemUsICJwdWJsaXNoIikgICAgICAgfHwKKyAgICAgICAgICAgICAgIGZmX2FtZl9tYXRjaF9zdHJpbmcocGt0LT5kYXRhLCBwa3QtPnNpemUsICJwbGF5IikgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgIGZmX2FtZl9tYXRjaF9zdHJpbmcocGt0LT5kYXRhLCBwa3QtPnNpemUsICJfY2hlY2tidyIpICAgICAgfHwKKyAgICAgICAgICAgICAgIGZmX2FtZl9tYXRjaF9zdHJpbmcocGt0LT5kYXRhLCBwa3QtPnNpemUsICJjcmVhdGVTdHJlYW0iKSkgeworICAgICAgICBpZiAoKHJldCA9IHNlbmRfaW52b2tlX3Jlc3BvbnNlKHMsIHBrdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1cGRhdGVfb2Zmc2V0KFJUTVBDb250ZXh0ICpydCwgaW50IHNpemUpCit7CisgICAgaW50IG9sZF9mbHZfc2l6ZTsKKworICAgIC8vIGdlbmVyYXRlIHBhY2tldCBoZWFkZXIgYW5kIHB1dCBkYXRhIGludG8gYnVmZmVyIGZvciBGTFYgZGVtdXhlcgorICAgIGlmIChydC0+Zmx2X29mZiA8IHJ0LT5mbHZfc2l6ZSkgeworICAgICAgICAvLyBUaGVyZSBpcyBvbGQgdW5yZWFkIGRhdGEgaW4gdGhlIGJ1ZmZlciwgdGh1cyBhcHBlbmQgYXQgdGhlIGVuZAorICAgICAgICBvbGRfZmx2X3NpemUgID0gcnQtPmZsdl9zaXplOworICAgICAgICBydC0+Zmx2X3NpemUgKz0gc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBbGwgZGF0YSBoYXMgYmVlbiByZWFkLCB3cml0ZSB0aGUgbmV3IGRhdGEgYXQgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIKKyAgICAgICAgb2xkX2Zsdl9zaXplID0gMDsKKyAgICAgICAgcnQtPmZsdl9zaXplID0gc2l6ZTsKKyAgICAgICAgcnQtPmZsdl9vZmYgID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkX2Zsdl9zaXplOworfQorCitzdGF0aWMgaW50IGFwcGVuZF9mbHZfZGF0YShSVE1QQ29udGV4dCAqcnQsIFJUTVBQYWNrZXQgKnBrdCwgaW50IHNraXApCit7CisgICAgaW50IG9sZF9mbHZfc2l6ZSwgcmV0OworICAgIFB1dEJ5dGVDb250ZXh0IHBiYzsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gcGt0LT5kYXRhICsgc2tpcDsKKyAgICBjb25zdCBpbnQgc2l6ZSAgICAgID0gcGt0LT5zaXplIC0gc2tpcDsKKyAgICB1aW50MzJfdCB0cyAgICAgICAgID0gcGt0LT50aW1lc3RhbXA7CisKKyAgICBpZiAocGt0LT50eXBlID09IFJUTVBfUFRfQVVESU8pIHsKKyAgICAgICAgcnQtPmhhc19hdWRpbyA9IDE7CisgICAgfSBlbHNlIGlmIChwa3QtPnR5cGUgPT0gUlRNUF9QVF9WSURFTykgeworICAgICAgICBydC0+aGFzX3ZpZGVvID0gMTsKKyAgICB9CisKKyAgICBvbGRfZmx2X3NpemUgPSB1cGRhdGVfb2Zmc2V0KHJ0LCBzaXplICsgMTUpOworCisgICAgaWYgKChyZXQgPSBhdl9yZWFsbG9jcCgmcnQtPmZsdl9kYXRhLCBydC0+Zmx2X3NpemUpKSA8IDApIHsKKyAgICAgICAgcnQtPmZsdl9zaXplID0gcnQtPmZsdl9vZmYgPSAwOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBieXRlc3RyZWFtMl9pbml0X3dyaXRlcigmcGJjLCBydC0+Zmx2X2RhdGEsIHJ0LT5mbHZfc2l6ZSk7CisgICAgYnl0ZXN0cmVhbTJfc2tpcF9wKCZwYmMsIG9sZF9mbHZfc2l6ZSk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiYywgcGt0LT50eXBlKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfYmUyNCgmcGJjLCBzaXplKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfYmUyNCgmcGJjLCB0cyk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiYywgdHMgPj4gMjQpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTI0KCZwYmMsIDApOworICAgIGJ5dGVzdHJlYW0yX3B1dF9idWZmZXIoJnBiYywgZGF0YSwgc2l6ZSk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMzIoJnBiYywgMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfbm90aWZ5KFVSTENvbnRleHQgKnMsIFJUTVBQYWNrZXQgKnBrdCkKK3sKKyAgICBSVE1QQ29udGV4dCAqcnQgID0gcy0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgY29tbWFuZGJ1ZmZlcls2NF07CisgICAgY2hhciBzdGF0dXNtc2dbMTI4XTsKKyAgICBpbnQgc3RyaW5nbGVuLCByZXQsIHNraXAgPSAwOworICAgIEdldEJ5dGVDb250ZXh0IGdiYzsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiYywgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIGlmIChmZl9hbWZfcmVhZF9zdHJpbmcoJmdiYywgY29tbWFuZGJ1ZmZlciwgc2l6ZW9mKGNvbW1hbmRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmluZ2xlbikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKCFzdHJjbXAoY29tbWFuZGJ1ZmZlciwgIm9uTWV0YURhdGEiKSkgeworICAgICAgICAvLyBtZXRhZGF0YSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBtaXhlZCBhcnJheQorICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiYykgPT0gQU1GX0RBVEFfVFlQRV9NSVhFREFSUkFZKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIGEgbWV0YURhdGEgQXJyYXkgc28gZmx2IGNhbiBkZXRlcm1pbmUgdGhlIHN0cmVhbXMKKyAgICAgICAgICAgIC8vIGZyb20gdGhpcy4KKyAgICAgICAgICAgIHJ0LT5yZWNlaXZlZF9tZXRhZGF0YSA9IDE7CisgICAgICAgICAgICAvLyBza2lwIDMyLWJpdCBtYXggYXJyYXkgaW5kZXgKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiYywgNCk7CisgICAgICAgICAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiYykgPiAzKSB7CisgICAgICAgICAgICAgICAgaWYgKGZmX2FtZl9nZXRfc3RyaW5nKCZnYmMsIHN0YXR1c21zZywgc2l6ZW9mKHN0YXR1c21zZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmdsZW4pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgY2FyZSBhYm91dCB0aGUgY29udGVudCBvZiB0aGUgcHJvcGVydHkgKHlldCkuCisgICAgICAgICAgICAgICAgc3RyaW5nbGVuID0gZmZfYW1mX3RhZ19zaXplKGdiYy5idWZmZXIsIGdiYy5idWZmZXJfZW5kKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nbGVuIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2JjLCBzdHJpbmdsZW4pOworCisgICAgICAgICAgICAgICAgLy8gVGhlIHByZXNlbmNlIG9mIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAvLyByZXNwZWN0aXZlIHN0cmVhbXMgYXJlIHByZXNlbnQuCisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoc3RhdHVzbXNnLCAidmlkZW9jb2RlY2lkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcnQtPmhhc192aWRlbyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHN0YXR1c21zZywgImF1ZGlvY29kZWNpZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJ0LT5oYXNfYXVkaW8gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYmUyNCgmZ2JjKSAhPSBBTUZfRU5EX09GX09CSkVDVCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNraXAgdGhlIEBzZXREYXRhRnJhbWUgc3RyaW5nIGFuZCB2YWxpZGF0ZSBpdCBpcyBhIG5vdGlmaWNhdGlvbgorICAgIGlmICghc3RyY21wKGNvbW1hbmRidWZmZXIsICJAc2V0RGF0YUZyYW1lIikpIHsKKyAgICAgICAgc2tpcCA9IGdiYy5idWZmZXIgLSBwa3QtPmRhdGE7CisgICAgICAgIHJldCA9IGZmX2FtZl9yZWFkX3N0cmluZygmZ2JjLCBzdGF0dXNtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RhdHVzbXNnKSwgJnN0cmluZ2xlbik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIGFwcGVuZF9mbHZfZGF0YShydCwgcGt0LCBza2lwKTsKK30KKworLyoqCisgKiBQYXJzZSByZWNlaXZlZCBwYWNrZXQgYW5kIHBvc3NpYmx5IHBlcmZvcm0gc29tZSBhY3Rpb24gZGVwZW5kaW5nIG9uCisgKiB0aGUgcGFja2V0IGNvbnRlbnRzLgorICogQHJldHVybiAwIGZvciBubyBlcnJvcnMsIG5lZ2F0aXZlIHZhbHVlcyBmb3Igc2VyaW91cyBlcnJvcnMgd2hpY2ggcHJldmVudAorICogICAgICAgICBmdXJ0aGVyIGNvbW11bmljYXRpb25zLCBwb3NpdGl2ZSB2YWx1ZXMgZm9yIHVuY3JpdGljYWwgZXJyb3JzCisgKi8KK3N0YXRpYyBpbnQgcnRtcF9wYXJzZV9yZXN1bHQoVVJMQ29udGV4dCAqcywgUlRNUENvbnRleHQgKnJ0LCBSVE1QUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldDsKKworI2lmZGVmIERFQlVHCisgICAgZmZfcnRtcF9wYWNrZXRfZHVtcChzLCBwa3QpOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKHBrdC0+dHlwZSkgeworICAgIGNhc2UgUlRNUF9QVF9CWVRFU19SRUFEOgorICAgICAgICBhdl9kbG9nKHMsICJyZWNlaXZlZCBieXRlcyByZWFkIHJlcG9ydFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlRNUF9QVF9DSFVOS19TSVpFOgorICAgICAgICBpZiAoKHJldCA9IGhhbmRsZV9jaHVua19zaXplKHMsIHBrdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlRNUF9QVF9QSU5HOgorICAgICAgICBpZiAoKHJldCA9IGhhbmRsZV9waW5nKHMsIHBrdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlRNUF9QVF9DTElFTlRfQlc6CisgICAgICAgIGlmICgocmV0ID0gaGFuZGxlX2NsaWVudF9idyhzLCBwa3QpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJUTVBfUFRfU0VSVkVSX0JXOgorICAgICAgICBpZiAoKHJldCA9IGhhbmRsZV9zZXJ2ZXJfYncocywgcGt0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSVE1QX1BUX0lOVk9LRToKKyAgICAgICAgaWYgKChyZXQgPSBoYW5kbGVfaW52b2tlKHMsIHBrdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlRNUF9QVF9WSURFTzoKKyAgICBjYXNlIFJUTVBfUFRfQVVESU86CisgICAgY2FzZSBSVE1QX1BUX01FVEFEQVRBOgorICAgIGNhc2UgUlRNUF9QVF9OT1RJRlk6CisgICAgICAgIC8qIEF1ZGlvLCBWaWRlbyBhbmQgTWV0YWRhdGEgcGFja2V0cyBhcmUgcGFyc2VkIGluIGdldF9wYWNrZXQoKSAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJVbmtub3duIHBhY2tldCB0eXBlIHJlY2VpdmVkIDB4JTAyWFxuIiwgcGt0LT50eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9tZXRhZGF0YShSVE1QQ29udGV4dCAqcnQsIFJUTVBQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0LCBvbGRfZmx2X3NpemUsIHR5cGU7CisgICAgY29uc3QgdWludDhfdCAqbmV4dDsKKyAgICB1aW50OF90ICpwOworICAgIHVpbnQzMl90IHNpemU7CisgICAgdWludDMyX3QgdHMsIGN0cywgcHRzID0gMDsKKworICAgIG9sZF9mbHZfc2l6ZSA9IHVwZGF0ZV9vZmZzZXQocnQsIHBrdC0+c2l6ZSk7CisKKyAgICBpZiAoKHJldCA9IGF2X3JlYWxsb2NwKCZydC0+Zmx2X2RhdGEsIHJ0LT5mbHZfc2l6ZSkpIDwgMCkgeworICAgICAgICBydC0+Zmx2X3NpemUgPSBydC0+Zmx2X29mZiA9IDA7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgbmV4dCA9IHBrdC0+ZGF0YTsKKyAgICBwICAgID0gcnQtPmZsdl9kYXRhICsgb2xkX2Zsdl9zaXplOworCisgICAgLyogY29weSBkYXRhIHdoaWxlIHJld3JpdGluZyB0aW1lc3RhbXBzICovCisgICAgdHMgPSBwa3QtPnRpbWVzdGFtcDsKKworICAgIHdoaWxlIChuZXh0IC0gcGt0LT5kYXRhIDwgcGt0LT5zaXplIC0gUlRNUF9IRUFERVIpIHsKKyAgICAgICAgdHlwZSA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJm5leHQpOworICAgICAgICBzaXplID0gYnl0ZXN0cmVhbV9nZXRfYmUyNCgmbmV4dCk7CisgICAgICAgIGN0cyAgPSBieXRlc3RyZWFtX2dldF9iZTI0KCZuZXh0KTsKKyAgICAgICAgY3RzIHw9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJm5leHQpIDw8IDI0OworICAgICAgICBpZiAoIXB0cykKKyAgICAgICAgICAgIHB0cyA9IGN0czsKKyAgICAgICAgdHMgKz0gY3RzIC0gcHRzOworICAgICAgICBwdHMgPSBjdHM7CisgICAgICAgIGlmIChzaXplICsgMyArIDQgPiBwa3QtPmRhdGEgKyBwa3QtPnNpemUgLSBuZXh0KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIHR5cGUpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTI0KCZwLCBzaXplKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUyNCgmcCwgdHMpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCB0cyA+PiAyNCk7CisgICAgICAgIG1lbWNweShwLCBuZXh0LCBzaXplICsgMyArIDQpOworICAgICAgICBuZXh0ICs9IHNpemUgKyAzICsgNDsKKyAgICAgICAgcCAgICArPSBzaXplICsgMyArIDQ7CisgICAgfQorICAgIGlmIChwICE9IHJ0LT5mbHZfZGF0YSArIHJ0LT5mbHZfc2l6ZSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJJbmNvbXBsZXRlIGZsdiBwYWNrZXRzIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUlRNUF9QVF9NRVRBREFUQSBwYWNrZXRcbiIpOworICAgICAgICBydC0+Zmx2X3NpemUgPSBwIC0gcnQtPmZsdl9kYXRhOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEludGVyYWN0IHdpdGggdGhlIHNlcnZlciBieSByZWNlaXZpbmcgYW5kIHNlbmRpbmcgUlRNUCBwYWNrZXRzIHVudGlsCisgKiB0aGVyZSBpcyBzb21lIHNpZ25pZmljYW50IGRhdGEgKG1lZGlhIGRhdGEgb3IgZXhwZWN0ZWQgc3RhdHVzIG5vdGlmaWNhdGlvbikuCisgKgorICogQHBhcmFtIHMgICAgICAgICAgcmVhZGluZyBjb250ZXh0CisgKiBAcGFyYW0gZm9yX2hlYWRlciBub24temVybyB2YWx1ZSB0ZWxscyBmdW5jdGlvbiB0byB3b3JrIHVudGlsIGl0CisgKiBnZXRzIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBzZXJ2ZXIgdGhhdCBwbGF5aW5nIGhhcyBiZWVuIHN0YXJ0ZWQsCisgKiBvdGhlcndpc2UgZnVuY3Rpb24gd2lsbCB3b3JrIHVudGlsIHNvbWUgbWVkaWEgZGF0YSBpcyByZWNlaXZlZCAob3IKKyAqIGFuIGVycm9yIGhhcHBlbnMpCisgKiBAcmV0dXJuIDAgZm9yIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLCBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3BhY2tldChVUkxDb250ZXh0ICpzLCBpbnQgZm9yX2hlYWRlcikKK3sKKyAgICBSVE1QQ29udGV4dCAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmIChydC0+c3RhdGUgPT0gU1RBVEVfU1RPUFBFRCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgZm9yICg7OykgeworICAgICAgICBSVE1QUGFja2V0IHJwa3QgPSB7IDAgfTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9yZWFkKHJ0LT5zdHJlYW0sICZycGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQtPmluX2NodW5rX3NpemUsICZydC0+cHJldl9wa3RbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnQtPm5iX3ByZXZfcGt0WzBdKSkgPD0gMCkgeworICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyYWNrIHRpbWVzdGFtcCBmb3IgbGF0ZXIgdXNlCisgICAgICAgIHJ0LT5sYXN0X3RpbWVzdGFtcCA9IHJwa3QudGltZXN0YW1wOworCisgICAgICAgIHJ0LT5ieXRlc19yZWFkICs9IHJldDsKKyAgICAgICAgaWYgKHJ0LT5ieXRlc19yZWFkIC0gcnQtPmxhc3RfYnl0ZXNfcmVhZCA+IHJ0LT5jbGllbnRfcmVwb3J0X3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJTZW5kaW5nIGJ5dGVzIHJlYWQgcmVwb3J0XG4iKTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZ2VuX2J5dGVzX3JlYWQocywgcnQsIHJwa3QudGltZXN0YW1wICsgMSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcnQtPmxhc3RfYnl0ZXNfcmVhZCA9IHJ0LT5ieXRlc19yZWFkOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gcnRtcF9wYXJzZV9yZXN1bHQocywgcnQsICZycGt0KTsKKworICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIG11c3QgY2hlY2sgaWYgd2UgYXJlIGluIHRoZSBzZWVrIHN0YXRlIGFuZCBjb250aW51ZQorICAgICAgICAvLyB3aXRoIHRoZSBuZXh0IHBhY2tldC4gaGFuZGxlX2ludm9rZSB3aWxsIGdldCB1cyBvdXQgb2YgdGhpcyBzdGF0ZQorICAgICAgICAvLyB3aGVuIHRoZSByaWdodCBtZXNzYWdlIGlzIGVuY291bnRlcmVkCisgICAgICAgIGlmIChydC0+c3RhdGUgPT0gU1RBVEVfU0VFS0lORykgeworICAgICAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcnBrdCk7CisgICAgICAgICAgICAvLyBXZSBjb250aW51ZSwgbGV0IHRoZSBuYXR1cmFsIGZsb3cgb2YgdGhpbmdzIGhhcHBlbjoKKyAgICAgICAgICAgIC8vIEFWRVJST1IoRUFHQUlOKSBvciBoYW5kbGVfaW52b2tlIGdldHMgdXMgb3V0IG9mIGhlcmUKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldCA8IDApIHsvL3NlcmlvdXMgZXJyb3IgaW4gY3VycmVudCBwYWNrZXQKKyAgICAgICAgICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnJwa3QpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAocnQtPmRvX3JlY29ubmVjdCAmJiBmb3JfaGVhZGVyKSB7CisgICAgICAgICAgICBmZl9ydG1wX3BhY2tldF9kZXN0cm95KCZycGt0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChydC0+c3RhdGUgPT0gU1RBVEVfU1RPUFBFRCkgeworICAgICAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcnBrdCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcl9oZWFkZXIgJiYgKHJ0LT5zdGF0ZSA9PSBTVEFURV9QTEFZSU5HICAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBydC0+c3RhdGUgPT0gU1RBVEVfUFVCTElTSElORyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQtPnN0YXRlID09IFNUQVRFX1NFTkRJTkcgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0LT5zdGF0ZSA9PSBTVEFURV9SRUNFSVZJTkcpKSB7CisgICAgICAgICAgICBmZl9ydG1wX3BhY2tldF9kZXN0cm95KCZycGt0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghcnBrdC5zaXplIHx8ICFydC0+aXNfaW5wdXQpIHsKKyAgICAgICAgICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnJwa3QpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJwa3QudHlwZSA9PSBSVE1QX1BUX1ZJREVPIHx8IHJwa3QudHlwZSA9PSBSVE1QX1BUX0FVRElPKSB7CisgICAgICAgICAgICByZXQgPSBhcHBlbmRfZmx2X2RhdGEocnQsICZycGt0LCAwKTsKKyAgICAgICAgICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnJwa3QpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIGlmIChycGt0LnR5cGUgPT0gUlRNUF9QVF9OT1RJRlkpIHsKKyAgICAgICAgICAgIHJldCA9IGhhbmRsZV9ub3RpZnkocywgJnJwa3QpOworICAgICAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcnBrdCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgaWYgKHJwa3QudHlwZSA9PSBSVE1QX1BUX01FVEFEQVRBKSB7CisgICAgICAgICAgICByZXQgPSBoYW5kbGVfbWV0YWRhdGEocnQsICZycGt0KTsKKyAgICAgICAgICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnJwa3QpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcnBrdCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHJ0bXBfY2xvc2UoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBSVE1QQ29udGV4dCAqcnQgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldCA9IDAsIGksIGo7CisKKyAgICBpZiAoIXJ0LT5pc19pbnB1dCkgeworICAgICAgICBydC0+Zmx2X2RhdGEgPSBOVUxMOworICAgICAgICBpZiAocnQtPm91dF9wa3Quc2l6ZSkKKyAgICAgICAgICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnJ0LT5vdXRfcGt0KTsKKyAgICAgICAgaWYgKHJ0LT5zdGF0ZSA+IFNUQVRFX0ZDUFVCTElTSCkKKyAgICAgICAgICAgIHJldCA9IGdlbl9mY3VucHVibGlzaF9zdHJlYW0oaCwgcnQpOworICAgIH0KKyAgICBpZiAocnQtPnN0YXRlID4gU1RBVEVfSEFORFNIQUtFRCkKKyAgICAgICAgcmV0ID0gZ2VuX2RlbGV0ZV9zdHJlYW0oaCwgcnQpOworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHJ0LT5uYl9wcmV2X3BrdFtpXTsgaisrKQorICAgICAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcnQtPnByZXZfcGt0W2ldW2pdKTsKKyAgICAgICAgYXZfZnJlZXAoJnJ0LT5wcmV2X3BrdFtpXSk7CisgICAgfQorCisgICAgZnJlZV90cmFja2VkX21ldGhvZHMocnQpOworICAgIGF2X2ZyZWVwKCZydC0+Zmx2X2RhdGEpOworICAgIGZmdXJsX2Nsb3NlKHJ0LT5zdHJlYW0pOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogSW5zZXJ0IGEgZmFrZSBvbk1ldGFkYXRhIHBhY2tldCBpbnRvIHRoZSBGTFYgc3RyZWFtIHRvIG5vdGlmeSB0aGUgRkxWCisgKiBkZW11eGVyIGFib3V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgc3RyZWFtLgorICoKKyAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSBpZiB0aGVyZSB3YXMgbm8gcmVhbCBvbk1ldGFkYXRhIHBhY2tldCBzZW50IGJ5IHRoZQorICogc2VydmVyIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyZWFtIGFuZCBpZiB3ZSB3ZXJlIGFibGUgdG8gcmV0cmlldmUgYSB2YWxpZAorICogZHVyYXRpb24gdmlhIGEgZ2V0U3RyZWFtTGVuZ3RoIGNhbGwuCisgKgorICogQHJldHVybiAwIGZvciBzdWNjZXNzZnVsIG9wZXJhdGlvbiwgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvcgorICovCitzdGF0aWMgaW50IGluamVjdF9mYWtlX2R1cmF0aW9uX21ldGFkYXRhKFJUTVBDb250ZXh0ICpydCkKK3sKKyAgICAvLyBXZSBuZWVkIHRvIGluc2VydCB0aGUgbWV0ZGF0YSBwYWNrZXQgZGlyZWN0bHkgYWZ0ZXIgdGhlIEZMVgorICAgIC8vIGhlYWRlciwgaS5lLiB3ZSBuZWVkIHRvIG1vdmUgYWxsIG90aGVyIGFscmVhZHkgcmVhZCBkYXRhIGJ5IHRoZQorICAgIC8vIHNpemUgb2Ygb3VyIGZha2UgbWV0YWRhdGEgcGFja2V0LgorCisgICAgdWludDhfdCogcDsKKyAgICAvLyBLZWVwIG9sZCBmbHZfZGF0YSBwb2ludGVyCisgICAgdWludDhfdCogb2xkX2Zsdl9kYXRhID0gcnQtPmZsdl9kYXRhOworICAgIC8vIEFsbG9jYXRlIGEgbmV3IGZsdl9kYXRhIHBvaW50ZXIgd2l0aCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBhZGRpdGlvbmFsIHBhY2thZ2UKKyAgICBpZiAoIShydC0+Zmx2X2RhdGEgPSBhdl9tYWxsb2MocnQtPmZsdl9zaXplICsgNTUpKSkgeworICAgICAgICBydC0+Zmx2X2RhdGEgPSBvbGRfZmx2X2RhdGE7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLy8gQ29weSBGTFYgaGVhZGVyCisgICAgbWVtY3B5KHJ0LT5mbHZfZGF0YSwgb2xkX2Zsdl9kYXRhLCAxMyk7CisgICAgLy8gQ29weSByZW1haW5pbmcgcGFja2V0cworICAgIG1lbWNweShydC0+Zmx2X2RhdGEgKyAxMyArIDU1LCBvbGRfZmx2X2RhdGEgKyAxMywgcnQtPmZsdl9zaXplIC0gMTMpOworICAgIC8vIEluY3JlYXNlIHRoZSBzaXplIGJ5IHRoZSBpbmplY3RlZCBwYWNrZXQKKyAgICBydC0+Zmx2X3NpemUgKz0gNTU7CisgICAgLy8gRGVsZXRlIHRoZSBvbGQgRkxWIGRhdGEKKyAgICBhdl9mcmVlKG9sZF9mbHZfZGF0YSk7CisKKyAgICBwID0gcnQtPmZsdl9kYXRhICsgMTM7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgRkxWX1RBR19UWVBFX01FVEEpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMjQoJnAsIDQwKTsgLy8gc2l6ZSBvZiBkYXRhIHBhcnQgKHN1bSBvZiBhbGwgcGFydHMgYmVsb3cpCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUyNCgmcCwgMCk7ICAvLyB0aW1lc3RhbXAKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwLCAwKTsgIC8vIHJlc2VydmVkCisKKyAgICAvLyBmaXJzdCBldmVudCBuYW1lIGFzIGEgc3RyaW5nCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgQU1GX0RBVEFfVFlQRV9TVFJJTkcpOworICAgIC8vICJvbk1ldGFEYXRhIiBhcyBBTUYgc3RyaW5nCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcCwgMTApOworICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmcCwgIm9uTWV0YURhdGEiLCAxMCk7CisKKyAgICAvLyBtaXhlZCBhcnJheSAoaGFzaCkgd2l0aCBzaXplIGFuZCBzdHJpbmcvdHlwZS9kYXRhIHR1cGxlcworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIEFNRl9EQVRBX1RZUEVfTUlYRURBUlJBWSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcCwgMSk7IC8vIG1ldGFkYXRhX2NvdW50CisKKyAgICAvLyAiZHVyYXRpb24iIGFzIEFNRiBzdHJpbmcKKyAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZwLCA4KTsKKyAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnAsICJkdXJhdGlvbiIsIDgpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIEFNRl9EQVRBX1RZUEVfTlVNQkVSKTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTY0KCZwLCBhdl9kb3VibGUyaW50KHJ0LT5kdXJhdGlvbikpOworCisgICAgLy8gRmluYWxpc2Ugb2JqZWN0CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcCwgMCk7IC8vIEVtcHR5IHN0cmluZworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIEFNRl9FTkRfT0ZfT0JKRUNUKTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwLCA0MCk7IC8vIHNpemUgb2YgZGF0YSBwYXJ0IChzdW0gb2YgYWxsIHBhcnRzIGJlbG93KQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogT3BlbiBSVE1QIGNvbm5lY3Rpb24gYW5kIHZlcmlmeSB0aGF0IHRoZSBzdHJlYW0gY2FuIGJlIHBsYXllZC4KKyAqCisgKiBVUkwgc3ludGF4OiBydG1wOi8vc2VydmVyWzpwb3J0XVsvYXBwXVsvcGxheXBhdGhdCisgKiAgICAgICAgICAgICB3aGVyZSAnYXBwJyBpcyBmaXJzdCBvbmUgb3IgdHdvIGRpcmVjdG9yaWVzIGluIHRoZSBwYXRoCisgKiAgICAgICAgICAgICAoZS5nLiAvb25kZW1hbmQvLCAvZmxhc2gvbGl2ZS8sIGV0Yy4pCisgKiAgICAgICAgICAgICBhbmQgJ3BsYXlwYXRoJyBpcyBhIGZpbGUgbmFtZSAodGhlIHJlc3Qgb2YgdGhlIHBhdGgsCisgKiAgICAgICAgICAgICBtYXkgYmUgcHJlZml4ZWQgd2l0aCAibXA0OiIpCisgKi8KK3N0YXRpYyBpbnQgcnRtcF9vcGVuKFVSTENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzKQoreworICAgIFJUTVBDb250ZXh0ICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBjaGFyIHByb3RvWzhdLCBob3N0bmFtZVsyNTZdLCBwYXRoWzEwMjRdLCBhdXRoWzEwMF0sICpmbmFtZTsKKyAgICBjaGFyICpvbGRfYXBwLCAqcW1hcmssICpuLCBmbmFtZV9idWZmZXJbMTAyNF07CisgICAgdWludDhfdCBidWZbMjA0OF07CisgICAgaW50IHBvcnQ7CisgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHJ0LT5saXN0ZW5fdGltZW91dCA+IDApCisgICAgICAgIHJ0LT5saXN0ZW4gPSAxOworCisgICAgcnQtPmlzX2lucHV0ID0gIShmbGFncyAmIEFWSU9fRkxBR19XUklURSk7CisKKyAgICBhdl91cmxfc3BsaXQocHJvdG8sIHNpemVvZihwcm90byksIGF1dGgsIHNpemVvZihhdXRoKSwKKyAgICAgICAgICAgICAgICAgaG9zdG5hbWUsIHNpemVvZihob3N0bmFtZSksICZwb3J0LAorICAgICAgICAgICAgICAgICBwYXRoLCBzaXplb2YocGF0aCksIHMtPmZpbGVuYW1lKTsKKworICAgIG4gPSBzdHJjaHIocGF0aCwgJyAnKTsKKyAgICBpZiAobikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiRGV0ZWN0ZWQgbGlicnRtcCBzdHlsZSBVUkwgcGFyYW1ldGVycywgdGhlc2UgYXJlbid0IHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAiYnkgdGhlIGxpYmF2Zm9ybWF0IGludGVybmFsIFJUTVAgaGFuZGxlciBjdXJyZW50bHkgZW5hYmxlZC4gIgorICAgICAgICAgICAgICAgIlNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGNvcnJlY3Qgd2F5IHRvIHBhc3MgcGFyYW1ldGVycy5cbiIpOworICAgICAgICAqbiA9ICdcMCc7IC8vIFRyaW0gbm90IHN1cHBvcnRlZCBwYXJ0CisgICAgfQorCisgICAgaWYgKGF1dGhbMF0pIHsKKyAgICAgICAgY2hhciAqcHRyID0gc3RyY2hyKGF1dGgsICc6Jyk7CisgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICpwdHIgPSAnXDAnOworICAgICAgICAgICAgYXZfc3RybGNweShydC0+dXNlcm5hbWUsIGF1dGgsIHNpemVvZihydC0+dXNlcm5hbWUpKTsKKyAgICAgICAgICAgIGF2X3N0cmxjcHkocnQtPnBhc3N3b3JkLCBwdHIgKyAxLCBzaXplb2YocnQtPnBhc3N3b3JkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocnQtPmxpc3RlbiAmJiBzdHJjbXAocHJvdG8sICJydG1wIikpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInJ0bXBfbGlzdGVuIG5vdCBhdmFpbGFibGUgZm9yICVzXG4iLAorICAgICAgICAgICAgICAgcHJvdG8pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoIXN0cmNtcChwcm90bywgInJ0bXB0IikgfHwgIXN0cmNtcChwcm90bywgInJ0bXB0cyIpKSB7CisgICAgICAgIGlmICghc3RyY21wKHByb3RvLCAicnRtcHRzIikpCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgImZmcnRtcGh0dHBfdGxzIiwgIjEiLCAxKTsKKworICAgICAgICAvKiBvcGVuIHRoZSBodHRwIHR1bm5lbGluZyBjb25uZWN0aW9uICovCisgICAgICAgIGZmX3VybF9qb2luKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJmZnJ0bXBodHRwIiwgTlVMTCwgaG9zdG5hbWUsIHBvcnQsIE5VTEwpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChwcm90bywgInJ0bXBzIikpIHsKKyAgICAgICAgLyogb3BlbiB0aGUgdGxzIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgaWYgKHBvcnQgPCAwKQorICAgICAgICAgICAgcG9ydCA9IFJUTVBTX0RFRkFVTFRfUE9SVDsKKyAgICAgICAgZmZfdXJsX2pvaW4oYnVmLCBzaXplb2YoYnVmKSwgInRscyIsIE5VTEwsIGhvc3RuYW1lLCBwb3J0LCBOVUxMKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAocHJvdG8sICJydG1wZSIpIHx8ICghc3RyY21wKHByb3RvLCAicnRtcHRlIikpKSB7CisgICAgICAgIGlmICghc3RyY21wKHByb3RvLCAicnRtcHRlIikpCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgImZmcnRtcGNyeXB0X3R1bm5lbGluZyIsICIxIiwgMSk7CisKKyAgICAgICAgLyogb3BlbiB0aGUgZW5jcnlwdGVkIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgZmZfdXJsX2pvaW4oYnVmLCBzaXplb2YoYnVmKSwgImZmcnRtcGNyeXB0IiwgTlVMTCwgaG9zdG5hbWUsIHBvcnQsIE5VTEwpOworICAgICAgICBydC0+ZW5jcnlwdGVkID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBvcGVuIHRoZSB0Y3AgY29ubmVjdGlvbiAqLworICAgICAgICBpZiAocG9ydCA8IDApCisgICAgICAgICAgICBwb3J0ID0gUlRNUF9ERUZBVUxUX1BPUlQ7CisgICAgICAgIGlmIChydC0+bGlzdGVuKQorICAgICAgICAgICAgZmZfdXJsX2pvaW4oYnVmLCBzaXplb2YoYnVmKSwgInRjcCIsIE5VTEwsIGhvc3RuYW1lLCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIj9saXN0ZW4mbGlzdGVuX3RpbWVvdXQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgcnQtPmxpc3Rlbl90aW1lb3V0ICogMTAwMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZmX3VybF9qb2luKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0Y3AiLCBOVUxMLCBob3N0bmFtZSwgcG9ydCwgTlVMTCk7CisgICAgfQorCityZWNvbm5lY3Q6CisgICAgaWYgKChyZXQgPSBmZnVybF9vcGVuKCZydC0+c3RyZWFtLCBidWYsIEFWSU9fRkxBR19SRUFEX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCAmb3B0cykpIDwgMCkgeworICAgICAgICBhdl9sb2cocyAsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBvcGVuIGNvbm5lY3Rpb24gJXNcbiIsIGJ1Zik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAocnQtPnN3ZnZlcmlmeSkgeworICAgICAgICBpZiAoKHJldCA9IHJ0bXBfY2FsY19zd2ZoYXNoKHMpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcnQtPnN0YXRlID0gU1RBVEVfU1RBUlQ7CisgICAgaWYgKCFydC0+bGlzdGVuICYmIChyZXQgPSBydG1wX2hhbmRzaGFrZShzLCBydCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmIChydC0+bGlzdGVuICYmIChyZXQgPSBydG1wX3NlcnZlcl9oYW5kc2hha2UocywgcnQpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJ0LT5vdXRfY2h1bmtfc2l6ZSA9IDEyODsKKyAgICBydC0+aW5fY2h1bmtfc2l6ZSAgPSAxMjg7IC8vIFByb2JhYmx5IG92ZXJ3cml0dGVuIGxhdGVyCisgICAgcnQtPnN0YXRlID0gU1RBVEVfSEFORFNIQUtFRDsKKworICAgIC8vIEtlZXAgdGhlIGFwcGxpY2F0aW9uIG5hbWUgd2hlbiBpdCBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSB1c2VyLgorICAgIG9sZF9hcHAgPSBydC0+YXBwOworCisgICAgcnQtPmFwcCA9IGF2X21hbGxvYyhBUFBfTUFYX0xFTkdUSCk7CisgICAgaWYgKCFydC0+YXBwKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8vZXh0cmFjdCAiYXBwIiBwYXJ0IGZyb20gcGF0aAorICAgIHFtYXJrID0gc3RyY2hyKHBhdGgsICc/Jyk7CisgICAgaWYgKHFtYXJrICYmIHN0cnN0cihxbWFyaywgInNsaXN0PSIpKSB7CisgICAgICAgIGNoYXIqIGFtcDsKKyAgICAgICAgLy8gQWZ0ZXIgc2xpc3Qgd2UgaGF2ZSB0aGUgcGxheXBhdGgsIGJlZm9yZSB0aGUgcGFyYW1zLCB0aGUgYXBwCisgICAgICAgIGF2X3N0cmxjcHkocnQtPmFwcCwgcGF0aCArIDEsIEZGTUlOKHFtYXJrIC0gcGF0aCwgQVBQX01BWF9MRU5HVEgpKTsKKyAgICAgICAgZm5hbWUgPSBzdHJzdHIocGF0aCwgInNsaXN0PSIpICsgNjsKKyAgICAgICAgLy8gU3RyaXAgYW55IGZ1cnRoZXIgcXVlcnkgcGFyYW1ldGVycyBmcm9tIGZuYW1lCisgICAgICAgIGFtcCA9IHN0cmNocihmbmFtZSwgJyYnKTsKKyAgICAgICAgaWYgKGFtcCkgeworICAgICAgICAgICAgYXZfc3RybGNweShmbmFtZV9idWZmZXIsIGZuYW1lLCBGRk1JTihhbXAgLSBmbmFtZSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbmFtZV9idWZmZXIpKSk7CisgICAgICAgICAgICBmbmFtZSA9IGZuYW1lX2J1ZmZlcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAocGF0aCwgIi9vbmRlbWFuZC8iLCAxMCkpIHsKKyAgICAgICAgZm5hbWUgPSBwYXRoICsgMTA7CisgICAgICAgIG1lbWNweShydC0+YXBwLCAib25kZW1hbmQiLCA5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyICpuZXh0ID0gKnBhdGggPyBwYXRoICsgMSA6IHBhdGg7CisgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIobmV4dCwgJy8nKTsKKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICBpZiAob2xkX2FwcCkgeworICAgICAgICAgICAgICAgIC8vIElmIG5hbWUgb2YgYXBwbGljYXRpb24gaGFzIGJlZW4gZGVmaW5lZCBieSB0aGUgdXNlciwgYXNzdW1lIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBwbGF5cGF0aCBpcyBwcm92aWRlZCBpbiB0aGUgVVJMCisgICAgICAgICAgICAgICAgZm5hbWUgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbmFtZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgYXZfc3RybGNweShydC0+YXBwLCBuZXh0LCBBUFBfTUFYX0xFTkdUSCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG8gbm90IG1pc21hdGNoIGEgcGxheXBhdGggZm9yIGFuIGFwcGxpY2F0aW9uIGluc3RhbmNlCisgICAgICAgICAgICBjaGFyICpjID0gc3RyY2hyKHAgKyAxLCAnOicpOworICAgICAgICAgICAgZm5hbWUgPSBzdHJjaHIocCArIDEsICcvJyk7CisgICAgICAgICAgICBpZiAoIWZuYW1lIHx8IChjICYmIGMgPCBmbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBmbmFtZSA9IHAgKyAxOworICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkocnQtPmFwcCwgcGF0aCArIDEsIEZGTUlOKHAgLSBwYXRoLCBBUFBfTUFYX0xFTkdUSCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbmFtZSsrOworICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkocnQtPmFwcCwgcGF0aCArIDEsIEZGTUlOKGZuYW1lIC0gcGF0aCAtIDEsIEFQUF9NQVhfTEVOR1RIKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob2xkX2FwcCkgeworICAgICAgICAvLyBUaGUgbmFtZSBvZiBhcHBsaWNhdGlvbiBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSB1c2VyLCBvdmVycmlkZSBpdC4KKyAgICAgICAgaWYgKHN0cmxlbihvbGRfYXBwKSA+PSBBUFBfTUFYX0xFTkdUSCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWUocnQtPmFwcCk7CisgICAgICAgIHJ0LT5hcHAgPSBvbGRfYXBwOworICAgIH0KKworICAgIGlmICghcnQtPnBsYXlwYXRoKSB7CisgICAgICAgIHJ0LT5wbGF5cGF0aCA9IGF2X21hbGxvYyhQTEFZUEFUSF9NQVhfTEVOR1RIKTsKKyAgICAgICAgaWYgKCFydC0+cGxheXBhdGgpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbmFtZSkgeworICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbihmbmFtZSk7CisgICAgICAgICAgICBpZiAoIXN0cmNocihmbmFtZSwgJzonKSAmJiBsZW4gPj0gNCAmJgorICAgICAgICAgICAgICAgICghc3RyY21wKGZuYW1lICsgbGVuIC0gNCwgIi5mNHYiKSB8fAorICAgICAgICAgICAgICAgICAhc3RyY21wKGZuYW1lICsgbGVuIC0gNCwgIi5tcDQiKSkpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkocnQtPnBsYXlwYXRoLCAibXA0OiIsIDUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobGVuID49IDQgJiYgIXN0cmNtcChmbmFtZSArIGxlbiAtIDQsICIuZmx2IikpCisgICAgICAgICAgICAgICAgICAgIGZuYW1lW2xlbiAtIDRdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBydC0+cGxheXBhdGhbMF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfc3RybGNhdChydC0+cGxheXBhdGgsIGZuYW1lLCBQTEFZUEFUSF9NQVhfTEVOR1RIKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ0LT5wbGF5cGF0aFswXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXJ0LT50Y3VybCkgeworICAgICAgICBydC0+dGN1cmwgPSBhdl9tYWxsb2MoVENVUkxfTUFYX0xFTkdUSCk7CisgICAgICAgIGlmICghcnQtPnRjdXJsKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgZmZfdXJsX2pvaW4ocnQtPnRjdXJsLCBUQ1VSTF9NQVhfTEVOR1RILCBwcm90bywgTlVMTCwgaG9zdG5hbWUsCisgICAgICAgICAgICAgICAgICAgIHBvcnQsICIvJXMiLCBydC0+YXBwKTsKKyAgICB9CisKKyAgICBpZiAoIXJ0LT5mbGFzaHZlcikgeworICAgICAgICBydC0+Zmxhc2h2ZXIgPSBhdl9tYWxsb2MoRkxBU0hWRVJfTUFYX0xFTkdUSCk7CisgICAgICAgIGlmICghcnQtPmZsYXNodmVyKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ0LT5pc19pbnB1dCkgeworICAgICAgICAgICAgc25wcmludGYocnQtPmZsYXNodmVyLCBGTEFTSFZFUl9NQVhfTEVOR1RILCAiJXMgJWQsJWQsJWQsJWQiLAorICAgICAgICAgICAgICAgICAgICBSVE1QX0NMSUVOVF9QTEFURk9STSwgUlRNUF9DTElFTlRfVkVSMSwgUlRNUF9DTElFTlRfVkVSMiwKKyAgICAgICAgICAgICAgICAgICAgUlRNUF9DTElFTlRfVkVSMywgUlRNUF9DTElFTlRfVkVSNCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihydC0+Zmxhc2h2ZXIsIEZMQVNIVkVSX01BWF9MRU5HVEgsCisgICAgICAgICAgICAgICAgICAgICJGTUxFLzMuMCAoY29tcGF0aWJsZTsgJXMpIiwgTElCQVZGT1JNQVRfSURFTlQpOworICAgICAgICB9CisgICAgfQorCisgICAgcnQtPmNsaWVudF9yZXBvcnRfc2l6ZSA9IDEwNDg1NzY7CisgICAgcnQtPmJ5dGVzX3JlYWQgPSAwOworICAgIHJ0LT5oYXNfYXVkaW8gPSAwOworICAgIHJ0LT5oYXNfdmlkZW8gPSAwOworICAgIHJ0LT5yZWNlaXZlZF9tZXRhZGF0YSA9IDA7CisgICAgcnQtPmxhc3RfYnl0ZXNfcmVhZCA9IDA7CisgICAgcnQtPnNlcnZlcl9idyA9IDI1MDAwMDA7CisgICAgcnQtPmR1cmF0aW9uID0gMDsKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJQcm90byA9ICVzLCBwYXRoID0gJXMsIGFwcCA9ICVzLCBmbmFtZSA9ICVzXG4iLAorICAgICAgICAgICBwcm90bywgcGF0aCwgcnQtPmFwcCwgcnQtPnBsYXlwYXRoKTsKKyAgICBpZiAoIXJ0LT5saXN0ZW4pIHsKKyAgICAgICAgaWYgKChyZXQgPSBnZW5fY29ubmVjdChzLCBydCkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHJldCA9IHJlYWRfY29ubmVjdChzLCBzLT5wcml2X2RhdGEpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZG8geworICAgICAgICByZXQgPSBnZXRfcGFja2V0KHMsIDEpOworICAgIH0gd2hpbGUgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAocnQtPmRvX3JlY29ubmVjdCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZmZ1cmxfY2xvc2UocnQtPnN0cmVhbSk7CisgICAgICAgIHJ0LT5zdHJlYW0gICAgICAgPSBOVUxMOworICAgICAgICBydC0+ZG9fcmVjb25uZWN0ID0gMDsKKyAgICAgICAgcnQtPm5iX2ludm9rZXMgICA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICBtZW1zZXQocnQtPnByZXZfcGt0W2ldLCAwLAorICAgICAgICAgICAgICAgICAgIHNpemVvZigqKnJ0LT5wcmV2X3BrdCkgKiBydC0+bmJfcHJldl9wa3RbaV0pOworICAgICAgICBmcmVlX3RyYWNrZWRfbWV0aG9kcyhydCk7CisgICAgICAgIGdvdG8gcmVjb25uZWN0OworICAgIH0KKworICAgIGlmIChydC0+aXNfaW5wdXQpIHsKKyAgICAgICAgLy8gZ2VuZXJhdGUgRkxWIGhlYWRlciBmb3IgZGVtdXhlcgorICAgICAgICBydC0+Zmx2X3NpemUgPSAxMzsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9yZWFsbG9jcCgmcnQtPmZsdl9kYXRhLCBydC0+Zmx2X3NpemUpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHJ0LT5mbHZfb2ZmICA9IDA7CisgICAgICAgIG1lbWNweShydC0+Zmx2X2RhdGEsICJGTFZcMVwwXDBcMFwwXDAxMVwwXDBcMFwwIiwgcnQtPmZsdl9zaXplKTsKKworICAgICAgICAvLyBSZWFkIHBhY2tldHMgdW50aWwgd2UgcmVhY2ggdGhlIGZpcnN0IEEvViBwYWNrZXQgb3IgcmVhZCBtZXRhZGF0YS4KKyAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgbWV0YWRhdGEgcGFja2FnZSBpbiBmcm9udCBvZiB0aGUgQS9WIHBhY2tldHMsIHdlIGNhbgorICAgICAgICAvLyBidWlsZCB0aGUgRkxWIGhlYWRlciBmcm9tIHRoaXMuIElmIHdlIGRvIG5vdCByZWNlaXZlIGFueSBtZXRhZGF0YSwKKyAgICAgICAgLy8gdGhlIEZMViBkZWNvZGVyIHdpbGwgYWxsb2NhdGUgdGhlIG5lZWRlZCBzdHJlYW1zIHdoZW4gdGhlaXIgZmlyc3QKKyAgICAgICAgLy8gYXVkaW8gb3IgdmlkZW8gcGFja2V0IGFycml2ZXMuCisgICAgICAgIHdoaWxlICghcnQtPmhhc19hdWRpbyAmJiAhcnQtPmhhc192aWRlbyAmJiAhcnQtPnJlY2VpdmVkX21ldGFkYXRhKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGdldF9wYWNrZXQocywgMCkpIDwgMCkKKyAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVpdGhlciBhZnRlciB3ZSBoYXZlIHJlYWQgdGhlIG1ldGFkYXRhIG9yIChpZiB0aGVyZSBpcyBub25lKSB0aGUKKyAgICAgICAgLy8gZmlyc3QgcGFja2V0IG9mIGFuIEEvViBzdHJlYW0sIHdlIGhhdmUgYSBiZXR0ZXIga25vd2xlZGdlIGFib3V0IHRoZQorICAgICAgICAvLyBzdHJlYW1zLCBzbyBzZXQgdGhlIEZMViBoZWFkZXIgYWNjb3JkaW5nbHkuCisgICAgICAgIGlmIChydC0+aGFzX2F1ZGlvKSB7CisgICAgICAgICAgICBydC0+Zmx2X2RhdGFbNF0gfD0gRkxWX0hFQURFUl9GTEFHX0hBU0FVRElPOworICAgICAgICB9CisgICAgICAgIGlmIChydC0+aGFzX3ZpZGVvKSB7CisgICAgICAgICAgICBydC0+Zmx2X2RhdGFbNF0gfD0gRkxWX0hFQURFUl9GTEFHX0hBU1ZJREVPOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgcmVjZWl2ZWQgdGhlIGZpcnN0IHBhY2tldCBvZiBhbiBBL1Ygc3RyZWFtIGFuZCBubyBtZXRhZGF0YSBidXQKKyAgICAgICAgLy8gdGhlIHNlcnZlciByZXR1cm5lZCBhIHZhbGlkIGR1cmF0aW9uLCBjcmVhdGUgYSBmYWtlIG1ldGFkYXRhIHBhY2tldAorICAgICAgICAvLyB0byBpbmZvcm0gdGhlIEZMViBkZWNvZGVyIGFib3V0IHRoZSBkdXJhdGlvbi4KKyAgICAgICAgaWYgKCFydC0+cmVjZWl2ZWRfbWV0YWRhdGEgJiYgcnQtPmR1cmF0aW9uID4gMCkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBpbmplY3RfZmFrZV9kdXJhdGlvbl9tZXRhZGF0YShydCkpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBydC0+Zmx2X3NpemUgPSAwOworICAgICAgICBydC0+Zmx2X2RhdGEgPSBOVUxMOworICAgICAgICBydC0+Zmx2X29mZiAgPSAwOworICAgICAgICBydC0+c2tpcF9ieXRlcyA9IDEzOworICAgIH0KKworICAgIHMtPm1heF9wYWNrZXRfc2l6ZSA9IHJ0LT5zdHJlYW0tPm1heF9wYWNrZXRfc2l6ZTsKKyAgICBzLT5pc19zdHJlYW1lZCAgICAgPSAxOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CisgICAgcnRtcF9jbG9zZShzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0bXBfcmVhZChVUkxDb250ZXh0ICpzLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFJUTVBDb250ZXh0ICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgb3JpZ19zaXplID0gc2l6ZTsKKyAgICBpbnQgcmV0OworCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGludCBkYXRhX2xlZnQgPSBydC0+Zmx2X3NpemUgLSBydC0+Zmx2X29mZjsKKworICAgICAgICBpZiAoZGF0YV9sZWZ0ID49IHNpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShidWYsIHJ0LT5mbHZfZGF0YSArIHJ0LT5mbHZfb2ZmLCBzaXplKTsKKyAgICAgICAgICAgIHJ0LT5mbHZfb2ZmICs9IHNpemU7CisgICAgICAgICAgICByZXR1cm4gb3JpZ19zaXplOworICAgICAgICB9CisgICAgICAgIGlmIChkYXRhX2xlZnQgPiAwKSB7CisgICAgICAgICAgICBtZW1jcHkoYnVmLCBydC0+Zmx2X2RhdGEgKyBydC0+Zmx2X29mZiwgZGF0YV9sZWZ0KTsKKyAgICAgICAgICAgIGJ1ZiAgKz0gZGF0YV9sZWZ0OworICAgICAgICAgICAgc2l6ZSAtPSBkYXRhX2xlZnQ7CisgICAgICAgICAgICBydC0+Zmx2X29mZiA9IHJ0LT5mbHZfc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiBkYXRhX2xlZnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBnZXRfcGFja2V0KHMsIDApKSA8IDApCisgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBvcmlnX3NpemU7Cit9CisKK3N0YXRpYyBpbnQ2NF90IHJ0bXBfc2VlayhVUkxDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgUlRNUENvbnRleHQgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgIlNlZWsgb24gc3RyZWFtIGluZGV4ICVkIGF0IHRpbWVzdGFtcCAlIlBSSWQ2NCIgd2l0aCBmbGFncyAlMDh4XG4iLAorICAgICAgICAgICBzdHJlYW1faW5kZXgsIHRpbWVzdGFtcCwgZmxhZ3MpOworICAgIGlmICgocmV0ID0gZ2VuX3NlZWsocywgcnQsIHRpbWVzdGFtcCkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZW5kIHNlZWsgY29tbWFuZCBvbiBzdHJlYW0gaW5kZXggJWQgYXQgdGltZXN0YW1wICIKKyAgICAgICAgICAgICAgICIlIlBSSWQ2NCIgd2l0aCBmbGFncyAlMDh4XG4iLAorICAgICAgICAgICAgICAgc3RyZWFtX2luZGV4LCB0aW1lc3RhbXAsIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcnQtPmZsdl9vZmYgPSBydC0+Zmx2X3NpemU7CisgICAgcnQtPnN0YXRlID0gU1RBVEVfU0VFS0lORzsKKyAgICByZXR1cm4gdGltZXN0YW1wOworfQorCitzdGF0aWMgaW50IHJ0bXBfcGF1c2UoVVJMQ29udGV4dCAqcywgaW50IHBhdXNlKQoreworICAgIFJUTVBDb250ZXh0ICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJQYXVzZSBhdCB0aW1lc3RhbXAgJWRcbiIsCisgICAgICAgICAgIHJ0LT5sYXN0X3RpbWVzdGFtcCk7CisgICAgaWYgKChyZXQgPSBnZW5fcGF1c2UocywgcnQsIHBhdXNlLCBydC0+bGFzdF90aW1lc3RhbXApKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBzZW5kIHBhdXNlIGNvbW1hbmQgYXQgdGltZXN0YW1wICVkXG4iLAorICAgICAgICAgICAgICAgcnQtPmxhc3RfdGltZXN0YW1wKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRtcF93cml0ZShVUkxDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFJUTVBDb250ZXh0ICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgc2l6ZV90ZW1wID0gc2l6ZTsKKyAgICBpbnQgcGt0c2l6ZSwgcGt0dHlwZSwgY29weTsKKyAgICB1aW50MzJfdCB0czsKKyAgICBjb25zdCB1aW50OF90ICpidWZfdGVtcCA9IGJ1ZjsKKyAgICB1aW50OF90IGM7CisgICAgaW50IHJldDsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKHJ0LT5za2lwX2J5dGVzKSB7CisgICAgICAgICAgICBpbnQgc2tpcCA9IEZGTUlOKHJ0LT5za2lwX2J5dGVzLCBzaXplX3RlbXApOworICAgICAgICAgICAgYnVmX3RlbXAgICAgICAgKz0gc2tpcDsKKyAgICAgICAgICAgIHNpemVfdGVtcCAgICAgIC09IHNraXA7CisgICAgICAgICAgICBydC0+c2tpcF9ieXRlcyAtPSBza2lwOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocnQtPmZsdl9oZWFkZXJfYnl0ZXMgPCBSVE1QX0hFQURFUikgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaGVhZGVyID0gcnQtPmZsdl9oZWFkZXI7CisgICAgICAgICAgICBpbnQgY2hhbm5lbCA9IFJUTVBfQVVESU9fQ0hBTk5FTDsKKworICAgICAgICAgICAgY29weSA9IEZGTUlOKFJUTVBfSEVBREVSIC0gcnQtPmZsdl9oZWFkZXJfYnl0ZXMsIHNpemVfdGVtcCk7CisgICAgICAgICAgICBieXRlc3RyZWFtX2dldF9idWZmZXIoJmJ1Zl90ZW1wLCBydC0+Zmx2X2hlYWRlciArIHJ0LT5mbHZfaGVhZGVyX2J5dGVzLCBjb3B5KTsKKyAgICAgICAgICAgIHJ0LT5mbHZfaGVhZGVyX2J5dGVzICs9IGNvcHk7CisgICAgICAgICAgICBzaXplX3RlbXAgICAgICAgICAgICAtPSBjb3B5OworICAgICAgICAgICAgaWYgKHJ0LT5mbHZfaGVhZGVyX2J5dGVzIDwgUlRNUF9IRUFERVIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHBrdHR5cGUgPSBieXRlc3RyZWFtX2dldF9ieXRlKCZoZWFkZXIpOworICAgICAgICAgICAgcGt0c2l6ZSA9IGJ5dGVzdHJlYW1fZ2V0X2JlMjQoJmhlYWRlcik7CisgICAgICAgICAgICB0cyA9IGJ5dGVzdHJlYW1fZ2V0X2JlMjQoJmhlYWRlcik7CisgICAgICAgICAgICB0cyB8PSBieXRlc3RyZWFtX2dldF9ieXRlKCZoZWFkZXIpIDw8IDI0OworICAgICAgICAgICAgYnl0ZXN0cmVhbV9nZXRfYmUyNCgmaGVhZGVyKTsKKyAgICAgICAgICAgIHJ0LT5mbHZfc2l6ZSA9IHBrdHNpemU7CisKKyAgICAgICAgICAgIGlmIChwa3R0eXBlID09IFJUTVBfUFRfVklERU8pCisgICAgICAgICAgICAgICAgY2hhbm5lbCA9IFJUTVBfVklERU9fQ0hBTk5FTDsKKworICAgICAgICAgICAgaWYgKCgocGt0dHlwZSA9PSBSVE1QX1BUX1ZJREVPIHx8IHBrdHR5cGUgPT0gUlRNUF9QVF9BVURJTykgJiYgdHMgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICBwa3R0eXBlID09IFJUTVBfUFRfTk9USUZZKSB7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9ydG1wX2NoZWNrX2FsbG9jX2FycmF5KCZydC0+cHJldl9wa3RbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZydC0+bmJfcHJldl9wa3RbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgLy8gRm9yY2Ugc2VuZGluZyBhIGZ1bGwgMTIgYnl0ZXMgaGVhZGVyIGJ5IGNsZWFyaW5nIHRoZQorICAgICAgICAgICAgICAgIC8vIGNoYW5uZWwgaWQsIHRvIG1ha2UgaXQgbm90IG1hdGNoIGEgcG90ZW50aWFsIGVhcmxpZXIKKyAgICAgICAgICAgICAgICAvLyBwYWNrZXQgaW4gdGhlIHNhbWUgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICBydC0+cHJldl9wa3RbMV1bY2hhbm5lbF0uY2hhbm5lbF9pZCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vdGhpcyBjYW4gYmUgYSBiaWcgcGFja2V0LCBpdCdzIGJldHRlciB0byBzZW5kIGl0IHJpZ2h0IGhlcmUKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZydC0+b3V0X3BrdCwgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdHR5cGUsIHRzLCBwa3RzaXplKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIHJ0LT5vdXRfcGt0LmV4dHJhID0gcnQtPnN0cmVhbV9pZDsKKyAgICAgICAgICAgIHJ0LT5mbHZfZGF0YSA9IHJ0LT5vdXRfcGt0LmRhdGE7CisgICAgICAgIH0KKworICAgICAgICBjb3B5ID0gRkZNSU4ocnQtPmZsdl9zaXplIC0gcnQtPmZsdl9vZmYsIHNpemVfdGVtcCk7CisgICAgICAgIGJ5dGVzdHJlYW1fZ2V0X2J1ZmZlcigmYnVmX3RlbXAsIHJ0LT5mbHZfZGF0YSArIHJ0LT5mbHZfb2ZmLCBjb3B5KTsKKyAgICAgICAgcnQtPmZsdl9vZmYgKz0gY29weTsKKyAgICAgICAgc2l6ZV90ZW1wICAgLT0gY29weTsKKworICAgICAgICBpZiAocnQtPmZsdl9vZmYgPT0gcnQtPmZsdl9zaXplKSB7CisgICAgICAgICAgICBydC0+c2tpcF9ieXRlcyA9IDQ7CisKKyAgICAgICAgICAgIGlmIChydC0+b3V0X3BrdC50eXBlID09IFJUTVBfUFRfTk9USUZZKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIG9uTWV0YURhdGEgYW5kIHxSdG1wU2FtcGxlQWNjZXNzIHBhY2tldHMsIHdlIHdhbnQKKyAgICAgICAgICAgICAgICAvLyBAc2V0RGF0YUZyYW1lIHByZXBlbmRlZCB0byB0aGUgcGFja2V0IGJlZm9yZSBpdCBnZXRzIHNlbnQuCisgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgbm90IGFsbCBSVE1QX1BUX05PVElGWSBwYWNrZXRzIChlLmcuLCBvblRleHREYXRhCisgICAgICAgICAgICAgICAgLy8gYW5kIG9uQ3VlUG9pbnQpLgorICAgICAgICAgICAgICAgIHVpbnQ4X3QgY29tbWFuZGJ1ZmZlcls2NF07CisgICAgICAgICAgICAgICAgaW50IHN0cmluZ2xlbiA9IDA7CisgICAgICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgZ2JjOworCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCBydC0+Zmx2X2RhdGEsIHJ0LT5mbHZfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFmZl9hbWZfcmVhZF9zdHJpbmcoJmdiYywgY29tbWFuZGJ1ZmZlciwgc2l6ZW9mKGNvbW1hbmRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmdsZW4pKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGNvbW1hbmRidWZmZXIsICJvbk1ldGFEYXRhIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoY29tbWFuZGJ1ZmZlciwgInxSdG1wU2FtcGxlQWNjZXNzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZfcmVhbGxvY3AoJnJ0LT5vdXRfcGt0LmRhdGEsIHJ0LT5vdXRfcGt0LnNpemUgKyAxNikpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0LT5mbHZfc2l6ZSA9IHJ0LT5mbHZfb2ZmID0gcnQtPmZsdl9oZWFkZXJfYnl0ZXMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKHJ0LT5vdXRfcGt0LmRhdGEgKyAxNiwgcnQtPm91dF9wa3QuZGF0YSwgcnQtPm91dF9wa3Quc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBydC0+b3V0X3BrdC5zaXplICs9IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcnQtPm91dF9wa3QuZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnB0ciwgIkBzZXREYXRhRnJhbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChyZXQgPSBydG1wX3NlbmRfcGFja2V0KHJ0LCAmcnQtPm91dF9wa3QsIDApKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHJ0LT5mbHZfc2l6ZSA9IDA7CisgICAgICAgICAgICBydC0+Zmx2X29mZiA9IDA7CisgICAgICAgICAgICBydC0+Zmx2X2hlYWRlcl9ieXRlcyA9IDA7CisgICAgICAgICAgICBydC0+Zmx2X25iX3BhY2tldHMrKzsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGJ1Zl90ZW1wIC0gYnVmIDwgc2l6ZSk7CisKKyAgICBpZiAocnQtPmZsdl9uYl9wYWNrZXRzIDwgcnQtPmZsdXNoX2ludGVydmFsKQorICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICBydC0+Zmx2X25iX3BhY2tldHMgPSAwOworCisgICAgLyogc2V0IHN0cmVhbSBpbnRvIG5vbmJsb2NraW5nIG1vZGUgKi8KKyAgICBydC0+c3RyZWFtLT5mbGFncyB8PSBBVklPX0ZMQUdfTk9OQkxPQ0s7CisKKyAgICAvKiB0cnkgdG8gcmVhZCBvbmUgYnl0ZSBmcm9tIHRoZSBzdHJlYW0gKi8KKyAgICByZXQgPSBmZnVybF9yZWFkKHJ0LT5zdHJlYW0sICZjLCAxKTsKKworICAgIC8qIHN3aXRjaCB0aGUgc3RyZWFtIGJhY2sgaW50byBibG9ja2luZyBtb2RlICovCisgICAgcnQtPnN0cmVhbS0+ZmxhZ3MgJj0gfkFWSU9fRkxBR19OT05CTE9DSzsKKworICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgIC8qIG5vIGluY29taW5nIGRhdGEgdG8gaGFuZGxlICovCisgICAgICAgIHJldHVybiBzaXplOworICAgIH0gZWxzZSBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSBpZiAocmV0ID09IDEpIHsKKyAgICAgICAgUlRNUFBhY2tldCBycGt0ID0geyAwIH07CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9yZWFkX2ludGVybmFsKHJ0LT5zdHJlYW0sICZycGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQtPmluX2NodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnQtPnByZXZfcGt0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJ0LT5uYl9wcmV2X3BrdFswXSwgYykpIDw9IDApCisgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAoKHJldCA9IHJ0bXBfcGFyc2VfcmVzdWx0KHMsIHJ0LCAmcnBrdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcnBrdCk7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFJUTVBDb250ZXh0LCB4KQorI2RlZmluZSBERUMgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KKyNkZWZpbmUgRU5DIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBydG1wX29wdGlvbnNbXSA9IHsKKyAgICB7InJ0bXBfYXBwIiwgIk5hbWUgb2YgYXBwbGljYXRpb24gdG8gY29ubmVjdCB0byBvbiB0aGUgUlRNUCBzZXJ2ZXIiLCBPRkZTRVQoYXBwKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEwgfSwgMCwgMCwgREVDfEVOQ30sCisgICAgeyJydG1wX2J1ZmZlciIsICJTZXQgYnVmZmVyIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBUaGUgZGVmYXVsdCBpcyAzMDAwLiIsIE9GRlNFVChjbGllbnRfYnVmZmVyX3RpbWUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMzAwMH0sIDAsIElOVF9NQVgsIERFQ3xFTkN9LAorICAgIHsicnRtcF9jb25uIiwgIkFwcGVuZCBhcmJpdHJhcnkgQU1GIGRhdGEgdG8gdGhlIENvbm5lY3QgbWVzc2FnZSIsIE9GRlNFVChjb25uKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEwgfSwgMCwgMCwgREVDfEVOQ30sCisgICAgeyJydG1wX2ZsYXNodmVyIiwgIlZlcnNpb24gb2YgdGhlIEZsYXNoIHBsdWdpbiB1c2VkIHRvIHJ1biB0aGUgU1dGIHBsYXllci4iLCBPRkZTRVQoZmxhc2h2ZXIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTCB9LCAwLCAwLCBERUN8RU5DfSwKKyAgICB7InJ0bXBfZmx1c2hfaW50ZXJ2YWwiLCAiTnVtYmVyIG9mIHBhY2tldHMgZmx1c2hlZCBpbiB0aGUgc2FtZSByZXF1ZXN0IChSVE1QVCBvbmx5KS4iLCBPRkZTRVQoZmx1c2hfaW50ZXJ2YWwpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMTB9LCAwLCBJTlRfTUFYLCBFTkN9LAorICAgIHsicnRtcF9saXZlIiwgIlNwZWNpZnkgdGhhdCB0aGUgbWVkaWEgaXMgYSBsaXZlIHN0cmVhbS4iLCBPRkZTRVQobGl2ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMn0sIElOVF9NSU4sIElOVF9NQVgsIERFQywgInJ0bXBfbGl2ZSJ9LAorICAgIHsiYW55IiwgImJvdGgiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAtMn0sIDAsIDAsIERFQywgInJ0bXBfbGl2ZSJ9LAorICAgIHsibGl2ZSIsICJsaXZlIHN0cmVhbSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IC0xfSwgMCwgMCwgREVDLCAicnRtcF9saXZlIn0sCisgICAgeyJyZWNvcmRlZCIsICJyZWNvcmRlZCBzdHJlYW0iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAwfSwgMCwgMCwgREVDLCAicnRtcF9saXZlIn0sCisgICAgeyJydG1wX3BhZ2V1cmwiLCAiVVJMIG9mIHRoZSB3ZWIgcGFnZSBpbiB3aGljaCB0aGUgbWVkaWEgd2FzIGVtYmVkZGVkLiBCeSBkZWZhdWx0IG5vIHZhbHVlIHdpbGwgYmUgc2VudC4iLCBPRkZTRVQocGFnZXVybCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIERFQ30sCisgICAgeyJydG1wX3BsYXlwYXRoIiwgIlN0cmVhbSBpZGVudGlmaWVyIHRvIHBsYXkgb3IgdG8gcHVibGlzaCIsIE9GRlNFVChwbGF5cGF0aCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIERFQ3xFTkN9LAorICAgIHsicnRtcF9zdWJzY3JpYmUiLCAiTmFtZSBvZiBsaXZlIHN0cmVhbSB0byBzdWJzY3JpYmUgdG8uIERlZmF1bHRzIHRvIHJ0bXBfcGxheXBhdGguIiwgT0ZGU0VUKHN1YnNjcmliZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIERFQ30sCisgICAgeyJydG1wX3N3Zmhhc2giLCAiU0hBMjU2IGhhc2ggb2YgdGhlIGRlY29tcHJlc3NlZCBTV0YgZmlsZSAoMzIgYnl0ZXMpLiIsIE9GRlNFVChzd2ZoYXNoKSwgQVZfT1BUX1RZUEVfQklOQVJZLCAuZmxhZ3MgPSBERUN9LAorICAgIHsicnRtcF9zd2ZzaXplIiwgIlNpemUgb2YgdGhlIGRlY29tcHJlc3NlZCBTV0YgZmlsZSwgcmVxdWlyZWQgZm9yIFNXRlZlcmlmaWNhdGlvbi4iLCBPRkZTRVQoc3dmc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgREVDfSwKKyAgICB7InJ0bXBfc3dmdXJsIiwgIlVSTCBvZiB0aGUgU1dGIHBsYXllci4gQnkgZGVmYXVsdCBubyB2YWx1ZSB3aWxsIGJlIHNlbnQiLCBPRkZTRVQoc3dmdXJsKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEwgfSwgMCwgMCwgREVDfEVOQ30sCisgICAgeyJydG1wX3N3ZnZlcmlmeSIsICJVUkwgdG8gcGxheWVyIHN3ZiBmaWxlLCBjb21wdXRlIGhhc2gvc2l6ZSBhdXRvbWF0aWNhbGx5LiIsIE9GRlNFVChzd2Z2ZXJpZnkpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTCB9LCAwLCAwLCBERUN9LAorICAgIHsicnRtcF90Y3VybCIsICJVUkwgb2YgdGhlIHRhcmdldCBzdHJlYW0uIERlZmF1bHRzIHRvIHByb3RvOi8vaG9zdFs6cG9ydF0vYXBwLiIsIE9GRlNFVCh0Y3VybCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIERFQ3xFTkN9LAorICAgIHsicnRtcF9saXN0ZW4iLCAiTGlzdGVuIGZvciBpbmNvbWluZyBydG1wIGNvbm5lY3Rpb25zIiwgT0ZGU0VUKGxpc3RlbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgSU5UX01JTiwgSU5UX01BWCwgREVDLCAicnRtcF9saXN0ZW4iIH0sCisgICAgeyJsaXN0ZW4iLCAgICAgICJMaXN0ZW4gZm9yIGluY29taW5nIHJ0bXAgY29ubmVjdGlvbnMiLCBPRkZTRVQobGlzdGVuKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCBJTlRfTUlOLCBJTlRfTUFYLCBERUMsICJydG1wX2xpc3RlbiIgfSwKKyAgICB7InRpbWVvdXQiLCAiTWF4aW11bSB0aW1lb3V0IChpbiBzZWNvbmRzKSB0byB3YWl0IGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4gLTEgaXMgaW5maW5pdGUuIEltcGxpZXMgLXJ0bXBfbGlzdGVuIDEiLCAgT0ZGU0VUKGxpc3Rlbl90aW1lb3V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgSU5UX01JTiwgSU5UX01BWCwgREVDLCAicnRtcF9saXN0ZW4iIH0sCisgICAgeyBOVUxMIH0sCit9OworCisjZGVmaW5lIFJUTVBfUFJPVE9DT0woZmxhdm9yKSAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IEFWQ2xhc3MgZmxhdm9yIyNfY2xhc3MgPSB7ICAgICAgICAgIFwKKyAgICAuY2xhc3NfbmFtZSA9ICNmbGF2b3IsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwgICAgICAgICAgXAorICAgIC5vcHRpb24gICAgID0gcnRtcF9vcHRpb25zLCAgICAgICAgICAgICAgICAgIFwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwgICAgICAgICBcCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1VSTFByb3RvY29sIGZmXyMjZmxhdm9yIyNfcHJvdG9jb2wgPSB7ICAgICAgICAgICBcCisgICAgLm5hbWUgICAgICAgICAgID0gI2ZsYXZvciwgICAgICAgICAgICAgICAgICAgXAorICAgIC51cmxfb3BlbiAgICAgICA9IHJ0bXBfb3BlbiwgICAgICAgICAgICAgICAgIFwKKyAgICAudXJsX3JlYWQgICAgICAgPSBydG1wX3JlYWQsICAgICAgICAgICAgICAgICBcCisgICAgLnVybF9yZWFkX3NlZWsgID0gcnRtcF9zZWVrLCAgICAgICAgICAgICAgICAgXAorICAgIC51cmxfcmVhZF9wYXVzZSA9IHJ0bXBfcGF1c2UsICAgICAgICAgICAgICAgIFwKKyAgICAudXJsX3dyaXRlICAgICAgPSBydG1wX3dyaXRlLCAgICAgICAgICAgICAgICBcCisgICAgLnVybF9jbG9zZSAgICAgID0gcnRtcF9jbG9zZSwgICAgICAgICAgICAgICAgXAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihSVE1QQ29udGV4dCksICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLCBcCisgICAgLnByaXZfZGF0YV9jbGFzcz0gJmZsYXZvciMjX2NsYXNzLCAgICAgICAgICAgXAorfTsKKworCitSVE1QX1BST1RPQ09MKHJ0bXApCitSVE1QX1BST1RPQ09MKHJ0bXBlKQorUlRNUF9QUk9UT0NPTChydG1wcykKK1JUTVBfUFJPVE9DT0wocnRtcHQpCitSVE1QX1BST1RPQ09MKHJ0bXB0ZSkKK1JUTVBfUFJPVE9DT0wocnRtcHRzKQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNDEzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBSVFAgaW5wdXQvb3V0cHV0IGZvcm1hdAorICogQ29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisKKyNpbmNsdWRlICJydHAuaCIKKworLyogZnJvbSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3J0cC1wYXJhbWV0ZXJzIGxhc3QgdXBkYXRlZCAwNSBKYW51YXJ5IDIwMDUgKi8KKy8qIHBheWxvYWQgdHlwZXMgPj0gOTYgYXJlIGR5bmFtaWM7CisgKiBwYXlsb2FkIHR5cGVzIGJldHdlZW4gNzIgYW5kIDc2IGFyZSByZXNlcnZlZCBmb3IgUlRDUCBjb25mbGljdCBhdm9pZGFuY2U7CisgKiBhbGwgdGhlIG90aGVyIHBheWxvYWQgdHlwZXMgbm90IHByZXNlbnQgaW4gdGhlIHRhYmxlIGFyZSB1bmFzc2lnbmVkIG9yCisgKiByZXNlcnZlZAorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBpbnQgcHQ7CisgICAgY29uc3QgY2hhciBlbmNfbmFtZVs2XTsKKyAgICBlbnVtIEFWTWVkaWFUeXBlIGNvZGVjX3R5cGU7CisgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQ7CisgICAgaW50IGNsb2NrX3JhdGU7CisgICAgaW50IGF1ZGlvX2NoYW5uZWxzOworfSBydHBfcGF5bG9hZF90eXBlc1tdID0geworICB7MCwgIlBDTVUiLCAgICAgICAgQVZNRURJQV9UWVBFX0FVRElPLCAgIEFWX0NPREVDX0lEX1BDTV9NVUxBVywgODAwMCwgMX0sCisgIHszLCAiR1NNIiwgICAgICAgICBBVk1FRElBX1RZUEVfQVVESU8sICAgQVZfQ09ERUNfSURfTk9ORSwgODAwMCwgMX0sCisgIHs0LCAiRzcyMyIsICAgICAgICBBVk1FRElBX1RZUEVfQVVESU8sICAgQVZfQ09ERUNfSURfRzcyM18xLCA4MDAwLCAxfSwKKyAgezUsICJEVkk0IiwgICAgICAgIEFWTUVESUFfVFlQRV9BVURJTywgICBBVl9DT0RFQ19JRF9OT05FLCA4MDAwLCAxfSwKKyAgezYsICJEVkk0IiwgICAgICAgIEFWTUVESUFfVFlQRV9BVURJTywgICBBVl9DT0RFQ19JRF9OT05FLCAxNjAwMCwgMX0sCisgIHs3LCAiTFBDIiwgICAgICAgICBBVk1FRElBX1RZUEVfQVVESU8sICAgQVZfQ09ERUNfSURfTk9ORSwgODAwMCwgMX0sCisgIHs4LCAiUENNQSIsICAgICAgICBBVk1FRElBX1RZUEVfQVVESU8sICAgQVZfQ09ERUNfSURfUENNX0FMQVcsIDgwMDAsIDF9LAorICB7OSwgIkc3MjIiLCAgICAgICAgQVZNRURJQV9UWVBFX0FVRElPLCAgIEFWX0NPREVDX0lEX0FEUENNX0c3MjIsIDgwMDAsIDF9LAorICB7MTAsICJMMTYiLCAgICAgICAgQVZNRURJQV9UWVBFX0FVRElPLCAgIEFWX0NPREVDX0lEX1BDTV9TMTZCRSwgNDQxMDAsIDJ9LAorICB7MTEsICJMMTYiLCAgICAgICAgQVZNRURJQV9UWVBFX0FVRElPLCAgIEFWX0NPREVDX0lEX1BDTV9TMTZCRSwgNDQxMDAsIDF9LAorICB7MTIsICJRQ0VMUCIsICAgICAgQVZNRURJQV9UWVBFX0FVRElPLCAgIEFWX0NPREVDX0lEX1FDRUxQLCA4MDAwLCAxfSwKKyAgezEzLCAiQ04iLCAgICAgICAgIEFWTUVESUFfVFlQRV9BVURJTywgICBBVl9DT0RFQ19JRF9OT05FLCA4MDAwLCAxfSwKKyAgezE0LCAiTVBBIiwgICAgICAgIEFWTUVESUFfVFlQRV9BVURJTywgICBBVl9DT0RFQ19JRF9NUDIsIC0xLCAtMX0sCisgIHsxNCwgIk1QQSIsICAgICAgICBBVk1FRElBX1RZUEVfQVVESU8sICAgQVZfQ09ERUNfSURfTVAzLCAtMSwgLTF9LAorICB7MTUsICJHNzI4IiwgICAgICAgQVZNRURJQV9UWVBFX0FVRElPLCAgIEFWX0NPREVDX0lEX05PTkUsIDgwMDAsIDF9LAorICB7MTYsICJEVkk0IiwgICAgICAgQVZNRURJQV9UWVBFX0FVRElPLCAgIEFWX0NPREVDX0lEX05PTkUsIDExMDI1LCAxfSwKKyAgezE3LCAiRFZJNCIsICAgICAgIEFWTUVESUFfVFlQRV9BVURJTywgICBBVl9DT0RFQ19JRF9OT05FLCAyMjA1MCwgMX0sCisgIHsxOCwgIkc3MjkiLCAgICAgICBBVk1FRElBX1RZUEVfQVVESU8sICAgQVZfQ09ERUNfSURfTk9ORSwgODAwMCwgMX0sCisgIHsyNSwgIkNlbEIiLCAgICAgICBBVk1FRElBX1RZUEVfVklERU8sICAgQVZfQ09ERUNfSURfTk9ORSwgOTAwMDAsIC0xfSwKKyAgezI2LCAiSlBFRyIsICAgICAgIEFWTUVESUFfVFlQRV9WSURFTywgICBBVl9DT0RFQ19JRF9NSlBFRywgOTAwMDAsIC0xfSwKKyAgezI4LCAibnYiLCAgICAgICAgIEFWTUVESUFfVFlQRV9WSURFTywgICBBVl9DT0RFQ19JRF9OT05FLCA5MDAwMCwgLTF9LAorICB7MzEsICJIMjYxIiwgICAgICAgQVZNRURJQV9UWVBFX1ZJREVPLCAgIEFWX0NPREVDX0lEX0gyNjEsIDkwMDAwLCAtMX0sCisgIHszMiwgIk1QViIsICAgICAgICBBVk1FRElBX1RZUEVfVklERU8sICAgQVZfQ09ERUNfSURfTVBFRzFWSURFTywgOTAwMDAsIC0xfSwKKyAgezMyLCAiTVBWIiwgICAgICAgIEFWTUVESUFfVFlQRV9WSURFTywgICBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCA5MDAwMCwgLTF9LAorICB7MzMsICJNUDJUIiwgICAgICAgQVZNRURJQV9UWVBFX0RBVEEsICAgIEFWX0NPREVDX0lEX01QRUcyVFMsIDkwMDAwLCAtMX0sCisgIHszNCwgIkgyNjMiLCAgICAgICBBVk1FRElBX1RZUEVfVklERU8sICAgQVZfQ09ERUNfSURfSDI2MywgOTAwMDAsIC0xfSwKKyAgey0xLCAiIiwgICAgICAgICAgIEFWTUVESUFfVFlQRV9VTktOT1dOLCBBVl9DT0RFQ19JRF9OT05FLCAtMSwgLTF9Cit9OworCitpbnQgZmZfcnRwX2dldF9jb2RlY19pbmZvKEFWQ29kZWNDb250ZXh0ICpjb2RlYywgaW50IHBheWxvYWRfdHlwZSkKK3sKKyAgICBpbnQgaSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBydHBfcGF5bG9hZF90eXBlc1tpXS5wdCA+PSAwOyBpKyspCisgICAgICAgIGlmIChydHBfcGF5bG9hZF90eXBlc1tpXS5wdCA9PSBwYXlsb2FkX3R5cGUpIHsKKyAgICAgICAgICAgIGlmIChydHBfcGF5bG9hZF90eXBlc1tpXS5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX3R5cGUgPSBydHBfcGF5bG9hZF90eXBlc1tpXS5jb2RlY190eXBlOworICAgICAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmNvZGVjX2lkOworICAgICAgICAgICAgICAgIGlmIChydHBfcGF5bG9hZF90eXBlc1tpXS5hdWRpb19jaGFubmVscyA+IDApCisgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5jaGFubmVscyA9IHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmF1ZGlvX2NoYW5uZWxzOworICAgICAgICAgICAgICAgIGlmIChydHBfcGF5bG9hZF90eXBlc1tpXS5jbG9ja19yYXRlID4gMCkKKyAgICAgICAgICAgICAgICAgICAgY29kZWMtPnNhbXBsZV9yYXRlID0gcnRwX3BheWxvYWRfdHlwZXNbaV0uY2xvY2tfcmF0ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIHJldHVybiAtMTsKK30KKworaW50IGZmX3J0cF9nZXRfcGF5bG9hZF90eXBlKEFWRm9ybWF0Q29udGV4dCAqZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYywgaW50IGlkeCkKK3sKKyAgICBpbnQgaTsKKyAgICBBVk91dHB1dEZvcm1hdCAqb2ZtdCA9IGZtdCA/IGZtdC0+b2Zvcm1hdCA6IE5VTEw7CisKKyAgICAvKiBXYXMgdGhlIHBheWxvYWQgdHlwZSBhbHJlYWR5IHNwZWNpZmllZCBmb3IgdGhlIFJUUCBtdXhlcj8gKi8KKyAgICBpZiAob2ZtdCAmJiBvZm10LT5wcml2X2NsYXNzICYmIGZtdC0+cHJpdl9kYXRhKSB7CisgICAgICAgIGludDY0X3QgcGF5bG9hZF90eXBlOworICAgICAgICBpZiAoYXZfb3B0X2dldF9pbnQoZm10LT5wcml2X2RhdGEsICJwYXlsb2FkX3R5cGUiLCAwLCAmcGF5bG9hZF90eXBlKSA+PSAwICYmCisgICAgICAgICAgICBwYXlsb2FkX3R5cGUgPj0gMCkKKyAgICAgICAgICAgIHJldHVybiAoaW50KXBheWxvYWRfdHlwZTsKKyAgICB9CisKKyAgICAvKiBzdGF0aWMgcGF5bG9hZCB0eXBlICovCisgICAgZm9yIChpID0gMDsgcnRwX3BheWxvYWRfdHlwZXNbaV0ucHQgPj0gMDsgKytpKQorICAgICAgICBpZiAocnRwX3BheWxvYWRfdHlwZXNbaV0uY29kZWNfaWQgPT0gY29kZWMtPmNvZGVjX2lkKSB7CisgICAgICAgICAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjMgJiYgKCFmbXQgfHwgIWZtdC0+b2Zvcm1hdCB8fAorICAgICAgICAgICAgICAgICFmbXQtPm9mb3JtYXQtPnByaXZfY2xhc3MgfHwgIWZtdC0+cHJpdl9kYXRhIHx8CisgICAgICAgICAgICAgICAgIWF2X29wdF9mbGFnX2lzX3NldChmbXQtPnByaXZfZGF0YSwgInJ0cGZsYWdzIiwgInJmYzIxOTAiKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAvKiBHNzIyIGhhcyA4MDAwIGFzIG5vbWluYWwgcmF0ZSBldmVuIGlmIHRoZSBzYW1wbGUgcmF0ZSBpcyAxNjAwMCwKKyAgICAgICAgICAgICAqIHNlZSBzZWN0aW9uIDQuNS4yIGluIFJGQyAzNTUxLiAqLworICAgICAgICAgICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9HNzIyICYmCisgICAgICAgICAgICAgICAgY29kZWMtPnNhbXBsZV9yYXRlID09IDE2MDAwICYmIGNvZGVjLT5jaGFubmVscyA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBydHBfcGF5bG9hZF90eXBlc1tpXS5wdDsKKyAgICAgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKKyAgICAgICAgICAgICAgICAoKHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmNsb2NrX3JhdGUgPiAwICYmCisgICAgICAgICAgICAgICAgICBjb2RlYy0+c2FtcGxlX3JhdGUgIT0gcnRwX3BheWxvYWRfdHlwZXNbaV0uY2xvY2tfcmF0ZSkgfHwKKyAgICAgICAgICAgICAgICAgKHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmF1ZGlvX2NoYW5uZWxzID4gMCAmJgorICAgICAgICAgICAgICAgICAgY29kZWMtPmNoYW5uZWxzICE9IHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmF1ZGlvX2NoYW5uZWxzKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICByZXR1cm4gcnRwX3BheWxvYWRfdHlwZXNbaV0ucHQ7CisgICAgICAgIH0KKworICAgIGlmIChpZHggPCAwKQorICAgICAgICBpZHggPSBjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU87CisKKyAgICAvKiBkeW5hbWljIHBheWxvYWQgdHlwZSAqLworICAgIHJldHVybiBSVFBfUFRfUFJJVkFURSArIGlkeDsKK30KKworY29uc3QgY2hhciAqZmZfcnRwX2VuY19uYW1lKGludCBwYXlsb2FkX3R5cGUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBydHBfcGF5bG9hZF90eXBlc1tpXS5wdCA+PSAwOyBpKyspCisgICAgICAgIGlmIChydHBfcGF5bG9hZF90eXBlc1tpXS5wdCA9PSBwYXlsb2FkX3R5cGUpCisgICAgICAgICAgICByZXR1cm4gcnRwX3BheWxvYWRfdHlwZXNbaV0uZW5jX25hbWU7CisKKyAgICByZXR1cm4gIiI7Cit9CisKK2VudW0gQVZDb2RlY0lEIGZmX3J0cF9jb2RlY19pZChjb25zdCBjaGFyICpidWYsIGVudW0gQVZNZWRpYVR5cGUgY29kZWNfdHlwZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IHJ0cF9wYXlsb2FkX3R5cGVzW2ldLnB0ID49IDA7IGkrKykKKyAgICAgICAgaWYgKCFhdl9zdHJjYXNlY21wKGJ1ZiwgcnRwX3BheWxvYWRfdHlwZXNbaV0uZW5jX25hbWUpICYmIChjb2RlY190eXBlID09IHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmNvZGVjX3R5cGUpKQorICAgICAgICAgICAgcmV0dXJuIHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmNvZGVjX2lkOworCisgICAgcmV0dXJuIEFWX0NPREVDX0lEX05PTkU7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhNGYzYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHAuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIFJUUCBkZWZpbml0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2lmbmRlZiBBVkZPUk1BVF9SVFBfSAorI2RlZmluZSBBVkZPUk1BVF9SVFBfSAorCisjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKworLyoqCisgKiBSZXR1cm4gdGhlIHBheWxvYWQgdHlwZSBmb3IgYSBnaXZlbiBzdHJlYW0gdXNlZCBpbiB0aGUgZ2l2ZW4gZm9ybWF0IGNvbnRleHQuCisgKiBTdGF0aWMgcGF5bG9hZCB0eXBlcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBjb2RlYy4KKyAqIER5bmFtaWMgcGF5bG9hZCB0eXBlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlkIGZpZWxkIGluIEFWU3RyZWFtLgorICogVGhlIGZvcm1hdCBjb250ZXh0IHByaXZhdGUgb3B0aW9uIHBheWxvYWRfdHlwZSBvdmVycmlkZXMgYm90aC4KKyAqCisgKiBAcGFyYW0gZm10ICAgVGhlIGNvbnRleHQgb2YgdGhlIGZvcm1hdAorICogQHBhcmFtIGNvZGVjIFRoZSBjb250ZXh0IG9mIHRoZSBjb2RlYworICogQHBhcmFtIGlkeCAgIFRoZSBzdHJlYW0gaW5kZXgKKyAqIEByZXR1cm4gVGhlIHBheWxvYWQgdHlwZSAodGhlICdQVCcgZmllbGQgaW4gdGhlIFJUUCBoZWFkZXIpLgorICovCitpbnQgZmZfcnRwX2dldF9wYXlsb2FkX3R5cGUoQVZGb3JtYXRDb250ZXh0ICpmbXQsIEFWQ29kZWNDb250ZXh0ICpjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4KTsKKworLyoqCisgKiBJbml0aWFsaXplIGEgY29kZWMgY29udGV4dCBiYXNlZCBvbiB0aGUgcGF5bG9hZCB0eXBlLgorICoKKyAqIEZpbGwgdGhlIGNvZGVjX3R5cGUgYW5kIGNvZGVjX2lkIGZpZWxkcyBvZiBhIGNvZGVjIGNvbnRleHQgd2l0aAorICogaW5mb3JtYXRpb24gZGVwZW5kaW5nIG9uIHRoZSBwYXlsb2FkIHR5cGU7IGZvciBhdWRpbyBjb2RlY3MsIHRoZQorICogY2hhbm5lbHMgYW5kIHNhbXBsZV9yYXRlIGZpZWxkcyBhcmUgYWxzbyBmaWxsZWQuCisgKgorICogQHBhcmFtIGNvZGVjIFRoZSBjb250ZXh0IG9mIHRoZSBjb2RlYworICogQHBhcmFtIHBheWxvYWRfdHlwZSBUaGUgcGF5bG9hZCB0eXBlICh0aGUgJ1BUJyBmaWVsZCBpbiB0aGUgUlRQIGhlYWRlcikKKyAqIEByZXR1cm4gSW4gY2FzZSBvZiB1bmtub3duIHBheWxvYWQgdHlwZSBvciBkeW5hbWljIHBheWxvYWQgdHlwZSwgYQorICogbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSwgMCBpcyByZXR1cm5lZAorICovCitpbnQgZmZfcnRwX2dldF9jb2RlY19pbmZvKEFWQ29kZWNDb250ZXh0ICpjb2RlYywgaW50IHBheWxvYWRfdHlwZSk7CisKKy8qKgorICogUmV0dXJuIHRoZSBlbmNvZGluZyBuYW1lIChhcyBkZWZpbmVkIGluCisgKiBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3J0cC1wYXJhbWV0ZXJzKSBmb3IgYSBnaXZlbiBwYXlsb2FkIHR5cGUuCisgKgorICogQHBhcmFtIHBheWxvYWRfdHlwZSBUaGUgcGF5bG9hZCB0eXBlICh0aGUgJ1BUJyBmaWVsZCBpbiB0aGUgUlRQIGhlYWRlcikKKyAqIEByZXR1cm4gSW4gY2FzZSBvZiB1bmtub3duIHBheWxvYWQgdHlwZSBvciBkeW5hbWljIHBheWxvYWQgdHlwZSwgYSBwb2ludGVyCisgKiB0byBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSwgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcKKyAqIHRoZSBlbmNvZGluZyBuYW1lIGlzIHJldHVybmVkCisgKi8KK2NvbnN0IGNoYXIgKmZmX3J0cF9lbmNfbmFtZShpbnQgcGF5bG9hZF90eXBlKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGNvZGVjIGlkIGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcgbmFtZSBhbmQgY29kZWMgdHlwZS4KKyAqCisgKiBAcGFyYW0gYnVmIEEgcG9pbnRlciB0byB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVuY29kaW5nIG5hbWUKKyAqIEBwYXJhbSBjb2RlY190eXBlIFRoZSBjb2RlYyB0eXBlCisgKiBAcmV0dXJuIEluIGNhc2Ugb2YgdW5rbm93biBlbmNvZGluZyBuYW1lLCBBVl9DT0RFQ19JRF9OT05FIGlzIHJldHVybmVkOworICogb3RoZXJ3aXNlLCB0aGUgY29kZWMgaWQgaXMgcmV0dXJuZWQKKyAqLworZW51bSBBVkNvZGVjSUQgZmZfcnRwX2NvZGVjX2lkKGNvbnN0IGNoYXIgKmJ1ZiwgZW51bSBBVk1lZGlhVHlwZSBjb2RlY190eXBlKTsKKworI2RlZmluZSBSVFBfUFRfUFJJVkFURSA5NgorI2RlZmluZSBSVFBfVkVSU0lPTiAyCisjZGVmaW5lIFJUUF9NQVhfU0RFUyAyNTYgICAvKio8IG1heGltdW0gdGV4dCBsZW5ndGggZm9yIFNERVMgKi8KKworLyogUlRDUCBwYWNrZXRzIHVzZSAwLjUlIG9mIHRoZSBiYW5kd2lkdGggKi8KKyNkZWZpbmUgUlRDUF9UWF9SQVRJT19OVU0gNQorI2RlZmluZSBSVENQX1RYX1JBVElPX0RFTiAxMDAwCisKKy8qIEFuIGFyYml0cmFyeSBpZCB2YWx1ZSBmb3IgUlRQIFhpcGggc3RyZWFtcyAtIG9ubHkgcmVsZXZhbnQgdG8gaW5kaWNhdGUKKyAqIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQgd2l0aGluIGEgc3RyZWFtIChieSBjaGFuZ2luZyB0aGUKKyAqIGlkZW50IHZhbHVlIHNlbnQpLgorICovCisjZGVmaW5lIFJUUF9YSVBIX0lERU5UIDB4ZmVjZGJhCisKKy8qIFJUQ1AgcGFja2V0IHR5cGVzICovCitlbnVtIFJUQ1BUeXBlIHsKKyAgICBSVENQX0ZJUiAgICA9IDE5MiwKKyAgICBSVENQX05BQ0ssIC8vIDE5MworICAgIFJUQ1BfU01QVEVUQywvLyAxOTQKKyAgICBSVENQX0lKLCAgIC8vIDE5NQorICAgIFJUQ1BfU1IgICAgID0gMjAwLAorICAgIFJUQ1BfUlIsICAgLy8gMjAxCisgICAgUlRDUF9TREVTLCAvLyAyMDIKKyAgICBSVENQX0JZRSwgIC8vIDIwMworICAgIFJUQ1BfQVBQLCAgLy8gMjA0CisgICAgUlRDUF9SVFBGQiwvLyAyMDUKKyAgICBSVENQX1BTRkIsIC8vIDIwNgorICAgIFJUQ1BfWFIsICAgLy8gMjA3CisgICAgUlRDUF9BVkIsICAvLyAyMDgKKyAgICBSVENQX1JTSSwgIC8vIDIwOQorICAgIFJUQ1BfVE9LRU4sLy8gMjEwCit9OworCisjZGVmaW5lIFJUUF9QVF9JU19SVENQKHgpICgoKHgpID49IFJUQ1BfRklSICYmICh4KSA8PSBSVENQX0lKKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpID49IFJUQ1BfU1IgICYmICh4KSA8PSBSVENQX1RPS0VOKSkKKworI2RlZmluZSBOVFBfVE9fUlRQX0ZPUk1BVCh4KSBhdl9yZXNjYWxlKCh4KSwgSU5UNjRfQygxKSA8PCAzMiwgMTAwMDAwMCkKKworI2VuZGlmIC8qIEFWRk9STUFUX1JUUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyMDVhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWMuYwpAQCAtMCwwICsxLDg4OSBAQAorLyoKKyAqIFJUUCBpbnB1dCBmb3JtYXQKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAibmV0d29yay5oIgorI2luY2x1ZGUgInNydHAuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKyNpbmNsdWRlICJydHBkZWMuaCIKKyNpbmNsdWRlICJydHBkZWNfZm9ybWF0cy5oIgorCisjZGVmaW5lIE1JTl9GRUVEQkFDS19JTlRFUlZBTCAyMDAwMDAgLyogMjAwIG1zIGluIHVzICovCisKK3N0YXRpYyBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGdzbV9keW5hbWljX2hhbmRsZXIgPSB7CisgICAgLmVuY19uYW1lICAgPSAiR1NNIiwKKyAgICAuY29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0dTTSwKK307CisKK3N0YXRpYyBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIHJlYWxtZWRpYV9tcDNfZHluYW1pY19oYW5kbGVyID0geworICAgIC5lbmNfbmFtZSAgID0gIlgtTVAzLWRyYWZ0LTAwIiwKKyAgICAuY29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01QM0FEVSwKK307CisKK3N0YXRpYyBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIHNwZWV4X2R5bmFtaWNfaGFuZGxlciA9IHsKKyAgICAuZW5jX25hbWUgICA9ICJzcGVleCIsCisgICAgLmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9TUEVFWCwKK307CisKK3N0YXRpYyBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIG9wdXNfZHluYW1pY19oYW5kbGVyID0geworICAgIC5lbmNfbmFtZSAgID0gIm9wdXMiLAorICAgIC5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfT1BVUywKK307CisKK3N0YXRpYyBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpydHBfZmlyc3RfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIgPSBOVUxMOworCit2b2lkIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmhhbmRsZXIpCit7CisgICAgaGFuZGxlci0+bmV4dCA9IHJ0cF9maXJzdF9keW5hbWljX3BheWxvYWRfaGFuZGxlcjsKKyAgICBydHBfZmlyc3RfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIgPSBoYW5kbGVyOworfQorCit2b2lkIGZmX3JlZ2lzdGVyX3J0cF9keW5hbWljX3BheWxvYWRfaGFuZGxlcnModm9pZCkKK3sKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfYW1yX25iX2R5bmFtaWNfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX2Ftcl93Yl9keW5hbWljX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9nNzI2XzE2X2R5bmFtaWNfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX2c3MjZfMjRfZHluYW1pY19oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfZzcyNl8zMl9keW5hbWljX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9nNzI2XzQwX2R5bmFtaWNfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX2gyNjFfZHluYW1pY19oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfaDI2M18xOTk4X2R5bmFtaWNfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX2gyNjNfMjAwMF9keW5hbWljX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9oMjYzX3JmYzIxOTBfZHluYW1pY19oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfaDI2NF9keW5hbWljX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9oZXZjX2R5bmFtaWNfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX2lsYmNfZHluYW1pY19oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfanBlZ19keW5hbWljX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9tcDRhX2xhdG1fZHluYW1pY19oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfbXA0dl9lc19keW5hbWljX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9tcGVnX2F1ZGlvX2R5bmFtaWNfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX21wZWdfdmlkZW9fZHluYW1pY19oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfbXBlZzRfZ2VuZXJpY19keW5hbWljX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9tcGVndHNfZHluYW1pY19oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfbXNfcnRwX2FzZl9wZmFfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX21zX3J0cF9hc2ZfcGZ2X2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9xY2VscF9keW5hbWljX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9xZG0yX2R5bmFtaWNfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX3F0X3J0cF9hdWRfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX3F0X3J0cF92aWRfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX3F1aWNrdGltZV9ydHBfYXVkX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9xdWlja3RpbWVfcnRwX3ZpZF9oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfc3ZxM19keW5hbWljX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl90aGVvcmFfZHluYW1pY19oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfdm9yYmlzX2R5bmFtaWNfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX3ZwOF9keW5hbWljX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZnc21fZHluYW1pY19oYW5kbGVyKTsKKyAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmb3B1c19keW5hbWljX2hhbmRsZXIpOworICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZyZWFsbWVkaWFfbXAzX2R5bmFtaWNfaGFuZGxlcik7CisgICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJnNwZWV4X2R5bmFtaWNfaGFuZGxlcik7Cit9CisKK1JUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmZmX3J0cF9oYW5kbGVyX2ZpbmRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgY29kZWNfdHlwZSkKK3sKKyAgICBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyOworICAgIGZvciAoaGFuZGxlciA9IHJ0cF9maXJzdF9keW5hbWljX3BheWxvYWRfaGFuZGxlcjsKKyAgICAgICAgIGhhbmRsZXI7IGhhbmRsZXIgPSBoYW5kbGVyLT5uZXh0KQorICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAobmFtZSwgaGFuZGxlci0+ZW5jX25hbWUpICYmCisgICAgICAgICAgICBjb2RlY190eXBlID09IGhhbmRsZXItPmNvZGVjX3R5cGUpCisgICAgICAgICAgICByZXR1cm4gaGFuZGxlcjsKKyAgICByZXR1cm4gTlVMTDsKK30KKworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqZmZfcnRwX2hhbmRsZXJfZmluZF9ieV9pZChpbnQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgY29kZWNfdHlwZSkKK3sKKyAgICBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyOworICAgIGZvciAoaGFuZGxlciA9IHJ0cF9maXJzdF9keW5hbWljX3BheWxvYWRfaGFuZGxlcjsKKyAgICAgICAgIGhhbmRsZXI7IGhhbmRsZXIgPSBoYW5kbGVyLT5uZXh0KQorICAgICAgICBpZiAoaGFuZGxlci0+c3RhdGljX3BheWxvYWRfaWQgJiYgaGFuZGxlci0+c3RhdGljX3BheWxvYWRfaWQgPT0gaWQgJiYKKyAgICAgICAgICAgIGNvZGVjX3R5cGUgPT0gaGFuZGxlci0+Y29kZWNfdHlwZSkKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVyOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHJ0Y3BfcGFyc2VfcGFja2V0KFJUUERlbXV4Q29udGV4dCAqcywgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIGludCBwYXlsb2FkX2xlbjsKKyAgICB3aGlsZSAobGVuID49IDQpIHsKKyAgICAgICAgcGF5bG9hZF9sZW4gPSBGRk1JTihsZW4sIChBVl9SQjE2KGJ1ZiArIDIpICsgMSkgKiA0KTsKKworICAgICAgICBzd2l0Y2ggKGJ1ZlsxXSkgeworICAgICAgICBjYXNlIFJUQ1BfU1I6CisgICAgICAgICAgICBpZiAocGF5bG9hZF9sZW4gPCAyMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGxlbmd0aCBmb3IgUlRDUCBTUiBwYWNrZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5sYXN0X3J0Y3BfcmVjZXB0aW9uX3RpbWUgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7CisgICAgICAgICAgICBzLT5sYXN0X3J0Y3BfbnRwX3RpbWUgID0gQVZfUkI2NChidWYgKyA4KTsKKyAgICAgICAgICAgIHMtPmxhc3RfcnRjcF90aW1lc3RhbXAgPSBBVl9SQjMyKGJ1ZiArIDE2KTsKKyAgICAgICAgICAgIGlmIChzLT5maXJzdF9ydGNwX250cF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgcy0+Zmlyc3RfcnRjcF9udHBfdGltZSA9IHMtPmxhc3RfcnRjcF9udHBfdGltZTsKKyAgICAgICAgICAgICAgICBpZiAoIXMtPmJhc2VfdGltZXN0YW1wKQorICAgICAgICAgICAgICAgICAgICBzLT5iYXNlX3RpbWVzdGFtcCA9IHMtPmxhc3RfcnRjcF90aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgcy0+cnRjcF90c19vZmZzZXQgPSBzLT5sYXN0X3J0Y3BfdGltZXN0YW1wIC0gcy0+YmFzZV90aW1lc3RhbXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUQ1BfQllFOgorICAgICAgICAgICAgcmV0dXJuIC1SVENQX0JZRTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZiArPSBwYXlsb2FkX2xlbjsKKyAgICAgICAgbGVuIC09IHBheWxvYWRfbGVuOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgUlRQX1NFUV9NT0QgKDEgPDwgMTYpCisKK3N0YXRpYyB2b2lkIHJ0cF9pbml0X3N0YXRpc3RpY3MoUlRQU3RhdGlzdGljcyAqcywgdWludDE2X3QgYmFzZV9zZXF1ZW5jZSkKK3sKKyAgICBtZW1zZXQocywgMCwgc2l6ZW9mKFJUUFN0YXRpc3RpY3MpKTsKKyAgICBzLT5tYXhfc2VxICAgPSBiYXNlX3NlcXVlbmNlOworICAgIHMtPnByb2JhdGlvbiA9IDE7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlcmUgaXMgYSBsYXJnZSBqdW1wIGluIHNlcXVlbmNlIG51bWJlcnMsCisgKiBvciB3aGVuIHRoZXkgZ2V0IG91dCBvZiBwcm9iYXRpb24uLi4KKyAqLworc3RhdGljIHZvaWQgcnRwX2luaXRfc2VxdWVuY2UoUlRQU3RhdGlzdGljcyAqcywgdWludDE2X3Qgc2VxKQoreworICAgIHMtPm1heF9zZXEgICAgICAgID0gc2VxOworICAgIHMtPmN5Y2xlcyAgICAgICAgID0gMDsKKyAgICBzLT5iYXNlX3NlcSAgICAgICA9IHNlcSAtIDE7CisgICAgcy0+YmFkX3NlcSAgICAgICAgPSBSVFBfU0VRX01PRCArIDE7CisgICAgcy0+cmVjZWl2ZWQgICAgICAgPSAwOworICAgIHMtPmV4cGVjdGVkX3ByaW9yID0gMDsKKyAgICBzLT5yZWNlaXZlZF9wcmlvciA9IDA7CisgICAgcy0+aml0dGVyICAgICAgICAgPSAwOworICAgIHMtPnRyYW5zaXQgICAgICAgID0gMDsKK30KKworLyogUmV0dXJucyAxIGlmIHdlIHNob3VsZCBoYW5kbGUgdGhpcyBwYWNrZXQuICovCitzdGF0aWMgaW50IHJ0cF92YWxpZF9wYWNrZXRfaW5fc2VxdWVuY2UoUlRQU3RhdGlzdGljcyAqcywgdWludDE2X3Qgc2VxKQoreworICAgIHVpbnQxNl90IHVkZWx0YSA9IHNlcSAtIHMtPm1heF9zZXE7CisgICAgY29uc3QgaW50IE1BWF9EUk9QT1VUICAgID0gMzAwMDsKKyAgICBjb25zdCBpbnQgTUFYX01JU09SREVSICAgPSAxMDA7CisgICAgY29uc3QgaW50IE1JTl9TRVFVRU5USUFMID0gMjsKKworICAgIC8qIHNvdXJjZSBub3QgdmFsaWQgdW50aWwgTUlOX1NFUVVFTlRJQUwgcGFja2V0cyB3aXRoIHNlcXVlbmNlCisgICAgICogc2VxLiBudW1iZXJzIGhhdmUgYmVlbiByZWNlaXZlZCAqLworICAgIGlmIChzLT5wcm9iYXRpb24pIHsKKyAgICAgICAgaWYgKHNlcSA9PSBzLT5tYXhfc2VxICsgMSkgeworICAgICAgICAgICAgcy0+cHJvYmF0aW9uLS07CisgICAgICAgICAgICBzLT5tYXhfc2VxID0gc2VxOworICAgICAgICAgICAgaWYgKHMtPnByb2JhdGlvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgcnRwX2luaXRfc2VxdWVuY2Uocywgc2VxKTsKKyAgICAgICAgICAgICAgICBzLT5yZWNlaXZlZCsrOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+cHJvYmF0aW9uID0gTUlOX1NFUVVFTlRJQUwgLSAxOworICAgICAgICAgICAgcy0+bWF4X3NlcSAgID0gc2VxOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh1ZGVsdGEgPCBNQVhfRFJPUE9VVCkgeworICAgICAgICAvLyBpbiBvcmRlciwgd2l0aCBwZXJtaXNzaWJsZSBnYXAKKyAgICAgICAgaWYgKHNlcSA8IHMtPm1heF9zZXEpIHsKKyAgICAgICAgICAgIC8vIHNlcXVlbmNlIG51bWJlciB3cmFwcGVkOyBjb3VudCBhbm90aGVyIDY0ayBjeWNsZXMKKyAgICAgICAgICAgIHMtPmN5Y2xlcyArPSBSVFBfU0VRX01PRDsKKyAgICAgICAgfQorICAgICAgICBzLT5tYXhfc2VxID0gc2VxOworICAgIH0gZWxzZSBpZiAodWRlbHRhIDw9IFJUUF9TRVFfTU9EIC0gTUFYX01JU09SREVSKSB7CisgICAgICAgIC8vIHNlcXVlbmNlIG1hZGUgYSBsYXJnZSBqdW1wLi4uCisgICAgICAgIGlmIChzZXEgPT0gcy0+YmFkX3NlcSkgeworICAgICAgICAgICAgLyogdHdvIHNlcXVlbnRpYWwgcGFja2V0cyAtLSBhc3N1bWUgdGhhdCB0aGUgb3RoZXIgc2lkZQorICAgICAgICAgICAgICogcmVzdGFydGVkIHdpdGhvdXQgdGVsbGluZyB1czsganVzdCByZXN5bmMuICovCisgICAgICAgICAgICBydHBfaW5pdF9zZXF1ZW5jZShzLCBzZXEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+YmFkX3NlcSA9IChzZXEgKyAxKSAmIChSVFBfU0VRX01PRCAtIDEpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBkdXBsaWNhdGUgb3IgcmVvcmRlcmVkIHBhY2tldC4uLgorICAgIH0KKyAgICBzLT5yZWNlaXZlZCsrOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBydGNwX3VwZGF0ZV9qaXR0ZXIoUlRQU3RhdGlzdGljcyAqcywgdWludDMyX3Qgc2VudF90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJyaXZhbF90aW1lc3RhbXApCit7CisgICAgLy8gTW9zdCBvZiB0aGlzIGlzIHByZXR0eSBzdHJhaWdodCBmcm9tIFJGQyAzNTUwIGFwcGVuZGl4IEEuOAorICAgIHVpbnQzMl90IHRyYW5zaXQgPSBhcnJpdmFsX3RpbWVzdGFtcCAtIHNlbnRfdGltZXN0YW1wOworICAgIHVpbnQzMl90IHByZXZfdHJhbnNpdCA9IHMtPnRyYW5zaXQ7CisgICAgaW50MzJfdCBkID0gdHJhbnNpdCAtIHByZXZfdHJhbnNpdDsKKyAgICAvLyBEb2luZyB0aGUgRkZBQlMoKSBjYWxsIGRpcmVjdGx5IG9uIHRoZSAidHJhbnNpdCAtIHByZXZfdHJhbnNpdCIKKyAgICAvLyBleHByZXNzaW9uIGRvZXNuJ3Qgd29yaywgc2luY2UgaXQncyBhbiB1bnNpZ25lZCBleHByZXNzaW9uLiBEb2luZyB0aGUKKyAgICAvLyB0cmFuc2l0IGNhbGN1bGF0aW9uIGluIHVuc2lnbmVkIGlzIGRlc2lyZWQgdGhvdWdoLCBzaW5jZSBpdCBtb3N0CisgICAgLy8gcHJvYmFibHkgd2lsbCBuZWVkIHRvIHdyYXAgYXJvdW5kLgorICAgIGQgPSBGRkFCUyhkKTsKKyAgICBzLT50cmFuc2l0ID0gdHJhbnNpdDsKKyAgICBpZiAoIXByZXZfdHJhbnNpdCkKKyAgICAgICAgcmV0dXJuOworICAgIHMtPmppdHRlciArPSBkIC0gKGludDMyX3QpICgocy0+aml0dGVyICsgOCkgPj4gNCk7Cit9CisKK2ludCBmZl9ydHBfY2hlY2tfYW5kX3NlbmRfYmFja19ycihSVFBEZW11eENvbnRleHQgKnMsIFVSTENvbnRleHQgKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSU9Db250ZXh0ICphdmlvLCBpbnQgY291bnQpCit7CisgICAgQVZJT0NvbnRleHQgKnBiOworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICBpbnQgbGVuOworICAgIGludCBydGNwX2J5dGVzOworICAgIFJUUFN0YXRpc3RpY3MgKnN0YXRzID0gJnMtPnN0YXRpc3RpY3M7CisgICAgdWludDMyX3QgbG9zdDsKKyAgICB1aW50MzJfdCBleHRlbmRlZF9tYXg7CisgICAgdWludDMyX3QgZXhwZWN0ZWRfaW50ZXJ2YWw7CisgICAgdWludDMyX3QgcmVjZWl2ZWRfaW50ZXJ2YWw7CisgICAgaW50MzJfdCAgbG9zdF9pbnRlcnZhbDsKKyAgICB1aW50MzJfdCBleHBlY3RlZDsKKyAgICB1aW50MzJfdCBmcmFjdGlvbjsKKworICAgIGlmICgoIWZkICYmICFhdmlvKSB8fCAoY291bnQgPCAxKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogVE9ETzogSSB0aGluayB0aGlzIGlzIHdheSB0b28gb2Z0ZW47IFJGQyAxODg5IGhhcyBhbGdvcml0aG0gZm9yIHRoaXMgKi8KKyAgICAvKiBYWFg6IE1QRUcgcHRzIGhhcmRjb2RlZC4gUlRDUCBzZW5kIGV2ZXJ5IDAuNSBzZWNvbmRzICovCisgICAgcy0+b2N0ZXRfY291bnQgKz0gY291bnQ7CisgICAgcnRjcF9ieXRlcyA9ICgocy0+b2N0ZXRfY291bnQgLSBzLT5sYXN0X29jdGV0X2NvdW50KSAqIFJUQ1BfVFhfUkFUSU9fTlVNKSAvCisgICAgICAgIFJUQ1BfVFhfUkFUSU9fREVOOworICAgIHJ0Y3BfYnl0ZXMgLz0gNTA7IC8vIG1tdV9tYW46IHRoYXQncyBlbm91Z2ggZm9yIG1lLi4uIFZMQyBzZW5kcyBtdWNoIGxlc3MgYnR3ICE/CisgICAgaWYgKHJ0Y3BfYnl0ZXMgPCAyOCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHMtPmxhc3Rfb2N0ZXRfY291bnQgPSBzLT5vY3RldF9jb3VudDsKKworICAgIGlmICghZmQpCisgICAgICAgIHBiID0gYXZpbzsKKyAgICBlbHNlIGlmIChhdmlvX29wZW5fZHluX2J1ZigmcGIpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy8gUmVjZWl2ZXIgUmVwb3J0CisgICAgYXZpb193OChwYiwgKFJUUF9WRVJTSU9OIDw8IDYpICsgMSk7IC8qIDEgcmVwb3J0IGJsb2NrICovCisgICAgYXZpb193OChwYiwgUlRDUF9SUik7CisgICAgYXZpb193YjE2KHBiLCA3KTsgLyogbGVuZ3RoIGluIHdvcmRzIC0gMSAqLworICAgIC8vIG91ciBvd24gU1NSQzogd2UgdXNlIHRoZSBzZXJ2ZXIncyBTU1JDICsgMSB0byBhdm9pZCBjb25mbGljdHMKKyAgICBhdmlvX3diMzIocGIsIHMtPnNzcmMgKyAxKTsKKyAgICBhdmlvX3diMzIocGIsIHMtPnNzcmMpOyAvLyBzZXJ2ZXIgU1NSQworICAgIC8vIHNvbWUgcGxhY2Vob2xkZXJzIHdlIHNob3VsZCByZWFsbHkgZmlsbC4uLgorICAgIC8vIFJGQyAxODg5L3A2NAorICAgIGV4dGVuZGVkX21heCAgICAgICAgICA9IHN0YXRzLT5jeWNsZXMgKyBzdGF0cy0+bWF4X3NlcTsKKyAgICBleHBlY3RlZCAgICAgICAgICAgICAgPSBleHRlbmRlZF9tYXggLSBzdGF0cy0+YmFzZV9zZXE7CisgICAgbG9zdCAgICAgICAgICAgICAgICAgID0gZXhwZWN0ZWQgLSBzdGF0cy0+cmVjZWl2ZWQ7CisgICAgbG9zdCAgICAgICAgICAgICAgICAgID0gRkZNSU4obG9zdCwgMHhmZmZmZmYpOyAvLyBjbGFtcCBpdCBzaW5jZSBpdCdzIG9ubHkgMjQgYml0cy4uLgorICAgIGV4cGVjdGVkX2ludGVydmFsICAgICA9IGV4cGVjdGVkIC0gc3RhdHMtPmV4cGVjdGVkX3ByaW9yOworICAgIHN0YXRzLT5leHBlY3RlZF9wcmlvciA9IGV4cGVjdGVkOworICAgIHJlY2VpdmVkX2ludGVydmFsICAgICA9IHN0YXRzLT5yZWNlaXZlZCAtIHN0YXRzLT5yZWNlaXZlZF9wcmlvcjsKKyAgICBzdGF0cy0+cmVjZWl2ZWRfcHJpb3IgPSBzdGF0cy0+cmVjZWl2ZWQ7CisgICAgbG9zdF9pbnRlcnZhbCAgICAgICAgID0gZXhwZWN0ZWRfaW50ZXJ2YWwgLSByZWNlaXZlZF9pbnRlcnZhbDsKKyAgICBpZiAoZXhwZWN0ZWRfaW50ZXJ2YWwgPT0gMCB8fCBsb3N0X2ludGVydmFsIDw9IDApCisgICAgICAgIGZyYWN0aW9uID0gMDsKKyAgICBlbHNlCisgICAgICAgIGZyYWN0aW9uID0gKGxvc3RfaW50ZXJ2YWwgPDwgOCkgLyBleHBlY3RlZF9pbnRlcnZhbDsKKworICAgIGZyYWN0aW9uID0gKGZyYWN0aW9uIDw8IDI0KSB8IGxvc3Q7CisKKyAgICBhdmlvX3diMzIocGIsIGZyYWN0aW9uKTsgLyogOCBiaXRzIG9mIGZyYWN0aW9uLCAyNCBiaXRzIG9mIHRvdGFsIHBhY2tldHMgbG9zdCAqLworICAgIGF2aW9fd2IzMihwYiwgZXh0ZW5kZWRfbWF4KTsgLyogbWF4IHNlcXVlbmNlIHJlY2VpdmVkICovCisgICAgYXZpb193YjMyKHBiLCBzdGF0cy0+aml0dGVyID4+IDQpOyAvKiBqaXR0ZXIgKi8KKworICAgIGlmIChzLT5sYXN0X3J0Y3BfbnRwX3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogbGFzdCBTUiB0aW1lc3RhbXAgKi8KKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogZGVsYXkgc2luY2UgbGFzdCBTUiAqLworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IG1pZGRsZV8zMl9iaXRzICAgPSBzLT5sYXN0X3J0Y3BfbnRwX3RpbWUgPj4gMTY7IC8vIHRoaXMgaXMgdmFsaWQsIHJpZ2h0PyBkbyB3ZSBuZWVkIHRvIGhhbmRsZSA2NCBiaXQgdmFsdWVzIHNwZWNpYWw/CisgICAgICAgIHVpbnQzMl90IGRlbGF5X3NpbmNlX2xhc3QgPSBhdl9yZXNjYWxlKGF2X2dldHRpbWVfcmVsYXRpdmUoKSAtIHMtPmxhc3RfcnRjcF9yZWNlcHRpb25fdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzYsIEFWX1RJTUVfQkFTRSk7CisKKyAgICAgICAgYXZpb193YjMyKHBiLCBtaWRkbGVfMzJfYml0cyk7IC8qIGxhc3QgU1IgdGltZXN0YW1wICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgZGVsYXlfc2luY2VfbGFzdCk7IC8qIGRlbGF5IHNpbmNlIGxhc3QgU1IgKi8KKyAgICB9CisKKyAgICAvLyBDTkFNRQorICAgIGF2aW9fdzgocGIsIChSVFBfVkVSU0lPTiA8PCA2KSArIDEpOyAvKiAxIHJlcG9ydCBibG9jayAqLworICAgIGF2aW9fdzgocGIsIFJUQ1BfU0RFUyk7CisgICAgbGVuID0gc3RybGVuKHMtPmhvc3RuYW1lKTsKKyAgICBhdmlvX3diMTYocGIsICg3ICsgbGVuICsgMykgLyA0KTsgLyogbGVuZ3RoIGluIHdvcmRzIC0gMSAqLworICAgIGF2aW9fd2IzMihwYiwgcy0+c3NyYyArIDEpOworICAgIGF2aW9fdzgocGIsIDB4MDEpOworICAgIGF2aW9fdzgocGIsIGxlbik7CisgICAgYXZpb193cml0ZShwYiwgcy0+aG9zdG5hbWUsIGxlbik7CisgICAgYXZpb193OChwYiwgMCk7IC8qIEVORCAqLworICAgIC8vIHBhZGRpbmcKKyAgICBmb3IgKGxlbiA9ICg3ICsgbGVuKSAlIDQ7IGxlbiAlIDQ7IGxlbisrKQorICAgICAgICBhdmlvX3c4KHBiLCAwKTsKKworICAgIGF2aW9fZmx1c2gocGIpOworICAgIGlmICghZmQpCisgICAgICAgIHJldHVybiAwOworICAgIGxlbiA9IGF2aW9fY2xvc2VfZHluX2J1ZihwYiwgJmJ1Zik7CisgICAgaWYgKChsZW4gPiAwKSAmJiBidWYpIHsKKyAgICAgICAgaW50IGF2X3VudXNlZCByZXN1bHQ7CisgICAgICAgIGF2X2Rsb2cocy0+aWMsICJzZW5kaW5nICVkIGJ5dGVzIG9mIFJSXG4iLCBsZW4pOworICAgICAgICByZXN1bHQgPSBmZnVybF93cml0ZShmZCwgYnVmLCBsZW4pOworICAgICAgICBhdl9kbG9nKHMtPmljLCAicmVzdWx0IGZyb20gZmZ1cmxfd3JpdGU6ICVkXG4iLCByZXN1bHQpOworICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX3J0cF9zZW5kX3B1bmNoX3BhY2tldHMoVVJMQ29udGV4dCAqcnRwX2hhbmRsZSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGI7CisgICAgdWludDhfdCAqYnVmOworICAgIGludCBsZW47CisKKyAgICAvKiBTZW5kIGEgc21hbGwgUlRQIHBhY2tldCAqLworICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmcGIpIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXZpb193OChwYiwgKFJUUF9WRVJTSU9OIDw8IDYpKTsKKyAgICBhdmlvX3c4KHBiLCAwKTsgLyogUGF5bG9hZCB0eXBlICovCisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogU2VxICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogVGltZXN0YW1wICovCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogU1NSQyAqLworCisgICAgYXZpb19mbHVzaChwYik7CisgICAgbGVuID0gYXZpb19jbG9zZV9keW5fYnVmKHBiLCAmYnVmKTsKKyAgICBpZiAoKGxlbiA+IDApICYmIGJ1ZikKKyAgICAgICAgZmZ1cmxfd3JpdGUocnRwX2hhbmRsZSwgYnVmLCBsZW4pOworICAgIGF2X2ZyZWUoYnVmKTsKKworICAgIC8qIFNlbmQgYSBtaW5pbWFsIFJUQ1AgUlIgKi8KKyAgICBpZiAoYXZpb19vcGVuX2R5bl9idWYoJnBiKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIGF2aW9fdzgocGIsIChSVFBfVkVSU0lPTiA8PCA2KSk7CisgICAgYXZpb193OChwYiwgUlRDUF9SUik7IC8qIHJlY2VpdmVyIHJlcG9ydCAqLworICAgIGF2aW9fd2IxNihwYiwgMSk7IC8qIGxlbmd0aCBpbiB3b3JkcyAtIDEgKi8KKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBvdXIgb3duIFNTUkMgKi8KKworICAgIGF2aW9fZmx1c2gocGIpOworICAgIGxlbiA9IGF2aW9fY2xvc2VfZHluX2J1ZihwYiwgJmJ1Zik7CisgICAgaWYgKChsZW4gPiAwKSAmJiBidWYpCisgICAgICAgIGZmdXJsX3dyaXRlKHJ0cF9oYW5kbGUsIGJ1ZiwgbGVuKTsKKyAgICBhdl9mcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9taXNzaW5nX3BhY2tldHMoUlRQRGVtdXhDb250ZXh0ICpzLCB1aW50MTZfdCAqZmlyc3RfbWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKm1pc3NpbmdfbWFzaykKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50MTZfdCBuZXh0X3NlcSA9IHMtPnNlcSArIDE7CisgICAgUlRQUGFja2V0ICpwa3QgPSBzLT5xdWV1ZTsKKworICAgIGlmICghcGt0IHx8IHBrdC0+c2VxID09IG5leHRfc2VxKQorICAgICAgICByZXR1cm4gMDsKKworICAgICptaXNzaW5nX21hc2sgPSAwOworICAgIGZvciAoaSA9IDE7IGkgPD0gMTY7IGkrKykgeworICAgICAgICB1aW50MTZfdCBtaXNzaW5nX3NlcSA9IG5leHRfc2VxICsgaTsKKyAgICAgICAgd2hpbGUgKHBrdCkgeworICAgICAgICAgICAgaW50MTZfdCBkaWZmID0gcGt0LT5zZXEgLSBtaXNzaW5nX3NlcTsKKyAgICAgICAgICAgIGlmIChkaWZmID49IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwa3QgPSBwa3QtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwa3QpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHBrdC0+c2VxID09IG1pc3Npbmdfc2VxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICptaXNzaW5nX21hc2sgfD0gMSA8PCAoaSAtIDEpOworICAgIH0KKworICAgICpmaXJzdF9taXNzaW5nID0gbmV4dF9zZXE7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBmZl9ydHBfc2VuZF9ydGNwX2ZlZWRiYWNrKFJUUERlbXV4Q29udGV4dCAqcywgVVJMQ29udGV4dCAqZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVklPQ29udGV4dCAqYXZpbykKK3sKKyAgICBpbnQgbGVuLCBuZWVkX2tleWZyYW1lLCBtaXNzaW5nX3BhY2tldHM7CisgICAgQVZJT0NvbnRleHQgKnBiOworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICBpbnQ2NF90IG5vdzsKKyAgICB1aW50MTZfdCBmaXJzdF9taXNzaW5nID0gMCwgbWlzc2luZ19tYXNrID0gMDsKKworICAgIGlmICghZmQgJiYgIWF2aW8pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIG5lZWRfa2V5ZnJhbWUgPSBzLT5oYW5kbGVyICYmIHMtPmhhbmRsZXItPm5lZWRfa2V5ZnJhbWUgJiYKKyAgICAgICAgICAgICAgICAgICAgcy0+aGFuZGxlci0+bmVlZF9rZXlmcmFtZShzLT5keW5hbWljX3Byb3RvY29sX2NvbnRleHQpOworICAgIG1pc3NpbmdfcGFja2V0cyA9IGZpbmRfbWlzc2luZ19wYWNrZXRzKHMsICZmaXJzdF9taXNzaW5nLCAmbWlzc2luZ19tYXNrKTsKKworICAgIGlmICghbmVlZF9rZXlmcmFtZSAmJiAhbWlzc2luZ19wYWNrZXRzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIFNlbmQgbmV3IGZlZWRiYWNrIGlmIGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0CisgICAgICogZmVlZGJhY2sgcGFja2V0LiAqLworCisgICAgbm93ID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworICAgIGlmIChzLT5sYXN0X2ZlZWRiYWNrX3RpbWUgJiYKKyAgICAgICAgKG5vdyAtIHMtPmxhc3RfZmVlZGJhY2tfdGltZSkgPCBNSU5fRkVFREJBQ0tfSU5URVJWQUwpCisgICAgICAgIHJldHVybiAwOworICAgIHMtPmxhc3RfZmVlZGJhY2tfdGltZSA9IG5vdzsKKworICAgIGlmICghZmQpCisgICAgICAgIHBiID0gYXZpbzsKKyAgICBlbHNlIGlmIChhdmlvX29wZW5fZHluX2J1ZigmcGIpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKG5lZWRfa2V5ZnJhbWUpIHsKKyAgICAgICAgYXZpb193OChwYiwgKFJUUF9WRVJTSU9OIDw8IDYpIHwgMSk7IC8qIFBMSSAqLworICAgICAgICBhdmlvX3c4KHBiLCBSVENQX1BTRkIpOworICAgICAgICBhdmlvX3diMTYocGIsIDIpOyAvKiBsZW5ndGggaW4gd29yZHMgLSAxICovCisgICAgICAgIC8vIG91ciBvd24gU1NSQzogd2UgdXNlIHRoZSBzZXJ2ZXIncyBTU1JDICsgMSB0byBhdm9pZCBjb25mbGljdHMKKyAgICAgICAgYXZpb193YjMyKHBiLCBzLT5zc3JjICsgMSk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgcy0+c3NyYyk7IC8vIHNlcnZlciBTU1JDCisgICAgfQorCisgICAgaWYgKG1pc3NpbmdfcGFja2V0cykgeworICAgICAgICBhdmlvX3c4KHBiLCAoUlRQX1ZFUlNJT04gPDwgNikgfCAxKTsgLyogTkFDSyAqLworICAgICAgICBhdmlvX3c4KHBiLCBSVENQX1JUUEZCKTsKKyAgICAgICAgYXZpb193YjE2KHBiLCAzKTsgLyogbGVuZ3RoIGluIHdvcmRzIC0gMSAqLworICAgICAgICBhdmlvX3diMzIocGIsIHMtPnNzcmMgKyAxKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBzLT5zc3JjKTsgLy8gc2VydmVyIFNTUkMKKworICAgICAgICBhdmlvX3diMTYocGIsIGZpcnN0X21pc3NpbmcpOworICAgICAgICBhdmlvX3diMTYocGIsIG1pc3NpbmdfbWFzayk7CisgICAgfQorCisgICAgYXZpb19mbHVzaChwYik7CisgICAgaWYgKCFmZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbGVuID0gYXZpb19jbG9zZV9keW5fYnVmKHBiLCAmYnVmKTsKKyAgICBpZiAobGVuID4gMCAmJiBidWYpIHsKKyAgICAgICAgZmZ1cmxfd3JpdGUoZmQsIGJ1ZiwgbGVuKTsKKyAgICAgICAgYXZfZnJlZShidWYpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBvcGVuIGEgbmV3IFJUUCBwYXJzZSBjb250ZXh0IGZvciBzdHJlYW0gJ3N0Jy4gJ3N0JyBjYW4gYmUgTlVMTCBmb3IKKyAqIE1QRUcyLVRTIHN0cmVhbXMuCisgKi8KK1JUUERlbXV4Q29udGV4dCAqZmZfcnRwX3BhcnNlX29wZW4oQVZGb3JtYXRDb250ZXh0ICpzMSwgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGF5bG9hZF90eXBlLCBpbnQgcXVldWVfc2l6ZSkKK3sKKyAgICBSVFBEZW11eENvbnRleHQgKnM7CisKKyAgICBzID0gYXZfbWFsbG9jeihzaXplb2YoUlRQRGVtdXhDb250ZXh0KSk7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzLT5wYXlsb2FkX3R5cGUgICAgICAgID0gcGF5bG9hZF90eXBlOworICAgIHMtPmxhc3RfcnRjcF9udHBfdGltZSAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBzLT5maXJzdF9ydGNwX250cF90aW1lID0gQVZfTk9QVFNfVkFMVUU7CisgICAgcy0+aWMgICAgICAgICAgICAgICAgICA9IHMxOworICAgIHMtPnN0ICAgICAgICAgICAgICAgICAgPSBzdDsKKyAgICBzLT5xdWV1ZV9zaXplICAgICAgICAgID0gcXVldWVfc2l6ZTsKKyAgICBydHBfaW5pdF9zdGF0aXN0aWNzKCZzLT5zdGF0aXN0aWNzLCAwKTsKKyAgICBpZiAoc3QpIHsKKyAgICAgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRzcyMjoKKyAgICAgICAgICAgIC8qIEFjY29yZGluZyB0byBSRkMgMzU1MSwgdGhlIHN0cmVhbSBjbG9jayByYXRlIGlzIDgwMDAKKyAgICAgICAgICAgICAqIGV2ZW4gaWYgdGhlIHNhbXBsZSByYXRlIGlzIDE2MDAwLiAqLworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPT0gODAwMCkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gMTYwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIC8vIG5lZWRlZCB0byBzZW5kIGJhY2sgUlRDUCBSUiBpbiBSVFNQIHNlc3Npb25zCisgICAgZ2V0aG9zdG5hbWUocy0+aG9zdG5hbWUsIHNpemVvZihzLT5ob3N0bmFtZSkpOworICAgIHJldHVybiBzOworfQorCit2b2lkIGZmX3J0cF9wYXJzZV9zZXRfZHluYW1pY19wcm90b2NvbChSVFBEZW11eENvbnRleHQgKnMsIFBheWxvYWRDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyKQoreworICAgIHMtPmR5bmFtaWNfcHJvdG9jb2xfY29udGV4dCA9IGN0eDsKKyAgICBzLT5oYW5kbGVyICAgICAgICAgICAgICAgICAgPSBoYW5kbGVyOworfQorCit2b2lkIGZmX3J0cF9wYXJzZV9zZXRfY3J5cHRvKFJUUERlbXV4Q29udGV4dCAqcywgY29uc3QgY2hhciAqc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtcykKK3sKKyAgICBpZiAoIWZmX3NydHBfc2V0X2NyeXB0bygmcy0+c3J0cCwgc3VpdGUsIHBhcmFtcykpCisgICAgICAgIHMtPnNydHBfZW5hYmxlZCA9IDE7Cit9CisKKy8qKgorICogVGhpcyB3YXMgdGhlIHNlY29uZCBzd2l0Y2ggaW4gcnRwX3BhcnNlIHBhY2tldC4KKyAqIE5vcm1hbGl6ZXMgdGltZSwgaWYgcmVxdWlyZWQsIHNldHMgc3RyZWFtX2luZGV4LCBldGMuCisgKi8KK3N0YXRpYyB2b2lkIGZpbmFsaXplX3BhY2tldChSVFBEZW11eENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsIHVpbnQzMl90IHRpbWVzdGFtcCkKK3sKKyAgICBpZiAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgfHwgcGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHJldHVybjsgLyogVGltZXN0YW1wIGFscmVhZHkgc2V0IGJ5IGRlcGFja2V0aXplciAqLworICAgIGlmICh0aW1lc3RhbXAgPT0gUlRQX05PVFNfVkFMVUUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChzLT5sYXN0X3J0Y3BfbnRwX3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcy0+aWMtPm5iX3N0cmVhbXMgPiAxKSB7CisgICAgICAgIGludDY0X3QgYWRkZW5kOworICAgICAgICBpbnQgZGVsdGFfdGltZXN0YW1wOworCisgICAgICAgIC8qIGNvbXB1dGUgcHRzIGZyb20gdGltZXN0YW1wIHdpdGggcmVjZWl2ZWQgbnRwX3RpbWUgKi8KKyAgICAgICAgZGVsdGFfdGltZXN0YW1wID0gdGltZXN0YW1wIC0gcy0+bGFzdF9ydGNwX3RpbWVzdGFtcDsKKyAgICAgICAgLyogY29udmVydCB0byB0aGUgUFRTIHRpbWViYXNlICovCisgICAgICAgIGFkZGVuZCA9IGF2X3Jlc2NhbGUocy0+bGFzdF9ydGNwX250cF90aW1lIC0gcy0+Zmlyc3RfcnRjcF9udHBfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdC0+dGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpIHMtPnN0LT50aW1lX2Jhc2UubnVtIDw8IDMyKTsKKyAgICAgICAgcGt0LT5wdHMgPSBzLT5yYW5nZV9zdGFydF9vZmZzZXQgKyBzLT5ydGNwX3RzX29mZnNldCArIGFkZGVuZCArCisgICAgICAgICAgICAgICAgICAgZGVsdGFfdGltZXN0YW1wOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFzLT5iYXNlX3RpbWVzdGFtcCkKKyAgICAgICAgcy0+YmFzZV90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgLyogYXNzdW1lIHRoYXQgdGhlIGRpZmZlcmVuY2UgaXMgSU5UMzJfTUlOIDwgeCA8IElOVDMyX01BWCwKKyAgICAgKiBidXQgYWxsb3cgdGhlIGZpcnN0IHRpbWVzdGFtcCB0byBleGNlZWQgSU5UMzJfTUFYICovCisgICAgaWYgKCFzLT50aW1lc3RhbXApCisgICAgICAgIHMtPnVud3JhcHBlZF90aW1lc3RhbXAgKz0gdGltZXN0YW1wOworICAgIGVsc2UKKyAgICAgICAgcy0+dW53cmFwcGVkX3RpbWVzdGFtcCArPSAoaW50MzJfdCkodGltZXN0YW1wIC0gcy0+dGltZXN0YW1wKTsKKyAgICBzLT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgcGt0LT5wdHMgICAgID0gcy0+dW53cmFwcGVkX3RpbWVzdGFtcCArIHMtPnJhbmdlX3N0YXJ0X29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgcy0+YmFzZV90aW1lc3RhbXA7Cit9CisKK3N0YXRpYyBpbnQgcnRwX3BhcnNlX3BhY2tldF9pbnRlcm5hbChSVFBEZW11eENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIHVuc2lnbmVkIGludCBzc3JjOworICAgIGludCBwYXlsb2FkX3R5cGUsIHNlcSwgZmxhZ3MgPSAwOworICAgIGludCBleHQsIGNzcmM7CisgICAgQVZTdHJlYW0gKnN0OworICAgIHVpbnQzMl90IHRpbWVzdGFtcDsKKyAgICBpbnQgcnYgPSAwOworCisgICAgY3NyYyAgICAgICAgID0gYnVmWzBdICYgMHgwZjsKKyAgICBleHQgICAgICAgICAgPSBidWZbMF0gJiAweDEwOworICAgIHBheWxvYWRfdHlwZSA9IGJ1ZlsxXSAmIDB4N2Y7CisgICAgaWYgKGJ1ZlsxXSAmIDB4ODApCisgICAgICAgIGZsYWdzIHw9IFJUUF9GTEFHX01BUktFUjsKKyAgICBzZXEgICAgICAgPSBBVl9SQjE2KGJ1ZiArIDIpOworICAgIHRpbWVzdGFtcCA9IEFWX1JCMzIoYnVmICsgNCk7CisgICAgc3NyYyAgICAgID0gQVZfUkIzMihidWYgKyA4KTsKKyAgICAvKiBzdG9yZSB0aGUgc3NyYyBpbiB0aGUgUlRQRGVtdXhDb250ZXh0ICovCisgICAgcy0+c3NyYyA9IHNzcmM7CisKKyAgICAvKiBOT1RFOiB3ZSBjYW4gaGFuZGxlIG9ubHkgb25lIHBheWxvYWQgdHlwZSAqLworICAgIGlmIChzLT5wYXlsb2FkX3R5cGUgIT0gcGF5bG9hZF90eXBlKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzdCA9IHMtPnN0OworICAgIC8vIG9ubHkgZG8gc29tZXRoaW5nIHdpdGggdGhpcyBpZiBhbGwgdGhlIHJ0cCBjaGVja3MgcGFzcy4uLgorICAgIGlmICghcnRwX3ZhbGlkX3BhY2tldF9pbl9zZXF1ZW5jZSgmcy0+c3RhdGlzdGljcywgc2VxKSkgeworICAgICAgICBhdl9sb2coc3QgPyBzdC0+Y29kZWMgOiBOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiUlRQOiBQVD0lMDJ4OiBiYWQgY3NlcSAlMDR4IGV4cGVjdGVkPSUwNHhcbiIsCisgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIHNlcSwgKChzLT5zZXEgKyAxKSAmIDB4ZmZmZikpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGJ1ZlswXSAmIDB4MjApIHsKKyAgICAgICAgaW50IHBhZGRpbmcgPSBidWZbbGVuIC0gMV07CisgICAgICAgIGlmIChsZW4gPj0gMTIgKyBwYWRkaW5nKQorICAgICAgICAgICAgbGVuIC09IHBhZGRpbmc7CisgICAgfQorCisgICAgcy0+c2VxID0gc2VxOworICAgIGxlbiAgIC09IDEyOworICAgIGJ1ZiAgICs9IDEyOworCisgICAgbGVuICAgLT0gNCAqIGNzcmM7CisgICAgYnVmICAgKz0gNCAqIGNzcmM7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLyogUkZDIDM1NTAgU2VjdGlvbiA1LjMuMSBSVFAgSGVhZGVyIEV4dGVuc2lvbiBoYW5kbGluZyAqLworICAgIGlmIChleHQpIHsKKyAgICAgICAgaWYgKGxlbiA8IDQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgaGVhZGVyIGV4dGVuc2lvbiBsZW5ndGggKHN0b3JlZCBhcyBudW1iZXIKKyAgICAgICAgICogb2YgMzItYml0IHdvcmRzKSAqLworICAgICAgICBleHQgPSAoQVZfUkIxNihidWYgKyAyKSArIDEpIDw8IDI7CisKKyAgICAgICAgaWYgKGxlbiA8IGV4dCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgLy8gc2tpcCBwYXN0IFJUUCBoZWFkZXIgZXh0ZW5zaW9uCisgICAgICAgIGxlbiAtPSBleHQ7CisgICAgICAgIGJ1ZiArPSBleHQ7CisgICAgfQorCisgICAgaWYgKHMtPmhhbmRsZXIgJiYgcy0+aGFuZGxlci0+cGFyc2VfcGFja2V0KSB7CisgICAgICAgIHJ2ID0gcy0+aGFuZGxlci0+cGFyc2VfcGFja2V0KHMtPmljLCBzLT5keW5hbWljX3Byb3RvY29sX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0LCBwa3QsICZ0aW1lc3RhbXAsIGJ1ZiwgbGVuLCBzZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICB9IGVsc2UgaWYgKHN0KSB7CisgICAgICAgIGlmICgocnYgPSBhdl9uZXdfcGFja2V0KHBrdCwgbGVuKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJ2OworICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBidWYsIGxlbik7CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8gbm93IHBlcmZvcm0gdGltZXN0YW1wIHRoaW5ncy4uLi4KKyAgICBmaW5hbGl6ZV9wYWNrZXQocywgcGt0LCB0aW1lc3RhbXApOworCisgICAgcmV0dXJuIHJ2OworfQorCit2b2lkIGZmX3J0cF9yZXNldF9wYWNrZXRfcXVldWUoUlRQRGVtdXhDb250ZXh0ICpzKQoreworICAgIHdoaWxlIChzLT5xdWV1ZSkgeworICAgICAgICBSVFBQYWNrZXQgKm5leHQgPSBzLT5xdWV1ZS0+bmV4dDsKKyAgICAgICAgYXZfZnJlZShzLT5xdWV1ZS0+YnVmKTsKKyAgICAgICAgYXZfZnJlZShzLT5xdWV1ZSk7CisgICAgICAgIHMtPnF1ZXVlID0gbmV4dDsKKyAgICB9CisgICAgcy0+c2VxICAgICAgID0gMDsKKyAgICBzLT5xdWV1ZV9sZW4gPSAwOworICAgIHMtPnByZXZfcmV0ICA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGVucXVldWVfcGFja2V0KFJUUERlbXV4Q29udGV4dCAqcywgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIHVpbnQxNl90IHNlcSAgID0gQVZfUkIxNihidWYgKyAyKTsKKyAgICBSVFBQYWNrZXQgKipjdXIgPSAmcy0+cXVldWUsICpwYWNrZXQ7CisKKyAgICAvKiBGaW5kIHRoZSBjb3JyZWN0IHBsYWNlIGluIHRoZSBxdWV1ZSB0byBpbnNlcnQgdGhlIHBhY2tldCAqLworICAgIHdoaWxlICgqY3VyKSB7CisgICAgICAgIGludDE2X3QgZGlmZiA9IHNlcSAtICgqY3VyKS0+c2VxOworICAgICAgICBpZiAoZGlmZiA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY3VyID0gJigqY3VyKS0+bmV4dDsKKyAgICB9CisKKyAgICBwYWNrZXQgPSBhdl9tYWxsb2N6KHNpemVvZigqcGFja2V0KSk7CisgICAgaWYgKCFwYWNrZXQpCisgICAgICAgIHJldHVybjsKKyAgICBwYWNrZXQtPnJlY3Z0aW1lID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworICAgIHBhY2tldC0+c2VxICAgICAgPSBzZXE7CisgICAgcGFja2V0LT5sZW4gICAgICA9IGxlbjsKKyAgICBwYWNrZXQtPmJ1ZiAgICAgID0gYnVmOworICAgIHBhY2tldC0+bmV4dCAgICAgPSAqY3VyOworICAgICpjdXIgPSBwYWNrZXQ7CisgICAgcy0+cXVldWVfbGVuKys7Cit9CisKK3N0YXRpYyBpbnQgaGFzX25leHRfcGFja2V0KFJUUERlbXV4Q29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gcy0+cXVldWUgJiYgcy0+cXVldWUtPnNlcSA9PSAodWludDE2X3QpIChzLT5zZXEgKyAxKTsKK30KKworaW50NjRfdCBmZl9ydHBfcXVldWVkX3BhY2tldF90aW1lKFJUUERlbXV4Q29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gcy0+cXVldWUgPyBzLT5xdWV1ZS0+cmVjdnRpbWUgOiAwOworfQorCitzdGF0aWMgaW50IHJ0cF9wYXJzZV9xdWV1ZWRfcGFja2V0KFJUUERlbXV4Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcnY7CisgICAgUlRQUGFja2V0ICpuZXh0OworCisgICAgaWYgKHMtPnF1ZXVlX2xlbiA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIWhhc19uZXh0X3BhY2tldChzKSkKKyAgICAgICAgYXZfbG9nKHMtPnN0ID8gcy0+c3QtPmNvZGVjIDogTlVMTCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiUlRQOiBtaXNzZWQgJWQgcGFja2V0c1xuIiwgcy0+cXVldWUtPnNlcSAtIHMtPnNlcSAtIDEpOworCisgICAgLyogUGFyc2UgdGhlIGZpcnN0IHBhY2tldCBpbiB0aGUgcXVldWUsIGFuZCBkZXF1ZXVlIGl0ICovCisgICAgcnYgICA9IHJ0cF9wYXJzZV9wYWNrZXRfaW50ZXJuYWwocywgcGt0LCBzLT5xdWV1ZS0+YnVmLCBzLT5xdWV1ZS0+bGVuKTsKKyAgICBuZXh0ID0gcy0+cXVldWUtPm5leHQ7CisgICAgYXZfZnJlZShzLT5xdWV1ZS0+YnVmKTsKKyAgICBhdl9mcmVlKHMtPnF1ZXVlKTsKKyAgICBzLT5xdWV1ZSA9IG5leHQ7CisgICAgcy0+cXVldWVfbGVuLS07CisgICAgcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IHJ0cF9wYXJzZV9vbmVfcGFja2V0KFJUUERlbXV4Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKmJ1ZnB0ciwgaW50IGxlbikKK3sKKyAgICB1aW50OF90ICpidWYgPSBidWZwdHIgPyAqYnVmcHRyIDogTlVMTDsKKyAgICBpbnQgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcDsKKyAgICBpbnQgcnYgPSAwOworCisgICAgaWYgKCFidWYpIHsKKyAgICAgICAgLyogSWYgcGFyc2luZyBvZiB0aGUgcHJldmlvdXMgcGFja2V0IGFjdHVhbGx5IHJldHVybmVkIDAgb3IgYW4gZXJyb3IsCisgICAgICAgICAqIHRoZXJlJ3Mgbm90aGluZyBtb3JlIHRvIGJlIHBhcnNlZCBmcm9tIHRoYXQgcGFja2V0LCBidXQgd2UgbWF5IGhhdmUKKyAgICAgICAgICogaW5kaWNhdGVkIHRoYXQgd2UgY2FuIHJldHVybiB0aGUgbmV4dCBlbnF1ZXVlZCBwYWNrZXQuICovCisgICAgICAgIGlmIChzLT5wcmV2X3JldCA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIHJ0cF9wYXJzZV9xdWV1ZWRfcGFja2V0KHMsIHBrdCk7CisgICAgICAgIC8qIHJldHVybiB0aGUgbmV4dCBwYWNrZXRzLCBpZiBhbnkgKi8KKyAgICAgICAgaWYgKHMtPmhhbmRsZXIgJiYgcy0+aGFuZGxlci0+cGFyc2VfcGFja2V0KSB7CisgICAgICAgICAgICAvKiB0aW1lc3RhbXAgc2hvdWxkIGJlIG92ZXJ3cml0dGVuIGJ5IHBhcnNlX3BhY2tldCwgaWYgbm90LAorICAgICAgICAgICAgICogdGhlIHBhY2tldCBpcyBsZWZ0IHdpdGggcHRzID09IEFWX05PUFRTX1ZBTFVFICovCisgICAgICAgICAgICB0aW1lc3RhbXAgPSBSVFBfTk9UU19WQUxVRTsKKyAgICAgICAgICAgIHJ2ICAgICAgICA9IHMtPmhhbmRsZXItPnBhcnNlX3BhY2tldChzLT5pYywgcy0+ZHluYW1pY19wcm90b2NvbF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0LCBwa3QsICZ0aW1lc3RhbXAsIE5VTEwsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICAgICAgZmluYWxpemVfcGFja2V0KHMsIHBrdCwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIHJldHVybiBydjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsZW4gPCAxMikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKChidWZbMF0gJiAweGMwKSAhPSAoUlRQX1ZFUlNJT04gPDwgNikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoUlRQX1BUX0lTX1JUQ1AoYnVmWzFdKSkgeworICAgICAgICByZXR1cm4gcnRjcF9wYXJzZV9wYWNrZXQocywgYnVmLCBsZW4pOworICAgIH0KKworICAgIGlmIChzLT5zdCkgeworICAgICAgICBpbnQ2NF90IHJlY2VpdmVkID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworICAgICAgICB1aW50MzJfdCBhcnJpdmFsX3RzID0gYXZfcmVzY2FsZV9xKHJlY2VpdmVkLCBBVl9USU1FX0JBU0VfUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdC0+dGltZV9iYXNlKTsKKyAgICAgICAgdGltZXN0YW1wID0gQVZfUkIzMihidWYgKyA0KTsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBqaXR0ZXIgaW1tZWRpYXRlbHksIGJlZm9yZSBxdWV1ZWluZyB0aGUgcGFja2V0CisgICAgICAgIC8vIGludG8gdGhlIHJlb3JkZXJpbmcgcXVldWUuCisgICAgICAgIHJ0Y3BfdXBkYXRlX2ppdHRlcigmcy0+c3RhdGlzdGljcywgdGltZXN0YW1wLCBhcnJpdmFsX3RzKTsKKyAgICB9CisKKyAgICBpZiAoKHMtPnNlcSA9PSAwICYmICFzLT5xdWV1ZSkgfHwgcy0+cXVldWVfc2l6ZSA8PSAxKSB7CisgICAgICAgIC8qIEZpcnN0IHBhY2tldCwgb3Igbm8gcmVvcmRlcmluZyAqLworICAgICAgICByZXR1cm4gcnRwX3BhcnNlX3BhY2tldF9pbnRlcm5hbChzLCBwa3QsIGJ1ZiwgbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MTZfdCBzZXEgPSBBVl9SQjE2KGJ1ZiArIDIpOworICAgICAgICBpbnQxNl90IGRpZmYgPSBzZXEgLSBzLT5zZXE7CisgICAgICAgIGlmIChkaWZmIDwgMCkgeworICAgICAgICAgICAgLyogUGFja2V0IG9sZGVyIHRoYW4gdGhlIHByZXZpb3VzbHkgZW1pdHRlZCBvbmUsIGRyb3AgKi8KKyAgICAgICAgICAgIGF2X2xvZyhzLT5zdCA/IHMtPnN0LT5jb2RlYyA6IE5VTEwsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJSVFA6IGRyb3BwaW5nIG9sZCBwYWNrZXQgcmVjZWl2ZWQgdG9vIGxhdGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPD0gMSkgeworICAgICAgICAgICAgLyogQ29ycmVjdCBwYWNrZXQgKi8KKyAgICAgICAgICAgIHJ2ID0gcnRwX3BhcnNlX3BhY2tldF9pbnRlcm5hbChzLCBwa3QsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIHJldHVybiBydjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFN0aWxsIG1pc3Npbmcgc29tZSBwYWNrZXQsIGVucXVldWUgdGhpcyBvbmUuICovCisgICAgICAgICAgICBlbnF1ZXVlX3BhY2tldChzLCBidWYsIGxlbik7CisgICAgICAgICAgICAqYnVmcHRyID0gTlVMTDsKKyAgICAgICAgICAgIC8qIFJldHVybiB0aGUgZmlyc3QgZW5xdWV1ZWQgcGFja2V0IGlmIHRoZSBxdWV1ZSBpcyBmdWxsLAorICAgICAgICAgICAgICogZXZlbiBpZiB3ZSdyZSBtaXNzaW5nIHNvbWV0aGluZyAqLworICAgICAgICAgICAgaWYgKHMtPnF1ZXVlX2xlbiA+PSBzLT5xdWV1ZV9zaXplKQorICAgICAgICAgICAgICAgIHJldHVybiBydHBfcGFyc2VfcXVldWVkX3BhY2tldChzLCBwa3QpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIFBhcnNlIGFuIFJUUCBvciBSVENQIHBhY2tldCBkaXJlY3RseSBzZW50IGFzIGEgYnVmZmVyLgorICogQHBhcmFtIHMgUlRQIHBhcnNlIGNvbnRleHQuCisgKiBAcGFyYW0gcGt0IHJldHVybmVkIHBhY2tldAorICogQHBhcmFtIGJ1ZnB0ciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgb3IgTlVMTCB0byByZWFkIHRoZSBuZXh0IHBhY2tldHMKKyAqIEBwYXJhbSBsZW4gYnVmZmVyIGxlbgorICogQHJldHVybiAwIGlmIGEgcGFja2V0IGlzIHJldHVybmVkLCAxIGlmIGEgcGFja2V0IGlzIHJldHVybmVkIGFuZCBtb3JlIGNhbiBmb2xsb3cKKyAqICh1c2UgYnVmIGFzIE5VTEwgdG8gcmVhZCB0aGUgbmV4dCkuIC0xIGlmIG5vIHBhY2tldCAoZXJyb3Igb3Igbm8gbW9yZSBwYWNrZXQpLgorICovCitpbnQgZmZfcnRwX3BhcnNlX3BhY2tldChSVFBEZW11eENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqYnVmcHRyLCBpbnQgbGVuKQoreworICAgIGludCBydjsKKyAgICBpZiAocy0+c3J0cF9lbmFibGVkICYmIGJ1ZnB0ciAmJiBmZl9zcnRwX2RlY3J5cHQoJnMtPnNydHAsICpidWZwdHIsICZsZW4pIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJ2ID0gcnRwX3BhcnNlX29uZV9wYWNrZXQocywgcGt0LCBidWZwdHIsIGxlbik7CisgICAgcy0+cHJldl9yZXQgPSBydjsKKyAgICB3aGlsZSAocnYgPT0gQVZFUlJPUihFQUdBSU4pICYmIGhhc19uZXh0X3BhY2tldChzKSkKKyAgICAgICAgcnYgPSBydHBfcGFyc2VfcXVldWVkX3BhY2tldChzLCBwa3QpOworICAgIHJldHVybiBydiA/IHJ2IDogaGFzX25leHRfcGFja2V0KHMpOworfQorCit2b2lkIGZmX3J0cF9wYXJzZV9jbG9zZShSVFBEZW11eENvbnRleHQgKnMpCit7CisgICAgZmZfcnRwX3Jlc2V0X3BhY2tldF9xdWV1ZShzKTsKKyAgICBmZl9zcnRwX2ZyZWUoJnMtPnNydHApOworICAgIGF2X2ZyZWUocyk7Cit9CisKK2ludCBmZl9wYXJzZV9mbXRwKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdHJlYW0sIFBheWxvYWRDb250ZXh0ICpkYXRhLCBjb25zdCBjaGFyICpwLAorICAgICAgICAgICAgICAgICAgaW50ICgqcGFyc2VfZm10cCkoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYXR0ciwgY2hhciAqdmFsdWUpKQoreworICAgIGNoYXIgYXR0clsyNTZdOworICAgIGNoYXIgKnZhbHVlOworICAgIGludCByZXM7CisgICAgaW50IHZhbHVlX3NpemUgPSBzdHJsZW4ocCkgKyAxOworCisgICAgaWYgKCEodmFsdWUgPSBhdl9tYWxsb2ModmFsdWVfc2l6ZSkpKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgZGF0YSBmb3IgRk1UUC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIC8vIHJlbW92ZSBwcm90b2NvbCBpZGVudGlmaWVyCisgICAgd2hpbGUgKCpwICYmICpwID09ICcgJykKKyAgICAgICAgcCsrOyAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmlwIHNwYWNlcworICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnICcpCisgICAgICAgIHArKzsgICAgICAgICAgICAgICAgICAgICAvLyBlYXQgcHJvdG9jb2wgaWRlbnRpZmllcgorICAgIHdoaWxlICgqcCAmJiAqcCA9PSAnICcpCisgICAgICAgIHArKzsgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpcCB0cmFpbGluZyBzcGFjZXMKKworICAgIHdoaWxlIChmZl9ydHNwX25leHRfYXR0cl9hbmRfdmFsdWUoJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLCBzaXplb2YoYXR0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgdmFsdWVfc2l6ZSkpIHsKKyAgICAgICAgcmVzID0gcGFyc2VfZm10cChzLCBzdHJlYW0sIGRhdGEsIGF0dHIsIHZhbHVlKTsKKyAgICAgICAgaWYgKHJlcyA8IDAgJiYgcmVzICE9IEFWRVJST1JfUEFUQ0hXRUxDT01FKSB7CisgICAgICAgICAgICBhdl9mcmVlKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZSh2YWx1ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9ydHBfZmluYWxpemVfcGFja2V0KEFWUGFja2V0ICpwa3QsIEFWSU9Db250ZXh0ICoqZHluX2J1ZiwgaW50IHN0cmVhbV9pZHgpCit7CisgICAgaW50IHJldDsKKyAgICBhdl9pbml0X3BhY2tldChwa3QpOworCisgICAgcGt0LT5zaXplICAgICAgICAgPSBhdmlvX2Nsb3NlX2R5bl9idWYoKmR5bl9idWYsICZwa3QtPmRhdGEpOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3RyZWFtX2lkeDsKKyAgICAqZHluX2J1ZiA9IE5VTEw7CisgICAgaWYgKChyZXQgPSBhdl9wYWNrZXRfZnJvbV9kYXRhKHBrdCwgcGt0LT5kYXRhLCBwa3QtPnNpemUpKSA8IDApIHsKKyAgICAgICAgYXZfZnJlZXAoJnBrdC0+ZGF0YSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBwa3QtPnNpemU7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0MWNjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWMuaApAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIFJUUCBkZW11eGVyIGRlZmluaXRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUnlhbiBNYXJ0ZWxsIDxyZG00QG1hcnRlbGx2ZW50dXJlcy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfUlRQREVDX0gKKyNkZWZpbmUgQVZGT1JNQVRfUlRQREVDX0gKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicnRwLmgiCisjaW5jbHVkZSAidXJsLmgiCisjaW5jbHVkZSAic3J0cC5oIgorCit0eXBlZGVmIHN0cnVjdCBQYXlsb2FkQ29udGV4dCBQYXlsb2FkQ29udGV4dDsKK3R5cGVkZWYgc3RydWN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlcjsKKworI2RlZmluZSBSVFBfTUlOX1BBQ0tFVF9MRU5HVEggMTIKKyNkZWZpbmUgUlRQX01BWF9QQUNLRVRfTEVOR1RIIDgxOTIKKworI2RlZmluZSBSVFBfUkVPUkRFUl9RVUVVRV9ERUZBVUxUX1NJWkUgMTAKKworI2RlZmluZSBSVFBfTk9UU19WQUxVRSAoKHVpbnQzMl90KS0xKQorCit0eXBlZGVmIHN0cnVjdCBSVFBEZW11eENvbnRleHQgUlRQRGVtdXhDb250ZXh0OworUlRQRGVtdXhDb250ZXh0ICpmZl9ydHBfcGFyc2Vfb3BlbihBVkZvcm1hdENvbnRleHQgKnMxLCBBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXlsb2FkX3R5cGUsIGludCBxdWV1ZV9zaXplKTsKK3ZvaWQgZmZfcnRwX3BhcnNlX3NldF9keW5hbWljX3Byb3RvY29sKFJUUERlbXV4Q29udGV4dCAqcywgUGF5bG9hZENvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmhhbmRsZXIpOwordm9pZCBmZl9ydHBfcGFyc2Vfc2V0X2NyeXB0byhSVFBEZW11eENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbXMpOworaW50IGZmX3J0cF9wYXJzZV9wYWNrZXQoUlRQRGVtdXhDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKmJ1ZiwgaW50IGxlbik7Cit2b2lkIGZmX3J0cF9wYXJzZV9jbG9zZShSVFBEZW11eENvbnRleHQgKnMpOworaW50NjRfdCBmZl9ydHBfcXVldWVkX3BhY2tldF90aW1lKFJUUERlbXV4Q29udGV4dCAqcyk7Cit2b2lkIGZmX3J0cF9yZXNldF9wYWNrZXRfcXVldWUoUlRQRGVtdXhDb250ZXh0ICpzKTsKKworLyoqCisgKiBTZW5kIGEgZHVtbXkgcGFja2V0IG9uIGJvdGggcG9ydCBwYWlycyB0byBzZXQgdXAgdGhlIGNvbm5lY3Rpb24KKyAqIHN0YXRlIGluIHBvdGVudGlhbCBOQVQgcm91dGVycywgc28gdGhhdCB3ZSdyZSBhYmxlIHRvIHJlY2VpdmUKKyAqIHBhY2tldHMuCisgKgorICogTm90ZSwgdGhpcyBvbmx5IHdvcmtzIGlmIHRoZSBOQVQgcm91dGVyIGRvZXNuJ3QgcmVtYXAgcG9ydHMuIFRoaXMKKyAqIGlzbid0IGEgc3RhbmRhcmRpemVkIHByb2NlZHVyZSwgYnV0IGl0IHdvcmtzIGluIG1hbnkgY2FzZXMgaW4gcHJhY3RpY2UuCisgKgorICogVGhlIHNhbWUgcm91dGluZSBpcyB1c2VkIHdpdGggUkRUIHRvbywgZXZlbiBpZiBSRFQgZG9lc24ndCB1c2Ugbm9ybWFsCisgKiBSVFAgcGFja2V0cyBvdGhlcndpc2UuCisgKi8KK3ZvaWQgZmZfcnRwX3NlbmRfcHVuY2hfcGFja2V0cyhVUkxDb250ZXh0KiBydHBfaGFuZGxlKTsKKworLyoqCisgKiBzb21lIHJ0cCBzZXJ2ZXJzIGFzc3VtZSBjbGllbnQgaXMgZGVhZCBpZiB0aGV5IGRvbid0IGhlYXIgZnJvbSB0aGVtLi4uCisgKiBzbyB3ZSBzZW5kIGEgUmVjZWl2ZXIgUmVwb3J0IHRvIHRoZSBwcm92aWRlZCBVUkxDb250ZXh0IG9yIEFWSU9Db250ZXh0CisgKiAod2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHJ0Y3AgaGFuZGxlIGZyb20gaGVyZSkKKyAqLworaW50IGZmX3J0cF9jaGVja19hbmRfc2VuZF9iYWNrX3JyKFJUUERlbXV4Q29udGV4dCAqcywgVVJMQ29udGV4dCAqZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJT0NvbnRleHQgKmF2aW8sIGludCBjb3VudCk7CitpbnQgZmZfcnRwX3NlbmRfcnRjcF9mZWVkYmFjayhSVFBEZW11eENvbnRleHQgKnMsIFVSTENvbnRleHQgKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJT0NvbnRleHQgKmF2aW8pOworCisvLyB0aGVzZSBzdGF0aXN0aWNzIGFyZSB1c2VkIGZvciBydGNwIHJlY2VpdmVyIHJlcG9ydHMuLi4KK3R5cGVkZWYgc3RydWN0IFJUUFN0YXRpc3RpY3MgeworICAgIHVpbnQxNl90IG1heF9zZXE7ICAgICAgICAgICAvLy88IGhpZ2hlc3Qgc2VxdWVuY2UgbnVtYmVyIHNlZW4KKyAgICB1aW50MzJfdCBjeWNsZXM7ICAgICAgICAgICAgLy8vPCBzaGlmdGVkIGNvdW50IG9mIHNlcXVlbmNlIG51bWJlciBjeWNsZXMKKyAgICB1aW50MzJfdCBiYXNlX3NlcTsgICAgICAgICAgLy8vPCBiYXNlIHNlcXVlbmNlIG51bWJlcgorICAgIHVpbnQzMl90IGJhZF9zZXE7ICAgICAgICAgICAvLy88IGxhc3QgYmFkIHNlcXVlbmNlIG51bWJlciArIDEKKyAgICBpbnQgcHJvYmF0aW9uOyAgICAgICAgICAgICAgLy8vPCBzZXF1ZW5jZSBwYWNrZXRzIHRpbGwgc291cmNlIGlzIHZhbGlkCisgICAgdWludDMyX3QgcmVjZWl2ZWQ7ICAgICAgICAgIC8vLzwgcGFja2V0cyByZWNlaXZlZAorICAgIHVpbnQzMl90IGV4cGVjdGVkX3ByaW9yOyAgICAvLy88IHBhY2tldHMgZXhwZWN0ZWQgaW4gbGFzdCBpbnRlcnZhbAorICAgIHVpbnQzMl90IHJlY2VpdmVkX3ByaW9yOyAgICAvLy88IHBhY2tldHMgcmVjZWl2ZWQgaW4gbGFzdCBpbnRlcnZhbAorICAgIHVpbnQzMl90IHRyYW5zaXQ7ICAgICAgICAgICAvLy88IHJlbGF0aXZlIHRyYW5zaXQgdGltZSBmb3IgcHJldmlvdXMgcGFja2V0CisgICAgdWludDMyX3Qgaml0dGVyOyAgICAgICAgICAgIC8vLzwgZXN0aW1hdGVkIGppdHRlci4KK30gUlRQU3RhdGlzdGljczsKKworI2RlZmluZSBSVFBfRkxBR19LRVkgICAgMHgxIC8vLzwgUlRQIHBhY2tldCBjb250YWlucyBhIGtleWZyYW1lCisjZGVmaW5lIFJUUF9GTEFHX01BUktFUiAweDIgLy8vPCBSVFAgbWFya2VyIGJpdCB3YXMgc2V0IGZvciB0aGlzIHBhY2tldAorLyoqCisgKiBQYWNrZXQgcGFyc2luZyBmb3IgInByaXZhdGUiIHBheWxvYWRzIGluIHRoZSBSVFAgc3BlY3MuCisgKgorICogQHBhcmFtIGN0eCBSVFNQIGRlbXV4ZXIgY29udGV4dAorICogQHBhcmFtIHMgc3RyZWFtIGNvbnRleHQKKyAqIEBwYXJhbSBzdCBzdHJlYW0gdGhhdCB0aGlzIHBhY2tldCBiZWxvbmdzIHRvCisgKiBAcGFyYW0gcGt0IHBhY2tldCBpbiB3aGljaCB0byB3cml0ZSB0aGUgcGFyc2VkIGRhdGEKKyAqIEBwYXJhbSB0aW1lc3RhbXAgcG9pbnRlciB0byB0aGUgUlRQIHRpbWVzdGFtcCBvZiB0aGUgaW5wdXQgZGF0YSwgY2FuIGJlCisgKiAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uIGlmIHJldHVybmluZyBvbGRlciwgYnVmZmVyZWQgZGF0YQorICogQHBhcmFtIGJ1ZiBwb2ludGVyIHRvIHJhdyBSVFAgcGFja2V0IGRhdGEKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIGJ1ZgorICogQHBhcmFtIHNlcSBSVFAgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBwYWNrZXQKKyAqIEBwYXJhbSBmbGFncyBmbGFncyBmcm9tIHRoZSBSVFAgcGFja2V0IGhlYWRlciAoUlRQX0ZMQUdfKikKKyAqLwordHlwZWRlZiBpbnQgKCpEeW5hbWljUGF5bG9hZFBhY2tldEhhbmRsZXJQcm9jKShBVkZvcm1hdENvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgdWludDE2X3Qgc2VxLCBpbnQgZmxhZ3MpOworCitzdHJ1Y3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciB7CisgICAgY29uc3QgY2hhciBlbmNfbmFtZVs1MF07CisgICAgZW51bSBBVk1lZGlhVHlwZSBjb2RlY190eXBlOworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkOworICAgIGludCBzdGF0aWNfcGF5bG9hZF9pZDsgLyogMCBtZWFucyBubyBwYXlsb2FkIGlkIGlzIHNldC4gMCBpcyBhIHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYXlsb2FkIElEIChQQ01VKSwgdG9vLCBidXQgdGhhdCBmb3JtYXQgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVxdWlyZSBhbnkgY3VzdG9tIGRlcGFja2V0aXphdGlvbiBjb2RlLiAqLworCisgICAgLyoqIEluaXRpYWxpemUgZHluYW1pYyBwcm90b2NvbCBoYW5kbGVyLCBjYWxsZWQgYWZ0ZXIgdGhlIGZ1bGwgcnRwbWFwIGxpbmUgaXMgcGFyc2VkLCBtYXkgYmUgbnVsbCAqLworICAgIGludCAoKmluaXQpKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0X2luZGV4LCBQYXlsb2FkQ29udGV4dCAqcHJpdl9kYXRhKTsKKyAgICAvKiogUGFyc2UgdGhlIGE9IGxpbmUgZnJvbSB0aGUgc2RwIGZpZWxkICovCisgICAgaW50ICgqcGFyc2Vfc2RwX2FfbGluZSkoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZENvbnRleHQgKnByaXZfZGF0YSwgY29uc3QgY2hhciAqbGluZSk7CisgICAgLyoqIEFsbG9jYXRlIGFueSBkYXRhIG5lZWRlZCBieSB0aGUgcnRwIHBhcnNpbmcgZm9yIHRoaXMgZHluYW1pYyBkYXRhLiAqLworICAgIFBheWxvYWRDb250ZXh0ICooKmFsbG9jKSh2b2lkKTsKKyAgICAvKiogRnJlZSBhbnkgZGF0YSBuZWVkZWQgYnkgdGhlIHJ0cCBwYXJzaW5nIGZvciB0aGlzIGR5bmFtaWMgZGF0YS4gKi8KKyAgICB2b2lkICgqZnJlZSkoUGF5bG9hZENvbnRleHQgKnByb3RvY29sX2RhdGEpOworICAgIC8qKiBQYXJzZSBoYW5kbGVyIGZvciB0aGlzIGR5bmFtaWMgcGFja2V0ICovCisgICAgRHluYW1pY1BheWxvYWRQYWNrZXRIYW5kbGVyUHJvYyBwYXJzZV9wYWNrZXQ7CisgICAgaW50ICgqbmVlZF9rZXlmcmFtZSkoUGF5bG9hZENvbnRleHQgKmNvbnRleHQpOworCisgICAgc3RydWN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKm5leHQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBSVFBQYWNrZXQgeworICAgIHVpbnQxNl90IHNlcTsKKyAgICB1aW50OF90ICpidWY7CisgICAgaW50IGxlbjsKKyAgICBpbnQ2NF90IHJlY3Z0aW1lOworICAgIHN0cnVjdCBSVFBQYWNrZXQgKm5leHQ7Cit9IFJUUFBhY2tldDsKKworc3RydWN0IFJUUERlbXV4Q29udGV4dCB7CisgICAgQVZGb3JtYXRDb250ZXh0ICppYzsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IHBheWxvYWRfdHlwZTsKKyAgICB1aW50MzJfdCBzc3JjOworICAgIHVpbnQxNl90IHNlcTsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXA7CisgICAgdWludDMyX3QgYmFzZV90aW1lc3RhbXA7CisgICAgdWludDMyX3QgY3VyX3RpbWVzdGFtcDsKKyAgICBpbnQ2NF90ICB1bndyYXBwZWRfdGltZXN0YW1wOworICAgIGludDY0X3QgIHJhbmdlX3N0YXJ0X29mZnNldDsKKyAgICBpbnQgbWF4X3BheWxvYWRfc2l6ZTsKKyAgICAvKiB1c2VkIHRvIHNlbmQgYmFjayBSVENQIFJSICovCisgICAgY2hhciBob3N0bmFtZVsyNTZdOworCisgICAgaW50IHNydHBfZW5hYmxlZDsKKyAgICBzdHJ1Y3QgU1JUUENvbnRleHQgc3J0cDsKKworICAgIC8qKiBTdGF0aXN0aWNzIGZvciB0aGlzIHN0cmVhbSAodXNlZCBieSBSVENQIHJlY2VpdmVyIHJlcG9ydHMpICovCisgICAgUlRQU3RhdGlzdGljcyBzdGF0aXN0aWNzOworCisgICAgLyoqIEZpZWxkcyBmb3IgcGFja2V0IHJlb3JkZXJpbmcgQHsgKi8KKyAgICBpbnQgcHJldl9yZXQ7ICAgICAvLy88IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdHVhbCBwYXJzaW5nIG9mIHRoZSBwcmV2aW91cyBwYWNrZXQKKyAgICBSVFBQYWNrZXQqIHF1ZXVlOyAvLy88IEEgc29ydGVkIHF1ZXVlIG9mIGJ1ZmZlcmVkIHBhY2tldHMgbm90IHlldCByZXR1cm5lZAorICAgIGludCBxdWV1ZV9sZW47ICAgIC8vLzwgVGhlIG51bWJlciBvZiBwYWNrZXRzIGluIHF1ZXVlCisgICAgaW50IHF1ZXVlX3NpemU7ICAgLy8vPCBUaGUgc2l6ZSBvZiBxdWV1ZSwgb3IgMCBpZiByZW9yZGVyaW5nIGlzIGRpc2FibGVkCisgICAgLypAfSovCisKKyAgICAvKiBydGNwIHNlbmRlciBzdGF0aXN0aWNzIHJlY2VpdmUgKi8KKyAgICB1aW50NjRfdCBsYXN0X3J0Y3BfbnRwX3RpbWU7CisgICAgaW50NjRfdCBsYXN0X3J0Y3BfcmVjZXB0aW9uX3RpbWU7CisgICAgdWludDY0X3QgZmlyc3RfcnRjcF9udHBfdGltZTsKKyAgICB1aW50MzJfdCBsYXN0X3J0Y3BfdGltZXN0YW1wOworICAgIGludDY0X3QgcnRjcF90c19vZmZzZXQ7CisKKyAgICAvKiBydGNwIHNlbmRlciBzdGF0aXN0aWNzICovCisgICAgdW5zaWduZWQgaW50IHBhY2tldF9jb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgb2N0ZXRfY291bnQ7CisgICAgdW5zaWduZWQgaW50IGxhc3Rfb2N0ZXRfY291bnQ7CisgICAgaW50NjRfdCBsYXN0X2ZlZWRiYWNrX3RpbWU7CisKKyAgICAvKiBkeW5hbWljIHBheWxvYWQgc3R1ZmYgKi8KKyAgICBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyOworICAgIFBheWxvYWRDb250ZXh0ICpkeW5hbWljX3Byb3RvY29sX2NvbnRleHQ7Cit9OworCit2b2lkIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmhhbmRsZXIpOworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqZmZfcnRwX2hhbmRsZXJfZmluZF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgY29kZWNfdHlwZSk7CitSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpmZl9ydHBfaGFuZGxlcl9maW5kX2J5X2lkKGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgY29kZWNfdHlwZSk7CisKKy8qIGZyb20gcnRzcC5jLCBidXQgdXNlZCBieSBydHAgZHluYW1pYyBwcm90b2NvbCBoYW5kbGVycy4gKi8KK2ludCBmZl9ydHNwX25leHRfYXR0cl9hbmRfdmFsdWUoY29uc3QgY2hhciAqKnAsIGNoYXIgKmF0dHIsIGludCBhdHRyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlLCBpbnQgdmFsdWVfc2l6ZSk7CisKK2ludCBmZl9wYXJzZV9mbXRwKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdHJlYW0sIFBheWxvYWRDb250ZXh0ICpkYXRhLCBjb25zdCBjaGFyICpwLAorICAgICAgICAgICAgICAgICAgaW50ICgqcGFyc2VfZm10cCkoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYXR0ciwgY2hhciAqdmFsdWUpKTsKKwordm9pZCBmZl9yZWdpc3Rlcl9ydHBfZHluYW1pY19wYXlsb2FkX2hhbmRsZXJzKHZvaWQpOworCisvKioKKyAqIENsb3NlIHRoZSBkeW5hbWljIGJ1ZmZlciBhbmQgbWFrZSBhIHBhY2tldCBmcm9tIGl0LgorICovCitpbnQgZmZfcnRwX2ZpbmFsaXplX3BhY2tldChBVlBhY2tldCAqcGt0LCBBVklPQ29udGV4dCAqKmR5bl9idWYsIGludCBzdHJlYW1faWR4KTsKKworI2VuZGlmIC8qIEFWRk9STUFUX1JUUERFQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2Ftci5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19hbXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFjZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19hbXIuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIFJUUCBBTVIgRGVwYWNrZXRpemVyLCBSRkMgMzI2NworICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJ0cGRlY19mb3JtYXRzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGZyYW1lX3NpemVzX25iWzE2XSA9IHsKKyAgICAxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsIDUsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CitzdGF0aWMgY29uc3QgdWludDhfdCBmcmFtZV9zaXplc193YlsxNl0gPSB7CisgICAgMTcsIDIzLCAzMiwgMzYsIDQwLCA0NiwgNTAsIDU4LCA2MCwgNSwgNSwgMCwgMCwgMCwgMCwgMAorfTsKKworc3RydWN0IFBheWxvYWRDb250ZXh0IHsKKyAgICBpbnQgb2N0ZXRfYWxpZ247CisgICAgaW50IGNyYzsKKyAgICBpbnQgaW50ZXJsZWF2aW5nOworICAgIGludCBjaGFubmVsczsKK307CisKK3N0YXRpYyBQYXlsb2FkQ29udGV4dCAqYW1yX25ld19jb250ZXh0KHZvaWQpCit7CisgICAgUGF5bG9hZENvbnRleHQgKmRhdGEgPSBhdl9tYWxsb2N6KHNpemVvZihQYXlsb2FkQ29udGV4dCkpOworICAgIGlmKCFkYXRhKSByZXR1cm4gZGF0YTsKKyAgICBkYXRhLT5jaGFubmVscyA9IDE7CisgICAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGFtcl9mcmVlX2NvbnRleHQoUGF5bG9hZENvbnRleHQgKmRhdGEpCit7CisgICAgYXZfZnJlZShkYXRhKTsKK30KKworc3RhdGljIGludCBhbXJfaGFuZGxlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmN0eCwgUGF5bG9hZENvbnRleHQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCwgdWludDMyX3QgKnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuLCB1aW50MTZfdCBzZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBjb25zdCB1aW50OF90ICpmcmFtZV9zaXplcyA9IE5VTEw7CisgICAgaW50IGZyYW1lczsKKyAgICBpbnQgaTsKKyAgICBjb25zdCB1aW50OF90ICpzcGVlY2hfZGF0YTsKKyAgICB1aW50OF90ICpwdHI7CisKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTVJfTkIpIHsKKyAgICAgICAgZnJhbWVfc2l6ZXMgPSBmcmFtZV9zaXplc19uYjsKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX1dCKSB7CisgICAgICAgIGZyYW1lX3NpemVzID0gZnJhbWVfc2l6ZXNfd2I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQmFkIGNvZGVjIElEXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgIT0gMSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPbmx5IG1vbm8gQU1SIGlzIHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisKKyAgICAvKiBUaGUgQU1SIFJUUCBwYWNrZXQgY29uc2lzdHMgb2Ygb25lIGhlYWRlciBieXRlLCBmb2xsb3dlZAorICAgICAqIGJ5IG9uZSBUT0MgYnl0ZSBmb3IgZWFjaCBBTVIgZnJhbWUgaW4gdGhlIHBhY2tldCwgZm9sbG93ZWQKKyAgICAgKiBieSB0aGUgc3BlZWNoIGRhdGEgZm9yIGFsbCB0aGUgQU1SIGZyYW1lcy4KKyAgICAgKgorICAgICAqIFRoZSBoZWFkZXIgYnl0ZSBjb250YWlucyBvbmx5IGEgY29kZWMgbW9kZSByZXF1ZXN0LCBmb3IKKyAgICAgKiByZXF1ZXN0aW5nIHdoYXQga2luZCBvZiBBTVIgZGF0YSB0aGUgc2VuZGVyIHdhbnRzIHRvCisgICAgICogcmVjZWl2ZS4gTm90IHVzZWQgYXQgdGhlIG1vbWVudC4KKyAgICAgKi8KKworICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBwYWNrZXQuIFRoZSBoaWdoZXN0IGJpdAorICAgICAqIGlzIHNldCBpbiBhIFRPQyBieXRlIGlmIHRoZXJlIGFyZSBtb3JlIGZyYW1lcyBmb2xsb3dpbmcuCisgICAgICovCisgICAgZm9yIChmcmFtZXMgPSAxOyBmcmFtZXMgPCBsZW4gJiYgKGJ1ZltmcmFtZXNdICYgMHg4MCk7IGZyYW1lcysrKSA7CisKKyAgICBpZiAoMSArIGZyYW1lcyA+PSBsZW4pIHsKKyAgICAgICAgLyogV2UgaGl0IHRoZSBlbmQgb2YgdGhlIHBhY2tldCB3aGlsZSBjb3VudGluZyBmcmFtZXMuICovCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIHNwZWVjaCBkYXRhIGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3BlZWNoX2RhdGEgPSBidWYgKyAxICsgZnJhbWVzOworCisgICAgLyogRXZlcnl0aGluZyBleGNlcHQgdGhlIGNvZGVjIG1vZGUgcmVxdWVzdCBieXRlIHNob3VsZCBiZSBvdXRwdXQuICovCisgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBsZW4gLSAxKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgcHRyID0gcGt0LT5kYXRhOworCisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lczsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgdG9jID0gYnVmWzEgKyBpXTsKKyAgICAgICAgaW50IGZyYW1lX3NpemUgPSBmcmFtZV9zaXplc1sodG9jID4+IDMpICYgMHgwZl07CisKKyAgICAgICAgaWYgKHNwZWVjaF9kYXRhICsgZnJhbWVfc2l6ZSA+IGJ1ZiArIGxlbikgeworICAgICAgICAgICAgLyogVG9vIGxpdHRsZSBzcGVlY2ggZGF0YSAqLworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJUb28gbGl0dGxlIHNwZWVjaCBkYXRhIGluIHRoZSBSVFAgcGFja2V0XG4iKTsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgdW53cml0dGVuIHBhcnQgb2YgdGhlIHBhY2tldCB0byB6ZXJvLiAqLworICAgICAgICAgICAgbWVtc2V0KHB0ciwgMCwgcGt0LT5kYXRhICsgcGt0LT5zaXplIC0gcHRyKTsKKyAgICAgICAgICAgIHBrdC0+c2l6ZSA9IHB0ciAtIHBrdC0+ZGF0YTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyogRXh0cmFjdCB0aGUgQU1SIGZyYW1lIG1vZGUgZnJvbSB0aGUgVE9DIGJ5dGUgKi8KKyAgICAgICAgKnB0cisrID0gdG9jICYgMHg3QzsKKworICAgICAgICAvKiBDb3B5IHRoZSBzcGVlY2ggZGF0YSAqLworICAgICAgICBtZW1jcHkocHRyLCBzcGVlY2hfZGF0YSwgZnJhbWVfc2l6ZSk7CisgICAgICAgIHNwZWVjaF9kYXRhICs9IGZyYW1lX3NpemU7CisgICAgICAgIHB0ciArPSBmcmFtZV9zaXplOworICAgIH0KKworICAgIGlmIChzcGVlY2hfZGF0YSA8IGJ1ZiArIGxlbikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIlRvbyBtdWNoIHNwZWVjaCBkYXRhIGluIHRoZSBSVFAgcGFja2V0P1xuIik7CisgICAgICAgIC8qIFNldCB0aGUgdW53cml0dGVuIHBhcnQgb2YgdGhlIHBhY2tldCB0byB6ZXJvLiAqLworICAgICAgICBtZW1zZXQocHRyLCAwLCBwa3QtPmRhdGEgKyBwa3QtPnNpemUgLSBwdHIpOworICAgICAgICBwa3QtPnNpemUgPSBwdHIgLSBwa3QtPmRhdGE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1yX3BhcnNlX2ZtdHAoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3RyZWFtLCBQYXlsb2FkQ29udGV4dCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYXR0ciwgY2hhciAqdmFsdWUpCit7CisgICAgLyogU29tZSBBTVIgU0RQIGNvbmZpZ3VyYXRpb25zIGNvbnRhaW4gIm9jdGV0LWFsaWduIiwgd2l0aG91dAorICAgICAqIHRoZSB0cmFpbGluZyA9MS4gVGhlcmVmb3JlLCBpZiB0aGUgdmFsdWUgaXMgZW1wdHksCisgICAgICogaW50ZXJwcmV0IGl0IGFzICIxIi4KKyAgICAgKi8KKyAgICBpZiAoIXN0cmNtcCh2YWx1ZSwgIiIpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkFNUiBmbXRwIGF0dHJpYnV0ZSAlcyBoYWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25zdGFuZGFyZCBlbXB0eSB2YWx1ZVxuIiwgYXR0cik7CisgICAgICAgIHN0cmNweSh2YWx1ZSwgIjEiKTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoYXR0ciwgIm9jdGV0LWFsaWduIikpCisgICAgICAgIGRhdGEtPm9jdGV0X2FsaWduID0gYXRvaSh2YWx1ZSk7CisgICAgZWxzZSBpZiAoIXN0cmNtcChhdHRyLCAiY3JjIikpCisgICAgICAgIGRhdGEtPmNyYyA9IGF0b2kodmFsdWUpOworICAgIGVsc2UgaWYgKCFzdHJjbXAoYXR0ciwgImludGVybGVhdmluZyIpKQorICAgICAgICBkYXRhLT5pbnRlcmxlYXZpbmcgPSBhdG9pKHZhbHVlKTsKKyAgICBlbHNlIGlmICghc3RyY21wKGF0dHIsICJjaGFubmVscyIpKQorICAgICAgICBkYXRhLT5jaGFubmVscyA9IGF0b2kodmFsdWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtcl9wYXJzZV9zZHBfbGluZShBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpkYXRhLCBjb25zdCBjaGFyICpsaW5lKQoreworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaW50IHJldDsKKworICAgIGlmIChzdF9pbmRleCA8IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogUGFyc2UgYW4gZm10cCBsaW5lIHRoaXMgb25lOgorICAgICAqIGE9Zm10cDo5NyBvY3RldC1hbGlnbj0xOyBpbnRlcmxlYXZpbmc9MAorICAgICAqIFRoYXQgaXMsIGEgbm9ybWFsIGZtdHA6IGxpbmUgZm9sbG93ZWQgYnkgc2VtaWNvbG9uICYgc3BhY2UKKyAgICAgKiBzZXBhcmF0ZWQga2V5L3ZhbHVlIHBhaXJzLgorICAgICAqLworICAgIGlmIChhdl9zdHJzdGFydChsaW5lLCAiZm10cDoiLCAmcCkpIHsKKyAgICAgICAgcmV0ID0gZmZfcGFyc2VfZm10cChzLCBzLT5zdHJlYW1zW3N0X2luZGV4XSwgZGF0YSwgcCwgYW1yX3BhcnNlX2ZtdHApOworICAgICAgICBpZiAoIWRhdGEtPm9jdGV0X2FsaWduIHx8IGRhdGEtPmNyYyB8fAorICAgICAgICAgICAgZGF0YS0+aW50ZXJsZWF2aW5nIHx8IGRhdGEtPmNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBSVFAvQU1SIGNvbmZpZ3VyYXRpb24hXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9hbXJfbmJfZHluYW1pY19oYW5kbGVyID0geworICAgIC5lbmNfbmFtZSAgICAgICAgID0gIkFNUiIsCisgICAgLmNvZGVjX3R5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9BTVJfTkIsCisgICAgLnBhcnNlX3NkcF9hX2xpbmUgPSBhbXJfcGFyc2Vfc2RwX2xpbmUsCisgICAgLmFsbG9jICAgICAgICAgICAgPSBhbXJfbmV3X2NvbnRleHQsCisgICAgLmZyZWUgICAgICAgICAgICAgPSBhbXJfZnJlZV9jb250ZXh0LAorICAgIC5wYXJzZV9wYWNrZXQgICAgID0gYW1yX2hhbmRsZV9wYWNrZXQsCit9OworCitSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2Ftcl93Yl9keW5hbWljX2hhbmRsZXIgPSB7CisgICAgLmVuY19uYW1lICAgICAgICAgPSAiQU1SLVdCIiwKKyAgICAuY29kZWNfdHlwZSAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuY29kZWNfaWQgICAgICAgICA9IEFWX0NPREVDX0lEX0FNUl9XQiwKKyAgICAucGFyc2Vfc2RwX2FfbGluZSA9IGFtcl9wYXJzZV9zZHBfbGluZSwKKyAgICAuYWxsb2MgICAgICAgICAgICA9IGFtcl9uZXdfY29udGV4dCwKKyAgICAuZnJlZSAgICAgICAgICAgICA9IGFtcl9mcmVlX2NvbnRleHQsCisgICAgLnBhcnNlX3BhY2tldCAgICAgPSBhbXJfaGFuZGxlX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2FzZi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19hc2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGMwYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19hc2YuYwpAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIE1pY3Jvc29mdCBSVFAvQVNGIHN1cHBvcnQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUm9uYWxkIFMuIEJ1bHRqZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgTWljcm9zb2Z0IFJUUC9BU0Ygc3VwcG9ydAorICogQGF1dGhvciBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9iYXNlNjQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAicnRwLmgiCisjaW5jbHVkZSAicnRwZGVjX2Zvcm1hdHMuaCIKKyNpbmNsdWRlICJydHNwLmgiCisjaW5jbHVkZSAiYXNmLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qKgorICogRnJvbSBNU0ROIDIuMi4xLjQsIHdlIGxlYXJuIHRoYXQgQVNGIGRhdGEgcGFja2V0cyBvdmVyIFJUUCBzaG91bGQgbm90CisgKiBjb250YWluIGFueSBwYWRkaW5nLiBVbmZvcnR1bmF0ZWx5LCB0aGUgaGVhZGVyIG1pbi9tYXhfcGt0c2l6ZSBhcmUgbm90CisgKiB1cGRhdGVkICh0aHVzIG1ha2luZyBtaW5fcGt0c2l6ZSBpbnZhbGlkKS4gSGVyZSwgd2UgImZpeCIgdGhlc2UgZmF1bHR5CisgKiBtaW5fcGt0c2l6ZSB2YWx1ZXMgaW4gdGhlIEFTRiBmaWxlIGhlYWRlci4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlIChjdXJyZW50bHkgLTEpLgorICovCitzdGF0aWMgaW50IHJ0cF9hc2ZfZml4X2hlYWRlcih1aW50OF90ICpidWYsIGludCBsZW4pCit7CisgICAgdWludDhfdCAqcCA9IGJ1ZiwgKmVuZCA9IGJ1ZiArIGxlbjsKKworICAgIGlmIChsZW4gPCBzaXplb2YoZmZfYXNmX2d1aWQpICogMiArIDIyIHx8CisgICAgICAgIG1lbWNtcChwLCBmZl9hc2ZfaGVhZGVyLCBzaXplb2YoZmZfYXNmX2d1aWQpKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHAgKz0gc2l6ZW9mKGZmX2FzZl9ndWlkKSArIDE0OworICAgIGRvIHsKKyAgICAgICAgdWludDY0X3QgY2h1bmtzaXplID0gQVZfUkw2NChwICsgc2l6ZW9mKGZmX2FzZl9ndWlkKSk7CisgICAgICAgIGlmIChtZW1jbXAocCwgZmZfYXNmX2ZpbGVfaGVhZGVyLCBzaXplb2YoZmZfYXNmX2d1aWQpKSkgeworICAgICAgICAgICAgaWYgKGNodW5rc2l6ZSA+IGVuZCAtIHApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcCArPSBjaHVua3NpemU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNraXAgbW9zdCBvZiB0aGUgZmlsZSBoZWFkZXIsIHRvIG1pbl9wa3RzaXplICovCisgICAgICAgIHAgKz0gNiAqIDggKyAzICogNCArIHNpemVvZihmZl9hc2ZfZ3VpZCkgKiAyOworICAgICAgICBpZiAocCArIDggPD0gZW5kICYmIEFWX1JMMzIocCkgPT0gQVZfUkwzMihwICsgNCkpIHsKKyAgICAgICAgICAgIC8qIGFuZCBzZXQgdGhhdCB0byB6ZXJvICovCisgICAgICAgICAgICBBVl9XTDMyKHAsIDApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfSB3aGlsZSAoZW5kIC0gcCA+PSBzaXplb2YoZmZfYXNmX2d1aWQpICsgOCk7CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGJhc2ljYWxseSBhIGJ1ZmZlcmVkIEFWSU9Db250ZXh0LAorICogd2l0aCB0aGUgYWRkZWQgYmVuZWZpdCBvZiByZXR1cm5pbmcgLUVBR0FJTiAoaW5zdGVhZCBvZiAwKQorICogb24gcGFja2V0IGJvdW5kYXJpZXMsIHN1Y2ggdGhhdCB0aGUgQVNGIGRlbXV4ZXIgY2FuIHJldHVybgorICogc2FmZWx5IGFuZCByZXN1bWUgYnVzaW5lc3MgYXQgdGhlIG5leHQgcGFja2V0LgorICovCitzdGF0aWMgaW50IHBhY2tldGl6ZXJfcmVhZCh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcGFja2V0aXplcihBVklPQ29udGV4dCAqcGIsIHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICBmZmlvX2luaXRfY29udGV4dChwYiwgYnVmLCBsZW4sIDAsIE5VTEwsIHBhY2tldGl6ZXJfcmVhZCwgTlVMTCwgTlVMTCk7CisKKyAgICAvKiB0aGlzICJmaWxscyIgdGhlIGJ1ZmZlciB3aXRoIGl0cyBjdXJyZW50IGNvbnRlbnQgKi8KKyAgICBwYi0+cG9zICAgICA9IGxlbjsKKyAgICBwYi0+YnVmX2VuZCA9IGJ1ZiArIGxlbjsKK30KKworaW50IGZmX3dtc19wYXJzZV9zZHBfYV9saW5lKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqcCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpZiAoYXZfc3Ryc3RhcnQocCwgInBnbXB1OmRhdGE6YXBwbGljYXRpb24vdm5kLm1zLndtcy1oZHIuYXNmdjE7YmFzZTY0LCIsICZwKSkgeworICAgICAgICBBVklPQ29udGV4dCBwYjsKKyAgICAgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICAgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKKyAgICAgICAgaW50IGxlbiA9IHN0cmxlbihwKSAqIDYgLyA4OworICAgICAgICBjaGFyICpidWYgPSBhdl9tYWxsb2N6KGxlbik7CisgICAgICAgIEFWSW5wdXRGb3JtYXQgKmlmb3JtYXQ7CisKKyAgICAgICAgYXZfYmFzZTY0X2RlY29kZShidWYsIHAsIGxlbik7CisKKyAgICAgICAgaWYgKHJ0cF9hc2ZfZml4X2hlYWRlcihidWYsIGxlbikgPCAwKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZpeCBpbnZhbGlkIFJUU1AtTVMvQVNGIG1pbl9wa3RzaXplXG4iKTsKKyAgICAgICAgaW5pdF9wYWNrZXRpemVyKCZwYiwgYnVmLCBsZW4pOworICAgICAgICBpZiAocnQtPmFzZl9jdHgpIHsKKyAgICAgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZydC0+YXNmX2N0eCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoaWZvcm1hdCA9IGF2X2ZpbmRfaW5wdXRfZm9ybWF0KCJhc2YiKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9ERU1VWEVSX05PVF9GT1VORDsKKyAgICAgICAgaWYgKCEocnQtPmFzZl9jdHggPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcnQtPmFzZl9jdHgtPnBiICAgICAgPSAmcGI7CisgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibm9fcmVzeW5jX3NlYXJjaCIsICIxIiwgMCk7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9jb3B5X3doaXRlbGlzdHMocnQtPmFzZl9jdHgsIHMpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmcnQtPmFzZl9jdHgsICIiLCBpZm9ybWF0LCAmb3B0cyk7CisgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYXZfZGljdF9jb3B5KCZzLT5tZXRhZGF0YSwgcnQtPmFzZl9jdHgtPm1ldGFkYXRhLCAwKTsKKyAgICAgICAgcnQtPmFzZl9wYl9wb3MgPSBhdmlvX3RlbGwoJnBiKTsKKyAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICBydC0+YXNmX2N0eC0+cGIgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFzZnJ0cF9wYXJzZV9zZHBfbGluZShBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkQ29udGV4dCAqYXNmLCBjb25zdCBjaGFyICpsaW5lKQoreworICAgIGlmIChzdHJlYW1faW5kZXggPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYXZfc3Ryc3RhcnQobGluZSwgInN0cmVhbToiLCAmbGluZSkpIHsKKyAgICAgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKworICAgICAgICBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmlkID0gc3RydG9sKGxpbmUsIE5VTEwsIDEwKTsKKworICAgICAgICBpZiAocnQtPmFzZl9jdHgpIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcnQtPmFzZl9jdHgtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmlkID09IHJ0LT5hc2ZfY3R4LT5zdHJlYW1zW2ldLT5pZCkgeworICAgICAgICAgICAgICAgICAgICAqcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5jb2RlYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAqcnQtPmFzZl9jdHgtPnN0cmVhbXNbaV0tPmNvZGVjOworICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPm5lZWRfcGFyc2luZyA9CisgICAgICAgICAgICAgICAgICAgICAgICBydC0+YXNmX2N0eC0+c3RyZWFtc1tpXS0+bmVlZF9wYXJzaW5nOworICAgICAgICAgICAgICAgICAgICBydC0+YXNmX2N0eC0+c3RyZWFtc1tpXS0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcnQtPmFzZl9jdHgtPnN0cmVhbXNbaV0tPmNvZGVjLT5leHRyYWRhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XSwgMzIsIDEsIDEwMDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBQYXlsb2FkQ29udGV4dCB7CisgICAgQVZJT0NvbnRleHQgKnBrdGJ1ZiwgcGI7CisgICAgdWludDhfdCAqYnVmOworfTsKKworLyoqCisgKiBAcmV0dXJuIDAgd2hlbiBhIHBhY2tldCB3YXMgd3JpdHRlbiBpbnRvIC9wIHBrdCwgYW5kIG5vIG1vcmUgZGF0YSBpcyBsZWZ0OworICogICAgICAgICAxIHdoZW4gYSBwYWNrZXQgd2FzIHdyaXR0ZW4gaW50byAvcCBwa3QsIGFuZCBtb3JlIHBhY2tldHMgbWlnaHQgYmUgbGVmdDsKKyAqICAgICAgICA8MCB3aGVuIG5vdCBlbm91Z2ggZGF0YSB3YXMgcHJvdmlkZWQgdG8gcmV0dXJuIGEgZnVsbCBwYWNrZXQsIG9yIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IGFzZnJ0cF9wYXJzZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBQYXlsb2FkQ29udGV4dCAqYXNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgdWludDE2X3Qgc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSAmYXNmLT5wYjsKKyAgICBpbnQgcmVzLCBtZmxhZ3MsIGxlbl9vZmY7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmICghcnQtPmFzZl9jdHgpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIGludCBvZmYsIG91dF9sZW4gPSAwOworCisgICAgICAgIGlmIChsZW4gPCA0KQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGF2X2ZyZWVwKCZhc2YtPmJ1Zik7CisKKyAgICAgICAgZmZpb19pbml0X2NvbnRleHQocGIsICh1aW50OF90ICopYnVmLCBsZW4sIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgICAgIHdoaWxlIChhdmlvX3RlbGwocGIpICsgNCA8IGxlbikgeworICAgICAgICAgICAgaW50IHN0YXJ0X29mZiA9IGF2aW9fdGVsbChwYik7CisKKyAgICAgICAgICAgIG1mbGFncyA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgaWYgKG1mbGFncyAmIDB4ODApCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gUlRQX0ZMQUdfS0VZOworICAgICAgICAgICAgbGVuX29mZiA9IGF2aW9fcmIyNChwYik7CisgICAgICAgICAgICBpZiAobWZsYWdzICYgMHgyMCkgICAvKio8IHJlbGF0aXZlIHRpbWVzdGFtcCAqLworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgICAgICAgICBpZiAobWZsYWdzICYgMHgxMCkgICAvKio8IGhhcyBkdXJhdGlvbiAqLworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgICAgICAgICBpZiAobWZsYWdzICYgMHg4KSAgICAvKio8IGhhcyBsb2NhdGlvbiBJRCAqLworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgICAgICAgICBvZmYgPSBhdmlvX3RlbGwocGIpOworCisgICAgICAgICAgICBpZiAoIShtZmxhZ3MgJiAweDQwKSkgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIElmIDB4NDAgaXMgbm90IHNldCwgdGhlIGxlbl9vZmYgZmllbGQgc3BlY2lmaWVzIGFuIG9mZnNldAorICAgICAgICAgICAgICAgICAqIG9mIHRoaXMgcGFja2V0J3MgcGF5bG9hZCBkYXRhIGluIHRoZSBjb21wbGV0ZSAocmVhc3NlbWJsZWQpCisgICAgICAgICAgICAgICAgICogQVNGIHBhY2tldC4gVGhpcyBpcyB1c2VkIHRvIHNwcmVhZCBvbmUgQVNGIHBhY2tldCBvdmVyCisgICAgICAgICAgICAgICAgICogbXVsdGlwbGUgUlRQIHBhY2tldHMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGFzZi0+cGt0YnVmICYmIGxlbl9vZmYgIT0gYXZpb190ZWxsKGFzZi0+cGt0YnVmKSkgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwOworICAgICAgICAgICAgICAgICAgICBhdmlvX2Nsb3NlX2R5bl9idWYoYXNmLT5wa3RidWYsICZwKTsKKyAgICAgICAgICAgICAgICAgICAgYXNmLT5wa3RidWYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKHApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWxlbl9vZmYgJiYgIWFzZi0+cGt0YnVmICYmCisgICAgICAgICAgICAgICAgICAgIChyZXMgPSBhdmlvX29wZW5fZHluX2J1ZigmYXNmLT5wa3RidWYpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgaWYgKCFhc2YtPnBrdGJ1ZikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgICAgICAgICAgICAgIGF2aW9fd3JpdGUoYXNmLT5wa3RidWYsIGJ1ZiArIG9mZiwgbGVuIC0gb2ZmKTsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIGxlbiAtIG9mZik7CisgICAgICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBSVFBfRkxBR19NQVJLRVIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgb3V0X2xlbiAgICAgPSBhdmlvX2Nsb3NlX2R5bl9idWYoYXNmLT5wa3RidWYsICZhc2YtPmJ1Zik7CisgICAgICAgICAgICAgICAgYXNmLT5wa3RidWYgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBJZiAweDQwIGlzIHNldCwgdGhlIGxlbl9vZmYgZmllbGQgc3BlY2lmaWVzIHRoZSBsZW5ndGggb2YKKyAgICAgICAgICAgICAgICAgKiB0aGUgbmV4dCBBU0YgcGFja2V0IHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIHBheWxvYWQKKyAgICAgICAgICAgICAgICAgKiBkYXRhIGFsb25lLiBUaGlzIGlzIGNvbW1vbmx5IHRoZSBzYW1lIGFzIHRoZSBwYXlsb2FkIHNpemUsCisgICAgICAgICAgICAgICAgICogYnV0IGNvdWxkIGJlIGxlc3MgaW4gY2FzZSBvZiBwYWNrZXQgc3BsaXR0aW5nIChpLmUuCisgICAgICAgICAgICAgICAgICogbXVsdGlwbGUgQVNGIHBhY2tldHMgaW4gb25lIFJUUCBwYWNrZXQpLgorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgaW50IGN1cl9sZW4gPSBzdGFydF9vZmYgKyBsZW5fb2ZmIC0gb2ZmOworICAgICAgICAgICAgICAgIGludCBwcmV2X2xlbiA9IG91dF9sZW47CisgICAgICAgICAgICAgICAgb3V0X2xlbiArPSBjdXJfbGVuOworICAgICAgICAgICAgICAgIGlmIChGRk1JTihjdXJfbGVuLCBsZW4gLSBvZmYpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGlmICgocmVzID0gYXZfcmVhbGxvY3AoJmFzZi0+YnVmLCBvdXRfbGVuKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIG1lbWNweShhc2YtPmJ1ZiArIHByZXZfbGVuLCBidWYgKyBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGN1cl9sZW4sIGxlbiAtIG9mZikpOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgY3VyX2xlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbml0X3BhY2tldGl6ZXIocGIsIGFzZi0+YnVmLCBvdXRfbGVuKTsKKyAgICAgICAgcGItPnBvcyArPSBydC0+YXNmX3BiX3BvczsKKyAgICAgICAgcGItPmVvZl9yZWFjaGVkID0gMDsKKyAgICAgICAgcnQtPmFzZl9jdHgtPnBiID0gcGI7CisgICAgfQorCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgaTsKKworICAgICAgICByZXMgPSBmZl9yZWFkX3BhY2tldChydC0+YXNmX2N0eCwgcGt0KTsKKyAgICAgICAgcnQtPmFzZl9wYl9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBpZiAocmVzICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmlkID09IHJ0LT5hc2ZfY3R4LT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+aWQpIHsKKyAgICAgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEZJWE1FOiByZXR1cm4gMCBpZiBsYXN0IHBhY2tldAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlcyA9PSAxID8gLTEgOiByZXM7Cit9CisKK3N0YXRpYyBQYXlsb2FkQ29udGV4dCAqYXNmcnRwX25ld19jb250ZXh0KHZvaWQpCit7CisgICAgcmV0dXJuIGF2X21hbGxvY3ooc2l6ZW9mKFBheWxvYWRDb250ZXh0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGFzZnJ0cF9mcmVlX2NvbnRleHQoUGF5bG9hZENvbnRleHQgKmFzZikKK3sKKyAgICBpZiAoYXNmLT5wa3RidWYpIHsKKyAgICAgICAgdWludDhfdCAqcCA9IE5VTEw7CisgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1Zihhc2YtPnBrdGJ1ZiwgJnApOworICAgICAgICBhc2YtPnBrdGJ1ZiA9IE5VTEw7CisgICAgICAgIGF2X2ZyZWUocCk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZhc2YtPmJ1Zik7CisgICAgYXZfZnJlZShhc2YpOworfQorCisjZGVmaW5lIFJUUF9BU0ZfSEFORExFUihuLCBzLCB0KSBcCitSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21zX3J0cF8gIyMgbiAjIyBfaGFuZGxlciA9IHsgXAorICAgIC5lbmNfbmFtZSAgICAgICAgID0gcywgXAorICAgIC5jb2RlY190eXBlICAgICAgID0gdCwgXAorICAgIC5jb2RlY19pZCAgICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwgXAorICAgIC5wYXJzZV9zZHBfYV9saW5lID0gYXNmcnRwX3BhcnNlX3NkcF9saW5lLCBcCisgICAgLmFsbG9jICAgICAgICAgICAgPSBhc2ZydHBfbmV3X2NvbnRleHQsIFwKKyAgICAuZnJlZSAgICAgICAgICAgICA9IGFzZnJ0cF9mcmVlX2NvbnRleHQsIFwKKyAgICAucGFyc2VfcGFja2V0ICAgICA9IGFzZnJ0cF9wYXJzZV9wYWNrZXQsICAgXAorfQorCitSVFBfQVNGX0hBTkRMRVIoYXNmX3BmdiwgIngtYXNmLXBmIiwgIEFWTUVESUFfVFlQRV9WSURFTyk7CitSVFBfQVNGX0hBTkRMRVIoYXNmX3BmYSwgIngtYXNmLXBmIiwgIEFWTUVESUFfVFlQRV9BVURJTyk7CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2Zvcm1hdHMuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfZm9ybWF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMzQxMGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2Zvcm1hdHMuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogUlRQIGRlcGFja2V0aXplciBkZWNsYXJhdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1JUUERFQ19GT1JNQVRTX0gKKyNkZWZpbmUgQVZGT1JNQVRfUlRQREVDX0ZPUk1BVFNfSAorCisjaW5jbHVkZSAicnRwZGVjLmgiCisKKy8qKgorICogUGFyc2UgYSBXaW5kb3dzIE1lZGlhIFNlcnZlci1zcGVjaWZpYyBTRFAgbGluZQorICoKKyAqIEBwYXJhbSBzIFJUU1AgZGVtdXggY29udGV4dAorICovCitpbnQgZmZfd21zX3BhcnNlX3NkcF9hX2xpbmUoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICpwKTsKKworaW50IGZmX2gyNjFfaGFuZGxlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmN0eCwgUGF5bG9hZENvbnRleHQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCwgdWludDMyX3QgKnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuLCB1aW50MTZfdCBzZXEsIGludCBmbGFncyk7CisKK2ludCBmZl9oMjYzX2hhbmRsZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIFBheWxvYWRDb250ZXh0ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QsIHVpbnQzMl90ICp0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgdWludDE2X3Qgc2VxLCBpbnQgZmxhZ3MpOworCitleHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9hbXJfbmJfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfYW1yX3diX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2c3MjZfMTZfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfZzcyNl8yNF9keW5hbWljX2hhbmRsZXI7CitleHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9nNzI2XzMyX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2c3MjZfNDBfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaDI2MV9keW5hbWljX2hhbmRsZXI7CitleHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oMjYzXzE5OThfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaDI2M18yMDAwX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2gyNjNfcmZjMjE5MF9keW5hbWljX2hhbmRsZXI7CitleHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oMjY0X2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2hldmNfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaWxiY19keW5hbWljX2hhbmRsZXI7CitleHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9qcGVnX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21wNGFfbGF0bV9keW5hbWljX2hhbmRsZXI7CitleHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcDR2X2VzX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21wZWdfYXVkaW9fZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXBlZ192aWRlb19keW5hbWljX2hhbmRsZXI7CitleHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcGVnNF9nZW5lcmljX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21wZWd0c19keW5hbWljX2hhbmRsZXI7CitleHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tc19ydHBfYXNmX3BmYV9oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXNfcnRwX2FzZl9wZnZfaGFuZGxlcjsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3FjZWxwX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3FkbTJfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfcXRfcnRwX2F1ZF9oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfcXRfcnRwX3ZpZF9oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfcXVpY2t0aW1lX3J0cF9hdWRfaGFuZGxlcjsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3F1aWNrdGltZV9ydHBfdmlkX2hhbmRsZXI7CitleHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9zdnEzX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3RoZW9yYV9keW5hbWljX2hhbmRsZXI7CitleHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl92b3JiaXNfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfdnA4X2R5bmFtaWNfaGFuZGxlcjsKKworI2VuZGlmIC8qIEFWRk9STUFUX1JUUERFQ19GT1JNQVRTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfZzcyNi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19nNzI2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5ZWY1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfZzcyNi5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTWlyb3NsYXYgU2x1Z2XFiCA8VGh1bmRlci5tQHNlem5hbS5jej4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJydHBkZWNfZm9ybWF0cy5oIgorCisjZGVmaW5lIFJUUF9HNzI2X0hBTkRMRVIoYml0cmF0ZSkgXAorc3RhdGljIGF2X2NvbGQgaW50IGc3MjZfICMjIGJpdHJhdGUgIyNfaW5pdChBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdF9pbmRleCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkQ29udGV4dCAqZGF0YSkgXAoreyBcCisgICAgQVZTdHJlYW0gKnN0cmVhbSA9IHMtPnN0cmVhbXNbc3RfaW5kZXhdOyBcCisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gc3RyZWFtLT5jb2RlYzsgXAorXAorICAgIGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaXRyYXRlLzg7IFwKKyAgICBjb2RlYy0+Yml0X3JhdGUgPSBjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogY29kZWMtPnNhbXBsZV9yYXRlOyBcCitcCisgICAgcmV0dXJuIDA7IFwKK30gXAorXAorUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9nNzI2XyAjIyBiaXRyYXRlICMjIF9keW5hbWljX2hhbmRsZXIgPSB7IFwKKyAgICAuZW5jX25hbWUgICA9ICJHNzI2LSIgI2JpdHJhdGUsIFwKKyAgICAuY29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywgXAorICAgIC5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQURQQ01fRzcyNiwgXAorICAgIC5pbml0ICAgICAgID0gZzcyNl8gIyMgYml0cmF0ZSAjIyBfaW5pdCwgXAorfQorCitSVFBfRzcyNl9IQU5ETEVSKDE2KTsKK1JUUF9HNzI2X0hBTkRMRVIoMjQpOworUlRQX0c3MjZfSEFORExFUigzMik7CitSVFBfRzcyNl9IQU5ETEVSKDQwKTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfaDI2MS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19oMjYxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyNDRiYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfaDI2MS5jCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogUlRQIHBhcnNlciBmb3IgSC4yNjEgcGF5bG9hZCBmb3JtYXQgKFJGQyA0NTg3KQorICogQ29weXJpZ2h0IChjKSAyMDE0IFRob21hcyBWb2xrZXJ0IDx0aG9tYXNAaG9tZXItY29uZmVyZW5jaW5nLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicnRwZGVjX2Zvcm1hdHMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisKKyNkZWZpbmUgUlRQX0gyNjFfUEFZTE9BRF9IRUFERVJfU0laRSAgICAgICAgICAgICAgICAgICAgNAorCitzdHJ1Y3QgUGF5bG9hZENvbnRleHQgeworICAgIEFWSU9Db250ZXh0ICpidWY7CisgICAgdWludDhfdCAgICAgIGVuZGJ5dGU7CisgICAgaW50ICAgICAgICAgIGVuZGJ5dGVfYml0czsKKyAgICB1aW50MzJfdCAgICAgdGltZXN0YW1wOworfTsKKworc3RhdGljIGF2X2NvbGQgUGF5bG9hZENvbnRleHQgKmgyNjFfbmV3X2NvbnRleHQodm9pZCkKK3sKKyAgICByZXR1cm4gYXZfbWFsbG9jeihzaXplb2YoUGF5bG9hZENvbnRleHQpKTsKK30KKworc3RhdGljIHZvaWQgaDI2MV9mcmVlX2R5bl9idWZmZXIoQVZJT0NvbnRleHQgKipkeW5fYnVmKQoreworICAgIHVpbnQ4X3QgKnB0cl9keW5fYnVmZmVyOworICAgIGF2aW9fY2xvc2VfZHluX2J1ZigqZHluX2J1ZiwgJnB0cl9keW5fYnVmZmVyKTsKKyAgICBhdl9mcmVlKHB0cl9keW5fYnVmZmVyKTsKKyAgICAqZHluX2J1ZiA9IE5VTEw7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgaDI2MV9mcmVlX2NvbnRleHQoUGF5bG9hZENvbnRleHQgKnBsX2N0eCkKK3sKKyAgICAvKiByZXR1cm4gaWYgY29udGV4dCBpcyBpbnZhbGlkICovCisgICAgaWYgKCFwbF9jdHgpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIGZyZWUgYnVmZmVyIGlmIGl0IGlzIHZhbGlkICovCisgICAgaWYgKHBsX2N0eC0+YnVmKSB7CisgICAgICAgIGgyNjFfZnJlZV9keW5fYnVmZmVyKCZwbF9jdHgtPmJ1Zik7CisgICAgfQorCisgICAgLyogZnJlZSBjb250ZXh0ICovCisgICAgYXZfZnJlZShwbF9jdHgpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaDI2MV9pbml0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBpbnQgc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpkYXRhKQoreworICAgIC8vYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiaDI2MV9pbml0KCkgZm9yIHN0cmVhbSAlZFxuIiwgc3RfaW5kZXgpOworCisgICAgaWYgKHN0X2luZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjdHgtPnN0cmVhbXNbc3RfaW5kZXhdLT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9oMjYxX2hhbmRsZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIFBheWxvYWRDb250ZXh0ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QsIHVpbnQzMl90ICp0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgdWludDE2X3Qgc2VxLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IHNiaXQsIGViaXQsIGdvYm4sIG1iYXAsIHF1YW50OworICAgIGludCByZXM7CisKKyAgICAvKiBkcm9wIGRhdGEgb2YgcHJldmlvdXMgcGFja2V0cyBpbiBjYXNlIG9mIG5vbi1jb250aW51b3VzIChsb3NzKSBwYWNrZXQgc3RyZWFtICovCisgICAgaWYgKGRhdGEtPmJ1ZiAmJiBkYXRhLT50aW1lc3RhbXAgIT0gKnRpbWVzdGFtcCkgeworICAgICAgICBoMjYxX2ZyZWVfZHluX2J1ZmZlcigmZGF0YS0+YnVmKTsKKyAgICB9CisKKyAgICAvKiBzYW5pdHkgY2hlY2sgZm9yIHNpemUgb2YgaW5wdXQgcGFja2V0OiAxIGJ5dGUgcGF5bG9hZCBhdCBsZWFzdCAqLworICAgIGlmIChsZW4gPCBSVFBfSDI2MV9QQVlMT0FEX0hFQURFUl9TSVpFICsgMSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb28gc2hvcnQgUlRQL0guMjYxIHBhY2tldCwgZ290ICVkIGJ5dGVzXG4iLCBsZW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKgorICAgICAgZGVjb2RlIHRoZSBILjI2MSBwYXlsb2FkIGhlYWRlciBhY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjEgb2YgUkZDIDQ1ODc6CisgICAgICAodXNlcyA0IGJ5dGVzIGJldHdlZW4gUlRQIGhlYWRlciBhbmQgSC4yNjEgc3RyZWFtIHBlciBwYWNrZXQpCisKKyAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICB8U0JJVCB8RUJJVCB8SXxWfCBHT0JOICB8ICAgTUJBUCAgfCAgUVVBTlQgIHwgIEhNVkQgICB8ICBWTVZEICAgfAorICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCisgICAgICAgICAgIFN0YXJ0IGJpdCBwb3NpdGlvbiAoU0JJVCk6IDMgYml0cworICAgICAgICAgICBFbmQgYml0IHBvc2l0aW9uIChFQklUKTogMyBiaXRzCisgICAgICAgICAgIElOVFJBLWZyYW1lIGVuY29kZWQgZGF0YSAoSSk6IDEgYml0CisgICAgICAgICAgIE1vdGlvbiBWZWN0b3IgZmxhZyAoVik6IDEgYml0CisgICAgICAgICAgIEdPQiBudW1iZXIgKEdPQk4pOiA0IGJpdHMKKyAgICAgICAgICAgTWFjcm9ibG9jayBhZGRyZXNzIHByZWRpY3RvciAoTUJBUCk6IDUgYml0cworICAgICAgICAgICBRdWFudGl6ZXIgKFFVQU5UKTogNSBiaXRzCisgICAgICAgICAgIEhvcml6b250YWwgbW90aW9uIHZlY3RvciBkYXRhIChITVZEKTogNSBiaXRzCisgICAgICAgICAgIFZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgZGF0YSAoVk1WRCk6IDUgYml0cworCisgICAgKi8KKyAgICBzYml0ICA9ICAoYnVmWzBdID4+IDUpICYgMHgwNzsKKyAgICBlYml0ICA9ICAoYnVmWzBdID4+IDIpICYgMHgwNzsKKyAgICBnb2JuICA9ICAoYnVmWzFdID4+IDQpICYgMHgwZjsKKyAgICBtYmFwICA9ICgoYnVmWzFdIDw8IDEpICYgMHgxZSkgfCAoKGJ1ZlsyXSA+PiA3KSAmIDB4MDEpOworICAgIHF1YW50ID0gIChidWZbMl0gPj4gMikgJiAweDFmOworCisgICAgLyogcGFzcyB0aGUgSC4yNjEgcGF5bG9hZCBoZWFkZXIgYW5kIGNvbnRpbnVlIHdpdGggdGhlIGFjdHVhbCBwYXlsb2FkICovCisgICAgYnVmICs9IFJUUF9IMjYxX1BBWUxPQURfSEVBREVSX1NJWkU7CisgICAgbGVuIC09IFJUUF9IMjYxX1BBWUxPQURfSEVBREVSX1NJWkU7CisKKyAgICAvKiBzdGFydCBmcmFtZSBidWZmZXJpbmcgd2l0aCBuZXcgZHluYW1pYyBidWZmZXIgKi8KKyAgICBpZiAoIWRhdGEtPmJ1ZikgeworICAgICAgICAvKiBzYW5pdHkgY2hlY2s6IGEgbmV3IGZyYW1lIHN0YXJ0cyB3aXRoIGdvYm49MCwgc2JpdD0wLCBtYmFwPTAsIHVxbmF0PTAgKi8KKyAgICAgICAgaWYgKCFnb2JuICAmJiAhc2JpdCAmJiAhbWJhcCAmJiAhcXVhbnQpeworICAgICAgICAgICAgcmVzID0gYXZpb19vcGVuX2R5bl9idWYoJmRhdGEtPmJ1Zik7CisgICAgICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgLyogdXBkYXRlIHRoZSB0aW1lc3RhbXAgaW4gdGhlIGZyYW1lIHBhY2tldCB3aXRoIHRoZSBvbmUgZnJvbSB0aGUgUlRQIHBhY2tldCAqLworICAgICAgICAgICAgZGF0YS0+dGltZXN0YW1wID0gKnRpbWVzdGFtcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGZyYW1lIG5vdCBzdGFydGVkIHlldCwgbmVlZCBtb3JlIHBhY2tldHMgKi8KKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBkbyB0aGUgImJ5dGUgbWVyZ2luZyIgYXQgdGhlIGJvdW5kYXJpZXMgb2YgdHdvIGNvbnNlY3V0aXZlIGZyYW1lIGZyYWdtZW50cyAqLworICAgIGlmIChkYXRhLT5lbmRieXRlX2JpdHMgfHwgc2JpdCkgeworICAgICAgICBpZiAoZGF0YS0+ZW5kYnl0ZV9iaXRzID09IHNiaXQpIHsKKyAgICAgICAgICAgIGRhdGEtPmVuZGJ5dGUgfD0gYnVmWzBdICYgKDB4ZmYgPj4gc2JpdCk7CisgICAgICAgICAgICBkYXRhLT5lbmRieXRlX2JpdHMgPSAwOworICAgICAgICAgICAgYnVmKys7CisgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgIGF2aW9fdzgoZGF0YS0+YnVmLCBkYXRhLT5lbmRieXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGViaXQvc2JpdCB2YWx1ZXMgaW5jb25zaXN0ZW50LCBhc3N1bWluZyBwYWNrZXQgbG9zcyAqLworICAgICAgICAgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGxlbio4IC0gZWJpdCk7CisgICAgICAgICAgICBza2lwX2JpdHMoJmdiLCBzYml0KTsKKyAgICAgICAgICAgIGlmIChkYXRhLT5lbmRieXRlX2JpdHMpIHsKKyAgICAgICAgICAgICAgICBkYXRhLT5lbmRieXRlIHw9IGdldF9iaXRzKCZnYiwgOCAtIGRhdGEtPmVuZGJ5dGVfYml0cyk7CisgICAgICAgICAgICAgICAgYXZpb193OChkYXRhLT5idWYsIGRhdGEtPmVuZGJ5dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGdldF9iaXRzX2xlZnQoJmdiKSA+PSA4KQorICAgICAgICAgICAgICAgIGF2aW9fdzgoZGF0YS0+YnVmLCBnZXRfYml0cygmZ2IsIDgpKTsKKyAgICAgICAgICAgIGRhdGEtPmVuZGJ5dGVfYml0cyA9IGdldF9iaXRzX2xlZnQoJmdiKTsKKyAgICAgICAgICAgIGlmIChkYXRhLT5lbmRieXRlX2JpdHMpCisgICAgICAgICAgICAgICAgZGF0YS0+ZW5kYnl0ZSA9IGdldF9iaXRzKCZnYiwgZGF0YS0+ZW5kYnl0ZV9iaXRzKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCAtIGRhdGEtPmVuZGJ5dGVfYml0cyk7CisgICAgICAgICAgICBlYml0ID0gMDsKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGViaXQpIHsKKyAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICBhdmlvX3dyaXRlKGRhdGEtPmJ1ZiwgYnVmLCBsZW4gLSAxKTsKKyAgICAgICAgZGF0YS0+ZW5kYnl0ZV9iaXRzID0gOCAtIGViaXQ7CisgICAgICAgIGRhdGEtPmVuZGJ5dGUgPSBidWZbbGVuIC0gMV0gJiAoMHhmZiA8PCBlYml0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3dyaXRlKGRhdGEtPmJ1ZiwgYnVmLCBsZW4pOworICAgIH0KKworICAgIC8qIFJUUCBtYXJrZXIgYml0IG1lYW5zOiBsYXN0IGZyYWdtZW50IG9mIGN1cnJlbnQgZnJhbWUgd2FzIHJlY2VpdmVkOworICAgICAgIG90aGVyd2lzZSwgYW4gYWRkaXRpb25hbCBmcmFnbWVudCBpcyBuZWVkZWQgZm9yIHRoZSBjdXJyZW50IGZyYW1lICovCisgICAgaWYgKCEoZmxhZ3MgJiBSVFBfRkxBR19NQVJLRVIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworCisgICAgLyogd3JpdGUgdGhlIGNvbXBsZXRlZCBsYXN0IGJ5dGUgZnJvbSB0aGUgImJ5dGUgbWVyZ2luZyIgKi8KKyAgICBpZiAoZGF0YS0+ZW5kYnl0ZV9iaXRzKQorICAgICAgICBhdmlvX3c4KGRhdGEtPmJ1ZiwgZGF0YS0+ZW5kYnl0ZSk7CisgICAgZGF0YS0+ZW5kYnl0ZV9iaXRzID0gMDsKKworICAgIC8qIGNsb3NlIGZyYW1lIGJ1ZmZlcmluZyBhbmQgY3JlYXRlIHJlc3VsdGluZyBBL1YgcGFja2V0ICovCisgICAgcmVzID0gZmZfcnRwX2ZpbmFsaXplX3BhY2tldChwa3QsICZkYXRhLT5idWYsIHN0LT5pbmRleCk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICByZXR1cm4gMDsKK30KKworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oMjYxX2R5bmFtaWNfaGFuZGxlciA9IHsKKyAgICAuZW5jX25hbWUgICAgICAgICAgPSAiSDI2MSIsCisgICAgLmNvZGVjX3R5cGUgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5jb2RlY19pZCAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjEsCisgICAgLmluaXQgICAgICAgICAgICAgID0gaDI2MV9pbml0LAorICAgIC5wYXJzZV9wYWNrZXQgICAgICA9IGZmX2gyNjFfaGFuZGxlX3BhY2tldCwKKyAgICAuYWxsb2MgICAgICAgICAgICAgPSBoMjYxX25ld19jb250ZXh0LAorICAgIC5mcmVlICAgICAgICAgICAgICA9IGgyNjFfZnJlZV9jb250ZXh0LAorICAgIC5zdGF0aWNfcGF5bG9hZF9pZCA9IDMxLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfaDI2My5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19oMjYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0Y2MyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfaDI2My5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogUlRQIEguMjYzIERlcGFja2V0aXplciwgUkZDIDQ2MjkKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJydHBkZWNfZm9ybWF0cy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgaDI2M19pbml0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBpbnQgc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpkYXRhKQoreworICAgIGlmIChzdF9pbmRleCA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIGN0eC0+c3RyZWFtc1tzdF9pbmRleF0tPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9oMjYzX2hhbmRsZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIFBheWxvYWRDb250ZXh0ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QsIHVpbnQzMl90ICp0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgdWludDE2X3Qgc2VxLCBpbnQgZmxhZ3MpCit7CisgICAgdWludDhfdCAqcHRyOworICAgIHVpbnQxNl90IGhlYWRlcjsKKyAgICBpbnQgc3RhcnRjb2RlLCB2cmMsIHBpY3R1cmVfaGVhZGVyOworCisgICAgaWYgKGxlbiA8IDIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IEguMjYzIFJUUCBwYWNrZXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBEZWNvZGUgdGhlIDE2IGJpdCBILjI2MysgcGF5bG9hZCBoZWFkZXIsIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uCisgICAgICogNS4xIG9mIFJGQyA0NjI5LiBUaGUgZmllbGRzIG9mIHRoaXMgaGVhZGVyIGFyZToKKyAgICAgKiAtIDUgcmVzZXJ2ZWQgYml0cywgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICogLSBPbmUgYml0IChQLCBzdGFydGNvZGUpLCBpbmRpY2F0aW5nIGEgcGljdHVyZSBzdGFydCwgcGljdHVyZSBzZWdtZW50CisgICAgICogICBzdGFydCBvciB2aWRlbyBzZXF1ZW5jZSBlbmQuIElmIHNldCwgdHdvIHplcm8gYnl0ZXMgc2hvdWxkIGJlCisgICAgICogICBwcmVwZW5kZWQgdG8gdGhlIHBheWxvYWQuCisgICAgICogLSBPbmUgYml0IChWLCB2cmMpLCBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiBhbiA4IGJpdCBWaWRlbworICAgICAqICAgUmVkdW5kYW5jeSBDb2RpbmcgZmllbGQgYWZ0ZXIgdGhpcyAxNiBiaXQgaGVhZGVyLgorICAgICAqIC0gNiBiaXRzIChQTEVOLCBwaWN0dXJlX2hlYWRlciksIHRoZSBsZW5ndGggKGluIGJ5dGVzKSBvZiBhbiBleHRyYQorICAgICAqICAgcGljdHVyZSBoZWFkZXIsIGZvbGxvd2luZyB0aGUgVlJDIGZpZWxkLgorICAgICAqIC0gMyBiaXRzIChQRUJJVCksIHRoZSBudW1iZXIgb2YgYml0cyB0byBpZ25vcmUgb2YgdGhlIGxhc3QgYnl0ZQorICAgICAqICAgb2YgdGhlIGV4dHJhIHBpY3R1cmUgaGVhZGVyLiAoTm90IHVzZWQgYXQgdGhlIG1vbWVudC4pCisgICAgICovCisgICAgaGVhZGVyID0gQVZfUkIxNihidWYpOworICAgIHN0YXJ0Y29kZSAgICAgID0gKGhlYWRlciAmIDB4MDQwMCkgPj4gOTsKKyAgICB2cmMgICAgICAgICAgICA9ICBoZWFkZXIgJiAweDAyMDA7CisgICAgcGljdHVyZV9oZWFkZXIgPSAoaGVhZGVyICYgMHgwMWY4KSA+PiAzOworICAgIGJ1ZiArPSAyOworICAgIGxlbiAtPSAyOworCisgICAgaWYgKHZyYykgeworICAgICAgICAvKiBTa2lwIFZSQyBoZWFkZXIgaWYgcHJlc2VudCwgbm90IHVzZWQgYXQgdGhlIG1vbWVudC4gKi8KKyAgICAgICAgYnVmICs9IDE7CisgICAgICAgIGxlbiAtPSAxOworICAgIH0KKyAgICBpZiAocGljdHVyZV9oZWFkZXIpIHsKKyAgICAgICAgLyogU2tpcCBleHRyYSBwaWN0dXJlIGhlYWRlciBpZiBwcmVzZW50LCBub3QgdXNlZCBhdCB0aGUgbW9tZW50LiAqLworICAgICAgICBidWYgKz0gcGljdHVyZV9oZWFkZXI7CisgICAgICAgIGxlbiAtPSBwaWN0dXJlX2hlYWRlcjsKKyAgICB9CisKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb28gc2hvcnQgSC4yNjMgUlRQIHBhY2tldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgbGVuICsgc3RhcnRjb2RlKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgcHRyID0gcGt0LT5kYXRhOworCisgICAgaWYgKHN0YXJ0Y29kZSkgeworICAgICAgICAqcHRyKysgPSAwOworICAgICAgICAqcHRyKysgPSAwOworICAgIH0KKyAgICBtZW1jcHkocHRyLCBidWYsIGxlbik7CisKKyAgICByZXR1cm4gMDsKK30KKworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oMjYzXzE5OThfZHluYW1pY19oYW5kbGVyID0geworICAgIC5lbmNfbmFtZSAgICAgICAgID0gIkgyNjMtMTk5OCIsCisgICAgLmNvZGVjX3R5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYzLAorICAgIC5pbml0ICAgICAgICAgICAgID0gaDI2M19pbml0LAorICAgIC5wYXJzZV9wYWNrZXQgICAgID0gZmZfaDI2M19oYW5kbGVfcGFja2V0LAorfTsKKworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oMjYzXzIwMDBfZHluYW1pY19oYW5kbGVyID0geworICAgIC5lbmNfbmFtZSAgICAgICAgID0gIkgyNjMtMjAwMCIsCisgICAgLmNvZGVjX3R5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYzLAorICAgIC5pbml0ICAgICAgICAgICAgID0gaDI2M19pbml0LAorICAgIC5wYXJzZV9wYWNrZXQgICAgID0gZmZfaDI2M19oYW5kbGVfcGFja2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfaDI2M19yZmMyMTkwLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2gyNjNfcmZjMjE5MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMjc5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2gyNjNfcmZjMjE5MC5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogUlRQIEguMjYzIERlcGFja2V0aXplciwgUkZDIDIxOTAKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNYXJ0aW4gU3RvcnNqbworICogQmFzZWQgb24gdGhlIEdTdHJlYW1lciBILjI2MyBEZXBheWxvZGVyOgorICogQ29weXJpZ2h0IDIwMDUgV2ltIFRheW1hbnMKKyAqIENvcHlyaWdodCAyMDA3IEVkd2FyZCBIZXJ2ZXkKKyAqIENvcHlyaWdodCAyMDA3IE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgMjAwNyBDb2xsYWJvcmEgTHRkLCBQaGlsaXBwZSBLYWxhZgorICogQ29weXJpZ2h0IDIwMTAgTWFyayBOYXV3ZWxhZXJ0cworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJydHBkZWNfZm9ybWF0cy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKKworc3RydWN0IFBheWxvYWRDb250ZXh0IHsKKyAgICBBVklPQ29udGV4dCAqYnVmOworICAgIHVpbnQ4X3QgICAgICBlbmRieXRlOworICAgIGludCAgICAgICAgICBlbmRieXRlX2JpdHM7CisgICAgdWludDMyX3QgICAgIHRpbWVzdGFtcDsKKyAgICBpbnQgICAgICAgICAgbmV3Zm9ybWF0OworfTsKKworc3RhdGljIFBheWxvYWRDb250ZXh0ICpoMjYzX25ld19jb250ZXh0KHZvaWQpCit7CisgICAgcmV0dXJuIGF2X21hbGxvY3ooc2l6ZW9mKFBheWxvYWRDb250ZXh0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGgyNjNfZnJlZV9jb250ZXh0KFBheWxvYWRDb250ZXh0ICpkYXRhKQoreworICAgIGlmICghZGF0YSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChkYXRhLT5idWYpIHsKKyAgICAgICAgdWludDhfdCAqcDsKKyAgICAgICAgYXZpb19jbG9zZV9keW5fYnVmKGRhdGEtPmJ1ZiwgJnApOworICAgICAgICBhdl9mcmVlKHApOworICAgIH0KKyAgICBhdl9mcmVlKGRhdGEpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaDI2M19pbml0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBpbnQgc3RfaW5kZXgsIFBheWxvYWRDb250ZXh0ICpkYXRhKQoreworICAgIGlmIChzdF9pbmRleCA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIGN0eC0+c3RyZWFtc1tzdF9pbmRleF0tPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDI2M19oYW5kbGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBQYXlsb2FkQ29udGV4dCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCwgdWludDMyX3QgKnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgdWludDE2X3Qgc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIC8qIENvcnJlc3BvbmRpbmcgdG8gaGVhZGVyIGZpZWxkcyBpbiB0aGUgUkZDICovCisgICAgaW50IGYsIHAsIGksIHNiaXQsIGViaXQsIHNyYywgcjsKKyAgICBpbnQgaGVhZGVyX3NpemUsIHJldDsKKworICAgIGlmIChkYXRhLT5uZXdmb3JtYXQpCisgICAgICAgIHJldHVybiBmZl9oMjYzX2hhbmRsZV9wYWNrZXQoY3R4LCBkYXRhLCBzdCwgcGt0LCB0aW1lc3RhbXAsIGJ1ZiwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcSwgZmxhZ3MpOworCisgICAgaWYgKGRhdGEtPmJ1ZiAmJiBkYXRhLT50aW1lc3RhbXAgIT0gKnRpbWVzdGFtcCkgeworICAgICAgICAvKiBEcm9wcGluZyBvbGQgYnVmZmVyZWQsIHVuZmluaXNoZWQgZGF0YSAqLworICAgICAgICB1aW50OF90ICpwOworICAgICAgICBhdmlvX2Nsb3NlX2R5bl9idWYoZGF0YS0+YnVmLCAmcCk7CisgICAgICAgIGF2X2ZyZWUocCk7CisgICAgICAgIGRhdGEtPmJ1ZiA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGxlbiA8IDQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IEguMjYzIFJUUCBwYWNrZXQ6ICVkXG4iLCBsZW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmID0gYnVmWzBdICYgMHg4MDsKKyAgICBwID0gYnVmWzBdICYgMHg0MDsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgLyogTW9kZSBBICovCisgICAgICAgIGhlYWRlcl9zaXplID0gNDsKKyAgICAgICAgaSA9IGJ1ZlsxXSAmIDB4MTA7CisgICAgICAgIHIgPSAoKGJ1ZlsxXSAmIDB4MDEpIDw8IDMpIHwgKChidWZbMl0gJiAweGUwKSA+PiA1KTsKKyAgICB9IGVsc2UgaWYgKCFwKSB7CisgICAgICAgIC8qIE1vZGUgQiAqLworICAgICAgICBoZWFkZXJfc2l6ZSA9IDg7CisgICAgICAgIGlmIChsZW4gPCBoZWFkZXJfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJUb28gc2hvcnQgSC4yNjMgUlRQIHBhY2tldDogJWQgYnl0ZXMsICVkIGhlYWRlciBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBsZW4sIGhlYWRlcl9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHIgPSBidWZbM10gJiAweDAzOworICAgICAgICBpID0gYnVmWzRdICYgMHg4MDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBNb2RlIEMgKi8KKyAgICAgICAgaGVhZGVyX3NpemUgPSAxMjsKKyAgICAgICAgaWYgKGxlbiA8IGhlYWRlcl9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlRvbyBzaG9ydCBILjI2MyBSVFAgcGFja2V0OiAlZCBieXRlcywgJWQgaGVhZGVyIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgIGxlbiwgaGVhZGVyX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgciA9IGJ1ZlszXSAmIDB4MDM7CisgICAgICAgIGkgPSBidWZbNF0gJiAweDgwOworICAgIH0KKyAgICBzYml0ID0gKGJ1ZlswXSA+PiAzKSAmIDB4NzsKKyAgICBlYml0ID0gIGJ1ZlswXSAgICAgICAmIDB4NzsKKyAgICBzcmMgID0gKGJ1ZlsxXSAmIDB4ZTApID4+IDU7CisgICAgaWYgKCEoYnVmWzBdICYgMHhmOCkpIHsgLyogUmVzZXJ2ZWQgYml0cyBpbiBSRkMgMjQyOS80NjI5IGFyZSB6ZXJvICovCisgICAgICAgIGlmICgoc3JjID09IDAgfHwgc3JjID49IDYpICYmIHIpIHsKKyAgICAgICAgICAgIC8qIEludmFsaWQgc3JjIGZvciB0aGlzIGZvcm1hdCwgYW5kIGJpdHMgdGhhdCBzaG91bGQgYmUgemVybworICAgICAgICAgICAgICogYWNjb3JkaW5nIHRvIFJGQyAyMTkwIGFyZW4ndCB6ZXJvLiAqLworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkludGVycHJldGluZyBIMjYzIFJUUCBkYXRhIGFzIFJGQyAyNDI5LzQ2MjkgZXZlbiB0aG91Z2ggIgorICAgICAgICAgICAgICAgICAgICJzaWduYWxsZWQgd2l0aCBhIHN0YXRpYyBwYXlsb2FkIHR5cGUuXG4iKTsKKyAgICAgICAgICAgIGRhdGEtPm5ld2Zvcm1hdCA9IDE7CisgICAgICAgICAgICByZXR1cm4gZmZfaDI2M19oYW5kbGVfcGFja2V0KGN0eCwgZGF0YSwgc3QsIHBrdCwgdGltZXN0YW1wLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgc2VxLCBmbGFncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWYgKz0gaGVhZGVyX3NpemU7CisgICAgbGVuIC09IGhlYWRlcl9zaXplOworCisgICAgaWYgKCFkYXRhLT5idWYpIHsKKyAgICAgICAgLyogQ2hlY2sgdGhlIHBpY3R1cmUgc3RhcnQgY29kZSwgb25seSBzdGFydCBidWZmZXJpbmcgYSBuZXcgZnJhbWUKKyAgICAgICAgICogaWYgdGhpcyBpcyBjb3JyZWN0ICovCisgICAgICAgIGlmIChsZW4gPiA0ICYmIEFWX1JCMzIoYnVmKSA+PiAxMCA9PSAweDIwKSB7CisgICAgICAgICAgICByZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmZGF0YS0+YnVmKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBkYXRhLT50aW1lc3RhbXAgPSAqdGltZXN0YW1wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRnJhbWUgbm90IHN0YXJ0ZWQgeWV0LCBza2lwcGluZyAqLworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkYXRhLT5lbmRieXRlX2JpdHMgfHwgc2JpdCkgeworICAgICAgICBpZiAoZGF0YS0+ZW5kYnl0ZV9iaXRzID09IHNiaXQpIHsKKyAgICAgICAgICAgIGRhdGEtPmVuZGJ5dGUgfD0gYnVmWzBdICYgKDB4ZmYgPj4gc2JpdCk7CisgICAgICAgICAgICBkYXRhLT5lbmRieXRlX2JpdHMgPSAwOworICAgICAgICAgICAgYnVmKys7CisgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgIGF2aW9fdzgoZGF0YS0+YnVmLCBkYXRhLT5lbmRieXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFN0YXJ0L2VuZCBza2lwIGJpdHMgbm90IG1hdGNoaW5nIC0gbWlzc2VkIHBhY2tldHM/ICovCisgICAgICAgICAgICBHZXRCaXRDb250ZXh0IGdiOworICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgbGVuKjggLSBlYml0KTsKKyAgICAgICAgICAgIHNraXBfYml0cygmZ2IsIHNiaXQpOworICAgICAgICAgICAgaWYgKGRhdGEtPmVuZGJ5dGVfYml0cykgeworICAgICAgICAgICAgICAgIGRhdGEtPmVuZGJ5dGUgfD0gZ2V0X2JpdHMoJmdiLCA4IC0gZGF0YS0+ZW5kYnl0ZV9iaXRzKTsKKyAgICAgICAgICAgICAgICBhdmlvX3c4KGRhdGEtPmJ1ZiwgZGF0YS0+ZW5kYnl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoZ2V0X2JpdHNfbGVmdCgmZ2IpID49IDgpCisgICAgICAgICAgICAgICAgYXZpb193OChkYXRhLT5idWYsIGdldF9iaXRzKCZnYiwgOCkpOworICAgICAgICAgICAgZGF0YS0+ZW5kYnl0ZV9iaXRzID0gZ2V0X2JpdHNfbGVmdCgmZ2IpOworICAgICAgICAgICAgaWYgKGRhdGEtPmVuZGJ5dGVfYml0cykKKyAgICAgICAgICAgICAgICBkYXRhLT5lbmRieXRlID0gZ2V0X2JpdHMoJmdiLCBkYXRhLT5lbmRieXRlX2JpdHMpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg4IC0gZGF0YS0+ZW5kYnl0ZV9iaXRzKTsKKyAgICAgICAgICAgIGViaXQgPSAwOworICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZWJpdCkgeworICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgICAgIGF2aW9fd3JpdGUoZGF0YS0+YnVmLCBidWYsIGxlbiAtIDEpOworICAgICAgICBkYXRhLT5lbmRieXRlX2JpdHMgPSA4IC0gZWJpdDsKKyAgICAgICAgZGF0YS0+ZW5kYnl0ZSA9IGJ1ZltsZW4gLSAxXSAmICgweGZmIDw8IGViaXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2aW9fd3JpdGUoZGF0YS0+YnVmLCBidWYsIGxlbik7CisgICAgfQorCisgICAgaWYgKCEoZmxhZ3MgJiBSVFBfRkxBR19NQVJLRVIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworCisgICAgaWYgKGRhdGEtPmVuZGJ5dGVfYml0cykKKyAgICAgICAgYXZpb193OChkYXRhLT5idWYsIGRhdGEtPmVuZGJ5dGUpOworICAgIGRhdGEtPmVuZGJ5dGVfYml0cyA9IDA7CisKKyAgICByZXQgPSBmZl9ydHBfZmluYWxpemVfcGFja2V0KHBrdCwgJmRhdGEtPmJ1Ziwgc3QtPmluZGV4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIWkpCisgICAgICAgIHBrdC0+ZmxhZ3MgICB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICByZXR1cm4gMDsKK30KKworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oMjYzX3JmYzIxOTBfZHluYW1pY19oYW5kbGVyID0geworICAgIC5jb2RlY190eXBlICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuY29kZWNfaWQgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYzLAorICAgIC5pbml0ICAgICAgICAgICAgICA9IGgyNjNfaW5pdCwKKyAgICAucGFyc2VfcGFja2V0ICAgICAgPSBoMjYzX2hhbmRsZV9wYWNrZXQsCisgICAgLmFsbG9jICAgICAgICAgICAgID0gaDI2M19uZXdfY29udGV4dCwKKyAgICAuZnJlZSAgICAgICAgICAgICAgPSBoMjYzX2ZyZWVfY29udGV4dCwKKyAgICAuc3RhdGljX3BheWxvYWRfaWQgPSAzNCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2gyNjQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfaDI2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYmJhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2gyNjQuYwpAQCAtMCwwICsxLDQwNiBAQAorLyoKKyAqIFJUUCBIMjY0IFByb3RvY29sIChSRkMzOTg0KQorICogQ29weXJpZ2h0IChjKSAyMDA2IFJ5YW4gTWFydGVsbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgSC4yNjQgLyBSVFAgQ29kZSAoUkZDMzk4NCkKKyAqIEBhdXRob3IgUnlhbiBNYXJ0ZWxsIDxyZG00QG1hcnRlbGx2ZW50dXJlcy5jb20+CisgKgorICogQG5vdGUgTm90ZXM6CisgKiBOb3RlczoKKyAqIFRoaXMgY3VycmVudGx5IHN1cHBvcnRzIHBhY2tldGl6YXRpb24gbW9kZToKKyAqIFNpbmdsZSBOYWwgVW5pdCBNb2RlICgwKSwgb3IKKyAqIE5vbi1JbnRlcmxlYXZlZCBNb2RlICgxKS4gIEl0IGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0CisgKiBJbnRlcmxlYXZlZCBNb2RlICgyKS4gKFRoaXMgcmVxdWlyZXMgaW1wbGVtZW50aW5nIFNUQVAtQiwgTVRBUDE2LCBNVEFQMjQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEZVLUIgcGFja2V0IHR5cGVzKQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9iYXNlNjQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworI2luY2x1ZGUgIm5ldHdvcmsuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgInJ0cGRlYy5oIgorI2luY2x1ZGUgInJ0cGRlY19mb3JtYXRzLmgiCisKK3N0cnVjdCBQYXlsb2FkQ29udGV4dCB7CisgICAgLy8gc2RwIHNldHVwIHBhcmFtZXRlcnMKKyAgICB1aW50OF90IHByb2ZpbGVfaWRjOworICAgIHVpbnQ4X3QgcHJvZmlsZV9pb3A7CisgICAgdWludDhfdCBsZXZlbF9pZGM7CisgICAgaW50IHBhY2tldGl6YXRpb25fbW9kZTsKKyNpZmRlZiBERUJVRworICAgIGludCBwYWNrZXRfdHlwZXNfcmVjZWl2ZWRbMzJdOworI2VuZGlmCit9OworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgQ09VTlRfTkFMX1RZUEUoZGF0YSwgbmFsKSBkYXRhLT5wYWNrZXRfdHlwZXNfcmVjZWl2ZWRbKG5hbCkgJiAweDFmXSsrCisjZWxzZQorI2RlZmluZSBDT1VOVF9OQUxfVFlQRShkYXRhLCBuYWwpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdWludDhfdCBzdGFydF9zZXF1ZW5jZVtdID0geyAwLCAwLCAwLCAxIH07CisKK3N0YXRpYyBpbnQgc2RwX3BhcnNlX2ZtdHBfY29uZmlnX2gyNjQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkQ29udGV4dCAqaDI2NF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphdHRyLCBjaGFyICp2YWx1ZSkKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzdHJlYW0tPmNvZGVjOworICAgIGFzc2VydChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCk7CisgICAgYXNzZXJ0KGgyNjRfZGF0YSk7CisKKyAgICBpZiAoIXN0cmNtcChhdHRyLCAicGFja2V0aXphdGlvbi1tb2RlIikpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIlJUUCBQYWNrZXRpemF0aW9uIE1vZGU6ICVkXG4iLCBhdG9pKHZhbHVlKSk7CisgICAgICAgIGgyNjRfZGF0YS0+cGFja2V0aXphdGlvbl9tb2RlID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFBhY2tldGl6YXRpb24gTW9kZToKKyAgICAgICAgICogMCBvciBub3QgcHJlc2VudDogU2luZ2xlIE5BTCBtb2RlIChPbmx5IG5hbHMgZnJvbSAxLTIzIGFyZSBhbGxvd2VkKQorICAgICAgICAgKiAxOiBOb24taW50ZXJsZWF2ZWQgTW9kZTogMS0yMywgMjQgKFNUQVAtQSksIDI4IChGVS1BKSBhcmUgYWxsb3dlZC4KKyAgICAgICAgICogMjogSW50ZXJsZWF2ZWQgTW9kZTogMjUgKFNUQVAtQiksIDI2IChNVEFQMTYpLCAyNyAoTVRBUDI0KSwgMjggKEZVLUEpLAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgMjkgKEZVLUIpIGFyZSBhbGxvd2VkLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGgyNjRfZGF0YS0+cGFja2V0aXphdGlvbl9tb2RlID4gMSkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludGVybGVhdmVkIFJUUCBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuIik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHIsICJwcm9maWxlLWxldmVsLWlkIikpIHsKKyAgICAgICAgaWYgKHN0cmxlbih2YWx1ZSkgPT0gNikgeworICAgICAgICAgICAgY2hhciBidWZmZXJbM107CisgICAgICAgICAgICAvLyA2IGNoYXJhY3RlcnM9MyBieXRlcywgaW4gaGV4LgorICAgICAgICAgICAgdWludDhfdCBwcm9maWxlX2lkYzsKKyAgICAgICAgICAgIHVpbnQ4X3QgcHJvZmlsZV9pb3A7CisgICAgICAgICAgICB1aW50OF90IGxldmVsX2lkYzsKKworICAgICAgICAgICAgYnVmZmVyWzBdICAgPSB2YWx1ZVswXTsKKyAgICAgICAgICAgIGJ1ZmZlclsxXSAgID0gdmFsdWVbMV07CisgICAgICAgICAgICBidWZmZXJbMl0gICA9ICdcMCc7CisgICAgICAgICAgICBwcm9maWxlX2lkYyA9IHN0cnRvbChidWZmZXIsIE5VTEwsIDE2KTsKKyAgICAgICAgICAgIGJ1ZmZlclswXSAgID0gdmFsdWVbMl07CisgICAgICAgICAgICBidWZmZXJbMV0gICA9IHZhbHVlWzNdOworICAgICAgICAgICAgcHJvZmlsZV9pb3AgPSBzdHJ0b2woYnVmZmVyLCBOVUxMLCAxNik7CisgICAgICAgICAgICBidWZmZXJbMF0gICA9IHZhbHVlWzRdOworICAgICAgICAgICAgYnVmZmVyWzFdICAgPSB2YWx1ZVs1XTsKKyAgICAgICAgICAgIGxldmVsX2lkYyAgID0gc3RydG9sKGJ1ZmZlciwgTlVMTCwgMTYpOworCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJSVFAgUHJvZmlsZSBJREM6ICV4IFByb2ZpbGUgSU9QOiAleCBMZXZlbDogJXhcbiIsCisgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pZGMsIHByb2ZpbGVfaW9wLCBsZXZlbF9pZGMpOworICAgICAgICAgICAgaDI2NF9kYXRhLT5wcm9maWxlX2lkYyA9IHByb2ZpbGVfaWRjOworICAgICAgICAgICAgaDI2NF9kYXRhLT5wcm9maWxlX2lvcCA9IHByb2ZpbGVfaW9wOworICAgICAgICAgICAgaDI2NF9kYXRhLT5sZXZlbF9pZGMgICA9IGxldmVsX2lkYzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLCAic3Byb3AtcGFyYW1ldGVyLXNldHMiKSkgeworICAgICAgICBjb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICBhdl9mcmVlcCgmY29kZWMtPmV4dHJhZGF0YSk7CisKKyAgICAgICAgd2hpbGUgKCp2YWx1ZSkgeworICAgICAgICAgICAgY2hhciBiYXNlNjRwYWNrZXRbMTAyNF07CisgICAgICAgICAgICB1aW50OF90IGRlY29kZWRfcGFja2V0WzEwMjRdOworICAgICAgICAgICAgaW50IHBhY2tldF9zaXplOworICAgICAgICAgICAgY2hhciAqZHN0ID0gYmFzZTY0cGFja2V0OworCisgICAgICAgICAgICB3aGlsZSAoKnZhbHVlICYmICp2YWx1ZSAhPSAnLCcKKyAgICAgICAgICAgICAgICAgICAmJiAoZHN0IC0gYmFzZTY0cGFja2V0KSA8IHNpemVvZihiYXNlNjRwYWNrZXQpIC0gMSkgeworICAgICAgICAgICAgICAgICpkc3QrKyA9ICp2YWx1ZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRzdCsrID0gJ1wwJzsKKworICAgICAgICAgICAgaWYgKCp2YWx1ZSA9PSAnLCcpCisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKworICAgICAgICAgICAgcGFja2V0X3NpemUgPSBhdl9iYXNlNjRfZGVjb2RlKGRlY29kZWRfcGFja2V0LCBiYXNlNjRwYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRlY29kZWRfcGFja2V0KSk7CisgICAgICAgICAgICBpZiAocGFja2V0X3NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCA9IGF2X21hbGxvYyhwYWNrZXRfc2l6ZSArIHNpemVvZihzdGFydF9zZXF1ZW5jZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmV4dHJhZGF0YV9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgICAgIGlmICghZGVzdCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGV4dHJhZGF0YSFcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29kZWMtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShkZXN0LCBjb2RlYy0+ZXh0cmFkYXRhLCBjb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKGNvZGVjLT5leHRyYWRhdGEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1lbWNweShkZXN0ICsgY29kZWMtPmV4dHJhZGF0YV9zaXplLCBzdGFydF9zZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0YXJ0X3NlcXVlbmNlKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRlc3QgKyBjb2RlYy0+ZXh0cmFkYXRhX3NpemUgKyBzaXplb2Yoc3RhcnRfc2VxdWVuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkX3BhY2tldCwgcGFja2V0X3NpemUpOworICAgICAgICAgICAgICAgIG1lbXNldChkZXN0ICsgY29kZWMtPmV4dHJhZGF0YV9zaXplICsgc2l6ZW9mKHN0YXJ0X3NlcXVlbmNlKSArCisgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldF9zaXplLCAwLCBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgICAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGEgICAgICAgPSBkZXN0OworICAgICAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSArPSBzaXplb2Yoc3RhcnRfc2VxdWVuY2UpICsgcGFja2V0X3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkV4dHJhZGF0YSBzZXQgdG8gJXAgKHNpemU6ICVkKSFcbiIsCisgICAgICAgICAgICAgICBjb2RlYy0+ZXh0cmFkYXRhLCBjb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy8gcmV0dXJuIDAgb24gcGFja2V0LCBubyBtb3JlIGxlZnQsIDEgb24gcGFja2V0LCAxIG9uIHBhcnRpYWwgcGFja2V0CitzdGF0aWMgaW50IGgyNjRfaGFuZGxlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmN0eCwgUGF5bG9hZENvbnRleHQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QsIHVpbnQzMl90ICp0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4sIHVpbnQxNl90IHNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICB1aW50OF90IG5hbDsKKyAgICB1aW50OF90IHR5cGU7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICBpZiAoIWxlbikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFbXB0eSBIMjY0IFJUUCBwYWNrZXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgbmFsICA9IGJ1ZlswXTsKKyAgICB0eXBlID0gbmFsICYgMHgxZjsKKworICAgIGFzc2VydChkYXRhKTsKKyAgICBhc3NlcnQoYnVmKTsKKworICAgIC8qIFNpbXBsaWZ5IHRoZSBjYXNlICh0aGVzZSBhcmUgYWxsIHRoZSBuYWwgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGJ5CisgICAgICogdGhlIGgyNjQgY29kZWMpLiAqLworICAgIGlmICh0eXBlID49IDEgJiYgdHlwZSA8PSAyMykKKyAgICAgICAgdHlwZSA9IDE7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkLCBidXQgcGFzcyB0aGVtIHRocm91Z2gKKyAgICBjYXNlIDE6CisgICAgICAgIGlmICgocmVzdWx0ID0gYXZfbmV3X3BhY2tldChwa3QsIGxlbiArIHNpemVvZihzdGFydF9zZXF1ZW5jZSkpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBzdGFydF9zZXF1ZW5jZSwgc2l6ZW9mKHN0YXJ0X3NlcXVlbmNlKSk7CisgICAgICAgIG1lbWNweShwa3QtPmRhdGEgKyBzaXplb2Yoc3RhcnRfc2VxdWVuY2UpLCBidWYsIGxlbik7CisgICAgICAgIENPVU5UX05BTF9UWVBFKGRhdGEsIG5hbCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAyNDogICAgICAgICAgICAgICAgICAgLy8gU1RBUC1BIChvbmUgcGFja2V0LCBtdWx0aXBsZSBuYWxzKQorICAgICAgICAvLyBjb25zdW1lIHRoZSBTVEFQLUEgTkFMCisgICAgICAgIGJ1ZisrOworICAgICAgICBsZW4tLTsKKyAgICAgICAgLy8gZmlyc3Qgd2UgYXJlIGdvaW5nIHRvIGZpZ3VyZSBvdXQgdGhlIHRvdGFsIHNpemUKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBhc3MgICAgICAgICA9IDA7CisgICAgICAgICAgICBpbnQgdG90YWxfbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCAgICAgPSBOVUxMOworCisgICAgICAgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0gYnVmOworICAgICAgICAgICAgICAgIGludCBzcmNfbGVuICAgICAgICA9IGxlbjsKKworICAgICAgICAgICAgICAgIHdoaWxlIChzcmNfbGVuID4gMikgeworICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuYWxfc2l6ZSA9IEFWX1JCMTYoc3JjKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBsZW5ndGggb2YgdGhlIGFnZ3JlZ2F0ZQorICAgICAgICAgICAgICAgICAgICBzcmMgICAgICs9IDI7CisgICAgICAgICAgICAgICAgICAgIHNyY19sZW4gLT0gMjsKKworICAgICAgICAgICAgICAgICAgICBpZiAobmFsX3NpemUgPD0gc3JjX2xlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfbGVuZ3RoICs9IHNpemVvZihzdGFydF9zZXF1ZW5jZSkgKyBuYWxfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChkc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHN0YXJ0X3NlcXVlbmNlLCBzaXplb2Yoc3RhcnRfc2VxdWVuY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gc2l6ZW9mKHN0YXJ0X3NlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIG5hbF9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1VOVF9OQUxfVFlQRShkYXRhLCAqc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gbmFsX3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbCBzaXplIGV4Y2VlZHMgbGVuZ3RoOiAlZCAlZFxuIiwgbmFsX3NpemUsIHNyY19sZW4pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZWF0IHdoYXQgd2UgaGFuZGxlZAorICAgICAgICAgICAgICAgICAgICBzcmMgICAgICs9IG5hbF9zaXplOworICAgICAgICAgICAgICAgICAgICBzcmNfbGVuIC09IG5hbF9zaXplOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfbGVuIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29uc3VtZWQgbW9yZSBieXRlcyB0aGFuIHdlIGdvdCEgKCVkKVxuIiwgc3JjX2xlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBub3cgd2Uga25vdyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcGFja2V0ICh3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiBzdGFydCBzZXF1ZW5jZXMgYWRkZWQpICovCisgICAgICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ID0gYXZfbmV3X3BhY2tldChwa3QsIHRvdGFsX2xlbmd0aCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGRzdCA9IHBrdC0+ZGF0YTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZHN0IC0gcGt0LT5kYXRhID09IHRvdGFsX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAyNTogICAgICAgICAgICAgICAgICAgLy8gU1RBUC1CCisgICAgY2FzZSAyNjogICAgICAgICAgICAgICAgICAgLy8gTVRBUC0xNgorICAgIGNhc2UgMjc6ICAgICAgICAgICAgICAgICAgIC8vIE1UQVAtMjQKKyAgICBjYXNlIDI5OiAgICAgICAgICAgICAgICAgICAvLyBGVS1CCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbmhhbmRsZWQgdHlwZSAoJWQpIChTZWUgUkZDIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzXG4iLAorICAgICAgICAgICAgICAgdHlwZSk7CisgICAgICAgIHJlc3VsdCA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI4OiAgICAgICAgICAgICAgICAgICAvLyBGVS1BIChmcmFnbWVudGVkIG5hbCkKKyAgICAgICAgYnVmKys7CisgICAgICAgIGxlbi0tOyAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgZnVfaW5kaWNhdG9yCisgICAgICAgIGlmIChsZW4gPiAxKSB7CisgICAgICAgICAgICAvLyB0aGVzZSBhcmUgdGhlIHNhbWUgYXMgYWJvdmUsIHdlIGp1c3QgcmVkbyB0aGVtIGhlcmUgZm9yIGNsYXJpdHkKKyAgICAgICAgICAgIHVpbnQ4X3QgZnVfaW5kaWNhdG9yICAgICAgPSBuYWw7CisgICAgICAgICAgICB1aW50OF90IGZ1X2hlYWRlciAgICAgICAgID0gKmJ1ZjsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3RhcnRfYml0ICAgICAgICAgPSBmdV9oZWFkZXIgPj4gNzsKKyAgICAgICAgICAgIHVpbnQ4X3QgYXZfdW51c2VkIGVuZF9iaXQgPSAoZnVfaGVhZGVyICYgMHg0MCkgPj4gNjsKKyAgICAgICAgICAgIHVpbnQ4X3QgbmFsX3R5cGUgICAgICAgICAgPSBmdV9oZWFkZXIgJiAweDFmOworICAgICAgICAgICAgdWludDhfdCByZWNvbnN0cnVjdGVkX25hbDsKKworICAgICAgICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhpcyBwYWNrZXQncyB0cnVlIG5hbDsgb25seSB0aGUgZGF0YSBmb2xsb3dzLgorICAgICAgICAgICAgLyogVGhlIG9yaWdpbmFsIG5hbCBmb3JiaWRkZW4gYml0IGFuZCBOUkkgYXJlIHN0b3JlZCBpbiB0aGlzCisgICAgICAgICAgICAgKiBwYWNrZXQncyBuYWwuICovCisgICAgICAgICAgICByZWNvbnN0cnVjdGVkX25hbCAgPSBmdV9pbmRpY2F0b3IgJiAweGUwOworICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZF9uYWwgfD0gbmFsX3R5cGU7CisKKyAgICAgICAgICAgIC8vIHNraXAgdGhlIGZ1X2hlYWRlcgorICAgICAgICAgICAgYnVmKys7CisgICAgICAgICAgICBsZW4tLTsKKworICAgICAgICAgICAgaWYgKHN0YXJ0X2JpdCkKKyAgICAgICAgICAgICAgICBDT1VOVF9OQUxfVFlQRShkYXRhLCBuYWxfdHlwZSk7CisgICAgICAgICAgICBpZiAoc3RhcnRfYml0KSB7CisgICAgICAgICAgICAgICAgLyogY29weSBpbiB0aGUgc3RhcnQgc2VxdWVuY2UsIGFuZCB0aGUgcmVjb25zdHJ1Y3RlZCBuYWwgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCA9IGF2X25ld19wYWNrZXQocGt0LCBzaXplb2Yoc3RhcnRfc2VxdWVuY2UpICsgc2l6ZW9mKG5hbCkgKyBsZW4pKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgc3RhcnRfc2VxdWVuY2UsIHNpemVvZihzdGFydF9zZXF1ZW5jZSkpOworICAgICAgICAgICAgICAgIHBrdC0+ZGF0YVtzaXplb2Yoc3RhcnRfc2VxdWVuY2UpXSA9IHJlY29uc3RydWN0ZWRfbmFsOworICAgICAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEgKyBzaXplb2Yoc3RhcnRfc2VxdWVuY2UpICsgc2l6ZW9mKG5hbCksIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgPSBhdl9uZXdfcGFja2V0KHBrdCwgbGVuKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBzaG9ydCBkYXRhIGZvciBGVS1BIEgyNjQgUlRQIHBhY2tldFxuIik7CisgICAgICAgICAgICByZXN1bHQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAzMDogICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkCisgICAgY2FzZSAzMTogICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5kZWZpbmVkIHR5cGUgKCVkKVxuIiwgdHlwZSk7CisgICAgICAgIHJlc3VsdCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFBheWxvYWRDb250ZXh0ICpoMjY0X25ld19jb250ZXh0KHZvaWQpCit7CisgICAgcmV0dXJuIGF2X21hbGxvY3ooc2l6ZW9mKFBheWxvYWRDb250ZXh0KSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBoMjY0X2ZyZWVfY29udGV4dChQYXlsb2FkQ29udGV4dCAqZGF0YSkKK3sKKyNpZmRlZiBERUJVRworICAgIGludCBpaTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IDMyOyBpaSsrKSB7CisgICAgICAgIGlmIChkYXRhLT5wYWNrZXRfdHlwZXNfcmVjZWl2ZWRbaWldKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIlJlY2VpdmVkICVkIHBhY2tldHMgb2YgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBkYXRhLT5wYWNrZXRfdHlwZXNfcmVjZWl2ZWRbaWldLCBpaSk7CisgICAgfQorI2VuZGlmCisKKyAgICBhdl9mcmVlKGRhdGEpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaDI2NF9pbml0KEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkQ29udGV4dCAqZGF0YSkKK3sKKyAgICBpZiAoc3RfaW5kZXggPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzLT5zdHJlYW1zW3N0X2luZGV4XS0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9oMjY0X3NkcF9saW5lKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpoMjY0X2RhdGEsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisgICAgQVZTdHJlYW0gKnN0cmVhbTsKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWM7CisgICAgY29uc3QgY2hhciAqcCA9IGxpbmU7CisKKyAgICBpZiAoc3RfaW5kZXggPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0cmVhbSA9IHMtPnN0cmVhbXNbc3RfaW5kZXhdOworICAgIGNvZGVjICA9IHN0cmVhbS0+Y29kZWM7CisKKyAgICBpZiAoYXZfc3Ryc3RhcnQocCwgImZyYW1lc2l6ZToiLCAmcCkpIHsKKyAgICAgICAgY2hhciBidWYxWzUwXTsKKyAgICAgICAgY2hhciAqZHN0ID0gYnVmMTsKKworICAgICAgICAvLyByZW1vdmUgdGhlIHByb3RvY29sIGlkZW50aWZpZXIKKyAgICAgICAgd2hpbGUgKCpwICYmICpwID09ICcgJykKKyAgICAgICAgICAgIHArKzsgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpcCBzcGFjZXMuCisgICAgICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnICcpCisgICAgICAgICAgICBwKys7ICAgICAgICAgICAgICAgICAgICAgLy8gZWF0IHByb3RvY29sIGlkZW50aWZpZXIKKyAgICAgICAgd2hpbGUgKCpwICYmICpwID09ICcgJykKKyAgICAgICAgICAgIHArKzsgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpcCB0cmFpbGluZyBzcGFjZXMuCisgICAgICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnLScgJiYgKGRzdCAtIGJ1ZjEpIDwgc2l6ZW9mKGJ1ZjEpIC0gMSkKKyAgICAgICAgICAgICpkc3QrKyA9ICpwKys7CisgICAgICAgICpkc3QgPSAnXDAnOworCisgICAgICAgIC8vIGE9J2ZyYW1lc2l6ZTo5NiAzMjAtMjQwJworICAgICAgICAvLyBzZXQgb3VyIHBhcmFtZXRlcnMKKyAgICAgICAgY29kZWMtPndpZHRoICAgPSBhdG9pKGJ1ZjEpOworICAgICAgICBjb2RlYy0+aGVpZ2h0ICA9IGF0b2kocCArIDEpOyAvLyBza2lwIHRoZSAtCisgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChwLCAiZm10cDoiLCAmcCkpIHsKKyAgICAgICAgcmV0dXJuIGZmX3BhcnNlX2ZtdHAocywgc3RyZWFtLCBoMjY0X2RhdGEsIHAsIHNkcF9wYXJzZV9mbXRwX2NvbmZpZ19oMjY0KTsKKyAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KHAsICJjbGlwcmVjdDoiLCAmcCkpIHsKKyAgICAgICAgLy8gY291bGQgdXNlIHRoaXMgaWYgd2Ugd2FudGVkLgorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2gyNjRfZHluYW1pY19oYW5kbGVyID0geworICAgIC5lbmNfbmFtZSAgICAgICAgID0gIkgyNjQiLAorICAgIC5jb2RlY190eXBlICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5jb2RlY19pZCAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAuaW5pdCAgICAgICAgICAgICA9IGgyNjRfaW5pdCwKKyAgICAucGFyc2Vfc2RwX2FfbGluZSA9IHBhcnNlX2gyNjRfc2RwX2xpbmUsCisgICAgLmFsbG9jICAgICAgICAgICAgPSBoMjY0X25ld19jb250ZXh0LAorICAgIC5mcmVlICAgICAgICAgICAgID0gaDI2NF9mcmVlX2NvbnRleHQsCisgICAgLnBhcnNlX3BhY2tldCAgICAgPSBoMjY0X2hhbmRsZV9wYWNrZXQKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2hldmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfaGV2Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNGM3NjUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2hldmMuYwpAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIFJUUCBwYXJzZXIgZm9yIEhFVkMvSC4yNjUgcGF5bG9hZCBmb3JtYXQgKGRyYWZ0IHZlcnNpb24gNikKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaG9tYXMgVm9sa2VydCA8dGhvbWFzQGhvbWVyLWNvbmZlcmVuY2luZy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jhc2U2NC5oIgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJydHBkZWMuaCIKKworI2RlZmluZSBSVFBfSEVWQ19QQVlMT0FEX0hFQURFUl9TSVpFICAyCisjZGVmaW5lIFJUUF9IRVZDX0ZVX0hFQURFUl9TSVpFICAgICAgIDEKKyNkZWZpbmUgUlRQX0hFVkNfRE9OTF9GSUVMRF9TSVpFICAgICAgMgorI2RlZmluZSBIRVZDX1NQRUNJRklFRF9OQUxfVU5JVF9UWVBFUyA0OAorCisvKiBTRFAgb3V0LW9mLWJhbmQgc2lnbmFsaW5nIGRhdGEgKi8KK3N0cnVjdCBQYXlsb2FkQ29udGV4dCB7CisgICAgaW50IHVzaW5nX2RvbmxfZmllbGQ7CisgICAgaW50IHByb2ZpbGVfaWQ7CisgICAgdWludDhfdCAqc3BzLCAqcHBzLCAqdnBzLCAqc2VpOworICAgIGludCBzcHNfc2l6ZSwgcHBzX3NpemUsIHZwc19zaXplLCBzZWlfc2l6ZTsKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHN0YXJ0X3NlcXVlbmNlW10gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfTsKKworc3RhdGljIGF2X2NvbGQgUGF5bG9hZENvbnRleHQgKmhldmNfbmV3X2NvbnRleHQodm9pZCkKK3sKKyAgICByZXR1cm4gYXZfbWFsbG9jeihzaXplb2YoUGF5bG9hZENvbnRleHQpKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBoZXZjX2ZyZWVfY29udGV4dChQYXlsb2FkQ29udGV4dCAqZGF0YSkKK3sKKyAgICBhdl9mcmVlKGRhdGEpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaGV2Y19pbml0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBpbnQgc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpkYXRhKQoreworICAgIGF2X2Rsb2coY3R4LCAiaGV2Y19pbml0KCkgZm9yIHN0cmVhbSAlZFxuIiwgc3RfaW5kZXgpOworCisgICAgaWYgKHN0X2luZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjdHgtPnN0cmVhbXNbc3RfaW5kZXhdLT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBoZXZjX3NkcF9wYXJzZV9mbXRwX2NvbmZpZyhBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkQ29udGV4dCAqaGV2Y19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmF0dHIsIGNoYXIgKnZhbHVlKQoreworICAgIC8qIHByb2ZpbGUtc3BhY2U6IDAtMyAqLworICAgIC8qIHByb2ZpbGUtaWQ6IDAtMzEgKi8KKyAgICBpZiAoIXN0cmNtcChhdHRyLCAicHJvZmlsZS1pZCIpKSB7CisgICAgICAgIGhldmNfZGF0YS0+cHJvZmlsZV9pZCA9IGF0b2kodmFsdWUpOworICAgICAgICBhdl9kbG9nKHMsICJTRFA6IGZvdW5kIHByb2ZpbGUtaWQ6ICVkXG4iLCBoZXZjX2RhdGEtPnByb2ZpbGVfaWQpOworICAgIH0KKworICAgIC8qIHRpZXItZmxhZzogMC0xICovCisgICAgLyogbGV2ZWwtaWQ6IDAtMjU1ICovCisgICAgLyogaW50ZXJvcC1jb25zdHJhaW50czogW2Jhc2UxNl0gKi8KKyAgICAvKiBwcm9maWxlLWNvbXBhdGliaWxpdHktaW5kaWNhdG9yOiBbYmFzZTE2XSAqLworICAgIC8qIHNwcm9wLXN1Yi1sYXllci1pZDogMC02LCBkZWZpbmVzIGhpZ2hlc3QgcG9zc2libGUgdmFsdWUgZm9yIFRJRCwgZGVmYXVsdDogNiAqLworICAgIC8qIHJlY3Ytc3ViLWxheWVyLWlkOiAwLTYgKi8KKyAgICAvKiBtYXgtcmVjdi1sZXZlbC1pZDogMC0yNTUgKi8KKyAgICAvKiB0eC1tb2RlOiBNU00sU1NNICovCisgICAgLyogc3Byb3AtdnBzOiBbYmFzZTY0XSAqLworICAgIC8qIHNwcm9wLXNwczogW2Jhc2U2NF0gKi8KKyAgICAvKiBzcHJvcC1wcHM6IFtiYXNlNjRdICovCisgICAgLyogc3Byb3Atc2VpOiBbYmFzZTY0XSAqLworICAgIGlmICghc3RyY21wKGF0dHIsICJzcHJvcC12cHMiKSB8fCAhc3RyY21wKGF0dHIsICJzcHJvcC1zcHMiKSB8fAorICAgICAgICAhc3RyY21wKGF0dHIsICJzcHJvcC1wcHMiKSB8fCAhc3RyY21wKGF0dHIsICJzcHJvcC1zZWkiKSkgeworICAgICAgICB1aW50OF90ICoqZGF0YV9wdHI7CisgICAgICAgIGludCAqc2l6ZV9wdHI7CisgICAgICAgIGlmICghc3RyY21wKGF0dHIsICJzcHJvcC12cHMiKSkgeworICAgICAgICAgICAgZGF0YV9wdHIgPSAmaGV2Y19kYXRhLT52cHM7CisgICAgICAgICAgICBzaXplX3B0ciA9ICZoZXZjX2RhdGEtPnZwc19zaXplOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ciwgInNwcm9wLXNwcyIpKSB7CisgICAgICAgICAgICBkYXRhX3B0ciA9ICZoZXZjX2RhdGEtPnNwczsKKyAgICAgICAgICAgIHNpemVfcHRyID0gJmhldmNfZGF0YS0+c3BzX3NpemU7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLCAic3Byb3AtcHBzIikpIHsKKyAgICAgICAgICAgIGRhdGFfcHRyID0gJmhldmNfZGF0YS0+cHBzOworICAgICAgICAgICAgc2l6ZV9wdHIgPSAmaGV2Y19kYXRhLT5wcHNfc2l6ZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHIsICJzcHJvcC1zZWkiKSkgeworICAgICAgICAgICAgZGF0YV9wdHIgPSAmaGV2Y19kYXRhLT5zZWk7CisgICAgICAgICAgICBzaXplX3B0ciA9ICZoZXZjX2RhdGEtPnNlaV9zaXplOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCp2YWx1ZSkgeworICAgICAgICAgICAgY2hhciBiYXNlNjRwYWNrZXRbMTAyNF07CisgICAgICAgICAgICB1aW50OF90IGRlY29kZWRfcGFja2V0WzEwMjRdOworICAgICAgICAgICAgaW50IGRlY29kZWRfcGFja2V0X3NpemU7CisgICAgICAgICAgICBjaGFyICpkc3QgPSBiYXNlNjRwYWNrZXQ7CisKKyAgICAgICAgICAgIHdoaWxlICgqdmFsdWUgJiYgKnZhbHVlICE9ICcsJyAmJgorICAgICAgICAgICAgICAgICAgIChkc3QgLSBiYXNlNjRwYWNrZXQpIDwgc2l6ZW9mKGJhc2U2NHBhY2tldCkgLSAxKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gKnZhbHVlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZHN0KysgPSAnXDAnOworCisgICAgICAgICAgICBpZiAoKnZhbHVlID09ICcsJykKKyAgICAgICAgICAgICAgICB2YWx1ZSsrOworCisgICAgICAgICAgICBkZWNvZGVkX3BhY2tldF9zaXplID0gYXZfYmFzZTY0X2RlY29kZShkZWNvZGVkX3BhY2tldCwgYmFzZTY0cGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRlY29kZWRfcGFja2V0KSk7CisgICAgICAgICAgICBpZiAoZGVjb2RlZF9wYWNrZXRfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICp0bXAgPSBhdl9yZWFsbG9jKCpkYXRhX3B0ciwgZGVjb2RlZF9wYWNrZXRfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RhcnRfc2VxdWVuY2UpICsgKnNpemVfcHRyKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRtcCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGV4dHJhZGF0YSFcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqZGF0YV9wdHIgPSB0bXA7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoKmRhdGFfcHRyICsgKnNpemVfcHRyLCBzdGFydF9zZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0YXJ0X3NlcXVlbmNlKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCpkYXRhX3B0ciArICpzaXplX3B0ciArIHNpemVvZihzdGFydF9zZXF1ZW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRfcGFja2V0LCBkZWNvZGVkX3BhY2tldF9zaXplKTsKKworICAgICAgICAgICAgICAgICpzaXplX3B0ciArPSBzaXplb2Yoc3RhcnRfc2VxdWVuY2UpICsgZGVjb2RlZF9wYWNrZXRfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG1heC1sc3IsIG1heC1scHMsIG1heC1jcGIsIG1heC1kcGIsIG1heC1iciwgbWF4LXRyLCBtYXgtdGMgKi8KKyAgICAvKiBtYXgtZnBzICovCisKKyAgICAvKiBzcHJvcC1tYXgtZG9uLWRpZmY6IDAtMzI3NjcKKworICAgICAgICAgV2hlbiB0aGUgUlRQIHN0cmVhbSBkZXBlbmRzIG9uIG9uZSBvciBtb3JlIG90aGVyIFJUUAorICAgICAgICAgc3RyZWFtcyAoaW4gdGhpcyBjYXNlIHR4LW1vZGUgTVVTVCBiZSBlcXVhbCB0byAiTVNNIiBhbmQKKyAgICAgICAgIE1TTSBpcyBpbiB1c2UpLCB0aGlzIHBhcmFtZXRlciBNVVNUIGJlIHByZXNlbnQgYW5kIHRoZQorICAgICAgICAgdmFsdWUgTVVTVCBiZSBncmVhdGVyIHRoYW4gMC4KKyAgICAqLworICAgIGlmICghc3RyY21wKGF0dHIsICJzcHJvcC1tYXgtZG9uLWRpZmYiKSkgeworICAgICAgICBpZiAoYXRvaSh2YWx1ZSkgPiAwKQorICAgICAgICAgICAgaGV2Y19kYXRhLT51c2luZ19kb25sX2ZpZWxkID0gMTsKKyAgICAgICAgYXZfZGxvZyhzLCAiRm91bmQgc3Byb3AtbWF4LWRvbi1kaWZmIGluIFNEUCwgRE9OIGZpZWxkIHVzYWdlIGlzOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBoZXZjX2RhdGEtPnVzaW5nX2RvbmxfZmllbGQpOworICAgIH0KKworICAgIC8qIHNwcm9wLWRlcGFjay1idWYtbmFsdXM6IDAtMzI3NjcgKi8KKyAgICBpZiAoIXN0cmNtcChhdHRyLCAic3Byb3AtZGVwYWNrLWJ1Zi1uYWx1cyIpKSB7CisgICAgICAgIGlmIChhdG9pKHZhbHVlKSA+IDApCisgICAgICAgICAgICBoZXZjX2RhdGEtPnVzaW5nX2RvbmxfZmllbGQgPSAxOworICAgICAgICBhdl9kbG9nKHMsICJGb3VuZCBzcHJvcC1kZXBhY2stYnVmLW5hbHVzIGluIFNEUCwgRE9OIGZpZWxkIHVzYWdlIGlzOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBoZXZjX2RhdGEtPnVzaW5nX2RvbmxfZmllbGQpOworICAgIH0KKworICAgIC8qIHNwcm9wLWRlcGFjay1idWYtYnl0ZXM6IDAtNDI5NDk2NzI5NSAqLworICAgIC8qIGRlcGFjay1idWYtY2FwICovCisgICAgLyogc3Byb3Atc2VnbWVudGF0aW9uLWlkOiAwLTMgKi8KKyAgICAvKiBzcHJvcC1zcGF0aWFsLXNlZ21lbnRhdGlvbi1pZGM6IFtiYXNlMTZdICovCisgICAgLyogZGVjLXBhcmFsbGVsLWNhOiAqLworICAgIC8qIGluY2x1ZGUtZHBoICovCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGhldmNfcGFyc2Vfc2RwX2xpbmUoQVZGb3JtYXRDb250ZXh0ICpjdHgsIGludCBzdF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpoZXZjX2RhdGEsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisgICAgQVZTdHJlYW0gKmN1cnJlbnRfc3RyZWFtOworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYzsKKyAgICBjb25zdCBjaGFyICpzZHBfbGluZV9wdHIgPSBsaW5lOworCisgICAgaWYgKHN0X2luZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjdXJyZW50X3N0cmVhbSA9IGN0eC0+c3RyZWFtc1tzdF9pbmRleF07CisgICAgY29kZWMgID0gY3VycmVudF9zdHJlYW0tPmNvZGVjOworCisgICAgaWYgKGF2X3N0cnN0YXJ0KHNkcF9saW5lX3B0ciwgImZyYW1lc2l6ZToiLCAmc2RwX2xpbmVfcHRyKSkgeworICAgICAgICBjaGFyIHN0cl92aWRlb193aWR0aFs1MF07CisgICAgICAgIGNoYXIgKnN0cl92aWRlb193aWR0aF9wdHIgPSBzdHJfdmlkZW9fd2lkdGg7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogcGFyc2UgImE9ZnJhbWVzaXplOjk2IDMyMC0yNDAiCisgICAgICAgICAqLworCisgICAgICAgIC8qIGlnbm9yZSBzcGFjZXMgKi8KKyAgICAgICAgd2hpbGUgKCpzZHBfbGluZV9wdHIgJiYgKnNkcF9saW5lX3B0ciA9PSAnICcpCisgICAgICAgICAgICBzZHBfbGluZV9wdHIrKzsKKyAgICAgICAgLyogaWdub3JlIFJUUCBwYXlsb2FkIElEICovCisgICAgICAgIHdoaWxlICgqc2RwX2xpbmVfcHRyICYmICpzZHBfbGluZV9wdHIgIT0gJyAnKQorICAgICAgICAgICAgc2RwX2xpbmVfcHRyKys7CisgICAgICAgIC8qIGlnbm9yZSBzcGFjZXMgKi8KKyAgICAgICAgd2hpbGUgKCpzZHBfbGluZV9wdHIgJiYgKnNkcF9saW5lX3B0ciA9PSAnICcpCisgICAgICAgICAgICBzZHBfbGluZV9wdHIrKzsKKyAgICAgICAgLyogZXh0cmFjdCB0aGUgYWN0dWFsIHZpZGVvIHJlc29sdXRpb24gZGVzY3JpcHRpb24gKi8KKyAgICAgICAgd2hpbGUgKCpzZHBfbGluZV9wdHIgJiYgKnNkcF9saW5lX3B0ciAhPSAnLScgJiYKKyAgICAgICAgICAgICAgIChzdHJfdmlkZW9fd2lkdGhfcHRyIC0gc3RyX3ZpZGVvX3dpZHRoKSA8IHNpemVvZihzdHJfdmlkZW9fd2lkdGgpIC0gMSkKKyAgICAgICAgICAgICpzdHJfdmlkZW9fd2lkdGhfcHRyKysgPSAqc2RwX2xpbmVfcHRyKys7CisgICAgICAgIC8qIGFkZCB0cmFpbGluZyB6ZXJvIGJ5dGUgKi8KKyAgICAgICAgKnN0cl92aWRlb193aWR0aF9wdHIgPSAnXDAnOworCisgICAgICAgIC8qIGRldGVybWluZSB0aGUgd2lkdGggdmFsdWUgKi8KKyAgICAgICAgY29kZWMtPndpZHRoICAgPSBhdG9pKHN0cl92aWRlb193aWR0aCk7CisgICAgICAgIC8qIGp1bXAgYmV5b25kIHRoZSAiLSIgYW5kIGRldGVybWluZSB0aGUgaGVpZ2h0IHZhbHVlICovCisgICAgICAgIGNvZGVjLT5oZWlnaHQgID0gYXRvaShzZHBfbGluZV9wdHIgKyAxKTsKKyAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KHNkcF9saW5lX3B0ciwgImZtdHA6IiwgJnNkcF9saW5lX3B0cikpIHsKKyAgICAgICAgaW50IHJldCA9IGZmX3BhcnNlX2ZtdHAoY3R4LCBjdXJyZW50X3N0cmVhbSwgaGV2Y19kYXRhLCBzZHBfbGluZV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhldmNfc2RwX3BhcnNlX2ZtdHBfY29uZmlnKTsKKyAgICAgICAgaWYgKGhldmNfZGF0YS0+dnBzX3NpemUgfHwgaGV2Y19kYXRhLT5zcHNfc2l6ZSB8fAorICAgICAgICAgICAgaGV2Y19kYXRhLT5wcHNfc2l6ZSB8fCBoZXZjX2RhdGEtPnNlaV9zaXplKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmY29kZWMtPmV4dHJhZGF0YSk7CisgICAgICAgICAgICBjb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBoZXZjX2RhdGEtPnZwc19zaXplICsgaGV2Y19kYXRhLT5zcHNfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXZjX2RhdGEtPnBwc19zaXplICsgaGV2Y19kYXRhLT5zZWlfc2l6ZTsKKyAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGEgPSBhdl9tYWxsb2MoY29kZWMtPmV4dHJhZGF0YV9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBpZiAoIWNvZGVjLT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgY29kZWMtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjLT5leHRyYWRhdGEgKyBwb3MsIGhldmNfZGF0YS0+dnBzLCBoZXZjX2RhdGEtPnZwc19zaXplKTsKKyAgICAgICAgICAgICAgICBwb3MgKz0gaGV2Y19kYXRhLT52cHNfc2l6ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWMtPmV4dHJhZGF0YSArIHBvcywgaGV2Y19kYXRhLT5zcHMsIGhldmNfZGF0YS0+c3BzX3NpemUpOworICAgICAgICAgICAgICAgIHBvcyArPSBoZXZjX2RhdGEtPnNwc19zaXplOworICAgICAgICAgICAgICAgIG1lbWNweShjb2RlYy0+ZXh0cmFkYXRhICsgcG9zLCBoZXZjX2RhdGEtPnBwcywgaGV2Y19kYXRhLT5wcHNfc2l6ZSk7CisgICAgICAgICAgICAgICAgcG9zICs9IGhldmNfZGF0YS0+cHBzX3NpemU7CisgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjLT5leHRyYWRhdGEgKyBwb3MsIGhldmNfZGF0YS0+c2VpLCBoZXZjX2RhdGEtPnNlaV9zaXplKTsKKyAgICAgICAgICAgICAgICBwb3MgKz0gaGV2Y19kYXRhLT5zZWlfc2l6ZTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoY29kZWMtPmV4dHJhZGF0YSArIHBvcywgMCwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZoZXZjX2RhdGEtPnZwcyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmaGV2Y19kYXRhLT5zcHMpOworICAgICAgICAgICAgYXZfZnJlZXAoJmhldmNfZGF0YS0+cHBzKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZoZXZjX2RhdGEtPnNlaSk7CisgICAgICAgICAgICBoZXZjX2RhdGEtPnZwc19zaXplID0gMDsKKyAgICAgICAgICAgIGhldmNfZGF0YS0+c3BzX3NpemUgPSAwOworICAgICAgICAgICAgaGV2Y19kYXRhLT5wcHNfc2l6ZSA9IDA7CisgICAgICAgICAgICBoZXZjX2RhdGEtPnNlaV9zaXplID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhldmNfaGFuZGxlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmN0eCwgUGF5bG9hZENvbnRleHQgKnJ0cF9oZXZjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCwgdWludDMyX3QgKnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgdWludDE2X3Qgc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnJ0cF9wbCA9IGJ1ZjsKKyAgICBpbnQgdGlkLCBsaWQsIG5hbF90eXBlOworICAgIGludCBmaXJzdF9mcmFnbWVudCwgbGFzdF9mcmFnbWVudCwgZnVfdHlwZTsKKyAgICB1aW50OF90IG5ld19uYWxfaGVhZGVyWzJdOworICAgIGludCByZXMgPSAwOworCisgICAgLyogc2FuaXR5IGNoZWNrIGZvciBzaXplIG9mIGlucHV0IHBhY2tldDogMSBieXRlIHBheWxvYWQgYXQgbGVhc3QgKi8KKyAgICBpZiAobGVuIDwgUlRQX0hFVkNfUEFZTE9BRF9IRUFERVJfU0laRSArIDEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IFJUUC9IRVZDIHBhY2tldCwgZ290ICVkIGJ5dGVzXG4iLCBsZW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKgorICAgICAgZGVjb2RlIHRoZSBIRVZDIHBheWxvYWQgaGVhZGVyIGFjY29yZGluZyB0byBzZWN0aW9uIDQgb2YgZHJhZnQgdmVyc2lvbiA2OgorCisgICAgICAgICAwICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgIHxGfCAgIFR5cGUgICAgfCAgTGF5ZXJJZCAgfCBUSUQgfAorICAgICAgICArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKKworICAgICAgICAgICBGb3JiaWRkZW4gemVybyAoRik6IDEgYml0CisgICAgICAgICAgIE5BTCB1bml0IHR5cGUgKFR5cGUpOiA2IGJpdHMKKyAgICAgICAgICAgTlVIIGxheWVyIElEIChMYXllcklkKTogNiBiaXRzCisgICAgICAgICAgIE5VSCB0ZW1wb3JhbCBJRCBwbHVzIDEgKFRJRCk6IDMgYml0cworICAgICovCisgICAgbmFsX3R5cGUgPSAgKGJ1ZlswXSA+PiAxKSAmIDB4M2Y7CisgICAgbGlkICA9ICgoYnVmWzBdIDw8IDUpICYgMHgyMCkgfCAoKGJ1ZlsxXSA+PiAzKSAmIDB4MWYpOworICAgIHRpZCAgPSAgIGJ1ZlsxXSAmIDB4MDc7CisKKyAgICAvKiBzYW5pdHkgY2hlY2sgZm9yIGNvcnJlY3QgbGF5ZXIgSUQgKi8KKyAgICBpZiAobGlkKSB7CisgICAgICAgIC8qIGZ1dHVyZSBzY2FsYWJsZSBvciAzRCB2aWRlbyBjb2RpbmcgZXh0ZW5zaW9ucyAqLworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShjdHgsICJNdWx0aS1sYXllciBIRVZDIGNvZGluZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvKiBzYW5pdHkgY2hlY2sgZm9yIGNvcnJlY3QgdGVtcG9yYWwgSUQgKi8KKyAgICBpZiAoIXRpZCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbGxlZ2FsIHRlbXBvcmFsIElEIGluIFJUUC9IRVZDIHBhY2tldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIHNhbml0eSBjaGVjayBmb3IgY29ycmVjdCBOQUwgdW5pdCB0eXBlICovCisgICAgaWYgKG5hbF90eXBlID4gNTApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgKEhFVkMpIE5BTCB0eXBlICglZClcbiIsIG5hbF90eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3dpdGNoIChuYWxfdHlwZSkgeworICAgIC8qIGFnZ3JlZ2F0ZWQgcGFja2V0cyAoQVApICovCisgICAgY2FzZSA0ODoKKyAgICAgICAgLyogcGFzcyB0aGUgSEVWQyBwYXlsb2FkIGhlYWRlciAqLworICAgICAgICBidWYgKz0gUlRQX0hFVkNfUEFZTE9BRF9IRUFERVJfU0laRTsKKyAgICAgICAgbGVuIC09IFJUUF9IRVZDX1BBWUxPQURfSEVBREVSX1NJWkU7CisKKyAgICAgICAgLyogcGFzcyB0aGUgSEVWQyBET05MIGZpZWxkICovCisgICAgICAgIGlmIChydHBfaGV2Y19jdHgtPnVzaW5nX2RvbmxfZmllbGQpIHsKKyAgICAgICAgICAgIGJ1ZiArPSBSVFBfSEVWQ19ET05MX0ZJRUxEX1NJWkU7CisgICAgICAgICAgICBsZW4gLT0gUlRQX0hFVkNfRE9OTF9GSUVMRF9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgLyogdmlkZW8gcGFyYW1ldGVyIHNldCAoVlBTKSAqLworICAgIGNhc2UgMzI6CisgICAgLyogc2VxdWVuY2UgcGFyYW1ldGVyIHNldCAoU1BTKSAqLworICAgIGNhc2UgMzM6CisgICAgLyogcGljdHVyZSBwYXJhbWV0ZXIgc2V0IChQUFMpICovCisgICAgY2FzZSAzNDoKKyAgICAvKiAgc3VwcGxlbWVudGFsIGVuaGFuY2VtZW50IGluZm9ybWF0aW9uIChTRUkpICovCisgICAgY2FzZSAzOToKKyAgICAvKiBzaW5nbGUgTkFMIHVuaXQgcGFja2V0ICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogc2FuaXR5IGNoZWNrIGZvciBzaXplIG9mIGlucHV0IHBhY2tldDogMSBieXRlIHBheWxvYWQgYXQgbGVhc3QgKi8KKyAgICAgICAgaWYgKGxlbiA8IDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVG9vIHNob3J0IFJUUC9IRVZDIHBhY2tldCwgZ290ICVkIGJ5dGVzIG9mIE5BTCB1bml0IHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgbGVuLCBuYWxfdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNyZWF0ZSBBL1YgcGFja2V0ICovCisgICAgICAgIGlmICgocmVzID0gYXZfbmV3X3BhY2tldChwa3QsIHNpemVvZihzdGFydF9zZXF1ZW5jZSkgKyBsZW4pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAvKiBBL1YgcGFja2V0OiBjb3B5IHN0YXJ0IHNlcXVlbmNlICovCisgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIHN0YXJ0X3NlcXVlbmNlLCBzaXplb2Yoc3RhcnRfc2VxdWVuY2UpKTsKKyAgICAgICAgLyogQS9WIHBhY2tldDogY29weSBOQUwgdW5pdCBkYXRhICovCisgICAgICAgIG1lbWNweShwa3QtPmRhdGEgKyBzaXplb2Yoc3RhcnRfc2VxdWVuY2UpLCBidWYsIGxlbik7CisKKyAgICAgICAgYnJlYWs7CisgICAgLyogZnJhZ21lbnRhdGlvbiB1bml0IChGVSkgKi8KKyAgICBjYXNlIDQ5OgorICAgICAgICAvKiBwYXNzIHRoZSBIRVZDIHBheWxvYWQgaGVhZGVyICovCisgICAgICAgIGJ1ZiArPSBSVFBfSEVWQ19QQVlMT0FEX0hFQURFUl9TSVpFOworICAgICAgICBsZW4gLT0gUlRQX0hFVkNfUEFZTE9BRF9IRUFERVJfU0laRTsKKworICAgICAgICAvKgorICAgICAgICAgICAgIGRlY29kZSB0aGUgRlUgaGVhZGVyCisKKyAgICAgICAgICAgICAgMCAxIDIgMyA0IDUgNiA3CisgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICB8U3xFfCAgRnVUeXBlICAgfAorICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCisKKyAgICAgICAgICAgICAgICBTdGFydCBmcmFnbWVudCAoUyk6IDEgYml0CisgICAgICAgICAgICAgICAgRW5kIGZyYWdtZW50IChFKTogMSBiaXQKKyAgICAgICAgICAgICAgICBGdVR5cGU6IDYgYml0cworICAgICAgICAqLworICAgICAgICBmaXJzdF9mcmFnbWVudCA9IGJ1ZlswXSAmIDB4ODA7CisgICAgICAgIGxhc3RfZnJhZ21lbnQgID0gYnVmWzBdICYgMHg0MDsKKyAgICAgICAgZnVfdHlwZSAgICAgICAgPSBidWZbMF0gJiAweDNmOworCisgICAgICAgIC8qIHBhc3MgdGhlIEhFVkMgRlUgaGVhZGVyICovCisgICAgICAgIGJ1ZiArPSBSVFBfSEVWQ19GVV9IRUFERVJfU0laRTsKKyAgICAgICAgbGVuIC09IFJUUF9IRVZDX0ZVX0hFQURFUl9TSVpFOworCisgICAgICAgIC8qIHBhc3MgdGhlIEhFVkMgRE9OTCBmaWVsZCAqLworICAgICAgICBpZiAocnRwX2hldmNfY3R4LT51c2luZ19kb25sX2ZpZWxkKSB7CisgICAgICAgICAgICBidWYgKz0gUlRQX0hFVkNfRE9OTF9GSUVMRF9TSVpFOworICAgICAgICAgICAgbGVuIC09IFJUUF9IRVZDX0RPTkxfRklFTERfU0laRTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Rsb2coY3R4LCAiIEZVIHR5cGUgJWQgd2l0aCAlZCBieXRlc1xuIiwgZnVfdHlwZSwgbGVuKTsKKworICAgICAgICAvKiBzYW5pdHkgY2hlY2sgZm9yIHNpemUgb2YgaW5wdXQgcGFja2V0OiAxIGJ5dGUgcGF5bG9hZCBhdCBsZWFzdCAqLworICAgICAgICBpZiAobGVuID4gMCkgeworICAgICAgICAgICAgbmV3X25hbF9oZWFkZXJbMF0gPSAocnRwX3BsWzBdICYgMHg4MSkgfCAoZnVfdHlwZSA8PCAxKTsKKyAgICAgICAgICAgIG5ld19uYWxfaGVhZGVyWzFdID0gcnRwX3BsWzFdOworCisgICAgICAgICAgICAvKiBzdGFydCBmcmFnbWVudCB2cy4gc3Vic2VxdWVudCBmcmFnbWVudHMgKi8KKyAgICAgICAgICAgIGlmIChmaXJzdF9mcmFnbWVudCkgeworICAgICAgICAgICAgICAgIGlmICghbGFzdF9mcmFnbWVudCkgeworICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgQS9WIHBhY2tldCB3aGljaCBpcyBiaWcgZW5vdWdoICovCisgICAgICAgICAgICAgICAgICAgIGlmICgocmVzID0gYXZfbmV3X3BhY2tldChwa3QsIHNpemVvZihzdGFydF9zZXF1ZW5jZSkgKyBzaXplb2YobmV3X25hbF9oZWFkZXIpICsgbGVuKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICAgICAgLyogQS9WIHBhY2tldDogY29weSBzdGFydCBzZXF1ZW5jZSAqLworICAgICAgICAgICAgICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBzdGFydF9zZXF1ZW5jZSwgc2l6ZW9mKHN0YXJ0X3NlcXVlbmNlKSk7CisgICAgICAgICAgICAgICAgICAgIC8qIEEvViBwYWNrZXQ6IGNvcHkgbmV3IE5BTCBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSArIHNpemVvZihzdGFydF9zZXF1ZW5jZSksIG5ld19uYWxfaGVhZGVyLCBzaXplb2YobmV3X25hbF9oZWFkZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgLyogQS9WIHBhY2tldDogY29weSBOQUwgdW5pdCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEgKyBzaXplb2Yoc3RhcnRfc2VxdWVuY2UpICsgc2l6ZW9mKG5ld19uYWxfaGVhZGVyKSwgYnVmLCBsZW4pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIklsbGVnYWwgY29tYmluYXRpb24gb2YgUyBhbmQgRSBiaXQgaW4gUlRQL0hFVkMgcGFja2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBBL1YgcGFja2V0ICovCisgICAgICAgICAgICAgICAgaWYgKChyZXMgPSBhdl9uZXdfcGFja2V0KHBrdCwgbGVuKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIC8qIEEvViBwYWNrZXQ6IGNvcHkgTkFMIHVuaXQgZGF0YSAqLworICAgICAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVG9vIHNob3J0IFJUUC9IRVZDIHBhY2tldCwgZ290ICVkIGJ5dGVzIG9mIE5BTCB1bml0IHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgbmFsX3R5cGUpOworICAgICAgICAgICAgICAgIHJlcyA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIC8qIFBBQ0kgcGFja2V0ICovCisgICAgY2FzZSA1MDoKKyAgICAgICAgLyogVGVtcG9yYWwgc2NhbGFiaWxpdHkgY29udHJvbCBpbmZvcm1hdGlvbiAoVFNDSSkgKi8KKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoY3R4LCAiUEFDSSBwYWNrZXRzIGZvciBSVFAvSEVWQ1xuIik7CisgICAgICAgIHJlcyA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKworICAgIHJldHVybiByZXM7Cit9CisKK1JUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaGV2Y19keW5hbWljX2hhbmRsZXIgPSB7CisgICAgLmVuY19uYW1lICAgICAgICAgPSAiSDI2NSIsCisgICAgLmNvZGVjX3R5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9IRVZDLAorICAgIC5pbml0ICAgICAgICAgICAgID0gaGV2Y19pbml0LAorICAgIC5wYXJzZV9zZHBfYV9saW5lID0gaGV2Y19wYXJzZV9zZHBfbGluZSwKKyAgICAuYWxsb2MgICAgICAgICAgICA9IGhldmNfbmV3X2NvbnRleHQsCisgICAgLmZyZWUgICAgICAgICAgICAgPSBoZXZjX2ZyZWVfY29udGV4dCwKKyAgICAucGFyc2VfcGFja2V0ICAgICA9IGhldmNfaGFuZGxlX3BhY2tldAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfaWxiYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19pbGJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExNTc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfaWxiYy5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBSVFAgaUxCQyBEZXBhY2tldGl6ZXIsIFJGQyAzOTUyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicnRwZGVjX2Zvcm1hdHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKworc3RhdGljIGludCBpbGJjX3BhcnNlX2ZtdHAoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0cmVhbSwgUGF5bG9hZENvbnRleHQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphdHRyLCBjaGFyICp2YWx1ZSkKK3sKKyAgICBpZiAoIXN0cmNtcChhdHRyLCAibW9kZSIpKSB7CisgICAgICAgIGludCBtb2RlID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgc3RyZWFtLT5jb2RlYy0+YmxvY2tfYWxpZ24gPSAzODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgc3RyZWFtLT5jb2RlYy0+YmxvY2tfYWxpZ24gPSA1MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGlMQkMgbW9kZSAlZFxuIiwgbW9kZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlsYmNfcGFyc2Vfc2RwX2xpbmUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZENvbnRleHQgKmRhdGEsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBpZiAoc3RfaW5kZXggPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IHMtPnN0cmVhbXNbc3RfaW5kZXhdOworCisgICAgaWYgKGF2X3N0cnN0YXJ0KGxpbmUsICJmbXRwOiIsICZwKSkgeworICAgICAgICBpbnQgcmV0ID0gZmZfcGFyc2VfZm10cChzLCBzdCwgZGF0YSwgcCwgaWxiY19wYXJzZV9mbXRwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoIXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyBpTEJDIG1vZGUgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK1JUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaWxiY19keW5hbWljX2hhbmRsZXIgPSB7CisgICAgLmVuY19uYW1lICAgICAgICAgPSAiaUxCQyIsCisgICAgLmNvZGVjX3R5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9JTEJDLAorICAgIC5wYXJzZV9zZHBfYV9saW5lID0gaWxiY19wYXJzZV9zZHBfbGluZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2pwZWcuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZDgwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2pwZWcuYwpAQCAtMCwwICsxLDQwOSBAQAorLyoKKyAqIFJUUCBKUEVHLWNvbXByZXNzZWQgVmlkZW8gRGVwYWNrZXRpemVyLCBSRkMgMjQzNQorICogQ29weXJpZ2h0IChjKSAyMDEyIFNhbXVlbCBQaXRvaXNldAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJydHBkZWMuaCIKKyNpbmNsdWRlICJydHBkZWNfZm9ybWF0cy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21qcGVnLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCisKKy8qKgorICogUlRQL0pQRUcgc3BlY2lmaWMgcHJpdmF0ZSBkYXRhLgorICovCitzdHJ1Y3QgUGF5bG9hZENvbnRleHQgeworICAgIEFWSU9Db250ZXh0ICpmcmFtZTsgICAgICAgICAvLy88IGN1cnJlbnQgZnJhbWUgYnVmZmVyCisgICAgdWludDMyX3QgICAgdGltZXN0YW1wOyAgICAgIC8vLzwgY3VycmVudCBmcmFtZSB0aW1lc3RhbXAKKyAgICBpbnQgICAgICAgICBoZHJfc2l6ZTsgICAgICAgLy8vPCBzaXplIG9mIHRoZSBjdXJyZW50IGZyYW1lIGhlYWRlcgorICAgIHVpbnQ4X3QgICAgIHF0YWJsZXNbMTI4XVsxMjhdOworICAgIHVpbnQ4X3QgICAgIHF0YWJsZXNfbGVuWzEyOF07Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkZWZhdWx0X3F1YW50aXplcnNbMTI4XSA9IHsKKyAgICAvKiBsdW1hIHRhYmxlICovCisgICAgMTYsICAxMSwgIDEyLCAgMTQsICAxMiwgIDEwLCAgMTYsICAxNCwKKyAgICAxMywgIDE0LCAgMTgsICAxNywgIDE2LCAgMTksICAyNCwgIDQwLAorICAgIDI2LCAgMjQsICAyMiwgIDIyLCAgMjQsICA0OSwgIDM1LCAgMzcsCisgICAgMjksICA0MCwgIDU4LCAgNTEsICA2MSwgIDYwLCAgNTcsICA1MSwKKyAgICA1NiwgIDU1LCAgNjQsICA3MiwgIDkyLCAgNzgsICA2NCwgIDY4LAorICAgIDg3LCAgNjksICA1NSwgIDU2LCAgODAsICAxMDksIDgxLCAgODcsCisgICAgOTUsICA5OCwgIDEwMywgMTA0LCAxMDMsIDYyLCAgNzcsICAxMTMsCisgICAgMTIxLCAxMTIsIDEwMCwgMTIwLCA5MiwgIDEwMSwgMTAzLCA5OSwKKworICAgIC8qIGNocm9tYSB0YWJsZSAqLworICAgIDE3LCAgMTgsICAxOCwgIDI0LCAgMjEsICAyNCwgIDQ3LCAgMjYsCisgICAgMjYsICA0NywgIDk5LCAgNjYsICA1NiwgIDY2LCAgOTksICA5OSwKKyAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OQorfTsKKworc3RhdGljIFBheWxvYWRDb250ZXh0ICpqcGVnX25ld19jb250ZXh0KHZvaWQpCit7CisgICAgcmV0dXJuIGF2X21hbGxvY3ooc2l6ZW9mKFBheWxvYWRDb250ZXh0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2ZyYW1lX2lmX25lZWRlZChQYXlsb2FkQ29udGV4dCAqanBlZykKK3sKKyAgICBpZiAoanBlZy0+ZnJhbWUpIHsKKyAgICAgICAgdWludDhfdCAqcDsKKyAgICAgICAgYXZpb19jbG9zZV9keW5fYnVmKGpwZWctPmZyYW1lLCAmcCk7CisgICAgICAgIGF2X2ZyZWUocCk7CisgICAgICAgIGpwZWctPmZyYW1lID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGpwZWdfZnJlZV9jb250ZXh0KFBheWxvYWRDb250ZXh0ICpqcGVnKQoreworICAgIGZyZWVfZnJhbWVfaWZfbmVlZGVkKGpwZWcpOworICAgIGF2X2ZyZWUoanBlZyk7Cit9CisKK3N0YXRpYyBpbnQganBlZ19jcmVhdGVfaHVmZm1hbl90YWJsZShQdXRCeXRlQ29udGV4dCAqcCwgaW50IHRhYmxlX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWJsZV9pZCwgY29uc3QgdWludDhfdCAqYml0c190YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp2YWx1ZV90YWJsZSkKK3sKKyAgICBpbnQgaSwgbiA9IDA7CisKKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwLCB0YWJsZV9jbGFzcyA8PCA0IHwgdGFibGVfaWQpOworCisgICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKSB7CisgICAgICAgIG4gKz0gYml0c190YWJsZVtpXTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocCwgYml0c190YWJsZVtpXSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwLCB2YWx1ZV90YWJsZVtpXSk7CisgICAgfQorICAgIHJldHVybiBuICsgMTc7Cit9CisKK3N0YXRpYyB2b2lkIGpwZWdfcHV0X21hcmtlcihQdXRCeXRlQ29udGV4dCAqcGJjLCBpbnQgY29kZSkKK3sKKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYmMsIDB4ZmYpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiYywgY29kZSk7Cit9CisKK3N0YXRpYyBpbnQganBlZ19jcmVhdGVfaGVhZGVyKHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoLCBjb25zdCB1aW50OF90ICpxdGFibGUsIGludCBuYl9xdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHJpKQoreworICAgIFB1dEJ5dGVDb250ZXh0IHBiYzsKKyAgICB1aW50OF90ICpkaHRfc2l6ZV9wdHI7CisgICAgaW50IGRodF9zaXplLCBpOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIoJnBiYywgYnVmLCBzaXplKTsKKworICAgIC8qIENvbnZlcnQgZnJvbSBibG9ja3MgdG8gcGl4ZWxzLiAqLworICAgIHcgPDw9IDM7CisgICAgaCA8PD0gMzsKKworICAgIC8qIFNPSSAqLworICAgIGpwZWdfcHV0X21hcmtlcigmcGJjLCBTT0kpOworCisgICAgLyogSkZJRiBoZWFkZXIgKi8KKyAgICBqcGVnX3B1dF9tYXJrZXIoJnBiYywgQVBQMCk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMTYoJnBiYywgMTYpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9idWZmZXIoJnBiYywgIkpGSUYiLCA1KTsKKyAgICBieXRlc3RyZWFtMl9wdXRfYmUxNigmcGJjLCAweDAyMDEpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDApOworICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2KCZwYmMsIDEpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2KCZwYmMsIDEpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDApOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDApOworCisgICAgaWYgKGRyaSkgeworICAgICAgICBqcGVnX3B1dF9tYXJrZXIoJnBiYywgRFJJKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMTYoJnBiYywgNCk7CisgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2KCZwYmMsIGRyaSk7CisgICAgfQorCisgICAgLyogRFFUICovCisgICAganBlZ19wdXRfbWFya2VyKCZwYmMsIERRVCk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMTYoJnBiYywgMiArIG5iX3F0YWJsZSAqICgxICsgNjQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9xdGFibGU7IGkrKykgeworICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGJjLCBpKTsKKworICAgICAgICAvKiBFYWNoIHRhYmxlIGlzIGFuIGFycmF5IG9mIDY0IHZhbHVlcyBnaXZlbiBpbiB6aWctemFnCisgICAgICAgICAqIG9yZGVyLCBpZGVudGljYWwgdG8gdGhlIGZvcm1hdCB1c2VkIGluIGEgSkZJRiBEUVQKKyAgICAgICAgICogbWFya2VyIHNlZ21lbnQuICovCisgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9idWZmZXIoJnBiYywgcXRhYmxlICsgNjQgKiBpLCA2NCk7CisgICAgfQorCisgICAgLyogREhUICovCisgICAganBlZ19wdXRfbWFya2VyKCZwYmMsIERIVCk7CisgICAgZGh0X3NpemVfcHRyID0gcGJjLmJ1ZmZlcjsKKyAgICBieXRlc3RyZWFtMl9wdXRfYmUxNigmcGJjLCAwKTsKKworICAgIGRodF9zaXplICA9IDI7CisgICAgZGh0X3NpemUgKz0ganBlZ19jcmVhdGVfaHVmZm1hbl90YWJsZSgmcGJjLCAwLCAwLGF2cHJpdl9tanBlZ19iaXRzX2RjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfZGMpOworICAgIGRodF9zaXplICs9IGpwZWdfY3JlYXRlX2h1ZmZtYW5fdGFibGUoJnBiYywgMCwgMSwgYXZwcml2X21qcGVnX2JpdHNfZGNfY2hyb21pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2RjKTsKKyAgICBkaHRfc2l6ZSArPSBqcGVnX2NyZWF0ZV9odWZmbWFuX3RhYmxlKCZwYmMsIDEsIDAsIGF2cHJpdl9tanBlZ19iaXRzX2FjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfYWNfbHVtaW5hbmNlKTsKKyAgICBkaHRfc2l6ZSArPSBqcGVnX2NyZWF0ZV9odWZmbWFuX3RhYmxlKCZwYmMsIDEsIDEsIGF2cHJpdl9tanBlZ19iaXRzX2FjX2Nocm9taW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9hY19jaHJvbWluYW5jZSk7CisgICAgQVZfV0IxNihkaHRfc2l6ZV9wdHIsIGRodF9zaXplKTsKKworICAgIC8qIFNPRjAgKi8KKyAgICBqcGVnX3B1dF9tYXJrZXIoJnBiYywgU09GMCk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMTYoJnBiYywgMTcpOyAvKiBzaXplICovCisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiYywgOCk7IC8qIGJpdHMgcGVyIGNvbXBvbmVudCAqLworICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2KCZwYmMsIGgpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2KCZwYmMsIHcpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDMpOyAvKiBudW1iZXIgb2YgY29tcG9uZW50cyAqLworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDEpOyAvKiBjb21wb25lbnQgbnVtYmVyICovCisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiYywgKDIgPDwgNCkgfCAodHlwZSA/IDIgOiAxKSk7IC8qIGhzYW1wbGUvdnNhbXBsZSAqLworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDApOyAvKiBtYXRyaXggbnVtYmVyICovCisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiYywgMik7IC8qIGNvbXBvbmVudCBudW1iZXIgKi8KKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGJjLCAxIDw8IDQgfCAxKTsgLyogaHNhbXBsZS92c2FtcGxlICovCisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiYywgbmJfcXRhYmxlID09IDIgPyAxIDogMCk7IC8qIG1hdHJpeCBudW1iZXIgKi8KKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGJjLCAzKTsgLyogY29tcG9uZW50IG51bWJlciAqLworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDEgPDwgNCB8IDEpOyAvKiBoc2FtcGxlL3ZzYW1wbGUgKi8KKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGJjLCBuYl9xdGFibGUgPT0gMiA/IDEgOiAwKTsgLyogbWF0cml4IG51bWJlciAqLworCisgICAgLyogU09TICovCisgICAganBlZ19wdXRfbWFya2VyKCZwYmMsIFNPUyk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMTYoJnBiYywgMTIpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDMpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDEpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDApOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDIpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDE3KTsKKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGJjLCAzKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGJjLCAxNyk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiYywgMCk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiYywgNjMpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYmMsIDApOworCisgICAgLyogUmV0dXJuIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIEpQRUcgaGVhZGVyLiAqLworICAgIHJldHVybiBieXRlc3RyZWFtMl90ZWxsX3AoJnBiYyk7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9kZWZhdWx0X3F0YWJsZXModWludDhfdCAqcXRhYmxlcywgdWludDhfdCBxKQoreworICAgIGludCBmYWN0b3IgPSBxOworICAgIGludCBpOworCisgICAgZmFjdG9yID0gYXZfY2xpcChxLCAxLCA5OSk7CisKKyAgICBpZiAocSA8IDUwKQorICAgICAgICBxID0gNTAwMCAvIGZhY3RvcjsKKyAgICBlbHNlCisgICAgICAgIHEgPSAyMDAgLSBmYWN0b3IgKiAyOworCisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgIGludCB2YWwgPSAoZGVmYXVsdF9xdWFudGl6ZXJzW2ldICogcSArIDUwKSAvIDEwMDsKKworICAgICAgICAvKiBMaW1pdCB0aGUgcXVhbnRpemVycyB0byAxIDw9IHEgPD0gMjU1LiAqLworICAgICAgICB2YWwgPSBhdl9jbGlwKHZhbCwgMSwgMjU1KTsKKyAgICAgICAgcXRhYmxlc1tpXSA9IHZhbDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQganBlZ19wYXJzZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIFBheWxvYWRDb250ZXh0ICpqcGVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QsIHVpbnQzMl90ICp0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgdWludDE2X3Qgc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgdWludDhfdCB0eXBlLCBxLCB3aWR0aCwgaGVpZ2h0OworICAgIGNvbnN0IHVpbnQ4X3QgKnF0YWJsZXMgPSBOVUxMOworICAgIHVpbnQxNl90IHF0YWJsZV9sZW47CisgICAgdWludDMyX3Qgb2ZmOworICAgIGludCByZXQsIGRyaSA9IDA7CisKKyAgICBpZiAobGVuIDwgOCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb28gc2hvcnQgUlRQL0pQRUcgcGFja2V0LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIFBhcnNlIHRoZSBtYWluIEpQRUcgaGVhZGVyLiAqLworICAgIG9mZiAgICA9IEFWX1JCMjQoYnVmICsgMSk7ICAvKiBmcmFnbWVudCBieXRlIG9mZnNldCAqLworICAgIHR5cGUgICA9IEFWX1JCOChidWYgKyA0KTsgICAvKiBpZCBvZiBqcGVnIGRlY29kZXIgcGFyYW1zICovCisgICAgcSAgICAgID0gQVZfUkI4KGJ1ZiArIDUpOyAgIC8qIHF1YW50aXphdGlvbiBmYWN0b3IgKG9yIHRhYmxlIGlkKSAqLworICAgIHdpZHRoICA9IEFWX1JCOChidWYgKyA2KTsgICAvKiBmcmFtZSB3aWR0aCBpbiA4IHBpeGVsIGJsb2NrcyAqLworICAgIGhlaWdodCA9IEFWX1JCOChidWYgKyA3KTsgICAvKiBmcmFtZSBoZWlnaHQgaW4gOCBwaXhlbCBibG9ja3MgKi8KKyAgICBidWYgKz0gODsKKyAgICBsZW4gLT0gODsKKworICAgIGlmICh0eXBlICYgMHg0MCkgeworICAgICAgICBpZiAobGVuIDwgNCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IFJUUC9KUEVHIHBhY2tldC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgZHJpID0gQVZfUkIxNihidWYpOworICAgICAgICBidWYgKz0gNDsKKyAgICAgICAgbGVuIC09IDQ7CisgICAgICAgIHR5cGUgJj0gfjB4NDA7CisgICAgfQorICAgIC8qIFBhcnNlIHRoZSByZXN0YXJ0IG1hcmtlciBoZWFkZXIuICovCisgICAgaWYgKHR5cGUgPiA2MykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5pbXBsZW1lbnRlZCBSVFAvSlBFRyByZXN0YXJ0IG1hcmtlciBoZWFkZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAodHlwZSA+IDEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5pbXBsZW1lbnRlZCBSVFAvSlBFRyB0eXBlICVkXG4iLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIC8qIFBhcnNlIHRoZSBxdWFudGl6YXRpb24gdGFibGUgaGVhZGVyLiAqLworICAgIGlmIChvZmYgPT0gMCkgeworICAgICAgICAvKiBTdGFydCBvZiBKUEVHIGRhdGEgcGFja2V0LiAqLworICAgICAgICB1aW50OF90IG5ld19xdGFibGVzWzEyOF07CisgICAgICAgIHVpbnQ4X3QgaGRyWzEwMjRdOworCisgICAgICAgIGlmIChxID4gMTI3KSB7CisgICAgICAgICAgICB1aW50OF90IHByZWNpc2lvbjsKKyAgICAgICAgICAgIGlmIChsZW4gPCA0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IFJUUC9KUEVHIHBhY2tldC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBUaGUgZmlyc3QgYnl0ZSBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KKyAgICAgICAgICAgIHByZWNpc2lvbiAgPSBBVl9SQjgoYnVmICsgMSk7ICAgIC8qIHNpemUgb2YgY29lZmZpY2llbnRzICovCisgICAgICAgICAgICBxdGFibGVfbGVuID0gQVZfUkIxNihidWYgKyAyKTsgICAvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKyAgICAgICAgICAgIGJ1ZiArPSA0OworICAgICAgICAgICAgbGVuIC09IDQ7CisKKyAgICAgICAgICAgIGlmIChwcmVjaXNpb24pCisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJPbmx5IDgtYml0IHByZWNpc2lvbiBpcyBzdXBwb3J0ZWQuXG4iKTsKKworICAgICAgICAgICAgaWYgKHF0YWJsZV9sZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IHF0YWJsZV9sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IFJUUC9KUEVHIHBhY2tldC5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcXRhYmxlcyA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBidWYgKz0gcXRhYmxlX2xlbjsKKyAgICAgICAgICAgICAgICBsZW4gLT0gcXRhYmxlX2xlbjsKKyAgICAgICAgICAgICAgICBpZiAocSA8IDI1NSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoanBlZy0+cXRhYmxlc19sZW5bcSAtIDEyOF0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChqcGVnLT5xdGFibGVzX2xlbltxIC0gMTI4XSAhPSBxdGFibGVfbGVuIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY21wKHF0YWJsZXMsICZqcGVnLT5xdGFibGVzW3EgLSAxMjhdWzBdLCBxdGFibGVfbGVuKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdWFudGl6YXRpb24gdGFibGVzIGZvciBxPSVkIGNoYW5nZWRcbiIsIHEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFqcGVnLT5xdGFibGVzX2xlbltxIC0gMTI4XSAmJiBxdGFibGVfbGVuIDw9IDEyOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZqcGVnLT5xdGFibGVzW3EgLSAxMjhdWzBdLCBxdGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0YWJsZV9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAganBlZy0+cXRhYmxlc19sZW5bcSAtIDEyOF0gPSBxdGFibGVfbGVuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocSA9PSAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUlRQL0pQRUcgcGFja2V0LiBRdWFudGl6YXRpb24gdGFibGVzIG5vdCBmb3VuZC5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFqcGVnLT5xdGFibGVzX2xlbltxIC0gMTI4XSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gcXVhbnRpemF0aW9uIHRhYmxlcyBrbm93biBmb3IgcT0lZCB5ZXQuXG4iLCBxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHF0YWJsZXMgICAgPSAmanBlZy0+cXRhYmxlc1txIC0gMTI4XVswXTsKKyAgICAgICAgICAgICAgICBxdGFibGVfbGVuID0gIGpwZWctPnF0YWJsZXNfbGVuW3EgLSAxMjhdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvKiBxIDw9IDEyNyAqLworICAgICAgICAgICAgaWYgKHEgPT0gMCB8fCBxID4gOTkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJSZXNlcnZlZCBxIHZhbHVlICVkXG4iLCBxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNyZWF0ZV9kZWZhdWx0X3F0YWJsZXMobmV3X3F0YWJsZXMsIHEpOworICAgICAgICAgICAgcXRhYmxlcyAgICA9IG5ld19xdGFibGVzOworICAgICAgICAgICAgcXRhYmxlX2xlbiA9IHNpemVvZihuZXdfcXRhYmxlcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTa2lwIHRoZSBjdXJyZW50IGZyYW1lIGluIGNhc2Ugb2YgdGhlIGVuZCBwYWNrZXQKKyAgICAgICAgICogaGFzIGJlZW4gbG9zdCBzb21ld2hlcmUuICovCisgICAgICAgIGZyZWVfZnJhbWVfaWZfbmVlZGVkKGpwZWcpOworCisgICAgICAgIGlmICgocmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJmpwZWctPmZyYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAganBlZy0+dGltZXN0YW1wID0gKnRpbWVzdGFtcDsKKworICAgICAgICAvKiBHZW5lcmF0ZSBhIGZyYW1lIGFuZCBzY2FuIGhlYWRlcnMgdGhhdCBjYW4gYmUgcHJlcGVuZGVkIHRvIHRoZQorICAgICAgICAgKiBSVFAvSlBFRyBkYXRhIHBheWxvYWQgdG8gcHJvZHVjZSBhIEpQRUcgY29tcHJlc3NlZCBpbWFnZSBpbgorICAgICAgICAgKiBpbnRlcmNoYW5nZSBmb3JtYXQuICovCisgICAgICAgIGpwZWctPmhkcl9zaXplID0ganBlZ19jcmVhdGVfaGVhZGVyKGhkciwgc2l6ZW9mKGhkciksIHR5cGUsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHF0YWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0YWJsZV9sZW4gLyA2NCwgZHJpKTsKKworICAgICAgICAvKiBDb3B5IEpQRUcgaGVhZGVyIHRvIGZyYW1lIGJ1ZmZlci4gKi8KKyAgICAgICAgYXZpb193cml0ZShqcGVnLT5mcmFtZSwgaGRyLCBqcGVnLT5oZHJfc2l6ZSk7CisgICAgfQorCisgICAgaWYgKCFqcGVnLT5mcmFtZSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiUmVjZWl2ZWQgcGFja2V0IHdpdGhvdXQgYSBzdGFydCBjaHVuazsgZHJvcHBpbmcgZnJhbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKKyAgICBpZiAoanBlZy0+dGltZXN0YW1wICE9ICp0aW1lc3RhbXApIHsKKyAgICAgICAgLyogU2tpcCB0aGUgY3VycmVudCBmcmFtZSBpZiB0aW1lc3RhbXAgaXMgaW5jb3JyZWN0LgorICAgICAgICAgKiBBIHN0YXJ0IHBhY2tldCBoYXMgYmVlbiBsb3N0IHNvbWV3aGVyZS4gKi8KKyAgICAgICAgZnJlZV9mcmFtZV9pZl9uZWVkZWQoanBlZyk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlJUUCB0aW1lc3RhbXBzIGRvbid0IG1hdGNoLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChvZmYgIT0gYXZpb190ZWxsKGpwZWctPmZyYW1lKSAtIGpwZWctPmhkcl9zaXplKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJNaXNzaW5nIHBhY2tldHM7IGRyb3BwaW5nIGZyYW1lLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgfQorCisgICAgLyogQ29weSBkYXRhIHRvIGZyYW1lIGJ1ZmZlci4gKi8KKyAgICBhdmlvX3dyaXRlKGpwZWctPmZyYW1lLCBidWYsIGxlbik7CisKKyAgICBpZiAoZmxhZ3MgJiBSVFBfRkxBR19NQVJLRVIpIHsKKyAgICAgICAgLyogRW5kIG9mIEpQRUcgZGF0YSBwYWNrZXQuICovCisgICAgICAgIHVpbnQ4X3QgYnVmWzJdID0geyAweGZmLCBFT0kgfTsKKworICAgICAgICAvKiBQdXQgRU9JIG1hcmtlci4gKi8KKyAgICAgICAgYXZpb193cml0ZShqcGVnLT5mcmFtZSwgYnVmLCBzaXplb2YoYnVmKSk7CisKKyAgICAgICAgLyogUHJlcGFyZSB0aGUgSlBFRyBwYWNrZXQuICovCisgICAgICAgIGlmICgocmV0ID0gZmZfcnRwX2ZpbmFsaXplX3BhY2tldChwa3QsICZqcGVnLT5mcmFtZSwgc3QtPmluZGV4KSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkVycm9yIG9jY3VycmVkIHdoZW4gZ2V0dGluZyBmcmFtZSBidWZmZXIuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworfQorCitSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2pwZWdfZHluYW1pY19oYW5kbGVyID0geworICAgIC5lbmNfbmFtZSAgICAgICAgICA9ICJKUEVHIiwKKyAgICAuY29kZWNfdHlwZSAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmNvZGVjX2lkICAgICAgICAgID0gQVZfQ09ERUNfSURfTUpQRUcsCisgICAgLmFsbG9jICAgICAgICAgICAgID0ganBlZ19uZXdfY29udGV4dCwKKyAgICAuZnJlZSAgICAgICAgICAgICAgPSBqcGVnX2ZyZWVfY29udGV4dCwKKyAgICAucGFyc2VfcGFja2V0ICAgICAgPSBqcGVnX3BhcnNlX3BhY2tldCwKKyAgICAuc3RhdGljX3BheWxvYWRfaWQgPSAyNiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2xhdG0uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfbGF0bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OTY0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX2xhdG0uYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIFJUUCBEZXBhY2tldGl6YXRpb24gb2YgTVA0QS1MQVRNLCBSRkMgMzAxNgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJydHBkZWNfZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorCitzdHJ1Y3QgUGF5bG9hZENvbnRleHQgeworICAgIEFWSU9Db250ZXh0ICpkeW5fYnVmOworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICBpbnQgcG9zLCBsZW47CisgICAgdWludDMyX3QgdGltZXN0YW1wOworfTsKKworc3RhdGljIFBheWxvYWRDb250ZXh0ICpsYXRtX25ld19jb250ZXh0KHZvaWQpCit7CisgICAgcmV0dXJuIGF2X21hbGxvY3ooc2l6ZW9mKFBheWxvYWRDb250ZXh0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGxhdG1fZnJlZV9jb250ZXh0KFBheWxvYWRDb250ZXh0ICpkYXRhKQoreworICAgIGlmICghZGF0YSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChkYXRhLT5keW5fYnVmKSB7CisgICAgICAgIHVpbnQ4X3QgKnA7CisgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1ZihkYXRhLT5keW5fYnVmLCAmcCk7CisgICAgICAgIGF2X2ZyZWUocCk7CisgICAgfQorICAgIGF2X2ZyZWUoZGF0YS0+YnVmKTsKKyAgICBhdl9mcmVlKGRhdGEpOworfQorCitzdGF0aWMgaW50IGxhdG1fcGFyc2VfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBQYXlsb2FkQ29udGV4dCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0LCB1aW50MzJfdCAqdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4sIHVpbnQxNl90IHNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIGludCByZXQsIGN1cl9sZW47CisKKyAgICBpZiAoYnVmKSB7CisgICAgICAgIGlmICghZGF0YS0+ZHluX2J1ZiB8fCBkYXRhLT50aW1lc3RhbXAgIT0gKnRpbWVzdGFtcCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJmRhdGEtPmJ1Zik7CisgICAgICAgICAgICBpZiAoZGF0YS0+ZHluX2J1ZikKKyAgICAgICAgICAgICAgICBhdmlvX2Nsb3NlX2R5bl9idWYoZGF0YS0+ZHluX2J1ZiwgJmRhdGEtPmJ1Zik7CisgICAgICAgICAgICBkYXRhLT5keW5fYnVmID0gTlVMTDsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZkYXRhLT5idWYpOworCisgICAgICAgICAgICBkYXRhLT50aW1lc3RhbXAgPSAqdGltZXN0YW1wOworICAgICAgICAgICAgaWYgKChyZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmZGF0YS0+ZHluX2J1ZikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGF2aW9fd3JpdGUoZGF0YS0+ZHluX2J1ZiwgYnVmLCBsZW4pOworCisgICAgICAgIGlmICghKGZsYWdzICYgUlRQX0ZMQUdfTUFSS0VSKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIGF2X2ZyZWUoZGF0YS0+YnVmKTsKKyAgICAgICAgZGF0YS0+bGVuID0gYXZpb19jbG9zZV9keW5fYnVmKGRhdGEtPmR5bl9idWYsICZkYXRhLT5idWYpOworICAgICAgICBkYXRhLT5keW5fYnVmID0gTlVMTDsKKyAgICAgICAgZGF0YS0+cG9zID0gMDsKKyAgICB9CisKKyAgICBpZiAoIWRhdGEtPmJ1ZikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJObyBkYXRhIGF2YWlsYWJsZSB5ZXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGN1cl9sZW4gPSAwOworICAgIHdoaWxlIChkYXRhLT5wb3MgPCBkYXRhLT5sZW4pIHsKKyAgICAgICAgdWludDhfdCB2YWwgPSBkYXRhLT5idWZbZGF0YS0+cG9zKytdOworICAgICAgICBjdXJfbGVuICs9IHZhbDsKKyAgICAgICAgaWYgKHZhbCAhPSAweGZmKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChkYXRhLT5wb3MgKyBjdXJfbGVuID4gZGF0YS0+bGVuKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk1hbGZvcm1lZCBMQVRNIHBhY2tldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgY3VyX2xlbikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBtZW1jcHkocGt0LT5kYXRhLCBkYXRhLT5idWYgKyBkYXRhLT5wb3MsIGN1cl9sZW4pOworICAgIGRhdGEtPnBvcyArPSBjdXJfbGVuOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIHJldHVybiBkYXRhLT5wb3MgPCBkYXRhLT5sZW47Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZm10cF9jb25maWcoQVZTdHJlYW0gKnN0LCBjaGFyICp2YWx1ZSkKK3sKKyAgICBpbnQgbGVuID0gZmZfaGV4X3RvX2RhdGEoTlVMTCwgdmFsdWUpLCBpLCByZXQgPSAwOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgdWludDhfdCAqY29uZmlnOworICAgIGludCBhdWRpb19tdXhfdmVyc2lvbiwgc2FtZV90aW1lX2ZyYW1pbmcsIG51bV9wcm9ncmFtcywgbnVtX2xheWVyczsKKworICAgIC8qIFBhZCB0aGlzIGJ1ZmZlciwgdG9vLCB0byBhdm9pZCBvdXQgb2YgYm91bmRzIHJlYWRzIHdpdGggZ2V0X2JpdHMgYmVsb3cgKi8KKyAgICBjb25maWcgPSBhdl9tYWxsb2N6KGxlbiArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghY29uZmlnKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZmX2hleF90b19kYXRhKGNvbmZpZywgdmFsdWUpOworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBjb25maWcsIGxlbio4KTsKKyAgICBhdWRpb19tdXhfdmVyc2lvbiA9IGdldF9iaXRzKCZnYiwgMSk7CisgICAgc2FtZV90aW1lX2ZyYW1pbmcgPSBnZXRfYml0cygmZ2IsIDEpOworICAgIHNraXBfYml0cygmZ2IsIDYpOyAvKiBudW1fc3ViX2ZyYW1lcyAqLworICAgIG51bV9wcm9ncmFtcyAgICAgID0gZ2V0X2JpdHMoJmdiLCA0KTsKKyAgICBudW1fbGF5ZXJzICAgICAgICA9IGdldF9iaXRzKCZnYiwgMyk7CisgICAgaWYgKGF1ZGlvX211eF92ZXJzaW9uICE9IDAgfHwgc2FtZV90aW1lX2ZyYW1pbmcgIT0gMSB8fCBudW1fcHJvZ3JhbXMgIT0gMCB8fAorICAgICAgICBudW1fbGF5ZXJzICE9IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgTEFUTSBjb25maWcgKCVkLCVkLCVkLCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tdXhfdmVyc2lvbiwgc2FtZV90aW1lX2ZyYW1pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Byb2dyYW1zLCBudW1fbGF5ZXJzKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCAoZ2V0X2JpdHNfbGVmdCgmZ2IpICsgNykvOCkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemU7IGkrKykKKyAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbaV0gPSBnZXRfYml0cygmZ2IsIDgpOworCitlbmQ6CisgICAgYXZfZnJlZShjb25maWcpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZm10cChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0cmVhbSwgUGF5bG9hZENvbnRleHQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYXR0ciwgY2hhciAqdmFsdWUpCit7CisgICAgaW50IHJlczsKKworICAgIGlmICghc3RyY21wKGF0dHIsICJjb25maWciKSkgeworICAgICAgICByZXMgPSBwYXJzZV9mbXRwX2NvbmZpZyhzdHJlYW0sIHZhbHVlKTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLCAiY3ByZXNlbnQiKSkgeworICAgICAgICBpbnQgY3ByZXNlbnQgPSBhdG9pKHZhbHVlKTsKKyAgICAgICAgaWYgKGNwcmVzZW50ICE9IDApCisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUlRQIE1QNEEtTEFUTSB3aXRoIGluLWJhbmQgY29uZmlndXJhdGlvbiIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhdG1fcGFyc2Vfc2RwX2xpbmUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZENvbnRleHQgKmRhdGEsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisgICAgY29uc3QgY2hhciAqcDsKKworICAgIGlmIChzdF9pbmRleCA8IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGF2X3N0cnN0YXJ0KGxpbmUsICJmbXRwOiIsICZwKSkKKyAgICAgICAgcmV0dXJuIGZmX3BhcnNlX2ZtdHAocywgcy0+c3RyZWFtc1tzdF9pbmRleF0sIGRhdGEsIHAsIHBhcnNlX2ZtdHApOworCisgICAgcmV0dXJuIDA7Cit9CisKK1JUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXA0YV9sYXRtX2R5bmFtaWNfaGFuZGxlciA9IHsKKyAgICAuZW5jX25hbWUgICAgICAgICAgID0gIk1QNEEtTEFUTSIsCisgICAgLmNvZGVjX3R5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuY29kZWNfaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAorICAgIC5wYXJzZV9zZHBfYV9saW5lICAgPSBsYXRtX3BhcnNlX3NkcF9saW5lLAorICAgIC5hbGxvYyAgICAgICAgICAgICAgPSBsYXRtX25ld19jb250ZXh0LAorICAgIC5mcmVlICAgICAgICAgICAgICAgPSBsYXRtX2ZyZWVfY29udGV4dCwKKyAgICAucGFyc2VfcGFja2V0ICAgICAgID0gbGF0bV9wYXJzZV9wYWNrZXQKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX21wZWcxMi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19tcGVnMTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzNmZjFlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19tcGVnMTIuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29tbW9uIGNvZGUgZm9yIHRoZSBSVFAgZGVwYWNrZXRpemF0aW9uIG9mIE1QRUctMS8yIGZvcm1hdHMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJydHBkZWNfZm9ybWF0cy5oIgorCitzdGF0aWMgYXZfY29sZCBpbnQgbXBlZ19pbml0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBpbnQgc3RfaW5kZXgsIFBheWxvYWRDb250ZXh0ICpkYXRhKQoreworICAgIGlmIChzdF9pbmRleCA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIGN0eC0+c3RyZWFtc1tzdF9pbmRleF0tPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBlZ19wYXJzZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIFBheWxvYWRDb250ZXh0ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QsIHVpbnQzMl90ICp0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgdWludDE2X3Qgc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgdW5zaWduZWQgaW50IGg7CisgICAgaWYgKGxlbiA8PSA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBoICAgID0gQVZfUkIzMihidWYpOworICAgIGJ1ZiArPSA0OworICAgIGxlbiAtPSA0OworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIGggJiAoMSA8PCAyNikpIHsKKyAgICAgICAgLyogTVBFRy0yICovCisgICAgICAgIGlmIChsZW4gPD0gNCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBidWYgKz0gNDsKKyAgICAgICAgbGVuIC09IDQ7CisgICAgfQorICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgbGVuKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWVtY3B5KHBrdC0+ZGF0YSwgYnVmLCBsZW4pOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIHJldHVybiAwOworfQorCitSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21wZWdfYXVkaW9fZHluYW1pY19oYW5kbGVyID0geworICAgIC5jb2RlY190eXBlICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuY29kZWNfaWQgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDMsCisgICAgLmluaXQgICAgICAgICAgICAgID0gbXBlZ19pbml0LAorICAgIC5wYXJzZV9wYWNrZXQgICAgICA9IG1wZWdfcGFyc2VfcGFja2V0LAorICAgIC5zdGF0aWNfcGF5bG9hZF9pZCA9IDE0LAorfTsKKworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcGVnX3ZpZGVvX2R5bmFtaWNfaGFuZGxlciA9IHsKKyAgICAuY29kZWNfdHlwZSAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmNvZGVjX2lkICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFTywKKyAgICAuaW5pdCAgICAgICAgICAgICAgPSBtcGVnX2luaXQsCisgICAgLnBhcnNlX3BhY2tldCAgICAgID0gbXBlZ19wYXJzZV9wYWNrZXQsCisgICAgLnN0YXRpY19wYXlsb2FkX2lkID0gMzIsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19tcGVnNC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19tcGVnNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTIxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX21wZWc0LmMKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBDb21tb24gY29kZSBmb3IgdGhlIFJUUCBkZXBhY2tldGl6YXRpb24gb2YgTVBFRy00IGZvcm1hdHMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgRmFicmljZSBCZWxsYXJkCisgKiAgICAgICAgICAgICAgICAgICAgUm9tYWluIERlZ2V6CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEBicmllZiBNUEVHNCAvIFJUUCBDb2RlCisgKiBAYXV0aG9yIEZhYnJpY2UgQmVsbGFyZAorICogQGF1dGhvciBSb21haW4gRGVnZXoKKyAqLworCisjaW5jbHVkZSAicnRwZGVjX2Zvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorCisvKiogU3RydWN0dXJlIGxpc3RpbmcgdXNlZnVsIHZhcnMgdG8gcGFyc2UgUlRQIHBhY2tldCBwYXlsb2FkICovCitzdHJ1Y3QgUGF5bG9hZENvbnRleHQgeworICAgIGludCBzaXplbGVuZ3RoOworICAgIGludCBpbmRleGxlbmd0aDsKKyAgICBpbnQgaW5kZXhkZWx0YWxlbmd0aDsKKyAgICBpbnQgcHJvZmlsZV9sZXZlbF9pZDsKKyAgICBpbnQgc3RyZWFtdHlwZTsKKyAgICBpbnQgb2JqZWN0dHlwZTsKKyAgICBjaGFyICptb2RlOworCisgICAgLyoqIG1wZWcgNCBBVSBoZWFkZXJzICovCisgICAgc3RydWN0IEFVSGVhZGVycyB7CisgICAgICAgIGludCBzaXplOworICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIGludCBjdHNfZmxhZzsKKyAgICAgICAgaW50IGN0czsKKyAgICAgICAgaW50IGR0c19mbGFnOworICAgICAgICBpbnQgZHRzOworICAgICAgICBpbnQgcmFwX2ZsYWc7CisgICAgICAgIGludCBzdHJlYW1zdGF0ZTsKKyAgICB9ICphdV9oZWFkZXJzOworICAgIGludCBhdV9oZWFkZXJzX2FsbG9jYXRlZDsKKyAgICBpbnQgbmJfYXVfaGVhZGVyczsKKyAgICBpbnQgYXVfaGVhZGVyc19sZW5ndGhfYnl0ZXM7CisgICAgaW50IGN1cl9hdV9pbmRleDsKKworICAgIHVpbnQ4X3QgYnVmW1JUUF9NQVhfUEFDS0VUX0xFTkdUSF07CisgICAgaW50IGJ1Zl9wb3MsIGJ1Zl9zaXplOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKnN0cjsKKyAgICB1aW50MTZfdCAgICB0eXBlOworICAgIHVpbnQzMl90ICAgIG9mZnNldDsKK30gQXR0ck5hbWVNYXA7CisKKy8qIEFsbCBrbm93biBmbXRwIHBhcmFtZXRlcnMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIFJUUEF0dHJUeXBlRW51bSAqLworI2RlZmluZSBBVFRSX05BTUVfVFlQRV9JTlQgMAorI2RlZmluZSBBVFRSX05BTUVfVFlQRV9TVFIgMQorc3RhdGljIGNvbnN0IEF0dHJOYW1lTWFwIGF0dHJfbmFtZXNbXSA9IHsKKyAgICB7ICJTaXplTGVuZ3RoIiwgICAgICAgQVRUUl9OQU1FX1RZUEVfSU5ULAorICAgICAgb2Zmc2V0b2YoUGF5bG9hZENvbnRleHQsIHNpemVsZW5ndGgpIH0sCisgICAgeyAiSW5kZXhMZW5ndGgiLCAgICAgIEFUVFJfTkFNRV9UWVBFX0lOVCwKKyAgICAgIG9mZnNldG9mKFBheWxvYWRDb250ZXh0LCBpbmRleGxlbmd0aCkgfSwKKyAgICB7ICJJbmRleERlbHRhTGVuZ3RoIiwgQVRUUl9OQU1FX1RZUEVfSU5ULAorICAgICAgb2Zmc2V0b2YoUGF5bG9hZENvbnRleHQsIGluZGV4ZGVsdGFsZW5ndGgpIH0sCisgICAgeyAicHJvZmlsZS1sZXZlbC1pZCIsIEFUVFJfTkFNRV9UWVBFX0lOVCwKKyAgICAgIG9mZnNldG9mKFBheWxvYWRDb250ZXh0LCBwcm9maWxlX2xldmVsX2lkKSB9LAorICAgIHsgIlN0cmVhbVR5cGUiLCAgICAgICBBVFRSX05BTUVfVFlQRV9JTlQsCisgICAgICBvZmZzZXRvZihQYXlsb2FkQ29udGV4dCwgc3RyZWFtdHlwZSkgfSwKKyAgICB7ICJtb2RlIiwgICAgICAgICAgICAgQVRUUl9OQU1FX1RZUEVfU1RSLAorICAgICAgb2Zmc2V0b2YoUGF5bG9hZENvbnRleHQsIG1vZGUpIH0sCisgICAgeyBOVUxMLCAtMSwgLTEgfSwKK307CisKK3N0YXRpYyBQYXlsb2FkQ29udGV4dCAqbmV3X2NvbnRleHQodm9pZCkKK3sKKyAgICByZXR1cm4gYXZfbWFsbG9jeihzaXplb2YoUGF5bG9hZENvbnRleHQpKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9jb250ZXh0KFBheWxvYWRDb250ZXh0ICpkYXRhKQoreworICAgIGF2X2ZyZWUoZGF0YS0+YXVfaGVhZGVycyk7CisgICAgYXZfZnJlZShkYXRhLT5tb2RlKTsKKyAgICBhdl9mcmVlKGRhdGEpOworfQorCitzdGF0aWMgaW50IHBhcnNlX2ZtdHBfY29uZmlnKEFWQ29kZWNDb250ZXh0ICpjb2RlYywgY2hhciAqdmFsdWUpCit7CisgICAgLyogZGVjb2RlIHRoZSBoZXhhIGVuY29kZWQgcGFyYW1ldGVyICovCisgICAgaW50IGxlbiA9IGZmX2hleF90b19kYXRhKE5VTEwsIHZhbHVlKTsKKyAgICBhdl9mcmVlKGNvZGVjLT5leHRyYWRhdGEpOworICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoY29kZWMsIGxlbikpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfaGV4X3RvX2RhdGEoY29kZWMtPmV4dHJhZGF0YSwgdmFsdWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0cF9wYXJzZV9tcDRfYXUoUGF5bG9hZENvbnRleHQgKmRhdGEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICBpbnQgYXVfaGVhZGVyc19sZW5ndGgsIGF1X2hlYWRlcl9zaXplLCBpOworICAgIEdldEJpdENvbnRleHQgZ2V0Yml0Y29udGV4dDsKKworICAgIGlmIChsZW4gPCAyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIGRlY29kZSB0aGUgZmlyc3QgMiBieXRlcyB3aGVyZSB0aGUgQVVIZWFkZXIgc2VjdGlvbnMgYXJlIHN0b3JlZAorICAgICAgIGxlbmd0aCBpbiBiaXRzICovCisgICAgYXVfaGVhZGVyc19sZW5ndGggPSBBVl9SQjE2KGJ1Zik7CisKKyAgICBpZiAoYXVfaGVhZGVyc19sZW5ndGggPiBSVFBfTUFYX1BBQ0tFVF9MRU5HVEgpCisgICAgICByZXR1cm4gLTE7CisKKyAgICBkYXRhLT5hdV9oZWFkZXJzX2xlbmd0aF9ieXRlcyA9IChhdV9oZWFkZXJzX2xlbmd0aCArIDcpIC8gODsKKworICAgIC8qIHNraXAgQVUgaGVhZGVycyBsZW5ndGggc2VjdGlvbiAoMiBieXRlcykgKi8KKyAgICBidWYgKz0gMjsKKyAgICBsZW4gLT0gMjsKKworICAgIGlmIChsZW4gPCBkYXRhLT5hdV9oZWFkZXJzX2xlbmd0aF9ieXRlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpbml0X2dldF9iaXRzKCZnZXRiaXRjb250ZXh0LCBidWYsIGRhdGEtPmF1X2hlYWRlcnNfbGVuZ3RoX2J5dGVzICogOCk7CisKKyAgICAvKiBYWFg6IFdyb25nIGlmIG9wdGlvbmFsIGFkZGl0aW9uYWwgc2VjdGlvbnMgYXJlIHByZXNlbnQgKGN0cywgZHRzIGV0Yy4uLikgKi8KKyAgICBhdV9oZWFkZXJfc2l6ZSA9IGRhdGEtPnNpemVsZW5ndGggKyBkYXRhLT5pbmRleGxlbmd0aDsKKyAgICBpZiAoYXVfaGVhZGVyX3NpemUgPD0gMCB8fCAoYXVfaGVhZGVyc19sZW5ndGggJSBhdV9oZWFkZXJfc2l6ZSAhPSAwKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZGF0YS0+bmJfYXVfaGVhZGVycyA9IGF1X2hlYWRlcnNfbGVuZ3RoIC8gYXVfaGVhZGVyX3NpemU7CisgICAgaWYgKCFkYXRhLT5hdV9oZWFkZXJzIHx8IGRhdGEtPmF1X2hlYWRlcnNfYWxsb2NhdGVkIDwgZGF0YS0+bmJfYXVfaGVhZGVycykgeworICAgICAgICBhdl9mcmVlKGRhdGEtPmF1X2hlYWRlcnMpOworICAgICAgICBkYXRhLT5hdV9oZWFkZXJzID0gYXZfbWFsbG9jKHNpemVvZihzdHJ1Y3QgQVVIZWFkZXJzKSAqIGRhdGEtPm5iX2F1X2hlYWRlcnMpOworICAgICAgICBpZiAoIWRhdGEtPmF1X2hlYWRlcnMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBkYXRhLT5hdV9oZWFkZXJzX2FsbG9jYXRlZCA9IGRhdGEtPm5iX2F1X2hlYWRlcnM7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGRhdGEtPm5iX2F1X2hlYWRlcnM7ICsraSkgeworICAgICAgICBkYXRhLT5hdV9oZWFkZXJzW2ldLnNpemUgID0gZ2V0X2JpdHNfbG9uZygmZ2V0Yml0Y29udGV4dCwgZGF0YS0+c2l6ZWxlbmd0aCk7CisgICAgICAgIGRhdGEtPmF1X2hlYWRlcnNbaV0uaW5kZXggPSBnZXRfYml0c19sb25nKCZnZXRiaXRjb250ZXh0LCBkYXRhLT5pbmRleGxlbmd0aCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogRm9sbG93cyBSRkMgMzY0MCAqLworc3RhdGljIGludCBhYWNfcGFyc2VfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBQYXlsb2FkQ29udGV4dCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QsIHVpbnQzMl90ICp0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuLCB1aW50MTZfdCBzZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoIWJ1ZikgeworICAgICAgICBpZiAoZGF0YS0+Y3VyX2F1X2luZGV4ID4gZGF0YS0+bmJfYXVfaGVhZGVycykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAoZGF0YS0+YnVmX3NpemUgLSBkYXRhLT5idWZfcG9zIDwgZGF0YS0+YXVfaGVhZGVyc1tkYXRhLT5jdXJfYXVfaW5kZXhdLnNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgZGF0YS0+YXVfaGVhZGVyc1tkYXRhLT5jdXJfYXVfaW5kZXhdLnNpemUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCAmZGF0YS0+YnVmW2RhdGEtPmJ1Zl9wb3NdLCBkYXRhLT5hdV9oZWFkZXJzW2RhdGEtPmN1cl9hdV9pbmRleF0uc2l6ZSk7CisgICAgICAgIGRhdGEtPmJ1Zl9wb3MgKz0gZGF0YS0+YXVfaGVhZGVyc1tkYXRhLT5jdXJfYXVfaW5kZXhdLnNpemU7CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgICAgICBkYXRhLT5jdXJfYXVfaW5kZXgrKzsKKyAgICAgICAgcmV0dXJuIGRhdGEtPmN1cl9hdV9pbmRleCA8IGRhdGEtPm5iX2F1X2hlYWRlcnM7CisgICAgfQorCisgICAgaWYgKHJ0cF9wYXJzZV9tcDRfYXUoZGF0YSwgYnVmLCBsZW4pKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBidWYgKz0gZGF0YS0+YXVfaGVhZGVyc19sZW5ndGhfYnl0ZXMgKyAyOworICAgIGxlbiAtPSBkYXRhLT5hdV9oZWFkZXJzX2xlbmd0aF9ieXRlcyArIDI7CisKKyAgICBpZiAobGVuIDwgZGF0YS0+YXVfaGVhZGVyc1swXS5zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoKHJldCA9IGF2X25ld19wYWNrZXQocGt0LCBkYXRhLT5hdV9oZWFkZXJzWzBdLnNpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgbWVtY3B5KHBrdC0+ZGF0YSwgYnVmLCBkYXRhLT5hdV9oZWFkZXJzWzBdLnNpemUpOworICAgIGxlbiAtPSBkYXRhLT5hdV9oZWFkZXJzWzBdLnNpemU7CisgICAgYnVmICs9IGRhdGEtPmF1X2hlYWRlcnNbMF0uc2l6ZTsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKworICAgIGlmIChsZW4gPiAwICYmIGRhdGEtPm5iX2F1X2hlYWRlcnMgPiAxKSB7CisgICAgICAgIGRhdGEtPmJ1Zl9zaXplID0gRkZNSU4obGVuLCBzaXplb2YoZGF0YS0+YnVmKSk7CisgICAgICAgIG1lbWNweShkYXRhLT5idWYsIGJ1ZiwgZGF0YS0+YnVmX3NpemUpOworICAgICAgICBkYXRhLT5jdXJfYXVfaW5kZXggPSAxOworICAgICAgICBkYXRhLT5idWZfcG9zID0gMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZm10cChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0cmVhbSwgUGF5bG9hZENvbnRleHQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYXR0ciwgY2hhciAqdmFsdWUpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gc3RyZWFtLT5jb2RlYzsKKyAgICBpbnQgcmVzLCBpOworCisgICAgaWYgKCFzdHJjbXAoYXR0ciwgImNvbmZpZyIpKSB7CisgICAgICAgIHJlcyA9IHBhcnNlX2ZtdHBfY29uZmlnKGNvZGVjLCB2YWx1ZSk7CisKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgIC8qIExvb2tpbmcgZm9yIGEga25vd24gYXR0cmlidXRlICovCisgICAgICAgIGZvciAoaSA9IDA7IGF0dHJfbmFtZXNbaV0uc3RyOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcChhdHRyLCBhdHRyX25hbWVzW2ldLnN0cikpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cl9uYW1lc1tpXS50eXBlID09IEFUVFJfTkFNRV9UWVBFX0lOVCkgeworICAgICAgICAgICAgICAgICAgICAqKGludCAqKSgoY2hhciAqKWRhdGErCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX25hbWVzW2ldLm9mZnNldCkgPSBhdG9pKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJfbmFtZXNbaV0udHlwZSA9PSBBVFRSX05BTUVfVFlQRV9TVFIpCisgICAgICAgICAgICAgICAgICAgICooY2hhciAqKikoKGNoYXIgKilkYXRhKworICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9uYW1lc1tpXS5vZmZzZXQpID0gYXZfc3RyZHVwKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9zZHBfbGluZShBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZENvbnRleHQgKmRhdGEsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisgICAgY29uc3QgY2hhciAqcDsKKworICAgIGlmIChzdF9pbmRleCA8IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGF2X3N0cnN0YXJ0KGxpbmUsICJmbXRwOiIsICZwKSkKKyAgICAgICAgcmV0dXJuIGZmX3BhcnNlX2ZtdHAocywgcy0+c3RyZWFtc1tzdF9pbmRleF0sIGRhdGEsIHAsIHBhcnNlX2ZtdHApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0X3ZpZGVvKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZENvbnRleHQgKmRhdGEpCit7CisgICAgaWYgKHN0X2luZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcy0+c3RyZWFtc1tzdF9pbmRleF0tPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CisgICAgcmV0dXJuIDA7Cit9CisKK1JUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXA0dl9lc19keW5hbWljX2hhbmRsZXIgPSB7CisgICAgLmVuY19uYW1lICAgICAgICAgICA9ICJNUDRWLUVTIiwKKyAgICAuY29kZWNfdHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5jb2RlY19pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKKyAgICAuaW5pdCAgICAgICAgICAgICAgID0gaW5pdF92aWRlbywKKyAgICAucGFyc2Vfc2RwX2FfbGluZSAgID0gcGFyc2Vfc2RwX2xpbmUsCit9OworCitSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21wZWc0X2dlbmVyaWNfZHluYW1pY19oYW5kbGVyID0geworICAgIC5lbmNfbmFtZSAgICAgICAgICAgPSAibXBlZzQtZ2VuZXJpYyIsCisgICAgLmNvZGVjX3R5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuY29kZWNfaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAorICAgIC5wYXJzZV9zZHBfYV9saW5lICAgPSBwYXJzZV9zZHBfbGluZSwKKyAgICAuYWxsb2MgICAgICAgICAgICAgID0gbmV3X2NvbnRleHQsCisgICAgLmZyZWUgICAgICAgICAgICAgICA9IGZyZWVfY29udGV4dCwKKyAgICAucGFyc2VfcGFja2V0ICAgICAgID0gYWFjX3BhcnNlX3BhY2tldAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfbXBlZ3RzLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX21wZWd0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMmI3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX21wZWd0cy5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogUlRQIE1QRUcyVFMgZGVwYWNrZXRpemVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgIm1wZWd0cy5oIgorI2luY2x1ZGUgInJ0cGRlY19mb3JtYXRzLmgiCisKK3N0cnVjdCBQYXlsb2FkQ29udGV4dCB7CisgICAgc3RydWN0IE1wZWdUU0NvbnRleHQgKnRzOworICAgIGludCByZWFkX2J1Zl9pbmRleDsKKyAgICBpbnQgcmVhZF9idWZfc2l6ZTsKKyAgICB1aW50OF90IGJ1ZltSVFBfTUFYX1BBQ0tFVF9MRU5HVEhdOworfTsKKworc3RhdGljIFBheWxvYWRDb250ZXh0ICptcGVndHNfbmV3X2NvbnRleHQodm9pZCkKK3sKKyAgICByZXR1cm4gYXZfbWFsbG9jeihzaXplb2YoUGF5bG9hZENvbnRleHQpKTsKK30KKworc3RhdGljIHZvaWQgbXBlZ3RzX2ZyZWVfY29udGV4dChQYXlsb2FkQ29udGV4dCAqZGF0YSkKK3sKKyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoZGF0YS0+dHMpCisgICAgICAgIGF2cHJpdl9tcGVndHNfcGFyc2VfY2xvc2UoZGF0YS0+dHMpOworICAgIGF2X2ZyZWUoZGF0YSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtcGVndHNfaW5pdChBVkZvcm1hdENvbnRleHQgKmN0eCwgaW50IHN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpkYXRhKQoreworICAgIGRhdGEtPnRzID0gYXZwcml2X21wZWd0c19wYXJzZV9vcGVuKGN0eCk7CisgICAgaWYgKCFkYXRhLT50cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVndHNfaGFuZGxlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmN0eCwgUGF5bG9hZENvbnRleHQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCwgdWludDMyX3QgKnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuLCB1aW50MTZfdCBzZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBpbnQgcmV0OworCisgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIFJUUCB0aW1lc3RhbXBzIGF0IGFsbC4gSWYgdGhlIG1wZWd0cyBkZW11eGVyCisgICAgLy8gZG9lc24ndCBzZXQgYW55IHB0cy9kdHMsIHRoZSBnZW5lcmljIHJ0cGRlYyBjb2RlIHNob3VsZG4ndCB0cnkgdG8KKyAgICAvLyBmaWxsIGl0IGluIGVpdGhlciwgc2luY2UgdGhlIG1wZWd0cyBhbmQgUlRQIHRpbWVzdGFtcHMgYXJlIGluIHRvdGFsbHkKKyAgICAvLyBkaWZmZXJlbnQgcmFuZ2VzLgorICAgICp0aW1lc3RhbXAgPSBSVFBfTk9UU19WQUxVRTsKKworICAgIGlmICghZGF0YS0+dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoIWJ1ZikgeworICAgICAgICBpZiAoZGF0YS0+cmVhZF9idWZfaW5kZXggPj0gZGF0YS0+cmVhZF9idWZfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIHJldCA9IGF2cHJpdl9tcGVndHNfcGFyc2VfcGFja2V0KGRhdGEtPnRzLCBwa3QsIGRhdGEtPmJ1ZiArIGRhdGEtPnJlYWRfYnVmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5yZWFkX2J1Zl9zaXplIC0gZGF0YS0+cmVhZF9idWZfaW5kZXgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIGRhdGEtPnJlYWRfYnVmX2luZGV4ICs9IHJldDsKKyAgICAgICAgaWYgKGRhdGEtPnJlYWRfYnVmX2luZGV4IDwgZGF0YS0+cmVhZF9idWZfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXQgPSBhdnByaXZfbXBlZ3RzX3BhcnNlX3BhY2tldChkYXRhLT50cywgcGt0LCBidWYsIGxlbik7CisgICAgLyogVGhlIG9ubHkgZXJyb3IgdGhhdCBjYW4gYmUgcmV0dXJuZWQgZnJvbSBhdnByaXZfbXBlZ3RzX3BhcnNlX3BhY2tldAorICAgICAqIGlzICJubyBtb3JlIGRhdGEgdG8gcmV0dXJuIGZyb20gdGhlIHByb3ZpZGVkIGJ1ZmZlciIsIHNvIHJldHVybgorICAgICAqIEFWRVJST1IoRUFHQUlOKSBmb3IgYWxsIGVycm9ycyAqLworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgIGlmIChyZXQgPCBsZW4pIHsKKyAgICAgICAgZGF0YS0+cmVhZF9idWZfc2l6ZSA9IEZGTUlOKGxlbiAtIHJldCwgc2l6ZW9mKGRhdGEtPmJ1ZikpOworICAgICAgICBtZW1jcHkoZGF0YS0+YnVmLCBidWYgKyByZXQsIGRhdGEtPnJlYWRfYnVmX3NpemUpOworICAgICAgICBkYXRhLT5yZWFkX2J1Zl9pbmRleCA9IDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcGVndHNfZHluYW1pY19oYW5kbGVyID0geworICAgIC5jb2RlY190eXBlICAgICAgICA9IEFWTUVESUFfVFlQRV9EQVRBLAorICAgIC5wYXJzZV9wYWNrZXQgICAgICA9IG1wZWd0c19oYW5kbGVfcGFja2V0LAorICAgIC5hbGxvYyAgICAgICAgICAgICA9IG1wZWd0c19uZXdfY29udGV4dCwKKyAgICAuaW5pdCAgICAgICAgICAgICAgPSBtcGVndHNfaW5pdCwKKyAgICAuZnJlZSAgICAgICAgICAgICAgPSBtcGVndHNfZnJlZV9jb250ZXh0LAorICAgIC5zdGF0aWNfcGF5bG9hZF9pZCA9IDMzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfcWNlbHAuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfcWNlbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWJjZGQwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19xY2VscC5jCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogUlRQIERlcGFja2V0aXphdGlvbiBvZiBRQ0VMUC9QdXJlVm9pY2UsIFJGQyAyNjU4CisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInJ0cGRlY19mb3JtYXRzLmgiCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGZyYW1lX3NpemVzW10gPSB7CisgICAgMSwgNCwgOCwgMTcsIDM1Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHBvczsKKyAgICBpbnQgc2l6ZTsKKyAgICAvKiBUaGUgbGFyZ2VzdCBmcmFtZSBpcyAzNSBieXRlcywgb25seSAxMCBmcmFtZXMgYXJlIGFsbG93ZWQgcGVyCisgICAgICogcGFja2V0LCBhbmQgd2UgcmV0dXJuIHRoZSBmaXJzdCBvbmUgaW1tZWRpYXRlbHksIHNvIGFsbG9jYXRlCisgICAgICogc3BhY2UgZm9yIDkgZnJhbWVzICovCisgICAgdWludDhfdCBkYXRhWzM1KjldOworfSBJbnRlcmxlYXZlUGFja2V0OworCitzdHJ1Y3QgUGF5bG9hZENvbnRleHQgeworICAgIGludCBpbnRlcmxlYXZlX3NpemU7CisgICAgaW50IGludGVybGVhdmVfaW5kZXg7CisgICAgSW50ZXJsZWF2ZVBhY2tldCBncm91cFs2XTsKKyAgICBpbnQgZ3JvdXBfZmluaXNoZWQ7CisKKyAgICAvKiBUaGUgbWF4aW11bSBwYWNrZXQgc2l6ZSwgMTAgZnJhbWVzIG9mIDM1IGJ5dGVzIGVhY2gsIGFuZCBvbmUKKyAgICAgKiBwYWNrZXQgaGVhZGVyIGJ5dGUuICovCisgICAgdWludDhfdCAgbmV4dF9kYXRhWzEgKyAzNSoxMF07CisgICAgaW50ICAgICAgbmV4dF9zaXplOworICAgIHVpbnQzMl90IG5leHRfdGltZXN0YW1wOworfTsKKworc3RhdGljIFBheWxvYWRDb250ZXh0ICpxY2VscF9uZXdfY29udGV4dCh2b2lkKQoreworICAgIHJldHVybiBhdl9tYWxsb2N6KHNpemVvZihQYXlsb2FkQ29udGV4dCkpOworfQorCitzdGF0aWMgdm9pZCBxY2VscF9mcmVlX2NvbnRleHQoUGF5bG9hZENvbnRleHQgKmRhdGEpCit7CisgICAgYXZfZnJlZShkYXRhKTsKK30KKworc3RhdGljIGludCByZXR1cm5fc3RvcmVkX2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqY3R4LCBQYXlsb2FkQ29udGV4dCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QsIHVpbnQzMl90ICp0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKTsKKworc3RhdGljIGludCBzdG9yZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIFBheWxvYWRDb250ZXh0ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0LCB1aW50MzJfdCAqdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIGludCBpbnRlcmxlYXZlX3NpemUsIGludGVybGVhdmVfaW5kZXg7CisgICAgaW50IGZyYW1lX3NpemUsIHJldDsKKyAgICBJbnRlcmxlYXZlUGFja2V0KiBpcDsKKworICAgIGlmIChsZW4gPCAyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGludGVybGVhdmVfc2l6ZSAgPSBidWZbMF0gPj4gMyAmIDc7CisgICAgaW50ZXJsZWF2ZV9pbmRleCA9IGJ1ZlswXSAgICAgICYgNzsKKworICAgIGlmIChpbnRlcmxlYXZlX3NpemUgPiA1KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgaW50ZXJsZWF2ZSBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxlYXZlX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGludGVybGVhdmVfaW5kZXggPiBpbnRlcmxlYXZlX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBpbnRlcmxlYXZlIGluZGV4ICVkLyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxlYXZlX2luZGV4LCBpbnRlcmxlYXZlX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGludGVybGVhdmVfc2l6ZSAhPSBkYXRhLT5pbnRlcmxlYXZlX3NpemUpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIC8qIEZpcnN0IHBhY2tldCwgb3IgY2hhbmdlZCBpbnRlcmxlYXZlIHNpemUgKi8KKyAgICAgICAgZGF0YS0+aW50ZXJsZWF2ZV9zaXplID0gaW50ZXJsZWF2ZV9zaXplOworICAgICAgICBkYXRhLT5pbnRlcmxlYXZlX2luZGV4ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIGRhdGEtPmdyb3VwW2ldLnNpemUgPSAwOworICAgIH0KKworICAgIGlmIChpbnRlcmxlYXZlX2luZGV4IDwgZGF0YS0+aW50ZXJsZWF2ZV9pbmRleCkgeworICAgICAgICAvKiBXcmFwcGVkIGFyb3VuZCAtIG1pc3NlZCB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlIHByZXZpb3VzIGdyb3VwLiAqLworICAgICAgICBpZiAoZGF0YS0+Z3JvdXBfZmluaXNoZWQpIHsKKyAgICAgICAgICAgIC8qIE5vIG1vcmUgZGF0YSBpbiB0aGUgcGFja2V0cyBpbiB0aGlzIGludGVybGVhdmluZyBncm91cCwganVzdAorICAgICAgICAgICAgICogc3RhcnQgcHJvY2Vzc2luZyB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgIGRhdGEtPmludGVybGVhdmVfaW5kZXggPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogU3Rhc2ggYXdheSB0aGUgY3VycmVudCBwYWNrZXQsIGVtaXQgZXZlcnl0aGluZyB3ZSBoYXZlIG9mIHRoZQorICAgICAgICAgICAgICogcHJldmlvdXMgZ3JvdXAuICovCisgICAgICAgICAgICBmb3IgKDsgZGF0YS0+aW50ZXJsZWF2ZV9pbmRleCA8PSBpbnRlcmxlYXZlX3NpemU7CisgICAgICAgICAgICAgICAgIGRhdGEtPmludGVybGVhdmVfaW5kZXgrKykKKyAgICAgICAgICAgICAgICBkYXRhLT5ncm91cFtkYXRhLT5pbnRlcmxlYXZlX2luZGV4XS5zaXplID0gMDsKKworICAgICAgICAgICAgaWYgKGxlbiA+IHNpemVvZihkYXRhLT5uZXh0X2RhdGEpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgbWVtY3B5KGRhdGEtPm5leHRfZGF0YSwgYnVmLCBsZW4pOworICAgICAgICAgICAgZGF0YS0+bmV4dF9zaXplID0gbGVuOworICAgICAgICAgICAgZGF0YS0+bmV4dF90aW1lc3RhbXAgPSAqdGltZXN0YW1wOworICAgICAgICAgICAgKnRpbWVzdGFtcCA9IFJUUF9OT1RTX1ZBTFVFOworCisgICAgICAgICAgICBkYXRhLT5pbnRlcmxlYXZlX2luZGV4ID0gMDsKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5fc3RvcmVkX2ZyYW1lKGN0eCwgZGF0YSwgc3QsIHBrdCwgdGltZXN0YW1wLCBidWYsIGxlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGludGVybGVhdmVfaW5kZXggPiBkYXRhLT5pbnRlcmxlYXZlX2luZGV4KSB7CisgICAgICAgIC8qIFdlIG1pc3NlZCBhIHBhY2tldCAqLworICAgICAgICBmb3IgKDsgZGF0YS0+aW50ZXJsZWF2ZV9pbmRleCA8IGludGVybGVhdmVfaW5kZXg7CisgICAgICAgICAgICAgZGF0YS0+aW50ZXJsZWF2ZV9pbmRleCsrKQorICAgICAgICAgICAgZGF0YS0+Z3JvdXBbZGF0YS0+aW50ZXJsZWF2ZV9pbmRleF0uc2l6ZSA9IDA7CisgICAgfQorICAgIGRhdGEtPmludGVybGVhdmVfaW5kZXggPSBpbnRlcmxlYXZlX2luZGV4OworCisgICAgaWYgKGJ1ZlsxXSA+PSBGRl9BUlJBWV9FTEVNUyhmcmFtZV9zaXplcykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGZyYW1lX3NpemUgPSBmcmFtZV9zaXplc1tidWZbMV1dOworICAgIGlmICgxICsgZnJhbWVfc2l6ZSA+IGxlbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAobGVuIC0gMSAtIGZyYW1lX3NpemUgPiBzaXplb2YoZGF0YS0+Z3JvdXBbMF0uZGF0YSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKChyZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgZnJhbWVfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBtZW1jcHkocGt0LT5kYXRhLCAmYnVmWzFdLCBmcmFtZV9zaXplKTsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKworICAgIGlwID0gJmRhdGEtPmdyb3VwW2RhdGEtPmludGVybGVhdmVfaW5kZXhdOworICAgIGlwLT5zaXplID0gbGVuIC0gMSAtIGZyYW1lX3NpemU7CisgICAgaXAtPnBvcyA9IDA7CisgICAgbWVtY3B5KGlwLT5kYXRhLCAmYnVmWzEgKyBmcmFtZV9zaXplXSwgaXAtPnNpemUpOworICAgIC8qIEVhY2ggcGFja2V0IG11c3QgY29udGFpbiB0aGUgc2FtZSBudW1iZXIgb2YgZnJhbWVzIGFjY29yZGluZyB0byB0aGUKKyAgICAgKiBSRkMuIElmIHRoZXJlJ3Mgbm8gZGF0YSBsZWZ0IGluIHRoaXMgcGFja2V0LCB0aGVyZSBzaG91bGRuJ3QgYmUgYW55CisgICAgICogaW4gYW55IG9mIHRoZSBvdGhlciBmcmFtZXMgaW4gdGhlIGludGVybGVhdmluZyBncm91cCBlaXRoZXIuICovCisgICAgZGF0YS0+Z3JvdXBfZmluaXNoZWQgPSBpcC0+c2l6ZSA9PSAwOworCisgICAgaWYgKGludGVybGVhdmVfaW5kZXggPT0gaW50ZXJsZWF2ZV9zaXplKSB7CisgICAgICAgIGRhdGEtPmludGVybGVhdmVfaW5kZXggPSAwOworICAgICAgICByZXR1cm4gIWRhdGEtPmdyb3VwX2ZpbmlzaGVkOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEtPmludGVybGVhdmVfaW5kZXgrKzsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgaW50IHJldHVybl9zdG9yZWRfZnJhbWUoQVZGb3JtYXRDb250ZXh0ICpjdHgsIFBheWxvYWRDb250ZXh0ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCwgdWludDMyX3QgKnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisgICAgSW50ZXJsZWF2ZVBhY2tldCogaXAgPSAmZGF0YS0+Z3JvdXBbZGF0YS0+aW50ZXJsZWF2ZV9pbmRleF07CisgICAgaW50IGZyYW1lX3NpemUsIHJldDsKKworICAgIGlmIChkYXRhLT5ncm91cF9maW5pc2hlZCAmJiBkYXRhLT5pbnRlcmxlYXZlX2luZGV4ID09IDApIHsKKyAgICAgICAgKnRpbWVzdGFtcCA9IGRhdGEtPm5leHRfdGltZXN0YW1wOworICAgICAgICByZXQgPSBzdG9yZV9wYWNrZXQoY3R4LCBkYXRhLCBzdCwgcGt0LCB0aW1lc3RhbXAsIGRhdGEtPm5leHRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm5leHRfc2l6ZSk7CisgICAgICAgIGRhdGEtPm5leHRfc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGlwLT5zaXplID09IDApIHsKKyAgICAgICAgLyogTm8gc3RvcmVkIGRhdGEgZm9yIHRoaXMgaW50ZXJsZWF2ZSBibG9jaywgb3V0cHV0IGFuIGVtcHR5IHBhY2tldCAqLworICAgICAgICBpZiAoKHJldCA9IGF2X25ld19wYWNrZXQocGt0LCAxKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcGt0LT5kYXRhWzBdID0gMDsgLy8gQmxhbmsgLSBjb3VsZCBhbHNvIGJlIDE0LCBFcmFzdXJlCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlwLT5wb3MgPj0gaXAtPnNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKGlwLT5kYXRhW2lwLT5wb3NdID49IEZGX0FSUkFZX0VMRU1TKGZyYW1lX3NpemVzKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBmcmFtZV9zaXplID0gZnJhbWVfc2l6ZXNbaXAtPmRhdGFbaXAtPnBvc11dOworICAgICAgICBpZiAoaXAtPnBvcyArIGZyYW1lX3NpemUgPiBpcC0+c2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGlmICgocmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIGZyYW1lX3NpemUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCAmaXAtPmRhdGFbaXAtPnBvc10sIGZyYW1lX3NpemUpOworCisgICAgICAgIGlwLT5wb3MgKz0gZnJhbWVfc2l6ZTsKKyAgICAgICAgZGF0YS0+Z3JvdXBfZmluaXNoZWQgPSBpcC0+cG9zID49IGlwLT5zaXplOworICAgIH0KKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKworICAgIGlmIChkYXRhLT5pbnRlcmxlYXZlX2luZGV4ID09IGRhdGEtPmludGVybGVhdmVfc2l6ZSkgeworICAgICAgICBkYXRhLT5pbnRlcmxlYXZlX2luZGV4ID0gMDsKKyAgICAgICAgaWYgKCFkYXRhLT5ncm91cF9maW5pc2hlZCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZGF0YS0+bmV4dF9zaXplID4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhLT5pbnRlcmxlYXZlX2luZGV4Kys7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworc3RhdGljIGludCBxY2VscF9wYXJzZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIFBheWxvYWRDb250ZXh0ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0LCB1aW50MzJfdCAqdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuLCB1aW50MTZfdCBzZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgaWYgKGJ1ZikKKyAgICAgICAgcmV0dXJuIHN0b3JlX3BhY2tldChjdHgsIGRhdGEsIHN0LCBwa3QsIHRpbWVzdGFtcCwgYnVmLCBsZW4pOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHJldHVybl9zdG9yZWRfZnJhbWUoY3R4LCBkYXRhLCBzdCwgcGt0LCB0aW1lc3RhbXAsIGJ1ZiwgbGVuKTsKK30KKworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9xY2VscF9keW5hbWljX2hhbmRsZXIgPSB7CisgICAgLmVuY19uYW1lICAgICAgICAgICA9ICJ4LVB1cmV2b2ljZSIsCisgICAgLmNvZGVjX3R5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuY29kZWNfaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfUUNFTFAsCisgICAgLnN0YXRpY19wYXlsb2FkX2lkICA9IDEyLAorICAgIC5hbGxvYyAgICAgICAgICAgICAgPSBxY2VscF9uZXdfY29udGV4dCwKKyAgICAuZnJlZSAgICAgICAgICAgICAgID0gcWNlbHBfZnJlZV9jb250ZXh0LAorICAgIC5wYXJzZV9wYWNrZXQgICAgICAgPSBxY2VscF9wYXJzZV9wYWNrZXQKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX3FkbTIuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfcWRtMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZGQ2MmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX3FkbTIuYwpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIFFEZXNpZ24gTXVzaWMgMiAoUURNMikgcGF5bG9hZCBmb3IgUlRQCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUm9uYWxkIFMuIEJ1bHRqZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgUlRQIHN1cHBvcnQgZm9yIHRoZSBRRE0yIHBheWxvYWQgKHRvZG86IHdpa2kpCisgKiBAYXV0aG9yIFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicnRwLmgiCisjaW5jbHVkZSAicnRwZGVjLmgiCisjaW5jbHVkZSAicnRwZGVjX2Zvcm1hdHMuaCIKKworc3RydWN0IFBheWxvYWRDb250ZXh0IHsKKyAgICAvKiogdmFsdWVzIHJlYWQgZnJvbSB0aGUgY29uZmlnIGhlYWRlciwgdXNlZCBhcyBwYWNrZXQgaGVhZGVycyAqLworICAgIC8vQHsKKyAgICBpbnQgYmxvY2tfdHlwZTsgICAgICAgICAgICAvLy88IHN1cGVyYmxvY2sgdHlwZSwgdmFsdWUgMiAuLiA4CisgICAgaW50IGJsb2NrX3NpemU7ICAgICAgICAgICAgLy8vPCBmcm9tIGV4dHJhZGF0YSwgdXNlZCBhcyBwa3QgbGVuZ3RoCisgICAgaW50IHN1YnBrdHNfcGVyX2Jsb2NrOyAgICAgLy8vPCBtYXguIG5yLiBvZiBzdWJwYWNrZXRzIHRvIGFkZCBwZXIgb3V0cHV0IGJ1ZmZlcgorICAgIC8vQH0KKworICAgIC8qKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3Igc3VwZXJibG9jayByZXN0b3JpbmcsIHBlciBwYWNrZXQgSUQgKDB4ODAgdG90YWwpICovCisgICAgLy9AeworICAgIHVpbnQxNl90IGxlblsweDgwXTsgICAgICAgIC8vLzwgaG93IG11Y2ggdGhlIHRlbXBvcmFyeSBidWZmZXIgaXMgZmlsbGVkCisgICAgdWludDhfdCAgYnVmWzB4ODBdWzB4ODAwXTsgLy8vPCB0aGUgdGVtcG9yYXJ5IHN0b3JhZ2UgYnVmZmVyCisKKyAgICB1bnNpZ25lZCBpbnQgY2FjaGU7ICAgICAgICAvLy88IG51bWJlciBvZiBkYXRhIHBhY2tldHMgdGhhdCB3ZSBoYXZlIGNhY2hlZCByaWdodCBub3cKKyAgICB1bnNpZ25lZCBpbnQgbl9wa3RzOyAgICAgICAvLy88IG51bWJlciBvZiBSVFAgcGFja2V0cyByZWNlaXZlZCBzaW5jZSBsYXN0IHBhY2tldCBvdXRwdXQgLyBjb25maWcKKyAgICB1aW50MzJfdCB0aW1lc3RhbXA7ICAgICAgICAvLy88IHRpbWVzdGFtcCBvZiBuZXh0LXRvLWJlLXJldHVybmVkIHBhY2tldAorICAgIC8vQH0KK307CisKKy8qKgorICogUGFyc2UgY29uZmlndXJhdGlvbiAoYmFzaWNhbGx5IHRoZSBjb2RlYy1zcGVjaWZpYyBleHRyYWRhdGEpIGZyb20KKyAqIGFuIFJUUCBjb25maWcgc3VicGFja2V0IChzdGFydHMgd2l0aCAweGZmKS4KKyAqCisgKiBMYXlvdXQgb2YgdGhlIGNvbmZpZyBzdWJwYWNrZXQgKGluIGJ5dGVzKToKKyAqIDE6IDB4RkYgICAgICAgICAgPC0gY29uZmlnIElECisgKiB0aGVuIGFuIGFycmF5IHsKKyAqICAgICAxOiBzaXplICAgICAgPC0gb2YgdGhlIGN1cnJlbnQgaXRlbQorICogICAgIDE6IGl0ZW0gdHlwZSA8LSAwIC4uIDQKKyAqICAgICBzaXplLTI6IGRhdGEgPC0gZGF0YSBkZXBlbmRzIG9uIHRoZSBpdGVtIHR5cGUKKyAqIH0KKyAqCisgKiBJdGVtIDAgaW1wbGllcyB0aGUgZW5kIG9mIHRoZSBjb25maWcgc3VicGFja2V0LCBhbmQgaGFzIG5vIGRhdGEuCisgKiBJdGVtIDEgaW1wbGllcyBhIHN0cmVhbSBjb25maWd1cmF0aW9uIHdpdGhvdXQgZXh0cmFkYXRhLgorICogSXRlbSAyIG1heC4gbnIuIG9mIHN1YnBhY2tldHMgcGVyIHN1cGVyYmxvY2sKKyAqIEl0ZW0gMyBzdXBlcmJsb2NrIHR5cGUgZm9yIHRoZSBzdHJlYW0KKyAqIEl0ZW0gNCBpbXBsaWVzIGEgc3RyZWFtIGNvbmZpZ3VyYXRpb24gd2l0aCBleHRyYWRhdGEgKHNpemUgPj0gMHgxYykuCisgKgorICogQHJldHVybiA8MCBvbiBlcnJvciwgb3RoZXJ3aXNlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGFyc2VkIGZyb20gdGhlCisgKiAgICAgICAgIGlucHV0IGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBxZG0yX3BhcnNlX2NvbmZpZyhQYXlsb2FkQ29udGV4dCAqcWRtLCBBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgY29uc3QgdWludDhfdCAqZW5kKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBidWY7CisKKyAgICB3aGlsZSAoZW5kIC0gcCA+PSAyKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBpdGVtX2xlbiA9IHBbMF0sIGNvbmZpZ19pdGVtID0gcFsxXTsKKworICAgICAgICBpZiAoaXRlbV9sZW4gPCAyIHx8IGVuZCAtIHAgPCBpdGVtX2xlbiB8fCBjb25maWdfaXRlbSA+IDQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBzd2l0Y2ggKGNvbmZpZ19pdGVtKSB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIGVuZCBvZiBjb25maWcgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gcCAtIGJ1ZiArIGl0ZW1fbGVuOworICAgICAgICAgICAgY2FzZSAxOiAvKiBzdHJlYW0gd2l0aG91dCBleHRyYWRhdGEgKi8KKyAgICAgICAgICAgICAgICAvKiBGSVhNRTogc2V0IGRlZmF1bHQgcWRtLT5ibG9ja19zaXplICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8qKjwgc3VicGFja2V0cyBwZXIgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBpZiAoaXRlbV9sZW4gPCAzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBxZG0tPnN1YnBrdHNfcGVyX2Jsb2NrID0gcFsyXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogLyogc3VwZXJibG9jayB0eXBlICovCisgICAgICAgICAgICAgICAgaWYgKGl0ZW1fbGVuIDwgNCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgcWRtLT5ibG9ja190eXBlID0gQVZfUkIxNihwICsgMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6IC8qIHN0cmVhbSB3aXRoIGV4dHJhZGF0YSAqLworICAgICAgICAgICAgICAgIGlmIChpdGVtX2xlbiA8IDMwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgICAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCAyNiArIGl0ZW1fbGVuKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBVl9XQjMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCAxMik7CisgICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgNCwgImZybWEiLCA0KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA4LCAiUURNMiIsIDQpOworICAgICAgICAgICAgICAgIEFWX1dCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAxMiwgNiArIGl0ZW1fbGVuKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAxNiwgIlFEQ0EiLCA0KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAyMCwgcCArIDIsIGl0ZW1fbGVuIC0gMik7CisgICAgICAgICAgICAgICAgQVZfV0IzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDE4ICsgaXRlbV9sZW4sIDgpOworICAgICAgICAgICAgICAgIEFWX1dCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAyMiArIGl0ZW1fbGVuLCAwKTsKKworICAgICAgICAgICAgICAgIHFkbS0+YmxvY2tfc2l6ZSA9IEFWX1JCMzIocCArIDI2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHAgKz0gaXRlbV9sZW47CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsgLyogbm90IGVub3VnaCBkYXRhICovCit9CisKKy8qKgorICogUGFyc2UgYSBzaW5nbGUgc3VicGFja2V0LiBXZSBzdG9yZSB0aGlzIHN1YnBhY2tldCBpbiBhbiBpbnRlcm1lZGlhdGUKKyAqIGJ1ZmZlciAocG9zaXRpb24gZGVwZW5kcyBvbiB0aGUgSUQgKGJ5dGVbMF0pLiBXaGVuIGNhbGxlZCwgYXQgbGVhc3QKKyAqIDQgYnl0ZXMgYXJlIGF2YWlsYWJsZSBmb3IgcmVhZGluZyAoc2VlIHFkbTJfcGFyc2VfcGFja2V0KCkpLgorICoKKyAqIExheW91dCBvZiBhIHNpbmdsZSBzdWJwYWNrZXQgKFJUUCBwYWNrZXRzIGNvbW1vbmx5IGNvbnRhaW4gbXVsdGlwbGUKKyAqIHN1Y2ggc3VicGFja2V0cykgLSBsZW5ndGggaW4gYnl0ZXM6CisgKiAxOiAgICBvcmRlcmluZyBJRCAgICAgICAgPC0gMCAuLiAweDdGCisgKiAxOiAgICBzdWJwYWNrZXQgdHlwZSAgICAgPC0gMCAuLiAweDdGOyB2YWx1ZSAmIDB4ODAgbWVhbnMgc3VicGFja2V0IGxlbmd0aCA9IDIgYnl0ZXMsIGVsc2UgMSBieXRlCisgKiAxLzI6ICBzdWJwYWNrZXQgbGVuZ3RoICAgPC0gbGVuZ3RoIG9mIHRoZSBkYXRhIGZvbGxvd2luZyB0aGUgZmxhZ3MvbGVuZ3RoIGZpZWxkcworICogaWYgKHN1YnBhY2tldCB0eXBlICYgMHg3RikgPT0gMHg3RgorICogICAxOiAgc3VicGFja2V0IHR5cGUsIGhpZ2hlciBiaXRzCisgKiBzaXplOiBzdWJwYWNrZXQgZGF0YQorICoKKyAqIFRoZSBzdWJwYWNrZXRzIGNvbWUgaW4gcmFuZG9tbHksIGFuZCBzaG91bGQgYmUgZW5jYXBzdWxhdGVkIGludG8gMQorICogb3IgbW9yZSBzdXBlcmJsb2NrcyAoY29udGFpbmluZyBxZG0tPnN1YnBrdHNfcGVyX2Jsb2NrIHN1YnBhY2tldHMKKyAqIGVhY2gpIHBlciBSVFAgcGFja2V0LCBpbiBvcmRlciBvZiBhc2NlbmRpbmcgIm9yZGVyaW5nIElEIiwgc2VlCisgKiBxZG0yX3Jlc3RvcmVfYmxvY2soKS4KKyAqCisgKiBAcmV0dXJuIDwwIG9uIGVycm9yLCBvdGhlcndpc2UgdGhlIG51bWJlciBvZiBieXRlcyBwYXJzZWQgZnJvbSB0aGUKKyAqICAgICAgICAgaW5wdXQgYnVmZmVyLgorICovCitzdGF0aWMgaW50IHFkbTJfcGFyc2Vfc3VicGFja2V0KFBheWxvYWRDb250ZXh0ICpxZG0sIEFWU3RyZWFtICpzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICplbmQpCit7CisgICAgY29uc3QgdWludDhfdCAqcCA9IGJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQgaWQsIGxlbiwgdHlwZSwgdG9fY29weTsKKworICAgIC8qIHBhcnNlIGhlYWRlciBzbyB3ZSBrbm93IHRoZSBzaXplIG9mIHRoZSBoZWFkZXIvZGF0YSAqLworICAgIGlkICAgICAgID0gKnArKzsKKyAgICB0eXBlICAgICA9ICpwKys7CisgICAgaWYgKHR5cGUgJiAweDgwKSB7CisgICAgICAgIGxlbiAgID0gQVZfUkIxNihwKTsKKyAgICAgICAgcCAgICArPSAyOworICAgICAgICB0eXBlICY9IDB4N0Y7CisgICAgfSBlbHNlCisgICAgICAgIGxlbiA9ICpwKys7CisKKyAgICBpZiAoZW5kIC0gcCA8IGxlbiArICh0eXBlID09IDB4N0YpIHx8IGlkID49IDB4ODApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmICh0eXBlID09IDB4N0YpCisgICAgICAgIHR5cGUgfD0gKnArKyA8PCA4OworCisgICAgLyogY29weSBkYXRhIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyICovCisgICAgdG9fY29weSA9IEZGTUlOKGxlbiArIChwIC0gJmJ1ZlsxXSksIDB4ODAwIC0gcWRtLT5sZW5baWRdKTsKKyAgICBtZW1jcHkoJnFkbS0+YnVmW2lkXVtxZG0tPmxlbltpZF1dLCBidWYgKyAxLCB0b19jb3B5KTsKKyAgICBxZG0tPmxlbltpZF0gKz0gdG9fY29weTsKKworICAgIHJldHVybiBwICsgbGVuIC0gYnVmOworfQorCisvKioKKyAqIEFkZCBhIHN1cGVyYmxvY2sgaGVhZGVyIGFyb3VuZCBhIHNldCBvZiBzdWJwYWNrZXRzLgorICoKKyAqIEByZXR1cm4gPDAgb24gZXJyb3IsIGVsc2UgMC4KKyAqLworc3RhdGljIGludCBxZG0yX3Jlc3RvcmVfYmxvY2soUGF5bG9hZENvbnRleHQgKnFkbSwgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0KQoreworICAgIGludCB0b19jb3B5LCBuLCByZXMsIGluY2x1ZGVfY3N1bTsKKyAgICB1aW50OF90ICpwLCAqY3N1bV9wb3MgPSBOVUxMOworCisgICAgLyogY3JlYXRlIHBhY2tldCB0byBob2xkIHN1YnBrdHMgaW50byBhIHN1cGVyYmxvY2sgKi8KKyAgICBhc3NlcnQocWRtLT5jYWNoZSA+IDApOworICAgIGZvciAobiA9IDA7IG4gPCAweDgwOyBuKyspCisgICAgICAgIGlmIChxZG0tPmxlbltuXSA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICBhdl9hc3NlcnQwKG4gPCAweDgwKTsKKworICAgIGlmICgocmVzID0gYXZfbmV3X3BhY2tldChwa3QsIHFkbS0+YmxvY2tfc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBtZW1zZXQocGt0LT5kYXRhLCAwLCBwa3QtPnNpemUpOworICAgIHBrdC0+c3RyZWFtX2luZGV4ICA9IHN0LT5pbmRleDsKKyAgICBwICAgICAgICAgICAgICAgICAgPSBwa3QtPmRhdGE7CisKKyAgICAvKiBzdXBlcmJsb2NrIGhlYWRlciAqLworICAgIGlmIChxZG0tPmxlbltuXSA+IDB4ZmYpIHsKKyAgICAgICAgKnArKyA9IHFkbS0+YmxvY2tfdHlwZSB8IDB4ODA7CisgICAgICAgIEFWX1dCMTYocCwgcWRtLT5sZW5bbl0pOworICAgICAgICBwICAgKz0gMjsKKyAgICB9IGVsc2UgeworICAgICAgICAqcCsrID0gcWRtLT5ibG9ja190eXBlOworICAgICAgICAqcCsrID0gcWRtLT5sZW5bbl07CisgICAgfQorICAgIGlmICgoaW5jbHVkZV9jc3VtID0gKHFkbS0+YmxvY2tfdHlwZSA9PSAyIHx8IHFkbS0+YmxvY2tfdHlwZSA9PSA0KSkpIHsKKyAgICAgICAgY3N1bV9wb3MgPSBwOworICAgICAgICBwICAgICAgICs9IDI7CisgICAgfQorCisgICAgLyogc3VicGFja2V0IGRhdGEgKi8KKyAgICB0b19jb3B5ID0gRkZNSU4ocWRtLT5sZW5bbl0sIHBrdC0+c2l6ZSAtIChwIC0gcGt0LT5kYXRhKSk7CisgICAgbWVtY3B5KHAsIHFkbS0+YnVmW25dLCB0b19jb3B5KTsKKyAgICBxZG0tPmxlbltuXSA9IDA7CisKKyAgICAvKiBjaGVja3N1bSBoZWFkZXIgKi8KKyAgICBpZiAoaW5jbHVkZV9jc3VtKSB7CisgICAgICAgIHVuc2lnbmVkIGludCB0b3RhbCA9IDA7CisgICAgICAgIHVpbnQ4X3QgKnE7CisKKyAgICAgICAgZm9yIChxID0gcGt0LT5kYXRhOyBxIDwgJnBrdC0+ZGF0YVtxZG0tPmJsb2NrX3NpemVdOyBxKyspCisgICAgICAgICAgICB0b3RhbCArPSAqcTsKKyAgICAgICAgQVZfV0IxNihjc3VtX3BvcywgKHVpbnQxNl90KSB0b3RhbCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiByZXR1cm4gMCBvbiBwYWNrZXQsIG5vIG1vcmUgbGVmdCwgMSBvbiBwYWNrZXQsIC0xIG9uIHBhcnRpYWwgcGFja2V0Li4uICovCitzdGF0aWMgaW50IHFkbTJfcGFyc2VfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgUGF5bG9hZENvbnRleHQgKnFkbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4sIHVpbnQxNl90IHNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIGludCByZXMgPSBBVkVSUk9SX0lOVkFMSUREQVRBLCBuOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IGJ1ZiArIGxlbiwgKnAgPSBidWY7CisKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgICBpZiAobGVuIDwgMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIC8qIGNvbmZpZ3VyYXRpb24gYmxvY2sgKi8KKyAgICAgICAgaWYgKCpwID09IDB4ZmYpIHsKKyAgICAgICAgICAgIGlmIChxZG0tPm5fcGt0cyA+IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJPdXQgb2Ygc2VxdWVuY2UgY29uZmlnIC0gZHJvcHBpbmcgcXVldWVcbiIpOworICAgICAgICAgICAgICAgIHFkbS0+bl9wa3RzID0gMDsKKyAgICAgICAgICAgICAgICBtZW1zZXQocWRtLT5sZW4sIDAsIHNpemVvZihxZG0tPmxlbikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHJlcyA9IHFkbTJfcGFyc2VfY29uZmlnKHFkbSwgc3QsICsrcCwgZW5kKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBwICs9IHJlczsKKworICAgICAgICAgICAgLyogV2Ugc2V0IGNvZGVjX2lkIHRvIEFWX0NPREVDX0lEX05PTkUgaW5pdGlhbGx5IHRvCisgICAgICAgICAgICAgKiBkZWxheSBkZWNvZGVyIGluaXRpYWxpemF0aW9uIHNpbmNlIGV4dHJhZGF0YSBpcworICAgICAgICAgICAgICogY2FycmllZCB3aXRoaW4gdGhlIFJUUCBzdHJlYW0sIG5vdCBTRFAuIEhlcmUsCisgICAgICAgICAgICAgKiBieSBzZXR0aW5nIGNvZGVjX2lkIHRvIEFWX0NPREVDX0lEX1FETTIsIHdlIGFyZSBzaWduYWxsaW5nCisgICAgICAgICAgICAgKiB0byB0aGUgZGVjb2RlciB0aGF0IGl0IGlzIE9LIHRvIGluaXRpYWxpemUuICovCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUURNMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKworICAgICAgICAvKiBzdWJwYWNrZXRzICovCisgICAgICAgIHdoaWxlIChlbmQgLSBwID49IDQpIHsKKyAgICAgICAgICAgIGlmICgocmVzID0gcWRtMl9wYXJzZV9zdWJwYWNrZXQocWRtLCBzdCwgcCwgZW5kKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBwICs9IHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHFkbS0+dGltZXN0YW1wID0gKnRpbWVzdGFtcDsKKyAgICAgICAgaWYgKCsrcWRtLT5uX3BrdHMgPCBxZG0tPnN1YnBrdHNfcGVyX2Jsb2NrKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgcWRtLT5jYWNoZSA9IDA7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAweDgwOyBuKyspCisgICAgICAgICAgICBpZiAocWRtLT5sZW5bbl0gPiAwKQorICAgICAgICAgICAgICAgIHFkbS0+Y2FjaGUrKzsKKyAgICB9CisKKyAgICAvKiBvdXRwdXQgdGhlIHN1YnBhY2tldHMgaW50byBmcmVzaGx5IGNyZWF0ZWQgc3VwZXJibG9jayBzdHJ1Y3R1cmVzICovCisgICAgaWYgKCFxZG0tPmNhY2hlIHx8IChyZXMgPSBxZG0yX3Jlc3RvcmVfYmxvY2socWRtLCBzdCwgcGt0KSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworICAgIGlmICgtLXFkbS0+Y2FjaGUgPT0gMCkKKyAgICAgICAgcWRtLT5uX3BrdHMgPSAwOworCisgICAgKnRpbWVzdGFtcCA9IHFkbS0+dGltZXN0YW1wOworICAgIHFkbS0+dGltZXN0YW1wID0gUlRQX05PVFNfVkFMVUU7CisKKyAgICByZXR1cm4gKHFkbS0+Y2FjaGUgPiAwKSA/IDEgOiAwOworfQorCitzdGF0aWMgUGF5bG9hZENvbnRleHQgKnFkbTJfZXh0cmFkYXRhX25ldyh2b2lkKQoreworICAgIHJldHVybiBhdl9tYWxsb2N6KHNpemVvZihQYXlsb2FkQ29udGV4dCkpOworfQorCitzdGF0aWMgdm9pZCBxZG0yX2V4dHJhZGF0YV9mcmVlKFBheWxvYWRDb250ZXh0ICpxZG0pCit7CisgICAgYXZfZnJlZShxZG0pOworfQorCitSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3FkbTJfZHluYW1pY19oYW5kbGVyID0geworICAgIC5lbmNfbmFtZSAgICAgICAgID0gIlgtUURNIiwKKyAgICAuY29kZWNfdHlwZSAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuY29kZWNfaWQgICAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLmFsbG9jICAgICAgICAgICAgPSBxZG0yX2V4dHJhZGF0YV9uZXcsCisgICAgLmZyZWUgICAgICAgICAgICAgPSBxZG0yX2V4dHJhZGF0YV9mcmVlLAorICAgIC5wYXJzZV9wYWNrZXQgICAgID0gcWRtMl9wYXJzZV9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19xdC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19xdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MjUzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX3F0LmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBSVFAvUXVpY2t0aW1lIHN1cHBvcnQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUm9uYWxkIFMuIEJ1bHRqZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgUXVpY2t0aW1lLXN0eWxlIFJUUCBzdXBwb3J0CisgKiBAYXV0aG9yIFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJydHAuaCIKKyNpbmNsdWRlICJydHBkZWMuaCIKKyNpbmNsdWRlICJpc29tLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorCitzdHJ1Y3QgUGF5bG9hZENvbnRleHQgeworICAgIEFWUGFja2V0IHBrdDsKKyAgICBpbnQgYnl0ZXNfcGVyX2ZyYW1lLCByZW1haW5pbmc7CisgICAgdWludDMyX3QgdGltZXN0YW1wOworfTsKKworc3RhdGljIGludCBxdF9ydHBfcGFyc2VfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgUGF5bG9hZENvbnRleHQgKnF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdGltZXN0YW1wLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgdWludDE2X3Qgc2VxLCBpbnQgZmxhZ3MpCit7CisgICAgQVZJT0NvbnRleHQgcGI7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgcGFja2luZ19zY2hlbWUsIGhhc19wYXlsb2FkX2Rlc2MsIGhhc19wYWNrZXRfaW5mbywgYWxlbiwKKyAgICAgICAgaGFzX21hcmtlcl9iaXQgPSBmbGFncyAmIFJUUF9GTEFHX01BUktFUjsKKworICAgIGlmIChxdC0+cmVtYWluaW5nKSB7CisgICAgICAgIGludCBudW0gPSBxdC0+cGt0LnNpemUgLyBxdC0+Ynl0ZXNfcGVyX2ZyYW1lOworCisgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgcXQtPmJ5dGVzX3Blcl9mcmFtZSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgcGt0LT5mbGFncyAgICAgICAgPSBxdC0+cGt0LmZsYWdzOworICAgICAgICBtZW1jcHkocGt0LT5kYXRhLAorICAgICAgICAgICAgICAgJnF0LT5wa3QuZGF0YVsobnVtIC0gcXQtPnJlbWFpbmluZykgKiBxdC0+Ynl0ZXNfcGVyX2ZyYW1lXSwKKyAgICAgICAgICAgICAgIHF0LT5ieXRlc19wZXJfZnJhbWUpOworICAgICAgICBpZiAoLS1xdC0+cmVtYWluaW5nID09IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZxdC0+cGt0LmRhdGEpOworICAgICAgICAgICAgcXQtPnBrdC5zaXplID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcXQtPnJlbWFpbmluZyA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFJUUCBwYXlsb2FkIGlzIGRlc2NyaWJlZCBpbjoKKyAgICAgKiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9xdWlja3RpbWUvaWNlZmxvZS9kaXNwYXRjaDAyNi5odG1sCisgICAgICovCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgbGVuIDw8IDMpOworICAgIGZmaW9faW5pdF9jb250ZXh0KCZwYiwgKHVpbnQ4X3QqKWJ1ZiwgbGVuLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgIGlmIChsZW4gPCA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHNraXBfYml0cygmZ2IsIDQpOyAvLyB2ZXJzaW9uCisgICAgaWYgKChwYWNraW5nX3NjaGVtZSA9IGdldF9iaXRzKCZnYiwgMikpID09IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChnZXRfYml0czEoJmdiKSkKKyAgICAgICAgZmxhZ3MgICAgICAgICAgfD0gUlRQX0ZMQUdfS0VZOworICAgIGhhc19wYXlsb2FkX2Rlc2MgICAgPSBnZXRfYml0czEoJmdiKTsKKyAgICBoYXNfcGFja2V0X2luZm8gICAgID0gZ2V0X2JpdHMxKCZnYik7CisgICAgc2tpcF9iaXRzKCZnYiwgMjMpOyAvLyByZXNlcnZlZDo3LCBjYWNoZSBwYXlsb2FkIGluZm86MSwgcGF5bG9hZCBJRDoxNQorCisgICAgaWYgKGhhc19wYXlsb2FkX2Rlc2MpIHsKKyAgICAgICAgaW50IGRhdGFfbGVuLCBwb3MsIGlzX3N0YXJ0LCBpc19maW5pc2g7CisgICAgICAgIHVpbnQzMl90IHRhZzsKKworICAgICAgICBwb3MgPSBnZXRfYml0c19jb3VudCgmZ2IpID4+IDM7CisgICAgICAgIGlmIChwb3MgKyAxMiA+IGxlbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHNraXBfYml0cygmZ2IsIDIpOyAvLyBoYXMgbm9uLUkgZnJhbWVzOjEsIGlzIHNwYXJzZToxCisgICAgICAgIGlzX3N0YXJ0ICA9IGdldF9iaXRzMSgmZ2IpOworICAgICAgICBpc19maW5pc2ggPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgaWYgKCFpc19zdGFydCB8fCAhaXNfZmluaXNoKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIlJUUC1YLVFUIHdpdGggcGF5bG9hZCBkZXNjcmlwdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbGl0IG92ZXIgc2V2ZXJhbCBwYWNrZXRzIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICAgICAgc2tpcF9iaXRzKCZnYiwgMTIpOyAvLyByZXNlcnZlZAorICAgICAgICBkYXRhX2xlbiA9IGdldF9iaXRzKCZnYiwgMTYpOworCisgICAgICAgIGF2aW9fc2VlaygmcGIsIHBvcyArIDQsIFNFRUtfU0VUKTsKKyAgICAgICAgdGFnID0gYXZpb19ybDMyKCZwYik7CisgICAgICAgIGlmICgoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgICAgICAgICAgICAgICB0YWcgIT0gTUtUQUcoJ3YnLCdpJywnZCcsJ2UnKSkgfHwKKyAgICAgICAgICAgIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICAgICAgICAgIHRhZyAhPSBNS1RBRygncycsJ28nLCd1JywnbicpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgYXZpb19yYjMyKCZwYikpOworCisgICAgICAgIGlmIChwb3MgKyBkYXRhX2xlbiA+IGxlbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAvKiBUTFZzICovCisgICAgICAgIHdoaWxlIChhdmlvX3RlbGwoJnBiKSArIDQgPCBwb3MgKyBkYXRhX2xlbikgeworICAgICAgICAgICAgaW50IHRsdl9sZW4gPSBhdmlvX3JiMTYoJnBiKTsKKyAgICAgICAgICAgIHRhZyA9IGF2aW9fcmwxNigmcGIpOworICAgICAgICAgICAgaWYgKGF2aW9fdGVsbCgmcGIpICsgdGx2X2xlbiA+IHBvcyArIGRhdGFfbGVuKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisjZGVmaW5lIE1LVEFHMTYoYSxiKSBNS1RBRyhhLGIsMCwwKQorICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgICAgIGNhc2UgTUtUQUcxNigncycsJ2QnKTogeworICAgICAgICAgICAgICAgIE1PVlN0cmVhbUNvbnRleHQgKm1zYzsKKyAgICAgICAgICAgICAgICB2b2lkICpwcml2X2RhdGEgPSBzdC0+cHJpdl9kYXRhOworICAgICAgICAgICAgICAgIGludCBuYl9zdHJlYW1zID0gcy0+bmJfc3RyZWFtczsKKyAgICAgICAgICAgICAgICBNT1ZDb250ZXh0ICptYyA9IGF2X21hbGxvY3ooc2l6ZW9mKCptYykpOworICAgICAgICAgICAgICAgIGlmICghbWMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgbWMtPmZjID0gczsKKyAgICAgICAgICAgICAgICBzdC0+cHJpdl9kYXRhID0gbXNjID0gYXZfbWFsbG9jeihzaXplb2YoTU9WU3RyZWFtQ29udGV4dCkpOworICAgICAgICAgICAgICAgIGlmICghbXNjKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUobWMpOworICAgICAgICAgICAgICAgICAgICBzdC0+cHJpdl9kYXRhID0gcHJpdl9kYXRhOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmZl9tb3ZfcmVhZF9zdHNkX2VudHJpZXMgdXBkYXRlcyBzdHJlYW0gcy0+bmJfc3RyZWFtcy0xLAorICAgICAgICAgICAgICAgICAqIHNvIHNldCBpdCB0ZW1wb3JhcmlseSB0byBpbmRpY2F0ZSB3aGljaCBzdHJlYW0gdG8gdXBkYXRlLiAqLworICAgICAgICAgICAgICAgIHMtPm5iX3N0cmVhbXMgPSBzdC0+aW5kZXggKyAxOworICAgICAgICAgICAgICAgIGZmX21vdl9yZWFkX3N0c2RfZW50cmllcyhtYywgJnBiLCAxKTsKKyAgICAgICAgICAgICAgICBxdC0+Ynl0ZXNfcGVyX2ZyYW1lID0gbXNjLT5ieXRlc19wZXJfZnJhbWU7CisgICAgICAgICAgICAgICAgYXZfZnJlZShtc2MpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUobWMpOworICAgICAgICAgICAgICAgIHN0LT5wcml2X2RhdGEgPSBwcml2X2RhdGE7CisgICAgICAgICAgICAgICAgcy0+bmJfc3RyZWFtcyA9IG5iX3N0cmVhbXM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2aW9fc2tpcCgmcGIsIHRsdl9sZW4pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogMzItYml0IGFsaWdubWVudCAqLworICAgICAgICBhdmlvX3NraXAoJnBiLCAoKGF2aW9fdGVsbCgmcGIpICsgMykgJiB+MykgLSBhdmlvX3RlbGwoJnBiKSk7CisgICAgfSBlbHNlCisgICAgICAgIGF2aW9fc2VlaygmcGIsIDQsIFNFRUtfU0VUKTsKKworICAgIGlmIChoYXNfcGFja2V0X2luZm8pIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJSVFAtWC1RVCB3aXRoIHBhY2tldC1zcGVjaWZpYyBpbmZvIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBhbGVuID0gbGVuIC0gYXZpb190ZWxsKCZwYik7CisgICAgaWYgKGFsZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzd2l0Y2ggKHBhY2tpbmdfc2NoZW1lKSB7CisgICAgY2FzZSAzOiAvKiBvbmUgZGF0YSBwYWNrZXQgc3ByZWFkIG92ZXIgMSBvciBtdWx0aXBsZSBSVFAgcGFja2V0cyAqLworICAgICAgICBpZiAocXQtPnBrdC5zaXplID4gMCAmJiBxdC0+dGltZXN0YW1wID09ICp0aW1lc3RhbXApIHsKKyAgICAgICAgICAgIGludCBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZxdC0+cGt0LmRhdGEsIHF0LT5wa3Quc2l6ZSArIGFsZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcXQtPnBrdC5zaXplID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfZnJlZXAoJnF0LT5wa3QuZGF0YSk7CisgICAgICAgICAgICBhdl9pbml0X3BhY2tldCgmcXQtPnBrdCk7CisgICAgICAgICAgICBxdC0+cGt0LmRhdGEgPSBhdl9yZWFsbG9jKE5VTEwsIGFsZW4gKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmICghcXQtPnBrdC5kYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBxdC0+cGt0LnNpemUgPSAwOworICAgICAgICAgICAgcXQtPnRpbWVzdGFtcCA9ICp0aW1lc3RhbXA7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHF0LT5wa3QuZGF0YSArIHF0LT5wa3Quc2l6ZSwgYnVmICsgYXZpb190ZWxsKCZwYiksIGFsZW4pOworICAgICAgICBxdC0+cGt0LnNpemUgKz0gYWxlbjsKKyAgICAgICAgaWYgKGhhc19tYXJrZXJfYml0KSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gYXZfcGFja2V0X2Zyb21fZGF0YShwa3QsIHF0LT5wa3QuZGF0YSwgcXQtPnBrdC5zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIHF0LT5wa3Quc2l6ZSA9IDA7CisgICAgICAgICAgICBxdC0+cGt0LmRhdGEgPSBOVUxMOworICAgICAgICAgICAgcGt0LT5mbGFncyAgICAgICAgPSBmbGFncyAmIFJUUF9GTEFHX0tFWSA/IEFWX1BLVF9GTEFHX0tFWSA6IDA7CisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgICAgIG1lbXNldChwa3QtPmRhdGEgKyBwa3QtPnNpemUsIDAsIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKworICAgIGNhc2UgMTogLyogY29uc3RhbnQgcGFja2V0IHNpemUsIG11bHRpcGxlIHBhY2tldHMgcGVyIFJUUCBwYWNrZXQgKi8KKyAgICAgICAgaWYgKHF0LT5ieXRlc19wZXJfZnJhbWUgPT0gMCB8fAorICAgICAgICAgICAgYWxlbiAlIHF0LT5ieXRlc19wZXJfZnJhbWUgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAvKiB3cm9uZ2x5IHBhZGRlZCAqLworICAgICAgICBxdC0+cmVtYWluaW5nID0gKGFsZW4gLyBxdC0+Ynl0ZXNfcGVyX2ZyYW1lKSAtIDE7CisgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgcXQtPmJ5dGVzX3Blcl9mcmFtZSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBidWYgKyBhdmlvX3RlbGwoJnBiKSwgcXQtPmJ5dGVzX3Blcl9mcmFtZSk7CisgICAgICAgIHBrdC0+ZmxhZ3MgPSBmbGFncyAmIFJUUF9GTEFHX0tFWSA/IEFWX1BLVF9GTEFHX0tFWSA6IDA7CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgICAgICBpZiAocXQtPnJlbWFpbmluZyA+IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZxdC0+cGt0LmRhdGEpOworICAgICAgICAgICAgcXQtPnBrdC5kYXRhID0gYXZfcmVhbGxvYyhOVUxMLCBxdC0+cmVtYWluaW5nICogcXQtPmJ5dGVzX3Blcl9mcmFtZSk7CisgICAgICAgICAgICBpZiAoIXF0LT5wa3QuZGF0YSkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF0LT5wa3Quc2l6ZSA9IHF0LT5yZW1haW5pbmcgKiBxdC0+Ynl0ZXNfcGVyX2ZyYW1lOworICAgICAgICAgICAgbWVtY3B5KHF0LT5wa3QuZGF0YSwKKyAgICAgICAgICAgICAgICAgICBidWYgKyBhdmlvX3RlbGwoJnBiKSArIHF0LT5ieXRlc19wZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgcXQtPnJlbWFpbmluZyAqIHF0LT5ieXRlc19wZXJfZnJhbWUpOworICAgICAgICAgICAgcXQtPnBrdC5mbGFncyA9IHBrdC0+ZmxhZ3M7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKworICAgIGRlZmF1bHQ6ICAvKiB1bmltcGxlbWVudGVkICovCisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShOVUxMLCAiUlRQLVgtUVQgd2l0aCBwYWNraW5nIHNjaGVtZSAyIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9Cit9CisKK3N0YXRpYyBQYXlsb2FkQ29udGV4dCAqcXRfcnRwX25ldyh2b2lkKQoreworICAgIHJldHVybiBhdl9tYWxsb2N6KHNpemVvZihQYXlsb2FkQ29udGV4dCkpOworfQorCitzdGF0aWMgdm9pZCBxdF9ydHBfZnJlZShQYXlsb2FkQ29udGV4dCAqcXQpCit7CisgICAgYXZfZnJlZXAoJnF0LT5wa3QuZGF0YSk7CisgICAgYXZfZnJlZShxdCk7Cit9CisKKyNkZWZpbmUgUlRQX1FUX0hBTkRMRVIobSwgbiwgcywgdCkgXAorUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl8gIyMgbSAjIyBfcnRwXyAjIyBuICMjIF9oYW5kbGVyID0geyBcCisgICAgLmVuY19uYW1lICAgICAgICAgPSBzLCBcCisgICAgLmNvZGVjX3R5cGUgICAgICAgPSB0LCBcCisgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLCBcCisgICAgLmFsbG9jICAgICAgICAgICAgPSBxdF9ydHBfbmV3LCAgICBcCisgICAgLmZyZWUgICAgICAgICAgICAgPSBxdF9ydHBfZnJlZSwgICBcCisgICAgLnBhcnNlX3BhY2tldCAgICAgPSBxdF9ydHBfcGFyc2VfcGFja2V0LCBcCit9CisKK1JUUF9RVF9IQU5ETEVSKHF0LCAgICAgICAgdmlkLCAiWC1RVCIsICAgICAgICBBVk1FRElBX1RZUEVfVklERU8pOworUlRQX1FUX0hBTkRMRVIocXQsICAgICAgICBhdWQsICJYLVFUIiwgICAgICAgIEFWTUVESUFfVFlQRV9BVURJTyk7CitSVFBfUVRfSEFORExFUihxdWlja3RpbWUsIHZpZCwgIlgtUVVJQ0tUSU1FIiwgQVZNRURJQV9UWVBFX1ZJREVPKTsKK1JUUF9RVF9IQU5ETEVSKHF1aWNrdGltZSwgYXVkLCAiWC1RVUlDS1RJTUUiLCBBVk1FRElBX1RZUEVfQVVESU8pOwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19zdnEzLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX3N2cTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGU4YjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY19zdnEzLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBTb3JlbnNvbi0zIChTVlEzL1NWM1YpIHBheWxvYWQgZm9yIFJUUAorICogQ29weXJpZ2h0IChjKSAyMDEwIFJvbmFsZCBTLiBCdWx0amUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIFJUUCBzdXBwb3J0IGZvciB0aGUgU1YzViAoU1ZRMykgcGF5bG9hZAorICogQGF1dGhvciBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiBAc2VlIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPVNvcmVuc29uX1ZpZGVvXzMjUGFja2V0aXphdGlvbgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJydHAuaCIKKyNpbmNsdWRlICJydHBkZWMuaCIKKyNpbmNsdWRlICJydHBkZWNfZm9ybWF0cy5oIgorCitzdHJ1Y3QgUGF5bG9hZENvbnRleHQgeworICAgIEFWSU9Db250ZXh0ICpwa3RidWY7CisgICAgaW50NjRfdCAgICAgICAgdGltZXN0YW1wOworfTsKKworLyoqIHJldHVybiAwIG9uIHBhY2tldCwgPDAgb24gcGFydGlhbCBwYWNrZXQgb3IgZXJyb3IuLi4gKi8KK3N0YXRpYyBpbnQgc3ZxM19wYXJzZV9wYWNrZXQgKEFWRm9ybWF0Q29udGV4dCAqcywgUGF5bG9hZENvbnRleHQgKnN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgdWludDE2X3Qgc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIGludCBjb25maWdfcGFja2V0LCBzdGFydF9wYWNrZXQsIGVuZF9wYWNrZXQ7CisKKyAgICBpZiAobGVuIDwgMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBjb25maWdfcGFja2V0ID0gYnVmWzBdICYgMHg0MDsKKyAgICBzdGFydF9wYWNrZXQgID0gYnVmWzBdICYgMHgyMDsKKyAgICBlbmRfcGFja2V0ICAgID0gYnVmWzBdICYgMHgxMDsKKyAgICBidWYgKz0gMjsgICAgIC8vIGlnbm9yZSBidWZbMV0KKyAgICBsZW4gLT0gMjsKKworICAgIGlmIChjb25maWdfcGFja2V0KSB7CisKKyAgICAgICAgYXZfZnJlZXAoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKKyAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDA7CisKKyAgICAgICAgaWYgKGxlbiA8IDIgfHwgZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgbGVuICsgOCkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsICJTRVFIIiwgNCk7CisgICAgICAgIEFWX1dCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA0LCBsZW4pOworICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA4LCBidWYsIGxlbik7CisKKyAgICAgICAgLyogV2Ugc2V0IGNvZGVjX2lkIHRvIEFWX0NPREVDX0lEX05PTkUgaW5pdGlhbGx5IHRvCisgICAgICAgICAqIGRlbGF5IGRlY29kZXIgaW5pdGlhbGl6YXRpb24gc2luY2UgZXh0cmFkYXRhIGlzCisgICAgICAgICAqIGNhcnJpZWQgd2l0aGluIHRoZSBSVFAgc3RyZWFtLCBub3QgU0RQLiBIZXJlLAorICAgICAgICAgKiBieSBzZXR0aW5nIGNvZGVjX2lkIHRvIEFWX0NPREVDX0lEX1NWUTMsIHdlIGFyZSBzaWduYWxsaW5nCisgICAgICAgICAqIHRvIHRoZSBkZWNvZGVyIHRoYXQgaXQgaXMgT0sgdG8gaW5pdGlhbGl6ZS4gKi8KKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1NWUTM7CisKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKKyAgICBpZiAoc3RhcnRfcGFja2V0KSB7CisgICAgICAgIGludCByZXM7CisKKyAgICAgICAgaWYgKHN2LT5wa3RidWYpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnRtcDsKKyAgICAgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1Zihzdi0+cGt0YnVmLCAmdG1wKTsKKyAgICAgICAgICAgIGF2X2ZyZWUodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJlcyA9IGF2aW9fb3Blbl9keW5fYnVmKCZzdi0+cGt0YnVmKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgc3YtPnRpbWVzdGFtcCAgID0gKnRpbWVzdGFtcDsKKyAgICB9CisKKyAgICBpZiAoIXN2LT5wa3RidWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYXZpb193cml0ZShzdi0+cGt0YnVmLCBidWYsIGxlbik7CisKKyAgICBpZiAoZW5kX3BhY2tldCkgeworICAgICAgICBpbnQgcmV0ID0gZmZfcnRwX2ZpbmFsaXplX3BhY2tldChwa3QsICZzdi0+cGt0YnVmLCBzdC0+aW5kZXgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgKnRpbWVzdGFtcCAgICAgICAgPSBzdi0+dGltZXN0YW1wOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworfQorCitzdGF0aWMgUGF5bG9hZENvbnRleHQgKnN2cTNfZXh0cmFkYXRhX25ldyh2b2lkKQoreworICAgIHJldHVybiBhdl9tYWxsb2N6KHNpemVvZihQYXlsb2FkQ29udGV4dCkpOworfQorCitzdGF0aWMgdm9pZCBzdnEzX2V4dHJhZGF0YV9mcmVlKFBheWxvYWRDb250ZXh0ICpzdikKK3sKKyAgICBpZiAoc3YtPnBrdGJ1ZikgeworICAgICAgICB1aW50OF90ICpidWY7CisgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1Zihzdi0+cGt0YnVmLCAmYnVmKTsKKyAgICAgICAgYXZfZnJlZShidWYpOworICAgIH0KKyAgICBhdl9mcmVlKHN2KTsKK30KKworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9zdnEzX2R5bmFtaWNfaGFuZGxlciA9IHsKKyAgICAuZW5jX25hbWUgICAgICAgICA9ICJYLVNWM1YtRVMiLAorICAgIC5jb2RlY190eXBlICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5jb2RlY19pZCAgICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwgICAgICAvLyBzZWUgaWYgKGNvbmZpZ19wYWNrZXQpIGFib3ZlCisgICAgLmFsbG9jICAgICAgICAgICAgPSBzdnEzX2V4dHJhZGF0YV9uZXcsCisgICAgLmZyZWUgICAgICAgICAgICAgPSBzdnEzX2V4dHJhZGF0YV9mcmVlLAorICAgIC5wYXJzZV9wYWNrZXQgICAgID0gc3ZxM19wYXJzZV9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY192cDguYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfdnA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiNGYyMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBkZWNfdnA4LmMKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBSVFAgVlA4IERlcGFja2V0aXplcgorICogQ29weXJpZ2h0IChjKSAyMDEwIEpvc2ggQWxsbWFubgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEBicmllZiBSVFAgc3VwcG9ydCBmb3IgdGhlIFZQOCBwYXlsb2FkCisgKiBAYXV0aG9yIEpvc2ggQWxsbWFubiA8am9zaHVhLmFsbG1hbm5AZ21haWwuY29tPgorICogQHNlZSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLXBheWxvYWQtdnA4LTA1CisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorCisjaW5jbHVkZSAicnRwZGVjX2Zvcm1hdHMuaCIKKworc3RydWN0IFBheWxvYWRDb250ZXh0IHsKKyAgICBBVklPQ29udGV4dCAqZGF0YTsKKyAgICB1aW50MzJfdCAgICAgdGltZXN0YW1wOworICAgIGludCAgICAgICAgICBpc19rZXlmcmFtZTsKKyAgICAvKiBJZiBzZXF1ZW5jZV9vayBpcyBzZXQsIHdlIGtlZXAgcmV0dXJuaW5nIGRhdGEgKGV2ZW4gaWYgd2UgbWlnaHQgaGF2ZQorICAgICAqIGxvc3Qgc29tZSBkYXRhLCBidXQgd2UgaGF2ZW4ndCBsb3N0IGFueSB0b28gY3JpdGljYWwgZGF0YSB0aGF0IHdvdWxkCisgICAgICogY2F1c2UgdGhlIGRlY29kZXIgdG8gZGVzeW5jaHJvbml6ZSBhbmQgb3V0cHV0IHJhbmRvbSBnYXJiYWdlKS4KKyAgICAgKi8KKyAgICBpbnQgICAgICAgICAgc2VxdWVuY2Vfb2s7CisgICAgaW50ICAgICAgICAgIGZpcnN0X3BhcnRfc2l6ZTsKKyAgICB1aW50MTZfdCAgICAgcHJldl9zZXE7CisgICAgaW50ICAgICAgICAgIHByZXZfcGljdHVyZWlkOworICAgIGludCAgICAgICAgICBicm9rZW5fZnJhbWU7CisgICAgLyogSWYgc2VxdWVuY2VfZGlydHkgaXMgc2V0LCB3ZSBoYXZlIGxvc3Qgc29tZSBkYXRhIChjcml0aWNhbCBvcgorICAgICAqIG5vbi1jcml0aWNhbCkgYW5kIGRlY29kaW5nIHdpbGwgaGF2ZSBzb21lIHNvcnQgb2YgYXJ0ZWZhY3RzLCBhbmQKKyAgICAgKiB3ZSB0aHVzIHNob3VsZCByZXF1ZXN0IGEgbmV3IGtleWZyYW1lLgorICAgICAqLworICAgIGludCAgICAgICAgICBzZXF1ZW5jZV9kaXJ0eTsKKyAgICBpbnQgICAgICAgICAgZ290X2tleWZyYW1lOworfTsKKworc3RhdGljIHZvaWQgdnA4X2ZyZWVfYnVmZmVyKFBheWxvYWRDb250ZXh0ICp2cDgpCit7CisgICAgdWludDhfdCAqdG1wOworICAgIGlmICghdnA4LT5kYXRhKQorICAgICAgICByZXR1cm47CisgICAgYXZpb19jbG9zZV9keW5fYnVmKHZwOC0+ZGF0YSwgJnRtcCk7CisgICAgYXZfZnJlZSh0bXApOworICAgIHZwOC0+ZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdnA4X2Jyb2tlbl9zZXF1ZW5jZShBVkZvcm1hdENvbnRleHQgKmN0eCwgUGF5bG9hZENvbnRleHQgKnZwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptc2cpCit7CisgICAgdnA4LT5zZXF1ZW5jZV9vayA9IDA7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICIlcyIsIG1zZyk7CisgICAgdnA4X2ZyZWVfYnVmZmVyKHZwOCk7CisgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKK30KKworc3RhdGljIGludCB2cDhfaGFuZGxlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmN0eCwgUGF5bG9hZENvbnRleHQgKnZwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0LCB1aW50MzJfdCAqdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4sIHVpbnQxNl90IHNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIGludCBzdGFydF9wYXJ0aXRpb24sIGVuZF9wYWNrZXQ7CisgICAgaW50IGV4dGVuZGVkX2JpdHMsIHBhcnRfaWQ7CisgICAgaW50IHBpY3R1cmVpZF9wcmVzZW50ID0gMCwgdGwwcGljaWR4X3ByZXNlbnQgPSAwLCB0aWRfcHJlc2VudCA9IDAsCisgICAgICAgIGtleWlkeF9wcmVzZW50ID0gMDsKKyAgICBpbnQgcGljdHVyZWlkID0gLTEsIHBpY3R1cmVpZF9tYXNrID0gMDsKKyAgICBpbnQgcmV0dXJuZWRfb2xkX2ZyYW1lID0gMDsKKyAgICB1aW50MzJfdCBvbGRfdGltZXN0YW1wID0gMDsKKworICAgIGlmICghYnVmKSB7CisgICAgICAgIGlmICh2cDgtPmRhdGEpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBmZl9ydHBfZmluYWxpemVfcGFja2V0KHBrdCwgJnZwOC0+ZGF0YSwgc3QtPmluZGV4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAqdGltZXN0YW1wID0gdnA4LT50aW1lc3RhbXA7CisgICAgICAgICAgICBpZiAodnA4LT5zZXF1ZW5jZV9kaXJ0eSkKKyAgICAgICAgICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0NPUlJVUFQ7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgIH0KKworICAgIGlmIChsZW4gPCAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGV4dGVuZGVkX2JpdHMgICA9IGJ1ZlswXSAmIDB4ODA7CisgICAgc3RhcnRfcGFydGl0aW9uID0gYnVmWzBdICYgMHgxMDsKKyAgICBwYXJ0X2lkICAgICAgICAgPSBidWZbMF0gJiAweDBmOworICAgIGVuZF9wYWNrZXQgICAgICA9IGZsYWdzICYgUlRQX0ZMQUdfTUFSS0VSOworICAgIGJ1ZisrOworICAgIGxlbi0tOworICAgIGlmIChleHRlbmRlZF9iaXRzKSB7CisgICAgICAgIGlmIChsZW4gPCAxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHBpY3R1cmVpZF9wcmVzZW50ID0gYnVmWzBdICYgMHg4MDsKKyAgICAgICAgdGwwcGljaWR4X3ByZXNlbnQgPSBidWZbMF0gJiAweDQwOworICAgICAgICB0aWRfcHJlc2VudCAgICAgICA9IGJ1ZlswXSAmIDB4MjA7CisgICAgICAgIGtleWlkeF9wcmVzZW50ICAgID0gYnVmWzBdICYgMHgxMDsKKyAgICAgICAgYnVmKys7CisgICAgICAgIGxlbi0tOworICAgIH0KKyAgICBpZiAocGljdHVyZWlkX3ByZXNlbnQpIHsKKyAgICAgICAgaWYgKGxlbiA8IDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKGJ1ZlswXSAmIDB4ODApIHsKKyAgICAgICAgICAgIGlmIChsZW4gPCAyKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgcGljdHVyZWlkID0gQVZfUkIxNihidWYpICYgMHg3ZmZmOworICAgICAgICAgICAgcGljdHVyZWlkX21hc2sgPSAweDdmZmY7CisgICAgICAgICAgICBidWYgKz0gMjsKKyAgICAgICAgICAgIGxlbiAtPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGljdHVyZWlkID0gYnVmWzBdICYgMHg3ZjsKKyAgICAgICAgICAgIHBpY3R1cmVpZF9tYXNrID0gMHg3ZjsKKyAgICAgICAgICAgIGJ1ZisrOworICAgICAgICAgICAgbGVuLS07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRsMHBpY2lkeF9wcmVzZW50KSB7CisgICAgICAgIC8vIElnbm9yaW5nIHRlbXBvcmFsIGxldmVsIHplcm8gaW5kZXgKKyAgICAgICAgYnVmKys7CisgICAgICAgIGxlbi0tOworICAgIH0KKyAgICBpZiAodGlkX3ByZXNlbnQgfHwga2V5aWR4X3ByZXNlbnQpIHsKKyAgICAgICAgLy8gSWdub3JpbmcgdGVtcG9yYWwgbGF5ZXIgaW5kZXgsIGxheWVyIHN5bmMgYml0IGFuZCBrZXlmcmFtZSBpbmRleAorICAgICAgICBidWYrKzsKKyAgICAgICAgbGVuLS07CisgICAgfQorICAgIGlmIChsZW4gPCAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChzdGFydF9wYXJ0aXRpb24gJiYgcGFydF9pZCA9PSAwICYmIGxlbiA+PSAzKSB7CisgICAgICAgIGludCByZXM7CisgICAgICAgIGludCBub25fa2V5ID0gYnVmWzBdICYgMHgwMTsKKyAgICAgICAgaWYgKCFub25fa2V5KSB7CisgICAgICAgICAgICB2cDhfZnJlZV9idWZmZXIodnA4KTsKKyAgICAgICAgICAgIC8vIEtleWZyYW1lLCBkZWNvZGluZyBvayBhZ2FpbgorICAgICAgICAgICAgdnA4LT5zZXF1ZW5jZV9vayA9IDE7CisgICAgICAgICAgICB2cDgtPnNlcXVlbmNlX2RpcnR5ID0gMDsKKyAgICAgICAgICAgIHZwOC0+Z290X2tleWZyYW1lID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBjYW5fY29udGludWUgPSB2cDgtPmRhdGEgJiYgIXZwOC0+aXNfa2V5ZnJhbWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3RlbGwodnA4LT5kYXRhKSA+PSB2cDgtPmZpcnN0X3BhcnRfc2l6ZTsKKyAgICAgICAgICAgIGlmICghdnA4LT5zZXF1ZW5jZV9vaykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgICAgICAgICAgaWYgKCF2cDgtPmdvdF9rZXlmcmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdnA4X2Jyb2tlbl9zZXF1ZW5jZShjdHgsIHZwOCwgIktleWZyYW1lIG1pc3NpbmdcbiIpOworICAgICAgICAgICAgaWYgKHBpY3R1cmVpZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBpY3R1cmVpZCAhPSAoKHZwOC0+cHJldl9waWN0dXJlaWQgKyAxKSAmIHBpY3R1cmVpZF9tYXNrKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnA4X2Jyb2tlbl9zZXF1ZW5jZShjdHgsIHZwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NlZCBhIHBpY3R1cmUsIHNlcXVlbmNlIGJyb2tlblxuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwOC0+ZGF0YSAmJiAhY2FuX2NvbnRpbnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZwOF9icm9rZW5fc2VxdWVuY2UoY3R4LCB2cDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2VkIGEgcGljdHVyZSwgc2VxdWVuY2UgYnJva2VuXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGV4cGVjdGVkX3NlcSA9IHZwOC0+cHJldl9zZXEgKyAxOworICAgICAgICAgICAgICAgIGludDE2X3QgZGlmZiA9IHNlcSAtIGV4cGVjdGVkX3NlcTsKKyAgICAgICAgICAgICAgICBpZiAodnA4LT5kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIHBpY3R1cmUgaWQsIHNvIHdlIGNhbid0IGtub3cgaWYgbWlzc2VkIHBhY2tldHMKKyAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbmVkIGFueSBuZXcgZnJhbWVzLiBJZiBkaWZmID09IDAsIHdlIGRpZCBnZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZXIgcGFja2V0cyBmcm9tIHRoZSBzYW1lIGZyYW1lIChtYXRjaGluZyB0aW1lc3RhbXApLAorICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBrbm93IHdlIGRpZG4ndCBtaXNzIGFueSBmcmFtZS4gSWYgZGlmZiA9PSAxIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzdGlsbCBoYXZlIGRhdGEgKG5vdCBmbHVzaGVkIGJ5IHRoZSBlbmQgb2YgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFya2VyKSwgdGhlIHNpbmdsZSBtaXNzZWQgcGFja2V0IG11c3QgaGF2ZSBiZWVuIHBhcnQKKyAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHNhbWUgZnJhbWUuCisgICAgICAgICAgICAgICAgICAgIGlmICgoZGlmZiA9PSAwIHx8IGRpZmYgPT0gMSkgJiYgY2FuX2NvbnRpbnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZWVkIHdpdGggd2hhdCB3ZSBoYXZlCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnA4X2Jyb2tlbl9zZXF1ZW5jZShjdHgsIHZwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzZWQgdG9vIG11Y2gsIHNlcXVlbmNlIGJyb2tlblxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZwOF9icm9rZW5fc2VxdWVuY2UoY3R4LCB2cDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2VkIHVua25vd24gZGF0YSwgc2VxdWVuY2UgYnJva2VuXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodnA4LT5kYXRhKSB7CisgICAgICAgICAgICAgICAgdnA4LT5zZXF1ZW5jZV9kaXJ0eSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGF2aW9fdGVsbCh2cDgtPmRhdGEpID49IHZwOC0+Zmlyc3RfcGFydF9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSBmZl9ydHBfZmluYWxpemVfcGFja2V0KHBrdCwgJnZwOC0+ZGF0YSwgc3QtPmluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0NPUlJVUFQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybmVkX29sZF9mcmFtZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIG9sZF90aW1lc3RhbXAgPSB2cDgtPnRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGRuJ3QgaGFwcGVuCisgICAgICAgICAgICAgICAgICAgIHZwOF9mcmVlX2J1ZmZlcih2cDgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2cDgtPmZpcnN0X3BhcnRfc2l6ZSA9IChBVl9STDE2KCZidWZbMV0pIDw8IDMgfCBidWZbMF0gPj4gNSkgKyAzOworICAgICAgICBpZiAoKHJlcyA9IGF2aW9fb3Blbl9keW5fYnVmKCZ2cDgtPmRhdGEpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB2cDgtPnRpbWVzdGFtcCA9ICp0aW1lc3RhbXA7CisgICAgICAgIHZwOC0+YnJva2VuX2ZyYW1lID0gMDsKKyAgICAgICAgdnA4LT5wcmV2X3BpY3R1cmVpZCA9IHBpY3R1cmVpZDsKKyAgICAgICAgdnA4LT5pc19rZXlmcmFtZSA9ICFub25fa2V5OworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQxNl90IGV4cGVjdGVkX3NlcSA9IHZwOC0+cHJldl9zZXEgKyAxOworCisgICAgICAgIGlmICghdnA4LT5zZXF1ZW5jZV9vaykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisKKyAgICAgICAgaWYgKHZwOC0+dGltZXN0YW1wICE9ICp0aW1lc3RhbXApIHsKKyAgICAgICAgICAgIC8vIE1pc3NlZCB0aGUgc3RhcnQgb2YgdGhlIG5ldyBmcmFtZSwgc2VxdWVuY2UgYnJva2VuCisgICAgICAgICAgICByZXR1cm4gdnA4X2Jyb2tlbl9zZXF1ZW5jZShjdHgsIHZwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBubyBzdGFydCBtYXJrZXI7IGRyb3BwaW5nIGZyYW1lXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXEgIT0gZXhwZWN0ZWRfc2VxKSB7CisgICAgICAgICAgICBpZiAodnA4LT5pc19rZXlmcmFtZSkgeworICAgICAgICAgICAgICAgIHJldHVybiB2cDhfYnJva2VuX3NlcXVlbmNlKGN0eCwgdnA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzZWQgcGFydCBvZiBhIGtleWZyYW1lLCBzZXF1ZW5jZSBicm9rZW5cbiIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2cDgtPmRhdGEgJiYgYXZpb190ZWxsKHZwOC0+ZGF0YSkgPj0gdnA4LT5maXJzdF9wYXJ0X3NpemUpIHsKKyAgICAgICAgICAgICAgICB2cDgtPmJyb2tlbl9mcmFtZSA9IDE7CisgICAgICAgICAgICAgICAgdnA4LT5zZXF1ZW5jZV9kaXJ0eSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB2cDhfYnJva2VuX3NlcXVlbmNlKGN0eCwgdnA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzZWQgcGFydCBvZiB0aGUgZmlyc3QgcGFydGl0aW9uLCBzZXF1ZW5jZSBicm9rZW5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF2cDgtPmRhdGEpCisgICAgICAgIHJldHVybiB2cDhfYnJva2VuX3NlcXVlbmNlKGN0eCwgdnA4LCAiUmVjZWl2ZWQgbm8gc3RhcnQgbWFya2VyXG4iKTsKKworICAgIHZwOC0+cHJldl9zZXEgPSBzZXE7CisgICAgaWYgKCF2cDgtPmJyb2tlbl9mcmFtZSkKKyAgICAgICAgYXZpb193cml0ZSh2cDgtPmRhdGEsIGJ1ZiwgbGVuKTsKKworICAgIGlmIChyZXR1cm5lZF9vbGRfZnJhbWUpIHsKKyAgICAgICAgKnRpbWVzdGFtcCA9IG9sZF90aW1lc3RhbXA7CisgICAgICAgIHJldHVybiBlbmRfcGFja2V0ID8gMSA6IDA7CisgICAgfQorCisgICAgaWYgKGVuZF9wYWNrZXQpIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgcmV0ID0gZmZfcnRwX2ZpbmFsaXplX3BhY2tldChwa3QsICZ2cDgtPmRhdGEsIHN0LT5pbmRleCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHZwOC0+c2VxdWVuY2VfZGlydHkpCisgICAgICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0NPUlJVUFQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7Cit9CisKK3N0YXRpYyBQYXlsb2FkQ29udGV4dCAqdnA4X25ld19jb250ZXh0KHZvaWQpCit7CisgICAgUGF5bG9hZENvbnRleHQgKnZwOCA9IGF2X21hbGxvY3ooc2l6ZW9mKFBheWxvYWRDb250ZXh0KSk7CisgICAgaWYgKCF2cDgpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHZwOC0+c2VxdWVuY2Vfb2sgPSAxOworICAgIHJldHVybiB2cDg7Cit9CisKK3N0YXRpYyB2b2lkIHZwOF9mcmVlX2NvbnRleHQoUGF5bG9hZENvbnRleHQgKnZwOCkKK3sKKyAgICB2cDhfZnJlZV9idWZmZXIodnA4KTsKKyAgICBhdl9mcmVlKHZwOCk7Cit9CisKK3N0YXRpYyBpbnQgdnA4X25lZWRfa2V5ZnJhbWUoUGF5bG9hZENvbnRleHQgKnZwOCkKK3sKKyAgICByZXR1cm4gdnA4LT5zZXF1ZW5jZV9kaXJ0eSB8fCAhdnA4LT5zZXF1ZW5jZV9vazsKK30KKworUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl92cDhfZHluYW1pY19oYW5kbGVyID0geworICAgIC5lbmNfbmFtZSAgICAgICA9ICJWUDgiLAorICAgIC5jb2RlY190eXBlICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuY29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9WUDgsCisgICAgLmFsbG9jICAgICAgICAgID0gdnA4X25ld19jb250ZXh0LAorICAgIC5mcmVlICAgICAgICAgICA9IHZwOF9mcmVlX2NvbnRleHQsCisgICAgLnBhcnNlX3BhY2tldCAgID0gdnA4X2hhbmRsZV9wYWNrZXQsCisgICAgLm5lZWRfa2V5ZnJhbWUgID0gdnA4X25lZWRfa2V5ZnJhbWUsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY194aXBoLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZGVjX3hpcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzM0ZjllCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGRlY194aXBoLmMKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiBYaXBoIFJUUCBQcm90b2NvbHMKKyAqIENvcHlyaWdodCAoYykgMjAwOSBDb2xpbiBNY1F1aWxsaWFuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSm9zaCBBbGxtYW5uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEBicmllZiBYaXBoIC8gUlRQIENvZGUKKyAqIEBhdXRob3IgQ29saW4gTWNRdWlsbGFuIDxtLm5pbG9jQGdtYWlsLmNvbT4KKyAqIEBhdXRob3IgSm9zaCBBbGxtYW5uIDxqb3NodWEuYWxsbWFubkBnbWFpbC5jb20+CisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jhc2U2NC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJydHBkZWMuaCIKKyNpbmNsdWRlICJydHBkZWNfZm9ybWF0cy5oIgorCisvKioKKyAqIFJUUC9YaXBoIHNwZWNpZmljIHByaXZhdGUgZGF0YS4KKyAqLworc3RydWN0IFBheWxvYWRDb250ZXh0IHsKKyAgICB1bnNpZ25lZCBpZGVudDsgICAgICAgICAgICAgLy8vPCAyNC1iaXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaWRlbnRpZmllcgorICAgIHVpbnQzMl90IHRpbWVzdGFtcDsKKyAgICBBVklPQ29udGV4dCogZnJhZ21lbnQ7ICAgIC8vLzwgYnVmZmVyIGZvciBzcGxpdCBwYXlsb2FkcworICAgIHVpbnQ4X3QgKnNwbGl0X2J1ZjsKKyAgICBpbnQgc3BsaXRfcG9zLCBzcGxpdF9idWZfbGVuLCBzcGxpdF9idWZfc2l6ZTsKKyAgICBpbnQgc3BsaXRfcGt0czsKK307CisKK3N0YXRpYyBQYXlsb2FkQ29udGV4dCAqeGlwaF9uZXdfY29udGV4dCh2b2lkKQoreworICAgIHJldHVybiBhdl9tYWxsb2N6KHNpemVvZihQYXlsb2FkQ29udGV4dCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9mcmFnbWVudF9pZl9uZWVkZWQoUGF5bG9hZENvbnRleHQgKiBkYXRhKQoreworICAgIGlmIChkYXRhLT5mcmFnbWVudCkgeworICAgICAgICB1aW50OF90KiBwOworICAgICAgICBhdmlvX2Nsb3NlX2R5bl9idWYoZGF0YS0+ZnJhZ21lbnQsICZwKTsKKyAgICAgICAgYXZfZnJlZShwKTsKKyAgICAgICAgZGF0YS0+ZnJhZ21lbnQgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIHZvaWQgeGlwaF9mcmVlX2NvbnRleHQoUGF5bG9hZENvbnRleHQgKiBkYXRhKQoreworICAgIGZyZWVfZnJhZ21lbnRfaWZfbmVlZGVkKGRhdGEpOworICAgIGF2X2ZyZWUoZGF0YS0+c3BsaXRfYnVmKTsKKyAgICBhdl9mcmVlKGRhdGEpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgeGlwaF92b3JiaXNfaW5pdChBVkZvcm1hdENvbnRleHQgKmN0eCwgaW50IHN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZENvbnRleHQgKmRhdGEpCit7CisgICAgaWYgKHN0X2luZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY3R4LT5zdHJlYW1zW3N0X2luZGV4XS0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHhpcGhfaGFuZGxlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmN0eCwgUGF5bG9hZENvbnRleHQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QsIHVpbnQzMl90ICp0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4sIHVpbnQxNl90IHNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKworICAgIGludCBpZGVudCwgZnJhZ21lbnRlZCwgdGR0LCBudW1fcGt0cywgcGt0X2xlbjsKKworICAgIGlmICghYnVmKSB7CisgICAgICAgIGlmICghZGF0YS0+c3BsaXRfYnVmIHx8IGRhdGEtPnNwbGl0X3BvcyArIDIgPiBkYXRhLT5zcGxpdF9idWZfbGVuIHx8CisgICAgICAgICAgICBkYXRhLT5zcGxpdF9wa3RzIDw9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIG1vcmUgZGF0YSB0byByZXR1cm5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgcGt0X2xlbiA9IEFWX1JCMTYoZGF0YS0+c3BsaXRfYnVmICsgZGF0YS0+c3BsaXRfcG9zKTsKKyAgICAgICAgZGF0YS0+c3BsaXRfcG9zICs9IDI7CisgICAgICAgIGlmIChkYXRhLT5zcGxpdF9wb3MgKyBwa3RfbGVuID4gZGF0YS0+c3BsaXRfYnVmX2xlbikgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm90IGVub3VnaCBkYXRhIHRvIHJldHVyblxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIHBrdF9sZW4pKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPdXQgb2YgbWVtb3J5LlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBkYXRhLT5zcGxpdF9idWYgKyBkYXRhLT5zcGxpdF9wb3MsIHBrdF9sZW4pOworICAgICAgICBkYXRhLT5zcGxpdF9wb3MgKz0gcGt0X2xlbjsKKyAgICAgICAgZGF0YS0+c3BsaXRfcGt0cy0tOworICAgICAgICByZXR1cm4gZGF0YS0+c3BsaXRfcGt0cyA+IDA7CisgICAgfQorCisgICAgaWYgKGxlbiA8IDYpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCAlZCBieXRlIHBhY2tldFxuIiwgbGVuKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLy8gcmVhZCB4aXBoIHJ0cCBoZWFkZXJzCisgICAgaWRlbnQgICAgICAgPSBBVl9SQjI0KGJ1Zik7CisgICAgZnJhZ21lbnRlZCAgPSBidWZbM10gPj4gNjsKKyAgICB0ZHQgICAgICAgICA9IChidWZbM10gPj4gNCkgJiAzOworICAgIG51bV9wa3RzICAgID0gYnVmWzNdICYgMHhmOworICAgIHBrdF9sZW4gICAgID0gQVZfUkIxNihidWYgKyA0KTsKKworICAgIGlmIChwa3RfbGVuID4gbGVuIC0gNikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBwYWNrZXQgbGVuZ3RoICVkIGluICVkIGJ5dGUgcGFja2V0XG4iLCBwa3RfbGVuLAorICAgICAgICAgICAgICAgbGVuKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGlkZW50ICE9IGRhdGEtPmlkZW50KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbmltcGxlbWVudGVkIFhpcGggU0RQIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGRldGVjdGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGlmICh0ZHQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVuaW1wbGVtZW50ZWQgUlRQIFhpcGggcGFja2V0IHNldHRpbmdzICglZCwlZCwlZClcbiIsCisgICAgICAgICAgICAgICBmcmFnbWVudGVkLCB0ZHQsIG51bV9wa3RzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGJ1ZiArPSA2OyAvLyBtb3ZlIHBhc3QgaGVhZGVyIGJpdHMKKyAgICBsZW4gLT0gNjsKKworICAgIGlmIChmcmFnbWVudGVkID09IDApIHsKKyAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBwa3RfbGVuKSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3V0IG9mIG1lbW9yeS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgYnVmLCBwa3RfbGVuKTsKKyAgICAgICAgYnVmICs9IHBrdF9sZW47CisgICAgICAgIGxlbiAtPSBwa3RfbGVuOworICAgICAgICBudW1fcGt0cy0tOworCisgICAgICAgIGlmIChudW1fcGt0cyA+IDApIHsKKyAgICAgICAgICAgIGlmIChsZW4gPiBkYXRhLT5zcGxpdF9idWZfc2l6ZSB8fCAhZGF0YS0+c3BsaXRfYnVmKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmRhdGEtPnNwbGl0X2J1Zik7CisgICAgICAgICAgICAgICAgZGF0YS0+c3BsaXRfYnVmX3NpemUgPSAyICogbGVuOworICAgICAgICAgICAgICAgIGRhdGEtPnNwbGl0X2J1ZiA9IGF2X21hbGxvYyhkYXRhLT5zcGxpdF9idWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFkYXRhLT5zcGxpdF9idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3V0IG9mIG1lbW9yeS5cbiIpOworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShkYXRhLT5zcGxpdF9idWYsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIGRhdGEtPnNwbGl0X2J1Zl9sZW4gPSBsZW47CisgICAgICAgICAgICBkYXRhLT5zcGxpdF9wb3MgPSAwOworICAgICAgICAgICAgZGF0YS0+c3BsaXRfcGt0cyA9IG51bV9wa3RzOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKworICAgIH0gZWxzZSBpZiAoZnJhZ21lbnRlZCA9PSAxKSB7CisgICAgICAgIC8vIHN0YXJ0IG9mIHhpcGggZGF0YSBmcmFnbWVudAorICAgICAgICBpbnQgcmVzOworCisgICAgICAgIC8vIGVuZCBwYWNrZXQgaGFzIGJlZW4gbG9zdCBzb21ld2hlcmUsIHNvIGRyb3AgYnVmZmVyZWQgZGF0YQorICAgICAgICBmcmVlX2ZyYWdtZW50X2lmX25lZWRlZChkYXRhKTsKKworICAgICAgICBpZigocmVzID0gYXZpb19vcGVuX2R5bl9idWYoJmRhdGEtPmZyYWdtZW50KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKworICAgICAgICBhdmlvX3dyaXRlKGRhdGEtPmZyYWdtZW50LCBidWYsIHBrdF9sZW4pOworICAgICAgICBkYXRhLT50aW1lc3RhbXAgPSAqdGltZXN0YW1wOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfYXNzZXJ0MShmcmFnbWVudGVkIDwgNCk7CisgICAgICAgIGlmIChkYXRhLT50aW1lc3RhbXAgIT0gKnRpbWVzdGFtcCkgeworICAgICAgICAgICAgLy8gc2tpcCBpZiBmcmFnbWVudGVkIHRpbWVzdGFtcCBpcyBpbmNvcnJlY3Q7CisgICAgICAgICAgICAvLyBhIHN0YXJ0IHBhY2tldCBoYXMgYmVlbiBsb3N0IHNvbWV3aGVyZQorICAgICAgICAgICAgZnJlZV9mcmFnbWVudF9pZl9uZWVkZWQoZGF0YSk7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJSVFAgdGltZXN0YW1wcyBkb24ndCBtYXRjaCFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkYXRhLT5mcmFnbWVudCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVkIHBhY2tldCB3aXRob3V0IGEgc3RhcnQgZnJhZ21lbnQ7IGRyb3BwaW5nLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29weSBkYXRhIHRvIGZyYWdtZW50IGJ1ZmZlcgorICAgICAgICBhdmlvX3dyaXRlKGRhdGEtPmZyYWdtZW50LCBidWYsIHBrdF9sZW4pOworCisgICAgICAgIGlmIChmcmFnbWVudGVkID09IDMpIHsKKyAgICAgICAgICAgIC8vIGVuZCBvZiB4aXBoIGRhdGEgcGFja2V0CisgICAgICAgICAgICBpbnQgcmV0ID0gZmZfcnRwX2ZpbmFsaXplX3BhY2tldChwa3QsICZkYXRhLT5mcmFnbWVudCwgc3QtPmluZGV4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb2NjdXJyZWQgd2hlbiBnZXR0aW5nIGZyYWdtZW50IGJ1ZmZlci4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKK30KKworLyoqCisgKiBMZW5ndGggZW5jb2RpbmcgZGVzY3JpYmVkIGluIFJGQzUyMTUgc2VjdGlvbiAzLjEuMS4KKyAqLworc3RhdGljIGludCBnZXRfYmFzZTEyOChjb25zdCB1aW50OF90ICoqIGJ1ZiwgY29uc3QgdWludDhfdCAqIGJ1Zl9lbmQpCit7CisgICAgaW50IG4gPSAwOworICAgIGZvciAoOyAqYnVmIDwgYnVmX2VuZDsgKysqYnVmKSB7CisgICAgICAgIG4gPDw9IDc7CisgICAgICAgIG4gKz0gKipidWYgJiAweDdmOworICAgICAgICBpZiAoISgqKmJ1ZiAmIDB4ODApKSB7CisgICAgICAgICAgICArKypidWY7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBCYXNlZCBvZmYgcGFyc2VfcGFja2VkX2hlYWRlcnMgaW4gVm9yYmlzIFJUUAorICovCitzdGF0aWMgaW50CitwYXJzZV9wYWNrZWRfaGVhZGVycyhjb25zdCB1aW50OF90ICogcGFja2VkX2hlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICogcGFja2VkX2hlYWRlcnNfZW5kLAorICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKiBjb2RlYywgUGF5bG9hZENvbnRleHQgKiB4aXBoX2RhdGEpCit7CisKKyAgICB1bnNpZ25lZCBudW1fcGFja2VkLCBudW1faGVhZGVycywgbGVuZ3RoLCBsZW5ndGgxLCBsZW5ndGgyLCBleHRyYWRhdGFfYWxsb2M7CisgICAgdWludDhfdCAqcHRyOworCisgICAgaWYgKHBhY2tlZF9oZWFkZXJzX2VuZCAtIHBhY2tlZF9oZWFkZXJzIDwgOSkgeworICAgICAgICBhdl9sb2coY29kZWMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkICUiUFRSRElGRl9TUEVDSUZJRVIiIGJ5dGUgcGFja2VkIGhlYWRlci4iLAorICAgICAgICAgICAgICAgcGFja2VkX2hlYWRlcnNfZW5kIC0gcGFja2VkX2hlYWRlcnMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBudW1fcGFja2VkICAgICAgICAgPSBieXRlc3RyZWFtX2dldF9iZTMyKCZwYWNrZWRfaGVhZGVycyk7CisgICAgeGlwaF9kYXRhLT5pZGVudCAgID0gYnl0ZXN0cmVhbV9nZXRfYmUyNCgmcGFja2VkX2hlYWRlcnMpOworICAgIGxlbmd0aCAgICAgICAgICAgICA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJnBhY2tlZF9oZWFkZXJzKTsKKyAgICBudW1faGVhZGVycyAgICAgICAgPSBnZXRfYmFzZTEyOCgmcGFja2VkX2hlYWRlcnMsIHBhY2tlZF9oZWFkZXJzX2VuZCk7CisgICAgbGVuZ3RoMSAgICAgICAgICAgID0gZ2V0X2Jhc2UxMjgoJnBhY2tlZF9oZWFkZXJzLCBwYWNrZWRfaGVhZGVyc19lbmQpOworICAgIGxlbmd0aDIgICAgICAgICAgICA9IGdldF9iYXNlMTI4KCZwYWNrZWRfaGVhZGVycywgcGFja2VkX2hlYWRlcnNfZW5kKTsKKworICAgIGlmIChudW1fcGFja2VkICE9IDEgfHwgbnVtX2hlYWRlcnMgPiAzKSB7CisgICAgICAgIGF2X2xvZyhjb2RlYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVuaW1wbGVtZW50ZWQgbnVtYmVyIG9mIGhlYWRlcnM6ICVkIHBhY2tlZCBoZWFkZXJzLCAlZCBoZWFkZXJzXG4iLAorICAgICAgICAgICAgICAgbnVtX3BhY2tlZCwgbnVtX2hlYWRlcnMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKHBhY2tlZF9oZWFkZXJzX2VuZCAtIHBhY2tlZF9oZWFkZXJzICE9IGxlbmd0aCB8fAorICAgICAgICBsZW5ndGgxID4gbGVuZ3RoIHx8IGxlbmd0aDIgPiBsZW5ndGggLSBsZW5ndGgxKSB7CisgICAgICAgIGF2X2xvZyhjb2RlYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkJhZCBwYWNrZWQgaGVhZGVyIGxlbmd0aHMgKCVkLCVkLCUiUFRSRElGRl9TUEVDSUZJRVIiLCVkKVxuIiwgbGVuZ3RoMSwKKyAgICAgICAgICAgICAgIGxlbmd0aDIsIHBhY2tlZF9oZWFkZXJzX2VuZCAtIHBhY2tlZF9oZWFkZXJzLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBleHRyYSBzcGFjZToKKyAgICAgKiAtLSBsZW5ndGgvMjU1ICsyIGZvciB4aXBobGFjaW5nCisgICAgICogLS0gb25lIGZvciB0aGUgJzInIG1hcmtlcgorICAgICAqIC0tIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgcmVxdWlyZWQgKi8KKyAgICBleHRyYWRhdGFfYWxsb2MgPSBsZW5ndGggKyBsZW5ndGgvMjU1ICsgMyArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkU7CisKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKGNvZGVjLCBleHRyYWRhdGFfYWxsb2MpKSB7CisgICAgICAgIGF2X2xvZyhjb2RlYywgQVZfTE9HX0VSUk9SLCAiT3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHB0ciA9IGNvZGVjLT5leHRyYWRhdGE7CisgICAgKnB0cisrID0gMjsKKyAgICBwdHIgKz0gYXZfeGlwaGxhY2luZyhwdHIsIGxlbmd0aDEpOworICAgIHB0ciArPSBhdl94aXBobGFjaW5nKHB0ciwgbGVuZ3RoMik7CisgICAgbWVtY3B5KHB0ciwgcGFja2VkX2hlYWRlcnMsIGxlbmd0aCk7CisgICAgcHRyICs9IGxlbmd0aDsKKyAgICBjb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBwdHIgLSBjb2RlYy0+ZXh0cmFkYXRhOworICAgIC8vIGNsZWFyIG91dCByZW1haW5pbmcgcGFydHMgb2YgdGhlIGJ1ZmZlcgorICAgIG1lbXNldChwdHIsIDAsIGV4dHJhZGF0YV9hbGxvYyAtIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4aXBoX3BhcnNlX2ZtdHBfcGFpcihBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICp4aXBoX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmF0dHIsIGNoYXIgKnZhbHVlKQoreworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHN0cmVhbS0+Y29kZWM7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICBpZiAoIXN0cmNtcChhdHRyLCAic2FtcGxpbmciKSkgeworICAgICAgICBpZiAoIXN0cmNtcCh2YWx1ZSwgIllDYkNyLTQ6MjowIikpIHsKKyAgICAgICAgICAgIGNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAodmFsdWUsICJZQ2JDci00OjQ6MiIpKSB7CisgICAgICAgICAgICBjb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHZhbHVlLCAiWUNiQ3ItNDo0OjQiKSkgeworICAgICAgICAgICAgY29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQgJXNcbiIsIGF0dHIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ciwgIndpZHRoIikpIHsKKyAgICAgICAgLyogVGhpcyBpcyBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTA0ODU2MQorICAgICAgICAgKiBhbmQgTVVTVCBiZSBpbiBtdWx0aXBsZXMgb2YgMTYuICovCisgICAgICAgIGNvZGVjLT53aWR0aCA9IGF0b2kodmFsdWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ciwgImhlaWdodCIpKSB7CisgICAgICAgIC8qIFRoaXMgaXMgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwNDg1NjEKKyAgICAgICAgICogYW5kIE1VU1QgYmUgaW4gbXVsdGlwbGVzIG9mIDE2LiAqLworICAgICAgICBjb2RlYy0+aGVpZ2h0ID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLCAiZGVsaXZlcnktbWV0aG9kIikpIHsKKyAgICAgICAgLyogUG9zc2libGUgdmFsdWVzIGFyZTogaW5saW5lLCBpbl9iYW5kLCBvdXRfYmFuZC9zcGVjaWZpY19uYW1lLiAqLworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHIsICJjb25maWd1cmF0aW9uLXVyaSIpKSB7CisgICAgICAgIC8qIE5PVEU6IGNvbmZpZ3VyYXRpb24tdXJpIGlzIHN1cHBvcnRlZCBvbmx5IHVuZGVyIDIgY29uZGl0aW9uczoKKyAgICAgICAgICotLWFmdGVyIHRoZSBkZWxpdmVyeS1tZXRob2QgdGFnCisgICAgICAgICAqIC0td2l0aCBhIGRlbGl2ZXJ5LW1ldGhvZCB2YWx1ZSBvZiBvdXRfYmFuZCAqLworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHIsICJjb25maWd1cmF0aW9uIikpIHsKKyAgICAgICAgLyogTk9URTogY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQgb25seSBBRlRFUiB0aGUgZGVsaXZlcnktbWV0aG9kIHRhZworICAgICAgICAgKiBUaGUgY29uZmlndXJhdGlvbiB2YWx1ZSBpcyBhIGJhc2U2NCBlbmNvZGVkIHBhY2tlZCBoZWFkZXIgKi8KKyAgICAgICAgdWludDhfdCAqZGVjb2RlZF9wYWNrZXQgPSBOVUxMOworICAgICAgICBpbnQgcGFja2V0X3NpemU7CisgICAgICAgIHNpemVfdCBkZWNvZGVkX2FsbG9jID0gc3RybGVuKHZhbHVlKSAvIDQgKiAzICsgNDsKKworICAgICAgICBpZiAoZGVjb2RlZF9hbGxvYyA8PSBJTlRfTUFYKSB7CisgICAgICAgICAgICBkZWNvZGVkX3BhY2tldCA9IGF2X21hbGxvYyhkZWNvZGVkX2FsbG9jKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVkX3BhY2tldCkgeworICAgICAgICAgICAgICAgIHBhY2tldF9zaXplID0KKyAgICAgICAgICAgICAgICAgICAgYXZfYmFzZTY0X2RlY29kZShkZWNvZGVkX3BhY2tldCwgdmFsdWUsIGRlY29kZWRfYWxsb2MpOworCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGFyc2VfcGFja2VkX2hlYWRlcnMKKyAgICAgICAgICAgICAgICAgICAgKGRlY29kZWRfcGFja2V0LCBkZWNvZGVkX3BhY2tldCArIHBhY2tldF9zaXplLCBjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgeGlwaF9kYXRhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk91dCBvZiBtZW1vcnkgd2hpbGUgZGVjb2RpbmcgU0RQIGNvbmZpZ3VyYXRpb24uXG4iKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUGFja2V0IHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICByZXN1bHQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWUoZGVjb2RlZF9wYWNrZXQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHhpcGhfcGFyc2Vfc2RwX2xpbmUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZENvbnRleHQgKmRhdGEsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisgICAgY29uc3QgY2hhciAqcDsKKworICAgIGlmIChzdF9pbmRleCA8IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGF2X3N0cnN0YXJ0KGxpbmUsICJmbXRwOiIsICZwKSkgeworICAgICAgICByZXR1cm4gZmZfcGFyc2VfZm10cChzLCBzLT5zdHJlYW1zW3N0X2luZGV4XSwgZGF0YSwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGlwaF9wYXJzZV9mbXRwX3BhaXIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3RoZW9yYV9keW5hbWljX2hhbmRsZXIgPSB7CisgICAgLmVuY19uYW1lICAgICAgICAgPSAidGhlb3JhIiwKKyAgICAuY29kZWNfdHlwZSAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuY29kZWNfaWQgICAgICAgICA9IEFWX0NPREVDX0lEX1RIRU9SQSwKKyAgICAucGFyc2Vfc2RwX2FfbGluZSA9IHhpcGhfcGFyc2Vfc2RwX2xpbmUsCisgICAgLmFsbG9jICAgICAgICAgICAgPSB4aXBoX25ld19jb250ZXh0LAorICAgIC5mcmVlICAgICAgICAgICAgID0geGlwaF9mcmVlX2NvbnRleHQsCisgICAgLnBhcnNlX3BhY2tldCAgICAgPSB4aXBoX2hhbmRsZV9wYWNrZXQKK307CisKK1JUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfdm9yYmlzX2R5bmFtaWNfaGFuZGxlciA9IHsKKyAgICAuZW5jX25hbWUgICAgICAgICA9ICJ2b3JiaXMiLAorICAgIC5jb2RlY190eXBlICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5jb2RlY19pZCAgICAgICAgID0gQVZfQ09ERUNfSURfVk9SQklTLAorICAgIC5pbml0ICAgICAgICAgICAgID0geGlwaF92b3JiaXNfaW5pdCwKKyAgICAucGFyc2Vfc2RwX2FfbGluZSA9IHhpcGhfcGFyc2Vfc2RwX2xpbmUsCisgICAgLmFsbG9jICAgICAgICAgICAgPSB4aXBoX25ld19jb250ZXh0LAorICAgIC5mcmVlICAgICAgICAgICAgID0geGlwaF9mcmVlX2NvbnRleHQsCisgICAgLnBhcnNlX3BhY2tldCAgICAgPSB4aXBoX2hhbmRsZV9wYWNrZXQKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwOGRmYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmMuYwpAQCAtMCwwICsxLDY0NSBAQAorLyoKKyAqIFJUUCBvdXRwdXQgZm9ybWF0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgIm1wZWd0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhbmRvbV9zZWVkLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjaW5jbHVkZSAicnRwZW5jLmgiCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgRkZfUlRQX0ZMQUdfT1BUUyhSVFBNdXhDb250ZXh0LCBmbGFncyksCisgICAgeyAicGF5bG9hZF90eXBlIiwgIlNwZWNpZnkgUlRQIHBheWxvYWQgdHlwZSIsIG9mZnNldG9mKFJUUE11eENvbnRleHQsIHBheWxvYWRfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMSB9LCAtMSwgMTI3LCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgInNzcmMiLCAiU3RyZWFtIGlkZW50aWZpZXIiLCBvZmZzZXRvZihSVFBNdXhDb250ZXh0LCBzc3JjKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiY25hbWUiLCAiQ05BTUUgdG8gaW5jbHVkZSBpbiBSVENQIFNSIHBhY2tldHMiLCBvZmZzZXRvZihSVFBNdXhDb250ZXh0LCBjbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgInNlcSIsICJTdGFydGluZyBzZXF1ZW5jZSBudW1iZXIiLCBvZmZzZXRvZihSVFBNdXhDb250ZXh0LCBzZXEpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sIC0xLCA2NTUzNSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHJ0cF9tdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJSVFAgbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworI2RlZmluZSBSVENQX1NSX1NJWkUgMjgKKworc3RhdGljIGludCBpc19zdXBwb3J0ZWQoZW51bSBBVkNvZGVjSUQgaWQpCit7CisgICAgc3dpdGNoKGlkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYxOgorICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2MzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjNQOgorICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPOgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzJWSURFTzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OgorICAgIGNhc2UgQVZfQ09ERUNfSURfQUFDOgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVAyOgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVAzOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0FMQVc6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzg6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTE2QkU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTE2TEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTg6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMlRTOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQU1SX05COgorICAgIGNhc2UgQVZfQ09ERUNfSURfQU1SX1dCOgorICAgIGNhc2UgQVZfQ09ERUNfSURfVk9SQklTOgorICAgIGNhc2UgQVZfQ09ERUNfSURfVEhFT1JBOgorICAgIGNhc2UgQVZfQ09ERUNfSURfVlA4OgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRzcyMjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0c3MjY6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9JTEJDOgorICAgIGNhc2UgQVZfQ09ERUNfSURfTUpQRUc6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9TUEVFWDoKKyAgICBjYXNlIEFWX0NPREVDX0lEX09QVVM6CisgICAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCBydHBfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqczEpCit7CisgICAgUlRQTXV4Q29udGV4dCAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgaW50IG47CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgaWYgKHMxLT5uYl9zdHJlYW1zICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJPbmx5IG9uZSBzdHJlYW0gc3VwcG9ydGVkIGluIHRoZSBSVFAgbXV4ZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBzdCA9IHMxLT5zdHJlYW1zWzBdOworICAgIGlmICghaXNfc3VwcG9ydGVkKHN0LT5jb2RlYy0+Y29kZWNfaWQpKSB7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgY29kZWMgJXNcbiIsIGF2Y29kZWNfZ2V0X25hbWUoc3QtPmNvZGVjLT5jb2RlY19pZCkpOworCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocy0+cGF5bG9hZF90eXBlIDwgMCkgeworICAgICAgICAvKiBSZS12YWxpZGF0ZSBub24tZHluYW1pYyBwYXlsb2FkIHR5cGVzICovCisgICAgICAgIGlmIChzdC0+aWQgPCBSVFBfUFRfUFJJVkFURSkKKyAgICAgICAgICAgIHN0LT5pZCA9IGZmX3J0cF9nZXRfcGF5bG9hZF90eXBlKHMxLCBzdC0+Y29kZWMsIC0xKTsKKworICAgICAgICBzLT5wYXlsb2FkX3R5cGUgPSBzdC0+aWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogcHJpdmF0ZSBvcHRpb24gdGFrZXMgcHJpb3JpdHkgKi8KKyAgICAgICAgc3QtPmlkID0gcy0+cGF5bG9hZF90eXBlOworICAgIH0KKworICAgIHMtPmJhc2VfdGltZXN0YW1wID0gYXZfZ2V0X3JhbmRvbV9zZWVkKCk7CisgICAgcy0+dGltZXN0YW1wID0gcy0+YmFzZV90aW1lc3RhbXA7CisgICAgcy0+Y3VyX3RpbWVzdGFtcCA9IDA7CisgICAgaWYgKCFzLT5zc3JjKQorICAgICAgICBzLT5zc3JjID0gYXZfZ2V0X3JhbmRvbV9zZWVkKCk7CisgICAgcy0+Zmlyc3RfcGFja2V0ID0gMTsKKyAgICBzLT5maXJzdF9ydGNwX250cF90aW1lID0gZmZfbnRwX3RpbWUoKTsKKyAgICBpZiAoczEtPnN0YXJ0X3RpbWVfcmVhbHRpbWUgIT0gMCAgJiYgIHMxLT5zdGFydF90aW1lX3JlYWx0aW1lICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAvKiBSb3VuZCB0aGUgTlRQIHRpbWUgdG8gd2hvbGUgbWlsbGlzZWNvbmRzLiAqLworICAgICAgICBzLT5maXJzdF9ydGNwX250cF90aW1lID0gKHMxLT5zdGFydF90aW1lX3JlYWx0aW1lIC8gMTAwMCkgKiAxMDAwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UUF9PRkZTRVRfVVM7CisgICAgLy8gUGljayBhIHJhbmRvbSBzZXF1ZW5jZSBzdGFydCBudW1iZXIsIGJ1dCBpbiB0aGUgbG93ZXIgZW5kIG9mIHRoZQorICAgIC8vIGF2YWlsYWJsZSByYW5nZSwgc28gdGhhdCBhbnkgd3JhcGFyb3VuZCBkb2Vzbid0IGhhcHBlbiBpbW1lZGlhdGVseS4KKyAgICAvLyAoSW1tZWRpYXRlIHdyYXBhcm91bmQgd291bGQgYmUgYW4gaXNzdWUgZm9yIFNSVFAuKQorICAgIGlmIChzLT5zZXEgPCAwKSB7CisgICAgICAgIGlmIChzMS0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0JJVEVYQUNUKSB7CisgICAgICAgICAgICBzLT5zZXEgPSAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHMtPnNlcSA9IGF2X2dldF9yYW5kb21fc2VlZCgpICYgMHgwZmZmOworICAgIH0gZWxzZQorICAgICAgICBzLT5zZXEgJj0gMHhmZmZmOyAvLyBVc2UgdGhlIGdpdmVuIHBhcmFtZXRlciwgd3JhcHBlZCB0byB0aGUgcmlnaHQgaW50ZXJ2YWwKKworICAgIGlmIChzMS0+cGFja2V0X3NpemUpIHsKKyAgICAgICAgaWYgKHMxLT5wYi0+bWF4X3BhY2tldF9zaXplKQorICAgICAgICAgICAgczEtPnBhY2tldF9zaXplID0gRkZNSU4oczEtPnBhY2tldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEtPnBiLT5tYXhfcGFja2V0X3NpemUpOworICAgIH0gZWxzZQorICAgICAgICBzMS0+cGFja2V0X3NpemUgPSBzMS0+cGItPm1heF9wYWNrZXRfc2l6ZTsKKyAgICBpZiAoczEtPnBhY2tldF9zaXplIDw9IDEyKSB7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiTWF4IHBhY2tldCBzaXplICVkIHRvbyBsb3dcbiIsIHMxLT5wYWNrZXRfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIHMtPmJ1ZiA9IGF2X21hbGxvYyhzMS0+cGFja2V0X3NpemUpOworICAgIGlmICghcy0+YnVmKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHMtPm1heF9wYXlsb2FkX3NpemUgPSBzMS0+cGFja2V0X3NpemUgLSAxMjsKKworICAgIHMtPm1heF9mcmFtZXNfcGVyX3BhY2tldCA9IDA7CisgICAgaWYgKHMxLT5tYXhfZGVsYXkgPiAwKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpbnQgZnJhbWVfc2l6ZSA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihzdC0+Y29kZWMsIDApOworICAgICAgICAgICAgaWYgKCFmcmFtZV9zaXplKQorICAgICAgICAgICAgICAgIGZyYW1lX3NpemUgPSBzdC0+Y29kZWMtPmZyYW1lX3NpemU7CisgICAgICAgICAgICBpZiAoZnJhbWVfc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgcmVzcGVjdCBtYXggZGVsYXk6IGZyYW1lIHNpemUgPSAwXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcy0+bWF4X2ZyYW1lc19wZXJfcGFja2V0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcV9ybmQoczEtPm1heF9kZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgZnJhbWVfc2l6ZSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ST1VORF9ET1dOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgLyogRklYTUU6IFdlIHNob3VsZCByb3VuZCBkb3duIGhlcmUuLi4gKi8KKyAgICAgICAgICAgIGlmIChzdC0+YXZnX2ZyYW1lX3JhdGUubnVtID4gMCAmJiBzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuID4gMCkgeworICAgICAgICAgICAgICAgIHMtPm1heF9mcmFtZXNfcGVyX3BhY2tldCA9IGF2X3Jlc2NhbGVfcShzMS0+bWF4X2RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgMTAwMDAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ludl9xKHN0LT5hdmdfZnJhbWVfcmF0ZSkpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcy0+bWF4X2ZyYW1lc19wZXJfcGFja2V0ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCA5MDAwMCk7CisgICAgc3dpdGNoKHN0LT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QMjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QMzoKKyAgICAgICAgcy0+YnVmX3B0ciA9IHMtPmJ1ZiArIDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcyVklERU86CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzJUUzoKKyAgICAgICAgbiA9IHMtPm1heF9wYXlsb2FkX3NpemUgLyBUU19QQUNLRVRfU0laRTsKKyAgICAgICAgaWYgKG4gPCAxKQorICAgICAgICAgICAgbiA9IDE7CisgICAgICAgIHMtPm1heF9wYXlsb2FkX3NpemUgPSBuICogVFNfUEFDS0VUX1NJWkU7CisgICAgICAgIHMtPmJ1Zl9wdHIgPSBzLT5idWY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKKyAgICAgICAgLyogY2hlY2sgZm9yIEguMjY0IE1QNCBzeW50YXggKi8KKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPiA0ICYmIHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzBdID09IDEpIHsKKyAgICAgICAgICAgIHMtPm5hbF9sZW5ndGhfc2l6ZSA9IChzdC0+Y29kZWMtPmV4dHJhZGF0YVs0XSAmIDB4MDMpICsgMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6CisgICAgICAgIC8qIE9ubHkgY2hlY2sgZm9yIHRoZSBzdGFuZGFyZGl6ZWQgaHZjQyB2ZXJzaW9uIG9mIGV4dHJhZGF0YSwga2VlcGluZworICAgICAgICAgKiB0aGluZ3Mgc2ltcGxlIGFuZCBzaW1pbGFyIHRvIHRoZSBhdmNDL0gyNjQgY2FzZSBhYm92ZSwgaW5zdGVhZAorICAgICAgICAgKiBvZiB0cnlpbmcgdG8gaGFuZGxlIHRoZSBwcmUtc3RhbmRhcmRpemF0aW9uIHZlcnNpb25zIChhcyBpbgorICAgICAgICAgKiBsaWJhdmNvZGVjL2hldmMuYykuICovCisgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID4gMjEgJiYgc3QtPmNvZGVjLT5leHRyYWRhdGFbMF0gPT0gMSkgeworICAgICAgICAgICAgcy0+bmFsX2xlbmd0aF9zaXplID0gKHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzIxXSAmIDB4MDMpICsgMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1ZPUkJJUzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1RIRU9SQToKKyAgICAgICAgaWYgKCFzLT5tYXhfZnJhbWVzX3Blcl9wYWNrZXQpIHMtPm1heF9mcmFtZXNfcGVyX3BhY2tldCA9IDE1OworICAgICAgICBzLT5tYXhfZnJhbWVzX3Blcl9wYWNrZXQgPSBhdl9jbGlwKHMtPm1heF9mcmFtZXNfcGVyX3BhY2tldCwgMSwgMTUpOworICAgICAgICBzLT5tYXhfcGF5bG9hZF9zaXplIC09IDY7IC8vIGlkZW50K2ZyYWcrdGR0L3ZkdCtwa3RfbnVtK3BrdF9sZW5ndGgKKyAgICAgICAgcy0+bnVtX2ZyYW1lcyA9IDA7CisgICAgICAgIGdvdG8gZGVmYXVsdGNhc2U7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9HNzIyOgorICAgICAgICAvKiBEdWUgdG8gYSBoaXN0b3JpY2FsIGVycm9yLCB0aGUgY2xvY2sgcmF0ZSBmb3IgRzcyMiBpbiBSVFAgaXMKKyAgICAgICAgICogODAwMCwgZXZlbiBpZiB0aGUgc2FtcGxlIHJhdGUgaXMgMTYwMDAuIFNlZSBSRkMgMzU1MS4gKi8KKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIDgwMDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX09QVVM6CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID4gMikgeworICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJNdWx0aXN0cmVhbSBvcHVzIG5vdCBzdXBwb3J0ZWQgaW4gUlRQXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICAvKiBUaGUgb3B1cyBSVFAgUkZDIHNheXMgdGhhdCBhbGwgb3B1cyBzdHJlYW1zIHNob3VsZCB1c2UgNDgwMDAgSHoKKyAgICAgICAgICogYXMgY2xvY2sgcmF0ZSwgc2luY2UgYWxsIG9wdXMgc2FtcGxlIHJhdGVzIGNhbiBiZSBleHByZXNzZWQgaW4KKyAgICAgICAgICogdGhpcyBjbG9jayByYXRlLCBhbmQgc2FtcGxlIHJhdGUgY2hhbmdlcyBvbiB0aGUgZmx5IGFyZSBzdXBwb3J0ZWQuICovCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCA0ODAwMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfSUxCQzoKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gIT0gMzggJiYgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiAhPSA1MCkgeworICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgaUxCQyBibG9jayBzaXplIHNwZWNpZmllZFxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzLT5tYXhfZnJhbWVzX3Blcl9wYWNrZXQpCisgICAgICAgICAgICBzLT5tYXhfZnJhbWVzX3Blcl9wYWNrZXQgPSAxOworICAgICAgICBzLT5tYXhfZnJhbWVzX3Blcl9wYWNrZXQgPSBGRk1JTihzLT5tYXhfZnJhbWVzX3Blcl9wYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1heF9wYXlsb2FkX3NpemUgLyBzdC0+Y29kZWMtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgZ290byBkZWZhdWx0Y2FzZTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FNUl9OQjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FNUl9XQjoKKyAgICAgICAgaWYgKCFzLT5tYXhfZnJhbWVzX3Blcl9wYWNrZXQpCisgICAgICAgICAgICBzLT5tYXhfZnJhbWVzX3Blcl9wYWNrZXQgPSAxMjsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX05CKQorICAgICAgICAgICAgbiA9IDMxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuID0gNjE7CisgICAgICAgIC8qIG1heF9oZWFkZXJfdG9jX3NpemUgKyB0aGUgbGFyZ2VzdCBBTVIgcGF5bG9hZCBtdXN0IGZpdCAqLworICAgICAgICBpZiAoMSArIHMtPm1heF9mcmFtZXNfcGVyX3BhY2tldCArIG4gPiBzLT5tYXhfcGF5bG9hZF9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIlJUUCBtYXggcGF5bG9hZCBzaXplIHRvbyBzbWFsbCBmb3IgQU1SXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3QtPmNvZGVjLT5jaGFubmVscyAhPSAxKSB7CisgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIk9ubHkgbW9ubyBpcyBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BQUM6CisgICAgICAgIHMtPm51bV9mcmFtZXMgPSAwOworICAgIGRlZmF1bHQ6CitkZWZhdWx0Y2FzZToKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgfQorICAgICAgICBzLT5idWZfcHRyID0gcy0+YnVmOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9mcmVlcCgmcy0+YnVmKTsKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCisvKiBzZW5kIGFuIHJ0Y3Agc2VuZGVyIHJlcG9ydCBwYWNrZXQgKi8KK3N0YXRpYyB2b2lkIHJ0Y3Bfc2VuZF9zcihBVkZvcm1hdENvbnRleHQgKnMxLCBpbnQ2NF90IG50cF90aW1lLCBpbnQgYnllKQoreworICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIHVpbnQzMl90IHJ0cF90czsKKworICAgIGF2X2Rsb2coczEsICJSVENQOiAlMDJ4ICUiUFJJeDY0IiAleFxuIiwgcy0+cGF5bG9hZF90eXBlLCBudHBfdGltZSwgcy0+dGltZXN0YW1wKTsKKworICAgIHMtPmxhc3RfcnRjcF9udHBfdGltZSA9IG50cF90aW1lOworICAgIHJ0cF90cyA9IGF2X3Jlc2NhbGVfcShudHBfdGltZSAtIHMtPmZpcnN0X3J0Y3BfbnRwX3RpbWUsIChBVlJhdGlvbmFsKXsxLCAxMDAwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgczEtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZSkgKyBzLT5iYXNlX3RpbWVzdGFtcDsKKyAgICBhdmlvX3c4KHMxLT5wYiwgUlRQX1ZFUlNJT04gPDwgNik7CisgICAgYXZpb193OChzMS0+cGIsIFJUQ1BfU1IpOworICAgIGF2aW9fd2IxNihzMS0+cGIsIDYpOyAvKiBsZW5ndGggaW4gd29yZHMgLSAxICovCisgICAgYXZpb193YjMyKHMxLT5wYiwgcy0+c3NyYyk7CisgICAgYXZpb193YjY0KHMxLT5wYiwgTlRQX1RPX1JUUF9GT1JNQVQobnRwX3RpbWUpKTsKKyAgICBhdmlvX3diMzIoczEtPnBiLCBydHBfdHMpOworICAgIGF2aW9fd2IzMihzMS0+cGIsIHMtPnBhY2tldF9jb3VudCk7CisgICAgYXZpb193YjMyKHMxLT5wYiwgcy0+b2N0ZXRfY291bnQpOworCisgICAgaWYgKHMtPmNuYW1lKSB7CisgICAgICAgIGludCBsZW4gPSBGRk1JTihzdHJsZW4ocy0+Y25hbWUpLCAyNTUpOworICAgICAgICBhdmlvX3c4KHMxLT5wYiwgKFJUUF9WRVJTSU9OIDw8IDYpICsgMSk7CisgICAgICAgIGF2aW9fdzgoczEtPnBiLCBSVENQX1NERVMpOworICAgICAgICBhdmlvX3diMTYoczEtPnBiLCAoNyArIGxlbiArIDMpIC8gNCk7IC8qIGxlbmd0aCBpbiB3b3JkcyAtIDEgKi8KKworICAgICAgICBhdmlvX3diMzIoczEtPnBiLCBzLT5zc3JjKTsKKyAgICAgICAgYXZpb193OChzMS0+cGIsIDB4MDEpOyAvKiBDTkFNRSAqLworICAgICAgICBhdmlvX3c4KHMxLT5wYiwgbGVuKTsKKyAgICAgICAgYXZpb193cml0ZShzMS0+cGIsIHMtPmNuYW1lLCBsZW4pOworICAgICAgICBhdmlvX3c4KHMxLT5wYiwgMCk7IC8qIEVORCAqLworICAgICAgICBmb3IgKGxlbiA9ICg3ICsgbGVuKSAlIDQ7IGxlbiAlIDQ7IGxlbisrKQorICAgICAgICAgICAgYXZpb193OChzMS0+cGIsIDApOworICAgIH0KKworICAgIGlmIChieWUpIHsKKyAgICAgICAgYXZpb193OChzMS0+cGIsIChSVFBfVkVSU0lPTiA8PCA2KSB8IDEpOworICAgICAgICBhdmlvX3c4KHMxLT5wYiwgUlRDUF9CWUUpOworICAgICAgICBhdmlvX3diMTYoczEtPnBiLCAxKTsgLyogbGVuZ3RoIGluIHdvcmRzIC0gMSAqLworICAgICAgICBhdmlvX3diMzIoczEtPnBiLCBzLT5zc3JjKTsKKyAgICB9CisKKyAgICBhdmlvX2ZsdXNoKHMxLT5wYik7Cit9CisKKy8qIHNlbmQgYW4gcnRwIHBhY2tldC4gc2VxdWVuY2UgbnVtYmVyIGlzIGluY3JlbWVudGVkLCBidXQgdGhlIGNhbGxlcgorICAgbXVzdCB1cGRhdGUgdGhlIHRpbWVzdGFtcCBpdHNlbGYgKi8KK3ZvaWQgZmZfcnRwX3NlbmRfZGF0YShBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpidWYxLCBpbnQgbGVuLCBpbnQgbSkKK3sKKyAgICBSVFBNdXhDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKworICAgIGF2X2Rsb2coczEsICJydHBfc2VuZF9kYXRhIHNpemU9JWRcbiIsIGxlbik7CisKKyAgICAvKiBidWlsZCB0aGUgUlRQIGhlYWRlciAqLworICAgIGF2aW9fdzgoczEtPnBiLCBSVFBfVkVSU0lPTiA8PCA2KTsKKyAgICBhdmlvX3c4KHMxLT5wYiwgKHMtPnBheWxvYWRfdHlwZSAmIDB4N2YpIHwgKChtICYgMHgwMSkgPDwgNykpOworICAgIGF2aW9fd2IxNihzMS0+cGIsIHMtPnNlcSk7CisgICAgYXZpb193YjMyKHMxLT5wYiwgcy0+dGltZXN0YW1wKTsKKyAgICBhdmlvX3diMzIoczEtPnBiLCBzLT5zc3JjKTsKKworICAgIGF2aW9fd3JpdGUoczEtPnBiLCBidWYxLCBsZW4pOworICAgIGF2aW9fZmx1c2goczEtPnBiKTsKKworICAgIHMtPnNlcSA9IChzLT5zZXEgKyAxKSAmIDB4ZmZmZjsKKyAgICBzLT5vY3RldF9jb3VudCArPSBsZW47CisgICAgcy0+cGFja2V0X2NvdW50Kys7Cit9CisKKy8qIHNlbmQgYW4gaW50ZWdlciBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgY29tcHV0ZSB0aW1lIHN0YW1wIGFuZCBmaWxsCisgICB0aGUgcnRwIHNlbmQgYnVmZmVyIGJlZm9yZSBzZW5kaW5nLiAqLworc3RhdGljIGludCBydHBfc2VuZF9zYW1wbGVzKEFWRm9ybWF0Q29udGV4dCAqczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmMSwgaW50IHNpemUsIGludCBzYW1wbGVfc2l6ZV9iaXRzKQoreworICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIGludCBsZW4sIG1heF9wYWNrZXRfc2l6ZSwgbjsKKyAgICAvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQgc2FtcGxlcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3JkZXIgKi8KKyAgICBpbnQgYWxpZ25lZF9zYW1wbGVzX3NpemUgPSBzYW1wbGVfc2l6ZV9iaXRzL2F2X2djZChzYW1wbGVfc2l6ZV9iaXRzLCA4KTsKKworICAgIG1heF9wYWNrZXRfc2l6ZSA9IChzLT5tYXhfcGF5bG9hZF9zaXplIC8gYWxpZ25lZF9zYW1wbGVzX3NpemUpICogYWxpZ25lZF9zYW1wbGVzX3NpemU7CisgICAgLyogTm90IG5lZWRlZCwgYnV0IHdobyBrbm93cy4gRG9uJ3QgY2hlY2sgaWYgc2FtcGxlcyBhcmVuJ3QgYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMuICovCisgICAgaWYgKChzYW1wbGVfc2l6ZV9iaXRzICUgOCkgPT0gMCAmJiAoKDggKiBzaXplKSAlIHNhbXBsZV9zaXplX2JpdHMpICE9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgbiA9IDA7CisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIHMtPmJ1Zl9wdHIgPSBzLT5idWY7CisgICAgICAgIGxlbiA9IEZGTUlOKG1heF9wYWNrZXRfc2l6ZSwgc2l6ZSk7CisKKyAgICAgICAgLyogY29weSBkYXRhICovCisgICAgICAgIG1lbWNweShzLT5idWZfcHRyLCBidWYxLCBsZW4pOworICAgICAgICBzLT5idWZfcHRyICs9IGxlbjsKKyAgICAgICAgYnVmMSArPSBsZW47CisgICAgICAgIHNpemUgLT0gbGVuOworICAgICAgICBzLT50aW1lc3RhbXAgPSBzLT5jdXJfdGltZXN0YW1wICsgbiAqIDggLyBzYW1wbGVfc2l6ZV9iaXRzOworICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBzLT5idWYsIHMtPmJ1Zl9wdHIgLSBzLT5idWYsIDApOworICAgICAgICBuICs9IChzLT5idWZfcHRyIC0gcy0+YnVmKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0cF9zZW5kX21wZWdhdWRpbyhBVkZvcm1hdENvbnRleHQgKnMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZjEsIGludCBzaXplKQoreworICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIGludCBsZW4sIGNvdW50LCBtYXhfcGFja2V0X3NpemU7CisKKyAgICBtYXhfcGFja2V0X3NpemUgPSBzLT5tYXhfcGF5bG9hZF9zaXplOworCisgICAgLyogdGVzdCBpZiB3ZSBtdXN0IGZsdXNoIGJlY2F1c2Ugbm90IGVub3VnaCBzcGFjZSAqLworICAgIGxlbiA9IChzLT5idWZfcHRyIC0gcy0+YnVmKTsKKyAgICBpZiAoKGxlbiArIHNpemUpID4gbWF4X3BhY2tldF9zaXplKSB7CisgICAgICAgIGlmIChsZW4gPiA0KSB7CisgICAgICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBzLT5idWYsIHMtPmJ1Zl9wdHIgLSBzLT5idWYsIDApOworICAgICAgICAgICAgcy0+YnVmX3B0ciA9IHMtPmJ1ZiArIDQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPmJ1Zl9wdHIgPT0gcy0+YnVmICsgNCkgeworICAgICAgICBzLT50aW1lc3RhbXAgPSBzLT5jdXJfdGltZXN0YW1wOworICAgIH0KKworICAgIC8qIGFkZCB0aGUgcGFja2V0ICovCisgICAgaWYgKHNpemUgPiBtYXhfcGFja2V0X3NpemUpIHsKKyAgICAgICAgLyogYmlnIHBhY2tldDogZnJhZ21lbnQgKi8KKyAgICAgICAgY291bnQgPSAwOworICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGxlbiA9IG1heF9wYWNrZXRfc2l6ZSAtIDQ7CisgICAgICAgICAgICBpZiAobGVuID4gc2l6ZSkKKyAgICAgICAgICAgICAgICBsZW4gPSBzaXplOworICAgICAgICAgICAgLyogYnVpbGQgZnJhZ21lbnRlZCBwYWNrZXQgKi8KKyAgICAgICAgICAgIHMtPmJ1ZlswXSA9IDA7CisgICAgICAgICAgICBzLT5idWZbMV0gPSAwOworICAgICAgICAgICAgcy0+YnVmWzJdID0gY291bnQgPj4gODsKKyAgICAgICAgICAgIHMtPmJ1ZlszXSA9IGNvdW50OworICAgICAgICAgICAgbWVtY3B5KHMtPmJ1ZiArIDQsIGJ1ZjEsIGxlbik7CisgICAgICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBzLT5idWYsIGxlbiArIDQsIDApOworICAgICAgICAgICAgc2l6ZSAtPSBsZW47CisgICAgICAgICAgICBidWYxICs9IGxlbjsKKyAgICAgICAgICAgIGNvdW50ICs9IGxlbjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzLT5idWZfcHRyID09IHMtPmJ1ZiArIDQpIHsKKyAgICAgICAgICAgIC8qIG5vIGZyYWdtZW50YXRpb24gcG9zc2libGUgKi8KKyAgICAgICAgICAgIHMtPmJ1ZlswXSA9IDA7CisgICAgICAgICAgICBzLT5idWZbMV0gPSAwOworICAgICAgICAgICAgcy0+YnVmWzJdID0gMDsKKyAgICAgICAgICAgIHMtPmJ1ZlszXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHMtPmJ1Zl9wdHIsIGJ1ZjEsIHNpemUpOworICAgICAgICBzLT5idWZfcHRyICs9IHNpemU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBydHBfc2VuZF9yYXcoQVZGb3JtYXRDb250ZXh0ICpzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYxLCBpbnQgc2l6ZSkKK3sKKyAgICBSVFBNdXhDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBpbnQgbGVuLCBtYXhfcGFja2V0X3NpemU7CisKKyAgICBtYXhfcGFja2V0X3NpemUgPSBzLT5tYXhfcGF5bG9hZF9zaXplOworCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGxlbiA9IG1heF9wYWNrZXRfc2l6ZTsKKyAgICAgICAgaWYgKGxlbiA+IHNpemUpCisgICAgICAgICAgICBsZW4gPSBzaXplOworCisgICAgICAgIHMtPnRpbWVzdGFtcCA9IHMtPmN1cl90aW1lc3RhbXA7CisgICAgICAgIGZmX3J0cF9zZW5kX2RhdGEoczEsIGJ1ZjEsIGxlbiwgKGxlbiA9PSBzaXplKSk7CisKKyAgICAgICAgYnVmMSArPSBsZW47CisgICAgICAgIHNpemUgLT0gbGVuOworICAgIH0KK30KKworLyogTk9URTogc2l6ZSBpcyBhc3N1bWVkIHRvIGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgVFNfUEFDS0VUX1NJWkUgKi8KK3N0YXRpYyB2b2lkIHJ0cF9zZW5kX21wZWd0c19yYXcoQVZGb3JtYXRDb250ZXh0ICpzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmMSwgaW50IHNpemUpCit7CisgICAgUlRQTXV4Q29udGV4dCAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgaW50IGxlbiwgb3V0X2xlbjsKKworICAgIHdoaWxlIChzaXplID49IFRTX1BBQ0tFVF9TSVpFKSB7CisgICAgICAgIGxlbiA9IHMtPm1heF9wYXlsb2FkX3NpemUgLSAocy0+YnVmX3B0ciAtIHMtPmJ1Zik7CisgICAgICAgIGlmIChsZW4gPiBzaXplKQorICAgICAgICAgICAgbGVuID0gc2l6ZTsKKyAgICAgICAgbWVtY3B5KHMtPmJ1Zl9wdHIsIGJ1ZjEsIGxlbik7CisgICAgICAgIGJ1ZjEgKz0gbGVuOworICAgICAgICBzaXplIC09IGxlbjsKKyAgICAgICAgcy0+YnVmX3B0ciArPSBsZW47CisKKyAgICAgICAgb3V0X2xlbiA9IHMtPmJ1Zl9wdHIgLSBzLT5idWY7CisgICAgICAgIGlmIChvdXRfbGVuID49IHMtPm1heF9wYXlsb2FkX3NpemUpIHsKKyAgICAgICAgICAgIGZmX3J0cF9zZW5kX2RhdGEoczEsIHMtPmJ1Ziwgb3V0X2xlbiwgMCk7CisgICAgICAgICAgICBzLT5idWZfcHRyID0gcy0+YnVmOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IHJ0cF9zZW5kX2lsYmMoQVZGb3JtYXRDb250ZXh0ICpzMSwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBSVFBNdXhDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzMS0+c3RyZWFtc1swXTsKKyAgICBpbnQgZnJhbWVfZHVyYXRpb24gPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oc3QtPmNvZGVjLCAwKTsKKyAgICBpbnQgZnJhbWVfc2l6ZSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgaW50IGZyYW1lcyA9IHNpemUgLyBmcmFtZV9zaXplOworCisgICAgd2hpbGUgKGZyYW1lcyA+IDApIHsKKyAgICAgICAgaW50IG4gPSBGRk1JTihzLT5tYXhfZnJhbWVzX3Blcl9wYWNrZXQgLSBzLT5udW1fZnJhbWVzLCBmcmFtZXMpOworCisgICAgICAgIGlmICghcy0+bnVtX2ZyYW1lcykgeworICAgICAgICAgICAgcy0+YnVmX3B0ciA9IHMtPmJ1ZjsKKyAgICAgICAgICAgIHMtPnRpbWVzdGFtcCA9IHMtPmN1cl90aW1lc3RhbXA7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHMtPmJ1Zl9wdHIsIGJ1ZiwgbiAqIGZyYW1lX3NpemUpOworICAgICAgICBmcmFtZXMgICAgICAgICAgIC09IG47CisgICAgICAgIHMtPm51bV9mcmFtZXMgICAgKz0gbjsKKyAgICAgICAgcy0+YnVmX3B0ciAgICAgICArPSBuICogZnJhbWVfc2l6ZTsKKyAgICAgICAgYnVmICAgICAgICAgICAgICArPSBuICogZnJhbWVfc2l6ZTsKKyAgICAgICAgcy0+Y3VyX3RpbWVzdGFtcCArPSBuICogZnJhbWVfZHVyYXRpb247CisKKyAgICAgICAgaWYgKHMtPm51bV9mcmFtZXMgPT0gcy0+bWF4X2ZyYW1lc19wZXJfcGFja2V0KSB7CisgICAgICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBzLT5idWYsIHMtPmJ1Zl9wdHIgLSBzLT5idWYsIDEpOworICAgICAgICAgICAgcy0+bnVtX2ZyYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRwX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMxLCBBVlBhY2tldCAqcGt0KQoreworICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IHMxLT5zdHJlYW1zWzBdOworICAgIGludCBydGNwX2J5dGVzOworICAgIGludCBzaXplPSBwa3QtPnNpemU7CisKKyAgICBhdl9kbG9nKHMxLCAiJWQ6IHdyaXRlIGxlbj0lZFxuIiwgcGt0LT5zdHJlYW1faW5kZXgsIHNpemUpOworCisgICAgcnRjcF9ieXRlcyA9ICgocy0+b2N0ZXRfY291bnQgLSBzLT5sYXN0X29jdGV0X2NvdW50KSAqIFJUQ1BfVFhfUkFUSU9fTlVNKSAvCisgICAgICAgIFJUQ1BfVFhfUkFUSU9fREVOOworICAgIGlmICgocy0+Zmlyc3RfcGFja2V0IHx8ICgocnRjcF9ieXRlcyA+PSBSVENQX1NSX1NJWkUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZmX250cF90aW1lKCkgLSBzLT5sYXN0X3J0Y3BfbnRwX3RpbWUgPiA1MDAwMDAwKSkpICYmCisgICAgICAgICEocy0+ZmxhZ3MgJiBGRl9SVFBfRkxBR19TS0lQX1JUQ1ApKSB7CisgICAgICAgIHJ0Y3Bfc2VuZF9zcihzMSwgZmZfbnRwX3RpbWUoKSwgMCk7CisgICAgICAgIHMtPmxhc3Rfb2N0ZXRfY291bnQgPSBzLT5vY3RldF9jb3VudDsKKyAgICAgICAgcy0+Zmlyc3RfcGFja2V0ID0gMDsKKyAgICB9CisgICAgcy0+Y3VyX3RpbWVzdGFtcCA9IHMtPmJhc2VfdGltZXN0YW1wICsgcGt0LT5wdHM7CisKKyAgICBzd2l0Y2goc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX01VTEFXOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0FMQVc6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fVTg6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzg6CisgICAgICAgIHJldHVybiBydHBfc2VuZF9zYW1wbGVzKHMxLCBwa3QtPmRhdGEsIHNpemUsIDggKiBzdC0+Y29kZWMtPmNoYW5uZWxzKTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMTZCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMTZMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZCRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRToKKyAgICAgICAgcmV0dXJuIHJ0cF9zZW5kX3NhbXBsZXMoczEsIHBrdC0+ZGF0YSwgc2l6ZSwgMTYgKiBzdC0+Y29kZWMtPmNoYW5uZWxzKTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0c3MjI6CisgICAgICAgIC8qIFRoZSBhY3R1YWwgc2FtcGxlIHNpemUgaXMgaGFsZiBhIGJ5dGUgcGVyIHNhbXBsZSwgYnV0IHNpbmNlIHRoZQorICAgICAgICAgKiBzdHJlYW0gY2xvY2sgcmF0ZSBpcyA4MDAwIEh6IHdoaWxlIHRoZSBzYW1wbGUgcmF0ZSBpcyAxNjAwMCBIeiwKKyAgICAgICAgICogdGhlIGNvcnJlY3QgcGFyYW1ldGVyIGZvciBzZW5kX3NhbXBsZXNfYml0cyBpcyA4IGJpdHMgcGVyIHN0cmVhbQorICAgICAgICAgKiBjbG9jay4gKi8KKyAgICAgICAgcmV0dXJuIHJ0cF9zZW5kX3NhbXBsZXMoczEsIHBrdC0+ZGF0YSwgc2l6ZSwgOCAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRzcyNjoKKyAgICAgICAgcmV0dXJuIHJ0cF9zZW5kX3NhbXBsZXMoczEsIHBrdC0+ZGF0YSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWMtPmNoYW5uZWxzKTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QMjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QMzoKKyAgICAgICAgcnRwX3NlbmRfbXBlZ2F1ZGlvKHMxLCBwa3QtPmRhdGEsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcxVklERU86CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOgorICAgICAgICBmZl9ydHBfc2VuZF9tcGVndmlkZW8oczEsIHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQUFDOgorICAgICAgICBpZiAocy0+ZmxhZ3MgJiBGRl9SVFBfRkxBR19NUDRBX0xBVE0pCisgICAgICAgICAgICBmZl9ydHBfc2VuZF9sYXRtKHMxLCBwa3QtPmRhdGEsIHNpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmZl9ydHBfc2VuZF9hYWMoczEsIHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQU1SX05COgorICAgIGNhc2UgQVZfQ09ERUNfSURfQU1SX1dCOgorICAgICAgICBmZl9ydHBfc2VuZF9hbXIoczEsIHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzJUUzoKKyAgICAgICAgcnRwX3NlbmRfbXBlZ3RzX3JhdyhzMSwgcGt0LT5kYXRhLCBzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY0OgorICAgICAgICBmZl9ydHBfc2VuZF9oMjY0KHMxLCBwa3QtPmRhdGEsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjE6CisgICAgICAgIGZmX3J0cF9zZW5kX2gyNjEoczEsIHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2MzoKKyAgICAgICAgaWYgKHMtPmZsYWdzICYgRkZfUlRQX0ZMQUdfUkZDMjE5MCkgeworICAgICAgICAgICAgaW50IG1iX2luZm9fc2l6ZSA9IDA7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICptYl9pbmZvID0KKyAgICAgICAgICAgICAgICBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX0gyNjNfTUJfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWJfaW5mb19zaXplKTsKKyAgICAgICAgICAgIGlmICghbWJfaW5mbykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiZmFpbGVkIHRvIGFsbG9jYXRlIHNpZGUgZGF0YVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZmX3J0cF9zZW5kX2gyNjNfcmZjMjE5MChzMSwgcGt0LT5kYXRhLCBzaXplLCBtYl9pbmZvLCBtYl9pbmZvX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjNQOgorICAgICAgICBmZl9ydHBfc2VuZF9oMjYzKHMxLCBwa3QtPmRhdGEsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6CisgICAgICAgIGZmX3J0cF9zZW5kX2hldmMoczEsIHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfVk9SQklTOgorICAgIGNhc2UgQVZfQ09ERUNfSURfVEhFT1JBOgorICAgICAgICBmZl9ydHBfc2VuZF94aXBoKHMxLCBwa3QtPmRhdGEsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1ZQODoKKyAgICAgICAgZmZfcnRwX3NlbmRfdnA4KHMxLCBwa3QtPmRhdGEsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0lMQkM6CisgICAgICAgIHJ0cF9zZW5kX2lsYmMoczEsIHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfTUpQRUc6CisgICAgICAgIGZmX3J0cF9zZW5kX2pwZWcoczEsIHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfT1BVUzoKKyAgICAgICAgaWYgKHNpemUgPiBzLT5tYXhfcGF5bG9hZF9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiUGFja2V0IHNpemUgJWQgdG9vIGxhcmdlIGZvciBtYXggUlRQIHBheWxvYWQgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzaXplLCBzLT5tYXhfcGF5bG9hZF9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBiZXR0ZXIgdGhhbiBub3RoaW5nIDogc2VuZCB0aGUgY29kZWMgcmF3IGRhdGEgKi8KKyAgICAgICAgcnRwX3NlbmRfcmF3KHMxLCBwa3QtPmRhdGEsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRwX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzMSkKK3sKKyAgICBSVFBNdXhDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKworICAgIC8qIElmIHRoZSBjYWxsZXIgY2xvc2VzIGFuZCByZWNyZWF0ZXMgLT5wYiwgdGhpcyBtaWdodCBhY3R1YWxseQorICAgICAqIGJlIE5VTEwgaGVyZSBldmVuIGlmIGl0IHdhcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkIGF0IHRoZSBzdGFydC4gKi8KKyAgICBpZiAoczEtPnBiICYmIChzLT5mbGFncyAmIEZGX1JUUF9GTEFHX1NFTkRfQllFKSkKKyAgICAgICAgcnRjcF9zZW5kX3NyKHMxLCBmZl9udHBfdGltZSgpLCAxKTsKKyAgICBhdl9mcmVlcCgmcy0+YnVmKTsKKworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9ydHBfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gInJ0cCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJUUCBvdXRwdXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoUlRQTXV4Q29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX01VTEFXLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IHJ0cF93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gcnRwX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBydHBfd3JpdGVfdHJhaWxlciwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmcnRwX211eGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmMuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWI5OGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuYy5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogUlRQIG11eGVyIGRlZmluaXRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaWZuZGVmIEFWRk9STUFUX1JUUEVOQ19ICisjZGVmaW5lIEFWRk9STUFUX1JUUEVOQ19ICisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJ0cC5oIgorCitzdHJ1Y3QgUlRQTXV4Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqYXZfY2xhc3M7CisgICAgQVZGb3JtYXRDb250ZXh0ICppYzsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IHBheWxvYWRfdHlwZTsKKyAgICB1aW50MzJfdCBzc3JjOworICAgIGNvbnN0IGNoYXIgKmNuYW1lOworICAgIGludCBzZXE7CisgICAgdWludDMyX3QgdGltZXN0YW1wOworICAgIHVpbnQzMl90IGJhc2VfdGltZXN0YW1wOworICAgIHVpbnQzMl90IGN1cl90aW1lc3RhbXA7CisgICAgaW50IG1heF9wYXlsb2FkX3NpemU7CisgICAgaW50IG51bV9mcmFtZXM7CisKKyAgICAvKiBydGNwIHNlbmRlciBzdGF0aXN0aWNzICovCisgICAgaW50NjRfdCBsYXN0X3J0Y3BfbnRwX3RpbWU7CisgICAgaW50NjRfdCBmaXJzdF9ydGNwX250cF90aW1lOworICAgIHVuc2lnbmVkIGludCBwYWNrZXRfY291bnQ7CisgICAgdW5zaWduZWQgaW50IG9jdGV0X2NvdW50OworICAgIHVuc2lnbmVkIGludCBsYXN0X29jdGV0X2NvdW50OworICAgIGludCBmaXJzdF9wYWNrZXQ7CisgICAgLyogYnVmZmVyIGZvciBvdXRwdXQgKi8KKyAgICB1aW50OF90ICpidWY7CisgICAgdWludDhfdCAqYnVmX3B0cjsKKworICAgIGludCBtYXhfZnJhbWVzX3Blcl9wYWNrZXQ7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3IgSC4yNjQgTkFMIGxlbmd0aCwgaWYgdGhlIE1QNCBzeW50YXggaXMgdXNlZAorICAgICAqICgxLCAyIG9yIDQpCisgICAgICovCisgICAgaW50IG5hbF9sZW5ndGhfc2l6ZTsKKworICAgIGludCBmbGFnczsKKworICAgIHVuc2lnbmVkIGludCBmcmFtZV9jb3VudDsKK307CisKK3R5cGVkZWYgc3RydWN0IFJUUE11eENvbnRleHQgUlRQTXV4Q29udGV4dDsKKworI2RlZmluZSBGRl9SVFBfRkxBR19NUDRBX0xBVE0gMQorI2RlZmluZSBGRl9SVFBfRkxBR19SRkMyMTkwICAgMgorI2RlZmluZSBGRl9SVFBfRkxBR19TS0lQX1JUQ1AgNAorI2RlZmluZSBGRl9SVFBfRkxBR19IMjY0X01PREUwIDgKKyNkZWZpbmUgRkZfUlRQX0ZMQUdfU0VORF9CWUUgIDE2CisKKyNkZWZpbmUgRkZfUlRQX0ZMQUdfT1BUUyhjdHgsIGZpZWxkbmFtZSkgXAorICAgIHsgInJ0cGZsYWdzIiwgIlJUUCBtdXhlciBmbGFncyIsIG9mZnNldG9mKGN0eCwgZmllbGRuYW1lKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gMH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAicnRwZmxhZ3MiIH0sIFwKKyAgICB7ICJsYXRtIiwgIlVzZSBNUDRBLUxBVE0gcGFja2V0aXphdGlvbiBpbnN0ZWFkIG9mIE1QRUc0LUdFTkVSSUMgZm9yIEFBQyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1JUUF9GTEFHX01QNEFfTEFUTX0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAicnRwZmxhZ3MiIH0sIFwKKyAgICB7ICJyZmMyMTkwIiwgIlVzZSBSRkMgMjE5MCBwYWNrZXRpemF0aW9uIGluc3RlYWQgb2YgUkZDIDQ2MjkgZm9yIEguMjYzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUlRQX0ZMQUdfUkZDMjE5MH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAicnRwZmxhZ3MiIH0sIFwKKyAgICB7ICJza2lwX3J0Y3AiLCAiRG9uJ3Qgc2VuZCBSVENQIHNlbmRlciByZXBvcnRzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUlRQX0ZMQUdfU0tJUF9SVENQfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJydHBmbGFncyIgfSwgXAorICAgIHsgImgyNjRfbW9kZTAiLCAiVXNlIG1vZGUgMCBmb3IgSDI2NCBpbiBSVFAiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9SVFBfRkxBR19IMjY0X01PREUwfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJydHBmbGFncyIgfSwgXAorICAgIHsgInNlbmRfYnllIiwgIlNlbmQgUlRDUCBCWUUgcGFja2V0cyB3aGVuIGZpbmlzaGluZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1JUUF9GTEFHX1NFTkRfQllFfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJydHBmbGFncyIgfSBcCisKK3ZvaWQgZmZfcnRwX3NlbmRfZGF0YShBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpidWYxLCBpbnQgbGVuLCBpbnQgbSk7CisKK3ZvaWQgZmZfcnRwX3NlbmRfaDI2NChBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpidWYxLCBpbnQgc2l6ZSk7Cit2b2lkIGZmX3J0cF9zZW5kX2gyNjEoQVZGb3JtYXRDb250ZXh0ICpzMSwgY29uc3QgdWludDhfdCAqYnVmMSwgaW50IHNpemUpOwordm9pZCBmZl9ydHBfc2VuZF9oMjYzKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZjEsIGludCBzaXplKTsKK3ZvaWQgZmZfcnRwX3NlbmRfaDI2M19yZmMyMTkwKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZjEsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWJfaW5mbywgaW50IG1iX2luZm9fc2l6ZSk7Cit2b2lkIGZmX3J0cF9zZW5kX2hldmMoQVZGb3JtYXRDb250ZXh0ICpzMSwgY29uc3QgdWludDhfdCAqYnVmMSwgaW50IHNpemUpOwordm9pZCBmZl9ydHBfc2VuZF9hYWMoQVZGb3JtYXRDb250ZXh0ICpzMSwgY29uc3QgdWludDhfdCAqYnVmZiwgaW50IHNpemUpOwordm9pZCBmZl9ydHBfc2VuZF9sYXRtKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmYsIGludCBzaXplKTsKK3ZvaWQgZmZfcnRwX3NlbmRfYW1yKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmYsIGludCBzaXplKTsKK3ZvaWQgZmZfcnRwX3NlbmRfbXBlZ3ZpZGVvKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZjEsIGludCBzaXplKTsKK3ZvaWQgZmZfcnRwX3NlbmRfeGlwaChBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpidWZmLCBpbnQgc2l6ZSk7Cit2b2lkIGZmX3J0cF9zZW5kX3ZwOChBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpidWZmLCBpbnQgc2l6ZSk7Cit2b2lkIGZmX3J0cF9zZW5kX2pwZWcoQVZGb3JtYXRDb250ZXh0ICpzMSwgY29uc3QgdWludDhfdCAqYnVmZiwgaW50IHNpemUpOworCitjb25zdCB1aW50OF90ICpmZl9oMjYzX2ZpbmRfcmVzeW5jX21hcmtlcl9yZXZlcnNlKGNvbnN0IHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICphdl9yZXN0cmljdCBlbmQpOworCisjZW5kaWYgLyogQVZGT1JNQVRfUlRQRU5DX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfYWFjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX2FhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOGY0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX2FhYy5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDcgTHVjYSBBYmVuaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJydHBlbmMuaCIKKworCit2b2lkIGZmX3J0cF9zZW5kX2FhYyhBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpidWZmLCBpbnQgc2l6ZSkKK3sKKyAgICBSVFBNdXhDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBpbnQgbGVuLCBtYXhfcGFja2V0X3NpemU7CisgICAgdWludDhfdCAqcDsKKyAgICBjb25zdCBpbnQgbWF4X2ZyYW1lc19wZXJfcGFja2V0ID0gcy0+bWF4X2ZyYW1lc19wZXJfcGFja2V0ID8gcy0+bWF4X2ZyYW1lc19wZXJfcGFja2V0IDogNTsKKyAgICBjb25zdCBpbnQgbWF4X2F1X2hlYWRlcnNfc2l6ZSA9IDIgKyAyICogbWF4X2ZyYW1lc19wZXJfcGFja2V0OworCisgICAgLyogc2tpcCBBRFRTIGhlYWRlciwgaWYgcHJlc2VudCAqLworICAgIGlmICgoczEtPnN0cmVhbXNbMF0tPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSkgPT0gMCkgeworICAgICAgICBzaXplIC09IDc7CisgICAgICAgIGJ1ZmYgKz0gNzsKKyAgICB9CisgICAgbWF4X3BhY2tldF9zaXplID0gcy0+bWF4X3BheWxvYWRfc2l6ZSAtIG1heF9hdV9oZWFkZXJzX3NpemU7CisKKyAgICAvKiB0ZXN0IGlmIHRoZSBwYWNrZXQgbXVzdCBiZSBzZW50ICovCisgICAgbGVuID0gKHMtPmJ1Zl9wdHIgLSBzLT5idWYpOworICAgIGlmICgocy0+bnVtX2ZyYW1lcyA9PSBtYXhfZnJhbWVzX3Blcl9wYWNrZXQpIHx8IChsZW4gJiYgKGxlbiArIHNpemUpID4gcy0+bWF4X3BheWxvYWRfc2l6ZSkpIHsKKyAgICAgICAgaW50IGF1X3NpemUgPSBzLT5udW1fZnJhbWVzICogMjsKKworICAgICAgICBwID0gcy0+YnVmICsgbWF4X2F1X2hlYWRlcnNfc2l6ZSAtIGF1X3NpemUgLSAyOworICAgICAgICBpZiAocCAhPSBzLT5idWYpIHsKKyAgICAgICAgICAgIG1lbW1vdmUocCArIDIsIHMtPmJ1ZiArIDIsIGF1X3NpemUpOworICAgICAgICB9CisgICAgICAgIC8qIFdyaXRlIHRoZSBBVSBoZWFkZXIgc2l6ZSAqLworICAgICAgICBwWzBdID0gIGF1X3NpemUgPj4gNTsKKyAgICAgICAgcFsxXSA9IChhdV9zaXplICYgMHgxRikgPDwgMzsKKworICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBwLCBzLT5idWZfcHRyIC0gcCwgMSk7CisKKyAgICAgICAgcy0+bnVtX2ZyYW1lcyA9IDA7CisgICAgfQorICAgIGlmIChzLT5udW1fZnJhbWVzID09IDApIHsKKyAgICAgICAgcy0+YnVmX3B0ciA9IHMtPmJ1ZiArIG1heF9hdV9oZWFkZXJzX3NpemU7CisgICAgICAgIHMtPnRpbWVzdGFtcCA9IHMtPmN1cl90aW1lc3RhbXA7CisgICAgfQorCisgICAgaWYgKHNpemUgPD0gbWF4X3BhY2tldF9zaXplKSB7CisgICAgICAgIHAgPSBzLT5idWYgKyBzLT5udW1fZnJhbWVzKysgKiAyICsgMjsKKyAgICAgICAgKnArKyA9IHNpemUgPj4gNTsKKyAgICAgICAgKnAgPSAoc2l6ZSAmIDB4MUYpIDw8IDM7CisgICAgICAgIG1lbWNweShzLT5idWZfcHRyLCBidWZmLCBzaXplKTsKKyAgICAgICAgcy0+YnVmX3B0ciArPSBzaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBhdV9zaXplID0gc2l6ZTsKKworICAgICAgICBtYXhfcGFja2V0X3NpemUgPSBzLT5tYXhfcGF5bG9hZF9zaXplIC0gNDsKKyAgICAgICAgcCA9IHMtPmJ1ZjsKKyAgICAgICAgcFswXSA9IDA7CisgICAgICAgIHBbMV0gPSAxNjsKKyAgICAgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgICAgICBsZW4gPSBGRk1JTihzaXplLCBtYXhfcGFja2V0X3NpemUpOworICAgICAgICAgICAgcFsyXSA9IGF1X3NpemUgPj4gNTsKKyAgICAgICAgICAgIHBbM10gPSAoYXVfc2l6ZSAmIDB4MUYpIDw8IDM7CisgICAgICAgICAgICBtZW1jcHkocCArIDQsIGJ1ZmYsIGxlbik7CisgICAgICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBwLCBsZW4gKyA0LCBsZW4gPT0gc2l6ZSk7CisgICAgICAgICAgICBzaXplIC09IGxlbjsKKyAgICAgICAgICAgIGJ1ZmYgKz0gbGVuOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY19hbXIuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfYW1yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxYzE5NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfYW1yLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIFJUUCBwYWNrZXRpemF0aW9uIGZvciBBTVIgYXVkaW8KKyAqIENvcHlyaWdodCAoYykgMjAwNyBMdWNhIEFiZW5pCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicnRwZW5jLmgiCisKKy8qKgorICogUGFja2V0aXplIEFNUiBmcmFtZXMgaW50byBSVFAgcGFja2V0cyBhY2NvcmRpbmcgdG8gUkZDIDMyNjcsCisgKiBpbiBvY3RldC1hbGlnbmVkIG1vZGUuCisgKi8KK3ZvaWQgZmZfcnRwX3NlbmRfYW1yKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmYsIGludCBzaXplKQoreworICAgIFJUUE11eENvbnRleHQgKnMgICAgICAgICAgPSBzMS0+cHJpdl9kYXRhOworICAgIGludCBtYXhfaGVhZGVyX3RvY19zaXplICAgPSAxICsgcy0+bWF4X2ZyYW1lc19wZXJfcGFja2V0OworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IGxlbjsKKworICAgIC8qIFRlc3QgaWYgdGhlIHBhY2tldCBtdXN0IGJlIHNlbnQuICovCisgICAgbGVuID0gcy0+YnVmX3B0ciAtIHMtPmJ1ZjsKKyAgICBpZiAocy0+bnVtX2ZyYW1lcyA9PSBzLT5tYXhfZnJhbWVzX3Blcl9wYWNrZXQgfHwgKGxlbiAmJiBsZW4gKyBzaXplIC0gMSA+IHMtPm1heF9wYXlsb2FkX3NpemUpKSB7CisgICAgICAgIGludCBoZWFkZXJfc2l6ZSA9IHMtPm51bV9mcmFtZXMgKyAxOworICAgICAgICBwID0gcy0+YnVmICsgbWF4X2hlYWRlcl90b2Nfc2l6ZSAtIGhlYWRlcl9zaXplOworICAgICAgICBpZiAocCAhPSBzLT5idWYpCisgICAgICAgICAgICBtZW1tb3ZlKHAsIHMtPmJ1ZiwgaGVhZGVyX3NpemUpOworCisgICAgICAgIGZmX3J0cF9zZW5kX2RhdGEoczEsIHAsIHMtPmJ1Zl9wdHIgLSBwLCAxKTsKKworICAgICAgICBzLT5udW1fZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoIXMtPm51bV9mcmFtZXMpIHsKKyAgICAgICAgcy0+YnVmWzBdICAgID0gMHhmMDsKKyAgICAgICAgcy0+YnVmX3B0ciAgID0gcy0+YnVmICsgbWF4X2hlYWRlcl90b2Nfc2l6ZTsKKyAgICAgICAgcy0+dGltZXN0YW1wID0gcy0+Y3VyX3RpbWVzdGFtcDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBNYXJrIHRoZSBwcmV2aW91cyBUT0MgZW50cnkgYXMgaGF2aW5nIG1vcmUgZW50cmllcyBmb2xsb3dpbmcuICovCisgICAgICAgIHMtPmJ1ZlsxICsgcy0+bnVtX2ZyYW1lcyAtIDFdIHw9IDB4ODA7CisgICAgfQorCisgICAgLyogQ29weSB0aGUgZnJhbWUgdHlwZSBhbmQgcXVhbGl0eSBiaXRzLiAqLworICAgIHMtPmJ1ZlsxICsgcy0+bnVtX2ZyYW1lcysrXSA9IGJ1ZmZbMF0gJiAweDdDOworICAgIGJ1ZmYrKzsKKyAgICBzaXplLS07CisgICAgbWVtY3B5KHMtPmJ1Zl9wdHIsIGJ1ZmYsIHNpemUpOworICAgIHMtPmJ1Zl9wdHIgKz0gc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfY2hhaW4uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfY2hhaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmFhMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY19jaGFpbi5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogUlRQIG11eGVyIGNoYWluaW5nIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAicnRwZW5jX2NoYWluLmgiCisjaW5jbHVkZSAicnRwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCitpbnQgZmZfcnRwX2NoYWluX211eF9vcGVuKEFWRm9ybWF0Q29udGV4dCAqKm91dCwgQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIFVSTENvbnRleHQgKmhhbmRsZSwgaW50IHBhY2tldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4KQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqcnRwY3R4ID0gTlVMTDsKKyAgICBpbnQgcmV0OworICAgIEFWT3V0cHV0Rm9ybWF0ICpydHBfZm9ybWF0ID0gYXZfZ3Vlc3NfZm9ybWF0KCJydHAiLCBOVUxMLCBOVUxMKTsKKyAgICB1aW50OF90ICpydHBmbGFnczsKKyAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOworCisgICAgaWYgKCFydHBfZm9ybWF0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGFuIEFWRm9ybWF0Q29udGV4dCBmb3IgZWFjaCBvdXRwdXQgc3RyZWFtICovCisgICAgcnRwY3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOworICAgIGlmICghcnRwY3R4KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJ0cGN0eC0+b2Zvcm1hdCA9IHJ0cF9mb3JtYXQ7CisgICAgaWYgKCFhdmZvcm1hdF9uZXdfc3RyZWFtKHJ0cGN0eCwgTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIC8qIFBhc3MgdGhlIGludGVycnVwdCBjYWxsYmFjayBvbiAqLworICAgIHJ0cGN0eC0+aW50ZXJydXB0X2NhbGxiYWNrID0gcy0+aW50ZXJydXB0X2NhbGxiYWNrOworICAgIC8qIENvcHkgdGhlIG1heCBkZWxheSBzZXR0aW5nOyB0aGUgcnRwIG11eGVyIHJlYWRzIHRoaXMuICovCisgICAgcnRwY3R4LT5tYXhfZGVsYXkgPSBzLT5tYXhfZGVsYXk7CisgICAgLyogQ29weSBvdGhlciBzdHJlYW0gcGFyYW1ldGVycy4gKi8KKyAgICBydHBjdHgtPnN0cmVhbXNbMF0tPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICBydHBjdHgtPmZsYWdzIHw9IHMtPmZsYWdzICYgQVZGTVRfRkxBR19NUDRBX0xBVE07CisKKyAgICAvKiBHZXQgdGhlIHBheWxvYWQgdHlwZSBmcm9tIHRoZSBjb2RlYyAqLworICAgIGlmIChzdC0+aWQgPCBSVFBfUFRfUFJJVkFURSkKKyAgICAgICAgcnRwY3R4LT5zdHJlYW1zWzBdLT5pZCA9CisgICAgICAgICAgICBmZl9ydHBfZ2V0X3BheWxvYWRfdHlwZShzLCBzdC0+Y29kZWMsIGlkeCk7CisgICAgZWxzZQorICAgICAgICBydHBjdHgtPnN0cmVhbXNbMF0tPmlkID0gc3QtPmlkOworCisKKyAgICBpZiAoYXZfb3B0X2dldChzLCAicnRwZmxhZ3MiLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOLCAmcnRwZmxhZ3MpID49IDApCisgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAicnRwZmxhZ3MiLCBydHBmbGFncywgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworCisgICAgLyogU2V0IHRoZSBzeW5jaHJvbml6ZWQgc3RhcnQgdGltZS4gKi8KKyAgICBydHBjdHgtPnN0YXJ0X3RpbWVfcmVhbHRpbWUgPSBzLT5zdGFydF90aW1lX3JlYWx0aW1lOworCisgICAgYXZjb2RlY19jb3B5X2NvbnRleHQocnRwY3R4LT5zdHJlYW1zWzBdLT5jb2RlYywgc3QtPmNvZGVjKTsKKyAgICBydHBjdHgtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZSA9IHN0LT50aW1lX2Jhc2U7CisKKyAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgIHJldCA9IGZmaW9fZmRvcGVuKCZydHBjdHgtPnBiLCBoYW5kbGUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGZmdXJsX2Nsb3NlKGhhbmRsZSk7CisgICAgfSBlbHNlCisgICAgICAgIHJldCA9IGZmaW9fb3Blbl9keW5fcGFja2V0X2J1ZigmcnRwY3R4LT5wYiwgcGFja2V0X3NpemUpOworICAgIGlmICghcmV0KQorICAgICAgICByZXQgPSBhdmZvcm1hdF93cml0ZV9oZWFkZXIocnRwY3R4LCAmb3B0cyk7CisgICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKKworICAgIGlmIChyZXQpIHsKKyAgICAgICAgaWYgKGhhbmRsZSAmJiBydHBjdHgtPnBiKSB7CisgICAgICAgICAgICBhdmlvX2Nsb3NlKHJ0cGN0eC0+cGIpOworICAgICAgICB9IGVsc2UgaWYgKHJ0cGN0eC0+cGIpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnB0cjsKKyAgICAgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1ZihydHBjdHgtPnBiLCAmcHRyKTsKKyAgICAgICAgICAgIGF2X2ZyZWUocHRyKTsKKyAgICAgICAgfQorICAgICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQocnRwY3R4KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqb3V0ID0gcnRwY3R4OworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2ZyZWUocnRwY3R4KTsKKyAgICBpZiAoaGFuZGxlKQorICAgICAgICBmZnVybF9jbG9zZShoYW5kbGUpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX2NoYWluLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX2NoYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFjMjdjMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfY2hhaW4uaApAQCAtMCwwICsxLDMyIEBACisvKgorICogUlRQIG11eGVyIGNoYWluaW5nIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1JUUEVOQ19DSEFJTl9ICisjZGVmaW5lIEFWRk9STUFUX1JUUEVOQ19DSEFJTl9ICisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInVybC5oIgorCitpbnQgZmZfcnRwX2NoYWluX211eF9vcGVuKEFWRm9ybWF0Q29udGV4dCAqKm91dCwgQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIFVSTENvbnRleHQgKmhhbmRsZSwgaW50IHBhY2tldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOworCisjZW5kaWYgLyogQVZGT1JNQVRfUlRQRU5DX0NIQUlOX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfaDI2MS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY19oMjYxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2MzcwMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfaDI2MS5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBSVFAgcGFja2V0aXphdGlvbiBmb3IgSC4yNjEgdmlkZW8gKFJGQyA0NTg3KQorICogQ29weXJpZ2h0IChjKSAyMDE0IFRob21hcyBWb2xrZXJ0IDx0aG9tYXNAaG9tZXItY29uZmVyZW5jaW5nLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicnRwZW5jLmgiCisKK3ZvaWQgZmZfcnRwX3NlbmRfaDI2MShBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpmcmFtZV9idWYsIGludCBmcmFtZV9zaXplKQoreworICAgIFJUUE11eENvbnRleHQgKnJ0cF9jdHggPSBzMS0+cHJpdl9kYXRhOworICAgIGludCBwcm9jZXNzZWRfZnJhbWVfc2l6ZTsKKyAgICBpbnQgbGFzdF9wYWNrZXRfb2ZfZnJhbWU7CisgICAgdWludDhfdCAqdG1wX2J1Zl9wdHI7CisKKyAgICAvKiB1c2UgdGhlIGRlZmF1bHQgOTAgS0h6IHRpbWUgc3RhbXAgKi8KKyAgICBydHBfY3R4LT50aW1lc3RhbXAgPSBydHBfY3R4LT5jdXJfdGltZXN0YW1wOworCisgICAgLyogY29udGludWUgYXMgbG9uZyBhcyBub3QgYWxsIGZyYW1lIGRhdGEgaXMgcHJvY2Vzc2VkICovCisgICAgd2hpbGUgKGZyYW1lX3NpemUgPiAwKSB7CisgICAgICAgIHRtcF9idWZfcHRyID0gcnRwX2N0eC0+YnVmOworICAgICAgICAqdG1wX2J1Zl9wdHIrKyA9IDE7IC8qIFY9MSAqLworICAgICAgICAqdG1wX2J1Zl9wdHIrKyA9IDA7CisgICAgICAgICp0bXBfYnVmX3B0cisrID0gMDsKKyAgICAgICAgKnRtcF9idWZfcHRyKysgPSAwOworCisgICAgICAgIHByb2Nlc3NlZF9mcmFtZV9zaXplID0gRkZNSU4ocnRwX2N0eC0+bWF4X3BheWxvYWRfc2l6ZSAtIDQsIGZyYW1lX3NpemUpOworCisgICAgICAgIC8vWFhYOiBwYXJzZSB0aGUgaC4yNjEgYml0c3RyZWFtIGFuZCBpbXByb3ZlIGZyYW1lIHNwbGl0dGluZyBoZXJlCisKKyAgICAgICAgbGFzdF9wYWNrZXRfb2ZfZnJhbWUgPSAocHJvY2Vzc2VkX2ZyYW1lX3NpemUgPT0gZnJhbWVfc2l6ZSk7CisKKyAgICAgICAgbWVtY3B5KHRtcF9idWZfcHRyLCBmcmFtZV9idWYsIHByb2Nlc3NlZF9mcmFtZV9zaXplKTsKKyAgICAgICAgdG1wX2J1Zl9wdHIgKz0gcHJvY2Vzc2VkX2ZyYW1lX3NpemU7CisKKyAgICAgICAgZmZfcnRwX3NlbmRfZGF0YShzMSwgcnRwX2N0eC0+YnVmLCB0bXBfYnVmX3B0ciAtIHJ0cF9jdHgtPmJ1ZiwgbGFzdF9wYWNrZXRfb2ZfZnJhbWUpOworCisgICAgICAgIGZyYW1lX2J1ZiArPSBwcm9jZXNzZWRfZnJhbWVfc2l6ZTsKKyAgICAgICAgZnJhbWVfc2l6ZSAtPSBwcm9jZXNzZWRfZnJhbWVfc2l6ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX2gyNjMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfaDI2My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZWEwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX2gyNjMuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogUlRQIHBhY2tldGl6YXRpb24gZm9yIEguMjYzIHZpZGVvCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTHVjYSBBYmVuaQorICogQ29weXJpZ2h0IChjKSAyMDA5IE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJ0cGVuYy5oIgorCitjb25zdCB1aW50OF90ICpmZl9oMjYzX2ZpbmRfcmVzeW5jX21hcmtlcl9yZXZlcnNlKGNvbnN0IHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICphdl9yZXN0cmljdCBlbmQpCit7CisgICAgY29uc3QgdWludDhfdCAqcCA9IGVuZCAtIDE7CisgICAgc3RhcnQgKz0gMTsgLyogTWFrZSBzdXJlIHdlIG5ldmVyIHJldHVybiB0aGUgb3JpZ2luYWwgc3RhcnQuICovCisgICAgZm9yICg7IHAgPiBzdGFydDsgcCAtPSAyKSB7CisgICAgICAgIGlmICghKnApIHsKKyAgICAgICAgICAgIGlmICAgICAgKCFwWyAxXSAmJiBwWzJdKSByZXR1cm4gcDsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFwWy0xXSAmJiBwWzFdKSByZXR1cm4gcCAtIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVuZDsKK30KKworLyoqCisgKiBQYWNrZXRpemUgSC4yNjMgZnJhbWVzIGludG8gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyA0NjI5CisgKi8KK3ZvaWQgZmZfcnRwX3NlbmRfaDI2MyhBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpidWYxLCBpbnQgc2l6ZSkKK3sKKyAgICBSVFBNdXhDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKyAgICBpbnQgbGVuLCBtYXhfcGFja2V0X3NpemU7CisgICAgdWludDhfdCAqcTsKKworICAgIG1heF9wYWNrZXRfc2l6ZSA9IHMtPm1heF9wYXlsb2FkX3NpemU7CisKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgcSA9IHMtPmJ1ZjsKKyAgICAgICAgaWYgKHNpemUgPj0gMiAmJiAoYnVmMVswXSA9PSAwKSAmJiAoYnVmMVsxXSA9PSAwKSkgeworICAgICAgICAgICAgKnErKyA9IDB4MDQ7CisgICAgICAgICAgICBidWYxICs9IDI7CisgICAgICAgICAgICBzaXplIC09IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcSsrID0gMDsKKyAgICAgICAgfQorICAgICAgICAqcSsrID0gMDsKKworICAgICAgICBsZW4gPSBGRk1JTihtYXhfcGFja2V0X3NpemUgLSAyLCBzaXplKTsKKworICAgICAgICAvKiBMb29rIGZvciBhIGJldHRlciBwbGFjZSB0byBzcGxpdCB0aGUgZnJhbWUgaW50byBwYWNrZXRzLiAqLworICAgICAgICBpZiAobGVuIDwgc2l6ZSkgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kID0gZmZfaDI2M19maW5kX3Jlc3luY19tYXJrZXJfcmV2ZXJzZShidWYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYxICsgbGVuKTsKKyAgICAgICAgICAgIGxlbiA9IGVuZCAtIGJ1ZjE7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkocSwgYnVmMSwgbGVuKTsKKyAgICAgICAgcSArPSBsZW47CisKKyAgICAgICAgLyogOTAgS0h6IHRpbWUgc3RhbXAgKi8KKyAgICAgICAgcy0+dGltZXN0YW1wID0gcy0+Y3VyX3RpbWVzdGFtcDsKKyAgICAgICAgZmZfcnRwX3NlbmRfZGF0YShzMSwgcy0+YnVmLCBxIC0gcy0+YnVmLCAobGVuID09IHNpemUpKTsKKworICAgICAgICBidWYxICs9IGxlbjsKKyAgICAgICAgc2l6ZSAtPSBsZW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY19oMjYzX3JmYzIxOTAuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfaDI2M19yZmMyMTkwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRiMzkwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfaDI2M19yZmMyMTkwLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBSVFAgcGFja2V0aXphdGlvbiBmb3IgSC4yNjMgdmlkZW8KKyAqIENvcHlyaWdodCAoYykgMjAxMiBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJydHBlbmMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3B1dF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorCitzdHJ1Y3QgSDI2M0luZm8geworICAgIGludCBzcmM7CisgICAgaW50IGk7CisgICAgaW50IHU7CisgICAgaW50IHM7CisgICAgaW50IGE7CisgICAgaW50IHBiOworICAgIGludCB0cjsKK307CisKK3N0cnVjdCBIMjYzU3RhdGUgeworICAgIGludCBnb2JuOworICAgIGludCBtYmE7CisgICAgaW50IGhtdjEsIHZtdjEsIGhtdjIsIHZtdjI7CisgICAgaW50IHF1YW50OworfTsKKworc3RhdGljIHZvaWQgc2VuZF9tb2RlX2EoQVZGb3JtYXRDb250ZXh0ICpzMSwgY29uc3Qgc3RydWN0IEgyNjNJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuLCBpbnQgZWJpdHMsIGludCBtKQoreworICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIFB1dEJpdENvbnRleHQgcGI7CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgcy0+YnVmLCAzMik7CisgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgLyogRiAtIDAsIG1vZGUgQSAqLworICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7IC8qIFAgLSAwLCBub3JtYWwgSS9QICovCisgICAgcHV0X2JpdHMoJnBiLCAzLCAwKTsgLyogU0JJVCAtIDAgYml0cyAqLworICAgIHB1dF9iaXRzKCZwYiwgMywgZWJpdHMpOyAvKiBFQklUICovCisgICAgcHV0X2JpdHMoJnBiLCAzLCBpbmZvLT5zcmMpOyAvKiBTUkMgLSBzb3VyY2UgZm9ybWF0ICovCisgICAgcHV0X2JpdHMoJnBiLCAxLCBpbmZvLT5pKTsgLyogSSAtIGludGVyL2ludHJhICovCisgICAgcHV0X2JpdHMoJnBiLCAxLCBpbmZvLT51KTsgLyogVSAtIHVucmVzdHJpY3RlZCBtb3Rpb24gdmVjdG9yICovCisgICAgcHV0X2JpdHMoJnBiLCAxLCBpbmZvLT5zKTsgLyogUyAtIHN5bnRheC1iYWVzZCBhcml0aG1ldGljIGNvZGluZyAqLworICAgIHB1dF9iaXRzKCZwYiwgMSwgaW5mby0+YSk7IC8qIEEgLSBhZHZhbmNlZCBwcmVkaWN0aW9uICovCisgICAgcHV0X2JpdHMoJnBiLCA0LCAwKTsgLyogUiAtIHJlc2VydmVkICovCisgICAgcHV0X2JpdHMoJnBiLCAyLCAwKTsgLyogREJRIC0gMCAqLworICAgIHB1dF9iaXRzKCZwYiwgMywgMCk7IC8qIFRSQiAtIDAgKi8KKyAgICBwdXRfYml0cygmcGIsIDgsIGluZm8tPnRyKTsgLyogVFIgKi8KKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworICAgIG1lbWNweShzLT5idWYgKyA0LCBidWYsIGxlbik7CisKKyAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBzLT5idWYsIGxlbiArIDQsIG0pOworfQorCitzdGF0aWMgdm9pZCBzZW5kX21vZGVfYihBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCBzdHJ1Y3QgSDI2M0luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgSDI2M1N0YXRlICpzdGF0ZSwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHNiaXRzLCBpbnQgZWJpdHMsIGludCBtKQoreworICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIFB1dEJpdENvbnRleHQgcGI7CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgcy0+YnVmLCA2NCk7CisgICAgcHV0X2JpdHMoJnBiLCAxLCAxKTsgLyogRiAtIDEsIG1vZGUgQiAqLworICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7IC8qIFAgLSAwLCBtb2RlIEIgKi8KKyAgICBwdXRfYml0cygmcGIsIDMsIHNiaXRzKTsgLyogU0JJVCAtIDAgYml0cyAqLworICAgIHB1dF9iaXRzKCZwYiwgMywgZWJpdHMpOyAvKiBFQklUIC0gMCBiaXRzICovCisgICAgcHV0X2JpdHMoJnBiLCAzLCBpbmZvLT5zcmMpOyAvKiBTUkMgLSBzb3VyY2UgZm9ybWF0ICovCisgICAgcHV0X2JpdHMoJnBiLCA1LCBzdGF0ZS0+cXVhbnQpOyAvKiBRVUFOVCAtIHF1YW50aXplciBmb3IgdGhlIGZpcnN0IE1CICovCisgICAgcHV0X2JpdHMoJnBiLCA1LCBzdGF0ZS0+Z29ibik7IC8qIEdPQk4gLSBHT0IgbnVtYmVyICovCisgICAgcHV0X2JpdHMoJnBiLCA5LCBzdGF0ZS0+bWJhKTsgLyogTUJBIC0gTUIgYWRkcmVzcyAqLworICAgIHB1dF9iaXRzKCZwYiwgMiwgMCk7IC8qIFIgLSByZXNlcnZlZCAqLworICAgIHB1dF9iaXRzKCZwYiwgMSwgaW5mby0+aSk7IC8qIEkgLSBpbnRlci9pbnRyYSAqLworICAgIHB1dF9iaXRzKCZwYiwgMSwgaW5mby0+dSk7IC8qIFUgLSB1bnJlc3RyaWN0ZWQgbW90aW9uIHZlY3RvciAqLworICAgIHB1dF9iaXRzKCZwYiwgMSwgaW5mby0+cyk7IC8qIFMgLSBzeW50YXgtYmFlc2QgYXJpdGhtZXRpYyBjb2RpbmcgKi8KKyAgICBwdXRfYml0cygmcGIsIDEsIGluZm8tPmEpOyAvKiBBIC0gYWR2YW5jZWQgcHJlZGljdGlvbiAqLworICAgIHB1dF9iaXRzKCZwYiwgNywgc3RhdGUtPmhtdjEpOyAvKiBIVk0xIC0gaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIDEgKi8KKyAgICBwdXRfYml0cygmcGIsIDcsIHN0YXRlLT52bXYxKTsgLyogVk1WMSAtIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgMSAqLworICAgIHB1dF9iaXRzKCZwYiwgNywgc3RhdGUtPmhtdjIpOyAvKiBIVk0yIC0gaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIDIgKi8KKyAgICBwdXRfYml0cygmcGIsIDcsIHN0YXRlLT52bXYyKTsgLyogVk1WMiAtIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgMiAqLworICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgbWVtY3B5KHMtPmJ1ZiArIDgsIGJ1ZiwgbGVuKTsKKworICAgIGZmX3J0cF9zZW5kX2RhdGEoczEsIHMtPmJ1ZiwgbGVuICsgOCwgbSk7Cit9CisKK3ZvaWQgZmZfcnRwX3NlbmRfaDI2M19yZmMyMTkwKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptYl9pbmZvLCBpbnQgbWJfaW5mb19zaXplKQoreworICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIGludCBsZW4sIHNiaXRzID0gMCwgZWJpdHMgPSAwOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgc3RydWN0IEgyNjNJbmZvIGluZm8gPSB7IDAgfTsKKyAgICBzdHJ1Y3QgSDI2M1N0YXRlIHN0YXRlID0geyAwIH07CisgICAgaW50IG1iX2luZm9fcG9zID0gMCwgbWJfaW5mb19jb3VudCA9IG1iX2luZm9fc2l6ZSAvIDEyOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9iYXNlID0gYnVmOworCisgICAgcy0+dGltZXN0YW1wID0gcy0+Y3VyX3RpbWVzdGFtcDsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIHNpemUqOCk7CisgICAgaWYgKGdldF9iaXRzKCZnYiwgMjIpID09IDB4MjApIHsgLyogUGljdHVyZSBTdGFydCBDb2RlICovCisgICAgICAgIGluZm8udHIgID0gZ2V0X2JpdHMoJmdiLCA4KTsKKyAgICAgICAgc2tpcF9iaXRzKCZnYiwgMik7IC8qIFBUWVBFIHN0YXJ0LCBIMjYxIGRpc2FtYmlndWF0aW9uICovCisgICAgICAgIHNraXBfYml0cygmZ2IsIDMpOyAvKiBTcGxpdCBzY3JlZW4sIGRvY3VtZW50IGNhbWVyYSwgZnJlZXplIHBpY3R1cmUgcmVsZWFzZSAqLworICAgICAgICBpbmZvLnNyYyA9IGdldF9iaXRzKCZnYiwgMyk7CisgICAgICAgIGluZm8uaSAgID0gZ2V0X2JpdHMoJmdiLCAxKTsKKyAgICAgICAgaW5mby51ICAgPSBnZXRfYml0cygmZ2IsIDEpOworICAgICAgICBpbmZvLnMgICA9IGdldF9iaXRzKCZnYiwgMSk7CisgICAgICAgIGluZm8uYSAgID0gZ2V0X2JpdHMoJmdiLCAxKTsKKyAgICAgICAgaW5mby5wYiAgPSBnZXRfYml0cygmZ2IsIDEpOworICAgIH0KKworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBzdHJ1Y3QgSDI2M1N0YXRlIHBhY2tldF9zdGFydF9zdGF0ZSA9IHN0YXRlOworICAgICAgICBsZW4gPSBGRk1JTihzLT5tYXhfcGF5bG9hZF9zaXplIC0gOCwgc2l6ZSk7CisKKyAgICAgICAgLyogTG9vayBmb3IgYSBiZXR0ZXIgcGxhY2UgdG8gc3BsaXQgdGhlIGZyYW1lIGludG8gcGFja2V0cy4gKi8KKyAgICAgICAgaWYgKGxlbiA8IHNpemUpIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IGZmX2gyNjNfZmluZF9yZXN5bmNfbWFya2VyX3JldmVyc2UoYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgKyBsZW4pOworICAgICAgICAgICAgbGVuID0gZW5kIC0gYnVmOworICAgICAgICAgICAgaWYgKGxlbiA9PSBzLT5tYXhfcGF5bG9hZF9zaXplIC0gOCkgeworICAgICAgICAgICAgICAgIC8qIFNraXAgbWIgaW5mbyBwcmlvciB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcHRyICovCisgICAgICAgICAgICAgICAgd2hpbGUgKG1iX2luZm9fcG9zIDwgbWJfaW5mb19jb3VudCkgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3MgPSBBVl9STDMyKCZtYl9pbmZvWzEyKm1iX2luZm9fcG9zXSkvODsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBidWYgLSBidWZfYmFzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBtYl9pbmZvX3BvcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBGaW5kIHRoZSBmaXJzdCBtYiBpbmZvIHBhc3QgdGhlIGVuZCBwb2ludGVyICovCisgICAgICAgICAgICAgICAgd2hpbGUgKG1iX2luZm9fcG9zICsgMSA8IG1iX2luZm9fY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG9zID0gQVZfUkwzMigmbWJfaW5mb1sxMioobWJfaW5mb19wb3MgKyAxKV0pLzg7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gZW5kIC0gYnVmX2Jhc2UpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgbWJfaW5mb19wb3MrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1iX2luZm9fcG9zIDwgbWJfaW5mb19jb3VudCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAmbWJfaW5mb1sxMiptYl9pbmZvX3Bvc107CisgICAgICAgICAgICAgICAgICAgIC8qIGdldCBwb3NpdGlvbiBpbiBiaXRzIGluIHRoZSBpbnB1dCBwYWNrZXQgYXQgd2hpY2ggdGhlIG5leHQgaW5mbyBibG9jayBzaG91bGQgYmUgdXNlZCAqLworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiaXRfcG9zID0gQVZfUkwzMihwdHIpOworICAgICAgICAgICAgICAgICAgICAvKiBnZXQgcG9zaXRpb24gaW4gYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG9zX25leHRfbWJfaW5mbyA9IChiaXRfcG9zICsgNykvODsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgZGF0YSBmcm9tIHRoZSBuZXh0IE1CIGluZm8gYmxvY2sgc2hvdWxkIGJlIHVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvc19uZXh0X21iX2luZm8gPD0gZW5kIC0gYnVmX2Jhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnF1YW50ID0gcHRyWzRdOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZ29ibiAgPSBwdHJbNV07CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tYmEgICA9IEFWX1JMMTYoJnB0cls2XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5obXYxICA9IChpbnQ4X3QpIHB0cls4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnZtdjEgID0gKGludDhfdCkgcHRyWzldOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaG12MiAgPSAoaW50OF90KSBwdHJbMTBdOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudm12MiAgPSAoaW50OF90KSBwdHJbMTFdOworICAgICAgICAgICAgICAgICAgICAgICAgZWJpdHMgPSA4ICogcG9zX25leHRfbWJfaW5mbyAtIGJpdF9wb3M7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gICA9IHBvc19uZXh0X21iX2luZm8gLSAoYnVmIC0gYnVmX2Jhc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgbWJfaW5mb19wb3MrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNwbGl0IEgyNjMgcGFja2V0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIC1tYl9pbmZvICVkIG9yIC1wcyAxLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1heF9wYXlsb2FkX3NpemUgLSA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2l6ZSA+IDIgJiYgIWJ1ZlswXSAmJiAhYnVmWzFdKQorICAgICAgICAgICAgc2VuZF9tb2RlX2EoczEsICZpbmZvLCBidWYsIGxlbiwgZWJpdHMsIGxlbiA9PSBzaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VuZF9tb2RlX2IoczEsICZpbmZvLCAmcGFja2V0X3N0YXJ0X3N0YXRlLCBidWYsIGxlbiwgc2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBlYml0cywgbGVuID09IHNpemUpOworCisgICAgICAgIGlmIChlYml0cykgeworICAgICAgICAgICAgc2JpdHMgPSA4IC0gZWJpdHM7CisgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNiaXRzID0gMDsKKyAgICAgICAgfQorICAgICAgICBidWYgICs9IGxlbjsKKyAgICAgICAgc2l6ZSAtPSBsZW47CisgICAgICAgIGViaXRzID0gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX2gyNjQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfaDI2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYjJlZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX2gyNjQuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogUlRQIHBhY2tldGl6YXRpb24gZm9yIEguMjY0IChSRkMzOTg0KQorICogQ29weXJpZ2h0IChjKSAyMDA4IEx1Y2EgQWJlbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIEguMjY0IHBhY2tldGl6YXRpb24KKyAqIEBhdXRob3IgTHVjYSBBYmVuaSA8bHVjYWJlNzJAZW1haWwuaXQ+CisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZjLmgiCisjaW5jbHVkZSAicnRwZW5jLmgiCisKK3N0YXRpYyB2b2lkIG5hbF9zZW5kKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsIGludCBsYXN0KQoreworICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworCisgICAgYXZfbG9nKHMxLCBBVl9MT0dfREVCVUcsICJTZW5kaW5nIE5BTCAleCBvZiBsZW4gJWQgTT0lZFxuIiwgYnVmWzBdICYgMHgxRiwgc2l6ZSwgbGFzdCk7CisgICAgaWYgKHNpemUgPD0gcy0+bWF4X3BheWxvYWRfc2l6ZSkgeworICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBidWYsIHNpemUsIGxhc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ4X3QgdHlwZSA9IGJ1ZlswXSAmIDB4MUY7CisgICAgICAgIHVpbnQ4X3QgbnJpID0gYnVmWzBdICYgMHg2MDsKKworICAgICAgICBpZiAocy0+ZmxhZ3MgJiBGRl9SVFBfRkxBR19IMjY0X01PREUwKSB7CisgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTkFMIHNpemUgJWQgPiAlZCwgdHJ5IC1zbGljZS1tYXgtc2l6ZSAlZFxuIiwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBzLT5tYXhfcGF5bG9hZF9zaXplLCBzLT5tYXhfcGF5bG9hZF9zaXplKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coczEsIEFWX0xPR19ERUJVRywgIk5BTCBzaXplICVkID4gJWRcbiIsIHNpemUsIHMtPm1heF9wYXlsb2FkX3NpemUpOworICAgICAgICBzLT5idWZbMF0gPSAyODsgICAgICAgIC8qIEZVIEluZGljYXRvcjsgVHlwZSA9IDI4IC0tLT4gRlUtQSAqLworICAgICAgICBzLT5idWZbMF0gfD0gbnJpOworICAgICAgICBzLT5idWZbMV0gPSB0eXBlOworICAgICAgICBzLT5idWZbMV0gfD0gMSA8PCA3OworICAgICAgICBidWYgKz0gMTsKKyAgICAgICAgc2l6ZSAtPSAxOworICAgICAgICB3aGlsZSAoc2l6ZSArIDIgPiBzLT5tYXhfcGF5bG9hZF9zaXplKSB7CisgICAgICAgICAgICBtZW1jcHkoJnMtPmJ1ZlsyXSwgYnVmLCBzLT5tYXhfcGF5bG9hZF9zaXplIC0gMik7CisgICAgICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBzLT5idWYsIHMtPm1heF9wYXlsb2FkX3NpemUsIDApOworICAgICAgICAgICAgYnVmICs9IHMtPm1heF9wYXlsb2FkX3NpemUgLSAyOworICAgICAgICAgICAgc2l6ZSAtPSBzLT5tYXhfcGF5bG9hZF9zaXplIC0gMjsKKyAgICAgICAgICAgIHMtPmJ1ZlsxXSAmPSB+KDEgPDwgNyk7CisgICAgICAgIH0KKyAgICAgICAgcy0+YnVmWzFdIHw9IDEgPDwgNjsKKyAgICAgICAgbWVtY3B5KCZzLT5idWZbMl0sIGJ1Ziwgc2l6ZSk7CisgICAgICAgIGZmX3J0cF9zZW5kX2RhdGEoczEsIHMtPmJ1Ziwgc2l6ZSArIDIsIGxhc3QpOworICAgIH0KK30KKwordm9pZCBmZl9ydHBfc2VuZF9oMjY0KEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZjEsIGludCBzaXplKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnIsICplbmQgPSBidWYxICsgc2l6ZTsKKyAgICBSVFBNdXhDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKKworICAgIHMtPnRpbWVzdGFtcCA9IHMtPmN1cl90aW1lc3RhbXA7CisgICAgaWYgKHMtPm5hbF9sZW5ndGhfc2l6ZSkKKyAgICAgICAgciA9IGZmX2F2Y19tcDRfZmluZF9zdGFydGNvZGUoYnVmMSwgZW5kLCBzLT5uYWxfbGVuZ3RoX3NpemUpID8gYnVmMSA6IGVuZDsKKyAgICBlbHNlCisgICAgICAgIHIgPSBmZl9hdmNfZmluZF9zdGFydGNvZGUoYnVmMSwgZW5kKTsKKyAgICB3aGlsZSAociA8IGVuZCkgeworICAgICAgICBjb25zdCB1aW50OF90ICpyMTsKKworICAgICAgICBpZiAocy0+bmFsX2xlbmd0aF9zaXplKSB7CisgICAgICAgICAgICByMSA9IGZmX2F2Y19tcDRfZmluZF9zdGFydGNvZGUociwgZW5kLCBzLT5uYWxfbGVuZ3RoX3NpemUpOworICAgICAgICAgICAgaWYgKCFyMSkKKyAgICAgICAgICAgICAgICByMSA9IGVuZDsKKyAgICAgICAgICAgIHIgKz0gcy0+bmFsX2xlbmd0aF9zaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2hpbGUgKCEqKHIrKykpOworICAgICAgICAgICAgcjEgPSBmZl9hdmNfZmluZF9zdGFydGNvZGUociwgZW5kKTsKKyAgICAgICAgfQorICAgICAgICBuYWxfc2VuZChzMSwgciwgcjEgLSByLCByMSA9PSBlbmQpOworICAgICAgICByID0gcjE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY19oZXZjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX2hldmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTY2MWZhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY19oZXZjLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBSVFAgcGFja2V0aXplciBmb3IgSEVWQy9ILjI2NSBwYXlsb2FkIGZvcm1hdCAoZHJhZnQgdmVyc2lvbiA2KQorICogQ29weXJpZ2h0IChjKSAyMDE0IFRob21hcyBWb2xrZXJ0IDx0aG9tYXNAaG9tZXItY29uZmVyZW5jaW5nLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Yy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicnRwZW5jLmgiCisKKyNkZWZpbmUgUlRQX0hFVkNfSEVBREVSU19TSVpFIDMKKworc3RhdGljIHZvaWQgbmFsX3NlbmQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgaW50IGxhc3RfcGFja2V0X29mX2ZyYW1lKQoreworICAgIFJUUE11eENvbnRleHQgKnJ0cF9jdHggPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcnRwX3BheWxvYWRfc2l6ZSAgID0gcnRwX2N0eC0+bWF4X3BheWxvYWRfc2l6ZSAtIFJUUF9IRVZDX0hFQURFUlNfU0laRTsKKyAgICBpbnQgbmFsX3R5cGUgICAgICAgICAgID0gKGJ1ZlswXSA+PiAxKSAmIDB4M0Y7CisKKyAgICAvKiBzZW5kIGl0IGFzIG9uZSBzaW5nbGUgTkFMIHVuaXQ/ICovCisgICAgaWYgKGxlbiA8PSBydHBfY3R4LT5tYXhfcGF5bG9hZF9zaXplKSB7CisgICAgICAgIC8qIHVzZSB0aGUgb3JpZ2luYWwgTkFMIHVuaXQgYnVmZmVyIGFuZCB0cmFuc21pdCBpdCBhcyBSVFAgcGF5bG9hZCAqLworICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKGN0eCwgYnVmLCBsZW4sIGxhc3RfcGFja2V0X29mX2ZyYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgIGNyZWF0ZSB0aGUgSEVWQyBwYXlsb2FkIGhlYWRlciBhbmQgdHJhbnNtaXQgdGhlIGJ1ZmZlciBhcyBmcmFnbWVudGF0aW9uIHVuaXRzIChGVSkKKworICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgfEZ8ICAgVHlwZSAgICB8ICBMYXllcklkICB8IFRJRCB8CisgICAgICAgICAgICArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKKworICAgICAgICAgICAgICAgRiAgICAgICA9IDAKKyAgICAgICAgICAgICAgIFR5cGUgICAgPSA0OSAoZnJhZ21lbnRhdGlvbiB1bml0IChGVSkpCisgICAgICAgICAgICAgICBMYXllcklkID0gMAorICAgICAgICAgICAgICAgVElEICAgICA9IDEKKyAgICAgICAgICovCisgICAgICAgIHJ0cF9jdHgtPmJ1ZlswXSA9IDQ5IDw8IDE7CisgICAgICAgIHJ0cF9jdHgtPmJ1ZlsxXSA9IDE7CisKKyAgICAgICAgLyoKKyAgICAgICAgICAgICAgY3JlYXRlIHRoZSBGVSBoZWFkZXIKKworICAgICAgICAgICAgICAwIDEgMiAzIDQgNSA2IDcKKyAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgIHxTfEV8ICBGdVR5cGUgICB8CisgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKKworICAgICAgICAgICAgICAgIFMgICAgICAgPSB2YXJpYWJsZQorICAgICAgICAgICAgICAgIEUgICAgICAgPSB2YXJpYWJsZQorICAgICAgICAgICAgICAgIEZ1VHlwZSAgPSBOQUwgdW5pdCB0eXBlCisgICAgICAgICAqLworICAgICAgICBydHBfY3R4LT5idWZbMl0gID0gbmFsX3R5cGU7CisgICAgICAgIC8qIHNldCB0aGUgUyBiaXQ6IG1hcmsgYXMgc3RhcnQgZnJhZ21lbnQgKi8KKyAgICAgICAgcnRwX2N0eC0+YnVmWzJdIHw9IDEgPDwgNzsKKworICAgICAgICAvKiBwYXNzIHRoZSBvcmlnaW5hbCBOQUwgaGVhZGVyICovCisgICAgICAgIGJ1ZiArPSAyOworICAgICAgICBsZW4gLT0gMjsKKworICAgICAgICB3aGlsZSAobGVuID4gcnRwX3BheWxvYWRfc2l6ZSkgeworICAgICAgICAgICAgLyogY29tcGxldGUgYW5kIHNlbmQgY3VycmVudCBSVFAgcGFja2V0ICovCisgICAgICAgICAgICBtZW1jcHkoJnJ0cF9jdHgtPmJ1ZltSVFBfSEVWQ19IRUFERVJTX1NJWkVdLCBidWYsIHJ0cF9wYXlsb2FkX3NpemUpOworICAgICAgICAgICAgZmZfcnRwX3NlbmRfZGF0YShjdHgsIHJ0cF9jdHgtPmJ1ZiwgcnRwX2N0eC0+bWF4X3BheWxvYWRfc2l6ZSwgMCk7CisKKyAgICAgICAgICAgIGJ1ZiArPSBydHBfcGF5bG9hZF9zaXplOworICAgICAgICAgICAgbGVuIC09IHJ0cF9wYXlsb2FkX3NpemU7CisKKyAgICAgICAgICAgIC8qIHJlc2V0IHRoZSBTIGJpdCAqLworICAgICAgICAgICAgcnRwX2N0eC0+YnVmWzJdICY9IH4oMSA8PCA3KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNldCB0aGUgRSBiaXQ6IG1hcmsgYXMgbGFzdCBmcmFnbWVudCAqLworICAgICAgICBydHBfY3R4LT5idWZbMl0gfD0gMSA8PCA2OworCisgICAgICAgIC8qIGNvbXBsZXRlIGFuZCBzZW5kIGxhc3QgUlRQIHBhY2tldCAqLworICAgICAgICBtZW1jcHkoJnJ0cF9jdHgtPmJ1ZltSVFBfSEVWQ19IRUFERVJTX1NJWkVdLCBidWYsIGxlbik7CisgICAgICAgIGZmX3J0cF9zZW5kX2RhdGEoY3R4LCBydHBfY3R4LT5idWYsIGxlbiArIDIsIGxhc3RfcGFja2V0X29mX2ZyYW1lKTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfcnRwX3NlbmRfaGV2YyhBVkZvcm1hdENvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCAqZnJhbWVfYnVmLCBpbnQgZnJhbWVfc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpuZXh0X05BTF91bml0OworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9wdHIsICpidWZfZW5kID0gZnJhbWVfYnVmICsgZnJhbWVfc2l6ZTsKKyAgICBSVFBNdXhDb250ZXh0ICpydHBfY3R4ID0gY3R4LT5wcml2X2RhdGE7CisKKyAgICAvKiB1c2UgdGhlIGRlZmF1bHQgOTAgS0h6IHRpbWUgc3RhbXAgKi8KKyAgICBydHBfY3R4LT50aW1lc3RhbXAgPSBydHBfY3R4LT5jdXJfdGltZXN0YW1wOworCisgICAgaWYgKHJ0cF9jdHgtPm5hbF9sZW5ndGhfc2l6ZSkKKyAgICAgICAgYnVmX3B0ciA9IGZmX2F2Y19tcDRfZmluZF9zdGFydGNvZGUoZnJhbWVfYnVmLCBidWZfZW5kLCBydHBfY3R4LT5uYWxfbGVuZ3RoX3NpemUpID8gZnJhbWVfYnVmIDogYnVmX2VuZDsKKyAgICBlbHNlCisgICAgICAgIGJ1Zl9wdHIgPSBmZl9hdmNfZmluZF9zdGFydGNvZGUoZnJhbWVfYnVmLCBidWZfZW5kKTsKKworICAgIC8qIGZpbmQgYWxsIE5BTCB1bml0cyBhbmQgc2VuZCB0aGVtIGFzIHNlcGFyYXRlIHBhY2tldHMgKi8KKyAgICB3aGlsZSAoYnVmX3B0ciA8IGJ1Zl9lbmQpIHsKKyAgICAgICAgaWYgKHJ0cF9jdHgtPm5hbF9sZW5ndGhfc2l6ZSkgeworICAgICAgICAgICAgbmV4dF9OQUxfdW5pdCA9IGZmX2F2Y19tcDRfZmluZF9zdGFydGNvZGUoYnVmX3B0ciwgYnVmX2VuZCwgcnRwX2N0eC0+bmFsX2xlbmd0aF9zaXplKTsKKyAgICAgICAgICAgIGlmICghbmV4dF9OQUxfdW5pdCkKKyAgICAgICAgICAgICAgICBuZXh0X05BTF91bml0ID0gYnVmX2VuZDsKKworICAgICAgICAgICAgYnVmX3B0ciArPSBydHBfY3R4LT5uYWxfbGVuZ3RoX3NpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAoISooYnVmX3B0cisrKSkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBuZXh0X05BTF91bml0ID0gZmZfYXZjX2ZpbmRfc3RhcnRjb2RlKGJ1Zl9wdHIsIGJ1Zl9lbmQpOworICAgICAgICB9CisgICAgICAgIC8qIHNlbmQgdGhlIG5leHQgTkFMIHVuaXQgKi8KKyAgICAgICAgbmFsX3NlbmQoY3R4LCBidWZfcHRyLCBuZXh0X05BTF91bml0IC0gYnVmX3B0ciwgbmV4dF9OQUxfdW5pdCA9PSBidWZfZW5kKTsKKworICAgICAgICAvKiBqdW1wIHRvIHRoZSBuZXh0IE5BTCB1bml0ICovCisgICAgICAgIGJ1Zl9wdHIgPSBuZXh0X05BTF91bml0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfanBlZy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY19qcGVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1MzMyOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBlbmNfanBlZy5jCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogUlRQIEpQRUctY29tcHJlc3NlZCB2aWRlbyBQYWNrZXRpemVyLCBSRkMgMjQzNQorICogQ29weXJpZ2h0IChjKSAyMDEyIFNhbXVlbCBQaXRvaXNldAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tanBlZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJydHBlbmMuaCIKKwordm9pZCBmZl9ydHBfc2VuZF9qcGVnKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgUlRQTXV4Q29udGV4dCAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqcXRhYmxlcyA9IE5VTEw7CisgICAgaW50IG5iX3F0YWJsZXMgPSAwOworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90IHcsIGg7CisgICAgdWludDhfdCAqcDsKKyAgICBpbnQgb2ZmID0gMDsgLyogZnJhZ21lbnQgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IEpQRUcgZnJhbWUgKi8KKyAgICBpbnQgbGVuOworICAgIGludCBpOworCisgICAgcy0+YnVmX3B0ciAgID0gcy0+YnVmOworICAgIHMtPnRpbWVzdGFtcCA9IHMtPmN1cl90aW1lc3RhbXA7CisKKyAgICAvKiBjb252ZXJ0IHZpZGVvIHBpeGVsIGRpbWVuc2lvbnMgZnJvbSBwaXhlbHMgdG8gYmxvY2tzICovCisgICAgdyA9IHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+d2lkdGggID4+IDM7CisgICAgaCA9IHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+aGVpZ2h0ID4+IDM7CisKKyAgICAvKiBnZXQgdGhlIHBpeGVsIGZvcm1hdCB0eXBlIG9yIGZhaWwgKi8KKyAgICBpZiAoczEtPnN0cmVhbXNbMF0tPmNvZGVjLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWSjQyMlAgfHwKKyAgICAgICAgKHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfSlBFRyAmJgorICAgICAgICAgczEtPnN0cmVhbXNbMF0tPmNvZGVjLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkpIHsKKyAgICAgICAgdHlwZSA9IDA7CisgICAgfSBlbHNlIGlmIChzMS0+c3RyZWFtc1swXS0+Y29kZWMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZKNDIwUCB8fAorICAgICAgICAgICAgICAgKHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfSlBFRyAmJgorICAgICAgICAgICAgICAgIHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFApKSB7CisgICAgICAgIHR5cGUgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHByZXBhcnNlIHRoZSBoZWFkZXIgZm9yIGdldHRpbmcgc29tZSBpbmZvcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKGJ1ZltpXSAhPSAweGZmKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGJ1ZltpICsgMV0gPT0gRFFUKSB7CisgICAgICAgICAgICBpZiAoYnVmW2kgKyA0XSkKKyAgICAgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiT25seSA4LWJpdCBwcmVjaXNpb24gaXMgc3VwcG9ydGVkLlxuIik7CisKKyAgICAgICAgICAgIC8qIGEgcXVhbnRpemF0aW9uIHRhYmxlIGlzIDY0IGJ5dGVzIGxvbmcgKi8KKyAgICAgICAgICAgIG5iX3F0YWJsZXMgPSBBVl9SQjE2KCZidWZbaSArIDJdKSAvIDY1OworICAgICAgICAgICAgaWYgKGkgKyA0ICsgbmJfcXRhYmxlcyAqIDY1ID4gc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IEpQRUcgaGVhZGVyLiBBYm9ydGVkIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBxdGFibGVzID0gJmJ1ZltpICsgNF07CisgICAgICAgIH0gZWxzZSBpZiAoYnVmW2kgKyAxXSA9PSBTT0YwKSB7CisgICAgICAgICAgICBpZiAoYnVmW2kgKyAxNF0gIT0gMTcgfHwgYnVmW2kgKyAxN10gIT0gMTcpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgMXgxIGNocm9tYSBibG9ja3MgYXJlIHN1cHBvcnRlZC4gQWJvcnRlZCFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChidWZbaSArIDFdID09IFNPUykgeworICAgICAgICAgICAgLyogU09TIGlzIGxhc3QgbWFya2VyIGluIHRoZSBoZWFkZXIgKi8KKyAgICAgICAgICAgIGkgKz0gQVZfUkIxNigmYnVmW2kgKyAyXSkgKyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBza2lwIEpQRUcgaGVhZGVyICovCisgICAgYnVmICArPSBpOworICAgIHNpemUgLT0gaTsKKworICAgIGZvciAoaSA9IHNpemUgLSAyOyBpID49IDA7IGktLSkgeworICAgICAgICBpZiAoYnVmW2ldID09IDB4ZmYgJiYgYnVmW2kgKyAxXSA9PSBFT0kpIHsKKyAgICAgICAgICAgIC8qIFJlbW92ZSB0aGUgRU9JIG1hcmtlciAqLworICAgICAgICAgICAgc2l6ZSA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHAgPSBzLT5idWZfcHRyOworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBpbnQgaGRyX3NpemUgPSA4OworCisgICAgICAgIGlmIChvZmYgPT0gMCAmJiBuYl9xdGFibGVzKQorICAgICAgICAgICAgaGRyX3NpemUgKz0gNCArIDY0ICogbmJfcXRhYmxlczsKKworICAgICAgICAvKiBwYXlsb2FkIG1heCBpbiBvbmUgcGFja2V0ICovCisgICAgICAgIGxlbiA9IEZGTUlOKHNpemUsIHMtPm1heF9wYXlsb2FkX3NpemUgLSBoZHJfc2l6ZSk7CisKKyAgICAgICAgLyogc2V0IG1haW4gaGVhZGVyICovCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIDApOworICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTI0KCZwLCBvZmYpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCB0eXBlKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgMjU1KTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgdyk7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIGgpOworCisgICAgICAgIGlmIChvZmYgPT0gMCAmJiBuYl9xdGFibGVzKSB7CisgICAgICAgICAgICAvKiBzZXQgcXVhbnRpemF0aW9uIHRhYmxlcyBoZWFkZXIgKi8KKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIDApOworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgMCk7CisgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTE2KCZwLCA2NCAqIG5iX3F0YWJsZXMpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfcXRhYmxlczsgaSsrKQorICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmcCwgJnF0YWJsZXNbNjUgKiBpICsgMV0sIDY0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvcHkgcGF5bG9hZCBkYXRhICovCisgICAgICAgIG1lbWNweShwLCBidWYsIGxlbik7CisKKyAgICAgICAgLyogbWFya2VyIGJpdCBpcyBsYXN0IHBhY2tldCBpbiBmcmFtZSAqLworICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBzLT5idWYsIGxlbiArIGhkcl9zaXplLCBzaXplID09IGxlbik7CisKKyAgICAgICAgYnVmICArPSBsZW47CisgICAgICAgIHNpemUgLT0gbGVuOworICAgICAgICBvZmYgICs9IGxlbjsKKyAgICAgICAgcCAgICAgPSBzLT5idWY7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY19sYXRtLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX2xhdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDMwYzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY19sYXRtLmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIFJUUCBQYWNrZXRpemF0aW9uIG9mIE1QRUctNCBBdWRpbyAoUkZDIDMwMTYpCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSnVhbiBDYXJsb3MgUm9kcmlndWV6IDxpbmcuanVhbmNhcmxvc3JvZHJpZ3VlekBob3RtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicnRwZW5jLmgiCisKK3ZvaWQgZmZfcnRwX3NlbmRfbGF0bShBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpidWZmLCBpbnQgc2l6ZSkKK3sKKyAgICAvKiBNUDRBLUxBVE0KKyAgICAgKiBUaGUgUlRQIHBheWxvYWQgZm9ybWF0IHNwZWNpZmljYXRpb24gaXMgZGVzY3JpYmVkIGluIFJGQyAzMDE2CisgICAgICogVGhlIGVuY29kaW5nIHNwZWNpZmljYXRpb25zIGFyZSBwcm92aWRlZCBpbiBJU08vSUVDIDE0NDk2LTMgKi8KKworICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIGludCBoZWFkZXJfc2l6ZTsKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBpbnQgbGVuICAgID0gMDsKKworICAgIC8qIHNraXAgQURUUyBoZWFkZXIsIGlmIHByZXNlbnQgKi8KKyAgICBpZiAoKHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpID09IDApIHsKKyAgICAgICAgc2l6ZSAtPSA3OworICAgICAgICBidWZmICs9IDc7CisgICAgfQorCisgICAgLyogUGF5bG9hZExlbmd0aEluZm8oKSAqLworICAgIGhlYWRlcl9zaXplID0gc2l6ZS8weEZGICsgMTsKKyAgICBtZW1zZXQocy0+YnVmLCAweEZGLCBoZWFkZXJfc2l6ZSAtIDEpOworICAgIHMtPmJ1ZltoZWFkZXJfc2l6ZSAtIDFdID0gc2l6ZSAlIDB4RkY7CisKKyAgICBzLT50aW1lc3RhbXAgPSBzLT5jdXJfdGltZXN0YW1wOworCisgICAgLyogUGF5bG9hZE11eCgpICovCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGxlbiAgID0gRkZNSU4oc2l6ZSwgcy0+bWF4X3BheWxvYWRfc2l6ZSAtICghb2Zmc2V0ID8gaGVhZGVyX3NpemUgOiAwKSk7CisgICAgICAgIHNpemUgLT0gbGVuOworICAgICAgICBpZiAoIW9mZnNldCkgeworICAgICAgICAgICAgbWVtY3B5KHMtPmJ1ZiArIGhlYWRlcl9zaXplLCBidWZmLCBsZW4pOworICAgICAgICAgICAgZmZfcnRwX3NlbmRfZGF0YShzMSwgcy0+YnVmLCBoZWFkZXJfc2l6ZSArIGxlbiwgIXNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmZfcnRwX3NlbmRfZGF0YShzMSwgYnVmZiArIG9mZnNldCwgbGVuLCAhc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IGxlbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX21wdi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY19tcHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQ1ZjUxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY19tcHYuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIFJUUCBwYWNrZXRpemF0aW9uIGZvciBNUEVHIHZpZGVvCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTHVjYSBBYmVuaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicnRwZW5jLmgiCisKKy8qIE5PVEU6IGEgc2luZ2xlIGZyYW1lIG11c3QgYmUgcGFzc2VkIHdpdGggc2VxdWVuY2UgaGVhZGVyIGlmCisgICBuZWVkZWQuIFhYWDogdXNlIHNsaWNlcy4gKi8KK3ZvaWQgZmZfcnRwX3NlbmRfbXBlZ3ZpZGVvKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZjEsIGludCBzaXplKQoreworICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIGludCBsZW4sIGgsIG1heF9wYWNrZXRfc2l6ZTsKKyAgICB1aW50OF90ICpxOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IGJ1ZjEgKyBzaXplOworICAgIGludCBiZWdpbl9vZl9zbGljZSwgZW5kX29mX3NsaWNlLCBmcmFtZV90eXBlLCB0ZW1wb3JhbF9yZWZlcmVuY2U7CisKKyAgICBtYXhfcGFja2V0X3NpemUgPSBzLT5tYXhfcGF5bG9hZF9zaXplOworICAgIGJlZ2luX29mX3NsaWNlID0gMTsKKyAgICBlbmRfb2Zfc2xpY2UgPSAwOworICAgIGZyYW1lX3R5cGUgPSAwOworICAgIHRlbXBvcmFsX3JlZmVyZW5jZSA9IDA7CisKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgaW50IGJlZ2luX29mX3NlcXVlbmNlOworCisgICAgICAgIGJlZ2luX29mX3NlcXVlbmNlID0gMDsKKyAgICAgICAgbGVuID0gbWF4X3BhY2tldF9zaXplIC0gNDsKKworICAgICAgICBpZiAobGVuID49IHNpemUpIHsKKyAgICAgICAgICAgIGxlbiA9IHNpemU7CisgICAgICAgICAgICBlbmRfb2Zfc2xpY2UgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqciwgKnIxOworICAgICAgICAgICAgaW50IHN0YXJ0X2NvZGU7CisKKyAgICAgICAgICAgIHIxID0gYnVmMTsKKyAgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgICAgc3RhcnRfY29kZSA9IC0xOworICAgICAgICAgICAgICAgIHIgPSBhdnByaXZfZmluZF9zdGFydF9jb2RlKHIxLCBlbmQsICZzdGFydF9jb2RlKTsKKyAgICAgICAgICAgICAgICBpZigoc3RhcnRfY29kZSAmIDB4RkZGRkZGMDApID09IDB4MTAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBzdGFydCBjb2RlIGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydF9jb2RlID09IDB4MTAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV90eXBlID0gKHJbMV0gJiAweDM4KSA+PiAzOworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxfcmVmZXJlbmNlID0gKGludClyWzBdIDw8IDIgfCByWzFdID4+IDY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NvZGUgPT0gMHgxQjgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luX29mX3NlcXVlbmNlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChyIC0gYnVmMSAtIDQgPD0gbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCBzbGljZSBmaXRzIGluIHRoZSBwYWNrZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZWdpbl9vZl9zbGljZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gc2xpY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0Li4uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX29mX3NsaWNlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSByIC0gYnVmMSAtIDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9IHI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHIxIC0gYnVmMSA+IDQpICYmIChyIC0gcjEgPCBtYXhfcGFja2V0X3NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcjEgLSBidWYxIC0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfb2Zfc2xpY2UgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBoID0gMDsKKyAgICAgICAgaCB8PSB0ZW1wb3JhbF9yZWZlcmVuY2UgPDwgMTY7CisgICAgICAgIGggfD0gYmVnaW5fb2Zfc2VxdWVuY2UgPDwgMTM7CisgICAgICAgIGggfD0gYmVnaW5fb2Zfc2xpY2UgPDwgMTI7CisgICAgICAgIGggfD0gZW5kX29mX3NsaWNlIDw8IDExOworICAgICAgICBoIHw9IGZyYW1lX3R5cGUgPDwgODsKKworICAgICAgICBxID0gcy0+YnVmOworICAgICAgICAqcSsrID0gaCA+PiAyNDsKKyAgICAgICAgKnErKyA9IGggPj4gMTY7CisgICAgICAgICpxKysgPSBoID4+IDg7CisgICAgICAgICpxKysgPSBoOworCisgICAgICAgIG1lbWNweShxLCBidWYxLCBsZW4pOworICAgICAgICBxICs9IGxlbjsKKworICAgICAgICAvKiA5MGtIeiB0aW1lIHN0YW1wICovCisgICAgICAgIHMtPnRpbWVzdGFtcCA9IHMtPmN1cl90aW1lc3RhbXA7CisgICAgICAgIGZmX3J0cF9zZW5kX2RhdGEoczEsIHMtPmJ1ZiwgcSAtIHMtPmJ1ZiwgKGxlbiA9PSBzaXplKSk7CisKKyAgICAgICAgYnVmMSArPSBsZW47CisgICAgICAgIHNpemUgLT0gbGVuOworICAgICAgICBiZWdpbl9vZl9zbGljZSA9IGVuZF9vZl9zbGljZTsKKyAgICAgICAgZW5kX29mX3NsaWNlID0gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX3ZwOC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY192cDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzFkMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY192cDguYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogUlRQIFZQOCBQYWNrZXRpemVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSm9zaCBBbGxtYW5uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJydHBlbmMuaCIKKworLyogQmFzZWQgb24gYSBkcmFmdCBzcGVjIGZvciBWUDggUlRQLgorICogKCBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLXBheWxvYWQtdnA4LTA1ICkgKi8KK3ZvaWQgZmZfcnRwX3NlbmRfdnA4KEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgUlRQTXV4Q29udGV4dCAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgaW50IGxlbiwgbWF4X3BhY2tldF9zaXplLCBoZWFkZXJfc2l6ZTsKKworICAgIHMtPmJ1Zl9wdHIgICAgICA9IHMtPmJ1ZjsKKyAgICBzLT50aW1lc3RhbXAgICAgPSBzLT5jdXJfdGltZXN0YW1wOworCisgICAgLy8gZXh0ZW5kZWQgY29udHJvbCBiaXQgc2V0LCByZWZlcmVuY2UgZnJhbWUsIHN0YXJ0IG9mIHBhcnRpdGlvbiwKKyAgICAvLyBwYXJ0aXRpb24gaWQgMAorICAgICpzLT5idWZfcHRyKysgPSAweDkwOworICAgICpzLT5idWZfcHRyKysgPSAweDgwOyAvLyBQaWN0dXJlIGlkIHByZXNlbnQKKyAgICAqcy0+YnVmX3B0cisrID0gcy0+ZnJhbWVfY291bnQrKyAmIDB4N2Y7CisgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzCisgICAgaGVhZGVyX3NpemUgICAgID0gcy0+YnVmX3B0ciAtIHMtPmJ1ZjsKKyAgICBtYXhfcGFja2V0X3NpemUgPSBzLT5tYXhfcGF5bG9hZF9zaXplIC0gaGVhZGVyX3NpemU7CisKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgbGVuID0gRkZNSU4oc2l6ZSwgbWF4X3BhY2tldF9zaXplKTsKKworICAgICAgICBtZW1jcHkocy0+YnVmX3B0ciwgYnVmLCBsZW4pOworICAgICAgICAvLyBtYXJrZXIgYml0IGlzIGxhc3QgcGFja2V0IGluIGZyYW1lCisgICAgICAgIGZmX3J0cF9zZW5kX2RhdGEoczEsIHMtPmJ1ZiwgbGVuICsgaGVhZGVyX3NpemUsIHNpemUgPT0gbGVuKTsKKworICAgICAgICBzaXplICAgICAgICAgLT0gbGVuOworICAgICAgICBidWYgICAgICAgICAgKz0gbGVuOworICAgICAgICAvLyBDbGVhciB0aGUgcGFydGl0aW9uIHN0YXJ0IGJpdCwga2VlcCB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyIHVudG91Y2hlZAorICAgICAgICBzLT5idWZbMF0gICAgJj0gfjB4MTA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY194aXBoLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwZW5jX3hpcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQwY2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cGVuY194aXBoLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBSVFAgcGFja2V0aXphdGlvbiBmb3IgWGlwaCBhdWRpbyBhbmQgdmlkZW8KKyAqIENvcHlyaWdodCAoYykgMjAxMCBKb3NoIEFsbG1hbm4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicnRwZW5jLmgiCisKKy8qKgorICogUGFja2V0aXplIFhpcGggZnJhbWVzIGludG8gUlRQIGFjY29yZGluZyB0bworICogUkZDIDUyMTUgKFZvcmJpcykgYW5kIHRoZSBUaGVvcmEgUkZDIGRyYWZ0LgorICogKGh0dHA6Ly9zdm4ueGlwaC5vcmcvdHJ1bmsvdGhlb3JhL2RvYy9kcmFmdC1pZXRmLWF2dC1ydHAtdGhlb3JhLTAwLnR4dCkKKyAqLwordm9pZCBmZl9ydHBfc2VuZF94aXBoKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmYsIGludCBzaXplKQoreworICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOworICAgIGludCBtYXhfcGt0X3NpemUsIHhkdCwgZnJhZzsKKyAgICB1aW50OF90ICpxOworCisgICAgbWF4X3BrdF9zaXplID0gcy0+bWF4X3BheWxvYWRfc2l6ZTsKKworICAgIC8vIHNldCB4aXBoIGRhdGEgdHlwZQorICAgIHN3aXRjaCAoKmJ1ZmYpIHsKKyAgICBjYXNlIDB4MDE6ICAgLy8gdm9yYmlzIGlkCisgICAgY2FzZSAweDA1OiAgIC8vIHZvcmJpcyBzZXR1cAorICAgIGNhc2UgMHg4MDogICAvLyB0aGVvcmEgaGVhZGVyCisgICAgY2FzZSAweDgyOiAgIC8vIHRoZW9yYSB0YWJsZXMKKyAgICAgICAgeGR0ID0gMTsgLy8gcGFja2VkIGNvbmZpZyBwYXlsb2FkCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMzogICAvLyB2b3JiaXMgY29tbWVudHMKKyAgICBjYXNlIDB4ODE6ICAgLy8gdGhlb3JhIGNvbW1lbnRzCisgICAgICAgIHhkdCA9IDI7IC8vIGNvbW1lbnQgcGF5bG9hZAorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB4ZHQgPSAwOyAvLyByYXcgZGF0YSBwYXlsb2FkCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFNldCBpZGVudC4KKyAgICAvLyBQcm9iYWJseSBuZWVkIGEgbm9uLWZpeGVkIHdheSBvZiBnZW5lcmF0aW5nCisgICAgLy8gdGhpcywgYnV0IGl0IGhhcyB0byBiZSBkb25lIGluIFNEUCBhbmQgcGFzc2VkIGluIGZyb20gdGhlcmUuCisgICAgcSA9IHMtPmJ1ZjsKKyAgICAqcSsrID0gKFJUUF9YSVBIX0lERU5UID4+IDE2KSAmIDB4ZmY7CisgICAgKnErKyA9IChSVFBfWElQSF9JREVOVCA+PiAgOCkgJiAweGZmOworICAgICpxKysgPSAoUlRQX1hJUEhfSURFTlQgICAgICApICYgMHhmZjsKKworICAgIC8vIHNldCBmcmFnbWVudAorICAgIC8vIDAgLSB3aG9sZSBmcmFtZSAocG9zc2libHkgbXVsdGlwbGUgZnJhbWVzKQorICAgIC8vIDEgLSBmaXJzdCBmcmFnbWVudAorICAgIC8vIDIgLSBmcmFnbWVudCBjb250aW51YXRpb24KKyAgICAvLyAzIC0gbGFzdCBmcmFnbWVtZW50CisgICAgZnJhZyA9IHNpemUgPD0gbWF4X3BrdF9zaXplID8gMCA6IDE7CisKKyAgICBpZiAoIWZyYWcgJiYgIXhkdCkgeyAvLyBkbyB3ZSBoYXZlIGEgd2hvbGUgZnJhbWUgb2YgcmF3IGRhdGE/CisgICAgICAgIHVpbnQ4X3QgKmVuZF9wdHIgPSBzLT5idWYgKyA2ICsgbWF4X3BrdF9zaXplOyAvLyB3aGF0IHdlJ3JlIGFsbG93ZWQgdG8gd3JpdGUKKyAgICAgICAgdWludDhfdCAqcHRyICAgICA9IHMtPmJ1Zl9wdHIgKyAyICsgc2l6ZTsgLy8gd2hhdCB3ZSdyZSBnb2luZyB0byB3cml0ZQorICAgICAgICBpbnQgcmVtYWluaW5nICAgID0gZW5kX3B0ciAtIHB0cjsKKworICAgICAgICBhdl9hc3NlcnQxKHMtPm51bV9mcmFtZXMgPD0gcy0+bWF4X2ZyYW1lc19wZXJfcGFja2V0KTsKKyAgICAgICAgaWYgKChzLT5udW1fZnJhbWVzID4gMCAmJiByZW1haW5pbmcgPCAwKSB8fAorICAgICAgICAgICAgcy0+bnVtX2ZyYW1lcyA9PSBzLT5tYXhfZnJhbWVzX3Blcl9wYWNrZXQpIHsKKyAgICAgICAgICAgIC8vIHNlbmQgcHJldmlvdXMgcGFja2V0cyBub3c7IG5vIHJvb20gZm9yIG5ldyBkYXRhCisgICAgICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBzLT5idWYsIHMtPmJ1Zl9wdHIgLSBzLT5idWYsIDApOworICAgICAgICAgICAgcy0+bnVtX2ZyYW1lcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBidWZmZXIgY3VycmVudCBmcmFtZSB0byBzZW5kIGxhdGVyCisgICAgICAgIGlmICgwID09IHMtPm51bV9mcmFtZXMpIHMtPnRpbWVzdGFtcCA9IHMtPmN1cl90aW1lc3RhbXA7CisgICAgICAgIHMtPm51bV9mcmFtZXMrKzsKKworICAgICAgICAvLyBTZXQgcGFja2V0IGhlYWRlci4gTm9ybWFsbHksIHRoaXMgaXMgT1InZCB3aXRoIGZyYWcgYW5kIHhkdCwKKyAgICAgICAgLy8gYnV0IHRob3NlIGFyZSB6ZXJvLCBzbyBvbWl0dGVkIGhlcmUKKyAgICAgICAgKnErKyA9IHMtPm51bV9mcmFtZXM7CisKKyAgICAgICAgaWYgKHMtPm51bV9mcmFtZXMgPiAxKSBxID0gcy0+YnVmX3B0cjsgLy8ganVtcCBhaGVhZCBpZiBuZWVkZWQKKyAgICAgICAgKnErKyA9IChzaXplID4+IDgpICYgMHhmZjsKKyAgICAgICAgKnErKyA9IHNpemUgJiAweGZmOworICAgICAgICBtZW1jcHkocSwgYnVmZiwgc2l6ZSk7CisgICAgICAgIHEgKz0gc2l6ZTsKKyAgICAgICAgcy0+YnVmX3B0ciA9IHE7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAocy0+bnVtX2ZyYW1lcykgeworICAgICAgICAvLyBpbW1lZGlhdGVseSBzZW5kIGJ1ZmZlcmVkIGZyYW1lcyBpZiBidWZmZXIgaXMgbm90IHJhdyBkYXRhLAorICAgICAgICAvLyBvciBpZiBjdXJyZW50IGZyYW1lIGlzIGZyYWdtZW50ZWQuCisgICAgICAgIGZmX3J0cF9zZW5kX2RhdGEoczEsIHMtPmJ1Ziwgcy0+YnVmX3B0ciAtIHMtPmJ1ZiwgMCk7CisgICAgfQorCisgICAgcy0+dGltZXN0YW1wID0gcy0+Y3VyX3RpbWVzdGFtcDsKKyAgICBzLT5udW1fZnJhbWVzID0gMDsKKyAgICBzLT5idWZfcHRyID0gcTsKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgaW50IGxlbiA9ICghZnJhZyB8fCBmcmFnID09IDMpID8gc2l6ZSA6IG1heF9wa3Rfc2l6ZTsKKyAgICAgICAgcSA9IHMtPmJ1Zl9wdHI7CisKKyAgICAgICAgLy8gc2V0IHBhY2tldCBoZWFkZXJzCisgICAgICAgICpxKysgPSAoZnJhZyA8PCA2KSB8ICh4ZHQgPDwgNCk7IC8vIG51bV9mcmFtZXMgPSAwCisgICAgICAgICpxKysgPSAobGVuID4+IDgpICYgMHhmZjsKKyAgICAgICAgKnErKyA9IGxlbiAmIDB4ZmY7CisgICAgICAgIC8vIHNldCBwYWNrZXQgYm9keQorICAgICAgICBtZW1jcHkocSwgYnVmZiwgbGVuKTsKKyAgICAgICAgcSArPSBsZW47CisgICAgICAgIGJ1ZmYgKz0gbGVuOworICAgICAgICBzaXplIC09IGxlbjsKKworICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBzLT5idWYsIHEgLSBzLT5idWYsIDApOworCisgICAgICAgIGZyYWcgPSBzaXplIDw9IG1heF9wa3Rfc2l6ZSA/IDMgOiAyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBwcm90by5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0cHByb3RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhOTU2OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBwcm90by5jCkBAIC0wLDAgKzEsNTczIEBACisvKgorICogUlRQIG5ldHdvcmsgcHJvdG9jb2wKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUlRQIHByb3RvY29sCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAicnRwLmgiCisjaW5jbHVkZSAicnRwcHJvdG8uaCIKKyNpbmNsdWRlICJ1cmwuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibmV0d29yay5oIgorI2luY2x1ZGUgIm9zX3N1cHBvcnQuaCIKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmIEhBVkVfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBSVFBDb250ZXh0IHsKKyAgICBVUkxDb250ZXh0ICpydHBfaGQsICpydGNwX2hkOworICAgIGludCBydHBfZmQsIHJ0Y3BfZmQsIG5iX3NzbV9pbmNsdWRlX2FkZHJzLCBuYl9zc21fZXhjbHVkZV9hZGRyczsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqKnNzbV9pbmNsdWRlX2FkZHJzLCAqKnNzbV9leGNsdWRlX2FkZHJzOworICAgIGludCB3cml0ZV90b19zb3VyY2U7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgbGFzdF9ydHBfc291cmNlLCBsYXN0X3J0Y3Bfc291cmNlOworICAgIHNvY2tsZW5fdCBsYXN0X3J0cF9zb3VyY2VfbGVuLCBsYXN0X3J0Y3Bfc291cmNlX2xlbjsKK30gUlRQQ29udGV4dDsKKworLyoqCisgKiBJZiBubyBmaWxlbmFtZSBpcyBnaXZlbiB0byBhdl9vcGVuX2lucHV0X2ZpbGUgYmVjYXVzZSB5b3Ugd2FudCB0bworICogZ2V0IHRoZSBsb2NhbCBwb3J0IGZpcnN0LCB0aGVuIHlvdSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZXQKKyAqIHRoZSByZW1vdGUgc2VydmVyIGFkZHJlc3MuCisgKgorICogQHBhcmFtIGggbWVkaWEgZmlsZSBjb250ZXh0CisgKiBAcGFyYW0gdXJpIG9mIHRoZSByZW1vdGUgc2VydmVyCisgKiBAcmV0dXJuIHplcm8gaWYgbm8gZXJyb3IuCisgKi8KKworaW50IGZmX3J0cF9zZXRfcmVtb3RlX3VybChVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmkpCit7CisgICAgUlRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBjaGFyIGhvc3RuYW1lWzI1Nl07CisgICAgaW50IHBvcnQsIHJ0Y3BfcG9ydDsKKyAgICBjb25zdCBjaGFyICpwOworCisgICAgY2hhciBidWZbMTAyNF07CisgICAgY2hhciBwYXRoWzEwMjRdOworCisgICAgYXZfdXJsX3NwbGl0KE5VTEwsIDAsIE5VTEwsIDAsIGhvc3RuYW1lLCBzaXplb2YoaG9zdG5hbWUpLCAmcG9ydCwKKyAgICAgICAgICAgICAgICAgcGF0aCwgc2l6ZW9mKHBhdGgpLCB1cmkpOworICAgIHJ0Y3BfcG9ydCA9IHBvcnQgKyAxOworCisgICAgcCA9IHN0cmNocih1cmksICc/Jyk7CisgICAgaWYgKHApIHsKKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgInJ0Y3Bwb3J0IiwgcCkpIHsKKyAgICAgICAgICAgIHJ0Y3BfcG9ydCA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZmX3VybF9qb2luKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ1ZHAiLCBOVUxMLCBob3N0bmFtZSwgcG9ydCwgIiVzIiwgcGF0aCk7CisgICAgZmZfdWRwX3NldF9yZW1vdGVfdXJsKHMtPnJ0cF9oZCwgYnVmKTsKKworICAgIGZmX3VybF9qb2luKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ1ZHAiLCBOVUxMLCBob3N0bmFtZSwgcnRjcF9wb3J0LCAiJXMiLCBwYXRoKTsKKyAgICBmZl91ZHBfc2V0X3JlbW90ZV91cmwocy0+cnRjcF9oZCwgYnVmKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyaW5mbyogcnRwX3Jlc29sdmVfaG9zdChjb25zdCBjaGFyICpob3N0bmFtZSwgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgZmFtaWx5LCBpbnQgZmxhZ3MpCit7CisgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzID0geyAwIH0sICpyZXMgPSAwOworICAgIGludCBlcnJvcjsKKyAgICBjaGFyIHNlcnZpY2VbMTZdOworCisgICAgc25wcmludGYoc2VydmljZSwgc2l6ZW9mKHNlcnZpY2UpLCAiJWQiLCBwb3J0KTsKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IHR5cGU7CisgICAgaGludHMuYWlfZmFtaWx5ICAgPSBmYW1pbHk7CisgICAgaGludHMuYWlfZmxhZ3MgICAgPSBmbGFnczsKKyAgICBpZiAoKGVycm9yID0gZ2V0YWRkcmluZm8oaG9zdG5hbWUsIHNlcnZpY2UsICZoaW50cywgJnJlcykpKSB7CisgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJydHBfcmVzb2x2ZV9ob3N0OiAlc1xuIiwgZ2FpX3N0cmVycm9yKGVycm9yKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBjb21wYXJlX2FkZHIoY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYikKK3sKKyAgICBpZiAoYS0+c3NfZmFtaWx5ICE9IGItPnNzX2ZhbWlseSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKGEtPnNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICAgIHJldHVybiAoKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhKS0+c2luX2FkZHIuc19hZGRyICE9CisgICAgICAgICAgICAgICAgKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKiliKS0+c2luX2FkZHIuc19hZGRyKTsKKyAgICB9CisKKyNpZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjYKKyAgICBpZiAoYS0+c3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnM2X2FkZHJfYSA9ICgoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqKWEpLT5zaW42X2FkZHIuczZfYWRkcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqczZfYWRkcl9iID0gKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYiktPnNpbjZfYWRkci5zNl9hZGRyOworICAgICAgICByZXR1cm4gbWVtY21wKHM2X2FkZHJfYSwgczZfYWRkcl9iLCAxNik7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNzKQoreworICAgIGlmIChzcy0+c3NfZmFtaWx5ID09IEFGX0lORVQpCisgICAgICAgIHJldHVybiBudG9ocygoKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNzKS0+c2luX3BvcnQpOworI2lmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX0lONgorICAgIGlmIChzcy0+c3NfZmFtaWx5ID09IEFGX0lORVQ2KQorICAgICAgICByZXR1cm4gbnRvaHMoKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc3MpLT5zaW42X3BvcnQpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wb3J0KHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpzcywgaW50IHBvcnQpCit7CisgICAgaWYgKHNzLT5zc19mYW1pbHkgPT0gQUZfSU5FVCkKKyAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzcyktPnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisjaWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42CisgICAgZWxzZSBpZiAoc3MtPnNzX2ZhbWlseSA9PSBBRl9JTkVUNikKKyAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc3MpLT5zaW42X3BvcnQgPSBodG9ucyhwb3J0KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHJ0cF9jaGVja19zb3VyY2VfbGlzdHMoUlRQQ29udGV4dCAqcywgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNvdXJjZV9hZGRyX3B0cikKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAocy0+bmJfc3NtX2V4Y2x1ZGVfYWRkcnMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3NzbV9leGNsdWRlX2FkZHJzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghY29tcGFyZV9hZGRyKHNvdXJjZV9hZGRyX3B0ciwgcy0+c3NtX2V4Y2x1ZGVfYWRkcnNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5uYl9zc21faW5jbHVkZV9hZGRycykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3NtX2luY2x1ZGVfYWRkcnM7IGkrKykgeworICAgICAgICAgICAgaWYgKCFjb21wYXJlX2FkZHIoc291cmNlX2FkZHJfcHRyLCBzLT5zc21faW5jbHVkZV9hZGRyc1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIGFkZCBvcHRpb24gdG8gdXJsIG9mIHRoZSBmb3JtOgorICogImh0dHA6Ly9ob3N0OnBvcnQvcGF0aD9vcHRpb24xPXZhbDEmb3B0aW9uMj12YWwyLi4uCisgKi8KKworc3RhdGljIGF2X3ByaW50Zl9mb3JtYXQoMywgNCkgdm9pZCB1cmxfYWRkX29wdGlvbihjaGFyICpidWYsIGludCBidWZfc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgY2hhciBidWYxWzEwMjRdOworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBpZiAoc3RyY2hyKGJ1ZiwgJz8nKSkKKyAgICAgICAgYXZfc3RybGNhdChidWYsICImIiwgYnVmX3NpemUpOworICAgIGVsc2UKKyAgICAgICAgYXZfc3RybGNhdChidWYsICI/IiwgYnVmX3NpemUpOworICAgIHZzbnByaW50ZihidWYxLCBzaXplb2YoYnVmMSksIGZtdCwgYXApOworICAgIGF2X3N0cmxjYXQoYnVmLCBidWYxLCBidWZfc2l6ZSk7CisgICAgdmFfZW5kKGFwKTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfdWRwX3VybChjaGFyICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdG5hbWUsIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYWxfcG9ydCwgaW50IHR0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9wYWNrZXRfc2l6ZSwgaW50IGNvbm5lY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbmNsdWRlX3NvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4Y2x1ZGVfc291cmNlcykKK3sKKyAgICBmZl91cmxfam9pbihidWYsIGJ1Zl9zaXplLCAidWRwIiwgTlVMTCwgaG9zdG5hbWUsIHBvcnQsIE5VTEwpOworICAgIGlmIChsb2NhbF9wb3J0ID49IDApCisgICAgICAgIHVybF9hZGRfb3B0aW9uKGJ1ZiwgYnVmX3NpemUsICJsb2NhbHBvcnQ9JWQiLCBsb2NhbF9wb3J0KTsKKyAgICBpZiAodHRsID49IDApCisgICAgICAgIHVybF9hZGRfb3B0aW9uKGJ1ZiwgYnVmX3NpemUsICJ0dGw9JWQiLCB0dGwpOworICAgIGlmIChtYXhfcGFja2V0X3NpemUgPj0wKQorICAgICAgICB1cmxfYWRkX29wdGlvbihidWYsIGJ1Zl9zaXplLCAicGt0X3NpemU9JWQiLCBtYXhfcGFja2V0X3NpemUpOworICAgIGlmIChjb25uZWN0KQorICAgICAgICB1cmxfYWRkX29wdGlvbihidWYsIGJ1Zl9zaXplLCAiY29ubmVjdD0xIik7CisgICAgaWYgKGRzY3AgPj0gMCkKKyAgICAgICAgdXJsX2FkZF9vcHRpb24oYnVmLCBidWZfc2l6ZSwgImRzY3A9JWQiLCBkc2NwKTsKKyAgICB1cmxfYWRkX29wdGlvbihidWYsIGJ1Zl9zaXplLCAiZmlmb19zaXplPTAiKTsKKyAgICBpZiAoaW5jbHVkZV9zb3VyY2VzICYmIGluY2x1ZGVfc291cmNlc1swXSkKKyAgICAgICAgdXJsX2FkZF9vcHRpb24oYnVmLCBidWZfc2l6ZSwgInNvdXJjZXM9JXMiLCBpbmNsdWRlX3NvdXJjZXMpOworICAgIGlmIChleGNsdWRlX3NvdXJjZXMgJiYgZXhjbHVkZV9zb3VyY2VzWzBdKQorICAgICAgICB1cmxfYWRkX29wdGlvbihidWYsIGJ1Zl9zaXplLCAiYmxvY2s9JXMiLCBleGNsdWRlX3NvdXJjZXMpOworfQorCitzdGF0aWMgdm9pZCBydHBfcGFyc2VfYWRkcl9saXN0KFVSTENvbnRleHQgKmgsIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKioqYWRkcmVzc19saXN0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICphZGRyZXNzX2xpc3Rfc2l6ZV9wdHIpCit7CisgICAgc3RydWN0IGFkZHJpbmZvICphaSA9IE5VTEw7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNvdXJjZV9hZGRyOworICAgIGNoYXIgdG1wID0gJ1wwJywgKnAgPSBidWYsICpuZXh0OworCisgICAgLyogUmVzb2x2ZSBhbGwgb2YgdGhlIElQcyAqLworCisgICAgd2hpbGUgKHAgJiYgcFswXSkgeworICAgICAgICBuZXh0ID0gc3RyY2hyKHAsICcsJyk7CisKKyAgICAgICAgaWYgKG5leHQpIHsKKyAgICAgICAgICAgIHRtcCA9ICpuZXh0OworICAgICAgICAgICAgKm5leHQgPSAnXDAnOworICAgICAgICB9CisKKyAgICAgICAgYWkgPSBydHBfcmVzb2x2ZV9ob3N0KHAsIDAsIFNPQ0tfREdSQU0sIEFGX1VOU1BFQywgMCk7CisgICAgICAgIGlmIChhaSkgeworICAgICAgICAgICAgc291cmNlX2FkZHIgPSBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSkpOworICAgICAgICAgICAgaWYgKCFzb3VyY2VfYWRkcikgeworICAgICAgICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbWNweShzb3VyY2VfYWRkciwgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKTsKKyAgICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgICAgICAgICBkeW5hcnJheV9hZGQoYWRkcmVzc19saXN0X3B0ciwgYWRkcmVzc19saXN0X3NpemVfcHRyLCBzb3VyY2VfYWRkcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICJVbmFibGUgdG8gcmVzb2x2ZSAlc1xuIiwgcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmV4dCkgeworICAgICAgICAgICAgKm5leHQgPSB0bXA7CisgICAgICAgICAgICBwID0gbmV4dCArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiB1cmwgc3ludGF4OiBydHA6Ly9ob3N0OnBvcnRbP29wdGlvbj12YWwuLi5dCisgKiBvcHRpb246ICd0dGw9bicgICAgICAgICAgICA6IHNldCB0aGUgdHRsIHZhbHVlIChmb3IgbXVsdGljYXN0IG9ubHkpCisgKiAgICAgICAgICdydGNwcG9ydD1uJyAgICAgICA6IHNldCB0aGUgcmVtb3RlIHJ0Y3AgcG9ydCB0byBuCisgKiAgICAgICAgICdsb2NhbHJ0cHBvcnQ9bicgICA6IHNldCB0aGUgbG9jYWwgcnRwIHBvcnQgdG8gbgorICogICAgICAgICAnbG9jYWxydGNwcG9ydD1uJyAgOiBzZXQgdGhlIGxvY2FsIHJ0Y3AgcG9ydCB0byBuCisgKiAgICAgICAgICdwa3Rfc2l6ZT1uJyAgICAgICA6IHNldCBtYXggcGFja2V0IHNpemUKKyAqICAgICAgICAgJ2Nvbm5lY3Q9MC8xJyAgICAgIDogZG8gYSBjb25uZWN0KCkgb24gdGhlIFVEUCBzb2NrZXQKKyAqICAgICAgICAgJ3NvdXJjZXM9aXBbLGlwXScgIDogbGlzdCBhbGxvd2VkIHNvdXJjZSBJUCBhZGRyZXNzZXMKKyAqICAgICAgICAgJ2Jsb2NrPWlwWyxpcF0nICAgIDogbGlzdCBkaXNhbGxvd2VkIHNvdXJjZSBJUCBhZGRyZXNzZXMKKyAqICAgICAgICAgJ3dyaXRlX3RvX3NvdXJjZT0wLzEnIDogc2VuZCBwYWNrZXRzIHRvIHRoZSBzb3VyY2UgYWRkcmVzcyBvZiB0aGUgbGF0ZXN0IHJlY2VpdmVkIHBhY2tldAorICogICAgICAgICAnZHNjcD1uJyAgICAgICAgICAgOiBzZXQgRFNDUCB2YWx1ZSB0byBuIChRb1MpCisgKiBkZXByZWNhdGVkIG9wdGlvbjoKKyAqICAgICAgICAgJ2xvY2FscG9ydD1uJyAgICAgIDogc2V0IHRoZSBsb2NhbCBwb3J0IHRvIG4KKyAqCisgKiBpZiBydGNwcG9ydCBpc24ndCBzZXQgdGhlIHJ0Y3AgcG9ydCB3aWxsIGJlIHRoZSBydHAgcG9ydCArIDEKKyAqIGlmIGxvY2FsIHJ0cCBwb3J0IGlzbid0IHNldCBhbnkgYXZhaWxhYmxlIHBvcnQgd2lsbCBiZSB1c2VkIGZvciB0aGUgbG9jYWwKKyAqIHJ0cCBhbmQgcnRjcCBwb3J0cworICogaWYgdGhlIGxvY2FsIHJ0Y3AgcG9ydCBpcyBub3Qgc2V0IGl0IHdpbGwgYmUgdGhlIGxvY2FsIHJ0cCBwb3J0ICsgMQorICovCisKK3N0YXRpYyBpbnQgcnRwX29wZW4oVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqdXJpLCBpbnQgZmxhZ3MpCit7CisgICAgUlRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgcnRwX3BvcnQsIHJ0Y3BfcG9ydCwKKyAgICAgICAgdHRsLCBjb25uZWN0LAorICAgICAgICBsb2NhbF9ydHBfcG9ydCwgbG9jYWxfcnRjcF9wb3J0LCBtYXhfcGFja2V0X3NpemUsIGRzY3A7CisgICAgY2hhciBob3N0bmFtZVsyNTZdLCBpbmNsdWRlX3NvdXJjZXNbMTAyNF0gPSAiIiwgZXhjbHVkZV9zb3VyY2VzWzEwMjRdID0gIiI7CisgICAgY2hhciBidWZbMTAyNF07CisgICAgY2hhciBwYXRoWzEwMjRdOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaW50IGksIG1heF9yZXRyeV9jb3VudCA9IDM7CisKKyAgICBhdl91cmxfc3BsaXQoTlVMTCwgMCwgTlVMTCwgMCwgaG9zdG5hbWUsIHNpemVvZihob3N0bmFtZSksICZydHBfcG9ydCwKKyAgICAgICAgICAgICAgICAgcGF0aCwgc2l6ZW9mKHBhdGgpLCB1cmkpOworICAgIC8qIGV4dHJhY3QgcGFyYW1ldGVycyAqLworICAgIHR0bCA9IC0xOworICAgIHJ0Y3BfcG9ydCA9IHJ0cF9wb3J0KzE7CisgICAgbG9jYWxfcnRwX3BvcnQgPSAtMTsKKyAgICBsb2NhbF9ydGNwX3BvcnQgPSAtMTsKKyAgICBtYXhfcGFja2V0X3NpemUgPSAtMTsKKyAgICBjb25uZWN0ID0gMDsKKyAgICBkc2NwID0gLTE7CisKKyAgICBwID0gc3RyY2hyKHVyaSwgJz8nKTsKKyAgICBpZiAocCkgeworICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAidHRsIiwgcCkpIHsKKyAgICAgICAgICAgIHR0bCA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAicnRjcHBvcnQiLCBwKSkgeworICAgICAgICAgICAgcnRjcF9wb3J0ID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJsb2NhbHBvcnQiLCBwKSkgeworICAgICAgICAgICAgbG9jYWxfcnRwX3BvcnQgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImxvY2FscnRwcG9ydCIsIHApKSB7CisgICAgICAgICAgICBsb2NhbF9ydHBfcG9ydCA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAibG9jYWxydGNwcG9ydCIsIHApKSB7CisgICAgICAgICAgICBsb2NhbF9ydGNwX3BvcnQgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgInBrdF9zaXplIiwgcCkpIHsKKyAgICAgICAgICAgIG1heF9wYWNrZXRfc2l6ZSA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAiY29ubmVjdCIsIHApKSB7CisgICAgICAgICAgICBjb25uZWN0ID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ3cml0ZV90b19zb3VyY2UiLCBwKSkgeworICAgICAgICAgICAgcy0+d3JpdGVfdG9fc291cmNlID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJkc2NwIiwgcCkpIHsKKyAgICAgICAgICAgIGRzY3AgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgInNvdXJjZXMiLCBwKSkgeworICAgICAgICAgICAgYXZfc3RybGNweShpbmNsdWRlX3NvdXJjZXMsIGJ1Ziwgc2l6ZW9mKGluY2x1ZGVfc291cmNlcykpOworICAgICAgICAgICAgcnRwX3BhcnNlX2FkZHJfbGlzdChoLCBidWYsICZzLT5zc21faW5jbHVkZV9hZGRycywgJnMtPm5iX3NzbV9pbmNsdWRlX2FkZHJzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAiYmxvY2siLCBwKSkgeworICAgICAgICAgICAgYXZfc3RybGNweShleGNsdWRlX3NvdXJjZXMsIGJ1Ziwgc2l6ZW9mKGV4Y2x1ZGVfc291cmNlcykpOworICAgICAgICAgICAgcnRwX3BhcnNlX2FkZHJfbGlzdChoLCBidWYsICZzLT5zc21fZXhjbHVkZV9hZGRycywgJnMtPm5iX3NzbV9leGNsdWRlX2FkZHJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7aSA8IG1heF9yZXRyeV9jb3VudDtpKyspIHsKKyAgICAgICAgYnVpbGRfdWRwX3VybChidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lLCBydHBfcG9ydCwgbG9jYWxfcnRwX3BvcnQsIHR0bCwgbWF4X3BhY2tldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QsIGRzY3AsIGluY2x1ZGVfc291cmNlcywgZXhjbHVkZV9zb3VyY2VzKTsKKyAgICAgICAgaWYgKGZmdXJsX29wZW4oJnMtPnJ0cF9oZCwgYnVmLCBmbGFncywgJmgtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBsb2NhbF9ydHBfcG9ydCA9IGZmX3VkcF9nZXRfbG9jYWxfcG9ydChzLT5ydHBfaGQpOworICAgICAgICBpZihsb2NhbF9ydHBfcG9ydCA9PSA2NTUzNSkgeworICAgICAgICAgICAgbG9jYWxfcnRwX3BvcnQgPSAtMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChsb2NhbF9ydGNwX3BvcnQ8MCkgeworICAgICAgICAgICAgbG9jYWxfcnRjcF9wb3J0ID0gbG9jYWxfcnRwX3BvcnQgKyAxOworICAgICAgICAgICAgYnVpbGRfdWRwX3VybChidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSwgcnRjcF9wb3J0LCBsb2NhbF9ydGNwX3BvcnQsIHR0bCwgbWF4X3BhY2tldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0LCBkc2NwLCBpbmNsdWRlX3NvdXJjZXMsIGV4Y2x1ZGVfc291cmNlcyk7CisgICAgICAgICAgICBpZiAoZmZ1cmxfb3Blbigmcy0+cnRjcF9oZCwgYnVmLCBmbGFncywgJmgtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCkgPCAwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcnRwX3BvcnQgPSBsb2NhbF9ydGNwX3BvcnQgPSAtMTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJ1aWxkX3VkcF91cmwoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSwgcnRjcF9wb3J0LCBsb2NhbF9ydGNwX3BvcnQsIHR0bCwgbWF4X3BhY2tldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QsIGRzY3AsIGluY2x1ZGVfc291cmNlcywgZXhjbHVkZV9zb3VyY2VzKTsKKyAgICAgICAgaWYgKGZmdXJsX29wZW4oJnMtPnJ0Y3BfaGQsIGJ1ZiwgZmxhZ3MsICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyoganVzdCB0byBlYXNlIGhhbmRsZSBhY2Nlc3MuIFhYWDogbmVlZCB0byBzdXBwcmVzcyBkaXJlY3QgaGFuZGxlCisgICAgICAgYWNjZXNzICovCisgICAgcy0+cnRwX2ZkID0gZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKHMtPnJ0cF9oZCk7CisgICAgcy0+cnRjcF9mZCA9IGZmdXJsX2dldF9maWxlX2hhbmRsZShzLT5ydGNwX2hkKTsKKworICAgIGgtPm1heF9wYWNrZXRfc2l6ZSA9IHMtPnJ0cF9oZC0+bWF4X3BhY2tldF9zaXplOworICAgIGgtPmlzX3N0cmVhbWVkID0gMTsKKyAgICByZXR1cm4gMDsKKworIGZhaWw6CisgICAgaWYgKHMtPnJ0cF9oZCkKKyAgICAgICAgZmZ1cmxfY2xvc2Uocy0+cnRwX2hkKTsKKyAgICBpZiAocy0+cnRjcF9oZCkKKyAgICAgICAgZmZ1cmxfY2xvc2Uocy0+cnRjcF9oZCk7CisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworc3RhdGljIGludCBydHBfcmVhZChVUkxDb250ZXh0ICpoLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFJUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IGxlbiwgbiwgaTsKKyAgICBzdHJ1Y3QgcG9sbGZkIHBbMl0gPSB7e3MtPnJ0cF9mZCwgUE9MTElOLCAwfSwge3MtPnJ0Y3BfZmQsIFBPTExJTiwgMH19OworICAgIGludCBwb2xsX2RlbGF5ID0gaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfTk9OQkxPQ0sgPyAwIDogMTAwOworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyc1syXSA9IHsgJnMtPmxhc3RfcnRwX3NvdXJjZSwgJnMtPmxhc3RfcnRjcF9zb3VyY2UgfTsKKyAgICBzb2NrbGVuX3QgKmFkZHJfbGVuc1syXSA9IHsgJnMtPmxhc3RfcnRwX3NvdXJjZV9sZW4sICZzLT5sYXN0X3J0Y3Bfc291cmNlX2xlbiB9OworCisgICAgZm9yKDs7KSB7CisgICAgICAgIGlmIChmZl9jaGVja19pbnRlcnJ1cHQoJmgtPmludGVycnVwdF9jYWxsYmFjaykpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgICAgICBuID0gcG9sbChwLCAyLCBwb2xsX2RlbGF5KTsKKyAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICAvKiBmaXJzdCB0cnkgUlRDUCwgdGhlbiBSVFAgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaWYgKCEocFtpXS5yZXZlbnRzICYgUE9MTElOKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgKmFkZHJfbGVuc1tpXSA9IHNpemVvZigqYWRkcnNbaV0pOworICAgICAgICAgICAgICAgIGxlbiA9IHJlY3Zmcm9tKHBbaV0uZmQsIGJ1Ziwgc2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJzW2ldLCBhZGRyX2xlbnNbaV0pOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmZl9uZXRlcnJubygpID09IEFWRVJST1IoRUFHQUlOKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZmZfbmV0ZXJybm8oKSA9PSBBVkVSUk9SKEVJTlRSKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocnRwX2NoZWNrX3NvdXJjZV9saXN0cyhzLCBhZGRyc1tpXSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHJldHVybiBsZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIGlmIChmZl9uZXRlcnJubygpID09IEFWRVJST1IoRUlOVFIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfTk9OQkxPQ0spCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgIH0KKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHJ0cF93cml0ZShVUkxDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFJUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKyAgICBVUkxDb250ZXh0ICpoZDsKKworICAgIGlmIChzaXplIDwgMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmIChzLT53cml0ZV90b19zb3VyY2UpIHsKKyAgICAgICAgaW50IGZkOworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc291cmNlLCB0ZW1wX3NvdXJjZTsKKyAgICAgICAgc29ja2xlbl90ICpzb3VyY2VfbGVuLCB0ZW1wX2xlbjsKKyAgICAgICAgaWYgKCFzLT5sYXN0X3J0cF9zb3VyY2Uuc3NfZmFtaWx5ICYmICFzLT5sYXN0X3J0Y3Bfc291cmNlLnNzX2ZhbWlseSkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNlbmQgcGFja2V0IHRvIHNvdXJjZSwgbm8gcGFja2V0cyByZWNlaXZlZCB5ZXRcbiIpOworICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBub3QgcmV0dXJuaW5nIGFuIGVycm9yIGhlcmUKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFJUUF9QVF9JU19SVENQKGJ1ZlsxXSkpIHsKKyAgICAgICAgICAgIGZkID0gcy0+cnRjcF9mZDsKKyAgICAgICAgICAgIHNvdXJjZSAgICAgPSAmcy0+bGFzdF9ydGNwX3NvdXJjZTsKKyAgICAgICAgICAgIHNvdXJjZV9sZW4gPSAmcy0+bGFzdF9ydGNwX3NvdXJjZV9sZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZCA9IHMtPnJ0cF9mZDsKKyAgICAgICAgICAgIHNvdXJjZSAgICAgPSAmcy0+bGFzdF9ydHBfc291cmNlOworICAgICAgICAgICAgc291cmNlX2xlbiA9ICZzLT5sYXN0X3J0cF9zb3VyY2VfbGVuOworICAgICAgICB9CisgICAgICAgIGlmICghc291cmNlLT5zc19mYW1pbHkpIHsKKyAgICAgICAgICAgIHNvdXJjZSAgICAgID0gJnRlbXBfc291cmNlOworICAgICAgICAgICAgc291cmNlX2xlbiAgPSAmdGVtcF9sZW47CisgICAgICAgICAgICBpZiAoUlRQX1BUX0lTX1JUQ1AoYnVmWzFdKSkgeworICAgICAgICAgICAgICAgIHRlbXBfc291cmNlID0gcy0+bGFzdF9ydHBfc291cmNlOworICAgICAgICAgICAgICAgIHRlbXBfbGVuICAgID0gcy0+bGFzdF9ydHBfc291cmNlX2xlbjsKKyAgICAgICAgICAgICAgICBzZXRfcG9ydChzb3VyY2UsIGdldF9wb3J0KHNvdXJjZSkgKyAxKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJOb3QgcmVjZWl2ZWQgYW55IFJUQ1AgcGFja2V0cyB5ZXQsIGluZmVycmluZyBwZWVyIHBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSB0aGUgUlRQIHBvcnRcbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wX3NvdXJjZSA9IHMtPmxhc3RfcnRjcF9zb3VyY2U7CisgICAgICAgICAgICAgICAgdGVtcF9sZW4gICAgPSBzLT5sYXN0X3J0Y3Bfc291cmNlX2xlbjsKKyAgICAgICAgICAgICAgICBzZXRfcG9ydChzb3VyY2UsIGdldF9wb3J0KHNvdXJjZSkgLSAxKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJOb3QgcmVjZWl2ZWQgYW55IFJUUCBwYWNrZXRzIHlldCwgaW5mZXJyaW5nIHBlZXIgcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIHRoZSBSVENQIHBvcnRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCEoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfTk9OQkxPQ0spKSB7CisgICAgICAgICAgICByZXQgPSBmZl9uZXR3b3JrX3dhaXRfZmQoZmQsIDEpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBzZW5kdG8oZmQsIGJ1Ziwgc2l6ZSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAqc291cmNlX2xlbik7CisKKyAgICAgICAgcmV0dXJuIHJldCA8IDAgPyBmZl9uZXRlcnJubygpIDogcmV0OworICAgIH0KKworICAgIGlmIChSVFBfUFRfSVNfUlRDUChidWZbMV0pKSB7CisgICAgICAgIC8qIFJUQ1AgcGF5bG9hZCB0eXBlICovCisgICAgICAgIGhkID0gcy0+cnRjcF9oZDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBSVFAgcGF5bG9hZCB0eXBlICovCisgICAgICAgIGhkID0gcy0+cnRwX2hkOworICAgIH0KKworICAgIHJldCA9IGZmdXJsX3dyaXRlKGhkLCBidWYsIHNpemUpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnRwX2Nsb3NlKFVSTENvbnRleHQgKmgpCit7CisgICAgUlRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zc21faW5jbHVkZV9hZGRyczsgaSsrKQorICAgICAgICBhdl9mcmVlKHMtPnNzbV9pbmNsdWRlX2FkZHJzW2ldKTsKKyAgICBhdl9mcmVlcCgmcy0+c3NtX2luY2x1ZGVfYWRkcnMpOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zc21fZXhjbHVkZV9hZGRyczsgaSsrKQorICAgICAgICBhdl9mcmVlKHMtPnNzbV9leGNsdWRlX2FkZHJzW2ldKTsKKyAgICBhdl9mcmVlcCgmcy0+c3NtX2V4Y2x1ZGVfYWRkcnMpOworCisgICAgZmZ1cmxfY2xvc2Uocy0+cnRwX2hkKTsKKyAgICBmZnVybF9jbG9zZShzLT5ydGNwX2hkKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGxvY2FsIHJ0cCBwb3J0IHVzZWQgYnkgdGhlIFJUUCBjb25uZWN0aW9uCisgKiBAcGFyYW0gaCBtZWRpYSBmaWxlIGNvbnRleHQKKyAqIEByZXR1cm4gdGhlIGxvY2FsIHBvcnQgbnVtYmVyCisgKi8KKworaW50IGZmX3J0cF9nZXRfbG9jYWxfcnRwX3BvcnQoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBSVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl91ZHBfZ2V0X2xvY2FsX3BvcnQocy0+cnRwX2hkKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGxvY2FsIHJ0Y3AgcG9ydCB1c2VkIGJ5IHRoZSBSVFAgY29ubmVjdGlvbgorICogQHBhcmFtIGggbWVkaWEgZmlsZSBjb250ZXh0CisgKiBAcmV0dXJuIHRoZSBsb2NhbCBwb3J0IG51bWJlcgorICovCisKK2ludCBmZl9ydHBfZ2V0X2xvY2FsX3J0Y3BfcG9ydChVUkxDb250ZXh0ICpoKQoreworICAgIFJUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3VkcF9nZXRfbG9jYWxfcG9ydChzLT5ydGNwX2hkKTsKK30KKworc3RhdGljIGludCBydHBfZ2V0X2ZpbGVfaGFuZGxlKFVSTENvbnRleHQgKmgpCit7CisgICAgUlRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gcy0+cnRwX2ZkOworfQorCitzdGF0aWMgaW50IHJ0cF9nZXRfbXVsdGlfZmlsZV9oYW5kbGUoVVJMQ29udGV4dCAqaCwgaW50ICoqaGFuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm51bWhhbmRsZXMpCit7CisgICAgUlRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgKmhzICAgICAgID0gKmhhbmRsZXMgPSBhdl9tYWxsb2Moc2l6ZW9mKCoqaGFuZGxlcykgKiAyKTsKKyAgICBpZiAoIWhzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGhzWzBdID0gcy0+cnRwX2ZkOworICAgIGhzWzFdID0gcy0+cnRjcF9mZDsKKyAgICAqbnVtaGFuZGxlcyA9IDI7CisgICAgcmV0dXJuIDA7Cit9CisKK1VSTFByb3RvY29sIGZmX3J0cF9wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgICAgICA9ICJydHAiLAorICAgIC51cmxfb3BlbiAgICAgICAgICAgICAgICAgID0gcnRwX29wZW4sCisgICAgLnVybF9yZWFkICAgICAgICAgICAgICAgICAgPSBydHBfcmVhZCwKKyAgICAudXJsX3dyaXRlICAgICAgICAgICAgICAgICA9IHJ0cF93cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgICAgICAgICAgICA9IHJ0cF9jbG9zZSwKKyAgICAudXJsX2dldF9maWxlX2hhbmRsZSAgICAgICA9IHJ0cF9nZXRfZmlsZV9oYW5kbGUsCisgICAgLnVybF9nZXRfbXVsdGlfZmlsZV9oYW5kbGUgPSBydHBfZ2V0X211bHRpX2ZpbGVfaGFuZGxlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgICAgID0gc2l6ZW9mKFJUUENvbnRleHQpLAorICAgIC5mbGFncyAgICAgICAgICAgICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRwcHJvdG8uaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHBwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjQzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRwcHJvdG8uaApAQCAtMCwwICsxLDMxIEBACisvKgorICogUlRQIG5ldHdvcmsgcHJvdG9jb2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9SVFBQUk9UT19ICisjZGVmaW5lIEFWRk9STUFUX1JUUFBST1RPX0gKKworI2luY2x1ZGUgInVybC5oIgorCitpbnQgZmZfcnRwX3NldF9yZW1vdGVfdXJsKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSk7CisKK2ludCBmZl9ydHBfZ2V0X2xvY2FsX3J0cF9wb3J0KFVSTENvbnRleHQgKmgpOworaW50IGZmX3J0cF9nZXRfbG9jYWxfcnRjcF9wb3J0KFVSTENvbnRleHQgKmgpOworCisjZW5kaWYgLyogQVZGT1JNQVRfUlRQUFJPVE9fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0c3AuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2MjI1MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHNwLmMKQEAgLTAsMCArMSwyNDAyIEBACisvKgorICogUlRTUC9TRFAgY2xpZW50CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYmFzZTY0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhbmRvbV9zZWVkLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKworI2lmIEhBVkVfUE9MTF9ICisjaW5jbHVkZSA8cG9sbC5oPgorI2VuZGlmCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAib3Nfc3VwcG9ydC5oIgorI2luY2x1ZGUgImh0dHAuaCIKKyNpbmNsdWRlICJydHNwLmgiCisKKyNpbmNsdWRlICJydHBkZWMuaCIKKyNpbmNsdWRlICJydHBwcm90by5oIgorI2luY2x1ZGUgInJkdC5oIgorI2luY2x1ZGUgInJ0cGRlY19mb3JtYXRzLmgiCisjaW5jbHVkZSAicnRwZW5jX2NoYWluLmgiCisjaW5jbHVkZSAidXJsLmgiCisjaW5jbHVkZSAicnRwZW5jLmgiCisjaW5jbHVkZSAibXBlZ3RzLmgiCisKKy8qIFRpbWVvdXQgdmFsdWVzIGZvciBzb2NrZXQgcG9sbCwgaW4gbXMsCisgKiBhbmQgcmVhZF9wYWNrZXQoKSwgaW4gc2Vjb25kcyAgKi8KKyNkZWZpbmUgUE9MTF9USU1FT1VUX01TIDEwMAorI2RlZmluZSBSRUFEX1BBQ0tFVF9USU1FT1VUX1MgMTAKKyNkZWZpbmUgTUFYX1RJTUVPVVRTIFJFQURfUEFDS0VUX1RJTUVPVVRfUyAqIDEwMDAgLyBQT0xMX1RJTUVPVVRfTVMKKyNkZWZpbmUgU0RQX01BWF9TSVpFIDE2Mzg0CisjZGVmaW5lIFJFQ1ZCVUZfU0laRSAxMCAqIFJUUF9NQVhfUEFDS0VUX0xFTkdUSAorI2RlZmluZSBERUZBVUxUX1JFT1JERVJJTkdfREVMQVkgMTAwMDAwCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFJUU1BTdGF0ZSwgeCkKKyNkZWZpbmUgREVDIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCisjZGVmaW5lIEVOQyBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorCisjZGVmaW5lIFJUU1BfRkxBR19PUFRTKG5hbWUsIGxvbmduYW1lKSBcCisgICAgeyBuYW1lLCBsb25nbmFtZSwgT0ZGU0VUKHJ0c3BfZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSAwfSwgSU5UX01JTiwgSU5UX01BWCwgREVDLCAicnRzcF9mbGFncyIgfSwgXAorICAgIHsgImZpbHRlcl9zcmMiLCAib25seSByZWNlaXZlIHBhY2tldHMgZnJvbSB0aGUgbmVnb3RpYXRlZCBwZWVyIElQIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gUlRTUF9GTEFHX0ZJTFRFUl9TUkN9LCAwLCAwLCBERUMsICJydHNwX2ZsYWdzIiB9CisKKyNkZWZpbmUgUlRTUF9NRURJQVRZUEVfT1BUUyhuYW1lLCBsb25nbmFtZSkgXAorICAgIHsgbmFtZSwgbG9uZ25hbWUsIE9GRlNFVChtZWRpYV90eXBlX21hc2spLCBBVl9PUFRfVFlQRV9GTEFHUywgeyAuaTY0ID0gKDEgPDwgKEFWTUVESUFfVFlQRV9EQVRBKzEpKSAtIDEgfSwgSU5UX01JTiwgSU5UX01BWCwgREVDLCAiYWxsb3dlZF9tZWRpYV90eXBlcyIgfSwgXAorICAgIHsgInZpZGVvIiwgIlZpZGVvIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMSA8PCBBVk1FRElBX1RZUEVfVklERU99LCAwLCAwLCBERUMsICJhbGxvd2VkX21lZGlhX3R5cGVzIiB9LCBcCisgICAgeyAiYXVkaW8iLCAiQXVkaW8iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAxIDw8IEFWTUVESUFfVFlQRV9BVURJT30sIDAsIDAsIERFQywgImFsbG93ZWRfbWVkaWFfdHlwZXMiIH0sIFwKKyAgICB7ICJkYXRhIiwgIkRhdGEiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAxIDw8IEFWTUVESUFfVFlQRV9EQVRBfSwgMCwgMCwgREVDLCAiYWxsb3dlZF9tZWRpYV90eXBlcyIgfQorCisjZGVmaW5lIFJUU1BfUkVPUkRFUklOR19PUFRTKCkgXAorICAgIHsgInJlb3JkZXJfcXVldWVfc2l6ZSIsICJzZXQgbnVtYmVyIG9mIHBhY2tldHMgdG8gYnVmZmVyIGZvciBoYW5kbGluZyBvZiByZW9yZGVyZWQgcGFja2V0cyIsIE9GRlNFVChyZW9yZGVyaW5nX3F1ZXVlX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlRfTUFYLCBERUMgfQorCitjb25zdCBBVk9wdGlvbiBmZl9ydHNwX29wdGlvbnNbXSA9IHsKKyAgICB7ICJpbml0aWFsX3BhdXNlIiwgICJkbyBub3Qgc3RhcnQgcGxheWluZyB0aGUgc3RyZWFtIGltbWVkaWF0ZWx5IiwgT0ZGU0VUKGluaXRpYWxfcGF1c2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIERFQyB9LAorICAgIEZGX1JUUF9GTEFHX09QVFMoUlRTUFN0YXRlLCBydHBfbXV4ZXJfZmxhZ3MpLAorICAgIHsgInJ0c3BfdHJhbnNwb3J0IiwgInNldCBSVFNQIHRyYW5zcG9ydCBwcm90b2NvbHMiLCBPRkZTRVQobG93ZXJfdHJhbnNwb3J0X21hc2spLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSAwfSwgSU5UX01JTiwgSU5UX01BWCwgREVDfEVOQywgInJ0c3BfdHJhbnNwb3J0IiB9LCBcCisgICAgeyAidWRwIiwgIlVEUCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IDEgPDwgUlRTUF9MT1dFUl9UUkFOU1BPUlRfVURQfSwgMCwgMCwgREVDfEVOQywgInJ0c3BfdHJhbnNwb3J0IiB9LCBcCisgICAgeyAidGNwIiwgIlRDUCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IDEgPDwgUlRTUF9MT1dFUl9UUkFOU1BPUlRfVENQfSwgMCwgMCwgREVDfEVOQywgInJ0c3BfdHJhbnNwb3J0IiB9LCBcCisgICAgeyAidWRwX211bHRpY2FzdCIsICJVRFAgbXVsdGljYXN0IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMSA8PCBSVFNQX0xPV0VSX1RSQU5TUE9SVF9VRFBfTVVMVElDQVNUfSwgMCwgMCwgREVDLCAicnRzcF90cmFuc3BvcnQiIH0sCisgICAgeyAiaHR0cCIsICJIVFRQIHR1bm5lbGluZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9ICgxIDw8IFJUU1BfTE9XRVJfVFJBTlNQT1JUX0hUVFApfSwgMCwgMCwgREVDLCAicnRzcF90cmFuc3BvcnQiIH0sCisgICAgUlRTUF9GTEFHX09QVFMoInJ0c3BfZmxhZ3MiLCAic2V0IFJUU1AgZmxhZ3MiKSwKKyAgICB7ICJsaXN0ZW4iLCAid2FpdCBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBSVFNQX0ZMQUdfTElTVEVOfSwgMCwgMCwgREVDLCAicnRzcF9mbGFncyIgfSwKKyAgICB7ICJwcmVmZXJfdGNwIiwgInRyeSBSVFAgdmlhIFRDUCBmaXJzdCwgaWYgYXZhaWxhYmxlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gUlRTUF9GTEFHX1BSRUZFUl9UQ1B9LCAwLCAwLCBERUN8RU5DLCAicnRzcF9mbGFncyIgfSwKKyAgICBSVFNQX01FRElBVFlQRV9PUFRTKCJhbGxvd2VkX21lZGlhX3R5cGVzIiwgInNldCBtZWRpYSB0eXBlcyB0byBhY2NlcHQgZnJvbSB0aGUgc2VydmVyIiksCisgICAgeyAibWluX3BvcnQiLCAic2V0IG1pbmltdW0gbG9jYWwgVURQIHBvcnQiLCBPRkZTRVQocnRwX3BvcnRfbWluKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFJUU1BfUlRQX1BPUlRfTUlOfSwgMCwgNjU1MzUsIERFQ3xFTkMgfSwKKyAgICB7ICJtYXhfcG9ydCIsICJzZXQgbWF4aW11bSBsb2NhbCBVRFAgcG9ydCIsIE9GRlNFVChydHBfcG9ydF9tYXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gUlRTUF9SVFBfUE9SVF9NQVh9LCAwLCA2NTUzNSwgREVDfEVOQyB9LAorICAgIHsgInRpbWVvdXQiLCAic2V0IG1heGltdW0gdGltZW91dCAoaW4gc2Vjb25kcykgdG8gd2FpdCBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgKC0xIGlzIGluZmluaXRlLCBpbXBseSBmbGFnIGxpc3RlbikiLCBPRkZTRVQoaW5pdGlhbF90aW1lb3V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgSU5UX01JTiwgSU5UX01BWCwgREVDIH0sCisgICAgeyAic3RpbWVvdXQiLCAic2V0IHRpbWVvdXQgKGluIG1pY3Jvc2Vjb25kcykgb2Ygc29ja2V0IFRDUCBJL08gb3BlcmF0aW9ucyIsIE9GRlNFVChzdGltZW91dCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgSU5UX01JTiwgSU5UX01BWCwgREVDIH0sCisgICAgUlRTUF9SRU9SREVSSU5HX09QVFMoKSwKKyAgICB7ICJ1c2VyLWFnZW50IiwgIm92ZXJyaWRlIFVzZXItQWdlbnQgaGVhZGVyIiwgT0ZGU0VUKHVzZXJfYWdlbnQpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTElCQVZGT1JNQVRfSURFTlR9LCAwLCAwLCBERUMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzZHBfb3B0aW9uc1tdID0geworICAgIFJUU1BfRkxBR19PUFRTKCJzZHBfZmxhZ3MiLCAiU0RQIGZsYWdzIiksCisgICAgeyAiY3VzdG9tX2lvIiwgInVzZSBjdXN0b20gSS9PIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gUlRTUF9GTEFHX0NVU1RPTV9JT30sIDAsIDAsIERFQywgInJ0c3BfZmxhZ3MiIH0sCisgICAgeyAicnRjcF90b19zb3VyY2UiLCAic2VuZCBSVENQIHBhY2tldHMgdG8gdGhlIHNvdXJjZSBhZGRyZXNzIG9mIHJlY2VpdmVkIHBhY2tldHMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBSVFNQX0ZMQUdfUlRDUF9UT19TT1VSQ0V9LCAwLCAwLCBERUMsICJydHNwX2ZsYWdzIiB9LAorICAgIFJUU1BfTUVESUFUWVBFX09QVFMoImFsbG93ZWRfbWVkaWFfdHlwZXMiLCAic2V0IG1lZGlhIHR5cGVzIHRvIGFjY2VwdCBmcm9tIHRoZSBzZXJ2ZXIiKSwKKyAgICBSVFNQX1JFT1JERVJJTkdfT1BUUygpLAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHJ0cF9vcHRpb25zW10gPSB7CisgICAgUlRTUF9GTEFHX09QVFMoInJ0cF9mbGFncyIsICJzZXQgUlRQIGZsYWdzIiksCisgICAgUlRTUF9SRU9SREVSSU5HX09QVFMoKSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyB2b2lkIGdldF93b3JkX3VudGlsX2NoYXJzKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2VwLCBjb25zdCBjaGFyICoqcHApCit7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyICpxOworCisgICAgcCA9ICpwcDsKKyAgICBwICs9IHN0cnNwbihwLCBTUEFDRV9DSEFSUyk7CisgICAgcSA9IGJ1ZjsKKyAgICB3aGlsZSAoIXN0cmNocihzZXAsICpwKSAmJiAqcCAhPSAnXDAnKSB7CisgICAgICAgIGlmICgocSAtIGJ1ZikgPCBidWZfc2l6ZSAtIDEpCisgICAgICAgICAgICAqcSsrID0gKnA7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgaWYgKGJ1Zl9zaXplID4gMCkKKyAgICAgICAgKnEgPSAnXDAnOworICAgICpwcCA9IHA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF93b3JkX3NlcChjaGFyICpidWYsIGludCBidWZfc2l6ZSwgY29uc3QgY2hhciAqc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipwcCkKK3sKKyAgICBpZiAoKipwcCA9PSAnLycpICgqcHApKys7CisgICAgZ2V0X3dvcmRfdW50aWxfY2hhcnMoYnVmLCBidWZfc2l6ZSwgc2VwLCBwcCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF93b3JkKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBjb25zdCBjaGFyICoqcHApCit7CisgICAgZ2V0X3dvcmRfdW50aWxfY2hhcnMoYnVmLCBidWZfc2l6ZSwgU1BBQ0VfQ0hBUlMsIHBwKTsKK30KKworLyoqIFBhcnNlIGEgc3RyaW5nIHAgaW4gdGhlIGZvcm0gb2YgUmFuZ2U6bnB0PXh4LXh4LCBhbmQgZGV0ZXJtaW5lIHRoZSBzdGFydAorICogIGFuZCBlbmQgdGltZS4KKyAqICBVc2VkIGZvciBzZWVraW5nIGluIHRoZSBydHAgc3RyZWFtLgorICovCitzdGF0aWMgdm9pZCBydHNwX3BhcnNlX3JhbmdlX25wdChjb25zdCBjaGFyICpwLCBpbnQ2NF90ICpzdGFydCwgaW50NjRfdCAqZW5kKQoreworICAgIGNoYXIgYnVmWzI1Nl07CisKKyAgICBwICs9IHN0cnNwbihwLCBTUEFDRV9DSEFSUyk7CisgICAgaWYgKCFhdl9zdHJpc3RhcnQocCwgIm5wdD0iLCAmcCkpCisgICAgICAgIHJldHVybjsKKworICAgICpzdGFydCA9IEFWX05PUFRTX1ZBTFVFOworICAgICplbmQgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIGdldF93b3JkX3NlcChidWYsIHNpemVvZihidWYpLCAiLSIsICZwKTsKKyAgICBhdl9wYXJzZV90aW1lKHN0YXJ0LCBidWYsIDEpOworICAgIGlmICgqcCA9PSAnLScpIHsKKyAgICAgICAgcCsrOworICAgICAgICBnZXRfd29yZF9zZXAoYnVmLCBzaXplb2YoYnVmKSwgIi0iLCAmcCk7CisgICAgICAgIGF2X3BhcnNlX3RpbWUoZW5kLCBidWYsIDEpOworICAgIH0KK30KKworc3RhdGljIGludCBnZXRfc29ja2FkZHIoY29uc3QgY2hhciAqYnVmLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc29jaykKK3sKKyAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMgPSB7IDAgfSwgKmFpID0gTlVMTDsKKyAgICBoaW50cy5haV9mbGFncyA9IEFJX05VTUVSSUNIT1NUOworICAgIGlmIChnZXRhZGRyaW5mbyhidWYsIE5VTEwsICZoaW50cywgJmFpKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG1lbWNweShzb2NrLCBhaS0+YWlfYWRkciwgRkZNSU4oc2l6ZW9mKCpzb2NrKSwgYWktPmFpX2FkZHJsZW4pKTsKKyAgICBmcmVlYWRkcmluZm8oYWkpOworICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX1JUUERFQworc3RhdGljIHZvaWQgaW5pdF9ydHBfaGFuZGxlcihSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFNQU3RyZWFtICpydHNwX3N0LCBBVkNvZGVjQ29udGV4dCAqY29kZWMpCit7CisgICAgaWYgKCFoYW5kbGVyKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGNvZGVjKQorICAgICAgICBjb2RlYy0+Y29kZWNfaWQgICAgICAgICAgPSBoYW5kbGVyLT5jb2RlY19pZDsKKyAgICBydHNwX3N0LT5keW5hbWljX2hhbmRsZXIgPSBoYW5kbGVyOworICAgIGlmIChoYW5kbGVyLT5hbGxvYykgeworICAgICAgICBydHNwX3N0LT5keW5hbWljX3Byb3RvY29sX2NvbnRleHQgPSBoYW5kbGVyLT5hbGxvYygpOworICAgICAgICBpZiAoIXJ0c3Bfc3QtPmR5bmFtaWNfcHJvdG9jb2xfY29udGV4dCkKKyAgICAgICAgICAgIHJ0c3Bfc3QtPmR5bmFtaWNfaGFuZGxlciA9IE5VTEw7CisgICAgfQorfQorCisvKiBwYXJzZSB0aGUgcnRwbWFwIGRlc2NyaXB0aW9uOiA8Y29kZWNfbmFtZT4vPGNsb2NrX3JhdGU+Wy88b3RoZXIgcGFyYW1zPl0gKi8KK3N0YXRpYyBpbnQgc2RwX3BhcnNlX3J0cG1hcChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBSVFNQU3RyZWFtICpydHNwX3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXlsb2FkX3R5cGUsIGNvbnN0IGNoYXIgKnApCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gc3QtPmNvZGVjOworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgaW50IGk7CisgICAgQVZDb2RlYyAqYzsKKyAgICBjb25zdCBjaGFyICpjX25hbWU7CisKKyAgICAvKiBTZWUgaWYgd2UgY2FuIGhhbmRsZSB0aGlzIGtpbmQgb2YgcGF5bG9hZC4KKyAgICAgKiBUaGUgc3BhY2Ugc2hvdWxkIG5vcm1hbGx5IG5vdCBiZSB0aGVyZSBidXQgc29tZSBSZWFsIHN0cmVhbXMgb3IKKyAgICAgKiBwYXJ0aWN1bGFyIHNlcnZlcnMgKCJSZWFsU2VydmVyIFZlcnNpb24gNi4xLjMuOTcwIiwgc2VlIGlzc3VlIDE2NTgpCisgICAgICogaGF2ZSBhIHRyYWlsaW5nIHNwYWNlLiAqLworICAgIGdldF93b3JkX3NlcChidWYsIHNpemVvZihidWYpLCAiLyAiLCAmcCk7CisgICAgaWYgKHBheWxvYWRfdHlwZSA8IFJUUF9QVF9QUklWQVRFKSB7CisgICAgICAgIC8qIFdlIGFyZSBpbiBhIHN0YW5kYXJkIGNhc2UKKyAgICAgICAgICogKGZyb20gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9ydHAtcGFyYW1ldGVycykuICovCisgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IGZmX3J0cF9jb2RlY19pZChidWYsIGNvZGVjLT5jb2RlY190eXBlKTsKKyAgICB9CisKKyAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqaGFuZGxlciA9CisgICAgICAgICAgICBmZl9ydHBfaGFuZGxlcl9maW5kX2J5X25hbWUoYnVmLCBjb2RlYy0+Y29kZWNfdHlwZSk7CisgICAgICAgIGluaXRfcnRwX2hhbmRsZXIoaGFuZGxlciwgcnRzcF9zdCwgY29kZWMpOworICAgICAgICAvKiBJZiBubyBkeW5hbWljIGhhbmRsZXIgd2FzIGZvdW5kLCBjaGVjayB3aXRoIHRoZSBsaXN0IG9mIHN0YW5kYXJkCisgICAgICAgICAqIGFsbG9jYXRlZCB0eXBlcywgaWYgc3VjaCBhIHN0cmVhbSBmb3Igc29tZSByZWFzb24gaGFwcGVucyB0bworICAgICAgICAgKiB1c2UgYSBwcml2YXRlIHBheWxvYWQgdHlwZS4gVGhpcyBpc24ndCBoYW5kbGVkIGluIHJ0cGRlYy5jLCBzaW5jZQorICAgICAgICAgKiB0aGUgZm9ybWF0IG5hbWUgZnJvbSB0aGUgcnRwbWFwIGxpbmUgbmV2ZXIgaXMgcGFzc2VkIGludG8gcnRwZGVjLiAqLworICAgICAgICBpZiAoIXJ0c3Bfc3QtPmR5bmFtaWNfaGFuZGxlcikKKyAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IGZmX3J0cF9jb2RlY19pZChidWYsIGNvZGVjLT5jb2RlY190eXBlKTsKKyAgICB9CisKKyAgICBjID0gYXZjb2RlY19maW5kX2RlY29kZXIoY29kZWMtPmNvZGVjX2lkKTsKKyAgICBpZiAoYyAmJiBjLT5uYW1lKQorICAgICAgICBjX25hbWUgPSBjLT5uYW1lOworICAgIGVsc2UKKyAgICAgICAgY19uYW1lID0gIihudWxsKSI7CisKKyAgICBnZXRfd29yZF9zZXAoYnVmLCBzaXplb2YoYnVmKSwgIi8iLCAmcCk7CisgICAgaSA9IGF0b2koYnVmKTsKKyAgICBzd2l0Y2ggKGNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJhdWRpbyBjb2RlYyBzZXQgdG86ICVzXG4iLCBjX25hbWUpOworICAgICAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBSVFNQX0RFRkFVTFRfQVVESU9fU0FNUExFUkFURTsKKyAgICAgICAgY29kZWMtPmNoYW5uZWxzID0gUlRTUF9ERUZBVUxUX05CX0FVRElPX0NIQU5ORUxTOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfcmF0ZSA9IGk7CisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgY29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIGdldF93b3JkX3NlcChidWYsIHNpemVvZihidWYpLCAiLyIsICZwKTsKKyAgICAgICAgICAgIGkgPSBhdG9pKGJ1Zik7CisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgY29kZWMtPmNoYW5uZWxzID0gaTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiYXVkaW8gc2FtcGxlcmF0ZSBzZXQgdG86ICVpXG4iLAorICAgICAgICAgICAgICAgY29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImF1ZGlvIGNoYW5uZWxzIHNldCB0bzogJWlcbiIsCisgICAgICAgICAgICAgICBjb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInZpZGVvIGNvZGVjIHNldCB0bzogJXNcbiIsIGNfbmFtZSk7CisgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCBpKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChydHNwX3N0LT5keW5hbWljX2hhbmRsZXIgJiYgcnRzcF9zdC0+ZHluYW1pY19oYW5kbGVyLT5pbml0KQorICAgICAgICBydHNwX3N0LT5keW5hbWljX2hhbmRsZXItPmluaXQocywgc3QtPmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRzcF9zdC0+ZHluYW1pY19wcm90b2NvbF9jb250ZXh0KTsKKyAgICByZXR1cm4gMDsKK30KKworLyogcGFyc2UgdGhlIGF0dHJpYnV0ZSBsaW5lIGZyb20gdGhlIGZtdHAgYSBsaW5lIG9mIGFuIHNkcCByZXNwb25zZS4gVGhpcworICogaXMgYnJva2VuIG91dCBhcyBhIGZ1bmN0aW9uIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiBydHBfaDI2NC5jLCB3aGljaCBpcworICogZm9ydGhjb21pbmcuICovCitpbnQgZmZfcnRzcF9uZXh0X2F0dHJfYW5kX3ZhbHVlKGNvbnN0IGNoYXIgKipwLCBjaGFyICphdHRyLCBpbnQgYXR0cl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZSwgaW50IHZhbHVlX3NpemUpCit7CisgICAgKnAgKz0gc3Ryc3BuKCpwLCBTUEFDRV9DSEFSUyk7CisgICAgaWYgKCoqcCkgeworICAgICAgICBnZXRfd29yZF9zZXAoYXR0ciwgYXR0cl9zaXplLCAiPSIsIHApOworICAgICAgICBpZiAoKipwID09ICc9JykKKyAgICAgICAgICAgICgqcCkrKzsKKyAgICAgICAgZ2V0X3dvcmRfc2VwKHZhbHVlLCB2YWx1ZV9zaXplLCAiOyIsIHApOworICAgICAgICBpZiAoKipwID09ICc7JykKKyAgICAgICAgICAgICgqcCkrKzsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCBTRFBQYXJzZVN0YXRlIHsKKyAgICAvKiBTRFAgb25seSAqLworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGRlZmF1bHRfaXA7CisgICAgaW50ICAgICAgICAgICAgZGVmYXVsdF90dGw7CisgICAgaW50ICAgICAgICAgICAgc2tpcF9tZWRpYTsgIC8vLzwgc2V0IGlmIGFuIHVua25vd24gbT0gbGluZSBvY2N1cnMKKyAgICBpbnQgbmJfZGVmYXVsdF9pbmNsdWRlX3NvdXJjZV9hZGRyczsgLyoqPCBOdW1iZXIgb2Ygc291cmNlLXNwZWNpZmljIG11bHRpY2FzdCBpbmNsdWRlIHNvdXJjZSBJUCBhZGRyZXNzIChmcm9tIFNEUCBjb250ZW50KSAqLworICAgIHN0cnVjdCBSVFNQU291cmNlICoqZGVmYXVsdF9pbmNsdWRlX3NvdXJjZV9hZGRyczsgLyoqPCBTb3VyY2Utc3BlY2lmaWMgbXVsdGljYXN0IGluY2x1ZGUgc291cmNlIElQIGFkZHJlc3MgKGZyb20gU0RQIGNvbnRlbnQpICovCisgICAgaW50IG5iX2RlZmF1bHRfZXhjbHVkZV9zb3VyY2VfYWRkcnM7IC8qKjwgTnVtYmVyIG9mIHNvdXJjZS1zcGVjaWZpYyBtdWx0aWNhc3QgZXhjbHVkZSBzb3VyY2UgSVAgYWRkcmVzcyAoZnJvbSBTRFAgY29udGVudCkgKi8KKyAgICBzdHJ1Y3QgUlRTUFNvdXJjZSAqKmRlZmF1bHRfZXhjbHVkZV9zb3VyY2VfYWRkcnM7IC8qKjwgU291cmNlLXNwZWNpZmljIG11bHRpY2FzdCBleGNsdWRlIHNvdXJjZSBJUCBhZGRyZXNzIChmcm9tIFNEUCBjb250ZW50KSAqLworICAgIGludCBzZWVuX3J0cG1hcDsKKyAgICBpbnQgc2Vlbl9mbXRwOworICAgIGNoYXIgZGVsYXllZF9mbXRwWzIwNDhdOworfSBTRFBQYXJzZVN0YXRlOworCitzdGF0aWMgdm9pZCBjb3B5X2RlZmF1bHRfc291cmNlX2FkZHJzKHN0cnVjdCBSVFNQU291cmNlICoqYWRkcnMsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFJUU1BTb3VyY2UgKioqZGVzdCwgaW50ICpkZXN0X2NvdW50KQoreworICAgIFJUU1BTb3VyY2UgKnJ0c3Bfc3JjLCAqcnRzcF9zcmMyOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHJ0c3Bfc3JjID0gYWRkcnNbaV07CisgICAgICAgIHJ0c3Bfc3JjMiA9IGF2X21hbGxvYyhzaXplb2YoKnJ0c3Bfc3JjMikpOworICAgICAgICBpZiAoIXJ0c3Bfc3JjMikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBtZW1jcHkocnRzcF9zcmMyLCBydHNwX3NyYywgc2l6ZW9mKCpydHNwX3NyYykpOworICAgICAgICBkeW5hcnJheV9hZGQoZGVzdCwgZGVzdF9jb3VudCwgcnRzcF9zcmMyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2ZtdHAoQVZGb3JtYXRDb250ZXh0ICpzLCBSVFNQU3RhdGUgKnJ0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGF5bG9hZF90eXBlLCBjb25zdCBjaGFyICpsaW5lKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHJ0LT5uYl9ydHNwX3N0cmVhbXM7IGkrKykgeworICAgICAgICBSVFNQU3RyZWFtICpydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKHJ0c3Bfc3QtPnNkcF9wYXlsb2FkX3R5cGUgPT0gcGF5bG9hZF90eXBlICYmCisgICAgICAgICAgICBydHNwX3N0LT5keW5hbWljX2hhbmRsZXIgJiYKKyAgICAgICAgICAgIHJ0c3Bfc3QtPmR5bmFtaWNfaGFuZGxlci0+cGFyc2Vfc2RwX2FfbGluZSkgeworICAgICAgICAgICAgcnRzcF9zdC0+ZHluYW1pY19oYW5kbGVyLT5wYXJzZV9zZHBfYV9saW5lKHMsIGksCisgICAgICAgICAgICBydHNwX3N0LT5keW5hbWljX3Byb3RvY29sX2NvbnRleHQsIGxpbmUpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZHBfcGFyc2VfbGluZShBVkZvcm1hdENvbnRleHQgKnMsIFNEUFBhcnNlU3RhdGUgKnMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldHRlciwgY29uc3QgY2hhciAqYnVmKQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgY2hhciBidWYxWzY0XSwgc3RfdHlwZVs2NF07CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBlbnVtIEFWTWVkaWFUeXBlIGNvZGVjX3R5cGU7CisgICAgaW50IHBheWxvYWRfdHlwZTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgUlRTUFN0cmVhbSAqcnRzcF9zdDsKKyAgICBSVFNQU291cmNlICpydHNwX3NyYzsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzZHBfaXA7CisgICAgaW50IHR0bDsKKworICAgIGF2X2Rsb2cocywgInNkcDogJWM9JyVzJ1xuIiwgbGV0dGVyLCBidWYpOworCisgICAgcCA9IGJ1ZjsKKyAgICBpZiAoczEtPnNraXBfbWVkaWEgJiYgbGV0dGVyICE9ICdtJykKKyAgICAgICAgcmV0dXJuOworICAgIHN3aXRjaCAobGV0dGVyKSB7CisgICAgY2FzZSAnYyc6CisgICAgICAgIGdldF93b3JkKGJ1ZjEsIHNpemVvZihidWYxKSwgJnApOworICAgICAgICBpZiAoc3RyY21wKGJ1ZjEsICJJTiIpICE9IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGdldF93b3JkKGJ1ZjEsIHNpemVvZihidWYxKSwgJnApOworICAgICAgICBpZiAoc3RyY21wKGJ1ZjEsICJJUDQiKSAmJiBzdHJjbXAoYnVmMSwgIklQNiIpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBnZXRfd29yZF9zZXAoYnVmMSwgc2l6ZW9mKGJ1ZjEpLCAiLyIsICZwKTsKKyAgICAgICAgaWYgKGdldF9zb2NrYWRkcihidWYxLCAmc2RwX2lwKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdHRsID0gMTY7CisgICAgICAgIGlmICgqcCA9PSAnLycpIHsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGdldF93b3JkX3NlcChidWYxLCBzaXplb2YoYnVmMSksICIvIiwgJnApOworICAgICAgICAgICAgdHRsID0gYXRvaShidWYxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+bmJfc3RyZWFtcyA9PSAwKSB7CisgICAgICAgICAgICBzMS0+ZGVmYXVsdF9pcCA9IHNkcF9pcDsKKyAgICAgICAgICAgIHMxLT5kZWZhdWx0X3R0bCA9IHR0bDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ0c3Bfc3QgPSBydC0+cnRzcF9zdHJlYW1zW3J0LT5uYl9ydHNwX3N0cmVhbXMgLSAxXTsKKyAgICAgICAgICAgIHJ0c3Bfc3QtPnNkcF9pcCA9IHNkcF9pcDsKKyAgICAgICAgICAgIHJ0c3Bfc3QtPnNkcF90dGwgPSB0dGw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgInRpdGxlIiwgcCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2knOgorICAgICAgICBpZiAocy0+bmJfc3RyZWFtcyA9PSAwKSB7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJjb21tZW50IiwgcCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzoKKyAgICAgICAgLyogbmV3IHN0cmVhbSAqLworICAgICAgICBzMS0+c2tpcF9tZWRpYSAgPSAwOworICAgICAgICBzMS0+c2Vlbl9mbXRwICAgPSAwOworICAgICAgICBzMS0+c2Vlbl9ydHBtYXAgPSAwOworICAgICAgICBjb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1VOS05PV047CisgICAgICAgIGdldF93b3JkKHN0X3R5cGUsIHNpemVvZihzdF90eXBlKSwgJnApOworICAgICAgICBpZiAoIXN0cmNtcChzdF90eXBlLCAiYXVkaW8iKSkgeworICAgICAgICAgICAgY29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHN0X3R5cGUsICJ2aWRlbyIpKSB7CisgICAgICAgICAgICBjb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoc3RfdHlwZSwgImFwcGxpY2F0aW9uIikpIHsKKyAgICAgICAgICAgIGNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVU5LTk9XTiB8fCAhKHJ0LT5tZWRpYV90eXBlX21hc2sgJiAoMSA8PCBjb2RlY190eXBlKSkpIHsKKyAgICAgICAgICAgIHMxLT5za2lwX21lZGlhID0gMTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBydHNwX3N0ID0gYXZfbWFsbG9jeihzaXplb2YoUlRTUFN0cmVhbSkpOworICAgICAgICBpZiAoIXJ0c3Bfc3QpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHJ0c3Bfc3QtPnN0cmVhbV9pbmRleCA9IC0xOworICAgICAgICBkeW5hcnJheV9hZGQoJnJ0LT5ydHNwX3N0cmVhbXMsICZydC0+bmJfcnRzcF9zdHJlYW1zLCBydHNwX3N0KTsKKworICAgICAgICBydHNwX3N0LT5zZHBfaXAgPSBzMS0+ZGVmYXVsdF9pcDsKKyAgICAgICAgcnRzcF9zdC0+c2RwX3R0bCA9IHMxLT5kZWZhdWx0X3R0bDsKKworICAgICAgICBjb3B5X2RlZmF1bHRfc291cmNlX2FkZHJzKHMxLT5kZWZhdWx0X2luY2x1ZGVfc291cmNlX2FkZHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxLT5uYl9kZWZhdWx0X2luY2x1ZGVfc291cmNlX2FkZHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZydHNwX3N0LT5pbmNsdWRlX3NvdXJjZV9hZGRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnRzcF9zdC0+bmJfaW5jbHVkZV9zb3VyY2VfYWRkcnMpOworICAgICAgICBjb3B5X2RlZmF1bHRfc291cmNlX2FkZHJzKHMxLT5kZWZhdWx0X2V4Y2x1ZGVfc291cmNlX2FkZHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxLT5uYl9kZWZhdWx0X2V4Y2x1ZGVfc291cmNlX2FkZHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZydHNwX3N0LT5leGNsdWRlX3NvdXJjZV9hZGRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnRzcF9zdC0+bmJfZXhjbHVkZV9zb3VyY2VfYWRkcnMpOworCisgICAgICAgIGdldF93b3JkKGJ1ZjEsIHNpemVvZihidWYxKSwgJnApOyAvKiBwb3J0ICovCisgICAgICAgIHJ0c3Bfc3QtPnNkcF9wb3J0ID0gYXRvaShidWYxKTsKKworICAgICAgICBnZXRfd29yZChidWYxLCBzaXplb2YoYnVmMSksICZwKTsgLyogcHJvdG9jb2wgKi8KKyAgICAgICAgaWYgKCFzdHJjbXAoYnVmMSwgInVkcCIpKQorICAgICAgICAgICAgcnQtPnRyYW5zcG9ydCA9IFJUU1BfVFJBTlNQT1JUX1JBVzsKKyAgICAgICAgZWxzZSBpZiAoc3Ryc3RyKGJ1ZjEsICIvQVZQRiIpIHx8IHN0cnN0cihidWYxLCAiL1NBVlBGIikpCisgICAgICAgICAgICBydHNwX3N0LT5mZWVkYmFjayA9IDE7CisKKyAgICAgICAgLyogWFhYOiBoYW5kbGUgbGlzdCBvZiBmb3JtYXRzICovCisgICAgICAgIGdldF93b3JkKGJ1ZjEsIHNpemVvZihidWYxKSwgJnApOyAvKiBmb3JtYXQgbGlzdCAqLworICAgICAgICBydHNwX3N0LT5zZHBfcGF5bG9hZF90eXBlID0gYXRvaShidWYxKTsKKworICAgICAgICBpZiAoIXN0cmNtcChmZl9ydHBfZW5jX25hbWUocnRzcF9zdC0+c2RwX3BheWxvYWRfdHlwZSksICJNUDJUIikpIHsKKyAgICAgICAgICAgIC8qIG5vIGNvcnJlc3BvbmRpbmcgc3RyZWFtICovCisgICAgICAgICAgICBpZiAocnQtPnRyYW5zcG9ydCA9PSBSVFNQX1RSQU5TUE9SVF9SQVcpIHsKKyAgICAgICAgICAgICAgICBpZiAoQ09ORklHX1JUUERFQyAmJiAhcnQtPnRzKQorICAgICAgICAgICAgICAgICAgICBydC0+dHMgPSBhdnByaXZfbXBlZ3RzX3BhcnNlX29wZW4ocyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmhhbmRsZXI7CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IGZmX3J0cF9oYW5kbGVyX2ZpbmRfYnlfaWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHNwX3N0LT5zZHBfcGF5bG9hZF90eXBlLCBBVk1FRElBX1RZUEVfREFUQSk7CisgICAgICAgICAgICAgICAgaW5pdF9ydHBfaGFuZGxlcihoYW5kbGVyLCBydHNwX3N0LCBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVyLT5pbml0KQorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLT5pbml0KHMsIC0xLCBydHNwX3N0LT5keW5hbWljX3Byb3RvY29sX2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJ0LT5zZXJ2ZXJfdHlwZSA9PSBSVFNQX1NFUlZFUl9XTVMgJiYKKyAgICAgICAgICAgICAgICAgICBjb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9EQVRBKSB7CisgICAgICAgICAgICAvKiBSVFggc3RyZWFtLCBhIHN0cmVhbSB0aGF0IGNhcnJpZXMgYWxsIHRoZSBvdGhlciBhY3R1YWwKKyAgICAgICAgICAgICAqIGF1ZGlvL3ZpZGVvIHN0cmVhbXMuIERvbid0IGV4cG9zZSB0aGlzIHRvIHRoZSBjYWxsZXJzLiAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBzdC0+aWQgPSBydC0+bmJfcnRzcF9zdHJlYW1zIC0gMTsKKyAgICAgICAgICAgIHJ0c3Bfc3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IGNvZGVjX3R5cGU7CisgICAgICAgICAgICBpZiAocnRzcF9zdC0+c2RwX3BheWxvYWRfdHlwZSA8IFJUUF9QVF9QUklWQVRFKSB7CisgICAgICAgICAgICAgICAgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqaGFuZGxlcjsKKyAgICAgICAgICAgICAgICAvKiBpZiBzdGFuZGFyZCBwYXlsb2FkIHR5cGUsIHdlIGNhbiBmaW5kIHRoZSBjb2RlYyByaWdodCBub3cgKi8KKyAgICAgICAgICAgICAgICBmZl9ydHBfZ2V0X2NvZGVjX2luZm8oc3QtPmNvZGVjLCBydHNwX3N0LT5zZHBfcGF5bG9hZF90eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID4gMCkKKyAgICAgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIC8qIEV2ZW4gc3RhdGljIHBheWxvYWQgdHlwZXMgbWF5IG5lZWQgYSBjdXN0b20gZGVwYWNrZXRpemVyICovCisgICAgICAgICAgICAgICAgaGFuZGxlciA9IGZmX3J0cF9oYW5kbGVyX2ZpbmRfYnlfaWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHNwX3N0LT5zZHBfcGF5bG9hZF90eXBlLCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUpOworICAgICAgICAgICAgICAgIGluaXRfcnRwX2hhbmRsZXIoaGFuZGxlciwgcnRzcF9zdCwgc3QtPmNvZGVjKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVyLT5pbml0KQorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLT5pbml0KHMsIHN0LT5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHNwX3N0LT5keW5hbWljX3Byb3RvY29sX2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIHB1dCBhIGRlZmF1bHQgY29udHJvbCB1cmwgKi8KKyAgICAgICAgYXZfc3RybGNweShydHNwX3N0LT5jb250cm9sX3VybCwgcnQtPmNvbnRyb2xfdXJpLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihydHNwX3N0LT5jb250cm9sX3VybCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdhJzoKKyAgICAgICAgaWYgKGF2X3N0cnN0YXJ0KHAsICJjb250cm9sOiIsICZwKSkgeworICAgICAgICAgICAgaWYgKHMtPm5iX3N0cmVhbXMgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChwLCAicnRzcDovLyIsIDcpKQorICAgICAgICAgICAgICAgICAgICBhdl9zdHJsY3B5KHJ0LT5jb250cm9sX3VyaSwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocnQtPmNvbnRyb2xfdXJpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXIgcHJvdG9bMzJdOworICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgY29udHJvbCB1cmwgKi8KKyAgICAgICAgICAgICAgICBydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1tydC0+bmJfcnRzcF9zdHJlYW1zIC0gMV07CisKKyAgICAgICAgICAgICAgICAvKiBYWFg6IG1heSBuZWVkIHRvIGFkZCBmdWxsIHVybCByZXNvbHV0aW9uICovCisgICAgICAgICAgICAgICAgYXZfdXJsX3NwbGl0KHByb3RvLCBzaXplb2YocHJvdG8pLCBOVUxMLCAwLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAwLCBwKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvdG9bMF0gPT0gJ1wwJykgeworICAgICAgICAgICAgICAgICAgICAvKiByZWxhdGl2ZSBjb250cm9sIFVSTCAqLworICAgICAgICAgICAgICAgICAgICBpZiAocnRzcF9zdC0+Y29udHJvbF91cmxbc3RybGVuKHJ0c3Bfc3QtPmNvbnRyb2xfdXJsKS0xXSE9Jy8nKQorICAgICAgICAgICAgICAgICAgICBhdl9zdHJsY2F0KHJ0c3Bfc3QtPmNvbnRyb2xfdXJsLCAiLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJ0c3Bfc3QtPmNvbnRyb2xfdXJsKSk7CisgICAgICAgICAgICAgICAgICAgIGF2X3N0cmxjYXQocnRzcF9zdC0+Y29udHJvbF91cmwsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJ0c3Bfc3QtPmNvbnRyb2xfdXJsKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkocnRzcF9zdC0+Y29udHJvbF91cmwsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJ0c3Bfc3QtPmNvbnRyb2xfdXJsKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQocCwgInJ0cG1hcDoiLCAmcCkgJiYgcy0+bmJfc3RyZWFtcyA+IDApIHsKKyAgICAgICAgICAgIC8qIE5PVEU6IHJ0cG1hcCBpcyBvbmx5IHN1cHBvcnRlZCBBRlRFUiB0aGUgJ209JyB0YWcgKi8KKyAgICAgICAgICAgIGdldF93b3JkKGJ1ZjEsIHNpemVvZihidWYxKSwgJnApOworICAgICAgICAgICAgcGF5bG9hZF90eXBlID0gYXRvaShidWYxKTsKKyAgICAgICAgICAgIHJ0c3Bfc3QgPSBydC0+cnRzcF9zdHJlYW1zW3J0LT5uYl9ydHNwX3N0cmVhbXMgLSAxXTsKKyAgICAgICAgICAgIGlmIChydHNwX3N0LT5zdHJlYW1faW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tydHNwX3N0LT5zdHJlYW1faW5kZXhdOworICAgICAgICAgICAgICAgIHNkcF9wYXJzZV9ydHBtYXAocywgc3QsIHJ0c3Bfc3QsIHBheWxvYWRfdHlwZSwgcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzMS0+c2Vlbl9ydHBtYXAgPSAxOworICAgICAgICAgICAgaWYgKHMxLT5zZWVuX2ZtdHApIHsKKyAgICAgICAgICAgICAgICBwYXJzZV9mbXRwKHMsIHJ0LCBwYXlsb2FkX3R5cGUsIHMxLT5kZWxheWVkX2ZtdHApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KHAsICJmbXRwOiIsICZwKSB8fAorICAgICAgICAgICAgICAgICAgIGF2X3N0cnN0YXJ0KHAsICJmcmFtZXNpemU6IiwgJnApKSB7CisgICAgICAgICAgICAvLyBsZXQgZHluYW1pYyBwcm90b2NvbCBoYW5kbGVycyBoYXZlIGEgc3RhYiBhdCB0aGUgbGluZS4KKyAgICAgICAgICAgIGdldF93b3JkKGJ1ZjEsIHNpemVvZihidWYxKSwgJnApOworICAgICAgICAgICAgcGF5bG9hZF90eXBlID0gYXRvaShidWYxKTsKKyAgICAgICAgICAgIGlmIChzMS0+c2Vlbl9ydHBtYXApIHsKKyAgICAgICAgICAgICAgICBwYXJzZV9mbXRwKHMsIHJ0LCBwYXlsb2FkX3R5cGUsIGJ1Zik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMxLT5zZWVuX2ZtdHAgPSAxOworICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkoczEtPmRlbGF5ZWRfZm10cCwgYnVmLCBzaXplb2YoczEtPmRlbGF5ZWRfZm10cCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KHAsICJyYW5nZToiLCAmcCkpIHsKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnQsIGVuZDsKKworICAgICAgICAgICAgLy8gdGhpcyBpcyBzbyB0aGF0IHNlZWtpbmcgb24gYSBzdHJlYW1lZCBmaWxlIGNhbiB3b3JrLgorICAgICAgICAgICAgcnRzcF9wYXJzZV9yYW5nZV9ucHQocCwgJnN0YXJ0LCAmZW5kKTsKKyAgICAgICAgICAgIHMtPnN0YXJ0X3RpbWUgPSBzdGFydDsKKyAgICAgICAgICAgIC8qIEFWX05PUFRTX1ZBTFVFIG1lYW5zIGxpdmUgYnJvYWRjYXN0IChhbmQgY2FuJ3Qgc2VlaykgKi8KKyAgICAgICAgICAgIHMtPmR1cmF0aW9uICAgPSAoZW5kID09IEFWX05PUFRTX1ZBTFVFKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTk9QVFNfVkFMVUUgOiBlbmQgLSBzdGFydDsKKyAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChwLCAiSXNSZWFsRGF0YVR5cGU6aW50ZWdlcjsiLCZwKSkgeworICAgICAgICAgICAgaWYgKGF0b2kocCkgPT0gMSkKKyAgICAgICAgICAgICAgICBydC0+dHJhbnNwb3J0ID0gUlRTUF9UUkFOU1BPUlRfUkRUOworICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KHAsICJTYW1wbGVSYXRlOmludGVnZXI7IiwgJnApICYmCisgICAgICAgICAgICAgICAgICAgcy0+bmJfc3RyZWFtcyA+IDApIHsKKyAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tzLT5uYl9zdHJlYW1zIC0gMV07CisgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXRvaShwKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChwLCAiY3J5cHRvOiIsICZwKSAmJiBzLT5uYl9zdHJlYW1zID4gMCkgeworICAgICAgICAgICAgLy8gUkZDIDQ1NjgKKyAgICAgICAgICAgIHJ0c3Bfc3QgPSBydC0+cnRzcF9zdHJlYW1zW3J0LT5uYl9ydHNwX3N0cmVhbXMgLSAxXTsKKyAgICAgICAgICAgIGdldF93b3JkKGJ1ZjEsIHNpemVvZihidWYxKSwgJnApOyAvLyBpZ25vcmUgdGFnCisgICAgICAgICAgICBnZXRfd29yZChydHNwX3N0LT5jcnlwdG9fc3VpdGUsIHNpemVvZihydHNwX3N0LT5jcnlwdG9fc3VpdGUpLCAmcCk7CisgICAgICAgICAgICBwICs9IHN0cnNwbihwLCBTUEFDRV9DSEFSUyk7CisgICAgICAgICAgICBpZiAoYXZfc3Ryc3RhcnQocCwgImlubGluZToiLCAmcCkpCisgICAgICAgICAgICAgICAgZ2V0X3dvcmQocnRzcF9zdC0+Y3J5cHRvX3BhcmFtcywgc2l6ZW9mKHJ0c3Bfc3QtPmNyeXB0b19wYXJhbXMpLCAmcCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQocCwgInNvdXJjZS1maWx0ZXI6IiwgJnApKSB7CisgICAgICAgICAgICBpbnQgZXhjbHVkZSA9IDA7CisgICAgICAgICAgICBnZXRfd29yZChidWYxLCBzaXplb2YoYnVmMSksICZwKTsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoYnVmMSwgImluY2wiKSAmJiBzdHJjbXAoYnVmMSwgImV4Y2wiKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBleGNsdWRlID0gIXN0cmNtcChidWYxLCAiZXhjbCIpOworCisgICAgICAgICAgICBnZXRfd29yZChidWYxLCBzaXplb2YoYnVmMSksICZwKTsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoYnVmMSwgIklOIikgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBnZXRfd29yZChidWYxLCBzaXplb2YoYnVmMSksICZwKTsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoYnVmMSwgIklQNCIpICYmIHN0cmNtcChidWYxLCAiSVA2IikgJiYgc3RyY21wKGJ1ZjEsICIqIikpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgLy8gbm90IGNoZWNraW5nIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgYWN0dWFsbHkgbWF0Y2hlcyBvciBpcyB3aWxkY2FyZAorICAgICAgICAgICAgZ2V0X3dvcmQoYnVmMSwgc2l6ZW9mKGJ1ZjEpLCAmcCk7CisKKyAgICAgICAgICAgIHdoaWxlICgqcCAhPSAnXDAnKSB7CisgICAgICAgICAgICAgICAgcnRzcF9zcmMgPSBhdl9tYWxsb2N6KHNpemVvZigqcnRzcF9zcmMpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJ0c3Bfc3JjKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgZ2V0X3dvcmQocnRzcF9zcmMtPmFkZHIsIHNpemVvZihydHNwX3NyYy0+YWRkciksICZwKTsKKyAgICAgICAgICAgICAgICBpZiAoZXhjbHVkZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bmJfc3RyZWFtcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkeW5hcnJheV9hZGQoJnMxLT5kZWZhdWx0X2V4Y2x1ZGVfc291cmNlX2FkZHJzLCAmczEtPm5iX2RlZmF1bHRfZXhjbHVkZV9zb3VyY2VfYWRkcnMsIHJ0c3Bfc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ0c3Bfc3QgPSBydC0+cnRzcF9zdHJlYW1zW3J0LT5uYl9ydHNwX3N0cmVhbXMgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFycmF5X2FkZCgmcnRzcF9zdC0+ZXhjbHVkZV9zb3VyY2VfYWRkcnMsICZydHNwX3N0LT5uYl9leGNsdWRlX3NvdXJjZV9hZGRycywgcnRzcF9zcmMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm5iX3N0cmVhbXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZHluYXJyYXlfYWRkKCZzMS0+ZGVmYXVsdF9pbmNsdWRlX3NvdXJjZV9hZGRycywgJnMxLT5uYl9kZWZhdWx0X2luY2x1ZGVfc291cmNlX2FkZHJzLCBydHNwX3NyYyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1tydC0+bmJfcnRzcF9zdHJlYW1zIC0gMV07CisgICAgICAgICAgICAgICAgICAgICAgICBkeW5hcnJheV9hZGQoJnJ0c3Bfc3QtPmluY2x1ZGVfc291cmNlX2FkZHJzLCAmcnRzcF9zdC0+bmJfaW5jbHVkZV9zb3VyY2VfYWRkcnMsIHJ0c3Bfc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChydC0+c2VydmVyX3R5cGUgPT0gUlRTUF9TRVJWRVJfV01TKQorICAgICAgICAgICAgICAgIGZmX3dtc19wYXJzZV9zZHBfYV9saW5lKHMsIHApOworICAgICAgICAgICAgaWYgKHMtPm5iX3N0cmVhbXMgPiAwKSB7CisgICAgICAgICAgICAgICAgcnRzcF9zdCA9IHJ0LT5ydHNwX3N0cmVhbXNbcnQtPm5iX3J0c3Bfc3RyZWFtcyAtIDFdOworCisgICAgICAgICAgICAgICAgaWYgKHJ0LT5zZXJ2ZXJfdHlwZSA9PSBSVFNQX1NFUlZFUl9SRUFMKQorICAgICAgICAgICAgICAgICAgICBmZl9yZWFsX3BhcnNlX3NkcF9hX2xpbmUocywgcnRzcF9zdC0+c3RyZWFtX2luZGV4LCBwKTsKKworICAgICAgICAgICAgICAgIGlmIChydHNwX3N0LT5keW5hbWljX2hhbmRsZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgcnRzcF9zdC0+ZHluYW1pY19oYW5kbGVyLT5wYXJzZV9zZHBfYV9saW5lKQorICAgICAgICAgICAgICAgICAgICBydHNwX3N0LT5keW5hbWljX2hhbmRsZXItPnBhcnNlX3NkcF9hX2xpbmUocywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ0c3Bfc3QtPnN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ0c3Bfc3QtPmR5bmFtaWNfcHJvdG9jb2xfY29udGV4dCwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2ludCBmZl9zZHBfcGFyc2UoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICpjb250ZW50KQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBpbnQgbGV0dGVyLCBpOworICAgIC8qIFNvbWUgU0RQIGxpbmVzLCBwYXJ0aWN1bGFybHkgZm9yIFJlYWxtZWRpYSBvciBBU0YgUlRTUCBzdHJlYW1zLAorICAgICAqIGNvbnRhaW4gbG9uZyBTRFAgbGluZXMgY29udGFpbmluZyBjb21wbGV0ZSBBU0YgSGVhZGVycyAoc2V2ZXJhbAorICAgICAqIGtCKSBvciBhcnJheXMgb2YgTURQUiAoUk0gc3RyZWFtIGRlc2NyaXB0b3IpIGhlYWRlcnMgcGx1cworICAgICAqICJydWxlYm9va3MiIGRlc2NyaWJpbmcgdGhlaXIgcHJvcGVydGllcy4gVGhlcmVmb3JlLCB0aGUgU0RQIGxpbmUKKyAgICAgKiBidWZmZXIgaXMgbGFyZ2UuCisgICAgICoKKyAgICAgKiBUaGUgVm9yYmlzIEZNVFAgbGluZSBjYW4gYmUgdXAgdG8gMTZLQiAtIHNlZSB4aXBoX3BhcnNlX3NkcF9saW5lCisgICAgICogaW4gcnRwZGVjX3hpcGguYy4gKi8KKyAgICBjaGFyIGJ1ZlsxNjM4NF0sICpxOworICAgIFNEUFBhcnNlU3RhdGUgc2RwX3BhcnNlX3N0YXRlID0geyB7IDAgfSB9LCAqczEgPSAmc2RwX3BhcnNlX3N0YXRlOworCisgICAgcCA9IGNvbnRlbnQ7CisgICAgZm9yICg7OykgeworICAgICAgICBwICs9IHN0cnNwbihwLCBTUEFDRV9DSEFSUyk7CisgICAgICAgIGxldHRlciA9ICpwOworICAgICAgICBpZiAobGV0dGVyID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcCsrOworICAgICAgICBpZiAoKnAgIT0gJz0nKQorICAgICAgICAgICAgZ290byBuZXh0X2xpbmU7CisgICAgICAgIHArKzsKKyAgICAgICAgLyogZ2V0IHRoZSBjb250ZW50ICovCisgICAgICAgIHEgPSBidWY7CisgICAgICAgIHdoaWxlICgqcCAhPSAnXG4nICYmICpwICE9ICdccicgJiYgKnAgIT0gJ1wwJykgeworICAgICAgICAgICAgaWYgKChxIC0gYnVmKSA8IHNpemVvZihidWYpIC0gMSkKKyAgICAgICAgICAgICAgICAqcSsrID0gKnA7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgKnEgPSAnXDAnOworICAgICAgICBzZHBfcGFyc2VfbGluZShzLCBzMSwgbGV0dGVyLCBidWYpOworICAgIG5leHRfbGluZToKKyAgICAgICAgd2hpbGUgKCpwICE9ICdcbicgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgaWYgKCpwID09ICdcbicpCisgICAgICAgICAgICBwKys7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMxLT5uYl9kZWZhdWx0X2luY2x1ZGVfc291cmNlX2FkZHJzOyBpKyspCisgICAgICAgIGF2X2ZyZWUoczEtPmRlZmF1bHRfaW5jbHVkZV9zb3VyY2VfYWRkcnNbaV0pOworICAgIGF2X2ZyZWVwKCZzMS0+ZGVmYXVsdF9pbmNsdWRlX3NvdXJjZV9hZGRycyk7CisgICAgZm9yIChpID0gMDsgaSA8IHMxLT5uYl9kZWZhdWx0X2V4Y2x1ZGVfc291cmNlX2FkZHJzOyBpKyspCisgICAgICAgIGF2X2ZyZWUoczEtPmRlZmF1bHRfZXhjbHVkZV9zb3VyY2VfYWRkcnNbaV0pOworICAgIGF2X2ZyZWVwKCZzMS0+ZGVmYXVsdF9leGNsdWRlX3NvdXJjZV9hZGRycyk7CisKKyAgICBydC0+cCA9IGF2X21hbGxvY19hcnJheShydC0+bmJfcnRzcF9zdHJlYW1zICsgMSwgc2l6ZW9mKHN0cnVjdCBwb2xsZmQpICogMik7CisgICAgaWYgKCFydC0+cCkgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUlRQREVDICovCisKK3ZvaWQgZmZfcnRzcF91bmRvX3NldHVwKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHNlbmRfcGFja2V0cykKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHJ0LT5uYl9ydHNwX3N0cmVhbXM7IGkrKykgeworICAgICAgICBSVFNQU3RyZWFtICpydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKCFydHNwX3N0KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChydHNwX3N0LT50cmFuc3BvcnRfcHJpdikgeworICAgICAgICAgICAgaWYgKHMtPm9mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKnJ0cGN0eCA9IHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2OworICAgICAgICAgICAgICAgIGF2X3dyaXRlX3RyYWlsZXIocnRwY3R4KTsKKyAgICAgICAgICAgICAgICBpZiAocnQtPmxvd2VyX3RyYW5zcG9ydCA9PSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9UQ1ApIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyOworICAgICAgICAgICAgICAgICAgICBpZiAoQ09ORklHX1JUU1BfTVVYRVIgJiYgcnRwY3R4LT5wYiAmJiBzZW5kX3BhY2tldHMpCisgICAgICAgICAgICAgICAgICAgICAgICBmZl9ydHNwX3RjcF93cml0ZV9wYWNrZXQocywgcnRzcF9zdCk7CisgICAgICAgICAgICAgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1ZihydHBjdHgtPnBiLCAmcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShwdHIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2aW9fY2xvc2UocnRwY3R4LT5wYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChydHBjdHgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChDT05GSUdfUlRQREVDICYmIHJ0LT50cmFuc3BvcnQgPT0gUlRTUF9UUkFOU1BPUlRfUkRUKQorICAgICAgICAgICAgICAgIGZmX3JkdF9wYXJzZV9jbG9zZShydHNwX3N0LT50cmFuc3BvcnRfcHJpdik7CisgICAgICAgICAgICBlbHNlIGlmIChDT05GSUdfUlRQREVDICYmIHJ0LT50cmFuc3BvcnQgPT0gUlRTUF9UUkFOU1BPUlRfUlRQKQorICAgICAgICAgICAgICAgIGZmX3J0cF9wYXJzZV9jbG9zZShydHNwX3N0LT50cmFuc3BvcnRfcHJpdik7CisgICAgICAgIH0KKyAgICAgICAgcnRzcF9zdC0+dHJhbnNwb3J0X3ByaXYgPSBOVUxMOworICAgICAgICBpZiAocnRzcF9zdC0+cnRwX2hhbmRsZSkKKyAgICAgICAgICAgIGZmdXJsX2Nsb3NlKHJ0c3Bfc3QtPnJ0cF9oYW5kbGUpOworICAgICAgICBydHNwX3N0LT5ydHBfaGFuZGxlID0gTlVMTDsKKyAgICB9Cit9CisKKy8qIGNsb3NlIGFuZCBmcmVlIFJUU1Agc3RyZWFtcyAqLwordm9pZCBmZl9ydHNwX2Nsb3NlX3N0cmVhbXMoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGksIGo7CisgICAgUlRTUFN0cmVhbSAqcnRzcF9zdDsKKworICAgIGZmX3J0c3BfdW5kb19zZXR1cChzLCAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcnQtPm5iX3J0c3Bfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHJ0c3Bfc3QgPSBydC0+cnRzcF9zdHJlYW1zW2ldOworICAgICAgICBpZiAocnRzcF9zdCkgeworICAgICAgICAgICAgaWYgKHJ0c3Bfc3QtPmR5bmFtaWNfaGFuZGxlciAmJiBydHNwX3N0LT5keW5hbWljX3Byb3RvY29sX2NvbnRleHQpCisgICAgICAgICAgICAgICAgcnRzcF9zdC0+ZHluYW1pY19oYW5kbGVyLT5mcmVlKAorICAgICAgICAgICAgICAgICAgICBydHNwX3N0LT5keW5hbWljX3Byb3RvY29sX2NvbnRleHQpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJ0c3Bfc3QtPm5iX2luY2x1ZGVfc291cmNlX2FkZHJzOyBqKyspCisgICAgICAgICAgICAgICAgYXZfZnJlZShydHNwX3N0LT5pbmNsdWRlX3NvdXJjZV9hZGRyc1tqXSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmcnRzcF9zdC0+aW5jbHVkZV9zb3VyY2VfYWRkcnMpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJ0c3Bfc3QtPm5iX2V4Y2x1ZGVfc291cmNlX2FkZHJzOyBqKyspCisgICAgICAgICAgICAgICAgYXZfZnJlZShydHNwX3N0LT5leGNsdWRlX3NvdXJjZV9hZGRyc1tqXSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmcnRzcF9zdC0+ZXhjbHVkZV9zb3VyY2VfYWRkcnMpOworCisgICAgICAgICAgICBhdl9mcmVlKHJ0c3Bfc3QpOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWUocnQtPnJ0c3Bfc3RyZWFtcyk7CisgICAgaWYgKHJ0LT5hc2ZfY3R4KSB7CisgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZydC0+YXNmX2N0eCk7CisgICAgfQorICAgIGlmIChDT05GSUdfUlRQREVDICYmIHJ0LT50cykKKyAgICAgICAgYXZwcml2X21wZWd0c19wYXJzZV9jbG9zZShydC0+dHMpOworICAgIGF2X2ZyZWUocnQtPnApOworICAgIGF2X2ZyZWUocnQtPnJlY3ZidWYpOworfQorCitpbnQgZmZfcnRzcF9vcGVuX3RyYW5zcG9ydF9jdHgoQVZGb3JtYXRDb250ZXh0ICpzLCBSVFNQU3RyZWFtICpydHNwX3N0KQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gTlVMTDsKKyAgICBpbnQgcmVvcmRlcmluZ19xdWV1ZV9zaXplID0gcnQtPnJlb3JkZXJpbmdfcXVldWVfc2l6ZTsKKyAgICBpZiAocmVvcmRlcmluZ19xdWV1ZV9zaXplIDwgMCkgeworICAgICAgICBpZiAocnQtPmxvd2VyX3RyYW5zcG9ydCA9PSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9UQ1AgfHwgIXMtPm1heF9kZWxheSkKKyAgICAgICAgICAgIHJlb3JkZXJpbmdfcXVldWVfc2l6ZSA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlb3JkZXJpbmdfcXVldWVfc2l6ZSA9IFJUUF9SRU9SREVSX1FVRVVFX0RFRkFVTFRfU0laRTsKKyAgICB9CisKKyAgICAvKiBvcGVuIHRoZSBSVFAgY29udGV4dCAqLworICAgIGlmIChydHNwX3N0LT5zdHJlYW1faW5kZXggPj0gMCkKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW3J0c3Bfc3QtPnN0cmVhbV9pbmRleF07CisgICAgaWYgKCFzdCkKKyAgICAgICAgcy0+Y3R4X2ZsYWdzIHw9IEFWRk1UQ1RYX05PSEVBREVSOworCisgICAgaWYgKENPTkZJR19SVFNQX01VWEVSICYmIHMtPm9mb3JtYXQpIHsKKyAgICAgICAgaW50IHJldCA9IGZmX3J0cF9jaGFpbl9tdXhfb3BlbigoQVZGb3JtYXRDb250ZXh0ICoqKSZydHNwX3N0LT50cmFuc3BvcnRfcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBzdCwgcnRzcF9zdC0+cnRwX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFNQX1RDUF9NQVhfUEFDS0VUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRzcF9zdC0+c3RyZWFtX2luZGV4KTsKKyAgICAgICAgLyogT3duZXJzaGlwIG9mIHJ0cF9oYW5kbGUgaXMgcGFzc2VkIHRvIHRoZSBydHAgbXV4IGNvbnRleHQgKi8KKyAgICAgICAgcnRzcF9zdC0+cnRwX2hhbmRsZSA9IE5VTEw7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgc3QtPnRpbWVfYmFzZSA9ICgoQVZGb3JtYXRDb250ZXh0KilydHNwX3N0LT50cmFuc3BvcnRfcHJpdiktPnN0cmVhbXNbMF0tPnRpbWVfYmFzZTsKKyAgICB9IGVsc2UgaWYgKHJ0LT50cmFuc3BvcnQgPT0gUlRTUF9UUkFOU1BPUlRfUkFXKSB7CisgICAgICAgIHJldHVybiAwOyAvLyBEb24ndCBuZWVkIHRvIG9wZW4gYW55IHBhcnNlciBoZXJlCisgICAgfSBlbHNlIGlmIChDT05GSUdfUlRQREVDICYmIHJ0LT50cmFuc3BvcnQgPT0gUlRTUF9UUkFOU1BPUlRfUkRUKQorICAgICAgICBydHNwX3N0LT50cmFuc3BvcnRfcHJpdiA9IGZmX3JkdF9wYXJzZV9vcGVuKHMsIHN0LT5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRzcF9zdC0+ZHluYW1pY19wcm90b2NvbF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHNwX3N0LT5keW5hbWljX2hhbmRsZXIpOworICAgIGVsc2UgaWYgKENPTkZJR19SVFBERUMpCisgICAgICAgIHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2ID0gZmZfcnRwX3BhcnNlX29wZW4ocywgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0c3Bfc3QtPnNkcF9wYXlsb2FkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlb3JkZXJpbmdfcXVldWVfc2l6ZSk7CisKKyAgICBpZiAoIXJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2KSB7CisgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0gZWxzZSBpZiAoQ09ORklHX1JUUERFQyAmJiBydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCkgeworICAgICAgICBpZiAocnRzcF9zdC0+ZHluYW1pY19oYW5kbGVyKSB7CisgICAgICAgICAgICBmZl9ydHBfcGFyc2Vfc2V0X2R5bmFtaWNfcHJvdG9jb2wocnRzcF9zdC0+dHJhbnNwb3J0X3ByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRzcF9zdC0+ZHluYW1pY19wcm90b2NvbF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0c3Bfc3QtPmR5bmFtaWNfaGFuZGxlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ0c3Bfc3QtPmNyeXB0b19zdWl0ZVswXSkKKyAgICAgICAgICAgIGZmX3J0cF9wYXJzZV9zZXRfY3J5cHRvKHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRzcF9zdC0+Y3J5cHRvX3N1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRzcF9zdC0+Y3J5cHRvX3BhcmFtcyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfUlRTUF9ERU1VWEVSIHx8IENPTkZJR19SVFNQX01VWEVSCitzdGF0aWMgdm9pZCBydHNwX3BhcnNlX3JhbmdlKGludCAqbWluX3B0ciwgaW50ICptYXhfcHRyLCBjb25zdCBjaGFyICoqcHApCit7CisgICAgY29uc3QgY2hhciAqcTsKKyAgICBjaGFyICpwOworICAgIGludCB2OworCisgICAgcSA9ICpwcDsKKyAgICBxICs9IHN0cnNwbihxLCBTUEFDRV9DSEFSUyk7CisgICAgdiA9IHN0cnRvbChxLCAmcCwgMTApOworICAgIGlmICgqcCA9PSAnLScpIHsKKyAgICAgICAgcCsrOworICAgICAgICAqbWluX3B0ciA9IHY7CisgICAgICAgIHYgPSBzdHJ0b2wocCwgJnAsIDEwKTsKKyAgICAgICAgKm1heF9wdHIgPSB2OworICAgIH0gZWxzZSB7CisgICAgICAgICptaW5fcHRyID0gdjsKKyAgICAgICAgKm1heF9wdHIgPSB2OworICAgIH0KKyAgICAqcHAgPSBwOworfQorCisvKiBYWFg6IG9ubHkgb25lIHRyYW5zcG9ydCBzcGVjaWZpY2F0aW9uIGlzIHBhcnNlZCAqLworc3RhdGljIHZvaWQgcnRzcF9wYXJzZV90cmFuc3BvcnQoUlRTUE1lc3NhZ2VIZWFkZXIgKnJlcGx5LCBjb25zdCBjaGFyICpwKQoreworICAgIGNoYXIgdHJhbnNwb3J0X3Byb3RvY29sWzE2XTsKKyAgICBjaGFyIHByb2ZpbGVbMTZdOworICAgIGNoYXIgbG93ZXJfdHJhbnNwb3J0WzE2XTsKKyAgICBjaGFyIHBhcmFtZXRlclsxNl07CisgICAgUlRTUFRyYW5zcG9ydEZpZWxkICp0aDsKKyAgICBjaGFyIGJ1ZlsyNTZdOworCisgICAgcmVwbHktPm5iX3RyYW5zcG9ydHMgPSAwOworCisgICAgZm9yICg7OykgeworICAgICAgICBwICs9IHN0cnNwbihwLCBTUEFDRV9DSEFSUyk7CisgICAgICAgIGlmICgqcCA9PSAnXDAnKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgdGggPSAmcmVwbHktPnRyYW5zcG9ydHNbcmVwbHktPm5iX3RyYW5zcG9ydHNdOworCisgICAgICAgIGdldF93b3JkX3NlcCh0cmFuc3BvcnRfcHJvdG9jb2wsIHNpemVvZih0cmFuc3BvcnRfcHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgIi8iLCAmcCk7CisgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcCAodHJhbnNwb3J0X3Byb3RvY29sLCAicnRwIikpIHsKKyAgICAgICAgICAgIGdldF93b3JkX3NlcChwcm9maWxlLCBzaXplb2YocHJvZmlsZSksICIvOywiLCAmcCk7CisgICAgICAgICAgICBsb3dlcl90cmFuc3BvcnRbMF0gPSAnXDAnOworICAgICAgICAgICAgLyogcnRwL2F2cC88cHJvdG9jb2w+ICovCisgICAgICAgICAgICBpZiAoKnAgPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgZ2V0X3dvcmRfc2VwKGxvd2VyX3RyYW5zcG9ydCwgc2l6ZW9mKGxvd2VyX3RyYW5zcG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7LCIsICZwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoLT50cmFuc3BvcnQgPSBSVFNQX1RSQU5TUE9SVF9SVFA7CisgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAgKHRyYW5zcG9ydF9wcm90b2NvbCwgIngtcG4tdG5nIikgfHwKKyAgICAgICAgICAgICAgICAgICAhYXZfc3RyY2FzZWNtcCAodHJhbnNwb3J0X3Byb3RvY29sLCAieC1yZWFsLXJkdCIpKSB7CisgICAgICAgICAgICAvKiB4LXBuLXRuZy88cHJvdG9jb2w+ICovCisgICAgICAgICAgICBnZXRfd29yZF9zZXAobG93ZXJfdHJhbnNwb3J0LCBzaXplb2YobG93ZXJfdHJhbnNwb3J0KSwgIi87LCIsICZwKTsKKyAgICAgICAgICAgIHByb2ZpbGVbMF0gPSAnXDAnOworICAgICAgICAgICAgdGgtPnRyYW5zcG9ydCA9IFJUU1BfVFJBTlNQT1JUX1JEVDsKKyAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcCh0cmFuc3BvcnRfcHJvdG9jb2wsICJyYXciKSkgeworICAgICAgICAgICAgZ2V0X3dvcmRfc2VwKHByb2ZpbGUsIHNpemVvZihwcm9maWxlKSwgIi87LCIsICZwKTsKKyAgICAgICAgICAgIGxvd2VyX3RyYW5zcG9ydFswXSA9ICdcMCc7CisgICAgICAgICAgICAvKiByYXcvcmF3Lzxwcm90b2NvbD4gKi8KKyAgICAgICAgICAgIGlmICgqcCA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICBnZXRfd29yZF9zZXAobG93ZXJfdHJhbnNwb3J0LCBzaXplb2YobG93ZXJfdHJhbnNwb3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjssIiwgJnApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGgtPnRyYW5zcG9ydCA9IFJUU1BfVFJBTlNQT1JUX1JBVzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAobG93ZXJfdHJhbnNwb3J0LCAiVENQIikpCisgICAgICAgICAgICB0aC0+bG93ZXJfdHJhbnNwb3J0ID0gUlRTUF9MT1dFUl9UUkFOU1BPUlRfVENQOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aC0+bG93ZXJfdHJhbnNwb3J0ID0gUlRTUF9MT1dFUl9UUkFOU1BPUlRfVURQOworCisgICAgICAgIGlmICgqcCA9PSAnOycpCisgICAgICAgICAgICBwKys7CisgICAgICAgIC8qIGdldCBlYWNoIHBhcmFtZXRlciAqLworICAgICAgICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnLCcpIHsKKyAgICAgICAgICAgIGdldF93b3JkX3NlcChwYXJhbWV0ZXIsIHNpemVvZihwYXJhbWV0ZXIpLCAiPTssIiwgJnApOworICAgICAgICAgICAgaWYgKCFzdHJjbXAocGFyYW1ldGVyLCAicG9ydCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKCpwID09ICc9JykgeworICAgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgICAgIHJ0c3BfcGFyc2VfcmFuZ2UoJnRoLT5wb3J0X21pbiwgJnRoLT5wb3J0X21heCwgJnApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChwYXJhbWV0ZXIsICJjbGllbnRfcG9ydCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKCpwID09ICc9JykgeworICAgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgICAgIHJ0c3BfcGFyc2VfcmFuZ2UoJnRoLT5jbGllbnRfcG9ydF9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoLT5jbGllbnRfcG9ydF9tYXgsICZwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAocGFyYW1ldGVyLCAic2VydmVyX3BvcnQiKSkgeworICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgICAgICBydHNwX3BhcnNlX3JhbmdlKCZ0aC0+c2VydmVyX3BvcnRfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aC0+c2VydmVyX3BvcnRfbWF4LCAmcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHBhcmFtZXRlciwgImludGVybGVhdmVkIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICAgICAgcnRzcF9wYXJzZV9yYW5nZSgmdGgtPmludGVybGVhdmVkX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGgtPmludGVybGVhdmVkX21heCwgJnApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChwYXJhbWV0ZXIsICJtdWx0aWNhc3QiKSkgeworICAgICAgICAgICAgICAgIGlmICh0aC0+bG93ZXJfdHJhbnNwb3J0ID09IFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUCkKKyAgICAgICAgICAgICAgICAgICAgdGgtPmxvd2VyX3RyYW5zcG9ydCA9IFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUF9NVUxUSUNBU1Q7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAocGFyYW1ldGVyLCAidHRsIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmVuZDsKKyAgICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgICAgICB0aC0+dHRsID0gc3RydG9sKHAsICZlbmQsIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgcCA9IGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAocGFyYW1ldGVyLCAiZGVzdGluYXRpb24iKSkgeworICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgICAgICBnZXRfd29yZF9zZXAoYnVmLCBzaXplb2YoYnVmKSwgIjssIiwgJnApOworICAgICAgICAgICAgICAgICAgICBnZXRfc29ja2FkZHIoYnVmLCAmdGgtPmRlc3RpbmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAocGFyYW1ldGVyLCAic291cmNlIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3dvcmRfc2VwKGJ1Ziwgc2l6ZW9mKGJ1ZiksICI7LCIsICZwKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfc3RybGNweSh0aC0+c291cmNlLCBidWYsIHNpemVvZih0aC0+c291cmNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHBhcmFtZXRlciwgIm1vZGUiKSkgeworICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgICAgICBnZXRfd29yZF9zZXAoYnVmLCBzaXplb2YoYnVmKSwgIjssICIsICZwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoYnVmLCAicmVjb3JkIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoYnVmLCAicmVjZWl2ZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGgtPm1vZGVfcmVjb3JkID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlICgqcCAhPSAnOycgJiYgKnAgIT0gJ1wwJyAmJiAqcCAhPSAnLCcpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgaWYgKCpwID09ICc7JykKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpwID09ICcsJykKKyAgICAgICAgICAgIHArKzsKKworICAgICAgICByZXBseS0+bmJfdHJhbnNwb3J0cysrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3J0cF9pbmZvKFJUU1BTdGF0ZSAqcnQsIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXEsIHVpbnQzMl90IHJ0cHRpbWUpCit7CisgICAgaW50IGk7CisgICAgaWYgKCFydHB0aW1lIHx8ICF1cmxbMF0pCisgICAgICAgIHJldHVybjsKKyAgICBpZiAocnQtPnRyYW5zcG9ydCAhPSBSVFNQX1RSQU5TUE9SVF9SVFApCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcnQtPm5iX3J0c3Bfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIFJUU1BTdHJlYW0gKnJ0c3Bfc3QgPSBydC0+cnRzcF9zdHJlYW1zW2ldOworICAgICAgICBSVFBEZW11eENvbnRleHQgKnJ0cGN0eCA9IHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2OworICAgICAgICBpZiAoIXJ0cGN0eCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIXN0cmNtcChydHNwX3N0LT5jb250cm9sX3VybCwgdXJsKSkgeworICAgICAgICAgICAgcnRwY3R4LT5iYXNlX3RpbWVzdGFtcCA9IHJ0cHRpbWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcnRzcF9wYXJzZV9ydHBfaW5mbyhSVFNQU3RhdGUgKnJ0LCBjb25zdCBjaGFyICpwKQoreworICAgIGludCByZWFkID0gMDsKKyAgICBjaGFyIGtleVsyMF0sIHZhbHVlWzEwMjRdLCB1cmxbMTAyNF0gPSAiIjsKKyAgICB1aW50MzJfdCBzZXEgPSAwLCBydHB0aW1lID0gMDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgcCArPSBzdHJzcG4ocCwgU1BBQ0VfQ0hBUlMpOworICAgICAgICBpZiAoISpwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGdldF93b3JkX3NlcChrZXksIHNpemVvZihrZXkpLCAiPSIsICZwKTsKKyAgICAgICAgaWYgKCpwICE9ICc9JykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwKys7CisgICAgICAgIGdldF93b3JkX3NlcCh2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwgIjssICIsICZwKTsKKyAgICAgICAgcmVhZCsrOworICAgICAgICBpZiAoIXN0cmNtcChrZXksICJ1cmwiKSkKKyAgICAgICAgICAgIGF2X3N0cmxjcHkodXJsLCB2YWx1ZSwgc2l6ZW9mKHVybCkpOworICAgICAgICBlbHNlIGlmICghc3RyY21wKGtleSwgInNlcSIpKQorICAgICAgICAgICAgc2VxID0gc3RydG91bCh2YWx1ZSwgTlVMTCwgMTApOworICAgICAgICBlbHNlIGlmICghc3RyY21wKGtleSwgInJ0cHRpbWUiKSkKKyAgICAgICAgICAgIHJ0cHRpbWUgPSBzdHJ0b3VsKHZhbHVlLCBOVUxMLCAxMCk7CisgICAgICAgIGlmICgqcCA9PSAnLCcpIHsKKyAgICAgICAgICAgIGhhbmRsZV9ydHBfaW5mbyhydCwgdXJsLCBzZXEsIHJ0cHRpbWUpOworICAgICAgICAgICAgdXJsWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIHNlcSA9IHJ0cHRpbWUgPSAwOworICAgICAgICAgICAgcmVhZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpwKQorICAgICAgICAgICAgcCsrOworICAgIH0KKyAgICBpZiAocmVhZCA+IDApCisgICAgICAgIGhhbmRsZV9ydHBfaW5mbyhydCwgdXJsLCBzZXEsIHJ0cHRpbWUpOworfQorCit2b2lkIGZmX3J0c3BfcGFyc2VfbGluZShSVFNQTWVzc2FnZUhlYWRlciAqcmVwbHksIGNvbnN0IGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJUU1BTdGF0ZSAqcnQsIGNvbnN0IGNoYXIgKm1ldGhvZCkKK3sKKyAgICBjb25zdCBjaGFyICpwOworCisgICAgLyogTk9URTogd2UgZG8gY2FzZSBpbmRlcGVuZGVudCBtYXRjaCBmb3IgYnJva2VuIHNlcnZlcnMgKi8KKyAgICBwID0gYnVmOworICAgIGlmIChhdl9zdHJpc3RhcnQocCwgIlNlc3Npb246IiwgJnApKSB7CisgICAgICAgIGludCB0OworICAgICAgICBnZXRfd29yZF9zZXAocmVwbHktPnNlc3Npb25faWQsIHNpemVvZihyZXBseS0+c2Vzc2lvbl9pZCksICI7IiwgJnApOworICAgICAgICBpZiAoYXZfc3RyaXN0YXJ0KHAsICI7dGltZW91dD0iLCAmcCkgJiYKKyAgICAgICAgICAgICh0ID0gc3RydG9sKHAsIE5VTEwsIDEwKSkgPiAwKSB7CisgICAgICAgICAgICByZXBseS0+dGltZW91dCA9IHQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGF2X3N0cmlzdGFydChwLCAiQ29udGVudC1MZW5ndGg6IiwgJnApKSB7CisgICAgICAgIHJlcGx5LT5jb250ZW50X2xlbmd0aCA9IHN0cnRvbChwLCBOVUxMLCAxMCk7CisgICAgfSBlbHNlIGlmIChhdl9zdHJpc3RhcnQocCwgIlRyYW5zcG9ydDoiLCAmcCkpIHsKKyAgICAgICAgcnRzcF9wYXJzZV90cmFuc3BvcnQocmVwbHksIHApOworICAgIH0gZWxzZSBpZiAoYXZfc3RyaXN0YXJ0KHAsICJDU2VxOiIsICZwKSkgeworICAgICAgICByZXBseS0+c2VxID0gc3RydG9sKHAsIE5VTEwsIDEwKTsKKyAgICB9IGVsc2UgaWYgKGF2X3N0cmlzdGFydChwLCAiUmFuZ2U6IiwgJnApKSB7CisgICAgICAgIHJ0c3BfcGFyc2VfcmFuZ2VfbnB0KHAsICZyZXBseS0+cmFuZ2Vfc3RhcnQsICZyZXBseS0+cmFuZ2VfZW5kKTsKKyAgICB9IGVsc2UgaWYgKGF2X3N0cmlzdGFydChwLCAiUmVhbENoYWxsZW5nZTE6IiwgJnApKSB7CisgICAgICAgIHAgKz0gc3Ryc3BuKHAsIFNQQUNFX0NIQVJTKTsKKyAgICAgICAgYXZfc3RybGNweShyZXBseS0+cmVhbF9jaGFsbGVuZ2UsIHAsIHNpemVvZihyZXBseS0+cmVhbF9jaGFsbGVuZ2UpKTsKKyAgICB9IGVsc2UgaWYgKGF2X3N0cmlzdGFydChwLCAiU2VydmVyOiIsICZwKSkgeworICAgICAgICBwICs9IHN0cnNwbihwLCBTUEFDRV9DSEFSUyk7CisgICAgICAgIGF2X3N0cmxjcHkocmVwbHktPnNlcnZlciwgcCwgc2l6ZW9mKHJlcGx5LT5zZXJ2ZXIpKTsKKyAgICB9IGVsc2UgaWYgKGF2X3N0cmlzdGFydChwLCAiTm90aWNlOiIsICZwKSB8fAorICAgICAgICAgICAgICAgYXZfc3RyaXN0YXJ0KHAsICJYLU5vdGljZToiLCAmcCkpIHsKKyAgICAgICAgcmVwbHktPm5vdGljZSA9IHN0cnRvbChwLCBOVUxMLCAxMCk7CisgICAgfSBlbHNlIGlmIChhdl9zdHJpc3RhcnQocCwgIkxvY2F0aW9uOiIsICZwKSkgeworICAgICAgICBwICs9IHN0cnNwbihwLCBTUEFDRV9DSEFSUyk7CisgICAgICAgIGF2X3N0cmxjcHkocmVwbHktPmxvY2F0aW9uLCBwICwgc2l6ZW9mKHJlcGx5LT5sb2NhdGlvbikpOworICAgIH0gZWxzZSBpZiAoYXZfc3RyaXN0YXJ0KHAsICJXV1ctQXV0aGVudGljYXRlOiIsICZwKSAmJiBydCkgeworICAgICAgICBwICs9IHN0cnNwbihwLCBTUEFDRV9DSEFSUyk7CisgICAgICAgIGZmX2h0dHBfYXV0aF9oYW5kbGVfaGVhZGVyKCZydC0+YXV0aF9zdGF0ZSwgIldXVy1BdXRoZW50aWNhdGUiLCBwKTsKKyAgICB9IGVsc2UgaWYgKGF2X3N0cmlzdGFydChwLCAiQXV0aGVudGljYXRpb24tSW5mbzoiLCAmcCkgJiYgcnQpIHsKKyAgICAgICAgcCArPSBzdHJzcG4ocCwgU1BBQ0VfQ0hBUlMpOworICAgICAgICBmZl9odHRwX2F1dGhfaGFuZGxlX2hlYWRlcigmcnQtPmF1dGhfc3RhdGUsICJBdXRoZW50aWNhdGlvbi1JbmZvIiwgcCk7CisgICAgfSBlbHNlIGlmIChhdl9zdHJpc3RhcnQocCwgIkNvbnRlbnQtQmFzZToiLCAmcCkgJiYgcnQpIHsKKyAgICAgICAgcCArPSBzdHJzcG4ocCwgU1BBQ0VfQ0hBUlMpOworICAgICAgICBpZiAobWV0aG9kICYmICFzdHJjbXAobWV0aG9kLCAiREVTQ1JJQkUiKSkKKyAgICAgICAgICAgIGF2X3N0cmxjcHkocnQtPmNvbnRyb2xfdXJpLCBwICwgc2l6ZW9mKHJ0LT5jb250cm9sX3VyaSkpOworICAgIH0gZWxzZSBpZiAoYXZfc3RyaXN0YXJ0KHAsICJSVFAtSW5mbzoiLCAmcCkgJiYgcnQpIHsKKyAgICAgICAgcCArPSBzdHJzcG4ocCwgU1BBQ0VfQ0hBUlMpOworICAgICAgICBpZiAobWV0aG9kICYmICFzdHJjbXAobWV0aG9kLCAiUExBWSIpKQorICAgICAgICAgICAgcnRzcF9wYXJzZV9ydHBfaW5mbyhydCwgcCk7CisgICAgfSBlbHNlIGlmIChhdl9zdHJpc3RhcnQocCwgIlB1YmxpYzoiLCAmcCkgJiYgcnQpIHsKKyAgICAgICAgaWYgKHN0cnN0cihwLCAiR0VUX1BBUkFNRVRFUiIpICYmCisgICAgICAgICAgICBtZXRob2QgJiYgIXN0cmNtcChtZXRob2QsICJPUFRJT05TIikpCisgICAgICAgICAgICBydC0+Z2V0X3BhcmFtZXRlcl9zdXBwb3J0ZWQgPSAxOworICAgIH0gZWxzZSBpZiAoYXZfc3RyaXN0YXJ0KHAsICJ4LUFjY2VwdC1EeW5hbWljLVJhdGU6IiwgJnApICYmIHJ0KSB7CisgICAgICAgIHAgKz0gc3Ryc3BuKHAsIFNQQUNFX0NIQVJTKTsKKyAgICAgICAgcnQtPmFjY2VwdF9keW5hbWljX3JhdGUgPSBhdG9pKHApOworICAgIH0gZWxzZSBpZiAoYXZfc3RyaXN0YXJ0KHAsICJDb250ZW50LVR5cGU6IiwgJnApKSB7CisgICAgICAgIHAgKz0gc3Ryc3BuKHAsIFNQQUNFX0NIQVJTKTsKKyAgICAgICAgYXZfc3RybGNweShyZXBseS0+Y29udGVudF90eXBlLCBwLCBzaXplb2YocmVwbHktPmNvbnRlbnRfdHlwZSkpOworICAgIH0KK30KKworLyogc2tpcCBhIFJUUC9UQ1AgaW50ZXJsZWF2ZWQgcGFja2V0ICovCit2b2lkIGZmX3J0c3Bfc2tpcF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldCwgbGVuLCBsZW4xOworICAgIHVpbnQ4X3QgYnVmWzEwMjRdOworCisgICAgcmV0ID0gZmZ1cmxfcmVhZF9jb21wbGV0ZShydC0+cnRzcF9oZCwgYnVmLCAzKTsKKyAgICBpZiAocmV0ICE9IDMpCisgICAgICAgIHJldHVybjsKKyAgICBsZW4gPSBBVl9SQjE2KGJ1ZiArIDEpOworCisgICAgYXZfZGxvZyhzLCAic2tpcHBpbmcgUlRQIHBhY2tldCBsZW49JWRcbiIsIGxlbik7CisKKyAgICAvKiBza2lwIHBheWxvYWQgKi8KKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBsZW4xID0gbGVuOworICAgICAgICBpZiAobGVuMSA+IHNpemVvZihidWYpKQorICAgICAgICAgICAgbGVuMSA9IHNpemVvZihidWYpOworICAgICAgICByZXQgPSBmZnVybF9yZWFkX2NvbXBsZXRlKHJ0LT5ydHNwX2hkLCBidWYsIGxlbjEpOworICAgICAgICBpZiAocmV0ICE9IGxlbjEpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGxlbiAtPSBsZW4xOworICAgIH0KK30KKworaW50IGZmX3J0c3BfcmVhZF9yZXBseShBVkZvcm1hdENvbnRleHQgKnMsIFJUU1BNZXNzYWdlSGVhZGVyICpyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKmNvbnRlbnRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dXJuX29uX2ludGVybGVhdmVkX2RhdGEsIGNvbnN0IGNoYXIgKm1ldGhvZCkKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgYnVmWzQwOTZdLCBidWYxWzEwMjRdLCAqcTsKKyAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaW50IHJldCwgY29udGVudF9sZW5ndGgsIGxpbmVfY291bnQgPSAwLCByZXF1ZXN0ID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyICpjb250ZW50ID0gTlVMTDsKKworc3RhcnQ6CisgICAgbGluZV9jb3VudCA9IDA7CisgICAgcmVxdWVzdCA9IDA7CisgICAgY29udGVudCA9IE5VTEw7CisgICAgbWVtc2V0KHJlcGx5LCAwLCBzaXplb2YoKnJlcGx5KSk7CisKKyAgICAvKiBwYXJzZSByZXBseSAoWFhYOiB1c2UgYnVmZmVycykgKi8KKyAgICBydC0+bGFzdF9yZXBseVswXSA9ICdcMCc7CisgICAgZm9yICg7OykgeworICAgICAgICBxID0gYnVmOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICByZXQgPSBmZnVybF9yZWFkX2NvbXBsZXRlKHJ0LT5ydHNwX2hkLCAmY2gsIDEpOworICAgICAgICAgICAgYXZfZGxvZyhzLCAicmV0PSVkIGM9JTAyeCBbJWNdXG4iLCByZXQsIGNoLCBjaCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAgICAgaWYgKGNoID09ICdcbicpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoY2ggPT0gJyQnKSB7CisgICAgICAgICAgICAgICAgLyogWFhYOiBvbmx5IHBhcnNlIGl0IGlmIGZpcnN0IGNoYXIgb24gbGluZSA/ICovCisgICAgICAgICAgICAgICAgaWYgKHJldHVybl9vbl9pbnRlcmxlYXZlZF9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBmZl9ydHNwX3NraXBfcGFja2V0KHMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCAhPSAnXHInKSB7CisgICAgICAgICAgICAgICAgaWYgKChxIC0gYnVmKSA8IHNpemVvZihidWYpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9IGNoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpxID0gJ1wwJzsKKworICAgICAgICBhdl9kbG9nKHMsICJsaW5lPSclcydcbiIsIGJ1Zik7CisKKyAgICAgICAgLyogdGVzdCBpZiBsYXN0IGxpbmUgKi8KKyAgICAgICAgaWYgKGJ1ZlswXSA9PSAnXDAnKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHAgPSBidWY7CisgICAgICAgIGlmIChsaW5lX2NvdW50ID09IDApIHsKKyAgICAgICAgICAgIC8qIGdldCByZXBseSBjb2RlICovCisgICAgICAgICAgICBnZXRfd29yZChidWYxLCBzaXplb2YoYnVmMSksICZwKTsKKyAgICAgICAgICAgIGlmICghc3RybmNtcChidWYxLCAiUlRTUC8iLCA1KSkgeworICAgICAgICAgICAgICAgIGdldF93b3JkKGJ1ZjEsIHNpemVvZihidWYxKSwgJnApOworICAgICAgICAgICAgICAgIHJlcGx5LT5zdGF0dXNfY29kZSA9IGF0b2koYnVmMSk7CisgICAgICAgICAgICAgICAgYXZfc3RybGNweShyZXBseS0+cmVhc29uLCBwLCBzaXplb2YocmVwbHktPnJlYXNvbikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9zdHJsY3B5KHJlcGx5LT5yZWFzb24sIGJ1ZjEsIHNpemVvZihyZXBseS0+cmVhc29uKSk7IC8vIG1ldGhvZAorICAgICAgICAgICAgICAgIGdldF93b3JkKGJ1ZjEsIHNpemVvZihidWYxKSwgJnApOyAvLyBvYmplY3QKKyAgICAgICAgICAgICAgICByZXF1ZXN0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZmX3J0c3BfcGFyc2VfbGluZShyZXBseSwgcCwgcnQsIG1ldGhvZCk7CisgICAgICAgICAgICBhdl9zdHJsY2F0KHJ0LT5sYXN0X3JlcGx5LCBwLCAgICBzaXplb2YocnQtPmxhc3RfcmVwbHkpKTsKKyAgICAgICAgICAgIGF2X3N0cmxjYXQocnQtPmxhc3RfcmVwbHksICJcbiIsIHNpemVvZihydC0+bGFzdF9yZXBseSkpOworICAgICAgICB9CisgICAgICAgIGxpbmVfY291bnQrKzsKKyAgICB9CisKKyAgICBpZiAocnQtPnNlc3Npb25faWRbMF0gPT0gJ1wwJyAmJiByZXBseS0+c2Vzc2lvbl9pZFswXSAhPSAnXDAnICYmICFyZXF1ZXN0KQorICAgICAgICBhdl9zdHJsY3B5KHJ0LT5zZXNzaW9uX2lkLCByZXBseS0+c2Vzc2lvbl9pZCwgc2l6ZW9mKHJ0LT5zZXNzaW9uX2lkKSk7CisKKyAgICBjb250ZW50X2xlbmd0aCA9IHJlcGx5LT5jb250ZW50X2xlbmd0aDsKKyAgICBpZiAoY29udGVudF9sZW5ndGggPiAwKSB7CisgICAgICAgIC8qIGxlYXZlIHNvbWUgcm9vbSBmb3IgYSB0cmFpbGluZyAnXDAnICh1c2VmdWwgZm9yIHNpbXBsZSBwYXJzaW5nKSAqLworICAgICAgICBjb250ZW50ID0gYXZfbWFsbG9jKGNvbnRlbnRfbGVuZ3RoICsgMSk7CisgICAgICAgIGlmICghY29udGVudCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZmdXJsX3JlYWRfY29tcGxldGUocnQtPnJ0c3BfaGQsIGNvbnRlbnQsIGNvbnRlbnRfbGVuZ3RoKTsKKyAgICAgICAgY29udGVudFtjb250ZW50X2xlbmd0aF0gPSAnXDAnOworICAgIH0KKyAgICBpZiAoY29udGVudF9wdHIpCisgICAgICAgICpjb250ZW50X3B0ciA9IGNvbnRlbnQ7CisgICAgZWxzZQorICAgICAgICBhdl9mcmVlKGNvbnRlbnQpOworCisgICAgaWYgKHJlcXVlc3QpIHsKKyAgICAgICAgY2hhciBidWZbMTAyNF07CisgICAgICAgIGNoYXIgYmFzZTY0YnVmW0FWX0JBU0U2NF9TSVpFKHNpemVvZihidWYpKV07CisgICAgICAgIGNvbnN0IGNoYXIqIHB0ciA9IGJ1ZjsKKworICAgICAgICBpZiAoIXN0cmNtcChyZXBseS0+cmVhc29uLCAiT1BUSU9OUyIpKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiUlRTUC8xLjAgMjAwIE9LXHJcbiIpOworICAgICAgICAgICAgaWYgKHJlcGx5LT5zZXEpCisgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmLCBzaXplb2YoYnVmKSwgIkNTZXE6ICVkXHJcbiIsIHJlcGx5LT5zZXEpOworICAgICAgICAgICAgaWYgKHJlcGx5LT5zZXNzaW9uX2lkWzBdKQorICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJTZXNzaW9uOiAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LT5zZXNzaW9uX2lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJSVFNQLzEuMCA1MDEgTm90IEltcGxlbWVudGVkXHJcbiIpOworICAgICAgICB9CisgICAgICAgIGF2X3N0cmxjYXQoYnVmLCAiXHJcbiIsIHNpemVvZihidWYpKTsKKworICAgICAgICBpZiAocnQtPmNvbnRyb2xfdHJhbnNwb3J0ID09IFJUU1BfTU9ERV9UVU5ORUwpIHsKKyAgICAgICAgICAgIGF2X2Jhc2U2NF9lbmNvZGUoYmFzZTY0YnVmLCBzaXplb2YoYmFzZTY0YnVmKSwgYnVmLCBzdHJsZW4oYnVmKSk7CisgICAgICAgICAgICBwdHIgPSBiYXNlNjRidWY7CisgICAgICAgIH0KKyAgICAgICAgZmZ1cmxfd3JpdGUocnQtPnJ0c3BfaGRfb3V0LCBwdHIsIHN0cmxlbihwdHIpKTsKKworICAgICAgICBydC0+bGFzdF9jbWRfdGltZSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICAgICAgLyogRXZlbiBpZiB0aGUgcmVxdWVzdCBmcm9tIHRoZSBzZXJ2ZXIgaGFkIGRhdGEsIGl0IGlzIG5vdCB0aGUgZGF0YQorICAgICAgICAgKiB0aGF0IHRoZSBjYWxsZXIgd2FudHMgb3IgZXhwZWN0cy4gVGhlIG1lbW9yeSBjb3VsZCBhbHNvIGJlIGxlYWtlZAorICAgICAgICAgKiBpZiB0aGUgYWN0dWFsIGZvbGxvd2luZyByZXBseSBoYXMgY29udGVudCBkYXRhLiAqLworICAgICAgICBpZiAoY29udGVudF9wdHIpCisgICAgICAgICAgICBhdl9mcmVlcChjb250ZW50X3B0cik7CisgICAgICAgIC8qIElmIG1ldGhvZCBpcyBzZXQsIHRoaXMgaXMgY2FsbGVkIGZyb20gZmZfcnRzcF9zZW5kX2NtZCwKKyAgICAgICAgICogd2hlcmUgYSByZXBseSB0byBleGFjdGx5IHRoaXMgcmVxdWVzdCBpcyBhd2FpdGVkLiBGb3IKKyAgICAgICAgICogY2FsbGVycyBmcm9tIHdpdGhpbiBwYWNrZXQgcmVjZWl2aW5nLCB3ZSBqdXN0IHdhbnQgdG8KKyAgICAgICAgICogcmV0dXJuIHRvIHRoZSBjYWxsZXIgYW5kIGdvIGJhY2sgdG8gcmVjZWl2aW5nIHBhY2tldHMuICovCisgICAgICAgIGlmIChtZXRob2QpCisgICAgICAgICAgICBnb3RvIHN0YXJ0OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAocnQtPnNlcSAhPSByZXBseS0+c2VxKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkNTZXEgJWQgZXhwZWN0ZWQsICVkIHJlY2VpdmVkLlxuIiwKKyAgICAgICAgICAgIHJ0LT5zZXEsIHJlcGx5LT5zZXEpOworICAgIH0KKworICAgIC8qIEVPUyAqLworICAgIGlmIChyZXBseS0+bm90aWNlID09IDIxMDEgLyogRW5kLW9mLVN0cmVhbSBSZWFjaGVkICovICAgICAgfHwKKyAgICAgICAgcmVwbHktPm5vdGljZSA9PSAyMTA0IC8qIFN0YXJ0LW9mLVN0cmVhbSBSZWFjaGVkICovICAgIHx8CisgICAgICAgIHJlcGx5LT5ub3RpY2UgPT0gMjMwNiAvKiBDb250aW51b3VzIEZlZWQgVGVybWluYXRlZCAqLykgeworICAgICAgICBydC0+c3RhdGUgPSBSVFNQX1NUQVRFX0lETEU7CisgICAgfSBlbHNlIGlmIChyZXBseS0+bm90aWNlID49IDQ0MDAgJiYgcmVwbHktPm5vdGljZSA8IDU1MDApIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsgLyogZGF0YSBvciBzZXJ2ZXIgZXJyb3IgKi8KKyAgICB9IGVsc2UgaWYgKHJlcGx5LT5ub3RpY2UgPT0gMjQwMSAvKiBUaWNrZXQgRXhwaXJlZCAqLyB8fAorICAgICAgICAgICAgIChyZXBseS0+bm90aWNlID49IDU1MDAgJiYgcmVwbHktPm5vdGljZSA8IDU2MDApIC8qIGVuZCBvZiB0ZXJtICovICkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRVBFUk0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2VuZCBhIGNvbW1hbmQgdG8gdGhlIFJUU1Agc2VydmVyIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHJlcGx5LgorICoKKyAqIEBwYXJhbSBzIFJUU1AgKGRlKW11eGVyIGNvbnRleHQKKyAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZCBmb3IgdGhlIHJlcXVlc3QKKyAqIEBwYXJhbSB1cmwgdGhlIHRhcmdldCB1cmwgZm9yIHRoZSByZXF1ZXN0CisgKiBAcGFyYW0gaGVhZGVycyBleHRyYSBoZWFkZXIgbGluZXMgdG8gaW5jbHVkZSBpbiB0aGUgcmVxdWVzdAorICogQHBhcmFtIHNlbmRfY29udGVudCBpZiBub24tbnVsbCwgdGhlIGRhdGEgdG8gc2VuZCBhcyByZXF1ZXN0IGJvZHkgY29udGVudAorICogQHBhcmFtIHNlbmRfY29udGVudF9sZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgc2VuZF9jb250ZW50IGRhdGEsIG9yIDAgaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfY29udGVudCBpcyBudWxsCisgKgorICogQHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3MsIG5vbnplcm8gb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgcnRzcF9zZW5kX2NtZF93aXRoX2NvbnRlbnRfYXN5bmMoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRob2QsIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2VuZF9jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZF9jb250ZW50X2xlbmd0aCkKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgYnVmWzQwOTZdLCAqb3V0X2J1ZjsKKyAgICBjaGFyIGJhc2U2NGJ1ZltBVl9CQVNFNjRfU0laRShzaXplb2YoYnVmKSldOworCisgICAgLyogQWRkIGluIFJUU1AgaGVhZGVycyAqLworICAgIG91dF9idWYgPSBidWY7CisgICAgcnQtPnNlcSsrOworICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyAlcyBSVFNQLzEuMFxyXG4iLCBtZXRob2QsIHVybCk7CisgICAgaWYgKGhlYWRlcnMpCisgICAgICAgIGF2X3N0cmxjYXQoYnVmLCBoZWFkZXJzLCBzaXplb2YoYnVmKSk7CisgICAgYXZfc3RybGNhdGYoYnVmLCBzaXplb2YoYnVmKSwgIkNTZXE6ICVkXHJcbiIsIHJ0LT5zZXEpOworICAgIGF2X3N0cmxjYXRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJVc2VyLUFnZW50OiAlc1xyXG4iLCAgcnQtPnVzZXJfYWdlbnQpOworICAgIGlmIChydC0+c2Vzc2lvbl9pZFswXSAhPSAnXDAnICYmICghaGVhZGVycyB8fAorICAgICAgICAhc3Ryc3RyKGhlYWRlcnMsICJcbklmLU1hdGNoOiIpKSkgeworICAgICAgICBhdl9zdHJsY2F0ZihidWYsIHNpemVvZihidWYpLCAiU2Vzc2lvbjogJXNcclxuIiwgcnQtPnNlc3Npb25faWQpOworICAgIH0KKyAgICBpZiAocnQtPmF1dGhbMF0pIHsKKyAgICAgICAgY2hhciAqc3RyID0gZmZfaHR0cF9hdXRoX2NyZWF0ZV9yZXNwb25zZSgmcnQtPmF1dGhfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQtPmF1dGgsIHVybCwgbWV0aG9kKTsKKyAgICAgICAgaWYgKHN0cikKKyAgICAgICAgICAgIGF2X3N0cmxjYXQoYnVmLCBzdHIsIHNpemVvZihidWYpKTsKKyAgICAgICAgYXZfZnJlZShzdHIpOworICAgIH0KKyAgICBpZiAoc2VuZF9jb250ZW50X2xlbmd0aCA+IDAgJiYgc2VuZF9jb250ZW50KQorICAgICAgICBhdl9zdHJsY2F0ZihidWYsIHNpemVvZihidWYpLCAiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIsIHNlbmRfY29udGVudF9sZW5ndGgpOworICAgIGF2X3N0cmxjYXQoYnVmLCAiXHJcbiIsIHNpemVvZihidWYpKTsKKworICAgIC8qIGJhc2U2NCBlbmNvZGUgcnRzcCBpZiB0dW5uZWxpbmcgKi8KKyAgICBpZiAocnQtPmNvbnRyb2xfdHJhbnNwb3J0ID09IFJUU1BfTU9ERV9UVU5ORUwpIHsKKyAgICAgICAgYXZfYmFzZTY0X2VuY29kZShiYXNlNjRidWYsIHNpemVvZihiYXNlNjRidWYpLCBidWYsIHN0cmxlbihidWYpKTsKKyAgICAgICAgb3V0X2J1ZiA9IGJhc2U2NGJ1ZjsKKyAgICB9CisKKyAgICBhdl9kbG9nKHMsICJTZW5kaW5nOlxuJXMtLVxuIiwgYnVmKTsKKworICAgIGZmdXJsX3dyaXRlKHJ0LT5ydHNwX2hkX291dCwgb3V0X2J1Ziwgc3RybGVuKG91dF9idWYpKTsKKyAgICBpZiAoc2VuZF9jb250ZW50X2xlbmd0aCA+IDAgJiYgc2VuZF9jb250ZW50KSB7CisgICAgICAgIGlmIChydC0+Y29udHJvbF90cmFuc3BvcnQgPT0gUlRTUF9NT0RFX1RVTk5FTCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInR1bm5lbGluZyBvZiBSVFNQIHJlcXVlc3RzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIGNvbnRlbnQgZGF0YSBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBmZnVybF93cml0ZShydC0+cnRzcF9oZF9vdXQsIHNlbmRfY29udGVudCwgc2VuZF9jb250ZW50X2xlbmd0aCk7CisgICAgfQorICAgIHJ0LT5sYXN0X2NtZF90aW1lID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9ydHNwX3NlbmRfY21kX2FzeW5jKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBjaGFyICpoZWFkZXJzKQoreworICAgIHJldHVybiBydHNwX3NlbmRfY21kX3dpdGhfY29udGVudF9hc3luYyhzLCBtZXRob2QsIHVybCwgaGVhZGVycywgTlVMTCwgMCk7Cit9CisKK2ludCBmZl9ydHNwX3NlbmRfY21kKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqbWV0aG9kLCBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoZWFkZXJzLCBSVFNQTWVzc2FnZUhlYWRlciAqcmVwbHksCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqY29udGVudF9wdHIpCit7CisgICAgcmV0dXJuIGZmX3J0c3Bfc2VuZF9jbWRfd2l0aF9jb250ZW50KHMsIG1ldGhvZCwgdXJsLCBoZWFkZXJzLCByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF9wdHIsIE5VTEwsIDApOworfQorCitpbnQgZmZfcnRzcF9zZW5kX2NtZF93aXRoX2NvbnRlbnQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCwgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFNQTWVzc2FnZUhlYWRlciAqcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKmNvbnRlbnRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlbmRfY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZF9jb250ZW50X2xlbmd0aCkKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIEhUVFBBdXRoVHlwZSBjdXJfYXV0aF90eXBlOworICAgIGludCByZXQsIGF0dGVtcHRzID0gMDsKKworcmV0cnk6CisgICAgY3VyX2F1dGhfdHlwZSA9IHJ0LT5hdXRoX3N0YXRlLmF1dGhfdHlwZTsKKyAgICBpZiAoKHJldCA9IHJ0c3Bfc2VuZF9jbWRfd2l0aF9jb250ZW50X2FzeW5jKHMsIG1ldGhvZCwgdXJsLCBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2NvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2NvbnRlbnRfbGVuZ3RoKSkpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3J0c3BfcmVhZF9yZXBseShzLCByZXBseSwgY29udGVudF9wdHIsIDAsIG1ldGhvZCkgKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgYXR0ZW1wdHMrKzsKKworICAgIGlmIChyZXBseS0+c3RhdHVzX2NvZGUgPT0gNDAxICYmCisgICAgICAgIChjdXJfYXV0aF90eXBlID09IEhUVFBfQVVUSF9OT05FIHx8IHJ0LT5hdXRoX3N0YXRlLnN0YWxlKSAmJgorICAgICAgICBydC0+YXV0aF9zdGF0ZS5hdXRoX3R5cGUgIT0gSFRUUF9BVVRIX05PTkUgJiYgYXR0ZW1wdHMgPCAyKQorICAgICAgICBnb3RvIHJldHJ5OworCisgICAgaWYgKHJlcGx5LT5zdGF0dXNfY29kZSA+IDQwMCl7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJtZXRob2QgJXMgZmFpbGVkOiAlZCVzXG4iLAorICAgICAgICAgICAgICAgbWV0aG9kLAorICAgICAgICAgICAgICAgcmVwbHktPnN0YXR1c19jb2RlLAorICAgICAgICAgICAgICAgcmVwbHktPnJlYXNvbik7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICIlc1xuIiwgcnQtPmxhc3RfcmVwbHkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfcnRzcF9tYWtlX3NldHVwX3JlcXVlc3QoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dlcl90cmFuc3BvcnQsIGNvbnN0IGNoYXIgKnJlYWxfY2hhbGxlbmdlKQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJ0eCA9IDAsIGosIGksIGVyciwgaW50ZXJsZWF2ZSA9IDAsIHBvcnRfb2ZmOworICAgIFJUU1BTdHJlYW0gKnJ0c3Bfc3Q7CisgICAgUlRTUE1lc3NhZ2VIZWFkZXIgcmVwbHkxLCAqcmVwbHkgPSAmcmVwbHkxOworICAgIGNoYXIgY21kWzIwNDhdOworICAgIGNvbnN0IGNoYXIgKnRyYW5zX3ByZWY7CisKKyAgICBpZiAocnQtPnRyYW5zcG9ydCA9PSBSVFNQX1RSQU5TUE9SVF9SRFQpCisgICAgICAgIHRyYW5zX3ByZWYgPSAieC1wbi10bmciOworICAgIGVsc2UgaWYgKHJ0LT50cmFuc3BvcnQgPT0gUlRTUF9UUkFOU1BPUlRfUkFXKQorICAgICAgICB0cmFuc19wcmVmID0gIlJBVy9SQVciOworICAgIGVsc2UKKyAgICAgICAgdHJhbnNfcHJlZiA9ICJSVFAvQVZQIjsKKworICAgIC8qIGRlZmF1bHQgdGltZW91dDogMSBtaW51dGUgKi8KKyAgICBydC0+dGltZW91dCA9IDYwOworCisgICAgLyogQ2hvb3NlIGEgcmFuZG9tIHN0YXJ0aW5nIG9mZnNldCB3aXRoaW4gdGhlIGZpcnN0IGhhbGYgb2YgdGhlCisgICAgICogcG9ydCByYW5nZSwgdG8gYWxsb3cgZm9yIGEgbnVtYmVyIG9mIHBvcnRzIHRvIHRyeSBldmVuIGlmIHRoZSBvZmZzZXQKKyAgICAgKiBoYXBwZW5zIHRvIGJlIGF0IHRoZSBlbmQgb2YgdGhlIHJhbmRvbSByYW5nZS4gKi8KKyAgICBwb3J0X29mZiA9IGF2X2dldF9yYW5kb21fc2VlZCgpICUgKChydC0+cnRwX3BvcnRfbWF4IC0gcnQtPnJ0cF9wb3J0X21pbikvMik7CisgICAgLyogZXZlbiByYW5kb20gb2Zmc2V0ICovCisgICAgcG9ydF9vZmYgLT0gcG9ydF9vZmYgJiAweDAxOworCisgICAgZm9yIChqID0gcnQtPnJ0cF9wb3J0X21pbiArIHBvcnRfb2ZmLCBpID0gMDsgaSA8IHJ0LT5uYl9ydHNwX3N0cmVhbXM7ICsraSkgeworICAgICAgICBjaGFyIHRyYW5zcG9ydFsyMDQ4XTsKKworICAgICAgICAvKgorICAgICAgICAgKiBXTVMgc2VydmVzIGFsbCBVRFAgZGF0YSBvdmVyIGEgc2luZ2xlIGNvbm5lY3Rpb24sIHRoZSBSVFgsIHdoaWNoCisgICAgICAgICAqIGlzbid0IG5lY2Vzc2FyaWx5IHRoZSBmaXJzdCBpbiB0aGUgU0RQIGJ1dCBoYXMgdG8gYmUgdGhlIGZpcnN0CisgICAgICAgICAqIHRvIGJlIHNldCB1cCwgZWxzZSB0aGUgc2Vjb25kL3RoaXJkIFNFVFVQIHdpbGwgZmFpbCB3aXRoIGEgNDYxLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGxvd2VyX3RyYW5zcG9ydCA9PSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9VRFAgJiYKKyAgICAgICAgICAgICBydC0+c2VydmVyX3R5cGUgPT0gUlRTUF9TRVJWRVJfV01TKSB7CisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogcnR4IGZpcnN0ICovCisgICAgICAgICAgICAgICAgZm9yIChydHggPSAwOyBydHggPCBydC0+bmJfcnRzcF9zdHJlYW1zOyBydHgrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gc3RybGVuKHJ0LT5ydHNwX3N0cmVhbXNbcnR4XS0+Y29udHJvbF91cmwpOworICAgICAgICAgICAgICAgICAgICBpZiAobGVuID49IDQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAocnQtPnJ0c3Bfc3RyZWFtc1tydHhdLT5jb250cm9sX3VybCArIGxlbiAtIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvcnR4IikpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJ0eCA9PSBydC0+bmJfcnRzcF9zdHJlYW1zKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7IC8qIG5vIFJUWCBmb3VuZCAqLworICAgICAgICAgICAgICAgIHJ0c3Bfc3QgPSBydC0+cnRzcF9zdHJlYW1zW3J0eF07CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1tpID4gcnR4ID8gaSA6IGkgLSAxXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1tpXTsKKworICAgICAgICAvKiBSVFAvVURQICovCisgICAgICAgIGlmIChsb3dlcl90cmFuc3BvcnQgPT0gUlRTUF9MT1dFUl9UUkFOU1BPUlRfVURQKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOworCisgICAgICAgICAgICBpZiAocnQtPnNlcnZlcl90eXBlID09IFJUU1BfU0VSVkVSX1dNUyAmJiBpID4gMSkgeworICAgICAgICAgICAgICAgIHBvcnQgPSByZXBseS0+dHJhbnNwb3J0c1swXS5jbGllbnRfcG9ydF9taW47CisgICAgICAgICAgICAgICAgZ290byBoYXZlX3BvcnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGZpcnN0IHRyeSBpbiBzcGVjaWZpZWQgcG9ydCByYW5nZSAqLworICAgICAgICAgICAgd2hpbGUgKGogPD0gcnQtPnJ0cF9wb3J0X21heCkgeworICAgICAgICAgICAgICAgIGZmX3VybF9qb2luKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJydHAiLCBOVUxMLCBob3N0LCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiP2xvY2FscG9ydD0lZCIsIGopOworICAgICAgICAgICAgICAgIC8qIHdlIHdpbGwgdXNlIHR3byBwb3J0cyBwZXIgcnRwIHN0cmVhbSAocnRwIGFuZCBydGNwKSAqLworICAgICAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAoIWZmdXJsX29wZW4oJnJ0c3Bfc3QtPnJ0cF9oYW5kbGUsIGJ1ZiwgQVZJT19GTEFHX1JFQURfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnRwX29wZW5lZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiBhbiBpbnB1dCBSVFAgcG9ydFxuIik7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgcnRwX29wZW5lZDoKKyAgICAgICAgICAgIHBvcnQgPSBmZl9ydHBfZ2V0X2xvY2FsX3J0cF9wb3J0KHJ0c3Bfc3QtPnJ0cF9oYW5kbGUpOworICAgICAgICBoYXZlX3BvcnQ6CisgICAgICAgICAgICBzbnByaW50Zih0cmFuc3BvcnQsIHNpemVvZih0cmFuc3BvcnQpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICIlcy9VRFA7IiwgdHJhbnNfcHJlZik7CisgICAgICAgICAgICBpZiAocnQtPnNlcnZlcl90eXBlICE9IFJUU1BfU0VSVkVSX1JFQUwpCisgICAgICAgICAgICAgICAgYXZfc3RybGNhdCh0cmFuc3BvcnQsICJ1bmljYXN0OyIsIHNpemVvZih0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgIGF2X3N0cmxjYXRmKHRyYW5zcG9ydCwgc2l6ZW9mKHRyYW5zcG9ydCksCisgICAgICAgICAgICAgICAgICAgICAiY2xpZW50X3BvcnQ9JWQiLCBwb3J0KTsKKyAgICAgICAgICAgIGlmIChydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCAmJgorICAgICAgICAgICAgICAgICEocnQtPnNlcnZlcl90eXBlID09IFJUU1BfU0VSVkVSX1dNUyAmJiBpID4gMCkpCisgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYodHJhbnNwb3J0LCBzaXplb2YodHJhbnNwb3J0KSwgIi0lZCIsIHBvcnQgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJUUC9UQ1AgKi8KKyAgICAgICAgZWxzZSBpZiAobG93ZXJfdHJhbnNwb3J0ID09IFJUU1BfTE9XRVJfVFJBTlNQT1JUX1RDUCkgeworICAgICAgICAgICAgLyogRm9yIFdNUyBzdHJlYW1zLCB0aGUgYXBwbGljYXRpb24gc3RyZWFtcyBhcmUgb25seSB1c2VkIGZvcgorICAgICAgICAgICAgICogVURQLiBXaGVuIHRyeWluZyB0byBzZXQgaXQgdXAgZm9yIFRDUCBzdHJlYW1zLCB0aGUgc2VydmVyCisgICAgICAgICAgICAgKiB3aWxsIHJldHVybiBhbiBlcnJvci4gVGhlcmVmb3JlLCB3ZSBza2lwIHRob3NlIHN0cmVhbXMuICovCisgICAgICAgICAgICBpZiAocnQtPnNlcnZlcl90eXBlID09IFJUU1BfU0VSVkVSX1dNUyAmJgorICAgICAgICAgICAgICAgIChydHNwX3N0LT5zdHJlYW1faW5kZXggPCAwIHx8CisgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbcnRzcF9zdC0+c3RyZWFtX2luZGV4XS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0KKyAgICAgICAgICAgICAgICAgICAgQVZNRURJQV9UWVBFX0RBVEEpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgc25wcmludGYodHJhbnNwb3J0LCBzaXplb2YodHJhbnNwb3J0KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAiJXMvVENQOyIsIHRyYW5zX3ByZWYpOworICAgICAgICAgICAgaWYgKHJ0LT50cmFuc3BvcnQgIT0gUlRTUF9UUkFOU1BPUlRfUkRUKQorICAgICAgICAgICAgICAgIGF2X3N0cmxjYXQodHJhbnNwb3J0LCAidW5pY2FzdDsiLCBzaXplb2YodHJhbnNwb3J0KSk7CisgICAgICAgICAgICBhdl9zdHJsY2F0Zih0cmFuc3BvcnQsIHNpemVvZih0cmFuc3BvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgImludGVybGVhdmVkPSVkLSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGVhdmUsIGludGVybGVhdmUgKyAxKTsKKyAgICAgICAgICAgIGludGVybGVhdmUgKz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGVsc2UgaWYgKGxvd2VyX3RyYW5zcG9ydCA9PSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9VRFBfTVVMVElDQVNUKSB7CisgICAgICAgICAgICBzbnByaW50Zih0cmFuc3BvcnQsIHNpemVvZih0cmFuc3BvcnQpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICIlcy9VRFA7bXVsdGljYXN0IiwgdHJhbnNfcHJlZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPm9mb3JtYXQpIHsKKyAgICAgICAgICAgIGF2X3N0cmxjYXQodHJhbnNwb3J0LCAiO21vZGU9cmVjb3JkIiwgc2l6ZW9mKHRyYW5zcG9ydCkpOworICAgICAgICB9IGVsc2UgaWYgKHJ0LT5zZXJ2ZXJfdHlwZSA9PSBSVFNQX1NFUlZFUl9SRUFMIHx8CisgICAgICAgICAgICAgICAgICAgcnQtPnNlcnZlcl90eXBlID09IFJUU1BfU0VSVkVSX1dNUykKKyAgICAgICAgICAgIGF2X3N0cmxjYXQodHJhbnNwb3J0LCAiO21vZGU9cGxheSIsIHNpemVvZih0cmFuc3BvcnQpKTsKKyAgICAgICAgc25wcmludGYoY21kLCBzaXplb2YoY21kKSwKKyAgICAgICAgICAgICAgICAgIlRyYW5zcG9ydDogJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKKyAgICAgICAgaWYgKHJ0LT5hY2NlcHRfZHluYW1pY19yYXRlKQorICAgICAgICAgICAgYXZfc3RybGNhdChjbWQsICJ4LUR5bmFtaWMtUmF0ZTogMFxyXG4iLCBzaXplb2YoY21kKSk7CisgICAgICAgIGlmIChDT05GSUdfUlRQREVDICYmIGkgPT0gMCAmJiBydC0+c2VydmVyX3R5cGUgPT0gUlRTUF9TRVJWRVJfUkVBTCkgeworICAgICAgICAgICAgY2hhciByZWFsX3Jlc1s0MV0sIHJlYWxfY3N1bVs5XTsKKyAgICAgICAgICAgIGZmX3JkdF9jYWxjX3Jlc3BvbnNlX2FuZF9jaGVja3N1bShyZWFsX3JlcywgcmVhbF9jc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxfY2hhbGxlbmdlKTsKKyAgICAgICAgICAgIGF2X3N0cmxjYXRmKGNtZCwgc2l6ZW9mKGNtZCksCisgICAgICAgICAgICAgICAgICAgICAgICAiSWYtTWF0Y2g6ICVzXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZWFsQ2hhbGxlbmdlMjogJXMsIHNkPSVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBydC0+c2Vzc2lvbl9pZCwgcmVhbF9yZXMsIHJlYWxfY3N1bSk7CisgICAgICAgIH0KKyAgICAgICAgZmZfcnRzcF9zZW5kX2NtZChzLCAiU0VUVVAiLCBydHNwX3N0LT5jb250cm9sX3VybCwgY21kLCByZXBseSwgTlVMTCk7CisgICAgICAgIGlmIChyZXBseS0+c3RhdHVzX2NvZGUgPT0gNDYxIC8qIFVuc3VwcG9ydGVkIHByb3RvY29sICovICYmIGkgPT0gMCkgeworICAgICAgICAgICAgZXJyID0gMTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfSBlbHNlIGlmIChyZXBseS0+c3RhdHVzX2NvZGUgIT0gUlRTUF9TVEFUVVNfT0sgfHwKKyAgICAgICAgICAgICAgICAgICByZXBseS0+bmJfdHJhbnNwb3J0cyAhPSAxKSB7CisgICAgICAgICAgICBlcnIgPSBmZl9ydHNwX2F2ZXJyb3IocmVwbHktPnN0YXR1c19jb2RlLCBBVkVSUk9SX0lOVkFMSUREQVRBKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFhYWDogc2FtZSBwcm90b2NvbCBmb3IgYWxsIHN0cmVhbXMgaXMgcmVxdWlyZWQgKi8KKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBpZiAocmVwbHktPnRyYW5zcG9ydHNbMF0ubG93ZXJfdHJhbnNwb3J0ICE9IHJ0LT5sb3dlcl90cmFuc3BvcnQgfHwKKyAgICAgICAgICAgICAgICByZXBseS0+dHJhbnNwb3J0c1swXS50cmFuc3BvcnQgIT0gcnQtPnRyYW5zcG9ydCkgeworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnQtPmxvd2VyX3RyYW5zcG9ydCA9IHJlcGx5LT50cmFuc3BvcnRzWzBdLmxvd2VyX3RyYW5zcG9ydDsKKyAgICAgICAgICAgIHJ0LT50cmFuc3BvcnQgPSByZXBseS0+dHJhbnNwb3J0c1swXS50cmFuc3BvcnQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBGYWlsIGlmIHRoZSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggYW5vdGhlciBsb3dlciB0cmFuc3BvcnQgbW9kZQorICAgICAgICAgKiB0aGFuIHdoYXQgd2UgcmVxdWVzdGVkLiAqLworICAgICAgICBpZiAocmVwbHktPnRyYW5zcG9ydHNbMF0ubG93ZXJfdHJhbnNwb3J0ICE9IGxvd2VyX3RyYW5zcG9ydCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vbm1hdGNoaW5nIHRyYW5zcG9ydCBpbiBzZXJ2ZXIgcmVwbHlcbiIpOworICAgICAgICAgICAgZXJyID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChyZXBseS0+dHJhbnNwb3J0c1swXS5sb3dlcl90cmFuc3BvcnQpIHsKKyAgICAgICAgY2FzZSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9UQ1A6CisgICAgICAgICAgICBydHNwX3N0LT5pbnRlcmxlYXZlZF9taW4gPSByZXBseS0+dHJhbnNwb3J0c1swXS5pbnRlcmxlYXZlZF9taW47CisgICAgICAgICAgICBydHNwX3N0LT5pbnRlcmxlYXZlZF9tYXggPSByZXBseS0+dHJhbnNwb3J0c1swXS5pbnRlcmxlYXZlZF9tYXg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUDogeworICAgICAgICAgICAgY2hhciB1cmxbMTAyNF0sIG9wdGlvbnNbMzBdID0gIiI7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwZWVyID0gaG9zdDsKKworICAgICAgICAgICAgaWYgKHJ0LT5ydHNwX2ZsYWdzICYgUlRTUF9GTEFHX0ZJTFRFUl9TUkMpCisgICAgICAgICAgICAgICAgYXZfc3RybGNweShvcHRpb25zLCAiP2Nvbm5lY3Q9MSIsIHNpemVvZihvcHRpb25zKSk7CisgICAgICAgICAgICAvKiBVc2Ugc291cmNlIGFkZHJlc3MgaWYgc3BlY2lmaWVkICovCisgICAgICAgICAgICBpZiAocmVwbHktPnRyYW5zcG9ydHNbMF0uc291cmNlWzBdKQorICAgICAgICAgICAgICAgIHBlZXIgPSByZXBseS0+dHJhbnNwb3J0c1swXS5zb3VyY2U7CisgICAgICAgICAgICBmZl91cmxfam9pbih1cmwsIHNpemVvZih1cmwpLCAicnRwIiwgTlVMTCwgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LT50cmFuc3BvcnRzWzBdLnNlcnZlcl9wb3J0X21pbiwgIiVzIiwgb3B0aW9ucyk7CisgICAgICAgICAgICBpZiAoIShydC0+c2VydmVyX3R5cGUgPT0gUlRTUF9TRVJWRVJfV01TICYmIGkgPiAxKSAmJgorICAgICAgICAgICAgICAgIGZmX3J0cF9zZXRfcmVtb3RlX3VybChydHNwX3N0LT5ydHBfaGFuZGxlLCB1cmwpIDwgMCkgeworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogVHJ5IHRvIGluaXRpYWxpemUgdGhlIGNvbm5lY3Rpb24gc3RhdGUgaW4gYQorICAgICAgICAgICAgICogcG90ZW50aWFsIE5BVCByb3V0ZXIgYnkgc2VuZGluZyBkdW1teSBwYWNrZXRzLgorICAgICAgICAgICAgICogUlRQL1JUQ1AgZHVtbXkgcGFja2V0cyBhcmUgdXNlZCBmb3IgUkRULCB0b28uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChDT05GSUdfUlRQREVDICYmCisgICAgICAgICAgICAgICAgIShydC0+c2VydmVyX3R5cGUgPT0gUlRTUF9TRVJWRVJfV01TICYmIGkgPiAxKSAmJiBzLT5pZm9ybWF0KQorICAgICAgICAgICAgICAgIGZmX3J0cF9zZW5kX3B1bmNoX3BhY2tldHMocnRzcF9zdC0+cnRwX2hhbmRsZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUF9NVUxUSUNBU1Q6IHsKKyAgICAgICAgICAgIGNoYXIgdXJsWzEwMjRdLCBuYW1lYnVmWzUwXSwgb3B0YnVmWzIwXSA9ICIiOworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKKyAgICAgICAgICAgIGludCBwb3J0LCB0dGw7CisKKyAgICAgICAgICAgIGlmIChyZXBseS0+dHJhbnNwb3J0c1swXS5kZXN0aW5hdGlvbi5zc19mYW1pbHkpIHsKKyAgICAgICAgICAgICAgICBhZGRyICAgICAgPSByZXBseS0+dHJhbnNwb3J0c1swXS5kZXN0aW5hdGlvbjsKKyAgICAgICAgICAgICAgICBwb3J0ICAgICAgPSByZXBseS0+dHJhbnNwb3J0c1swXS5wb3J0X21pbjsKKyAgICAgICAgICAgICAgICB0dGwgICAgICAgPSByZXBseS0+dHJhbnNwb3J0c1swXS50dGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFkZHIgICAgICA9IHJ0c3Bfc3QtPnNkcF9pcDsKKyAgICAgICAgICAgICAgICBwb3J0ICAgICAgPSBydHNwX3N0LT5zZHBfcG9ydDsKKyAgICAgICAgICAgICAgICB0dGwgICAgICAgPSBydHNwX3N0LT5zZHBfdHRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR0bCA+IDApCisgICAgICAgICAgICAgICAgc25wcmludGYob3B0YnVmLCBzaXplb2Yob3B0YnVmKSwgIj90dGw9JWQiLCB0dGwpOworICAgICAgICAgICAgZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciopICZhZGRyLCBzaXplb2YoYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lYnVmLCBzaXplb2YobmFtZWJ1ZiksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKTsKKyAgICAgICAgICAgIGZmX3VybF9qb2luKHVybCwgc2l6ZW9mKHVybCksICJydHAiLCBOVUxMLCBuYW1lYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwgIiVzIiwgb3B0YnVmKTsKKyAgICAgICAgICAgIGlmIChmZnVybF9vcGVuKCZydHNwX3N0LT5ydHBfaGFuZGxlLCB1cmwsIEFWSU9fRkxBR19SRUFEX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCkgPCAwKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChlcnIgPSBmZl9ydHNwX29wZW5fdHJhbnNwb3J0X2N0eChzLCBydHNwX3N0KSkpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHJ0LT5uYl9ydHNwX3N0cmVhbXMgJiYgcmVwbHktPnRpbWVvdXQgPiAwKQorICAgICAgICBydC0+dGltZW91dCA9IHJlcGx5LT50aW1lb3V0OworCisgICAgaWYgKHJ0LT5zZXJ2ZXJfdHlwZSA9PSBSVFNQX1NFUlZFUl9SRUFMKQorICAgICAgICBydC0+bmVlZF9zdWJzY3JpcHRpb24gPSAxOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZmZfcnRzcF91bmRvX3NldHVwKHMsIDApOworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgZmZfcnRzcF9jbG9zZV9jb25uZWN0aW9ucyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBpZiAocnQtPnJ0c3BfaGRfb3V0ICE9IHJ0LT5ydHNwX2hkKSBmZnVybF9jbG9zZShydC0+cnRzcF9oZF9vdXQpOworICAgIGZmdXJsX2Nsb3NlKHJ0LT5ydHNwX2hkKTsKKyAgICBydC0+cnRzcF9oZCA9IHJ0LT5ydHNwX2hkX291dCA9IE5VTEw7Cit9CisKK2ludCBmZl9ydHNwX2Nvbm5lY3QoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgY2hhciBwcm90b1sxMjhdLCBob3N0WzEwMjRdLCBwYXRoWzEwMjRdOworICAgIGNoYXIgdGNwbmFtZVsxMDI0XSwgY21kWzIwNDhdLCBhdXRoWzEyOF07CisgICAgY29uc3QgY2hhciAqbG93ZXJfcnRzcF9wcm90byA9ICJ0Y3AiOworICAgIGludCBwb3J0LCBlcnIsIHRjcF9mZDsKKyAgICBSVFNQTWVzc2FnZUhlYWRlciByZXBseTEgPSB7MH0sICpyZXBseSA9ICZyZXBseTE7CisgICAgaW50IGxvd2VyX3RyYW5zcG9ydF9tYXNrID0gMDsKKyAgICBpbnQgZGVmYXVsdF9wb3J0ID0gUlRTUF9ERUZBVUxUX1BPUlQ7CisgICAgY2hhciByZWFsX2NoYWxsZW5nZVs2NF0gPSAiIjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBwZWVyOworICAgIHNvY2tsZW5fdCBwZWVyX2xlbiA9IHNpemVvZihwZWVyKTsKKworICAgIGlmIChydC0+cnRwX3BvcnRfbWF4IDwgcnQtPnJ0cF9wb3J0X21pbikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBVRFAgcG9ydCByYW5nZSwgbWF4IHBvcnQgJWQgbGVzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFuIG1pbiBwb3J0ICVkXG4iLCBydC0+cnRwX3BvcnRfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQtPnJ0cF9wb3J0X21pbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKCFmZl9uZXR3b3JrX2luaXQoKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIGlmIChzLT5tYXhfZGVsYXkgPCAwKSAvKiBOb3Qgc2V0IGJ5IHRoZSBjYWxsZXIgKi8KKyAgICAgICAgcy0+bWF4X2RlbGF5ID0gcy0+aWZvcm1hdCA/IERFRkFVTFRfUkVPUkRFUklOR19ERUxBWSA6IDA7CisKKyAgICBydC0+Y29udHJvbF90cmFuc3BvcnQgPSBSVFNQX01PREVfUExBSU47CisgICAgaWYgKHJ0LT5sb3dlcl90cmFuc3BvcnRfbWFzayAmICgxIDw8IFJUU1BfTE9XRVJfVFJBTlNQT1JUX0hUVFApKSB7CisgICAgICAgIHJ0LT5sb3dlcl90cmFuc3BvcnRfbWFzayA9IDEgPDwgUlRTUF9MT1dFUl9UUkFOU1BPUlRfVENQOworICAgICAgICBydC0+Y29udHJvbF90cmFuc3BvcnQgPSBSVFNQX01PREVfVFVOTkVMOworICAgIH0KKyAgICAvKiBPbmx5IHBhc3MgdGhyb3VnaCB2YWxpZCBmbGFncyBmcm9tIGhlcmUgKi8KKyAgICBydC0+bG93ZXJfdHJhbnNwb3J0X21hc2sgJj0gKDEgPDwgUlRTUF9MT1dFUl9UUkFOU1BPUlRfTkIpIC0gMTsKKworcmVkaXJlY3Q6CisgICAgLyogZXh0cmFjdCBob3N0bmFtZSBhbmQgcG9ydCAqLworICAgIGF2X3VybF9zcGxpdChwcm90bywgc2l6ZW9mKHByb3RvKSwgYXV0aCwgc2l6ZW9mKGF1dGgpLAorICAgICAgICAgICAgICAgICBob3N0LCBzaXplb2YoaG9zdCksICZwb3J0LCBwYXRoLCBzaXplb2YocGF0aCksIHMtPmZpbGVuYW1lKTsKKworICAgIGlmICghc3RyY21wKHByb3RvLCAicnRzcHMiKSkgeworICAgICAgICBsb3dlcl9ydHNwX3Byb3RvICAgICAgICAgPSAidGxzIjsKKyAgICAgICAgZGVmYXVsdF9wb3J0ICAgICAgICAgICAgID0gUlRTUFNfREVGQVVMVF9QT1JUOworICAgICAgICBydC0+bG93ZXJfdHJhbnNwb3J0X21hc2sgPSAxIDw8IFJUU1BfTE9XRVJfVFJBTlNQT1JUX1RDUDsKKyAgICB9CisKKyAgICBpZiAoKmF1dGgpIHsKKyAgICAgICAgYXZfc3RybGNweShydC0+YXV0aCwgYXV0aCwgc2l6ZW9mKHJ0LT5hdXRoKSk7CisgICAgfQorICAgIGlmIChwb3J0IDwgMCkKKyAgICAgICAgcG9ydCA9IGRlZmF1bHRfcG9ydDsKKworICAgIGxvd2VyX3RyYW5zcG9ydF9tYXNrID0gcnQtPmxvd2VyX3RyYW5zcG9ydF9tYXNrOworCisgICAgaWYgKCFsb3dlcl90cmFuc3BvcnRfbWFzaykKKyAgICAgICAgbG93ZXJfdHJhbnNwb3J0X21hc2sgPSAoMSA8PCBSVFNQX0xPV0VSX1RSQU5TUE9SVF9OQikgLSAxOworCisgICAgaWYgKHMtPm9mb3JtYXQpIHsKKyAgICAgICAgLyogT25seSBVRFAgb3IgVENQIC0gVURQIG11bHRpY2FzdCBpc24ndCBzdXBwb3J0ZWQuICovCisgICAgICAgIGxvd2VyX3RyYW5zcG9ydF9tYXNrICY9ICgxIDw8IFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBSVFNQX0xPV0VSX1RSQU5TUE9SVF9UQ1ApOworICAgICAgICBpZiAoIWxvd2VyX3RyYW5zcG9ydF9tYXNrIHx8IHJ0LT5jb250cm9sX3RyYW5zcG9ydCA9PSBSVFNQX01PREVfVFVOTkVMKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgbG93ZXIgdHJhbnNwb3J0IG1ldGhvZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgVURQIGFuZCBUQ1AgYXJlIHN1cHBvcnRlZCBmb3Igb3V0cHV0LlxuIik7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIFVSSSB1c2VkIGluIHJlcXVlc3Q7IHRoaXMgaXMgc2ltaWxhciB0byBzLT5maWxlbmFtZSwKKyAgICAgKiBidXQgd2l0aCBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyByZW1vdmVkIGFuZCBSVFNQIHNwZWNpZmljIG9wdGlvbnMKKyAgICAgKiBzdHJpcHBlZCBvdXQuICovCisgICAgZmZfdXJsX2pvaW4ocnQtPmNvbnRyb2xfdXJpLCBzaXplb2YocnQtPmNvbnRyb2xfdXJpKSwgcHJvdG8sIE5VTEwsCisgICAgICAgICAgICAgICAgaG9zdCwgcG9ydCwgIiVzIiwgcGF0aCk7CisKKyAgICBpZiAocnQtPmNvbnRyb2xfdHJhbnNwb3J0ID09IFJUU1BfTU9ERV9UVU5ORUwpIHsKKyAgICAgICAgLyogc2V0IHVwIGluaXRpYWwgaGFuZHNoYWtlIGZvciB0dW5uZWxpbmcgKi8KKyAgICAgICAgY2hhciBodHRwbmFtZVsxMDI0XTsKKyAgICAgICAgY2hhciBzZXNzaW9uY29va2llWzE3XTsKKyAgICAgICAgY2hhciBoZWFkZXJzWzEwMjRdOworCisgICAgICAgIGZmX3VybF9qb2luKGh0dHBuYW1lLCBzaXplb2YoaHR0cG5hbWUpLCAiaHR0cCIsIGF1dGgsIGhvc3QsIHBvcnQsICIlcyIsIHBhdGgpOworICAgICAgICBzbnByaW50ZihzZXNzaW9uY29va2llLCBzaXplb2Yoc2Vzc2lvbmNvb2tpZSksICIlMDh4JTA4eCIsCisgICAgICAgICAgICAgICAgIGF2X2dldF9yYW5kb21fc2VlZCgpLCBhdl9nZXRfcmFuZG9tX3NlZWQoKSk7CisKKyAgICAgICAgLyogR0VUIHJlcXVlc3RzICovCisgICAgICAgIGlmIChmZnVybF9hbGxvYygmcnQtPnJ0c3BfaGQsIGh0dHBuYW1lLCBBVklPX0ZMQUdfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2spIDwgMCkgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgLyogZ2VuZXJhdGUgR0VUIGhlYWRlcnMgKi8KKyAgICAgICAgc25wcmludGYoaGVhZGVycywgc2l6ZW9mKGhlYWRlcnMpLAorICAgICAgICAgICAgICAgICAieC1zZXNzaW9uY29va2llOiAlc1xyXG4iCisgICAgICAgICAgICAgICAgICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtcnRzcC10dW5uZWxsZWRcclxuIgorICAgICAgICAgICAgICAgICAiUHJhZ21hOiBuby1jYWNoZVxyXG4iCisgICAgICAgICAgICAgICAgICJDYWNoZS1Db250cm9sOiBuby1jYWNoZVxyXG4iLAorICAgICAgICAgICAgICAgICBzZXNzaW9uY29va2llKTsKKyAgICAgICAgYXZfb3B0X3NldChydC0+cnRzcF9oZC0+cHJpdl9kYXRhLCAiaGVhZGVycyIsIGhlYWRlcnMsIDApOworCisgICAgICAgIC8qIGNvbXBsZXRlIHRoZSBjb25uZWN0aW9uICovCisgICAgICAgIGlmIChmZnVybF9jb25uZWN0KHJ0LT5ydHNwX2hkLCBOVUxMKSkgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgLyogUE9TVCByZXF1ZXN0cyAqLworICAgICAgICBpZiAoZmZ1cmxfYWxsb2MoJnJ0LT5ydHNwX2hkX291dCwgaHR0cG5hbWUsIEFWSU9fRkxBR19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2spIDwgMCApIHsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGdlbmVyYXRlIFBPU1QgaGVhZGVycyAqLworICAgICAgICBzbnByaW50ZihoZWFkZXJzLCBzaXplb2YoaGVhZGVycyksCisgICAgICAgICAgICAgICAgICJ4LXNlc3Npb25jb29raWU6ICVzXHJcbiIKKyAgICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1ydHNwLXR1bm5lbGxlZFxyXG4iCisgICAgICAgICAgICAgICAgICJQcmFnbWE6IG5vLWNhY2hlXHJcbiIKKyAgICAgICAgICAgICAgICAgIkNhY2hlLUNvbnRyb2w6IG5vLWNhY2hlXHJcbiIKKyAgICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAzMjc2N1xyXG4iCisgICAgICAgICAgICAgICAgICJFeHBpcmVzOiBTdW4sIDkgSmFuIDE5NzIgMDA6MDA6MDAgR01UXHJcbiIsCisgICAgICAgICAgICAgICAgIHNlc3Npb25jb29raWUpOworICAgICAgICBhdl9vcHRfc2V0KHJ0LT5ydHNwX2hkX291dC0+cHJpdl9kYXRhLCAiaGVhZGVycyIsIGhlYWRlcnMsIDApOworICAgICAgICBhdl9vcHRfc2V0KHJ0LT5ydHNwX2hkX291dC0+cHJpdl9kYXRhLCAiY2h1bmtlZF9wb3N0IiwgIjAiLCAwKTsKKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBmb3IgdGhlIFBPU1Qgc2Vzc2lvbi4gVGhlIEhUVFAKKyAgICAgICAgICogcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZG9lc24ndCBwcm9wZXJseSBoYW5kbGUgbXVsdGktcGFzcworICAgICAgICAgKiBhdXRoZW50aWNhdGlvbiBmb3IgUE9TVCByZXF1ZXN0cywgc2luY2UgaXQgd291bGQgcmVxdWlyZSBvbmUgb2YKKyAgICAgICAgICogdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICogLSBpbXBsZW1lbnRpbmcgRXhwZWN0OiAxMDAtY29udGludWUsIHdoaWNoIG1hbnkgSFRUUCBzZXJ2ZXJzCisgICAgICAgICAqICAgZG9uJ3Qgc3VwcG9ydCBhbnl3YXksIGV2ZW4gbGVzcyB0aGUgUlRTUCBzZXJ2ZXJzIHRoYXQgZG8gSFRUUAorICAgICAgICAgKiAgIHR1bm5lbGluZworICAgICAgICAgKiAtIHNlbmRpbmcgdGhlIHdob2xlIFBPU1QgZGF0YSB1bnRpbCBnZXR0aW5nIGEgNDAxIHJlcGx5IHNwZWNpZnlpbmcKKyAgICAgICAgICogICB3aGF0IGF1dGhlbnRpY2F0aW9uIG1ldGhvZCB0byB1c2UsIHRoZW4gcmVzZW5kaW5nIGFsbCB0aGF0IGRhdGEKKyAgICAgICAgICogLSB3YWl0aW5nIGZvciBwb3RlbnRpYWwgNDAxIHJlcGxpZXMgZGlyZWN0bHkgYWZ0ZXIgc2VuZGluZyB0aGUKKyAgICAgICAgICogICBQT1NUIGhlYWRlciAod2FpdGluZyBmb3Igc29tZSB1bnNwZWNpZmllZCB0aW1lKQorICAgICAgICAgKiBUaGVyZWZvcmUsIHdlIGNvcHkgdGhlIGZ1bGwgYXV0aCBzdGF0ZSwgd2hpY2ggd29ya3MgZm9yIGJvdGggYmFzaWMKKyAgICAgICAgICogYW5kIGRpZ2VzdC4gKEZvciBkaWdlc3QsIHdlIHdvdWxkIGhhdmUgdG8gc3luY2hyb25pemUgdGhlIG5vbmNlCisgICAgICAgICAqIGNvdW50IHZhcmlhYmxlIGJldHdlZW4gdGhlIHR3byBzZXNzaW9ucywgaWYgd2UnZCBkbyBtb3JlIHJlcXVlc3RzCisgICAgICAgICAqIHdpdGggdGhlIG9yaWdpbmFsIHNlc3Npb24sIHRob3VnaC4pCisgICAgICAgICAqLworICAgICAgICBmZl9odHRwX2luaXRfYXV0aF9zdGF0ZShydC0+cnRzcF9oZF9vdXQsIHJ0LT5ydHNwX2hkKTsKKworICAgICAgICAvKiBjb21wbGV0ZSB0aGUgY29ubmVjdGlvbiAqLworICAgICAgICBpZiAoZmZ1cmxfY29ubmVjdChydC0+cnRzcF9oZF9vdXQsIE5VTEwpKSB7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcmV0OworICAgICAgICAvKiBvcGVuIHRoZSB0Y3AgY29ubmVjdGlvbiAqLworICAgICAgICBmZl91cmxfam9pbih0Y3BuYW1lLCBzaXplb2YodGNwbmFtZSksIGxvd2VyX3J0c3BfcHJvdG8sIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICI/dGltZW91dD0lZCIsIHJ0LT5zdGltZW91dCk7CisgICAgICAgIGlmICgocmV0ID0gZmZ1cmxfb3BlbigmcnQtPnJ0c3BfaGQsIHRjcG5hbWUsIEFWSU9fRkxBR19SRUFEX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMKSkgPCAwKSB7CisgICAgICAgICAgICBlcnIgPSByZXQ7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgcnQtPnJ0c3BfaGRfb3V0ID0gcnQtPnJ0c3BfaGQ7CisgICAgfQorICAgIHJ0LT5zZXEgPSAwOworCisgICAgdGNwX2ZkID0gZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKHJ0LT5ydHNwX2hkKTsKKyAgICBpZiAoIWdldHBlZXJuYW1lKHRjcF9mZCwgKHN0cnVjdCBzb2NrYWRkciopICZwZWVyLCAmcGVlcl9sZW4pKSB7CisgICAgICAgIGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIqKSAmcGVlciwgcGVlcl9sZW4sIGhvc3QsIHNpemVvZihob3N0KSwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QpOworICAgIH0KKworICAgIC8qIHJlcXVlc3Qgb3B0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlcjsgdGhpcyBhbHNvIGRldGVjdHMgc2VydmVyCisgICAgICogdHlwZSAqLworICAgIGZvciAocnQtPnNlcnZlcl90eXBlID0gUlRTUF9TRVJWRVJfUlRQOzspIHsKKyAgICAgICAgY21kWzBdID0gMDsKKyAgICAgICAgaWYgKHJ0LT5zZXJ2ZXJfdHlwZSA9PSBSVFNQX1NFUlZFUl9SRUFMKQorICAgICAgICAgICAgYXZfc3RybGNhdChjbWQsCisgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgZW50cmllcyBhcmUgcmVxdWlyZWQgZm9yIHByb3BlcgorICAgICAgICAgICAgICAgICAgICAgICAgKiBzdHJlYW1pbmcgZnJvbSBhIFJlYWxtZWRpYSBzZXJ2ZXIuIFRoZXkgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAqIGludGVyZGVwZW5kZW50IGluIHNvbWUgd2F5IGFsdGhvdWdoIHdlIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICAgKiBkb24ndCBxdWl0ZSB1bmRlcnN0YW5kIGhvdy4gVmFsdWVzIHdlcmUgY29waWVkCisgICAgICAgICAgICAgICAgICAgICAgICAqIGZyb20gbXBsYXllciBTVk4gcjIzNTg5LgorICAgICAgICAgICAgICAgICAgICAgICAgKiAgIENsaWVudENoYWxsZW5nZSBpcyBhIDE2LWJ5dGUgSUQgaW4gaGV4CisgICAgICAgICAgICAgICAgICAgICAgICAqICAgQ29tcGFueUlEIGlzIGEgMTYtYnl0ZSBJRCBpbiBiYXNlNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICJDbGllbnRDaGFsbGVuZ2U6IDllMjZkMzNmMjk4NDIzNjAxMGVmNjI1M2ZiMTg4N2Y3XHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIlBsYXllclN0YXJ0dGltZTogWzI4LzAzLzIwMDM6MjI6NTA6MjMgMDA6MDBdXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhbnlJRDogS25LVjRNNEkvQjJGakoxVFRvTHljdz09XHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkdVSUQ6IDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY21kKSk7CisgICAgICAgIGZmX3J0c3Bfc2VuZF9jbWQocywgIk9QVElPTlMiLCBydC0+Y29udHJvbF91cmksIGNtZCwgcmVwbHksIE5VTEwpOworICAgICAgICBpZiAocmVwbHktPnN0YXR1c19jb2RlICE9IFJUU1BfU1RBVFVTX09LKSB7CisgICAgICAgICAgICBlcnIgPSBmZl9ydHNwX2F2ZXJyb3IocmVwbHktPnN0YXR1c19jb2RlLCBBVkVSUk9SX0lOVkFMSUREQVRBKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRldGVjdCBzZXJ2ZXIgdHlwZSBpZiBub3Qgc3RhbmRhcmQtY29tcGxpYW50IFJUUCAqLworICAgICAgICBpZiAocnQtPnNlcnZlcl90eXBlICE9IFJUU1BfU0VSVkVSX1JFQUwgJiYgcmVwbHktPnJlYWxfY2hhbGxlbmdlWzBdKSB7CisgICAgICAgICAgICBydC0+c2VydmVyX3R5cGUgPSBSVFNQX1NFUlZFUl9SRUFMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cm5jYXNlY21wKHJlcGx5LT5zZXJ2ZXIsICJXTVNlcnZlci8iLCA5KSkgeworICAgICAgICAgICAgcnQtPnNlcnZlcl90eXBlID0gUlRTUF9TRVJWRVJfV01TOworICAgICAgICB9IGVsc2UgaWYgKHJ0LT5zZXJ2ZXJfdHlwZSA9PSBSVFNQX1NFUlZFUl9SRUFMKQorICAgICAgICAgICAgc3RyY3B5KHJlYWxfY2hhbGxlbmdlLCByZXBseS0+cmVhbF9jaGFsbGVuZ2UpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoQ09ORklHX1JUU1BfREVNVVhFUiAmJiBzLT5pZm9ybWF0KQorICAgICAgICBlcnIgPSBmZl9ydHNwX3NldHVwX2lucHV0X3N0cmVhbXMocywgcmVwbHkpOworICAgIGVsc2UgaWYgKENPTkZJR19SVFNQX01VWEVSKQorICAgICAgICBlcnIgPSBmZl9ydHNwX3NldHVwX291dHB1dF9zdHJlYW1zKHMsIGhvc3QpOworICAgIGVsc2UKKyAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBkbyB7CisgICAgICAgIGludCBsb3dlcl90cmFuc3BvcnQgPSBmZl9sb2cyX3RhYltsb3dlcl90cmFuc3BvcnRfbWFzayAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfihsb3dlcl90cmFuc3BvcnRfbWFzayAtIDEpXTsKKworICAgICAgICBpZiAoKGxvd2VyX3RyYW5zcG9ydF9tYXNrICYgKDEgPDwgUlRTUF9MT1dFUl9UUkFOU1BPUlRfVENQKSkKKyAgICAgICAgICAgICAgICAmJiAocnQtPnJ0c3BfZmxhZ3MgJiBSVFNQX0ZMQUdfUFJFRkVSX1RDUCkpCisgICAgICAgICAgICBsb3dlcl90cmFuc3BvcnQgPSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9UQ1A7CisKKyAgICAgICAgZXJyID0gZmZfcnRzcF9tYWtlX3NldHVwX3JlcXVlc3QocywgaG9zdCwgcG9ydCwgbG93ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQtPnNlcnZlcl90eXBlID09IFJUU1BfU0VSVkVSX1JFQUwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxfY2hhbGxlbmdlIDogTlVMTCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBsb3dlcl90cmFuc3BvcnRfbWFzayAmPSB+KDEgPDwgbG93ZXJfdHJhbnNwb3J0KTsKKyAgICAgICAgaWYgKGxvd2VyX3RyYW5zcG9ydF9tYXNrID09IDAgJiYgZXJyID09IDEpIHsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRVBST1RPTk9TVVBQT1JUKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGVycik7CisKKyAgICBydC0+bG93ZXJfdHJhbnNwb3J0X21hc2sgPSBsb3dlcl90cmFuc3BvcnRfbWFzazsKKyAgICBhdl9zdHJsY3B5KHJ0LT5yZWFsX2NoYWxsZW5nZSwgcmVhbF9jaGFsbGVuZ2UsIHNpemVvZihydC0+cmVhbF9jaGFsbGVuZ2UpKTsKKyAgICBydC0+c3RhdGUgPSBSVFNQX1NUQVRFX0lETEU7CisgICAgcnQtPnNlZWtfdGltZXN0YW1wID0gMDsgLyogZGVmYXVsdCBpcyB0byBzdGFydCBzdHJlYW0gYXQgcG9zaXRpb24gemVybyAqLworICAgIHJldHVybiAwOworIGZhaWw6CisgICAgZmZfcnRzcF9jbG9zZV9zdHJlYW1zKHMpOworICAgIGZmX3J0c3BfY2xvc2VfY29ubmVjdGlvbnMocyk7CisgICAgaWYgKHJlcGx5LT5zdGF0dXNfY29kZSA+PTMwMCAmJiByZXBseS0+c3RhdHVzX2NvZGUgPCA0MDAgJiYgcy0+aWZvcm1hdCkgeworICAgICAgICBhdl9zdHJsY3B5KHMtPmZpbGVuYW1lLCByZXBseS0+bG9jYXRpb24sIHNpemVvZihzLT5maWxlbmFtZSkpOworICAgICAgICBydC0+c2Vzc2lvbl9pZFswXSA9ICdcMCc7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIlN0YXR1cyAlZDogUmVkaXJlY3RpbmcgdG8gJXNcbiIsCisgICAgICAgICAgICAgICByZXBseS0+c3RhdHVzX2NvZGUsCisgICAgICAgICAgICAgICBzLT5maWxlbmFtZSk7CisgICAgICAgIGdvdG8gcmVkaXJlY3Q7CisgICAgfQorICAgIGZmX25ldHdvcmtfY2xvc2UoKTsKKyAgICByZXR1cm4gZXJyOworfQorI2VuZGlmIC8qIENPTkZJR19SVFNQX0RFTVVYRVIgfHwgQ09ORklHX1JUU1BfTVVYRVIgKi8KKworI2lmIENPTkZJR19SVFBERUMKK3N0YXRpYyBpbnQgdWRwX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgUlRTUFN0cmVhbSAqKnBydHNwX3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludDY0X3Qgd2FpdF9lbmQpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBSVFNQU3RyZWFtICpydHNwX3N0OworICAgIGludCBuLCBpLCByZXQsIHRjcF9mZCwgdGltZW91dF9jbnQgPSAwOworICAgIGludCBtYXhfcCA9IDA7CisgICAgc3RydWN0IHBvbGxmZCAqcCA9IHJ0LT5wOworICAgIGludCAqZmRzID0gTlVMTCwgZmRzbnVtLCBmZHNpZHg7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChmZl9jaGVja19pbnRlcnJ1cHQoJnMtPmludGVycnVwdF9jYWxsYmFjaykpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgICAgICBpZiAod2FpdF9lbmQgJiYgd2FpdF9lbmQgLSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgbWF4X3AgPSAwOworICAgICAgICBpZiAocnQtPnJ0c3BfaGQpIHsKKyAgICAgICAgICAgIHRjcF9mZCA9IGZmdXJsX2dldF9maWxlX2hhbmRsZShydC0+cnRzcF9oZCk7CisgICAgICAgICAgICBwW21heF9wXS5mZCA9IHRjcF9mZDsKKyAgICAgICAgICAgIHBbbWF4X3ArK10uZXZlbnRzID0gUE9MTElOOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNwX2ZkID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJ0LT5uYl9ydHNwX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgcnRzcF9zdCA9IHJ0LT5ydHNwX3N0cmVhbXNbaV07CisgICAgICAgICAgICBpZiAocnRzcF9zdC0+cnRwX2hhbmRsZSkgeworICAgICAgICAgICAgICAgIGlmIChyZXQgPSBmZnVybF9nZXRfbXVsdGlfZmlsZV9oYW5kbGUocnRzcF9zdC0+cnRwX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZHMsICZmZHNudW0pKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmVjb3ZlciBydHAgcG9ydHNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmRzbnVtICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgZmRzICVkIG5vdCBzdXBwb3J0ZWRcbiIsIGZkc251bSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGZkc2lkeCA9IDA7IGZkc2lkeCA8IGZkc251bTsgZmRzaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgcFttYXhfcF0uZmQgICAgICAgPSBmZHNbZmRzaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgcFttYXhfcCsrXS5ldmVudHMgPSBQT0xMSU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF2X2ZyZWUoZmRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuID0gcG9sbChwLCBtYXhfcCwgUE9MTF9USU1FT1VUX01TKTsKKyAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICBpbnQgaiA9IDEgLSAodGNwX2ZkID09IC0xKTsKKyAgICAgICAgICAgIHRpbWVvdXRfY250ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBydC0+bmJfcnRzcF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAocnRzcF9zdC0+cnRwX2hhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocFtqXS5yZXZlbnRzICYgUE9MTElOIHx8IHBbaisxXS5yZXZlbnRzICYgUE9MTElOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBmZnVybF9yZWFkKHJ0c3Bfc3QtPnJ0cF9oYW5kbGUsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHJ0c3Bfc3QgPSBydHNwX3N0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgais9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjaWYgQ09ORklHX1JUU1BfREVNVVhFUgorICAgICAgICAgICAgaWYgKHRjcF9mZCAhPSAtMSAmJiBwWzBdLnJldmVudHMgJiBQT0xMSU4pIHsKKyAgICAgICAgICAgICAgICBpZiAocnQtPnJ0c3BfZmxhZ3MgJiBSVFNQX0ZMQUdfTElTVEVOKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChydC0+c3RhdGUgPT0gUlRTUF9TVEFURV9TVFJFQU1JTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmZfcnRzcF9wYXJzZV9zdHJlYW1pbmdfY29tbWFuZHMocykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhbnN3ZXIgdG8gVEVBUkRPV05cbiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFJUU1BNZXNzYWdlSGVhZGVyIHJlcGx5OworICAgICAgICAgICAgICAgICAgICByZXQgPSBmZl9ydHNwX3JlYWRfcmVwbHkocywgJnJlcGx5LCBOVUxMLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICAvKiBYWFg6IHBhcnNlIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ0LT5zdGF0ZSAhPSBSVFNQX1NUQVRFX1NUUkVBTUlORykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCAmJiArK3RpbWVvdXRfY250ID49IE1BWF9USU1FT1VUUykgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRVRJTUVET1VUKTsKKyAgICAgICAgfSBlbHNlIGlmIChuIDwgMCAmJiBlcnJubyAhPSBFSU5UUikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKGVycm5vKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcGlja19zdHJlYW0oQVZGb3JtYXRDb250ZXh0ICpzLCBSVFNQU3RyZWFtICoqcnRzcF9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIHJldHVybiBsZW47CisgICAgaWYgKHJ0LT5uYl9ydHNwX3N0cmVhbXMgPT0gMSkgeworICAgICAgICAqcnRzcF9zdCA9IHJ0LT5ydHNwX3N0cmVhbXNbMF07CisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorICAgIGlmIChsZW4gPj0gOCAmJiBydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCkgeworICAgICAgICBpZiAoUlRQX1BUX0lTX1JUQ1AocnQtPnJlY3ZidWZbMV0pKSB7CisgICAgICAgICAgICBpbnQgbm9fc3NyYyA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcnQtPm5iX3J0c3Bfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgUlRQRGVtdXhDb250ZXh0ICpydHBjdHggPSBydC0+cnRzcF9zdHJlYW1zW2ldLT50cmFuc3BvcnRfcHJpdjsKKyAgICAgICAgICAgICAgICBpZiAoIXJ0cGN0eCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHJ0cGN0eC0+c3NyYyA9PSBBVl9SQjMyKCZidWZbNF0pKSB7CisgICAgICAgICAgICAgICAgICAgICpydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFydHBjdHgtPnNzcmMpCisgICAgICAgICAgICAgICAgICAgIG5vX3NzcmMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vX3NzcmMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcGljayBzdHJlYW0gZm9yIHBhY2tldCAtIFNTUkMgbm90IGtub3duIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICJhbGwgc3RyZWFtc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBydC0+bmJfcnRzcF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJ1ZlsxXSAmIDB4N2YpID09IHJ0LT5ydHNwX3N0cmVhbXNbaV0tPnNkcF9wYXlsb2FkX3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnJ0c3Bfc3QgPSBydC0+cnRzcF9zdHJlYW1zW2ldOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVbmFibGUgdG8gcGljayBzdHJlYW0gZm9yIHBhY2tldFxuIik7CisgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKK30KKworaW50IGZmX3J0c3BfZmV0Y2hfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQsIGxlbjsKKyAgICBSVFNQU3RyZWFtICpydHNwX3N0LCAqZmlyc3RfcXVldWVfc3QgPSBOVUxMOworICAgIGludDY0X3Qgd2FpdF9lbmQgPSAwOworCisgICAgaWYgKHJ0LT5uYl9ieWVzID09IHJ0LT5uYl9ydHNwX3N0cmVhbXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIC8qIGdldCBuZXh0IGZyYW1lcyBmcm9tIHRoZSBzYW1lIFJUUCBwYWNrZXQgKi8KKyAgICBpZiAocnQtPmN1cl90cmFuc3BvcnRfcHJpdikgeworICAgICAgICBpZiAocnQtPnRyYW5zcG9ydCA9PSBSVFNQX1RSQU5TUE9SVF9SRFQpIHsKKyAgICAgICAgICAgIHJldCA9IGZmX3JkdF9wYXJzZV9wYWNrZXQocnQtPmN1cl90cmFuc3BvcnRfcHJpdiwgcGt0LCBOVUxMLCAwKTsKKyAgICAgICAgfSBlbHNlIGlmIChydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCkgeworICAgICAgICAgICAgcmV0ID0gZmZfcnRwX3BhcnNlX3BhY2tldChydC0+Y3VyX3RyYW5zcG9ydF9wcml2LCBwa3QsIE5VTEwsIDApOworICAgICAgICB9IGVsc2UgaWYgKENPTkZJR19SVFBERUMgJiYgcnQtPnRzKSB7CisgICAgICAgICAgICByZXQgPSBhdnByaXZfbXBlZ3RzX3BhcnNlX3BhY2tldChydC0+dHMsIHBrdCwgcnQtPnJlY3ZidWYgKyBydC0+cmVjdmJ1Zl9wb3MsIHJ0LT5yZWN2YnVmX2xlbiAtIHJ0LT5yZWN2YnVmX3Bvcyk7CisgICAgICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgICAgICBydC0+cmVjdmJ1Zl9wb3MgKz0gcmV0OworICAgICAgICAgICAgICAgIHJldCA9IHJ0LT5yZWN2YnVmX3BvcyA8IHJ0LT5yZWN2YnVmX2xlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBydC0+Y3VyX3RyYW5zcG9ydF9wcml2ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBydC0+Y3VyX3RyYW5zcG9ydF9wcml2ID0gTlVMTDsKKyAgICB9CisKK3JlZG86CisgICAgaWYgKHJ0LT50cmFuc3BvcnQgPT0gUlRTUF9UUkFOU1BPUlRfUlRQKSB7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQ2NF90IGZpcnN0X3F1ZXVlX3RpbWUgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcnQtPm5iX3J0c3Bfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBSVFBEZW11eENvbnRleHQgKnJ0cGN0eCA9IHJ0LT5ydHNwX3N0cmVhbXNbaV0tPnRyYW5zcG9ydF9wcml2OworICAgICAgICAgICAgaW50NjRfdCBxdWV1ZV90aW1lOworICAgICAgICAgICAgaWYgKCFydHBjdHgpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBxdWV1ZV90aW1lID0gZmZfcnRwX3F1ZXVlZF9wYWNrZXRfdGltZShydHBjdHgpOworICAgICAgICAgICAgaWYgKHF1ZXVlX3RpbWUgJiYgKHF1ZXVlX3RpbWUgLSBmaXJzdF9xdWV1ZV90aW1lIDwgMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmaXJzdF9xdWV1ZV90aW1lKSkgeworICAgICAgICAgICAgICAgIGZpcnN0X3F1ZXVlX3RpbWUgPSBxdWV1ZV90aW1lOworICAgICAgICAgICAgICAgIGZpcnN0X3F1ZXVlX3N0ICAgPSBydC0+cnRzcF9zdHJlYW1zW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmaXJzdF9xdWV1ZV90aW1lKSB7CisgICAgICAgICAgICB3YWl0X2VuZCA9IGZpcnN0X3F1ZXVlX3RpbWUgKyBzLT5tYXhfZGVsYXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3YWl0X2VuZCA9IDA7CisgICAgICAgICAgICBmaXJzdF9xdWV1ZV9zdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZWFkIG5leHQgUlRQIHBhY2tldCAqLworICAgIGlmICghcnQtPnJlY3ZidWYpIHsKKyAgICAgICAgcnQtPnJlY3ZidWYgPSBhdl9tYWxsb2MoUkVDVkJVRl9TSVpFKTsKKyAgICAgICAgaWYgKCFydC0+cmVjdmJ1ZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgc3dpdGNoKHJ0LT5sb3dlcl90cmFuc3BvcnQpIHsKKyAgICBkZWZhdWx0OgorI2lmIENPTkZJR19SVFNQX0RFTVVYRVIKKyAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1RDUDoKKyAgICAgICAgbGVuID0gZmZfcnRzcF90Y3BfcmVhZF9wYWNrZXQocywgJnJ0c3Bfc3QsIHJ0LT5yZWN2YnVmLCBSRUNWQlVGX1NJWkUpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgUlRTUF9MT1dFUl9UUkFOU1BPUlRfVURQOgorICAgIGNhc2UgUlRTUF9MT1dFUl9UUkFOU1BPUlRfVURQX01VTFRJQ0FTVDoKKyAgICAgICAgbGVuID0gdWRwX3JlYWRfcGFja2V0KHMsICZydHNwX3N0LCBydC0+cmVjdmJ1ZiwgUkVDVkJVRl9TSVpFLCB3YWl0X2VuZCk7CisgICAgICAgIGlmIChsZW4gPiAwICYmIHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2ICYmIHJ0LT50cmFuc3BvcnQgPT0gUlRTUF9UUkFOU1BPUlRfUlRQKQorICAgICAgICAgICAgZmZfcnRwX2NoZWNrX2FuZF9zZW5kX2JhY2tfcnIocnRzcF9zdC0+dHJhbnNwb3J0X3ByaXYsIHJ0c3Bfc3QtPnJ0cF9oYW5kbGUsIE5VTEwsIGxlbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlRTUF9MT1dFUl9UUkFOU1BPUlRfQ1VTVE9NOgorICAgICAgICBpZiAoZmlyc3RfcXVldWVfc3QgJiYgcnQtPnRyYW5zcG9ydCA9PSBSVFNQX1RSQU5TUE9SVF9SVFAgJiYKKyAgICAgICAgICAgIHdhaXRfZW5kICYmIHdhaXRfZW5kIDwgYXZfZ2V0dGltZV9yZWxhdGl2ZSgpKQorICAgICAgICAgICAgbGVuID0gQVZFUlJPUihFQUdBSU4pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsZW4gPSBmZmlvX3JlYWRfcGFydGlhbChzLT5wYiwgcnQtPnJlY3ZidWYsIFJFQ1ZCVUZfU0laRSk7CisgICAgICAgIGxlbiA9IHBpY2tfc3RyZWFtKHMsICZydHNwX3N0LCBydC0+cmVjdmJ1ZiwgbGVuKTsKKyAgICAgICAgaWYgKGxlbiA+IDAgJiYgcnRzcF9zdC0+dHJhbnNwb3J0X3ByaXYgJiYgcnQtPnRyYW5zcG9ydCA9PSBSVFNQX1RSQU5TUE9SVF9SVFApCisgICAgICAgICAgICBmZl9ydHBfY2hlY2tfYW5kX3NlbmRfYmFja19ycihydHNwX3N0LT50cmFuc3BvcnRfcHJpdiwgTlVMTCwgcy0+cGIsIGxlbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAobGVuID09IEFWRVJST1IoRUFHQUlOKSAmJiBmaXJzdF9xdWV1ZV9zdCAmJgorICAgICAgICBydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCkgeworICAgICAgICBydHNwX3N0ID0gZmlyc3RfcXVldWVfc3Q7CisgICAgICAgIHJldCA9IGZmX3J0cF9wYXJzZV9wYWNrZXQocnRzcF9zdC0+dHJhbnNwb3J0X3ByaXYsIHBrdCwgTlVMTCwgMCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICBpZiAobGVuID09IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICBpZiAocnQtPnRyYW5zcG9ydCA9PSBSVFNQX1RSQU5TUE9SVF9SRFQpIHsKKyAgICAgICAgcmV0ID0gZmZfcmR0X3BhcnNlX3BhY2tldChydHNwX3N0LT50cmFuc3BvcnRfcHJpdiwgcGt0LCAmcnQtPnJlY3ZidWYsIGxlbik7CisgICAgfSBlbHNlIGlmIChydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCkgeworICAgICAgICByZXQgPSBmZl9ydHBfcGFyc2VfcGFja2V0KHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2LCBwa3QsICZydC0+cmVjdmJ1ZiwgbGVuKTsKKyAgICAgICAgaWYgKHJ0c3Bfc3QtPmZlZWRiYWNrKSB7CisgICAgICAgICAgICBBVklPQ29udGV4dCAqcGIgPSBOVUxMOworICAgICAgICAgICAgaWYgKHJ0LT5sb3dlcl90cmFuc3BvcnQgPT0gUlRTUF9MT1dFUl9UUkFOU1BPUlRfQ1VTVE9NKQorICAgICAgICAgICAgICAgIHBiID0gcy0+cGI7CisgICAgICAgICAgICBmZl9ydHBfc2VuZF9ydGNwX2ZlZWRiYWNrKHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2LCBydHNwX3N0LT5ydHBfaGFuZGxlLCBwYik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIC8qIEVpdGhlciBiYWQgcGFja2V0LCBvciBhIFJUQ1AgcGFja2V0LiBDaGVjayBpZiB0aGUKKyAgICAgICAgICAgICAqIGZpcnN0X3J0Y3BfbnRwX3RpbWUgZmllbGQgd2FzIGluaXRpYWxpemVkLiAqLworICAgICAgICAgICAgUlRQRGVtdXhDb250ZXh0ICpydHBjdHggPSBydHNwX3N0LT50cmFuc3BvcnRfcHJpdjsKKyAgICAgICAgICAgIGlmIChydHBjdHgtPmZpcnN0X3J0Y3BfbnRwX3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdF9ydGNwX250cF90aW1lIGhhcyBiZWVuIGluaXRpYWxpemVkIGZvciB0aGlzIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgKiBjb3B5IHRoZSBzYW1lIHZhbHVlIHRvIGFsbCBvdGhlciB1bmluaXRpYWxpemVkIHN0cmVhbXMsCisgICAgICAgICAgICAgICAgICogaW4gb3JkZXIgdG8gbWFwIHRoZWlyIHRpbWVzdGFtcCBvcmlnaW4gdG8gdGhlIHNhbWUgbnRwIHRpbWUKKyAgICAgICAgICAgICAgICAgKiBhcyB0aGlzIG9uZS4gKi8KKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBOVUxMOworICAgICAgICAgICAgICAgIGlmIChydHNwX3N0LT5zdHJlYW1faW5kZXggPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW3J0c3Bfc3QtPnN0cmVhbV9pbmRleF07CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJ0LT5uYl9ydHNwX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBSVFBEZW11eENvbnRleHQgKnJ0cGN0eDIgPSBydC0+cnRzcF9zdHJlYW1zW2ldLT50cmFuc3BvcnRfcHJpdjsKKyAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0MiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGlmIChydC0+cnRzcF9zdHJlYW1zW2ldLT5zdHJlYW1faW5kZXggPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0MiA9IHMtPnN0cmVhbXNbcnQtPnJ0c3Bfc3RyZWFtc1tpXS0+c3RyZWFtX2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ0cGN0eDIgJiYgc3QgJiYgc3QyICYmCisgICAgICAgICAgICAgICAgICAgICAgICBydHBjdHgyLT5maXJzdF9ydGNwX250cF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBydHBjdHgyLT5maXJzdF9ydGNwX250cF90aW1lID0gcnRwY3R4LT5maXJzdF9ydGNwX250cF90aW1lOworICAgICAgICAgICAgICAgICAgICAgICAgcnRwY3R4Mi0+cnRjcF90c19vZmZzZXQgPSBhdl9yZXNjYWxlX3EoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwY3R4LT5ydGNwX3RzX29mZnNldCwgc3QtPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdDItPnRpbWVfYmFzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gTWFrZSByZWFsIE5UUCBzdGFydCB0aW1lIGF2YWlsYWJsZSBpbiBBVkZvcm1hdENvbnRleHQKKyAgICAgICAgICAgICAgICBpZiAocy0+c3RhcnRfdGltZV9yZWFsdGltZSA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICBzLT5zdGFydF90aW1lX3JlYWx0aW1lID0gYXZfcmVzY2FsZSAocnRwY3R4LT5maXJzdF9ydGNwX250cF90aW1lIC0gKE5UUF9PRkZTRVQgPDwgMzIpLCAxMDAwMDAwLCAxTEwgPDwgMzIpOworICAgICAgICAgICAgICAgICAgICBpZiAocnRwY3R4LT5zdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhcnRfdGltZV9yZWFsdGltZSAtPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGUgKHJ0cGN0eC0+cnRjcF90c19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSBydHBjdHgtPnN0LT50aW1lX2Jhc2UubnVtICogMTAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGN0eC0+c3QtPnRpbWVfYmFzZS5kZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCA9PSAtUlRDUF9CWUUpIHsKKyAgICAgICAgICAgICAgICBydC0+bmJfYnllcysrOworCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIlJlY2VpdmVkIEJZRSBmb3Igc3RyZWFtICVkICglZC8lZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHJ0c3Bfc3QtPnN0cmVhbV9pbmRleCwgcnQtPm5iX2J5ZXMsIHJ0LT5uYl9ydHNwX3N0cmVhbXMpOworCisgICAgICAgICAgICAgICAgaWYgKHJ0LT5uYl9ieWVzID09IHJ0LT5uYl9ydHNwX3N0cmVhbXMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoQ09ORklHX1JUUERFQyAmJiBydC0+dHMpIHsKKyAgICAgICAgcmV0ID0gYXZwcml2X21wZWd0c19wYXJzZV9wYWNrZXQocnQtPnRzLCBwa3QsIHJ0LT5yZWN2YnVmLCBsZW4pOworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIGlmIChyZXQgPCBsZW4pIHsKKyAgICAgICAgICAgICAgICBydC0+cmVjdmJ1Zl9sZW4gPSBsZW47CisgICAgICAgICAgICAgICAgcnQtPnJlY3ZidWZfcG9zID0gcmV0OworICAgICAgICAgICAgICAgIHJ0LT5jdXJfdHJhbnNwb3J0X3ByaXYgPSBydC0+dHM7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CitlbmQ6CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gcmVkbzsKKyAgICBpZiAocmV0ID09IDEpCisgICAgICAgIC8qIG1vcmUgcGFja2V0cyBtYXkgZm9sbG93LCBzbyB3ZSBzYXZlIHRoZSBSVFAgY29udGV4dCAqLworICAgICAgICBydC0+Y3VyX3RyYW5zcG9ydF9wcml2ID0gcnRzcF9zdC0+dHJhbnNwb3J0X3ByaXY7CisKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIENPTkZJR19SVFBERUMgKi8KKworI2lmIENPTkZJR19TRFBfREVNVVhFUgorc3RhdGljIGludCBzZHBfcHJvYmUoQVZQcm9iZURhdGEgKnAxKQoreworICAgIGNvbnN0IGNoYXIgKnAgPSBwMS0+YnVmLCAqcF9lbmQgPSBwMS0+YnVmICsgcDEtPmJ1Zl9zaXplOworCisgICAgLyogd2UgbG9vayBmb3IgYSBsaW5lIGJlZ2lubmluZyAiYz1JTiBJUCIgKi8KKyAgICB3aGlsZSAocCA8IHBfZW5kICYmICpwICE9ICdcMCcpIHsKKyAgICAgICAgaWYgKHAgKyBzaXplb2YoImM9SU4gSVAiKSAtIDEgPCBwX2VuZCAmJgorICAgICAgICAgICAgYXZfc3Ryc3RhcnQocCwgImM9SU4gSVAiLCBOVUxMKSkKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKKworICAgICAgICB3aGlsZSAocCA8IHBfZW5kIC0gMSAmJiAqcCAhPSAnXG4nKSBwKys7CisgICAgICAgIGlmICgrK3AgPj0gcF9lbmQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKCpwID09ICdccicpCisgICAgICAgICAgICBwKys7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRfc291cmNlX2FkZHJzKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgc3RydWN0IFJUU1BTb3VyY2UgKiphZGRycykKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAoIWNvdW50KQorICAgICAgICByZXR1cm47CisgICAgYXZfc3RybGNhdGYoYnVmLCBzaXplLCAiJiVzPSVzIiwgbmFtZSwgYWRkcnNbMF0tPmFkZHIpOworICAgIGZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBhdl9zdHJsY2F0ZihidWYsIHNpemUsICIsJXMiLCBhZGRyc1tpXS0+YWRkcik7Cit9CisKK3N0YXRpYyBpbnQgc2RwX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIFJUU1BTdHJlYW0gKnJ0c3Bfc3Q7CisgICAgaW50IHNpemUsIGksIGVycjsKKyAgICBjaGFyICpjb250ZW50OworICAgIGNoYXIgdXJsWzEwMjRdOworCisgICAgaWYgKCFmZl9uZXR3b3JrX2luaXQoKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIGlmIChzLT5tYXhfZGVsYXkgPCAwKSAvKiBOb3Qgc2V0IGJ5IHRoZSBjYWxsZXIgKi8KKyAgICAgICAgcy0+bWF4X2RlbGF5ID0gREVGQVVMVF9SRU9SREVSSU5HX0RFTEFZOworICAgIGlmIChydC0+cnRzcF9mbGFncyAmIFJUU1BfRkxBR19DVVNUT01fSU8pCisgICAgICAgIHJ0LT5sb3dlcl90cmFuc3BvcnQgPSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9DVVNUT007CisKKyAgICAvKiByZWFkIHRoZSB3aG9sZSBzZHAgZmlsZSAqLworICAgIC8qIFhYWDogYmV0dGVyIGxvYWRpbmcgKi8KKyAgICBjb250ZW50ID0gYXZfbWFsbG9jKFNEUF9NQVhfU0laRSk7CisgICAgc2l6ZSA9IGF2aW9fcmVhZChzLT5wYiwgY29udGVudCwgU0RQX01BWF9TSVpFIC0gMSk7CisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBhdl9mcmVlKGNvbnRlbnQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgY29udGVudFtzaXplXSA9J1wwJzsKKworICAgIGVyciA9IGZmX3NkcF9wYXJzZShzLCBjb250ZW50KTsKKyAgICBhdl9mcmVlKGNvbnRlbnQpOworICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKKworICAgIC8qIG9wZW4gZWFjaCBSVFAgc3RyZWFtICovCisgICAgZm9yIChpID0gMDsgaSA8IHJ0LT5uYl9ydHNwX3N0cmVhbXM7IGkrKykgeworICAgICAgICBjaGFyIG5hbWVidWZbNTBdOworICAgICAgICBydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1tpXTsKKworICAgICAgICBpZiAoIShydC0+cnRzcF9mbGFncyAmIFJUU1BfRkxBR19DVVNUT01fSU8pKSB7CisgICAgICAgICAgICBnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyKikgJnJ0c3Bfc3QtPnNkcF9pcCwgc2l6ZW9mKHJ0c3Bfc3QtPnNkcF9pcCksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lYnVmLCBzaXplb2YobmFtZWJ1ZiksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKTsKKyAgICAgICAgICAgIGZmX3VybF9qb2luKHVybCwgc2l6ZW9mKHVybCksICJydHAiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWJ1ZiwgcnRzcF9zdC0+c2RwX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAiP2xvY2FscG9ydD0lZCZ0dGw9JWQmY29ubmVjdD0lZCZ3cml0ZV90b19zb3VyY2U9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgcnRzcF9zdC0+c2RwX3BvcnQsIHJ0c3Bfc3QtPnNkcF90dGwsCisgICAgICAgICAgICAgICAgICAgICAgICBydC0+cnRzcF9mbGFncyAmIFJUU1BfRkxBR19GSUxURVJfU1JDID8gMSA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBydC0+cnRzcF9mbGFncyAmIFJUU1BfRkxBR19SVENQX1RPX1NPVVJDRSA/IDEgOiAwKTsKKworICAgICAgICAgICAgYXBwZW5kX3NvdXJjZV9hZGRycyh1cmwsIHNpemVvZih1cmwpLCAic291cmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0c3Bfc3QtPm5iX2luY2x1ZGVfc291cmNlX2FkZHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHNwX3N0LT5pbmNsdWRlX3NvdXJjZV9hZGRycyk7CisgICAgICAgICAgICBhcHBlbmRfc291cmNlX2FkZHJzKHVybCwgc2l6ZW9mKHVybCksICJibG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0c3Bfc3QtPm5iX2V4Y2x1ZGVfc291cmNlX2FkZHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHNwX3N0LT5leGNsdWRlX3NvdXJjZV9hZGRycyk7CisgICAgICAgICAgICBpZiAoZmZ1cmxfb3BlbigmcnRzcF9zdC0+cnRwX2hhbmRsZSwgdXJsLCBBVklPX0ZMQUdfUkVBRF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpIDwgMCkgeworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZXJyID0gZmZfcnRzcF9vcGVuX3RyYW5zcG9ydF9jdHgocywgcnRzcF9zdCkpKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgZmZfcnRzcF9jbG9zZV9zdHJlYW1zKHMpOworICAgIGZmX25ldHdvcmtfY2xvc2UoKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNkcF9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBmZl9ydHNwX2Nsb3NlX3N0cmVhbXMocyk7CisgICAgZmZfbmV0d29ya19jbG9zZSgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBzZHBfZGVtdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAiU0RQIGRlbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgICAgICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgICAgICA9IHNkcF9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfc2RwX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInNkcCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNEUCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihSVFNQU3RhdGUpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHNkcF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBzZHBfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmZfcnRzcF9mZXRjaF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gc2RwX3JlYWRfY2xvc2UsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnNkcF9kZW11eGVyX2NsYXNzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfU0RQX0RFTVVYRVIgKi8KKworI2lmIENPTkZJR19SVFBfREVNVVhFUgorc3RhdGljIGludCBydHBfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKGF2X3N0cnN0YXJ0KHAtPmZpbGVuYW1lLCAicnRwOiIsIE5VTEwpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRwX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICB1aW50OF90IHJlY3ZidWZbUlRQX01BWF9QQUNLRVRfTEVOR1RIXTsKKyAgICBjaGFyIGhvc3RbNTAwXSwgc2RwWzUwMF07CisgICAgaW50IHJldCwgcG9ydDsKKyAgICBVUkxDb250ZXh0KiBpbiA9IE5VTEw7CisgICAgaW50IHBheWxvYWRfdHlwZTsKKyAgICBBVkNvZGVjQ29udGV4dCBjb2RlYyA9IHsgMCB9OworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisgICAgQVZJT0NvbnRleHQgcGI7CisgICAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmICghZmZfbmV0d29ya19pbml0KCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICByZXQgPSBmZnVybF9vcGVuKCZpbiwgcy0+ZmlsZW5hbWUsIEFWSU9fRkxBR19SRUFELAorICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcmV0ID0gZmZ1cmxfcmVhZChpbiwgcmVjdmJ1Ziwgc2l6ZW9mKHJlY3ZidWYpKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGlmIChyZXQgPCAxMikgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiUmVjZWl2ZWQgdG9vIHNob3J0IHBhY2tldFxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmVjdmJ1ZlswXSAmIDB4YzApICE9IDB4ODApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVuc3VwcG9ydGVkIFJUUCB2ZXJzaW9uIHBhY2tldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlZFxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChSVFBfUFRfSVNfUlRDUChyZWN2YnVmWzFdKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHBheWxvYWRfdHlwZSA9IHJlY3ZidWZbMV0gJiAweDdmOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZ2V0c29ja25hbWUoZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKGluKSwgKHN0cnVjdCBzb2NrYWRkciopICZhZGRyLCAmYWRkcmxlbik7CisgICAgZmZ1cmxfY2xvc2UoaW4pOworICAgIGluID0gTlVMTDsKKworICAgIGlmIChmZl9ydHBfZ2V0X2NvZGVjX2luZm8oJmNvZGVjLCBwYXlsb2FkX3R5cGUpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmVjZWl2ZSBSVFAgcGF5bG9hZCB0eXBlICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgYW4gU0RQIGZpbGUgZGVzY3JpYmluZyBpdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGNvZGVjLmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0RBVEEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiR3Vlc3Npbmcgb24gUlRQIGNvbnRlbnQgLSBpZiBub3QgcmVjZWl2ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJseSB5b3UgbmVlZCBhbiBTRFAgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaWJpbmcgaXRcbiIpOworICAgIH0KKworICAgIGF2X3VybF9zcGxpdChOVUxMLCAwLCBOVUxMLCAwLCBob3N0LCBzaXplb2YoaG9zdCksICZwb3J0LAorICAgICAgICAgICAgICAgICBOVUxMLCAwLCBzLT5maWxlbmFtZSk7CisKKyAgICBzbnByaW50ZihzZHAsIHNpemVvZihzZHApLAorICAgICAgICAgICAgICJ2PTBcclxuYz1JTiBJUCVkICVzXHJcbm09JXMgJWQgUlRQL0FWUCAlZFxyXG4iLAorICAgICAgICAgICAgIGFkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQgPyA0IDogNiwgaG9zdCwKKyAgICAgICAgICAgICBjb2RlYy5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9EQVRBICA/ICJhcHBsaWNhdGlvbiIgOgorICAgICAgICAgICAgIGNvZGVjLmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPID8gInZpZGVvIiA6ICJhdWRpbyIsCisgICAgICAgICAgICAgcG9ydCwgcGF5bG9hZF90eXBlKTsKKyAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJTRFA6XG4lc1xuIiwgc2RwKTsKKworICAgIGZmaW9faW5pdF9jb250ZXh0KCZwYiwgc2RwLCBzdHJsZW4oc2RwKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcy0+cGIgPSAmcGI7CisKKyAgICAvKiBzZHBfcmVhZF9oZWFkZXIgaW5pdGlhbGl6ZXMgdGhpcyBhZ2FpbiAqLworICAgIGZmX25ldHdvcmtfY2xvc2UoKTsKKworICAgIHJ0LT5tZWRpYV90eXBlX21hc2sgPSAoMSA8PCAoQVZNRURJQV9UWVBFX0RBVEErMSkpIC0gMTsKKworICAgIHJldCA9IHNkcF9yZWFkX2hlYWRlcihzKTsKKyAgICBzLT5wYiA9IE5VTEw7CisgICAgcmV0dXJuIHJldDsKKworZmFpbDoKKyAgICBpZiAoaW4pCisgICAgICAgIGZmdXJsX2Nsb3NlKGluKTsKKyAgICBmZl9uZXR3b3JrX2Nsb3NlKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgcnRwX2RlbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgICAgID0gIlJUUCBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgPSBydHBfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX3J0cF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJydHAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSVFAgaW5wdXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUlRTUFN0YXRlKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBydHBfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gcnRwX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZmX3J0c3BfZmV0Y2hfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHNkcF9yZWFkX2Nsb3NlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmcnRwX2RlbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmIC8qIENPTkZJR19SVFBfREVNVVhFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0c3AuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmMmYxZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHNwLmgKQEAgLTAsMCArMSw2MzQgQEAKKy8qCisgKiBSVFNQIGRlZmluaXRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaWZuZGVmIEFWRk9STUFUX1JUU1BfSAorI2RlZmluZSBBVkZPUk1BVF9SVFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicnRzcGNvZGVzLmgiCisjaW5jbHVkZSAicnRwZGVjLmgiCisjaW5jbHVkZSAibmV0d29yay5oIgorI2luY2x1ZGUgImh0dHBhdXRoLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisvKioKKyAqIE5ldHdvcmsgbGF5ZXIgb3ZlciB3aGljaCBSVFAvZXRjIHBhY2tldCBkYXRhIHdpbGwgYmUgdHJhbnNwb3J0ZWQuCisgKi8KK2VudW0gUlRTUExvd2VyVHJhbnNwb3J0IHsKKyAgICBSVFNQX0xPV0VSX1RSQU5TUE9SVF9VRFAgPSAwLCAgICAgICAgICAgLyoqPCBVRFAvdW5pY2FzdCAqLworICAgIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1RDUCA9IDEsICAgICAgICAgICAvKio8IFRDUDsgaW50ZXJsZWF2ZWQgaW4gUlRTUCAqLworICAgIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUF9NVUxUSUNBU1QgPSAyLCAvKio8IFVEUC9tdWx0aWNhc3QgKi8KKyAgICBSVFNQX0xPV0VSX1RSQU5TUE9SVF9OQiwKKyAgICBSVFNQX0xPV0VSX1RSQU5TUE9SVF9IVFRQID0gOCwgICAgICAgICAgLyoqPCBIVFRQIHR1bm5lbGVkIC0gbm90IGEgcHJvcGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1vZGUgYXMgc3VjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGZvciB1c2UgdmlhIEFWT3B0aW9ucyAqLworICAgIFJUU1BfTE9XRVJfVFJBTlNQT1JUX0NVU1RPTSA9IDE2LCAgICAgICAvKio8IEN1c3RvbSBJTyAtIG5vdCBhIHB1YmxpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBmb3IgbG93ZXJfdHJhbnNwb3J0X21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHNldCBpbiB0aGUgU0RQIGRlbXV4ZXIgYmFzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBhIGZsYWcuICovCit9OworCisvKioKKyAqIFBhY2tldCBwcm9maWxlIG9mIHRoZSBkYXRhIHRoYXQgd2Ugd2lsbCBiZSByZWNlaXZpbmcuIFJlYWwgc2VydmVycworICogY29tbW9ubHkgc2VuZCBSRFQgKGFsdGhvdWdoIHRoZXkgY2FuIHNvbWV0aW1lcyBzZW5kIFJUUCBhcyB3ZWxsKSwKKyAqIHdoZXJlYXMgbW9zdCBvdGhlcnMgd2lsbCBzZW5kIFJUUC4KKyAqLworZW51bSBSVFNQVHJhbnNwb3J0IHsKKyAgICBSVFNQX1RSQU5TUE9SVF9SVFAsIC8qKjwgU3RhbmRhcmRzLWNvbXBsaWFudCBSVFAgKi8KKyAgICBSVFNQX1RSQU5TUE9SVF9SRFQsIC8qKjwgUmVhbG1lZGlhIERhdGEgVHJhbnNwb3J0ICovCisgICAgUlRTUF9UUkFOU1BPUlRfUkFXLCAvKio8IFJhdyBkYXRhIChvdmVyIFVEUCkgKi8KKyAgICBSVFNQX1RSQU5TUE9SVF9OQgorfTsKKworLyoqCisgKiBUcmFuc3BvcnQgbW9kZSBmb3IgdGhlIFJUU1AgZGF0YS4gVGhpcyBtYXkgYmUgcGxhaW4sIG9yCisgKiB0dW5uZWxlZCwgd2hpY2ggaXMgZG9uZSBvdmVyIEhUVFAuCisgKi8KK2VudW0gUlRTUENvbnRyb2xUcmFuc3BvcnQgeworICAgIFJUU1BfTU9ERV9QTEFJTiwgICAvKio8IE5vcm1hbCBSVFNQICovCisgICAgUlRTUF9NT0RFX1RVTk5FTCAgIC8qKjwgUlRTUCBvdmVyIEhUVFAgKHR1bm5lbGluZykgKi8KK307CisKKyNkZWZpbmUgUlRTUF9ERUZBVUxUX1BPUlQgICA1NTQKKyNkZWZpbmUgUlRTUFNfREVGQVVMVF9QT1JUICAzMjIKKyNkZWZpbmUgUlRTUF9NQVhfVFJBTlNQT1JUUyA4CisjZGVmaW5lIFJUU1BfVENQX01BWF9QQUNLRVRfU0laRSAxNDcyCisjZGVmaW5lIFJUU1BfREVGQVVMVF9OQl9BVURJT19DSEFOTkVMUyAxCisjZGVmaW5lIFJUU1BfREVGQVVMVF9BVURJT19TQU1QTEVSQVRFIDQ0MTAwCisjZGVmaW5lIFJUU1BfUlRQX1BPUlRfTUlOIDUwMDAKKyNkZWZpbmUgUlRTUF9SVFBfUE9SVF9NQVggNjUwMDAKKworLyoqCisgKiBUaGlzIGRlc2NyaWJlcyBhIHNpbmdsZSBpdGVtIGluIHRoZSAiVHJhbnNwb3J0OiIgbGluZSBvZiBvbmUgc3RyZWFtIGFzCisgKiBuZWdvdGlhdGVkIGJ5IHRoZSBTRVRVUCBSVFNQIGNvbW1hbmQuIE11bHRpcGxlIHRyYW5zcG9ydHMgYXJlIGNvbW1hLQorICogc2VwYXJhdGVkICgiVHJhbnNwb3J0OiB4LXJlYWQtcmR0L3RjcDtpbnRlcmxlYXZlZD0wLTEscnRwL2F2cC91ZHA7CisgKiBjbGllbnRfcG9ydD0xMDAwLTEwMDE7c2VydmVyX3BvcnQ9MTgwMC0xODAxIikgYW5kIGRlc2NyaWJlZCBpbiBzZXBhcmF0ZQorICogUlRTUFRyYW5zcG9ydEZpZWxkcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgUlRTUFRyYW5zcG9ydEZpZWxkIHsKKyAgICAvKiogaW50ZXJsZWF2ZSBpZHMsIGlmIFRDUCB0cmFuc3BvcnQ7IGVhY2ggVENQL1JUU1AgZGF0YSBwYWNrZXQgc3RhcnRzCisgICAgICogd2l0aCBhICckJywgc3RyZWFtIGxlbmd0aCBhbmQgc3RyZWFtIElELiBJZiB0aGUgc3RyZWFtIElEIGlzIHdpdGhpbgorICAgICAqIHRoZSByYW5nZSBvZiB0aGlzIGludGVybGVhdmVkX21pbi1tYXgsIHRoZW4gdGhlIHBhY2tldCBiZWxvbmdzIHRvCisgICAgICogdGhpcyBzdHJlYW0uICovCisgICAgaW50IGludGVybGVhdmVkX21pbiwgaW50ZXJsZWF2ZWRfbWF4OworCisgICAgLyoqIFVEUCBtdWx0aWNhc3QgcG9ydCByYW5nZTsgdGhlIHBvcnRzIHRvIHdoaWNoIHdlIHNob3VsZCBjb25uZWN0IHRvCisgICAgICogcmVjZWl2ZSBtdWx0aWNhc3QgVURQIGRhdGEuICovCisgICAgaW50IHBvcnRfbWluLCBwb3J0X21heDsKKworICAgIC8qKiBVRFAgY2xpZW50IHBvcnRzOyB0aGVzZSBzaG91bGQgYmUgdGhlIGxvY2FsIHBvcnRzIG9mIHRoZSBVRFAgUlRQCisgICAgICogKGFuZCBSVENQKSBzb2NrZXRzIG92ZXIgd2hpY2ggd2UgcmVjZWl2ZSBSVFAvUlRDUCBkYXRhLiAqLworICAgIGludCBjbGllbnRfcG9ydF9taW4sIGNsaWVudF9wb3J0X21heDsKKworICAgIC8qKiBVRFAgdW5pY2FzdCBzZXJ2ZXIgcG9ydCByYW5nZTsgdGhlIHBvcnRzIHRvIHdoaWNoIHdlIHNob3VsZCBjb25uZWN0CisgICAgICogdG8gcmVjZWl2ZSB1bmljYXN0IFVEUCBSVFAvUlRDUCBkYXRhLiAqLworICAgIGludCBzZXJ2ZXJfcG9ydF9taW4sIHNlcnZlcl9wb3J0X21heDsKKworICAgIC8qKiB0aW1lLXRvLWxpdmUgdmFsdWUgKHJlcXVpcmVkIGZvciBtdWx0aWNhc3QpOyB0aGUgYW1vdW50IG9mIEhPUHMgdGhhdAorICAgICAqIHBhY2tldHMgd2lsbCBiZSBhbGxvd2VkIHRvIG1ha2UgYmVmb3JlIGJlaW5nIGRpc2NhcmRlZC4gKi8KKyAgICBpbnQgdHRsOworCisgICAgLyoqIHRyYW5zcG9ydCBzZXQgdG8gcmVjb3JkIGRhdGEgKi8KKyAgICBpbnQgbW9kZV9yZWNvcmQ7CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBkZXN0aW5hdGlvbjsgLyoqPCBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzICovCisgICAgY2hhciBzb3VyY2VbSU5FVDZfQUREUlNUUkxFTiArIDFdOyAvKio8IHNvdXJjZSBJUCBhZGRyZXNzICovCisKKyAgICAvKiogZGF0YS9wYWNrZXQgdHJhbnNwb3J0IHByb3RvY29sOyBlLmcuIFJUUCBvciBSRFQgKi8KKyAgICBlbnVtIFJUU1BUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgLyoqIG5ldHdvcmsgbGF5ZXIgdHJhbnNwb3J0IHByb3RvY29sOyBlLmcuIFRDUCBvciBVRFAgdW5pLS9tdWx0aWNhc3QgKi8KKyAgICBlbnVtIFJUU1BMb3dlclRyYW5zcG9ydCBsb3dlcl90cmFuc3BvcnQ7Cit9IFJUU1BUcmFuc3BvcnRGaWVsZDsKKworLyoqCisgKiBUaGlzIGRlc2NyaWJlcyB0aGUgc2VydmVyIHJlc3BvbnNlIHRvIGVhY2ggUlRTUCBjb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBSVFNQTWVzc2FnZUhlYWRlciB7CisgICAgLyoqIGxlbmd0aCBvZiB0aGUgZGF0YSBmb2xsb3dpbmcgdGhpcyBoZWFkZXIgKi8KKyAgICBpbnQgY29udGVudF9sZW5ndGg7CisKKyAgICBlbnVtIFJUU1BTdGF0dXNDb2RlIHN0YXR1c19jb2RlOyAvKio8IHJlc3BvbnNlIGNvZGUgZnJvbSBzZXJ2ZXIgKi8KKworICAgIC8qKiBudW1iZXIgb2YgaXRlbXMgaW4gdGhlICd0cmFuc3BvcnRzJyB2YXJpYWJsZSBiZWxvdyAqLworICAgIGludCBuYl90cmFuc3BvcnRzOworCisgICAgLyoqIFRpbWUgcmFuZ2Ugb2YgdGhlIHN0cmVhbXMgdGhhdCB0aGUgc2VydmVyIHdpbGwgc3RyZWFtLiBJbgorICAgICAqIEFWX1RJTUVfQkFTRSB1bml0LCBBVl9OT1BUU19WQUxVRSBpZiBub3QgdXNlZCAqLworICAgIGludDY0X3QgcmFuZ2Vfc3RhcnQsIHJhbmdlX2VuZDsKKworICAgIC8qKiBkZXNjcmliZXMgdGhlIGNvbXBsZXRlICJUcmFuc3BvcnQ6IiBsaW5lIG9mIHRoZSBzZXJ2ZXIgaW4gcmVzcG9uc2UKKyAgICAgKiB0byBhIFNFVFVQIFJUU1AgY29tbWFuZCBieSB0aGUgY2xpZW50ICovCisgICAgUlRTUFRyYW5zcG9ydEZpZWxkIHRyYW5zcG9ydHNbUlRTUF9NQVhfVFJBTlNQT1JUU107CisKKyAgICBpbnQgc2VxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHNlcXVlbmNlIG51bWJlciAqLworCisgICAgLyoqIHRoZSAiU2Vzc2lvbjoiIGZpZWxkLiBUaGlzIHZhbHVlIGlzIGluaXRpYWxseSBzZXQgYnkgdGhlIHNlcnZlciBhbmQKKyAgICAgKiBzaG91bGQgYmUgcmUtdHJhbnNtaXR0ZWQgYnkgdGhlIGNsaWVudCBpbiBldmVyeSBSVFNQIGNvbW1hbmQuICovCisgICAgY2hhciBzZXNzaW9uX2lkWzUxMl07CisKKyAgICAvKiogdGhlICJMb2NhdGlvbjoiIGZpZWxkLiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gaGFuZGxlIHJlZGlyZWN0aW9uLgorICAgICAqLworICAgIGNoYXIgbG9jYXRpb25bNDA5Nl07CisKKyAgICAvKiogdGhlICJSZWFsQ2hhbGxlbmdlMToiIGZpZWxkIGZyb20gdGhlIHNlcnZlciAqLworICAgIGNoYXIgcmVhbF9jaGFsbGVuZ2VbNjRdOworCisgICAgLyoqIHRoZSAiU2VydmVyOiBmaWVsZCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgc29tZSBzcGVjaWFsLWNhc2UKKyAgICAgKiBzZXJ2ZXJzIHRoYXQgYXJlIG5vdCAxMDAlIHN0YW5kYXJkcy1jb21wbGlhbnQuIFdlIHVzZSB0aGlzIHRvIGlkZW50aWZ5CisgICAgICogV2luZG93cyBNZWRpYSBTZXJ2ZXIsIHdoaWNoIGhhcyBhIHZhbHVlICJXTVNlcnZlci92LmUuci5zaW9uIiwgd2hlcmUKKyAgICAgKiB2ZXJzaW9uIGlzIGEgc2VxdWVuY2Ugb2YgZGlnaXRzIChlLmcuIDkuMC4wLjMzNzIpLiBIZWxpeC9SZWFsIHNlcnZlcnMKKyAgICAgKiB1c2Ugc29tZXRoaW5nIGxpa2UgIkhlbGl4IFsuLl0gU2VydmVyIFZlcnNpb24gdi5lLnIuc2lvbiAocGxhdGZvcm0pCisgICAgICogKFJlYWxTZXJ2ZXIgY29tcGF0aWJsZSkiIG9yICJSZWFsU2VydmVyIFZlcnNpb24gdi5lLnIuc2lvbiAocGxhdGZvcm0pIiwKKyAgICAgKiB3aGVyZSBwbGF0Zm9ybSBpcyB0aGUgb3V0cHV0IG9mICR1bmFtZSAtbXNyIHwgc2VkICdzLyAvLS9nJy4gKi8KKyAgICBjaGFyIHNlcnZlcls2NF07CisKKyAgICAvKiogVGhlICJ0aW1lb3V0IiBjb21lcyBhcyBwYXJ0IG9mIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgdG8gdGhlICJTRVRVUCIKKyAgICAgKiBjb21tYW5kLCBpbiB0aGUgIlNlc3Npb246IDx4eXo+Wzt0aW1lb3V0PTx2YWx1ZT5dIiBsaW5lLiBJdCBpcyB0aGUKKyAgICAgKiB0aW1lLCBpbiBzZWNvbmRzLCB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCBnbyB3aXRob3V0IHRyYWZmaWMgb3ZlciB0aGUKKyAgICAgKiBSVFNQL1RDUCBjb25uZWN0aW9uIGJlZm9yZSBpdCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uIFRvIHByZXZlbnQKKyAgICAgKiB0aGlzLCBzZW50IGR1bW15IHJlcXVlc3RzIChlLmcuIE9QVElPTlMpIHdpdGggaW50ZXJ2YWxzIHNtYWxsZXIKKyAgICAgKiB0aGFuIHRoaXMgdmFsdWUuICovCisgICAgaW50IHRpbWVvdXQ7CisKKyAgICAvKiogVGhlICJOb3RpY2UiIG9yICJYLU5vdGljZSIgZmllbGQgdmFsdWUuIFNlZQorICAgICAqIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LXN0aWVtZXJsaW5nLXJ0c3AtYW5ub3VuY2UtMDAKKyAgICAgKiBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZXMuICovCisgICAgaW50IG5vdGljZTsKKworICAgIC8qKiBUaGUgInJlYXNvbiIgaXMgbWVhbnQgdG8gc3BlY2lmeSBiZXR0ZXIgdGhlIG1lYW5pbmcgb2YgdGhlIGVycm9yIGNvZGUKKyAgICAgKiByZXR1cm5lZAorICAgICAqLworICAgIGNoYXIgcmVhc29uWzI1Nl07CisKKyAgICAvKioKKyAgICAgKiBDb250ZW50IHR5cGUgaGVhZGVyCisgICAgICovCisgICAgY2hhciBjb250ZW50X3R5cGVbNjRdOworfSBSVFNQTWVzc2FnZUhlYWRlcjsKKworLyoqCisgKiBDbGllbnQgc3RhdGUsIGkuZS4gd2hldGhlciB3ZSBhcmUgY3VycmVudGx5IHJlY2VpdmluZyBkYXRhIChQTEFZSU5HKSBvcgorICogc2V0dXAtYnV0LW5vdC1yZWNlaXZpbmcgKFBBVVNFRCkuIFN0YXRlIGNhbiBiZSBjaGFuZ2VkIGluIGFwcGxpY2F0aW9ucworICogYnkgY2FsbGluZyBhdl9yZWFkX3BsYXkvcGF1c2UoKS4KKyAqLworZW51bSBSVFNQQ2xpZW50U3RhdGUgeworICAgIFJUU1BfU1RBVEVfSURMRSwgICAgLyoqPCBub3QgaW5pdGlhbGl6ZWQgKi8KKyAgICBSVFNQX1NUQVRFX1NUUkVBTUlORywgLyoqPCBpbml0aWFsaXplZCBhbmQgc2VuZGluZy9yZWNlaXZpbmcgZGF0YSAqLworICAgIFJUU1BfU1RBVEVfUEFVU0VELCAgLyoqPCBpbml0aWFsaXplZCwgYnV0IG5vdCByZWNlaXZpbmcgZGF0YSAqLworICAgIFJUU1BfU1RBVEVfU0VFS0lORywgLyoqPCBpbml0aWFsaXplZCwgcmVxdWVzdGluZyBhIHNlZWsgKi8KK307CisKKy8qKgorICogSWRlbnRpZnkgcGFydGljdWxhciBzZXJ2ZXJzIHRoYXQgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nLCBzdWNoIGFzCisgKiBzdGFuZGFyZHMtaW5jb21wbGlhbnQgIlRyYW5zcG9ydDoiIGxpbmVzIGluIHRoZSBTRVRVUCByZXF1ZXN0LgorICovCitlbnVtIFJUU1BTZXJ2ZXJUeXBlIHsKKyAgICBSVFNQX1NFUlZFUl9SVFAsICAvKio8IFN0YW5kYXJkcy1jb21wbGlhbnQgUlRQLXNlcnZlciAqLworICAgIFJUU1BfU0VSVkVSX1JFQUwsIC8qKjwgUmVhbG1lZGlhLXN0eWxlIHNlcnZlciAqLworICAgIFJUU1BfU0VSVkVSX1dNUywgIC8qKjwgV2luZG93cyBNZWRpYSBzZXJ2ZXIgKi8KKyAgICBSVFNQX1NFUlZFUl9OQgorfTsKKworLyoqCisgKiBQcml2YXRlIGRhdGEgZm9yIHRoZSBSVFNQIGRlbXV4ZXIuCisgKgorICogQHRvZG8gVXNlIEFWSU9Db250ZXh0IGluc3RlYWQgb2YgVVJMQ29udGV4dAorICovCit0eXBlZGVmIHN0cnVjdCBSVFNQU3RhdGUgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOyAgICAgICAgICAgICAvKio8IENsYXNzIGZvciBwcml2YXRlIG9wdGlvbnMuICovCisgICAgVVJMQ29udGV4dCAqcnRzcF9oZDsgLyogUlRTUCBUQ1AgY29ubmVjdGlvbiBoYW5kbGUgKi8KKworICAgIC8qKiBudW1iZXIgb2YgaXRlbXMgaW4gdGhlICdydHNwX3N0cmVhbXMnIHZhcmlhYmxlICovCisgICAgaW50IG5iX3J0c3Bfc3RyZWFtczsKKworICAgIHN0cnVjdCBSVFNQU3RyZWFtICoqcnRzcF9zdHJlYW1zOyAvKio8IHN0cmVhbXMgaW4gdGhpcyBzZXNzaW9uICovCisKKyAgICAvKiogaW5kaWNhdG9yIG9mIHdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgZGF0YSBmcm9tIHRoZQorICAgICAqIHNlcnZlci4gQmFzaWNhbGx5IHRoaXMgaXNuJ3QgbW9yZSB0aGFuIGEgc2ltcGxlIGNhY2hlIG9mIHRoZQorICAgICAqIGxhc3QgUExBWS9QQVVTRSBjb21tYW5kIHNlbnQgdG8gdGhlIHNlcnZlciwgdG8gbWFrZSBzdXJlIHdlIGRvbid0CisgICAgICogc2VuZCAyeCB0aGUgc2FtZSB1bmV4cGVjdGVkbHkgb3IgY29tbWFuZHMgaW4gdGhlIHdyb25nIHN0YXRlLiAqLworICAgIGVudW0gUlRTUENsaWVudFN0YXRlIHN0YXRlOworCisgICAgLyoqIHRoZSBzZWVrIHZhbHVlIHJlcXVlc3RlZCB3aGVuIGNhbGxpbmcgYXZfc2Vla19mcmFtZSgpLiBUaGlzIHZhbHVlCisgICAgICogaXMgc3Vic2VxdWVudGx5IHVzZWQgYXMgcGFydCBvZiB0aGUgIlJhbmdlIiBwYXJhbWV0ZXIgd2hlbiBlbWl0dGluZworICAgICAqIHRoZSBSVFNQIFBMQVkgY29tbWFuZC4gSWYgd2UgYXJlIGN1cnJlbnRseSBwbGF5aW5nLCB0aGlzIGNvbW1hbmQgaXMKKyAgICAgKiBjYWxsZWQgaW5zdGFudGx5LiBJZiB3ZSBhcmUgY3VycmVudGx5IHBhdXNlZCwgdGhpcyBjb21tYW5kIGlzIGNhbGxlZAorICAgICAqIHdoZW5ldmVyIHdlIHJlc3VtZSBwbGF5YmFjay4gRWl0aGVyIHdheSwgdGhlIHZhbHVlIGlzIG9ubHkgdXNlZCBvbmNlLAorICAgICAqIHNlZSBydHNwX3JlYWRfcGxheSgpIGFuZCBydHNwX3JlYWRfc2VlaygpLiAqLworICAgIGludDY0X3Qgc2Vla190aW1lc3RhbXA7CisKKyAgICBpbnQgc2VxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSVFNQIGNvbW1hbmQgc2VxdWVuY2UgbnVtYmVyICovCisKKyAgICAvKiogY29weSBvZiBSVFNQTWVzc2FnZUhlYWRlci0+c2Vzc2lvbl9pZCwgaS5lLiB0aGUgc2VydmVyLXByb3ZpZGVkIHNlc3Npb24KKyAgICAgKiBpZGVudGlmaWVyIHRoYXQgdGhlIGNsaWVudCBzaG91bGQgcmUtdHJhbnNtaXQgaW4gZWFjaCBSVFNQIGNvbW1hbmQgKi8KKyAgICBjaGFyIHNlc3Npb25faWRbNTEyXTsKKworICAgIC8qKiBjb3B5IG9mIFJUU1BNZXNzYWdlSGVhZGVyLT50aW1lb3V0LCBpLmUuIHRoZSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0CisgICAgICogdGhlIHNlcnZlciB3aWxsIGdvIHdpdGhvdXQgdHJhZmZpYyBvbiB0aGUgUlRTUC9UQ1AgbGluZSBiZWZvcmUgaXQKKyAgICAgKiBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uICovCisgICAgaW50IHRpbWVvdXQ7CisKKyAgICAvKiogdGltZXN0YW1wIG9mIHRoZSBsYXN0IFJUU1AgY29tbWFuZCB0aGF0IHdlIHNlbnQgdG8gdGhlIFJUU1Agc2VydmVyLgorICAgICAqIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgd2hlbiB0byBzZW5kIGR1bW15IGNvbW1hbmRzIHRvIGtlZXAgdGhlCisgICAgICogY29ubmVjdGlvbiBhbGl2ZSwgaW4gY29uanVuY3Rpb24gd2l0aCB0aW1lb3V0LiAqLworICAgIGludDY0X3QgbGFzdF9jbWRfdGltZTsKKworICAgIC8qKiB0aGUgbmVnb3RpYXRlZCBkYXRhL3BhY2tldCB0cmFuc3BvcnQgcHJvdG9jb2w7IGUuZy4gUlRQIG9yIFJEVCAqLworICAgIGVudW0gUlRTUFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICAvKiogdGhlIG5lZ290aWF0ZWQgbmV0d29yayBsYXllciB0cmFuc3BvcnQgcHJvdG9jb2w7IGUuZy4gVENQIG9yIFVEUAorICAgICAqIHVuaS0vbXVsdGljYXN0ICovCisgICAgZW51bSBSVFNQTG93ZXJUcmFuc3BvcnQgbG93ZXJfdHJhbnNwb3J0OworCisgICAgLyoqIGJyYW5kIG9mIHNlcnZlciB0aGF0IHdlJ3JlIHRhbGtpbmcgdG87IGUuZy4gV01TLCBSRUFMIG9yIG90aGVyLgorICAgICAqIERldGVjdGVkIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBSVFNQTWVzc2FnZUhlYWRlci0+c2VydmVyIG9yIHRoZSBwcmVzZW5jZQorICAgICAqIG9mIFJUU1BNZXNzYWdlSGVhZGVyLT5yZWFsX2NoYWxsZW5nZSAqLworICAgIGVudW0gUlRTUFNlcnZlclR5cGUgc2VydmVyX3R5cGU7CisKKyAgICAvKiogdGhlICJSZWFsQ2hhbGxlbmdlMToiIGZpZWxkIGZyb20gdGhlIHNlcnZlciAqLworICAgIGNoYXIgcmVhbF9jaGFsbGVuZ2VbNjRdOworCisgICAgLyoqIHBsYWludGV4dCBhdXRob3JpemF0aW9uIGxpbmUgKHVzZXJuYW1lOnBhc3N3b3JkKSAqLworICAgIGNoYXIgYXV0aFsxMjhdOworCisgICAgLyoqIGF1dGhlbnRpY2F0aW9uIHN0YXRlICovCisgICAgSFRUUEF1dGhTdGF0ZSBhdXRoX3N0YXRlOworCisgICAgLyoqIFRoZSBsYXN0IHJlcGx5IG9mIHRoZSBzZXJ2ZXIgdG8gYSBSVFNQIGNvbW1hbmQgKi8KKyAgICBjaGFyIGxhc3RfcmVwbHlbMjA0OF07IC8qIFhYWDogYWxsb2NhdGUgPyAqLworCisgICAgLyoqIFJUU1BTdHJlYW0tPnRyYW5zcG9ydF9wcml2IG9mIHRoZSBsYXN0IHN0cmVhbSB0aGF0IHdlIHJlYWQgYQorICAgICAqIHBhY2tldCBmcm9tICovCisgICAgdm9pZCAqY3VyX3RyYW5zcG9ydF9wcml2OworCisgICAgLyoqIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgZm9yIFJlYWwgc3RyZWFtIHNlbGVjdGlvbiAqLworICAgIC8vQHsKKyAgICAvKiogd2hldGhlciB3ZSBuZWVkIHRvIHNlbmQgYSAiU0VUX1BBUkFNRVRFUiBTdWJzY3JpYmU6IiBjb21tYW5kICovCisgICAgaW50IG5lZWRfc3Vic2NyaXB0aW9uOworCisgICAgLyoqIHN0cmVhbSBzZXR1cCBkdXJpbmcgdGhlIGxhc3QgZnJhbWUgcmVhZC4gVGhpcyBpcyB1c2VkIHRvIGRldGVjdCBpZgorICAgICAqIHdlIG5lZWQgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIHRvIGFueSBuZXcgc3RyZWFtcy4gKi8KKyAgICBlbnVtIEFWRGlzY2FyZCAqcmVhbF9zZXR1cF9jYWNoZTsKKworICAgIC8qKiBjdXJyZW50IHN0cmVhbSBzZXR1cC4gVGhpcyBpcyBhIHRlbXBvcmFyeSBidWZmZXIgdXNlZCB0byBjb21wYXJlCisgICAgICogY3VycmVudCBzZXR1cCB0byBwcmV2aW91cyBmcmFtZSBzZXR1cC4gKi8KKyAgICBlbnVtIEFWRGlzY2FyZCAqcmVhbF9zZXR1cDsKKworICAgIC8qKiB0aGUgbGFzdCB2YWx1ZSBvZiB0aGUgIlNFVF9QQVJBTUVURVIgU3Vic2NyaWJlOiIgUlRTUCBjb21tYW5kLgorICAgICAqIHRoaXMgaXMgdXNlZCB0byBzZW5kIHRoZSBzYW1lICJVbnN1YnNjcmliZToiIGlmIHN0cmVhbSBzZXR1cCBjaGFuZ2VkLAorICAgICAqIGJlZm9yZSBzZW5kaW5nIGEgbmV3ICJTdWJzY3JpYmU6IiBjb21tYW5kLiAqLworICAgIGNoYXIgbGFzdF9zdWJzY3JpcHRpb25bMTAyNF07CisgICAgLy9AfQorCisgICAgLyoqIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgZm9yIFJUUC9BU0Ygc3RyZWFtcyAqLworICAgIC8vQHsKKyAgICAvKiogQVNGIGRlbXV4ZXIgY29udGV4dCBmb3IgdGhlIGVtYmVkZGVkIEFTRiBzdHJlYW0gZnJvbSBXTVMgc2VydmVycyAqLworICAgIEFWRm9ybWF0Q29udGV4dCAqYXNmX2N0eDsKKworICAgIC8qKiBjYWNoZSBmb3IgcG9zaXRpb24gb2YgdGhlIGFzZiBkZW11eGVyLCBzaW5jZSB3ZSBsb2FkIGEgbmV3CisgICAgICogZGF0YSBwYWNrZXQgaW4gdGhlIGJ5dGVjb250ZXh0IGZvciBlYWNoIGluY29taW5nIFJUU1AgcGFja2V0LiAqLworICAgIHVpbnQ2NF90IGFzZl9wYl9wb3M7CisgICAgLy9AfQorCisgICAgLyoqIHNvbWUgTVMgUlRTUCBzdHJlYW1zIGNvbnRhaW4gYSBVUkwgaW4gdGhlIFNEUCB0aGF0IHdlIG5lZWQgdG8gdXNlCisgICAgICogZm9yIGFsbCBzdWJzZXF1ZW50IFJUU1AgcmVxdWVzdHMsIHJhdGhlciB0aGFuIHRoZSBpbnB1dCBVUkk7IGluCisgICAgICogb3RoZXIgY2FzZXMsIHRoaXMgaXMgYSBjb3B5IG9mIEFWRm9ybWF0Q29udGV4dC0+ZmlsZW5hbWUuICovCisgICAgY2hhciBjb250cm9sX3VyaVsxMDI0XTsKKworICAgIC8qKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIGZvciBwYXJzaW5nIHJhdyBtcGVndHMgaW4gdWRwICovCisgICAgLy9AeworICAgIHN0cnVjdCBNcGVnVFNDb250ZXh0ICp0czsKKyAgICBpbnQgcmVjdmJ1Zl9wb3M7CisgICAgaW50IHJlY3ZidWZfbGVuOworICAgIC8vQH0KKworICAgIC8qKiBBZGRpdGlvbmFsIG91dHB1dCBoYW5kbGUsIHVzZWQgd2hlbiBpbnB1dCBhbmQgb3V0cHV0IGFyZSBkb25lCisgICAgICogc2VwYXJhdGVseSwgZWcgZm9yIEhUVFAgdHVubmVsaW5nLiAqLworICAgIFVSTENvbnRleHQgKnJ0c3BfaGRfb3V0OworCisgICAgLyoqIFJUU1AgdHJhbnNwb3J0IG1vZGUsIHN1Y2ggYXMgcGxhaW4gb3IgdHVubmVsZWQuICovCisgICAgZW51bSBSVFNQQ29udHJvbFRyYW5zcG9ydCBjb250cm9sX3RyYW5zcG9ydDsKKworICAgIC8qIE51bWJlciBvZiBSVENQIEJZRSBwYWNrZXRzIHRoZSBSVFNQIHNlc3Npb24gaGFzIHJlY2VpdmVkLgorICAgICAqIEFuIEVPRiBpcyBwcm9wYWdhdGVkIGJhY2sgaWYgbmJfYnllcyA9PSBuYl9zdHJlYW1zLgorICAgICAqIFRoaXMgaXMgcmVzZXQgYWZ0ZXIgYSBzZWVrLiAqLworICAgIGludCBuYl9ieWVzOworCisgICAgLyoqIFJldXNhYmxlIGJ1ZmZlciBmb3IgcmVjZWl2aW5nIHBhY2tldHMgKi8KKyAgICB1aW50OF90KiByZWN2YnVmOworCisgICAgLyoqCisgICAgICogQSBtYXNrIHdpdGggYWxsIHJlcXVlc3RlZCB0cmFuc3BvcnQgbWV0aG9kcworICAgICAqLworICAgIGludCBsb3dlcl90cmFuc3BvcnRfbWFzazsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcGFja2V0cworICAgICAqLworICAgIHVpbnQ2NF90IHBhY2tldHM7CisKKyAgICAvKioKKyAgICAgKiBQb2xsaW5nIGFycmF5IGZvciB1ZHAKKyAgICAgKi8KKyAgICBzdHJ1Y3QgcG9sbGZkICpwOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgc2VydmVyIHN1cHBvcnRzIHRoZSBHRVRfUEFSQU1FVEVSIG1ldGhvZC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0X3BhcmFtZXRlcl9zdXBwb3J0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBEbyBub3QgYmVnaW4gdG8gcGxheSB0aGUgc3RyZWFtIGltbWVkaWF0ZWx5LgorICAgICAqLworICAgIGludCBpbml0aWFsX3BhdXNlOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZsYWdzIGZvciB0aGUgY2hhaW5lZCBSVFAgbXV4ZXIuCisgICAgICovCisgICAgaW50IHJ0cF9tdXhlcl9mbGFnczsKKworICAgIC8qKiBXaGV0aGVyIHRoZSBzZXJ2ZXIgYWNjZXB0cyB0aGUgeC1EeW5hbWljLVJhdGUgaGVhZGVyICovCisgICAgaW50IGFjY2VwdF9keW5hbWljX3JhdGU7CisKKyAgICAvKioKKyAgICAgKiBWYXJpb3VzIG9wdGlvbiBmbGFncyBmb3IgdGhlIFJUU1AgbXV4ZXIvZGVtdXhlci4KKyAgICAgKi8KKyAgICBpbnQgcnRzcF9mbGFnczsKKworICAgIC8qKgorICAgICAqIE1hc2sgb2YgYWxsIHJlcXVlc3RlZCBtZWRpYSB0eXBlcworICAgICAqLworICAgIGludCBtZWRpYV90eXBlX21hc2s7CisKKyAgICAvKioKKyAgICAgKiBNaW5pbXVtIGFuZCBtYXhpbXVtIGxvY2FsIFVEUCBwb3J0cy4KKyAgICAgKi8KKyAgICBpbnQgcnRwX3BvcnRfbWluLCBydHBfcG9ydF9tYXg7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHRvIHdhaXQgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zLgorICAgICAqLworICAgIGludCBpbml0aWFsX3RpbWVvdXQ7CisKKyAgICAvKioKKyAgICAgKiB0aW1lb3V0IG9mIHNvY2tldCBpL28gb3BlcmF0aW9ucy4KKyAgICAgKi8KKyAgICBpbnQgc3RpbWVvdXQ7CisKKyAgICAvKioKKyAgICAgKiBTaXplIG9mIFJUUCBwYWNrZXQgcmVvcmRlcmluZyBxdWV1ZS4KKyAgICAgKi8KKyAgICBpbnQgcmVvcmRlcmluZ19xdWV1ZV9zaXplOworCisgICAgLyoqCisgICAgICogVXNlci1BZ2VudCBzdHJpbmcKKyAgICAgKi8KKyAgICBjaGFyICp1c2VyX2FnZW50OworfSBSVFNQU3RhdGU7CisKKyNkZWZpbmUgUlRTUF9GTEFHX0ZJTFRFUl9TUkMgIDB4MSAgICAvKio8IEZpbHRlciBpbmNvbWluZyBVRFAgcGFja2V0cyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlIHBhY2tldHMgb25seSBmcm9tIHRoZSByaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGFkZHJlc3MgYW5kIHBvcnQuICovCisjZGVmaW5lIFJUU1BfRkxBR19MSVNURU4gICAgICAweDIgICAgLyoqPCBXYWl0IGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4gKi8KKyNkZWZpbmUgUlRTUF9GTEFHX0NVU1RPTV9JTyAgIDB4NCAgICAvKio8IERvIGFsbCBJTyB2aWEgdGhlIEFWSU9Db250ZXh0LiAqLworI2RlZmluZSBSVFNQX0ZMQUdfUlRDUF9UT19TT1VSQ0UgMHg4IC8qKjwgU2VuZCBSVENQIHBhY2tldHMgdG8gdGhlIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBvZiByZWNlaXZlZCBwYWNrZXRzLiAqLworI2RlZmluZSBSVFNQX0ZMQUdfUFJFRkVSX1RDUCAgMHgxMCAgIC8qKjwgVHJ5IFJUUCB2aWEgVENQIGZpcnN0IGlmIHBvc3NpYmxlLiAqLworCit0eXBlZGVmIHN0cnVjdCBSVFNQU291cmNlIHsKKyAgICBjaGFyIGFkZHJbMTI4XTsgLyoqPCBTb3VyY2Utc3BlY2lmaWMgbXVsdGljYXN0IGluY2x1ZGUgc291cmNlIElQIGFkZHJlc3MgKGZyb20gU0RQIGNvbnRlbnQpICovCit9IFJUU1BTb3VyY2U7CisKKy8qKgorICogRGVzY3JpYmUgYSBzaW5nbGUgc3RyZWFtLCBhcyBpZGVudGlmaWVkIGJ5IGEgc2luZ2xlIG09IGxpbmUgYmxvY2sgaW4gdGhlCisgKiBTRFAgY29udGVudC4gSW4gdGhlIGNhc2Ugb2YgUkRULCBvbmUgUlRTUFN0cmVhbSBjYW4gcmVwcmVzZW50IG11bHRpcGxlCisgKiBBVlN0cmVhbXMuIEluIHRoaXMgY2FzZSwgZWFjaCBBVlN0cmVhbSBpbiB0aGlzIHNldCBoYXMgc2ltaWxhciBjb250ZW50CisgKiAoYnV0IGRpZmZlcmVudCBjb2RlYy9iaXRyYXRlKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgUlRTUFN0cmVhbSB7CisgICAgVVJMQ29udGV4dCAqcnRwX2hhbmRsZTsgICAvKio8IFJUUCBzdHJlYW0gaGFuZGxlIChpZiBVRFApICovCisgICAgdm9pZCAqdHJhbnNwb3J0X3ByaXY7IC8qKjwgUlRQL1JEVCBwYXJzZSBjb250ZXh0IGlmIGlucHV0LCBSVFAgQVZGb3JtYXRDb250ZXh0IGlmIG91dHB1dCAqLworCisgICAgLyoqIGNvcnJlc3BvbmRpbmcgc3RyZWFtIGluZGV4LCBpZiBhbnkuIC0xIGlmIG5vbmUgKE1QRUcyVFMgY2FzZSkgKi8KKyAgICBpbnQgc3RyZWFtX2luZGV4OworCisgICAgLyoqIGludGVybGVhdmUgSURzOyBjb3BpZXMgb2YgUlRTUFRyYW5zcG9ydEZpZWxkLT5pbnRlcmxlYXZlZF9taW4vbWF4CisgICAgICogZm9yIHRoZSBzZWxlY3RlZCB0cmFuc3BvcnQuIE9ubHkgdXNlZCBmb3IgVENQLiAqLworICAgIGludCBpbnRlcmxlYXZlZF9taW4sIGludGVybGVhdmVkX21heDsKKworICAgIGNoYXIgY29udHJvbF91cmxbMTAyNF07ICAgLyoqPCB1cmwgZm9yIHRoaXMgc3RyZWFtIChmcm9tIFNEUCkgKi8KKworICAgIC8qKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIG9ubHkgaW4gU0RQLCBub3QgUlRTUCAqLworICAgIC8vQHsKKyAgICBpbnQgc2RwX3BvcnQ7ICAgICAgICAgICAgIC8qKjwgcG9ydCAoZnJvbSBTRFAgY29udGVudCkgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzZHBfaXA7IC8qKjwgSVAgYWRkcmVzcyAoZnJvbSBTRFAgY29udGVudCkgKi8KKyAgICBpbnQgbmJfaW5jbHVkZV9zb3VyY2VfYWRkcnM7IC8qKjwgTnVtYmVyIG9mIHNvdXJjZS1zcGVjaWZpYyBtdWx0aWNhc3QgaW5jbHVkZSBzb3VyY2UgSVAgYWRkcmVzc2VzIChmcm9tIFNEUCBjb250ZW50KSAqLworICAgIHN0cnVjdCBSVFNQU291cmNlICoqaW5jbHVkZV9zb3VyY2VfYWRkcnM7IC8qKjwgU291cmNlLXNwZWNpZmljIG11bHRpY2FzdCBpbmNsdWRlIHNvdXJjZSBJUCBhZGRyZXNzZXMgKGZyb20gU0RQIGNvbnRlbnQpICovCisgICAgaW50IG5iX2V4Y2x1ZGVfc291cmNlX2FkZHJzOyAvKio8IE51bWJlciBvZiBzb3VyY2Utc3BlY2lmaWMgbXVsdGljYXN0IGV4Y2x1ZGUgc291cmNlIElQIGFkZHJlc3NlcyAoZnJvbSBTRFAgY29udGVudCkgKi8KKyAgICBzdHJ1Y3QgUlRTUFNvdXJjZSAqKmV4Y2x1ZGVfc291cmNlX2FkZHJzOyAvKio8IFNvdXJjZS1zcGVjaWZpYyBtdWx0aWNhc3QgZXhjbHVkZSBzb3VyY2UgSVAgYWRkcmVzc2VzIChmcm9tIFNEUCBjb250ZW50KSAqLworICAgIGludCBzZHBfdHRsOyAgICAgICAgICAgICAgLyoqPCBJUCBUaW1lLVRvLUxpdmUgKGZyb20gU0RQIGNvbnRlbnQpICovCisgICAgaW50IHNkcF9wYXlsb2FkX3R5cGU7ICAgICAvKio8IHBheWxvYWQgdHlwZSAqLworICAgIC8vQH0KKworICAgIC8qKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIGZvciBkeW5hbWljIHByb3RvY29scyAocnRwZGVjXyouYy9yZHQuYykgKi8KKyAgICAvL0B7CisgICAgLyoqIGhhbmRsZXIgc3RydWN0dXJlICovCisgICAgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqZHluYW1pY19oYW5kbGVyOworCisgICAgLyoqIHByaXZhdGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGR5bmFtaWMgcHJvdG9jb2wgKi8KKyAgICBQYXlsb2FkQ29udGV4dCAqZHluYW1pY19wcm90b2NvbF9jb250ZXh0OworICAgIC8vQH0KKworICAgIC8qKiBFbmFibGUgc2VuZGluZyBSVENQIGZlZWRiYWNrIG1lc3NhZ2VzIGFjY29yZGluZyB0byBSRkMgNDU4NSAqLworICAgIGludCBmZWVkYmFjazsKKworICAgIGNoYXIgY3J5cHRvX3N1aXRlWzQwXTsKKyAgICBjaGFyIGNyeXB0b19wYXJhbXNbMTAwXTsKK30gUlRTUFN0cmVhbTsKKwordm9pZCBmZl9ydHNwX3BhcnNlX2xpbmUoUlRTUE1lc3NhZ2VIZWFkZXIgKnJlcGx5LCBjb25zdCBjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBSVFNQU3RhdGUgKnJ0LCBjb25zdCBjaGFyICptZXRob2QpOworCisvKioKKyAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBSVFNQIHNlcnZlciB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSByZXBseS4KKyAqCisgKiBAc2VlIHJ0c3Bfc2VuZF9jbWRfd2l0aF9jb250ZW50X2FzeW5jCisgKi8KK2ludCBmZl9ydHNwX3NlbmRfY21kX2FzeW5jKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBjaGFyICpoZWFkZXJzKTsKKworLyoqCisgKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgUlRTUCBzZXJ2ZXIgYW5kIHdhaXQgZm9yIHRoZSByZXBseS4KKyAqCisgKiBAcGFyYW0gcyBSVFNQIChkZSltdXhlciBjb250ZXh0CisgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgZm9yIHRoZSByZXF1ZXN0CisgKiBAcGFyYW0gdXJsIHRoZSB0YXJnZXQgdXJsIGZvciB0aGUgcmVxdWVzdAorICogQHBhcmFtIGhlYWRlcnMgZXh0cmEgaGVhZGVyIGxpbmVzIHRvIGluY2x1ZGUgaW4gdGhlIHJlcXVlc3QKKyAqIEBwYXJhbSByZXBseSBwb2ludGVyIHdoZXJlIHRoZSBSVFNQIG1lc3NhZ2UgaGVhZGVyIHdpbGwgYmUgc3RvcmVkCisgKiBAcGFyYW0gY29udGVudF9wdHIgcG9pbnRlciB3aGVyZSB0aGUgUlRTUCBtZXNzYWdlIGJvZHksIGlmIGFueSwgd2lsbAorICogICAgICAgICAgICAgICAgICAgIGJlIHN0b3JlZCAobGVuZ3RoIGlzIGluIHJlcGx5KQorICogQHBhcmFtIHNlbmRfY29udGVudCBpZiBub24tbnVsbCwgdGhlIGRhdGEgdG8gc2VuZCBhcyByZXF1ZXN0IGJvZHkgY29udGVudAorICogQHBhcmFtIHNlbmRfY29udGVudF9sZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgc2VuZF9jb250ZW50IGRhdGEsIG9yIDAgaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfY29udGVudCBpcyBudWxsCisgKgorICogQHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3MsIG5vbnplcm8gb3RoZXJ3aXNlCisgKi8KK2ludCBmZl9ydHNwX3NlbmRfY21kX3dpdGhfY29udGVudChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWV0aG9kLCBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFNQTWVzc2FnZUhlYWRlciAqcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKmNvbnRlbnRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlbmRfY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZF9jb250ZW50X2xlbmd0aCk7CisKKy8qKgorICogU2VuZCBhIGNvbW1hbmQgdG8gdGhlIFJUU1Agc2VydmVyIGFuZCB3YWl0IGZvciB0aGUgcmVwbHkuCisgKgorICogQHNlZSBydHNwX3NlbmRfY21kX3dpdGhfY29udGVudAorICovCitpbnQgZmZfcnRzcF9zZW5kX2NtZChBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKm1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgY2hhciAqaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgIFJUU1BNZXNzYWdlSGVhZGVyICpyZXBseSwgdW5zaWduZWQgY2hhciAqKmNvbnRlbnRfcHRyKTsKKworLyoqCisgKiBSZWFkIGEgUlRTUCBtZXNzYWdlIGZyb20gdGhlIHNlcnZlciwgb3IgcHJlcGFyZSB0byByZWFkIGRhdGEKKyAqIHBhY2tldHMgaWYgd2UncmUgcmVhZGluZyBkYXRhIGludGVybGVhdmVkIG92ZXIgdGhlIFRDUC9SVFNQCisgKiBjb25uZWN0aW9uIGFzIHdlbGwuCisgKgorICogQHBhcmFtIHMgUlRTUCAoZGUpbXV4ZXIgY29udGV4dAorICogQHBhcmFtIHJlcGx5IHBvaW50ZXIgd2hlcmUgdGhlIFJUU1AgbWVzc2FnZSBoZWFkZXIgd2lsbCBiZSBzdG9yZWQKKyAqIEBwYXJhbSBjb250ZW50X3B0ciBwb2ludGVyIHdoZXJlIHRoZSBSVFNQIG1lc3NhZ2UgYm9keSwgaWYgYW55LCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgYmUgc3RvcmVkIChsZW5ndGggaXMgaW4gcmVwbHkpCisgKiBAcGFyYW0gcmV0dXJuX29uX2ludGVybGVhdmVkX2RhdGEgd2hldGhlciB0aGUgZnVuY3Rpb24gbWF5IHJldHVybiBpZiB3ZQorICogICAgICAgICAgICAgICAgICAgZW5jb3VudGVyIGEgZGF0YSBtYXJrZXIgKCckJyksIHdoaWNoIHByZWNlZGVzIGRhdGEKKyAqICAgICAgICAgICAgICAgICAgIHBhY2tldHMgb3ZlciBpbnRlcmxlYXZlZCBUQ1AvUlRTUCBjb25uZWN0aW9ucy4gSWYgdGhpcworICogICAgICAgICAgICAgICAgICAgaXMgc2V0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDEgYWZ0ZXIgZW5jb3VudGVyaW5nCisgKiAgICAgICAgICAgICAgICAgICBhICckJy4gSWYgaXQgaXMgbm90IHNldCwgdGhlIGZ1bmN0aW9uIHdpbGwgc2tpcCBhbnkKKyAqICAgICAgICAgICAgICAgICAgIGRhdGEgcGFja2V0cyAoaWYgdGhleSBhcmUgZW5jb3VudGVyZWQpLCB1bnRpbCBhIHJlcGx5CisgKiAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBmdWxseSBwYXJzZWQuIElmIG5vIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUKKyAqICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgcGFyc2luZyBhIHJlcGx5LCBpdCB3aWxsIHJldHVybiBhbiBlcnJvci4KKyAqIEBwYXJhbSBtZXRob2QgdGhlIFJUU1AgbWV0aG9kIHRoaXMgaXMgYSByZXBseSB0by4gVGhpcyBhZmZlY3RzIGhvdworICogICAgICAgICAgICAgICBzb21lIHJlc3BvbnNlIGhlYWRlcnMgYXJlIGFjdGVkIHVwb24uIE1heSBiZSBOVUxMLgorICoKKyAqIEByZXR1cm4gMSBpZiBhIGRhdGEgcGFja2V0cyBpcyByZWFkeSB0byBiZSByZWNlaXZlZCwgLTEgb24gZXJyb3IsCisgKiAgICAgICAgICBhbmQgMCBvbiBzdWNjZXNzLgorICovCitpbnQgZmZfcnRzcF9yZWFkX3JlcGx5KEFWRm9ybWF0Q29udGV4dCAqcywgUlRTUE1lc3NhZ2VIZWFkZXIgKnJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqY29udGVudF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR1cm5fb25faW50ZXJsZWF2ZWRfZGF0YSwgY29uc3QgY2hhciAqbWV0aG9kKTsKKworLyoqCisgKiBTa2lwIGEgUlRQL1RDUCBpbnRlcmxlYXZlZCBwYWNrZXQuCisgKi8KK3ZvaWQgZmZfcnRzcF9za2lwX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMpOworCisvKioKKyAqIENvbm5lY3QgdG8gdGhlIFJUU1Agc2VydmVyIGFuZCBzZXQgdXAgdGhlIGluZGl2aWR1YWwgbWVkaWEgc3RyZWFtcy4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGJvdGggbXV4ZXJzIGFuZCBkZW11eGVycy4KKyAqCisgKiBAcGFyYW0gcyBSVFNQIChkZSltdXhlciBjb250ZXh0CisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDwgMCBvbiBlcnJvci4gQ2xlYW5zIHVwIGFsbCBhbGxvY2F0aW9ucyBkb25lCisgKiAgICAgICAgICB3aXRoaW4gdGhlIGZ1bmN0aW9uIG9uIGVycm9yLgorICovCitpbnQgZmZfcnRzcF9jb25uZWN0KEFWRm9ybWF0Q29udGV4dCAqcyk7CisKKy8qKgorICogQ2xvc2UgYW5kIGZyZWUgYWxsIHN0cmVhbXMgd2l0aGluIHRoZSBSVFNQIChkZSltdXhlcgorICoKKyAqIEBwYXJhbSBzIFJUU1AgKGRlKW11eGVyIGNvbnRleHQKKyAqLwordm9pZCBmZl9ydHNwX2Nsb3NlX3N0cmVhbXMoQVZGb3JtYXRDb250ZXh0ICpzKTsKKworLyoqCisgKiBDbG9zZSBhbGwgY29ubmVjdGlvbiBoYW5kbGVzIHdpdGhpbiB0aGUgUlRTUCAoZGUpbXV4ZXIKKyAqCisgKiBAcGFyYW0gcyBSVFNQIChkZSltdXhlciBjb250ZXh0CisgKi8KK3ZvaWQgZmZfcnRzcF9jbG9zZV9jb25uZWN0aW9ucyhBVkZvcm1hdENvbnRleHQgKnMpOworCisvKioKKyAqIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHN0cmVhbSBhbmQgc2V0IHVwIHRoZSBSVFNQU3RyZWFtIGNoaWxkCisgKiBvYmplY3RzLgorICovCitpbnQgZmZfcnRzcF9zZXR1cF9pbnB1dF9zdHJlYW1zKEFWRm9ybWF0Q29udGV4dCAqcywgUlRTUE1lc3NhZ2VIZWFkZXIgKnJlcGx5KTsKKworLyoqCisgKiBBbm5vdW5jZSB0aGUgc3RyZWFtIHRvIHRoZSBzZXJ2ZXIgYW5kIHNldCB1cCB0aGUgUlRTUFN0cmVhbSBjaGlsZAorICogb2JqZWN0cyBmb3IgZWFjaCBtZWRpYSBzdHJlYW0uCisgKi8KK2ludCBmZl9ydHNwX3NldHVwX291dHB1dF9zdHJlYW1zKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqYWRkcik7CisKKy8qKgorICogUGFyc2UgUlRTUCBjb21tYW5kcyAoT1BUSU9OUywgUEFVU0UgYW5kIFRFQVJET1dOKSBkdXJpbmcgc3RyZWFtaW5nIGluCisgKiBsaXN0ZW4gbW9kZS4KKyAqLworaW50IGZmX3J0c3BfcGFyc2Vfc3RyZWFtaW5nX2NvbW1hbmRzKEFWRm9ybWF0Q29udGV4dCAqcyk7CisKKy8qKgorICogUGFyc2UgYW4gU0RQIGRlc2NyaXB0aW9uIG9mIHN0cmVhbXMgYnkgcG9wdWxhdGluZyBhbiBSVFNQU3RhdGUgc3RydWN0CisgKiB3aXRoaW4gdGhlIEFWRm9ybWF0Q29udGV4dDsgYWxzbyBhbGxvY2F0ZSB0aGUgUlRQIHN0cmVhbXMgYW5kIHRoZQorICogcG9sbGZkIGFycmF5IHVzZWQgZm9yIFVEUCBzdHJlYW1zLgorICovCitpbnQgZmZfc2RwX3BhcnNlKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqY29udGVudCk7CisKKy8qKgorICogUmVjZWl2ZSBvbmUgUlRQIHBhY2tldCBmcm9tIGFuIFRDUCBpbnRlcmxlYXZlZCBSVFNQIHN0cmVhbS4KKyAqLworaW50IGZmX3J0c3BfdGNwX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgUlRTUFN0cmVhbSAqKnBydHNwX3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKTsKKworLyoqCisgKiBTZW5kIGJ1ZmZlcmVkIHBhY2tldHMgb3ZlciBUQ1AuCisgKi8KK2ludCBmZl9ydHNwX3RjcF93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBSVFNQU3RyZWFtICpydHNwX3N0KTsKKworLyoqCisgKiBSZWNlaXZlIG9uZSBwYWNrZXQgZnJvbSB0aGUgUlRTUFN0cmVhbXMgc2V0IHVwIGluIHRoZSBBVkZvcm1hdENvbnRleHQKKyAqICh3aGljaCBzaG91bGQgY29udGFpbiBhIFJUU1BTdGF0ZSBzdHJ1Y3QgYXMgcHJpdl9kYXRhKS4KKyAqLworaW50IGZmX3J0c3BfZmV0Y2hfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCk7CisKKy8qKgorICogRG8gdGhlIFNFVFVQIHJlcXVlc3RzIGZvciBlYWNoIHN0cmVhbSBmb3IgdGhlIGNob3NlbgorICogbG93ZXIgdHJhbnNwb3J0IG1vZGUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IsIDEgaWYgcHJvdG9jb2wgaXMgdW5hdmFpbGFibGUKKyAqLworaW50IGZmX3J0c3BfbWFrZV9zZXR1cF9yZXF1ZXN0KEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd2VyX3RyYW5zcG9ydCwgY29uc3QgY2hhciAqcmVhbF9jaGFsbGVuZ2UpOworCisvKioKKyAqIFVuZG8gdGhlIGVmZmVjdCBvZiBmZl9ydHNwX21ha2Vfc2V0dXBfcmVxdWVzdCwgY2xvc2UgdGhlCisgKiB0cmFuc3BvcnRfcHJpdiBhbmQgcnRwX2hhbmRsZSBmaWVsZHMuCisgKi8KK3ZvaWQgZmZfcnRzcF91bmRvX3NldHVwKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHNlbmRfcGFja2V0cyk7CisKKy8qKgorICogT3BlbiBSVFNQIHRyYW5zcG9ydCBjb250ZXh0LgorICovCitpbnQgZmZfcnRzcF9vcGVuX3RyYW5zcG9ydF9jdHgoQVZGb3JtYXRDb250ZXh0ICpzLCBSVFNQU3RyZWFtICpydHNwX3N0KTsKKworZXh0ZXJuIGNvbnN0IEFWT3B0aW9uIGZmX3J0c3Bfb3B0aW9uc1tdOworCisjZW5kaWYgLyogQVZGT1JNQVRfUlRTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvcnRzcGNvZGVzLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRzcGNvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlNDkwYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHNwY29kZXMuaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIFJUU1AgZGVmaW5pdGlvbnMKKyAqIGNvcHlyaWdodCAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqIGNvcHlyaWdodCAoYykgMjAxNCBTYW1zdW5nIEVsZWN0cm9uaWNzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICAgIEBBdXRob3I6IFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BzaXNhLnNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1JUU1BDT0RFU19ICisjZGVmaW5lIEFWRk9STUFUX1JUU1BDT0RFU19ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaHR0cC5oIgorCisvKiogUlRTUCBoYW5kbGluZyAqLworZW51bSBSVFNQU3RhdHVzQ29kZSB7CitSVFNQX1NUQVRVU19DT05USU5VRSAgICAgICAgICAgICA9MTAwLAorUlRTUF9TVEFUVVNfT0sgICAgICAgICAgICAgICAgICAgPTIwMCwKK1JUU1BfU1RBVFVTX0NSRUFURUQgICAgICAgICAgICAgID0yMDEsCitSVFNQX1NUQVRVU19MT1dfT05fU1RPUkFHRV9TUEFDRSA9MjUwLAorUlRTUF9TVEFUVVNfTVVMVElQTEVfQ0hPSUNFUyAgICAgPTMwMCwKK1JUU1BfU1RBVFVTX01PVkVEX1BFUk1BTkVOVExZICAgID0zMDEsCitSVFNQX1NUQVRVU19NT1ZFRF9URU1QT1JBUklMWSAgICA9MzAyLAorUlRTUF9TVEFUVVNfU0VFX09USEVSICAgICAgICAgICAgPTMwMywKK1JUU1BfU1RBVFVTX05PVF9NT0RJRklFRCAgICAgICAgID0zMDQsCitSVFNQX1NUQVRVU19VU0VfUFJPWFkgICAgICAgICAgICA9MzA1LAorUlRTUF9TVEFUVVNfQkFEX1JFUVVFU1QgICAgICAgICAgPTQwMCwKK1JUU1BfU1RBVFVTX1VOQVVUSE9SSVpFRCAgICAgICAgID00MDEsCitSVFNQX1NUQVRVU19QQVlNRU5UX1JFUVVJUkVEICAgICA9NDAyLAorUlRTUF9TVEFUVVNfRk9SQklEREVOICAgICAgICAgICAgPTQwMywKK1JUU1BfU1RBVFVTX05PVF9GT1VORCAgICAgICAgICAgID00MDQsCitSVFNQX1NUQVRVU19NRVRIT0QgICAgICAgICAgICAgICA9NDA1LAorUlRTUF9TVEFUVVNfTk9UX0FDQ0VQVEFCTEUgICAgICAgPTQwNiwKK1JUU1BfU1RBVFVTX1BST1hZX0FVVEhfUkVRVUlSRUQgID00MDcsCitSVFNQX1NUQVRVU19SRVFfVElNRV9PVVQgICAgICAgICA9NDA4LAorUlRTUF9TVEFUVVNfR09ORSAgICAgICAgICAgICAgICAgPTQxMCwKK1JUU1BfU1RBVFVTX0xFTkdUSF9SRVFVSVJFRCAgICAgID00MTEsCitSVFNQX1NUQVRVU19QUkVDT05ESVRJT05fRkFJTEVEICA9NDEyLAorUlRTUF9TVEFUVVNfUkVRX0VOVElUWV8yTEFSR0UgICAgPTQxMywKK1JUU1BfU1RBVFVTX1JFUV9VUklfMkxBUkdFICAgICAgID00MTQsCitSVFNQX1NUQVRVU19VTlNVUFBPUlRFRF9NVFlQRSAgICA9NDE1LAorUlRTUF9TVEFUVVNfUEFSQU1fTk9UX1VOREVSU1RPT0QgPTQ1MSwKK1JUU1BfU1RBVFVTX0NPTkZFUkVOQ0VfTk9UX0ZPVU5EID00NTIsCitSVFNQX1NUQVRVU19CQU5EV0lEVEggICAgICAgICAgICA9NDUzLAorUlRTUF9TVEFUVVNfU0VTU0lPTiAgICAgICAgICAgICAgPTQ1NCwKK1JUU1BfU1RBVFVTX1NUQVRFICAgICAgICAgICAgICAgID00NTUsCitSVFNQX1NUQVRVU19JTlZBTElEX0hFQURFUl9GSUVMRCA9NDU2LAorUlRTUF9TVEFUVVNfSU5WQUxJRF9SQU5HRSAgICAgICAgPTQ1NywKK1JUU1BfU1RBVFVTX1JPTkxZX1BBUkFNRVRFUiAgICAgID00NTgsCitSVFNQX1NUQVRVU19BR0dSRUdBVEUgICAgICAgICAgICA9NDU5LAorUlRTUF9TVEFUVVNfT05MWV9BR0dSRUdBVEUgICAgICAgPTQ2MCwKK1JUU1BfU1RBVFVTX1RSQU5TUE9SVCAgICAgICAgICAgID00NjEsCitSVFNQX1NUQVRVU19VTlJFQUNIQUJMRSAgICAgICAgICA9NDYyLAorUlRTUF9TVEFUVVNfSU5URVJOQUwgICAgICAgICAgICAgPTUwMCwKK1JUU1BfU1RBVFVTX05PVF9JTVBMRU1FTlRFRCAgICAgID01MDEsCitSVFNQX1NUQVRVU19CQURfR0FURVdBWSAgICAgICAgICA9NTAyLAorUlRTUF9TVEFUVVNfU0VSVklDRSAgICAgICAgICAgICAgPTUwMywKK1JUU1BfU1RBVFVTX0dBVEVXQVlfVElNRV9PVVQgICAgID01MDQsCitSVFNQX1NUQVRVU19WRVJTSU9OICAgICAgICAgICAgICA9NTA1LAorUlRTUF9TVEFUVVNfVU5TVVBQT1JURURfT1BUSU9OICAgPTU1MSwKK307CisKK3N0YXRpYyBjb25zdCBhdl91bnVzZWQgY2hhciAqIGNvbnN0IHJ0c3Bfc3RhdHVzX3N0cmluZ3NbXSA9IHsKK1tSVFNQX1NUQVRVU19DT05USU5VRV0gICAgICAgICAgICAgICA9IkNvbnRpbnVlIiwKK1tSVFNQX1NUQVRVU19PS10gICAgICAgICAgICAgICAgICAgICA9Ik9LIiwKK1tSVFNQX1NUQVRVU19DUkVBVEVEXSAgICAgICAgICAgICAgICA9IkNyZWF0ZWQiLAorW1JUU1BfU1RBVFVTX0xPV19PTl9TVE9SQUdFX1NQQUNFXSAgID0iTG93IG9uIFN0b3JhZ2UgU3BhY2UiLAorW1JUU1BfU1RBVFVTX01VTFRJUExFX0NIT0lDRVNdICAgICAgID0iTXVsdGlwbGUgQ2hvaWNlcyIsCitbUlRTUF9TVEFUVVNfTU9WRURfUEVSTUFORU5UTFldICAgICAgPSJNb3ZlZCBQZXJtYW5lbnRseSIsCitbUlRTUF9TVEFUVVNfTU9WRURfVEVNUE9SQVJJTFldICAgICAgPSJNb3ZlZCBUZW1wb3JhcmlseSIsCitbUlRTUF9TVEFUVVNfU0VFX09USEVSXSAgICAgICAgICAgICAgPSJTZWUgT3RoZXIiLAorW1JUU1BfU1RBVFVTX05PVF9NT0RJRklFRF0gICAgICAgICAgID0iTm90IE1vZGlmaWVkIiwKK1tSVFNQX1NUQVRVU19VU0VfUFJPWFldICAgICAgICAgICAgICA9IlVzZSBQcm94eSIsCitbUlRTUF9TVEFUVVNfQkFEX1JFUVVFU1RdICAgICAgICAgICAgPSJCYWQgUmVxdWVzdCIsCitbUlRTUF9TVEFUVVNfVU5BVVRIT1JJWkVEXSAgICAgICAgICAgPSJVbmF1dGhvcml6ZWQiLAorW1JUU1BfU1RBVFVTX1BBWU1FTlRfUkVRVUlSRURdICAgICAgID0iUGF5bWVudCBSZXF1aXJlZCIsCitbUlRTUF9TVEFUVVNfRk9SQklEREVOXSAgICAgICAgICAgICAgPSJGb3JiaWRkZW4iLAorW1JUU1BfU1RBVFVTX05PVF9GT1VORF0gICAgICAgICAgICAgID0iTm90IEZvdW5kIiwKK1tSVFNQX1NUQVRVU19NRVRIT0RdICAgICAgICAgICAgICAgICA9Ik1ldGhvZCBOb3QgQWxsb3dlZCIsCitbUlRTUF9TVEFUVVNfTk9UX0FDQ0VQVEFCTEVdICAgICAgICAgPSJOb3QgQWNjZXB0YWJsZSIsCitbUlRTUF9TVEFUVVNfUFJPWFlfQVVUSF9SRVFVSVJFRF0gICAgPSJQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCIsCitbUlRTUF9TVEFUVVNfUkVRX1RJTUVfT1VUXSAgICAgICAgICAgPSJSZXF1ZXN0IFRpbWUtb3V0IiwKK1tSVFNQX1NUQVRVU19HT05FXSAgICAgICAgICAgICAgICAgICA9IkdvbmUiLAorW1JUU1BfU1RBVFVTX0xFTkdUSF9SRVFVSVJFRF0gICAgICAgID0iTGVuZ3RoIFJlcXVpcmVkIiwKK1tSVFNQX1NUQVRVU19QUkVDT05ESVRJT05fRkFJTEVEXSAgICA9IlByZWNvbmRpdGlvbiBGYWlsZWQiLAorW1JUU1BfU1RBVFVTX1JFUV9FTlRJVFlfMkxBUkdFXSAgICAgID0iUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlIiwKK1tSVFNQX1NUQVRVU19SRVFfVVJJXzJMQVJHRV0gICAgICAgICA9IlJlcXVlc3QgVVJJIFRvbyBMYXJnZSIsCitbUlRTUF9TVEFUVVNfVU5TVVBQT1JURURfTVRZUEVdICAgICAgPSJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlIiwKK1tSVFNQX1NUQVRVU19QQVJBTV9OT1RfVU5ERVJTVE9PRF0gICA9IlBhcmFtZXRlciBOb3QgVW5kZXJzdG9vZCIsCitbUlRTUF9TVEFUVVNfQ09ORkVSRU5DRV9OT1RfRk9VTkRdICAgPSJDb25mZXJlbmNlIE5vdCBGb3VuZCIsCitbUlRTUF9TVEFUVVNfQkFORFdJRFRIXSAgICAgICAgICAgICAgPSJOb3QgRW5vdWdoIEJhbmR3aWR0aCIsCitbUlRTUF9TVEFUVVNfU0VTU0lPTl0gICAgICAgICAgICAgICAgPSJTZXNzaW9uIE5vdCBGb3VuZCIsCitbUlRTUF9TVEFUVVNfU1RBVEVdICAgICAgICAgICAgICAgICAgPSJNZXRob2QgTm90IFZhbGlkIGluIFRoaXMgU3RhdGUiLAorW1JUU1BfU1RBVFVTX0lOVkFMSURfSEVBREVSX0ZJRUxEXSAgID0iSGVhZGVyIEZpZWxkIE5vdCBWYWxpZCBmb3IgUmVzb3VyY2UiLAorW1JUU1BfU1RBVFVTX0lOVkFMSURfUkFOR0VdICAgICAgICAgID0iSW52YWxpZCBSYW5nZSIsCitbUlRTUF9TVEFUVVNfUk9OTFlfUEFSQU1FVEVSXSAgICAgICAgPSJQYXJhbWV0ZXIgSXMgUmVhZC1Pbmx5IiwKK1tSVFNQX1NUQVRVU19BR0dSRUdBVEVdICAgICAgICAgICAgICA9IkFnZ3JlZ2F0ZSBPcGVyYXRpb24gbm8gQWxsb3dlZCIsCitbUlRTUF9TVEFUVVNfT05MWV9BR0dSRUdBVEVdICAgICAgICAgPSJPbmx5IEFnZ3JlZ2F0ZSBPcGVyYXRpb24gQWxsb3dlZCIsCitbUlRTUF9TVEFUVVNfVFJBTlNQT1JUXSAgICAgICAgICAgICAgPSJVbnN1cHBvcnRlZCBUcmFuc3BvcnQiLAorW1JUU1BfU1RBVFVTX1VOUkVBQ0hBQkxFXSAgICAgICAgICAgID0iRGVzdGluYXRpb24gVW5yZWFjaGFibGUiLAorW1JUU1BfU1RBVFVTX0lOVEVSTkFMXSAgICAgICAgICAgICAgID0iSW50ZXJuYWwgU2VydmVyIEVycm9yIiwKK1tSVFNQX1NUQVRVU19OT1RfSU1QTEVNRU5URURdICAgICAgICA9Ik5vdCBJbXBsZW1lbnRlZCIsCitbUlRTUF9TVEFUVVNfQkFEX0dBVEVXQVldICAgICAgICAgICAgPSJCYWQgR2F0ZXdheSIsCitbUlRTUF9TVEFUVVNfU0VSVklDRV0gICAgICAgICAgICAgICAgPSJTZXJ2aWNlIFVuYXZhaWxhYmxlIiwKK1tSVFNQX1NUQVRVU19HQVRFV0FZX1RJTUVfT1VUXSAgICAgICA9IkdhdGV3YXkgVGltZS1vdXQiLAorW1JUU1BfU1RBVFVTX1ZFUlNJT05dICAgICAgICAgICAgICAgID0iUlRTUCBWZXJzaW9uIG5vdCBTdXBwb3J0ZWQiLAorW1JUU1BfU1RBVFVTX1VOU1VQUE9SVEVEX09QVElPTl0gICAgID0iT3B0aW9uIG5vdCBzdXBwb3J0ZWQiLAorfTsKKworI2RlZmluZSBSVFNQX1NUQVRVU19DT0RFMlNUUklORyh4KSAoXAoreCA+PSAxMDAgJiYgeCA8IEZGX0FSUkFZX0VMRU1TKHJ0c3Bfc3RhdHVzX3N0cmluZ3MpICYmIHJ0c3Bfc3RhdHVzX3N0cmluZ3NbeF0gXAorKT8gcnRzcF9zdGF0dXNfc3RyaW5nc1t4XSA6IE5VTEwKKworZW51bSBSVFNQTWV0aG9kIHsKKyAgICBERVNDUklCRSwKKyAgICBBTk5PVU5DRSwKKyAgICBPUFRJT05TLAorICAgIFNFVFVQLAorICAgIFBMQVksCisgICAgUEFVU0UsCisgICAgVEVBUkRPV04sCisgICAgR0VUX1BBUkFNRVRFUiwKKyAgICBTRVRfUEFSQU1FVEVSLAorICAgIFJFRElSRUNULAorICAgIFJFQ09SRCwKKyAgICBVTktOT1dOID0gLTEsCit9OworCitzdGF0aWMgaW5saW5lIGludCBmZl9ydHNwX2F2ZXJyb3IoZW51bSBSVFNQU3RhdHVzQ29kZSBzdGF0dXNfY29kZSwgaW50IGRlZmF1bHRfYXZlcnJvcikKK3sKKyAgICByZXR1cm4gZmZfaHR0cF9hdmVycm9yKHN0YXR1c19jb2RlLCBkZWZhdWx0X2F2ZXJyb3IpOworfQorCisjZW5kaWYgLyogQVZGT1JNQVRfUlRTUENPREVTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHNwZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRzcGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzM4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvcnRzcGRlYy5jCkBAIC0wLDAgKzEsOTU2IEBACisvKgorICogUlRTUCBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhbmRvbV9zZWVkLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAib3Nfc3VwcG9ydC5oIgorI2luY2x1ZGUgInJ0cHByb3RvLmgiCisjaW5jbHVkZSAicnRzcC5oIgorI2luY2x1ZGUgInJkdC5oIgorI2luY2x1ZGUgInVybC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IFJUU1BTdGF0dXNNZXNzYWdlIHsKKyAgICBlbnVtIFJUU1BTdGF0dXNDb2RlIGNvZGU7CisgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKK30gc3RhdHVzX21lc3NhZ2VzW10gPSB7CisgICAgeyBSVFNQX1NUQVRVU19PSywgICAgICAgICAgICAgIk9LIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgUlRTUF9TVEFUVVNfTUVUSE9ELCAgICAgICAgICJNZXRob2QgTm90IEFsbG93ZWQiICAgICAgICAgICAgICAgfSwKKyAgICB7IFJUU1BfU1RBVFVTX0JBTkRXSURUSCwgICAgICAiTm90IEVub3VnaCBCYW5kd2lkdGgiICAgICAgICAgICAgIH0sCisgICAgeyBSVFNQX1NUQVRVU19TRVNTSU9OLCAgICAgICAgIlNlc3Npb24gTm90IEZvdW5kIiAgICAgICAgICAgICAgICB9LAorICAgIHsgUlRTUF9TVEFUVVNfU1RBVEUsICAgICAgICAgICJNZXRob2QgTm90IFZhbGlkIGluIFRoaXMgU3RhdGUiICAgfSwKKyAgICB7IFJUU1BfU1RBVFVTX0FHR1JFR0FURSwgICAgICAiQWdncmVnYXRlIG9wZXJhdGlvbiBub3QgYWxsb3dlZCIgIH0sCisgICAgeyBSVFNQX1NUQVRVU19PTkxZX0FHR1JFR0FURSwgIk9ubHkgYWdncmVnYXRlIG9wZXJhdGlvbiBhbGxvd2VkIiB9LAorICAgIHsgUlRTUF9TVEFUVVNfVFJBTlNQT1JULCAgICAgICJVbnN1cHBvcnRlZCB0cmFuc3BvcnQiICAgICAgICAgICAgfSwKKyAgICB7IFJUU1BfU1RBVFVTX0lOVEVSTkFMLCAgICAgICAiSW50ZXJuYWwgU2VydmVyIEVycm9yIiAgICAgICAgICAgIH0sCisgICAgeyBSVFNQX1NUQVRVU19TRVJWSUNFLCAgICAgICAgIlNlcnZpY2UgVW5hdmFpbGFibGUiICAgICAgICAgICAgICB9LAorICAgIHsgUlRTUF9TVEFUVVNfVkVSU0lPTiwgICAgICAgICJSVFNQIFZlcnNpb24gbm90IHN1cHBvcnRlZCIgICAgICAgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KK307CisKK3N0YXRpYyBpbnQgcnRzcF9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKCEocnQtPnJ0c3BfZmxhZ3MgJiBSVFNQX0ZMQUdfTElTVEVOKSkKKyAgICAgICAgZmZfcnRzcF9zZW5kX2NtZF9hc3luYyhzLCAiVEVBUkRPV04iLCBydC0+Y29udHJvbF91cmksIE5VTEwpOworCisgICAgZmZfcnRzcF9jbG9zZV9zdHJlYW1zKHMpOworICAgIGZmX3J0c3BfY2xvc2VfY29ubmVjdGlvbnMocyk7CisgICAgZmZfbmV0d29ya19jbG9zZSgpOworICAgIHJ0LT5yZWFsX3NldHVwID0gTlVMTDsKKyAgICBhdl9mcmVlcCgmcnQtPnJlYWxfc2V0dXBfY2FjaGUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCByZWFkX2xpbmUoQVZGb3JtYXRDb250ZXh0ICpzLCBjaGFyICpyYnVmLCBjb25zdCBpbnQgcmJ1ZnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyYnVmbGVuKQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGlkeCAgICAgICA9IDA7CisgICAgaW50IHJldCAgICAgICA9IDA7CisgICAgKnJidWZsZW4gICAgICA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIHJldCA9IGZmdXJsX3JlYWRfY29tcGxldGUocnQtPnJ0c3BfaGQsIHJidWYgKyBpZHgsIDEpOworICAgICAgICBpZiAocmV0IDw9IDApCisgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogQVZFUlJPUl9FT0Y7CisgICAgICAgIGlmIChyYnVmW2lkeF0gPT0gJ1xyJykgeworICAgICAgICAgICAgLyogSWdub3JlICovCisgICAgICAgIH0gZWxzZSBpZiAocmJ1ZltpZHhdID09ICdcbicpIHsKKyAgICAgICAgICAgIHJidWZbaWR4XSA9ICdcMCc7CisgICAgICAgICAgICAqcmJ1ZmxlbiAgPSBpZHg7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpZHgrKzsKKyAgICB9IHdoaWxlIChpZHggPCByYnVmc2l6ZSk7CisgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk1lc3NhZ2UgdG9vIGxvbmdcbiIpOworICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Cit9CisKK3N0YXRpYyBpbnQgcnRzcF9zZW5kX3JlcGx5KEFWRm9ybWF0Q29udGV4dCAqcywgZW51bSBSVFNQU3RhdHVzQ29kZSBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXh0cmFjb250ZW50LCB1aW50MTZfdCBzZXEpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBjaGFyIG1lc3NhZ2VbNDA5Nl07CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZSAoc3RhdHVzX21lc3NhZ2VzW2luZGV4XS5jb2RlKSB7CisgICAgICAgIGlmIChzdGF0dXNfbWVzc2FnZXNbaW5kZXhdLmNvZGUgPT0gY29kZSkgeworICAgICAgICAgICAgc25wcmludGYobWVzc2FnZSwgc2l6ZW9mKG1lc3NhZ2UpLCAiUlRTUC8xLjAgJWQgJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGNvZGUsIHN0YXR1c19tZXNzYWdlc1tpbmRleF0ubWVzc2FnZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbmRleCsrOworICAgIH0KKyAgICBpZiAoIXN0YXR1c19tZXNzYWdlc1tpbmRleF0uY29kZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBhdl9zdHJsY2F0ZihtZXNzYWdlLCBzaXplb2YobWVzc2FnZSksICJDU2VxOiAlZFxyXG4iLCBzZXEpOworICAgIGF2X3N0cmxjYXRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSwgIlNlcnZlcjogJXNcclxuIiwgTElCQVZGT1JNQVRfSURFTlQpOworICAgIGlmIChleHRyYWNvbnRlbnQpCisgICAgICAgIGF2X3N0cmxjYXQobWVzc2FnZSwgZXh0cmFjb250ZW50LCBzaXplb2YobWVzc2FnZSkpOworICAgIGF2X3N0cmxjYXQobWVzc2FnZSwgIlxyXG4iLCBzaXplb2YobWVzc2FnZSkpOworICAgIGF2X2Rsb2cocywgIlNlbmRpbmcgcmVzcG9uc2U6XG4lcyIsIG1lc3NhZ2UpOworICAgIGZmdXJsX3dyaXRlKHJ0LT5ydHNwX2hkLCBtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3Nlc3Npb25pZChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRTUE1lc3NhZ2VIZWFkZXIgKnJlcXVlc3QpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpzZXNzaW9uX2lkID0gcnQtPnNlc3Npb25faWQ7CisgICAgaWYgKCFzZXNzaW9uX2lkWzBdKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlRoZXJlIGlzIG5vIHNlc3Npb24taWQgYXQgdGhlIG1vbWVudFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoc3RyY21wKHNlc3Npb25faWQsIHJlcXVlc3QtPnNlc3Npb25faWQpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmV4cGVjdGVkIHNlc3Npb24taWQgJXNcbiIsCisgICAgICAgICAgICAgICByZXF1ZXN0LT5zZXNzaW9uX2lkKTsKKyAgICAgICAgcnRzcF9zZW5kX3JlcGx5KHMsIFJUU1BfU1RBVFVTX1NFU1NJT04sIE5VTEwsIHJlcXVlc3QtPnNlcSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1NUUkVBTV9OT1RfRk9VTkQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBydHNwX3JlYWRfcmVxdWVzdChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFNQTWVzc2FnZUhlYWRlciAqcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCkKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgcmJ1ZlsxMDI0XTsKKyAgICBpbnQgcmJ1ZmxlbiwgcmV0OworICAgIGRvIHsKKyAgICAgICAgcmV0ID0gcmVhZF9saW5lKHMsIHJidWYsIHNpemVvZihyYnVmKSwgJnJidWZsZW4pOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHJidWZsZW4gPiAxKSB7CisgICAgICAgICAgICBhdl9kbG9nKHMsICJQYXJzaW5nWyVkXTogJXNcbiIsIHJidWZsZW4sIHJidWYpOworICAgICAgICAgICAgZmZfcnRzcF9wYXJzZV9saW5lKHJlcXVlc3QsIHJidWYsIHJ0LCBtZXRob2QpOworICAgICAgICB9CisgICAgfSB3aGlsZSAocmJ1ZmxlbiA+IDApOworICAgIGlmIChyZXF1ZXN0LT5zZXEgIT0gcnQtPnNlcSArIDEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuZXhwZWN0ZWQgU2VxdWVuY2UgbnVtYmVyICVkXG4iLAorICAgICAgICAgICAgICAgcmVxdWVzdC0+c2VxKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKHJ0LT5zZXNzaW9uX2lkWzBdICYmIHN0cmNtcChtZXRob2QsICJPUFRJT05TIikpIHsKKyAgICAgICAgcmV0ID0gY2hlY2tfc2Vzc2lvbmlkKHMsIHJlcXVlc3QpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydHNwX3JlYWRfYW5ub3VuY2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFJUU1BTdGF0ZSAqcnQgICAgICAgICAgICAgPSBzLT5wcml2X2RhdGE7CisgICAgUlRTUE1lc3NhZ2VIZWFkZXIgcmVxdWVzdCA9IHsgMCB9OworICAgIGNoYXIgc2RwWzQwOTZdOworICAgIGludCAgcmV0OworCisgICAgcmV0ID0gcnRzcF9yZWFkX3JlcXVlc3QocywgJnJlcXVlc3QsICJBTk5PVU5DRSIpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcnQtPnNlcSsrOworICAgIGlmIChzdHJjbXAocmVxdWVzdC5jb250ZW50X3R5cGUsICJhcHBsaWNhdGlvbi9zZHAiKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5leHBlY3RlZCBjb250ZW50IHR5cGUgJXNcbiIsCisgICAgICAgICAgICAgICByZXF1ZXN0LmNvbnRlbnRfdHlwZSk7CisgICAgICAgIHJ0c3Bfc2VuZF9yZXBseShzLCBSVFNQX1NUQVRVU19TRVJWSUNFLCBOVUxMLCByZXF1ZXN0LnNlcSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7CisgICAgfQorICAgIGlmIChyZXF1ZXN0LmNvbnRlbnRfbGVuZ3RoICYmIHJlcXVlc3QuY29udGVudF9sZW5ndGggPCBzaXplb2Yoc2RwKSAtIDEpIHsKKyAgICAgICAgLyogUmVhZCBTRFAgKi8KKyAgICAgICAgaWYgKGZmdXJsX3JlYWRfY29tcGxldGUocnQtPnJ0c3BfaGQsIHNkcCwgcmVxdWVzdC5jb250ZW50X2xlbmd0aCkKKyAgICAgICAgICAgIDwgcmVxdWVzdC5jb250ZW50X2xlbmd0aCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBjb21wbGV0ZSBTRFAgRGVzY3JpcHRpb24gaW4gQU5OT1VOQ0VcbiIpOworICAgICAgICAgICAgcnRzcF9zZW5kX3JlcGx5KHMsIFJUU1BfU1RBVFVTX0lOVEVSTkFMLCBOVUxMLCByZXF1ZXN0LnNlcSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9CisgICAgICAgIHNkcFtyZXF1ZXN0LmNvbnRlbnRfbGVuZ3RoXSA9ICdcMCc7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgIlNEUDogJXNcbiIsIHNkcCk7CisgICAgICAgIHJldCA9IGZmX3NkcF9wYXJzZShzLCBzZHApOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcnRzcF9zZW5kX3JlcGx5KHMsIFJUU1BfU1RBVFVTX09LLCBOVUxMLCByZXF1ZXN0LnNlcSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAiQ29udGVudC1MZW5ndGggaGVhZGVyIHZhbHVlIGV4Y2VlZHMgc2RwIGFsbG9jYXRlZCBidWZmZXIgKDRLQilcbiIpOworICAgIHJ0c3Bfc2VuZF9yZXBseShzLCBSVFNQX1NUQVRVU19JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoIGV4Y2VlZHMgYnVmZmVyIHNpemUiLCByZXF1ZXN0LnNlcSk7CisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworc3RhdGljIGludCBydHNwX3JlYWRfb3B0aW9ucyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUlRTUFN0YXRlICpydCAgICAgICAgICAgICA9IHMtPnByaXZfZGF0YTsKKyAgICBSVFNQTWVzc2FnZUhlYWRlciByZXF1ZXN0ID0geyAwIH07CisgICAgaW50IHJldCAgICAgICAgICAgICAgICAgICA9IDA7CisKKyAgICAvKiBQYXJzaW5nIGhlYWRlcnMgKi8KKyAgICByZXQgPSBydHNwX3JlYWRfcmVxdWVzdChzLCAmcmVxdWVzdCwgIk9QVElPTlMiKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJ0LT5zZXErKzsKKyAgICAvKiBTZW5kIFJlcGx5ICovCisgICAgcnRzcF9zZW5kX3JlcGx5KHMsIFJUU1BfU1RBVFVTX09LLAorICAgICAgICAgICAgICAgICAgICAiUHVibGljOiBBTk5PVU5DRSwgUEFVU0UsIFNFVFVQLCBURUFSRE9XTiwgUkVDT1JEXHJcbiIsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VxKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydHNwX3JlYWRfc2V0dXAoQVZGb3JtYXRDb250ZXh0ICpzLCBjaGFyKiBob3N0LCBjaGFyICpjb250cm9sdXJsKQoreworICAgIFJUU1BTdGF0ZSAqcnQgICAgICAgICAgICAgPSBzLT5wcml2X2RhdGE7CisgICAgUlRTUE1lc3NhZ2VIZWFkZXIgcmVxdWVzdCA9IHsgMCB9OworICAgIGludCByZXQgICAgICAgICAgICAgICAgICAgPSAwOworICAgIGNoYXIgdXJsWzEwMjRdOworICAgIFJUU1BTdHJlYW0gKnJ0c3Bfc3Q7CisgICAgY2hhciByZXNwb25zZWhlYWRlcnNbMTAyNF07CisgICAgaW50IGxvY2FscG9ydCAgICA9IC0xOworICAgIGludCB0cmFuc3BvcnRpZHggPSAwOworICAgIGludCBzdHJlYW1pZCAgICAgPSAwOworCisgICAgcmV0ID0gcnRzcF9yZWFkX3JlcXVlc3QocywgJnJlcXVlc3QsICJTRVRVUCIpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcnQtPnNlcSsrOworICAgIGlmICghcmVxdWVzdC5uYl90cmFuc3BvcnRzKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyB0cmFuc3BvcnQgZGVmaW5lZCBpbiBTRVRVUFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBmb3IgKHRyYW5zcG9ydGlkeCA9IDA7IHRyYW5zcG9ydGlkeCA8IHJlcXVlc3QubmJfdHJhbnNwb3J0czsKKyAgICAgICAgIHRyYW5zcG9ydGlkeCsrKSB7CisgICAgICAgIGlmICghcmVxdWVzdC50cmFuc3BvcnRzW3RyYW5zcG9ydGlkeF0ubW9kZV9yZWNvcmQgfHwKKyAgICAgICAgICAgIChyZXF1ZXN0LnRyYW5zcG9ydHNbdHJhbnNwb3J0aWR4XS5sb3dlcl90cmFuc3BvcnQgIT0KKyAgICAgICAgICAgICBSVFNQX0xPV0VSX1RSQU5TUE9SVF9VRFAgJiYKKyAgICAgICAgICAgICByZXF1ZXN0LnRyYW5zcG9ydHNbdHJhbnNwb3J0aWR4XS5sb3dlcl90cmFuc3BvcnQgIT0KKyAgICAgICAgICAgICBSVFNQX0xPV0VSX1RSQU5TUE9SVF9UQ1ApKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibW9kZT1yZWNvcmQvcmVjZWl2ZSBub3Qgc2V0IG9yIHRyYW5zcG9ydCIKKyAgICAgICAgICAgICAgICAgICAiIHByb3RvY29sIG5vdCBzdXBwb3J0ZWQgKHlldClcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlcXVlc3QubmJfdHJhbnNwb3J0cyA+IDEpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIk1vcmUgdGhhbiBvbmUgdHJhbnNwb3J0IG5vdCBzdXBwb3J0ZWQsICIKKyAgICAgICAgICAgICAgICJ1c2luZyBmaXJzdCBvZiBhbGxcbiIpOworICAgIGZvciAoc3RyZWFtaWQgPSAwOyBzdHJlYW1pZCA8IHJ0LT5uYl9ydHNwX3N0cmVhbXM7IHN0cmVhbWlkKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAocnQtPnJ0c3Bfc3RyZWFtc1tzdHJlYW1pZF0tPmNvbnRyb2xfdXJsLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sdXJsKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoc3RyZWFtaWQgPT0gcnQtPm5iX3J0c3Bfc3RyZWFtcykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGZpbmQgcmVxdWVzdGVkIHRyYWNrXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfU1RSRUFNX05PVF9GT1VORDsKKyAgICB9CisgICAgcnRzcF9zdCAgID0gcnQtPnJ0c3Bfc3RyZWFtc1tzdHJlYW1pZF07CisgICAgbG9jYWxwb3J0ID0gcnQtPnJ0cF9wb3J0X21pbjsKKworICAgIGlmIChyZXF1ZXN0LnRyYW5zcG9ydHNbMF0ubG93ZXJfdHJhbnNwb3J0ID09IFJUU1BfTE9XRVJfVFJBTlNQT1JUX1RDUCkgeworICAgICAgICBydC0+bG93ZXJfdHJhbnNwb3J0ID0gUlRTUF9MT1dFUl9UUkFOU1BPUlRfVENQOworICAgICAgICBpZiAoKHJldCA9IGZmX3J0c3Bfb3Blbl90cmFuc3BvcnRfY3R4KHMsIHJ0c3Bfc3QpKSkgeworICAgICAgICAgICAgcnRzcF9zZW5kX3JlcGx5KHMsIFJUU1BfU1RBVFVTX1RSQU5TUE9SVCwgTlVMTCwgcmVxdWVzdC5zZXEpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBydHNwX3N0LT5pbnRlcmxlYXZlZF9taW4gPSByZXF1ZXN0LnRyYW5zcG9ydHNbMF0uaW50ZXJsZWF2ZWRfbWluOworICAgICAgICBydHNwX3N0LT5pbnRlcmxlYXZlZF9tYXggPSByZXF1ZXN0LnRyYW5zcG9ydHNbMF0uaW50ZXJsZWF2ZWRfbWF4OworICAgICAgICBzbnByaW50ZihyZXNwb25zZWhlYWRlcnMsIHNpemVvZihyZXNwb25zZWhlYWRlcnMpLCAiVHJhbnNwb3J0OiAiCisgICAgICAgICAgICAgICAgICJSVFAvQVZQL1RDUDt1bmljYXN0O21vZGU9cmVjZWl2ZTtpbnRlcmxlYXZlZD0lZC0lZCIKKyAgICAgICAgICAgICAgICAgIlxyXG4iLCByZXF1ZXN0LnRyYW5zcG9ydHNbMF0uaW50ZXJsZWF2ZWRfbWluLAorICAgICAgICAgICAgICAgICByZXF1ZXN0LnRyYW5zcG9ydHNbMF0uaW50ZXJsZWF2ZWRfbWF4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBmZl91cmxfam9pbih1cmwsIHNpemVvZih1cmwpLCAicnRwIiwgTlVMTCwgaG9zdCwgbG9jYWxwb3J0LCBOVUxMKTsKKyAgICAgICAgICAgIGF2X2Rsb2cocywgIk9wZW5pbmc6ICVzIiwgdXJsKTsKKyAgICAgICAgICAgIHJldCA9IGZmdXJsX29wZW4oJnJ0c3Bfc3QtPnJ0cF9oYW5kbGUsIHVybCwgQVZJT19GTEFHX1JFQURfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICBsb2NhbHBvcnQgKz0gMjsKKyAgICAgICAgfSB3aGlsZSAocmV0IHx8IGxvY2FscG9ydCA+IHJ0LT5ydHBfcG9ydF9tYXgpOworICAgICAgICBpZiAobG9jYWxwb3J0ID4gcnQtPnJ0cF9wb3J0X21heCkgeworICAgICAgICAgICAgcnRzcF9zZW5kX3JlcGx5KHMsIFJUU1BfU1RBVFVTX1RSQU5TUE9SVCwgTlVMTCwgcmVxdWVzdC5zZXEpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2Rsb2cocywgIkxpc3RlbmluZyBvbjogJWQiLAorICAgICAgICAgICAgICAgIGZmX3J0cF9nZXRfbG9jYWxfcnRwX3BvcnQocnRzcF9zdC0+cnRwX2hhbmRsZSkpOworICAgICAgICBpZiAoKHJldCA9IGZmX3J0c3Bfb3Blbl90cmFuc3BvcnRfY3R4KHMsIHJ0c3Bfc3QpKSkgeworICAgICAgICAgICAgcnRzcF9zZW5kX3JlcGx5KHMsIFJUU1BfU1RBVFVTX1RSQU5TUE9SVCwgTlVMTCwgcmVxdWVzdC5zZXEpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FscG9ydCA9IGZmX3J0cF9nZXRfbG9jYWxfcnRwX3BvcnQocnRzcF9zdC0+cnRwX2hhbmRsZSk7CisgICAgICAgIHNucHJpbnRmKHJlc3BvbnNlaGVhZGVycywgc2l6ZW9mKHJlc3BvbnNlaGVhZGVycyksICJUcmFuc3BvcnQ6ICIKKyAgICAgICAgICAgICAgICAgIlJUUC9BVlAvVURQO3VuaWNhc3Q7bW9kZT1yZWNlaXZlO3NvdXJjZT0lczsiCisgICAgICAgICAgICAgICAgICJjbGllbnRfcG9ydD0lZC0lZDtzZXJ2ZXJfcG9ydD0lZC0lZFxyXG4iLAorICAgICAgICAgICAgICAgICBob3N0LCByZXF1ZXN0LnRyYW5zcG9ydHNbMF0uY2xpZW50X3BvcnRfbWluLAorICAgICAgICAgICAgICAgICByZXF1ZXN0LnRyYW5zcG9ydHNbMF0uY2xpZW50X3BvcnRfbWF4LCBsb2NhbHBvcnQsCisgICAgICAgICAgICAgICAgIGxvY2FscG9ydCArIDEpOworICAgIH0KKworICAgIC8qIEVzdGFibGlzaCBzZXNzaW9uaWQgaWYgbm90IHByZXZpb3VzbHkgc2V0ICovCisgICAgLyogUHV0IHRoaXMgaW4gYSBmdW5jdGlvbj8gKi8KKyAgICAvKiBSRkMgMjMyNjogc2Vzc2lvbiBpZCBtdXN0IGJlIGF0IGxlYXN0IDggZGlnaXRzICovCisgICAgd2hpbGUgKHN0cmxlbihydC0+c2Vzc2lvbl9pZCkgPCA4KQorICAgICAgICBhdl9zdHJsY2F0ZihydC0+c2Vzc2lvbl9pZCwgNTEyLCAiJXUiLCBhdl9nZXRfcmFuZG9tX3NlZWQoKSk7CisKKyAgICBhdl9zdHJsY2F0ZihyZXNwb25zZWhlYWRlcnMsIHNpemVvZihyZXNwb25zZWhlYWRlcnMpLCAiU2Vzc2lvbjogJXNcclxuIiwKKyAgICAgICAgICAgICAgICBydC0+c2Vzc2lvbl9pZCk7CisgICAgLyogU2VuZCBSZXBseSAqLworICAgIHJ0c3Bfc2VuZF9yZXBseShzLCBSVFNQX1NUQVRVU19PSywgcmVzcG9uc2VoZWFkZXJzLCByZXF1ZXN0LnNlcSk7CisKKyAgICBydC0+c3RhdGUgPSBSVFNQX1NUQVRFX1BBVVNFRDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydHNwX3JlYWRfcmVjb3JkKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ICAgICAgICAgICAgID0gcy0+cHJpdl9kYXRhOworICAgIFJUU1BNZXNzYWdlSGVhZGVyIHJlcXVlc3QgPSB7IDAgfTsKKyAgICBpbnQgcmV0ICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBjaGFyIHJlc3BvbnNlaGVhZGVyc1sxMDI0XTsKKworICAgIHJldCA9IHJ0c3BfcmVhZF9yZXF1ZXN0KHMsICZyZXF1ZXN0LCAiUkVDT1JEIik7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXQgPSBjaGVja19zZXNzaW9uaWQocywgJnJlcXVlc3QpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcnQtPnNlcSsrOworICAgIHNucHJpbnRmKHJlc3BvbnNlaGVhZGVycywgc2l6ZW9mKHJlc3BvbnNlaGVhZGVycyksICJTZXNzaW9uOiAlc1xyXG4iLAorICAgICAgICAgICAgIHJ0LT5zZXNzaW9uX2lkKTsKKyAgICBydHNwX3NlbmRfcmVwbHkocywgUlRTUF9TVEFUVVNfT0ssIHJlc3BvbnNlaGVhZGVycywgcmVxdWVzdC5zZXEpOworCisgICAgcnQtPnN0YXRlID0gUlRTUF9TVEFURV9TVFJFQU1JTkc7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBhcnNlX2NvbW1hbmRfbGluZShBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVsZW4sIGNoYXIgKnVyaSwgaW50IHVyaXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbWV0aG9kLCBpbnQgbWV0aG9kc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFJUU1BNZXRob2QgKm1ldGhvZGNvZGUpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBjb25zdCBjaGFyICpsaW5lcHQsICpzZWFyY2hsaW5lcHQ7CisgICAgbGluZXB0ID0gc3RyY2hyKGxpbmUsICcgJyk7CisKKyAgICBpZiAoIWxpbmVwdCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyBtZXRob2Qgc3RyaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGxpbmVwdCAtIGxpbmUgPiBtZXRob2RzaXplIC0gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTWV0aG9kIHN0cmluZyB0b28gbG9uZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIG1lbWNweShtZXRob2QsIGxpbmUsIGxpbmVwdCAtIGxpbmUpOworICAgIG1ldGhvZFtsaW5lcHQgLSBsaW5lXSA9ICdcMCc7CisgICAgbGluZXB0Kys7CisgICAgaWYgKCFzdHJjbXAobWV0aG9kLCAiQU5OT1VOQ0UiKSkKKyAgICAgICAgKm1ldGhvZGNvZGUgPSBBTk5PVU5DRTsKKyAgICBlbHNlIGlmICghc3RyY21wKG1ldGhvZCwgIk9QVElPTlMiKSkKKyAgICAgICAgKm1ldGhvZGNvZGUgPSBPUFRJT05TOworICAgIGVsc2UgaWYgKCFzdHJjbXAobWV0aG9kLCAiUkVDT1JEIikpCisgICAgICAgICptZXRob2Rjb2RlID0gUkVDT1JEOworICAgIGVsc2UgaWYgKCFzdHJjbXAobWV0aG9kLCAiU0VUVVAiKSkKKyAgICAgICAgKm1ldGhvZGNvZGUgPSBTRVRVUDsKKyAgICBlbHNlIGlmICghc3RyY21wKG1ldGhvZCwgIlBBVVNFIikpCisgICAgICAgICptZXRob2Rjb2RlID0gUEFVU0U7CisgICAgZWxzZSBpZiAoIXN0cmNtcChtZXRob2QsICJURUFSRE9XTiIpKQorICAgICAgICAqbWV0aG9kY29kZSA9IFRFQVJET1dOOworICAgIGVsc2UKKyAgICAgICAgKm1ldGhvZGNvZGUgPSBVTktOT1dOOworICAgIC8qIENoZWNrIG1ldGhvZCB3aXRoIHRoZSBzdGF0ZSAgKi8KKyAgICBpZiAocnQtPnN0YXRlID09IFJUU1BfU1RBVEVfSURMRSkgeworICAgICAgICBpZiAoKCptZXRob2Rjb2RlICE9IEFOTk9VTkNFKSAmJiAoKm1ldGhvZGNvZGUgIT0gT1BUSU9OUykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmV4cGVjdGVkIGNvbW1hbmQgaW4gSWRsZSBTdGF0ZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBsaW5lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BST1RPQ09MX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocnQtPnN0YXRlID09IFJUU1BfU1RBVEVfUEFVU0VEKSB7CisgICAgICAgIGlmICgoKm1ldGhvZGNvZGUgIT0gT1BUSU9OUykgJiYgKCptZXRob2Rjb2RlICE9IFJFQ09SRCkKKyAgICAgICAgICAgICYmICgqbWV0aG9kY29kZSAhPSBTRVRVUCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmV4cGVjdGVkIGNvbW1hbmQgaW4gUGF1c2VkIFN0YXRlICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGxpbmUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUFJPVE9DT0xfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChydC0+c3RhdGUgPT0gUlRTUF9TVEFURV9TVFJFQU1JTkcpIHsKKyAgICAgICAgaWYgKCgqbWV0aG9kY29kZSAhPSBQQVVTRSkgJiYgKCptZXRob2Rjb2RlICE9IE9QVElPTlMpCisgICAgICAgICAgICAmJiAoKm1ldGhvZGNvZGUgIT0gVEVBUkRPV04pKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5leHBlY3RlZCBjb21tYW5kIGluIFN0cmVhbWluZyBTdGF0ZSIKKyAgICAgICAgICAgICAgICAgICAiICVzXG4iLCBsaW5lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BST1RPQ09MX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmV4cGVjdGVkIFN0YXRlIFslZF1cbiIsIHJ0LT5zdGF0ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICB9CisKKyAgICBzZWFyY2hsaW5lcHQgPSBzdHJjaHIobGluZXB0LCAnICcpOworICAgIGlmICghc2VhcmNobGluZXB0KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIG1lc3NhZ2UgVVJJXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChzZWFyY2hsaW5lcHQgLSBsaW5lcHQgPiB1cmlzaXplIC0gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidXJpIHN0cmluZyBsZW5ndGggZXhjZWVkZWQgYnVmZmVyIHNpemVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBtZW1jcHkodXJpLCBsaW5lcHQsIHNlYXJjaGxpbmVwdCAtIGxpbmVwdCk7CisgICAgdXJpW3NlYXJjaGxpbmVwdCAtIGxpbmVwdF0gPSAnXDAnOworICAgIGlmIChzdHJjbXAocnQtPmNvbnRyb2xfdXJpLCB1cmkpKSB7CisgICAgICAgIGNoYXIgaG9zdFsxMjhdLCBwYXRoWzUxMl0sIGF1dGhbMTI4XTsKKyAgICAgICAgaW50IHBvcnQ7CisgICAgICAgIGNoYXIgY3RsX2hvc3RbMTI4XSwgY3RsX3BhdGhbNTEyXSwgY3RsX2F1dGhbMTI4XTsKKyAgICAgICAgaW50IGN0bF9wb3J0OworICAgICAgICBhdl91cmxfc3BsaXQoTlVMTCwgMCwgYXV0aCwgc2l6ZW9mKGF1dGgpLCBob3N0LCBzaXplb2YoaG9zdCksICZwb3J0LAorICAgICAgICAgICAgICAgICAgICAgcGF0aCwgc2l6ZW9mKHBhdGgpLCB1cmkpOworICAgICAgICBhdl91cmxfc3BsaXQoTlVMTCwgMCwgY3RsX2F1dGgsIHNpemVvZihjdGxfYXV0aCksIGN0bF9ob3N0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGN0bF9ob3N0KSwgJmN0bF9wb3J0LCBjdGxfcGF0aCwgc2l6ZW9mKGN0bF9wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgIHJ0LT5jb250cm9sX3VyaSk7CisgICAgICAgIGlmIChzdHJjbXAoaG9zdCwgY3RsX2hvc3QpKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiSG9zdCAlcyBkaWZmZXJzIGZyb20gZXhwZWN0ZWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgaG9zdCwgY3RsX2hvc3QpOworICAgICAgICBpZiAoc3RyY21wKHBhdGgsIGN0bF9wYXRoKSAmJiAqbWV0aG9kY29kZSAhPSBTRVRVUCkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIldBUk5JTkc6IFBhdGggJXMgZGlmZmVycyBmcm9tIGV4cGVjdGVkIgorICAgICAgICAgICAgICAgICAgICIgJXNcbiIsIHBhdGgsIGN0bF9wYXRoKTsKKyAgICAgICAgaWYgKCptZXRob2Rjb2RlID09IEFOTk9VTkNFKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgIlVwZGF0aW5nIGNvbnRyb2wgVVJJIHRvICVzXG4iLCB1cmkpOworICAgICAgICAgICAgYXZfc3RybGNweShydC0+Y29udHJvbF91cmksIHVyaSwgc2l6ZW9mKHJ0LT5jb250cm9sX3VyaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgbGluZXB0ID0gc2VhcmNobGluZXB0ICsgMTsKKyAgICBpZiAoIWF2X3N0cnN0YXJ0KGxpbmVwdCwgIlJUU1AvMS4wIiwgTlVMTCkpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgcHJvdG9jb2wgb3IgdmVyc2lvblxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BST1RPQ09MX05PVF9GT1VORDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9ydHNwX3BhcnNlX3N0cmVhbWluZ19jb21tYW5kcyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyIHJidWZbNDA5Nl07CisgICAgdW5zaWduZWQgY2hhciBtZXRob2RbMTBdOworICAgIGNoYXIgdXJpWzUwMF07CisgICAgaW50IHJldDsKKyAgICBpbnQgcmJ1ZmxlbiAgICAgICAgICAgICAgID0gMDsKKyAgICBSVFNQTWVzc2FnZUhlYWRlciByZXF1ZXN0ID0geyAwIH07CisgICAgZW51bSBSVFNQTWV0aG9kIG1ldGhvZGNvZGU7CisKKyAgICByZXQgPSByZWFkX2xpbmUocywgcmJ1Ziwgc2l6ZW9mKHJidWYpLCAmcmJ1Zmxlbik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gcGFyc2VfY29tbWFuZF9saW5lKHMsIHJidWYsIHJidWZsZW4sIHVyaSwgc2l6ZW9mKHVyaSksIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1ldGhvZCksICZtZXRob2Rjb2RlKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJSVFNQOiBVbmV4cGVjdGVkIENvbW1hbmRcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHJ0c3BfcmVhZF9yZXF1ZXN0KHMsICZyZXF1ZXN0LCBtZXRob2QpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcnQtPnNlcSsrOworICAgIGlmIChtZXRob2Rjb2RlID09IFBBVVNFKSB7CisgICAgICAgIHJ0LT5zdGF0ZSA9IFJUU1BfU1RBVEVfUEFVU0VEOworICAgICAgICByZXQgICAgICAgPSBydHNwX3NlbmRfcmVwbHkocywgUlRTUF9TVEFUVVNfT0ssIE5VTEwgLCByZXF1ZXN0LnNlcSk7CisgICAgICAgIC8vIFRPRE86IE1pc3NpbmcgZGF0ZSBoZWFkZXIgaW4gcmVzcG9uc2UKKyAgICB9IGVsc2UgaWYgKG1ldGhvZGNvZGUgPT0gT1BUSU9OUykgeworICAgICAgICByZXQgPSBydHNwX3NlbmRfcmVwbHkocywgUlRTUF9TVEFUVVNfT0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHVibGljOiBBTk5PVU5DRSwgUEFVU0UsIFNFVFVQLCBURUFSRE9XTiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFQ09SRFxyXG4iLCByZXF1ZXN0LnNlcSk7CisgICAgfSBlbHNlIGlmIChtZXRob2Rjb2RlID09IFRFQVJET1dOKSB7CisgICAgICAgIHJ0LT5zdGF0ZSA9IFJUU1BfU1RBVEVfSURMRTsKKyAgICAgICAgcmV0ICAgICAgID0gcnRzcF9zZW5kX3JlcGx5KHMsIFJUU1BfU1RBVFVTX09LLCBOVUxMICwgcmVxdWVzdC5zZXEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBydHNwX3JlYWRfcGxheShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBSVFNQTWVzc2FnZUhlYWRlciByZXBseTEsICpyZXBseSA9ICZyZXBseTE7CisgICAgaW50IGk7CisgICAgY2hhciBjbWRbMTAyNF07CisKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiaGVsbG8gc3RhdGU9JWRcbiIsIHJ0LT5zdGF0ZSk7CisgICAgcnQtPm5iX2J5ZXMgPSAwOworCisgICAgaWYgKCEocnQtPnNlcnZlcl90eXBlID09IFJUU1BfU0VSVkVSX1JFQUwgJiYgcnQtPm5lZWRfc3Vic2NyaXB0aW9uKSkgeworICAgICAgICBpZiAocnQtPnRyYW5zcG9ydCA9PSBSVFNQX1RSQU5TUE9SVF9SVFApIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBydC0+bmJfcnRzcF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBSVFNQU3RyZWFtICpydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICBSVFBEZW11eENvbnRleHQgKnJ0cGN0eCA9IHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2OworICAgICAgICAgICAgICAgIGlmICghcnRwY3R4KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBmZl9ydHBfcmVzZXRfcGFja2V0X3F1ZXVlKHJ0cGN0eCk7CisgICAgICAgICAgICAgICAgcnRwY3R4LT5sYXN0X3J0Y3BfbnRwX3RpbWUgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgICAgICAgICAgcnRwY3R4LT5maXJzdF9ydGNwX250cF90aW1lID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgICAgICAgICAgcnRwY3R4LT5iYXNlX3RpbWVzdGFtcCAgICAgID0gMDsKKyAgICAgICAgICAgICAgICBydHBjdHgtPnRpbWVzdGFtcCAgICAgICAgICAgPSAwOworICAgICAgICAgICAgICAgIHJ0cGN0eC0+dW53cmFwcGVkX3RpbWVzdGFtcCA9IDA7CisgICAgICAgICAgICAgICAgcnRwY3R4LT5ydGNwX3RzX29mZnNldCAgICAgID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocnQtPnN0YXRlID09IFJUU1BfU1RBVEVfUEFVU0VEKSB7CisgICAgICAgICAgICBjbWRbMF0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25wcmludGYoY21kLCBzaXplb2YoY21kKSwKKyAgICAgICAgICAgICAgICAgICAgICJSYW5nZTogbnB0PSUiUFJJZDY0Ii4lMDMiUFJJZDY0Ii1cclxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHJ0LT5zZWVrX3RpbWVzdGFtcCAvIEFWX1RJTUVfQkFTRSwKKyAgICAgICAgICAgICAgICAgICAgIHJ0LT5zZWVrX3RpbWVzdGFtcCAvIChBVl9USU1FX0JBU0UgLyAxMDAwKSAlIDEwMDApOworICAgICAgICB9CisgICAgICAgIGZmX3J0c3Bfc2VuZF9jbWQocywgIlBMQVkiLCBydC0+Y29udHJvbF91cmksIGNtZCwgcmVwbHksIE5VTEwpOworICAgICAgICBpZiAocmVwbHktPnN0YXR1c19jb2RlICE9IFJUU1BfU1RBVFVTX09LKSB7CisgICAgICAgICAgICByZXR1cm4gZmZfcnRzcF9hdmVycm9yKHJlcGx5LT5zdGF0dXNfY29kZSwgLTEpOworICAgICAgICB9CisgICAgICAgIGlmIChydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCAmJgorICAgICAgICAgICAgcmVwbHktPnJhbmdlX3N0YXJ0ICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcnQtPm5iX3J0c3Bfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgUlRTUFN0cmVhbSAqcnRzcF9zdCA9IHJ0LT5ydHNwX3N0cmVhbXNbaV07CisgICAgICAgICAgICAgICAgUlRQRGVtdXhDb250ZXh0ICpydHBjdHggPSBydHNwX3N0LT50cmFuc3BvcnRfcHJpdjsKKyAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBOVUxMOworICAgICAgICAgICAgICAgIGlmICghcnRwY3R4IHx8IHJ0c3Bfc3QtPnN0cmVhbV9pbmRleCA8IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tydHNwX3N0LT5zdHJlYW1faW5kZXhdOworICAgICAgICAgICAgICAgIHJ0cGN0eC0+cmFuZ2Vfc3RhcnRfb2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKHJlcGx5LT5yYW5nZV9zdGFydCwgQVZfVElNRV9CQVNFX1EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBydC0+c3RhdGUgPSBSVFNQX1NUQVRFX1NUUkVBTUlORzsKKyAgICByZXR1cm4gMDsKK30KKworLyogcGF1c2UgdGhlIHN0cmVhbSAqLworc3RhdGljIGludCBydHNwX3JlYWRfcGF1c2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgUlRTUE1lc3NhZ2VIZWFkZXIgcmVwbHkxLCAqcmVwbHkgPSAmcmVwbHkxOworCisgICAgaWYgKHJ0LT5zdGF0ZSAhPSBSVFNQX1NUQVRFX1NUUkVBTUlORykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZSBpZiAoIShydC0+c2VydmVyX3R5cGUgPT0gUlRTUF9TRVJWRVJfUkVBTCAmJiBydC0+bmVlZF9zdWJzY3JpcHRpb24pKSB7CisgICAgICAgIGZmX3J0c3Bfc2VuZF9jbWQocywgIlBBVVNFIiwgcnQtPmNvbnRyb2xfdXJpLCBOVUxMLCByZXBseSwgTlVMTCk7CisgICAgICAgIGlmIChyZXBseS0+c3RhdHVzX2NvZGUgIT0gUlRTUF9TVEFUVVNfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBmZl9ydHNwX2F2ZXJyb3IocmVwbHktPnN0YXR1c19jb2RlLCAtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcnQtPnN0YXRlID0gUlRTUF9TVEFURV9QQVVTRUQ7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9ydHNwX3NldHVwX2lucHV0X3N0cmVhbXMoQVZGb3JtYXRDb250ZXh0ICpzLCBSVFNQTWVzc2FnZUhlYWRlciAqcmVwbHkpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBjaGFyIGNtZFsxMDI0XTsKKyAgICB1bnNpZ25lZCBjaGFyICpjb250ZW50ID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgLyogZGVzY3JpYmUgdGhlIHN0cmVhbSAqLworICAgIHNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksCisgICAgICAgICAgICAgIkFjY2VwdDogYXBwbGljYXRpb24vc2RwXHJcbiIpOworICAgIGlmIChydC0+c2VydmVyX3R5cGUgPT0gUlRTUF9TRVJWRVJfUkVBTCkgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFJlcXVpcmU6IGF0dHJpYnV0ZSBpcyBuZWVkZWQgZm9yIHByb3BlciBzdHJlYW1pbmcgZnJvbQorICAgICAgICAgKiBSZWFsbWVkaWEgc2VydmVycy4KKyAgICAgICAgICovCisgICAgICAgIGF2X3N0cmxjYXQoY21kLAorICAgICAgICAgICAgICAgICAgICJSZXF1aXJlOiBjb20ucmVhbC5yZXRhaW4tZW50aXR5LWZvci1zZXR1cFxyXG4iLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihjbWQpKTsKKyAgICB9CisgICAgZmZfcnRzcF9zZW5kX2NtZChzLCAiREVTQ1JJQkUiLCBydC0+Y29udHJvbF91cmksIGNtZCwgcmVwbHksICZjb250ZW50KTsKKyAgICBpZiAocmVwbHktPnN0YXR1c19jb2RlICE9IFJUU1BfU1RBVFVTX09LKSB7CisgICAgICAgIGF2X2ZyZWVwKCZjb250ZW50KTsKKyAgICAgICAgcmV0dXJuIGZmX3J0c3BfYXZlcnJvcihyZXBseS0+c3RhdHVzX2NvZGUsIEFWRVJST1JfSU5WQUxJRERBVEEpOworICAgIH0KKyAgICBpZiAoIWNvbnRlbnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiU0RQOlxuJXNcbiIsIGNvbnRlbnQpOworICAgIC8qIG5vdyB3ZSBnb3QgdGhlIFNEUCBkZXNjcmlwdGlvbiwgd2UgcGFyc2UgaXQgKi8KKyAgICByZXQgPSBmZl9zZHBfcGFyc2UocywgKGNvbnN0IGNoYXIgKiljb250ZW50KTsKKyAgICBhdl9mcmVlcCgmY29udGVudCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydHNwX2xpc3RlbihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBjaGFyIHByb3RvWzEyOF0sIGhvc3RbMTI4XSwgcGF0aFs1MTJdLCBhdXRoWzEyOF07CisgICAgY2hhciB1cmlbNTAwXTsKKyAgICBpbnQgcG9ydDsKKyAgICBpbnQgZGVmYXVsdF9wb3J0ID0gUlRTUF9ERUZBVUxUX1BPUlQ7CisgICAgY2hhciB0Y3BuYW1lWzUwMF07CisgICAgY29uc3QgY2hhciAqbG93ZXJfcHJvdG8gPSAidGNwIjsKKyAgICB1bnNpZ25lZCBjaGFyIHJidWZbNDA5Nl07CisgICAgdW5zaWduZWQgY2hhciBtZXRob2RbMTBdOworICAgIGludCByYnVmbGVuID0gMDsKKyAgICBpbnQgcmV0OworICAgIGVudW0gUlRTUE1ldGhvZCBtZXRob2Rjb2RlOworCisgICAgLyogZXh0cmFjdCBob3N0bmFtZSBhbmQgcG9ydCAqLworICAgIGF2X3VybF9zcGxpdChwcm90bywgc2l6ZW9mKHByb3RvKSwgYXV0aCwgc2l6ZW9mKGF1dGgpLCBob3N0LCBzaXplb2YoaG9zdCksCisgICAgICAgICAgICAgICAgICZwb3J0LCBwYXRoLCBzaXplb2YocGF0aCksIHMtPmZpbGVuYW1lKTsKKworICAgIC8qIGZmX3VybF9qb2luLiBObyBhdXRob3JpemF0aW9uIGJ5IG5vdyAoTlVMTCkgKi8KKyAgICBmZl91cmxfam9pbihydC0+Y29udHJvbF91cmksIHNpemVvZihydC0+Y29udHJvbF91cmkpLCBwcm90bywgTlVMTCwgaG9zdCwKKyAgICAgICAgICAgICAgICBwb3J0LCAiJXMiLCBwYXRoKTsKKworICAgIGlmICghc3RyY21wKHByb3RvLCAicnRzcHMiKSkgeworICAgICAgICBsb3dlcl9wcm90byAgPSAidGxzIjsKKyAgICAgICAgZGVmYXVsdF9wb3J0ID0gUlRTUFNfREVGQVVMVF9QT1JUOworICAgIH0KKworICAgIGlmIChwb3J0IDwgMCkKKyAgICAgICAgcG9ydCA9IGRlZmF1bHRfcG9ydDsKKworICAgIC8qIENyZWF0ZSBUQ1AgY29ubmVjdGlvbiAqLworICAgIGZmX3VybF9qb2luKHRjcG5hbWUsIHNpemVvZih0Y3BuYW1lKSwgbG93ZXJfcHJvdG8sIE5VTEwsIGhvc3QsIHBvcnQsCisgICAgICAgICAgICAgICAgIj9saXN0ZW4mbGlzdGVuX3RpbWVvdXQ9JWQiLCBydC0+aW5pdGlhbF90aW1lb3V0ICogMTAwMCk7CisKKyAgICBpZiAocmV0ID0gZmZ1cmxfb3BlbigmcnQtPnJ0c3BfaGQsIHRjcG5hbWUsIEFWSU9fRkxBR19SRUFEX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiBSVFNQIGZvciBsaXN0ZW5pbmdcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBydC0+c3RhdGUgICAgICAgPSBSVFNQX1NUQVRFX0lETEU7CisgICAgcnQtPnJ0c3BfaGRfb3V0ID0gcnQtPnJ0c3BfaGQ7CisgICAgZm9yICg7OykgeyAvKiBXYWl0IGZvciBpbmNvbWluZyBSVFNQIG1lc3NhZ2VzICovCisgICAgICAgIHJldCA9IHJlYWRfbGluZShzLCByYnVmLCBzaXplb2YocmJ1ZiksICZyYnVmbGVuKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSBwYXJzZV9jb21tYW5kX2xpbmUocywgcmJ1ZiwgcmJ1ZmxlbiwgdXJpLCBzaXplb2YodXJpKSwgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1ldGhvZCksICZtZXRob2Rjb2RlKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlJUU1A6IFVuZXhwZWN0ZWQgQ29tbWFuZFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1ldGhvZGNvZGUgPT0gQU5OT1VOQ0UpIHsKKyAgICAgICAgICAgIHJldCAgICAgICA9IHJ0c3BfcmVhZF9hbm5vdW5jZShzKTsKKyAgICAgICAgICAgIHJ0LT5zdGF0ZSA9IFJUU1BfU1RBVEVfUEFVU0VEOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZGNvZGUgPT0gT1BUSU9OUykgeworICAgICAgICAgICAgcmV0ID0gcnRzcF9yZWFkX29wdGlvbnMocyk7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kY29kZSA9PSBSRUNPUkQpIHsKKyAgICAgICAgICAgIHJldCA9IHJ0c3BfcmVhZF9yZWNvcmQocyk7CisgICAgICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgLy8gV2UgYXJlIHJlYWR5IGZvciBzdHJlYW1pbmcKKyAgICAgICAgfSBlbHNlIGlmIChtZXRob2Rjb2RlID09IFNFVFVQKQorICAgICAgICAgICAgcmV0ID0gcnRzcF9yZWFkX3NldHVwKHMsIGhvc3QsIHVyaSk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIGZmdXJsX2Nsb3NlKHJ0LT5ydHNwX2hkKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0c3BfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKAorI2lmIENPTkZJR19UTFNfUFJPVE9DT0wKKyAgICAgICAgYXZfc3Ryc3RhcnQocC0+ZmlsZW5hbWUsICJydHNwczoiLCBOVUxMKSB8fAorI2VuZGlmCisgICAgICAgIGF2X3N0cnN0YXJ0KHAtPmZpbGVuYW1lLCAicnRzcDoiLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0c3BfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmIChydC0+aW5pdGlhbF90aW1lb3V0ID4gMCkKKyAgICAgICAgcnQtPnJ0c3BfZmxhZ3MgfD0gUlRTUF9GTEFHX0xJU1RFTjsKKworICAgIGlmIChydC0+cnRzcF9mbGFncyAmIFJUU1BfRkxBR19MSVNURU4pIHsKKyAgICAgICAgcmV0ID0gcnRzcF9saXN0ZW4ocyk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IGZmX3J0c3BfY29ubmVjdChzKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcnQtPnJlYWxfc2V0dXBfY2FjaGUgPSAhcy0+bmJfc3RyZWFtcyA/IE5VTEwgOgorICAgICAgICAgICAgYXZfbWFsbG9jel9hcnJheShzLT5uYl9zdHJlYW1zLCAyICogc2l6ZW9mKCpydC0+cmVhbF9zZXR1cF9jYWNoZSkpOworICAgICAgICBpZiAoIXJ0LT5yZWFsX3NldHVwX2NhY2hlICYmIHMtPm5iX3N0cmVhbXMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBydC0+cmVhbF9zZXR1cCA9IHJ0LT5yZWFsX3NldHVwX2NhY2hlICsgcy0+bmJfc3RyZWFtczsKKworICAgICAgICBpZiAocnQtPmluaXRpYWxfcGF1c2UpIHsKKyAgICAgICAgICAgIC8qIGRvIG5vdCBzdGFydCBpbW1lZGlhdGVseSAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChyZXQgPSBydHNwX3JlYWRfcGxheShzKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZmZfcnRzcF9jbG9zZV9zdHJlYW1zKHMpOworICAgICAgICAgICAgICAgIGZmX3J0c3BfY2xvc2VfY29ubmVjdGlvbnMocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfcnRzcF90Y3BfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBSVFNQU3RyZWFtICoqcHJ0c3Bfc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaWQsIGxlbiwgaSwgcmV0OworICAgIFJUU1BTdHJlYW0gKnJ0c3Bfc3Q7CisKKyAgICBhdl9kbG9nKHMsICJ0Y3BfcmVhZF9wYWNrZXQ6XG4iKTsKK3JlZG86CisgICAgZm9yICg7OykgeworICAgICAgICBSVFNQTWVzc2FnZUhlYWRlciByZXBseTsKKworICAgICAgICByZXQgPSBmZl9ydHNwX3JlYWRfcmVwbHkocywgJnJlcGx5LCBOVUxMLCAxLCBOVUxMKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAocmV0ID09IDEpIC8qIHJlY2VpdmVkICckJyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIFhYWDogcGFyc2UgbWVzc2FnZSAqLworICAgICAgICBpZiAocnQtPnN0YXRlICE9IFJUU1BfU1RBVEVfU1RSRUFNSU5HKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldCA9IGZmdXJsX3JlYWRfY29tcGxldGUocnQtPnJ0c3BfaGQsIGJ1ZiwgMyk7CisgICAgaWYgKHJldCAhPSAzKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWQgID0gYnVmWzBdOworICAgIGxlbiA9IEFWX1JCMTYoYnVmICsgMSk7CisgICAgYXZfZGxvZyhzLCAiaWQ9JWQgbGVuPSVkXG4iLCBpZCwgbGVuKTsKKyAgICBpZiAobGVuID4gYnVmX3NpemUgfHwgbGVuIDwgOCkKKyAgICAgICAgZ290byByZWRvOworICAgIC8qIGdldCB0aGUgZGF0YSAqLworICAgIHJldCA9IGZmdXJsX3JlYWRfY29tcGxldGUocnQtPnJ0c3BfaGQsIGJ1ZiwgbGVuKTsKKyAgICBpZiAocmV0ICE9IGxlbikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JEVCAmJgorICAgICAgICBmZl9yZHRfcGFyc2VfaGVhZGVyKGJ1ZiwgbGVuLCAmaWQsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogZmluZCB0aGUgbWF0Y2hpbmcgc3RyZWFtICovCisgICAgZm9yIChpID0gMDsgaSA8IHJ0LT5uYl9ydHNwX3N0cmVhbXM7IGkrKykgeworICAgICAgICBydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKGlkID49IHJ0c3Bfc3QtPmludGVybGVhdmVkX21pbiAmJgorICAgICAgICAgICAgaWQgPD0gcnRzcF9zdC0+aW50ZXJsZWF2ZWRfbWF4KQorICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICB9CisgICAgZ290byByZWRvOworZm91bmQ6CisgICAgKnBydHNwX3N0ID0gcnRzcF9zdDsKKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHJlc2V0dXBfdGNwKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgaG9zdFsxMDI0XTsKKyAgICBpbnQgcG9ydDsKKworICAgIGF2X3VybF9zcGxpdChOVUxMLCAwLCBOVUxMLCAwLCBob3N0LCBzaXplb2YoaG9zdCksICZwb3J0LCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICBzLT5maWxlbmFtZSk7CisgICAgZmZfcnRzcF91bmRvX3NldHVwKHMsIDApOworICAgIHJldHVybiBmZl9ydHNwX21ha2Vfc2V0dXBfcmVxdWVzdChzLCBob3N0LCBwb3J0LCBSVFNQX0xPV0VSX1RSQU5TUE9SVF9UQ1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0LT5yZWFsX2NoYWxsZW5nZSk7Cit9CisKK3N0YXRpYyBpbnQgcnRzcF9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworICAgIFJUU1BNZXNzYWdlSGVhZGVyIHJlcGx5MSwgKnJlcGx5ID0gJnJlcGx5MTsKKyAgICBjaGFyIGNtZFsxMDI0XTsKKworcmV0cnk6CisgICAgaWYgKHJ0LT5zZXJ2ZXJfdHlwZSA9PSBSVFNQX1NFUlZFUl9SRUFMKSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgICAgICBydC0+cmVhbF9zZXR1cFtpXSA9IHMtPnN0cmVhbXNbaV0tPmRpc2NhcmQ7CisKKyAgICAgICAgaWYgKCFydC0+bmVlZF9zdWJzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIGlmIChtZW1jbXAgKHJ0LT5yZWFsX3NldHVwLCBydC0+cmVhbF9zZXR1cF9jYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlbnVtIEFWRGlzY2FyZCkgKiBzLT5uYl9zdHJlYW1zKSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3Vic2NyaWJlOiAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJ0LT5sYXN0X3N1YnNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgZmZfcnRzcF9zZW5kX2NtZChzLCAiU0VUX1BBUkFNRVRFUiIsIHJ0LT5jb250cm9sX3VyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCwgcmVwbHksIE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChyZXBseS0+c3RhdHVzX2NvZGUgIT0gUlRTUF9TVEFUVVNfT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZl9ydHNwX2F2ZXJyb3IocmVwbHktPnN0YXR1c19jb2RlLCBBVkVSUk9SX0lOVkFMSUREQVRBKTsKKyAgICAgICAgICAgICAgICBydC0+bmVlZF9zdWJzY3JpcHRpb24gPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJ0LT5uZWVkX3N1YnNjcmlwdGlvbikgeworICAgICAgICAgICAgaW50IHIsIHJ1bGVfbnIsIGZpcnN0ID0gMTsKKworICAgICAgICAgICAgbWVtY3B5KHJ0LT5yZWFsX3NldHVwX2NhY2hlLCBydC0+cmVhbF9zZXR1cCwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoZW51bSBBVkRpc2NhcmQpICogcy0+bmJfc3RyZWFtcyk7CisgICAgICAgICAgICBydC0+bGFzdF9zdWJzY3JpcHRpb25bMF0gPSAwOworCisgICAgICAgICAgICBzbnByaW50ZihjbWQsIHNpemVvZihjbWQpLAorICAgICAgICAgICAgICAgICAgICAgIlN1YnNjcmliZTogIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcnQtPm5iX3J0c3Bfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgcnVsZV9uciA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChyID0gMDsgciA8IHMtPm5iX3N0cmVhbXM7IHIrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tyXS0+aWQgPT0gaSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbcl0tPmRpc2NhcmQgIT0gQVZESVNDQVJEX0FMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3N0cmxjYXQocnQtPmxhc3Rfc3Vic2NyaXB0aW9uLCAiLCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJ0LT5sYXN0X3N1YnNjcmlwdGlvbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX3JkdF9zdWJzY3JpYmVfcnVsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQtPmxhc3Rfc3Vic2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocnQtPmxhc3Rfc3Vic2NyaXB0aW9uKSwgaSwgcnVsZV9ucik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcnVsZV9ucisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfc3RybGNhdGYoY21kLCBzaXplb2YoY21kKSwgIiVzXHJcbiIsIHJ0LT5sYXN0X3N1YnNjcmlwdGlvbik7CisgICAgICAgICAgICBmZl9ydHNwX3NlbmRfY21kKHMsICJTRVRfUEFSQU1FVEVSIiwgcnQtPmNvbnRyb2xfdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQsIHJlcGx5LCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChyZXBseS0+c3RhdHVzX2NvZGUgIT0gUlRTUF9TVEFUVVNfT0spCisgICAgICAgICAgICAgICAgcmV0dXJuIGZmX3J0c3BfYXZlcnJvcihyZXBseS0+c3RhdHVzX2NvZGUsIEFWRVJST1JfSU5WQUxJRERBVEEpOworICAgICAgICAgICAgcnQtPm5lZWRfc3Vic2NyaXB0aW9uID0gMDsKKworICAgICAgICAgICAgaWYgKHJ0LT5zdGF0ZSA9PSBSVFNQX1NUQVRFX1NUUkVBTUlORykKKyAgICAgICAgICAgICAgICBydHNwX3JlYWRfcGxheSAocyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBmZl9ydHNwX2ZldGNoX3BhY2tldChzLCBwa3QpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFVElNRURPVVQpICYmICFydC0+cGFja2V0cykgeworICAgICAgICAgICAgaWYgKHJ0LT5sb3dlcl90cmFuc3BvcnQgPT0gUlRTUF9MT1dFUl9UUkFOU1BPUlRfVURQICYmCisgICAgICAgICAgICAgICAgcnQtPmxvd2VyX3RyYW5zcG9ydF9tYXNrICYgKDEgPDwgUlRTUF9MT1dFUl9UUkFOU1BPUlRfVENQKSkgeworICAgICAgICAgICAgICAgIFJUU1BNZXNzYWdlSGVhZGVyIHJlcGx5MSwgKnJlcGx5ID0gJnJlcGx5MTsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVRFAgdGltZW91dCwgcmV0cnlpbmcgd2l0aCBUQ1BcbiIpOworICAgICAgICAgICAgICAgIGlmIChydHNwX3JlYWRfcGF1c2UocykgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIC8vIFRFQVJET1dOIGlzIHJlcXVpcmVkIG9uIFJlYWwtUlRTUCwgYnV0IG1pZ2h0IG1ha2UKKyAgICAgICAgICAgICAgICAvLyBvdGhlciBzZXJ2ZXJzIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgIGlmIChydC0+c2VydmVyX3R5cGUgPT0gUlRTUF9TRVJWRVJfUkVBTCkKKyAgICAgICAgICAgICAgICAgICAgZmZfcnRzcF9zZW5kX2NtZChzLCAiVEVBUkRPV04iLCBydC0+Y29udHJvbF91cmksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHksIE5VTEwpOworICAgICAgICAgICAgICAgIHJ0LT5zZXNzaW9uX2lkWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBpZiAocmVzZXR1cF90Y3AocykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBydC0+c3RhdGUgPSBSVFNQX1NUQVRFX0lETEU7CisgICAgICAgICAgICAgICAgICAgIHJ0LT5uZWVkX3N1YnNjcmlwdGlvbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChydHNwX3JlYWRfcGxheShzKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBydC0+cGFja2V0cysrOworCisgICAgaWYgKCEocnQtPnJ0c3BfZmxhZ3MgJiBSVFNQX0ZMQUdfTElTVEVOKSkgeworICAgICAgICAvKiBzZW5kIGR1bW15IHJlcXVlc3QgdG8ga2VlcCBUQ1AgY29ubmVjdGlvbiBhbGl2ZSAqLworICAgICAgICBpZiAoKGF2X2dldHRpbWVfcmVsYXRpdmUoKSAtIHJ0LT5sYXN0X2NtZF90aW1lKSAvIDEwMDAwMDAgPj0gcnQtPnRpbWVvdXQgLyAyIHx8CisgICAgICAgICAgICBydC0+YXV0aF9zdGF0ZS5zdGFsZSkgeworICAgICAgICAgICAgaWYgKHJ0LT5zZXJ2ZXJfdHlwZSA9PSBSVFNQX1NFUlZFUl9XTVMgfHwKKyAgICAgICAgICAgICAgICAocnQtPnNlcnZlcl90eXBlICE9IFJUU1BfU0VSVkVSX1JFQUwgJiYKKyAgICAgICAgICAgICAgICAgcnQtPmdldF9wYXJhbWV0ZXJfc3VwcG9ydGVkKSkgeworICAgICAgICAgICAgICAgIGZmX3J0c3Bfc2VuZF9jbWRfYXN5bmMocywgIkdFVF9QQVJBTUVURVIiLCBydC0+Y29udHJvbF91cmksIE5VTEwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmZl9ydHNwX3NlbmRfY21kX2FzeW5jKHMsICJPUFRJT05TIiwgcnQtPmNvbnRyb2xfdXJpLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFRoZSBzdGFsZSBmbGFnIHNob3VsZCBiZSByZXNldCB3aGVuIGNyZWF0aW5nIHRoZSBhdXRoIHJlc3BvbnNlIGluCisgICAgICAgICAgICAgKiBmZl9ydHNwX3NlbmRfY21kX2FzeW5jLCBidXQgcmVzZXQgaXQgaGVyZSBqdXN0IGluIGNhc2Ugd2UgbmV2ZXIKKyAgICAgICAgICAgICAqIGNhbGxlZCB0aGUgYXV0aCBjb2RlIChpZiB3ZSBkaWRuJ3QgaGF2ZSBhbnkgY3JlZGVudGlhbHMgc2V0KS4gKi8KKyAgICAgICAgICAgIHJ0LT5hdXRoX3N0YXRlLnN0YWxlID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0c3BfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBydC0+c2Vla190aW1lc3RhbXAgPSBhdl9yZXNjYWxlX3EodGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EpOworICAgIHN3aXRjaChydC0+c3RhdGUpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgUlRTUF9TVEFURV9JRExFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIFJUU1BfU1RBVEVfU1RSRUFNSU5HOgorICAgICAgICBpZiAoKHJldCA9IHJ0c3BfcmVhZF9wYXVzZShzKSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJ0LT5zdGF0ZSA9IFJUU1BfU1RBVEVfU0VFS0lORzsKKyAgICAgICAgaWYgKChyZXQgPSBydHNwX3JlYWRfcGxheShzKSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlRTUF9TVEFURV9QQVVTRUQ6CisgICAgICAgIHJ0LT5zdGF0ZSA9IFJUU1BfU1RBVEVfSURMRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBydHNwX2RlbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgICAgID0gIlJUU1AgZGVtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgID0gZmZfcnRzcF9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfcnRzcF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJydHNwIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUlRTUCBpbnB1dCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihSVFNQU3RhdGUpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHJ0c3BfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gcnRzcF9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBydHNwX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHJ0c3BfcmVhZF9jbG9zZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSBydHNwX3JlYWRfc2VlaywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLnJlYWRfcGxheSAgICAgID0gcnRzcF9yZWFkX3BsYXksCisgICAgLnJlYWRfcGF1c2UgICAgID0gcnRzcF9yZWFkX3BhdXNlLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZydHNwX2RlbXV4ZXJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3J0c3BlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHNwZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc3MDdiYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9ydHNwZW5jLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBSVFNQIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisKKyNpZiBIQVZFX1BPTExfSAorI2luY2x1ZGUgPHBvbGwuaD4KKyNlbmRpZgorI2luY2x1ZGUgIm5ldHdvcmsuaCIKKyNpbmNsdWRlICJvc19zdXBwb3J0LmgiCisjaW5jbHVkZSAicnRzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgInVybC5oIgorCisjZGVmaW5lIFNEUF9NQVhfU0laRSAxNjM4NAorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBydHNwX211eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlJUU1AgbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBmZl9ydHNwX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitpbnQgZmZfcnRzcF9zZXR1cF9vdXRwdXRfc3RyZWFtcyhBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKmFkZHIpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBSVFNQTWVzc2FnZUhlYWRlciByZXBseTEsICpyZXBseSA9ICZyZXBseTE7CisgICAgaW50IGk7CisgICAgY2hhciAqc2RwOworICAgIEFWRm9ybWF0Q29udGV4dCBzZHBfY3R4LCAqY3R4X2FycmF5WzFdOworCisgICAgaWYgKHMtPnN0YXJ0X3RpbWVfcmVhbHRpbWUgPT0gMCAgfHwgIHMtPnN0YXJ0X3RpbWVfcmVhbHRpbWUgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHMtPnN0YXJ0X3RpbWVfcmVhbHRpbWUgPSBhdl9nZXR0aW1lKCk7CisKKyAgICAvKiBBbm5vdW5jZSB0aGUgc3RyZWFtICovCisgICAgc2RwID0gYXZfbWFsbG9jeihTRFBfTUFYX1NJWkUpOworICAgIGlmICghc2RwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIC8qIFdlIGNyZWF0ZSB0aGUgU0RQIGJhc2VkIG9uIHRoZSBSVFNQIEFWRm9ybWF0Q29udGV4dCB3aGVyZSB3ZQorICAgICAqIGFyZW4ndCBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgZmlsZW5hbWUgZmllbGQuIChXZSBjcmVhdGUgdGhlIFNEUAorICAgICAqIGJhc2VkIG9uIHRoZSBSVFNQIGNvbnRleHQgc2luY2UgdGhlIGNvbnRleHRzIGZvciB0aGUgUlRQIHN0cmVhbXMKKyAgICAgKiBkb24ndCBleGlzdCB5ZXQuKSBJbiBvcmRlciB0byBzcGVjaWZ5IGEgY3VzdG9tIFVSTCB3aXRoIHRoZSBhY3R1YWwKKyAgICAgKiBwZWVyIElQIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsbHkgc3BlY2lmaWVkIGhvc3RuYW1lLCB3ZSBjcmVhdGUKKyAgICAgKiBhIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBBVkZvcm1hdENvbnRleHQsIHdoZXJlIHRoZSBjdXN0b20gVVJMIGlzIHNldC4KKyAgICAgKgorICAgICAqIEZJWE1FOiBDcmVhdGUgdGhlIFNEUCB3aXRob3V0IGNvcHlpbmcgdGhlIEFWRm9ybWF0Q29udGV4dC4KKyAgICAgKiBUaGlzIGVpdGhlciByZXF1aXJlcyBzZXR0aW5nIHVwIHRoZSBSVFAgc3RyZWFtIEFWRm9ybWF0Q29udGV4dHMKKyAgICAgKiBhbHJlYWR5IGhlcmUgKGNvbXBsaWNhdGluZyB0aGluZ3MgaW1tZW5zZWx5KSBvciBnZXR0aW5nIGEgbW9yZQorICAgICAqIGZsZXhpYmxlIFNEUCBjcmVhdGlvbiBpbnRlcmZhY2UuCisgICAgICovCisgICAgc2RwX2N0eCA9ICpzOworICAgIGZmX3VybF9qb2luKHNkcF9jdHguZmlsZW5hbWUsIHNpemVvZihzZHBfY3R4LmZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAicnRzcCIsIE5VTEwsIGFkZHIsIC0xLCBOVUxMKTsKKyAgICBjdHhfYXJyYXlbMF0gPSAmc2RwX2N0eDsKKyAgICBpZiAoYXZfc2RwX2NyZWF0ZShjdHhfYXJyYXksIDEsIHNkcCwgU0RQX01BWF9TSVpFKSkgeworICAgICAgICBhdl9mcmVlKHNkcCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJTRFA6XG4lc1xuIiwgc2RwKTsKKyAgICBmZl9ydHNwX3NlbmRfY21kX3dpdGhfY29udGVudChzLCAiQU5OT1VOQ0UiLCBydC0+Y29udHJvbF91cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc2RwXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHksIE5VTEwsIHNkcCwgc3RybGVuKHNkcCkpOworICAgIGF2X2ZyZWUoc2RwKTsKKyAgICBpZiAocmVwbHktPnN0YXR1c19jb2RlICE9IFJUU1BfU1RBVFVTX09LKQorICAgICAgICByZXR1cm4gZmZfcnRzcF9hdmVycm9yKHJlcGx5LT5zdGF0dXNfY29kZSwgQVZFUlJPUl9JTlZBTElEREFUQSk7CisKKyAgICAvKiBTZXQgdXAgdGhlIFJUU1BTdHJlYW1zIGZvciBlYWNoIEFWU3RyZWFtICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBSVFNQU3RyZWFtICpydHNwX3N0OworCisgICAgICAgIHJ0c3Bfc3QgPSBhdl9tYWxsb2N6KHNpemVvZihSVFNQU3RyZWFtKSk7CisgICAgICAgIGlmICghcnRzcF9zdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGR5bmFycmF5X2FkZCgmcnQtPnJ0c3Bfc3RyZWFtcywgJnJ0LT5uYl9ydHNwX3N0cmVhbXMsIHJ0c3Bfc3QpOworCisgICAgICAgIHJ0c3Bfc3QtPnN0cmVhbV9pbmRleCA9IGk7CisKKyAgICAgICAgYXZfc3RybGNweShydHNwX3N0LT5jb250cm9sX3VybCwgcnQtPmNvbnRyb2xfdXJpLCBzaXplb2YocnRzcF9zdC0+Y29udHJvbF91cmwpKTsKKyAgICAgICAgLyogTm90ZSwgdGhpcyBtdXN0IG1hdGNoIHRoZSByZWxhdGl2ZSB1cmkgc2V0IGluIHRoZSBzZHAgY29udGVudCAqLworICAgICAgICBhdl9zdHJsY2F0ZihydHNwX3N0LT5jb250cm9sX3VybCwgc2l6ZW9mKHJ0c3Bfc3QtPmNvbnRyb2xfdXJsKSwKKyAgICAgICAgICAgICAgICAgICAgIi9zdHJlYW1pZD0lZCIsIGkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0c3Bfd3JpdGVfcmVjb3JkKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOworICAgIFJUU1BNZXNzYWdlSGVhZGVyIHJlcGx5MSwgKnJlcGx5ID0gJnJlcGx5MTsKKyAgICBjaGFyIGNtZFsxMDI0XTsKKworICAgIHNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksCisgICAgICAgICAgICAgIlJhbmdlOiBucHQ9MC4wMDAtXHJcbiIpOworICAgIGZmX3J0c3Bfc2VuZF9jbWQocywgIlJFQ09SRCIsIHJ0LT5jb250cm9sX3VyaSwgY21kLCByZXBseSwgTlVMTCk7CisgICAgaWYgKHJlcGx5LT5zdGF0dXNfY29kZSAhPSBSVFNQX1NUQVRVU19PSykKKyAgICAgICAgcmV0dXJuIGZmX3J0c3BfYXZlcnJvcihyZXBseS0+c3RhdHVzX2NvZGUsIC0xKTsKKyAgICBydC0+c3RhdGUgPSBSVFNQX1NUQVRFX1NUUkVBTUlORzsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydHNwX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX3J0c3BfY29ubmVjdChzKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHJ0c3Bfd3JpdGVfcmVjb3JkKHMpIDwgMCkgeworICAgICAgICBmZl9ydHNwX2Nsb3NlX3N0cmVhbXMocyk7CisgICAgICAgIGZmX3J0c3BfY2xvc2VfY29ubmVjdGlvbnMocyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3J0c3BfdGNwX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIFJUU1BTdHJlYW0gKnJ0c3Bfc3QpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkZvcm1hdENvbnRleHQgKnJ0cGN0eCA9IHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2OworICAgIHVpbnQ4X3QgKmJ1ZiwgKnB0cjsKKyAgICBpbnQgc2l6ZTsKKyAgICB1aW50OF90ICppbnRlcmxlYXZlX2hlYWRlciwgKmludGVybGVhdmVkX3BhY2tldDsKKworICAgIHNpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYocnRwY3R4LT5wYiwgJmJ1Zik7CisgICAgcnRwY3R4LT5wYiA9IE5VTEw7CisgICAgcHRyID0gYnVmOworICAgIHdoaWxlIChzaXplID4gNCkgeworICAgICAgICB1aW50MzJfdCBwYWNrZXRfbGVuID0gQVZfUkIzMihwdHIpOworICAgICAgICBpbnQgaWQ7CisgICAgICAgIC8qIFRoZSBpbnRlcmxlYXZpbmcgaGVhZGVyIGlzIGV4YWN0bHkgNCBieXRlcywgd2hpY2ggaGFwcGVucyB0byBiZQorICAgICAgICAgKiB0aGUgc2FtZSBzaXplIGFzIHRoZSBwYWNrZXQgbGVuZ3RoIGhlYWRlciBmcm9tCisgICAgICAgICAqIGZmaW9fb3Blbl9keW5fcGFja2V0X2J1Zi4gU28gYnkgd3JpdGluZyB0aGUgaW50ZXJsZWF2aW5nIGhlYWRlcgorICAgICAgICAgKiBvdmVyIHRoZXNlIGJ5dGVzLCB3ZSBnZXQgYSBjb25zZWN1dGl2ZSBpbnRlcmxlYXZlZCBwYWNrZXQKKyAgICAgICAgICogdGhhdCBjYW4gYmUgd3JpdHRlbiBpbiBvbmUgY2FsbC4gKi8KKyAgICAgICAgaW50ZXJsZWF2ZWRfcGFja2V0ID0gaW50ZXJsZWF2ZV9oZWFkZXIgPSBwdHI7CisgICAgICAgIHB0ciArPSA0OworICAgICAgICBzaXplIC09IDQ7CisgICAgICAgIGlmIChwYWNrZXRfbGVuID4gc2l6ZSB8fCBwYWNrZXRfbGVuIDwgMikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoUlRQX1BUX0lTX1JUQ1AocHRyWzFdKSkKKyAgICAgICAgICAgIGlkID0gcnRzcF9zdC0+aW50ZXJsZWF2ZWRfbWF4OyAvKiBSVENQICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlkID0gcnRzcF9zdC0+aW50ZXJsZWF2ZWRfbWluOyAvKiBSVFAgKi8KKyAgICAgICAgaW50ZXJsZWF2ZV9oZWFkZXJbMF0gPSAnJCc7CisgICAgICAgIGludGVybGVhdmVfaGVhZGVyWzFdID0gaWQ7CisgICAgICAgIEFWX1dCMTYoaW50ZXJsZWF2ZV9oZWFkZXIgKyAyLCBwYWNrZXRfbGVuKTsKKyAgICAgICAgZmZ1cmxfd3JpdGUocnQtPnJ0c3BfaGRfb3V0LCBpbnRlcmxlYXZlZF9wYWNrZXQsIDQgKyBwYWNrZXRfbGVuKTsKKyAgICAgICAgcHRyICs9IHBhY2tldF9sZW47CisgICAgICAgIHNpemUgLT0gcGFja2V0X2xlbjsKKyAgICB9CisgICAgYXZfZnJlZShidWYpOworICAgIHJldHVybiBmZmlvX29wZW5fZHluX3BhY2tldF9idWYoJnJ0cGN0eC0+cGIsIFJUU1BfVENQX01BWF9QQUNLRVRfU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgcnRzcF93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgUlRTUFN0cmVhbSAqcnRzcF9zdDsKKyAgICBpbnQgbjsKKyAgICBzdHJ1Y3QgcG9sbGZkIHAgPSB7ZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKHJ0LT5ydHNwX2hkKSwgUE9MTElOLCAwfTsKKyAgICBBVkZvcm1hdENvbnRleHQgKnJ0cGN0eDsKKyAgICBpbnQgcmV0OworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgbiA9IHBvbGwoJnAsIDEsIDApOworICAgICAgICBpZiAobiA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChwLnJldmVudHMgJiBQT0xMSU4pIHsKKyAgICAgICAgICAgIFJUU1BNZXNzYWdlSGVhZGVyIHJlcGx5OworCisgICAgICAgICAgICAvKiBEb24ndCBsZXQgZmZfcnRzcF9yZWFkX3JlcGx5IGhhbmRsZSBpbnRlcmxlYXZlZCBwYWNrZXRzLAorICAgICAgICAgICAgICogc2luY2UgaXQgd291bGQgYmxvY2sgYW5kIHdhaXQgZm9yIGFuIFJUU1AgcmVwbHkgb24gdGhlIHNvY2tldAorICAgICAgICAgICAgICogKHdoaWNoIG1heSBub3QgYmUgY29taW5nIGFueSB0aW1lIHNvb24pIGlmIGl0IGhhbmRsZXMKKyAgICAgICAgICAgICAqIGludGVybGVhdmVkIHBhY2tldHMgaW50ZXJuYWxseS4gKi8KKyAgICAgICAgICAgIHJldCA9IGZmX3J0c3BfcmVhZF9yZXBseShzLCAmcmVwbHksIE5VTEwsIDEsIE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRVBJUEUpOworICAgICAgICAgICAgaWYgKHJldCA9PSAxKQorICAgICAgICAgICAgICAgIGZmX3J0c3Bfc2tpcF9wYWNrZXQocyk7CisgICAgICAgICAgICAvKiBYWFg6IHBhcnNlIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgIGlmIChydC0+c3RhdGUgIT0gUlRTUF9TVEFURV9TVFJFQU1JTkcpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRVBJUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBrdC0+c3RyZWFtX2luZGV4IDwgMCB8fCBwa3QtPnN0cmVhbV9pbmRleCA+PSBydC0+bmJfcnRzcF9zdHJlYW1zKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBydHNwX3N0ID0gcnQtPnJ0c3Bfc3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgcnRwY3R4ID0gcnRzcF9zdC0+dHJhbnNwb3J0X3ByaXY7CisKKyAgICByZXQgPSBmZl93cml0ZV9jaGFpbmVkKHJ0cGN0eCwgMCwgcGt0LCBzLCAwKTsKKyAgICAvKiBmZl93cml0ZV9jaGFpbmVkIGRvZXMgYWxsIHRoZSBSVFAgcGFja2V0aXphdGlvbi4gSWYgdXNpbmcgVENQIGFzCisgICAgICogdHJhbnNwb3J0LCBydHBjdHgtPnBiIGlzIG9ubHkgYSBkeW5fcGFja2V0X2J1ZiB0aGF0IHF1ZXVlcyB1cCB0aGUKKyAgICAgKiBwYWNrZXRzLCBzbyB3ZSBuZWVkIHRvIHNlbmQgdGhlbSBvdXQgb24gdGhlIFRDUCBjb25uZWN0aW9uIHNlcGFyYXRlbHkuCisgICAgICovCisgICAgaWYgKCFyZXQgJiYgcnQtPmxvd2VyX3RyYW5zcG9ydCA9PSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9UQ1ApCisgICAgICAgIHJldCA9IGZmX3J0c3BfdGNwX3dyaXRlX3BhY2tldChzLCBydHNwX3N0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0c3Bfd3JpdGVfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisKKyAgICAvLyBJZiB3ZSB3YW50IHRvIHNlbmQgUlRDUF9CWUUgcGFja2V0cywgdGhlc2UgYXJlIHNlbnQgYnkgYXZfd3JpdGVfdHJhaWxlci4KKyAgICAvLyBUaHVzIGNhbGwgdGhpcyBvbiBhbGwgc3RyZWFtcyBiZWZvcmUgZG9pbmcgdGhlIHRlYXJkb3duLiBUaGlzIGlzCisgICAgLy8gZG9uZSB3aXRoaW4gZmZfcnRzcF91bmRvX3NldHVwLgorICAgIGZmX3J0c3BfdW5kb19zZXR1cChzLCAxKTsKKworICAgIGZmX3J0c3Bfc2VuZF9jbWRfYXN5bmMocywgIlRFQVJET1dOIiwgcnQtPmNvbnRyb2xfdXJpLCBOVUxMKTsKKworICAgIGZmX3J0c3BfY2xvc2Vfc3RyZWFtcyhzKTsKKyAgICBmZl9ydHNwX2Nsb3NlX2Nvbm5lY3Rpb25zKHMpOworICAgIGZmX25ldHdvcmtfY2xvc2UoKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfcnRzcF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAicnRzcCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJUU1Agb3V0cHV0IiksCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKFJUU1BTdGF0ZSksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IHJ0c3Bfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHJ0c3Bfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IHJ0c3Bfd3JpdGVfY2xvc2UsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9GSUxFIHwgQVZGTVRfR0xPQkFMSEVBREVSLAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZydHNwX211eGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9zYW1pZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc2FtaWRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGUxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc2FtaWRlYy5jCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIENsw6ltZW50IELFk3NjaAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTQU1JIHN1YnRpdGxlIGRlbXV4ZXIKKyAqIEBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zOTcxMzI3LmFzcHgKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInN1YnRpdGxlcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRkZEZW11eFN1YnRpdGxlc1F1ZXVlIHE7Cit9IFNBTUlDb250ZXh0OworCitzdGF0aWMgaW50IHNhbWlfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY2hhciBidWZbNl07CisgICAgRkZUZXh0UmVhZGVyIHRyOworICAgIGZmX3RleHRfaW5pdF9idWYoJnRyLCBwLT5idWYsIHAtPmJ1Zl9zaXplKTsKKyAgICBmZl90ZXh0X3JlYWQoJnRyLCBidWYsIHNpemVvZihidWYpKTsKKworICAgIHJldHVybiAhc3RybmNtcChidWYsICI8U0FNST4iLCA2KSA/IEFWUFJPQkVfU0NPUkVfTUFYIDogMDsKK30KKworc3RhdGljIGludCBzYW1pX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBTQU1JQ29udGV4dCAqc2FtaSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIEFWQlByaW50IGJ1ZiwgaGRyX2J1ZjsKKyAgICBjaGFyIGMgPSAwOworICAgIGludCByZXMgPSAwLCBnb3RfZmlyc3Rfc3luY19wb2ludCA9IDA7CisgICAgRkZUZXh0UmVhZGVyIHRyOworICAgIGZmX3RleHRfaW5pdF9hdmlvKHMsICZ0ciwgcy0+cGIpOworCisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMCk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1NBTUk7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAgICAgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKyAgICBhdl9icHJpbnRfaW5pdCgmaGRyX2J1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIHdoaWxlICghZmZfdGV4dF9lb2YoJnRyKSkgeworICAgICAgICBBVlBhY2tldCAqc3ViOworICAgICAgICBjb25zdCBpbnQ2NF90IHBvcyA9IGZmX3RleHRfcG9zKCZ0cikgLSAoYyAhPSAwKTsKKyAgICAgICAgaW50IGlzX3N5bmMsIG4gPSBmZl9zbWlsX2V4dHJhY3RfbmV4dF90ZXh0X2NodW5rKCZ0ciwgJmJ1ZiwgJmMpOworCisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpc19zeW5jID0gIWF2X3N0cm5jYXNlY21wKGJ1Zi5zdHIsICI8U1lOQyIsIDUpOworICAgICAgICBpZiAoaXNfc3luYykKKyAgICAgICAgICAgIGdvdF9maXJzdF9zeW5jX3BvaW50ID0gMTsKKworICAgICAgICBpZiAoIWdvdF9maXJzdF9zeW5jX3BvaW50KSB7CisgICAgICAgICAgICBhdl9icHJpbnRmKCZoZHJfYnVmLCAiJXMiLCBidWYuc3RyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1YiA9IGZmX3N1YnRpdGxlc19xdWV1ZV9pbnNlcnQoJnNhbWktPnEsIGJ1Zi5zdHIsIGJ1Zi5sZW4sICFpc19zeW5jKTsKKyAgICAgICAgICAgIGlmICghc3ViKSB7CisgICAgICAgICAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzX3N5bmMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwID0gZmZfc21pbF9nZXRfYXR0cl9wdHIoYnVmLnN0ciwgIlN0YXJ0Iik7CisgICAgICAgICAgICAgICAgc3ViLT5wb3MgICAgICA9IHBvczsKKyAgICAgICAgICAgICAgICBzdWItPnB0cyAgICAgID0gcCA/IHN0cnRvbChwLCBOVUxMLCAxMCkgOiAwOworICAgICAgICAgICAgICAgIHN1Yi0+ZHVyYXRpb24gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9icHJpbnRfY2xlYXIoJmJ1Zik7CisgICAgfQorCisgICAgcmVzID0gYXZwcml2X2JwcmludF90b19leHRyYWRhdGEoc3QtPmNvZGVjLCAmaGRyX2J1Zik7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2ZpbmFsaXplKCZzYW1pLT5xKTsKKworZW5kOgorICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnVmLCBOVUxMKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHNhbWlfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFNBTUlDb250ZXh0ICpzYW1pID0gcy0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl9zdWJ0aXRsZXNfcXVldWVfcmVhZF9wYWNrZXQoJnNhbWktPnEsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgc2FtaV9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncykKK3sKKyAgICBTQU1JQ29udGV4dCAqc2FtaSA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJnNhbWktPnEsIHMsIHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc2FtaV9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBTQU1JQ29udGV4dCAqc2FtaSA9IHMtPnByaXZfZGF0YTsKKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfY2xlYW4oJnNhbWktPnEpOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3NhbWlfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic2FtaSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNBTUkgc3VidGl0bGUgZm9ybWF0IiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNBTUlDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBzYW1pX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHNhbWlfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gc2FtaV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrMiAgICAgPSBzYW1pX3JlYWRfc2VlaywKKyAgICAucmVhZF9jbG9zZSAgICAgPSBzYW1pX3JlYWRfY2xvc2UsCisgICAgLmV4dGVuc2lvbnMgICAgID0gInNtaSxzYW1pIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc2FwZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc2FwZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkODUyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zYXBkZWMuYwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIFNlc3Npb24gQW5ub3VuY2VtZW50IFByb3RvY29sIChSRkMgMjk3NCkgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAib3Nfc3VwcG9ydC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgInVybC5oIgorI2luY2x1ZGUgInJ0cGRlYy5oIgorI2lmIEhBVkVfUE9MTF9ICisjaW5jbHVkZSA8cG9sbC5oPgorI2VuZGlmCisKK3N0cnVjdCBTQVBTdGF0ZSB7CisgICAgVVJMQ29udGV4dCAqYW5uX2ZkOworICAgIEFWRm9ybWF0Q29udGV4dCAqc2RwX2N0eDsKKyAgICBBVklPQ29udGV4dCBzZHBfcGI7CisgICAgdWludDE2X3QgaGFzaDsKKyAgICBjaGFyICpzZHA7CisgICAgaW50IGVvZjsKK307CisKK3N0YXRpYyBpbnQgc2FwX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChhdl9zdHJzdGFydChwLT5maWxlbmFtZSwgInNhcDoiLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhcF9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBzdHJ1Y3QgU0FQU3RhdGUgKnNhcCA9IHMtPnByaXZfZGF0YTsKKyAgICBpZiAoc2FwLT5zZHBfY3R4KQorICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmc2FwLT5zZHBfY3R4KTsKKyAgICBpZiAoc2FwLT5hbm5fZmQpCisgICAgICAgIGZmdXJsX2Nsb3NlKHNhcC0+YW5uX2ZkKTsKKyAgICBhdl9mcmVlcCgmc2FwLT5zZHApOworICAgIGZmX25ldHdvcmtfY2xvc2UoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYXBfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHN0cnVjdCBTQVBTdGF0ZSAqc2FwID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgaG9zdFsxMDI0XSwgcGF0aFsxMDI0XSwgdXJsWzEwMjRdOworICAgIHVpbnQ4X3QgcmVjdmJ1ZltSVFBfTUFYX1BBQ0tFVF9MRU5HVEhdOworICAgIGludCBwb3J0OworICAgIGludCByZXQsIGk7CisgICAgQVZJbnB1dEZvcm1hdCogaW5mbXQ7CisKKyAgICBpZiAoIWZmX25ldHdvcmtfaW5pdCgpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgYXZfdXJsX3NwbGl0KE5VTEwsIDAsIE5VTEwsIDAsIGhvc3QsIHNpemVvZihob3N0KSwgJnBvcnQsCisgICAgICAgICAgICAgICAgIHBhdGgsIHNpemVvZihwYXRoKSwgcy0+ZmlsZW5hbWUpOworICAgIGlmIChwb3J0IDwgMCkKKyAgICAgICAgcG9ydCA9IDk4NzU7CisKKyAgICBpZiAoIWhvc3RbMF0pIHsKKyAgICAgICAgLyogTGlzdGVuIGZvciBhbm5vdW5jZW1lbnRzIG9uIHNhcC5tY2FzdC5uZXQgaWYgbm8gaG9zdCB3YXMgc3BlY2lmaWVkICovCisgICAgICAgIGF2X3N0cmxjcHkoaG9zdCwgIjIyNC4yLjEyNy4yNTQiLCBzaXplb2YoaG9zdCkpOworICAgIH0KKworICAgIGZmX3VybF9qb2luKHVybCwgc2l6ZW9mKHVybCksICJ1ZHAiLCBOVUxMLCBob3N0LCBwb3J0LCAiP2xvY2FscG9ydD0lZCIsCisgICAgICAgICAgICAgICAgcG9ydCk7CisgICAgcmV0ID0gZmZ1cmxfb3Blbigmc2FwLT5hbm5fZmQsIHVybCwgQVZJT19GTEFHX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMKTsKKyAgICBpZiAocmV0KQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpbnQgYWRkcl90eXBlLCBhdXRoX2xlbjsKKyAgICAgICAgaW50IHBvczsKKworICAgICAgICByZXQgPSBmZnVybF9yZWFkKHNhcC0+YW5uX2ZkLCByZWN2YnVmLCBzaXplb2YocmVjdmJ1ZikgLSAxKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHJlY3ZidWZbcmV0XSA9ICdcMCc7IC8qIE51bGwgdGVybWluYXRlIGZvciBlYXNpZXIgcGFyc2luZyAqLworICAgICAgICBpZiAocmV0IDwgOCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiUmVjZWl2ZWQgdG9vIHNob3J0IHBhY2tldFxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmVjdmJ1ZlswXSAmIDB4ZTApICE9IDB4MjApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVuc3VwcG9ydGVkIFNBUCB2ZXJzaW9uIHBhY2tldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlZFxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWN2YnVmWzBdICYgMHgwNCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiUmVjZWl2ZWQgc3RyZWFtIGRlbGV0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFubm91bmNlbWVudFxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhZGRyX3R5cGUgPSByZWN2YnVmWzBdICYgMHgxMDsKKyAgICAgICAgYXV0aF9sZW4gID0gcmVjdmJ1ZlsxXTsKKyAgICAgICAgc2FwLT5oYXNoID0gQVZfUkIxNigmcmVjdmJ1ZlsyXSk7CisgICAgICAgIHBvcyA9IDQ7CisgICAgICAgIGlmIChhZGRyX3R5cGUpCisgICAgICAgICAgICBwb3MgKz0gMTY7IC8qIElQdjYgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcG9zICs9IDQ7IC8qIElQdjQgKi8KKyAgICAgICAgcG9zICs9IGF1dGhfbGVuICogNDsKKyAgICAgICAgaWYgKHBvcyArIDQgPj0gcmV0KSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJSZWNlaXZlZCB0b28gc2hvcnQgcGFja2V0XG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZGVmaW5lIE1JTUUgImFwcGxpY2F0aW9uL3NkcCIKKyAgICAgICAgaWYgKHN0cmNtcCgmcmVjdmJ1Zltwb3NdLCBNSU1FKSA9PSAwKSB7CisgICAgICAgICAgICBwb3MgKz0gc3RybGVuKE1JTUUpICsgMTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCZyZWN2YnVmW3Bvc10sICJ2PTBcclxuIiwgNSkgPT0gMCkgeworICAgICAgICAgICAgLy8gRGlyZWN0IFNEUCB3aXRob3V0IGEgbWltZSB0eXBlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVbnN1cHBvcnRlZCBtaW1lIHR5cGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN2YnVmW3Bvc10pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzYXAtPnNkcCA9IGF2X3N0cmR1cCgmcmVjdmJ1Zltwb3NdKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiU0RQOlxuJXNcbiIsIHNhcC0+c2RwKTsKKyAgICBmZmlvX2luaXRfY29udGV4dCgmc2FwLT5zZHBfcGIsIHNhcC0+c2RwLCBzdHJsZW4oc2FwLT5zZHApLCAwLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisKKyAgICBpbmZtdCA9IGF2X2ZpbmRfaW5wdXRfZm9ybWF0KCJzZHAiKTsKKyAgICBpZiAoIWluZm10KQorICAgICAgICBnb3RvIGZhaWw7CisgICAgc2FwLT5zZHBfY3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOworICAgIGlmICghc2FwLT5zZHBfY3R4KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzYXAtPnNkcF9jdHgtPm1heF9kZWxheSA9IHMtPm1heF9kZWxheTsKKyAgICBzYXAtPnNkcF9jdHgtPnBiICAgICAgICA9ICZzYXAtPnNkcF9wYjsKKyAgICBzYXAtPnNkcF9jdHgtPmludGVycnVwdF9jYWxsYmFjayA9IHMtPmludGVycnVwdF9jYWxsYmFjazsKKworICAgIGlmICgocmV0ID0gZmZfY29weV93aGl0ZWxpc3RzKHNhcC0+c2RwX2N0eCwgcykpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcmV0ID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmc2FwLT5zZHBfY3R4LCAidGVtcC5zZHAiLCBpbmZtdCwgTlVMTCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoc2FwLT5zZHBfY3R4LT5jdHhfZmxhZ3MgJiBBVkZNVENUWF9OT0hFQURFUikKKyAgICAgICAgcy0+Y3R4X2ZsYWdzIHw9IEFWRk1UQ1RYX05PSEVBREVSOworICAgIGZvciAoaSA9IDA7IGkgPCBzYXAtPnNkcF9jdHgtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICBpZiAoIXN0KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgc3QtPmlkID0gaTsKKyAgICAgICAgYXZjb2RlY19jb3B5X2NvbnRleHQoc3QtPmNvZGVjLCBzYXAtPnNkcF9jdHgtPnN0cmVhbXNbaV0tPmNvZGVjKTsKKyAgICAgICAgc3QtPnRpbWVfYmFzZSA9IHNhcC0+c2RwX2N0eC0+c3RyZWFtc1tpXS0+dGltZV9iYXNlOworICAgIH0KKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIHNhcF9yZWFkX2Nsb3NlKHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2FwX2ZldGNoX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgc3RydWN0IFNBUFN0YXRlICpzYXAgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGZkID0gZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKHNhcC0+YW5uX2ZkKTsKKyAgICBpbnQgbiwgcmV0OworICAgIHN0cnVjdCBwb2xsZmQgcCA9IHtmZCwgUE9MTElOLCAwfTsKKyAgICB1aW50OF90IHJlY3ZidWZbUlRQX01BWF9QQUNLRVRfTEVOR1RIXTsKKworICAgIGlmIChzYXAtPmVvZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgbiA9IHBvbGwoJnAsIDEsIDApOworICAgICAgICBpZiAobiA8PSAwIHx8ICEocC5yZXZlbnRzICYgUE9MTElOKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICByZXQgPSBmZnVybF9yZWFkKHNhcC0+YW5uX2ZkLCByZWN2YnVmLCBzaXplb2YocmVjdmJ1ZikpOworICAgICAgICBpZiAocmV0ID49IDgpIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGhhc2ggPSBBVl9SQjE2KCZyZWN2YnVmWzJdKTsKKyAgICAgICAgICAgIC8qIFNob3VsZCBpZGVhbGx5IGNoZWNrIHRoZSBzb3VyY2UgSVAgYWRkcmVzcywgdG9vICovCisgICAgICAgICAgICBpZiAocmVjdmJ1ZlswXSAmIDB4MDQgJiYgaGFzaCA9PSBzYXAtPmhhc2gpIHsKKyAgICAgICAgICAgICAgICAvKiBTdHJlYW0gZGVsZXRpb24gKi8KKyAgICAgICAgICAgICAgICBzYXAtPmVvZiA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldCA9IGF2X3JlYWRfZnJhbWUoc2FwLT5zZHBfY3R4LCBwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmIChzLT5jdHhfZmxhZ3MgJiBBVkZNVENUWF9OT0hFQURFUikgeworICAgICAgICB3aGlsZSAoc2FwLT5zZHBfY3R4LT5uYl9zdHJlYW1zID4gcy0+bmJfc3RyZWFtcykgeworICAgICAgICAgICAgaW50IGkgPSBzLT5uYl9zdHJlYW1zOworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghc3QpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdC0+aWQgPSBpOworICAgICAgICAgICAgYXZjb2RlY19jb3B5X2NvbnRleHQoc3QtPmNvZGVjLCBzYXAtPnNkcF9jdHgtPnN0cmVhbXNbaV0tPmNvZGVjKTsKKyAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UgPSBzYXAtPnNkcF9jdHgtPnN0cmVhbXNbaV0tPnRpbWVfYmFzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitBVklucHV0Rm9ybWF0IGZmX3NhcF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzYXAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTQVAgaW5wdXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IFNBUFN0YXRlKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBzYXBfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gc2FwX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHNhcF9mZXRjaF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gc2FwX3JlYWRfY2xvc2UsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9zYXBlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zYXBlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTA5NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NhcGVuYy5jCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogU2Vzc2lvbiBBbm5vdW5jZW1lbnQgUHJvdG9jb2wgKFJGQyAyOTc0KSBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhbmRvbV9zZWVkLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm5ldHdvcmsuaCIKKyNpbmNsdWRlICJvc19zdXBwb3J0LmgiCisjaW5jbHVkZSAicnRwZW5jX2NoYWluLmgiCisjaW5jbHVkZSAidXJsLmgiCisKK3N0cnVjdCBTQVBTdGF0ZSB7CisgICAgdWludDhfdCAgICAqYW5uOworICAgIGludCAgICAgICAgIGFubl9zaXplOworICAgIFVSTENvbnRleHQgKmFubl9mZDsKKyAgICBpbnQ2NF90ICAgICBsYXN0X3RpbWU7Cit9OworCitzdGF0aWMgaW50IHNhcF93cml0ZV9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgc3RydWN0IFNBUFN0YXRlICpzYXAgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqcnRwY3R4ID0gcy0+c3RyZWFtc1tpXS0+cHJpdl9kYXRhOworICAgICAgICBpZiAoIXJ0cGN0eCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBhdl93cml0ZV90cmFpbGVyKHJ0cGN0eCk7CisgICAgICAgIGF2aW9fY2xvc2UocnRwY3R4LT5wYik7CisgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChydHBjdHgpOworICAgICAgICBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGEgPSBOVUxMOworICAgIH0KKworICAgIGlmIChzYXAtPmxhc3RfdGltZSAmJiBzYXAtPmFubiAmJiBzYXAtPmFubl9mZCkgeworICAgICAgICBzYXAtPmFublswXSB8PSA0OyAvKiBTZXNzaW9uIGRlbGV0aW9uKi8KKyAgICAgICAgZmZ1cmxfd3JpdGUoc2FwLT5hbm5fZmQsIHNhcC0+YW5uLCBzYXAtPmFubl9zaXplKTsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmc2FwLT5hbm4pOworICAgIGlmIChzYXAtPmFubl9mZCkKKyAgICAgICAgZmZ1cmxfY2xvc2Uoc2FwLT5hbm5fZmQpOworICAgIGZmX25ldHdvcmtfY2xvc2UoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYXBfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBzdHJ1Y3QgU0FQU3RhdGUgKnNhcCA9IHMtPnByaXZfZGF0YTsKKyAgICBjaGFyIGhvc3RbMTAyNF0sIHBhdGhbMTAyNF0sIHVybFsxMDI0XSwgYW5ub3VuY2VfYWRkcls1MF0gPSAiIjsKKyAgICBjaGFyICpvcHRpb25fbGlzdDsKKyAgICBpbnQgcG9ydCA9IDk4NzUsIGJhc2VfcG9ydCA9IDUwMDQsIGksIHBvcyA9IDAsIHNhbWVfcG9ydCA9IDAsIHR0bCA9IDI1NTsKKyAgICBBVkZvcm1hdENvbnRleHQgKipjb250ZXh0cyA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgbG9jYWxhZGRyOworICAgIHNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKGxvY2FsYWRkcik7CisgICAgaW50IHVkcF9mZDsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSogdGl0bGUgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInRpdGxlIiwgTlVMTCwgMCk7CisKKyAgICBpZiAoIWZmX25ldHdvcmtfaW5pdCgpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgLyogZXh0cmFjdCBob3N0bmFtZSBhbmQgcG9ydCAqLworICAgIGF2X3VybF9zcGxpdChOVUxMLCAwLCBOVUxMLCAwLCBob3N0LCBzaXplb2YoaG9zdCksICZiYXNlX3BvcnQsCisgICAgICAgICAgICAgICAgIHBhdGgsIHNpemVvZihwYXRoKSwgcy0+ZmlsZW5hbWUpOworICAgIGlmIChiYXNlX3BvcnQgPCAwKQorICAgICAgICBiYXNlX3BvcnQgPSA1MDA0OworCisgICAgLyogc2VhcmNoIGZvciBvcHRpb25zICovCisgICAgb3B0aW9uX2xpc3QgPSBzdHJyY2hyKHBhdGgsICc/Jyk7CisgICAgaWYgKG9wdGlvbl9saXN0KSB7CisgICAgICAgIGNoYXIgYnVmWzUwXTsKKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImFubm91bmNlX3BvcnQiLCBvcHRpb25fbGlzdCkpIHsKKyAgICAgICAgICAgIHBvcnQgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgInNhbWVfcG9ydCIsIG9wdGlvbl9saXN0KSkgeworICAgICAgICAgICAgc2FtZV9wb3J0ID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0dGwiLCBvcHRpb25fbGlzdCkpIHsKKyAgICAgICAgICAgIHR0bCA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAiYW5ub3VuY2VfYWRkciIsIG9wdGlvbl9saXN0KSkgeworICAgICAgICAgICAgYXZfc3RybGNweShhbm5vdW5jZV9hZGRyLCBidWYsIHNpemVvZihhbm5vdW5jZV9hZGRyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWFubm91bmNlX2FkZHJbMF0pIHsKKyAgICAgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzID0geyAwIH0sICphaSA9IE5VTEw7CisgICAgICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyAgICAgICAgaWYgKGdldGFkZHJpbmZvKGhvc3QsIE5VTEwsICZoaW50cywgJmFpKSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byByZXNvbHZlICVzXG4iLCBob3N0KTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICAgICAgICAvKiBBbHNvIGtub3duIGFzIHNhcC5tY2FzdC5uZXQgKi8KKyAgICAgICAgICAgIGF2X3N0cmxjcHkoYW5ub3VuY2VfYWRkciwgIjIyNC4yLjEyNy4yNTQiLCBzaXplb2YoYW5ub3VuY2VfYWRkcikpOworI2lmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX0lONgorICAgICAgICB9IGVsc2UgaWYgKGFpLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgICAgIC8qIFdpdGggSVB2NiwgeW91IGNhbiB1c2UgdGhlIHNhbWUgZGVzdGluYXRpb24gaW4gbWFueSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAqIG11bHRpY2FzdCBzdWJuZXRzLCB0byBjaG9vc2UgaG93IGZhciB5b3Ugd2FudCBpdCByb3V0ZWQuCisgICAgICAgICAgICAgKiBUaGlzIG9uZSBpcyBpbnRlbmRlZCB0byBiZSByb3V0ZWQgZ2xvYmFsbHkuICovCisgICAgICAgICAgICBhdl9zdHJsY3B5KGFubm91bmNlX2FkZHIsICJmZjBlOjoyOjdmZmUiLCBzaXplb2YoYW5ub3VuY2VfYWRkcikpOworI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmVlYWRkcmluZm8oYWkpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkhvc3QgJXMgcmVzb2x2ZWQgdG8gdW5zdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZHJlc3MgZmFtaWx5XG4iLCBob3N0KTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBmcmVlYWRkcmluZm8oYWkpOworICAgIH0KKworICAgIGNvbnRleHRzID0gYXZfbWFsbG9jel9hcnJheShzLT5uYl9zdHJlYW1zLCBzaXplb2YoQVZGb3JtYXRDb250ZXh0KikpOworICAgIGlmICghY29udGV4dHMpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHMtPnN0YXJ0X3RpbWVfcmVhbHRpbWUgPT0gMCAgfHwgIHMtPnN0YXJ0X3RpbWVfcmVhbHRpbWUgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHMtPnN0YXJ0X3RpbWVfcmVhbHRpbWUgPSBhdl9nZXR0aW1lKCk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBVUkxDb250ZXh0ICpmZDsKKworICAgICAgICBmZl91cmxfam9pbih1cmwsIHNpemVvZih1cmwpLCAicnRwIiwgTlVMTCwgaG9zdCwgYmFzZV9wb3J0LAorICAgICAgICAgICAgICAgICAgICAiP3R0bD0lZCIsIHR0bCk7CisgICAgICAgIGlmICghc2FtZV9wb3J0KQorICAgICAgICAgICAgYmFzZV9wb3J0ICs9IDI7CisgICAgICAgIHJldCA9IGZmdXJsX29wZW4oJmZkLCB1cmwsIEFWSU9fRkxBR19XUklURSwgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBmZl9ydHBfY2hhaW5fbXV4X29wZW4oJmNvbnRleHRzW2ldLCBzLCBzLT5zdHJlYW1zW2ldLCBmZCwgMCwgaSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGEgPSBjb250ZXh0c1tpXTsKKyAgICAgICAgcy0+c3RyZWFtc1tpXS0+dGltZV9iYXNlID0gY29udGV4dHNbaV0tPnN0cmVhbXNbMF0tPnRpbWVfYmFzZTsKKyAgICAgICAgYXZfc3RybGNweShjb250ZXh0c1tpXS0+ZmlsZW5hbWUsIHVybCwgc2l6ZW9mKGNvbnRleHRzW2ldLT5maWxlbmFtZSkpOworICAgIH0KKworICAgIGlmIChzLT5uYl9zdHJlYW1zID4gMCAmJiB0aXRsZSkKKyAgICAgICAgYXZfZGljdF9zZXQoJmNvbnRleHRzWzBdLT5tZXRhZGF0YSwgInRpdGxlIiwgdGl0bGUtPnZhbHVlLCAwKTsKKworICAgIGZmX3VybF9qb2luKHVybCwgc2l6ZW9mKHVybCksICJ1ZHAiLCBOVUxMLCBhbm5vdW5jZV9hZGRyLCBwb3J0LAorICAgICAgICAgICAgICAgICI/dHRsPSVkJmNvbm5lY3Q9MSIsIHR0bCk7CisgICAgcmV0ID0gZmZ1cmxfb3Blbigmc2FwLT5hbm5fZmQsIHVybCwgQVZJT19GTEFHX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCk7CisgICAgaWYgKHJldCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICB1ZHBfZmQgPSBmZnVybF9nZXRfZmlsZV9oYW5kbGUoc2FwLT5hbm5fZmQpOworICAgIGlmIChnZXRzb2NrbmFtZSh1ZHBfZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmbG9jYWxhZGRyLCAmYWRkcmxlbikpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChsb2NhbGFkZHIuc3NfZmFtaWx5ICE9IEFGX0lORVQKKyNpZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjYKKyAgICAgICAgJiYgbG9jYWxhZGRyLnNzX2ZhbWlseSAhPSBBRl9JTkVUNgorI2VuZGlmCisgICAgICAgICkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wgZmFtaWx5XG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHNhcC0+YW5uX3NpemUgPSA4MTkyOworICAgIHNhcC0+YW5uID0gYXZfbWFsbG9jeihzYXAtPmFubl9zaXplKTsKKyAgICBpZiAoIXNhcC0+YW5uKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzYXAtPmFubltwb3NdID0gKDEgPDwgNSk7CisjaWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42CisgICAgaWYgKGxvY2FsYWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVDYpCisgICAgICAgIHNhcC0+YW5uW3Bvc10gfD0gMHgxMDsKKyNlbmRpZgorICAgIHBvcysrOworICAgIHNhcC0+YW5uW3BvcysrXSA9IDA7IC8qIEF1dGhlbnRpY2F0aW9uIGxlbmd0aCAqLworICAgIEFWX1dCMTYoJnNhcC0+YW5uW3Bvc10sIGF2X2dldF9yYW5kb21fc2VlZCgpKTsKKyAgICBwb3MgKz0gMjsKKyAgICBpZiAobG9jYWxhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICAgIG1lbWNweSgmc2FwLT5hbm5bcG9zXSwgJigoc3RydWN0IHNvY2thZGRyX2luKikmbG9jYWxhZGRyKS0+c2luX2FkZHIsCisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgICAgICAgcG9zICs9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisjaWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KCZzYXAtPmFubltwb3NdLCAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42KikmbG9jYWxhZGRyKS0+c2luNl9hZGRyLAorICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworICAgICAgICBwb3MgKz0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CisjZW5kaWYKKyAgICB9CisKKyAgICBhdl9zdHJsY3B5KCZzYXAtPmFubltwb3NdLCAiYXBwbGljYXRpb24vc2RwIiwgc2FwLT5hbm5fc2l6ZSAtIHBvcyk7CisgICAgcG9zICs9IHN0cmxlbigmc2FwLT5hbm5bcG9zXSkgKyAxOworCisgICAgaWYgKGF2X3NkcF9jcmVhdGUoY29udGV4dHMsIHMtPm5iX3N0cmVhbXMsICZzYXAtPmFubltwb3NdLAorICAgICAgICAgICAgICAgICAgICAgIHNhcC0+YW5uX3NpemUgLSBwb3MpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgYXZfZnJlZXAoJmNvbnRleHRzKTsKKyAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJTRFA6XG4lc1xuIiwgJnNhcC0+YW5uW3Bvc10pOworICAgIHBvcyArPSBzdHJsZW4oJnNhcC0+YW5uW3Bvc10pOworICAgIHNhcC0+YW5uX3NpemUgPSBwb3M7CisKKyAgICBpZiAoc2FwLT5hbm5fc2l6ZSA+IHNhcC0+YW5uX2ZkLT5tYXhfcGFja2V0X3NpemUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkFubm91bmNlbWVudCB0b28gbGFyZ2UgdG8gc2VuZCBpbiBvbmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2V0XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2ZyZWUoY29udGV4dHMpOworICAgIHNhcF93cml0ZV9jbG9zZShzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNhcF93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqcnRwY3R4OworICAgIHN0cnVjdCBTQVBTdGF0ZSAqc2FwID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3Qgbm93ID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworCisgICAgaWYgKCFzYXAtPmxhc3RfdGltZSB8fCBub3cgLSBzYXAtPmxhc3RfdGltZSA+IDUwMDAwMDApIHsKKyAgICAgICAgaW50IHJldCA9IGZmdXJsX3dyaXRlKHNhcC0+YW5uX2ZkLCBzYXAtPmFubiwgc2FwLT5hbm5fc2l6ZSk7CisgICAgICAgIC8qIERvbid0IGFib3J0IGV2ZW4gaWYgd2UgZ2V0ICJEZXN0aW5hdGlvbiB1bnJlYWNoYWJsZSIgKi8KKyAgICAgICAgaWYgKHJldCA8IDAgJiYgcmV0ICE9IEFWRVJST1IoRUNPTk5SRUZVU0VEKSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHNhcC0+bGFzdF90aW1lID0gbm93OworICAgIH0KKyAgICBydHBjdHggPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl93cml0ZV9jaGFpbmVkKHJ0cGN0eCwgMCwgcGt0LCBzLCAwKTsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfc2FwX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJzYXAiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTQVAgb3V0cHV0IiksCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKHN0cnVjdCBTQVBTdGF0ZSksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IHNhcF93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gc2FwX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBzYXBfd3JpdGVfY2xvc2UsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9GSUxFIHwgQVZGTVRfR0xPQkFMSEVBREVSLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9zYXVjZS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NhdWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzNDdiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zYXVjZS5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogU0FVQ0UgaGVhZGVyIHBhcnNlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTQVVDRSBoZWFkZXIgcGFyc2VyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAic2F1Y2UuaCIKKworaW50IGZmX3NhdWNlX3JlYWQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgdWludDY0X3QgKmZzaXplLCBpbnQgKmdvdF93aWR0aCwgaW50IGdldF9oZWlnaHQpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gYXZjdHgtPnBiOworICAgIGNoYXIgYnVmWzM2XTsKKyAgICBpbnQgZGF0YXR5cGUsIGZpbGV0eXBlLCB0MSwgdDIsIG5iX2NvbW1lbnRzOworICAgIHVpbnQ2NF90IHN0YXJ0X3BvcyA9IGF2aW9fc2l6ZShwYikgLSAxMjg7CisKKyAgICBhdmlvX3NlZWsocGIsIHN0YXJ0X3BvcywgU0VFS19TRVQpOworICAgIGlmIChhdmlvX3JlYWQocGIsIGJ1ZiwgNykgIT0gNykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChtZW1jbXAoYnVmLCAiU0FVQ0UwMCIsIDcpKQorICAgICAgICByZXR1cm4gLTE7CisKKyNkZWZpbmUgR0VUX1NBVUNFX01FVEEobmFtZSxzaXplKSBcCisgICAgaWYgKGF2aW9fcmVhZChwYiwgYnVmLCBzaXplKSA9PSBzaXplICYmIGJ1ZlswXSkgeyBcCisgICAgICAgIGJ1ZltzaXplXSA9IDA7IFwKKyAgICAgICAgYXZfZGljdF9zZXQoJmF2Y3R4LT5tZXRhZGF0YSwgbmFtZSwgYnVmLCAwKTsgXAorICAgIH0KKworICAgIEdFVF9TQVVDRV9NRVRBKCJ0aXRsZSIsICAgICAzNSkKKyAgICBHRVRfU0FVQ0VfTUVUQSgiYXJ0aXN0IiwgICAgMjApCisgICAgR0VUX1NBVUNFX01FVEEoInB1Ymxpc2hlciIsIDIwKQorICAgIEdFVF9TQVVDRV9NRVRBKCJkYXRlIiwgICAgICA4KQorICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgZGF0YXR5cGUgICAgPSBhdmlvX3I4KHBiKTsKKyAgICBmaWxldHlwZSAgICA9IGF2aW9fcjgocGIpOworICAgIHQxICAgICAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICB0MiAgICAgICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgbmJfY29tbWVudHMgPSBhdmlvX3I4KHBiKTsKKyAgICBhdmlvX3NraXAocGIsIDEpOyAvKiBmbGFncyAqLworICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgR0VUX1NBVUNFX01FVEEoImVuY29kZXIiLCAgIDIyKTsKKworICAgIGlmIChnb3Rfd2lkdGggJiYgZGF0YXR5cGUgJiYgZmlsZXR5cGUpIHsKKyAgICAgICAgaWYgKChkYXRhdHlwZSA9PSAxICYmIGZpbGV0eXBlIDw9MikgfHwgKGRhdGF0eXBlID09IDUgJiYgZmlsZXR5cGUgPT0gMjU1KSB8fCBkYXRhdHlwZSA9PSA2KSB7CisgICAgICAgICAgICBpZiAodDEpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+c3RyZWFtc1swXS0+Y29kZWMtPndpZHRoID0gdDE8PDM7CisgICAgICAgICAgICAgICAgKmdvdF93aWR0aCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0X2hlaWdodCAmJiB0MikKKyAgICAgICAgICAgICAgICBhdmN0eC0+c3RyZWFtc1swXS0+Y29kZWMtPmhlaWdodCA9IHQyPDw0OworICAgICAgICB9IGVsc2UgaWYgKGRhdGF0eXBlID09IDUpIHsKKyAgICAgICAgICAgIGlmIChmaWxldHlwZSkgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5zdHJlYW1zWzBdLT5jb2RlYy0+d2lkdGggPSAoZmlsZXR5cGUgPT0gMSA/IHQxIDogZmlsZXR5cGUpIDw8IDQ7CisgICAgICAgICAgICAgICAgKmdvdF93aWR0aCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0X2hlaWdodCAmJiB0MikKKyAgICAgICAgICAgICAgICBhdmN0eC0+c3RyZWFtc1swXS0+Y29kZWMtPmhlaWdodCA9IHQyPDw0OworICAgICAgICB9CisgICAgfQorCisgICAgKmZzaXplIC09IDEyODsKKworICAgIGlmIChuYl9jb21tZW50cyA+IDApIHsKKyAgICAgICAgYXZpb19zZWVrKHBiLCBzdGFydF9wb3MgLSA2NCpuYl9jb21tZW50cyAtIDUsIFNFRUtfU0VUKTsKKyAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgYnVmLCA1KSA9PSA1ICYmICFtZW1jbXAoYnVmLCAiQ09NTlQiLCA1KSkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBjaGFyICpzdHIgPSBhdl9tYWxsb2MoNjUqbmJfY29tbWVudHMgKyAxKTsKKyAgICAgICAgICAgICpmc2l6ZSAtPSA2NCpuYl9jb21tZW50cyArIDU7CisgICAgICAgICAgICBpZiAoIXN0cikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb21tZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgc3RyICsgNjUqaSwgNjQpICE9IDY0KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzdHJbNjUqaSArIDY0XSA9ICdcbic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJbNjUqaV0gPSAwOworICAgICAgICAgICAgYXZfZGljdF9zZXQoJmF2Y3R4LT5tZXRhZGF0YSwgImNvbW1lbnQiLCBzdHIsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NhdWNlLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvc2F1Y2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmE5YWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NhdWNlLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIFNBVUNFIGhlYWRlciBwYXJzZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU0FVQ0UgaGVhZGVyIHBhcnNlcgorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfU0FVQ0VfSAorI2RlZmluZSBBVkZPUk1BVF9TQVVDRV9ICisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCisvKioKKyAqIEBwYXJhbSBhdmN0eCBBVkZvcm1hdENvbnRleHQKKyAqIEBwYXJhbVtvdXRdIGZzaXplIHJldHVybiBsZW5ndGggb2YgZmlsZSwgbGVzcyBTQVVDRSBoZWFkZXIKKyAqIEBwYXJhbVtvdXRdIGdvdF93aWR0aCBzZXQgdG8gbm9uLXplcm8gaWYgU0FVQ0UgaGVhZGVyIHJlcG9ydGVkIGhlaWdodAorICogQHBhcmFtIGdldF9oZWlnaHQgVGVsbCBTQVVDRSBoZWFkZXIgdG8gcGFyc2UgaGVpZ2h0CisgKi8KK2ludCBmZl9zYXVjZV9yZWFkKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIHVpbnQ2NF90ICpmc2l6ZSwgaW50ICpnb3Rfd2lkdGgsIGludCBnZXRfaGVpZ2h0KTsKKworI2VuZGlmIC8qIEFWRk9STUFUX1NBVUNFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9zYmdkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zYmdkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjgyMmZiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NiZ2RlYy5jCkBAIC0wLDAgKzEsMTUxMiBAQAorLyoKKyAqIFNCRyAoU0JhR2VuKSBmaWxlIGZvcm1hdCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lX2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFNCR19TQ0FMRSAoMSA8PCAxNikKKyNkZWZpbmUgREFZICgyNCAqIDYwICogNjApCisjZGVmaW5lIERBWV9UUyAoKGludDY0X3QpREFZICogQVZfVElNRV9CQVNFKQorCitzdHJ1Y3Qgc2JnX2RlbXV4ZXIgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKyAgICBpbnQgbWF4X2ZpbGVfc2l6ZTsKK307CisKK3N0cnVjdCBzYmdfc3RyaW5nIHsKKyAgICBjaGFyICpzOworICAgIGNoYXIgKmU7Cit9OworCitlbnVtIHNiZ19mYWRlX3R5cGUgeworICAgIFNCR19GQURFX1NJTEVOQ0UgPSAwLAorICAgIFNCR19GQURFX1NBTUUgICAgPSAxLAorICAgIFNCR19GQURFX0FEQVBUICAgPSAzLAorfTsKKworc3RydWN0IHNiZ19mYWRlIHsKKyAgICBpbnQ4X3QgaW4sIG91dCwgc2xpZGU7Cit9OworCitlbnVtIHNiZ19zeW50aF90eXBlIHsKKyAgICBTQkdfVFlQRV9OT05FLAorICAgIFNCR19UWVBFX1NJTkUsCisgICAgU0JHX1RZUEVfTk9JU0UsCisgICAgU0JHX1RZUEVfQkVMTCwKKyAgICBTQkdfVFlQRV9NSVgsCisgICAgU0JHX1RZUEVfU1BJTiwKK307CisKKy8qIGJlbGw6IGZyZXEgY29uc3RhbnQsIGFtcGwgZGVjcmVhc2VzIGV4cG9uZW50aWFsbHksIGNhbiBiZSBhcHByb3ggbGluICovCisKK3N0cnVjdCBzYmdfdGltZXN0YW1wIHsKKyAgICBpbnQ2NF90IHQ7CisgICAgY2hhciB0eXBlOyAvKiAwIGZvciByZWxhdGl2ZSwgJ04nIGZvciBub3csICdUJyBmb3IgYWJzb2x1dGUgKi8KK307CisKK3N0cnVjdCBzYmdfc2NyaXB0X2RlZmluaXRpb24geworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IG5hbWVfbGVuOworICAgIGludCBlbGVtZW50cywgbmJfZWxlbWVudHM7CisgICAgY2hhciB0eXBlOyAvKiAnUycgb3IgJ0InICovCit9OworCitzdHJ1Y3Qgc2JnX3NjcmlwdF9zeW50aCB7CisgICAgaW50IGNhcnJpZXI7CisgICAgaW50IGJlYXQ7CisgICAgaW50IHZvbDsKKyAgICBlbnVtIHNiZ19zeW50aF90eXBlIHR5cGU7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IGwsIHI7CisgICAgfSByZWY7Cit9OworCitzdHJ1Y3Qgc2JnX3NjcmlwdF90c2VxIHsKKyAgICBzdHJ1Y3Qgc2JnX3RpbWVzdGFtcCB0czsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBuYW1lX2xlbjsKKyAgICBpbnQgbG9jazsKKyAgICBzdHJ1Y3Qgc2JnX2ZhZGUgZmFkZTsKK307CisKK3N0cnVjdCBzYmdfc2NyaXB0X2V2ZW50IHsKKyAgICBpbnQ2NF90IHRzOworICAgIGludDY0X3QgdHNfaW50LCB0c190cmFucywgdHNfbmV4dDsKKyAgICBpbnQgZWxlbWVudHMsIG5iX2VsZW1lbnRzOworICAgIHN0cnVjdCBzYmdfZmFkZSBmYWRlOworfTsKKworc3RydWN0IHNiZ19zY3JpcHQgeworICAgIHN0cnVjdCBzYmdfc2NyaXB0X2RlZmluaXRpb24gKmRlZjsKKyAgICBzdHJ1Y3Qgc2JnX3NjcmlwdF9zeW50aCAqc3ludGg7CisgICAgc3RydWN0IHNiZ19zY3JpcHRfdHNlcSAqdHNlcTsKKyAgICBzdHJ1Y3Qgc2JnX3NjcmlwdF90c2VxICpibG9ja190c2VxOworICAgIHN0cnVjdCBzYmdfc2NyaXB0X2V2ZW50ICpldmVudHM7CisgICAgaW50IG5iX2RlZjsKKyAgICBpbnQgbmJfdHNlcTsKKyAgICBpbnQgbmJfZXZlbnRzOworICAgIGludCBuYl9zeW50aDsKKyAgICBpbnQ2NF90IHN0YXJ0X3RzOworICAgIGludDY0X3QgZW5kX3RzOworICAgIGludDY0X3Qgb3B0X2ZhZGVfdGltZTsKKyAgICBpbnQ2NF90IG9wdF9kdXJhdGlvbjsKKyAgICBjaGFyICpvcHRfbWl4OworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICB1aW50OF90IG9wdF9zdGFydF9hdF9maXJzdDsKKyAgICB1aW50OF90IG9wdF9lbmRfYXRfbGFzdDsKK307CisKK3N0cnVjdCBzYmdfcGFyc2VyIHsKKyAgICB2b2lkICpsb2c7CisgICAgY2hhciAqc2NyaXB0LCAqZW5kOworICAgIGNoYXIgKmN1cnNvcjsKKyAgICBzdHJ1Y3Qgc2JnX3NjcmlwdCBzY3M7CisgICAgc3RydWN0IHNiZ190aW1lc3RhbXAgY3VycmVudF90aW1lOworICAgIGludCBuYl9ibG9ja190c2VxOworICAgIGludCBuYl9kZWZfbWF4LCBuYl9zeW50aF9tYXgsIG5iX3RzZXFfbWF4LCBuYl9ibG9ja190c2VxX21heDsKKyAgICBpbnQgbGluZV9ubzsKKyAgICBjaGFyIGVycl9tc2dbMTI4XTsKK307CisKK2VudW0gd3NfaW50ZXJ2YWxfdHlwZSB7CisgICAgV1NfU0lORSAgPSBNS1RBRygnUycsJ0knLCdOJywnRScpLAorICAgIFdTX05PSVNFID0gTUtUQUcoJ04nLCdPJywnSScsJ1MnKSwKK307CisKK3N0cnVjdCB3c19pbnRlcnZhbCB7CisgICAgaW50NjRfdCB0czEsIHRzMjsKKyAgICBlbnVtIHdzX2ludGVydmFsX3R5cGUgdHlwZTsKKyAgICB1aW50MzJfdCBjaGFubmVsczsKKyAgICBpbnQzMl90IGYxLCBmMjsKKyAgICBpbnQzMl90IGExLCBhMjsKKyAgICB1aW50MzJfdCBwaGk7Cit9OworCitzdHJ1Y3Qgd3NfaW50ZXJ2YWxzIHsKKyAgICBzdHJ1Y3Qgd3NfaW50ZXJ2YWwgKmludGVyOworICAgIGludCBuYl9pbnRlcjsKKyAgICBpbnQgbWF4X2ludGVyOworfTsKKworc3RhdGljIHZvaWQgKmFsbG9jX2FycmF5X2VsZW0odm9pZCAqKmFycmF5LCBzaXplX3QgZWxzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzaXplLCBpbnQgKm1heF9zaXplKQoreworICAgIHZvaWQgKnJldDsKKworICAgIGlmICgqc2l6ZSA9PSAqbWF4X3NpemUpIHsKKyAgICAgICAgaW50IG0gPSBGRk1BWCgzMiwgRkZNSU4oKm1heF9zaXplLCBJTlRfTUFYIC8gMikgKiAyKTsKKyAgICAgICAgaWYgKCpzaXplID49IG0pCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgKmFycmF5ID0gYXZfcmVhbGxvY19mKCphcnJheSwgbSwgZWxzaXplKTsKKyAgICAgICAgaWYgKCEqYXJyYXkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgKm1heF9zaXplID0gbTsKKyAgICB9CisgICAgcmV0ID0gKGNoYXIgKikqYXJyYXkgKyBlbHNpemUgKiAqc2l6ZTsKKyAgICBtZW1zZXQocmV0LCAwLCBlbHNpemUpOworICAgICgqc2l6ZSkrKzsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN0cl90b190aW1lKGNvbnN0IGNoYXIgKnN0ciwgaW50NjRfdCAqcnRpbWUpCit7CisgICAgY29uc3QgY2hhciAqY3VyID0gc3RyOworICAgIGNoYXIgKmVuZDsKKyAgICBpbnQgaG91cnMsIG1pbnV0ZXM7CisgICAgZG91YmxlIHNlY29uZHMgPSAwOworCisgICAgaWYgKCpjdXIgPCAnMCcgfHwgKmN1ciA+ICc5JykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaG91cnMgPSBzdHJ0b2woY3VyLCAmZW5kLCAxMCk7CisgICAgaWYgKGVuZCA9PSBjdXIgfHwgKmVuZCAhPSAnOicgfHwgZW5kWzFdIDwgJzAnIHx8IGVuZFsxXSA+ICc5JykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY3VyID0gZW5kICsgMTsKKyAgICBtaW51dGVzID0gc3RydG9sKGN1ciwgJmVuZCwgMTApOworICAgIGlmIChlbmQgPT0gY3VyKQorICAgICAgICByZXR1cm4gMDsKKyAgICBjdXIgPSBlbmQ7CisgICAgaWYgKCplbmQgPT0gJzonKXsKKyAgICAgICAgc2Vjb25kcyA9IHN0cnRvZChjdXIgKyAxLCAmZW5kKTsKKyAgICAgICAgaWYgKGVuZCA+IGN1ciArIDEpCisgICAgICAgICAgICBjdXIgPSBlbmQ7CisgICAgfQorICAgICpydGltZSA9IChob3VycyAqIDM2MDAgKyBtaW51dGVzICogNjAgKyBzZWNvbmRzKSAqIEFWX1RJTUVfQkFTRTsKKyAgICByZXR1cm4gY3VyIC0gc3RyOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19zcGFjZShjaGFyIGMpCit7CisgICAgcmV0dXJuIGMgPT0gJyAnICB8fCBjID09ICdcdCcgfHwgYyA9PSAnXHInOworfQorCitzdGF0aWMgaW5saW5lIGludCBzY2FsZV9kb3VibGUodm9pZCAqbG9nLCBkb3VibGUgZCwgZG91YmxlIG0sIGludCAqcikKK3sKKyAgICBtICo9IGQgKiBTQkdfU0NBTEU7CisgICAgaWYgKG0gPCBJTlRfTUlOIHx8IG0gPj0gSU5UX01BWCkgeworICAgICAgICBpZiAobG9nKQorICAgICAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX0VSUk9SLCAiJWcgaXMgdG9vIGxhcmdlXG4iLCBkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRURPTSk7CisgICAgfQorICAgICpyID0gbTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZXhfc3BhY2Uoc3RydWN0IHNiZ19wYXJzZXIgKnApCit7CisgICAgY2hhciAqYyA9IHAtPmN1cnNvcjsKKworICAgIHdoaWxlIChwLT5jdXJzb3IgPCBwLT5lbmQgJiYgaXNfc3BhY2UoKnAtPmN1cnNvcikpCisgICAgICAgIHAtPmN1cnNvcisrOworICAgIHJldHVybiBwLT5jdXJzb3IgPiBjOworfQorCitzdGF0aWMgaW50IGxleF9jaGFyKHN0cnVjdCBzYmdfcGFyc2VyICpwLCBjaGFyIGMpCit7CisgICAgaW50IHIgPSBwLT5jdXJzb3IgPCBwLT5lbmQgJiYgKnAtPmN1cnNvciA9PSBjOworCisgICAgcC0+Y3Vyc29yICs9IHI7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgbGV4X2RvdWJsZShzdHJ1Y3Qgc2JnX3BhcnNlciAqcCwgZG91YmxlICpyKQoreworICAgIGRvdWJsZSBkOworICAgIGNoYXIgKmVuZDsKKworICAgIGlmIChwLT5jdXJzb3IgPT0gcC0+ZW5kIHx8IGlzX3NwYWNlKCpwLT5jdXJzb3IpIHx8ICpwLT5jdXJzb3IgPT0gJ1xuJykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZCA9IHN0cnRvZChwLT5jdXJzb3IsICZlbmQpOworICAgIGlmIChlbmQgPiBwLT5jdXJzb3IpIHsKKyAgICAgICAgKnIgPSBkOworICAgICAgICBwLT5jdXJzb3IgPSBlbmQ7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZXhfZml4ZWQoc3RydWN0IHNiZ19wYXJzZXIgKnAsIGNvbnN0IGNoYXIgKnQsIGludCBsKQoreworICAgIGlmIChwLT5lbmQgLSBwLT5jdXJzb3IgPCBsIHx8IG1lbWNtcChwLT5jdXJzb3IsIHQsIGwpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBwLT5jdXJzb3IgKz0gbDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsZXhfbGluZV9lbmQoc3RydWN0IHNiZ19wYXJzZXIgKnApCit7CisgICAgaWYgKHAtPmN1cnNvciA8IHAtPmVuZCAmJiAqcC0+Y3Vyc29yID09ICcjJykgeworICAgICAgICBwLT5jdXJzb3IrKzsKKyAgICAgICAgd2hpbGUgKHAtPmN1cnNvciA8IHAtPmVuZCAmJiAqcC0+Y3Vyc29yICE9ICdcbicpCisgICAgICAgICAgICBwLT5jdXJzb3IrKzsKKyAgICB9CisgICAgaWYgKHAtPmN1cnNvciA9PSBwLT5lbmQpCisgICAgICAgIC8qIHNpbXVsYXRlIGZpbmFsIExGIGZvciBmaWxlcyBsYWNraW5nIGl0ICovCisgICAgICAgIHJldHVybiAxOworICAgIGlmICgqcC0+Y3Vyc29yICE9ICdcbicpCisgICAgICAgIHJldHVybiAwOworICAgIHAtPmN1cnNvcisrOworICAgIHAtPmxpbmVfbm8rKzsKKyAgICBsZXhfc3BhY2UocCk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbGV4X3dzd29yZChzdHJ1Y3Qgc2JnX3BhcnNlciAqcCwgc3RydWN0IHNiZ19zdHJpbmcgKnJzKQoreworICAgIGNoYXIgKnMgPSBwLT5jdXJzb3IsICpjID0gczsKKworICAgIGlmIChzID09IHAtPmVuZCB8fCAqcyA9PSAnXG4nKQorICAgICAgICByZXR1cm4gMDsKKyAgICB3aGlsZSAoYyA8IHAtPmVuZCAmJiAqYyAhPSAnXG4nICYmICFpc19zcGFjZSgqYykpCisgICAgICAgIGMrKzsKKyAgICBycy0+cyA9IHM7CisgICAgcnMtPmUgPSBwLT5jdXJzb3IgPSBjOworICAgIGxleF9zcGFjZShwKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsZXhfbmFtZShzdHJ1Y3Qgc2JnX3BhcnNlciAqcCwgc3RydWN0IHNiZ19zdHJpbmcgKnJzKQoreworICAgIGNoYXIgKnMgPSBwLT5jdXJzb3IsICpjID0gczsKKworICAgIHdoaWxlIChjIDwgcC0+ZW5kICYmICgoKmMgPj0gJ2EnICYmICpjIDw9ICd6JykgfHwgKCpjID49ICdBJyAmJiAqYyA8PSAnWicpCisgICAgICAgICAgIHx8ICgqYyA+PSAnMCcgJiYgKmMgPD0gJzknKSB8fCAqYyA9PSAnXycgfHwgKmMgPT0gJy0nKSkKKyAgICAgICAgYysrOworICAgIGlmIChjID09IHMpCisgICAgICAgIHJldHVybiAwOworICAgIHJzLT5zID0gczsKKyAgICBycy0+ZSA9IHAtPmN1cnNvciA9IGM7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbGV4X3RpbWUoc3RydWN0IHNiZ19wYXJzZXIgKnAsIGludDY0X3QgKnJ0KQoreworICAgIGludCByID0gc3RyX3RvX3RpbWUocC0+Y3Vyc29yLCBydCk7CisgICAgcC0+Y3Vyc29yICs9IHI7CisgICAgcmV0dXJuIHIgPiAwOworfQorCisjZGVmaW5lIEZPUldBUkRfRVJST1IoYykgXAorICAgIGRvIHsgXAorICAgICAgICBpbnQgZXJyY29kZSA9IGM7IFwKKyAgICAgICAgaWYgKGVycmNvZGUgPD0gMCkgXAorICAgICAgICAgICAgcmV0dXJuIGVycmNvZGUgPyBlcnJjb2RlIDogQVZFUlJPUl9JTlZBTElEREFUQTsgXAorICAgIH0gd2hpbGUoMCk7CisKK3N0YXRpYyBpbnQgcGFyc2VfaW1tZWRpYXRlKHN0cnVjdCBzYmdfcGFyc2VyICpwKQoreworICAgIHNucHJpbnRmKHAtPmVycl9tc2csIHNpemVvZihwLT5lcnJfbXNnKSwKKyAgICAgICAgICAgICAiaW1tZWRpYXRlIHNlcXVlbmNlcyBub3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworfQorCitzdGF0aWMgaW50IHBhcnNlX3ByZXByb2dyYW1tZWQoc3RydWN0IHNiZ19wYXJzZXIgKnApCit7CisgICAgc25wcmludGYocC0+ZXJyX21zZywgc2l6ZW9mKHAtPmVycl9tc2cpLAorICAgICAgICAgICAgICJwcmVwcm9ncmFtbWVkIHNlcXVlbmNlcyBub3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworfQorCitzdGF0aWMgaW50IHBhcnNlX29wdGFyZyhzdHJ1Y3Qgc2JnX3BhcnNlciAqcCwgY2hhciBvLCBzdHJ1Y3Qgc2JnX3N0cmluZyAqcikKK3sKKyAgICBpZiAoIWxleF93c3dvcmQocCwgcikpIHsKKyAgICAgICAgc25wcmludGYocC0+ZXJyX21zZywgc2l6ZW9mKHAtPmVycl9tc2cpLAorICAgICAgICAgICAgICAgICAib3B0aW9uICclYycgcmVxdWlyZXMgYW4gYXJndW1lbnQiLCBvKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMoc3RydWN0IHNiZ19wYXJzZXIgKnApCit7CisgICAgc3RydWN0IHNiZ19zdHJpbmcgb3N0ciwgb2FyZzsKKyAgICBjaGFyIG1vZGUgPSAwOworICAgIGludCByOworICAgIGNoYXIgKnRwdHI7CisgICAgZG91YmxlIHY7CisKKyAgICBpZiAocC0+Y3Vyc29yID09IHAtPmVuZCB8fCAqcC0+Y3Vyc29yICE9ICctJykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgd2hpbGUgKGxleF9jaGFyKHAsICctJykgJiYgbGV4X3dzd29yZChwLCAmb3N0cikpIHsKKyAgICAgICAgZm9yICg7IG9zdHIucyA8IG9zdHIuZTsgb3N0ci5zKyspIHsKKyAgICAgICAgICAgIGNoYXIgb3B0ID0gKm9zdHIuczsKKyAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICAgICAgICAgIHAtPnNjcy5vcHRfc3RhcnRfYXRfZmlyc3QgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgICAgICAgICAgcC0+c2NzLm9wdF9lbmRfYXRfbGFzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ2knOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICdwJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgICAgIEZPUldBUkRfRVJST1IocGFyc2Vfb3B0YXJnKHAsIG9wdCwgJm9hcmcpKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IHN0cnRvZChvYXJnLnMsICZ0cHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9hcmcuZSAhPSB0cHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihwLT5lcnJfbXNnLCBzaXplb2YocC0+ZXJyX21zZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ludGF4IGVycm9yIGZvciBvcHRpb24gLUYiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHAtPnNjcy5vcHRfZmFkZV90aW1lID0gdiAqIEFWX1RJTUVfQkFTRSAvIDEwMDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgICAgICAgICAgICBGT1JXQVJEX0VSUk9SKHBhcnNlX29wdGFyZyhwLCBvcHQsICZvYXJnKSk7CisgICAgICAgICAgICAgICAgICAgIHIgPSBzdHJfdG9fdGltZShvYXJnLnMsICZwLT5zY3Mub3B0X2R1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9hcmcuZSAhPSBvYXJnLnMgKyByKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihwLT5lcnJfbXNnLCBzaXplb2YocC0+ZXJyX21zZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ludGF4IGVycm9yIGZvciBvcHRpb24gLUwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgICAgICAgICBGT1JXQVJEX0VSUk9SKHBhcnNlX29wdGFyZyhwLCBvcHQsICZvYXJnKSk7CisgICAgICAgICAgICAgICAgICAgIHIgPSBzdHJfdG9fdGltZShvYXJnLnMsICZwLT5zY3Muc3RhcnRfdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAob2FyZy5lICE9IG9hcmcucyArIHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHAtPmVycl9tc2csIHNpemVvZihwLT5lcnJfbXNnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeW50YXggZXJyb3IgZm9yIG9wdGlvbiAtVCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgICAgICAgIEZPUldBUkRfRVJST1IocGFyc2Vfb3B0YXJnKHAsIG9wdCwgJm9hcmcpKTsKKyAgICAgICAgICAgICAgICAgICAgdHB0ciA9IGF2X21hbGxvYyhvYXJnLmUgLSBvYXJnLnMgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0cHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRwdHIsIG9hcmcucywgb2FyZy5lIC0gb2FyZy5zKTsKKyAgICAgICAgICAgICAgICAgICAgdHB0cltvYXJnLmUgLSBvYXJnLnNdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShwLT5zY3Mub3B0X21peCk7CisgICAgICAgICAgICAgICAgICAgIHAtPnNjcy5vcHRfbWl4ID0gdHB0cjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAncSc6CisgICAgICAgICAgICAgICAgICAgIEZPUldBUkRfRVJST1IocGFyc2Vfb3B0YXJnKHAsIG9wdCwgJm9hcmcpKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IHN0cnRvZChvYXJnLnMsICZ0cHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9hcmcuZSAhPSB0cHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihwLT5lcnJfbXNnLCBzaXplb2YocC0+ZXJyX21zZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ludGF4IGVycm9yIGZvciBvcHRpb24gLXEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh2ICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHAtPmVycl9tc2csIHNpemVvZihwLT5lcnJfbXNnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVlZCBmYWN0b3Igb3RoZXIgdGhhbiAxIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICAgICAgRk9SV0FSRF9FUlJPUihwYXJzZV9vcHRhcmcocCwgb3B0LCAmb2FyZykpOworICAgICAgICAgICAgICAgICAgICByID0gc3RydG9sKG9hcmcucywgJnRwdHIsIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9hcmcuZSAhPSB0cHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihwLT5lcnJfbXNnLCBzaXplb2YocC0+ZXJyX21zZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ludGF4IGVycm9yIGZvciBvcHRpb24gLXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyIDwgNDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHAtPmVycl9tc2csIHNpemVvZihwLT5lcnJfbXNnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHNhbXBsZSByYXRlIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcC0+c2NzLnNhbXBsZV9yYXRlID0gcjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYocC0+ZXJyX21zZywgc2l6ZW9mKHAtPmVycl9tc2cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBvcHRpb246ICclYyciLCAqb3N0ci5zKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgcmV0dXJuIHBhcnNlX2ltbWVkaWF0ZShwKTsKKyAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICByZXR1cm4gcGFyc2VfcHJlcHJvZ3JhbW1lZChwKTsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKCFsZXhfbGluZV9lbmQocCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1JfQlVHOworfQorCitzdGF0aWMgaW50IHBhcnNlX3RpbWVzdGFtcChzdHJ1Y3Qgc2JnX3BhcnNlciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2JnX3RpbWVzdGFtcCAqcnRzLCBpbnQ2NF90ICpycmVsKQoreworICAgIGludDY0X3QgYWJzID0gMCwgcmVsID0gMCwgZHQ7CisgICAgY2hhciB0eXBlID0gMDsKKyAgICBpbnQgcjsKKworICAgIGlmIChsZXhfZml4ZWQocCwgIk5PVyIsIDMpKSB7CisgICAgICAgIHR5cGUgPSAnTic7CisgICAgICAgIHIgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHIgPSBsZXhfdGltZShwLCAmYWJzKTsKKyAgICAgICAgaWYgKHIpCisgICAgICAgICAgICB0eXBlID0gJ1QnOworICAgIH0KKyAgICB3aGlsZSAobGV4X2NoYXIocCwgJysnKSkgeworICAgICAgICBpZiAoIWxleF90aW1lKHAsICZkdCkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgcmVsICs9IGR0OworICAgICAgICByID0gMTsKKyAgICB9CisgICAgaWYgKHIpIHsKKyAgICAgICAgaWYgKCFsZXhfc3BhY2UocCkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgcnRzLT50eXBlID0gdHlwZTsKKyAgICAgICAgcnRzLT50ICAgID0gYWJzOworICAgICAgICAqcnJlbCAgICAgPSByZWw7CisgICAgfQorICAgIHJldHVybiByOworfQorCitzdGF0aWMgaW50IHBhcnNlX2ZhZGUoc3RydWN0IHNiZ19wYXJzZXIgKnAsIHN0cnVjdCBzYmdfZmFkZSAqZnIpCit7CisgICAgc3RydWN0IHNiZ19mYWRlIGYgPSB7MH07CisKKyAgICBpZiAobGV4X2NoYXIocCwgJzwnKSkKKyAgICAgICAgZi5pbiA9IFNCR19GQURFX1NJTEVOQ0U7CisgICAgZWxzZSBpZiAobGV4X2NoYXIocCwgJy0nKSkKKyAgICAgICAgZi5pbiA9IFNCR19GQURFX1NBTUU7CisgICAgZWxzZSBpZiAobGV4X2NoYXIocCwgJz0nKSkKKyAgICAgICAgZi5pbiA9IFNCR19GQURFX0FEQVBUOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGxleF9jaGFyKHAsICc+JykpCisgICAgICAgIGYub3V0ID0gU0JHX0ZBREVfU0lMRU5DRTsKKyAgICBlbHNlIGlmIChsZXhfY2hhcihwLCAnLScpKQorICAgICAgICBmLm91dCA9IFNCR19GQURFX1NBTUU7CisgICAgZWxzZSBpZiAobGV4X2NoYXIocCwgJz0nKSkKKyAgICAgICAgZi5vdXQgPSBTQkdfRkFERV9BREFQVDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICpmciA9IGY7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdGltZV9zZXF1ZW5jZShzdHJ1Y3Qgc2JnX3BhcnNlciAqcCwgaW50IGluYmxvY2spCit7CisgICAgc3RydWN0IHNiZ190aW1lc3RhbXAgdHM7CisgICAgaW50NjRfdCByZWxfdHM7CisgICAgaW50IHI7CisgICAgc3RydWN0IHNiZ19mYWRlIGZhZGUgPSB7IFNCR19GQURFX1NBTUUsIFNCR19GQURFX1NBTUUsIDAgfTsKKyAgICBzdHJ1Y3Qgc2JnX3N0cmluZyBuYW1lOworICAgIHN0cnVjdCBzYmdfc2NyaXB0X3RzZXEgKnRzZXE7CisKKyAgICByID0gcGFyc2VfdGltZXN0YW1wKHAsICZ0cywgJnJlbF90cyk7CisgICAgaWYgKCFyKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAociA8IDApCisgICAgICAgIHJldHVybiByOworICAgIGlmICh0cy50eXBlKSB7CisgICAgICAgIGlmIChpbmJsb2NrKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHAtPmN1cnJlbnRfdGltZS50eXBlID0gdHMudHlwZTsKKyAgICAgICAgcC0+Y3VycmVudF90aW1lLnQgICAgPSB0cy50OworICAgIH0gZWxzZSBpZighaW5ibG9jayAmJiAhcC0+Y3VycmVudF90aW1lLnR5cGUpIHsKKyAgICAgICAgc25wcmludGYocC0+ZXJyX21zZywgc2l6ZW9mKHAtPmVycl9tc2cpLAorICAgICAgICAgICAgICAgICAicmVsYXRpdmUgdGltZSB3aXRob3V0IHByZXZpb3VzIGFic29sdXRlIHRpbWUiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHRzLnR5cGUgPSBwLT5jdXJyZW50X3RpbWUudHlwZTsKKyAgICB0cy50ICAgID0gcC0+Y3VycmVudF90aW1lLnQgKyByZWxfdHM7CisgICAgciA9IHBhcnNlX2ZhZGUocCwgJmZhZGUpOworICAgIGlmIChyIDwgMCkKKyAgICAgICAgcmV0dXJuIHI7CisgICAgbGV4X3NwYWNlKHApOworICAgIGlmICghbGV4X25hbWUocCwgJm5hbWUpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBsZXhfc3BhY2UocCk7CisgICAgaWYgKGxleF9maXhlZChwLCAiLT4iLCAyKSkgeworICAgICAgICBmYWRlLnNsaWRlID0gU0JHX0ZBREVfQURBUFQ7CisgICAgICAgIGxleF9zcGFjZShwKTsKKyAgICB9CisgICAgaWYgKCFsZXhfbGluZV9lbmQocCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHRzZXEgPSBpbmJsb2NrID8KKyAgICAgICAgICAgYWxsb2NfYXJyYXlfZWxlbSgodm9pZCAqKikmcC0+c2NzLmJsb2NrX3RzZXEsIHNpemVvZigqdHNlcSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPm5iX2Jsb2NrX3RzZXEsICZwLT5uYl9ibG9ja190c2VxX21heCkgOgorICAgICAgICAgICBhbGxvY19hcnJheV9lbGVtKCh2b2lkICoqKSZwLT5zY3MudHNlcSwgc2l6ZW9mKCp0c2VxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+c2NzLm5iX3RzZXEsICZwLT5uYl90c2VxX21heCk7CisgICAgaWYgKCF0c2VxKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHRzZXEtPnRzICAgICAgID0gdHM7CisgICAgdHNlcS0+bmFtZSAgICAgPSBuYW1lLnM7CisgICAgdHNlcS0+bmFtZV9sZW4gPSBuYW1lLmUgLSBuYW1lLnM7CisgICAgdHNlcS0+ZmFkZSAgICAgPSBmYWRlOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBhcnNlX3dhdmVfZGVmKHN0cnVjdCBzYmdfcGFyc2VyICpwLCBpbnQgd2F2ZW51bSkKK3sKKyAgICBzbnByaW50ZihwLT5lcnJfbXNnLCBzaXplb2YocC0+ZXJyX21zZyksCisgICAgICAgICAgICAgIndhdmVmb3JtIGRlZmluaXRpb25zIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYmxvY2tfZGVmKHN0cnVjdCBzYmdfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNiZ19zY3JpcHRfZGVmaW5pdGlvbiAqZGVmKQoreworICAgIGludCByLCB0c2VxOworCisgICAgbGV4X3NwYWNlKHApOworICAgIGlmICghbGV4X2xpbmVfZW5kKHApKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB0c2VxID0gcC0+bmJfYmxvY2tfdHNlcTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICByID0gcGFyc2VfdGltZV9zZXF1ZW5jZShwLCAxKTsKKyAgICAgICAgaWYgKHIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIGlmICghcikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIWxleF9jaGFyKHAsICd9JykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGxleF9zcGFjZShwKTsKKyAgICBpZiAoIWxleF9saW5lX2VuZChwKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgZGVmLT50eXBlICAgICAgICA9ICdCJzsKKyAgICBkZWYtPmVsZW1lbnRzICAgID0gdHNlcTsKKyAgICBkZWYtPm5iX2VsZW1lbnRzID0gcC0+bmJfYmxvY2tfdHNlcSAtIHRzZXE7CisgICAgaWYgKCFkZWYtPm5iX2VsZW1lbnRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV92b2x1bWUoc3RydWN0IHNiZ19wYXJzZXIgKnAsIGludCAqdm9sKQoreworICAgIGRvdWJsZSB2OworCisgICAgaWYgKCFsZXhfY2hhcihwLCAnLycpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIWxleF9kb3VibGUocCwgJnYpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoc2NhbGVfZG91YmxlKHAtPmxvZywgdiwgMC4wMSwgdm9sKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRVJBTkdFKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9zeW50aF9jaGFubmVsX3NpbmUoc3RydWN0IHNiZ19wYXJzZXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2JnX3NjcmlwdF9zeW50aCAqc3ludGgpCit7CisgICAgZG91YmxlIGNhcnJpZXJmLCBiZWF0ZjsKKyAgICBpbnQgY2FycmllciwgYmVhdCwgdm9sOworCisgICAgaWYgKCFsZXhfZG91YmxlKHAsICZjYXJyaWVyZikpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghbGV4X2RvdWJsZShwLCAmYmVhdGYpKQorICAgICAgICBiZWF0ZiA9IDA7CisgICAgRk9SV0FSRF9FUlJPUihwYXJzZV92b2x1bWUocCwgJnZvbCkpOworICAgIGlmIChzY2FsZV9kb3VibGUocC0+bG9nLCBjYXJyaWVyZiwgMSwgJmNhcnJpZXIpIDwgMCB8fAorICAgICAgICBzY2FsZV9kb3VibGUocC0+bG9nLCBiZWF0ZiwgMSwgJmJlYXQpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRURPTSk7CisgICAgc3ludGgtPnR5cGUgICAgPSBTQkdfVFlQRV9TSU5FOworICAgIHN5bnRoLT5jYXJyaWVyID0gY2FycmllcjsKKyAgICBzeW50aC0+YmVhdCAgICA9IGJlYXQ7CisgICAgc3ludGgtPnZvbCAgICAgPSB2b2w7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3ludGhfY2hhbm5lbF9waW5rKHN0cnVjdCBzYmdfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNiZ19zY3JpcHRfc3ludGggKnN5bnRoKQoreworICAgIGludCB2b2w7CisKKyAgICBpZiAoIWxleF9maXhlZChwLCAicGluayIsIDQpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBGT1JXQVJEX0VSUk9SKHBhcnNlX3ZvbHVtZShwLCAmdm9sKSk7CisgICAgc3ludGgtPnR5cGUgICAgPSBTQkdfVFlQRV9OT0lTRTsKKyAgICBzeW50aC0+dm9sICAgICA9IHZvbDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9zeW50aF9jaGFubmVsX2JlbGwoc3RydWN0IHNiZ19wYXJzZXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2JnX3NjcmlwdF9zeW50aCAqc3ludGgpCit7CisgICAgZG91YmxlIGNhcnJpZXJmOworICAgIGludCBjYXJyaWVyLCB2b2w7CisKKyAgICBpZiAoIWxleF9maXhlZChwLCAiYmVsbCIsIDQpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIWxleF9kb3VibGUocCwgJmNhcnJpZXJmKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgRk9SV0FSRF9FUlJPUihwYXJzZV92b2x1bWUocCwgJnZvbCkpOworICAgIGlmIChzY2FsZV9kb3VibGUocC0+bG9nLCBjYXJyaWVyZiwgMSwgJmNhcnJpZXIpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRURPTSk7CisgICAgc3ludGgtPnR5cGUgICAgPSBTQkdfVFlQRV9CRUxMOworICAgIHN5bnRoLT5jYXJyaWVyID0gY2FycmllcjsKKyAgICBzeW50aC0+dm9sICAgICA9IHZvbDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9zeW50aF9jaGFubmVsX21peChzdHJ1Y3Qgc2JnX3BhcnNlciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNiZ19zY3JpcHRfc3ludGggKnN5bnRoKQoreworICAgIGludCB2b2w7CisKKyAgICBpZiAoIWxleF9maXhlZChwLCAibWl4IiwgMykpCisgICAgICAgIHJldHVybiAwOworICAgIEZPUldBUkRfRVJST1IocGFyc2Vfdm9sdW1lKHAsICZ2b2wpKTsKKyAgICBzeW50aC0+dHlwZSAgICA9IFNCR19UWVBFX01JWDsKKyAgICBzeW50aC0+dm9sICAgICA9IHZvbDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9zeW50aF9jaGFubmVsX3NwaW4oc3RydWN0IHNiZ19wYXJzZXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2JnX3NjcmlwdF9zeW50aCAqc3ludGgpCit7CisgICAgZG91YmxlIGNhcnJpZXJmLCBiZWF0ZjsKKyAgICBpbnQgY2FycmllciwgYmVhdCwgdm9sOworCisgICAgaWYgKCFsZXhfZml4ZWQocCwgInNwaW46IiwgNSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghbGV4X2RvdWJsZShwLCAmY2FycmllcmYpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoIWxleF9kb3VibGUocCwgJmJlYXRmKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgRk9SV0FSRF9FUlJPUihwYXJzZV92b2x1bWUocCwgJnZvbCkpOworICAgIGlmIChzY2FsZV9kb3VibGUocC0+bG9nLCBjYXJyaWVyZiwgMSwgJmNhcnJpZXIpIDwgMCB8fAorICAgICAgICBzY2FsZV9kb3VibGUocC0+bG9nLCBiZWF0ZiwgMSwgJmJlYXQpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRURPTSk7CisgICAgc3ludGgtPnR5cGUgICAgPSBTQkdfVFlQRV9TUElOOworICAgIHN5bnRoLT5jYXJyaWVyID0gY2FycmllcjsKKyAgICBzeW50aC0+YmVhdCAgICA9IGJlYXQ7CisgICAgc3ludGgtPnZvbCAgICAgPSB2b2w7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3ludGhfY2hhbm5lbChzdHJ1Y3Qgc2JnX3BhcnNlciAqcCkKK3sKKyAgICBpbnQgcjsKKyAgICBzdHJ1Y3Qgc2JnX3NjcmlwdF9zeW50aCAqc3ludGg7CisKKyAgICBzeW50aCA9IGFsbG9jX2FycmF5X2VsZW0oKHZvaWQgKiopJnAtPnNjcy5zeW50aCwgc2l6ZW9mKCpzeW50aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT5zY3MubmJfc3ludGgsICZwLT5uYl9zeW50aF9tYXgpOworICAgIGlmICghc3ludGgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgciA9IGxleF9jaGFyKHAsICctJyk7CisgICAgaWYgKCFyKQorICAgICAgICByID0gcGFyc2Vfc3ludGhfY2hhbm5lbF9waW5rKHAsIHN5bnRoKTsKKyAgICBpZiAoIXIpCisgICAgICAgIHIgPSBwYXJzZV9zeW50aF9jaGFubmVsX2JlbGwocCwgc3ludGgpOworICAgIGlmICghcikKKyAgICAgICAgciA9IHBhcnNlX3N5bnRoX2NoYW5uZWxfbWl4KHAsIHN5bnRoKTsKKyAgICBpZiAoIXIpCisgICAgICAgIHIgPSBwYXJzZV9zeW50aF9jaGFubmVsX3NwaW4ocCwgc3ludGgpOworICAgIC8qIFVuaW1wbGVtZW50ZWQ6IHdhdmUlZDolZiVmL3ZvbCAoY2FycmllciwgYmVhdCkgKi8KKyAgICBpZiAoIXIpCisgICAgICAgIHIgPSBwYXJzZV9zeW50aF9jaGFubmVsX3NpbmUocCwgc3ludGgpOworICAgIGlmIChyIDw9IDApCisgICAgICAgIHAtPnNjcy5uYl9zeW50aC0tOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N5bnRoX2RlZihzdHJ1Y3Qgc2JnX3BhcnNlciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYmdfc2NyaXB0X2RlZmluaXRpb24gKmRlZikKK3sKKyAgICBpbnQgciwgc3ludGg7CisKKyAgICBzeW50aCA9IHAtPnNjcy5uYl9zeW50aDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICByID0gcGFyc2Vfc3ludGhfY2hhbm5lbChwKTsKKyAgICAgICAgaWYgKHIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIGlmICghciB8fCAhbGV4X3NwYWNlKHApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGxleF9zcGFjZShwKTsKKyAgICBpZiAoc3ludGggPT0gcC0+c2NzLm5iX3N5bnRoKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoIWxleF9saW5lX2VuZChwKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgZGVmLT50eXBlICAgICAgICA9ICdTJzsKKyAgICBkZWYtPmVsZW1lbnRzICAgID0gc3ludGg7CisgICAgZGVmLT5uYl9lbGVtZW50cyA9IHAtPnNjcy5uYl9zeW50aCAtIHN5bnRoOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBhcnNlX25hbWVkX2RlZihzdHJ1Y3Qgc2JnX3BhcnNlciAqcCkKK3sKKyAgICBjaGFyICpjdXJzb3Jfc2F2ZSA9IHAtPmN1cnNvcjsKKyAgICBzdHJ1Y3Qgc2JnX3N0cmluZyBuYW1lOworICAgIHN0cnVjdCBzYmdfc2NyaXB0X2RlZmluaXRpb24gKmRlZjsKKworICAgIGlmICghbGV4X25hbWUocCwgJm5hbWUpIHx8ICFsZXhfY2hhcihwLCAnOicpIHx8ICFsZXhfc3BhY2UocCkpIHsKKyAgICAgICAgcC0+Y3Vyc29yID0gY3Vyc29yX3NhdmU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAobmFtZS5lIC0gbmFtZS5zID09IDYgJiYgIW1lbWNtcChuYW1lLnMsICJ3YXZlIiwgNCkgJiYKKyAgICAgICAgbmFtZS5zWzRdID49ICcwJyAmJiBuYW1lLnNbNF0gPD0gJzknICYmCisgICAgICAgIG5hbWUuc1s1XSA+PSAnMCcgJiYgbmFtZS5zWzVdIDw9ICc5JykgeworICAgICAgICBpbnQgd2F2ZW51bSA9IChuYW1lLnNbNF0gLSAnMCcpICogMTAgKyAobmFtZS5zWzVdIC0gJzAnKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlX3dhdmVfZGVmKHAsIHdhdmVudW0pOworICAgIH0KKyAgICBkZWYgPSBhbGxvY19hcnJheV9lbGVtKCh2b2lkICoqKSZwLT5zY3MuZGVmLCBzaXplb2YoKmRlZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+c2NzLm5iX2RlZiwgJnAtPm5iX2RlZl9tYXgpOworICAgIGlmICghZGVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGRlZi0+bmFtZSAgICAgPSBuYW1lLnM7CisgICAgZGVmLT5uYW1lX2xlbiA9IG5hbWUuZSAtIG5hbWUuczsKKyAgICBpZiAobGV4X2NoYXIocCwgJ3snKSkKKyAgICAgICAgcmV0dXJuIHBhcnNlX2Jsb2NrX2RlZihwLCBkZWYpOworICAgIHJldHVybiBwYXJzZV9zeW50aF9kZWYocCwgZGVmKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9zY3JpcHQoc3RydWN0IHNiZ19zY3JpcHQgKnMpCit7CisgICAgYXZfZnJlZXAoJnMtPmRlZik7CisgICAgYXZfZnJlZXAoJnMtPnN5bnRoKTsKKyAgICBhdl9mcmVlcCgmcy0+dHNlcSk7CisgICAgYXZfZnJlZXAoJnMtPmJsb2NrX3RzZXEpOworICAgIGF2X2ZyZWVwKCZzLT5ldmVudHMpOworICAgIGF2X2ZyZWVwKCZzLT5vcHRfbWl4KTsKK30KKworc3RhdGljIGludCBwYXJzZV9zY3JpcHQodm9pZCAqbG9nLCBjaGFyICpzY3JpcHQsIGludCBzY3JpcHRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYmdfc2NyaXB0ICpyc2NyaXB0KQoreworICAgIHN0cnVjdCBzYmdfcGFyc2VyIHNwID0geworICAgICAgICAubG9nICAgICA9IGxvZywKKyAgICAgICAgLnNjcmlwdCAgPSBzY3JpcHQsCisgICAgICAgIC5lbmQgICAgID0gc2NyaXB0ICsgc2NyaXB0X2xlbiwKKyAgICAgICAgLmN1cnNvciAgPSBzY3JpcHQsCisgICAgICAgIC5saW5lX25vID0gMSwKKyAgICAgICAgLmVycl9tc2cgPSAiIiwKKyAgICAgICAgLnNjcyA9IHsKKyAgICAgICAgICAgIC8qIGRlZmF1bHQgdmFsdWVzICovCisgICAgICAgICAgICAuc3RhcnRfdHMgICAgICA9IEFWX05PUFRTX1ZBTFVFLAorICAgICAgICAgICAgLnNhbXBsZV9yYXRlICAgPSA0NDEwMCwKKyAgICAgICAgICAgIC5vcHRfZmFkZV90aW1lID0gNjAgKiBBVl9USU1FX0JBU0UsCisgICAgICAgIH0sCisgICAgfTsKKyAgICBpbnQgcjsKKworICAgIGxleF9zcGFjZSgmc3ApOworICAgIHdoaWxlIChzcC5jdXJzb3IgPCBzcC5lbmQpIHsKKyAgICAgICAgciA9IHBhcnNlX29wdGlvbnMoJnNwKTsKKyAgICAgICAgaWYgKHIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBpZiAoIXIgJiYgIWxleF9saW5lX2VuZCgmc3ApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHdoaWxlIChzcC5jdXJzb3IgPCBzcC5lbmQpIHsKKyAgICAgICAgciA9IHBhcnNlX25hbWVkX2RlZigmc3ApOworICAgICAgICBpZiAoIXIpCisgICAgICAgICAgICByID0gcGFyc2VfdGltZV9zZXF1ZW5jZSgmc3AsIDApOworICAgICAgICBpZiAoIXIpCisgICAgICAgICAgICByID0gbGV4X2xpbmVfZW5kKCZzcCkgPyAxIDogQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKHIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICAqcnNjcmlwdCA9IHNwLnNjczsKKyAgICByZXR1cm4gMTsKK2ZhaWw6CisgICAgZnJlZV9zY3JpcHQoJnNwLnNjcyk7CisgICAgaWYgKCEqc3AuZXJyX21zZykKKyAgICAgICAgaWYgKHIgPT0gQVZFUlJPUl9JTlZBTElEREFUQSkKKyAgICAgICAgICAgIHNucHJpbnRmKHNwLmVycl9tc2csIHNpemVvZihzcC5lcnJfbXNnKSwgInN5bnRheCBlcnJvciIpOworICAgIGlmIChsb2cgJiYgKnNwLmVycl9tc2cpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY3R4ID0gc3AuY3Vyc29yOworICAgICAgICBjb25zdCBjaGFyICplY3R4ID0gYXZfeF9pZl9udWxsKG1lbWNocihjdHgsICdcbicsIHNwLmVuZCAtIHNwLmN1cnNvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3AuZW5kKTsKKyAgICAgICAgaW50IGxjdHggPSBlY3R4IC0gY3R4OworICAgICAgICBjb25zdCBjaGFyICpxdW90ZSA9ICJcIiI7CisgICAgICAgIGlmIChsY3R4ID4gMCAmJiBjdHhbbGN0eCAtIDFdID09ICdccicpCisgICAgICAgICAgICBsY3R4LS07CisgICAgICAgIGlmIChsY3R4ID09IDApIHsKKyAgICAgICAgICAgIGN0eCA9ICJ0aGUgZW5kIG9mIGxpbmUiOworICAgICAgICAgICAgbGN0eCA9IHN0cmxlbihjdHgpOworICAgICAgICAgICAgcXVvdGUgPSAiIjsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2cobG9nLCBBVl9MT0dfRVJST1IsICJFcnJvciBsaW5lICVkOiAlcyBuZWFyICVzJS4qcyVzLlxuIiwKKyAgICAgICAgICAgICAgIHNwLmxpbmVfbm8sIHNwLmVycl9tc2csIHF1b3RlLCBsY3R4LCBjdHgsIHF1b3RlKTsKKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF93aG9sZV9maWxlKEFWSU9Db250ZXh0ICppbywgaW50IG1heF9zaXplLCBjaGFyICoqcmJ1ZikKK3sKKyAgICBjaGFyICpidWYgPSBOVUxMOworICAgIGludCBzaXplID0gMCwgYnVmc2l6ZSA9IDAsIHI7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoYnVmc2l6ZSAtIHNpemUgPCAxMDI0KSB7CisgICAgICAgICAgICBidWZzaXplID0gRkZNSU4oRkZNQVgoMiAqIGJ1ZnNpemUsIDgxOTIpLCBtYXhfc2l6ZSk7CisgICAgICAgICAgICBpZiAoYnVmc2l6ZSAtIHNpemUgPCAyKSB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IEFWRVJST1IoRUZCSUcpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZiA9IGF2X3JlYWxsb2NfZihidWYsIGJ1ZnNpemUsIDEpOworICAgICAgICAgICAgaWYgKCFidWYpIHsKKyAgICAgICAgICAgICAgICBzaXplID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByID0gYXZpb19yZWFkKGlvLCBidWYsIGJ1ZnNpemUgLSBzaXplIC0gMSk7CisgICAgICAgIGlmIChyID09IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgc2l6ZSArPSByOworICAgIH0KKyAgICBidWZbc2l6ZV0gPSAwOworICAgICpyYnVmID0gYnVmOworICAgIHJldHVybiBzaXplOworZmFpbDoKKyAgICBhdl9mcmVlKGJ1Zik7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyB2b2lkIGV4cGFuZF90aW1lc3RhbXBzKHZvaWQgKmxvZywgc3RydWN0IHNiZ19zY3JpcHQgKnMpCit7CisgICAgaW50IGksIG5iX3JlbCA9IDA7CisgICAgaW50NjRfdCBub3csIGN1cl90cywgZGVsdGEgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3RzZXE7IGkrKykKKyAgICAgICAgbmJfcmVsICs9IHMtPnRzZXFbaV0udHMudHlwZSA9PSAnTic7CisgICAgaWYgKG5iX3JlbCA9PSBzLT5uYl90c2VxKSB7CisgICAgICAgIC8qIEFsbCB0cyBhcmUgcmVsYXRpdmUgdG8gTk9XOiBjb25zaWRlciBOT1cgPSAwICovCisgICAgICAgIG5vdyA9IDA7CisgICAgICAgIGlmIChzLT5zdGFydF90cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIGF2X2xvZyhsb2csIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJTdGFydCB0aW1lIGlnbm9yZWQgaW4gYSBwdXJlbHkgcmVsYXRpdmUgc2NyaXB0LlxuIik7CisgICAgfSBlbHNlIGlmIChuYl9yZWwgPT0gMCAmJiBzLT5zdGFydF90cyAhPSBBVl9OT1BUU19WQUxVRSB8fAorICAgICAgICAgICAgICAgcy0+b3B0X3N0YXJ0X2F0X2ZpcnN0KSB7CisgICAgICAgIC8qIEFsbCB0cyBhcmUgYWJzb2x1dGUgYW5kIHN0YXJ0IHRpbWUgaXMgc3BlY2lmaWVkICovCisgICAgICAgIGlmIChzLT5zdGFydF90cyA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHMtPnN0YXJ0X3RzID0gcy0+dHNlcVswXS50cy50OworICAgICAgICBub3cgPSBzLT5zdGFydF90czsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBNaXhlZCByZWxhdGl2ZS9hYnNvbHV0ZSB0czogZXhwYW5kICovCisgICAgICAgIHRpbWVfdCBub3cwOworICAgICAgICBzdHJ1Y3QgdG0gKnRtLCB0bXBidWY7CisKKyAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiU2NyaXB0cyB3aXRoIG1peGVkIGFic29sdXRlIGFuZCByZWxhdGl2ZSB0aW1lc3RhbXBzIGNhbiBnaXZlICIKKyAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHJlc3VsdHMgKHBhdXNlLCBzZWVraW5nLCB0aW1lIHpvbmUgY2hhbmdlKS5cbiIpOworI3VuZGVmIHRpbWUKKyAgICAgICAgdGltZSgmbm93MCk7CisgICAgICAgIHRtID0gbG9jYWx0aW1lX3IoJm5vdzAsICZ0bXBidWYpOworICAgICAgICBub3cgPSB0bSA/IHRtLT50bV9ob3VyICogMzYwMCArIHRtLT50bV9taW4gKiA2MCArIHRtLT50bV9zZWMgOgorICAgICAgICAgICAgICAgICAgIG5vdzAgJSBEQVk7CisgICAgICAgIGF2X2xvZyhsb2csIEFWX0xPR19JTkZPLCAiVXNpbmcgJTAyZDolMDJkOiUwMmQgYXMgTk9XLlxuIiwKKyAgICAgICAgICAgICAgIChpbnQpKG5vdyAvIDM2MDApLCAoaW50KShub3cgLyA2MCkgJSA2MCwgKGludClub3cgJSA2MCk7CisgICAgICAgIG5vdyAqPSBBVl9USU1FX0JBU0U7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl90c2VxOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLT50c2VxW2ldLnRzLnR5cGUgPT0gJ04nKSB7CisgICAgICAgICAgICAgICAgcy0+dHNlcVtpXS50cy50ICs9IG5vdzsKKyAgICAgICAgICAgICAgICBzLT50c2VxW2ldLnRzLnR5cGUgPSAnVCc7IC8qIG5vdCBuZWNlc3NhcnkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+c3RhcnRfdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHMtPnN0YXJ0X3RzID0gcy0+b3B0X3N0YXJ0X2F0X2ZpcnN0ID8gcy0+dHNlcVswXS50cy50IDogbm93OworICAgIHMtPmVuZF90cyA9IHMtPm9wdF9kdXJhdGlvbiA/IHMtPnN0YXJ0X3RzICsgcy0+b3B0X2R1cmF0aW9uIDoKKyAgICAgICAgICAgICAgICBBVl9OT1BUU19WQUxVRTsgLyogbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIgYnkgLUUgb3B0aW9uICovCisgICAgY3VyX3RzID0gbm93OworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl90c2VxOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPnRzZXFbaV0udHMudCArIGRlbHRhIDwgY3VyX3RzKQorICAgICAgICAgICAgZGVsdGEgKz0gREFZX1RTOworICAgICAgICBjdXJfdHMgPSBzLT50c2VxW2ldLnRzLnQgKz0gZGVsdGE7CisgICAgfQorfQorCitzdGF0aWMgaW50IGV4cGFuZF90c2VxKHZvaWQgKmxvZywgc3RydWN0IHNiZ19zY3JpcHQgKnMsIGludCAqbmJfZXZfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHQwLCBzdHJ1Y3Qgc2JnX3NjcmlwdF90c2VxICp0c2VxKQoreworICAgIGludCBpLCByOworICAgIHN0cnVjdCBzYmdfc2NyaXB0X2RlZmluaXRpb24gKmRlZjsKKyAgICBzdHJ1Y3Qgc2JnX3NjcmlwdF90c2VxICpiZTsKKyAgICBzdHJ1Y3Qgc2JnX3NjcmlwdF9ldmVudCAqZXY7CisKKyAgICBpZiAodHNlcS0+bG9jaysrKSB7CisgICAgICAgIGF2X2xvZyhsb2csIEFWX0xPR19FUlJPUiwgIlJlY3Vyc2lvbiBsb29wIG9uIFwiJS4qc1wiXG4iLAorICAgICAgICAgICAgICAgdHNlcS0+bmFtZV9sZW4sIHRzZXEtPm5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICB0MCArPSB0c2VxLT50cy50OworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9kZWY7IGkrKykgeworICAgICAgICBpZiAocy0+ZGVmW2ldLm5hbWVfbGVuID09IHRzZXEtPm5hbWVfbGVuICYmCisgICAgICAgICAgICAhbWVtY21wKHMtPmRlZltpXS5uYW1lLCB0c2VxLT5uYW1lLCB0c2VxLT5uYW1lX2xlbikpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPj0gcy0+bmJfZGVmKSB7CisgICAgICAgIGF2X2xvZyhsb2csIEFWX0xPR19FUlJPUiwgIlRvbmUtc2V0IFwiJS4qc1wiIG5vdCBkZWZpbmVkXG4iLAorICAgICAgICAgICAgICAgdHNlcS0+bmFtZV9sZW4sIHRzZXEtPm5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBkZWYgPSAmcy0+ZGVmW2ldOworICAgIGlmIChkZWYtPnR5cGUgPT0gJ0InKSB7CisgICAgICAgIGJlID0gcy0+YmxvY2tfdHNlcSArIGRlZi0+ZWxlbWVudHM7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWYtPm5iX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgIHIgPSBleHBhbmRfdHNlcShsb2csIHMsIG5iX2V2X21heCwgdDAsICZiZVtpXSk7CisgICAgICAgICAgICBpZiAociA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBldiA9IGFsbG9jX2FycmF5X2VsZW0oKHZvaWQgKiopJnMtPmV2ZW50cywgc2l6ZW9mKCpldiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+bmJfZXZlbnRzLCBuYl9ldl9tYXgpOworICAgICAgICBldi0+dHMgICAgICAgICAgPSB0c2VxLT50cy50OworICAgICAgICBldi0+ZWxlbWVudHMgICAgPSBkZWYtPmVsZW1lbnRzOworICAgICAgICBldi0+bmJfZWxlbWVudHMgPSBkZWYtPm5iX2VsZW1lbnRzOworICAgICAgICBldi0+ZmFkZSAgICAgICAgPSB0c2VxLT5mYWRlOworICAgIH0KKyAgICB0c2VxLT5sb2NrLS07CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXhwYW5kX3NjcmlwdCh2b2lkICpsb2csIHN0cnVjdCBzYmdfc2NyaXB0ICpzKQoreworICAgIGludCBpLCByLCBuYl9ldmVudHNfbWF4ID0gMDsKKworICAgIGV4cGFuZF90aW1lc3RhbXBzKGxvZywgcyk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3RzZXE7IGkrKykgeworICAgICAgICByID0gZXhwYW5kX3RzZXEobG9nLCBzLCAmbmJfZXZlbnRzX21heCwgMCwgJnMtPnRzZXFbaV0pOworICAgICAgICBpZiAociA8IDApCisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgaWYgKCFzLT5uYl9ldmVudHMpIHsKKyAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX0VSUk9SLCAiTm8gZXZlbnRzIGluIHNjcmlwdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAocy0+b3B0X2VuZF9hdF9sYXN0KQorICAgICAgICBzLT5lbmRfdHMgPSBzLT5ldmVudHNbcy0+bmJfZXZlbnRzIC0gMV0udHM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2ludGVydmFsKHN0cnVjdCB3c19pbnRlcnZhbHMgKmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSB3c19pbnRlcnZhbF90eXBlIHR5cGUsIHVpbnQzMl90IGNoYW5uZWxzLCBpbnQgcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0czEsIGludDMyX3QgZjEsIGludDMyX3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRzMiwgaW50MzJfdCBmMiwgaW50MzJfdCBhMikKK3sKKyAgICBzdHJ1Y3Qgd3NfaW50ZXJ2YWwgKmksICpyaTsKKworICAgIGlmIChyZWYgPj0gMCkgeworICAgICAgICByaSA9ICZpbnRlci0+aW50ZXJbcmVmXTsKKyAgICAgICAgLyogcmVmIGFuZCBuZXcgaW50ZXJ2YWxzIGFyZSBjb25zdGFudCwgaWRlbnRpY2FsIGFuZCBhZGphY2VudCAqLworICAgICAgICBpZiAocmktPnR5cGUgPT0gdHlwZSAmJiByaS0+Y2hhbm5lbHMgPT0gY2hhbm5lbHMgJiYKKyAgICAgICAgICAgIHJpLT5mMSA9PSByaS0+ZjIgJiYgcmktPmYyID09IGYxICYmIGYxID09IGYyICYmCisgICAgICAgICAgICByaS0+YTEgPT0gcmktPmEyICYmIHJpLT5hMiA9PSBhMSAmJiBhMSA9PSBhMiAmJgorICAgICAgICAgICAgcmktPnRzMiA9PSB0czEpIHsKKyAgICAgICAgICAgIHJpLT50czIgPSB0czI7CisgICAgICAgICAgICByZXR1cm4gcmVmOworICAgICAgICB9CisgICAgfQorICAgIGkgPSBhbGxvY19hcnJheV9lbGVtKCh2b2lkICoqKSZpbnRlci0+aW50ZXIsIHNpemVvZigqaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyLT5uYl9pbnRlciwgJmludGVyLT5tYXhfaW50ZXIpOworICAgIGlmICghaSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpLT50czEgICAgICA9IHRzMTsKKyAgICBpLT50czIgICAgICA9IHRzMjsKKyAgICBpLT50eXBlICAgICA9IHR5cGU7CisgICAgaS0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBpLT5mMSAgICAgICA9IGYxOworICAgIGktPmYyICAgICAgID0gZjI7CisgICAgaS0+YTEgICAgICAgPSBhMTsKKyAgICBpLT5hMiAgICAgICA9IGEyOworICAgIGktPnBoaSAgICAgID0gcmVmID49IDAgPyByZWYgfCAweDgwMDAwMDAwIDogMDsKKyAgICByZXR1cm4gaSAtIGludGVyLT5pbnRlcjsKK30KKworc3RhdGljIGludCBhZGRfYmVsbChzdHJ1Y3Qgd3NfaW50ZXJ2YWxzICppbnRlciwgc3RydWN0IHNiZ19zY3JpcHQgKnMsCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdHMxLCBpbnQ2NF90IHRzMiwgaW50MzJfdCBmLCBpbnQzMl90IGEpCit7CisgICAgLyogU0JhR2VuIHVzZXMgYW4gZXhwb25lbnRpYWwgZGVjcmVhc2UgZXZlcnkgNTBtcy4KKyAgICAgICBXZSBhcHByb3hpbWF0ZSBpdCB3aXRoIHBpZWNld2lzZSBhZmZpbmUgc2VnbWVudHMuICovCisgICAgaW50MzJfdCBjcG9pbnRzW11bMl0gPSB7CisgICAgICAgIHsgIDIsIGEgfSwKKyAgICAgICAgeyAgNCwgYSAtIGEgLyA0IH0sCisgICAgICAgIHsgIDgsIGEgLyAyIH0sCisgICAgICAgIHsgMTYsIGEgLyA0IH0sCisgICAgICAgIHsgMjUsIGEgLyAxMCB9LAorICAgICAgICB7IDUwLCBhIC8gODAgfSwKKyAgICAgICAgeyA3NSwgMCB9LAorICAgIH07CisgICAgaW50IGksIHI7CisgICAgaW50NjRfdCBkdCA9IHMtPnNhbXBsZV9yYXRlIC8gMjAsIHRzMyA9IHRzMSwgdHM0OworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjcG9pbnRzKTsgaSsrKSB7CisgICAgICAgIHRzNCA9IEZGTUlOKHRzMiwgdHMxICsgY3BvaW50c1tpXVswXSAqIGR0KTsKKyAgICAgICAgciA9IGFkZF9pbnRlcnZhbChpbnRlciwgV1NfU0lORSwgMywgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHMzLCBmLCBhLCB0czQsIGYsIGNwb2ludHNbaV1bMV0pOworICAgICAgICBpZiAociA8IDApCisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgdHMzID0gdHM0OworICAgICAgICBhID0gY3BvaW50c1tpXVsxXTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfaW50ZXJ2YWwodm9pZCAqbG9nLCBzdHJ1Y3Qgc2JnX3NjcmlwdCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdzX2ludGVydmFscyAqaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdHMxLCBpbnQ2NF90IHRzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNiZ19zY3JpcHRfc3ludGggKnMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2JnX3NjcmlwdF9zeW50aCAqczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc2l0aW9uKQoreworICAgIGludCByOworCisgICAgaWYgKHRzMiA8PSB0czEgfHwgKHMxLT52b2wgPT0gMCAmJiBzMi0+dm9sID09IDApKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzd2l0Y2ggKHMxLT50eXBlKSB7CisgICAgICAgIGNhc2UgU0JHX1RZUEVfTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNCR19UWVBFX1NJTkU6CisgICAgICAgICAgICBpZiAoczEtPmJlYXQgPT0gMCAmJiBzMi0+YmVhdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgciA9IGFkZF9pbnRlcnZhbChpbnRlciwgV1NfU0lORSwgMywgczEtPnJlZi5sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMxLCBzMS0+Y2FycmllciwgczEtPnZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzMiwgczItPmNhcnJpZXIsIHMyLT52b2wpOworICAgICAgICAgICAgICAgIGlmIChyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgICAgczItPnJlZi5sID0gczItPnJlZi5yID0gcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgciA9IGFkZF9pbnRlcnZhbChpbnRlciwgV1NfU0lORSwgMSwgczEtPnJlZi5sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMxLCBzMS0+Y2FycmllciArIHMxLT5iZWF0IC8gMiwgczEtPnZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzMiwgczItPmNhcnJpZXIgKyBzMi0+YmVhdCAvIDIsIHMyLT52b2wpOworICAgICAgICAgICAgICAgIGlmIChyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgICAgczItPnJlZi5sID0gcjsKKyAgICAgICAgICAgICAgICByID0gYWRkX2ludGVydmFsKGludGVyLCBXU19TSU5FLCAyLCBzMS0+cmVmLnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0czEsIHMxLT5jYXJyaWVyIC0gczEtPmJlYXQgLyAyLCBzMS0+dm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMyLCBzMi0+Y2FycmllciAtIHMyLT5iZWF0IC8gMiwgczItPnZvbCk7CisgICAgICAgICAgICAgICAgaWYgKHIgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgICBzMi0+cmVmLnIgPSByOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTQkdfVFlQRV9CRUxMOgorICAgICAgICAgICAgaWYgKHRyYW5zaXRpb24gPT0gMikgeworICAgICAgICAgICAgICAgIHIgPSBhZGRfYmVsbChpbnRlciwgcywgdHMxLCB0czIsIHMxLT5jYXJyaWVyLCBzMi0+dm9sKTsKKyAgICAgICAgICAgICAgICBpZiAociA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTQkdfVFlQRV9TUElOOgorICAgICAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX1dBUk5JTkcsICJTcGlubmluZyBub2lzZSBub3QgaW1wbGVtZW50ZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcGluayBub2lzZSBpbnN0ZWFkLlxuIik7CisgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBTQkdfVFlQRV9OT0lTRToKKyAgICAgICAgICAgIC8qIFNCYUdlbidzIHBpbmsgbm9pc2UgZ2VuZXJhdG9yIHVzZXM6CisgICAgICAgICAgICAgICAtIDEgYmFuZCBvZiB3aGl0ZSBub2lzZSwgbWVhbiBzcXVhcmU6IDEvMzsKKyAgICAgICAgICAgICAgIC0gOSBiYW5kcyBvZiBzdWJzYW1wbGVkIHdoaXRlIG5vaXNlIHdpdGggbGluZWFyCisgICAgICAgICAgICAgICAgIGludGVycG9sYXRpb24sIG1lYW4gc3F1YXJlOiAyLzMgZWFjaDsKKyAgICAgICAgICAgICAgIHdpdGggMS8xMCB3ZWlnaHQgZWFjaDogdGhlIHRvdGFsIG1lYW4gc3F1YXJlIGlzIDcvMzAwLgorICAgICAgICAgICAgICAgT3VyIHBpbmsgbm9pc2UgZ2VuZXJhdG9yIHVzZXMgOCBiYW5kcyBvZiB3aGl0ZSBub2lzZSB3aXRoCisgICAgICAgICAgICAgICByZWN0YW5ndWxhciBzdWJzYW1wbGluZzogdGhlIHRvdGFsIG1lYW4gc3F1YXJlIGlzIDEvMjQuCisgICAgICAgICAgICAgICBUaGVyZWZvcmUsIHRvIG1hdGNoIFNCYUdlbidzIHZvbHVtZSwgd2UgbXVzdCBtdWx0aXBseSB2b2wgYnkKKyAgICAgICAgICAgICAgIHNxcnQoKDcvMzAwKSAvICgxLzI0KSkgPSBzcXJ0KDE0LzI1KSA9fiAwLjc0OAorICAgICAgICAgICAgICovCisgICAgICAgICAgICByID0gYWRkX2ludGVydmFsKGludGVyLCBXU19OT0lTRSwgMywgczEtPnJlZi5sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0czEsIDAsIHMxLT52b2wgLSBzMS0+dm9sIC8gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMyLCAwLCBzMi0+dm9sIC0gczItPnZvbCAvIDQpOworICAgICAgICAgICAgaWYgKHIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgczItPnJlZi5sID0gczItPnJlZi5yID0gcjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0JHX1RZUEVfTUlYOgorICAgICAgICAgICAgLyogVW5pbXBsZW1lbnRlZDogc2lsZW5jZTsgd2FybmluZyBwcmVzZW50IGVsc2V3aGVyZSAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJUeXBlICVkIGlzIG5vdCBpbXBsZW1lbnRlZFxuIiwgczEtPnR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9wbGF0ZWF1KHZvaWQgKmxvZywgc3RydWN0IHNiZ19zY3JpcHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdzX2ludGVydmFscyAqaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNiZ19zY3JpcHRfZXZlbnQgKmV2MSkKK3sKKyAgICBpbnQ2NF90IHRzMSA9IGV2MS0+dHNfaW50LCB0czIgPSBldjEtPnRzX3RyYW5zOworICAgIGludCBpLCByOworICAgIHN0cnVjdCBzYmdfc2NyaXB0X3N5bnRoICpzMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBldjEtPm5iX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgczEgPSAmcy0+c3ludGhbZXYxLT5lbGVtZW50cyArIGldOworICAgICAgICByID0gZ2VuZXJhdGVfaW50ZXJ2YWwobG9nLCBzLCBpbnRlciwgdHMxLCB0czIsIHMxLCBzMSwgMCk7CisgICAgICAgIGlmIChyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoKKworICAgdHMxICAgICAgICAgICAgIHRzMiAgICAgICAgIHRzMSAgICB0c21pZCAgICB0czIKKyAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICB8ICAgICAgIHwKKyAgICB2ICAgICAgICAgICAgICAgdiAgICAgICAgICAgdiAgICAgICB8ICAgICAgIHYKK19fX18gICAgICAgICAgICAgICAgICAgICAgICBfX19fICAgICAgICB2ICAgICAgIF9fX18KKyAgICAnJycnLi4uLiAgICAgICAgICAgICAgICAgICAgJycuLiAgICAgICAgLi4nJworICAgICAgICAgICAgJycnJy4uLi5fX19fICAgICAgICAgICAgJycuLi4uJycKKworICBjb21wYXRpYmxlIHRyYW5zaXRpb24gICAgICBpbmNvbXBhdGlibGUgdHJhbnNpdGlvbgorICovCisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfdHJhbnNpdGlvbih2b2lkICpsb2csIHN0cnVjdCBzYmdfc2NyaXB0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3c19pbnRlcnZhbHMgKmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYmdfc2NyaXB0X2V2ZW50ICpldjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNiZ19zY3JpcHRfZXZlbnQgKmV2MikKK3sKKyAgICBpbnQ2NF90IHRzMSA9IGV2MS0+dHNfdHJhbnMsIHRzMiA9IGV2MS0+dHNfbmV4dDsKKyAgICAvKiAodHMxICsgdHMyKSAvIDIgd2l0aG91dCBvdmVyZmxvdyAqLworICAgIGludDY0X3QgdHNtaWQgPSAodHMxID4+IDEpICsgKHRzMiA+PiAxKSArICh0czEgJiB0czIgJiAxKTsKKyAgICBlbnVtIHNiZ19mYWRlX3R5cGUgdHlwZSA9IGV2MS0+ZmFkZS5zbGlkZSB8IChldjEtPmZhZGUub3V0ICYgZXYyLT5mYWRlLmluKTsKKyAgICBpbnQgbmJfZWxlbWVudHMgPSBGRk1BWChldjEtPm5iX2VsZW1lbnRzLCBldjItPm5iX2VsZW1lbnRzKTsKKyAgICBzdHJ1Y3Qgc2JnX3NjcmlwdF9zeW50aCAqczEsICpzMiwgczFtb2QsIHMybW9kLCBzbWlkOworICAgIGludCBwYXNzLCBpLCByOworCisgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykgeworICAgICAgICAvKiBwYXNzID0gMCAtPiBjb21wYXRpYmxlIGFuZCBmaXJzdCBoYWxmIG9mIGluY29tcGF0aWJsZQorICAgICAgICAgICBwYXNzID0gMSAtPiBzZWNvbmQgaGFsZiBvZiBpbmNvbXBhdGlibGUKKyAgICAgICAgICAgVXNpbmcgdHdvIHBhc3NlcyBsaWtlIHRoYXQgZW5zdXJlcyB0aGF0IHRoZSBpbnRlcnZhbHMgYXJlIGdlbmVyYXRlZAorICAgICAgICAgICBpbiBpbmNyZWFzaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGVpciBzdGFydCB0aW1lc3RhbXAuCisgICAgICAgICAgIE90aGVyd2lzZSBpdCB3b3VsZCBiZSBuZWNlc3NhcnkgdG8gc29ydCB0aGVtCisgICAgICAgICAgIHdoaWxlIGtlZXBpbmcgdGhlIG11dHVhbCByZWZlcmVuY2VzLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgIHMxID0gaSA8IGV2MS0+bmJfZWxlbWVudHMgPyAmcy0+c3ludGhbZXYxLT5lbGVtZW50cyArIGldIDogJnMxbW9kOworICAgICAgICAgICAgczIgPSBpIDwgZXYyLT5uYl9lbGVtZW50cyA/ICZzLT5zeW50aFtldjItPmVsZW1lbnRzICsgaV0gOiAmczJtb2Q7CisgICAgICAgICAgICBzMW1vZCA9IHMxICE9ICZzMW1vZCA/ICpzMSA6IChzdHJ1Y3Qgc2JnX3NjcmlwdF9zeW50aCl7IDAgfTsKKyAgICAgICAgICAgIHMybW9kID0gczIgIT0gJnMybW9kID8gKnMyIDogKHN0cnVjdCBzYmdfc2NyaXB0X3N5bnRoKXsgMCB9OworICAgICAgICAgICAgaWYgKGV2MS0+ZmFkZS5zbGlkZSkgeworICAgICAgICAgICAgICAgIC8qIGZvciBzbGlkZXMsIGFuZCBvbmx5IGZvciBzbGlkZXMsIHNpbGVuY2UgKCItIikgaXMgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICAgIHRvIGFueXRoaW5nIHdpdGggdm9sdW1lIDAgKi8KKyAgICAgICAgICAgICAgICBpZiAoczFtb2QudHlwZSA9PSBTQkdfVFlQRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIHMxbW9kID0gczJtb2Q7CisgICAgICAgICAgICAgICAgICAgIHMxbW9kLnZvbCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzMm1vZC50eXBlID09IFNCR19UWVBFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgczJtb2QgPSBzMW1vZDsKKyAgICAgICAgICAgICAgICAgICAgczJtb2Qudm9sID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoczFtb2QudHlwZSA9PSBzMm1vZC50eXBlICYmCisgICAgICAgICAgICAgICAgczFtb2QudHlwZSAhPSBTQkdfVFlQRV9CRUxMICYmCisgICAgICAgICAgICAgICAgKHR5cGUgPT0gU0JHX0ZBREVfQURBUFQgfHwKKyAgICAgICAgICAgICAgICAgKHMxbW9kLmNhcnJpZXIgPT0gczJtb2QuY2FycmllciAmJgorICAgICAgICAgICAgICAgICAgczFtb2QuYmVhdCA9PSBzMm1vZC5iZWF0KSkpIHsKKyAgICAgICAgICAgICAgICAvKiBjb21wYXRpYmxlOiBzaW5nbGUgdHJhbnNpdGlvbiAqLworICAgICAgICAgICAgICAgIGlmICghcGFzcykgeworICAgICAgICAgICAgICAgICAgICByID0gZ2VuZXJhdGVfaW50ZXJ2YWwobG9nLCBzLCBpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzMSwgdHMyLCAmczFtb2QsICZzMm1vZCwgMyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgICAgICAgICBzMi0+cmVmID0gczJtb2QucmVmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogaW5jb21wYXRpYmxlOiBzaWxlbmNlIGF0IG1pZHBvaW50ICovCisgICAgICAgICAgICAgICAgaWYgKCFwYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHNtaWQgPSBzMW1vZDsKKyAgICAgICAgICAgICAgICAgICAgc21pZC52b2wgPSAwOworICAgICAgICAgICAgICAgICAgICByID0gZ2VuZXJhdGVfaW50ZXJ2YWwobG9nLCBzLCBpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzMSwgdHNtaWQsICZzMW1vZCwgJnNtaWQsIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAociA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzbWlkID0gczJtb2Q7CisgICAgICAgICAgICAgICAgICAgIHNtaWQudm9sID0gMDsKKyAgICAgICAgICAgICAgICAgICAgciA9IGdlbmVyYXRlX2ludGVydmFsKGxvZywgcywgaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c21pZCwgdHMyLCAmc21pZCwgJnMybW9kLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgICAgICAgIHMyLT5yZWYgPSBzMm1vZC5yZWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICAgIGV2MSAgICAgICAgICAgICAgICAgIHRyYXRzIGV2MiAgaW50dHMgICAgICAgICAgIGVuZHRzIGV2MworICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICB8ICAgICB8ICAgICAgICAgICAgICAgfCAgICB8CisgICAgIHYgICAgICAgICAgICAgICAgICAgICB2ICAgIHYgICAgIHYgICAgICAgICAgICAgICB2ICAgIHYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fX19fX19fXworLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLi4gICAgICAgICAgICAgICAgLi4uLgorICAgICcnJy4uLi5fX19fX19fX19fX19fX19fLi4uLicnJyAgICAgICAgICAgICAgICAgICAgICAgICcnJy4uLi5fX19fX19fX19fX19fX18KKworXF9fX19fX19fXy9cX19fX19fX19fX19fX18vXF9fX19fX19fXy9cX19fX19fX19fX19fX18vXF9fX19fX19fXy9cX19fX19fX19fX19fXy8KKyAgdHIgeC0+MSAgICAgICAgaW50MSAgICAgICAgdHIgMS0+MiAgICAgICAgaW50MiAgICAgICAgdHIgMi0+MyAgICAgICAgaW50MworICovCisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfaW50ZXJ2YWxzKHZvaWQgKmxvZywgc3RydWN0IHNiZ19zY3JpcHQgKnMsIGludCBzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3c19pbnRlcnZhbHMgKmludGVyKQoreworICAgIGludDY0X3QgdHJhbnNfdGltZSA9IHMtPm9wdF9mYWRlX3RpbWUgLyAyOworICAgIHN0cnVjdCBzYmdfc2NyaXB0X2V2ZW50IGV2MCwgKmV2MSwgKmV2MjsKKyAgICBpbnQ2NF90IHBlcmlvZDsKKyAgICBpbnQgaSwgcjsKKworICAgIC8qIFNCYUdlbiBoYW5kbGVzIHRoZSB0aW1lIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGV4dHJlbWFsIGV2ZW50cywKKyAgICAgICBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdHJhbnNpdGlvbnMsIGFzIGlmIHRoZSBzZXF1ZW5jZSB3ZXJlIGN5Y2xpYworICAgICAgIHdpdGggYSAyNC1ob3VycyBwZXJpb2QuICovCisgICAgcGVyaW9kID0gcy0+ZXZlbnRzW3MtPm5iX2V2ZW50cyAtIDFdLnRzIC0gcy0+ZXZlbnRzWzBdLnRzOworICAgIHBlcmlvZCA9IChwZXJpb2QgKyAoREFZX1RTIC0gMSkpIC8gREFZX1RTICogREFZX1RTOworICAgIHBlcmlvZCA9IEZGTUFYKHBlcmlvZCwgREFZX1RTKTsKKworICAgIC8qIFByZXBhcmUgdGltZXN0YW1wcyBmb3IgdHJhbnNpdGlvbnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfZXZlbnRzOyBpKyspIHsKKyAgICAgICAgZXYxID0gJnMtPmV2ZW50c1tpXTsKKyAgICAgICAgZXYyID0gJnMtPmV2ZW50c1soaSArIDEpICUgcy0+bmJfZXZlbnRzXTsKKyAgICAgICAgZXYxLT50c19pbnQgICA9IGV2MS0+dHM7CisgICAgICAgIGV2MS0+dHNfdHJhbnMgPSBldjEtPmZhZGUuc2xpZGUgPyBldjEtPnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBldjItPnRzICsgKGV2MSA8IGV2MiA/IDAgOiBwZXJpb2QpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfZXZlbnRzOyBpKyspIHsKKyAgICAgICAgZXYxID0gJnMtPmV2ZW50c1tpXTsKKyAgICAgICAgZXYyID0gJnMtPmV2ZW50c1soaSArIDEpICUgcy0+bmJfZXZlbnRzXTsKKyAgICAgICAgaWYgKCFldjEtPmZhZGUuc2xpZGUpIHsKKyAgICAgICAgICAgIGV2MS0+dHNfdHJhbnMgPSBGRk1BWChldjEtPnRzX2ludCwgICBldjEtPnRzX3RyYW5zIC0gdHJhbnNfdGltZSk7CisgICAgICAgICAgICBldjItPnRzX2ludCAgID0gRkZNSU4oZXYyLT50c190cmFucywgZXYyLT50c19pbnQgICArIHRyYW5zX3RpbWUpOworICAgICAgICB9CisgICAgICAgIGV2MS0+dHNfbmV4dCAgPSBldjItPnRzX2ludCArIChldjEgPCBldjIgPyAwIDogcGVyaW9kKTsKKyAgICB9CisKKyAgICAvKiBQc2V1ZG8gZXZlbnQgYmVmb3JlIHRoZSBmaXJzdCBvbmUgKi8KKyAgICBldjAgPSBzLT5ldmVudHNbcy0+bmJfZXZlbnRzIC0gMV07CisgICAgZXYwLnRzX2ludCAgIC09IHBlcmlvZDsKKyAgICBldjAudHNfdHJhbnMgLT0gcGVyaW9kOworICAgIGV2MC50c19uZXh0ICAtPSBwZXJpb2Q7CisKKyAgICAvKiBDb252ZXJ0IHRpbWVzdGFtcHMgKi8KKyAgICBmb3IgKGkgPSAtMTsgaSA8IHMtPm5iX2V2ZW50czsgaSsrKSB7CisgICAgICAgIGV2MSA9IGkgPCAwID8gJmV2MCA6ICZzLT5ldmVudHNbaV07CisgICAgICAgIGV2MS0+dHNfaW50ICAgPSBhdl9yZXNjYWxlKGV2MS0+dHNfaW50LCAgIHNhbXBsZV9yYXRlLCBBVl9USU1FX0JBU0UpOworICAgICAgICBldjEtPnRzX3RyYW5zID0gYXZfcmVzY2FsZShldjEtPnRzX3RyYW5zLCBzYW1wbGVfcmF0ZSwgQVZfVElNRV9CQVNFKTsKKyAgICAgICAgZXYxLT50c19uZXh0ICA9IGF2X3Jlc2NhbGUoZXYxLT50c19uZXh0LCAgc2FtcGxlX3JhdGUsIEFWX1RJTUVfQkFTRSk7CisgICAgfQorCisgICAgLyogR2VuZXJhdGUgaW50ZXJ2YWxzICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N5bnRoOyBpKyspCisgICAgICAgIHMtPnN5bnRoW2ldLnJlZi5sID0gcy0+c3ludGhbaV0ucmVmLnIgPSAtMTsKKyAgICBmb3IgKGkgPSAtMTsgaSA8IHMtPm5iX2V2ZW50czsgaSsrKSB7CisgICAgICAgIGV2MSA9IGkgPCAwID8gJmV2MCA6ICZzLT5ldmVudHNbaV07CisgICAgICAgIGV2MiA9ICZzLT5ldmVudHNbKGkgKyAxKSAlIHMtPm5iX2V2ZW50c107CisgICAgICAgIHIgPSBnZW5lcmF0ZV9wbGF0ZWF1KGxvZywgcywgaW50ZXIsIGV2MSk7CisgICAgICAgIGlmIChyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICByID0gZ2VuZXJhdGVfdHJhbnNpdGlvbihsb2csIHMsIGludGVyLCBldjEsIGV2Mik7CisgICAgICAgIGlmIChyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBpZiAoIWludGVyLT5uYl9pbnRlcikKKyAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX1dBUk5JTkcsICJDb21wbGV0ZWx5IHNpbGVudCBzY3JpcHQuXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfaW50ZXJ2YWxzKHN0cnVjdCBzYmdfc2NyaXB0ICpzLCBBVkNvZGVjQ29udGV4dCAqYXZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3c19pbnRlcnZhbHMgKmludGVyKQoreworICAgIGludCBpLCBlZGF0YV9zaXplID0gNDsKKyAgICB1aW50OF90ICplZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBpbnRlci0+bmJfaW50ZXI7IGkrKykgeworICAgICAgICBlZGF0YV9zaXplICs9IGludGVyLT5pbnRlcltpXS50eXBlID09IFdTX1NJTkUgID8gNDQgOgorICAgICAgICAgICAgICAgICAgICAgIGludGVyLT5pbnRlcltpXS50eXBlID09IFdTX05PSVNFID8gMzIgOiAwOworICAgICAgICBpZiAoZWRhdGFfc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKGF2YywgZWRhdGFfc2l6ZSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZWRhdGEgPSBhdmMtPmV4dHJhZGF0YTsKKworI2RlZmluZSBBRERfRURBVEEzMih2KSBkbyB7IEFWX1dMMzIoZWRhdGEsICh2KSk7IGVkYXRhICs9IDQ7IH0gd2hpbGUoMCkKKyNkZWZpbmUgQUREX0VEQVRBNjQodikgZG8geyBBVl9XTDY0KGVkYXRhLCAodikpOyBlZGF0YSArPSA4OyB9IHdoaWxlKDApCisgICAgQUREX0VEQVRBMzIoaW50ZXItPm5iX2ludGVyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW50ZXItPm5iX2ludGVyOyBpKyspIHsKKyAgICAgICAgQUREX0VEQVRBNjQoaW50ZXItPmludGVyW2ldLnRzMSk7CisgICAgICAgIEFERF9FREFUQTY0KGludGVyLT5pbnRlcltpXS50czIpOworICAgICAgICBBRERfRURBVEEzMihpbnRlci0+aW50ZXJbaV0udHlwZSk7CisgICAgICAgIEFERF9FREFUQTMyKGludGVyLT5pbnRlcltpXS5jaGFubmVscyk7CisgICAgICAgIHN3aXRjaCAoaW50ZXItPmludGVyW2ldLnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgV1NfU0lORToKKyAgICAgICAgICAgICAgICBBRERfRURBVEEzMihpbnRlci0+aW50ZXJbaV0uZjEpOworICAgICAgICAgICAgICAgIEFERF9FREFUQTMyKGludGVyLT5pbnRlcltpXS5mMik7CisgICAgICAgICAgICAgICAgQUREX0VEQVRBMzIoaW50ZXItPmludGVyW2ldLmExKTsKKyAgICAgICAgICAgICAgICBBRERfRURBVEEzMihpbnRlci0+aW50ZXJbaV0uYTIpOworICAgICAgICAgICAgICAgIEFERF9FREFUQTMyKGludGVyLT5pbnRlcltpXS5waGkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXU19OT0lTRToKKyAgICAgICAgICAgICAgICBBRERfRURBVEEzMihpbnRlci0+aW50ZXJbaV0uYTEpOworICAgICAgICAgICAgICAgIEFERF9FREFUQTMyKGludGVyLT5pbnRlcltpXS5hMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVkYXRhICE9IGF2Yy0+ZXh0cmFkYXRhICsgZWRhdGFfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgc2JnX3JlYWRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IHIsIHNjb3JlOworICAgIHN0cnVjdCBzYmdfc2NyaXB0IHNjcmlwdCA9IHsgMCB9OworCisgICAgciA9IHBhcnNlX3NjcmlwdChOVUxMLCBwLT5idWYsIHAtPmJ1Zl9zaXplLCAmc2NyaXB0KTsKKyAgICBzY29yZSA9IHIgPCAwIHx8ICFzY3JpcHQubmJfZGVmIHx8ICFzY3JpcHQubmJfdHNlcSA/IDAgOgorICAgICAgICAgICAgQVZQUk9CRV9TQ09SRV9NQVggLyAzOworICAgIGZyZWVfc2NyaXB0KCZzY3JpcHQpOworICAgIHJldHVybiBzY29yZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHNiZ19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmF2ZikKK3sKKyAgICBzdHJ1Y3Qgc2JnX2RlbXV4ZXIgKnNiZyA9IGF2Zi0+cHJpdl9kYXRhOworICAgIGludCByOworICAgIGNoYXIgKmJ1ZiA9IE5VTEw7CisgICAgc3RydWN0IHNiZ19zY3JpcHQgc2NyaXB0ID0geyAwIH07CisgICAgQVZTdHJlYW0gKnN0OworICAgIHN0cnVjdCB3c19pbnRlcnZhbHMgaW50ZXIgPSB7IDAgfTsKKworICAgIHIgPSByZWFkX3dob2xlX2ZpbGUoYXZmLT5wYiwgc2JnLT5tYXhfZmlsZV9zaXplLCAmYnVmKTsKKyAgICBpZiAociA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICByID0gcGFyc2Vfc2NyaXB0KGF2ZiwgYnVmLCByLCAmc2NyaXB0KTsKKyAgICBpZiAociA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoIXNiZy0+c2FtcGxlX3JhdGUpCisgICAgICAgIHNiZy0+c2FtcGxlX3JhdGUgPSBzY3JpcHQuc2FtcGxlX3JhdGU7CisgICAgZWxzZQorICAgICAgICBzY3JpcHQuc2FtcGxlX3JhdGUgPSBzYmctPnNhbXBsZV9yYXRlOworICAgIGlmICghc2JnLT5mcmFtZV9zaXplKQorICAgICAgICBzYmctPmZyYW1lX3NpemUgPSBGRk1BWCgxLCBzYmctPnNhbXBsZV9yYXRlIC8gMTApOworICAgIGlmIChzY3JpcHQub3B0X21peCkKKyAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX1dBUk5JTkcsICJNaXggZmVhdHVyZSBub3QgaW1wbGVtZW50ZWQ6ICIKKyAgICAgICAgICAgICAgICItbSBpcyBpZ25vcmVkIGFuZCBtaXggY2hhbm5lbHMgd2lsbCBiZSBzaWxlbnQuXG4iKTsKKyAgICByID0gZXhwYW5kX3NjcmlwdChhdmYsICZzY3JpcHQpOworICAgIGlmIChyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGF2X2ZyZWVwKCZidWYpOworICAgIHIgPSBnZW5lcmF0ZV9pbnRlcnZhbHMoYXZmLCAmc2NyaXB0LCBzYmctPnNhbXBsZV9yYXRlLCAmaW50ZXIpOworICAgIGlmIChyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2ZiwgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9GRldBVkVTWU5USDsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgID0gc2JnLT5zYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWMtPmZyYW1lX3NpemUgICAgID0gc2JnLT5mcmFtZV9zaXplOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBzdC0+cHJvYmVfcGFja2V0cyA9IDA7CisgICAgc3QtPnN0YXJ0X3RpbWUgICAgPSBhdl9yZXNjYWxlKHNjcmlwdC5zdGFydF90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JnLT5zYW1wbGVfcmF0ZSwgQVZfVElNRV9CQVNFKTsKKyAgICBzdC0+ZHVyYXRpb24gICAgICA9IHNjcmlwdC5lbmRfdHMgPT0gQVZfTk9QVFNfVkFMVUUgPyBBVl9OT1BUU19WQUxVRSA6CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlKHNjcmlwdC5lbmRfdHMgLSBzY3JpcHQuc3RhcnRfdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiZy0+c2FtcGxlX3JhdGUsIEFWX1RJTUVfQkFTRSk7CisgICAgc3QtPmN1cl9kdHMgICAgICAgPSBzdC0+c3RhcnRfdGltZTsKKyAgICByID0gZW5jb2RlX2ludGVydmFscygmc2NyaXB0LCBzdC0+Y29kZWMsICZpbnRlcik7CisgICAgaWYgKHIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBhdl9mcmVlKGludGVyLmludGVyKTsKKyAgICBmcmVlX3NjcmlwdCgmc2NyaXB0KTsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9mcmVlKGludGVyLmludGVyKTsKKyAgICBmcmVlX3NjcmlwdCgmc2NyaXB0KTsKKyAgICBhdl9mcmVlKGJ1Zik7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc2JnX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZmLCBBVlBhY2tldCAqcGFja2V0KQoreworICAgIGludDY0X3QgdHMsIGVuZF90czsKKworICAgIHRzID0gYXZmLT5zdHJlYW1zWzBdLT5jdXJfZHRzOworICAgIGVuZF90cyA9IHRzICsgYXZmLT5zdHJlYW1zWzBdLT5jb2RlYy0+ZnJhbWVfc2l6ZTsKKyAgICBpZiAoYXZmLT5zdHJlYW1zWzBdLT5kdXJhdGlvbiAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgZW5kX3RzID0gRkZNSU4oYXZmLT5zdHJlYW1zWzBdLT5zdGFydF90aW1lICsgYXZmLT5zdHJlYW1zWzBdLT5kdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgZW5kX3RzKTsKKyAgICBpZiAoZW5kX3RzIDw9IHRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgaWYgKGF2X25ld19wYWNrZXQocGFja2V0LCAxMikgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHBhY2tldC0+ZHRzID0gcGFja2V0LT5wdHMgPSB0czsKKyAgICBwYWNrZXQtPmR1cmF0aW9uID0gZW5kX3RzIC0gdHM7CisgICAgQVZfV0w2NChwYWNrZXQtPmRhdGEgKyAwLCB0cyk7CisgICAgQVZfV0wzMihwYWNrZXQtPmRhdGEgKyA4LCBwYWNrZXQtPmR1cmF0aW9uKTsKKyAgICByZXR1cm4gcGFja2V0LT5zaXplOworfQorCitzdGF0aWMgaW50IHNiZ19yZWFkX3NlZWsyKEFWRm9ybWF0Q29udGV4dCAqYXZmLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncykKK3sKKyAgICBpZiAoZmxhZ3MgfHwgc3RyZWFtX2luZGV4ID4gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBpZiAoc3RyZWFtX2luZGV4IDwgMCkKKyAgICAgICAgdHMgPSBhdl9yZXNjYWxlX3EodHMsIEFWX1RJTUVfQkFTRV9RLCBhdmYtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZSk7CisgICAgYXZmLT5zdHJlYW1zWzBdLT5jdXJfZHRzID0gdHM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2JnX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKmF2ZiwgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRzLCBpbnQgZmxhZ3MpCit7CisgICAgcmV0dXJuIHNiZ19yZWFkX3NlZWsyKGF2Ziwgc3RyZWFtX2luZGV4LCB0cywgdHMsIHRzLCAwKTsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHNiZ19vcHRpb25zW10gPSB7CisgICAgeyAic2FtcGxlX3JhdGUiLCAiIiwgb2Zmc2V0b2Yoc3RydWN0IHNiZ19kZW11eGVyLCBzYW1wbGVfcmF0ZSksCisgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwKKyAgICAgIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiZnJhbWVfc2l6ZSIsICIiLCBvZmZzZXRvZihzdHJ1Y3Qgc2JnX2RlbXV4ZXIsIGZyYW1lX3NpemUpLAorICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsCisgICAgICBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgIm1heF9maWxlX3NpemUiLCAiIiwgb2Zmc2V0b2Yoc3RydWN0IHNiZ19kZW11eGVyLCBtYXhfZmlsZV9zaXplKSwKKyAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gNTAwMDAwMCB9LCAwLCBJTlRfTUFYLAorICAgICAgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHNiZ19kZW11eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gInNiZ19kZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gc2JnX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX3NiZ19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzYmciLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTQmFHZW4gYmluYXVyYWwgYmVhdHMgc2NyaXB0IiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBzYmdfZGVtdXhlciksCisgICAgLnJlYWRfcHJvYmUgICAgID0gc2JnX3JlYWRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gc2JnX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHNiZ19yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSBzYmdfcmVhZF9zZWVrLAorICAgIC5yZWFkX3NlZWsyICAgICA9IHNiZ19yZWFkX3NlZWsyLAorICAgIC5leHRlbnNpb25zICAgICA9ICJzYmciLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZzYmdfZGVtdXhlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc2N0cC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NjdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzMzODk1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NjdHAuYwpAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIFNDVFAgcHJvdG9jb2wKKyAqIENvcHlyaWdodCAoYykgMjAxMiBMdWNhIEJhcmJhdG8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICoKKyAqIHNjdHAgdXJsX3Byb3RvY29sCisgKgorICogdXJsIHN5bnRheDogc2N0cDovL2hvc3Q6cG9ydFs/b3B0aW9uPXZhbC4uLl0KKyAqIG9wdGlvbjogJ2xpc3RlbicgICAgICAgIDogbGlzdGVuIGZvciBhbiBpbmNvbWluZyBjb25uZWN0aW9uCisgKiAgICAgICAgICdtYXhfc3RyZWFtcz1uJyA6IHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcworICogICAgICAgICAncmV1c2U9MScgICAgICAgOiBlbmFibGUgcmV1c2luZyB0aGUgc29ja2V0IFtUQkRdCisgKgorICogYnkgc2V0dGluZyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcyB0aGUgcHJvdG9jb2wgd2lsbCB1c2UgdGhlCisgKiBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIGluY29taW5nL291dGdvaW5nIGJ1ZmZlciB0byBzdG9yZSB0aGUKKyAqIHN0cmVhbSBudW1iZXIgb2YgdGhlIHBhY2tldCBiZWluZyByZWFkL3dyaXR0ZW4uCisgKiBAc2VlIHNjdHBfcmVhZAorICogQHNlZSBzY3RwX3dyaXRlCisgKi8KKworCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX1BPTExfSAorI2luY2x1ZGUgPHBvbGwuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm5ldHdvcmsuaCIKKyNpbmNsdWRlICJvc19zdXBwb3J0LmgiCisjaW5jbHVkZSAidXJsLmgiCisKKy8qCisgKiBUaGUgc2N0cF9yZWN2bXNnIGFuZCBzY3RwX3NlbmRtc2cgZnVuY3Rpb25zIGFyZSBwYXJ0IG9mIHRoZSB1c2VyCisgKiBsaWJyYXJ5IHRoYXQgb2ZmZXJzIHN1cHBvcnQgZm9yIHRoZSBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbi4KKyAqIFRvIGF2b2lkIGJ1aWxkLXRpbWUgY2xhc2hlcyB0aGUgZnVuY3Rpb25zIHNwb3J0IGFuIGZmXy1wcmVmaXggaGVyZS4KKyAqIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBjb2RlIGlzIHRvIHByb3ZpZGUgdGhlIFNDVFAgU29ja2V0IEFQSQorICogbWFwcGluZ3MgZm9yIHVzZXIgYXBwbGljYXRpb25zIHRvIGludGVyZmFjZSB3aXRoIFNDVFAgaW4gdGhlIGtlcm5lbC4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBTb2NrZXQgQVBJIEV4dGVuc2lvbnMgZm9yIFNDVFAKKyAqIGRlZmluZWQgaW4gPGRyYWZ0LWlldGYtdHN2d2ctc2N0cHNvY2tldC0xMC50eHQ+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIENvcnAuCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICBSeWFuIExheWVyIDxybWxheWVyQHVzLmlibS5jb20+CisgKi8KKworc3RhdGljIGludCBmZl9zY3RwX3JlY3Ztc2coaW50IHMsIHZvaWQgKm1zZywgc2l6ZV90IGxlbiwgc3RydWN0IHNvY2thZGRyICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2xlbl90ICpmcm9tbGVuLCBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbXNnX2ZsYWdzKQoreworICAgIGludCByZWN2YjsKKyAgICBzdHJ1Y3QgaW92ZWMgaW92OworICAgIGNoYXIgaW5jbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKV07CisgICAgc3RydWN0IG1zZ2hkciBpbm1zZyAgPSB7IDAgfTsKKyAgICBzdHJ1Y3QgY21zZ2hkciAqY21zZyA9IE5VTEw7CisKKyAgICBpb3YuaW92X2Jhc2UgPSBtc2c7CisgICAgaW92Lmlvdl9sZW4gID0gbGVuOworCisgICAgaW5tc2cubXNnX25hbWUgICAgICAgPSBmcm9tOworICAgIGlubXNnLm1zZ19uYW1lbGVuICAgID0gZnJvbWxlbiA/ICpmcm9tbGVuIDogMDsKKyAgICBpbm1zZy5tc2dfaW92ICAgICAgICA9ICZpb3Y7CisgICAgaW5tc2cubXNnX2lvdmxlbiAgICAgPSAxOworICAgIGlubXNnLm1zZ19jb250cm9sICAgID0gaW5jbXNnOworICAgIGlubXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisKKyAgICBpZiAoKHJlY3ZiID0gcmVjdm1zZyhzLCAmaW5tc2csIG1zZ19mbGFncyA/ICptc2dfZmxhZ3MgOiAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmVjdmI7CisKKyAgICBpZiAoZnJvbWxlbikKKyAgICAgICAgKmZyb21sZW4gICA9IGlubXNnLm1zZ19uYW1lbGVuOworICAgIGlmIChtc2dfZmxhZ3MpCisgICAgICAgICptc2dfZmxhZ3MgPSBpbm1zZy5tc2dfZmxhZ3M7CisKKyAgICBmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKCZpbm1zZyk7IGNtc2c7CisgICAgICAgICBjbXNnID0gQ01TR19OWFRIRFIoJmlubXNnLCBjbXNnKSkgeworICAgICAgICBpZiAoKElQUFJPVE9fU0NUUCA9PSBjbXNnLT5jbXNnX2xldmVsKSAmJgorICAgICAgICAgICAgKFNDVFBfU05EUkNWICA9PSBjbXNnLT5jbXNnX3R5cGUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogQ29weSBzaW5mby4gKi8KKyAgICBpZiAoY21zZykKKyAgICAgICAgbWVtY3B5KHNpbmZvLCBDTVNHX0RBVEEoY21zZyksIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisKKyAgICByZXR1cm4gcmVjdmI7Cit9CisKK3N0YXRpYyBpbnQgZmZfc2N0cF9zZW5kKGludCBzLCBjb25zdCB2b2lkICptc2csIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbywgaW50IGZsYWdzKQoreworICAgIHN0cnVjdCBtc2doZHIgb3V0bXNnOworICAgIHN0cnVjdCBpb3ZlYyBpb3Y7CisKKyAgICBvdXRtc2cubXNnX25hbWUgICAgICAgPSBOVUxMOworICAgIG91dG1zZy5tc2dfbmFtZWxlbiAgICA9IDA7CisgICAgb3V0bXNnLm1zZ19pb3YgICAgICAgID0gJmlvdjsKKyAgICBpb3YuaW92X2Jhc2UgICAgICAgICAgPSAodm9pZCopbXNnOworICAgIGlvdi5pb3ZfbGVuICAgICAgICAgICA9IGxlbjsKKyAgICBvdXRtc2cubXNnX2lvdmxlbiAgICAgPSAxOworICAgIG91dG1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisKKyAgICBpZiAoc2luZm8pIHsKKyAgICAgICAgY2hhciBvdXRjbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKV07CisgICAgICAgIHN0cnVjdCBjbXNnaGRyICpjbXNnOworCisgICAgICAgIG91dG1zZy5tc2dfY29udHJvbCAgICA9IG91dGNtc2c7CisgICAgICAgIG91dG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKyAgICAgICAgb3V0bXNnLm1zZ19mbGFncyAgICAgID0gMDsKKworICAgICAgICBjbXNnICAgICAgICAgICAgID0gQ01TR19GSVJTVEhEUigmb3V0bXNnKTsKKyAgICAgICAgY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKyAgICAgICAgY21zZy0+Y21zZ190eXBlICA9IFNDVFBfU05EUkNWOworICAgICAgICBjbXNnLT5jbXNnX2xlbiAgID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKworICAgICAgICBvdXRtc2cubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKyAgICAgICAgbWVtY3B5KENNU0dfREFUQShjbXNnKSwgc2luZm8sIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisgICAgfQorCisgICAgcmV0dXJuIHNlbmRtc2cocywgJm91dG1zZywgZmxhZ3MgfCBNU0dfTk9TSUdOQUwpOworfQorCit0eXBlZGVmIHN0cnVjdCBTQ1RQQ29udGV4dCB7CisgICAgaW50IGZkOworICAgIGludCBtYXhfc3RyZWFtczsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBkZXN0X2FkZHI7CisgICAgc29ja2xlbl90IGRlc3RfYWRkcl9sZW47Cit9IFNDVFBDb250ZXh0OworCitzdGF0aWMgaW50IHNjdHBfb3BlbihVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmksIGludCBmbGFncykKK3sKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKmFpLCAqY3VyX2FpOworICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cyAgICAgICAgICAgICA9IHsgMCB9OworICAgIHN0cnVjdCBzY3RwX2V2ZW50X3N1YnNjcmliZSBldmVudCA9IHsgMCB9OworICAgIHN0cnVjdCBzY3RwX2luaXRtc2cgaW5pdHBhcmFtcyAgICA9IHsgMCB9OworICAgIGludCBwb3J0OworICAgIGludCBmZCAgICAgICAgID0gLTE7CisgICAgU0NUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIGludCByZXQsIGxpc3Rlbl9zb2NrZXQgPSAwOworICAgIGNoYXIgaG9zdG5hbWVbMTAyNF0sIHByb3RvWzEwMjRdLCBwYXRoWzEwMjRdOworICAgIGNoYXIgcG9ydHN0clsxMF07CisKKyAgICBhdl91cmxfc3BsaXQocHJvdG8sIHNpemVvZihwcm90byksIE5VTEwsIDAsIGhvc3RuYW1lLCBzaXplb2YoaG9zdG5hbWUpLAorICAgICAgICAgICAgICAgICAmcG9ydCwgcGF0aCwgc2l6ZW9mKHBhdGgpLCB1cmkpOworICAgIGlmIChzdHJjbXAocHJvdG8sICJzY3RwIikpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKHBvcnQgPD0gMCB8fCBwb3J0ID49IDY1NTM2KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJQb3J0IG1pc3NpbmcgaW4gdXJpXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzLT5tYXhfc3RyZWFtcyA9IDA7CisgICAgcCA9IHN0cmNocih1cmksICc/Jyk7CisgICAgaWYgKHApIHsKKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImxpc3RlbiIsIHApKQorICAgICAgICAgICAgbGlzdGVuX3NvY2tldCA9IDE7CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJtYXhfc3RyZWFtcyIsIHApKQorICAgICAgICAgICAgcy0+bWF4X3N0cmVhbXMgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgfQorCisgICAgaGludHMuYWlfZmFtaWx5ICAgPSBBRl9VTlNQRUM7CisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgICBzbnByaW50Zihwb3J0c3RyLCBzaXplb2YocG9ydHN0ciksICIlZCIsIHBvcnQpOworICAgIHJldCA9IGdldGFkZHJpbmZvKGhvc3RuYW1lLCBwb3J0c3RyLCAmaGludHMsICZhaSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgaG9zdG5hbWUsIGdhaV9zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBjdXJfYWkgPSBhaTsKKworICAgIGZkID0gZmZfc29ja2V0KGN1cl9haS0+YWlfZmFtaWx5LCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzLT5kZXN0X2FkZHJfbGVuID0gc2l6ZW9mKHMtPmRlc3RfYWRkcik7CisKKyAgICBpZiAobGlzdGVuX3NvY2tldCkgeworICAgICAgICBpbnQgZmQxOworICAgICAgICByZXQgPSBiaW5kKGZkLCBjdXJfYWktPmFpX2FkZHIsIGN1cl9haS0+YWlfYWRkcmxlbik7CisgICAgICAgIGxpc3RlbihmZCwgMTAwKTsKKyAgICAgICAgZmQxID0gYWNjZXB0KGZkLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgY2xvc2Vzb2NrZXQoZmQpOworICAgICAgICBmZCAgPSBmZDE7CisgICAgfSBlbHNlCisgICAgICAgIHJldCA9IGNvbm5lY3QoZmQsIGN1cl9haS0+YWlfYWRkciwgY3VyX2FpLT5haV9hZGRybGVuKTsKKworICAgIGZmX3NvY2tldF9ub25ibG9jayhmZCwgMSk7CisKKyAgICBldmVudC5zY3RwX2RhdGFfaW9fZXZlbnQgPSAxOworICAgIC8qIFRPRE86IFN1YnNjcmliZSB0byBtb3JlIGV2ZW50IHR5cGVzIGFuZCBoYW5kbGUgdGhlbSAqLworCisgICAgaWYgKHNldHNvY2tvcHQoZmQsIElQUFJPVE9fU0NUUCwgU0NUUF9FVkVOVFMsICZldmVudCwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoZXZlbnQpKSAhPSAwKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiU0NUUCBFUlJPUjogVW5hYmxlIHRvIHN1YnNjcmliZSB0byBldmVudHNcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHMtPm1heF9zdHJlYW1zKSB7CisgICAgICAgIGluaXRwYXJhbXMuc2luaXRfbWF4X2luc3RyZWFtcyA9IHMtPm1heF9zdHJlYW1zOworICAgICAgICBpbml0cGFyYW1zLnNpbml0X251bV9vc3RyZWFtcyAgPSBzLT5tYXhfc3RyZWFtczsKKyAgICAgICAgaWYgKHNldHNvY2tvcHQoZmQsIElQUFJPVE9fU0NUUCwgU0NUUF9JTklUTVNHLCAmaW5pdHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGluaXRwYXJhbXMpKSA8IDApCisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJTQ1RQIEVSUk9SOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBzb2NrZXQgbWF4IHN0cmVhbXMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+bWF4X3N0cmVhbXMpOworICAgIH0KKworICAgIGgtPnByaXZfZGF0YSAgID0gczsKKyAgICBoLT5pc19zdHJlYW1lZCA9IDE7CisgICAgcy0+ZmQgICAgICAgICAgPSBmZDsKKyAgICBmcmVlYWRkcmluZm8oYWkpOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICBmcmVlYWRkcmluZm8oYWkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2N0cF93YWl0X2ZkKGludCBmZCwgaW50IHdyaXRlKQoreworICAgIGludCBldiAgICAgICAgICA9IHdyaXRlID8gUE9MTE9VVCA6IFBPTExJTjsKKyAgICBzdHJ1Y3QgcG9sbGZkIHAgPSB7IC5mZCA9IGZkLCAuZXZlbnRzID0gZXYsIC5yZXZlbnRzID0gMCB9OworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBwb2xsKCZwLCAxLCAxMDApOworICAgIHJldHVybiByZXQgPCAwID8gZmZfbmV0ZXJybm8oKSA6IHAucmV2ZW50cyAmIGV2ID8gMCA6IEFWRVJST1IoRUFHQUlOKTsKK30KKworc3RhdGljIGludCBzY3RwX3JlYWQoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBTQ1RQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCEoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfTk9OQkxPQ0spKSB7CisgICAgICAgIHJldCA9IHNjdHBfd2FpdF9mZChzLT5mZCwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAocy0+bWF4X3N0cmVhbXMpIHsKKyAgICAgICAgLypTdHJlYW1JZCBpcyBpbnRyb2R1Y2VkIGFzIGEgMmJ5dGUgY29kZSBpbnRvIHRoZSBzdHJlYW0qLworICAgICAgICBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvIGluZm8gPSB7IDAgfTsKKyAgICAgICAgcmV0ID0gZmZfc2N0cF9yZWN2bXNnKHMtPmZkLCBidWYgKyAyLCBzaXplIC0gMiwgTlVMTCwgMCwgJmluZm8sIDApOworICAgICAgICBBVl9XQjE2KGJ1ZiwgaW5mby5zaW5mb19zdHJlYW0pOworICAgICAgICByZXQgPSByZXQgPCAwID8gcmV0IDogcmV0ICsgMjsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0ID0gcmVjdihzLT5mZCwgYnVmLCBzaXplLCAwKTsKKworICAgIHJldHVybiByZXQgPCAwID8gZmZfbmV0ZXJybm8oKSA6IHJldDsKK30KKworc3RhdGljIGludCBzY3RwX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgU0NUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICghKGgtPmZsYWdzICYgQVZJT19GTEFHX05PTkJMT0NLKSkgeworICAgICAgICByZXQgPSBzY3RwX3dhaXRfZmQocy0+ZmQsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKHMtPm1heF9zdHJlYW1zKSB7CisgICAgICAgIC8qU3RyZWFtSWQgaXMgaW50cm9kdWNlZCBhcyBhIDJieXRlIGNvZGUgaW50byB0aGUgc3RyZWFtKi8KKyAgICAgICAgc3RydWN0IHNjdHBfc25kcmN2aW5mbyBpbmZvID0geyAwIH07CisgICAgICAgIGluZm8uc2luZm9fc3RyZWFtICAgICAgICAgICA9IEFWX1JCMTYoYnVmKTsKKyAgICAgICAgaWYgKGluZm8uc2luZm9fc3RyZWFtID4gcy0+bWF4X3N0cmVhbXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJiYWQgaW5wdXQgZGF0YVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gZmZfc2N0cF9zZW5kKHMtPmZkLCBidWYgKyAyLCBzaXplIC0gMiwgJmluZm8sIE1TR19FT1IpOworICAgIH0gZWxzZQorICAgICAgICByZXQgPSBzZW5kKHMtPmZkLCBidWYsIHNpemUsIE1TR19OT1NJR05BTCk7CisKKyAgICByZXR1cm4gcmV0IDwgMCA/IGZmX25ldGVycm5vKCkgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2N0cF9jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIFNDVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGNsb3Nlc29ja2V0KHMtPmZkKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY3RwX2dldF9maWxlX2hhbmRsZShVUkxDb250ZXh0ICpoKQoreworICAgIFNDVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIHJldHVybiBzLT5mZDsKK30KKworVVJMUHJvdG9jb2wgZmZfc2N0cF9wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJzY3RwIiwKKyAgICAudXJsX29wZW4gICAgICAgICAgICA9IHNjdHBfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgICAgICA9IHNjdHBfcmVhZCwKKyAgICAudXJsX3dyaXRlICAgICAgICAgICA9IHNjdHBfd3JpdGUsCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgPSBzY3RwX2Nsb3NlLAorICAgIC51cmxfZ2V0X2ZpbGVfaGFuZGxlID0gc2N0cF9nZXRfZmlsZV9oYW5kbGUsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgPSBzaXplb2YoU0NUUENvbnRleHQpLAorICAgIC5mbGFncyAgICAgICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc2RwLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc2RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmOWRlNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zZHAuYwpAQCAtMCwwICsxLDgyOCBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNyBMdWNhIEFiZW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYmFzZTY0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3hpcGguaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWc0YXVkaW8uaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZjLmgiCisjaW5jbHVkZSAiaGV2Yy5oIgorI2luY2x1ZGUgInJ0cC5oIgorI2lmIENPTkZJR19ORVRXT1JLCisjaW5jbHVkZSAibmV0d29yay5oIgorI2VuZGlmCisKKyNpZiBDT05GSUdfUlRQX01VWEVSCisjZGVmaW5lIE1BWF9FWFRSQURBVEFfU0laRSAoKElOVF9NQVggLSAxMCkgLyAyKQorCitzdHJ1Y3Qgc2RwX3Nlc3Npb25fbGV2ZWwgeworICAgIGludCBzZHBfdmVyc2lvbjsgICAgICAvKio8IHByb3RvY29sIHZlcnNpb24gKGN1cnJlbnRseSAwKSAqLworICAgIGludCBpZDsgICAgICAgICAgICAgICAvKio8IHNlc3Npb24gSUQgKi8KKyAgICBpbnQgdmVyc2lvbjsgICAgICAgICAgLyoqPCBzZXNzaW9uIHZlcnNpb24gKi8KKyAgICBpbnQgc3RhcnRfdGltZTsgICAgICAgLyoqPCBzZXNzaW9uIHN0YXJ0IHRpbWUgKE5UUCB0aW1lLCBpbiBzZWNvbmRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAwIGluIGNhc2Ugb2YgcGVybWFuZW50IHNlc3Npb24gKi8KKyAgICBpbnQgZW5kX3RpbWU7ICAgICAgICAgLyoqPCBzZXNzaW9uIGVuZCB0aW1lIChOVFAgdGltZSwgaW4gc2Vjb25kcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgMCBpZiB0aGUgc2Vzc2lvbiBpcyBub3QgYm91bmRlZCAqLworICAgIGludCB0dGw7ICAgICAgICAgICAgICAvKio8IFRUTCwgaW4gY2FzZSBvZiBtdWx0aWNhc3Qgc3RyZWFtICovCisgICAgY29uc3QgY2hhciAqdXNlcjsgICAgIC8qKjwgdXNlcm5hbWUgb2YgdGhlIHNlc3Npb24ncyBjcmVhdG9yICovCisgICAgY29uc3QgY2hhciAqc3JjX2FkZHI7IC8qKjwgSVAgYWRkcmVzcyBvZiB0aGUgbWFjaGluZSBmcm9tIHdoaWNoIHRoZSBzZXNzaW9uIHdhcyBjcmVhdGVkICovCisgICAgY29uc3QgY2hhciAqc3JjX3R5cGU7IC8qKjwgYWRkcmVzcyB0eXBlIG9mIHNyY19hZGRyICovCisgICAgY29uc3QgY2hhciAqZHN0X2FkZHI7IC8qKjwgZGVzdGluYXRpb24gSVAgYWRkcmVzcyAoY2FuIGJlIG11bHRpY2FzdCkgKi8KKyAgICBjb25zdCBjaGFyICpkc3RfdHlwZTsgLyoqPCBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzIHR5cGUgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgLyoqPCBzZXNzaW9uIG5hbWUgKGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcpICovCit9OworCitzdGF0aWMgdm9pZCBzZHBfd3JpdGVfYWRkcmVzcyhjaGFyICpidWZmLCBpbnQgc2l6ZSwgY29uc3QgY2hhciAqZGVzdF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVzdF90eXBlLCBpbnQgdHRsKQoreworICAgIGlmIChkZXN0X2FkZHIpIHsKKyAgICAgICAgaWYgKCFkZXN0X3R5cGUpCisgICAgICAgICAgICBkZXN0X3R5cGUgPSAiSVA0IjsKKyAgICAgICAgaWYgKHR0bCA+IDAgJiYgIXN0cmNtcChkZXN0X3R5cGUsICJJUDQiKSkgeworICAgICAgICAgICAgLyogVGhlIFRUTCBzaG91bGQgb25seSBiZSBzcGVjaWZpZWQgZm9yIElQdjQgbXVsdGljYXN0IGFkZHJlc3NlcywKKyAgICAgICAgICAgICAqIG5vdCBmb3IgSVB2Ni4gKi8KKyAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJjPUlOICVzICVzLyVkXHJcbiIsIGRlc3RfdHlwZSwgZGVzdF9hZGRyLCB0dGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImM9SU4gJXMgJXNcclxuIiwgZGVzdF90eXBlLCBkZXN0X2FkZHIpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZHBfd3JpdGVfaGVhZGVyKGNoYXIgKmJ1ZmYsIGludCBzaXplLCBzdHJ1Y3Qgc2RwX3Nlc3Npb25fbGV2ZWwgKnMpCit7CisgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgInY9JWRcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvPS0gJWQgJWQgSU4gJXMgJXNcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzPSVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2RwX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aWQsIHMtPnZlcnNpb24sIHMtPnNyY190eXBlLCBzLT5zcmNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5uYW1lKTsKKyAgICBzZHBfd3JpdGVfYWRkcmVzcyhidWZmLCBzaXplLCBzLT5kc3RfYWRkciwgcy0+ZHN0X3R5cGUsIHMtPnR0bCk7CisgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgInQ9JWQgJWRcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhPXRvb2w6bGliYXZmb3JtYXQgIiBBVl9TVFJJTkdJRlkoTElCQVZGT1JNQVRfVkVSU0lPTikgIlxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXJ0X3RpbWUsIHMtPmVuZF90aW1lKTsKK30KKworI2lmIENPTkZJR19ORVRXT1JLCitzdGF0aWMgaW50IHJlc29sdmVfZGVzdGluYXRpb24oY2hhciAqZGVzdF9hZGRyLCBpbnQgc2l6ZSwgY2hhciAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZV9zaXplKQoreworICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cyA9IHsgMCB9LCAqYWk7CisgICAgaW50IGlzX211bHRpY2FzdDsKKworICAgIGF2X3N0cmxjcHkodHlwZSwgIklQNCIsIHR5cGVfc2l6ZSk7CisgICAgaWYgKCFkZXN0X2FkZHJbMF0pCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogUmVzb2x2ZSB0aGUgZGVzdGluYXRpb24sIHNpbmNlIGl0IG11c3QgYmUgd3JpdHRlbgorICAgICAqIGFzIGEgbnVtZXJpYyBJUCBhZGRyZXNzIGluIHRoZSBTRFAuICovCisKKyAgICBpZiAoZ2V0YWRkcmluZm8oZGVzdF9hZGRyLCBOVUxMLCAmaGludHMsICZhaSkpCisgICAgICAgIHJldHVybiAwOworICAgIGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwgZGVzdF9hZGRyLCBzaXplLAorICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKTsKKyNpZmRlZiBBRl9JTkVUNgorICAgIGlmIChhaS0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KQorICAgICAgICBhdl9zdHJsY3B5KHR5cGUsICJJUDYiLCB0eXBlX3NpemUpOworI2VuZGlmCisgICAgaXNfbXVsdGljYXN0ID0gZmZfaXNfbXVsdGljYXN0X2FkZHJlc3MoYWktPmFpX2FkZHIpOworICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgcmV0dXJuIGlzX211bHRpY2FzdDsKK30KKyNlbHNlCitzdGF0aWMgaW50IHJlc29sdmVfZGVzdGluYXRpb24oY2hhciAqZGVzdF9hZGRyLCBpbnQgc2l6ZSwgY2hhciAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZV9zaXplKQoreworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc2RwX2dldF9hZGRyZXNzKGNoYXIgKmRlc3RfYWRkciwgaW50IHNpemUsIGludCAqdHRsLCBjb25zdCBjaGFyICp1cmwpCit7CisgICAgaW50IHBvcnQ7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyIHByb3RvWzMyXTsKKworICAgIGF2X3VybF9zcGxpdChwcm90bywgc2l6ZW9mKHByb3RvKSwgTlVMTCwgMCwgZGVzdF9hZGRyLCBzaXplLCAmcG9ydCwgTlVMTCwgMCwgdXJsKTsKKworICAgICp0dGwgPSAwOworCisgICAgaWYgKHN0cmNtcChwcm90bywgInJ0cCIpICYmIHN0cmNtcChwcm90bywgInNydHAiKSkgeworICAgICAgICAvKiBUaGUgdXJsIGlzbid0IGZvciB0aGUgYWN0dWFsIHJ0cCBzZXNzaW9ucywKKyAgICAgICAgICogZG9uJ3QgcGFyc2Ugb3V0IGFueXRoaW5nIGVsc2UgdGhhbiB0aGUgZGVzdGluYXRpb24uCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwID0gc3RyY2hyKHVybCwgJz8nKTsKKyAgICBpZiAocCkgeworICAgICAgICBjaGFyIGJ1ZmZbNjRdOworCisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1ZmYsIHNpemVvZihidWZmKSwgInR0bCIsIHApKSB7CisgICAgICAgICAgICAqdHRsID0gc3RydG9sKGJ1ZmYsIE5VTEwsIDEwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp0dGwgPSA1OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBvcnQ7Cit9CisKKyNkZWZpbmUgTUFYX1BTRVRfU0laRSAxMDI0CitzdGF0aWMgY2hhciAqZXh0cmFkYXRhMnBzZXRzKEFWQ29kZWNDb250ZXh0ICpjKQoreworICAgIGNoYXIgKnBzZXRzLCAqcDsKKyAgICBjb25zdCB1aW50OF90ICpyOworICAgIHN0YXRpYyBjb25zdCBjaGFyIHBzZXRfc3RyaW5nW10gPSAiOyBzcHJvcC1wYXJhbWV0ZXItc2V0cz0iOworICAgIHN0YXRpYyBjb25zdCBjaGFyIHByb2ZpbGVfc3RyaW5nW10gPSAiOyBwcm9maWxlLWxldmVsLWlkPSI7CisgICAgdWludDhfdCAqZXh0cmFkYXRhID0gYy0+ZXh0cmFkYXRhOworICAgIGludCBleHRyYWRhdGFfc2l6ZSA9IGMtPmV4dHJhZGF0YV9zaXplOworICAgIHVpbnQ4X3QgKnRtcGJ1ZiA9IE5VTEw7CisgICAgY29uc3QgdWludDhfdCAqc3BzID0gTlVMTCwgKnNwc19lbmQ7CisKKyAgICBpZiAoYy0+ZXh0cmFkYXRhX3NpemUgPiBNQVhfRVhUUkFEQVRBX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIlRvbyBtdWNoIGV4dHJhZGF0YSFcbiIpOworCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoYy0+ZXh0cmFkYXRhWzBdID09IDEpIHsKKyAgICAgICAgaWYgKGZmX2F2Y193cml0ZV9hbm5leGJfZXh0cmFkYXRhKGMtPmV4dHJhZGF0YSwgJmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRyYWRhdGFfc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdG1wYnVmID0gZXh0cmFkYXRhOworICAgIH0KKworICAgIHBzZXRzID0gYXZfbWFsbG9jeihNQVhfUFNFVF9TSVpFKTsKKyAgICBpZiAoIXBzZXRzKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcGFyYW1ldGVyIHNldHMuXG4iKTsKKyAgICAgICAgYXZfZnJlZSh0bXBidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtY3B5KHBzZXRzLCBwc2V0X3N0cmluZywgc3RybGVuKHBzZXRfc3RyaW5nKSk7CisgICAgcCA9IHBzZXRzICsgc3RybGVuKHBzZXRfc3RyaW5nKTsKKyAgICByID0gZmZfYXZjX2ZpbmRfc3RhcnRjb2RlKGV4dHJhZGF0YSwgZXh0cmFkYXRhICsgZXh0cmFkYXRhX3NpemUpOworICAgIHdoaWxlIChyIDwgZXh0cmFkYXRhICsgZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcjE7CisgICAgICAgIHVpbnQ4X3QgbmFsX3R5cGU7CisKKyAgICAgICAgd2hpbGUgKCEqKHIrKykpOworICAgICAgICBuYWxfdHlwZSA9ICpyICYgMHgxZjsKKyAgICAgICAgcjEgPSBmZl9hdmNfZmluZF9zdGFydGNvZGUociwgZXh0cmFkYXRhICsgZXh0cmFkYXRhX3NpemUpOworICAgICAgICBpZiAobmFsX3R5cGUgIT0gNyAmJiBuYWxfdHlwZSAhPSA4KSB7IC8qIE9ubHkgb3V0cHV0IFNQUyBhbmQgUFBTICovCisgICAgICAgICAgICByID0gcjE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocCAhPSAocHNldHMgKyBzdHJsZW4ocHNldF9zdHJpbmcpKSkgeworICAgICAgICAgICAgKnAgPSAnLCc7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzcHMpIHsKKyAgICAgICAgICAgIHNwcyA9IHI7CisgICAgICAgICAgICBzcHNfZW5kID0gcjE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhdl9iYXNlNjRfZW5jb2RlKHAsIE1BWF9QU0VUX1NJWkUgLSAocCAtIHBzZXRzKSwgciwgcjEgLSByKSkgeworICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBCYXNlNjQtZW5jb2RlICUiUFRSRElGRl9TUEVDSUZJRVIiICUiUFRSRElGRl9TUEVDSUZJRVIiIVxuIiwgTUFYX1BTRVRfU0laRSAtIChwIC0gcHNldHMpLCByMSAtIHIpOworICAgICAgICAgICAgYXZfZnJlZShwc2V0cyk7CisgICAgICAgICAgICBhdl9mcmVlKHRtcGJ1Zik7CisKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHAgKz0gc3RybGVuKHApOworICAgICAgICByID0gcjE7CisgICAgfQorICAgIGlmIChzcHMgJiYgc3BzX2VuZCAtIHNwcyA+PSA0KSB7CisgICAgICAgIG1lbWNweShwLCBwcm9maWxlX3N0cmluZywgc3RybGVuKHByb2ZpbGVfc3RyaW5nKSk7CisgICAgICAgIHAgKz0gc3RybGVuKHApOworICAgICAgICBmZl9kYXRhX3RvX2hleChwLCBzcHMgKyAxLCAzLCAwKTsKKyAgICAgICAgcFs2XSA9ICdcMCc7CisgICAgfQorICAgIGF2X2ZyZWUodG1wYnVmKTsKKworICAgIHJldHVybiBwc2V0czsKK30KKworc3RhdGljIGNoYXIgKmV4dHJhZGF0YTJwc2V0c19oZXZjKEFWQ29kZWNDb250ZXh0ICpjKQoreworICAgIGNoYXIgKnBzZXRzOworICAgIHVpbnQ4X3QgKmV4dHJhZGF0YSA9IGMtPmV4dHJhZGF0YTsKKyAgICBpbnQgZXh0cmFkYXRhX3NpemUgPSBjLT5leHRyYWRhdGFfc2l6ZTsKKyAgICB1aW50OF90ICp0bXBidWYgPSBOVUxMOworICAgIGludCBwc19wb3NbM10gPSB7IDAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBzX25hbWVzWzNdID0geyAidnBzIiwgInNwcyIsICJwcHMiIH07CisgICAgaW50IG51bV9hcnJheXMsIG51bV9uYWx1czsKKyAgICBpbnQgcG9zLCBpLCBqOworCisgICAgLy8gQ29udmVydCB0byBodmNjIGZvcm1hdC4gU2luY2Ugd2UgbmVlZCB0byBncm91cCBtdWx0aXBsZSBOQUxVcyBvZgorICAgIC8vIHRoZSBzYW1lIHR5cGUsIGFuZCB3ZSBtaWdodCBuZWVkIHRvIGNvbnZlcnQgZnJvbSBvbmUgZm9ybWF0IHRvIHRoZQorICAgIC8vIG90aGVyIGFueXdheSwgd2UgZ2V0IGF3YXkgd2l0aCBhIGxpdHRsZSBsZXNzIHdvcmsgYnkgdXNpbmcgdGhlIGh2Y2MKKyAgICAvLyBmb3JtYXQuCisgICAgaWYgKGMtPmV4dHJhZGF0YVswXSAhPSAxKSB7CisgICAgICAgIEFWSU9Db250ZXh0ICpwYjsKKyAgICAgICAgaWYgKGF2aW9fb3Blbl9keW5fYnVmKCZwYikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChmZl9pc29tX3dyaXRlX2h2Y2MocGIsIGMtPmV4dHJhZGF0YSwgYy0+ZXh0cmFkYXRhX3NpemUsIDApIDwgMCkgeworICAgICAgICAgICAgYXZpb19jbG9zZV9keW5fYnVmKHBiLCAmdG1wYnVmKTsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIGV4dHJhZGF0YV9zaXplID0gYXZpb19jbG9zZV9keW5fYnVmKHBiLCAmZXh0cmFkYXRhKTsKKyAgICAgICAgdG1wYnVmID0gZXh0cmFkYXRhOworICAgIH0KKworICAgIGlmIChleHRyYWRhdGFfc2l6ZSA8IDIzKQorICAgICAgICBnb3RvIGVycjsKKworICAgIG51bV9hcnJheXMgPSBleHRyYWRhdGFbMjJdOworICAgIHBvcyA9IDIzOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYXJyYXlzOyBpKyspIHsKKyAgICAgICAgaW50IG51bV9uYWx1cywgbmFsdV90eXBlOworICAgICAgICBpZiAocG9zICsgMyA+IGV4dHJhZGF0YV9zaXplKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIG5hbHVfdHlwZSA9IGV4dHJhZGF0YVtwb3NdICYgMHgzZjsKKyAgICAgICAgLy8gTm90IGluY2x1ZGluZyBsaWJhdmNvZGVjL2hldmMuaCB0byBhdm9pZCBjb25mdXNpb24gYmV0d2VlbgorICAgICAgICAvLyBOQUxfKiB3aXRoIHRoZSBzYW1lIG5hbWUgZm9yIGJvdGggSDI2NCBhbmQgSEVWQy4KKyAgICAgICAgaWYgKG5hbHVfdHlwZSA9PSAzMikgLy8gVlBTCisgICAgICAgICAgICBwc19wb3NbMF0gPSBwb3M7CisgICAgICAgIGVsc2UgaWYgKG5hbHVfdHlwZSA9PSAzMykgLy8gU1BTCisgICAgICAgICAgICBwc19wb3NbMV0gPSBwb3M7CisgICAgICAgIGVsc2UgaWYgKG5hbHVfdHlwZSA9PSAzNCkgLy8gUFBTCisgICAgICAgICAgICBwc19wb3NbMl0gPSBwb3M7CisgICAgICAgIG51bV9uYWx1cyA9IEFWX1JCMTYoJmV4dHJhZGF0YVtwb3MgKyAxXSk7CisgICAgICAgIHBvcyArPSAzOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX25hbHVzOyBqKyspIHsKKyAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICBpZiAocG9zICsgMiA+IGV4dHJhZGF0YV9zaXplKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgbGVuID0gQVZfUkIxNigmZXh0cmFkYXRhW3Bvc10pOworICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICBpZiAocG9zICsgbGVuID4gZXh0cmFkYXRhX3NpemUpCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICBwb3MgKz0gbGVuOworICAgICAgICB9CisgICAgfQorICAgIGlmICghcHNfcG9zWzBdIHx8ICFwc19wb3NbMV0gfHwgIXBzX3Bvc1syXSkKKyAgICAgICAgZ290byBlcnI7CisKKyAgICBwc2V0cyA9IGF2X21hbGxvY3ooTUFYX1BTRVRfU0laRSk7CisgICAgaWYgKCFwc2V0cykKKyAgICAgICAgZ290byBlcnI7CisgICAgcHNldHNbMF0gPSAnXDAnOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBwb3MgPSBwc19wb3NbaV07CisKKyAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgYXZfc3RybGNhdChwc2V0cywgIjsgIiwgTUFYX1BTRVRfU0laRSk7CisgICAgICAgIGF2X3N0cmxjYXRmKHBzZXRzLCBNQVhfUFNFVF9TSVpFLCAic3Byb3AtJXM9IiwgcHNfbmFtZXNbaV0pOworCisgICAgICAgIC8vIFNraXBwaW5nIGJvdW5kYXJ5IGNoZWNrcyBpbiB0aGUgaW5wdXQgaGVyZTsgd2UndmUgYWxyZWFkeSB0cmF2ZXJzZWQKKyAgICAgICAgLy8gdGhlIHdob2xlIGh2Y2Mgc3RydWN0dXJlIGFib3ZlIHdpdGhvdXQgaXNzdWVzCisgICAgICAgIG51bV9uYWx1cyA9IEFWX1JCMTYoJmV4dHJhZGF0YVtwb3MgKyAxXSk7CisgICAgICAgIHBvcyArPSAzOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX25hbHVzOyBqKyspIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBBVl9SQjE2KCZleHRyYWRhdGFbcG9zXSk7CisgICAgICAgICAgICBpbnQgc3RycG9zOworICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICBpZiAoaiA+IDApCisgICAgICAgICAgICAgICAgYXZfc3RybGNhdChwc2V0cywgIiwiLCBNQVhfUFNFVF9TSVpFKTsKKyAgICAgICAgICAgIHN0cnBvcyA9IHN0cmxlbihwc2V0cyk7CisgICAgICAgICAgICBpZiAoIWF2X2Jhc2U2NF9lbmNvZGUocHNldHMgKyBzdHJwb3MsIE1BWF9QU0VUX1NJWkUgLSBzdHJwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhZGF0YVtwb3NdLCBsZW4pKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZShwc2V0cyk7CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3MgKz0gbGVuOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWUodG1wYnVmKTsKKworICAgIHJldHVybiBwc2V0czsKKworZXJyOgorICAgIGF2X2ZyZWUodG1wYnVmKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKmV4dHJhZGF0YTJjb25maWcoQVZDb2RlY0NvbnRleHQgKmMpCit7CisgICAgY2hhciAqY29uZmlnOworCisgICAgaWYgKGMtPmV4dHJhZGF0YV9zaXplID4gTUFYX0VYVFJBREFUQV9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJUb28gbXVjaCBleHRyYWRhdGEhXG4iKTsKKworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY29uZmlnID0gYXZfbWFsbG9jKDEwICsgYy0+ZXh0cmFkYXRhX3NpemUgKiAyKTsKKyAgICBpZiAoIWNvbmZpZykgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGNvbmZpZyBpbmZvLlxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1jcHkoY29uZmlnLCAiOyBjb25maWc9IiwgOSk7CisgICAgZmZfZGF0YV90b19oZXgoY29uZmlnICsgOSwgYy0+ZXh0cmFkYXRhLCBjLT5leHRyYWRhdGFfc2l6ZSwgMCk7CisgICAgY29uZmlnWzkgKyBjLT5leHRyYWRhdGFfc2l6ZSAqIDJdID0gMDsKKworICAgIHJldHVybiBjb25maWc7Cit9CisKK3N0YXRpYyBjaGFyICp4aXBoX2V4dHJhZGF0YTJjb25maWcoQVZDb2RlY0NvbnRleHQgKmMpCit7CisgICAgY2hhciAqY29uZmlnLCAqZW5jb2RlZF9jb25maWc7CisgICAgdWludDhfdCAqaGVhZGVyX3N0YXJ0WzNdOworICAgIGludCBoZWFkZXJzX2xlbiwgaGVhZGVyX2xlblszXSwgY29uZmlnX2xlbjsKKyAgICBpbnQgZmlyc3RfaGVhZGVyX3NpemU7CisKKyAgICBzd2l0Y2ggKGMtPmNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9USEVPUkE6CisgICAgICAgIGZpcnN0X2hlYWRlcl9zaXplID0gNDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfVk9SQklTOgorICAgICAgICBmaXJzdF9oZWFkZXJfc2l6ZSA9IDMwOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgWGlwaCBjb2RlYyBJRFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChhdnByaXZfc3BsaXRfeGlwaF9oZWFkZXJzKGMtPmV4dHJhZGF0YSwgYy0+ZXh0cmFkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9oZWFkZXJfc2l6ZSwgaGVhZGVyX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2xlbikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJFeHRyYWRhdGEgY29ycnVwdC5cbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBoZWFkZXJzX2xlbiA9IGhlYWRlcl9sZW5bMF0gKyBoZWFkZXJfbGVuWzJdOworICAgIGNvbmZpZ19sZW4gPSA0ICsgICAgICAgICAgLy8gY291bnQKKyAgICAgICAgICAgICAgICAgMyArICAgICAgICAgIC8vIGlkZW50CisgICAgICAgICAgICAgICAgIDIgKyAgICAgICAgICAvLyBwYWNrZXQgc2l6ZQorICAgICAgICAgICAgICAgICAxICsgICAgICAgICAgLy8gaGVhZGVyIGNvdW50CisgICAgICAgICAgICAgICAgIDIgKyAgICAgICAgICAvLyBoZWFkZXIgc2l6ZQorICAgICAgICAgICAgICAgICBoZWFkZXJzX2xlbjsgLy8gYW5kIHRoZSByZXN0CisKKyAgICBjb25maWcgPSBhdl9tYWxsb2MoY29uZmlnX2xlbik7CisgICAgaWYgKCFjb25maWcpCisgICAgICAgIGdvdG8geGlwaF9mYWlsOworCisgICAgZW5jb2RlZF9jb25maWcgPSBhdl9tYWxsb2MoQVZfQkFTRTY0X1NJWkUoY29uZmlnX2xlbikpOworICAgIGlmICghZW5jb2RlZF9jb25maWcpIHsKKyAgICAgICAgYXZfZnJlZShjb25maWcpOworICAgICAgICBnb3RvIHhpcGhfZmFpbDsKKyAgICB9CisKKyAgICBjb25maWdbMF0gPSBjb25maWdbMV0gPSBjb25maWdbMl0gPSAwOworICAgIGNvbmZpZ1szXSA9IDE7CisgICAgY29uZmlnWzRdID0gKFJUUF9YSVBIX0lERU5UID4+IDE2KSAmIDB4ZmY7CisgICAgY29uZmlnWzVdID0gKFJUUF9YSVBIX0lERU5UID4+ICA4KSAmIDB4ZmY7CisgICAgY29uZmlnWzZdID0gKFJUUF9YSVBIX0lERU5UICAgICAgKSAmIDB4ZmY7CisgICAgY29uZmlnWzddID0gKGhlYWRlcnNfbGVuID4+IDgpICYgMHhmZjsKKyAgICBjb25maWdbOF0gPSBoZWFkZXJzX2xlbiAmIDB4ZmY7CisgICAgY29uZmlnWzldID0gMjsKKyAgICBjb25maWdbMTBdID0gaGVhZGVyX2xlblswXTsKKyAgICBjb25maWdbMTFdID0gMDsgLy8gc2l6ZSBvZiBjb21tZW50IGhlYWRlcjsgbm9uZXhpc3RlbnQKKyAgICBtZW1jcHkoY29uZmlnICsgMTIsIGhlYWRlcl9zdGFydFswXSwgaGVhZGVyX2xlblswXSk7CisgICAgbWVtY3B5KGNvbmZpZyArIDEyICsgaGVhZGVyX2xlblswXSwgaGVhZGVyX3N0YXJ0WzJdLCBoZWFkZXJfbGVuWzJdKTsKKworICAgIGF2X2Jhc2U2NF9lbmNvZGUoZW5jb2RlZF9jb25maWcsIEFWX0JBU0U2NF9TSVpFKGNvbmZpZ19sZW4pLAorICAgICAgICAgICAgICAgICAgICAgY29uZmlnLCBjb25maWdfbGVuKTsKKyAgICBhdl9mcmVlKGNvbmZpZyk7CisKKyAgICByZXR1cm4gZW5jb2RlZF9jb25maWc7CisKK3hpcGhfZmFpbDoKKyAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgZm9yIGNvbmZpZ3VyYXRpb24gc3RyaW5nXG4iKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBsYXRtX2NvbnRleHQycHJvZmlsZWxldmVsKEFWQ29kZWNDb250ZXh0ICpjKQoreworICAgIC8qIE1QNEEtTEFUTQorICAgICAqIFRoZSBSVFAgcGF5bG9hZCBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyBkZXNjcmliZWQgaW4gUkZDIDMwMTYKKyAgICAgKiBUaGUgZW5jb2Rpbmcgc3BlY2lmaWNhdGlvbnMgYXJlIHByb3ZpZGVkIGluIElTTy9JRUMgMTQ0OTYtMyAqLworCisgICAgaW50IHByb2ZpbGVfbGV2ZWwgPSAweDJCOworCisgICAgLyogVE9ETzogQUFDIFByb2ZpbGUgb25seSBzdXBwb3J0cyBBQUMgTEMgT2JqZWN0IFR5cGUuCisgICAgICogRGlmZmVyZW50IE9iamVjdCBUeXBlcyBzaG91bGQgaW1wbGVtZW50IGRpZmZlcmVudCBQcm9maWxlIExldmVscyAqLworCisgICAgaWYgKGMtPnNhbXBsZV9yYXRlIDw9IDI0MDAwKSB7CisgICAgICAgIGlmIChjLT5jaGFubmVscyA8PSAyKQorICAgICAgICAgICAgcHJvZmlsZV9sZXZlbCA9IDB4Mjg7IC8vIEFBQyBQcm9maWxlLCBMZXZlbCAxCisgICAgfSBlbHNlIGlmIChjLT5zYW1wbGVfcmF0ZSA8PSA0ODAwMCkgeworICAgICAgICBpZiAoYy0+Y2hhbm5lbHMgPD0gMikgeworICAgICAgICAgICAgcHJvZmlsZV9sZXZlbCA9IDB4Mjk7IC8vIEFBQyBQcm9maWxlLCBMZXZlbCAyCisgICAgICAgIH0gZWxzZSBpZiAoYy0+Y2hhbm5lbHMgPD0gNSkgeworICAgICAgICAgICAgcHJvZmlsZV9sZXZlbCA9IDB4MkE7IC8vIEFBQyBQcm9maWxlLCBMZXZlbCA0CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMtPnNhbXBsZV9yYXRlIDw9IDk2MDAwKSB7CisgICAgICAgIGlmIChjLT5jaGFubmVscyA8PSA1KSB7CisgICAgICAgICAgICBwcm9maWxlX2xldmVsID0gMHgyQjsgLy8gQUFDIFByb2ZpbGUsIExldmVsIDUKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwcm9maWxlX2xldmVsOworfQorCitzdGF0aWMgY2hhciAqbGF0bV9jb250ZXh0MmNvbmZpZyhBVkNvZGVjQ29udGV4dCAqYykKK3sKKyAgICAvKiBNUDRBLUxBVE0KKyAgICAgKiBUaGUgUlRQIHBheWxvYWQgZm9ybWF0IHNwZWNpZmljYXRpb24gaXMgZGVzY3JpYmVkIGluIFJGQyAzMDE2CisgICAgICogVGhlIGVuY29kaW5nIHNwZWNpZmljYXRpb25zIGFyZSBwcm92aWRlZCBpbiBJU08vSUVDIDE0NDk2LTMgKi8KKworICAgIHVpbnQ4X3QgY29uZmlnX2J5dGVbNl07CisgICAgaW50IHJhdGVfaW5kZXg7CisgICAgY2hhciAqY29uZmlnOworCisgICAgZm9yIChyYXRlX2luZGV4ID0gMDsgcmF0ZV9pbmRleCA8IDE2OyByYXRlX2luZGV4KyspCisgICAgICAgIGlmIChhdnByaXZfbXBlZzRhdWRpb19zYW1wbGVfcmF0ZXNbcmF0ZV9pbmRleF0gPT0gYy0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAocmF0ZV9pbmRleCA9PSAxNikgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGVcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb25maWdfYnl0ZVswXSA9IDB4NDA7CisgICAgY29uZmlnX2J5dGVbMV0gPSAwOworICAgIGNvbmZpZ19ieXRlWzJdID0gMHgyMCB8IHJhdGVfaW5kZXg7CisgICAgY29uZmlnX2J5dGVbM10gPSBjLT5jaGFubmVscyA8PCA0OworICAgIGNvbmZpZ19ieXRlWzRdID0gMHgzZjsKKyAgICBjb25maWdfYnl0ZVs1XSA9IDB4YzA7CisKKyAgICBjb25maWcgPSBhdl9tYWxsb2MoNioyKzEpOworICAgIGlmICghY29uZmlnKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgY29uZmlnIGluZm8uXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZmX2RhdGFfdG9faGV4KGNvbmZpZywgY29uZmlnX2J5dGUsIDYsIDEpOworICAgIGNvbmZpZ1sxMl0gPSAwOworCisgICAgcmV0dXJuIGNvbmZpZzsKK30KKworc3RhdGljIGNoYXIgKnNkcF93cml0ZV9tZWRpYV9hdHRyaWJ1dGVzKGNoYXIgKmJ1ZmYsIGludCBzaXplLCBBVkNvZGVjQ29udGV4dCAqYywgaW50IHBheWxvYWRfdHlwZSwgQVZGb3JtYXRDb250ZXh0ICpmbXQpCit7CisgICAgY2hhciAqY29uZmlnID0gTlVMTDsKKworICAgIHN3aXRjaCAoYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY0OiB7CisgICAgICAgICAgICBpbnQgbW9kZSA9IDE7CisgICAgICAgICAgICBpZiAoZm10ICYmIGZtdC0+b2Zvcm1hdCAmJiBmbXQtPm9mb3JtYXQtPnByaXZfY2xhc3MgJiYKKyAgICAgICAgICAgICAgICBhdl9vcHRfZmxhZ19pc19zZXQoZm10LT5wcml2X2RhdGEsICJydHBmbGFncyIsICJoMjY0X21vZGUwIikpCisgICAgICAgICAgICAgICAgbW9kZSA9IDA7CisgICAgICAgICAgICBpZiAoYy0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBjb25maWcgPSBleHRyYWRhdGEycHNldHMoYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgSDI2NC85MDAwMFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYT1mbXRwOiVkIHBhY2tldGl6YXRpb24tbW9kZT0lZCVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgbW9kZSwgY29uZmlnID8gY29uZmlnIDogIiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYxOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwaWNfZm10ID0gTlVMTDsKKyAgICAgICAgICAgIC8qIG9ubHkgUUNJRiBhbmQgQ0lGIGFyZSBzcGVjaWZpZWQgYXMgc3VwcG9ydGVkIGluIFJGQyA0NTg3ICovCisgICAgICAgICAgICBpZiAoYy0+d2lkdGggPT0gMTc2ICYmIGMtPmhlaWdodCA9PSAxNDQpCisgICAgICAgICAgICAgICAgcGljX2ZtdCA9ICJRQ0lGPTEiOworICAgICAgICAgICAgaWYgKGMtPndpZHRoID09IDM1MiAmJiBjLT5oZWlnaHQgPT0gMjg4KQorICAgICAgICAgICAgICAgIHBpY19mbXQgPSAiQ0lGPTEiOworICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIEgyNjEvOTAwMDBcclxuIiwgcGF5bG9hZF90eXBlKTsKKyAgICAgICAgICAgIGlmIChwaWNfZm10KQorICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPWZtdHA6JWQgJXNcclxuIiwgcGF5bG9hZF90eXBlLCBwaWNfZm10KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2MzoKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzUDoKKyAgICAgICAgICAgIC8qIGE9ZnJhbWVzaXplIGlzIHJlcXVpcmVkIGJ5IDNHUFAgVFMgMjYuMjM0IChQU1MpLiBJdAorICAgICAgICAgICAgICogYWN0dWFsbHkgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHZpZGVvIHNpemUsIGJ1dCB3ZSBvbmx5IGtub3cKKyAgICAgICAgICAgICAqIHRoZSBjdXJyZW50IHNpemUuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHBsYXliYWNrIG9uIEFuZHJvaWQKKyAgICAgICAgICAgICAqIHN0YWdlZnJpZ2h0IGFuZCBvbiBTYW1zdW5nIGJhZGEuICovCisgICAgICAgICAgICBpZiAoIWZtdCB8fCAhZm10LT5vZm9ybWF0LT5wcml2X2NsYXNzIHx8CisgICAgICAgICAgICAgICAgIWF2X29wdF9mbGFnX2lzX3NldChmbXQtPnByaXZfZGF0YSwgInJ0cGZsYWdzIiwgInJmYzIxOTAiKSB8fAorICAgICAgICAgICAgICAgIGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjNQKQorICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIEgyNjMtMjAwMC85MDAwMFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYT1mcmFtZXNpemU6JWQgJWQtJWRcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgYy0+d2lkdGgsIGMtPmhlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IRVZDOgorICAgICAgICAgICAgaWYgKGMtPmV4dHJhZGF0YV9zaXplKQorICAgICAgICAgICAgICAgIGNvbmZpZyA9IGV4dHJhZGF0YTJwc2V0c19oZXZjKGMpOworICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIEgyNjUvOTAwMDBcclxuIiwgcGF5bG9hZF90eXBlKTsKKyAgICAgICAgICAgIGlmIChjb25maWcpCisgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9Zm10cDolZCAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIGNvbmZpZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHNDoKKyAgICAgICAgICAgIGlmIChjLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIGNvbmZpZyA9IGV4dHJhZGF0YTJjb25maWcoYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgTVA0Vi1FUy85MDAwMFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYT1mbXRwOiVkIHByb2ZpbGUtbGV2ZWwtaWQ9MSVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgY29uZmlnID8gY29uZmlnIDogIiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQUFDOgorICAgICAgICAgICAgaWYgKGZtdCAmJiBmbXQtPm9mb3JtYXQgJiYgZm10LT5vZm9ybWF0LT5wcml2X2NsYXNzICYmCisgICAgICAgICAgICAgICAgYXZfb3B0X2ZsYWdfaXNfc2V0KGZtdC0+cHJpdl9kYXRhLCAicnRwZmxhZ3MiLCAibGF0bSIpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnID0gbGF0bV9jb250ZXh0MmNvbmZpZyhjKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIE1QNEEtTEFUTS8lZC8lZFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImE9Zm10cDolZCBwcm9maWxlLWxldmVsLWlkPSVkO2NwcmVzZW50PTA7Y29uZmlnPSVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgYy0+c2FtcGxlX3JhdGUsIGMtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIGxhdG1fY29udGV4dDJwcm9maWxlbGV2ZWwoYyksIGNvbmZpZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBleHRyYWRhdGEyY29uZmlnKGMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBtYXliZSB3ZSBjYW4gZm9yZ2UgY29uZmlnIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgY29kZWMgcGFyYW1ldGVycy4uLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkFBQyB3aXRoIG5vIGdsb2JhbCBoZWFkZXJzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIE1QRUc0LUdFTkVSSUMvJWQvJWRcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhPWZtdHA6JWQgcHJvZmlsZS1sZXZlbC1pZD0xOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kZT1BQUMtaGJyO3NpemVsZW5ndGg9MTM7aW5kZXhsZW5ndGg9MzsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4ZGVsdGFsZW5ndGg9MyVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgYy0+c2FtcGxlX3JhdGUsIGMtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIGNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU6CisgICAgICAgICAgICBpZiAocGF5bG9hZF90eXBlID49IFJUUF9QVF9QUklWQVRFKQorICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBMMTYvJWQvJWRcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zYW1wbGVfcmF0ZSwgYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX01VTEFXOgorICAgICAgICAgICAgaWYgKHBheWxvYWRfdHlwZSA+PSBSVFBfUFRfUFJJVkFURSkKKyAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgUENNVS8lZC8lZFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnNhbXBsZV9yYXRlLCBjLT5jaGFubmVscyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fQUxBVzoKKyAgICAgICAgICAgIGlmIChwYXlsb2FkX3R5cGUgPj0gUlRQX1BUX1BSSVZBVEUpCisgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIFBDTUEvJWQvJWRcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zYW1wbGVfcmF0ZSwgYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQU1SX05COgorICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIEFNUi8lZC8lZFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYT1mbXRwOiVkIG9jdGV0LWFsaWduPTFcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIGMtPnNhbXBsZV9yYXRlLCBjLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQU1SX1dCOgorICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIEFNUi1XQi8lZC8lZFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYT1mbXRwOiVkIG9jdGV0LWFsaWduPTFcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIGMtPnNhbXBsZV9yYXRlLCBjLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfVk9SQklTOgorICAgICAgICAgICAgaWYgKGMtPmV4dHJhZGF0YV9zaXplKQorICAgICAgICAgICAgICAgIGNvbmZpZyA9IHhpcGhfZXh0cmFkYXRhMmNvbmZpZyhjKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiVm9yYmlzIGNvbmZpZ3VyYXRpb24gaW5mbyBtaXNzaW5nXG4iKTsKKyAgICAgICAgICAgIGlmICghY29uZmlnKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgdm9yYmlzLyVkLyVkXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhPWZtdHA6JWQgY29uZmlndXJhdGlvbj0lc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBjLT5zYW1wbGVfcmF0ZSwgYy0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIGNvbmZpZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9USEVPUkE6IHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBpeF9mbXQ7CisgICAgICAgICAgICBzd2l0Y2ggKGMtPnBpeF9mbXQpIHsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgICAgICAgICAgICAgIHBpeF9mbXQgPSAiWUNiQ3ItNDoyOjAiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9ICJZQ2JDci00OjI6MiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gIllDYkNyLTQ6NDo0IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYy0+ZXh0cmFkYXRhX3NpemUpCisgICAgICAgICAgICAgICAgY29uZmlnID0geGlwaF9leHRyYWRhdGEyY29uZmlnKGMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJUaGVvcmEgY29uZmlndWF0aW9uIGluZm8gbWlzc2luZ1xuIik7CisgICAgICAgICAgICBpZiAoIWNvbmZpZykKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIHRoZW9yYS85MDAwMFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYT1mbXRwOiVkIGRlbGl2ZXJ5LW1ldGhvZD1pbmxpbmU7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0lZDsgaGVpZ2h0PSVkOyBzYW1wbGluZz0lczsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZ3VyYXRpb249JXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgcGF5bG9hZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+d2lkdGgsIGMtPmhlaWdodCwgcGl4X2ZtdCwgY29uZmlnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfVlA4OgorICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIFZQOC85MDAwMFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NSlBFRzoKKyAgICAgICAgICAgIGlmIChwYXlsb2FkX3R5cGUgPj0gUlRQX1BUX1BSSVZBVEUpCisgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIEpQRUcvOTAwMDBcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0c3MjI6CisgICAgICAgICAgICBpZiAocGF5bG9hZF90eXBlID49IFJUUF9QVF9QUklWQVRFKQorICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBHNzIyLyVkLyVkXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAwMCwgYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRzcyNjogeworICAgICAgICAgICAgaWYgKHBheWxvYWRfdHlwZSA+PSBSVFBfUFRfUFJJVkFURSkKKyAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgRzcyNi0lZC8lZFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSo4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0lMQkM6CisgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgaUxCQy8lZFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYT1mbXRwOiVkIG1vZGU9JWRcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIGMtPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgYy0+YmxvY2tfYWxpZ24gPT0gMzggPyAyMCA6IDMwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1NQRUVYOgorICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIHNwZWV4LyVkXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBpZiAoYy0+Y29kZWMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhZF9vcHRpb247CisKKyAgICAgICAgICAgICAgICBpZiAoYy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FTQ0FMRSkKKyAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gIm9uIjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghYXZfb3B0X2dldF9pbnQoYywgInZhZCIsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAmdmFkX29wdGlvbikgJiYgdmFkX29wdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gInZhZCI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAib2ZmIjsKKworICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPWZtdHA6JWQgdmJyPSVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBtb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX09QVVM6CisgICAgICAgICAgICAvKiBUaGUgb3B1cyBSVFAgZHJhZnQgc2F5cyB0aGF0IGFsbCBvcHVzIHN0cmVhbXMgTVVTVCBiZSBkZWNsYXJlZAorICAgICAgICAgICAgICAgYXMgc3RlcmVvLCB0byBhdm9pZCBuZWdvdGlhdGlvbiBmYWlsdXJlcy4gVGhlIGFjdHVhbCBudW1iZXIgb2YKKyAgICAgICAgICAgICAgIGNoYW5uZWxzIGNhbiBjaGFuZ2Ugb24gYSBwYWNrZXQtYnktcGFja2V0IGJhc2lzLiBUaGUgbnVtYmVyIG9mCisgICAgICAgICAgICAgICBjaGFubmVscyBhIHJlY2VpdmVyIHByZWZlcnMgdG8gcmVjZWl2ZSBvciBhIHNlbmRlciBwbGFucyB0byBzZW5kCisgICAgICAgICAgICAgICBjYW4gYmUgZGVjbGFyZWQgdmlhIGZtdHAgcGFyYW1ldGVycyAoYm90aCBkZWZhdWx0IHRvIG1vbm8pLCBidXQKKyAgICAgICAgICAgICAgIHJlY2VpdmVycyBNVVNUIGJlIGFibGUgdG8gcmVjZWl2ZSBhbmQgcHJvY2VzcyBzdGVyZW8gcGFja2V0cy4gKi8KKyAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBvcHVzLzQ4MDAwLzJcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUpOworICAgICAgICAgICAgaWYgKGMtPmNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1mbXRwOiVkIHNwcm9wLXN0ZXJlbzoxXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIE5vdGhpbmcgc3BlY2lhbCB0byBkbyBoZXJlLi4uICovCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBhdl9mcmVlKGNvbmZpZyk7CisKKyAgICByZXR1cm4gYnVmZjsKK30KKwordm9pZCBmZl9zZHBfd3JpdGVfbWVkaWEoY2hhciAqYnVmZiwgaW50IHNpemUsIEFWU3RyZWFtICpzdCwgaW50IGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc3RfYWRkciwgY29uc3QgY2hhciAqZGVzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsIGludCB0dGwsIEFWRm9ybWF0Q29udGV4dCAqZm10KQoreworICAgIEFWQ29kZWNDb250ZXh0ICpjID0gc3QtPmNvZGVjOworICAgIGNvbnN0IGNoYXIgKnR5cGU7CisgICAgaW50IHBheWxvYWRfdHlwZTsKKworICAgIHBheWxvYWRfdHlwZSA9IGZmX3J0cF9nZXRfcGF5bG9hZF90eXBlKGZtdCwgYywgaWR4KTsKKworICAgIHN3aXRjaCAoYy0+Y29kZWNfdHlwZSkgeworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTyAgIDogdHlwZSA9ICJ2aWRlbyIgICAgICA7IGJyZWFrOworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTyAgIDogdHlwZSA9ICJhdWRpbyIgICAgICA7IGJyZWFrOworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRTogdHlwZSA9ICJ0ZXh0IiAgICAgICA7IGJyZWFrOworICAgICAgICBkZWZhdWx0ICAgICAgICAgICAgICAgICA6IHR5cGUgPSAiYXBwbGljYXRpb24iOyBicmVhazsKKyAgICB9CisKKyAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAibT0lcyAlZCBSVFAvQVZQICVkXHJcbiIsIHR5cGUsIHBvcnQsIHBheWxvYWRfdHlwZSk7CisgICAgc2RwX3dyaXRlX2FkZHJlc3MoYnVmZiwgc2l6ZSwgZGVzdF9hZGRyLCBkZXN0X3R5cGUsIHR0bCk7CisgICAgaWYgKGMtPmJpdF9yYXRlKSB7CisgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJiPUFTOiVkXHJcbiIsIGMtPmJpdF9yYXRlIC8gMTAwMCk7CisgICAgfQorCisgICAgc2RwX3dyaXRlX21lZGlhX2F0dHJpYnV0ZXMoYnVmZiwgc2l6ZSwgYywgcGF5bG9hZF90eXBlLCBmbXQpOworfQorCitpbnQgYXZfc2RwX2NyZWF0ZShBVkZvcm1hdENvbnRleHQgKmFjW10sIGludCBuX2ZpbGVzLCBjaGFyICpidWYsIGludCBzaXplKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0aXRsZSA9IGF2X2RpY3RfZ2V0KGFjWzBdLT5tZXRhZGF0YSwgInRpdGxlIiwgTlVMTCwgMCk7CisgICAgc3RydWN0IHNkcF9zZXNzaW9uX2xldmVsIHMgPSB7IDAgfTsKKyAgICBpbnQgaSwgaiwgcG9ydCwgdHRsLCBpc19tdWx0aWNhc3QsIGluZGV4ID0gMDsKKyAgICBjaGFyIGRzdFszMl0sIGRzdF90eXBlWzVdOworCisgICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZSk7CisgICAgcy51c2VyID0gIi0iOworICAgIHMuc3JjX2FkZHIgPSAiMTI3LjAuMC4xIjsgICAgLyogRklYTUU6IFByb3Blcmx5IHNldCB0aGlzICovCisgICAgcy5zcmNfdHlwZSA9ICJJUDQiOworICAgIHMubmFtZSA9IHRpdGxlID8gdGl0bGUtPnZhbHVlIDogIk5vIE5hbWUiOworCisgICAgcG9ydCA9IDA7CisgICAgdHRsID0gMDsKKyAgICBpZiAobl9maWxlcyA9PSAxKSB7CisgICAgICAgIHBvcnQgPSBzZHBfZ2V0X2FkZHJlc3MoZHN0LCBzaXplb2YoZHN0KSwgJnR0bCwgYWNbMF0tPmZpbGVuYW1lKTsKKyAgICAgICAgaXNfbXVsdGljYXN0ID0gcmVzb2x2ZV9kZXN0aW5hdGlvbihkc3QsIHNpemVvZihkc3QpLCBkc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZHN0X3R5cGUpKTsKKyAgICAgICAgaWYgKCFpc19tdWx0aWNhc3QpCisgICAgICAgICAgICB0dGwgPSAwOworICAgICAgICBpZiAoZHN0WzBdKSB7CisgICAgICAgICAgICBzLmRzdF9hZGRyID0gZHN0OworICAgICAgICAgICAgcy5kc3RfdHlwZSA9IGRzdF90eXBlOworICAgICAgICAgICAgcy50dGwgPSB0dGw7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChkc3RfdHlwZSwgIklQNiIpKSB7CisgICAgICAgICAgICAgICAgcy5zcmNfYWRkciA9ICI6OjEiOworICAgICAgICAgICAgICAgIHMuc3JjX3R5cGUgPSAiSVA2IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzZHBfd3JpdGVfaGVhZGVyKGJ1Ziwgc2l6ZSwgJnMpOworCisgICAgZHN0WzBdID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9maWxlczsgaSsrKSB7CisgICAgICAgIGlmIChuX2ZpbGVzICE9IDEpIHsKKyAgICAgICAgICAgIHBvcnQgPSBzZHBfZ2V0X2FkZHJlc3MoZHN0LCBzaXplb2YoZHN0KSwgJnR0bCwgYWNbaV0tPmZpbGVuYW1lKTsKKyAgICAgICAgICAgIGlzX211bHRpY2FzdCA9IHJlc29sdmVfZGVzdGluYXRpb24oZHN0LCBzaXplb2YoZHN0KSwgZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkc3RfdHlwZSkpOworICAgICAgICAgICAgaWYgKCFpc19tdWx0aWNhc3QpCisgICAgICAgICAgICAgICAgdHRsID0gMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgYWNbaV0tPm5iX3N0cmVhbXM7IGorKykgeworICAgICAgICAgICAgZmZfc2RwX3dyaXRlX21lZGlhKGJ1Ziwgc2l6ZSwgYWNbaV0tPnN0cmVhbXNbal0sIGluZGV4KyssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzBdID8gZHN0IDogTlVMTCwgZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvcnQgPiAwKSA/IHBvcnQgKyBqICogMiA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsLCBhY1tpXSk7CisgICAgICAgICAgICBpZiAocG9ydCA8PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYT1jb250cm9sOnN0cmVhbWlkPSVkXHJcbiIsIGkgKyBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhY1tpXS0+cGIgJiYgYWNbaV0tPnBiLT5hdl9jbGFzcykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNyeXB0b19zdWl0ZSA9IE5VTEwsICpjcnlwdG9fcGFyYW1zID0gTlVMTDsKKyAgICAgICAgICAgICAgICBhdl9vcHRfZ2V0KGFjW2ldLT5wYiwgInNydHBfb3V0X3N1aXRlIiwgIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3J5cHRvX3N1aXRlKTsKKyAgICAgICAgICAgICAgICBhdl9vcHRfZ2V0KGFjW2ldLT5wYiwgInNydHBfb3V0X3BhcmFtcyIsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3J5cHRvX3BhcmFtcyk7CisgICAgICAgICAgICAgICAgaWYgKGNyeXB0b19zdWl0ZSAmJiBjcnlwdG9fc3VpdGVbMF0pCisgICAgICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1Ziwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImE9Y3J5cHRvOjEgJXMgaW5saW5lOiVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0b19zdWl0ZSwgY3J5cHRvX3BhcmFtcyk7CisgICAgICAgICAgICAgICAgYXZfZnJlZShjcnlwdG9fc3VpdGUpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoY3J5cHRvX3BhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbHNlCitpbnQgYXZfc2RwX2NyZWF0ZShBVkZvcm1hdENvbnRleHQgKmFjW10sIGludCBuX2ZpbGVzLCBjaGFyICpidWYsIGludCBzaXplKQoreworICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Cit9CisKK3ZvaWQgZmZfc2RwX3dyaXRlX21lZGlhKGNoYXIgKmJ1ZmYsIGludCBzaXplLCBBVlN0cmVhbSAqc3QsIGludCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXN0X2FkZHIsIGNvbnN0IGNoYXIgKmRlc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LCBpbnQgdHRsLCBBVkZvcm1hdENvbnRleHQgKmZtdCkKK3sKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NkcjIuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zZHIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0MDVmNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zZHIyLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBTRFIyIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgc2RyMl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoQVZfUkwzMihwLT5idWYpICE9IE1LVEFHKCdTJywgJ1InLCAnQScsIDEpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKK30KKworI2RlZmluZSBGSVJTVCAweEE4CisKK3N0YXRpYyBpbnQgc2RyMl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0LCAqYXN0OworCisgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKKyAgICBpZiAoIWFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZpb19za2lwKHMtPnBiLCAyMCk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGF2aW9fcmwzMihzLT5wYikpOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfSDI2NDsKKyAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworCisgICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSAxOworICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gODAwMDsKKyAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgNjQsIDEsIDgwMDApOworCisgICAgYXZpb19zZWVrKHMtPnBiLCBGSVJTVCwgU0VFS19TRVQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGhlYWRlclsyNF0gPSB7CisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHg0MiwgMHgwMCwgMHgxZSwKKyAgICAweGE2LCAweDgwLCAweGIwLCAweDdlLCAweDQwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDEsIDB4NjgsIDB4Y2UsIDB4MzgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgc2RyMl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50NjRfdCBwb3M7CisgICAgdW5zaWduZWQgbmV4dDsKKyAgICBpbnQgZmxhZ3MsIHJldCA9IDAsIGlzX3ZpZGVvOworCisgICAgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKworICAgIGZsYWdzID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBhdmlvX3NraXAocy0+cGIsIDQpOworCisgICAgbmV4dCA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgaWYgKG5leHQgPD0gNTIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYXZpb19za2lwKHMtPnBiLCA2KTsKKyAgICBpc192aWRlbyA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgYXZpb19za2lwKHMtPnBiLCAzMCk7CisKKyAgICBpZiAocG9zID09IEZJUlNUKSB7CisgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgbmV4dCAtIDUyICsgMjQpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIGhlYWRlciwgMjQpOworICAgICAgICByZXQgPSBhdmlvX3JlYWQocy0+cGIsIHBrdC0+ZGF0YSArIDI0LCBuZXh0IC0gNTIpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYXZfc2hyaW5rX3BhY2tldChwa3QsIHJldCArIDI0KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIG5leHQgLSA1Mik7CisgICAgfQorICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gISFpc192aWRlbzsKKyAgICBwa3QtPnBvcyA9IHBvczsKKyAgICBpZiAoZmxhZ3MgJiAoMSA8PCAxMikpCisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zZHIyX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgID0gInNkcjIiLAorICAgIC5sb25nX25hbWUgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTRFIyIiksCisgICAgLnJlYWRfcHJvYmUgID0gc2RyMl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgPSBzZHIyX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCA9IHNkcjJfcmVhZF9wYWNrZXQsCisgICAgLmV4dGVuc2lvbnMgID0gInNkcjIiLAorICAgIC5mbGFncyAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NlZWstdGVzdC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NlZWstdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMDYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc2Vlay10ZXN0LmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorCitzdGF0aWMgY2hhciBidWZmZXJbMjBdOworCitzdGF0aWMgY29uc3QgY2hhciAqcmV0X3N0cihpbnQgdikKK3sKKyAgICBzd2l0Y2ggKHYpIHsKKyAgICBjYXNlIEFWRVJST1JfRU9GOiAgICAgcmV0dXJuICItRU9GIjsKKyAgICBjYXNlIEFWRVJST1IoRUlPKTogICAgcmV0dXJuICItRUlPIjsKKyAgICBjYXNlIEFWRVJST1IoRU5PTUVNKTogcmV0dXJuICItRU5PTUVNIjsKKyAgICBjYXNlIEFWRVJST1IoRUlOVkFMKTogcmV0dXJuICItRUlOVkFMIjsKKyAgICBkZWZhdWx0OgorICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJTJkIiwgdik7CisgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0c19zdHIoY2hhciBidWZmZXJbNjBdLCBpbnQ2NF90IHRzLCBBVlJhdGlvbmFsIGJhc2UpCit7CisgICAgaWYgKHRzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIHN0cmNweShidWZmZXIsICIgTk9QVFMgICAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0cz0gYXZfcmVzY2FsZV9xKHRzLCBiYXNlLCAoQVZSYXRpb25hbCl7MSwgMTAwMDAwMH0pOworICAgIHNucHJpbnRmKGJ1ZmZlciwgNjAsICIlYyUiUFJJZDY0Ii4lMDYiUFJJZDY0IiIsIHRzPDAgPyAnLScgOiAnICcsIEZGQUJTKHRzKS8xMDAwMDAwLCBGRkFCUyh0cyklMTAwMDAwMCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICBBVkZvcm1hdENvbnRleHQgKmljID0gTlVMTDsKKyAgICBpbnQgaSwgcmV0LCBzdHJlYW1faWQ7CisgICAgaW50IGo7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgQVZEaWN0aW9uYXJ5ICpmb3JtYXRfb3B0cyA9IE5VTEw7CisgICAgaW50NjRfdCBzZWVrZmlyc3QgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBpbnQgZmlyc3RiYWNrPTA7CisgICAgaW50IGZyYW1lX2NvdW50ID0gMTsKKyAgICBpbnQgZHVyYXRpb24gPSA0OworCisgICAgZm9yKGk9MjsgaTxhcmdjOyBpKz0yKXsKKyAgICAgICAgaWYgICAgICAgKCFzdHJjbXAoYXJndltpXSwgIi1zZWVrZm9ydyIpKXsKKyAgICAgICAgICAgIHNlZWtmaXJzdCA9IGF0b2koYXJndltpKzFdKTsKKyAgICAgICAgfSBlbHNlIGlmKCFzdHJjbXAoYXJndltpXSwgIi1zZWVrYmFjayIpKXsKKyAgICAgICAgICAgIHNlZWtmaXJzdCA9IGF0b2koYXJndltpKzFdKTsKKyAgICAgICAgICAgIGZpcnN0YmFjayA9IDE7CisgICAgICAgIH0gZWxzZSBpZighc3RyY21wKGFyZ3ZbaV0sICItZnJhbWVzIikpeworICAgICAgICAgICAgZnJhbWVfY291bnQgPSBhdG9pKGFyZ3ZbaSsxXSk7CisgICAgICAgIH0gZWxzZSBpZighc3RyY21wKGFyZ3ZbaV0sICItZHVyYXRpb24iKSl7CisgICAgICAgICAgICBkdXJhdGlvbiA9IGF0b2koYXJndltpKzFdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ2MgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZGljdF9zZXQoJmZvcm1hdF9vcHRzLCAiY2hhbm5lbHMiLCAiMSIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZmb3JtYXRfb3B0cywgInNhbXBsZV9yYXRlIiwgIjIyMDUwIiwgMCk7CisKKyAgICAvKiBpbml0aWFsaXplIGxpYmF2Y29kZWMsIGFuZCByZWdpc3RlciBhbGwgY29kZWNzIGFuZCBmb3JtYXRzICovCisgICAgYXZfcmVnaXN0ZXJfYWxsKCk7CisKKyAgICBpZiAoYXJnYyA8IDIpIHsKKyAgICAgICAgcHJpbnRmKCJ1c2FnZTogJXMgaW5wdXRfZmlsZVxuIgorICAgICAgICAgICAgICAgIlxuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGZpbGVuYW1lID0gYXJndlsxXTsKKworICAgIHJldCA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJmljLCBmaWxlbmFtZSwgTlVMTCwgJmZvcm1hdF9vcHRzKTsKKyAgICBhdl9kaWN0X2ZyZWUoJmZvcm1hdF9vcHRzKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldCA9IGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oaWMsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvdWxkIG5vdCBmaW5kIGNvZGVjIHBhcmFtZXRlcnNcbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoc2Vla2ZpcnN0ICE9IEFWX05PUFRTX1ZBTFVFKXsKKyAgICAgICAgaWYoZmlyc3RiYWNrKSAgIGF2Zm9ybWF0X3NlZWtfZmlsZShpYywgLTEsIElOVDY0X01JTiwgc2Vla2ZpcnN0LCBzZWVrZmlyc3QsIDApOworICAgICAgICBlbHNlICAgICAgICAgICAgYXZmb3JtYXRfc2Vla19maWxlKGljLCAtMSwgc2Vla2ZpcnN0LCBzZWVrZmlyc3QsIElOVDY0X01BWCwgMCk7CisgICAgfQorICAgIGZvcihpPTA7IDsgaSsrKXsKKyAgICAgICAgQVZQYWNrZXQgcGt0ID0geyAwIH07CisgICAgICAgIEFWU3RyZWFtICphdl91bmluaXQoc3QpOworICAgICAgICBjaGFyIHRzX2J1Zls2MF07CisKKyAgICAgICAgaWYocmV0Pj0wKXsKKyAgICAgICAgICAgIGZvcihqPTA7IGo8ZnJhbWVfY291bnQ7IGorKykgeworICAgICAgICAgICAgcmV0PSBhdl9yZWFkX2ZyYW1lKGljLCAmcGt0KTsKKyAgICAgICAgICAgIGlmKHJldD49MCl7CisgICAgICAgICAgICAgICAgY2hhciBkdHNfYnVmWzYwXTsKKyAgICAgICAgICAgICAgICBzdD0gaWMtPnN0cmVhbXNbcGt0LnN0cmVhbV9pbmRleF07CisgICAgICAgICAgICAgICAgdHNfc3RyKGR0c19idWYsIHBrdC5kdHMsIHN0LT50aW1lX2Jhc2UpOworICAgICAgICAgICAgICAgIHRzX3N0cih0c19idWYsICBwa3QucHRzLCBzdC0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgICAgICBwcmludGYoInJldDolLTEwcyBzdDolMmQgZmxhZ3M6JWQgZHRzOiVzIHB0czolcyBwb3M6JTciIFBSSWQ2NCAiIHNpemU6JTZkIiwgcmV0X3N0cihyZXQpLCBwa3Quc3RyZWFtX2luZGV4LCBwa3QuZmxhZ3MsIGR0c19idWYsIHRzX2J1ZiwgcGt0LnBvcywgcGt0LnNpemUpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZwa3QpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJyZXQ6JXMiLCByZXRfc3RyKHJldCkpOyAvLyBuZWNlc3NhcnkgdG8gYXZvaWQgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoaT4yNSkgYnJlYWs7CisKKyAgICAgICAgc3RyZWFtX2lkPSAoaT4+MSklKGljLT5uYl9zdHJlYW1zKzEpIC0gMTsKKyAgICAgICAgdGltZXN0YW1wPSAoaSoxOTM2Mjg5NDE2N0xMKSAlIChkdXJhdGlvbipBVl9USU1FX0JBU0UpIC0gQVZfVElNRV9CQVNFOworICAgICAgICBpZihzdHJlYW1faWQ+PTApeworICAgICAgICAgICAgc3Q9IGljLT5zdHJlYW1zW3N0cmVhbV9pZF07CisgICAgICAgICAgICB0aW1lc3RhbXA9IGF2X3Jlc2NhbGVfcSh0aW1lc3RhbXAsIEFWX1RJTUVfQkFTRV9RLCBzdC0+dGltZV9iYXNlKTsKKyAgICAgICAgfQorICAgICAgICAvL0ZJWE1FIGZ1bGx5IHRlc3QgdGhlIG5ldyBzZWVrIEFQSQorICAgICAgICBpZihpJjEpIHJldCA9IGF2Zm9ybWF0X3NlZWtfZmlsZShpYywgc3RyZWFtX2lkLCBJTlQ2NF9NSU4sIHRpbWVzdGFtcCwgdGltZXN0YW1wLCAwKTsKKyAgICAgICAgZWxzZSAgICByZXQgPSBhdmZvcm1hdF9zZWVrX2ZpbGUoaWMsIHN0cmVhbV9pZCwgdGltZXN0YW1wLCB0aW1lc3RhbXAsIElOVDY0X01BWCwgMCk7CisgICAgICAgIHRzX3N0cih0c19idWYsIHRpbWVzdGFtcCwgc3RyZWFtX2lkIDwgMCA/IEFWX1RJTUVfQkFTRV9RIDogc3QtPnRpbWVfYmFzZSk7CisgICAgICAgIHByaW50ZigicmV0OiUtMTBzIHN0OiUyZCBmbGFnczolZCAgdHM6JXNcbiIsIHJldF9zdHIocmV0KSwgc3RyZWFtX2lkLCBpJjEsIHRzX2J1Zik7CisgICAgfQorCisgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmljKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NlZWsuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zZWVrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2OGI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zZWVrLmMKQEAgLTAsMCArMSw1MDggQEAKKy8qCisgKiBzZWVrIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aGluIGZvcm1hdCBoYW5kbGVycworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJdmFuIFNjaHJldGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInNlZWsuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLy8gTk9URTogaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIG1vdmVkIGhlcmUgaW4gYW5vdGhlciBwYXRjaCwgdG8ga2VlcCBwYXRjaGVzCisvLyBzZXBhcmF0ZWQuCisKKy8qKgorICogaGVscGVyIHN0cnVjdHVyZSBkZXNjcmliaW5nIGtleWZyYW1lIHNlYXJjaCBzdGF0ZSBvZiBvbmUgc3RyZWFtCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQ2NF90ICAgICBwb3NfbG87ICAgICAgLy8vPCBwb3NpdGlvbiBvZiB0aGUgZnJhbWUgd2l0aCBsb3cgdGltZXN0YW1wIGluIGZpbGUgb3IgSU5UNjRfTUFYIGlmIG5vdCBmb3VuZCAoeWV0KQorICAgIGludDY0X3QgICAgIHRzX2xvOyAgICAgICAvLy88IGZyYW1lIHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgb3Igc2FtZSBhcyBwb3NfbG8gZm9yIGJ5dGUgc2Vla2luZworCisgICAgaW50NjRfdCAgICAgcG9zX2hpOyAgICAgIC8vLzwgcG9zaXRpb24gb2YgdGhlIGZyYW1lIHdpdGggaGlnaCB0aW1lc3RhbXAgaW4gZmlsZSBvciBJTlQ2NF9NQVggaWYgbm90IGZvdW5kICh5ZXQpCisgICAgaW50NjRfdCAgICAgdHNfaGk7ICAgICAgIC8vLzwgZnJhbWUgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBvciBzYW1lIGFzIHBvc19oaSBmb3IgYnl0ZSBzZWVraW5nCisKKyAgICBpbnQ2NF90ICAgICBsYXN0X3BvczsgICAgLy8vPCBsYXN0IGtub3duIHBvc2l0aW9uIG9mIGEgZnJhbWUsIGZvciBtdWx0aS1mcmFtZSBwYWNrZXRzCisKKyAgICBpbnQ2NF90ICAgICB0ZXJtX3RzOyAgICAgLy8vPCB0ZXJtaW5hdGlvbiB0aW1lc3RhbXAgKHdoaWNoIFRTIHdlIGFscmVhZHkgcmVhZCkKKyAgICBBVlJhdGlvbmFsICB0ZXJtX3RzX3RiOyAgLy8vPCB0aW1lYmFzZSBmb3IgdGVybV90cworICAgIGludDY0X3QgICAgIGZpcnN0X3RzOyAgICAvLy88IGZpcnN0IHBhY2tldCB0aW1lc3RhbXAgaW4gdGhpcyBpdGVyYXRpb24gKHRvIGZpbGwgdGVybV90cyBsYXRlcikKKyAgICBBVlJhdGlvbmFsICBmaXJzdF90c190YjsgLy8vPCB0aW1lYmFzZSBmb3IgZmlyc3RfdHMKKworICAgIGludCAgICAgICAgIHRlcm1pbmF0ZWQ7ICAvLy88IHRlcm1pbmF0aW9uIGZsYWcgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbgorfSBBVlN5bmNQb2ludDsKKworLyoqCisgKiBDb21wdXRlIGEgZGlzdGFuY2UgYmV0d2VlbiB0aW1lc3RhbXBzLgorICoKKyAqIERpc3RhbmNlcyBhcmUgb25seSBjb21wYXJhYmxlLCBpZiBzYW1lIHRpbWUgYmFzZXMgYXJlIHVzZWQgZm9yIGNvbXB1dGluZworICogZGlzdGFuY2VzLgorICoKKyAqIEBwYXJhbSB0c19oaSBoaWdoIHRpbWVzdGFtcAorICogQHBhcmFtIHRiX2hpIGhpZ2ggdGltZXN0YW1wIHRpbWUgYmFzZQorICogQHBhcmFtIHRzX2xvIGxvdyB0aW1lc3RhbXAKKyAqIEBwYXJhbSB0Yl9sbyBsb3cgdGltZXN0YW1wIHRpbWUgYmFzZQorICogQHJldHVybiByZXByZXNlbnRhdGlvbiBvZiBkaXN0YW5jZSBiZXR3ZWVuIGhpZ2ggYW5kIGxvdyB0aW1lc3RhbXBzCisgKi8KK3N0YXRpYyBpbnQ2NF90IHRzX2Rpc3RhbmNlKGludDY0X3QgdHNfaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHRiX2hpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0c19sbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUmF0aW9uYWwgdGJfbG8pCit7CisgICAgaW50NjRfdCBoaSwgbG87CisKKyAgICBoaSA9IHRzX2hpICogdGJfaGkubnVtICogdGJfbG8uZGVuOworICAgIGxvID0gdHNfbG8gKiB0Yl9sby5udW0gKiB0Yl9oaS5kZW47CisKKyAgICByZXR1cm4gaGkgLSBsbzsKK30KKworLyoqCisgKiBQYXJ0aWFsIHNlYXJjaCBmb3Iga2V5ZnJhbWVzIGluIG11bHRpcGxlIHN0cmVhbXMuCisgKgorICogVGhpcyByb3V0aW5lIHNlYXJjaGVzIGluIGVhY2ggc3RyZWFtIGZvciB0aGUgbmV4dCBsb3dlciBhbmQgdGhlIG5leHQgaGlnaGVyCisgKiB0aW1lc3RhbXAgY29tcGFyZWQgdG8gdGhlIGdpdmVuIHRhcmdldCB0aW1lc3RhbXAuIFRoZSBzZWFyY2ggc3RhcnRzIGF0IHRoZSBjdXJyZW50CisgKiBmaWxlIHBvc2l0aW9uIGFuZCBlbmRzIGF0IHRoZSBmaWxlIHBvc2l0aW9uLCB3aGVyZSBhbGwgc3RyZWFtcyBoYXZlIGFscmVhZHkgYmVlbgorICogZXhhbWluZWQgKG9yIHdoZW4gYWxsIGhpZ2hlciBrZXkgZnJhbWVzIGFyZSBmb3VuZCBpbiB0aGUgZmlyc3QgaXRlcmF0aW9uKS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGl0ZXJhdGl2ZWx5IHdpdGggYW4gZXhwb25lbnRpYWwgYmFja29mZiB0byBmaW5kIHRoZSBsb3dlcgorICogdGltZXN0YW1wLgorICoKKyAqIEBwYXJhbSBzICAgICAgICAgICAgICAgICBmb3JtYXQgY29udGV4dAorICogQHBhcmFtIHRpbWVzdGFtcCAgICAgICAgIHRhcmdldCB0aW1lc3RhbXAgKG9yIHBvc2l0aW9uLCBpZiBBVlNFRUtfRkxBR19CWVRFKQorICogQHBhcmFtIHRpbWViYXNlICAgICAgICAgIHRpbWUgYmFzZSBmb3IgdGltZXN0YW1wcworICogQHBhcmFtIGZsYWdzICAgICAgICAgICAgIHNlZWtpbmcgZmxhZ3MKKyAqIEBwYXJhbSBzeW5jICAgICAgICAgICAgICBhcnJheSB3aXRoIGluZm9ybWF0aW9uIHBlciBzdHJlYW0KKyAqIEBwYXJhbSBrZXlmcmFtZXNfdG9fZmluZCBjb3VudCBvZiBrZXlmcmFtZXMgdG8gZmluZCBpbiB0b3RhbAorICogQHBhcmFtIGZvdW5kX2xvICAgICAgICAgIHB0ciB0byB0aGUgY291bnQgb2YgYWxyZWFkeSBmb3VuZCBsb3cgdGltZXN0YW1wIGtleWZyYW1lcworICogQHBhcmFtIGZvdW5kX2hpICAgICAgICAgIHB0ciB0byB0aGUgY291bnQgb2YgYWxyZWFkeSBmb3VuZCBoaWdoIHRpbWVzdGFtcCBrZXlmcmFtZXMKKyAqIEBwYXJhbSBmaXJzdF9pdGVyICAgICAgICBmbGFnIGZvciBmaXJzdCBpdGVyYXRpb24KKyAqLworc3RhdGljIHZvaWQgc2VhcmNoX2hpX2xvX2tleWZyYW1lcyhBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHRpbWViYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3luY1BvaW50ICpzeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5ZnJhbWVzX3RvX2ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZm91bmRfbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZm91bmRfaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdF9pdGVyKQoreworICAgIEFWUGFja2V0IHBrdDsKKyAgICBBVlN5bmNQb2ludCAqc3A7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCBpZHg7CisgICAgaW50IGZsZzsKKyAgICBpbnQgdGVybWluYXRlZF9jb3VudCA9IDA7CisgICAgaW50NjRfdCBwb3M7CisgICAgaW50NjRfdCBwdHMsIGR0czsgICAvLyBQVFMvRFRTIGZyb20gc3RyZWFtCisgICAgaW50NjRfdCB0czsgICAgICAgICAvLyBQVFMgaW4gc3RyZWFtLWxvY2FsIHRpbWUgYmFzZSBvciBwb3NpdGlvbiBmb3IgYnl0ZSBzZWVraW5nCisgICAgQVZSYXRpb25hbCB0c190YjsgICAvLyBUaW1lIGJhc2Ugb2YgdGhlIHN0cmVhbSBvciAxOjEgZm9yIGJ5dGUgc2Vla2luZworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoYXZfcmVhZF9mcmFtZShzLCAmcGt0KSA8IDApIHsKKyAgICAgICAgICAgIC8vIEVPRiBvciBlcnJvciwgbWFrZSBzdXJlIGhpZ2ggZmxhZ3MgYXJlIHNldAorICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBzLT5uYl9zdHJlYW1zOyArK2lkeCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2lkeF0tPmRpc2NhcmQgPCBBVkRJU0NBUkRfQUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHNwID0gJnN5bmNbaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwLT5wb3NfaGkgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBoaWdoIGZyYW1lIGV4aXN0cyBmb3IgdGhpcyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICgqZm91bmRfaGkpKys7CisgICAgICAgICAgICAgICAgICAgICAgICBzcC0+dHNfaGkgID0gSU5UNjRfTUFYOworICAgICAgICAgICAgICAgICAgICAgICAgc3AtPnBvc19oaSA9IElOVDY0X01BWCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlkeCA9IHBrdC5zdHJlYW1faW5kZXg7CisgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpZHhdOworICAgICAgICBpZiAoc3QtPmRpc2NhcmQgPj0gQVZESVNDQVJEX0FMTCkKKyAgICAgICAgICAgIC8vIHRoaXMgc3RyZWFtIGlzIG5vdCBhY3RpdmUsIHNraXAgcGFja2V0CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzcCA9ICZzeW5jW2lkeF07CisKKyAgICAgICAgZmxnID0gcGt0LmZsYWdzOworICAgICAgICBwb3MgPSBwa3QucG9zOworICAgICAgICBwdHMgPSBwa3QucHRzOworICAgICAgICBkdHMgPSBwa3QuZHRzOworICAgICAgICBpZiAocHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgLy8gc29tZSBmb3JtYXRzIGRvbid0IHByb3ZpZGUgUFRTLCBvbmx5IERUUworICAgICAgICAgICAgcHRzID0gZHRzOworCisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZwa3QpOworCisgICAgICAgIC8vIE11bHRpLWZyYW1lIHBhY2tldHMgb25seSByZXR1cm4gcG9zaXRpb24gZm9yIHRoZSB2ZXJ5IGZpcnN0IGZyYW1lLgorICAgICAgICAvLyBPdGhlciBmcmFtZXMgYXJlIHJlYWQgd2l0aCBwb3NpdGlvbiA9PSAtMS4gVGhlcmVmb3JlLCB3ZSBub3RlIGRvd24KKyAgICAgICAgLy8gbGFzdCBrbm93biBwb3NpdGlvbiBvZiBhIGZyYW1lIGFuZCB1c2UgaXQgaWYgYSBmcmFtZSB3aXRob3V0CisgICAgICAgIC8vIHBvc2l0aW9uIGFycml2ZXMuIEluIHRoaXMgd2F5LCBpdCdzIHBvc3NpYmxlIHRvIHNlZWsgdG8gcHJvcGVyCisgICAgICAgIC8vIHBvc2l0aW9uLiBBZGRpdGlvbmFsbHksIGZvciBwYXJzZXJzIG5vdCBwcm92aWRpbmcgcG9zaXRpb24gYXQgYWxsLAorICAgICAgICAvLyBhbiBhcHByb3hpbWF0aW9uIHdpbGwgYmUgdXNlZCAoc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhpcyBpdGVyYXRpb24pLgorICAgICAgICBpZiAocG9zIDwgMCkKKyAgICAgICAgICAgIHBvcyA9IHNwLT5sYXN0X3BvczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3AtPmxhc3RfcG9zID0gcG9zOworCisgICAgICAgIC8vIEV2YWx1YXRlIGtleSBmcmFtZXMgd2l0aCBrbm93biBUUyAob3IgYW55IGZyYW1lcywgaWYgQVZTRUVLX0ZMQUdfQU5ZIHNldCkuCisgICAgICAgIGlmIChwdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgICAgICgoZmxnICYgQVZfUEtUX0ZMQUdfS0VZKSB8fCAoZmxhZ3MgJiBBVlNFRUtfRkxBR19BTlkpKSkgeworICAgICAgICAgICAgaWYgKGZsYWdzICYgQVZTRUVLX0ZMQUdfQllURSkgeworICAgICAgICAgICAgICAgIC8vIGZvciBieXRlIHNlZWtpbmcsIHVzZSBwb3NpdGlvbiBhcyB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICB0cyAgICAgICAgPSBwb3M7CisgICAgICAgICAgICAgICAgdHNfdGIubnVtID0gMTsKKyAgICAgICAgICAgICAgICB0c190Yi5kZW4gPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGdldCBzdHJlYW0gdGltZV9iYXNlCisgICAgICAgICAgICAgICAgdHMgICAgPSBwdHM7CisgICAgICAgICAgICAgICAgdHNfdGIgPSBzdC0+dGltZV9iYXNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3AtPmZpcnN0X3RzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgLy8gTm90ZSBkb3duIHRlcm1pbmF0aW9uIHRpbWVzdGFtcCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uIC0gd2hlbgorICAgICAgICAgICAgICAgIC8vIHdlIGVuY291bnRlciBhIHBhY2tldCB3aXRoIHRoZSBzYW1lIHRpbWVzdGFtcCwgd2Ugd2lsbCBpZ25vcmUKKyAgICAgICAgICAgICAgICAvLyBhbnkgZnVydGhlciBwYWNrZXRzIGZvciB0aGlzIHN0cmVhbSBpbiBuZXh0IGl0ZXJhdGlvbiAoYXMgdGhleQorICAgICAgICAgICAgICAgIC8vIGFyZSBhbHJlYWR5IGV2YWx1YXRlZCkuCisgICAgICAgICAgICAgICAgc3AtPmZpcnN0X3RzICAgID0gdHM7CisgICAgICAgICAgICAgICAgc3AtPmZpcnN0X3RzX3RiID0gdHNfdGI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzcC0+dGVybV90cyAhPSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICAgICAgICAgIGF2X2NvbXBhcmVfdHModHMsIHRzX3RiLCBzcC0+dGVybV90cywgc3AtPnRlcm1fdHNfdGIpID4gMCkgeworICAgICAgICAgICAgICAgIC8vIHBhc3QgdGhlIGVuZCBwb3NpdGlvbiBmcm9tIGxhc3QgaXRlcmF0aW9uLCBpZ25vcmUgcGFja2V0CisgICAgICAgICAgICAgICAgaWYgKCFzcC0+dGVybWluYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBzcC0+dGVybWluYXRlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICsrdGVybWluYXRlZF9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwLT5wb3NfaGkgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBoaWdoIGZyYW1lIGV4aXN0cyBmb3IgdGhpcyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICgqZm91bmRfaGkpKys7CisgICAgICAgICAgICAgICAgICAgICAgICBzcC0+dHNfaGkgID0gSU5UNjRfTUFYOworICAgICAgICAgICAgICAgICAgICAgICAgc3AtPnBvc19oaSA9IElOVDY0X01BWCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmF0ZWRfY291bnQgPT0ga2V5ZnJhbWVzX3RvX2ZpbmQpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIGFsbCB0ZXJtaW5hdGVkLCBpdGVyYXRpb24gZG9uZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF2X2NvbXBhcmVfdHModHMsIHRzX3RiLCB0aW1lc3RhbXAsIHRpbWViYXNlKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgLy8ga2V5ZnJhbWUgZm91bmQgYmVmb3JlIHRhcmdldCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICBpZiAoc3AtPnBvc19sbyA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgZmlyc3Qga2V5ZnJhbWUgbG93ZXIgdGhhbiB0YXJnZXQgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICgqZm91bmRfbG8pKys7CisgICAgICAgICAgICAgICAgICAgIHNwLT50c19sbyAgPSB0czsKKyAgICAgICAgICAgICAgICAgICAgc3AtPnBvc19sbyA9IHBvczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNwLT50c19sbyA8IHRzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGEgYmV0dGVyIG1hdGNoIChjbG9zZXIgdG8gdGFyZ2V0IHRpbWVzdGFtcCkKKyAgICAgICAgICAgICAgICAgICAgc3AtPnRzX2xvICA9IHRzOworICAgICAgICAgICAgICAgICAgICBzcC0+cG9zX2xvID0gcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdl9jb21wYXJlX3RzKHRzLCB0c190YiwgdGltZXN0YW1wLCB0aW1lYmFzZSkgPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIGtleWZyYW1lIGZvdW5kIGFmdGVyIHRhcmdldCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICBpZiAoc3AtPnBvc19oaSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgZmlyc3Qga2V5ZnJhbWUgaGlnaGVyIHRoYW4gdGFyZ2V0IHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAoKmZvdW5kX2hpKSsrOworICAgICAgICAgICAgICAgICAgICBzcC0+dHNfaGkgID0gdHM7CisgICAgICAgICAgICAgICAgICAgIHNwLT5wb3NfaGkgPSBwb3M7CisgICAgICAgICAgICAgICAgICAgIGlmICgqZm91bmRfaGkgPj0ga2V5ZnJhbWVzX3RvX2ZpbmQgJiYgZmlyc3RfaXRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgaGlnaCBmcmFtZSBmb3IgYWxsLiBUaGV5IG1heSBnZXQgdXBkYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gVFMgY2xvc2VyIHRvIHRhcmdldCBUUyBpbiBsYXRlciBpdGVyYXRpb25zICh3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzdG9wIGF0IHN0YXJ0IHBvc2l0aW9uIG9mIHByZXZpb3VzIGl0ZXJhdGlvbikuCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3AtPnRzX2hpID4gdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYSBiZXR0ZXIgbWF0Y2ggKGFjdHVhbGx5LCBzaG91bGRuJ3QgaGFwcGVuKQorICAgICAgICAgICAgICAgICAgICBzcC0+dHNfaGkgID0gdHM7CisgICAgICAgICAgICAgICAgICAgIHNwLT5wb3NfaGkgPSBwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2xlYW4gdXAgdGhlIHBhcnNlci4KKyAgICBmZl9yZWFkX2ZyYW1lX2ZsdXNoKHMpOworfQorCitpbnQ2NF90IGZmX2dlbl9zeW5jcG9pbnRfc2VhcmNoKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdHNfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRzX21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIEFWU3luY1BvaW50ICpzeW5jLCAqc3A7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCBpOworICAgIGludCBrZXlmcmFtZXNfdG9fZmluZCA9IDA7CisgICAgaW50NjRfdCBjdXJwb3M7CisgICAgaW50NjRfdCBzdGVwOworICAgIGludCBmb3VuZF9sbyA9IDAsIGZvdW5kX2hpID0gMDsKKyAgICBpbnQ2NF90IG1pbl9kaXN0YW5jZSwgZGlzdGFuY2U7CisgICAgaW50NjRfdCBtaW5fcG9zID0gMDsKKyAgICBpbnQgZmlyc3RfaXRlciA9IDE7CisgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7CisKKyAgICBpZiAoZmxhZ3MgJiBBVlNFRUtfRkxBR19CWVRFKSB7CisgICAgICAgIC8vIGZvciBieXRlIHNlZWtpbmcsIHdlIGhhdmUgZXhhY3QgMToxICJ0aW1lc3RhbXBzIiAtIHBvc2l0aW9ucworICAgICAgICB0aW1lX2Jhc2UubnVtID0gMTsKKyAgICAgICAgdGltZV9iYXNlLmRlbiA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA+PSAwKSB7CisgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcmVmZXJlbmNlIHN0cmVhbSwgd2hpY2ggdGltZSBiYXNlIHdlIHVzZQorICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgICAgICAgICB0aW1lX2Jhc2UgPSBzdC0+dGltZV9iYXNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm8gcmVmZXJlbmNlIHN0cmVhbSwgdXNlIEFWX1RJTUVfQkFTRSBhcyByZWZlcmVuY2UgdGltZSBiYXNlCisgICAgICAgICAgICB0aW1lX2Jhc2UubnVtID0gMTsKKyAgICAgICAgICAgIHRpbWVfYmFzZS5kZW4gPSBBVl9USU1FX0JBU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIHN5bmNwb2ludCBzdHJ1Y3R1cmVzIGZvciBlYWNoIHN0cmVhbS4KKyAgICBzeW5jID0gYXZfbWFsbG9jX2FycmF5KHMtPm5iX3N0cmVhbXMsIHNpemVvZihBVlN5bmNQb2ludCkpOworICAgIGlmICghc3luYykKKyAgICAgICAgLy8gY2Fubm90IGFsbG9jYXRlIGhlbHBlciBzdHJ1Y3R1cmUKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7ICsraSkgeworICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIHNwID0gJnN5bmNbaV07CisKKyAgICAgICAgc3AtPnBvc19sbyAgICAgPSBJTlQ2NF9NQVg7CisgICAgICAgIHNwLT50c19sbyAgICAgID0gSU5UNjRfTUFYOworICAgICAgICBzcC0+cG9zX2hpICAgICA9IElOVDY0X01BWDsKKyAgICAgICAgc3AtPnRzX2hpICAgICAgPSBJTlQ2NF9NQVg7CisgICAgICAgIHNwLT50ZXJtaW5hdGVkID0gMDsKKyAgICAgICAgc3AtPmZpcnN0X3RzICAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgc3AtPnRlcm1fdHMgICAgPSB0c19tYXg7CisgICAgICAgIHNwLT50ZXJtX3RzX3RiID0gdGltZV9iYXNlOworICAgICAgICBzcC0+bGFzdF9wb3MgICA9IHBvczsKKworICAgICAgICBzdC0+Y3VyX2R0cyAgICA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgICAgIGlmIChzdC0+ZGlzY2FyZCA8IEFWRElTQ0FSRF9BTEwpCisgICAgICAgICAgICArK2tleWZyYW1lc190b19maW5kOworICAgIH0KKworICAgIGlmICgha2V5ZnJhbWVzX3RvX2ZpbmQpIHsKKyAgICAgICAgLy8gbm8gc3RyZWFtIGFjdGl2ZSwgZXJyb3IKKyAgICAgICAgYXZfZnJlZShzeW5jKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIEZpbmQga2V5ZnJhbWVzIGluIGFsbCBhY3RpdmUgc3RyZWFtcyB3aXRoIHRpbWVzdGFtcC9wb3NpdGlvbiBqdXN0IGJlZm9yZQorICAgIC8vIGFuZCBqdXN0IGFmdGVyIHJlcXVlc3RlZCB0aW1lc3RhbXAvcG9zaXRpb24uCisgICAgc3RlcCA9IHMtPnBiLT5idWZmZXJfc2l6ZTsKKyAgICBjdXJwb3MgPSBGRk1BWChwb3MgLSBzdGVwIC8gMiwgMCk7CisgICAgZm9yICg7OykgeworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIGN1cnBvcywgU0VFS19TRVQpOworICAgICAgICBzZWFyY2hfaGlfbG9fa2V5ZnJhbWVzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMsIHRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWZyYW1lc190b19maW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZF9sbywgJmZvdW5kX2hpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2l0ZXIpOworICAgICAgICBpZiAoZm91bmRfbG8gPT0ga2V5ZnJhbWVzX3RvX2ZpbmQgJiYgZm91bmRfaGkgPT0ga2V5ZnJhbWVzX3RvX2ZpbmQpCisgICAgICAgICAgICBicmVhazsgIC8vIGhhdmUgYWxsIGtleWZyYW1lcyB3ZSB3YW50ZWQKKyAgICAgICAgaWYgKCFjdXJwb3MpCisgICAgICAgICAgICBicmVhazsgIC8vIGNhbm5vdCBnbyBiYWNrIGFueW1vcmUKKworICAgICAgICBjdXJwb3MgPSBwb3MgLSBzdGVwOworICAgICAgICBpZiAoY3VycG9zIDwgMCkKKyAgICAgICAgICAgIGN1cnBvcyA9IDA7CisgICAgICAgIHN0ZXAgKj0gMjsKKworICAgICAgICAvLyBzd2l0Y2ggdGVybWluYXRpb24gcG9zaXRpb25zCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyArK2kpIHsKKyAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIHN0LT5jdXJfZHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICAgICAgICAgIHNwID0gJnN5bmNbaV07CisgICAgICAgICAgICBpZiAoc3AtPmZpcnN0X3RzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgc3AtPnRlcm1fdHMgICAgPSBzcC0+Zmlyc3RfdHM7CisgICAgICAgICAgICAgICAgc3AtPnRlcm1fdHNfdGIgPSBzcC0+Zmlyc3RfdHNfdGI7CisgICAgICAgICAgICAgICAgc3AtPmZpcnN0X3RzICAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwLT50ZXJtaW5hdGVkID0gMDsKKyAgICAgICAgICAgIHNwLT5sYXN0X3BvcyA9IGN1cnBvczsKKyAgICAgICAgfQorICAgICAgICBmaXJzdF9pdGVyID0gMDsKKyAgICB9CisKKyAgICAvLyBGaW5kIGFjdHVhbCBwb3NpdGlvbiB0byBzdGFydCBkZWNvZGluZyBzbyB0aGF0IGRlY29kZXIgc3luY2hyb25pemVzCisgICAgLy8gY2xvc2VzdCB0byB0cyBhbmQgYmV0d2VlbiB0c19taW4gYW5kIHRzX21heC4KKyAgICBwb3MgPSBJTlQ2NF9NQVg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgKytpKSB7CisgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKHN0LT5kaXNjYXJkIDwgQVZESVNDQVJEX0FMTCkgeworICAgICAgICAgICAgc3AgPSAmc3luY1tpXTsKKyAgICAgICAgICAgIG1pbl9kaXN0YW5jZSA9IElOVDY0X01BWDsKKyAgICAgICAgICAgIC8vIEZpbmQgdGltZXN0YW1wIGNsb3Nlc3QgdG8gcmVxdWVzdGVkIHRpbWVzdGFtcCB3aXRoaW4gbWluL21heCBsaW1pdHMuCisgICAgICAgICAgICBpZiAoc3AtPnBvc19sbyAhPSBJTlQ2NF9NQVgKKyAgICAgICAgICAgICAgICAmJiBhdl9jb21wYXJlX3RzKHRzX21pbiwgdGltZV9iYXNlLCBzcC0+dHNfbG8sIHN0LT50aW1lX2Jhc2UpIDw9IDAKKyAgICAgICAgICAgICAgICAmJiBhdl9jb21wYXJlX3RzKHNwLT50c19sbywgc3QtPnRpbWVfYmFzZSwgdHNfbWF4LCB0aW1lX2Jhc2UpIDw9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBsb3cgdGltZXN0YW1wIGlzIGluIHJhbmdlCisgICAgICAgICAgICAgICAgbWluX2Rpc3RhbmNlID0gdHNfZGlzdGFuY2UodHMsIHRpbWVfYmFzZSwgc3AtPnRzX2xvLCBzdC0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgICAgICBtaW5fcG9zID0gc3AtPnBvc19sbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcC0+cG9zX2hpICE9IElOVDY0X01BWAorICAgICAgICAgICAgICAgICYmIGF2X2NvbXBhcmVfdHModHNfbWluLCB0aW1lX2Jhc2UsIHNwLT50c19oaSwgc3QtPnRpbWVfYmFzZSkgPD0gMAorICAgICAgICAgICAgICAgICYmIGF2X2NvbXBhcmVfdHMoc3AtPnRzX2hpLCBzdC0+dGltZV9iYXNlLCB0c19tYXgsIHRpbWVfYmFzZSkgPD0gMCkgeworICAgICAgICAgICAgICAgIC8vIGhpZ2ggdGltZXN0YW1wIGlzIGluIHJhbmdlLCBjaGVjayBkaXN0YW5jZQorICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gdHNfZGlzdGFuY2Uoc3AtPnRzX2hpLCBzdC0+dGltZV9iYXNlLCB0cywgdGltZV9iYXNlKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBtaW5fZGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluX2Rpc3RhbmNlID0gZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgICAgIG1pbl9wb3MgPSBzcC0+cG9zX2hpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtaW5fZGlzdGFuY2UgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gdGltZXN0YW1wIGlzIGluIHJhbmdlLCBjYW5ub3Qgc2VlaworICAgICAgICAgICAgICAgIGF2X2ZyZWUoc3luYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1pbl9wb3MgPCBwb3MpCisgICAgICAgICAgICAgICAgcG9zID0gbWluX3BvczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCk7CisgICAgYXZfZnJlZShzeW5jKTsKKyAgICByZXR1cm4gcG9zOworfQorCitBVlBhcnNlclN0YXRlICpmZl9zdG9yZV9wYXJzZXJfc3RhdGUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBBVlBhcnNlclN0cmVhbVN0YXRlICpzczsKKyAgICBBVlBhcnNlclN0YXRlICpzdGF0ZSA9IGF2X21hbGxvYyhzaXplb2YoQVZQYXJzZXJTdGF0ZSkpOworICAgIGlmICghc3RhdGUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc3RhdGUtPnN0cmVhbV9zdGF0ZXMgPSBhdl9tYWxsb2NfYXJyYXkocy0+bmJfc3RyZWFtcywgc2l6ZW9mKEFWUGFyc2VyU3RyZWFtU3RhdGUpKTsKKyAgICBpZiAoIXN0YXRlLT5zdHJlYW1fc3RhdGVzKSB7CisgICAgICAgIGF2X2ZyZWUoc3RhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzdGF0ZS0+ZnBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisKKyAgICAvLyBjb3B5IGNvbnRleHQgc3RydWN0dXJlcworICAgIHN0YXRlLT5wYWNrZXRfYnVmZmVyICAgICAgICAgICAgICAgICAgICA9IHMtPnBhY2tldF9idWZmZXI7CisgICAgc3RhdGUtPnBhcnNlX3F1ZXVlICAgICAgICAgICAgICAgICAgICAgID0gcy0+cGFyc2VfcXVldWU7CisgICAgc3RhdGUtPnJhd19wYWNrZXRfYnVmZmVyICAgICAgICAgICAgICAgID0gcy0+cmF3X3BhY2tldF9idWZmZXI7CisgICAgc3RhdGUtPnJhd19wYWNrZXRfYnVmZmVyX3JlbWFpbmluZ19zaXplID0gcy0+cmF3X3BhY2tldF9idWZmZXJfcmVtYWluaW5nX3NpemU7CisKKyAgICBzLT5wYWNrZXRfYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgPSBOVUxMOworICAgIHMtPnBhcnNlX3F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5VTEw7CisgICAgcy0+cmF3X3BhY2tldF9idWZmZXIgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKKyAgICBzLT5yYXdfcGFja2V0X2J1ZmZlcl9yZW1haW5pbmdfc2l6ZSAgICAgPSBSQVdfUEFDS0VUX0JVRkZFUl9TSVpFOworCisgICAgLy8gY29weSBzdHJlYW0gc3RydWN0dXJlcworICAgIHN0YXRlLT5uYl9zdHJlYW1zID0gcy0+bmJfc3RyZWFtczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgc3MgPSAmc3RhdGUtPnN0cmVhbV9zdGF0ZXNbaV07CisKKyAgICAgICAgc3MtPnBhcnNlciAgICAgICAgPSBzdC0+cGFyc2VyOworICAgICAgICBzcy0+bGFzdF9JUF9wdHMgICA9IHN0LT5sYXN0X0lQX3B0czsKKyAgICAgICAgc3MtPmN1cl9kdHMgICAgICAgPSBzdC0+Y3VyX2R0czsKKyAgICAgICAgc3MtPnByb2JlX3BhY2tldHMgPSBzdC0+cHJvYmVfcGFja2V0czsKKworICAgICAgICBzdC0+cGFyc2VyICAgICAgICA9IE5VTEw7CisgICAgICAgIHN0LT5sYXN0X0lQX3B0cyAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHN0LT5jdXJfZHRzICAgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHN0LT5wcm9iZV9wYWNrZXRzID0gTUFYX1BST0JFX1BBQ0tFVFM7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXRlOworfQorCit2b2lkIGZmX3Jlc3RvcmVfcGFyc2VyX3N0YXRlKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYXJzZXJTdGF0ZSAqc3RhdGUpCit7CisgICAgaW50IGk7CisgICAgQVZTdHJlYW0gKnN0OworICAgIEFWUGFyc2VyU3RyZWFtU3RhdGUgKnNzOworICAgIGZmX3JlYWRfZnJhbWVfZmx1c2gocyk7CisKKyAgICBpZiAoIXN0YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBhdmlvX3NlZWsocy0+cGIsIHN0YXRlLT5mcG9zLCBTRUVLX1NFVCk7CisKKyAgICAvLyBjb3B5IGNvbnRleHQgc3RydWN0dXJlcworICAgIHMtPnBhY2tldF9idWZmZXIgICAgICAgICAgICAgICAgICAgID0gc3RhdGUtPnBhY2tldF9idWZmZXI7CisgICAgcy0+cGFyc2VfcXVldWUgICAgICAgICAgICAgICAgICAgICAgPSBzdGF0ZS0+cGFyc2VfcXVldWU7CisgICAgcy0+cmF3X3BhY2tldF9idWZmZXIgICAgICAgICAgICAgICAgPSBzdGF0ZS0+cmF3X3BhY2tldF9idWZmZXI7CisgICAgcy0+cmF3X3BhY2tldF9idWZmZXJfcmVtYWluaW5nX3NpemUgPSBzdGF0ZS0+cmF3X3BhY2tldF9idWZmZXJfcmVtYWluaW5nX3NpemU7CisKKyAgICAvLyBjb3B5IHN0cmVhbSBzdHJ1Y3R1cmVzCisgICAgZm9yIChpID0gMDsgaSA8IHN0YXRlLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBzcyA9ICZzdGF0ZS0+c3RyZWFtX3N0YXRlc1tpXTsKKworICAgICAgICBzdC0+cGFyc2VyICAgICAgICA9IHNzLT5wYXJzZXI7CisgICAgICAgIHN0LT5sYXN0X0lQX3B0cyAgID0gc3MtPmxhc3RfSVBfcHRzOworICAgICAgICBzdC0+Y3VyX2R0cyAgICAgICA9IHNzLT5jdXJfZHRzOworICAgICAgICBzdC0+cHJvYmVfcGFja2V0cyA9IHNzLT5wcm9iZV9wYWNrZXRzOworICAgIH0KKworICAgIGF2X2ZyZWUoc3RhdGUtPnN0cmVhbV9zdGF0ZXMpOworICAgIGF2X2ZyZWUoc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BhY2tldF9saXN0KEFWUGFja2V0TGlzdCAqcGt0bCkKK3sKKyAgICBBVlBhY2tldExpc3QgKmN1cjsKKyAgICB3aGlsZSAocGt0bCkgeworICAgICAgICBjdXIgPSBwa3RsOworICAgICAgICBwa3RsID0gY3VyLT5uZXh0OworICAgICAgICBhdl9mcmVlX3BhY2tldCgmY3VyLT5wa3QpOworICAgICAgICBhdl9mcmVlKGN1cik7CisgICAgfQorfQorCit2b2lkIGZmX2ZyZWVfcGFyc2VyX3N0YXRlKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYXJzZXJTdGF0ZSAqc3RhdGUpCit7CisgICAgaW50IGk7CisgICAgQVZQYXJzZXJTdHJlYW1TdGF0ZSAqc3M7CisKKyAgICBpZiAoIXN0YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzcyA9ICZzdGF0ZS0+c3RyZWFtX3N0YXRlc1tpXTsKKyAgICAgICAgaWYgKHNzLT5wYXJzZXIpCisgICAgICAgICAgICBhdl9wYXJzZXJfY2xvc2Uoc3MtPnBhcnNlcik7CisgICAgfQorCisgICAgZnJlZV9wYWNrZXRfbGlzdChzdGF0ZS0+cGFja2V0X2J1ZmZlcik7CisgICAgZnJlZV9wYWNrZXRfbGlzdChzdGF0ZS0+cGFyc2VfcXVldWUpOworICAgIGZyZWVfcGFja2V0X2xpc3Qoc3RhdGUtPnJhd19wYWNrZXRfYnVmZmVyKTsKKworICAgIGF2X2ZyZWUoc3RhdGUtPnN0cmVhbV9zdGF0ZXMpOworICAgIGF2X2ZyZWUoc3RhdGUpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NlZWsuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zZWVrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhN2FlMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zZWVrLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBzZWVrIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aGluIGZvcm1hdCBoYW5kbGVycworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJdmFuIFNjaHJldGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfU0VFS19ICisjZGVmaW5lIEFWRk9STUFUX1NFRUtfSAorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKworLyoqCisgKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgcGFyc2VyIHN0YXRlIG9mIG9uZSBBVlN0cmVhbQorICovCit0eXBlZGVmIHN0cnVjdCBBVlBhcnNlclN0cmVhbVN0YXRlIHsKKyAgICAvLyBzYXZlZCBtZW1iZXJzIG9mIEFWU3RyZWFtCisgICAgQVZDb2RlY1BhcnNlckNvbnRleHQgICAqcGFyc2VyOworICAgIGludDY0X3QgICAgICAgICAgICAgICAgIGxhc3RfSVBfcHRzOworICAgIGludDY0X3QgICAgICAgICAgICAgICAgIGN1cl9kdHM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgcHJvYmVfcGFja2V0czsKK30gQVZQYXJzZXJTdHJlYW1TdGF0ZTsKKworLyoqCisgKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgcGFyc2VyIHN0YXRlIG9mIEFWRm9ybWF0CisgKi8KK3R5cGVkZWYgc3RydWN0IEFWUGFyc2VyU3RhdGUgeworICAgIGludDY0X3QgICAgICAgICBmcG9zOyAgICAgICAgICAgICAgICAgICAvLy88IGZpbGUgcG9zaXRpb24gYXQgdGhlIHRpbWUgb2YgY2FsbAorCisgICAgLy8gc2F2ZWQgbWVtYmVycyBvZiBBVkZvcm1hdENvbnRleHQKKyAgICBBVlBhY2tldExpc3QgICAqcGFja2V0X2J1ZmZlcjsgICAgICAgICAgLy8vPCBwYWNrZXQgYnVmZmVyIG9mIG9yaWdpbmFsIHN0YXRlCisgICAgQVZQYWNrZXRMaXN0ICAgKnBhcnNlX3F1ZXVlOyAgICAgICAgICAgIC8vLzwgcGFyc2UgcXVldWUgb2Ygb3JpZ2luYWwgc3RhdGUKKyAgICBBVlBhY2tldExpc3QgICAqcmF3X3BhY2tldF9idWZmZXI7ICAgICAgLy8vPCByYXcgcGFja2V0IGJ1ZmZlciBvZiBvcmlnaW5hbCBzdGF0ZQorICAgIGludCByYXdfcGFja2V0X2J1ZmZlcl9yZW1haW5pbmdfc2l6ZTsgICAvLy88IHJlbWFpbmluZyBzcGFjZSBpbiByYXdfcGFja2V0X2J1ZmZlcgorCisgICAgLy8gc2F2ZWQgaW5mbyBmb3Igc3RyZWFtcworICAgIGludCAgICAgICAgICAgICAgICAgIG5iX3N0cmVhbXM7ICAgICAgICAvLy88IG51bWJlciBvZiBzdHJlYW1zIHdpdGggc3RvcmVkIHN0YXRlCisgICAgQVZQYXJzZXJTdHJlYW1TdGF0ZSAqc3RyZWFtX3N0YXRlczsgICAgIC8vLzwgc3RhdGVzIG9mIGluZGl2aWR1YWwgc3RyZWFtcyAoYXJyYXkpCit9IEFWUGFyc2VyU3RhdGU7CisKKy8qKgorICogU2VhcmNoIGZvciB0aGUgc3luYyBwb2ludCBvZiBhbGwgYWN0aXZlIHN0cmVhbXMuCisgKgorICogVGhpcyByb3V0aW5lIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYSB1c2VyIGFwcGxpY2F0aW9uLAorICogYnV0IGJ5IGRlbXV4ZXJzLgorICoKKyAqIEEgc3luYyBwb2ludCBpcyBkZWZpbmVkIGFzIGEgcG9pbnQgaW4gc3RyZWFtLCBzdWNoIHRoYXQsIHdoZW4gZGVjb2Rpbmcgc3RhcnQKKyAqIGZyb20gdGhpcyBwb2ludCwgdGhlIGRlY29kZWQgb3V0cHV0IG9mIGFsbCBzdHJlYW1zIHN5bmNocm9uaXplcyBjbG9zZXN0CisgKiB0byB0aGUgZ2l2ZW4gdGltZXN0YW1wIHRzLiBUaGlzIHJvdXRpbmUgYWxzbyB0YWtlcyB0aW1lc3RhbXAgbGltaXRzIGludG8gYWNjb3VudC4KKyAqIFRodXMsIHRoZSBvdXRwdXQgd2lsbCBzeW5jaHJvbml6ZSBubyBzb29uZXIgdGhhbiB0c19taW4gYW5kIG5vIGxhdGVyIHRoYW4gdHNfbWF4LgorICoKKyAqIEBwYXJhbSBzdHJlYW1faW5kZXggc3RyZWFtIGluZGV4IGZvciB0aW1lIGJhc2UgcmVmZXJlbmNlIG9mIHRpbWVzdGFtcHMKKyAqIEBwYXJhbSBwb3MgICAgICAgICAgYXBwcm94aW1hdGUgcG9zaXRpb24gd2hlcmUgdG8gc3RhcnQgc2VhcmNoaW5nIGZvciBrZXkgZnJhbWVzCisgKiBAcGFyYW0gbWluX3RzICAgICAgIG1pbmltdW0gYWxsb3dlZCB0aW1lc3RhbXAgKHBvc2l0aW9uLCBpZiBBVlNFRUtfRkxBR19CWVRFIHNldCkKKyAqIEBwYXJhbSB0cyAgICAgICAgICAgdGFyZ2V0IHRpbWVzdGFtcCAob3IgcG9zaXRpb24sIGlmIEFWU0VFS19GTEFHX0JZVEUgc2V0IGluIGZsYWdzKQorICogQHBhcmFtIG1heF90cyAgICAgICBtYXhpbXVtIGFsbG93ZWQgdGltZXN0YW1wIChwb3NpdGlvbiwgaWYgQVZTRUVLX0ZMQUdfQllURSBzZXQpCisgKiBAcGFyYW0gZmxhZ3MgICAgICAgIGlmIEFWU0VFS19GTEFHX0FOWSBpcyBzZXQsIHNlZWsgdG8gYW55IGZyYW1lLCBvdGhlcndpc2Ugb25seQorICogICAgICAgICAgICAgICAgICAgICB0byBhIGtleWZyYW1lLiBJZiBBVlNFRUtfRkxBR19CWVRFIGlzIHNldCwgc2VhcmNoIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLCBub3QgYnkgdGltZXN0YW1wLgorICogQHJldHVybiAtMSBpZiBubyBzdWNoIHN5bmMgcG9pbnQgY291bGQgYmUgZm91bmQsIG90aGVyd2lzZSBzdHJlYW0gcG9zaXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbSBpcyByZXBvc2l0aW9uZWQgdG8gdGhpcyBwb3NpdGlvbikKKyAqLworaW50NjRfdCBmZl9nZW5fc3luY3BvaW50X3NlYXJjaChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtYXhfdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisKKy8qKgorICogU3RvcmUgY3VycmVudCBwYXJzZXIgc3RhdGUgYW5kIGZpbGUgcG9zaXRpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSBkZW11eGVycyBiZWZvcmUgYSBkZXN0cnVjdGl2ZSBzZWVraW5nIGFsZ29yaXRobQorICogdG8gc3RvcmUgdGhlIHBhcnNlciBzdGF0ZS4gRGVwZW5kaW5nIG9uIHRoZSBvdXRjb21lIG9mIHRoZSBzZWVrLCBlaXRoZXIgdGhlIG9yaWdpbmFsCisgKiBzdGF0ZSBjYW4gYmUgcmVzdG9yZWQgb3IgdGhlIG5ldyBzdGF0ZSBrZXB0IGFuZCB0aGUgb3JpZ2luYWwgc3RhdGUgZnJlZWQuCisgKgorICogQG5vdGUgQXMgYSBzaWRlIGVmZmVjdCwgdGhlIG9yaWdpbmFsIHBhcnNlciBzdGF0ZSBpcyByZXNldCwgc2luY2Ugc3RydWN0dXJlcworICogICAgICAgYXJlIHJlbGlua2VkIHRvIHRoZSBzdG9yZWQgc3RhdGUgaW5zdGVhZCBvZiBiZWluZyBkZWVwbHktY29waWVkIChmb3IKKyAqICAgICAgIHBlcmZvcm1hbmNlIHJlYXNvbnMgYW5kIHRvIGtlZXAgdGhlIGNvZGUgc2ltcGxlKS4KKyAqCisgKiBAcGFyYW0gcyBjb250ZXh0IGZyb20gd2hpY2ggdG8gc2F2ZSBzdGF0ZQorICogQHJldHVybiBwYXJzZXIgc3RhdGUgb2JqZWN0IG9yIE5VTEwgaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQKKyAqLworQVZQYXJzZXJTdGF0ZSAqZmZfc3RvcmVfcGFyc2VyX3N0YXRlKEFWRm9ybWF0Q29udGV4dCAqcyk7CisKKy8qKgorICogUmVzdG9yZSBwcmV2aW91c2x5IHNhdmVkIHBhcnNlciBzdGF0ZSBhbmQgZmlsZSBwb3NpdGlvbi4KKyAqCisgKiBTYXZlZCBzdGF0ZSB3aWxsIGJlIGludmFsaWRhdGVkIGFuZCBmcmVlZCBieSB0aGlzIGNhbGwsIHNpbmNlIGludGVybmFsCisgKiBzdHJ1Y3R1cmVzIHdpbGwgYmUgcmVsaW5rZWQgYmFjayB0byB0aGUgc3RvcmVkIHN0YXRlIGluc3RlYWQgb2YgYmVpbmcKKyAqIGRlZXBseS1jb3BpZWQuCisgKgorICogQHBhcmFtIHMgICAgIGNvbnRleHQgdG8gd2hpY2ggdG8gcmVzdG9yZSBzdGF0ZSAoc2FtZSBhcyB1c2VkIGZvciBzdG9yaW5nIHN0YXRlKQorICogQHBhcmFtIHN0YXRlIHN0YXRlIHRvIHJlc3RvcmUKKyAqLwordm9pZCBmZl9yZXN0b3JlX3BhcnNlcl9zdGF0ZShBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFyc2VyU3RhdGUgKnN0YXRlKTsKKworLyoqCisgKiBGcmVlIHByZXZpb3VzbHkgc2F2ZWQgcGFyc2VyIHN0YXRlLgorICoKKyAqIEBwYXJhbSBzICAgICBjb250ZXh0IHRvIHdoaWNoIHRoZSBzdGF0ZSBiZWxvbmdzIChzYW1lIGFzIHVzZWQgZm9yIHN0b3Jpbmcgc3RhdGUpCisgKiBAcGFyYW0gc3RhdGUgc3RhdGUgdG8gZnJlZQorICovCit2b2lkIGZmX2ZyZWVfcGFyc2VyX3N0YXRlKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYXJzZXJTdGF0ZSAqc3RhdGUpOworCisjZW5kaWYgLyogQVZGT1JNQVRfU0VFS19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc2VnYWZpbG0uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zZWdhZmlsbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjBjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc2VnYWZpbG0uYwpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqIFNlZ2EgRklMTSBGb3JtYXQgKENQSykgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTZWdhIEZJTE0gKC5jcGspIGZpbGUgZGVtdXhlcgorICogYnkgTWlrZSBNZWxhbnNvbiAobWVsYW5zb25AcGNpc3lzLm5ldCkKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgU2VnYSBGSUxNIGZpbGUgZm9ybWF0LCB2aXNpdDoKKyAqICAgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorCisjZGVmaW5lIEZJTE1fVEFHIE1LQkVUQUcoJ0YnLCAnSScsICdMJywgJ00nKQorI2RlZmluZSBGRFNDX1RBRyBNS0JFVEFHKCdGJywgJ0QnLCAnUycsICdDJykKKyNkZWZpbmUgU1RBQl9UQUcgTUtCRVRBRygnUycsICdUJywgJ0EnLCAnQicpCisjZGVmaW5lIENWSURfVEFHIE1LQkVUQUcoJ2MnLCAndicsICdpJywgJ2QnKQorI2RlZmluZSBSQVdfVEFHICBNS0JFVEFHKCdyJywgJ2EnLCAndycsICcgJykKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgc3RyZWFtOworICBpbnQ2NF90IHNhbXBsZV9vZmZzZXQ7CisgIHVuc2lnbmVkIGludCBzYW1wbGVfc2l6ZTsKKyAgaW50NjRfdCBwdHM7CisgIGludCBrZXlmcmFtZTsKK30gZmlsbV9zYW1wbGU7CisKK3R5cGVkZWYgc3RydWN0IEZpbG1EZW11eENvbnRleHQgeworICAgIGludCB2aWRlb19zdHJlYW1faW5kZXg7CisgICAgaW50IGF1ZGlvX3N0cmVhbV9pbmRleDsKKworICAgIGVudW0gQVZDb2RlY0lEIGF1ZGlvX3R5cGU7CisgICAgdW5zaWduZWQgaW50IGF1ZGlvX3NhbXBsZXJhdGU7CisgICAgdW5zaWduZWQgaW50IGF1ZGlvX2JpdHM7CisgICAgdW5zaWduZWQgaW50IGF1ZGlvX2NoYW5uZWxzOworCisgICAgZW51bSBBVkNvZGVjSUQgdmlkZW9fdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgc2FtcGxlX2NvdW50OworICAgIGZpbG1fc2FtcGxlICpzYW1wbGVfdGFibGU7CisgICAgdW5zaWduZWQgaW50IGN1cnJlbnRfc2FtcGxlOworCisgICAgdW5zaWduZWQgaW50IGJhc2VfY2xvY2s7CisgICAgdW5zaWduZWQgaW50IHZlcnNpb247Cit9IEZpbG1EZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgZmlsbV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoQVZfUkIzMigmcC0+YnVmWzBdKSAhPSBGSUxNX1RBRykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoQVZfUkIzMigmcC0+YnVmWzE2XSkgIT0gRkRTQ19UQUcpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCitzdGF0aWMgaW50IGZpbG1fcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgRmlsbURlbXV4Q29udGV4dCAqZmlsbSA9IHMtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZmaWxtLT5zYW1wbGVfdGFibGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsbV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgRmlsbURlbXV4Q29udGV4dCAqZmlsbSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgdW5zaWduZWQgY2hhciBzY3JhdGNoWzI1Nl07CisgICAgaW50IGksIHJldDsKKyAgICB1bnNpZ25lZCBpbnQgZGF0YV9vZmZzZXQ7CisgICAgdW5zaWduZWQgaW50IGF1ZGlvX2ZyYW1lX2NvdW50ZXI7CisKKyAgICBmaWxtLT5zYW1wbGVfdGFibGUgPSBOVUxMOworCisgICAgLyogbG9hZCB0aGUgbWFpbiBGSUxNIGhlYWRlciAqLworICAgIGlmIChhdmlvX3JlYWQocGIsIHNjcmF0Y2gsIDE2KSAhPSAxNikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICBkYXRhX29mZnNldCA9IEFWX1JCMzIoJnNjcmF0Y2hbNF0pOworICAgIGZpbG0tPnZlcnNpb24gPSBBVl9SQjMyKCZzY3JhdGNoWzhdKTsKKworICAgIC8qIGxvYWQgdGhlIEZEU0MgY2h1bmsgKi8KKyAgICBpZiAoZmlsbS0+dmVyc2lvbiA9PSAwKSB7CisgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgTGVtbWluZ3MgLmZpbG0gZmlsZXM7IDIwLWJ5dGUgaGVhZGVyICovCisgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIHNjcmF0Y2gsIDIwKSAhPSAyMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIC8qIG1ha2Ugc29tZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgYXVkaW8gcGFyYW1ldGVycyAqLworICAgICAgICBmaWxtLT5hdWRpb190eXBlID0gQVZfQ09ERUNfSURfUENNX1M4OworICAgICAgICBmaWxtLT5hdWRpb19zYW1wbGVyYXRlID0gMjIwNTA7CisgICAgICAgIGZpbG0tPmF1ZGlvX2NoYW5uZWxzID0gMTsKKyAgICAgICAgZmlsbS0+YXVkaW9fYml0cyA9IDg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbm9ybWFsIFNhdHVybiAuY3BrIGZpbGVzOyAzMi1ieXRlIGhlYWRlciAqLworICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBzY3JhdGNoLCAzMikgIT0gMzIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICBmaWxtLT5hdWRpb19zYW1wbGVyYXRlID0gQVZfUkIxNigmc2NyYXRjaFsyNF0pOworICAgICAgICBmaWxtLT5hdWRpb19jaGFubmVscyA9IHNjcmF0Y2hbMjFdOworICAgICAgICBmaWxtLT5hdWRpb19iaXRzID0gc2NyYXRjaFsyMl07CisgICAgICAgIGlmIChzY3JhdGNoWzIzXSA9PSAyICYmIGZpbG0tPmF1ZGlvX2NoYW5uZWxzID4gMCkKKyAgICAgICAgICAgIGZpbG0tPmF1ZGlvX3R5cGUgPSBBVl9DT0RFQ19JRF9BRFBDTV9BRFg7CisgICAgICAgIGVsc2UgaWYgKGZpbG0tPmF1ZGlvX2NoYW5uZWxzID4gMCkgeworICAgICAgICAgICAgaWYgKGZpbG0tPmF1ZGlvX2JpdHMgPT0gOCkKKyAgICAgICAgICAgICAgICBmaWxtLT5hdWRpb190eXBlID0gQVZfQ09ERUNfSURfUENNX1M4X1BMQU5BUjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZpbG0tPmF1ZGlvX2JpdHMgPT0gMTYpCisgICAgICAgICAgICAgICAgZmlsbS0+YXVkaW9fdHlwZSA9IEFWX0NPREVDX0lEX1BDTV9TMTZCRV9QTEFOQVI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmlsbS0+YXVkaW9fdHlwZSA9IEFWX0NPREVDX0lEX05PTkU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZmlsbS0+YXVkaW9fdHlwZSA9IEFWX0NPREVDX0lEX05PTkU7CisgICAgfQorCisgICAgaWYgKEFWX1JCMzIoJnNjcmF0Y2hbMF0pICE9IEZEU0NfVEFHKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChBVl9SQjMyKCZzY3JhdGNoWzhdKSA9PSBDVklEX1RBRykgeworICAgICAgICBmaWxtLT52aWRlb190eXBlID0gQVZfQ09ERUNfSURfQ0lORVBBSzsKKyAgICB9IGVsc2UgaWYgKEFWX1JCMzIoJnNjcmF0Y2hbOF0pID09IFJBV19UQUcpIHsKKyAgICAgICAgZmlsbS0+dmlkZW9fdHlwZSA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbG0tPnZpZGVvX3R5cGUgPSBBVl9DT0RFQ19JRF9OT05FOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgdGhlIGRlY29kZXIgc3RyZWFtcyAqLworICAgIGlmIChmaWxtLT52aWRlb190eXBlKSB7CisgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZpbG0tPnZpZGVvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmlsbS0+dmlkZW9fdHlwZTsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggPSBBVl9SQjMyKCZzY3JhdGNoWzE2XSk7CisgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gQVZfUkIzMigmc2NyYXRjaFsxMl0pOworCisgICAgICAgIGlmIChmaWxtLT52aWRlb190eXBlID09IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB7CisgICAgICAgICAgICBpZiAoc2NyYXRjaFsyMF0gPT0gMjQpIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjI0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicmF3IHZpZGVvIGlzIHVzaW5nIHVuaGFuZGxlZCAlZGJwcFxuIiwgc2NyYXRjaFsyMF0pOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmaWxtLT5hdWRpb190eXBlKSB7CisgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZpbG0tPmF1ZGlvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmlsbS0+YXVkaW9fdHlwZTsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAxOworICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gZmlsbS0+YXVkaW9fY2hhbm5lbHM7CisgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBmaWxtLT5hdWRpb19zYW1wbGVyYXRlOworCisgICAgICAgIGlmIChmaWxtLT5hdWRpb190eXBlID09IEFWX0NPREVDX0lEX0FEUENNX0FEWCkgeworICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxOCAqIDggLyAzMjsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogMTg7CisgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gZmlsbS0+YXVkaW9fYml0czsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBzdC0+Y29kZWMtPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAvIDg7CisgICAgICAgIH0KKworICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5jaGFubmVscyAqIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKgorICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgfQorCisgICAgLyogbG9hZCB0aGUgc2FtcGxlIHRhYmxlICovCisgICAgaWYgKGF2aW9fcmVhZChwYiwgc2NyYXRjaCwgMTYpICE9IDE2KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIGlmIChBVl9SQjMyKCZzY3JhdGNoWzBdKSAhPSBTVEFCX1RBRykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgZmlsbS0+YmFzZV9jbG9jayA9IEFWX1JCMzIoJnNjcmF0Y2hbOF0pOworICAgIGZpbG0tPnNhbXBsZV9jb3VudCA9IEFWX1JCMzIoJnNjcmF0Y2hbMTJdKTsKKyAgICBpZihmaWxtLT5zYW1wbGVfY291bnQgPj0gVUlOVF9NQVggLyBzaXplb2YoZmlsbV9zYW1wbGUpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZmlsbS0+c2FtcGxlX3RhYmxlID0gYXZfbWFsbG9jKGZpbG0tPnNhbXBsZV9jb3VudCAqIHNpemVvZihmaWxtX3NhbXBsZSkpOworICAgIGlmICghZmlsbS0+c2FtcGxlX3RhYmxlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzMsIDEsIGZpbG0tPmJhc2VfY2xvY2spOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgZmlsbS0+YXVkaW9fc2FtcGxlcmF0ZSk7CisgICAgfQorCisgICAgYXVkaW9fZnJhbWVfY291bnRlciA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGZpbG0tPnNhbXBsZV9jb3VudDsgaSsrKSB7CisgICAgICAgIC8qIGxvYWQgdGhlIG5leHQgc2FtcGxlIHJlY29yZCBhbmQgdHJhbnNmZXIgaXQgdG8gYW4gaW50ZXJuYWwgc3RydWN0ICovCisgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIHNjcmF0Y2gsIDE2KSAhPSAxNikgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGZpbG0tPnNhbXBsZV90YWJsZVtpXS5zYW1wbGVfb2Zmc2V0ID0KKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICsgQVZfUkIzMigmc2NyYXRjaFswXSk7CisgICAgICAgIGZpbG0tPnNhbXBsZV90YWJsZVtpXS5zYW1wbGVfc2l6ZSA9IEFWX1JCMzIoJnNjcmF0Y2hbNF0pOworICAgICAgICBpZiAoZmlsbS0+c2FtcGxlX3RhYmxlW2ldLnNhbXBsZV9zaXplID4gSU5UX01BWCAvIDQpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFWX1JCMzIoJnNjcmF0Y2hbOF0pID09IDB4RkZGRkZGRkYpIHsKKyAgICAgICAgICAgIGZpbG0tPnNhbXBsZV90YWJsZVtpXS5zdHJlYW0gPSBmaWxtLT5hdWRpb19zdHJlYW1faW5kZXg7CisgICAgICAgICAgICBmaWxtLT5zYW1wbGVfdGFibGVbaV0ucHRzID0gYXVkaW9fZnJhbWVfY291bnRlcjsKKworICAgICAgICAgICAgaWYgKGZpbG0tPmF1ZGlvX3R5cGUgPT0gQVZfQ09ERUNfSURfQURQQ01fQURYKQorICAgICAgICAgICAgICAgIGF1ZGlvX2ZyYW1lX2NvdW50ZXIgKz0gKGZpbG0tPnNhbXBsZV90YWJsZVtpXS5zYW1wbGVfc2l6ZSAqIDMyIC8KKyAgICAgICAgICAgICAgICAgICAgKDE4ICogZmlsbS0+YXVkaW9fY2hhbm5lbHMpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZpbG0tPmF1ZGlvX3R5cGUgIT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgICAgICAgICBhdWRpb19mcmFtZV9jb3VudGVyICs9IChmaWxtLT5zYW1wbGVfdGFibGVbaV0uc2FtcGxlX3NpemUgLworICAgICAgICAgICAgICAgICAgICAoZmlsbS0+YXVkaW9fY2hhbm5lbHMgKiBmaWxtLT5hdWRpb19iaXRzIC8gOCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbS0+c2FtcGxlX3RhYmxlW2ldLnN0cmVhbSA9IGZpbG0tPnZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICAgICAgICAgIGZpbG0tPnNhbXBsZV90YWJsZVtpXS5wdHMgPSBBVl9SQjMyKCZzY3JhdGNoWzhdKSAmIDB4N0ZGRkZGRkY7CisgICAgICAgICAgICBmaWxtLT5zYW1wbGVfdGFibGVbaV0ua2V5ZnJhbWUgPSAoc2NyYXRjaFs4XSAmIDB4ODApID8gMCA6IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaWxtLT5jdXJyZW50X3NhbXBsZSA9IDA7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgZmlsbV9yZWFkX2Nsb3NlKHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmlsbV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBGaWxtRGVtdXhDb250ZXh0ICpmaWxtID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGZpbG1fc2FtcGxlICpzYW1wbGU7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoZmlsbS0+Y3VycmVudF9zYW1wbGUgPj0gZmlsbS0+c2FtcGxlX2NvdW50KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBzYW1wbGUgPSAmZmlsbS0+c2FtcGxlX3RhYmxlW2ZpbG0tPmN1cnJlbnRfc2FtcGxlXTsKKworICAgIC8qIHBvc2l0aW9uIHRoZSBzdHJlYW0gKHdpbGwgcHJvYmFibHkgYmUgdGhlcmUgYW55d2F5KSAqLworICAgIGF2aW9fc2VlayhwYiwgc2FtcGxlLT5zYW1wbGVfb2Zmc2V0LCBTRUVLX1NFVCk7CisKKworICAgIHJldD0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBzYW1wbGUtPnNhbXBsZV9zaXplKTsKKyAgICBpZiAocmV0ICE9IHNhbXBsZS0+c2FtcGxlX3NpemUpCisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc2FtcGxlLT5zdHJlYW07CisgICAgcGt0LT5wdHMgPSBzYW1wbGUtPnB0czsKKworICAgIGZpbG0tPmN1cnJlbnRfc2FtcGxlKys7CisKKyAgICByZXR1cm4gcmV0OworfQorCitBVklucHV0Rm9ybWF0IGZmX3NlZ2FmaWxtX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImZpbG1fY3BrIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2VnYSBGSUxNIC8gQ1BLIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZpbG1EZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGZpbG1fcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZmlsbV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmaWxtX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGZpbG1fcmVhZF9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc2VnbWVudC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NlZ21lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FkNmUzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NlZ21lbnQuYwpAQCAtMCwwICsxLDkyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgTHVjYSBCYXJiYXRvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUgZ2VuZXJpYyBzZWdtZW50ZXIKKyAqIE0zVTggc3BlY2lmaWNhdGlvbiBjYW4gYmUgZmluZCBoZXJlOgorICogQHVybHtodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaWQvZHJhZnQtcGFudG9zLWh0dHAtbGl2ZS1zdHJlYW1pbmd9CisgKi8KKworLyogI2RlZmluZSBERUJVRyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lc3RhbXAuaCIKKwordHlwZWRlZiBzdHJ1Y3QgU2VnbWVudExpc3RFbnRyeSB7CisgICAgaW50IGluZGV4OworICAgIGRvdWJsZSBzdGFydF90aW1lLCBlbmRfdGltZTsKKyAgICBpbnQ2NF90IHN0YXJ0X3B0czsKKyAgICBpbnQ2NF90IG9mZnNldF9wdHM7CisgICAgY2hhciAqZmlsZW5hbWU7CisgICAgc3RydWN0IFNlZ21lbnRMaXN0RW50cnkgKm5leHQ7CisgICAgaW50NjRfdCBsYXN0X2R1cmF0aW9uOworfSBTZWdtZW50TGlzdEVudHJ5OworCit0eXBlZGVmIGVudW0geworICAgIExJU1RfVFlQRV9VTkRFRklORUQgPSAtMSwKKyAgICBMSVNUX1RZUEVfRkxBVCA9IDAsCisgICAgTElTVF9UWVBFX0NTViwKKyAgICBMSVNUX1RZUEVfTTNVOCwKKyAgICBMSVNUX1RZUEVfRVhULCAvLy88IGRlcHJlY2F0ZWQKKyAgICBMSVNUX1RZUEVfRkZDT05DQVQsCisgICAgTElTVF9UWVBFX05CLAorfSBMaXN0VHlwZTsKKworI2RlZmluZSBTRUdNRU5UX0xJU1RfRkxBR19DQUNIRSAxCisjZGVmaW5lIFNFR01FTlRfTElTVF9GTEFHX0xJVkUgIDIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOyAgLyoqPCBDbGFzcyBmb3IgcHJpdmF0ZSBvcHRpb25zLiAqLworICAgIGludCBzZWdtZW50X2lkeDsgICAgICAgLy8vPCBpbmRleCBvZiB0aGUgc2VnbWVudCBmaWxlIHRvIHdyaXRlLCBzdGFydGluZyBmcm9tIDAKKyAgICBpbnQgc2VnbWVudF9pZHhfd3JhcDsgIC8vLzwgbnVtYmVyIGFmdGVyIHdoaWNoIHRoZSBpbmRleCB3cmFwcworICAgIGludCBzZWdtZW50X2lkeF93cmFwX25iOyAgLy8vPCBudW1iZXIgb2YgdGltZSB0aGUgaW5kZXggaGFzIHdyYXBlZAorICAgIGludCBzZWdtZW50X2NvdW50OyAgICAgLy8vPCBudW1iZXIgb2Ygc2VnbWVudCBmaWxlcyBhbHJlYWR5IHdyaXR0ZW4KKyAgICBBVk91dHB1dEZvcm1hdCAqb2Zvcm1hdDsKKyAgICBBVkZvcm1hdENvbnRleHQgKmF2ZjsKKyAgICBjaGFyICpmb3JtYXQ7ICAgICAgICAgICAgICAvLy88IGZvcm1hdCB0byB1c2UgZm9yIG91dHB1dCBzZWdtZW50IGZpbGVzCisgICAgY2hhciAqZm9ybWF0X29wdGlvbnNfc3RyOyAgLy8vPCBmb3JtYXQgb3B0aW9ucyB0byB1c2UgZm9yIG91dHB1dCBzZWdtZW50IGZpbGVzCisgICAgQVZEaWN0aW9uYXJ5ICpmb3JtYXRfb3B0aW9uczsKKyAgICBjaGFyICpsaXN0OyAgICAgICAgICAgIC8vLzwgZmlsZW5hbWUgZm9yIHRoZSBzZWdtZW50IGxpc3QgZmlsZQorICAgIGludCAgIGxpc3RfZmxhZ3M7ICAgICAgLy8vPCBmbGFncyBhZmZlY3RpbmcgbGlzdCBnZW5lcmF0aW9uCisgICAgaW50ICAgbGlzdF9zaXplOyAgICAgICAvLy88IG51bWJlciBvZiBlbnRyaWVzIGZvciB0aGUgc2VnbWVudCBsaXN0IGZpbGUKKworICAgIGludCB1c2VfY2xvY2t0aW1lOyAgICAvLy88IGZsYWcgdG8gY3V0IHNlZ21lbnRzIGF0IHJlZ3VsYXIgY2xvY2sgdGltZQorICAgIGludDY0X3QgbGFzdF92YWw7ICAgICAgLy8vPCByZW1lbWJlciBsYXN0IHRpbWUgZm9yIHdyYXAgYXJvdW5kIGRldGVjdGlvbgorICAgIGludDY0X3QgbGFzdF9jdXQ7ICAgICAgLy8vPCByZW1lbWJlciBsYXN0IGN1dAorICAgIGludCBjdXRfcGVuZGluZzsKKworICAgIGNoYXIgKmVudHJ5X3ByZWZpeDsgICAgLy8vPCBwcmVmaXggdG8gYWRkIHRvIGxpc3QgZW50cnkgZmlsZW5hbWVzCisgICAgTGlzdFR5cGUgbGlzdF90eXBlOyAgICAvLy88IHNldCB0aGUgbGlzdCB0eXBlCisgICAgQVZJT0NvbnRleHQgKmxpc3RfcGI7ICAvLy88IGxpc3QgZmlsZSBwdXQtYnl0ZSBjb250ZXh0CisgICAgY2hhciAqdGltZV9zdHI7ICAgICAgICAvLy88IHNlZ21lbnQgZHVyYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJpbmcKKyAgICBpbnQ2NF90IHRpbWU7ICAgICAgICAgIC8vLzwgc2VnbWVudCBkdXJhdGlvbgorCisgICAgY2hhciAqdGltZXNfc3RyOyAgICAgICAvLy88IHNlZ21lbnQgdGltZXMgc3BlY2lmaWNhdGlvbiBzdHJpbmcKKyAgICBpbnQ2NF90ICp0aW1lczsgICAgICAgIC8vLzwgbGlzdCBvZiBzZWdtZW50IGludGVydmFsIHNwZWNpZmljYXRpb24KKyAgICBpbnQgbmJfdGltZXM7ICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGVsbWVudHMgaW4gdGhlIHRpbWVzIGFycmF5CisKKyAgICBjaGFyICpmcmFtZXNfc3RyOyAgICAgIC8vLzwgc2VnbWVudCBmcmFtZSBudW1iZXJzIHNwZWNpZmljYXRpb24gc3RyaW5nCisgICAgaW50ICpmcmFtZXM7ICAgICAgICAgICAvLy88IGxpc3Qgb2YgZnJhbWUgbnVtYmVyIHNwZWNpZmljYXRpb24KKyAgICBpbnQgbmJfZnJhbWVzOyAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGVsbWVudHMgaW4gdGhlIGZyYW1lcyBhcnJheQorICAgIGludCBmcmFtZV9jb3VudDsgICAgICAgLy8vPCB0b3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lcworICAgIGludCBzZWdtZW50X2ZyYW1lX2NvdW50OyAvLy88IG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzIGluIHRoZSBzZWdtZW50CisKKyAgICBpbnQ2NF90IHRpbWVfZGVsdGE7CisgICAgaW50ICBpbmRpdmlkdWFsX2hlYWRlcl90cmFpbGVyOyAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLworICAgIGludCAgd3JpdGVfaGVhZGVyX3RyYWlsZXI7IC8qKjwgU2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uICovCisKKyAgICBpbnQgcmVzZXRfdGltZXN0YW1wczsgIC8vLzwgcmVzZXQgdGltZXN0YW1wcyBhdCB0aGUgYmVnaW4gb2YgZWFjaCBzZWdtZW50CisgICAgaW50NjRfdCBpbml0aWFsX29mZnNldDsgICAgLy8vPCBpbml0aWFsIHRpbWVzdGFtcHMgb2Zmc2V0LCBleHByZXNzZWQgaW4gbWljcm9zZWNvbmRzCisgICAgY2hhciAqcmVmZXJlbmNlX3N0cmVhbV9zcGVjaWZpZXI7IC8vLzwgcmVmZXJlbmNlIHN0cmVhbSBzcGVjaWZpZXIKKyAgICBpbnQgICByZWZlcmVuY2Vfc3RyZWFtX2luZGV4OworCisgICAgU2VnbWVudExpc3RFbnRyeSBjdXJfZW50cnk7CisgICAgU2VnbWVudExpc3RFbnRyeSAqc2VnbWVudF9saXN0X2VudHJpZXM7CisgICAgU2VnbWVudExpc3RFbnRyeSAqc2VnbWVudF9saXN0X2VudHJpZXNfZW5kOworfSBTZWdtZW50Q29udGV4dDsKKworc3RhdGljIHZvaWQgcHJpbnRfY3N2X2VzY2FwZWRfc3RyKEFWSU9Db250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBpbnQgbmVlZHNfcXVvdGluZyA9ICEhc3RyW3N0cmNzcG4oc3RyLCAiXCIsXG5cciIpXTsKKworICAgIGlmIChuZWVkc19xdW90aW5nKQorICAgICAgICBhdmlvX3c4KGN0eCwgJyInKTsKKworICAgIGZvciAoOyAqc3RyOyBzdHIrKykgeworICAgICAgICBpZiAoKnN0ciA9PSAnIicpCisgICAgICAgICAgICBhdmlvX3c4KGN0eCwgJyInKTsKKyAgICAgICAgYXZpb193OChjdHgsICpzdHIpOworICAgIH0KKyAgICBpZiAobmVlZHNfcXVvdGluZykKKyAgICAgICAgYXZpb193OChjdHgsICciJyk7Cit9CisKK3N0YXRpYyBpbnQgc2VnbWVudF9tdXhfaW5pdChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgU2VnbWVudENvbnRleHQgKnNlZyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkZvcm1hdENvbnRleHQgKm9jOworICAgIGludCBpOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBhdmZvcm1hdF9hbGxvY19vdXRwdXRfY29udGV4dDIoJnNlZy0+YXZmLCBzZWctPm9mb3JtYXQsIE5VTEwsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG9jID0gc2VnLT5hdmY7CisKKyAgICBvYy0+aW50ZXJydXB0X2NhbGxiYWNrID0gcy0+aW50ZXJydXB0X2NhbGxiYWNrOworICAgIG9jLT5tYXhfZGVsYXkgICAgICAgICAgPSBzLT5tYXhfZGVsYXk7CisgICAgYXZfZGljdF9jb3B5KCZvYy0+bWV0YWRhdGEsIHMtPm1ldGFkYXRhLCAwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0OworICAgICAgICBBVkNvZGVjQ29udGV4dCAqaWNvZGVjLCAqb2NvZGVjOworCisgICAgICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShvYywgTlVMTCkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWNvZGVjID0gcy0+c3RyZWFtc1tpXS0+Y29kZWM7CisgICAgICAgIG9jb2RlYyA9IHN0LT5jb2RlYzsKKyAgICAgICAgYXZjb2RlY19jb3B5X2NvbnRleHQob2NvZGVjLCBpY29kZWMpOworICAgICAgICBpZiAoIW9jLT5vZm9ybWF0LT5jb2RlY190YWcgfHwKKyAgICAgICAgICAgIGF2X2NvZGVjX2dldF9pZCAob2MtPm9mb3JtYXQtPmNvZGVjX3RhZywgaWNvZGVjLT5jb2RlY190YWcpID09IG9jb2RlYy0+Y29kZWNfaWQgfHwKKyAgICAgICAgICAgIGF2X2NvZGVjX2dldF90YWcob2MtPm9mb3JtYXQtPmNvZGVjX3RhZywgaWNvZGVjLT5jb2RlY19pZCkgPD0gMCkgeworICAgICAgICAgICAgb2NvZGVjLT5jb2RlY190YWcgPSBpY29kZWMtPmNvZGVjX3RhZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9jb2RlYy0+Y29kZWNfdGFnID0gMDsKKyAgICAgICAgfQorICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHMtPnN0cmVhbXNbaV0tPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgIHN0LT50aW1lX2Jhc2UgPSBzLT5zdHJlYW1zW2ldLT50aW1lX2Jhc2U7CisgICAgICAgIGF2X2RpY3RfY29weSgmc3QtPm1ldGFkYXRhLCBzLT5zdHJlYW1zW2ldLT5tZXRhZGF0YSwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NlZ21lbnRfZmlsZW5hbWUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNlZ21lbnRDb250ZXh0ICpzZWcgPSBzLT5wcml2X2RhdGE7CisgICAgQVZGb3JtYXRDb250ZXh0ICpvYyA9IHNlZy0+YXZmOworICAgIHNpemVfdCBzaXplOworCisgICAgaWYgKHNlZy0+c2VnbWVudF9pZHhfd3JhcCkKKyAgICAgICAgc2VnLT5zZWdtZW50X2lkeCAlPSBzZWctPnNlZ21lbnRfaWR4X3dyYXA7CisgICAgaWYgKGF2X2dldF9mcmFtZV9maWxlbmFtZShvYy0+ZmlsZW5hbWUsIHNpemVvZihvYy0+ZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmlsZW5hbWUsIHNlZy0+c2VnbWVudF9pZHgpIDwgMCkgeworICAgICAgICBhdl9sb2cob2MsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2VnbWVudCBmaWxlbmFtZSB0ZW1wbGF0ZSAnJXMnXG4iLCBzLT5maWxlbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogY29weSBtb2RpZmllZCBuYW1lIGluIGxpc3QgZW50cnkgKi8KKyAgICBzaXplID0gc3RybGVuKGF2X2Jhc2VuYW1lKG9jLT5maWxlbmFtZSkpICsgMTsKKyAgICBpZiAoc2VnLT5lbnRyeV9wcmVmaXgpCisgICAgICAgIHNpemUgKz0gc3RybGVuKHNlZy0+ZW50cnlfcHJlZml4KTsKKworICAgIHNlZy0+Y3VyX2VudHJ5LmZpbGVuYW1lID0gYXZfbWFsbG9jeihzaXplKTsKKyAgICBpZiAoIXNlZy0+Y3VyX2VudHJ5LmZpbGVuYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHNucHJpbnRmKHNlZy0+Y3VyX2VudHJ5LmZpbGVuYW1lLCBzaXplLCAiJXMlcyIsCisgICAgICAgICAgICAgc2VnLT5lbnRyeV9wcmVmaXggPyBzZWctPmVudHJ5X3ByZWZpeCA6ICIiLAorICAgICAgICAgICAgIGF2X2Jhc2VuYW1lKG9jLT5maWxlbmFtZSkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VnbWVudF9zdGFydChBVkZvcm1hdENvbnRleHQgKnMsIGludCB3cml0ZV9oZWFkZXIpCit7CisgICAgU2VnbWVudENvbnRleHQgKnNlZyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkZvcm1hdENvbnRleHQgKm9jID0gc2VnLT5hdmY7CisgICAgaW50IGVyciA9IDA7CisKKyAgICBpZiAod3JpdGVfaGVhZGVyKSB7CisgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChvYyk7CisgICAgICAgIHNlZy0+YXZmID0gTlVMTDsKKyAgICAgICAgaWYgKChlcnIgPSBzZWdtZW50X211eF9pbml0KHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBvYyA9IHNlZy0+YXZmOworICAgIH0KKworICAgIHNlZy0+c2VnbWVudF9pZHgrKzsKKyAgICBpZiAoKHNlZy0+c2VnbWVudF9pZHhfd3JhcCkgJiYgKHNlZy0+c2VnbWVudF9pZHglc2VnLT5zZWdtZW50X2lkeF93cmFwID09IDApKQorICAgICAgICBzZWctPnNlZ21lbnRfaWR4X3dyYXBfbmIrKzsKKworICAgIGlmICgoZXJyID0gc2V0X3NlZ21lbnRfZmlsZW5hbWUocykpIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGlmICgoZXJyID0gYXZpb19vcGVuMigmb2MtPnBiLCBvYy0+ZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gc2VnbWVudCAnJXMnXG4iLCBvYy0+ZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChvYy0+b2Zvcm1hdC0+cHJpdl9jbGFzcyAmJiBvYy0+cHJpdl9kYXRhKQorICAgICAgICBhdl9vcHRfc2V0KG9jLT5wcml2X2RhdGEsICJtcGVndHNfZmxhZ3MiLCAiK3Jlc2VuZF9oZWFkZXJzIiwgMCk7CisKKyAgICBpZiAod3JpdGVfaGVhZGVyKSB7CisgICAgICAgIGlmICgoZXJyID0gYXZmb3JtYXRfd3JpdGVfaGVhZGVyKG9jLCBOVUxMKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzZWctPnNlZ21lbnRfZnJhbWVfY291bnQgPSAwOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlZ21lbnRfbGlzdF9vcGVuKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBTZWdtZW50Q29udGV4dCAqc2VnID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBhdmlvX29wZW4yKCZzZWctPmxpc3RfcGIsIHNlZy0+bGlzdCwgQVZJT19GTEFHX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIHNlZ21lbnQgbGlzdCAnJXMnXG4iLCBzZWctPmxpc3QpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChzZWctPmxpc3RfdHlwZSA9PSBMSVNUX1RZUEVfTTNVOCAmJiBzZWctPnNlZ21lbnRfbGlzdF9lbnRyaWVzKSB7CisgICAgICAgIFNlZ21lbnRMaXN0RW50cnkgKmVudHJ5OworICAgICAgICBkb3VibGUgbWF4X2R1cmF0aW9uID0gMDsKKworICAgICAgICBhdmlvX3ByaW50ZihzZWctPmxpc3RfcGIsICIjRVhUTTNVXG4iKTsKKyAgICAgICAgYXZpb19wcmludGYoc2VnLT5saXN0X3BiLCAiI0VYVC1YLVZFUlNJT046M1xuIik7CisgICAgICAgIGF2aW9fcHJpbnRmKHNlZy0+bGlzdF9wYiwgIiNFWFQtWC1NRURJQS1TRVFVRU5DRTolZFxuIiwgc2VnLT5zZWdtZW50X2xpc3RfZW50cmllcy0+aW5kZXgpOworICAgICAgICBhdmlvX3ByaW50ZihzZWctPmxpc3RfcGIsICIjRVhULVgtQUxMT1ctQ0FDSEU6JXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHNlZy0+bGlzdF9mbGFncyAmIFNFR01FTlRfTElTVF9GTEFHX0NBQ0hFID8gIllFUyIgOiAiTk8iKTsKKworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJFWFQtWC1NRURJQS1TRVFVRU5DRTolZFxuIiwKKyAgICAgICAgICAgICAgIHNlZy0+c2VnbWVudF9saXN0X2VudHJpZXMtPmluZGV4KTsKKworICAgICAgICBmb3IgKGVudHJ5ID0gc2VnLT5zZWdtZW50X2xpc3RfZW50cmllczsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpCisgICAgICAgICAgICBtYXhfZHVyYXRpb24gPSBGRk1BWChtYXhfZHVyYXRpb24sIGVudHJ5LT5lbmRfdGltZSAtIGVudHJ5LT5zdGFydF90aW1lKTsKKyAgICAgICAgYXZpb19wcmludGYoc2VnLT5saXN0X3BiLCAiI0VYVC1YLVRBUkdFVERVUkFUSU9OOiUiUFJJZDY0IlxuIiwgKGludDY0X3QpY2VpbChtYXhfZHVyYXRpb24pKTsKKyAgICB9IGVsc2UgaWYgKHNlZy0+bGlzdF90eXBlID09IExJU1RfVFlQRV9GRkNPTkNBVCkgeworICAgICAgICBhdmlvX3ByaW50ZihzZWctPmxpc3RfcGIsICJmZmNvbmNhdCB2ZXJzaW9uIDEuMFxuIik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2VnbWVudF9saXN0X3ByaW50X2VudHJ5KEFWSU9Db250ZXh0ICAgICAgKmxpc3RfaW9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFR5cGUgICAgICAgICAgbGlzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlZ21lbnRMaXN0RW50cnkgKmxpc3RfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBzd2l0Y2ggKGxpc3RfdHlwZSkgeworICAgIGNhc2UgTElTVF9UWVBFX0ZMQVQ6CisgICAgICAgIGF2aW9fcHJpbnRmKGxpc3RfaW9jdHgsICIlc1xuIiwgbGlzdF9lbnRyeS0+ZmlsZW5hbWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExJU1RfVFlQRV9DU1Y6CisgICAgY2FzZSBMSVNUX1RZUEVfRVhUOgorICAgICAgICBwcmludF9jc3ZfZXNjYXBlZF9zdHIobGlzdF9pb2N0eCwgbGlzdF9lbnRyeS0+ZmlsZW5hbWUpOworICAgICAgICBhdmlvX3ByaW50ZihsaXN0X2lvY3R4LCAiLCVmLCVmXG4iLCBsaXN0X2VudHJ5LT5zdGFydF90aW1lLCBsaXN0X2VudHJ5LT5lbmRfdGltZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTElTVF9UWVBFX00zVTg6CisgICAgICAgIGF2aW9fcHJpbnRmKGxpc3RfaW9jdHgsICIjRVhUSU5GOiVmLFxuJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGxpc3RfZW50cnktPmVuZF90aW1lIC0gbGlzdF9lbnRyeS0+c3RhcnRfdGltZSwgbGlzdF9lbnRyeS0+ZmlsZW5hbWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExJU1RfVFlQRV9GRkNPTkNBVDoKKyAgICB7CisgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgaWYgKGF2X2VzY2FwZSgmYnVmLCBsaXN0X2VudHJ5LT5maWxlbmFtZSwgTlVMTCwgQVZfRVNDQVBFX01PREVfQVVUTywgQVZfRVNDQVBFX0ZMQUdfV0hJVEVTUEFDRSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkVycm9yIHdyaXRpbmcgbGlzdCBlbnRyeSAnJXMnIGluIGxpc3QgZmlsZVxuIiwgbGlzdF9lbnRyeS0+ZmlsZW5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGF2aW9fcHJpbnRmKGxpc3RfaW9jdHgsICJmaWxlICVzXG4iLCBidWYpOworICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKCEiSW52YWxpZCBsaXN0IHR5cGUiKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgc2VnbWVudF9lbmQoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgd3JpdGVfdHJhaWxlciwgaW50IGlzX2xhc3QpCit7CisgICAgU2VnbWVudENvbnRleHQgKnNlZyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkZvcm1hdENvbnRleHQgKm9jID0gc2VnLT5hdmY7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBhdl93cml0ZV9mcmFtZShvYywgTlVMTCk7IC8qIEZsdXNoIGFueSBidWZmZXJlZCBkYXRhIChmcmFnbWVudGVkIG1wNCkgKi8KKyAgICBpZiAod3JpdGVfdHJhaWxlcikKKyAgICAgICAgcmV0ID0gYXZfd3JpdGVfdHJhaWxlcihvYyk7CisKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWx1cmUgb2NjdXJyZWQgd2hlbiBlbmRpbmcgc2VnbWVudCAnJXMnXG4iLAorICAgICAgICAgICAgICAgb2MtPmZpbGVuYW1lKTsKKworICAgIGlmIChzZWctPmxpc3QpIHsKKyAgICAgICAgaWYgKHNlZy0+bGlzdF9zaXplIHx8IHNlZy0+bGlzdF90eXBlID09IExJU1RfVFlQRV9NM1U4KSB7CisgICAgICAgICAgICBTZWdtZW50TGlzdEVudHJ5ICplbnRyeSA9IGF2X21hbGxvY3ooc2l6ZW9mKCplbnRyeSkpOworICAgICAgICAgICAgaWYgKCFlbnRyeSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYXBwZW5kIG5ldyBlbGVtZW50ICovCisgICAgICAgICAgICBtZW1jcHkoZW50cnksICZzZWctPmN1cl9lbnRyeSwgc2l6ZW9mKCplbnRyeSkpOworICAgICAgICAgICAgaWYgKCFzZWctPnNlZ21lbnRfbGlzdF9lbnRyaWVzKQorICAgICAgICAgICAgICAgIHNlZy0+c2VnbWVudF9saXN0X2VudHJpZXMgPSBzZWctPnNlZ21lbnRfbGlzdF9lbnRyaWVzX2VuZCA9IGVudHJ5OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNlZy0+c2VnbWVudF9saXN0X2VudHJpZXNfZW5kLT5uZXh0ID0gZW50cnk7CisgICAgICAgICAgICBzZWctPnNlZ21lbnRfbGlzdF9lbnRyaWVzX2VuZCA9IGVudHJ5OworCisgICAgICAgICAgICAvKiBkcm9wIGZpcnN0IGl0ZW0gKi8KKyAgICAgICAgICAgIGlmIChzZWctPmxpc3Rfc2l6ZSAmJiBzZWctPnNlZ21lbnRfY291bnQgPj0gc2VnLT5saXN0X3NpemUpIHsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IHNlZy0+c2VnbWVudF9saXN0X2VudHJpZXM7CisgICAgICAgICAgICAgICAgc2VnLT5zZWdtZW50X2xpc3RfZW50cmllcyA9IHNlZy0+c2VnbWVudF9saXN0X2VudHJpZXMtPm5leHQ7CisgICAgICAgICAgICAgICAgYXZfZnJlZShlbnRyeS0+ZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZlbnRyeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2aW9fY2xvc2Uoc2VnLT5saXN0X3BiKTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gc2VnbWVudF9saXN0X29wZW4ocykpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIGZvciAoZW50cnkgPSBzZWctPnNlZ21lbnRfbGlzdF9lbnRyaWVzOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkKKyAgICAgICAgICAgICAgICBzZWdtZW50X2xpc3RfcHJpbnRfZW50cnkoc2VnLT5saXN0X3BiLCBzZWctPmxpc3RfdHlwZSwgZW50cnksIHMpOworICAgICAgICAgICAgaWYgKHNlZy0+bGlzdF90eXBlID09IExJU1RfVFlQRV9NM1U4ICYmIGlzX2xhc3QpCisgICAgICAgICAgICAgICAgYXZpb19wcmludGYoc2VnLT5saXN0X3BiLCAiI0VYVC1YLUVORExJU1RcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VnbWVudF9saXN0X3ByaW50X2VudHJ5KHNlZy0+bGlzdF9wYiwgc2VnLT5saXN0X3R5cGUsICZzZWctPmN1cl9lbnRyeSwgcyk7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19mbHVzaChzZWctPmxpc3RfcGIpOworICAgIH0KKworICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgInNlZ21lbnQ6JyVzJyBjb3VudDolZCBlbmRlZFxuIiwKKyAgICAgICAgICAgc2VnLT5hdmYtPmZpbGVuYW1lLCBzZWctPnNlZ21lbnRfY291bnQpOworICAgIHNlZy0+c2VnbWVudF9jb3VudCsrOworCitlbmQ6CisgICAgYXZpb19jbG9zZShvYy0+cGIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwYXJzZV90aW1lcyh2b2lkICpsb2dfY3R4LCBpbnQ2NF90ICoqdGltZXMsIGludCAqbmJfdGltZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRpbWVzX3N0cikKK3sKKyAgICBjaGFyICpwOworICAgIGludCBpLCByZXQgPSAwOworICAgIGNoYXIgKnRpbWVzX3N0cjEgPSBhdl9zdHJkdXAodGltZXNfc3RyKTsKKyAgICBjaGFyICpzYXZlcHRyID0gTlVMTDsKKworICAgIGlmICghdGltZXNfc3RyMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworI2RlZmluZSBGQUlMKGVycikgcmV0ID0gZXJyOyBnb3RvIGVuZAorCisgICAgKm5iX3RpbWVzID0gMTsKKyAgICBmb3IgKHAgPSB0aW1lc19zdHIxOyAqcDsgcCsrKQorICAgICAgICBpZiAoKnAgPT0gJywnKQorICAgICAgICAgICAgKCpuYl90aW1lcykrKzsKKworICAgICp0aW1lcyA9IGF2X21hbGxvY19hcnJheSgqbmJfdGltZXMsIHNpemVvZigqKnRpbWVzKSk7CisgICAgaWYgKCEqdGltZXMpIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBmb3JjZWQgdGltZXMgYXJyYXlcbiIpOworICAgICAgICBGQUlMKEFWRVJST1IoRU5PTUVNKSk7CisgICAgfQorCisgICAgcCA9IHRpbWVzX3N0cjE7CisgICAgZm9yIChpID0gMDsgaSA8ICpuYl90aW1lczsgaSsrKSB7CisgICAgICAgIGludDY0X3QgdDsKKyAgICAgICAgY2hhciAqdHN0ciA9IGF2X3N0cnRvayhwLCAiLCIsICZzYXZlcHRyKTsKKyAgICAgICAgcCA9IE5VTEw7CisKKyAgICAgICAgaWYgKCF0c3RyIHx8ICF0c3RyWzBdKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiRW1wdHkgdGltZSBzcGVjaWZpY2F0aW9uIGluIHRpbWVzIGxpc3QgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgdGltZXNfc3RyKTsKKyAgICAgICAgICAgIEZBSUwoQVZFUlJPUihFSU5WQUwpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGF2X3BhcnNlX3RpbWUoJnQsIHRzdHIsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB0aW1lIGR1cmF0aW9uIHNwZWNpZmljYXRpb24gJyVzJyBpbiB0aW1lcyBsaXN0ICVzXG4iLCB0c3RyLCB0aW1lc19zdHIpOworICAgICAgICAgICAgRkFJTChBVkVSUk9SKEVJTlZBTCkpOworICAgICAgICB9CisgICAgICAgICgqdGltZXMpW2ldID0gdDsKKworICAgICAgICAvKiBjaGVjayBvbiBtb25vdG9uaWNpdHkgKi8KKyAgICAgICAgaWYgKGkgJiYgKCp0aW1lcylbaS0xXSA+ICgqdGltZXMpW2ldKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJTcGVjaWZpZWQgdGltZSAlZiBpcyBncmVhdGVyIHRoYW4gdGhlIGZvbGxvd2luZyB0aW1lICVmXG4iLAorICAgICAgICAgICAgICAgICAgIChmbG9hdCkoKCp0aW1lcylbaV0pLzEwMDAwMDAsIChmbG9hdCkoKCp0aW1lcylbaS0xXSkvMTAwMDAwMCk7CisgICAgICAgICAgICBGQUlMKEFWRVJST1IoRUlOVkFMKSk7CisgICAgICAgIH0KKyAgICB9CisKK2VuZDoKKyAgICBhdl9mcmVlKHRpbWVzX3N0cjEpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZnJhbWVzKHZvaWQgKmxvZ19jdHgsIGludCAqKmZyYW1lcywgaW50ICpuYl9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcmFtZXNfc3RyKQoreworICAgIGNoYXIgKnA7CisgICAgaW50IGksIHJldCA9IDA7CisgICAgY2hhciAqZnJhbWVzX3N0cjEgPSBhdl9zdHJkdXAoZnJhbWVzX3N0cik7CisgICAgY2hhciAqc2F2ZXB0ciA9IE5VTEw7CisKKyAgICBpZiAoIWZyYW1lc19zdHIxKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisjZGVmaW5lIEZBSUwoZXJyKSByZXQgPSBlcnI7IGdvdG8gZW5kCisKKyAgICAqbmJfZnJhbWVzID0gMTsKKyAgICBmb3IgKHAgPSBmcmFtZXNfc3RyMTsgKnA7IHArKykKKyAgICAgICAgaWYgKCpwID09ICcsJykKKyAgICAgICAgICAgICgqbmJfZnJhbWVzKSsrOworCisgICAgKmZyYW1lcyA9IGF2X21hbGxvY19hcnJheSgqbmJfZnJhbWVzLCBzaXplb2YoKipmcmFtZXMpKTsKKyAgICBpZiAoISpmcmFtZXMpIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBmb3JjZWQgZnJhbWVzIGFycmF5XG4iKTsKKyAgICAgICAgRkFJTChBVkVSUk9SKEVOT01FTSkpOworICAgIH0KKworICAgIHAgPSBmcmFtZXNfc3RyMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKm5iX2ZyYW1lczsgaSsrKSB7CisgICAgICAgIGxvbmcgaW50IGY7CisgICAgICAgIGNoYXIgKnRhaWxwdHI7CisgICAgICAgIGNoYXIgKmZzdHIgPSBhdl9zdHJ0b2socCwgIiwiLCAmc2F2ZXB0cik7CisKKyAgICAgICAgcCA9IE5VTEw7CisgICAgICAgIGlmICghZnN0cikgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkVtcHR5IGZyYW1lIHNwZWNpZmljYXRpb24gaW4gZnJhbWUgbGlzdCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBmcmFtZXNfc3RyKTsKKyAgICAgICAgICAgIEZBSUwoQVZFUlJPUihFSU5WQUwpKTsKKyAgICAgICAgfQorICAgICAgICBmID0gc3RydG9sKGZzdHIsICZ0YWlscHRyLCAxMCk7CisgICAgICAgIGlmICgqdGFpbHB0ciB8fCBmIDw9IDAgfHwgZiA+PSBJTlRfTUFYKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50ICclcycsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIDw9IElOVDY0X01BWFxuIiwKKyAgICAgICAgICAgICAgICAgICBmc3RyKTsKKyAgICAgICAgICAgIEZBSUwoQVZFUlJPUihFSU5WQUwpKTsKKyAgICAgICAgfQorICAgICAgICAoKmZyYW1lcylbaV0gPSBmOworCisgICAgICAgIC8qIGNoZWNrIG9uIG1vbm90b25pY2l0eSAqLworICAgICAgICBpZiAoaSAmJiAoKmZyYW1lcylbaS0xXSA+ICgqZnJhbWVzKVtpXSkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiU3BlY2lmaWVkIGZyYW1lICVkIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZm9sbG93aW5nIGZyYW1lICVkXG4iLAorICAgICAgICAgICAgICAgICAgICgqZnJhbWVzKVtpXSwgKCpmcmFtZXMpW2ktMV0pOworICAgICAgICAgICAgRkFJTChBVkVSUk9SKEVJTlZBTCkpOworICAgICAgICB9CisgICAgfQorCitlbmQ6CisgICAgYXZfZnJlZShmcmFtZXNfc3RyMSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvcGVuX251bGxfY3R4KEFWSU9Db250ZXh0ICoqY3R4KQoreworICAgIGludCBidWZfc2l6ZSA9IDMyNzY4OworICAgIHVpbnQ4X3QgKmJ1ZiA9IGF2X21hbGxvYyhidWZfc2l6ZSk7CisgICAgaWYgKCFidWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgKmN0eCA9IGF2aW9fYWxsb2NfY29udGV4dChidWYsIGJ1Zl9zaXplLCBBVklPX0ZMQUdfV1JJVEUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGlmICghKmN0eCkgeworICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9udWxsX2N0eChBVklPQ29udGV4dCAqcGIpCit7CisgICAgYXZfZnJlZShwYi0+YnVmZmVyKTsKKyAgICBhdl9mcmVlKHBiKTsKK30KKworc3RhdGljIGludCBzZWxlY3RfcmVmZXJlbmNlX3N0cmVhbShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgU2VnbWVudENvbnRleHQgKnNlZyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBpOworCisgICAgc2VnLT5yZWZlcmVuY2Vfc3RyZWFtX2luZGV4ID0gLTE7CisgICAgaWYgKCFzdHJjbXAoc2VnLT5yZWZlcmVuY2Vfc3RyZWFtX3NwZWNpZmllciwgImF1dG8iKSkgeworICAgICAgICAvKiBzZWxlY3QgZmlyc3QgaW5kZXggb2YgdHlwZSB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkgKi8KKyAgICAgICAgaW50IHR5cGVfaW5kZXhfbWFwW0FWTUVESUFfVFlQRV9OQl07CisgICAgICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWTWVkaWFUeXBlIHR5cGVfcHJpb3JpdHlfbGlzdFtdID0geworICAgICAgICAgICAgQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAgICAgQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAgICAgQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAgICAgQVZNRURJQV9UWVBFX0RBVEEsCisgICAgICAgICAgICBBVk1FRElBX1RZUEVfQVRUQUNITUVOVAorICAgICAgICB9OworICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGU7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEFWTUVESUFfVFlQRV9OQjsgaSsrKQorICAgICAgICAgICAgdHlwZV9pbmRleF9tYXBbaV0gPSAtMTsKKworICAgICAgICAvKiBzZWxlY3QgZmlyc3QgaW5kZXggZm9yIGVhY2ggdHlwZSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICB0eXBlID0gcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGU7CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXR5cGUgPCBBVk1FRElBX1RZUEVfTkIgJiYgdHlwZV9pbmRleF9tYXBbdHlwZV0gPT0gLTEKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgYXR0YWNoZWQgcGljdHVyZXMvY292ZXIgYXJ0IHN0cmVhbXMgKi8KKyAgICAgICAgICAgICAgICAmJiAhKHMtPnN0cmVhbXNbaV0tPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDKSkKKyAgICAgICAgICAgICAgICB0eXBlX2luZGV4X21hcFt0eXBlXSA9IGk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVModHlwZV9wcmlvcml0eV9saXN0KTsgaSsrKSB7CisgICAgICAgICAgICB0eXBlID0gdHlwZV9wcmlvcml0eV9saXN0W2ldOworICAgICAgICAgICAgaWYgKChzZWctPnJlZmVyZW5jZV9zdHJlYW1faW5kZXggPSB0eXBlX2luZGV4X21hcFt0eXBlXSkgPj0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IGF2Zm9ybWF0X21hdGNoX3N0cmVhbV9zcGVjaWZpZXIocywgcy0+c3RyZWFtc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5yZWZlcmVuY2Vfc3RyZWFtX3NwZWNpZmllcik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgICAgICBzZWctPnJlZmVyZW5jZV9zdHJlYW1faW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNlZy0+cmVmZXJlbmNlX3N0cmVhbV9pbmRleCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBzZWxlY3Qgc3RyZWFtIG1hdGNoaW5nIGlkZW50aWZpZXIgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgIHNlZy0+cmVmZXJlbmNlX3N0cmVhbV9zcGVjaWZpZXIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlZ193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNlZ21lbnRDb250ZXh0ICpzZWcgPSBzLT5wcml2X2RhdGE7CisgICAgQVZGb3JtYXRDb250ZXh0ICpvYyA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5ICpvcHRpb25zID0gTlVMTDsKKyAgICBpbnQgcmV0OworICAgIGludCBpOworCisgICAgc2VnLT5zZWdtZW50X2NvdW50ID0gMDsKKyAgICBpZiAoIXNlZy0+d3JpdGVfaGVhZGVyX3RyYWlsZXIpCisgICAgICAgIHNlZy0+aW5kaXZpZHVhbF9oZWFkZXJfdHJhaWxlciA9IDA7CisKKyAgICBpZiAoISFzZWctPnRpbWVfc3RyICsgISFzZWctPnRpbWVzX3N0ciArICEhc2VnLT5mcmFtZXNfc3RyID4gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInNlZ21lbnRfdGltZSwgc2VnbWVudF90aW1lcywgYW5kIHNlZ21lbnRfZnJhbWVzIG9wdGlvbnMgIgorICAgICAgICAgICAgICAgImFyZSBtdXR1YWxseSBleGNsdXNpdmUsIHNlbGVjdCBqdXN0IG9uZSBvZiB0aGVtXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoc2VnLT50aW1lc19zdHIpIHsKKyAgICAgICAgaWYgKChyZXQgPSBwYXJzZV90aW1lcyhzLCAmc2VnLT50aW1lcywgJnNlZy0+bmJfdGltZXMsIHNlZy0+dGltZXNfc3RyKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKHNlZy0+ZnJhbWVzX3N0cikgeworICAgICAgICBpZiAoKHJldCA9IHBhcnNlX2ZyYW1lcyhzLCAmc2VnLT5mcmFtZXMsICZzZWctPm5iX2ZyYW1lcywgc2VnLT5mcmFtZXNfc3RyKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBzZXQgZGVmYXVsdCB2YWx1ZSBpZiBub3Qgc3BlY2lmaWVkICovCisgICAgICAgIGlmICghc2VnLT50aW1lX3N0cikKKyAgICAgICAgICAgIHNlZy0+dGltZV9zdHIgPSBhdl9zdHJkdXAoIjIiKTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9wYXJzZV90aW1lKCZzZWctPnRpbWUsIHNlZy0+dGltZV9zdHIsIDEpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdGltZSBkdXJhdGlvbiBzcGVjaWZpY2F0aW9uICclcycgZm9yIHNlZ21lbnRfdGltZSBvcHRpb25cbiIsCisgICAgICAgICAgICAgICAgICAgc2VnLT50aW1lX3N0cik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNlZy0+Zm9ybWF0X29wdGlvbnNfc3RyKSB7CisgICAgICAgIHJldCA9IGF2X2RpY3RfcGFyc2Vfc3RyaW5nKCZzZWctPmZvcm1hdF9vcHRpb25zLCBzZWctPmZvcm1hdF9vcHRpb25zX3N0ciwgIj0iLCAiOiIsIDApOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBwYXJzZSBmb3JtYXQgb3B0aW9ucyBsaXN0ICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgc2VnLT5mb3JtYXRfb3B0aW9uc19zdHIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNlZy0+bGlzdCkgeworICAgICAgICBpZiAoc2VnLT5saXN0X3R5cGUgPT0gTElTVF9UWVBFX1VOREVGSU5FRCkgeworICAgICAgICAgICAgaWYgICAgICAoYXZfbWF0Y2hfZXh0KHNlZy0+bGlzdCwgImNzdiIgKSkgc2VnLT5saXN0X3R5cGUgPSBMSVNUX1RZUEVfQ1NWOworICAgICAgICAgICAgZWxzZSBpZiAoYXZfbWF0Y2hfZXh0KHNlZy0+bGlzdCwgImV4dCIgKSkgc2VnLT5saXN0X3R5cGUgPSBMSVNUX1RZUEVfRVhUOworICAgICAgICAgICAgZWxzZSBpZiAoYXZfbWF0Y2hfZXh0KHNlZy0+bGlzdCwgIm0zdTgiKSkgc2VnLT5saXN0X3R5cGUgPSBMSVNUX1RZUEVfTTNVODsKKyAgICAgICAgICAgIGVsc2UgaWYgKGF2X21hdGNoX2V4dChzZWctPmxpc3QsICJmZmNhdCxmZmNvbmNhdCIpKSBzZWctPmxpc3RfdHlwZSA9IExJU1RfVFlQRV9GRkNPTkNBVDsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+bGlzdF90eXBlID0gTElTVF9UWVBFX0ZMQVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBzZWdtZW50X2xpc3Rfb3BlbihzKSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoc2VnLT5saXN0X3R5cGUgPT0gTElTVF9UWVBFX0VYVCkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiJ2V4dCcgbGlzdCB0eXBlIG9wdGlvbiBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mICdjc3YnXG4iKTsKKworICAgIGlmICgocmV0ID0gc2VsZWN0X3JlZmVyZW5jZV9zdHJlYW0ocykpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgIlNlbGVjdGVkIHN0cmVhbSBpZDolZCB0eXBlOiVzXG4iLAorICAgICAgICAgICBzZWctPnJlZmVyZW5jZV9zdHJlYW1faW5kZXgsCisgICAgICAgICAgIGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyhzLT5zdHJlYW1zW3NlZy0+cmVmZXJlbmNlX3N0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlKSk7CisKKyAgICBzZWctPm9mb3JtYXQgPSBhdl9ndWVzc19mb3JtYXQoc2VnLT5mb3JtYXQsIHMtPmZpbGVuYW1lLCBOVUxMKTsKKworICAgIGlmICghc2VnLT5vZm9ybWF0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfTVVYRVJfTk9UX0ZPVU5EOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChzZWctPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJmb3JtYXQgJXMgbm90IHN1cHBvcnRlZC5cbiIsCisgICAgICAgICAgICAgICBzZWctPm9mb3JtYXQtPm5hbWUpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHNlZ21lbnRfbXV4X2luaXQocykpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIG9jID0gc2VnLT5hdmY7CisKKyAgICBpZiAoKHJldCA9IHNldF9zZWdtZW50X2ZpbGVuYW1lKHMpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChzZWctPndyaXRlX2hlYWRlcl90cmFpbGVyKSB7CisgICAgICAgIGlmICgocmV0ID0gYXZpb19vcGVuMigmb2MtPnBiLCBvYy0+ZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBzZWdtZW50ICclcydcbiIsIG9jLT5maWxlbmFtZSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHJldCA9IG9wZW5fbnVsbF9jdHgoJm9jLT5wYikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdl9kaWN0X2NvcHkoJm9wdGlvbnMsIHNlZy0+Zm9ybWF0X29wdGlvbnMsIDApOworICAgIHJldCA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihvYywgJm9wdGlvbnMpOworICAgIGlmIChhdl9kaWN0X2NvdW50KG9wdGlvbnMpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiU29tZSBvZiB0aGUgcHJvdmlkZWQgZm9ybWF0IG9wdGlvbnMgaW4gJyVzJyBhcmUgbm90IHJlY29nbml6ZWRcbiIsIHNlZy0+Zm9ybWF0X29wdGlvbnNfc3RyKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZpb19jbG9zZShvYy0+cGIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHNlZy0+c2VnbWVudF9mcmFtZV9jb3VudCA9IDA7CisKKyAgICBhdl9hc3NlcnQwKHMtPm5iX3N0cmVhbXMgPT0gb2MtPm5iX3N0cmVhbXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKmlubmVyX3N0ICA9IG9jLT5zdHJlYW1zW2ldOworICAgICAgICBBVlN0cmVhbSAqb3V0ZXJfc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKG91dGVyX3N0LCBpbm5lcl9zdC0+cHRzX3dyYXBfYml0cywgaW5uZXJfc3QtPnRpbWVfYmFzZS5udW0sIGlubmVyX3N0LT50aW1lX2Jhc2UuZGVuKTsKKyAgICB9CisKKyAgICBpZiAob2MtPmF2b2lkX25lZ2F0aXZlX3RzID4gMCAmJiBzLT5hdm9pZF9uZWdhdGl2ZV90cyA8IDApCisgICAgICAgIHMtPmF2b2lkX25lZ2F0aXZlX3RzID0gMTsKKworICAgIGlmICghc2VnLT53cml0ZV9oZWFkZXJfdHJhaWxlcikgeworICAgICAgICBjbG9zZV9udWxsX2N0eChvYy0+cGIpOworICAgICAgICBpZiAoKHJldCA9IGF2aW9fb3BlbjIoJm9jLT5wYiwgb2MtPmZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMKSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworZmFpbDoKKyAgICBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgaWYgKHNlZy0+bGlzdCkKKyAgICAgICAgICAgIGF2aW9fY2xvc2Uoc2VnLT5saXN0X3BiKTsKKyAgICAgICAgaWYgKHNlZy0+YXZmKQorICAgICAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHNlZy0+YXZmKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZWdfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBTZWdtZW50Q29udGV4dCAqc2VnID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworICAgIGludDY0X3QgZW5kX3B0cyA9IElOVDY0X01BWCwgb2Zmc2V0OworICAgIGludCBzdGFydF9mcmFtZSA9IElOVF9NQVg7CisgICAgaW50IHJldDsKKyAgICBzdHJ1Y3QgdG0gdGk7CisgICAgaW50NjRfdCB1c2VjczsKKyAgICBpbnQ2NF90IHdyYXBwZWRfdmFsOworCisgICAgaWYgKHNlZy0+dGltZXMpIHsKKyAgICAgICAgZW5kX3B0cyA9IHNlZy0+c2VnbWVudF9jb3VudCA8IHNlZy0+bmJfdGltZXMgPworICAgICAgICAgICAgc2VnLT50aW1lc1tzZWctPnNlZ21lbnRfY291bnRdIDogSU5UNjRfTUFYOworICAgIH0gZWxzZSBpZiAoc2VnLT5mcmFtZXMpIHsKKyAgICAgICAgc3RhcnRfZnJhbWUgPSBzZWctPnNlZ21lbnRfY291bnQgPCBzZWctPm5iX2ZyYW1lcyA/CisgICAgICAgICAgICBzZWctPmZyYW1lc1tzZWctPnNlZ21lbnRfY291bnRdIDogSU5UX01BWDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2VnLT51c2VfY2xvY2t0aW1lKSB7CisgICAgICAgICAgICBpbnQ2NF90IGF2Z3QgPSBhdl9nZXR0aW1lKCk7CisgICAgICAgICAgICB0aW1lX3Qgc2VjID0gYXZndCAvIDEwMDAwMDA7CisgICAgICAgICAgICBsb2NhbHRpbWVfcigmc2VjLCAmdGkpOworICAgICAgICAgICAgdXNlY3MgPSAoaW50NjRfdCkodGkudG1faG91ciozNjAwICsgdGkudG1fbWluKjYwICsgdGkudG1fc2VjKSAqIDEwMDAwMDAgKyAoYXZndCAlIDEwMDAwMDApOworICAgICAgICAgICAgd3JhcHBlZF92YWwgPSB1c2VjcyAlIHNlZy0+dGltZTsKKyAgICAgICAgICAgIGlmIChzZWctPmxhc3RfY3V0ICE9IHVzZWNzICYmIHdyYXBwZWRfdmFsIDwgc2VnLT5sYXN0X3ZhbCkgeworICAgICAgICAgICAgICAgIHNlZy0+Y3V0X3BlbmRpbmcgPSAxOworICAgICAgICAgICAgICAgIHNlZy0+bGFzdF9jdXQgPSB1c2VjczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlZy0+bGFzdF92YWwgPSB3cmFwcGVkX3ZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVuZF9wdHMgPSBzZWctPnRpbWUgKiAoc2VnLT5zZWdtZW50X2NvdW50KzEpOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZGxvZyhzLCAicGFja2V0IHN0cmVhbTolZCBwdHM6JXMgcHRzX3RpbWU6JXMgZHVyYXRpb25fdGltZTolcyBpc19rZXk6JWQgZnJhbWU6JWRcbiIsCisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCwgYXZfdHMyc3RyKHBrdC0+cHRzKSwgYXZfdHMydGltZXN0cihwa3QtPnB0cywgJnN0LT50aW1lX2Jhc2UpLAorICAgICAgICAgICAgYXZfdHMydGltZXN0cihwa3QtPmR1cmF0aW9uLCAmc3QtPnRpbWVfYmFzZSksCisgICAgICAgICAgICBwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZLAorICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPT0gc2VnLT5yZWZlcmVuY2Vfc3RyZWFtX2luZGV4ID8gc2VnLT5mcmFtZV9jb3VudCA6IC0xKTsKKworICAgIGlmIChwa3QtPnN0cmVhbV9pbmRleCA9PSBzZWctPnJlZmVyZW5jZV9zdHJlYW1faW5kZXggJiYKKyAgICAgICAgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSAmJgorICAgICAgICBzZWctPnNlZ21lbnRfZnJhbWVfY291bnQgPiAwICYmCisgICAgICAgIChzZWctPmN1dF9wZW5kaW5nIHx8IHNlZy0+ZnJhbWVfY291bnQgPj0gc3RhcnRfZnJhbWUgfHwKKyAgICAgICAgIChwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICAgIGF2X2NvbXBhcmVfdHMocGt0LT5wdHMsIHN0LT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRfcHRzLXNlZy0+dGltZV9kZWx0YSwgQVZfVElNRV9CQVNFX1EpID49IDApKSkgeworICAgICAgICAvKiBzYW5pdGl6ZSBlbmQgdGltZSBpbiBjYXNlIGxhc3QgcGFja2V0IGRpZG4ndCBoYXZlIGEgZGVmaW5lZCBkdXJhdGlvbiAqLworICAgICAgICBpZiAoc2VnLT5jdXJfZW50cnkubGFzdF9kdXJhdGlvbiA9PSAwKQorICAgICAgICAgICAgc2VnLT5jdXJfZW50cnkuZW5kX3RpbWUgPSAoZG91YmxlKXBrdC0+cHRzICogYXZfcTJkKHN0LT50aW1lX2Jhc2UpOworCisgICAgICAgIGlmICgocmV0ID0gc2VnbWVudF9lbmQocywgc2VnLT5pbmRpdmlkdWFsX2hlYWRlcl90cmFpbGVyLCAwKSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIGlmICgocmV0ID0gc2VnbWVudF9zdGFydChzLCBzZWctPmluZGl2aWR1YWxfaGVhZGVyX3RyYWlsZXIpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgc2VnLT5jdXRfcGVuZGluZyA9IDA7CisgICAgICAgIHNlZy0+Y3VyX2VudHJ5LmluZGV4ID0gc2VnLT5zZWdtZW50X2lkeCArIHNlZy0+c2VnbWVudF9pZHhfd3JhcCpzZWctPnNlZ21lbnRfaWR4X3dyYXBfbmI7CisgICAgICAgIHNlZy0+Y3VyX2VudHJ5LnN0YXJ0X3RpbWUgPSAoZG91YmxlKXBrdC0+cHRzICogYXZfcTJkKHN0LT50aW1lX2Jhc2UpOworICAgICAgICBzZWctPmN1cl9lbnRyeS5zdGFydF9wdHMgPSBhdl9yZXNjYWxlX3EocGt0LT5wdHMsIHN0LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgc2VnLT5jdXJfZW50cnkuZW5kX3RpbWUgPSBzZWctPmN1cl9lbnRyeS5zdGFydF90aW1lICsKKyAgICAgICAgICAgIHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFID8gKGRvdWJsZSkocGt0LT5wdHMgKyBwa3QtPmR1cmF0aW9uKSAqIGF2X3EyZChzdC0+dGltZV9iYXNlKSA6IDA7CisgICAgfSBlbHNlIGlmIChwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBwa3QtPnN0cmVhbV9pbmRleCA9PSBzZWctPnJlZmVyZW5jZV9zdHJlYW1faW5kZXgpIHsKKyAgICAgICAgc2VnLT5jdXJfZW50cnkuZW5kX3RpbWUgPQorICAgICAgICAgICAgRkZNQVgoc2VnLT5jdXJfZW50cnkuZW5kX3RpbWUsIChkb3VibGUpKHBrdC0+cHRzICsgcGt0LT5kdXJhdGlvbikgKiBhdl9xMmQoc3QtPnRpbWVfYmFzZSkpOworICAgICAgICBzZWctPmN1cl9lbnRyeS5sYXN0X2R1cmF0aW9uID0gcGt0LT5kdXJhdGlvbjsKKyAgICB9CisKKyAgICBpZiAoc2VnLT5zZWdtZW50X2ZyYW1lX2NvdW50ID09IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAic2VnbWVudDonJXMnIHN0YXJ0cyB3aXRoIHBhY2tldCBzdHJlYW06JWQgcHRzOiVzIHB0c190aW1lOiVzIGZyYW1lOiVkXG4iLAorICAgICAgICAgICAgICAgc2VnLT5hdmYtPmZpbGVuYW1lLCBwa3QtPnN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgIGF2X3RzMnN0cihwa3QtPnB0cyksIGF2X3RzMnRpbWVzdHIocGt0LT5wdHMsICZzdC0+dGltZV9iYXNlKSwgc2VnLT5mcmFtZV9jb3VudCk7CisgICAgfQorCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInN0cmVhbTolZCBzdGFydF9wdHNfdGltZTolcyBwdHM6JXMgcHRzX3RpbWU6JXMgZHRzOiVzIGR0c190aW1lOiVzIiwKKyAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXgsCisgICAgICAgICAgIGF2X3RzMnRpbWVzdHIoc2VnLT5jdXJfZW50cnkuc3RhcnRfcHRzLCAmQVZfVElNRV9CQVNFX1EpLAorICAgICAgICAgICBhdl90czJzdHIocGt0LT5wdHMpLCBhdl90czJ0aW1lc3RyKHBrdC0+cHRzLCAmc3QtPnRpbWVfYmFzZSksCisgICAgICAgICAgIGF2X3RzMnN0cihwa3QtPmR0cyksIGF2X3RzMnRpbWVzdHIocGt0LT5kdHMsICZzdC0+dGltZV9iYXNlKSk7CisKKyAgICAvKiBjb21wdXRlIG5ldyB0aW1lc3RhbXBzICovCisgICAgb2Zmc2V0ID0gYXZfcmVzY2FsZV9xKHNlZy0+aW5pdGlhbF9vZmZzZXQgLSAoc2VnLT5yZXNldF90aW1lc3RhbXBzID8gc2VnLT5jdXJfZW50cnkuc3RhcnRfcHRzIDogMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RLCBzdC0+dGltZV9iYXNlKTsKKyAgICBpZiAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHBrdC0+cHRzICs9IG9mZnNldDsKKyAgICBpZiAocGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHBrdC0+ZHRzICs9IG9mZnNldDsKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICIgLT4gcHRzOiVzIHB0c190aW1lOiVzIGR0czolcyBkdHNfdGltZTolc1xuIiwKKyAgICAgICAgICAgYXZfdHMyc3RyKHBrdC0+cHRzKSwgYXZfdHMydGltZXN0cihwa3QtPnB0cywgJnN0LT50aW1lX2Jhc2UpLAorICAgICAgICAgICBhdl90czJzdHIocGt0LT5kdHMpLCBhdl90czJ0aW1lc3RyKHBrdC0+ZHRzLCAmc3QtPnRpbWVfYmFzZSkpOworCisgICAgcmV0ID0gZmZfd3JpdGVfY2hhaW5lZChzZWctPmF2ZiwgcGt0LT5zdHJlYW1faW5kZXgsIHBrdCwgcywgc2VnLT5pbml0aWFsX29mZnNldCB8fCBzZWctPnJlc2V0X3RpbWVzdGFtcHMpOworCitmYWlsOgorICAgIGlmIChwa3QtPnN0cmVhbV9pbmRleCA9PSBzZWctPnJlZmVyZW5jZV9zdHJlYW1faW5kZXgpIHsKKyAgICAgICAgc2VnLT5mcmFtZV9jb3VudCsrOworICAgICAgICBzZWctPnNlZ21lbnRfZnJhbWVfY291bnQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNlZ193cml0ZV90cmFpbGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgU2VnbWVudENvbnRleHQgKnNlZyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkZvcm1hdENvbnRleHQgKm9jID0gc2VnLT5hdmY7CisgICAgU2VnbWVudExpc3RFbnRyeSAqY3VyLCAqbmV4dDsKKworICAgIGludCByZXQ7CisgICAgaWYgKCFzZWctPndyaXRlX2hlYWRlcl90cmFpbGVyKSB7CisgICAgICAgIGlmICgocmV0ID0gc2VnbWVudF9lbmQocywgMCwgMSkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgb3Blbl9udWxsX2N0eCgmb2MtPnBiKTsKKyAgICAgICAgcmV0ID0gYXZfd3JpdGVfdHJhaWxlcihvYyk7CisgICAgICAgIGNsb3NlX251bGxfY3R4KG9jLT5wYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gc2VnbWVudF9lbmQocywgMSwgMSk7CisgICAgfQorZmFpbDoKKyAgICBpZiAoc2VnLT5saXN0KQorICAgICAgICBhdmlvX2Nsb3NlKHNlZy0+bGlzdF9wYik7CisKKyAgICBhdl9kaWN0X2ZyZWUoJnNlZy0+Zm9ybWF0X29wdGlvbnMpOworICAgIGF2X29wdF9mcmVlKHNlZyk7CisgICAgYXZfZnJlZXAoJnNlZy0+dGltZXMpOworICAgIGF2X2ZyZWVwKCZzZWctPmZyYW1lcyk7CisKKyAgICBjdXIgPSBzZWctPnNlZ21lbnRfbGlzdF9lbnRyaWVzOworICAgIHdoaWxlIChjdXIpIHsKKyAgICAgICAgbmV4dCA9IGN1ci0+bmV4dDsKKyAgICAgICAgYXZfZnJlZShjdXItPmZpbGVuYW1lKTsKKyAgICAgICAgYXZfZnJlZShjdXIpOworICAgICAgICBjdXIgPSBuZXh0OworICAgIH0KKworICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChvYyk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU2VnbWVudENvbnRleHQsIHgpCisjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAicmVmZXJlbmNlX3N0cmVhbSIsICAic2V0IHJlZmVyZW5jZSBzdHJlYW0iLCBPRkZTRVQocmVmZXJlbmNlX3N0cmVhbV9zcGVjaWZpZXIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gImF1dG8ifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBFIH0sCisgICAgeyAic2VnbWVudF9mb3JtYXQiLCAgICAic2V0IGNvbnRhaW5lciBmb3JtYXQgdXNlZCBmb3IgdGhlIHNlZ21lbnRzIiwgT0ZGU0VUKGZvcm1hdCksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sICAwLCAwLCAgICAgICBFIH0sCisgICAgeyAic2VnbWVudF9mb3JtYXRfb3B0aW9ucyIsICJzZXQgbGlzdCBvZiBvcHRpb25zIGZvciB0aGUgY29udGFpbmVyIGZvcm1hdCB1c2VkIGZvciB0aGUgc2VnbWVudHMiLCBPRkZTRVQoZm9ybWF0X29wdGlvbnNfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBFIH0sCisgICAgeyAic2VnbWVudF9saXN0IiwgICAgICAic2V0IHRoZSBzZWdtZW50IGxpc3QgZmlsZW5hbWUiLCAgICAgICAgICAgICAgT0ZGU0VUKGxpc3QpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sICAwLCAwLCAgICAgICBFIH0sCisKKyAgICB7ICJzZWdtZW50X2xpc3RfZmxhZ3MiLCJzZXQgZmxhZ3MgYWZmZWN0aW5nIHNlZ21lbnQgbGlzdCBnZW5lcmF0aW9uIiwgT0ZGU0VUKGxpc3RfZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSBTRUdNRU5UX0xJU1RfRkxBR19DQUNIRSB9LCAwLCBVSU5UX01BWCwgRSwgImxpc3RfZmxhZ3MifSwKKyAgICB7ICJjYWNoZSIsICAgICAgICAgICAgICJhbGxvdyBsaXN0IGNhY2hpbmciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFNFR01FTlRfTElTVF9GTEFHX0NBQ0hFIH0sIElOVF9NSU4sIElOVF9NQVgsICAgRSwgImxpc3RfZmxhZ3MifSwKKyAgICB7ICJsaXZlIiwgICAgICAgICAgICAgICJlbmFibGUgbGl2ZS1mcmllbmRseSBsaXN0IGdlbmVyYXRpb24gKHVzZWZ1bCBmb3IgSExTKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFNFR01FTlRfTElTVF9GTEFHX0xJVkUgfSwgSU5UX01JTiwgSU5UX01BWCwgICAgRSwgImxpc3RfZmxhZ3MifSwKKworICAgIHsgInNlZ21lbnRfbGlzdF9zaXplIiwgInNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGxheWxpc3QgZW50cmllcyIsIE9GRlNFVChsaXN0X3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsICB7Lmk2NCA9IDB9LCAgICAgMCwgSU5UX01BWCwgRSB9LAorCisgICAgeyAic2VnbWVudF9saXN0X3R5cGUiLCAic2V0IHRoZSBzZWdtZW50IGxpc3QgdHlwZSIsICAgICAgICAgICAgICAgICAgT0ZGU0VUKGxpc3RfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgIHsuaTY0ID0gTElTVF9UWVBFX1VOREVGSU5FRH0sIC0xLCBMSVNUX1RZUEVfTkItMSwgRSwgImxpc3RfdHlwZSIgfSwKKyAgICB7ICJmbGF0IiwgImZsYXQgZm9ybWF0IiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1MSVNUX1RZUEVfRkxBVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBFLCAibGlzdF90eXBlIiB9LAorICAgIHsgImNzdiIsICAiY3N2IGZvcm1hdCIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUxJU1RfVFlQRV9DU1YgIH0sIElOVF9NSU4sIElOVF9NQVgsIEUsICJsaXN0X3R5cGUiIH0sCisgICAgeyAiZXh0IiwgICJleHRlbmRlZCBmb3JtYXQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TElTVF9UWVBFX0VYVCAgfSwgSU5UX01JTiwgSU5UX01BWCwgRSwgImxpc3RfdHlwZSIgfSwKKyAgICB7ICJmZmNvbmNhdCIsICJmZmNvbmNhdCBmb3JtYXQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TElTVF9UWVBFX0ZGQ09OQ0FUIH0sIElOVF9NSU4sIElOVF9NQVgsIEUsICJsaXN0X3R5cGUiIH0sCisgICAgeyAibTN1OCIsICJNM1U4IGZvcm1hdCIsICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TElTVF9UWVBFX00zVTggfSwgSU5UX01JTiwgSU5UX01BWCwgRSwgImxpc3RfdHlwZSIgfSwKKyAgICB7ICJobHMiLCAiQXBwbGUgSFRUUCBMaXZlIFN0cmVhbWluZyBjb21wYXRpYmxlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUxJU1RfVFlQRV9NM1U4IH0sIElOVF9NSU4sIElOVF9NQVgsIEUsICJsaXN0X3R5cGUiIH0sCisKKyAgICB7ICJzZWdtZW50X2F0Y2xvY2t0aW1lIiwgICAgICAic2V0IHNlZ21lbnQgdG8gYmUgY3V0IGF0IGNsb2NrdGltZSIsICBPRkZTRVQodXNlX2Nsb2NrdGltZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMSwgRX0sCisgICAgeyAic2VnbWVudF90aW1lIiwgICAgICAic2V0IHNlZ21lbnQgZHVyYXRpb24iLCAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHRpbWVfc3RyKSxBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sICAwLCAwLCAgICAgICBFIH0sCisgICAgeyAic2VnbWVudF90aW1lX2RlbHRhIiwic2V0IGFwcHJveGltYXRpb24gdmFsdWUgdXNlZCBmb3IgdGhlIHNlZ21lbnQgdGltZXMiLCBPRkZTRVQodGltZV9kZWx0YSksIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2NCA9IDB9LCAwLCAwLCBFIH0sCisgICAgeyAic2VnbWVudF90aW1lcyIsICAgICAic2V0IHNlZ21lbnQgc3BsaXQgdGltZSBwb2ludHMiLCAgICAgICAgICAgICAgT0ZGU0VUKHRpbWVzX3N0ciksQVZfT1BUX1RZUEVfU1RSSU5HLHsuc3RyID0gTlVMTH0sICAwLCAwLCAgICAgICBFIH0sCisgICAgeyAic2VnbWVudF9mcmFtZXMiLCAgICAic2V0IHNlZ21lbnQgc3BsaXQgZnJhbWUgbnVtYmVycyIsICAgICAgICAgICAgT0ZGU0VUKGZyYW1lc19zdHIpLEFWX09QVF9UWVBFX1NUUklORyx7LnN0ciA9IE5VTEx9LCAgMCwgMCwgICAgICAgRSB9LAorICAgIHsgInNlZ21lbnRfd3JhcCIsICAgICAgInNldCBudW1iZXIgYWZ0ZXIgd2hpY2ggdGhlIGluZGV4IHdyYXBzIiwgICAgIE9GRlNFVChzZWdtZW50X2lkeF93cmFwKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBFIH0sCisgICAgeyAic2VnbWVudF9saXN0X2VudHJ5X3ByZWZpeCIsICJzZXQgYmFzZSB1cmwgcHJlZml4IGZvciBzZWdtZW50cyIsIE9GRlNFVChlbnRyeV9wcmVmaXgpLCBBVl9PUFRfVFlQRV9TVFJJTkcsICB7LnN0ciA9IE5VTEx9LCAwLCAwLCBFIH0sCisgICAgeyAic2VnbWVudF9zdGFydF9udW1iZXIiLCAic2V0IHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGZpcnN0IHNlZ21lbnQiLCBPRkZTRVQoc2VnbWVudF9pZHgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIEUgfSwKKyAgICB7ICJzZWdtZW50X3dyYXBfbnVtYmVyIiwgInNldCB0aGUgbnVtYmVyIG9mIHdyYXAgYmVmb3JlIHRoZSBmaXJzdCBzZWdtZW50IiwgT0ZGU0VUKHNlZ21lbnRfaWR4X3dyYXBfbmIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIEUgfSwKKworICAgIHsgImluZGl2aWR1YWxfaGVhZGVyX3RyYWlsZXIiLCAid3JpdGUgaGVhZGVyL3RyYWlsZXIgdG8gZWFjaCBzZWdtZW50IiwgT0ZGU0VUKGluZGl2aWR1YWxfaGVhZGVyX3RyYWlsZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMX0sIDAsIDEsIEUgfSwKKyAgICB7ICJ3cml0ZV9oZWFkZXJfdHJhaWxlciIsICJ3cml0ZSBhIGhlYWRlciB0byB0aGUgZmlyc3Qgc2VnbWVudCBhbmQgYSB0cmFpbGVyIHRvIHRoZSBsYXN0IG9uZSIsIE9GRlNFVCh3cml0ZV9oZWFkZXJfdHJhaWxlciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgMCwgMSwgRSB9LAorICAgIHsgInJlc2V0X3RpbWVzdGFtcHMiLCAicmVzZXQgdGltZXN0YW1wcyBhdCB0aGUgYmVnaW4gb2YgZWFjaCBzZWdtZW50IiwgT0ZGU0VUKHJlc2V0X3RpbWVzdGFtcHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIEUgfSwKKyAgICB7ICJpbml0aWFsX29mZnNldCIsICJzZXQgaW5pdGlhbCB0aW1lc3RhbXAgb2Zmc2V0IiwgT0ZGU0VUKGluaXRpYWxfb2Zmc2V0KSwgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gMH0sIC1JTlQ2NF9NQVgsIElOVDY0X01BWCwgRSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgc2VnX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gInNlZ21lbnQgbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfc2VnbWVudF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic2VnbWVudCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInNlZ21lbnQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU2VnbWVudENvbnRleHQpLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRXxBVkZNVF9HTE9CQUxIRUFERVIsCisgICAgLndyaXRlX2hlYWRlciAgID0gc2VnX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBzZWdfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICA9IHNlZ193cml0ZV90cmFpbGVyLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZzZWdfY2xhc3MsCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBzc2VnX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gInN0cmVhbV9zZWdtZW50IG11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3N0cmVhbV9zZWdtZW50X211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzdHJlYW1fc2VnbWVudCxzc2VnbWVudCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInN0cmVhbWluZyBzZWdtZW50IG11eGVyIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNlZ21lbnRDb250ZXh0KSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLndyaXRlX2hlYWRlciAgID0gc2VnX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBzZWdfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICA9IHNlZ193cml0ZV90cmFpbGVyLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZzc2VnX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9zaWVycmF2bWQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zaWVycmF2bWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQ2ZjkxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NpZXJyYXZtZC5jCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogU2llcnJhIFZNRCBGb3JtYXQgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTaWVycmEgVk1EIGZpbGUgZGVtdXhlcgorICogYnkgVmxhZGltaXIgIlZBRyIgR25ldXNoZXYgKHZhZ3NvZnQgYXQgbWFpbC5ydSkKKyAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBTaWVycmEgVk1EIGZpbGUgZm9ybWF0LCB2aXNpdDoKKyAqICAgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorCisjZGVmaW5lIFZNRF9IRUFERVJfU0laRSAweDAzMzAKKyNkZWZpbmUgQllURVNfUEVSX0ZSQU1FX1JFQ09SRCAxNgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBzdHJlYW1faW5kZXg7CisgIGludDY0X3QgZnJhbWVfb2Zmc2V0OworICB1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZTsKKyAgaW50NjRfdCBwdHM7CisgIGludCBrZXlmcmFtZTsKKyAgdW5zaWduZWQgY2hhciBmcmFtZV9yZWNvcmRbQllURVNfUEVSX0ZSQU1FX1JFQ09SRF07Cit9IHZtZF9mcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgVm1kRGVtdXhDb250ZXh0IHsKKyAgICBpbnQgdmlkZW9fc3RyZWFtX2luZGV4OworICAgIGludCBhdWRpb19zdHJlYW1faW5kZXg7CisKKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVfY291bnQ7CisgICAgdW5zaWduZWQgaW50IGZyYW1lc19wZXJfYmxvY2s7CisgICAgdm1kX2ZyYW1lICpmcmFtZV90YWJsZTsKKyAgICB1bnNpZ25lZCBpbnQgY3VycmVudF9mcmFtZTsKKyAgICBpbnQgaXNfaW5kZW8zOworCisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGludDY0X3QgYXVkaW9fc2FtcGxlX2NvdW50ZXI7CisgICAgaW50IHNraXBoZHI7CisKKyAgICB1bnNpZ25lZCBjaGFyIHZtZF9oZWFkZXJbVk1EX0hFQURFUl9TSVpFXTsKK30gVm1kRGVtdXhDb250ZXh0OworCitzdGF0aWMgaW50IHZtZF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpbnQgdywgaCwgc2FtcGxlX3JhdGU7CisgICAgaWYgKHAtPmJ1Zl9zaXplIDwgODA2KQorICAgICAgICByZXR1cm4gMDsKKyAgICAvKiBjaGVjayBpZiB0aGUgZmlyc3QgMiBieXRlcyBvZiB0aGUgZmlsZSBjb250YWluIHRoZSBhcHByb3ByaWF0ZSBzaXplCisgICAgICogb2YgYSBWTUQgaGVhZGVyIGNodW5rICovCisgICAgaWYgKEFWX1JMMTYoJnAtPmJ1ZlswXSkgIT0gVk1EX0hFQURFUl9TSVpFIC0gMikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdyA9IEFWX1JMMTYoJnAtPmJ1ZlsxMl0pOworICAgIGggPSBBVl9STDE2KCZwLT5idWZbMTRdKTsKKyAgICBzYW1wbGVfcmF0ZSA9IEFWX1JMMTYoJnAtPmJ1Zls4MDRdKTsKKyAgICBpZiAoKCF3IHx8IHcgPiAyMDQ4IHx8ICFoIHx8IGggPiAyMDQ4KSAmJgorICAgICAgICBzYW1wbGVfcmF0ZSAhPSAyMjA1MCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBvbmx5IHJldHVybiBoYWxmIGNlcnRhaW50eSBzaW5jZSB0aGlzIGNoZWNrIGlzIGEgYml0IHNrZXRjaHkgKi8KKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047Cit9CisKK3N0YXRpYyBpbnQgdm1kX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBWbWREZW11eENvbnRleHQgKnZtZCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3QgPSBOVUxMLCAqdnN0ID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpbnQgdG9jX29mZnNldDsKKyAgICB1bnNpZ25lZCBjaGFyICpyYXdfZnJhbWVfdGFibGU7CisgICAgaW50IHJhd19mcmFtZV90YWJsZV9zaXplOworICAgIGludDY0X3QgY3VycmVudF9vZmZzZXQ7CisgICAgaW50IGksIGosIHJldDsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICB1bnNpZ25lZCBpbnQgdG90YWxfZnJhbWVzOworICAgIGludDY0X3QgY3VycmVudF9hdWRpb19wdHMgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgY2h1bmtbQllURVNfUEVSX0ZSQU1FX1JFQ09SRF07CisgICAgaW50IG51bSwgZGVuOworICAgIGludCBzb3VuZF9idWZmZXJzOworCisgICAgLyogZmV0Y2ggdGhlIG1haW4gaGVhZGVyLCBpbmNsdWRpbmcgdGhlIDIgaGVhZGVyIGxlbmd0aCBieXRlcyAqLworICAgIGF2aW9fc2VlayhwYiwgMCwgU0VFS19TRVQpOworICAgIGlmIChhdmlvX3JlYWQocGIsIHZtZC0+dm1kX2hlYWRlciwgVk1EX0hFQURFUl9TSVpFKSAhPSBWTURfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICB3aWR0aCA9IEFWX1JMMTYoJnZtZC0+dm1kX2hlYWRlclsxMl0pOworICAgIGhlaWdodCA9IEFWX1JMMTYoJnZtZC0+dm1kX2hlYWRlclsxNF0pOworICAgIGlmICh3aWR0aCAmJiBoZWlnaHQpIHsKKyAgICAgICAgaWYodm1kLT52bWRfaGVhZGVyWzI0XSA9PSAnaScgJiYgdm1kLT52bWRfaGVhZGVyWzI1XSA9PSAndicgJiYgdm1kLT52bWRfaGVhZGVyWzI2XSA9PSAnMycpIHsKKyAgICAgICAgICAgIHZtZC0+aXNfaW5kZW8zID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZtZC0+aXNfaW5kZW8zID0gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBzdGFydCB1cCB0aGUgZGVjb2RlcnMgKi8KKyAgICAgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCF2c3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgMzMsIDEsIDEwKTsKKyAgICAgICAgdm1kLT52aWRlb19zdHJlYW1faW5kZXggPSB2c3QtPmluZGV4OworICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IHZtZC0+aXNfaW5kZW8zID8gQVZfQ09ERUNfSURfSU5ERU8zIDogQVZfQ09ERUNfSURfVk1EVklERU87CisgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KKyAgICAgICAgdnN0LT5jb2RlYy0+d2lkdGggPSB3aWR0aDsKKyAgICAgICAgdnN0LT5jb2RlYy0+aGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBpZih2bWQtPmlzX2luZGVvMyAmJiB2c3QtPmNvZGVjLT53aWR0aCA+IDMyMCl7CisgICAgICAgICAgICB2c3QtPmNvZGVjLT53aWR0aCA+Pj0gMTsKKyAgICAgICAgICAgIHZzdC0+Y29kZWMtPmhlaWdodCA+Pj0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHZzdC0+Y29kZWMsIFZNRF9IRUFERVJfU0laRSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBtZW1jcHkodnN0LT5jb2RlYy0+ZXh0cmFkYXRhLCB2bWQtPnZtZF9oZWFkZXIsIFZNRF9IRUFERVJfU0laRSk7CisgICAgfQorCisgICAgLyogaWYgc2FtcGxlIHJhdGUgaXMgMCwgYXNzdW1lIG5vIGF1ZGlvICovCisgICAgdm1kLT5zYW1wbGVfcmF0ZSA9IEFWX1JMMTYoJnZtZC0+dm1kX2hlYWRlcls4MDRdKTsKKyAgICBpZiAodm1kLT5zYW1wbGVfcmF0ZSkgeworICAgICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB2bWQtPmF1ZGlvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfVk1EQVVESU87CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIGZvdXJjYyAqLworICAgICAgICBpZiAodm1kLT52bWRfaGVhZGVyWzgxMV0gJiAweDgwKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgIH0KKyAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHZtZC0+c2FtcGxlX3JhdGU7CisgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBBVl9STDE2KCZ2bWQtPnZtZF9oZWFkZXJbODA2XSk7CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmJsb2NrX2FsaWduICYgMHg4MDAwKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OworICAgICAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IC0oc3QtPmNvZGVjLT5ibG9ja19hbGlnbiAtIDB4MTAwMDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA4OworICAgICAgICB9CisgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICoKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogc3QtPmNvZGVjLT5jaGFubmVsczsKKworICAgICAgICAvKiBjYWxjdWxhdGUgcHRzICovCisgICAgICAgIG51bSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgICAgIGRlbiA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgICAgICBhdl9yZWR1Y2UoJm51bSwgJmRlbiwgbnVtLCBkZW4sICgxVUw8PDMxKS0xKTsKKyAgICAgICAgaWYgKHZzdCkKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCAzMywgbnVtLCBkZW4pOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMywgbnVtLCBkZW4pOworICAgIH0KKworICAgIHRvY19vZmZzZXQgPSBBVl9STDMyKCZ2bWQtPnZtZF9oZWFkZXJbODEyXSk7CisgICAgdm1kLT5mcmFtZV9jb3VudCA9IEFWX1JMMTYoJnZtZC0+dm1kX2hlYWRlcls2XSk7CisgICAgdm1kLT5mcmFtZXNfcGVyX2Jsb2NrID0gQVZfUkwxNigmdm1kLT52bWRfaGVhZGVyWzE4XSk7CisgICAgYXZpb19zZWVrKHBiLCB0b2Nfb2Zmc2V0LCBTRUVLX1NFVCk7CisKKyAgICByYXdfZnJhbWVfdGFibGUgPSBOVUxMOworICAgIHZtZC0+ZnJhbWVfdGFibGUgPSBOVUxMOworICAgIHNvdW5kX2J1ZmZlcnMgPSBBVl9STDE2KCZ2bWQtPnZtZF9oZWFkZXJbODA4XSk7CisgICAgcmF3X2ZyYW1lX3RhYmxlX3NpemUgPSB2bWQtPmZyYW1lX2NvdW50ICogNjsKKyAgICBpZih2bWQtPmZyYW1lX2NvdW50ICogdm1kLT5mcmFtZXNfcGVyX2Jsb2NrID49IFVJTlRfTUFYIC8gc2l6ZW9mKHZtZF9mcmFtZSkgLSBzb3VuZF9idWZmZXJzKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInZtZC0+ZnJhbWVfY291bnQgKiB2bWQtPmZyYW1lc19wZXJfYmxvY2sgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByYXdfZnJhbWVfdGFibGUgPSBhdl9tYWxsb2MocmF3X2ZyYW1lX3RhYmxlX3NpemUpOworICAgIHZtZC0+ZnJhbWVfdGFibGUgPSBhdl9tYWxsb2MoKHZtZC0+ZnJhbWVfY291bnQgKiB2bWQtPmZyYW1lc19wZXJfYmxvY2sgKyBzb3VuZF9idWZmZXJzKSAqIHNpemVvZih2bWRfZnJhbWUpKTsKKyAgICBpZiAoIXJhd19mcmFtZV90YWJsZSB8fCAhdm1kLT5mcmFtZV90YWJsZSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGlmIChhdmlvX3JlYWQocGIsIHJhd19mcmFtZV90YWJsZSwgcmF3X2ZyYW1lX3RhYmxlX3NpemUpICE9CisgICAgICAgIHJhd19mcmFtZV90YWJsZV9zaXplKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICB0b3RhbF9mcmFtZXMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCB2bWQtPmZyYW1lX2NvdW50OyBpKyspIHsKKworICAgICAgICBjdXJyZW50X29mZnNldCA9IEFWX1JMMzIoJnJhd19mcmFtZV90YWJsZVs2ICogaSArIDJdKTsKKworICAgICAgICAvKiBoYW5kbGUgZWFjaCBlbnRyeSBpbiBpbmRleCBibG9jayAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdm1kLT5mcmFtZXNfcGVyX2Jsb2NrOyBqKyspIHsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZTsKKworICAgICAgICAgICAgaWYgKChyZXQgPSBhdmlvX3JlYWQocGIsIGNodW5rLCBCWVRFU19QRVJfRlJBTUVfUkVDT1JEKSkgIT0gQllURVNfUEVSX0ZSQU1FX1JFQ09SRCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBmcmFtZSByZWNvcmRcbiIpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZSA9IGNodW5rWzBdOworICAgICAgICAgICAgc2l6ZSA9IEFWX1JMMzIoJmNodW5rWzJdKTsKKyAgICAgICAgICAgIGlmIChzaXplID4gSU5UX01BWCAvIDIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZSBzaXplXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighc2l6ZSAmJiB0eXBlICE9IDEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzd2l0Y2godHlwZSkgeworICAgICAgICAgICAgY2FzZSAxOiAvKiBBdWRpbyBDaHVuayAqLworICAgICAgICAgICAgICAgIGlmICghc3QpIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIGZpcnN0IGF1ZGlvIGNodW5rIGNvbnRhaW5zIHNldmVyYWwgYXVkaW8gYnVmZmVycyAqLworICAgICAgICAgICAgICAgIHZtZC0+ZnJhbWVfdGFibGVbdG90YWxfZnJhbWVzXS5mcmFtZV9vZmZzZXQgPSBjdXJyZW50X29mZnNldDsKKyAgICAgICAgICAgICAgICB2bWQtPmZyYW1lX3RhYmxlW3RvdGFsX2ZyYW1lc10uc3RyZWFtX2luZGV4ID0gdm1kLT5hdWRpb19zdHJlYW1faW5kZXg7CisgICAgICAgICAgICAgICAgdm1kLT5mcmFtZV90YWJsZVt0b3RhbF9mcmFtZXNdLmZyYW1lX3NpemUgPSBzaXplOworICAgICAgICAgICAgICAgIG1lbWNweSh2bWQtPmZyYW1lX3RhYmxlW3RvdGFsX2ZyYW1lc10uZnJhbWVfcmVjb3JkLCBjaHVuaywgQllURVNfUEVSX0ZSQU1FX1JFQ09SRCk7CisgICAgICAgICAgICAgICAgdm1kLT5mcmFtZV90YWJsZVt0b3RhbF9mcmFtZXNdLnB0cyA9IGN1cnJlbnRfYXVkaW9fcHRzOworICAgICAgICAgICAgICAgIHRvdGFsX2ZyYW1lcysrOworICAgICAgICAgICAgICAgIGlmKCFjdXJyZW50X2F1ZGlvX3B0cykKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF9hdWRpb19wdHMgKz0gc291bmRfYnVmZmVycyAtIDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2F1ZGlvX3B0cysrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAvKiBWaWRlbyBDaHVuayAqLworICAgICAgICAgICAgICAgIHZtZC0+ZnJhbWVfdGFibGVbdG90YWxfZnJhbWVzXS5mcmFtZV9vZmZzZXQgPSBjdXJyZW50X29mZnNldDsKKyAgICAgICAgICAgICAgICB2bWQtPmZyYW1lX3RhYmxlW3RvdGFsX2ZyYW1lc10uc3RyZWFtX2luZGV4ID0gdm1kLT52aWRlb19zdHJlYW1faW5kZXg7CisgICAgICAgICAgICAgICAgdm1kLT5mcmFtZV90YWJsZVt0b3RhbF9mcmFtZXNdLmZyYW1lX3NpemUgPSBzaXplOworICAgICAgICAgICAgICAgIG1lbWNweSh2bWQtPmZyYW1lX3RhYmxlW3RvdGFsX2ZyYW1lc10uZnJhbWVfcmVjb3JkLCBjaHVuaywgQllURVNfUEVSX0ZSQU1FX1JFQ09SRCk7CisgICAgICAgICAgICAgICAgdm1kLT5mcmFtZV90YWJsZVt0b3RhbF9mcmFtZXNdLnB0cyA9IGk7CisgICAgICAgICAgICAgICAgdG90YWxfZnJhbWVzKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50X29mZnNldCArPSBzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJlZShyYXdfZnJhbWVfdGFibGUpOworCisgICAgdm1kLT5jdXJyZW50X2ZyYW1lID0gMDsKKyAgICB2bWQtPmZyYW1lX2NvdW50ID0gdG90YWxfZnJhbWVzOworCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIGF2X2ZyZWVwKCZyYXdfZnJhbWVfdGFibGUpOworICAgIGF2X2ZyZWVwKCZ2bWQtPmZyYW1lX3RhYmxlKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZtZF9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIFZtZERlbXV4Q29udGV4dCAqdm1kID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCByZXQgPSAwOworICAgIHZtZF9mcmFtZSAqZnJhbWU7CisKKyAgICBpZiAodm1kLT5jdXJyZW50X2ZyYW1lID49IHZtZC0+ZnJhbWVfY291bnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGZyYW1lID0gJnZtZC0+ZnJhbWVfdGFibGVbdm1kLT5jdXJyZW50X2ZyYW1lXTsKKyAgICAvKiBwb3NpdGlvbiB0aGUgc3RyZWFtICh3aWxsIHByb2JhYmx5IGJlIHRoZXJlIGFscmVhZHkpICovCisgICAgYXZpb19zZWVrKHBiLCBmcmFtZS0+ZnJhbWVfb2Zmc2V0LCBTRUVLX1NFVCk7CisKKyAgICBpZihmZmlvX2xpbWl0KHBiLCBmcmFtZS0+ZnJhbWVfc2l6ZSkgIT0gZnJhbWUtPmZyYW1lX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBmcmFtZS0+ZnJhbWVfc2l6ZSArIEJZVEVTX1BFUl9GUkFNRV9SRUNPUkQpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHBrdC0+cG9zPSBhdmlvX3RlbGwocGIpOworICAgIG1lbWNweShwa3QtPmRhdGEsIGZyYW1lLT5mcmFtZV9yZWNvcmQsIEJZVEVTX1BFUl9GUkFNRV9SRUNPUkQpOworICAgIGlmKHZtZC0+aXNfaW5kZW8zICYmIGZyYW1lLT5mcmFtZV9yZWNvcmRbMF0gPT0gMHgwMikKKyAgICAgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBwa3QtPmRhdGEsIGZyYW1lLT5mcmFtZV9zaXplKTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IGF2aW9fcmVhZChwYiwgcGt0LT5kYXRhICsgQllURVNfUEVSX0ZSQU1FX1JFQ09SRCwKKyAgICAgICAgICAgIGZyYW1lLT5mcmFtZV9zaXplKTsKKworICAgIGlmIChyZXQgIT0gZnJhbWUtPmZyYW1lX3NpemUpIHsKKyAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGZyYW1lLT5zdHJlYW1faW5kZXg7CisgICAgcGt0LT5wdHMgPSBmcmFtZS0+cHRzOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICIgZGlzcGF0Y2hpbmcgJXMgZnJhbWUgd2l0aCAlZCBieXRlcyBhbmQgcHRzICUiUFJJZDY0IlxuIiwKKyAgICAgICAgICAgIChmcmFtZS0+ZnJhbWVfcmVjb3JkWzBdID09IDB4MDIpID8gInZpZGVvIiA6ICJhdWRpbyIsCisgICAgICAgICAgICBmcmFtZS0+ZnJhbWVfc2l6ZSArIEJZVEVTX1BFUl9GUkFNRV9SRUNPUkQsCisgICAgICAgICAgICBwa3QtPnB0cyk7CisKKyAgICB2bWQtPmN1cnJlbnRfZnJhbWUrKzsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm1kX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFZtZERlbXV4Q29udGV4dCAqdm1kID0gcy0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJnZtZC0+ZnJhbWVfdGFibGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfdm1kX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZtZCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNpZXJyYSBWTUQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVm1kRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB2bWRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gdm1kX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHZtZF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSB2bWRfcmVhZF9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc2lmZi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGE2YzJmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NpZmYuYwpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIEJlYW0gU29mdHdhcmUgU0lGRiBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisKK2VudW0gU0lGRlRhZ3N7CisgICAgVEFHX1NJRkYgPSBNS1RBRygnUycsICdJJywgJ0YnLCAnRicpLAorICAgIFRBR19CT0RZID0gTUtUQUcoJ0InLCAnTycsICdEJywgJ1knKSwKKyAgICBUQUdfVkJIRCA9IE1LVEFHKCdWJywgJ0InLCAnSCcsICdEJyksCisgICAgVEFHX1NIRFIgPSBNS1RBRygnUycsICdIJywgJ0QnLCAnUicpLAorICAgIFRBR19WQlYxID0gTUtUQUcoJ1YnLCAnQicsICdWJywgJzEnKSwKKyAgICBUQUdfU09VTiA9IE1LVEFHKCdTJywgJ08nLCAnVScsICdOJyksCit9OworCitlbnVtIFZCRmxhZ3N7CisgICAgVkJfSEFTX0dNQyAgICAgPSAweDAxLAorICAgIFZCX0hBU19BVURJTyAgID0gMHgwNCwKKyAgICBWQl9IQVNfVklERU8gICA9IDB4MDgsCisgICAgVkJfSEFTX1BBTEVUVEUgPSAweDEwLAorICAgIFZCX0hBU19MRU5HVEggID0gMHgyMAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgU0lGRkNvbnRleHR7CisgICAgaW50IGZyYW1lczsKKyAgICBpbnQgY3VyX2ZyYW1lOworICAgIGludCByYXRlOworICAgIGludCBiaXRzOworICAgIGludCBibG9ja19hbGlnbjsKKworICAgIGludCBoYXNfdmlkZW87CisgICAgaW50IGhhc19hdWRpbzsKKworICAgIGludCBjdXJzdHJtOworICAgIGludCBwa3RzaXplOworICAgIGludCBnbWNzaXplOworICAgIGludCBzbmRzaXplOworCisgICAgaW50IGZsYWdzOworICAgIHVpbnQ4X3QgZ21jWzRdOworfVNJRkZDb250ZXh0OworCitzdGF0aWMgaW50IHNpZmZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgdWludDMyX3QgdGFnID0gQVZfUkwzMihwLT5idWYgKyA4KTsKKyAgICAvKiBjaGVjayBmaWxlIGhlYWRlciAqLworICAgIGlmIChBVl9STDMyKHAtPmJ1ZikgIT0gVEFHX1NJRkYgfHwKKyAgICAgICAgKHRhZyAhPSBUQUdfVkJWMSAmJiB0YWcgIT0gVEFHX1NPVU4pKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2F1ZGlvX3N0cmVhbShBVkZvcm1hdENvbnRleHQgKnMsIFNJRkZDb250ZXh0ICpjKQoreworICAgIEFWU3RyZWFtICphc3Q7CisgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIWFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICA9IDE7CisgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgYXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKKyAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgPSBjLT5yYXRlOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCAxNiwgMSwgYy0+cmF0ZSk7CisgICAgYXN0LT5zdGFydF90aW1lID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaWZmX3BhcnNlX3ZidjEoQVZGb3JtYXRDb250ZXh0ICpzLCBTSUZGQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKworICAgIGlmIChhdmlvX3JsMzIocGIpICE9IFRBR19WQkhEKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkhlYWRlciBjaHVuayBpcyBtaXNzaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmKGF2aW9fcmIzMihwYikgIT0gMzIpeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSGVhZGVyIGNodW5rIHNpemUgaXMgaW5jb3JyZWN0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmKGF2aW9fcmwxNihwYikgIT0gMSl7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgaGVhZGVyIHZlcnNpb25cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgd2lkdGggPSBhdmlvX3JsMTYocGIpOworICAgIGhlaWdodCA9IGF2aW9fcmwxNihwYik7CisgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICBjLT5mcmFtZXMgPSBhdmlvX3JsMTYocGIpOworICAgIGlmKCFjLT5mcmFtZXMpeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmlsZSBjb250YWlucyBubyBmcmFtZXMgPz8/XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGMtPmJpdHMgPSBhdmlvX3JsMTYocGIpOworICAgIGMtPnJhdGUgPSBhdmlvX3JsMTYocGIpOworICAgIGMtPmJsb2NrX2FsaWduID0gYy0+cmF0ZSAqIChjLT5iaXRzID4+IDMpOworCisgICAgYXZpb19za2lwKHBiLCAxNik7IC8vemVyb2VzCisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVkI7CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgID0gTUtUQUcoJ1YnLCAnQicsICdWJywgJzEnKTsKKyAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSB3aWR0aDsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBoZWlnaHQ7CisgICAgc3QtPmNvZGVjLT5waXhfZm10ICAgID0gQVZfUElYX0ZNVF9QQUw4OworICAgIHN0LT5uYl9mcmFtZXMgICAgICAgICA9CisgICAgc3QtPmR1cmF0aW9uICAgICAgICAgID0gYy0+ZnJhbWVzOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDE2LCAxLCAxMik7CisKKyAgICBjLT5jdXJfZnJhbWUgPSAwOworICAgIGMtPmhhc192aWRlbyA9IDE7CisgICAgYy0+aGFzX2F1ZGlvID0gISFjLT5yYXRlOworICAgIGMtPmN1cnN0cm0gPSAtMTsKKyAgICBpZiAoYy0+aGFzX2F1ZGlvICYmIGNyZWF0ZV9hdWRpb19zdHJlYW0ocywgYykgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpZmZfcGFyc2Vfc291bihBVkZvcm1hdENvbnRleHQgKnMsIFNJRkZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIpCit7CisgICAgaWYgKGF2aW9fcmwzMihwYikgIT0gVEFHX1NIRFIpeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSGVhZGVyIGNodW5rIGlzIG1pc3NpbmdcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYoYXZpb19yYjMyKHBiKSAhPSA4KXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkhlYWRlciBjaHVuayBzaXplIGlzIGluY29ycmVjdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhdmlvX3NraXAocGIsIDQpOyAvL3Vua25vd24gdmFsdWUKKyAgICBjLT5yYXRlID0gYXZpb19ybDE2KHBiKTsKKyAgICBjLT5iaXRzID0gYXZpb19ybDE2KHBiKTsKKyAgICBjLT5ibG9ja19hbGlnbiA9IGMtPnJhdGUgKiAoYy0+Yml0cyA+PiAzKTsKKyAgICByZXR1cm4gY3JlYXRlX2F1ZGlvX3N0cmVhbShzLCBjKTsKK30KKworc3RhdGljIGludCBzaWZmX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBTSUZGQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdmlvX3JsMzIocGIpICE9IFRBR19TSUZGKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBhdmlvX3NraXAocGIsIDQpOyAvL2lnbm9yZSBzaXplCisgICAgdGFnID0gYXZpb19ybDMyKHBiKTsKKworICAgIGlmICh0YWcgIT0gVEFHX1ZCVjEgJiYgdGFnICE9IFRBR19TT1VOKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vdCBhIFZCViBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHRhZyA9PSBUQUdfVkJWMSAmJiAocmV0ID0gc2lmZl9wYXJzZV92YnYxKHMsIGMsIHBiKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICh0YWcgPT0gVEFHX1NPVU4gJiYgKHJldCA9IHNpZmZfcGFyc2Vfc291bihzLCBjLCBwYikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoYXZpb19ybDMyKHBiKSAhPSBNS1RBRygnQicsICdPJywgJ0QnLCAnWScpKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIidCT0RZJyBjaHVuayBpcyBtaXNzaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2aW9fc2tpcChwYiwgNCk7IC8vaWdub3JlIHNpemUKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpZmZfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFNJRkZDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCBzaXplOworCisgICAgaWYgKGMtPmhhc192aWRlbyl7CisgICAgICAgIGlmIChjLT5jdXJfZnJhbWUgPj0gYy0+ZnJhbWVzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICBpZiAoYy0+Y3Vyc3RybSA9PSAtMSl7CisgICAgICAgICAgICBjLT5wa3RzaXplID0gYXZpb19ybDMyKHMtPnBiKSAtIDQ7CisgICAgICAgICAgICBjLT5mbGFncyA9IGF2aW9fcmwxNihzLT5wYik7CisgICAgICAgICAgICBjLT5nbWNzaXplID0gKGMtPmZsYWdzICYgVkJfSEFTX0dNQykgPyA0IDogMDsKKyAgICAgICAgICAgIGlmIChjLT5nbWNzaXplKQorICAgICAgICAgICAgICAgIGF2aW9fcmVhZChzLT5wYiwgYy0+Z21jLCBjLT5nbWNzaXplKTsKKyAgICAgICAgICAgIGMtPnNuZHNpemUgPSAoYy0+ZmxhZ3MgJiBWQl9IQVNfQVVESU8pID8gYXZpb19ybDMyKHMtPnBiKTogMDsKKyAgICAgICAgICAgIGMtPmN1cnN0cm0gPSAhIShjLT5mbGFncyAmIFZCX0hBU19BVURJTyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWMtPmN1cnN0cm0peworICAgICAgICAgICAgc2l6ZSA9IGMtPnBrdHNpemUgLSBjLT5zbmRzaXplIC0gYy0+Z21jc2l6ZSAtIDI7CisgICAgICAgICAgICBzaXplID0gZmZpb19saW1pdChzLT5wYiwgc2l6ZSk7CisgICAgICAgICAgICBpZihzaXplIDwgMCB8fCBjLT5wa3RzaXplIDwgYy0+c25kc2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSArIGMtPmdtY3NpemUgKyAyKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIEFWX1dMMTYocGt0LT5kYXRhLCBjLT5mbGFncyk7CisgICAgICAgICAgICBpZiAoYy0+Z21jc2l6ZSkKKyAgICAgICAgICAgICAgICBtZW1jcHkocGt0LT5kYXRhICsgMiwgYy0+Z21jLCBjLT5nbWNzaXplKTsKKyAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocy0+cGIsIHBrdC0+ZGF0YSArIDIgKyBjLT5nbWNzaXplLCBzaXplKSAhPSBzaXplKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICAgICAgICAgIGMtPmN1cnN0cm0gPSAtMTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpZiAoKHNpemUgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIGMtPnNuZHNpemUgLSA0KSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDE7CisgICAgICAgICAgICBwa3QtPmR1cmF0aW9uICAgICA9IHNpemU7CisgICAgICAgICAgICBjLT5jdXJzdHJtID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZighYy0+Y3VyX2ZyYW1lIHx8IGMtPmN1cnN0cm0pCisgICAgICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgaWYgKGMtPmN1cnN0cm0gPT0gLTEpCisgICAgICAgICAgICBjLT5jdXJfZnJhbWUrKzsKKyAgICB9ZWxzZXsKKyAgICAgICAgc2l6ZSA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgYy0+YmxvY2tfYWxpZ24pOworICAgICAgICBpZighc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICAgICAgaWYoc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICBwa3QtPmR1cmF0aW9uID0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHBrdC0+c2l6ZTsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zaWZmX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInNpZmYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCZWFtIFNvZnR3YXJlIFNJRkYiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU0lGRkNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHNpZmZfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gc2lmZl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBzaWZmX3JlYWRfcGFja2V0LAorICAgIC5leHRlbnNpb25zICAgICA9ICJ2Yixzb24iLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9zbWFja2VyLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc21hY2tlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NGNkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc21hY2tlci5jCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogU21hY2tlciBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogQmFzZWQgb24gaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9U21hY2tlcgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBTTUFDS0VSX1BBTCAweDAxCisjZGVmaW5lIFNNQUNLRVJfRkxBR19SSU5HX0ZSQU1FIDB4MDEKKworZW51bSBTQXVkRmxhZ3MgeworICAgIFNNS19BVURfUEFDS0VEICA9IDB4ODAsCisgICAgU01LX0FVRF8xNkJJVFMgID0gMHgyMCwKKyAgICBTTUtfQVVEX1NURVJFTyAgPSAweDEwLAorICAgIFNNS19BVURfQklOS0FVRCA9IDB4MDgsCisgICAgU01LX0FVRF9VU0VEQ1QgID0gMHgwNAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgU21hY2tlckNvbnRleHQgeworICAgIC8qIFNtYWNrZXIgZmlsZSBoZWFkZXIgKi8KKyAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIHVpbnQzMl90IGZyYW1lczsKKyAgICBpbnQgICAgICBwdHNfaW5jOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIHVpbnQzMl90IGF1ZGlvWzddOworICAgIHVpbnQzMl90IHRyZWVzaXplOworICAgIHVpbnQzMl90IG1tYXBfc2l6ZSwgbWNscl9zaXplLCBmdWxsX3NpemUsIHR5cGVfc2l6ZTsKKyAgICB1aW50OF90ICBhZmxhZ3NbN107CisgICAgdWludDMyX3QgcmF0ZXNbN107CisgICAgdWludDMyX3QgcGFkOworICAgIC8qIGZyYW1lIGluZm8gKi8KKyAgICB1aW50MzJfdCAqZnJtX3NpemU7CisgICAgdWludDhfdCAgKmZybV9mbGFnczsKKyAgICAvKiBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KKyAgICBpbnQgY3VyX2ZyYW1lOworICAgIGludCBpc192ZXI0OworICAgIGludDY0X3QgY3VyX3B0czsKKyAgICAvKiBjdXJyZW50IGZyYW1lIGZvciBkZW11eGluZyAqLworICAgIHVpbnQ4X3QgcGFsWzc2OF07CisgICAgaW50IGluZGV4ZXNbN107CisgICAgaW50IHZpZGVvaW5kZXg7CisgICAgdWludDhfdCAqYnVmc1s3XTsKKyAgICBpbnQgYnVmX3NpemVzWzddOworICAgIGludCBzdHJlYW1faWRbN107CisgICAgaW50IGN1cnN0cmVhbTsKKyAgICBpbnQ2NF90IG5leHRwb3M7CisgICAgaW50NjRfdCBhdWRfcHRzWzddOworfSBTbWFja2VyQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgU21hY2tlckZyYW1lIHsKKyAgICBpbnQ2NF90IHB0czsKKyAgICBpbnQgc3RyZWFtOworfSBTbWFja2VyRnJhbWU7CisKKy8qIHBhbGV0dGUgdXNlZCBpbiBTbWFja2VyICovCitzdGF0aWMgY29uc3QgdWludDhfdCBzbWtfcGFsWzY0XSA9IHsKKyAgICAweDAwLCAweDA0LCAweDA4LCAweDBDLCAweDEwLCAweDE0LCAweDE4LCAweDFDLAorICAgIDB4MjAsIDB4MjQsIDB4MjgsIDB4MkMsIDB4MzAsIDB4MzQsIDB4MzgsIDB4M0MsCisgICAgMHg0MSwgMHg0NSwgMHg0OSwgMHg0RCwgMHg1MSwgMHg1NSwgMHg1OSwgMHg1RCwKKyAgICAweDYxLCAweDY1LCAweDY5LCAweDZELCAweDcxLCAweDc1LCAweDc5LCAweDdELAorICAgIDB4ODIsIDB4ODYsIDB4OEEsIDB4OEUsIDB4OTIsIDB4OTYsIDB4OUEsIDB4OUUsCisgICAgMHhBMiwgMHhBNiwgMHhBQSwgMHhBRSwgMHhCMiwgMHhCNiwgMHhCQSwgMHhCRSwKKyAgICAweEMzLCAweEM3LCAweENCLCAweENGLCAweEQzLCAweEQ3LCAweERCLCAweERGLAorICAgIDB4RTMsIDB4RTcsIDB4RUIsIDB4RUYsIDB4RjMsIDB4RjcsIDB4RkIsIDB4RkYKK307CisKKworc3RhdGljIGludCBzbWFja2VyX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmICggICBBVl9STDMyKHAtPmJ1ZikgIT0gTUtUQUcoJ1MnLCAnTScsICdLJywgJzInKQorICAgICAgICAmJiBBVl9STDMyKHAtPmJ1ZikgIT0gTUtUQUcoJ1MnLCAnTScsICdLJywgJzQnKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoQVZfUkwzMihwLT5idWYrNCkgPiAzMjc2OFUgfHwgQVZfUkwzMihwLT5idWYrOCkgPiAzMjc2OFUpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWC80OworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCitzdGF0aWMgaW50IHNtYWNrZXJfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFNtYWNrZXJDb250ZXh0ICpzbWsgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0LCAqYXN0WzddOworICAgIGludCBpLCByZXQ7CisgICAgaW50IHRiYXNlOworCisgICAgLyogcmVhZCBhbmQgY2hlY2sgaGVhZGVyICovCisgICAgc21rLT5tYWdpYyA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKHNtay0+bWFnaWMgIT0gTUtUQUcoJ1MnLCAnTScsICdLJywgJzInKSAmJiBzbWstPm1hZ2ljICE9IE1LVEFHKCdTJywgJ00nLCAnSycsICc0JykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHNtay0+d2lkdGggPSBhdmlvX3JsMzIocGIpOworICAgIHNtay0+aGVpZ2h0ID0gYXZpb19ybDMyKHBiKTsKKyAgICBzbWstPmZyYW1lcyA9IGF2aW9fcmwzMihwYik7CisgICAgc21rLT5wdHNfaW5jID0gKGludDMyX3QpYXZpb19ybDMyKHBiKTsKKyAgICBzbWstPmZsYWdzID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZihzbWstPmZsYWdzICYgU01BQ0tFUl9GTEFHX1JJTkdfRlJBTUUpCisgICAgICAgIHNtay0+ZnJhbWVzKys7CisgICAgZm9yKGkgPSAwOyBpIDwgNzsgaSsrKQorICAgICAgICBzbWstPmF1ZGlvW2ldID0gYXZpb19ybDMyKHBiKTsKKyAgICBzbWstPnRyZWVzaXplID0gYXZpb19ybDMyKHBiKTsKKworICAgIGlmKHNtay0+dHJlZXNpemUgPj0gVUlOVF9NQVgvNCl7IC8vIHNtay0+dHJlZXNpemUgKyAxNiBtdXN0IG5vdCBvdmVyZmxvdyAodGhpcyBjaGVjayBpcyBwcm9iYWJseSByZWR1bmRhbnQpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0cmVlc2l6ZSB0b28gbGFyZ2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKy8vRklYTUUgcmVtb3ZlIGV4dHJhZGF0YSAicmVidWlsZGluZyIKKyAgICBzbWstPm1tYXBfc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgc21rLT5tY2xyX3NpemUgPSBhdmlvX3JsMzIocGIpOworICAgIHNtay0+ZnVsbF9zaXplID0gYXZpb19ybDMyKHBiKTsKKyAgICBzbWstPnR5cGVfc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgZm9yKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgICAgICAgIHNtay0+cmF0ZXNbaV0gID0gYXZpb19ybDI0KHBiKTsKKyAgICAgICAgc21rLT5hZmxhZ3NbaV0gPSBhdmlvX3I4KHBiKTsKKyAgICB9CisgICAgc21rLT5wYWQgPSBhdmlvX3JsMzIocGIpOworICAgIC8qIHNldHVwIGRhdGEgKi8KKyAgICBpZihzbWstPmZyYW1lcyA+IDB4RkZGRkZGKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBmcmFtZXM6ICUiUFJJdTMyIlxuIiwgc21rLT5mcmFtZXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgc21rLT5mcm1fc2l6ZSA9IGF2X21hbGxvY19hcnJheShzbWstPmZyYW1lcywgc2l6ZW9mKCpzbWstPmZybV9zaXplKSk7CisgICAgc21rLT5mcm1fZmxhZ3MgPSBhdl9tYWxsb2Moc21rLT5mcmFtZXMpOworICAgIGlmICghc21rLT5mcm1fc2l6ZSB8fCAhc21rLT5mcm1fZmxhZ3MpIHsKKyAgICAgICAgYXZfZnJlZXAoJnNtay0+ZnJtX3NpemUpOworICAgICAgICBhdl9mcmVlcCgmc21rLT5mcm1fZmxhZ3MpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHNtay0+aXNfdmVyNCA9IChzbWstPm1hZ2ljICE9IE1LVEFHKCdTJywgJ00nLCAnSycsICcyJykpOworCisgICAgLyogcmVhZCBmcmFtZSBpbmZvICovCisgICAgZm9yKGkgPSAwOyBpIDwgc21rLT5mcmFtZXM7IGkrKykgeworICAgICAgICBzbWstPmZybV9zaXplW2ldID0gYXZpb19ybDMyKHBiKTsKKyAgICB9CisgICAgZm9yKGkgPSAwOyBpIDwgc21rLT5mcmFtZXM7IGkrKykgeworICAgICAgICBzbWstPmZybV9mbGFnc1tpXSA9IGF2aW9fcjgocGIpOworICAgIH0KKworICAgIC8qIGluaXQgdmlkZW8gY29kZWMgKi8KKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzbWstPnZpZGVvaW5kZXggPSBzdC0+aW5kZXg7CisgICAgc3QtPmNvZGVjLT53aWR0aCA9IHNtay0+d2lkdGg7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBzbWstPmhlaWdodDsKKyAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TTUFDS1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gc21rLT5tYWdpYzsKKyAgICAvKiBTbWFja2VyIHVzZXMgMTAwMDAwIGFzIGludGVybmFsIHRpbWViYXNlICovCisgICAgaWYoc21rLT5wdHNfaW5jIDwgMCkKKyAgICAgICAgc21rLT5wdHNfaW5jID0gLXNtay0+cHRzX2luYzsKKyAgICBlbHNlCisgICAgICAgIHNtay0+cHRzX2luYyAqPSAxMDA7CisgICAgdGJhc2UgPSAxMDAwMDA7CisgICAgYXZfcmVkdWNlKCZ0YmFzZSwgJnNtay0+cHRzX2luYywgdGJhc2UsIHNtay0+cHRzX2luYywgKDFVTDw8MzEpLTEpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCBzbWstPnB0c19pbmMsIHRiYXNlKTsKKyAgICBzdC0+ZHVyYXRpb24gPSBzbWstPmZyYW1lczsKKyAgICAvKiBoYW5kbGUgcG9zc2libGUgYXVkaW8gc3RyZWFtcyAqLworICAgIGZvcihpID0gMDsgaSA8IDc7IGkrKykgeworICAgICAgICBzbWstPmluZGV4ZXNbaV0gPSAtMTsKKyAgICAgICAgaWYgKHNtay0+cmF0ZXNbaV0pIHsKKyAgICAgICAgICAgIGFzdFtpXSA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgICAgICBpZiAoIWFzdFtpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgc21rLT5pbmRleGVzW2ldID0gYXN0W2ldLT5pbmRleDsKKyAgICAgICAgICAgIGFzdFtpXS0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBpZiAoc21rLT5hZmxhZ3NbaV0gJiBTTUtfQVVEX0JJTktBVUQpIHsKKyAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0JJTktBVURJT19SREZUOworICAgICAgICAgICAgfSBlbHNlIGlmIChzbWstPmFmbGFnc1tpXSAmIFNNS19BVURfVVNFRENUKSB7CisgICAgICAgICAgICAgICAgYXN0W2ldLT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9CSU5LQVVESU9fRENUOworICAgICAgICAgICAgfSBlbHNlIGlmIChzbWstPmFmbGFnc1tpXSAmIFNNS19BVURfUEFDS0VEKXsKKyAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1NNQUNLQVVESU87CisgICAgICAgICAgICAgICAgYXN0W2ldLT5jb2RlYy0+Y29kZWNfdGFnID0gTUtUQUcoJ1MnLCAnTScsICdLJywgJ0EnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXN0W2ldLT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc21rLT5hZmxhZ3NbaV0gJiBTTUtfQVVEX1NURVJFTykgeworICAgICAgICAgICAgICAgIGFzdFtpXS0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzdFtpXS0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXN0W2ldLT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzbWstPnJhdGVzW2ldOworICAgICAgICAgICAgYXN0W2ldLT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gKHNtay0+YWZsYWdzW2ldICYgU01LX0FVRF8xNkJJVFMpID8gMTYgOiA4OworICAgICAgICAgICAgaWYoYXN0W2ldLT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDE2ICYmIGFzdFtpXS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9VOCkKKyAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0W2ldLCA2NCwgMSwgYXN0W2ldLT5jb2RlYy0+c2FtcGxlX3JhdGUKKyAgICAgICAgICAgICAgICAgICAgKiBhc3RbaV0tPmNvZGVjLT5jaGFubmVscyAqIGFzdFtpXS0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAvIDgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBsb2FkIHRyZWVzIHRvIGV4dHJhZGF0YSwgdGhleSB3aWxsIGJlIHVucGFja2VkIGJ5IGRlY29kZXIgKi8KKyAgICBpZihmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBzbWstPnRyZWVzaXplICsgMTYpKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDYW5ub3QgYWxsb2NhdGUgJSJQUkl1MzIiIGJ5dGVzIG9mIGV4dHJhZGF0YVxuIiwKKyAgICAgICAgICAgICAgIHNtay0+dHJlZXNpemUgKyAxNik7CisgICAgICAgIGF2X2ZyZWVwKCZzbWstPmZybV9zaXplKTsKKyAgICAgICAgYXZfZnJlZXAoJnNtay0+ZnJtX2ZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDE2LCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplIC0gMTYpOworICAgIGlmKHJldCAhPSBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplIC0gMTYpeworICAgICAgICBhdl9mcmVlcCgmc21rLT5mcm1fc2l6ZSk7CisgICAgICAgIGF2X2ZyZWVwKCZzbWstPmZybV9mbGFncyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgICgoaW50MzJfdCopc3QtPmNvZGVjLT5leHRyYWRhdGEpWzBdID0gYXZfbGUybmUzMihzbWstPm1tYXBfc2l6ZSk7CisgICAgKChpbnQzMl90KilzdC0+Y29kZWMtPmV4dHJhZGF0YSlbMV0gPSBhdl9sZTJuZTMyKHNtay0+bWNscl9zaXplKTsKKyAgICAoKGludDMyX3QqKXN0LT5jb2RlYy0+ZXh0cmFkYXRhKVsyXSA9IGF2X2xlMm5lMzIoc21rLT5mdWxsX3NpemUpOworICAgICgoaW50MzJfdCopc3QtPmNvZGVjLT5leHRyYWRhdGEpWzNdID0gYXZfbGUybmUzMihzbWstPnR5cGVfc2l6ZSk7CisKKyAgICBzbWstPmN1cnN0cmVhbSA9IC0xOworICAgIHNtay0+bmV4dHBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNtYWNrZXJfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFNtYWNrZXJDb250ZXh0ICpzbWsgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGZsYWdzOworICAgIGludCByZXQ7CisgICAgaW50IGk7CisgICAgaW50IGZyYW1lX3NpemUgPSAwOworICAgIGludCBwYWxjaGFuZ2UgPSAwOworCisgICAgaWYgKGF2aW9fZmVvZihzLT5wYikgfHwgc21rLT5jdXJfZnJhbWUgPj0gc21rLT5mcmFtZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIC8qIGlmIHdlIGRlbXV4ZWQgYWxsIHN0cmVhbXMsIHBhc3MgYW5vdGhlciBmcmFtZSAqLworICAgIGlmKHNtay0+Y3Vyc3RyZWFtIDwgMCkgeworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIHNtay0+bmV4dHBvcywgMCk7CisgICAgICAgIGZyYW1lX3NpemUgPSBzbWstPmZybV9zaXplW3Ntay0+Y3VyX2ZyYW1lXSAmICh+Myk7CisgICAgICAgIGZsYWdzID0gc21rLT5mcm1fZmxhZ3Nbc21rLT5jdXJfZnJhbWVdOworICAgICAgICAvKiBoYW5kbGUgcGFsZXR0ZSBjaGFuZ2UgZXZlbnQgKi8KKyAgICAgICAgaWYoZmxhZ3MgJiBTTUFDS0VSX1BBTCl7CisgICAgICAgICAgICBpbnQgc2l6ZSwgc3osIHQsIG9mZiwgaiwgcG9zOworICAgICAgICAgICAgdWludDhfdCAqcGFsID0gc21rLT5wYWw7CisgICAgICAgICAgICB1aW50OF90IG9sZHBhbFs3NjhdOworCisgICAgICAgICAgICBtZW1jcHkob2xkcGFsLCBwYWwsIDc2OCk7CisgICAgICAgICAgICBzaXplID0gYXZpb19yOChzLT5wYik7CisgICAgICAgICAgICBzaXplID0gc2l6ZSAqIDQgLSAxOworICAgICAgICAgICAgaWYoc2l6ZSArIDEgPiBmcmFtZV9zaXplKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZnJhbWVfc2l6ZSAtPSBzaXplOworICAgICAgICAgICAgZnJhbWVfc2l6ZS0tOworICAgICAgICAgICAgc3ogPSAwOworICAgICAgICAgICAgcG9zID0gYXZpb190ZWxsKHMtPnBiKSArIHNpemU7CisgICAgICAgICAgICB3aGlsZShzeiA8IDI1Nil7CisgICAgICAgICAgICAgICAgdCA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICAgICAgICAgIGlmKHQgJiAweDgwKXsgLyogc2tpcCBwYWxldHRlIGVudHJpZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgc3ogKz0gKHQgJiAweDdGKSArIDE7CisgICAgICAgICAgICAgICAgICAgIHBhbCArPSAoKHQgJiAweDdGKSArIDEpICogMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYodCAmIDB4NDApeyAvKiBjb3B5IHdpdGggb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgIG9mZiA9IGF2aW9fcjgocy0+cGIpOworICAgICAgICAgICAgICAgICAgICBqID0gKHQgJiAweDNGKSArIDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmYgKyBqID4gMHgxMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcGFsZXR0ZSB1cGRhdGUsIG9mZnNldD0lZCBsZW5ndGg9JWQgZXh0ZW5kcyBiZXlvbmQgcGFsZXR0ZSBzaXplXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiwgaik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvZmYgKj0gMzsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoai0tICYmIHN6IDwgMjU2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcGFsKysgPSBvbGRwYWxbb2ZmICsgMF07CisgICAgICAgICAgICAgICAgICAgICAgICAqcGFsKysgPSBvbGRwYWxbb2ZmICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAqcGFsKysgPSBvbGRwYWxbb2ZmICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICBzeisrOworICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBuZXcgZW50cmllcyAqLworICAgICAgICAgICAgICAgICAgICAqcGFsKysgPSBzbWtfcGFsW3RdOworICAgICAgICAgICAgICAgICAgICAqcGFsKysgPSBzbWtfcGFsW2F2aW9fcjgocy0+cGIpICYgMHgzRl07CisgICAgICAgICAgICAgICAgICAgICpwYWwrKyA9IHNta19wYWxbYXZpb19yOChzLT5wYikgJiAweDNGXTsKKyAgICAgICAgICAgICAgICAgICAgc3orKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmlvX3NlZWsocy0+cGIsIHBvcywgMCk7CisgICAgICAgICAgICBwYWxjaGFuZ2UgfD0gMTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA+Pj0gMTsKKyAgICAgICAgc21rLT5jdXJzdHJlYW0gPSAtMTsKKyAgICAgICAgLyogaWYgYXVkaW8gY2h1bmtzIGFyZSBwcmVzZW50LCBwdXQgdGhlbSB0byBzdGFjayBhbmQgcmV0cmlldmUgbGF0ZXIgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgICAgICAgICAgICBpZihmbGFncyAmIDEpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplOworICAgICAgICAgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgICAgICAgICBzaXplID0gYXZpb19ybDMyKHMtPnBiKSAtIDQ7CisgICAgICAgICAgICAgICAgaWYgKCFzaXplIHx8IHNpemUgKyA0TCA+IGZyYW1lX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYXVkaW8gcGFydCBzaXplXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYW1lX3NpemUgLT0gc2l6ZTsKKyAgICAgICAgICAgICAgICBmcmFtZV9zaXplIC09IDQ7CisgICAgICAgICAgICAgICAgc21rLT5jdXJzdHJlYW0rKzsKKyAgICAgICAgICAgICAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZzbWstPmJ1ZnNbc21rLT5jdXJzdHJlYW1dLCBzaXplKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNtay0+YnVmX3NpemVzW3Ntay0+Y3Vyc3RyZWFtXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNtay0+YnVmX3NpemVzW3Ntay0+Y3Vyc3RyZWFtXSA9IHNpemU7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZpb19yZWFkKHMtPnBiLCBzbWstPmJ1ZnNbc21rLT5jdXJzdHJlYW1dLCBzaXplKTsKKyAgICAgICAgICAgICAgICBpZihyZXQgIT0gc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICBzbWstPnN0cmVhbV9pZFtzbWstPmN1cnN0cmVhbV0gPSBzbWstPmluZGV4ZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbGFncyA+Pj0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJhbWVfc2l6ZSA8IDAgfHwgZnJhbWVfc2l6ZSA+PSBJTlRfTUFYLzIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBmcmFtZV9zaXplICsgNzY5KSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGlmKHNtay0+ZnJtX3NpemVbc21rLT5jdXJfZnJhbWVdICYgMSkKKyAgICAgICAgICAgIHBhbGNoYW5nZSB8PSAyOworICAgICAgICBwa3QtPmRhdGFbMF0gPSBwYWxjaGFuZ2U7CisgICAgICAgIG1lbWNweShwa3QtPmRhdGEgKyAxLCBzbWstPnBhbCwgNzY4KTsKKyAgICAgICAgcmV0ID0gYXZpb19yZWFkKHMtPnBiLCBwa3QtPmRhdGEgKyA3NjksIGZyYW1lX3NpemUpOworICAgICAgICBpZihyZXQgIT0gZnJhbWVfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc21rLT52aWRlb2luZGV4OworICAgICAgICBwa3QtPnB0cyAgICAgICAgICA9IHNtay0+Y3VyX2ZyYW1lOworICAgICAgICBwa3QtPnNpemUgPSByZXQgKyA3Njk7CisgICAgICAgIHNtay0+Y3VyX2ZyYW1lKys7CisgICAgICAgIHNtay0+bmV4dHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNtay0+c3RyZWFtX2lkW3Ntay0+Y3Vyc3RyZWFtXSA8IDAgfHwgIXNtay0+YnVmc1tzbWstPmN1cnN0cmVhbV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBzbWstPmJ1Zl9zaXplc1tzbWstPmN1cnN0cmVhbV0pKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgc21rLT5idWZzW3Ntay0+Y3Vyc3RyZWFtXSwgc21rLT5idWZfc2l6ZXNbc21rLT5jdXJzdHJlYW1dKTsKKyAgICAgICAgcGt0LT5zaXplID0gc21rLT5idWZfc2l6ZXNbc21rLT5jdXJzdHJlYW1dOworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHNtay0+c3RyZWFtX2lkW3Ntay0+Y3Vyc3RyZWFtXTsKKyAgICAgICAgcGt0LT5wdHMgPSBzbWstPmF1ZF9wdHNbc21rLT5jdXJzdHJlYW1dOworICAgICAgICBzbWstPmF1ZF9wdHNbc21rLT5jdXJzdHJlYW1dICs9IEFWX1JMMzIocGt0LT5kYXRhKTsKKyAgICAgICAgc21rLT5jdXJzdHJlYW0tLTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbWFja2VyX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNtYWNrZXJDb250ZXh0ICpzbWsgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCA3OyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZzbWstPmJ1ZnNbaV0pOworICAgIGF2X2ZyZWVwKCZzbWstPmZybV9zaXplKTsKKyAgICBhdl9mcmVlcCgmc21rLT5mcm1fZmxhZ3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfc21hY2tlcl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzbWsiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTbWFja2VyIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNtYWNrZXJDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBzbWFja2VyX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHNtYWNrZXJfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gc21hY2tlcl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBzbWFja2VyX3JlYWRfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NtanBlZy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NtanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZGY1ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc21qcGVnLmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIFNNSlBFRyBjb21tb24gY29kZQorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNNSlBFRyBjb21tb24gY29kZQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic21qcGVnLmgiCisKK2NvbnN0IEFWQ29kZWNUYWcgZmZfY29kZWNfc21qcGVnX3ZpZGVvX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX01KUEVHLCAgICAgICAgICAgICBNS1RBRygnSicsICdGJywgJ0knLCAnRicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAwIH0sCit9OworCitjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX3NtanBlZ19hdWRpb190YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfU01KUEVHLCAgTUtUQUcoJ0EnLCAnUCcsICdDJywgJ00nKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1MxNkxFLCAgICAgICAgIE1LVEFHKCdOJywgJ08nLCAnTicsICdFJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX05PTkUsIDAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc21qcGVnLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvc21qcGVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1ZGRmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zbWpwZWcuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogU01KUEVHIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU01KUEVHIGNvbW1vbiBjb2RlCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9TTUpQRUdfSAorI2RlZmluZSBBVkZPUk1BVF9TTUpQRUdfSAorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBTTUpQRUdfTUFHSUMgIlx4MFx4YVNNSlBFRyIKKworI2RlZmluZSBTTUpQRUdfRE9ORSAgICAgTUtUQUcoJ0QnLCAnTycsICdOJywgJ0UnKQorI2RlZmluZSBTTUpQRUdfSEVORCAgICAgTUtUQUcoJ0gnLCAnRScsICdOJywgJ0QnKQorI2RlZmluZSBTTUpQRUdfU05EICAgICAgTUtUQUcoJ18nLCAnUycsICdOJywgJ0QnKQorI2RlZmluZSBTTUpQRUdfU05ERCAgICAgTUtUQUcoJ3MnLCAnbicsICdkJywgJ0QnKQorI2RlZmluZSBTTUpQRUdfVFhUICAgICAgTUtUQUcoJ18nLCAnVCcsICdYJywgJ1QnKQorI2RlZmluZSBTTUpQRUdfVklEICAgICAgTUtUQUcoJ18nLCAnVicsICdJJywgJ0QnKQorI2RlZmluZSBTTUpQRUdfVklERCAgICAgTUtUQUcoJ3YnLCAnaScsICdkJywgJ0QnKQorCitleHRlcm4gY29uc3QgQVZDb2RlY1RhZyBmZl9jb2RlY19zbWpwZWdfdmlkZW9fdGFnc1tdOworZXh0ZXJuIGNvbnN0IEFWQ29kZWNUYWcgZmZfY29kZWNfc21qcGVnX2F1ZGlvX3RhZ3NbXTsKKworI2VuZGlmIC8qIEFWRk9STUFUX1NNSlBFR19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc21qcGVnZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc21qcGVnZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljYTJmZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zbWpwZWdkZWMuYwpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIFNNSlBFRyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFRoaXMgaXMgYSBkZW11eGVyIGZvciBMb2tpIFNETCBNb3Rpb24gSlBFRyBmaWxlcworICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInJpZmYuaCIKKyNpbmNsdWRlICJzbWpwZWcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgU01KUEVHQ29udGV4dCB7CisgICAgaW50IGF1ZGlvX3N0cmVhbV9pbmRleDsKKyAgICBpbnQgdmlkZW9fc3RyZWFtX2luZGV4OworfSBTTUpQRUdDb250ZXh0OworCitzdGF0aWMgaW50IHNtanBlZ19wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoIW1lbWNtcChwLT5idWYsIFNNSlBFR19NQUdJQywgOCkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbWpwZWdfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNNSlBFR0NvbnRleHQgKnNjID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICphc3QgPSBOVUxMLCAqdnN0ID0gTlVMTDsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1aW50MzJfdCB2ZXJzaW9uLCBodHlwZSwgaGxlbmd0aCwgZHVyYXRpb247CisgICAgY2hhciAqY29tbWVudDsKKworICAgIGF2aW9fc2tpcChwYiwgOCk7IC8vIG1hZ2ljCisgICAgdmVyc2lvbiA9IGF2aW9fcmIzMihwYik7CisgICAgaWYgKHZlcnNpb24pCisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiVW5rbm93biB2ZXJzaW9uICUiUFJJdTMyLCB2ZXJzaW9uKTsKKworICAgIGR1cmF0aW9uID0gYXZpb19yYjMyKHBiKTsgLy8gaW4gbXNlYworCisgICAgd2hpbGUgKCFhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgIGh0eXBlID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgc3dpdGNoIChodHlwZSkgeworICAgICAgICBjYXNlIFNNSlBFR19UWFQ6CisgICAgICAgICAgICBobGVuZ3RoID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGlmICghaGxlbmd0aCB8fCBobGVuZ3RoID4gNTEyKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgY29tbWVudCA9IGF2X21hbGxvYyhobGVuZ3RoICsgMSk7CisgICAgICAgICAgICBpZiAoIWNvbW1lbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIGNvbW1lbnQsIGhsZW5ndGgpICE9IGhsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmY29tbWVudCk7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImVycm9yIHdoZW4gcmVhZGluZyBjb21tZW50XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbW1lbnRbaGxlbmd0aF0gPSAwOworICAgICAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCAiY29tbWVudCIsIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTTUpQRUdfU05EOgorICAgICAgICAgICAgaWYgKGFzdCkgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiTXVsdGlwbGUgYXVkaW8gc3RyZWFtcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhsZW5ndGggPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgaWYgKGhsZW5ndGggPCA4KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKKyAgICAgICAgICAgIGlmICghYXN0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX3RhZyAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX3NtanBlZ19hdWRpb190YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgICAgIGFzdC0+ZHVyYXRpb24gICAgICAgICAgID0gZHVyYXRpb247CisgICAgICAgICAgICBzYy0+YXVkaW9fc3RyZWFtX2luZGV4ICA9IGFzdC0+aW5kZXg7CisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgMzIsIDEsIDEwMDApOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBobGVuZ3RoIC0gOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTTUpQRUdfVklEOgorICAgICAgICAgICAgaWYgKHZzdCkgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiTXVsdGlwbGUgdmlkZW8gc3RyZWFtcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGxlbmd0aCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBpZiAoaGxlbmd0aCA8IDEyKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKKyAgICAgICAgICAgIGlmICghdnN0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB2c3QtPm5iX2ZyYW1lcyAgICAgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICB2c3QtPmNvZGVjLT53aWR0aCAgICAgID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIHZzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX3NtanBlZ192aWRlb190YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcpOworICAgICAgICAgICAgdnN0LT5kdXJhdGlvbiAgICAgICAgICA9IGR1cmF0aW9uOworICAgICAgICAgICAgc2MtPnZpZGVvX3N0cmVhbV9pbmRleCA9IHZzdC0+aW5kZXg7CisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgMzIsIDEsIDEwMDApOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBobGVuZ3RoIC0gMTIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU01KUEVHX0hFTkQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIGhlYWRlciAlIlBSSXgzMiJcbiIsIGh0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1JfRU9GOworfQorCitzdGF0aWMgaW50IHNtanBlZ19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgU01KUEVHQ29udGV4dCAqc2MgPSBzLT5wcml2X2RhdGE7CisgICAgdWludDMyX3QgZHR5cGUsIHNpemUsIHRpbWVzdGFtcDsKKyAgICBpbnQ2NF90IHBvczsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGF2aW9fZmVvZihzLT5wYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICBwb3MgICA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgZHR5cGUgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIHN3aXRjaCAoZHR5cGUpIHsKKyAgICBjYXNlIFNNSlBFR19TTkREOgorICAgICAgICB0aW1lc3RhbXAgPSBhdmlvX3JiMzIocy0+cGIpOworICAgICAgICBzaXplID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzaXplKTsKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzYy0+YXVkaW9fc3RyZWFtX2luZGV4OworICAgICAgICBwa3QtPnB0cyA9IHRpbWVzdGFtcDsKKyAgICAgICAgcGt0LT5wb3MgPSBwb3M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU01KUEVHX1ZJREQ6CisgICAgICAgIHRpbWVzdGFtcCA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgICAgIHNpemUgPSBhdmlvX3JiMzIocy0+cGIpOworICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHNjLT52aWRlb19zdHJlYW1faW5kZXg7CisgICAgICAgIHBrdC0+cHRzID0gdGltZXN0YW1wOworICAgICAgICBwa3QtPnBvcyA9IHBvczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTTUpQRUdfRE9ORToKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FT0Y7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIGNodW5rICUiUFJJeDMyIlxuIiwgZHR5cGUpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zbWpwZWdfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic21qcGVnIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTG9raSBTREwgTUpQRUciKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU01KUEVHQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gc21qcGVnX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHNtanBlZ19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBzbWpwZWdfcmVhZF9wYWNrZXQsCisgICAgLmV4dGVuc2lvbnMgICAgID0gIm1qcGciLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NtanBlZ2VuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NtanBlZ2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMGE0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc21qcGVnZW5jLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBTTUpQRUcgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVGhpcyBpcyBhIG11eGVyIGZvciBMb2tpIFNETCBNb3Rpb24gSlBFRyBmaWxlcworICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic21qcGVnLmgiCisKK3R5cGVkZWYgc3RydWN0IFNNSlBFR011eENvbnRleHQgeworICAgIHVpbnQzMl90IGR1cmF0aW9uOworfSBTTUpQRUdNdXhDb250ZXh0OworCitzdGF0aWMgaW50IHNtanBlZ193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgbiwgdGFnOworCisgICAgaWYgKHMtPm5iX3N0cmVhbXMgPiAyKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJtb3JlIHRoYW4gPjIgc3RyZWFtcyBhcmUgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGF2aW9fd3JpdGUocGIsIFNNSlBFR19NQUdJQywgOCk7CisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBhdmlvX3diMzIocGIsIDApOworCisgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICBhdmlvX3dsMzIocGIsIFNNSlBFR19UWFQpOworICAgICAgICBhdmlvX3diMzIocGIsIHN0cmxlbih0LT5rZXkpICsgc3RybGVuKHQtPnZhbHVlKSArIDMpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCB0LT5rZXksIHN0cmxlbih0LT5rZXkpKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgIiA9ICIsIDMpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCB0LT52YWx1ZSwgc3RybGVuKHQtPnZhbHVlKSk7CisgICAgfQorCisgICAgZm9yIChuID0gMDsgbiA8IHMtPm5iX3N0cmVhbXM7IG4rKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW25dOworICAgICAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzdC0+Y29kZWM7CisgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfc21qcGVnX2F1ZGlvX3RhZ3MsIGNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgICAgICBpZiAoIXRhZykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBhdWRpbyBjb2RlY1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgU01KUEVHX1NORCk7CisgICAgICAgICAgICBhdmlvX3diMzIocGIsIDgpOworICAgICAgICAgICAgYXZpb193YjE2KHBiLCBjb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgYXZpb193OChwYiwgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCBjb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgYXZpb193bDMyKHBiLCB0YWcpOworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIDEwMDApOworICAgICAgICB9IGVsc2UgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19zbWpwZWdfdmlkZW9fdGFncywgY29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIGlmICghdGFnKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIHZpZGVvIGNvZGVjXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb193bDMyKHBiLCBTTUpQRUdfVklEKTsKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgMTIpOworICAgICAgICAgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgY29kZWMtPndpZHRoKTsKKyAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgY29kZWMtPmhlaWdodCk7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHRhZyk7CisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgMTAwMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdmlvX3dsMzIocGIsIFNNSlBFR19IRU5EKTsKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtanBlZ193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFNNSlBFR011eENvbnRleHQgKnNtYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzdC0+Y29kZWM7CisKKyAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICBhdmlvX3dsMzIocGIsIFNNSlBFR19TTkREKTsKKyAgICBlbHNlIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIGF2aW9fd2wzMihwYiwgU01KUEVHX1ZJREQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBhdmlvX3diMzIocGIsIHBrdC0+cHRzKTsKKyAgICBhdmlvX3diMzIocGIsIHBrdC0+c2l6ZSk7CisgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworCisgICAgc21jLT5kdXJhdGlvbiA9IEZGTUFYKHNtYy0+ZHVyYXRpb24sIHBrdC0+cHRzICsgcGt0LT5kdXJhdGlvbik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21qcGVnX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNNSlBFR011eENvbnRleHQgKnNtYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQ2NF90IGN1cnJlbnRwb3M7CisKKyAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIGN1cnJlbnRwb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBhdmlvX3NlZWsocGIsIDEyLCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc21jLT5kdXJhdGlvbik7CisgICAgICAgIGF2aW9fc2VlayhwYiwgY3VycmVudHBvcywgU0VFS19TRVQpOworICAgIH0KKworICAgIGF2aW9fd2wzMihwYiwgU01KUEVHX0RPTkUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3NtanBlZ19tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic21qcGVnIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTG9raSBTREwgTUpQRUciKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU01KUEVHTXV4Q29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFLAorICAgIC52aWRlb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX01KUEVHLAorICAgIC53cml0ZV9oZWFkZXIgICA9IHNtanBlZ193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gc21qcGVnX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgPSBzbWpwZWdfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9UU19OT05TVFJJQ1QsCisgICAgLmNvZGVjX3RhZyAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcgKmNvbnN0IFtdKXsgZmZfY29kZWNfc21qcGVnX3ZpZGVvX3RhZ3MsIGZmX2NvZGVjX3NtanBlZ19hdWRpb190YWdzLCAwIH0sCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3Ntb290aHN0cmVhbWluZ2VuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Ntb290aHN0cmVhbWluZ2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Y2RmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc21vb3Roc3RyZWFtaW5nZW5jLmMKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgKiBMaXZlIHNtb290aCBzdHJlYW1pbmcgZnJhZ21lbnRlcgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9zX3N1cHBvcnQuaCIKKyNpbmNsdWRlICJhdmMuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKyNpbmNsdWRlICJpc29tLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpbGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyIGZpbGVbMTAyNF07CisgICAgY2hhciBpbmZvZmlsZVsxMDI0XTsKKyAgICBpbnQ2NF90IHN0YXJ0X3RpbWUsIGR1cmF0aW9uOworICAgIGludCBuOworICAgIGludDY0X3Qgc3RhcnRfcG9zLCBzaXplOworfSBGcmFnbWVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWRm9ybWF0Q29udGV4dCAqY3R4OworICAgIGludCBjdHhfaW5pdGVkOworICAgIGNoYXIgZGlybmFtZVsxMDI0XTsKKyAgICB1aW50OF90IGlvYnVmWzMyNzY4XTsKKyAgICBVUkxDb250ZXh0ICpvdXQ7ICAvLyBDdXJyZW50IG91dHB1dCBzdHJlYW0gd2hlcmUgYWxsIG91dHB1dCBpcyB3cml0dGVuCisgICAgVVJMQ29udGV4dCAqb3V0MjsgLy8gQXV4aWxpYXJ5IG91dHB1dCBzdHJlYW0gd2hlcmUgYWxsIG91dHB1dCBpcyBhbHNvIHdyaXR0ZW4KKyAgICBVUkxDb250ZXh0ICp0YWlsX291dDsgLy8gVGhlIGFjdHVhbCBtYWluIG91dHB1dCBzdHJlYW0sIGlmIHdlJ3JlIGN1cnJlbnRseSBzZWVrZWQgYmFjayB0byB3cml0ZSBlbHNld2hlcmUKKyAgICBpbnQ2NF90IHRhaWxfcG9zLCBjdXJfcG9zLCBjdXJfc3RhcnRfcG9zOworICAgIGludCBwYWNrZXRzX3dyaXR0ZW47CisgICAgY29uc3QgY2hhciAqc3RyZWFtX3R5cGVfdGFnOworICAgIGludCBuYl9mcmFnbWVudHMsIGZyYWdtZW50c19zaXplLCBmcmFnbWVudF9pbmRleDsKKyAgICBGcmFnbWVudCAqKmZyYWdtZW50czsKKworICAgIGNvbnN0IGNoYXIgKmZvdXJjYzsKKyAgICBjaGFyICpwcml2YXRlX3N0cjsKKyAgICBpbnQgcGFja2V0X3NpemU7CisgICAgaW50IGF1ZGlvX3RhZzsKK30gT3V0cHV0U3RyZWFtOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7ICAvKiBDbGFzcyBmb3IgcHJpdmF0ZSBvcHRpb25zLiAqLworICAgIGludCB3aW5kb3dfc2l6ZTsKKyAgICBpbnQgZXh0cmFfd2luZG93X3NpemU7CisgICAgaW50IGxvb2thaGVhZF9jb3VudDsKKyAgICBpbnQgbWluX2ZyYWdfZHVyYXRpb247CisgICAgaW50IHJlbW92ZV9hdF9leGl0OworICAgIE91dHB1dFN0cmVhbSAqc3RyZWFtczsKKyAgICBpbnQgaGFzX3ZpZGVvLCBoYXNfYXVkaW87CisgICAgaW50IG5iX2ZyYWdtZW50czsKK30gU21vb3RoU3RyZWFtaW5nQ29udGV4dDsKKworc3RhdGljIGludCBpc21fd3JpdGUodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBPdXRwdXRTdHJlYW0gKm9zID0gb3BhcXVlOworICAgIGlmIChvcy0+b3V0KQorICAgICAgICBmZnVybF93cml0ZShvcy0+b3V0LCBidWYsIGJ1Zl9zaXplKTsKKyAgICBpZiAob3MtPm91dDIpCisgICAgICAgIGZmdXJsX3dyaXRlKG9zLT5vdXQyLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBvcy0+Y3VyX3BvcyArPSBidWZfc2l6ZTsKKyAgICBpZiAob3MtPmN1cl9wb3MgPj0gb3MtPnRhaWxfcG9zKQorICAgICAgICBvcy0+dGFpbF9wb3MgPSBvcy0+Y3VyX3BvczsKKyAgICByZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGlzbV9zZWVrKHZvaWQgKm9wYXF1ZSwgaW50NjRfdCBvZmZzZXQsIGludCB3aGVuY2UpCit7CisgICAgT3V0cHV0U3RyZWFtICpvcyA9IG9wYXF1ZTsKKyAgICBpbnQgaTsKKyAgICBpZiAod2hlbmNlICE9IFNFRUtfU0VUKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIGlmIChvcy0+dGFpbF9vdXQpIHsKKyAgICAgICAgaWYgKG9zLT5vdXQpIHsKKyAgICAgICAgICAgIGZmdXJsX2Nsb3NlKG9zLT5vdXQpOworICAgICAgICB9CisgICAgICAgIGlmIChvcy0+b3V0MikgeworICAgICAgICAgICAgZmZ1cmxfY2xvc2Uob3MtPm91dDIpOworICAgICAgICB9CisgICAgICAgIG9zLT5vdXQgPSBvcy0+dGFpbF9vdXQ7CisgICAgICAgIG9zLT5vdXQyID0gTlVMTDsKKyAgICAgICAgb3MtPnRhaWxfb3V0ID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG9mZnNldCA+PSBvcy0+Y3VyX3N0YXJ0X3BvcykgeworICAgICAgICBpZiAob3MtPm91dCkKKyAgICAgICAgICAgIGZmdXJsX3NlZWsob3MtPm91dCwgb2Zmc2V0IC0gb3MtPmN1cl9zdGFydF9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgb3MtPmN1cl9wb3MgPSBvZmZzZXQ7CisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorICAgIGZvciAoaSA9IG9zLT5uYl9mcmFnbWVudHMgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBGcmFnbWVudCAqZnJhZyA9IG9zLT5mcmFnbWVudHNbaV07CisgICAgICAgIGlmIChvZmZzZXQgPj0gZnJhZy0+c3RhcnRfcG9zICYmIG9mZnNldCA8IGZyYWctPnN0YXJ0X3BvcyArIGZyYWctPnNpemUpIHsKKyAgICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOworICAgICAgICAgICAgb3MtPnRhaWxfb3V0ID0gb3MtPm91dDsKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAidHJ1bmNhdGUiLCAiMCIsIDApOworICAgICAgICAgICAgcmV0ID0gZmZ1cmxfb3Blbigmb3MtPm91dCwgZnJhZy0+ZmlsZSwgQVZJT19GTEFHX1JFQURfV1JJVEUsICZvcy0+Y3R4LT5pbnRlcnJ1cHRfY2FsbGJhY2ssICZvcHRzKTsKKyAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIG9zLT5vdXQgPSBvcy0+dGFpbF9vdXQ7CisgICAgICAgICAgICAgICAgb3MtPnRhaWxfb3V0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMsICJ0cnVuY2F0ZSIsICIwIiwgMCk7CisgICAgICAgICAgICBmZnVybF9vcGVuKCZvcy0+b3V0MiwgZnJhZy0+aW5mb2ZpbGUsIEFWSU9fRkxBR19SRUFEX1dSSVRFLCAmb3MtPmN0eC0+aW50ZXJydXB0X2NhbGxiYWNrLCAmb3B0cyk7CisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgICAgICAgICAgZmZ1cmxfc2Vlayhvcy0+b3V0LCBvZmZzZXQgLSBmcmFnLT5zdGFydF9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGlmIChvcy0+b3V0MikKKyAgICAgICAgICAgICAgICBmZnVybF9zZWVrKG9zLT5vdXQyLCBvZmZzZXQgLSBmcmFnLT5zdGFydF9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIG9zLT5jdXJfcG9zID0gb2Zmc2V0OworICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQVZFUlJPUihFSU8pOworfQorCitzdGF0aWMgdm9pZCBnZXRfcHJpdmF0ZV9kYXRhKE91dHB1dFN0cmVhbSAqb3MpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gb3MtPmN0eC0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgdWludDhfdCAqcHRyID0gY29kZWMtPmV4dHJhZGF0YTsKKyAgICBpbnQgc2l6ZSA9IGNvZGVjLT5leHRyYWRhdGFfc2l6ZTsKKyAgICBpbnQgaTsKKyAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgZmZfYXZjX3dyaXRlX2FubmV4Yl9leHRyYWRhdGEocHRyLCAmcHRyLCAmc2l6ZSk7CisgICAgICAgIGlmICghcHRyKQorICAgICAgICAgICAgcHRyID0gY29kZWMtPmV4dHJhZGF0YTsKKyAgICB9CisgICAgaWYgKCFwdHIpCisgICAgICAgIHJldHVybjsKKyAgICBvcy0+cHJpdmF0ZV9zdHIgPSBhdl9tYWxsb2N6KDIqc2l6ZSArIDEpOworICAgIGlmICghb3MtPnByaXZhdGVfc3RyKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgc25wcmludGYoJm9zLT5wcml2YXRlX3N0clsyKmldLCAzLCAiJTAyeCIsIHB0cltpXSk7CitmYWlsOgorICAgIGlmIChwdHIgIT0gY29kZWMtPmV4dHJhZGF0YSkKKyAgICAgICAgYXZfZnJlZShwdHIpOworfQorCitzdGF0aWMgdm9pZCBpc21fZnJlZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgU21vb3RoU3RyZWFtaW5nQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgajsKKyAgICBpZiAoIWMtPnN0cmVhbXMpCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIE91dHB1dFN0cmVhbSAqb3MgPSAmYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgZmZ1cmxfY2xvc2Uob3MtPm91dCk7CisgICAgICAgIGZmdXJsX2Nsb3NlKG9zLT5vdXQyKTsKKyAgICAgICAgZmZ1cmxfY2xvc2Uob3MtPnRhaWxfb3V0KTsKKyAgICAgICAgb3MtPm91dCA9IG9zLT5vdXQyID0gb3MtPnRhaWxfb3V0ID0gTlVMTDsKKyAgICAgICAgaWYgKG9zLT5jdHggJiYgb3MtPmN0eF9pbml0ZWQpCisgICAgICAgICAgICBhdl93cml0ZV90cmFpbGVyKG9zLT5jdHgpOworICAgICAgICBpZiAob3MtPmN0eCAmJiBvcy0+Y3R4LT5wYikKKyAgICAgICAgICAgIGF2X2ZyZWUob3MtPmN0eC0+cGIpOworICAgICAgICBpZiAob3MtPmN0eCkKKyAgICAgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChvcy0+Y3R4KTsKKyAgICAgICAgYXZfZnJlZShvcy0+cHJpdmF0ZV9zdHIpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3MtPm5iX2ZyYWdtZW50czsgaisrKQorICAgICAgICAgICAgYXZfZnJlZShvcy0+ZnJhZ21lbnRzW2pdKTsKKyAgICAgICAgYXZfZnJlZShvcy0+ZnJhZ21lbnRzKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmMtPnN0cmVhbXMpOworfQorCitzdGF0aWMgdm9pZCBvdXRwdXRfY2h1bmtfbGlzdChPdXRwdXRTdHJlYW0gKm9zLCBBVklPQ29udGV4dCAqb3V0LCBpbnQgZmluYWwsIGludCBza2lwLCBpbnQgd2luZG93X3NpemUpCit7CisgICAgaW50IHJlbW92ZWQgPSAwLCBpLCBzdGFydCA9IDA7CisgICAgaWYgKG9zLT5uYl9mcmFnbWVudHMgPD0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChvcy0+ZnJhZ21lbnRzWzBdLT5uID4gMCkKKyAgICAgICAgcmVtb3ZlZCA9IDE7CisgICAgaWYgKGZpbmFsKQorICAgICAgICBza2lwID0gMDsKKyAgICBpZiAod2luZG93X3NpemUpCisgICAgICAgIHN0YXJ0ID0gRkZNQVgob3MtPm5iX2ZyYWdtZW50cyAtIHNraXAgLSB3aW5kb3dfc2l6ZSwgMCk7CisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBvcy0+bmJfZnJhZ21lbnRzIC0gc2tpcDsgaSsrKSB7CisgICAgICAgIEZyYWdtZW50ICpmcmFnID0gb3MtPmZyYWdtZW50c1tpXTsKKyAgICAgICAgaWYgKCFmaW5hbCB8fCByZW1vdmVkKQorICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiPGMgdD1cIiUiUFJJdTY0IlwiIGQ9XCIlIlBSSXU2NCJcIiAvPlxuIiwgZnJhZy0+c3RhcnRfdGltZSwgZnJhZy0+ZHVyYXRpb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICI8YyBuPVwiJWRcIiBkPVwiJSJQUkl1NjQiXCIgLz5cbiIsIGZyYWctPm4sIGZyYWctPmR1cmF0aW9uKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfbWFuaWZlc3QoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgZmluYWwpCit7CisgICAgU21vb3RoU3RyZWFtaW5nQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqb3V0OworICAgIGNoYXIgZmlsZW5hbWVbMTAyNF0sIHRlbXBfZmlsZW5hbWVbMTAyNF07CisgICAgaW50IHJldCwgaSwgdmlkZW9fY2h1bmtzID0gMCwgYXVkaW9fY2h1bmtzID0gMCwgdmlkZW9fc3RyZWFtcyA9IDAsIGF1ZGlvX3N0cmVhbXMgPSAwOworICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworCisgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcy9NYW5pZmVzdCIsIHMtPmZpbGVuYW1lKTsKKyAgICBzbnByaW50Zih0ZW1wX2ZpbGVuYW1lLCBzaXplb2YodGVtcF9maWxlbmFtZSksICIlcy9NYW5pZmVzdC50bXAiLCBzLT5maWxlbmFtZSk7CisgICAgcmV0ID0gYXZpb19vcGVuMigmb3V0LCB0ZW1wX2ZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiAlcyBmb3Igd3JpdGluZ1xuIiwgdGVtcF9maWxlbmFtZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGF2aW9fcHJpbnRmKG91dCwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbaV07CisgICAgICAgIGlmIChvcy0+bmJfZnJhZ21lbnRzID4gMCkgeworICAgICAgICAgICAgRnJhZ21lbnQgKmxhc3QgPSBvcy0+ZnJhZ21lbnRzW29zLT5uYl9mcmFnbWVudHMgLSAxXTsKKyAgICAgICAgICAgIGR1cmF0aW9uID0gbGFzdC0+c3RhcnRfdGltZSArIGxhc3QtPmR1cmF0aW9uOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIHZpZGVvX2NodW5rcyA9IG9zLT5uYl9mcmFnbWVudHM7CisgICAgICAgICAgICB2aWRlb19zdHJlYW1zKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdWRpb19jaHVua3MgPSBvcy0+bmJfZnJhZ21lbnRzOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtcysrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghZmluYWwpIHsKKyAgICAgICAgZHVyYXRpb24gPSAwOworICAgICAgICB2aWRlb19jaHVua3MgPSBhdWRpb19jaHVua3MgPSAwOworICAgIH0KKyAgICBpZiAoYy0+d2luZG93X3NpemUpIHsKKyAgICAgICAgdmlkZW9fY2h1bmtzID0gRkZNSU4odmlkZW9fY2h1bmtzLCBjLT53aW5kb3dfc2l6ZSk7CisgICAgICAgIGF1ZGlvX2NodW5rcyA9IEZGTUlOKGF1ZGlvX2NodW5rcywgYy0+d2luZG93X3NpemUpOworICAgIH0KKyAgICBhdmlvX3ByaW50ZihvdXQsICI8U21vb3RoU3RyZWFtaW5nTWVkaWEgTWFqb3JWZXJzaW9uPVwiMlwiIE1pbm9yVmVyc2lvbj1cIjBcIiBEdXJhdGlvbj1cIiUiUFJJdTY0IlwiIiwgZHVyYXRpb24pOworICAgIGlmICghZmluYWwpCisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIiBJc0xpdmU9XCJ0cnVlXCIgTG9va0FoZWFkRnJhZ21lbnRDb3VudD1cIiVkXCIgRFZSV2luZG93TGVuZ3RoPVwiMFwiIiwgYy0+bG9va2FoZWFkX2NvdW50KTsKKyAgICBhdmlvX3ByaW50ZihvdXQsICI+XG4iKTsKKyAgICBpZiAoYy0+aGFzX3ZpZGVvKSB7CisgICAgICAgIGludCBsYXN0ID0gLTEsIGluZGV4ID0gMDsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiPFN0cmVhbUluZGV4IFR5cGU9XCJ2aWRlb1wiIFF1YWxpdHlMZXZlbHM9XCIlZFwiIENodW5rcz1cIiVkXCIgVXJsPVwiUXVhbGl0eUxldmVscyh7Yml0cmF0ZX0pL0ZyYWdtZW50cyh2aWRlbz17c3RhcnQgdGltZX0pXCI+XG4iLCB2aWRlb19zdHJlYW1zLCB2aWRlb19jaHVua3MpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGFzdCA9IGk7CisgICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICI8UXVhbGl0eUxldmVsIEluZGV4PVwiJWRcIiBCaXRyYXRlPVwiJWRcIiBGb3VyQ0M9XCIlc1wiIE1heFdpZHRoPVwiJWRcIiBNYXhIZWlnaHQ9XCIlZFwiIENvZGVjUHJpdmF0ZURhdGE9XCIlc1wiIC8+XG4iLCBpbmRleCwgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmJpdF9yYXRlLCBvcy0+Zm91cmNjLCBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+d2lkdGgsIHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5oZWlnaHQsIG9zLT5wcml2YXRlX3N0cik7CisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisgICAgICAgIG91dHB1dF9jaHVua19saXN0KCZjLT5zdHJlYW1zW2xhc3RdLCBvdXQsIGZpbmFsLCBjLT5sb29rYWhlYWRfY291bnQsIGMtPndpbmRvd19zaXplKTsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiPC9TdHJlYW1JbmRleD5cbiIpOworICAgIH0KKyAgICBpZiAoYy0+aGFzX2F1ZGlvKSB7CisgICAgICAgIGludCBsYXN0ID0gLTEsIGluZGV4ID0gMDsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiPFN0cmVhbUluZGV4IFR5cGU9XCJhdWRpb1wiIFF1YWxpdHlMZXZlbHM9XCIlZFwiIENodW5rcz1cIiVkXCIgVXJsPVwiUXVhbGl0eUxldmVscyh7Yml0cmF0ZX0pL0ZyYWdtZW50cyhhdWRpbz17c3RhcnQgdGltZX0pXCI+XG4iLCBhdWRpb19zdHJlYW1zLCBhdWRpb19jaHVua3MpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGFzdCA9IGk7CisgICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICI8UXVhbGl0eUxldmVsIEluZGV4PVwiJWRcIiBCaXRyYXRlPVwiJWRcIiBGb3VyQ0M9XCIlc1wiIFNhbXBsaW5nUmF0ZT1cIiVkXCIgQ2hhbm5lbHM9XCIlZFwiIEJpdHNQZXJTYW1wbGU9XCIxNlwiIFBhY2tldFNpemU9XCIlZFwiIEF1ZGlvVGFnPVwiJWRcIiBDb2RlY1ByaXZhdGVEYXRhPVwiJXNcIiAvPlxuIiwgaW5kZXgsIHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5iaXRfcmF0ZSwgb3MtPmZvdXJjYywgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPnNhbXBsZV9yYXRlLCBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y2hhbm5lbHMsIG9zLT5wYWNrZXRfc2l6ZSwgb3MtPmF1ZGlvX3RhZywgb3MtPnByaXZhdGVfc3RyKTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0X2NodW5rX2xpc3QoJmMtPnN0cmVhbXNbbGFzdF0sIG91dCwgZmluYWwsIGMtPmxvb2thaGVhZF9jb3VudCwgYy0+d2luZG93X3NpemUpOworICAgICAgICBhdmlvX3ByaW50ZihvdXQsICI8L1N0cmVhbUluZGV4PlxuIik7CisgICAgfQorICAgIGF2aW9fcHJpbnRmKG91dCwgIjwvU21vb3RoU3RyZWFtaW5nTWVkaWE+XG4iKTsKKyAgICBhdmlvX2ZsdXNoKG91dCk7CisgICAgYXZpb19jbG9zZShvdXQpOworICAgIHJldHVybiBmZl9yZW5hbWUodGVtcF9maWxlbmFtZSwgZmlsZW5hbWUsIHMpOworfQorCitzdGF0aWMgaW50IGlzbV93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNtb290aFN0cmVhbWluZ0NvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldCA9IDAsIGk7CisgICAgQVZPdXRwdXRGb3JtYXQgKm9mb3JtYXQ7CisKKyAgICBpZiAobWtkaXIocy0+ZmlsZW5hbWUsIDA3NzcpID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm1rZGlyIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBvZm9ybWF0ID0gYXZfZ3Vlc3NfZm9ybWF0KCJpc212IiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKCFvZm9ybWF0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfTVVYRVJfTk9UX0ZPVU5EOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYy0+c3RyZWFtcyA9IGF2X21hbGxvY3pfYXJyYXkocy0+bmJfc3RyZWFtcywgc2l6ZW9mKCpjLT5zdHJlYW1zKSk7CisgICAgaWYgKCFjLT5zdHJlYW1zKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2ldOworICAgICAgICBBVkZvcm1hdENvbnRleHQgKmN0eDsKKyAgICAgICAgQVZTdHJlYW0gKnN0OworICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOworCisgICAgICAgIGlmICghcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmJpdF9yYXRlKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm8gYml0IHJhdGUgc2V0IGZvciBzdHJlYW0gJWRcbiIsIGkpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHNucHJpbnRmKG9zLT5kaXJuYW1lLCBzaXplb2Yob3MtPmRpcm5hbWUpLCAiJXMvUXVhbGl0eUxldmVscyglZCkiLCBzLT5maWxlbmFtZSwgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmJpdF9yYXRlKTsKKyAgICAgICAgaWYgKG1rZGlyKG9zLT5kaXJuYW1lLCAwNzc3KSA9PSAtMSAmJiBlcnJubyAhPSBFRVhJU1QpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm1rZGlyIGZhaWxlZFxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBjdHggPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7CisgICAgICAgIGlmICghY3R4KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgb3MtPmN0eCA9IGN0eDsKKyAgICAgICAgY3R4LT5vZm9ybWF0ID0gb2Zvcm1hdDsKKyAgICAgICAgY3R4LT5pbnRlcnJ1cHRfY2FsbGJhY2sgPSBzLT5pbnRlcnJ1cHRfY2FsbGJhY2s7CisKKyAgICAgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGN0eCwgTlVMTCkpKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgYXZjb2RlY19jb3B5X2NvbnRleHQoc3QtPmNvZGVjLCBzLT5zdHJlYW1zW2ldLT5jb2RlYyk7CisgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gcy0+c3RyZWFtc1tpXS0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICAgICAgc3QtPnRpbWVfYmFzZSA9IHMtPnN0cmVhbXNbaV0tPnRpbWVfYmFzZTsKKworICAgICAgICBjdHgtPnBiID0gYXZpb19hbGxvY19jb250ZXh0KG9zLT5pb2J1Ziwgc2l6ZW9mKG9zLT5pb2J1ZiksIEFWSU9fRkxBR19XUklURSwgb3MsIE5VTEwsIGlzbV93cml0ZSwgaXNtX3NlZWspOworICAgICAgICBpZiAoIWN0eC0+cGIpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2RpY3Rfc2V0X2ludCgmb3B0cywgImlzbV9sb29rYWhlYWQiLCBjLT5sb29rYWhlYWRfY291bnQsIDApOworICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfY3VzdG9tIiwgMCk7CisgICAgICAgIGlmICgocmV0ID0gYXZmb3JtYXRfd3JpdGVfaGVhZGVyKGN0eCwgJm9wdHMpKSA8IDApIHsKKyAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgb3MtPmN0eF9pbml0ZWQgPSAxOworICAgICAgICBhdmlvX2ZsdXNoKGN0eC0+cGIpOworICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgICAgICBzLT5zdHJlYW1zW2ldLT50aW1lX2Jhc2UgPSBzdC0+dGltZV9iYXNlOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgYy0+aGFzX3ZpZGVvID0gMTsKKyAgICAgICAgICAgIG9zLT5zdHJlYW1fdHlwZV90YWcgPSAidmlkZW8iOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgeworICAgICAgICAgICAgICAgIG9zLT5mb3VyY2MgPSAiSDI2NCI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVkMxKSB7CisgICAgICAgICAgICAgICAgb3MtPmZvdXJjYyA9ICJXVkMxIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHZpZGVvIGNvZGVjXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYy0+aGFzX2F1ZGlvID0gMTsKKyAgICAgICAgICAgIG9zLT5zdHJlYW1fdHlwZV90YWcgPSAiYXVkaW8iOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgICAgICAgICAgb3MtPmZvdXJjYyA9ICJBQUNMIjsKKyAgICAgICAgICAgICAgICBvcy0+YXVkaW9fdGFnID0gMHhmZjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XTUFQUk8pIHsKKyAgICAgICAgICAgICAgICBvcy0+Zm91cmNjID0gIldNQVAiOworICAgICAgICAgICAgICAgIG9zLT5hdWRpb190YWcgPSAweDAxNjI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBhdWRpbyBjb2RlY1xuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9zLT5wYWNrZXRfc2l6ZSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPyBzdC0+Y29kZWMtPmJsb2NrX2FsaWduIDogNDsKKyAgICAgICAgfQorICAgICAgICBnZXRfcHJpdmF0ZV9kYXRhKG9zKTsKKyAgICB9CisKKyAgICBpZiAoIWMtPmhhc192aWRlbyAmJiBjLT5taW5fZnJhZ19kdXJhdGlvbiA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIm5vIHZpZGVvIHN0cmVhbSBhbmQgbm8gbWluIGZyYWcgZHVyYXRpb24gc2V0XG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICByZXQgPSB3cml0ZV9tYW5pZmVzdChzLCAwKTsKKworZmFpbDoKKyAgICBpZiAocmV0KQorICAgICAgICBpc21fZnJlZShzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBhcnNlX2ZyYWdtZW50KEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludDY0X3QgKnN0YXJ0X3RzLCBpbnQ2NF90ICpkdXJhdGlvbiwgaW50NjRfdCAqbW9vZl9zaXplLCBpbnQ2NF90IHNpemUpCit7CisgICAgQVZJT0NvbnRleHQgKmluOworICAgIGludCByZXQ7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICgocmV0ID0gYXZpb19vcGVuMigmaW4sIGZpbGVuYW1lLCBBVklPX0ZMQUdfUkVBRCwgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgKm1vb2Zfc2l6ZSA9IGF2aW9fcmIzMihpbik7CisgICAgaWYgKCptb29mX3NpemUgPCA4IHx8ICptb29mX3NpemUgPiBzaXplKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKGF2aW9fcmwzMihpbikgIT0gTUtUQUcoJ20nLCdvJywnbycsJ2YnKSkKKyAgICAgICAgZ290byBmYWlsOworICAgIGxlbiA9IGF2aW9fcmIzMihpbik7CisgICAgaWYgKGxlbiA+ICptb29mX3NpemUpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoYXZpb19ybDMyKGluKSAhPSBNS1RBRygnbScsJ2YnLCdoJywnZCcpKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgYXZpb19zZWVrKGluLCBsZW4gLSA4LCBTRUVLX0NVUik7CisgICAgYXZpb19yYjMyKGluKTsgLyogdHJhZiBzaXplICovCisgICAgaWYgKGF2aW9fcmwzMihpbikgIT0gTUtUQUcoJ3QnLCdyJywnYScsJ2YnKSkKKyAgICAgICAgZ290byBmYWlsOworICAgIHdoaWxlIChhdmlvX3RlbGwoaW4pIDwgKm1vb2Zfc2l6ZSkgeworICAgICAgICB1aW50MzJfdCBsZW4gPSBhdmlvX3JiMzIoaW4pOworICAgICAgICB1aW50MzJfdCB0YWcgPSBhdmlvX3JsMzIoaW4pOworICAgICAgICBpbnQ2NF90IGVuZCA9IGF2aW9fdGVsbChpbikgKyBsZW4gLSA4OworICAgICAgICBpZiAobGVuIDwgOCB8fCBsZW4gPj0gKm1vb2Zfc2l6ZSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgaWYgKHRhZyA9PSBNS1RBRygndScsJ3UnLCdpJywnZCcpKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCB0ZnhkW10gPSB7CisgICAgICAgICAgICAgICAgMHg2ZCwgMHgxZCwgMHg5YiwgMHgwNSwgMHg0MiwgMHhkNSwgMHg0NCwgMHhlNiwKKyAgICAgICAgICAgICAgICAweDgwLCAweGUyLCAweDE0LCAweDFkLCAweGFmLCAweGY3LCAweDU3LCAweGIyCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdWludDhfdCB1dWlkWzE2XTsKKyAgICAgICAgICAgIGF2aW9fcmVhZChpbiwgdXVpZCwgMTYpOworICAgICAgICAgICAgaWYgKCFtZW1jbXAodXVpZCwgdGZ4ZCwgMTYpICYmIGxlbiA+PSA4ICsgMTYgKyA0ICsgMTYpIHsKKyAgICAgICAgICAgICAgICBhdmlvX3NlZWsoaW4sIDQsIFNFRUtfQ1VSKTsKKyAgICAgICAgICAgICAgICAqc3RhcnRfdHMgPSBhdmlvX3JiNjQoaW4pOworICAgICAgICAgICAgICAgICpkdXJhdGlvbiA9IGF2aW9fcmI2NChpbik7CisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdmlvX3NlZWsoaW4sIGVuZCwgU0VFS19TRVQpOworICAgIH0KK2ZhaWw6CisgICAgYXZpb19jbG9zZShpbik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGRfZnJhZ21lbnQoT3V0cHV0U3RyZWFtICpvcywgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqaW5mb2ZpbGUsIGludDY0X3Qgc3RhcnRfdGltZSwgaW50NjRfdCBkdXJhdGlvbiwgaW50NjRfdCBzdGFydF9wb3MsIGludDY0X3Qgc2l6ZSkKK3sKKyAgICBpbnQgZXJyOworICAgIEZyYWdtZW50ICpmcmFnOworICAgIGlmIChvcy0+bmJfZnJhZ21lbnRzID49IG9zLT5mcmFnbWVudHNfc2l6ZSkgeworICAgICAgICBvcy0+ZnJhZ21lbnRzX3NpemUgPSAob3MtPmZyYWdtZW50c19zaXplICsgMSkgKiAyOworICAgICAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZvcy0+ZnJhZ21lbnRzLCBzaXplb2YoKm9zLT5mcmFnbWVudHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy0+ZnJhZ21lbnRzX3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgIG9zLT5mcmFnbWVudHNfc2l6ZSA9IDA7CisgICAgICAgICAgICBvcy0+bmJfZnJhZ21lbnRzID0gMDsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgZnJhZyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpmcmFnKSk7CisgICAgaWYgKCFmcmFnKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2X3N0cmxjcHkoZnJhZy0+ZmlsZSwgZmlsZSwgc2l6ZW9mKGZyYWctPmZpbGUpKTsKKyAgICBhdl9zdHJsY3B5KGZyYWctPmluZm9maWxlLCBpbmZvZmlsZSwgc2l6ZW9mKGZyYWctPmluZm9maWxlKSk7CisgICAgZnJhZy0+c3RhcnRfdGltZSA9IHN0YXJ0X3RpbWU7CisgICAgZnJhZy0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICBmcmFnLT5zdGFydF9wb3MgPSBzdGFydF9wb3M7CisgICAgZnJhZy0+c2l6ZSA9IHNpemU7CisgICAgZnJhZy0+biA9IG9zLT5mcmFnbWVudF9pbmRleDsKKyAgICBvcy0+ZnJhZ21lbnRzW29zLT5uYl9mcmFnbWVudHMrK10gPSBmcmFnOworICAgIG9zLT5mcmFnbWVudF9pbmRleCsrOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcHlfbW9vZihBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIqIGluZmlsZSwgY29uc3QgY2hhciAqb3V0ZmlsZSwgaW50NjRfdCBzaXplKQoreworICAgIEFWSU9Db250ZXh0ICppbiwgKm91dDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpZiAoKHJldCA9IGF2aW9fb3BlbjIoJmluLCBpbmZpbGUsIEFWSU9fRkxBR19SRUFELCAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICgocmV0ID0gYXZpb19vcGVuMigmb3V0LCBvdXRmaWxlLCBBVklPX0ZMQUdfV1JJVEUsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpKSA8IDApIHsKKyAgICAgICAgYXZpb19jbG9zZShpbik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICB1aW50OF90IGJ1Zls4MTkyXTsKKyAgICAgICAgaW50IG4gPSBGRk1JTihzaXplLCBzaXplb2YoYnVmKSk7CisgICAgICAgIG4gPSBhdmlvX3JlYWQoaW4sIGJ1Ziwgbik7CisgICAgICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGF2aW9fd3JpdGUob3V0LCBidWYsIG4pOworICAgICAgICBzaXplIC09IG47CisgICAgfQorICAgIGF2aW9fZmx1c2gob3V0KTsKKyAgICBhdmlvX2Nsb3NlKG91dCk7CisgICAgYXZpb19jbG9zZShpbik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc21fZmx1c2goQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgZmluYWwpCit7CisgICAgU21vb3RoU3RyZWFtaW5nQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcmV0ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2ldOworICAgICAgICBjaGFyIGZpbGVuYW1lWzEwMjRdLCB0YXJnZXRfZmlsZW5hbWVbMTAyNF0sIGhlYWRlcl9maWxlbmFtZVsxMDI0XTsKKyAgICAgICAgaW50NjRfdCBzaXplOworICAgICAgICBpbnQ2NF90IHN0YXJ0X3RzLCBkdXJhdGlvbiwgbW9vZl9zaXplOworICAgICAgICBpZiAoIW9zLT5wYWNrZXRzX3dyaXR0ZW4pCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzL3RlbXAiLCBvcy0+ZGlybmFtZSk7CisgICAgICAgIHJldCA9IGZmdXJsX29wZW4oJm9zLT5vdXQsIGZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBvcy0+Y3VyX3N0YXJ0X3BvcyA9IG9zLT50YWlsX3BvczsKKyAgICAgICAgYXZfd3JpdGVfZnJhbWUob3MtPmN0eCwgTlVMTCk7CisgICAgICAgIGF2aW9fZmx1c2gob3MtPmN0eC0+cGIpOworICAgICAgICBvcy0+cGFja2V0c193cml0dGVuID0gMDsKKyAgICAgICAgaWYgKCFvcy0+b3V0IHx8IG9zLT50YWlsX291dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAgICAgZmZ1cmxfY2xvc2Uob3MtPm91dCk7CisgICAgICAgIG9zLT5vdXQgPSBOVUxMOworICAgICAgICBzaXplID0gb3MtPnRhaWxfcG9zIC0gb3MtPmN1cl9zdGFydF9wb3M7CisgICAgICAgIGlmICgocmV0ID0gcGFyc2VfZnJhZ21lbnQocywgZmlsZW5hbWUsICZzdGFydF90cywgJmR1cmF0aW9uLCAmbW9vZl9zaXplLCBzaXplKSkgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNucHJpbnRmKGhlYWRlcl9maWxlbmFtZSwgc2l6ZW9mKGhlYWRlcl9maWxlbmFtZSksICIlcy9GcmFnbWVudEluZm8oJXM9JSJQUkl1NjQiKSIsIG9zLT5kaXJuYW1lLCBvcy0+c3RyZWFtX3R5cGVfdGFnLCBzdGFydF90cyk7CisgICAgICAgIHNucHJpbnRmKHRhcmdldF9maWxlbmFtZSwgc2l6ZW9mKHRhcmdldF9maWxlbmFtZSksICIlcy9GcmFnbWVudHMoJXM9JSJQUkl1NjQiKSIsIG9zLT5kaXJuYW1lLCBvcy0+c3RyZWFtX3R5cGVfdGFnLCBzdGFydF90cyk7CisgICAgICAgIGNvcHlfbW9vZihzLCBmaWxlbmFtZSwgaGVhZGVyX2ZpbGVuYW1lLCBtb29mX3NpemUpOworICAgICAgICByZXQgPSBmZl9yZW5hbWUoZmlsZW5hbWUsIHRhcmdldF9maWxlbmFtZSwgcyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGFkZF9mcmFnbWVudChvcywgdGFyZ2V0X2ZpbGVuYW1lLCBoZWFkZXJfZmlsZW5hbWUsIHN0YXJ0X3RzLCBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIG9zLT5jdXJfc3RhcnRfcG9zLCBzaXplKTsKKyAgICB9CisKKyAgICBpZiAoYy0+d2luZG93X3NpemUgfHwgKGZpbmFsICYmIGMtPnJlbW92ZV9hdF9leGl0KSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGludCByZW1vdmUgPSBvcy0+bmJfZnJhZ21lbnRzIC0gYy0+d2luZG93X3NpemUgLSBjLT5leHRyYV93aW5kb3dfc2l6ZSAtIGMtPmxvb2thaGVhZF9jb3VudDsKKyAgICAgICAgICAgIGlmIChmaW5hbCAmJiBjLT5yZW1vdmVfYXRfZXhpdCkKKyAgICAgICAgICAgICAgICByZW1vdmUgPSBvcy0+bmJfZnJhZ21lbnRzOworICAgICAgICAgICAgaWYgKHJlbW92ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmVtb3ZlOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdW5saW5rKG9zLT5mcmFnbWVudHNbal0tPmZpbGUpOworICAgICAgICAgICAgICAgICAgICB1bmxpbmsob3MtPmZyYWdtZW50c1tqXS0+aW5mb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKG9zLT5mcmFnbWVudHNbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcy0+bmJfZnJhZ21lbnRzIC09IHJlbW92ZTsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKG9zLT5mcmFnbWVudHMsIG9zLT5mcmFnbWVudHMgKyByZW1vdmUsIG9zLT5uYl9mcmFnbWVudHMgKiBzaXplb2YoKm9zLT5mcmFnbWVudHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaW5hbCAmJiBjLT5yZW1vdmVfYXRfZXhpdCkKKyAgICAgICAgICAgICAgICBybWRpcihvcy0+ZGlybmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIHJldCA9IHdyaXRlX21hbmlmZXN0KHMsIGZpbmFsKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlzbV93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFNtb290aFN0cmVhbWluZ0NvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICBpbnQ2NF90IGVuZF9kdHMgPSAoYy0+bmJfZnJhZ21lbnRzICsgMSkgKiAoaW50NjRfdCkgYy0+bWluX2ZyYWdfZHVyYXRpb247CisgICAgaW50IHJldDsKKworICAgIGlmIChzdC0+Zmlyc3RfZHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBzdC0+Zmlyc3RfZHRzID0gcGt0LT5kdHM7CisKKyAgICBpZiAoKCFjLT5oYXNfdmlkZW8gfHwgc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgJiYKKyAgICAgICAgYXZfY29tcGFyZV90cyhwa3QtPmR0cyAtIHN0LT5maXJzdF9kdHMsIHN0LT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZW5kX2R0cywgQVZfVElNRV9CQVNFX1EpID49IDAgJiYKKyAgICAgICAgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSAmJiBvcy0+cGFja2V0c193cml0dGVuKSB7CisKKyAgICAgICAgaWYgKChyZXQgPSBpc21fZmx1c2gocywgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGMtPm5iX2ZyYWdtZW50cysrOworICAgIH0KKworICAgIG9zLT5wYWNrZXRzX3dyaXR0ZW4rKzsKKyAgICByZXR1cm4gZmZfd3JpdGVfY2hhaW5lZChvcy0+Y3R4LCAwLCBwa3QsIHMsIDApOworfQorCitzdGF0aWMgaW50IGlzbV93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBTbW9vdGhTdHJlYW1pbmdDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGlzbV9mbHVzaChzLCAxKTsKKworICAgIGlmIChjLT5yZW1vdmVfYXRfZXhpdCkgeworICAgICAgICBjaGFyIGZpbGVuYW1lWzEwMjRdOworICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzL01hbmlmZXN0Iiwgcy0+ZmlsZW5hbWUpOworICAgICAgICB1bmxpbmsoZmlsZW5hbWUpOworICAgICAgICBybWRpcihzLT5maWxlbmFtZSk7CisgICAgfQorCisgICAgaXNtX2ZyZWUocyk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNtb290aFN0cmVhbWluZ0NvbnRleHQsIHgpCisjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAid2luZG93X3NpemUiLCAibnVtYmVyIG9mIGZyYWdtZW50cyBrZXB0IGluIHRoZSBtYW5pZmVzdCIsIE9GRlNFVCh3aW5kb3dfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBFIH0sCisgICAgeyAiZXh0cmFfd2luZG93X3NpemUiLCAibnVtYmVyIG9mIGZyYWdtZW50cyBrZXB0IG91dHNpZGUgb2YgdGhlIG1hbmlmZXN0IGJlZm9yZSByZW1vdmluZyBmcm9tIGRpc2siLCBPRkZTRVQoZXh0cmFfd2luZG93X3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDUgfSwgMCwgSU5UX01BWCwgRSB9LAorICAgIHsgImxvb2thaGVhZF9jb3VudCIsICJudW1iZXIgb2YgbG9va2FoZWFkIGZyYWdtZW50cyIsIE9GRlNFVChsb29rYWhlYWRfY291bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDIgfSwgMCwgSU5UX01BWCwgRSB9LAorICAgIHsgIm1pbl9mcmFnX2R1cmF0aW9uIiwgIm1pbmltdW0gZnJhZ21lbnQgZHVyYXRpb24gKGluIG1pY3Jvc2Vjb25kcykiLCBPRkZTRVQobWluX2ZyYWdfZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQ2NCwgeyAuaTY0ID0gNTAwMDAwMCB9LCAwLCBJTlRfTUFYLCBFIH0sCisgICAgeyAicmVtb3ZlX2F0X2V4aXQiLCAicmVtb3ZlIGFsbCBmcmFnbWVudHMgd2hlbiBmaW5pc2hlZCIsIE9GRlNFVChyZW1vdmVfYXRfZXhpdCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBFIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBpc21fY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAic21vb3RoIHN0cmVhbWluZyBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCisKK0FWT3V0cHV0Rm9ybWF0IGZmX3Ntb290aHN0cmVhbWluZ19tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic21vb3Roc3RyZWFtaW5nIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU21vb3RoIFN0cmVhbWluZyBNdXhlciIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTbW9vdGhTdHJlYW1pbmdDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9BQUMsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9OT0ZJTEUsCisgICAgLndyaXRlX2hlYWRlciAgID0gaXNtX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBpc21fd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICA9IGlzbV93cml0ZV90cmFpbGVyLAorICAgIC5jb2RlY190YWcgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7IGZmX21wNF9vYmpfdHlwZSwgMCB9LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZpc21fY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NtdXNoLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc211c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI2OTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NtdXNoLmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBMdWNhc0FydHMgU211c2ggZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA2IEN5cmlsIFpvcmluCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW8uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBTTVVTSENvbnRleHQgeworICAgIGludCB2ZXJzaW9uOworICAgIGludCBhdWRpb19zdHJlYW1faW5kZXg7CisgICAgaW50IHZpZGVvX3N0cmVhbV9pbmRleDsKK30gU01VU0hDb250ZXh0OworCitzdGF0aWMgaW50IHNtdXNoX3JlYWRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKCgoQVZfUkwzMihwLT5idWYpICAgICA9PSBNS1RBRygnUycsICdBJywgJ04nLCAnTScpICYmCisgICAgICAgICAgQVZfUkwzMihwLT5idWYgKyA4KSA9PSBNS1RBRygnUycsICdIJywgJ0QnLCAnUicpKSB8fAorICAgICAgICAgKEFWX1JMMzIocC0+YnVmKSAgICAgPT0gTUtUQUcoJ0EnLCAnTicsICdJJywgJ00nKSAmJgorICAgICAgICAgIEFWX1JMMzIocC0+YnVmICsgOCkgPT0gTUtUQUcoJ0EnLCAnSCcsICdEJywgJ1InKSkpKSB7CisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbXVzaF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmN0eCkKK3sKKyAgICBTTVVTSENvbnRleHQgKnNtdXNoID0gY3R4LT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gY3R4LT5wYjsKKyAgICBBVlN0cmVhbSAqdnN0LCAqYXN0OworICAgIHVpbnQzMl90IG1hZ2ljLCBuZnJhbWVzLCBzaXplLCBzdWJ2ZXJzaW9uLCBpOworICAgIHVpbnQzMl90IHdpZHRoID0gMCwgaGVpZ2h0ID0gMCwgZ290X2F1ZGlvID0gMCwgcmVhZCA9IDA7CisgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUsIGNoYW5uZWxzLCBwYWxldHRlWzI1Nl07CisKKyAgICBtYWdpYyA9IGF2aW9fcmIzMihwYik7CisgICAgYXZpb19za2lwKHBiLCA0KTsgLy8gc2tpcCBtb3ZpZSBzaXplCisKKyAgICBpZiAobWFnaWMgPT0gTUtCRVRBRygnQScsICdOJywgJ0knLCAnTScpKSB7CisgICAgICAgIGlmIChhdmlvX3JiMzIocGIpICE9IE1LQkVUQUcoJ0EnLCAnSCcsICdEJywgJ1InKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHNpemUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBpZiAoc2l6ZSA8IDMgKiAyNTYgKyA2KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgc211c2gtPnZlcnNpb24gPSAwOworICAgICAgICBzdWJ2ZXJzaW9uICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIG5mcmFtZXMgICAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgaWYgKCFuZnJhbWVzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgYXZpb19za2lwKHBiLCAyKTsgLy8gc2tpcCBwYWQKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBwYWxldHRlW2ldID0gYXZpb19yYjI0KHBiKTsKKworICAgICAgICBhdmlvX3NraXAocGIsIHNpemUgLSAoMyAqIDI1NiArIDYpKTsKKyAgICB9IGVsc2UgaWYgKG1hZ2ljID09IE1LQkVUQUcoJ1MnLCAnQScsICdOJywgJ00nKSkgeworICAgICAgICBpZiAoYXZpb19yYjMyKHBiKSAhPSBNS0JFVEFHKCdTJywgJ0gnLCAnRCcsICdSJykpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBzaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgaWYgKHNpemUgPCAxNCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHNtdXNoLT52ZXJzaW9uID0gMTsKKyAgICAgICAgc3VidmVyc2lvbiA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIG5mcmFtZXMgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAoIW5mcmFtZXMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBhdmlvX3NraXAocGIsIDIpOyAvLyBza2lwIHBhZAorICAgICAgICB3aWR0aCAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICBoZWlnaHQgPSBhdmlvX3JsMTYocGIpOworICAgICAgICBhdmlvX3NraXAocGIsIDIpOyAvLyBza2lwIHBhZAorICAgICAgICBhdmlvX3NraXAocGIsIHNpemUgLSAxNCk7CisKKyAgICAgICAgaWYgKGF2aW9fcmIzMihwYikgIT0gTUtCRVRBRygnRicsICdMJywgJ0gnLCAnRCcpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgc2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIHdoaWxlICghZ290X2F1ZGlvICYmICgocmVhZCArIDgpIDwgc2l6ZSkpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHNpZywgY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgICAgICAgICBzaWcgICAgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGNodW5rX3NpemUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgcmVhZCAgICAgICs9IDg7CisgICAgICAgICAgICBzd2l0Y2ggKHNpZykgeworICAgICAgICAgICAgY2FzZSBNS0JFVEFHKCdXJywgJ2EnLCAndicsICdlJyk6CisgICAgICAgICAgICAgICAgZ290X2F1ZGlvID0gMTsKKyAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICAgICAgaWYgKCFzYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICBjaGFubmVscyA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICAgICAgaWYgKCFjaGFubmVscykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIGNodW5rX3NpemUgLSA4KTsKKyAgICAgICAgICAgICAgICByZWFkICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1LQkVUQUcoJ0InLCAnbCcsICcxJywgJzYnKToKKyAgICAgICAgICAgIGNhc2UgTUtCRVRBRygnQScsICdOJywgJ04nLCAnTycpOgorICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICAgICAgcmVhZCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSAtIHJlYWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIldyb25nIG1hZ2ljXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjdHgsIDApOworICAgIGlmICghdnN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc211c2gtPnZpZGVvX3N0cmVhbV9pbmRleCA9IHZzdC0+aW5kZXg7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgNjQsIDEsIDE1KTsKKworICAgIHZzdC0+c3RhcnRfdGltZSAgICAgICAgPSAwOworICAgIHZzdC0+ZHVyYXRpb24gICAgICAgICAgPQorICAgIHZzdC0+bmJfZnJhbWVzICAgICAgICAgPSBuZnJhbWVzOworICAgIHZzdC0+YXZnX2ZyYW1lX3JhdGUgICAgPSBhdl9pbnZfcSh2c3QtPnRpbWVfYmFzZSk7CisgICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfU0FOTTsKKyAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcgID0gMDsKKyAgICB2c3QtPmNvZGVjLT53aWR0aCAgICAgID0gd2lkdGg7CisgICAgdnN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGhlaWdodDsKKworICAgIGlmICghc211c2gtPnZlcnNpb24pIHsKKyAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YSh2c3QtPmNvZGVjLCAxMDI0ICsgMikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIEFWX1dMMTYodnN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBzdWJ2ZXJzaW9uKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICAgICAgQVZfV0wzMih2c3QtPmNvZGVjLT5leHRyYWRhdGEgKyAyICsgaSAqIDQsIHBhbGV0dGVbaV0pOworICAgIH0KKworICAgIGlmIChnb3RfYXVkaW8pIHsKKyAgICAgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjdHgsIDApOworICAgICAgICBpZiAoIWFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgc211c2gtPmF1ZGlvX3N0cmVhbV9pbmRleCA9IGFzdC0+aW5kZXg7CisKKyAgICAgICAgYXN0LT5zdGFydF90aW1lICAgICAgICAgPSAwOworICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9WSU1BOworICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IDA7CisgICAgICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gY2hhbm5lbHM7CisKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDY0LCAxLCBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc211c2hfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgU01VU0hDb250ZXh0ICpzbXVzaCA9IGN0eC0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IGN0eC0+cGI7CisgICAgaW50IGRvbmUgPSAwOworICAgIGludCByZXQ7CisKKyAgICB3aGlsZSAoIWRvbmUpIHsKKyAgICAgICAgdWludDMyX3Qgc2lnLCBzaXplOworCisgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgICAgIHNpZyAgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBzaXplID0gYXZpb19yYjMyKHBiKTsKKworICAgICAgICBzd2l0Y2ggKHNpZykgeworICAgICAgICBjYXNlIE1LQkVUQUcoJ0YnLCAnUicsICdNJywgJ0UnKToKKyAgICAgICAgICAgIGlmIChzbXVzaC0+dmVyc2lvbikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBzaXplKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc211c2gtPnZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtCRVRBRygnQicsICdsJywgJzEnLCAnNicpOgorICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIHNpemUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzbXVzaC0+dmlkZW9fc3RyZWFtX2luZGV4OworICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IDE7CisgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LQkVUQUcoJ1cnLCAnYScsICd2JywgJ2UnKToKKyAgICAgICAgICAgIGlmIChzaXplIDwgMTMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAoYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBzaXplKSA8IDEzKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc211c2gtPmF1ZGlvX3N0cmVhbV9pbmRleDsKKyAgICAgICAgICAgIHBrdC0+ZmxhZ3MgICAgICAgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiAgICAgPSBBVl9SQjMyKHBrdC0+ZGF0YSk7CisgICAgICAgICAgICBpZiAocGt0LT5kdXJhdGlvbiA9PSAweEZGRkZGRkZGdSkKKyAgICAgICAgICAgICAgICBwa3QtPmR1cmF0aW9uID0gQVZfUkIzMihwa3QtPmRhdGEgKyA4KTsKKyAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zbXVzaF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzbXVzaCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkx1Y2FzQXJ0cyBTbXVzaCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTTVVTSENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHNtdXNoX3JlYWRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gc211c2hfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gc211c2hfcmVhZF9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NvbC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDM0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc29sLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBTaWVycmEgU09MIGRlbXV4ZXIKKyAqIENvcHlyaWdodCBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBCYXNlZCBvbiBkb2N1bWVudHMgZnJvbSBHYW1lIEF1ZGlvIFBsYXllciBhbmQgb3duIHJlc2VhcmNoCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicGNtLmgiCisKKy8qIGlmIHdlIGRvbid0IGtub3cgdGhlIHNpemUgaW4gYWR2YW5jZSAqLworI2RlZmluZSBBVV9VTktOT1dOX1NJWkUgKCh1aW50MzJfdCkofjApKQorCitzdGF0aWMgaW50IHNvbF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICAvKiBjaGVjayBmaWxlIGhlYWRlciAqLworICAgIHVpbnQxNl90IG1hZ2ljID0gQVZfUkwzMihwLT5idWYpOworICAgIGlmICgobWFnaWMgPT0gMHgwQjhEIHx8IG1hZ2ljID09IDB4MEMwRCB8fCBtYWdpYyA9PSAweDBDOEQpICYmCisgICAgICAgIHAtPmJ1ZlsyXSA9PSAnUycgJiYgcC0+YnVmWzNdID09ICdPJyAmJgorICAgICAgICBwLT5idWZbNF0gPT0gJ0wnICYmIHAtPmJ1Zls1XSA9PSAwKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBTT0xfRFBDTSAgICAxCisjZGVmaW5lIFNPTF8xNkJJVCAgIDQKKyNkZWZpbmUgU09MX1NURVJFTyAxNgorCitzdGF0aWMgZW51bSBBVkNvZGVjSUQgc29sX2NvZGVjX2lkKGludCBtYWdpYywgaW50IHR5cGUpCit7CisgICAgaWYgKHR5cGUgJiBTT0xfRFBDTSkKKyAgICAgICAgcmV0dXJuIEFWX0NPREVDX0lEX1NPTF9EUENNOworCisgICAgaWYgKG1hZ2ljID09IDB4MEI4RCkKKyAgICAgICAgcmV0dXJuIEFWX0NPREVDX0lEX1BDTV9VODsKKworICAgIGlmICh0eXBlICYgU09MXzE2QklUKQorICAgICAgICByZXR1cm4gQVZfQ09ERUNfSURfUENNX1MxNkxFOworCisgICAgcmV0dXJuIEFWX0NPREVDX0lEX1BDTV9VODsKK30KKworc3RhdGljIGludCBzb2xfY29kZWNfdHlwZShpbnQgbWFnaWMsIGludCB0eXBlKQoreworICAgIGlmIChtYWdpYyA9PSAweDBCOEQpIHJldHVybiAxOy8vU09MX0RQQ01fT0xEOworICAgIGlmICh0eXBlICYgU09MX0RQQ00pCisgICAgeworICAgICAgICBpZiAodHlwZSAmIFNPTF8xNkJJVCkgcmV0dXJuIDM7Ly9TT0xfRFBDTV9ORVcxNjsKKyAgICAgICAgZWxzZSBpZiAobWFnaWMgPT0gMHgwQzhEKSByZXR1cm4gMTsvL1NPTF9EUENNX09MRDsKKyAgICAgICAgZWxzZSByZXR1cm4gMjsvL1NPTF9EUENNX05FVzg7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzb2xfY2hhbm5lbHMoaW50IG1hZ2ljLCBpbnQgdHlwZSkKK3sKKyAgICBpZiAobWFnaWMgPT0gMHgwQjhEIHx8ICEodHlwZSAmIFNPTF9TVEVSRU8pKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMjsKK30KKworc3RhdGljIGludCBzb2xfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHVuc2lnbmVkIGludCBtYWdpYyx0YWc7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgdW5zaWduZWQgaW50IGlkLCBjaGFubmVscywgcmF0ZSwgdHlwZTsKKyAgICBlbnVtIEFWQ29kZWNJRCBjb2RlYzsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICAvKiBjaGVjayAiLnNuZCIgaGVhZGVyICovCisgICAgbWFnaWMgPSBhdmlvX3JsMTYocGIpOworICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKHRhZyAhPSBNS1RBRygnUycsICdPJywgJ0wnLCAwKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJhdGUgPSBhdmlvX3JsMTYocGIpOworICAgIHR5cGUgPSBhdmlvX3I4KHBiKTsKKyAgICBhdmlvX3NraXAocGIsIDQpOyAvKiBzaXplICovCisgICAgaWYgKG1hZ2ljICE9IDB4MEI4RCkKKyAgICAgICAgYXZpb19yOChwYik7IC8qIG5ld2VyIFNPTHMgY29udGFpbiBwYWRkaW5nIGJ5dGUgKi8KKworICAgIGNvZGVjID0gc29sX2NvZGVjX2lkKG1hZ2ljLCB0eXBlKTsKKyAgICBjaGFubmVscyA9IHNvbF9jaGFubmVscyhtYWdpYywgdHlwZSk7CisKKyAgICBpZiAoY29kZWMgPT0gQVZfQ09ERUNfSURfU09MX0RQQ00pCisgICAgICAgIGlkID0gc29sX2NvZGVjX3R5cGUobWFnaWMsIHR5cGUpOworICAgIGVsc2UgaWQgPSAwOworCisgICAgLyogbm93IHdlIGFyZSByZWFkeTogYnVpbGQgZm9ybWF0IHN0cmVhbXMgKi8KKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IGlkOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBjb2RlYzsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IGNoYW5uZWxzID09IDEgPyBBVl9DSF9MQVlPVVRfTU9OTyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSByYXRlOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCByYXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBNQVhfU0laRSA0MDk2CisKK3N0YXRpYyBpbnQgc29sX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGF2aW9fZmVvZihzLT5wYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgcmV0PSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIE1BWF9TSVpFKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwa3QtPmZsYWdzICY9IH5BVl9QS1RfRkxBR19DT1JSVVBUOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zb2xfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic29sIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2llcnJhIFNPTCIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHNvbF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBzb2xfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gc29sX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IGZmX3BjbV9yZWFkX3NlZWssCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NveC5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YTEyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc294LmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIFNvWCBuYXRpdmUgZm9ybWF0IGNvbW1vbiBkYXRhCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRGFuaWVsIFZlcmthbXAgPGRhbmllbEBkcnYubnU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfU09YX0gKKyNkZWZpbmUgQVZGT1JNQVRfU09YX0gKKworI2RlZmluZSBTT1hfRklYRURfSERSICg0ICsgOCArIDggKyA0ICsgNCkgLyoqPCBTaXplIG9mIGZpeGVkIGhlYWRlciB3aXRob3V0IG1hZ2ljICovCisKKyNkZWZpbmUgU09YX1RBRyBNS1RBRygnLicsICdTJywgJ28nLCAnWCcpCisKKyNlbmRpZiAvKiBBVkZPUk1BVF9TT1hfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NveGRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NveGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYzQyODQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc294ZGVjLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBTb1ggbmF0aXZlIGZvcm1hdCBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRGFuaWVsIFZlcmthbXAgPGRhbmllbEBkcnYubnU+CisgKgorICogQmFzZWQgb24gbGliU29YIHNveC1mbXQuYworICogQ29weXJpZ2h0IChjKSAyMDA4IHJvYnNAdXNlcnMuc291cmNlZm9yZ2UubmV0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNvWCBuYXRpdmUgZm9ybWF0IGRlbXV4ZXIKKyAqIEBhdXRob3IgRGFuaWVsIFZlcmthbXAKKyAqIEBzZWUgaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9U29YX25hdGl2ZV9pbnRlcm1lZGlhdGVfZm9ybWF0CisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwY20uaCIKKyNpbmNsdWRlICJzb3guaCIKKworc3RhdGljIGludCBzb3hfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKEFWX1JMMzIocC0+YnVmKSA9PSBTT1hfVEFHIHx8IEFWX1JCMzIocC0+YnVmKSA9PSBTT1hfVEFHKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc294X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1bnNpZ25lZCBoZWFkZXJfc2l6ZSwgY29tbWVudF9zaXplOworICAgIGRvdWJsZSBzYW1wbGVfcmF0ZSwgc2FtcGxlX3JhdGVfZnJhYzsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKworICAgIGlmIChhdmlvX3JsMzIocGIpID09IFNPWF9UQUcpIHsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMzJMRTsKKyAgICAgICAgaGVhZGVyX3NpemUgICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGF2aW9fc2tpcChwYiwgOCk7IC8qIHNhbXBsZSBjb3VudCAqLworICAgICAgICBzYW1wbGVfcmF0ZSAgICAgICAgID0gYXZfaW50MmRvdWJsZShhdmlvX3JsNjQocGIpKTsKKyAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGNvbW1lbnRfc2l6ZSAgICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzMyQkU7CisgICAgICAgIGhlYWRlcl9zaXplICAgICAgICAgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBhdmlvX3NraXAocGIsIDgpOyAvKiBzYW1wbGUgY291bnQgKi8KKyAgICAgICAgc2FtcGxlX3JhdGUgICAgICAgICA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7CisgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBjb21tZW50X3NpemUgICAgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICB9CisKKyAgICBpZiAoY29tbWVudF9zaXplID4gMHhGRkZGRkZGRlUgLSBTT1hfRklYRURfSERSIC0gNFUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgY29tbWVudCBzaXplICgldSlcbiIsIGNvbW1lbnRfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzYW1wbGVfcmF0ZSA8PSAwIHx8IHNhbXBsZV9yYXRlID4gSU5UX01BWCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBzYW1wbGUgcmF0ZSAoJWYpXG4iLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHNhbXBsZV9yYXRlX2ZyYWMgPSBzYW1wbGVfcmF0ZSAtIGZsb29yKHNhbXBsZV9yYXRlKTsKKyAgICBpZiAoc2FtcGxlX3JhdGVfZnJhYykKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgInRydW5jYXRpbmcgZnJhY3Rpb25hbCBwYXJ0IG9mIHNhbXBsZSByYXRlICglZilcbiIsCisgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZV9mcmFjKTsKKworICAgIGlmICgoaGVhZGVyX3NpemUgKyA0KSAmIDcgfHwgaGVhZGVyX3NpemUgPCBTT1hfRklYRURfSERSICsgY29tbWVudF9zaXplCisgICAgICAgIHx8IHN0LT5jb2RlYy0+Y2hhbm5lbHMgPiA2NTUzNSkgLyogUmVzZXJ2ZSB0b3AgMTYgYml0cyAqLyB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChjb21tZW50X3NpemUgJiYgY29tbWVudF9zaXplIDwgVUlOVF9NQVgpIHsKKyAgICAgICAgY2hhciAqY29tbWVudCA9IGF2X21hbGxvYyhjb21tZW50X3NpemUrMSk7CisgICAgICAgIGlmKCFjb21tZW50KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgY29tbWVudCwgY29tbWVudF9zaXplKSAhPSBjb21tZW50X3NpemUpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZjb21tZW50KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKyAgICAgICAgY29tbWVudFtjb21tZW50X3NpemVdID0gMDsKKworICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJjb21tZW50IiwgY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgfQorCisgICAgYXZpb19za2lwKHBiLCBoZWFkZXJfc2l6ZSAtIFNPWF9GSVhFRF9IRFIgLSBjb21tZW50X3NpemUpOworCisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSBzYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDMyOworICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICAgICAgICAgICAgID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gICAgICAgICAgID0gc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAvIDg7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zb3hfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic294IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU29YIG5hdGl2ZSIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHNveF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBzb3hfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmZfcGNtX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IGZmX3BjbV9yZWFkX3NlZWssCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NveGVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NveGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YWYxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc294ZW5jLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBTb1ggbmF0aXZlIGZvcm1hdCBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IERhbmllbCBWZXJrYW1wIDxkYW5pZWxAZHJ2Lm51PgorICoKKyAqIEJhc2VkIG9uIGxpYlNvWCBzb3gtZm10LmMKKyAqIENvcHlyaWdodCAoYykgMjAwOCByb2JzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTb1ggbmF0aXZlIGZvcm1hdCBtdXhlcgorICogQGF1dGhvciBEYW5pZWwgVmVya2FtcAorICogQHNlZSBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1Tb1hfbmF0aXZlX2ludGVybWVkaWF0ZV9mb3JtYXQKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAicmF3ZW5jLmgiCisjaW5jbHVkZSAic294LmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQ2NF90IGhlYWRlcl9zaXplOworfSBTb1hDb250ZXh0OworCitzdGF0aWMgaW50IHNveF93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNvWENvbnRleHQgKnNveCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmNvbW1lbnQ7CisgICAgc2l6ZV90IGNvbW1lbnRfbGVuID0gMCwgY29tbWVudF9zaXplOworCisgICAgY29tbWVudCA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiY29tbWVudCIsIE5VTEwsIDApOworICAgIGlmIChjb21tZW50KQorICAgICAgICBjb21tZW50X2xlbiA9IHN0cmxlbihjb21tZW50LT52YWx1ZSk7CisgICAgY29tbWVudF9zaXplID0gRkZBTElHTihjb21tZW50X2xlbiwgOCk7CisKKyAgICBzb3gtPmhlYWRlcl9zaXplID0gU09YX0ZJWEVEX0hEUiArIGNvbW1lbnRfc2l6ZTsKKworICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMzJMRSkgeworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICIuU29YIik7CisgICAgICAgIGF2aW9fd2wzMihwYiwgc294LT5oZWFkZXJfc2l6ZSk7CisgICAgICAgIGF2aW9fd2w2NChwYiwgMCk7IC8qIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgICAgIGF2aW9fd2w2NChwYiwgYXZfZG91YmxlMmludChlbmMtPnNhbXBsZV9yYXRlKSk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgZW5jLT5jaGFubmVscyk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgY29tbWVudF9zaXplKTsKKyAgICB9IGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MzMkJFKSB7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgIlhvUy4iKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBzb3gtPmhlYWRlcl9zaXplKTsKKyAgICAgICAgYXZpb193YjY0KHBiLCAwKTsgLyogbnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICAgICAgYXZpb193YjY0KHBiLCBhdl9kb3VibGUyaW50KGVuYy0+c2FtcGxlX3JhdGUpKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBlbmMtPmNoYW5uZWxzKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBjb21tZW50X3NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGNvZGVjOyB1c2UgcGNtX3MzMmxlIG9yIHBjbV9zMzJiZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGNvbW1lbnRfbGVuKQorICAgICAgICBhdmlvX3dyaXRlKHBiLCBjb21tZW50LT52YWx1ZSwgY29tbWVudF9sZW4pOworCisgICAgZmZpb19maWxsKHBiLCAwLCBjb21tZW50X3NpemUgLSBjb21tZW50X2xlbik7CisKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNveF93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBTb1hDb250ZXh0ICpzb3ggPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworCisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSkgeworICAgICAgICAvKiB1cGRhdGUgbnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICAgICAgaW50NjRfdCBmaWxlX3NpemUgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBpbnQ2NF90IG51bV9zYW1wbGVzID0gKGZpbGVfc2l6ZSAtIHNveC0+aGVhZGVyX3NpemUgLSA0TEwpID4+IDJMTDsKKyAgICAgICAgYXZpb19zZWVrKHBiLCA4LCBTRUVLX1NFVCk7CisgICAgICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMzJMRSkgeworICAgICAgICAgICAgYXZpb193bDY0KHBiLCBudW1fc2FtcGxlcyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYXZpb193YjY0KHBiLCBudW1fc2FtcGxlcyk7CisgICAgICAgIGF2aW9fc2VlayhwYiwgZmlsZV9zaXplLCBTRUVLX1NFVCk7CisKKyAgICAgICAgYXZpb19mbHVzaChwYik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3NveF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAic294IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU29YIG5hdGl2ZSIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJzb3giLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihTb1hDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzMyTEUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBzb3hfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgICAgID0gc294X3dyaXRlX3RyYWlsZXIsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9zcGRpZi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NwZGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0MTQxYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zcGRpZi5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBJRUMgNjE5MzcgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMjAwOSBCYXJ0bG9taWVqIFdvbG93aWVjCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJzcGRpZi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorCisvL1RPRE8gbW92ZSB0byBEU1AKK3ZvaWQgZmZfc3BkaWZfYnN3YXBfYnVmMTYodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgaW50IHcpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpICsgOCA8PSB3OyBpICs9IDgpIHsKKyAgICAgICAgZHN0W2kgKyAwXSA9IGF2X2Jzd2FwMTYoc3JjW2kgKyAwXSk7CisgICAgICAgIGRzdFtpICsgMV0gPSBhdl9ic3dhcDE2KHNyY1tpICsgMV0pOworICAgICAgICBkc3RbaSArIDJdID0gYXZfYnN3YXAxNihzcmNbaSArIDJdKTsKKyAgICAgICAgZHN0W2kgKyAzXSA9IGF2X2Jzd2FwMTYoc3JjW2kgKyAzXSk7CisgICAgICAgIGRzdFtpICsgNF0gPSBhdl9ic3dhcDE2KHNyY1tpICsgNF0pOworICAgICAgICBkc3RbaSArIDVdID0gYXZfYnN3YXAxNihzcmNbaSArIDVdKTsKKyAgICAgICAgZHN0W2kgKyA2XSA9IGF2X2Jzd2FwMTYoc3JjW2kgKyA2XSk7CisgICAgICAgIGRzdFtpICsgN10gPSBhdl9ic3dhcDE2KHNyY1tpICsgN10pOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHc7IGkrKykKKyAgICAgICAgZHN0W2kgKyAwXSA9IGF2X2Jzd2FwMTYoc3JjW2kgKyAwXSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc3BkaWYuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zcGRpZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTRmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3BkaWYuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogSUVDIDYxOTM3IGNvbW1vbiBoZWFkZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBCYXJ0bG9taWVqIFdvbG93aWVjCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfU1BESUZfSAorI2RlZmluZSBBVkZPUk1BVF9TUERJRl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCisjZGVmaW5lIFNZTkNXT1JEMSAweEY4NzIKKyNkZWZpbmUgU1lOQ1dPUkQyIDB4NEUxRgorI2RlZmluZSBCVVJTVF9IRUFERVJfU0laRSAweDgKKworZW51bSBJRUM2MTkzN0RhdGFUeXBlIHsKKyAgICBJRUM2MTkzN19BQzMgICAgICAgICAgICAgICAgPSAweDAxLCAgICAgICAgICAvLy88IEFDLTMgZGF0YQorICAgIElFQzYxOTM3X01QRUcxX0xBWUVSMSAgICAgICA9IDB4MDQsICAgICAgICAgIC8vLzwgTVBFRy0xIGxheWVyIDEKKyAgICBJRUM2MTkzN19NUEVHMV9MQVlFUjIzICAgICAgPSAweDA1LCAgICAgICAgICAvLy88IE1QRUctMSBsYXllciAyIG9yIDMgZGF0YSBvciBNUEVHLTIgd2l0aG91dCBleHRlbnNpb24KKyAgICBJRUM2MTkzN19NUEVHMl9FWFQgICAgICAgICAgPSAweDA2LCAgICAgICAgICAvLy88IE1QRUctMiBkYXRhIHdpdGggZXh0ZW5zaW9uCisgICAgSUVDNjE5MzdfTVBFRzJfQUFDICAgICAgICAgID0gMHgwNywgICAgICAgICAgLy8vPCBNUEVHLTIgQUFDIEFEVFMKKyAgICBJRUM2MTkzN19NUEVHMl9MQVlFUjFfTFNGICAgPSAweDA4LCAgICAgICAgICAvLy88IE1QRUctMiwgbGF5ZXItMSBsb3cgc2FtcGxpbmcgZnJlcXVlbmN5CisgICAgSUVDNjE5MzdfTVBFRzJfTEFZRVIyX0xTRiAgID0gMHgwOSwgICAgICAgICAgLy8vPCBNUEVHLTIsIGxheWVyLTIgbG93IHNhbXBsaW5nIGZyZXF1ZW5jeQorICAgIElFQzYxOTM3X01QRUcyX0xBWUVSM19MU0YgICA9IDB4MEEsICAgICAgICAgIC8vLzwgTVBFRy0yLCBsYXllci0zIGxvdyBzYW1wbGluZyBmcmVxdWVuY3kKKyAgICBJRUM2MTkzN19EVFMxICAgICAgICAgICAgICAgPSAweDBCLCAgICAgICAgICAvLy88IERUUyB0eXBlIEkgICAoNTEyIHNhbXBsZXMpCisgICAgSUVDNjE5MzdfRFRTMiAgICAgICAgICAgICAgID0gMHgwQywgICAgICAgICAgLy8vPCBEVFMgdHlwZSBJSSAgKDEwMjQgc2FtcGxlcykKKyAgICBJRUM2MTkzN19EVFMzICAgICAgICAgICAgICAgPSAweDBELCAgICAgICAgICAvLy88IERUUyB0eXBlIElJSSAoMjA0OCBzYW1wbGVzKQorICAgIElFQzYxOTM3X0FUUkFDICAgICAgICAgICAgICA9IDB4MEUsICAgICAgICAgIC8vLzwgQVRSQUMgZGF0YQorICAgIElFQzYxOTM3X0FUUkFDMyAgICAgICAgICAgICA9IDB4MEYsICAgICAgICAgIC8vLzwgQVRSQUMzIGRhdGEKKyAgICBJRUM2MTkzN19BVFJBQ1ggICAgICAgICAgICAgPSAweDEwLCAgICAgICAgICAvLy88IEFUUkFDMysgZGF0YQorICAgIElFQzYxOTM3X0RUU0hEICAgICAgICAgICAgICA9IDB4MTEsICAgICAgICAgIC8vLzwgRFRTIEhEIGRhdGEKKyAgICBJRUM2MTkzN19XTUFQUk8gICAgICAgICAgICAgPSAweDEyLCAgICAgICAgICAvLy88IFdNQSA5IFByb2Zlc3Npb25hbCBkYXRhCisgICAgSUVDNjE5MzdfTVBFRzJfQUFDX0xTRl8yMDQ4ID0gMHgxMywgICAgICAgICAgLy8vPCBNUEVHLTIgQUFDIEFEVFMgaGFsZi1yYXRlIGxvdyBzYW1wbGluZyBmcmVxdWVuY3kKKyAgICBJRUM2MTkzN19NUEVHMl9BQUNfTFNGXzQwOTYgPSAweDEzIHwgMHgyMCwgICAvLy88IE1QRUctMiBBQUMgQURUUyBxdWFydGVyLXJhdGUgbG93IHNhbXBsaW5nIGZyZXF1ZW5jeQorICAgIElFQzYxOTM3X0VBQzMgICAgICAgICAgICAgICA9IDB4MTUsICAgICAgICAgIC8vLzwgRS1BQy0zIGRhdGEKKyAgICBJRUM2MTkzN19UUlVFSEQgICAgICAgICAgICAgPSAweDE2LCAgICAgICAgICAvLy88IFRydWVIRCBkYXRhCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc3BkaWZfbXBlZ19wa3Rfb2Zmc2V0WzJdWzNdID0geworICAgIC8vTEFZRVIxICBMQVlFUjIgIExBWUVSMworICAgIHsgMzA3MiwgICAgOTIxNiwgICA0NjA4IH0sIC8vIE1QRUcyIExTRgorICAgIHsgMTUzNiwgICAgNDYwOCwgICA0NjA4IH0sIC8vIE1QRUcxCit9OworCit2b2lkIGZmX3NwZGlmX2Jzd2FwX2J1ZjE2KHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMsIGludCB3KTsKK2ludCBmZl9zcGRpZl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpOworaW50IGZmX3NwZGlmX3Byb2JlKGNvbnN0IHVpbnQ4X3QgKnBfYnVmLCBpbnQgYnVmX3NpemUsIGVudW0gQVZDb2RlY0lEICpjb2RlYyk7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9TUERJRl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc3BkaWZkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zcGRpZmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDRhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3BkaWZkZWMuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIElFQyA2MTkzNyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYSBhdCBpa2kuZmk+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIElFQyA2MTkzNyBkZW11eGVyLCB1c2VkIGZvciBjb21wcmVzc2VkIGRhdGEgaW4gUy9QRElGCisgKiBAYXV0aG9yIEFuc3NpIEhhbm51bGEKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJzcGRpZi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYWMzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYWNhZHRzZGVjLmgiCisKK3N0YXRpYyBpbnQgc3BkaWZfZ2V0X29mZnNldF9hbmRfY29kZWMoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIElFQzYxOTM3RGF0YVR5cGUgZGF0YV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIGludCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWQ29kZWNJRCAqY29kZWMpCit7CisgICAgQUFDQURUU0hlYWRlckluZm8gYWFjX2hkcjsKKyAgICBHZXRCaXRDb250ZXh0IGdiYzsKKworICAgIHN3aXRjaCAoZGF0YV90eXBlICYgMHhmZikgeworICAgIGNhc2UgSUVDNjE5MzdfQUMzOgorICAgICAgICAqb2Zmc2V0ID0gQUMzX0ZSQU1FX1NJWkUgPDwgMjsKKyAgICAgICAgKmNvZGVjID0gQVZfQ09ERUNfSURfQUMzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElFQzYxOTM3X01QRUcxX0xBWUVSMToKKyAgICAgICAgKm9mZnNldCA9IHNwZGlmX21wZWdfcGt0X29mZnNldFsxXVswXTsKKyAgICAgICAgKmNvZGVjID0gQVZfQ09ERUNfSURfTVAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElFQzYxOTM3X01QRUcxX0xBWUVSMjM6CisgICAgICAgICpvZmZzZXQgPSBzcGRpZl9tcGVnX3BrdF9vZmZzZXRbMV1bMF07CisgICAgICAgICpjb2RlYyA9IEFWX0NPREVDX0lEX01QMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJRUM2MTkzN19NUEVHMl9FWFQ6CisgICAgICAgICpvZmZzZXQgPSA0NjA4OworICAgICAgICAqY29kZWMgPSBBVl9DT0RFQ19JRF9NUDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUVDNjE5MzdfTVBFRzJfQUFDOgorICAgICAgICBpbml0X2dldF9iaXRzKCZnYmMsIGJ1ZiwgQUFDX0FEVFNfSEVBREVSX1NJWkUgKiA4KTsKKyAgICAgICAgaWYgKGF2cHJpdl9hYWNfcGFyc2VfaGVhZGVyKCZnYmMsICZhYWNfaGRyKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChzKSAvKiBiZSBzaWxlbnQgZHVyaW5nIGEgcHJvYmUgKi8KKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBBQUMgcGFja2V0IGluIElFQyA2MTkzN1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICAqb2Zmc2V0ID0gYWFjX2hkci5zYW1wbGVzIDw8IDI7CisgICAgICAgICpjb2RlYyA9IEFWX0NPREVDX0lEX0FBQzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJRUM2MTkzN19NUEVHMl9MQVlFUjFfTFNGOgorICAgICAgICAqb2Zmc2V0ID0gc3BkaWZfbXBlZ19wa3Rfb2Zmc2V0WzBdWzBdOworICAgICAgICAqY29kZWMgPSBBVl9DT0RFQ19JRF9NUDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUVDNjE5MzdfTVBFRzJfTEFZRVIyX0xTRjoKKyAgICAgICAgKm9mZnNldCA9IHNwZGlmX21wZWdfcGt0X29mZnNldFswXVsxXTsKKyAgICAgICAgKmNvZGVjID0gQVZfQ09ERUNfSURfTVAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElFQzYxOTM3X01QRUcyX0xBWUVSM19MU0Y6CisgICAgICAgICpvZmZzZXQgPSBzcGRpZl9tcGVnX3BrdF9vZmZzZXRbMF1bMl07CisgICAgICAgICpjb2RlYyA9IEFWX0NPREVDX0lEX01QMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJRUM2MTkzN19EVFMxOgorICAgICAgICAqb2Zmc2V0ID0gMjA0ODsKKyAgICAgICAgKmNvZGVjID0gQVZfQ09ERUNfSURfRFRTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElFQzYxOTM3X0RUUzI6CisgICAgICAgICpvZmZzZXQgPSA0MDk2OworICAgICAgICAqY29kZWMgPSBBVl9DT0RFQ19JRF9EVFM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUVDNjE5MzdfRFRTMzoKKyAgICAgICAgKm9mZnNldCA9IDgxOTI7CisgICAgICAgICpjb2RlYyA9IEFWX0NPREVDX0lEX0RUUzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHMpIHsgLyogYmUgc2lsZW50IGR1cmluZyBhIHByb2JlICovCisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIkRhdGEgdHlwZSAweCUwNHggaW4gSUVDIDYxOTM3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIExhcmdlc3Qgb2Zmc2V0IGJldHdlZW4gYnVyc3RzIHdlIGN1cnJlbnRseSBoYW5kbGUsIGkuZS4gQUFDIHdpdGgKKyAgIGFhY19oZHIuc2FtcGxlcyA9IDQwOTYgKi8KKyNkZWZpbmUgU1BESUZfTUFYX09GRlNFVCAxNjM4NAorCitzdGF0aWMgaW50IHNwZGlmX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjOworICAgIHJldHVybiBmZl9zcGRpZl9wcm9iZSAocC0+YnVmLCBwLT5idWZfc2l6ZSwgJmNvZGVjKTsKK30KKworaW50IGZmX3NwZGlmX3Byb2JlKGNvbnN0IHVpbnQ4X3QgKnBfYnVmLCBpbnQgYnVmX3NpemUsIGVudW0gQVZDb2RlY0lEICpjb2RlYykKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBwX2J1ZjsKKyAgICBjb25zdCB1aW50OF90ICpwcm9iZV9lbmQgPSBwX2J1ZiArIEZGTUlOKDIgKiBTUERJRl9NQVhfT0ZGU0VULCBidWZfc2l6ZSAtIDEpOworICAgIGNvbnN0IHVpbnQ4X3QgKmV4cGVjdGVkX2NvZGUgPSBidWYgKyA3OworICAgIHVpbnQzMl90IHN0YXRlID0gMDsKKyAgICBpbnQgc3luY19jb2RlcyA9IDA7CisgICAgaW50IGNvbnNlY3V0aXZlX2NvZGVzID0gMDsKKyAgICBpbnQgb2Zmc2V0OworCisgICAgZm9yICg7IGJ1ZiA8IHByb2JlX2VuZDsgYnVmKyspIHsKKyAgICAgICAgc3RhdGUgPSAoc3RhdGUgPDwgOCkgfCAqYnVmOworCisgICAgICAgIGlmIChzdGF0ZSA9PSAoQVZfQlNXQVAxNkMoU1lOQ1dPUkQxKSA8PCAxNiB8IEFWX0JTV0FQMTZDKFNZTkNXT1JEMikpCisgICAgICAgICAgICAgICAgJiYgYnVmWzFdIDwgMHgzNykgeworICAgICAgICAgICAgc3luY19jb2RlcysrOworCisgICAgICAgICAgICBpZiAoYnVmID09IGV4cGVjdGVkX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKytjb25zZWN1dGl2ZV9jb2RlcyA+PSAyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZV9jb2RlcyA9IDA7CisKKyAgICAgICAgICAgIGlmIChidWYgKyA0ICsgQUFDX0FEVFNfSEVBREVSX1NJWkUgPiBwX2J1ZiArIGJ1Zl9zaXplKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBjb250aW51ZSBwcm9iaW5nIHRvIGZpbmQgbW9yZSBzeW5jIGNvZGVzICovCisgICAgICAgICAgICBwcm9iZV9lbmQgPSBGRk1JTihidWYgKyBTUERJRl9NQVhfT0ZGU0VULCBwX2J1ZiArIGJ1Zl9zaXplIC0gMSk7CisKKyAgICAgICAgICAgIC8qIHNraXAgZGlyZWN0bHkgdG8gdGhlIG5leHQgc3luYyBjb2RlICovCisgICAgICAgICAgICBpZiAoIXNwZGlmX2dldF9vZmZzZXRfYW5kX2NvZGVjKE5VTEwsIChidWZbMl0gPDwgOCkgfCBidWZbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZbNV0sICZvZmZzZXQsIGNvZGVjKSkgeworICAgICAgICAgICAgICAgIGlmIChidWYgKyBvZmZzZXQgPj0gcF9idWYgKyBidWZfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfY29kZSA9IGJ1ZiArIG9mZnNldDsKKyAgICAgICAgICAgICAgICBidWYgPSBleHBlY3RlZF9jb2RlIC0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc3luY19jb2RlcykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoc3luY19jb2RlcyA+PSA2KQorICAgICAgICAvKiBnb29kIGFtb3VudCBvZiBzeW5jIGNvZGVzIGJ1dCB3aXRoIHVuZXhwZWN0ZWQgb2Zmc2V0cyAqLworICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047CisKKyAgICAvKiBzb21lIHN5bmMgY29kZXMgd2VyZSBmb3VuZCAqLworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDQ7Cit9CisKK3N0YXRpYyBpbnQgc3BkaWZfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHMtPmN0eF9mbGFncyB8PSBBVkZNVENUWF9OT0hFQURFUjsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3NwZGlmX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBlbnVtIElFQzYxOTM3RGF0YVR5cGUgZGF0YV90eXBlOworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkOworICAgIHVpbnQzMl90IHN0YXRlID0gMDsKKyAgICBpbnQgcGt0X3NpemVfYml0cywgb2Zmc2V0LCByZXQ7CisKKyAgICB3aGlsZSAoc3RhdGUgIT0gKEFWX0JTV0FQMTZDKFNZTkNXT1JEMSkgPDwgMTYgfCBBVl9CU1dBUDE2QyhTWU5DV09SRDIpKSkgeworICAgICAgICBzdGF0ZSA9IChzdGF0ZSA8PCA4KSB8IGF2aW9fcjgocGIpOworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisKKyAgICBkYXRhX3R5cGUgPSBhdmlvX3JsMTYocGIpOworICAgIHBrdF9zaXplX2JpdHMgPSBhdmlvX3JsMTYocGIpOworCisgICAgaWYgKHBrdF9zaXplX2JpdHMgJSAxNikKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJQYWNrZXQgbm90IGVuZGluZyBhdCBhIDE2LWJpdCBib3VuZGFyeSIpOworCisgICAgcmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIEZGQUxJR04ocGt0X3NpemVfYml0cywgMTYpID4+IDMpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QtPnBvcyA9IGF2aW9fdGVsbChwYikgLSBCVVJTVF9IRUFERVJfU0laRTsKKworICAgIGlmIChhdmlvX3JlYWQocGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKSA8IHBrdC0+c2l6ZSkgeworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQorICAgIGZmX3NwZGlmX2Jzd2FwX2J1ZjE2KCh1aW50MTZfdCAqKXBrdC0+ZGF0YSwgKHVpbnQxNl90ICopcGt0LT5kYXRhLCBwa3QtPnNpemUgPj4gMSk7CisKKyAgICByZXQgPSBzcGRpZl9nZXRfb2Zmc2V0X2FuZF9jb2RlYyhzLCBkYXRhX3R5cGUsIHBrdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LCAmY29kZWNfaWQpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBza2lwIG92ZXIgdGhlIHBhZGRpbmcgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBmcmFtZSAqLworICAgIGF2aW9fc2tpcChwYiwgb2Zmc2V0IC0gcGt0LT5zaXplIC0gQlVSU1RfSEVBREVSX1NJWkUpOworCisgICAgaWYgKCFzLT5uYl9zdHJlYW1zKSB7CisgICAgICAgIC8qIGZpcnN0IHBhY2tldCwgY3JlYXRlIGEgc3RyZWFtICovCisgICAgICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghc3QpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGNvZGVjX2lkOworICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgIT0gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMsICJDb2RlYyBjaGFuZ2UgaW4gSUVDIDYxOTM3Iik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoIXMtPmJpdF9yYXRlICYmIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgLyogc3RyZWFtIGJpdHJhdGUgbWF0Y2hlcyAxNi1iaXQgc3RlcmVvIFBDTSBiaXRyYXRlIGZvciBjdXJyZW50bHkKKyAgICAgICAgICAgc3VwcG9ydGVkIGNvZGVjcyAqLworICAgICAgICBzLT5iaXRfcmF0ZSA9IDIgKiAxNiAqIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5zYW1wbGVfcmF0ZTsKKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3NwZGlmX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInNwZGlmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSUVDIDYxOTM3IChjb21wcmVzc2VkIGRhdGEgaW4gUy9QRElGKSIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHNwZGlmX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHNwZGlmX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZmX3NwZGlmX3JlYWRfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NwZGlmZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3BkaWZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGFmZDQyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NwZGlmZW5jLmMKQEAgLTAsMCArMSw1NTggQEAKKy8qCisgKiBJRUMgNjE5MzcgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBCYXJ0bG9taWVqIFdvbG93aWVjCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQW5zc2kgSGFubnVsYQorICogQ29weXJpZ2h0IChjKSAyMDEwIENhcmwgRXVnZW4gSG95b3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSUVDLTYxOTM3IGVuY2Fwc3VsYXRpb24gb2YgdmFyaW91cyBmb3JtYXRzLCB1c2VkIGJ5IFMvUERJRgorICogQGF1dGhvciBCYXJ0bG9taWVqIFdvbG93aWVjCisgKiBAYXV0aG9yIEFuc3NpIEhhbm51bGEKKyAqIEBhdXRob3IgQ2FybCBFdWdlbiBIb3lvcworICovCisKKy8qCisgKiBUZXJtaW5vbG9neSB1c2VkIGluIHNwZWNpZmljYXRpb246CisgKiBkYXRhLWJ1cnN0IC0gSUVDNjE5MzcgZnJhbWUsIGNvbnRhaW5zIGhlYWRlciBhbmQgZW5jYXBzdWxlZCBmcmFtZQorICogYnVyc3QtcHJlYW1idWxlIC0gSUVDNjE5MzcgZnJhbWUgaGVhZGVyLCBjb250YWlucyAxNi1iaXRzIHdvcmRzIG5hbWVkIFBhLCBQYiwgUGMgYW5kIFBkCisgKiBidXJzdC1wYXlsb2FkIC0gZW5jYXBzdWxlZCBmcmFtZQorICogUGEsIFBiIC0gc3luY3dvcmQgLSAweEY4NzIsIDB4NEUxRgorICogUGMgLSBidXJzdC1pbmZvLCBjb250YWlucyBkYXRhLXR5cGUgKGJpdHMgMC02KSwgZXJyb3IgZmxhZyAoYml0IDcpLCBkYXRhLXR5cGUtZGVwZW5kZW50IGluZm8gKGJpdHMgOC0xMikKKyAqICAgICAgYW5kIGJpdHN0cmVhbSBudW1iZXIgKGJpdHMgMTMtMTUpCisgKiBkYXRhLXR5cGUgLSBkZXRlcm1pbmVzIHR5cGUgb2YgZW5jYXBzdWxlZCBmcmFtZXMKKyAqIFBkIC0gbGVuZ3RoIGNvZGUgKG51bWJlciBvZiBiaXRzIG9yIGJ5dGVzIG9mIGVuY2Fwc3VsZWQgZnJhbWUgLSBhY2NvcmRpbmcgdG8gZGF0YV90eXBlKQorICoKKyAqIElFQyA2MTkzNyBmcmFtZXMgYXQgbm9ybWFsIHVzYWdlIHN0YXJ0IGV2ZXJ5IHNwZWNpZmljIGNvdW50IG9mIGJ5dGVzLAorICogICAgICBkZXBlbmRlbnQgZnJvbSBkYXRhLXR5cGUgKHNwYWNlcyBiZXR3ZWVuIHBhY2tldHMgYXJlIGZpbGxlZCBieSB6ZXJvcykKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgInNwZGlmLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYzMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2RjYS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYWFjYWR0c2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgSUVDNjE5MzdDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKKyAgICBlbnVtIElFQzYxOTM3RGF0YVR5cGUgZGF0YV90eXBlOy8vLzwgYnVyc3QgaW5mbyAtIHJlZmVyZW5jZSB0byB0eXBlIG9mIHBheWxvYWQgb2YgdGhlIGRhdGEtYnVyc3QKKyAgICBpbnQgbGVuZ3RoX2NvZGU7ICAgICAgICAgICAgICAgIC8vLzwgbGVuZ3RoIGNvZGUgaW4gYml0cyBvciBieXRlcywgZGVwZW5kaW5nIG9uIGRhdGEgdHlwZQorICAgIGludCBwa3Rfb2Zmc2V0OyAgICAgICAgICAgICAgICAgLy8vPCBkYXRhIGJ1cnN0IHJlcGV0aXRpb24gcGVyaW9kIGluIGJ5dGVzCisgICAgdWludDhfdCAqYnVmZmVyOyAgICAgICAgICAgICAgICAvLy88IGFsbG9jYXRlZCBidWZmZXIsIHVzZWQgZm9yIHN3YXAgYnl0ZXMKKyAgICBpbnQgYnVmZmVyX3NpemU7ICAgICAgICAgICAgICAgIC8vLzwgc2l6ZSBvZiBhbGxvY2F0ZWQgYnVmZmVyCisKKyAgICB1aW50OF90ICpvdXRfYnVmOyAgICAgICAgICAgICAgIC8vLzwgcG9pbnRlciB0byB0aGUgb3V0Z29pbmcgZGF0YSBiZWZvcmUgYnl0ZS1zd2FwcGluZworICAgIGludCBvdXRfYnl0ZXM7ICAgICAgICAgICAgICAgICAgLy8vPCBhbW91bnQgb2Ygb3V0Z29pbmcgYnl0ZXMKKworICAgIGludCB1c2VfcHJlYW1ibGU7ICAgICAgICAgICAgICAgLy8vPCBwcmVhbWJsZSBlbmFibGVkIChkaXNhYmxlZCBmb3IgZXhhY3RseSBwcmUtcGFkZGVkIERUUykKKyAgICBpbnQgZXh0cmFfYnN3YXA7ICAgICAgICAgICAgICAgIC8vLzwgZXh0cmEgYnN3YXAgZm9yIHBheWxvYWQgKGZvciBMRSBEVFMgPT4gc3RhbmRhcmQgQkUgRFRTKQorCisgICAgdWludDhfdCAqaGRfYnVmOyAgICAgICAgICAgICAgICAvLy88IGFsbG9jYXRlZCBidWZmZXIgdG8gY29uY2F0ZW5hdGUgaGQgYXVkaW8gZnJhbWVzCisgICAgaW50IGhkX2J1Zl9zaXplOyAgICAgICAgICAgICAgICAvLy88IHNpemUgb2YgdGhlIGhkIGF1ZGlvIGJ1ZmZlcgorICAgIGludCBoZF9idWZfY291bnQ7ICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBoZCBhdWRpbyBidWZmZXIKKyAgICBpbnQgaGRfYnVmX2ZpbGxlZDsgICAgICAgICAgICAgIC8vLzwgYW1vdW50IG9mIGJ5dGVzIGluIHRoZSBoZCBhdWRpbyBidWZmZXIKKworICAgIGludCBkdHNoZF9za2lwOyAgICAgICAgICAgICAgICAgLy8vPCBjb3VudGVyIHVzZWQgZm9yIHNraXBwaW5nIERUUy1IRCBmcmFtZXMKKworICAgIC8qIEFWT3B0aW9uczogKi8KKyAgICBpbnQgZHRzaGRfcmF0ZTsKKyAgICBpbnQgZHRzaGRfZmFsbGJhY2s7CisjZGVmaW5lIFNQRElGX0ZMQUdfQklHRU5ESUFOICAgIDB4MDEKKyAgICBpbnQgc3BkaWZfZmxhZ3M7CisKKyAgICAvLy8gZnVuY3Rpb24sIHdoaWNoIGdlbmVyYXRlcyBjb2RlYyBkZXBlbmRlbnQgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgIC8vLyBTZXRzIGRhdGFfdHlwZSBhbmQgcGt0X29mZnNldCwgYW5kIGxlbmd0aF9jb2RlLCBvdXRfYnl0ZXMsIG91dF9idWYgaWYgbmVjZXNzYXJ5CisgICAgaW50ICgqaGVhZGVyX2luZm8pIChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpOworfSBJRUM2MTkzN0NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7Cit7ICJzcGRpZl9mbGFncyIsICJJRUMgNjE5MzcgZW5jYXBzdWxhdGlvbiBmbGFncyIsIG9mZnNldG9mKElFQzYxOTM3Q29udGV4dCwgc3BkaWZfZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJzcGRpZl9mbGFncyIgfSwKK3sgImJlIiwgIm91dHB1dCBpbiBiaWctZW5kaWFuIGZvcm1hdCAoZm9yIHVzZSBhcyBzMTZiZSkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBTUERJRl9GTEFHX0JJR0VORElBTn0sICAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgInNwZGlmX2ZsYWdzIiB9LAoreyAiZHRzaGRfcmF0ZSIsICJtdXggY29tcGxldGUgRFRTIGZyYW1lcyBpbiBIRCBtb2RlIGF0IHRoZSBzcGVjaWZpZWQgSUVDOTU4IHJhdGUgKGluIEh6LCBkZWZhdWx0IDA9ZGlzYWJsZWQpIiwgb2Zmc2V0b2YoSUVDNjE5MzdDb250ZXh0LCBkdHNoZF9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCA3NjgwMDAsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCit7ICJkdHNoZF9mYWxsYmFja190aW1lIiwgIm1pbiBzZWNzIHRvIHN0cmlwIEhEIGZvciBhZnRlciBhbiBvdmVyZmxvdyAoLTE6IHRpbGwgdGhlIGVuZCwgZGVmYXVsdCA2MCkiLCBvZmZzZXRvZihJRUM2MTkzN0NvbnRleHQsIGR0c2hkX2ZhbGxiYWNrKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDYwfSwgLTEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCit7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHNwZGlmX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICA9ICJzcGRpZiIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgaW50IHNwZGlmX2hlYWRlcl9hYzMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIElFQzYxOTM3Q29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIGludCBiaXRzdHJlYW1fbW9kZSA9IHBrdC0+ZGF0YVs1XSAmIDB4NzsKKworICAgIGN0eC0+ZGF0YV90eXBlICA9IElFQzYxOTM3X0FDMyB8IChiaXRzdHJlYW1fbW9kZSA8PCA4KTsKKyAgICBjdHgtPnBrdF9vZmZzZXQgPSBBQzNfRlJBTUVfU0laRSA8PCAyOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwZGlmX2hlYWRlcl9lYWMzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBJRUM2MTkzN0NvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBlYWMzX3JlcGVhdFs0XSA9IHs2LCAzLCAyLCAxfTsKKyAgICBpbnQgcmVwZWF0ID0gMTsKKworICAgIGlmICgocGt0LT5kYXRhWzRdICYgMHhjMCkgIT0gMHhjMCkgLyogZnNjb2QgKi8KKyAgICAgICAgcmVwZWF0ID0gZWFjM19yZXBlYXRbKHBrdC0+ZGF0YVs0XSAmIDB4MzApID4+IDRdOyAvKiBudW1ibGtzY29kICovCisKKyAgICBjdHgtPmhkX2J1ZiA9IGF2X2Zhc3RfcmVhbGxvYyhjdHgtPmhkX2J1ZiwgJmN0eC0+aGRfYnVmX3NpemUsIGN0eC0+aGRfYnVmX2ZpbGxlZCArIHBrdC0+c2l6ZSk7CisgICAgaWYgKCFjdHgtPmhkX2J1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIG1lbWNweSgmY3R4LT5oZF9idWZbY3R4LT5oZF9idWZfZmlsbGVkXSwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworCisgICAgY3R4LT5oZF9idWZfZmlsbGVkICs9IHBrdC0+c2l6ZTsKKyAgICBpZiAoKytjdHgtPmhkX2J1Zl9jb3VudCA8IHJlcGVhdCl7CisgICAgICAgIGN0eC0+cGt0X29mZnNldCA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjdHgtPmRhdGFfdHlwZSAgID0gSUVDNjE5MzdfRUFDMzsKKyAgICBjdHgtPnBrdF9vZmZzZXQgID0gMjQ1NzY7CisgICAgY3R4LT5vdXRfYnVmICAgICA9IGN0eC0+aGRfYnVmOworICAgIGN0eC0+b3V0X2J5dGVzICAgPSBjdHgtPmhkX2J1Zl9maWxsZWQ7CisgICAgY3R4LT5sZW5ndGhfY29kZSA9IGN0eC0+aGRfYnVmX2ZpbGxlZDsKKworICAgIGN0eC0+aGRfYnVmX2NvdW50ICA9IDA7CisgICAgY3R4LT5oZF9idWZfZmlsbGVkID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIERUUyB0eXBlIElWIChEVFMtSEQpIGNhbiBiZSB0cmFuc21pdHRlZCB3aXRoIHZhcmlvdXMgZnJhbWUgcmVwZXRpdGlvbgorICogcGVyaW9kczsgbG9uZ2VyIHJlcGV0aXRpb24gcGVyaW9kcyBhbGxvdyBmb3IgbG9uZ2VyIHBhY2tldHMgYW5kIHRoZXJlZm9yZQorICogaGlnaGVyIGJpdHJhdGUuIExvbmdlciByZXBldGl0aW9uIHBlcmlvZHMgbWVhbiB0aGF0IHRoZSBjb25zdGFudCBiaXRyYXRlIG9mCisgKiB0aGUgb3V0cHV0dGVkIElFQyA2MTkzNyBzdHJlYW0gaXMgaGlnaGVyLgorICogVGhlIHJlcGV0aXRpb24gcGVyaW9kIGlzIG1lYXN1cmVkIGluIElFQyA2MDk1OCBmcmFtZXMgKDQgYnl0ZXMpLgorICovCitzdGF0aWMgaW50IHNwZGlmX2R0czRfc3VidHlwZShpbnQgcGVyaW9kKQoreworICAgIHN3aXRjaCAocGVyaW9kKSB7CisgICAgY2FzZSA1MTI6ICAgcmV0dXJuIDB4MDsKKyAgICBjYXNlIDEwMjQ6ICByZXR1cm4gMHgxOworICAgIGNhc2UgMjA0ODogIHJldHVybiAweDI7CisgICAgY2FzZSA0MDk2OiAgcmV0dXJuIDB4MzsKKyAgICBjYXNlIDgxOTI6ICByZXR1cm4gMHg0OworICAgIGNhc2UgMTYzODQ6IHJldHVybiAweDU7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzcGRpZl9oZWFkZXJfZHRzNChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsIGludCBjb3JlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwgaW50IGJsb2NrcykKK3sKKyAgICBJRUM2MTkzN0NvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBkdHNoZF9zdGFydF9jb2RlWzEwXSA9IHsgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSB9OworICAgIGludCBwa3Rfc2l6ZSA9IHBrdC0+c2l6ZTsKKyAgICBpbnQgcGVyaW9kOworICAgIGludCBzdWJ0eXBlOworCisgICAgaWYgKCFjb3JlX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkhEIG1vZGUgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBmb3JtYXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICghc2FtcGxlX3JhdGUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVua25vd24gRFRTIHNhbXBsZSByYXRlIGZvciBIRFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHBlcmlvZCA9IGN0eC0+ZHRzaGRfcmF0ZSAqIChibG9ja3MgPDwgNSkgLyBzYW1wbGVfcmF0ZTsKKyAgICBzdWJ0eXBlID0gc3BkaWZfZHRzNF9zdWJ0eXBlKHBlcmlvZCk7CisKKyAgICBpZiAoc3VidHlwZSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlNwZWNpZmllZCBIRCByYXRlIG9mICVkIEh6IHdvdWxkIHJlcXVpcmUgYW4gIgorICAgICAgICAgICAgICAgImltcG9zc2libGUgcmVwZXRpdGlvbiBwZXJpb2Qgb2YgJWQgZm9yIHRoZSBjdXJyZW50IERUUyBzdHJlYW0iCisgICAgICAgICAgICAgICAiIChibG9ja3MgPSAlZCwgc2FtcGxlIHJhdGUgPSAlZClcbiIsIGN0eC0+ZHRzaGRfcmF0ZSwgcGVyaW9kLAorICAgICAgICAgICAgICAgYmxvY2tzIDw8IDUsIHNhbXBsZV9yYXRlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvKiBzZXQgcGt0X29mZnNldCBhbmQgRFRTIElWIHN1YnR5cGUgYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgb3V0cHV0CisgICAgICogcmF0ZSAqLworICAgIGN0eC0+cGt0X29mZnNldCA9IHBlcmlvZCAqIDQ7CisgICAgY3R4LT5kYXRhX3R5cGUgPSBJRUM2MTkzN19EVFNIRCB8IHN1YnR5cGUgPDwgODsKKworICAgIC8qIElmIHRoZSBiaXRyYXRlIGlzIHRvbyBoaWdoIGZvciB0cmFuc21pdHRpbmcgYXQgdGhlIHNlbGVjdGVkCisgICAgICogcmVwZXRpdGlvbiBwZXJpb2Qgc2V0dGluZywgc3RyaXAgRFRTLUhEIHVudGlsIGEgZ29vZCBhbW91bnQKKyAgICAgKiBvZiBjb25zZWN1dGl2ZSBub24tb3ZlcmZsb3dpbmcgSEQgZnJhbWVzIGhhdmUgYmVlbiBvYnNlcnZlZC4KKyAgICAgKiBUaGlzIGdlbmVyYWxseSBvbmx5IGhhcHBlbnMgaWYgdGhlIGNhbGxlciBpcyBjcmFtbWluZyBhIE1hc3RlcgorICAgICAqIEF1ZGlvIHN0cmVhbSBpbnRvIDE5MmtIeiBJRUMgNjA5NTggKHdoaWNoIG1heSBvciBtYXkgbm90IGZpdCkuICovCisgICAgaWYgKHNpemVvZihkdHNoZF9zdGFydF9jb2RlKSArIDIgKyBwa3Rfc2l6ZQorICAgICAgICAgICAgPiBjdHgtPnBrdF9vZmZzZXQgLSBCVVJTVF9IRUFERVJfU0laRSAmJiBjb3JlX3NpemUpIHsKKyAgICAgICAgaWYgKCFjdHgtPmR0c2hkX3NraXApCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJEVFMtSEQgYml0cmF0ZSB0b28gaGlnaCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVtcG9yYXJpbHkgc2VuZGluZyBjb3JlIG9ubHlcbiIpOworICAgICAgICBpZiAoY3R4LT5kdHNoZF9mYWxsYmFjayA+IDApCisgICAgICAgICAgICBjdHgtPmR0c2hkX3NraXAgPSBzYW1wbGVfcmF0ZSAqIGN0eC0+ZHRzaGRfZmFsbGJhY2sgLyAoYmxvY2tzIDw8IDUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiBza2lwIHBlcm1hbmVudGx5IChkdHNoZF9mYWxsYmFjayA9PSAtMSkgb3IganVzdCBvbmNlCisgICAgICAgICAgICAgKiAoZHRzaGRfZmFsbGJhY2sgPT0gMCkgKi8KKyAgICAgICAgICAgIGN0eC0+ZHRzaGRfc2tpcCA9IDE7CisgICAgfQorICAgIGlmIChjdHgtPmR0c2hkX3NraXAgJiYgY29yZV9zaXplKSB7CisgICAgICAgIHBrdF9zaXplID0gY29yZV9zaXplOworICAgICAgICBpZiAoY3R4LT5kdHNoZF9mYWxsYmFjayA+PSAwKQorICAgICAgICAgICAgLS1jdHgtPmR0c2hkX3NraXA7CisgICAgfQorCisgICAgY3R4LT5vdXRfYnl0ZXMgICA9IHNpemVvZihkdHNoZF9zdGFydF9jb2RlKSArIDIgKyBwa3Rfc2l6ZTsKKworICAgIC8qIEFsaWduIHNvIHRoYXQgKGxlbmd0aF9jb2RlICYgMHhmKSA9PSAweDguIFRoaXMgaXMgcmVwb3J0ZWRseSBuZWVkZWQKKyAgICAgKiB3aXRoIHNvbWUgcmVjZWl2ZXJzLCBidXQgdGhlIGV4YWN0IHJlcXVpcmVtZW50IGlzIHVuY29uZmlybWVkLiAqLworICAgIGN0eC0+bGVuZ3RoX2NvZGUgPSBGRkFMSUdOKGN0eC0+b3V0X2J5dGVzICsgMHg4LCAweDEwKSAtIDB4ODsKKworICAgIGF2X2Zhc3RfbWFsbG9jKCZjdHgtPmhkX2J1ZiwgJmN0eC0+aGRfYnVmX3NpemUsIGN0eC0+b3V0X2J5dGVzKTsKKyAgICBpZiAoIWN0eC0+aGRfYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY3R4LT5vdXRfYnVmID0gY3R4LT5oZF9idWY7CisKKyAgICBtZW1jcHkoY3R4LT5oZF9idWYsIGR0c2hkX3N0YXJ0X2NvZGUsIHNpemVvZihkdHNoZF9zdGFydF9jb2RlKSk7CisgICAgQVZfV0IxNihjdHgtPmhkX2J1ZiArIHNpemVvZihkdHNoZF9zdGFydF9jb2RlKSwgcGt0X3NpemUpOworICAgIG1lbWNweShjdHgtPmhkX2J1ZiArIHNpemVvZihkdHNoZF9zdGFydF9jb2RlKSArIDIsIHBrdC0+ZGF0YSwgcGt0X3NpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BkaWZfaGVhZGVyX2R0cyhBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgSUVDNjE5MzdDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgdWludDMyX3Qgc3luY3dvcmRfZHRzID0gQVZfUkIzMihwa3QtPmRhdGEpOworICAgIGludCBibG9ja3M7CisgICAgaW50IHNhbXBsZV9yYXRlID0gMDsKKyAgICBpbnQgY29yZV9zaXplID0gMDsKKworICAgIGlmIChwa3QtPnNpemUgPCA5KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHN3aXRjaCAoc3luY3dvcmRfZHRzKSB7CisgICAgY2FzZSBEQ0FfTUFSS0VSX1JBV19CRToKKyAgICAgICAgYmxvY2tzID0gKEFWX1JCMTYocGt0LT5kYXRhICsgNCkgPj4gMikgJiAweDdmOworICAgICAgICBjb3JlX3NpemUgPSAoKEFWX1JCMjQocGt0LT5kYXRhICsgNSkgPj4gNCkgJiAweDNmZmYpICsgMTsKKyAgICAgICAgc2FtcGxlX3JhdGUgPSBhdnByaXZfZGNhX3NhbXBsZV9yYXRlc1socGt0LT5kYXRhWzhdID4+IDIpICYgMHgwZl07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRENBX01BUktFUl9SQVdfTEU6CisgICAgICAgIGJsb2NrcyA9IChBVl9STDE2KHBrdC0+ZGF0YSArIDQpID4+IDIpICYgMHg3ZjsKKyAgICAgICAgY3R4LT5leHRyYV9ic3dhcCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRENBX01BUktFUl8xNEJfQkU6CisgICAgICAgIGJsb2NrcyA9CisgICAgICAgICAgICAoKChwa3QtPmRhdGFbNV0gJiAweDA3KSA8PCA0KSB8ICgocGt0LT5kYXRhWzZdICYgMHgzZikgPj4gMikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERDQV9NQVJLRVJfMTRCX0xFOgorICAgICAgICBibG9ja3MgPQorICAgICAgICAgICAgKCgocGt0LT5kYXRhWzRdICYgMHgwNykgPDwgNCkgfCAoKHBrdC0+ZGF0YVs3XSAmIDB4M2YpID4+IDIpKTsKKyAgICAgICAgY3R4LT5leHRyYV9ic3dhcCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRENBX0hEX01BUktFUjoKKyAgICAgICAgLyogV2Ugb25seSBoYW5kbGUgSEQgZnJhbWVzIHRoYXQgYXJlIHBhaXJlZCB3aXRoIGNvcmUuIEhvd2V2ZXIsCisgICAgICAgICAgIHNvbWV0aW1lcyBEVFMtSEQgc3RyZWFtcyB3aXRoIGNvcmUgaGF2ZSBhIHN0cmF5IEhEIGZyYW1lIHdpdGhvdXQKKyAgICAgICAgICAgY29yZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uICovCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJzdHJheSBEVFMtSEQgZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiYmFkIERUUyBzeW5jd29yZCAweCUiUFJJeDMyIlxuIiwgc3luY3dvcmRfZHRzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGJsb2NrcysrOworCisgICAgaWYgKGN0eC0+ZHRzaGRfcmF0ZSkKKyAgICAgICAgLyogRFRTIHR5cGUgSVYgb3V0cHV0IHJlcXVlc3RlZCAqLworICAgICAgICByZXR1cm4gc3BkaWZfaGVhZGVyX2R0czQocywgcGt0LCBjb3JlX3NpemUsIHNhbXBsZV9yYXRlLCBibG9ja3MpOworCisgICAgc3dpdGNoIChibG9ja3MpIHsKKyAgICBjYXNlICA1MTIgPj4gNTogY3R4LT5kYXRhX3R5cGUgPSBJRUM2MTkzN19EVFMxOyBicmVhazsKKyAgICBjYXNlIDEwMjQgPj4gNTogY3R4LT5kYXRhX3R5cGUgPSBJRUM2MTkzN19EVFMyOyBicmVhazsKKyAgICBjYXNlIDIwNDggPj4gNTogY3R4LT5kYXRhX3R5cGUgPSBJRUM2MTkzN19EVFMzOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJWkgc2FtcGxlcyBpbiBEVFMgZnJhbWUgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgIGJsb2NrcyA8PCA1KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICAvKiBkaXNjYXJkIGV4dHJhbmVvdXMgZGF0YSBieSBkZWZhdWx0ICovCisgICAgaWYgKGNvcmVfc2l6ZSAmJiBjb3JlX3NpemUgPCBwa3QtPnNpemUpIHsKKyAgICAgICAgY3R4LT5vdXRfYnl0ZXMgPSBjb3JlX3NpemU7CisgICAgICAgIGN0eC0+bGVuZ3RoX2NvZGUgPSBjb3JlX3NpemUgPDwgMzsKKyAgICB9CisKKyAgICBjdHgtPnBrdF9vZmZzZXQgPSBibG9ja3MgPDwgNzsKKworICAgIGlmIChjdHgtPm91dF9ieXRlcyA9PSBjdHgtPnBrdF9vZmZzZXQpIHsKKyAgICAgICAgLyogVGhlIERUUyBzdHJlYW0gZml0cyBleGFjdGx5IGludG8gdGhlIG91dHB1dCBzdHJlYW0sIHNvIHNraXAgdGhlCisgICAgICAgICAqIHByZWFtYmxlIGFzIGl0IHdvdWxkIG5vdCBmaXQgaW4gdGhlcmUuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGR0cworICAgICAgICAgKiBkaXNjcyBhbmQgZHRzLWluLXdhdi4gKi8KKyAgICAgICAgY3R4LT51c2VfcHJlYW1ibGUgPSAwOworICAgIH0gZWxzZSBpZiAoY3R4LT5vdXRfYnl0ZXMgPiBjdHgtPnBrdF9vZmZzZXQgLSBCVVJTVF9IRUFERVJfU0laRSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIlVucmVjb2duaXplZCBsYXJnZSBEVFMgZnJhbWUiKTsKKyAgICAgICAgLyogVGhpcyB3aWxsIGZhaWwgd2l0aCBhICJiaXRyYXRlIHRvbyBoaWdoIiBpbiB0aGUgY2FsbGVyICovCisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBlbnVtIElFQzYxOTM3RGF0YVR5cGUgbXBlZ19kYXRhX3R5cGVbMl1bM10gPSB7CisgICAgLy8gICAgIExBWUVSMSAgICAgICAgICAgICAgICAgICAgICBMQVlFUjIgICAgICAgICAgICAgICAgICBMQVlFUjMKKyAgICB7IElFQzYxOTM3X01QRUcyX0xBWUVSMV9MU0YsIElFQzYxOTM3X01QRUcyX0xBWUVSMl9MU0YsIElFQzYxOTM3X01QRUcyX0xBWUVSM19MU0YgfSwvL01QRUcyIExTRgorICAgIHsgSUVDNjE5MzdfTVBFRzFfTEFZRVIxLCAgICAgSUVDNjE5MzdfTVBFRzFfTEFZRVIyMywgICAgSUVDNjE5MzdfTVBFRzFfTEFZRVIyMyB9LCAgIC8vTVBFRzEKK307CisKK3N0YXRpYyBpbnQgc3BkaWZfaGVhZGVyX21wZWcoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIElFQzYxOTM3Q29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIGludCB2ZXJzaW9uID0gICAgICAocGt0LT5kYXRhWzFdID4+IDMpICYgMzsKKyAgICBpbnQgbGF5ZXIgICA9IDMgLSAoKHBrdC0+ZGF0YVsxXSA+PiAxKSAmIDMpOworICAgIGludCBleHRlbnNpb24gPSBwa3QtPmRhdGFbMl0gJiAxOworCisgICAgaWYgKGxheWVyID09IDMgfHwgdmVyc2lvbiA9PSAxKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJXcm9uZyBNUEVHIGZpbGUgZm9ybWF0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJ2ZXJzaW9uOiAlaSBsYXllcjogJWkgZXh0ZW5zaW9uOiAlaVxuIiwgdmVyc2lvbiwgbGF5ZXIsIGV4dGVuc2lvbik7CisgICAgaWYgKHZlcnNpb24gPT0gMiAmJiBleHRlbnNpb24pIHsKKyAgICAgICAgY3R4LT5kYXRhX3R5cGUgID0gSUVDNjE5MzdfTVBFRzJfRVhUOworICAgICAgICBjdHgtPnBrdF9vZmZzZXQgPSA0NjA4OworICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+ZGF0YV90eXBlICA9IG1wZWdfZGF0YV90eXBlIFt2ZXJzaW9uICYgMV1bbGF5ZXJdOworICAgICAgICBjdHgtPnBrdF9vZmZzZXQgPSBzcGRpZl9tcGVnX3BrdF9vZmZzZXRbdmVyc2lvbiAmIDFdW2xheWVyXTsKKyAgICB9CisgICAgLy8gVE9ETyBEYXRhIHR5cGUgZGVwZW5kZW50IGluZm8gKG5vcm1hbC9rYXJhb2tlLCBkeW5hbWljIHJhbmdlIGNvbnRyb2wpCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BkaWZfaGVhZGVyX2FhYyhBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgSUVDNjE5MzdDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQUFDQURUU0hlYWRlckluZm8gaGRyOworICAgIEdldEJpdENvbnRleHQgZ2JjOworICAgIGludCByZXQ7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYmMsIHBrdC0+ZGF0YSwgQUFDX0FEVFNfSEVBREVSX1NJWkUgKiA4KTsKKyAgICByZXQgPSBhdnByaXZfYWFjX3BhcnNlX2hlYWRlcigmZ2JjLCAmaGRyKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiV3JvbmcgQUFDIGZpbGUgZm9ybWF0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3R4LT5wa3Rfb2Zmc2V0ID0gaGRyLnNhbXBsZXMgPDwgMjsKKyAgICBzd2l0Y2ggKGhkci5udW1fYWFjX2ZyYW1lcykgeworICAgIGNhc2UgMToKKyAgICAgICAgY3R4LT5kYXRhX3R5cGUgPSBJRUM2MTkzN19NUEVHMl9BQUM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgY3R4LT5kYXRhX3R5cGUgPSBJRUM2MTkzN19NUEVHMl9BQUNfTFNGXzIwNDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgY3R4LT5kYXRhX3R5cGUgPSBJRUM2MTkzN19NUEVHMl9BQUNfTFNGXzQwOTY7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiJSJQUkl1MzIiIHNhbXBsZXMgaW4gQUFDIGZyYW1lIG5vdCBzdXBwb3J0ZWRcbiIsIGhkci5zYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgLy9UT0RPIERhdGEgdHlwZSBkZXBlbmRlbnQgaW5mbyAoTEMgcHJvZmlsZS9TQlIpCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEl0IHNlZW1zIERvbGJ5IFRydWVIRCBmcmFtZXMgaGF2ZSB0byBiZSBlbmNhcHN1bGF0ZWQgaW4gTUFUIGZyYW1lcyBiZWZvcmUKKyAqIHRoZXkgY2FuIGJlIGVuY2Fwc3VsYXRlZCBpbiBJRUMgNjE5MzcuCisgKiBIZXJlIHdlIGVuY2Fwc3VsYXRlIDI0IFRydWVIRCBmcmFtZXMgaW4gYSBzaW5nbGUgTUFUIGZyYW1lLCBwYWRkaW5nIHRoZW0KKyAqIHRvIGFjaGlldmUgY29uc3RhbnQgcmF0ZS4KKyAqIFRoZSBhY3R1YWwgZm9ybWF0IG9mIGEgTUFUIGZyYW1lIGlzIHVua25vd24sIGJ1dCB0aGUgYmVsb3cgc2VlbXMgdG8gd29yay4KKyAqIEhvd2V2ZXIsIGl0IHNlZW1zIGl0IGlzIG5vdCBhY3R1YWxseSBuZWNlc3NhcnkgZm9yIHRoZSAyNCBUcnVlSEQgZnJhbWVzIHRvCisgKiBiZSBpbiBhbiBleGFjdCBhbGlnbm1lbnQgd2l0aCB0aGUgTUFUIGZyYW1lLgorICovCisjZGVmaW5lIE1BVF9GUkFNRV9TSVpFICAgICAgICAgIDYxNDI0CisjZGVmaW5lIFRSVUVIRF9GUkFNRV9PRkZTRVQgICAgIDI1NjAKKyNkZWZpbmUgTUFUX01JRERMRV9DT0RFX09GRlNFVCAgLTQKKworc3RhdGljIGludCBzcGRpZl9oZWFkZXJfdHJ1ZWhkKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBJRUM2MTkzN0NvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgbWF0X2NvZGVfbGVuZ3RoID0gMDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtYXRfZW5kX2NvZGVbMTZdID0geyAweEMzLCAweEMyLCAweEMwLCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDExIH07CisKKyAgICBpZiAoIWN0eC0+aGRfYnVmX2NvdW50KSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1hdF9zdGFydF9jb2RlWzIwXSA9IHsgMHgwNywgMHg5RSwgMHgwMCwgMHgwMywgMHg4NCwgMHgwMSwgMHgwMSwgMHgwMSwgMHg4MCwgMHgwMCwgMHg1NiwgMHhBNSwgMHgzQiwgMHhGNCwgMHg4MSwgMHg4MywgMHg0OSwgMHg4MCwgMHg3NywgMHhFMCB9OworICAgICAgICBtYXRfY29kZV9sZW5ndGggPSBzaXplb2YobWF0X3N0YXJ0X2NvZGUpICsgQlVSU1RfSEVBREVSX1NJWkU7CisgICAgICAgIG1lbWNweShjdHgtPmhkX2J1ZiwgbWF0X3N0YXJ0X2NvZGUsIHNpemVvZihtYXRfc3RhcnRfY29kZSkpOworCisgICAgfSBlbHNlIGlmIChjdHgtPmhkX2J1Zl9jb3VudCA9PSAxMikgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXRfbWlkZGxlX2NvZGVbMTJdID0geyAweEMzLCAweEMxLCAweDQyLCAweDQ5LCAweDNCLCAweEZBLCAweDgyLCAweDgzLCAweDQ5LCAweDgwLCAweDc3LCAweEUwIH07CisgICAgICAgIG1hdF9jb2RlX2xlbmd0aCA9IHNpemVvZihtYXRfbWlkZGxlX2NvZGUpICsgTUFUX01JRERMRV9DT0RFX09GRlNFVDsKKyAgICAgICAgbWVtY3B5KCZjdHgtPmhkX2J1ZlsxMiAqIFRSVUVIRF9GUkFNRV9PRkZTRVQgLSBCVVJTVF9IRUFERVJfU0laRSArIE1BVF9NSURETEVfQ09ERV9PRkZTRVRdLAorICAgICAgICAgICAgICAgbWF0X21pZGRsZV9jb2RlLCBzaXplb2YobWF0X21pZGRsZV9jb2RlKSk7CisgICAgfQorCisgICAgaWYgKHBrdC0+c2l6ZSA+IFRSVUVIRF9GUkFNRV9PRkZTRVQgLSBtYXRfY29kZV9sZW5ndGgpIHsKKyAgICAgICAgLyogaWYgc3VjaCBmcmFtZXMgZXhpc3QsIHdlJ2QgbmVlZCBzb21lIG1vcmUgY29tcGxleCBsb2dpYyB0bworICAgICAgICAgKiBkaXN0cmlidXRlIHRoZSBUcnVlSEQgZnJhbWVzIGluIHRoZSBNQVQgZnJhbWUgKi8KKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJUb28gbGFyZ2UgVHJ1ZUhEIGZyYW1lIG9mICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+c2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBtZW1jcHkoJmN0eC0+aGRfYnVmW2N0eC0+aGRfYnVmX2NvdW50ICogVFJVRUhEX0ZSQU1FX09GRlNFVCAtIEJVUlNUX0hFQURFUl9TSVpFICsgbWF0X2NvZGVfbGVuZ3RoXSwKKyAgICAgICAgICAgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIG1lbXNldCgmY3R4LT5oZF9idWZbY3R4LT5oZF9idWZfY291bnQgKiBUUlVFSERfRlJBTUVfT0ZGU0VUIC0gQlVSU1RfSEVBREVSX1NJWkUgKyBtYXRfY29kZV9sZW5ndGggKyBwa3QtPnNpemVdLAorICAgICAgICAgICAwLCBUUlVFSERfRlJBTUVfT0ZGU0VUIC0gcGt0LT5zaXplIC0gbWF0X2NvZGVfbGVuZ3RoKTsKKworICAgIGlmICgrK2N0eC0+aGRfYnVmX2NvdW50IDwgMjQpeworICAgICAgICBjdHgtPnBrdF9vZmZzZXQgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbWVtY3B5KCZjdHgtPmhkX2J1ZltNQVRfRlJBTUVfU0laRSAtIHNpemVvZihtYXRfZW5kX2NvZGUpXSwgbWF0X2VuZF9jb2RlLCBzaXplb2YobWF0X2VuZF9jb2RlKSk7CisgICAgY3R4LT5oZF9idWZfY291bnQgPSAwOworCisgICAgY3R4LT5kYXRhX3R5cGUgICA9IElFQzYxOTM3X1RSVUVIRDsKKyAgICBjdHgtPnBrdF9vZmZzZXQgID0gNjE0NDA7CisgICAgY3R4LT5vdXRfYnVmICAgICA9IGN0eC0+aGRfYnVmOworICAgIGN0eC0+b3V0X2J5dGVzICAgPSBNQVRfRlJBTUVfU0laRTsKKyAgICBjdHgtPmxlbmd0aF9jb2RlID0gTUFUX0ZSQU1FX1NJWkU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BkaWZfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBJRUM2MTkzN0NvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKKworICAgIHN3aXRjaCAocy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BQzM6CisgICAgICAgIGN0eC0+aGVhZGVyX2luZm8gPSBzcGRpZl9oZWFkZXJfYWMzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0VBQzM6CisgICAgICAgIGN0eC0+aGVhZGVyX2luZm8gPSBzcGRpZl9oZWFkZXJfZWFjMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDE6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDI6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDM6CisgICAgICAgIGN0eC0+aGVhZGVyX2luZm8gPSBzcGRpZl9oZWFkZXJfbXBlZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9EVFM6CisgICAgICAgIGN0eC0+aGVhZGVyX2luZm8gPSBzcGRpZl9oZWFkZXJfZHRzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FBQzoKKyAgICAgICAgY3R4LT5oZWFkZXJfaW5mbyA9IHNwZGlmX2hlYWRlcl9hYWM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfVFJVRUhEOgorICAgICAgICBjdHgtPmhlYWRlcl9pbmZvID0gc3BkaWZfaGVhZGVyX3RydWVoZDsKKyAgICAgICAgY3R4LT5oZF9idWYgPSBhdl9tYWxsb2MoTUFUX0ZSQU1FX1NJWkUpOworICAgICAgICBpZiAoIWN0eC0+aGRfYnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNvZGVjIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwZGlmX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIElFQzYxOTM3Q29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIGF2X2ZyZWVwKCZjdHgtPmJ1ZmZlcik7CisgICAgYXZfZnJlZXAoJmN0eC0+aGRfYnVmKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBzcGRpZl9wdXRfMTYoSUVDNjE5MzdDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVklPQ29udGV4dCAqcGIsIHVuc2lnbmVkIGludCB2YWwpCit7CisgICAgaWYgKGN0eC0+c3BkaWZfZmxhZ3MgJiBTUERJRl9GTEFHX0JJR0VORElBTikKKyAgICAgICAgYXZpb193YjE2KHBiLCB2YWwpOworICAgIGVsc2UKKyAgICAgICAgYXZpb193bDE2KHBiLCB2YWwpOworfQorCitzdGF0aWMgaW50IHNwZGlmX3dyaXRlX3BhY2tldChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIElFQzYxOTM3Q29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQsIHBhZGRpbmc7CisKKyAgICBjdHgtPm91dF9idWYgPSBwa3QtPmRhdGE7CisgICAgY3R4LT5vdXRfYnl0ZXMgPSBwa3QtPnNpemU7CisgICAgY3R4LT5sZW5ndGhfY29kZSA9IEZGQUxJR04ocGt0LT5zaXplLCAyKSA8PCAzOworICAgIGN0eC0+dXNlX3ByZWFtYmxlID0gMTsKKyAgICBjdHgtPmV4dHJhX2Jzd2FwID0gMDsKKworICAgIHJldCA9IGN0eC0+aGVhZGVyX2luZm8ocywgcGt0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIWN0eC0+cGt0X29mZnNldCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBwYWRkaW5nID0gKGN0eC0+cGt0X29mZnNldCAtIGN0eC0+dXNlX3ByZWFtYmxlICogQlVSU1RfSEVBREVSX1NJWkUgLSBjdHgtPm91dF9ieXRlcykgJiB+MTsKKyAgICBpZiAocGFkZGluZyA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImJpdHJhdGUgaXMgdG9vIGhpZ2hcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChjdHgtPnVzZV9wcmVhbWJsZSkgeworICAgICAgICBzcGRpZl9wdXRfMTYoY3R4LCBzLT5wYiwgU1lOQ1dPUkQxKTsgICAgICAgLy9QYQorICAgICAgICBzcGRpZl9wdXRfMTYoY3R4LCBzLT5wYiwgU1lOQ1dPUkQyKTsgICAgICAgLy9QYgorICAgICAgICBzcGRpZl9wdXRfMTYoY3R4LCBzLT5wYiwgY3R4LT5kYXRhX3R5cGUpOyAgLy9QYworICAgICAgICBzcGRpZl9wdXRfMTYoY3R4LCBzLT5wYiwgY3R4LT5sZW5ndGhfY29kZSk7Ly9QZAorICAgIH0KKworICAgIGlmIChjdHgtPmV4dHJhX2Jzd2FwIF4gKGN0eC0+c3BkaWZfZmxhZ3MgJiBTUERJRl9GTEFHX0JJR0VORElBTikpIHsKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgY3R4LT5vdXRfYnVmLCBjdHgtPm91dF9ieXRlcyAmIH4xKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9mYXN0X21hbGxvYygmY3R4LT5idWZmZXIsICZjdHgtPmJ1ZmZlcl9zaXplLCBjdHgtPm91dF9ieXRlcyArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIWN0eC0+YnVmZmVyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZmZfc3BkaWZfYnN3YXBfYnVmMTYoKHVpbnQxNl90ICopY3R4LT5idWZmZXIsICh1aW50MTZfdCAqKWN0eC0+b3V0X2J1ZiwgY3R4LT5vdXRfYnl0ZXMgPj4gMSk7CisgICAgICAgIGF2aW9fd3JpdGUocy0+cGIsIGN0eC0+YnVmZmVyLCBjdHgtPm91dF9ieXRlcyAmIH4xKTsKKyAgICB9CisKKyAgICAvKiBhIGZpbmFsIGxvbmUgYnl0ZSBoYXMgdG8gYmUgTVNCIGFsaWduZWQgKi8KKyAgICBpZiAoY3R4LT5vdXRfYnl0ZXMgJiAxKQorICAgICAgICBzcGRpZl9wdXRfMTYoY3R4LCBzLT5wYiwgY3R4LT5vdXRfYnVmW2N0eC0+b3V0X2J5dGVzIC0gMV0gPDwgOCk7CisKKyAgICBmZmlvX2ZpbGwocy0+cGIsIDAsIHBhZGRpbmcpOworCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInR5cGU9JXggbGVuPSVpIHBrdF9vZmZzZXQ9JWlcbiIsCisgICAgICAgICAgIGN0eC0+ZGF0YV90eXBlLCBjdHgtPm91dF9ieXRlcywgY3R4LT5wa3Rfb2Zmc2V0KTsKKworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9zcGRpZl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAic3BkaWYiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJJRUMgNjE5MzcgKHVzZWQgb24gUy9QRElGIC0gSUVDOTU4KSIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJzcGRpZiIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKElFQzYxOTM3Q29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQUMzLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gc3BkaWZfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHNwZGlmX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBzcGRpZl93cml0ZV90cmFpbGVyLAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKKyAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmc3BkaWZfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NydGRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NydGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNWU1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3J0ZGVjLmMKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBTdWJSaXAgc3VidGl0bGUgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEwICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic3VidGl0bGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSBxOworfSBTUlRDb250ZXh0OworCitzdGF0aWMgaW50IHNydF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpbnQgdjsKKyAgICBjaGFyIGJ1Zls2NF0sICpwYnVmOworICAgIEZGVGV4dFJlYWRlciB0cjsKKworICAgIGZmX3RleHRfaW5pdF9idWYoJnRyLCBwLT5idWYsIHAtPmJ1Zl9zaXplKTsKKworICAgIHdoaWxlIChmZl90ZXh0X3BlZWtfcjgoJnRyKSA9PSAnXHInIHx8IGZmX3RleHRfcGVla19yOCgmdHIpID09ICdcbicpCisgICAgICAgIGZmX3RleHRfcjgoJnRyKTsKKworICAgIC8qIENoZWNrIGlmIHRoZSBmaXJzdCBub24tZW1wdHkgbGluZSBpcyBhIG51bWJlci4gV2UgZG8gbm90IGNoZWNrIHdoYXQgdGhlCisgICAgICogbnVtYmVyIGlzIGJlY2F1c2UgaW4gcHJhY3RpY2UgaXQgY2FuIGJlIGFueXRoaW5nLiAqLworICAgIGlmIChmZl9zdWJ0aXRsZXNfcmVhZF9saW5lKCZ0ciwgYnVmLCBzaXplb2YoYnVmKSkgPCAwIHx8CisgICAgICAgIHN0cnRvbChidWYsICZwYnVmLCAxMCkgPCAwIHx8ICpwYnVmKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IGxpbmUgbWF0Y2hlcyBhIFNSVCB0aW1lc3RhbXAgKi8KKyAgICBpZiAoZmZfc3VidGl0bGVzX3JlYWRfbGluZSgmdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGJ1ZlswXSA+PSAnMCcgJiYgYnVmWzFdIDw9ICc5JyAmJiBzdHJzdHIoYnVmLCAiIC0tPiAiKQorICAgICAgICAmJiBzc2NhbmYoYnVmLCAiJSpkOiUqMmQ6JSoyZCUqMVssLl0lKjNkIC0tPiAlKmQ6JSoyZDolKjJkJSoxWywuXSUzZCIsICZ2KSA9PSAxKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludDY0X3QgZ2V0X3B0cyhjb25zdCBjaGFyICoqYnVmLCBpbnQgKmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICp4MSwgaW50MzJfdCAqeTEsIGludDMyX3QgKngyLCBpbnQzMl90ICp5MikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaT0wOyBpPDI7IGkrKykgeworICAgICAgICBpbnQgaGgxLCBtbTEsIHNzMSwgbXMxOworICAgICAgICBpbnQgaGgyLCBtbTIsIHNzMiwgbXMyOworICAgICAgICBpZiAoc3NjYW5mKCpidWYsICIlZDolMmQ6JTJkJSoxWywuXSUzZCAtLT4gJWQ6JTJkOiUyZCUqMVssLl0lM2QiCisgICAgICAgICAgICAgICAgICAgIiUqWyBdWDE6JXUgWDI6JXUgWTE6JXUgWTI6JXUiLAorICAgICAgICAgICAgICAgICAgICZoaDEsICZtbTEsICZzczEsICZtczEsCisgICAgICAgICAgICAgICAgICAgJmhoMiwgJm1tMiwgJnNzMiwgJm1zMiwKKyAgICAgICAgICAgICAgICAgICB4MSwgeDIsIHkxLCB5MikgPj0gOCkgeworICAgICAgICAgICAgaW50NjRfdCBzdGFydCA9IChoaDEqMzYwMExMICsgbW0xKjYwTEwgKyBzczEpICogMTAwMExMICsgbXMxOworICAgICAgICAgICAgaW50NjRfdCBlbmQgICA9IChoaDIqMzYwMExMICsgbW0yKjYwTEwgKyBzczIpICogMTAwMExMICsgbXMyOworICAgICAgICAgICAgKmR1cmF0aW9uID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICAqYnVmICs9IGZmX3N1YnRpdGxlc19uZXh0X2xpbmUoKmJ1Zik7CisgICAgICAgICAgICByZXR1cm4gc3RhcnQ7CisgICAgICAgIH0KKyAgICAgICAgKmJ1ZiArPSBmZl9zdWJ0aXRsZXNfbmV4dF9saW5lKCpidWYpOworICAgIH0KKyAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7Cit9CisKK3N0YXRpYyBpbnQgc3J0X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBTUlRDb250ZXh0ICpzcnQgPSBzLT5wcml2X2RhdGE7CisgICAgQVZCUHJpbnQgYnVmOworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaW50IHJlcyA9IDA7CisgICAgRkZUZXh0UmVhZGVyIHRyOworICAgIGZmX3RleHRfaW5pdF9hdmlvKHMsICZ0ciwgcy0+cGIpOworCisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMCk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1NVQlJJUDsKKworICAgIGF2X2JwcmludF9pbml0KCZidWYsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisKKyAgICB3aGlsZSAoIWZmX3RleHRfZW9mKCZ0cikpIHsKKyAgICAgICAgZmZfc3VidGl0bGVzX3JlYWRfdGV4dF9jaHVuaygmdHIsICZidWYpOworCisgICAgICAgIGlmIChidWYubGVuKSB7CisgICAgICAgICAgICBpbnQ2NF90IHBvcyA9IGZmX3RleHRfcG9zKCZ0cik7CisgICAgICAgICAgICBpbnQ2NF90IHB0czsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciA9IGJ1Zi5zdHI7CisgICAgICAgICAgICBpbnQzMl90IHgxID0gLTEsIHkxID0gLTEsIHgyID0gLTEsIHkyID0gLTE7CisgICAgICAgICAgICBBVlBhY2tldCAqc3ViOworCisgICAgICAgICAgICBwdHMgPSBnZXRfcHRzKCZwdHIsICZkdXJhdGlvbiwgJngxLCAmeTEsICZ4MiwgJnkyKTsKKyAgICAgICAgICAgIGlmIChwdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gYnVmLmxlbiAtIChwdHIgLSBidWYuc3RyKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHN1YiA9IGZmX3N1YnRpdGxlc19xdWV1ZV9pbnNlcnQoJnNydC0+cSwgcHRyLCBsZW4sIDApOworICAgICAgICAgICAgICAgIGlmICghc3ViKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1Yi0+cG9zID0gcG9zOworICAgICAgICAgICAgICAgIHN1Yi0+cHRzID0gcHRzOworICAgICAgICAgICAgICAgIHN1Yi0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAoeDEgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcCA9IGF2X3BhY2tldF9uZXdfc2lkZV9kYXRhKHN1YiwgQVZfUEtUX0RBVEFfU1VCVElUTEVfUE9TSVRJT04sIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dMMzIocCwgICAgICB4MSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTDMyKHAgKyAgNCwgeTEpOworICAgICAgICAgICAgICAgICAgICAgICAgQVZfV0wzMihwICsgIDgsIHgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dMMzIocCArIDEyLCB5Mik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfZmluYWxpemUoJnNydC0+cSk7CisKK2VuZDoKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZiwgTlVMTCk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBzcnRfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFNSVENvbnRleHQgKnNydCA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3JlYWRfcGFja2V0KCZzcnQtPnEsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgc3J0X3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtaW5fdHMsIGludDY0X3QgdHMsIGludDY0X3QgbWF4X3RzLCBpbnQgZmxhZ3MpCit7CisgICAgU1JUQ29udGV4dCAqc3J0ID0gcy0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl9zdWJ0aXRsZXNfcXVldWVfc2Vlaygmc3J0LT5xLCBzLCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl90cywgdHMsIG1heF90cywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNydF9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBTUlRDb250ZXh0ICpzcnQgPSBzLT5wcml2X2RhdGE7CisgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2NsZWFuKCZzcnQtPnEpOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3NydF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICA9ICJzcnQiLAorICAgIC5sb25nX25hbWUgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTdWJSaXAgc3VidGl0bGUiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU1JUQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgID0gc3J0X3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciA9IHNydF9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgPSBzcnRfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlazIgID0gc3J0X3JlYWRfc2VlaywKKyAgICAucmVhZF9jbG9zZSAgPSBzcnRfcmVhZF9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc3J0ZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3J0ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiODNkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zcnRlbmMuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIFN1YlJpcCBzdWJ0aXRsZSBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEyICBOaWNvbGFzIEdlb3JnZSA8bmljb2xhcy5nZW9yZ2VAbm9ybWFsZXN1cC5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworLyogVE9ETzogYWRkIG9wdGlvbnMgZm9yOgorICAgLSBjaGFyYWN0ZXIgZW5jb2Rpbmc7CisgICAtIExGIC8gQ1JMRjsKKyAgIC0gYnl0ZSBvcmRlciBtYXJrLgorICovCisKK3R5cGVkZWYgc3RydWN0IFNSVENvbnRleHR7CisgICAgdW5zaWduZWQgaW5kZXg7Cit9IFNSVENvbnRleHQ7CisKK3N0YXRpYyBpbnQgc3J0X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmF2ZikKK3sKKyAgICBTUlRDb250ZXh0ICpzcnQgPSBhdmYtPnByaXZfZGF0YTsKKworICAgIGlmIChhdmYtPm5iX3N0cmVhbXMgIT0gMSB8fAorICAgICAgICBhdmYtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiU1JUIHN1cHBvcnRzIG9ubHkgYSBzaW5nbGUgc3VidGl0bGVzIHN0cmVhbS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoYXZmLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEVYVCAmJgorICAgICAgICBhdmYtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9TVUJSSVApIHsKKyAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHN1YnRpdGxlcyBjb2RlYzogJXNcbiIsCisgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKGF2Zi0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXZmLT5zdHJlYW1zWzBdLCA2NCwgMSwgMTAwMCk7CisgICAgc3J0LT5pbmRleCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3J0X3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2ZiwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBTUlRDb250ZXh0ICpzcnQgPSBhdmYtPnByaXZfZGF0YTsKKworICAgIC8vIFRPRE86IHJlaW5kZW50CisgICAgICAgIGludDY0X3QgcyA9IHBrdC0+cHRzLCBlLCBkID0gcGt0LT5kdXJhdGlvbjsKKyAgICAgICAgaW50IHNpemUsIHgxID0gLTEsIHkxID0gLTEsIHgyID0gLTEsIHkyID0gLTE7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnA7CisKKyAgICAgICAgcCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwgQVZfUEtUX0RBVEFfU1VCVElUTEVfUE9TSVRJT04sICZzaXplKTsKKyAgICAgICAgaWYgKHAgJiYgc2l6ZSA9PSAxNikgeworICAgICAgICAgICAgeDEgPSBBVl9STDMyKHAgICAgICk7CisgICAgICAgICAgICB5MSA9IEFWX1JMMzIocCArICA0KTsKKyAgICAgICAgICAgIHgyID0gQVZfUkwzMihwICsgIDgpOworICAgICAgICAgICAgeTIgPSBBVl9STDMyKHAgKyAxMik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZCA8PSAwKQorICAgICAgICAgICAgLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGZhbGxiYWNrIHRvIGNvbnZlcmdlbmNlX2R1cmF0aW9uLiAqLworICAgICAgICAgICAgZCA9IHBrdC0+Y29udmVyZ2VuY2VfZHVyYXRpb247CisgICAgICAgIGlmIChzID09IEFWX05PUFRTX1ZBTFVFIHx8IGQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiSW5zdWZmaWNpZW50IHRpbWVzdGFtcHMgaW4gZXZlbnQgbnVtYmVyICVkLlxuIiwgc3J0LT5pbmRleCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlID0gcyArIGQ7CisgICAgICAgIGF2aW9fcHJpbnRmKGF2Zi0+cGIsICIlZFxuJTAyZDolMDJkOiUwMmQsJTAzZCAtLT4gJTAyZDolMDJkOiUwMmQsJTAzZCIsCisgICAgICAgICAgICAgICAgICAgICAgIHNydC0+aW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHMgLyAzNjAwMDAwKSwgICAgICAoaW50KShzIC8gNjAwMDApICUgNjAsCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHMgLyAgICAxMDAwKSAlIDYwLCAoaW50KShzICUgIDEwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KShlIC8gMzYwMDAwMCksICAgICAgKGludCkoZSAvIDYwMDAwKSAlIDYwLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KShlIC8gICAgMTAwMCkgJSA2MCwgKGludCkoZSAlICAxMDAwKSk7CisgICAgICAgIGlmIChwKQorICAgICAgICAgICAgYXZpb19wcmludGYoYXZmLT5wYiwgIiAgWDE6JTAzZCBYMjolMDNkIFkxOiUwM2QgWTI6JTAzZCIsCisgICAgICAgICAgICAgICAgICAgICAgICB4MSwgeDIsIHkxLCB5Mik7CisgICAgICAgIGF2aW9fcHJpbnRmKGF2Zi0+cGIsICJcbiIpOworCisgICAgYXZpb193cml0ZShhdmYtPnBiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgYXZpb193cml0ZShhdmYtPnBiLCAiXG5cbiIsIDIpOworICAgIHNydC0+aW5kZXgrKzsKKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfc3J0X211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzcnQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTdWJSaXAgc3VidGl0bGUiKSwKKyAgICAubWltZV90eXBlICAgICAgPSAiYXBwbGljYXRpb24veC1zdWJyaXAiLAorICAgIC5leHRlbnNpb25zICAgICA9ICJzcnQiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTUlRDb250ZXh0KSwKKyAgICAud3JpdGVfaGVhZGVyICAgPSBzcnRfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IHNydF93cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfVkFSSUFCTEVfRlBTIHwgQVZGTVRfVFNfTk9OU1RSSUNULAorICAgIC5zdWJ0aXRsZV9jb2RlYyA9IEFWX0NPREVDX0lEX1NVQlJJUCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc3J0cC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NydHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU4MjExCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NydHAuYwpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqIFNSVFAgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9iYXNlNjQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2htYWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgInJ0cC5oIgorI2luY2x1ZGUgInJ0cGRlYy5oIgorI2luY2x1ZGUgInNydHAuaCIKKwordm9pZCBmZl9zcnRwX2ZyZWUoc3RydWN0IFNSVFBDb250ZXh0ICpzKQoreworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuOworICAgIGF2X2ZyZWVwKCZzLT5hZXMpOworICAgIGlmIChzLT5obWFjKQorICAgICAgICBhdl9obWFjX2ZyZWUocy0+aG1hYyk7CisgICAgcy0+aG1hYyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGVuY3J5cHRfY291bnRlcihzdHJ1Y3QgQVZBRVMgKmFlcywgdWludDhfdCAqaXYsIHVpbnQ4X3QgKm91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0bGVuKQoreworICAgIGludCBpLCBqLCBvdXRwb3M7CisgICAgZm9yIChpID0gMCwgb3V0cG9zID0gMDsgb3V0cG9zIDwgb3V0bGVuOyBpKyspIHsKKyAgICAgICAgdWludDhfdCBrZXlzdHJlYW1bMTZdOworICAgICAgICBBVl9XQjE2KCZpdlsxNF0sIGkpOworICAgICAgICBhdl9hZXNfY3J5cHQoYWVzLCBrZXlzdHJlYW0sIGl2LCAxLCBOVUxMLCAwKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2ICYmIG91dHBvcyA8IG91dGxlbjsgaisrLCBvdXRwb3MrKykKKyAgICAgICAgICAgIG91dGJ1ZltvdXRwb3NdIF49IGtleXN0cmVhbVtqXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlcml2ZV9rZXkoc3RydWN0IEFWQUVTICphZXMsIGNvbnN0IHVpbnQ4X3QgKnNhbHQsIGludCBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0LCBpbnQgb3V0bGVuKQoreworICAgIHVpbnQ4X3QgaW5wdXRbMTZdID0geyAwIH07CisgICAgbWVtY3B5KGlucHV0LCBzYWx0LCAxNCk7CisgICAgLy8gS2V5IGRlcml2YXRpb24gcmF0ZSBhc3N1bWVkIHRvIGJlIHplcm8KKyAgICBpbnB1dFsxNCAtIDddIF49IGxhYmVsOworICAgIG1lbXNldChvdXQsIDAsIG91dGxlbik7CisgICAgZW5jcnlwdF9jb3VudGVyKGFlcywgaW5wdXQsIG91dCwgb3V0bGVuKTsKK30KKworaW50IGZmX3NydHBfc2V0X2NyeXB0byhzdHJ1Y3QgU1JUUENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbXMpCit7CisgICAgdWludDhfdCBidWZbMzBdOworCisgICAgZmZfc3J0cF9mcmVlKHMpOworCisgICAgLy8gUkZDIDQ1NjgKKyAgICBpZiAoIXN0cmNtcChzdWl0ZSwgIkFFU19DTV8xMjhfSE1BQ19TSEExXzgwIikgfHwKKyAgICAgICAgIXN0cmNtcChzdWl0ZSwgIlNSVFBfQUVTMTI4X0NNX0hNQUNfU0hBMV84MCIpKSB7CisgICAgICAgIHMtPnJ0cF9obWFjX3NpemUgPSBzLT5ydGNwX2htYWNfc2l6ZSA9IDEwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzdWl0ZSwgIkFFU19DTV8xMjhfSE1BQ19TSEExXzMyIikpIHsKKyAgICAgICAgcy0+cnRwX2htYWNfc2l6ZSA9IHMtPnJ0Y3BfaG1hY19zaXplID0gNDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoc3VpdGUsICJTUlRQX0FFUzEyOF9DTV9ITUFDX1NIQTFfMzIiKSkgeworICAgICAgICAvLyBSRkMgNTc2NCBzZWN0aW9uIDQuMS4yCisgICAgICAgIHMtPnJ0cF9obWFjX3NpemUgID0gNDsKKyAgICAgICAgcy0+cnRjcF9obWFjX3NpemUgPSAxMDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJTUlRQIENyeXB0byBzdWl0ZSAlcyBub3Qgc3VwcG9ydGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKGF2X2Jhc2U2NF9kZWNvZGUoYnVmLCBwYXJhbXMsIHNpemVvZihidWYpKSAhPSBzaXplb2YoYnVmKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJJbmNvcnJlY3QgYW1vdW50IG9mIFNSVFAgcGFyYW1zXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgLy8gTUtJIGFuZCBsaWZldGltZSBub3QgaGFuZGxlZCB5ZXQKKyAgICBzLT5hZXMgID0gYXZfYWVzX2FsbG9jKCk7CisgICAgcy0+aG1hYyA9IGF2X2htYWNfYWxsb2MoQVZfSE1BQ19TSEExKTsKKyAgICBpZiAoIXMtPmFlcyB8fCAhcy0+aG1hYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtZW1jcHkocy0+bWFzdGVyX2tleSwgYnVmLCAxNik7CisgICAgbWVtY3B5KHMtPm1hc3Rlcl9zYWx0LCBidWYgKyAxNiwgMTQpOworCisgICAgLy8gUkZDIDM3MTEKKyAgICBhdl9hZXNfaW5pdChzLT5hZXMsIHMtPm1hc3Rlcl9rZXksIDEyOCwgMCk7CisKKyAgICBkZXJpdmVfa2V5KHMtPmFlcywgcy0+bWFzdGVyX3NhbHQsIDB4MDAsIHMtPnJ0cF9rZXksIHNpemVvZihzLT5ydHBfa2V5KSk7CisgICAgZGVyaXZlX2tleShzLT5hZXMsIHMtPm1hc3Rlcl9zYWx0LCAweDAyLCBzLT5ydHBfc2FsdCwgc2l6ZW9mKHMtPnJ0cF9zYWx0KSk7CisgICAgZGVyaXZlX2tleShzLT5hZXMsIHMtPm1hc3Rlcl9zYWx0LCAweDAxLCBzLT5ydHBfYXV0aCwgc2l6ZW9mKHMtPnJ0cF9hdXRoKSk7CisKKyAgICBkZXJpdmVfa2V5KHMtPmFlcywgcy0+bWFzdGVyX3NhbHQsIDB4MDMsIHMtPnJ0Y3Bfa2V5LCBzaXplb2Yocy0+cnRjcF9rZXkpKTsKKyAgICBkZXJpdmVfa2V5KHMtPmFlcywgcy0+bWFzdGVyX3NhbHQsIDB4MDUsIHMtPnJ0Y3Bfc2FsdCwgc2l6ZW9mKHMtPnJ0Y3Bfc2FsdCkpOworICAgIGRlcml2ZV9rZXkocy0+YWVzLCBzLT5tYXN0ZXJfc2FsdCwgMHgwNCwgcy0+cnRjcF9hdXRoLCBzaXplb2Yocy0+cnRjcF9hdXRoKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9pdih1aW50OF90ICppdiwgY29uc3QgdWludDhfdCAqc2FsdCwgdWludDY0X3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3NyYykKK3sKKyAgICB1aW50OF90IGluZGV4YnVmWzhdOworICAgIGludCBpOworICAgIG1lbXNldChpdiwgMCwgMTYpOworICAgIEFWX1dCMzIoJml2WzRdLCBzc3JjKTsKKyAgICBBVl9XQjY0KGluZGV4YnVmLCBpbmRleCk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgLy8gaW5kZXggPDwgMTYKKyAgICAgICAgaXZbNiArIGldIF49IGluZGV4YnVmW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQorICAgICAgICBpdltpXSBePSBzYWx0W2ldOworfQorCitpbnQgZmZfc3J0cF9kZWNyeXB0KHN0cnVjdCBTUlRQQ29udGV4dCAqcywgdWludDhfdCAqYnVmLCBpbnQgKmxlbnB0cikKK3sKKyAgICB1aW50OF90IGl2WzE2XSA9IHsgMCB9LCBobWFjWzIwXTsKKyAgICBpbnQgbGVuID0gKmxlbnB0cjsKKyAgICBpbnQgYXZfdW5pbml0KHNlcV9sYXJnZXN0KTsKKyAgICB1aW50MzJfdCBzc3JjLCBhdl91bmluaXQocm9jKTsKKyAgICB1aW50NjRfdCBpbmRleDsKKyAgICBpbnQgcnRjcCwgaG1hY19zaXplOworCisgICAgLy8gVE9ETzogTWlzc2luZyByZXBsYXkgcHJvdGVjdGlvbgorCisgICAgaWYgKGxlbiA8IDIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcnRjcCA9IFJUUF9QVF9JU19SVENQKGJ1ZlsxXSk7CisgICAgaG1hY19zaXplID0gcnRjcCA/IHMtPnJ0Y3BfaG1hY19zaXplIDogcy0+cnRwX2htYWNfc2l6ZTsKKworICAgIGlmIChsZW4gPCBobWFjX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgLy8gQXV0aGVudGljYXRpb24gSE1BQworICAgIGF2X2htYWNfaW5pdChzLT5obWFjLCBydGNwID8gcy0+cnRjcF9hdXRoIDogcy0+cnRwX2F1dGgsIHNpemVvZihzLT5ydHBfYXV0aCkpOworICAgIC8vIElmIE1LSSBpcyB1c2VkLCB0aGlzIHNob3VsZCBleGNsdWRlIHRoZSBNS0kgYXMgd2VsbAorICAgIGF2X2htYWNfdXBkYXRlKHMtPmhtYWMsIGJ1ZiwgbGVuIC0gaG1hY19zaXplKTsKKworICAgIGlmICghcnRjcCkgeworICAgICAgICBpbnQgc2VxID0gQVZfUkIxNihidWYgKyAyKTsKKyAgICAgICAgdWludDMyX3QgdjsKKyAgICAgICAgdWludDhfdCByb2NidWZbNF07CisKKyAgICAgICAgLy8gUkZDIDM3MTEgc2VjdGlvbiAzLjMuMSwgYXBwZW5kaXggQQorICAgICAgICBzZXFfbGFyZ2VzdCA9IHMtPnNlcV9pbml0aWFsaXplZCA/IHMtPnNlcV9sYXJnZXN0IDogc2VxOworICAgICAgICB2ID0gcm9jID0gcy0+cm9jOworICAgICAgICBpZiAoc2VxX2xhcmdlc3QgPCAzMjc2OCkgeworICAgICAgICAgICAgaWYgKHNlcSAtIHNlcV9sYXJnZXN0ID4gMzI3NjgpCisgICAgICAgICAgICAgICAgdiA9IHJvYyAtIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc2VxX2xhcmdlc3QgLSAzMjc2OCA+IHNlcSkKKyAgICAgICAgICAgICAgICB2ID0gcm9jICsgMTsKKyAgICAgICAgfQorICAgICAgICBpZiAodiA9PSByb2MpIHsKKyAgICAgICAgICAgIHNlcV9sYXJnZXN0ID0gRkZNQVgoc2VxX2xhcmdlc3QsIHNlcSk7CisgICAgICAgIH0gZWxzZSBpZiAodiA9PSByb2MgKyAxKSB7CisgICAgICAgICAgICBzZXFfbGFyZ2VzdCA9IHNlcTsKKyAgICAgICAgICAgIHJvYyA9IHY7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSBzZXEgKyAoKCh1aW50NjRfdCl2KSA8PCAxNik7CisKKyAgICAgICAgQVZfV0IzMihyb2NidWYsIHJvYyk7CisgICAgICAgIGF2X2htYWNfdXBkYXRlKHMtPmhtYWMsIHJvY2J1ZiwgNCk7CisgICAgfQorCisgICAgYXZfaG1hY19maW5hbChzLT5obWFjLCBobWFjLCBzaXplb2YoaG1hYykpOworICAgIGlmIChtZW1jbXAoaG1hYywgYnVmICsgbGVuIC0gaG1hY19zaXplLCBobWFjX3NpemUpKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIkhNQUMgbWlzbWF0Y2hcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBsZW4gLT0gaG1hY19zaXplOworICAgICpsZW5wdHIgPSBsZW47CisKKyAgICBpZiAobGVuIDwgMTIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKHJ0Y3ApIHsKKyAgICAgICAgdWludDMyX3Qgc3J0Y3BfaW5kZXggPSBBVl9SQjMyKGJ1ZiArIGxlbiAtIDQpOworICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgKmxlbnB0ciA9IGxlbjsKKworICAgICAgICBzc3JjID0gQVZfUkIzMihidWYgKyA0KTsKKyAgICAgICAgaW5kZXggPSBzcnRjcF9pbmRleCAmIDB4N2ZmZmZmZmY7CisKKyAgICAgICAgYnVmICs9IDg7CisgICAgICAgIGxlbiAtPSA4OworICAgICAgICBpZiAoIShzcnRjcF9pbmRleCAmIDB4ODAwMDAwMDApKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGV4dCwgY3NyYzsKKyAgICAgICAgcy0+c2VxX2luaXRpYWxpemVkID0gMTsKKyAgICAgICAgcy0+c2VxX2xhcmdlc3QgICAgID0gc2VxX2xhcmdlc3Q7CisgICAgICAgIHMtPnJvYyAgICAgICAgICAgICA9IHJvYzsKKworICAgICAgICBjc3JjID0gYnVmWzBdICYgMHgwZjsKKyAgICAgICAgZXh0ICA9IGJ1ZlswXSAmIDB4MTA7CisgICAgICAgIHNzcmMgPSBBVl9SQjMyKGJ1ZiArIDgpOworCisgICAgICAgIGJ1ZiArPSAxMjsKKyAgICAgICAgbGVuIC09IDEyOworCisgICAgICAgIGJ1ZiArPSA0ICogY3NyYzsKKyAgICAgICAgbGVuIC09IDQgKiBjc3JjOworICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGlmIChleHQpIHsKKyAgICAgICAgICAgIGlmIChsZW4gPCA0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZXh0ID0gKEFWX1JCMTYoYnVmICsgMikgKyAxKSAqIDQ7CisgICAgICAgICAgICBpZiAobGVuIDwgZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgbGVuIC09IGV4dDsKKyAgICAgICAgICAgIGJ1ZiArPSBleHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjcmVhdGVfaXYoaXYsIHJ0Y3AgPyBzLT5ydGNwX3NhbHQgOiBzLT5ydHBfc2FsdCwgaW5kZXgsIHNzcmMpOworICAgIGF2X2Flc19pbml0KHMtPmFlcywgcnRjcCA/IHMtPnJ0Y3Bfa2V5IDogcy0+cnRwX2tleSwgMTI4LCAwKTsKKyAgICBlbmNyeXB0X2NvdW50ZXIocy0+YWVzLCBpdiwgYnVmLCBsZW4pOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9zcnRwX2VuY3J5cHQoc3RydWN0IFNSVFBDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICppbiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0LCBpbnQgb3V0bGVuKQoreworICAgIHVpbnQ4X3QgaXZbMTZdID0geyAwIH0sIGhtYWNbMjBdOworICAgIHVpbnQ2NF90IGluZGV4OworICAgIHVpbnQzMl90IHNzcmM7CisgICAgaW50IHJ0Y3AsIGhtYWNfc2l6ZSwgcGFkZGluZzsKKyAgICB1aW50OF90ICpidWY7CisKKyAgICBpZiAobGVuIDwgOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBydGNwID0gUlRQX1BUX0lTX1JUQ1AoaW5bMV0pOworICAgIGhtYWNfc2l6ZSA9IHJ0Y3AgPyBzLT5ydGNwX2htYWNfc2l6ZSA6IHMtPnJ0cF9obWFjX3NpemU7CisgICAgcGFkZGluZyA9IGhtYWNfc2l6ZTsKKyAgICBpZiAocnRjcCkKKyAgICAgICAgcGFkZGluZyArPSA0OyAvLyBGb3IgdGhlIFJUQ1AgaW5kZXgKKworICAgIGlmIChsZW4gKyBwYWRkaW5nID4gb3V0bGVuKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG1lbWNweShvdXQsIGluLCBsZW4pOworICAgIGJ1ZiA9IG91dDsKKworICAgIGlmIChydGNwKSB7CisgICAgICAgIHNzcmMgPSBBVl9SQjMyKGJ1ZiArIDQpOworICAgICAgICBpbmRleCA9IHMtPnJ0Y3BfaW5kZXgrKzsKKworICAgICAgICBidWYgKz0gODsKKyAgICAgICAgbGVuIC09IDg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGV4dCwgY3NyYzsKKyAgICAgICAgaW50IHNlcSA9IEFWX1JCMTYoYnVmICsgMik7CisKKyAgICAgICAgaWYgKGxlbiA8IDEyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgc3NyYyA9IEFWX1JCMzIoYnVmICsgOCk7CisKKyAgICAgICAgaWYgKHNlcSA8IHMtPnNlcV9sYXJnZXN0KQorICAgICAgICAgICAgcy0+cm9jKys7CisgICAgICAgIHMtPnNlcV9sYXJnZXN0ID0gc2VxOworICAgICAgICBpbmRleCA9IHNlcSArICgoKHVpbnQ2NF90KXMtPnJvYykgPDwgMTYpOworCisgICAgICAgIGNzcmMgPSBidWZbMF0gJiAweDBmOworICAgICAgICBleHQgPSBidWZbMF0gJiAweDEwOworCisgICAgICAgIGJ1ZiArPSAxMjsKKyAgICAgICAgbGVuIC09IDEyOworCisgICAgICAgIGJ1ZiArPSA0ICogY3NyYzsKKyAgICAgICAgbGVuIC09IDQgKiBjc3JjOworICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGlmIChleHQpIHsKKyAgICAgICAgICAgIGlmIChsZW4gPCA0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZXh0ID0gKEFWX1JCMTYoYnVmICsgMikgKyAxKSAqIDQ7CisgICAgICAgICAgICBpZiAobGVuIDwgZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgbGVuIC09IGV4dDsKKyAgICAgICAgICAgIGJ1ZiArPSBleHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjcmVhdGVfaXYoaXYsIHJ0Y3AgPyBzLT5ydGNwX3NhbHQgOiBzLT5ydHBfc2FsdCwgaW5kZXgsIHNzcmMpOworICAgIGF2X2Flc19pbml0KHMtPmFlcywgcnRjcCA/IHMtPnJ0Y3Bfa2V5IDogcy0+cnRwX2tleSwgMTI4LCAwKTsKKyAgICBlbmNyeXB0X2NvdW50ZXIocy0+YWVzLCBpdiwgYnVmLCBsZW4pOworCisgICAgaWYgKHJ0Y3ApIHsKKyAgICAgICAgQVZfV0IzMihidWYgKyBsZW4sIDB4ODAwMDAwMDAgfCBpbmRleCk7CisgICAgICAgIGxlbiArPSA0OworICAgIH0KKworICAgIGF2X2htYWNfaW5pdChzLT5obWFjLCBydGNwID8gcy0+cnRjcF9hdXRoIDogcy0+cnRwX2F1dGgsIHNpemVvZihzLT5ydHBfYXV0aCkpOworICAgIGF2X2htYWNfdXBkYXRlKHMtPmhtYWMsIG91dCwgYnVmICsgbGVuIC0gb3V0KTsKKyAgICBpZiAoIXJ0Y3ApIHsKKyAgICAgICAgdWludDhfdCByb2NidWZbNF07CisgICAgICAgIEFWX1dCMzIocm9jYnVmLCBzLT5yb2MpOworICAgICAgICBhdl9obWFjX3VwZGF0ZShzLT5obWFjLCByb2NidWYsIDQpOworICAgIH0KKyAgICBhdl9obWFjX2ZpbmFsKHMtPmhtYWMsIGhtYWMsIHNpemVvZihobWFjKSk7CisKKyAgICBtZW1jcHkoYnVmICsgbGVuLCBobWFjLCBobWFjX3NpemUpOworICAgIGxlbiArPSBobWFjX3NpemU7CisgICAgcmV0dXJuIGJ1ZiArIGxlbiAtIG91dDsKK30KKworI2lmZGVmIFRFU1QKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgY29uc3QgY2hhciAqYWVzMTI4XzgwX2tleSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1uIjsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnRwX2FlczEyOF84MFtdID0geworICAgIC8vIFJUUCBoZWFkZXIKKyAgICAweDgwLCAweGUwLCAweDEyLCAweDM0LCAweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDEyLCAweDM0LCAweDU2LCAweDc4LAorICAgIC8vIGVuY3J5cHRlZCBwYXlsb2FkCisgICAgMHg2MiwgMHg2OSwgMHg3NiwgMHhjYSwgMHhjNSwKKyAgICAvLyBITUFDCisgICAgMHhhMSwgMHhhYywgMHgxYiwgMHhiNCwgMHhhMCwgMHgxYywgMHhkNSwgMHg0OSwgMHgyOCwgMHg5OSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ0Y3BfYWVzMTI4XzgwW10gPSB7CisgICAgLy8gUlRDUCBoZWFkZXIKKyAgICAweDgxLCAweGM5LCAweDAwLCAweDA3LCAweDEyLCAweDM0LCAweDU2LCAweDc4LAorICAgIC8vIGVuY3J5cHRlZCBwYXlsb2FkCisgICAgMHg4YSwgMHhhYywgMHhkYywgMHhhNSwgMHg0YywgMHhmNiwgMHg3OCwgMHhhNiwgMHg2MiwgMHg4ZiwgMHgyNCwgMHhkYSwKKyAgICAweDZjLCAweDA5LCAweDNmLCAweGE5LCAweDI4LCAweDdhLCAweGI1LCAweDdmLCAweDFmLCAweDBmLCAweGM5LCAweDM1LAorICAgIC8vIFJUQ1AgaW5kZXgKKyAgICAweDgwLCAweDAwLCAweDAwLCAweDAzLAorICAgIC8vIEhNQUMKKyAgICAweGU5LCAweDNiLCAweGMwLCAweDVjLCAweDBjLCAweDA2LCAweDlmLCAweGFiLCAweGMwLCAweGRlLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFlczEyOF8zMl9rZXkgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbiI7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ0cF9hZXMxMjhfMzJbXSA9IHsKKyAgICAvLyBSVFAgaGVhZGVyCisgICAgMHg4MCwgMHhlMCwgMHgxMiwgMHgzNCwgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwKKyAgICAvLyBlbmNyeXB0ZWQgcGF5bG9hZAorICAgIDB4NjIsIDB4NjksIDB4NzYsIDB4Y2EsIDB4YzUsCisgICAgLy8gSE1BQworICAgIDB4YTEsIDB4YWMsIDB4MWIsIDB4YjQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBydGNwX2FlczEyOF8zMltdID0geworICAgIC8vIFJUQ1AgaGVhZGVyCisgICAgMHg4MSwgMHhjOSwgMHgwMCwgMHgwNywgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwKKyAgICAvLyBlbmNyeXB0ZWQgcGF5bG9hZAorICAgIDB4MzUsIDB4ZTksIDB4YjUsIDB4ZmYsIDB4MGQsIDB4ZDEsIDB4ZGUsIDB4NzAsIDB4NzQsIDB4MTAsIDB4YWEsIDB4MWIsCisgICAgMHhiMiwgMHg4ZCwgMHhmMCwgMHgyMCwgMHgwMiwgMHg5OSwgMHg2YiwgMHgxYiwgMHgwYiwgMHhkMCwgMHg0NywgMHgzNCwKKyAgICAvLyBSVENQIGluZGV4CisgICAgMHg4MCwgMHgwMCwgMHgwMCwgMHgwNCwKKyAgICAvLyBITUFDCisgICAgMHg1YiwgMHhkMiwgMHhhOSwgMHg5ZCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphZXMxMjhfODBfMzJfa2V5ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW4iOworCitzdGF0aWMgY29uc3QgdWludDhfdCBydHBfYWVzMTI4XzgwXzMyW10gPSB7CisgICAgLy8gUlRQIGhlYWRlcgorICAgIDB4ODAsIDB4ZTAsIDB4MTIsIDB4MzQsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsCisgICAgLy8gZW5jcnlwdGVkIHBheWxvYWQKKyAgICAweDYyLCAweDY5LCAweDc2LCAweGNhLCAweGM1LAorICAgIC8vIEhNQUMKKyAgICAweGExLCAweGFjLCAweDFiLCAweGI0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnRjcF9hZXMxMjhfODBfMzJbXSA9IHsKKyAgICAvLyBSVENQIGhlYWRlcgorICAgIDB4ODEsIDB4YzksIDB4MDAsIDB4MDcsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsCisgICAgLy8gZW5jcnlwdGVkIHBheWxvYWQKKyAgICAweGQ2LCAweGFlLCAweGMxLCAweDU4LCAweDYzLCAweDcwLCAweGM5LCAweDg4LCAweDY2LCAweDI2LCAweDFjLCAweDUzLAorICAgIDB4ZmYsIDB4NWQsIDB4NWQsIDB4MmIsIDB4MGYsIDB4OGMsIDB4NzIsIDB4M2UsIDB4YzksIDB4MWQsIDB4NDMsIDB4ZjksCisgICAgLy8gUlRDUCBpbmRleAorICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDUsCisgICAgLy8gSE1BQworICAgIDB4MDksIDB4MTYsIDB4YjQsIDB4MjcsIDB4OWEsIDB4ZTksIDB4OTIsIDB4MjYsIDB4NGUsIDB4MTAsCit9OworCitzdGF0aWMgdm9pZCBwcmludF9kYXRhKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgIHByaW50ZigiJTAyeCIsIGJ1ZltpXSk7CisgICAgcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgaW50IHRlc3RfZGVjcnlwdChzdHJ1Y3QgU1JUUENvbnRleHQgKnNydHAsIGNvbnN0IHVpbnQ4X3QgKmluLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0KQoreworICAgIG1lbWNweShvdXQsIGluLCBsZW4pOworICAgIGlmICghZmZfc3J0cF9kZWNyeXB0KHNydHAsIG91dCwgJmxlbikpIHsKKyAgICAgICAgcHJpbnRfZGF0YShvdXQsIGxlbik7CisgICAgICAgIHJldHVybiBsZW47CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBpbl9sZW4sIGNvbnN0IGNoYXIgKnN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBzdHJ1Y3QgU1JUUENvbnRleHQgZW5jID0geyAwIH0sIGRlYyA9IHsgMCB9OworICAgIGludCBsZW47CisgICAgY2hhciBidWZbUlRQX01BWF9QQUNLRVRfTEVOR1RIXTsKKyAgICBmZl9zcnRwX3NldF9jcnlwdG8oJmVuYywgc3VpdGUsIGtleSk7CisgICAgZmZfc3J0cF9zZXRfY3J5cHRvKCZkZWMsIHN1aXRlLCBrZXkpOworICAgIGxlbiA9IGZmX3NydHBfZW5jcnlwdCgmZW5jLCBkYXRhLCBpbl9sZW4sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIGlmICghZmZfc3J0cF9kZWNyeXB0KCZkZWMsIGJ1ZiwgJmxlbikpIHsKKyAgICAgICAgaWYgKGxlbiA9PSBpbl9sZW4gJiYgIW1lbWNtcChidWYsIGRhdGEsIGxlbikpCisgICAgICAgICAgICBwcmludGYoIkRlY3J5cHRlZCBjb250ZW50IG1hdGNoZXMgaW5wdXRcbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIkRlY3J5cHRlZCBjb250ZW50IGRvZXNuJ3QgbWF0Y2ggaW5wdXRcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiRGVjcnlwdGlvbiBmYWlsZWRcbiIpOworICAgIH0KKyAgICBmZl9zcnRwX2ZyZWUoJmVuYyk7CisgICAgZmZfc3J0cF9mcmVlKCZkZWMpOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICphZXMxMjhfODBfc3VpdGUgPSAiQUVTX0NNXzEyOF9ITUFDX1NIQTFfODAiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphZXMxMjhfMzJfc3VpdGUgPSAiQUVTX0NNXzEyOF9ITUFDX1NIQTFfMzIiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphZXMxMjhfODBfMzJfc3VpdGUgPSAiU1JUUF9BRVMxMjhfQ01fSE1BQ19TSEExXzMyIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdGVzdF9rZXkgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwQUJDRCI7CisgICAgdWludDhfdCBidWZbUlRQX01BWF9QQUNLRVRfTEVOR1RIXTsKKyAgICBzdHJ1Y3QgU1JUUENvbnRleHQgc3J0cCA9IHsgMCB9OworICAgIGludCBsZW47CisgICAgZmZfc3J0cF9zZXRfY3J5cHRvKCZzcnRwLCBhZXMxMjhfODBfc3VpdGUsIGFlczEyOF84MF9rZXkpOworICAgIGxlbiA9IHRlc3RfZGVjcnlwdCgmc3J0cCwgcnRwX2FlczEyOF84MCwgc2l6ZW9mKHJ0cF9hZXMxMjhfODApLCBidWYpOworICAgIHRlc3RfZW5jcnlwdChidWYsIGxlbiwgYWVzMTI4XzgwX3N1aXRlLCB0ZXN0X2tleSk7CisgICAgdGVzdF9lbmNyeXB0KGJ1ZiwgbGVuLCBhZXMxMjhfMzJfc3VpdGUsIHRlc3Rfa2V5KTsKKyAgICB0ZXN0X2VuY3J5cHQoYnVmLCBsZW4sIGFlczEyOF84MF8zMl9zdWl0ZSwgdGVzdF9rZXkpOworICAgIHRlc3RfZGVjcnlwdCgmc3J0cCwgcnRjcF9hZXMxMjhfODAsIHNpemVvZihydGNwX2FlczEyOF84MCksIGJ1Zik7CisgICAgdGVzdF9lbmNyeXB0KGJ1ZiwgbGVuLCBhZXMxMjhfODBfc3VpdGUsIHRlc3Rfa2V5KTsKKyAgICB0ZXN0X2VuY3J5cHQoYnVmLCBsZW4sIGFlczEyOF8zMl9zdWl0ZSwgdGVzdF9rZXkpOworICAgIHRlc3RfZW5jcnlwdChidWYsIGxlbiwgYWVzMTI4XzgwXzMyX3N1aXRlLCB0ZXN0X2tleSk7CisgICAgZmZfc3J0cF9mcmVlKCZzcnRwKTsKKworICAgIG1lbXNldCgmc3J0cCwgMCwgc2l6ZW9mKHNydHApKTsgLy8gQ2xlYXIgdGhlIGNvbnRleHQKKyAgICBmZl9zcnRwX3NldF9jcnlwdG8oJnNydHAsIGFlczEyOF8zMl9zdWl0ZSwgYWVzMTI4XzMyX2tleSk7CisgICAgdGVzdF9kZWNyeXB0KCZzcnRwLCBydHBfYWVzMTI4XzMyLCBzaXplb2YocnRwX2FlczEyOF8zMiksIGJ1Zik7CisgICAgdGVzdF9kZWNyeXB0KCZzcnRwLCBydGNwX2FlczEyOF8zMiwgc2l6ZW9mKHJ0Y3BfYWVzMTI4XzMyKSwgYnVmKTsKKyAgICBmZl9zcnRwX2ZyZWUoJnNydHApOworCisgICAgbWVtc2V0KCZzcnRwLCAwLCBzaXplb2Yoc3J0cCkpOyAvLyBDbGVhciB0aGUgY29udGV4dAorICAgIGZmX3NydHBfc2V0X2NyeXB0bygmc3J0cCwgYWVzMTI4XzgwXzMyX3N1aXRlLCBhZXMxMjhfODBfMzJfa2V5KTsKKyAgICB0ZXN0X2RlY3J5cHQoJnNydHAsIHJ0cF9hZXMxMjhfODBfMzIsIHNpemVvZihydHBfYWVzMTI4XzgwXzMyKSwgYnVmKTsKKyAgICB0ZXN0X2RlY3J5cHQoJnNydHAsIHJ0Y3BfYWVzMTI4XzgwXzMyLCBzaXplb2YocnRjcF9hZXMxMjhfODBfMzIpLCBidWYpOworICAgIGZmX3NydHBfZnJlZSgmc3J0cCk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3NydHAuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zcnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4OWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zcnRwLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIFNSVFAgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9TUlRQX0gKKyNkZWZpbmUgQVZGT1JNQVRfU1JUUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RydWN0IEFWQUVTOworc3RydWN0IEFWSE1BQzsKKworc3RydWN0IFNSVFBDb250ZXh0IHsKKyAgICBzdHJ1Y3QgQVZBRVMgKmFlczsKKyAgICBzdHJ1Y3QgQVZITUFDICpobWFjOworICAgIGludCBydHBfaG1hY19zaXplLCBydGNwX2htYWNfc2l6ZTsKKyAgICB1aW50OF90IG1hc3Rlcl9rZXlbMTZdOworICAgIHVpbnQ4X3QgbWFzdGVyX3NhbHRbMTRdOworICAgIHVpbnQ4X3QgcnRwX2tleVsxNl0sICBydGNwX2tleVsxNl07CisgICAgdWludDhfdCBydHBfc2FsdFsxNF0sIHJ0Y3Bfc2FsdFsxNF07CisgICAgdWludDhfdCBydHBfYXV0aFsyMF0sIHJ0Y3BfYXV0aFsyMF07CisgICAgaW50IHNlcV9sYXJnZXN0LCBzZXFfaW5pdGlhbGl6ZWQ7CisgICAgdWludDMyX3Qgcm9jOworCisgICAgdWludDMyX3QgcnRjcF9pbmRleDsKK307CisKK2ludCBmZl9zcnRwX3NldF9jcnlwdG8oc3RydWN0IFNSVFBDb250ZXh0ICpzLCBjb25zdCBjaGFyICpzdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGFyYW1zKTsKK3ZvaWQgZmZfc3J0cF9mcmVlKHN0cnVjdCBTUlRQQ29udGV4dCAqcyk7CitpbnQgZmZfc3J0cF9kZWNyeXB0KHN0cnVjdCBTUlRQQ29udGV4dCAqcywgdWludDhfdCAqYnVmLCBpbnQgKmxlbnB0cik7CitpbnQgZmZfc3J0cF9lbmNyeXB0KHN0cnVjdCBTUlRQQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqaW4sIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm91dCwgaW50IG91dGxlbik7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9TUlRQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9zcnRwcHJvdG8uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zcnRwcHJvdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWQ2YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3NydHBwcm90by5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogU1JUUCBuZXR3b3JrIHByb3RvY29sCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKworI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicnRwZGVjLmgiCisjaW5jbHVkZSAic3J0cC5oIgorCit0eXBlZGVmIHN0cnVjdCBTUlRQUHJvdG9Db250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBVUkxDb250ZXh0ICpydHBfaGQ7CisgICAgY29uc3QgY2hhciAqb3V0X3N1aXRlLCAqb3V0X3BhcmFtczsKKyAgICBjb25zdCBjaGFyICppbl9zdWl0ZSwgKmluX3BhcmFtczsKKyAgICBzdHJ1Y3QgU1JUUENvbnRleHQgc3J0cF9vdXQsIHNydHBfaW47CisgICAgdWludDhfdCBlbmNyeXB0YnVmW1JUUF9NQVhfUEFDS0VUX0xFTkdUSF07Cit9IFNSVFBQcm90b0NvbnRleHQ7CisKKyNkZWZpbmUgRCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorI2RlZmluZSBFIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInNydHBfb3V0X3N1aXRlIiwgIiIsIG9mZnNldG9mKFNSVFBQcm90b0NvbnRleHQsIG91dF9zdWl0ZSksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBFIH0sCisgICAgeyAic3J0cF9vdXRfcGFyYW1zIiwgIiIsIG9mZnNldG9mKFNSVFBQcm90b0NvbnRleHQsIG91dF9wYXJhbXMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgMCwgMCwgRSB9LAorICAgIHsgInNydHBfaW5fc3VpdGUiLCAiIiwgb2Zmc2V0b2YoU1JUUFByb3RvQ29udGV4dCwgaW5fc3VpdGUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgMCwgMCwgRSB9LAorICAgIHsgInNydHBfaW5fcGFyYW1zIiwgIiIsIG9mZnNldG9mKFNSVFBQcm90b0NvbnRleHQsIGluX3BhcmFtcyksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBFIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHNydHBfY29udGV4dF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAic3J0cCIsCisgICAgLml0ZW1fbmFtZSAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgaW50IHNydHBfY2xvc2UoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBTUlRQUHJvdG9Db250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGZmX3NydHBfZnJlZSgmcy0+c3J0cF9vdXQpOworICAgIGZmX3NydHBfZnJlZSgmcy0+c3J0cF9pbik7CisgICAgZmZ1cmxfY2xvc2Uocy0+cnRwX2hkKTsKKyAgICBzLT5ydHBfaGQgPSBOVUxMOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNydHBfb3BlbihVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmksIGludCBmbGFncykKK3sKKyAgICBTUlRQUHJvdG9Db250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGNoYXIgaG9zdG5hbWVbMjU2XSwgYnVmWzEwMjRdLCBwYXRoWzEwMjRdOworICAgIGludCBydHBfcG9ydCwgcmV0OworCisgICAgaWYgKHMtPm91dF9zdWl0ZSAmJiBzLT5vdXRfcGFyYW1zKQorICAgICAgICBpZiAoKHJldCA9IGZmX3NydHBfc2V0X2NyeXB0bygmcy0+c3J0cF9vdXQsIHMtPm91dF9zdWl0ZSwgcy0+b3V0X3BhcmFtcykpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAocy0+aW5fc3VpdGUgJiYgcy0+aW5fcGFyYW1zKQorICAgICAgICBpZiAoKHJldCA9IGZmX3NydHBfc2V0X2NyeXB0bygmcy0+c3J0cF9pbiwgcy0+aW5fc3VpdGUsIHMtPmluX3BhcmFtcykpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGF2X3VybF9zcGxpdChOVUxMLCAwLCBOVUxMLCAwLCBob3N0bmFtZSwgc2l6ZW9mKGhvc3RuYW1lKSwgJnJ0cF9wb3J0LAorICAgICAgICAgICAgICAgICBwYXRoLCBzaXplb2YocGF0aCksIHVyaSk7CisgICAgZmZfdXJsX2pvaW4oYnVmLCBzaXplb2YoYnVmKSwgInJ0cCIsIE5VTEwsIGhvc3RuYW1lLCBydHBfcG9ydCwgIiVzIiwgcGF0aCk7CisgICAgaWYgKChyZXQgPSBmZnVybF9vcGVuKCZzLT5ydHBfaGQsIGJ1ZiwgZmxhZ3MsICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGgtPm1heF9wYWNrZXRfc2l6ZSA9IEZGTUlOKHMtPnJ0cF9oZC0+bWF4X3BhY2tldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzLT5lbmNyeXB0YnVmKSkgLSAxNDsKKyAgICBoLT5pc19zdHJlYW1lZCA9IDE7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgc3J0cF9jbG9zZShoKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNydHBfcmVhZChVUkxDb250ZXh0ICpoLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFNSVFBQcm90b0NvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKK3N0YXJ0OgorICAgIHJldCA9IGZmdXJsX3JlYWQocy0+cnRwX2hkLCBidWYsIHNpemUpOworICAgIGlmIChyZXQgPiAwICYmIHMtPnNydHBfaW4uYWVzKSB7CisgICAgICAgIGlmIChmZl9zcnRwX2RlY3J5cHQoJnMtPnNydHBfaW4sIGJ1ZiwgJnJldCkgPCAwKQorICAgICAgICAgICAgZ290byBzdGFydDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzcnRwX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgU1JUUFByb3RvQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpZiAoIXMtPnNydHBfb3V0LmFlcykKKyAgICAgICAgcmV0dXJuIGZmdXJsX3dyaXRlKHMtPnJ0cF9oZCwgYnVmLCBzaXplKTsKKyAgICBzaXplID0gZmZfc3J0cF9lbmNyeXB0KCZzLT5zcnRwX291dCwgYnVmLCBzaXplLCBzLT5lbmNyeXB0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHMtPmVuY3J5cHRidWYpKTsKKyAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBzaXplOworICAgIHJldHVybiBmZnVybF93cml0ZShzLT5ydHBfaGQsIHMtPmVuY3J5cHRidWYsIHNpemUpOworfQorCitzdGF0aWMgaW50IHNydHBfZ2V0X2ZpbGVfaGFuZGxlKFVSTENvbnRleHQgKmgpCit7CisgICAgU1JUUFByb3RvQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKHMtPnJ0cF9oZCk7Cit9CisKK3N0YXRpYyBpbnQgc3J0cF9nZXRfbXVsdGlfZmlsZV9oYW5kbGUoVVJMQ29udGV4dCAqaCwgaW50ICoqaGFuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1oYW5kbGVzKQoreworICAgIFNSVFBQcm90b0NvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmdXJsX2dldF9tdWx0aV9maWxlX2hhbmRsZShzLT5ydHBfaGQsIGhhbmRsZXMsIG51bWhhbmRsZXMpOworfQorCitVUkxQcm90b2NvbCBmZl9zcnRwX3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgICAgID0gInNydHAiLAorICAgIC51cmxfb3BlbiAgICAgICAgICAgICAgICAgID0gc3J0cF9vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICAgICAgICAgICAgID0gc3J0cF9yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICAgICAgICAgICAgID0gc3J0cF93cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgICAgICAgICAgICA9IHNydHBfY2xvc2UsCisgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgICAgICAgPSBzcnRwX2dldF9maWxlX2hhbmRsZSwKKyAgICAudXJsX2dldF9tdWx0aV9maWxlX2hhbmRsZSA9IHNydHBfZ2V0X211bHRpX2ZpbGVfaGFuZGxlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgICAgID0gc2l6ZW9mKFNSVFBQcm90b0NvbnRleHQpLAorICAgIC5wcml2X2RhdGFfY2xhc3MgICAgICAgICAgID0gJnNydHBfY29udGV4dF9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICAgICAgICAgICAgICA9IFVSTF9QUk9UT0NPTF9GTEFHX05FVFdPUkssCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3N0bGRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3N0bGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NGM3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3RsZGVjLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgRWVqeWEgU2luZ2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU1RMIHN1YnRpdGxlcyBmb3JtYXQgZGVtdXhlcgorICogQHNlZSBodHRwczovL2RvY3VtZW50YXRpb24uYXBwbGUuY29tL2VuL2R2ZHN0dWRpb3Byby91c2VybWFudWFsL2luZGV4Lmh0bWwjY2hhcHRlcj0xOSUyNnNlY3Rpb249MTMlMjZ0YXNrcz10cnVlCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdWJ0aXRsZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBGRkRlbXV4U3VidGl0bGVzUXVldWUgcTsKK30gU1RMQ29udGV4dDsKKworc3RhdGljIGludCBzdGxfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY2hhciBjOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciA9IHAtPmJ1ZjsKKworICAgIGlmIChBVl9SQjI0KHB0cikgPT0gMHhFRkJCQkYpCisgICAgICAgIHB0ciArPSAzOyAgLyogc2tpcCBVVEYtOCBCT00gKi8KKworICAgIHdoaWxlICgqcHRyID09ICdccicgfHwgKnB0ciA9PSAnXG4nIHx8ICpwdHIgPT0gJyQnIHx8ICFzdHJuY21wKHB0ciwgIi8vIiAsIDIpKQorICAgICAgICBwdHIgKz0gZmZfc3VidGl0bGVzX25leHRfbGluZShwdHIpOworCisgICAgaWYgKHNzY2FuZihwdHIsICIlKmQ6JSpkOiUqZDolKmQgLCAlKmQ6JSpkOiUqZDolKmQgLCAlYyIsICZjKSA9PSAxKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludDY0X3QgZ2V0X3B0cyhjaGFyICoqYnVmLCBpbnQgKmR1cmF0aW9uKQoreworICAgIGludCBoaDEsIG1tMSwgc3MxLCBtczE7CisgICAgaW50IGhoMiwgbW0yLCBzczIsIG1zMjsKKyAgICBpbnQgbGVuID0gMDsKKworICAgIGlmIChzc2NhbmYoKmJ1ZiwgIiUyZDolMmQ6JTJkOiUyZCAsICUyZDolMmQ6JTJkOiUyZCAsICVuIiwKKyAgICAgICAgICAgICAgICAmaGgxLCAmbW0xLCAmc3MxLCAmbXMxLAorICAgICAgICAgICAgICAgICZoaDIsICZtbTIsICZzczIsICZtczIsICZsZW4pID49IDggJiYgbGVuID4gMCkgeworICAgICAgICBpbnQ2NF90IHN0YXJ0ID0gKGhoMSozNjAwTEwgKyBtbTEqNjBMTCArIHNzMSkgKiAxMDBMTCArIG1zMTsKKyAgICAgICAgaW50NjRfdCBlbmQgPSAoaGgyKjM2MDBMTCArIG1tMio2MExMICsgc3MyKSAqIDEwMExMICsgbXMyOworICAgICAgICAqZHVyYXRpb24gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgKmJ1ZiArPSBsZW47CisgICAgICAgIHJldHVybiBzdGFydDsKKyAgICB9CisgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworfQorCitzdGF0aWMgaW50IHN0bF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgU1RMQ29udGV4dCAqc3RsID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDApOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9TVEw7CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihzLT5wYikpIHsKKyAgICAgICAgY2hhciBsaW5lWzQwOTZdOworICAgICAgICBjaGFyICpwID0gbGluZTsKKyAgICAgICAgY29uc3QgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICBpbnQgbGVuID0gZmZfZ2V0X2xpbmUocy0+cGIsIGxpbmUsIHNpemVvZihsaW5lKSk7CisgICAgICAgIGludDY0X3QgcHRzX3N0YXJ0OworICAgICAgICBpbnQgZHVyYXRpb247CisKKyAgICAgICAgaWYgKCFsZW4pCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBsaW5lW3N0cmNzcG4obGluZSwgIlxyXG4iKV0gPSAwOworICAgICAgICBwdHNfc3RhcnQgPSBnZXRfcHRzKCZwICwgJmR1cmF0aW9uKTsKKworICAgICAgICBpZiAocHRzX3N0YXJ0ICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBBVlBhY2tldCAqc3ViOworICAgICAgICAgICAgc3ViID0gZmZfc3VidGl0bGVzX3F1ZXVlX2luc2VydCgmc3RsLT5xLCBwLCBzdHJsZW4ocCksIDApOworICAgICAgICAgICAgaWYgKCFzdWIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIHN1Yi0+cG9zID0gcG9zOworICAgICAgICAgICAgc3ViLT5wdHMgPSBwdHNfc3RhcnQ7CisgICAgICAgICAgICBzdWItPmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIH0KKyAgICB9CisgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2ZpbmFsaXplKCZzdGwtPnEpOworICAgIHJldHVybiAwOworfQorc3RhdGljIGludCBzdGxfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFNUTENvbnRleHQgKnN0bCA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3JlYWRfcGFja2V0KCZzdGwtPnEsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgc3RsX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3RzLCBpbnQ2NF90IHRzLCBpbnQ2NF90IG1heF90cywgaW50IGZsYWdzKQoreworICAgIFNUTENvbnRleHQgKnN0bCA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJnN0bC0+cSwgcywgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdHMsIHRzLCBtYXhfdHMsIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzdGxfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgU1RMQ29udGV4dCAqc3RsID0gcy0+cHJpdl9kYXRhOworICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9jbGVhbigmc3RsLT5xKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zdGxfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic3RsIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3BydWNlIHN1YnRpdGxlIGZvcm1hdCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTVExDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBzdGxfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gc3RsX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHN0bF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrMiAgICAgPSBzdGxfcmVhZF9zZWVrLAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHN0bF9yZWFkX2Nsb3NlLAorICAgIC5leHRlbnNpb25zICAgICA9ICJzdGwiLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9zdWJmaWxlLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3ViZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODQzODQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3ViZmlsZS5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgU3ViZmlsZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIFVSTENvbnRleHQgKmg7CisgICAgaW50NjRfdCBzdGFydDsKKyAgICBpbnQ2NF90IGVuZDsKKyAgICBpbnQ2NF90IHBvczsKK30gU3ViZmlsZUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKGZpZWxkKSBvZmZzZXRvZihTdWJmaWxlQ29udGV4dCwgZmllbGQpCisjZGVmaW5lIEQgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHN1YmZpbGVfb3B0aW9uc1tdID0geworICAgIHsgInN0YXJ0IiwgInN0YXJ0IG9mZnNldCIsIE9GRlNFVChzdGFydCksIEFWX09QVF9UWVBFX0lOVDY0LCB7Lmk2NCA9IDB9LCAwLCBJTlQ2NF9NQVgsIEQgfSwKKyAgICB7ICJlbmQiLCAgICJlbmQgb2Zmc2V0IiwgICBPRkZTRVQoZW5kKSwgICBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSAwfSwgMCwgSU5UNjRfTUFYLCBEIH0sCisgICAgeyBOVUxMIH0KK307CisKKyN1bmRlZiBPRkZTRVQKKyN1bmRlZiBECisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHN1YmZpbGVfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAic3ViZmlsZSIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IHN1YmZpbGVfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBpbnQgc2xhdmVfc2VlayhVUkxDb250ZXh0ICpoKQoreworICAgIFN1YmZpbGVDb250ZXh0ICpjID0gaC0+cHJpdl9kYXRhOworICAgIGludDY0X3QgcmV0OworCisgICAgaWYgKChyZXQgPSBmZnVybF9zZWVrKGMtPmgsIGMtPnBvcywgU0VFS19TRVQpKSAhPSBjLT5wb3MpIHsKKyAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9CVUc7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJJbXBvc3NpYmxlIHRvIHNlZWsgaW4gZmlsZTogJXNcbiIsCisgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJmaWxlX29wZW4oVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCit7CisgICAgU3ViZmlsZUNvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmIChjLT5lbmQgPD0gYy0+c3RhcnQpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgImVuZCBiZWZvcmUgc3RhcnRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBhdl9zdHJzdGFydChmaWxlbmFtZSwgInN1YmZpbGU6IiwgJmZpbGVuYW1lKTsKKyAgICByZXQgPSBmZnVybF9vcGVuKCZjLT5oLCBmaWxlbmFtZSwgZmxhZ3MsICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIG9wdGlvbnMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGMtPnBvcyA9IGMtPnN0YXJ0OworICAgIGlmICgocmV0ID0gc2xhdmVfc2VlayhoKSkgPCAwKSB7CisgICAgICAgIGZmdXJsX2Nsb3NlKGMtPmgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJmaWxlX2Nsb3NlKFVSTENvbnRleHQgKmgpCit7CisgICAgU3ViZmlsZUNvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmdXJsX2Nsb3NlKGMtPmgpOworfQorCitzdGF0aWMgaW50IHN1YmZpbGVfcmVhZChVUkxDb250ZXh0ICpoLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKQoreworICAgIFN1YmZpbGVDb250ZXh0ICpjID0gaC0+cHJpdl9kYXRhOworICAgIGludDY0X3QgcmVzdCA9IGMtPmVuZCAtIGMtPnBvczsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHJlc3QgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc2l6ZSA9IEZGTUlOKHNpemUsIHJlc3QpOworICAgIHJldCA9IGZmdXJsX3JlYWQoYy0+aCwgYnVmLCBzaXplKTsKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIGMtPnBvcyArPSByZXQ7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludDY0X3Qgc3ViZmlsZV9zZWVrKFVSTENvbnRleHQgKmgsIGludDY0X3QgcG9zLCBpbnQgd2hlbmNlKQoreworICAgIFN1YmZpbGVDb250ZXh0ICpjID0gaC0+cHJpdl9kYXRhOworICAgIGludDY0X3QgbmV3X3BvcyA9IC0xOworICAgIGludCByZXQ7CisKKyAgICBpZiAod2hlbmNlID09IEFWU0VFS19TSVpFKQorICAgICAgICByZXR1cm4gYy0+ZW5kIC0gYy0+c3RhcnQ7CisgICAgc3dpdGNoICh3aGVuY2UpIHsKKyAgICBjYXNlIFNFRUtfU0VUOgorICAgICAgICBuZXdfcG9zID0gYy0+c3RhcnQgKyBwb3M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VFS19DVVI6CisgICAgICAgIG5ld19wb3MgKz0gcG9zOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFRUtfRU5EOgorICAgICAgICBuZXdfcG9zID0gYy0+ZW5kICsgYy0+cG9zOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG5ld19wb3MgPCBjLT5zdGFydCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBjLT5wb3MgPSBuZXdfcG9zOworICAgIGlmICgocmV0ID0gc2xhdmVfc2VlayhoKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBjLT5wb3MgLSBjLT5zdGFydDsKK30KKworVVJMUHJvdG9jb2wgZmZfc3ViZmlsZV9wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJzdWJmaWxlIiwKKyAgICAudXJsX29wZW4yICAgICAgICAgICA9IHN1YmZpbGVfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgICAgICA9IHN1YmZpbGVfcmVhZCwKKyAgICAudXJsX3NlZWsgICAgICAgICAgICA9IHN1YmZpbGVfc2VlaywKKyAgICAudXJsX2Nsb3NlICAgICAgICAgICA9IHN1YmZpbGVfY2xvc2UsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgPSBzaXplb2YoU3ViZmlsZUNvbnRleHQpLAorICAgIC5wcml2X2RhdGFfY2xhc3MgICAgID0gJnN1YmZpbGVfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3N1YnRpdGxlcy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3N1YnRpdGxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NjI0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3VidGl0bGVzLmMKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMyBDbMOpbWVudCBCxZNzY2ggPHUgcGtoIG1lPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJzdWJ0aXRsZXMuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisKK3ZvaWQgZmZfdGV4dF9pbml0X2F2aW8odm9pZCAqcywgRkZUZXh0UmVhZGVyICpyLCBBVklPQ29udGV4dCAqcGIpCit7CisgICAgaW50IGk7CisgICAgci0+cGIgPSBwYjsKKyAgICByLT5idWZfcG9zID0gci0+YnVmX2xlbiA9IDA7CisgICAgci0+dHlwZSA9IEZGX1VURl84OworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHItPmJ1ZltyLT5idWZfbGVuKytdID0gYXZpb19yOChyLT5wYik7CisgICAgaWYgKHN0cm5jbXAoIlx4RkZceEZFIiwgci0+YnVmLCAyKSA9PSAwKSB7CisgICAgICAgIHItPnR5cGUgPSBGRl9VVEYxNkxFOworICAgICAgICByLT5idWZfcG9zICs9IDI7CisgICAgfSBlbHNlIGlmIChzdHJuY21wKCJceEZFXHhGRiIsIHItPmJ1ZiwgMikgPT0gMCkgeworICAgICAgICByLT50eXBlID0gRkZfVVRGMTZCRTsKKyAgICAgICAgci0+YnVmX3BvcyArPSAyOworICAgIH0gZWxzZSB7CisgICAgICAgIHItPmJ1ZltyLT5idWZfbGVuKytdID0gYXZpb19yOChyLT5wYik7CisgICAgICAgIGlmIChzdHJuY21wKCJceEVGXHhCQlx4QkYiLCByLT5idWYsIDMpID09IDApIHsKKyAgICAgICAgICAgIC8vIFVURjgKKyAgICAgICAgICAgIHItPmJ1Zl9wb3MgKz0gMzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocyAmJiAoci0+dHlwZSA9PSBGRl9VVEYxNkxFIHx8IHItPnR5cGUgPT0gRkZfVVRGMTZCRSkpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICJVVEYxNiBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBVVEY4LCBkbyBub3Qgc3BlY2lmeSBhIGNoYXJhY3RlciBlbmNvZGluZ1xuIik7Cit9CisKK3ZvaWQgZmZfdGV4dF9pbml0X2J1ZihGRlRleHRSZWFkZXIgKnIsIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisgICAgbWVtc2V0KCZyLT5idWZfcGIsIDAsIHNpemVvZihyLT5idWZfcGIpKTsKKyAgICBmZmlvX2luaXRfY29udGV4dCgmci0+YnVmX3BiLCBidWYsIHNpemUsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGZmX3RleHRfaW5pdF9hdmlvKE5VTEwsIHIsICZyLT5idWZfcGIpOworfQorCitpbnQ2NF90IGZmX3RleHRfcG9zKEZGVGV4dFJlYWRlciAqcikKK3sKKyAgICByZXR1cm4gYXZpb190ZWxsKHItPnBiKSAtIHItPmJ1Zl9sZW4gKyByLT5idWZfcG9zOworfQorCitpbnQgZmZfdGV4dF9yOChGRlRleHRSZWFkZXIgKnIpCit7CisgICAgdWludDMyX3QgdmFsOworICAgIHVpbnQ4X3QgdG1wOworICAgIGlmIChyLT5idWZfcG9zIDwgci0+YnVmX2xlbikKKyAgICAgICAgcmV0dXJuIHItPmJ1ZltyLT5idWZfcG9zKytdOworICAgIGlmIChyLT50eXBlID09IEZGX1VURjE2TEUpIHsKKyAgICAgICAgR0VUX1VURjE2KHZhbCwgYXZpb19ybDE2KHItPnBiKSwgcmV0dXJuIDA7KQorICAgIH0gZWxzZSBpZiAoci0+dHlwZSA9PSBGRl9VVEYxNkJFKSB7CisgICAgICAgIEdFVF9VVEYxNih2YWwsIGF2aW9fcmIxNihyLT5wYiksIHJldHVybiAwOykKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYXZpb19yOChyLT5wYik7CisgICAgfQorICAgIGlmICghdmFsKQorICAgICAgICByZXR1cm4gMDsKKyAgICByLT5idWZfcG9zID0gMDsKKyAgICByLT5idWZfbGVuID0gMDsKKyAgICBQVVRfVVRGOCh2YWwsIHRtcCwgci0+YnVmW3ItPmJ1Zl9sZW4rK10gPSB0bXA7KQorICAgIHJldHVybiByLT5idWZbci0+YnVmX3BvcysrXTsgLy8gYnVmX2xlbiBpcyBhdCBsZWFzdCAxCit9CisKK3ZvaWQgZmZfdGV4dF9yZWFkKEZGVGV4dFJlYWRlciAqciwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBmb3IgKCA7IHNpemUgPiAwOyBzaXplLS0pCisgICAgICAgICpidWYrKyA9IGZmX3RleHRfcjgocik7Cit9CisKK2ludCBmZl90ZXh0X2VvZihGRlRleHRSZWFkZXIgKnIpCit7CisgICAgcmV0dXJuIHItPmJ1Zl9wb3MgPj0gci0+YnVmX2xlbiAmJiBhdmlvX2Zlb2Yoci0+cGIpOworfQorCitpbnQgZmZfdGV4dF9wZWVrX3I4KEZGVGV4dFJlYWRlciAqcikKK3sKKyAgICBpbnQgYzsKKyAgICBpZiAoci0+YnVmX3BvcyA8IHItPmJ1Zl9sZW4pCisgICAgICAgIHJldHVybiByLT5idWZbci0+YnVmX3Bvc107CisgICAgYyA9IGZmX3RleHRfcjgocik7CisgICAgaWYgKCFhdmlvX2Zlb2Yoci0+cGIpKSB7CisgICAgICAgIHItPmJ1Zl9wb3MgPSAwOworICAgICAgICByLT5idWZfbGVuID0gMTsKKyAgICAgICAgci0+YnVmWzBdID0gYzsKKyAgICB9CisgICAgcmV0dXJuIGM7Cit9CisKK0FWUGFja2V0ICpmZl9zdWJ0aXRsZXNfcXVldWVfaW5zZXJ0KEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSAqcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmV2ZW50LCBpbnQgbGVuLCBpbnQgbWVyZ2UpCit7CisgICAgQVZQYWNrZXQgKnN1YnMsICpzdWI7CisKKyAgICBpZiAobWVyZ2UgJiYgcS0+bmJfc3VicyA+IDApIHsKKyAgICAgICAgLyogbWVyZ2Ugd2l0aCBwcmV2aW91cyBldmVudCAqLworCisgICAgICAgIGludCBvbGRfbGVuOworICAgICAgICBzdWIgPSAmcS0+c3Vic1txLT5uYl9zdWJzIC0gMV07CisgICAgICAgIG9sZF9sZW4gPSBzdWItPnNpemU7CisgICAgICAgIGlmIChhdl9ncm93X3BhY2tldChzdWIsIGxlbikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG1lbWNweShzdWItPmRhdGEgKyBvbGRfbGVuLCBldmVudCwgbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBuZXcgZXZlbnQgKi8KKworICAgICAgICBpZiAocS0+bmJfc3VicyA+PSBJTlRfTUFYL3NpemVvZigqcS0+c3VicykgLSAxKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHN1YnMgPSBhdl9mYXN0X3JlYWxsb2MocS0+c3VicywgJnEtPmFsbG9jYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxLT5uYl9zdWJzICsgMSkgKiBzaXplb2YoKnEtPnN1YnMpKTsKKyAgICAgICAgaWYgKCFzdWJzKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHEtPnN1YnMgPSBzdWJzOworICAgICAgICBzdWIgPSAmc3Vic1txLT5uYl9zdWJzKytdOworICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChzdWIsIGxlbikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHN1Yi0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICBzdWItPnB0cyA9IHN1Yi0+ZHRzID0gMDsKKyAgICAgICAgbWVtY3B5KHN1Yi0+ZGF0YSwgZXZlbnQsIGxlbik7CisgICAgfQorICAgIHJldHVybiBzdWI7Cit9CisKK3N0YXRpYyBpbnQgY21wX3BrdF9zdWJfdHNfcG9zKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgQVZQYWNrZXQgKnMxID0gYTsKKyAgICBjb25zdCBBVlBhY2tldCAqczIgPSBiOworICAgIGlmIChzMS0+cHRzID09IHMyLT5wdHMpIHsKKyAgICAgICAgaWYgKHMxLT5wb3MgPT0gczItPnBvcykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gczEtPnBvcyA+IHMyLT5wb3MgPyAxIDogLTE7CisgICAgfQorICAgIHJldHVybiBzMS0+cHRzID4gczItPnB0cyA/IDEgOiAtMTsKK30KKworc3RhdGljIGludCBjbXBfcGt0X3N1Yl9wb3NfdHMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBBVlBhY2tldCAqczEgPSBhOworICAgIGNvbnN0IEFWUGFja2V0ICpzMiA9IGI7CisgICAgaWYgKHMxLT5wb3MgPT0gczItPnBvcykgeworICAgICAgICBpZiAoczEtPnB0cyA9PSBzMi0+cHRzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBzMS0+cHRzID4gczItPnB0cyA/IDEgOiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHMxLT5wb3MgPiBzMi0+cG9zID8gMSA6IC0xOworfQorCit2b2lkIGZmX3N1YnRpdGxlc19xdWV1ZV9maW5hbGl6ZShGRkRlbXV4U3VidGl0bGVzUXVldWUgKnEpCit7CisgICAgaW50IGk7CisKKyAgICBxc29ydChxLT5zdWJzLCBxLT5uYl9zdWJzLCBzaXplb2YoKnEtPnN1YnMpLAorICAgICAgICAgIHEtPnNvcnQgPT0gU1VCX1NPUlRfVFNfUE9TID8gY21wX3BrdF9zdWJfdHNfcG9zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjbXBfcGt0X3N1Yl9wb3NfdHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBxLT5uYl9zdWJzOyBpKyspCisgICAgICAgIGlmIChxLT5zdWJzW2ldLmR1cmF0aW9uID09IC0xICYmIGkgPCBxLT5uYl9zdWJzIC0gMSkKKyAgICAgICAgICAgIHEtPnN1YnNbaV0uZHVyYXRpb24gPSBxLT5zdWJzW2kgKyAxXS5wdHMgLSBxLT5zdWJzW2ldLnB0czsKK30KKworaW50IGZmX3N1YnRpdGxlc19xdWV1ZV9yZWFkX3BhY2tldChGRkRlbXV4U3VidGl0bGVzUXVldWUgKnEsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZQYWNrZXQgKnN1YiA9IHEtPnN1YnMgKyBxLT5jdXJyZW50X3N1Yl9pZHg7CisKKyAgICBpZiAocS0+Y3VycmVudF9zdWJfaWR4ID09IHEtPm5iX3N1YnMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICBpZiAoYXZfY29weV9wYWNrZXQocGt0LCBzdWIpIDwgMCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHBrdC0+ZHRzID0gcGt0LT5wdHM7CisgICAgcS0+Y3VycmVudF9zdWJfaWR4Kys7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VhcmNoX3N1Yl90cyhjb25zdCBGRkRlbXV4U3VidGl0bGVzUXVldWUgKnEsIGludDY0X3QgdHMpCit7CisgICAgaW50IHMxID0gMCwgczIgPSBxLT5uYl9zdWJzIC0gMTsKKworICAgIGlmIChzMiA8IHMxKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFUkFOR0UpOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgbWlkOworCisgICAgICAgIGlmIChzMSA9PSBzMikKKyAgICAgICAgICAgIHJldHVybiBzMTsKKyAgICAgICAgaWYgKHMxID09IHMyIC0gMSkKKyAgICAgICAgICAgIHJldHVybiBxLT5zdWJzW3MxXS5wdHMgPD0gcS0+c3Vic1tzMl0ucHRzID8gczEgOiBzMjsKKyAgICAgICAgbWlkID0gKHMxICsgczIpIC8gMjsKKyAgICAgICAgaWYgKHEtPnN1YnNbbWlkXS5wdHMgPD0gdHMpCisgICAgICAgICAgICBzMSA9IG1pZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgczIgPSBtaWQ7CisgICAgfQorfQorCitpbnQgZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoRkZEZW11eFN1YnRpdGxlc1F1ZXVlICpxLCBBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtaW5fdHMsIGludDY0X3QgdHMsIGludDY0X3QgbWF4X3RzLCBpbnQgZmxhZ3MpCit7CisgICAgaWYgKGZsYWdzICYgQVZTRUVLX0ZMQUdfQllURSkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBBVlNFRUtfRkxBR19GUkFNRSkgeworICAgICAgICBpZiAodHMgPCAwIHx8IHRzID49IHEtPm5iX3N1YnMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFUkFOR0UpOworICAgICAgICBxLT5jdXJyZW50X3N1Yl9pZHggPSB0czsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaSwgaWR4ID0gc2VhcmNoX3N1Yl90cyhxLCB0cyk7CisgICAgICAgIGludDY0X3QgdHNfc2VsZWN0ZWQ7CisKKyAgICAgICAgaWYgKGlkeCA8IDApCisgICAgICAgICAgICByZXR1cm4gaWR4OworICAgICAgICBmb3IgKGkgPSBpZHg7IGkgPCBxLT5uYl9zdWJzICYmIHEtPnN1YnNbaV0ucHRzIDwgbWluX3RzOyBpKyspCisgICAgICAgICAgICBpZiAoc3RyZWFtX2luZGV4ID09IC0xIHx8IHEtPnN1YnNbaV0uc3RyZWFtX2luZGV4ID09IHN0cmVhbV9pbmRleCkKKyAgICAgICAgICAgICAgICBpZHggPSBpOworICAgICAgICBmb3IgKGkgPSBpZHg7IGkgPiAwICYmIHEtPnN1YnNbaV0ucHRzID4gbWF4X3RzOyBpLS0pCisgICAgICAgICAgICBpZiAoc3RyZWFtX2luZGV4ID09IC0xIHx8IHEtPnN1YnNbaV0uc3RyZWFtX2luZGV4ID09IHN0cmVhbV9pbmRleCkKKyAgICAgICAgICAgICAgICBpZHggPSBpOworCisgICAgICAgIHRzX3NlbGVjdGVkID0gcS0+c3Vic1tpZHhdLnB0czsKKyAgICAgICAgaWYgKHRzX3NlbGVjdGVkIDwgbWluX3RzIHx8IHRzX3NlbGVjdGVkID4gbWF4X3RzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRVJBTkdFKTsKKworICAgICAgICAvKiBsb29rIGJhY2sgaW4gdGhlIGxhdGVzdCBzdWJ0aXRsZXMgZm9yIG92ZXJsYXBwaW5nIHN1YnRpdGxlcyAqLworICAgICAgICBmb3IgKGkgPSBpZHggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgaW50NjRfdCBwdHMgPSBxLT5zdWJzW2ldLnB0czsKKyAgICAgICAgICAgIGlmIChxLT5zdWJzW2ldLmR1cmF0aW9uIDw9IDAgfHwKKyAgICAgICAgICAgICAgICAoc3RyZWFtX2luZGV4ICE9IC0xICYmIHEtPnN1YnNbaV0uc3RyZWFtX2luZGV4ICE9IHN0cmVhbV9pbmRleCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAocHRzID49IG1pbl90cyAmJiBwdHMgPiB0c19zZWxlY3RlZCAtIHEtPnN1YnNbaV0uZHVyYXRpb24pCisgICAgICAgICAgICAgICAgaWR4ID0gaTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHRoZSBxdWV1ZSBpcyB1c2VkIHRvIHN0b3JlIG11bHRpcGxlIHN1YnRpdGxlcyBzdHJlYW1zIChsaWtlIHdpdGgKKyAgICAgICAgICogVm9iU3ViKSBhbmQgdGhlIHN0cmVhbSBpbmRleCBpcyBub3Qgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorICAgICAgICAgKiB0byBmb2N1cyBvbiB0aGUgc21hbGxlc3QgZmlsZSBwb3NpdGlvbiBvZmZzZXQgZm9yIGEgc2FtZSB0aW1lc3RhbXA7CisgICAgICAgICAqIHF1ZXVlIGlzIG9yZGVyZWQgYnkgcHRzIGFuZCB0aGVuIGZpbGVwb3MsIHNvIHdlIGNhbiB0YWtlIHRoZSBmaXJzdAorICAgICAgICAgKiBlbnRyeSBmb3IgYSBnaXZlbiB0aW1lc3RhbXAuICovCisgICAgICAgIGlmIChzdHJlYW1faW5kZXggPT0gLTEpCisgICAgICAgICAgICB3aGlsZSAoaWR4ID4gMCAmJiBxLT5zdWJzW2lkeCAtIDFdLnB0cyA9PSBxLT5zdWJzW2lkeF0ucHRzKQorICAgICAgICAgICAgICAgIGlkeC0tOworCisgICAgICAgIHEtPmN1cnJlbnRfc3ViX2lkeCA9IGlkeDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfc3VidGl0bGVzX3F1ZXVlX2NsZWFuKEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSAqcSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBxLT5uYl9zdWJzOyBpKyspCisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZxLT5zdWJzW2ldKTsKKyAgICBhdl9mcmVlcCgmcS0+c3Vicyk7CisgICAgcS0+bmJfc3VicyA9IHEtPmFsbG9jYXRlZF9zaXplID0gcS0+Y3VycmVudF9zdWJfaWR4ID0gMDsKK30KKworaW50IGZmX3NtaWxfZXh0cmFjdF9uZXh0X3RleHRfY2h1bmsoRkZUZXh0UmVhZGVyICp0ciwgQVZCUHJpbnQgKmJ1ZiwgY2hhciAqYykKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgY2hhciBlbmRfY2hyOworCisgICAgaWYgKCEqYykgLy8gY2FjaGVkIGNoYXI/CisgICAgICAgICpjID0gZmZfdGV4dF9yOCh0cik7CisgICAgaWYgKCEqYykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlbmRfY2hyID0gKmMgPT0gJzwnID8gJz4nIDogJzwnOworICAgIGRvIHsKKyAgICAgICAgYXZfYnByaW50X2NoYXJzKGJ1ZiwgKmMsIDEpOworICAgICAgICAqYyA9IGZmX3RleHRfcjgodHIpOworICAgICAgICBpKys7CisgICAgfSB3aGlsZSAoKmMgIT0gZW5kX2NociAmJiAqYyk7CisgICAgaWYgKGVuZF9jaHIgPT0gJz4nKSB7CisgICAgICAgIGF2X2JwcmludF9jaGFycyhidWYsICc+JywgMSk7CisgICAgICAgICpjID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKK2NvbnN0IGNoYXIgKmZmX3NtaWxfZ2V0X2F0dHJfcHRyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmF0dHIpCit7CisgICAgaW50IGluX3F1b3RlcyA9IDA7CisgICAgY29uc3QgaW50IGxlbiA9IHN0cmxlbihhdHRyKTsKKworICAgIHdoaWxlICgqcykgeworICAgICAgICB3aGlsZSAoKnMpIHsKKyAgICAgICAgICAgIGlmICghaW5fcXVvdGVzICYmIGF2X2lzc3BhY2UoKnMpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaW5fcXVvdGVzIF49ICpzID09ICciJzsgLy8gWFhYOiBzdXBwb3J0IGVzY2FwaW5nPworICAgICAgICAgICAgcysrOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChhdl9pc3NwYWNlKCpzKSkKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgaWYgKCFhdl9zdHJuY2FzZWNtcChzLCBhdHRyLCBsZW4pICYmIHNbbGVuXSA9PSAnPScpCisgICAgICAgICAgICByZXR1cm4gcyArIGxlbiArIDEgKyAoc1tsZW4gKyAxXSA9PSAnIicpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfZW9sKGNoYXIgYykKK3sKKyAgICByZXR1cm4gYyA9PSAnXHInIHx8IGMgPT0gJ1xuJzsKK30KKwordm9pZCBmZl9zdWJ0aXRsZXNfcmVhZF90ZXh0X2NodW5rKEZGVGV4dFJlYWRlciAqdHIsIEFWQlByaW50ICpidWYpCit7CisgICAgY2hhciBlb2xfYnVmWzVdLCBsYXN0X3dhc19jciA9IDA7CisgICAgaW50IG4gPSAwLCBpID0gMCwgbmJfZW9sID0gMDsKKworICAgIGF2X2JwcmludF9jbGVhcihidWYpOworCisgICAgZm9yICg7OykgeworICAgICAgICBjaGFyIGMgPSBmZl90ZXh0X3I4KHRyKTsKKworICAgICAgICBpZiAoIWMpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBpZ25vcmUgYWxsIGluaXRpYWwgbGluZSBicmVha3MgKi8KKyAgICAgICAgaWYgKG4gPT0gMCAmJiBpc19lb2woYykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBsaW5lIGJyZWFrIGJ1ZmZlcmluZzogd2UgZG9uJ3Qgd2FudCB0byBhZGQgdGhlIHRyYWlsaW5nIFxyXG4gKi8KKyAgICAgICAgaWYgKGlzX2VvbChjKSkgeworICAgICAgICAgICAgbmJfZW9sICs9IGMgPT0gJ1xuJyB8fCBsYXN0X3dhc19jcjsKKyAgICAgICAgICAgIGlmIChuYl9lb2wgPT0gMikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVvbF9idWZbaSsrXSA9IGM7CisgICAgICAgICAgICBpZiAoaSA9PSBzaXplb2YoZW9sX2J1ZikgLSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbGFzdF93YXNfY3IgPSBjID09ICdccic7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG9ubHkgb25lIGxpbmUgYnJlYWsgZm9sbG93ZWQgYnkgZGF0YTogd2UgZmx1c2ggdGhlIGxpbmUgYnJlYWtzCisgICAgICAgICAqIGJ1ZmZlciAqLworICAgICAgICBpZiAoaSkgeworICAgICAgICAgICAgZW9sX2J1ZltpXSA9IDA7CisgICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIiVzIiwgZW9sX2J1Zik7CisgICAgICAgICAgICBpID0gbmJfZW9sID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2JwcmludF9jaGFycyhidWYsIGMsIDEpOworICAgICAgICBuKys7CisgICAgfQorfQorCit2b2lkIGZmX3N1YnRpdGxlc19yZWFkX2NodW5rKEFWSU9Db250ZXh0ICpwYiwgQVZCUHJpbnQgKmJ1ZikKK3sKKyAgICBGRlRleHRSZWFkZXIgdHI7CisgICAgdHIuYnVmX3BvcyA9IHRyLmJ1Zl9sZW4gPSAwOworICAgIHRyLnR5cGUgPSAwOworICAgIHRyLnBiID0gcGI7CisgICAgZmZfc3VidGl0bGVzX3JlYWRfdGV4dF9jaHVuaygmdHIsIGJ1Zik7Cit9CisKK3B0cmRpZmZfdCBmZl9zdWJ0aXRsZXNfcmVhZF9saW5lKEZGVGV4dFJlYWRlciAqdHIsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisgICAgc2l6ZV90IGN1ciA9IDA7CisgICAgaWYgKCFzaXplKQorICAgICAgICByZXR1cm4gMDsKKyAgICB3aGlsZSAoY3VyICsgMSA8IHNpemUpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gZmZfdGV4dF9yOCh0cik7CisgICAgICAgIGlmICghYykKKyAgICAgICAgICAgIHJldHVybiBmZl90ZXh0X2VvZih0cikgPyBjdXIgOiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBidWZbY3VyKytdID0gYzsKKyAgICAgICAgYnVmW2N1cl0gPSAnXDAnOworICAgIH0KKyAgICBpZiAoZmZfdGV4dF9wZWVrX3I4KHRyKSA9PSAnXHInKQorICAgICAgICBmZl90ZXh0X3I4KHRyKTsKKyAgICBpZiAoZmZfdGV4dF9wZWVrX3I4KHRyKSA9PSAnXG4nKQorICAgICAgICBmZl90ZXh0X3I4KHRyKTsKKyAgICByZXR1cm4gY3VyOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3N1YnRpdGxlcy5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3N1YnRpdGxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNzE5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3VidGl0bGVzLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQ2zDqW1lbnQgQsWTc2NoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfU1VCVElUTEVTX0gKKyNkZWZpbmUgQVZGT1JNQVRfU1VCVElUTEVTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorCitlbnVtIHN1Yl9zb3J0IHsKKyAgICBTVUJfU09SVF9UU19QT1MgPSAwLCAgICAvLy88IHNvcnQgYnkgdGltZXN0YW1wcywgdGhlbiBwb3NpdGlvbgorICAgIFNVQl9TT1JUX1BPU19UUywgICAgICAgIC8vLzwgc29ydCBieSBwb3NpdGlvbiwgdGhlbiB0aW1lc3RhbXBzCit9OworCitlbnVtIGZmX3V0Zl90eXBlIHsKKyAgICBGRl9VVEZfOCwgICAgICAgLy8gb3Igb3RoZXIgOCBiaXQgZW5jb2RpbmdzCisgICAgRkZfVVRGMTZMRSwKKyAgICBGRl9VVEYxNkJFLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0eXBlOworICAgIEFWSU9Db250ZXh0ICpwYjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKyAgICBpbnQgYnVmX3BvcywgYnVmX2xlbjsKKyAgICBBVklPQ29udGV4dCBidWZfcGI7Cit9IEZGVGV4dFJlYWRlcjsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBGRlRleHRSZWFkZXIgZnJvbSB0aGUgZ2l2ZW4gQVZJT0NvbnRleHQuIFRoaXMgZnVuY3Rpb24gd2lsbAorICogcmVhZCBzb21lIGJ5dGVzIGZyb20gcGIsIGFuZCB0ZXN0IGZvciBVVEYtOCBvciBVVEYtMTYgQk9Ncy4gRnVydGhlciBhY2Nlc3NlcworICogdG8gRkZUZXh0UmVhZGVyIHdpbGwgcmVhZCBtb3JlIGRhdGEgZnJvbSBwYi4KKyAqIElmIHMgaXMgbm90IE5VTEwsIHRoZSB1c2VyIHdpbGwgYmUgd2FybmVkIGlmIGEgVVRGLTE2IGNvbnZlcnNpb24gdGFrZXMgcGxhY2UuCisgKgorICogVGhlIHB1cnBvc2Ugb2YgRkZUZXh0UmVhZGVyIGlzIHRvIHRyYW5zcGFyZW50bHkgY29udmVydCByZWFkIGRhdGEgdG8gVVRGLTgKKyAqIGlmIHRoZSBzdHJlYW0gaGFkIGEgVVRGLTE2IEJPTS4KKyAqCisgKiBAcGFyYW0gcyBQb2ludGVyIHRvIHByb3ZpZGUgYXZfbG9nIGNvbnRleHQKKyAqIEBwYXJhbSByIG9iamVjdCB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkCisgKiBAcGFyYW0gcGIgc3RyZWFtIHRvIHJlYWQgZnJvbSAocmVmZXJlbmNlZCBhcyBsb25nIGFzIEZGVGV4dFJlYWRlciBpcyBpbiB1c2UpCisgKi8KK3ZvaWQgZmZfdGV4dF9pbml0X2F2aW8odm9pZCAqcywgRkZUZXh0UmVhZGVyICpyLCBBVklPQ29udGV4dCAqcGIpOworCisvKioKKyAqIFNpbWlsYXIgdG8gZmZfdGV4dF9pbml0X2F2aW8oKSwgYnV0IHNldHMgaXQgdXAgdG8gcmVhZCBmcm9tIGEgYm91bmRlZCBidWZmZXIuCisgKgorICogQHBhcmFtIHIgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQKKyAqIEBwYXJhbSBidWYgYnVmZmVyIHRvIHJlYWQgZnJvbSAocmVmZXJlbmNlZCBhcyBsb25nIGFzIEZGVGV4dFJlYWRlciBpcyBpbiB1c2UpCisgKiBAcGFyYW0gc2l6ZSBzaXplIG9mIGJ1ZgorICovCit2b2lkIGZmX3RleHRfaW5pdF9idWYoRkZUZXh0UmVhZGVyICpyLCB2b2lkICpidWYsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGJ5dGUgcG9zaXRpb24gb2YgdGhlIG5leHQgYnl0ZSByZXR1cm5lZCBieSBmZl90ZXh0X3I4KCkuIEZvcgorICogVVRGLTE2IHNvdXJjZSBzdHJlYW1zLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiwgYnV0IGl0IHdpbGwKKyAqIGJlIGluY29ycmVjdCBpZiBhIGNvZGVwb2ludCB3YXMgb25seSBwYXJ0aWFsbHkgcmVhZCB3aXRoIGZmX3RleHRfcjgoKS4KKyAqLworaW50NjRfdCBmZl90ZXh0X3BvcyhGRlRleHRSZWFkZXIgKnIpOworCisvKioKKyAqIFJldHVybiB0aGUgbmV4dCBieXRlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyAwIC0gMjU1LiBSZXR1cm5zIDAgb24gRU9GLgorICogSWYgdGhlIHNvdXJjZSBzdHJlYW0gaXMgVVRGLTE2LCB0aGlzIHJlYWRzIGZyb20gdGhlIHN0cmVhbSBjb252ZXJ0ZWQgdG8KKyAqIFVURi04LiBPbiBpbnZhbGlkIFVURi0xNiwgMCBpcyByZXR1cm5lZC4KKyAqLworaW50IGZmX3RleHRfcjgoRkZUZXh0UmVhZGVyICpyKTsKKworLyoqCisgKiBSZXR1cm4gbm9uLXplcm8gaWYgRU9GIHdhcyByZWFjaGVkLgorICovCitpbnQgZmZfdGV4dF9lb2YoRkZUZXh0UmVhZGVyICpyKTsKKworLyoqCisgKiBMaWtlIGZmX3RleHRfcjgoKSwgYnV0IGRvbid0IHJlbW92ZSB0aGUgYnl0ZSBmcm9tIHRoZSBidWZmZXIuCisgKi8KK2ludCBmZl90ZXh0X3BlZWtfcjgoRkZUZXh0UmVhZGVyICpyKTsKKworLyoqCisgKiBSZWFkIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgKGluIFVURi04KS4gT24gZXJyb3Igb3IgRU9GLCBcMCBieXRlcyBhcmUKKyAqIHdyaXR0ZW4uCisgKi8KK3ZvaWQgZmZfdGV4dF9yZWFkKEZGVGV4dFJlYWRlciAqciwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVlBhY2tldCAqc3ViczsgICAgICAgICAvLy88IGFycmF5IG9mIHN1YnRpdGxlcyBwYWNrZXRzCisgICAgaW50IG5iX3N1YnM7ICAgICAgICAgICAgLy8vPCBudW1iZXIgb2Ygc3VidGl0bGVzIHBhY2tldHMKKyAgICBpbnQgYWxsb2NhdGVkX3NpemU7ICAgICAvLy88IGFsbG9jYXRlZCBzaXplIGZvciBzdWJzCisgICAgaW50IGN1cnJlbnRfc3ViX2lkeDsgICAgLy8vPCBjdXJyZW50IHBvc2l0aW9uIGZvciB0aGUgcmVhZCBwYWNrZXQgY2FsbGJhY2sKKyAgICBlbnVtIHN1Yl9zb3J0IHNvcnQ7ICAgICAvLy88IHNvcnQgbWV0aG9kIHRvIHVzZSB3aGVuIGZpbmFsaXppbmcgc3VidGl0bGVzCit9IEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZTsKKworLyoqCisgKiBJbnNlcnQgYSBuZXcgc3VidGl0bGUgZXZlbnQuCisgKgorICogQHBhcmFtIGV2ZW50IHRoZSBzdWJ0aXRsZSBsaW5lLCBtYXkgbm90IGJlIHplcm8gdGVybWluYXRlZAorICogQHBhcmFtIGxlbiAgIHRoZSBsZW5ndGggb2YgdGhlIGV2ZW50IChpbiBzdHJsZW4oKSBzZW5zZSwgc28gd2l0aG91dCAnXDAnKQorICogQHBhcmFtIG1lcmdlIHNldCB0byAxIGlmIHRoZSBjdXJyZW50IGV2ZW50IHNob3VsZCBiZSBjb25jYXRlbmF0ZWQgd2l0aCB0aGUKKyAqICAgICAgICAgICAgICBwcmV2aW91cyBvbmUgaW5zdGVhZCBvZiBhZGRpbmcgYSBuZXcgZW50cnksIDAgb3RoZXJ3aXNlCisgKi8KK0FWUGFja2V0ICpmZl9zdWJ0aXRsZXNfcXVldWVfaW5zZXJ0KEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSAqcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmV2ZW50LCBpbnQgbGVuLCBpbnQgbWVyZ2UpOworCisvKioKKyAqIFNldCBtaXNzaW5nIGR1cmF0aW9ucyBhbmQgc29ydCBzdWJ0aXRsZXMgYnkgUFRTLCBhbmQgdGhlbiBieXRlIHBvc2l0aW9uLgorICovCit2b2lkIGZmX3N1YnRpdGxlc19xdWV1ZV9maW5hbGl6ZShGRkRlbXV4U3VidGl0bGVzUXVldWUgKnEpOworCisvKioKKyAqIEdlbmVyaWMgcmVhZF9wYWNrZXQoKSBjYWxsYmFjayBmb3Igc3VidGl0bGVzIGRlbXV4ZXJzIHVzaW5nIHRoaXMgcXVldWUKKyAqIHN5c3RlbS4KKyAqLworaW50IGZmX3N1YnRpdGxlc19xdWV1ZV9yZWFkX3BhY2tldChGRkRlbXV4U3VidGl0bGVzUXVldWUgKnEsIEFWUGFja2V0ICpwa3QpOworCisvKioKKyAqIFVwZGF0ZSBjdXJyZW50X3N1Yl9pZHggdG8gZW11bGF0ZSBhIHNlZWsuIEV4Y2VwdCB0aGUgZmlyc3QgcGFyYW1ldGVyLCBpdAorICogbWF0Y2hlcyBBVklucHV0Rm9ybWF0LT5yZWFkX3NlZWsyIHByb3RvdHlwZXMuCisgKi8KK2ludCBmZl9zdWJ0aXRsZXNfcXVldWVfc2VlayhGRkRlbXV4U3VidGl0bGVzUXVldWUgKnEsIEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncyk7CisKKy8qKgorICogUmVtb3ZlIGFuZCBkZXN0cm95IGFsbCB0aGUgc3VidGl0bGVzIHBhY2tldHMuCisgKi8KK3ZvaWQgZmZfc3VidGl0bGVzX3F1ZXVlX2NsZWFuKEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSAqcSk7CisKKy8qKgorICogU01JTCBoZWxwZXIgdG8gbG9hZCBuZXh0IGNodW5rICgiPC4uLj4iIG9yIHVudGFnZ2VkIGNvbnRlbnQpIGluIGJ1Zi4KKyAqCisgKiBAcGFyYW0gYyBjYWNoZWQgY2hhcmFjdGVyLCB0byBhdm9pZCBhIGJhY2t3YXJkIHNlZWsKKyAqLworaW50IGZmX3NtaWxfZXh0cmFjdF9uZXh0X3RleHRfY2h1bmsoRkZUZXh0UmVhZGVyICp0ciwgQVZCUHJpbnQgKmJ1ZiwgY2hhciAqYyk7CisKKy8qKgorICogU01JTCBoZWxwZXIgdG8gcG9pbnQgb24gdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBpbiB0aGUgZ2l2ZW4gdGFnLgorICoKKyAqIEBwYXJhbSBzICAgIFNNSUwgdGFnICgiPC4uLj4iKQorICogQHBhcmFtIGF0dHIgdGhlIGF0dHJpYnV0ZSB0byBsb29rIGZvcgorICovCitjb25zdCBjaGFyICpmZl9zbWlsX2dldF9hdHRyX3B0cihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICphdHRyKTsKKworLyoqCisgKiBAYnJpZWYgU2FtZSBhcyBmZl9zdWJ0aXRsZXNfcmVhZF90ZXh0X2NodW5rKCksIGJ1dCByZWFkIGZyb20gYW4gQVZJT0NvbnRleHQuCisgKi8KK3ZvaWQgZmZfc3VidGl0bGVzX3JlYWRfY2h1bmsoQVZJT0NvbnRleHQgKnBiLCBBVkJQcmludCAqYnVmKTsKKworLyoqCisgKiBAYnJpZWYgUmVhZCBhIHN1YnRpdGxlcyBjaHVuayBmcm9tIEZGVGV4dFJlYWRlci4KKyAqCisgKiBBIGNodW5rIGlzIGRlZmluZWQgYnkgYSBtdWx0aWxpbmUgImV2ZW50IiwgZW5kaW5nIHdpdGggYSBzZWNvbmQgbGluZSBicmVhay4KKyAqIFRoZSB0cmFpbGluZyBsaW5lIGJyZWFrcyBhcmUgdHJpbW1lZC4gQ1JMRiBhcmUgc3VwcG9ydGVkLgorICogRXhhbXBsZTogImZvb1xyXG5iYXJcclxuXHJcbm5leHQiIHdpbGwgcHJpbnQgImZvb1xyXG5iYXIiIGludG8gYnVmLCBhbmQgcGIKKyAqIHdpbGwgZm9jdXMgb24gdGhlICduJyBvZiB0aGUgIm5leHQiIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gdHIgIEkvTyBjb250ZXh0CisgKiBAcGFyYW0gYnVmIGFuIGluaXRpYWxpemVkIGJ1ZiB3aGVyZSB0aGUgY2h1bmsgaXMgd3JpdHRlbgorICoKKyAqIEBub3RlIGJ1ZiBpcyBjbGVhcmVkIGJlZm9yZSB3cml0aW5nIGludG8gaXQuCisgKi8KK3ZvaWQgZmZfc3VidGl0bGVzX3JlYWRfdGV4dF9jaHVuayhGRlRleHRSZWFkZXIgKnRyLCBBVkJQcmludCAqYnVmKTsKKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluY3JlbWVudCB0byBqdW1wIHRvIHRoZSBuZXh0IGxpbmUsIG9yIHRvCisgKiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgKiBUaGUgZnVuY3Rpb24gaGFuZGxlcyB0aGUgZm9sbG93aW5nIGxpbmUgYnJlYWtzIHNjaGVtZXM6CisgKiBMRiwgQ1JMRiAoTVMpLCBvciBzdGFuZGFsb25lIENSIChvbGQgTWFjT1MpLgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZmZfc3VidGl0bGVzX25leHRfbGluZShjb25zdCBjaGFyICpwdHIpCit7CisgICAgaW50IG4gPSBzdHJjc3BuKHB0ciwgIlxyXG4iKTsKKyAgICBwdHIgKz0gbjsKKyAgICBpZiAoKnB0ciA9PSAnXHInKSB7CisgICAgICAgIHB0cisrOworICAgICAgICBuKys7CisgICAgfQorICAgIGlmICgqcHRyID09ICdcbicpCisgICAgICAgIG4rKzsKKyAgICByZXR1cm4gbjsKK30KKworLyoqCisgKiBSZWFkIGEgbGluZSBvZiB0ZXh0LiBEaXNjYXJkcyBsaW5lIGVuZGluZyBjaGFyYWN0ZXJzLgorICogVGhlIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGZvbGxvd2luZyBsaW5lIGJyZWFrcyBzY2hlbWVzOgorICogTEYsIENSTEYgKE1TKSwgb3Igc3RhbmRhbG9uZSBDUiAob2xkIE1hY09TKS4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBidWYuIEFsd2F5cyB3cml0ZXMgYSB0ZXJtaW5hdGluZyAwLAorICogc2ltaWxhciBhcyB3aXRoIHNucHJpbnRmLgorICoKKyAqIEBub3RlIHJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIGEgXDAgYnl0ZSBpcyBmb3VuZAorICovCitwdHJkaWZmX3QgZmZfc3VidGl0bGVzX3JlYWRfbGluZShGRlRleHRSZWFkZXIgKnRyLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKKworI2VuZGlmIC8qIEFWRk9STUFUX1NVQlRJVExFU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc3Vidmlld2VyMWRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3N1YnZpZXdlcjFkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjM4NTMzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3N1YnZpZXdlcjFkZWMuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU3ViVmlld2VyIHYxIHN1YnRpdGxlIGRlbXV4ZXIKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInN1YnRpdGxlcy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRkZEZW11eFN1YnRpdGxlc1F1ZXVlIHE7Cit9IFN1YlZpZXdlcjFDb250ZXh0OworCitzdGF0aWMgaW50IHN1YnZpZXdlcjFfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyID0gcC0+YnVmOworCisgICAgaWYgKHN0cnN0cihwdHIsICIqKioqKioqKiBTVEFSVCBTQ1JJUFQgKioqKioqKioiKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1YnZpZXdlcjFfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBkZWxheSA9IDA7CisgICAgQVZQYWNrZXQgKnN1YiA9IE5VTEw7CisgICAgU3ViVmlld2VyMUNvbnRleHQgKnN1YnZpZXdlcjEgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEpOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9TVUJWSUVXRVIxOworCisgICAgd2hpbGUgKCFhdmlvX2Zlb2Yocy0+cGIpKSB7CisgICAgICAgIGNoYXIgbGluZVs0MDk2XTsKKyAgICAgICAgaW50IGxlbiA9IGZmX2dldF9saW5lKHMtPnBiLCBsaW5lLCBzaXplb2YobGluZSkpOworICAgICAgICBpbnQgaGgsIG1tLCBzczsKKworICAgICAgICBpZiAoIWxlbikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICghc3RybmNtcChsaW5lLCAiW0RFTEFZXSIsIDcpKSB7CisgICAgICAgICAgICBmZl9nZXRfbGluZShzLT5wYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKyAgICAgICAgICAgIHNzY2FuZihsaW5lLCAiJWQiLCAmZGVsYXkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiWyVkOiVkOiVkXSIsICZoaCwgJm1tLCAmc3MpID09IDMpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICAgICAgICAgIGludDY0X3QgcHRzX3N0YXJ0ID0gaGgqMzYwMExMICsgbW0qNjBMTCArIHNzICsgZGVsYXk7CisKKyAgICAgICAgICAgIGxlbiA9IGZmX2dldF9saW5lKHMtPnBiLCBsaW5lLCBzaXplb2YobGluZSkpOworICAgICAgICAgICAgbGluZVtzdHJjc3BuKGxpbmUsICJcclxuIildID0gMDsKKyAgICAgICAgICAgIGlmICghKmxpbmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3ViKQorICAgICAgICAgICAgICAgICAgICBzdWItPmR1cmF0aW9uID0gcHRzX3N0YXJ0IC0gc3ViLT5wdHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1YiA9IGZmX3N1YnRpdGxlc19xdWV1ZV9pbnNlcnQoJnN1YnZpZXdlcjEtPnEsIGxpbmUsIGxlbiwgMCk7CisgICAgICAgICAgICAgICAgaWYgKCFzdWIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgc3ViLT5wb3MgPSBwb3M7CisgICAgICAgICAgICAgICAgc3ViLT5wdHMgPSBwdHNfc3RhcnQ7CisgICAgICAgICAgICAgICAgc3ViLT5kdXJhdGlvbiA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2ZpbmFsaXplKCZzdWJ2aWV3ZXIxLT5xKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJ2aWV3ZXIxX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBTdWJWaWV3ZXIxQ29udGV4dCAqc3Vidmlld2VyMSA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3JlYWRfcGFja2V0KCZzdWJ2aWV3ZXIxLT5xLCBwa3QpOworfQorCitzdGF0aWMgaW50IHN1YnZpZXdlcjFfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncykKK3sKKyAgICBTdWJWaWV3ZXIxQ29udGV4dCAqc3Vidmlld2VyMSA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJnN1YnZpZXdlcjEtPnEsIHMsIHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc3Vidmlld2VyMV9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBTdWJWaWV3ZXIxQ29udGV4dCAqc3Vidmlld2VyMSA9IHMtPnByaXZfZGF0YTsKKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfY2xlYW4oJnN1YnZpZXdlcjEtPnEpOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3N1YnZpZXdlcjFfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic3Vidmlld2VyMSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlN1YlZpZXdlciB2MSBzdWJ0aXRsZSBmb3JtYXQiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU3ViVmlld2VyMUNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHN1YnZpZXdlcjFfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gc3Vidmlld2VyMV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBzdWJ2aWV3ZXIxX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsyICAgICA9IHN1YnZpZXdlcjFfcmVhZF9zZWVrLAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHN1YnZpZXdlcjFfcmVhZF9jbG9zZSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAic3ViIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc3Vidmlld2VyZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3Vidmlld2VyZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiMGZkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zdWJ2aWV3ZXJkZWMuYwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU3ViVmlld2VyIHN1YnRpdGxlIGRlbXV4ZXIKKyAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ViVmlld2VyCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdWJ0aXRsZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSBxOworfSBTdWJWaWV3ZXJDb250ZXh0OworCitzdGF0aWMgaW50IHN1YnZpZXdlcl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBjaGFyIGM7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyID0gcC0+YnVmOworCisgICAgaWYgKEFWX1JCMjQocHRyKSA9PSAweEVGQkJCRikKKyAgICAgICAgcHRyICs9IDM7ICAvKiBza2lwIFVURi04IEJPTSAqLworICAgIGlmIChzc2NhbmYocHRyLCAiJSp1OiUqdTolKnUuJSp1LCUqdTolKnU6JSp1LiUqdSVjIiwgJmMpID09IDEpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKKyAgICBpZiAoIXN0cm5jbXAocHRyLCAiW0lORk9STUFUSU9OXSIsIDEzKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYLzM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90cyhjb25zdCBjaGFyICpzLCBpbnQ2NF90ICpzdGFydCwgaW50ICpkdXJhdGlvbikKK3sKKyAgICBpbnQ2NF90IGVuZDsKKyAgICBpbnQgaGgxLCBtbTEsIHNzMSwgbXMxOworICAgIGludCBoaDIsIG1tMiwgc3MyLCBtczI7CisKKyAgICBpZiAoc3NjYW5mKHMsICIldToldToldS4ldSwldToldToldS4ldSIsCisgICAgICAgICAgICAgICAmaGgxLCAmbW0xLCAmc3MxLCAmbXMxLCAmaGgyLCAmbW0yLCAmc3MyLCAmbXMyKSA9PSA4KSB7CisgICAgICAgIGVuZCAgICA9IChoaDIqMzYwMExMICsgbW0yKjYwTEwgKyBzczIpICogMTAwTEwgKyBtczI7CisgICAgICAgICpzdGFydCA9IChoaDEqMzYwMExMICsgbW0xKjYwTEwgKyBzczEpICogMTAwTEwgKyBtczE7CisgICAgICAgICpkdXJhdGlvbiA9IGVuZCAtICpzdGFydDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzdWJ2aWV3ZXJfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFN1YlZpZXdlckNvbnRleHQgKnN1YnZpZXdlciA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIEFWQlByaW50IGhlYWRlcjsKKyAgICBpbnQgcmVzID0gMCwgbmV3X2V2ZW50ID0gMTsKKyAgICBpbnQ2NF90IHB0c19zdGFydCA9IEFWX05PUFRTX1ZBTFVFOworICAgIGludCBkdXJhdGlvbiA9IC0xOworICAgIEFWUGFja2V0ICpzdWIgPSBOVUxMOworCisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfU1VCVklFV0VSOworCisgICAgYXZfYnByaW50X2luaXQoJmhlYWRlciwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIHdoaWxlICghYXZpb19mZW9mKHMtPnBiKSkgeworICAgICAgICBjaGFyIGxpbmVbMjA0OF07CisgICAgICAgIGludDY0X3QgcG9zID0gMDsKKyAgICAgICAgaW50IGxlbiA9IGZmX2dldF9saW5lKHMtPnBiLCBsaW5lLCBzaXplb2YobGluZSkpOworCisgICAgICAgIGlmICghbGVuKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbGluZVtzdHJjc3BuKGxpbmUsICJcclxuIildID0gMDsKKworICAgICAgICBpZiAobGluZVswXSA9PSAnWycgJiYgc3RybmNtcChsaW5lLCAiW2JyXSIsIDQpKSB7CisKKyAgICAgICAgICAgIC8qIGlnbm9yZSBldmVudCBzdHlsZSwgWFhYOiBhZGQgdG8gc2lkZV9kYXRhPyAqLworICAgICAgICAgICAgaWYgKHN0cnN0cihsaW5lLCAiW0NPTEZdIikgfHwgc3Ryc3RyKGxpbmUsICJbU0laRV0iKSB8fAorICAgICAgICAgICAgICAgIHN0cnN0cihsaW5lLCAiW0ZPTlRdIikgfHwgc3Ryc3RyKGxpbmUsICJbU1RZTEVdIikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpIHsgLy8gaGVhZGVyIG5vdCBmaW5hbGl6ZWQgeWV0CisgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmaGVhZGVyLCAiJXNcbiIsIGxpbmUpOworICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChsaW5lLCAiW0VORCBJTkZPUk1BVElPTl0iLCAxNykgfHwgIXN0cm5jbXAobGluZSwgIltTVUJUSVRMRV0iLCAxMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGhlYWRlciAqLworICAgICAgICAgICAgICAgICAgICByZXMgPSBhdnByaXZfYnByaW50X3RvX2V4dHJhZGF0YShzdC0+Y29kZWMsICZoZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChsaW5lLCAiW0lORk9STUFUSU9OXSIsIDEzKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bWUgZmlsZSBtZXRhZGF0YSBhdCB0aGlzIHBvaW50ICovCisgICAgICAgICAgICAgICAgICAgIGludCBpLCBqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBrZXlbMzJdLCB2YWx1ZVsxMjhdOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzaXplb2Yoa2V5KSAtIDEgJiYgbGluZVtpXSAmJiBsaW5lW2ldICE9ICddJzsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAga2V5W2kgLSAxXSA9IGF2X3RvbG93ZXIobGluZVtpXSk7CisgICAgICAgICAgICAgICAgICAgIGtleVtpIC0gMV0gPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lW2ldID09ICddJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxpbmVbaV0gPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IHNpemVvZih2YWx1ZSkgLSAxICYmIGxpbmVbaV0gJiYgbGluZVtpXSAhPSAnXScpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtqKytdID0gbGluZVtpKytdOworICAgICAgICAgICAgICAgICAgICB2YWx1ZVtqXSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBrZXksIHZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmVhZF90cyhsaW5lLCAmcHRzX3N0YXJ0LCAmZHVyYXRpb24pID49IDApIHsKKyAgICAgICAgICAgIG5ld19ldmVudCA9IDE7CisgICAgICAgICAgICBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICB9IGVsc2UgaWYgKCpsaW5lKSB7CisgICAgICAgICAgICBpZiAoIW5ld19ldmVudCkgeworICAgICAgICAgICAgICAgIHN1YiA9IGZmX3N1YnRpdGxlc19xdWV1ZV9pbnNlcnQoJnN1YnZpZXdlci0+cSwgIlxuIiwgMSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKCFzdWIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdWIgPSBmZl9zdWJ0aXRsZXNfcXVldWVfaW5zZXJ0KCZzdWJ2aWV3ZXItPnEsIGxpbmUsIHN0cmxlbihsaW5lKSwgIW5ld19ldmVudCk7CisgICAgICAgICAgICBpZiAoIXN1YikgeworICAgICAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdfZXZlbnQpIHsKKyAgICAgICAgICAgICAgICBzdWItPnBvcyA9IHBvczsKKyAgICAgICAgICAgICAgICBzdWItPnB0cyA9IHB0c19zdGFydDsKKyAgICAgICAgICAgICAgICBzdWItPmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdfZXZlbnQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2ZpbmFsaXplKCZzdWJ2aWV3ZXItPnEpOworCitlbmQ6CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZoZWFkZXIsIE5VTEwpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgc3Vidmlld2VyX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBTdWJWaWV3ZXJDb250ZXh0ICpzdWJ2aWV3ZXIgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3N1YnRpdGxlc19xdWV1ZV9yZWFkX3BhY2tldCgmc3Vidmlld2VyLT5xLCBwa3QpOworfQorCitzdGF0aWMgaW50IHN1YnZpZXdlcl9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3RzLCBpbnQ2NF90IHRzLCBpbnQ2NF90IG1heF90cywgaW50IGZsYWdzKQoreworICAgIFN1YlZpZXdlckNvbnRleHQgKnN1YnZpZXdlciA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJnN1YnZpZXdlci0+cSwgcywgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdHMsIHRzLCBtYXhfdHMsIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzdWJ2aWV3ZXJfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgU3ViVmlld2VyQ29udGV4dCAqc3Vidmlld2VyID0gcy0+cHJpdl9kYXRhOworICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9jbGVhbigmc3Vidmlld2VyLT5xKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zdWJ2aWV3ZXJfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic3Vidmlld2VyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3ViVmlld2VyIHN1YnRpdGxlIGZvcm1hdCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTdWJWaWV3ZXJDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBzdWJ2aWV3ZXJfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gc3Vidmlld2VyX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHN1YnZpZXdlcl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrMiAgICAgPSBzdWJ2aWV3ZXJfcmVhZF9zZWVrLAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHN1YnZpZXdlcl9yZWFkX2Nsb3NlLAorICAgIC5leHRlbnNpb25zICAgICA9ICJzdWIiLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9zdXBkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zdXBkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODA4M2IyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3N1cGRlYy5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjZGVmaW5lIFNVUF9QR1NfTUFHSUMgMHg1MDQ3IC8qICJQRyIsIGJpZyBlbmRpYW4gKi8KKworc3RhdGljIGludCBzdXBfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0hETVZfUEdTX1NVQlRJVExFOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCA5MDAwMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdXBfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGludDY0X3QgcHRzLCBkdHMsIHBvczsKKyAgICBpbnQgcmV0OworCisgICAgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKworICAgIGlmIChhdmlvX3JiMTYocy0+cGIpICE9IFNVUF9QR1NfTUFHSUMpCisgICAgICAgIHJldHVybiBhdmlvX2Zlb2Yocy0+cGIpID8gQVZFUlJPUl9FT0YgOiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcHRzID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBkdHMgPSBhdmlvX3JiMzIocy0+cGIpOworCisgICAgaWYgKChyZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIDMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgcGt0LT5wb3MgPSBwb3M7CisgICAgcGt0LT5wdHMgPSBwdHM7CisgICAgLy8gTWFueSBmaWxlcyBoYXZlIERUUyBzZXQgdG8gMCBmb3IgYWxsIHBhY2tldHMsIHNvIGFzc3VtZSAwIG1lYW5zIHVuc2V0LgorICAgIHBrdC0+ZHRzID0gZHRzID8gZHRzIDogQVZfTk9QVFNfVkFMVUU7CisKKyAgICBpZiAocGt0LT5zaXplID49IDMpIHsKKyAgICAgICAgLy8gVGhlIGZ1bGwgcGFja2V0IHNpemUgaXMgc3RvcmVkIGFzIHBhcnQgb2YgdGhlIHBhY2tldC4KKyAgICAgICAgc2l6ZV90IGxlbiA9IEFWX1JCMTYocGt0LT5kYXRhICsgMSk7CisKKyAgICAgICAgaWYgKChyZXQgPSBhdl9hcHBlbmRfcGFja2V0KHMtPnBiLCBwa3QsIGxlbikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VwX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHAtPmJ1ZjsKKyAgICBzaXplX3QgYnVmX3NpemUgPSBwLT5idWZfc2l6ZTsKKyAgICBpbnQgbmJfcGFja2V0czsKKworICAgIGZvciAobmJfcGFja2V0cyA9IDA7IG5iX3BhY2tldHMgPCAxMDsgbmJfcGFja2V0cysrKSB7CisgICAgICAgIHNpemVfdCBmdWxsX3BhY2tldF9zaXplOworICAgICAgICBpZiAoYnVmX3NpemUgPCAxMCArIDMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKEFWX1JCMTYoYnVmKSAhPSBTVVBfUEdTX01BR0lDKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZ1bGxfcGFja2V0X3NpemUgPSBBVl9SQjE2KGJ1ZiArIDEwICsgMSkgKyAxMCArIDM7CisgICAgICAgIGlmIChidWZfc2l6ZSA8IGZ1bGxfcGFja2V0X3NpemUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYnVmICs9IGZ1bGxfcGFja2V0X3NpemU7CisgICAgICAgIGJ1Zl9zaXplIC09IGZ1bGxfcGFja2V0X3NpemU7CisgICAgfQorICAgIGlmICghbmJfcGFja2V0cykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKG5iX3BhY2tldHMgPCAyKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9SRVRSWSAvIDI7CisgICAgaWYgKG5iX3BhY2tldHMgPCA0KQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9SRVRSWTsKKyAgICBpZiAobmJfcGFja2V0cyA8IDEwKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047CisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCitBVklucHV0Rm9ybWF0IGZmX3N1cF9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzdXAiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgSERNViBQcmVzZW50YXRpb24gR3JhcGhpYyBTdHJlYW0gc3VidGl0bGVzIiksCisgICAgLmV4dGVuc2lvbnMgICAgID0gInN1cCIsCisgICAgLm1pbWVfdHlwZSAgICAgID0gImFwcGxpY2F0aW9uL3gtcGdzIiwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBzdXBfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gc3VwX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHN1cF9yZWFkX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC9zd2YuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zd2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWE0MzRhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3N3Zi5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBGbGFzaCBDb21wYXRpYmxlIFN0cmVhbWluZyBGb3JtYXQKKyAqIENvcHlyaWdodCAoYykgMjAwMCBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaW5pYyBVcm8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKK2NvbnN0IEFWQ29kZWNUYWcgZmZfc3dmX2NvZGVjX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX0ZMVjEsIDB4MDIgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQNkYsIDB4MDQgfSwKKyAgICB7IEFWX0NPREVDX0lEX05PTkUsICAgIDAgfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc3dmLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvc3dmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhMDk0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zd2YuaApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIEZsYXNoIENvbXBhdGlibGUgU3RyZWFtaW5nIEZvcm1hdCBjb21tb24gaGVhZGVyLgorICogQ29weXJpZ2h0IChjKSAyMDAwIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAzIFRpbmljIFVybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1NXRl9ICisjZGVmaW5lIEFWRk9STUFUX1NXRl9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIENPTkZJR19aTElCCisjaW5jbHVkZSA8emxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlmby5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpby5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qIHNob3VsZCBoYXZlIGEgZ2VuZXJpYyB3YXkgdG8gaW5kaWNhdGUgcHJvYmFibGUgc2l6ZSAqLworI2RlZmluZSBEVU1NWV9GSUxFX1NJWkUgICAoMTAwICogMTAyNCAqIDEwMjQpCisjZGVmaW5lIERVTU1ZX0RVUkFUSU9OICAgIDYwMCAvKiBpbiBzZWNvbmRzICovCisKK2VudW0geworICAgIFRBR19FTkQgICAgICAgICAgICAgICAgICAgICAgICAgID0gIDAsCisgICAgVEFHX1NIT1dGUkFNRSAgICAgICAgICAgICAgICAgICAgPSAgMSwKKyAgICBUQUdfREVGSU5FU0hBUEUgICAgICAgICAgICAgICAgICA9ICAyLAorICAgIFRBR19GUkVFQ0hBUkFDVEVSICAgICAgICAgICAgICAgID0gIDMsCisgICAgVEFHX1BMQUNFT0JKRUNUICAgICAgICAgICAgICAgICAgPSAgNCwKKyAgICBUQUdfUkVNT1ZFT0JKRUNUICAgICAgICAgICAgICAgICA9ICA1LAorICAgIFRBR19ERUZJTkVCSVRTICAgICAgICAgICAgICAgICAgID0gIDYsCisgICAgVEFHX0RFRklORUJVVFRPTiAgICAgICAgICAgICAgICAgPSAgNywKKyAgICBUQUdfSlBFR1RBQkxFUyAgICAgICAgICAgICAgICAgICA9ICA4LAorICAgIFRBR19TRVRCQUNLR1JPVU5EQ09MT1IgICAgICAgICAgID0gIDksCisgICAgVEFHX0RFRklORUZPTlQgICAgICAgICAgICAgICAgICAgPSAxMCwKKyAgICBUQUdfREVGSU5FVEVYVCAgICAgICAgICAgICAgICAgICA9IDExLAorICAgIFRBR19ET0FDVElPTiAgICAgICAgICAgICAgICAgICAgID0gMTIsCisgICAgVEFHX0RFRklORUZPTlRJTkZPICAgICAgICAgICAgICAgPSAxMywKKyAgICBUQUdfREVGSU5FU09VTkQgICAgICAgICAgICAgICAgICA9IDE0LAorICAgIFRBR19TVEFSVFNPVU5EICAgICAgICAgICAgICAgICAgID0gMTUsCisgICAgVEFHX0RFRklORUJVVFRPTlNPVU5EICAgICAgICAgICAgPSAxNywKKyAgICBUQUdfU1RSRUFNSEVBRCAgICAgICAgICAgICAgICAgICA9IDE4LAorICAgIFRBR19TVFJFQU1CTE9DSyAgICAgICAgICAgICAgICAgID0gMTksCisgICAgVEFHX0RFRklORUJJVFNMT1NTTEVTUyAgICAgICAgICAgPSAyMCwKKyAgICBUQUdfSlBFRzIgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLAorICAgIFRBR19ERUZJTkVTSEFQRTIgICAgICAgICAgICAgICAgID0gMjIsCisgICAgVEFHX0RFRklORUJVVFRPTkNYRk9STSAgICAgICAgICAgPSAyMywKKyAgICBUQUdfUFJPVEVDVCAgICAgICAgICAgICAgICAgICAgICA9IDI0LAorICAgIFRBR19QTEFDRU9CSkVDVDIgICAgICAgICAgICAgICAgID0gMjYsCisgICAgVEFHX1JFTU9WRU9CSkVDVDIgICAgICAgICAgICAgICAgPSAyOCwKKyAgICBUQUdfREVGSU5FU0hBUEUzICAgICAgICAgICAgICAgICA9IDMyLAorICAgIFRBR19ERUZJTkVURVhUMiAgICAgICAgICAgICAgICAgID0gMzMsCisgICAgVEFHX0RFRklORUJVVFRPTjIgICAgICAgICAgICAgICAgPSAzNCwKKyAgICBUQUdfREVGSU5FQklUU0pQRUczICAgICAgICAgICAgICA9IDM1LAorICAgIFRBR19ERUZJTkVCSVRTTE9TU0xFU1MyICAgICAgICAgID0gMzYsCisgICAgVEFHX0RFRklORUVESVRURVhUICAgICAgICAgICAgICAgPSAzNywKKyAgICBUQUdfREVGSU5FU1BSSVRFICAgICAgICAgICAgICAgICA9IDM5LAorICAgIFRBR19GUkFNRUxBQkVMICAgICAgICAgICAgICAgICAgID0gNDMsCisgICAgVEFHX1NUUkVBTUhFQUQyICAgICAgICAgICAgICAgICAgPSA0NSwKKyAgICBUQUdfREVGSU5FTU9SUEhTSEFQRSAgICAgICAgICAgICA9IDQ2LAorICAgIFRBR19ERUZJTkVGT05UMiAgICAgICAgICAgICAgICAgID0gNDgsCisgICAgVEFHX0VYUE9SVEFTU0VUUyAgICAgICAgICAgICAgICAgPSA1NiwKKyAgICBUQUdfSU1QT1JUQVNTRVRTICAgICAgICAgICAgICAgICA9IDU3LAorICAgIFRBR19FTkFCTEVERUJVR0dFUiAgICAgICAgICAgICAgID0gNTgsCisgICAgVEFHX0RPSU5JVEFDVElPTiAgICAgICAgICAgICAgICAgPSA1OSwKKyAgICBUQUdfVklERU9TVFJFQU0gICAgICAgICAgICAgICAgICA9IDYwLAorICAgIFRBR19WSURFT0ZSQU1FICAgICAgICAgICAgICAgICAgID0gNjEsCisgICAgVEFHX0RFRklORUZPTlRJTkZPMiAgICAgICAgICAgICAgPSA2MiwKKyAgICBUQUdfRU5BQkxFREVCVUdHRVIyICAgICAgICAgICAgICA9IDY0LAorICAgIFRBR19TQ1JJUFRMSU1JVFMgICAgICAgICAgICAgICAgID0gNjUsCisgICAgVEFHX1NFVFRBQklOREVYICAgICAgICAgICAgICAgICAgPSA2NiwKKyAgICBUQUdfRklMRUFUVFJJQlVURVMgICAgICAgICAgICAgICA9IDY5LAorICAgIFRBR19QTEFDRU9CSkVDVDMgICAgICAgICAgICAgICAgID0gNzAsCisgICAgVEFHX0lNUE9SVEFTU0VUUzIgICAgICAgICAgICAgICAgPSA3MSwKKyAgICBUQUdfREVGSU5FRk9OVEFMSUdOWk9ORVMgICAgICAgICA9IDczLAorICAgIFRBR19DU01URVhUU0VUVElOR1MgICAgICAgICAgICAgID0gNzQsCisgICAgVEFHX0RFRklORUZPTlQzICAgICAgICAgICAgICAgICAgPSA3NSwKKyAgICBUQUdfU1lNQk9MQ0xBU1MgICAgICAgICAgICAgICAgICA9IDc2LAorICAgIFRBR19NRVRBREFUQSAgICAgICAgICAgICAgICAgICAgID0gNzcsCisgICAgVEFHX0RFRklORVNDQUxJTkdHUklEICAgICAgICAgICAgPSA3OCwKKyAgICBUQUdfRE9BQkMgICAgICAgICAgICAgICAgICAgICAgICA9IDgyLAorICAgIFRBR19ERUZJTkVTSEFQRTQgICAgICAgICAgICAgICAgID0gODMsCisgICAgVEFHX0RFRklORU1PUlBIU0hBUEUyICAgICAgICAgICAgPSA4NCwKKyAgICBUQUdfREVGSU5FU0NFTkVBTkRGUkFNRUxBQkVMREFUQSA9IDg2LAorICAgIFRBR19ERUZJTkVCSU5BUllEQVRBICAgICAgICAgICAgID0gODcsCisgICAgVEFHX0RFRklORUZPTlROQU1FICAgICAgICAgICAgICAgPSA4OCwKKyAgICBUQUdfU1RBUlRTT1VORDIgICAgICAgICAgICAgICAgICA9IDg5LAorICAgIFRBR19ERUZJTkVCSVRTSlBFRzQgICAgICAgICAgICAgID0gOTAsCisgICAgVEFHX0RFRklORUZPTlQ0ICAgICAgICAgICAgICAgICAgPSA5MSwKK307CisKKyNkZWZpbmUgVEFHX0xPTkcgICAgICAgICAweDEwMAorCisvKiBmbGFncyBmb3Igc2hhcGUgZGVmaW5pdGlvbiAqLworI2RlZmluZSBGTEFHX01PVkVUTyAgICAgIDB4MDEKKyNkZWZpbmUgRkxBR19TRVRGSUxMMCAgICAweDAyCisjZGVmaW5lIEZMQUdfU0VURklMTDEgICAgMHgwNAorCisjZGVmaW5lIEFVRElPX0ZJRk9fU0laRSA2NTUzNgorCisvKiBjaGFyYWN0ZXIgaWQgdXNlZCAqLworI2RlZmluZSBCSVRNQVBfSUQgMAorI2RlZmluZSBWSURFT19JRCAwCisjZGVmaW5lIFNIQVBFX0lEICAxCisKK3R5cGVkZWYgc3RydWN0IFNXRkNvbnRleHQgeworICAgIGludDY0X3QgZHVyYXRpb25fcG9zOworICAgIGludDY0X3QgdGFnX3BvczsKKyAgICBpbnQ2NF90IHZmcmFtZXNfcG9zOworICAgIGludCBzYW1wbGVzX3Blcl9mcmFtZTsKKyAgICBpbnQgc291bmRfc2FtcGxlczsKKyAgICBpbnQgc3dmX2ZyYW1lX251bWJlcjsKKyAgICBpbnQgdmlkZW9fZnJhbWVfbnVtYmVyOworICAgIGludCBmcmFtZV9yYXRlOworICAgIGludCB0YWc7CisgICAgQVZGaWZvQnVmZmVyICphdWRpb19maWZvOworICAgIEFWQ29kZWNDb250ZXh0ICphdWRpb19lbmMsICp2aWRlb19lbmM7CisgICAgQVZTdHJlYW0gKnZpZGVvX3N0OworI2lmIENPTkZJR19aTElCCisgICAgQVZJT0NvbnRleHQgKnpwYjsKKyNkZWZpbmUgWkJVRl9TSVpFIDQwOTYKKyAgICB1aW50OF90ICp6YnVmX2luOworICAgIHVpbnQ4X3QgKnpidWZfb3V0OworICAgIHpfc3RyZWFtIHpzdHJlYW07CisjZW5kaWYKK30gU1dGQ29udGV4dDsKKworZXh0ZXJuIGNvbnN0IEFWQ29kZWNUYWcgZmZfc3dmX2NvZGVjX3RhZ3NbXTsKKworI2VuZGlmIC8qIEFWRk9STUFUX1NXRl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc3dmZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3dmZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4YmMyMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zd2ZkZWMuYwpAQCAtMCwwICsxLDUyMCBAQAorLyoKKyAqIEZsYXNoIENvbXBhdGlibGUgU3RyZWFtaW5nIEZvcm1hdCBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGluaWMgVXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAic3dmLmgiCisKK3N0YXRpYyBjb25zdCBBVkNvZGVjVGFnIHN3Zl9hdWRpb19jb2RlY190YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsICAweDAwIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9TV0YsICAweDAxIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUDMsICAgICAgICAweDAyIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsICAweDAzIH0sCisvLyAgeyBBVl9DT0RFQ19JRF9ORUxMWU1PU0VSLCAweDA2IH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAgICAgICAgICAwIH0sCit9OworCitzdGF0aWMgaW50IGdldF9zd2ZfdGFnKEFWSU9Db250ZXh0ICpwYiwgaW50ICpsZW5fcHRyKQoreworICAgIGludCB0YWcsIGxlbjsKKworICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICB0YWcgPSBhdmlvX3JsMTYocGIpOworICAgIGxlbiA9IHRhZyAmIDB4M2Y7CisgICAgdGFnID0gdGFnID4+IDY7CisgICAgaWYgKGxlbiA9PSAweDNmKSB7CisgICAgICAgIGxlbiA9IGF2aW9fcmwzMihwYik7CisgICAgfQorICAgICpsZW5fcHRyID0gbGVuOworICAgIHJldHVybiB0YWc7Cit9CisKKworc3RhdGljIGludCBzd2ZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYocC0+YnVmX3NpemUgPCAxNSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayBmaWxlIGhlYWRlciAqLworICAgIGlmICggICBBVl9SQjI0KHAtPmJ1ZikgIT0gQVZfUkIyNCgiQ1dTIikKKyAgICAgICAgJiYgQVZfUkIyNChwLT5idWYpICE9IEFWX1JCMjQoIkZXUyIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChwLT5idWZbM10gPj0gMjApCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDQ7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKKyNpZiBDT05GSUdfWkxJQgorc3RhdGljIGludCB6bGliX3JlZmlsbCh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqcyA9IG9wYXF1ZTsKKyAgICBTV0ZDb250ZXh0ICpzd2YgPSBzLT5wcml2X2RhdGE7CisgICAgel9zdHJlYW0gKnogPSAmc3dmLT56c3RyZWFtOworICAgIGludCByZXQ7CisKK3JldHJ5OgorICAgIGlmICghei0+YXZhaWxfaW4pIHsKKyAgICAgICAgaW50IG4gPSBhdmlvX3JlYWQocy0+cGIsIHN3Zi0+emJ1Zl9pbiwgWkJVRl9TSVpFKTsKKyAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIHotPm5leHRfaW4gID0gc3dmLT56YnVmX2luOworICAgICAgICB6LT5hdmFpbF9pbiA9IG47CisgICAgfQorCisgICAgei0+bmV4dF9vdXQgID0gYnVmOworICAgIHotPmF2YWlsX291dCA9IGJ1Zl9zaXplOworCisgICAgcmV0ID0gaW5mbGF0ZSh6LCBaX05PX0ZMVVNIKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgaWYgKGJ1Zl9zaXplIC0gei0+YXZhaWxfb3V0ID09IDApCisgICAgICAgIGdvdG8gcmV0cnk7CisKKyAgICByZXR1cm4gYnVmX3NpemUgLSB6LT5hdmFpbF9vdXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzd2ZfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNXRkNvbnRleHQgKnN3ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgbmJpdHMsIGxlbiwgdGFnOworCisgICAgdGFnID0gYXZpb19yYjMyKHBiKSAmIDB4ZmZmZmZmMDA7CisgICAgYXZpb19ybDMyKHBiKTsKKworICAgIGlmICh0YWcgPT0gTUtCRVRBRygnQycsICdXJywgJ1MnLCAwKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJTV0YgY29tcHJlc3NlZCBmaWxlIGRldGVjdGVkXG4iKTsKKyNpZiBDT05GSUdfWkxJQgorICAgICAgICBzd2YtPnpidWZfaW4gID0gYXZfbWFsbG9jKFpCVUZfU0laRSk7CisgICAgICAgIHN3Zi0+emJ1Zl9vdXQgPSBhdl9tYWxsb2MoWkJVRl9TSVpFKTsKKyAgICAgICAgc3dmLT56cGIgPSBhdmlvX2FsbG9jX2NvbnRleHQoc3dmLT56YnVmX291dCwgWkJVRl9TSVpFLCAwLCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliX3JlZmlsbCwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmICghc3dmLT56YnVmX2luIHx8ICFzd2YtPnpidWZfb3V0IHx8ICFzd2YtPnpwYikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHN3Zi0+enBiLT5zZWVrYWJsZSA9IDA7CisgICAgICAgIGlmIChpbmZsYXRlSW5pdCgmc3dmLT56c3RyZWFtKSAhPSBaX09LKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGluaXQgemxpYiBjb250ZXh0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgcGIgPSBzd2YtPnpwYjsKKyNlbHNlCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ6bGliIHN1cHBvcnQgaXMgcmVxdWlyZWQgdG8gcmVhZCBTV0YgY29tcHJlc3NlZCBmaWxlc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKHRhZyAhPSBNS0JFVEFHKCdGJywgJ1cnLCAnUycsIDApKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIC8qIHNraXAgcmVjdGFuZ2xlIHNpemUgKi8KKyAgICBuYml0cyA9IGF2aW9fcjgocGIpID4+IDM7CisgICAgbGVuID0gKDQgKiBuYml0cyAtIDMgKyA3KSAvIDg7CisgICAgYXZpb19za2lwKHBiLCBsZW4pOworICAgIHN3Zi0+ZnJhbWVfcmF0ZSA9IGF2aW9fcmwxNihwYik7IC8qIDguOCBmaXhlZCAqLworICAgIGF2aW9fcmwxNihwYik7IC8qIGZyYW1lIGNvdW50ICovCisKKyAgICBzd2YtPnNhbXBsZXNfcGVyX2ZyYW1lID0gMDsKKyAgICBzLT5jdHhfZmxhZ3MgfD0gQVZGTVRDVFhfTk9IRUFERVI7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBBVlN0cmVhbSAqY3JlYXRlX25ld19hdWRpb19zdHJlYW0oQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWQsIGludCBpbmZvKQoreworICAgIGludCBzYW1wbGVfcmF0ZV9jb2RlLCBzYW1wbGVfc2l6ZV9jb2RlOworICAgIEFWU3RyZWFtICphc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghYXN0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3QtPmlkID0gaWQ7CisgICAgaWYgKGluZm8gJiAxKSB7CisgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICB9CisgICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKHN3Zl9hdWRpb19jb2RlY190YWdzLCBpbmZvPj40ICYgMTUpOworICAgIGFzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICBzYW1wbGVfcmF0ZV9jb2RlID0gaW5mbz4+MiAmIDM7CisgICAgc2FtcGxlX3NpemVfY29kZSA9IGluZm8+PjEgJiAxOworICAgIGlmICghc2FtcGxlX3NpemVfY29kZSAmJiBhc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpCisgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gNDQxMDAgPj4gKDMgLSBzYW1wbGVfcmF0ZV9jb2RlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgNjQsIDEsIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICByZXR1cm4gYXN0OworfQorCitzdGF0aWMgaW50IHN3Zl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgU1dGQ29udGV4dCAqc3dmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICp2c3QgPSBOVUxMLCAqYXN0ID0gTlVMTCwgKnN0ID0gMDsKKyAgICBpbnQgdGFnLCBsZW4sIGksIGZyYW1lLCB2LCByZXM7CisKKyNpZiBDT05GSUdfWkxJQgorICAgIGlmIChzd2YtPnpwYikKKyAgICAgICAgcGIgPSBzd2YtPnpwYjsKKyNlbmRpZgorCisgICAgZm9yKDs7KSB7CisgICAgICAgIHVpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIHRhZyA9IGdldF9zd2ZfdGFnKHBiLCAmbGVuKTsKKyAgICAgICAgaWYgKHRhZyA8IDApCisgICAgICAgICAgICByZXR1cm4gdGFnOworICAgICAgICBpZiAobGVuIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdGFnIGxlbmd0aDogJWRcbiIsIGxlbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFnID09IFRBR19WSURFT1NUUkVBTSkgeworICAgICAgICAgICAgaW50IGNoX2lkID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgICAgIGxlbiAtPSAyOworCisgICAgICAgICAgICBmb3IgKGk9MDsgaTxzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgc3QtPmlkID09IGNoX2lkKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2aW9fcmwxNihwYik7CisgICAgICAgICAgICBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgYXZpb19ybDE2KHBiKTsKKyAgICAgICAgICAgIGF2aW9fcjgocGIpOworICAgICAgICAgICAgLyogQ2hlY2sgZm9yIEZMVjEgKi8KKyAgICAgICAgICAgIHZzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgICAgICBpZiAoIXZzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgdnN0LT5pZCA9IGNoX2lkOworICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX3N3Zl9jb2RlY190YWdzLCBhdmlvX3I4KHBiKSk7CisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgMTYsIDI1Niwgc3dmLT5mcmFtZV9yYXRlKTsKKyAgICAgICAgICAgIGxlbiAtPSA4OworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBUQUdfU1RSRUFNSEVBRCB8fCB0YWcgPT0gVEFHX1NUUkVBTUhFQUQyKSB7CisgICAgICAgICAgICAvKiBzdHJlYW1pbmcgZm91bmQgKi8KKworICAgICAgICAgICAgZm9yIChpPTA7IGk8cy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIHN0LT5pZCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIHYgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIHN3Zi0+c2FtcGxlc19wZXJfZnJhbWUgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgYXN0ID0gY3JlYXRlX25ld19hdWRpb19zdHJlYW0ocywgLTEsIHYpOyAvKiAtMSB0byBhdm9pZCBjbGFzaCB3aXRoIHZpZGVvIHN0cmVhbSBjaF9pZCAqLworICAgICAgICAgICAgaWYgKCFhc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGxlbiAtPSA0OworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBUQUdfREVGSU5FU09VTkQpIHsKKyAgICAgICAgICAgIC8qIGF1ZGlvIHN0cmVhbSAqLworICAgICAgICAgICAgaW50IGNoX2lkID0gYXZpb19ybDE2KHBiKTsKKworICAgICAgICAgICAgZm9yIChpPTA7IGk8cy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIHN0LT5pZCA9PSBjaF9pZCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGSVhNRTogVGhlIGVudGlyZSBhdWRpbyBzdHJlYW0gaXMgc3RvcmVkIGluIGEgc2luZ2xlIGNodW5rL3RhZy4gTm9ybWFsbHksCisgICAgICAgICAgICAvLyB0aGVzZSBhcmUgc21hbGxlciBhdWRpbyBzdHJlYW1zIGluIERFRklORVNPVU5EIHRhZ3MsIGJ1dCBpdCdzIHRlY2huaWNhbGx5CisgICAgICAgICAgICAvLyBwb3NzaWJsZSB0aGV5IGNvdWxkIGJlIGh1Z2UuIEJyZWFrIGl0IHVwIGludG8gbXVsdGlwbGUgcGFja2V0cyBpZiBpdCdzIGJpZy4KKyAgICAgICAgICAgIHYgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIGFzdCA9IGNyZWF0ZV9uZXdfYXVkaW9fc3RyZWFtKHMsIGNoX2lkLCB2KTsKKyAgICAgICAgICAgIGlmICghYXN0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBhc3QtPmR1cmF0aW9uID0gYXZpb19ybDMyKHBiKTsgLy8gbnVtYmVyIG9mIHNhbXBsZXMKKyAgICAgICAgICAgIGlmICgoKHY+PjQpICYgMTUpID09IDIpIHsgLy8gTVAzIHNvdW5kIGRhdGEgcmVjb3JkCisgICAgICAgICAgICAgICAgYXN0LT5za2lwX3NhbXBsZXMgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgICAgIGxlbiAtPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuIC09IDc7CisgICAgICAgICAgICBpZiAoKHJlcyA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgbGVuKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBwa3QtPnBvcyA9IHBvczsKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gYXN0LT5pbmRleDsKKyAgICAgICAgICAgIHJldHVybiBwa3QtPnNpemU7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IFRBR19WSURFT0ZSQU1FKSB7CisgICAgICAgICAgICBpbnQgY2hfaWQgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgbGVuIC09IDI7CisgICAgICAgICAgICBmb3IoaT0wOyBpPHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBzdC0+aWQgPT0gY2hfaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcyA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgbGVuKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5wb3MgPSBwb3M7CisgICAgICAgICAgICAgICAgICAgIHBrdC0+cHRzID0gZnJhbWU7CisgICAgICAgICAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGt0LT5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gVEFHX0RFRklORUJJVFNMT1NTTEVTUyB8fCB0YWcgPT0gVEFHX0RFRklORUJJVFNMT1NTTEVTUzIpIHsKKyNpZiBDT05GSUdfWkxJQgorICAgICAgICAgICAgbG9uZyBvdXRfbGVuOworICAgICAgICAgICAgdWludDhfdCAqYnVmID0gTlVMTCwgKnpidWYgPSBOVUxMLCAqcGFsOworICAgICAgICAgICAgdWludDMyX3QgY29sb3JtYXBbQVZQQUxFVFRFX0NPVU5UXSA9IHswfTsKKyAgICAgICAgICAgIGNvbnN0IGludCBhbHBoYV9ibXAgPSB0YWcgPT0gVEFHX0RFRklORUJJVFNMT1NTTEVTUzI7CisgICAgICAgICAgICBjb25zdCBpbnQgY29sb3JtYXBicHAgPSAzICsgYWxwaGFfYm1wOworICAgICAgICAgICAgaW50IGxpbmVzaXplLCBjb2xvcm1hcHNpemUgPSAwOworCisgICAgICAgICAgICBjb25zdCBpbnQgY2hfaWQgICA9IGF2aW9fcmwxNihwYik7CisgICAgICAgICAgICBjb25zdCBpbnQgYm1wX2ZtdCA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgY29uc3QgaW50IHdpZHRoICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgY29uc3QgaW50IGhlaWdodCAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgaW50IHBpeF9mbXQ7CisKKyAgICAgICAgICAgIGxlbiAtPSAyKzErMisyOworCisgICAgICAgICAgICBzd2l0Y2ggKGJtcF9mbXQpIHsKKyAgICAgICAgICAgIGNhc2UgMzogLy8gUEFMLTgKKyAgICAgICAgICAgICAgICBsaW5lc2l6ZSA9IHdpZHRoOworICAgICAgICAgICAgICAgIGNvbG9ybWFwc2l6ZSA9IGF2aW9fcjgocGIpICsgMTsKKyAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDogLy8gUkdCMTUKKyAgICAgICAgICAgICAgICBsaW5lc2l6ZSA9IHdpZHRoICogMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTogLy8gUkdCMjQgKDBSR0IpCisgICAgICAgICAgICAgICAgbGluZXNpemUgPSB3aWR0aCAqIDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGJpdG1hcCBmb3JtYXQgJWQsIHNraXBwZWRcbiIsIGJtcF9mbXQpOworICAgICAgICAgICAgICAgIGdvdG8gYml0bWFwX2VuZF9za2lwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsaW5lc2l6ZSA9IEZGQUxJR04obGluZXNpemUsIDQpOworCisgICAgICAgICAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZSh3aWR0aCwgaGVpZ2h0LCAwLCBzKSA8IDAgfHwKKyAgICAgICAgICAgICAgICBsaW5lc2l6ZSA+PSBJTlRfTUFYIC8gaGVpZ2h0IHx8CisgICAgICAgICAgICAgICAgbGluZXNpemUgKiBoZWlnaHQgPj0gSU5UX01BWCAtIGNvbG9ybWFwc2l6ZSAqIGNvbG9ybWFwYnBwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgZnJhbWUgc2l6ZSAlZHglZFxuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgZ290byBiaXRtYXBfZW5kX3NraXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dF9sZW4gPSBjb2xvcm1hcHNpemUgKiBjb2xvcm1hcGJwcCArIGxpbmVzaXplICogaGVpZ2h0OworCisgICAgICAgICAgICBhdl9kbG9nKHMsICJiaXRtYXA6IGNoPSVkIGZtdD0lZCAlZHglZCAobGluZXNpemU9JWQpIGxlbj0lZC0+JWxkIHBhbD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgY2hfaWQsIGJtcF9mbXQsIHdpZHRoLCBoZWlnaHQsIGxpbmVzaXplLCBsZW4sIG91dF9sZW4sIGNvbG9ybWFwc2l6ZSk7CisKKyAgICAgICAgICAgIHpidWYgPSBhdl9tYWxsb2MobGVuKTsKKyAgICAgICAgICAgIGJ1ZiAgPSBhdl9tYWxsb2Mob3V0X2xlbik7CisgICAgICAgICAgICBpZiAoIXpidWYgfHwgIWJ1ZikgeworICAgICAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGJpdG1hcF9lbmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxlbiA9IGF2aW9fcmVhZChwYiwgemJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCAwIHx8IChyZXMgPSB1bmNvbXByZXNzKGJ1ZiwgJm91dF9sZW4sIHpidWYsIGxlbikpICE9IFpfT0spIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gdW5jb21wcmVzcyBvbmUgYml0bWFwXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGJpdG1hcF9lbmRfc2tpcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTyAmJiBzdC0+aWQgPT0gLTMpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gcy0+bmJfc3RyZWFtcykgeworICAgICAgICAgICAgICAgIHZzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKCF2c3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGJpdG1hcF9lbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZzdC0+aWQgPSAtMzsgLyogLTMgdG8gYXZvaWQgY2xhc2ggd2l0aCB2aWRlbyBzdHJlYW0gYW5kIGF1ZGlvIHN0cmVhbSAqLworICAgICAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgNjQsIDI1Niwgc3dmLT5mcmFtZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBzdCA9IHZzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChyZXMgPSBhdl9uZXdfcGFja2V0KHBrdCwgb3V0X2xlbiAtIGNvbG9ybWFwc2l6ZSAqIGNvbG9ybWFwYnBwKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gYml0bWFwX2VuZDsKKyAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT53aWR0aCAmJiAhc3QtPmNvZGVjLT5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICA9IHdpZHRoOworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmZl9hZGRfcGFyYW1fY2hhbmdlKHBrdCwgMCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwa3QtPnBvcyA9IHBvczsKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworCisgICAgICAgICAgICBzd2l0Y2ggKGJtcF9mbXQpIHsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvcm1hcHNpemU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhX2JtcCkgIGNvbG9ybWFwW2ldID0gYnVmWzNdPDwyNCB8IEFWX1JCMjQoYnVmICsgNCppKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIGNvbG9ybWFwW2ldID0gMHhmZlUgPDwyNCB8IEFWX1JCMjQoYnVmICsgMyppKTsKKyAgICAgICAgICAgICAgICBwYWwgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBhbCkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gYml0bWFwX2VuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KHBhbCwgY29sb3JtYXAsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IGFscGhhX2JtcCA/IEFWX1BJWF9GTVRfQVJHQiA6IEFWX1BJWF9GTVRfMFJHQjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9OT05FICYmIHN0LT5jb2RlYy0+cGl4X2ZtdCAhPSBwaXhfZm10KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInBpeGVsIGZvcm1hdCBjaGFuZ2UgdW5zdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgICAgIHJlcyA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgICAgIGdvdG8gYml0bWFwX2VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IHBpeF9mbXQ7CisKKyAgICAgICAgICAgIGlmIChsaW5lc2l6ZSAqIGhlaWdodCA+IHBrdC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIHJlcyA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBiaXRtYXBfZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgYnVmICsgY29sb3JtYXBzaXplKmNvbG9ybWFwYnBwLCBsaW5lc2l6ZSAqIGhlaWdodCk7CisKKyAgICAgICAgICAgIHJlcyA9IHBrdC0+c2l6ZTsKKworYml0bWFwX2VuZDoKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ6YnVmKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZidWYpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKK2JpdG1hcF9lbmRfc2tpcDoKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ6YnVmKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZidWYpOworI2Vsc2UKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0aGlzIGZpbGUgcmVxdWlyZXMgemxpYiBzdXBwb3J0IGNvbXBpbGVkIGluXG4iKTsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBUQUdfU1RSRUFNQkxPQ0spIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgc3QtPmlkID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmVzID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBsZW4pKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gQURQQ00sIFBDTQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmVzID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBsZW4pKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwa3QtPnBvcyAgICAgICAgICA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwa3QtPnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBUQUdfSlBFRzIpIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRyAmJiBzdC0+aWQgPT0gLTIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gcy0+bmJfc3RyZWFtcykgeworICAgICAgICAgICAgICAgIHZzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKCF2c3QpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgdnN0LT5pZCA9IC0yOyAvKiAtMiB0byBhdm9pZCBjbGFzaCB3aXRoIHZpZGVvIHN0cmVhbSBhbmQgYXVkaW8gc3RyZWFtICovCisgICAgICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01KUEVHOworICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgMjU2LCBzd2YtPmZyYW1lX3JhdGUpOworICAgICAgICAgICAgICAgIHN0ID0gdnN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb19ybDE2KHBiKTsgLyogQklUTUFQX0lEICovCisgICAgICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgICAgIGlmIChsZW4gPCA0KQorICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKKyAgICAgICAgICAgIGlmICgocmVzID0gYXZfbmV3X3BhY2tldChwa3QsIGxlbikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgcGt0LT5kYXRhLCA0KSAhPSA0KSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChBVl9SQjMyKHBrdC0+ZGF0YSkgPT0gMHhmZmQ4ZmZkOSB8fAorICAgICAgICAgICAgICAgIEFWX1JCMzIocGt0LT5kYXRhKSA9PSAweGZmZDlmZmQ4KSB7CisgICAgICAgICAgICAgICAgLyogb2xkIFNXRiBmaWxlcyBjb250YWluaW5nIFNPSS9FT0kgYXMgZGF0YSBzdGFydCAqLworICAgICAgICAgICAgICAgIC8qIGZpbGVzIGNyZWF0ZWQgYnkgc3dpbmsgaGF2ZSByZXZlcnNlZCB0YWcgKi8KKyAgICAgICAgICAgICAgICBwa3QtPnNpemUgLT0gNDsKKyAgICAgICAgICAgICAgICBtZW1zZXQocGt0LT5kYXRhK3BrdC0+c2l6ZSwgMCwgNCk7CisgICAgICAgICAgICAgICAgcmVzID0gYXZpb19yZWFkKHBiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IGF2aW9fcmVhZChwYiwgcGt0LT5kYXRhICsgNCwgcGt0LT5zaXplIC0gNCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA+PSAwKQorICAgICAgICAgICAgICAgICAgICByZXMgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXMgIT0gcGt0LT5zaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfc2hyaW5rX3BhY2tldChwa3QsIHJlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBrdC0+cG9zID0gcG9zOworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgICAgICAgICByZXR1cm4gcGt0LT5zaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIlVua25vd24gdGFnOiAlZFxuIiwgdGFnKTsKKyAgICAgICAgfQorICAgIHNraXA6CisgICAgICAgIGlmKGxlbjwwKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiQ2xpcGluZyBsZW4gJWRcbiIsIGxlbik7CisgICAgICAgIGxlbiA9IEZGTUFYKDAsIGxlbik7CisgICAgICAgIGF2aW9fc2tpcChwYiwgbGVuKTsKKyAgICB9Cit9CisKKyNpZiBDT05GSUdfWkxJQgorc3RhdGljIGF2X2NvbGQgaW50IHN3Zl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgU1dGQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW5mbGF0ZUVuZCgmcy0+enN0cmVhbSk7CisgICAgYXZfZnJlZXAoJnMtPnpidWZfaW4pOworICAgIGF2X2ZyZWVwKCZzLT56YnVmX291dCk7CisgICAgYXZfZnJlZXAoJnMtPnpwYik7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworQVZJbnB1dEZvcm1hdCBmZl9zd2ZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic3dmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU1dGIChTaG9ja1dhdmUgRmxhc2gpIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNXRkNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHN3Zl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBzd2ZfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gc3dmX3JlYWRfcGFja2V0LAorI2lmIENPTkZJR19aTElCCisgICAgLnJlYWRfY2xvc2UgICAgID0gc3dmX3JlYWRfY2xvc2UsCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvc3dmZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvc3dmZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2ZjliMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC9zd2ZlbmMuYwpAQCAtMCwwICsxLDU0NiBAQAorLyoKKyAqIEZsYXNoIENvbXBhdGlibGUgU3RyZWFtaW5nIEZvcm1hdCBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAwIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAzIFRpbmljIFVybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9wdXRfYml0cy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAic3dmLmgiCisKK3N0YXRpYyB2b2lkIHB1dF9zd2ZfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHRhZykKK3sKKyAgICBTV0ZDb250ZXh0ICpzd2YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICBzd2YtPnRhZ19wb3MgPSBhdmlvX3RlbGwocGIpOworICAgIHN3Zi0+dGFnID0gdGFnOworICAgIC8qIHJlc2VydmUgc29tZSByb29tIGZvciB0aGUgdGFnICovCisgICAgaWYgKHRhZyAmIFRBR19MT05HKSB7CisgICAgICAgIGF2aW9fd2wxNihwYiwgMCk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZpb193bDE2KHBiLCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9zd2ZfZW5kX3RhZyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgU1dGQ29udGV4dCAqc3dmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludDY0X3QgcG9zOworICAgIGludCB0YWdfbGVuLCB0YWc7CisKKyAgICBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIHRhZ19sZW4gPSBwb3MgLSBzd2YtPnRhZ19wb3MgLSAyOworICAgIHRhZyA9IHN3Zi0+dGFnOworICAgIGF2aW9fc2VlayhwYiwgc3dmLT50YWdfcG9zLCBTRUVLX1NFVCk7CisgICAgaWYgKHRhZyAmIFRBR19MT05HKSB7CisgICAgICAgIHRhZyAmPSB+VEFHX0xPTkc7CisgICAgICAgIGF2aW9fd2wxNihwYiwgKHRhZyA8PCA2KSB8IDB4M2YpOworICAgICAgICBhdmlvX3dsMzIocGIsIHRhZ19sZW4gLSA0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9hc3NlcnQwKHRhZ19sZW4gPCAweDNmKTsKKyAgICAgICAgYXZpb193bDE2KHBiLCAodGFnIDw8IDYpIHwgdGFnX2xlbik7CisgICAgfQorICAgIGF2aW9fc2VlayhwYiwgcG9zLCBTRUVLX1NFVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXhfbmJpdHMoaW50ICpuYml0c19wdHIsIGludCB2YWwpCit7CisgICAgaW50IG47CisKKyAgICBpZiAodmFsID09IDApCisgICAgICAgIHJldHVybjsKKyAgICB2YWwgPSBhYnModmFsKTsKKyAgICBuID0gMTsKKyAgICB3aGlsZSAodmFsICE9IDApIHsKKyAgICAgICAgbisrOworICAgICAgICB2YWwgPj49IDE7CisgICAgfQorICAgIGlmIChuID4gKm5iaXRzX3B0cikKKyAgICAgICAgKm5iaXRzX3B0ciA9IG47Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9zd2ZfcmVjdChBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhtaW4sIGludCB4bWF4LCBpbnQgeW1pbiwgaW50IHltYXgpCit7CisgICAgUHV0Qml0Q29udGV4dCBwOworICAgIHVpbnQ4X3QgYnVmWzI1Nl07CisgICAgaW50IG5iaXRzLCBtYXNrOworCisgICAgaW5pdF9wdXRfYml0cygmcCwgYnVmLCBzaXplb2YoYnVmKSk7CisKKyAgICBuYml0cyA9IDA7CisgICAgbWF4X25iaXRzKCZuYml0cywgeG1pbik7CisgICAgbWF4X25iaXRzKCZuYml0cywgeG1heCk7CisgICAgbWF4X25iaXRzKCZuYml0cywgeW1pbik7CisgICAgbWF4X25iaXRzKCZuYml0cywgeW1heCk7CisgICAgbWFzayA9ICgxIDw8IG5iaXRzKSAtIDE7CisKKyAgICAvKiByZWN0YW5nbGUgaW5mbyAqLworICAgIHB1dF9iaXRzKCZwLCA1LCBuYml0cyk7CisgICAgcHV0X2JpdHMoJnAsIG5iaXRzLCB4bWluICYgbWFzayk7CisgICAgcHV0X2JpdHMoJnAsIG5iaXRzLCB4bWF4ICYgbWFzayk7CisgICAgcHV0X2JpdHMoJnAsIG5iaXRzLCB5bWluICYgbWFzayk7CisgICAgcHV0X2JpdHMoJnAsIG5iaXRzLCB5bWF4ICYgbWFzayk7CisKKyAgICBmbHVzaF9wdXRfYml0cygmcCk7CisgICAgYXZpb193cml0ZShwYiwgYnVmLCBwdXRfYml0c19wdHIoJnApIC0gcC5idWYpOworfQorCitzdGF0aWMgdm9pZCBwdXRfc3dmX2xpbmVfZWRnZShQdXRCaXRDb250ZXh0ICpwYiwgaW50IGR4LCBpbnQgZHkpCit7CisgICAgaW50IG5iaXRzLCBtYXNrOworCisgICAgcHV0X2JpdHMocGIsIDEsIDEpOyAvKiBlZGdlICovCisgICAgcHV0X2JpdHMocGIsIDEsIDEpOyAvKiBsaW5lIHNlbGVjdCAqLworICAgIG5iaXRzID0gMjsKKyAgICBtYXhfbmJpdHMoJm5iaXRzLCBkeCk7CisgICAgbWF4X25iaXRzKCZuYml0cywgZHkpOworCisgICAgbWFzayA9ICgxIDw8IG5iaXRzKSAtIDE7CisgICAgcHV0X2JpdHMocGIsIDQsIG5iaXRzIC0gMik7IC8qIDE2IGJpdHMgcHJlY2lzaW9uICovCisgICAgaWYgKGR4ID09IDApIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIDApOworICAgICAgICBwdXRfYml0cyhwYiwgMSwgMSk7CisgICAgICAgIHB1dF9iaXRzKHBiLCBuYml0cywgZHkgJiBtYXNrKTsKKyAgICB9IGVsc2UgaWYgKGR5ID09IDApIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIDApOworICAgICAgICBwdXRfYml0cyhwYiwgMSwgMCk7CisgICAgICAgIHB1dF9iaXRzKHBiLCBuYml0cywgZHggJiBtYXNrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXRfYml0cyhwYiwgMSwgMSk7CisgICAgICAgIHB1dF9iaXRzKHBiLCBuYml0cywgZHggJiBtYXNrKTsKKyAgICAgICAgcHV0X2JpdHMocGIsIG5iaXRzLCBkeSAmIG1hc2spOworICAgIH0KK30KKworI2RlZmluZSBGUkFDX0JJVFMgMTYKKworc3RhdGljIHZvaWQgcHV0X3N3Zl9tYXRyaXgoQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQsIGludCB0eCwgaW50IHR5KQoreworICAgIFB1dEJpdENvbnRleHQgcDsKKyAgICB1aW50OF90IGJ1ZlsyNTZdOworICAgIGludCBuYml0czsKKworICAgIGluaXRfcHV0X2JpdHMoJnAsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisgICAgcHV0X2JpdHMoJnAsIDEsIDEpOyAvKiBhLCBkIHByZXNlbnQgKi8KKyAgICBuYml0cyA9IDE7CisgICAgbWF4X25iaXRzKCZuYml0cywgYSk7CisgICAgbWF4X25iaXRzKCZuYml0cywgZCk7CisgICAgcHV0X2JpdHMoJnAsIDUsIG5iaXRzKTsgLyogbmIgYml0cyAqLworICAgIHB1dF9iaXRzKCZwLCBuYml0cywgYSk7CisgICAgcHV0X2JpdHMoJnAsIG5iaXRzLCBkKTsKKworICAgIHB1dF9iaXRzKCZwLCAxLCAxKTsgLyogYiwgYyBwcmVzZW50ICovCisgICAgbmJpdHMgPSAxOworICAgIG1heF9uYml0cygmbmJpdHMsIGMpOworICAgIG1heF9uYml0cygmbmJpdHMsIGIpOworICAgIHB1dF9iaXRzKCZwLCA1LCBuYml0cyk7IC8qIG5iIGJpdHMgKi8KKyAgICBwdXRfYml0cygmcCwgbmJpdHMsIGMpOworICAgIHB1dF9iaXRzKCZwLCBuYml0cywgYik7CisKKyAgICBuYml0cyA9IDE7CisgICAgbWF4X25iaXRzKCZuYml0cywgdHgpOworICAgIG1heF9uYml0cygmbmJpdHMsIHR5KTsKKyAgICBwdXRfYml0cygmcCwgNSwgbmJpdHMpOyAvKiBuYiBiaXRzICovCisgICAgcHV0X2JpdHMoJnAsIG5iaXRzLCB0eCk7CisgICAgcHV0X2JpdHMoJnAsIG5iaXRzLCB0eSk7CisKKyAgICBmbHVzaF9wdXRfYml0cygmcCk7CisgICAgYXZpb193cml0ZShwYiwgYnVmLCBwdXRfYml0c19wdHIoJnApIC0gcC5idWYpOworfQorCitzdGF0aWMgaW50IHN3Zl93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNXRkNvbnRleHQgKnN3ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBQdXRCaXRDb250ZXh0IHA7CisgICAgdWludDhfdCBidWYxWzI1Nl07CisgICAgaW50IGksIHdpZHRoLCBoZWlnaHQsIHJhdGUsIHJhdGVfYmFzZTsKKyAgICBpbnQgdmVyc2lvbjsKKworICAgIHN3Zi0+c291bmRfc2FtcGxlcyA9IDA7CisgICAgc3dmLT5zd2ZfZnJhbWVfbnVtYmVyID0gMDsKKyAgICBzd2YtPnZpZGVvX2ZyYW1lX251bWJlciA9IDA7CisKKyAgICBmb3IoaT0wO2k8cy0+bmJfc3RyZWFtcztpKyspIHsKKyAgICAgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbaV0tPmNvZGVjOworICAgICAgICBpZiAoZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgaWYgKHN3Zi0+YXVkaW9fZW5jKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlNXRiBtdXhlciBvbmx5IHN1cHBvcnRzIDEgYXVkaW8gc3RyZWFtXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMykgeworICAgICAgICAgICAgICAgIGlmICghZW5jLT5mcmFtZV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJhdWRpbyBmcmFtZSBzaXplIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3Zi0+YXVkaW9fZW5jID0gZW5jOworICAgICAgICAgICAgICAgIHN3Zi0+YXVkaW9fZmlmbz0gYXZfZmlmb19hbGxvYyhBVURJT19GSUZPX1NJWkUpOworICAgICAgICAgICAgICAgIGlmICghc3dmLT5hdWRpb19maWZvKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU1dGIG11eGVyIG9ubHkgc3VwcG9ydHMgTVAzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc3dmLT52aWRlb19lbmMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU1dGIG11eGVyIG9ubHkgc3VwcG9ydHMgMSB2aWRlbyBzdHJlYW1cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2RiB8fAorICAgICAgICAgICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxWMSB8fAorICAgICAgICAgICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUpQRUcpIHsKKyAgICAgICAgICAgICAgICBzd2YtPnZpZGVvX3N0ICA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICAgICAgc3dmLT52aWRlb19lbmMgPSBlbmM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTV0YgbXV4ZXIgb25seSBzdXBwb3J0cyBWUDYsIEZMVjEgYW5kIE1KUEVHXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXN3Zi0+dmlkZW9fZW5jKSB7CisgICAgICAgIC8qIGN1cnJlbnRseSwgY2Fubm90IHdvcmsgY29ycmVjdGx5IGlmIGF1ZGlvIG9ubHkgKi8KKyAgICAgICAgd2lkdGggPSAzMjA7CisgICAgICAgIGhlaWdodCA9IDIwMDsKKyAgICAgICAgcmF0ZSA9IDEwOworICAgICAgICByYXRlX2Jhc2U9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2lkdGggPSBzd2YtPnZpZGVvX2VuYy0+d2lkdGg7CisgICAgICAgIGhlaWdodCA9IHN3Zi0+dmlkZW9fZW5jLT5oZWlnaHQ7CisgICAgICAgIC8vIFRPRE86IHNob3VsZCBiZSBhdmdfZnJhbWVfcmF0ZQorICAgICAgICByYXRlID0gc3dmLT52aWRlb19zdC0+dGltZV9iYXNlLmRlbjsKKyAgICAgICAgcmF0ZV9iYXNlID0gc3dmLT52aWRlb19zdC0+dGltZV9iYXNlLm51bTsKKyAgICB9CisKKyAgICBpZiAoIXN3Zi0+YXVkaW9fZW5jKQorICAgICAgICBzd2YtPnNhbXBsZXNfcGVyX2ZyYW1lID0gKDQ0MTAwLjAgKiByYXRlX2Jhc2UpIC8gcmF0ZTsKKyAgICBlbHNlCisgICAgICAgIHN3Zi0+c2FtcGxlc19wZXJfZnJhbWUgPSAoc3dmLT5hdWRpb19lbmMtPnNhbXBsZV9yYXRlICogcmF0ZV9iYXNlKSAvIHJhdGU7CisKKyAgICBhdmlvX3dyaXRlKHBiLCAiRldTIiwgMyk7CisKKyAgICBpZiAoIXN0cmNtcCgiYXZtMiIsIHMtPm9mb3JtYXQtPm5hbWUpKQorICAgICAgICB2ZXJzaW9uID0gOTsKKyAgICBlbHNlIGlmIChzd2YtPnZpZGVvX2VuYyAmJiBzd2YtPnZpZGVvX2VuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2RikKKyAgICAgICAgdmVyc2lvbiA9IDg7IC8qIHZlcnNpb24gOCBhbmQgYWJvdmUgc3VwcG9ydCBWUDYgY29kZWMgKi8KKyAgICBlbHNlIGlmIChzd2YtPnZpZGVvX2VuYyAmJiBzd2YtPnZpZGVvX2VuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxWMSkKKyAgICAgICAgdmVyc2lvbiA9IDY7IC8qIHZlcnNpb24gNiBhbmQgYWJvdmUgc3VwcG9ydCBGTFYxIGNvZGVjICovCisgICAgZWxzZQorICAgICAgICB2ZXJzaW9uID0gNDsgLyogdmVyc2lvbiA0IGZvciBtcGVnIGF1ZGlvIHN1cHBvcnQgKi8KKyAgICBhdmlvX3c4KHBiLCB2ZXJzaW9uKTsKKworICAgIGF2aW9fd2wzMihwYiwgRFVNTVlfRklMRV9TSVpFKTsgLyogZHVtbXkgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2lsbCBiZSBwYXRjaGVkIGlmIG5vdCBzdHJlYW1lZCkgKi8KKworICAgIHB1dF9zd2ZfcmVjdChwYiwgMCwgd2lkdGggKiAyMCwgMCwgaGVpZ2h0ICogMjApOworICAgIGF2aW9fd2wxNihwYiwgKHJhdGUgKiAyNTYpIC8gcmF0ZV9iYXNlKTsgLyogZnJhbWUgcmF0ZSAqLworICAgIHN3Zi0+ZHVyYXRpb25fcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3dsMTYocGIsICh1aW50MTZfdCkoRFVNTVlfRFVSQVRJT04gKiAoaW50NjRfdClyYXRlIC8gcmF0ZV9iYXNlKSk7IC8qIGZyYW1lIGNvdW50ICovCisKKyAgICAvKiBhdm0yL3N3ZiB2OSAoYWxzbyB2OD8pIGZpbGVzIHJlcXVpcmUgYSBmaWxlIGF0dHJpYnV0ZSB0YWcgKi8KKyAgICBpZiAodmVyc2lvbiA9PSA5KSB7CisgICAgICAgIHB1dF9zd2ZfdGFnKHMsIFRBR19GSUxFQVRUUklCVVRFUyk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgMTw8Myk7IC8qIHNldCBBY3Rpb25TY3JpcHQgdjMvQVZNMiBmbGFnICovCisgICAgICAgIHB1dF9zd2ZfZW5kX3RhZyhzKTsKKyAgICB9CisKKyAgICAvKiBkZWZpbmUgYSBzaGFwZSB3aXRoIHRoZSBqcGVnIGluc2lkZSAqLworICAgIGlmIChzd2YtPnZpZGVvX2VuYyAmJiBzd2YtPnZpZGVvX2VuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUpQRUcpIHsKKyAgICAgICAgcHV0X3N3Zl90YWcocywgVEFHX0RFRklORVNIQVBFKTsKKworICAgICAgICBhdmlvX3dsMTYocGIsIFNIQVBFX0lEKTsgLyogSUQgb2Ygc2hhcGUgKi8KKyAgICAgICAgLyogYm91bmRpbmcgcmVjdGFuZ2xlICovCisgICAgICAgIHB1dF9zd2ZfcmVjdChwYiwgMCwgd2lkdGgsIDAsIGhlaWdodCk7CisgICAgICAgIC8qIHN0eWxlIGluZm8gKi8KKyAgICAgICAgYXZpb193OChwYiwgMSk7IC8qIG9uZSBmaWxsIHN0eWxlICovCisgICAgICAgIGF2aW9fdzgocGIsIDB4NDEpOyAvKiBjbGlwcGVkIGJpdG1hcCBmaWxsICovCisgICAgICAgIGF2aW9fd2wxNihwYiwgQklUTUFQX0lEKTsgLyogYml0bWFwIElEICovCisgICAgICAgIC8qIHBvc2l0aW9uIG9mIHRoZSBiaXRtYXAgKi8KKyAgICAgICAgcHV0X3N3Zl9tYXRyaXgocGIsIChpbnQpKDEuMCAqICgxIDw8IEZSQUNfQklUUykpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAwLCAoaW50KSgxLjAgKiAoMSA8PCBGUkFDX0JJVFMpKSwgMCwgMCk7CisgICAgICAgIGF2aW9fdzgocGIsIDApOyAvKiBubyBsaW5lIHN0eWxlICovCisKKyAgICAgICAgLyogc2hhcGUgZHJhd2luZyAqLworICAgICAgICBpbml0X3B1dF9iaXRzKCZwLCBidWYxLCBzaXplb2YoYnVmMSkpOworICAgICAgICBwdXRfYml0cygmcCwgNCwgMSk7IC8qIG9uZSBmaWxsIGJpdCAqLworICAgICAgICBwdXRfYml0cygmcCwgNCwgMCk7IC8qIHplcm8gbGluZSBiaXQgKi8KKworICAgICAgICBwdXRfYml0cygmcCwgMSwgMCk7IC8qIG5vdCBhbiBlZGdlICovCisgICAgICAgIHB1dF9iaXRzKCZwLCA1LCBGTEFHX01PVkVUTyB8IEZMQUdfU0VURklMTDApOworICAgICAgICBwdXRfYml0cygmcCwgNSwgMSk7IC8qIG5iaXRzICovCisgICAgICAgIHB1dF9iaXRzKCZwLCAxLCAwKTsgLyogWCAqLworICAgICAgICBwdXRfYml0cygmcCwgMSwgMCk7IC8qIFkgKi8KKyAgICAgICAgcHV0X2JpdHMoJnAsIDEsIDEpOyAvKiBzZXQgZmlsbCBzdHlsZSAxICovCisKKyAgICAgICAgLyogZHJhdyB0aGUgcmVjdGFuZ2xlICEgKi8KKyAgICAgICAgcHV0X3N3Zl9saW5lX2VkZ2UoJnAsIHdpZHRoLCAwKTsKKyAgICAgICAgcHV0X3N3Zl9saW5lX2VkZ2UoJnAsIDAsIGhlaWdodCk7CisgICAgICAgIHB1dF9zd2ZfbGluZV9lZGdlKCZwLCAtd2lkdGgsIDApOworICAgICAgICBwdXRfc3dmX2xpbmVfZWRnZSgmcCwgMCwgLWhlaWdodCk7CisKKyAgICAgICAgLyogZW5kIG9mIHNoYXBlICovCisgICAgICAgIHB1dF9iaXRzKCZwLCAxLCAwKTsgLyogbm90IGFuIGVkZ2UgKi8KKyAgICAgICAgcHV0X2JpdHMoJnAsIDUsIDApOworCisgICAgICAgIGZsdXNoX3B1dF9iaXRzKCZwKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgYnVmMSwgcHV0X2JpdHNfcHRyKCZwKSAtIHAuYnVmKTsKKworICAgICAgICBwdXRfc3dmX2VuZF90YWcocyk7CisgICAgfQorCisgICAgaWYgKHN3Zi0+YXVkaW9fZW5jICYmIHN3Zi0+YXVkaW9fZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMpIHsKKyAgICAgICAgaW50IHYgPSAwOworCisgICAgICAgIC8qIHN0YXJ0IHNvdW5kICovCisgICAgICAgIHB1dF9zd2ZfdGFnKHMsIFRBR19TVFJFQU1IRUFEMik7CisgICAgICAgIHN3aXRjaChzd2YtPmF1ZGlvX2VuYy0+c2FtcGxlX3JhdGUpIHsKKyAgICAgICAgY2FzZSAxMTAyNTogdiB8PSAxIDw8IDI7IGJyZWFrOworICAgICAgICBjYXNlIDIyMDUwOiB2IHw9IDIgPDwgMjsgYnJlYWs7CisgICAgICAgIGNhc2UgNDQxMDA6IHYgfD0gMyA8PCAyOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJzd2YgZG9lcyBub3Qgc3VwcG9ydCB0aGF0IHNhbXBsZSByYXRlLCBjaG9vc2UgZnJvbSAoNDQxMDAsIDIyMDUwLCAxMTAyNSkuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB2IHw9IDB4MDI7IC8qIDE2IGJpdCBwbGF5YmFjayAqLworICAgICAgICBpZiAoc3dmLT5hdWRpb19lbmMtPmNoYW5uZWxzID09IDIpCisgICAgICAgICAgICB2IHw9IDB4MDE7IC8qIHN0ZXJlbyBwbGF5YmFjayAqLworICAgICAgICBhdmlvX3c4KHMtPnBiLCB2KTsKKyAgICAgICAgdiB8PSAweDIwOyAvKiBtcDMgY29tcHJlc3NlZCAqLworICAgICAgICBhdmlvX3c4KHMtPnBiLCB2KTsKKyAgICAgICAgYXZpb193bDE2KHMtPnBiLCBzd2YtPnNhbXBsZXNfcGVyX2ZyYW1lKTsgIC8qIGF2ZyBzYW1wbGVzIHBlciBmcmFtZSAqLworICAgICAgICBhdmlvX3dsMTYocy0+cGIsIDApOworCisgICAgICAgIHB1dF9zd2ZfZW5kX3RhZyhzKTsKKyAgICB9CisKKyAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd2Zfd3JpdGVfdmlkZW8oQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmVuYywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBTV0ZDb250ZXh0ICpzd2YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICAvKiBGbGFzaCBQbGF5ZXIgbGltaXQgKi8KKyAgICBpZiAoc3dmLT5zd2ZfZnJhbWVfbnVtYmVyID09IDE2MDAwKQorICAgICAgICBhdl9sb2coZW5jLCBBVl9MT0dfSU5GTywgIndhcm5pbmc6IEZsYXNoIFBsYXllciBsaW1pdCBvZiAxNjAwMCBmcmFtZXMgcmVhY2hlZFxuIik7CisKKyAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZGIHx8CisgICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxWMSkgeworICAgICAgICBpZiAoc3dmLT52aWRlb19mcmFtZV9udW1iZXIgPT0gMCkgeworICAgICAgICAgICAgLyogY3JlYXRlIGEgbmV3IHZpZGVvIG9iamVjdCAqLworICAgICAgICAgICAgcHV0X3N3Zl90YWcocywgVEFHX1ZJREVPU1RSRUFNKTsKKyAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgVklERU9fSUQpOworICAgICAgICAgICAgc3dmLT52ZnJhbWVzX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIDE1MDAwKTsgLyogaGFyZCBmbGFzaCBwbGF5ZXIgbGltaXQgKi8KKyAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgZW5jLT53aWR0aCk7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIGVuYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIDApOworICAgICAgICAgICAgYXZpb193OChwYixmZl9jb2RlY19nZXRfdGFnKGZmX3N3Zl9jb2RlY190YWdzLCBlbmMtPmNvZGVjX2lkKSk7CisgICAgICAgICAgICBwdXRfc3dmX2VuZF90YWcocyk7CisKKyAgICAgICAgICAgIC8qIHBsYWNlIHRoZSB2aWRlbyBvYmplY3QgZm9yIHRoZSBmaXJzdCB0aW1lICovCisgICAgICAgICAgICBwdXRfc3dmX3RhZyhzLCBUQUdfUExBQ0VPQkpFQ1QyKTsKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIDB4MzYpOworICAgICAgICAgICAgYXZpb193bDE2KHBiLCAxKTsKKyAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgVklERU9fSUQpOworICAgICAgICAgICAgcHV0X3N3Zl9tYXRyaXgocGIsIDEgPDwgRlJBQ19CSVRTLCAwLCAwLCAxIDw8IEZSQUNfQklUUywgMCwgMCk7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIHN3Zi0+dmlkZW9fZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgIGF2aW9fd3JpdGUocGIsICJ2aWRlbyIsIDUpOworICAgICAgICAgICAgYXZpb193OChwYiwgMHgwMCk7CisgICAgICAgICAgICBwdXRfc3dmX2VuZF90YWcocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBtYXJrIHRoZSBjaGFyYWN0ZXIgZm9yIHVwZGF0ZSAqLworICAgICAgICAgICAgcHV0X3N3Zl90YWcocywgVEFHX1BMQUNFT0JKRUNUMik7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCAweDExKTsKKyAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMSk7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIHN3Zi0+dmlkZW9fZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgIHB1dF9zd2ZfZW5kX3RhZyhzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNldCB2aWRlbyBmcmFtZSBkYXRhICovCisgICAgICAgIHB1dF9zd2ZfdGFnKHMsIFRBR19WSURFT0ZSQU1FIHwgVEFHX0xPTkcpOworICAgICAgICBhdmlvX3dsMTYocGIsIFZJREVPX0lEKTsKKyAgICAgICAgYXZpb193bDE2KHBiLCBzd2YtPnZpZGVvX2ZyYW1lX251bWJlcisrKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgYnVmLCBzaXplKTsKKyAgICAgICAgcHV0X3N3Zl9lbmRfdGFnKHMpOworICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRykgeworICAgICAgICBpZiAoc3dmLT5zd2ZfZnJhbWVfbnVtYmVyID4gMCkgeworICAgICAgICAgICAgLyogcmVtb3ZlIHRoZSBzaGFwZSAqLworICAgICAgICAgICAgcHV0X3N3Zl90YWcocywgVEFHX1JFTU9WRU9CSkVDVCk7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIFNIQVBFX0lEKTsgLyogc2hhcGUgSUQgKi8KKyAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMSk7IC8qIGRlcHRoICovCisgICAgICAgICAgICBwdXRfc3dmX2VuZF90YWcocyk7CisKKyAgICAgICAgICAgIC8qIGZyZWUgdGhlIGJpdG1hcCAqLworICAgICAgICAgICAgcHV0X3N3Zl90YWcocywgVEFHX0ZSRUVDSEFSQUNURVIpOworICAgICAgICAgICAgYXZpb193bDE2KHBiLCBCSVRNQVBfSUQpOworICAgICAgICAgICAgcHV0X3N3Zl9lbmRfdGFnKHMpOworICAgICAgICB9CisKKyAgICAgICAgcHV0X3N3Zl90YWcocywgVEFHX0pQRUcyIHwgVEFHX0xPTkcpOworCisgICAgICAgIGF2aW9fd2wxNihwYiwgQklUTUFQX0lEKTsgLyogSUQgb2YgdGhlIGltYWdlICovCisKKyAgICAgICAgLyogYSBkdW1teSBqcGVnIGhlYWRlciBzZWVtcyB0byBiZSByZXF1aXJlZCAqLworICAgICAgICBhdmlvX3diMzIocGIsIDB4ZmZkOGZmZDkpOworICAgICAgICAvKiB3cml0ZSB0aGUganBlZyBpbWFnZSAqLworICAgICAgICBhdmlvX3dyaXRlKHBiLCBidWYsIHNpemUpOworCisgICAgICAgIHB1dF9zd2ZfZW5kX3RhZyhzKTsKKworICAgICAgICAvKiBkcmF3IHRoZSBzaGFwZSAqLworCisgICAgICAgIHB1dF9zd2ZfdGFnKHMsIFRBR19QTEFDRU9CSkVDVCk7CisgICAgICAgIGF2aW9fd2wxNihwYiwgU0hBUEVfSUQpOyAvKiBzaGFwZSBJRCAqLworICAgICAgICBhdmlvX3dsMTYocGIsIDEpOyAvKiBkZXB0aCAqLworICAgICAgICBwdXRfc3dmX21hdHJpeChwYiwgMjAgPDwgRlJBQ19CSVRTLCAwLCAwLCAyMCA8PCBGUkFDX0JJVFMsIDAsIDApOworICAgICAgICBwdXRfc3dmX2VuZF90YWcocyk7CisgICAgfQorCisgICAgc3dmLT5zd2ZfZnJhbWVfbnVtYmVyKys7CisKKyAgICAvKiBzdHJlYW1pbmcgc291bmQgYWx3YXlzIHNob3VsZCBiZSBwbGFjZWQganVzdCBiZWZvcmUgc2hvd2ZyYW1lIHRhZ3MgKi8KKyAgICBpZiAoc3dmLT5hdWRpb19lbmMgJiYgYXZfZmlmb19zaXplKHN3Zi0+YXVkaW9fZmlmbykpIHsKKyAgICAgICAgaW50IGZyYW1lX3NpemUgPSBhdl9maWZvX3NpemUoc3dmLT5hdWRpb19maWZvKTsKKyAgICAgICAgcHV0X3N3Zl90YWcocywgVEFHX1NUUkVBTUJMT0NLIHwgVEFHX0xPTkcpOworICAgICAgICBhdmlvX3dsMTYocGIsIHN3Zi0+c291bmRfc2FtcGxlcyk7CisgICAgICAgIGF2aW9fd2wxNihwYiwgMCk7IC8vIHNlZWsgc2FtcGxlcworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzd2YtPmF1ZGlvX2ZpZm8sIHBiLCBmcmFtZV9zaXplLCAodm9pZCopYXZpb193cml0ZSk7CisgICAgICAgIHB1dF9zd2ZfZW5kX3RhZyhzKTsKKworICAgICAgICAvKiB1cGRhdGUgRklGTyAqLworICAgICAgICBzd2YtPnNvdW5kX3NhbXBsZXMgPSAwOworICAgIH0KKworICAgIC8qIG91dHB1dCB0aGUgZnJhbWUgKi8KKyAgICBwdXRfc3dmX3RhZyhzLCBUQUdfU0hPV0ZSQU1FKTsKKyAgICBwdXRfc3dmX2VuZF90YWcocyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd2Zfd3JpdGVfYXVkaW8oQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmVuYywgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBTV0ZDb250ZXh0ICpzd2YgPSBzLT5wcml2X2RhdGE7CisKKyAgICAvKiBGbGFzaCBQbGF5ZXIgbGltaXQgKi8KKyAgICBpZiAoc3dmLT5zd2ZfZnJhbWVfbnVtYmVyID09IDE2MDAwKQorICAgICAgICBhdl9sb2coZW5jLCBBVl9MT0dfSU5GTywgIndhcm5pbmc6IEZsYXNoIFBsYXllciBsaW1pdCBvZiAxNjAwMCBmcmFtZXMgcmVhY2hlZFxuIik7CisKKyAgICBpZiAoYXZfZmlmb19zaXplKHN3Zi0+YXVkaW9fZmlmbykgKyBzaXplID4gQVVESU9fRklGT19TSVpFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJhdWRpbyBmaWZvIHRvbyBzbWFsbCB0byBtdXggYXVkaW8gZXNzZW5jZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoc3dmLT5hdWRpb19maWZvLCBidWYsIHNpemUsIE5VTEwpOworICAgIHN3Zi0+c291bmRfc2FtcGxlcyArPSBlbmMtPmZyYW1lX3NpemU7CisKKyAgICAvKiBpZiBhdWRpbyBvbmx5IHN0cmVhbSBtYWtlIHN1cmUgd2UgYWRkIHN3ZiBmcmFtZXMgKi8KKyAgICBpZiAoIXN3Zi0+dmlkZW9fZW5jKQorICAgICAgICBzd2Zfd3JpdGVfdmlkZW8ocywgZW5jLCAwLCAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN3Zl93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYzsKKyAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICByZXR1cm4gc3dmX3dyaXRlX2F1ZGlvKHMsIGNvZGVjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gc3dmX3dyaXRlX3ZpZGVvKHMsIGNvZGVjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgc3dmX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNXRkNvbnRleHQgKnN3ZiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jLCAqdmlkZW9fZW5jOworICAgIGludCBmaWxlX3NpemUsIGk7CisKKyAgICB2aWRlb19lbmMgPSBOVUxMOworICAgIGZvcihpPTA7aTxzLT5uYl9zdHJlYW1zO2krKykgeworICAgICAgICBlbmMgPSBzLT5zdHJlYW1zW2ldLT5jb2RlYzsKKyAgICAgICAgaWYgKGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICB2aWRlb19lbmMgPSBlbmM7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXZfZmlmb19mcmVlcCgmc3dmLT5hdWRpb19maWZvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1dF9zd2ZfdGFnKHMsIFRBR19FTkQpOworICAgIHB1dF9zd2ZfZW5kX3RhZyhzKTsKKworICAgIC8qIHBhdGNoIGZpbGUgc2l6ZSBhbmQgbnVtYmVyIG9mIGZyYW1lcyBpZiBub3Qgc3RyZWFtZWQgKi8KKyAgICBpZiAocy0+cGItPnNlZWthYmxlICYmIHZpZGVvX2VuYykgeworICAgICAgICBmaWxlX3NpemUgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBhdmlvX3NlZWsocGIsIDQsIFNFRUtfU0VUKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCBmaWxlX3NpemUpOworICAgICAgICBhdmlvX3NlZWsocGIsIHN3Zi0+ZHVyYXRpb25fcG9zLCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fd2wxNihwYiwgc3dmLT52aWRlb19mcmFtZV9udW1iZXIpOworICAgICAgICBpZiAoc3dmLT52ZnJhbWVzX3BvcykgeworICAgICAgICBhdmlvX3NlZWsocGIsIHN3Zi0+dmZyYW1lc19wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgYXZpb193bDE2KHBiLCBzd2YtPnZpZGVvX2ZyYW1lX251bWJlcik7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19zZWVrKHBiLCBmaWxlX3NpemUsIFNFRUtfU0VUKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfU1dGX01VWEVSCitBVk91dHB1dEZvcm1hdCBmZl9zd2ZfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gInN3ZiIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNXRiAoU2hvY2tXYXZlIEZsYXNoKSIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gInN3ZiIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKFNXRkNvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01QMywKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9GTFYxLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IHN3Zl93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gc3dmX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBzd2Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9UU19OT05TVFJJQ1QsCit9OworI2VuZGlmCisjaWYgQ09ORklHX0FWTTJfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX2F2bTJfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImF2bTIiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTV0YgKFNob2NrV2F2ZSBGbGFzaCkgKEFWTTIpIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoU1dGQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTVAzLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0ZMVjEsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gc3dmX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBzd2Zfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IHN3Zl93cml0ZV90cmFpbGVyLAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX1RTX05PTlNUUklDVCwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC90YWtkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC90YWtkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWIxYThlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Rha2RlYy5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogUmF3IFRBSyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy90YWsuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInJhd2RlYy5oIgorI2luY2x1ZGUgImFwZXRhZy5oIgorCit0eXBlZGVmIHN0cnVjdCBUQUtEZW11eENvbnRleHQgeworICAgIGludCAgICAgbWxhc3RfZnJhbWU7CisgICAgaW50NjRfdCBkYXRhX2VuZDsKK30gVEFLRGVtdXhDb250ZXh0OworCitzdGF0aWMgaW50IHRha19wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoIW1lbWNtcChwLT5idWYsICJ0QmFLIiwgNCkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGFrX2NoZWNrX2NyYyh1bnNpZ25lZCBsb25nIGNoZWNrc3VtLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisgICAgcmV0dXJuIGF2X2NyYyhhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18yNF9JRUVFKSwgY2hlY2tzdW0sIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGludCB0YWtfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFRBS0RlbXV4Q29udGV4dCAqdGMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiICAgICA9IHMtPnBiOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgQVZTdHJlYW0gKnN0OworICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IE5VTEw7CisgICAgaW50IHJldDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1RBSzsKKyAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVzsKKworICAgIHRjLT5tbGFzdF9mcmFtZSA9IDA7CisgICAgaWYgKGF2aW9fcmwzMihwYikgIT0gTUtUQUcoJ3QnLCAnQicsICdhJywgJ0snKSkgeworICAgICAgICBhdmlvX3NlZWsocGIsIC00LCBTRUVLX0NVUik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHdoaWxlICghYXZpb19mZW9mKHBiKSkgeworICAgICAgICBlbnVtIFRBS01ldGFEYXRhVHlwZSB0eXBlOworICAgICAgICBpbnQgc2l6ZTsKKworICAgICAgICB0eXBlID0gYXZpb19yOChwYikgJiAweDdmOworICAgICAgICBzaXplID0gYXZpb19ybDI0KHBiKTsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBUQUtfTUVUQURBVEFfU1RSRUFNSU5GTzoKKyAgICAgICAgY2FzZSBUQUtfTUVUQURBVEFfTEFTVF9GUkFNRToKKyAgICAgICAgY2FzZSBUQUtfTUVUQURBVEFfRU5DT0RFUjoKKyAgICAgICAgICAgIGlmIChzaXplIDw9IDMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIGJ1ZmZlciA9IGF2X21hbGxvYyhzaXplIC0gMyArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgaWYgKCFidWZmZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG1lbXNldChidWZmZXIgKyBzaXplIC0gMywgMCwgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICAgICAgICAgIGZmaW9faW5pdF9jaGVja3N1bShwYiwgdGFrX2NoZWNrX2NyYywgMHhDRTA0QjdVKTsKKyAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIGJ1ZmZlciwgc2l6ZSAtIDMpICE9IHNpemUgLSAzKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmZmlvX2dldF9jaGVja3N1bShzLT5wYikgIT0gYXZpb19yYjI0KHBiKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICIlZCBtZXRhZGF0YSBibG9jayBDUkMgZXJyb3IuXG4iLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+ZXJyb3JfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluaXRfZ2V0X2JpdHM4KCZnYiwgYnVmZmVyLCBzaXplIC0gMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQUtfTUVUQURBVEFfTUQ1OiB7CisgICAgICAgICAgICB1aW50OF90IG1kNVsxNl07CisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgaWYgKHNpemUgIT0gMTkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBmZmlvX2luaXRfY2hlY2tzdW0ocGIsIHRha19jaGVja19jcmMsIDB4Q0UwNEI3VSk7CisgICAgICAgICAgICBhdmlvX3JlYWQocGIsIG1kNSwgMTYpOworICAgICAgICAgICAgaWYgKGZmaW9fZ2V0X2NoZWNrc3VtKHMtPnBiKSAhPSBhdmlvX3JiMjQocGIpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk1ENSBtZXRhZGF0YSBibG9jayBDUkMgZXJyb3IuXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+ZXJyb3JfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiTUQ1PSIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiJTAyeCIsIG1kNVtpXSk7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUQUtfTUVUQURBVEFfRU5EOiB7CisgICAgICAgICAgICBpbnQ2NF90IGN1cnBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICAgICAgICAgIGlmIChwYi0+c2Vla2FibGUpIHsKKyAgICAgICAgICAgICAgICBmZl9hcGVfcGFyc2VfdGFnKHMpOworICAgICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgY3VycG9zLCBTRUVLX1NFVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRjLT5kYXRhX2VuZCArPSBjdXJwb3M7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZSA9PSBUQUtfTUVUQURBVEFfU1RSRUFNSU5GTykgeworICAgICAgICAgICAgVEFLU3RyZWFtSW5mbyB0aTsKKworICAgICAgICAgICAgYXZwcml2X3Rha19wYXJzZV9zdHJlYW1pbmZvKCZnYiwgJnRpKTsKKyAgICAgICAgICAgIGlmICh0aS5zYW1wbGVzID4gMCkKKyAgICAgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSB0aS5zYW1wbGVzOworICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSB0aS5icHM7CisgICAgICAgICAgICBpZiAodGkuY2hfbGF5b3V0KQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSB0aS5jaF9sYXlvdXQ7CisgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgICAgICAgICA9IHRpLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgICAgICAgPSB0aS5jaGFubmVsczsKKyAgICAgICAgICAgIHN0LT5zdGFydF90aW1lICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICAgICAgICAgICAgID0gYnVmZmVyOworICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAgICAgICAgPSBzaXplIC0gMzsKKyAgICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFRBS19NRVRBREFUQV9MQVNUX0ZSQU1FKSB7CisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAxMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHRjLT5tbGFzdF9mcmFtZSA9IDE7CisgICAgICAgICAgICB0Yy0+ZGF0YV9lbmQgICAgPSBnZXRfYml0czY0KCZnYiwgVEFLX0xBU1RfRlJBTUVfUE9TX0JJVFMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzKCZnYiwgVEFLX0xBU1RfRlJBTUVfU0laRV9CSVRTKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZidWZmZXIpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVEFLX01FVEFEQVRBX0VOQ09ERVIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgImVuY29kZXIgdmVyc2lvbjogJTBYXG4iLAorICAgICAgICAgICAgICAgICAgIGdldF9iaXRzX2xvbmcoJmdiLCBUQUtfRU5DT0RFUl9WRVJTSU9OX0JJVFMpKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1JfRU9GOworfQorCitzdGF0aWMgaW50IHJhd19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgVEFLRGVtdXhDb250ZXh0ICp0YyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHRjLT5tbGFzdF9mcmFtZSkgeworICAgICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICAgICAgaW50NjRfdCBzaXplLCBsZWZ0OworCisgICAgICAgIGxlZnQgPSB0Yy0+ZGF0YV9lbmQgLSBhdmlvX3RlbGwocGIpOworICAgICAgICBzaXplID0gRkZNSU4obGVmdCwgMTAyNCk7CisgICAgICAgIGlmIChzaXplIDw9IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBzaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBmZl9yYXdfcmVhZF9wYXJ0aWFsX3BhY2tldChzLCBwa3QpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfdGFrX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInRhayIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBUQUsiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVEFLRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB0YWtfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gdGFrX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJhd19yZWFkX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5leHRlbnNpb25zICAgICA9ICJ0YWsiLAorICAgIC5yYXdfY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1RBSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdGNwLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhYmM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC90Y3AuYwpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIFRDUCBwcm90b2NvbAorICogQ29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKworI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibmV0d29yay5oIgorI2luY2x1ZGUgIm9zX3N1cHBvcnQuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKyNpZiBIQVZFX1BPTExfSAorI2luY2x1ZGUgPHBvbGwuaD4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBUQ1BDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgZmQ7CisgICAgaW50IGxpc3RlbjsKKyAgICBpbnQgb3Blbl90aW1lb3V0OworICAgIGludCByd190aW1lb3V0OworICAgIGludCBsaXN0ZW5fdGltZW91dDsKK30gVENQQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVENQQ29udGV4dCwgeCkKKyNkZWZpbmUgRCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorI2RlZmluZSBFIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImxpc3RlbiIsICAgICAgICAgICJMaXN0ZW4gZm9yIGluY29taW5nIGNvbm5lY3Rpb25zIiwgIE9GRlNFVChsaXN0ZW4pLCAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAgICAgMCwgICAgICAgMSwgICAgICAgLmZsYWdzID0gRHxFIH0sCisgICAgeyAidGltZW91dCIsICAgICAic2V0IHRpbWVvdXQgKGluIG1pY3Jvc2Vjb25kcykgb2Ygc29ja2V0IEkvTyBvcGVyYXRpb25zIiwgT0ZGU0VUKHJ3X3RpbWVvdXQpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSB9LCAgICAgICAgIC0xLCBJTlRfTUFYLCAuZmxhZ3MgPSBEfEUgfSwKKyAgICB7ICJsaXN0ZW5fdGltZW91dCIsICAiQ29ubmVjdGlvbiBhd2FpdGluZyB0aW1lb3V0IiwgICAgICBPRkZTRVQobGlzdGVuX3RpbWVvdXQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sICAgICAgICAgLTEsIElOVF9NQVgsIC5mbGFncyA9IER8RSB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB0Y3BfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAidGNwIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKKy8qIHJldHVybiBub24gemVybyBpZiBlcnJvciAqLworc3RhdGljIGludCB0Y3Bfb3BlbihVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmksIGludCBmbGFncykKK3sKKyAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMgPSB7IDAgfSwgKmFpLCAqY3VyX2FpOworICAgIGludCBwb3J0LCBmZCA9IC0xOworICAgIFRDUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIGludCByZXQ7CisgICAgY2hhciBob3N0bmFtZVsxMDI0XSxwcm90b1sxMDI0XSxwYXRoWzEwMjRdOworICAgIGNoYXIgcG9ydHN0clsxMF07CisgICAgcy0+b3Blbl90aW1lb3V0ID0gNTAwMDAwMDsKKworICAgIGF2X3VybF9zcGxpdChwcm90bywgc2l6ZW9mKHByb3RvKSwgTlVMTCwgMCwgaG9zdG5hbWUsIHNpemVvZihob3N0bmFtZSksCisgICAgICAgICZwb3J0LCBwYXRoLCBzaXplb2YocGF0aCksIHVyaSk7CisgICAgaWYgKHN0cmNtcChwcm90bywgInRjcCIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGlmIChwb3J0IDw9IDAgfHwgcG9ydCA+PSA2NTUzNikgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiUG9ydCBtaXNzaW5nIGluIHVyaVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHAgPSBzdHJjaHIodXJpLCAnPycpOworICAgIGlmIChwKSB7CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJsaXN0ZW4iLCBwKSkgeworICAgICAgICAgICAgY2hhciAqZW5kcHRyID0gTlVMTDsKKyAgICAgICAgICAgIHMtPmxpc3RlbiA9IHN0cnRvbChidWYsICZlbmRwdHIsIDEwKTsKKyAgICAgICAgICAgIC8qIGFzc3VtZSBpZiBubyBkaWdpdHMgd2VyZSBmb3VuZCBpdCBpcyBhIHJlcXVlc3QgdG8gZW5hYmxlIGl0ICovCisgICAgICAgICAgICBpZiAoYnVmID09IGVuZHB0cikKKyAgICAgICAgICAgICAgICBzLT5saXN0ZW4gPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0aW1lb3V0IiwgcCkpIHsKKyAgICAgICAgICAgIHMtPnJ3X3RpbWVvdXQgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImxpc3Rlbl90aW1lb3V0IiwgcCkpIHsKKyAgICAgICAgICAgIHMtPmxpc3Rlbl90aW1lb3V0ID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5yd190aW1lb3V0ID49IDApIHsKKyAgICAgICAgcy0+b3Blbl90aW1lb3V0ID0KKyAgICAgICAgaC0+cndfdGltZW91dCAgID0gcy0+cndfdGltZW91dDsKKyAgICB9CisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOworICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgICAgc25wcmludGYocG9ydHN0ciwgc2l6ZW9mKHBvcnRzdHIpLCAiJWQiLCBwb3J0KTsKKyAgICBpZiAocy0+bGlzdGVuKQorICAgICAgICBoaW50cy5haV9mbGFncyB8PSBBSV9QQVNTSVZFOworICAgIGlmICghaG9zdG5hbWVbMF0pCisgICAgICAgIHJldCA9IGdldGFkZHJpbmZvKE5VTEwsIHBvcnRzdHIsICZoaW50cywgJmFpKTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IGdldGFkZHJpbmZvKGhvc3RuYW1lLCBwb3J0c3RyLCAmaGludHMsICZhaSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZXNvbHZlIGhvc3RuYW1lICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGhvc3RuYW1lLCBnYWlfc3RyZXJyb3IocmV0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgY3VyX2FpID0gYWk7CisKKyByZXN0YXJ0OgorICAgIGZkID0gZmZfc29ja2V0KGN1cl9haS0+YWlfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgIGN1cl9haS0+YWlfc29ja3R5cGUsCisgICAgICAgICAgICAgICAgICAgY3VyX2FpLT5haV9wcm90b2NvbCk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXQgPSBmZl9uZXRlcnJubygpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHMtPmxpc3RlbikgeworICAgICAgICBpZiAoKGZkID0gZmZfbGlzdGVuX2JpbmQoZmQsIGN1cl9haS0+YWlfYWRkciwgY3VyX2FpLT5haV9hZGRybGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGlzdGVuX3RpbWVvdXQsIGgpKSA8IDApIHsKKyAgICAgICAgICAgIHJldCA9IGZkOworICAgICAgICAgICAgZ290byBmYWlsMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfbGlzdGVuX2Nvbm5lY3QoZmQsIGN1cl9haS0+YWlfYWRkciwgY3VyX2FpLT5haV9hZGRybGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm9wZW5fdGltZW91dCAvIDEwMDAsIGgsICEhY3VyX2FpLT5haV9uZXh0KSkgPCAwKSB7CisKKyAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FWElUKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgaC0+aXNfc3RyZWFtZWQgPSAxOworICAgIHMtPmZkID0gZmQ7CisgICAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgICByZXR1cm4gMDsKKworIGZhaWw6CisgICAgaWYgKGN1cl9haS0+YWlfbmV4dCkgeworICAgICAgICAvKiBSZXRyeSB3aXRoIHRoZSBuZXh0IHNvY2thZGRyICovCisgICAgICAgIGN1cl9haSA9IGN1cl9haS0+YWlfbmV4dDsKKyAgICAgICAgaWYgKGZkID49IDApCisgICAgICAgICAgICBjbG9zZXNvY2tldChmZCk7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICB9CisgZmFpbDE6CisgICAgaWYgKGZkID49IDApCisgICAgICAgIGNsb3Nlc29ja2V0KGZkKTsKKyAgICBmcmVlYWRkcmluZm8oYWkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3JlYWQoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBUQ1BDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIShoLT5mbGFncyAmIEFWSU9fRkxBR19OT05CTE9DSykpIHsKKyAgICAgICAgcmV0ID0gZmZfbmV0d29ya193YWl0X2ZkX3RpbWVvdXQocy0+ZmQsIDAsIGgtPnJ3X3RpbWVvdXQsICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2spOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0ID0gcmVjdihzLT5mZCwgYnVmLCBzaXplLCAwKTsKKyAgICByZXR1cm4gcmV0IDwgMCA/IGZmX25ldGVycm5vKCkgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgVENQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCEoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfTk9OQkxPQ0spKSB7CisgICAgICAgIHJldCA9IGZmX25ldHdvcmtfd2FpdF9mZF90aW1lb3V0KHMtPmZkLCAxLCBoLT5yd190aW1lb3V0LCAmaC0+aW50ZXJydXB0X2NhbGxiYWNrKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldCA9IHNlbmQocy0+ZmQsIGJ1Ziwgc2l6ZSwgTVNHX05PU0lHTkFMKTsKKyAgICByZXR1cm4gcmV0IDwgMCA/IGZmX25ldGVycm5vKCkgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3NodXRkb3duKFVSTENvbnRleHQgKmgsIGludCBmbGFncykKK3sKKyAgICBUQ1BDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGludCBob3c7CisKKyAgICBpZiAoZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUgJiYgZmxhZ3MgJiBBVklPX0ZMQUdfUkVBRCkgeworICAgICAgICBob3cgPSBTSFVUX1JEV1I7CisgICAgfSBlbHNlIGlmIChmbGFncyAmIEFWSU9fRkxBR19XUklURSkgeworICAgICAgICBob3cgPSBTSFVUX1dSOworICAgIH0gZWxzZSB7CisgICAgICAgIGhvdyA9IFNIVVRfUkQ7CisgICAgfQorCisgICAgcmV0dXJuIHNodXRkb3duKHMtPmZkLCBob3cpOworfQorCitzdGF0aWMgaW50IHRjcF9jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIFRDUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgY2xvc2Vzb2NrZXQocy0+ZmQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjcF9nZXRfZmlsZV9oYW5kbGUoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBUQ1BDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIHJldHVybiBzLT5mZDsKK30KKworVVJMUHJvdG9jb2wgZmZfdGNwX3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgID0gInRjcCIsCisgICAgLnVybF9vcGVuICAgICAgICAgICAgPSB0Y3Bfb3BlbiwKKyAgICAudXJsX3JlYWQgICAgICAgICAgICA9IHRjcF9yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICAgICAgID0gdGNwX3dyaXRlLAorICAgIC51cmxfY2xvc2UgICAgICAgICAgID0gdGNwX2Nsb3NlLAorICAgIC51cmxfZ2V0X2ZpbGVfaGFuZGxlID0gdGNwX2dldF9maWxlX2hhbmRsZSwKKyAgICAudXJsX3NodXRkb3duICAgICAgICA9IHRjcF9zaHV0ZG93biwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICA9IHNpemVvZihUQ1BDb250ZXh0KSwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgICA9IFVSTF9QUk9UT0NPTF9GTEFHX05FVFdPUkssCisgICAgLnByaXZfZGF0YV9jbGFzcyAgICAgPSAmdGNwX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC90ZWRjYXB0aW9uc2RlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3RlZGNhcHRpb25zZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwNjNmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC90ZWRjYXB0aW9uc2RlYy5jCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogVEVEIFRhbGtzIGNhcHRpb25zIGZvcm1hdCBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdWJ0aXRsZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIGludDY0X3Qgc3RhcnRfdGltZTsKKyAgICBGRkRlbXV4U3VidGl0bGVzUXVldWUgc3ViczsKK30gVEVEQ2FwdGlvbnNEZW11eGVyOworCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdGVkY2FwdGlvbnNfb3B0aW9uc1tdID0geworICAgIHsgInN0YXJ0X3RpbWUiLCAic2V0IHRoZSBzdGFydCB0aW1lIChvZmZzZXQpIG9mIHRoZSBzdWJ0aXRsZXMsIGluIG1zIiwKKyAgICAgIG9mZnNldG9mKFRFRENhcHRpb25zRGVtdXhlciwgc3RhcnRfdGltZSksIEZGX09QVF9UWVBFX0lOVDY0LAorICAgICAgeyAuaTY0ID0gMTUwMDAgfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsCisgICAgICBBVl9PUFRfRkxBR19TVUJUSVRMRV9QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB0ZWRjYXB0aW9uc19kZW11eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gInRlZGNhcHRpb25zX2RlbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSB0ZWRjYXB0aW9uc19vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworI2RlZmluZSBCRVRXRUVOKGEsIGFtaW4sIGFtYXgpICgodW5zaWduZWQpKChhKSAtIChhbWluKSkgPD0gKGFtYXgpIC0gKGFtaW4pKQorCisjZGVmaW5lIEhFWF9ESUdJVF9URVNUKGMpIChCRVRXRUVOKGMsICcwJywgJzknKSB8fCBCRVRXRUVOKChjKSB8IDMyLCAnYScsICd6JykpCisjZGVmaW5lIEhFWF9ESUdJVF9WQUwoYykgKChjKSA8PSAnOScgPyAoYykgLSAnMCcgOiAoKGMpIHwgMzIpIC0gJ2EnICsgMTApCisjZGVmaW5lIEVSUl9DT0RFKGMpIChjIDwgMCA/IGMgOiBBVkVSUk9SX0lOVkFMSUREQVRBKQorCitzdGF0aWMgdm9pZCBhdl9icHJpbnRfdXRmOChBVkJQcmludCAqYnAsIHVuc2lnbmVkIGMpCit7CisgICAgaW50IGJ5dGVzLCBpOworCisgICAgaWYgKGMgPD0gMHg3RikgeworICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnAsIGMsIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJ5dGVzID0gKGF2X2xvZzIoYykgLSAyKSAvIDU7CisgICAgYXZfYnByaW50X2NoYXJzKGJwLCAoYyA+PiAoYnl0ZXMgKiA2KSkgfCAoKDB4RkY4MCA+PiBieXRlcykgJiAweEZGKSwgMSk7CisgICAgZm9yIChpID0gYnl0ZXMgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgYXZfYnByaW50X2NoYXJzKGJwLCAoKGMgPj4gKGkgKiA2KSkgJiAweDNGKSB8IDB4ODAsIDEpOworfQorCitzdGF0aWMgdm9pZCBuZXh0X2J5dGUoQVZJT0NvbnRleHQgKnBiLCBpbnQgKmN1cl9ieXRlKQoreworICAgIHVpbnQ4X3QgYjsKKyAgICBpbnQgcmV0ID0gYXZpb19yZWFkKHBiLCAmYiwgMSk7CisgICAgKmN1cl9ieXRlID0gcmV0ID4gMCA/IGIgOiByZXQgPT0gMCA/IEFWRVJST1JfRU9GIDogcmV0OworfQorCitzdGF0aWMgdm9pZCBza2lwX3NwYWNlcyhBVklPQ29udGV4dCAqcGIsIGludCAqY3VyX2J5dGUpCit7CisgICAgd2hpbGUgKCpjdXJfYnl0ZSA9PSAnICcgIHx8ICpjdXJfYnl0ZSA9PSAnXHQnIHx8CisgICAgICAgICAgICpjdXJfYnl0ZSA9PSAnXG4nIHx8ICpjdXJfYnl0ZSA9PSAnXHInKQorICAgICAgICBuZXh0X2J5dGUocGIsIGN1cl9ieXRlKTsKK30KKworc3RhdGljIGludCBleHBlY3RfYnl0ZShBVklPQ29udGV4dCAqcGIsIGludCAqY3VyX2J5dGUsIHVpbnQ4X3QgYykKK3sKKyAgICBza2lwX3NwYWNlcyhwYiwgY3VyX2J5dGUpOworICAgIGlmICgqY3VyX2J5dGUgIT0gYykKKyAgICAgICAgcmV0dXJuIEVSUl9DT0RFKCpjdXJfYnl0ZSk7CisgICAgbmV4dF9ieXRlKHBiLCBjdXJfYnl0ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RyaW5nKEFWSU9Db250ZXh0ICpwYiwgaW50ICpjdXJfYnl0ZSwgQVZCUHJpbnQgKmJwLCBpbnQgZnVsbCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgYXZfYnByaW50X2luaXQoYnAsIDAsIGZ1bGwgPyAtMSA6IDEpOworICAgIHJldCA9IGV4cGVjdF9ieXRlKHBiLCBjdXJfYnl0ZSwgJyInKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIHdoaWxlICgqY3VyX2J5dGUgPiAwICYmICpjdXJfYnl0ZSAhPSAnIicpIHsKKyAgICAgICAgaWYgKCpjdXJfYnl0ZSA9PSAnXFwnKSB7CisgICAgICAgICAgICBuZXh0X2J5dGUocGIsIGN1cl9ieXRlKTsKKyAgICAgICAgICAgIGlmICgqY3VyX2J5dGUgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCpjdXJfYnl0ZSB8IDMyKSA9PSAndScpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaHIgPSAwLCBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dF9ieXRlKHBiLCBjdXJfYnl0ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghSEVYX0RJR0lUX1RFU1QoKmN1cl9ieXRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gRVJSX0NPREUoKmN1cl9ieXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaHIgPSBjaHIgKiAxNiArIEhFWF9ESUdJVF9WQUwoKmN1cl9ieXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfYnByaW50X3V0ZjgoYnAsIGNocik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhicCwgKmN1cl9ieXRlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhicCwgKmN1cl9ieXRlLCAxKTsKKyAgICAgICAgfQorICAgICAgICBuZXh0X2J5dGUocGIsIGN1cl9ieXRlKTsKKyAgICB9CisgICAgcmV0ID0gZXhwZWN0X2J5dGUocGIsIGN1cl9ieXRlLCAnIicpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKGZ1bGwgJiYgIWF2X2JwcmludF9pc19jb21wbGV0ZShicCkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2JwcmludF9maW5hbGl6ZShicCwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwYXJzZV9sYWJlbChBVklPQ29udGV4dCAqcGIsIGludCAqY3VyX2J5dGUsIEFWQlByaW50ICpicCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gcGFyc2Vfc3RyaW5nKHBiLCBjdXJfYnl0ZSwgYnAsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldCA9IGV4cGVjdF9ieXRlKHBiLCBjdXJfYnl0ZSwgJzonKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9ib29sZWFuKEFWSU9Db250ZXh0ICpwYiwgaW50ICpjdXJfYnl0ZSwgaW50ICpyZXN1bHQpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0W10gPSB7ICJmYWxzZSIsICJ0cnVlIiB9OworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaW50IGk7CisKKyAgICBza2lwX3NwYWNlcyhwYiwgY3VyX2J5dGUpOworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgcCA9IHRleHRbaV07CisgICAgICAgIGlmICgqY3VyX2J5dGUgIT0gKnApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yICg7ICpwOyBwKyssIG5leHRfYnl0ZShwYiwgY3VyX2J5dGUpKQorICAgICAgICAgICAgaWYgKCpjdXJfYnl0ZSAhPSAqcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKEJFVFdFRU4oKmN1cl9ieXRlIHwgMzIsICdhJywgJ3onKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAqcmVzdWx0ID0gaTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworfQorCitzdGF0aWMgaW50IHBhcnNlX2ludChBVklPQ29udGV4dCAqcGIsIGludCAqY3VyX2J5dGUsIGludDY0X3QgKnJlc3VsdCkKK3sKKyAgICBpbnQ2NF90IHZhbCA9IDA7CisKKyAgICBza2lwX3NwYWNlcyhwYiwgY3VyX2J5dGUpOworICAgIGlmICgodW5zaWduZWQpKmN1cl9ieXRlIC0gJzAnID4gOSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgd2hpbGUgKEJFVFdFRU4oKmN1cl9ieXRlLCAnMCcsICc5JykpIHsKKyAgICAgICAgdmFsID0gdmFsICogMTAgKyAoKmN1cl9ieXRlIC0gJzAnKTsKKyAgICAgICAgbmV4dF9ieXRlKHBiLCBjdXJfYnl0ZSk7CisgICAgfQorICAgICpyZXN1bHQgPSB2YWw7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZmlsZShBVklPQ29udGV4dCAqcGIsIEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSAqc3VicykKK3sKKyAgICBpbnQgcmV0LCBjdXJfYnl0ZSwgc3RhcnRfb2ZfcGFyOworICAgIEFWQlByaW50IGxhYmVsLCBjb250ZW50OworICAgIGludDY0X3QgcG9zLCBzdGFydCwgZHVyYXRpb247CisgICAgQVZQYWNrZXQgKnBrdDsKKworICAgIG5leHRfYnl0ZShwYiwgJmN1cl9ieXRlKTsKKyAgICByZXQgPSBleHBlY3RfYnl0ZShwYiwgJmN1cl9ieXRlLCAneycpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICByZXQgPSBwYXJzZV9sYWJlbChwYiwgJmN1cl9ieXRlLCAmbGFiZWwpOworICAgIGlmIChyZXQgPCAwIHx8IHN0cmNtcChsYWJlbC5zdHIsICJjYXB0aW9ucyIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICByZXQgPSBleHBlY3RfYnl0ZShwYiwgJmN1cl9ieXRlLCAnWycpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBjb250ZW50LnNpemUgPSAwOworICAgICAgICBzdGFydCA9IGR1cmF0aW9uID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHJldCA9IGV4cGVjdF9ieXRlKHBiLCAmY3VyX2J5dGUsICd7Jyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcG9zID0gYXZpb190ZWxsKHBiKSAtIDE7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICByZXQgPSBwYXJzZV9sYWJlbChwYiwgJmN1cl9ieXRlLCAmbGFiZWwpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGxhYmVsLnN0ciwgInN0YXJ0T2ZQYXJhZ3JhcGgiKSkgeworICAgICAgICAgICAgICAgIHJldCA9IHBhcnNlX2Jvb2xlYW4ocGIsICZjdXJfYnl0ZSwgJnN0YXJ0X29mX3Bhcik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobGFiZWwuc3RyLCAiY29udGVudCIpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcGFyc2Vfc3RyaW5nKHBiLCAmY3VyX2J5dGUsICZjb250ZW50LCAxKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChsYWJlbC5zdHIsICJzdGFydFRpbWUiKSkgeworICAgICAgICAgICAgICAgIHJldCA9IHBhcnNlX2ludChwYiwgJmN1cl9ieXRlLCAmc3RhcnQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGxhYmVsLnN0ciwgImR1cmF0aW9uIikpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBwYXJzZV9pbnQocGIsICZjdXJfYnl0ZSwgJmR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBza2lwX3NwYWNlcyhwYiwgJmN1cl9ieXRlKTsKKyAgICAgICAgICAgIGlmIChjdXJfYnl0ZSAhPSAnLCcpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBuZXh0X2J5dGUocGIsICZjdXJfYnl0ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gZXhwZWN0X2J5dGUocGIsICZjdXJfYnl0ZSwgJ30nKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmICghY29udGVudC5zaXplIHx8IHN0YXJ0ID09IEFWX05PUFRTX1ZBTFVFIHx8CisgICAgICAgICAgICBkdXJhdGlvbiA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBwa3QgPSBmZl9zdWJ0aXRsZXNfcXVldWVfaW5zZXJ0KHN1YnMsIGNvbnRlbnQuc3RyLCBjb250ZW50LmxlbiwgMCk7CisgICAgICAgIGlmICghcGt0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcGt0LT5wb3MgICAgICA9IHBvczsKKyAgICAgICAgcGt0LT5wdHMgICAgICA9IHN0YXJ0OworICAgICAgICBwa3QtPmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIGF2X2JwcmludF9maW5hbGl6ZSgmY29udGVudCwgTlVMTCk7CisKKyAgICAgICAgc2tpcF9zcGFjZXMocGIsICZjdXJfYnl0ZSk7CisgICAgICAgIGlmIChjdXJfYnl0ZSAhPSAnLCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbmV4dF9ieXRlKHBiLCAmY3VyX2J5dGUpOworICAgIH0KKyAgICByZXQgPSBleHBlY3RfYnl0ZShwYiwgJmN1cl9ieXRlLCAnXScpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldCA9IGV4cGVjdF9ieXRlKHBiLCAmY3VyX2J5dGUsICd9Jyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgc2tpcF9zcGFjZXMocGIsICZjdXJfYnl0ZSk7CisgICAgaWYgKGN1cl9ieXRlICE9IEFWRVJST1JfRU9GKQorICAgICAgICByZXR1cm4gRVJSX0NPREUoY3VyX2J5dGUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdGVkY2FwdGlvbnNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmYpCit7CisgICAgVEVEQ2FwdGlvbnNEZW11eGVyICp0YyA9IGF2Zi0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgcmV0LCBpOworICAgIEFWUGFja2V0ICpsYXN0OworCisgICAgcmV0ID0gcGFyc2VfZmlsZShhdmYtPnBiLCAmdGMtPnN1YnMpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9JTlZBTElEREFUQSkKKyAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIlN5bnRheCBlcnJvciBuZWFyIG9mZnNldCAlIlBSSWQ2NCIuXG4iLAorICAgICAgICAgICAgICAgICAgIGF2aW9fdGVsbChhdmYtPnBiKSk7CisgICAgICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9jbGVhbigmdGMtPnN1YnMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfZmluYWxpemUoJnRjLT5zdWJzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGMtPnN1YnMubmJfc3ViczsgaSsrKQorICAgICAgICB0Yy0+c3Vicy5zdWJzW2ldLnB0cyArPSB0Yy0+c3RhcnRfdGltZTsKKworICAgIGxhc3QgPSAmdGMtPnN1YnMuc3Vic1t0Yy0+c3Vicy5uYl9zdWJzIC0gMV07CisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2ZiwgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9URVhUOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwKTsKKyAgICBzdC0+cHJvYmVfcGFja2V0cyA9IDA7CisgICAgc3QtPnN0YXJ0X3RpbWUgICAgPSAwOworICAgIHN0LT5kdXJhdGlvbiAgICAgID0gbGFzdC0+cHRzICsgbGFzdC0+ZHVyYXRpb247CisgICAgc3QtPmN1cl9kdHMgICAgICAgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVkY2FwdGlvbnNfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmYsIEFWUGFja2V0ICpwYWNrZXQpCit7CisgICAgVEVEQ2FwdGlvbnNEZW11eGVyICp0YyA9IGF2Zi0+cHJpdl9kYXRhOworCisgICAgcmV0dXJuIGZmX3N1YnRpdGxlc19xdWV1ZV9yZWFkX3BhY2tldCgmdGMtPnN1YnMsIHBhY2tldCk7Cit9CisKK3N0YXRpYyBpbnQgdGVkY2FwdGlvbnNfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKmF2ZikKK3sKKyAgICBURURDYXB0aW9uc0RlbXV4ZXIgKnRjID0gYXZmLT5wcml2X2RhdGE7CisKKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfY2xlYW4oJnRjLT5zdWJzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHRlZGNhcHRpb25zX3JlYWRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZ3NbXSA9IHsKKyAgICAgICAgIlwiY2FwdGlvbnNcIiIsICJcImR1cmF0aW9uXCIiLCAiXCJjb250ZW50XCIiLAorICAgICAgICAiXCJzdGFydE9mUGFyYWdyYXBoXCIiLCAiXCJzdGFydFRpbWVcIiIsCisgICAgfTsKKyAgICB1bnNpZ25lZCBpLCBjb3VudCA9IDA7CisgICAgY29uc3QgY2hhciAqdDsKKworICAgIGlmIChwLT5idWZbc3Ryc3BuKHAtPmJ1ZiwgIiBcdFxyXG4iKV0gIT0gJ3snKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVModGFncyk7IGkrKykgeworICAgICAgICBpZiAoISh0ID0gc3Ryc3RyKHAtPmJ1ZiwgdGFnc1tpXSkpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHQgKz0gc3RybGVuKHRhZ3NbaV0pOworICAgICAgICB0ICs9IHN0cnNwbih0LCAiIFx0XHJcbiIpOworICAgICAgICBpZiAoKnQgPT0gJzonKQorICAgICAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50ID09IEZGX0FSUkFZX0VMRU1TKHRhZ3MpID8gQVZQUk9CRV9TQ09SRV9NQVggOgorICAgICAgICAgICBjb3VudCAgICAgICAgICAgICAgICAgICAgICAgICA/IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIDogMDsKK30KKworc3RhdGljIGludCB0ZWRjYXB0aW9uc19yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICphdmYsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgVEVEQ2FwdGlvbnNEZW11eGVyICp0YyA9IGF2Zi0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl9zdWJ0aXRsZXNfcXVldWVfc2VlaygmdGMtPnN1YnMsIGF2Ziwgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdHMsIHRzLCBtYXhfdHMsIGZsYWdzKTsKK30KKworQVZJbnB1dEZvcm1hdCBmZl90ZWRjYXB0aW9uc19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ0ZWRjYXB0aW9ucyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRFRCBUYWxrcyBjYXB0aW9ucyIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihURURDYXB0aW9uc0RlbXV4ZXIpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ0ZWRjYXB0aW9uc19kZW11eGVyX2NsYXNzLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHRlZGNhcHRpb25zX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHRlZGNhcHRpb25zX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHRlZGNhcHRpb25zX3JlYWRfY2xvc2UsCisgICAgLnJlYWRfcHJvYmUgICAgID0gdGVkY2FwdGlvbnNfcmVhZF9wcm9iZSwKKyAgICAucmVhZF9zZWVrMiAgICAgPSB0ZWRjYXB0aW9uc19yZWFkX3NlZWssCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3RlZS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3RlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MWY5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvdGVlLmMKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBUZWUgcHNldWRvLW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisKKyNkZWZpbmUgTUFYX1NMQVZFUyAxNgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQVZGb3JtYXRDb250ZXh0ICphdmY7CisgICAgQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICoqYnNmczsgLy8vPCBiaXRzdHJlYW0gZmlsdGVycyBwZXIgc3RyZWFtCisKKyAgICAvKiogbWFwIGZyb20gaW5wdXQgdG8gb3V0cHV0IHN0cmVhbXMgaW5kZXhlcywKKyAgICAgKiBkaXNhYmxlZCBvdXRwdXQgc3RyZWFtcyBhcmUgc2V0IHRvIC0xICovCisgICAgaW50ICpzdHJlYW1fbWFwOworfSBUZWVTbGF2ZTsKKwordHlwZWRlZiBzdHJ1Y3QgVGVlQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgdW5zaWduZWQgbmJfc2xhdmVzOworICAgIFRlZVNsYXZlIHNsYXZlc1tNQVhfU0xBVkVTXTsKK30gVGVlQ29udGV4dDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsYXZlX2RlbGltICAgICA9ICJ8IjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbGF2ZV9vcHRfb3BlbiAgPSAiWyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2xhdmVfb3B0X2Nsb3NlID0gIl0iOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsYXZlX29wdF9kZWxpbSA9ICI6XSI7IC8qIG11c3QgaGF2ZSB0aGUgY2xvc2UgdG9vICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2xhdmVfYnNmc19zcGVjX3NlcCA9ICIvIjsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgdGVlX211eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlRlZSBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBpbnQgcGFyc2Vfc2xhdmVfb3B0aW9ucyh2b2lkICpsb2csIGNoYXIgKnNsYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMsIGNoYXIgKipmaWxlbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpwOworICAgIGNoYXIgKmtleSwgKnZhbDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFzdHJzcG4oc2xhdmUsIHNsYXZlX29wdF9vcGVuKSkgeworICAgICAgICAqZmlsZW5hbWUgPSBzbGF2ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHAgPSBzbGF2ZSArIDE7CisgICAgaWYgKHN0cnNwbihwLCBzbGF2ZV9vcHRfY2xvc2UpKSB7CisgICAgICAgICpmaWxlbmFtZSA9IChjaGFyICopcCArIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB3aGlsZSAoMSkgeworICAgICAgICByZXQgPSBhdl9vcHRfZ2V0X2tleV92YWx1ZSgmcCwgIj0iLCBzbGF2ZV9vcHRfZGVsaW0sIDAsICZrZXksICZ2YWwpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX0VSUk9SLCAiTm8gb3B0aW9uIGZvdW5kIG5lYXIgXCIlc1wiXG4iLCBwKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBhdl9kaWN0X3NldChvcHRpb25zLCBrZXksIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkgfCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBpZiAoc3Ryc3BuKHAsIHNsYXZlX29wdF9jbG9zZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICAqZmlsZW5hbWUgPSAoY2hhciAqKXAgKyAxOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2RpY3RfZnJlZShvcHRpb25zKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFBhcnNlIGxpc3Qgb2YgYml0c3RyZWFtIGZpbHRlcnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIGZpbHRlcnMKKyAqIHBvaW50ZWQgdG8gYnkgYnNmcy4KKyAqCisgKiBUaGUgbGlzdCBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgZm9ybToKKyAqIEJTRlMgOjo9IEJTRlssQlNGU10KKyAqLworc3RhdGljIGludCBwYXJzZV9ic2ZzKHZvaWQgKmxvZ19jdHgsIGNvbnN0IGNoYXIgKmJzZnNfc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKipic2ZzKQoreworICAgIGNoYXIgKmJzZl9uYW1lLCAqYnVmLCAqZHVwLCAqc2F2ZXB0cjsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmICghKGR1cCA9IGJ1ZiA9IGF2X3N0cmR1cChic2ZzX3NwZWMpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHdoaWxlIChic2ZfbmFtZSA9IGF2X3N0cnRvayhidWYsICIsIiwgJnNhdmVwdHIpKSB7CisgICAgICAgIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmID0gYXZfYml0c3RyZWFtX2ZpbHRlcl9pbml0KGJzZl9uYW1lKTsKKworICAgICAgICBpZiAoIWJzZikgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGluaXRpYWxpemUgYml0c3RyZWFtIGZpbHRlciB3aXRoIG5hbWUgJyVzJywgIgorICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGZpbHRlciBvciBpbnRlcm5hbCBlcnJvciBoYXBwZW5lZFxuIiwKKyAgICAgICAgICAgICAgICAgICBic2ZfbmFtZSk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFwcGVuZCBic2YgY29udGV4dCB0byB0aGUgbGlzdCBvZiBic2YgY29udGV4dHMgKi8KKyAgICAgICAgKmJzZnMgPSBic2Y7CisgICAgICAgIGJzZnMgPSAmYnNmLT5uZXh0OworCisgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgfQorCitlbmQ6CisgICAgYXZfZnJlZShkdXApOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9zbGF2ZShBVkZvcm1hdENvbnRleHQgKmF2ZiwgY2hhciAqc2xhdmUsIFRlZVNsYXZlICp0ZWVfc2xhdmUpCit7CisgICAgaW50IGksIHJldDsKKyAgICBBVkRpY3Rpb25hcnkgKm9wdGlvbnMgPSBOVUxMOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICplbnRyeTsKKyAgICBjaGFyICpmaWxlbmFtZTsKKyAgICBjaGFyICpmb3JtYXQgPSBOVUxMLCAqc2VsZWN0ID0gTlVMTDsKKyAgICBBVkZvcm1hdENvbnRleHQgKmF2ZjIgPSBOVUxMOworICAgIEFWU3RyZWFtICpzdCwgKnN0MjsKKyAgICBpbnQgc3RyZWFtX2NvdW50OworCisgICAgaWYgKChyZXQgPSBwYXJzZV9zbGF2ZV9vcHRpb25zKGF2Ziwgc2xhdmUsICZvcHRpb25zLCAmZmlsZW5hbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyNkZWZpbmUgU1RFQUxfT1BUSU9OKG9wdGlvbiwgZmllbGQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChlbnRyeSA9IGF2X2RpY3RfZ2V0KG9wdGlvbnMsIG9wdGlvbiwgTlVMTCwgMCkpKSB7ICAgICAgICAgIFwKKyAgICAgICAgICAgIGZpZWxkID0gZW50cnktPnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVudHJ5LT52YWx1ZSA9IE5VTEw7IC8qIHByZXZlbnQgaXQgZnJvbSBiZWluZyBmcmVlZCAqLyAgICAgIFwKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRpb25zLCBvcHRpb24sIE5VTEwsIDApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgU1RFQUxfT1BUSU9OKCJmIiwgZm9ybWF0KTsKKyAgICBTVEVBTF9PUFRJT04oInNlbGVjdCIsIHNlbGVjdCk7CisKKyAgICByZXQgPSBhdmZvcm1hdF9hbGxvY19vdXRwdXRfY29udGV4dDIoJmF2ZjIsIE5VTEwsIGZvcm1hdCwgZmlsZW5hbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKyAgICBhdl9kaWN0X2NvcHkoJmF2ZjItPm1ldGFkYXRhLCBhdmYtPm1ldGFkYXRhLCAwKTsKKworICAgIHRlZV9zbGF2ZS0+c3RyZWFtX21hcCA9IGF2X2NhbGxvYyhhdmYtPm5iX3N0cmVhbXMsIHNpemVvZigqdGVlX3NsYXZlLT5zdHJlYW1fbWFwKSk7CisgICAgaWYgKCF0ZWVfc2xhdmUtPnN0cmVhbV9tYXApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBzdHJlYW1fY291bnQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBhdmYtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzdCA9IGF2Zi0+c3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKHNlbGVjdCkgeworICAgICAgICAgICAgcmV0ID0gYXZmb3JtYXRfbWF0Y2hfc3RyZWFtX3NwZWNpZmllcihhdmYsIGF2Zi0+c3RyZWFtc1tpXSwgc2VsZWN0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBzdHJlYW0gc3BlY2lmaWVyICclcycgZm9yIG91dHB1dCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QsIHNsYXZlKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7IC8qIG5vIG1hdGNoICovCisgICAgICAgICAgICAgICAgdGVlX3NsYXZlLT5zdHJlYW1fbWFwW2ldID0gLTE7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGVlX3NsYXZlLT5zdHJlYW1fbWFwW2ldID0gc3RyZWFtX2NvdW50Kys7CisKKyAgICAgICAgaWYgKCEoc3QyID0gYXZmb3JtYXRfbmV3X3N0cmVhbShhdmYyLCBOVUxMKSkpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIHN0Mi0+aWQgPSBzdC0+aWQ7CisgICAgICAgIHN0Mi0+cl9mcmFtZV9yYXRlICAgICAgICA9IHN0LT5yX2ZyYW1lX3JhdGU7CisgICAgICAgIHN0Mi0+dGltZV9iYXNlICAgICAgICAgICA9IHN0LT50aW1lX2Jhc2U7CisgICAgICAgIHN0Mi0+c3RhcnRfdGltZSAgICAgICAgICA9IHN0LT5zdGFydF90aW1lOworICAgICAgICBzdDItPmR1cmF0aW9uICAgICAgICAgICAgPSBzdC0+ZHVyYXRpb247CisgICAgICAgIHN0Mi0+bmJfZnJhbWVzICAgICAgICAgICA9IHN0LT5uYl9mcmFtZXM7CisgICAgICAgIHN0Mi0+ZGlzcG9zaXRpb24gICAgICAgICA9IHN0LT5kaXNwb3NpdGlvbjsKKyAgICAgICAgc3QyLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgIHN0Mi0+YXZnX2ZyYW1lX3JhdGUgICAgICA9IHN0LT5hdmdfZnJhbWVfcmF0ZTsKKyAgICAgICAgYXZfZGljdF9jb3B5KCZzdDItPm1ldGFkYXRhLCBzdC0+bWV0YWRhdGEsIDApOworICAgICAgICBpZiAoKHJldCA9IGF2Y29kZWNfY29weV9jb250ZXh0KHN0Mi0+Y29kZWMsIHN0LT5jb2RlYykpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmICghKGF2ZjItPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSkgeworICAgICAgICBpZiAoKHJldCA9IGF2aW9fb3BlbigmYXZmMi0+cGIsIGZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIlNsYXZlICclcyc6IGVycm9yIG9wZW5pbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHNsYXZlLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihhdmYyLCAmb3B0aW9ucykpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJTbGF2ZSAnJXMnOiBlcnJvciB3cml0aW5nIGhlYWRlcjogJXNcbiIsCisgICAgICAgICAgICAgICBzbGF2ZSwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgdGVlX3NsYXZlLT5hdmYgPSBhdmYyOworICAgIHRlZV9zbGF2ZS0+YnNmcyA9IGF2X2NhbGxvYyhhdmYyLT5uYl9zdHJlYW1zLCBzaXplb2YoVGVlU2xhdmUpKTsKKyAgICBpZiAoIXRlZV9zbGF2ZS0+YnNmcykgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGVudHJ5ID0gTlVMTDsKKyAgICB3aGlsZSAoZW50cnkgPSBhdl9kaWN0X2dldChvcHRpb25zLCAiYnNmcyIsIE5VTEwsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqc3BlYyA9IGVudHJ5LT5rZXkgKyBzdHJsZW4oImJzZnMiKTsKKyAgICAgICAgaWYgKCpzcGVjKSB7CisgICAgICAgICAgICBpZiAoc3Ryc3BuKHNwZWMsIHNsYXZlX2JzZnNfc3BlY19zZXApICE9IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJTcGVjaWZpZXIgc2VwYXJhdG9yIGluICclcycgaXMgJyVjJywgYnV0IG9ubHkgY2hhcmFjdGVycyAnJXMnICIKKyAgICAgICAgICAgICAgICAgICAgICAgImFyZSBhbGxvd2VkXG4iLCBlbnRyeS0+a2V5LCAqc3BlYywgc2xhdmVfYnNmc19zcGVjX3NlcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwZWMrKzsgLyogY29uc3VtZSBzZXBhcmF0b3IgKi8KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmYyLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IGF2Zm9ybWF0X21hdGNoX3N0cmVhbV9zcGVjaWZpZXIoYXZmMiwgYXZmMi0+c3RyZWFtc1tpXSwgc3BlYyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgc3RyZWFtIHNwZWNpZmllciAnJXMnIGluIGJzZnMgb3B0aW9uICclcycgZm9yIHNsYXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCAnJXMnXG4iLCBzcGVjLCBlbnRyeS0+a2V5LCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0RFQlVHLCAic3BlYzolcyBic2ZzOiVzIG1hdGNoZXMgc3RyZWFtICVkIG9mIHNsYXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCAnJXMnXG4iLCBzcGVjLCBlbnRyeS0+dmFsdWUsIGksIGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodGVlX3NsYXZlLT5ic2ZzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSBic2ZzIHNwZWNpZmljYXRpb24gYXNzb2NpYXRlZCB0byBzdHJlYW0gJWQgb2Ygc2xhdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCAnJXMnLCBmaWx0ZXJzIHdpbGwgYmUgaWdub3JlZFxuIiwgaSwgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0ID0gcGFyc2VfYnNmcyhhdmYsIGVudHJ5LT52YWx1ZSwgJnRlZV9zbGF2ZS0+YnNmc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgYml0c3RyZWFtIGZpbHRlciBzZXF1ZW5jZSAnJXMnIGFzc29jaWF0ZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbSAlZCBvZiBzbGF2ZSBvdXRwdXQgJyVzJ1xuIiwgZW50cnktPnZhbHVlLCBpLCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRpb25zLCBlbnRyeS0+a2V5LCBOVUxMLCAwKTsKKyAgICB9CisKKyAgICBpZiAob3B0aW9ucykgeworICAgICAgICBlbnRyeSA9IE5VTEw7CisgICAgICAgIHdoaWxlICgoZW50cnkgPSBhdl9kaWN0X2dldChvcHRpb25zLCAiIiwgZW50cnksIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKQorICAgICAgICAgICAgYXZfbG9nKGF2ZjIsIEFWX0xPR19FUlJPUiwgIlVua25vd24gb3B0aW9uICclcydcbiIsIGVudHJ5LT5rZXkpOworICAgICAgICByZXQgPSBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworZW5kOgorICAgIGF2X2ZyZWUoZm9ybWF0KTsKKyAgICBhdl9mcmVlKHNlbGVjdCk7CisgICAgYXZfZGljdF9mcmVlKCZvcHRpb25zKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9zbGF2ZXMoQVZGb3JtYXRDb250ZXh0ICphdmYpCit7CisgICAgVGVlQ29udGV4dCAqdGVlID0gYXZmLT5wcml2X2RhdGE7CisgICAgQVZGb3JtYXRDb250ZXh0ICphdmYyOworICAgIHVuc2lnbmVkIGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGVlLT5uYl9zbGF2ZXM7IGkrKykgeworICAgICAgICBhdmYyID0gdGVlLT5zbGF2ZXNbaV0uYXZmOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBhdmYyLT5uYl9zdHJlYW1zOyBqKyspIHsKKyAgICAgICAgICAgIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmX25leHQsICpic2YgPSB0ZWUtPnNsYXZlc1tpXS5ic2ZzW2pdOworICAgICAgICAgICAgd2hpbGUgKGJzZikgeworICAgICAgICAgICAgICAgIGJzZl9uZXh0ID0gYnNmLT5uZXh0OworICAgICAgICAgICAgICAgIGF2X2JpdHN0cmVhbV9maWx0ZXJfY2xvc2UoYnNmKTsKKyAgICAgICAgICAgICAgICBic2YgPSBic2ZfbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmdGVlLT5zbGF2ZXNbaV0uc3RyZWFtX21hcCk7CisgICAgICAgIGF2X2ZyZWVwKCZ0ZWUtPnNsYXZlc1tpXS5ic2ZzKTsKKworICAgICAgICBhdmlvX2Nsb3NlKGF2ZjItPnBiKTsKKyAgICAgICAgYXZmMi0+cGIgPSBOVUxMOworICAgICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQoYXZmMik7CisgICAgICAgIHRlZS0+c2xhdmVzW2ldLmF2ZiA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBsb2dfc2xhdmUoVGVlU2xhdmUgKnNsYXZlLCB2b2lkICpsb2dfY3R4LCBpbnQgbG9nX2xldmVsKQoreworICAgIGludCBpOworICAgIGF2X2xvZyhsb2dfY3R4LCBsb2dfbGV2ZWwsICJmaWxlbmFtZTonJXMnIGZvcm1hdDolc1xuIiwKKyAgICAgICAgICAgc2xhdmUtPmF2Zi0+ZmlsZW5hbWUsIHNsYXZlLT5hdmYtPm9mb3JtYXQtPm5hbWUpOworICAgIGZvciAoaSA9IDA7IGkgPCBzbGF2ZS0+YXZmLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gc2xhdmUtPmF2Zi0+c3RyZWFtc1tpXTsKKyAgICAgICAgQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2YgPSBzbGF2ZS0+YnNmc1tpXTsKKworICAgICAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiICAgIHN0cmVhbTolZCBjb2RlYzolcyB0eXBlOiVzIiwKKyAgICAgICAgICAgICAgIGksIGF2Y29kZWNfZ2V0X25hbWUoc3QtPmNvZGVjLT5jb2RlY19pZCksCisgICAgICAgICAgICAgICBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoc3QtPmNvZGVjLT5jb2RlY190eXBlKSk7CisgICAgICAgIGlmIChic2YpIHsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBsb2dfbGV2ZWwsICIgYnNmczoiKTsKKyAgICAgICAgICAgIHdoaWxlIChic2YpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGJzZi0+ZmlsdGVyLT5uYW1lLCBic2YtPm5leHQgPyAiLCIgOiAiIik7CisgICAgICAgICAgICAgICAgYnNmID0gYnNmLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBsb2dfbGV2ZWwsICJcbiIpOworICAgIH0KK30KKworc3RhdGljIGludCB0ZWVfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqYXZmKQoreworICAgIFRlZUNvbnRleHQgKnRlZSA9IGF2Zi0+cHJpdl9kYXRhOworICAgIHVuc2lnbmVkIG5iX3NsYXZlcyA9IDAsIGk7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBhdmYtPmZpbGVuYW1lOworICAgIGNoYXIgKnNsYXZlc1tNQVhfU0xBVkVTXTsKKyAgICBpbnQgcmV0OworCisgICAgd2hpbGUgKCpmaWxlbmFtZSkgeworICAgICAgICBpZiAobmJfc2xhdmVzID09IE1BWF9TTEFWRVMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIk1heGltdW0gJWQgc2xhdmUgbXV4ZXJzIHJlYWNoZWQuXG4iLAorICAgICAgICAgICAgICAgICAgIE1BWF9TTEFWRVMpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoc2xhdmVzW25iX3NsYXZlcysrXSA9IGF2X2dldF90b2tlbigmZmlsZW5hbWUsIHNsYXZlX2RlbGltKSkpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3Ryc3BuKGZpbGVuYW1lLCBzbGF2ZV9kZWxpbSkpCisgICAgICAgICAgICBmaWxlbmFtZSsrOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zbGF2ZXM7IGkrKykgeworICAgICAgICBpZiAoKHJldCA9IG9wZW5fc2xhdmUoYXZmLCBzbGF2ZXNbaV0sICZ0ZWUtPnNsYXZlc1tpXSkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgbG9nX3NsYXZlKCZ0ZWUtPnNsYXZlc1tpXSwgYXZmLCBBVl9MT0dfVkVSQk9TRSk7CisgICAgICAgIGF2X2ZyZWVwKCZzbGF2ZXNbaV0pOworICAgIH0KKworICAgIHRlZS0+bmJfc2xhdmVzID0gbmJfc2xhdmVzOworCisgICAgZm9yIChpID0gMDsgaSA8IGF2Zi0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGludCBqLCBtYXBwZWQgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGVlLT5uYl9zbGF2ZXM7IGorKykKKyAgICAgICAgICAgIG1hcHBlZCArPSB0ZWUtPnNsYXZlc1tqXS5zdHJlYW1fbWFwW2ldID49IDA7CisgICAgICAgIGlmICghbWFwcGVkKQorICAgICAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX1dBUk5JTkcsICJJbnB1dCBzdHJlYW0gIyVkIGlzIG5vdCBtYXBwZWQgIgorICAgICAgICAgICAgICAgICAgICJ0byBhbnkgc2xhdmUuXG4iLCBpKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZm9yIChpID0gMDsgaSA8IG5iX3NsYXZlczsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmc2xhdmVzW2ldKTsKKyAgICBjbG9zZV9zbGF2ZXMoYXZmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpbHRlcl9wYWNrZXQodm9pZCAqbG9nX2N0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHgsIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmX2N0eCkKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jX2N0eCA9IGZtdF9jdHgtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYzsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHdoaWxlIChic2ZfY3R4KSB7CisgICAgICAgIEFWUGFja2V0IG5ld19wa3QgPSAqcGt0OworICAgICAgICByZXQgPSBhdl9iaXRzdHJlYW1fZmlsdGVyX2ZpbHRlcihic2ZfY3R4LCBlbmNfY3R4LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19wa3QuZGF0YSwgJm5ld19wa3Quc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YSwgcGt0LT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSk7CisgICAgICAgIGlmIChyZXQgPT0gMCAmJiBuZXdfcGt0LmRhdGEgIT0gcGt0LT5kYXRhICYmIG5ld19wa3QuZGVzdHJ1Y3QpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZfY29weV9wYWNrZXQoJm5ld19wa3QsIHBrdCkpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgIG5ld19wa3QuYnVmID0gYXZfYnVmZmVyX2NyZWF0ZShuZXdfcGt0LmRhdGEsIG5ld19wa3Quc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9idWZmZXJfZGVmYXVsdF9mcmVlLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmICghbmV3X3BrdC5idWYpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmaWx0ZXIgYml0c3RyZWFtIHdpdGggZmlsdGVyICVzIGZvciBzdHJlYW0gJWQgaW4gZmlsZSAnJXMnIHdpdGggY29kZWMgJXNcbiIsCisgICAgICAgICAgICAgICAgYnNmX2N0eC0+ZmlsdGVyLT5uYW1lLCBwa3QtPnN0cmVhbV9pbmRleCwgZm10X2N0eC0+ZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShlbmNfY3R4LT5jb2RlY19pZCkpOworICAgICAgICB9CisgICAgICAgICpwa3QgPSBuZXdfcGt0OworCisgICAgICAgIGJzZl9jdHggPSBic2ZfY3R4LT5uZXh0OworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGVlX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICphdmYpCit7CisgICAgVGVlQ29udGV4dCAqdGVlID0gYXZmLT5wcml2X2RhdGE7CisgICAgQVZGb3JtYXRDb250ZXh0ICphdmYyOworICAgIGludCByZXRfYWxsID0gMCwgcmV0OworICAgIHVuc2lnbmVkIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGVlLT5uYl9zbGF2ZXM7IGkrKykgeworICAgICAgICBhdmYyID0gdGVlLT5zbGF2ZXNbaV0uYXZmOworICAgICAgICBpZiAoKHJldCA9IGF2X3dyaXRlX3RyYWlsZXIoYXZmMikpIDwgMCkKKyAgICAgICAgICAgIGlmICghcmV0X2FsbCkKKyAgICAgICAgICAgICAgICByZXRfYWxsID0gcmV0OworICAgICAgICBpZiAoIShhdmYyLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX05PRklMRSkpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZpb19jbG9zZShhdmYyLT5wYikpIDwgMCkKKyAgICAgICAgICAgICAgICBpZiAoIXJldF9hbGwpCisgICAgICAgICAgICAgICAgICAgIHJldF9hbGwgPSByZXQ7CisgICAgICAgICAgICBhdmYyLT5wYiA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xvc2Vfc2xhdmVzKGF2Zik7CisgICAgcmV0dXJuIHJldF9hbGw7Cit9CisKK3N0YXRpYyBpbnQgdGVlX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2ZiwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBUZWVDb250ZXh0ICp0ZWUgPSBhdmYtPnByaXZfZGF0YTsKKyAgICBBVkZvcm1hdENvbnRleHQgKmF2ZjI7CisgICAgQVZQYWNrZXQgcGt0MjsKKyAgICBpbnQgcmV0X2FsbCA9IDAsIHJldDsKKyAgICB1bnNpZ25lZCBpLCBzOworICAgIGludCBzMjsKKyAgICBBVlJhdGlvbmFsIHRiLCB0YjI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGVlLT5uYl9zbGF2ZXM7IGkrKykgeworICAgICAgICBhdmYyID0gdGVlLT5zbGF2ZXNbaV0uYXZmOworICAgICAgICBzID0gcGt0LT5zdHJlYW1faW5kZXg7CisgICAgICAgIHMyID0gdGVlLT5zbGF2ZXNbaV0uc3RyZWFtX21hcFtzXTsKKyAgICAgICAgaWYgKHMyIDwgMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICgocmV0ID0gYXZfY29weV9wYWNrZXQoJnBrdDIsIHBrdCkpIDwgMCB8fAorICAgICAgICAgICAgKHJldCA9IGF2X2R1cF9wYWNrZXQoJnBrdDIpKTwgMCkKKyAgICAgICAgICAgIGlmICghcmV0X2FsbCkgeworICAgICAgICAgICAgICAgIHJldF9hbGwgPSByZXQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIHRiICA9IGF2ZiAtPnN0cmVhbXNbcyBdLT50aW1lX2Jhc2U7CisgICAgICAgIHRiMiA9IGF2ZjItPnN0cmVhbXNbczJdLT50aW1lX2Jhc2U7CisgICAgICAgIHBrdDIucHRzICAgICAgPSBhdl9yZXNjYWxlX3EocGt0LT5wdHMsICAgICAgdGIsIHRiMik7CisgICAgICAgIHBrdDIuZHRzICAgICAgPSBhdl9yZXNjYWxlX3EocGt0LT5kdHMsICAgICAgdGIsIHRiMik7CisgICAgICAgIHBrdDIuZHVyYXRpb24gPSBhdl9yZXNjYWxlX3EocGt0LT5kdXJhdGlvbiwgdGIsIHRiMik7CisgICAgICAgIHBrdDIuc3RyZWFtX2luZGV4ID0gczI7CisKKyAgICAgICAgZmlsdGVyX3BhY2tldChhdmYyLCAmcGt0MiwgYXZmMiwgdGVlLT5zbGF2ZXNbaV0uYnNmc1tzMl0pOworICAgICAgICBpZiAoKHJldCA9IGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKGF2ZjIsICZwa3QyKSkgPCAwKQorICAgICAgICAgICAgaWYgKCFyZXRfYWxsKQorICAgICAgICAgICAgICAgIHJldF9hbGwgPSByZXQ7CisgICAgfQorICAgIHJldHVybiByZXRfYWxsOworfQorCitBVk91dHB1dEZvcm1hdCBmZl90ZWVfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gInRlZSIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk11bHRpcGxlIG11eGVyIHRlZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihUZWVDb250ZXh0KSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSB0ZWVfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IHRlZV93cml0ZV90cmFpbGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHRlZV93cml0ZV9wYWNrZXQsCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJnRlZV9tdXhlcl9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3RocC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3RocC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGNlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvdGhwLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBUSFAgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IE1hcmNvIEdlcmFyZHMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IFRocERlbXV4Q29udGV4dCB7CisgICAgaW50ICAgICAgICAgICAgICB2ZXJzaW9uOworICAgIHVuc2lnbmVkICAgICAgICAgZmlyc3RfZnJhbWU7CisgICAgdW5zaWduZWQgICAgICAgICBmaXJzdF9mcmFtZXN6OworICAgIHVuc2lnbmVkICAgICAgICAgbGFzdF9mcmFtZTsKKyAgICBpbnQgICAgICAgICAgICAgIGNvbXBvZmY7CisgICAgdW5zaWduZWQgICAgICAgICBmcmFtZWNudDsKKyAgICBBVlJhdGlvbmFsICAgICAgIGZwczsKKyAgICB1bnNpZ25lZCAgICAgICAgIGZyYW1lOworICAgIGludDY0X3QgICAgICAgICAgbmV4dF9mcmFtZTsKKyAgICB1bnNpZ25lZCAgICAgICAgIG5leHRfZnJhbWVzejsKKyAgICBpbnQgICAgICAgICAgICAgIHZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICBpbnQgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV9pbmRleDsKKyAgICBpbnQgICAgICAgICAgICAgIGNvbXBjb3VudDsKKyAgICB1bnNpZ25lZCBjaGFyICAgIGNvbXBvbmVudHNbMTZdOworICAgIEFWU3RyZWFtKiAgICAgICAgdnN0OworICAgIGludCAgICAgICAgICAgICAgaGFzX2F1ZGlvOworICAgIHVuc2lnbmVkICAgICAgICAgYXVkaW9zaXplOworfSBUaHBEZW11eENvbnRleHQ7CisKKworc3RhdGljIGludCB0aHBfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgZG91YmxlIGQ7CisgICAgLyogY2hlY2sgZmlsZSBoZWFkZXIgKi8KKyAgICBpZiAoQVZfUkwzMihwLT5idWYpICE9IE1LVEFHKCdUJywgJ0gnLCAnUCcsICdcMCcpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGQgPSBhdl9pbnQyZmxvYXQoQVZfUkIzMihwLT5idWYgKyAxNikpOworICAgIGlmIChkIDwgMC4xIHx8IGQgPiAxMDAwIHx8IGlzbmFuKGQpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVgvNDsKKworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKK30KKworc3RhdGljIGludCB0aHBfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFRocERlbXV4Q29udGV4dCAqdGhwID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQ2NF90IGZzaXplPSBhdmlvX3NpemUocGIpOworICAgIGludCBpOworCisgICAgLyogUmVhZCB0aGUgZmlsZSBoZWFkZXIuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpb19yYjMyKHBiKTsgLyogU2tpcCBNYWdpYy4gICovCisgICAgdGhwLT52ZXJzaW9uICAgICAgICAgPSBhdmlvX3JiMzIocGIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBNYXggYnVmIHNpemUuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpb19yYjMyKHBiKTsgLyogTWF4IHNhbXBsZXMuICAqLworCisgICAgdGhwLT5mcHMgICAgICAgICAgICAgPSBhdl9kMnEoYXZfaW50MmZsb2F0KGF2aW9fcmIzMihwYikpLCBJTlRfTUFYKTsKKyAgICB0aHAtPmZyYW1lY250ICAgICAgICA9IGF2aW9fcmIzMihwYik7CisgICAgdGhwLT5maXJzdF9mcmFtZXN6ICAgPSBhdmlvX3JiMzIocGIpOworICAgIHBiLT5tYXhzaXplICAgICAgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZihmc2l6ZT4wICYmICghcGItPm1heHNpemUgfHwgZnNpemUgPCBwYi0+bWF4c2l6ZSkpCisgICAgICAgIHBiLT5tYXhzaXplPSBmc2l6ZTsKKworICAgIHRocC0+Y29tcG9mZiAgICAgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2aW9fcmIzMihwYik7IC8qIG9mZnNldERhdGFPZmZzZXQuICAqLworICAgIHRocC0+Zmlyc3RfZnJhbWUgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICB0aHAtPmxhc3RfZnJhbWUgICAgICA9IGF2aW9fcmIzMihwYik7CisKKyAgICB0aHAtPm5leHRfZnJhbWVzeiAgICA9IHRocC0+Zmlyc3RfZnJhbWVzejsKKyAgICB0aHAtPm5leHRfZnJhbWUgICAgICA9IHRocC0+Zmlyc3RfZnJhbWU7CisKKyAgICAvKiBSZWFkIHRoZSBjb21wb25lbnQgc3RydWN0dXJlLiAgKi8KKyAgICBhdmlvX3NlZWsgKHBiLCB0aHAtPmNvbXBvZmYsIFNFRUtfU0VUKTsKKyAgICB0aHAtPmNvbXBjb3VudCAgICAgICA9IGF2aW9fcmIzMihwYik7CisKKyAgICAvKiBSZWFkIHRoZSBsaXN0IG9mIGNvbXBvbmVudCB0eXBlcy4gICovCisgICAgYXZpb19yZWFkKHBiLCB0aHAtPmNvbXBvbmVudHMsIDE2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0aHAtPmNvbXBjb3VudDsgaSsrKSB7CisgICAgICAgIGlmICh0aHAtPmNvbXBvbmVudHNbaV0gPT0gMCkgeworICAgICAgICAgICAgaWYgKHRocC0+dnN0KQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBWaWRlbyBjb21wb25lbnQuICAqLworICAgICAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICAvKiBUaGUgZGVub21pbmF0b3IgYW5kIG51bWVyYXRvciBhcmUgc3dpdGNoZWQgYmVjYXVzZSAxL2ZwcworICAgICAgICAgICAgICAgaXMgcmVxdWlyZWQuICAqLworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHRocC0+ZnBzLmRlbiwgdGhwLT5mcHMubnVtKTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9USFA7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KKyAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgc3QtPm5iX2ZyYW1lcyA9CisgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSB0aHAtPmZyYW1lY250OworICAgICAgICAgICAgdGhwLT52c3QgPSBzdDsKKyAgICAgICAgICAgIHRocC0+dmlkZW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworCisgICAgICAgICAgICBpZiAodGhwLT52ZXJzaW9uID09IDB4MTEwMDApCisgICAgICAgICAgICAgICAgYXZpb19yYjMyKHBiKTsgLyogVW5rbm93bi4gICovCisgICAgICAgIH0gZWxzZSBpZiAodGhwLT5jb21wb25lbnRzW2ldID09IDEpIHsKKyAgICAgICAgICAgIGlmICh0aHAtPmhhc19hdWRpbyAhPSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBBdWRpbyBjb21wb25lbnQuICAqLworICAgICAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fVEhQOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gYXZpb19yYjMyKHBiKTsgLyogbnVtQ2hhbm5lbHMuICAqLworICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIzMihwYik7IC8qIEZyZXF1ZW5jeS4gICovCisKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKworICAgICAgICAgICAgdGhwLT5hdWRpb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgICAgICAgICB0aHAtPmhhc19hdWRpbyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aHBfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgVGhwRGVtdXhDb250ZXh0ICp0aHAgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgaW50IHJldDsKKworICAgIGlmICh0aHAtPmF1ZGlvc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qIFRlcm1pbmF0ZSB3aGVuIGxhc3QgZnJhbWUgaXMgcmVhY2hlZC4gICovCisgICAgICAgIGlmICh0aHAtPmZyYW1lID49IHRocC0+ZnJhbWVjbnQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICAgICAgYXZpb19zZWVrKHBiLCB0aHAtPm5leHRfZnJhbWUsIFNFRUtfU0VUKTsKKworICAgICAgICAvKiBMb2NhdGUgdGhlIG5leHQgZnJhbWUgYW5kIHJlYWQgb3V0IGl0cyBzaXplLiAgKi8KKyAgICAgICAgdGhwLT5uZXh0X2ZyYW1lICs9IEZGTUFYKHRocC0+bmV4dF9mcmFtZXN6LCAxKTsKKyAgICAgICAgdGhwLT5uZXh0X2ZyYW1lc3ogPSBhdmlvX3JiMzIocGIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBQcmV2aW91cyB0b3RhbCBzaXplLiAgKi8KKyAgICAgICAgc2l6ZSAgICAgICAgICA9IGF2aW9fcmIzMihwYik7IC8qIFRvdGFsIHNpemUgb2YgdGhpcyBmcmFtZS4gICovCisKKyAgICAgICAgLyogU3RvcmUgdGhlIGF1ZGlvc2l6ZSBzbyB0aGUgbmV4dCB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLAorICAgICAgICAgICB0aGUgYXVkaW8gY2FuIGJlIHJlYWQuICAqLworICAgICAgICBpZiAodGhwLT5oYXNfYXVkaW8pCisgICAgICAgICAgICB0aHAtPmF1ZGlvc2l6ZSA9IGF2aW9fcmIzMihwYik7IC8qIEF1ZGlvIHNpemUuICAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHAtPmZyYW1lKys7CisKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBzaXplKTsKKyAgICAgICAgaWYgKHJldCAhPSBzaXplKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorCisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gdGhwLT52aWRlb19zdHJlYW1faW5kZXg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCB0aHAtPmF1ZGlvc2l6ZSk7CisgICAgICAgIGlmIChyZXQgIT0gdGhwLT5hdWRpb3NpemUpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9CisKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSB0aHAtPmF1ZGlvX3N0cmVhbV9pbmRleDsKKyAgICAgICAgaWYgKHRocC0+YXVkaW9zaXplID49IDgpCisgICAgICAgICAgICBwa3QtPmR1cmF0aW9uID0gQVZfUkIzMigmcGt0LT5kYXRhWzRdKTsKKworICAgICAgICB0aHAtPmF1ZGlvc2l6ZSA9IDA7CisgICAgICAgIHRocC0+ZnJhbWUrKzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl90aHBfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidGhwIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVEhQIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFRocERlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gdGhwX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHRocF9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSB0aHBfcmVhZF9wYWNrZXQKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdGllcnRleHNlcS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3RpZXJ0ZXhzZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTliYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3RpZXJ0ZXhzZXEuYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIFRpZXJ0ZXggTGltaXRlZCBTRVEgRmlsZSBEZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgR3JlZ29yeSBNb250b2lyIChjeXhAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUaWVydGV4IExpbWl0ZWQgU0VRIGZpbGUgZGVtdXhlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgU0VRX0ZSQU1FX1NJWkUgICAgICAgICA2MTQ0CisjZGVmaW5lIFNFUV9GUkFNRV9XICAgICAgICAgICAgMjU2CisjZGVmaW5lIFNFUV9GUkFNRV9IICAgICAgICAgICAgMTI4CisjZGVmaW5lIFNFUV9OVU1fRlJBTUVfQlVGRkVSUyAgMzAKKyNkZWZpbmUgU0VRX0FVRElPX0JVRkZFUl9TSVpFICA4ODIKKyNkZWZpbmUgU0VRX1NBTVBMRV9SQVRFICAgICAgICAyMjA1MAorI2RlZmluZSBTRVFfRlJBTUVfUkFURSAgICAgICAgIDI1CisKKwordHlwZWRlZiBzdHJ1Y3QgVGllcnRleFNlcUZyYW1lQnVmZmVyIHsKKyAgICBpbnQgZmlsbF9zaXplOworICAgIGludCBkYXRhX3NpemU7CisgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKK30gVGllcnRleFNlcUZyYW1lQnVmZmVyOworCit0eXBlZGVmIHN0cnVjdCBTZXFEZW11eENvbnRleHQgeworICAgIGludCBhdWRpb19zdHJlYW1faW5kZXg7CisgICAgaW50IHZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICBpbnQgY3VycmVudF9mcmFtZV9wdHM7CisgICAgaW50IGN1cnJlbnRfZnJhbWVfb2ZmczsKKyAgICBUaWVydGV4U2VxRnJhbWVCdWZmZXIgZnJhbWVfYnVmZmVyc1tTRVFfTlVNX0ZSQU1FX0JVRkZFUlNdOworICAgIGludCBmcmFtZV9idWZmZXJzX2NvdW50OworICAgIHVuc2lnbmVkIGludCBjdXJyZW50X2F1ZGlvX2RhdGFfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgY3VycmVudF9hdWRpb19kYXRhX29mZnM7CisgICAgdW5zaWduZWQgaW50IGN1cnJlbnRfcGFsX2RhdGFfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgY3VycmVudF9wYWxfZGF0YV9vZmZzOworICAgIHVuc2lnbmVkIGludCBjdXJyZW50X3ZpZGVvX2RhdGFfc2l6ZTsKKyAgICB1bnNpZ25lZCBjaGFyICpjdXJyZW50X3ZpZGVvX2RhdGFfcHRyOworICAgIGludCBhdWRpb19idWZmZXJfZnVsbDsKK30gU2VxRGVtdXhDb250ZXh0OworCisKK3N0YXRpYyBpbnQgc2VxX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGludCBpOworCisgICAgaWYgKHAtPmJ1Zl9zaXplIDwgMjU4KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHRoZXJlJ3Mgbm8gcmVhbCBoZWFkZXIgaW4gYSAuc2VxIGZpbGUsIHRoZSBvbmx5IHRoaW5nIHRoZXkgaGF2ZSBpbiBjb21tb24gKi8KKyAgICAvKiBpcyB0aGUgZmlyc3QgMjU2IGJ5dGVzIG9mIHRoZSBmaWxlIHdoaWNoIGFyZSBhbHdheXMgZmlsbGVkIHdpdGggMCAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgaWYgKHAtPmJ1ZltpXSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgaWYocC0+YnVmWzI1Nl09PTAgJiYgcC0+YnVmWzI1N109PTApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogb25seSBvbmUgZm91cnRoIG9mIHRoZSBzY29yZSBzaW5jZSB0aGUgcHJldmlvdXMgY2hlY2sgaXMgdG9vIG5haXZlICovCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gNDsKK30KKworc3RhdGljIGludCBzZXFfaW5pdF9mcmFtZV9idWZmZXJzKFNlcURlbXV4Q29udGV4dCAqc2VxLCBBVklPQ29udGV4dCAqcGIpCit7CisgICAgaW50IGksIHN6OworICAgIFRpZXJ0ZXhTZXFGcmFtZUJ1ZmZlciAqc2VxX2J1ZmZlcjsKKworICAgIGF2aW9fc2VlayhwYiwgMjU2LCBTRUVLX1NFVCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgU0VRX05VTV9GUkFNRV9CVUZGRVJTOyBpKyspIHsKKyAgICAgICAgc3ogPSBhdmlvX3JsMTYocGIpOworICAgICAgICBpZiAoc3ogPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlcV9idWZmZXIgPSAmc2VxLT5mcmFtZV9idWZmZXJzW2ldOworICAgICAgICAgICAgc2VxX2J1ZmZlci0+ZmlsbF9zaXplID0gMDsKKyAgICAgICAgICAgIHNlcV9idWZmZXItPmRhdGFfc2l6ZSA9IHN6OworICAgICAgICAgICAgc2VxX2J1ZmZlci0+ZGF0YSA9IGF2X21hbGxvYyhzeik7CisgICAgICAgICAgICBpZiAoIXNlcV9idWZmZXItPmRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZXEtPmZyYW1lX2J1ZmZlcnNfY291bnQgPSBpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlcV9maWxsX2J1ZmZlcihTZXFEZW11eENvbnRleHQgKnNlcSwgQVZJT0NvbnRleHQgKnBiLCBpbnQgYnVmZmVyX251bSwgdW5zaWduZWQgaW50IGRhdGFfb2ZmcywgaW50IGRhdGFfc2l6ZSkKK3sKKyAgICBUaWVydGV4U2VxRnJhbWVCdWZmZXIgKnNlcV9idWZmZXI7CisKKyAgICBpZiAoYnVmZmVyX251bSA+PSBTRVFfTlVNX0ZSQU1FX0JVRkZFUlMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc2VxX2J1ZmZlciA9ICZzZXEtPmZyYW1lX2J1ZmZlcnNbYnVmZmVyX251bV07CisgICAgaWYgKHNlcV9idWZmZXItPmZpbGxfc2l6ZSArIGRhdGFfc2l6ZSA+IHNlcV9idWZmZXItPmRhdGFfc2l6ZSB8fCBkYXRhX3NpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdmlvX3NlZWsocGIsIHNlcS0+Y3VycmVudF9mcmFtZV9vZmZzICsgZGF0YV9vZmZzLCBTRUVLX1NFVCk7CisgICAgaWYgKGF2aW9fcmVhZChwYiwgc2VxX2J1ZmZlci0+ZGF0YSArIHNlcV9idWZmZXItPmZpbGxfc2l6ZSwgZGF0YV9zaXplKSAhPSBkYXRhX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBzZXFfYnVmZmVyLT5maWxsX3NpemUgKz0gZGF0YV9zaXplOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlcV9wYXJzZV9mcmFtZV9kYXRhKFNlcURlbXV4Q29udGV4dCAqc2VxLCBBVklPQ29udGV4dCAqcGIpCit7CisgICAgdW5zaWduZWQgaW50IG9mZnNldF90YWJsZVs0XSwgYnVmZmVyX251bVs0XTsKKyAgICBUaWVydGV4U2VxRnJhbWVCdWZmZXIgKnNlcV9idWZmZXI7CisgICAgaW50IGksIGUsIGVycjsKKworICAgIHNlcS0+Y3VycmVudF9mcmFtZV9vZmZzICs9IFNFUV9GUkFNRV9TSVpFOworICAgIGF2aW9fc2VlayhwYiwgc2VxLT5jdXJyZW50X2ZyYW1lX29mZnMsIFNFRUtfU0VUKTsKKworICAgIC8qIHNvdW5kIGRhdGEgKi8KKyAgICBzZXEtPmN1cnJlbnRfYXVkaW9fZGF0YV9vZmZzID0gYXZpb19ybDE2KHBiKTsKKyAgICBpZiAoc2VxLT5jdXJyZW50X2F1ZGlvX2RhdGFfb2ZmcykgeworICAgICAgICBzZXEtPmN1cnJlbnRfYXVkaW9fZGF0YV9zaXplID0gU0VRX0FVRElPX0JVRkZFUl9TSVpFICogMjsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXEtPmN1cnJlbnRfYXVkaW9fZGF0YV9zaXplID0gMDsKKyAgICB9CisKKyAgICAvKiBwYWxldHRlIGRhdGEgKi8KKyAgICBzZXEtPmN1cnJlbnRfcGFsX2RhdGFfb2ZmcyA9IGF2aW9fcmwxNihwYik7CisgICAgaWYgKHNlcS0+Y3VycmVudF9wYWxfZGF0YV9vZmZzKSB7CisgICAgICAgIHNlcS0+Y3VycmVudF9wYWxfZGF0YV9zaXplID0gNzY4OworICAgIH0gZWxzZSB7CisgICAgICAgIHNlcS0+Y3VycmVudF9wYWxfZGF0YV9zaXplID0gMDsKKyAgICB9CisKKyAgICAvKiB2aWRlbyBkYXRhICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgYnVmZmVyX251bVtpXSA9IGF2aW9fcjgocGIpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgb2Zmc2V0X3RhYmxlW2ldID0gYXZpb19ybDE2KHBiKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaWYgKG9mZnNldF90YWJsZVtpXSkgeworICAgICAgICAgICAgZm9yIChlID0gaSArIDE7IGUgPCAzICYmIG9mZnNldF90YWJsZVtlXSA9PSAwOyBlKyspOworICAgICAgICAgICAgZXJyID0gc2VxX2ZpbGxfYnVmZmVyKHNlcSwgcGIsIGJ1ZmZlcl9udW1bMSArIGldLAorICAgICAgICAgICAgICBvZmZzZXRfdGFibGVbaV0sCisgICAgICAgICAgICAgIG9mZnNldF90YWJsZVtlXSAtIG9mZnNldF90YWJsZVtpXSk7CisgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnVmZmVyX251bVswXSAhPSAyNTUpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcl9udW1bMF0gPj0gU0VRX05VTV9GUkFNRV9CVUZGRVJTKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgc2VxX2J1ZmZlciA9ICZzZXEtPmZyYW1lX2J1ZmZlcnNbYnVmZmVyX251bVswXV07CisgICAgICAgIHNlcS0+Y3VycmVudF92aWRlb19kYXRhX3NpemUgPSBzZXFfYnVmZmVyLT5maWxsX3NpemU7CisgICAgICAgIHNlcS0+Y3VycmVudF92aWRlb19kYXRhX3B0ciAgPSBzZXFfYnVmZmVyLT5kYXRhOworICAgICAgICBzZXFfYnVmZmVyLT5maWxsX3NpemUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHNlcS0+Y3VycmVudF92aWRlb19kYXRhX3NpemUgPSAwOworICAgICAgICBzZXEtPmN1cnJlbnRfdmlkZW9fZGF0YV9wdHIgID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXFfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpLCByYzsKKyAgICBTZXFEZW11eENvbnRleHQgKnNlcSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICAvKiBpbml0IGludGVybmFsIGJ1ZmZlcnMgKi8KKyAgICByYyA9IHNlcV9pbml0X2ZyYW1lX2J1ZmZlcnMoc2VxLCBwYik7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBzZXEtPmN1cnJlbnRfZnJhbWVfb2ZmcyA9IDA7CisKKyAgICAvKiBwcmVsb2FkIChubyBhdWRpbyBkYXRhLCBqdXN0IGJ1ZmZlciBvcGVyYXRpb25zIHJlbGF0ZWQgZGF0YSkgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDw9IDEwMDsgaSsrKSB7CisgICAgICAgIHJjID0gc2VxX3BhcnNlX2ZyYW1lX2RhdGEoc2VxLCBwYik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBzZXEtPmN1cnJlbnRfZnJhbWVfcHRzID0gMDsKKworICAgIHNlcS0+YXVkaW9fYnVmZmVyX2Z1bGwgPSAwOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgdmlkZW8gZGVjb2RlciBzdHJlYW0gKi8KKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCBTRVFfRlJBTUVfUkFURSk7CisgICAgc2VxLT52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9USUVSVEVYU0VRVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjLT53aWR0aCA9IFNFUV9GUkFNRV9XOworICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gU0VRX0ZSQU1FX0g7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBhdWRpbyBkZWNvZGVyIHN0cmVhbSAqLworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCBTRVFfU0FNUExFX1JBVEUpOworICAgIHNlcS0+YXVkaW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkJFOworICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIHRhZyAqLworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAxOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gU0VRX1NBTVBMRV9SQVRFOworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTY7CisgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAvIDg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXFfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGludCByYzsKKyAgICBTZXFEZW11eENvbnRleHQgKnNlcSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKworICAgIGlmICghc2VxLT5hdWRpb19idWZmZXJfZnVsbCkgeworICAgICAgICByYyA9IHNlcV9wYXJzZV9mcmFtZV9kYXRhKHNlcSwgcGIpOworICAgICAgICBpZiAocmMpCisgICAgICAgICAgICByZXR1cm4gcmM7CisKKyAgICAgICAgLyogdmlkZW8gcGFja2V0ICovCisgICAgICAgIGlmIChzZXEtPmN1cnJlbnRfcGFsX2RhdGFfc2l6ZSArIHNlcS0+Y3VycmVudF92aWRlb19kYXRhX3NpemUgIT0gMCkgeworICAgICAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCAxICsgc2VxLT5jdXJyZW50X3BhbF9kYXRhX3NpemUgKyBzZXEtPmN1cnJlbnRfdmlkZW9fZGF0YV9zaXplKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBwa3QtPmRhdGFbMF0gPSAwOworICAgICAgICAgICAgaWYgKHNlcS0+Y3VycmVudF9wYWxfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgcGt0LT5kYXRhWzBdIHw9IDE7CisgICAgICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBzZXEtPmN1cnJlbnRfZnJhbWVfb2ZmcyArIHNlcS0+Y3VycmVudF9wYWxfZGF0YV9vZmZzLCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgJnBrdC0+ZGF0YVsxXSwgc2VxLT5jdXJyZW50X3BhbF9kYXRhX3NpemUpICE9IHNlcS0+Y3VycmVudF9wYWxfZGF0YV9zaXplKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlcS0+Y3VycmVudF92aWRlb19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBwa3QtPmRhdGFbMF0gfD0gMjsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnBrdC0+ZGF0YVsxICsgc2VxLT5jdXJyZW50X3BhbF9kYXRhX3NpemVdLAorICAgICAgICAgICAgICAgICAgc2VxLT5jdXJyZW50X3ZpZGVvX2RhdGFfcHRyLAorICAgICAgICAgICAgICAgICAgc2VxLT5jdXJyZW50X3ZpZGVvX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHNlcS0+dmlkZW9fc3RyZWFtX2luZGV4OworICAgICAgICAgICAgcGt0LT5wdHMgPSBzZXEtPmN1cnJlbnRfZnJhbWVfcHRzOworCisgICAgICAgICAgICAvKiBzb3VuZCBidWZmZXIgd2lsbCBiZSBwcm9jZXNzZWQgb24gbmV4dCByZWFkX3BhY2tldCgpIGNhbGwgKi8KKyAgICAgICAgICAgIHNlcS0+YXVkaW9fYnVmZmVyX2Z1bGwgPSAxOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgIH0KKworICAgIC8qIGF1ZGlvIHBhY2tldCAqLworICAgIGlmIChzZXEtPmN1cnJlbnRfYXVkaW9fZGF0YV9vZmZzID09IDApIC8qIGVuZCBvZiBkYXRhIHJlYWNoZWQgKi8KKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIGF2aW9fc2VlayhwYiwgc2VxLT5jdXJyZW50X2ZyYW1lX29mZnMgKyBzZXEtPmN1cnJlbnRfYXVkaW9fZGF0YV9vZmZzLCBTRUVLX1NFVCk7CisgICAgcmMgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIHNlcS0+Y3VycmVudF9hdWRpb19kYXRhX3NpemUpOworICAgIGlmIChyYyA8IDApCisgICAgICAgIHJldHVybiByYzsKKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc2VxLT5hdWRpb19zdHJlYW1faW5kZXg7CisgICAgc2VxLT5jdXJyZW50X2ZyYW1lX3B0cysrOworCisgICAgc2VxLT5hdWRpb19idWZmZXJfZnVsbCA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VxX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIFNlcURlbXV4Q29udGV4dCAqc2VxID0gcy0+cHJpdl9kYXRhOworCisgICAgZm9yIChpID0gMDsgaSA8IFNFUV9OVU1fRlJBTUVfQlVGRkVSUzsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmc2VxLT5mcmFtZV9idWZmZXJzW2ldLmRhdGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfdGllcnRleHNlcV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ0aWVydGV4c2VxIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVGllcnRleCBMaW1pdGVkIFNFUSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTZXFEZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHNlcV9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBzZXFfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gc2VxX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHNlcV9yZWFkX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC90bHMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC90bHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmE2YmUzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3Rscy5jCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogVExTL1NTTCBQcm90b2NvbAorICogQ29weXJpZ2h0IChjKSAyMDExIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInVybC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgIm5ldHdvcmsuaCIKKyNpbmNsdWRlICJvc19zdXBwb3J0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpZiBDT05GSUdfR05VVExTCisjaW5jbHVkZSA8Z251dGxzL2dudXRscy5oPgorI2luY2x1ZGUgPGdudXRscy94NTA5Lmg+CisjZGVmaW5lIFRMU19yZWFkKGMsIGJ1Ziwgc2l6ZSkgIGdudXRsc19yZWNvcmRfcmVjdihjLT5zZXNzaW9uLCBidWYsIHNpemUpCisjZGVmaW5lIFRMU193cml0ZShjLCBidWYsIHNpemUpIGdudXRsc19yZWNvcmRfc2VuZChjLT5zZXNzaW9uLCBidWYsIHNpemUpCisjZGVmaW5lIFRMU19zaHV0ZG93bihjKSAgICAgICAgIGdudXRsc19ieWUoYy0+c2Vzc2lvbiwgR05VVExTX1NIVVRfUkRXUikKKyNkZWZpbmUgVExTX2ZyZWUoYykgZG8geyBcCisgICAgICAgIGlmIChjLT5zZXNzaW9uKSBcCisgICAgICAgICAgICBnbnV0bHNfZGVpbml0KGMtPnNlc3Npb24pOyBcCisgICAgICAgIGlmIChjLT5jcmVkKSBcCisgICAgICAgICAgICBnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9jcmVkZW50aWFscyhjLT5jcmVkKTsgXAorICAgIH0gd2hpbGUgKDApCisjZWxpZiBDT05GSUdfT1BFTlNTTAorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2RlZmluZSBUTFNfcmVhZChjLCBidWYsIHNpemUpICBTU0xfcmVhZChjLT5zc2wsICBidWYsIHNpemUpCisjZGVmaW5lIFRMU193cml0ZShjLCBidWYsIHNpemUpIFNTTF93cml0ZShjLT5zc2wsIGJ1Ziwgc2l6ZSkKKyNkZWZpbmUgVExTX3NodXRkb3duKGMpICAgICAgICAgU1NMX3NodXRkb3duKGMtPnNzbCkKKyNkZWZpbmUgVExTX2ZyZWUoYykgZG8geyBcCisgICAgICAgIGlmIChjLT5zc2wpIFwKKyAgICAgICAgICAgIFNTTF9mcmVlKGMtPnNzbCk7IFwKKyAgICAgICAgaWYgKGMtPmN0eCkgXAorICAgICAgICAgICAgU1NMX0NUWF9mcmVlKGMtPmN0eCk7IFwKKyAgICB9IHdoaWxlICgwKQorI2VuZGlmCisjaWYgSEFWRV9QT0xMX0gKKyNpbmNsdWRlIDxwb2xsLmg+CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIFVSTENvbnRleHQgKnRjcDsKKyNpZiBDT05GSUdfR05VVExTCisgICAgZ251dGxzX3Nlc3Npb25fdCBzZXNzaW9uOworICAgIGdudXRsc19jZXJ0aWZpY2F0ZV9jcmVkZW50aWFsc190IGNyZWQ7CisjZWxpZiBDT05GSUdfT1BFTlNTTAorICAgIFNTTF9DVFggKmN0eDsKKyAgICBTU0wgKnNzbDsKKyNlbmRpZgorICAgIGludCBmZDsKKyAgICBjaGFyICpjYV9maWxlOworICAgIGludCB2ZXJpZnk7CisgICAgY2hhciAqY2VydF9maWxlOworICAgIGNoYXIgKmtleV9maWxlOworICAgIGludCBsaXN0ZW47Cit9IFRMU0NvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFRMU0NvbnRleHQsIHgpCisjZGVmaW5lIEQgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KKyNkZWZpbmUgRSBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ImNhX2ZpbGUiLCAgICAiQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGRhdGFiYXNlIGZpbGUiLCBPRkZTRVQoY2FfZmlsZSksICAgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBEfEUgfSwKKyAgICB7ImNhZmlsZSIsICAgICAiQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGRhdGFiYXNlIGZpbGUiLCBPRkZTRVQoY2FfZmlsZSksICAgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBEfEUgfSwKKyAgICB7InRsc192ZXJpZnkiLCAiVmVyaWZ5IHRoZSBwZWVyIGNlcnRpZmljYXRlIiwgICAgICAgICBPRkZTRVQodmVyaWZ5KSwgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIC5mbGFncyA9IER8RSB9LAorICAgIHsiY2VydF9maWxlIiwgICJDZXJ0aWZpY2F0ZSBmaWxlIiwgICAgICAgICAgICAgICAgICAgIE9GRlNFVChjZXJ0X2ZpbGUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIC5mbGFncyA9IER8RSB9LAorICAgIHsia2V5X2ZpbGUiLCAgICJQcml2YXRlIGtleSBmaWxlIiwgICAgICAgICAgICAgICAgICAgIE9GRlNFVChrZXlfZmlsZSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIC5mbGFncyA9IER8RSB9LAorICAgIHsibGlzdGVuIiwgICAgICJMaXN0ZW4gZm9yIGluY29taW5nIGNvbm5lY3Rpb25zIiwgICAgIE9GRlNFVChsaXN0ZW4pLCAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgLmZsYWdzID0gRHxFIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHRsc19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJ0bHMiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGludCBkb190bHNfcG9sbChVUkxDb250ZXh0ICpoLCBpbnQgcmV0KQoreworICAgIFRMU0NvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgc3RydWN0IHBvbGxmZCBwID0geyBjLT5mZCwgMCwgMCB9OworI2lmIENPTkZJR19HTlVUTFMKKyAgICBzd2l0Y2ggKHJldCkgeworICAgIGNhc2UgR05VVExTX0VfQUdBSU46CisgICAgY2FzZSBHTlVUTFNfRV9JTlRFUlJVUFRFRDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTlVUTFNfRV9XQVJOSU5HX0FMRVJUX1JFQ0VJVkVEOgorICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICIlc1xuIiwgZ251dGxzX3N0cmVycm9yKHJldCkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiJXNcbiIsIGdudXRsc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgaWYgKGdudXRsc19yZWNvcmRfZ2V0X2RpcmVjdGlvbihjLT5zZXNzaW9uKSkKKyAgICAgICAgcC5ldmVudHMgPSBQT0xMT1VUOworICAgIGVsc2UKKyAgICAgICAgcC5ldmVudHMgPSBQT0xMSU47CisjZWxpZiBDT05GSUdfT1BFTlNTTAorICAgIHJldCA9IFNTTF9nZXRfZXJyb3IoYy0+c3NsLCByZXQpOworICAgIGlmIChyZXQgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCkgeworICAgICAgICBwLmV2ZW50cyA9IFBPTExJTjsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkgeworICAgICAgICBwLmV2ZW50cyA9IFBPTExPVVQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIiVzXG4iLCBFUlJfZXJyb3Jfc3RyaW5nKEVSUl9nZXRfZXJyb3IoKSwgTlVMTCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyNlbmRpZgorICAgIGlmIChoLT5mbGFncyAmIEFWSU9fRkxBR19OT05CTE9DSykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpbnQgbiA9IHBvbGwoJnAsIDEsIDEwMCk7CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoZmZfY2hlY2tfaW50ZXJydXB0KCZoLT5pbnRlcnJ1cHRfY2FsbGJhY2spKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVFIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X29wdGlvbnMoVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqdXJpKQoreworICAgIFRMU0NvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgY2hhciBidWZbMTAyNF07CisgICAgY29uc3QgY2hhciAqcCA9IHN0cmNocih1cmksICc/Jyk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWMtPmNhX2ZpbGUgJiYgYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAiY2FmaWxlIiwgcCkpCisgICAgICAgIGMtPmNhX2ZpbGUgPSBhdl9zdHJkdXAoYnVmKTsKKworICAgIGlmICghYy0+dmVyaWZ5ICYmIGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgInZlcmlmeSIsIHApKSB7CisgICAgICAgIGNoYXIgKmVuZHB0ciA9IE5VTEw7CisgICAgICAgIGMtPnZlcmlmeSA9IHN0cnRvbChidWYsICZlbmRwdHIsIDEwKTsKKyAgICAgICAgaWYgKGJ1ZiA9PSBlbmRwdHIpCisgICAgICAgICAgICBjLT52ZXJpZnkgPSAxOworICAgIH0KKworICAgIGlmICghYy0+Y2VydF9maWxlICYmIGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImNlcnQiLCBwKSkKKyAgICAgICAgYy0+Y2VydF9maWxlID0gYXZfc3RyZHVwKGJ1Zik7CisKKyAgICBpZiAoIWMtPmtleV9maWxlICYmIGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImtleSIsIHApKQorICAgICAgICBjLT5rZXlfZmlsZSA9IGF2X3N0cmR1cChidWYpOworfQorCitzdGF0aWMgaW50IHRsc19vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzKQoreworICAgIFRMU0NvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKyAgICBpbnQgcG9ydDsKKyAgICBjb25zdCBjaGFyICpwOworICAgIGNoYXIgYnVmWzIwMF0sIGhvc3RbMjAwXSwgb3B0c1s1MF0gPSAiIjsKKyAgICBpbnQgbnVtZXJpY2hvc3QgPSAwOworICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cyA9IHsgMCB9LCAqYWkgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKnByb3h5X3BhdGg7CisgICAgaW50IHVzZV9wcm94eTsKKworICAgIGZmX3Rsc19pbml0KCk7CisKKyAgICBpZiAoYy0+bGlzdGVuKQorICAgICAgICBzbnByaW50ZihvcHRzLCBzaXplb2Yob3B0cyksICI/bGlzdGVuPTEiKTsKKworICAgIGF2X3VybF9zcGxpdChOVUxMLCAwLCBOVUxMLCAwLCBob3N0LCBzaXplb2YoaG9zdCksICZwb3J0LCBOVUxMLCAwLCB1cmkpOworCisgICAgcCA9IHN0cmNocih1cmksICc/Jyk7CisKKyAgICBpZiAoIXApIHsKKyAgICAgICAgcCA9IG9wdHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcob3B0cywgc2l6ZW9mKG9wdHMpLCAibGlzdGVuIiwgcCkpCisgICAgICAgICAgICBjLT5saXN0ZW4gPSAxOworICAgIH0KKworICAgIGZmX3VybF9qb2luKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0Y3AiLCBOVUxMLCBob3N0LCBwb3J0LCAiJXMiLCBwKTsKKworICAgIGhpbnRzLmFpX2ZsYWdzID0gQUlfTlVNRVJJQ0hPU1Q7CisgICAgaWYgKCFnZXRhZGRyaW5mbyhob3N0LCBOVUxMLCAmaGludHMsICZhaSkpIHsKKyAgICAgICAgbnVtZXJpY2hvc3QgPSAxOworICAgICAgICBmcmVlYWRkcmluZm8oYWkpOworICAgIH0KKworICAgIHByb3h5X3BhdGggPSBnZXRlbnYoImh0dHBfcHJveHkiKTsKKyAgICB1c2VfcHJveHkgPSAhZmZfaHR0cF9tYXRjaF9ub19wcm94eShnZXRlbnYoIm5vX3Byb3h5IiksIGhvc3QpICYmCisgICAgICAgICAgICAgICAgcHJveHlfcGF0aCAmJiBhdl9zdHJzdGFydChwcm94eV9wYXRoLCAiaHR0cDovLyIsIE5VTEwpOworCisgICAgaWYgKHVzZV9wcm94eSkgeworICAgICAgICBjaGFyIHByb3h5X2hvc3RbMjAwXSwgcHJveHlfYXV0aFsyMDBdLCBkZXN0WzIwMF07CisgICAgICAgIGludCBwcm94eV9wb3J0OworICAgICAgICBhdl91cmxfc3BsaXQoTlVMTCwgMCwgcHJveHlfYXV0aCwgc2l6ZW9mKHByb3h5X2F1dGgpLAorICAgICAgICAgICAgICAgICAgICAgcHJveHlfaG9zdCwgc2l6ZW9mKHByb3h5X2hvc3QpLCAmcHJveHlfcG9ydCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIHByb3h5X3BhdGgpOworICAgICAgICBmZl91cmxfam9pbihkZXN0LCBzaXplb2YoZGVzdCksIE5VTEwsIE5VTEwsIGhvc3QsIHBvcnQsIE5VTEwpOworICAgICAgICBmZl91cmxfam9pbihidWYsIHNpemVvZihidWYpLCAiaHR0cHByb3h5IiwgcHJveHlfYXV0aCwgcHJveHlfaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgcHJveHlfcG9ydCwgIi8lcyIsIGRlc3QpOworICAgIH0KKworICAgIHJldCA9IGZmdXJsX29wZW4oJmMtPnRjcCwgYnVmLCBBVklPX0ZMQUdfUkVBRF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwpOworICAgIGlmIChyZXQpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBjLT5mZCA9IGZmdXJsX2dldF9maWxlX2hhbmRsZShjLT50Y3ApOworCisjaWYgQ09ORklHX0dOVVRMUworICAgIGdudXRsc19pbml0KCZjLT5zZXNzaW9uLCBjLT5saXN0ZW4gPyBHTlVUTFNfU0VSVkVSIDogR05VVExTX0NMSUVOVCk7CisgICAgaWYgKCFjLT5saXN0ZW4gJiYgIW51bWVyaWNob3N0KQorICAgICAgICBnbnV0bHNfc2VydmVyX25hbWVfc2V0KGMtPnNlc3Npb24sIEdOVVRMU19OQU1FX0ROUywgaG9zdCwgc3RybGVuKGhvc3QpKTsKKyAgICBnbnV0bHNfY2VydGlmaWNhdGVfYWxsb2NhdGVfY3JlZGVudGlhbHMoJmMtPmNyZWQpOworICAgIHNldF9vcHRpb25zKGgsIHVyaSk7CisgICAgaWYgKGMtPmNhX2ZpbGUpIHsKKyAgICAgICAgcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X3RydXN0X2ZpbGUoYy0+Y3JlZCwgYy0+Y2FfZmlsZSwgR05VVExTX1g1MDlfRk1UX1BFTSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIiVzXG4iLCBnbnV0bHNfc3RyZXJyb3IocmV0KSk7CisgICAgfQorI2lmIEdOVVRMU19WRVJTSU9OX01BSk9SID49IDMKKyAgICBlbHNlCisgICAgICAgIGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9zeXN0ZW1fdHJ1c3QoYy0+Y3JlZCk7CisjZW5kaWYKKyAgICBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3ZlcmlmeV9mbGFncyhjLT5jcmVkLCBjLT52ZXJpZnkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdOVVRMU19WRVJJRllfQUxMT1dfWDUwOV9WMV9DQV9DUlQgOiAwKTsKKyAgICBpZiAoYy0+Y2VydF9maWxlICYmIGMtPmtleV9maWxlKSB7CisgICAgICAgIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9rZXlfZmlsZShjLT5jcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y2VydF9maWxlLCBjLT5rZXlfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdOVVRMU19YNTA5X0ZNVF9QRU0pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCBjZXJ0L2tleSBmaWxlcyAlcyBhbmQgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGMtPmNlcnRfZmlsZSwgYy0+a2V5X2ZpbGUsIGdudXRsc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYy0+Y2VydF9maWxlIHx8IGMtPmtleV9maWxlKQorICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiY2VydCBhbmQga2V5IHJlcXVpcmVkXG4iKTsKKyAgICBnbnV0bHNfY3JlZGVudGlhbHNfc2V0KGMtPnNlc3Npb24sIEdOVVRMU19DUkRfQ0VSVElGSUNBVEUsIGMtPmNyZWQpOworICAgIGdudXRsc190cmFuc3BvcnRfc2V0X3B0cihjLT5zZXNzaW9uLCAoZ251dGxzX3RyYW5zcG9ydF9wdHJfdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludHB0cl90KSBjLT5mZCk7CisgICAgZ251dGxzX3ByaW9yaXR5X3NldF9kaXJlY3QoYy0+c2Vzc2lvbiwgIk5PUk1BTCIsIE5VTEwpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHJldCA9IGdudXRsc19oYW5kc2hha2UoYy0+c2Vzc2lvbik7CisgICAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoKHJldCA9IGRvX3Rsc19wb2xsKGgsIHJldCkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGMtPnZlcmlmeSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgc3RhdHVzLCBjZXJ0X2xpc3Rfc2l6ZTsKKyAgICAgICAgZ251dGxzX3g1MDlfY3J0X3QgY2VydDsKKyAgICAgICAgY29uc3QgZ251dGxzX2RhdHVtX3QgKmNlcnRfbGlzdDsKKyAgICAgICAgaWYgKChyZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfdmVyaWZ5X3BlZXJzMihjLT5zZXNzaW9uLCAmc3RhdHVzKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHZlcmlmeSBwZWVyIGNlcnRpZmljYXRlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdudXRsc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzICYgR05VVExTX0NFUlRfSU5WQUxJRCkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlBlZXIgY2VydGlmaWNhdGUgZmFpbGVkIHZlcmlmaWNhdGlvblxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdudXRsc19jZXJ0aWZpY2F0ZV90eXBlX2dldChjLT5zZXNzaW9uKSAhPSBHTlVUTFNfQ1JUX1g1MDkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjZXJ0aWZpY2F0ZSB0eXBlXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBnbnV0bHNfeDUwOV9jcnRfaW5pdCgmY2VydCk7CisgICAgICAgIGNlcnRfbGlzdCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9nZXRfcGVlcnMoYy0+c2Vzc2lvbiwgJmNlcnRfbGlzdF9zaXplKTsKKyAgICAgICAgZ251dGxzX3g1MDlfY3J0X2ltcG9ydChjZXJ0LCBjZXJ0X2xpc3QsIEdOVVRMU19YNTA5X0ZNVF9ERVIpOworICAgICAgICByZXQgPSBnbnV0bHNfeDUwOV9jcnRfY2hlY2tfaG9zdG5hbWUoY2VydCwgaG9zdCk7CisgICAgICAgIGdudXRsc194NTA5X2NydF9kZWluaXQoY2VydCk7CisgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJUaGUgY2VydGlmaWNhdGUncyBvd25lciBkb2VzIG5vdCBtYXRjaCBob3N0bmFtZSAlc1xuIiwgaG9zdCk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisjZWxpZiBDT05GSUdfT1BFTlNTTAorICAgIGMtPmN0eCA9IFNTTF9DVFhfbmV3KGMtPmxpc3RlbiA/IFRMU3YxX3NlcnZlcl9tZXRob2QoKSA6IFRMU3YxX2NsaWVudF9tZXRob2QoKSk7CisgICAgaWYgKCFjLT5jdHgpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIiVzXG4iLCBFUlJfZXJyb3Jfc3RyaW5nKEVSUl9nZXRfZXJyb3IoKSwgTlVMTCkpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgc2V0X29wdGlvbnMoaCwgdXJpKTsKKyAgICBpZiAoYy0+Y2FfZmlsZSkgeworICAgICAgICBpZiAoIVNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGMtPmN0eCwgYy0+Y2FfZmlsZSwgTlVMTCkpCisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMgJXNcbiIsIEVSUl9lcnJvcl9zdHJpbmcoRVJSX2dldF9lcnJvcigpLCBOVUxMKSk7CisgICAgfQorICAgIGlmIChjLT5jZXJ0X2ZpbGUgJiYgIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoYy0+Y3R4LCBjLT5jZXJ0X2ZpbGUpKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gbG9hZCBjZXJ0IGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgYy0+Y2VydF9maWxlLCBFUlJfZXJyb3Jfc3RyaW5nKEVSUl9nZXRfZXJyb3IoKSwgTlVMTCkpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGMtPmtleV9maWxlICYmICFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoYy0+Y3R4LCBjLT5rZXlfZmlsZSwgU1NMX0ZJTEVUWVBFX1BFTSkpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBsb2FkIGtleSBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGMtPmtleV9maWxlLCBFUlJfZXJyb3Jfc3RyaW5nKEVSUl9nZXRfZXJyb3IoKSwgTlVMTCkpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgLy8gTm90ZSwgdGhpcyBkb2Vzbid0IGNoZWNrIHRoYXQgdGhlIHBlZXIgY2VydGlmaWNhdGUgYWN0dWFsbHkgbWF0Y2hlcworICAgIC8vIHRoZSByZXF1ZXN0ZWQgaG9zdG5hbWUuCisgICAgaWYgKGMtPnZlcmlmeSkKKyAgICAgICAgU1NMX0NUWF9zZXRfdmVyaWZ5KGMtPmN0eCwgU1NMX1ZFUklGWV9QRUVSfFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQsIE5VTEwpOworICAgIGMtPnNzbCA9IFNTTF9uZXcoYy0+Y3R4KTsKKyAgICBpZiAoIWMtPnNzbCkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiJXNcbiIsIEVSUl9lcnJvcl9zdHJpbmcoRVJSX2dldF9lcnJvcigpLCBOVUxMKSk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBTU0xfc2V0X2ZkKGMtPnNzbCwgYy0+ZmQpOworICAgIGlmICghYy0+bGlzdGVuICYmICFudW1lcmljaG9zdCkKKyAgICAgICAgU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKGMtPnNzbCwgaG9zdCk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcmV0ID0gYy0+bGlzdGVuID8gU1NMX2FjY2VwdChjLT5zc2wpIDogU1NMX2Nvbm5lY3QoYy0+c3NsKTsKKyAgICAgICAgaWYgKHJldCA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIG5lZ290aWF0ZSBUTFMvU1NMIHNlc3Npb25cbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmICgocmV0ID0gZG9fdGxzX3BvbGwoaCwgcmV0KSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworZmFpbDoKKyAgICBUTFNfZnJlZShjKTsKKyAgICBpZiAoYy0+dGNwKQorICAgICAgICBmZnVybF9jbG9zZShjLT50Y3ApOworICAgIGZmX3Rsc19kZWluaXQoKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRsc19yZWFkKFVSTENvbnRleHQgKmgsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgVExTQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpbnQgcmV0ID0gVExTX3JlYWQoYywgYnVmLCBzaXplKTsKKyAgICAgICAgaWYgKHJldCA+IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIGlmICgocmV0ID0gZG9fdGxzX3BvbGwoaCwgcmV0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGxzX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgVExTQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpbnQgcmV0ID0gVExTX3dyaXRlKGMsIGJ1Ziwgc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPiAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICBpZiAoKHJldCA9IGRvX3Rsc19wb2xsKGgsIHJldCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRsc19jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIFRMU0NvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgVExTX3NodXRkb3duKGMpOworICAgIFRMU19mcmVlKGMpOworICAgIGZmdXJsX2Nsb3NlKGMtPnRjcCk7CisgICAgZmZfdGxzX2RlaW5pdCgpOworICAgIHJldHVybiAwOworfQorCitVUkxQcm90b2NvbCBmZl90bHNfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInRscyIsCisgICAgLnVybF9vcGVuICAgICAgID0gdGxzX29wZW4sCisgICAgLnVybF9yZWFkICAgICAgID0gdGxzX3JlYWQsCisgICAgLnVybF93cml0ZSAgICAgID0gdGxzX3dyaXRlLAorICAgIC51cmxfY2xvc2UgICAgICA9IHRsc19jbG9zZSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVExTQ29udGV4dCksCisgICAgLmZsYWdzICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKKyAgICAucHJpdl9kYXRhX2NsYXNzID0gJnRsc19jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdG12LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdG12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNzJmNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC90bXYuYwpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIDgwODhmbGV4IFRNViBmaWxlIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSBEYW5pZWwgVmVya2FtcCA8ZGFuaWVsIGF0IGRydi5udT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogODA4OGZsZXggVE1WIGZpbGUgZGVtdXhlcgorICogQGF1dGhvciBEYW5pZWwgVmVya2FtcAorICogQHNlZSBodHRwOi8vd3d3Lm9sZHNrb29sLm9yZy9wYy84MDg4X0NvcnJ1cHRpb24KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZW51bSB7CisgICAgVE1WX1BBRERJTkcgPSAweDAxLAorICAgIFRNVl9TVEVSRU8gID0gMHgwMiwKK307CisKKyNkZWZpbmUgVE1WX1RBRyBNS1RBRygnVCcsICdNJywgJ0EnLCAnVicpCisKK3R5cGVkZWYgc3RydWN0IFRNVkNvbnRleHQgeworICAgIHVuc2lnbmVkIGF1ZGlvX2NodW5rX3NpemU7CisgICAgdW5zaWduZWQgdmlkZW9fY2h1bmtfc2l6ZTsKKyAgICB1bnNpZ25lZCBwYWRkaW5nOworICAgIHVuc2lnbmVkIHN0cmVhbV9pbmRleDsKK30gVE1WQ29udGV4dDsKKworI2RlZmluZSBUTVZfSEVBREVSX1NJWkUgICAgICAgMTIKKworI2RlZmluZSBQUk9CRV9NSU5fU0FNUExFX1JBVEUgNTAwMAorI2RlZmluZSBQUk9CRV9NQVhfRlBTICAgICAgICAgMTIwCisjZGVmaW5lIFBST0JFX01JTl9BVURJT19TSVpFICAoUFJPQkVfTUlOX1NBTVBMRV9SQVRFIC8gUFJPQkVfTUFYX0ZQUykKKworc3RhdGljIGludCB0bXZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKEFWX1JMMzIocC0+YnVmKSAgID09IFRNVl9UQUcgJiYKKyAgICAgICAgQVZfUkwxNihwLT5idWYrNCkgPj0gUFJPQkVfTUlOX1NBTVBMRV9SQVRFICYmCisgICAgICAgIEFWX1JMMTYocC0+YnVmKzYpID49IFBST0JFX01JTl9BVURJT19TSVpFICAmJgorICAgICAgICAgICAgICAgIXAtPmJ1Zls4XSAmJiAvLyBjb21wcmVzc2lvbiBtZXRob2QKKyAgICAgICAgICAgICAgICBwLT5idWZbOV0gJiYgLy8gY2hhciBjb2xzCisgICAgICAgICAgICAgICAgcC0+YnVmWzEwXSkgIC8vIGNoYXIgcm93cworICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLworICAgICAgICAgICAgKChwLT5idWZbOV0gPT0gNDAgJiYgcC0+YnVmWzEwXSA9PSAyNSkgPyAxIDogNCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG12X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBUTVZDb250ZXh0ICp0bXYgICA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqdnN0LCAqYXN0OworICAgIEFWUmF0aW9uYWwgZnBzOworICAgIHVuc2lnbmVkIGNvbXBfbWV0aG9kLCBjaGFyX2NvbHMsIGNoYXJfcm93cywgZmVhdHVyZXM7CisKKyAgICBpZiAoYXZpb19ybDMyKHBiKSAhPSBUTVZfVEFHKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoISh2c3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmICghKGFzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMTYocGIpOworICAgIGlmICghYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc2FtcGxlIHJhdGVcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdG12LT5hdWRpb19jaHVua19zaXplICAgPSBhdmlvX3JsMTYocGIpOworICAgIGlmICghdG12LT5hdWRpb19jaHVua19zaXplKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGF1ZGlvIGNodW5rIHNpemVcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY29tcF9tZXRob2QgICAgICAgICAgICAgPSBhdmlvX3I4KHBiKTsKKyAgICBpZiAoY29tcF9tZXRob2QpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGNvbXByZXNzaW9uIG1ldGhvZCAlZFxuIiwKKyAgICAgICAgICAgICAgIGNvbXBfbWV0aG9kKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGNoYXJfY29scyA9IGF2aW9fcjgocGIpOworICAgIGNoYXJfcm93cyA9IGF2aW9fcjgocGIpOworICAgIHRtdi0+dmlkZW9fY2h1bmtfc2l6ZSA9IGNoYXJfY29scyAqIGNoYXJfcm93cyAqIDI7CisKKyAgICBmZWF0dXJlcyAgPSBhdmlvX3I4KHBiKTsKKyAgICBpZiAoZmVhdHVyZXMgJiB+KFRNVl9QQURESU5HIHwgVE1WX1NURVJFTykpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGZlYXR1cmVzIDB4JTAyeFxuIiwKKyAgICAgICAgICAgICAgIGZlYXR1cmVzICYgfihUTVZfUEFERElORyB8IFRNVl9TVEVSRU8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGFzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgaWYgKGZlYXR1cmVzICYgVE1WX1NURVJFTykgeworICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDI7CisgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICB9IGVsc2UgeworICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgfQorICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7CisgICAgYXN0LT5jb2RlYy0+Yml0X3JhdGUgICAgICAgICAgICAgID0gYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgMzIsIDEsIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKworICAgIGZwcy5udW0gPSBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqIGFzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgIGZwcy5kZW4gPSB0bXYtPmF1ZGlvX2NodW5rX3NpemU7CisgICAgYXZfcmVkdWNlKCZmcHMubnVtLCAmZnBzLmRlbiwgZnBzLm51bSwgZnBzLmRlbiwgMHhGRkZGRkZGRkxMKTsKKworICAgIHZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1RNVjsKKyAgICB2c3QtPmNvZGVjLT5waXhfZm10ICAgID0gQVZfUElYX0ZNVF9QQUw4OworICAgIHZzdC0+Y29kZWMtPndpZHRoICAgICAgPSBjaGFyX2NvbHMgKiA4OworICAgIHZzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBjaGFyX3Jvd3MgKiA4OworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCAzMiwgZnBzLmRlbiwgZnBzLm51bSk7CisKKyAgICBpZiAoZmVhdHVyZXMgJiBUTVZfUEFERElORykKKyAgICAgICAgdG12LT5wYWRkaW5nID0KKyAgICAgICAgICAgICgodG12LT52aWRlb19jaHVua19zaXplICsgdG12LT5hdWRpb19jaHVua19zaXplICsgNTExKSAmIH41MTEpIC0KKyAgICAgICAgICAgICAodG12LT52aWRlb19jaHVua19zaXplICsgdG12LT5hdWRpb19jaHVua19zaXplKTsKKworICAgIHZzdC0+Y29kZWMtPmJpdF9yYXRlID0gKCh0bXYtPnZpZGVvX2NodW5rX3NpemUgKyB0bXYtPnBhZGRpbmcpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHMubnVtICogOCkgLyBmcHMuZGVuOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG12X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBUTVZDb250ZXh0ICp0bXYgICA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgcmV0LCBwa3Rfc2l6ZSA9IHRtdi0+c3RyZWFtX2luZGV4ID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtdi0+YXVkaW9fY2h1bmtfc2l6ZSA6IHRtdi0+dmlkZW9fY2h1bmtfc2l6ZTsKKworICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIHBrdF9zaXplKTsKKworICAgIGlmICh0bXYtPnN0cmVhbV9pbmRleCkKKyAgICAgICAgYXZpb19za2lwKHBiLCB0bXYtPnBhZGRpbmcpOworCisgICAgcGt0LT5zdHJlYW1faW5kZXggID0gdG12LT5zdHJlYW1faW5kZXg7CisgICAgdG12LT5zdHJlYW1faW5kZXggXj0gMTsKKyAgICBwa3QtPmZsYWdzICAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRtdl9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgVE1WQ29udGV4dCAqdG12ID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgcG9zOworCisgICAgaWYgKHN0cmVhbV9pbmRleCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcG9zID0gdGltZXN0YW1wICoKKyAgICAgICAgICAodG12LT5hdWRpb19jaHVua19zaXplICsgdG12LT52aWRlb19jaHVua19zaXplICsgdG12LT5wYWRkaW5nKTsKKworICAgIGlmIChhdmlvX3NlZWsocy0+cGIsIHBvcyArIFRNVl9IRUFERVJfU0laRSwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHRtdi0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl90bXZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidG12IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiODA4OGZsZXggVE1WIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFRNVkNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHRtdl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSB0bXZfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gdG12X3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IHRtdl9yZWFkX3NlZWssCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdHRhLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdHRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3NGZkNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC90dGEuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIFRUQSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQWxleCBCZXJlZ3N6YXN6aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorI2luY2x1ZGUgImFwZXRhZy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiaWQzdjEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0b3RhbGZyYW1lcywgY3VycmVudGZyYW1lOworICAgIGludCBmcmFtZV9zaXplOworICAgIGludCBsYXN0X2ZyYW1lX3NpemU7Cit9IFRUQUNvbnRleHQ7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHR0YV9jaGVja19jcmModW5zaWduZWQgbG9uZyBjaGVja3N1bSwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuKQoreworICAgIHJldHVybiBhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMzJfSUVFRV9MRSksIGNoZWNrc3VtLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgdHRhX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChBVl9STDMyKCZwLT5idWZbMF0pID09IE1LVEFHKCdUJywgJ1QnLCAnQScsICcxJykgJiYKKyAgICAgICAgKEFWX1JMMTYoJnAtPmJ1Zls0XSkgPT0gMSB8fCBBVl9STDE2KCZwLT5idWZbNF0pID09IDIpICYmCisgICAgICAgIEFWX1JMMTYoJnAtPmJ1Zls2XSkgPiAwICYmCisgICAgICAgIEFWX1JMMTYoJnAtPmJ1Zls4XSkgPiAwICYmCisgICAgICAgIEFWX1JMMzIoJnAtPmJ1ZlsxMF0pID4gMCkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMzA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHRhX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBUVEFDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgaSwgY2hhbm5lbHMsIGJwcywgc2FtcGxlcmF0ZTsKKyAgICB1aW50NjRfdCBmcmFtZXBvcywgc3RhcnRfb2Zmc2V0OworICAgIHVpbnQzMl90IG5iX3NhbXBsZXMsIGNyYzsKKworICAgIGZmX2lkM3YxX3JlYWQocyk7CisKKyAgICBzdGFydF9vZmZzZXQgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIGZmaW9faW5pdF9jaGVja3N1bShzLT5wYiwgdHRhX2NoZWNrX2NyYywgVUlOVDMyX01BWCk7CisgICAgaWYgKGF2aW9fcmwzMihzLT5wYikgIT0gQVZfUkwzMigiVFRBMSIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGF2aW9fc2tpcChzLT5wYiwgMik7IC8vIEZJWE1FOiBmbGFncworICAgIGNoYW5uZWxzID0gYXZpb19ybDE2KHMtPnBiKTsKKyAgICBicHMgPSBhdmlvX3JsMTYocy0+cGIpOworICAgIHNhbXBsZXJhdGUgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIGlmKHNhbXBsZXJhdGUgPD0gMCB8fCBzYW1wbGVyYXRlID4gMTAwMDAwMCl7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJub25zZW5zZSBzYW1wbGVyYXRlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgbmJfc2FtcGxlcyA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgaWYgKCFuYl9zYW1wbGVzKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgY3JjID0gZmZpb19nZXRfY2hlY2tzdW0ocy0+cGIpIF4gVUlOVDMyX01BWDsKKyAgICBpZiAoY3JjICE9IGF2aW9fcmwzMihzLT5wYikpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkhlYWRlciBDUkMgZXJyb3JcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBjLT5mcmFtZV9zaXplICAgICAgPSBzYW1wbGVyYXRlICogMjU2IC8gMjQ1OworICAgIGMtPmxhc3RfZnJhbWVfc2l6ZSA9IG5iX3NhbXBsZXMgJSBjLT5mcmFtZV9zaXplOworICAgIGlmICghYy0+bGFzdF9mcmFtZV9zaXplKQorICAgICAgICBjLT5sYXN0X2ZyYW1lX3NpemUgPSBjLT5mcmFtZV9zaXplOworICAgIGMtPnRvdGFsZnJhbWVzID0gbmJfc2FtcGxlcyAvIGMtPmZyYW1lX3NpemUgKyAoYy0+bGFzdF9mcmFtZV9zaXplIDwgYy0+ZnJhbWVfc2l6ZSk7CisgICAgYy0+Y3VycmVudGZyYW1lID0gMDsKKworICAgIGlmKGMtPnRvdGFsZnJhbWVzID49IFVJTlRfTUFYL3NpemVvZih1aW50MzJfdCkgfHwgYy0+dG90YWxmcmFtZXMgPD0gMCl7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0b3RhbGZyYW1lcyAlZCBpbnZhbGlkXG4iLCBjLT50b3RhbGZyYW1lcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHNhbXBsZXJhdGUpOworICAgIHN0LT5zdGFydF90aW1lID0gMDsKKyAgICBzdC0+ZHVyYXRpb24gPSBuYl9zYW1wbGVzOworCisgICAgZnJhbWVwb3MgPSBhdmlvX3RlbGwocy0+cGIpICsgNCpjLT50b3RhbGZyYW1lcyArIDQ7CisKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgYXZpb190ZWxsKHMtPnBiKSAtIHN0YXJ0X29mZnNldCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmlvX3NlZWsocy0+cGIsIHN0YXJ0X29mZnNldCwgU0VFS19TRVQpOworICAgIGF2aW9fcmVhZChzLT5wYiwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgZmZpb19pbml0X2NoZWNrc3VtKHMtPnBiLCB0dGFfY2hlY2tfY3JjLCBVSU5UMzJfTUFYKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+dG90YWxmcmFtZXM7IGkrKykgeworICAgICAgICB1aW50MzJfdCBzaXplID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LCBmcmFtZXBvcywgaSAqIGMtPmZyYW1lX3NpemUsIHNpemUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVklOREVYX0tFWUZSQU1FKTsKKyAgICAgICAgZnJhbWVwb3MgKz0gc2l6ZTsKKyAgICB9CisgICAgY3JjID0gZmZpb19nZXRfY2hlY2tzdW0ocy0+cGIpIF4gVUlOVDMyX01BWDsKKyAgICBpZiAoY3JjICE9IGF2aW9fcmwzMihzLT5wYikpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlNlZWsgdGFibGUgQ1JDIGVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9UVEE7CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzYW1wbGVyYXRlOworICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYnBzOworCisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSkgeworICAgICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgIGZmX2FwZV9wYXJzZV90YWcocyk7CisgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHRhX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBUVEFDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgaW50IHNpemUsIHJldDsKKworICAgIC8vIEZJWE1FIQorICAgIGlmIChjLT5jdXJyZW50ZnJhbWUgPj0gYy0+dG90YWxmcmFtZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHNpemUgPSBzdC0+aW5kZXhfZW50cmllc1tjLT5jdXJyZW50ZnJhbWVdLnNpemU7CisKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOworICAgIHBrdC0+ZHRzID0gc3QtPmluZGV4X2VudHJpZXNbYy0+Y3VycmVudGZyYW1lKytdLnRpbWVzdGFtcDsKKyAgICBwa3QtPmR1cmF0aW9uID0gYy0+Y3VycmVudGZyYW1lID09IGMtPnRvdGFsZnJhbWVzID8gYy0+bGFzdF9mcmFtZV9zaXplIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZnJhbWVfc2l6ZTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR0YV9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQoreworICAgIFRUQUNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgIGludCBpbmRleCA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QsIHRpbWVzdGFtcCwgZmxhZ3MpOworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoYXZpb19zZWVrKHMtPnBiLCBzdC0+aW5kZXhfZW50cmllc1tpbmRleF0ucG9zLCBTRUVLX1NFVCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBjLT5jdXJyZW50ZnJhbWUgPSBpbmRleDsKKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3R0YV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ0dGEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUVEEgKFRydWUgQXVkaW8pIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFRUQUNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHR0YV9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSB0dGFfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gdHRhX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IHR0YV9yZWFkX3NlZWssCisgICAgLmV4dGVuc2lvbnMgICAgID0gInR0YSIsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3R0eS5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3R0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOWI1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvdHR5LmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBUZWxlLXR5cGV3cml0ZXIgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUZWxlLXR5cGV3cml0ZXIgZGVtdXhlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInNhdWNlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgY2hhcnNfcGVyX2ZyYW1lOworICAgIHVpbnQ2NF90IGZzaXplOyAgLyoqPCBmaWxlIHNpemUgbGVzcyBtZXRhZGF0YSBidWZmZXIgKi8KKyAgICBpbnQgd2lkdGgsIGhlaWdodDsgLyoqPCBTZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4gKi8KKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZTsgLyoqPCBTZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4gKi8KK30gVHR5RGVtdXhDb250ZXh0OworCisvKioKKyAqIFBhcnNlIEVGSSBoZWFkZXIKKyAqLworc3RhdGljIGludCBlZmlfcmVhZChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCB1aW50NjRfdCBzdGFydF9wb3MpCit7CisgICAgVHR5RGVtdXhDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBhdmN0eC0+cGI7CisgICAgY2hhciBidWZbMzddOworICAgIGludCBsZW47CisKKyAgICBhdmlvX3NlZWsocGIsIHN0YXJ0X3BvcywgU0VFS19TRVQpOworICAgIGlmIChhdmlvX3I4KHBiKSAhPSAweDFBKQorICAgICAgICByZXR1cm4gLTE7CisKKyNkZWZpbmUgR0VUX0VGSV9NRVRBKG5hbWUsc2l6ZSkgXAorICAgIGxlbiA9IGF2aW9fcjgocGIpOyBcCisgICAgaWYgKGxlbiA8IDEgfHwgbGVuID4gc2l6ZSkgXAorICAgICAgICByZXR1cm4gLTE7IFwKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBidWYsIHNpemUpID09IHNpemUpIHsgXAorICAgICAgICBidWZbbGVuXSA9IDA7IFwKKyAgICAgICAgYXZfZGljdF9zZXQoJmF2Y3R4LT5tZXRhZGF0YSwgbmFtZSwgYnVmLCAwKTsgXAorICAgIH0KKworICAgIEdFVF9FRklfTUVUQSgiZmlsZW5hbWUiLCAxMikKKyAgICBHRVRfRUZJX01FVEEoInRpdGxlIiwgICAgMzYpCisKKyAgICBzLT5mc2l6ZSA9IHN0YXJ0X3BvczsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQoreworICAgIFR0eURlbXV4Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldCA9IDA7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShhdmN0eCwgTlVMTCk7CisKKyAgICBpZiAoIXN0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgID0gMDsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BTlNJOworCisgICAgc3QtPmNvZGVjLT53aWR0aCAgPSBzLT53aWR0aDsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2MCwgcy0+ZnJhbWVyYXRlLmRlbiwgcy0+ZnJhbWVyYXRlLm51bSk7CisgICAgc3QtPmF2Z19mcmFtZV9yYXRlID0gcy0+ZnJhbWVyYXRlOworCisgICAgLyogc2ltdWxhdGUgdHR5IGRpc3BsYXkgc3BlZWQgKi8KKyAgICBzLT5jaGFyc19wZXJfZnJhbWUgPSBGRk1BWChhdl9xMmQoc3QtPnRpbWVfYmFzZSkqcy0+Y2hhcnNfcGVyX2ZyYW1lLCAxKTsKKworICAgIGlmIChhdmN0eC0+cGItPnNlZWthYmxlKSB7CisgICAgICAgIHMtPmZzaXplID0gYXZpb19zaXplKGF2Y3R4LT5wYik7CisgICAgICAgIHN0LT5kdXJhdGlvbiA9IChzLT5mc2l6ZSArIHMtPmNoYXJzX3Blcl9mcmFtZSAtIDEpIC8gcy0+Y2hhcnNfcGVyX2ZyYW1lOworCisgICAgICAgIGlmIChmZl9zYXVjZV9yZWFkKGF2Y3R4LCAmcy0+ZnNpemUsIDAsIDApIDwgMCkKKyAgICAgICAgICAgIGVmaV9yZWFkKGF2Y3R4LCBzLT5mc2l6ZSAtIDUxKTsKKworICAgICAgICBhdmlvX3NlZWsoYXZjdHgtPnBiLCAwLCBTRUVLX1NFVCk7CisgICAgfQorCitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBUdHlEZW11eENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBuOworCisgICAgaWYgKGF2aW9fZmVvZihhdmN0eC0+cGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBuID0gcy0+Y2hhcnNfcGVyX2ZyYW1lOworICAgIGlmIChzLT5mc2l6ZSkgeworICAgICAgICAvLyBpZ25vcmUgbWV0YWRhdGEgYnVmZmVyCisgICAgICAgIHVpbnQ2NF90IHAgPSBhdmlvX3RlbGwoYXZjdHgtPnBiKTsKKyAgICAgICAgaWYgKHAgPT0gcy0+ZnNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIGlmIChwICsgcy0+Y2hhcnNfcGVyX2ZyYW1lID4gcy0+ZnNpemUpCisgICAgICAgICAgICBuID0gcy0+ZnNpemUgLSBwOworICAgIH0KKworICAgIHBrdC0+c2l6ZSA9IGF2X2dldF9wYWNrZXQoYXZjdHgtPnBiLCBwa3QsIG4pOworICAgIGlmIChwa3QtPnNpemUgPCAwKQorICAgICAgICByZXR1cm4gcGt0LT5zaXplOworICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihUdHlEZW11eENvbnRleHQsIHgpCisjZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJjaGFyc19wZXJfZnJhbWUiLCAiIiwgb2Zmc2V0b2YoVHR5RGVtdXhDb250ZXh0LCBjaGFyc19wZXJfZnJhbWUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gNjAwMH0sIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNfSwKKyAgICB7ICJ2aWRlb19zaXplIiwgIkEgc3RyaW5nIGRlc2NyaWJpbmcgZnJhbWUgc2l6ZSwgc3VjaCBhcyA2NDB4NDgwIG9yIGhkNzIwLiIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyID0gTlVMTH0sIDAsIDAsIERFQyB9LAorICAgIHsgImZyYW1lcmF0ZSIsICIiLCBPRkZTRVQoZnJhbWVyYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgREVDIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB0dHlfZGVtdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAiVFRZIGRlbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgICAgICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl90dHlfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidHR5IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVGVsZS10eXBld3JpdGVyIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFR0eURlbXV4Q29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgID0gcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gcmVhZF9wYWNrZXQsCisgICAgLmV4dGVuc2lvbnMgICAgID0gImFucyxhcnQsYXNjLGRpeixpY2UsbmZvLHR4dCx2dCIsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnR0eV9kZW11eGVyX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC90eGQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC90eGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWMzN2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3R4ZC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogUmVuZGVyd2FyZSBUZVh0dXJlIERpY3Rpb25hcnkgKC50eGQpIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJdm8gdmFuIFBvb3J0ZW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgVFhEX0ZJTEUgICAgICAgICAgICAweDE2CisjZGVmaW5lIFRYRF9JTkZPICAgICAgICAgICAgMHgwMQorI2RlZmluZSBUWERfRVhUUkEgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgVFhEX1RFWFRVUkUgICAgICAgICAweDE1CisjZGVmaW5lIFRYRF9URVhUVVJFX0RBVEEgICAgMHgwMQorI2RlZmluZSBUWERfTUFSS0VSICAgICAgICAgIDB4MTgwM2ZmZmYKKyNkZWZpbmUgVFhEX01BUktFUjIgICAgICAgICAweDEwMDNmZmZmCisKK3N0YXRpYyBpbnQgdHhkX3Byb2JlKEFWUHJvYmVEYXRhICogcGQpIHsKKyAgICBpZiAoQVZfUkwzMihwZC0+YnVmICApID09IFRYRF9GSUxFICYmCisgICAgICAgKEFWX1JMMzIocGQtPmJ1Zis4KSA9PSBUWERfTUFSS0VSIHx8IEFWX1JMMzIocGQtPmJ1Zis4KSA9PSBUWERfTUFSS0VSMikpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0eGRfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKSB7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9UWEQ7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDUpOworICAgIHN0LT5hdmdfZnJhbWVfcmF0ZSA9IGF2X2ludl9xKHN0LT50aW1lX2Jhc2UpOworICAgIC8qIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgZXh0cmFjdGVkIGZyb20gdGhlIGNvbXByZXNzZWQgYml0c3RyZWFtICovCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0eGRfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KSB7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgdW5zaWduZWQgaW50IGlkLCBjaHVua19zaXplLCBtYXJrZXI7CisgICAgaW50IHJldDsKKworbmV4dF9jaHVuazoKKyAgICBpZCAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICBjaHVua19zaXplID0gYXZpb19ybDMyKHBiKTsKKyAgICBtYXJrZXIgICAgID0gYXZpb19ybDMyKHBiKTsKKworICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgaWYgKG1hcmtlciAhPSBUWERfTUFSS0VSICYmIG1hcmtlciAhPSBUWERfTUFSS0VSMikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibWFya2VyIGRvZXMgbm90IG1hdGNoXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgVFhEX0lORk86CisgICAgICAgIGlmIChjaHVua19zaXplID4gMTAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUWERfRVhUUkE6CisgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgY2h1bmtfc2l6ZSk7CisgICAgY2FzZSBUWERfRklMRToKKyAgICBjYXNlIFRYRF9URVhUVVJFOgorICAgICAgICBnb3RvIG5leHRfY2h1bms7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVua25vd24gY2h1bmsgaWQgJWlcbiIsIGlkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBjaHVua19zaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl90eGRfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgPSAidHhkIiwKKyAgICAubG9uZ19uYW1lICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVuZGVyd2FyZSBUZVh0dXJlIERpY3Rpb25hcnkiKSwKKyAgICAucmVhZF9wcm9iZSAgPSB0eGRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyID0gdHhkX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCA9IHR4ZF9yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdWRwLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdWRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjNzkxMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC91ZHAuYwpAQCAtMCwwICsxLDk2OCBAQAorLyoKKyAqIFVEUCBwcm90b3R5cGUgc3RyZWFtaW5nIHN5c3RlbQorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBVRFAgcHJvdG9jb2wKKyAqLworCisjZGVmaW5lIF9CU0RfU09VUkNFICAgICAvKiBOZWVkZWQgZm9yIHVzaW5nIHN0cnVjdCBpcF9tcmVxIHdpdGggcmVjZW50IGdsaWJjICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9maWZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm5ldHdvcmsuaCIKKyNpbmNsdWRlICJvc19zdXBwb3J0LmgiCisjaW5jbHVkZSAidXJsLmgiCisKKyNpZiBIQVZFX1VEUExJVEVfSAorI2luY2x1ZGUgInVkcGxpdGUuaCIKKyNlbHNlCisvKiBPbiBtYW55IExpbnV4IHN5c3RlbXMsIHVkcGxpdGUuaCBpcyBtaXNzaW5nIGJ1dCB0aGUga2VybmVsIHN1cHBvcnRzIFVEUC1MaXRlLgorICogU28sIHdlIHByb3ZpZGUgYSBmYWxsYmFjayBoZXJlLgorICovCisjZGVmaW5lIFVEUExJVEVfU0VORF9DU0NPViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBVRFBMSVRFX1JFQ1ZfQ1NDT1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNlbmRpZgorCisjaWZuZGVmIElQUFJPVE9fVURQTElURQorI2RlZmluZSBJUFBST1RPX1VEUExJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM2CisjZW5kaWYKKworI2lmIEhBVkVfUFRIUkVBRF9DQU5DRUwKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1BUSFJFQURfQ0FOQ0VMCisjZGVmaW5lIEhBVkVfUFRIUkVBRF9DQU5DRUwgMAorI2VuZGlmCisKKyNpZm5kZWYgSVBWNl9BRERfTUVNQkVSU0hJUAorI2RlZmluZSBJUFY2X0FERF9NRU1CRVJTSElQIElQVjZfSk9JTl9HUk9VUAorI2RlZmluZSBJUFY2X0RST1BfTUVNQkVSU0hJUCBJUFY2X0xFQVZFX0dST1VQCisjZW5kaWYKKworI2RlZmluZSBVRFBfVFhfQlVGX1NJWkUgMzI3NjgKKyNkZWZpbmUgVURQX01BWF9QS1RfU0laRSA2NTUzNgorI2RlZmluZSBVRFBfSEVBREVSX1NJWkUgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHVkcF9mZDsKKyAgICBpbnQgdHRsOworICAgIGludCB1ZHBsaXRlX2NvdmVyYWdlOworICAgIGludCBidWZmZXJfc2l6ZTsKKyAgICBpbnQgaXNfbXVsdGljYXN0OworICAgIGludCBpc19icm9hZGNhc3Q7CisgICAgaW50IGxvY2FsX3BvcnQ7CisgICAgaW50IHJldXNlX3NvY2tldDsKKyAgICBpbnQgb3ZlcnJ1bl9ub25mYXRhbDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBkZXN0X2FkZHI7CisgICAgaW50IGRlc3RfYWRkcl9sZW47CisgICAgaW50IGlzX2Nvbm5lY3RlZDsKKworICAgIC8qIENpcmN1bGFyIEJ1ZmZlciB2YXJpYWJsZXMgZm9yIHVzZSBpbiBVRFAgcmVjZWl2ZSBjb2RlICovCisgICAgaW50IGNpcmN1bGFyX2J1ZmZlcl9zaXplOworICAgIEFWRmlmb0J1ZmZlciAqZmlmbzsKKyAgICBpbnQgY2lyY3VsYXJfYnVmZmVyX2Vycm9yOworI2lmIEhBVkVfUFRIUkVBRF9DQU5DRUwKKyAgICBwdGhyZWFkX3QgY2lyY3VsYXJfYnVmZmVyX3RocmVhZDsKKyAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7CisgICAgcHRocmVhZF9jb25kX3QgY29uZDsKKyAgICBpbnQgdGhyZWFkX3N0YXJ0ZWQ7CisjZW5kaWYKKyAgICB1aW50OF90IHRtcFtVRFBfTUFYX1BLVF9TSVpFKzRdOworICAgIGludCByZW1haW5pbmdfaW5fZGc7CisgICAgY2hhciAqbG9jYWxfYWRkcjsKKyAgICBpbnQgcGFja2V0X3NpemU7CisgICAgaW50IHRpbWVvdXQ7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgbG9jYWxfYWRkcl9zdG9yYWdlOworfSBVRFBDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihVRFBDb250ZXh0LCB4KQorI2RlZmluZSBEIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCisjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7Cit7ImJ1ZmZlcl9zaXplIiwgInNldCBwYWNrZXQgYnVmZmVyIHNpemUgaW4gYnl0ZXMiLCBPRkZTRVQoYnVmZmVyX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIER8RSB9LAoreyJsb2NhbHBvcnQiLCAic2V0IGxvY2FsIHBvcnQgdG8gYmluZCB0byIsIE9GRlNFVChsb2NhbF9wb3J0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBEfEUgfSwKK3sibG9jYWxhZGRyIiwgImNob29zZSBsb2NhbCBJUCBhZGRyZXNzIiwgT0ZGU0VUKGxvY2FsX2FkZHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIiJ9LCAwLCAwLCBEfEUgfSwKK3sidWRwbGl0ZV9jb3ZlcmFnZSIsICJjaG9vc2UgVURQTGl0ZSBoZWFkIHNpemUgd2hpY2ggc2hvdWxkIGJlIHZhbGlkYXRlZCBieSBjaGVja3N1bSIsIE9GRlNFVCh1ZHBsaXRlX2NvdmVyYWdlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBEfEUgfSwKK3sicGt0X3NpemUiLCAic2V0IHNpemUgb2YgVURQIHBhY2tldHMiLCBPRkZTRVQocGFja2V0X3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMTQ3Mn0sIDAsIElOVF9NQVgsIER8RSB9LAoreyJyZXVzZSIsICJleHBsaWNpdGx5IGFsbG93IG9yIGRpc2FsbG93IHJldXNpbmcgVURQIHNvY2tldHMiLCBPRkZTRVQocmV1c2Vfc29ja2V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxLCBEfEUgfSwKK3siYnJvYWRjYXN0IiwgImV4cGxpY2l0bHkgYWxsb3cgb3IgZGlzYWxsb3cgYnJvYWRjYXN0IGRlc3RpbmF0aW9uIiwgT0ZGU0VUKGlzX2Jyb2FkY2FzdCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMSwgRSB9LAoreyJ0dGwiLCAic2V0IHRoZSB0aW1lIHRvIGxpdmUgdmFsdWUgKGZvciBtdWx0aWNhc3Qgb25seSkiLCBPRkZTRVQodHRsKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDE2fSwgMCwgSU5UX01BWCwgRSB9LAoreyJjb25uZWN0IiwgInNldCBpZiBjb25uZWN0KCkgc2hvdWxkIGJlIGNhbGxlZCBvbiBzb2NrZXQiLCBPRkZTRVQoaXNfY29ubmVjdGVkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxLCBEfEUgfSwKKy8qIFRPRE8gJ3NvdXJjZXMnLCAnYmxvY2snIG9wdGlvbiAqLworeyJmaWZvX3NpemUiLCAic2V0IHRoZSBVRFAgcmVjZWl2aW5nIGNpcmN1bGFyIGJ1ZmZlciBzaXplLCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgcGFja2V0cyB3aXRoIHNpemUgb2YgMTg4IGJ5dGVzIiwgT0ZGU0VUKGNpcmN1bGFyX2J1ZmZlcl9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDcqNDA5Nn0sIDAsIElOVF9NQVgsIEQgfSwKK3sib3ZlcnJ1bl9ub25mYXRhbCIsICJzdXJ2aXZlIGluIGNhc2Ugb2YgVURQIHJlY2VpdmluZyBjaXJjdWxhciBidWZmZXIgb3ZlcnJ1biIsIE9GRlNFVChvdmVycnVuX25vbmZhdGFsKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxLCBEIH0sCit7InRpbWVvdXQiLCAic2V0IHJhaXNlIGVycm9yIHRpbWVvdXQgKG9ubHkgaW4gcmVhZCBtb2RlKSIsIE9GRlNFVCh0aW1lb3V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBEIH0sCit7TlVMTH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHVkcF9jb250ZXh0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICA9ICJ1ZHAiLAorICAgIC5pdGVtX25hbWUgICAgICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgdWRwbGl0ZV9jb250ZXh0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICA9ICJ1ZHBsaXRlIiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyB2b2lkIGxvZ19uZXRfZXJyb3Iodm9pZCAqY3R4LCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIHByZWZpeCkKK3sKKyAgICBjaGFyIGVycmJ1ZlsxMDBdOworICAgIGF2X3N0cmVycm9yKGZmX25ldGVycm5vKCksIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpOworICAgIGF2X2xvZyhjdHgsIGxldmVsLCAiJXM6ICVzXG4iLCBwcmVmaXgsIGVycmJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgdWRwX3NldF9tdWx0aWNhc3RfdHRsKGludCBzb2NrZmQsIGludCBtY2FzdFRUTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqYWRkcikKK3sKKyNpZmRlZiBJUF9NVUxUSUNBU1RfVFRMCisgICAgaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KHNvY2tmZCwgSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX1RUTCwgJm1jYXN0VFRMLCBzaXplb2YobWNhc3RUVEwpKSA8IDApIHsKKyAgICAgICAgICAgIGxvZ19uZXRfZXJyb3IoTlVMTCwgQVZfTE9HX0VSUk9SLCAic2V0c29ja29wdChJUF9NVUxUSUNBU1RfVFRMKSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChJUFBST1RPX0lQVjYpICYmIGRlZmluZWQoSVBWNl9NVUxUSUNBU1RfSE9QUykKKyAgICBpZiAoYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KHNvY2tmZCwgSVBQUk9UT19JUFY2LCBJUFY2X01VTFRJQ0FTVF9IT1BTLCAmbWNhc3RUVEwsIHNpemVvZihtY2FzdFRUTCkpIDwgMCkgeworICAgICAgICAgICAgbG9nX25ldF9lcnJvcihOVUxMLCBBVl9MT0dfRVJST1IsICJzZXRzb2Nrb3B0KElQVjZfTVVMVElDQVNUX0hPUFMpIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZHBfam9pbl9tdWx0aWNhc3RfZ3JvdXAoaW50IHNvY2tmZCwgc3RydWN0IHNvY2thZGRyICphZGRyLHN0cnVjdCBzb2NrYWRkciAqbG9jYWxfYWRkcikKK3sKKyNpZmRlZiBJUF9BRERfTUVNQkVSU0hJUAorICAgIGlmIChhZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgeworICAgICAgICBzdHJ1Y3QgaXBfbXJlcSBtcmVxOworCisgICAgICAgIG1yZXEuaW1yX211bHRpYWRkci5zX2FkZHIgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHIpLT5zaW5fYWRkci5zX2FkZHI7CisgICAgICAgIGlmIChsb2NhbF9hZGRyKQorICAgICAgICAgICAgbXJlcS5pbXJfaW50ZXJmYWNlPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWxvY2FsX2FkZHIpLT5zaW5fYWRkcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbXJlcS5pbXJfaW50ZXJmYWNlLnNfYWRkcj0gSU5BRERSX0FOWTsKKyAgICAgICAgaWYgKHNldHNvY2tvcHQoc29ja2ZkLCBJUFBST1RPX0lQLCBJUF9BRERfTUVNQkVSU0hJUCwgKGNvbnN0IHZvaWQgKikmbXJlcSwgc2l6ZW9mKG1yZXEpKSA8IDApIHsKKyAgICAgICAgICAgIGxvZ19uZXRfZXJyb3IoTlVMTCwgQVZfTE9HX0VSUk9SLCAic2V0c29ja29wdChJUF9BRERfTUVNQkVSU0hJUCkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorI2lmIEhBVkVfU1RSVUNUX0lQVjZfTVJFUSAmJiBkZWZpbmVkKElQUFJPVE9fSVBWNikKKyAgICBpZiAoYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgIHN0cnVjdCBpcHY2X21yZXEgbXJlcTY7CisKKyAgICAgICAgbWVtY3B5KCZtcmVxNi5pcHY2bXJfbXVsdGlhZGRyLCAmKCgoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHIpLT5zaW42X2FkZHIpLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisgICAgICAgIG1yZXE2LmlwdjZtcl9pbnRlcmZhY2U9IDA7CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KHNvY2tmZCwgSVBQUk9UT19JUFY2LCBJUFY2X0FERF9NRU1CRVJTSElQLCAmbXJlcTYsIHNpemVvZihtcmVxNikpIDwgMCkgeworICAgICAgICAgICAgbG9nX25ldF9lcnJvcihOVUxMLCBBVl9MT0dfRVJST1IsICJzZXRzb2Nrb3B0KElQVjZfQUREX01FTUJFUlNISVApIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZHBfbGVhdmVfbXVsdGljYXN0X2dyb3VwKGludCBzb2NrZmQsIHN0cnVjdCBzb2NrYWRkciAqYWRkcixzdHJ1Y3Qgc29ja2FkZHIgKmxvY2FsX2FkZHIpCit7CisjaWZkZWYgSVBfRFJPUF9NRU1CRVJTSElQCisgICAgaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICAgIHN0cnVjdCBpcF9tcmVxIG1yZXE7CisKKyAgICAgICAgbXJlcS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9ICgoc3RydWN0IHNvY2thZGRyX2luICopYWRkciktPnNpbl9hZGRyLnNfYWRkcjsKKyAgICAgICAgaWYgKGxvY2FsX2FkZHIpCisgICAgICAgICAgICBtcmVxLmltcl9pbnRlcmZhY2U9ICgoc3RydWN0IHNvY2thZGRyX2luICopbG9jYWxfYWRkciktPnNpbl9hZGRyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtcmVxLmltcl9pbnRlcmZhY2Uuc19hZGRyPSBJTkFERFJfQU5ZOworICAgICAgICBpZiAoc2V0c29ja29wdChzb2NrZmQsIElQUFJPVE9fSVAsIElQX0RST1BfTUVNQkVSU0hJUCwgKGNvbnN0IHZvaWQgKikmbXJlcSwgc2l6ZW9mKG1yZXEpKSA8IDApIHsKKyAgICAgICAgICAgIGxvZ19uZXRfZXJyb3IoTlVMTCwgQVZfTE9HX0VSUk9SLCAic2V0c29ja29wdChJUF9EUk9QX01FTUJFUlNISVApIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyNpZiBIQVZFX1NUUlVDVF9JUFY2X01SRVEgJiYgZGVmaW5lZChJUFBST1RPX0lQVjYpCisgICAgaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgICBzdHJ1Y3QgaXB2Nl9tcmVxIG1yZXE2OworCisgICAgICAgIG1lbWNweSgmbXJlcTYuaXB2Nm1yX211bHRpYWRkciwgJigoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyKS0+c2luNl9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworICAgICAgICBtcmVxNi5pcHY2bXJfaW50ZXJmYWNlPSAwOworICAgICAgICBpZiAoc2V0c29ja29wdChzb2NrZmQsIElQUFJPVE9fSVBWNiwgSVBWNl9EUk9QX01FTUJFUlNISVAsICZtcmVxNiwgc2l6ZW9mKG1yZXE2KSkgPCAwKSB7CisgICAgICAgICAgICBsb2dfbmV0X2Vycm9yKE5VTEwsIEFWX0xPR19FUlJPUiwgInNldHNvY2tvcHQoSVBWNl9EUk9QX01FTUJFUlNISVApIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyaW5mbyogdWRwX3Jlc29sdmVfaG9zdChjb25zdCBjaGFyICpob3N0bmFtZSwgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgZmFtaWx5LCBpbnQgZmxhZ3MpCit7CisgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzID0geyAwIH0sICpyZXMgPSAwOworICAgIGludCBlcnJvcjsKKyAgICBjaGFyIHNwb3J0WzE2XTsKKyAgICBjb25zdCBjaGFyICpub2RlID0gMCwgKnNlcnZpY2UgPSAiMCI7CisKKyAgICBpZiAocG9ydCA+IDApIHsKKyAgICAgICAgc25wcmludGYoc3BvcnQsIHNpemVvZihzcG9ydCksICIlZCIsIHBvcnQpOworICAgICAgICBzZXJ2aWNlID0gc3BvcnQ7CisgICAgfQorICAgIGlmICgoaG9zdG5hbWUpICYmIChob3N0bmFtZVswXSAhPSAnXDAnKSAmJiAoaG9zdG5hbWVbMF0gIT0gJz8nKSkgeworICAgICAgICBub2RlID0gaG9zdG5hbWU7CisgICAgfQorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gdHlwZTsKKyAgICBoaW50cy5haV9mYW1pbHkgICA9IGZhbWlseTsKKyAgICBoaW50cy5haV9mbGFncyA9IGZsYWdzOworICAgIGlmICgoZXJyb3IgPSBnZXRhZGRyaW5mbyhub2RlLCBzZXJ2aWNlLCAmaGludHMsICZyZXMpKSkgeworICAgICAgICByZXMgPSBOVUxMOworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAidWRwX3Jlc29sdmVfaG9zdDogJXNcbiIsIGdhaV9zdHJlcnJvcihlcnJvcikpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgdWRwX3NldF9tdWx0aWNhc3Rfc291cmNlcyhpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkZHJfbGVuLCBjaGFyICoqc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc291cmNlcywgaW50IGluY2x1ZGUpCit7CisjaWYgSEFWRV9TVFJVQ1RfR1JPVVBfU09VUkNFX1JFUSAmJiBkZWZpbmVkKE1DQVNUX0JMT0NLX1NPVVJDRSkgJiYgIWRlZmluZWQoX1dJTjMyKQorICAgIC8qIFRoZXNlIG9uZXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgbWljcm9zb2Z0IFNESywgYnV0IGRvbid0IHNlZW0gdG8gd29yaworICAgICAqIGFzIG9uIGxpbnV4LCBzbyBqdXN0IHByZWZlciB0aGUgdjQtb25seSBhcHByb2FjaCB0aGVyZSBmb3Igbm93LiAqLworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zb3VyY2VzOyBpKyspIHsKKyAgICAgICAgc3RydWN0IGdyb3VwX3NvdXJjZV9yZXEgbXJlcXM7CisgICAgICAgIGludCBsZXZlbCA9IGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUID8gSVBQUk9UT19JUCA6IElQUFJPVE9fSVBWNjsKKyAgICAgICAgc3RydWN0IGFkZHJpbmZvICpzb3VyY2VhZGRyID0gdWRwX3Jlc29sdmVfaG9zdChzb3VyY2VzW2ldLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQ0tfREdSQU0sIEFGX1VOU1BFQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKCFzb3VyY2VhZGRyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PRU5UKTsKKworICAgICAgICBtcmVxcy5nc3JfaW50ZXJmYWNlID0gMDsKKyAgICAgICAgbWVtY3B5KCZtcmVxcy5nc3JfZ3JvdXAsIGFkZHIsIGFkZHJfbGVuKTsKKyAgICAgICAgbWVtY3B5KCZtcmVxcy5nc3Jfc291cmNlLCBzb3VyY2VhZGRyLT5haV9hZGRyLCBzb3VyY2VhZGRyLT5haV9hZGRybGVuKTsKKyAgICAgICAgZnJlZWFkZHJpbmZvKHNvdXJjZWFkZHIpOworCisgICAgICAgIGlmIChzZXRzb2Nrb3B0KHNvY2tmZCwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPyBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUCA6IE1DQVNUX0JMT0NLX1NPVVJDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKikmbXJlcXMsIHNpemVvZihtcmVxcykpIDwgMCkgeworICAgICAgICAgICAgaWYgKGluY2x1ZGUpCisgICAgICAgICAgICAgICAgbG9nX25ldF9lcnJvcihOVUxMLCBBVl9MT0dfRVJST1IsICJzZXRzb2Nrb3B0KE1DQVNUX0pPSU5fU09VUkNFX0dST1VQKSIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxvZ19uZXRfZXJyb3IoTlVMTCwgQVZfTE9HX0VSUk9SLCAic2V0c29ja29wdChNQ0FTVF9CTE9DS19TT1VSQ0UpIik7CisgICAgICAgICAgICByZXR1cm4gZmZfbmV0ZXJybm8oKTsKKyAgICAgICAgfQorICAgIH0KKyNlbGlmIEhBVkVfU1RSVUNUX0lQX01SRVFfU09VUkNFICYmIGRlZmluZWQoSVBfQkxPQ0tfU09VUkNFKQorICAgIGludCBpOworICAgIGlmIChhZGRyLT5zYV9mYW1pbHkgIT0gQUZfSU5FVCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlNldHRpbmcgbXVsdGljYXN0IHNvdXJjZXMgb25seSBzdXBwb3J0ZWQgZm9yIElQdjRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc291cmNlczsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBpcF9tcmVxX3NvdXJjZSBtcmVxczsKKyAgICAgICAgc3RydWN0IGFkZHJpbmZvICpzb3VyY2VhZGRyID0gdWRwX3Jlc29sdmVfaG9zdChzb3VyY2VzW2ldLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQ0tfREdSQU0sIEFGX1VOU1BFQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKCFzb3VyY2VhZGRyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PRU5UKTsKKyAgICAgICAgaWYgKHNvdXJjZWFkZHItPmFpX2FkZHItPnNhX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisgICAgICAgICAgICBmcmVlYWRkcmluZm8oc291cmNlYWRkcik7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJXMgaXMgb2YgaW5jb3JyZWN0IHByb3RvY29sIGZhbWlseVxuIiwKKyAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBtcmVxcy5pbXJfbXVsdGlhZGRyLnNfYWRkciA9ICgoc3RydWN0IHNvY2thZGRyX2luICopYWRkciktPnNpbl9hZGRyLnNfYWRkcjsKKyAgICAgICAgbXJlcXMuaW1yX2ludGVyZmFjZS5zX2FkZHIgPSBJTkFERFJfQU5ZOworICAgICAgICBtcmVxcy5pbXJfc291cmNlYWRkci5zX2FkZHIgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNvdXJjZWFkZHItPmFpX2FkZHIpLT5zaW5fYWRkci5zX2FkZHI7CisgICAgICAgIGZyZWVhZGRyaW5mbyhzb3VyY2VhZGRyKTsKKworICAgICAgICBpZiAoc2V0c29ja29wdChzb2NrZmQsIElQUFJPVE9fSVAsCisgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPyBJUF9BRERfU09VUkNFX01FTUJFUlNISVAgOiBJUF9CTE9DS19TT1VSQ0UsCisgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB2b2lkICopJm1yZXFzLCBzaXplb2YobXJlcXMpKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChpbmNsdWRlKQorICAgICAgICAgICAgICAgIGxvZ19uZXRfZXJyb3IoTlVMTCwgQVZfTE9HX0VSUk9SLCAic2V0c29ja29wdChJUF9BRERfU09VUkNFX01FTUJFUlNISVApIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9nX25ldF9lcnJvcihOVUxMLCBBVl9MT0dfRVJST1IsICJzZXRzb2Nrb3B0KElQX0JMT0NLX1NPVVJDRSkiKTsKKyAgICAgICAgICAgIHJldHVybiBmZl9uZXRlcnJubygpOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHVkcF9zZXRfdXJsKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0bmFtZSwgaW50IHBvcnQpCit7CisgICAgc3RydWN0IGFkZHJpbmZvICpyZXMwOworICAgIGludCBhZGRyX2xlbjsKKworICAgIHJlczAgPSB1ZHBfcmVzb2x2ZV9ob3N0KGhvc3RuYW1lLCBwb3J0LCBTT0NLX0RHUkFNLCBBRl9VTlNQRUMsIDApOworICAgIGlmICghcmVzMCkgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICBtZW1jcHkoYWRkciwgcmVzMC0+YWlfYWRkciwgcmVzMC0+YWlfYWRkcmxlbik7CisgICAgYWRkcl9sZW4gPSByZXMwLT5haV9hZGRybGVuOworICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKKworICAgIHJldHVybiBhZGRyX2xlbjsKK30KKworc3RhdGljIGludCB1ZHBfc29ja2V0X2NyZWF0ZShVRFBDb250ZXh0ICpzLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2xlbl90ICphZGRyX2xlbiwgY29uc3QgY2hhciAqbG9jYWxhZGRyKQoreworICAgIGludCB1ZHBfZmQgPSAtMTsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKnJlczAsICpyZXM7CisgICAgaW50IGZhbWlseSA9IEFGX1VOU1BFQzsKKworICAgIGlmICgoKHN0cnVjdCBzb2NrYWRkciAqKSAmcy0+ZGVzdF9hZGRyKS0+c2FfZmFtaWx5KQorICAgICAgICBmYW1pbHkgPSAoKHN0cnVjdCBzb2NrYWRkciAqKSAmcy0+ZGVzdF9hZGRyKS0+c2FfZmFtaWx5OworICAgIHJlczAgPSB1ZHBfcmVzb2x2ZV9ob3N0KGxvY2FsYWRkclswXSA/IGxvY2FsYWRkciA6IE5VTEwsIHMtPmxvY2FsX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09DS19ER1JBTSwgZmFtaWx5LCBBSV9QQVNTSVZFKTsKKyAgICBpZiAoIXJlczApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBmb3IgKHJlcyA9IHJlczA7IHJlczsgcmVzPXJlcy0+YWlfbmV4dCkgeworICAgICAgICBpZiAocy0+dWRwbGl0ZV9jb3ZlcmFnZSkKKyAgICAgICAgICAgIHVkcF9mZCA9IGZmX3NvY2tldChyZXMtPmFpX2ZhbWlseSwgU09DS19ER1JBTSwgSVBQUk9UT19VRFBMSVRFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdWRwX2ZkID0gZmZfc29ja2V0KHJlcy0+YWlfZmFtaWx5LCBTT0NLX0RHUkFNLCAwKTsKKyAgICAgICAgaWYgKHVkcF9mZCAhPSAtMSkgYnJlYWs7CisgICAgICAgIGxvZ19uZXRfZXJyb3IoTlVMTCwgQVZfTE9HX0VSUk9SLCAic29ja2V0Iik7CisgICAgfQorCisgICAgaWYgKHVkcF9mZCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIG1lbWNweShhZGRyLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbik7CisgICAgKmFkZHJfbGVuID0gcmVzLT5haV9hZGRybGVuOworCisgICAgZnJlZWFkZHJpbmZvKHJlczApOworCisgICAgcmV0dXJuIHVkcF9mZDsKKworIGZhaWw6CisgICAgaWYgKHVkcF9mZCA+PSAwKQorICAgICAgICBjbG9zZXNvY2tldCh1ZHBfZmQpOworICAgIGlmKHJlczApCisgICAgICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdWRwX3BvcnQoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIGludCBhZGRyX2xlbikKK3sKKyAgICBjaGFyIHNidWZbc2l6ZW9mKGludCkqMysxXTsKKyAgICBpbnQgZXJyb3I7CisKKyAgICBpZiAoKGVycm9yID0gZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIsIGFkZHJfbGVuLCBOVUxMLCAwLCAgc2J1Ziwgc2l6ZW9mKHNidWYpLCBOSV9OVU1FUklDU0VSVikpICE9IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImdldG5hbWVpbmZvOiAlc1xuIiwgZ2FpX3N0cmVycm9yKGVycm9yKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RydG9sKHNidWYsIE5VTEwsIDEwKTsKK30KKworCisvKioKKyAqIElmIG5vIGZpbGVuYW1lIGlzIGdpdmVuIHRvIGF2X29wZW5faW5wdXRfZmlsZSBiZWNhdXNlIHlvdSB3YW50IHRvCisgKiBnZXQgdGhlIGxvY2FsIHBvcnQgZmlyc3QsIHRoZW4geW91IG11c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHNldAorICogdGhlIHJlbW90ZSBzZXJ2ZXIgYWRkcmVzcy4KKyAqCisgKiB1cmwgc3ludGF4OiB1ZHA6Ly9ob3N0OnBvcnRbP29wdGlvbj12YWwuLi5dCisgKiBvcHRpb246ICd0dGw9bicgICAgICAgOiBzZXQgdGhlIHR0bCB2YWx1ZSAoZm9yIG11bHRpY2FzdCBvbmx5KQorICogICAgICAgICAnbG9jYWxwb3J0PW4nIDogc2V0IHRoZSBsb2NhbCBwb3J0CisgKiAgICAgICAgICdwa3Rfc2l6ZT1uJyAgOiBzZXQgbWF4IHBhY2tldCBzaXplCisgKiAgICAgICAgICdyZXVzZT0xJyAgICAgOiBlbmFibGUgcmV1c2luZyB0aGUgc29ja2V0CisgKiAgICAgICAgICdvdmVycnVuX25vbmZhdGFsPTEnOiBzdXJ2aXZlIGluIGNhc2Ugb2YgY2lyY3VsYXIgYnVmZmVyIG92ZXJydW4KKyAqCisgKiBAcGFyYW0gaCBtZWRpYSBmaWxlIGNvbnRleHQKKyAqIEBwYXJhbSB1cmkgb2YgdGhlIHJlbW90ZSBzZXJ2ZXIKKyAqIEByZXR1cm4gemVybyBpZiBubyBlcnJvci4KKyAqLworaW50IGZmX3VkcF9zZXRfcmVtb3RlX3VybChVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmkpCit7CisgICAgVURQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBjaGFyIGhvc3RuYW1lWzI1Nl0sIGJ1ZlsxMF07CisgICAgaW50IHBvcnQ7CisgICAgY29uc3QgY2hhciAqcDsKKworICAgIGF2X3VybF9zcGxpdChOVUxMLCAwLCBOVUxMLCAwLCBob3N0bmFtZSwgc2l6ZW9mKGhvc3RuYW1lKSwgJnBvcnQsIE5VTEwsIDAsIHVyaSk7CisKKyAgICAvKiBzZXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyAgICBzLT5kZXN0X2FkZHJfbGVuID0gdWRwX3NldF91cmwoJnMtPmRlc3RfYWRkciwgaG9zdG5hbWUsIHBvcnQpOworICAgIGlmIChzLT5kZXN0X2FkZHJfbGVuIDwgMCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBzLT5pc19tdWx0aWNhc3QgPSBmZl9pc19tdWx0aWNhc3RfYWRkcmVzcygoc3RydWN0IHNvY2thZGRyKikgJnMtPmRlc3RfYWRkcik7CisgICAgcCA9IHN0cmNocih1cmksICc/Jyk7CisgICAgaWYgKHApIHsKKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImNvbm5lY3QiLCBwKSkgeworICAgICAgICAgICAgaW50IHdhc19jb25uZWN0ZWQgPSBzLT5pc19jb25uZWN0ZWQ7CisgICAgICAgICAgICBzLT5pc19jb25uZWN0ZWQgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgICAgICBpZiAocy0+aXNfY29ubmVjdGVkICYmICF3YXNfY29ubmVjdGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Qocy0+dWRwX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZzLT5kZXN0X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdF9hZGRyX2xlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+aXNfY29ubmVjdGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbG9nX25ldF9lcnJvcihoLCBBVl9MT0dfRVJST1IsICJjb25uZWN0Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBsb2NhbCBwb3J0IHVzZWQgYnkgdGhlIFVEUCBjb25uZWN0aW9uCisgKiBAcGFyYW0gaCBtZWRpYSBmaWxlIGNvbnRleHQKKyAqIEByZXR1cm4gdGhlIGxvY2FsIHBvcnQgbnVtYmVyCisgKi8KK2ludCBmZl91ZHBfZ2V0X2xvY2FsX3BvcnQoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBVRFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIHJldHVybiBzLT5sb2NhbF9wb3J0OworfQorCisvKioKKyAqIFJldHVybiB0aGUgdWRwIGZpbGUgaGFuZGxlIGZvciBzZWxlY3QoKSB1c2FnZSB0byB3YWl0IGZvciBzZXZlcmFsIFJUUAorICogc3RyZWFtcyBhdCB0aGUgc2FtZSB0aW1lLgorICogQHBhcmFtIGggbWVkaWEgZmlsZSBjb250ZXh0CisgKi8KK3N0YXRpYyBpbnQgdWRwX2dldF9maWxlX2hhbmRsZShVUkxDb250ZXh0ICpoKQoreworICAgIFVEUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIHMtPnVkcF9mZDsKK30KKworI2lmIEhBVkVfUFRIUkVBRF9DQU5DRUwKK3N0YXRpYyB2b2lkICpjaXJjdWxhcl9idWZmZXJfdGFzayggdm9pZCAqX1VSTENvbnRleHQpCit7CisgICAgVVJMQ29udGV4dCAqaCA9IF9VUkxDb250ZXh0OworICAgIFVEUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IG9sZF9jYW5jZWxzdGF0ZTsKKworICAgIHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoUFRIUkVBRF9DQU5DRUxfRElTQUJMRSwgJm9sZF9jYW5jZWxzdGF0ZSk7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5tdXRleCk7CisgICAgaWYgKGZmX3NvY2tldF9ub25ibG9jayhzLT51ZHBfZmQsIDApIDwgMCkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBibG9ja2luZyBtb2RlIik7CisgICAgICAgIHMtPmNpcmN1bGFyX2J1ZmZlcl9lcnJvciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIHdoaWxlKDEpIHsKKyAgICAgICAgaW50IGxlbjsKKworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcy0+bXV0ZXgpOworICAgICAgICAvKiBCbG9ja2luZyBvcGVyYXRpb25zIGFyZSBhbHdheXMgY2FuY2VsbGF0aW9uIHBvaW50czsKKyAgICAgICAgICAgc2VlICJHZW5lcmFsIEluZm9ybWF0aW9uIiAvICJUaHJlYWQgQ2FuY2VsYXRpb24gT3ZlcnZpZXciCisgICAgICAgICAgIGluIFNpbmdsZSBVbml4LiAqLworICAgICAgICBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwgJm9sZF9jYW5jZWxzdGF0ZSk7CisgICAgICAgIGxlbiA9IHJlY3Yocy0+dWRwX2ZkLCBzLT50bXArNCwgc2l6ZW9mKHMtPnRtcCktNCwgMCk7CisgICAgICAgIHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoUFRIUkVBRF9DQU5DRUxfRElTQUJMRSwgJm9sZF9jYW5jZWxzdGF0ZSk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcy0+bXV0ZXgpOworICAgICAgICBpZiAobGVuIDwgMCkgeworICAgICAgICAgICAgaWYgKGZmX25ldGVycm5vKCkgIT0gQVZFUlJPUihFQUdBSU4pICYmIGZmX25ldGVycm5vKCkgIT0gQVZFUlJPUihFSU5UUikpIHsKKyAgICAgICAgICAgICAgICBzLT5jaXJjdWxhcl9idWZmZXJfZXJyb3IgPSBmZl9uZXRlcnJubygpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQVZfV0wzMihzLT50bXAsIGxlbik7CisKKyAgICAgICAgaWYoYXZfZmlmb19zcGFjZShzLT5maWZvKSA8IGxlbiArIDQpIHsKKyAgICAgICAgICAgIC8qIE5vIFNwYWNlIGxlZnQgKi8KKyAgICAgICAgICAgIGlmIChzLT5vdmVycnVuX25vbmZhdGFsKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLCAiQ2lyY3VsYXIgYnVmZmVyIG92ZXJydW4uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJTdXJ2aXZpbmcgZHVlIHRvIG92ZXJydW5fbm9uZmF0YWwgb3B0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkNpcmN1bGFyIGJ1ZmZlciBvdmVycnVuLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVG8gYXZvaWQsIGluY3JlYXNlIGZpZm9fc2l6ZSBVUkwgb3B0aW9uLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVG8gc3Vydml2ZSBpbiBzdWNoIGNhc2UsIHVzZSBvdmVycnVuX25vbmZhdGFsIG9wdGlvblxuIik7CisgICAgICAgICAgICAgICAgcy0+Y2lyY3VsYXJfYnVmZmVyX2Vycm9yID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShzLT5maWZvLCBzLT50bXAsIGxlbis0LCBOVUxMKTsKKyAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcy0+Y29uZCk7CisgICAgfQorCitlbmQ6CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcy0+Y29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnMtPm11dGV4KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHBhcnNlX3NvdXJjZV9saXN0KGNoYXIgKmJ1ZiwgY2hhciAqKnNvdXJjZXMsIGludCAqbnVtX3NvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfc291cmNlcykKK3sKKyAgICBjaGFyICpzb3VyY2Vfc3RhcnQ7CisKKyAgICBzb3VyY2Vfc3RhcnQgPSBidWY7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgY2hhciAqbmV4dCA9IHN0cmNocihzb3VyY2Vfc3RhcnQsICcsJyk7CisgICAgICAgIGlmIChuZXh0KQorICAgICAgICAgICAgKm5leHQgPSAnXDAnOworICAgICAgICBzb3VyY2VzWypudW1fc291cmNlc10gPSBhdl9zdHJkdXAoc291cmNlX3N0YXJ0KTsKKyAgICAgICAgaWYgKCFzb3VyY2VzWypudW1fc291cmNlc10pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBzb3VyY2Vfc3RhcnQgPSBuZXh0ICsgMTsKKyAgICAgICAgKCpudW1fc291cmNlcykrKzsKKyAgICAgICAgaWYgKCpudW1fc291cmNlcyA+PSBtYXhfc291cmNlcyB8fCAhbmV4dCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogcHV0IGl0IGluIFVEUCBjb250ZXh0ICovCisvKiByZXR1cm4gbm9uIHplcm8gaWYgZXJyb3IgKi8KK3N0YXRpYyBpbnQgdWRwX29wZW4oVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqdXJpLCBpbnQgZmxhZ3MpCit7CisgICAgY2hhciBob3N0bmFtZVsxMDI0XSwgbG9jYWxhZGRyWzEwMjRdID0gIiI7CisgICAgaW50IHBvcnQsIHVkcF9mZCA9IC0xLCB0bXAsIGJpbmRfcmV0ID0gLTEsIGRzY3AgPSAtMTsKKyAgICBVRFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGludCBpc19vdXRwdXQ7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIG15X2FkZHI7CisgICAgc29ja2xlbl90IGxlbjsKKyAgICBpbnQgcmV1c2Vfc3BlY2lmaWVkID0gMDsKKyAgICBpbnQgaSwgbnVtX2luY2x1ZGVfc291cmNlcyA9IDAsIG51bV9leGNsdWRlX3NvdXJjZXMgPSAwOworICAgIGNoYXIgKmluY2x1ZGVfc291cmNlc1szMl0sICpleGNsdWRlX3NvdXJjZXNbMzJdOworCisgICAgaC0+aXNfc3RyZWFtZWQgPSAxOworCisgICAgaXNfb3V0cHV0ID0gIShmbGFncyAmIEFWSU9fRkxBR19SRUFEKTsKKyAgICBpZiAoIXMtPmJ1ZmZlcl9zaXplKSAvKiBpZiBub3Qgc2V0IGV4cGxpY2l0bHkgKi8KKyAgICAgICAgcy0+YnVmZmVyX3NpemUgPSBpc19vdXRwdXQgPyBVRFBfVFhfQlVGX1NJWkUgOiBVRFBfTUFYX1BLVF9TSVpFOworCisgICAgcCA9IHN0cmNocih1cmksICc/Jyk7CisgICAgaWYgKHApIHsKKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgInJldXNlIiwgcCkpIHsKKyAgICAgICAgICAgIGNoYXIgKmVuZHB0ciA9IE5VTEw7CisgICAgICAgICAgICBzLT5yZXVzZV9zb2NrZXQgPSBzdHJ0b2woYnVmLCAmZW5kcHRyLCAxMCk7CisgICAgICAgICAgICAvKiBhc3N1bWUgaWYgbm8gZGlnaXRzIHdlcmUgZm91bmQgaXQgaXMgYSByZXF1ZXN0IHRvIGVuYWJsZSBpdCAqLworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBlbmRwdHIpCisgICAgICAgICAgICAgICAgcy0+cmV1c2Vfc29ja2V0ID0gMTsKKyAgICAgICAgICAgIHJldXNlX3NwZWNpZmllZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgIm92ZXJydW5fbm9uZmF0YWwiLCBwKSkgeworICAgICAgICAgICAgY2hhciAqZW5kcHRyID0gTlVMTDsKKyAgICAgICAgICAgIHMtPm92ZXJydW5fbm9uZmF0YWwgPSBzdHJ0b2woYnVmLCAmZW5kcHRyLCAxMCk7CisgICAgICAgICAgICAvKiBhc3N1bWUgaWYgbm8gZGlnaXRzIHdlcmUgZm91bmQgaXQgaXMgYSByZXF1ZXN0IHRvIGVuYWJsZSBpdCAqLworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBlbmRwdHIpCisgICAgICAgICAgICAgICAgcy0+b3ZlcnJ1bl9ub25mYXRhbCA9IDE7CisgICAgICAgICAgICBpZiAoIUhBVkVfUFRIUkVBRF9DQU5DRUwpCisgICAgICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiJ292ZXJydW5fbm9uZmF0YWwnIG9wdGlvbiB3YXMgc2V0IGJ1dCBpdCBpcyBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgYnVpbGQgKHB0aHJlYWQgc3VwcG9ydCBpcyByZXF1aXJlZClcbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0dGwiLCBwKSkgeworICAgICAgICAgICAgcy0+dHRsID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ1ZHBsaXRlX2NvdmVyYWdlIiwgcCkpIHsKKyAgICAgICAgICAgIHMtPnVkcGxpdGVfY292ZXJhZ2UgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImxvY2FscG9ydCIsIHApKSB7CisgICAgICAgICAgICBzLT5sb2NhbF9wb3J0ID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJwa3Rfc2l6ZSIsIHApKSB7CisgICAgICAgICAgICBzLT5wYWNrZXRfc2l6ZSA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAiYnVmZmVyX3NpemUiLCBwKSkgeworICAgICAgICAgICAgcy0+YnVmZmVyX3NpemUgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImNvbm5lY3QiLCBwKSkgeworICAgICAgICAgICAgcy0+aXNfY29ubmVjdGVkID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJkc2NwIiwgcCkpIHsKKyAgICAgICAgICAgIGRzY3AgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImZpZm9fc2l6ZSIsIHApKSB7CisgICAgICAgICAgICBzLT5jaXJjdWxhcl9idWZmZXJfc2l6ZSA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgICAgIGlmICghSEFWRV9QVEhSRUFEX0NBTkNFTCkKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICInY2lyY3VsYXJfYnVmZmVyX3NpemUnIG9wdGlvbiB3YXMgc2V0IGJ1dCBpdCBpcyBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgYnVpbGQgKHB0aHJlYWQgc3VwcG9ydCBpcyByZXF1aXJlZClcbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJsb2NhbGFkZHIiLCBwKSkgeworICAgICAgICAgICAgYXZfc3RybGNweShsb2NhbGFkZHIsIGJ1Ziwgc2l6ZW9mKGxvY2FsYWRkcikpOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJzb3VyY2VzIiwgcCkpIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9zb3VyY2VfbGlzdChidWYsIGluY2x1ZGVfc291cmNlcywgJm51bV9pbmNsdWRlX3NvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMoaW5jbHVkZV9zb3VyY2VzKSkpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJibG9jayIsIHApKSB7CisgICAgICAgICAgICBpZiAocGFyc2Vfc291cmNlX2xpc3QoYnVmLCBleGNsdWRlX3NvdXJjZXMsICZudW1fZXhjbHVkZV9zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0FSUkFZX0VMRU1TKGV4Y2x1ZGVfc291cmNlcykpKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzX291dHB1dCAmJiBhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0aW1lb3V0IiwgcCkpCisgICAgICAgICAgICBzLT50aW1lb3V0ID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICBpZiAoaXNfb3V0cHV0ICYmIGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImJyb2FkY2FzdCIsIHApKQorICAgICAgICAgICAgcy0+aXNfYnJvYWRjYXN0ID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgIH0KKyAgICAvKiBoYW5kbGluZyBuZWVkZWQgdG8gc3VwcG9ydCBvcHRpb25zIHBpY2tpbmcgZnJvbSBib3RoIEFWT3B0aW9uIGFuZCBVUkwgKi8KKyAgICBzLT5jaXJjdWxhcl9idWZmZXJfc2l6ZSAqPSAxODg7CisgICAgaWYgKGZsYWdzICYgQVZJT19GTEFHX1dSSVRFKSB7CisgICAgICAgIGgtPm1heF9wYWNrZXRfc2l6ZSA9IHMtPnBhY2tldF9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGgtPm1heF9wYWNrZXRfc2l6ZSA9IFVEUF9NQVhfUEtUX1NJWkU7CisgICAgfQorICAgIGgtPnJ3X3RpbWVvdXQgPSBzLT50aW1lb3V0OworCisgICAgLyogZmlsbCB0aGUgZGVzdCBhZGRyICovCisgICAgYXZfdXJsX3NwbGl0KE5VTEwsIDAsIE5VTEwsIDAsIGhvc3RuYW1lLCBzaXplb2YoaG9zdG5hbWUpLCAmcG9ydCwgTlVMTCwgMCwgdXJpKTsKKworICAgIC8qIFhYWDogZml4IGF2X3VybF9zcGxpdCAqLworICAgIGlmIChob3N0bmFtZVswXSA9PSAnXDAnIHx8IGhvc3RuYW1lWzBdID09ICc/JykgeworICAgICAgICAvKiBvbmx5IGFjY2VwdHMgbnVsbCBob3N0bmFtZSBpZiBpbnB1dCAqLworICAgICAgICBpZiAoIShmbGFncyAmIEFWSU9fRkxBR19SRUFEKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZmZfdWRwX3NldF9yZW1vdGVfdXJsKGgsIHVyaSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICgocy0+aXNfbXVsdGljYXN0IHx8ICFzLT5sb2NhbF9wb3J0KSAmJiAoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfUkVBRCkpCisgICAgICAgIHMtPmxvY2FsX3BvcnQgPSBwb3J0OworICAgIHVkcF9mZCA9IHVkcF9zb2NrZXRfY3JlYXRlKHMsICZteV9hZGRyLCAmbGVuLCBsb2NhbGFkZHJbMF0gPyBsb2NhbGFkZHIgOiBzLT5sb2NhbF9hZGRyKTsKKyAgICBpZiAodWRwX2ZkIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcy0+bG9jYWxfYWRkcl9zdG9yYWdlPW15X2FkZHI7IC8vc3RvcmUgZm9yIGZ1dHVyZSBtdWx0aWNhc3Qgam9pbgorCisgICAgLyogRm9sbG93IHRoZSByZXF1ZXN0ZWQgcmV1c2Ugb3B0aW9uLCB1bmxlc3MgaXQncyBtdWx0aWNhc3QgaW4gd2hpY2gKKyAgICAgKiBjYXNlIGVuYWJsZSByZXVzZSB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBpZiAocy0+cmV1c2Vfc29ja2V0IHx8IChzLT5pc19tdWx0aWNhc3QgJiYgIXJldXNlX3NwZWNpZmllZCkpIHsKKyAgICAgICAgcy0+cmV1c2Vfc29ja2V0ID0gMTsKKyAgICAgICAgaWYgKHNldHNvY2tvcHQgKHVkcF9mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmKHMtPnJldXNlX3NvY2tldCksIHNpemVvZihzLT5yZXVzZV9zb2NrZXQpKSAhPSAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChzLT5pc19icm9hZGNhc3QpIHsKKyNpZmRlZiBTT19CUk9BRENBU1QKKyAgICAgICAgaWYgKHNldHNvY2tvcHQgKHVkcF9mZCwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAmKHMtPmlzX2Jyb2FkY2FzdCksIHNpemVvZihzLT5pc19icm9hZGNhc3QpKSAhPSAwKQorI2VuZGlmCisgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIGNoZWNrc3VtIGNvdmVyYWdlIGZvciBVRFAtTGl0ZSAoUkZDIDM4MjgpIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcuCisgICAgICogVGhlIHJlY2VpdmVyIGNvdmVyYWdlIGhhcyB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlbmRlciBjb3ZlcmFnZS4KKyAgICAgKiBPdGhlcndpc2UsIHRoZSByZWNlaXZlciB3aWxsIGRyb3AgYWxsIHBhY2tldHMuCisgICAgICovCisgICAgaWYgKHMtPnVkcGxpdGVfY292ZXJhZ2UpIHsKKyAgICAgICAgaWYgKHNldHNvY2tvcHQgKHVkcF9mZCwgSVBQUk9UT19VRFBMSVRFLCBVRFBMSVRFX1NFTkRfQ1NDT1YsICYocy0+dWRwbGl0ZV9jb3ZlcmFnZSksIHNpemVvZihzLT51ZHBsaXRlX2NvdmVyYWdlKSkgIT0gMCkKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywgInNvY2tldCBvcHRpb24gVURQTElURV9TRU5EX0NTQ09WIG5vdCBhdmFpbGFibGUiKTsKKworICAgICAgICBpZiAoc2V0c29ja29wdCAodWRwX2ZkLCBJUFBST1RPX1VEUExJVEUsIFVEUExJVEVfUkVDVl9DU0NPViwgJihzLT51ZHBsaXRlX2NvdmVyYWdlKSwgc2l6ZW9mKHMtPnVkcGxpdGVfY292ZXJhZ2UpKSAhPSAwKQorICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLCAic29ja2V0IG9wdGlvbiBVRFBMSVRFX1JFQ1ZfQ1NDT1Ygbm90IGF2YWlsYWJsZSIpOworICAgIH0KKworICAgIGlmIChkc2NwID49IDApIHsKKyAgICAgICAgZHNjcCA8PD0gMjsKKyAgICAgICAgaWYgKHNldHNvY2tvcHQgKHVkcF9mZCwgSVBQUk9UT19JUCwgSVBfVE9TLCAmZHNjcCwgc2l6ZW9mKGRzY3ApKSAhPSAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIElmIG11bHRpY2FzdCwgdHJ5IGJpbmRpbmcgdGhlIG11bHRpY2FzdCBhZGRyZXNzIGZpcnN0LCB0byBhdm9pZAorICAgICAqIHJlY2VpdmluZyBVRFAgcGFja2V0cyBmcm9tIG90aGVyIHNvdXJjZXMgYWltZWQgYXQgdGhlIHNhbWUgVURQCisgICAgICogcG9ydC4gVGhpcyBmYWlscyBvbiB3aW5kb3dzLiBUaGlzIG1ha2VzIHNlbmRpbmcgdG8gdGhlIHNhbWUgYWRkcmVzcworICAgICAqIHVzaW5nIHNlbmR0bygpIGZhaWwsIHNvIG9ubHkgZG8gaXQgaWYgd2UncmUgb3BlbmVkIGluIHJlYWQtb25seSBtb2RlLiAqLworICAgIGlmIChzLT5pc19tdWx0aWNhc3QgJiYgIShoLT5mbGFncyAmIEFWSU9fRkxBR19XUklURSkpIHsKKyAgICAgICAgYmluZF9yZXQgPSBiaW5kKHVkcF9mZCwoc3RydWN0IHNvY2thZGRyICopJnMtPmRlc3RfYWRkciwgbGVuKTsKKyAgICB9CisgICAgLyogYmluZCB0byB0aGUgbG9jYWwgYWRkcmVzcyBpZiBub3QgbXVsdGljYXN0IG9yIGlmIHRoZSBtdWx0aWNhc3QKKyAgICAgKiBiaW5kIGZhaWxlZCAqLworICAgIC8qIHRoZSBiaW5kIGlzIG5lZWRlZCB0byBnaXZlIGEgcG9ydCB0byB0aGUgc29ja2V0IG5vdyAqLworICAgIGlmIChiaW5kX3JldCA8IDAgJiYgYmluZCh1ZHBfZmQsKHN0cnVjdCBzb2NrYWRkciAqKSZteV9hZGRyLCBsZW4pIDwgMCkgeworICAgICAgICBsb2dfbmV0X2Vycm9yKGgsIEFWX0xPR19FUlJPUiwgImJpbmQgZmFpbGVkIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBsZW4gPSBzaXplb2YobXlfYWRkcik7CisgICAgZ2V0c29ja25hbWUodWRwX2ZkLCAoc3RydWN0IHNvY2thZGRyICopJm15X2FkZHIsICZsZW4pOworICAgIHMtPmxvY2FsX3BvcnQgPSB1ZHBfcG9ydCgmbXlfYWRkciwgbGVuKTsKKworICAgIGlmIChzLT5pc19tdWx0aWNhc3QpIHsKKyAgICAgICAgaWYgKGgtPmZsYWdzICYgQVZJT19GTEFHX1dSSVRFKSB7CisgICAgICAgICAgICAvKiBvdXRwdXQgKi8KKyAgICAgICAgICAgIGlmICh1ZHBfc2V0X211bHRpY2FzdF90dGwodWRwX2ZkLCBzLT50dGwsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcy0+ZGVzdF9hZGRyKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmIChoLT5mbGFncyAmIEFWSU9fRkxBR19SRUFEKSB7CisgICAgICAgICAgICAvKiBpbnB1dCAqLworICAgICAgICAgICAgaWYgKG51bV9pbmNsdWRlX3NvdXJjZXMgJiYgbnVtX2V4Y2x1ZGVfc291cmNlcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJTaW11bHRhbmVvdXNseSBpbmNsdWRpbmcgYW5kIGV4Y2x1ZGluZyBtdWx0aWNhc3Qgc291cmNlcyBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtX2luY2x1ZGVfc291cmNlcykgeworICAgICAgICAgICAgICAgIGlmICh1ZHBfc2V0X211bHRpY2FzdF9zb3VyY2VzKHVkcF9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzLT5kZXN0X2FkZHIsIHMtPmRlc3RfYWRkcl9sZW4sIGluY2x1ZGVfc291cmNlcywgbnVtX2luY2x1ZGVfc291cmNlcywgMSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh1ZHBfam9pbl9tdWx0aWNhc3RfZ3JvdXAodWRwX2ZkLCAoc3RydWN0IHNvY2thZGRyICopJnMtPmRlc3RfYWRkciwoc3RydWN0IHNvY2thZGRyICopJnMtPmxvY2FsX2FkZHJfc3RvcmFnZSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtX2V4Y2x1ZGVfc291cmNlcykgeworICAgICAgICAgICAgICAgIGlmICh1ZHBfc2V0X211bHRpY2FzdF9zb3VyY2VzKHVkcF9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzLT5kZXN0X2FkZHIsIHMtPmRlc3RfYWRkcl9sZW4sIGV4Y2x1ZGVfc291cmNlcywgbnVtX2V4Y2x1ZGVfc291cmNlcywgMCkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfb3V0cHV0KSB7CisgICAgICAgIC8qIGxpbWl0IHRoZSB0eCBidWYgc2l6ZSB0byBsaW1pdCBsYXRlbmN5ICovCisgICAgICAgIHRtcCA9IHMtPmJ1ZmZlcl9zaXplOworICAgICAgICBpZiAoc2V0c29ja29wdCh1ZHBfZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgJnRtcCwgc2l6ZW9mKHRtcCkpIDwgMCkgeworICAgICAgICAgICAgbG9nX25ldF9lcnJvcihoLCBBVl9MT0dfRVJST1IsICJzZXRzb2Nrb3B0KFNPX1NOREJVRikiKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHNldCB1ZHAgcmVjdiBidWZmZXIgc2l6ZSB0byB0aGUgcmVxdWVzdGVkIHZhbHVlIChkZWZhdWx0IDY0SykgKi8KKyAgICAgICAgdG1wID0gcy0+YnVmZmVyX3NpemU7CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KHVkcF9mZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAmdG1wLCBzaXplb2YodG1wKSkgPCAwKSB7CisgICAgICAgICAgICBsb2dfbmV0X2Vycm9yKGgsIEFWX0xPR19XQVJOSU5HLCAic2V0c29ja29wdChTT19SRUNWQlVGKSIpOworICAgICAgICB9CisgICAgICAgIGxlbiA9IHNpemVvZih0bXApOworICAgICAgICBpZiAoZ2V0c29ja29wdCh1ZHBfZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJnRtcCwgJmxlbikgPCAwKSB7CisgICAgICAgICAgICBsb2dfbmV0X2Vycm9yKGgsIEFWX0xPR19XQVJOSU5HLCAiZ2V0c29ja29wdChTT19SQ1ZCVUYpIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0RFQlVHLCAiZW5kIHJlY2VpdmUgYnVmZmVyIHNpemUgcmVwb3J0ZWQgaXMgJWRcbiIsIHRtcCk7CisgICAgICAgICAgICBpZih0bXAgPCBzLT5idWZmZXJfc2l6ZSkKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICJhdHRlbXB0ZWQgdG8gc2V0IHJlY2VpdmUgYnVmZmVyIHRvIHNpemUgJWQgYnV0IGl0IG9ubHkgZW5kZWQgdXAgc2V0IGFzICVkIiwgcy0+YnVmZmVyX3NpemUsIHRtcCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBtYWtlIHRoZSBzb2NrZXQgbm9uLWJsb2NraW5nICovCisgICAgICAgIGZmX3NvY2tldF9ub25ibG9jayh1ZHBfZmQsIDEpOworICAgIH0KKyAgICBpZiAocy0+aXNfY29ubmVjdGVkKSB7CisgICAgICAgIGlmIChjb25uZWN0KHVkcF9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcy0+ZGVzdF9hZGRyLCBzLT5kZXN0X2FkZHJfbGVuKSkgeworICAgICAgICAgICAgbG9nX25ldF9lcnJvcihoLCBBVl9MT0dfRVJST1IsICJjb25uZWN0Iik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2luY2x1ZGVfc291cmNlczsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmaW5jbHVkZV9zb3VyY2VzW2ldKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2V4Y2x1ZGVfc291cmNlczsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmZXhjbHVkZV9zb3VyY2VzW2ldKTsKKworICAgIHMtPnVkcF9mZCA9IHVkcF9mZDsKKworI2lmIEhBVkVfUFRIUkVBRF9DQU5DRUwKKyAgICBpZiAoIWlzX291dHB1dCAmJiBzLT5jaXJjdWxhcl9idWZmZXJfc2l6ZSkgeworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIC8qIHN0YXJ0IHRoZSB0YXNrIGdvaW5nICovCisgICAgICAgIHMtPmZpZm8gPSBhdl9maWZvX2FsbG9jKHMtPmNpcmN1bGFyX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgcmV0ID0gcHRocmVhZF9tdXRleF9pbml0KCZzLT5tdXRleCwgTlVMTCk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgInB0aHJlYWRfbXV0ZXhfaW5pdCBmYWlsZWQgOiAlc1xuIiwgc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gcHRocmVhZF9jb25kX2luaXQoJnMtPmNvbmQsIE5VTEwpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJwdGhyZWFkX2NvbmRfaW5pdCBmYWlsZWQgOiAlc1xuIiwgc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICBnb3RvIGNvbmRfZmFpbDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBwdGhyZWFkX2NyZWF0ZSgmcy0+Y2lyY3VsYXJfYnVmZmVyX3RocmVhZCwgTlVMTCwgY2lyY3VsYXJfYnVmZmVyX3Rhc2ssIGgpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJwdGhyZWFkX2NyZWF0ZSBmYWlsZWQgOiAlc1xuIiwgc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICBnb3RvIHRocmVhZF9mYWlsOworICAgICAgICB9CisgICAgICAgIHMtPnRocmVhZF9zdGFydGVkID0gMTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiAwOworI2lmIEhBVkVfUFRIUkVBRF9DQU5DRUwKKyB0aHJlYWRfZmFpbDoKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcy0+Y29uZCk7CisgY29uZF9mYWlsOgorICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcy0+bXV0ZXgpOworI2VuZGlmCisgZmFpbDoKKyAgICBpZiAodWRwX2ZkID49IDApCisgICAgICAgIGNsb3Nlc29ja2V0KHVkcF9mZCk7CisgICAgYXZfZmlmb19mcmVlcCgmcy0+Zmlmbyk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9pbmNsdWRlX3NvdXJjZXM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmluY2x1ZGVfc291cmNlc1tpXSk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9leGNsdWRlX3NvdXJjZXM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmV4Y2x1ZGVfc291cmNlc1tpXSk7CisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworc3RhdGljIGludCB1ZHBsaXRlX29wZW4oVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqdXJpLCBpbnQgZmxhZ3MpCit7CisgICAgVURQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKworICAgIC8vIHNldCBkZWZhdWx0IGNoZWNrc3VtIGNvdmVyYWdlCisgICAgcy0+dWRwbGl0ZV9jb3ZlcmFnZSA9IFVEUF9IRUFERVJfU0laRTsKKworICAgIHJldHVybiB1ZHBfb3BlbihoLCB1cmksIGZsYWdzKTsKK30KKworc3RhdGljIGludCB1ZHBfcmVhZChVUkxDb250ZXh0ICpoLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFVEUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKyNpZiBIQVZFX1BUSFJFQURfQ0FOQ0VMCisgICAgaW50IGF2YWlsLCBub25ibG9jayA9IGgtPmZsYWdzICYgQVZJT19GTEFHX05PTkJMT0NLOworCisgICAgaWYgKHMtPmZpZm8pIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5tdXRleCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGF2YWlsID0gYXZfZmlmb19zaXplKHMtPmZpZm8pOworICAgICAgICAgICAgaWYgKGF2YWlsKSB7IC8vID49c2l6ZSkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdG1wWzRdOworCisgICAgICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQocy0+ZmlmbywgdG1wLCA0LCBOVUxMKTsKKyAgICAgICAgICAgICAgICBhdmFpbD0gQVZfUkwzMih0bXApOworICAgICAgICAgICAgICAgIGlmKGF2YWlsID4gc2l6ZSl7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywgIlBhcnQgb2YgZGF0YWdyYW0gbG9zdCBkdWUgdG8gaW5zdWZmaWNpZW50IGJ1ZmZlciBzaXplXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYXZhaWw9IHNpemU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQocy0+ZmlmbywgYnVmLCBhdmFpbCwgTlVMTCk7CisgICAgICAgICAgICAgICAgYXZfZmlmb19kcmFpbihzLT5maWZvLCBBVl9STDMyKHRtcCkgLSBhdmFpbCk7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnMtPm11dGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXZhaWw7CisgICAgICAgICAgICB9IGVsc2UgaWYocy0+Y2lyY3VsYXJfYnVmZmVyX2Vycm9yKXsKKyAgICAgICAgICAgICAgICBpbnQgZXJyID0gcy0+Y2lyY3VsYXJfYnVmZmVyX2Vycm9yOworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5tdXRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0gZWxzZSBpZihub25ibG9jaykgeworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5tdXRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEZJWE1FOiB1c2luZyB0aGUgbW9ub3RvbmljIGNsb2NrIHdvdWxkIGJlIGJldHRlciwKKyAgICAgICAgICAgICAgICAgICBidXQgaXQgZG9lcyBub3QgZXhpc3Qgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuICovCisgICAgICAgICAgICAgICAgaW50NjRfdCB0ID0gYXZfZ2V0dGltZSgpICsgMTAwMDAwOworICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0diA9IHsgLnR2X3NlYyAgPSAgdCAvIDEwMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHZfbnNlYyA9ICh0ICUgMTAwMDAwMCkgKiAxMDAwIH07CisgICAgICAgICAgICAgICAgaWYgKHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJnMtPmNvbmQsICZzLT5tdXRleCwgJnR2KSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnMtPm11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoZXJybm8gPT0gRVRJTUVET1VUID8gRUFHQUlOIDogZXJybm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub25ibG9jayA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUoIDEpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCEoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfTk9OQkxPQ0spKSB7CisgICAgICAgIHJldCA9IGZmX25ldHdvcmtfd2FpdF9mZChzLT51ZHBfZmQsIDApOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldCA9IHJlY3Yocy0+dWRwX2ZkLCBidWYsIHNpemUsIDApOworCisgICAgcmV0dXJuIHJldCA8IDAgPyBmZl9uZXRlcnJubygpIDogcmV0OworfQorCitzdGF0aWMgaW50IHVkcF93cml0ZShVUkxDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFVEUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICghKGgtPmZsYWdzICYgQVZJT19GTEFHX05PTkJMT0NLKSkgeworICAgICAgICByZXQgPSBmZl9uZXR3b3JrX3dhaXRfZmQocy0+dWRwX2ZkLCAxKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICghcy0+aXNfY29ubmVjdGVkKSB7CisgICAgICAgIHJldCA9IHNlbmR0byAocy0+dWRwX2ZkLCBidWYsIHNpemUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmcy0+ZGVzdF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgIHMtPmRlc3RfYWRkcl9sZW4pOworICAgIH0gZWxzZQorICAgICAgICByZXQgPSBzZW5kKHMtPnVkcF9mZCwgYnVmLCBzaXplLCAwKTsKKworICAgIHJldHVybiByZXQgPCAwID8gZmZfbmV0ZXJybm8oKSA6IHJldDsKK30KKworc3RhdGljIGludCB1ZHBfY2xvc2UoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBVRFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworCisgICAgaWYgKHMtPmlzX211bHRpY2FzdCAmJiAoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfUkVBRCkpCisgICAgICAgIHVkcF9sZWF2ZV9tdWx0aWNhc3RfZ3JvdXAocy0+dWRwX2ZkLCAoc3RydWN0IHNvY2thZGRyICopJnMtPmRlc3RfYWRkciwoc3RydWN0IHNvY2thZGRyICopJnMtPmxvY2FsX2FkZHJfc3RvcmFnZSk7CisgICAgY2xvc2Vzb2NrZXQocy0+dWRwX2ZkKTsKKyNpZiBIQVZFX1BUSFJFQURfQ0FOQ0VMCisgICAgaWYgKHMtPnRocmVhZF9zdGFydGVkKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIHB0aHJlYWRfY2FuY2VsKHMtPmNpcmN1bGFyX2J1ZmZlcl90aHJlYWQpOworICAgICAgICByZXQgPSBwdGhyZWFkX2pvaW4ocy0+Y2lyY3VsYXJfYnVmZmVyX3RocmVhZCwgTlVMTCk7CisgICAgICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJwdGhyZWFkX2pvaW4oKTogJXNcbiIsIHN0cmVycm9yKHJldCkpOworICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnMtPm11dGV4KTsKKyAgICAgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnMtPmNvbmQpOworICAgIH0KKyNlbmRpZgorICAgIGF2X2ZpZm9fZnJlZXAoJnMtPmZpZm8pOworICAgIHJldHVybiAwOworfQorCitVUkxQcm90b2NvbCBmZl91ZHBfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAidWRwIiwKKyAgICAudXJsX29wZW4gICAgICAgICAgICA9IHVkcF9vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gdWRwX3JlYWQsCisgICAgLnVybF93cml0ZSAgICAgICAgICAgPSB1ZHBfd3JpdGUsCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgPSB1ZHBfY2xvc2UsCisgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgPSB1ZHBfZ2V0X2ZpbGVfaGFuZGxlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKFVEUENvbnRleHQpLAorICAgIC5wcml2X2RhdGFfY2xhc3MgICAgID0gJnVkcF9jb250ZXh0X2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKK307CisKK1VSTFByb3RvY29sIGZmX3VkcGxpdGVfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAidWRwbGl0ZSIsCisgICAgLnVybF9vcGVuICAgICAgICAgICAgPSB1ZHBsaXRlX29wZW4sCisgICAgLnVybF9yZWFkICAgICAgICAgICAgPSB1ZHBfcmVhZCwKKyAgICAudXJsX3dyaXRlICAgICAgICAgICA9IHVkcF93cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgICAgICA9IHVkcF9jbG9zZSwKKyAgICAudXJsX2dldF9maWxlX2hhbmRsZSA9IHVkcF9nZXRfZmlsZV9oYW5kbGUsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgPSBzaXplb2YoVURQQ29udGV4dCksCisgICAgLnByaXZfZGF0YV9jbGFzcyAgICAgPSAmdWRwbGl0ZV9jb250ZXh0X2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdW5jb2RlZGZyYW1lY3JjZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdW5jb2RlZGZyYW1lY3JjZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0NjgzZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC91bmNvZGVkZnJhbWVjcmNlbmMuYwpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDEzIE5pY29sYXMgR2VvcmdlCisqCisqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyoKKyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FkbGVyMzIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qIElkZW50aWNhbCB0byBBZGxlcjMyIHdoZW4gdGhlIHR5cGUgaXMgdWludDhfdC4gKi8KKyNkZWZpbmUgREVGSU5FX0NLU1VNX0xJTkUobmFtZSwgdHlwZSwgY29udikgXAorc3RhdGljIHZvaWQgY2tzdW1fbGluZV8gIyMgbmFtZSh1bnNpZ25lZCAqY2tzdW0sIHZvaWQgKmRhdGEsIHVuc2lnbmVkIHNpemUpIFwKK3sgXAorICAgIHR5cGUgKnAgPSBkYXRhOyBcCisgICAgdW5zaWduZWQgYSA9ICpja3N1bSAmIDB4RkZGRiwgYiA9ICpja3N1bSA+PiAxNjsgXAorICAgIGZvciAoOyBzaXplID4gMDsgc2l6ZS0tLCBwKyspIHsgXAorICAgICAgICBhID0gKGEgKyAodW5zaWduZWQpKGNvbnYpKSAlIDY1NTIxOyBcCisgICAgICAgIGIgPSAoYiArIGEpICUgNjU1MjE7IFwKKyAgICB9IFwKKyAgICAqY2tzdW0gPSBhIHwgKGIgPDwgMTYpOyBcCit9CisKK0RFRklORV9DS1NVTV9MSU5FKHU4LCAgdWludDhfdCwgKnApCitERUZJTkVfQ0tTVU1fTElORShzMTYsIGludDE2X3QsICpwICsgMHg4MDAwKQorREVGSU5FX0NLU1VNX0xJTkUoczMyLCBpbnQzMl90LCAqcCArIDB4ODAwMDAwMDApCitERUZJTkVfQ0tTVU1fTElORShmbHQsIGZsb2F0LCAgICpwICogMHg4MDAwMDAwMCArIDB4ODAwMDAwMDApCitERUZJTkVfQ0tTVU1fTElORShkYmwsIGRvdWJsZSwgICpwICogMHg4MDAwMDAwMCArIDB4ODAwMDAwMDApCisKK3N0YXRpYyB2b2lkIHZpZGVvX2ZyYW1lX2Nrc3VtKEFWQlByaW50ICpicCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChmcmFtZS0+Zm9ybWF0KTsKKyAgICBpbnQgaSwgeTsKKyAgICB1aW50OF90ICpkYXRhOworICAgIGludCBsaW5lc2l6ZVs1XSA9IHsgMCB9OworCisgICAgYXZfYnByaW50ZihicCwgIiwgJWQgeCAlZCIsIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCk7CisgICAgaWYgKCFkZXNjKSB7CisgICAgICAgIGF2X2JwcmludGYoYnAsICIsIHVua25vd24iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMobGluZXNpemUsIGZyYW1lLT5mb3JtYXQsIGZyYW1lLT53aWR0aCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgYXZfYnByaW50ZihicCwgIiwgJXMiLCBkZXNjLT5uYW1lKTsKKyAgICBmb3IgKGkgPSAwOyBsaW5lc2l6ZVtpXTsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGNrc3VtID0gMDsKKyAgICAgICAgaW50IGggPSBmcmFtZS0+aGVpZ2h0OworICAgICAgICBpZiAoKGkgPT0gMSB8fCBpID09IDIpICYmIGRlc2MtPm5iX2NvbXBvbmVudHMgPj0gMykKKyAgICAgICAgICAgIGggPSAtKCgtaCkgPj4gZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgICAgIGRhdGEgPSBmcmFtZS0+ZGF0YVtpXTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgY2tzdW0gPSBhdl9hZGxlcjMyX3VwZGF0ZShja3N1bSwgZGF0YSwgbGluZXNpemVbaV0pOworICAgICAgICAgICAgZGF0YSArPSBmcmFtZS0+bGluZXNpemVbaV07CisgICAgICAgIH0KKyAgICAgICAgYXZfYnByaW50ZihicCwgIiwgMHglMDh4IiwgY2tzdW0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYXVkaW9fZnJhbWVfY2tzdW0oQVZCUHJpbnQgKmJwLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgbmJfcGxhbmVzLCBuYl9zYW1wbGVzLCBwOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICBuYl9wbGFuZXMgID0gYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGZyYW1lKTsKKyAgICBuYl9zYW1wbGVzID0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgaWYgKCFhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihmcmFtZS0+Zm9ybWF0KSkgeworICAgICAgICBuYl9zYW1wbGVzICo9IG5iX3BsYW5lczsKKyAgICAgICAgbmJfcGxhbmVzID0gMTsKKyAgICB9CisgICAgbmFtZSA9IGF2X2dldF9zYW1wbGVfZm10X25hbWUoZnJhbWUtPmZvcm1hdCk7CisgICAgYXZfYnByaW50ZihicCwgIiwgJWQgc2FtcGxlcyIsIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICBhdl9icHJpbnRmKGJwLCAiLCAlcyIsIG5hbWUgPyBuYW1lIDogInVua25vd24iKTsKKyAgICBmb3IgKHAgPSAwOyBwIDwgbmJfcGxhbmVzOyBwKyspIHsKKyAgICAgICAgdWludDMyX3QgY2tzdW0gPSAwOworICAgICAgICB2b2lkICpkID0gZnJhbWUtPmV4dGVuZGVkX2RhdGFbcF07CisgICAgICAgIHN3aXRjaCAoZnJhbWUtPmZvcm1hdCkgeworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfVTg6CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9VOFA6CisgICAgICAgICAgICBja3N1bV9saW5lX3U4KCZja3N1bSwgZCwgbmJfc2FtcGxlcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNjoKKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNlA6CisgICAgICAgICAgICBja3N1bV9saW5lX3MxNigmY2tzdW0sIGQsIG5iX3NhbXBsZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzI6CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzJQOgorICAgICAgICAgICAgY2tzdW1fbGluZV9zMzIoJmNrc3VtLCBkLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUOgorICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUUDoKKyAgICAgICAgICAgIGNrc3VtX2xpbmVfZmx0KCZja3N1bSwgZCwgbmJfc2FtcGxlcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTDoKKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTFA6CisgICAgICAgICAgICBja3N1bV9saW5lX2RibCgmY2tzdW0sIGQsIG5iX3NhbXBsZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQwKCEicmVhY2hlZCIpOworICAgICAgICB9CisgICAgICAgIGF2X2JwcmludGYoYnAsICIsIDB4JTA4eCIsIGNrc3VtKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZnJhbWUoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqKmZyYW1lLCB1bnNpZ25lZCBmbGFncykKK3sKKyAgICBBVkJQcmludCBicDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGU7CisgICAgY29uc3QgY2hhciAqdHlwZV9uYW1lOworCisgICAgaWYgKChmbGFncyAmIEFWX1dSSVRFX1VOQ09ERURfRlJBTUVfUVVFUlkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF2X2JwcmludF9pbml0KCZicCwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKyAgICBhdl9icHJpbnRmKCZicCwgIiVkLCAlMTAiUFJJZDY0IiIsCisgICAgICAgICAgICAgICBzdHJlYW1faW5kZXgsICgqZnJhbWUpLT5wdHMpOworICAgIHR5cGUgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlOworICAgIHR5cGVfbmFtZSA9IGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyh0eXBlKTsKKyAgICBhdl9icHJpbnRmKCZicCwgIiwgJXMiLCB0eXBlX25hbWUgPyB0eXBlX25hbWUgOiAidW5rbm93biIpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHZpZGVvX2ZyYW1lX2Nrc3VtKCZicCwgKmZyYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgICAgIGF1ZGlvX2ZyYW1lX2Nrc3VtKCZicCwgKmZyYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGF2X2JwcmludF9jaGFycygmYnAsICdcbicsIDEpOworICAgIGlmIChhdl9icHJpbnRfaXNfY29tcGxldGUoJmJwKSkKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgYnAuc3RyLCBicC5sZW4pOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnAsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfcGFja2V0KHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfdW5jb2RlZGZyYW1lY3JjX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJ1bmNvZGVkZnJhbWVjcmMiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJ1bmNvZGVkIGZyYW1lY3JjIHRlc3RpbmciKSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZmZfZnJhbWVoYXNoX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSB3cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3VuY29kZWRfZnJhbWUgPSB3cml0ZV9mcmFtZSwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9WQVJJQUJMRV9GUFMgfCBBVkZNVF9UU19OT05TVFJJQ1QgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRk1UX1RTX05FR0FUSVZFLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC91bml4LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzcwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvdW5peC5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogVW5peCBzb2NrZXQgcHJvdG9jb2wKKyAqIENvcHlyaWdodCAoYykgMjAxMyBMdWNhIEJhcmJhdG8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICoKKyAqIFVuaXggc29ja2V0IHVybF9wcm90b2NvbAorICoKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgIm9zX3N1cHBvcnQuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSAidXJsLmgiCisKK3R5cGVkZWYgc3RydWN0IFVuaXhDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKKyAgICBpbnQgdGltZW91dDsKKyAgICBpbnQgbGlzdGVuOworICAgIGludCB0eXBlOworICAgIGludCBmZDsKK30gVW5peENvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFVuaXhDb250ZXh0LCB4KQorI2RlZmluZSBFRCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTXxBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIHVuaXhfb3B0aW9uc1tdID0geworICAgIHsgImxpc3RlbiIsICAgICJPcGVuIHNvY2tldCBmb3IgbGlzdGVuaW5nIiwgICAgICAgICAgICAgT0ZGU0VUKGxpc3RlbiksICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgMSwgRUQgfSwKKyAgICB7ICJ0aW1lb3V0IiwgICAiVGltZW91dCBpbiBtcyIsICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVCh0aW1lb3V0KSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IC0xIH0sICAgICAgICAgICAgICAgICAgLTEsIElOVF9NQVgsIEVEIH0sCisgICAgeyAidHlwZSIsICAgICAgIlNvY2tldCB0eXBlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQodHlwZSksICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSBTT0NLX1NUUkVBTSB9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBFRCwgInR5cGUiIH0sCisgICAgeyAic3RyZWFtIiwgICAgIlN0cmVhbSAocmVsaWFibGUgc3RyZWFtLW9yaWVudGVkKSIsICAgICAwLCAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBTT0NLX1NUUkVBTSB9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBFRCwgInR5cGUiIH0sCisgICAgeyAiZGF0YWdyYW0iLCAgIkRhdGFncmFtICh1bnJlbGlhYmxlIHBhY2tldC1vcmllbnRlZCkiLCAwLCAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBTT0NLX0RHUkFNIH0sICAgICBJTlRfTUlOLCBJTlRfTUFYLCBFRCwgInR5cGUiIH0sCisgICAgeyAic2VxcGFja2V0IiwgIlNlcXBhY2tldCAocmVsaWFibGUgcGFja2V0LW9yaWVudGVkIiwgICAwLCAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBTT0NLX1NFUVBBQ0tFVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBFRCwgInR5cGUiIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHVuaXhfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAidW5peCIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IHVuaXhfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBpbnQgdW5peF9vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgVW5peENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IGZkLCByZXQ7CisKKyAgICBhdl9zdHJzdGFydChmaWxlbmFtZSwgInVuaXg6IiwgJmZpbGVuYW1lKTsKKyAgICBzLT5hZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIGF2X3N0cmxjcHkocy0+YWRkci5zdW5fcGF0aCwgZmlsZW5hbWUsIHNpemVvZihzLT5hZGRyLnN1bl9wYXRoKSk7CisKKyAgICBpZiAoKGZkID0gZmZfc29ja2V0KEFGX1VOSVgsIHMtPnR5cGUsIDApKSA8IDApCisgICAgICAgIHJldHVybiBmZl9uZXRlcnJubygpOworCisgICAgaWYgKHMtPmxpc3RlbikgeworICAgICAgICBmZCA9IGZmX2xpc3Rlbl9iaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJnMtPmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHMtPmFkZHIpLCBzLT50aW1lb3V0LCBoKTsKKyAgICAgICAgaWYgKGZkIDwgMCkgeworICAgICAgICAgICAgcmV0ID0gZmQ7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBmZl9saXN0ZW5fY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzLT5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yocy0+YWRkciksIHMtPnRpbWVvdXQsIGgsIDApOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzLT5mZCA9IGZkOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgaWYgKHMtPmxpc3RlbiAmJiBBVlVORVJST1IocmV0KSAhPSBFQUREUklOVVNFKQorICAgICAgICB1bmxpbmsocy0+YWRkci5zdW5fcGF0aCk7CisgICAgaWYgKGZkID49IDApCisgICAgICAgIGNsb3Nlc29ja2V0KGZkKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHVuaXhfcmVhZChVUkxDb250ZXh0ICpoLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFVuaXhDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIShoLT5mbGFncyAmIEFWSU9fRkxBR19OT05CTE9DSykpIHsKKyAgICAgICAgcmV0ID0gZmZfbmV0d29ya193YWl0X2ZkKHMtPmZkLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXQgPSByZWN2KHMtPmZkLCBidWYsIHNpemUsIDApOworICAgIHJldHVybiByZXQgPCAwID8gZmZfbmV0ZXJybm8oKSA6IHJldDsKK30KKworc3RhdGljIGludCB1bml4X3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgVW5peENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICghKGgtPmZsYWdzICYgQVZJT19GTEFHX05PTkJMT0NLKSkgeworICAgICAgICByZXQgPSBmZl9uZXR3b3JrX3dhaXRfZmQocy0+ZmQsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldCA9IHNlbmQocy0+ZmQsIGJ1Ziwgc2l6ZSwgTVNHX05PU0lHTkFMKTsKKyAgICByZXR1cm4gcmV0IDwgMCA/IGZmX25ldGVycm5vKCkgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdW5peF9jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIFVuaXhDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGlmIChzLT5saXN0ZW4pCisgICAgICAgIHVubGluayhzLT5hZGRyLnN1bl9wYXRoKTsKKyAgICBjbG9zZXNvY2tldChzLT5mZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdW5peF9nZXRfZmlsZV9oYW5kbGUoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBVbml4Q29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gcy0+ZmQ7Cit9CisKK1VSTFByb3RvY29sIGZmX3VuaXhfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAidW5peCIsCisgICAgLnVybF9vcGVuICAgICAgICAgICAgPSB1bml4X29wZW4sCisgICAgLnVybF9yZWFkICAgICAgICAgICAgPSB1bml4X3JlYWQsCisgICAgLnVybF93cml0ZSAgICAgICAgICAgPSB1bml4X3dyaXRlLAorICAgIC51cmxfY2xvc2UgICAgICAgICAgID0gdW5peF9jbG9zZSwKKyAgICAudXJsX2dldF9maWxlX2hhbmRsZSA9IHVuaXhfZ2V0X2ZpbGVfaGFuZGxlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKFVuaXhDb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX2NsYXNzICAgICA9ICZ1bml4X2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdXJsLXRlc3QuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC91cmwtdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZGE4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvdXJsLXRlc3QuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ1cmwuaCIKKworc3RhdGljIHZvaWQgdGVzdChjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpyZWwpCit7CisgICAgY2hhciBidWZbMjAwXSwgYnVmMlsyMDBdOworICAgIGZmX21ha2VfYWJzb2x1dGVfdXJsKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGJhc2UsIHJlbCk7CisgICAgcHJpbnRmKCIlc1xuIiwgYnVmKTsKKyAgICBpZiAoYmFzZSkgeworICAgICAgICAvKiBUZXN0IGluLWJ1ZmZlciByZXBsYWNlbWVudCAqLworICAgICAgICBzbnByaW50ZihidWYyLCBzaXplb2YoYnVmMiksICIlcyIsIGJhc2UpOworICAgICAgICBmZl9tYWtlX2Fic29sdXRlX3VybChidWYyLCBzaXplb2YoYnVmMiksIGJ1ZjIsIHJlbCk7CisgICAgICAgIGlmIChzdHJjbXAoYnVmLCBidWYyKSkgeworICAgICAgICAgICAgcHJpbnRmKCJJbi1wbGFjZSBoYW5kbGluZyBvZiAlcyArICVzIGZhaWxlZFxuIiwgYmFzZSwgcmVsKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgdGVzdChOVUxMLCAiYmF6Iik7CisgICAgdGVzdCgiL2Zvby9iYXIiLCAiYmF6Iik7CisgICAgdGVzdCgiL2Zvby9iYXIiLCAiLi4vYmF6Iik7CisgICAgdGVzdCgiL2Zvby9iYXIiLCAiL2JheiIpOworICAgIHRlc3QoImh0dHA6Ly9zZXJ2ZXIvZm9vLyIsICJiYXoiKTsKKyAgICB0ZXN0KCJodHRwOi8vc2VydmVyL2Zvby9iYXIiLCAiYmF6Iik7CisgICAgdGVzdCgiaHR0cDovL3NlcnZlci9mb28vIiwgIi4uL2JheiIpOworICAgIHRlc3QoImh0dHA6Ly9zZXJ2ZXIvZm9vL2Jhci8xMjMiLCAiLi4vLi4vYmF6Iik7CisgICAgdGVzdCgiaHR0cDovL3NlcnZlci9mb28vYmFyLzEyMyIsICIvYmF6Iik7CisgICAgdGVzdCgiaHR0cDovL3NlcnZlci9mb28vYmFyLzEyMyIsICJodHRwczovL290aGVyL3VybCIpOworICAgIHRlc3QoImh0dHA6Ly9zZXJ2ZXIvZm9vL2Jhcj9wYXJhbT12YWx1ZS93aXRoL3NsYXNoZXMiLCAiL2JheiIpOworICAgIHRlc3QoImh0dHA6Ly9zZXJ2ZXIvZm9vL2Jhcj9wYXJhbSZvdGhlcnBhcmFtIiwgIj9zb21lcGFyYW0iKTsKKyAgICB0ZXN0KCJodHRwOi8vc2VydmVyL2Zvby9iYXIiLCAiLy9vdGhlci91cmwiKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC91cmwuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC91cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2ZiMGNmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3VybC5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogVVJMIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAidXJsLmgiCisjaWYgQ09ORklHX05FVFdPUksKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjZW5kaWYKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKworLyoqCisgKiBAZmlsZQorICogVVJMIHV0aWxpdHkgZnVuY3Rpb25zLgorICovCisKK2ludCBmZl91cmxfam9pbihjaGFyICpzdHIsIGludCBzaXplLCBjb25zdCBjaGFyICpwcm90bywKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphdXRob3JpemF0aW9uLCBjb25zdCBjaGFyICpob3N0bmFtZSwKKyAgICAgICAgICAgICAgICBpbnQgcG9ydCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisjaWYgQ09ORklHX05FVFdPUksKKyAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMgPSB7IDAgfSwgKmFpOworI2VuZGlmCisKKyAgICBzdHJbMF0gPSAnXDAnOworICAgIGlmIChwcm90bykKKyAgICAgICAgYXZfc3RybGNhdGYoc3RyLCBzaXplLCAiJXM6Ly8iLCBwcm90byk7CisgICAgaWYgKGF1dGhvcml6YXRpb24gJiYgYXV0aG9yaXphdGlvblswXSkKKyAgICAgICAgYXZfc3RybGNhdGYoc3RyLCBzaXplLCAiJXNAIiwgYXV0aG9yaXphdGlvbik7CisjaWYgQ09ORklHX05FVFdPUksgJiYgZGVmaW5lZChBRl9JTkVUNikKKyAgICAvKiBEZXRlcm1pbmUgaWYgaG9zdG5hbWUgaXMgYSBudW1lcmljYWwgSVB2NiBhZGRyZXNzLAorICAgICAqIHByb3Blcmx5IGVzY2FwZSBpdCB3aXRoaW4gW10gaW4gdGhhdCBjYXNlLiAqLworICAgIGhpbnRzLmFpX2ZsYWdzID0gQUlfTlVNRVJJQ0hPU1Q7CisgICAgaWYgKCFnZXRhZGRyaW5mbyhob3N0bmFtZSwgTlVMTCwgJmhpbnRzLCAmYWkpKSB7CisgICAgICAgIGlmIChhaS0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgICAgICBhdl9zdHJsY2F0KHN0ciwgIlsiLCBzaXplKTsKKyAgICAgICAgICAgIGF2X3N0cmxjYXQoc3RyLCBob3N0bmFtZSwgc2l6ZSk7CisgICAgICAgICAgICBhdl9zdHJsY2F0KHN0ciwgIl0iLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X3N0cmxjYXQoc3RyLCBob3N0bmFtZSwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAvKiBOb3QgYW4gSVB2NiBhZGRyZXNzLCBqdXN0IG91dHB1dCB0aGUgcGxhaW4gc3RyaW5nLiAqLworICAgICAgICBhdl9zdHJsY2F0KHN0ciwgaG9zdG5hbWUsIHNpemUpOworCisgICAgaWYgKHBvcnQgPj0gMCkKKyAgICAgICAgYXZfc3RybGNhdGYoc3RyLCBzaXplLCAiOiVkIiwgcG9ydCk7CisgICAgaWYgKGZtdCkgeworICAgICAgICB2YV9saXN0IHZsOworICAgICAgICBpbnQgbGVuID0gc3RybGVuKHN0cik7CisKKyAgICAgICAgdmFfc3RhcnQodmwsIGZtdCk7CisgICAgICAgIHZzbnByaW50ZihzdHIgKyBsZW4sIHNpemUgPiBsZW4gPyBzaXplIC0gbGVuIDogMCwgZm10LCB2bCk7CisgICAgICAgIHZhX2VuZCh2bCk7CisgICAgfQorICAgIHJldHVybiBzdHJsZW4oc3RyKTsKK30KKwordm9pZCBmZl9tYWtlX2Fic29sdXRlX3VybChjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBjaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWwpCit7CisgICAgY2hhciAqc2VwLCAqcGF0aF9xdWVyeTsKKyAgICAvKiBBYnNvbHV0ZSBwYXRoLCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBzZXJ2ZXIgKi8KKyAgICBpZiAoYmFzZSAmJiBzdHJzdHIoYmFzZSwgIjovLyIpICYmIHJlbFswXSA9PSAnLycpIHsKKyAgICAgICAgaWYgKGJhc2UgIT0gYnVmKQorICAgICAgICAgICAgYXZfc3RybGNweShidWYsIGJhc2UsIHNpemUpOworICAgICAgICBzZXAgPSBzdHJzdHIoYnVmLCAiOi8vIik7CisgICAgICAgIGlmIChzZXApIHsKKyAgICAgICAgICAgIC8qIFRha2Ugc2NoZW1lIGZyb20gYmFzZSB1cmwgKi8KKyAgICAgICAgICAgIGlmIChyZWxbMV0gPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgc2VwWzFdID0gJ1wwJzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogVGFrZSBzY2hlbWUgYW5kIGhvc3QgZnJvbSBiYXNlIHVybCAqLworICAgICAgICAgICAgICAgIHNlcCArPSAzOworICAgICAgICAgICAgICAgIHNlcCA9IHN0cmNocihzZXAsICcvJyk7CisgICAgICAgICAgICAgICAgaWYgKHNlcCkKKyAgICAgICAgICAgICAgICAgICAgKnNlcCA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfc3RybGNhdChidWYsIHJlbCwgc2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogSWYgcmVsIGFjdHVhbGx5IGlzIGFuIGFic29sdXRlIHVybCwganVzdCBjb3B5IGl0ICovCisgICAgaWYgKCFiYXNlIHx8IHN0cnN0cihyZWwsICI6Ly8iKSB8fCByZWxbMF0gPT0gJy8nKSB7CisgICAgICAgIGF2X3N0cmxjcHkoYnVmLCByZWwsIHNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChiYXNlICE9IGJ1ZikKKyAgICAgICAgYXZfc3RybGNweShidWYsIGJhc2UsIHNpemUpOworCisgICAgLyogU3RyaXAgb2ZmIGFueSBxdWVyeSBzdHJpbmcgZnJvbSBiYXNlICovCisgICAgcGF0aF9xdWVyeSA9IHN0cmNocihidWYsICc/Jyk7CisgICAgaWYgKHBhdGhfcXVlcnkpCisgICAgICAgICpwYXRoX3F1ZXJ5ID0gJ1wwJzsKKworICAgIC8qIElzIHJlbGF0aXZlIHBhdGgganVzdCBhIG5ldyBxdWVyeSBwYXJ0PyAqLworICAgIGlmIChyZWxbMF0gPT0gJz8nKSB7CisgICAgICAgIGF2X3N0cmxjYXQoYnVmLCByZWwsIHNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogUmVtb3ZlIHRoZSBmaWxlIG5hbWUgZnJvbSB0aGUgYmFzZSB1cmwgKi8KKyAgICBzZXAgPSBzdHJyY2hyKGJ1ZiwgJy8nKTsKKyAgICBpZiAoc2VwKQorICAgICAgICBzZXBbMV0gPSAnXDAnOworICAgIGVsc2UKKyAgICAgICAgYnVmWzBdID0gJ1wwJzsKKyAgICB3aGlsZSAoYXZfc3Ryc3RhcnQocmVsLCAiLi4vIiwgTlVMTCkgJiYgc2VwKSB7CisgICAgICAgIC8qIFJlbW92ZSB0aGUgcGF0aCBkZWxpbWl0ZXIgYXQgdGhlIGVuZCAqLworICAgICAgICBzZXBbMF0gPSAnXDAnOworICAgICAgICBzZXAgPSBzdHJyY2hyKGJ1ZiwgJy8nKTsKKyAgICAgICAgLyogSWYgdGhlIG5leHQgZGlyZWN0b3J5IG5hbWUgdG8gcG9wIG9mZiBpcyAiLi4iLCBicmVhayBoZXJlICovCisgICAgICAgIGlmICghc3RyY21wKHNlcCA/ICZzZXBbMV0gOiBidWYsICIuLiIpKSB7CisgICAgICAgICAgICAvKiBSZWFkZCB0aGUgc2xhc2ggd2UganVzdCByZW1vdmVkICovCisgICAgICAgICAgICBhdl9zdHJsY2F0KGJ1ZiwgIi8iLCBzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIEN1dCBvZmYgdGhlIGRpcmVjdG9yeSBuYW1lICovCisgICAgICAgIGlmIChzZXApCisgICAgICAgICAgICBzZXBbMV0gPSAnXDAnOworICAgICAgICBlbHNlCisgICAgICAgICAgICBidWZbMF0gPSAnXDAnOworICAgICAgICByZWwgKz0gMzsKKyAgICB9CisgICAgYXZfc3RybGNhdChidWYsIHJlbCwgc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdXJsLmggYi9mZm1wZWcvbGliYXZmb3JtYXQvdXJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwMzVmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC91cmwuaApAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogdW5idWZmZXJlZCBwcml2YXRlIEkvTyBBUEkKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1VSTF9ICisjZGVmaW5lIEFWRk9STUFUX1VSTF9ICisKKyNpbmNsdWRlICJhdmlvLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvdmVyc2lvbi5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisKKyNkZWZpbmUgVVJMX1BST1RPQ09MX0ZMQUdfTkVTVEVEX1NDSEVNRSAxIC8qPCBUaGUgcHJvdG9jb2wgbmFtZSBjYW4gYmUgdGhlIGZpcnN0IHBhcnQgb2YgYSBuZXN0ZWQgcHJvdG9jb2wgc2NoZW1lICovCisjZGVmaW5lIFVSTF9QUk9UT0NPTF9GTEFHX05FVFdPUksgICAgICAgMiAvKjwgVGhlIHByb3RvY29sIHVzZXMgbmV0d29yayAqLworCitleHRlcm4gY29uc3QgQVZDbGFzcyBmZnVybF9jb250ZXh0X2NsYXNzOworCit0eXBlZGVmIHN0cnVjdCBVUkxDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsgICAgLyoqPCBpbmZvcm1hdGlvbiBmb3IgYXZfbG9nKCkuIFNldCBieSB1cmxfb3BlbigpLiAqLworICAgIHN0cnVjdCBVUkxQcm90b2NvbCAqcHJvdDsKKyAgICB2b2lkICpwcml2X2RhdGE7CisgICAgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgIC8qKjwgc3BlY2lmaWVkIFVSTCAqLworICAgIGludCBmbGFnczsKKyAgICBpbnQgbWF4X3BhY2tldF9zaXplOyAgICAgICAgLyoqPCBpZiBub24gemVybywgdGhlIHN0cmVhbSBpcyBwYWNrZXRpemVkIHdpdGggdGhpcyBtYXggcGFja2V0IHNpemUgKi8KKyAgICBpbnQgaXNfc3RyZWFtZWQ7ICAgICAgICAgICAgLyoqPCB0cnVlIGlmIHN0cmVhbWVkIChubyBzZWVrIHBvc3NpYmxlKSwgZGVmYXVsdCA9IGZhbHNlICovCisgICAgaW50IGlzX2Nvbm5lY3RlZDsKKyAgICBBVklPSW50ZXJydXB0Q0IgaW50ZXJydXB0X2NhbGxiYWNrOworICAgIGludDY0X3QgcndfdGltZW91dDsgICAgICAgICAvKio8IG1heGltdW0gdGltZSB0byB3YWl0IGZvciAobmV0d29yaykgcmVhZC93cml0ZSBvcGVyYXRpb24gY29tcGxldGlvbiwgaW4gbWNzICovCit9IFVSTENvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFVSTFByb3RvY29sIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCAgICAgKCp1cmxfb3BlbikoIFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVybCwgaW50IGZsYWdzKTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIHRvIGJlIHVzZWQgYnkgcHJvdG9jb2xzIHdoaWNoIG9wZW4gZnVydGhlciBuZXN0ZWQKKyAgICAgKiBwcm90b2NvbHMuIG9wdGlvbnMgYXJlIHRoZW4gdG8gYmUgcGFzc2VkIHRvIGZmdXJsX29wZW4oKS9mZnVybF9jb25uZWN0KCkKKyAgICAgKiBmb3IgdGhvc2UgbmVzdGVkIHByb3RvY29scy4KKyAgICAgKi8KKyAgICBpbnQgICAgICgqdXJsX29wZW4yKShVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmwsIGludCBmbGFncywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucyk7CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGRhdGEgZnJvbSB0aGUgcHJvdG9jb2wuCisgICAgICogSWYgZGF0YSBpcyBpbW1lZGlhdGVseSBhdmFpbGFibGUgKGV2ZW4gbGVzcyB0aGFuIHNpemUpLCBFT0YgaXMKKyAgICAgKiByZWFjaGVkIG9yIGFuIGVycm9yIG9jY3VycyAoaW5jbHVkaW5nIEVJTlRSKSwgcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgICAqIE90aGVyd2lzZToKKyAgICAgKiBJbiBub24tYmxvY2tpbmcgbW9kZSwgcmV0dXJuIEFWRVJST1IoRUFHQUlOKSBpbW1lZGlhdGVseS4KKyAgICAgKiBJbiBibG9ja2luZyBtb2RlLCB3YWl0IGZvciBkYXRhL0VPRi9lcnJvciB3aXRoIGEgc2hvcnQgdGltZW91dCAoMC4xcyksCisgICAgICogYW5kIHJldHVybiBBVkVSUk9SKEVBR0FJTikgb24gdGltZW91dC4KKyAgICAgKiBDaGVja2luZyBpbnRlcnJ1cHRfY2FsbGJhY2ssIGxvb3Bpbmcgb24gRUlOVFIgYW5kIEVBR0FJTiBhbmQgdW50aWwKKyAgICAgKiBlbm91Z2ggZGF0YSBoYXMgYmVlbiByZWFkIGlzIGxlZnQgdG8gdGhlIGNhbGxpbmcgZnVuY3Rpb247IHNlZQorICAgICAqIHJldHJ5X3RyYW5zZmVyX3dyYXBwZXIgaW4gYXZpby5jLgorICAgICAqLworICAgIGludCAgICAgKCp1cmxfcmVhZCkoIFVSTENvbnRleHQgKmgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworICAgIGludCAgICAgKCp1cmxfd3JpdGUpKFVSTENvbnRleHQgKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworICAgIGludDY0X3QgKCp1cmxfc2VlaykoIFVSTENvbnRleHQgKmgsIGludDY0X3QgcG9zLCBpbnQgd2hlbmNlKTsKKyAgICBpbnQgICAgICgqdXJsX2Nsb3NlKShVUkxDb250ZXh0ICpoKTsKKyAgICBzdHJ1Y3QgVVJMUHJvdG9jb2wgKm5leHQ7CisgICAgaW50ICgqdXJsX3JlYWRfcGF1c2UpKFVSTENvbnRleHQgKmgsIGludCBwYXVzZSk7CisgICAgaW50NjRfdCAoKnVybF9yZWFkX3NlZWspKFVSTENvbnRleHQgKmgsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpOworICAgIGludCAoKnVybF9nZXRfZmlsZV9oYW5kbGUpKFVSTENvbnRleHQgKmgpOworICAgIGludCAoKnVybF9nZXRfbXVsdGlfZmlsZV9oYW5kbGUpKFVSTENvbnRleHQgKmgsIGludCAqKmhhbmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1oYW5kbGVzKTsKKyAgICBpbnQgKCp1cmxfc2h1dGRvd24pKFVSTENvbnRleHQgKmgsIGludCBmbGFncyk7CisgICAgaW50IHByaXZfZGF0YV9zaXplOworICAgIGNvbnN0IEFWQ2xhc3MgKnByaXZfZGF0YV9jbGFzczsKKyAgICBpbnQgZmxhZ3M7CisgICAgaW50ICgqdXJsX2NoZWNrKShVUkxDb250ZXh0ICpoLCBpbnQgbWFzayk7Cit9IFVSTFByb3RvY29sOworCisvKioKKyAqIENyZWF0ZSBhIFVSTENvbnRleHQgZm9yIGFjY2Vzc2luZyB0byB0aGUgcmVzb3VyY2UgaW5kaWNhdGVkIGJ5CisgKiB1cmwsIGJ1dCBkbyBub3QgaW5pdGlhdGUgdGhlIGNvbm5lY3Rpb24geWV0LgorICoKKyAqIEBwYXJhbSBwdWMgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUsIGluIGNhc2Ugb2Ygc3VjY2VzcywgdGhlCisgKiBmdW5jdGlvbiBwdXRzIHRoZSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIFVSTENvbnRleHQKKyAqIEBwYXJhbSBmbGFncyBmbGFncyB3aGljaCBjb250cm9sIGhvdyB0aGUgcmVzb3VyY2UgaW5kaWNhdGVkIGJ5IHVybAorICogaXMgdG8gYmUgb3BlbmVkCisgKiBAcGFyYW0gaW50X2NiIGludGVycnVwdCBjYWxsYmFjayB0byB1c2UgZm9yIHRoZSBVUkxDb250ZXh0LCBtYXkgYmUKKyAqIE5VTEwKKyAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbgorICogQVZFUlJPUiBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgZmZ1cmxfYWxsb2MoVVJMQ29udGV4dCAqKnB1YywgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBBVklPSW50ZXJydXB0Q0IgKmludF9jYik7CisKKy8qKgorICogQ29ubmVjdCBhbiBVUkxDb250ZXh0IHRoYXQgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IGZmdXJsX2FsbG9jCisgKgorICogQHBhcmFtIG9wdGlvbnMgIEEgZGljdGlvbmFyeSBmaWxsZWQgd2l0aCBvcHRpb25zIGZvciBuZXN0ZWQgcHJvdG9jb2xzLAorICogaS5lLiBpdCB3aWxsIGJlIHBhc3NlZCB0byB1cmxfb3BlbjIoKSBmb3IgcHJvdG9jb2xzIGltcGxlbWVudGluZyBpdC4KKyAqIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgZGVzdHJveWVkIGFuZCByZXBsYWNlZCB3aXRoIGEgZGljdCBjb250YWluaW5nIG9wdGlvbnMKKyAqIHRoYXQgd2VyZSBub3QgZm91bmQuIE1heSBiZSBOVUxMLgorICovCitpbnQgZmZ1cmxfY29ubmVjdChVUkxDb250ZXh0ICp1YywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucyk7CisKKy8qKgorICogQ3JlYXRlIGFuIFVSTENvbnRleHQgZm9yIGFjY2Vzc2luZyB0byB0aGUgcmVzb3VyY2UgaW5kaWNhdGVkIGJ5CisgKiB1cmwsIGFuZCBvcGVuIGl0LgorICoKKyAqIEBwYXJhbSBwdWMgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUsIGluIGNhc2Ugb2Ygc3VjY2VzcywgdGhlCisgKiBmdW5jdGlvbiBwdXRzIHRoZSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIFVSTENvbnRleHQKKyAqIEBwYXJhbSBmbGFncyBmbGFncyB3aGljaCBjb250cm9sIGhvdyB0aGUgcmVzb3VyY2UgaW5kaWNhdGVkIGJ5IHVybAorICogaXMgdG8gYmUgb3BlbmVkCisgKiBAcGFyYW0gaW50X2NiIGludGVycnVwdCBjYWxsYmFjayB0byB1c2UgZm9yIHRoZSBVUkxDb250ZXh0LCBtYXkgYmUKKyAqIE5VTEwKKyAqIEBwYXJhbSBvcHRpb25zICBBIGRpY3Rpb25hcnkgZmlsbGVkIHdpdGggcHJvdG9jb2wtcHJpdmF0ZSBvcHRpb25zLiBPbiByZXR1cm4KKyAqIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgZGVzdHJveWVkIGFuZCByZXBsYWNlZCB3aXRoIGEgZGljdCBjb250YWluaW5nIG9wdGlvbnMKKyAqIHRoYXQgd2VyZSBub3QgZm91bmQuIE1heSBiZSBOVUxMLgorICogQHJldHVybiA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuCisgKiBBVkVSUk9SIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCBmZnVybF9vcGVuKFVSTENvbnRleHQgKipwdWMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICBjb25zdCBBVklPSW50ZXJydXB0Q0IgKmludF9jYiwgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucyk7CisKKy8qKgorICogUmVhZCB1cCB0byBzaXplIGJ5dGVzIGZyb20gdGhlIHJlc291cmNlIGFjY2Vzc2VkIGJ5IGgsIGFuZCBzdG9yZQorICogdGhlIHJlYWQgYnl0ZXMgaW4gYnVmLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCBvciBhIG5lZ2F0aXZlIHZhbHVlCisgKiBjb3JyZXNwb25kaW5nIHRvIGFuIEFWRVJST1IgY29kZSBpbiBjYXNlIG9mIGVycm9yLiBBIHZhbHVlIG9mIHplcm8KKyAqIGluZGljYXRlcyB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZWFkIG1vcmUgZnJvbSB0aGUgYWNjZXNzZWQKKyAqIHJlc291cmNlIChleGNlcHQgaWYgdGhlIHZhbHVlIG9mIHRoZSBzaXplIGFyZ3VtZW50IGlzIGFsc28gemVybykuCisgKi8KK2ludCBmZnVybF9yZWFkKFVSTENvbnRleHQgKmgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworCisvKioKKyAqIFJlYWQgYXMgbWFueSBieXRlcyBhcyBwb3NzaWJsZSAodXAgdG8gc2l6ZSksIGNhbGxpbmcgdGhlCisgKiByZWFkIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIGlmIG5lY2Vzc2FyeS4KKyAqIFRoaXMgbWFrZXMgc3BlY2lhbCBzaG9ydC1yZWFkIGhhbmRsaW5nIGluIGFwcGxpY2F0aW9ucworICogdW5uZWNlc3NhcnksIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgPCBzaXplIHRoZW4gaXQgaXMKKyAqIGNlcnRhaW4gdGhlcmUgd2FzIGVpdGhlciBhbiBlcnJvciBvciB0aGUgZW5kIG9mIGZpbGUgd2FzIHJlYWNoZWQuCisgKi8KK2ludCBmZnVybF9yZWFkX2NvbXBsZXRlKFVSTENvbnRleHQgKmgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworCisvKioKKyAqIFdyaXRlIHNpemUgYnl0ZXMgZnJvbSBidWYgdG8gdGhlIHJlc291cmNlIGFjY2Vzc2VkIGJ5IGguCisgKgorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4sIG9yIGEgbmVnYXRpdmUgdmFsdWUKKyAqIGNvcnJlc3BvbmRpbmcgdG8gYW4gQVZFUlJPUiBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgZmZ1cmxfd3JpdGUoVVJMQ29udGV4dCAqaCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CisKKy8qKgorICogQ2hhbmdlIHRoZSBwb3NpdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgbmV4dCByZWFkL3dyaXRlCisgKiBvcGVyYXRpb24gb24gdGhlIHJlc291cmNlIGFjY2Vzc2VkIGJ5IGguCisgKgorICogQHBhcmFtIHBvcyBzcGVjaWZpZXMgdGhlIG5ldyBwb3NpdGlvbiB0byBzZXQKKyAqIEBwYXJhbSB3aGVuY2Ugc3BlY2lmaWVzIGhvdyBwb3Mgc2hvdWxkIGJlIGludGVycHJldGVkLCBpdCBtdXN0IGJlCisgKiBvbmUgb2YgU0VFS19TRVQgKHNlZWsgZnJvbSB0aGUgYmVnaW5uaW5nKSwgU0VFS19DVVIgKHNlZWsgZnJvbSB0aGUKKyAqIGN1cnJlbnQgcG9zaXRpb24pLCBTRUVLX0VORCAoc2VlayBmcm9tIHRoZSBlbmQpLCBvciBBVlNFRUtfU0laRQorICogKHJldHVybiB0aGUgZmlsZXNpemUgb2YgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSwgcG9zIGlzIGlnbm9yZWQpLgorICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4gQVZFUlJPUiBjb2RlIGluIGNhc2UKKyAqIG9mIGZhaWx1cmUsIG9yIHRoZSByZXN1bHRpbmcgZmlsZSBwb3NpdGlvbiwgbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbQorICogdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gWW91IGNhbiB1c2UgdGhpcyBmZWF0dXJlIHRvZ2V0aGVyIHdpdGgKKyAqIFNFRUtfQ1VSIHRvIHJlYWQgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4KKyAqLworaW50NjRfdCBmZnVybF9zZWVrKFVSTENvbnRleHQgKmgsIGludDY0X3QgcG9zLCBpbnQgd2hlbmNlKTsKKworLyoqCisgKiBDbG9zZSB0aGUgcmVzb3VyY2UgYWNjZXNzZWQgYnkgdGhlIFVSTENvbnRleHQgaCwgYW5kIGZyZWUgdGhlCisgKiBtZW1vcnkgdXNlZCBieSBpdC4gQWxzbyBzZXQgdGhlIFVSTENvbnRleHQgcG9pbnRlciB0byBOVUxMLgorICoKKyAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiBhbiBlcnJvciBjb25kaXRpb24gb2NjdXJyZWQsIDAKKyAqIG90aGVyd2lzZQorICovCitpbnQgZmZ1cmxfY2xvc2VwKFVSTENvbnRleHQgKipoKTsKK2ludCBmZnVybF9jbG9zZShVUkxDb250ZXh0ICpoKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGZpbGVzaXplIG9mIHRoZSByZXNvdXJjZSBhY2Nlc3NlZCBieSBoLCBBVkVSUk9SKEVOT1NZUykKKyAqIGlmIHRoZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBoLCBvciBhbm90aGVyIG5lZ2F0aXZlIHZhbHVlCisgKiBjb3JyZXNwb25kaW5nIHRvIGFuIEFWRVJST1IgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK2ludDY0X3QgZmZ1cmxfc2l6ZShVUkxDb250ZXh0ICpoKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGZpbGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBVUkwuIEZvciBSVFAsIHRoaXMKKyAqIHdpbGwgcmV0dXJuIG9ubHkgdGhlIFJUUCBmaWxlIGRlc2NyaXB0b3IsIG5vdCB0aGUgUlRDUCBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHJldHVybiB0aGUgZmlsZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFVSTCwgb3IgPDAgb24gZXJyb3IuCisgKi8KK2ludCBmZnVybF9nZXRfZmlsZV9oYW5kbGUoVVJMQ29udGV4dCAqaCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFVSTC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcyBvciA8MCBvbiBlcnJvci4KKyAqLworaW50IGZmdXJsX2dldF9tdWx0aV9maWxlX2hhbmRsZShVUkxDb250ZXh0ICpoLCBpbnQgKipoYW5kbGVzLCBpbnQgKm51bWhhbmRsZXMpOworCisvKioKKyAqIFNpZ25hbCB0aGUgVVJMQ29udGV4dCB0aGF0IHdlIGFyZSBkb25lIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgc3RyZWFtLgorICoKKyAqIEBwYXJhbSBoIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlCisgKiBAcGFyYW0gZmxhZ3MgZmxhZ3Mgd2hpY2ggY29udHJvbCBob3cgdGhlIHJlc291cmNlIGluZGljYXRlZCBieSB1cmwKKyAqIGlzIHRvIGJlIHNodXRkb3duCisgKgorICogQHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIGFuIGVycm9yIGNvbmRpdGlvbiBvY2N1cnJlZCwgMAorICogb3RoZXJ3aXNlCisgKi8KK2ludCBmZnVybF9zaHV0ZG93bihVUkxDb250ZXh0ICpoLCBpbnQgZmxhZ3MpOworCisvKioKKyAqIFJlZ2lzdGVyIHRoZSBVUkxQcm90b2NvbCBwcm90b2NvbC4KKyAqLworaW50IGZmdXJsX3JlZ2lzdGVyX3Byb3RvY29sKFVSTFByb3RvY29sICpwcm90b2NvbCk7CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0byBpbnRlcnJ1cCBhIGJsb2NraW5nIGZ1bmN0aW9uCisgKiBhc3NvY2lhdGVkIHdpdGggY2IuCisgKi8KK2ludCBmZl9jaGVja19pbnRlcnJ1cHQoQVZJT0ludGVycnVwdENCICpjYik7CisKKy8qKgorICogSXRlcmF0ZSBvdmVyIGFsbCBhdmFpbGFibGUgcHJvdG9jb2xzLgorICoKKyAqIEBwYXJhbSBwcmV2IHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgY2FsbCB0byB0aGlzIGZ1bmN0aW9ucyBvciBOVUxMLgorICovCitVUkxQcm90b2NvbCAqZmZ1cmxfcHJvdG9jb2xfbmV4dChjb25zdCBVUkxQcm90b2NvbCAqcHJldik7CisKKy8qIHVkcC5jICovCitpbnQgZmZfdWRwX3NldF9yZW1vdGVfdXJsKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSk7CitpbnQgZmZfdWRwX2dldF9sb2NhbF9wb3J0KFVSTENvbnRleHQgKmgpOworCisvKioKKyAqIEFzc2VtYmxlIGEgVVJMIHN0cmluZyBmcm9tIGNvbXBvbmVudHMuIFRoaXMgaXMgdGhlIHJldmVyc2Ugb3BlcmF0aW9uCisgKiBvZiBhdl91cmxfc3BsaXQuCisgKgorICogTm90ZSwgdGhpcyByZXF1aXJlcyBuZXR3b3JraW5nIHRvIGJlIGluaXRpYWxpemVkLCBzbyB0aGUgY2FsbGVyIG11c3QKKyAqIGVuc3VyZSBmZl9uZXR3b3JrX2luaXQgaGFzIGJlZW4gY2FsbGVkLgorICoKKyAqIEBzZWUgYXZfdXJsX3NwbGl0CisgKgorICogQHBhcmFtIHN0ciB0aGUgYnVmZmVyIHRvIGZpbGwgd2l0aCB0aGUgdXJsCisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgc3RyIGJ1ZmZlcgorICogQHBhcmFtIHByb3RvIHRoZSBwcm90b2NvbCBpZGVudGlmaWVyLCBpZiBudWxsLCB0aGUgc2VwYXJhdG9yCisgKiAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGlkZW50aWZpZXIgaXMgbGVmdCBvdXQsIHRvbworICogQHBhcmFtIGF1dGhvcml6YXRpb24gYW4gb3B0aW9uYWwgYXV0aG9yaXphdGlvbiBzdHJpbmcsIG1heSBiZSBudWxsLgorICogICAgICAgICAgICAgICAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYSBudWxsIHN0cmluZy4KKyAqIEBwYXJhbSBob3N0bmFtZSB0aGUgaG9zdCBuYW1lIHN0cmluZworICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgbnVtYmVyLCBsZWZ0IG91dCBmcm9tIHRoZSBzdHJpbmcgaWYgbmVnYXRpdmUKKyAqIEBwYXJhbSBmbXQgYSBnZW5lcmljIGZvcm1hdCBzdHJpbmcgZm9yIGV2ZXJ5dGhpbmcgdG8gYWRkIGFmdGVyIHRoZQorICogICAgICAgICAgICBob3N0L3BvcnQsIG1heSBiZSBudWxsCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqLworaW50IGZmX3VybF9qb2luKGNoYXIgKnN0ciwgaW50IHNpemUsIGNvbnN0IGNoYXIgKnByb3RvLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF1dGhvcml6YXRpb24sIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorICAgICAgICAgICAgICAgIGludCBwb3J0LCBjb25zdCBjaGFyICpmbXQsIC4uLikgYXZfcHJpbnRmX2Zvcm1hdCg3LCA4KTsKKworLyoqCisgKiBDb252ZXJ0IGEgcmVsYXRpdmUgdXJsIGludG8gYW4gYWJzb2x1dGUgdXJsLCBnaXZlbiBhIGJhc2UgdXJsLgorICoKKyAqIEBwYXJhbSBidWYgdGhlIGJ1ZmZlciB3aGVyZSBvdXRwdXQgYWJzb2x1dGUgdXJsIGlzIHdyaXR0ZW4KKyAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIGJ1ZgorICogQHBhcmFtIGJhc2UgdGhlIGJhc2UgdXJsLCBtYXkgYmUgZXF1YWwgdG8gYnVmLgorICogQHBhcmFtIHJlbCB0aGUgbmV3IHVybCwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gYmFzZQorICovCit2b2lkIGZmX21ha2VfYWJzb2x1dGVfdXJsKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IGNoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbCk7CisKKworI2VuZGlmIC8qIEFWRk9STUFUX1VSTF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdXJsZGVjb2RlLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdXJsZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzZDkxMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC91cmxkZWNvZGUuYwpAQCAtMCwwICsxLDg2IEBACisvKgorICogU2ltcGxlIFVSTCBkZWNvZGluZyBmdW5jdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDEyIEFudHRpIFNlcHDDpGzDpAorICoKKyAqIFJlZmVyZW5jZXM6CisgKiAgUkZDIDM5ODY6IFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKTogR2VuZXJpYyBTeW50YXgKKyAqICAgICAgIFQuIEJlcm5lcnMtTGVlIGV0IGFsLiBUaGUgSW50ZXJuZXQgU29jaWV0eSwgMjAwNQorICoKKyAqIGJhc2VkIG9uIGh0dHA6Ly93d3cuaWNvc2FlZHJvLml0L2FwYWNoZS91cmxkZWNvZGUuYworICogICAgICAgICAgZnJvbSBVbWJlcnRvIFNhbHNpIChzYWxzaUBpY29zYWVkcm8uaXQpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJ1cmxkZWNvZGUuaCIKKworY2hhciAqZmZfdXJsZGVjb2RlKGNvbnN0IGNoYXIgKnVybCkKK3sKKyAgICBpbnQgcyA9IDAsIGQgPSAwLCB1cmxfbGVuID0gMDsKKyAgICBjaGFyIGM7CisgICAgY2hhciAqZGVzdCA9IE5VTEw7CisKKyAgICBpZiAoIXVybCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB1cmxfbGVuID0gc3RybGVuKHVybCkgKyAxOworICAgIGRlc3QgPSBhdl9tYWxsb2ModXJsX2xlbik7CisKKyAgICBpZiAoIWRlc3QpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgd2hpbGUgKHMgPCB1cmxfbGVuKSB7CisgICAgICAgIGMgPSB1cmxbcysrXTsKKworICAgICAgICBpZiAoYyA9PSAnJScgJiYgcyArIDIgPCB1cmxfbGVuKSB7CisgICAgICAgICAgICBjaGFyIGMyID0gdXJsW3MrK107CisgICAgICAgICAgICBjaGFyIGMzID0gdXJsW3MrK107CisgICAgICAgICAgICBpZiAoYXZfaXN4ZGlnaXQoYzIpICYmIGF2X2lzeGRpZ2l0KGMzKSkgeworICAgICAgICAgICAgICAgIGMyID0gYXZfdG9sb3dlcihjMik7CisgICAgICAgICAgICAgICAgYzMgPSBhdl90b2xvd2VyKGMzKTsKKworICAgICAgICAgICAgICAgIGlmIChjMiA8PSAnOScpCisgICAgICAgICAgICAgICAgICAgIGMyID0gYzIgLSAnMCc7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjMiA9IGMyIC0gJ2EnICsgMTA7CisKKyAgICAgICAgICAgICAgICBpZiAoYzMgPD0gJzknKQorICAgICAgICAgICAgICAgICAgICBjMyA9IGMzIC0gJzAnOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYzMgPSBjMyAtICdhJyArIDEwOworCisgICAgICAgICAgICAgICAgZGVzdFtkKytdID0gMTYgKiBjMiArIGMzOworCisgICAgICAgICAgICB9IGVsc2UgeyAvKiAlenogb3Igc29tZXRoaW5nIG90aGVyIGludmFsaWQgKi8KKyAgICAgICAgICAgICAgICBkZXN0W2QrK10gPSBjOworICAgICAgICAgICAgICAgIGRlc3RbZCsrXSA9IGMyOworICAgICAgICAgICAgICAgIGRlc3RbZCsrXSA9IGMzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJysnKSB7CisgICAgICAgICAgICBkZXN0W2QrK10gPSAnICc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0W2QrK10gPSBjOworICAgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gZGVzdDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC91cmxkZWNvZGUuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC91cmxkZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjgxZWJjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3VybGRlY29kZS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9VUkxERUNPREVfSAorI2RlZmluZSBBVkZPUk1BVF9VUkxERUNPREVfSAorCisvKioKKyAqIERlY29kZXMgYW4gVVJMIGZyb20gaXRzIHBlcmNlbnQtZW5jb2RlZCBmb3JtIGJhY2sgaW50byBub3JtYWwKKyAqIHJlcHJlc2VudGF0aW9uLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRlY29kZWQgVVJMIGluIGEgc3RyaW5nLgorICogVGhlIFVSTCB0byBiZSBkZWNvZGVkIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gYmUgZW5jb2RlZCBidXQKKyAqIGluIHRoYXQgY2FzZSB0aGUgb3JpZ2luYWwgc3RyaW5nIGlzIGR1cGxpY2F0ZWQuCisgKgorICogQHBhcmFtIHVybCBhIHN0cmluZyB0byBiZSBkZWNvZGVkLgorICogQHJldHVybiBuZXcgc3RyaW5nIHdpdGggdGhlIFVSTCBkZWNvZGVkIG9yIE5VTEwgaWYgZGVjb2RpbmcgZmFpbGVkLgorICogTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBzdHJpbmcgc2hvdWxkIGJlIGV4cGxpY2l0bHkgZnJlZWQgd2hlbiBub3QKKyAqIHVzZWQgYW55bW9yZS4KKyAqLworY2hhciAqZmZfdXJsZGVjb2RlKGNvbnN0IGNoYXIgKnVybCk7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9VUkxERUNPREVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3V0aWxzLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OThjNjEyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3V0aWxzLmMKQEAgLTAsMCArMSw0NDA5IEBACisvKgorICogdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGhpbiBGRm1wZWcKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9yYXcuaCIKKworI2luY2x1ZGUgImF1ZGlvaW50ZXJsZWF2ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImlkM3YyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2lmIENPTkZJR19ORVRXT1JLCisjaW5jbHVkZSAibmV0d29yay5oIgorI2VuZGlmCisjaW5jbHVkZSAicmlmZi5oIgorI2luY2x1ZGUgInVybC5oIgorCisvKioKKyAqIEBmaWxlCisgKiB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aGluIEZGbXBlZworICovCisKK3Vuc2lnbmVkIGF2Zm9ybWF0X3ZlcnNpb24odm9pZCkKK3sKKyAgICBhdl9hc3NlcnQwKExJQkFWRk9STUFUX1ZFUlNJT05fTUlDUk8gPj0gMTAwKTsKKyAgICByZXR1cm4gTElCQVZGT1JNQVRfVkVSU0lPTl9JTlQ7Cit9CisKK2NvbnN0IGNoYXIgKmF2Zm9ybWF0X2NvbmZpZ3VyYXRpb24odm9pZCkKK3sKKyAgICByZXR1cm4gRkZNUEVHX0NPTkZJR1VSQVRJT047Cit9CisKK2NvbnN0IGNoYXIgKmF2Zm9ybWF0X2xpY2Vuc2Uodm9pZCkKK3sKKyNkZWZpbmUgTElDRU5TRV9QUkVGSVggImxpYmF2Zm9ybWF0IGxpY2Vuc2U6ICIKKyAgICByZXR1cm4gTElDRU5TRV9QUkVGSVggRkZNUEVHX0xJQ0VOU0UgKyBzaXplb2YoTElDRU5TRV9QUkVGSVgpIC0gMTsKK30KKworI2RlZmluZSBSRUxBVElWRV9UU19CQVNFIChJTlQ2NF9NQVggLSAoMUxMPDw0OCkpCisKK3N0YXRpYyBpbnQgaXNfcmVsYXRpdmUoaW50NjRfdCB0cykgeworICAgIHJldHVybiB0cyA+IChSRUxBVElWRV9UU19CQVNFIC0gKDFMTDw8NDgpKTsKK30KKworLyoqCisgKiBXcmFwIGEgZ2l2ZW4gdGltZSBzdGFtcCwgaWYgdGhlcmUgaXMgYW4gaW5kaWNhdGlvbiBmb3IgYW4gb3ZlcmZsb3cKKyAqCisgKiBAcGFyYW0gc3Qgc3RyZWFtCisgKiBAcGFyYW0gdGltZXN0YW1wIHRoZSB0aW1lIHN0YW1wIHRvIHdyYXAKKyAqIEByZXR1cm4gcmVzdWx0aW5nIHRpbWUgc3RhbXAKKyAqLworc3RhdGljIGludDY0X3Qgd3JhcF90aW1lc3RhbXAoQVZTdHJlYW0gKnN0LCBpbnQ2NF90IHRpbWVzdGFtcCkKK3sKKyAgICBpZiAoc3QtPnB0c193cmFwX2JlaGF2aW9yICE9IEFWX1BUU19XUkFQX0lHTk9SRSAmJgorICAgICAgICBzdC0+cHRzX3dyYXBfcmVmZXJlbmNlICE9IEFWX05PUFRTX1ZBTFVFICYmIHRpbWVzdGFtcCAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBpZiAoc3QtPnB0c193cmFwX2JlaGF2aW9yID09IEFWX1BUU19XUkFQX0FERF9PRkZTRVQgJiYKKyAgICAgICAgICAgIHRpbWVzdGFtcCA8IHN0LT5wdHNfd3JhcF9yZWZlcmVuY2UpCisgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wICsgKDFVTEwgPDwgc3QtPnB0c193cmFwX2JpdHMpOworICAgICAgICBlbHNlIGlmIChzdC0+cHRzX3dyYXBfYmVoYXZpb3IgPT0gQVZfUFRTX1dSQVBfU1VCX09GRlNFVCAmJgorICAgICAgICAgICAgdGltZXN0YW1wID49IHN0LT5wdHNfd3JhcF9yZWZlcmVuY2UpCisgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wIC0gKDFVTEwgPDwgc3QtPnB0c193cmFwX2JpdHMpOworICAgIH0KKyAgICByZXR1cm4gdGltZXN0YW1wOworfQorCitNQUtFX0FDQ0VTU09SUyhBVlN0cmVhbSwgc3RyZWFtLCBBVlJhdGlvbmFsLCByX2ZyYW1lX3JhdGUpCitNQUtFX0FDQ0VTU09SUyhBVlN0cmVhbSwgc3RyZWFtLCBjaGFyICosIHJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbikKK01BS0VfQUNDRVNTT1JTKEFWRm9ybWF0Q29udGV4dCwgZm9ybWF0LCBBVkNvZGVjICosIHZpZGVvX2NvZGVjKQorTUFLRV9BQ0NFU1NPUlMoQVZGb3JtYXRDb250ZXh0LCBmb3JtYXQsIEFWQ29kZWMgKiwgYXVkaW9fY29kZWMpCitNQUtFX0FDQ0VTU09SUyhBVkZvcm1hdENvbnRleHQsIGZvcm1hdCwgQVZDb2RlYyAqLCBzdWJ0aXRsZV9jb2RlYykKK01BS0VfQUNDRVNTT1JTKEFWRm9ybWF0Q29udGV4dCwgZm9ybWF0LCBpbnQsIG1ldGFkYXRhX2hlYWRlcl9wYWRkaW5nKQorTUFLRV9BQ0NFU1NPUlMoQVZGb3JtYXRDb250ZXh0LCBmb3JtYXQsIHZvaWQgKiwgb3BhcXVlKQorTUFLRV9BQ0NFU1NPUlMoQVZGb3JtYXRDb250ZXh0LCBmb3JtYXQsIGF2X2Zvcm1hdF9jb250cm9sX21lc3NhZ2UsIGNvbnRyb2xfbWVzc2FnZV9jYikKKworaW50NjRfdCBhdl9zdHJlYW1fZ2V0X2VuZF9wdHMoY29uc3QgQVZTdHJlYW0gKnN0KQoreworICAgIHJldHVybiBzdC0+cHRzLnZhbDsKK30KKworc3RydWN0IEFWQ29kZWNQYXJzZXJDb250ZXh0ICphdl9zdHJlYW1fZ2V0X3BhcnNlcihjb25zdCBBVlN0cmVhbSAqc3QpCit7CisgICAgcmV0dXJuIHN0LT5wYXJzZXI7Cit9CisKK3ZvaWQgYXZfZm9ybWF0X2luamVjdF9nbG9iYWxfc2lkZV9kYXRhKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBzLT5pbnRlcm5hbC0+aW5qZWN0X2dsb2JhbF9zaWRlX2RhdGEgPSAxOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgc3QtPmluamVjdF9nbG9iYWxfc2lkZV9kYXRhID0gMTsKKyAgICB9Cit9CisKK2ludCBmZl9jb3B5X3doaXRlbGlzdHMoQVZGb3JtYXRDb250ZXh0ICpkc3QsIEFWRm9ybWF0Q29udGV4dCAqc3JjKQoreworICAgIGF2X2Fzc2VydDAoIWRzdC0+Y29kZWNfd2hpdGVsaXN0ICYmICFkc3QtPmZvcm1hdF93aGl0ZWxpc3QpOworICAgIGRzdC0+IGNvZGVjX3doaXRlbGlzdCA9IGF2X3N0cmR1cChzcmMtPmNvZGVjX3doaXRlbGlzdCk7CisgICAgZHN0LT5mb3JtYXRfd2hpdGVsaXN0ID0gYXZfc3RyZHVwKHNyYy0+Zm9ybWF0X3doaXRlbGlzdCk7CisgICAgaWYgKCAgIChzcmMtPiBjb2RlY193aGl0ZWxpc3QgJiYgIWRzdC0+IGNvZGVjX3doaXRlbGlzdCkKKyAgICAgICAgfHwgKHNyYy0+Zm9ybWF0X3doaXRlbGlzdCAmJiAhZHN0LT5mb3JtYXRfd2hpdGVsaXN0KSkgeworICAgICAgICBhdl9sb2coZHN0LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZHVwbGljYXRlIHdoaXRlbGlzdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZDb2RlYyAqZmluZF9kZWNvZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCkKK3sKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlYykKKyAgICAgICAgcmV0dXJuIHN0LT5jb2RlYy0+Y29kZWM7CisKKyAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBpZiAocy0+dmlkZW9fY29kZWMpICAgIHJldHVybiBzLT52aWRlb19jb2RlYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIGlmIChzLT5hdWRpb19jb2RlYykgICAgcmV0dXJuIHMtPmF1ZGlvX2NvZGVjOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgaWYgKHMtPnN1YnRpdGxlX2NvZGVjKSByZXR1cm4gcy0+c3VidGl0bGVfY29kZWM7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBhdmNvZGVjX2ZpbmRfZGVjb2Rlcihjb2RlY19pZCk7Cit9CisKK2ludCBhdl9mb3JtYXRfZ2V0X3Byb2JlX3Njb3JlKGNvbnN0IEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gcy0+cHJvYmVfc2NvcmU7Cit9CisKKy8qIGFuIGFyYml0cmFyaWx5IGNob3NlbiAic2FuZSIgbWF4IHBhY2tldCBzaXplIC0tIDUwTSAqLworI2RlZmluZSBTQU5FX0NIVU5LX1NJWkUgKDUwMDAwMDAwKQorCitpbnQgZmZpb19saW1pdChBVklPQ29udGV4dCAqcywgaW50IHNpemUpCit7CisgICAgaWYgKHMtPm1heHNpemU+PSAwKSB7CisgICAgICAgIGludDY0X3QgcmVtYWluaW5nPSBzLT5tYXhzaXplIC0gYXZpb190ZWxsKHMpOworICAgICAgICBpZiAocmVtYWluaW5nIDwgc2l6ZSkgeworICAgICAgICAgICAgaW50NjRfdCBuZXdzaXplID0gYXZpb19zaXplKHMpOworICAgICAgICAgICAgaWYgKCFzLT5tYXhzaXplIHx8IHMtPm1heHNpemU8bmV3c2l6ZSkKKyAgICAgICAgICAgICAgICBzLT5tYXhzaXplID0gbmV3c2l6ZSAtICFuZXdzaXplOworICAgICAgICAgICAgcmVtYWluaW5nPSBzLT5tYXhzaXplIC0gYXZpb190ZWxsKHMpOworICAgICAgICAgICAgcmVtYWluaW5nPSBGRk1BWChyZW1haW5pbmcsIDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPm1heHNpemU+PSAwICYmIHJlbWFpbmluZysxIDwgc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIHJlbWFpbmluZyA/IEFWX0xPR19FUlJPUiA6IEFWX0xPR19ERUJVRywgIlRydW5jYXRpbmcgcGFja2V0IG9mIHNpemUgJWQgdG8gJSJQUklkNjQiXG4iLCBzaXplLCByZW1haW5pbmcrMSk7CisgICAgICAgICAgICBzaXplID0gcmVtYWluaW5nKzE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qIFJlYWQgdGhlIGRhdGEgaW4gc2FuZS1zaXplZCBjaHVua3MgYW5kIGFwcGVuZCB0byBwa3QuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIGFuIGVycm9yLiAqLworc3RhdGljIGludCBhcHBlbmRfcGFja2V0X2NodW5rZWQoQVZJT0NvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsIGludCBzaXplKQoreworICAgIGludDY0X3Qgb3JpZ19wb3MgICA9IHBrdC0+cG9zOyAvLyBhdl9ncm93X3BhY2tldCBtaWdodCByZXNldCBwb3MKKyAgICBpbnQgb3JpZ19zaXplICAgICAgPSBwa3QtPnNpemU7CisgICAgaW50IHJldDsKKworICAgIGRvIHsKKyAgICAgICAgaW50IHByZXZfc2l6ZSA9IHBrdC0+c2l6ZTsKKyAgICAgICAgaW50IHJlYWRfc2l6ZTsKKworICAgICAgICAvKiBXaGVuIHRoZSBjYWxsZXIgcmVxdWVzdHMgYSBsb3Qgb2YgZGF0YSwgbGltaXQgaXQgdG8gdGhlIGFtb3VudAorICAgICAgICAgKiBsZWZ0IGluIGZpbGUgb3IgU0FORV9DSFVOS19TSVpFIHdoZW4gaXQgaXMgbm90IGtub3duLiAqLworICAgICAgICByZWFkX3NpemUgPSBzaXplOworICAgICAgICBpZiAocmVhZF9zaXplID4gU0FORV9DSFVOS19TSVpFLzEwKSB7CisgICAgICAgICAgICByZWFkX3NpemUgPSBmZmlvX2xpbWl0KHMsIHJlYWRfc2l6ZSk7CisgICAgICAgICAgICAvLyBJZiBmaWxlc2l6ZS9tYXhzaXplIGlzIHVua25vd24sIGxpbWl0IHRvIFNBTkVfQ0hVTktfU0laRQorICAgICAgICAgICAgaWYgKHMtPm1heHNpemUgPCAwKQorICAgICAgICAgICAgICAgIHJlYWRfc2l6ZSA9IEZGTUlOKHJlYWRfc2l6ZSwgU0FORV9DSFVOS19TSVpFKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGF2X2dyb3dfcGFja2V0KHBrdCwgcmVhZF9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICByZXQgPSBhdmlvX3JlYWQocywgcGt0LT5kYXRhICsgcHJldl9zaXplLCByZWFkX3NpemUpOworICAgICAgICBpZiAocmV0ICE9IHJlYWRfc2l6ZSkgeworICAgICAgICAgICAgYXZfc2hyaW5rX3BhY2tldChwa3QsIHByZXZfc2l6ZSArIEZGTUFYKHJldCwgMCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzaXplIC09IHJlYWRfc2l6ZTsKKyAgICB9IHdoaWxlIChzaXplID4gMCk7CisgICAgaWYgKHNpemUgPiAwKQorICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0NPUlJVUFQ7CisKKyAgICBwa3QtPnBvcyA9IG9yaWdfcG9zOworICAgIGlmICghcGt0LT5zaXplKQorICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgIHJldHVybiBwa3QtPnNpemUgPiBvcmlnX3NpemUgPyBwa3QtPnNpemUgLSBvcmlnX3NpemUgOiByZXQ7Cit9CisKK2ludCBhdl9nZXRfcGFja2V0KEFWSU9Db250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LCBpbnQgc2l6ZSkKK3sKKyAgICBhdl9pbml0X3BhY2tldChwa3QpOworICAgIHBrdC0+ZGF0YSA9IE5VTEw7CisgICAgcGt0LT5zaXplID0gMDsKKyAgICBwa3QtPnBvcyAgPSBhdmlvX3RlbGwocyk7CisKKyAgICByZXR1cm4gYXBwZW5kX3BhY2tldF9jaHVua2VkKHMsIHBrdCwgc2l6ZSk7Cit9CisKK2ludCBhdl9hcHBlbmRfcGFja2V0KEFWSU9Db250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LCBpbnQgc2l6ZSkKK3sKKyAgICBpZiAoIXBrdC0+c2l6ZSkKKyAgICAgICAgcmV0dXJuIGF2X2dldF9wYWNrZXQocywgcGt0LCBzaXplKTsKKyAgICByZXR1cm4gYXBwZW5kX3BhY2tldF9jaHVua2VkKHMsIHBrdCwgc2l6ZSk7Cit9CisKK2ludCBhdl9maWxlbmFtZV9udW1iZXJfdGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgICByZXR1cm4gZmlsZW5hbWUgJiYKKyAgICAgICAgICAgKGF2X2dldF9mcmFtZV9maWxlbmFtZShidWYsIHNpemVvZihidWYpLCBmaWxlbmFtZSwgMSkgPj0gMCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NvZGVjX2Zyb21fcHJvYmVfZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlByb2JlRGF0YSAqcGQpCit7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgIGVudW0gQVZDb2RlY0lEIGlkOworICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGU7CisgICAgfSBmbXRfaWRfdHlwZVtdID0geworICAgICAgICB7ICJhYWMiLCAgICAgICBBVl9DT0RFQ19JRF9BQUMsICAgICAgICBBVk1FRElBX1RZUEVfQVVESU8gfSwKKyAgICAgICAgeyAiYWMzIiwgICAgICAgQVZfQ09ERUNfSURfQUMzLCAgICAgICAgQVZNRURJQV9UWVBFX0FVRElPIH0sCisgICAgICAgIHsgImR0cyIsICAgICAgIEFWX0NPREVDX0lEX0RUUywgICAgICAgIEFWTUVESUFfVFlQRV9BVURJTyB9LAorICAgICAgICB7ICJlYWMzIiwgICAgICBBVl9DT0RFQ19JRF9FQUMzLCAgICAgICBBVk1FRElBX1RZUEVfQVVESU8gfSwKKyAgICAgICAgeyAiaDI2NCIsICAgICAgQVZfQ09ERUNfSURfSDI2NCwgICAgICAgQVZNRURJQV9UWVBFX1ZJREVPIH0sCisgICAgICAgIHsgImhldmMiLCAgICAgIEFWX0NPREVDX0lEX0hFVkMsICAgICAgIEFWTUVESUFfVFlQRV9WSURFTyB9LAorICAgICAgICB7ICJsb2FzIiwgICAgICBBVl9DT0RFQ19JRF9BQUNfTEFUTSwgICBBVk1FRElBX1RZUEVfQVVESU8gfSwKKyAgICAgICAgeyAibTR2IiwgICAgICAgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgQVZNRURJQV9UWVBFX1ZJREVPIH0sCisgICAgICAgIHsgIm1wMyIsICAgICAgIEFWX0NPREVDX0lEX01QMywgICAgICAgIEFWTUVESUFfVFlQRV9BVURJTyB9LAorICAgICAgICB7ICJtcGVndmlkZW8iLCBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBBVk1FRElBX1RZUEVfVklERU8gfSwKKyAgICAgICAgeyAwIH0KKyAgICB9OworICAgIGludCBzY29yZTsKKyAgICBBVklucHV0Rm9ybWF0ICpmbXQgPSBhdl9wcm9iZV9pbnB1dF9mb3JtYXQzKHBkLCAxLCAmc2NvcmUpOworCisgICAgaWYgKGZtdCAmJiBzdC0+cmVxdWVzdF9wcm9iZSA8PSBzY29yZSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJQcm9iZSB3aXRoIHNpemU9JWQsIHBhY2tldHM9JWQgZGV0ZWN0ZWQgJXMgd2l0aCBzY29yZT0lZFxuIiwKKyAgICAgICAgICAgICAgIHBkLT5idWZfc2l6ZSwgTUFYX1BST0JFX1BBQ0tFVFMgLSBzdC0+cHJvYmVfcGFja2V0cywKKyAgICAgICAgICAgICAgIGZtdC0+bmFtZSwgc2NvcmUpOworICAgICAgICBmb3IgKGkgPSAwOyBmbXRfaWRfdHlwZVtpXS5uYW1lOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGZtdC0+bmFtZSwgZm10X2lkX3R5cGVbaV0ubmFtZSkpIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBmbXRfaWRfdHlwZVtpXS5pZDsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBmbXRfaWRfdHlwZVtpXS50eXBlOworICAgICAgICAgICAgICAgIHJldHVybiBzY29yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGlucHV0IG1lZGlhIGZpbGUgKi8KKworaW50IGF2X2RlbXV4ZXJfb3BlbihBVkZvcm1hdENvbnRleHQgKmljKSB7CisgICAgaW50IGVycjsKKworICAgIGlmIChpYy0+Zm9ybWF0X3doaXRlbGlzdCAmJiBhdl9tYXRjaF9saXN0KGljLT5pZm9ybWF0LT5uYW1lLCBpYy0+Zm9ybWF0X3doaXRlbGlzdCwgJywnKSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX0VSUk9SLCAiRm9ybWF0IG5vdCBvbiB3aGl0ZWxpc3RcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChpYy0+aWZvcm1hdC0+cmVhZF9oZWFkZXIpIHsKKyAgICAgICAgZXJyID0gaWMtPmlmb3JtYXQtPnJlYWRfaGVhZGVyKGljKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChpYy0+cGIgJiYgIWljLT5kYXRhX29mZnNldCkKKyAgICAgICAgaWMtPmRhdGFfb2Zmc2V0ID0gYXZpb190ZWxsKGljLT5wYik7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogT3BlbiBpbnB1dCBmaWxlIGFuZCBwcm9iZSB0aGUgZm9ybWF0IGlmIG5lY2Vzc2FyeS4gKi8KK3N0YXRpYyBpbnQgaW5pdF9pbnB1dChBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCit7CisgICAgaW50IHJldDsKKyAgICBBVlByb2JlRGF0YSBwZCA9IHsgZmlsZW5hbWUsIE5VTEwsIDAgfTsKKyAgICBpbnQgc2NvcmUgPSBBVlBST0JFX1NDT1JFX1JFVFJZOworCisgICAgaWYgKHMtPnBiKSB7CisgICAgICAgIHMtPmZsYWdzIHw9IEFWRk1UX0ZMQUdfQ1VTVE9NX0lPOworICAgICAgICBpZiAoIXMtPmlmb3JtYXQpCisgICAgICAgICAgICByZXR1cm4gYXZfcHJvYmVfaW5wdXRfYnVmZmVyMihzLT5wYiwgJnMtPmlmb3JtYXQsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCAwLCBzLT5mb3JtYXRfcHJvYmVzaXplKTsKKyAgICAgICAgZWxzZSBpZiAocy0+aWZvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT0ZJTEUpCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJDdXN0b20gQVZJT0NvbnRleHQgbWFrZXMgbm8gc2Vuc2UgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpbGwgYmUgaWdub3JlZCB3aXRoIEFWRk1UX05PRklMRSBmb3JtYXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKChzLT5pZm9ybWF0ICYmIHMtPmlmb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSB8fAorICAgICAgICAoIXMtPmlmb3JtYXQgJiYgKHMtPmlmb3JtYXQgPSBhdl9wcm9iZV9pbnB1dF9mb3JtYXQyKCZwZCwgMCwgJnNjb3JlKSkpKQorICAgICAgICByZXR1cm4gc2NvcmU7CisKKyAgICBpZiAoKHJldCA9IGF2aW9fb3BlbjIoJnMtPnBiLCBmaWxlbmFtZSwgQVZJT19GTEFHX1JFQUQgfCBzLT5hdmlvX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBvcHRpb25zKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmIChzLT5pZm9ybWF0KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gYXZfcHJvYmVfaW5wdXRfYnVmZmVyMihzLT5wYiwgJnMtPmlmb3JtYXQsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgMCwgcy0+Zm9ybWF0X3Byb2Jlc2l6ZSk7Cit9CisKK3N0YXRpYyBBVlBhY2tldCAqYWRkX3RvX3BrdGJ1ZihBVlBhY2tldExpc3QgKipwYWNrZXRfYnVmZmVyLCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0TGlzdCAqKnBsYXN0X3BrdGwpCit7CisgICAgQVZQYWNrZXRMaXN0ICpwa3RsID0gYXZfbWFsbG9jeihzaXplb2YoQVZQYWNrZXRMaXN0KSk7CisgICAgaWYgKCFwa3RsKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICgqcGFja2V0X2J1ZmZlcikKKyAgICAgICAgKCpwbGFzdF9wa3RsKS0+bmV4dCA9IHBrdGw7CisgICAgZWxzZQorICAgICAgICAqcGFja2V0X2J1ZmZlciA9IHBrdGw7CisKKyAgICAvKiBBZGQgdGhlIHBhY2tldCBpbiB0aGUgYnVmZmVyZWQgcGFja2V0IGxpc3QuICovCisgICAgKnBsYXN0X3BrdGwgPSBwa3RsOworICAgIHBrdGwtPnBrdCAgID0gKnBrdDsKKyAgICByZXR1cm4gJnBrdGwtPnBrdDsKK30KKworaW50IGF2Zm9ybWF0X3F1ZXVlX2F0dGFjaGVkX3BpY3R1cmVzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUMgJiYKKyAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPmRpc2NhcmQgPCBBVkRJU0NBUkRfQUxMKSB7CisgICAgICAgICAgICBBVlBhY2tldCBjb3B5ID0gcy0+c3RyZWFtc1tpXS0+YXR0YWNoZWRfcGljOworICAgICAgICAgICAgaWYgKGNvcHkuc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiQXR0YWNoZWQgcGljdHVyZSBvbiBzdHJlYW0gJWQgaGFzIGludmFsaWQgc2l6ZSwgIgorICAgICAgICAgICAgICAgICAgICAiaWdub3JpbmdcbiIsIGkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29weS5idWYgPSBhdl9idWZmZXJfcmVmKGNvcHkuYnVmKTsKKyAgICAgICAgICAgIGlmICghY29weS5idWYpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgYWRkX3RvX3BrdGJ1Zigmcy0+cmF3X3BhY2tldF9idWZmZXIsICZjb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+cmF3X3BhY2tldF9idWZmZXJfZW5kKTsKKyAgICAgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgYXZmb3JtYXRfb3Blbl9pbnB1dChBVkZvcm1hdENvbnRleHQgKipwcywgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVklucHV0Rm9ybWF0ICpmbXQsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpzID0gKnBzOworICAgIGludCByZXQgPSAwOworICAgIEFWRGljdGlvbmFyeSAqdG1wID0gTlVMTDsKKyAgICBJRDN2MkV4dHJhTWV0YSAqaWQzdjJfZXh0cmFfbWV0YSA9IE5VTEw7CisKKyAgICBpZiAoIXMgJiYgIShzID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpZiAoIXMtPmF2X2NsYXNzKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnB1dCBjb250ZXh0IGhhcyBub3QgYmVlbiBwcm9wZXJseSBhbGxvY2F0ZWQgYnkgYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpIGFuZCBpcyBub3QgTlVMTCBlaXRoZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoZm10KQorICAgICAgICBzLT5pZm9ybWF0ID0gZm10OworCisgICAgaWYgKG9wdGlvbnMpCisgICAgICAgIGF2X2RpY3RfY29weSgmdG1wLCAqb3B0aW9ucywgMCk7CisKKyAgICBpZiAoKHJldCA9IGF2X29wdF9zZXRfZGljdChzLCAmdG1wKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoKHJldCA9IGluaXRfaW5wdXQocywgZmlsZW5hbWUsICZ0bXApKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBzLT5wcm9iZV9zY29yZSA9IHJldDsKKworICAgIGlmIChzLT5mb3JtYXRfd2hpdGVsaXN0ICYmIGF2X21hdGNoX2xpc3Qocy0+aWZvcm1hdC0+bmFtZSwgcy0+Zm9ybWF0X3doaXRlbGlzdCwgJywnKSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGb3JtYXQgbm90IG9uIHdoaXRlbGlzdFxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGF2aW9fc2tpcChzLT5wYiwgcy0+c2tpcF9pbml0aWFsX2J5dGVzKTsKKworICAgIC8qIENoZWNrIGZpbGVuYW1lIGluIGNhc2UgYW4gaW1hZ2UgbnVtYmVyIGlzIGV4cGVjdGVkLiAqLworICAgIGlmIChzLT5pZm9ybWF0LT5mbGFncyAmIEFWRk1UX05FRUROVU1CRVIpIHsKKyAgICAgICAgaWYgKCFhdl9maWxlbmFtZV9udW1iZXJfdGVzdChmaWxlbmFtZSkpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmR1cmF0aW9uID0gcy0+c3RhcnRfdGltZSA9IEFWX05PUFRTX1ZBTFVFOworICAgIGF2X3N0cmxjcHkocy0+ZmlsZW5hbWUsIGZpbGVuYW1lID8gZmlsZW5hbWUgOiAiIiwgc2l6ZW9mKHMtPmZpbGVuYW1lKSk7CisKKyAgICAvKiBBbGxvY2F0ZSBwcml2YXRlIGRhdGEuICovCisgICAgaWYgKHMtPmlmb3JtYXQtPnByaXZfZGF0YV9zaXplID4gMCkgeworICAgICAgICBpZiAoIShzLT5wcml2X2RhdGEgPSBhdl9tYWxsb2N6KHMtPmlmb3JtYXQtPnByaXZfZGF0YV9zaXplKSkpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+aWZvcm1hdC0+cHJpdl9jbGFzcykgeworICAgICAgICAgICAgKihjb25zdCBBVkNsYXNzICoqKSBzLT5wcml2X2RhdGEgPSBzLT5pZm9ybWF0LT5wcml2X2NsYXNzOworICAgICAgICAgICAgYXZfb3B0X3NldF9kZWZhdWx0cyhzLT5wcml2X2RhdGEpOworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0X2RpY3Qocy0+cHJpdl9kYXRhLCAmdG1wKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGUuZy4gQVZGTVRfTk9GSUxFIGZvcm1hdHMgd2lsbCBub3QgaGF2ZSBhIEFWSU9Db250ZXh0ICovCisgICAgaWYgKHMtPnBiKQorICAgICAgICBmZl9pZDN2Ml9yZWFkKHMsIElEM3YyX0RFRkFVTFRfTUFHSUMsICZpZDN2Ml9leHRyYV9tZXRhLCAwKTsKKworICAgIGlmICghKHMtPmZsYWdzJkFWRk1UX0ZMQUdfUFJJVl9PUFQpICYmIHMtPmlmb3JtYXQtPnJlYWRfaGVhZGVyKQorICAgICAgICBpZiAoKHJldCA9IHMtPmlmb3JtYXQtPnJlYWRfaGVhZGVyKHMpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoaWQzdjJfZXh0cmFfbWV0YSkgeworICAgICAgICBpZiAoIXN0cmNtcChzLT5pZm9ybWF0LT5uYW1lLCAibXAzIikgfHwgIXN0cmNtcChzLT5pZm9ybWF0LT5uYW1lLCAiYWFjIikgfHwKKyAgICAgICAgICAgICFzdHJjbXAocy0+aWZvcm1hdC0+bmFtZSwgInR0YSIpKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2lkM3YyX3BhcnNlX2FwaWMocywgJmlkM3YyX2V4dHJhX21ldGEpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJkZW11eGVyIGRvZXMgbm90IHN1cHBvcnQgYWRkaXRpb25hbCBpZDMgZGF0YSwgc2tpcHBpbmdcbiIpOworICAgIH0KKyAgICBmZl9pZDN2Ml9mcmVlX2V4dHJhX21ldGEoJmlkM3YyX2V4dHJhX21ldGEpOworCisgICAgaWYgKChyZXQgPSBhdmZvcm1hdF9xdWV1ZV9hdHRhY2hlZF9waWN0dXJlcyhzKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoIShzLT5mbGFncyZBVkZNVF9GTEFHX1BSSVZfT1BUKSAmJiBzLT5wYiAmJiAhcy0+ZGF0YV9vZmZzZXQpCisgICAgICAgIHMtPmRhdGFfb2Zmc2V0ID0gYXZpb190ZWxsKHMtPnBiKTsKKworICAgIHMtPnJhd19wYWNrZXRfYnVmZmVyX3JlbWFpbmluZ19zaXplID0gUkFXX1BBQ0tFVF9CVUZGRVJfU0laRTsKKworICAgIGlmIChvcHRpb25zKSB7CisgICAgICAgIGF2X2RpY3RfZnJlZShvcHRpb25zKTsKKyAgICAgICAgKm9wdGlvbnMgPSB0bXA7CisgICAgfQorICAgICpwcyA9IHM7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZmZfaWQzdjJfZnJlZV9leHRyYV9tZXRhKCZpZDN2Ml9leHRyYV9tZXRhKTsKKyAgICBhdl9kaWN0X2ZyZWUoJnRtcCk7CisgICAgaWYgKHMtPnBiICYmICEocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0NVU1RPTV9JTykpCisgICAgICAgIGF2aW9fY2xvc2Uocy0+cGIpOworICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChzKTsKKyAgICAqcHMgPSBOVUxMOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBmb3JjZV9jb2RlY19pZHMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCit7CisgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgaWYgKHMtPnZpZGVvX2NvZGVjX2lkKQorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IHMtPnZpZGVvX2NvZGVjX2lkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgaWYgKHMtPmF1ZGlvX2NvZGVjX2lkKQorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IHMtPmF1ZGlvX2NvZGVjX2lkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgaWYgKHMtPnN1YnRpdGxlX2NvZGVjX2lkKQorICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IHMtPnN1YnRpdGxlX2NvZGVjX2lkOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfY29kZWMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIGNvbnN0IEFWUGFja2V0ICpwa3QpCit7CisgICAgaWYgKHN0LT5yZXF1ZXN0X3Byb2JlPjApIHsKKyAgICAgICAgQVZQcm9iZURhdGEgKnBkID0gJnN0LT5wcm9iZV9kYXRhOworICAgICAgICBpbnQgZW5kOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAicHJvYmluZyBzdHJlYW0gJWQgcHA6JWRcbiIsIHN0LT5pbmRleCwgc3QtPnByb2JlX3BhY2tldHMpOworICAgICAgICAtLXN0LT5wcm9iZV9wYWNrZXRzOworCisgICAgICAgIGlmIChwa3QpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKm5ld19idWYgPSBhdl9yZWFsbG9jKHBkLT5idWYsIHBkLT5idWZfc2l6ZStwa3QtPnNpemUrQVZQUk9CRV9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgaWYgKCFuZXdfYnVmKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWxsb2NhdGUgcHJvYmUgYnVmZmVyIGZvciBzdHJlYW0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0LT5pbmRleCk7CisgICAgICAgICAgICAgICAgZ290byBub19wYWNrZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZC0+YnVmID0gbmV3X2J1ZjsKKyAgICAgICAgICAgIG1lbWNweShwZC0+YnVmICsgcGQtPmJ1Zl9zaXplLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgICAgICAgICBwZC0+YnVmX3NpemUgKz0gcGt0LT5zaXplOworICAgICAgICAgICAgbWVtc2V0KHBkLT5idWYgKyBwZC0+YnVmX3NpemUsIDAsIEFWUFJPQkVfUEFERElOR19TSVpFKTsKKyAgICAgICAgfSBlbHNlIHsKK25vX3BhY2tldDoKKyAgICAgICAgICAgIHN0LT5wcm9iZV9wYWNrZXRzID0gMDsKKyAgICAgICAgICAgIGlmICghcGQtPmJ1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAibm90aGluZyB0byBwcm9iZSBmb3Igc3RyZWFtICVkXG4iLCBzdC0+aW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZW5kPSAgICBzLT5yYXdfcGFja2V0X2J1ZmZlcl9yZW1haW5pbmdfc2l6ZSA8PSAwCisgICAgICAgICAgICAgICAgfHwgc3QtPnByb2JlX3BhY2tldHM8PSAwOworCisgICAgICAgIGlmIChlbmQgfHwgYXZfbG9nMihwZC0+YnVmX3NpemUpICE9IGF2X2xvZzIocGQtPmJ1Zl9zaXplIC0gcGt0LT5zaXplKSkgeworICAgICAgICAgICAgaW50IHNjb3JlID0gc2V0X2NvZGVjX2Zyb21fcHJvYmVfZGF0YShzLCBzdCwgcGQpOworICAgICAgICAgICAgaWYgKCAgICAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FICYmIHNjb3JlID4gQVZQUk9CRV9TQ09SRV9TVFJFQU1fUkVUUlkpCisgICAgICAgICAgICAgICAgfHwgZW5kKSB7CisgICAgICAgICAgICAgICAgcGQtPmJ1Zl9zaXplID0gMDsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcGQtPmJ1Zik7CisgICAgICAgICAgICAgICAgc3QtPnJlcXVlc3RfcHJvYmUgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJwcm9iZWQgc3RyZWFtICVkXG4iLCBzdC0+aW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJwcm9iZWQgc3RyZWFtICVkIGZhaWxlZFxuIiwgc3QtPmluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmNlX2NvZGVjX2lkcyhzLCBzdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3dyYXBfcmVmZXJlbmNlKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBpbnQgc3RyZWFtX2luZGV4LCBBVlBhY2tldCAqcGt0KQoreworICAgIGludDY0X3QgcmVmID0gcGt0LT5kdHM7CisgICAgaW50IGksIHB0c193cmFwX2JlaGF2aW9yOworICAgIGludDY0X3QgcHRzX3dyYXBfcmVmZXJlbmNlOworICAgIEFWUHJvZ3JhbSAqZmlyc3RfcHJvZ3JhbTsKKworICAgIGlmIChyZWYgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHJlZiA9IHBrdC0+cHRzOworICAgIGlmIChzdC0+cHRzX3dyYXBfcmVmZXJlbmNlICE9IEFWX05PUFRTX1ZBTFVFIHx8IHN0LT5wdHNfd3JhcF9iaXRzID49IDYzIHx8IHJlZiA9PSBBVl9OT1BUU19WQUxVRSB8fCAhcy0+Y29ycmVjdF90c19vdmVyZmxvdykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmVmICY9ICgxTEwgPDwgc3QtPnB0c193cmFwX2JpdHMpLTE7CisKKyAgICAvLyByZWZlcmVuY2UgdGltZSBzdGFtcCBzaG91bGQgYmUgNjAgcyBiZWZvcmUgZmlyc3QgdGltZSBzdGFtcAorICAgIHB0c193cmFwX3JlZmVyZW5jZSA9IHJlZiAtIGF2X3Jlc2NhbGUoNjAsIHN0LT50aW1lX2Jhc2UuZGVuLCBzdC0+dGltZV9iYXNlLm51bSk7CisgICAgLy8gaWYgZmlyc3QgdGltZSBzdGFtcCBpcyBub3QgbW9yZSB0aGFuIDEvOCBhbmQgNjBzIGJlZm9yZSB0aGUgd3JhcCBwb2ludCwgc3VidHJhY3QgcmF0aGVyIHRoYW4gYWRkIHdyYXAgb2Zmc2V0CisgICAgcHRzX3dyYXBfYmVoYXZpb3IgPSAocmVmIDwgKDFMTCA8PCBzdC0+cHRzX3dyYXBfYml0cykgLSAoMUxMIDw8IHN0LT5wdHNfd3JhcF9iaXRzLTMpKSB8fAorICAgICAgICAocmVmIDwgKDFMTCA8PCBzdC0+cHRzX3dyYXBfYml0cykgLSBhdl9yZXNjYWxlKDYwLCBzdC0+dGltZV9iYXNlLmRlbiwgc3QtPnRpbWVfYmFzZS5udW0pKSA/CisgICAgICAgIEFWX1BUU19XUkFQX0FERF9PRkZTRVQgOiBBVl9QVFNfV1JBUF9TVUJfT0ZGU0VUOworCisgICAgZmlyc3RfcHJvZ3JhbSA9IGF2X2ZpbmRfcHJvZ3JhbV9mcm9tX3N0cmVhbShzLCBOVUxMLCBzdHJlYW1faW5kZXgpOworCisgICAgaWYgKCFmaXJzdF9wcm9ncmFtKSB7CisgICAgICAgIGludCBkZWZhdWx0X3N0cmVhbV9pbmRleCA9IGF2X2ZpbmRfZGVmYXVsdF9zdHJlYW1faW5kZXgocyk7CisgICAgICAgIGlmIChzLT5zdHJlYW1zW2RlZmF1bHRfc3RyZWFtX2luZGV4XS0+cHRzX3dyYXBfcmVmZXJlbmNlID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+cHRzX3dyYXBfcmVmZXJlbmNlID0gcHRzX3dyYXBfcmVmZXJlbmNlOworICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPnB0c193cmFwX2JlaGF2aW9yID0gcHRzX3dyYXBfYmVoYXZpb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdC0+cHRzX3dyYXBfcmVmZXJlbmNlID0gcy0+c3RyZWFtc1tkZWZhdWx0X3N0cmVhbV9pbmRleF0tPnB0c193cmFwX3JlZmVyZW5jZTsKKyAgICAgICAgICAgIHN0LT5wdHNfd3JhcF9iZWhhdmlvciA9IHMtPnN0cmVhbXNbZGVmYXVsdF9zdHJlYW1faW5kZXhdLT5wdHNfd3JhcF9iZWhhdmlvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgQVZQcm9ncmFtICpwcm9ncmFtID0gZmlyc3RfcHJvZ3JhbTsKKyAgICAgICAgd2hpbGUgKHByb2dyYW0pIHsKKyAgICAgICAgICAgIGlmIChwcm9ncmFtLT5wdHNfd3JhcF9yZWZlcmVuY2UgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICBwdHNfd3JhcF9yZWZlcmVuY2UgPSBwcm9ncmFtLT5wdHNfd3JhcF9yZWZlcmVuY2U7CisgICAgICAgICAgICAgICAgcHRzX3dyYXBfYmVoYXZpb3IgPSBwcm9ncmFtLT5wdHNfd3JhcF9iZWhhdmlvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2dyYW0gPSBhdl9maW5kX3Byb2dyYW1fZnJvbV9zdHJlYW0ocywgcHJvZ3JhbSwgc3RyZWFtX2luZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSBldmVyeSBwcm9ncmFtIHdpdGggZGlmZmVyaW5nIHB0c193cmFwX3JlZmVyZW5jZQorICAgICAgICBwcm9ncmFtID0gZmlyc3RfcHJvZ3JhbTsKKyAgICAgICAgd2hpbGUgKHByb2dyYW0pIHsKKyAgICAgICAgICAgIGlmIChwcm9ncmFtLT5wdHNfd3JhcF9yZWZlcmVuY2UgIT0gcHRzX3dyYXBfcmVmZXJlbmNlKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaTxwcm9ncmFtLT5uYl9zdHJlYW1faW5kZXhlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbcHJvZ3JhbS0+c3RyZWFtX2luZGV4W2ldXS0+cHRzX3dyYXBfcmVmZXJlbmNlID0gcHRzX3dyYXBfcmVmZXJlbmNlOworICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW3Byb2dyYW0tPnN0cmVhbV9pbmRleFtpXV0tPnB0c193cmFwX2JlaGF2aW9yID0gcHRzX3dyYXBfYmVoYXZpb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJvZ3JhbS0+cHRzX3dyYXBfcmVmZXJlbmNlID0gcHRzX3dyYXBfcmVmZXJlbmNlOworICAgICAgICAgICAgICAgIHByb2dyYW0tPnB0c193cmFwX2JlaGF2aW9yID0gcHRzX3dyYXBfYmVoYXZpb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9ncmFtID0gYXZfZmluZF9wcm9ncmFtX2Zyb21fc3RyZWFtKHMsIHByb2dyYW0sIHN0cmVhbV9pbmRleCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBmZl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldCwgaSwgZXJyOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgQVZQYWNrZXRMaXN0ICpwa3RsID0gcy0+cmF3X3BhY2tldF9idWZmZXI7CisKKyAgICAgICAgaWYgKHBrdGwpIHsKKyAgICAgICAgICAgICpwa3QgPSBwa3RsLT5wa3Q7CisgICAgICAgICAgICBzdCAgID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgICAgICAgICBpZiAocy0+cmF3X3BhY2tldF9idWZmZXJfcmVtYWluaW5nX3NpemUgPD0gMCkKKyAgICAgICAgICAgICAgICBpZiAoKGVyciA9IHByb2JlX2NvZGVjKHMsIHN0LCBOVUxMKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgaWYgKHN0LT5yZXF1ZXN0X3Byb2JlIDw9IDApIHsKKyAgICAgICAgICAgICAgICBzLT5yYXdfcGFja2V0X2J1ZmZlciAgICAgICAgICAgICAgICAgPSBwa3RsLT5uZXh0OworICAgICAgICAgICAgICAgIHMtPnJhd19wYWNrZXRfYnVmZmVyX3JlbWFpbmluZ19zaXplICs9IHBrdC0+c2l6ZTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHBrdGwpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGt0LT5kYXRhID0gTlVMTDsKKyAgICAgICAgcGt0LT5zaXplID0gMDsKKyAgICAgICAgYXZfaW5pdF9wYWNrZXQocGt0KTsKKyAgICAgICAgcmV0ID0gcy0+aWZvcm1hdC0+cmVhZF9wYWNrZXQocywgcGt0KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmICghcGt0bCB8fCByZXQgPT0gQVZFUlJPUihFQUdBSU4pKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgICAgIGlmIChzdC0+cHJvYmVfcGFja2V0cykKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBwcm9iZV9jb2RlYyhzLCBzdCwgTlVMTCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChzdC0+cmVxdWVzdF9wcm9iZSA8PSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzLT5mbGFncyAmIEFWRk1UX0ZMQUdfRElTQ0FSRF9DT1JSVVBUKSAmJgorICAgICAgICAgICAgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19DT1JSVVBUKSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJEcm9wcGVkIGNvcnJ1cHRlZCBwYWNrZXQgKHN0cmVhbSA9ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCk7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGt0LT5zdHJlYW1faW5kZXggPj0gKHVuc2lnbmVkKXMtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHN0cmVhbSBpbmRleCAlZFxuIiwgcGt0LT5zdHJlYW1faW5kZXgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworCisgICAgICAgIGlmICh1cGRhdGVfd3JhcF9yZWZlcmVuY2Uocywgc3QsIHBrdC0+c3RyZWFtX2luZGV4LCBwa3QpICYmIHN0LT5wdHNfd3JhcF9iZWhhdmlvciA9PSBBVl9QVFNfV1JBUF9TVUJfT0ZGU0VUKSB7CisgICAgICAgICAgICAvLyBjb3JyZWN0IGZpcnN0IHRpbWUgc3RhbXBzIHRvIG5lZ2F0aXZlIHZhbHVlcworICAgICAgICAgICAgaWYgKCFpc19yZWxhdGl2ZShzdC0+Zmlyc3RfZHRzKSkKKyAgICAgICAgICAgICAgICBzdC0+Zmlyc3RfZHRzID0gd3JhcF90aW1lc3RhbXAoc3QsIHN0LT5maXJzdF9kdHMpOworICAgICAgICAgICAgaWYgKCFpc19yZWxhdGl2ZShzdC0+c3RhcnRfdGltZSkpCisgICAgICAgICAgICAgICAgc3QtPnN0YXJ0X3RpbWUgPSB3cmFwX3RpbWVzdGFtcChzdCwgc3QtPnN0YXJ0X3RpbWUpOworICAgICAgICAgICAgaWYgKCFpc19yZWxhdGl2ZShzdC0+Y3VyX2R0cykpCisgICAgICAgICAgICAgICAgc3QtPmN1cl9kdHMgPSB3cmFwX3RpbWVzdGFtcChzdCwgc3QtPmN1cl9kdHMpOworICAgICAgICB9CisKKyAgICAgICAgcGt0LT5kdHMgPSB3cmFwX3RpbWVzdGFtcChzdCwgcGt0LT5kdHMpOworICAgICAgICBwa3QtPnB0cyA9IHdyYXBfdGltZXN0YW1wKHN0LCBwa3QtPnB0cyk7CisKKyAgICAgICAgZm9yY2VfY29kZWNfaWRzKHMsIHN0KTsKKworICAgICAgICAvKiBUT0RPOiBhdWRpbzogdGltZSBmaWx0ZXI7IHZpZGVvOiBmcmFtZSByZW9yZGVyaW5nIChwdHMgIT0gZHRzKSAqLworICAgICAgICBpZiAocy0+dXNlX3dhbGxjbG9ja19hc190aW1lc3RhbXBzKQorICAgICAgICAgICAgcGt0LT5kdHMgPSBwa3QtPnB0cyA9IGF2X3Jlc2NhbGVfcShhdl9nZXR0aW1lKCksIEFWX1RJTUVfQkFTRV9RLCBzdC0+dGltZV9iYXNlKTsKKworICAgICAgICBpZiAoIXBrdGwgJiYgc3QtPnJlcXVlc3RfcHJvYmUgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgYWRkX3RvX3BrdGJ1Zigmcy0+cmF3X3BhY2tldF9idWZmZXIsIHBrdCwgJnMtPnJhd19wYWNrZXRfYnVmZmVyX2VuZCk7CisgICAgICAgIHMtPnJhd19wYWNrZXRfYnVmZmVyX3JlbWFpbmluZ19zaXplIC09IHBrdC0+c2l6ZTsKKworICAgICAgICBpZiAoKGVyciA9IHByb2JlX2NvZGVjKHMsIHN0LCBwa3QpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBkZXRlcm1pbmFibGVfZnJhbWVfc2l6ZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKC8qYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyB8fCovCisgICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDEgfHwKKyAgICAgICAgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMiB8fAorICAgICAgICBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzLyogfHwKKyAgICAgICAgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0NFTFQqLykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBmcmFtZSBkdXJhdGlvbiBpbiBzZWNvbmRzLiBSZXR1cm4gMCBpZiBub3QgYXZhaWxhYmxlLgorICovCit2b2lkIGZmX2NvbXB1dGVfZnJhbWVfZHVyYXRpb24oQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgKnBudW0sIGludCAqcGRlbiwgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNQYXJzZXJDb250ZXh0ICpwYywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVlJhdGlvbmFsIGNvZGVjX2ZyYW1lcmF0ZSA9IHMtPmlmb3JtYXQgPyBzdC0+Y29kZWMtPmZyYW1lcmF0ZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbXVsX3EoYXZfaW52X3Eoc3QtPmNvZGVjLT50aW1lX2Jhc2UpLCAoQVZSYXRpb25hbCl7MSwgc3QtPmNvZGVjLT50aWNrc19wZXJfZnJhbWV9KTsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKworICAgICpwbnVtID0gMDsKKyAgICAqcGRlbiA9IDA7CisgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgaWYgKHN0LT5yX2ZyYW1lX3JhdGUubnVtICYmICFwYykgeworICAgICAgICAgICAgKnBudW0gPSBzdC0+cl9mcmFtZV9yYXRlLmRlbjsKKyAgICAgICAgICAgICpwZGVuID0gc3QtPnJfZnJhbWVfcmF0ZS5udW07CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPnRpbWVfYmFzZS5udW0gKiAxMDAwTEwgPiBzdC0+dGltZV9iYXNlLmRlbikgeworICAgICAgICAgICAgKnBudW0gPSBzdC0+dGltZV9iYXNlLm51bTsKKyAgICAgICAgICAgICpwZGVuID0gc3QtPnRpbWVfYmFzZS5kZW47CisgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfZnJhbWVyYXRlLmRlbiAqIDEwMDBMTCA+IGNvZGVjX2ZyYW1lcmF0ZS5udW0pIHsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoc3QtPmNvZGVjLT50aWNrc19wZXJfZnJhbWUpOworICAgICAgICAgICAgYXZfcmVkdWNlKHBudW0sIHBkZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29kZWNfZnJhbWVyYXRlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb2RlY19mcmFtZXJhdGUubnVtICogKGludDY0X3Qpc3QtPmNvZGVjLT50aWNrc19wZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgSU5UX01BWCk7CisKKyAgICAgICAgICAgIGlmIChwYyAmJiBwYy0+cmVwZWF0X3BpY3QpIHsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKHMtPmlmb3JtYXQpOyAvLyB0aGlzIG1heSBiZSB3cm9uZyBmb3IgaW50ZXJsYWNlZCBlbmNvZGluZyBidXQgaXRzIG5vdCB1c2VkIGZvciB0aGF0IGNhc2UKKyAgICAgICAgICAgICAgICBhdl9yZWR1Y2UocG51bSwgcGRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwbnVtKSAqICgxTEwgKyBwYy0+cmVwZWF0X3BpY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBkZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfTUFYKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIElmIHRoaXMgY29kZWMgY2FuIGJlIGludGVybGFjZWQgb3IgcHJvZ3Jlc3NpdmUgdGhlbiB3ZSBuZWVkCisgICAgICAgICAgICAgKiBhIHBhcnNlciB0byBjb21wdXRlIGR1cmF0aW9uIG9mIGEgcGFja2V0LiBUaHVzIGlmIHdlIGhhdmUKKyAgICAgICAgICAgICAqIG5vIHBhcnNlciBpbiBzdWNoIGNhc2UgbGVhdmUgZHVyYXRpb24gdW5kZWZpbmVkLiAqLworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+dGlja3NfcGVyX2ZyYW1lID4gMSAmJiAhcGMpCisgICAgICAgICAgICAgICAgKnBudW0gPSAqcGRlbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIGZyYW1lX3NpemUgPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oc3QtPmNvZGVjLCBwa3QtPnNpemUpOworICAgICAgICBpZiAoZnJhbWVfc2l6ZSA8PSAwIHx8IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAqcG51bSA9IGZyYW1lX3NpemU7CisgICAgICAgICpwZGVuID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW50IGlzX2ludHJhX29ubHkoQVZDb2RlY0NvbnRleHQgKmVuYykgeworICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpkZXNjOworCisgICAgaWYgKGVuYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIHJldHVybiAxOworCisgICAgZGVzYyA9IGF2X2NvZGVjX2dldF9jb2RlY19kZXNjcmlwdG9yKGVuYyk7CisgICAgaWYgKCFkZXNjKSB7CisgICAgICAgIGRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGVuYy0+Y29kZWNfaWQpOworICAgICAgICBhdl9jb2RlY19zZXRfY29kZWNfZGVzY3JpcHRvcihlbmMsIGRlc2MpOworICAgIH0KKyAgICBpZiAoZGVzYykKKyAgICAgICAgcmV0dXJuICEhKGRlc2MtPnByb3BzICYgQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYXNfZGVjb2RlX2RlbGF5X2JlZW5fZ3Vlc3NlZChBVlN0cmVhbSAqc3QpCit7CisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSDI2NCkgcmV0dXJuIDE7CisgICAgaWYgKCFzdC0+aW5mbykgLy8gaWYgd2UgaGF2ZSBsZWZ0IGZpbmRfc3RyZWFtX2luZm8gdGhlbiBuYl9kZWNvZGVkX2ZyYW1lcyB3b24ndCBpbmNyZWFzZSBhbnltb3JlIGZvciBzdHJlYW0gY29weQorICAgICAgICByZXR1cm4gMTsKKyNpZiBDT05GSUdfSDI2NF9ERUNPREVSCisgICAgaWYgKHN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzICYmCisgICAgICAgYXZwcml2X2gyNjRfaGFzX251bV9yZW9yZGVyX2ZyYW1lcyhzdC0+Y29kZWMpID09IHN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzKQorICAgICAgICByZXR1cm4gMTsKKyNlbmRpZgorICAgIGlmIChzdC0+Y29kZWMtPmhhc19iX2ZyYW1lczwzKQorICAgICAgICByZXR1cm4gc3QtPm5iX2RlY29kZWRfZnJhbWVzID49IDc7CisgICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5oYXNfYl9mcmFtZXM8NCkKKyAgICAgICAgcmV0dXJuIHN0LT5uYl9kZWNvZGVkX2ZyYW1lcyA+PSAxODsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBzdC0+bmJfZGVjb2RlZF9mcmFtZXMgPj0gMjA7Cit9CisKK3N0YXRpYyBBVlBhY2tldExpc3QgKmdldF9uZXh0X3BrdChBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgQVZQYWNrZXRMaXN0ICpwa3RsKQoreworICAgIGlmIChwa3RsLT5uZXh0KQorICAgICAgICByZXR1cm4gcGt0bC0+bmV4dDsKKyAgICBpZiAocGt0bCA9PSBzLT5wYWNrZXRfYnVmZmVyX2VuZCkKKyAgICAgICAgcmV0dXJuIHMtPnBhcnNlX3F1ZXVlOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50NjRfdCBzZWxlY3RfZnJvbV9wdHNfYnVmZmVyKEFWU3RyZWFtICpzdCwgaW50NjRfdCAqcHRzX2J1ZmZlciwgaW50NjRfdCBkdHMpIHsKKyAgICBpbnQgb25laW5fb25lb3V0ID0gc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9IMjY0ICYmCisgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSEVWQzsKKworICAgIGlmKCFvbmVpbl9vbmVvdXQpIHsKKyAgICAgICAgaW50IGRlbGF5ID0gc3QtPmNvZGVjLT5oYXNfYl9mcmFtZXM7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmIChkdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIGludDY0X3QgYmVzdF9zY29yZSA9IElOVDY0X01BWDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGk8ZGVsYXk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzdC0+cHRzX3Jlb3JkZXJfZXJyb3JfY291bnRbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzY29yZSA9IHN0LT5wdHNfcmVvcmRlcl9lcnJvcltpXSAvIHN0LT5wdHNfcmVvcmRlcl9lcnJvcl9jb3VudFtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlIDwgYmVzdF9zY29yZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgZHRzID0gcHRzX2J1ZmZlcltpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGk8ZGVsYXk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwdHNfYnVmZmVyW2ldICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGlmZiA9ICBGRkFCUyhwdHNfYnVmZmVyW2ldIC0gZHRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodWludDY0X3Qpc3QtPnB0c19yZW9yZGVyX2Vycm9yW2ldOworICAgICAgICAgICAgICAgICAgICBkaWZmID0gRkZNQVgoZGlmZiwgc3QtPnB0c19yZW9yZGVyX2Vycm9yW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPnB0c19yZW9yZGVyX2Vycm9yW2ldID0gZGlmZjsKKyAgICAgICAgICAgICAgICAgICAgc3QtPnB0c19yZW9yZGVyX2Vycm9yX2NvdW50W2ldKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+cHRzX3Jlb3JkZXJfZXJyb3JfY291bnRbaV0gPiAyNTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5wdHNfcmVvcmRlcl9lcnJvcltpXSA+Pj0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5wdHNfcmVvcmRlcl9lcnJvcl9jb3VudFtpXSA+Pj0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGR0cyA9IHB0c19idWZmZXJbMF07CisKKyAgICByZXR1cm4gZHRzOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfaW5pdGlhbF90aW1lc3RhbXBzKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdHMsIGludDY0X3QgcHRzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWU3RyZWFtICpzdCAgICAgICA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKKyAgICBBVlBhY2tldExpc3QgKnBrdGwgPSBzLT5wYWNrZXRfYnVmZmVyID8gcy0+cGFja2V0X2J1ZmZlciA6IHMtPnBhcnNlX3F1ZXVlOworICAgIGludDY0X3QgcHRzX2J1ZmZlcltNQVhfUkVPUkRFUl9ERUxBWSsxXTsKKyAgICBpbnQ2NF90IHNoaWZ0OworICAgIGludCBpLCBkZWxheTsKKworICAgIGlmIChzdC0+Zmlyc3RfZHRzICE9IEFWX05PUFRTX1ZBTFVFIHx8CisgICAgICAgIGR0cyAgICAgICAgICAgPT0gQVZfTk9QVFNfVkFMVUUgfHwKKyAgICAgICAgc3QtPmN1cl9kdHMgICA9PSBBVl9OT1BUU19WQUxVRSB8fAorICAgICAgICBpc19yZWxhdGl2ZShkdHMpKQorICAgICAgICByZXR1cm47CisKKyAgICBkZWxheSAgICAgICAgID0gc3QtPmNvZGVjLT5oYXNfYl9mcmFtZXM7CisgICAgc3QtPmZpcnN0X2R0cyA9IGR0cyAtIChzdC0+Y3VyX2R0cyAtIFJFTEFUSVZFX1RTX0JBU0UpOworICAgIHN0LT5jdXJfZHRzICAgPSBkdHM7CisgICAgc2hpZnQgICAgICAgICA9IHN0LT5maXJzdF9kdHMgLSBSRUxBVElWRV9UU19CQVNFOworCisgICAgZm9yIChpID0gMDsgaTxNQVhfUkVPUkRFUl9ERUxBWSsxOyBpKyspCisgICAgICAgIHB0c19idWZmZXJbaV0gPSBBVl9OT1BUU19WQUxVRTsKKworICAgIGlmIChpc19yZWxhdGl2ZShwdHMpKQorICAgICAgICBwdHMgKz0gc2hpZnQ7CisKKyAgICBmb3IgKDsgcGt0bDsgcGt0bCA9IGdldF9uZXh0X3BrdChzLCBzdCwgcGt0bCkpIHsKKyAgICAgICAgaWYgKHBrdGwtPnBrdC5zdHJlYW1faW5kZXggIT0gc3RyZWFtX2luZGV4KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChpc19yZWxhdGl2ZShwa3RsLT5wa3QucHRzKSkKKyAgICAgICAgICAgIHBrdGwtPnBrdC5wdHMgKz0gc2hpZnQ7CisKKyAgICAgICAgaWYgKGlzX3JlbGF0aXZlKHBrdGwtPnBrdC5kdHMpKQorICAgICAgICAgICAgcGt0bC0+cGt0LmR0cyArPSBzaGlmdDsKKworICAgICAgICBpZiAoc3QtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0bC0+cGt0LnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHN0LT5zdGFydF90aW1lID0gcGt0bC0+cGt0LnB0czsKKworICAgICAgICBpZiAocGt0bC0+cGt0LnB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBkZWxheSA8PSBNQVhfUkVPUkRFUl9ERUxBWSAmJiBoYXNfZGVjb2RlX2RlbGF5X2JlZW5fZ3Vlc3NlZChzdCkpIHsKKyAgICAgICAgICAgIHB0c19idWZmZXJbMF0gPSBwa3RsLT5wa3QucHRzOworICAgICAgICAgICAgZm9yIChpID0gMDsgaTxkZWxheSAmJiBwdHNfYnVmZmVyW2ldID4gcHRzX2J1ZmZlcltpICsgMV07IGkrKykKKyAgICAgICAgICAgICAgICBGRlNXQVAoaW50NjRfdCwgcHRzX2J1ZmZlcltpXSwgcHRzX2J1ZmZlcltpICsgMV0pOworCisgICAgICAgICAgICBwa3RsLT5wa3QuZHRzID0gc2VsZWN0X2Zyb21fcHRzX2J1ZmZlcihzdCwgcHRzX2J1ZmZlciwgcGt0bC0+cGt0LmR0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3QtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHN0LT5zdGFydF90aW1lID0gcHRzOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfaW5pdGlhbF9kdXJhdGlvbnMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9pbmRleCwgaW50IGR1cmF0aW9uKQoreworICAgIEFWUGFja2V0TGlzdCAqcGt0bCA9IHMtPnBhY2tldF9idWZmZXIgPyBzLT5wYWNrZXRfYnVmZmVyIDogcy0+cGFyc2VfcXVldWU7CisgICAgaW50NjRfdCBjdXJfZHRzICAgID0gUkVMQVRJVkVfVFNfQkFTRTsKKworICAgIGlmIChzdC0+Zmlyc3RfZHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGlmIChzdC0+dXBkYXRlX2luaXRpYWxfZHVyYXRpb25zX2RvbmUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0LT51cGRhdGVfaW5pdGlhbF9kdXJhdGlvbnNfZG9uZSA9IDE7CisgICAgICAgIGN1cl9kdHMgPSBzdC0+Zmlyc3RfZHRzOworICAgICAgICBmb3IgKDsgcGt0bDsgcGt0bCA9IGdldF9uZXh0X3BrdChzLCBzdCwgcGt0bCkpIHsKKyAgICAgICAgICAgIGlmIChwa3RsLT5wa3Quc3RyZWFtX2luZGV4ID09IHN0cmVhbV9pbmRleCkgeworICAgICAgICAgICAgICAgIGlmIChwa3RsLT5wa3QucHRzICE9IHBrdGwtPnBrdC5kdHMgIHx8CisgICAgICAgICAgICAgICAgICAgIHBrdGwtPnBrdC5kdHMgIT0gQVZfTk9QVFNfVkFMVUUgfHwKKyAgICAgICAgICAgICAgICAgICAgcGt0bC0+cGt0LmR1cmF0aW9uKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjdXJfZHRzIC09IGR1cmF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwa3RsICYmIHBrdGwtPnBrdC5kdHMgIT0gc3QtPmZpcnN0X2R0cykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImZpcnN0X2R0cyAlcyBub3QgbWF0Y2hpbmcgZmlyc3QgZHRzICVzIChwdHMgJXMsIGR1cmF0aW9uICVkKSBpbiB0aGUgcXVldWVcbiIsCisgICAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKHN0LT5maXJzdF9kdHMpLCBhdl90czJzdHIocGt0bC0+cGt0LmR0cyksIGF2X3RzMnN0cihwa3RsLT5wa3QucHRzKSwgcGt0bC0+cGt0LmR1cmF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXBrdGwpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJmaXJzdF9kdHMgJXMgYnV0IG5vIHBhY2tldCB3aXRoIGR0cyBpbiB0aGUgcXVldWVcbiIsIGF2X3RzMnN0cihzdC0+Zmlyc3RfZHRzKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGt0bCAgICAgICAgICA9IHMtPnBhY2tldF9idWZmZXIgPyBzLT5wYWNrZXRfYnVmZmVyIDogcy0+cGFyc2VfcXVldWU7CisgICAgICAgIHN0LT5maXJzdF9kdHMgPSBjdXJfZHRzOworICAgIH0gZWxzZSBpZiAoc3QtPmN1cl9kdHMgIT0gUkVMQVRJVkVfVFNfQkFTRSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yICg7IHBrdGw7IHBrdGwgPSBnZXRfbmV4dF9wa3Qocywgc3QsIHBrdGwpKSB7CisgICAgICAgIGlmIChwa3RsLT5wa3Quc3RyZWFtX2luZGV4ICE9IHN0cmVhbV9pbmRleCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocGt0bC0+cGt0LnB0cyA9PSBwa3RsLT5wa3QuZHRzICAmJgorICAgICAgICAgICAgKHBrdGwtPnBrdC5kdHMgPT0gQVZfTk9QVFNfVkFMVUUgfHwgcGt0bC0+cGt0LmR0cyA9PSBzdC0+Zmlyc3RfZHRzKSAmJgorICAgICAgICAgICAgIXBrdGwtPnBrdC5kdXJhdGlvbikgeworICAgICAgICAgICAgcGt0bC0+cGt0LmR0cyA9IGN1cl9kdHM7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzKQorICAgICAgICAgICAgICAgIHBrdGwtPnBrdC5wdHMgPSBjdXJfZHRzOworLy8gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgICAgICAgICBwa3RsLT5wa3QuZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY3VyX2R0cyA9IHBrdGwtPnBrdC5kdHMgKyBwa3RsLT5wa3QuZHVyYXRpb247CisgICAgfQorICAgIGlmICghcGt0bCkKKyAgICAgICAgc3QtPmN1cl9kdHMgPSBjdXJfZHRzOworfQorCitzdGF0aWMgdm9pZCBjb21wdXRlX3BrdF9maWVsZHMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY1BhcnNlckNvbnRleHQgKnBjLCBBVlBhY2tldCAqcGt0KQoreworICAgIGludCBudW0sIGRlbiwgcHJlc2VudGF0aW9uX2RlbGF5ZWQsIGRlbGF5LCBpOworICAgIGludDY0X3Qgb2Zmc2V0OworICAgIEFWUmF0aW9uYWwgZHVyYXRpb247CisgICAgaW50IG9uZWluX29uZW91dCA9IHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSDI2NCAmJgorICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0hFVkM7CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX05PRklMTElOKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBpZiAocGt0LT5kdHMgPT0gcGt0LT5wdHMgJiYgc3QtPmxhc3RfZHRzX2Zvcl9vcmRlcl9jaGVjayAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgaWYgKHN0LT5sYXN0X2R0c19mb3Jfb3JkZXJfY2hlY2sgPD0gcGt0LT5kdHMpIHsKKyAgICAgICAgICAgICAgICBzdC0+ZHRzX29yZGVyZWQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIHN0LT5kdHNfbWlzb3JkZXJlZCA/IEFWX0xPR19ERUJVRyA6IEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiRFRTICUiUFJJaTY0IiA8ICUiUFJJaTY0IiBvdXQgb2Ygb3JkZXJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+ZHRzLAorICAgICAgICAgICAgICAgICAgICAgICBzdC0+bGFzdF9kdHNfZm9yX29yZGVyX2NoZWNrKTsKKyAgICAgICAgICAgICAgICBzdC0+ZHRzX21pc29yZGVyZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdC0+ZHRzX29yZGVyZWQgKyBzdC0+ZHRzX21pc29yZGVyZWQgPiAyNTApIHsKKyAgICAgICAgICAgICAgICBzdC0+ZHRzX29yZGVyZWQgICAgPj49IDE7CisgICAgICAgICAgICAgICAgc3QtPmR0c19taXNvcmRlcmVkID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3QtPmxhc3RfZHRzX2Zvcl9vcmRlcl9jaGVjayA9IHBrdC0+ZHRzOworICAgICAgICBpZiAoc3QtPmR0c19vcmRlcmVkIDwgOCpzdC0+ZHRzX21pc29yZGVyZWQgJiYgcGt0LT5kdHMgPT0gcGt0LT5wdHMpCisgICAgICAgICAgICBwa3QtPmR0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIH0KKworICAgIGlmICgocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0lHTkRUUykgJiYgcGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHBrdC0+ZHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBpZiAocGMgJiYgcGMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQgorICAgICAgICAmJiAhc3QtPmNvZGVjLT5oYXNfYl9mcmFtZXMpCisgICAgICAgIC8vRklYTUUgU2V0IGxvd19kZWxheSA9IDAgd2hlbiBoYXNfYl9mcmFtZXMgPSAxCisgICAgICAgIHN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzID0gMTsKKworICAgIC8qIGRvIHdlIGhhdmUgYSB2aWRlbyBCLWZyYW1lID8gKi8KKyAgICBkZWxheSA9IHN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzOworICAgIHByZXNlbnRhdGlvbl9kZWxheWVkID0gMDsKKworICAgIC8qIFhYWDogbmVlZCBoYXNfYl9mcmFtZSwgYnV0IGNhbm5vdCBnZXQgaXQgaWYgdGhlIGNvZGVjIGlzCisgICAgICogIG5vdCBpbml0aWFsaXplZCAqLworICAgIGlmIChkZWxheSAmJgorICAgICAgICBwYyAmJiBwYy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICBwcmVzZW50YXRpb25fZGVsYXllZCA9IDE7CisKKyAgICBpZiAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgc3QtPnB0c193cmFwX2JpdHMgPCA2MyAmJgorICAgICAgICBwa3QtPmR0cyAtICgxTEwgPDwgKHN0LT5wdHNfd3JhcF9iaXRzIC0gMSkpID4gcGt0LT5wdHMpIHsKKyAgICAgICAgaWYgKGlzX3JlbGF0aXZlKHN0LT5jdXJfZHRzKSB8fCBwa3QtPmR0cyAtICgxTEw8PChzdC0+cHRzX3dyYXBfYml0cyAtIDEpKSA+IHN0LT5jdXJfZHRzKSB7CisgICAgICAgICAgICBwa3QtPmR0cyAtPSAxTEwgPDwgc3QtPnB0c193cmFwX2JpdHM7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcGt0LT5wdHMgKz0gMUxMIDw8IHN0LT5wdHNfd3JhcF9iaXRzOworICAgIH0KKworICAgIC8qIFNvbWUgTVBFRy0yIGluIE1QRUctUFMgbGFjayBkdHMgKGlzc3VlICMxNzEgLyBpbnB1dF9maWxlLm1wZykuCisgICAgICogV2UgdGFrZSB0aGUgY29uc2VydmF0aXZlIGFwcHJvYWNoIGFuZCBkaXNjYXJkIGJvdGguCisgICAgICogTm90ZTogSWYgdGhpcyBpcyBtaXNiZWhhdmluZyBmb3IgYW4gSC4yNjQgZmlsZSwgdGhlbiBwb3NzaWJseQorICAgICAqIHByZXNlbnRhdGlvbl9kZWxheWVkIGlzIG5vdCBzZXQgY29ycmVjdGx5LiAqLworICAgIGlmIChkZWxheSA9PSAxICYmIHBrdC0+ZHRzID09IHBrdC0+cHRzICYmCisgICAgICAgIHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIHByZXNlbnRhdGlvbl9kZWxheWVkKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJpbnZhbGlkIGR0cy9wdHMgY29tYmluYXRpb24gJSJQUklpNjQiXG4iLCBwa3QtPmR0cyk7CisgICAgICAgIGlmICggICAgc3RyY21wKHMtPmlmb3JtYXQtPm5hbWUsICJtb3YsbXA0LG00YSwzZ3AsM2cyLG1qMiIpCisgICAgICAgICAgICAgJiYgc3RyY21wKHMtPmlmb3JtYXQtPm5hbWUsICJmbHYiKSkgLy8gb3RoZXJ3aXNlIHdlIGRpc2NhcmQgY29ycmVjdCB0aW1lc3RhbXBzIGZvciB2YzEtd21hcHJvLmlzbQorICAgICAgICAgICAgcGt0LT5kdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICB9CisKKyAgICBkdXJhdGlvbiA9IGF2X211bF9xKChBVlJhdGlvbmFsKSB7cGt0LT5kdXJhdGlvbiwgMX0sIHN0LT50aW1lX2Jhc2UpOworICAgIGlmIChwa3QtPmR1cmF0aW9uID09IDApIHsKKyAgICAgICAgZmZfY29tcHV0ZV9mcmFtZV9kdXJhdGlvbihzLCAmbnVtLCAmZGVuLCBzdCwgcGMsIHBrdCk7CisgICAgICAgIGlmIChkZW4gJiYgbnVtKSB7CisgICAgICAgICAgICBkdXJhdGlvbiA9IChBVlJhdGlvbmFsKSB7bnVtLCBkZW59OworICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcm5kKDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtICogKGludDY0X3QpIHN0LT50aW1lX2Jhc2UuZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbiAqIChpbnQ2NF90KSBzdC0+dGltZV9iYXNlLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ST1VORF9ET1dOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwa3QtPmR1cmF0aW9uICE9IDAgJiYgKHMtPnBhY2tldF9idWZmZXIgfHwgcy0+cGFyc2VfcXVldWUpKQorICAgICAgICB1cGRhdGVfaW5pdGlhbF9kdXJhdGlvbnMocywgc3QsIHBrdC0+c3RyZWFtX2luZGV4LCBwa3QtPmR1cmF0aW9uKTsKKworICAgIC8qIENvcnJlY3QgdGltZXN0YW1wcyB3aXRoIGJ5dGUgb2Zmc2V0IGlmIGRlbXV4ZXJzIG9ubHkgaGF2ZSB0aW1lc3RhbXBzCisgICAgICogb24gcGFja2V0IGJvdW5kYXJpZXMgKi8KKyAgICBpZiAocGMgJiYgc3QtPm5lZWRfcGFyc2luZyA9PSBBVlNUUkVBTV9QQVJTRV9USU1FU1RBTVBTICYmIHBrdC0+c2l6ZSkgeworICAgICAgICAvKiB0aGlzIHdpbGwgZXN0aW1hdGUgYml0cmF0ZSBiYXNlZCBvbiB0aGlzIGZyYW1lJ3MgZHVyYXRpb24gYW5kIHNpemUgKi8KKyAgICAgICAgb2Zmc2V0ID0gYXZfcmVzY2FsZShwYy0+b2Zmc2V0LCBwa3QtPmR1cmF0aW9uLCBwa3QtPnNpemUpOworICAgICAgICBpZiAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBwa3QtPnB0cyArPSBvZmZzZXQ7CisgICAgICAgIGlmIChwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHBrdC0+ZHRzICs9IG9mZnNldDsKKyAgICB9CisKKyAgICAvKiBUaGlzIG1heSBiZSByZWR1bmRhbnQsIGJ1dCBpdCBzaG91bGQgbm90IGh1cnQuICovCisgICAgaWYgKHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmCisgICAgICAgIHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFICYmCisgICAgICAgIHBrdC0+cHRzID4gcGt0LT5kdHMpCisgICAgICAgIHByZXNlbnRhdGlvbl9kZWxheWVkID0gMTsKKworICAgIGF2X2Rsb2coTlVMTCwKKyAgICAgICAgICAgICJJTiBkZWxheWVkOiVkIHB0czolcywgZHRzOiVzIGN1cl9kdHM6JXMgc3Q6JWQgcGM6JXAgZHVyYXRpb246JWQgZGVsYXk6JWQgb25laW5fb25lb3V0OiVkXG4iLAorICAgICAgICAgICAgcHJlc2VudGF0aW9uX2RlbGF5ZWQsIGF2X3RzMnN0cihwa3QtPnB0cyksIGF2X3RzMnN0cihwa3QtPmR0cyksIGF2X3RzMnN0cihzdC0+Y3VyX2R0cyksCisgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCwgcGMsIHBrdC0+ZHVyYXRpb24sIGRlbGF5LCBvbmVpbl9vbmVvdXQpOworICAgIC8qIEludGVycG9sYXRlIFBUUyBhbmQgRFRTIGlmIHRoZXkgYXJlIG5vdCBwcmVzZW50LiBXZSBza2lwIEgyNjQKKyAgICAgKiBjdXJyZW50bHkgYmVjYXVzZSBkZWxheSBhbmQgaGFzX2JfZnJhbWVzIGFyZSBub3QgcmVsaWFibHkgc2V0LiAqLworICAgIGlmICgoZGVsYXkgPT0gMCB8fCAoZGVsYXkgPT0gMSAmJiBwYykpICYmCisgICAgICAgIG9uZWluX29uZW91dCkgeworICAgICAgICBpZiAocHJlc2VudGF0aW9uX2RlbGF5ZWQpIHsKKyAgICAgICAgICAgIC8qIERUUyA9IGRlY29tcHJlc3Npb24gdGltZXN0YW1wICovCisgICAgICAgICAgICAvKiBQVFMgPSBwcmVzZW50YXRpb24gdGltZXN0YW1wICovCisgICAgICAgICAgICBpZiAocGt0LT5kdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgcGt0LT5kdHMgPSBzdC0+bGFzdF9JUF9wdHM7CisgICAgICAgICAgICB1cGRhdGVfaW5pdGlhbF90aW1lc3RhbXBzKHMsIHBrdC0+c3RyZWFtX2luZGV4LCBwa3QtPmR0cywgcGt0LT5wdHMsIHBrdCk7CisgICAgICAgICAgICBpZiAocGt0LT5kdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgcGt0LT5kdHMgPSBzdC0+Y3VyX2R0czsKKworICAgICAgICAgICAgLyogVGhpcyBpcyB0cmlja3k6IHRoZSBkdHMgbXVzdCBiZSBpbmNyZW1lbnRlZCBieSB0aGUgZHVyYXRpb24KKyAgICAgICAgICAgICAqIG9mIHRoZSBmcmFtZSB3ZSBhcmUgZGlzcGxheWluZywgaS5lLiB0aGUgbGFzdCBJLSBvciBQLWZyYW1lLiAqLworICAgICAgICAgICAgaWYgKHN0LT5sYXN0X0lQX2R1cmF0aW9uID09IDApCisgICAgICAgICAgICAgICAgc3QtPmxhc3RfSVBfZHVyYXRpb24gPSBwa3QtPmR1cmF0aW9uOworICAgICAgICAgICAgaWYgKHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgIHN0LT5jdXJfZHRzID0gcGt0LT5kdHMgKyBzdC0+bGFzdF9JUF9kdXJhdGlvbjsKKyAgICAgICAgICAgIHN0LT5sYXN0X0lQX2R1cmF0aW9uID0gcGt0LT5kdXJhdGlvbjsKKyAgICAgICAgICAgIHN0LT5sYXN0X0lQX3B0cyAgICAgID0gcGt0LT5wdHM7CisgICAgICAgICAgICAvKiBDYW5ub3QgY29tcHV0ZSBQVFMgaWYgbm90IHByZXNlbnQgKHdlIGNhbiBjb21wdXRlIGl0IG9ubHkKKyAgICAgICAgICAgICAqIGJ5IGtub3dpbmcgdGhlIGZ1dHVyZS4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSB8fAorICAgICAgICAgICAgICAgICAgIHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFIHx8CisgICAgICAgICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiAgICAgICAgICAgICAgICApIHsKKworICAgICAgICAgICAgLyogcHJlc2VudGF0aW9uIGlzIG5vdCBkZWxheWVkIDogUFRTIGFuZCBEVFMgYXJlIHRoZSBzYW1lICovCisgICAgICAgICAgICBpZiAocGt0LT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgcGt0LT5wdHMgPSBwa3QtPmR0czsKKyAgICAgICAgICAgIHVwZGF0ZV9pbml0aWFsX3RpbWVzdGFtcHMocywgcGt0LT5zdHJlYW1faW5kZXgsIHBrdC0+cHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPnB0cywgcGt0KTsKKyAgICAgICAgICAgIGlmIChwa3QtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgICAgICBwa3QtPnB0cyA9IHN0LT5jdXJfZHRzOworICAgICAgICAgICAgcGt0LT5kdHMgPSBwa3QtPnB0czsKKyAgICAgICAgICAgIGlmIChwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgICAgICBzdC0+Y3VyX2R0cyA9IGF2X2FkZF9zdGFibGUoc3QtPnRpbWVfYmFzZSwgcGt0LT5wdHMsIGR1cmF0aW9uLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBkZWxheSA8PSBNQVhfUkVPUkRFUl9ERUxBWSAmJiBoYXNfZGVjb2RlX2RlbGF5X2JlZW5fZ3Vlc3NlZChzdCkpIHsKKyAgICAgICAgc3QtPnB0c19idWZmZXJbMF0gPSBwa3QtPnB0czsKKyAgICAgICAgZm9yIChpID0gMDsgaTxkZWxheSAmJiBzdC0+cHRzX2J1ZmZlcltpXSA+IHN0LT5wdHNfYnVmZmVyW2kgKyAxXTsgaSsrKQorICAgICAgICAgICAgRkZTV0FQKGludDY0X3QsIHN0LT5wdHNfYnVmZmVyW2ldLCBzdC0+cHRzX2J1ZmZlcltpICsgMV0pOworCisgICAgICAgIHBrdC0+ZHRzID0gc2VsZWN0X2Zyb21fcHRzX2J1ZmZlcihzdCwgc3QtPnB0c19idWZmZXIsIHBrdC0+ZHRzKTsKKyAgICB9CisgICAgLy8gV2Ugc2tpcHBlZCBpdCBhYm92ZSBzbyB3ZSB0cnkgaGVyZS4KKyAgICBpZiAoIW9uZWluX29uZW91dCkKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgaGFwcGVuIG9uIHRoZSBmaXJzdCBwYWNrZXQKKyAgICAgICAgdXBkYXRlX2luaXRpYWxfdGltZXN0YW1wcyhzLCBwa3QtPnN0cmVhbV9pbmRleCwgcGt0LT5kdHMsIHBrdC0+cHRzLCBwa3QpOworICAgIGlmIChwa3QtPmR0cyA+IHN0LT5jdXJfZHRzKQorICAgICAgICBzdC0+Y3VyX2R0cyA9IHBrdC0+ZHRzOworCisgICAgYXZfZGxvZyhOVUxMLCAiT1VUZGVsYXllZDolZC8lZCBwdHM6JXMsIGR0czolcyBjdXJfZHRzOiVzXG4iLAorICAgICAgICAgICAgcHJlc2VudGF0aW9uX2RlbGF5ZWQsIGRlbGF5LCBhdl90czJzdHIocGt0LT5wdHMpLCBhdl90czJzdHIocGt0LT5kdHMpLCBhdl90czJzdHIoc3QtPmN1cl9kdHMpKTsKKworICAgIC8qIHVwZGF0ZSBmbGFncyAqLworICAgIGlmIChpc19pbnRyYV9vbmx5KHN0LT5jb2RlYykpCisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgIGlmIChwYykKKyAgICAgICAgcGt0LT5jb252ZXJnZW5jZV9kdXJhdGlvbiA9IHBjLT5jb252ZXJnZW5jZV9kdXJhdGlvbjsKK30KKworc3RhdGljIHZvaWQgZnJlZV9wYWNrZXRfYnVmZmVyKEFWUGFja2V0TGlzdCAqKnBrdF9idWYsIEFWUGFja2V0TGlzdCAqKnBrdF9idWZfZW5kKQoreworICAgIHdoaWxlICgqcGt0X2J1ZikgeworICAgICAgICBBVlBhY2tldExpc3QgKnBrdGwgPSAqcGt0X2J1ZjsKKyAgICAgICAgKnBrdF9idWYgPSBwa3RsLT5uZXh0OworICAgICAgICBhdl9mcmVlX3BhY2tldCgmcGt0bC0+cGt0KTsKKyAgICAgICAgYXZfZnJlZXAoJnBrdGwpOworICAgIH0KKyAgICAqcGt0X2J1Zl9lbmQgPSBOVUxMOworfQorCisvKioKKyAqIFBhcnNlIGEgcGFja2V0LCBhZGQgYWxsIHNwbGl0IHBhcnRzIHRvIHBhcnNlX3F1ZXVlLgorICoKKyAqIEBwYXJhbSBwa3QgUGFja2V0IHRvIHBhcnNlLCBOVUxMIHdoZW4gZmx1c2hpbmcgdGhlIHBhcnNlciBhdCBlbmQgb2Ygc3RyZWFtLgorICovCitzdGF0aWMgaW50IHBhcnNlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsIGludCBzdHJlYW1faW5kZXgpCit7CisgICAgQVZQYWNrZXQgb3V0X3BrdCA9IHsgMCB9LCBmbHVzaF9wa3QgPSB7IDAgfTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgdWludDhfdCAqZGF0YSA9IHBrdCA/IHBrdC0+ZGF0YSA6IE5VTEw7CisgICAgaW50IHNpemUgICAgICA9IHBrdCA/IHBrdC0+c2l6ZSA6IDA7CisgICAgaW50IHJldCA9IDAsIGdvdF9vdXRwdXQgPSAwOworCisgICAgaWYgKCFwa3QpIHsKKyAgICAgICAgYXZfaW5pdF9wYWNrZXQoJmZsdXNoX3BrdCk7CisgICAgICAgIHBrdCAgICAgICAgPSAmZmx1c2hfcGt0OworICAgICAgICBnb3Rfb3V0cHV0ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzaXplICYmIHN0LT5wYXJzZXItPmZsYWdzICYgUEFSU0VSX0ZMQUdfQ09NUExFVEVfRlJBTUVTKSB7CisgICAgICAgIC8vIHByZXNlcnZlIDAtc2l6ZSBzeW5jIHBhY2tldHMKKyAgICAgICAgY29tcHV0ZV9wa3RfZmllbGRzKHMsIHN0LCBzdC0+cGFyc2VyLCBwa3QpOworICAgIH0KKworICAgIHdoaWxlIChzaXplID4gMCB8fCAocGt0ID09ICZmbHVzaF9wa3QgJiYgZ290X291dHB1dCkpIHsKKyAgICAgICAgaW50IGxlbjsKKworICAgICAgICBhdl9pbml0X3BhY2tldCgmb3V0X3BrdCk7CisgICAgICAgIGxlbiA9IGF2X3BhcnNlcl9wYXJzZTIoc3QtPnBhcnNlciwgc3QtPmNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfcGt0LmRhdGEsICZvdXRfcGt0LnNpemUsIGRhdGEsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5wdHMsIHBrdC0+ZHRzLCBwa3QtPnBvcyk7CisKKyAgICAgICAgcGt0LT5wdHMgPSBwa3QtPmR0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBwa3QtPnBvcyA9IC0xOworICAgICAgICAvKiBpbmNyZW1lbnQgcmVhZCBwb2ludGVyICovCisgICAgICAgIGRhdGEgKz0gbGVuOworICAgICAgICBzaXplIC09IGxlbjsKKworICAgICAgICBnb3Rfb3V0cHV0ID0gISFvdXRfcGt0LnNpemU7CisKKyAgICAgICAgaWYgKCFvdXRfcGt0LnNpemUpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAocGt0LT5zaWRlX2RhdGEpIHsKKyAgICAgICAgICAgIG91dF9wa3Quc2lkZV9kYXRhICAgICAgID0gcGt0LT5zaWRlX2RhdGE7CisgICAgICAgICAgICBvdXRfcGt0LnNpZGVfZGF0YV9lbGVtcyA9IHBrdC0+c2lkZV9kYXRhX2VsZW1zOworICAgICAgICAgICAgcGt0LT5zaWRlX2RhdGEgICAgICAgICAgPSBOVUxMOworICAgICAgICAgICAgcGt0LT5zaWRlX2RhdGFfZWxlbXMgICAgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IHRoZSBkdXJhdGlvbiAqLworICAgICAgICBvdXRfcGt0LmR1cmF0aW9uID0gMDsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID4gMCkgeworICAgICAgICAgICAgICAgIG91dF9wa3QuZHVyYXRpb24gPQorICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3Ffcm5kKHN0LT5wYXJzZXItPmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKSB7IDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1JPVU5EX0RPV04pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0X3BrdC5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgICAgIG91dF9wa3QucHRzICAgICAgICAgID0gc3QtPnBhcnNlci0+cHRzOworICAgICAgICBvdXRfcGt0LmR0cyAgICAgICAgICA9IHN0LT5wYXJzZXItPmR0czsKKyAgICAgICAgb3V0X3BrdC5wb3MgICAgICAgICAgPSBzdC0+cGFyc2VyLT5wb3M7CisKKyAgICAgICAgaWYgKHN0LT5uZWVkX3BhcnNpbmcgPT0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVcpCisgICAgICAgICAgICBvdXRfcGt0LnBvcyA9IHN0LT5wYXJzZXItPmZyYW1lX29mZnNldDsKKworICAgICAgICBpZiAoc3QtPnBhcnNlci0+a2V5X2ZyYW1lID09IDEgfHwKKyAgICAgICAgICAgIChzdC0+cGFyc2VyLT5rZXlfZnJhbWUgPT0gLTEgJiYKKyAgICAgICAgICAgICBzdC0+cGFyc2VyLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpKQorICAgICAgICAgICAgb3V0X3BrdC5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICAgICAgaWYgKHN0LT5wYXJzZXItPmtleV9mcmFtZSA9PSAtMSAmJiBzdC0+cGFyc2VyLT5waWN0X3R5cGUgPT1BVl9QSUNUVVJFX1RZUEVfTk9ORSAmJiAocGt0LT5mbGFncyZBVl9QS1RfRkxBR19LRVkpKQorICAgICAgICAgICAgb3V0X3BrdC5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICAgICAgY29tcHV0ZV9wa3RfZmllbGRzKHMsIHN0LCBzdC0+cGFyc2VyLCAmb3V0X3BrdCk7CisKKyAgICAgICAgaWYgKG91dF9wa3QuZGF0YSA9PSBwa3QtPmRhdGEgJiYgb3V0X3BrdC5zaXplID09IHBrdC0+c2l6ZSkgeworICAgICAgICAgICAgb3V0X3BrdC5idWYgPSBwa3QtPmJ1ZjsKKyAgICAgICAgICAgIHBrdC0+YnVmICAgID0gTlVMTDsKKyNpZiBGRl9BUElfREVTVFJVQ1RfUEFDS0VUCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICBvdXRfcGt0LmRlc3RydWN0ID0gcGt0LT5kZXN0cnVjdDsKKyAgICAgICAgICAgIHBrdC0+ZGVzdHJ1Y3QgPSBOVUxMOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJldCA9IGF2X2R1cF9wYWNrZXQoJm91dF9wa3QpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgaWYgKCFhZGRfdG9fcGt0YnVmKCZzLT5wYXJzZV9xdWV1ZSwgJm91dF9wa3QsICZzLT5wYXJzZV9xdWV1ZV9lbmQpKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldCgmb3V0X3BrdCk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBlbmQgb2YgdGhlIHN0cmVhbSA9PiBjbG9zZSBhbmQgZnJlZSB0aGUgcGFyc2VyICovCisgICAgaWYgKHBrdCA9PSAmZmx1c2hfcGt0KSB7CisgICAgICAgIGF2X3BhcnNlcl9jbG9zZShzdC0+cGFyc2VyKTsKKyAgICAgICAgc3QtPnBhcnNlciA9IE5VTEw7CisgICAgfQorCitmYWlsOgorICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZWFkX2Zyb21fcGFja2V0X2J1ZmZlcihBVlBhY2tldExpc3QgKipwa3RfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldExpc3QgKipwa3RfYnVmZmVyX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgICAgICAqcGt0KQoreworICAgIEFWUGFja2V0TGlzdCAqcGt0bDsKKyAgICBhdl9hc3NlcnQwKCpwa3RfYnVmZmVyKTsKKyAgICBwa3RsICAgICAgICA9ICpwa3RfYnVmZmVyOworICAgICpwa3QgICAgICAgID0gcGt0bC0+cGt0OworICAgICpwa3RfYnVmZmVyID0gcGt0bC0+bmV4dDsKKyAgICBpZiAoIXBrdGwtPm5leHQpCisgICAgICAgICpwa3RfYnVmZmVyX2VuZCA9IE5VTEw7CisgICAgYXZfZnJlZXAoJnBrdGwpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50NjRfdCB0c190b19zYW1wbGVzKEFWU3RyZWFtICpzdCwgaW50NjRfdCB0cykKK3sKKyAgICByZXR1cm4gYXZfcmVzY2FsZSh0cywgc3QtPnRpbWVfYmFzZS5udW0gKiBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlLCBzdC0+dGltZV9iYXNlLmRlbik7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9mcmFtZV9pbnRlcm5hbChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldCA9IDAsIGksIGdvdF9wYWNrZXQgPSAwOworICAgIEFWRGljdGlvbmFyeSAqbWV0YWRhdGEgPSBOVUxMOworCisgICAgYXZfaW5pdF9wYWNrZXQocGt0KTsKKworICAgIHdoaWxlICghZ290X3BhY2tldCAmJiAhcy0+cGFyc2VfcXVldWUpIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0OworICAgICAgICBBVlBhY2tldCBjdXJfcGt0OworCisgICAgICAgIC8qIHJlYWQgbmV4dCBwYWNrZXQgKi8KKyAgICAgICAgcmV0ID0gZmZfcmVhZF9wYWNrZXQocywgJmN1cl9wa3QpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIC8qIGZsdXNoIHRoZSBwYXJzZXJzICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgICAgIGlmIChzdC0+cGFyc2VyICYmIHN0LT5uZWVkX3BhcnNpbmcpCisgICAgICAgICAgICAgICAgICAgIHBhcnNlX3BhY2tldChzLCBOVUxMLCBzdC0+aW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogYWxsIHJlbWFpbmluZyBwYWNrZXRzIGFyZSBub3cgaW4gcGFyc2VfcXVldWUgPT4KKyAgICAgICAgICAgICAqIHJlYWxseSB0ZXJtaW5hdGUgcGFyc2luZyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgc3QgID0gcy0+c3RyZWFtc1tjdXJfcGt0LnN0cmVhbV9pbmRleF07CisKKyAgICAgICAgaWYgKGN1cl9wa3QucHRzICE9IEFWX05PUFRTX1ZBTFVFICYmCisgICAgICAgICAgICBjdXJfcGt0LmR0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICAgICAgY3VyX3BrdC5wdHMgPCBjdXJfcGt0LmR0cykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHRpbWVzdGFtcHMgc3RyZWFtPSVkLCBwdHM9JXMsIGR0cz0lcywgc2l6ZT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICBjdXJfcGt0LnN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICBhdl90czJzdHIoY3VyX3BrdC5wdHMpLAorICAgICAgICAgICAgICAgICAgIGF2X3RzMnN0cihjdXJfcGt0LmR0cyksCisgICAgICAgICAgICAgICAgICAgY3VyX3BrdC5zaXplKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+ZGVidWcgJiBGRl9GREVCVUdfVFMpCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJmZl9yZWFkX3BhY2tldCBzdHJlYW09JWQsIHB0cz0lcywgZHRzPSVzLCBzaXplPSVkLCBkdXJhdGlvbj0lZCwgZmxhZ3M9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgY3VyX3BrdC5zdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKGN1cl9wa3QucHRzKSwKKyAgICAgICAgICAgICAgICAgICBhdl90czJzdHIoY3VyX3BrdC5kdHMpLAorICAgICAgICAgICAgICAgICAgIGN1cl9wa3Quc2l6ZSwgY3VyX3BrdC5kdXJhdGlvbiwgY3VyX3BrdC5mbGFncyk7CisKKyAgICAgICAgaWYgKHN0LT5uZWVkX3BhcnNpbmcgJiYgIXN0LT5wYXJzZXIgJiYgIShzLT5mbGFncyAmIEFWRk1UX0ZMQUdfTk9QQVJTRSkpIHsKKyAgICAgICAgICAgIHN0LT5wYXJzZXIgPSBhdl9wYXJzZXJfaW5pdChzdC0+Y29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIGlmICghc3QtPnBhcnNlcikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgInBhcnNlciBub3QgZm91bmQgZm9yIGNvZGVjICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzLCBwYWNrZXRzIG9yIHRpbWVzIG1heSBiZSBpbnZhbGlkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShzdC0+Y29kZWMtPmNvZGVjX2lkKSk7CisgICAgICAgICAgICAgICAgLyogbm8gcGFyc2VyIGF2YWlsYWJsZToganVzdCBvdXRwdXQgdGhlIHJhdyBwYWNrZXRzICovCisgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX05PTkU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5uZWVkX3BhcnNpbmcgPT0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUykKKyAgICAgICAgICAgICAgICBzdC0+cGFyc2VyLT5mbGFncyB8PSBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVM7CisgICAgICAgICAgICBlbHNlIGlmIChzdC0+bmVlZF9wYXJzaW5nID09IEFWU1RSRUFNX1BBUlNFX0ZVTExfT05DRSkKKyAgICAgICAgICAgICAgICBzdC0+cGFyc2VyLT5mbGFncyB8PSBQQVJTRVJfRkxBR19PTkNFOworICAgICAgICAgICAgZWxzZSBpZiAoc3QtPm5lZWRfcGFyc2luZyA9PSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVykKKyAgICAgICAgICAgICAgICBzdC0+cGFyc2VyLT5mbGFncyB8PSBQQVJTRVJfRkxBR19VU0VfQ09ERUNfVFM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN0LT5uZWVkX3BhcnNpbmcgfHwgIXN0LT5wYXJzZXIpIHsKKyAgICAgICAgICAgIC8qIG5vIHBhcnNpbmcgbmVlZGVkOiB3ZSBqdXN0IG91dHB1dCB0aGUgcGFja2V0IGFzIGlzICovCisgICAgICAgICAgICAqcGt0ID0gY3VyX3BrdDsKKyAgICAgICAgICAgIGNvbXB1dGVfcGt0X2ZpZWxkcyhzLCBzdCwgTlVMTCwgcGt0KTsKKyAgICAgICAgICAgIGlmICgocy0+aWZvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9HRU5FUklDX0lOREVYKSAmJgorICAgICAgICAgICAgICAgIChwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSAmJiBwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgICAgIGZmX3JlZHVjZV9pbmRleChzLCBzdC0+aW5kZXgpOworICAgICAgICAgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeShzdCwgcGt0LT5wb3MsIHBrdC0+ZHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdF9wYWNrZXQgPSAxOworICAgICAgICB9IGVsc2UgaWYgKHN0LT5kaXNjYXJkIDwgQVZESVNDQVJEX0FMTCkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9wYWNrZXQocywgJmN1cl9wa3QsIGN1cl9wa3Quc3RyZWFtX2luZGV4KSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBmcmVlIHBhY2tldCAqLworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQoJmN1cl9wa3QpOworICAgICAgICB9CisgICAgICAgIGlmIChwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKQorICAgICAgICAgICAgc3QtPnNraXBfdG9fa2V5ZnJhbWUgPSAwOworICAgICAgICBpZiAoc3QtPnNraXBfdG9fa2V5ZnJhbWUpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZjdXJfcGt0KTsKKyAgICAgICAgICAgIGlmIChnb3RfcGFja2V0KSB7CisgICAgICAgICAgICAgICAgKnBrdCA9IGN1cl9wa3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RfcGFja2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZ290X3BhY2tldCAmJiBzLT5wYXJzZV9xdWV1ZSkKKyAgICAgICAgcmV0ID0gcmVhZF9mcm9tX3BhY2tldF9idWZmZXIoJnMtPnBhcnNlX3F1ZXVlLCAmcy0+cGFyc2VfcXVldWVfZW5kLCBwa3QpOworCisgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworICAgICAgICBpbnQgZGlzY2FyZF9wYWRkaW5nID0gMDsKKyAgICAgICAgaWYgKHN0LT5maXJzdF9kaXNjYXJkX3NhbXBsZSAmJiBwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgaW50NjRfdCBwdHMgPSBwa3QtPnB0cyAtIChpc19yZWxhdGl2ZShwa3QtPnB0cykgPyBSRUxBVElWRV9UU19CQVNFIDogMCk7CisgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZSA9IHRzX3RvX3NhbXBsZXMoc3QsIHB0cyk7CisgICAgICAgICAgICBpbnQgZHVyYXRpb24gPSB0c190b19zYW1wbGVzKHN0LCBwa3QtPmR1cmF0aW9uKTsKKyAgICAgICAgICAgIGludDY0X3QgZW5kX3NhbXBsZSA9IHNhbXBsZSArIGR1cmF0aW9uOworICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gMCAmJiBlbmRfc2FtcGxlID49IHN0LT5maXJzdF9kaXNjYXJkX3NhbXBsZSAmJgorICAgICAgICAgICAgICAgIHNhbXBsZSA8IHN0LT5sYXN0X2Rpc2NhcmRfc2FtcGxlKQorICAgICAgICAgICAgICAgIGRpc2NhcmRfcGFkZGluZyA9IEZGTUlOKGVuZF9zYW1wbGUgLSBzdC0+Zmlyc3RfZGlzY2FyZF9zYW1wbGUsIGR1cmF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3QtPnNraXBfc2FtcGxlcyB8fCBkaXNjYXJkX3BhZGRpbmcpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnAgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX1NLSVBfU0FNUExFUywgMTApOworICAgICAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgICAgICBBVl9XTDMyKHAsIHN0LT5za2lwX3NhbXBsZXMpOworICAgICAgICAgICAgICAgIEFWX1dMMzIocCArIDQsIGRpc2NhcmRfcGFkZGluZyk7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImRlbXV4ZXIgaW5qZWN0aW5nIHNraXAgJWRcbiIsIHN0LT5za2lwX3NhbXBsZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3QtPnNraXBfc2FtcGxlcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3QtPmluamVjdF9nbG9iYWxfc2lkZV9kYXRhKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPm5iX3NpZGVfZGF0YTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQVZQYWNrZXRTaWRlRGF0YSAqc3JjX3NkID0gJnN0LT5zaWRlX2RhdGFbaV07CisgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0X2RhdGE7CisKKyAgICAgICAgICAgICAgICBpZiAoYXZfcGFja2V0X2dldF9zaWRlX2RhdGEocGt0LCBzcmNfc2QtPnR5cGUsIE5VTEwpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGRzdF9kYXRhID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LCBzcmNfc2QtPnR5cGUsIHNyY19zZC0+c2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFkc3RfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJDb3VsZCBub3QgaW5qZWN0IGdsb2JhbCBzaWRlIGRhdGFcbiIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0X2RhdGEsIHNyY19zZC0+ZGF0YSwgc3JjX3NkLT5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0LT5pbmplY3RfZ2xvYmFsX3NpZGVfZGF0YSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShzLT5mbGFncyAmIEFWRk1UX0ZMQUdfS0VFUF9TSURFX0RBVEEpKQorICAgICAgICAgICAgYXZfcGFja2V0X21lcmdlX3NpZGVfZGF0YShwa3QpOworICAgIH0KKworICAgIGF2X29wdF9nZXRfZGljdF92YWwocywgIm1ldGFkYXRhIiwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiwgJm1ldGFkYXRhKTsKKyAgICBpZiAobWV0YWRhdGEpIHsKKyAgICAgICAgcy0+ZXZlbnRfZmxhZ3MgfD0gQVZGTVRfRVZFTlRfRkxBR19NRVRBREFUQV9VUERBVEVEOworICAgICAgICBhdl9kaWN0X2NvcHkoJnMtPm1ldGFkYXRhLCBtZXRhZGF0YSwgMCk7CisgICAgICAgIGF2X2RpY3RfZnJlZSgmbWV0YWRhdGEpOworICAgICAgICBhdl9vcHRfc2V0X2RpY3RfdmFsKHMsICJtZXRhZGF0YSIsIE5VTEwsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pOworICAgIH0KKworICAgIGlmIChzLT5kZWJ1ZyAmIEZGX0ZERUJVR19UUykKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJyZWFkX2ZyYW1lX2ludGVybmFsIHN0cmVhbT0lZCwgcHRzPSVzLCBkdHM9JXMsICIKKyAgICAgICAgICAgICAgICJzaXplPSVkLCBkdXJhdGlvbj0lZCwgZmxhZ3M9JWRcbiIsCisgICAgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgIGF2X3RzMnN0cihwa3QtPnB0cyksCisgICAgICAgICAgICAgICBhdl90czJzdHIocGt0LT5kdHMpLAorICAgICAgICAgICAgICAgcGt0LT5zaXplLCBwa3QtPmR1cmF0aW9uLCBwa3QtPmZsYWdzKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBhdl9yZWFkX2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBjb25zdCBpbnQgZ2VucHRzID0gcy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0dFTlBUUzsKKyAgICBpbnQgZW9mID0gMDsKKyAgICBpbnQgcmV0OworICAgIEFWU3RyZWFtICpzdDsKKworICAgIGlmICghZ2VucHRzKSB7CisgICAgICAgIHJldCA9IHMtPnBhY2tldF9idWZmZXIKKyAgICAgICAgICAgICAgPyByZWFkX2Zyb21fcGFja2V0X2J1ZmZlcigmcy0+cGFja2V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+cGFja2V0X2J1ZmZlcl9lbmQsIHBrdCkKKyAgICAgICAgICAgICAgOiByZWFkX2ZyYW1lX2ludGVybmFsKHMsIHBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZ290byByZXR1cm5fcGFja2V0OworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgQVZQYWNrZXRMaXN0ICpwa3RsID0gcy0+cGFja2V0X2J1ZmZlcjsKKworICAgICAgICBpZiAocGt0bCkgeworICAgICAgICAgICAgQVZQYWNrZXQgKm5leHRfcGt0ID0gJnBrdGwtPnBrdDsKKworICAgICAgICAgICAgaWYgKG5leHRfcGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICBpbnQgd3JhcF9iaXRzID0gcy0+c3RyZWFtc1tuZXh0X3BrdC0+c3RyZWFtX2luZGV4XS0+cHRzX3dyYXBfYml0czsKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGR0cyBzZWVuIGZvciB0aGlzIHN0cmVhbS4gaWYgYW55IG9mIHBhY2tldHMgZm9sbG93aW5nCisgICAgICAgICAgICAgICAgLy8gY3VycmVudCBvbmUgaGFkIG5vIGR0cywgd2Ugd2lsbCBzZXQgdGhpcyB0byBBVl9OT1BUU19WQUxVRS4KKyAgICAgICAgICAgICAgICBpbnQ2NF90IGxhc3RfZHRzID0gbmV4dF9wa3QtPmR0czsKKyAgICAgICAgICAgICAgICB3aGlsZSAocGt0bCAmJiBuZXh0X3BrdC0+cHRzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwa3RsLT5wa3Quc3RyZWFtX2luZGV4ID09IG5leHRfcGt0LT5zdHJlYW1faW5kZXggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhdl9jb21wYXJlX21vZChuZXh0X3BrdC0+ZHRzLCBwa3RsLT5wa3QuZHRzLCAyTEwgPDwgKHdyYXBfYml0cyAtIDEpKSA8IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXZfY29tcGFyZV9tb2QocGt0bC0+cGt0LnB0cywgcGt0bC0+cGt0LmR0cywgMkxMIDw8ICh3cmFwX2JpdHMgLSAxKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgQi1mcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfcGt0LT5wdHMgPSBwa3RsLT5wa3QuZHRzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfZHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25jZSBsYXN0IGR0cyB3YXMgc2V0IHRvIEFWX05PUFRTX1ZBTFVFLCB3ZSBkb24ndCBjaGFuZ2UgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9kdHMgPSBwa3RsLT5wa3QuZHRzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBrdGwgPSBwa3RsLT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZW9mICYmIG5leHRfcGt0LT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgJiYgbGFzdF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRml4aW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBmcmFtZSBoYWQgbm9uZSBwdHMgaXNzdWUgKEZvciBNWEYgZXRjKS4KKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBkbyB0aGlzIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gMS4gZW9mLgorICAgICAgICAgICAgICAgICAgICAvLyAyLiB3ZSBhcmUgbm90IGFibGUgdG8gcmVzb2x2ZSBhIHB0cyB2YWx1ZSBmb3IgY3VycmVudCBwYWNrZXQuCisgICAgICAgICAgICAgICAgICAgIC8vIDMuIHRoZSBwYWNrZXRzIGZvciB0aGlzIHN0cmVhbSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlcyBoYWQgdmFsaWQgZHRzLgorICAgICAgICAgICAgICAgICAgICBuZXh0X3BrdC0+cHRzID0gbGFzdF9kdHMgKyBuZXh0X3BrdC0+ZHVyYXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBrdGwgPSBzLT5wYWNrZXRfYnVmZmVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiByZWFkIHBhY2tldCBmcm9tIHBhY2tldCBidWZmZXIsIGlmIHRoZXJlIGlzIGRhdGEgKi8KKyAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tuZXh0X3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICAgICAgICAgIGlmICghKG5leHRfcGt0LT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgJiYgc3QtPmRpc2NhcmQgPCBBVkRJU0NBUkRfQUxMICYmCisgICAgICAgICAgICAgICAgICBuZXh0X3BrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmICFlb2YpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcmVhZF9mcm9tX3BhY2tldF9idWZmZXIoJnMtPnBhY2tldF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5wYWNrZXRfYnVmZmVyX2VuZCwgcGt0KTsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wYWNrZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXQgPSByZWFkX2ZyYW1lX2ludGVybmFsKHMsIHBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAocGt0bCAmJiByZXQgIT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgICAgICAgICAgZW9mID0gMTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXZfZHVwX3BhY2tldChhZGRfdG9fcGt0YnVmKCZzLT5wYWNrZXRfYnVmZmVyLCBwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnBhY2tldF9idWZmZXJfZW5kKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKK3JldHVybl9wYWNrZXQ6CisKKyAgICBzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworICAgIGlmICgocy0+aWZvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9HRU5FUklDX0lOREVYKSAmJiBwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSB7CisgICAgICAgIGZmX3JlZHVjZV9pbmRleChzLCBzdC0+aW5kZXgpOworICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIHBrdC0+cG9zLCBwa3QtPmR0cywgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgfQorCisgICAgaWYgKGlzX3JlbGF0aXZlKHBrdC0+ZHRzKSkKKyAgICAgICAgcGt0LT5kdHMgLT0gUkVMQVRJVkVfVFNfQkFTRTsKKyAgICBpZiAoaXNfcmVsYXRpdmUocGt0LT5wdHMpKQorICAgICAgICBwa3QtPnB0cyAtPSBSRUxBVElWRV9UU19CQVNFOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogWFhYOiBzdXBwcmVzcyB0aGUgcGFja2V0IHF1ZXVlICovCitzdGF0aWMgdm9pZCBmbHVzaF9wYWNrZXRfcXVldWUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGZyZWVfcGFja2V0X2J1ZmZlcigmcy0+cGFyc2VfcXVldWUsICAgICAgICZzLT5wYXJzZV9xdWV1ZV9lbmQpOworICAgIGZyZWVfcGFja2V0X2J1ZmZlcigmcy0+cGFja2V0X2J1ZmZlciwgICAgICZzLT5wYWNrZXRfYnVmZmVyX2VuZCk7CisgICAgZnJlZV9wYWNrZXRfYnVmZmVyKCZzLT5yYXdfcGFja2V0X2J1ZmZlciwgJnMtPnJhd19wYWNrZXRfYnVmZmVyX2VuZCk7CisKKyAgICBzLT5yYXdfcGFja2V0X2J1ZmZlcl9yZW1haW5pbmdfc2l6ZSA9IFJBV19QQUNLRVRfQlVGRkVSX1NJWkU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc2VlayBzdXBwb3J0ICovCisKK2ludCBhdl9maW5kX2RlZmF1bHRfc3RyZWFtX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IGJlc3Rfc3RyZWFtID0gMDsKKyAgICBpbnQgYmVzdF9zY29yZSA9IC0xOworCisgICAgaWYgKHMtPm5iX3N0cmVhbXMgPD0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaW50IHNjb3JlID0gMDsKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgICAgICAgICAgIShzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUMpKSB7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+d2lkdGggJiYgIXN0LT5jb2RlYy0+aGVpZ2h0ICYmICFzdC0+Y29kZWNfaW5mb19uYl9mcmFtZXMpCisgICAgICAgICAgICAgICAgc2NvcmUgKz0gMjU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2NvcmUgKz0gMTAwOworICAgICAgICB9CisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgJiYgIXN0LT5jb2RlY19pbmZvX25iX2ZyYW1lcykKKyAgICAgICAgICAgICAgICBzY29yZSArPSAxMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzY29yZSArPSA1MDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzY29yZSA+IGJlc3Rfc2NvcmUpIHsKKyAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKKyAgICAgICAgICAgIGJlc3Rfc3RyZWFtID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmVzdF9zdHJlYW07Cit9CisKKy8qKiBGbHVzaCB0aGUgZnJhbWUgcmVhZGVyLiAqLwordm9pZCBmZl9yZWFkX2ZyYW1lX2ZsdXNoKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IGksIGo7CisKKyAgICBmbHVzaF9wYWNrZXRfcXVldWUocyk7CisKKyAgICAvKiBSZXNldCByZWFkIHN0YXRlIGZvciBlYWNoIHN0cmVhbS4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKworICAgICAgICBpZiAoc3QtPnBhcnNlcikgeworICAgICAgICAgICAgYXZfcGFyc2VyX2Nsb3NlKHN0LT5wYXJzZXIpOworICAgICAgICAgICAgc3QtPnBhcnNlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3QtPmxhc3RfSVBfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHN0LT5sYXN0X2R0c19mb3Jfb3JkZXJfY2hlY2sgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgaWYgKHN0LT5maXJzdF9kdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBzdC0+Y3VyX2R0cyA9IFJFTEFUSVZFX1RTX0JBU0U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8qIFdlIHNldCB0aGUgY3VycmVudCBEVFMgdG8gYW4gdW5zcGVjaWZpZWQgb3JpZ2luLiAqLworICAgICAgICAgICAgc3QtPmN1cl9kdHMgPSBBVl9OT1BUU19WQUxVRTsKKworICAgICAgICBzdC0+cHJvYmVfcGFja2V0cyA9IE1BWF9QUk9CRV9QQUNLRVRTOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfUkVPUkRFUl9ERUxBWSArIDE7IGorKykKKyAgICAgICAgICAgIHN0LT5wdHNfYnVmZmVyW2pdID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICAgICAgaWYgKHMtPmludGVybmFsLT5pbmplY3RfZ2xvYmFsX3NpZGVfZGF0YSkKKyAgICAgICAgICAgIHN0LT5pbmplY3RfZ2xvYmFsX3NpZGVfZGF0YSA9IDE7CisgICAgfQorfQorCit2b2lkIGZmX3VwZGF0ZV9jdXJfZHRzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnJlZl9zdCwgaW50NjRfdCB0aW1lc3RhbXApCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisKKyAgICAgICAgc3QtPmN1cl9kdHMgPQorICAgICAgICAgICAgYXZfcmVzY2FsZSh0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UuZGVuICogKGludDY0X3QpIHJlZl9zdC0+dGltZV9iYXNlLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZS5udW0gKiAoaW50NjRfdCkgcmVmX3N0LT50aW1lX2Jhc2UuZGVuKTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfcmVkdWNlX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCkKK3sKKyAgICBBVlN0cmVhbSAqc3QgICAgICAgICAgICAgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzID0gcy0+bWF4X2luZGV4X3NpemUgLyBzaXplb2YoQVZJbmRleEVudHJ5KTsKKworICAgIGlmICgodW5zaWduZWQpIHN0LT5uYl9pbmRleF9lbnRyaWVzID49IG1heF9lbnRyaWVzKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyAyICogaSA8IHN0LT5uYl9pbmRleF9lbnRyaWVzOyBpKyspCisgICAgICAgICAgICBzdC0+aW5kZXhfZW50cmllc1tpXSA9IHN0LT5pbmRleF9lbnRyaWVzWzIgKiBpXTsKKyAgICAgICAgc3QtPm5iX2luZGV4X2VudHJpZXMgPSBpOworICAgIH0KK30KKworaW50IGZmX2FkZF9pbmRleF9lbnRyeShBVkluZGV4RW50cnkgKippbmRleF9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5iX2luZGV4X2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqaW5kZXhfZW50cmllc19hbGxvY2F0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3MsIGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGRpc3RhbmNlLCBpbnQgZmxhZ3MpCit7CisgICAgQVZJbmRleEVudHJ5ICplbnRyaWVzLCAqaWU7CisgICAgaW50IGluZGV4OworCisgICAgaWYgKCh1bnNpZ25lZCkgKm5iX2luZGV4X2VudHJpZXMgKyAxID49IFVJTlRfTUFYIC8gc2l6ZW9mKEFWSW5kZXhFbnRyeSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICh0aW1lc3RhbXAgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+IDB4M0ZGRkZGRkYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoaXNfcmVsYXRpdmUodGltZXN0YW1wKSkgLy9GSVhNRSB0aGlzIG1haW50YWlucyBwcmV2aW91cyBiZWhhdmlvciBidXQgd2Ugc2hvdWxkIHNoaWZ0IGJ5IHRoZSBjb3JyZWN0IG9mZnNldCBvbmNlIGtub3duCisgICAgICAgIHRpbWVzdGFtcCAtPSBSRUxBVElWRV9UU19CQVNFOworCisgICAgZW50cmllcyA9IGF2X2Zhc3RfcmVhbGxvYygqaW5kZXhfZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKm5iX2luZGV4X2VudHJpZXMgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQVZJbmRleEVudHJ5KSk7CisgICAgaWYgKCFlbnRyaWVzKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAqaW5kZXhfZW50cmllcyA9IGVudHJpZXM7CisKKyAgICBpbmRleCA9IGZmX2luZGV4X3NlYXJjaF90aW1lc3RhbXAoKmluZGV4X2VudHJpZXMsICpuYl9pbmRleF9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIEFWU0VFS19GTEFHX0FOWSk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIGluZGV4ID0gKCpuYl9pbmRleF9lbnRyaWVzKSsrOworICAgICAgICBpZSAgICA9ICZlbnRyaWVzW2luZGV4XTsKKyAgICAgICAgYXZfYXNzZXJ0MChpbmRleCA9PSAwIHx8IGllWy0xXS50aW1lc3RhbXAgPCB0aW1lc3RhbXApOworICAgIH0gZWxzZSB7CisgICAgICAgIGllID0gJmVudHJpZXNbaW5kZXhdOworICAgICAgICBpZiAoaWUtPnRpbWVzdGFtcCAhPSB0aW1lc3RhbXApIHsKKyAgICAgICAgICAgIGlmIChpZS0+dGltZXN0YW1wIDw9IHRpbWVzdGFtcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBtZW1tb3ZlKGVudHJpZXMgKyBpbmRleCArIDEsIGVudHJpZXMgKyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEFWSW5kZXhFbnRyeSkgKiAoKm5iX2luZGV4X2VudHJpZXMgLSBpbmRleCkpOworICAgICAgICAgICAgKCpuYl9pbmRleF9lbnRyaWVzKSsrOworICAgICAgICB9IGVsc2UgaWYgKGllLT5wb3MgPT0gcG9zICYmIGRpc3RhbmNlIDwgaWUtPm1pbl9kaXN0YW5jZSkKKyAgICAgICAgICAgIC8vIGRvIG5vdCByZWR1Y2UgdGhlIGRpc3RhbmNlCisgICAgICAgICAgICBkaXN0YW5jZSA9IGllLT5taW5fZGlzdGFuY2U7CisgICAgfQorCisgICAgaWUtPnBvcyAgICAgICAgICA9IHBvczsKKyAgICBpZS0+dGltZXN0YW1wICAgID0gdGltZXN0YW1wOworICAgIGllLT5taW5fZGlzdGFuY2UgPSBkaXN0YW5jZTsKKyAgICBpZS0+c2l6ZSAgICAgICAgID0gc2l6ZTsKKyAgICBpZS0+ZmxhZ3MgICAgICAgID0gZmxhZ3M7CisKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK2ludCBhdl9hZGRfaW5kZXhfZW50cnkoQVZTdHJlYW0gKnN0LCBpbnQ2NF90IHBvcywgaW50NjRfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgZGlzdGFuY2UsIGludCBmbGFncykKK3sKKyAgICB0aW1lc3RhbXAgPSB3cmFwX3RpbWVzdGFtcChzdCwgdGltZXN0YW1wKTsKKyAgICByZXR1cm4gZmZfYWRkX2luZGV4X2VudHJ5KCZzdC0+aW5kZXhfZW50cmllcywgJnN0LT5uYl9pbmRleF9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0LT5pbmRleF9lbnRyaWVzX2FsbG9jYXRlZF9zaXplLCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHNpemUsIGRpc3RhbmNlLCBmbGFncyk7Cit9CisKK2ludCBmZl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKGNvbnN0IEFWSW5kZXhFbnRyeSAqZW50cmllcywgaW50IG5iX2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHdhbnRlZF90aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBpbnQgYSwgYiwgbTsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsKKworICAgIGEgPSAtMTsKKyAgICBiID0gbmJfZW50cmllczsKKworICAgIC8vIE9wdGltaXplIGFwcGVuZGluZyBpbmRleCBlbnRyaWVzIGF0IHRoZSBlbmQuCisgICAgaWYgKGIgJiYgZW50cmllc1tiIC0gMV0udGltZXN0YW1wIDwgd2FudGVkX3RpbWVzdGFtcCkKKyAgICAgICAgYSA9IGIgLSAxOworCisgICAgd2hpbGUgKGIgLSBhID4gMSkgeworICAgICAgICBtICAgICAgICAgPSAoYSArIGIpID4+IDE7CisgICAgICAgIHRpbWVzdGFtcCA9IGVudHJpZXNbbV0udGltZXN0YW1wOworICAgICAgICBpZiAodGltZXN0YW1wID49IHdhbnRlZF90aW1lc3RhbXApCisgICAgICAgICAgICBiID0gbTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcCA8PSB3YW50ZWRfdGltZXN0YW1wKQorICAgICAgICAgICAgYSA9IG07CisgICAgfQorICAgIG0gPSAoZmxhZ3MgJiBBVlNFRUtfRkxBR19CQUNLV0FSRCkgPyBhIDogYjsKKworICAgIGlmICghKGZsYWdzICYgQVZTRUVLX0ZMQUdfQU5ZKSkKKyAgICAgICAgd2hpbGUgKG0gPj0gMCAmJiBtIDwgbmJfZW50cmllcyAmJgorICAgICAgICAgICAgICAgIShlbnRyaWVzW21dLmZsYWdzICYgQVZJTkRFWF9LRVlGUkFNRSkpCisgICAgICAgICAgICBtICs9IChmbGFncyAmIEFWU0VFS19GTEFHX0JBQ0tXQVJEKSA/IC0xIDogMTsKKworICAgIGlmIChtID09IG5iX2VudHJpZXMpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gbTsKK30KKworaW50IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoQVZTdHJlYW0gKnN0LCBpbnQ2NF90IHdhbnRlZF90aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICByZXR1cm4gZmZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdC0+aW5kZXhfZW50cmllcywgc3QtPm5iX2luZGV4X2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudGVkX3RpbWVzdGFtcCwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50NjRfdCBmZl9yZWFkX3RpbWVzdGFtcChBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgKnBwb3MsIGludDY0X3QgcG9zX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAoKnJlYWRfdGltZXN0YW1wKShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICosIGludCAsIGludDY0X3QgKiwgaW50NjRfdCApKQoreworICAgIGludDY0X3QgdHMgPSByZWFkX3RpbWVzdGFtcChzLCBzdHJlYW1faW5kZXgsIHBwb3MsIHBvc19saW1pdCk7CisgICAgaWYgKHN0cmVhbV9pbmRleCA+PSAwKQorICAgICAgICB0cyA9IHdyYXBfdGltZXN0YW1wKHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XSwgdHMpOworICAgIHJldHVybiB0czsKK30KKworaW50IGZmX3NlZWtfZnJhbWVfYmluYXJ5KEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRhcmdldF90cywgaW50IGZsYWdzKQoreworICAgIEFWSW5wdXRGb3JtYXQgKmF2aWYgPSBzLT5pZm9ybWF0OworICAgIGludDY0X3QgYXZfdW5pbml0KHBvc19taW4pLCBhdl91bmluaXQocG9zX21heCksIHBvcywgcG9zX2xpbWl0OworICAgIGludDY0X3QgdHNfbWluLCB0c19tYXgsIHRzOworICAgIGludCBpbmRleDsKKyAgICBpbnQ2NF90IHJldDsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBpZiAoc3RyZWFtX2luZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYXZfZGxvZyhzLCAicmVhZF9zZWVrOiAlZCAlc1xuIiwgc3RyZWFtX2luZGV4LCBhdl90czJzdHIodGFyZ2V0X3RzKSk7CisKKyAgICB0c19tYXggPQorICAgIHRzX21pbiA9IEFWX05PUFRTX1ZBTFVFOworICAgIHBvc19saW1pdCA9IC0xOyAvLyBHQ0MgZmFsc2VseSBzYXlzIGl0IG1heSBiZSB1bmluaXRpYWxpemVkLgorCisgICAgc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgaWYgKHN0LT5pbmRleF9lbnRyaWVzKSB7CisgICAgICAgIEFWSW5kZXhFbnRyeSAqZTsKKworICAgICAgICAvKiBGSVhNRTogV2hvbGUgZnVuY3Rpb24gbXVzdCBiZSBjaGVja2VkIGZvciBub24ta2V5ZnJhbWUgZW50cmllcyBpbgorICAgICAgICAgKiBpbmRleCBjYXNlLCBlc3BlY2lhbGx5IHJlYWRfdGltZXN0YW1wKCkuICovCisgICAgICAgIGluZGV4ID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdCwgdGFyZ2V0X3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfCBBVlNFRUtfRkxBR19CQUNLV0FSRCk7CisgICAgICAgIGluZGV4ID0gRkZNQVgoaW5kZXgsIDApOworICAgICAgICBlICAgICA9ICZzdC0+aW5kZXhfZW50cmllc1tpbmRleF07CisKKyAgICAgICAgaWYgKGUtPnRpbWVzdGFtcCA8PSB0YXJnZXRfdHMgfHwgZS0+cG9zID09IGUtPm1pbl9kaXN0YW5jZSkgeworICAgICAgICAgICAgcG9zX21pbiA9IGUtPnBvczsKKyAgICAgICAgICAgIHRzX21pbiAgPSBlLT50aW1lc3RhbXA7CisgICAgICAgICAgICBhdl9kbG9nKHMsICJ1c2luZyBjYWNoZWQgcG9zX21pbj0weCUiUFJJeDY0IiBkdHNfbWluPSVzXG4iLAorICAgICAgICAgICAgICAgICAgICBwb3NfbWluLCBhdl90czJzdHIodHNfbWluKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9hc3NlcnQxKGluZGV4ID09IDApOworICAgICAgICB9CisKKyAgICAgICAgaW5kZXggPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHN0LCB0YXJnZXRfdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIH5BVlNFRUtfRkxBR19CQUNLV0FSRCk7CisgICAgICAgIGF2X2Fzc2VydDAoaW5kZXggPCBzdC0+bmJfaW5kZXhfZW50cmllcyk7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBlID0gJnN0LT5pbmRleF9lbnRyaWVzW2luZGV4XTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDEoZS0+dGltZXN0YW1wID49IHRhcmdldF90cyk7CisgICAgICAgICAgICBwb3NfbWF4ICAgPSBlLT5wb3M7CisgICAgICAgICAgICB0c19tYXggICAgPSBlLT50aW1lc3RhbXA7CisgICAgICAgICAgICBwb3NfbGltaXQgPSBwb3NfbWF4IC0gZS0+bWluX2Rpc3RhbmNlOworICAgICAgICAgICAgYXZfZGxvZyhzLCAidXNpbmcgY2FjaGVkIHBvc19tYXg9MHglIlBSSXg2NCIgcG9zX2xpbWl0PTB4JSJQUkl4NjQKKyAgICAgICAgICAgICAgICAgICAgIiBkdHNfbWF4PSVzXG4iLCBwb3NfbWF4LCBwb3NfbGltaXQsIGF2X3RzMnN0cih0c19tYXgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBvcyA9IGZmX2dlbl9zZWFyY2gocywgc3RyZWFtX2luZGV4LCB0YXJnZXRfdHMsIHBvc19taW4sIHBvc19tYXgsIHBvc19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRzX21pbiwgdHNfbWF4LCBmbGFncywgJnRzLCBhdmlmLT5yZWFkX3RpbWVzdGFtcCk7CisgICAgaWYgKHBvcyA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGRvIHRoZSBzZWVrICovCisgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocy0+cGIsIHBvcywgU0VFS19TRVQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZl9yZWFkX2ZyYW1lX2ZsdXNoKHMpOworICAgIGZmX3VwZGF0ZV9jdXJfZHRzKHMsIHN0LCB0cyk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2ZpbmRfbGFzdF90cyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgKnRzLCBpbnQ2NF90ICpwb3MsCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKCpyZWFkX3RpbWVzdGFtcCkoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqLCBpbnQgLCBpbnQ2NF90ICosIGludDY0X3QgKSkKK3sKKyAgICBpbnQ2NF90IHN0ZXAgPSAxMDI0OworICAgIGludDY0X3QgbGltaXQsIHRzX21heDsKKyAgICBpbnQ2NF90IGZpbGVzaXplID0gYXZpb19zaXplKHMtPnBiKTsKKyAgICBpbnQ2NF90IHBvc19tYXggID0gZmlsZXNpemUgLSAxOworICAgIGRvIHsKKyAgICAgICAgbGltaXQgPSBwb3NfbWF4OworICAgICAgICBwb3NfbWF4ID0gRkZNQVgoMCwgKHBvc19tYXgpIC0gc3RlcCk7CisgICAgICAgIHRzX21heCAgPSBmZl9yZWFkX3RpbWVzdGFtcChzLCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zX21heCwgbGltaXQsIHJlYWRfdGltZXN0YW1wKTsKKyAgICAgICAgc3RlcCAgICs9IHN0ZXA7CisgICAgfSB3aGlsZSAodHNfbWF4ID09IEFWX05PUFRTX1ZBTFVFICYmIDIqbGltaXQgPiBzdGVwKTsKKyAgICBpZiAodHNfbWF4ID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludDY0X3QgdG1wX3BvcyA9IHBvc19tYXggKyAxOworICAgICAgICBpbnQ2NF90IHRtcF90cyAgPSBmZl9yZWFkX3RpbWVzdGFtcChzLCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfcG9zLCBJTlQ2NF9NQVgsIHJlYWRfdGltZXN0YW1wKTsKKyAgICAgICAgaWYgKHRtcF90cyA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhdl9hc3NlcnQwKHRtcF9wb3MgPiBwb3NfbWF4KTsKKyAgICAgICAgdHNfbWF4ICA9IHRtcF90czsKKyAgICAgICAgcG9zX21heCA9IHRtcF9wb3M7CisgICAgICAgIGlmICh0bXBfcG9zID49IGZpbGVzaXplKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHRzKQorICAgICAgICAqdHMgPSB0c19tYXg7CisgICAgaWYgKHBvcykKKyAgICAgICAgKnBvcyA9IHBvc19tYXg7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50NjRfdCBmZl9nZW5fc2VhcmNoKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0YXJnZXRfdHMsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NfbWluLCBpbnQ2NF90IHBvc19tYXgsIGludDY0X3QgcG9zX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdHNfbWluLCBpbnQ2NF90IHRzX21heCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIGludDY0X3QgKnRzX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICgqcmVhZF90aW1lc3RhbXApKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqLCBpbnQ2NF90KSkKK3sKKyAgICBpbnQ2NF90IHBvcywgdHM7CisgICAgaW50NjRfdCBzdGFydF9wb3M7CisgICAgaW50IG5vX2NoYW5nZTsKKyAgICBpbnQgcmV0OworCisgICAgYXZfZGxvZyhzLCAiZ2VuX3NlZWs6ICVkICVzXG4iLCBzdHJlYW1faW5kZXgsIGF2X3RzMnN0cih0YXJnZXRfdHMpKTsKKworICAgIGlmICh0c19taW4gPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgcG9zX21pbiA9IHMtPmRhdGFfb2Zmc2V0OworICAgICAgICB0c19taW4gID0gZmZfcmVhZF90aW1lc3RhbXAocywgc3RyZWFtX2luZGV4LCAmcG9zX21pbiwgSU5UNjRfTUFYLCByZWFkX3RpbWVzdGFtcCk7CisgICAgICAgIGlmICh0c19taW4gPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHRzX21pbiA+PSB0YXJnZXRfdHMpIHsKKyAgICAgICAgKnRzX3JldCA9IHRzX21pbjsKKyAgICAgICAgcmV0dXJuIHBvc19taW47CisgICAgfQorCisgICAgaWYgKHRzX21heCA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBpZiAoKHJldCA9IGZmX2ZpbmRfbGFzdF90cyhzLCBzdHJlYW1faW5kZXgsICZ0c19tYXgsICZwb3NfbWF4LCByZWFkX3RpbWVzdGFtcCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHBvc19saW1pdCA9IHBvc19tYXg7CisgICAgfQorCisgICAgaWYgKHRzX21heCA8PSB0YXJnZXRfdHMpIHsKKyAgICAgICAgKnRzX3JldCA9IHRzX21heDsKKyAgICAgICAgcmV0dXJuIHBvc19tYXg7CisgICAgfQorCisgICAgaWYgKHRzX21pbiA+IHRzX21heCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UgaWYgKHRzX21pbiA9PSB0c19tYXgpCisgICAgICAgIHBvc19saW1pdCA9IHBvc19taW47CisKKyAgICBub19jaGFuZ2UgPSAwOworICAgIHdoaWxlIChwb3NfbWluIDwgcG9zX2xpbWl0KSB7CisgICAgICAgIGF2X2Rsb2cocywKKyAgICAgICAgICAgICAgICAicG9zX21pbj0weCUiUFJJeDY0IiBwb3NfbWF4PTB4JSJQUkl4NjQiIGR0c19taW49JXMgZHRzX21heD0lc1xuIiwKKyAgICAgICAgICAgICAgICBwb3NfbWluLCBwb3NfbWF4LCBhdl90czJzdHIodHNfbWluKSwgYXZfdHMyc3RyKHRzX21heCkpOworICAgICAgICBhc3NlcnQocG9zX2xpbWl0IDw9IHBvc19tYXgpOworCisgICAgICAgIGlmIChub19jaGFuZ2UgPT0gMCkgeworICAgICAgICAgICAgaW50NjRfdCBhcHByb3hpbWF0ZV9rZXlmcmFtZV9kaXN0YW5jZSA9IHBvc19tYXggLSBwb3NfbGltaXQ7CisgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZSBwb3NpdGlvbiAoYmV0dGVyIHRoYW4gZGljaG90b215KQorICAgICAgICAgICAgcG9zID0gYXZfcmVzY2FsZSh0YXJnZXRfdHMgLSB0c19taW4sIHBvc19tYXggLSBwb3NfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c19tYXggLSB0c19taW4pICsKKyAgICAgICAgICAgICAgICAgIHBvc19taW4gLSBhcHByb3hpbWF0ZV9rZXlmcmFtZV9kaXN0YW5jZTsKKyAgICAgICAgfSBlbHNlIGlmIChub19jaGFuZ2UgPT0gMSkgeworICAgICAgICAgICAgLy8gYmlzZWN0aW9uIGlmIGludGVycG9sYXRpb24gZGlkIG5vdCBjaGFuZ2UgbWluIC8gbWF4IHBvcyBsYXN0IHRpbWUKKyAgICAgICAgICAgIHBvcyA9IChwb3NfbWluICsgcG9zX2xpbWl0KSA+PiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogbGluZWFyIHNlYXJjaCBpZiBiaXNlY3Rpb24gZmFpbGVkLCBjYW4gb25seSBoYXBwZW4gaWYgdGhlcmUKKyAgICAgICAgICAgICAqIGFyZSB2ZXJ5IGZldyBvciBubyBrZXlmcmFtZXMgYmV0d2VlbiBtaW4vbWF4ICovCisgICAgICAgICAgICBwb3MgPSBwb3NfbWluOworICAgICAgICB9CisgICAgICAgIGlmIChwb3MgPD0gcG9zX21pbikKKyAgICAgICAgICAgIHBvcyA9IHBvc19taW4gKyAxOworICAgICAgICBlbHNlIGlmIChwb3MgPiBwb3NfbGltaXQpCisgICAgICAgICAgICBwb3MgPSBwb3NfbGltaXQ7CisgICAgICAgIHN0YXJ0X3BvcyA9IHBvczsKKworICAgICAgICAvLyBNYXkgcGFzcyBwb3NfbGltaXQgaW5zdGVhZCBvZiAtMS4KKyAgICAgICAgdHMgPSBmZl9yZWFkX3RpbWVzdGFtcChzLCBzdHJlYW1faW5kZXgsICZwb3MsIElOVDY0X01BWCwgcmVhZF90aW1lc3RhbXApOworICAgICAgICBpZiAocG9zID09IHBvc19tYXgpCisgICAgICAgICAgICBub19jaGFuZ2UrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbm9fY2hhbmdlID0gMDsKKyAgICAgICAgYXZfZGxvZyhzLCAiJSJQUklkNjQiICUiUFJJZDY0IiAlIlBSSWQ2NCIgLyAlcyAlcyAlcyIKKyAgICAgICAgICAgICAgICAiIHRhcmdldDolcyBsaW1pdDolIlBSSWQ2NCIgc3RhcnQ6JSJQUklkNjQiIG5vYzolZFxuIiwKKyAgICAgICAgICAgICAgICBwb3NfbWluLCBwb3MsIHBvc19tYXgsCisgICAgICAgICAgICAgICAgYXZfdHMyc3RyKHRzX21pbiksIGF2X3RzMnN0cih0cyksIGF2X3RzMnN0cih0c19tYXgpLCBhdl90czJzdHIodGFyZ2V0X3RzKSwKKyAgICAgICAgICAgICAgICBwb3NfbGltaXQsIHN0YXJ0X3Bvcywgbm9fY2hhbmdlKTsKKyAgICAgICAgaWYgKHRzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicmVhZF90aW1lc3RhbXAoKSBmYWlsZWQgaW4gdGhlIG1pZGRsZVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhcmdldF90cyA8PSB0cykgeworICAgICAgICAgICAgcG9zX2xpbWl0ID0gc3RhcnRfcG9zIC0gMTsKKyAgICAgICAgICAgIHBvc19tYXggICA9IHBvczsKKyAgICAgICAgICAgIHRzX21heCAgICA9IHRzOworICAgICAgICB9CisgICAgICAgIGlmICh0YXJnZXRfdHMgPj0gdHMpIHsKKyAgICAgICAgICAgIHBvc19taW4gPSBwb3M7CisgICAgICAgICAgICB0c19taW4gID0gdHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwb3MgICAgID0gKGZsYWdzICYgQVZTRUVLX0ZMQUdfQkFDS1dBUkQpID8gcG9zX21pbiA6IHBvc19tYXg7CisgICAgdHMgICAgICA9IChmbGFncyAmIEFWU0VFS19GTEFHX0JBQ0tXQVJEKSA/IHRzX21pbiAgOiB0c19tYXg7CisjaWYgMAorICAgIHBvc19taW4gPSBwb3M7CisgICAgdHNfbWluICA9IGZmX3JlYWRfdGltZXN0YW1wKHMsIHN0cmVhbV9pbmRleCwgJnBvc19taW4sIElOVDY0X01BWCwgcmVhZF90aW1lc3RhbXApOworICAgIHBvc19taW4rKzsKKyAgICB0c19tYXggPSBmZl9yZWFkX3RpbWVzdGFtcChzLCBzdHJlYW1faW5kZXgsICZwb3NfbWluLCBJTlQ2NF9NQVgsIHJlYWRfdGltZXN0YW1wKTsKKyAgICBhdl9kbG9nKHMsICJwb3M9MHglIlBSSXg2NCIgJXM8PSVzPD0lc1xuIiwKKyAgICAgICAgICAgIHBvcywgYXZfdHMyc3RyKHRzX21pbiksIGF2X3RzMnN0cih0YXJnZXRfdHMpLCBhdl90czJzdHIodHNfbWF4KSk7CisjZW5kaWYKKyAgICAqdHNfcmV0ID0gdHM7CisgICAgcmV0dXJuIHBvczsKK30KKworc3RhdGljIGludCBzZWVrX2ZyYW1lX2J5dGUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3MsIGludCBmbGFncykKK3sKKyAgICBpbnQ2NF90IHBvc19taW4sIHBvc19tYXg7CisKKyAgICBwb3NfbWluID0gcy0+ZGF0YV9vZmZzZXQ7CisgICAgcG9zX21heCA9IGF2aW9fc2l6ZShzLT5wYikgLSAxOworCisgICAgaWYgKHBvcyA8IHBvc19taW4pCisgICAgICAgIHBvcyA9IHBvc19taW47CisgICAgZWxzZSBpZiAocG9zID4gcG9zX21heCkKKyAgICAgICAgcG9zID0gcG9zX21heDsKKworICAgIGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCk7CisKKyAgICBzLT5pb19yZXBvc2l0aW9uZWQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Vla19mcmFtZV9nZW5lcmljKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGluZGV4OworICAgIGludDY0X3QgcmV0OworICAgIEFWU3RyZWFtICpzdDsKKyAgICBBVkluZGV4RW50cnkgKmllOworCisgICAgc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisKKyAgICBpbmRleCA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QsIHRpbWVzdGFtcCwgZmxhZ3MpOworCisgICAgaWYgKGluZGV4IDwgMCAmJiBzdC0+bmJfaW5kZXhfZW50cmllcyAmJgorICAgICAgICB0aW1lc3RhbXAgPCBzdC0+aW5kZXhfZW50cmllc1swXS50aW1lc3RhbXApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPT0gc3QtPm5iX2luZGV4X2VudHJpZXMgLSAxKSB7CisgICAgICAgIEFWUGFja2V0IHBrdDsKKyAgICAgICAgaW50IG5vbmtleSA9IDA7CisKKyAgICAgICAgaWYgKHN0LT5uYl9pbmRleF9lbnRyaWVzKSB7CisgICAgICAgICAgICBhdl9hc3NlcnQwKHN0LT5pbmRleF9lbnRyaWVzKTsKKyAgICAgICAgICAgIGllID0gJnN0LT5pbmRleF9lbnRyaWVzW3N0LT5uYl9pbmRleF9lbnRyaWVzIC0gMV07CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2aW9fc2VlayhzLT5wYiwgaWUtPnBvcywgU0VFS19TRVQpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGZmX3VwZGF0ZV9jdXJfZHRzKHMsIHN0LCBpZS0+dGltZXN0YW1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZpb19zZWVrKHMtPnBiLCBzLT5kYXRhX29mZnNldCwgU0VFS19TRVQpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBpbnQgcmVhZF9zdGF0dXM7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgcmVhZF9zdGF0dXMgPSBhdl9yZWFkX2ZyYW1lKHMsICZwa3QpOworICAgICAgICAgICAgfSB3aGlsZSAocmVhZF9zdGF0dXMgPT0gQVZFUlJPUihFQUdBSU4pKTsKKyAgICAgICAgICAgIGlmIChyZWFkX3N0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldCgmcGt0KTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1faW5kZXggPT0gcGt0LnN0cmVhbV9pbmRleCAmJiBwa3QuZHRzID4gdGltZXN0YW1wKSB7CisgICAgICAgICAgICAgICAgaWYgKHBrdC5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKG5vbmtleSsrID4gMTAwMCAmJiBzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0NER1JBUEhJQ1MpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwic2Vla19mcmFtZV9nZW5lcmljIGZhaWxlZCBhcyB0aGlzIHN0cmVhbSBzZWVtcyB0byBjb250YWluIG5vIGtleWZyYW1lcyBhZnRlciB0aGUgdGFyZ2V0IHRpbWVzdGFtcCwgJWQgbm9uIGtleWZyYW1lcyBmb3VuZFxuIiwgbm9ua2V5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluZGV4ID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdCwgdGltZXN0YW1wLCBmbGFncyk7CisgICAgfQorICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZmX3JlYWRfZnJhbWVfZmx1c2gocyk7CisgICAgaWYgKHMtPmlmb3JtYXQtPnJlYWRfc2VlaykKKyAgICAgICAgaWYgKHMtPmlmb3JtYXQtPnJlYWRfc2VlayhzLCBzdHJlYW1faW5kZXgsIHRpbWVzdGFtcCwgZmxhZ3MpID49IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZSA9ICZzdC0+aW5kZXhfZW50cmllc1tpbmRleF07CisgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocy0+cGIsIGllLT5wb3MsIFNFRUtfU0VUKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGZmX3VwZGF0ZV9jdXJfZHRzKHMsIHN0LCBpZS0+dGltZXN0YW1wKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlZWtfZnJhbWVfaW50ZXJuYWwoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IHJldDsKKyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBpZiAoZmxhZ3MgJiBBVlNFRUtfRkxBR19CWVRFKSB7CisgICAgICAgIGlmIChzLT5pZm9ybWF0LT5mbGFncyAmIEFWRk1UX05PX0JZVEVfU0VFSykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZmZfcmVhZF9mcmFtZV9mbHVzaChzKTsKKyAgICAgICAgcmV0dXJuIHNlZWtfZnJhbWVfYnl0ZShzLCBzdHJlYW1faW5kZXgsIHRpbWVzdGFtcCwgZmxhZ3MpOworICAgIH0KKworICAgIGlmIChzdHJlYW1faW5kZXggPCAwKSB7CisgICAgICAgIHN0cmVhbV9pbmRleCA9IGF2X2ZpbmRfZGVmYXVsdF9zdHJlYW1faW5kZXgocyk7CisgICAgICAgIGlmIChzdHJlYW1faW5kZXggPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgICAgICAvKiB0aW1lc3RhbXAgZm9yIGRlZmF1bHQgbXVzdCBiZSBleHByZXNzZWQgaW4gQVZfVElNRV9CQVNFIHVuaXRzICovCisgICAgICAgIHRpbWVzdGFtcCA9IGF2X3Jlc2NhbGUodGltZXN0YW1wLCBzdC0+dGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0UgKiAoaW50NjRfdCkgc3QtPnRpbWVfYmFzZS5udW0pOworICAgIH0KKworICAgIC8qIGZpcnN0LCB3ZSB0cnkgdGhlIGZvcm1hdCBzcGVjaWZpYyBzZWVrICovCisgICAgaWYgKHMtPmlmb3JtYXQtPnJlYWRfc2VlaykgeworICAgICAgICBmZl9yZWFkX2ZyYW1lX2ZsdXNoKHMpOworICAgICAgICByZXQgPSBzLT5pZm9ybWF0LT5yZWFkX3NlZWsocywgc3RyZWFtX2luZGV4LCB0aW1lc3RhbXAsIGZsYWdzKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0ID0gLTE7CisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzLT5pZm9ybWF0LT5yZWFkX3RpbWVzdGFtcCAmJgorICAgICAgICAhKHMtPmlmb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9CSU5TRUFSQ0gpKSB7CisgICAgICAgIGZmX3JlYWRfZnJhbWVfZmx1c2gocyk7CisgICAgICAgIHJldHVybiBmZl9zZWVrX2ZyYW1lX2JpbmFyeShzLCBzdHJlYW1faW5kZXgsIHRpbWVzdGFtcCwgZmxhZ3MpOworICAgIH0gZWxzZSBpZiAoIShzLT5pZm9ybWF0LT5mbGFncyAmIEFWRk1UX05PR0VOU0VBUkNIKSkgeworICAgICAgICBmZl9yZWFkX2ZyYW1lX2ZsdXNoKHMpOworICAgICAgICByZXR1cm4gc2Vla19mcmFtZV9nZW5lcmljKHMsIHN0cmVhbV9pbmRleCwgdGltZXN0YW1wLCBmbGFncyk7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworaW50IGF2X3NlZWtfZnJhbWUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHMtPmlmb3JtYXQtPnJlYWRfc2VlazIgJiYgIXMtPmlmb3JtYXQtPnJlYWRfc2VlaykgeworICAgICAgICBpbnQ2NF90IG1pbl90cyA9IElOVDY0X01JTiwgbWF4X3RzID0gSU5UNjRfTUFYOworICAgICAgICBpZiAoKGZsYWdzICYgQVZTRUVLX0ZMQUdfQkFDS1dBUkQpKQorICAgICAgICAgICAgbWF4X3RzID0gdGltZXN0YW1wOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtaW5fdHMgPSB0aW1lc3RhbXA7CisgICAgICAgIHJldHVybiBhdmZvcm1hdF9zZWVrX2ZpbGUocywgc3RyZWFtX2luZGV4LCBtaW5fdHMsIHRpbWVzdGFtcCwgbWF4X3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgfkFWU0VFS19GTEFHX0JBQ0tXQVJEKTsKKyAgICB9CisKKyAgICByZXQgPSBzZWVrX2ZyYW1lX2ludGVybmFsKHMsIHN0cmVhbV9pbmRleCwgdGltZXN0YW1wLCBmbGFncyk7CisKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIHJldCA9IGF2Zm9ybWF0X3F1ZXVlX2F0dGFjaGVkX3BpY3R1cmVzKHMpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2Zm9ybWF0X3NlZWtfZmlsZShBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgbWluX3RzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRzLCBpbnQ2NF90IG1heF90cywgaW50IGZsYWdzKQoreworICAgIGlmIChtaW5fdHMgPiB0cyB8fCBtYXhfdHMgPCB0cykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChzdHJlYW1faW5kZXggPCAtMSB8fCBzdHJlYW1faW5kZXggPj0gKGludClzLT5uYl9zdHJlYW1zKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKHMtPnNlZWsyYW55PjApCisgICAgICAgIGZsYWdzIHw9IEFWU0VFS19GTEFHX0FOWTsKKyAgICBmbGFncyAmPSB+QVZTRUVLX0ZMQUdfQkFDS1dBUkQ7CisKKyAgICBpZiAocy0+aWZvcm1hdC0+cmVhZF9zZWVrMikgeworICAgICAgICBpbnQgcmV0OworICAgICAgICBmZl9yZWFkX2ZyYW1lX2ZsdXNoKHMpOworCisgICAgICAgIGlmIChzdHJlYW1faW5kZXggPT0gLTEgJiYgcy0+bmJfc3RyZWFtcyA9PSAxKSB7CisgICAgICAgICAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZSA9IHMtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZTsKKyAgICAgICAgICAgIHRzID0gYXZfcmVzY2FsZV9xKHRzLCBBVl9USU1FX0JBU0VfUSwgdGltZV9iYXNlKTsKKyAgICAgICAgICAgIG1pbl90cyA9IGF2X3Jlc2NhbGVfcm5kKG1pbl90cywgdGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfYmFzZS5udW0gKiAoaW50NjRfdClBVl9USU1FX0JBU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ST1VORF9VUCAgIHwgQVZfUk9VTkRfUEFTU19NSU5NQVgpOworICAgICAgICAgICAgbWF4X3RzID0gYXZfcmVzY2FsZV9ybmQobWF4X3RzLCB0aW1lX2Jhc2UuZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9iYXNlLm51bSAqIChpbnQ2NF90KUFWX1RJTUVfQkFTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1JPVU5EX0RPV04gfCBBVl9ST1VORF9QQVNTX01JTk1BWCk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBzLT5pZm9ybWF0LT5yZWFkX3NlZWsyKHMsIHN0cmVhbV9pbmRleCwgbWluX3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLCBtYXhfdHMsIGZsYWdzKTsKKworICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICByZXQgPSBhdmZvcm1hdF9xdWV1ZV9hdHRhY2hlZF9waWN0dXJlcyhzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAocy0+aWZvcm1hdC0+cmVhZF90aW1lc3RhbXApIHsKKyAgICAgICAgLy8gdHJ5IHRvIHNlZWsgdmlhIHJlYWRfdGltZXN0YW1wKCkKKyAgICB9CisKKyAgICAvLyBGYWxsIGJhY2sgb24gb2xkIEFQSSBpZiBuZXcgaXMgbm90IGltcGxlbWVudGVkIGJ1dCBvbGQgaXMuCisgICAgLy8gTm90ZSB0aGUgb2xkIEFQSSBoYXMgc29tZXdoYXQgZGlmZmVyZW50IHNlbWFudGljcy4KKyAgICBpZiAocy0+aWZvcm1hdC0+cmVhZF9zZWVrIHx8IDEpIHsKKyAgICAgICAgaW50IGRpciA9ICh0cyAtICh1aW50NjRfdCltaW5fdHMgPiAodWludDY0X3QpbWF4X3RzIC0gdHMgPyBBVlNFRUtfRkxBR19CQUNLV0FSRCA6IDApOworICAgICAgICBpbnQgcmV0ID0gYXZfc2Vla19mcmFtZShzLCBzdHJlYW1faW5kZXgsIHRzLCBmbGFncyB8IGRpcik7CisgICAgICAgIGlmIChyZXQ8MCAmJiB0cyAhPSBtaW5fdHMgJiYgbWF4X3RzICE9IHRzKSB7CisgICAgICAgICAgICByZXQgPSBhdl9zZWVrX2ZyYW1lKHMsIHN0cmVhbV9pbmRleCwgZGlyID8gbWF4X3RzIDogbWluX3RzLCBmbGFncyB8IGRpcik7CisgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgcmV0ID0gYXZfc2Vla19mcmFtZShzLCBzdHJlYW1faW5kZXgsIHRzLCBmbGFncyB8IChkaXJeQVZTRUVLX0ZMQUdfQkFDS1dBUkQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIHRyeSBzb21lIGdlbmVyaWMgc2VlayBsaWtlIHNlZWtfZnJhbWVfZ2VuZXJpYygpIGJ1dCB3aXRoIG5ldyB0cyBzZW1hbnRpY3MKKyAgICByZXR1cm4gLTE7IC8vdW5yZWFjaGFibGUKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIHN0cmVhbSBoYXMgYWNjdXJhdGUgZHVyYXRpb24gaW4gYW55IHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIHN0cmVhbSBoYXMgYWNjdXJhdGUgZHVyYXRpb24gZm9yIGF0IGxlYXN0IG9uZSBjb21wb25lbnQuCisgKi8KK3N0YXRpYyBpbnQgaGFzX2R1cmF0aW9uKEFWRm9ybWF0Q29udGV4dCAqaWMpCit7CisgICAgaW50IGk7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgc3QgPSBpYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKHN0LT5kdXJhdGlvbiAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoaWMtPmR1cmF0aW9uICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBFc3RpbWF0ZSB0aGUgc3RyZWFtIHRpbWluZ3MgZnJvbSB0aGUgb25lIG9mIGVhY2ggY29tcG9uZW50cy4KKyAqCisgKiBBbHNvIGNvbXB1dGVzIHRoZSBnbG9iYWwgYml0cmF0ZSBpZiBwb3NzaWJsZS4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3N0cmVhbV90aW1pbmdzKEFWRm9ybWF0Q29udGV4dCAqaWMpCit7CisgICAgaW50NjRfdCBzdGFydF90aW1lLCBzdGFydF90aW1lMSwgc3RhcnRfdGltZV90ZXh0LCBlbmRfdGltZSwgZW5kX3RpbWUxOworICAgIGludDY0X3QgZHVyYXRpb24sIGR1cmF0aW9uMSwgZmlsZXNpemU7CisgICAgaW50IGk7CisgICAgQVZTdHJlYW0gKnN0OworICAgIEFWUHJvZ3JhbSAqcDsKKworICAgIHN0YXJ0X3RpbWUgPSBJTlQ2NF9NQVg7CisgICAgc3RhcnRfdGltZV90ZXh0ID0gSU5UNjRfTUFYOworICAgIGVuZF90aW1lICAgPSBJTlQ2NF9NSU47CisgICAgZHVyYXRpb24gICA9IElOVDY0X01JTjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzdCA9IGljLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoc3QtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUgJiYgc3QtPnRpbWVfYmFzZS5kZW4pIHsKKyAgICAgICAgICAgIHN0YXJ0X3RpbWUxID0gYXZfcmVzY2FsZV9xKHN0LT5zdGFydF90aW1lLCBzdC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EpOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUgfHwgc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9EQVRBKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0X3RpbWUxIDwgc3RhcnRfdGltZV90ZXh0KQorICAgICAgICAgICAgICAgICAgICBzdGFydF90aW1lX3RleHQgPSBzdGFydF90aW1lMTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHN0YXJ0X3RpbWUgPSBGRk1JTihzdGFydF90aW1lLCBzdGFydF90aW1lMSk7CisgICAgICAgICAgICBlbmRfdGltZTEgICA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgaWYgKHN0LT5kdXJhdGlvbiAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgICAgIGVuZF90aW1lMSA9IHN0YXJ0X3RpbWUxICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3Eoc3QtPmR1cmF0aW9uLCBzdC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgICAgICAgICAgZW5kX3RpbWUgPSBGRk1BWChlbmRfdGltZSwgZW5kX3RpbWUxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAocCA9IE5VTEw7IChwID0gYXZfZmluZF9wcm9ncmFtX2Zyb21fc3RyZWFtKGljLCBwLCBpKSk7ICkgeworICAgICAgICAgICAgICAgIGlmIChwLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFIHx8IHAtPnN0YXJ0X3RpbWUgPiBzdGFydF90aW1lMSkKKyAgICAgICAgICAgICAgICAgICAgcC0+c3RhcnRfdGltZSA9IHN0YXJ0X3RpbWUxOworICAgICAgICAgICAgICAgIGlmIChwLT5lbmRfdGltZSA8IGVuZF90aW1lMSkKKyAgICAgICAgICAgICAgICAgICAgcC0+ZW5kX3RpbWUgPSBlbmRfdGltZTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0LT5kdXJhdGlvbiAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgZHVyYXRpb24xID0gYXZfcmVzY2FsZV9xKHN0LT5kdXJhdGlvbiwgc3QtPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgICAgICBkdXJhdGlvbiAgPSBGRk1BWChkdXJhdGlvbiwgZHVyYXRpb24xKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhcnRfdGltZSA9PSBJTlQ2NF9NQVggfHwgKHN0YXJ0X3RpbWUgPiBzdGFydF90aW1lX3RleHQgJiYgc3RhcnRfdGltZSAtIHN0YXJ0X3RpbWVfdGV4dCA8IEFWX1RJTUVfQkFTRSkpCisgICAgICAgIHN0YXJ0X3RpbWUgPSBzdGFydF90aW1lX3RleHQ7CisgICAgZWxzZSBpZiAoc3RhcnRfdGltZSA+IHN0YXJ0X3RpbWVfdGV4dCkKKyAgICAgICAgYXZfbG9nKGljLCBBVl9MT0dfVkVSQk9TRSwgIklnbm9yaW5nIG91dGxpZXIgbm9uIHByaW1hcnkgc3RyZWFtIHN0YXJ0dGltZSAlZlxuIiwgc3RhcnRfdGltZV90ZXh0IC8gKGZsb2F0KUFWX1RJTUVfQkFTRSk7CisKKyAgICBpZiAoc3RhcnRfdGltZSAhPSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgaWMtPnN0YXJ0X3RpbWUgPSBzdGFydF90aW1lOworICAgICAgICBpZiAoZW5kX3RpbWUgIT0gSU5UNjRfTUlOKSB7CisgICAgICAgICAgICBpZiAoaWMtPm5iX3Byb2dyYW1zKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9wcm9ncmFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHAgPSBpYy0+cHJvZ3JhbXNbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChwLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFICYmIHAtPmVuZF90aW1lID4gcC0+c3RhcnRfdGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gRkZNQVgoZHVyYXRpb24sIHAtPmVuZF90aW1lIC0gcC0+c3RhcnRfdGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBGRk1BWChkdXJhdGlvbiwgZW5kX3RpbWUgLSBzdGFydF90aW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZHVyYXRpb24gIT0gSU5UNjRfTUlOICYmIGR1cmF0aW9uID4gMCAmJiBpYy0+ZHVyYXRpb24gPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaWMtPmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgfQorICAgIGlmIChpYy0+cGIgJiYgKGZpbGVzaXplID0gYXZpb19zaXplKGljLT5wYikpID4gMCAmJiBpYy0+ZHVyYXRpb24gIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgYml0cmF0ZSAqLworICAgICAgICBkb3VibGUgYml0cmF0ZSA9IChkb3VibGUpIGZpbGVzaXplICogOC4wICogQVZfVElNRV9CQVNFIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBpYy0+ZHVyYXRpb247CisgICAgICAgIGlmIChiaXRyYXRlID49IDAgJiYgYml0cmF0ZSA8PSBJTlRfTUFYKQorICAgICAgICAgICAgaWMtPmJpdF9yYXRlID0gYml0cmF0ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfYWxsX3N0cmVhbV90aW1pbmdzKEFWRm9ybWF0Q29udGV4dCAqaWMpCit7CisgICAgaW50IGk7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgdXBkYXRlX3N0cmVhbV90aW1pbmdzKGljKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzdCA9IGljLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoc3QtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIGlmIChpYy0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgICAgICBzdC0+c3RhcnRfdGltZSA9IGF2X3Jlc2NhbGVfcShpYy0+c3RhcnRfdGltZSwgQVZfVElNRV9CQVNFX1EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSk7CisgICAgICAgICAgICBpZiAoaWMtPmR1cmF0aW9uICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShpYy0+ZHVyYXRpb24sIEFWX1RJTUVfQkFTRV9RLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZXN0aW1hdGVfdGltaW5nc19mcm9tX2JpdF9yYXRlKEFWRm9ybWF0Q29udGV4dCAqaWMpCit7CisgICAgaW50NjRfdCBmaWxlc2l6ZSwgZHVyYXRpb247CisgICAgaW50IGksIHNob3dfd2FybmluZyA9IDA7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgLyogaWYgYml0X3JhdGUgaXMgYWxyZWFkeSBzZXQsIHdlIGJlbGlldmUgaXQgKi8KKyAgICBpZiAoaWMtPmJpdF9yYXRlIDw9IDApIHsKKyAgICAgICAgaW50IGJpdF9yYXRlID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIHN0ID0gaWMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5iaXRfcmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoSU5UX01BWCAtIHN0LT5jb2RlYy0+Yml0X3JhdGUgPCBiaXRfcmF0ZSkgeworICAgICAgICAgICAgICAgICAgICBiaXRfcmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiaXRfcmF0ZSArPSBzdC0+Y29kZWMtPmJpdF9yYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGljLT5iaXRfcmF0ZSA9IGJpdF9yYXRlOworICAgIH0KKworICAgIC8qIGlmIGR1cmF0aW9uIGlzIGFscmVhZHkgc2V0LCB3ZSBiZWxpZXZlIGl0ICovCisgICAgaWYgKGljLT5kdXJhdGlvbiA9PSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICBpYy0+Yml0X3JhdGUgIT0gMCkgeworICAgICAgICBmaWxlc2l6ZSA9IGljLT5wYiA/IGF2aW9fc2l6ZShpYy0+cGIpIDogMDsKKyAgICAgICAgaWYgKGZpbGVzaXplID4gaWMtPmRhdGFfb2Zmc2V0KSB7CisgICAgICAgICAgICBmaWxlc2l6ZSAtPSBpYy0+ZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgIHN0ICAgICAgPSBpYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoICAgc3QtPnRpbWVfYmFzZS5udW0gPD0gSU5UNjRfTUFYIC8gaWMtPmJpdF9yYXRlCisgICAgICAgICAgICAgICAgICAgICYmIHN0LT5kdXJhdGlvbiA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGF2X3Jlc2NhbGUoOCAqIGZpbGVzaXplLCBzdC0+dGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljLT5iaXRfcmF0ZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkgc3QtPnRpbWVfYmFzZS5udW0pOworICAgICAgICAgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgc2hvd193YXJuaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNob3dfd2FybmluZykKKyAgICAgICAgYXZfbG9nKGljLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJFc3RpbWF0aW5nIGR1cmF0aW9uIGZyb20gYml0cmF0ZSwgdGhpcyBtYXkgYmUgaW5hY2N1cmF0ZVxuIik7Cit9CisKKyNkZWZpbmUgRFVSQVRJT05fTUFYX1JFQURfU0laRSAyNTAwMDBMTAorI2RlZmluZSBEVVJBVElPTl9NQVhfUkVUUlkgNAorCisvKiBvbmx5IHVzYWJsZSBmb3IgTVBFRy1QUyBzdHJlYW1zICovCitzdGF0aWMgdm9pZCBlc3RpbWF0ZV90aW1pbmdzX2Zyb21fcHRzKEFWRm9ybWF0Q29udGV4dCAqaWMsIGludDY0X3Qgb2xkX29mZnNldCkKK3sKKyAgICBBVlBhY2tldCBwa3QxLCAqcGt0ID0gJnBrdDE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCBudW0sIGRlbiwgcmVhZF9zaXplLCBpLCByZXQ7CisgICAgaW50IGZvdW5kX2R1cmF0aW9uID0gMDsKKyAgICBpbnQgaXNfZW5kOworICAgIGludDY0X3QgZmlsZXNpemUsIG9mZnNldCwgZHVyYXRpb247CisgICAgaW50IHJldHJ5ID0gMDsKKworICAgIC8qIGZsdXNoIHBhY2tldCBxdWV1ZSAqLworICAgIGZsdXNoX3BhY2tldF9xdWV1ZShpYyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzdCA9IGljLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoc3QtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgICAgIHN0LT5maXJzdF9kdHMgPT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVU5LTk9XTikKKyAgICAgICAgICAgIGF2X2xvZyhzdC0+Y29kZWMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJzdGFydCB0aW1lIGZvciBzdHJlYW0gJWQgaXMgbm90IHNldCBpbiBlc3RpbWF0ZV90aW1pbmdzX2Zyb21fcHRzXG4iLCBpKTsKKworICAgICAgICBpZiAoc3QtPnBhcnNlcikgeworICAgICAgICAgICAgYXZfcGFyc2VyX2Nsb3NlKHN0LT5wYXJzZXIpOworICAgICAgICAgICAgc3QtPnBhcnNlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9vcHRfc2V0KGljLCAic2tpcF9jaGFuZ2VzIiwgIjEiLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKTsKKyAgICAvKiBlc3RpbWF0ZSB0aGUgZW5kIHRpbWUgKGR1cmF0aW9uKSAqLworICAgIC8qIFhYWDogbWF5IG5lZWQgdG8gc3VwcG9ydCB3cmFwcGluZyAqLworICAgIGZpbGVzaXplID0gaWMtPnBiID8gYXZpb19zaXplKGljLT5wYikgOiAwOworICAgIGRvIHsKKyAgICAgICAgaXNfZW5kID0gZm91bmRfZHVyYXRpb247CisgICAgICAgIG9mZnNldCA9IGZpbGVzaXplIC0gKERVUkFUSU9OX01BWF9SRUFEX1NJWkUgPDwgcmV0cnkpOworICAgICAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisKKyAgICAgICAgYXZpb19zZWVrKGljLT5wYiwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIHJlYWRfc2l6ZSA9IDA7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGlmIChyZWFkX3NpemUgPj0gRFVSQVRJT05fTUFYX1JFQURfU0laRSA8PCAoRkZNQVgocmV0cnkgLSAxLCAwKSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZXQgPSBmZl9yZWFkX3BhY2tldChpYywgcGt0KTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpOworICAgICAgICAgICAgaWYgKHJldCAhPSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmVhZF9zaXplICs9IHBrdC0+c2l6ZTsKKyAgICAgICAgICAgIHN0ICAgICAgICAgPSBpYy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgICAgICAgICBpZiAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgICAgICAgICAoc3QtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUgfHwKKyAgICAgICAgICAgICAgICAgc3QtPmZpcnN0X2R0cyAgIT0gQVZfTk9QVFNfVkFMVUUpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBrdC0+ZHVyYXRpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmZl9jb21wdXRlX2ZyYW1lX2R1cmF0aW9uKGljLCAmbnVtLCAmZGVuLCBzdCwgc3QtPnBhcnNlciwgcGt0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbiAmJiBudW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+ZHVyYXRpb24gPSBhdl9yZXNjYWxlX3JuZCgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSAqIChpbnQ2NF90KSBzdC0+dGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW4gKiAoaW50NjRfdCkgc3QtPnRpbWVfYmFzZS5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUk9VTkRfRE9XTik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBwa3QtPnB0cyArIHBrdC0+ZHVyYXRpb247CisgICAgICAgICAgICAgICAgZm91bmRfZHVyYXRpb24gPSAxOworICAgICAgICAgICAgICAgIGlmIChzdC0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gLT0gc3QtPnN0YXJ0X3RpbWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiAtPSBzdC0+Zmlyc3RfZHRzOworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5kdXJhdGlvbiA9PSBBVl9OT1BUU19WQUxVRSB8fCBzdC0+aW5mby0+bGFzdF9kdXJhdGlvbjw9IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzdC0+ZHVyYXRpb24gPCBkdXJhdGlvbiAmJiBGRkFCUyhkdXJhdGlvbiAtIHN0LT5pbmZvLT5sYXN0X2R1cmF0aW9uKSA8IDYwTEwqc3QtPnRpbWVfYmFzZS5kZW4gLyBzdC0+dGltZV9iYXNlLm51bSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmluZm8tPmxhc3RfZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgaWYgYWxsIGF1ZGlvL3ZpZGVvIHN0cmVhbXMgaGF2ZSB2YWxpZCBkdXJhdGlvbiAqLworICAgICAgICBpZiAoIWlzX2VuZCkgeworICAgICAgICAgICAgaXNfZW5kID0gMTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpYy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3QgPSBpYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmR1cmF0aW9uID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2VuZCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoIWlzX2VuZCAmJgorICAgICAgICAgICAgIG9mZnNldCAmJgorICAgICAgICAgICAgICsrcmV0cnkgPD0gRFVSQVRJT05fTUFYX1JFVFJZKTsKKworICAgIGF2X29wdF9zZXQoaWMsICJza2lwX2NoYW5nZXMiLCAiMCIsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pOworCisgICAgLyogd2FybiBhYm91dCBhdWRpby92aWRlbyBzdHJlYW1zIHdoaWNoIGR1cmF0aW9uIGNvdWxkIG5vdCBiZSBlc3RpbWF0ZWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzdCA9IGljLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoc3QtPmR1cmF0aW9uID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgICAgICAgICBpZiAoc3QtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUgfHwgc3QtPmZpcnN0X2R0cyAgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGljLCBBVl9MT0dfREVCVUcsICJzdHJlYW0gJWQgOiBubyBQVFMgZm91bmQgYXQgZW5kIG9mIGZpbGUsIGR1cmF0aW9uIG5vdCBzZXRcbiIsIGkpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19ERUJVRywgInN0cmVhbSAlZCA6IG5vIFRTIGZvdW5kIGF0IHN0YXJ0IG9mIGZpbGUsIGR1cmF0aW9uIG5vdCBzZXRcbiIsIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZpbGxfYWxsX3N0cmVhbV90aW1pbmdzKGljKTsKKworICAgIGF2aW9fc2VlayhpYy0+cGIsIG9sZF9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpbnQgajsKKworICAgICAgICBzdCAgICAgICAgICAgICAgPSBpYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgc3QtPmN1cl9kdHMgICAgID0gc3QtPmZpcnN0X2R0czsKKyAgICAgICAgc3QtPmxhc3RfSVBfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHN0LT5sYXN0X2R0c19mb3Jfb3JkZXJfY2hlY2sgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IE1BWF9SRU9SREVSX0RFTEFZICsgMTsgaisrKQorICAgICAgICAgICAgc3QtPnB0c19idWZmZXJbal0gPSBBVl9OT1BUU19WQUxVRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVzdGltYXRlX3RpbWluZ3MoQVZGb3JtYXRDb250ZXh0ICppYywgaW50NjRfdCBvbGRfb2Zmc2V0KQoreworICAgIGludDY0X3QgZmlsZV9zaXplOworCisgICAgLyogZ2V0IHRoZSBmaWxlIHNpemUsIGlmIHBvc3NpYmxlICovCisgICAgaWYgKGljLT5pZm9ybWF0LT5mbGFncyAmIEFWRk1UX05PRklMRSkgeworICAgICAgICBmaWxlX3NpemUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGVfc2l6ZSA9IGF2aW9fc2l6ZShpYy0+cGIpOworICAgICAgICBmaWxlX3NpemUgPSBGRk1BWCgwLCBmaWxlX3NpemUpOworICAgIH0KKworICAgIGlmICgoIXN0cmNtcChpYy0+aWZvcm1hdC0+bmFtZSwgIm1wZWciKSB8fAorICAgICAgICAgIXN0cmNtcChpYy0+aWZvcm1hdC0+bmFtZSwgIm1wZWd0cyIpKSAmJgorICAgICAgICBmaWxlX3NpemUgJiYgaWMtPnBiLT5zZWVrYWJsZSkgeworICAgICAgICAvKiBnZXQgYWNjdXJhdGUgZXN0aW1hdGUgZnJvbSB0aGUgUFRTZXMgKi8KKyAgICAgICAgZXN0aW1hdGVfdGltaW5nc19mcm9tX3B0cyhpYywgb2xkX29mZnNldCk7CisgICAgICAgIGljLT5kdXJhdGlvbl9lc3RpbWF0aW9uX21ldGhvZCA9IEFWRk1UX0RVUkFUSU9OX0ZST01fUFRTOworICAgIH0gZWxzZSBpZiAoaGFzX2R1cmF0aW9uKGljKSkgeworICAgICAgICAvKiBhdCBsZWFzdCBvbmUgY29tcG9uZW50IGhhcyB0aW1pbmdzIC0gd2UgdXNlIHRoZW0gZm9yIGFsbAorICAgICAgICAgKiB0aGUgY29tcG9uZW50cyAqLworICAgICAgICBmaWxsX2FsbF9zdHJlYW1fdGltaW5ncyhpYyk7CisgICAgICAgIGljLT5kdXJhdGlvbl9lc3RpbWF0aW9uX21ldGhvZCA9IEFWRk1UX0RVUkFUSU9OX0ZST01fU1RSRUFNOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGxlc3MgcHJlY2lzZTogdXNlIGJpdHJhdGUgaW5mbyAqLworICAgICAgICBlc3RpbWF0ZV90aW1pbmdzX2Zyb21fYml0X3JhdGUoaWMpOworICAgICAgICBpYy0+ZHVyYXRpb25fZXN0aW1hdGlvbl9tZXRob2QgPSBBVkZNVF9EVVJBVElPTl9GUk9NX0JJVFJBVEU7CisgICAgfQorICAgIHVwZGF0ZV9zdHJlYW1fdGltaW5ncyhpYyk7CisKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBBVlN0cmVhbSBhdl91bnVzZWQgKnN0OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgc3QgPSBpYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGF2X2Rsb2coaWMsICIlZDogc3RhcnRfdGltZTogJTAuM2YgZHVyYXRpb246ICUwLjNmXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBzdC0+c3RhcnRfdGltZSAvIEFWX1RJTUVfQkFTRSwKKyAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgc3QtPmR1cmF0aW9uICAgLyBBVl9USU1FX0JBU0UpOworICAgICAgICB9CisgICAgICAgIGF2X2Rsb2coaWMsCisgICAgICAgICAgICAgICAgInN0cmVhbTogc3RhcnRfdGltZTogJTAuM2YgZHVyYXRpb246ICUwLjNmIGJpdHJhdGU9JWQga2Ivc1xuIiwKKyAgICAgICAgICAgICAgICAoZG91YmxlKSBpYy0+c3RhcnRfdGltZSAvIEFWX1RJTUVfQkFTRSwKKyAgICAgICAgICAgICAgICAoZG91YmxlKSBpYy0+ZHVyYXRpb24gICAvIEFWX1RJTUVfQkFTRSwKKyAgICAgICAgICAgICAgICBpYy0+Yml0X3JhdGUgLyAxMDAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaGFzX2NvZGVjX3BhcmFtZXRlcnMoQVZTdHJlYW0gKnN0LCBjb25zdCBjaGFyICoqZXJybXNnX3B0cikKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzdC0+Y29kZWM7CisKKyNkZWZpbmUgRkFJTChlcnJtc2cpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGVycm1zZ19wdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICplcnJtc2dfcHRyID0gZXJybXNnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgaWYgKCAgIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FCisgICAgICAgICYmIGF2Y3R4LT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9EQVRBKQorICAgICAgICBGQUlMKCJ1bmtub3duIGNvZGVjIik7CisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfdHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBpZiAoIWF2Y3R4LT5mcmFtZV9zaXplICYmIGRldGVybWluYWJsZV9mcmFtZV9zaXplKGF2Y3R4KSkKKyAgICAgICAgICAgIEZBSUwoInVuc3BlY2lmaWVkIGZyYW1lIHNpemUiKTsKKyAgICAgICAgaWYgKHN0LT5pbmZvLT5mb3VuZF9kZWNvZGVyID49IDAgJiYKKyAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfTk9ORSkKKyAgICAgICAgICAgIEZBSUwoInVuc3BlY2lmaWVkIHNhbXBsZSBmb3JtYXQiKTsKKyAgICAgICAgaWYgKCFhdmN0eC0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgICBGQUlMKCJ1bnNwZWNpZmllZCBzYW1wbGUgcmF0ZSIpOworICAgICAgICBpZiAoIWF2Y3R4LT5jaGFubmVscykKKyAgICAgICAgICAgIEZBSUwoInVuc3BlY2lmaWVkIG51bWJlciBvZiBjaGFubmVscyIpOworICAgICAgICBpZiAoc3QtPmluZm8tPmZvdW5kX2RlY29kZXIgPj0gMCAmJiAhc3QtPm5iX2RlY29kZWRfZnJhbWVzICYmIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVFMpCisgICAgICAgICAgICBGQUlMKCJubyBkZWNvZGFibGUgRFRTIGZyYW1lcyIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgaWYgKCFhdmN0eC0+d2lkdGgpCisgICAgICAgICAgICBGQUlMKCJ1bnNwZWNpZmllZCBzaXplIik7CisgICAgICAgIGlmIChzdC0+aW5mby0+Zm91bmRfZGVjb2RlciA+PSAwICYmIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgICAgIEZBSUwoInVuc3BlY2lmaWVkIHBpeGVsIGZvcm1hdCIpOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjMwIHx8IHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlY0MCkKKyAgICAgICAgICAgIGlmICghc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICYmICFzdC0+Y29kZWMtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICYmICFzdC0+Y29kZWNfaW5mb19uYl9mcmFtZXMpCisgICAgICAgICAgICAgICAgRkFJTCgibm8gZnJhbWUgaW4gcnYzMC80MCBhbmQgbm8gc2FyIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgorICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0hETVZfUEdTX1NVQlRJVExFICYmICFhdmN0eC0+d2lkdGgpCisgICAgICAgICAgICBGQUlMKCJ1bnNwZWNpZmllZCBzaXplIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0RBVEE6CisgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKy8qIHJldHVybnMgMSBvciAwIGlmIG9yIGlmIG5vdCBkZWNvZGVkIGRhdGEgd2FzIHJldHVybmVkLCBvciBhIG5lZ2F0aXZlIGVycm9yICovCitzdGF0aWMgaW50IHRyeV9kZWNvZGVfZnJhbWUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICphdnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKipvcHRpb25zKQoreworICAgIGNvbnN0IEFWQ29kZWMgKmNvZGVjOworICAgIGludCBnb3RfcGljdHVyZSA9IDEsIHJldCA9IDA7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIEFWU3VidGl0bGUgc3VidGl0bGU7CisgICAgQVZQYWNrZXQgcGt0ID0gKmF2cGt0OworCisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmICghYXZjb2RlY19pc19vcGVuKHN0LT5jb2RlYykgJiYKKyAgICAgICAgc3QtPmluZm8tPmZvdW5kX2RlY29kZXIgPD0gMCAmJgorICAgICAgICAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSAtc3QtPmluZm8tPmZvdW5kX2RlY29kZXIgfHwgIXN0LT5jb2RlYy0+Y29kZWNfaWQpKSB7CisgICAgICAgIEFWRGljdGlvbmFyeSAqdGhyZWFkX29wdCA9IE5VTEw7CisKKyAgICAgICAgY29kZWMgPSBmaW5kX2RlY29kZXIocywgc3QsIHN0LT5jb2RlYy0+Y29kZWNfaWQpOworCisgICAgICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgICAgIHN0LT5pbmZvLT5mb3VuZF9kZWNvZGVyID0gLXN0LT5jb2RlYy0+Y29kZWNfaWQ7CisgICAgICAgICAgICByZXQgICAgICAgICAgICAgICAgICAgICA9IC0xOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgLyogRm9yY2UgdGhyZWFkIGNvdW50IHRvIDEgc2luY2UgdGhlIEguMjY0IGRlY29kZXIgd2lsbCBub3QgZXh0cmFjdAorICAgICAgICAgKiBTUFMgYW5kIFBQUyB0byBleHRyYWRhdGEgZHVyaW5nIG11bHRpLXRocmVhZGVkIGRlY29kaW5nLiAqLworICAgICAgICBhdl9kaWN0X3NldChvcHRpb25zID8gb3B0aW9ucyA6ICZ0aHJlYWRfb3B0LCAidGhyZWFkcyIsICIxIiwgMCk7CisgICAgICAgIGlmIChzLT5jb2RlY193aGl0ZWxpc3QpCisgICAgICAgICAgICBhdl9kaWN0X3NldChvcHRpb25zID8gb3B0aW9ucyA6ICZ0aHJlYWRfb3B0LCAiY29kZWNfd2hpdGVsaXN0Iiwgcy0+Y29kZWNfd2hpdGVsaXN0LCAwKTsKKyAgICAgICAgcmV0ID0gYXZjb2RlY19vcGVuMihzdC0+Y29kZWMsIGNvZGVjLCBvcHRpb25zID8gb3B0aW9ucyA6ICZ0aHJlYWRfb3B0KTsKKyAgICAgICAgaWYgKCFvcHRpb25zKQorICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZ0aHJlYWRfb3B0KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHN0LT5pbmZvLT5mb3VuZF9kZWNvZGVyID0gLXN0LT5jb2RlYy0+Y29kZWNfaWQ7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgc3QtPmluZm8tPmZvdW5kX2RlY29kZXIgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0LT5pbmZvLT5mb3VuZF9kZWNvZGVyKQorICAgICAgICBzdC0+aW5mby0+Zm91bmRfZGVjb2RlciA9IDE7CisKKyAgICBpZiAoc3QtPmluZm8tPmZvdW5kX2RlY29kZXIgPCAwKSB7CisgICAgICAgIHJldCA9IC0xOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgd2hpbGUgKChwa3Quc2l6ZSA+IDAgfHwgKCFwa3QuZGF0YSAmJiBnb3RfcGljdHVyZSkpICYmCisgICAgICAgICAgIHJldCA+PSAwICYmCisgICAgICAgICAgICghaGFzX2NvZGVjX3BhcmFtZXRlcnMoc3QsIE5VTEwpIHx8ICFoYXNfZGVjb2RlX2RlbGF5X2JlZW5fZ3Vlc3NlZChzdCkgfHwKKyAgICAgICAgICAgICghc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzICYmCisgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQ09ERUNfQ0FQX0NIQU5ORUxfQ09ORikpKSB7CisgICAgICAgIGdvdF9waWN0dXJlID0gMDsKKyAgICAgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICByZXQgPSBhdmNvZGVjX2RlY29kZV92aWRlbzIoc3QtPmNvZGVjLCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ290X3BpY3R1cmUsICZwa3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfYXVkaW80KHN0LT5jb2RlYywgZnJhbWUsICZnb3RfcGljdHVyZSwgJnBrdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6CisgICAgICAgICAgICByZXQgPSBhdmNvZGVjX2RlY29kZV9zdWJ0aXRsZTIoc3QtPmNvZGVjLCAmc3VidGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdvdF9waWN0dXJlLCAmcGt0KTsKKyAgICAgICAgICAgIHJldCA9IHBrdC5zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIGlmIChnb3RfcGljdHVyZSkKKyAgICAgICAgICAgICAgICBzdC0+bmJfZGVjb2RlZF9mcmFtZXMrKzsKKyAgICAgICAgICAgIHBrdC5kYXRhICs9IHJldDsKKyAgICAgICAgICAgIHBrdC5zaXplIC09IHJldDsKKyAgICAgICAgICAgIHJldCAgICAgICA9IGdvdF9waWN0dXJlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFwa3QuZGF0YSAmJiAhZ290X3BpY3R1cmUpCisgICAgICAgIHJldCA9IC0xOworCitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworfQorCit1bnNpZ25lZCBpbnQgZmZfY29kZWNfZ2V0X3RhZyhjb25zdCBBVkNvZGVjVGFnICp0YWdzLCBlbnVtIEFWQ29kZWNJRCBpZCkKK3sKKyAgICB3aGlsZSAodGFncy0+aWQgIT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICBpZiAodGFncy0+aWQgPT0gaWQpCisgICAgICAgICAgICByZXR1cm4gdGFncy0+dGFnOworICAgICAgICB0YWdzKys7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitlbnVtIEFWQ29kZWNJRCBmZl9jb2RlY19nZXRfaWQoY29uc3QgQVZDb2RlY1RhZyAqdGFncywgdW5zaWduZWQgaW50IHRhZykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyB0YWdzW2ldLmlkICE9IEFWX0NPREVDX0lEX05PTkU7IGkrKykKKyAgICAgICAgaWYgKHRhZyA9PSB0YWdzW2ldLnRhZykKKyAgICAgICAgICAgIHJldHVybiB0YWdzW2ldLmlkOworICAgIGZvciAoaSA9IDA7IHRhZ3NbaV0uaWQgIT0gQVZfQ09ERUNfSURfTk9ORTsgaSsrKQorICAgICAgICBpZiAoYXZwcml2X3RvdXBwZXI0KHRhZykgPT0gYXZwcml2X3RvdXBwZXI0KHRhZ3NbaV0udGFnKSkKKyAgICAgICAgICAgIHJldHVybiB0YWdzW2ldLmlkOworICAgIHJldHVybiBBVl9DT0RFQ19JRF9OT05FOworfQorCitlbnVtIEFWQ29kZWNJRCBmZl9nZXRfcGNtX2NvZGVjX2lkKGludCBicHMsIGludCBmbHQsIGludCBiZSwgaW50IHNmbGFncykKK3sKKyAgICBpZiAoZmx0KSB7CisgICAgICAgIHN3aXRjaCAoYnBzKSB7CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICByZXR1cm4gYmUgPyBBVl9DT0RFQ19JRF9QQ01fRjMyQkUgOiBBVl9DT0RFQ19JRF9QQ01fRjMyTEU7CisgICAgICAgIGNhc2UgNjQ6CisgICAgICAgICAgICByZXR1cm4gYmUgPyBBVl9DT0RFQ19JRF9QQ01fRjY0QkUgOiBBVl9DT0RFQ19JRF9QQ01fRjY0TEU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQVZfQ09ERUNfSURfTk9ORTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGJwcyAgKz0gNzsKKyAgICAgICAgYnBzID4+PSAzOworICAgICAgICBpZiAoc2ZsYWdzICYgKDEgPDwgKGJwcyAtIDEpKSkgeworICAgICAgICAgICAgc3dpdGNoIChicHMpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZfQ09ERUNfSURfUENNX1M4OworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHJldHVybiBiZSA/IEFWX0NPREVDX0lEX1BDTV9TMTZCRSA6IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmUgPyBBVl9DT0RFQ19JRF9QQ01fUzI0QkUgOiBBVl9DT0RFQ19JRF9QQ01fUzI0TEU7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJlID8gQVZfQ09ERUNfSURfUENNX1MzMkJFIDogQVZfQ09ERUNfSURfUENNX1MzMkxFOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZfQ09ERUNfSURfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYnBzKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmUgPyBBVl9DT0RFQ19JRF9QQ01fVTE2QkUgOiBBVl9DT0RFQ19JRF9QQ01fVTE2TEU7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJlID8gQVZfQ09ERUNfSURfUENNX1UyNEJFIDogQVZfQ09ERUNfSURfUENNX1UyNExFOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHJldHVybiBiZSA/IEFWX0NPREVDX0lEX1BDTV9VMzJCRSA6IEFWX0NPREVDX0lEX1BDTV9VMzJMRTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWX0NPREVDX0lEX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3Vuc2lnbmVkIGludCBhdl9jb2RlY19nZXRfdGFnKGNvbnN0IEFWQ29kZWNUYWcgKmNvbnN0ICp0YWdzLCBlbnVtIEFWQ29kZWNJRCBpZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdGFnOworICAgIGlmICghYXZfY29kZWNfZ2V0X3RhZzIodGFncywgaWQsICZ0YWcpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gdGFnOworfQorCitpbnQgYXZfY29kZWNfZ2V0X3RhZzIoY29uc3QgQVZDb2RlY1RhZyAqIGNvbnN0ICp0YWdzLCBlbnVtIEFWQ29kZWNJRCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnRhZykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyB0YWdzICYmIHRhZ3NbaV07IGkrKykgeworICAgICAgICBjb25zdCBBVkNvZGVjVGFnICpjb2RlY190YWdzID0gdGFnc1tpXTsKKyAgICAgICAgd2hpbGUgKGNvZGVjX3RhZ3MtPmlkICE9IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgICAgIGlmIChjb2RlY190YWdzLT5pZCA9PSBpZCkgeworICAgICAgICAgICAgICAgICp0YWcgPSBjb2RlY190YWdzLT50YWc7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlY190YWdzKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2VudW0gQVZDb2RlY0lEIGF2X2NvZGVjX2dldF9pZChjb25zdCBBVkNvZGVjVGFnICpjb25zdCAqdGFncywgdW5zaWduZWQgaW50IHRhZykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyB0YWdzICYmIHRhZ3NbaV07IGkrKykgeworICAgICAgICBlbnVtIEFWQ29kZWNJRCBpZCA9IGZmX2NvZGVjX2dldF9pZCh0YWdzW2ldLCB0YWcpOworICAgICAgICBpZiAoaWQgIT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisgICAgcmV0dXJuIEFWX0NPREVDX0lEX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXB1dGVfY2hhcHRlcnNfZW5kKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICBpbnQ2NF90IG1heF90aW1lID0gcy0+ZHVyYXRpb24gKworICAgICAgICAgICAgICAgICAgICAgICAoKHMtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUpID8gMCA6IHMtPnN0YXJ0X3RpbWUpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NoYXB0ZXJzOyBpKyspCisgICAgICAgIGlmIChzLT5jaGFwdGVyc1tpXS0+ZW5kID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBBVkNoYXB0ZXIgKmNoID0gcy0+Y2hhcHRlcnNbaV07CisgICAgICAgICAgICBpbnQ2NF90IGVuZCA9IG1heF90aW1lID8gYXZfcmVzY2FsZV9xKG1heF90aW1lLCBBVl9USU1FX0JBU0VfUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gtPnRpbWVfYmFzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJTlQ2NF9NQVg7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5uYl9jaGFwdGVyczsgaisrKSB7CisgICAgICAgICAgICAgICAgQVZDaGFwdGVyICpjaDEgICAgID0gcy0+Y2hhcHRlcnNbal07CisgICAgICAgICAgICAgICAgaW50NjRfdCBuZXh0X3N0YXJ0ID0gYXZfcmVzY2FsZV9xKGNoMS0+c3RhcnQsIGNoMS0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaC0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgICAgICBpZiAoaiAhPSBpICYmIG5leHRfc3RhcnQgPiBjaC0+c3RhcnQgJiYgbmV4dF9zdGFydCA8IGVuZCkKKyAgICAgICAgICAgICAgICAgICAgZW5kID0gbmV4dF9zdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoLT5lbmQgPSAoZW5kID09IElOVDY0X01BWCkgPyBjaC0+c3RhcnQgOiBlbmQ7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBnZXRfc3RkX2ZyYW1lcmF0ZShpbnQgaSkKK3sKKyAgICBpZiAoaSA8IDMwKjEyKQorICAgICAgICByZXR1cm4gKGkgKyAxKSAqIDEwMDE7CisgICAgaSAtPSAzMCoxMjsKKworICAgIGlmIChpIDwgNykKKyAgICAgICAgcmV0dXJuICgoY29uc3QgaW50W10pIHsgNDAsIDQ4LCA1MCwgNjAsIDgwLCAxMjAsIDI0MH0pW2ldICogMTAwMSAqIDEyOworCisgICAgaSAtPSA3OworCisgICAgcmV0dXJuICgoY29uc3QgaW50W10pIHsgMjQsIDMwLCA2MCwgMTIsIDE1LCA0OCB9KVtpXSAqIDEwMDAgKiAxMjsKK30KKworLyogSXMgdGhlIHRpbWUgYmFzZSB1bnJlbGlhYmxlPworICogVGhpcyBpcyBhIGhldXJpc3RpYyB0byBiYWxhbmNlIGJldHdlZW4gcXVpY2sgYWNjZXB0YW5jZSBvZiB0aGUgdmFsdWVzIGluCisgKiB0aGUgaGVhZGVycyB2cy4gc29tZSBleHRyYSBjaGVja3MuCisgKiBPbGQgRGl2WCBhbmQgWHZpZCBvZnRlbiBoYXZlIG5vbnNlbnNlIHRpbWViYXNlcyBsaWtlIDFmcHMgb3IgMmZwcy4KKyAqIE1QRUctMiBjb21tb25seSBtaXN1c2VzIGZpZWxkIHJlcGVhdCBmbGFncyB0byBzdG9yZSBkaWZmZXJlbnQgZnJhbWVyYXRlcy4KKyAqIEFuZCB0aGVyZSBhcmUgInZhcmlhYmxlIiBmcHMgZmlsZXMgdGhpcyBuZWVkcyB0byBkZXRlY3QgYXMgd2VsbC4gKi8KK3N0YXRpYyBpbnQgdGJfdW5yZWxpYWJsZShBVkNvZGVjQ29udGV4dCAqYykKK3sKKyAgICBpZiAoYy0+dGltZV9iYXNlLmRlbiA+PSAxMDFMICogYy0+dGltZV9iYXNlLm51bSB8fAorICAgICAgICBjLT50aW1lX2Jhc2UuZGVuIDwgICAgNUwgKiBjLT50aW1lX2Jhc2UubnVtIHx8CisgICAgICAgIC8vIGMtPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJESVZYIikgfHwKKyAgICAgICAgLy8gYy0+Y29kZWNfdGFnID09IEFWX1JMMzIoIlhWSUQiKSB8fAorICAgICAgICBjLT5jb2RlY190YWcgPT0gQVZfUkwzMigibXA0diIpIHx8CisgICAgICAgIGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gfHwKKyAgICAgICAgYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfR0lGIHx8CisgICAgICAgIGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfYWxsb2NfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IHNpemUpCit7CisgICAgaW50IHJldDsKKworICAgIGlmIChzaXplIDwgMCB8fCBzaXplID49IElOVDMyX01BWCAtIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpIHsKKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvYyhzaXplICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgbWVtc2V0KGF2Y3R4LT5leHRyYWRhdGEgKyBzaXplLCAwLCBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gc2l6ZTsKKyAgICAgICAgcmV0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9nZXRfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZJT0NvbnRleHQgKnBiLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgcmV0ID0gZmZfYWxsb2NfZXh0cmFkYXRhKGF2Y3R4LCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXQgPSBhdmlvX3JlYWQocGIsIGF2Y3R4LT5leHRyYWRhdGEsIHNpemUpOworICAgIGlmIChyZXQgIT0gc2l6ZSkgeworICAgICAgICBhdl9mcmVlcCgmYXZjdHgtPmV4dHJhZGF0YSk7CisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlYWQgZXh0cmFkYXRhIG9mIHNpemUgJWRcbiIsIHNpemUpOworICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX3JmcHNfYWRkX2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqaWMsIEFWU3RyZWFtICpzdCwgaW50NjRfdCB0cykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQ2NF90IGxhc3QgPSBzdC0+aW5mby0+bGFzdF9kdHM7CisKKyAgICBpZiAoICAgdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgbGFzdCAhPSBBVl9OT1BUU19WQUxVRSAmJiB0cyA+IGxhc3QKKyAgICAgICAmJiB0cyAtICh1aW50NjRfdClsYXN0IDwgSU5UNjRfTUFYKSB7CisgICAgICAgIGRvdWJsZSBkdHMgPSAoaXNfcmVsYXRpdmUodHMpID8gIHRzIC0gUkVMQVRJVkVfVFNfQkFTRSA6IHRzKSAqIGF2X3EyZChzdC0+dGltZV9iYXNlKTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbiA9IHRzIC0gbGFzdDsKKworICAgICAgICBpZiAoIXN0LT5pbmZvLT5kdXJhdGlvbl9lcnJvcikKKyAgICAgICAgICAgIHN0LT5pbmZvLT5kdXJhdGlvbl9lcnJvciA9IGF2X21hbGxvY3ooc2l6ZW9mKHN0LT5pbmZvLT5kdXJhdGlvbl9lcnJvclswXSkqMik7CisgICAgICAgIGlmICghc3QtPmluZm8tPmR1cmF0aW9uX2Vycm9yKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworLy8gICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKy8vICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZlxuIiwgZHRzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaTxNQVhfU1REX1RJTUVCQVNFUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3QtPmluZm8tPmR1cmF0aW9uX2Vycm9yWzBdWzFdW2ldIDwgMWUxMCkgeworICAgICAgICAgICAgICAgIGludCBmcmFtZXJhdGUgPSBnZXRfc3RkX2ZyYW1lcmF0ZShpKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgc2R0cyA9IGR0cypmcmFtZXJhdGUvKDEwMDEqMTIpOworICAgICAgICAgICAgICAgIGZvciAoaj0gMDsgajwyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aWNrcyA9IGxscmludChzZHRzK2oqMC41KTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGVycm9yPSBzZHRzIC0gdGlja3MgKyBqKjAuNTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmluZm8tPmR1cmF0aW9uX2Vycm9yW2pdWzBdW2ldICs9IGVycm9yOworICAgICAgICAgICAgICAgICAgICBzdC0+aW5mby0+ZHVyYXRpb25fZXJyb3Jbal1bMV1baV0gKz0gZXJyb3IqZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0LT5pbmZvLT5kdXJhdGlvbl9jb3VudCsrOworICAgICAgICBzdC0+aW5mby0+cmZwc19kdXJhdGlvbl9zdW0gKz0gZHVyYXRpb247CisKKyAgICAgICAgaWYgKHN0LT5pbmZvLT5kdXJhdGlvbl9jb3VudCAlIDEwID09IDApIHsKKyAgICAgICAgICAgIGludCBuID0gc3QtPmluZm8tPmR1cmF0aW9uX2NvdW50OworICAgICAgICAgICAgZm9yIChpID0gMDsgaTxNQVhfU1REX1RJTUVCQVNFUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5pbmZvLT5kdXJhdGlvbl9lcnJvclswXVsxXVtpXSA8IDFlMTApIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEwICAgICA9IHN0LT5pbmZvLT5kdXJhdGlvbl9lcnJvclswXVswXVtpXSAvIG47CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlcnJvcjAgPSBzdC0+aW5mby0+ZHVyYXRpb25fZXJyb3JbMF1bMV1baV0gLyBuIC0gYTAqYTA7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhMSAgICAgPSBzdC0+aW5mby0+ZHVyYXRpb25fZXJyb3JbMV1bMF1baV0gLyBuOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZXJyb3IxID0gc3QtPmluZm8tPmR1cmF0aW9uX2Vycm9yWzFdWzFdW2ldIC8gbiAtIGExKmExOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IwID4gMC4wNCAmJiBlcnJvcjEgPiAwLjA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+aW5mby0+ZHVyYXRpb25fZXJyb3JbMF1bMV1baV0gPSAyZTEwOworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmluZm8tPmR1cmF0aW9uX2Vycm9yWzFdWzFdW2ldID0gMmUxMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlnbm9yZSB0aGUgZmlyc3QgNCB2YWx1ZXMsIHRoZXkgbWlnaHQgaGF2ZSBzb21lIHJhbmRvbSBqaXR0ZXIKKyAgICAgICAgaWYgKHN0LT5pbmZvLT5kdXJhdGlvbl9jb3VudCA+IDMgJiYgaXNfcmVsYXRpdmUodHMpID09IGlzX3JlbGF0aXZlKGxhc3QpKQorICAgICAgICAgICAgc3QtPmluZm8tPmR1cmF0aW9uX2djZCA9IGF2X2djZChzdC0+aW5mby0+ZHVyYXRpb25fZ2NkLCBkdXJhdGlvbik7CisgICAgfQorICAgIGlmICh0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgc3QtPmluZm8tPmxhc3RfZHRzID0gdHM7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl9yZnBzX2NhbGN1bGF0ZShBVkZvcm1hdENvbnRleHQgKmljKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gaWMtPnN0cmVhbXNbaV07CisKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLy8gdGhlIGNoZWNrIGZvciB0Yl91bnJlbGlhYmxlKCkgaXMgbm90IGNvbXBsZXRlbHkgY29ycmVjdCwgc2luY2UgdGhpcyBpcyBub3QgYWJvdXQgaGFuZGxpbmcKKyAgICAgICAgLy8gYSB1bnJlbGlhYmxlL2luZXhhY3QgdGltZSBiYXNlLCBidXQgYSB0aW1lIGJhc2UgdGhhdCBpcyBmaW5lciB0aGFuIG5lY2Vzc2FyeSwgYXMgZS5nLgorICAgICAgICAvLyBpcG1vdmllLmMgcHJvZHVjZXMuCisgICAgICAgIGlmICh0Yl91bnJlbGlhYmxlKHN0LT5jb2RlYykgJiYgc3QtPmluZm8tPmR1cmF0aW9uX2NvdW50ID4gMTUgJiYgc3QtPmluZm8tPmR1cmF0aW9uX2djZCA+IEZGTUFYKDEsIHN0LT50aW1lX2Jhc2UuZGVuLyg1MDBMTCpzdC0+dGltZV9iYXNlLm51bSkpICYmICFzdC0+cl9mcmFtZV9yYXRlLm51bSkKKyAgICAgICAgICAgIGF2X3JlZHVjZSgmc3QtPnJfZnJhbWVfcmF0ZS5udW0sICZzdC0+cl9mcmFtZV9yYXRlLmRlbiwgc3QtPnRpbWVfYmFzZS5kZW4sIHN0LT50aW1lX2Jhc2UubnVtICogc3QtPmluZm8tPmR1cmF0aW9uX2djZCwgSU5UX01BWCk7CisgICAgICAgIGlmIChzdC0+aW5mby0+ZHVyYXRpb25fY291bnQ+MSAmJiAhc3QtPnJfZnJhbWVfcmF0ZS5udW0KKyAgICAgICAgICAgICYmIHRiX3VucmVsaWFibGUoc3QtPmNvZGVjKSkgeworICAgICAgICAgICAgaW50IG51bSA9IDA7CisgICAgICAgICAgICBkb3VibGUgYmVzdF9lcnJvcj0gMC4wMTsKKyAgICAgICAgICAgIEFWUmF0aW9uYWwgcmVmX3JhdGUgPSBzdC0+cl9mcmFtZV9yYXRlLm51bSA/IHN0LT5yX2ZyYW1lX3JhdGUgOiBhdl9pbnZfcShzdC0+dGltZV9iYXNlKTsKKworICAgICAgICAgICAgZm9yIChqPSAwOyBqPE1BWF9TVERfVElNRUJBU0VTOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgazsKKworICAgICAgICAgICAgICAgIGlmIChzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbiAmJiBzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbiphdl9xMmQoc3QtPnRpbWVfYmFzZSkgPCAoMTAwMSoxMi4wKS9nZXRfc3RkX2ZyYW1lcmF0ZShqKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKCFzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbiAmJiAxLjAgPCAoMTAwMSoxMi4wKS9nZXRfc3RkX2ZyYW1lcmF0ZShqKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAoYXZfcTJkKHN0LT50aW1lX2Jhc2UpICogc3QtPmluZm8tPnJmcHNfZHVyYXRpb25fc3VtIC8gc3QtPmluZm8tPmR1cmF0aW9uX2NvdW50IDwgKDEwMDEqMTIuMCAqIDAuOCkvZ2V0X3N0ZF9mcmFtZXJhdGUoaikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgZm9yIChrPSAwOyBrPDI7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IHN0LT5pbmZvLT5kdXJhdGlvbl9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGE9IHN0LT5pbmZvLT5kdXJhdGlvbl9lcnJvcltrXVswXVtqXSAvIG47CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlcnJvcj0gc3QtPmluZm8tPmR1cmF0aW9uX2Vycm9yW2tdWzFdW2pdL24gLSBhKmE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgYmVzdF9lcnJvciAmJiBiZXN0X2Vycm9yPiAwLjAwMDAwMDAwMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9lcnJvcj0gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBnZXRfc3RkX2ZyYW1lcmF0ZShqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCAwLjAyKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgInJmcHM6ICVmICVmXG4iLCBnZXRfc3RkX2ZyYW1lcmF0ZShqKSAvIDEyLjAvMTAwMSwgZXJyb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGRvIG5vdCBpbmNyZWFzZSBmcmFtZSByYXRlIGJ5IG1vcmUgdGhhbiAxICUgaW4gb3JkZXIgdG8gbWF0Y2ggYSBzdGFuZGFyZCByYXRlLgorICAgICAgICAgICAgaWYgKG51bSAmJiAoIXJlZl9yYXRlLm51bSB8fCAoZG91YmxlKW51bS8oMTIqMTAwMSkgPCAxLjAxICogYXZfcTJkKHJlZl9yYXRlKSkpCisgICAgICAgICAgICAgICAgYXZfcmVkdWNlKCZzdC0+cl9mcmFtZV9yYXRlLm51bSwgJnN0LT5yX2ZyYW1lX3JhdGUuZGVuLCBudW0sIDEyKjEwMDEsIElOVF9NQVgpOworICAgICAgICB9CisgICAgICAgIGlmICggICAhc3QtPmF2Z19mcmFtZV9yYXRlLm51bQorICAgICAgICAgICAgJiYgc3QtPnJfZnJhbWVfcmF0ZS5udW0gJiYgc3QtPmluZm8tPnJmcHNfZHVyYXRpb25fc3VtCisgICAgICAgICAgICAmJiBzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbiA8PSAwCisgICAgICAgICAgICAmJiBzdC0+aW5mby0+ZHVyYXRpb25fY291bnQgPiAyCisgICAgICAgICAgICAmJiBmYWJzKDEuMCAvIChhdl9xMmQoc3QtPnJfZnJhbWVfcmF0ZSkgKiBhdl9xMmQoc3QtPnRpbWVfYmFzZSkpIC0gc3QtPmluZm8tPnJmcHNfZHVyYXRpb25fc3VtIC8gKGRvdWJsZSlzdC0+aW5mby0+ZHVyYXRpb25fY291bnQpIDw9IDEuMAorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19ERUJVRywgIlNldHRpbmcgYXZnIGZyYW1lIHJhdGUgYmFzZWQgb24gciBmcmFtZSByYXRlXG4iKTsKKyAgICAgICAgICAgIHN0LT5hdmdfZnJhbWVfcmF0ZSA9IHN0LT5yX2ZyYW1lX3JhdGU7CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmVlcCgmc3QtPmluZm8tPmR1cmF0aW9uX2Vycm9yKTsKKyAgICAgICAgc3QtPmluZm8tPmxhc3RfZHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHN0LT5pbmZvLT5kdXJhdGlvbl9jb3VudCA9IDA7CisgICAgICAgIHN0LT5pbmZvLT5yZnBzX2R1cmF0aW9uX3N1bSA9IDA7CisgICAgfQorfQorCitpbnQgYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbyhBVkZvcm1hdENvbnRleHQgKmljLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKQoreworICAgIGludCBpLCBjb3VudCwgcmV0ID0gMCwgajsKKyAgICBpbnQ2NF90IHJlYWRfc2l6ZTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgQVZQYWNrZXQgcGt0MSwgKnBrdDsKKyAgICBpbnQ2NF90IG9sZF9vZmZzZXQgID0gYXZpb190ZWxsKGljLT5wYik7CisgICAgLy8gbmV3IHN0cmVhbXMgbWlnaHQgYXBwZWFyLCBubyBvcHRpb25zIGZvciB0aG9zZQorICAgIGludCBvcmlnX25iX3N0cmVhbXMgPSBpYy0+bmJfc3RyZWFtczsKKyAgICBpbnQgZmx1c2hfY29kZWNzOworICAgIGludDY0X3QgbWF4X2FuYWx5emVfZHVyYXRpb24gPSBpYy0+bWF4X2FuYWx5emVfZHVyYXRpb24yOworICAgIGludDY0X3QgbWF4X3N0cmVhbV9hbmFseXplX2R1cmF0aW9uOworICAgIGludDY0X3QgcHJvYmVzaXplID0gaWMtPnByb2Jlc2l6ZTI7CisKKyAgICBpZiAoIW1heF9hbmFseXplX2R1cmF0aW9uKQorICAgICAgICBtYXhfYW5hbHl6ZV9kdXJhdGlvbiA9IGljLT5tYXhfYW5hbHl6ZV9kdXJhdGlvbjsKKyAgICBpZiAoaWMtPnByb2Jlc2l6ZSkKKyAgICAgICAgcHJvYmVzaXplID0gaWMtPnByb2Jlc2l6ZTsKKyAgICBmbHVzaF9jb2RlY3MgPSBwcm9iZXNpemUgPiAwOworCisgICAgYXZfb3B0X3NldChpYywgInNraXBfY2xlYXIiLCAiMSIsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pOworCisgICAgbWF4X3N0cmVhbV9hbmFseXplX2R1cmF0aW9uID0gbWF4X2FuYWx5emVfZHVyYXRpb247CisgICAgaWYgKCFtYXhfYW5hbHl6ZV9kdXJhdGlvbikgeworICAgICAgICBtYXhfc3RyZWFtX2FuYWx5emVfZHVyYXRpb24gPQorICAgICAgICBtYXhfYW5hbHl6ZV9kdXJhdGlvbiAgICAgICAgPSA1KkFWX1RJTUVfQkFTRTsKKyAgICAgICAgaWYgKCFzdHJjbXAoaWMtPmlmb3JtYXQtPm5hbWUsICJmbHYiKSkKKyAgICAgICAgICAgIG1heF9zdHJlYW1fYW5hbHl6ZV9kdXJhdGlvbiA9IDMwKkFWX1RJTUVfQkFTRTsKKyAgICB9CisKKyAgICBpZiAoaWMtPnBiKQorICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19ERUJVRywgIkJlZm9yZSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKCkgcG9zOiAlIlBSSWQ2NCIgYnl0ZXMgcmVhZDolIlBSSWQ2NCIgc2Vla3M6JWRcbiIsCisgICAgICAgICAgICAgICBhdmlvX3RlbGwoaWMtPnBiKSwgaWMtPnBiLT5ieXRlc19yZWFkLCBpYy0+cGItPnNlZWtfY291bnQpOworCisgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVZDb2RlYyAqY29kZWM7CisgICAgICAgIEFWRGljdGlvbmFyeSAqdGhyZWFkX29wdCA9IE5VTEw7CisgICAgICAgIHN0ID0gaWMtPnN0cmVhbXNbaV07CisKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKKy8qICAgICAgICAgICAgaWYgKCFzdC0+dGltZV9iYXNlLm51bSkKKyAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlID0gKi8KKyAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT50aW1lX2Jhc2UubnVtKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlID0gc3QtPnRpbWVfYmFzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBvbmx5IGZvciB0aGUgc3BsaXQgc3R1ZmYKKyAgICAgICAgaWYgKCFzdC0+cGFyc2VyICYmICEoaWMtPmZsYWdzICYgQVZGTVRfRkxBR19OT1BBUlNFKSkgeworICAgICAgICAgICAgc3QtPnBhcnNlciA9IGF2X3BhcnNlcl9pbml0KHN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgaWYgKHN0LT5wYXJzZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPm5lZWRfcGFyc2luZyA9PSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTKSB7CisgICAgICAgICAgICAgICAgICAgIHN0LT5wYXJzZXItPmZsYWdzIHw9IFBBUlNFUl9GTEFHX0NPTVBMRVRFX0ZSQU1FUzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5uZWVkX3BhcnNpbmcgPT0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVcpIHsKKyAgICAgICAgICAgICAgICAgICAgc3QtPnBhcnNlci0+ZmxhZ3MgfD0gUEFSU0VSX0ZMQUdfVVNFX0NPREVDX1RTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPm5lZWRfcGFyc2luZykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1ZFUkJPU0UsICJwYXJzZXIgbm90IGZvdW5kIGZvciBjb2RlYyAiCisgICAgICAgICAgICAgICAgICAgICAgICIlcywgcGFja2V0cyBvciB0aW1lcyBtYXkgYmUgaW52YWxpZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUoc3QtPmNvZGVjLT5jb2RlY19pZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvZGVjID0gZmluZF9kZWNvZGVyKGljLCBzdCwgc3QtPmNvZGVjLT5jb2RlY19pZCk7CisKKyAgICAgICAgLyogRm9yY2UgdGhyZWFkIGNvdW50IHRvIDEgc2luY2UgdGhlIEguMjY0IGRlY29kZXIgd2lsbCBub3QgZXh0cmFjdAorICAgICAgICAgKiBTUFMgYW5kIFBQUyB0byBleHRyYWRhdGEgZHVyaW5nIG11bHRpLXRocmVhZGVkIGRlY29kaW5nLiAqLworICAgICAgICBhdl9kaWN0X3NldChvcHRpb25zID8gJm9wdGlvbnNbaV0gOiAmdGhyZWFkX29wdCwgInRocmVhZHMiLCAiMSIsIDApOworCisgICAgICAgIGlmIChpYy0+Y29kZWNfd2hpdGVsaXN0KQorICAgICAgICAgICAgYXZfZGljdF9zZXQob3B0aW9ucyA/ICZvcHRpb25zW2ldIDogJnRocmVhZF9vcHQsICJjb2RlY193aGl0ZWxpc3QiLCBpYy0+Y29kZWNfd2hpdGVsaXN0LCAwKTsKKworICAgICAgICAvKiBFbnN1cmUgdGhhdCBzdWJ0aXRsZV9oZWFkZXIgaXMgcHJvcGVybHkgc2V0LiAqLworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRQorICAgICAgICAgICAgJiYgY29kZWMgJiYgIXN0LT5jb2RlYy0+Y29kZWMpIHsKKyAgICAgICAgICAgIGlmIChhdmNvZGVjX29wZW4yKHN0LT5jb2RlYywgY29kZWMsIG9wdGlvbnMgPyAmb3B0aW9uc1tpXSA6ICZ0aHJlYWRfb3B0KSA8IDApCisgICAgICAgICAgICAgICAgYXZfbG9nKGljLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIGNvZGVjIGluIGF2X2ZpbmRfc3RyZWFtX2luZm9cbiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVHJ5IHRvIGp1c3Qgb3BlbiBkZWNvZGVycywgaW4gY2FzZSB0aGlzIGlzIGVub3VnaCB0byBnZXQgcGFyYW1ldGVycy4KKyAgICAgICAgaWYgKCFoYXNfY29kZWNfcGFyYW1ldGVycyhzdCwgTlVMTCkgJiYgc3QtPnJlcXVlc3RfcHJvYmUgPD0gMCkgeworICAgICAgICAgICAgaWYgKGNvZGVjICYmICFzdC0+Y29kZWMtPmNvZGVjKQorICAgICAgICAgICAgICAgIGlmIChhdmNvZGVjX29wZW4yKHN0LT5jb2RlYywgY29kZWMsIG9wdGlvbnMgPyAmb3B0aW9uc1tpXSA6ICZ0aHJlYWRfb3B0KSA8IDApCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gY29kZWMgaW4gYXZfZmluZF9zdHJlYW1faW5mb1xuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvcHRpb25zKQorICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZ0aHJlYWRfb3B0KTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworI2lmIEZGX0FQSV9SX0ZSQU1FX1JBVEUKKyAgICAgICAgaWMtPnN0cmVhbXNbaV0tPmluZm8tPmxhc3RfZHRzID0gQVZfTk9QVFNfVkFMVUU7CisjZW5kaWYKKyAgICAgICAgaWMtPnN0cmVhbXNbaV0tPmluZm8tPmZwc19maXJzdF9kdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgaWMtPnN0cmVhbXNbaV0tPmluZm8tPmZwc19sYXN0X2R0cyAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICB9CisKKyAgICBjb3VudCAgICAgPSAwOworICAgIHJlYWRfc2l6ZSA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgYW5hbHl6ZWRfYWxsX3N0cmVhbXM7CisgICAgICAgIGlmIChmZl9jaGVja19pbnRlcnJ1cHQoJmljLT5pbnRlcnJ1cHRfY2FsbGJhY2spKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0VYSVQ7CisgICAgICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19ERUJVRywgImludGVycnVwdGVkXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgaWYgb25lIGNvZGVjIHN0aWxsIG5lZWRzIHRvIGJlIGhhbmRsZWQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIGludCBmcHNfYW5hbHl6ZV9mcmFtZWNvdW50ID0gMjA7CisKKyAgICAgICAgICAgIHN0ID0gaWMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBpZiAoIWhhc19jb2RlY19wYXJhbWV0ZXJzKHN0LCBOVUxMKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIElmIHRoZSB0aW1lYmFzZSBpcyBjb2Fyc2UgKGxpa2UgdGhlIHVzdWFsIG1pbGxpc2Vjb25kIHByZWNpc2lvbgorICAgICAgICAgICAgICogb2YgbWt2KSwgd2UgbmVlZCB0byBhbmFseXplIG1vcmUgZnJhbWVzIHRvIHJlbGlhYmx5IGFycml2ZSBhdAorICAgICAgICAgICAgICogdGhlIGNvcnJlY3QgZnBzLiAqLworICAgICAgICAgICAgaWYgKGF2X3EyZChzdC0+dGltZV9iYXNlKSA+IDAuMDAwNSkKKyAgICAgICAgICAgICAgICBmcHNfYW5hbHl6ZV9mcmFtZWNvdW50ICo9IDI7CisgICAgICAgICAgICBpZiAoIXRiX3VucmVsaWFibGUoc3QtPmNvZGVjKSkKKyAgICAgICAgICAgICAgICBmcHNfYW5hbHl6ZV9mcmFtZWNvdW50ID0gMDsKKyAgICAgICAgICAgIGlmIChpYy0+ZnBzX3Byb2JlX3NpemUgPj0gMCkKKyAgICAgICAgICAgICAgICBmcHNfYW5hbHl6ZV9mcmFtZWNvdW50ID0gaWMtPmZwc19wcm9iZV9zaXplOworICAgICAgICAgICAgaWYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQykKKyAgICAgICAgICAgICAgICBmcHNfYW5hbHl6ZV9mcmFtZWNvdW50ID0gMDsKKyAgICAgICAgICAgIC8qIHZhcmlhYmxlIGZwcyBhbmQgbm8gZ3Vlc3MgYXQgdGhlIHJlYWwgZnBzICovCisgICAgICAgICAgICBpZiAoIShzdC0+cl9mcmFtZV9yYXRlLm51bSAmJiBzdC0+YXZnX2ZyYW1lX3JhdGUubnVtKSAmJgorICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5kdXJhdGlvbl9jb3VudCA8IGZwc19hbmFseXplX2ZyYW1lY291bnQgJiYKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHN0LT5wYXJzZXIgJiYgc3QtPnBhcnNlci0+cGFyc2VyLT5zcGxpdCAmJgorICAgICAgICAgICAgICAgICFzdC0+Y29kZWMtPmV4dHJhZGF0YSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChzdC0+Zmlyc3RfZHRzID09IEFWX05PUFRTX1ZBTFVFICYmCisgICAgICAgICAgICAgICAgIShpYy0+aWZvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT1RJTUVTVEFNUFMpICYmCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzIDwgaWMtPm1heF90c19wcm9iZSAmJgorICAgICAgICAgICAgICAgIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGFuYWx5emVkX2FsbF9zdHJlYW1zID0gMDsKKyAgICAgICAgaWYgKGkgPT0gaWMtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgIGFuYWx5emVkX2FsbF9zdHJlYW1zID0gMTsKKyAgICAgICAgICAgIC8qIE5PVEU6IElmIHRoZSBmb3JtYXQgaGFzIG5vIGhlYWRlciwgdGhlbiB3ZSBuZWVkIHRvIHJlYWQgc29tZQorICAgICAgICAgICAgICogcGFja2V0cyB0byBnZXQgbW9zdCBvZiB0aGUgc3RyZWFtcywgc28gd2UgY2Fubm90IHN0b3AgaGVyZS4gKi8KKyAgICAgICAgICAgIGlmICghKGljLT5jdHhfZmxhZ3MgJiBBVkZNVENUWF9OT0hFQURFUikpIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBmb3VuZCB0aGUgaW5mbyBmb3IgYWxsIHRoZSBjb2RlY3MsIHdlIGNhbiBzdG9wLiAqLworICAgICAgICAgICAgICAgIHJldCA9IGNvdW50OworICAgICAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX0RFQlVHLCAiQWxsIGluZm8gZm91bmRcbiIpOworICAgICAgICAgICAgICAgIGZsdXNoX2NvZGVjcyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogV2UgZGlkIG5vdCBnZXQgYWxsIHRoZSBjb2RlYyBpbmZvLCBidXQgd2UgcmVhZCB0b28gbXVjaCBkYXRhLiAqLworICAgICAgICBpZiAocmVhZF9zaXplID49IHByb2Jlc2l6ZSkgeworICAgICAgICAgICAgcmV0ID0gY291bnQ7CisgICAgICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAiUHJvYmUgYnVmZmVyIHNpemUgbGltaXQgb2YgJSJQUklkNjQiIGJ5dGVzIHJlYWNoZWRcbiIsIHByb2Jlc2l6ZSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoIWljLT5zdHJlYW1zW2ldLT5yX2ZyYW1lX3JhdGUubnVtICYmCisgICAgICAgICAgICAgICAgICAgIGljLT5zdHJlYW1zW2ldLT5pbmZvLT5kdXJhdGlvbl9jb3VudCA8PSAxICYmCisgICAgICAgICAgICAgICAgICAgIGljLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICAgICAgICAgICAgICAgICAgc3RyY21wKGljLT5pZm9ybWF0LT5uYW1lLCAiaW1hZ2UyIikpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyZWFtICMlZDogbm90IGVub3VnaCBmcmFtZXMgdG8gZXN0aW1hdGUgcmF0ZTsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnNpZGVyIGluY3JlYXNpbmcgcHJvYmVzaXplXG4iLCBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogTk9URTogQSBuZXcgc3RyZWFtIGNhbiBiZSBhZGRlZCB0aGVyZSBpZiBubyBoZWFkZXIgaW4gZmlsZQorICAgICAgICAgKiAoQVZGTVRDVFhfTk9IRUFERVIpLiAqLworICAgICAgICByZXQgPSByZWFkX2ZyYW1lX2ludGVybmFsKGljLCAmcGt0MSk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIC8qIEVPRiBvciBlcnJvciovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpYy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX05PQlVGRkVSKQorICAgICAgICAgICAgZnJlZV9wYWNrZXRfYnVmZmVyKCZpYy0+cGFja2V0X2J1ZmZlciwgJmljLT5wYWNrZXRfYnVmZmVyX2VuZCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHBrdCA9IGFkZF90b19wa3RidWYoJmljLT5wYWNrZXRfYnVmZmVyLCAmcGt0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljLT5wYWNrZXRfYnVmZmVyX2VuZCk7CisgICAgICAgICAgICBpZiAoIXBrdCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmRfc3RyZWFtX2luZm9fZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9kdXBfcGFja2V0KHBrdCkpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmRfc3RyZWFtX2luZm9fZXJyOworICAgICAgICB9CisKKyAgICAgICAgc3QgPSBpYy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgICAgIGlmICghKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQykpCisgICAgICAgICAgICByZWFkX3NpemUgKz0gcGt0LT5zaXplOworCisgICAgICAgIGlmIChwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBzdC0+Y29kZWNfaW5mb19uYl9mcmFtZXMgPiAxKSB7CisgICAgICAgICAgICAvKiBjaGVjayBmb3Igbm9uLWluY3JlYXNpbmcgZHRzICovCisgICAgICAgICAgICBpZiAoc3QtPmluZm8tPmZwc19sYXN0X2R0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5mcHNfbGFzdF9kdHMgPj0gcGt0LT5kdHMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1pbmNyZWFzaW5nIERUUyBpbiBzdHJlYW0gJWQ6IHBhY2tldCAlZCB3aXRoIERUUyAiCisgICAgICAgICAgICAgICAgICAgICAgICIlIlBSSWQ2NCIsIHBhY2tldCAlZCB3aXRoIERUUyAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0LT5pbmRleCwgc3QtPmluZm8tPmZwc19sYXN0X2R0c19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5mcHNfbGFzdF9kdHMsIHN0LT5jb2RlY19pbmZvX25iX2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5kdHMpOworICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5mcHNfZmlyc3RfZHRzID0KKyAgICAgICAgICAgICAgICBzdC0+aW5mby0+ZnBzX2xhc3RfZHRzICA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGEgZGlzY29udGludWl0eSBpbiBkdHMuIElmIHRoZSBkaWZmZXJlbmNlIGluIGR0cworICAgICAgICAgICAgICogaXMgbW9yZSB0aGFuIDEwMDAgdGltZXMgdGhlIGF2ZXJhZ2UgcGFja2V0IGR1cmF0aW9uIGluIHRoZQorICAgICAgICAgICAgICogc2VxdWVuY2UsIHdlIHRyZWF0IGl0IGFzIGEgZGlzY29udGludWl0eS4gKi8KKyAgICAgICAgICAgIGlmIChzdC0+aW5mby0+ZnBzX2xhc3RfZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmCisgICAgICAgICAgICAgICAgc3QtPmluZm8tPmZwc19sYXN0X2R0c19pZHggPiBzdC0+aW5mby0+ZnBzX2ZpcnN0X2R0c19pZHggJiYKKyAgICAgICAgICAgICAgICAocGt0LT5kdHMgLSBzdC0+aW5mby0+ZnBzX2xhc3RfZHRzKSAvIDEwMDAgPgorICAgICAgICAgICAgICAgIChzdC0+aW5mby0+ZnBzX2xhc3RfZHRzICAgICAtIHN0LT5pbmZvLT5mcHNfZmlyc3RfZHRzKSAvCisgICAgICAgICAgICAgICAgKHN0LT5pbmZvLT5mcHNfbGFzdF9kdHNfaWR4IC0gc3QtPmluZm8tPmZwc19maXJzdF9kdHNfaWR4KSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJEVFMgZGlzY29udGludWl0eSBpbiBzdHJlYW0gJWQ6IHBhY2tldCAlZCB3aXRoIERUUyAiCisgICAgICAgICAgICAgICAgICAgICAgICIlIlBSSWQ2NCIsIHBhY2tldCAlZCB3aXRoIERUUyAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0LT5pbmRleCwgc3QtPmluZm8tPmZwc19sYXN0X2R0c19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5mcHNfbGFzdF9kdHMsIHN0LT5jb2RlY19pbmZvX25iX2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5kdHMpOworICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5mcHNfZmlyc3RfZHRzID0KKyAgICAgICAgICAgICAgICBzdC0+aW5mby0+ZnBzX2xhc3RfZHRzICA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB1cGRhdGUgc3RvcmVkIGR0cyB2YWx1ZXMgKi8KKyAgICAgICAgICAgIGlmIChzdC0+aW5mby0+ZnBzX2ZpcnN0X2R0cyA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5mcHNfZmlyc3RfZHRzICAgICA9IHBrdC0+ZHRzOworICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5mcHNfZmlyc3RfZHRzX2lkeCA9IHN0LT5jb2RlY19pbmZvX25iX2ZyYW1lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0LT5pbmZvLT5mcHNfbGFzdF9kdHMgICAgID0gcGt0LT5kdHM7CisgICAgICAgICAgICBzdC0+aW5mby0+ZnBzX2xhc3RfZHRzX2lkeCA9IHN0LT5jb2RlY19pbmZvX25iX2ZyYW1lczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzPjEpIHsKKyAgICAgICAgICAgIGludDY0X3QgdCA9IDA7CisKKyAgICAgICAgICAgIGlmIChzdC0+dGltZV9iYXNlLmRlbiA+IDApCisgICAgICAgICAgICAgICAgdCA9IGF2X3Jlc2NhbGVfcShzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbiwgc3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOworICAgICAgICAgICAgaWYgKHN0LT5hdmdfZnJhbWVfcmF0ZS5udW0gPiAwKQorICAgICAgICAgICAgICAgIHQgPSBGRk1BWCh0LCBhdl9yZXNjYWxlX3Eoc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzLCBhdl9pbnZfcShzdC0+YXZnX2ZyYW1lX3JhdGUpLCBBVl9USU1FX0JBU0VfUSkpOworCisgICAgICAgICAgICBpZiAoICAgdCA9PSAwCisgICAgICAgICAgICAgICAgJiYgc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzPjMwCisgICAgICAgICAgICAgICAgJiYgc3QtPmluZm8tPmZwc19maXJzdF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUKKyAgICAgICAgICAgICAgICAmJiBzdC0+aW5mby0+ZnBzX2xhc3RfZHRzICAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgICAgICB0ID0gRkZNQVgodCwgYXZfcmVzY2FsZV9xKHN0LT5pbmZvLT5mcHNfbGFzdF9kdHMgLSBzdC0+aW5mby0+ZnBzX2ZpcnN0X2R0cywgc3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpKTsKKworICAgICAgICAgICAgaWYgKHQgPj0gKGFuYWx5emVkX2FsbF9zdHJlYW1zID8gbWF4X2FuYWx5emVfZHVyYXRpb24gOiBtYXhfc3RyZWFtX2FuYWx5emVfZHVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGljLCBBVl9MT0dfVkVSQk9TRSwgIm1heF9hbmFseXplX2R1cmF0aW9uICUiUFJJZDY0IiByZWFjaGVkIGF0ICUiUFJJZDY0IiBtaWNyb3NlY29uZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1heF9hbmFseXplX2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICB0KTsKKyAgICAgICAgICAgICAgICBpZiAoaWMtPmZsYWdzICYgQVZGTVRfRkxBR19OT0JVRkZFUikKKyAgICAgICAgICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGt0LT5kdXJhdGlvbikgeworICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5jb2RlY19pbmZvX2R1cmF0aW9uICAgICAgICArPSBwa3QtPmR1cmF0aW9uOworICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5jb2RlY19pbmZvX2R1cmF0aW9uX2ZpZWxkcyArPSBzdC0+cGFyc2VyICYmIHN0LT5uZWVkX3BhcnNpbmcgJiYgc3QtPmNvZGVjLT50aWNrc19wZXJfZnJhbWUgPT0yID8gc3QtPnBhcnNlci0+cmVwZWF0X3BpY3QgKyAxIDogMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIEZGX0FQSV9SX0ZSQU1FX1JBVEUKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICBmZl9yZnBzX2FkZF9mcmFtZShpYywgc3QsIHBrdC0+ZHRzKTsKKyNlbmRpZgorICAgICAgICBpZiAoc3QtPnBhcnNlciAmJiBzdC0+cGFyc2VyLT5wYXJzZXItPnNwbGl0ICYmICFzdC0+Y29kZWMtPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgaW50IGkgPSBzdC0+cGFyc2VyLT5wYXJzZXItPnNwbGl0KHN0LT5jb2RlYywgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgICAgICAgICAgaWYgKGkgPiAwICYmIGkgPCBGRl9NQVhfRVhUUkFEQVRBX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgaSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBwa3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSWYgc3RpbGwgbm8gaW5mb3JtYXRpb24sIHdlIHRyeSB0byBvcGVuIHRoZSBjb2RlYyBhbmQgdG8KKyAgICAgICAgICogZGVjb21wcmVzcyB0aGUgZnJhbWUuIFdlIHRyeSB0byBhdm9pZCB0aGF0IGluIG1vc3QgY2FzZXMgYXMKKyAgICAgICAgICogaXQgdGFrZXMgbG9uZ2VyIGFuZCB1c2VzIG1vcmUgbWVtb3J5LiBGb3IgTVBFRy00LCB3ZSBuZWVkIHRvCisgICAgICAgICAqIGRlY29tcHJlc3MgZm9yIFF1aWNrVGltZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgQ09ERUNfQ0FQX0NIQU5ORUxfQ09ORiBpcyBzZXQgdGhpcyB3aWxsIGZvcmNlIGRlY29kaW5nIG9mIGF0CisgICAgICAgICAqIGxlYXN0IG9uZSBmcmFtZSBvZiBjb2RlYyBkYXRhLCB0aGlzIG1ha2VzIHN1cmUgdGhlIGNvZGVjIGluaXRpYWxpemVzCisgICAgICAgICAqIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIGRvZXMgbm90IG9ubHkgdHJ1c3QgdGhlIHZhbHVlcyBmcm9tCisgICAgICAgICAqIHRoZSBjb250YWluZXIuICovCisgICAgICAgIHRyeV9kZWNvZGVfZnJhbWUoaWMsIHN0LCBwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbnMgJiYgaSA8IG9yaWdfbmJfc3RyZWFtcykgPyAmb3B0aW9uc1tpXSA6IE5VTEwpOworCisgICAgICAgIGlmIChpYy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX05PQlVGRkVSKQorICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CisKKyAgICAgICAgc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzKys7CisgICAgICAgIGNvdW50Kys7CisgICAgfQorCisgICAgaWYgKGZsdXNoX2NvZGVjcykgeworICAgICAgICBBVlBhY2tldCBlbXB0eV9wa3QgPSB7IDAgfTsKKyAgICAgICAgaW50IGVyciA9IDA7CisgICAgICAgIGF2X2luaXRfcGFja2V0KCZlbXB0eV9wa3QpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpYy0+bmJfc3RyZWFtczsgaSsrKSB7CisKKyAgICAgICAgICAgIHN0ID0gaWMtPnN0cmVhbXNbaV07CisKKyAgICAgICAgICAgIC8qIGZsdXNoIHRoZSBkZWNvZGVycyAqLworICAgICAgICAgICAgaWYgKHN0LT5pbmZvLT5mb3VuZF9kZWNvZGVyID09IDEpIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRyeV9kZWNvZGVfZnJhbWUoaWMsIHN0LCAmZW1wdHlfcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9ucyAmJiBpIDwgb3JpZ19uYl9zdHJlYW1zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZvcHRpb25zW2ldIDogTlVMTCk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoZXJyID4gMCAmJiAhaGFzX2NvZGVjX3BhcmFtZXRlcnMoc3QsIE5VTEwpKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVjb2RpbmcgZm9yIHN0cmVhbSAlZCBmYWlsZWRcbiIsIHN0LT5pbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gY2xvc2UgY29kZWNzIHdoaWNoIHdlcmUgb3BlbmVkIGluIHRyeV9kZWNvZGVfZnJhbWUoKQorICAgIGZvciAoaSA9IDA7IGkgPCBpYy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHN0ID0gaWMtPnN0cmVhbXNbaV07CisgICAgICAgIGF2Y29kZWNfY2xvc2Uoc3QtPmNvZGVjKTsKKyAgICB9CisKKyAgICBmZl9yZnBzX2NhbGN1bGF0ZShpYyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzdCA9IGljLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8gJiYgIXN0LT5jb2RlYy0+Y29kZWNfdGFnICYmICFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhZz0gYXZjb2RlY19waXhfZm10X3RvX2NvZGVjX3RhZyhzdC0+Y29kZWMtPnBpeF9mbXQpOworICAgICAgICAgICAgICAgIGlmIChhdnByaXZfZmluZF9waXhfZm10KGF2cHJpdl9nZXRfcmF3X3BpeF9mbXRfdGFncygpLCB0YWcpID09IHN0LT5jb2RlYy0+cGl4X2ZtdCkKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWc9IHRhZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZXN0aW1hdGUgYXZlcmFnZSBmcmFtZXJhdGUgaWYgbm90IHNldCBieSBkZW11eGVyICovCisgICAgICAgICAgICBpZiAoc3QtPmluZm8tPmNvZGVjX2luZm9fZHVyYXRpb25fZmllbGRzICYmCisgICAgICAgICAgICAgICAgIXN0LT5hdmdfZnJhbWVfcmF0ZS5udW0gJiYKKyAgICAgICAgICAgICAgICBzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbikgeworICAgICAgICAgICAgICAgIGludCBiZXN0X2ZwcyAgICAgID0gMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgYmVzdF9lcnJvciA9IDAuMDE7CisKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmluZm8tPmNvZGVjX2luZm9fZHVyYXRpb24gICAgICAgID49IElOVDY0X01BWCAvIHN0LT50aW1lX2Jhc2UubnVtIC8gMnx8CisgICAgICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5jb2RlY19pbmZvX2R1cmF0aW9uX2ZpZWxkcyA+PSBJTlQ2NF9NQVggLyBzdC0+dGltZV9iYXNlLmRlbiB8fAorICAgICAgICAgICAgICAgICAgICBzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbiAgICAgICAgPCAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBhdl9yZWR1Y2UoJnN0LT5hdmdfZnJhbWVfcmF0ZS5udW0sICZzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbl9maWVsZHMgKiAoaW50NjRfdCkgc3QtPnRpbWVfYmFzZS5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5jb2RlY19pbmZvX2R1cmF0aW9uICogMiAqIChpbnQ2NF90KSBzdC0+dGltZV9iYXNlLm51bSwgNjAwMDApOworCisgICAgICAgICAgICAgICAgLyogUm91bmQgZ3Vlc3NlZCBmcmFtZXJhdGUgdG8gYSAic3RhbmRhcmQiIGZyYW1lcmF0ZSBpZiBpdCdzCisgICAgICAgICAgICAgICAgICogd2l0aGluIDElIG9mIHRoZSBvcmlnaW5hbCBlc3RpbWF0ZS4gKi8KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTUFYX1NURF9USU1FQkFTRVM7IGorKykgeworICAgICAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHN0ZF9mcHMgPSB7IGdldF9zdGRfZnJhbWVyYXRlKGopLCAxMiAqIDEwMDEgfTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGVycm9yICAgICAgID0gZmFicyhhdl9xMmQoc3QtPmF2Z19mcmFtZV9yYXRlKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcTJkKHN0ZF9mcHMpIC0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgYmVzdF9lcnJvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9lcnJvciA9IGVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9mcHMgICA9IHN0ZF9mcHMubnVtOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChiZXN0X2ZwcykKKyAgICAgICAgICAgICAgICAgICAgYXZfcmVkdWNlKCZzdC0+YXZnX2ZyYW1lX3JhdGUubnVtLCAmc3QtPmF2Z19mcmFtZV9yYXRlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfZnBzLCAxMiAqIDEwMDEsIElOVF9NQVgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXN0LT5yX2ZyYW1lX3JhdGUubnVtKSB7CisgICAgICAgICAgICAgICAgaWYgKCAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZS5kZW4gKiAoaW50NjRfdCkgc3QtPnRpbWVfYmFzZS5udW0KKyAgICAgICAgICAgICAgICAgICAgPD0gc3QtPmNvZGVjLT50aW1lX2Jhc2UubnVtICogc3QtPmNvZGVjLT50aWNrc19wZXJfZnJhbWUgKiAoaW50NjRfdCkgc3QtPnRpbWVfYmFzZS5kZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgc3QtPnJfZnJhbWVfcmF0ZS5udW0gPSBzdC0+Y29kZWMtPnRpbWVfYmFzZS5kZW47CisgICAgICAgICAgICAgICAgICAgIHN0LT5yX2ZyYW1lX3JhdGUuZGVuID0gc3QtPmNvZGVjLT50aW1lX2Jhc2UubnVtICogc3QtPmNvZGVjLT50aWNrc19wZXJfZnJhbWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3QtPnJfZnJhbWVfcmF0ZS5udW0gPSBzdC0+dGltZV9iYXNlLmRlbjsKKyAgICAgICAgICAgICAgICAgICAgc3QtPnJfZnJhbWVfcmF0ZS5kZW4gPSBzdC0+dGltZV9iYXNlLm51bTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3QtPmRpc3BsYXlfYXNwZWN0X3JhdGlvLm51bSAmJiBzdC0+ZGlzcGxheV9hc3BlY3RfcmF0aW8uZGVuKSB7CisgICAgICAgICAgICAgICAgQVZSYXRpb25hbCBod19yYXRpbyA9IHsgc3QtPmNvZGVjLT5oZWlnaHQsIHN0LT5jb2RlYy0+d2lkdGggfTsKKyAgICAgICAgICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGF2X211bF9xKHN0LT5kaXNwbGF5X2FzcGVjdF9yYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3X3JhdGlvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0KKyAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIC8vIHNldCBzdHJlYW0gZGlzcG9zaXRpb24gYmFzZWQgb24gYXVkaW8gc2VydmljZSB0eXBlCisgICAgICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+YXVkaW9fc2VydmljZV90eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9FRkZFQ1RTOgorICAgICAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiA9IEFWX0RJU1BPU0lUSU9OX0NMRUFOX0VGRkVDVFM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9WSVNVQUxMWV9JTVBBSVJFRDoKKyAgICAgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gPSBBVl9ESVNQT1NJVElPTl9WSVNVQUxfSU1QQUlSRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9IRUFSSU5HX0lNUEFJUkVEOgorICAgICAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiA9IEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9DT01NRU5UQVJZOgorICAgICAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiA9IEFWX0RJU1BPU0lUSU9OX0NPTU1FTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX0FVRElPX1NFUlZJQ0VfVFlQRV9LQVJBT0tFOgorICAgICAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiA9IEFWX0RJU1BPU0lUSU9OX0tBUkFPS0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJvYmVzaXplKQorICAgIGVzdGltYXRlX3RpbWluZ3MoaWMsIG9sZF9vZmZzZXQpOworCisgICAgYXZfb3B0X3NldChpYywgInNraXBfY2xlYXIiLCAiMCIsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pOworCisgICAgaWYgKHJldCA+PSAwICYmIGljLT5uYl9zdHJlYW1zKQorICAgICAgICAvKiBXZSBjb3VsZCBub3QgaGF2ZSBhbGwgdGhlIGNvZGVjIHBhcmFtZXRlcnMgYmVmb3JlIEVPRi4gKi8KKyAgICAgICAgcmV0ID0gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciAqZXJybXNnOworICAgICAgICBzdCA9IGljLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoIWhhc19jb2RlY19wYXJhbWV0ZXJzKHN0LCAmZXJybXNnKSkgeworICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKKyAgICAgICAgICAgIGF2Y29kZWNfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHN0LT5jb2RlYywgMCk7CisgICAgICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBjb2RlYyBwYXJhbWV0ZXJzIGZvciBzdHJlYW0gJWQgKCVzKTogJXNcbiIKKyAgICAgICAgICAgICAgICAgICAiQ29uc2lkZXIgaW5jcmVhc2luZyB0aGUgdmFsdWUgZm9yIHRoZSAnYW5hbHl6ZWR1cmF0aW9uJyBhbmQgJ3Byb2Jlc2l6ZScgb3B0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBpLCBidWYsIGVycm1zZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgY29tcHV0ZV9jaGFwdGVyc19lbmQoaWMpOworCitmaW5kX3N0cmVhbV9pbmZvX2VycjoKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzdCA9IGljLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoaWMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgICAgIGljLT5zdHJlYW1zW2ldLT5jb2RlYy0+dGhyZWFkX2NvdW50ID0gMDsKKyAgICAgICAgaWYgKHN0LT5pbmZvKQorICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5pbmZvLT5kdXJhdGlvbl9lcnJvcik7CisgICAgICAgIGF2X2ZyZWVwKCZpYy0+c3RyZWFtc1tpXS0+aW5mbyk7CisgICAgfQorICAgIGlmIChpYy0+cGIpCisgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX0RFQlVHLCAiQWZ0ZXIgYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbygpIHBvczogJSJQUklkNjQiIGJ5dGVzIHJlYWQ6JSJQUklkNjQiIHNlZWtzOiVkIGZyYW1lczolZFxuIiwKKyAgICAgICAgICAgICAgIGF2aW9fdGVsbChpYy0+cGIpLCBpYy0+cGItPmJ5dGVzX3JlYWQsIGljLT5wYi0+c2Vla19jb3VudCwgY291bnQpOworICAgIHJldHVybiByZXQ7Cit9CisKK0FWUHJvZ3JhbSAqYXZfZmluZF9wcm9ncmFtX2Zyb21fc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqaWMsIEFWUHJvZ3JhbSAqbGFzdCwgaW50IHMpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3Byb2dyYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKGljLT5wcm9ncmFtc1tpXSA9PSBsYXN0KSB7CisgICAgICAgICAgICBsYXN0ID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbGFzdCkKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaWMtPnByb2dyYW1zW2ldLT5uYl9zdHJlYW1faW5kZXhlczsgaisrKQorICAgICAgICAgICAgICAgICAgICBpZiAoaWMtPnByb2dyYW1zW2ldLT5zdHJlYW1faW5kZXhbal0gPT0gcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpYy0+cHJvZ3JhbXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBhdl9maW5kX2Jlc3Rfc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqaWMsIGVudW0gQVZNZWRpYVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3YW50ZWRfc3RyZWFtX25iLCBpbnQgcmVsYXRlZF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjICoqZGVjb2Rlcl9yZXQsIGludCBmbGFncykKK3sKKyAgICBpbnQgaSwgbmJfc3RyZWFtcyA9IGljLT5uYl9zdHJlYW1zOworICAgIGludCByZXQgPSBBVkVSUk9SX1NUUkVBTV9OT1RfRk9VTkQsIGJlc3RfY291bnQgPSAtMSwgYmVzdF9iaXRyYXRlID0gLTEsIGJlc3RfbXVsdGlmcmFtZSA9IC0xLCBjb3VudCwgYml0cmF0ZSwgbXVsdGlmcmFtZTsKKyAgICB1bnNpZ25lZCAqcHJvZ3JhbSA9IE5VTEw7CisgICAgY29uc3QgQVZDb2RlYyAqZGVjb2RlciA9IE5VTEwsICpiZXN0X2RlY29kZXIgPSBOVUxMOworCisgICAgaWYgKHJlbGF0ZWRfc3RyZWFtID49IDAgJiYgd2FudGVkX3N0cmVhbV9uYiA8IDApIHsKKyAgICAgICAgQVZQcm9ncmFtICpwID0gYXZfZmluZF9wcm9ncmFtX2Zyb21fc3RyZWFtKGljLCBOVUxMLCByZWxhdGVkX3N0cmVhbSk7CisgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICBwcm9ncmFtICAgID0gcC0+c3RyZWFtX2luZGV4OworICAgICAgICAgICAgbmJfc3RyZWFtcyA9IHAtPm5iX3N0cmVhbV9pbmRleGVzOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaW50IHJlYWxfc3RyZWFtX2luZGV4ID0gcHJvZ3JhbSA/IHByb2dyYW1baV0gOiBpOworICAgICAgICBBVlN0cmVhbSAqc3QgICAgICAgICAgPSBpYy0+c3RyZWFtc1tyZWFsX3N0cmVhbV9pbmRleF07CisgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHN0LT5jb2RlYzsKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY190eXBlICE9IHR5cGUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHdhbnRlZF9zdHJlYW1fbmIgPj0gMCAmJiByZWFsX3N0cmVhbV9pbmRleCAhPSB3YW50ZWRfc3RyZWFtX25iKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICh3YW50ZWRfc3RyZWFtX25iICE9IHJlYWxfc3RyZWFtX2luZGV4ICYmCisgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gJiAoQVZfRElTUE9TSVRJT05fSEVBUklOR19JTVBBSVJFRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRElTUE9TSVRJT05fVklTVUFMX0lNUEFJUkVEKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAodHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgIWF2Y3R4LT5jaGFubmVscykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoZGVjb2Rlcl9yZXQpIHsKKyAgICAgICAgICAgIGRlY29kZXIgPSBmaW5kX2RlY29kZXIoaWMsIHN0LCBzdC0+Y29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIGlmICghZGVjb2RlcikgeworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0RFQ09ERVJfTk9UX0ZPVU5EOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvdW50ID0gc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzOworICAgICAgICBiaXRyYXRlID0gYXZjdHgtPmJpdF9yYXRlOworICAgICAgICBpZiAoIWJpdHJhdGUpCisgICAgICAgICAgICBiaXRyYXRlID0gYXZjdHgtPnJjX21heF9yYXRlOworICAgICAgICBtdWx0aWZyYW1lID0gRkZNSU4oNSwgY291bnQpOworICAgICAgICBpZiAoKGJlc3RfbXVsdGlmcmFtZSA+ICBtdWx0aWZyYW1lKSB8fAorICAgICAgICAgICAgKGJlc3RfbXVsdGlmcmFtZSA9PSBtdWx0aWZyYW1lICYmIGJlc3RfYml0cmF0ZSA+ICBiaXRyYXRlKSB8fAorICAgICAgICAgICAgKGJlc3RfbXVsdGlmcmFtZSA9PSBtdWx0aWZyYW1lICYmIGJlc3RfYml0cmF0ZSA9PSBiaXRyYXRlICYmIGJlc3RfY291bnQgPj0gY291bnQpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGJlc3RfY291bnQgICA9IGNvdW50OworICAgICAgICBiZXN0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICBiZXN0X211bHRpZnJhbWUgPSBtdWx0aWZyYW1lOworICAgICAgICByZXQgICAgICAgICAgPSByZWFsX3N0cmVhbV9pbmRleDsKKyAgICAgICAgYmVzdF9kZWNvZGVyID0gZGVjb2RlcjsKKyAgICAgICAgaWYgKHByb2dyYW0gJiYgaSA9PSBuYl9zdHJlYW1zIC0gMSAmJiByZXQgPCAwKSB7CisgICAgICAgICAgICBwcm9ncmFtICAgID0gTlVMTDsKKyAgICAgICAgICAgIG5iX3N0cmVhbXMgPSBpYy0+bmJfc3RyZWFtczsKKyAgICAgICAgICAgIC8qIG5vIHJlbGF0ZWQgc3RyZWFtIGZvdW5kLCB0cnkgYWdhaW4gd2l0aCBldmVyeXRoaW5nICovCisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVjb2Rlcl9yZXQpCisgICAgICAgICpkZWNvZGVyX3JldCA9IChBVkNvZGVjKiliZXN0X2RlY29kZXI7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBhdl9yZWFkX3BsYXkoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGlmIChzLT5pZm9ybWF0LT5yZWFkX3BsYXkpCisgICAgICAgIHJldHVybiBzLT5pZm9ybWF0LT5yZWFkX3BsYXkocyk7CisgICAgaWYgKHMtPnBiKQorICAgICAgICByZXR1cm4gYXZpb19wYXVzZShzLT5wYiwgMCk7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKworaW50IGF2X3JlYWRfcGF1c2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGlmIChzLT5pZm9ybWF0LT5yZWFkX3BhdXNlKQorICAgICAgICByZXR1cm4gcy0+aWZvcm1hdC0+cmVhZF9wYXVzZShzKTsKKyAgICBpZiAocy0+cGIpCisgICAgICAgIHJldHVybiBhdmlvX3BhdXNlKHMtPnBiLCAxKTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworfQorCit2b2lkIGZmX2ZyZWVfc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0KSB7CisgICAgaW50IGo7CisgICAgYXZfYXNzZXJ0MChzLT5uYl9zdHJlYW1zPjApOworICAgIGF2X2Fzc2VydDAocy0+c3RyZWFtc1sgcy0+bmJfc3RyZWFtcyAtIDEgXSA9PSBzdCk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgc3QtPm5iX3NpZGVfZGF0YTsgaisrKQorICAgICAgICBhdl9mcmVlcCgmc3QtPnNpZGVfZGF0YVtqXS5kYXRhKTsKKyAgICBhdl9mcmVlcCgmc3QtPnNpZGVfZGF0YSk7CisgICAgc3QtPm5iX3NpZGVfZGF0YSA9IDA7CisKKyAgICBpZiAoc3QtPnBhcnNlcikgeworICAgICAgICBhdl9wYXJzZXJfY2xvc2Uoc3QtPnBhcnNlcik7CisgICAgfQorICAgIGlmIChzdC0+YXR0YWNoZWRfcGljLmRhdGEpCisgICAgICAgIGF2X2ZyZWVfcGFja2V0KCZzdC0+YXR0YWNoZWRfcGljKTsKKyAgICBhdl9kaWN0X2ZyZWUoJnN0LT5tZXRhZGF0YSk7CisgICAgYXZfZnJlZXAoJnN0LT5wcm9iZV9kYXRhLmJ1Zik7CisgICAgYXZfZnJlZXAoJnN0LT5pbmRleF9lbnRyaWVzKTsKKyAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMtPnN1YnRpdGxlX2hlYWRlcik7CisgICAgYXZfZnJlZXAoJnN0LT5jb2RlYyk7CisgICAgYXZfZnJlZXAoJnN0LT5wcml2X2RhdGEpOworICAgIGlmIChzdC0+aW5mbykKKyAgICAgICAgYXZfZnJlZXAoJnN0LT5pbmZvLT5kdXJhdGlvbl9lcnJvcik7CisgICAgYXZfZnJlZXAoJnN0LT5pbmZvKTsKKyAgICBhdl9mcmVlcCgmc3QtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbik7CisgICAgYXZfZnJlZXAoJnMtPnN0cmVhbXNbIC0tcy0+bmJfc3RyZWFtcyBdKTsKK30KKwordm9pZCBhdmZvcm1hdF9mcmVlX2NvbnRleHQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpOworCisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm47CisKKyAgICBhdl9vcHRfZnJlZShzKTsKKyAgICBpZiAocy0+aWZvcm1hdCAmJiBzLT5pZm9ybWF0LT5wcml2X2NsYXNzICYmIHMtPnByaXZfZGF0YSkKKyAgICAgICAgYXZfb3B0X2ZyZWUocy0+cHJpdl9kYXRhKTsKKyAgICBpZiAocy0+b2Zvcm1hdCAmJiBzLT5vZm9ybWF0LT5wcml2X2NsYXNzICYmIHMtPnByaXZfZGF0YSkKKyAgICAgICAgYXZfb3B0X2ZyZWUocy0+cHJpdl9kYXRhKTsKKworICAgIGZvciAoaSA9IHMtPm5iX3N0cmVhbXMgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBmZl9mcmVlX3N0cmVhbShzLCBzLT5zdHJlYW1zW2ldKTsKKyAgICB9CisgICAgZm9yIChpID0gcy0+bmJfcHJvZ3JhbXMgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBhdl9kaWN0X2ZyZWUoJnMtPnByb2dyYW1zW2ldLT5tZXRhZGF0YSk7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5wcm9ncmFtc1tpXS0+c3RyZWFtX2luZGV4KTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnByb2dyYW1zW2ldKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJnMtPnByb2dyYW1zKTsKKyAgICBhdl9mcmVlcCgmcy0+cHJpdl9kYXRhKTsKKyAgICB3aGlsZSAocy0+bmJfY2hhcHRlcnMtLSkgeworICAgICAgICBhdl9kaWN0X2ZyZWUoJnMtPmNoYXB0ZXJzW3MtPm5iX2NoYXB0ZXJzXS0+bWV0YWRhdGEpOworICAgICAgICBhdl9mcmVlcCgmcy0+Y2hhcHRlcnNbcy0+bmJfY2hhcHRlcnNdKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJnMtPmNoYXB0ZXJzKTsKKyAgICBhdl9kaWN0X2ZyZWUoJnMtPm1ldGFkYXRhKTsKKyAgICBhdl9mcmVlcCgmcy0+c3RyZWFtcyk7CisgICAgYXZfZnJlZXAoJnMtPmludGVybmFsKTsKKyAgICBmbHVzaF9wYWNrZXRfcXVldWUocyk7CisgICAgYXZfZnJlZShzKTsKK30KKwordm9pZCBhdmZvcm1hdF9jbG9zZV9pbnB1dChBVkZvcm1hdENvbnRleHQgKipwcykKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKnM7CisgICAgQVZJT0NvbnRleHQgKnBiOworCisgICAgaWYgKCFwcyB8fCAhKnBzKQorICAgICAgICByZXR1cm47CisKKyAgICBzICA9ICpwczsKKyAgICBwYiA9IHMtPnBiOworCisgICAgaWYgKChzLT5pZm9ybWF0ICYmIHN0cmNtcChzLT5pZm9ybWF0LT5uYW1lLCAiaW1hZ2UyIikgJiYgcy0+aWZvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT0ZJTEUpIHx8CisgICAgICAgIChzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQ1VTVE9NX0lPKSkKKyAgICAgICAgcGIgPSBOVUxMOworCisgICAgZmx1c2hfcGFja2V0X3F1ZXVlKHMpOworCisgICAgaWYgKHMtPmlmb3JtYXQpCisgICAgICAgIGlmIChzLT5pZm9ybWF0LT5yZWFkX2Nsb3NlKQorICAgICAgICAgICAgcy0+aWZvcm1hdC0+cmVhZF9jbG9zZShzKTsKKworICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChzKTsKKworICAgICpwcyA9IE5VTEw7CisKKyAgICBhdmlvX2Nsb3NlKHBiKTsKK30KKworQVZTdHJlYW0gKmF2Zm9ybWF0X25ld19zdHJlYW0oQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBBVkNvZGVjICpjKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgaTsKKyAgICBBVlN0cmVhbSAqKnN0cmVhbXM7CisKKyAgICBpZiAocy0+bmJfc3RyZWFtcyA+PSBJTlRfTUFYL3NpemVvZigqc3RyZWFtcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0cmVhbXMgPSBhdl9yZWFsbG9jX2FycmF5KHMtPnN0cmVhbXMsIHMtPm5iX3N0cmVhbXMgKyAxLCBzaXplb2YoKnN0cmVhbXMpKTsKKyAgICBpZiAoIXN0cmVhbXMpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHMtPnN0cmVhbXMgPSBzdHJlYW1zOworCisgICAgc3QgPSBhdl9tYWxsb2N6KHNpemVvZihBVlN0cmVhbSkpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghKHN0LT5pbmZvID0gYXZfbWFsbG9jeihzaXplb2YoKnN0LT5pbmZvKSkpKSB7CisgICAgICAgIGF2X2ZyZWUoc3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3QtPmluZm8tPmxhc3RfZHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBzdC0+Y29kZWMgPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGMpOworICAgIGlmIChzLT5pZm9ybWF0KSB7CisgICAgICAgIC8qIG5vIGRlZmF1bHQgYml0cmF0ZSBpZiBkZWNvZGluZyAqLworICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gMDsKKworICAgICAgICAvKiBkZWZhdWx0IHB0cyBzZXR0aW5nIGlzIE1QRUctbGlrZSAqLworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMywgMSwgOTAwMDApOworICAgIH0KKworICAgIHN0LT5pbmRleCAgICAgID0gcy0+bmJfc3RyZWFtczsKKyAgICBzdC0+c3RhcnRfdGltZSA9IEFWX05PUFRTX1ZBTFVFOworICAgIHN0LT5kdXJhdGlvbiAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgLyogd2Ugc2V0IHRoZSBjdXJyZW50IERUUyB0byAwIHNvIHRoYXQgZm9ybWF0cyB3aXRob3V0IGFueSB0aW1lc3RhbXBzCisgICAgICogYnV0IGR1cmF0aW9ucyBnZXQgc29tZSB0aW1lc3RhbXBzLCBmb3JtYXRzIHdpdGggc29tZSB1bmtub3duCisgICAgICogdGltZXN0YW1wcyBoYXZlIHRoZWlyIGZpcnN0IGZldyBwYWNrZXRzIGJ1ZmZlcmVkIGFuZCB0aGUKKyAgICAgKiB0aW1lc3RhbXBzIGNvcnJlY3RlZCBiZWZvcmUgdGhleSBhcmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIgKi8KKyAgICBzdC0+Y3VyX2R0cyAgICAgICA9IHMtPmlmb3JtYXQgPyBSRUxBVElWRV9UU19CQVNFIDogMDsKKyAgICBzdC0+Zmlyc3RfZHRzICAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgIHN0LT5wcm9iZV9wYWNrZXRzID0gTUFYX1BST0JFX1BBQ0tFVFM7CisgICAgc3QtPnB0c193cmFwX3JlZmVyZW5jZSA9IEFWX05PUFRTX1ZBTFVFOworICAgIHN0LT5wdHNfd3JhcF9iZWhhdmlvciA9IEFWX1BUU19XUkFQX0lHTk9SRTsKKworICAgIHN0LT5sYXN0X0lQX3B0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIHN0LT5sYXN0X2R0c19mb3Jfb3JkZXJfY2hlY2sgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1JFT1JERVJfREVMQVkgKyAxOyBpKyspCisgICAgICAgIHN0LT5wdHNfYnVmZmVyW2ldID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKSB7IDAsIDEgfTsKKworI2lmIEZGX0FQSV9SX0ZSQU1FX1JBVEUKKyAgICBzdC0+aW5mby0+bGFzdF9kdHMgICAgICA9IEFWX05PUFRTX1ZBTFVFOworI2VuZGlmCisgICAgc3QtPmluZm8tPmZwc19maXJzdF9kdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBzdC0+aW5mby0+ZnBzX2xhc3RfZHRzICA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgc3QtPmluamVjdF9nbG9iYWxfc2lkZV9kYXRhID0gcy0+aW50ZXJuYWwtPmluamVjdF9nbG9iYWxfc2lkZV9kYXRhOworCisgICAgcy0+c3RyZWFtc1tzLT5uYl9zdHJlYW1zKytdID0gc3Q7CisgICAgcmV0dXJuIHN0OworfQorCitBVlByb2dyYW0gKmF2X25ld19wcm9ncmFtKEFWRm9ybWF0Q29udGV4dCAqYWMsIGludCBpZCkKK3sKKyAgICBBVlByb2dyYW0gKnByb2dyYW0gPSBOVUxMOworICAgIGludCBpOworCisgICAgYXZfZGxvZyhhYywgIm5ld19wcm9ncmFtOiBpZD0weCUwNHhcbiIsIGlkKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhYy0+bmJfcHJvZ3JhbXM7IGkrKykKKyAgICAgICAgaWYgKGFjLT5wcm9ncmFtc1tpXS0+aWQgPT0gaWQpCisgICAgICAgICAgICBwcm9ncmFtID0gYWMtPnByb2dyYW1zW2ldOworCisgICAgaWYgKCFwcm9ncmFtKSB7CisgICAgICAgIHByb2dyYW0gPSBhdl9tYWxsb2N6KHNpemVvZihBVlByb2dyYW0pKTsKKyAgICAgICAgaWYgKCFwcm9ncmFtKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGR5bmFycmF5X2FkZCgmYWMtPnByb2dyYW1zLCAmYWMtPm5iX3Byb2dyYW1zLCBwcm9ncmFtKTsKKyAgICAgICAgcHJvZ3JhbS0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9OT05FOworICAgIH0KKyAgICBwcm9ncmFtLT5pZCA9IGlkOworICAgIHByb2dyYW0tPnB0c193cmFwX3JlZmVyZW5jZSA9IEFWX05PUFRTX1ZBTFVFOworICAgIHByb2dyYW0tPnB0c193cmFwX2JlaGF2aW9yID0gQVZfUFRTX1dSQVBfSUdOT1JFOworCisgICAgcHJvZ3JhbS0+c3RhcnRfdGltZSA9CisgICAgcHJvZ3JhbS0+ZW5kX3RpbWUgICA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKK0FWQ2hhcHRlciAqYXZwcml2X25ld19jaGFwdGVyKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGlkLCBBVlJhdGlvbmFsIHRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhcnQsIGludDY0X3QgZW5kLCBjb25zdCBjaGFyICp0aXRsZSkKK3sKKyAgICBBVkNoYXB0ZXIgKmNoYXB0ZXIgPSBOVUxMOworICAgIGludCBpOworCisgICAgaWYgKGVuZCAhPSBBVl9OT1BUU19WQUxVRSAmJiBzdGFydCA+IGVuZCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2hhcHRlciBlbmQgdGltZSAlIlBSSWQ2NCIgYmVmb3JlIHN0YXJ0ICUiUFJJZDY0IlxuIiwgZW5kLCBzdGFydCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFwdGVyczsgaSsrKQorICAgICAgICBpZiAocy0+Y2hhcHRlcnNbaV0tPmlkID09IGlkKQorICAgICAgICAgICAgY2hhcHRlciA9IHMtPmNoYXB0ZXJzW2ldOworCisgICAgaWYgKCFjaGFwdGVyKSB7CisgICAgICAgIGNoYXB0ZXIgPSBhdl9tYWxsb2N6KHNpemVvZihBVkNoYXB0ZXIpKTsKKyAgICAgICAgaWYgKCFjaGFwdGVyKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGR5bmFycmF5X2FkZCgmcy0+Y2hhcHRlcnMsICZzLT5uYl9jaGFwdGVycywgY2hhcHRlcik7CisgICAgfQorICAgIGF2X2RpY3Rfc2V0KCZjaGFwdGVyLT5tZXRhZGF0YSwgInRpdGxlIiwgdGl0bGUsIDApOworICAgIGNoYXB0ZXItPmlkICAgICAgICA9IGlkOworICAgIGNoYXB0ZXItPnRpbWVfYmFzZSA9IHRpbWVfYmFzZTsKKyAgICBjaGFwdGVyLT5zdGFydCAgICAgPSBzdGFydDsKKyAgICBjaGFwdGVyLT5lbmQgICAgICAgPSBlbmQ7CisKKyAgICByZXR1cm4gY2hhcHRlcjsKK30KKwordm9pZCBmZl9wcm9ncmFtX2FkZF9zdHJlYW1faW5kZXgoQVZGb3JtYXRDb250ZXh0ICphYywgaW50IHByb2dpZCwgdW5zaWduZWQgaWR4KQoreworICAgIGludCBpLCBqOworICAgIEFWUHJvZ3JhbSAqcHJvZ3JhbSA9IE5VTEw7CisgICAgdm9pZCAqdG1wOworCisgICAgaWYgKGlkeCA+PSBhYy0+bmJfc3RyZWFtcykgeworICAgICAgICBhdl9sb2coYWMsIEFWX0xPR19FUlJPUiwgInN0cmVhbSBpbmRleCAlZCBpcyBub3QgdmFsaWRcbiIsIGlkeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYWMtPm5iX3Byb2dyYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKGFjLT5wcm9ncmFtc1tpXS0+aWQgIT0gcHJvZ2lkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHByb2dyYW0gPSBhYy0+cHJvZ3JhbXNbaV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBwcm9ncmFtLT5uYl9zdHJlYW1faW5kZXhlczsgaisrKQorICAgICAgICAgICAgaWYgKHByb2dyYW0tPnN0cmVhbV9pbmRleFtqXSA9PSBpZHgpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRtcCA9IGF2X3JlYWxsb2NfYXJyYXkocHJvZ3JhbS0+c3RyZWFtX2luZGV4LCBwcm9ncmFtLT5uYl9zdHJlYW1faW5kZXhlcysxLCBzaXplb2YodW5zaWduZWQgaW50KSk7CisgICAgICAgIGlmICghdG1wKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBwcm9ncmFtLT5zdHJlYW1faW5kZXggPSB0bXA7CisgICAgICAgIHByb2dyYW0tPnN0cmVhbV9pbmRleFtwcm9ncmFtLT5uYl9zdHJlYW1faW5kZXhlcysrXSA9IGlkeDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwordWludDY0X3QgZmZfbnRwX3RpbWUodm9pZCkKK3sKKyAgICByZXR1cm4gKGF2X2dldHRpbWUoKSAvIDEwMDApICogMTAwMCArIE5UUF9PRkZTRVRfVVM7Cit9CisKK2ludCBhdl9nZXRfZnJhbWVfZmlsZW5hbWUoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBudW1iZXIpCit7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyICpxLCBidWYxWzIwXSwgYzsKKyAgICBpbnQgbmQsIGxlbiwgcGVyY2VudGRfZm91bmQ7CisKKyAgICBxID0gYnVmOworICAgIHAgPSBwYXRoOworICAgIHBlcmNlbnRkX2ZvdW5kID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGMgPSAqcCsrOworICAgICAgICBpZiAoYyA9PSAnXDAnKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjID09ICclJykgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG5kID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYXZfaXNkaWdpdCgqcCkpCisgICAgICAgICAgICAgICAgICAgIG5kID0gbmQgKiAxMCArICpwKysgLSAnMCc7CisgICAgICAgICAgICAgICAgYyA9ICpwKys7CisgICAgICAgICAgICB9IHdoaWxlIChhdl9pc2RpZ2l0KGMpKTsKKworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgICAgICBnb3RvIGFkZGNoYXI7CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICBpZiAocGVyY2VudGRfZm91bmQpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICBwZXJjZW50ZF9mb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmMSwgc2l6ZW9mKGJ1ZjEpLCAiJTAqZCIsIG5kLCBudW1iZXIpOworICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihidWYxKTsKKyAgICAgICAgICAgICAgICBpZiAoKHEgLSBidWYgKyBsZW4pID4gYnVmX3NpemUgLSAxKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgbWVtY3B5KHEsIGJ1ZjEsIGxlbik7CisgICAgICAgICAgICAgICAgcSArPSBsZW47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKK2FkZGNoYXI6CisgICAgICAgICAgICBpZiAoKHEgLSBidWYpIDwgYnVmX3NpemUgLSAxKQorICAgICAgICAgICAgICAgICpxKysgPSBjOworICAgICAgICB9CisgICAgfQorICAgIGlmICghcGVyY2VudGRfZm91bmQpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAqcSA9ICdcMCc7CisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgICpxID0gJ1wwJzsKKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgYXZfdXJsX3NwbGl0KGNoYXIgKnByb3RvLCBpbnQgcHJvdG9fc2l6ZSwKKyAgICAgICAgICAgICAgICAgIGNoYXIgKmF1dGhvcml6YXRpb24sIGludCBhdXRob3JpemF0aW9uX3NpemUsCisgICAgICAgICAgICAgICAgICBjaGFyICpob3N0bmFtZSwgaW50IGhvc3RuYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICBpbnQgKnBvcnRfcHRyLCBjaGFyICpwYXRoLCBpbnQgcGF0aF9zaXplLCBjb25zdCBjaGFyICp1cmwpCit7CisgICAgY29uc3QgY2hhciAqcCwgKmxzLCAqbHMyLCAqYXQsICphdDIsICpjb2wsICpicms7CisKKyAgICBpZiAocG9ydF9wdHIpCisgICAgICAgICpwb3J0X3B0ciA9IC0xOworICAgIGlmIChwcm90b19zaXplID4gMCkKKyAgICAgICAgcHJvdG9bMF0gPSAwOworICAgIGlmIChhdXRob3JpemF0aW9uX3NpemUgPiAwKQorICAgICAgICBhdXRob3JpemF0aW9uWzBdID0gMDsKKyAgICBpZiAoaG9zdG5hbWVfc2l6ZSA+IDApCisgICAgICAgIGhvc3RuYW1lWzBdID0gMDsKKyAgICBpZiAocGF0aF9zaXplID4gMCkKKyAgICAgICAgcGF0aFswXSA9IDA7CisKKyAgICAvKiBwYXJzZSBwcm90b2NvbCAqLworICAgIGlmICgocCA9IHN0cmNocih1cmwsICc6JykpKSB7CisgICAgICAgIGF2X3N0cmxjcHkocHJvdG8sIHVybCwgRkZNSU4ocHJvdG9fc2l6ZSwgcCArIDEgLSB1cmwpKTsKKyAgICAgICAgcCsrOyAvKiBza2lwICc6JyAqLworICAgICAgICBpZiAoKnAgPT0gJy8nKQorICAgICAgICAgICAgcCsrOworICAgICAgICBpZiAoKnAgPT0gJy8nKQorICAgICAgICAgICAgcCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5vIHByb3RvY29sIG1lYW5zIHBsYWluIGZpbGVuYW1lICovCisgICAgICAgIGF2X3N0cmxjcHkocGF0aCwgdXJsLCBwYXRoX3NpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogc2VwYXJhdGUgcGF0aCBmcm9tIGhvc3RuYW1lICovCisgICAgbHMgPSBzdHJjaHIocCwgJy8nKTsKKyAgICBsczIgPSBzdHJjaHIocCwgJz8nKTsKKyAgICBpZiAoIWxzKQorICAgICAgICBscyA9IGxzMjsKKyAgICBlbHNlIGlmIChscyAmJiBsczIpCisgICAgICAgIGxzID0gRkZNSU4obHMsIGxzMik7CisgICAgaWYgKGxzKQorICAgICAgICBhdl9zdHJsY3B5KHBhdGgsIGxzLCBwYXRoX3NpemUpOworICAgIGVsc2UKKyAgICAgICAgbHMgPSAmcFtzdHJsZW4ocCldOyAgLy8gWFhYCisKKyAgICAvKiB0aGUgcmVzdCBpcyBob3N0bmFtZSwgdXNlIHRoYXQgdG8gcGFyc2UgYXV0aC9wb3J0ICovCisgICAgaWYgKGxzICE9IHApIHsKKyAgICAgICAgLyogYXV0aG9yaXphdGlvbiAodXNlcls6cGFzc11AaG9zdG5hbWUpICovCisgICAgICAgIGF0MiA9IHA7CisgICAgICAgIHdoaWxlICgoYXQgPSBzdHJjaHIocCwgJ0AnKSkgJiYgYXQgPCBscykgeworICAgICAgICAgICAgYXZfc3RybGNweShhdXRob3JpemF0aW9uLCBhdDIsCisgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGF1dGhvcml6YXRpb25fc2l6ZSwgYXQgKyAxIC0gYXQyKSk7CisgICAgICAgICAgICBwID0gYXQgKyAxOyAvKiBza2lwICdAJyAqLworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpwID09ICdbJyAmJiAoYnJrID0gc3RyY2hyKHAsICddJykpICYmIGJyayA8IGxzKSB7CisgICAgICAgICAgICAvKiBbaG9zdF06cG9ydCAqLworICAgICAgICAgICAgYXZfc3RybGNweShob3N0bmFtZSwgcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGhvc3RuYW1lX3NpemUsIGJyayAtIHApKTsKKyAgICAgICAgICAgIGlmIChicmtbMV0gPT0gJzonICYmIHBvcnRfcHRyKQorICAgICAgICAgICAgICAgICpwb3J0X3B0ciA9IGF0b2koYnJrICsgMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNvbCA9IHN0cmNocihwLCAnOicpKSAmJiBjb2wgPCBscykgeworICAgICAgICAgICAgYXZfc3RybGNweShob3N0bmFtZSwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oY29sICsgMSAtIHAsIGhvc3RuYW1lX3NpemUpKTsKKyAgICAgICAgICAgIGlmIChwb3J0X3B0cikKKyAgICAgICAgICAgICAgICAqcG9ydF9wdHIgPSBhdG9pKGNvbCArIDEpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGF2X3N0cmxjcHkoaG9zdG5hbWUsIHAsCisgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGxzICsgMSAtIHAsIGhvc3RuYW1lX3NpemUpKTsKKyAgICB9Cit9CisKK2NoYXIgKmZmX2RhdGFfdG9faGV4KGNoYXIgKmJ1ZmYsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHMsIGludCBsb3dlcmNhc2UpCit7CisgICAgaW50IGk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgaGV4X3RhYmxlX3VjWzE2XSA9IHsgJzAnLCAnMScsICcyJywgJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc0JywgJzUnLCAnNicsICc3JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcsICc5JywgJ0EnLCAnQicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnLCAnRCcsICdFJywgJ0YnIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgaGV4X3RhYmxlX2xjWzE2XSA9IHsgJzAnLCAnMScsICcyJywgJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc0JywgJzUnLCAnNicsICc3JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcsICc5JywgJ2EnLCAnYicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnLCAnZCcsICdlJywgJ2YnIH07CisgICAgY29uc3QgY2hhciAqaGV4X3RhYmxlID0gbG93ZXJjYXNlID8gaGV4X3RhYmxlX2xjIDogaGV4X3RhYmxlX3VjOworCisgICAgZm9yIChpID0gMDsgaSA8IHM7IGkrKykgeworICAgICAgICBidWZmW2kgKiAyXSAgICAgPSBoZXhfdGFibGVbc3JjW2ldID4+IDRdOworICAgICAgICBidWZmW2kgKiAyICsgMV0gPSBoZXhfdGFibGVbc3JjW2ldICYgMHhGXTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmZjsKK30KKworaW50IGZmX2hleF90b19kYXRhKHVpbnQ4X3QgKmRhdGEsIGNvbnN0IGNoYXIgKnApCit7CisgICAgaW50IGMsIGxlbiwgdjsKKworICAgIGxlbiA9IDA7CisgICAgdiAgID0gMTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHAgKz0gc3Ryc3BuKHAsIFNQQUNFX0NIQVJTKTsKKyAgICAgICAgaWYgKCpwID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYyA9IGF2X3RvdXBwZXIoKHVuc2lnbmVkIGNoYXIpICpwKyspOworICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgICAgICBjID0gYyAtICcwJzsKKyAgICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgICAgICBjID0gYyAtICdBJyArIDEwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdiA9ICh2IDw8IDQpIHwgYzsKKyAgICAgICAgaWYgKHYgJiAweDEwMCkgeworICAgICAgICAgICAgaWYgKGRhdGEpCisgICAgICAgICAgICAgICAgZGF0YVtsZW5dID0gdjsKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgdiA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKwordm9pZCBhdnByaXZfc2V0X3B0c19pbmZvKEFWU3RyZWFtICpzLCBpbnQgcHRzX3dyYXBfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcHRzX251bSwgdW5zaWduZWQgaW50IHB0c19kZW4pCit7CisgICAgQVZSYXRpb25hbCBuZXdfdGI7CisgICAgaWYgKGF2X3JlZHVjZSgmbmV3X3RiLm51bSwgJm5ld190Yi5kZW4sIHB0c19udW0sIHB0c19kZW4sIElOVF9NQVgpKSB7CisgICAgICAgIGlmIChuZXdfdGIubnVtICE9IHB0c19udW0pCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJzdDolZCByZW1vdmluZyBjb21tb24gZmFjdG9yICVkIGZyb20gdGltZWJhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+aW5kZXgsIHB0c19udW0gLyBuZXdfdGIubnVtKTsKKyAgICB9IGVsc2UKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgInN0OiVkIGhhcyB0b28gbGFyZ2UgdGltZWJhc2UsIHJlZHVjaW5nXG4iLCBzLT5pbmRleCk7CisKKyAgICBpZiAobmV3X3RiLm51bSA8PSAwIHx8IG5ld190Yi5kZW4gPD0gMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIklnbm9yaW5nIGF0dGVtcHQgdG8gc2V0IGludmFsaWQgdGltZWJhc2UgJWQvJWQgZm9yIHN0OiVkXG4iLAorICAgICAgICAgICAgICAgbmV3X3RiLm51bSwgbmV3X3RiLmRlbiwKKyAgICAgICAgICAgICAgIHMtPmluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzLT50aW1lX2Jhc2UgICAgID0gbmV3X3RiOworICAgIGF2X2NvZGVjX3NldF9wa3RfdGltZWJhc2Uocy0+Y29kZWMsIG5ld190Yik7CisgICAgcy0+cHRzX3dyYXBfYml0cyA9IHB0c193cmFwX2JpdHM7Cit9CisKK3ZvaWQgZmZfcGFyc2Vfa2V5X3ZhbHVlKGNvbnN0IGNoYXIgKnN0ciwgZmZfcGFyc2Vfa2V5X3ZhbF9jYiBjYWxsYmFja19nZXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dCkKK3sKKyAgICBjb25zdCBjaGFyICpwdHIgPSBzdHI7CisKKyAgICAvKiBQYXJzZSBrZXk9dmFsdWUgcGFpcnMuICovCisgICAgZm9yICg7OykgeworICAgICAgICBjb25zdCBjaGFyICprZXk7CisgICAgICAgIGNoYXIgKmRlc3QgPSBOVUxMLCAqZGVzdF9lbmQ7CisgICAgICAgIGludCBrZXlfbGVuLCBkZXN0X2xlbiA9IDA7CisKKyAgICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlIGFuZCBwb3RlbnRpYWwgY29tbWFzLiAqLworICAgICAgICB3aGlsZSAoKnB0ciAmJiAoYXZfaXNzcGFjZSgqcHRyKSB8fCAqcHRyID09ICcsJykpCisgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgaWYgKCEqcHRyKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAga2V5ID0gcHRyOworCisgICAgICAgIGlmICghKHB0ciA9IHN0cmNocihrZXksICc9JykpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHB0cisrOworICAgICAgICBrZXlfbGVuID0gcHRyIC0ga2V5OworCisgICAgICAgIGNhbGxiYWNrX2dldF9idWYoY29udGV4dCwga2V5LCBrZXlfbGVuLCAmZGVzdCwgJmRlc3RfbGVuKTsKKyAgICAgICAgZGVzdF9lbmQgPSBkZXN0ICsgZGVzdF9sZW4gLSAxOworCisgICAgICAgIGlmICgqcHRyID09ICdcIicpIHsKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICAgICAgd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnXCInKSB7CisgICAgICAgICAgICAgICAgaWYgKCpwdHIgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXB0clsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdCAmJiBkZXN0IDwgZGVzdF9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcHRyWzFdOworICAgICAgICAgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdCAmJiBkZXN0IDwgZGVzdF9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKnB0cjsKKyAgICAgICAgICAgICAgICAgICAgcHRyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpwdHIgPT0gJ1wiJykKKyAgICAgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoOyAqcHRyICYmICEoYXZfaXNzcGFjZSgqcHRyKSB8fCAqcHRyID09ICcsJyk7IHB0cisrKQorICAgICAgICAgICAgICAgIGlmIChkZXN0ICYmIGRlc3QgPCBkZXN0X2VuZCkKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICpwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3QpCisgICAgICAgICAgICAqZGVzdCA9IDA7CisgICAgfQorfQorCitpbnQgZmZfZmluZF9zdHJlYW1faW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgaWQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmlkID09IGlkKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQ2NF90IGZmX2lzbzg2MDFfdG9fdW5peF90aW1lKGNvbnN0IGNoYXIgKmRhdGVzdHIpCit7CisgICAgc3RydWN0IHRtIHRpbWUxID0geyAwIH0sIHRpbWUyID0geyAwIH07CisgICAgY2hhciAqcmV0MSwgKnJldDI7CisgICAgcmV0MSA9IGF2X3NtYWxsX3N0cnB0aW1lKGRhdGVzdHIsICIlWSAtICVtIC0gJWQgJUg6JU06JVMiLCAmdGltZTEpOworICAgIHJldDIgPSBhdl9zbWFsbF9zdHJwdGltZShkYXRlc3RyLCAiJVkgLSAlbSAtICVkVCVIOiVNOiVTIiwgJnRpbWUyKTsKKyAgICBpZiAocmV0MiAmJiAhcmV0MSkKKyAgICAgICAgcmV0dXJuIGF2X3RpbWVnbSgmdGltZTIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGF2X3RpbWVnbSgmdGltZTEpOworfQorCitpbnQgYXZmb3JtYXRfcXVlcnlfY29kZWMoY29uc3QgQVZPdXRwdXRGb3JtYXQgKm9mbXQsIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGRfY29tcGxpYW5jZSkKK3sKKyAgICBpZiAob2ZtdCkgeworICAgICAgICBpZiAob2ZtdC0+cXVlcnlfY29kZWMpCisgICAgICAgICAgICByZXR1cm4gb2ZtdC0+cXVlcnlfY29kZWMoY29kZWNfaWQsIHN0ZF9jb21wbGlhbmNlKTsKKyAgICAgICAgZWxzZSBpZiAob2ZtdC0+Y29kZWNfdGFnKQorICAgICAgICAgICAgcmV0dXJuICEhYXZfY29kZWNfZ2V0X3RhZyhvZm10LT5jb2RlY190YWcsIGNvZGVjX2lkKTsKKyAgICAgICAgZWxzZSBpZiAoY29kZWNfaWQgPT0gb2ZtdC0+dmlkZW9fY29kZWMgfHwKKyAgICAgICAgICAgICAgICAgY29kZWNfaWQgPT0gb2ZtdC0+YXVkaW9fY29kZWMgfHwKKyAgICAgICAgICAgICAgICAgY29kZWNfaWQgPT0gb2ZtdC0+c3VidGl0bGVfY29kZWMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworfQorCitpbnQgYXZmb3JtYXRfbmV0d29ya19pbml0KHZvaWQpCit7CisjaWYgQ09ORklHX05FVFdPUksKKyAgICBpbnQgcmV0OworICAgIGZmX25ldHdvcmtfaW5pdGVkX2dsb2JhbGx5ID0gMTsKKyAgICBpZiAoKHJldCA9IGZmX25ldHdvcmtfaW5pdCgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZmZfdGxzX2luaXQoKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitpbnQgYXZmb3JtYXRfbmV0d29ya19kZWluaXQodm9pZCkKK3sKKyNpZiBDT05GSUdfTkVUV09SSworICAgIGZmX25ldHdvcmtfY2xvc2UoKTsKKyAgICBmZl90bHNfZGVpbml0KCk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2FkZF9wYXJhbV9jaGFuZ2UoQVZQYWNrZXQgKnBrdCwgaW50MzJfdCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0LCBpbnQzMl90IHNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpCit7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGludCBzaXplID0gNDsKKyAgICB1aW50OF90ICpkYXRhOworICAgIGlmICghcGt0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGlmIChjaGFubmVscykgeworICAgICAgICBzaXplICArPSA0OworICAgICAgICBmbGFncyB8PSBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0NIQU5ORUxfQ09VTlQ7CisgICAgfQorICAgIGlmIChjaGFubmVsX2xheW91dCkgeworICAgICAgICBzaXplICArPSA4OworICAgICAgICBmbGFncyB8PSBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0NIQU5ORUxfTEFZT1VUOworICAgIH0KKyAgICBpZiAoc2FtcGxlX3JhdGUpIHsKKyAgICAgICAgc2l6ZSAgKz0gNDsKKyAgICAgICAgZmxhZ3MgfD0gQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9TQU1QTEVfUkFURTsKKyAgICB9CisgICAgaWYgKHdpZHRoIHx8IGhlaWdodCkgeworICAgICAgICBzaXplICArPSA4OworICAgICAgICBmbGFncyB8PSBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0RJTUVOU0lPTlM7CisgICAgfQorICAgIGRhdGEgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX1BBUkFNX0NIQU5HRSwgc2l6ZSk7CisgICAgaWYgKCFkYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmRhdGEsIGZsYWdzKTsKKyAgICBpZiAoY2hhbm5lbHMpCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmRhdGEsIGNoYW5uZWxzKTsKKyAgICBpZiAoY2hhbm5lbF9sYXlvdXQpCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlNjQoJmRhdGEsIGNoYW5uZWxfbGF5b3V0KTsKKyAgICBpZiAoc2FtcGxlX3JhdGUpCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmRhdGEsIHNhbXBsZV9yYXRlKTsKKyAgICBpZiAod2lkdGggfHwgaGVpZ2h0KSB7CisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmRhdGEsIHdpZHRoKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmZGF0YSwgaGVpZ2h0KTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0FWUmF0aW9uYWwgYXZfZ3Vlc3Nfc2FtcGxlX2FzcGVjdF9yYXRpbyhBVkZvcm1hdENvbnRleHQgKmZvcm1hdCwgQVZTdHJlYW0gKnN0cmVhbSwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZSYXRpb25hbCB1bmRlZiA9IHswLCAxfTsKKyAgICBBVlJhdGlvbmFsIHN0cmVhbV9zYW1wbGVfYXNwZWN0X3JhdGlvID0gc3RyZWFtID8gc3RyZWFtLT5zYW1wbGVfYXNwZWN0X3JhdGlvIDogdW5kZWY7CisgICAgQVZSYXRpb25hbCBjb2RlY19zYW1wbGVfYXNwZWN0X3JhdGlvICA9IHN0cmVhbSAmJiBzdHJlYW0tPmNvZGVjID8gc3RyZWFtLT5jb2RlYy0+c2FtcGxlX2FzcGVjdF9yYXRpbyA6IHVuZGVmOworICAgIEFWUmF0aW9uYWwgZnJhbWVfc2FtcGxlX2FzcGVjdF9yYXRpbyAgPSBmcmFtZSAgPyBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpbyAgOiBjb2RlY19zYW1wbGVfYXNwZWN0X3JhdGlvOworCisgICAgYXZfcmVkdWNlKCZzdHJlYW1fc2FtcGxlX2FzcGVjdF9yYXRpby5udW0sICZzdHJlYW1fc2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICBzdHJlYW1fc2FtcGxlX2FzcGVjdF9yYXRpby5udW0sICBzdHJlYW1fc2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sIElOVF9NQVgpOworICAgIGlmIChzdHJlYW1fc2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPD0gMCB8fCBzdHJlYW1fc2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPD0gMCkKKyAgICAgICAgc3RyZWFtX3NhbXBsZV9hc3BlY3RfcmF0aW8gPSB1bmRlZjsKKworICAgIGF2X3JlZHVjZSgmZnJhbWVfc2FtcGxlX2FzcGVjdF9yYXRpby5udW0sICZmcmFtZV9zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgIGZyYW1lX3NhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCAgZnJhbWVfc2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sIElOVF9NQVgpOworICAgIGlmIChmcmFtZV9zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA8PSAwIHx8IGZyYW1lX3NhbXBsZV9hc3BlY3RfcmF0aW8uZGVuIDw9IDApCisgICAgICAgIGZyYW1lX3NhbXBsZV9hc3BlY3RfcmF0aW8gPSB1bmRlZjsKKworICAgIGlmIChzdHJlYW1fc2FtcGxlX2FzcGVjdF9yYXRpby5udW0pCisgICAgICAgIHJldHVybiBzdHJlYW1fc2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmcmFtZV9zYW1wbGVfYXNwZWN0X3JhdGlvOworfQorCitBVlJhdGlvbmFsIGF2X2d1ZXNzX2ZyYW1lX3JhdGUoQVZGb3JtYXRDb250ZXh0ICpmb3JtYXQsIEFWU3RyZWFtICpzdCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZSYXRpb25hbCBmciA9IHN0LT5yX2ZyYW1lX3JhdGU7CisgICAgQVZSYXRpb25hbCBjb2RlY19mciA9IHN0LT5jb2RlYy0+ZnJhbWVyYXRlOworICAgIEFWUmF0aW9uYWwgICBhdmdfZnIgPSBzdC0+YXZnX2ZyYW1lX3JhdGU7CisKKyAgICBpZiAoYXZnX2ZyLm51bSA+IDAgJiYgYXZnX2ZyLmRlbiA+IDAgJiYgZnIubnVtID4gMCAmJiBmci5kZW4gPiAwICYmCisgICAgICAgIGF2X3EyZChhdmdfZnIpIDwgNzAgJiYgYXZfcTJkKGZyKSA+IDIxMCkgeworICAgICAgICBmciA9IGF2Z19mcjsKKyAgICB9CisKKworICAgIGlmIChzdC0+Y29kZWMtPnRpY2tzX3Blcl9mcmFtZSA+IDEpIHsKKyAgICAgICAgaWYgKCAgIGNvZGVjX2ZyLm51bSA+IDAgJiYgY29kZWNfZnIuZGVuID4gMCAmJiBhdl9xMmQoY29kZWNfZnIpIDwgYXZfcTJkKGZyKSowLjcKKyAgICAgICAgICAgICYmIGZhYnMoMS4wIC0gYXZfcTJkKGF2X2Rpdl9xKGF2Z19mciwgZnIpKSkgPiAwLjEpCisgICAgICAgICAgICBmciA9IGNvZGVjX2ZyOworICAgIH0KKworICAgIHJldHVybiBmcjsKK30KKworaW50IGF2Zm9ybWF0X21hdGNoX3N0cmVhbV9zcGVjaWZpZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzcGVjKQoreworICAgIGlmICgqc3BlYyA8PSAnOScgJiYgKnNwZWMgPj0gJzAnKSAvKiBvcHQ6aW5kZXggKi8KKyAgICAgICAgcmV0dXJuIHN0cnRvbChzcGVjLCBOVUxMLCAwKSA9PSBzdC0+aW5kZXg7CisgICAgZWxzZSBpZiAoKnNwZWMgPT0gJ3YnIHx8ICpzcGVjID09ICdhJyB8fCAqc3BlYyA9PSAncycgfHwgKnNwZWMgPT0gJ2QnIHx8CisgICAgICAgICAgICAgKnNwZWMgPT0gJ3QnKSB7IC8qIG9wdDpbdmFzZHRdICovCisgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZTsKKworICAgICAgICBzd2l0Y2ggKCpzcGVjKyspIHsKKyAgICAgICAgY2FzZSAndic6IHR5cGUgPSBBVk1FRElBX1RZUEVfVklERU87ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOiB0eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOyAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdzJzogdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsgICBicmVhazsKKyAgICAgICAgY2FzZSAnZCc6IHR5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3QnOiB0eXBlID0gQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSAhPSBzdC0+Y29kZWMtPmNvZGVjX3R5cGUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCpzcGVjKysgPT0gJzonKSB7IC8qIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IDppbmRleCAqLworICAgICAgICAgICAgaW50IGksIGluZGV4ID0gc3RydG9sKHNwZWMsIE5VTEwsIDApOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gdHlwZSAmJiBpbmRleC0tID09IDApCisgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPT0gc3QtPmluZGV4OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmICgqc3BlYyA9PSAncCcgJiYgKihzcGVjICsgMSkgPT0gJzonKSB7CisgICAgICAgIGludCBwcm9nX2lkLCBpLCBqOworICAgICAgICBjaGFyICplbmRwdHI7CisgICAgICAgIHNwZWMgKz0gMjsKKyAgICAgICAgcHJvZ19pZCA9IHN0cnRvbChzcGVjLCAmZW5kcHRyLCAwKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3Byb2dyYW1zOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5wcm9ncmFtc1tpXS0+aWQgIT0gcHJvZ19pZCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKCplbmRwdHIrKyA9PSAnOicpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX2lkeCA9IHN0cnRvbChlbmRwdHIsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1faWR4ID49IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2lkeCA8IHMtPnByb2dyYW1zW2ldLT5uYl9zdHJlYW1faW5kZXhlcyAmJgorICAgICAgICAgICAgICAgICAgICBzdC0+aW5kZXggPT0gcy0+cHJvZ3JhbXNbaV0tPnN0cmVhbV9pbmRleFtzdHJlYW1faWR4XTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnByb2dyYW1zW2ldLT5uYl9zdHJlYW1faW5kZXhlczsgaisrKQorICAgICAgICAgICAgICAgIGlmIChzdC0+aW5kZXggPT0gcy0+cHJvZ3JhbXNbaV0tPnN0cmVhbV9pbmRleFtqXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICgqc3BlYyA9PSAnIycgfHwKKyAgICAgICAgICAgICAgICgqc3BlYyA9PSAnaScgJiYgKihzcGVjICsgMSkgPT0gJzonKSkgeworICAgICAgICBpbnQgc3RyZWFtX2lkOworICAgICAgICBjaGFyICplbmRwdHI7CisgICAgICAgIHNwZWMgKz0gMSArICgqc3BlYyA9PSAnaScpOworICAgICAgICBzdHJlYW1faWQgPSBzdHJ0b2woc3BlYywgJmVuZHB0ciwgMCk7CisgICAgICAgIGlmICghKmVuZHB0cikKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW1faWQgPT0gc3QtPmlkOworICAgIH0gZWxzZSBpZiAoKnNwZWMgPT0gJ20nICYmICooc3BlYyArIDEpID09ICc6JykgeworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnOworICAgICAgICBjaGFyICprZXksICp2YWw7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgc3BlYyArPSAyOworICAgICAgICB2YWwgPSBzdHJjaHIoc3BlYywgJzonKTsKKworICAgICAgICBrZXkgPSB2YWwgPyBhdl9zdHJuZHVwKHNwZWMsIHZhbCAtIHNwZWMpIDogYXZfc3RyZHVwKHNwZWMpOworICAgICAgICBpZiAoIWtleSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgdGFnID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCBrZXksIE5VTEwsIDApOworICAgICAgICBpZiAodGFnKSB7CisgICAgICAgICAgICBpZiAoIXZhbCB8fCAhc3RyY21wKHRhZy0+dmFsdWUsIHZhbCArIDEpKQorICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXQgPSAwOworCisgICAgICAgIGF2X2ZyZWVwKCZrZXkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSBpZiAoISpzcGVjKSAvKiBlbXB0eSBzcGVjaWZpZXIsIG1hdGNoZXMgZXZlcnl0aGluZyAqLworICAgICAgICByZXR1cm4gMTsKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHN0cmVhbSBzcGVjaWZpZXI6ICVzLlxuIiwgc3BlYyk7CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKworaW50IGZmX2dlbmVyYXRlX2F2Y2lfZXh0cmFkYXRhKEFWU3RyZWFtICpzdCkKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBhdmNpMTAwXzEwODBwX2V4dHJhZGF0YVtdID0geworICAgICAgICAvLyBTUFMKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHg3YSwgMHgxMCwgMHgyOSwKKyAgICAgICAgMHhiNiwgMHhkNCwgMHgyMCwgMHgyMiwgMHgzMywgMHgxOSwgMHhjNiwgMHg2MywKKyAgICAgICAgMHgyMywgMHgyMSwgMHgwMSwgMHgxMSwgMHg5OCwgMHhjZSwgMHgzMywgMHgxOSwKKyAgICAgICAgMHgxOCwgMHgyMSwgMHgwMiwgMHg1NiwgMHhiOSwgMHgzZCwgMHg3ZCwgMHg3ZSwKKyAgICAgICAgMHg0ZiwgMHhlMywgMHgzZiwgMHgxMSwgMHhmMSwgMHg5ZSwgMHgwOCwgMHhiOCwKKyAgICAgICAgMHg4YywgMHg1NCwgMHg0MywgMHhjMCwgMHg3OCwgMHgwMiwgMHgyNywgMHhlMiwKKyAgICAgICAgMHg3MCwgMHgxZSwgMHgzMCwgMHgxMCwgMHgxMCwgMHgxNCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwMywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhjYSwKKyAgICAgICAgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgLy8gUFBTCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjgsIDB4Y2UsIDB4MzMsIDB4NDgsCisgICAgICAgIDB4ZDAKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGF2Y2kxMDBfMTA4MGlfZXh0cmFkYXRhW10gPSB7CisgICAgICAgIC8vIFNQUworICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY3LCAweDdhLCAweDEwLCAweDI5LAorICAgICAgICAweGI2LCAweGQ0LCAweDIwLCAweDIyLCAweDMzLCAweDE5LCAweGM2LCAweDYzLAorICAgICAgICAweDIzLCAweDIxLCAweDAxLCAweDExLCAweDk4LCAweGNlLCAweDMzLCAweDE5LAorICAgICAgICAweDE4LCAweDIxLCAweDAzLCAweDNhLCAweDQ2LCAweDY1LCAweDZhLCAweDY1LAorICAgICAgICAweDI0LCAweGFkLCAweGU5LCAweDEyLCAweDMyLCAweDE0LCAweDFhLCAweDI2LAorICAgICAgICAweDM0LCAweGFkLCAweGE0LCAweDQxLCAweDgyLCAweDIzLCAweDAxLCAweDUwLAorICAgICAgICAweDJiLCAweDFhLCAweDI0LCAweDY5LCAweDQ4LCAweDMwLCAweDQwLCAweDJlLAorICAgICAgICAweDExLCAweDEyLCAweDA4LCAweGM2LCAweDhjLCAweDA0LCAweDQxLCAweDI4LAorICAgICAgICAweDRjLCAweDM0LCAweGYwLCAweDFlLCAweDAxLCAweDEzLCAweGYyLCAweGUwLAorICAgICAgICAweDNjLCAweDYwLCAweDIwLCAweDIwLCAweDI4LCAweDAwLCAweDAwLCAweDAzLAorICAgICAgICAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAzLCAweDAxLCAweDk0LCAweDAwLAorICAgICAgICAvLyBQUFMKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhjZSwgMHgzMywgMHg0OCwKKyAgICAgICAgMHhkMAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXZjaTUwXzEwODBwX2V4dHJhZGF0YVtdID0geworICAgICAgICAvLyBTUFMKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHg2ZSwgMHgxMCwgMHgyOCwKKyAgICAgICAgMHhhNiwgMHhkNCwgMHgyMCwgMHgzMiwgMHgzMywgMHgwYywgMHg3MSwgMHgxOCwKKyAgICAgICAgMHg4OCwgMHg2MiwgMHgxMCwgMHgxOSwgMHgxOSwgMHg4NiwgMHgzOCwgMHg4YywKKyAgICAgICAgMHg0NCwgMHgzMCwgMHgyMSwgMHgwMiwgMHg1NiwgMHg0ZSwgMHg2ZiwgMHgzNywKKyAgICAgICAgMHhjZCwgMHhmOSwgMHhiZiwgMHg4MSwgMHg2YiwgMHhmMywgMHg3YywgMHhkZSwKKyAgICAgICAgMHg2ZSwgMHg2YywgMHhkMywgMHgzYywgMHgwNSwgMHhhMCwgMHgyMiwgMHg3ZSwKKyAgICAgICAgMHg1ZiwgMHhmYywgMHgwMCwgMHgwYywgMHgwMCwgMHgxMywgMHg4YywgMHgwNCwKKyAgICAgICAgMHgwNCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMSwgMHgwMCwKKyAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgzMiwgMHg4NCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgLy8gUFBTCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjgsIDB4ZWUsIDB4MzEsIDB4MTIsCisgICAgICAgIDB4MTEKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGF2Y2k1MF8xMDgwaV9leHRyYWRhdGFbXSA9IHsKKyAgICAgICAgLy8gU1BTCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjcsIDB4NmUsIDB4MTAsIDB4MjgsCisgICAgICAgIDB4YTYsIDB4ZDQsIDB4MjAsIDB4MzIsIDB4MzMsIDB4MGMsIDB4NzEsIDB4MTgsCisgICAgICAgIDB4ODgsIDB4NjIsIDB4MTAsIDB4MTksIDB4MTksIDB4ODYsIDB4MzgsIDB4OGMsCisgICAgICAgIDB4NDQsIDB4MzAsIDB4MjEsIDB4MDIsIDB4NTYsIDB4NGUsIDB4NmUsIDB4NjEsCisgICAgICAgIDB4ODcsIDB4M2UsIDB4NzMsIDB4NGQsIDB4OTgsIDB4MGMsIDB4MDMsIDB4MDYsCisgICAgICAgIDB4OWMsIDB4MGIsIDB4NzMsIDB4ZTYsIDB4YzAsIDB4YjUsIDB4MTgsIDB4NjMsCisgICAgICAgIDB4MGQsIDB4MzksIDB4ZTAsIDB4NWIsIDB4MDIsIDB4ZDQsIDB4YzYsIDB4MTksCisgICAgICAgIDB4MWEsIDB4NzksIDB4OGMsIDB4MzIsIDB4MzQsIDB4MjQsIDB4ZjAsIDB4MTYsCisgICAgICAgIDB4ODEsIDB4MTMsIDB4ZjcsIDB4ZmYsIDB4ODAsIDB4MDIsIDB4MDAsIDB4MDEsCisgICAgICAgIDB4ZjEsIDB4ODAsIDB4ODAsIDB4ODAsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MDMsCisgICAgICAgIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4NTAsIDB4ODAsIDB4MDAsCisgICAgICAgIC8vIFBQUworICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY4LCAweGVlLCAweDMxLCAweDEyLAorICAgICAgICAweDExCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBhdmNpMTAwXzcyMHBfZXh0cmFkYXRhW10gPSB7CisgICAgICAgIC8vIFNQUworICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY3LCAweDdhLCAweDEwLCAweDI5LAorICAgICAgICAweGI2LCAweGQ0LCAweDIwLCAweDJhLCAweDMzLCAweDFkLCAweGM3LCAweDYyLAorICAgICAgICAweGExLCAweDA4LCAweDQwLCAweDU0LCAweDY2LCAweDNiLCAweDhlLCAweGM1LAorICAgICAgICAweDQyLCAweDAyLCAweDEwLCAweDI1LCAweDY0LCAweDJjLCAweDg5LCAweGU4LAorICAgICAgICAweDg1LCAweGU0LCAweDIxLCAweDRiLCAweDkwLCAweDgzLCAweDA2LCAweDk1LAorICAgICAgICAweGQxLCAweDA2LCAweDQ2LCAweDk3LCAweDIwLCAweGM4LCAweGQ3LCAweDQzLAorICAgICAgICAweDA4LCAweDExLCAweGMyLCAweDFlLCAweDRjLCAweDkxLCAweDBmLCAweDAxLAorICAgICAgICAweDQwLCAweDE2LCAweGVjLCAweDA3LCAweDhjLCAweDA0LCAweDA0LCAweDA1LAorICAgICAgICAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLAorICAgICAgICAweDAwLCAweDY0LCAweDg0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAvLyBQUFMKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhjZSwgMHgzMSwgMHgxMiwKKyAgICAgICAgMHgxMQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXZjaTUwXzcyMHBfZXh0cmFkYXRhW10gPSB7CisgICAgICAgIC8vIFNQUworICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY3LCAweDZlLCAweDEwLCAweDIwLAorICAgICAgICAweGE2LCAweGQ0LCAweDIwLCAweDMyLCAweDMzLCAweDBjLCAweDcxLCAweDE4LAorICAgICAgICAweDg4LCAweDYyLCAweDEwLCAweDE5LCAweDE5LCAweDg2LCAweDM4LCAweDhjLAorICAgICAgICAweDQ0LCAweDMwLCAweDIxLCAweDAyLCAweDU2LCAweDRlLCAweDZmLCAweDM3LAorICAgICAgICAweGNkLCAweGY5LCAweGJmLCAweDgxLCAweDZiLCAweGYzLCAweDdjLCAweGRlLAorICAgICAgICAweDZlLCAweDZjLCAweGQzLCAweDNjLCAweDBmLCAweDAxLCAweDZlLCAweGZmLAorICAgICAgICAweGMwLCAweDAwLCAweGMwLCAweDAxLCAweDM4LCAweGMwLCAweDQwLCAweDQwLAorICAgICAgICAweDUwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA2LCAweDQ4LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAvLyBQUFMKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhlZSwgMHgzMSwgMHgxMiwKKyAgICAgICAgMHgxMQorICAgIH07CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gTlVMTDsKKyAgICBpbnQgc2l6ZSAgICAgICAgICAgID0gMDsKKworICAgIGlmIChzdC0+Y29kZWMtPndpZHRoID09IDE5MjApIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfUFJPR1JFU1NJVkUpIHsKKyAgICAgICAgICAgIGRhdGEgPSBhdmNpMTAwXzEwODBwX2V4dHJhZGF0YTsKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2YoYXZjaTEwMF8xMDgwcF9leHRyYWRhdGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YSA9IGF2Y2kxMDBfMTA4MGlfZXh0cmFkYXRhOworICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihhdmNpMTAwXzEwODBpX2V4dHJhZGF0YSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+d2lkdGggPT0gMTQ0MCkgeworICAgICAgICBpZiAoc3QtPmNvZGVjLT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9QUk9HUkVTU0lWRSkgeworICAgICAgICAgICAgZGF0YSA9IGF2Y2k1MF8xMDgwcF9leHRyYWRhdGE7CisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGF2Y2k1MF8xMDgwcF9leHRyYWRhdGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YSA9IGF2Y2k1MF8xMDgwaV9leHRyYWRhdGE7CisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGF2Y2k1MF8xMDgwaV9leHRyYWRhdGEpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPndpZHRoID09IDEyODApIHsKKyAgICAgICAgZGF0YSA9IGF2Y2kxMDBfNzIwcF9leHRyYWRhdGE7CisgICAgICAgIHNpemUgPSBzaXplb2YoYXZjaTEwMF83MjBwX2V4dHJhZGF0YSk7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPndpZHRoID09IDk2MCkgeworICAgICAgICBkYXRhID0gYXZjaTUwXzcyMHBfZXh0cmFkYXRhOworICAgICAgICBzaXplID0gc2l6ZW9mKGF2Y2k1MF83MjBwX2V4dHJhZGF0YSk7CisgICAgfQorCisgICAgaWYgKCFzaXplKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSk7CisgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIHNpemUpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG1lbWNweShzdC0+Y29kZWMtPmV4dHJhZGF0YSwgZGF0YSwgc2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKwordWludDhfdCAqYXZfc3RyZWFtX2dldF9zaWRlX2RhdGEoQVZTdHJlYW0gKnN0LCBlbnVtIEFWUGFja2V0U2lkZURhdGFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNpemUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPm5iX3NpZGVfZGF0YTsgaSsrKSB7CisgICAgICAgIGlmIChzdC0+c2lkZV9kYXRhW2ldLnR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgaWYgKHNpemUpCisgICAgICAgICAgICAgICAgKnNpemUgPSBzdC0+c2lkZV9kYXRhW2ldLnNpemU7CisgICAgICAgICAgICByZXR1cm4gc3QtPnNpZGVfZGF0YVtpXS5kYXRhOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3ZjMXRlc3QuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92YzF0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmZTM5OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92YzF0ZXN0LmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBWQzEgVGVzdCBCaXRzdHJlYW1zIEZvcm1hdCBEZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBWQzEgdGVzdCBiaXRzdHJlYW0gZmlsZSBkZW11eGVyCisgKiBieSBLb25zdGFudGluIFNoaXNoa292CisgKiBGb3JtYXQgc3BlY2lmaWVkIGluIFNNUFRFIHN0YW5kYXJkIDQyMSBBbm5leCBMCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgVkMxX0VYVFJBREFUQV9TSVpFIDQKKworc3RhdGljIGludCB2YzF0X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChwLT5idWZfc2l6ZSA8IDI0KQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocC0+YnVmWzNdICE9IDB4QzUgfHwgQVZfUkwzMigmcC0+YnVmWzRdKSAhPSA0IHx8IEFWX1JMMzIoJnAtPmJ1ZlsyMF0pICE9IDB4QykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047Cit9CisKK3N0YXRpYyBpbnQgdmMxdF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCBmcmFtZXM7CisgICAgdWludDMyX3QgZnBzOworCisgICAgZnJhbWVzID0gYXZpb19ybDI0KHBiKTsKKyAgICBpZihhdmlvX3I4KHBiKSAhPSAweEM1IHx8IGF2aW9fcmwzMihwYikgIT0gNCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiBpbml0IHZpZGVvIGNvZGVjICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1dNVjM7CisKKyAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzdC0+Y29kZWMsIHBiLCBWQzFfRVhUUkFEQVRBX1NJWkUpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmwzMihwYik7CisgICAgc3QtPmNvZGVjLT53aWR0aCA9IGF2aW9fcmwzMihwYik7CisgICAgaWYoYXZpb19ybDMyKHBiKSAhPSAweEMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgZnBzID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZihmcHMgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIDEwMDApOworICAgIGVsc2V7CisgICAgICAgIGlmICghZnBzKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiWmVybyBGUFMgc3BlY2lmaWVkLCBkZWZhdWx0aW5nIHRvIDEgRlBTXG4iKTsKKyAgICAgICAgICAgIGZwcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMjQsIDEsIGZwcyk7CisgICAgICAgIHN0LT5kdXJhdGlvbiA9IGZyYW1lczsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YzF0X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGZyYW1lX3NpemU7CisgICAgaW50IGtleWZyYW1lID0gMDsKKyAgICB1aW50MzJfdCBwdHM7CisKKyAgICBpZihhdmlvX2Zlb2YocGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgZnJhbWVfc2l6ZSA9IGF2aW9fcmwyNChwYik7CisgICAgaWYoYXZpb19yOChwYikgJiAweDgwKQorICAgICAgICBrZXlmcmFtZSA9IDE7CisgICAgcHRzID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZihhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGZyYW1lX3NpemUpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICBpZihzLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UuZGVuID09IDEwMDApCisgICAgICAgIHBrdC0+cHRzID0gcHRzOworICAgIHBrdC0+ZmxhZ3MgfD0ga2V5ZnJhbWUgPyBBVl9QS1RfRkxBR19LRVkgOiAwOworICAgIHBrdC0+cG9zIC09IDg7CisKKyAgICByZXR1cm4gcGt0LT5zaXplOworfQorCitBVklucHV0Rm9ybWF0IGZmX3ZjMXRfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidmMxdGVzdCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZDLTEgdGVzdCBiaXRzdHJlYW0iKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB2YzF0X3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHZjMXRfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gdmMxdF9yZWFkX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC92YzF0ZXN0ZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdmMxdGVzdGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTMzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvdmMxdGVzdGVuYy5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBWQy0xIHRlc3QgYml0c3RyZWFtcyBmb3JtYXQgbXV4ZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUkNWQ29udGV4dCB7CisgICAgaW50IGZyYW1lczsKK30gUkNWQ29udGV4dDsKKworc3RhdGljIGludCB2YzF0ZXN0X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2YyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworCisgICAgaWYgKGF2Yy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfV01WMykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT25seSBXTVYzIGlzIGFjY2VwdGVkIVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXZpb193bDI0KHBiLCAwKTsgLy9mcmFtZXMgY291bnQgd2lsbCBiZSBoZXJlCisgICAgYXZpb193OChwYiwgMHhDNSk7CisgICAgYXZpb193bDMyKHBiLCA0KTsKKyAgICBhdmlvX3dyaXRlKHBiLCBhdmMtPmV4dHJhZGF0YSwgNCk7CisgICAgYXZpb193bDMyKHBiLCBhdmMtPmhlaWdodCk7CisgICAgYXZpb193bDMyKHBiLCBhdmMtPndpZHRoKTsKKyAgICBhdmlvX3dsMzIocGIsIDB4Qyk7CisgICAgYXZpb193bDI0KHBiLCAwKTsgLy8gaHJkX2J1ZmZlcgorICAgIGF2aW9fdzgocGIsIDB4ODApOyAvLyBsZXZlbHxjYnJ8cmVzMQorICAgIGF2aW9fd2wzMihwYiwgMCk7IC8vIGhyZF9yYXRlCisgICAgaWYgKHMtPnN0cmVhbXNbMF0tPmF2Z19mcmFtZV9yYXRlLmRlbiAmJiBzLT5zdHJlYW1zWzBdLT5hdmdfZnJhbWVfcmF0ZS5udW0gPT0gMSkKKyAgICAgICAgYXZpb193bDMyKHBiLCBzLT5zdHJlYW1zWzBdLT5hdmdfZnJhbWVfcmF0ZS5kZW4pOworICAgIGVsc2UKKyAgICAgICAgYXZpb193bDMyKHBiLCAweEZGRkZGRkZGKTsgLy92YXJpYWJsZSBmcmFtZXJhdGUKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHMtPnN0cmVhbXNbMF0sIDMyLCAxLCAxMDAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZjMXRlc3Rfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBSQ1ZDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICBpZiAoIXBrdC0+c2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYXZpb193bDMyKHBiLCBwa3QtPnNpemUgfCAoKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpID8gMHg4MDAwMDAwMCA6IDApKTsKKyAgICBhdmlvX3dsMzIocGIsIHBrdC0+cHRzKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgY3R4LT5mcmFtZXMrKzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZjMXRlc3Rfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgUkNWQ29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworCisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSkgeworICAgICAgICBhdmlvX3NlZWsocGIsIDAsIFNFRUtfU0VUKTsKKyAgICAgICAgYXZpb193bDI0KHBiLCBjdHgtPmZyYW1lcyk7CisgICAgICAgIGF2aW9fZmx1c2gocGIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfdmMxdF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAidmMxdGVzdCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZDLTEgdGVzdCBiaXRzdHJlYW0iKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAicmN2IiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoUkNWQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9XTVYzLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IHZjMXRlc3Rfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHZjMXRlc3Rfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IHZjMXRlc3Rfd3JpdGVfdHJhaWxlciwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdmVyc2lvbi5oIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjg4NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3ZlcnNpb24uaApAQCAtMCwwICsxLDY3IEBACisvKgorICogVmVyc2lvbiBtYWNyb3MuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfVkVSU0lPTl9ICisjZGVmaW5lIEFWRk9STUFUX1ZFUlNJT05fSAorCisvKioKKyAqIEBmaWxlCisgKiBAaW5ncm91cCBsaWJhdmYKKyAqIExpYmF2Zm9ybWF0IHZlcnNpb24gbWFjcm9zCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC92ZXJzaW9uLmgiCisKKyNkZWZpbmUgTElCQVZGT1JNQVRfVkVSU0lPTl9NQUpPUiA1NgorI2RlZmluZSBMSUJBVkZPUk1BVF9WRVJTSU9OX01JTk9SICAxNQorI2RlZmluZSBMSUJBVkZPUk1BVF9WRVJTSU9OX01JQ1JPIDEwMgorCisjZGVmaW5lIExJQkFWRk9STUFUX1ZFUlNJT05fSU5UIEFWX1ZFUlNJT05fSU5UKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCQVZGT1JNQVRfVkVSU0lPTl9NSU5PUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJBVkZPUk1BVF9WRVJTSU9OX01JQ1JPKQorI2RlZmluZSBMSUJBVkZPUk1BVF9WRVJTSU9OICAgICBBVl9WRVJTSU9OKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWRk9STUFUX1ZFUlNJT05fTUlOT1IsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWRk9STUFUX1ZFUlNJT05fTUlDUk8pCisjZGVmaW5lIExJQkFWRk9STUFUX0JVSUxEICAgICAgIExJQkFWRk9STUFUX1ZFUlNJT05fSU5UCisKKyNkZWZpbmUgTElCQVZGT1JNQVRfSURFTlQgICAgICAgIkxhdmYiIEFWX1NUUklOR0lGWShMSUJBVkZPUk1BVF9WRVJTSU9OKQorCisvKioKKyAqIEZGX0FQSV8qIGRlZmluZXMgbWF5IGJlIHBsYWNlZCBiZWxvdyB0byBpbmRpY2F0ZSBwdWJsaWMgQVBJIHRoYXQgd2lsbCBiZQorICogZHJvcHBlZCBhdCBhIGZ1dHVyZSB2ZXJzaW9uIGJ1bXAuIFRoZSBkZWZpbmVzIHRoZW1zZWx2ZXMgYXJlIG5vdCBwYXJ0IG9mCisgKiB0aGUgcHVibGljIEFQSSBhbmQgbWF5IGNoYW5nZSwgYnJlYWsgb3IgZGlzYXBwZWFyIGF0IGFueSB0aW1lLgorICovCisjaWZuZGVmIEZGX0FQSV9MQVZGX0JJVEVYQUNUCisjZGVmaW5lIEZGX0FQSV9MQVZGX0JJVEVYQUNUICAgICAgICAgICAgKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfTEFWRl9GUkFDCisjZGVmaW5lIEZGX0FQSV9MQVZGX0ZSQUMgICAgICAgICAgICAgICAgKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfTEFWRl9DT0RFQ19UQgorI2RlZmluZSBGRl9BUElfTEFWRl9DT0RFQ19UQiAgICAgICAgICAgIChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX1VSTF9GRU9GCisjZGVmaW5lIEZGX0FQSV9VUkxfRkVPRiAgICAgICAgICAgICAgICAgKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorCisjaWZuZGVmIEZGX0FQSV9SX0ZSQU1FX1JBVEUKKyNkZWZpbmUgRkZfQVBJX1JfRlJBTUVfUkFURSAgICAgICAgICAgIDEKKyNlbmRpZgorI2VuZGlmIC8qIEFWRk9STUFUX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3Zpdm8uYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92aXZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4NzM3OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92aXZvLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBWaXZvIHN0cmVhbSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRGFuaWVsIFZlcmthbXAgPGRhbmllbCBhdCBkcnYubnU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEBicmllZiBWaXZvIHN0cmVhbSBkZW11eGVyCisgKiBAYXV0aG9yIERhbmllbCBWZXJrYW1wIDxkYW5pZWwgYXQgZHJ2Lm51PgorICogQHNhIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPVZpdm8KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IFZpdm9Db250ZXh0IHsKKyAgICBpbnQgdmVyc2lvbjsKKworICAgIGludCB0eXBlOworICAgIGludCBzZXF1ZW5jZTsKKyAgICBpbnQgbGVuZ3RoOworCisgICAgdWludDhfdCAgdGV4dFsxMDI0ICsgMV07Cit9IFZpdm9Db250ZXh0OworCitzdGF0aWMgaW50IHZpdm9fcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmID0gcC0+YnVmOworICAgIHVuc2lnbmVkIGMsIGxlbmd0aCA9IDA7CisKKyAgICAvLyBzdHJlYW0gbXVzdCBzdGFydCB3aXRoIHBhY2tldCBvZiB0eXBlIDAgYW5kIHNlcXVlbmNlIG51bWJlciAwCisgICAgaWYgKCpidWYrKyAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIHJlYWQgYXQgbW9zdCAyIGJ5dGVzIG9mIGNvZGVkIGxlbmd0aAorICAgIGMgPSAqYnVmKys7CisgICAgbGVuZ3RoID0gYyAmIDB4N0Y7CisgICAgaWYgKGMgJiAweDgwKSB7CisgICAgICAgIGMgPSAqYnVmKys7CisgICAgICAgIGxlbmd0aCA9IChsZW5ndGggPDwgNykgfCAoYyAmIDB4N0YpOworICAgIH0KKyAgICBpZiAoYyAmIDB4ODAgfHwgbGVuZ3RoID4gMTAyNCB8fCBsZW5ndGggPCAyMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAobWVtY21wKGJ1ZiwgIlxyXG5WZXJzaW9uOlZpdm8vIiwgMTUpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBidWYgKz0gMTU7CisKKyAgICBpZiAoKmJ1ZiA8ICcwJyAmJiAqYnVmID4gJzInKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKK30KKworc3RhdGljIGludCB2aXZvX2dldF9wYWNrZXRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBWaXZvQ29udGV4dCAqdml2byA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1bnNpZ25lZCBjLCBnZXRfbGVuZ3RoID0gMDsKKworICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBjID0gYXZpb19yOChwYik7CisgICAgaWYgKGMgPT0gMHg4MikgeworICAgICAgICBnZXRfbGVuZ3RoID0gMTsKKyAgICAgICAgYyA9IGF2aW9fcjgocGIpOworICAgIH0KKworICAgIHZpdm8tPnR5cGUgICAgID0gYyA+PiA0OworICAgIHZpdm8tPnNlcXVlbmNlID0gYyAmIDB4RjsKKworICAgIHN3aXRjaCAodml2by0+dHlwZSkgeworICAgIGNhc2UgMDogICBnZXRfbGVuZ3RoID0gICAxOyBicmVhazsKKyAgICBjYXNlIDE6IHZpdm8tPmxlbmd0aCA9IDEyODsgYnJlYWs7CisgICAgY2FzZSAyOiAgIGdldF9sZW5ndGggPSAgIDE7IGJyZWFrOworICAgIGNhc2UgMzogdml2by0+bGVuZ3RoID0gIDQwOyBicmVhazsKKyAgICBjYXNlIDQ6IHZpdm8tPmxlbmd0aCA9ICAyNDsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVua25vd24gcGFja2V0IHR5cGUgJWRcbiIsIHZpdm8tPnR5cGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2xlbmd0aCkgeworICAgICAgICBjID0gYXZpb19yOChwYik7CisgICAgICAgIHZpdm8tPmxlbmd0aCA9IGMgJiAweDdGOworICAgICAgICBpZiAoYyAmIDB4ODApIHsKKyAgICAgICAgICAgIGMgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIHZpdm8tPmxlbmd0aCA9ICh2aXZvLT5sZW5ndGggPDwgNykgfCAoYyAmIDB4N0YpOworCisgICAgICAgICAgICBpZiAoYyAmIDB4ODApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY29kZWQgbGVuZ3RoIGlzIG1vcmUgdGhhbiB0d28gYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdml2b19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgVml2b0NvbnRleHQgKnZpdm8gPSBzLT5wcml2X2RhdGE7CisgICAgQVZSYXRpb25hbCBmcHMgPSB7IDEsIDI1fTsKKyAgICBBVlN0cmVhbSAqYXN0LCAqdnN0OworICAgIHVuc2lnbmVkIGNoYXIgKmxpbmUsICpsaW5lX2VuZCwgKmtleSwgKnZhbHVlOworICAgIGxvbmcgdmFsdWVfaW50OworICAgIGludCByZXQsIHZhbHVlX3VzZWQ7CisgICAgaW50NjRfdCBkdXJhdGlvbiA9IDA7CisgICAgY2hhciAqZW5kX3ZhbHVlOworCisgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBhc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghYXN0IHx8ICF2c3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoKHJldCA9IHZpdm9fZ2V0X3BhY2tldF9oZWFkZXIocykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgLy8gZG9uZSByZWFkaW5nIGFsbCB0ZXh0IGhlYWRlciBwYWNrZXRzPworICAgICAgICBpZiAodml2by0+c2VxdWVuY2UgfHwgdml2by0+dHlwZSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICh2aXZvLT5sZW5ndGggPD0gMTAyNCkgeworICAgICAgICAgICAgYXZpb19yZWFkKHMtPnBiLCB2aXZvLT50ZXh0LCB2aXZvLT5sZW5ndGgpOworICAgICAgICAgICAgdml2by0+dGV4dFt2aXZvLT5sZW5ndGhdID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInRvbyBiaWcgaGVhZGVyLCBza2lwcGluZ1xuIik7CisgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIHZpdm8tPmxlbmd0aCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmUgPSB2aXZvLT50ZXh0OworICAgICAgICB3aGlsZSAoKmxpbmUpIHsKKyAgICAgICAgICAgIGxpbmVfZW5kID0gc3Ryc3RyKGxpbmUsICJcclxuIik7CisgICAgICAgICAgICBpZiAoIWxpbmVfZW5kKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAqbGluZV9lbmQgPSAwOworICAgICAgICAgICAga2V5ID0gbGluZTsKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lX2VuZCArIDI7IC8vIHNraXAgXHJcbgorCisgICAgICAgICAgICBpZiAobGluZV9lbmQgPT0ga2V5KSAvLyBza2lwIGJsYW5rIGxpbmVzCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKGtleSwgJzonKTsKKyAgICAgICAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJtaXNzaW5nIGNvbG9uIGluIGtleTp2YWx1ZSBwYWlyICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKnZhbHVlKysgPSAwOworCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiaGVhZGVyOiAnJXMnID0gJyVzJ1xuIiwga2V5LCB2YWx1ZSk7CisKKyAgICAgICAgICAgIHZhbHVlX2ludCA9IHN0cnRvbCh2YWx1ZSwgJmVuZF92YWx1ZSwgMTApOworICAgICAgICAgICAgdmFsdWVfdXNlZCA9IDA7CisgICAgICAgICAgICBpZiAoKmVuZF92YWx1ZSA9PSAwKSB7IC8vIHZhbGlkIGludGVnZXIKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiZ290IGEgdmFsaWQgaW50ZWdlciAoJWxkKVxuIiwgdmFsdWVfaW50KTsKKyAgICAgICAgICAgICAgICB2YWx1ZV91c2VkID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChrZXksICJEdXJhdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gdmFsdWVfaW50OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJXaWR0aCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHZzdC0+Y29kZWMtPndpZHRoID0gdmFsdWVfaW50OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJIZWlnaHQiKSkgeworICAgICAgICAgICAgICAgICAgICB2c3QtPmNvZGVjLT5oZWlnaHQgPSB2YWx1ZV9pbnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIlRpbWVVbml0TnVtZXJhdG9yIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZnBzLm51bSA9IHZhbHVlX2ludCAvIDEwMDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIlRpbWVVbml0RGVub21pbmF0b3IiKSkgeworICAgICAgICAgICAgICAgICAgICBmcHMuZGVuID0gdmFsdWVfaW50OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJTYW1wbGluZ0ZyZXF1ZW5jeSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gdmFsdWVfaW50OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJOb21pbmFsQml0cmF0ZSIpKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIkxlbmd0aCIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgb2YgZmlsZQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlX3VzZWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzdHJjbXAoa2V5LCAiVmVyc2lvbiIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIlZpdm8vJWQuIiwgJnZpdm8tPnZlcnNpb24pICE9IDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHZhbHVlX3VzZWQgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIkZQUyIpKSB7CisgICAgICAgICAgICAgICAgQVZSYXRpb25hbCB0bXA7CisKKyAgICAgICAgICAgICAgICB2YWx1ZV91c2VkID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIWF2X3BhcnNlX3JhdGlvKCZ0bXAsIHZhbHVlLCAxMDAwMCwgQVZfTE9HX1dBUk5JTkcsIHMpKQorICAgICAgICAgICAgICAgICAgICBmcHMgPSBhdl9pbnZfcSh0bXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXZhbHVlX3VzZWQpCisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBrZXksIHZhbHVlLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgZnBzLm51bSwgZnBzLmRlbik7CisgICAgaWYgKGR1cmF0aW9uKQorICAgICAgICBzLT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGUoZHVyYXRpb24sIDEwMDAsIDEpOworCisgICAgdnN0LT5zdGFydF90aW1lICAgICAgICA9IDA7CisgICAgdnN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IDA7CisgICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKworICAgIGlmICh2aXZvLT52ZXJzaW9uID09IDEpIHsKKyAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9IMjYzOworICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0c3MjNfMTsKKyAgICAgICAgYXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKKyAgICAgICAgYXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSAyNDsKKyAgICAgICAgYXN0LT5jb2RlYy0+Yml0X3JhdGUgPSA2NDAwOworICAgIH0KKworICAgIGFzdC0+c3RhcnRfdGltZSAgICAgICAgPSAwOworICAgIGFzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSAwOworICAgIGFzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdml2b19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgVml2b0NvbnRleHQgKnZpdm8gPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgdW5zaWduZWQgb2xkX3NlcXVlbmNlID0gdml2by0+c2VxdWVuY2UsIG9sZF90eXBlID0gdml2by0+dHlwZTsKKyAgICBpbnQgc3RyZWFtX2luZGV4LCByZXQgPSAwOworCityZXN0YXJ0OgorCisgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHN3aXRjaCAodml2by0+dHlwZSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgYXZpb19za2lwKHBiLCB2aXZvLT5sZW5ndGgpOworICAgICAgICBpZiAoKHJldCA9IHZpdm9fZ2V0X3BhY2tldF9oZWFkZXIocykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOiAvLyB2aWRlbworICAgICAgICBzdHJlYW1faW5kZXggPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgY2FzZSA0OiAvLyBhdWRpbworICAgICAgICBzdHJlYW1faW5kZXggPSAxOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5rbm93biBwYWNrZXQgdHlwZSAlZFxuIiwgdml2by0+dHlwZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCB2aXZvLT5sZW5ndGgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIC8vIGdldCBuZXh0IHBhY2tldCBoZWFkZXIKKyAgICBpZiAoKHJldCA9IHZpdm9fZ2V0X3BhY2tldF9oZWFkZXIocykpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgd2hpbGUgKHZpdm8tPnNlcXVlbmNlID09IG9sZF9zZXF1ZW5jZSAmJgorICAgICAgICAgICAoKCh2aXZvLT50eXBlIC0gMSkgPj4gMSkgPT0gKChvbGRfdHlwZSAtIDEpID4+IDEpKSkgeworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9FT0Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gYXZfYXBwZW5kX3BhY2tldChwYiwgcGt0LCB2aXZvLT5sZW5ndGgpKSA8IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBnZXQgbmV4dCBwYWNrZXQgaGVhZGVyCisgICAgICAgIGlmICgocmV0ID0gdml2b19nZXRfcGFja2V0X2hlYWRlcihzKSkgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdHJlYW1faW5kZXg7CisKK2ZhaWw6CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl92aXZvX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZpdm8iLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWaXZvIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZpdm9Db250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB2aXZvX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHZpdm9fcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gdml2b19yZWFkX3BhY2tldCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAidml2IiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdm9jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5NzIzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92b2MuYwpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ3JlYXRpdmUgVm9pY2UgRmlsZSBjb21tb24gZGF0YS4KKyAqIENvcHlyaWdodCAoYykgMjAwNiAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidm9jLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworY29uc3QgdW5zaWduZWQgY2hhciBmZl92b2NfbWFnaWNbMjFdID0gIkNyZWF0aXZlIFZvaWNlIEZpbGVceDFBIjsKKworY29uc3QgQVZDb2RlY1RhZyBmZl92b2NfY29kZWNfdGFnc1tdID0geworICAgIHtBVl9DT0RFQ19JRF9QQ01fVTgsICAgICAgICAweDAwfSwKKyAgICB7QVZfQ09ERUNfSURfQURQQ01fU0JQUk9fNCwgMHgwMX0sCisgICAge0FWX0NPREVDX0lEX0FEUENNX1NCUFJPXzMsIDB4MDJ9LAorICAgIHtBVl9DT0RFQ19JRF9BRFBDTV9TQlBST18yLCAweDAzfSwKKyAgICB7QVZfQ09ERUNfSURfUENNX1MxNkxFLCAgICAgMHgwNH0sCisgICAge0FWX0NPREVDX0lEX1BDTV9BTEFXLCAgICAgIDB4MDZ9LAorICAgIHtBVl9DT0RFQ19JRF9QQ01fTVVMQVcsICAgICAweDA3fSwKKyAgICB7QVZfQ09ERUNfSURfQURQQ01fQ1QsICAgIDB4MDIwMH0sCisgICAge0FWX0NPREVDX0lEX05PTkUsICAgICAgICAgICAgIDB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC92b2MuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC92b2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGRiOTcwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3ZvYy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDcmVhdGl2ZSBWb2ljZSBGaWxlIGRlbXV4ZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9WT0NfSAorI2RlZmluZSBBVkZPUk1BVF9WT0NfSAorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB2b2NfZGVjX2NvbnRleHQgeworICAgIGludDY0X3QgcmVtYWluaW5nX3NpemU7Cit9IFZvY0RlY0NvbnRleHQ7CisKK3R5cGVkZWYgZW51bSB2b2NfdHlwZSB7CisgICAgVk9DX1RZUEVfRU9GICAgICAgICAgICAgICA9IDB4MDAsCisgICAgVk9DX1RZUEVfVk9JQ0VfREFUQSAgICAgICA9IDB4MDEsCisgICAgVk9DX1RZUEVfVk9JQ0VfREFUQV9DT05UICA9IDB4MDIsCisgICAgVk9DX1RZUEVfU0lMRU5DRSAgICAgICAgICA9IDB4MDMsCisgICAgVk9DX1RZUEVfTUFSS0VSICAgICAgICAgICA9IDB4MDQsCisgICAgVk9DX1RZUEVfQVNDSUkgICAgICAgICAgICA9IDB4MDUsCisgICAgVk9DX1RZUEVfUkVQRVRJVElPTl9TVEFSVCA9IDB4MDYsCisgICAgVk9DX1RZUEVfUkVQRVRJVElPTl9FTkQgICA9IDB4MDcsCisgICAgVk9DX1RZUEVfRVhURU5ERUQgICAgICAgICA9IDB4MDgsCisgICAgVk9DX1RZUEVfTkVXX1ZPSUNFX0RBVEEgICA9IDB4MDksCit9IFZvY1R5cGU7CisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGZmX3ZvY19tYWdpY1syMV07CitleHRlcm4gY29uc3QgQVZDb2RlY1RhZyBmZl92b2NfY29kZWNfdGFnc1tdOworCitpbnQgZmZfdm9jX2dldF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgaW50IG1heF9zaXplKTsKKworI2VuZGlmIC8qIEFWRk9STUFUX1ZPQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdm9jZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdm9jZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2YjVhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92b2NkZWMuYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIENyZWF0aXZlIFZvaWNlIEZpbGUgZGVtdXhlci4KKyAqIENvcHlyaWdodCAoYykgMjAwNiAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgInZvYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKworc3RhdGljIGludCB2b2NfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IHZlcnNpb24sIGNoZWNrOworCisgICAgaWYgKG1lbWNtcChwLT5idWYsIGZmX3ZvY19tYWdpYywgc2l6ZW9mKGZmX3ZvY19tYWdpYykgLSAxKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdmVyc2lvbiA9IEFWX1JMMTYocC0+YnVmICsgMjIpOworICAgIGNoZWNrID0gQVZfUkwxNihwLT5idWYgKyAyNCk7CisgICAgaWYgKH52ZXJzaW9uICsgMHgxMjM0ICE9IGNoZWNrKQorICAgICAgICByZXR1cm4gMTA7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBpbnQgdm9jX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBWb2NEZWNDb250ZXh0ICp2b2MgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IGhlYWRlcl9zaXplOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIGF2aW9fc2tpcChwYiwgMjApOworICAgIGhlYWRlcl9zaXplID0gYXZpb19ybDE2KHBiKSAtIDIyOworICAgIGlmIChoZWFkZXJfc2l6ZSAhPSA0KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIGhlYWRlciBzaXplOiAlZFxuIiwgaGVhZGVyX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKyAgICBhdmlvX3NraXAocGIsIGhlYWRlcl9zaXplKTsKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisKKyAgICB2b2MtPnJlbWFpbmluZ19zaXplID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworaW50CitmZl92b2NfZ2V0X3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsIEFWU3RyZWFtICpzdCwgaW50IG1heF9zaXplKQoreworICAgIFZvY0RlY0NvbnRleHQgKnZvYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkNvZGVjQ29udGV4dCAqZGVjID0gc3QtPmNvZGVjOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFZvY1R5cGUgdHlwZTsKKyAgICBpbnQgc2l6ZSwgdG1wX2NvZGVjPS0xOworICAgIGludCBzYW1wbGVfcmF0ZSA9IDA7CisgICAgaW50IGNoYW5uZWxzID0gMTsKKworICAgIHdoaWxlICghdm9jLT5yZW1haW5pbmdfc2l6ZSkgeworICAgICAgICB0eXBlID0gYXZpb19yOChwYik7CisgICAgICAgIGlmICh0eXBlID09IFZPQ19UWVBFX0VPRikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICAgICAgdm9jLT5yZW1haW5pbmdfc2l6ZSA9IGF2aW9fcmwyNChwYik7CisgICAgICAgIGlmICghdm9jLT5yZW1haW5pbmdfc2l6ZSkgeworICAgICAgICAgICAgaWYgKCFzLT5wYi0+c2Vla2FibGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIHZvYy0+cmVtYWluaW5nX3NpemUgPSBhdmlvX3NpemUocGIpIC0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgfQorICAgICAgICBtYXhfc2l6ZSAtPSA0OworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFZPQ19UWVBFX1ZPSUNFX0RBVEE6CisgICAgICAgICAgICBpZiAoIWRlYy0+c2FtcGxlX3JhdGUpIHsKKyAgICAgICAgICAgICAgICBkZWMtPnNhbXBsZV9yYXRlID0gMTAwMDAwMCAvICgyNTYgLSBhdmlvX3I4KHBiKSk7CisgICAgICAgICAgICAgICAgaWYgKHNhbXBsZV9yYXRlKQorICAgICAgICAgICAgICAgICAgICBkZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGRlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIGRlYy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICAgICAgICAgICAgICBkZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoZGVjLT5jb2RlY19pZCk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDEpOworICAgICAgICAgICAgdG1wX2NvZGVjID0gYXZpb19yOChwYik7CisgICAgICAgICAgICB2b2MtPnJlbWFpbmluZ19zaXplIC09IDI7CisgICAgICAgICAgICBtYXhfc2l6ZSAtPSAyOworICAgICAgICAgICAgY2hhbm5lbHMgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWT0NfVFlQRV9WT0lDRV9EQVRBX0NPTlQ6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZPQ19UWVBFX0VYVEVOREVEOgorICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgYXZpb19yOChwYik7CisgICAgICAgICAgICBjaGFubmVscyA9IGF2aW9fcjgocGIpICsgMTsKKyAgICAgICAgICAgIHNhbXBsZV9yYXRlID0gMjU2MDAwMDAwIC8gKGNoYW5uZWxzICogKDY1NTM2IC0gc2FtcGxlX3JhdGUpKTsKKyAgICAgICAgICAgIHZvYy0+cmVtYWluaW5nX3NpemUgPSAwOworICAgICAgICAgICAgbWF4X3NpemUgLT0gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk9DX1RZUEVfTkVXX1ZPSUNFX0RBVEE6CisgICAgICAgICAgICBpZiAoIWRlYy0+c2FtcGxlX3JhdGUpIHsKKyAgICAgICAgICAgICAgICBkZWMtPnNhbXBsZV9yYXRlID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICAgZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgICAgICBkZWMtPmNoYW5uZWxzID0gYXZpb19yOChwYik7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDYpOworICAgICAgICAgICAgdG1wX2NvZGVjID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgICAgICAgICB2b2MtPnJlbWFpbmluZ19zaXplIC09IDEyOworICAgICAgICAgICAgbWF4X3NpemUgLT0gMTI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZpb19za2lwKHBiLCB2b2MtPnJlbWFpbmluZ19zaXplKTsKKyAgICAgICAgICAgIG1heF9zaXplIC09IHZvYy0+cmVtYWluaW5nX3NpemU7CisgICAgICAgICAgICB2b2MtPnJlbWFpbmluZ19zaXplID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRtcF9jb2RlYyA+PSAwKSB7CisgICAgICAgIHRtcF9jb2RlYyA9IGZmX2NvZGVjX2dldF9pZChmZl92b2NfY29kZWNfdGFncywgdG1wX2NvZGVjKTsKKyAgICAgICAgaWYgKGRlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgICAgIGRlYy0+Y29kZWNfaWQgPSB0bXBfY29kZWM7CisgICAgICAgIGVsc2UgaWYgKGRlYy0+Y29kZWNfaWQgIT0gdG1wX2NvZGVjKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiSWdub3JpbmcgbWlkLXN0cmVhbSBjaGFuZ2UgaW4gYXVkaW8gY29kZWNcbiIpOworICAgICAgICBpZiAoZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgICAgICBpZiAocy0+YXVkaW9fY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIGNvZGVjIHRhZ1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gY29kZWMgdGFnXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlYy0+Yml0X3JhdGUgPSBkZWMtPnNhbXBsZV9yYXRlICogZGVjLT5jaGFubmVscyAqIGRlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworCisgICAgaWYgKG1heF9zaXplIDw9IDApCisgICAgICAgIG1heF9zaXplID0gMjA0ODsKKyAgICBzaXplID0gRkZNSU4odm9jLT5yZW1haW5pbmdfc2l6ZSwgbWF4X3NpemUpOworICAgIHZvYy0+cmVtYWluaW5nX3NpemUgLT0gc2l6ZTsKKyAgICByZXR1cm4gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBzaXplKTsKK30KKworc3RhdGljIGludCB2b2NfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIHJldHVybiBmZl92b2NfZ2V0X3BhY2tldChzLCBwa3QsIHMtPnN0cmVhbXNbMF0sIDApOworfQorCitBVklucHV0Rm9ybWF0IGZmX3ZvY19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2b2MiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDcmVhdGl2ZSBWb2ljZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWb2NEZWNDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB2b2NfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gdm9jX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHZvY19yZWFkX3BhY2tldCwKKyAgICAuY29kZWNfdGFnICAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyogY29uc3QgW10peyBmZl92b2NfY29kZWNfdGFncywgMCB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC92b2NlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92b2NlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI1MzJlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3ZvY2VuYy5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ3JlYXRpdmUgVm9pY2UgRmlsZSBtdXhlci4KKyAqIENvcHlyaWdodCAoYykgMjAwNiAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidm9jLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCit0eXBlZGVmIHN0cnVjdCB2b2NfZW5jX2NvbnRleHQgeworICAgIGludCBwYXJhbV93cml0dGVuOworfSBWb2NFbmNDb250ZXh0OworCitzdGF0aWMgaW50IHZvY193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBjb25zdCBpbnQgaGVhZGVyX3NpemUgPSAyNjsKKyAgICBjb25zdCBpbnQgdmVyc2lvbiA9IDB4MDExNDsKKworICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEKKyAgICAgICAgfHwgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisKKyAgICBpZiAoIWVuYy0+Y29kZWNfdGFnICYmIGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1U4KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBjb2RlY1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZpb193cml0ZShwYiwgZmZfdm9jX21hZ2ljLCBzaXplb2YoZmZfdm9jX21hZ2ljKSAtIDEpOworICAgIGF2aW9fd2wxNihwYiwgaGVhZGVyX3NpemUpOworICAgIGF2aW9fd2wxNihwYiwgdmVyc2lvbik7CisgICAgYXZpb193bDE2KHBiLCB+dmVyc2lvbiArIDB4MTIzNCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2b2Nfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBWb2NFbmNDb250ZXh0ICp2b2MgPSBzLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworCisgICAgaWYgKCF2b2MtPnBhcmFtX3dyaXR0ZW4pIHsKKyAgICAgICAgaWYgKGVuYy0+Y29kZWNfdGFnID4gMykgeworICAgICAgICAgICAgYXZpb193OChwYiwgVk9DX1RZUEVfTkVXX1ZPSUNFX0RBVEEpOworICAgICAgICAgICAgYXZpb193bDI0KHBiLCBwa3QtPnNpemUgKyAxMik7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgYXZpb193OChwYiwgZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICAgICAgYXZpb193OChwYiwgZW5jLT5jaGFubmVscyk7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIGVuYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1swXS0+Y29kZWMtPmNoYW5uZWxzID4gMSkgeworICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIFZPQ19UWVBFX0VYVEVOREVEKTsKKyAgICAgICAgICAgICAgICBhdmlvX3dsMjQocGIsIDQpOworICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgNjU1MzYtKDI1NjAwMDAwMCArIGVuYy0+c2FtcGxlX3JhdGUqZW5jLT5jaGFubmVscy8yKS8oZW5jLT5zYW1wbGVfcmF0ZSplbmMtPmNoYW5uZWxzKSk7CisgICAgICAgICAgICAgICAgYXZpb193OChwYiwgZW5jLT5jb2RlY190YWcpOworICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIGVuYy0+Y2hhbm5lbHMgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fdzgocGIsIFZPQ19UWVBFX1ZPSUNFX0RBVEEpOworICAgICAgICAgICAgYXZpb193bDI0KHBiLCBwa3QtPnNpemUgKyAyKTsKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIDI1NiAtICgxMDAwMDAwICsgZW5jLT5zYW1wbGVfcmF0ZS8yKSAvIGVuYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgYXZpb193OChwYiwgZW5jLT5jb2RlY190YWcpOworICAgICAgICB9CisgICAgICAgIHZvYy0+cGFyYW1fd3JpdHRlbiA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZpb193OChwYiwgVk9DX1RZUEVfVk9JQ0VfREFUQV9DT05UKTsKKyAgICAgICAgYXZpb193bDI0KHBiLCBwa3QtPnNpemUpOworICAgIH0KKworICAgIGF2aW9fd3JpdGUocGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2b2Nfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgYXZpb193OChzLT5wYiwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3ZvY19tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAidm9jIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ3JlYXRpdmUgVm9pY2UiKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAiYXVkaW8veC12b2MiLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJ2b2MiLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihWb2NFbmNDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSB2b2Nfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHZvY193cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgICAgID0gdm9jX3dyaXRlX3RyYWlsZXIsCisgICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgZmZfdm9jX2NvZGVjX3RhZ3MsIDAgfSwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3ZvcmJpc2NvbW1lbnQuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92b3JiaXNjb21tZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5YjY2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92b3JiaXNjb21tZW50LmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIFZvcmJpc0NvbW1lbnQgd3JpdGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSmFtZXMgRGFybmxleQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgInZvcmJpc2NvbW1lbnQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorCisvKioKKyAqIFZvcmJpc0NvbW1lbnQgbWV0YWRhdGEgY29udmVyc2lvbiBtYXBwaW5nLgorICogZnJvbSBPZ2cgVm9yYmlzIEkgZm9ybWF0IHNwZWNpZmljYXRpb246IGNvbW1lbnQgZmllbGQgYW5kIGhlYWRlciBzcGVjaWZpY2F0aW9uCisgKiBodHRwOi8veGlwaC5vcmcvdm9yYmlzL2RvYy92LWNvbW1lbnQuaHRtbAorICovCitjb25zdCBBVk1ldGFkYXRhQ29udiBmZl92b3JiaXNjb21tZW50X21ldGFkYXRhX2NvbnZbXSA9IHsKKyAgICB7ICJBTEJVTUFSVElTVCIsICJhbGJ1bV9hcnRpc3QifSwKKyAgICB7ICJUUkFDS05VTUJFUiIsICJ0cmFjayIgIH0sCisgICAgeyAiRElTQ05VTUJFUiIsICAiZGlzYyIgICB9LAorICAgIHsgIkRFU0NSSVBUSU9OIiwgImNvbW1lbnQiIH0sCisgICAgeyAwIH0KK307CisKK2ludCBmZl92b3JiaXNjb21tZW50X2xlbmd0aChBVkRpY3Rpb25hcnkgKm0sIGNvbnN0IGNoYXIgKnZlbmRvcl9zdHJpbmcpCit7CisgICAgaW50IGxlbiA9IDg7CisgICAgbGVuICs9IHN0cmxlbih2ZW5kb3Jfc3RyaW5nKTsKKyAgICBpZiAobSkgeworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKCh0YWcgPSBhdl9kaWN0X2dldChtLCAiIiwgdGFnLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICAgICAgbGVuICs9IDQgK3N0cmxlbih0YWctPmtleSkgKyAxICsgc3RybGVuKHRhZy0+dmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKK2ludCBmZl92b3JiaXNjb21tZW50X3dyaXRlKHVpbnQ4X3QgKipwLCBBVkRpY3Rpb25hcnkgKiptLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVuZG9yX3N0cmluZykKK3sKKyAgICBieXRlc3RyZWFtX3B1dF9sZTMyKHAsIHN0cmxlbih2ZW5kb3Jfc3RyaW5nKSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKHAsIHZlbmRvcl9zdHJpbmcsIHN0cmxlbih2ZW5kb3Jfc3RyaW5nKSk7CisgICAgaWYgKCptKSB7CisgICAgICAgIGludCBjb3VudCA9IGF2X2RpY3RfY291bnQoKm0pOworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnID0gTlVMTDsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMihwLCBjb3VudCk7CisgICAgICAgIHdoaWxlICgodGFnID0gYXZfZGljdF9nZXQoKm0sICIiLCB0YWcsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuMSA9IHN0cmxlbih0YWctPmtleSk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuMiA9IHN0cmxlbih0YWctPnZhbHVlKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIocCwgbGVuMSsxK2xlbjIpOworICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKHAsIHRhZy0+a2V5LCBsZW4xKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUocCwgJz0nKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcihwLCB0YWctPnZhbHVlLCBsZW4yKTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTMyKHAsIDApOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3ZvcmJpc2NvbW1lbnQuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC92b3JiaXNjb21tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyMTJkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92b3JiaXNjb21tZW50LmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIFZvcmJpc0NvbW1lbnQgd3JpdGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSmFtZXMgRGFybmxleQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1ZPUkJJU0NPTU1FTlRfSAorI2RlZmluZSBBVkZPUk1BVF9WT1JCSVNDT01NRU5UX0gKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBpbiBieXRlcyBvZiBhIFZvcmJpc0NvbW1lbnQuIFRoaXMgaXMgdGhlIG1pbmltdW0KKyAqIHNpemUgcmVxdWlyZWQgYnkgZmZfdm9yYmlzY29tbWVudF93cml0ZSgpLgorICoKKyAqIEBwYXJhbSBtIFRoZSBtZXRhZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcGFyc2VkLiBGb3Igbm8gbWV0YWRhdGEsIHNldCB0byBOVUxMLgorICogQHBhcmFtIHZlbmRvcl9zdHJpbmcgVGhlIHZlbmRvciBzdHJpbmcgdG8gYmUgYWRkZWQgaW50byB0aGUgVm9yYmlzQ29tbWVudC4KKyAqIEZvciBubyBzdHJpbmcsIHNldCB0byBhbiBlbXB0eSBzdHJpbmcuCisgKiBAcmV0dXJuIFRoZSBsZW5ndGggaW4gYnl0ZXMuCisgKi8KK2ludCBmZl92b3JiaXNjb21tZW50X2xlbmd0aChBVkRpY3Rpb25hcnkgKm0sIGNvbnN0IGNoYXIgKnZlbmRvcl9zdHJpbmcpOworCisvKioKKyAqIFdyaXRlIGEgVm9yYmlzQ29tbWVudCBpbnRvIGEgYnVmZmVyLiBUaGUgYnVmZmVyLCBwLCBtdXN0IGhhdmUgZW5vdWdoCisgKiBkYXRhIHRvIGhvbGQgdGhlIHdob2xlIFZvcmJpc0NvbW1lbnQuIFRoZSBtaW5pbXVtIHNpemUgcmVxdWlyZWQgY2FuIGJlCisgKiBvYnRhaW5lZCBieSBwYXNzaW5nIHRoZSBzYW1lIEFWRGljdGlvbmFyeSBhbmQgdmVuZG9yX3N0cmluZyB0bworICogZmZfdm9yYmlzY29tbWVudF9sZW5ndGgoKQorICoKKyAqIEBwYXJhbSBwIFRoZSBidWZmZXIgaW4gd2hpY2ggdG8gd3JpdGUuCisgKiBAcGFyYW0gbSBUaGUgbWV0YWRhdGEgc3RydWN0IHRvIHdyaXRlLgorICogQHBhcmFtIHZlbmRvcl9zdHJpbmcgVGhlIHZlbmRvciBzdHJpbmcgdG8gd3JpdGUuCisgKi8KK2ludCBmZl92b3JiaXNjb21tZW50X3dyaXRlKHVpbnQ4X3QgKipwLCBBVkRpY3Rpb25hcnkgKiptLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVuZG9yX3N0cmluZyk7CisKK2V4dGVybiBjb25zdCBBVk1ldGFkYXRhQ29udiBmZl92b3JiaXNjb21tZW50X21ldGFkYXRhX2NvbnZbXTsKKworI2VuZGlmIC8qIEFWRk9STUFUX1ZPUkJJU0NPTU1FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3ZwbGF5ZXJkZWMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92cGxheWVyZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5Y2NmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC92cGxheWVyZGVjLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQ2zDqW1lbnQgQsWTc2NoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZQbGF5ZXIgc3VidGl0bGVzIGZvcm1hdCBkZW11eGVyCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdWJ0aXRsZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSBxOworfSBWUGxheWVyQ29udGV4dDsKKworc3RhdGljIGludCB2cGxheWVyX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNoYXIgYzsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdHIgPSBwLT5idWY7CisKKyAgICBpZiAoc3NjYW5mKHB0ciwgIiUqZDolKmQ6JSpkLiUqZCVjIiwgJmMpID09IDEgJiYgc3RyY2hyKCI6ID0iLCBjKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50NjRfdCByZWFkX3RzKGNoYXIgKipsaW5lKQoreworICAgIGNoYXIgYzsKKyAgICBpbnQgaGgsIG1tLCBzcywgbXMsIGxlbjsKKworICAgIGlmIChzc2NhbmYoKmxpbmUsICIlZDolZDolZC4lZCVjJW4iLAorICAgICAgICAgICAgICAgJmhoLCAmbW0sICZzcywgJm1zLCAmYywgJmxlbikgPj0gNSkgeworICAgICAgICAqbGluZSArPSBsZW47CisgICAgICAgIHJldHVybiAoaGgqMzYwMExMICsgbW0qNjBMTCArIHNzKSAqIDEwMExMICsgbXM7CisgICAgfQorICAgIHJldHVybiBBVl9OT1BUU19WQUxVRTsKK30KKworc3RhdGljIGludCB2cGxheWVyX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBWUGxheWVyQ29udGV4dCAqdnBsYXllciA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworCisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVlBMQVlFUjsKKworICAgIHdoaWxlICghYXZpb19mZW9mKHMtPnBiKSkgeworICAgICAgICBjaGFyIGxpbmVbNDA5Nl07CisgICAgICAgIGNoYXIgKnAgPSBsaW5lOworICAgICAgICBjb25zdCBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgIGludCBsZW4gPSBmZl9nZXRfbGluZShzLT5wYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKyAgICAgICAgaW50NjRfdCBwdHNfc3RhcnQ7CisKKyAgICAgICAgaWYgKCFsZW4pCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBsaW5lW3N0cmNzcG4obGluZSwgIlxyXG4iKV0gPSAwOworCisgICAgICAgIHB0c19zdGFydCA9IHJlYWRfdHMoJnApOworICAgICAgICBpZiAocHRzX3N0YXJ0ICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBBVlBhY2tldCAqc3ViOworCisgICAgICAgICAgICBzdWIgPSBmZl9zdWJ0aXRsZXNfcXVldWVfaW5zZXJ0KCZ2cGxheWVyLT5xLCBwLCBzdHJsZW4ocCksIDApOworICAgICAgICAgICAgaWYgKCFzdWIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIHN1Yi0+cG9zID0gcG9zOworICAgICAgICAgICAgc3ViLT5wdHMgPSBwdHNfc3RhcnQ7CisgICAgICAgICAgICBzdWItPmR1cmF0aW9uID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfZmluYWxpemUoJnZwbGF5ZXItPnEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwbGF5ZXJfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFZQbGF5ZXJDb250ZXh0ICp2cGxheWVyID0gcy0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl9zdWJ0aXRsZXNfcXVldWVfcmVhZF9wYWNrZXQoJnZwbGF5ZXItPnEsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgdnBsYXllcl9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncykKK3sKKyAgICBWUGxheWVyQ29udGV4dCAqdnBsYXllciA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJnZwbGF5ZXItPnEsIHMsIHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdnBsYXllcl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBWUGxheWVyQ29udGV4dCAqdnBsYXllciA9IHMtPnByaXZfZGF0YTsKKyAgICBmZl9zdWJ0aXRsZXNfcXVldWVfY2xlYW4oJnZwbGF5ZXItPnEpOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3ZwbGF5ZXJfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidnBsYXllciIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZQbGF5ZXIgc3VidGl0bGVzIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZQbGF5ZXJDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB2cGxheWVyX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHZwbGF5ZXJfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gdnBsYXllcl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrMiAgICAgPSB2cGxheWVyX3JlYWRfc2VlaywKKyAgICAucmVhZF9jbG9zZSAgICAgPSB2cGxheWVyX3JlYWRfY2xvc2UsCisgICAgLmV4dGVuc2lvbnMgICAgID0gInR4dCIsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3ZxZi5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3ZxZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTgyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvdnFmLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBWUUYgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IFZpdG9yIFNlc3NhaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgInJpZmYuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVnFmQ29udGV4dCB7CisgICAgaW50IGZyYW1lX2JpdF9sZW47CisgICAgdWludDhfdCBsYXN0X2ZyYW1lX2JpdHM7CisgICAgaW50IHJlbWFpbmluZ19iaXRzOworfSBWcWZDb250ZXh0OworCitzdGF0aWMgaW50IHZxZl9wcm9iZShBVlByb2JlRGF0YSAqcHJvYmVfcGFja2V0KQoreworICAgIGlmIChBVl9STDMyKHByb2JlX3BhY2tldC0+YnVmKSAhPSBNS1RBRygnVCcsJ1cnLCdJJywnTicpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghbWVtY21wKHByb2JlX3BhY2tldC0+YnVmICsgNCwgIjk3MDEyMDAwIiwgOCkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKworICAgIGlmICghbWVtY21wKHByb2JlX3BhY2tldC0+YnVmICsgNCwgIjAwMDUyMjAwIiwgOCkpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKworICAgIGlmIChBVl9STDMyKHByb2JlX3BhY2tldC0+YnVmICsgMTIpID4gKDE8PDI3KSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OLzI7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9tZXRhZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFnX2xlbiwgdW5zaWduZWQgaW50IHJlbWFpbmluZykKK3sKKyAgICBpbnQgbGVuID0gRkZNSU4odGFnX2xlbiwgcmVtYWluaW5nKTsKKyAgICBjaGFyICpidWYsIGtleVs1XSA9IHswfTsKKworICAgIGlmIChsZW4gPT0gVUlOVF9NQVgpCisgICAgICAgIHJldHVybjsKKworICAgIGJ1ZiA9IGF2X21hbGxvYyhsZW4rMSk7CisgICAgaWYgKCFidWYpCisgICAgICAgIHJldHVybjsKKyAgICBhdmlvX3JlYWQocy0+cGIsIGJ1ZiwgbGVuKTsKKyAgICBidWZbbGVuXSA9IDA7CisgICAgQVZfV0wzMihrZXksIHRhZyk7CisgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBrZXksIGJ1ZiwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworfQorCitzdGF0aWMgY29uc3QgQVZNZXRhZGF0YUNvbnYgdnFmX21ldGFkYXRhX2NvbnZbXSA9IHsKKyAgICB7ICIoYykgIiwgImNvcHlyaWdodCIgfSwKKyAgICB7ICJBUk5HIiwgImFycmFuZ2VyIiAgfSwKKyAgICB7ICJBVVRIIiwgImF1dGhvciIgICAgfSwKKyAgICB7ICJCQU5EIiwgImJhbmQiICAgICAgfSwKKyAgICB7ICJDRENUIiwgImNvbmR1Y3RvciIgfSwKKyAgICB7ICJDT01UIiwgImNvbW1lbnQiICAgfSwKKyAgICB7ICJGSUxFIiwgImZpbGVuYW1lIiAgfSwKKyAgICB7ICJHRU5SIiwgImdlbnJlIiAgICAgfSwKKyAgICB7ICJMQUJMIiwgInB1Ymxpc2hlciIgfSwKKyAgICB7ICJNVVNDIiwgImNvbXBvc2VyIiAgfSwKKyAgICB7ICJOQU1FIiwgInRpdGxlIiAgICAgfSwKKyAgICB7ICJOT1RFIiwgIm5vdGUiICAgICAgfSwKKyAgICB7ICJQUk9EIiwgInByb2R1Y2VyIiAgfSwKKyAgICB7ICJQUlNOIiwgInBlcnNvbm5lbCIgfSwKKyAgICB7ICJSRU1YIiwgInJlbWl4ZXIiICAgfSwKKyAgICB7ICJTSU5HIiwgInNpbmdlciIgICAgfSwKKyAgICB7ICJUUkNLIiwgInRyYWNrIiAgICAgfSwKKyAgICB7ICJXT1JEIiwgIndvcmRzIiAgICAgfSwKKyAgICB7IDAgfSwKK307CisKK3N0YXRpYyBpbnQgdnFmX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBWcWZDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCAgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGludCBjaHVua190YWc7CisgICAgaW50IHJhdGVfZmxhZyA9IC0xOworICAgIGludCBoZWFkZXJfc2l6ZTsKKyAgICBpbnQgcmVhZF9iaXRyYXRlID0gMDsKKyAgICBpbnQgc2l6ZTsKKyAgICB1aW50OF90IGNvbW1fY2h1bmtbMTJdOworCisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2aW9fc2tpcChzLT5wYiwgMTIpOworCisgICAgaGVhZGVyX3NpemUgPSBhdmlvX3JiMzIocy0+cGIpOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1RXSU5WUTsKKyAgICBzdC0+c3RhcnRfdGltZSA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGludCBsZW47CisgICAgICAgIGNodW5rX3RhZyA9IGF2aW9fcmwzMihzLT5wYik7CisKKyAgICAgICAgaWYgKGNodW5rX3RhZyA9PSBNS1RBRygnRCcsJ0EnLCdUJywnQScpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbGVuID0gYXZpb19yYjMyKHMtPnBiKTsKKworICAgICAgICBpZiAoKHVuc2lnbmVkKSBsZW4gPiBJTlRfTUFYLzIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJNYWxmb3JtZWQgaGVhZGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGhlYWRlcl9zaXplIC09IDg7CisKKyAgICAgICAgc3dpdGNoKGNodW5rX3RhZyl7CisgICAgICAgIGNhc2UgTUtUQUcoJ0MnLCdPJywnTScsJ00nKToKKyAgICAgICAgICAgIGF2aW9fcmVhZChzLT5wYiwgY29tbV9jaHVuaywgMTIpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IEFWX1JCMzIoY29tbV9jaHVuayAgICApICsgMTsKKyAgICAgICAgICAgIHJlYWRfYml0cmF0ZSAgICAgICAgPSBBVl9SQjMyKGNvbW1fY2h1bmsgKyA0KTsKKyAgICAgICAgICAgIHJhdGVfZmxhZyAgICAgICAgICAgPSBBVl9SQjMyKGNvbW1fY2h1bmsgKyA4KTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgbGVuLTEyKTsKKworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPD0gMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVsc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICAgICAgICAgICAgID0gcmVhZF9iaXRyYXRlKjEwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnRCcsJ1MnLCdJJywnWicpOiAvLyBzaXplIG9mIGNvbXByZXNzZWQgZGF0YQorICAgICAgICB7CisgICAgICAgICAgICBhdl9kaWN0X3NldF9pbnQoJnMtPm1ldGFkYXRhLCAic2l6ZSIsIGF2aW9fcmIzMihzLT5wYiksIDApOworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnWScsJ0UnLCdBJywnUicpOiAvLyByZWNvcmRpbmcgZGF0ZQorICAgICAgICBjYXNlIE1LVEFHKCdFJywnTicsJ0MnLCdEJyk6IC8vIGNvbXByZXNzaW9uIGRhdGUKKyAgICAgICAgY2FzZSBNS1RBRygnRScsJ1gnLCdUJywnUicpOiAvLyByZXNlcnZlZAorICAgICAgICBjYXNlIE1LVEFHKCdfJywnWScsJ00nLCdIJyk6IC8vIHJlc2VydmVkCisgICAgICAgIGNhc2UgTUtUQUcoJ18nLCdOJywnVCcsJ1QnKTogLy8gcmVzZXJ2ZWQKKyAgICAgICAgY2FzZSBNS1RBRygnXycsJ0knLCdEJywnMycpOiAvLyByZXNlcnZlZCBmb3IgSUQzIHRhZ3MKKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgRkZNSU4obGVuLCBoZWFkZXJfc2l6ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhZGRfbWV0YWRhdGEocywgY2h1bmtfdGFnLCBsZW4sIGhlYWRlcl9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaGVhZGVyX3NpemUgLT0gbGVuOworCisgICAgfSB3aGlsZSAoaGVhZGVyX3NpemUgPj0gMCAmJiAhYXZpb19mZW9mKHMtPnBiKSk7CisKKyAgICBzd2l0Y2ggKHJhdGVfZmxhZykgeworICAgIGNhc2UgLTE6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDT01NIHRhZyBub3QgZm91bmQhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgNDQ6CisgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSA0NDEwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjoKKyAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDIyMDUwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDExOgorICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gMTEwMjU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChyYXRlX2ZsYWcgPCA4IHx8IHJhdGVfZmxhZyA+IDQ0KSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCByYXRlIGZsYWcgJWRcbiIsIHJhdGVfZmxhZyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gcmF0ZV9mbGFnKjEwMDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChyZWFkX2JpdHJhdGUgLyBzdC0+Y29kZWMtPmNoYW5uZWxzIDwgIDggfHwKKyAgICAgICAgcmVhZF9iaXRyYXRlIC8gc3QtPmNvZGVjLT5jaGFubmVscyA+IDQ4KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGJpdHJhdGUgcGVyIGNoYW5uZWwgJWRcbiIsCisgICAgICAgICAgICAgICByZWFkX2JpdHJhdGUgLyBzdC0+Y29kZWMtPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3dpdGNoICgoKHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUvMTAwMCkgPDwgOCkgKworICAgICAgICAgICAgcmVhZF9iaXRyYXRlL3N0LT5jb2RlYy0+Y2hhbm5lbHMpIHsKKyAgICBjYXNlICgxMTw8OCkgKyA4IDoKKyAgICBjYXNlICg4IDw8OCkgKyA4IDoKKyAgICBjYXNlICgxMTw8OCkgKyAxMDoKKyAgICBjYXNlICgyMjw8OCkgKyAzMjoKKyAgICAgICAgc2l6ZSA9IDUxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAoMTY8PDgpICsgMTY6CisgICAgY2FzZSAoMjI8PDgpICsgMjA6CisgICAgY2FzZSAoMjI8PDgpICsgMjQ6CisgICAgICAgIHNpemUgPSAxMDI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlICg0NDw8OCkgKyA0MDoKKyAgICBjYXNlICg0NDw8OCkgKyA0ODoKKyAgICAgICAgc2l6ZSA9IDIwNDg7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJNb2RlIG5vdCBzdXBvcnRlZDogJWQgSHosICVkIGtiL3MuXG4iLAorICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSwgc3QtPmNvZGVjLT5iaXRfcmF0ZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYy0+ZnJhbWVfYml0X2xlbiA9IHN0LT5jb2RlYy0+Yml0X3JhdGUqc2l6ZS9zdC0+Y29kZWMtPnNhbXBsZV9yYXRlOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBzaXplLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKworICAgIC8qIHB1dCBmaXJzdCAxMiBieXRlcyBvZiBDT01NIGNodW5rIGluIGV4dHJhZGF0YSAqLworICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCAxMikpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBjb21tX2NodW5rLCAxMik7CisKKyAgICBmZl9tZXRhZGF0YV9jb252X2N0eChzLCBOVUxMLCB2cWZfbWV0YWRhdGFfY29udik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cWZfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFZxZkNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKyAgICBpbnQgc2l6ZSA9IChjLT5mcmFtZV9iaXRfbGVuIC0gYy0+cmVtYWluaW5nX2JpdHMgKyA3KT4+MzsKKworICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSsyKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBwa3QtPnBvcyAgICAgICAgICA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIHBrdC0+ZHVyYXRpb24gICAgID0gMTsKKworICAgIHBrdC0+ZGF0YVswXSA9IDggLSBjLT5yZW1haW5pbmdfYml0czsgLy8gTnVtYmVyIG9mIGJpdHMgdG8gc2tpcAorICAgIHBrdC0+ZGF0YVsxXSA9IGMtPmxhc3RfZnJhbWVfYml0czsKKyAgICByZXQgPSBhdmlvX3JlYWQocy0+cGIsIHBrdC0+ZGF0YSsyLCBzaXplKTsKKworICAgIGlmIChyZXQgIT0gc2l6ZSkgeworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGMtPmxhc3RfZnJhbWVfYml0cyA9IHBrdC0+ZGF0YVtzaXplKzFdOworICAgIGMtPnJlbWFpbmluZ19iaXRzICA9IChzaXplIDw8IDMpIC0gYy0+ZnJhbWVfYml0X2xlbiArIGMtPnJlbWFpbmluZ19iaXRzOworCisgICAgcmV0dXJuIHNpemUrMjsKK30KKworc3RhdGljIGludCB2cWZfcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX2luZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQoreworICAgIFZxZkNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCByZXQ7CisgICAgaW50NjRfdCBwb3M7CisKKyAgICBzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKKyAgICBwb3MgPSBhdl9yZXNjYWxlX3JuZCh0aW1lc3RhbXAgKiBzdC0+Y29kZWMtPmJpdF9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UuZGVuICogKGludDY0X3QpYy0+ZnJhbWVfYml0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBVlNFRUtfRkxBR19CQUNLV0FSRCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUk9VTkRfRE9XTiA6IEFWX1JPVU5EX1VQKTsKKyAgICBwb3MgKj0gYy0+ZnJhbWVfYml0X2xlbjsKKworICAgIHN0LT5jdXJfZHRzID0gYXZfcmVzY2FsZShwb3MsIHN0LT50aW1lX2Jhc2UuZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICogKGludDY0X3Qpc3QtPnRpbWVfYmFzZS5udW0pOworCisgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocy0+cGIsICgocG9zLTcpID4+IDMpICsgcy0+ZGF0YV9vZmZzZXQsIFNFRUtfU0VUKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYy0+cmVtYWluaW5nX2JpdHMgPSAtNyAtICgocG9zLTcpJjcpOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3ZxZl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2cWYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJOaXBwb24gVGVsZWdyYXBoIGFuZCBUZWxlcGhvbmUgQ29ycG9yYXRpb24gKE5UVCkgVHdpblZRIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZxZkNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHZxZl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSB2cWZfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gdnFmX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IHZxZl9yZWFkX3NlZWssCisgICAgLmV4dGVuc2lvbnMgICAgID0gInZxZix2cWwsdnFlIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvdzY0LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvdzY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyZDkwYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93NjQuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IERhbmllbCBWZXJrYW1wCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ3NjQuaCIKKworY29uc3QgdWludDhfdCBmZl93NjRfZ3VpZF9yaWZmWzE2XSA9IHsKKyAgICAncicsICdpJywgJ2YnLCAnZicsCisgICAgMHgyRSwgMHg5MSwgMHhDRiwgMHgxMSwgMHhBNSwgMHhENiwgMHgyOCwgMHhEQiwgMHgwNCwgMHhDMSwgMHgwMCwgMHgwMAorfTsKKworY29uc3QgdWludDhfdCBmZl93NjRfZ3VpZF93YXZlWzE2XSA9IHsKKyAgICAndycsICdhJywgJ3YnLCAnZScsCisgICAgMHhGMywgMHhBQywgMHhEMywgMHgxMSwgMHg4QywgMHhEMSwgMHgwMCwgMHhDMCwgMHg0RiwgMHg4RSwgMHhEQiwgMHg4QQorfTsKKworY29uc3QgdWludDhfdCBmZl93NjRfZ3VpZF9mbXQgWzE2XSA9IHsKKyAgICAnZicsICdtJywgJ3QnLCAnICcsCisgICAgMHhGMywgMHhBQywgMHhEMywgMHgxMSwgMHg4QywgMHhEMSwgMHgwMCwgMHhDMCwgMHg0RiwgMHg4RSwgMHhEQiwgMHg4QQorfTsKKworY29uc3QgdWludDhfdCBmZl93NjRfZ3VpZF9mYWN0WzE2XSA9IHsgJ2YnLCAnYScsICdjJywgJ3QnLAorICAgIDB4RjMsIDB4QUMsIDB4RDMsIDB4MTEsIDB4OEMsIDB4RDEsIDB4MDAsIDB4QzAsIDB4NEYsIDB4OEUsIDB4REIsIDB4OEEKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdzY0X2d1aWRfZGF0YVsxNl0gPSB7CisgICAgJ2QnLCAnYScsICd0JywgJ2EnLAorICAgIDB4RjMsIDB4QUMsIDB4RDMsIDB4MTEsIDB4OEMsIDB4RDEsIDB4MDAsIDB4QzAsIDB4NEYsIDB4OEUsIDB4REIsIDB4OEEKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdzY0X2d1aWRfc3VtbWFyeWxpc3RbMTZdID0geworICAgIDB4QkMsIDB4OTQsIDB4NUYsIDB4OTIsCisgICAgMHg1QSwgMHg1MiwgMHhEMiwgMHgxMSwgMHg4NiwgMHhEQywgMHgwMCwgMHhDMCwgMHg0RiwgMHg4RSwgMHhEQiwgMHg4QQorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC93NjQuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC93NjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWMzZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3c2NC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9XNjRfSAorI2RlZmluZSBBVkZPUk1BVF9XNjRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3c2NF9ndWlkX3JpZmZbMTZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdzY0X2d1aWRfd2F2ZVsxNl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl93NjRfZ3VpZF9mbXQgWzE2XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3c2NF9ndWlkX2ZhY3RbMTZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdzY0X2d1aWRfZGF0YVsxNl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl93NjRfZ3VpZF9zdW1tYXJ5bGlzdFsxNl07CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9XNjRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3dhdmRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3dhdmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNGUyZGYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvd2F2ZGVjLmMKQEAgLTAsMCArMSw3NDUgQEAKKy8qCisgKiBXQVYgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFNvbnkgV2F2ZTY0IGRlbXV4ZXIKKyAqIFJGNjQgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA5IERhbmllbCBWZXJrYW1wCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJwY20uaCIKKyNpbmNsdWRlICJyaWZmLmgiCisjaW5jbHVkZSAidzY0LmgiCisjaW5jbHVkZSAic3BkaWYuaCIKKwordHlwZWRlZiBzdHJ1Y3QgV0FWRGVtdXhDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQ2NF90IGRhdGFfZW5kOworICAgIGludCB3NjQ7CisgICAgaW50NjRfdCBzbXZfZGF0YV9vZnM7CisgICAgaW50IHNtdl9ibG9ja19zaXplOworICAgIGludCBzbXZfZnJhbWVzX3Blcl9qcGVnOworICAgIGludCBzbXZfYmxvY2s7CisgICAgaW50IHNtdl9sYXN0X3N0cmVhbTsKKyAgICBpbnQgc212X2VvZjsKKyAgICBpbnQgYXVkaW9fZW9mOworICAgIGludCBpZ25vcmVfbGVuZ3RoOworICAgIGludCBzcGRpZjsKKyAgICBpbnQgc212X2N1cl9wdDsKKyAgICBpbnQgc212X2dpdmVuX2ZpcnN0OworICAgIGludCB1bmFsaWduZWQ7IC8vIGUuZy4gaWYgYW4gb2RkIG51bWJlciBvZiBieXRlcyBJRDMgdGFnIHdhcyBwcmVwZW5kZWQKK30gV0FWRGVtdXhDb250ZXh0OworCisjaWYgQ09ORklHX1dBVl9ERU1VWEVSCisKK3N0YXRpYyBpbnQ2NF90IG5leHRfdGFnKEFWSU9Db250ZXh0ICpwYiwgdWludDMyX3QgKnRhZykKK3sKKyAgICAqdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICByZXR1cm4gYXZpb19ybDMyKHBiKTsKK30KKworLyogUklGRiBjaHVua3MgYXJlIGFsd2F5cyBhdCBldmVuIG9mZnNldHMgcmVsYXRpdmUgdG8gd2hlcmUgdGhleSBzdGFydC4gKi8KK3N0YXRpYyBpbnQ2NF90IHdhdl9zZWVrX3RhZyhXQVZEZW11eENvbnRleHQgKiB3YXYsIEFWSU9Db250ZXh0ICpzLCBpbnQ2NF90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKyAgICBvZmZzZXQgKz0gb2Zmc2V0IDwgSU5UNjRfTUFYICYmIG9mZnNldCArIHdhdi0+dW5hbGlnbmVkICYgMTsKKworICAgIHJldHVybiBhdmlvX3NlZWsocywgb2Zmc2V0LCB3aGVuY2UpOworfQorCisvKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZvdW5kIHRhZyAqLworc3RhdGljIGludDY0X3QgZmluZF90YWcoV0FWRGVtdXhDb250ZXh0ICogd2F2LCBBVklPQ29udGV4dCAqcGIsIHVpbnQzMl90IHRhZzEpCit7CisgICAgdW5zaWduZWQgaW50IHRhZzsKKyAgICBpbnQ2NF90IHNpemU7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICBzaXplID0gbmV4dF90YWcocGIsICZ0YWcpOworICAgICAgICBpZiAodGFnID09IHRhZzEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgd2F2X3NlZWtfdGFnKHdhdiwgcGIsIHNpemUsIFNFRUtfQ1VSKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgd2F2X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIC8qIGNoZWNrIGZpbGUgaGVhZGVyICovCisgICAgaWYgKHAtPmJ1Zl9zaXplIDw9IDMyKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIW1lbWNtcChwLT5idWYgKyA4LCAiV0FWRSIsIDQpKSB7CisgICAgICAgIGlmICghbWVtY21wKHAtPmJ1ZiwgIlJJRkYiLCA0KSkKKyAgICAgICAgICAgIC8qIFNpbmNlIHRoZSBBQ1QgZGVtdXhlciBoYXMgYSBzdGFuZGFyZCBXQVYgaGVhZGVyIGF0IHRoZSB0b3Agb2YKKyAgICAgICAgICAgICAqIGl0cyBvd24sIHRoZSByZXR1cm5lZCBzY29yZSBpcyBkZWNyZWFzZWQgdG8gYXZvaWQgYSBwcm9iZQorICAgICAgICAgICAgICogY29uZmxpY3QgYmV0d2VlbiBBQ1QgYW5kIFdBVi4gKi8KKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAtIDE7CisgICAgICAgIGVsc2UgaWYgKCFtZW1jbXAocC0+YnVmLCAgICAgICJSRjY0IiwgNCkgJiYKKyAgICAgICAgICAgICAgICAgIW1lbWNtcChwLT5idWYgKyAxMiwgImRzNjQiLCA0KSkKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9zdHJlYW1fcHJvYmluZyhBVlN0cmVhbSAqc3QpCit7CisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkxFKSB7CisgICAgICAgIHN0LT5yZXF1ZXN0X3Byb2JlID0gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047CisgICAgICAgIHN0LT5wcm9iZV9wYWNrZXRzID0gRkZNSU4oc3QtPnByb2JlX3BhY2tldHMsIDE0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgd2F2X3BhcnNlX2ZtdF90YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IHNpemUsIEFWU3RyZWFtICoqc3QpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHJldDsKKworICAgIC8qIHBhcnNlIGZtdCBoZWFkZXIgKi8KKyAgICAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghKnN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocGIsICgqc3QpLT5jb2RlYywgc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaGFuZGxlX3N0cmVhbV9wcm9iaW5nKCpzdCk7CisKKyAgICAoKnN0KS0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKCpzdCwgNjQsIDEsICgqc3QpLT5jb2RlYy0+c2FtcGxlX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdhdl9wYXJzZV9iZXh0X3N0cmluZyhBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKQoreworICAgIGNoYXIgdGVtcFsyNTddOworICAgIGludCByZXQ7CisKKyAgICBhdl9hc3NlcnQwKGxlbmd0aCA8PSBzaXplb2YodGVtcCkpOworICAgIGlmICgocmV0ID0gYXZpb19yZWFkKHMtPnBiLCB0ZW1wLCBsZW5ndGgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICB0ZW1wW2xlbmd0aF0gPSAwOworCisgICAgaWYgKHN0cmxlbih0ZW1wKSkKKyAgICAgICAgcmV0dXJuIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwga2V5LCB0ZW1wLCAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdhdl9wYXJzZV9iZXh0X3RhZyhBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3Qgc2l6ZSkKK3sKKyAgICBjaGFyIHRlbXBbMTMxXSwgKmNvZGluZ19oaXN0b3J5OworICAgIGludCByZXQsIHg7CisgICAgdWludDY0X3QgdGltZV9yZWZlcmVuY2U7CisgICAgaW50NjRfdCB1bWlkX3BhcnRzWzhdLCB1bWlkX21hc2sgPSAwOworCisgICAgaWYgKChyZXQgPSB3YXZfcGFyc2VfYmV4dF9zdHJpbmcocywgImRlc2NyaXB0aW9uIiwgMjU2KSkgPCAwIHx8CisgICAgICAgIChyZXQgPSB3YXZfcGFyc2VfYmV4dF9zdHJpbmcocywgIm9yaWdpbmF0b3IiLCAzMikpIDwgMCB8fAorICAgICAgICAocmV0ID0gd2F2X3BhcnNlX2JleHRfc3RyaW5nKHMsICJvcmlnaW5hdG9yX3JlZmVyZW5jZSIsIDMyKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSB3YXZfcGFyc2VfYmV4dF9zdHJpbmcocywgIm9yaWdpbmF0aW9uX2RhdGUiLCAxMCkpIDwgMCB8fAorICAgICAgICAocmV0ID0gd2F2X3BhcnNlX2JleHRfc3RyaW5nKHMsICJvcmlnaW5hdGlvbl90aW1lIiwgOCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHRpbWVfcmVmZXJlbmNlID0gYXZpb19ybDY0KHMtPnBiKTsKKyAgICBzbnByaW50Zih0ZW1wLCBzaXplb2YodGVtcCksICIlIlBSSXU2NCwgdGltZV9yZWZlcmVuY2UpOworICAgIGlmICgocmV0ID0gYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCAidGltZV9yZWZlcmVuY2UiLCB0ZW1wLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogY2hlY2sgaWYgdmVyc2lvbiBpcyA+PSAxLCBpbiB3aGljaCBjYXNlIGFuIFVNSUQgbWF5IGJlIHByZXNlbnQgKi8KKyAgICBpZiAoYXZpb19ybDE2KHMtPnBiKSA+PSAxKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICB1bWlkX21hc2sgfD0gdW1pZF9wYXJ0c1t4XSA9IGF2aW9fcmI2NChzLT5wYik7CisKKyAgICAgICAgaWYgKHVtaWRfbWFzaykgeworICAgICAgICAgICAgLyogdGhlIHN0cmluZyBmb3JtYXR0aW5nIGJlbG93IGlzIHBlciBTTVBURSAzMzBNLTIwMDQgQW5uZXggQyAqLworICAgICAgICAgICAgaWYgKHVtaWRfcGFydHNbNF0gPT0gMCAmJiB1bWlkX3BhcnRzWzVdID09IDAgJiYKKyAgICAgICAgICAgICAgICB1bWlkX3BhcnRzWzZdID09IDAgJiYgdW1pZF9wYXJ0c1s3XSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogYmFzaWMgVU1JRCAqLworICAgICAgICAgICAgICAgIHNucHJpbnRmKHRlbXAsIHNpemVvZih0ZW1wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMHglMDE2IlBSSVg2NCIlMDE2IlBSSVg2NCIlMDE2IlBSSVg2NCIlMDE2IlBSSVg2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bWlkX3BhcnRzWzBdLCB1bWlkX3BhcnRzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVtaWRfcGFydHNbMl0sIHVtaWRfcGFydHNbM10pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBleHRlbmRlZCBVTUlEICovCisgICAgICAgICAgICAgICAgc25wcmludGYodGVtcCwgc2l6ZW9mKHRlbXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICIweCUwMTYiUFJJWDY0IiUwMTYiUFJJWDY0IiUwMTYiUFJJWDY0IiUwMTYiUFJJWDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgIiUwMTYiUFJJWDY0IiUwMTYiUFJJWDY0IiUwMTYiUFJJWDY0IiUwMTYiUFJJWDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVtaWRfcGFydHNbMF0sIHVtaWRfcGFydHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdW1pZF9wYXJ0c1syXSwgdW1pZF9wYXJ0c1szXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bWlkX3BhcnRzWzRdLCB1bWlkX3BhcnRzWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVtaWRfcGFydHNbNl0sIHVtaWRfcGFydHNbN10pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgInVtaWQiLCB0ZW1wLCAwKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBhdmlvX3NraXAocy0+cGIsIDE5MCk7CisgICAgfSBlbHNlCisgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgMjU0KTsKKworICAgIGlmIChzaXplID4gNjAyKSB7CisgICAgICAgIC8qIENvZGluZ0hpc3RvcnkgcHJlc2VudCAqLworICAgICAgICBzaXplIC09IDYwMjsKKworICAgICAgICBpZiAoIShjb2RpbmdfaGlzdG9yeSA9IGF2X21hbGxvYyhzaXplICsgMSkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBpZiAoKHJldCA9IGF2aW9fcmVhZChzLT5wYiwgY29kaW5nX2hpc3RvcnksIHNpemUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGNvZGluZ19oaXN0b3J5W3NpemVdID0gMDsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJjb2RpbmdfaGlzdG9yeSIsIGNvZGluZ19oaXN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWTWV0YWRhdGFDb252IHdhdl9tZXRhZGF0YV9jb252W10gPSB7CisgICAgeyAiZGVzY3JpcHRpb24iLCAgICAgICJjb21tZW50IiAgICAgICB9LAorICAgIHsgIm9yaWdpbmF0b3IiLCAgICAgICAiZW5jb2RlZF9ieSIgICAgfSwKKyAgICB7ICJvcmlnaW5hdGlvbl9kYXRlIiwgImRhdGUiICAgICAgICAgIH0sCisgICAgeyAib3JpZ2luYXRpb25fdGltZSIsICJjcmVhdGlvbl90aW1lIiB9LAorICAgIHsgMCB9LAorfTsKKworLyogd2F2IGlucHV0ICovCitzdGF0aWMgaW50IHdhdl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50NjRfdCBzaXplLCBhdl91bmluaXQoZGF0YV9zaXplKTsKKyAgICBpbnQ2NF90IHNhbXBsZV9jb3VudCA9IDA7CisgICAgaW50IHJmNjQ7CisgICAgdWludDMyX3QgdGFnOworICAgIEFWSU9Db250ZXh0ICpwYiAgICAgID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0ICAgICAgICAgPSBOVUxMOworICAgIFdBVkRlbXV4Q29udGV4dCAqd2F2ID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQsIGdvdF9mbXQgPSAwOworICAgIGludDY0X3QgbmV4dF90YWdfb2ZzLCBkYXRhX29mcyA9IC0xOworCisgICAgd2F2LT51bmFsaWduZWQgPSBhdmlvX3RlbGwocy0+cGIpICYgMTsKKworICAgIHdhdi0+c212X2RhdGFfb2ZzID0gLTE7CisKKyAgICAvKiBjaGVjayBSSUZGIGhlYWRlciAqLworICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisKKyAgICByZjY0ID0gdGFnID09IE1LVEFHKCdSJywgJ0YnLCAnNicsICc0Jyk7CisgICAgaWYgKCFyZjY0ICYmIHRhZyAhPSBNS1RBRygnUicsICdJJywgJ0YnLCAnRicpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBhdmlvX3JsMzIocGIpOyAvKiBmaWxlIHNpemUgKi8KKyAgICB0YWcgPSBhdmlvX3JsMzIocGIpOworICAgIGlmICh0YWcgIT0gTUtUQUcoJ1cnLCAnQScsICdWJywgJ0UnKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAocmY2NCkgeworICAgICAgICBpZiAoYXZpb19ybDMyKHBiKSAhPSBNS1RBRygnZCcsICdzJywgJzYnLCAnNCcpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHNpemUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAoc2l6ZSA8IDI0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGF2aW9fcmw2NChwYik7IC8qIFJJRkYgc2l6ZSAqLworCisgICAgICAgIGRhdGFfc2l6ZSAgICA9IGF2aW9fcmw2NChwYik7CisgICAgICAgIHNhbXBsZV9jb3VudCA9IGF2aW9fcmw2NChwYik7CisKKyAgICAgICAgaWYgKGRhdGFfc2l6ZSA8IDAgfHwgc2FtcGxlX2NvdW50IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm5lZ2F0aXZlIGRhdGFfc2l6ZSBhbmQvb3Igc2FtcGxlX2NvdW50IGluICIKKyAgICAgICAgICAgICAgICAgICAiZHM2NDogZGF0YV9zaXplID0gJSJQUklkNjQiLCBzYW1wbGVfY291bnQgPSAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplLCBzYW1wbGVfY291bnQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gMjQpOyAvKiBza2lwIHJlc3Qgb2YgZHM2NCBjaHVuayAqLworCisgICAgfQorCisgICAgZm9yICg7OykgeworICAgICAgICBBVlN0cmVhbSAqdnN0OworICAgICAgICBzaXplICAgICAgICAgPSBuZXh0X3RhZyhwYiwgJnRhZyk7CisgICAgICAgIG5leHRfdGFnX29mcyA9IGF2aW9fdGVsbChwYikgKyBzaXplOworCisgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgY2FzZSBNS1RBRygnZicsICdtJywgJ3QnLCAnICcpOgorICAgICAgICAgICAgLyogb25seSBwYXJzZSB0aGUgZmlyc3QgJ2ZtdCAnIHRhZyBmb3VuZCAqLworICAgICAgICAgICAgaWYgKCFnb3RfZm10ICYmIChyZXQgPSB3YXZfcGFyc2VfZm10X3RhZyhzLCBzaXplLCAmc3QpKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlIGlmIChnb3RfZm10KQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgImZvdW5kIG1vcmUgdGhhbiBvbmUgJ2ZtdCAnIHRhZ1xuIik7CisKKyAgICAgICAgICAgIGdvdF9mbXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ2QnLCAnYScsICd0JywgJ2EnKToKKyAgICAgICAgICAgIGlmICghZ290X2ZtdCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJmb3VuZCBubyAnZm10ICcgdGFnIGJlZm9yZSB0aGUgJ2RhdGEnIHRhZ1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZjY0KSB7CisgICAgICAgICAgICAgICAgbmV4dF90YWdfb2ZzID0gd2F2LT5kYXRhX2VuZCA9IGF2aW9fdGVsbChwYikgKyBkYXRhX3NpemU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSAgICA9IHNpemU7CisgICAgICAgICAgICAgICAgbmV4dF90YWdfb2ZzID0gd2F2LT5kYXRhX2VuZCA9IHNpemUgPyBuZXh0X3RhZ19vZnMgOiBJTlQ2NF9NQVg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRhdGFfb2ZzID0gYXZpb190ZWxsKHBiKTsKKworICAgICAgICAgICAgLyogZG9uJ3QgbG9vayBmb3IgZm9vdGVyIG1ldGFkYXRhIGlmIHdlIGNhbid0IHNlZWsgb3IgaWYgd2UgZG9uJ3QKKyAgICAgICAgICAgICAqIGtub3cgd2hlcmUgdGhlIGRhdGEgdGFnIGVuZHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFwYi0+c2Vla2FibGUgfHwgKCFyZjY0ICYmICFzaXplKSkKKyAgICAgICAgICAgICAgICBnb3RvIGJyZWFrX2xvb3A7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnZicsICdhJywgJ2MnLCAndCcpOgorICAgICAgICAgICAgaWYgKCFzYW1wbGVfY291bnQpCisgICAgICAgICAgICAgICAgc2FtcGxlX2NvdW50ID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdiJywgJ2UnLCAneCcsICd0Jyk6CisgICAgICAgICAgICBpZiAoKHJldCA9IHdhdl9wYXJzZV9iZXh0X3RhZyhzLCBzaXplKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnUycsJ00nLCdWJywnMCcpOgorICAgICAgICAgICAgaWYgKCFnb3RfZm10KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImZvdW5kIG5vICdmbXQgJyB0YWcgYmVmb3JlIHRoZSAnU01WMCcgdGFnXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNNViBmaWxlLCBhIHdhdiBmaWxlIHdpdGggdmlkZW8gYXBwZW5kZWQuCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSBNS1RBRygnMCcsJzInLCcwJywnMCcpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVua25vd24gU01WIHZlcnNpb24gZm91bmRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gYnJlYWtfbG9vcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJGb3VuZCBTTVYgZGF0YVxuIik7CisgICAgICAgICAgICB3YXYtPnNtdl9naXZlbl9maXJzdCA9IDA7CisgICAgICAgICAgICB2c3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgaWYgKCF2c3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGF2aW9fcjgocGIpOworICAgICAgICAgICAgdnN0LT5pZCA9IDE7CisgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TTVZKUEVHOworICAgICAgICAgICAgdnN0LT5jb2RlYy0+d2lkdGggID0gYXZpb19ybDI0KHBiKTsKKyAgICAgICAgICAgIHZzdC0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmwyNChwYik7CisgICAgICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHZzdC0+Y29kZWMsIDQpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBleHRyYWRhdGEuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZSA9IGF2aW9fcmwyNChwYik7CisgICAgICAgICAgICB3YXYtPnNtdl9kYXRhX29mcyA9IGF2aW9fdGVsbChwYikgKyAoc2l6ZSAtIDUpICogMzsKKyAgICAgICAgICAgIGF2aW9fcmwyNChwYik7CisgICAgICAgICAgICB3YXYtPnNtdl9ibG9ja19zaXplID0gYXZpb19ybDI0KHBiKTsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCAzMiwgMSwgYXZpb19ybDI0KHBiKSk7CisgICAgICAgICAgICB2c3QtPmR1cmF0aW9uID0gYXZpb19ybDI0KHBiKTsKKyAgICAgICAgICAgIGF2aW9fcmwyNChwYik7CisgICAgICAgICAgICBhdmlvX3JsMjQocGIpOworICAgICAgICAgICAgd2F2LT5zbXZfZnJhbWVzX3Blcl9qcGVnID0gYXZpb19ybDI0KHBiKTsKKyAgICAgICAgICAgIGlmICh3YXYtPnNtdl9mcmFtZXNfcGVyX2pwZWcgPiA2NTUzNikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0b28gbWFueSBmcmFtZXMgcGVyIGpwZWdcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVZfV0wzMih2c3QtPmNvZGVjLT5leHRyYWRhdGEsIHdhdi0+c212X2ZyYW1lc19wZXJfanBlZyk7CisgICAgICAgICAgICB3YXYtPnNtdl9jdXJfcHQgPSAwOworICAgICAgICAgICAgZ290byBicmVha19sb29wOworICAgICAgICBjYXNlIE1LVEFHKCdMJywgJ0knLCAnUycsICdUJyk6CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidG9vIHNob3J0IExJU1QgdGFnXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYXZpb19ybDMyKHBiKSkgeworICAgICAgICAgICAgY2FzZSBNS1RBRygnSScsICdOJywgJ0YnLCAnTycpOgorICAgICAgICAgICAgICAgIGZmX3JlYWRfcmlmZl9pbmZvKHMsIHNpemUgLSA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogc2VlayB0byBuZXh0IHRhZyB1bmxlc3Mgd2Uga25vdyB0aGF0IHdlJ2xsIHJ1biBpbnRvIEVPRiAqLworICAgICAgICBpZiAoKGF2aW9fc2l6ZShwYikgPiAwICYmIG5leHRfdGFnX29mcyA+PSBhdmlvX3NpemUocGIpKSB8fAorICAgICAgICAgICAgd2F2X3NlZWtfdGFnKHdhdiwgcGIsIG5leHRfdGFnX29mcywgU0VFS19TRVQpIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKK2JyZWFrX2xvb3A6CisgICAgaWYgKGRhdGFfb2ZzIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibm8gJ2RhdGEnIHRhZyBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2aW9fc2VlayhwYiwgZGF0YV9vZnMsIFNFRUtfU0VUKTsKKworICAgIGlmICggICBkYXRhX3NpemUgPiAwICYmIHNhbXBsZV9jb3VudCAmJiBzdC0+Y29kZWMtPmNoYW5uZWxzCisgICAgICAgICYmIGRhdGFfc2l6ZSAvIHNhbXBsZV9jb3VudCAvIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPiA4KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgImlnbm9yaW5nIHdyb25nIHNhbXBsZV9jb3VudCAlIlBSSWQ2NCJcbiIsIHNhbXBsZV9jb3VudCk7CisgICAgICAgIHNhbXBsZV9jb3VudCA9IDA7CisgICAgfQorCisgICAgaWYgKCFzYW1wbGVfY291bnQgfHwgYXZfZ2V0X2V4YWN0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKSA+IDApCisgICAgICAgIGlmICggICBzdC0+Y29kZWMtPmNoYW5uZWxzCisgICAgICAgICAgICAmJiBkYXRhX3NpemUKKyAgICAgICAgICAgICYmIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCkKKyAgICAgICAgICAgICYmIHdhdi0+ZGF0YV9lbmQgPD0gYXZpb19zaXplKHBiKSkKKyAgICAgICAgICAgIHNhbXBsZV9jb3VudCA9IChkYXRhX3NpemUgPDwgMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCisgICAgICAgICAgICAgICAgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiAodWludDY0X3QpYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKSk7CisKKyAgICBpZiAoc2FtcGxlX2NvdW50KQorICAgICAgICBzdC0+ZHVyYXRpb24gPSBzYW1wbGVfY291bnQ7CisKKyAgICBmZl9tZXRhZGF0YV9jb252X2N0eChzLCBOVUxMLCB3YXZfbWV0YWRhdGFfY29udik7CisgICAgZmZfbWV0YWRhdGFfY29udl9jdHgocywgTlVMTCwgZmZfcmlmZl9pbmZvX2NvbnYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmluZCBjaHVuayB3aXRoIHc2NCBHVUlEIGJ5IHNraXBwaW5nIG92ZXIgb3RoZXIgY2h1bmtzLgorICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZm91bmQgY2h1bmsKKyAqLworc3RhdGljIGludDY0X3QgZmluZF9ndWlkKEFWSU9Db250ZXh0ICpwYiwgY29uc3QgdWludDhfdCBndWlkMVsxNl0pCit7CisgICAgdWludDhfdCBndWlkWzE2XTsKKyAgICBpbnQ2NF90IHNpemU7CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgYXZpb19yZWFkKHBiLCBndWlkLCAxNik7CisgICAgICAgIHNpemUgPSBhdmlvX3JsNjQocGIpOworICAgICAgICBpZiAoc2l6ZSA8PSAyNCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAoIW1lbWNtcChndWlkLCBndWlkMSwgMTYpKQorICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIGF2aW9fc2tpcChwYiwgRkZBTElHTihzaXplLCBJTlQ2NF9DKDgpKSAtIDI0KTsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1JfRU9GOworfQorCisjZGVmaW5lIE1BWF9TSVpFIDQwOTYKKworc3RhdGljIGludCB3YXZfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGludCByZXQsIHNpemU7CisgICAgaW50NjRfdCBsZWZ0OworICAgIEFWU3RyZWFtICpzdDsKKyAgICBXQVZEZW11eENvbnRleHQgKndhdiA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmIChDT05GSUdfU1BESUZfREVNVVhFUiAmJiB3YXYtPnNwZGlmID09IDAgJiYKKyAgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3RhZyA9PSAxKSB7CisgICAgICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjOworICAgICAgICByZXQgPSBmZl9zcGRpZl9wcm9iZShzLT5wYi0+YnVmZmVyLCBzLT5wYi0+YnVmX2VuZCAtIHMtPnBiLT5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlYyk7CisgICAgICAgIGlmIChyZXQgPiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTikgeworICAgICAgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkID0gY29kZWM7CisgICAgICAgICAgICB3YXYtPnNwZGlmID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdhdi0+c3BkaWYgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoQ09ORklHX1NQRElGX0RFTVVYRVIgJiYgd2F2LT5zcGRpZiA9PSAxKQorICAgICAgICByZXR1cm4gZmZfc3BkaWZfcmVhZF9wYWNrZXQocywgcGt0KTsKKworICAgIGlmICh3YXYtPnNtdl9kYXRhX29mcyA+IDApIHsKKyAgICAgICAgaW50NjRfdCBhdWRpb19kdHMsIHZpZGVvX2R0czsKK3Ntdl9yZXRyeToKKyAgICAgICAgYXVkaW9fZHRzID0gKGludDMyX3Qpcy0+c3RyZWFtc1swXS0+Y3VyX2R0czsKKyAgICAgICAgdmlkZW9fZHRzID0gKGludDMyX3Qpcy0+c3RyZWFtc1sxXS0+Y3VyX2R0czsKKworICAgICAgICBpZiAoYXVkaW9fZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIHZpZGVvX2R0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgLypXZSBhbHdheXMgcmV0dXJuIGEgdmlkZW8gZnJhbWUgZmlyc3QgdG8gZ2V0IHRoZSBwaXhlbCBmb3JtYXQgZmlyc3QqLworICAgICAgICAgICAgd2F2LT5zbXZfbGFzdF9zdHJlYW0gPSB3YXYtPnNtdl9naXZlbl9maXJzdCA/CisgICAgICAgICAgICAgICAgYXZfY29tcGFyZV90cyh2aWRlb19kdHMsIHMtPnN0cmVhbXNbMV0tPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2R0cywgcy0+c3RyZWFtc1swXS0+dGltZV9iYXNlKSA+IDAgOiAwOworICAgICAgICAgICAgd2F2LT5zbXZfZ2l2ZW5fZmlyc3QgPSAxOworICAgICAgICB9CisgICAgICAgIHdhdi0+c212X2xhc3Rfc3RyZWFtID0gIXdhdi0+c212X2xhc3Rfc3RyZWFtOworICAgICAgICB3YXYtPnNtdl9sYXN0X3N0cmVhbSB8PSB3YXYtPmF1ZGlvX2VvZjsKKyAgICAgICAgd2F2LT5zbXZfbGFzdF9zdHJlYW0gJj0gIXdhdi0+c212X2VvZjsKKyAgICAgICAgaWYgKHdhdi0+c212X2xhc3Rfc3RyZWFtKSB7CisgICAgICAgICAgICB1aW50NjRfdCBvbGRfcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IG5ld19wb3MgPSB3YXYtPnNtdl9kYXRhX29mcyArCisgICAgICAgICAgICAgICAgd2F2LT5zbXZfYmxvY2sgKiB3YXYtPnNtdl9ibG9ja19zaXplOworICAgICAgICAgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgbmV3X3BvcywgU0VFS19TRVQpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfRU9GOworICAgICAgICAgICAgICAgIGdvdG8gc212X291dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemUgPSBhdmlvX3JsMjQocy0+cGIpOworICAgICAgICAgICAgcmV0ICA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIHNtdl9vdXQ7CisgICAgICAgICAgICBwa3QtPnBvcyAtPSAzOworICAgICAgICAgICAgcGt0LT5wdHMgPSB3YXYtPnNtdl9ibG9jayAqIHdhdi0+c212X2ZyYW1lc19wZXJfanBlZyArIHdhdi0+c212X2N1cl9wdDsKKyAgICAgICAgICAgIHdhdi0+c212X2N1cl9wdCsrOworICAgICAgICAgICAgaWYgKHdhdi0+c212X2ZyYW1lc19wZXJfanBlZyA+IDApCisgICAgICAgICAgICAgICAgd2F2LT5zbXZfY3VyX3B0ICU9IHdhdi0+c212X2ZyYW1lc19wZXJfanBlZzsKKyAgICAgICAgICAgIGlmICghd2F2LT5zbXZfY3VyX3B0KQorICAgICAgICAgICAgICAgIHdhdi0+c212X2Jsb2NrKys7CisKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMTsKK3Ntdl9vdXQ6CisgICAgICAgICAgICBhdmlvX3NlZWsocy0+cGIsIG9sZF9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgICAgICAgICB3YXYtPnNtdl9lb2YgPSAxOworICAgICAgICAgICAgICAgIGdvdG8gc212X3JldHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ID0gcy0+c3RyZWFtc1swXTsKKworICAgIGxlZnQgPSB3YXYtPmRhdGFfZW5kIC0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBpZiAod2F2LT5pZ25vcmVfbGVuZ3RoKQorICAgICAgICBsZWZ0ID0gSU5UX01BWDsKKyAgICBpZiAobGVmdCA8PSAwKSB7CisgICAgICAgIGlmIChDT05GSUdfVzY0X0RFTVVYRVIgJiYgd2F2LT53NjQpCisgICAgICAgICAgICBsZWZ0ID0gZmluZF9ndWlkKHMtPnBiLCBmZl93NjRfZ3VpZF9kYXRhKSAtIDI0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBsZWZ0ID0gZmluZF90YWcod2F2LCBzLT5wYiwgTUtUQUcoJ2QnLCAnYScsICd0JywgJ2EnKSk7CisgICAgICAgIGlmIChsZWZ0IDwgMCkgeworICAgICAgICAgICAgd2F2LT5hdWRpb19lb2YgPSAxOworICAgICAgICAgICAgaWYgKHdhdi0+c212X2RhdGFfb2ZzID4gMCAmJiAhd2F2LT5zbXZfZW9mKQorICAgICAgICAgICAgICAgIGdvdG8gc212X3JldHJ5OworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICB9CisgICAgICAgIHdhdi0+ZGF0YV9lbmQgPSBhdmlvX3RlbGwocy0+cGIpICsgbGVmdDsKKyAgICB9CisKKyAgICBzaXplID0gTUFYX1NJWkU7CisgICAgaWYgKHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPiAxKSB7CisgICAgICAgIGlmIChzaXplIDwgc3QtPmNvZGVjLT5ibG9ja19hbGlnbikKKyAgICAgICAgICAgIHNpemUgPSBzdC0+Y29kZWMtPmJsb2NrX2FsaWduOworICAgICAgICBzaXplID0gKHNpemUgLyBzdC0+Y29kZWMtPmJsb2NrX2FsaWduKSAqIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgfQorICAgIHNpemUgPSBGRk1JTihzaXplLCBsZWZ0KTsKKyAgICByZXQgID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdhdl9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgV0FWRGVtdXhDb250ZXh0ICp3YXYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIHdhdi0+c212X2VvZiA9IDA7CisgICAgd2F2LT5hdWRpb19lb2YgPSAwOworICAgIGlmICh3YXYtPnNtdl9kYXRhX29mcyA+IDApIHsKKyAgICAgICAgaW50NjRfdCBzbXZfdGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICBpZiAoc3RyZWFtX2luZGV4ID09IDApCisgICAgICAgICAgICBzbXZfdGltZXN0YW1wID0gYXZfcmVzY2FsZV9xKHRpbWVzdGFtcCwgcy0+c3RyZWFtc1swXS0+dGltZV9iYXNlLCBzLT5zdHJlYW1zWzFdLT50aW1lX2Jhc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aW1lc3RhbXAgPSBhdl9yZXNjYWxlX3Eoc212X3RpbWVzdGFtcCwgcy0+c3RyZWFtc1sxXS0+dGltZV9iYXNlLCBzLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UpOworICAgICAgICBpZiAod2F2LT5zbXZfZnJhbWVzX3Blcl9qcGVnID4gMCkgeworICAgICAgICAgICAgd2F2LT5zbXZfYmxvY2sgPSBzbXZfdGltZXN0YW1wIC8gd2F2LT5zbXZfZnJhbWVzX3Blcl9qcGVnOworICAgICAgICAgICAgd2F2LT5zbXZfY3VyX3B0ID0gc212X3RpbWVzdGFtcCAlIHdhdi0+c212X2ZyYW1lc19wZXJfanBlZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ID0gcy0+c3RyZWFtc1swXTsKKyAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QMjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QMzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FDMzoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0RUUzoKKyAgICAgICAgLyogdXNlIGdlbmVyaWMgc2Vla2luZyB3aXRoIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBpbmRleGVzICovCisgICAgICAgIHJldHVybiAtMTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZmX3BjbV9yZWFkX3NlZWsocywgc3RyZWFtX2luZGV4LCB0aW1lc3RhbXAsIGZsYWdzKTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoV0FWRGVtdXhDb250ZXh0LCB4KQorI2RlZmluZSBERUMgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBkZW11eF9vcHRpb25zW10gPSB7CisgICAgeyAiaWdub3JlX2xlbmd0aCIsICJJZ25vcmUgbGVuZ3RoIiwgT0ZGU0VUKGlnbm9yZV9sZW5ndGgpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgREVDIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB3YXZfZGVtdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJXQVYgZGVtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGRlbXV4X29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworQVZJbnB1dEZvcm1hdCBmZl93YXZfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid2F2IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV0FWIC8gV0FWRSAoV2F2ZWZvcm0gQXVkaW8pIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFdBVkRlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gd2F2X3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHdhdl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSB3YXZfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlayAgICAgID0gd2F2X3JlYWRfc2VlaywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5jb2RlY190YWcgICAgICA9IChjb25zdCBBVkNvZGVjVGFnICogY29uc3QgW10pIHsgZmZfY29kZWNfd2F2X3RhZ3MsICAwIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJndhdl9kZW11eGVyX2NsYXNzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfV0FWX0RFTVVYRVIgKi8KKworI2lmIENPTkZJR19XNjRfREVNVVhFUgorc3RhdGljIGludCB3NjRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKHAtPmJ1Zl9zaXplIDw9IDQwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIW1lbWNtcChwLT5idWYsICAgICAgZmZfdzY0X2d1aWRfcmlmZiwgMTYpICYmCisgICAgICAgICFtZW1jbXAocC0+YnVmICsgMjQsIGZmX3c2NF9ndWlkX3dhdmUsIDE2KSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdzY0X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQ2NF90IHNpemUsIGRhdGFfb2ZzID0gMDsKKyAgICBBVklPQ29udGV4dCAqcGIgICAgICA9IHMtPnBiOworICAgIFdBVkRlbXV4Q29udGV4dCAqd2F2ID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICB1aW50OF90IGd1aWRbMTZdOworICAgIGludCByZXQ7CisKKyAgICBhdmlvX3JlYWQocGIsIGd1aWQsIDE2KTsKKyAgICBpZiAobWVtY21wKGd1aWQsIGZmX3c2NF9ndWlkX3JpZmYsIDE2KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiByaWZmICsgd2F2ZSArIGZtdCArIHNpemVzICovCisgICAgaWYgKGF2aW9fcmw2NChwYikgPCAxNiArIDggKyAxNiArIDggKyAxNiArIDgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgYXZpb19yZWFkKHBiLCBndWlkLCAxNik7CisgICAgaWYgKG1lbWNtcChndWlkLCBmZl93NjRfZ3VpZF93YXZlLCAxNikpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCBmaW5kIHdhdmUgZ3VpZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHdhdi0+dzY0ID0gMTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgd2hpbGUgKCFhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIGd1aWQsIDE2KSAhPSAxNikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzaXplID0gYXZpb19ybDY0KHBiKTsKKyAgICAgICAgaWYgKHNpemUgPD0gMjQgfHwgSU5UNjRfTUFYIC0gc2l6ZSA8IGF2aW9fdGVsbChwYikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBpZiAoIW1lbWNtcChndWlkLCBmZl93NjRfZ3VpZF9mbXQsIDE2KSkgeworICAgICAgICAgICAgLyogc3VidHJhY3QgY2h1bmsgaGVhZGVyIHNpemUgLSBub3JtYWwgd2F2IGZpbGUgZG9lc24ndCBjb3VudCBpdCAqLworICAgICAgICAgICAgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocGIsIHN0LT5jb2RlYywgc2l6ZSAtIDI0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIEZGQUxJR04oc2l6ZSwgSU5UNjRfQyg4KSkgLSBzaXplKTsKKworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoZ3VpZCwgZmZfdzY0X2d1aWRfZmFjdCwgMTYpKSB7CisgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZXM7CisKKyAgICAgICAgICAgIHNhbXBsZXMgPSBhdmlvX3JsNjQocGIpOworICAgICAgICAgICAgaWYgKHNhbXBsZXMgPiAwKQorICAgICAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IHNhbXBsZXM7CisgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChndWlkLCBmZl93NjRfZ3VpZF9kYXRhLCAxNikpIHsKKyAgICAgICAgICAgIHdhdi0+ZGF0YV9lbmQgPSBhdmlvX3RlbGwocGIpICsgc2l6ZSAtIDI0OworCisgICAgICAgICAgICBkYXRhX29mcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBpZiAoIXBiLT5zZWVrYWJsZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gMjQpOworICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoZ3VpZCwgZmZfdzY0X2d1aWRfc3VtbWFyeWxpc3QsIDE2KSkgeworICAgICAgICAgICAgaW50NjRfdCBzdGFydCwgZW5kLCBjdXI7CisgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwgY2h1bmtfc2l6ZSwgaTsKKworICAgICAgICAgICAgc3RhcnQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBGRkFMSUdOKHNpemUsIElOVDY0X0MoOCkpIC0gMjQ7CisgICAgICAgICAgICBjb3VudCA9IGF2aW9fcmwzMihwYik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2hhciBjaHVua19rZXlbNV0sICp2YWx1ZTsKKworICAgICAgICAgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpIHx8IChjdXIgPSBhdmlvX3RlbGwocGIpKSA8IDAgfHwgY3VyID4gZW5kIC0gOCAvKiA9IHRhZyArIHNpemUgKi8pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2h1bmtfa2V5WzRdID0gMDsKKyAgICAgICAgICAgICAgICBhdmlvX3JlYWQocGIsIGNodW5rX2tleSwgNCk7CisgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IGF2aW9fcmwzMihwYik7CisKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGF2X21hbGxvY3ooY2h1bmtfc2l6ZSArIDEpOworICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgICAgICByZXQgPSBhdmlvX2dldF9zdHIxNmxlKHBiLCBjaHVua19zaXplLCB2YWx1ZSwgY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBjaHVua19zaXplIC0gcmV0KTsKKworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgY2h1bmtfa2V5LCB2YWx1ZSwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIGVuZCAtIGF2aW9fdGVsbChwYikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInVua25vd24gZ3VpZDogIkZGX1BSSV9HVUlEIlxuIiwgRkZfQVJHX0dVSUQoZ3VpZCkpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBGRkFMSUdOKHNpemUsIElOVDY0X0MoOCkpIC0gMjQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFkYXRhX29mcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgZmZfbWV0YWRhdGFfY29udl9jdHgocywgTlVMTCwgd2F2X21ldGFkYXRhX2NvbnYpOworICAgIGZmX21ldGFkYXRhX2NvbnZfY3R4KHMsIE5VTEwsIGZmX3JpZmZfaW5mb19jb252KTsKKworICAgIGhhbmRsZV9zdHJlYW1fcHJvYmluZyhzdCk7CisgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOworCisgICAgYXZpb19zZWVrKHBiLCBkYXRhX29mcywgU0VFS19TRVQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfdzY0X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInc2NCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNvbnkgV2F2ZTY0IiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFdBVkRlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gdzY0X3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHc2NF9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSB3YXZfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlayAgICAgID0gd2F2X3JlYWRfc2VlaywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5jb2RlY190YWcgICAgICA9IChjb25zdCBBVkNvZGVjVGFnICogY29uc3QgW10pIHsgZmZfY29kZWNfd2F2X3RhZ3MsIDAgfSwKK307CisjZW5kaWYgLyogQ09ORklHX1c2NF9ERU1VWEVSICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvd2F2ZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvd2F2ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlNDg3NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93YXZlbmMuYwpAQCAtMCwwICsxLDYyOCBAQAorLyoKKyAqIFdBViBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFNvbnkgV2F2ZTY0IG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogV0FWIG11eGVyIFJGNjQgc3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDEzIERhbmllbCBWZXJrYW1wIDxkYW5pZWxAZHJ2Lm51PgorICoKKyAqIEVCVSBUZWNoIDMyODUgLSBTdXBwbGVtZW50IDMgLSBQZWFrIEVudmVsb3BlIENodW5rIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBHZW9yZyBMaXBwaXRzY2ggPGdlb3JnLmxpcHBpdHNjaEBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZV9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicmlmZi5oIgorCisjZGVmaW5lIFJGNjRfQVVUTyAgICgtMSkKKyNkZWZpbmUgUkY2NF9ORVZFUiAgMAorI2RlZmluZSBSRjY0X0FMV0FZUyAxCisKKyNkZWZpbmUgUEVBS19CVUZGRVJfU0laRSAgIDEwMjQKKwordHlwZWRlZiBlbnVtIHsKKyAgICBQRUFLX09GRiA9IDAsCisgICAgUEVBS19PTiwKKyAgICBQRUFLX09OTFkKK30gUGVha1R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUEVBS19GT1JNQVRfVUlOVDggPSAxLAorICAgIFBFQUtfRk9STUFUX1VJTlQxNgorfSBQZWFrRm9ybWF0OworCit0eXBlZGVmIHN0cnVjdCBXQVZNdXhDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQ2NF90IGRhdGE7CisgICAgaW50NjRfdCBmYWN0X3BvczsKKyAgICBpbnQ2NF90IGRzNjQ7CisgICAgaW50NjRfdCBtaW5wdHM7CisgICAgaW50NjRfdCBtYXhwdHM7CisgICAgaW50MTZfdCAqcGVha19tYXhwb3MsICpwZWFrX21heG5lZzsKKyAgICB1aW50MzJfdCBwZWFrX251bV9mcmFtZXM7CisgICAgdWludDMyX3QgcGVha19vdXRidWZfc2l6ZTsKKyAgICB1aW50MzJfdCBwZWFrX291dGJ1Zl9ieXRlczsKKyAgICB1aW50MzJfdCBwZWFrX3Bvc19wb3A7CisgICAgdWludDE2X3QgcGVha19wb3A7CisgICAgdWludDhfdCAqcGVha19vdXRwdXQ7CisgICAgaW50IGxhc3RfZHVyYXRpb247CisgICAgaW50IHdyaXRlX2JleHQ7CisgICAgaW50IHdyaXRlX3BlYWs7CisgICAgaW50IHJmNjQ7CisgICAgaW50IHBlYWtfYmxvY2tfc2l6ZTsKKyAgICBQZWFrRm9ybWF0IHBlYWtfZm9ybWF0OworICAgIGludCBwZWFrX2Jsb2NrX3BvczsKKyAgICBpbnQgcGVha19wcHY7CisgICAgaW50IHBlYWtfYnBzOworfSBXQVZNdXhDb250ZXh0OworCisjaWYgQ09ORklHX1dBVl9NVVhFUgorc3RhdGljIGlubGluZSB2b2lkIGJ3Zl93cml0ZV9iZXh0X3N0cmluZyhBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKmtleSwgaW50IG1heGxlbikKK3sKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnOworICAgIGludCBsZW4gPSAwOworCisgICAgaWYgKHRhZyA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCBrZXksIE5VTEwsIDApKSB7CisgICAgICAgIGxlbiA9IHN0cmxlbih0YWctPnZhbHVlKTsKKyAgICAgICAgbGVuID0gRkZNSU4obGVuLCBtYXhsZW4pOworICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCB0YWctPnZhbHVlLCBsZW4pOworICAgIH0KKworICAgIGZmaW9fZmlsbChzLT5wYiwgMCwgbWF4bGVuIC0gbGVuKTsKK30KKworc3RhdGljIHZvaWQgYndmX3dyaXRlX2JleHRfY2h1bmsoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0bXBfdGFnOworICAgIHVpbnQ2NF90IHRpbWVfcmVmZXJlbmNlID0gMDsKKyAgICBpbnQ2NF90IGJleHQgPSBmZl9zdGFydF90YWcocy0+cGIsICJiZXh0Iik7CisKKyAgICBid2Zfd3JpdGVfYmV4dF9zdHJpbmcocywgImRlc2NyaXB0aW9uIiwgMjU2KTsKKyAgICBid2Zfd3JpdGVfYmV4dF9zdHJpbmcocywgIm9yaWdpbmF0b3IiLCAzMik7CisgICAgYndmX3dyaXRlX2JleHRfc3RyaW5nKHMsICJvcmlnaW5hdG9yX3JlZmVyZW5jZSIsIDMyKTsKKyAgICBid2Zfd3JpdGVfYmV4dF9zdHJpbmcocywgIm9yaWdpbmF0aW9uX2RhdGUiLCAxMCk7CisgICAgYndmX3dyaXRlX2JleHRfc3RyaW5nKHMsICJvcmlnaW5hdGlvbl90aW1lIiwgOCk7CisKKyAgICBpZiAodG1wX3RhZyA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAidGltZV9yZWZlcmVuY2UiLCBOVUxMLCAwKSkKKyAgICAgICAgdGltZV9yZWZlcmVuY2UgPSBzdHJ0b2xsKHRtcF90YWctPnZhbHVlLCBOVUxMLCAxMCk7CisgICAgYXZpb193bDY0KHMtPnBiLCB0aW1lX3JlZmVyZW5jZSk7CisgICAgYXZpb193bDE2KHMtPnBiLCAxKTsgIC8vIHNldCB2ZXJzaW9uIHRvIDEKKworICAgIGlmICh0bXBfdGFnID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJ1bWlkIiwgTlVMTCwgMCkpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciB1bWlkcGFydF9zdHJbMTddID0gezB9OworICAgICAgICBpbnQgaTsKKyAgICAgICAgdWludDY0X3QgdW1pZHBhcnQ7CisgICAgICAgIGludCBsZW4gPSBzdHJsZW4odG1wX3RhZy0+dmFsdWUrMik7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbi8xNjsgaSsrKSB7CisgICAgICAgICAgICBtZW1jcHkodW1pZHBhcnRfc3RyLCB0bXBfdGFnLT52YWx1ZSArIDIgKyAoaSoxNiksIDE2KTsKKyAgICAgICAgICAgIHVtaWRwYXJ0ID0gc3RydG9sbCh1bWlkcGFydF9zdHIsIE5VTEwsIDE2KTsKKyAgICAgICAgICAgIGF2aW9fd2I2NChzLT5wYiwgdW1pZHBhcnQpOworICAgICAgICB9CisgICAgICAgIGZmaW9fZmlsbChzLT5wYiwgMCwgNjQgLSBpKjgpOworICAgIH0gZWxzZQorICAgICAgICBmZmlvX2ZpbGwocy0+cGIsIDAsIDY0KTsgLy8gemVybyBVTUlECisKKyAgICBmZmlvX2ZpbGwocy0+cGIsIDAsIDE5MCk7IC8vIFJlc2VydmVkCisKKyAgICBpZiAodG1wX3RhZyA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiY29kaW5nX2hpc3RvcnkiLCBOVUxMLCAwKSkKKyAgICAgICAgYXZpb19wdXRfc3RyKHMtPnBiLCB0bXBfdGFnLT52YWx1ZSk7CisKKyAgICBmZl9lbmRfdGFnKHMtPnBiLCBiZXh0KTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBwZWFrX2ZyZWVfYnVmZmVycyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgV0FWTXV4Q29udGV4dCAqd2F2ID0gcy0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJndhdi0+cGVha19tYXhwb3MpOworICAgIGF2X2ZyZWVwKCZ3YXYtPnBlYWtfbWF4bmVnKTsKKyAgICBhdl9mcmVlcCgmd2F2LT5wZWFrX291dHB1dCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBwZWFrX2luaXRfd3JpdGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBXQVZNdXhDb250ZXh0ICp3YXYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworCisgICAgaWYgKGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1M4ICYmCisgICAgICAgIGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1MxNkxFICYmCisgICAgICAgIGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1U4ICYmCisgICAgICAgIGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1UxNkxFKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICIlcyBjb2RlYyBub3Qgc3VwcG9ydGVkIGZvciBQZWFrIENodW5rXG4iLAorICAgICAgICAgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjID8gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjLT5uYW1lIDogIk5PTkUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHdhdi0+cGVha19icHMgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGVuYy0+Y29kZWNfaWQpIC8gODsKKworICAgIGlmICh3YXYtPnBlYWtfYnBzID09IDEgJiYgd2F2LT5wZWFrX2Zvcm1hdCA9PSBQRUFLX0ZPUk1BVF9VSU5UMTYpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJXcml0aW5nIDE2IGJpdCBwZWFrIGZvciA4IGJpdCBhdWRpbyBkb2VzIG5vdCBtYWtlIHNlbnNlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICB3YXYtPnBlYWtfbWF4cG9zID0gYXZfbWFsbG9jel9hcnJheShlbmMtPmNoYW5uZWxzLCBzaXplb2YoKndhdi0+cGVha19tYXhwb3MpKTsKKyAgICB3YXYtPnBlYWtfbWF4bmVnID0gYXZfbWFsbG9jel9hcnJheShlbmMtPmNoYW5uZWxzLCBzaXplb2YoKndhdi0+cGVha19tYXhuZWcpKTsKKyAgICB3YXYtPnBlYWtfb3V0cHV0ID0gYXZfbWFsbG9jKFBFQUtfQlVGRkVSX1NJWkUpOworICAgIGlmICghd2F2LT5wZWFrX21heHBvcyB8fCAhd2F2LT5wZWFrX21heG5lZyB8fCAhd2F2LT5wZWFrX291dHB1dCkKKyAgICAgICAgZ290byBub21lbTsKKworICAgIHdhdi0+cGVha19vdXRidWZfc2l6ZSA9IFBFQUtfQlVGRkVSX1NJWkU7CisKKyAgICByZXR1cm4gMDsKKworbm9tZW06CisgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk91dCBvZiBtZW1vcnlcbiIpOworICAgIHBlYWtfZnJlZV9idWZmZXJzKHMpOworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKK3N0YXRpYyB2b2lkIHBlYWtfd3JpdGVfZnJhbWUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFdBVk11eENvbnRleHQgKndhdiA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgaW50IHBlYWtfb2ZfcGVha3M7CisgICAgaW50IGM7CisKKyAgICBpZiAoIXdhdi0+cGVha19vdXRwdXQpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoYyA9IDA7IGMgPCBlbmMtPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgd2F2LT5wZWFrX21heG5lZ1tjXSA9IC13YXYtPnBlYWtfbWF4bmVnW2NdOworCisgICAgICAgIGlmICh3YXYtPnBlYWtfYnBzID09IDIgJiYgd2F2LT5wZWFrX2Zvcm1hdCA9PSBQRUFLX0ZPUk1BVF9VSU5UOCkgeworICAgICAgICAgICAgd2F2LT5wZWFrX21heHBvc1tjXSA9IHdhdi0+cGVha19tYXhwb3NbY10gLyAyNTY7CisgICAgICAgICAgICB3YXYtPnBlYWtfbWF4bmVnW2NdID0gd2F2LT5wZWFrX21heG5lZ1tjXSAvIDI1NjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3YXYtPnBlYWtfcHB2ID09IDEpCisgICAgICAgICAgICB3YXYtPnBlYWtfbWF4cG9zW2NdID0KKyAgICAgICAgICAgICAgICBGRk1BWCh3YXYtPnBlYWtfbWF4cG9zW2NdLCB3YXYtPnBlYWtfbWF4bmVnW2NdKTsKKworICAgICAgICBwZWFrX29mX3BlYWtzID0gRkZNQVgzKHdhdi0+cGVha19tYXhwb3NbY10sIHdhdi0+cGVha19tYXhuZWdbY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F2LT5wZWFrX3BvcCk7CisgICAgICAgIGlmIChwZWFrX29mX3BlYWtzID4gd2F2LT5wZWFrX3BvcCkKKyAgICAgICAgICAgIHdhdi0+cGVha19wb3NfcG9wID0gd2F2LT5wZWFrX251bV9mcmFtZXM7CisgICAgICAgIHdhdi0+cGVha19wb3AgPSBwZWFrX29mX3BlYWtzOworCisgICAgICAgIGlmICh3YXYtPnBlYWtfb3V0YnVmX3NpemUgLSB3YXYtPnBlYWtfb3V0YnVmX2J5dGVzIDwKKyAgICAgICAgICAgIHdhdi0+cGVha19mb3JtYXQgKiB3YXYtPnBlYWtfcHB2KSB7CisgICAgICAgICAgICB3YXYtPnBlYWtfb3V0YnVmX3NpemUgKz0gUEVBS19CVUZGRVJfU0laRTsKKyAgICAgICAgICAgIHdhdi0+cGVha19vdXRwdXQgPSBhdl9yZWFsbG9jKHdhdi0+cGVha19vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXYtPnBlYWtfb3V0YnVmX3NpemUpOworICAgICAgICAgICAgaWYgKCF3YXYtPnBlYWtfb3V0cHV0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vIG1lbW9yeSBmb3IgcGVhayBkYXRhXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAod2F2LT5wZWFrX2Zvcm1hdCA9PSBQRUFLX0ZPUk1BVF9VSU5UOCkgeworICAgICAgICAgICAgd2F2LT5wZWFrX291dHB1dFt3YXYtPnBlYWtfb3V0YnVmX2J5dGVzKytdID0KKyAgICAgICAgICAgICAgICB3YXYtPnBlYWtfbWF4cG9zW2NdOworICAgICAgICAgICAgaWYgKHdhdi0+cGVha19wcHYgPT0gMikgeworICAgICAgICAgICAgICAgIHdhdi0+cGVha19vdXRwdXRbd2F2LT5wZWFrX291dGJ1Zl9ieXRlcysrXSA9CisgICAgICAgICAgICAgICAgICAgIHdhdi0+cGVha19tYXhuZWdbY107CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBVl9XTDE2KHdhdi0+cGVha19vdXRwdXQgKyB3YXYtPnBlYWtfb3V0YnVmX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICB3YXYtPnBlYWtfbWF4cG9zW2NdKTsKKyAgICAgICAgICAgIHdhdi0+cGVha19vdXRidWZfYnl0ZXMgKz0gMjsKKyAgICAgICAgICAgIGlmICh3YXYtPnBlYWtfcHB2ID09IDIpIHsKKyAgICAgICAgICAgICAgICBBVl9XTDE2KHdhdi0+cGVha19vdXRwdXQgKyB3YXYtPnBlYWtfb3V0YnVmX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgd2F2LT5wZWFrX21heG5lZ1tjXSk7CisgICAgICAgICAgICAgICAgd2F2LT5wZWFrX291dGJ1Zl9ieXRlcyArPSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdhdi0+cGVha19tYXhwb3NbY10gPSAwOworICAgICAgICB3YXYtPnBlYWtfbWF4bmVnW2NdID0gMDsKKyAgICB9CisgICAgd2F2LT5wZWFrX251bV9mcmFtZXMrKzsKK30KKworc3RhdGljIHZvaWQgcGVha193cml0ZV9jaHVuayhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgV0FWTXV4Q29udGV4dCAqd2F2ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBpbnQ2NF90IHBlYWsgPSBmZl9zdGFydF90YWcocy0+cGIsICJsZXZsIik7CisgICAgaW50NjRfdCBub3cwOworICAgIHRpbWVfdCBub3dfc2VjczsKKyAgICBjaGFyIHRpbWVzdGFtcFsyOF07CisKKyAgICAvKiBQZWFrIGZyYW1lIG9mIGluY29tcGxldGUgYmxvY2sgYXQgZW5kICovCisgICAgaWYgKHdhdi0+cGVha19ibG9ja19wb3MpCisgICAgICAgIHBlYWtfd3JpdGVfZnJhbWUocyk7CisKKyAgICBtZW1zZXQodGltZXN0YW1wLCAwLCBzaXplb2YodGltZXN0YW1wKSk7CisgICAgaWYgKCEocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0JJVEVYQUNUKSkgeworICAgICAgICBzdHJ1Y3QgdG0gdG1wYnVmOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJXcml0aW5nIGxvY2FsIHRpbWUgYW5kIGRhdGUgdG8gUGVhayBFbnZlbG9wZSBDaHVua1xuIik7CisgICAgICAgIG5vdzAgPSBhdl9nZXR0aW1lKCk7CisgICAgICAgIG5vd19zZWNzID0gbm93MCAvIDEwMDAwMDA7CisgICAgICAgIHN0cmZ0aW1lKHRpbWVzdGFtcCwgc2l6ZW9mKHRpbWVzdGFtcCksICIlWTolbTolZDolSDolTTolUzoiLCBsb2NhbHRpbWVfcigmbm93X3NlY3MsICZ0bXBidWYpKTsKKyAgICAgICAgYXZfc3RybGNhdGYodGltZXN0YW1wLCBzaXplb2YodGltZXN0YW1wKSwgIiUwM2QiLCAoaW50KSgobm93MCAvIDEwMDApICUgMTAwMCkpOworICAgIH0KKworICAgIGF2aW9fd2wzMihwYiwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmVyc2lvbiAqLworICAgIGF2aW9fd2wzMihwYiwgd2F2LT5wZWFrX2Zvcm1hdCk7ICAgICAgICAgICAgLyogOCBvciAxNiBiaXQgKi8KKyAgICBhdmlvX3dsMzIocGIsIHdhdi0+cGVha19wcHYpOyAgICAgICAgICAgICAgIC8qIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSAqLworICAgIGF2aW9fd2wzMihwYiwgd2F2LT5wZWFrX2Jsb2NrX3NpemUpOyAgICAgICAgLyogZnJhbWVzIHBlciB2YWx1ZSAqLworICAgIGF2aW9fd2wzMihwYiwgZW5jLT5jaGFubmVscyk7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgYXZpb193bDMyKHBiLCB3YXYtPnBlYWtfbnVtX2ZyYW1lcyk7ICAgICAgICAvKiBudW1iZXIgb2YgcGVhayBmcmFtZXMgKi8KKyAgICBhdmlvX3dsMzIocGIsIHdhdi0+cGVha19wb3NfcG9wKTsgICAgICAgICAgIC8qIGF1ZGlvIHNhbXBsZSBmcmFtZSBpbmRleCAqLworICAgIGF2aW9fd2wzMihwYiwgMTI4KTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXF1YWwgdG8gc2l6ZSBvZiBoZWFkZXIgKi8KKyAgICBhdmlvX3dyaXRlKHBiLCB0aW1lc3RhbXAsIDI4KTsgICAgICAgICAgICAgIC8qIEFTQ0lJIHRpbWUgc3RhbXAgKi8KKyAgICBmZmlvX2ZpbGwocGIsIDAsIDYwKTsKKworICAgIGF2aW9fd3JpdGUocGIsIHdhdi0+cGVha19vdXRwdXQsIHdhdi0+cGVha19vdXRidWZfYnl0ZXMpOworCisgICAgZmZfZW5kX3RhZyhwYiwgcGVhayk7CisKKyAgICBpZiAoIXdhdi0+ZGF0YSkKKyAgICAgICAgd2F2LT5kYXRhID0gcGVhazsKK30KKworc3RhdGljIGludCB3YXZfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBXQVZNdXhDb250ZXh0ICp3YXYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50NjRfdCBmbXQ7CisKKyAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJXQVZFIGZpbGVzIGhhdmUgZXhhY3RseSBvbmUgc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAod2F2LT5yZjY0ID09IFJGNjRfQUxXQVlTKSB7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgIlJGNjQiKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCAtMSk7IC8qIFJGNjQgY2h1bmsgc2l6ZTogdXNlIHNpemUgaW4gZHM2NCAqLworICAgIH0gZWxzZSB7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgIlJJRkYiKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCAtMSk7IC8qIGZpbGUgbGVuZ3RoICovCisgICAgfQorCisgICAgZmZpb193Zm91cmNjKHBiLCAiV0FWRSIpOworCisgICAgaWYgKHdhdi0+cmY2NCAhPSBSRjY0X05FVkVSKSB7CisgICAgICAgIC8qIHdyaXRlIGVtcHR5IGRzNjQgY2h1bmsgb3IgSlVOSyBjaHVuayB0byByZXNlcnZlIHNwYWNlIGZvciBkczY0ICovCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgd2F2LT5yZjY0ID09IFJGNjRfQUxXQVlTID8gImRzNjQiIDogIkpVTksiKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCAyOCk7IC8qIGNodW5rIHNpemUgKi8KKyAgICAgICAgd2F2LT5kczY0ID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgZmZpb19maWxsKHBiLCAwLCAyOCk7CisgICAgfQorCisgICAgaWYgKHdhdi0+d3JpdGVfcGVhayAhPSAyKSB7CisgICAgICAgIC8qIGZvcm1hdCBoZWFkZXIgKi8KKyAgICAgICAgZm10ID0gZmZfc3RhcnRfdGFnKHBiLCAiZm10ICIpOworICAgICAgICBpZiAoZmZfcHV0X3dhdl9oZWFkZXIocGIsIHMtPnN0cmVhbXNbMF0tPmNvZGVjLCAwKSA8IDApIHsKKyAgICAgICAgICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpkZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldChzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiVzIGNvZGVjIG5vdCBzdXBwb3J0ZWQgaW4gV0FWRSBmb3JtYXRcbiIsCisgICAgICAgICAgICAgICAgICAgZGVzYyA/IGRlc2MtPm5hbWUgOiAidW5rbm93biIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgfQorICAgICAgICBmZl9lbmRfdGFnKHBiLCBmbXQpOworICAgIH0KKworICAgIGlmIChzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfdGFnICE9IDB4MDEgLyogaGVuY2UgZm9yIGFsbCBvdGhlciB0aGFuIFBDTSAqLworICAgICAgICAmJiBzLT5wYi0+c2Vla2FibGUpIHsKKyAgICAgICAgd2F2LT5mYWN0X3BvcyA9IGZmX3N0YXJ0X3RhZyhwYiwgImZhY3QiKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCAwKTsKKyAgICAgICAgZmZfZW5kX3RhZyhwYiwgd2F2LT5mYWN0X3Bvcyk7CisgICAgfQorCisgICAgaWYgKHdhdi0+d3JpdGVfYmV4dCkKKyAgICAgICAgYndmX3dyaXRlX2JleHRfY2h1bmsocyk7CisKKyAgICBpZiAod2F2LT53cml0ZV9wZWFrKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIGlmICgocmV0ID0gcGVha19pbml0X3dyaXRlcihzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHMtPnN0cmVhbXNbMF0sIDY0LCAxLCBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIHdhdi0+bWF4cHRzID0gd2F2LT5sYXN0X2R1cmF0aW9uID0gMDsKKyAgICB3YXYtPm1pbnB0cyA9IElOVDY0X01BWDsKKworICAgIGlmICh3YXYtPndyaXRlX3BlYWsgIT0gMikgeworICAgICAgICAvKiBpbmZvIGhlYWRlciAqLworICAgICAgICBmZl9yaWZmX3dyaXRlX2luZm8ocyk7CisKKyAgICAgICAgLyogZGF0YSBoZWFkZXIgKi8KKyAgICAgICAgd2F2LT5kYXRhID0gZmZfc3RhcnRfdGFnKHBiLCAiZGF0YSIpOworICAgIH0KKworICAgIGF2aW9fZmx1c2gocGIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2F2X3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZJT0NvbnRleHQgKnBiICA9IHMtPnBiOworICAgIFdBVk11eENvbnRleHQgICAgKndhdiA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmICh3YXYtPndyaXRlX3BlYWsgIT0gMikKKyAgICAgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworCisgICAgaWYgKHdhdi0+d3JpdGVfcGVhaykgeworICAgICAgICBpbnQgYyA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGt0LT5zaXplOyBpICs9IHdhdi0+cGVha19icHMpIHsKKyAgICAgICAgICAgIGlmICh3YXYtPnBlYWtfYnBzID09IDEpIHsKKyAgICAgICAgICAgICAgICB3YXYtPnBlYWtfbWF4cG9zW2NdID0gRkZNQVgod2F2LT5wZWFrX21heHBvc1tjXSwgKihpbnQ4X3QqKShwa3QtPmRhdGEgKyBpKSk7CisgICAgICAgICAgICAgICAgd2F2LT5wZWFrX21heG5lZ1tjXSA9IEZGTUlOKHdhdi0+cGVha19tYXhuZWdbY10sICooaW50OF90KikocGt0LT5kYXRhICsgaSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3YXYtPnBlYWtfbWF4cG9zW2NdID0gRkZNQVgod2F2LT5wZWFrX21heHBvc1tjXSwgKGludDE2X3QpQVZfUkwxNihwa3QtPmRhdGEgKyBpKSk7CisgICAgICAgICAgICAgICAgd2F2LT5wZWFrX21heG5lZ1tjXSA9IEZGTUlOKHdhdi0+cGVha19tYXhuZWdbY10sIChpbnQxNl90KUFWX1JMMTYocGt0LT5kYXRhICsgaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCsrYyA9PSBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBjID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoKyt3YXYtPnBlYWtfYmxvY2tfcG9zID09IHdhdi0+cGVha19ibG9ja19zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHBlYWtfd3JpdGVfZnJhbWUocyk7CisgICAgICAgICAgICAgICAgICAgIHdhdi0+cGVha19ibG9ja19wb3MgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIHdhdi0+bWlucHRzICAgICAgICA9IEZGTUlOKHdhdi0+bWlucHRzLCBwa3QtPnB0cyk7CisgICAgICAgIHdhdi0+bWF4cHRzICAgICAgICA9IEZGTUFYKHdhdi0+bWF4cHRzLCBwa3QtPnB0cyk7CisgICAgICAgIHdhdi0+bGFzdF9kdXJhdGlvbiA9IHBrdC0+ZHVyYXRpb247CisgICAgfSBlbHNlCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ3YXZfd3JpdGVfcGFja2V0OiBOT1BUU1xuIik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2F2X3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiAgPSBzLT5wYjsKKyAgICBXQVZNdXhDb250ZXh0ICAgICp3YXYgPSBzLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBmaWxlX3NpemUsIGRhdGFfc2l6ZTsKKyAgICBpbnQ2NF90IG51bWJlcl9vZl9zYW1wbGVzID0gMDsKKyAgICBpbnQgcmY2NCA9IDA7CisKKyAgICBhdmlvX2ZsdXNoKHBiKTsKKworICAgIGlmIChzLT5wYi0+c2Vla2FibGUpIHsKKyAgICAgICAgaWYgKHdhdi0+d3JpdGVfcGVhayAhPSAyKSB7CisgICAgICAgICAgICBmZl9lbmRfdGFnKHBiLCB3YXYtPmRhdGEpOworICAgICAgICAgICAgYXZpb19mbHVzaChwYik7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2F2LT53cml0ZV9wZWFrICYmIHdhdi0+cGVha19vdXRwdXQpIHsKKyAgICAgICAgICAgIHBlYWtfd3JpdGVfY2h1bmsocyk7CisgICAgICAgICAgICBhdmlvX2ZsdXNoKHBiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVwZGF0ZSBmaWxlIHNpemUgKi8KKyAgICAgICAgZmlsZV9zaXplID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgZGF0YV9zaXplID0gZmlsZV9zaXplIC0gd2F2LT5kYXRhOworICAgICAgICBpZiAod2F2LT5yZjY0ID09IFJGNjRfQUxXQVlTIHx8ICh3YXYtPnJmNjQgPT0gUkY2NF9BVVRPICYmIGZpbGVfc2l6ZSAtIDggPiBVSU5UMzJfTUFYKSkgeworICAgICAgICAgICAgcmY2NCA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIDQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgKHVpbnQzMl90KShmaWxlX3NpemUgLSA4KSk7CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGZpbGVfc2l6ZSwgU0VFS19TRVQpOworCisgICAgICAgICAgICBhdmlvX2ZsdXNoKHBiKTsKKyAgICAgICAgfQorCisgICAgICAgIG51bWJlcl9vZl9zYW1wbGVzID0gYXZfcmVzY2FsZSh3YXYtPm1heHB0cyAtIHdhdi0+bWlucHRzICsgd2F2LT5sYXN0X2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWMtPnNhbXBsZV9yYXRlICogKGludDY0X3Qpcy0+c3RyZWFtc1swXS0+dGltZV9iYXNlLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZS5kZW4pOworCisgICAgICAgIGlmKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190YWcgIT0gMHgwMSkgeworICAgICAgICAgICAgLyogVXBkYXRlIG51bV9zYW1wcyBpbiBmYWN0IGNodW5rICovCisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIHdhdi0+ZmFjdF9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGlmIChyZjY0IHx8ICh3YXYtPnJmNjQgPT0gUkY2NF9BVVRPICYmIG51bWJlcl9vZl9zYW1wbGVzID4gVUlOVDMyX01BWCkpIHsKKyAgICAgICAgICAgICAgICByZjY0ID0gMTsKKyAgICAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIC0xKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZpb193bDMyKHBiLCBudW1iZXJfb2Zfc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBmaWxlX3NpemUsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICBhdmlvX2ZsdXNoKHBiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZjY0KSB7CisgICAgICAgICAgICAvKiBvdmVyd3JpdGUgUklGRiB3aXRoIFJGNjQgKi8KKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgMCwgU0VFS19TRVQpOworICAgICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiUkY2NCIpOworICAgICAgICAgICAgYXZpb193bDMyKHBiLCAtMSk7CisKKyAgICAgICAgICAgIC8qIHdyaXRlIGRzNjQgY2h1bmsgKG92ZXJ3cml0ZSBKVU5LIGlmIHJmNjQgPT0gUkY2NF9BVVRPKSAqLworICAgICAgICAgICAgYXZpb19zZWVrKHBiLCB3YXYtPmRzNjQgLSA4LCBTRUVLX1NFVCk7CisgICAgICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJkczY0Iik7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDI4KTsgICAgICAgICAgICAgICAgICAvKiBkczY0IGNodW5rIHNpemUgKi8KKyAgICAgICAgICAgIGF2aW9fd2w2NChwYiwgZmlsZV9zaXplIC0gOCk7ICAgICAgIC8qIFJGNjQgY2h1bmsgc2l6ZSAqLworICAgICAgICAgICAgYXZpb193bDY0KHBiLCBkYXRhX3NpemUpOyAgICAgICAgICAgLyogZGF0YSBjaHVuayBzaXplICovCisgICAgICAgICAgICBhdmlvX3dsNjQocGIsIG51bWJlcl9vZl9zYW1wbGVzKTsgICAvKiBmYWN0IGNodW5rIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDApOyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdGFibGUgZW50cmllcyBmb3Igbm9uLSdkYXRhJyBjaHVua3MgKi8KKworICAgICAgICAgICAgLyogd3JpdGUgLTEgaW4gZGF0YSBjaHVuayBzaXplICovCisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIHdhdi0+ZGF0YSAtIDQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgLTEpOworCisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGZpbGVfc2l6ZSwgU0VFS19TRVQpOworICAgICAgICAgICAgYXZpb19mbHVzaChwYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod2F2LT53cml0ZV9wZWFrKQorICAgICAgICBwZWFrX2ZyZWVfYnVmZmVycyhzKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihXQVZNdXhDb250ZXh0LCB4KQorI2RlZmluZSBFTkMgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAid3JpdGVfYmV4dCIsICJXcml0ZSBCRVhUIGNodW5rLiIsIE9GRlNFVCh3cml0ZV9iZXh0KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEVOQyB9LAorICAgIHsgIndyaXRlX3BlYWsiLCAiV3JpdGUgUGVhayBFbnZlbG9wZSBjaHVuay4iLCAgICAgICAgICAgIE9GRlNFVCh3cml0ZV9wZWFrKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDIsIEVOQywgInBlYWsiIH0sCisgICAgeyAib2ZmIiwgICAgICAgICJEbyBub3Qgd3JpdGUgcGVhayBjaHVuay4iLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUEVBS19PRkYgIH0sIDAsIDAsIEVOQywgInBlYWsiIH0sCisgICAgeyAib24iLCAgICAgICAgICJBcHBlbmQgcGVhayBjaHVuayBhZnRlciB3YXYgZGF0YS4iLCAgICAgMCwgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUEVBS19PTiAgIH0sIDAsIDAsIEVOQywgInBlYWsiIH0sCisgICAgeyAib25seSIsICAgICAgICJXcml0ZSBvbmx5IHBlYWsgY2h1bmssIG9taXQgd2F2IGRhdGEuIiwgMCwgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUEVBS19PTkxZIH0sIDAsIDAsIEVOQywgInBlYWsiIH0sCisgICAgeyAicmY2NCIsICAgICAgICJVc2UgUkY2NCBoZWFkZXIgcmF0aGVyIHRoYW4gUklGRiBmb3IgbGFyZ2UgZmlsZXMuIiwgICAgT0ZGU0VUKHJmNjQpLCBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gUkY2NF9ORVZFUiAgfSwtMSwgMSwgRU5DLCAicmY2NCIgfSwKKyAgICB7ICJhdXRvIiwgICAgICAgIldyaXRlIFJGNjQgaGVhZGVyIGlmIGZpbGUgZ3Jvd3MgbGFyZ2UgZW5vdWdoLiIsICAgICAgICAwLCAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBSRjY0X0FVVE8gICB9LCAwLCAwLCBFTkMsICJyZjY0IiB9LAorICAgIHsgImFsd2F5cyIsICAgICAiQWx3YXlzIHdyaXRlIFJGNjQgaGVhZGVyIHJlZ2FyZGxlc3Mgb2YgZmlsZSBzaXplLiIsICAgIDAsICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFJGNjRfQUxXQVlTIH0sIDAsIDAsIEVOQywgInJmNjQiIH0sCisgICAgeyAibmV2ZXIiLCAgICAgICJOZXZlciB3cml0ZSBSRjY0IGhlYWRlciByZWdhcmRsZXNzIG9mIGZpbGUgc2l6ZS4iLCAgICAgMCwgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUkY2NF9ORVZFUiAgfSwgMCwgMCwgRU5DLCAicmY2NCIgfSwKKyAgICB7ICJwZWFrX2Jsb2NrX3NpemUiLCAiTnVtYmVyIG9mIGF1ZGlvIHNhbXBsZXMgdXNlZCB0byBnZW5lcmF0ZSBlYWNoIHBlYWsgZnJhbWUuIiwgICBPRkZTRVQocGVha19ibG9ja19zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAyNTYgfSwgMCwgNjU1MzYsIEVOQyB9LAorICAgIHsgInBlYWtfZm9ybWF0IiwgICAgICJUaGUgZm9ybWF0IG9mIHRoZSBwZWFrIGVudmVsb3BlIGRhdGEgKDE6IHVpbnQ4LCAyOiB1aW50MTYpLiIsIE9GRlNFVChwZWFrX2Zvcm1hdCksIEFWX09QVF9UWVBFX0lOVCwgICAgIHsgLmk2NCA9IFBFQUtfRk9STUFUX1VJTlQxNiB9LCBQRUFLX0ZPUk1BVF9VSU5UOCwgUEVBS19GT1JNQVRfVUlOVDE2LCBFTkMgfSwKKyAgICB7ICJwZWFrX3BwdiIsICAgICAgICAiTnVtYmVyIG9mIHBlYWsgcG9pbnRzIHBlciBwZWFrIHZhbHVlICgxIG9yIDIpLiIsICAgICAgICAgICAgICBPRkZTRVQocGVha19wcHYpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDIgfSwgMSwgMiwgRU5DIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB3YXZfbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiV0FWIG11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3dhdl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAid2F2IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV0FWIC8gV0FWRSAoV2F2ZWZvcm0gQXVkaW8pIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImF1ZGlvL3gtd2F2IiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAid2F2IiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoV0FWTXV4Q29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gd2F2X3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSB3YXZfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IHdhdl93cml0ZV90cmFpbGVyLAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX1RTX05PTlNUUklDVCwKKyAgICAuY29kZWNfdGFnICAgICAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyogY29uc3QgW10peyBmZl9jb2RlY193YXZfdGFncywgMCB9LAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZ3YXZfbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmIC8qIENPTkZJR19XQVZfTVVYRVIgKi8KKworI2lmIENPTkZJR19XNjRfTVVYRVIKKyNpbmNsdWRlICJ3NjQuaCIKKworc3RhdGljIHZvaWQgc3RhcnRfZ3VpZChBVklPQ29udGV4dCAqcGIsIGNvbnN0IHVpbnQ4X3QgKmd1aWQsIGludDY0X3QgKnBvcykKK3sKKyAgICAqcG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgIGF2aW9fd3JpdGUocGIsIGd1aWQsIDE2KTsKKyAgICBhdmlvX3dsNjQocGIsIElOVDY0X01BWCk7Cit9CisKK3N0YXRpYyB2b2lkIGVuZF9ndWlkKEFWSU9Db250ZXh0ICpwYiwgaW50NjRfdCBzdGFydCkKK3sKKyAgICBpbnQ2NF90IGVuZCwgcG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgIGVuZCA9IEZGQUxJR04ocG9zLCA4KTsKKyAgICBmZmlvX2ZpbGwocGIsIDAsIGVuZCAtIHBvcyk7CisgICAgYXZpb19zZWVrKHBiLCBzdGFydCArIDE2LCBTRUVLX1NFVCk7CisgICAgYXZpb193bDY0KHBiLCBlbmQgLSBzdGFydCk7CisgICAgYXZpb19zZWVrKHBiLCBlbmQsIFNFRUtfU0VUKTsKK30KKworc3RhdGljIGludCB3NjRfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBXQVZNdXhDb250ZXh0ICp3YXYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50NjRfdCBzdGFydDsKKyAgICBpbnQgcmV0OworCisgICAgYXZpb193cml0ZShwYiwgZmZfdzY0X2d1aWRfcmlmZiwgc2l6ZW9mKGZmX3c2NF9ndWlkX3JpZmYpKTsKKyAgICBhdmlvX3dsNjQocGIsIC0xKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBmZl93NjRfZ3VpZF93YXZlLCBzaXplb2YoZmZfdzY0X2d1aWRfd2F2ZSkpOworICAgIHN0YXJ0X2d1aWQocGIsIGZmX3c2NF9ndWlkX2ZtdCwgJnN0YXJ0KTsKKyAgICBpZiAoKHJldCA9IGZmX3B1dF93YXZfaGVhZGVyKHBiLCBzLT5zdHJlYW1zWzBdLT5jb2RlYywgMCkpIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJXMgY29kZWMgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlYyA/IHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlYy0+bmFtZSA6ICJOT05FIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGVuZF9ndWlkKHBiLCBzdGFydCk7CisKKyAgICBpZiAocy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3RhZyAhPSAweDAxIC8qIGhlbmNlIGZvciBhbGwgb3RoZXIgdGhhbiBQQ00gKi8KKyAgICAgICAgJiYgcy0+cGItPnNlZWthYmxlKSB7CisgICAgICAgIHN0YXJ0X2d1aWQocGIsIGZmX3c2NF9ndWlkX2ZhY3QsICZ3YXYtPmZhY3RfcG9zKTsKKyAgICAgICAgYXZpb193bDY0KHBiLCAwKTsKKyAgICAgICAgZW5kX2d1aWQocGIsIHdhdi0+ZmFjdF9wb3MpOworICAgIH0KKworICAgIHN0YXJ0X2d1aWQocGIsIGZmX3c2NF9ndWlkX2RhdGEsICZ3YXYtPmRhdGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdzY0X3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICAgICpwYiA9IHMtPnBiOworICAgIFdBVk11eENvbnRleHQgKndhdiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IGZpbGVfc2l6ZTsKKworICAgIGlmIChwYi0+c2Vla2FibGUpIHsKKyAgICAgICAgZW5kX2d1aWQocGIsIHdhdi0+ZGF0YSk7CisKKyAgICAgICAgZmlsZV9zaXplID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgYXZpb19zZWVrKHBiLCAxNiwgU0VFS19TRVQpOworICAgICAgICBhdmlvX3dsNjQocGIsIGZpbGVfc2l6ZSk7CisKKyAgICAgICAgaWYgKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190YWcgIT0gMHgwMSkgeworICAgICAgICAgICAgaW50NjRfdCBudW1iZXJfb2Zfc2FtcGxlczsKKworICAgICAgICAgICAgbnVtYmVyX29mX3NhbXBsZXMgPSBhdl9yZXNjYWxlKHdhdi0+bWF4cHRzIC0gd2F2LT5taW5wdHMgKyB3YXYtPmxhc3RfZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWMtPnNhbXBsZV9yYXRlICogKGludDY0X3Qpcy0+c3RyZWFtc1swXS0+dGltZV9iYXNlLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgd2F2LT5mYWN0X3BvcyArIDI0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICBhdmlvX3dsNjQocGIsIG51bWJlcl9vZl9zYW1wbGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGF2aW9fc2VlayhwYiwgZmlsZV9zaXplLCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fZmx1c2gocGIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl93NjRfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gInc2NCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNvbnkgV2F2ZTY0IiksCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gInc2NCIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKFdBVk11eENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRSwKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IHc2NF93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gd2F2X3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSB3NjRfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9UU19OT05TVFJJQ1QsCisgICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgZmZfY29kZWNfd2F2X3RhZ3MsIDAgfSwKK307CisjZW5kaWYgLyogQ09ORklHX1c2NF9NVVhFUiAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3djM21vdmllLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvd2MzbW92aWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmQwOWUzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3djM21vdmllLmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBXaW5nIENvbW1hbmRlciBJSUkgTW92aWUgKC5tdmUpIEZpbGUgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBXaW5nIENvbW1hbmRlciBJSUkgTW92aWUgZmlsZSBkZW11eGVyCisgKiBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQorICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIFdDMyAubXZlIGZpbGUgZm9ybWF0LCB2aXNpdDoKKyAqICAgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBGT1JNX1RBRyBNS1RBRygnRicsICdPJywgJ1InLCAnTScpCisjZGVmaW5lIE1PVkVfVEFHIE1LVEFHKCdNJywgJ08nLCAnVicsICdFJykKKyNkZWZpbmUgIFBDX19UQUcgTUtUQUcoJ18nLCAnUCcsICdDJywgJ18nKQorI2RlZmluZSBTT05EX1RBRyBNS1RBRygnUycsICdPJywgJ04nLCAnRCcpCisjZGVmaW5lIEJOQU1fVEFHIE1LVEFHKCdCJywgJ04nLCAnQScsICdNJykKKyNkZWZpbmUgU0laRV9UQUcgTUtUQUcoJ1MnLCAnSScsICdaJywgJ0UnKQorI2RlZmluZSBQQUxUX1RBRyBNS1RBRygnUCcsICdBJywgJ0wnLCAnVCcpCisjZGVmaW5lIElORFhfVEFHIE1LVEFHKCdJJywgJ04nLCAnRCcsICdYJykKKyNkZWZpbmUgQlJDSF9UQUcgTUtUQUcoJ0InLCAnUicsICdDJywgJ0gnKQorI2RlZmluZSBTSE9UX1RBRyBNS1RBRygnUycsICdIJywgJ08nLCAnVCcpCisjZGVmaW5lIFZHQV9fVEFHIE1LVEFHKCdWJywgJ0cnLCAnQScsICcgJykKKyNkZWZpbmUgVEVYVF9UQUcgTUtUQUcoJ1QnLCAnRScsICdYJywgJ1QnKQorI2RlZmluZSBBVURJX1RBRyBNS1RBRygnQScsICdVJywgJ0QnLCAnSScpCisKKy8qIHZpZGVvIHJlc29sdXRpb24gdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgV0MzX0RFRkFVTFRfV0lEVEggMzIwCisjZGVmaW5lIFdDM19ERUZBVUxUX0hFSUdIVCAxNjUKKworLyogYWx3YXlzIHVzZSB0aGUgc2FtZSBQQ00gYXVkaW8gcGFyYW1ldGVycyAqLworI2RlZmluZSBXQzNfU0FNUExFX1JBVEUgMjIwNTAKKyNkZWZpbmUgV0MzX0FVRElPX0NIQU5ORUxTIDEKKyNkZWZpbmUgV0MzX0FVRElPX0JJVFMgMTYKKworLyogbmljZSwgY29uc3RhbnQgZnJhbWVyYXRlICovCisjZGVmaW5lIFdDM19GUkFNRV9GUFMgMTUKKworI2RlZmluZSBQQUxFVFRFX1NJWkUgKDI1NiAqIDMpCisKK3R5cGVkZWYgc3RydWN0IFdjM0RlbXV4Q29udGV4dCB7CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgaW50NjRfdCBwdHM7CisgICAgaW50IHZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICBpbnQgYXVkaW9fc3RyZWFtX2luZGV4OworCisgICAgQVZQYWNrZXQgdnBrdDsKKworfSBXYzNEZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgd2MzX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChwLT5idWZfc2l6ZSA8IDEyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICgoQVZfUkwzMigmcC0+YnVmWzBdKSAhPSBGT1JNX1RBRykgfHwKKyAgICAgICAgKEFWX1JMMzIoJnAtPmJ1Zls4XSkgIT0gTU9WRV9UQUcpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKK30KKworc3RhdGljIGludCB3YzNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFdjM0RlbXV4Q29udGV4dCAqd2MzID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVuc2lnbmVkIGludCBmb3VyY2NfdGFnOworICAgIHVuc2lnbmVkIGludCBzaXplOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBjaGFyICpidWZmZXI7CisKKyAgICAvKiBkZWZhdWx0IGNvbnRleHQgbWVtYmVycyAqLworICAgIHdjMy0+d2lkdGggPSBXQzNfREVGQVVMVF9XSURUSDsKKyAgICB3YzMtPmhlaWdodCA9IFdDM19ERUZBVUxUX0hFSUdIVDsKKyAgICB3YzMtPnB0cyA9IDA7CisgICAgd2MzLT52aWRlb19zdHJlYW1faW5kZXggPSB3YzMtPmF1ZGlvX3N0cmVhbV9pbmRleCA9IDA7CisgICAgYXZfaW5pdF9wYWNrZXQoJndjMy0+dnBrdCk7CisgICAgd2MzLT52cGt0LmRhdGEgPSBOVUxMOyB3YzMtPnZwa3Quc2l6ZSA9IDA7CisKKyAgICAvKiBza2lwIHRoZSBmaXJzdCAzIDMyLWJpdCBudW1iZXJzICovCisgICAgYXZpb19za2lwKHBiLCAxMik7CisKKyAgICAvKiB0cmF2ZXJzZSB0aHJvdWdoIHRoZSBjaHVua3MgYW5kIGxvYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBiZWZvcmUKKyAgICAgKiB0aGUgZmlyc3QgQlJDSCB0YWcgKi8KKyAgICBmb3VyY2NfdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICBzaXplID0gKGF2aW9fcmIzMihwYikgKyAxKSAmICh+MSk7CisKKyAgICBkbyB7CisgICAgICAgIHN3aXRjaCAoZm91cmNjX3RhZykgeworCisgICAgICAgIGNhc2UgU09ORF9UQUc6CisgICAgICAgIGNhc2UgSU5EWF9UQUc6CisgICAgICAgICAgICAvKiBTT05EIHVua25vd24sIElORFggdW5uZWNlc3Nhcnk7IGlnbm9yZSBib3RoICovCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQQ19fVEFHOgorICAgICAgICAgICAgLyogbnVtYmVyIG9mIHBhbGV0dGVzLCB1bm5lZWRlZCAqLworICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxMik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJOQU1fVEFHOgorICAgICAgICAgICAgLyogbG9hZCB1cCB0aGUgbmFtZSAqLworICAgICAgICAgICAgYnVmZmVyID0gYXZfbWFsbG9jKHNpemUrMSk7CisgICAgICAgICAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgaWYgKChyZXQgPSBhdmlvX3JlYWQocGIsIGJ1ZmZlciwgc2l6ZSkpICE9IHNpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9IDA7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsICJ0aXRsZSIsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVpFX1RBRzoKKyAgICAgICAgICAgIC8qIHZpZGVvIHJlc29sdXRpb24gb3ZlcnJpZGUgKi8KKyAgICAgICAgICAgIHdjMy0+d2lkdGggID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIHdjMy0+aGVpZ2h0ID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUEFMVF9UQUc6CisgICAgICAgICAgICAvKiBvbmUgb2Ygc2V2ZXJhbCBwYWxldHRlcyAqLworICAgICAgICAgICAgYXZpb19zZWVrKHBiLCAtOCwgU0VFS19DVVIpOworICAgICAgICAgICAgYXZfYXBwZW5kX3BhY2tldChwYiwgJndjMy0+dnBrdCwgOCArIFBBTEVUVEVfU0laRSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiAgdW5yZWNvZ25pemVkIFdDMyBjaHVuazogJWMlYyVjJWMgKDB4JTAyWCUwMlglMDJYJTAyWClcbiIsCisgICAgICAgICAgICAgICAgKHVpbnQ4X3QpZm91cmNjX3RhZywgKHVpbnQ4X3QpKGZvdXJjY190YWcgPj4gOCksICh1aW50OF90KShmb3VyY2NfdGFnID4+IDE2KSwgKHVpbnQ4X3QpKGZvdXJjY190YWcgPj4gMjQpLAorICAgICAgICAgICAgICAgICh1aW50OF90KWZvdXJjY190YWcsICh1aW50OF90KShmb3VyY2NfdGFnID4+IDgpLCAodWludDhfdCkoZm91cmNjX3RhZyA+PiAxNiksICh1aW50OF90KShmb3VyY2NfdGFnID4+IDI0KSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGZvdXJjY190YWcgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAvKiBjaHVuayBzaXplcyBhcmUgMTYtYml0IGFsaWduZWQgKi8KKyAgICAgICAgc2l6ZSA9IChhdmlvX3JiMzIocGIpICsgMSkgJiAofjEpOworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICB9IHdoaWxlIChmb3VyY2NfdGFnICE9IEJSQ0hfVEFHKTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIGRlY29kZXIgc3RyZWFtcyAqLworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCBXQzNfRlJBTUVfRlBTKTsKKyAgICB3YzMtPnZpZGVvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1hBTl9XQzM7CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjLT53aWR0aCA9IHdjMy0+d2lkdGg7CisgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSB3YzMtPmhlaWdodDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCBXQzNfRlJBTUVfRlBTKTsKKyAgICB3YzMtPmF1ZGlvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDE7CisgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IFdDM19BVURJT19DSEFOTkVMUzsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBXQzNfQVVESU9fQklUUzsKKyAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gV0MzX1NBTVBMRV9SQVRFOworICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqCisgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBXQzNfQVVESU9fQklUUyAqIFdDM19BVURJT19DSEFOTkVMUzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdjM19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIFdjM0RlbXV4Q29udGV4dCAqd2MzID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVuc2lnbmVkIGludCBmb3VyY2NfdGFnOworICAgIHVuc2lnbmVkIGludCBzaXplOworICAgIGludCBwYWNrZXRfcmVhZCA9IDA7CisgICAgaW50IHJldCA9IDA7CisgICAgdW5zaWduZWQgY2hhciB0ZXh0WzEwMjRdOworCisgICAgd2hpbGUgKCFwYWNrZXRfcmVhZCkgeworCisgICAgICAgIGZvdXJjY190YWcgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAvKiBjaHVuayBzaXplcyBhcmUgMTYtYml0IGFsaWduZWQgKi8KKyAgICAgICAgc2l6ZSA9IChhdmlvX3JiMzIocGIpICsgMSkgJiAofjEpOworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAgICAgc3dpdGNoIChmb3VyY2NfdGFnKSB7CisKKyAgICAgICAgY2FzZSBCUkNIX1RBRzoKKyAgICAgICAgICAgIC8qIG5vLW9wICovCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNIT1RfVEFHOgorICAgICAgICAgICAgLyogbG9hZCB1cCBuZXcgcGFsZXR0ZSAqLworICAgICAgICAgICAgYXZpb19zZWVrKHBiLCAtOCwgU0VFS19DVVIpOworICAgICAgICAgICAgYXZfYXBwZW5kX3BhY2tldChwYiwgJndjMy0+dnBrdCwgOCArIDQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWR0FfX1RBRzoKKyAgICAgICAgICAgIC8qIHNlbmQgb3V0IHZpZGVvIGNodW5rICovCisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIC04LCBTRUVLX0NVUik7CisgICAgICAgICAgICByZXQ9IGF2X2FwcGVuZF9wYWNrZXQocGIsICZ3YzMtPnZwa3QsIDggKyBzaXplKTsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvciBpZiB3ZSBoYXZlIHNvbWUgZGF0YQorICAgICAgICAgICAgaWYgKHdjMy0+dnBrdC5zaXplID4gMCkKKyAgICAgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgKnBrdCA9IHdjMy0+dnBrdDsKKyAgICAgICAgICAgIHdjMy0+dnBrdC5kYXRhID0gTlVMTDsgd2MzLT52cGt0LnNpemUgPSAwOworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSB3YzMtPnZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICAgICAgICAgIHBrdC0+cHRzID0gd2MzLT5wdHM7CisgICAgICAgICAgICBwYWNrZXRfcmVhZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRFWFRfVEFHOgorICAgICAgICAgICAgLyogc3VidGl0bGUgY2h1bmsgKi8KKyNpZiAwCisgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworI2Vsc2UKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpc2l6ZSA+IHNpemVvZih0ZXh0KSB8fCAocmV0ID0gYXZpb19yZWFkKHBiLCB0ZXh0LCBzaXplKSkgIT0gc2l6ZSkKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgYXZfbG9nIChzLCBBVl9MT0dfREVCVUcsICJTdWJ0aXRsZSB0aW1lIVxuIik7CisgICAgICAgICAgICAgICAgaWYgKGkgPj0gc2l6ZSB8fCBhdl9zdHJubGVuKCZ0ZXh0W2kgKyAxXSwgc2l6ZSAtIGkgLSAxKSA+PSBzaXplIC0gaSAtIDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGF2X2xvZyAocywgQVZfTE9HX0RFQlVHLCAiICBpbmdsaXNoOiAlc1xuIiwgJnRleHRbaSArIDFdKTsKKyAgICAgICAgICAgICAgICBpICs9IHRleHRbaV0gKyAxOworICAgICAgICAgICAgICAgIGlmIChpID49IHNpemUgfHwgYXZfc3RybmxlbigmdGV4dFtpICsgMV0sIHNpemUgLSBpIC0gMSkgPj0gc2l6ZSAtIGkgLSAxKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBhdl9sb2cgKHMsIEFWX0xPR19ERUJVRywgIiAgZG95dHNjaDogJXNcbiIsICZ0ZXh0W2kgKyAxXSk7CisgICAgICAgICAgICAgICAgaSArPSB0ZXh0W2ldICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBzaXplIHx8IGF2X3N0cm5sZW4oJnRleHRbaSArIDFdLCBzaXplIC0gaSAtIDEpID49IHNpemUgLSBpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgYXZfbG9nIChzLCBBVl9MT0dfREVCVUcsICIgIGZyb25zYXk6ICVzXG4iLCAmdGV4dFtpICsgMV0pOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRElfVEFHOgorICAgICAgICAgICAgLyogc2VuZCBvdXQgYXVkaW8gY2h1bmsgKi8KKyAgICAgICAgICAgIHJldD0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBzaXplKTsKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gd2MzLT5hdWRpb19zdHJlYW1faW5kZXg7CisgICAgICAgICAgICBwa3QtPnB0cyA9IHdjMy0+cHRzOworCisgICAgICAgICAgICAvKiB0aW1lIHRvIGFkdmFuY2UgcHRzICovCisgICAgICAgICAgICB3YzMtPnB0cysrOworCisgICAgICAgICAgICBwYWNrZXRfcmVhZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nIChzLCBBVl9MT0dfRVJST1IsICIgIHVucmVjb2duaXplZCBXQzMgY2h1bms6ICVjJWMlYyVjICgweCUwMlglMDJYJTAyWCUwMlgpXG4iLAorICAgICAgICAgICAgICAgICh1aW50OF90KWZvdXJjY190YWcsICh1aW50OF90KShmb3VyY2NfdGFnID4+IDgpLCAodWludDhfdCkoZm91cmNjX3RhZyA+PiAxNiksICh1aW50OF90KShmb3VyY2NfdGFnID4+IDI0KSwKKyAgICAgICAgICAgICAgICAodWludDhfdClmb3VyY2NfdGFnLCAodWludDhfdCkoZm91cmNjX3RhZyA+PiA4KSwgKHVpbnQ4X3QpKGZvdXJjY190YWcgPj4gMTYpLCAodWludDhfdCkoZm91cmNjX3RhZyA+PiAyNCkpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHBhY2tldF9yZWFkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3YzNfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgV2MzRGVtdXhDb250ZXh0ICp3YzMgPSBzLT5wcml2X2RhdGE7CisKKyAgICBpZiAod2MzLT52cGt0LnNpemUgPiAwKQorICAgICAgICBhdl9mcmVlX3BhY2tldCgmd2MzLT52cGt0KTsKKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3djM19kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ3YzNtb3ZpZSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldpbmcgQ29tbWFuZGVyIElJSSBtb3ZpZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihXYzNEZW11eENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHdjM19wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSB3YzNfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gd2MzX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHdjM19yZWFkX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC93ZWJtZGFzaGVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3dlYm1kYXNoZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNmI3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93ZWJtZGFzaGVuYy5jCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogV2ViTSBEQVNIIE1hbmlmZXN0IFhNTCBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDE0IFZpZ25lc2ggVmVua2F0YXN1YnJhbWFuaWFuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBXZWJNIERBU0ggU3BlY2lmaWNhdGlvbjoKKyAqIGh0dHBzOi8vc2l0ZXMuZ29vZ2xlLmNvbS9hL3dlYm1wcm9qZWN0Lm9yZy93aWtpL2FkYXB0aXZlLXN0cmVhbWluZy93ZWJtLWRhc2gtc3BlY2lmaWNhdGlvbgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdHJvc2thLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQWRhcHRhdGlvblNldCB7CisgICAgY2hhciBpZFsxMF07CisgICAgaW50ICpzdHJlYW1zOworICAgIGludCBuYl9zdHJlYW1zOworfSBBZGFwdGF0aW9uU2V0OworCit0eXBlZGVmIHN0cnVjdCBXZWJNRGFzaE11eENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgICpjbGFzczsKKyAgICBjaGFyICphZGFwdGF0aW9uX3NldHM7CisgICAgQWRhcHRhdGlvblNldCAqYXM7CisgICAgaW50IG5iX2FzOworICAgIGludCByZXByZXNlbnRhdGlvbl9pZDsKK30gV2ViTURhc2hNdXhDb250ZXh0OworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2NvZGVjX25hbWUoaW50IGNvZGVjX2lkKQoreworICAgIHN3aXRjaCAoY29kZWNfaWQpIHsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDg6CisgICAgICAgICAgICByZXR1cm4gInZwOCI7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfVlA5OgorICAgICAgICAgICAgcmV0dXJuICJ2cDkiOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1ZPUkJJUzoKKyAgICAgICAgICAgIHJldHVybiAidm9yYmlzIjsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9PUFVTOgorICAgICAgICAgICAgcmV0dXJuICJvcHVzIjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBkb3VibGUgZ2V0X2R1cmF0aW9uKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgZG91YmxlIG1heCA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICpkdXJhdGlvbiA9IGF2X2RpY3RfZ2V0KHMtPnN0cmVhbXNbaV0tPm1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVVJBVElPTiwgTlVMTCwgMCk7CisgICAgICAgIGlmICghZHVyYXRpb24gfHwgYXRvZihkdXJhdGlvbi0+dmFsdWUpIDwgMCkgY29udGludWU7CisgICAgICAgIGlmIChhdG9mKGR1cmF0aW9uLT52YWx1ZSkgPiBtYXgpIG1heCA9IGF0b2YoZHVyYXRpb24tPnZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIG1heCAvIDEwMDA7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgZG91YmxlIG1pbl9idWZmZXJfdGltZSA9IDEuMDsKKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIik7CisgICAgYXZpb19wcmludGYocy0+cGIsICI8TVBEXG4iKTsKKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiAgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIlxuIik7CisgICAgYXZpb19wcmludGYocy0+cGIsICIgIHhtbG5zPVwidXJuOm1wZWc6REFTSDpzY2hlbWE6TVBEOjIwMTFcIlxuIik7CisgICAgYXZpb19wcmludGYocy0+cGIsICIgIHhzaTpzY2hlbWFMb2NhdGlvbj1cInVybjptcGVnOkRBU0g6c2NoZW1hOk1QRDoyMDExXCJcbiIpOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiICB0eXBlPVwic3RhdGljXCJcbiIpOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiICBtZWRpYVByZXNlbnRhdGlvbkR1cmF0aW9uPVwiUFQlZ1NcIlxuIiwKKyAgICAgICAgICAgICAgICBnZXRfZHVyYXRpb24ocykpOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiICBtaW5CdWZmZXJUaW1lPVwiUFQlZ1NcIlxuIiwKKyAgICAgICAgICAgICAgICBtaW5fYnVmZmVyX3RpbWUpOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiICBwcm9maWxlcz1cInVybjp3ZWJtOmRhc2g6cHJvZmlsZTp3ZWJtLW9uLWRlbWFuZDoyMDEyXCIiKTsKKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIj5cbiIpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9mb290ZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiPC9NUEQ+XG4iKTsKK30KKworc3RhdGljIGludCBzdWJzZWdtZW50X2FsaWdubWVudChBVkZvcm1hdENvbnRleHQgKnMsIEFkYXB0YXRpb25TZXQgKmFzKSB7CisgICAgaW50IGk7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmdvbGQgPSBhdl9kaWN0X2dldChzLT5zdHJlYW1zW2FzLT5zdHJlYW1zWzBdXS0+bWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVUVfVElNRVNUQU1QUywgTlVMTCwgMCk7CisgICAgaWYgKCFnb2xkKSByZXR1cm4gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdHMgPSBhdl9kaWN0X2dldChzLT5zdHJlYW1zW2FzLT5zdHJlYW1zW2ldXS0+bWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVRV9USU1FU1RBTVBTLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKCF0cyB8fCBzdHJuY21wKGdvbGQtPnZhbHVlLCB0cy0+dmFsdWUsIHN0cmxlbihnb2xkLT52YWx1ZSkpKSByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYml0c3RyZWFtX3N3aXRjaGluZyhBVkZvcm1hdENvbnRleHQgKnMsIEFkYXB0YXRpb25TZXQgKmFzKSB7CisgICAgaW50IGk7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmdvbGRfdHJhY2tfbnVtID0gYXZfZGljdF9nZXQocy0+c3RyZWFtc1thcy0+c3RyZWFtc1swXV0tPm1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNLX05VTUJFUiwgTlVMTCwgMCk7CisgICAgQVZDb2RlY0NvbnRleHQgKmdvbGRfY29kZWMgPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zWzBdXS0+Y29kZWM7CisgICAgaWYgKCFnb2xkX3RyYWNrX251bSkgcmV0dXJuIDA7CisgICAgZm9yIChpID0gMTsgaSA8IGFzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnRyYWNrX251bSA9IGF2X2RpY3RfZ2V0KHMtPnN0cmVhbXNbYXMtPnN0cmVhbXNbaV1dLT5tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNLX05VTUJFUiwgTlVMTCwgMCk7CisgICAgICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbYXMtPnN0cmVhbXNbaV1dLT5jb2RlYzsKKyAgICAgICAgaWYgKCF0cmFja19udW0gfHwKKyAgICAgICAgICAgIHN0cm5jbXAoZ29sZF90cmFja19udW0tPnZhbHVlLCB0cmFja19udW0tPnZhbHVlLCBzdHJsZW4oZ29sZF90cmFja19udW0tPnZhbHVlKSkgfHwKKyAgICAgICAgICAgIGdvbGRfY29kZWMtPmNvZGVjX2lkICE9IGNvZGVjLT5jb2RlY19pZCB8fAorICAgICAgICAgICAgZ29sZF9jb2RlYy0+ZXh0cmFkYXRhX3NpemUgIT0gY29kZWMtPmV4dHJhZGF0YV9zaXplIHx8CisgICAgICAgICAgICBtZW1jbXAoZ29sZF9jb2RlYy0+ZXh0cmFkYXRhLCBjb2RlYy0+ZXh0cmFkYXRhLCBjb2RlYy0+ZXh0cmFkYXRhX3NpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworLyoKKyAqIFdyaXRlcyBhIFJlcHJlc2VudGF0aW9uIHdpdGhpbiBhbiBBZGFwdGF0aW9uIFNldC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kCisgKiA8IDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCB3cml0ZV9yZXByZXNlbnRhdGlvbihBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdHJlYW0sIGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dF93aWR0aCwgaW50IG91dHB1dF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRfc2FtcGxlX3JhdGUpIHsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqaXJhbmdlID0gYXZfZGljdF9nZXQoc3RyZWFtLT5tZXRhZGF0YSwgSU5JVElBTElaQVRJT05fUkFOR0UsIE5VTEwsIDApOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICpjdWVzX3N0YXJ0ID0gYXZfZGljdF9nZXQoc3RyZWFtLT5tZXRhZGF0YSwgQ1VFU19TVEFSVCwgTlVMTCwgMCk7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmN1ZXNfZW5kID0gYXZfZGljdF9nZXQoc3RyZWFtLT5tZXRhZGF0YSwgQ1VFU19FTkQsIE5VTEwsIDApOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICpmaWxlbmFtZSA9IGF2X2RpY3RfZ2V0KHN0cmVhbS0+bWV0YWRhdGEsIEZJTEVOQU1FLCBOVUxMLCAwKTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqYmFuZHdpZHRoID0gYXZfZGljdF9nZXQoc3RyZWFtLT5tZXRhZGF0YSwgQkFORFdJRFRILCBOVUxMLCAwKTsKKyAgICBpZiAoIWlyYW5nZSB8fCBjdWVzX3N0YXJ0ID09IE5VTEwgfHwgY3Vlc19lbmQgPT0gTlVMTCB8fCBmaWxlbmFtZSA9PSBOVUxMIHx8CisgICAgICAgICFiYW5kd2lkdGgpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIjxSZXByZXNlbnRhdGlvbiBpZD1cIiVkXCIiLCBpZCk7CisgICAgYXZpb19wcmludGYocy0+cGIsICIgYmFuZHdpZHRoPVwiJXNcIiIsIGJhbmR3aWR0aC0+dmFsdWUpOworICAgIGlmIChzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBvdXRwdXRfd2lkdGgpCisgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIHdpZHRoPVwiJWRcIiIsIHN0cmVhbS0+Y29kZWMtPndpZHRoKTsKKyAgICBpZiAoc3RyZWFtLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgb3V0cHV0X2hlaWdodCkKKyAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIgaGVpZ2h0PVwiJWRcIiIsIHN0cmVhbS0+Y29kZWMtPmhlaWdodCk7CisgICAgaWYgKHN0cmVhbS0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU8gJiYgb3V0cHV0X3NhbXBsZV9yYXRlKQorICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiBhdWRpb1NhbXBsaW5nUmF0ZT1cIiVkXCIiLCBzdHJlYW0tPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZpb19wcmludGYocy0+cGIsICI+XG4iKTsKKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIjxCYXNlVVJMPiVzPC9CYXNlVVJMPlxuIiwgZmlsZW5hbWUtPnZhbHVlKTsKKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIjxTZWdtZW50QmFzZVxuIik7CisgICAgYXZpb19wcmludGYocy0+cGIsICIgIGluZGV4UmFuZ2U9XCIlcy0lc1wiPlxuIiwgY3Vlc19zdGFydC0+dmFsdWUsIGN1ZXNfZW5kLT52YWx1ZSk7CisgICAgYXZpb19wcmludGYocy0+cGIsICI8SW5pdGlhbGl6YXRpb25cbiIpOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiICByYW5nZT1cIjAtJXNcIiAvPlxuIiwgaXJhbmdlLT52YWx1ZSk7CisgICAgYXZpb19wcmludGYocy0+cGIsICI8L1NlZ21lbnRCYXNlPlxuIik7CisgICAgYXZpb19wcmludGYocy0+cGIsICI8L1JlcHJlc2VudGF0aW9uPlxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVja3MgaWYgd2lkdGggb2YgYWxsIHN0cmVhbXMgYXJlIHRoZSBzYW1lLiBSZXR1cm5zIDEgaWYgdHJ1ZSwgMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfbWF0Y2hpbmdfd2lkdGgoQVZGb3JtYXRDb250ZXh0ICpzLCBBZGFwdGF0aW9uU2V0ICphcykgeworICAgIGludCBmaXJzdF93aWR0aCwgaTsKKyAgICBpZiAoYXMtPm5iX3N0cmVhbXMgPCAyKSByZXR1cm4gMTsKKyAgICBmaXJzdF93aWR0aCA9IHMtPnN0cmVhbXNbYXMtPnN0cmVhbXNbMF1dLT5jb2RlYy0+d2lkdGg7CisgICAgZm9yIChpID0gMTsgaSA8IGFzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIGlmIChmaXJzdF93aWR0aCAhPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zW2ldXS0+Y29kZWMtPndpZHRoKQorICAgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCisvKgorICogQ2hlY2tzIGlmIGhlaWdodCBvZiBhbGwgc3RyZWFtcyBhcmUgdGhlIHNhbWUuIFJldHVybnMgMSBpZiB0cnVlLCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBjaGVja19tYXRjaGluZ19oZWlnaHQoQVZGb3JtYXRDb250ZXh0ICpzLCBBZGFwdGF0aW9uU2V0ICphcykgeworICAgIGludCBmaXJzdF9oZWlnaHQsIGk7CisgICAgaWYgKGFzLT5uYl9zdHJlYW1zIDwgMikgcmV0dXJuIDE7CisgICAgZmlyc3RfaGVpZ2h0ID0gcy0+c3RyZWFtc1thcy0+c3RyZWFtc1swXV0tPmNvZGVjLT5oZWlnaHQ7CisgICAgZm9yIChpID0gMTsgaSA8IGFzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIGlmIChmaXJzdF9oZWlnaHQgIT0gcy0+c3RyZWFtc1thcy0+c3RyZWFtc1tpXV0tPmNvZGVjLT5oZWlnaHQpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDaGVja3MgaWYgc2FtcGxlIHJhdGUgb2YgYWxsIHN0cmVhbXMgYXJlIHRoZSBzYW1lLiBSZXR1cm5zIDEgaWYgdHJ1ZSwgMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfbWF0Y2hpbmdfc2FtcGxlX3JhdGUoQVZGb3JtYXRDb250ZXh0ICpzLCBBZGFwdGF0aW9uU2V0ICphcykgeworICAgIGludCBmaXJzdF9zYW1wbGVfcmF0ZSwgaTsKKyAgICBpZiAoYXMtPm5iX3N0cmVhbXMgPCAyKSByZXR1cm4gMTsKKyAgICBmaXJzdF9zYW1wbGVfcmF0ZSA9IHMtPnN0cmVhbXNbYXMtPnN0cmVhbXNbMF1dLT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgZm9yIChpID0gMTsgaSA8IGFzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIGlmIChmaXJzdF9zYW1wbGVfcmF0ZSAhPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zW2ldXS0+Y29kZWMtPnNhbXBsZV9yYXRlKQorICAgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCisvKgorICogV3JpdGVzIGFuIEFkYXB0YXRpb24gU2V0LiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgPCAwIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfYWRhcHRhdGlvbl9zZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgYXNfaW5kZXgpCit7CisgICAgV2ViTURhc2hNdXhDb250ZXh0ICp3ID0gcy0+cHJpdl9kYXRhOworICAgIEFkYXB0YXRpb25TZXQgKmFzID0gJnctPmFzW2FzX2luZGV4XTsKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zWzBdXS0+Y29kZWM7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmxhbmc7CisgICAgaW50IGk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgYm9vbGVhblsyXVs2XSA9IHsgImZhbHNlIiwgInRydWUiIH07CisgICAgaW50IHN1YnNlZ21lbnRTdGFydHNXaXRoU0FQID0gMTsKKworICAgIC8vIFdpZHRoLCBIZWlnaHQgYW5kIFNhbXBsZSBSYXRlIHdpbGwgZ28gaW4gdGhlIEFkYXB0YXRpb25TZXQgdGFnIGlmIHRoZXkKKyAgICAvLyBhcmUgdGhlIHNhbWUgZm9yIGFsbCBjb250YWluZWQgUmVwcmVzZW50YXRpb25zLiBvdGhlcndpc2UsIHRoZXkgd2lsbCBnbworICAgIC8vIG9uIHRoZWlyIHJlc3BlY3RpdmUgUmVwcmVzZW50YXRpb24gdGFnLgorICAgIGludCB3aWR0aF9pbl9hcyA9IDEsIGhlaWdodF9pbl9hcyA9IDEsIHNhbXBsZV9yYXRlX2luX2FzID0gMTsKKyAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICB3aWR0aF9pbl9hcyA9IGNoZWNrX21hdGNoaW5nX3dpZHRoKHMsIGFzKTsKKyAgICAgIGhlaWdodF9pbl9hcyA9IGNoZWNrX21hdGNoaW5nX2hlaWdodChzLCBhcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNhbXBsZV9yYXRlX2luX2FzID0gY2hlY2tfbWF0Y2hpbmdfc2FtcGxlX3JhdGUocywgYXMpOworICAgIH0KKworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiPEFkYXB0YXRpb25TZXQgaWQ9XCIlc1wiIiwgYXMtPmlkKTsKKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiBtaW1lVHlwZT1cIiVzL3dlYm1cIiIsCisgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIGNvZGVjcz1cIiVzXCIiLCBnZXRfY29kZWNfbmFtZShjb2RlYy0+Y29kZWNfaWQpKTsKKworICAgIGxhbmcgPSBhdl9kaWN0X2dldChzLT5zdHJlYW1zW2FzLT5zdHJlYW1zWzBdXS0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIE5VTEwsIDApOworICAgIGlmIChsYW5nKSBhdmlvX3ByaW50ZihzLT5wYiwgIiBsYW5nPVwiJXNcIiIsIGxhbmctPnZhbHVlKTsKKworICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgd2lkdGhfaW5fYXMpCisgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIHdpZHRoPVwiJWRcIiIsIGNvZGVjLT53aWR0aCk7CisgICAgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBoZWlnaHRfaW5fYXMpCisgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIGhlaWdodD1cIiVkXCIiLCBjb2RlYy0+aGVpZ2h0KTsKKyAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIHNhbXBsZV9yYXRlX2luX2FzKQorICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiBhdWRpb1NhbXBsaW5nUmF0ZT1cIiVkXCIiLCBjb2RlYy0+c2FtcGxlX3JhdGUpOworCisgICAgYXZpb19wcmludGYocy0+cGIsICIgYml0c3RyZWFtU3dpdGNoaW5nPVwiJXNcIiIsCisgICAgICAgICAgICAgICAgYm9vbGVhbltiaXRzdHJlYW1fc3dpdGNoaW5nKHMsIGFzKV0pOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIHN1YnNlZ21lbnRBbGlnbm1lbnQ9XCIlc1wiIiwKKyAgICAgICAgICAgICAgICBib29sZWFuW3N1YnNlZ21lbnRfYWxpZ25tZW50KHMsIGFzKV0pOworCisgICAgZm9yIChpID0gMDsgaSA8IGFzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmtmID0gYXZfZGljdF9nZXQocy0+c3RyZWFtc1thcy0+c3RyZWFtc1tpXV0tPm1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTFVTVEVSX0tFWUZSQU1FLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKCFrZiB8fCAhc3RybmNtcChrZi0+dmFsdWUsICIwIiwgMSkpIHN1YnNlZ21lbnRTdGFydHNXaXRoU0FQID0gMDsKKyAgICB9CisgICAgYXZpb19wcmludGYocy0+cGIsICIgc3Vic2VnbWVudFN0YXJ0c1dpdGhTQVA9XCIlZFwiIiwgc3Vic2VnbWVudFN0YXJ0c1dpdGhTQVApOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiPlxuIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICB3cml0ZV9yZXByZXNlbnRhdGlvbihzLCBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zW2ldXSwgdy0+cmVwcmVzZW50YXRpb25faWQrKywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXdpZHRoX2luX2FzLCAhaGVpZ2h0X2luX2FzLCAhc2FtcGxlX3JhdGVfaW5fYXMpOworICAgIH0KKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIjwvQWRhcHRhdGlvblNldD5cbiIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvX2ludGVnZXIoY2hhciAqcCwgaW50IGxlbikKK3sKKyAgICBpbnQgcmV0OworICAgIGNoYXIgKnEgPSBhdl9tYWxsb2Moc2l6ZW9mKGNoYXIpICogbGVuKTsKKyAgICBpZiAoIXEpIHJldHVybiAtMTsKKyAgICBhdl9zdHJsY3B5KHEsIHAsIGxlbik7CisgICAgcmV0ID0gYXRvaShxKTsKKyAgICBhdl9mcmVlKHEpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYWRhcHRhdGlvbl9zZXRzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBXZWJNRGFzaE11eENvbnRleHQgKncgPSBzLT5wcml2X2RhdGE7CisgICAgY2hhciAqcCA9IHctPmFkYXB0YXRpb25fc2V0czsKKyAgICBjaGFyICpxOworICAgIGVudW0geyBuZXdfc2V0LCBwYXJzZWRfaWQsIHBhcnNpbmdfc3RyZWFtcyB9IHN0YXRlOworICAgIC8vIHN5bnRheCBpZD0wLHN0cmVhbXM9MCwxLDIgaWQ9MSxzdHJlYW1zPTMsNCBhbmQgc28gb24KKyAgICBzdGF0ZSA9IG5ld19zZXQ7CisgICAgd2hpbGUgKHAgPCB3LT5hZGFwdGF0aW9uX3NldHMgKyBzdHJsZW4ody0+YWRhcHRhdGlvbl9zZXRzKSkgeworICAgICAgICBpZiAoKnAgPT0gJyAnKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IG5ld19zZXQgJiYgIXN0cm5jbXAocCwgImlkPSIsIDMpKSB7CisgICAgICAgICAgICB3LT5hcyA9IGF2X3JlYWxsb2Mody0+YXMsIHNpemVvZigqdy0+YXMpICogKyt3LT5uYl9hcyk7CisgICAgICAgICAgICBpZiAody0+YXMgPT0gTlVMTCkgcmV0dXJuIC0xOworICAgICAgICAgICAgdy0+YXNbdy0+bmJfYXMgLSAxXS5uYl9zdHJlYW1zID0gMDsKKyAgICAgICAgICAgIHctPmFzW3ctPm5iX2FzIC0gMV0uc3RyZWFtcyA9IE5VTEw7CisgICAgICAgICAgICBwICs9IDM7IC8vIGNvbnN1bWUgImlkPSIKKyAgICAgICAgICAgIHEgPSB3LT5hc1t3LT5uYl9hcyAtIDFdLmlkOworICAgICAgICAgICAgd2hpbGUgKCpwICE9ICcsJykgKnErKyA9ICpwKys7CisgICAgICAgICAgICAqcSA9IDA7CisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBzdGF0ZSA9IHBhcnNlZF9pZDsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBwYXJzZWRfaWQgJiYgIXN0cm5jbXAocCwgInN0cmVhbXM9IiwgOCkpIHsKKyAgICAgICAgICAgIHAgKz0gODsgLy8gY29uc3VtZSAic3RyZWFtcz0iCisgICAgICAgICAgICBzdGF0ZSA9IHBhcnNpbmdfc3RyZWFtczsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBwYXJzaW5nX3N0cmVhbXMpIHsKKyAgICAgICAgICAgIHN0cnVjdCBBZGFwdGF0aW9uU2V0ICphcyA9ICZ3LT5hc1t3LT5uYl9hcyAtIDFdOworICAgICAgICAgICAgcSA9IHA7CisgICAgICAgICAgICB3aGlsZSAoKnEgIT0gJ1wwJyAmJiAqcSAhPSAnLCcgJiYgKnEgIT0gJyAnKSBxKys7CisgICAgICAgICAgICBhcy0+c3RyZWFtcyA9IGF2X3JlYWxsb2MoYXMtPnN0cmVhbXMsIHNpemVvZigqYXMtPnN0cmVhbXMpICogKythcy0+bmJfc3RyZWFtcyk7CisgICAgICAgICAgICBpZiAoYXMtPnN0cmVhbXMgPT0gTlVMTCkgcmV0dXJuIC0xOworICAgICAgICAgICAgYXMtPnN0cmVhbXNbYXMtPm5iX3N0cmVhbXMgLSAxXSA9IHRvX2ludGVnZXIocCwgcSAtIHAgKyAxKTsKKyAgICAgICAgICAgIGlmIChhcy0+c3RyZWFtc1thcy0+bmJfc3RyZWFtcyAtIDFdIDwgMCkgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKCpxID09ICdcMCcpIGJyZWFrOworICAgICAgICAgICAgaWYgKCpxID09ICcgJykgc3RhdGUgPSBuZXdfc2V0OworICAgICAgICAgICAgcCA9ICsrcTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZWJtX2Rhc2hfbWFuaWZlc3Rfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgc3RhcnQgPSAwLjA7CisgICAgV2ViTURhc2hNdXhDb250ZXh0ICp3ID0gcy0+cHJpdl9kYXRhOworICAgIHBhcnNlX2FkYXB0YXRpb25fc2V0cyhzKTsKKyAgICB3cml0ZV9oZWFkZXIocyk7CisgICAgYXZpb19wcmludGYocy0+cGIsICI8UGVyaW9kIGlkPVwiMFwiIik7CisgICAgYXZpb19wcmludGYocy0+cGIsICIgc3RhcnQ9XCJQVCVnU1wiIiwgc3RhcnQpOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIGR1cmF0aW9uPVwiUFQlZ1NcIiIsIGdldF9kdXJhdGlvbihzKSk7CisgICAgYXZpb19wcmludGYocy0+cGIsICIgPlxuIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdy0+bmJfYXM7IGkrKykgeworICAgICAgICBpZiAod3JpdGVfYWRhcHRhdGlvbl9zZXQocywgaSkgPCAwKSByZXR1cm4gLTE7CisgICAgfQorCisgICAgYXZpb19wcmludGYocy0+cGIsICI8L1BlcmlvZD5cbiIpOworICAgIHdyaXRlX2Zvb3RlcihzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZWJtX2Rhc2hfbWFuaWZlc3Rfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Cit9CisKK3N0YXRpYyBpbnQgd2VibV9kYXNoX21hbmlmZXN0X3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFdlYk1EYXNoTXV4Q29udGV4dCAqdyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdy0+bmJfYXM7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmdy0+YXNbaV0uc3RyZWFtcyk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZ3LT5hcyk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFdlYk1EYXNoTXV4Q29udGV4dCwgeCkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiYWRhcHRhdGlvbl9zZXRzIiwgIkFkYXB0YXRpb24gc2V0cy4gU3ludGF4OiBpZD0wLHN0cmVhbXM9MCwxLDIgaWQ9MSxzdHJlYW1zPTMsNCBhbmQgc28gb24iLCBPRkZTRVQoYWRhcHRhdGlvbl9zZXRzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKKyNpZiBDT05GSUdfV0VCTV9EQVNIX01BTklGRVNUX01VWEVSCitzdGF0aWMgY29uc3QgQVZDbGFzcyB3ZWJtX2Rhc2hfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiV2ViTSBEQVNIIE1hbmlmZXN0IG11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3dlYm1fZGFzaF9tYW5pZmVzdF9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAid2VibV9kYXNoX21hbmlmZXN0IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2ViTSBEQVNIIE1hbmlmZXN0IiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImFwcGxpY2F0aW9uL3htbCIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gInhtbCIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKFdlYk1EYXNoTXV4Q29udGV4dCksCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gd2VibV9kYXNoX21hbmlmZXN0X3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSB3ZWJtX2Rhc2hfbWFuaWZlc3Rfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IHdlYm1fZGFzaF9tYW5pZmVzdF93cml0ZV90cmFpbGVyLAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZ3ZWJtX2Rhc2hfY2xhc3MsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvd2VicGVuYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3dlYnBlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTExMGRlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3dlYnBlbmMuYwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIHdlYnAgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgV2VicENvbnRleHR7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IGZyYW1lX2NvdW50OworICAgIEFWUGFja2V0IGxhc3RfcGt0OworICAgIGludCBsb29wOworfSBXZWJwQ29udGV4dDsKKworc3RhdGljIGludCB3ZWJwX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgaWYgKHMtPm5iX3N0cmVhbXMgIT0gMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT25seSBleGFjdGx5IDEgc3RyZWFtIGlzIHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHN0ID0gcy0+c3RyZWFtc1swXTsKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XRUJQKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPbmx5IFdlYlAgaXMgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMjQsIDEsIDEwMDApOworCisgICAgYXZpb193cml0ZShzLT5wYiwgIlJJRkZcMFwwXDBcMFdFQlAiLCAxMik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbHVzaChBVkZvcm1hdENvbnRleHQgKnMsIGludCB0cmFpbGVyLCBpbnQ2NF90IHB0cykKK3sKKyAgICBXZWJwQ29udGV4dCAqdyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworCisgICAgaWYgKHctPmxhc3RfcGt0LnNpemUpIHsKKyAgICAgICAgaW50IHNraXAgPSAwOworICAgICAgICB1bnNpZ25lZCBmbGFncyA9IDA7CisgICAgICAgIGludCB2cDh4ID0gMDsKKworICAgICAgICBpZiAoQVZfUkwzMih3LT5sYXN0X3BrdC5kYXRhKSA9PSBBVl9STDMyKCJSSUZGIikpCisgICAgICAgICAgICBza2lwID0gMTI7CisgICAgICAgIGlmIChBVl9STDMyKHctPmxhc3RfcGt0LmRhdGEgKyBza2lwKSA9PSBBVl9STDMyKCJWUDhYIikpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IHctPmxhc3RfcGt0LmRhdGFbc2tpcCArIDQgKyA0XTsKKyAgICAgICAgICAgIHZwOHggPSAxOworICAgICAgICAgICAgc2tpcCArPSBBVl9STDMyKHctPmxhc3RfcGt0LmRhdGEgKyBza2lwICsgNCkgKyA4OworICAgICAgICB9CisKKyAgICAgICAgdy0+ZnJhbWVfY291bnQgKys7CisKKyAgICAgICAgaWYgKHctPmZyYW1lX2NvdW50ID09IDEpIHsKKyAgICAgICAgICAgIGlmICghdHJhaWxlcikgeworICAgICAgICAgICAgICAgIHZwOHggPSAxOworICAgICAgICAgICAgICAgIGZsYWdzIHw9IDIgKyAxNjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZwOHgpIHsKKyAgICAgICAgICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCAiVlA4WCIsIDQpOworICAgICAgICAgICAgICAgIGF2aW9fd2wzMihzLT5wYiwgMTApOworICAgICAgICAgICAgICAgIGF2aW9fdzgocy0+cGIsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBhdmlvX3dsMjQocy0+cGIsIDApOworICAgICAgICAgICAgICAgIGF2aW9fd2wyNChzLT5wYiwgc3QtPmNvZGVjLT53aWR0aCAtIDEpOworICAgICAgICAgICAgICAgIGF2aW9fd2wyNChzLT5wYiwgc3QtPmNvZGVjLT5oZWlnaHQgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJhaWxlcikgeworICAgICAgICAgICAgICAgIGF2aW9fd3JpdGUocy0+cGIsICJBTklNIiwgNCk7CisgICAgICAgICAgICAgICAgYXZpb193bDMyKHMtPnBiLCA2KTsKKyAgICAgICAgICAgICAgICBhdmlvX3dsMzIocy0+cGIsIDB4RkZGRkZGRkYpOworICAgICAgICAgICAgICAgIGF2aW9fd2wxNihzLT5wYiwgdy0+bG9vcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAody0+ZnJhbWVfY291bnQgPiB0cmFpbGVyKSB7CisgICAgICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCAiQU5NRiIsIDQpOworICAgICAgICAgICAgYXZpb193bDMyKHMtPnBiLCAxNiArIHctPmxhc3RfcGt0LnNpemUgLSBza2lwKTsKKyAgICAgICAgICAgIGF2aW9fd2wyNChzLT5wYiwgMCk7CisgICAgICAgICAgICBhdmlvX3dsMjQocy0+cGIsIDApOworICAgICAgICAgICAgYXZpb193bDI0KHMtPnBiLCBzdC0+Y29kZWMtPndpZHRoIC0gMSk7CisgICAgICAgICAgICBhdmlvX3dsMjQocy0+cGIsIHN0LT5jb2RlYy0+aGVpZ2h0IC0gMSk7CisgICAgICAgICAgICBpZiAody0+bGFzdF9wa3QucHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIHB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgICAgIGF2aW9fd2wyNChzLT5wYiwgcHRzIC0gdy0+bGFzdF9wa3QucHRzKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGF2aW9fd2wyNChzLT5wYiwgdy0+bGFzdF9wa3QuZHVyYXRpb24pOworICAgICAgICAgICAgYXZpb193OChzLT5wYiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgdy0+bGFzdF9wa3QuZGF0YSArIHNraXAsIHctPmxhc3RfcGt0LnNpemUgLSBza2lwKTsKKyAgICAgICAgYXZfZnJlZV9wYWNrZXQoJnctPmxhc3RfcGt0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZWJwX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgV2VicENvbnRleHQgKncgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmx1c2gocywgMCwgcGt0LT5wdHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdl9jb3B5X3BhY2tldCgmdy0+bGFzdF9wa3QsIHBrdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZWJwX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHVuc2lnbmVkIGZpbGVzaXplOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZsdXNoKHMsIDEsIEFWX05PUFRTX1ZBTFVFKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZmlsZXNpemUgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIGF2aW9fc2VlayhzLT5wYiwgNCwgU0VFS19TRVQpOworICAgIGF2aW9fd2wzMihzLT5wYiwgZmlsZXNpemUgLSA4KTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihXZWJwQ29udGV4dCwgeCkKKyNkZWZpbmUgRU5DIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImxvb3AiLCAiTnVtYmVyIG9mIHRpbWVzIHRvIGxvb3AgdGhlIG91dHB1dDogMCAtIGluZmluaXRlIGxvb3AiLCBPRkZTRVQobG9vcCksCisgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgNjU1MzUsIEVOQyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgd2VicF9tdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJXZWJQIG11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKK307CitBVk91dHB1dEZvcm1hdCBmZl93ZWJwX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ3ZWJwIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2ViUCIpLAorICAgIC5leHRlbnNpb25zICAgICA9ICJ3ZWJwIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoV2VicENvbnRleHQpLAorICAgIC52aWRlb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX1dFQlAsCisgICAgLndyaXRlX2hlYWRlciAgID0gd2VicF93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gd2VicF93cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gd2VicF93cml0ZV90cmFpbGVyLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ3ZWJwX211eGVyX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX1ZBUklBQkxFX0ZQUywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvd2VidnR0ZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvd2VidnR0ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1N2U4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93ZWJ2dHRkZWMuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDbMOpbWVudCBCxZNzY2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogV2ViVlRUIHN1YnRpdGxlIGRlbXV4ZXIKKyAqIEBzZWUgaHR0cDovL2Rldi53My5vcmcvaHRtbDUvd2VidnR0LworICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic3VidGl0bGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBGRkRlbXV4U3VidGl0bGVzUXVldWUgcTsKKyAgICBpbnQga2luZDsKK30gV2ViVlRUQ29udGV4dDsKKworc3RhdGljIGludCB3ZWJ2dHRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqcHRyID0gcC0+YnVmOworCisgICAgaWYgKEFWX1JCMjQocHRyKSA9PSAweEVGQkJCRikKKyAgICAgICAgcHRyICs9IDM7ICAvKiBza2lwIFVURi04IEJPTSAqLworICAgIGlmICghc3RybmNtcChwdHIsICJXRUJWVFQiLCA2KSAmJgorICAgICAgICAoIXB0cls2XSB8fCBzdHJjaHIoIlxuXHJcdCAiLCBwdHJbNl0pKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50NjRfdCByZWFkX3RzKGNvbnN0IGNoYXIgKnMpCit7CisgICAgaW50IGhoLCBtbSwgc3MsIG1zOworICAgIGlmIChzc2NhbmYocywgIiV1OiV1OiV1LiV1IiwgJmhoLCAmbW0sICZzcywgJm1zKSA9PSA0KSByZXR1cm4gKGhoKjM2MDBMTCArIG1tKjYwTEwgKyBzcykgKiAxMDAwTEwgKyBtczsKKyAgICBpZiAoc3NjYW5mKHMsICAgICIldToldS4ldSIsICAgICAgJm1tLCAmc3MsICZtcykgPT0gMykgcmV0dXJuICggICAgICAgICAgICBtbSo2MExMICsgc3MpICogMTAwMExMICsgbXM7CisgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworfQorCitzdGF0aWMgaW50IHdlYnZ0dF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgV2ViVlRUQ29udGV4dCAqd2VidnR0ID0gcy0+cHJpdl9kYXRhOworICAgIEFWQlByaW50IGhlYWRlciwgY3VlOworICAgIGludCByZXMgPSAwOworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfV0VCVlRUOworICAgIHN0LT5kaXNwb3NpdGlvbiB8PSB3ZWJ2dHQtPmtpbmQ7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmaGVhZGVyLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgIGF2X2JwcmludF9pbml0KCZjdWUsICAgIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQ2NF90IHBvczsKKyAgICAgICAgQVZQYWNrZXQgKnN1YjsKKyAgICAgICAgY29uc3QgY2hhciAqcCwgKmlkZW50aWZpZXIsICpzZXR0aW5nczsKKyAgICAgICAgaW50IGlkZW50aWZpZXJfbGVuLCBzZXR0aW5nc19sZW47CisgICAgICAgIGludDY0X3QgdHNfc3RhcnQsIHRzX2VuZDsKKworICAgICAgICBmZl9zdWJ0aXRsZXNfcmVhZF9jaHVuayhzLT5wYiwgJmN1ZSk7CisKKyAgICAgICAgaWYgKCFjdWUubGVuKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcCA9IGlkZW50aWZpZXIgPSBjdWUuc3RyOworICAgICAgICBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworCisgICAgICAgIC8qIGlnbm9yZSBoZWFkZXIgY2h1bmsgKi8KKyAgICAgICAgaWYgKCFzdHJuY21wKHAsICJceEVGXHhCQlx4QkZXRUJWVFQiLCA5KSB8fAorICAgICAgICAgICAgIXN0cm5jbXAocCwgIldFQlZUVCIsIDYpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogb3B0aW9uYWwgY3VlIGlkZW50aWZpZXIgKGNhbiBiZSBhIG51bWJlciBsaWtlIGluIFNSVCBvciBzb21lIGtpbmQgb2YKKyAgICAgICAgICogY2hhcHRlcmluZyBpZCkgKi8KKyAgICAgICAgZm9yIChpID0gMDsgcFtpXSAmJiBwW2ldICE9ICdcbicgJiYgcFtpXSAhPSAnXHInOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RybmNtcChwICsgaSwgIi0tPiIsIDMpKSB7CisgICAgICAgICAgICAgICAgaWRlbnRpZmllciA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpZGVudGlmaWVyKQorICAgICAgICAgICAgaWRlbnRpZmllcl9sZW4gPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlkZW50aWZpZXJfbGVuID0gc3RyY3NwbihwLCAiXHJcbiIpOworICAgICAgICAgICAgcCArPSBpZGVudGlmaWVyX2xlbjsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnXHInKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGN1ZSB0aW1lc3RhbXBzICovCisgICAgICAgIGlmICgodHNfc3RhcnQgPSByZWFkX3RzKHApKSA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIShwID0gc3Ryc3RyKHAsICItLT4iKSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcCArPSAyOworICAgICAgICBkbyBwKys7IHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0Jyk7CisgICAgICAgIGlmICgodHNfZW5kID0gcmVhZF90cyhwKSkgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBvcHRpb25hbCBjdWUgc2V0dGluZ3MgKi8KKyAgICAgICAgcCArPSBzdHJjc3BuKHAsICJcblx0ICIpOworICAgICAgICB3aGlsZSAoKnAgPT0gJ1x0JyB8fCAqcCA9PSAnICcpCisgICAgICAgICAgICBwKys7CisgICAgICAgIHNldHRpbmdzID0gcDsKKyAgICAgICAgc2V0dGluZ3NfbGVuID0gc3RyY3NwbihwLCAiXHJcbiIpOworICAgICAgICBwICs9IHNldHRpbmdzX2xlbjsKKyAgICAgICAgaWYgKCpwID09ICdccicpCisgICAgICAgICAgICBwKys7CisgICAgICAgIGlmICgqcCA9PSAnXG4nKQorICAgICAgICAgICAgcCsrOworCisgICAgICAgIC8qIGNyZWF0ZSBwYWNrZXQgKi8KKyAgICAgICAgc3ViID0gZmZfc3VidGl0bGVzX3F1ZXVlX2luc2VydCgmd2VidnR0LT5xLCBwLCBzdHJsZW4ocCksIDApOworICAgICAgICBpZiAoIXN1YikgeworICAgICAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgc3ViLT5wb3MgPSBwb3M7CisgICAgICAgIHN1Yi0+cHRzID0gdHNfc3RhcnQ7CisgICAgICAgIHN1Yi0+ZHVyYXRpb24gPSB0c19lbmQgLSB0c19zdGFydDsKKworI2RlZmluZSBTRVRfU0lERV9EQVRBKG5hbWUsIHR5cGUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChuYW1lIyNfbGVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50OF90ICpidWYgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShzdWIsIHR5cGUsIG5hbWUjI19sZW4pOyAgXAorICAgICAgICBpZiAoIWJ1ZikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZ290byBlbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtZW1jcHkoYnVmLCBuYW1lLCBuYW1lIyNfbGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworICAgICAgICBTRVRfU0lERV9EQVRBKGlkZW50aWZpZXIsIEFWX1BLVF9EQVRBX1dFQlZUVF9JREVOVElGSUVSKTsKKyAgICAgICAgU0VUX1NJREVfREFUQShzZXR0aW5ncywgICBBVl9QS1RfREFUQV9XRUJWVFRfU0VUVElOR1MpOworICAgIH0KKworICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9maW5hbGl6ZSgmd2VidnR0LT5xKTsKKworZW5kOgorICAgIGF2X2JwcmludF9maW5hbGl6ZSgmY3VlLCAgICBOVUxMKTsKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmhlYWRlciwgTlVMTCk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCB3ZWJ2dHRfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFdlYlZUVENvbnRleHQgKndlYnZ0dCA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3JlYWRfcGFja2V0KCZ3ZWJ2dHQtPnEsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgd2VidnR0X3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtaW5fdHMsIGludDY0X3QgdHMsIGludDY0X3QgbWF4X3RzLCBpbnQgZmxhZ3MpCit7CisgICAgV2ViVlRUQ29udGV4dCAqd2VidnR0ID0gcy0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZl9zdWJ0aXRsZXNfcXVldWVfc2Vlaygmd2VidnR0LT5xLCBzLCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl90cywgdHMsIG1heF90cywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHdlYnZ0dF9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBXZWJWVFRDb250ZXh0ICp3ZWJ2dHQgPSBzLT5wcml2X2RhdGE7CisgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2NsZWFuKCZ3ZWJ2dHQtPnEpOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihXZWJWVFRDb250ZXh0LCB4KQorI2RlZmluZSBLSU5EX0ZMQUdTIEFWX09QVF9GTEFHX1NVQlRJVExFX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAia2luZCIsICJTZXQga2luZCBvZiBXZWJWVFQgdHJhY2siLCBPRkZTRVQoa2luZCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBLSU5EX0ZMQUdTLCAid2VidnR0X2tpbmQiIH0sCisgICAgICAgIHsgInN1YnRpdGxlcyIsICAgICJXZWJWVFQgc3VidGl0bGVzIGtpbmQiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIDAsICJ3ZWJ2dHRfa2luZCIgfSwKKyAgICAgICAgeyAiY2FwdGlvbnMiLCAgICAgIldlYlZUVCBjYXB0aW9ucyBraW5kIiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9ESVNQT1NJVElPTl9DQVBUSU9OUyB9LCAgICAgSU5UX01JTiwgSU5UX01BWCwgMCwgIndlYnZ0dF9raW5kIiB9LAorICAgICAgICB7ICJkZXNjcmlwdGlvbnMiLCAiV2ViVlRUIGRlc2NyaXB0aW9ucyBraW5kIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0RFU0NSSVBUSU9OUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCAwLCAid2VidnR0X2tpbmQiIH0sCisgICAgICAgIHsgIm1ldGFkYXRhIiwgICAgICJXZWJWVFQgbWV0YWRhdGEga2luZCIsICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfRElTUE9TSVRJT05fTUVUQURBVEEgfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIDAsICJ3ZWJ2dHRfa2luZCIgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgd2VidnR0X2RlbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgID0gIldlYlZUVCBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfd2VidnR0X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIndlYnZ0dCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldlYlZUVCBzdWJ0aXRsZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihXZWJWVFRDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB3ZWJ2dHRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gd2VidnR0X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHdlYnZ0dF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrMiAgICAgPSB3ZWJ2dHRfcmVhZF9zZWVrLAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHdlYnZ0dF9yZWFkX2Nsb3NlLAorICAgIC5leHRlbnNpb25zICAgICA9ICJ2dHQiLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ3ZWJ2dHRfZGVtdXhlcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvd2VidnR0ZW5jLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvd2VidnR0ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzOTkzZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93ZWJ2dHRlbmMuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBNYXR0aGV3IEhlYW5leQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBXZWJWVFQgc3VidGl0bGUgbXV4ZXIKKyAqIEBzZWUgaHR0cDovL2Rldi53My5vcmcvaHRtbDUvd2VidnR0LworICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyB2b2lkIHdlYnZ0dF93cml0ZV90aW1lKEFWSU9Db250ZXh0ICpwYiwgaW50NjRfdCBtaWxsaXNlYykKK3sKKyAgICBpbnQ2NF90IHNlYywgbWluLCBob3VyOworICAgIHNlYyA9IG1pbGxpc2VjIC8gMTAwMDsKKyAgICBtaWxsaXNlYyAtPSAxMDAwICogc2VjOworICAgIG1pbiA9IHNlYyAvIDYwOworICAgIHNlYyAtPSA2MCAqIG1pbjsKKyAgICBob3VyID0gbWluIC8gNjA7CisgICAgbWluIC09IDYwICogaG91cjsKKworICAgIGlmIChob3VyID4gMCkKKyAgICAgICAgYXZpb19wcmludGYocGIsICIlIlBSSWQ2NCI6IiwgaG91cik7CisKKyAgICBhdmlvX3ByaW50ZihwYiwgIiUwMiJQUklkNjQiOiUwMiJQUklkNjQiLiUwMyJQUklkNjQiIiwgbWluLCBzZWMsIG1pbGxpc2VjKTsKK30KKworc3RhdGljIGludCB3ZWJ2dHRfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqY3R4KQoreworICAgIEFWU3RyZWFtICAgICAqcyA9IGN0eC0+c3RyZWFtc1swXTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBjdHgtPnBiOworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzLCA2NCwgMSwgMTAwMCk7CisKKyAgICBhdmlvX3ByaW50ZihwYiwgIldFQlZUVFxuIik7CisgICAgYXZpb19mbHVzaChwYik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZWJ2dHRfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWSU9Db250ZXh0ICAqcGIgPSBjdHgtPnBiOworICAgIGludCBpZF9zaXplLCBzZXR0aW5nc19zaXplOworICAgIHVpbnQ4X3QgKmlkLCAqc2V0dGluZ3M7CisKKyAgICBhdmlvX3ByaW50ZihwYiwgIlxuIik7CisKKyAgICBpZCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwgQVZfUEtUX0RBVEFfV0VCVlRUX0lERU5USUZJRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWRfc2l6ZSk7CisKKyAgICBpZiAoaWQgJiYgaWRfc2l6ZSA+IDApCisgICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiJS4qc1xuIiwgaWRfc2l6ZSwgaWQpOworCisgICAgd2VidnR0X3dyaXRlX3RpbWUocGIsIHBrdC0+cHRzKTsKKyAgICBhdmlvX3ByaW50ZihwYiwgIiAtLT4gIik7CisgICAgd2VidnR0X3dyaXRlX3RpbWUocGIsIHBrdC0+cHRzICsgcGt0LT5kdXJhdGlvbik7CisKKyAgICBzZXR0aW5ncyA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwgQVZfUEtUX0RBVEFfV0VCVlRUX1NFVFRJTkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmdzX3NpemUpOworCisgICAgaWYgKHNldHRpbmdzICYmIHNldHRpbmdzX3NpemUgPiAwKQorICAgICAgICBhdmlvX3ByaW50ZihwYiwgIiAlLipzIiwgc2V0dGluZ3Nfc2l6ZSwgc2V0dGluZ3MpOworCisgICAgYXZpb19wcmludGYocGIsICJcbiIpOworCisgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIGF2aW9fcHJpbnRmKHBiLCAiXG4iKTsKKworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl93ZWJ2dHRfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gIndlYnZ0dCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldlYlZUVCBzdWJ0aXRsZSIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJ2dHQiLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJ0ZXh0L3Z0dCIsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfVkFSSUFCTEVfRlBTIHwgQVZGTVRfVFNfTk9OU1RSSUNULAorICAgIC5zdWJ0aXRsZV9jb2RlYyAgICA9IEFWX0NPREVDX0lEX1dFQlZUVCwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSB3ZWJ2dHRfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHdlYnZ0dF93cml0ZV9wYWNrZXQsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3dlc3R3b29kX2F1ZC5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3dlc3R3b29kX2F1ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODY4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvd2VzdHdvb2RfYXVkLmMKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBXZXN0d29vZCBTdHVkaW9zIEFVRCBGb3JtYXQgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBXZXN0d29vZCBTdHVkaW9zIEFVRCBmaWxlIGRlbXV4ZXIKKyAqIGJ5IE1pa2UgTWVsYW5zb24gKG1lbGFuc29uQHBjaXN5cy5uZXQpCisgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgV2VzdHdvb2QgZmlsZSBmb3JtYXRzLCB2aXNpdDoKKyAqICAgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvCisgKiAgIGh0dHA6Ly93d3cuZ2VvY2l0aWVzLmNvbS9TaWxpY29uVmFsbGV5Lzg2ODIvYXVkMy50eHQKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBub3RlOiBUaGVyZSBpcyBubyBkZWZpbml0ZSBmaWxlIHNpZ25hdHVyZSBmb3IgQVVEIGZpbGVzLgorICogVGhlIGRlbXV4ZXIgdXNlcyBhIHByb2JhYmlsaXN0aWMgc3RyYXRlZ3kgZm9yIGNvbnRlbnQgZGV0ZWN0aW9uLiBUaGlzCisgKiBlbnRhaWxzIHBlcmZvcm1pbmcgc2FuaXR5IGNoZWNrcyBvbiBjZXJ0YWluIGhlYWRlciB2YWx1ZXMgaW4gb3JkZXIgdG8KKyAqIHF1YWxpZnkgYSBmaWxlLiBSZWZlciB0byB3c2F1ZF9wcm9iZSgpIGZvciB0aGUgcHJlY2lzZSBwYXJhbWV0ZXJzLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIEFVRF9IRUFERVJfU0laRSAxMgorI2RlZmluZSBBVURfQ0hVTktfUFJFQU1CTEVfU0laRSA4CisjZGVmaW5lIEFVRF9DSFVOS19TSUdOQVRVUkUgMHgwMDAwREVBRgorCitzdGF0aWMgaW50IHdzYXVkX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGludCBmaWVsZDsKKworICAgIC8qIFByb2JhYmlsaXN0aWMgY29udGVudCBkZXRlY3Rpb24gc3RyYXRlZ3k6IFRoZXJlIGlzIG5vIGZpbGUgc2lnbmF0dXJlCisgICAgICogc28gcGVyZm9ybSBzYW5pdHkgY2hlY2tzIG9uIHZhcmlvdXMgaGVhZGVyIHBhcmFtZXRlcnM6CisgICAgICogICA4MDAwIDw9IHNhbXBsZSByYXRlICgxNiBiaXRzKSA8PSA0ODAwMCAgPT0+IDQwMDAxIGFjY2VwdGFibGUgbnVtYmVycworICAgICAqICAgZmxhZ3MgPD0gMHgwMyAoMiBMU0JzIGFyZSB1c2VkKSAgICAgICAgID09PiA0IGFjY2VwdGFibGUgbnVtYmVycworICAgICAqICAgY29tcHJlc3Npb24gdHlwZSAoOCBiaXRzKSA9IDEgb3IgOTkgICAgID09PiAyIGFjY2VwdGFibGUgbnVtYmVycworICAgICAqICAgZmlyc3QgYXVkaW8gY2h1bmsgc2lnbmF0dXJlICgzMiBiaXRzKSAgID09PiAxIGFjY2VwdGFibGUgbnVtYmVyCisgICAgICogVGhlIG51bWJlciBzcGFjZSBjb250YWlucyAyXjY0IG51bWJlcnMuIFRoZXJlIGFyZSA0MDAwMSAqIDQgKiAyICogMSA9CisgICAgICogMzIwMDA4IGFjY2VwdGFibGUgbnVtYmVyIGNvbWJpbmF0aW9ucy4KKyAgICAgKi8KKworICAgIGlmIChwLT5idWZfc2l6ZSA8IEFVRF9IRUFERVJfU0laRSArIEFVRF9DSFVOS19QUkVBTUJMRV9TSVpFKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGNoZWNrIHNhbXBsZSByYXRlICovCisgICAgZmllbGQgPSBBVl9STDE2KCZwLT5idWZbMF0pOworICAgIGlmICgoZmllbGQgPCA4MDAwKSB8fCAoZmllbGQgPiA0ODAwMCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogZW5mb3JjZSB0aGUgcnVsZSB0aGF0IHRoZSB0b3AgNiBiaXRzIG9mIHRoaXMgZmxhZ3MgZmllbGQgYXJlIHJlc2VydmVkICgwKTsKKyAgICAgKiB0aGlzIG1pZ2h0IG5vdCBiZSB0cnVlLCBidXQgZW5mb3JjZSBpdCB1bnRpbCBkZWVtZWQgdW5uZWNlc3NhcnkgKi8KKyAgICBpZiAocC0+YnVmWzEwXSAmIDB4RkMpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHAtPmJ1ZlsxMV0gIT0gOTkgJiYgcC0+YnVmWzExXSAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHJlYWQgYWhlYWQgdG8gdGhlIGZpcnN0IGF1ZGlvIGNodW5rIGFuZCB2YWxpZGF0ZSB0aGUgZmlyc3QgaGVhZGVyIHNpZ25hdHVyZSAqLworICAgIGlmIChBVl9STDMyKCZwLT5idWZbMTZdKSAhPSBBVURfQ0hVTktfU0lHTkFUVVJFKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHJldHVybiAxLzIgY2VydGFpbnR5IHNpbmNlIHRoaXMgZmlsZSBjaGVjayBpcyBhIGxpdHRsZSBza2V0Y2h5ICovCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworfQorCitzdGF0aWMgaW50IHdzYXVkX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgdW5zaWduZWQgY2hhciBoZWFkZXJbQVVEX0hFQURFUl9TSVpFXTsKKyAgICBpbnQgc2FtcGxlX3JhdGUsIGNoYW5uZWxzLCBjb2RlYzsKKworICAgIGlmIChhdmlvX3JlYWQocGIsIGhlYWRlciwgQVVEX0hFQURFUl9TSVpFKSAhPSBBVURfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICBzYW1wbGVfcmF0ZSA9IEFWX1JMMTYoJmhlYWRlclswXSk7CisgICAgY2hhbm5lbHMgICAgPSAoaGVhZGVyWzEwXSAmIDB4MSkgKyAxOworICAgIGNvZGVjICAgICAgID0gaGVhZGVyWzExXTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIGF1ZGlvIGRlY29kZXIgc3RyZWFtICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzd2l0Y2ggKGNvZGVjKSB7CisgICAgY2FzZSAgMToKKyAgICAgICAgaWYgKGNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiU3RlcmVvIFdTLVNORDEiKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfV0VTVFdPT0RfU05EMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5OToKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XUzsKKyAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA0OworICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gY2hhbm5lbHMgKiBzYW1wbGVfcmF0ZSAqIDQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiVW5rbm93biBjb2RlYzogJWQiLCBjb2RlYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHNhbXBsZV9yYXRlKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBjaGFubmVsczsKKyAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gY2hhbm5lbHMgPT0gMSA/IEFWX0NIX0xBWU9VVF9NT05PIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhdWRfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVuc2lnbmVkIGNoYXIgcHJlYW1ibGVbQVVEX0NIVU5LX1BSRUFNQkxFX1NJWkVdOworICAgIHVuc2lnbmVkIGludCBjaHVua19zaXplOworICAgIGludCByZXQgPSAwOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBwcmVhbWJsZSwgQVVEX0NIVU5LX1BSRUFNQkxFX1NJWkUpICE9CisgICAgICAgIEFVRF9DSFVOS19QUkVBTUJMRV9TSVpFKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgLyogdmFsaWRhdGUgdGhlIGNodW5rICovCisgICAgaWYgKEFWX1JMMzIoJnByZWFtYmxlWzRdKSAhPSBBVURfQ0hVTktfU0lHTkFUVVJFKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGNodW5rX3NpemUgPSBBVl9STDE2KCZwcmVhbWJsZVswXSk7CisKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XRVNUV09PRF9TTkQxKSB7CisgICAgICAgIC8qIEZvciBXZXN0d29vZCBTTkQxIGF1ZGlvIHdlIG5lZWQgdG8gYWRkIHRoZSBvdXRwdXQgc2l6ZSBhbmQgaW5wdXQKKyAgICAgICAgICAgc2l6ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldCB0byBtYXRjaCB3aGF0IGlzIGluIFZRQS4KKyAgICAgICAgICAgU3BlY2lmaWNhbGx5LCB0aGlzIGlzIG5lZWRlZCB0byBzaWduYWwgd2hlbiBhIHBhY2tldCBzaG91bGQgYmUKKyAgICAgICAgICAgZGVjb2RpbmcgYXMgcmF3IDgtYml0IHBjbSBvciB2YXJpYWJsZS1zaXplIEFEUENNLiAqLworICAgICAgICBpbnQgb3V0X3NpemUgPSBBVl9STDE2KCZwcmVhbWJsZVsyXSk7CisgICAgICAgIGlmICgocmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIGNodW5rX3NpemUgKyA0KSkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IGF2aW9fcmVhZChwYiwgJnBrdC0+ZGF0YVs0XSwgY2h1bmtfc2l6ZSkpICE9IGNodW5rX3NpemUpCisgICAgICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1IoRUlPKTsKKyAgICAgICAgQVZfV0wxNigmcGt0LT5kYXRhWzBdLCBvdXRfc2l6ZSk7CisgICAgICAgIEFWX1dMMTYoJnBrdC0+ZGF0YVsyXSwgY2h1bmtfc2l6ZSk7CisKKyAgICAgICAgcGt0LT5kdXJhdGlvbiA9IG91dF9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgY2h1bmtfc2l6ZSk7CisgICAgICAgIGlmIChyZXQgIT0gY2h1bmtfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAgICAgLyogMiBzYW1wbGVzL2J5dGUsIDEgb3IgMiBzYW1wbGVzIHBlciBmcmFtZSBkZXBlbmRpbmcgb24gc3RlcmVvICovCisgICAgICAgIHBrdC0+ZHVyYXRpb24gPSAoY2h1bmtfc2l6ZSAqIDIpIC8gc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICB9CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisKKyAgICByZXR1cm4gcmV0OworfQorCitBVklucHV0Rm9ybWF0IGZmX3dzYXVkX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIndzYXVkIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2VzdHdvb2QgU3R1ZGlvcyBhdWRpbyIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHdzYXVkX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHdzYXVkX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHdzYXVkX3JlYWRfcGFja2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC93ZXN0d29vZF92cWEuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93ZXN0d29vZF92cWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODI3ZmNkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3dlc3R3b29kX3ZxYS5jCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogV2VzdHdvb2QgU3R1ZGlvcyBWUUEgRm9ybWF0IERlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogV2VzdHdvb2QgU3R1ZGlvcyBWUUEgZmlsZSBkZW11eGVyCisgKiBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQorICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIFdlc3R3b29kIGZpbGUgZm9ybWF0cywgdmlzaXQ6CisgKiAgIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzLworICogICBodHRwOi8vd3d3Lmdlb2NpdGllcy5jb20vU2lsaWNvblZhbGxleS84NjgyL2F1ZDMudHh0CisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgRk9STV9UQUcgTUtCRVRBRygnRicsICdPJywgJ1InLCAnTScpCisjZGVmaW5lIFdWUUFfVEFHIE1LQkVUQUcoJ1cnLCAnVicsICdRJywgJ0EnKQorI2RlZmluZSBWUUhEX1RBRyBNS0JFVEFHKCdWJywgJ1EnLCAnSCcsICdEJykKKyNkZWZpbmUgRklORl9UQUcgTUtCRVRBRygnRicsICdJJywgJ04nLCAnRicpCisjZGVmaW5lIFNORDBfVEFHIE1LQkVUQUcoJ1MnLCAnTicsICdEJywgJzAnKQorI2RlZmluZSBTTkQxX1RBRyBNS0JFVEFHKCdTJywgJ04nLCAnRCcsICcxJykKKyNkZWZpbmUgU05EMl9UQUcgTUtCRVRBRygnUycsICdOJywgJ0QnLCAnMicpCisjZGVmaW5lIFZRRlJfVEFHIE1LQkVUQUcoJ1YnLCAnUScsICdGJywgJ1InKQorCisvKiBkb24ndCBrbm93IHdoYXQgdGhlc2UgdGFncyBhcmUgZm9yLCBidXQgYWNrbm93bGVkZ2UgdGhlaXIgZXhpc3RlbmNlICovCisjZGVmaW5lIENJTkZfVEFHIE1LQkVUQUcoJ0MnLCAnSScsICdOJywgJ0YnKQorI2RlZmluZSBDSU5IX1RBRyBNS0JFVEFHKCdDJywgJ0knLCAnTicsICdIJykKKyNkZWZpbmUgQ0lORF9UQUcgTUtCRVRBRygnQycsICdJJywgJ04nLCAnRCcpCisjZGVmaW5lIFBJTkZfVEFHIE1LQkVUQUcoJ1AnLCAnSScsICdOJywgJ0YnKQorI2RlZmluZSBQSU5IX1RBRyBNS0JFVEFHKCdQJywgJ0knLCAnTicsICdIJykKKyNkZWZpbmUgUElORF9UQUcgTUtCRVRBRygnUCcsICdJJywgJ04nLCAnRCcpCisjZGVmaW5lIENNRFNfVEFHIE1LQkVUQUcoJ0MnLCAnTScsICdEJywgJ1MnKQorCisjZGVmaW5lIFZRQV9IRUFERVJfU0laRSAweDJBCisjZGVmaW5lIFZRQV9QUkVBTUJMRV9TSVpFIDgKKwordHlwZWRlZiBzdHJ1Y3QgV3NWcWFEZW11eENvbnRleHQgeworICAgIGludCB2ZXJzaW9uOworICAgIGludCBicHM7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICBpbnQgYXVkaW9fc3RyZWFtX2luZGV4OworICAgIGludCB2aWRlb19zdHJlYW1faW5kZXg7Cit9IFdzVnFhRGVtdXhDb250ZXh0OworCitzdGF0aWMgaW50IHdzdnFhX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIC8qIG5lZWQgMTIgYnl0ZXMgdG8gcXVhbGlmeSAqLworICAgIGlmIChwLT5idWZfc2l6ZSA8IDEyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGNoZWNrIGZvciB0aGUgVlFBIHNpZ25hdHVyZXMgKi8KKyAgICBpZiAoKEFWX1JCMzIoJnAtPmJ1ZlswXSkgIT0gRk9STV9UQUcpIHx8CisgICAgICAgIChBVl9SQjMyKCZwLT5idWZbOF0pICE9IFdWUUFfVEFHKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBpbnQgd3N2cWFfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFdzVnFhRGVtdXhDb250ZXh0ICp3c3ZxYSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgdWludDhfdCAqaGVhZGVyOworICAgIHVpbnQ4X3Qgc2NyYXRjaFtWUUFfUFJFQU1CTEVfU0laRV07CisgICAgdWludDMyX3QgY2h1bmtfdGFnOworICAgIHVpbnQzMl90IGNodW5rX3NpemU7CisgICAgaW50IGZwczsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIHZpZGVvIGRlY29kZXIgc3RyZWFtICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOworICAgIHdzdnFhLT52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9XU19WUUE7CisgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisKKyAgICAvKiBza2lwIHRvIHRoZSBzdGFydCBvZiB0aGUgVlFBIGhlYWRlciAqLworICAgIGF2aW9fc2VlayhwYiwgMjAsIFNFRUtfU0VUKTsKKworICAgIC8qIHRoZSBWUUEgaGVhZGVyIG5lZWRzIHRvIGdvIHRvIHRoZSBkZWNvZGVyICovCisgICAgaWYgKGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgVlFBX0hFQURFUl9TSVpFKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaGVhZGVyID0gKHVpbnQ4X3QgKilzdC0+Y29kZWMtPmV4dHJhZGF0YTsKKyAgICBzdC0+Y29kZWMtPndpZHRoID0gQVZfUkwxNigmaGVhZGVyWzZdKTsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IEFWX1JMMTYoJmhlYWRlcls4XSk7CisgICAgZnBzID0gaGVhZGVyWzEyXTsKKyAgICBzdC0+bmJfZnJhbWVzID0KKyAgICBzdC0+ZHVyYXRpb24gID0gQVZfUkwxNigmaGVhZGVyWzRdKTsKKyAgICBpZiAoZnBzIDwgMSB8fCBmcHMgPiAzMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBmcHM6ICVkXG4iLCBmcHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGZwcyk7CisKKyAgICB3c3ZxYS0+dmVyc2lvbiAgICAgID0gQVZfUkwxNigmaGVhZGVyWyAwXSk7CisgICAgd3N2cWEtPnNhbXBsZV9yYXRlICA9IEFWX1JMMTYoJmhlYWRlclsyNF0pOworICAgIHdzdnFhLT5jaGFubmVscyAgICAgPSBoZWFkZXJbMjZdOworICAgIHdzdnFhLT5icHMgICAgICAgICAgPSBoZWFkZXJbMjddOworICAgIHdzdnFhLT5hdWRpb19zdHJlYW1faW5kZXggPSAtMTsKKworICAgIHMtPmN0eF9mbGFncyB8PSBBVkZNVENUWF9OT0hFQURFUjsKKworICAgIC8qIHRoZXJlIGFyZSAwIG9yIG1vcmUgY2h1bmtzIGJlZm9yZSB0aGUgRklORiBjaHVuazsgaXRlcmF0ZSB1bnRpbAorICAgICAqIEZJTkYgaGFzIGJlZW4gc2tpcHBlZCBhbmQgdGhlIGZpbGUgd2lsbCBiZSByZWFkeSB0byBiZSBkZW11eGVkICovCisgICAgZG8geworICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBzY3JhdGNoLCBWUUFfUFJFQU1CTEVfU0laRSkgIT0gVlFBX1BSRUFNQkxFX1NJWkUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICBjaHVua190YWcgPSBBVl9SQjMyKCZzY3JhdGNoWzBdKTsKKyAgICAgICAgY2h1bmtfc2l6ZSA9IEFWX1JCMzIoJnNjcmF0Y2hbNF0pOworCisgICAgICAgIC8qIGNhdGNoIGFueSB1bmtub3duIGhlYWRlciB0YWdzLCBmb3IgY3VyaW91c2l0eSAqLworICAgICAgICBzd2l0Y2ggKGNodW5rX3RhZykgeworICAgICAgICBjYXNlIENJTkZfVEFHOgorICAgICAgICBjYXNlIENJTkhfVEFHOgorICAgICAgICBjYXNlIENJTkRfVEFHOgorICAgICAgICBjYXNlIFBJTkZfVEFHOgorICAgICAgICBjYXNlIFBJTkhfVEFHOgorICAgICAgICBjYXNlIFBJTkRfVEFHOgorICAgICAgICBjYXNlIEZJTkZfVEFHOgorICAgICAgICBjYXNlIENNRFNfVEFHOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyAocywgQVZfTE9HX0VSUk9SLCAiIG5vdGU6IHVua25vd24gY2h1bmsgc2VlbiAoJWMlYyVjJWMpXG4iLAorICAgICAgICAgICAgICAgIHNjcmF0Y2hbMF0sIHNjcmF0Y2hbMV0sCisgICAgICAgICAgICAgICAgc2NyYXRjaFsyXSwgc2NyYXRjaFszXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGF2aW9fc2tpcChwYiwgY2h1bmtfc2l6ZSk7CisgICAgfSB3aGlsZSAoY2h1bmtfdGFnICE9IEZJTkZfVEFHKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdzdnFhX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBXc1ZxYURlbXV4Q29udGV4dCAqd3N2cWEgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHJldCA9IC0xOworICAgIHVpbnQ4X3QgcHJlYW1ibGVbVlFBX1BSRUFNQkxFX1NJWkVdOworICAgIHVpbnQzMl90IGNodW5rX3R5cGU7CisgICAgdWludDMyX3QgY2h1bmtfc2l6ZTsKKyAgICBpbnQgc2tpcF9ieXRlOworCisgICAgd2hpbGUgKGF2aW9fcmVhZChwYiwgcHJlYW1ibGUsIFZRQV9QUkVBTUJMRV9TSVpFKSA9PSBWUUFfUFJFQU1CTEVfU0laRSkgeworICAgICAgICBjaHVua190eXBlID0gQVZfUkIzMigmcHJlYW1ibGVbMF0pOworICAgICAgICBjaHVua19zaXplID0gQVZfUkIzMigmcHJlYW1ibGVbNF0pOworCisgICAgICAgIHNraXBfYnl0ZSA9IGNodW5rX3NpemUgJiAweDAxOworCisgICAgICAgIGlmICgoY2h1bmtfdHlwZSA9PSBTTkQwX1RBRykgfHwgKGNodW5rX3R5cGUgPT0gU05EMV9UQUcpIHx8CisgICAgICAgICAgICAoY2h1bmtfdHlwZSA9PSBTTkQyX1RBRykgfHwgKGNodW5rX3R5cGUgPT0gVlFGUl9UQUcpKSB7CisKKyAgICAgICAgICAgIHJldD0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBjaHVua19zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQ8MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgICAgICAgICBzd2l0Y2ggKGNodW5rX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgU05EMF9UQUc6CisgICAgICAgICAgICBjYXNlIFNORDFfVEFHOgorICAgICAgICAgICAgY2FzZSBTTkQyX1RBRzoKKyAgICAgICAgICAgICAgICBpZiAod3N2cWEtPmF1ZGlvX3N0cmVhbV9pbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgICAgICAgICB3c3ZxYS0+YXVkaW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgICAgICAgICAgICAgICAgICBpZiAoIXdzdnFhLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdzdnFhLT5zYW1wbGVfcmF0ZSA9IDIyMDUwOworICAgICAgICAgICAgICAgICAgICBpZiAoIXdzdnFhLT5jaGFubmVscykKKyAgICAgICAgICAgICAgICAgICAgICAgIHdzdnFhLT5jaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICghd3N2cWEtPmJwcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHdzdnFhLT5icHMgPSA4OworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gd3N2cWEtPnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IHdzdnFhLT5icHM7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSB3c3ZxYS0+Y2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKworICAgICAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaHVua190eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU05EMF9UQUc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3N2cWEtPmJwcyA9PSAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTTkQxX1RBRzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9XRVNUV09PRF9TTkQxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU05EMl9UQUc6CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dTOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTDE2KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCB3c3ZxYS0+dmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gd3N2cWEtPmF1ZGlvX3N0cmVhbV9pbmRleDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNodW5rX3R5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNORDFfVEFHOgorICAgICAgICAgICAgICAgICAgICAvKiB1bnBhY2tlZCBzaXplIGlzIHN0b3JlZCBpbiBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYocGt0LT5kYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IEFWX1JMMTYocGt0LT5kYXRhKSAvIHdzdnFhLT5jaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTTkQyX1RBRzoKKyAgICAgICAgICAgICAgICAgICAgLyogMiBzYW1wbGVzL2J5dGUsIDEgb3IgMiBzYW1wbGVzIHBlciBmcmFtZSBkZXBlbmRpbmcgb24gc3RlcmVvICovCisgICAgICAgICAgICAgICAgICAgIHBrdC0+ZHVyYXRpb24gPSAoY2h1bmtfc2l6ZSAqIDIpIC8gd3N2cWEtPmNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZRRlJfVEFHOgorICAgICAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gd3N2cWEtPnZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICAgICAgICAgICAgICBwa3QtPmR1cmF0aW9uID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3RheSBvbiAxNi1iaXQgYWxpZ25tZW50ICovCisgICAgICAgICAgICBpZiAoc2tpcF9ieXRlKQorICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMSk7CisKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2goY2h1bmtfdHlwZSl7CisgICAgICAgICAgICBjYXNlIENNRFNfVEFHOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJTa2lwcGluZyB1bmtub3duIGNodW5rIDB4JTA4WFxuIiwgY2h1bmtfdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIGNodW5rX3NpemUgKyBza2lwX2J5dGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl93c3ZxYV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ3c3ZxYSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldlc3R3b29kIFN0dWRpb3MgVlFBIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFdzVnFhRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB3c3ZxYV9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSB3c3ZxYV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSB3c3ZxYV9yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvd3R2LmggYi9mZm1wZWcvbGliYXZmb3JtYXQvd3R2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2YWQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93dHYuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogV2luZG93cyBUZWxldmlzaW9uIChXVFYpCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9XVFZfSAorI2RlZmluZSBBVkZPUk1BVF9XVFZfSAorCisjaW5jbHVkZSAicmlmZi5oIgorI2luY2x1ZGUgImFzZi5oIgorCisjZGVmaW5lIFdUVl9TRUNUT1JfQklUUyAgICAxMgorI2RlZmluZSBXVFZfU0VDVE9SX1NJWkUgICAgKDEgPDwgV1RWX1NFQ1RPUl9CSVRTKQorI2RlZmluZSBXVFZfQklHU0VDVE9SX0JJVFMgMTgKKyNkZWZpbmUgV1RWX1BBRDgoeCkgKCgoeCkgKyA3KSAmIH43KQorCitleHRlcm4gY29uc3QgdWludDhfdCBmZl90aW1lbGluZV9sZTE2WzE2XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3RpbWVsaW5lX3RhYmxlXzBfZW50cmllc19FdmVudHNfbGUxNls2Ml07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl90YWJsZV8wX2VudHJpZXNfbGVnYWN5X2F0dHJpYl9sZTE2WzU4XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3RhYmxlXzBfZW50cmllc190aW1lX2xlMTZbNDBdOworCitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfZGlyX2VudHJ5X2d1aWQ7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfd3R2X2d1aWQ7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfdGltZXN0YW1wX2d1aWQ7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfZGF0YV9ndWlkOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX1NCRTJfU1RSRUFNX0RFU0NfRVZFTlQ7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfc3RyZWFtMV9ndWlkOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX3N5bmNfZ3VpZDsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9pbmRleF9ndWlkOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX21lZGlhdHlwZV9hdWRpbzsKK2V4dGVybiBjb25zdCBmZl9hc2ZfZ3VpZCBmZl9tZWRpYXR5cGVfdmlkZW87CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfZm9ybWF0X25vbmU7CitleHRlcm4gY29uc3QgQVZDb2RlY0d1aWQgZmZfdmlkZW9fZ3VpZHNbXTsKKworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX0RTQVRUUklCX1RSQU5TUE9SVF9QUk9QRVJUSUVTOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX21ldGFkYXRhX2d1aWQ7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfc3RyZWFtMl9ndWlkOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX21lZGlhc3VidHlwZV9jcGZpbHRlcnNfcHJvY2Vzc2VkOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2Zvcm1hdF9jcGZpbHRlcnNfcHJvY2Vzc2VkOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2Zvcm1hdF93YXZlZm9ybWF0ZXg7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfZm9ybWF0X21wZWcyX3ZpZGVvOworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2Zvcm1hdF92aWRlb2luZm8yOworCisjZW5kaWYgLyogQVZGT1JNQVRfV1RWX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC93dHZfY29tbW9uLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvd3R2X2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDM0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvd3R2X2NvbW1vbi5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBXaW5kb3dzIFRlbGV2aXNpb24gKFdUVikKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAid3R2LmgiCisKKy8qIFdUViBHVUlEcyovCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9kaXJfZW50cnlfZ3VpZCA9CisgICAgezB4OTIsMHhCNywweDc0LDB4OTEsMHg1OSwweDcwLDB4NzAsMHg0NCwweDg4LDB4REYsMHgwNiwweDNCLDB4ODIsMHhDQywweDIxLDB4M0R9OworY29uc3QgZmZfYXNmX2d1aWQgZmZfd3R2X2d1aWQgPQorICAgIHsweEI3LDB4RDgsMHgwMCwweDIwLDB4MzcsMHg0OSwweERBLDB4MTEsMHhBNiwweDRFLDB4MDAsMHgwNywweEU5LDB4NUUsMHhBRCwweDhEfTsKK2NvbnN0IGZmX2FzZl9ndWlkIGZmX3RpbWVzdGFtcF9ndWlkID0KKyAgICB7MHg1QiwweDA1LDB4RTYsMHgxQiwweDk3LDB4QTksMHg0OSwweDQzLDB4ODgsMHgxNywweDFBLDB4NjUsMHg1QSwweDI5LDB4OEEsMHg5N307Citjb25zdCBmZl9hc2ZfZ3VpZCBmZl9kYXRhX2d1aWQgPQorICAgIHsweDk1LDB4QzMsMHhEMiwweEMyLDB4N0UsMHg5QSwweERBLDB4MTEsMHg4QiwweEY3LDB4MDAsMHgwNywweEU5LDB4NUUsMHhBRCwweDhEfTsKK2NvbnN0IGZmX2FzZl9ndWlkIGZmX1NCRTJfU1RSRUFNX0RFU0NfRVZFTlQgPQorICAgIHsweEVELDB4QTQsMHgxMywweDIzLDB4MkQsMHhCRiwweDRGLDB4NDUsMHhBRCwweDhBLDB4RDksMHg1QiwweEE3LDB4RjksMHgxRiwweEVFfTsKK2NvbnN0IGZmX2FzZl9ndWlkIGZmX3N0cmVhbTFfZ3VpZCA9CisgICAgezB4QTEsMHhDMywweEQyLDB4QzIsMHg3RSwweDlBLDB4REEsMHgxMSwweDhCLDB4RjcsMHgwMCwweDA3LDB4RTksMHg1RSwweEFELDB4OER9OworY29uc3QgZmZfYXNmX2d1aWQgZmZfc3luY19ndWlkID0KKyAgICB7MHg5NywweEMzLDB4RDIsMHhDMiwweDdFLDB4OUEsMHhEQSwweDExLDB4OEIsMHhGNywweDAwLDB4MDcsMHhFOSwweDVFLDB4QUQsMHg4RH07Citjb25zdCBmZl9hc2ZfZ3VpZCBmZl9pbmRleF9ndWlkID0KKyAgICB7MHg5NiwweEMzLDB4RDIsMHhDMiwweDdFLDB4OUEsMHhEQSwweDExLDB4OEIsMHhGNywweDAwLDB4MDcsMHhFOSwweDVFLDB4QUQsMHg4RH07Citjb25zdCBmZl9hc2ZfZ3VpZCBmZl9tZWRpYXR5cGVfYXVkaW8gPQorICAgIHsnYScsJ3UnLCdkJywncycsRkZfTUVESUFTVUJUWVBFX0JBU0VfR1VJRH07Citjb25zdCBmZl9hc2ZfZ3VpZCBmZl9tZWRpYXR5cGVfdmlkZW8gPQorICAgIHsndicsJ2knLCdkJywncycsRkZfTUVESUFTVUJUWVBFX0JBU0VfR1VJRH07Citjb25zdCBmZl9hc2ZfZ3VpZCBmZl9mb3JtYXRfbm9uZSA9CisgICAgezB4RDYsMHgxNywweDY0LDB4MEYsMHgxOCwweEMzLDB4RDAsMHgxMSwweEE0LDB4M0YsMHgwMCwweEEwLDB4QzksMHgyMiwweDMxLDB4OTZ9OworCisvKiBkZWNsYXJlIHV0ZjE2bGUgc3RyaW5ncyAqLworI2RlZmluZSBfICwgMCwKK2NvbnN0IHVpbnQ4X3QgZmZfdGltZWxpbmVfbGUxNltdID0KKyAgICB7J3QnXydpJ18nbSdfJ2UnXydsJ18naSdfJ24nXydlJywgMH07Citjb25zdCB1aW50OF90IGZmX3RpbWVsaW5lX3RhYmxlXzBfZW50cmllc19FdmVudHNfbGUxNltdID0KKyAgICB7J3QnXydpJ18nbSdfJ2UnXydsJ18naSdfJ24nXydlJ18nLidfJ3QnXydhJ18nYidfJ2wnXydlJ18nLidfJzAnXycuJ18nZSdfJ24nXyd0J18ncidfJ2knXydlJ18ncydfJy4nXydFJ18ndidfJ2UnXyduJ18ndCdfJ3MnLCAwfTsKK2NvbnN0IHVpbnQ4X3QgZmZfdGFibGVfMF9lbnRyaWVzX2xlZ2FjeV9hdHRyaWJfbGUxNltdID0KKyAgICB7J3QnXydhJ18nYidfJ2wnXydlJ18nLidfJzAnXycuJ18nZSdfJ24nXyd0J18ncidfJ2knXydlJ18ncydfJy4nXydsJ18nZSdfJ2cnXydhJ18nYydfJ3knXydfJ18nYSdfJ3QnXyd0J18ncidfJ2knXydiJywgMH07Citjb25zdCB1aW50OF90IGZmX3RhYmxlXzBfZW50cmllc190aW1lX2xlMTZbXSA9CisgICAgeyd0J18nYSdfJ2InXydsJ18nZSdfJy4nXycwJ18nLidfJ2UnXyduJ18ndCdfJ3InXydpJ18nZSdfJ3MnXycuJ18ndCdfJ2knXydtJ18nZScsIDB9OworI3VuZGVmIF8KKworY29uc3QgZmZfYXNmX2d1aWQgZmZfRFNBVFRSSUJfVFJBTlNQT1JUX1BST1BFUlRJRVMgPQorICAgIHsweDEyLDB4RjYsMHgyMiwweEI2LDB4QUQsMHg0NywweDcxLDB4NDYsMHhBRCwweDZDLDB4MDUsMHhBOSwweDhFLDB4NjUsMHhERSwweDNBfTsKK2NvbnN0IGZmX2FzZl9ndWlkIGZmX21ldGFkYXRhX2d1aWQgPQorICAgIHsweDVBLDB4RkUsMHhENywweDZELDB4QzgsMHgxRCwweDhGLDB4NEEsMHg5OSwweDIyLDB4RkEsMHhCMSwweDFDLDB4MzgsMHgxNCwweDUzfTsKK2NvbnN0IGZmX2FzZl9ndWlkIGZmX3N0cmVhbTJfZ3VpZCA9CisgICAgezB4QTIsMHhDMywweEQyLDB4QzIsMHg3RSwweDlBLDB4REEsMHgxMSwweDhCLDB4RjcsMHgwMCwweDA3LDB4RTksMHg1RSwweEFELDB4OER9OworCisvKiBNZWRpYSBzdWJ0eXBlcyAqLworY29uc3QgZmZfYXNmX2d1aWQgZmZfbWVkaWFzdWJ0eXBlX2NwZmlsdGVyc19wcm9jZXNzZWQgPQorICAgIHsweDI4LDB4QkQsMHhBRCwweDQ2LDB4RDAsMHg2RiwweDk2LDB4NDcsMHg5MywweEIyLDB4MTUsMHg1QywweDUxLDB4REMsMHgwNCwweDhEfTsKKworLyogRm9ybWF0cyAqLworY29uc3QgZmZfYXNmX2d1aWQgZmZfZm9ybWF0X2NwZmlsdGVyc19wcm9jZXNzZWQgPQorICAgIHsweDZGLDB4QjMsMHgzOSwweDY3LDB4NUYsMHgxRCwweEMyLDB4NEEsMHg4MSwweDkyLDB4MjgsMHhCQiwweDBFLDB4NzMsMHhEMSwweDZBfTsKK2NvbnN0IGZmX2FzZl9ndWlkIGZmX2Zvcm1hdF93YXZlZm9ybWF0ZXggPQorICAgIHsweDgxLDB4OUYsMHg1OCwweDA1LDB4NTYsMHhDMywweENFLDB4MTEsMHhCRiwweDAxLDB4MDAsMHhBQSwweDAwLDB4NTUsMHg1OSwweDVBfTsKK2NvbnN0IGZmX2FzZl9ndWlkIGZmX2Zvcm1hdF9tcGVnMl92aWRlbyA9CisgICAgezB4RTMsMHg4MCwweDZELDB4RTAsMHg0NiwweERCLDB4Q0YsMHgxMSwweEI0LDB4RDEsMHgwMCwweDgwLDB4NUYsMHg2QywweEJCLDB4RUF9OworY29uc3QgZmZfYXNmX2d1aWQgZmZfZm9ybWF0X3ZpZGVvaW5mbzIgPQorICAgIHsweEEwLDB4NzYsMHgyQSwweEY3LDB4MEEsMHhFQiwweEQwLDB4MTEsMHhBQywweEU0LDB4MDAsMHgwMCwweEMwLDB4Q0MsMHgxNiwweEJBfTsKKworY29uc3QgQVZDb2RlY0d1aWQgZmZfdmlkZW9fZ3VpZHNbXSA9IHsKKyAgICB7QVZfQ09ERUNfSURfTVBFRzJWSURFTywgezB4MjYsMHg4MCwweDZELDB4RTAsMHg0NiwweERCLDB4Q0YsMHgxMSwweEI0LDB4RDEsMHgwMCwweDgwLDB4NUYsMHg2QywweEJCLDB4RUF9fSwKKyAgICB7QVZfQ09ERUNfSURfTk9ORX0KK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvd3R2ZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQvd3R2ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwOTk2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93dHZkZWMuYwpAQCAtMCwwICsxLDExMzIgQEAKKy8qCisgKiBXaW5kb3dzIFRlbGV2aXNpb24gKFdUVikgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgUGV0ZXIgUm9zcyA8cHJvc3NAeHZpZC5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFdpbmRvd3MgVGVsZXZpc2lvbiAoV1RWKSBkZW11eGVyCisgKiBAYXV0aG9yIFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lX2ludGVybmFsLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInd0di5oIgorI2luY2x1ZGUgIm1wZWd0cy5oIgorCisvKiBNYWNyb3MgZm9yIGZvcm1hdGluZyBHVUlEcyAqLworI2RlZmluZSBQUklfUFJFVFRZX0dVSUQgXAorICAgICIlMDgiUFJJeDMyIi0lMDQiUFJJeDE2Ii0lMDQiUFJJeDE2Ii0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIKKyNkZWZpbmUgQVJHX1BSRVRUWV9HVUlEKGcpIFwKKyAgICBBVl9STDMyKGcpLEFWX1JMMTYoZys0KSxBVl9STDE2KGcrNiksZ1s4XSxnWzldLGdbMTBdLGdbMTFdLGdbMTJdLGdbMTNdLGdbMTRdLGdbMTVdCisjZGVmaW5lIExFTl9QUkVUVFlfR1VJRCAzNAorCisvKgorICoKKyAqIEZpbGUgc3lzdGVtIHJvdXRpbmVzCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVklPQ29udGV4dCAqcGJfZmlsZXN5c3RlbTsgIC8qKjwgZmlsZSBzeXN0ZW0gKEFWRm9ybWF0Q29udGV4dC0+cGIpICovCisKKyAgICBpbnQgc2VjdG9yX2JpdHM7ICAgICAvKio8IHNlY3RvciBzaGlmdCBiaXRzOyB1c2VkIHRvIGNvbnZlcnQgc2VjdG9yIG51bWJlciBpbnRvIHBiX2ZpbGVzeXN0ZW0gb2Zmc2V0ICovCisgICAgdWludDMyX3QgKnNlY3RvcnM7ICAgLyoqPCBmaWxlIGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICBpbnQgbmJfc2VjdG9yczsgICAgICAvKio8IG51bWJlciBvZiBzZWN0b3JzICovCisKKyAgICBpbnQgZXJyb3I7CisgICAgaW50NjRfdCBwb3NpdGlvbjsKKyAgICBpbnQ2NF90IGxlbmd0aDsKK30gV3R2RmlsZTsKKworc3RhdGljIGludDY0X3Qgc2Vla19ieV9zZWN0b3IoQVZJT0NvbnRleHQgKnBiLCBpbnQ2NF90IHNlY3RvciwgaW50NjRfdCBvZmZzZXQpCit7CisgICAgcmV0dXJuIGF2aW9fc2VlayhwYiwgKHNlY3RvciA8PCBXVFZfU0VDVE9SX0JJVFMpICsgb2Zmc2V0LCBTRUVLX1NFVCk7Cit9CisKKy8qKgorICogQHJldHVybiBieXRlcyByZWFkLCAwIG9uIGVuZCBvZiBmaWxlLCBvciA8MCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHd0dmZpbGVfcmVhZF9wYWNrZXQodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBXdHZGaWxlICp3ZiA9IG9wYXF1ZTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSB3Zi0+cGJfZmlsZXN5c3RlbTsKKyAgICBpbnQgbnJlYWQgPSAwOworCisgICAgaWYgKHdmLT5lcnJvciB8fCBwYi0+ZXJyb3IpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAod2YtPnBvc2l0aW9uID49IHdmLT5sZW5ndGggfHwgYXZpb19mZW9mKHBiKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBidWZfc2l6ZSA9IEZGTUlOKGJ1Zl9zaXplLCB3Zi0+bGVuZ3RoIC0gd2YtPnBvc2l0aW9uKTsKKyAgICB3aGlsZShucmVhZCA8IGJ1Zl9zaXplKSB7CisgICAgICAgIGludCBuOworICAgICAgICBpbnQgcmVtYWluaW5nX2luX3NlY3RvciA9ICgxIDw8IHdmLT5zZWN0b3JfYml0cykgLSAod2YtPnBvc2l0aW9uICYgKCgxIDw8IHdmLT5zZWN0b3JfYml0cykgLSAxKSk7CisgICAgICAgIGludCByZWFkX3JlcXVlc3QgICAgICAgID0gRkZNSU4oYnVmX3NpemUgLSBucmVhZCwgcmVtYWluaW5nX2luX3NlY3Rvcik7CisKKyAgICAgICAgbiA9IGF2aW9fcmVhZChwYiwgYnVmLCByZWFkX3JlcXVlc3QpOworICAgICAgICBpZiAobiA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG5yZWFkICs9IG47CisgICAgICAgIGJ1ZiArPSBuOworICAgICAgICB3Zi0+cG9zaXRpb24gKz0gbjsKKyAgICAgICAgaWYgKG4gPT0gcmVtYWluaW5nX2luX3NlY3RvcikgeworICAgICAgICAgICAgaW50IGkgPSB3Zi0+cG9zaXRpb24gPj4gd2YtPnNlY3Rvcl9iaXRzOworICAgICAgICAgICAgaWYgKGkgPj0gd2YtPm5iX3NlY3RvcnMgfHwKKyAgICAgICAgICAgICAgICAod2YtPnNlY3RvcnNbaV0gIT0gd2YtPnNlY3RvcnNbaSAtIDFdICsgKDEgPDwgKHdmLT5zZWN0b3JfYml0cyAtIFdUVl9TRUNUT1JfQklUUykpICYmCisgICAgICAgICAgICAgICAgc2Vla19ieV9zZWN0b3IocGIsIHdmLT5zZWN0b3JzW2ldLCAwKSA8IDApKSB7CisgICAgICAgICAgICAgICAgd2YtPmVycm9yID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnJlYWQ7Cit9CisKKy8qKgorICogQHJldHVybiBwb3NpdGlvbiAob3IgZmlsZSBsZW5ndGgpCisgKi8KK3N0YXRpYyBpbnQ2NF90IHd0dmZpbGVfc2Vlayh2b2lkICpvcGFxdWUsIGludDY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworICAgIFd0dkZpbGUgKndmID0gb3BhcXVlOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHdmLT5wYl9maWxlc3lzdGVtOworCisgICAgaWYgKHdoZW5jZSA9PSBBVlNFRUtfU0laRSkKKyAgICAgICAgcmV0dXJuIHdmLT5sZW5ndGg7CisgICAgZWxzZSBpZiAod2hlbmNlID09IFNFRUtfQ1VSKQorICAgICAgICBvZmZzZXQgPSB3Zi0+cG9zaXRpb24gKyBvZmZzZXQ7CisgICAgZWxzZSBpZiAod2hlbmNlID09IFNFRUtfRU5EKQorICAgICAgICBvZmZzZXQgPSB3Zi0+bGVuZ3RoOworCisgICAgd2YtPmVycm9yID0gb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gd2YtPmxlbmd0aCB8fAorICAgICAgICAgICAgICAgIHNlZWtfYnlfc2VjdG9yKHBiLCB3Zi0+c2VjdG9yc1tvZmZzZXQgPj4gd2YtPnNlY3Rvcl9iaXRzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgJiAoKDEgPDwgd2YtPnNlY3Rvcl9iaXRzKSAtIDEpKSA8IDA7CisgICAgd2YtPnBvc2l0aW9uID0gb2Zmc2V0OworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKgorICogcmVhZCBub24temVybyBpbnRlZ2VycyAobGUzMikgZnJvbSBpbnB1dCBzdHJlYW0KKyAqIEBwYXJhbSBwYgorICogQHBhcmFtW291dF0gZGF0YSBkZXN0aW5hdGlvbgorICogQHBhcmFtICAgICBjb3VudCBtYXhpbXVtIG51bWJlciBvZiBpbnRlZ2VycyB0byByZWFkCisgKiBAcmV0dXJuICAgIHRvdGFsIG51bWJlciBvZiBpbnRlZ2VycyByZWFkCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9pbnRzKEFWSU9Db250ZXh0ICpwYiwgdWludDMyX3QgKmRhdGEsIGludCBjb3VudCkKK3sKKyAgICBpbnQgaSwgdG90YWwgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGlmICgoZGF0YVt0b3RhbF0gPSBhdmlvX3JsMzIocGIpKSkKKyAgICAgICAgICAgdG90YWwrKzsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCisvKioKKyAqIE9wZW4gZmlsZQorICogQHBhcmFtIGZpcnN0X3NlY3RvciAgRmlyc3Qgc2VjdG9yCisgKiBAcGFyYW0gbGVuZ3RoICAgICAgICBMZW5ndGggb2YgZmlsZSAoYnl0ZXMpCisgKiBAcGFyYW0gZGVwdGggICAgICAgICBGaWxlIGFsbG9jYXRpb24gdGFibGUgZGVwdGgKKyAqIEByZXR1cm4gTlVMTCBvbiBlcnJvcgorICovCitzdGF0aWMgQVZJT0NvbnRleHQgKiB3dHZmaWxlX29wZW5fc2VjdG9yKGludCBmaXJzdF9zZWN0b3IsIHVpbnQ2NF90IGxlbmd0aCwgaW50IGRlcHRoLCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiOworICAgIFd0dkZpbGUgKndmOworICAgIHVpbnQ4X3QgKmJ1ZmZlcjsKKyAgICBpbnQ2NF90IHNpemU7CisKKyAgICBpZiAoc2Vla19ieV9zZWN0b3Iocy0+cGIsIGZpcnN0X3NlY3RvciwgMCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHdmID0gYXZfbWFsbG9jeihzaXplb2YoV3R2RmlsZSkpOworICAgIGlmICghd2YpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgd2YtPnNlY3RvcnMgPSBhdl9tYWxsb2Moc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGlmICghd2YtPnNlY3RvcnMpIHsKKyAgICAgICAgICAgIGF2X2ZyZWUod2YpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgd2YtPnNlY3RvcnNbMF0gID0gZmlyc3Rfc2VjdG9yOworICAgICAgICB3Zi0+bmJfc2VjdG9ycyAgPSAxOworICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMSkgeworICAgICAgICB3Zi0+c2VjdG9ycyA9IGF2X21hbGxvYyhXVFZfU0VDVE9SX1NJWkUpOworICAgICAgICBpZiAoIXdmLT5zZWN0b3JzKSB7CisgICAgICAgICAgICBhdl9mcmVlKHdmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHdmLT5uYl9zZWN0b3JzICA9IHJlYWRfaW50cyhzLT5wYiwgd2YtPnNlY3RvcnMsIFdUVl9TRUNUT1JfU0laRSAvIDQpOworICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMikgeworICAgICAgICB1aW50MzJfdCBzZWN0b3JzMVtXVFZfU0VDVE9SX1NJWkUgLyA0XTsKKyAgICAgICAgaW50IG5iX3NlY3RvcnMxID0gcmVhZF9pbnRzKHMtPnBiLCBzZWN0b3JzMSwgV1RWX1NFQ1RPUl9TSVpFIC8gNCk7CisgICAgICAgIGludCBpOworCisgICAgICAgIHdmLT5zZWN0b3JzID0gYXZfbWFsbG9jX2FycmF5KG5iX3NlY3RvcnMxLCAxIDw8IFdUVl9TRUNUT1JfQklUUyk7CisgICAgICAgIGlmICghd2YtPnNlY3RvcnMpIHsKKyAgICAgICAgICAgIGF2X2ZyZWUod2YpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgd2YtPm5iX3NlY3RvcnMgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2VjdG9yczE7IGkrKykgeworICAgICAgICAgICAgaWYgKHNlZWtfYnlfc2VjdG9yKHMtPnBiLCBzZWN0b3JzMVtpXSwgMCkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd2YtPm5iX3NlY3RvcnMgKz0gcmVhZF9pbnRzKHMtPnBiLCB3Zi0+c2VjdG9ycyArIGkgKiBXVFZfU0VDVE9SX1NJWkUgLyA0LCBXVFZfU0VDVE9SX1NJWkUgLyA0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBmaWxlIGFsbG9jYXRpb24gdGFibGUgZGVwdGggKDB4JXgpXG4iLCBkZXB0aCk7CisgICAgICAgIGF2X2ZyZWUod2YpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgd2YtPnNlY3Rvcl9iaXRzID0gbGVuZ3RoICYgKDFVTEw8PDYzKSA/IFdUVl9TRUNUT1JfQklUUyA6IFdUVl9CSUdTRUNUT1JfQklUUzsKKworICAgIGlmICghd2YtPm5iX3NlY3RvcnMpIHsKKyAgICAgICAgYXZfZnJlZSh3Zi0+c2VjdG9ycyk7CisgICAgICAgIGF2X2ZyZWUod2YpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzaXplID0gYXZpb19zaXplKHMtPnBiKTsKKyAgICBpZiAoc2l6ZSA+PSAwICYmIChpbnQ2NF90KXdmLT5zZWN0b3JzW3dmLT5uYl9zZWN0b3JzIC0gMV0gPDwgV1RWX1NFQ1RPUl9CSVRTID4gc2l6ZSkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAidHJ1bmNhdGVkIGZpbGVcbiIpOworCisgICAgLyogY2hlY2sgbGVuZ3RoICovCisgICAgbGVuZ3RoICY9IDB4RkZGRkZGRkZGRkZGOworICAgIGlmIChsZW5ndGggPiAoKGludDY0X3Qpd2YtPm5iX3NlY3RvcnMgPDwgd2YtPnNlY3Rvcl9iaXRzKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJyZXBvcnRlZCBmaWxlIGxlbmd0aCAoMHglIlBSSXg2NCIpIGV4Y2VlZHMgbnVtYmVyIG9mIGF2YWlsYWJsZSBzZWN0b3JzICgweCUiUFJJeDY0IilcbiIsIGxlbmd0aCwgKGludDY0X3Qpd2YtPm5iX3NlY3RvcnMgPDwgd2YtPnNlY3Rvcl9iaXRzKTsKKyAgICAgICAgbGVuZ3RoID0gKGludDY0X3Qpd2YtPm5iX3NlY3RvcnMgPDwgIHdmLT5zZWN0b3JfYml0czsKKyAgICB9CisgICAgd2YtPmxlbmd0aCA9IGxlbmd0aDsKKworICAgIC8qIHNlZWsgdG8gaW5pdGlhbCBzZWN0b3IgKi8KKyAgICB3Zi0+cG9zaXRpb24gPSAwOworICAgIGlmIChzZWVrX2J5X3NlY3RvcihzLT5wYiwgd2YtPnNlY3RvcnNbMF0sIDApIDwgMCkgeworICAgICAgICBhdl9mcmVlKHdmLT5zZWN0b3JzKTsKKyAgICAgICAgYXZfZnJlZSh3Zik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHdmLT5wYl9maWxlc3lzdGVtID0gcy0+cGI7CisgICAgYnVmZmVyID0gYXZfbWFsbG9jKDEgPDwgd2YtPnNlY3Rvcl9iaXRzKTsKKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICBhdl9mcmVlKHdmLT5zZWN0b3JzKTsKKyAgICAgICAgYXZfZnJlZSh3Zik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBiID0gYXZpb19hbGxvY19jb250ZXh0KGJ1ZmZlciwgMSA8PCB3Zi0+c2VjdG9yX2JpdHMsIDAsIHdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd3R2ZmlsZV9yZWFkX3BhY2tldCwgTlVMTCwgd3R2ZmlsZV9zZWVrKTsKKyAgICBpZiAoIXBiKSB7CisgICAgICAgIGF2X2ZyZWUoYnVmZmVyKTsKKyAgICAgICAgYXZfZnJlZSh3Zi0+c2VjdG9ycyk7CisgICAgICAgIGF2X2ZyZWUod2YpOworICAgIH0KKyAgICByZXR1cm4gcGI7Cit9CisKKy8qKgorICogT3BlbiBmaWxlIHVzaW5nIGZpbGVuYW1lCisgKiBAcGFyYW1baW5dICBidWYgICAgICAgZGlyZWN0b3J5IGJ1ZmZlcgorICogQHBhcmFtICAgICAgYnVmX3NpemUgIGRpcmVjdG9yeSBidWZmZXIgc2l6ZQorICogQHBhcmFtW2luXSAgZmlsZW5hbWUKKyAqIEBwYXJhbSAgICAgIGZpbGVuYW1lX3NpemUgc2l6ZSBvZiBmaWxlbmFtZQorICogQHJldHVybiBOVUxMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBBVklPQ29udGV4dCAqIHd0dmZpbGVfb3BlbjIoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgY29uc3QgdWludDhfdCAqZmlsZW5hbWUsIGludCBmaWxlbmFtZV9zaXplKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBidWYgKyBidWZfc2l6ZTsKKworICAgIHdoaWxlKGJ1ZiArIDQ4IDw9IGJ1Zl9lbmQpIHsKKyAgICAgICAgaW50IGRpcl9sZW5ndGgsIG5hbWVfc2l6ZSwgZmlyc3Rfc2VjdG9yLCBkZXB0aDsKKyAgICAgICAgdWludDY0X3QgZmlsZV9sZW5ndGg7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm5hbWU7CisgICAgICAgIGlmIChmZl9ndWlkY21wKGJ1ZiwgZmZfZGlyX2VudHJ5X2d1aWQpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5rbm93biBndWlkICJGRl9QUklfR1VJRCIsIGV4cGVjdGVkIGRpcl9lbnRyeV9ndWlkOyAiCisgICAgICAgICAgICAgICAgICAgInJlbWFpbmluZyBkaXJlY3RvcnkgZW50cmllcyBpZ25vcmVkXG4iLCBGRl9BUkdfR1VJRChidWYpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRpcl9sZW5ndGggID0gQVZfUkwxNihidWYgKyAxNik7CisgICAgICAgIGZpbGVfbGVuZ3RoID0gQVZfUkw2NChidWYgKyAyNCk7CisgICAgICAgIG5hbWVfc2l6ZSAgID0gMiAqIEFWX1JMMzIoYnVmICsgMzIpOworICAgICAgICBpZiAobmFtZV9zaXplIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiYmFkIGZpbGVuYW1lIGxlbmd0aCwgcmVtYWluaW5nIGRpcmVjdG9yeSBlbnRyaWVzIGlnbm9yZWRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDQ4ICsgKGludDY0X3QpbmFtZV9zaXplID4gYnVmX2VuZCAtIGJ1ZikgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImZpbGVuYW1lIGV4Y2VlZHMgYnVmZmVyIHNpemU7IHJlbWFpbmluZyBkaXJlY3RvcnkgZW50cmllcyBpZ25vcmVkXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZpcnN0X3NlY3RvciA9IEFWX1JMMzIoYnVmICsgNDAgKyBuYW1lX3NpemUpOworICAgICAgICBkZXB0aCAgICAgICAgPSBBVl9STDMyKGJ1ZiArIDQ0ICsgbmFtZV9zaXplKTsKKworICAgICAgICAvKiBjb21wYXJlIGZpbGUgbmFtZTsgdGVzdCBvcHRpb25hbCBudWxsIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgbmFtZSA9IGJ1ZiArIDQwOworICAgICAgICBpZiAobmFtZV9zaXplID49IGZpbGVuYW1lX3NpemUgJiYKKyAgICAgICAgICAgICFtZW1jbXAobmFtZSwgZmlsZW5hbWUsIGZpbGVuYW1lX3NpemUpICYmCisgICAgICAgICAgICAobmFtZV9zaXplIDwgZmlsZW5hbWVfc2l6ZSArIDIgfHwgIUFWX1JOMTYobmFtZSArIGZpbGVuYW1lX3NpemUpKSkKKyAgICAgICAgICAgIHJldHVybiB3dHZmaWxlX29wZW5fc2VjdG9yKGZpcnN0X3NlY3RvciwgZmlsZV9sZW5ndGgsIGRlcHRoLCBzKTsKKworICAgICAgICBidWYgKz0gZGlyX2xlbmd0aDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgd3R2ZmlsZV9vcGVuKHMsIGJ1ZiwgYnVmX3NpemUsIGZpbGVuYW1lKSBcCisgICAgd3R2ZmlsZV9vcGVuMihzLCBidWYsIGJ1Zl9zaXplLCBmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSkKKworLyoqCisgKiBDbG9zZSBmaWxlIG9wZW5lZCB3aXRoIHd0dmZpbGVfb3Blbl9zZWN0b3IoKSwgb3Igd3R2X29wZW4oKQorICovCitzdGF0aWMgdm9pZCB3dHZmaWxlX2Nsb3NlKEFWSU9Db250ZXh0ICpwYikKK3sKKyAgICBXdHZGaWxlICp3ZiA9IHBiLT5vcGFxdWU7CisgICAgYXZfZnJlZSh3Zi0+c2VjdG9ycyk7CisgICAgYXZfZnJlZXAoJnBiLT5vcGFxdWUpOworICAgIGF2X2ZyZWVwKCZwYi0+YnVmZmVyKTsKKyAgICBhdl9mcmVlKHBiKTsKK30KKworLyoKKyAqCisgKiBNYWluIGRlbXV4ZXIKKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBzZWVuX2RhdGE7Cit9IFd0dlN0cmVhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWSU9Db250ZXh0ICpwYjsgICAgICAgLyoqPCB0aW1lbGluZSBmaWxlICovCisgICAgaW50NjRfdCBlcG9jaDsKKyAgICBpbnQ2NF90IHB0czsgICAgICAgICAgICAgLyoqPCBwdHMgZm9yIG5leHQgZGF0YSBjaHVuayAqLworICAgIGludDY0X3QgbGFzdF92YWxpZF9wdHM7ICAvKio8IGxhdGVzdCB2YWxpZCBwdHMsIHVzZWQgZm9yIGludGVyYXRpdmUgc2Vla2luZyAqLworCisgICAgLyogbWFpbnRhaW4gcHJpdmF0ZSBzZWVrIGluZGV4LCBhcyB0aGUgQVZJbmRleEVudHJ5LT5wb3MgaXMgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgc3RhcnQgb2YgdGhlICd0aW1lbGluZScgZmlsZSwgbm90IHRoZSBmaWxlIHN5c3RlbSAoQVZGb3JtYXRDb250ZXh0LT5wYikgKi8KKyAgICBBVkluZGV4RW50cnkgKmluZGV4X2VudHJpZXM7CisgICAgaW50IG5iX2luZGV4X2VudHJpZXM7CisgICAgdW5zaWduZWQgaW50IGluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemU7Cit9IFd0dkNvbnRleHQ7CisKKy8qIFdUViBHVUlEcyAqLworc3RhdGljIGNvbnN0IGZmX2FzZl9ndWlkIEVWRU5USURfU3VidGl0bGVTcGFubmluZ0V2ZW50ID0KKyAgICB7MHg0OCwweEMwLDB4Q0UsMHg1RCwweEI5LDB4RDAsMHg2MywweDQxLDB4ODcsMHgyQywweDRGLDB4MzIsMHgyMiwweDNCLDB4RTgsMHg4QX07CitzdGF0aWMgY29uc3QgZmZfYXNmX2d1aWQgRVZFTlRJRF9MYW5ndWFnZVNwYW5uaW5nRXZlbnQgPQorICAgIHsweDZELDB4NjYsMHg5MiwweEUyLDB4MDIsMHg5QywweDhELDB4NDQsMHhBQSwweDhELDB4NzgsMHgxQSwweDkzLDB4RkQsMHhDMywweDk1fTsKK3N0YXRpYyBjb25zdCBmZl9hc2ZfZ3VpZCBFVkVOVElEX0F1ZGlvRGVzY3JpcHRvclNwYW5uaW5nRXZlbnQgPQorICAgIHsweDFDLDB4RDQsMHg3QiwweDEwLDB4REEsMHhBNiwweDkxLDB4NDYsMHg4MywweDY5LDB4MTEsMHhCMiwweENELDB4QUEsMHgyOCwweDhFfTsKK3N0YXRpYyBjb25zdCBmZl9hc2ZfZ3VpZCBFVkVOVElEX0N0eEFEZXNjcmlwdG9yU3Bhbm5pbmdFdmVudCA9CisgICAgezB4RTYsMHhBMiwweEI0LDB4M0EsMHg0NywweDQyLDB4MzQsMHg0QiwweDg5LDB4NkMsMHgzMCwweEFGLDB4QTUsMHhEMiwweDFDLDB4MjR9Oworc3RhdGljIGNvbnN0IGZmX2FzZl9ndWlkIEVWRU5USURfQ1NEZXNjcmlwdG9yU3Bhbm5pbmdFdmVudCA9CisgICAgezB4RDksMHg3OSwweEU3LDB4RWYsMHhGMCwweDk3LDB4ODYsMHg0NywweDgwLDB4MEQsMHg5NSwweENGLDB4NTAsMHg1RCwweERDLDB4NjZ9Oworc3RhdGljIGNvbnN0IGZmX2FzZl9ndWlkIEVWRU5USURfRFZCU2NyYW1ibGluZ0NvbnRyb2xTcGFubmluZ0V2ZW50ID0KKyAgICB7MHhDNCwweEUxLDB4RDQsMHg0QiwweEExLDB4OTAsMHgwOSwweDQxLDB4ODIsMHgzNiwweDI3LDB4RjAsMHgwRSwweDdELDB4Q0MsMHg1Qn07CitzdGF0aWMgY29uc3QgZmZfYXNmX2d1aWQgRVZFTlRJRF9TdHJlYW1JRFNwYW5uaW5nRXZlbnQgPQorICAgIHsweDY4LDB4QUIsMHhGMSwweENBLDB4NTMsMHhFMSwweDQxLDB4NEQsMHhBNiwweEIzLDB4QTcsMHhDOSwweDk4LDB4REIsMHg3NSwweEVFfTsKK3N0YXRpYyBjb25zdCBmZl9hc2ZfZ3VpZCBFVkVOVElEX1RlbGV0ZXh0U3Bhbm5pbmdFdmVudCA9CisgICAgezB4NTAsMHhEOSwweDk5LDB4OTUsMHgzMywweDVGLDB4MTcsMHg0NiwweEFGLDB4N0MsMHgxRSwweDU0LDB4QjUsMHgxMCwweERBLDB4QTN9Oworc3RhdGljIGNvbnN0IGZmX2FzZl9ndWlkIEVWRU5USURfQXVkaW9UeXBlU3Bhbm5pbmdFdmVudCA9CisgICAgezB4QkUsMHhCRiwweDFDLDB4NTAsMHg0OSwweEI4LDB4Q0UsMHg0MiwweDlCLDB4RTksMHgzRCwweEI4LDB4NjksMHhGQiwweDgyLDB4QjN9OworCisvKiBXaW5kb3dzIG1lZGlhIEdVSURzICovCisKKy8qIE1lZGlhIHR5cGVzICovCitzdGF0aWMgY29uc3QgZmZfYXNmX2d1aWQgbWVkaWFzdWJ0eXBlX21wZWcxcGF5bG9hZCA9CisgICAgezB4ODEsMHhFQiwweDM2LDB4RTQsMHg0RiwweDUyLDB4Q0UsMHgxMSwweDlGLDB4NTMsMHgwMCwweDIwLDB4QUYsMHgwQiwweEE3LDB4NzB9Oworc3RhdGljIGNvbnN0IGZmX2FzZl9ndWlkIG1lZGlhdHlwZV9tcGVnMl9zZWN0aW9ucyA9CisgICAgezB4NkMsMHgxNywweDVGLDB4NDUsMHgwNiwweDRCLDB4Q0UsMHg0NywweDlBLDB4RUYsMHg4QywweEFFLDB4RjcsMHgzRCwweEY3LDB4QjV9Oworc3RhdGljIGNvbnN0IGZmX2FzZl9ndWlkIG1lZGlhdHlwZV9tcGVnMl9wZXMgPQorICAgIHsweDIwLDB4ODAsMHg2RCwweEUwLDB4NDYsMHhEQiwweENGLDB4MTEsMHhCNCwweEQxLDB4MDAsMHg4MCwweDVGLDB4NkMsMHhCQiwweEVBfTsKK3N0YXRpYyBjb25zdCBmZl9hc2ZfZ3VpZCBtZWRpYXR5cGVfbXN0dmNhcHRpb24gPQorICAgIHsweDg5LDB4OEEsMHg4QiwweEI4LDB4NDksMHhCMCwweDgwLDB4NEMsMHhBRCwweENGLDB4NTgsMHg5OCwweDk4LDB4NUUsMHgyMiwweEMxfTsKKworLyogTWVkaWEgc3VidHlwZXMgKi8KK3N0YXRpYyBjb25zdCBmZl9hc2ZfZ3VpZCBtZWRpYXN1YnR5cGVfZHZiX3N1YnRpdGxlID0KKyAgICB7MHhDMywweENCLDB4RkYsMHgzNCwweEIzLDB4RDUsMHg3MSwweDQxLDB4OTAsMHgwMiwweEQ0LDB4QzYsMHgwMywweDAxLDB4NjksMHg3Rn07CitzdGF0aWMgY29uc3QgZmZfYXNmX2d1aWQgbWVkaWFzdWJ0eXBlX3RlbGV0ZXh0ID0KKyAgICB7MHhFMywweDc2LDB4MkEsMHhGNywweDBBLDB4RUIsMHhEMCwweDExLDB4QUMsMHhFNCwweDAwLDB4MDAsMHhDMCwweENDLDB4MTYsMHhCQX07CitzdGF0aWMgY29uc3QgZmZfYXNmX2d1aWQgbWVkaWFzdWJ0eXBlX2R0dmNjZGF0YSA9CisgICAgezB4QUEsMHhERCwweDJBLDB4RjUsMHhGMCwweDM2LDB4RjUsMHg0MywweDk1LDB4RUEsMHg2RCwweDg2LDB4NjQsMHg4NCwweDI2LDB4MkF9Oworc3RhdGljIGNvbnN0IGZmX2FzZl9ndWlkIG1lZGlhc3VidHlwZV9tcGVnMl9zZWN0aW9ucyA9CisgICAgezB4NzksMHg4NSwweDlGLDB4NEEsMHhGOCwweDZCLDB4OTIsMHg0MywweDhBLDB4NkQsMHhEMiwweERELDB4MDksMHhGQSwweDc4LDB4NjF9OworCitzdGF0aWMgaW50IHJlYWRfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgcmV0dXJuIGZmX2d1aWRjbXAocC0+YnVmLCBmZl93dHZfZ3VpZCkgPyAwIDogQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKKy8qKgorICogQ29udmVydCB3aW4zMiBGSUxFVElNRSB0byBJU08tODYwMSBzdHJpbmcKKyAqIEByZXR1cm4gPDAgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBmaWxldGltZV90b19pc284NjAxKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQ2NF90IHZhbHVlKQoreworICAgIHRpbWVfdCB0ID0gKHZhbHVlIC8gMTAwMDAwMDBMTCkgLSAxMTY0NDQ3MzYwMExMOworICAgIHN0cnVjdCB0bSB0bWJ1ZjsKKyAgICBzdHJ1Y3QgdG0gKnRtID0gZ210aW1lX3IoJnQsICZ0bWJ1Zik7CisgICAgaWYgKCF0bSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghc3RyZnRpbWUoYnVmLCBidWZfc2l6ZSwgIiVZLSVtLSVkICVIOiVNOiVTIiwgdG0pKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29udmVydCBjcmF6eSB0aW1lICgxMDBucyBzaW5jZSAxIEphbiAwMDAxKSB0byBJU08tODYwMSBzdHJpbmcKKyAqIEByZXR1cm4gPDAgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBjcmF6eXRpbWVfdG9faXNvODYwMShjaGFyICpidWYsIGludCBidWZfc2l6ZSwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICB0aW1lX3QgdCA9ICh2YWx1ZSAvIDEwMDAwMDAwTEwpIC0gNzE5MTYyTEwqODY0MDBMTDsKKyAgICBzdHJ1Y3QgdG0gdG1idWY7CisgICAgc3RydWN0IHRtICp0bSA9IGdtdGltZV9yKCZ0LCAmdG1idWYpOworICAgIGlmICghdG0pCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIXN0cmZ0aW1lKGJ1ZiwgYnVmX3NpemUsICIlWS0lbS0lZCAlSDolTTolUyIsIHRtKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIENvbnZlcnQgT0xFIERBVEUgdG8gSVNPLTg2MDEgc3RyaW5nCisgKiBAcmV0dXJuIDwwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgb2xlZGF0ZV90b19pc284NjAxKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQ2NF90IHZhbHVlKQoreworICAgIHRpbWVfdCB0ID0gKGF2X2ludDJkb3VibGUodmFsdWUpIC0gMjU1NjkuMCkgKiA4NjQwMDsKKyAgICBzdHJ1Y3QgdG0gdG1idWY7CisgICAgc3RydWN0IHRtICp0bT0gZ210aW1lX3IoJnQsICZ0bWJ1Zik7CisgICAgaWYgKCF0bSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghc3RyZnRpbWUoYnVmLCBidWZfc2l6ZSwgIiVZLSVtLSVkICVIOiVNOiVTIiwgdG0pKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9hdHRhY2htZW50KEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBpbnQgbGVuZ3RoKQoreworICAgIGNoYXIgbWltZVsxMDI0XTsKKyAgICBjaGFyIGRlc2NyaXB0aW9uWzEwMjRdOworICAgIHVuc2lnbmVkIGludCBmaWxlc2l6ZTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IHJldDsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICBhdmlvX2dldF9zdHIxNmxlKHBiLCBJTlRfTUFYLCBtaW1lLCBzaXplb2YobWltZSkpOworICAgIGlmIChzdHJjbXAobWltZSwgImltYWdlL2pwZWciKSkKKyAgICAgICAgZ290byBkb25lOworCisgICAgYXZpb19yOChwYik7CisgICAgYXZpb19nZXRfc3RyMTZsZShwYiwgSU5UX01BWCwgZGVzY3JpcHRpb24sIHNpemVvZihkZXNjcmlwdGlvbikpOworICAgIGZpbGVzaXplID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZiAoIWZpbGVzaXplKQorICAgICAgICBnb3RvIGRvbmU7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgZ290byBkb25lOworICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJ0aXRsZSIsIGRlc2NyaXB0aW9uLCAwKTsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTUpQRUc7CisgICAgc3QtPmlkID0gLTE7CisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgJnN0LT5hdHRhY2hlZF9waWMsIGZpbGVzaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBkb25lOworICAgIHN0LT5hdHRhY2hlZF9waWMuc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIHN0LT5hdHRhY2hlZF9waWMuZmxhZ3MgICAgICAgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgIHN0LT5kaXNwb3NpdGlvbiAgICAgICAgICAgICAgfD0gQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDOworZG9uZToKKyAgICBhdmlvX3NlZWsocGIsIHBvcyArIGxlbmd0aCwgU0VFS19TRVQpOworfQorCitzdGF0aWMgdm9pZCBnZXRfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBjb25zdCBjaGFyICprZXksIGludCB0eXBlLCBpbnQgbGVuZ3RoKQoreworICAgIGludCBidWZfc2l6ZTsKKyAgICBjaGFyICpidWY7CisKKyAgICBpZiAoIXN0cmNtcChrZXksICJXTS9NZWRpYVRodW1iVHlwZSIpKSB7CisgICAgICAgIGF2aW9fc2tpcChwYiwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJ1Zl9zaXplID0gRkZNQVgoMipsZW5ndGgsIExFTl9QUkVUVFlfR1VJRCkgKyAxOworICAgIGJ1ZiA9IGF2X21hbGxvYyhidWZfc2l6ZSk7CisgICAgaWYgKCFidWYpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICh0eXBlID09IDAgJiYgbGVuZ3RoID09IDQpIHsKKyAgICAgICAgc25wcmludGYoYnVmLCBidWZfc2l6ZSwgIiV1IiwgYXZpb19ybDMyKHBiKSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09IDEpIHsKKyAgICAgICAgYXZpb19nZXRfc3RyMTZsZShwYiwgbGVuZ3RoLCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKCFzdHJsZW4oYnVmKSkgeworICAgICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZSA9PSAzICYmIGxlbmd0aCA9PSA0KSB7CisgICAgICAgIHN0cmNweShidWYsIGF2aW9fcmwzMihwYikgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gNCAmJiBsZW5ndGggPT0gOCkgeworICAgICAgICBpbnQ2NF90IG51bSA9IGF2aW9fcmw2NChwYik7CisgICAgICAgIGlmICghc3RyY21wKGtleSwgIldNL0VuY29kaW5nVGltZSIpIHx8CisgICAgICAgICAgICAhc3RyY21wKGtleSwgIldNL01lZGlhT3JpZ2luYWxCcm9hZGNhc3REYXRlVGltZSIpKSB7CisgICAgICAgICAgICBpZiAoZmlsZXRpbWVfdG9faXNvODYwMShidWYsIGJ1Zl9zaXplLCBudW0pIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUoYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJXTS9XTVJWRW5jb2RlVGltZSIpIHx8CisgICAgICAgICAgICAgICAgICAgIXN0cmNtcChrZXksICJXTS9XTVJWRW5kVGltZSIpKSB7CisgICAgICAgICAgICBpZiAoY3Jhenl0aW1lX3RvX2lzbzg2MDEoYnVmLCBidWZfc2l6ZSwgbnVtKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiV00vV01SVkV4cGlyYXRpb25EYXRlIikpIHsKKyAgICAgICAgICAgIGlmIChvbGVkYXRlX3RvX2lzbzg2MDEoYnVmLCBidWZfc2l6ZSwgbnVtKSA8IDAgKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIldNL1dNUlZCaXRyYXRlIikpCisgICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1Zl9zaXplLCAiJWYiLCBhdl9pbnQyZG91YmxlKG51bSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1Zl9zaXplLCAiJSJQUklpNjQsIG51bSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09IDUgJiYgbGVuZ3RoID09IDIpIHsKKyAgICAgICAgc25wcmludGYoYnVmLCBidWZfc2l6ZSwgIiV1IiwgYXZpb19ybDE2KHBiKSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09IDYgJiYgbGVuZ3RoID09IDE2KSB7CisgICAgICAgIGZmX2FzZl9ndWlkIGd1aWQ7CisgICAgICAgIGF2aW9fcmVhZChwYiwgZ3VpZCwgMTYpOworICAgICAgICBzbnByaW50ZihidWYsIGJ1Zl9zaXplLCBQUklfUFJFVFRZX0dVSUQsIEFSR19QUkVUVFlfR1VJRChndWlkKSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09IDIgJiYgIXN0cmNtcChrZXksICJXTS9QaWN0dXJlIikpIHsKKyAgICAgICAgZ2V0X2F0dGFjaG1lbnQocywgcGIsIGxlbmd0aCk7CisgICAgICAgIGF2X2ZyZWVwKCZidWYpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfZnJlZXAoJmJ1Zik7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVuc3VwcG9ydGVkIG1ldGFkYXRhIGVudHJ5OyBrZXk6JXMsIHR5cGU6JWQsIGxlbmd0aDoweCV4XG4iLCBrZXksIHR5cGUsIGxlbmd0aCk7CisgICAgICAgIGF2aW9fc2tpcChwYiwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwga2V5LCBidWYsIDApOworICAgIGF2X2ZyZWVwKCZidWYpOworfQorCisvKioKKyAqIFBhcnNlIG1ldGFkYXRhIGVudHJpZXMKKyAqLworc3RhdGljIHZvaWQgcGFyc2VfbGVnYWN5X2F0dHJpYihBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYikKK3sKKyAgICBmZl9hc2ZfZ3VpZCBndWlkOworICAgIGludCBsZW5ndGgsIHR5cGU7CisgICAgd2hpbGUoIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgY2hhciBrZXlbMTAyNF07CisgICAgICAgIGZmX2dldF9ndWlkKHBiLCAmZ3VpZCk7CisgICAgICAgIHR5cGUgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGxlbmd0aCA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIGlmICghbGVuZ3RoKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChmZl9ndWlkY21wKCZndWlkLCBmZl9tZXRhZGF0YV9ndWlkKSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAidW5rbm93biBndWlkICJGRl9QUklfR1VJRCIsIGV4cGVjdGVkIG1ldGFkYXRhX2d1aWQ7ICIKKyAgICAgICAgICAgICAgICAgICAicmVtYWluaW5nIG1ldGFkYXRhIGVudHJpZXMgaWdub3JlZFxuIiwgRkZfQVJHX0dVSUQoZ3VpZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19nZXRfc3RyMTZsZShwYiwgSU5UX01BWCwga2V5LCBzaXplb2Yoa2V5KSk7CisgICAgICAgIGdldF90YWcocywgcGIsIGtleSwgdHlwZSwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBmZl9tZXRhZGF0YV9jb252KCZzLT5tZXRhZGF0YSwgTlVMTCwgZmZfYXNmX21ldGFkYXRhX2NvbnYpOworfQorCisvKioKKyAqIHBhcnNlIFZJREVPSU5GT0hFQURFUjIgc3RydWN0dXJlCisgKiBAcmV0dXJuIGJ5dGVzIGNvbnN1bWVkCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfdmlkZW9pbmZvaGVhZGVyMihBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCkKK3sKKyAgICBXdHZDb250ZXh0ICp3dHYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gd3R2LT5wYjsKKworICAgIGF2aW9fc2tpcChwYiwgNzIpOyAgLy8gcGljdHVyZSBhc3BlY3QgcmF0aW8gaXMgdW5yZWxpYWJsZQorICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gZmZfZ2V0X2JtcF9oZWFkZXIocGIsIHN0LCBOVUxMKTsKKworICAgIHJldHVybiA3MiArIDQwOworfQorCisvKioKKyAqIFBhcnNlIE1QRUcxV0FWRUZPUk1BVEVYIGV4dHJhZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgcGFyc2VfbXBlZzF3YXZlZm9ybWF0ZXgoQVZTdHJlYW0gKnN0KQoreworICAgIC8qIGZ3SGVhZExheWVyICovCisgICAgc3dpdGNoIChBVl9STDE2KHN0LT5jb2RlYy0+ZXh0cmFkYXRhKSkgeworICAgIGNhc2UgMHgwMDAxIDogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QMTsgYnJlYWs7CisgICAgY2FzZSAweDAwMDIgOiBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVAyOyBicmVhazsKKyAgICBjYXNlIDB4MDAwNCA6IHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUDM7IGJyZWFrOworICAgIH0KKworICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBBVl9STDMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMik7IC8qIGR3SGVhZEJpdHJhdGUgKi8KKworICAgIC8qIGR3SGVhZE1vZGUgKi8KKyAgICBzd2l0Y2ggKEFWX1JMMTYoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA2KSkgeworICAgIGNhc2UgMSA6CisgICAgY2FzZSAyIDoKKyAgICBjYXNlIDQgOiBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDggOiBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioKKyAqIEluaXRpYWxpc2Ugc3RyZWFtCisgKiBAcGFyYW0gc3QgU3RyZWFtIHRvIGluaXRpYWxpc2UsIG9yIE5VTEwgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXNlIG5ldyBzdHJlYW0KKyAqIEByZXR1cm4gTlVMTCBvbiBlcnJvcgorICovCitzdGF0aWMgQVZTdHJlYW0gKiBuZXdfc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBpbnQgc2lkLCBpbnQgY29kZWNfdHlwZSkKK3sKKyAgICBpZiAoc3QpIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBXdHZTdHJlYW0gKndzdCA9IGF2X21hbGxvY3ooc2l6ZW9mKFd0dlN0cmVhbSkpOworICAgICAgICBpZiAoIXdzdCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghc3QpIHsKKyAgICAgICAgICAgIGF2X2ZyZWUod3N0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0LT5pZCA9IHNpZDsKKyAgICAgICAgc3QtPnByaXZfZGF0YSA9IHdzdDsKKyAgICB9CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gY29kZWNfdHlwZTsKKyAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwMCk7CisgICAgcmV0dXJuIHN0OworfQorCisvKioKKyAqIHBhcnNlIE1lZGlhIFR5cGUgc3RydWN0dXJlIGFuZCBwb3B1bGF0ZSBzdHJlYW0KKyAqIEBwYXJhbSBzdCAgICAgICAgIFN0cmVhbSwgb3IgTlVMTCB0byBjcmVhdGUgbmV3IHN0cmVhbQorICogQHBhcmFtIG1lZGlhdHlwZSAgTWVkaWF0eXBlIEdVSUQKKyAqIEBwYXJhbSBzdWJ0eXBlICAgIFN1YnR5cGUgR1VJRAorICogQHBhcmFtIGZvcm1hdHR5cGUgRm9ybWF0IEdVSUQKKyAqIEBwYXJhbSBzaXplICAgICAgIFNpemUgb2YgZm9ybWF0IGJ1ZmZlcgorICogQHJldHVybiBOVUxMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBBVlN0cmVhbSAqIHBhcnNlX21lZGlhX3R5cGUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIGludCBzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2FzZl9ndWlkIG1lZGlhdHlwZSwgZmZfYXNmX2d1aWQgc3VidHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfYXNmX2d1aWQgZm9ybWF0dHlwZSwgdWludDY0X3Qgc2l6ZSkKK3sKKyAgICBXdHZDb250ZXh0ICp3dHYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gd3R2LT5wYjsKKyAgICBpZiAoIWZmX2d1aWRjbXAoc3VidHlwZSwgZmZfbWVkaWFzdWJ0eXBlX2NwZmlsdGVyc19wcm9jZXNzZWQpICYmCisgICAgICAgICFmZl9ndWlkY21wKGZvcm1hdHR5cGUsIGZmX2Zvcm1hdF9jcGZpbHRlcnNfcHJvY2Vzc2VkKSkgeworICAgICAgICBmZl9hc2ZfZ3VpZCBhY3R1YWxfc3VidHlwZTsKKyAgICAgICAgZmZfYXNmX2d1aWQgYWN0dWFsX2Zvcm1hdHR5cGU7CisKKyAgICAgICAgaWYgKHNpemUgPCAzMikgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiZm9ybWF0IGJ1ZmZlciBzaXplIHVuZGVyZmxvd1xuIik7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBhdmlvX3NraXAocGIsIHNpemUgLSAzMik7CisgICAgICAgIGZmX2dldF9ndWlkKHBiLCAmYWN0dWFsX3N1YnR5cGUpOworICAgICAgICBmZl9nZXRfZ3VpZChwYiwgJmFjdHVhbF9mb3JtYXR0eXBlKTsKKyAgICAgICAgYXZpb19zZWVrKHBiLCAtc2l6ZSwgU0VFS19DVVIpOworCisgICAgICAgIHN0ID0gcGFyc2VfbWVkaWFfdHlwZShzLCBzdCwgc2lkLCBtZWRpYXR5cGUsIGFjdHVhbF9zdWJ0eXBlLCBhY3R1YWxfZm9ybWF0dHlwZSwgc2l6ZSAtIDMyKTsKKyAgICAgICAgYXZpb19za2lwKHBiLCAzMik7CisgICAgICAgIHJldHVybiBzdDsKKyAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKG1lZGlhdHlwZSwgZmZfbWVkaWF0eXBlX2F1ZGlvKSkgeworICAgICAgICBzdCA9IG5ld19zdHJlYW0ocywgc3QsIHNpZCwgQVZNRURJQV9UWVBFX0FVRElPKTsKKyAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIWZmX2d1aWRjbXAoZm9ybWF0dHlwZSwgZmZfZm9ybWF0X3dhdmVmb3JtYXRleCkpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBmZl9nZXRfd2F2X2hlYWRlcihwYiwgc3QtPmNvZGVjLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGZmX2d1aWRjbXAoZm9ybWF0dHlwZSwgZmZfZm9ybWF0X25vbmUpKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gZm9ybWF0dHlwZToiRkZfUFJJX0dVSUQiXG4iLCBGRl9BUkdfR1VJRChmb3JtYXR0eXBlKSk7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtZW1jbXAoc3VidHlwZSArIDQsIChjb25zdCB1aW50OF90W10pe0ZGX01FRElBU1VCVFlQRV9CQVNFX0dVSUR9LCAxMikpIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl93YXZfY29kZWNfZ2V0X2lkKEFWX1JMMzIoc3VidHlwZSksIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcChzdWJ0eXBlLCBtZWRpYXN1YnR5cGVfbXBlZzFwYXlsb2FkKSkgeworICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICYmIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPj0gMjIpCisgICAgICAgICAgICAgICAgcGFyc2VfbXBlZzF3YXZlZm9ybWF0ZXgoc3QpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIk1QRUcxV0FWRUZPUk1BVEVYIHVuZGVyZmxvd1xuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ3VpZF9nZXRfaWQoZmZfY29kZWNfd2F2X2d1aWRzLCBzdWJ0eXBlKTsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAidW5rbm93biBzdWJ0eXBlOiJGRl9QUklfR1VJRCJcbiIsIEZGX0FSR19HVUlEKHN1YnR5cGUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3Q7CisgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcChtZWRpYXR5cGUsIGZmX21lZGlhdHlwZV92aWRlbykpIHsKKyAgICAgICAgc3QgPSBuZXdfc3RyZWFtKHMsIHN0LCBzaWQsIEFWTUVESUFfVFlQRV9WSURFTyk7CisgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFmZl9ndWlkY21wKGZvcm1hdHR5cGUsIGZmX2Zvcm1hdF92aWRlb2luZm8yKSkgeworICAgICAgICAgICAgaW50IGNvbnN1bWVkID0gcGFyc2VfdmlkZW9pbmZvaGVhZGVyMihzLCBzdCk7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIEZGTUFYKHNpemUgLSBjb25zdW1lZCwgMCkpOworICAgICAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKGZvcm1hdHR5cGUsIGZmX2Zvcm1hdF9tcGVnMl92aWRlbykpIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVkID0gcGFyc2VfdmlkZW9pbmZvaGVhZGVyMihzLCBzdCk7CisgICAgICAgICAgICAvKiBpZ25vcmUgZXh0cmFkYXRhOyBmaWxlcyBwcm9kdWNlZCBieSB3aW5kb3dzIG1lZGlhIGNlbnRlciBjb250YWluIG1lYW5pbmdsZXNzIG1wZWcxIHNlcXVlbmNlIGhlYWRlciAqLworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBGRk1BWChzaXplIC0gY29uc3VtZWQsIDApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChmZl9ndWlkY21wKGZvcm1hdHR5cGUsIGZmX2Zvcm1hdF9ub25lKSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJ1bmtub3duIGZvcm1hdHR5cGU6IkZGX1BSSV9HVUlEIlxuIiwgRkZfQVJHX0dVSUQoZm9ybWF0dHlwZSkpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbWVtY21wKHN1YnR5cGUgKyA0LCAoY29uc3QgdWludDhfdFtdKXtGRl9NRURJQVNVQlRZUEVfQkFTRV9HVUlEfSwgMTIpKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2JtcF90YWdzLCBBVl9STDMyKHN1YnR5cGUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9jb2RlY19ndWlkX2dldF9pZChmZl92aWRlb19ndWlkcywgc3VidHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gc3VidHlwZToiRkZfUFJJX0dVSUQiXG4iLCBGRl9BUkdfR1VJRChzdWJ0eXBlKSk7CisgICAgICAgIHJldHVybiBzdDsKKyAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKG1lZGlhdHlwZSwgbWVkaWF0eXBlX21wZWcyX3BlcykgJiYKKyAgICAgICAgICAgICAgICFmZl9ndWlkY21wKHN1YnR5cGUsIG1lZGlhc3VidHlwZV9kdmJfc3VidGl0bGUpKSB7CisgICAgICAgIHN0ID0gbmV3X3N0cmVhbShzLCBzdCwgc2lkLCBBVk1FRElBX1RZUEVfU1VCVElUTEUpOworICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChmZl9ndWlkY21wKGZvcm1hdHR5cGUsIGZmX2Zvcm1hdF9ub25lKSkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gZm9ybWF0dHlwZToiRkZfUFJJX0dVSUQiXG4iLCBGRl9BUkdfR1VJRChmb3JtYXR0eXBlKSk7CisgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9EVkJfU1VCVElUTEU7CisgICAgICAgIHJldHVybiBzdDsKKyAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKG1lZGlhdHlwZSwgbWVkaWF0eXBlX21zdHZjYXB0aW9uKSAmJgorICAgICAgICAgICAgICAgKCFmZl9ndWlkY21wKHN1YnR5cGUsIG1lZGlhc3VidHlwZV90ZWxldGV4dCkgfHwgIWZmX2d1aWRjbXAoc3VidHlwZSwgbWVkaWFzdWJ0eXBlX2R0dmNjZGF0YSkpKSB7CisgICAgICAgIHN0ID0gbmV3X3N0cmVhbShzLCBzdCwgc2lkLCBBVk1FRElBX1RZUEVfU1VCVElUTEUpOworICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChmZl9ndWlkY21wKGZvcm1hdHR5cGUsIGZmX2Zvcm1hdF9ub25lKSkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gZm9ybWF0dHlwZToiRkZfUFJJX0dVSUQiXG4iLCBGRl9BUkdfR1VJRChmb3JtYXR0eXBlKSk7CisgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSAhZmZfZ3VpZGNtcChzdWJ0eXBlLCBtZWRpYXN1YnR5cGVfdGVsZXRleHQpID8gQVZfQ09ERUNfSURfRFZCX1RFTEVURVhUIDogQVZfQ09ERUNfSURfRUlBXzYwODsKKyAgICAgICAgcmV0dXJuIHN0OworICAgIH0gZWxzZSBpZiAoIWZmX2d1aWRjbXAobWVkaWF0eXBlLCBtZWRpYXR5cGVfbXBlZzJfc2VjdGlvbnMpICYmCisgICAgICAgICAgICAgICAhZmZfZ3VpZGNtcChzdWJ0eXBlLCBtZWRpYXN1YnR5cGVfbXBlZzJfc2VjdGlvbnMpKSB7CisgICAgICAgIGlmIChmZl9ndWlkY21wKGZvcm1hdHR5cGUsIGZmX2Zvcm1hdF9ub25lKSkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gZm9ybWF0dHlwZToiRkZfUFJJX0dVSUQiXG4iLCBGRl9BUkdfR1VJRChmb3JtYXR0eXBlKSk7CisgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gbWVkaWEgdHlwZSwgbWVkaWF0eXBlOiJGRl9QUklfR1VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgc3VidHlwZToiRkZfUFJJX0dVSUQiLCBmb3JtYXR0eXBlOiJGRl9QUklfR1VJRCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9BUkdfR1VJRChtZWRpYXR5cGUpLCBGRl9BUkdfR1VJRChzdWJ0eXBlKSwgRkZfQVJHX0dVSUQoZm9ybWF0dHlwZSkpOworICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2VudW0geworICAgIFNFRUtfVE9fREFUQSA9IDAsCisgICAgU0VFS19UT19QVFMsCit9OworCisvKioKKyAqIFRyeSB0byBzZWVrIG92ZXIgYSBicm9rZW4gY2h1bmsKKyAqIEByZXR1cm4gPDAgb24gZXJyb3IKKyAqLworc3RhdGljIGludCByZWNvdmVyKFd0dkNvbnRleHQgKnd0diwgdWludDY0X3QgYnJva2VuX3BvcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSB3dHYtPnBiOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3dHYtPm5iX2luZGV4X2VudHJpZXM7IGkrKykgeworICAgICAgICBpZiAod3R2LT5pbmRleF9lbnRyaWVzW2ldLnBvcyA+IGJyb2tlbl9wb3MpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBhdmlvX3NlZWsocGIsIHd0di0+aW5kZXhfZW50cmllc1tpXS5wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB3dHYtPnB0cyA9IHd0di0+aW5kZXhfZW50cmllc1tpXS50aW1lc3RhbXA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworfQorCisvKioKKyAqIFBhcnNlIFdUViBjaHVua3MKKyAqIEBwYXJhbSBtb2RlIFNFRUtfVE9fREFUQSBvciBTRUVLX1RPX1BUUworICogQHBhcmFtIHNlZWt0cyB0aW1lc3RhbXAKKyAqIEBwYXJhbVtvdXRdIGxlbl9wdHIgTGVuZ3RoIG9mIGRhdGEgY2h1bmsKKyAqIEByZXR1cm4gc3RyZWFtIGluZGV4IG9mIGRhdGEgY2h1bmssIG9yIDwwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfY2h1bmtzKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IG1vZGUsIGludDY0X3Qgc2Vla3RzLCBpbnQgKmxlbl9wdHIpCit7CisgICAgV3R2Q29udGV4dCAqd3R2ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHd0di0+cGI7CisgICAgd2hpbGUgKCFhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgIGZmX2FzZl9ndWlkIGc7CisgICAgICAgIGludCBsZW4sIHNpZCwgY29uc3VtZWQ7CisKKyAgICAgICAgZmZfZ2V0X2d1aWQocGIsICZnKTsKKyAgICAgICAgbGVuID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgaWYgKGxlbiA8IDMyKSB7CisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiZW5jb3VudGVyZWQgYnJva2VuIGNodW5rXG4iKTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gcmVjb3Zlcih3dHYsIGF2aW9fdGVsbChwYikgLSAyMCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc2lkID0gYXZpb19ybDMyKHBiKSAmIDB4N0ZGRjsKKyAgICAgICAgYXZpb19za2lwKHBiLCA4KTsKKyAgICAgICAgY29uc3VtZWQgPSAzMjsKKworICAgICAgICBpZiAoIWZmX2d1aWRjbXAoZywgZmZfU0JFMl9TVFJFQU1fREVTQ19FVkVOVCkpIHsKKyAgICAgICAgICAgIGlmIChmZl9maW5kX3N0cmVhbV9pbmRleChzLCBzaWQpIDwgMCkgeworICAgICAgICAgICAgICAgIGZmX2FzZl9ndWlkIG1lZGlhdHlwZSwgc3VidHlwZSwgZm9ybWF0dHlwZTsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDI4KTsKKyAgICAgICAgICAgICAgICBmZl9nZXRfZ3VpZChwYiwgJm1lZGlhdHlwZSk7CisgICAgICAgICAgICAgICAgZmZfZ2V0X2d1aWQocGIsICZzdWJ0eXBlKTsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDEyKTsKKyAgICAgICAgICAgICAgICBmZl9nZXRfZ3VpZChwYiwgJmZvcm1hdHR5cGUpOworICAgICAgICAgICAgICAgIHNpemUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgIHBhcnNlX21lZGlhX3R5cGUocywgMCwgc2lkLCBtZWRpYXR5cGUsIHN1YnR5cGUsIGZvcm1hdHR5cGUsIHNpemUpOworICAgICAgICAgICAgICAgIGNvbnN1bWVkICs9IDkyICsgc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcChnLCBmZl9zdHJlYW0yX2d1aWQpKSB7CisgICAgICAgICAgICBpbnQgc3RyZWFtX2luZGV4ID0gZmZfZmluZF9zdHJlYW1faW5kZXgocywgc2lkKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1faW5kZXggPj0gMCAmJiBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPnByaXZfZGF0YSAmJiAhKChXdHZTdHJlYW0qKXMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+cHJpdl9kYXRhKS0+c2Vlbl9kYXRhKSB7CisgICAgICAgICAgICAgICAgZmZfYXNmX2d1aWQgbWVkaWF0eXBlLCBzdWJ0eXBlLCBmb3JtYXR0eXBlOworICAgICAgICAgICAgICAgIGludCBzaXplOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMTIpOworICAgICAgICAgICAgICAgIGZmX2dldF9ndWlkKHBiLCAmbWVkaWF0eXBlKTsKKyAgICAgICAgICAgICAgICBmZl9nZXRfZ3VpZChwYiwgJnN1YnR5cGUpOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMTIpOworICAgICAgICAgICAgICAgIGZmX2dldF9ndWlkKHBiLCAmZm9ybWF0dHlwZSk7CisgICAgICAgICAgICAgICAgc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICAgICAgcGFyc2VfbWVkaWFfdHlwZShzLCBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0sIHNpZCwgbWVkaWF0eXBlLCBzdWJ0eXBlLCBmb3JtYXR0eXBlLCBzaXplKTsKKyAgICAgICAgICAgICAgICBjb25zdW1lZCArPSA3NiArIHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIWZmX2d1aWRjbXAoZywgRVZFTlRJRF9BdWRpb0Rlc2NyaXB0b3JTcGFubmluZ0V2ZW50KSB8fAorICAgICAgICAgICAgICAgICAgICFmZl9ndWlkY21wKGcsIEVWRU5USURfQ3R4QURlc2NyaXB0b3JTcGFubmluZ0V2ZW50KSB8fAorICAgICAgICAgICAgICAgICAgICFmZl9ndWlkY21wKGcsIEVWRU5USURfQ1NEZXNjcmlwdG9yU3Bhbm5pbmdFdmVudCkgfHwKKyAgICAgICAgICAgICAgICAgICAhZmZfZ3VpZGNtcChnLCBFVkVOVElEX1N0cmVhbUlEU3Bhbm5pbmdFdmVudCkgfHwKKyAgICAgICAgICAgICAgICAgICAhZmZfZ3VpZGNtcChnLCBFVkVOVElEX1N1YnRpdGxlU3Bhbm5pbmdFdmVudCkgfHwKKyAgICAgICAgICAgICAgICAgICAhZmZfZ3VpZGNtcChnLCBFVkVOVElEX1RlbGV0ZXh0U3Bhbm5pbmdFdmVudCkpIHsKKyAgICAgICAgICAgIGludCBzdHJlYW1faW5kZXggPSBmZl9maW5kX3N0cmVhbV9pbmRleChzLCBzaWQpOworICAgICAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmWzI1OF07CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGJ1ZiA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemU7CisKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDgpOworICAgICAgICAgICAgICAgIGNvbnN1bWVkICs9IDg7CisgICAgICAgICAgICAgICAgaWYgKCFmZl9ndWlkY21wKGcsIEVWRU5USURfQ3R4QURlc2NyaXB0b3JTcGFubmluZ0V2ZW50KSB8fAorICAgICAgICAgICAgICAgICAgICAhZmZfZ3VpZGNtcChnLCBFVkVOVElEX0NTRGVzY3JpcHRvclNwYW5uaW5nRXZlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNik7CisgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkICs9IDY7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmX3NpemUgPSBGRk1JTihsZW4gLSBjb25zdW1lZCwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgY29uc3VtZWQgKz0gYnVmX3NpemU7CisgICAgICAgICAgICAgICAgZmZfcGFyc2VfbXBlZzJfZGVzY3JpcHRvcihzLCBzdCwgMCwgJnBidWYsIGJ1ZiArIGJ1Zl9zaXplLCBOVUxMLCAwLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcChnLCBFVkVOVElEX0F1ZGlvVHlwZVNwYW5uaW5nRXZlbnQpKSB7CisgICAgICAgICAgICBpbnQgc3RyZWFtX2luZGV4ID0gZmZfZmluZF9zdHJlYW1faW5kZXgocywgc2lkKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1faW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKKyAgICAgICAgICAgICAgICBpbnQgYXVkaW9fdHlwZTsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDgpOworICAgICAgICAgICAgICAgIGF1ZGlvX3R5cGUgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9fdHlwZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fSEVBUklOR19JTVBBSVJFRDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhdWRpb190eXBlID09IDMpCisgICAgICAgICAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiB8PSBBVl9ESVNQT1NJVElPTl9WSVNVQUxfSU1QQUlSRUQ7CisgICAgICAgICAgICAgICAgY29uc3VtZWQgKz0gOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcChnLCBFVkVOVElEX0RWQlNjcmFtYmxpbmdDb250cm9sU3Bhbm5pbmdFdmVudCkpIHsKKyAgICAgICAgICAgIGludCBzdHJlYW1faW5kZXggPSBmZl9maW5kX3N0cmVhbV9pbmRleChzLCBzaWQpOworICAgICAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxMik7CisgICAgICAgICAgICAgICAgaWYgKGF2aW9fcmwzMihwYikpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkRWQiBzY3JhbWJsZWQgc3RyZWFtIGRldGVjdGVkIChzdDolZCksIGRlY29kaW5nIHdpbGwgbGlrZWx5IGZhaWxcbiIsIHN0cmVhbV9pbmRleCk7CisgICAgICAgICAgICAgICAgY29uc3VtZWQgKz0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIWZmX2d1aWRjbXAoZywgRVZFTlRJRF9MYW5ndWFnZVNwYW5uaW5nRXZlbnQpKSB7CisgICAgICAgICAgICBpbnQgc3RyZWFtX2luZGV4ID0gZmZfZmluZF9zdHJlYW1faW5kZXgocywgc2lkKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1faW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxhbmd1YWdlWzRdOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMTIpOworICAgICAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgbGFuZ3VhZ2UsIDMpOworICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZVswXSkgeworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVszXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIGxhbmd1YWdlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobGFuZ3VhZ2UsICJuYXIiKSB8fCAhc3RyY21wKGxhbmd1YWdlLCAiTkFSIikpCisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fVklTVUFMX0lNUEFJUkVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdW1lZCArPSAxNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcChnLCBmZl90aW1lc3RhbXBfZ3VpZCkpIHsKKyAgICAgICAgICAgIGludCBzdHJlYW1faW5kZXggPSBmZl9maW5kX3N0cmVhbV9pbmRleChzLCBzaWQpOworICAgICAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCA4KTsKKyAgICAgICAgICAgICAgICB3dHYtPnB0cyA9IGF2aW9fcmw2NChwYik7CisgICAgICAgICAgICAgICAgY29uc3VtZWQgKz0gMTY7CisgICAgICAgICAgICAgICAgaWYgKHd0di0+cHRzID09IC0xKQorICAgICAgICAgICAgICAgICAgICB3dHYtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3dHYtPmxhc3RfdmFsaWRfcHRzID0gd3R2LT5wdHM7CisgICAgICAgICAgICAgICAgICAgIGlmICh3dHYtPmVwb2NoID09IEFWX05PUFRTX1ZBTFVFIHx8IHd0di0+cHRzIDwgd3R2LT5lcG9jaCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHd0di0+ZXBvY2ggPSB3dHYtPnB0czsKKyAgICAgICAgICAgICAgICBpZiAobW9kZSA9PSBTRUVLX1RPX1BUUyAmJiB3dHYtPnB0cyA+PSBzZWVrdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBXVFZfUEFEOChsZW4pIC0gY29uc3VtZWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKGcsIGZmX2RhdGFfZ3VpZCkpIHsKKyAgICAgICAgICAgIGludCBzdHJlYW1faW5kZXggPSBmZl9maW5kX3N0cmVhbV9pbmRleChzLCBzaWQpOworICAgICAgICAgICAgaWYgKG1vZGUgPT0gU0VFS19UT19EQVRBICYmIHN0cmVhbV9pbmRleCA+PSAwICYmIGxlbiA+IDMyICYmIHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+cHJpdl9kYXRhKSB7CisgICAgICAgICAgICAgICAgV3R2U3RyZWFtICp3c3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPnByaXZfZGF0YTsKKyAgICAgICAgICAgICAgICB3c3QtPnNlZW5fZGF0YSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGxlbl9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgKmxlbl9wdHIgPSBsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1faW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIWZmX2d1aWRjbXAoZywgLyogRFNBVFRSSUJfV01EUk1Qcm90ZWN0aW9uSW5mbyAqLyAoY29uc3QgZmZfYXNmX2d1aWQpezB4ODMsMHg5NSwweDc0LDB4NDAsMHg5RCwweDZCLDB4RUMsMHg0RSwweEI0LDB4M0MsMHg2NywweEExLDB4ODAsMHgxRSwweDFBLDB4OUJ9KSkgeworICAgICAgICAgICAgaW50IHN0cmVhbV9pbmRleCA9IGZmX2ZpbmRfc3RyZWFtX2luZGV4KHMsIHNpZCk7CisgICAgICAgICAgICBpZiAoc3RyZWFtX2luZGV4ID49IDApCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiZW5jcnlwdGVkIHN0cmVhbSBkZXRlY3RlZCAoc3Q6JWQpLCBkZWNvZGluZyB3aWxsIGxpa2VseSBmYWlsXG4iLCBzdHJlYW1faW5kZXgpOworICAgICAgICB9IGVsc2UgaWYgKAorICAgICAgICAgICAgIWZmX2d1aWRjbXAoZywgLyogRFNBVFRSSUJfQ0FQVFVSRV9TVFJFQU1USU1FICovIChjb25zdCBmZl9hc2ZfZ3VpZCl7MHgxNCwweDU2LDB4MUEsMHgwQywweENELDB4MzAsMHg0MCwweDRGLDB4QkMsMHhCRiwweEQwLDB4M0UsMHg1MiwweDMwLDB4NjIsMHgwN30pIHx8CisgICAgICAgICAgICAhZmZfZ3VpZGNtcChnLCAvKiBEU0FUVFJJQl9QQkRBVEFHX0FUVFJJQlVURSAqLyAoY29uc3QgZmZfYXNmX2d1aWQpezB4NzksMHg2NiwweEI1LDB4RTAsMHhCOSwweDEyLDB4Q0MsMHg0MywweEI3LDB4REYsMHg1NywweDhDLDB4QUEsMHg1QSwweDdCLDB4NjN9KSB8fAorICAgICAgICAgICAgIWZmX2d1aWRjbXAoZywgLyogRFNBVFRSSUJfUGljU2FtcGxlU2VxICovIChjb25zdCBmZl9hc2ZfZ3VpZCl7MHgwMiwweEFFLDB4NUIsMHgyRiwweDhGLDB4N0IsMHg2MCwweDRGLDB4ODIsMHhENiwweEU0LDB4RUEsMHgyRiwweDFGLDB4NEMsMHg5OX0pIHx8CisgICAgICAgICAgICAhZmZfZ3VpZGNtcChnLCAvKiBEU0FUVFJJQl9UUkFOU1BPUlRfUFJPUEVSVElFUyAqLyBmZl9EU0FUVFJJQl9UUkFOU1BPUlRfUFJPUEVSVElFUykgfHwKKyAgICAgICAgICAgICFmZl9ndWlkY21wKGcsIC8qIGR2cl9tc192aWRfZnJhbWVfcmVwX2RhdGEgKi8gKGNvbnN0IGZmX2FzZl9ndWlkKXsweENDLDB4MzIsMHg2NCwweERELDB4MjksMHhFMiwweERCLDB4NDAsMHg4MCwweEY2LDB4RDIsMHg2MywweDI4LDB4RDIsMHg3NiwweDFGfSkgfHwKKyAgICAgICAgICAgICFmZl9ndWlkY21wKGcsIC8qIEVWRU5USURfQ2hhbm5lbENoYW5nZVNwYW5uaW5nRXZlbnQgKi8gKGNvbnN0IGZmX2FzZl9ndWlkKXsweEU1LDB4QzUsMHg2NywweDkwLDB4NUMsMHg0QywweDA1LDB4NDIsMHg4NiwweEM4LDB4N0EsMHhGRSwweDIwLDB4RkUsMHgxRSwweEZBfSkgfHwKKyAgICAgICAgICAgICFmZl9ndWlkY21wKGcsIC8qIEVWRU5USURfQ2hhbm5lbEluZm9TcGFubmluZ0V2ZW50ICovIChjb25zdCBmZl9hc2ZfZ3VpZCl7MHg4MCwweDZELDB4RjMsMHg0MSwweDMyLDB4NDEsMHhDMiwweDRDLDB4QjEsMHgyMSwweDAxLDB4QTQsMHgzMiwweDE5LDB4RDgsMHgxQn0pIHx8CisgICAgICAgICAgICAhZmZfZ3VpZGNtcChnLCAvKiBFVkVOVElEX0NoYW5uZWxUeXBlU3Bhbm5pbmdFdmVudCAqLyAoY29uc3QgZmZfYXNmX2d1aWQpezB4NTEsMHgxRCwweEFCLDB4NzIsMHhEMiwweDg3LDB4OUIsMHg0OCwweEJBLDB4MTEsMHgwRSwweDA4LDB4REMsMHgyMSwweDAyLDB4NDN9KSB8fAorICAgICAgICAgICAgIWZmX2d1aWRjbXAoZywgLyogRVZFTlRJRF9QSURMaXN0U3Bhbm5pbmdFdmVudCAqLyAoY29uc3QgZmZfYXNmX2d1aWQpezB4NjUsMHg4RiwweEZDLDB4NDcsMHhCQiwweEUyLDB4MzQsMHg0NiwweDlDLDB4RUYsMHhGRCwweEJGLDB4RTYsMHgyNiwweDFELDB4NUN9KSB8fAorICAgICAgICAgICAgIWZmX2d1aWRjbXAoZywgLyogRVZFTlRJRF9TaWduYWxBbmRTZXJ2aWNlU3RhdHVzU3Bhbm5pbmdFdmVudCAqLyAoY29uc3QgZmZfYXNmX2d1aWQpezB4Q0IsMHhDNSwweDY4LDB4ODAsMHgwNCwweDNDLDB4MkIsMHg0OSwweEI0LDB4N0QsMHgwMywweDA4LDB4ODIsMHgwRCwweENFLDB4NTF9KSB8fAorICAgICAgICAgICAgIWZmX2d1aWRjbXAoZywgLyogRVZFTlRJRF9TdHJlYW1UeXBlU3Bhbm5pbmdFdmVudCAqLyAoY29uc3QgZmZfYXNmX2d1aWQpezB4QkMsMHgyRSwweEFGLDB4ODIsMHhBNiwweDMwLDB4NjQsMHg0MiwweEE4LDB4MEIsMHhBRCwweDJFLDB4MTMsMHg3MiwweEFDLDB4NjB9KSB8fAorICAgICAgICAgICAgIWZmX2d1aWRjbXAoZywgKGNvbnN0IGZmX2FzZl9ndWlkKXsweDFFLDB4QkUsMHhDMywweEM1LDB4NDMsMHg5MiwweERDLDB4MTEsMHg4NSwweEU1LDB4MDAsMHgxMiwweDNGLDB4NkYsMHg3MywweEI5fSkgfHwKKyAgICAgICAgICAgICFmZl9ndWlkY21wKGcsIChjb25zdCBmZl9hc2ZfZ3VpZCl7MHgzQiwweDg2LDB4QTIsMHhCMSwweEVCLDB4MUUsMHhDMywweDQ0LDB4OEMsMHg4OCwweDFDLDB4QTMsMHhGRiwweEUzLDB4RTcsMHg2QX0pIHx8CisgICAgICAgICAgICAhZmZfZ3VpZGNtcChnLCAoY29uc3QgZmZfYXNmX2d1aWQpezB4NEUsMHg3RiwweDRDLDB4NUIsMHhDNCwweEQwLDB4MzgsMHg0QiwweEE4LDB4M0UsMHgyMSwweDdGLDB4N0IsMHhCRiwweDUyLDB4RTd9KSB8fAorICAgICAgICAgICAgIWZmX2d1aWRjbXAoZywgKGNvbnN0IGZmX2FzZl9ndWlkKXsweDYzLDB4MzYsMHhFQiwweEZFLDB4QTEsMHg3RSwweEQ5LDB4MTEsMHg4MywweDA4LDB4MDAsMHgwNywweEU5LDB4NUUsMHhBRCwweDhEfSkgfHwKKyAgICAgICAgICAgICFmZl9ndWlkY21wKGcsIChjb25zdCBmZl9hc2ZfZ3VpZCl7MHg3MCwweEU5LDB4RjEsMHhGOCwweDg5LDB4QTQsMHg0QywweDRELDB4ODMsMHg3MywweEI4LDB4MTIsMHhFMCwweEQ1LDB4RjgsMHgxRX0pIHx8CisgICAgICAgICAgICAhZmZfZ3VpZGNtcChnLCBmZl9pbmRleF9ndWlkKSB8fAorICAgICAgICAgICAgIWZmX2d1aWRjbXAoZywgZmZfc3luY19ndWlkKSB8fAorICAgICAgICAgICAgIWZmX2d1aWRjbXAoZywgZmZfc3RyZWFtMV9ndWlkKSB8fAorICAgICAgICAgICAgIWZmX2d1aWRjbXAoZywgKGNvbnN0IGZmX2FzZl9ndWlkKXsweEY3LDB4MTAsMHgwMiwweEI5LDB4RUUsMHg3QywweEVELDB4NEUsMHhCRCwweDdGLDB4MDUsMHg0MCwweDM1LDB4ODYsMHgxOCwweEExfSkpIHsKKyAgICAgICAgICAgIC8vaWdub3JlIGtub3duIGd1aWRzCisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAidW5zdXBwb3J0ZWQgY2h1bms6IkZGX1BSSV9HVUlEIlxuIiwgRkZfQVJHX0dVSUQoZykpOworCisgICAgICAgIGF2aW9fc2tpcChwYiwgV1RWX1BBRDgobGVuKSAtIGNvbnN1bWVkKTsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1JfRU9GOworfQorCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBXdHZDb250ZXh0ICp3dHYgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJvb3Rfc2VjdG9yLCByb290X3NpemU7CisgICAgdWludDhfdCByb290W1dUVl9TRUNUT1JfU0laRV07CisgICAgQVZJT0NvbnRleHQgKnBiOworICAgIGludDY0X3QgdGltZWxpbmVfcG9zOworICAgIGludCByZXQ7CisKKyAgICB3dHYtPmVwb2NoICAgICAgICAgID0KKyAgICB3dHYtPnB0cyAgICAgICAgICAgID0KKyAgICB3dHYtPmxhc3RfdmFsaWRfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICAvKiByZWFkIHJvb3QgZGlyZWN0b3J5IHNlY3RvciAqLworICAgIGF2aW9fc2tpcChzLT5wYiwgMHgzMCk7CisgICAgcm9vdF9zaXplID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBpZiAocm9vdF9zaXplID4gc2l6ZW9mKHJvb3QpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJyb290IGRpcmVjdG9yeSBzaXplIGV4Y2VlZHMgc2VjdG9yIHNpemVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKKyAgICByb290X3NlY3RvciA9IGF2aW9fcmwzMihzLT5wYik7CisKKyAgICByZXQgPSBzZWVrX2J5X3NlY3RvcihzLT5wYiwgcm9vdF9zZWN0b3IsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJvb3Rfc2l6ZSA9IGF2aW9fcmVhZChzLT5wYiwgcm9vdCwgcm9vdF9zaXplKTsKKyAgICBpZiAocm9vdF9zaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiBwYXJzZSBjaHVua3MgdXAgdW50aWwgZmlyc3QgZGF0YSBjaHVuayAqLworICAgIHd0di0+cGIgPSB3dHZmaWxlX29wZW4ocywgcm9vdCwgcm9vdF9zaXplLCBmZl90aW1lbGluZV9sZTE2KTsKKyAgICBpZiAoIXd0di0+cGIpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInRpbWVsaW5lIGRhdGEgbWlzc2luZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldCA9IHBhcnNlX2NodW5rcyhzLCBTRUVLX1RPX0RBVEEsIDAsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGF2aW9fc2Vlayh3dHYtPnBiLCAtMzIsIFNFRUtfQ1VSKTsKKworICAgIHRpbWVsaW5lX3BvcyA9IGF2aW9fdGVsbChzLT5wYik7IC8vIHNhdmUgYmVmb3JlIG9wZW5pbmcgYW5vdGhlciBmaWxlCisKKyAgICAvKiByZWFkIG1ldGFkYXRhICovCisgICAgcGIgPSB3dHZmaWxlX29wZW4ocywgcm9vdCwgcm9vdF9zaXplLCBmZl90YWJsZV8wX2VudHJpZXNfbGVnYWN5X2F0dHJpYl9sZTE2KTsKKyAgICBpZiAocGIpIHsKKyAgICAgICAgcGFyc2VfbGVnYWN5X2F0dHJpYihzLCBwYik7CisgICAgICAgIHd0dmZpbGVfY2xvc2UocGIpOworICAgIH0KKworICAgIC8qIHJlYWQgc2VlayBpbmRleCAqLworICAgIGlmIChzLT5uYl9zdHJlYW1zKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgICAgIHBiID0gd3R2ZmlsZV9vcGVuKHMsIHJvb3QsIHJvb3Rfc2l6ZSwgZmZfdGFibGVfMF9lbnRyaWVzX3RpbWVfbGUxNik7CisgICAgICAgIGlmIChwYikgeworICAgICAgICAgICAgd2hpbGUoMSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IGF2aW9fcmw2NChwYik7CisgICAgICAgICAgICAgICAgdWludDY0X3QgZnJhbWVfbmIgID0gYXZpb19ybDY0KHBiKTsKKyAgICAgICAgICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZmZfYWRkX2luZGV4X2VudHJ5KCZ3dHYtPmluZGV4X2VudHJpZXMsICZ3dHYtPm5iX2luZGV4X2VudHJpZXMsICZ3dHYtPmluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHRpbWVzdGFtcCwgZnJhbWVfbmIsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3R2ZmlsZV9jbG9zZShwYik7CisKKyAgICAgICAgICAgIGlmICh3dHYtPm5iX2luZGV4X2VudHJpZXMpIHsKKyAgICAgICAgICAgICAgICBwYiA9IHd0dmZpbGVfb3BlbihzLCByb290LCByb290X3NpemUsIGZmX3RpbWVsaW5lX3RhYmxlXzBfZW50cmllc19FdmVudHNfbGUxNik7CisgICAgICAgICAgICAgICAgaWYgKHBiKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZnJhbWVfbmIgPSBhdmlvX3JsNjQocGIpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgcG9zaXRpb24gPSBhdmlvX3JsNjQocGIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSB3dHYtPm5iX2luZGV4X2VudHJpZXMgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSW5kZXhFbnRyeSAqZSA9IHd0di0+aW5kZXhfZW50cmllcyArIGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lX25iID4gZS0+c2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gZS0+cG9zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT5wb3MgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3dHZmaWxlX2Nsb3NlKHBiKTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmR1cmF0aW9uID0gd3R2LT5pbmRleF9lbnRyaWVzW3d0di0+bmJfaW5kZXhfZW50cmllcyAtIDFdLnRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdmlvX3NlZWsocy0+cGIsIHRpbWVsaW5lX3BvcywgU0VFS19TRVQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBXdHZDb250ZXh0ICp3dHYgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gd3R2LT5wYjsKKyAgICBpbnQgc3RyZWFtX2luZGV4LCBsZW4sIHJldDsKKworICAgIHN0cmVhbV9pbmRleCA9IHBhcnNlX2NodW5rcyhzLCBTRUVLX1RPX0RBVEEsIDAsICZsZW4pOworICAgIGlmIChzdHJlYW1faW5kZXggPCAwKQorICAgICAgICByZXR1cm4gc3RyZWFtX2luZGV4OworCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBsZW4gLSAzMik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdHJlYW1faW5kZXg7CisgICAgcGt0LT5wdHMgICAgICAgICAgPSB3dHYtPnB0czsKKyAgICBhdmlvX3NraXAocGIsIFdUVl9QQUQ4KGxlbikgLSBsZW4pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRzLCBpbnQgZmxhZ3MpCit7CisgICAgV3R2Q29udGV4dCAqd3R2ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHd0di0+cGI7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1swXTsKKyAgICBpbnQ2NF90IHRzX3JlbGF0aXZlOworICAgIGludCBpOworCisgICAgaWYgKChmbGFncyAmIEFWU0VFS19GTEFHX0ZSQU1FKSB8fCAoZmxhZ3MgJiBBVlNFRUtfRkxBR19CWVRFKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKworICAgIC8qIHRpbWVzdGFtcCBhZGp1c3RtZW50IGlzIHJlcXVpcmVkIGJlY2F1c2Ugd3R2LT5wdHMgdmFsdWVzIGFyZSBhYnNvbHV0ZSwKKyAgICAgKiB3aGVyZWFzIEFWSW5kZXhFbnRyeS0+dGltZXN0YW1wIHZhbHVlcyBhcmUgcmVsYXRpdmUgdG8gZXBvY2guICovCisgICAgdHNfcmVsYXRpdmUgPSB0czsKKyAgICBpZiAod3R2LT5lcG9jaCAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgdHNfcmVsYXRpdmUgLT0gd3R2LT5lcG9jaDsKKworICAgIGkgPSBmZl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHd0di0+aW5kZXhfZW50cmllcywgd3R2LT5uYl9pbmRleF9lbnRyaWVzLCB0c19yZWxhdGl2ZSwgZmxhZ3MpOworICAgIGlmIChpIDwgMCkgeworICAgICAgICBpZiAod3R2LT5sYXN0X3ZhbGlkX3B0cyA9PSBBVl9OT1BUU19WQUxVRSB8fCB0cyA8IHd0di0+bGFzdF92YWxpZF9wdHMpIHsKKyAgICAgICAgICAgIGlmIChhdmlvX3NlZWsocGIsIDAsIFNFRUtfU0VUKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKHN0LT5kdXJhdGlvbiAhPSBBVl9OT1BUU19WQUxVRSAmJiB0c19yZWxhdGl2ZSA+IHN0LT5kdXJhdGlvbiAmJiB3dHYtPm5iX2luZGV4X2VudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChhdmlvX3NlZWsocGIsIHd0di0+aW5kZXhfZW50cmllc1t3dHYtPm5iX2luZGV4X2VudHJpZXMgLSAxXS5wb3MsIFNFRUtfU0VUKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJzZV9jaHVua3MocywgU0VFS19UT19QVFMsIHRzLCAwKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFUkFOR0UpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGF2aW9fc2VlayhwYiwgd3R2LT5pbmRleF9lbnRyaWVzW2ldLnBvcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHd0di0+cHRzID0gd3R2LT5pbmRleF9lbnRyaWVzW2ldLnRpbWVzdGFtcDsKKyAgICBpZiAod3R2LT5lcG9jaCAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgd3R2LT5wdHMgKz0gd3R2LT5lcG9jaDsKKyAgICB3dHYtPmxhc3RfdmFsaWRfcHRzID0gd3R2LT5wdHM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgV3R2Q29udGV4dCAqd3R2ID0gcy0+cHJpdl9kYXRhOworICAgIGF2X2ZyZWVwKCZ3dHYtPmluZGV4X2VudHJpZXMpOworICAgIHd0dmZpbGVfY2xvc2Uod3R2LT5wYik7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfd3R2X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInd0diIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldpbmRvd3MgVGVsZXZpc2lvbiAoV1RWKSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihXdHZDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSByZWFkX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHJlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IHJlYWRfc2VlaywKKyAgICAucmVhZF9jbG9zZSAgICAgPSByZWFkX2Nsb3NlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX1NIT1dfSURTLAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC93dHZlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93dHZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzQ1NDVkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3d0dmVuYy5jCkBAIC0wLDAgKzEsODQ1IEBACisvKgorICogV2luZG93cyBUZWxldmlzaW9uIChXVFYpIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgWmhlbnRhbiBGZW5nIDxzcHlmZW5nIGF0IGdtYWlsIGRvdCBjb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGV0ZXIgUm9zcyA8cHJvc3NAeHZpZC5vcmc+CisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogV2luZG93cyBUZWxldmlzaW9uIChXVFYpIGRlbXV4ZXIKKyAqIEBhdXRob3IgWmhlbnRhbiBGZW5nIDxzcHlmZW5nIGF0IGdtYWlsIGRvdCBjb20+CisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1wZWd0cy5oIgorI2luY2x1ZGUgInd0di5oIgorCisjZGVmaW5lIFdUVl9CSUdTRUNUT1JfU0laRSAoMSA8PCBXVFZfQklHU0VDVE9SX0JJVFMpCisjZGVmaW5lIElOREVYX0JBU0UgMHgyCisjZGVmaW5lIE1BWF9OQl9JTkRFWCAxMAorCisvKiBkZWNsYXJlIHV0ZjE2bGUgc3RyaW5ncyAqLworI2RlZmluZSBfICwgMCwKK3N0YXRpYyBjb25zdCB1aW50OF90IHRpbWVsaW5lX3RhYmxlXzBfaGVhZGVyX2V2ZW50c1tdID0KKyAgICB7J3QnXydpJ18nbSdfJ2UnXydsJ18naSdfJ24nXydlJ18nLidfJ3QnXydhJ18nYidfJ2wnXydlJ18nLidfJzAnXycuJ18naCdfJ2UnXydhJ18nZCdfJ2UnXydyJ18nLidfJ0UnXyd2J18nZSdfJ24nXyd0J18ncycsIDB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFibGVfMF9oZWFkZXJfbGVnYWN5X2F0dHJpYltdID0KKyAgICB7J3QnXydhJ18nYidfJ2wnXydlJ18nLidfJzAnXycuJ18naCdfJ2UnXydhJ18nZCdfJ2UnXydyJ18nLidfJ2wnXydlJ18nZydfJ2EnXydjJ18neSdfJ18nXydhJ18ndCdfJ3QnXydyJ18naSdfJ2InLCAwfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlXzBfcmVkaXJlY3Rvcl9sZWdhY3lfYXR0cmliW10gPQorICAgIHsndCdfJ2EnXydiJ18nbCdfJ2UnXycuJ18nMCdfJy4nXydyJ18nZSdfJ2QnXydpJ18ncidfJ2UnXydjJ18ndCdfJ28nXydyJ18nLidfJ2wnXydlJ18nZydfJ2EnXydjJ18neSdfJ18nXydhJ18ndCdfJ3QnXydyJ18naSdfJ2InLCAwfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlXzBfaGVhZGVyX3RpbWVbXSA9CisgICAgeyd0J18nYSdfJ2InXydsJ18nZSdfJy4nXycwJ18nLidfJ2gnXydlJ18nYSdfJ2QnXydlJ18ncidfJy4nXyd0J18naSdfJ20nXydlJywgMH07CitzdGF0aWMgY29uc3QgdWludDhfdCBsZWdhY3lfYXR0cmliW10gPQorICAgIHsnbCdfJ2UnXydnJ18nYSdfJ2MnXyd5J18nXydfJ2EnXyd0J18ndCdfJ3InXydpJ18nYicsIDB9OworI3VuZGVmIF8KKworc3RhdGljIGNvbnN0IGZmX2FzZl9ndWlkIHN1Yl93dHZfZ3VpZCA9CisgICAgezB4OEMsMHhDMywweEQyLDB4QzIsMHg3RSwweDlBLDB4REEsMHgxMSwweDhCLDB4RjcsMHgwMCwweDA3LDB4RTksMHg1RSwweEFELDB4OER9OworCitlbnVtIFd0dkZpbGVJbmRleCB7CisgICAgV1RWX1RJTUVMSU5FX1RBQkxFXzBfSEVBREVSX0VWRU5UUyA9IDAsCisgICAgV1RWX1RJTUVMSU5FX1RBQkxFXzBfRU5UUklFU19FVkVOVFMsCisgICAgV1RWX1RJTUVMSU5FLAorICAgIFdUVl9UQUJMRV8wX0hFQURFUl9MRUdBQ1lfQVRUUklCLAorICAgIFdUVl9UQUJMRV8wX0VOVFJJRVNfTEVHQUNZX0FUVFJJQiwKKyAgICBXVFZfVEFCTEVfMF9SRURJUkVDVE9SX0xFR0FDWV9BVFRSSUIsCisgICAgV1RWX1RBQkxFXzBfSEVBREVSX1RJTUUsCisgICAgV1RWX1RBQkxFXzBfRU5UUklFU19USU1FLAorICAgIFdUVl9GSUxFUworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDY0X3QgbGVuZ3RoOworICAgIGNvbnN0IHZvaWQgKmhlYWRlcjsKKyAgICBpbnQgZGVwdGg7CisgICAgaW50IGZpcnN0X3NlY3RvcjsKK30gV3R2RmlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDY0X3QgICAgICAgICAgICAgcG9zOworICAgIGludDY0X3QgICAgICAgICAgICAgc2VyaWFsOworICAgIGNvbnN0IGZmX2FzZl9ndWlkICogZ3VpZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0cmVhbV9pZDsKK30gV3R2Q2h1bmtFbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDY0X3Qgc2VyaWFsOworICAgIGludDY0X3QgdmFsdWU7Cit9IFd0dlN5bmNFbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDY0X3QgdGltZWxpbmVfc3RhcnRfcG9zOworICAgIFd0dkZpbGUgZmlsZVtXVFZfRklMRVNdOworICAgIGludDY0X3Qgc2VyaWFsOyAgICAgICAgIC8qKjwgY2h1bmsgc2VyaWFsIG51bWJlciAqLworICAgIGludDY0X3QgbGFzdF9jaHVua19wb3M7IC8qKjwgbGFzdCBjaHVuayBwb3NpdGlvbiAqLworICAgIGludDY0X3QgbGFzdF90aW1lc3RhbXBfcG9zOyAvKio8IGxhc3QgdGltZXN0YW1wIGNodW5rIHBvc2l0aW9uICovCisgICAgaW50NjRfdCBmaXJzdF9pbmRleF9wb3M7ICAgIC8qKjwgZmlyc3QgaW5kZXhfY2h1bmsgcG9zaXRpb24gKi8KKworICAgIFd0dkNodW5rRW50cnkgaW5kZXhbTUFYX05CX0lOREVYXTsKKyAgICBpbnQgbmJfaW5kZXg7CisgICAgaW50IGZpcnN0X3ZpZGVvX2ZsYWc7CisKKyAgICBXdHZTeW5jRW50cnkgKnN0X3BhaXJzOyAvKiAoc2VyaWFsLCB0aW1lc3RhbXApIHBhaXJzICovCisgICAgaW50IG5iX3N0X3BhaXJzOworICAgIFd0dlN5bmNFbnRyeSAqc3BfcGFpcnM7IC8qIChzZXJpYWwsIHBvc2l0aW9uKSBwYWlycyAqLworICAgIGludCBuYl9zcF9wYWlyczsKKworICAgIGludDY0X3QgbGFzdF9wdHM7CisgICAgaW50NjRfdCBsYXN0X3NlcmlhbDsKKworICAgIEFWUGFja2V0IHRodW1ibmFpbDsKK30gV3R2Q29udGV4dDsKKworCitzdGF0aWMgdm9pZCBhZGRfc2VyaWFsX3BhaXIoV3R2U3luY0VudHJ5ICoqIGxpc3QsIGludCAqIGNvdW50LCBpbnQ2NF90IHNlcmlhbCwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICBpbnQgbmV3X2NvdW50ID0gKmNvdW50ICsgMTsKKyAgICBXdHZTeW5jRW50cnkgKm5ld19saXN0ID0gYXZfcmVhbGxvYygqbGlzdCwgbmV3X2NvdW50ICogc2l6ZW9mKFd0dlN5bmNFbnRyeSkpOworICAgIGlmICghbmV3X2xpc3QpCisgICAgICAgIHJldHVybjsKKyAgICBuZXdfbGlzdFsqY291bnRdID0gKFd0dlN5bmNFbnRyeSl7c2VyaWFsLCB2YWx1ZX07CisgICAgKmxpc3QgID0gbmV3X2xpc3Q7CisgICAgKmNvdW50ID0gbmV3X2NvdW50OworfQorCit0eXBlZGVmIGludCBXVFZIZWFkZXJXcml0ZUZ1bmMoQVZJT0NvbnRleHQgKnBiKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IHVpbnQ4X3QgKmhlYWRlcjsKKyAgICBpbnQgaGVhZGVyX3NpemU7CisgICAgV1RWSGVhZGVyV3JpdGVGdW5jICp3cml0ZV9oZWFkZXI7Cit9IFdUVlJvb3RFbnRyeVRhYmxlOworCisjZGVmaW5lIHdyaXRlX3BhZChwYiwgc2l6ZSkgZmZpb19maWxsKHBiLCAwLCBzaXplKQorCisvKioKKyAqIFdyaXRlIGNodW5rIGhlYWRlci4gSWYgaGVhZGVyIGNodW5rICgweDgwMDAwMDAwIHNldCkgdGhlbiBhZGQgdG8gbGlzdCBvZiBoZWFkZXIgY2h1bmtzCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX2NodW5rX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGZmX2FzZl9ndWlkICpndWlkLCBpbnQgbGVuZ3RoLCBpbnQgc3RyZWFtX2lkKQoreworICAgIFd0dkNvbnRleHQgKndjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICB3Y3R4LT5sYXN0X2NodW5rX3BvcyA9IGF2aW9fdGVsbChwYikgLSB3Y3R4LT50aW1lbGluZV9zdGFydF9wb3M7CisgICAgZmZfcHV0X2d1aWQocGIsIGd1aWQpOworICAgIGF2aW9fd2wzMihwYiwgMzIgKyBsZW5ndGgpOworICAgIGF2aW9fd2wzMihwYiwgc3RyZWFtX2lkKTsKKyAgICBhdmlvX3dsNjQocGIsIHdjdHgtPnNlcmlhbCk7CisKKyAgICBpZiAoKHN0cmVhbV9pZCAmIDB4ODAwMDAwMDApICYmIGd1aWQgIT0gJmZmX2luZGV4X2d1aWQpIHsKKyAgICAgICAgV3R2Q2h1bmtFbnRyeSAqdCA9IHdjdHgtPmluZGV4ICsgd2N0eC0+bmJfaW5kZXg7CisgICAgICAgIGF2X2Fzc2VydDAod2N0eC0+bmJfaW5kZXggPCBNQVhfTkJfSU5ERVgpOworICAgICAgICB0LT5wb3MgICAgICAgPSB3Y3R4LT5sYXN0X2NodW5rX3BvczsKKyAgICAgICAgdC0+c2VyaWFsICAgID0gd2N0eC0+c2VyaWFsOworICAgICAgICB0LT5ndWlkICAgICAgPSBndWlkOworICAgICAgICB0LT5zdHJlYW1faWQgPSBzdHJlYW1faWQgJiAweDNGRkZGRkZGOworICAgICAgICB3Y3R4LT5uYl9pbmRleCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgd3JpdGVfY2h1bmtfaGVhZGVyMihBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGZmX2FzZl9ndWlkICpndWlkLCBpbnQgc3RyZWFtX2lkKQoreworICAgIFd0dkNvbnRleHQgKndjdHggPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICBpbnQ2NF90IGxhc3RfY2h1bmtfcG9zID0gd2N0eC0+bGFzdF9jaHVua19wb3M7CisgICAgd3JpdGVfY2h1bmtfaGVhZGVyKHMsIGd1aWQsIDAsIHN0cmVhbV9pZCk7IC8vIGxlbmd0aCB1cGRhdGVkIGxhdGVyCisgICAgYXZpb193bDY0KHBiLCBsYXN0X2NodW5rX3Bvcyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9jaHVua19ub2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBXdHZDb250ZXh0ICp3Y3R4ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworCisgICAgLy8gdXBkYXRlIHRoZSBjaHVua19sZW4gZmllbGQgYW5kIHBhZC4KKyAgICBpbnQ2NF90IGNodW5rX2xlbiA9IGF2aW9fdGVsbChwYikgLSAod2N0eC0+bGFzdF9jaHVua19wb3MgKyB3Y3R4LT50aW1lbGluZV9zdGFydF9wb3MpOworICAgIGF2aW9fc2VlayhwYiwgLShjaHVua19sZW4gLSAxNiksIFNFRUtfQ1VSKTsKKyAgICBhdmlvX3dsMzIocGIsIGNodW5rX2xlbik7CisgICAgYXZpb19zZWVrKHBiLCBjaHVua19sZW4gLSAoMTYgKyA0KSwgU0VFS19DVVIpOworCisgICAgd3JpdGVfcGFkKHBiLCBXVFZfUEFEOChjaHVua19sZW4pIC0gY2h1bmtfbGVuKTsKKyAgICB3Y3R4LT5zZXJpYWwrKzsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfaW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFd0dkNvbnRleHQgKndjdHggPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICB3cml0ZV9jaHVua19oZWFkZXIyKHMsICZmZl9pbmRleF9ndWlkLCAweDgwMDAwMDAwKTsKKyAgICBhdmlvX3dsMzIocGIsIDApOworICAgIGF2aW9fd2wzMihwYiwgMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2N0eC0+bmJfaW5kZXg7IGkrKykgeworICAgICAgICBXdHZDaHVua0VudHJ5ICp0ID0gd2N0eC0+aW5kZXggKyBpOworICAgICAgICBmZl9wdXRfZ3VpZChwYiwgIHQtPmd1aWQpOworICAgICAgICBhdmlvX3dsNjQocGIsIHQtPnBvcyk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgdC0+c3RyZWFtX2lkKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgLy8gY2hlY2tzdW0/CisgICAgICAgIGF2aW9fd2w2NChwYiwgdC0+c2VyaWFsKTsKKyAgICB9CisgICAgd2N0eC0+bmJfaW5kZXggPSAwOyAgIC8vIHJlc2V0IGluZGV4CisgICAgZmluaXNoX2NodW5rX25vaW5kZXgocyk7CisKKyAgICBpZiAoIXdjdHgtPmZpcnN0X2luZGV4X3BvcykKKyAgICAgICAgd2N0eC0+Zmlyc3RfaW5kZXhfcG9zID0gd2N0eC0+bGFzdF9jaHVua19wb3M7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9jaHVuayhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgV3R2Q29udGV4dCAqd2N0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBmaW5pc2hfY2h1bmtfbm9pbmRleChzKTsKKyAgICBpZiAod2N0eC0+bmJfaW5kZXggPT0gTUFYX05CX0lOREVYKQorICAgICAgICB3cml0ZV9pbmRleChzKTsKK30KKworc3RhdGljIHZvaWQgcHV0X3ZpZGVvaW5mb2hlYWRlcjIoQVZJT0NvbnRleHQgKnBiLCBBVlN0cmVhbSAqc3QpCit7CisgICAgQVZSYXRpb25hbCBkYXIgPSBhdl9tdWxfcShzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbywgKEFWUmF0aW9uYWwpe3N0LT5jb2RlYy0+d2lkdGgsIHN0LT5jb2RlYy0+aGVpZ2h0fSk7CisgICAgdW5zaWduZWQgaW50IG51bSwgZGVuOworICAgIGF2X3JlZHVjZSgmbnVtLCAmZGVuLCBkYXIubnVtLCBkYXIuZGVuLCAweEZGRkZGRkZGKTsKKworICAgIC8qIFZJREVPSU5GT0hFQURFUjIgKi8KKyAgICBhdmlvX3dsMzIocGIsIDApOworICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgYXZpb193bDMyKHBiLCBzdC0+Y29kZWMtPndpZHRoKTsKKyAgICBhdmlvX3dsMzIocGIsIHN0LT5jb2RlYy0+aGVpZ2h0KTsKKworICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgYXZpb193bDMyKHBiLCAwKTsKKyAgICBhdmlvX3dsMzIocGIsIDApOworICAgIGF2aW9fd2wzMihwYiwgMCk7CisKKyAgICBhdmlvX3dsMzIocGIsIHN0LT5jb2RlYy0+Yml0X3JhdGUpOworICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgYXZpb193bDY0KHBiLCBzdC0+YXZnX2ZyYW1lX3JhdGUubnVtICYmIHN0LT5hdmdfZnJhbWVfcmF0ZS5kZW4gPyBJTlQ2NF9DKDEwMDAwMDAwKSAvIGF2X3EyZChzdC0+YXZnX2ZyYW1lX3JhdGUpIDogMCk7CisgICAgYXZpb193bDMyKHBiLCAwKTsKKyAgICBhdmlvX3dsMzIocGIsIDApOworCisgICAgYXZpb193bDMyKHBiLCBudW0pOworICAgIGF2aW9fd2wzMihwYiwgZGVuKTsKKyAgICBhdmlvX3dsMzIocGIsIDApOworICAgIGF2aW9fd2wzMihwYiwgMCk7CisKKyAgICBmZl9wdXRfYm1wX2hlYWRlcihwYiwgc3QtPmNvZGVjLCBmZl9jb2RlY19ibXBfdGFncywgMCwgMSk7CisKKyAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CisgICAgICAgIGludCBwYWRkaW5nID0gKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgJiAzKSA/IDQgLSAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAmIDMpIDogMDsKKyAgICAgICAgLyogTVBFRzJWSURFT0lORk8gKi8KKyAgICAgICAgYXZpb193bDMyKHBiLCAwKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICsgcGFkZGluZyk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgLTEpOworICAgICAgICBhdmlvX3dsMzIocGIsIC0xKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCAwKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBmZmlvX2ZpbGwocGIsIDAsIHBhZGRpbmcpOworICAgIH0KK30KKworc3RhdGljIGludCB3cml0ZV9zdHJlYW1fY29kZWNfaW5mbyhBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCkKK3sKKyAgICBjb25zdCBmZl9hc2ZfZ3VpZCAqZywgKm1lZGlhX3R5cGUsICpmb3JtYXRfdHlwZTsKKyAgICBjb25zdCBBVkNvZGVjVGFnICp0YWdzOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludDY0X3QgIGhkcl9wb3Nfc3RhcnQ7CisgICAgaW50IGhkcl9zaXplID0gMDsKKworICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBnID0gZ2V0X2NvZGVjX2d1aWQoc3QtPmNvZGVjLT5jb2RlY19pZCwgZmZfdmlkZW9fZ3VpZHMpOworICAgICAgICBtZWRpYV90eXBlID0gJmZmX21lZGlhdHlwZV92aWRlbzsKKyAgICAgICAgZm9ybWF0X3R5cGUgPSBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gPyAmZmZfZm9ybWF0X21wZWcyX3ZpZGVvIDogJmZmX2Zvcm1hdF92aWRlb2luZm8yOworICAgICAgICB0YWdzID0gZmZfY29kZWNfYm1wX3RhZ3M7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGcgPSBnZXRfY29kZWNfZ3VpZChzdC0+Y29kZWMtPmNvZGVjX2lkLCBmZl9jb2RlY193YXZfZ3VpZHMpOworICAgICAgICBtZWRpYV90eXBlID0gJmZmX21lZGlhdHlwZV9hdWRpbzsKKyAgICAgICAgZm9ybWF0X3R5cGUgPSAmZmZfZm9ybWF0X3dhdmVmb3JtYXRleDsKKyAgICAgICAgdGFncyA9IGZmX2NvZGVjX3dhdl90YWdzOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIGNvZGVjX3R5cGUgKDB4JXgpXG4iLCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZmZfcHV0X2d1aWQocGIsIG1lZGlhX3R5cGUpOyAvLyBtZWRpYXR5cGUKKyAgICBmZl9wdXRfZ3VpZChwYiwgJmZmX21lZGlhc3VidHlwZV9jcGZpbHRlcnNfcHJvY2Vzc2VkKTsgLy8gc3VidHlwZQorICAgIHdyaXRlX3BhZChwYiwgMTIpOworICAgIGZmX3B1dF9ndWlkKHBiLCZmZl9mb3JtYXRfY3BmaWx0ZXJzX3Byb2Nlc3NlZCk7IC8vIGZvcm1hdCB0eXBlCisgICAgYXZpb193bDMyKHBiLCAwKTsgLy8gc2l6ZQorCisgICAgaGRyX3Bvc19zdGFydCA9IGF2aW9fdGVsbChwYik7CisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgcHV0X3ZpZGVvaW5mb2hlYWRlcjIocGIsIHN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZmZfcHV0X3dhdl9oZWFkZXIocGIsIHN0LT5jb2RlYywgMCkgPCAwKQorICAgICAgICAgICAgZm9ybWF0X3R5cGUgPSAmZmZfZm9ybWF0X25vbmU7CisgICAgfQorICAgIGhkcl9zaXplID0gYXZpb190ZWxsKHBiKSAtIGhkcl9wb3Nfc3RhcnQ7CisKKyAgICAvLyBzZWVrIGJhY2sgd3JpdGUgaGRyX3NpemUKKyAgICBhdmlvX3NlZWsocGIsIC0oaGRyX3NpemUgKyA0KSwgU0VFS19DVVIpOworICAgIGF2aW9fd2wzMihwYiwgaGRyX3NpemUgKyAzMik7CisgICAgYXZpb19zZWVrKHBiLCBoZHJfc2l6ZSwgU0VFS19DVVIpOworICAgIGlmIChnKSB7CisgICAgICAgIGZmX3B1dF9ndWlkKHBiLCBnKTsgICAgICAgICAgIC8vIGFjdHVhbF9zdWJ0eXBlCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHRhZyA9IGZmX2NvZGVjX2dldF90YWcodGFncywgc3QtPmNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgIGlmICghdGFnKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgY29kZWNfaWQgKDB4JXgpXG4iLCBzdC0+Y29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBhdmlvX3dsMzIocGIsIHRhZyk7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIChjb25zdCB1aW50OF90W10pe0ZGX01FRElBU1VCVFlQRV9CQVNFX0dVSUR9LCAxMik7CisgICAgfQorICAgIGZmX3B1dF9ndWlkKHBiLCBmb3JtYXRfdHlwZSk7IC8vIGFjdHVhbF9mb3JtYXR0eXBlCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9zdHJlYW1fY29kZWMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqIHN0KQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGludCByZXQ7CisgICAgd3JpdGVfY2h1bmtfaGVhZGVyMihzLCAmZmZfc3RyZWFtMV9ndWlkLCAweDgwMDAwMDAwIHwgMHgwMSk7CisKKyAgICBhdmlvX3dsMzIocGIsICAweDAxKTsKKyAgICB3cml0ZV9wYWQocGIsIDQpOworICAgIHdyaXRlX3BhZChwYiwgNCk7CisKKyAgICByZXQgPSB3cml0ZV9zdHJlYW1fY29kZWNfaW5mbyhzLCBzdCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIndyaXRlIHN0cmVhbSBjb2RlYyBpbmZvIGZhaWxlZCBjb2RlY190eXBlKDB4JXgpXG4iLCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZmluaXNoX2NodW5rKHMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9zeW5jKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBXdHZDb250ZXh0ICp3Y3R4ID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgbGFzdF9jaHVua19wb3MgPSB3Y3R4LT5sYXN0X2NodW5rX3BvczsKKworICAgIHdyaXRlX2NodW5rX2hlYWRlcihzLCAmZmZfc3luY19ndWlkLCAweDE4LCAwKTsKKyAgICBhdmlvX3dsNjQocGIsIHdjdHgtPmZpcnN0X2luZGV4X3Bvcyk7CisgICAgYXZpb193bDY0KHBiLCB3Y3R4LT5sYXN0X3RpbWVzdGFtcF9wb3MpOworICAgIGF2aW9fd2w2NChwYiwgMCk7CisKKyAgICBmaW5pc2hfY2h1bmsocyk7CisgICAgYWRkX3NlcmlhbF9wYWlyKCZ3Y3R4LT5zcF9wYWlycywgJndjdHgtPm5iX3NwX3BhaXJzLCB3Y3R4LT5zZXJpYWwsIHdjdHgtPmxhc3RfY2h1bmtfcG9zKTsKKworICAgIHdjdHgtPmxhc3RfY2h1bmtfcG9zID0gbGFzdF9jaHVua19wb3M7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfc3RyZWFtX2RhdGEoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHJldDsKKworICAgIHdyaXRlX2NodW5rX2hlYWRlcjIocywgJmZmX1NCRTJfU1RSRUFNX0RFU0NfRVZFTlQsIDB4ODAwMDAwMDAgfCAoc3QtPmluZGV4ICsgSU5ERVhfQkFTRSkpOworICAgIGF2aW9fd2wzMihwYiwgMHgwMDAwMDAwMSk7CisgICAgYXZpb193bDMyKHBiLCBzdC0+aW5kZXggKyBJTkRFWF9CQVNFKTsgLy9zdHJlYW1faWQKKyAgICBhdmlvX3dsMzIocGIsIDB4MDAwMDAwMDEpOworICAgIHdyaXRlX3BhZChwYiwgOCk7CisKKyAgICByZXQgPSB3cml0ZV9zdHJlYW1fY29kZWNfaW5mbyhzLCBzdCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIndyaXRlIHN0cmVhbSBjb2RlYyBpbmZvIGZhaWxlZCBjb2RlY190eXBlKDB4JXgpXG4iLCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpbmlzaF9jaHVuayhzKTsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFd0dkNvbnRleHQgKndjdHggPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGksIHBhZCwgcmV0OworICAgIEFWU3RyZWFtICpzdDsKKworICAgIHdjdHgtPmxhc3RfY2h1bmtfcG9zICAgICA9IC0xOworICAgIHdjdHgtPmxhc3RfdGltZXN0YW1wX3BvcyA9IC0xOworCisgICAgZmZfcHV0X2d1aWQocGIsICZmZl93dHZfZ3VpZCk7CisgICAgZmZfcHV0X2d1aWQocGIsICZzdWJfd3R2X2d1aWQpOworCisgICAgYXZpb193bDMyKHBiLCAweDAxKTsKKyAgICBhdmlvX3dsMzIocGIsIDB4MDIpOworICAgIGF2aW9fd2wzMihwYiwgMSA8PCBXVFZfU0VDVE9SX0JJVFMpOworICAgIGF2aW9fd2wzMihwYiwgMSA8PCBXVFZfQklHU0VDVE9SX0JJVFMpOworCisgICAgLy93cml0ZSBpbml0aWFsIHJvb3QgZmllbGRzCisgICAgYXZpb193bDMyKHBiLCAwKTsgLy8gcm9vdF9zaXplLCB1cGRhdGUgbGF0ZXIKKyAgICB3cml0ZV9wYWQocGIsIDQpOworICAgIGF2aW9fd2wzMihwYiwgMCk7IC8vIHJvb3Rfc2VjdG9yLCB1cGRhdGUgaXQgbGF0ZXIuCisKKyAgICB3cml0ZV9wYWQocGIsIDMyKTsKKyAgICBhdmlvX3dsMzIocGIsIDApOyAvLyBmaWxlIGVuZHMgcG9pbnRlciwgdXBkYXRlIGl0IGxhdGVyLgorCisgICAgcGFkID0gKDEgPDwgV1RWX1NFQ1RPUl9CSVRTKSAtIGF2aW9fdGVsbChwYik7CisgICAgd3JpdGVfcGFkKHBiLCBwYWQpOworCisgICAgd2N0eC0+dGltZWxpbmVfc3RhcnRfcG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgIHdjdHgtPnNlcmlhbCA9IDE7CisgICAgd2N0eC0+bGFzdF9jaHVua19wb3MgPSAtMTsKKyAgICB3Y3R4LT5maXJzdF92aWRlb19mbGFnID0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICByZXQgPSB3cml0ZV9zdHJlYW1fY29kZWMocywgc3QpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIndyaXRlIHN0cmVhbSBjb2RlYyBmYWlsZWQgY29kZWNfdHlwZSgweCV4KVxuIiwgc3QtPmNvZGVjLT5jb2RlY190eXBlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWkpCisgICAgICAgICAgICB3cml0ZV9zeW5jKHMpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICByZXQgID0gd3JpdGVfc3RyZWFtX2RhdGEocywgc3QpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIndyaXRlIHN0cmVhbSBkYXRhIGZhaWxlZCBjb2RlY190eXBlKDB4JXgpXG4iLCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHdjdHgtPm5iX2luZGV4KQorICAgICAgICB3cml0ZV9pbmRleChzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV90aW1lc3RhbXAoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFd0dkNvbnRleHQgICp3Y3R4ID0gcy0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+Y29kZWM7CisKKyAgICB3cml0ZV9jaHVua19oZWFkZXIocywgJmZmX3RpbWVzdGFtcF9ndWlkLCA1NiwgMHg0MDAwMDAwMCB8IChJTkRFWF9CQVNFICsgcGt0LT5zdHJlYW1faW5kZXgpKTsKKyAgICB3cml0ZV9wYWQocGIsIDgpOworICAgIGF2aW9fd2w2NChwYiwgcGt0LT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgPyAtMSA6IHBrdC0+cHRzKTsKKyAgICBhdmlvX3dsNjQocGIsIHBrdC0+cHRzID09IEFWX05PUFRTX1ZBTFVFID8gLTEgOiBwa3QtPnB0cyk7CisgICAgYXZpb193bDY0KHBiLCBwa3QtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSA/IC0xIDogcGt0LT5wdHMpOworICAgIGF2aW9fd2w2NChwYiwgMCk7CisgICAgYXZpb193bDY0KHBiLCBlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIChwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSA/IDEgOiAwKTsKKyAgICBhdmlvX3dsNjQocGIsIDApOworCisgICAgd2N0eC0+bGFzdF90aW1lc3RhbXBfcG9zID0gd2N0eC0+bGFzdF9jaHVua19wb3M7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBXdHZDb250ZXh0ICAqd2N0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAgICAqc3QgICA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworCisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUpQRUcgJiYgIXdjdHgtPnRodW1ibmFpbC5zaXplKSB7CisgICAgICAgIGF2X2NvcHlfcGFja2V0KCZ3Y3R4LT50aHVtYm5haWwsIHBrdCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgICAgIGludCByZXQgPSBmZl9jaGVja19oMjY0X3N0YXJ0Y29kZShzLCBzdCwgcGt0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIGVtaXQgc3luYyBjaHVuayBhbmQgJ3RpbWVsaW5lLnRhYmxlLjAuZW50cmllcy5FdmVudCcgcmVjb3JkIGV2ZXJ5IDUwIGZyYW1lcyAqLworICAgIGlmICh3Y3R4LT5zZXJpYWwgLSAod2N0eC0+bmJfc3BfcGFpcnMgPyB3Y3R4LT5zcF9wYWlyc1t3Y3R4LT5uYl9zcF9wYWlycyAtIDFdLnNlcmlhbCA6IDApID49IDUwKQorICAgICAgICB3cml0ZV9zeW5jKHMpOworCisgICAgLyogZW1pdCAndGFibGUuMC5lbnRyaWVzLnRpbWUnIHJlY29yZCBldmVyeSA1MDBtcyAqLworICAgIGlmIChwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBwa3QtPnB0cyAtICh3Y3R4LT5uYl9zdF9wYWlycyA/IHdjdHgtPnN0X3BhaXJzW3djdHgtPm5iX3N0X3BhaXJzIC0gMV0udmFsdWUgOiAwKSA+PSA1MDAwMDAwKQorICAgICAgICBhZGRfc2VyaWFsX3BhaXIoJndjdHgtPnN0X3BhaXJzLCAmd2N0eC0+bmJfc3RfcGFpcnMsIHdjdHgtPnNlcmlhbCwgcGt0LT5wdHMpOworCisgICAgaWYgKHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIHBrdC0+cHRzID4gd2N0eC0+bGFzdF9wdHMpIHsKKyAgICAgICAgd2N0eC0+bGFzdF9wdHMgPSBwa3QtPnB0czsKKyAgICAgICAgd2N0eC0+bGFzdF9zZXJpYWwgPSB3Y3R4LT5zZXJpYWw7CisgICAgfQorCisgICAgLy8gd3JpdGUgdGltZXN0YW1wIGNodW5rCisgICAgd3JpdGVfdGltZXN0YW1wKHMsIHBrdCk7CisKKyAgICB3cml0ZV9jaHVua19oZWFkZXIocywgJmZmX2RhdGFfZ3VpZCwgcGt0LT5zaXplLCBJTkRFWF9CQVNFICsgcGt0LT5zdHJlYW1faW5kZXgpOworICAgIGF2aW9fd3JpdGUocGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICB3cml0ZV9wYWQocGIsIFdUVl9QQUQ4KHBrdC0+c2l6ZSkgLSBwa3QtPnNpemUpOworCisgICAgd2N0eC0+c2VyaWFsKys7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfdGFibGUwX2hlYWRlcl9ldmVudHMoQVZJT0NvbnRleHQgKnBiKQoreworICAgIGF2aW9fd2wzMihwYiwgMHgxMCk7CisgICAgd3JpdGVfcGFkKHBiLCA4NCk7CisgICAgYXZpb193bDY0KHBiLCAweDMyKTsKKyAgICByZXR1cm4gOTY7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfdGFibGUwX2hlYWRlcl9sZWdhY3lfYXR0cmliKEFWSU9Db250ZXh0ICpwYikKK3sKKyAgICBpbnQgcGFkID0gMDsKKyAgICBhdmlvX3dsMzIocGIsIDB4RkZGRkZGRkYpOworICAgIHdyaXRlX3BhZChwYiwgMTIpOworICAgIGF2aW9fd3JpdGUocGIsIGxlZ2FjeV9hdHRyaWIsIHNpemVvZihsZWdhY3lfYXR0cmliKSk7CisgICAgcGFkID0gV1RWX1BBRDgoc2l6ZW9mKGxlZ2FjeV9hdHRyaWIpKSAtIHNpemVvZihsZWdhY3lfYXR0cmliKTsKKyAgICB3cml0ZV9wYWQocGIsIHBhZCk7CisgICAgd3JpdGVfcGFkKHBiLCAzMik7CisgICAgcmV0dXJuIDQ4ICsgV1RWX1BBRDgoc2l6ZW9mKGxlZ2FjeV9hdHRyaWIpKTsKK30KKworc3RhdGljIGludCB3cml0ZV90YWJsZTBfaGVhZGVyX3RpbWUoQVZJT0NvbnRleHQgKnBiKQoreworICAgIGF2aW9fd2wzMihwYiwgMHgxMCk7CisgICAgd3JpdGVfcGFkKHBiLCA3Nik7CisgICAgYXZpb193bDY0KHBiLCAweDQwKTsKKyAgICByZXR1cm4gODg7Cit9CisKK3N0YXRpYyBjb25zdCBXVFZSb290RW50cnlUYWJsZSB3dHZfcm9vdF9lbnRyeV90YWJsZVtdID0geworICAgIHsgdGltZWxpbmVfdGFibGVfMF9oZWFkZXJfZXZlbnRzLCAgICAgICAgICBzaXplb2YodGltZWxpbmVfdGFibGVfMF9oZWFkZXJfZXZlbnRzKSwgICAgICAgICAgd3JpdGVfdGFibGUwX2hlYWRlcl9ldmVudHN9LAorICAgIHsgZmZfdGltZWxpbmVfdGFibGVfMF9lbnRyaWVzX0V2ZW50c19sZTE2LCBzaXplb2YoZmZfdGltZWxpbmVfdGFibGVfMF9lbnRyaWVzX0V2ZW50c19sZTE2KSwgTlVMTH0sCisgICAgeyBmZl90aW1lbGluZV9sZTE2LCAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmZl90aW1lbGluZV9sZTE2KSwgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfSwKKyAgICB7IHRhYmxlXzBfaGVhZGVyX2xlZ2FjeV9hdHRyaWIsICAgICAgICAgICAgc2l6ZW9mKHRhYmxlXzBfaGVhZGVyX2xlZ2FjeV9hdHRyaWIpLCAgICAgICAgICAgIHdyaXRlX3RhYmxlMF9oZWFkZXJfbGVnYWN5X2F0dHJpYn0sCisgICAgeyBmZl90YWJsZV8wX2VudHJpZXNfbGVnYWN5X2F0dHJpYl9sZTE2LCAgIHNpemVvZihmZl90YWJsZV8wX2VudHJpZXNfbGVnYWN5X2F0dHJpYl9sZTE2KSwgICBOVUxMfSwKKyAgICB7IHRhYmxlXzBfcmVkaXJlY3Rvcl9sZWdhY3lfYXR0cmliLCAgICAgICAgc2l6ZW9mKHRhYmxlXzBfcmVkaXJlY3Rvcl9sZWdhY3lfYXR0cmliKSwgICAgICAgIE5VTEx9LAorICAgIHsgdGFibGVfMF9oZWFkZXJfdGltZSwgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGFibGVfMF9oZWFkZXJfdGltZSksICAgICAgICAgICAgICAgICAgICAgd3JpdGVfdGFibGUwX2hlYWRlcl90aW1lfSwKKyAgICB7IGZmX3RhYmxlXzBfZW50cmllc190aW1lX2xlMTYsICAgICAgICAgICAgc2l6ZW9mKGZmX3RhYmxlXzBfZW50cmllc190aW1lX2xlMTYpLCAgICAgICAgICAgIE5VTEx9LAorfTsKKworc3RhdGljIGludCB3cml0ZV9yb290X3RhYmxlKEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCBzZWN0b3JfcG9zKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFd0dkNvbnRleHQgICp3Y3R4ID0gcy0+cHJpdl9kYXRhOworICAgIGludCBzaXplLCBwYWQ7CisgICAgaW50IGk7CisKKyAgICBjb25zdCBXVFZSb290RW50cnlUYWJsZSAqaCA9IHd0dl9yb290X2VudHJ5X3RhYmxlOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yod3R2X3Jvb3RfZW50cnlfdGFibGUpL3NpemVvZihXVFZSb290RW50cnlUYWJsZSk7IGkrKywgaCsrKSB7CisgICAgICAgIFd0dkZpbGUgKncgPSAmd2N0eC0+ZmlsZVtpXTsKKyAgICAgICAgaW50IGZpbGVuYW1lX3BhZGRpbmcgPSBXVFZfUEFEOChoLT5oZWFkZXJfc2l6ZSkgLSBoLT5oZWFkZXJfc2l6ZTsKKyAgICAgICAgV1RWSGVhZGVyV3JpdGVGdW5jICp3cml0ZSA9IGgtPndyaXRlX2hlYWRlcjsKKyAgICAgICAgaW50IGxlbiA9IDA7CisgICAgICAgIGludDY0X3QgbGVuX3BvczsKKworICAgICAgICBmZl9wdXRfZ3VpZChwYiwgJmZmX2Rpcl9lbnRyeV9ndWlkKTsKKyAgICAgICAgbGVuX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGF2aW9fd2wxNihwYiwgNDAgKyBoLT5oZWFkZXJfc2l6ZSArIGZpbGVuYW1lX3BhZGRpbmcgKyA4KTsgLy8gbWF5YmUgdXBkYXRlZCBsYXRlcgorICAgICAgICB3cml0ZV9wYWQocGIsIDYpOworICAgICAgICBhdmlvX3dsNjQocGIsIHdyaXRlID8gMCA6IHctPmxlbmd0aCk7Ly8gbWF5YmUgdXBkYXRlIGxhdGVyCisgICAgICAgIGF2aW9fd2wzMihwYiwgKGgtPmhlYWRlcl9zaXplICsgZmlsZW5hbWVfcGFkZGluZykgPj4gMSk7CisgICAgICAgIHdyaXRlX3BhZChwYiwgNCk7CisKKyAgICAgICAgYXZpb193cml0ZShwYiwgaC0+aGVhZGVyLCBoLT5oZWFkZXJfc2l6ZSk7CisgICAgICAgIHdyaXRlX3BhZChwYiwgZmlsZW5hbWVfcGFkZGluZyk7CisKKyAgICAgICAgaWYgKHdyaXRlKSB7CisgICAgICAgICAgICBsZW4gPSB3cml0ZShwYik7CisgICAgICAgICAgICAvLyB1cGRhdGUgbGVuZ3RoIGZpZWxkCisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGxlbl9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGF2aW9fd2w2NChwYiwgNDAgKyBoLT5oZWFkZXJfc2l6ZSArIGZpbGVuYW1lX3BhZGRpbmcgKyBsZW4pOworICAgICAgICAgICAgYXZpb193bDY0KHBiLCBsZW4gfCgxVUxMPDw2MikgfCAoMVVMTDw8NjApKTsKKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgOCArIGgtPmhlYWRlcl9zaXplICsgZmlsZW5hbWVfcGFkZGluZyArIGxlbiwgU0VFS19DVVIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZpb193bDMyKHBiLCB3LT5maXJzdF9zZWN0b3IpOworICAgICAgICAgICAgYXZpb193bDMyKHBiLCB3LT5kZXB0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjYWN1bGF0ZSByb290IHRhYmxlIHNpemUKKyAgICBzaXplID0gYXZpb190ZWxsKHBiKSAtIHNlY3Rvcl9wb3M7CisgICAgcGFkID0gV1RWX1NFQ1RPUl9TSVpFLSBzaXplOworICAgIHdyaXRlX3BhZChwYiwgcGFkKTsKKworICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9mYXQoQVZJT0NvbnRleHQgKnBiLCBpbnQgc3RhcnRfc2VjdG9yLCBpbnQgbmJfc2VjdG9ycywgaW50IHNoaWZ0KQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zZWN0b3JzOyBpKyspIHsKKyAgICAgICAgYXZpb193bDMyKHBiLCBzdGFydF9zZWN0b3IgKyAoaSA8PCBzaGlmdCkpOworICAgIH0KKyAgICAvLyBwYWQgbGVmdCBzZWN0b3IgcG9pbnRlciBzaXplCisgICAgd3JpdGVfcGFkKHBiLCBXVFZfU0VDVE9SX1NJWkUgLSAoKG5iX3NlY3RvcnMgPDwgMikgJSBXVFZfU0VDVE9SX1NJWkUpKTsKK30KKworc3RhdGljIGludDY0X3Qgd3JpdGVfZmF0X3NlY3RvcihBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3Qgc3RhcnRfcG9zLCBpbnQgbmJfc2VjdG9ycywgaW50IHNlY3Rvcl9iaXRzLCBpbnQgZGVwdGgpCit7CisgICAgaW50NjRfdCBzdGFydF9zZWN0b3IgPSBzdGFydF9wb3MgPj4gV1RWX1NFQ1RPUl9CSVRTOworICAgIGludCBzaGlmdCA9IHNlY3Rvcl9iaXRzIC0gV1RWX1NFQ1RPUl9CSVRTOworCisgICAgaW50NjRfdCBmYXQgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIHdyaXRlX2ZhdChzLT5wYiwgc3RhcnRfc2VjdG9yLCBuYl9zZWN0b3JzLCBzaGlmdCk7CisKKyAgICBpZiAoZGVwdGggPT0gMikgeworICAgICAgICBpbnQ2NF90IHN0YXJ0X3NlY3RvcjEgPSBmYXQgPj4gV1RWX1NFQ1RPUl9CSVRTOworICAgICAgICBpbnQgbmJfc2VjdG9yczEgPSAoKG5iX3NlY3RvcnMgPDwgMikgKyBXVFZfU0VDVE9SX1NJWkUgLSAxKSAvIFdUVl9TRUNUT1JfU0laRTsKKyAgICAgICAgaW50NjRfdCBmYXQxID0gYXZpb190ZWxsKHMtPnBiKTsKKworICAgICAgIHdyaXRlX2ZhdChzLT5wYiwgc3RhcnRfc2VjdG9yMSwgbmJfc2VjdG9yczEsIDApOworICAgICAgIHJldHVybiBmYXQxOworICAgIH0KKworICAgIHJldHVybiBmYXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3RhYmxlX2VudHJpZXNfZXZlbnRzKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBXdHZDb250ZXh0ICp3Y3R4ID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3Y3R4LT5uYl9zcF9wYWlyczsgaSsrKSB7CisgICAgICAgIGF2aW9fd2w2NChwYiwgd2N0eC0+c3BfcGFpcnNbaV0uc2VyaWFsKTsKKyAgICAgICAgYXZpb193bDY0KHBiLCB3Y3R4LT5zcF9wYWlyc1tpXS52YWx1ZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV90YWJsZV9lbnRyaWVzX3RpbWUoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIFd0dkNvbnRleHQgKndjdHggPSBzLT5wcml2X2RhdGE7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdjdHgtPm5iX3N0X3BhaXJzOyBpKyspIHsKKyAgICAgICAgYXZpb193bDY0KHBiLCB3Y3R4LT5zdF9wYWlyc1tpXS52YWx1ZSk7CisgICAgICAgIGF2aW9fd2w2NChwYiwgd2N0eC0+c3RfcGFpcnNbaV0uc2VyaWFsKTsKKyAgICB9CisgICAgYXZpb193bDY0KHBiLCB3Y3R4LT5sYXN0X3B0cyk7CisgICAgYXZpb193bDY0KHBiLCB3Y3R4LT5sYXN0X3NlcmlhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX21ldGFkYXRhX2hlYWRlcihBVklPQ29udGV4dCAqcGIsIGludCB0eXBlLCBjb25zdCBjaGFyICprZXksIGludCB2YWx1ZV9zaXplKQoreworICAgIGZmX3B1dF9ndWlkKHBiLCAmZmZfbWV0YWRhdGFfZ3VpZCk7CisgICAgYXZpb193bDMyKHBiLCB0eXBlKTsKKyAgICBhdmlvX3dsMzIocGIsIHZhbHVlX3NpemUpOworICAgIGF2aW9fcHV0X3N0cjE2bGUocGIsIGtleSk7Cit9CisKK3N0YXRpYyBpbnQgbWV0YWRhdGFfaGVhZGVyX3NpemUoY29uc3QgY2hhciAqa2V5KQoreworICAgIHJldHVybiAxNiArIDQgKyA0ICsgc3RybGVuKGtleSkqMiArIDI7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3RhZ19pbnQzMihBVklPQ29udGV4dCAqcGIsIGNvbnN0IGNoYXIgKmtleSwgaW50IHZhbHVlKQoreworICAgIHdyaXRlX21ldGFkYXRhX2hlYWRlcihwYiwgMCwga2V5LCA0KTsKKyAgICBhdmlvX3dsMzIocGIsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfdGFnKEFWSU9Db250ZXh0ICpwYiwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICB3cml0ZV9tZXRhZGF0YV9oZWFkZXIocGIsIDEsIGtleSwgc3RybGVuKHZhbHVlKSoyICsgMik7CisgICAgYXZpb19wdXRfc3RyMTZsZShwYiwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGF0dGFjaG1lbnRfdmFsdWVfc2l6ZShjb25zdCBBVlBhY2tldCAqcGt0LCBjb25zdCBBVkRpY3Rpb25hcnlFbnRyeSAqZSkKK3sKKyAgICByZXR1cm4gc3RybGVuKCJpbWFnZS9qcGVnIikqMiArIDIgKyAxICsgKGUgPyBzdHJsZW4oZS0+dmFsdWUpKjIgOiAwKSArIDIgKyA0ICsgcGt0LT5zaXplOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV90YWJsZV9lbnRyaWVzX2F0dHJpYihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgV3R2Q29udGV4dCAqd2N0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnID0gMDsKKworICAgIC8vRklYTUU6IHRyYW5zbGF0ZSBzcGVjaWFsIHRhZ3MgKGUuZy4gV00vQml0cmF0ZSkgdG8gYmluYXJ5IHJlcHJlc2VudGF0aW9uCisgICAgZmZfbWV0YWRhdGFfY29udigmcy0+bWV0YWRhdGEsIGZmX2FzZl9tZXRhZGF0YV9jb252LCBOVUxMKTsKKyAgICB3aGlsZSAoKHRhZyA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiIiwgdGFnLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKKyAgICAgICAgd3JpdGVfdGFnKHBiLCB0YWctPmtleSwgdGFnLT52YWx1ZSk7CisKKyAgICBpZiAod2N0eC0+dGh1bWJuYWlsLnNpemUpIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1t3Y3R4LT50aHVtYm5haWwuc3RyZWFtX2luZGV4XTsKKyAgICAgICAgdGFnID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAidGl0bGUiLCBOVUxMLCAwKTsKKyAgICAgICAgd3JpdGVfbWV0YWRhdGFfaGVhZGVyKHBiLCAyLCAiV00vUGljdHVyZSIsIGF0dGFjaG1lbnRfdmFsdWVfc2l6ZSgmd2N0eC0+dGh1bWJuYWlsLCB0YWcpKTsKKworICAgICAgICBhdmlvX3B1dF9zdHIxNmxlKHBiLCAiaW1hZ2UvanBlZyIpOworICAgICAgICBhdmlvX3c4KHBiLCAweDEwKTsKKyAgICAgICAgYXZpb19wdXRfc3RyMTZsZShwYiwgdGFnID8gdGFnLT52YWx1ZSA6ICIiKTsKKworICAgICAgICBhdmlvX3dsMzIocGIsIHdjdHgtPnRodW1ibmFpbC5zaXplKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgd2N0eC0+dGh1bWJuYWlsLmRhdGEsIHdjdHgtPnRodW1ibmFpbC5zaXplKTsKKworICAgICAgICB3cml0ZV90YWdfaW50MzIocGIsICJXTS9NZWRpYVRodW1iVHlwZSIsIDIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgd3JpdGVfdGFibGVfcmVkaXJlY3Rvcl9sZWdhY3lfYXR0cmliKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBXdHZDb250ZXh0ICp3Y3R4ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0YWcgPSAwOworICAgIGludDY0X3QgcG9zID0gMDsKKworICAgIC8vRklYTUU6IHRyYW5zbGF0ZSBzcGVjaWFsIHRhZ3MgdG8gYmluYXJ5IHJlcHJlc2VudGF0aW9uCisgICAgd2hpbGUgKCh0YWcgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgIiIsIHRhZywgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgYXZpb193bDY0KHBiLCBwb3MpOworICAgICAgICBwb3MgKz0gbWV0YWRhdGFfaGVhZGVyX3NpemUodGFnLT5rZXkpICsgc3RybGVuKHRhZy0+dmFsdWUpKjIgKyAyOworICAgIH0KKworICAgIGlmICh3Y3R4LT50aHVtYm5haWwuc2l6ZSkgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3djdHgtPnRodW1ibmFpbC5zdHJlYW1faW5kZXhdOworICAgICAgICBhdmlvX3dsNjQocGIsIHBvcyk7CisgICAgICAgIHBvcyArPSBtZXRhZGF0YV9oZWFkZXJfc2l6ZSgiV00vUGljdHVyZSIpICsgYXR0YWNobWVudF92YWx1ZV9zaXplKCZ3Y3R4LT50aHVtYm5haWwsIGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgInRpdGxlIiwgTlVMTCwgMCkpOworCisgICAgICAgIGF2aW9fd2w2NChwYiwgcG9zKTsKKyAgICAgICAgcG9zICs9IG1ldGFkYXRhX2hlYWRlcl9zaXplKCJXTS9NZWRpYVRodW1iVHlwZSIpICsgNDsKKyAgICB9Cit9CisKKy8qKgorICogUGFkIHRoZSByZW1haW5kZXIgb2YgYSBmaWxlCisgKiBXcml0ZSBvdXQgZmF0IHRhYmxlCisgKiBAcmV0dXJuIDwwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZmluaXNoX2ZpbGUoQVZGb3JtYXRDb250ZXh0ICpzLCBlbnVtIFd0dkZpbGVJbmRleCBpbmRleCwgaW50NjRfdCBzdGFydF9wb3MpCit7CisgICAgV3R2Q29udGV4dCAqd2N0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBXdHZGaWxlICp3ID0gJndjdHgtPmZpbGVbaW5kZXhdOworICAgIGludDY0X3QgZW5kX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgaW50IHNlY3Rvcl9iaXRzLCBuYl9zZWN0b3JzLCBwYWQ7CisKKyAgICBhdl9hc3NlcnQwKGluZGV4IDwgV1RWX0ZJTEVTKTsKKworICAgIHctPmxlbmd0aCA9IChlbmRfcG9zIC0gc3RhcnRfcG9zKTsKKworICAgIC8vIGRldGVybWluZSBvcHRpbWFsIGZhdCB0YWJsZSBkZXB0aCwgc2VjdG9yX2JpdHMsIG5iX3NlY3RvcnMKKyAgICBpZiAody0+bGVuZ3RoIDw9IFdUVl9TRUNUT1JfU0laRSkgeworICAgICAgICB3LT5kZXB0aCA9IDA7CisgICAgICAgIHNlY3Rvcl9iaXRzID0gV1RWX1NFQ1RPUl9CSVRTOworICAgIH0gZWxzZSBpZiAody0+bGVuZ3RoIDw9IChXVFZfU0VDVE9SX1NJWkUgLyA0KSAqIFdUVl9TRUNUT1JfU0laRSkgeworICAgICAgICB3LT5kZXB0aCA9IDE7CisgICAgICAgIHNlY3Rvcl9iaXRzID0gV1RWX1NFQ1RPUl9CSVRTOworICAgIH0gZWxzZSBpZiAody0+bGVuZ3RoIDw9IChXVFZfU0VDVE9SX1NJWkUgLyA0KSAqIFdUVl9CSUdTRUNUT1JfU0laRSkgeworICAgICAgICB3LT5kZXB0aCA9IDE7CisgICAgICAgIHNlY3Rvcl9iaXRzID0gV1RWX0JJR1NFQ1RPUl9CSVRTOworICAgIH0gZWxzZSBpZiAody0+bGVuZ3RoIDw9IChpbnQ2NF90KShXVFZfU0VDVE9SX1NJWkUgLyA0KSAqIChXVFZfU0VDVE9SX1NJWkUgLyA0KSAqIFdUVl9TRUNUT1JfU0laRSkgeworICAgICAgICB3LT5kZXB0aCA9IDI7CisgICAgICAgIHNlY3Rvcl9iaXRzID0gV1RWX1NFQ1RPUl9CSVRTOworICAgIH0gZWxzZSBpZiAody0+bGVuZ3RoIDw9IChpbnQ2NF90KShXVFZfU0VDVE9SX1NJWkUgLyA0KSAqIChXVFZfU0VDVE9SX1NJWkUgLyA0KSAqIFdUVl9CSUdTRUNUT1JfU0laRSkgeworICAgICAgICB3LT5kZXB0aCA9IDI7CisgICAgICAgIHNlY3Rvcl9iaXRzID0gV1RWX0JJR1NFQ1RPUl9CSVRTOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBmaWxlIGFsbG9jYXRpb24gdGFibGUgZGVwdGggKCUiUFJJaTY0IiBieXRlcylcbiIsIHctPmxlbmd0aCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBkZXRlcm1pbmUgdGhlIG5iX3NlY3RvcnMKKyAgICBuYl9zZWN0b3JzID0gKGludCkody0+bGVuZ3RoID4+IHNlY3Rvcl9iaXRzKTsKKworICAgIC8vIHBhZCBzZWN0b3Igb2YgdGltZWxpbmUKKyAgICBwYWQgPSAoMSA8PCBzZWN0b3JfYml0cykgLSAody0+bGVuZ3RoICUgKDEgPDwgc2VjdG9yX2JpdHMpKTsKKyAgICBpZiAocGFkKSB7CisgICAgICAgIG5iX3NlY3RvcnMrKzsKKyAgICAgICAgd3JpdGVfcGFkKHBiLCBwYWQpOworICAgIH0KKworICAgIC8vd3JpdGUgZmF0IHRhYmxlCisgICAgaWYgKHctPmRlcHRoID4gMCkgeworICAgICAgICB3LT5maXJzdF9zZWN0b3IgPSB3cml0ZV9mYXRfc2VjdG9yKHMsIHN0YXJ0X3BvcywgbmJfc2VjdG9ycywgc2VjdG9yX2JpdHMsIHctPmRlcHRoKSA+PiBXVFZfU0VDVE9SX0JJVFM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdy0+Zmlyc3Rfc2VjdG9yID0gc3RhcnRfcG9zID4+IFdUVl9TRUNUT1JfQklUUzsKKyAgICB9CisKKyAgICB3LT5sZW5ndGggfD0gMVVMTDw8NjA7CisgICAgaWYgKHNlY3Rvcl9iaXRzID09IFdUVl9TRUNUT1JfQklUUykKKyAgICAgICAgdy0+bGVuZ3RoIHw9IDFVTEw8PDYzOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgV3R2Q29udGV4dCAqd2N0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgcm9vdF9zaXplOworICAgIGludDY0X3Qgc2VjdG9yX3BvczsKKyAgICBpbnQ2NF90IHN0YXJ0X3BvcywgZmlsZV9lbmRfcG9zOworCisgICAgaWYgKGZpbmlzaF9maWxlKHMsIFdUVl9USU1FTElORSwgd2N0eC0+dGltZWxpbmVfc3RhcnRfcG9zKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHN0YXJ0X3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgd3JpdGVfdGFibGVfZW50cmllc19ldmVudHMocyk7CisgICAgaWYgKGZpbmlzaF9maWxlKHMsIFdUVl9USU1FTElORV9UQUJMRV8wX0VOVFJJRVNfRVZFTlRTLCBzdGFydF9wb3MpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgc3RhcnRfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICB3cml0ZV90YWJsZV9lbnRyaWVzX2F0dHJpYihzKTsKKyAgICBpZiAoZmluaXNoX2ZpbGUocywgV1RWX1RBQkxFXzBfRU5UUklFU19MRUdBQ1lfQVRUUklCLCBzdGFydF9wb3MpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgc3RhcnRfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICB3cml0ZV90YWJsZV9yZWRpcmVjdG9yX2xlZ2FjeV9hdHRyaWIocyk7CisgICAgaWYgKGZpbmlzaF9maWxlKHMsIFdUVl9UQUJMRV8wX1JFRElSRUNUT1JfTEVHQUNZX0FUVFJJQiwgc3RhcnRfcG9zKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHN0YXJ0X3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgd3JpdGVfdGFibGVfZW50cmllc190aW1lKHMpOworICAgIGlmIChmaW5pc2hfZmlsZShzLCBXVFZfVEFCTEVfMF9FTlRSSUVTX1RJTUUsIHN0YXJ0X3BvcykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyB3cml0ZSByb290IHRhYmxlCisgICAgc2VjdG9yX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgcm9vdF9zaXplID0gd3JpdGVfcm9vdF90YWJsZShzLCBzZWN0b3JfcG9zKTsKKworICAgIGZpbGVfZW5kX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgLy8gdXBkYXRlIHJvb3QgdmFsdWUKKyAgICBhdmlvX3NlZWsocGIsIDB4MzAsIFNFRUtfU0VUKTsKKyAgICBhdmlvX3dsMzIocGIsIHJvb3Rfc2l6ZSk7CisgICAgYXZpb19zZWVrKHBiLCA0LCBTRUVLX0NVUik7CisgICAgYXZpb193bDMyKHBiLCBzZWN0b3JfcG9zID4+IFdUVl9TRUNUT1JfQklUUyk7CisgICAgYXZpb19zZWVrKHBiLCAweDVjLCBTRUVLX1NFVCk7CisgICAgYXZpb193bDMyKHBiLCBmaWxlX2VuZF9wb3MgPj4gV1RWX1NFQ1RPUl9CSVRTKTsKKworICAgIGF2aW9fZmx1c2gocGIpOworCisgICAgYXZfZnJlZSh3Y3R4LT5zcF9wYWlycyk7CisgICAgYXZfZnJlZSh3Y3R4LT5zdF9wYWlycyk7CisgICAgYXZfZnJlZV9wYWNrZXQoJndjdHgtPnRodW1ibmFpbCk7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3d0dl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid3R2IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2luZG93cyBUZWxldmlzaW9uIChXVFYpIiksCisgICAgLmV4dGVuc2lvbnMgICAgID0gInd0diIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFd0dkNvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX0FDMywKKyAgICAudmlkZW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICA9IHdyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSB3cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gd3JpdGVfdHJhaWxlciwKKyAgICAuY29kZWNfdGFnICAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyogY29uc3QgW10peyBmZl9jb2RlY19ibXBfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9jb2RlY193YXZfdGFncywgMCB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC93di5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3d2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0ZjgwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93di5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBXYXZQYWNrIHNoYXJlZCBmdW5jdGlvbnMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2luY2x1ZGUgInd2LmgiCisKK2ludCBmZl93dl9wYXJzZV9oZWFkZXIoV3ZIZWFkZXIgKnd2LCBjb25zdCB1aW50OF90ICpkYXRhKQoreworICAgIG1lbXNldCh3diwgMCwgc2l6ZW9mKCp3dikpOworCisgICAgaWYgKEFWX1JMMzIoZGF0YSkgIT0gTUtUQUcoJ3cnLCAndicsICdwJywgJ2snKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB3di0+YmxvY2tzaXplICAgICA9IEFWX1JMMzIoZGF0YSArIDQpOworICAgIGlmICh3di0+YmxvY2tzaXplIDwgMjQgfHwgd3YtPmJsb2Nrc2l6ZSA+IFdWX0JMT0NLX0xJTUlUKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB3di0+YmxvY2tzaXplIC09IDI0OworCisgICAgd3YtPnZlcnNpb24gICAgICAgPSBBVl9STDE2KGRhdGEgKyA4KTsKKyAgICB3di0+dG90YWxfc2FtcGxlcyA9IEFWX1JMMzIoZGF0YSArIDEyKTsKKyAgICB3di0+YmxvY2tfaWR4ICAgICA9IEFWX1JMMzIoZGF0YSArIDE2KTsKKyAgICB3di0+c2FtcGxlcyAgICAgICA9IEFWX1JMMzIoZGF0YSArIDIwKTsKKyAgICB3di0+ZmxhZ3MgICAgICAgICA9IEFWX1JMMzIoZGF0YSArIDI0KTsKKyAgICB3di0+Y3JjICAgICAgICAgICA9IEFWX1JMMzIoZGF0YSArIDI4KTsKKworICAgIHd2LT5pbml0aWFsID0gISEod3YtPmZsYWdzICYgV1ZfRkxBR19JTklUSUFMX0JMT0NLKTsKKyAgICB3di0+ZmluYWwgICA9ICEhKHd2LT5mbGFncyAmIFdWX0ZMQUdfRklOQUxfQkxPQ0spOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvd3YuaCBiL2ZmbXBlZy9saWJhdmZvcm1hdC93di5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZDJlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvd3YuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogV2F2UGFjayBzaGFyZWQgZnVuY3Rpb25zCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGT1JNQVRfV1ZfSAorI2RlZmluZSBBVkZPUk1BVF9XVl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBXVl9IRUFERVJfU0laRSAzMgorCisjZGVmaW5lIFdWX0ZMQUdfSU5JVElBTF9CTE9DSyAoMSA8PCAxMSkKKyNkZWZpbmUgV1ZfRkxBR19GSU5BTF9CTE9DSyAgICgxIDw8IDEyKQorCisvLyBzcGVjcyBzYXkgdGhhdCBtYXhpbXVtIGJsb2NrIHNpemUgaXMgMU1iCisjZGVmaW5lIFdWX0JMT0NLX0xJTUlUIDEwNDg1NzYKKwordHlwZWRlZiBzdHJ1Y3QgV3ZIZWFkZXIgeworICAgIHVpbnQzMl90IGJsb2Nrc2l6ZTsgICAgIC8vPCBzaXplIG9mIHRoZSBibG9jayBkYXRhIChleGNsdWRpbmcgdGhlIGhlYWRlcikKKyAgICB1aW50MTZfdCB2ZXJzaW9uOyAgICAgICAvLzwgYml0c3RyZWFtIHZlcnNpb24KKyAgICB1aW50MzJfdCB0b3RhbF9zYW1wbGVzOyAvLzwgdG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIHN0cmVhbQorICAgIHVpbnQzMl90IGJsb2NrX2lkeDsgICAgIC8vPCBpbmRleCBvZiB0aGUgZmlyc3Qgc2FtcGxlIGluIHRoaXMgYmxvY2sKKyAgICB1aW50MzJfdCBzYW1wbGVzOyAgICAgICAvLzwgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhpcyBibG9jaworICAgIHVpbnQzMl90IGZsYWdzOworICAgIHVpbnQzMl90IGNyYzsKKworICAgIGludCBpbml0aWFsLCBmaW5hbDsKK30gV3ZIZWFkZXI7CisKKy8qKgorICogUGFyc2UgYSBXYXZQYWNrIGJsb2NrIGhlYWRlci4KKyAqCisgKiBAcGFyYW0gd3YgICB0aGlzIHN0cnVjdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHBhcnNlIGhlYWRlciBpbmZvcm1hdGlvbgorICogQHBhcmFtIGRhdGEgaGVhZGVyIGRhdGEsIG11c3QgYmUgV1ZfSEVBREVSX1NJWkUgYnl0ZXMgbG9uZworICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBmZl93dl9wYXJzZV9oZWFkZXIoV3ZIZWFkZXIgKnd2LCBjb25zdCB1aW50OF90ICpkYXRhKTsKKworI2VuZGlmIC8qIEFWRk9STUFUX1dWX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdmZvcm1hdC93dmRlYy5jIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3d2ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3NjhjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93dmRlYy5jCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogV2F2UGFjayBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsMjAxMSBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXBldGFnLmgiCisjaW5jbHVkZSAiaWQzdjEuaCIKKyNpbmNsdWRlICJ3di5oIgorCitlbnVtIFdWX0ZMQUdTIHsKKyAgICBXVl9NT05PICAgPSAweDAwMDQsCisgICAgV1ZfSFlCUklEID0gMHgwMDA4LAorICAgIFdWX0pPSU5UICA9IDB4MDAxMCwKKyAgICBXVl9DUk9TU0QgPSAweDAwMjAsCisgICAgV1ZfSFNIQVBFID0gMHgwMDQwLAorICAgIFdWX0ZMT0FUICA9IDB4MDA4MCwKKyAgICBXVl9JTlQzMiAgPSAweDAxMDAsCisgICAgV1ZfSEJSICAgID0gMHgwMjAwLAorICAgIFdWX0hCQUwgICA9IDB4MDQwMCwKKyAgICBXVl9NQ0lOSVQgPSAweDA4MDAsCisgICAgV1ZfTUNFTkQgID0gMHgxMDAwLAorfTsKKworc3RhdGljIGNvbnN0IGludCB3dl9yYXRlc1sxNl0gPSB7CisgICAgIDYwMDAsICA4MDAwLCAgOTYwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgIDIyMDUwLCAyNDAwMCwKKyAgICAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwLCAxOTIwMDAsICAgIC0xCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBibG9ja19oZWFkZXJbV1ZfSEVBREVSX1NJWkVdOworICAgIFd2SGVhZGVyIGhlYWRlcjsKKyAgICBpbnQgcmF0ZSwgY2hhbiwgYnBwOworICAgIHVpbnQzMl90IGNobWFzazsKKyAgICBpbnQgbXVsdGljaGFubmVsOworICAgIGludCBibG9ja19wYXJzZWQ7CisgICAgaW50NjRfdCBwb3M7CisKKyAgICBpbnQ2NF90IGFwZXRhZ19zdGFydDsKK30gV1ZDb250ZXh0OworCitzdGF0aWMgaW50IHd2X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIC8qIGNoZWNrIGZpbGUgaGVhZGVyICovCisgICAgaWYgKHAtPmJ1Zl9zaXplIDw9IDMyKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoQVZfUkwzMigmcC0+YnVmWzBdKSA9PSBNS1RBRygndycsICd2JywgJ3AnLCAnaycpICYmCisgICAgICAgIEFWX1JMMzIoJnAtPmJ1Zls0XSkgPj0gMjQgJiYKKyAgICAgICAgQVZfUkwzMigmcC0+YnVmWzRdKSA8PSBXVl9CTE9DS19MSU1JVCAmJgorICAgICAgICBBVl9STDE2KCZwLT5idWZbOF0pID49IDB4NDAyICYmCisgICAgICAgIEFWX1JMMTYoJnAtPmJ1Zls4XSkgPD0gMHg0MTApCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHd2X3JlYWRfYmxvY2tfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqY3R4LCBBVklPQ29udGV4dCAqcGIpCit7CisgICAgV1ZDb250ZXh0ICp3YyA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisgICAgaW50IHJhdGUsIGJwcCwgY2hhbjsKKyAgICB1aW50MzJfdCBjaG1hc2ssIGZsYWdzOworCisgICAgd2MtPnBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICAvKiBkb24ndCByZXR1cm4gYm9ndXMgcGFja2V0cyB3aXRoIHRoZSBhcGUgdGFnIGRhdGEgKi8KKyAgICBpZiAod2MtPmFwZXRhZ19zdGFydCAmJiB3Yy0+cG9zID49IHdjLT5hcGV0YWdfc3RhcnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHJldCA9IGF2aW9fcmVhZChwYiwgd2MtPmJsb2NrX2hlYWRlciwgV1ZfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgIT0gV1ZfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiAocmV0IDwgMCkgPyByZXQgOiBBVkVSUk9SX0VPRjsKKworICAgIHJldCA9IGZmX3d2X3BhcnNlX2hlYWRlcigmd2MtPmhlYWRlciwgd2MtPmJsb2NrX2hlYWRlcik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBibG9jayBoZWFkZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAod2MtPmhlYWRlci52ZXJzaW9uIDwgMHg0MDIgfHwgd2MtPmhlYWRlci52ZXJzaW9uID4gMHg0MTApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgdmVyc2lvbiAlMDNYXG4iLCB3Yy0+aGVhZGVyLnZlcnNpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgLyogQmxvY2tzIHdpdGggemVybyBzYW1wbGVzIGRvbid0IGNvbnRhaW4gYWN0dWFsIGF1ZGlvIGluZm9ybWF0aW9uCisgICAgICogYW5kIHNob3VsZCBiZSBpZ25vcmVkICovCisgICAgaWYgKCF3Yy0+aGVhZGVyLnNhbXBsZXMpCisgICAgICAgIHJldHVybiAwOworICAgIC8vIHBhcnNlIGZsYWdzCisgICAgZmxhZ3MgID0gd2MtPmhlYWRlci5mbGFnczsKKyAgICBicHAgICAgPSAoKGZsYWdzICYgMykgKyAxKSA8PCAzOworICAgIGNoYW4gICA9IDEgKyAhKGZsYWdzICYgV1ZfTU9OTyk7CisgICAgY2htYXNrID0gZmxhZ3MgJiBXVl9NT05PID8gQVZfQ0hfTEFZT1VUX01PTk8gOiBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgIHJhdGUgICA9IHd2X3JhdGVzWyhmbGFncyA+PiAyMykgJiAweEZdOworICAgIHdjLT5tdWx0aWNoYW5uZWwgPSAhKHdjLT5oZWFkZXIuaW5pdGlhbCAmJiB3Yy0+aGVhZGVyLmZpbmFsKTsKKyAgICBpZiAod2MtPm11bHRpY2hhbm5lbCkgeworICAgICAgICBjaGFuICAgPSB3Yy0+Y2hhbjsKKyAgICAgICAgY2htYXNrID0gd2MtPmNobWFzazsKKyAgICB9CisgICAgaWYgKChyYXRlID09IC0xIHx8ICFjaGFuKSAmJiAhd2MtPmJsb2NrX3BhcnNlZCkgeworICAgICAgICBpbnQ2NF90IGJsb2NrX2VuZCA9IGF2aW9fdGVsbChwYikgKyB3Yy0+aGVhZGVyLmJsb2Nrc2l6ZTsKKyAgICAgICAgaWYgKCFwYi0+c2Vla2FibGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGRldGVybWluZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGF2aW9fdGVsbChwYikgPCBibG9ja19lbmQgJiYgIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgICAgIGludCBpZCwgc2l6ZTsKKyAgICAgICAgICAgIGlkICAgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIHNpemUgPSAoaWQgJiAweDgwKSA/IGF2aW9fcmwyNChwYikgOiBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIHNpemUgPDw9IDE7CisgICAgICAgICAgICBpZiAoaWQgJiAweDQwKQorICAgICAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgIHN3aXRjaCAoaWQgJiAweDNGKSB7CisgICAgICAgICAgICBjYXNlIDB4RDoKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnN1ZmZpY2llbnQgY2hhbm5lbCBpbmZvcm1hdGlvblxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFuID0gYXZpb19yOChwYik7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzaXplIC0gMikgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgY2htYXNrID0gYXZpb19yOChwYik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgY2htYXNrID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBjaG1hc2sgPSBhdmlvX3JsMjQocGIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIGNobWFzayA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbiAgfD0gKGF2aW9fcjgocGIpICYgMHhGKSA8PCA4OworICAgICAgICAgICAgICAgICAgICBjaG1hc2sgPSBhdmlvX3JsMjQocGIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjaGFubmVsIGluZm8gc2l6ZSAlZFxuIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgyNzoKKyAgICAgICAgICAgICAgICByYXRlID0gYXZpb19ybDI0KHBiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpZCAmIDB4NDApCisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmF0ZSA9PSAtMSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZGV0ZXJtaW5lIGN1c3RvbSBzYW1wbGluZyByYXRlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGF2aW9fc2VlayhwYiwgYmxvY2tfZW5kIC0gd2MtPmhlYWRlci5ibG9ja3NpemUsIFNFRUtfU0VUKTsKKyAgICB9CisgICAgaWYgKCF3Yy0+YnBwKQorICAgICAgICB3Yy0+YnBwICAgID0gYnBwOworICAgIGlmICghd2MtPmNoYW4pCisgICAgICAgIHdjLT5jaGFuICAgPSBjaGFuOworICAgIGlmICghd2MtPmNobWFzaykKKyAgICAgICAgd2MtPmNobWFzayA9IGNobWFzazsKKyAgICBpZiAoIXdjLT5yYXRlKQorICAgICAgICB3Yy0+cmF0ZSAgID0gcmF0ZTsKKworICAgIGlmIChmbGFncyAmJiBicHAgIT0gd2MtPmJwcCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQml0cyBwZXIgc2FtcGxlIGRpZmZlciwgdGhpcyBibG9jazogJWksIGhlYWRlciBibG9jazogJWlcbiIsCisgICAgICAgICAgICAgICBicHAsIHdjLT5icHApOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGZsYWdzICYmICF3Yy0+bXVsdGljaGFubmVsICYmIGNoYW4gIT0gd2MtPmNoYW4pIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNoYW5uZWxzIGRpZmZlciwgdGhpcyBibG9jazogJWksIGhlYWRlciBibG9jazogJWlcbiIsCisgICAgICAgICAgICAgICBjaGFuLCB3Yy0+Y2hhbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiYgcmF0ZSAhPSAtMSAmJiByYXRlICE9IHdjLT5yYXRlKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJTYW1wbGluZyByYXRlIGRpZmZlciwgdGhpcyBibG9jazogJWksIGhlYWRlciBibG9jazogJWlcbiIsCisgICAgICAgICAgICAgICByYXRlLCB3Yy0+cmF0ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3dl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgV1ZDb250ZXh0ICp3YyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IHJldDsKKworICAgIHdjLT5ibG9ja19wYXJzZWQgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKChyZXQgPSB3dl9yZWFkX2Jsb2NrX2hlYWRlcihzLCBwYikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmICghd2MtPmhlYWRlci5zYW1wbGVzKQorICAgICAgICAgICAgYXZpb19za2lwKHBiLCB3Yy0+aGVhZGVyLmJsb2Nrc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIG5vdyB3ZSBhcmUgcmVhZHk6IGJ1aWxkIGZvcm1hdCBzdHJlYW1zICovCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XQVZQQUNLOworICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gd2MtPmNoYW47CisgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCAgICAgICAgPSB3Yy0+Y2htYXNrOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gd2MtPnJhdGU7CisgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSB3Yy0+YnBwOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCB3Yy0+cmF0ZSk7CisgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOworICAgIGlmICh3Yy0+aGVhZGVyLnRvdGFsX3NhbXBsZXMgIT0gMHhGRkZGRkZGRnUpCisgICAgICAgIHN0LT5kdXJhdGlvbiA9IHdjLT5oZWFkZXIudG90YWxfc2FtcGxlczsKKworICAgIGlmIChzLT5wYi0+c2Vla2FibGUpIHsKKyAgICAgICAgaW50NjRfdCBjdXIgPSBhdmlvX3RlbGwocy0+cGIpOworICAgICAgICB3Yy0+YXBldGFnX3N0YXJ0ID0gZmZfYXBlX3BhcnNlX3RhZyhzKTsKKyAgICAgICAgaWYgKCFhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgIiIsIE5VTEwsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpCisgICAgICAgICAgICBmZl9pZDN2MV9yZWFkKHMpOworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIGN1ciwgU0VFS19TRVQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHd2X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBXVkNvbnRleHQgKndjID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisgICAgaW50IG9mZjsKKyAgICBpbnQ2NF90IHBvczsKKyAgICB1aW50MzJfdCBibG9ja19zYW1wbGVzOworCisgICAgaWYgKGF2aW9fZmVvZihzLT5wYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICBpZiAod2MtPmJsb2NrX3BhcnNlZCkgeworICAgICAgICBpZiAoKHJldCA9IHd2X3JlYWRfYmxvY2tfaGVhZGVyKHMsIHMtPnBiKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwb3MgPSB3Yy0+cG9zOworICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgd2MtPmhlYWRlci5ibG9ja3NpemUgKyBXVl9IRUFERVJfU0laRSkgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG1lbWNweShwa3QtPmRhdGEsIHdjLT5ibG9ja19oZWFkZXIsIFdWX0hFQURFUl9TSVpFKTsKKyAgICByZXQgPSBhdmlvX3JlYWQocy0+cGIsIHBrdC0+ZGF0YSArIFdWX0hFQURFUl9TSVpFLCB3Yy0+aGVhZGVyLmJsb2Nrc2l6ZSk7CisgICAgaWYgKHJldCAhPSB3Yy0+aGVhZGVyLmJsb2Nrc2l6ZSkgeworICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICB3aGlsZSAoISh3Yy0+aGVhZGVyLmZsYWdzICYgV1ZfRkxBR19GSU5BTF9CTE9DSykpIHsKKyAgICAgICAgaWYgKChyZXQgPSB3dl9yZWFkX2Jsb2NrX2hlYWRlcihzLCBzLT5wYikpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZV9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBvZmYgPSBwa3QtPnNpemU7CisgICAgICAgIGlmICgocmV0ID0gYXZfZ3Jvd19wYWNrZXQocGt0LCBXVl9IRUFERVJfU0laRSArIHdjLT5oZWFkZXIuYmxvY2tzaXplKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocGt0LT5kYXRhICsgb2ZmLCB3Yy0+YmxvY2tfaGVhZGVyLCBXVl9IRUFERVJfU0laRSk7CisKKyAgICAgICAgcmV0ID0gYXZpb19yZWFkKHMtPnBiLCBwa3QtPmRhdGEgKyBvZmYgKyBXVl9IRUFERVJfU0laRSwgd2MtPmhlYWRlci5ibG9ja3NpemUpOworICAgICAgICBpZiAocmV0ICE9IHdjLT5oZWFkZXIuYmxvY2tzaXplKSB7CisgICAgICAgICAgICBhdl9mcmVlX3BhY2tldChwa3QpOworICAgICAgICAgICAgcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IEFWRVJST1JfRU9GOworICAgICAgICB9CisgICAgfQorICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICB3Yy0+YmxvY2tfcGFyc2VkICA9IDE7CisgICAgcGt0LT5wdHMgICAgICAgICAgPSB3Yy0+aGVhZGVyLmJsb2NrX2lkeDsKKyAgICBibG9ja19zYW1wbGVzICAgICA9IHdjLT5oZWFkZXIuc2FtcGxlczsKKyAgICBpZiAoYmxvY2tfc2FtcGxlcyA+IElOVDMyX01BWCkKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlRvbyBtYW55IHNhbXBsZXMgaW4gYmxvY2s6ICUiUFJJdTMyIlxuIiwgYmxvY2tfc2FtcGxlcyk7CisgICAgZWxzZQorICAgICAgICBwa3QtPmR1cmF0aW9uID0gYmxvY2tfc2FtcGxlczsKKworICAgIGF2X2FkZF9pbmRleF9lbnRyeShzLT5zdHJlYW1zWzBdLCBwb3MsIHBrdC0+cHRzLCAwLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3dl9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgICBBVlN0cmVhbSAgKnN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgIFdWQ29udGV4dCAqd2MgPSBzLT5wcml2X2RhdGE7CisgICAgQVZQYWNrZXQgcGt0MSwgKnBrdCA9ICZwa3QxOworICAgIGludCByZXQ7CisgICAgaW50IGluZGV4ID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdCwgdGltZXN0YW1wLCBmbGFncyk7CisgICAgaW50NjRfdCBwb3MsIHB0czsKKworICAgIC8qIGlmIGZvdW5kLCBzZWVrIHRoZXJlICovCisgICAgaWYgKGluZGV4ID49IDAgJiYKKyAgICAgICAgdGltZXN0YW1wIDw9IHN0LT5pbmRleF9lbnRyaWVzW3N0LT5uYl9pbmRleF9lbnRyaWVzIC0gMV0udGltZXN0YW1wKSB7CisgICAgICAgIHdjLT5ibG9ja19wYXJzZWQgPSAxOworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIHN0LT5pbmRleF9lbnRyaWVzW2luZGV4XS5wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIGlmIHRpbWVzdGFtcCBpcyBvdXQgb2YgYm91bmRzLCByZXR1cm4gZXJyb3IgKi8KKyAgICBpZiAodGltZXN0YW1wIDwgMCB8fCB0aW1lc3RhbXAgPj0gcy0+ZHVyYXRpb24pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOworICAgIGRvIHsKKyAgICAgICAgcmV0ID0gYXZfcmVhZF9mcmFtZShzLCBwa3QpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBwb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcHRzID0gcGt0LT5wdHM7CisgICAgICAgIGF2X2ZyZWVfcGFja2V0KHBrdCk7CisgICAgfSB3aGlsZShwdHMgPCB0aW1lc3RhbXApOworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3d2X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInd2IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2F2UGFjayIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihXVkNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHd2X3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHd2X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHd2X3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IHd2X3JlYWRfc2VlaywKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQvd3ZlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC93dmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDc0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQvd3ZlbmMuYwpAQCAtMCwwICsxLDkxIEBACisvKgorICogV2F2UGFjayBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEzIEtvbnN0YW50aW4gU2hpc2hrb3YgPGtvc3R5YS5zaGlzaGtvdkBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorCisjaW5jbHVkZSAiYXBldGFnLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJ3di5oIgorCit0eXBlZGVmIHN0cnVjdCBXdk11eENvbnRleHQgeworICAgIGludDY0X3Qgc2FtcGxlczsKK30gV3ZNdXhDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgd3Zfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqY3R4KQoreworICAgIGlmIChjdHgtPm5iX3N0cmVhbXMgPiAxIHx8CisgICAgICAgIGN0eC0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1dBVlBBQ0spIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVGhpcyBtdXhlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIFdhdlBhY2sgc3RyZWFtLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3Zfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIFd2TXV4Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIFd2SGVhZGVyIGhlYWRlcjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHBrdC0+c2l6ZSA8IFdWX0hFQURFUl9TSVpFIHx8CisgICAgICAgIChyZXQgPSBmZl93dl9wYXJzZV9oZWFkZXIoJmhlYWRlciwgcGt0LT5kYXRhKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgV2F2UGFjayBwYWNrZXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcy0+c2FtcGxlcyArPSBoZWFkZXIuc2FtcGxlczsKKworICAgIGF2aW9fd3JpdGUoY3R4LT5wYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB3dl93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqY3R4KQoreworICAgIFd2TXV4Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworCisgICAgLyogdXBkYXRlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBmaXJzdCBibG9jayAqLworICAgIGlmIChjdHgtPnBiLT5zZWVrYWJsZSAmJiBzLT5zYW1wbGVzICYmCisgICAgICAgIHMtPnNhbXBsZXMgPCBVSU5UMzJfTUFYKSB7CisgICAgICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKGN0eC0+cGIpOworICAgICAgICBhdmlvX3NlZWsoY3R4LT5wYiwgMTIsIFNFRUtfU0VUKTsKKyAgICAgICAgYXZpb193bDMyKGN0eC0+cGIsIHMtPnNhbXBsZXMpOworICAgICAgICBhdmlvX3NlZWsoY3R4LT5wYiwgcG9zLCBTRUVLX1NFVCk7CisgICAgfQorCisgICAgZmZfYXBlX3dyaXRlX3RhZyhjdHgpOworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl93dl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAid3YiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgV2F2UGFjayIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhdWRpby94LXdhdnBhY2siLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJ3diIsCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKFd2TXV4Q29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfV0FWUEFDSywKKyAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IHd2X3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSB3dl93cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgICAgID0gd3Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3hhLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQveGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzY2MWRlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3hhLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBNYXhpcyBYQSAoLnhhKSBGaWxlIERlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCBSb2JlcnQgTWFyc3RvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNYXhpcyBYQSBGaWxlIERlbXV4ZXIKKyAqIGJ5IFJvYmVydCBNYXJzdG9uIChybWFyc3RvbkBnbWFpbC5jb20pCisgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgWEEgYXVkaW8gZm9ybWF0IHNlZQorICogICBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1NYXhpc19YQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFhBMDBfVEFHIE1LVEFHKCdYJywgJ0EnLCAwLCAwKQorI2RlZmluZSBYQUkwX1RBRyBNS1RBRygnWCcsICdBJywgJ0knLCAwKQorI2RlZmluZSBYQUowX1RBRyBNS1RBRygnWCcsICdBJywgJ0onLCAwKQorCit0eXBlZGVmIHN0cnVjdCBNYXhpc1hBRGVtdXhDb250ZXh0IHsKKyAgICB1aW50MzJfdCBvdXRfc2l6ZTsKKyAgICB1aW50MzJfdCBzZW50X2J5dGVzOworfSBNYXhpc1hBRGVtdXhDb250ZXh0OworCitzdGF0aWMgaW50IHhhX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGludCBjaGFubmVscywgc3JhdGUsIGJpdHNfcGVyX3NhbXBsZTsKKyAgICBpZiAocC0+YnVmX3NpemUgPCAyNCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3dpdGNoKEFWX1JMMzIocC0+YnVmKSkgeworICAgIGNhc2UgWEEwMF9UQUc6CisgICAgY2FzZSBYQUkwX1RBRzoKKyAgICBjYXNlIFhBSjBfVEFHOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY2hhbm5lbHMgICAgICAgID0gQVZfUkwxNihwLT5idWYgKyAxMCk7CisgICAgc3JhdGUgICAgICAgICAgID0gQVZfUkwzMihwLT5idWYgKyAxMik7CisgICAgYml0c19wZXJfc2FtcGxlID0gQVZfUkwxNihwLT5idWYgKyAyMik7CisgICAgaWYgKCFjaGFubmVscyB8fCBjaGFubmVscyA+IDggfHwgIXNyYXRlIHx8IHNyYXRlID4gMTkyMDAwIHx8CisgICAgICAgIGJpdHNfcGVyX3NhbXBsZSA8IDQgfHwgYml0c19wZXJfc2FtcGxlID4gMzIpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKK30KKworc3RhdGljIGludCB4YV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgTWF4aXNYQURlbXV4Q29udGV4dCAqeGEgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgLypTZXQgdXAgdGhlIFhBIEF1ZGlvIERlY29kZXIqLworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9NQVhJU19YQTsKKyAgICBhdmlvX3NraXAocGIsIDQpOyAgICAgICAvKiBTa2lwIHRoZSBYQSBJRCAqLworICAgIHhhLT5vdXRfc2l6ZSAgICAgICAgICAgID0gIGF2aW9fcmwzMihwYik7CisgICAgYXZpb19za2lwKHBiLCAyKTsgICAgICAgLyogU2tpcCB0aGUgdGFnICovCisgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgID0gYXZpb19ybDMyKHBiKTsKKyAgICBhdmlvX3NraXAocGIsIDQpOyAgICAgICAvKiBTa2lwIGF2ZXJhZ2UgYnl0ZSByYXRlICovCisgICAgYXZpb19za2lwKHBiLCAyKTsgICAgICAgLyogU2tpcCBibG9jayBhbGlnbiAqLworICAgIGF2aW9fc2tpcChwYiwgMik7ICAgICAgIC8qIFNraXAgYml0cy1wZXItc2FtcGxlICovCisKKyAgICBpZiAoIXN0LT5jb2RlYy0+Y2hhbm5lbHMgfHwgIXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IGF2X2NsaXAoMTVMTCAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiA4ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIC8gMjgsIDAsIElOVF9NQVgpOworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIHN0LT5zdGFydF90aW1lID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhhX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNYXhpc1hBRGVtdXhDb250ZXh0ICp4YSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVuc2lnbmVkIGludCBwYWNrZXRfc2l6ZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHhhLT5zZW50X2J5dGVzID49IHhhLT5vdXRfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIC8qIDEgYnl0ZSBoZWFkZXIgYW5kIDE0IGJ5dGVzIHdvcnRoIG9mIHNhbXBsZXMgKiBudW1iZXIgY2hhbm5lbHMgcGVyIGJsb2NrICovCisgICAgcGFja2V0X3NpemUgPSAxNSpzdC0+Y29kZWMtPmNoYW5uZWxzOworCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBwYWNrZXRfc2l6ZSk7CisgICAgaWYocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIHhhLT5zZW50X2J5dGVzICs9IHBhY2tldF9zaXplOworICAgIHBrdC0+ZHVyYXRpb24gPSAyODsKKworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfeGFfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAieGEiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNYXhpcyBYQSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNYXhpc1hBRGVtdXhDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB4YV9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSB4YV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSB4YV9yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQveG12LmMgYi9mZm1wZWcvbGliYXZmb3JtYXQveG12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhYzRkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC94bXYuYwpAQCAtMCwwICsxLDU3OCBAQAorLyoKKyAqIE1pY3Jvc29mdCBYTVYgZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDExIFN2ZW4gSGVzc2UgPGRybWNjb3lAZHJtY2NveS5kZT4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYXR0aGV3IEhvb3BzIDxjbG9uZTI3MjdAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNaWNyb3NvZnQgWE1WIGRlbXV4ZXIKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyaWZmLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKKy8qKiBUaGUgbWluIHNpemUgb2YgYW4gWE1WIGhlYWRlci4gKi8KKyNkZWZpbmUgWE1WX01JTl9IRUFERVJfU0laRSAzNgorCisvKiogQXVkaW8gZmxhZzogQURQQ00nZCA1LjEgc3RyZWFtLCBmcm9udCBsZWZ0IC8gcmlnaHQgY2hhbm5lbHMgKi8KKyNkZWZpbmUgWE1WX0FVRElPX0FEUENNNTFfRlJPTlRMRUZUUklHSFQgMQorLyoqIEF1ZGlvIGZsYWc6IEFEUENNJ2QgNS4xIHN0cmVhbSwgZnJvbnQgY2VudGVyIC8gbG93IGZyZXF1ZW5jeSBjaGFubmVscyAqLworI2RlZmluZSBYTVZfQVVESU9fQURQQ001MV9GUk9OVENFTlRFUkxPVyAyCisvKiogQXVkaW8gZmxhZzogQURQQ00nZCA1LjEgc3RyZWFtLCByZWFyIGxlZnQgLyByaWdodCBjaGFubmVscyAqLworI2RlZmluZSBYTVZfQVVESU9fQURQQ001MV9SRUFSTEVGVFJJR0hUICA0CisKKy8qKiBBdWRpbyBmbGFnOiBBbnkgb2YgdGhlIEFEUENNJ2QgNS4xIHN0cmVhbSBmbGFncy4gKi8KKyNkZWZpbmUgWE1WX0FVRElPX0FEUENNNTEgKFhNVl9BVURJT19BRFBDTTUxX0ZST05UTEVGVFJJR0hUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1WX0FVRElPX0FEUENNNTFfRlJPTlRDRU5URVJMT1cgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTVZfQVVESU9fQURQQ001MV9SRUFSTEVGVFJJR0hUKQorCisjZGVmaW5lIFhNVl9CTE9DS19BTElHTl9TSVpFIDM2CisKKy8qKiBBIHZpZGVvIHBhY2tldCB3aXRoIGFuIFhNViBmaWxlLiAqLwordHlwZWRlZiBzdHJ1Y3QgWE1WVmlkZW9QYWNrZXQgeworICAgIGludCBzdHJlYW1faW5kZXg7IC8vLzwgVGhlIGRlY29kZXIgc3RyZWFtIGluZGV4IGZvciB0aGlzIHZpZGVvIHBhY2tldC4KKworICAgIHVpbnQzMl90IGRhdGFfc2l6ZTsgICAvLy88IFRoZSBzaXplIG9mIHRoZSByZW1haW5pbmcgdmlkZW8gZGF0YS4KKyAgICB1aW50NjRfdCBkYXRhX29mZnNldDsgLy8vPCBUaGUgb2Zmc2V0IG9mIHRoZSB2aWRlbyBkYXRhIHdpdGhpbiB0aGUgZmlsZS4KKworICAgIHVpbnQzMl90IGN1cnJlbnRfZnJhbWU7IC8vLzwgVGhlIGN1cnJlbnQgZnJhbWUgd2l0aGluIHRoaXMgdmlkZW8gcGFja2V0LgorICAgIHVpbnQzMl90IGZyYW1lX2NvdW50OyAgIC8vLzwgVGhlIGFtb3VudCBvZiBmcmFtZXMgd2l0aGluIHRoaXMgdmlkZW8gcGFja2V0LgorCisgICAgaW50ICAgICBoYXNfZXh0cmFkYXRhOyAvLy88IERvZXMgdGhlIHZpZGVvIHBhY2tldCBjb250YWluIGV4dHJhIGRhdGE/CisgICAgdWludDhfdCBleHRyYWRhdGFbNF07ICAvLy88IFRoZSBleHRyYSBkYXRhCisKKyAgICBpbnQ2NF90IGxhc3RfcHRzOyAvLy88IFBUUyBvZiB0aGUgbGFzdCB2aWRlbyBmcmFtZS4KKyAgICBpbnQ2NF90IHB0czsgICAgICAvLy88IFBUUyBvZiB0aGUgbW9zdCBjdXJyZW50IHZpZGVvIGZyYW1lLgorfSBYTVZWaWRlb1BhY2tldDsKKworLyoqIEFuIGF1ZGlvIHBhY2tldCB3aXRoIGFuIFhNViBmaWxlLiAqLwordHlwZWRlZiBzdHJ1Y3QgWE1WQXVkaW9QYWNrZXQgeworICAgIGludCBzdHJlYW1faW5kZXg7IC8vLzwgVGhlIGRlY29kZXIgc3RyZWFtIGluZGV4IGZvciB0aGlzIGF1ZGlvIHBhY2tldC4KKworICAgIC8qIFN0cmVhbSBmb3JtYXQgcHJvcGVydGllcy4gKi8KKyAgICB1aW50MTZfdCBjb21wcmVzc2lvbjsgICAgIC8vLzwgVGhlIHR5cGUgb2YgY29tcHJlc3Npb24uCisgICAgdWludDE2X3QgY2hhbm5lbHM7ICAgICAgICAvLy88IE51bWJlciBvZiBjaGFubmVscy4KKyAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZTsgICAgIC8vLzwgU2FtcGxpbmcgcmF0ZS4KKyAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGU7IC8vLzwgQml0cyBwZXIgY29tcHJlc3NlZCBzYW1wbGUuCisgICAgdWludDMyX3QgYml0X3JhdGU7ICAgICAgICAvLy88IEJpdHMgb2YgY29tcHJlc3NlZCBkYXRhIHBlciBzZWNvbmQuCisgICAgdWludDE2X3QgZmxhZ3M7ICAgICAgICAgICAvLy88IEZsYWdzCisgICAgdW5zaWduZWQgYmxvY2tfYWxpZ247ICAgICAvLy88IEJ5dGVzIHBlciBjb21wcmVzc2VkIGJsb2NrLgorICAgIHVpbnQxNl90IGJsb2NrX3NhbXBsZXM7ICAgLy8vPCBEZWNvbXByZXNzZWQgc2FtcGxlcyBwZXIgY29tcHJlc3NlZCBibG9jay4KKworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkOyAvLy88IFRoZSBjb2RlYyBJRCBvZiB0aGUgY29tcHJlc3Npb24gc2NoZW1lLgorCisgICAgdWludDMyX3QgZGF0YV9zaXplOyAgIC8vLzwgVGhlIHNpemUgb2YgdGhlIHJlbWFpbmluZyBhdWRpbyBkYXRhLgorICAgIHVpbnQ2NF90IGRhdGFfb2Zmc2V0OyAvLy88IFRoZSBvZmZzZXQgb2YgdGhlIGF1ZGlvIGRhdGEgd2l0aGluIHRoZSBmaWxlLgorCisgICAgdWludDMyX3QgZnJhbWVfc2l6ZTsgLy8vPCBOdW1iZXIgb2YgYnl0ZXMgdG8gcHV0IGludG8gYW4gYXVkaW8gZnJhbWUuCisKKyAgICB1aW50NjRfdCBibG9ja19jb3VudDsgLy8vPCBSdW5uaW5nIGNvdW50ZXIgb2YgZGVjb21wcmVzc2VkIGF1ZGlvIGJsb2NrLgorfSBYTVZBdWRpb1BhY2tldDsKKworLyoqIENvbnRleHQgZm9yIGRlbXV4aW5nIGFuIFhNViBmaWxlLiAqLwordHlwZWRlZiBzdHJ1Y3QgWE1WRGVtdXhDb250ZXh0IHsKKyAgICB1aW50MTZfdCBhdWRpb190cmFja19jb3VudDsgLy8vPCBOdW1iZXIgb2YgYXVkaW8gdHJhY2sgaW4gdGhpcyBmaWxlLgorCisgICAgdWludDMyX3QgdGhpc19wYWNrZXRfc2l6ZTsgLy8vPCBTaXplIG9mIHRoZSBjdXJyZW50IHBhY2tldC4KKyAgICB1aW50MzJfdCBuZXh0X3BhY2tldF9zaXplOyAvLy88IFNpemUgb2YgdGhlIG5leHQgcGFja2V0LgorCisgICAgdWludDY0X3QgdGhpc19wYWNrZXRfb2Zmc2V0OyAvLy88IE9mZnNldCBvZiB0aGUgY3VycmVudCBwYWNrZXQuCisgICAgdWludDY0X3QgbmV4dF9wYWNrZXRfb2Zmc2V0OyAvLy88IE9mZnNldCBvZiB0aGUgbmV4dCBwYWNrZXQuCisKKyAgICB1aW50MTZfdCBjdXJyZW50X3N0cmVhbTsgLy8vPCBUaGUgaW5kZXggb2YgdGhlIHN0cmVhbSBjdXJyZW50bHkgaGFuZGxpbmcuCisgICAgdWludDE2X3Qgc3RyZWFtX2NvdW50OyAgIC8vLzwgVGhlIG51bWJlciBvZiBzdHJlYW1zIGluIHRoaXMgZmlsZS4KKworICAgIFhNVlZpZGVvUGFja2V0ICB2aWRlbzsgLy8vPCBUaGUgdmlkZW8gcGFja2V0IGNvbnRhaW5lZCBpbiBlYWNoIHBhY2tldC4KKyAgICBYTVZBdWRpb1BhY2tldCAqYXVkaW87IC8vLzwgVGhlIGF1ZGlvIHBhY2tldHMgY29udGFpbmVkIGluIGVhY2ggcGFja2V0LgorfSBYTVZEZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgeG12X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIHVpbnQzMl90IGZpbGVfdmVyc2lvbjsKKworICAgIGlmIChwLT5idWZfc2l6ZSA8IFhNVl9NSU5fSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiAwOworCisgICAgZmlsZV92ZXJzaW9uID0gQVZfUkwzMihwLT5idWYgKyAxNik7CisgICAgaWYgKChmaWxlX3ZlcnNpb24gPT0gMCkgfHwgKGZpbGVfdmVyc2lvbiA+IDQpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghbWVtY21wKHAtPmJ1ZiArIDEyLCAieG9iWCIsIDQpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4bXZfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgWE1WRGVtdXhDb250ZXh0ICp4bXYgPSBzLT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmeG12LT5hdWRpbyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4bXZfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFhNVkRlbXV4Q29udGV4dCAqeG12ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICAgICAqcGIgID0gcy0+cGI7CisgICAgQVZTdHJlYW0gICAgICAgICp2c3QgPSBOVUxMOworCisgICAgdWludDMyX3QgZmlsZV92ZXJzaW9uOworICAgIHVpbnQzMl90IHRoaXNfcGFja2V0X3NpemU7CisgICAgdWludDE2X3QgYXVkaW9fdHJhY2s7CisgICAgaW50IHJldDsKKworICAgIGF2aW9fc2tpcChwYiwgNCk7IC8qIE5leHQgcGFja2V0IHNpemUgKi8KKworICAgIHRoaXNfcGFja2V0X3NpemUgPSBhdmlvX3JsMzIocGIpOworCisgICAgYXZpb19za2lwKHBiLCA0KTsgLyogTWF4IHBhY2tldCBzaXplICovCisgICAgYXZpb19za2lwKHBiLCA0KTsgLyogInhvYlgiICovCisKKyAgICBmaWxlX3ZlcnNpb24gPSBhdmlvX3JsMzIocGIpOworICAgIGlmICgoZmlsZV92ZXJzaW9uICE9IDQpICYmIChmaWxlX3ZlcnNpb24gIT0gMikpCisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiVW5jb21tb24gdmVyc2lvbiAlIlBSSXUzMiIiLCBmaWxlX3ZlcnNpb24pOworCisKKyAgICAvKiBWaWRlbyB0cmFjayAqLworCisgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXZzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCAzMiwgMSwgMTAwMCk7CisKKyAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9XTVYyOworICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSBNS0JFVEFHKCdXJywgJ00nLCAnVicsICcyJyk7CisgICAgdnN0LT5jb2RlYy0+d2lkdGggICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgdnN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcmwzMihwYik7CisKKyAgICB2c3QtPmR1cmF0aW9uICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKKworICAgIHhtdi0+dmlkZW8uc3RyZWFtX2luZGV4ID0gdnN0LT5pbmRleDsKKworICAgIC8qIEF1ZGlvIHRyYWNrcyAqLworCisgICAgeG12LT5hdWRpb190cmFja19jb3VudCA9IGF2aW9fcmwxNihwYik7CisKKyAgICBhdmlvX3NraXAocGIsIDIpOyAvKiBVbmtub3duIChwYWRkaW5nPykgKi8KKworICAgIHhtdi0+YXVkaW8gPSBhdl9tYWxsb2NfYXJyYXkoeG12LT5hdWRpb190cmFja19jb3VudCwgc2l6ZW9mKFhNVkF1ZGlvUGFja2V0KSk7CisgICAgaWYgKCF4bXYtPmF1ZGlvKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvciAoYXVkaW9fdHJhY2sgPSAwOyBhdWRpb190cmFjayA8IHhtdi0+YXVkaW9fdHJhY2tfY291bnQ7IGF1ZGlvX3RyYWNrKyspIHsKKyAgICAgICAgWE1WQXVkaW9QYWNrZXQgKnBhY2tldCA9ICZ4bXYtPmF1ZGlvW2F1ZGlvX3RyYWNrXTsKKyAgICAgICAgQVZTdHJlYW0gKmFzdCA9IE5VTEw7CisKKyAgICAgICAgcGFja2V0LT5jb21wcmVzc2lvbiAgICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICBwYWNrZXQtPmNoYW5uZWxzICAgICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIHBhY2tldC0+c2FtcGxlX3JhdGUgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgcGFja2V0LT5iaXRzX3Blcl9zYW1wbGUgPSBhdmlvX3JsMTYocGIpOworICAgICAgICBwYWNrZXQtPmZsYWdzICAgICAgICAgICA9IGF2aW9fcmwxNihwYik7CisKKyAgICAgICAgcGFja2V0LT5iaXRfcmF0ZSAgICAgID0gcGFja2V0LT5iaXRzX3Blcl9zYW1wbGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPnNhbXBsZV9yYXRlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5jaGFubmVsczsKKyAgICAgICAgcGFja2V0LT5ibG9ja19hbGlnbiAgID0gWE1WX0JMT0NLX0FMSUdOX1NJWkUgKiBwYWNrZXQtPmNoYW5uZWxzOworICAgICAgICBwYWNrZXQtPmJsb2NrX3NhbXBsZXMgPSA2NDsKKyAgICAgICAgcGFja2V0LT5jb2RlY19pZCAgICAgID0gZmZfd2F2X2NvZGVjX2dldF9pZChwYWNrZXQtPmNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldC0+Yml0c19wZXJfc2FtcGxlKTsKKworICAgICAgICBwYWNrZXQtPnN0cmVhbV9pbmRleCA9IC0xOworCisgICAgICAgIHBhY2tldC0+ZnJhbWVfc2l6ZSAgPSAwOworICAgICAgICBwYWNrZXQtPmJsb2NrX2NvdW50ID0gMDsKKworICAgICAgICAvKiBUT0RPOiBBRFBDTSdkIDUuMSBzb3VuZCBpcyBlbmNvZGVkIGluIHRocmVlIHNlcGFyYXRlIHN0cmVhbXMuCisgICAgICAgICAqICAgICAgIFRob3NlIG5lZWQgdG8gYmUgaW50ZXJsZWF2ZWQgdG8gYSBwcm9wZXIgNS4xIHN0cmVhbS4gKi8KKyAgICAgICAgaWYgKHBhY2tldC0+ZmxhZ3MgJiBYTVZfQVVESU9fQURQQ001MSkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVuc3VwcG9ydGVkIDUuMSBBRFBDTSBhdWRpbyBzdHJlYW0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDB4JTA0WClcbiIsIHBhY2tldC0+ZmxhZ3MpOworCisgICAgICAgIGlmICghcGFja2V0LT5jaGFubmVscyB8fCAhcGFja2V0LT5zYW1wbGVfcmF0ZSB8fAorICAgICAgICAgICAgIHBhY2tldC0+Y2hhbm5lbHMgPj0gVUlOVDE2X01BWCAvIFhNVl9CTE9DS19BTElHTl9TSVpFKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYXJhbWV0ZXJzIGZvciBhdWRpbyB0cmFjayAlIlBSSXUxNiIuXG4iLAorICAgICAgICAgICAgICAgICAgIGF1ZGlvX3RyYWNrKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBhc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICBpZiAoIWFzdCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBwYWNrZXQtPmNvZGVjX2lkOworICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190YWcgICAgICAgICAgICAgPSBwYWNrZXQtPmNvbXByZXNzaW9uOworICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgICAgICAgPSBwYWNrZXQtPmNoYW5uZWxzOworICAgICAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSBwYWNrZXQtPnNhbXBsZV9yYXRlOworICAgICAgICBhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBwYWNrZXQtPmJpdHNfcGVyX3NhbXBsZTsKKyAgICAgICAgYXN0LT5jb2RlYy0+Yml0X3JhdGUgICAgICAgICAgICAgID0gcGFja2V0LT5iaXRfcmF0ZTsKKyAgICAgICAgYXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gICAgICAgICAgID0gMzYgKiBwYWNrZXQtPmNoYW5uZWxzOworCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCAzMiwgcGFja2V0LT5ibG9ja19zYW1wbGVzLCBwYWNrZXQtPnNhbXBsZV9yYXRlKTsKKworICAgICAgICBwYWNrZXQtPnN0cmVhbV9pbmRleCA9IGFzdC0+aW5kZXg7CisKKyAgICAgICAgYXN0LT5kdXJhdGlvbiA9IHZzdC0+ZHVyYXRpb247CisgICAgfQorCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBwYWNrZXQgY29udGV4dCAqLworCisgICAgeG12LT5uZXh0X3BhY2tldF9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgIHhtdi0+bmV4dF9wYWNrZXRfc2l6ZSAgID0gdGhpc19wYWNrZXRfc2l6ZSAtIHhtdi0+bmV4dF9wYWNrZXRfb2Zmc2V0OworICAgIHhtdi0+c3RyZWFtX2NvdW50ICAgICAgID0geG12LT5hdWRpb190cmFja19jb3VudCArIDE7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICB4bXZfcmVhZF9jbG9zZShzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB4bXZfcmVhZF9leHRyYWRhdGEodWludDhfdCAqZXh0cmFkYXRhLCBBVklPQ29udGV4dCAqcGIpCit7CisgICAgLyogUmVhZCB0aGUgWE1WIGV4dHJhZGF0YSAqLworCisgICAgdWludDMyX3QgZGF0YSA9IGF2aW9fcmwzMihwYik7CisKKyAgICBpbnQgbXNwZWxfYml0ICAgICAgICA9ICEhKGRhdGEgJiAweDAxKTsKKyAgICBpbnQgbG9vcF9maWx0ZXIgICAgICA9ICEhKGRhdGEgJiAweDAyKTsKKyAgICBpbnQgYWJ0X2ZsYWcgICAgICAgICA9ICEhKGRhdGEgJiAweDA0KTsKKyAgICBpbnQgal90eXBlX2JpdCAgICAgICA9ICEhKGRhdGEgJiAweDA4KTsKKyAgICBpbnQgdG9wX2xlZnRfbXZfZmxhZyA9ICEhKGRhdGEgJiAweDEwKTsKKyAgICBpbnQgcGVyX21iX3JsX2JpdCAgICA9ICEhKGRhdGEgJiAweDIwKTsKKyAgICBpbnQgc2xpY2VfY291bnQgICAgICA9IChkYXRhID4+IDYpICYgNzsKKworICAgIC8qIFdyaXRlIGl0IGJhY2sgYXMgc3RhbmRhcmQgV01WMiBleHRyYWRhdGEgKi8KKworICAgIGRhdGEgPSAwOworCisgICAgZGF0YSB8PSBtc3BlbF9iaXQgICAgICAgIDw8IDE1OworICAgIGRhdGEgfD0gbG9vcF9maWx0ZXIgICAgICA8PCAxNDsKKyAgICBkYXRhIHw9IGFidF9mbGFnICAgICAgICAgPDwgMTM7CisgICAgZGF0YSB8PSBqX3R5cGVfYml0ICAgICAgIDw8IDEyOworICAgIGRhdGEgfD0gdG9wX2xlZnRfbXZfZmxhZyA8PCAxMTsKKyAgICBkYXRhIHw9IHBlcl9tYl9ybF9iaXQgICAgPDwgMTA7CisgICAgZGF0YSB8PSBzbGljZV9jb3VudCAgICAgIDw8ICA3OworCisgICAgQVZfV0IzMihleHRyYWRhdGEsIGRhdGEpOworfQorCitzdGF0aWMgaW50IHhtdl9wcm9jZXNzX3BhY2tldF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFhNVkRlbXV4Q29udGV4dCAqeG12ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICAgICAqcGIgID0gcy0+cGI7CisKKyAgICB1aW50OF90ICBkYXRhWzhdOworICAgIHVpbnQxNl90IGF1ZGlvX3RyYWNrOworICAgIHVpbnQ2NF90IGRhdGFfb2Zmc2V0OworCisgICAgLyogTmV4dCBwYWNrZXQgc2l6ZSAqLworICAgIHhtdi0+bmV4dF9wYWNrZXRfc2l6ZSA9IGF2aW9fcmwzMihwYik7CisKKyAgICAvKiBQYWNrZXQgdmlkZW8gaGVhZGVyICovCisKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBkYXRhLCA4KSAhPSA4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgeG12LT52aWRlby5kYXRhX3NpemUgICAgID0gQVZfUkwzMihkYXRhKSAmIDB4MDA3RkZGRkY7CisKKyAgICB4bXYtPnZpZGVvLmN1cnJlbnRfZnJhbWUgPSAwOworICAgIHhtdi0+dmlkZW8uZnJhbWVfY291bnQgICA9IChBVl9STDMyKGRhdGEpID4+IDIzKSAmIDB4RkY7CisKKyAgICB4bXYtPnZpZGVvLmhhc19leHRyYWRhdGEgPSAoZGF0YVszXSAmIDB4ODApICE9IDA7CisKKyAgICAvKiBBZGRpbmcgdGhlIGF1ZGlvIGRhdGEgc2l6ZXMgYW5kIHRoZSB2aWRlbyBkYXRhIHNpemUga2VlcHMgeW91IDQgYnl0ZXMKKyAgICAgKiBzaG9ydCBmb3IgZXZlcnkgYXVkaW8gdHJhY2suIEJ1dCBhcyBwbGF5aW5nIGFyb3VuZCB3aXRoIFhNViBmaWxlcyB3aXRoCisgICAgICogQURQQ00gYXVkaW8gc2hvd2VkLCB0YWtpbmcgdGhlIGV4dHJhIDQgYnl0ZXMgZnJvbSB0aGUgYXVkaW8gZGF0YSBnaXZlcworICAgICAqIHlvdSBlaXRoZXIgY29tcGxldGVseSBkaXN0b3J0ZWQgYXVkaW8gb3IgY2xpY2sgKHdoZW4gc2tpcHBpbmcgdGhlCisgICAgICogcmVtYWluaW5nIDY4IGJ5dGVzIG9mIHRoZSBBRFBDTSBibG9jaykuIFN1YnRyYWN0aW5nIDQgYnl0ZXMgZm9yIGV2ZXJ5CisgICAgICogYXVkaW8gdHJhY2sgZnJvbSB0aGUgdmlkZW8gZGF0YSB3b3JrcyBhdCBsZWFzdCBmb3IgdGhlIGF1ZGlvLiBQcm9iYWJseQorICAgICAqIHNvbWUgYWxpZ25tZW50IHRoaW5nPworICAgICAqIFRoZSB2aWRlbyBkYXRhIGhhcyAoYWx3YXlzPykgbG90cyBvZiBwYWRkaW5nLCBzbyBpdCBzaG91bGQgd29yayBvdXQuLi4KKyAgICAgKi8KKyAgICB4bXYtPnZpZGVvLmRhdGFfc2l6ZSAtPSB4bXYtPmF1ZGlvX3RyYWNrX2NvdW50ICogNDsKKworICAgIHhtdi0+Y3VycmVudF9zdHJlYW0gPSAwOworICAgIGlmICgheG12LT52aWRlby5mcmFtZV9jb3VudCkgeworICAgICAgICB4bXYtPnZpZGVvLmZyYW1lX2NvdW50ID0gMTsKKyAgICAgICAgeG12LT5jdXJyZW50X3N0cmVhbSAgICA9IHhtdi0+c3RyZWFtX2NvdW50ID4gMTsKKyAgICB9CisKKyAgICAvKiBQYWNrZXQgYXVkaW8gaGVhZGVyICovCisKKyAgICBmb3IgKGF1ZGlvX3RyYWNrID0gMDsgYXVkaW9fdHJhY2sgPCB4bXYtPmF1ZGlvX3RyYWNrX2NvdW50OyBhdWRpb190cmFjaysrKSB7CisgICAgICAgIFhNVkF1ZGlvUGFja2V0ICpwYWNrZXQgPSAmeG12LT5hdWRpb1thdWRpb190cmFja107CisKKyAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgZGF0YSwgNCkgIT0gNCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAgICAgcGFja2V0LT5kYXRhX3NpemUgPSBBVl9STDMyKGRhdGEpICYgMHgwMDdGRkZGRjsKKyAgICAgICAgaWYgKChwYWNrZXQtPmRhdGFfc2l6ZSA9PSAwKSAmJiAoYXVkaW9fdHJhY2sgIT0gMCkpCisgICAgICAgICAgICAvKiBUaGlzIGhhcHBlbnMgd2hlbiBJIGNyZWF0ZSBhbiBYTVYgd2l0aCBzZXZlcmFsIGlkZW50aWNhbCBhdWRpbworICAgICAgICAgICAgICogc3RyZWFtcy4gRnJvbSB0aGUgc2l6ZSBjYWxjdWxhdGlvbnMsIGR1cGxpY2F0aW5nIHRoZSBwcmV2aW91cworICAgICAgICAgICAgICogc3RyZWFtJ3Mgc2l6ZSB3b3JrcyBvdXQsIGJ1dCB0aGUgdHJhY2sgZGF0YSBpdHNlbGYgaXMgc2lsZW50LgorICAgICAgICAgICAgICogTWF5YmUgdGhpcyBzaG91bGQgYWxzbyByZWRpcmVjdCB0aGUgb2Zmc2V0IHRvIHRoZSBwcmV2aW91cyB0cmFjaz8KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcGFja2V0LT5kYXRhX3NpemUgPSB4bXYtPmF1ZGlvW2F1ZGlvX3RyYWNrIC0gMV0uZGF0YV9zaXplOworCisgICAgICAgIC8qIENhcnZlIHVwIHRoZSBhdWRpbyBkYXRhIGluIGZyYW1lX2NvdW50IHNsaWNlcyAqLworICAgICAgICBwYWNrZXQtPmZyYW1lX3NpemUgID0gcGFja2V0LT5kYXRhX3NpemUgIC8geG12LT52aWRlby5mcmFtZV9jb3VudDsKKyAgICAgICAgcGFja2V0LT5mcmFtZV9zaXplIC09IHBhY2tldC0+ZnJhbWVfc2l6ZSAlIHBhY2tldC0+YmxvY2tfYWxpZ247CisgICAgfQorCisgICAgLyogUGFja2V0IGRhdGEgb2Zmc2V0cyAqLworCisgICAgZGF0YV9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworCisgICAgeG12LT52aWRlby5kYXRhX29mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgIGRhdGFfb2Zmc2V0ICs9IHhtdi0+dmlkZW8uZGF0YV9zaXplOworCisgICAgZm9yIChhdWRpb190cmFjayA9IDA7IGF1ZGlvX3RyYWNrIDwgeG12LT5hdWRpb190cmFja19jb3VudDsgYXVkaW9fdHJhY2srKykgeworICAgICAgICB4bXYtPmF1ZGlvW2F1ZGlvX3RyYWNrXS5kYXRhX29mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgICAgICBkYXRhX29mZnNldCArPSB4bXYtPmF1ZGlvW2F1ZGlvX3RyYWNrXS5kYXRhX3NpemU7CisgICAgfQorCisgICAgLyogVmlkZW8gZnJhbWVzIGhlYWRlciAqLworCisgICAgLyogUmVhZCBuZXcgdmlkZW8gZXh0cmEgZGF0YSAqLworICAgIGlmICh4bXYtPnZpZGVvLmRhdGFfc2l6ZSA+IDApIHsKKyAgICAgICAgaWYgKHhtdi0+dmlkZW8uaGFzX2V4dHJhZGF0YSkgeworICAgICAgICAgICAgeG12X3JlYWRfZXh0cmFkYXRhKHhtdi0+dmlkZW8uZXh0cmFkYXRhLCBwYik7CisKKyAgICAgICAgICAgIHhtdi0+dmlkZW8uZGF0YV9zaXplICAgLT0gNDsKKyAgICAgICAgICAgIHhtdi0+dmlkZW8uZGF0YV9vZmZzZXQgKz0gNDsKKworICAgICAgICAgICAgaWYgKHhtdi0+dmlkZW8uc3RyZWFtX2luZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBBVlN0cmVhbSAqdnN0ID0gcy0+c3RyZWFtc1t4bXYtPnZpZGVvLnN0cmVhbV9pbmRleF07CisKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKHhtdi0+dmlkZW8uc3RyZWFtX2luZGV4IDwgcy0+bmJfc3RyZWFtcyk7CisKKyAgICAgICAgICAgICAgICBpZiAodnN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUodnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKKworICAgICAgICAgICAgICAgICAgICBmZl9hbGxvY19leHRyYWRhdGEodnN0LT5jb2RlYywgNCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWVtY3B5KHZzdC0+Y29kZWMtPmV4dHJhZGF0YSwgeG12LT52aWRlby5leHRyYWRhdGEsIDQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeG12X2ZldGNoX25ld19wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFhNVkRlbXV4Q29udGV4dCAqeG12ID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICAgICAqcGIgID0gcy0+cGI7CisgICAgaW50IHJlc3VsdDsKKworICAgIGlmICh4bXYtPnRoaXNfcGFja2V0X29mZnNldCA9PSB4bXYtPm5leHRfcGFja2V0X29mZnNldCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgLyogU2VlayB0byBpdCAqLworICAgIHhtdi0+dGhpc19wYWNrZXRfb2Zmc2V0ID0geG12LT5uZXh0X3BhY2tldF9vZmZzZXQ7CisgICAgaWYgKGF2aW9fc2VlayhwYiwgeG12LT50aGlzX3BhY2tldF9vZmZzZXQsIFNFRUtfU0VUKSAhPSB4bXYtPnRoaXNfcGFja2V0X29mZnNldCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIC8qIFVwZGF0ZSB0aGUgc2l6ZSAqLworICAgIHhtdi0+dGhpc19wYWNrZXRfc2l6ZSA9IHhtdi0+bmV4dF9wYWNrZXRfc2l6ZTsKKyAgICBpZiAoeG12LT50aGlzX3BhY2tldF9zaXplIDwgKDEyICsgeG12LT5hdWRpb190cmFja19jb3VudCAqIDQpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgLyogUHJvY2VzcyB0aGUgaGVhZGVyICovCisgICAgcmVzdWx0ID0geG12X3Byb2Nlc3NfcGFja2V0X2hlYWRlcihzKTsKKyAgICBpZiAocmVzdWx0KQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KKyAgICB4bXYtPm5leHRfcGFja2V0X29mZnNldCA9IHhtdi0+dGhpc19wYWNrZXRfb2Zmc2V0ICsgeG12LT50aGlzX3BhY2tldF9zaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeG12X2ZldGNoX2F1ZGlvX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCwgdWludDMyX3Qgc3RyZWFtKQoreworICAgIFhNVkRlbXV4Q29udGV4dCAqeG12ICAgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgICAgICpwYiAgICA9IHMtPnBiOworICAgIFhNVkF1ZGlvUGFja2V0ICAqYXVkaW8gPSAmeG12LT5hdWRpb1tzdHJlYW1dOworCisgICAgdWludDMyX3QgZGF0YV9zaXplOworICAgIHVpbnQzMl90IGJsb2NrX2NvdW50OworICAgIGludCByZXN1bHQ7CisKKyAgICAvKiBTZWVrIHRvIGl0ICovCisgICAgaWYgKGF2aW9fc2VlayhwYiwgYXVkaW8tPmRhdGFfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gYXVkaW8tPmRhdGFfb2Zmc2V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgaWYgKCh4bXYtPnZpZGVvLmN1cnJlbnRfZnJhbWUgKyAxKSA8IHhtdi0+dmlkZW8uZnJhbWVfY291bnQpCisgICAgICAgIC8qIE5vdCB0aGUgbGFzdCBmcmFtZSwgZ2V0IGF0IG1vc3QgZnJhbWVfc2l6ZSBieXRlcy4gKi8KKyAgICAgICAgZGF0YV9zaXplID0gRkZNSU4oYXVkaW8tPmZyYW1lX3NpemUsIGF1ZGlvLT5kYXRhX3NpemUpOworICAgIGVsc2UKKyAgICAgICAgLyogTGFzdCBmcmFtZSwgZ2V0IHRoZSByZXN0LiAqLworICAgICAgICBkYXRhX3NpemUgPSBhdWRpby0+ZGF0YV9zaXplOworCisgICAgLyogUmVhZCB0aGUgcGFja2V0ICovCisgICAgcmVzdWx0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBkYXRhX3NpemUpOworICAgIGlmIChyZXN1bHQgPD0gMCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gYXVkaW8tPnN0cmVhbV9pbmRleDsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgUFRTICovCisKKyAgICBibG9ja19jb3VudCA9IGRhdGFfc2l6ZSAvIGF1ZGlvLT5ibG9ja19hbGlnbjsKKworICAgIHBrdC0+ZHVyYXRpb24gPSBibG9ja19jb3VudDsKKyAgICBwa3QtPnB0cyAgICAgID0gYXVkaW8tPmJsb2NrX2NvdW50OworICAgIHBrdC0+ZHRzICAgICAgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIGF1ZGlvLT5ibG9ja19jb3VudCArPSBibG9ja19jb3VudDsKKworICAgIC8qIEFkdmFuY2Ugb2Zmc2V0ICovCisgICAgYXVkaW8tPmRhdGFfc2l6ZSAgIC09IGRhdGFfc2l6ZTsKKyAgICBhdWRpby0+ZGF0YV9vZmZzZXQgKz0gZGF0YV9zaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeG12X2ZldGNoX3ZpZGVvX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBYTVZEZW11eENvbnRleHQgKnhtdiAgID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICAgICAqcGIgICAgPSBzLT5wYjsKKyAgICBYTVZWaWRlb1BhY2tldCAgKnZpZGVvID0gJnhtdi0+dmlkZW87CisKKyAgICBpbnQgcmVzdWx0OworICAgIHVpbnQzMl90IGZyYW1lX2hlYWRlcjsKKyAgICB1aW50MzJfdCBmcmFtZV9zaXplLCBmcmFtZV90aW1lc3RhbXA7CisgICAgdWludDhfdCAqZGF0YSwgKmVuZDsKKworICAgIC8qIFNlZWsgdG8gaXQgKi8KKyAgICBpZiAoYXZpb19zZWVrKHBiLCB2aWRlby0+ZGF0YV9vZmZzZXQsIFNFRUtfU0VUKSAhPSB2aWRlby0+ZGF0YV9vZmZzZXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAvKiBSZWFkIHRoZSBmcmFtZSBoZWFkZXIgKi8KKyAgICBmcmFtZV9oZWFkZXIgPSBhdmlvX3JsMzIocGIpOworCisgICAgZnJhbWVfc2l6ZSAgICAgID0gKGZyYW1lX2hlYWRlciAmIDB4MUZGRkYpICogNCArIDQ7CisgICAgZnJhbWVfdGltZXN0YW1wID0gKGZyYW1lX2hlYWRlciA+PiAxNyk7CisKKyAgICBpZiAoKGZyYW1lX3NpemUgKyA0KSA+IHZpZGVvLT5kYXRhX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisKKyAgICAvKiBHZXQgdGhlIHBhY2tldCBkYXRhICovCisgICAgcmVzdWx0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBmcmFtZV9zaXplKTsKKyAgICBpZiAocmVzdWx0ICE9IGZyYW1lX3NpemUpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAvKiBDb250cmFyeSB0byBub3JtYWwgV01WMiB2aWRlbywgdGhlIGJpdCBzdHJlYW0gaW4gWE1WJ3MKKyAgICAgKiBXTVYyIGlzIGxpdHRsZS1lbmRpYW4uCisgICAgICogVE9ETzogVGhpcyBtYW51YWwgc3dhcCBpcyBvZiBjb3Vyc2Ugc3Vib3B0aW1hbC4KKyAgICAgKi8KKyAgICBmb3IgKGRhdGEgPSBwa3QtPmRhdGEsIGVuZCA9IHBrdC0+ZGF0YSArIGZyYW1lX3NpemU7IGRhdGEgPCBlbmQ7IGRhdGEgKz0gNCkKKyAgICAgICAgQVZfV0IzMihkYXRhLCBBVl9STDMyKGRhdGEpKTsKKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gdmlkZW8tPnN0cmVhbV9pbmRleDsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgUFRTICovCisKKyAgICB2aWRlby0+bGFzdF9wdHMgPSBmcmFtZV90aW1lc3RhbXAgKyB2aWRlby0+cHRzOworCisgICAgcGt0LT5kdXJhdGlvbiA9IDA7CisgICAgcGt0LT5wdHMgICAgICA9IHZpZGVvLT5sYXN0X3B0czsKKyAgICBwa3QtPmR0cyAgICAgID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICB2aWRlby0+cHRzICs9IGZyYW1lX3RpbWVzdGFtcDsKKworICAgIC8qIEtleWZyYW1lPyAqLworICAgIHBrdC0+ZmxhZ3MgPSAocGt0LT5kYXRhWzBdICYgMHg4MCkgPyAwIDogQVZfUEtUX0ZMQUdfS0VZOworCisgICAgLyogQWR2YW5jZSBvZmZzZXQgKi8KKyAgICB2aWRlby0+ZGF0YV9zaXplICAgLT0gZnJhbWVfc2l6ZSArIDQ7CisgICAgdmlkZW8tPmRhdGFfb2Zmc2V0ICs9IGZyYW1lX3NpemUgKyA0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeG12X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgWE1WRGVtdXhDb250ZXh0ICp4bXYgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJlc3VsdDsKKworICAgIGlmICh4bXYtPnZpZGVvLmN1cnJlbnRfZnJhbWUgPT0geG12LT52aWRlby5mcmFtZV9jb3VudCkgeworICAgICAgICAvKiBObyBmcmFtZXMgbGVmdCBpbiB0aGlzIHBhY2tldCwgc28gd2UgZmV0Y2ggYSBuZXcgb25lICovCisKKyAgICAgICAgcmVzdWx0ID0geG12X2ZldGNoX25ld19wYWNrZXQocyk7CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmICh4bXYtPmN1cnJlbnRfc3RyZWFtID09IDApIHsKKyAgICAgICAgLyogRmV0Y2ggYSB2aWRlbyBmcmFtZSAqLworCisgICAgICAgIHJlc3VsdCA9IHhtdl9mZXRjaF92aWRlb19wYWNrZXQocywgcGt0KTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBGZXRjaCBhbiBhdWRpbyBmcmFtZSAqLworCisgICAgICAgIHJlc3VsdCA9IHhtdl9mZXRjaF9hdWRpb19wYWNrZXQocywgcGt0LCB4bXYtPmN1cnJlbnRfc3RyZWFtIC0gMSk7CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIEluY3JlYXNlIG91ciBjb3VudGVycyAqLworICAgIGlmICgrK3htdi0+Y3VycmVudF9zdHJlYW0gPj0geG12LT5zdHJlYW1fY291bnQpIHsKKyAgICAgICAgeG12LT5jdXJyZW50X3N0cmVhbSAgICAgICA9IDA7CisgICAgICAgIHhtdi0+dmlkZW8uY3VycmVudF9mcmFtZSArPSAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX3htdl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ4bXYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNaWNyb3NvZnQgWE1WIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFhNVkRlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0geG12X3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHhtdl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSB4bXZfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0geG12X3JlYWRfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3h3bWEuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC94d21hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyOWQwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC94d21hLmMKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiB4V01BIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMSBNYXggSG9ybgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyaWZmLmgiCisKKy8qCisgKiBEZW11eGVyIGZvciB4V01BLCBhIE1pY3Jvc29mdCBhdWRpbyBjb250YWluZXIgdXNlZCBieSBYQXVkaW8gMi4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50NjRfdCBkYXRhX2VuZDsKK30gWFdNQUNvbnRleHQ7CisKK3N0YXRpYyBpbnQgeHdtYV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoIW1lbWNtcChwLT5idWYsICJSSUZGIiwgNCkgJiYgIW1lbWNtcChwLT5idWYgKyA4LCAiWFdNQSIsIDQpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeHdtYV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50NjRfdCBzaXplOworICAgIGludCByZXQgPSAwOworICAgIHVpbnQzMl90IGRwZHNfdGFibGVfc2l6ZSA9IDA7CisgICAgdWludDMyX3QgKmRwZHNfdGFibGUgPSBOVUxMOworICAgIHVuc2lnbmVkIGludCB0YWc7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworICAgIFhXTUFDb250ZXh0ICp4d21hID0gcy0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGlzIG1vc3RseSBjb3BpZWQgZnJvbSB3YXYuYywgd2l0aCBzb21lCisgICAgICogbWlub3IgYWx0ZXJhdGlvbnMuCisgICAgICovCisKKyAgICAvKiBjaGVjayBSSUZGIGhlYWRlciAqLworICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKHRhZyAhPSBNS1RBRygnUicsICdJJywgJ0YnLCAnRicpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYXZpb19ybDMyKHBiKTsgLyogZmlsZSBzaXplICovCisgICAgdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZiAodGFnICE9IE1LVEFHKCdYJywgJ1cnLCAnTScsICdBJykpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIHBhcnNlIGZtdCBoZWFkZXIgKi8KKyAgICB0YWcgPSBhdmlvX3JsMzIocGIpOworICAgIGlmICh0YWcgIT0gTUtUQUcoJ2YnLCAnbScsICd0JywgJyAnKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNpemUgPSBhdmlvX3JsMzIocGIpOworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocGIsIHN0LT5jb2RlYywgc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX05PTkU7CisKKyAgICAvKiBBbGwgeFdNQSBmaWxlcyBJIGhhdmUgc2VlbiBjb250YWluZWQgV01BdjIgZGF0YS4gSWYgdGhlcmUgYXJlIGZpbGVzCisgICAgICogdXNpbmcgV01BIFBybyBvciBzb21lIG90aGVyIGNvZGVjLCB0aGVuIHdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgcmlnaHQKKyAgICAgKiBleHRyYWRhdGEgZm9yIHRoYXQuIFRodXMsIGFzayB0aGUgdXNlciBmb3IgZmVlZGJhY2ssIGJ1dCB0cnkgdG8gZ28gb24KKyAgICAgKiBhbnl3YXkuCisgICAgICovCisgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfV01BVjIpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJVbmV4cGVjdGVkIGNvZGVjICh0YWcgMHgwNCV4OyBpZCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcsIHN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEluIGFsbCB4V01BIGZpbGVzIEkgaGF2ZSBzZWVuLCB0aGVyZSBpcyBubyBleHRyYWRhdGEuIEJ1dCB0aGUgV01BCisgICAgICAgICAqIGNvZGVjcyByZXF1aXJlIGV4dHJhZGF0YSwgc28gd2UgcHJvdmlkZSBvdXIgb3duIGZha2UgZXh0cmFkYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBGaXJzdCwgY2hlY2sgdGhhdCB0aGVyZSByZWFsbHkgd2FzIG5vIGV4dHJhZGF0YSBpbiB0aGUgaGVhZGVyLiBJZgorICAgICAgICAgKiB0aGVyZSB3YXMsIHRoZW4gdHJ5IHRvIHVzZSBpdCwgYWZ0ZXIgYXNraW5nIHRoZSB1c2VyIHRvIHByb3ZpZGUgYQorICAgICAgICAgKiBzYW1wbGUgb2YgdGhpcyB1bnVzdWFsIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAvKiBTdXJwcmlzZSwgc3VycHJpc2U6IFdlICpkaWQqIGdldCBzb21lIGV4dHJhZGF0YS4gTm8gaWRlYQorICAgICAgICAgICAgICogaWYgaXQgd2lsbCB3b3JrLCBidXQganVzdCBnbyBvbiBhbmQgdHJ5IGl0LCBhZnRlciBhc2tpbmcKKyAgICAgICAgICAgICAqIHRoZSB1c2VyIGZvciBhIHNhbXBsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJVbmV4cGVjdGVkIGV4dHJhZGF0YSAoJWQgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSA2OworICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgICAgICA9IGF2X21hbGxvY3ooNiArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICAvKiBzZXR1cCBleHRyYWRhdGEgd2l0aCBvdXIgZXhwZXJpbWVudGFsbHkgb2J0YWluZWQgdmFsdWUgKi8KKyAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzRdID0gMzE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXN0LT5jb2RlYy0+Y2hhbm5lbHMpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBjaGFubmVsIGNvdW50OiAlZFxuIiwKKyAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKCFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIGJpdHNfcGVyX2NvZGVkX3NhbXBsZTogJWRcbiIsCisgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIHNldCB0aGUgc2FtcGxlIHJhdGUgKi8KKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisKKyAgICAvKiBwYXJzZSB0aGUgcmVtYWluaW5nIFJJRkYgY2h1bmtzICovCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAocGItPmVvZl9yZWFjaGVkKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0VPRjsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICAvKiByZWFkIG5leHQgY2h1bmsgdGFnICovCisgICAgICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIHNpemUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAodGFnID09IE1LVEFHKCdkJywgJ2EnLCAndCcsICdhJykpIHsKKyAgICAgICAgICAgIC8qIFdlIGFzc3VtZSB0aGF0IHRoZSBkYXRhIGNodW5rIGNvbWVzIGxhc3QuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gTUtUQUcoJ2QnLCdwJywnZCcsJ3MnKSkgeworICAgICAgICAgICAgLyogUXVvdGluZyB0aGUgTVNETiB4V01BIGRvY3Mgb24gdGhlIGRwZHMgY2h1bms6ICJDb250YWlucyB0aGUKKyAgICAgICAgICAgICAqIGRlY29kZWQgcGFja2V0IGN1bXVsYXRpdmUgZGF0YSBzaXplIGFycmF5LCBlYWNoIGVsZW1lbnQgaXMgdGhlCisgICAgICAgICAgICAgKiBudW1iZXIgb2YgYnl0ZXMgYWNjdW11bGF0ZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgeFdNQSBwYWNrZXQKKyAgICAgICAgICAgICAqIGlzIGRlY29kZWQgaW4gb3JkZXIuIgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEVhY2ggcGFja2V0IGhhcyBzaXplIGVxdWFsIHRvIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24sIHdoaWNoIGluCisgICAgICAgICAgICAgKiBhbGwgY2FzZXMgSSBzYXcgc28gZmFyIHdhcyBhbHdheXMgMjIzMC4gVGh1cywgd2UgY2FuIHVzZSB0aGUKKyAgICAgICAgICAgICAqIGRwZHMgZGF0YSB0byBjb21wdXRlIGEgc2Vla2luZyBpbmRleC4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvKiBFcnJvciBvdXQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBkcGRzIGNodW5rLiAqLworICAgICAgICAgICAgaWYgKGRwZHNfdGFibGUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidHdvIGRwZHMgY2h1bmtzIHByZXNlbnRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZHBkcyBjaHVuay4gKi8KKyAgICAgICAgICAgIGlmIChzaXplICYgMykgeyAgLyogU2l6ZSBzaG91bGQgYmUgZGl2aXNpYmxlIGJ5IGZvdXIgKi8KKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJkcGRzIGNodW5rIHNpemUgJSJQUklkNjQiIG5vdCBkaXZpc2libGUgYnkgNFxuIiwgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkcGRzX3RhYmxlX3NpemUgPSBzaXplIC8gNDsKKyAgICAgICAgICAgIGlmIChkcGRzX3RhYmxlX3NpemUgPT0gMCB8fCBkcGRzX3RhYmxlX3NpemUgPj0gSU5UX01BWCAvIDQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiZHBkcyBjaHVuayBzaXplICUiUFJJZDY0IiBpbnZhbGlkXG4iLCBzaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQWxsb2NhdGUgc29tZSB0ZW1wb3Jhcnkgc3RvcmFnZSB0byBrZWVwIHRoZSBkcGRzIGRhdGEgYXJvdW5kLgorICAgICAgICAgICAgICogZm9yIHByb2Nlc3NpbmcgbGF0ZXIgb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRwZHNfdGFibGUgPSBhdl9tYWxsb2MoZHBkc190YWJsZV9zaXplICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgICAgICBpZiAoIWRwZHNfdGFibGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHBkc190YWJsZV9zaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICBkcGRzX3RhYmxlW2ldID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgICAgICBzaXplIC09IDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICB9CisKKyAgICAvKiBEZXRlcm1pbmUgb3ZlcmFsbCBkYXRhIGxlbmd0aCAqLworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmICghc2l6ZSkgeworICAgICAgICB4d21hLT5kYXRhX2VuZCA9IElOVDY0X01BWDsKKyAgICB9IGVsc2UKKyAgICAgICAgeHdtYS0+ZGF0YV9lbmQgPSBhdmlvX3RlbGwocGIpICsgc2l6ZTsKKworCisgICAgaWYgKGRwZHNfdGFibGUgJiYgZHBkc190YWJsZV9zaXplKSB7CisgICAgICAgIGludDY0X3QgY3VyX3BvczsKKyAgICAgICAgY29uc3QgdWludDMyX3QgYnl0ZXNfcGVyX3NhbXBsZQorICAgICAgICAgICAgICAgID0gKHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgPj4gMzsKKworICAgICAgICAvKiBFc3RpbWF0ZSB0aGUgZHVyYXRpb24gZnJvbSB0aGUgdG90YWwgbnVtYmVyIG9mIG91dHB1dCBieXRlcy4gKi8KKyAgICAgICAgY29uc3QgdWludDY0X3QgdG90YWxfZGVjb2RlZF9ieXRlcyA9IGRwZHNfdGFibGVbZHBkc190YWJsZV9zaXplIC0gMV07CisKKyAgICAgICAgaWYgKCFieXRlc19wZXJfc2FtcGxlKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJpdHNfcGVyX2NvZGVkX3NhbXBsZSAlZCBmb3IgJWQgY2hhbm5lbHNcbiIsCisgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsIHN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHN0LT5kdXJhdGlvbiA9IHRvdGFsX2RlY29kZWRfYnl0ZXMgLyBieXRlc19wZXJfc2FtcGxlOworCisgICAgICAgIC8qIFVzZSB0aGUgZHBkcyBkYXRhIHRvIGJ1aWxkIGEgc2VlayB0YWJsZS4gIFdlIGNhbiBvbmx5IGRvIHRoaXMgYWZ0ZXIKKyAgICAgICAgICogd2Uga25vdyB0aGUgb2Zmc2V0IHRvIHRoZSBkYXRhIGNodW5rLCBhcyB3ZSBuZWVkIHRoYXQgdG8gZGV0ZXJtaW5lCisgICAgICAgICAqIHRoZSBhY3R1YWwgb2Zmc2V0IHRvIGVhY2ggaW5wdXQgYmxvY2suCisgICAgICAgICAqIE5vdGU6IElmIHdlIGFsbG93ZWQgb3Vyc2VsdmVzIHRvIGFzc3VtZSB0aGF0IHRoZSBkYXRhIGNodW5rIGFsd2F5cworICAgICAgICAgKiBmb2xsb3dzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBkcGRzIGJsb2NrLCB3ZSBjb3VsZCBvZiBjb3Vyc2UgZ3Vlc3MKKyAgICAgICAgICogdGhlIGRhdGEgYmxvY2sncyBzdGFydCBvZmZzZXQgYWxyZWFkeSB3aGlsZSByZWFkaW5nIHRoZSBkcGRzIGNodW5rLgorICAgICAgICAgKiBJIGRlY2lkZWQgYWdhaW5zdCB0aGF0LCBqdXN0IGluIGNhc2Ugb3RoZXIgY2h1bmtzIGV2ZXIgYXJlCisgICAgICAgICAqIGRpc2NvdmVyZWQuCisgICAgICAgICAqLworICAgICAgICBjdXJfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwZHNfdGFibGVfc2l6ZTsgKytpKSB7CisgICAgICAgICAgICAvKiBGcm9tIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIHRoYXQgd291bGQgYWNjdW11bGF0ZSBpbiB0aGUKKyAgICAgICAgICAgICAqIG91dHB1dCBidWZmZXIgYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IChpKzEpIHBhY2tldHMsIHdlIGNvbXB1dGUKKyAgICAgICAgICAgICAqIGFuIG9mZnNldCAvIHRpbWVzdGFtcCBwYWlyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3BvcyArIChpKzEpICogc3QtPmNvZGVjLT5ibG9ja19hbGlnbiwgLyogcG9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBkc190YWJsZVtpXSAvIGJ5dGVzX3Blcl9zYW1wbGUsICAgICAgICAgLyogdGltZXN0YW1wICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiwgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR1cmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Yml0X3JhdGUpIHsKKyAgICAgICAgLyogTm8gZHBkcyBjaHVuayB3YXMgcHJlc2VudCAob3Igb25seSBhbiBlbXB0eSBvbmUpLCBzbyBlc3RpbWF0ZQorICAgICAgICAgKiB0aGUgdG90YWwgZHVyYXRpb24gdXNpbmcgdGhlIGF2ZXJhZ2UgYml0cyBwZXIgc2FtcGxlIGFuZCB0aGUKKyAgICAgICAgICogdG90YWwgZGF0YSBsZW5ndGguCisgICAgICAgICAqLworICAgICAgICBzdC0+ZHVyYXRpb24gPSAoc2l6ZTw8MykgKiBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIC8gc3QtPmNvZGVjLT5iaXRfcmF0ZTsKKyAgICB9CisKK2ZhaWw6CisgICAgYXZfZnJlZShkcGRzX3RhYmxlKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeHdtYV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldCwgc2l6ZTsKKyAgICBpbnQ2NF90IGxlZnQ7CisgICAgQVZTdHJlYW0gKnN0OworICAgIFhXTUFDb250ZXh0ICp4d21hID0gcy0+cHJpdl9kYXRhOworCisgICAgc3QgPSBzLT5zdHJlYW1zWzBdOworCisgICAgbGVmdCA9IHh3bWEtPmRhdGFfZW5kIC0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBpZiAobGVmdCA8PSAwKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisKKyAgICAvKiByZWFkIGEgc2luZ2xlIGJsb2NrOyB0aGUgZGVmYXVsdCBibG9jayBzaXplIGlzIDIyMzAuICovCisgICAgc2l6ZSA9IChzdC0+Y29kZWMtPmJsb2NrX2FsaWduID4gMSkgPyBzdC0+Y29kZWMtPmJsb2NrX2FsaWduIDogMjIzMDsKKyAgICBzaXplID0gRkZNSU4oc2l6ZSwgbGVmdCk7CisKKyAgICByZXQgID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCitBVklucHV0Rm9ybWF0IGZmX3h3bWFfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAieHdtYSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1pY3Jvc29mdCB4V01BIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFhXTUFDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB4d21hX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHh3bWFfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0geHdtYV9yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQveW9wLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQveW9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwODZkNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdmZvcm1hdC95b3AuYwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIFBzeWdub3NpcyBZT1AgZGVtdXhlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBNb2hhbWVkIE5hdWZhbCBCYXNoZWVyIDxuYXVmYWwxMUBnbWFpbC5jb20+CisgKiBkZXJpdmVkIGZyb20gdGhlIGNvZGUgYnkKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaG9tYXMgUC4gSGlnZG9uIDx0aG9tYXMucC5oaWdkb25AZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeW9wX2RlY19jb250ZXh0IHsKKyAgICBBVlBhY2tldCB2aWRlb19wYWNrZXQ7CisKKyAgICBpbnQgb2RkX2ZyYW1lOworICAgIGludCBmcmFtZV9zaXplOworICAgIGludCBhdWRpb19ibG9ja19sZW5ndGg7CisgICAgaW50IHBhbGV0dGVfc2l6ZTsKK30gWW9wRGVjQ29udGV4dDsKKworc3RhdGljIGludCB5b3BfcHJvYmUoQVZQcm9iZURhdGEgKnByb2JlX3BhY2tldCkKK3sKKyAgICBpZiAoQVZfUkIxNihwcm9iZV9wYWNrZXQtPmJ1ZikgPT0gQVZfUkIxNigiWU8iKSAgJiYKKyAgICAgICAgcHJvYmVfcGFja2V0LT5idWZbMl08MTAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgcHJvYmVfcGFja2V0LT5idWZbM108MTAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgcHJvYmVfcGFja2V0LT5idWZbNl0gICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgcHJvYmVfcGFja2V0LT5idWZbN10gICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIShwcm9iZV9wYWNrZXQtPmJ1Zls4XSAmIDEpICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIShwcm9iZV9wYWNrZXQtPmJ1ZlsxMF0gJiAxKSAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgQVZfUkwxNihwcm9iZV9wYWNrZXQtPmJ1ZiArIDEyICsgNikgPj0gOTIwICAgICYmCisgICAgICAgIEFWX1JMMTYocHJvYmVfcGFja2V0LT5idWYgKyAxMiArIDYpIDwgcHJvYmVfcGFja2V0LT5idWZbMTJdICogMyArIDQgKyBwcm9iZV9wYWNrZXQtPmJ1Zls3XSAqIDIwNDgKKyAgICApCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAqIDMgLyA0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeW9wX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBZb3BEZWNDb250ZXh0ICp5b3AgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiICA9IHMtPnBiOworCisgICAgQVZDb2RlY0NvbnRleHQgKmF1ZGlvX2RlYywgKnZpZGVvX2RlYzsKKyAgICBBVlN0cmVhbSAqYXVkaW9fc3RyZWFtLCAqdmlkZW9fc3RyZWFtOworCisgICAgaW50IGZyYW1lX3JhdGUsIHJldDsKKworICAgIGF1ZGlvX3N0cmVhbSA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgdmlkZW9fc3RyZWFtID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIWF1ZGlvX3N0cmVhbSB8fCAhdmlkZW9fc3RyZWFtKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLy8gRXh0cmEgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBkZWNvZGVyCisgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YSh2aWRlb19zdHJlYW0tPmNvZGVjLCA4KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8vIEF1ZGlvCisgICAgYXVkaW9fZGVjICAgICAgICAgICAgICAgPSBhdWRpb19zdHJlYW0tPmNvZGVjOworICAgIGF1ZGlvX2RlYy0+Y29kZWNfdHlwZSAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIGF1ZGlvX2RlYy0+Y29kZWNfaWQgICAgID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX0FQQzsKKyAgICBhdWRpb19kZWMtPmNoYW5uZWxzICAgICA9IDE7CisgICAgYXVkaW9fZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIGF1ZGlvX2RlYy0+c2FtcGxlX3JhdGUgID0gMjIwNTA7CisKKyAgICAvLyBWaWRlbworICAgIHZpZGVvX2RlYyAgICAgICAgICAgICAgID0gdmlkZW9fc3RyZWFtLT5jb2RlYzsKKyAgICB2aWRlb19kZWMtPmNvZGVjX3R5cGUgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2aWRlb19kZWMtPmNvZGVjX2lkICAgICA9IEFWX0NPREVDX0lEX1lPUDsKKworICAgIGF2aW9fc2tpcChwYiwgNik7CisKKyAgICBmcmFtZV9yYXRlICAgICAgICAgICAgICA9IGF2aW9fcjgocGIpOworICAgIHlvcC0+ZnJhbWVfc2l6ZSAgICAgICAgID0gYXZpb19yOChwYikgKiAyMDQ4OworICAgIHZpZGVvX2RlYy0+d2lkdGggICAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICB2aWRlb19kZWMtPmhlaWdodCAgICAgICA9IGF2aW9fcmwxNihwYik7CisKKyAgICB2aWRlb19zdHJlYW0tPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7MSwgMn07CisKKyAgICByZXQgPSBhdmlvX3JlYWQocGIsIHZpZGVvX2RlYy0+ZXh0cmFkYXRhLCA4KTsKKyAgICBpZiAocmV0IDwgOCkKKyAgICAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiBBVkVSUk9SX0VPRjsKKworICAgIHlvcC0+cGFsZXR0ZV9zaXplICAgICAgID0gdmlkZW9fZGVjLT5leHRyYWRhdGFbMF0gKiAzICsgNDsKKyAgICB5b3AtPmF1ZGlvX2Jsb2NrX2xlbmd0aCA9IEFWX1JMMTYodmlkZW9fZGVjLT5leHRyYWRhdGEgKyA2KTsKKworICAgIHZpZGVvX2RlYy0+Yml0X3JhdGUgICAgID0gOCAqICh5b3AtPmZyYW1lX3NpemUgLSB5b3AtPmF1ZGlvX2Jsb2NrX2xlbmd0aCkgKiBmcmFtZV9yYXRlOworCisgICAgLy8gMTg0MCBzYW1wbGVzIHBlciBmcmFtZSwgMSBuaWJibGUgcGVyIHNhbXBsZTsgaGVuY2UgMTg0MC8yID0gOTIwCisgICAgaWYgKHlvcC0+YXVkaW9fYmxvY2tfbGVuZ3RoIDwgOTIwIHx8CisgICAgICAgIHlvcC0+YXVkaW9fYmxvY2tfbGVuZ3RoICsgeW9wLT5wYWxldHRlX3NpemUgPj0geW9wLT5mcmFtZV9zaXplKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJZT1AgaGFzIGludmFsaWQgaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZpb19zZWVrKHBiLCAyMDQ4LCBTRUVLX1NFVCk7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZpZGVvX3N0cmVhbSwgMzIsIDEsIGZyYW1lX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeW9wX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBZb3BEZWNDb250ZXh0ICp5b3AgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiICA9IHMtPnBiOworCisgICAgaW50IHJldDsKKyAgICBpbnQgYWN0dWFsX3ZpZGVvX2RhdGFfc2l6ZSA9IHlvcC0+ZnJhbWVfc2l6ZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3AtPmF1ZGlvX2Jsb2NrX2xlbmd0aCAtIHlvcC0+cGFsZXR0ZV9zaXplOworCisgICAgeW9wLT52aWRlb19wYWNrZXQuc3RyZWFtX2luZGV4ID0gMTsKKworICAgIGlmICh5b3AtPnZpZGVvX3BhY2tldC5kYXRhKSB7CisgICAgICAgICpwa3QgICAgICAgICAgICAgICAgICAgPSAgeW9wLT52aWRlb19wYWNrZXQ7CisgICAgICAgIHlvcC0+dmlkZW9fcGFja2V0LmRhdGEgPSAgTlVMTDsKKyAgICAgICAgeW9wLT52aWRlb19wYWNrZXQuYnVmICA9ICBOVUxMOworI2lmIEZGX0FQSV9ERVNUUlVDVF9QQUNLRVQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgeW9wLT52aWRlb19wYWNrZXQuZGVzdHJ1Y3QgPSBOVUxMOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICAgICAgeW9wLT52aWRlb19wYWNrZXQuc2l6ZSA9ICAwOworICAgICAgICBwa3QtPmRhdGFbMF0gICAgICAgICAgID0gIHlvcC0+b2RkX2ZyYW1lOworICAgICAgICBwa3QtPmZsYWdzICAgICAgICAgICAgIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgeW9wLT5vZGRfZnJhbWUgICAgICAgICBePSAxOworICAgICAgICByZXR1cm4gcGt0LT5zaXplOworICAgIH0KKyAgICByZXQgPSBhdl9uZXdfcGFja2V0KCZ5b3AtPnZpZGVvX3BhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHlvcC0+ZnJhbWVfc2l6ZSAtIHlvcC0+YXVkaW9fYmxvY2tfbGVuZ3RoKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHlvcC0+dmlkZW9fcGFja2V0LnBvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICByZXQgPSBhdmlvX3JlYWQocGIsIHlvcC0+dmlkZW9fcGFja2V0LmRhdGEsIHlvcC0+cGFsZXR0ZV9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIGVycl9vdXQ7CisgICAgfWVsc2UgaWYgKHJldCA8IHlvcC0+cGFsZXR0ZV9zaXplKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfRU9GOworICAgICAgICBnb3RvIGVycl9vdXQ7CisgICAgfQorCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCA5MjApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVycl9vdXQ7CisKKyAgICAvLyBTZXQgcG9zaXRpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZQorICAgIHBrdC0+cG9zID0geW9wLT52aWRlb19wYWNrZXQucG9zOworCisgICAgYXZpb19za2lwKHBiLCB5b3AtPmF1ZGlvX2Jsb2NrX2xlbmd0aCAtIHJldCk7CisKKyAgICByZXQgPSBhdmlvX3JlYWQocGIsIHlvcC0+dmlkZW9fcGFja2V0LmRhdGEgKyB5b3AtPnBhbGV0dGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF92aWRlb19kYXRhX3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVycl9vdXQ7CisgICAgZWxzZSBpZiAocmV0IDwgYWN0dWFsX3ZpZGVvX2RhdGFfc2l6ZSkKKyAgICAgICAgYXZfc2hyaW5rX3BhY2tldCgmeW9wLT52aWRlb19wYWNrZXQsIHlvcC0+cGFsZXR0ZV9zaXplICsgcmV0KTsKKworICAgIC8vIEFyYml0cmFyaWx5IHJldHVybiB0aGUgYXVkaW8gZGF0YSBmaXJzdAorICAgIHJldHVybiB5b3AtPmF1ZGlvX2Jsb2NrX2xlbmd0aDsKKworZXJyX291dDoKKyAgICBhdl9mcmVlX3BhY2tldCgmeW9wLT52aWRlb19wYWNrZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeW9wX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFlvcERlY0NvbnRleHQgKnlvcCA9IHMtPnByaXZfZGF0YTsKKyAgICBhdl9mcmVlX3BhY2tldCgmeW9wLT52aWRlb19wYWNrZXQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHlvcF9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgWW9wRGVjQ29udGV4dCAqeW9wID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgZnJhbWVfcG9zLCBwb3NfbWluLCBwb3NfbWF4OworICAgIGludCBmcmFtZV9jb3VudDsKKworICAgIGlmICghc3RyZWFtX2luZGV4KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBwb3NfbWluICAgICAgICA9IHMtPmRhdGFfb2Zmc2V0OworICAgIHBvc19tYXggICAgICAgID0gYXZpb19zaXplKHMtPnBiKSAtIHlvcC0+ZnJhbWVfc2l6ZTsKKyAgICBmcmFtZV9jb3VudCAgICA9IChwb3NfbWF4IC0gcG9zX21pbikgLyB5b3AtPmZyYW1lX3NpemU7CisKKyAgICB0aW1lc3RhbXAgICAgICA9IEZGTUFYKDAsIEZGTUlOKGZyYW1lX2NvdW50LCB0aW1lc3RhbXApKTsKKworICAgIGZyYW1lX3BvcyAgICAgID0gdGltZXN0YW1wICogeW9wLT5mcmFtZV9zaXplICsgcG9zX21pbjsKKworICAgIGlmIChhdmlvX3NlZWsocy0+cGIsIGZyYW1lX3BvcywgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYXZfZnJlZV9wYWNrZXQoJnlvcC0+dmlkZW9fcGFja2V0KTsKKyAgICB5b3AtPm9kZF9mcmFtZSA9IHRpbWVzdGFtcCAmIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl95b3BfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAieW9wIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUHN5Z25vc2lzIFlPUCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihZb3BEZWNDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB5b3BfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0geW9wX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHlvcF9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSB5b3BfcmVhZF9jbG9zZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSB5b3BfcmVhZF9zZWVrLAorICAgIC5leHRlbnNpb25zICAgICA9ICJ5b3AiLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3l1djRtcGVnLmggYi9mZm1wZWcvbGliYXZmb3JtYXQveXV2NG1wZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTBmNDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3l1djRtcGVnLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIFlVVjRNUEVHIGNvbW1vbiBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1lVVjRNUEVHX0gKKyNkZWZpbmUgQVZGT1JNQVRfWVVWNE1QRUdfSAorCisjZGVmaW5lIFk0TV9NQUdJQyAiWVVWNE1QRUcyIgorI2RlZmluZSBZNE1fRlJBTUVfTUFHSUMgIkZSQU1FIgorCisjZW5kaWYgLyogQVZGT1JNQVRfWVVWNE1QRUdfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2Zm9ybWF0L3l1djRtcGVnZGVjLmMgYi9mZm1wZWcvbGliYXZmb3JtYXQveXV2NG1wZWdkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDJiMjkxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2Zm9ybWF0L3l1djRtcGVnZGVjLmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBZVVY0TVBFRyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAieXV2NG1wZWcuaCIKKworLyogSGVhZGVyIHNpemUgaW5jcmVhc2VkIHRvIGFsbG93IHJvb20gZm9yIG9wdGlvbmFsIGZsYWdzICovCisjZGVmaW5lIE1BWF9ZVVY0X0hFQURFUiA4MAorI2RlZmluZSBNQVhfRlJBTUVfSEVBREVSIDgwCisKK3N0YXRpYyBpbnQgeXV2NF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgY2hhciBoZWFkZXJbTUFYX1lVVjRfSEVBREVSICsgMTBdOyAgLy8gSW5jbHVkZSBoZWFkcm9vbSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9uZ2VzdCBvcHRpb24KKyAgICBjaGFyICp0b2tzdGFydCwgKnRva2VuZCwgKmhlYWRlcl9lbmQ7CisgICAgaW50IGk7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHdpZHRoID0gLTEsIGhlaWdodCAgPSAtMSwgcmF0ZW4gICA9IDAsCisgICAgICAgIHJhdGVkID0gIDAsIGFzcGVjdG4gPSAgMCwgYXNwZWN0ZCA9IDA7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQgPSBBVl9QSVhfRk1UX05PTkUsIGFsdF9waXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOworICAgIGVudW0gQVZDaHJvbWFMb2NhdGlvbiBjaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBlbnVtIEFWRmllbGRPcmRlciBmaWVsZF9vcmRlcjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfWVVWNF9IRUFERVI7IGkrKykgeworICAgICAgICBoZWFkZXJbaV0gPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgaWYgKGhlYWRlcltpXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBoZWFkZXJbaSArIDFdID0gMHgyMDsgIC8vIEFkZCBhIHNwYWNlIGFmdGVyIGxhc3Qgb3B0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlcyBwYXJzaW5nICI0NDQiIHZzICI0NDRhbHBoYSIgZWFzaWVyLgorICAgICAgICAgICAgaGVhZGVyW2kgKyAyXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBNQVhfWVVWNF9IRUFERVIpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoc3RybmNtcChoZWFkZXIsIFk0TV9NQUdJQywgc3RybGVuKFk0TV9NQUdJQykpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBoZWFkZXJfZW5kID0gJmhlYWRlcltpICsgMV07IC8vIEluY2x1ZGUgc3BhY2UKKyAgICBmb3IgKHRva3N0YXJ0ID0gJmhlYWRlcltzdHJsZW4oWTRNX01BR0lDKSArIDFdOworICAgICAgICAgdG9rc3RhcnQgPCBoZWFkZXJfZW5kOyB0b2tzdGFydCsrKSB7CisgICAgICAgIGlmICgqdG9rc3RhcnQgPT0gMHgyMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBzd2l0Y2ggKCp0b2tzdGFydCsrKSB7CisgICAgICAgIGNhc2UgJ1cnOiAvLyBXaWR0aC4gUmVxdWlyZWQuCisgICAgICAgICAgICB3aWR0aCAgICA9IHN0cnRvbCh0b2tzdGFydCwgJnRva2VuZCwgMTApOworICAgICAgICAgICAgdG9rc3RhcnQgPSB0b2tlbmQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnSCc6IC8vIEhlaWdodC4gUmVxdWlyZWQuCisgICAgICAgICAgICBoZWlnaHQgICA9IHN0cnRvbCh0b2tzdGFydCwgJnRva2VuZCwgMTApOworICAgICAgICAgICAgdG9rc3RhcnQgPSB0b2tlbmQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnQyc6IC8vIENvbG9yIHNwYWNlCisgICAgICAgICAgICBpZiAoc3RybmNtcCgiNDIwanBlZyIsIHRva3N0YXJ0LCA3KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgICAgICAgICBjaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gQVZDSFJPTUFfTE9DX0NFTlRFUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgiNDIwbXBlZzIiLCB0b2tzdGFydCwgOCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgICAgICAgICAgY2hyb21hX3NhbXBsZV9sb2NhdGlvbiA9IEFWQ0hST01BX0xPQ19MRUZUOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCI0MjBwYWxkdiIsIHRva3N0YXJ0LCA4KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgICAgICAgICBjaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gQVZDSFJPTUFfTE9DX1RPUExFRlQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIjQyMHAxNiIsIHRva3N0YXJ0LCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDE2OworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCI0MjJwMTYiLCB0b2tzdGFydCwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxNjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgiNDQ0cDE2IiwgdG9rc3RhcnQsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIjQyMHAxNCIsIHRva3N0YXJ0LCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDE0OworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCI0MjJwMTQiLCB0b2tzdGFydCwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxNDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgiNDQ0cDE0IiwgdG9rc3RhcnQsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIjQyMHAxMiIsIHRva3N0YXJ0LCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDEyOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCI0MjJwMTIiLCB0b2tzdGFydCwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgiNDQ0cDEyIiwgdG9rc3RhcnQsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIjQyMHAxMCIsIHRva3N0YXJ0LCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDEwOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCI0MjJwMTAiLCB0b2tzdGFydCwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgiNDQ0cDEwIiwgdG9rc3RhcnQsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIjQyMHA5IiwgdG9rc3RhcnQsIDUpID09IDApIHsKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgiNDIycDkiLCB0b2tzdGFydCwgNSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA5OworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCI0NDRwOSIsIHRva3N0YXJ0LCA1KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIjQyMCIsIHRva3N0YXJ0LCAzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgICAgICAgICBjaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gQVZDSFJPTUFfTE9DX0NFTlRFUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgiNDExIiwgdG9rc3RhcnQsIDMpID09IDApIHsKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MTFQOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCI0MjIiLCB0b2tzdGFydCwgMykgPT0gMCkgeworICAgICAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIjQ0NGFscGhhIiwgdG9rc3RhcnQsIDgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBoYW5kbGUgNDo0OjQ6NCAiCisgICAgICAgICAgICAgICAgICAgICAgICJZVVY0TVBFRyBzdHJlYW0uXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIjQ0NCIsIHRva3N0YXJ0LCAzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgibW9ubzE2IiwgdG9rc3RhcnQsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIm1vbm8iLCB0b2tzdGFydCwgNCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVk4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiWVVWNE1QRUcgc3RyZWFtIGNvbnRhaW5zIGFuIHVua25vd24gIgorICAgICAgICAgICAgICAgICAgICAgICAicGl4ZWwgZm9ybWF0LlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHRva3N0YXJ0IDwgaGVhZGVyX2VuZCAmJiAqdG9rc3RhcnQgIT0gMHgyMCkKKyAgICAgICAgICAgICAgICB0b2tzdGFydCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0knOiAvLyBJbnRlcmxhY2UgdHlwZQorICAgICAgICAgICAgc3dpdGNoICgqdG9rc3RhcnQrKyl7CisgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICBmaWVsZF9vcmRlciA9IEFWX0ZJRUxEX1VOS05PV047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgICAgICBmaWVsZF9vcmRlciA9IEFWX0ZJRUxEX1BST0dSRVNTSVZFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgZmllbGRfb3JkZXIgPSBBVl9GSUVMRF9UVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgICAgIGZpZWxkX29yZGVyID0gQVZfRklFTERfQkI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiWVVWNE1QRUcgc3RyZWFtIGNvbnRhaW5zIG1peGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgImludGVybGFjZWQgYW5kIG5vbi1pbnRlcmxhY2VkIGZyYW1lcy5cbiIpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiWVVWNE1QRUcgaGFzIGludmFsaWQgaGVhZGVyLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdGJzogLy8gRnJhbWUgcmF0ZQorICAgICAgICAgICAgc3NjYW5mKHRva3N0YXJ0LCAiJWQ6JWQiLCAmcmF0ZW4sICZyYXRlZCk7IC8vIDA6MCBpZiB1bmtub3duCisgICAgICAgICAgICB3aGlsZSAodG9rc3RhcnQgPCBoZWFkZXJfZW5kICYmICp0b2tzdGFydCAhPSAweDIwKQorICAgICAgICAgICAgICAgIHRva3N0YXJ0Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnQSc6IC8vIFBpeGVsIGFzcGVjdAorICAgICAgICAgICAgc3NjYW5mKHRva3N0YXJ0LCAiJWQ6JWQiLCAmYXNwZWN0biwgJmFzcGVjdGQpOyAvLyAwOjAgaWYgdW5rbm93bgorICAgICAgICAgICAgd2hpbGUgKHRva3N0YXJ0IDwgaGVhZGVyX2VuZCAmJiAqdG9rc3RhcnQgIT0gMHgyMCkKKyAgICAgICAgICAgICAgICB0b2tzdGFydCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1gnOiAvLyBWZW5kb3IgZXh0ZW5zaW9ucworICAgICAgICAgICAgaWYgKHN0cm5jbXAoIllTQ1NTPSIsIHRva3N0YXJ0LCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gT2xkZXIgbm9uc3RhbmRhcmQgcGl4ZWwgZm9ybWF0IHJlcHJlc2VudGF0aW9uCisgICAgICAgICAgICAgICAgdG9rc3RhcnQgKz0gNjsKKyAgICAgICAgICAgICAgICBpZiAoc3RybmNtcCgiNDIwSlBFRyIsIHRva3N0YXJ0LCA3KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBhbHRfcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MjBNUEVHMiIsIHRva3N0YXJ0LCA4KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBhbHRfcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MjBQQUxEViIsIHRva3N0YXJ0LCA4KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBhbHRfcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MjBQOSIsIHRva3N0YXJ0LCA1KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBhbHRfcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgiNDIyUDkiLCB0b2tzdGFydCwgNSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA5OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoIjQ0NFA5IiwgdG9rc3RhcnQsIDUpID09IDApCisgICAgICAgICAgICAgICAgICAgIGFsdF9waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MjBQMTAiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxMDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MjJQMTAiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0NDRQMTAiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MjBQMTIiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxMjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MjJQMTIiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0NDRQMTIiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MjBQMTQiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxNDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MjJQMTQiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxNDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0NDRQMTQiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxNDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MjBQMTYiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxNjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MjJQMTYiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxNjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0NDRQMTYiLCB0b2tzdGFydCwgNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxNjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCI0MTEiLCB0b2tzdGFydCwgMykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWx0X3BpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQxMVA7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgiNDIyIiwgdG9rc3RhcnQsIDMpID09IDApCisgICAgICAgICAgICAgICAgICAgIGFsdF9waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoIjQ0NCIsIHRva3N0YXJ0LCAzKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBhbHRfcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICh0b2tzdGFydCA8IGhlYWRlcl9lbmQgJiYgKnRva3N0YXJ0ICE9IDB4MjApCisgICAgICAgICAgICAgICAgdG9rc3RhcnQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHdpZHRoID09IC0xIHx8IGhlaWdodCA9PSAtMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiWVVWNE1QRUcgaGFzIGludmFsaWQgaGVhZGVyLlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgaWYgKGFsdF9waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBpeF9mbXQgPSBhbHRfcGl4X2ZtdDsKKyAgICB9CisKKyAgICBpZiAocmF0ZW4gPD0gMCB8fCByYXRlZCA8PSAwKSB7CisgICAgICAgIC8vIEZyYW1lIHJhdGUgdW5rbm93bgorICAgICAgICByYXRlbiA9IDI1OworICAgICAgICByYXRlZCA9IDE7CisgICAgfQorCisgICAgaWYgKGFzcGVjdG4gPT0gMCAmJiBhc3BlY3RkID09IDApIHsKKyAgICAgICAgLy8gUGl4ZWwgYXNwZWN0IHVua25vd24KKyAgICAgICAgYXNwZWN0ZCA9IDE7CisgICAgfQorCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjLT53aWR0aCAgPSB3aWR0aDsKKyAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGhlaWdodDsKKyAgICBhdl9yZWR1Y2UoJnJhdGVuLCAmcmF0ZWQsIHJhdGVuLCByYXRlZCwgKDFVTCA8PCAzMSkgLSAxKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgcmF0ZWQsIHJhdGVuKTsKKyAgICBzdC0+YXZnX2ZyYW1lX3JhdGUgICAgICAgICAgICAgICAgPSBhdl9pbnZfcShzdC0+dGltZV9iYXNlKTsKKyAgICBzdC0+Y29kZWMtPnBpeF9mbXQgICAgICAgICAgICAgICAgPSBwaXhfZm10OworICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyAgICAgICAgICAgPSAoQVZSYXRpb25hbCl7IGFzcGVjdG4sIGFzcGVjdGQgfTsKKyAgICBzdC0+Y29kZWMtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24gPSBjaHJvbWFfc2FtcGxlX2xvY2F0aW9uOworICAgIHN0LT5jb2RlYy0+ZmllbGRfb3JkZXIgICAgICAgICAgICA9IGZpZWxkX29yZGVyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeXV2NF9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IGk7CisgICAgY2hhciBoZWFkZXJbTUFYX0ZSQU1FX0hFQURFUisxXTsKKyAgICBpbnQgcGFja2V0X3NpemUsIHdpZHRoLCBoZWlnaHQsIHJldDsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9GUkFNRV9IRUFERVI7IGkrKykgeworICAgICAgICBoZWFkZXJbaV0gPSBhdmlvX3I4KHMtPnBiKTsKKyAgICAgICAgaWYgKGhlYWRlcltpXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBoZWFkZXJbaSArIDFdID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5wYi0+ZXJyb3IpCisgICAgICAgIHJldHVybiBzLT5wYi0+ZXJyb3I7CisgICAgZWxzZSBpZiAocy0+cGItPmVvZl9yZWFjaGVkKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgZWxzZSBpZiAoaSA9PSBNQVhfRlJBTUVfSEVBREVSKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChzdHJuY21wKGhlYWRlciwgWTRNX0ZSQU1FX01BR0lDLCBzdHJsZW4oWTRNX0ZSQU1FX01BR0lDKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgd2lkdGggID0gc3QtPmNvZGVjLT53aWR0aDsKKyAgICBoZWlnaHQgPSBzdC0+Y29kZWMtPmhlaWdodDsKKworICAgIHBhY2tldF9zaXplID0gYXZwaWN0dXJlX2dldF9zaXplKHN0LT5jb2RlYy0+cGl4X2ZtdCwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHBhY2tldF9zaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIHBhY2tldF9zaXplOworCisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBwYWNrZXRfc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZWxzZSBpZiAocmV0ICE9IHBhY2tldF9zaXplKQorICAgICAgICByZXR1cm4gcy0+cGItPmVvZl9yZWFjaGVkID8gQVZFUlJPUl9FT0YgOiBBVkVSUk9SKEVJTyk7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeXV2NF9wcm9iZShBVlByb2JlRGF0YSAqcGQpCit7CisgICAgLyogY2hlY2sgZmlsZSBoZWFkZXIgKi8KKyAgICBpZiAoc3RybmNtcChwZC0+YnVmLCBZNE1fTUFHSUMsIHNpemVvZihZNE1fTUFHSUMpIC0gMSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfeXV2NG1wZWdwaXBlX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInl1djRtcGVncGlwZSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIllVVjRNUEVHIHBpcGUiKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSB5dXY0X3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IHl1djRfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0geXV2NF9yZWFkX3BhY2tldCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAieTRtIiwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZmb3JtYXQveXV2NG1wZWdlbmMuYyBiL2ZmbXBlZy9saWJhdmZvcm1hdC95dXY0bXBlZ2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOTU0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZmb3JtYXQveXV2NG1wZWdlbmMuYwpAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIFlVVjRNUEVHIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ5dXY0bXBlZy5oIgorCisjZGVmaW5lIFk0TV9MSU5FX01BWCAyNTYKKworc3RhdGljIGludCB5dXY0X2dlbmVyYXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsIGNoYXIqIGJ1ZikKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IHJhdGVuLCByYXRlZCwgYXNwZWN0biwgYXNwZWN0ZCwgbjsKKyAgICBjaGFyIGludGVyOworICAgIGNvbnN0IGNoYXIgKmNvbG9yc3BhY2UgPSAiIjsKKworICAgIHN0ICAgICA9IHMtPnN0cmVhbXNbMF07CisgICAgd2lkdGggID0gc3QtPmNvZGVjLT53aWR0aDsKKyAgICBoZWlnaHQgPSBzdC0+Y29kZWMtPmhlaWdodDsKKworICAgIC8vIFRPRE86IHNob3VsZCBiZSBhdmdfZnJhbWVfcmF0ZQorICAgIGF2X3JlZHVjZSgmcmF0ZW4sICZyYXRlZCwgc3QtPnRpbWVfYmFzZS5kZW4sCisgICAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UubnVtLCAoMVVMIDw8IDMxKSAtIDEpOworCisgICAgYXNwZWN0biA9IHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bTsKKyAgICBhc3BlY3RkID0gc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuOworCisgICAgaWYgKGFzcGVjdG4gPT0gMCAmJiBhc3BlY3RkID09IDEpCisgICAgICAgIGFzcGVjdGQgPSAwOyAgLy8gMDowIG1lYW5zIHVua25vd24KKworICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5maWVsZF9vcmRlcikgeworICAgIGNhc2UgQVZfRklFTERfVEI6CisgICAgY2FzZSBBVl9GSUVMRF9UVDogaW50ZXIgPSAndCc7IGJyZWFrOworICAgIGNhc2UgQVZfRklFTERfQlQ6CisgICAgY2FzZSBBVl9GSUVMRF9CQjogaW50ZXIgPSAnYic7IGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgIGludGVyID0gJ3AnOyBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQ21vbm8iOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2OgorICAgICAgICBjb2xvcnNwYWNlID0gIiBDbW9ubzE2IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQxMVA6CisgICAgICAgIGNvbG9yc3BhY2UgPSAiIEM0MTEgWFlTQ1NTPTQxMSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbikgeworICAgICAgICBjYXNlIEFWQ0hST01BX0xPQ19UT1BMRUZUOiBjb2xvcnNwYWNlID0gIiBDNDIwcGFsZHYgWFlTQ1NTPTQyMFBBTERWIjsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZDSFJPTUFfTE9DX0xFRlQ6ICAgIGNvbG9yc3BhY2UgPSAiIEM0MjBtcGVnMiBYWVNDU1M9NDIwTVBFRzIiOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQyMGpwZWcgWFlTQ1NTPTQyMEpQRUciOyAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOgorICAgICAgICBjb2xvcnNwYWNlID0gIiBDNDIyIFhZU0NTUz00MjIiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQ0NCBYWVNDU1M9NDQ0IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA5OgorICAgICAgICBjb2xvcnNwYWNlID0gIiBDNDIwcDkgWFlTQ1NTPTQyMFA5IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA5OgorICAgICAgICBjb2xvcnNwYWNlID0gIiBDNDIycDkgWFlTQ1NTPTQyMlA5IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA5OgorICAgICAgICBjb2xvcnNwYWNlID0gIiBDNDQ0cDkgWFlTQ1NTPTQ0NFA5IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMDoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQyMHAxMCBYWVNDU1M9NDIwUDEwIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQyMnAxMCBYWVNDU1M9NDIyUDEwIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQ0NHAxMCBYWVNDU1M9NDQ0UDEwIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMjoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQyMHAxMiBYWVNDU1M9NDIwUDEyIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMjoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQyMnAxMiBYWVNDU1M9NDIyUDEyIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMjoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQ0NHAxMiBYWVNDU1M9NDQ0UDEyIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNDoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQyMHAxNCBYWVNDU1M9NDIwUDE0IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNDoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQyMnAxNCBYWVNDU1M9NDIyUDE0IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNDoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQ0NHAxNCBYWVNDU1M9NDQ0UDE0IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNjoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQyMHAxNiBYWVNDU1M9NDIwUDE2IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNjoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQyMnAxNiBYWVNDU1M9NDIyUDE2IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNjoKKyAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQ0NHAxNiBYWVNDU1M9NDQ0UDE2IjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogY29uc3RydWN0IHN0cmVhbSBoZWFkZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGZyYW1lICovCisgICAgbiA9IHNucHJpbnRmKGJ1ZiwgWTRNX0xJTkVfTUFYLCAiJXMgVyVkIEglZCBGJWQ6JWQgSSVjIEElZDolZCVzXG4iLAorICAgICAgICAgICAgICAgICBZNE1fTUFHSUMsIHdpZHRoLCBoZWlnaHQsIHJhdGVuLCByYXRlZCwgaW50ZXIsCisgICAgICAgICAgICAgICAgIGFzcGVjdG4sIGFzcGVjdGQsIGNvbG9yc3BhY2UpOworCisgICAgcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgeXV2NF93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWUGljdHVyZSAqcGljdHVyZSwgcGljdHVyZV90bXA7CisgICAgaW50KiBmaXJzdF9wa3QgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHdpZHRoLCBoZWlnaHQsIGhfY2hyb21hX3NoaWZ0LCB2X2Nocm9tYV9zaGlmdDsKKyAgICBpbnQgaTsKKyAgICBjaGFyIGJ1ZjJbWTRNX0xJTkVfTUFYICsgMV07CisgICAgY2hhciBidWYxWzIwXTsKKyAgICB1aW50OF90ICpwdHIsICpwdHIxLCAqcHRyMjsKKworICAgIG1lbWNweSgmcGljdHVyZV90bXAsIHBrdC0+ZGF0YSwgc2l6ZW9mKEFWUGljdHVyZSkpOworICAgIHBpY3R1cmUgPSAmcGljdHVyZV90bXA7CisKKyAgICAvKiBmb3IgdGhlIGZpcnN0IHBhY2tldCB3ZSBoYXZlIHRvIG91dHB1dCB0aGUgaGVhZGVyIGFzIHdlbGwgKi8KKyAgICBpZiAoKmZpcnN0X3BrdCkgeworICAgICAgICAqZmlyc3RfcGt0ID0gMDsKKyAgICAgICAgaWYgKHl1djRfZ2VuZXJhdGVfaGVhZGVyKHMsIGJ1ZjIpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRXJyb3IuIFlVVjRNUEVHIHN0cmVhbSBoZWFkZXIgd3JpdGUgZmFpbGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZpb193cml0ZShwYiwgYnVmMiwgc3RybGVuKGJ1ZjIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvbnN0cnVjdCBmcmFtZSBoZWFkZXIgKi8KKworICAgIHNucHJpbnRmKGJ1ZjEsIHNpemVvZihidWYxKSwgIiVzXG4iLCBZNE1fRlJBTUVfTUFHSUMpOworICAgIGF2aW9fd3JpdGUocGIsIGJ1ZjEsIHN0cmxlbihidWYxKSk7CisKKyAgICB3aWR0aCAgPSBzdC0+Y29kZWMtPndpZHRoOworICAgIGhlaWdodCA9IHN0LT5jb2RlYy0+aGVpZ2h0OworCisgICAgcHRyID0gcGljdHVyZS0+ZGF0YVswXTsKKworICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5waXhfZm10KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MTFQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTI6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE0OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE2OgorICAgICAgICB3aWR0aCAqPSAyOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVGhlIHBpeGVsIGZvcm1hdCAnJXMnIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShzdC0+Y29kZWMtPnBpeF9mbXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgYXZpb193cml0ZShwYiwgcHRyLCB3aWR0aCk7CisgICAgICAgIHB0ciArPSBwaWN0dXJlLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICBpZiAoc3QtPmNvZGVjLT5waXhfZm10ICE9IEFWX1BJWF9GTVRfR1JBWTggJiYKKyAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ICE9IEFWX1BJWF9GTVRfR1JBWTE2KSB7CisgICAgICAgIC8vIEFkanVzdCBmb3Igc21hbGxlciBDYiBhbmQgQ3IgcGxhbmVzCisgICAgICAgIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKHN0LT5jb2RlYy0+cGl4X2ZtdCwgJmhfY2hyb21hX3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9jaHJvbWFfc2hpZnQpOworICAgICAgICB3aWR0aCAgPSBGRl9DRUlMX1JTSElGVCh3aWR0aCwgIGhfY2hyb21hX3NoaWZ0KTsKKyAgICAgICAgaGVpZ2h0ID0gRkZfQ0VJTF9SU0hJRlQoaGVpZ2h0LCB2X2Nocm9tYV9zaGlmdCk7CisKKyAgICAgICAgcHRyMSA9IHBpY3R1cmUtPmRhdGFbMV07CisgICAgICAgIHB0cjIgPSBwaWN0dXJlLT5kYXRhWzJdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsgICAgIC8qIENiICovCisgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBwdHIxLCB3aWR0aCk7CisgICAgICAgICAgICBwdHIxICs9IHBpY3R1cmUtPmxpbmVzaXplWzFdOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeyAgICAgLyogQ3IgKi8KKyAgICAgICAgICAgIGF2aW9fd3JpdGUocGIsIHB0cjIsIHdpZHRoKTsKKyAgICAgICAgICAgIHB0cjIgKz0gcGljdHVyZS0+bGluZXNpemVbMl07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB5dXY0X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50ICpmaXJzdF9wa3QgPSBzLT5wcml2X2RhdGE7CisKKyAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgaWYgKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9SQVdWSURFTykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRVJST1I6IE9ubHkgcmF3dmlkZW8gc3VwcG9ydGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHN3aXRjaCAocy0+c3RyZWFtc1swXS0+Y29kZWMtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDExUDoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiV2FybmluZzogZ2VuZXJhdGluZyByYXJlbHkgdXNlZCA0OjE6MSBZVVYgIgorICAgICAgICAgICAgICAgInN0cmVhbSwgc29tZSBtanBlZ3Rvb2xzIG1pZ2h0IG5vdCB3b3JrLlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTI6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE0OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE2OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTY6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNjoKKyAgICAgICAgaWYgKHMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+PSBGRl9DT01QTElBTkNFX05PUk1BTCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiclcycgaXMgbm90IGEgb2ZmaWNpYWwgeXV2NG1wZWdwaXBlIHBpeGVsIGZvcm1hdC4gIgorICAgICAgICAgICAgICAgICAgICJVc2UgJy1zdHJpY3QgLTEnIHRvIGVuY29kZSB0byB0aGlzIHBpeGVsIGZvcm1hdC5cbiIsCisgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShzLT5zdHJlYW1zWzBdLT5jb2RlYy0+cGl4X2ZtdCkpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJXYXJuaW5nOiBnZW5lcmF0aW5nIG5vbiBzdGFuZGFyZCBZVVYgc3RyZWFtLiAiCisgICAgICAgICAgICAgICAiTWpwZWd0b29scyB3aWxsIG5vdCB3b3JrLlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFUlJPUjogeXV2NG1wZWcgY2FuIG9ubHkgaGFuZGxlICIKKyAgICAgICAgICAgICAgICJ5dXY0NDRwLCB5dXY0MjJwLCB5dXY0MjBwLCB5dXY0MTFwIGFuZCBncmF5OCBwaXhlbCBmb3JtYXRzLiAiCisgICAgICAgICAgICAgICAiQW5kIHVzaW5nICdzdHJpY3QgLTEnIGFsc28geXV2NDQ0cDksIHl1djQyMnA5LCB5dXY0MjBwOSwgIgorICAgICAgICAgICAgICAgInl1djQ0NHAxMCwgeXV2NDIycDEwLCB5dXY0MjBwMTAsICIKKyAgICAgICAgICAgICAgICJ5dXY0NDRwMTIsIHl1djQyMnAxMiwgeXV2NDIwcDEyLCAiCisgICAgICAgICAgICAgICAieXV2NDQ0cDE0LCB5dXY0MjJwMTQsIHl1djQyMHAxNCwgIgorICAgICAgICAgICAgICAgInl1djQ0NHAxNiwgeXV2NDIycDE2LCB5dXY0MjBwMTYgIgorICAgICAgICAgICAgICAgImFuZCBncmF5MTYgcGl4ZWwgZm9ybWF0cy4gIgorICAgICAgICAgICAgICAgIlVzZSAtcGl4X2ZtdCB0byBzZWxlY3Qgb25lLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgKmZpcnN0X3BrdCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3l1djRtcGVncGlwZV9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAieXV2NG1wZWdwaXBlIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiWVVWNE1QRUcgcGlwZSIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJ5NG0iLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihpbnQpLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCisgICAgLndyaXRlX2hlYWRlciAgICAgID0geXV2NF93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0geXV2NF93cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfUkFXUElDVFVSRSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9NYWtlZmlsZSBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODU3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9NYWtlZmlsZQpAQCAtMCwwICsxLDE4IEBACitOQU1FID0gYXZyZXNhbXBsZQorCitIRUFERVJTID0gYXZyZXNhbXBsZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdmVyc2lvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK09CSlMgPSBhdWRpb19jb252ZXJ0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdWRpb19kYXRhLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdWRpb19taXgubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdWRpb19taXhfbWF0cml4Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBkaXRoZXIubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBvcHRpb25zLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXNhbXBsZS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB1dGlscy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworIyBXaW5kb3dzIHJlc291cmNlIGZpbGUKK1NMSUJPQkpTLSQoSEFWRV9HTlVfV0lORFJFUykgKz0gYXZyZXNhbXBsZXJlcy5vCisKK1RFU1RQUk9HUyA9IGF2cmVzYW1wbGUKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2FhcmNoNjQvTWFrZWZpbGUgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hYXJjaDY0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOWU1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hYXJjaDY0L01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorT0JKUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9hdWRpb19jb252ZXJ0X2luaXQubyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXJjaDY0L3Jlc2FtcGxlX2luaXQubyAgICAgICAgIFwKKworT0JKUy0kKENPTkZJR19ORU9OX0NMT0JCRVJfVEVTVCkgKz0gYWFyY2g2NC9uZW9udGVzdC5vCisKK05FT04tT0JKUyAgICAgICAgICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvYXVkaW9fY29udmVydF9uZW9uLm8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFyY2g2NC9yZXNhbXBsZV9uZW9uLm8gICAgICAgICBcCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9hYXJjaDY0L2FzbS1vZmZzZXRzLmggYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hYXJjaDY0L2FzbS1vZmZzZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1ODI0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2FhcmNoNjQvYXNtLW9mZnNldHMuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZSRVNBTVBMRV9BQVJDSDY0X0FTTV9PRkZTRVRTX0gKKyNkZWZpbmUgQVZSRVNBTVBMRV9BQVJDSDY0X0FTTV9PRkZTRVRTX0gKKworLyogc3RydWN0IFJlc2FtcGxlQ29udGV4dCAqLworI2RlZmluZSBGSUxURVJfQkFOSyAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRklMVEVSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIFBIQVNFX1NISUZUICAgICAgICAgICAgICAgICAgICAgMHgzNAorI2RlZmluZSBQSEFTRV9NQVNLICAgICAgICAgICAgICAgICAgICAgIChQSEFTRV9TSElGVCArIDB4MDQpIC8vIGxvYWRlZCBhcyBwYWlyCisKKyNlbmRpZiAvKiBBVlJFU0FNUExFX0FBUkNINjRfQVNNX09GRlNFVFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYWFyY2g2NC9hdWRpb19jb252ZXJ0X2luaXQuYyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2FhcmNoNjQvYXVkaW9fY29udmVydF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViMGQxZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2FhcmNoNjQvYXVkaW9fY29udmVydF9pbml0LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAibGliYXZyZXNhbXBsZS9hdWRpb19jb252ZXJ0LmgiCisKK3ZvaWQgZmZfY29udl9mbHRfdG9fczE2X25lb24oaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBpbnQgbGVuKTsKK3ZvaWQgZmZfY29udl9mbHRwX3RvX3MxNl9uZW9uKGludDE2X3QgKmRzdCwgZmxvYXQgKmNvbnN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uKGludDE2X3QgKmRzdCwgZmxvYXQgKmNvbnN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKKworYXZfY29sZCB2b2lkIGZmX2F1ZGlvX2NvbnZlcnRfaW5pdF9hYXJjaDY0KEF1ZGlvQ29udmVydCAqYWMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMTYsIDgsICJORU9OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9jb252X2ZsdF90b19zMTZfbmVvbik7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMTYsIDgsICJORU9OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uKTsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxNiwgOCwgIk5FT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NvbnZfZmx0cF90b19zMTZfbmVvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYWFyY2g2NC9hdWRpb19jb252ZXJ0X25lb24uUyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2FhcmNoNjQvYXVkaW9fY29udmVydF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzZTI3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2FhcmNoNjQvYXVkaW9fY29udmVydF9uZW9uLlMKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSmFubmUgR3J1bmF1IDxqYW5uZS1saWJhdkBqYW5uYXUubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMiCisKK2Z1bmN0aW9uIGZmX2NvbnZfZmx0X3RvX3MxNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWJzICAgICAgICAgICAgeDIsICB4MiwgICM4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHN9LCBbeDFdLCAgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NC40cywgIHYwLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNHN9LCBbeDFdLCAgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NS40cywgIHYxLjRzLCAgIzMxCisgICAgICAgIGIuZXEgICAgICAgICAgICAzZgorICAgICAgICBhbmRzICAgICAgICAgICAgeDEyLCB4MiwgICN+MTUKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDJmCisxOiAgICAgIHN1YnMgICAgICAgICAgICB4MTIsIHgxMiwgIzE2CisgICAgICAgIHNxcnNocm4gICAgICAgICB2NC40aCwgIHY0LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNHN9LCBbeDFdLCAgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Ni40cywgIHYyLjRzLCAgIzMxCisgICAgICAgIHNxcnNocm4yICAgICAgICB2NC44aCwgIHY1LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuNHN9LCBbeDFdLCAgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Ny40cywgIHYzLjRzLCAgIzMxCisgICAgICAgIHNxcnNocm4gICAgICAgICB2Ni40aCwgIHY2LjRzLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuOGh9LCBbeDBdLCAgIzE2CisgICAgICAgIHNxcnNocm4yICAgICAgICB2Ni44aCwgIHY3LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHN9LCBbeDFdLCAgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NC40cywgIHYwLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNHN9LCBbeDFdLCAgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NS40cywgIHYxLjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djYuOGh9LCBbeDBdLCAgIzE2CisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICBhbmRzICAgICAgICAgICAgeDIsICB4MiwgICMxNQorICAgICAgICBiLmVxICAgICAgICAgICAgM2YKKzI6ICAgICAgbGQxICAgICAgICAgICAgIHt2Mi40c30sIFt4MV0sICAjMTYKKyAgICAgICAgc3Fyc2hybiAgICAgICAgIHY0LjRoLCAgdjQuNHMsICAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY2LjRzLCAgdjIuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My40c30sIFt4MV0sICAjMTYKKyAgICAgICAgc3Fyc2hybjIgICAgICAgIHY0LjhoLCAgdjUuNHMsICAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY3LjRzLCAgdjMuNHMsICAjMzEKKyAgICAgICAgc3Fyc2hybiAgICAgICAgIHY2LjRoLCAgdjYuNHMsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC44aH0sIFt4MF0sICAjMTYKKyAgICAgICAgc3Fyc2hybjIgICAgICAgIHY2LjhoLCAgdjcuNHMsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ni44aH0sIFt4MF0KKyAgICAgICAgcmV0CiszOiAgICAgIHNxcnNocm4gICAgICAgICB2NC40aCwgIHY0LjRzLCAgIzE2CisgICAgICAgIHNxcnNocm4yICAgICAgICB2NC44aCwgIHY1LjRzLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuOGh9LCBbeDBdCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHAgICAgICAgICAgICAgeDQsICB4NSwgIFt4MV0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHgyLCAgeDIsICAjOAorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRzfSwgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjQuNHMsICB2MC40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjRzfSwgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjUuNHMsICB2MS40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRzfSwgIFt4NV0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjYuNHMsICB2Mi40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjRzfSwgIFt4NV0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjcuNHMsICB2My40cywgICMzMQorICAgICAgICBiLmVxICAgICAgICAgICAgM2YKKyAgICAgICAgYW5kcyAgICAgICAgICAgIHgxMiwgeDIsICAjfjE1CisgICAgICAgIGIuZXEgICAgICAgICAgICAyZgorMTogICAgICBzdWJzICAgICAgICAgICAgeDEyLCB4MTIsICMxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi40c30sIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjIwLjRzLCB2MTYuNHMsICMzMQorICAgICAgICBzcmkgICAgICAgICAgICAgdjYuNHMsICB2NC40cywgICMxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNy40c30sIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjIxLjRzLCB2MTcuNHMsICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxOC40c30sIFt4NV0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjIyLjRzLCB2MTguNHMsICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxOS40c30sIFt4NV0sICMxNgorICAgICAgICBzcmkgICAgICAgICAgICAgdjcuNHMsICB2NS40cywgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y2LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjIzLjRzLCB2MTkuNHMsICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y3LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBzcmkgICAgICAgICAgICAgdjIyLjRzLCB2MjAuNHMsICMxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRzfSwgIFt4NF0sICMxNgorICAgICAgICBzcmkgICAgICAgICAgICAgdjIzLjRzLCB2MjEuNHMsICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi40c30sIFt4MF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjQuNHMsICB2MC40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjRzfSwgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjUuNHMsICB2MS40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRzfSwgIFt4NV0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjYuNHMsICB2Mi40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjRzfSwgIFt4NV0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjcuNHMsICB2My40cywgICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy40c30sIFt4MF0sICMxNgorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKyAgICAgICAgYW5kcyAgICAgICAgICAgIHgyLCAgeDIsICAjMTUKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDNmCisyOiAgICAgIHNyaSAgICAgICAgICAgICB2Ni40cywgIHY0LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHN9LCAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MC40cywgIHYwLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNHN9LCAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MS40cywgIHYxLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNHN9LCAgW3g1XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Mi40cywgIHYyLjRzLCAgIzMxCisgICAgICAgIHNyaSAgICAgICAgICAgICB2Ny40cywgIHY1LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuNHN9LCAgW3g1XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2My40cywgIHYzLjRzLCAgIzMxCisgICAgICAgIHNyaSAgICAgICAgICAgICB2Mi40cywgIHYwLjRzLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djYuNHMsdjcuNHN9LCAgW3gwXSwgIzMyCisgICAgICAgIHNyaSAgICAgICAgICAgICB2My40cywgIHYxLjRzLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuNHMsdjMuNHN9LCAgW3gwXSwgIzMyCisgICAgICAgIHJldAorMzogICAgICBzcmkgICAgICAgICAgICAgdjYuNHMsICB2NC40cywgICMxNgorICAgICAgICBzcmkgICAgICAgICAgICAgdjcuNHMsICB2NS40cywgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y2LjRzLHY3LjRzfSwgIFt4MF0KKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2NvbnZfZmx0cF90b19zMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgY21wICAgICAgICAgICAgIHczLCAgIzIKKyAgICAgICAgYi5lcSAgICAgICAgICAgIFgoZmZfY29udl9mbHRwX3RvX3MxNl8yY2hfbmVvbikKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFmCisgICAgICAgIGxkciAgICAgICAgICAgICB4MSwgIFt4MV0KKyAgICAgICAgYiAgICAgICAgICAgICAgIFgoZmZfY29udl9mbHRfdG9fczE2X25lb24pCisxOgorICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjNAorICAgICAgICBsc2wgICAgICAgICAgICAgeDEyLCB4MywgICMxCisgICAgICAgIGIubHQgICAgICAgICAgICA0ZgorCis1OiAgICAgIC8vIDQgY2hhbm5lbHMKKyAgICAgICAgbGRwICAgICAgICAgICAgIHg0LCB4NSwgW3gxXSwgIzE2CisgICAgICAgIGxkcCAgICAgICAgICAgICB4NiwgeDcsIFt4MV0sICMxNgorICAgICAgICBtb3YgICAgICAgICAgICAgdzksICB3MgorICAgICAgICBtb3YgICAgICAgICAgICAgeDgsICB4MAorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjQuNHMsICB2NC40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjRzfSwgICAgICAgIFt4NV0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjUuNHMsICB2NS40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjRzfSwgICAgICAgIFt4Nl0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjYuNHMsIHY2LjRzLCAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny40c30sICAgICAgICBbeDddLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY3LjRzLCB2Ny40cywgIzMxCis2OgorICAgICAgICBzdWJzICAgICAgICAgICAgdzksICB3OSwgICM4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MC40cywgIHYwLjRzLCAgIzMxCisgICAgICAgIHNyaSAgICAgICAgICAgICB2NS40cywgIHY0LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNHN9LCAgICAgICAgW3g1XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MS40cywgIHYxLjRzLCAgIzMxCisgICAgICAgIHNyaSAgICAgICAgICAgICB2Ny40cywgIHY2LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNHN9LCAgICAgICAgW3g2XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Mi40cywgIHYyLjRzLCAgIzMxCisgICAgICAgIHppcDEgICAgICAgICAgICB2MTYuNHMsIHY1LjRzLCAgdjcuNHMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My40c30sICAgICAgICBbeDddLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYzLjRzLCAgdjMuNHMsICAjMzEKKyAgICAgICAgemlwMiAgICAgICAgICAgIHYxNy40cywgdjUuNHMsICB2Ny40cworICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi5kfVswXSwgICAgIFt4OF0sIHgxMgorICAgICAgICBzcmkgICAgICAgICAgICAgdjEuNHMsICB2MC40cywgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi5kfVsxXSwgICAgIFt4OF0sIHgxMgorICAgICAgICBzcmkgICAgICAgICAgICAgdjMuNHMsICB2Mi40cywgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNy5kfVswXSwgICAgIFt4OF0sIHgxMgorICAgICAgICB6aXAxICAgICAgICAgICAgdjE4LjRzLCB2MS40cywgIHYzLjRzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE3LmR9WzFdLCAgICAgW3g4XSwgeDEyCisgICAgICAgIHppcDIgICAgICAgICAgICB2MTkuNHMsIHYxLjRzLCAgdjMuNHMKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDdmCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NC40cywgIHY0LjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE4LmR9WzBdLCAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuNHN9LCAgICAgICAgW3g1XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NS40cywgIHY1LjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE4LmR9WzFdLCAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuNHN9LCAgICBbeDZdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY2LjRzLCB2Ni40cywgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE5LmR9WzBdLCAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuNHN9LCAgICBbeDddLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY3LjRzLCB2Ny40cywgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE5LmR9WzFdLCAgICAgW3g4XSwgeDEyCisgICAgICAgIGIgICAgICAgICAgICAgICA2YgorNzoKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguZH1bMF0sICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguZH1bMV0sICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuZH1bMF0sICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuZH1bMV0sICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHczLCAgdzMsICAjNAorICAgICAgICBiLmVxICAgICAgICAgICAgZW5kCisgICAgICAgIGNtcCAgICAgICAgICAgICB3MywgICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzgKKyAgICAgICAgYi5nZSAgICAgICAgICAgIDViCisKKzQ6ICAgICAgLy8gMiBjaGFubmVscworICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjMgorICAgICAgICBiLmx0ICAgICAgICAgICAgNGYKKyAgICAgICAgbGRwICAgICAgICAgICAgIHg0LCAgeDUsICBbeDFdLCAjMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHc5LCAgdzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgdHN0ICAgICAgICAgICAgIHc5LCAgIzgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY0LjRzLCAgdjQuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS40c30sICAgICAgICBbeDVdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY1LjRzLCAgdjUuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY2LjRzLCAgdjYuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny40c30sICAgICAgICBbeDVdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY3LjRzLCAgdjcuNHMsICAjMzEKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDZmCisgICAgICAgIHN1YnMgICAgICAgICAgICB3OSwgIHc5LCAgIzgKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDdmCisgICAgICAgIHNyaSAgICAgICAgICAgICB2NS40cywgIHY0LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NC40cywgIHY0LjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bMF0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHNyaSAgICAgICAgICAgICB2Ny40cywgIHY2LjRzLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bMV0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Ni40cywgIHY2LjRzLCAjMzEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVsyXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVszXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVswXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVsxXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS40c30sICAgICAgICBbeDVdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY1LjRzLCAgdjUuNHMsICAjMzEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVsyXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVszXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny40c30sICAgICAgICBbeDVdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY3LjRzLCAgdjcuNHMsICAjMzEKKzY6CisgICAgICAgIHN1YnMgICAgICAgICAgICB3OSwgIHc5LCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIHNyaSAgICAgICAgICAgICB2NS40cywgIHY0LjRzLCAgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MC40cywgIHYwLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNHN9LCAgICAgICAgW3g1XSwgIzE2CisgICAgICAgIHNyaSAgICAgICAgICAgICB2Ny40cywgIHY2LjRzLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bMF0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bMV0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MS40cywgIHYxLjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bMl0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bM10sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuc31bMF0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Mi40cywgIHYyLjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuc31bMV0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuNHN9LCAgICAgICAgW3g1XSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuc31bMl0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGZjdnR6cyAgICAgICAgICB2My40cywgIHYzLjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuc31bM10sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHNyaSAgICAgICAgICAgICB2MS40cywgIHYwLjRzLCAgIzE2CisgICAgICAgIHNyaSAgICAgICAgICAgICB2My40cywgIHYyLjRzLCAgIzE2CisgICAgICAgIGIuZXEgICAgICAgICAgICA2ZgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLnN9WzBdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjQuNHMsICB2NC40cywgICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLnN9WzFdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjRzfSwgICAgICAgIFt4NV0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLnN9WzJdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjUuNHMsICB2NS40cywgICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLnN9WzNdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLnN9WzBdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjYuNHMsICB2Ni40cywgICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLnN9WzFdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y3LjRzfSwgICAgICAgIFt4NV0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLnN9WzJdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjcuNHMsICB2Ny40cywgICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLnN9WzNdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBiLmd0ICAgICAgICAgICAgNmIKKzY6CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bMF0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bMV0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bMl0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bM10sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuc31bMF0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuc31bMV0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuc31bMl0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuc31bM10sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGIgICAgICAgICAgICAgICA4ZgorNzoKKyAgICAgICAgc3JpICAgICAgICAgICAgIHY1LjRzLCAgdjQuNHMsICAjMTYKKyAgICAgICAgc3JpICAgICAgICAgICAgIHY3LjRzLCAgdjYuNHMsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVswXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVsxXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVsyXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVszXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVswXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVsxXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVsyXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVszXSwgICAgICBbeDhdLCB4MTIKKzg6CisgICAgICAgIHN1YnMgICAgICAgICAgICB3MywgIHczLCAgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjNAorICAgICAgICBiLmVxICAgICAgICAgICAgZW5kCisKKzQ6ICAgICAgLy8gMSBjaGFubmVsCisgICAgICAgIGxkciAgICAgICAgICAgICB4NCwgIFt4MV0KKyAgICAgICAgdHN0ICAgICAgICAgICAgIHcyLCAgIzgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHc5LCAgdzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgeDAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYwLjRzLCAgdjAuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYxLjRzLCAgdjEuNHMsICAjMzEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDhmCis2OgorICAgICAgICBzdWJzICAgICAgICAgICAgdzksICB3OSwgICMxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjIuNHMsICB2Mi40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjMuNHMsICB2My40cywgICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLmh9WzFdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLmh9WzNdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLmh9WzVdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLmh9WzddLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLmh9WzFdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLmh9WzNdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLmh9WzVdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLmh9WzddLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBiLmVxICAgICAgICAgICAgN2YKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYwLjRzLCAgdjAuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYxLjRzLCAgdjEuNHMsICAjMzEKKzc6CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuaH1bMV0sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuaH1bM10sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuaH1bNV0sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuaH1bN10sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuaH1bMV0sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuaH1bM10sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuaH1bNV0sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuaH1bN10sICAgICAgW3g1XSwgeDEyCisgICAgICAgIGIuZ3QgICAgICAgICAgICA2YgorICAgICAgICByZXQKKzg6CisgICAgICAgIHN1YnMgICAgICAgICAgICB3OSwgIHc5LCAgIzgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5ofVsxXSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5ofVszXSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5ofVs1XSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5ofVs3XSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5ofVsxXSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5ofVszXSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5ofVs1XSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5ofVs3XSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgYi5lcSAgICAgICAgICAgIGVuZAorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjAuNHMsICB2MC40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjEuNHMsICB2MS40cywgICMzMQorICAgICAgICBiICAgICAgICAgICAgICAgNmIKK2VuZDoKKyAgICAgICAgcmV0CitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9hYXJjaDY0L25lb250ZXN0LmMgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hYXJjaDY0L25lb250ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1NmVlNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2FhcmNoNjQvbmVvbnRlc3QuYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogY2hlY2sgTkVPTiByZWdpc3RlcnMgZm9yIGNsb2JiZXJzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L25lb250ZXN0LmgiCisKK3dyYXAoYXZyZXNhbXBsZV9jb252ZXJ0KEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwgdWludDhfdCAqKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfcGxhbmVfc2l6ZSwgaW50IG91dF9zYW1wbGVzLCB1aW50OF90ICoqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5fcGxhbmVfc2l6ZSwgaW50IGluX3NhbXBsZXMpKQoreworICAgIHRlc3RuZW9uY2xvYmJlcnMoYXZyZXNhbXBsZV9jb252ZXJ0LCBhdnIsIG91dHB1dCwgb3V0X3BsYW5lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBvdXRfc2FtcGxlcywgaW5wdXQsIGluX3BsYW5lX3NpemUsIGluX3NhbXBsZXMpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYWFyY2g2NC9yZXNhbXBsZV9pbml0LmMgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hYXJjaDY0L3Jlc2FtcGxlX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2RmYjEyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYWFyY2g2NC9yZXNhbXBsZV9pbml0LmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImxpYmF2cmVzYW1wbGUvcmVzYW1wbGUuaCIKKworI2luY2x1ZGUgImFzbS1vZmZzZXRzLmgiCisKK0FWX0NIRUNLX09GRlNFVChzdHJ1Y3QgUmVzYW1wbGVDb250ZXh0LCBmaWx0ZXJfYmFuaywgICBGSUxURVJfQkFOSyk7CitBVl9DSEVDS19PRkZTRVQoc3RydWN0IFJlc2FtcGxlQ29udGV4dCwgZmlsdGVyX2xlbmd0aCwgRklMVEVSX0xFTkdUSCk7CitBVl9DSEVDS19PRkZTRVQoc3RydWN0IFJlc2FtcGxlQ29udGV4dCwgcGhhc2Vfc2hpZnQsICAgUEhBU0VfU0hJRlQpOworQVZfQ0hFQ0tfT0ZGU0VUKHN0cnVjdCBSZXNhbXBsZUNvbnRleHQsIHBoYXNlX21hc2ssICAgIFBIQVNFX01BU0spOworCit2b2lkIGZmX3Jlc2FtcGxlX29uZV9kYmxfbmVvbihzdHJ1Y3QgUmVzYW1wbGVDb250ZXh0ICpjLCB2b2lkICpkc3QwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9pbmRleCwgY29uc3Qgdm9pZCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmRleCwgaW50IGZyYWMpOwordm9pZCBmZl9yZXNhbXBsZV9vbmVfZmx0X25lb24oc3RydWN0IFJlc2FtcGxlQ29udGV4dCAqYywgdm9pZCAqZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfaW5kZXgsIGNvbnN0IHZvaWQgKnNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIGludCBmcmFjKTsKK3ZvaWQgZmZfcmVzYW1wbGVfb25lX3MxNl9uZW9uKHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKmMsIHZvaWQgKmRzdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X2luZGV4LCBjb25zdCB2b2lkICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGV4LCBpbnQgZnJhYyk7Cit2b2lkIGZmX3Jlc2FtcGxlX29uZV9zMzJfbmVvbihzdHJ1Y3QgUmVzYW1wbGVDb250ZXh0ICpjLCB2b2lkICpkc3QwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9pbmRleCwgY29uc3Qgdm9pZCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmRleCwgaW50IGZyYWMpOworCit2b2lkIGZmX2F1ZGlvX3Jlc2FtcGxlX2luaXRfYWFyY2g2NChSZXNhbXBsZUNvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoIWMtPmxpbmVhcikgeworICAgICAgICAgICAgc3dpdGNoIChzYW1wbGVfZm10KSB7CisgICAgICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMUDoKKyAgICAgICAgICAgICAgICBjLT5yZXNhbXBsZV9vbmUgID0gZmZfcmVzYW1wbGVfb25lX2RibF9uZW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVFA6CisgICAgICAgICAgICAgICAgYy0+cmVzYW1wbGVfb25lICA9IGZmX3Jlc2FtcGxlX29uZV9mbHRfbmVvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOgorICAgICAgICAgICAgICAgIGMtPnJlc2FtcGxlX29uZSAgPSBmZl9yZXNhbXBsZV9vbmVfczE2X25lb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyUDoKKyAgICAgICAgICAgICAgICBjLT5yZXNhbXBsZV9vbmUgID0gZmZfcmVzYW1wbGVfb25lX3MzMl9uZW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYWFyY2g2NC9yZXNhbXBsZV9uZW9uLlMgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hYXJjaDY0L3Jlc2FtcGxlX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2MyY2JmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYWFyY2g2NC9yZXNhbXBsZV9uZW9uLlMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSmFubmUgR3J1bmF1IDxqYW5uZS1saWJhdkBqYW5uYXUubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMiCisjaW5jbHVkZSAiYXNtLW9mZnNldHMuaCIKKworLm1hY3JvIHJlc2FtcGxlX29uZSAgICAgZm10LCBlcz0yCisuaWZuYyBcZm10LCBkYmwKKyAgICAubWFjcm8gIE1fTVVMMiAgICAgIHg6dmFyYXJnCisgICAgLmVuZG0KKyAgICAubWFjcm8gIE1fTUxBMiAgICAgIHg6dmFyYXJnCisgICAgLmVuZG0KKy5lbmRpZgorZnVuY3Rpb24gZmZfcmVzYW1wbGVfb25lX1xmbXRcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3h0dyAgICAgICAgICAgIHgyLCAgdzIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHg5LCAgW3gwLCAjRklMVEVSX0JBTktdCisgICAgICAgIGxkciAgICAgICAgICAgICB3NiwgIFt4MCwgI0ZJTFRFUl9MRU5HVEhdCisgICAgICAgIGxkcCAgICAgICAgICAgICB3NywgIHc4LCAgW3gwLCAjUEhBU0VfU0hJRlRdICAgIC8vIGFuZCBwaGFzZV9tYXNrCisgICAgICAgIGxzciAgICAgICAgICAgICB4MTAsIHg0LCAgeDcgICAgICAgICAgICAgICAgICAgIC8vIHNhbXBsZV9pbmRleAorICAgICAgICBhbmQgICAgICAgICAgICAgeDQsICB4NCwgIHg4CisgICAgICAgIGxzbCAgICAgICAgICAgICB4MTEsIHg2LCAgI1xlcyAgICAgICAgICAvLyBmaWx0ZXJfbGVuZ3RoICogZWxlbV9zaXplCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MywgIHgzLCAgeDEwLCBsc2wgI1xlcyAvLyBzcmNbc2FtcGxlX2luZGV4XQorICAgICAgICBtYWRkICAgICAgICAgICAgeDksICB4MTEsIHg0LCAgeDkgICAgICAgLy8gZmlsdGVyCisgICAgICAgIGNtcCAgICAgICAgICAgICB3NiwgICMxNgorICAgICAgICBiLmx0ICAgICAgICAgICAgNWYKKzg6ICAgICAgLy8gcmVtYWluaW5nIGZpbHRlcl9sZW5ndGggYXQgbGVhc3QgMTYKKyAgICAgICAgc3VicyAgICAgICAgICAgIHc2LCAgdzYsICAjMTYKKyAgICAgICAgTE9BRDggICAgICAgICAgIHY0LCAgdjUsICB2NiwgIHY3LCAgeDMKKyAgICAgICAgTE9BRDggICAgICAgICAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgeDkKKyAgICAgICAgTV9NVUwgICAgICAgICAgIHYwLCAgdjQsICB2MTYsIHYxCisgICAgICAgIE1fTVVMMiAgICAgICAgICB2MSwgIHY2LCAgdjE4Cis3OgorICAgICAgICBMT0FEOCAgICAgICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB4MworICAgICAgICBNX01MQSAgICAgICAgICAgdjAsICB2NSwgIHYxNywgdjEKKyAgICAgICAgTV9NTEEyICAgICAgICAgIHYxLCAgdjcsICB2MTkKKyAgICAgICAgTE9BRDggICAgICAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgeDkKKyAgICAgICAgTV9NTEEgICAgICAgICAgIHYwLCAgdjIwLCB2MjQsIHYxCisgICAgICAgIE1fTUxBMiAgICAgICAgICB2MSwgIHYyMiwgdjI2CisgICAgICAgIGIuZXEgICAgICAgICAgICA2ZgorICAgICAgICBjbXAgICAgICAgICAgICAgdzYsICAjMTYKKyAgICAgICAgTV9NTEEgICAgICAgICAgIHYwLCAgdjIxLCB2MjUsIHYxCisgICAgICAgIE1fTUxBMiAgICAgICAgICB2MSwgIHYyMywgdjI3CisgICAgICAgIGIubHQgICAgICAgICAgICA0ZgorICAgICAgICBzdWJzICAgICAgICAgICAgdzYsICB3NiwgICMxNgorICAgICAgICBMT0FEOCAgICAgICAgICAgdjQsICB2NSwgIHY2LCAgdjcsICB4MworICAgICAgICBMT0FEOCAgICAgICAgICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB4OQorICAgICAgICBNX01MQSAgICAgICAgICAgdjAsICB2NCwgIHYxNiwgdjEKKyAgICAgICAgTV9NTEEyICAgICAgICAgIHYxLCAgdjYsICB2MTgKKyAgICAgICAgYiAgICAgICAgICAgICAgIDdiCis2OgorICAgICAgICBNX01MQSAgICAgICAgICAgdjAsICB2MjEsIHYyNSwgIHYxCisgICAgICAgIE1fTUxBMiAgICAgICAgICB2MSwgIHYyMywgdjI3CisgICAgICAgIFNUT1JFX09ORSAgICAgICAwLCAgIHgxLCAgeDIsICAgdjEKKyAgICAgICAgcmV0Cis1OgorICAgICAgICBtb3ZpICAgICAgICAgICAgdjAuMTZiLCAjMAorICAgICAgICBtb3ZpICAgICAgICAgICAgdjEuMTZiLCAjMAorNDogICAgICAvLyByZW1haW5pbmcgZmlsdGVyX2xlbmd0aCAxLTE1CisgICAgICAgIGNtcCAgICAgICAgICAgICB3NiwgICM0CisgICAgICAgIGIubHQgICAgICAgICAgICAyZgorICAgICAgICBzdWJzICAgICAgICAgICAgdzYsICB3NiwgICM0CisgICAgICAgIExPQUQ0ICAgICAgICAgICB2NCwgIHY1LCAgeDMKKyAgICAgICAgTE9BRDQgICAgICAgICAgIHY2LCAgdjcsICB4OQorICAgICAgICBNX01MQSAgICAgICAgICAgdjAsICB2NCwgIHY2LCAgdjEKKyAgICAgICAgTV9NTEEyICAgICAgICAgIHYxLCAgdjUsICB2NworICAgICAgICBiLmVxICAgICAgICAgICAgMGYKKyAgICAgICAgYiAgICAgICAgICAgICAgIDRiCisyOiAgICAgIC8vIHJlbWFpbmluZyBmaWx0ZXJfbGVuZ3RoIDEtMworICAgICAgICBjbXAgICAgICAgICAgICAgdzYsICAjMgorICAgICAgICBiLmx0ICAgICAgICAgICAgMWYKKyAgICAgICAgTE9BRDIgICAgICAgICAgIDIsICAgeDMKKyAgICAgICAgTE9BRDIgICAgICAgICAgIDMsICAgeDkKKyAgICAgICAgc3VicyAgICAgICAgICAgIHc2LCAgdzYsICAjMgorICAgICAgICBNX01MQSAgICAgICAgICAgdjAsICB2MiwgIHYzCisgICAgICAgIGIuZXEgICAgICAgICAgICAwZgorMTogICAgICAvLyByZW1haW5pbmcgZmlsdGVyX2xlbmd0aCAxCisgICAgICAgIExPQUQxICAgICAgICAgICA2LCAgIHgzCisgICAgICAgIExPQUQxICAgICAgICAgICA3LCAgIHg5CisgICAgICAgIE1fTUxBICAgICAgICAgICB2MCwgIHY2LCAgdjcKKzA6CisgICAgICAgIFNUT1JFX09ORSAgICAgICAwLCAgIHgxLCAgeDIsICB2MQorICAgICAgICByZXQKK2VuZGZ1bmMKKworLnB1cmdlbSBMT0FEMQorLnB1cmdlbSBMT0FEMgorLnB1cmdlbSBMT0FENAorLnB1cmdlbSBMT0FEOAorLnB1cmdlbSBNX01MQQorLnB1cmdlbSBNX01MQTIKKy5wdXJnZW0gTV9NVUwKKy5wdXJnZW0gTV9NVUwyCisucHVyZ2VtIFNUT1JFX09ORQorLmVuZG0KKworCisubWFjcm8gIExPQUQxICAgICAgICAgICBkMSwgYWRkcgorICAgICAgICBsZHIgICAgICAgICAgICAgZFxkMSwgW1xhZGRyXSwgIzgKKy5lbmRtCisubWFjcm8gIExPQUQyICAgICAgICAgICBkMSwgYWRkcgorICAgICAgICBsZDEgICAgICAgICAgICAge3ZcZDFcKCkuMmR9LCBbXGFkZHJdLCAjMTYKKy5lbmRtCisubWFjcm8gIExPQUQ0ICAgICAgICAgICBkMSwgZDIsIGFkZHIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHtcZDFcKCkuMmQsXGQyXCgpLjJkfSwgW1xhZGRyXSwgIzMyCisuZW5kbQorLm1hY3JvICBMT0FEOCAgICAgICAgICAgZDEsIGQyLCBkMywgZDQsIGFkZHIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHtcZDFcKCkuMmQsXGQyXCgpLjJkLFxkM1woKS4yZCxcZDRcKCkuMmR9LCBbXGFkZHJdLCAjNjQKKy5lbmRtCisubWFjcm8gIE1fTUxBICAgICAgICAgICBkLCByMCwgcjEsIGQyOnZhcmFyZworICAgICAgICBmbWxhICAgICAgICAgICAgXGRcKCkuMmQsIFxyMFwoKS4yZCwgXHIxXCgpLjJkCisuZW5kbQorLm1hY3JvICBNX01MQTIgICAgICAgICAgc2Vjb25kOnZhcmFyZworICAgICAgICBNX01MQSAgICAgICAgICAgXHNlY29uZAorLmVuZG0KKy5tYWNybyAgTV9NVUwgICAgICAgICAgIGQsIHIwLCByMSwgZDI6dmFyYXJnCisgICAgICAgIGZtdWwgICAgICAgICAgICBcZFwoKS4yZCwgXHIwXCgpLjJkLCBccjFcKCkuMmQKKy5lbmRtCisubWFjcm8gIE1fTVVMMiAgICAgICAgICBzZWNvbmQ6dmFyYXJnCisgICAgICAgIE1fTVVMICAgICAgICAgICBcc2Vjb25kCisuZW5kbQorLm1hY3JvICBTVE9SRV9PTkUgICAgICAgcm4sIGFkZHIsIGlkeCwgZDIKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHZccm5cKCkuMmQsICB2XHJuXCgpLjJkLCAgXGQyXCgpLjJkCisgICAgICAgIGZhZGRwICAgICAgICAgICBkXHJuXCgpLCAgdlxyblwoKS4yZAorICAgICAgICBzdHIgICAgICAgICAgICAgZFxyblwoKSwgIFtcYWRkciwgXGlkeCwgbHNsICMzXQorLmVuZG0KKworcmVzYW1wbGVfb25lIGRibCwgMworCisKKy5tYWNybyAgTE9BRDEgICAgICAgICAgIGQxLCBhZGRyCisgICAgICAgIGxkciAgICAgICAgICAgICBzXGQxLCBbXGFkZHJdLCAjNAorLmVuZG0KKy5tYWNybyAgTE9BRDIgICAgICAgICAgIGQxLCBhZGRyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7dlxkMVwoKS4yc30sIFtcYWRkcl0sICM4CisuZW5kbQorLm1hY3JvICBMT0FENCAgICAgICAgICAgZDEsIGQyLCBhZGRyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7XGQxXCgpLjRzfSwgW1xhZGRyXSwgIzE2CisuZW5kbQorLm1hY3JvICBMT0FEOCAgICAgICAgICAgZDEsIGQyLCBkMywgZDQsIGFkZHIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHtcZDFcKCkuNHMsXGQyXCgpLjRzfSwgW1xhZGRyXSwgIzMyCisuZW5kbQorLm1hY3JvICBNX01MQSAgICAgICAgICAgZCwgcjAsIHIxLCBkMjp2YXJhcmcKKyAgICAgICAgZm1sYSAgICAgICAgICAgIFxkXCgpLjRzLCBccjBcKCkuNHMsIFxyMVwoKS40cworLmVuZG0KKy5tYWNybyAgTV9NVUwgICAgICAgICAgIGQsIHIwLCByMSwgZDI6dmFyYXJnCisgICAgICAgIGZtdWwgICAgICAgICAgICBcZFwoKS40cywgXHIwXCgpLjRzLCBccjFcKCkuNHMKKy5lbmRtCisubWFjcm8gIFNUT1JFX09ORSAgICAgICBybiwgYWRkciwgaWR4LCBkMgorICAgICAgICBmYWRkcCAgICAgICAgICAgdlxyblwoKS40cywgIHZccm5cKCkuNHMsICB2XHJuXCgpLjRzCisgICAgICAgIGZhZGRwICAgICAgICAgICBzXHJuXCgpLCAgdlxyblwoKS4ycworICAgICAgICBzdHIgICAgICAgICAgICAgc1xyblwoKSwgIFtcYWRkciwgXGlkeCwgbHNsICMyXQorLmVuZG0KKworcmVzYW1wbGVfb25lIGZsdAorCisKKy5tYWNybyAgTE9BRDEgICAgICAgICAgIGQxLCBhZGRyCisgICAgICAgIGxkciAgICAgICAgICAgICBoXGQxLCBbXGFkZHJdLCAjMgorLmVuZG0KKy5tYWNybyAgTE9BRDIgICAgICAgICAgIGQxLCBhZGRyCisgICAgICAgIGxkciAgICAgICAgICAgICBzXGQxLCBbXGFkZHJdLCAjNAorLmVuZG0KKy5tYWNybyAgTE9BRDQgICAgICAgICAgIGQxLCBkMiwgYWRkcgorICAgICAgICBsZDEgICAgICAgICAgICAge1xkMVwoKS40aH0sIFtcYWRkcl0sICM4CisuZW5kbQorLm1hY3JvICBMT0FEOCAgICAgICAgICAgZDEsIGQyLCBkMywgZDQsIGFkZHIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHtcZDFcKCkuNGgsXGQyXCgpLjRofSwgW1xhZGRyXSwgIzE2CisuZW5kbQorLm1hY3JvICBNX01MQSAgICAgICAgICAgZCwgcjAsIHIxLCBkMjp2YXJhcmcKKyAgICAgICAgc21sYWwgICAgICAgICAgIFxkXCgpLjRzLCBccjBcKCkuNGgsIFxyMVwoKS40aAorLmVuZG0KKy5tYWNybyAgTV9NVUwgICAgICAgICAgIGQsIHIwLCByMSwgZDI6dmFyYXJnCisgICAgICAgIHNtdWxsICAgICAgICAgICBcZFwoKS40cywgXHIwXCgpLjRoLCBccjFcKCkuNGgKKy5lbmRtCisubWFjcm8gIFNUT1JFX09ORSAgICAgICBybiwgYWRkciwgaWR4LCBkMgorICAgICAgICBhZGRwICAgICAgICAgICAgdlxyblwoKS40cywgIHZccm5cKCkuNHMsICB2XHJuXCgpLjRzCisgICAgICAgIGFkZHAgICAgICAgICAgICB2XHJuXCgpLjRzLCAgdlxyblwoKS40cywgIHZccm5cKCkuNHMKKyAgICAgICAgc3Fyc2hybiAgICAgICAgIHZccm5cKCkuNGgsICB2XHJuXCgpLjRzLCAgIzE1CisgICAgICAgIHN0ciAgICAgICAgICAgICBoXHJuXCgpLCAgW1xhZGRyLCBcaWR4LCBsc2wgIzFdCisuZW5kbQorCityZXNhbXBsZV9vbmUgczE2LCAxCisKKworLm1hY3JvICBMT0FEMSAgICAgICAgICAgZDEsIGFkZHIKKyAgICAgICAgbGRyICAgICAgICAgICAgIHNcZDEsIFtcYWRkcl0sICM0CisuZW5kbQorLm1hY3JvICBMT0FEMiAgICAgICAgICAgZDEsIGFkZHIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2XGQxXCgpLjJzfSwgW1xhZGRyXSwgIzgKKy5lbmRtCisubWFjcm8gIExPQUQ0ICAgICAgICAgICBkMSwgZDIsIGFkZHIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHtcZDFcKCkuNHN9LCBbXGFkZHJdLCAjMTYKKy5lbmRtCisubWFjcm8gIExPQUQ4ICAgICAgICAgICBkMSwgZDIsIGQzLCBkNCwgYWRkcgorICAgICAgICBsZDEgICAgICAgICAgICAge1xkMVwoKS40cyxcZDJcKCkuNHN9LCBbXGFkZHJdLCAjMzIKKy5lbmRtCisubWFjcm8gIE1fTUxBICAgICAgICAgICBkMSwgcjAsIHIxLCBkMjp2YXJhcmcKKyAgICAgICAgc21sYWwgICAgICAgICAgIFxkMVwoKS4yZCwgXHIwXCgpLjJzLCBccjFcKCkuMnMKKy5pZm5iIFxkMgorICAgICAgICBzbWxhbDIgICAgICAgICAgXGQyXCgpLjJkLCBccjBcKCkuNHMsIFxyMVwoKS40cworLmVuZGlmCisuZW5kbQorLm1hY3JvICBNX01VTCAgICAgICAgICAgZDEsIHIwLCByMSwgZDI6dmFyYXJnCisgICAgICAgIHNtdWxsICAgICAgICAgICBcZDFcKCkuMmQsIFxyMFwoKS4ycywgXHIxXCgpLjJzCisuaWZuYiBcZDIKKyAgICAgICAgc211bGwyICAgICAgICAgIFxkMlwoKS4yZCwgXHIwXCgpLjRzLCBccjFcKCkuNHMKKy5lbmRpZgorLmVuZG0KKy5tYWNybyAgU1RPUkVfT05FICAgICAgIHJuLCBhZGRyLCBpZHgsIGQyCisgICAgICAgIGFkZCAgICAgICAgICAgICB2XHJuXCgpLjJkLCAgdlxyblwoKS4yZCwgIFxkMlwoKS4yZAorICAgICAgICBhZGRwICAgICAgICAgICAgZFxyblwoKSwgICAgIHZccm5cKCkuMmQKKyAgICAgICAgc3Fyc2hybiAgICAgICAgIHZccm5cKCkuMnMsICB2XHJuXCgpLjJkLCAgIzMwCisgICAgICAgIHN0ciAgICAgICAgICAgICBzXHJuXCgpLCAgW1xhZGRyLCBcaWR4LCBsc2wgIzJdCisuZW5kbQorCityZXNhbXBsZV9vbmUgczMyCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9hcm0vTWFrZWZpbGUgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hcm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmM2Y2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2FybS9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK09CSlMgICAgICArPSBhcm0vYXVkaW9fY29udmVydF9pbml0Lm8KKworT0JKUy0kKENPTkZJR19ORU9OX0NMT0JCRVJfVEVTVCkgKz0gYXJtL25lb250ZXN0Lm8KKworTkVPTi1PQkpTICs9IGFybS9hdWRpb19jb252ZXJ0X25lb24ubwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXJtL2F1ZGlvX2NvbnZlcnRfaW5pdC5jIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXJtL2F1ZGlvX2NvbnZlcnRfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMTlhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hcm0vYXVkaW9fY29udmVydF9pbml0LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJsaWJhdnJlc2FtcGxlL2F1ZGlvX2NvbnZlcnQuaCIKKwordm9pZCBmZl9jb252X2ZsdF90b19zMTZfbmVvbihpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGludCBsZW4pOwordm9pZCBmZl9jb252X2ZsdHBfdG9fczE2X25lb24oaW50MTZfdCAqZHN0LCBmbG9hdCAqY29uc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBjaGFubmVscyk7Cit2b2lkIGZmX2NvbnZfZmx0cF90b19zMTZfMmNoX25lb24oaW50MTZfdCAqZHN0LCBmbG9hdCAqY29uc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOworCithdl9jb2xkIHZvaWQgZmZfYXVkaW9fY29udmVydF9pbml0X2FybShBdWRpb0NvbnZlcnQgKmFjKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpIHsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDE2LCA4LCAiTkVPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfY29udl9mbHRfdG9fczE2X25lb24pOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDE2LCA4LCAiTkVPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfY29udl9mbHRwX3RvX3MxNl9uZW9uKTsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAxNiwgOCwgIk5FT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NvbnZfZmx0cF90b19zMTZfMmNoX25lb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2FybS9hdWRpb19jb252ZXJ0X25lb24uUyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2FybS9hdWRpb19jb252ZXJ0X25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTIwZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXJtL2F1ZGlvX2NvbnZlcnRfbmVvbi5TCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZworICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9jb252X2ZsdF90b19zMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjOAorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTAsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHExLCAgIzMxCisgICAgICAgIGJlcSAgICAgICAgICAgICAzZgorICAgICAgICBiaWNzICAgICAgICAgICAgcjEyLCByMiwgICMxNQorICAgICAgICBiZXEgICAgICAgICAgICAgMmYKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMTYKKyAgICAgICAgdnFyc2hybi5zMzIgICAgIGQ0LCAgcTgsICAjMTYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMH0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMCwgIHEwLCAgIzMxCisgICAgICAgIHZxcnNocm4uczMyICAgICBkNSwgIHE5LCAgIzE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTF9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEsICBxMSwgICMzMQorICAgICAgICB2cXJzaHJuLnMzMiAgICAgZDYsICBxMCwgICMxNgorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EyfSwgICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdnFyc2hybi5zMzIgICAgIGQ3LCAgcTEsICAjMTYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOH0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOCwgIHE4LCAgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTl9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTksICBxOSwgICMzMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EzfSwgICAgIFtyMCw6MTI4XSEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGFuZHMgICAgICAgICAgICByMiwgIHIyLCAgIzE1CisgICAgICAgIGJlcSAgICAgICAgICAgICAzZgorMjogICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdnFyc2hybi5zMzIgICAgIGQ0LCAgcTgsICAjMTYKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEwLCAgcTAsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZxcnNocm4uczMyICAgICBkNSwgIHE5LCAgIzE2CisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMSwgIHExLCAgIzMxCisgICAgICAgIHZxcnNocm4uczMyICAgICBkNiwgIHEwLCAgIzE2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTJ9LCAgICAgW3IwLDoxMjhdIQorICAgICAgICB2cXJzaHJuLnMzMiAgICAgZDcsICBxMSwgICMxNgorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EzfSwgICAgIFtyMCw6MTI4XSEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCiszOiAgICAgIHZxcnNocm4uczMyICAgICBkNCwgIHE4LCAgIzE2CisgICAgICAgIHZxcnNocm4uczMyICAgICBkNSwgIHE5LCAgIzE2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTJ9LCAgICAgW3IwLDoxMjhdIQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfY29udl9mbHRwX3RvX3MxNl8yY2hfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3IxLCByM30KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjOAorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTAsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHExLCAgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEwfSwgICAgW3IzLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEwLCBxMTAsICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExMX0sICAgIFtyMyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMSwgcTExLCAjMzEKKyAgICAgICAgYmVxICAgICAgICAgICAgIDNmCisgICAgICAgIGJpY3MgICAgICAgICAgICByMTIsIHIyLCAgIzE1CisgICAgICAgIGJlcSAgICAgICAgICAgICAyZgorMTogICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxNgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEwLCAgcTAsICAjMzEKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHExMCwgcTgsICAjMTYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMSwgIHExLCAgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEyfSwgICAgW3IzLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEyLCBxMTIsICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExM30sICAgIFtyMyw6MTI4XSEKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHExMSwgcTksICAjMTYKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTB9LCAgICBbcjAsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTMsIHExMywgIzMxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTExfSwgICAgW3IwLDoxMjhdIQorICAgICAgICB2c3JpLjMyICAgICAgICAgcTEyLCBxMCwgICMxNgorICAgICAgICB2bGQxLjMyICAgICAgICAge3E4fSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHExMywgcTEsICAjMTYKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTJ9LCAgICBbcjAsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOCwgIHE4LCAgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTl9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTksICBxOSwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExMH0sICAgIFtyMyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMCwgcTEwLCAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTF9LCAgICBbcjMsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTEsIHExMSwgIzMxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEzfSwgICAgW3IwLDoxMjhdIQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgYW5kcyAgICAgICAgICAgIHIyLCAgcjIsICAjMTUKKyAgICAgICAgYmVxICAgICAgICAgICAgIDNmCisyOiAgICAgIHZzcmkuMzIgICAgICAgICBxMTAsIHE4LCAgIzE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTAsICBxMCwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExLCAgcTEsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTJ9LCAgICBbcjMsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTIsIHExMiwgIzMxCisgICAgICAgIHZzcmkuMzIgICAgICAgICBxMTEsIHE5LCAgIzE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEzfSwgICAgW3IzLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEzLCBxMTMsICMzMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExMH0sICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHExMiwgcTAsICAjMTYKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTF9LCAgICBbcjAsOjEyOF0hCisgICAgICAgIHZzcmkuMzIgICAgICAgICBxMTMsIHExLCAgIzE2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEyLXExM30sW3IwLDoxMjhdIQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKKzM6ICAgICAgdnNyaS4zMiAgICAgICAgIHExMCwgcTgsICAjMTYKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHExMSwgcTksICAjMTYKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTAtcTExfSxbcjAsOjEyOF0hCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9jb252X2ZsdHBfdG9fczE2X25lb24sIGV4cG9ydD0xCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMyCisgICAgICAgIGl0dCAgICAgICAgICAgICBsdAorICAgICAgICBsZHJsdCAgICAgICAgICAgcjEsICBbcjFdCisgICAgICAgIGJsdCAgICAgICAgICAgICBYKGZmX2NvbnZfZmx0X3RvX3MxNl9uZW9uKQorICAgICAgICBiZXEgICAgICAgICAgICAgWChmZl9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uKQorCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjgsIGxyfQorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjNAorICAgICAgICBsc2wgICAgICAgICAgICAgcjEyLCByMywgICMxCisgICAgICAgIGJsdCAgICAgICAgICAgICA0ZgorCisgICAgICAgIEAgNCBjaGFubmVscworNTogICAgICBsZG0gICAgICAgICAgICAgcjEhLCB7cjQtcjd9CisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHIyCisgICAgICAgIG1vdiAgICAgICAgICAgICByOCwgIHIwCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTh9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTgsICBxOCwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3E5fSwgICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE5LCAgcTksICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTB9LCAgICBbcjYsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTAsIHExMCwgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTExfSwgICAgW3I3LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTExLCBxMTEsICMzMQorNjogICAgICBzdWJzICAgICAgICAgICAgbHIsICBsciwgICM4CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTAsICBxMCwgICMzMQorICAgICAgICB2c3JpLjMyICAgICAgICAgcTksICBxOCwgICMxNgorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExLCAgcTEsICAjMzEKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHExMSwgcTEwLCAjMTYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMn0sICAgICBbcjYsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMiwgIHEyLCAgIzMxCisgICAgICAgIHZ6aXAuMzIgICAgICAgICBkMTgsIGQyMgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EzfSwgICAgIFtyNyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEzLCAgcTMsICAjMzEKKyAgICAgICAgdnppcC4zMiAgICAgICAgIGQxOSwgZDIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE4fSwgICAgW3I4XSwgcjEyCisgICAgICAgIHZzcmkuMzIgICAgICAgICBxMSwgIHEwLCAgIzE2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIyfSwgICAgW3I4XSwgcjEyCisgICAgICAgIHZzcmkuMzIgICAgICAgICBxMywgIHEyLCAgIzE2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE5fSwgICAgW3I4XSwgcjEyCisgICAgICAgIHZ6aXAuMzIgICAgICAgICBkMiwgIGQ2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIzfSwgICAgW3I4XSwgcjEyCisgICAgICAgIHZ6aXAuMzIgICAgICAgICBkMywgIGQ3CisgICAgICAgIGJlcSAgICAgICAgICAgICA3ZgorICAgICAgICB2bGQxLjMyICAgICAgICAge3E4fSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTgsICAjMzEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMn0sICAgICBbcjhdLCByMTIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOX0sICAgICBbcjUsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHE5LCAgIzMxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDZ9LCAgICAgW3I4XSwgcjEyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEwfSwgICAgW3I2LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEwLCBxMTAsICMzMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzfSwgICAgIFtyOF0sIHIxMgorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExMX0sICAgIFtyNyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMSwgcTExLCAjMzEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkN30sICAgICBbcjhdLCByMTIKKyAgICAgICAgYiAgICAgICAgICAgICAgIDZiCis3OiAgICAgIHZzdDEuMTYgICAgICAgICB7ZDJ9LCAgICAgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDZ9LCAgICAgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDN9LCAgICAgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDd9LCAgICAgW3I4XSwgcjEyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzQKKyAgICAgICAgaXQgICAgICAgICAgICAgIGVxCisgICAgICAgIHBvcGVxICAgICAgICAgICB7cjQtcjgsIHBjfQorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIGJnZSAgICAgICAgICAgICA1YgorCisgICAgICAgIEAgMiBjaGFubmVscworNDogICAgICBjbXAgICAgICAgICAgICAgcjMsICAjMgorICAgICAgICBibHQgICAgICAgICAgICAgNGYKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxISwge3I0LXI1fQorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjgsICByMAorICAgICAgICB0c3QgICAgICAgICAgICAgbHIsICAjOAorICAgICAgICB2bGQxLjMyICAgICAgICAge3E4fSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTgsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOX0sICAgICBbcjUsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHE5LCAgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEwfSwgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEwLCBxMTAsICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExMX0sICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMSwgcTExLCAjMzEKKyAgICAgICAgYmVxICAgICAgICAgICAgIDZmCisgICAgICAgIHN1YnMgICAgICAgICAgICBsciwgIGxyLCAgIzgKKyAgICAgICAgYmVxICAgICAgICAgICAgIDdmCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMTgsIGQxNiwgIzE2CisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMTksIGQxNywgIzE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTh9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTgsICBxOCwgICMzMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOFswXX0sIFtyOF0sIHIxMgorICAgICAgICB2c3JpLjMyICAgICAgICAgZDIyLCBkMjAsICMxNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOFsxXX0sIFtyOF0sIHIxMgorICAgICAgICB2c3JpLjMyICAgICAgICAgZDIzLCBkMjEsICMxNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOVswXX0sIFtyOF0sIHIxMgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOVsxXX0sIFtyOF0sIHIxMgorICAgICAgICB2bGQxLjMyICAgICAgICAge3E5fSwgICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE5LCAgcTksICAjMzEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMF19LCBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMV19LCBbcjhdLCByMTIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTB9LCAgICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTAsIHExMCwgIzMxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzBdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzFdfSwgW3I4XSwgcjEyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTExfSwgICAgW3I1LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTExLCBxMTEsICMzMQorNjogICAgICBzdWJzICAgICAgICAgICAgbHIsICBsciwgICMxNgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEwLCAgcTAsICAjMzEKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQxOCwgZDE2LCAjMTYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjUsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMSwgIHExLCAgIzMxCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMTksIGQxNywgIzE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTJ9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTIsICBxMiwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EzfSwgICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEzLCAgcTMsICAjMzEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMThbMF19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQyMiwgZDIwLCAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMThbMV19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQyMywgZDIxLCAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTlbMF19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQyLCAgZDAsICAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTlbMV19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQzLCAgZDEsICAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMF19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQ2LCAgZDQsICAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMV19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQ3LCAgZDUsICAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMF19LCBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMV19LCBbcjhdLCByMTIKKyAgICAgICAgYmVxICAgICAgICAgICAgIDZmCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTh9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTgsICBxOCwgICMzMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSwgIFtyOF0sIHIxMgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzFdfSwgIFtyOF0sIHIxMgorICAgICAgICB2bGQxLjMyICAgICAgICAge3E5fSwgICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE5LCAgcTksICAjMzEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1sxXX0sICBbcjhdLCByMTIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTB9LCAgICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTAsIHExMCwgIzMxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDZbMF19LCAgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDZbMV19LCAgW3I4XSwgcjEyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTExfSwgICAgW3I1LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTExLCBxMTEsICMzMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q3WzBdfSwgIFtyOF0sIHIxMgorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q3WzFdfSwgIFtyOF0sIHIxMgorICAgICAgICBiZ3QgICAgICAgICAgICAgNmIKKzY6ICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlsxXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1sxXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNlswXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNlsxXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkN1swXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkN1sxXX0sICBbcjhdLCByMTIKKyAgICAgICAgYiAgICAgICAgICAgICAgIDhmCis3OiAgICAgIHZzcmkuMzIgICAgICAgICBkMTgsIGQxNiwgIzE2CisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMTksIGQxNywgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE4WzBdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMjIsIGQyMCwgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE4WzFdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMjMsIGQyMSwgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE5WzBdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE5WzFdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyWzBdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyWzFdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzBdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzFdfSwgW3I4XSwgcjEyCis4OiAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjNAorICAgICAgICBpdCAgICAgICAgICAgICAgZXEKKyAgICAgICAgcG9wZXEgICAgICAgICAgIHtyNC1yOCwgcGN9CisKKyAgICAgICAgQCAxIGNoYW5uZWwKKzQ6ICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3IxXQorICAgICAgICB0c3QgICAgICAgICAgICAgcjIsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICByMAorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEwLCAgcTAsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMSwgIHExLCAgIzMxCisgICAgICAgIGJuZSAgICAgICAgICAgICA4ZgorNjogICAgICBzdWJzICAgICAgICAgICAgbHIsICBsciwgICMxNgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EyfSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEyLCAgcTIsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxM30sICAgICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMywgIHEzLCAgIzMxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDBbMV19LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwWzNdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMVsxXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDFbM119LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyWzFdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMlszXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDNbMV19LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzWzNdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgYmVxICAgICAgICAgICAgIDdmCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTAsICBxMCwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExLCAgcTEsICAjMzEKKzc6ICAgICAgdnN0MS4xNiAgICAgICAgIHtkNFsxXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDRbM119LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q1WzFdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkNVszXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDZbMV19LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q2WzNdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkN1sxXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDdbM119LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICBiZ3QgICAgICAgICAgICAgNmIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOCwgcGN9Cis4OiAgICAgIHN1YnMgICAgICAgICAgICBsciwgIGxyLCAgIzgKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMFsxXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDBbM119LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxWzFdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMVszXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDJbMV19LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyWzNdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkM1sxXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDNbM119LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICBpdCAgICAgICAgICAgICAgZXEKKyAgICAgICAgcG9wZXEgICAgICAgICAgIHtyNC1yOCwgcGN9CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTAsICBxMCwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExLCAgcTEsICAjMzEKKyAgICAgICAgYiAgICAgICAgICAgICAgIDZiCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9hcm0vbmVvbnRlc3QuYyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2FybS9uZW9udGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYWZlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hcm0vbmVvbnRlc3QuYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogY2hlY2sgTkVPTiByZWdpc3RlcnMgZm9yIGNsb2JiZXJzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vbmVvbnRlc3QuaCIKKword3JhcChhdnJlc2FtcGxlX2NvbnZlcnQoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLCB1aW50OF90ICoqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9wbGFuZV9zaXplLCBpbnQgb3V0X3NhbXBsZXMsIHVpbnQ4X3QgKippbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl9wbGFuZV9zaXplLCBpbnQgaW5fc2FtcGxlcykpCit7CisgICAgdGVzdG5lb25jbG9iYmVycyhhdnJlc2FtcGxlX2NvbnZlcnQsIGF2ciwgb3V0cHV0LCBvdXRfcGxhbmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIG91dF9zYW1wbGVzLCBpbnB1dCwgaW5fcGxhbmVfc2l6ZSwgaW5fc2FtcGxlcyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9hdWRpb19jb252ZXJ0LmMgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hdWRpb19jb252ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyOTAzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2F1ZGlvX2NvbnZlcnQuYwpAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImF1ZGlvX2NvbnZlcnQuaCIKKyNpbmNsdWRlICJhdWRpb19kYXRhLmgiCisjaW5jbHVkZSAiZGl0aGVyLmgiCisKK2VudW0gQ29udkZ1bmNUeXBlIHsKKyAgICBDT05WX0ZVTkNfVFlQRV9GTEFULAorICAgIENPTlZfRlVOQ19UWVBFX0lOVEVSTEVBVkUsCisgICAgQ09OVl9GVU5DX1RZUEVfREVJTlRFUkxFQVZFLAorfTsKKwordHlwZWRlZiB2b2lkIChjb252X2Z1bmNfZmxhdCkodWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgaW50IGxlbik7CisKK3R5cGVkZWYgdm9pZCAoY29udl9mdW5jX2ludGVybGVhdmUpKHVpbnQ4X3QgKm91dCwgdWludDhfdCAqY29uc3QgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKKwordHlwZWRlZiB2b2lkIChjb252X2Z1bmNfZGVpbnRlcmxlYXZlKSh1aW50OF90ICoqb3V0LCBjb25zdCB1aW50OF90ICppbiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKTsKKworc3RydWN0IEF1ZGlvQ29udmVydCB7CisgICAgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyOworICAgIERpdGhlckNvbnRleHQgKmRjOworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW5fZm10OworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X2ZtdDsKKyAgICBpbnQgYXBwbHlfbWFwOworICAgIGludCBjaGFubmVsczsKKyAgICBpbnQgcGxhbmVzOworICAgIGludCBwdHJfYWxpZ247CisgICAgaW50IHNhbXBsZXNfYWxpZ247CisgICAgaW50IGhhc19vcHRpbWl6ZWRfZnVuYzsKKyAgICBjb25zdCBjaGFyICpmdW5jX2Rlc2NyOworICAgIGNvbnN0IGNoYXIgKmZ1bmNfZGVzY3JfZ2VuZXJpYzsKKyAgICBlbnVtIENvbnZGdW5jVHlwZSBmdW5jX3R5cGU7CisgICAgY29udl9mdW5jX2ZsYXQgICAgICAgICAqY29udl9mbGF0OworICAgIGNvbnZfZnVuY19mbGF0ICAgICAgICAgKmNvbnZfZmxhdF9nZW5lcmljOworICAgIGNvbnZfZnVuY19pbnRlcmxlYXZlICAgKmNvbnZfaW50ZXJsZWF2ZTsKKyAgICBjb252X2Z1bmNfaW50ZXJsZWF2ZSAgICpjb252X2ludGVybGVhdmVfZ2VuZXJpYzsKKyAgICBjb252X2Z1bmNfZGVpbnRlcmxlYXZlICpjb252X2RlaW50ZXJsZWF2ZTsKKyAgICBjb252X2Z1bmNfZGVpbnRlcmxlYXZlICpjb252X2RlaW50ZXJsZWF2ZV9nZW5lcmljOworfTsKKwordm9pZCBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKEF1ZGlvQ29udmVydCAqYWMsIGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGluX2ZtdCwgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwdHJfYWxpZ24sIGludCBzYW1wbGVzX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2NyLCB2b2lkICpjb252KQoreworICAgIGludCBmb3VuZCA9IDA7CisKKyAgICBzd2l0Y2ggKGFjLT5mdW5jX3R5cGUpIHsKKyAgICBjYXNlIENPTlZfRlVOQ19UWVBFX0ZMQVQ6CisgICAgICAgIGlmIChhdl9nZXRfcGFja2VkX3NhbXBsZV9mbXQoYWMtPmluX2ZtdCkgID09IGluX2ZtdCAmJgorICAgICAgICAgICAgYXZfZ2V0X3BhY2tlZF9zYW1wbGVfZm10KGFjLT5vdXRfZm10KSA9PSBvdXRfZm10KSB7CisgICAgICAgICAgICBhYy0+Y29udl9mbGF0ICAgICA9IGNvbnY7CisgICAgICAgICAgICBhYy0+ZnVuY19kZXNjciAgICA9IGRlc2NyOworICAgICAgICAgICAgYWMtPnB0cl9hbGlnbiAgICAgPSBwdHJfYWxpZ247CisgICAgICAgICAgICBhYy0+c2FtcGxlc19hbGlnbiA9IHNhbXBsZXNfYWxpZ247CisgICAgICAgICAgICBpZiAocHRyX2FsaWduID09IDEgJiYgc2FtcGxlc19hbGlnbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgYWMtPmNvbnZfZmxhdF9nZW5lcmljICA9IGNvbnY7CisgICAgICAgICAgICAgICAgYWMtPmZ1bmNfZGVzY3JfZ2VuZXJpYyA9IGRlc2NyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhYy0+aGFzX29wdGltaXplZF9mdW5jID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENPTlZfRlVOQ19UWVBFX0lOVEVSTEVBVkU6CisgICAgICAgIGlmIChhYy0+aW5fZm10ID09IGluX2ZtdCAmJiBhYy0+b3V0X2ZtdCA9PSBvdXRfZm10ICYmCisgICAgICAgICAgICAoIWNoYW5uZWxzIHx8IGFjLT5jaGFubmVscyA9PSBjaGFubmVscykpIHsKKyAgICAgICAgICAgIGFjLT5jb252X2ludGVybGVhdmUgPSBjb252OworICAgICAgICAgICAgYWMtPmZ1bmNfZGVzY3IgICAgICA9IGRlc2NyOworICAgICAgICAgICAgYWMtPnB0cl9hbGlnbiAgICAgICA9IHB0cl9hbGlnbjsKKyAgICAgICAgICAgIGFjLT5zYW1wbGVzX2FsaWduICAgPSBzYW1wbGVzX2FsaWduOworICAgICAgICAgICAgaWYgKHB0cl9hbGlnbiA9PSAxICYmIHNhbXBsZXNfYWxpZ24gPT0gMSkgeworICAgICAgICAgICAgICAgIGFjLT5jb252X2ludGVybGVhdmVfZ2VuZXJpYyA9IGNvbnY7CisgICAgICAgICAgICAgICAgYWMtPmZ1bmNfZGVzY3JfZ2VuZXJpYyAgICAgID0gZGVzY3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFjLT5oYXNfb3B0aW1pemVkX2Z1bmMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ09OVl9GVU5DX1RZUEVfREVJTlRFUkxFQVZFOgorICAgICAgICBpZiAoYWMtPmluX2ZtdCA9PSBpbl9mbXQgJiYgYWMtPm91dF9mbXQgPT0gb3V0X2ZtdCAmJgorICAgICAgICAgICAgKCFjaGFubmVscyB8fCBhYy0+Y2hhbm5lbHMgPT0gY2hhbm5lbHMpKSB7CisgICAgICAgICAgICBhYy0+Y29udl9kZWludGVybGVhdmUgPSBjb252OworICAgICAgICAgICAgYWMtPmZ1bmNfZGVzY3IgICAgICAgID0gZGVzY3I7CisgICAgICAgICAgICBhYy0+cHRyX2FsaWduICAgICAgICAgPSBwdHJfYWxpZ247CisgICAgICAgICAgICBhYy0+c2FtcGxlc19hbGlnbiAgICAgPSBzYW1wbGVzX2FsaWduOworICAgICAgICAgICAgaWYgKHB0cl9hbGlnbiA9PSAxICYmIHNhbXBsZXNfYWxpZ24gPT0gMSkgeworICAgICAgICAgICAgICAgIGFjLT5jb252X2RlaW50ZXJsZWF2ZV9nZW5lcmljID0gY29udjsKKyAgICAgICAgICAgICAgICBhYy0+ZnVuY19kZXNjcl9nZW5lcmljICAgICAgICA9IGRlc2NyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhYy0+aGFzX29wdGltaXplZF9mdW5jID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGZvdW5kKSB7CisgICAgICAgIGF2X2xvZyhhYy0+YXZyLCBBVl9MT0dfREVCVUcsICJhdWRpb19jb252ZXJ0OiBmb3VuZCBmdW5jdGlvbjogJS00cyAiCisgICAgICAgICAgICAgICAidG8gJS00cyAoJXMpXG4iLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGFjLT5pbl9mbXQpLAorICAgICAgICAgICAgICAgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShhYy0+b3V0X2ZtdCksIGRlc2NyKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgQ09OVl9GVU5DX05BTUUoZHN0X2ZtdCwgc3JjX2ZtdCkgY29udl8gIyMgc3JjX2ZtdCAjIyBfdG9fICMjIGRzdF9mbXQKKworI2RlZmluZSBDT05WX0xPT1Aob3R5cGUsIGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICoob3R5cGUgKilwbyA9IGV4cHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwaSArPSBpczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcG8gKz0gb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAocG8gPCBlbmQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIENPTlZfRlVOQ19GTEFUKG9mbXQsIG90eXBlLCBpZm10LCBpdHlwZSwgZXhwcikgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgQ09OVl9GVU5DX05BTUUob2ZtdCwgaWZtdCkodWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpcyAgICAgICA9IHNpemVvZihpdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgb3MgICAgICAgPSBzaXplb2Yob3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCAqcGkgPSBpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgICAgICAgKnBvID0gb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICplbmQgPSBvdXQgKyBvcyAqIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ09OVl9MT09QKG90eXBlLCBleHByKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENPTlZfRlVOQ19JTlRFUkxFQVZFKG9mbXQsIG90eXBlLCBpZm10LCBpdHlwZSwgZXhwcikgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgQ09OVl9GVU5DX05BTUUob2ZtdCwgaWZtdCkodWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICoqaW4sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBjaGFubmVscykgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgb3V0X2JwcyA9IHNpemVvZihvdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGlzICAgICAgPSBzaXplb2YoaXR5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBvcyAgICAgID0gY2hhbm5lbHMgKiBvdXRfYnBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpID0gaW5bY2hdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50OF90ICAgICAgICpwbyA9IG91dCArIGNoICogb3V0X2JwczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDhfdCAgICAgICplbmQgPSBwbyArIG9zICogbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENPTlZfTE9PUChvdHlwZSwgZXhwcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDT05WX0ZVTkNfREVJTlRFUkxFQVZFKG9mbXQsIG90eXBlLCBpZm10LCBpdHlwZSwgZXhwcikgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIENPTlZfRlVOQ19OQU1FKG9mbXQsIGlmbXQpKHVpbnQ4X3QgKipvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGluX2JwcyA9IHNpemVvZihpdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpcyAgICAgPSBjaGFubmVscyAqIGluX2JwczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgb3MgICAgID0gc2l6ZW9mKG90eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCB1aW50OF90ICpwaSA9IGluICArIGNoICogaW5fYnBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDhfdCAgICAgICAqcG8gPSBvdXRbY2hdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQ4X3QgICAgICAqZW5kID0gcG8gKyBvcyAqIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDT05WX0xPT1Aob3R5cGUsIGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ09OVl9GVU5DX0dST1VQKG9mbXQsIG90eXBlLCBpZm10LCBpdHlwZSwgZXhwcikgXAorQ09OVl9GVU5DX0ZMQVQoICAgICAgICBvZm10LCAgICAgIG90eXBlLCBpZm10LCAgICAgIGl0eXBlLCBleHByKSBcCitDT05WX0ZVTkNfSU5URVJMRUFWRSggIG9mbXQsICAgICAgb3R5cGUsIGlmbXQgIyMgUCwgaXR5cGUsIGV4cHIpIFwKK0NPTlZfRlVOQ19ERUlOVEVSTEVBVkUob2ZtdCAjIyBQLCBvdHlwZSwgaWZtdCwgICAgICBpdHlwZSwgZXhwcikKKworQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfVTgsICB1aW50OF90LCBBVl9TQU1QTEVfRk1UX1U4LCAgdWludDhfdCwgICooY29uc3QgdWludDhfdCAqKXBpKQorQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX1U4LCAgdWludDhfdCwgKCooY29uc3QgdWludDhfdCAqKXBpIC0gMHg4MCkgPDwgIDgpCitDT05WX0ZVTkNfR1JPVVAoQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsIEFWX1NBTVBMRV9GTVRfVTgsICB1aW50OF90LCAoKihjb25zdCB1aW50OF90ICopcGkgLSAweDgwKSA8PCAyNCkKK0NPTlZfRlVOQ19HUk9VUChBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQsICAgQVZfU0FNUExFX0ZNVF9VOCwgIHVpbnQ4X3QsICgqKGNvbnN0IHVpbnQ4X3QgKilwaSAtIDB4ODApICogKDEuMGYgLyAoMSA8PCA3KSkpCitDT05WX0ZVTkNfR1JPVVAoQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSwgIEFWX1NBTVBMRV9GTVRfVTgsICB1aW50OF90LCAoKihjb25zdCB1aW50OF90ICopcGkgLSAweDgwKSAqICgxLjAgIC8gKDEgPDwgNykpKQorQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfVTgsICB1aW50OF90LCBBVl9TQU1QTEVfRk1UX1MxNiwgaW50MTZfdCwgKCooY29uc3QgaW50MTZfdCAqKXBpID4+IDgpICsgMHg4MCkKK0NPTlZfRlVOQ19HUk9VUChBVl9TQU1QTEVfRk1UX1MxNiwgaW50MTZfdCwgQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsICAqKGNvbnN0IGludDE2X3QgKilwaSkKK0NPTlZfRlVOQ19HUk9VUChBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsICAqKGNvbnN0IGludDE2X3QgKilwaSA8PCAxNikKK0NPTlZfRlVOQ19HUk9VUChBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQsICAgQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsICAqKGNvbnN0IGludDE2X3QgKilwaSAqICgxLjBmIC8gKDEgPDwgMTUpKSkKK0NPTlZfRlVOQ19HUk9VUChBVl9TQU1QTEVfRk1UX0RCTCwgZG91YmxlLCAgQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsICAqKGNvbnN0IGludDE2X3QgKilwaSAqICgxLjAgIC8gKDEgPDwgMTUpKSkKK0NPTlZfRlVOQ19HUk9VUChBVl9TQU1QTEVfRk1UX1U4LCAgdWludDhfdCwgQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsICgqKGNvbnN0IGludDMyX3QgKilwaSA+PiAyNCkgKyAweDgwKQorQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgICooY29uc3QgaW50MzJfdCAqKXBpID4+IDE2KQorQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzMyLCBpbnQzMl90LCBBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgICooY29uc3QgaW50MzJfdCAqKXBpKQorQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfRkxULCBmbG9hdCwgICBBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgICooY29uc3QgaW50MzJfdCAqKXBpICogKDEuMGYgLyAoMVUgPDwgMzEpKSkKK0NPTlZfRlVOQ19HUk9VUChBVl9TQU1QTEVfRk1UX0RCTCwgZG91YmxlLCAgQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsICAqKGNvbnN0IGludDMyX3QgKilwaSAqICgxLjAgIC8gKDFVIDw8IDMxKSkpCitDT05WX0ZVTkNfR1JPVVAoQVZfU0FNUExFX0ZNVF9VOCwgIHVpbnQ4X3QsIEFWX1NBTVBMRV9GTVRfRkxULCBmbG9hdCwgICBhdl9jbGlwX3VpbnQ4KCAgbHJpbnRmKCooY29uc3QgZmxvYXQgKilwaSAqICgxICA8PCAgNykpICsgMHg4MCkpCitDT05WX0ZVTkNfR1JPVVAoQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsIEFWX1NBTVBMRV9GTVRfRkxULCBmbG9hdCwgICBhdl9jbGlwX2ludDE2KCAgbHJpbnRmKCooY29uc3QgZmxvYXQgKilwaSAqICgxICA8PCAxNSkpKSkKK0NPTlZfRlVOQ19HUk9VUChBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgQVZfU0FNUExFX0ZNVF9GTFQsIGZsb2F0LCAgIGF2X2NsaXBsX2ludDMyKGxscmludGYoKihjb25zdCBmbG9hdCAqKXBpICogKDFVIDw8IDMxKSkpKQorQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfRkxULCBmbG9hdCwgICBBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQsICAgKihjb25zdCBmbG9hdCAqKXBpKQorQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUsICBBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQsICAgKihjb25zdCBmbG9hdCAqKXBpKQorQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfVTgsICB1aW50OF90LCBBVl9TQU1QTEVfRk1UX0RCTCwgZG91YmxlLCAgYXZfY2xpcF91aW50OCggIGxyaW50KCooY29uc3QgZG91YmxlICopcGkgKiAoMSAgPDwgIDcpKSArIDB4ODApKQorQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX0RCTCwgZG91YmxlLCAgYXZfY2xpcF9pbnQxNiggIGxyaW50KCooY29uc3QgZG91YmxlICopcGkgKiAoMSAgPDwgMTUpKSkpCitDT05WX0ZVTkNfR1JPVVAoQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsIEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUsICBhdl9jbGlwbF9pbnQzMihsbHJpbnQoKihjb25zdCBkb3VibGUgKilwaSAqICgxVSA8PCAzMSkpKSkKK0NPTlZfRlVOQ19HUk9VUChBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQsICAgQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSwgICooY29uc3QgZG91YmxlICopcGkpCitDT05WX0ZVTkNfR1JPVVAoQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSwgIEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUsICAqKGNvbnN0IGRvdWJsZSAqKXBpKQorCisjZGVmaW5lIFNFVF9DT05WX0ZVTkNfR1JPVVAob2ZtdCwgaWZtdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgb2ZtdCwgICAgICBpZm10LCAgICAgIDAsIDEsIDEsICJDIiwgQ09OVl9GVU5DX05BTUUob2ZtdCwgICAgICBpZm10KSk7IFwKK2ZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIG9mbXQgIyMgUCwgaWZtdCwgICAgICAwLCAxLCAxLCAiQyIsIENPTlZfRlVOQ19OQU1FKG9mbXQgIyMgUCwgaWZtdCkpOyBcCitmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBvZm10LCAgICAgIGlmbXQgIyMgUCwgMCwgMSwgMSwgIkMiLCBDT05WX0ZVTkNfTkFNRShvZm10LCAgICAgIGlmbXQgIyMgUCkpOworCitzdGF0aWMgdm9pZCBzZXRfZ2VuZXJpY19mdW5jdGlvbihBdWRpb0NvbnZlcnQgKmFjKQoreworICAgIFNFVF9DT05WX0ZVTkNfR1JPVVAoQVZfU0FNUExFX0ZNVF9VOCwgIEFWX1NBTVBMRV9GTVRfVTgpCisgICAgU0VUX0NPTlZfRlVOQ19HUk9VUChBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9VOCkKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzMyLCBBVl9TQU1QTEVfRk1UX1U4KQorICAgIFNFVF9DT05WX0ZVTkNfR1JPVVAoQVZfU0FNUExFX0ZNVF9GTFQsIEFWX1NBTVBMRV9GTVRfVTgpCisgICAgU0VUX0NPTlZfRlVOQ19HUk9VUChBVl9TQU1QTEVfRk1UX0RCTCwgQVZfU0FNUExFX0ZNVF9VOCkKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfVTgsICBBVl9TQU1QTEVfRk1UX1MxNikKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX1MxNikKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzMyLCBBVl9TQU1QTEVfRk1UX1MxNikKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX1MxNikKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfREJMLCBBVl9TQU1QTEVfRk1UX1MxNikKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfVTgsICBBVl9TQU1QTEVfRk1UX1MzMikKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX1MzMikKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzMyLCBBVl9TQU1QTEVfRk1UX1MzMikKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX1MzMikKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfREJMLCBBVl9TQU1QTEVfRk1UX1MzMikKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfVTgsICBBVl9TQU1QTEVfRk1UX0ZMVCkKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX0ZMVCkKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzMyLCBBVl9TQU1QTEVfRk1UX0ZMVCkKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX0ZMVCkKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfREJMLCBBVl9TQU1QTEVfRk1UX0ZMVCkKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfVTgsICBBVl9TQU1QTEVfRk1UX0RCTCkKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX0RCTCkKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfUzMyLCBBVl9TQU1QTEVfRk1UX0RCTCkKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX0RCTCkKKyAgICBTRVRfQ09OVl9GVU5DX0dST1VQKEFWX1NBTVBMRV9GTVRfREJMLCBBVl9TQU1QTEVfRk1UX0RCTCkKK30KKwordm9pZCBmZl9hdWRpb19jb252ZXJ0X2ZyZWUoQXVkaW9Db252ZXJ0ICoqYWMpCit7CisgICAgaWYgKCEqYWMpCisgICAgICAgIHJldHVybjsKKyAgICBmZl9kaXRoZXJfZnJlZSgmKCphYyktPmRjKTsKKyAgICBhdl9mcmVlcChhYyk7Cit9CisKK0F1ZGlvQ29udmVydCAqZmZfYXVkaW9fY29udmVydF9hbGxvYyhBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW5fZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywgaW50IHNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcHBseV9tYXApCit7CisgICAgQXVkaW9Db252ZXJ0ICphYzsKKyAgICBpbnQgaW5fcGxhbmFyLCBvdXRfcGxhbmFyOworCisgICAgYWMgPSBhdl9tYWxsb2N6KHNpemVvZigqYWMpKTsKKyAgICBpZiAoIWFjKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGFjLT5hdnIgICAgICA9IGF2cjsKKyAgICBhYy0+b3V0X2ZtdCAgPSBvdXRfZm10OworICAgIGFjLT5pbl9mbXQgICA9IGluX2ZtdDsKKyAgICBhYy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBhYy0+YXBwbHlfbWFwID0gYXBwbHlfbWFwOworCisgICAgaWYgKGF2ci0+ZGl0aGVyX21ldGhvZCAhPSBBVl9SRVNBTVBMRV9ESVRIRVJfTk9ORSAgICAgICAgICAmJgorICAgICAgICBhdl9nZXRfcGFja2VkX3NhbXBsZV9mbXQob3V0X2ZtdCkgPT0gQVZfU0FNUExFX0ZNVF9TMTYgJiYKKyAgICAgICAgYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoaW5fZm10KSA+IDIpIHsKKyAgICAgICAgYWMtPmRjID0gZmZfZGl0aGVyX2FsbG9jKGF2ciwgb3V0X2ZtdCwgaW5fZm10LCBjaGFubmVscywgc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseV9tYXApOworICAgICAgICBpZiAoIWFjLT5kYykgeworICAgICAgICAgICAgYXZfZnJlZShhYyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgaW5fcGxhbmFyICA9IGZmX3NhbXBsZV9mbXRfaXNfcGxhbmFyKGluX2ZtdCwgY2hhbm5lbHMpOworICAgIG91dF9wbGFuYXIgPSBmZl9zYW1wbGVfZm10X2lzX3BsYW5hcihvdXRfZm10LCBjaGFubmVscyk7CisKKyAgICBpZiAoaW5fcGxhbmFyID09IG91dF9wbGFuYXIpIHsKKyAgICAgICAgYWMtPmZ1bmNfdHlwZSA9IENPTlZfRlVOQ19UWVBFX0ZMQVQ7CisgICAgICAgIGFjLT5wbGFuZXMgICAgPSBpbl9wbGFuYXIgPyBhYy0+Y2hhbm5lbHMgOiAxOworICAgIH0gZWxzZSBpZiAoaW5fcGxhbmFyKQorICAgICAgICBhYy0+ZnVuY190eXBlID0gQ09OVl9GVU5DX1RZUEVfSU5URVJMRUFWRTsKKyAgICBlbHNlCisgICAgICAgIGFjLT5mdW5jX3R5cGUgPSBDT05WX0ZVTkNfVFlQRV9ERUlOVEVSTEVBVkU7CisKKyAgICBzZXRfZ2VuZXJpY19mdW5jdGlvbihhYyk7CisKKyAgICBpZiAoQVJDSF9BQVJDSDY0KQorICAgICAgICBmZl9hdWRpb19jb252ZXJ0X2luaXRfYWFyY2g2NChhYyk7CisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl9hdWRpb19jb252ZXJ0X2luaXRfYXJtKGFjKTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfaW5pdF94ODYoYWMpOworCisgICAgcmV0dXJuIGFjOworfQorCitpbnQgZmZfYXVkaW9fY29udmVydChBdWRpb0NvbnZlcnQgKmFjLCBBdWRpb0RhdGEgKm91dCwgQXVkaW9EYXRhICppbikKK3sKKyAgICBpbnQgdXNlX2dlbmVyaWMgPSAxOworICAgIGludCBsZW4gICAgICAgICA9IGluLT5uYl9zYW1wbGVzOworICAgIGludCBwOworCisgICAgaWYgKGFjLT5kYykgeworICAgICAgICAvKiBkaXRoZXJlZCBjb252ZXJzaW9uICovCisgICAgICAgIGF2X2Rsb2coYWMtPmF2ciwgIiVkIHNhbXBsZXMgLSBhdWRpb19jb252ZXJ0OiAlcyB0byAlcyAoZGl0aGVyZWQpXG4iLAorICAgICAgICAgICAgICAgIGxlbiwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShhYy0+aW5fZm10KSwKKyAgICAgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGFjLT5vdXRfZm10KSk7CisKKyAgICAgICAgcmV0dXJuIGZmX2NvbnZlcnRfZGl0aGVyKGFjLT5kYywgb3V0LCBpbik7CisgICAgfQorCisgICAgLyogZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIHRoZSBvcHRpbWl6ZWQgZnVuY3Rpb24gYmFzZWQgb24gcG9pbnRlciBhbmQKKyAgICAgICBzYW1wbGVzIGFsaWdubWVudCBpbiBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgaWYgKGFjLT5oYXNfb3B0aW1pemVkX2Z1bmMpIHsKKyAgICAgICAgaW50IHB0cl9hbGlnbiAgICAgPSBGRk1JTihpbi0+cHRyX2FsaWduLCAgICAgb3V0LT5wdHJfYWxpZ24pOworICAgICAgICBpbnQgc2FtcGxlc19hbGlnbiA9IEZGTUlOKGluLT5zYW1wbGVzX2FsaWduLCBvdXQtPnNhbXBsZXNfYWxpZ24pOworICAgICAgICBpbnQgYWxpZ25lZF9sZW4gICA9IEZGQUxJR04obGVuLCBhYy0+c2FtcGxlc19hbGlnbik7CisgICAgICAgIGlmICghKHB0cl9hbGlnbiAlIGFjLT5wdHJfYWxpZ24pICYmIHNhbXBsZXNfYWxpZ24gPj0gYWxpZ25lZF9sZW4pIHsKKyAgICAgICAgICAgIGxlbiA9IGFsaWduZWRfbGVuOworICAgICAgICAgICAgdXNlX2dlbmVyaWMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGF2X2Rsb2coYWMtPmF2ciwgIiVkIHNhbXBsZXMgLSBhdWRpb19jb252ZXJ0OiAlcyB0byAlcyAoJXMpXG4iLCBsZW4sCisgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGFjLT5pbl9mbXQpLAorICAgICAgICAgICAgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShhYy0+b3V0X2ZtdCksCisgICAgICAgICAgICB1c2VfZ2VuZXJpYyA/IGFjLT5mdW5jX2Rlc2NyX2dlbmVyaWMgOiBhYy0+ZnVuY19kZXNjcik7CisKKyAgICBpZiAoYWMtPmFwcGx5X21hcCkgeworICAgICAgICBDaGFubmVsTWFwSW5mbyAqbWFwID0gJmFjLT5hdnItPmNoX21hcF9pbmZvOworCisgICAgICAgIGlmICghZmZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoYWMtPm91dF9mbXQsIGFjLT5jaGFubmVscykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZyLCBBVl9MT0dfRVJST1IsICJjYW5ub3QgcmVtYXAgcGFja2VkIGZvcm1hdCBkdXJpbmcgY29udmVyc2lvblxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hcC0+ZG9fcmVtYXApIHsKKyAgICAgICAgICAgIGlmIChmZl9zYW1wbGVfZm10X2lzX3BsYW5hcihhYy0+aW5fZm10LCBhYy0+Y2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgY29udl9mdW5jX2ZsYXQgKmNvbnZlcnQgPSB1c2VfZ2VuZXJpYyA/IGFjLT5jb252X2ZsYXRfZ2VuZXJpYyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjLT5jb252X2ZsYXQ7CisKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgYWMtPnBsYW5lczsgcCsrKQorICAgICAgICAgICAgICAgICAgICBpZiAobWFwLT5jaGFubmVsX21hcFtwXSA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydChvdXQtPmRhdGFbcF0sIGluLT5kYXRhW21hcC0+Y2hhbm5lbF9tYXBbcF1dLCBsZW4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhW0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsKKyAgICAgICAgICAgICAgICBjb252X2Z1bmNfZGVpbnRlcmxlYXZlICpjb252ZXJ0ID0gdXNlX2dlbmVyaWMgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYy0+Y29udl9kZWludGVybGVhdmVfZ2VuZXJpYyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjLT5jb252X2RlaW50ZXJsZWF2ZTsKKworICAgICAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBhYy0+Y2hhbm5lbHM7IHArKykKKyAgICAgICAgICAgICAgICAgICAgZGF0YVttYXAtPmlucHV0X21hcFtwXV0gPSBvdXQtPmRhdGFbcF07CisKKyAgICAgICAgICAgICAgICBjb252ZXJ0KGRhdGEsIGluLT5kYXRhWzBdLCBsZW4sIGFjLT5jaGFubmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcC0+ZG9fY29weSB8fCBtYXAtPmRvX3plcm8pIHsKKyAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBhYy0+cGxhbmVzOyBwKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWFwLT5jaGFubmVsX2NvcHlbcF0pCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShvdXQtPmRhdGFbcF0sIG91dC0+ZGF0YVttYXAtPmNoYW5uZWxfY29weVtwXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKiBvdXQtPnN0cmlkZSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobWFwLT5jaGFubmVsX3plcm9bcF0pCisgICAgICAgICAgICAgICAgICAgIGF2X3NhbXBsZXNfc2V0X3NpbGVuY2UoJm91dC0+ZGF0YVtwXSwgMCwgbGVuLCAxLCBhYy0+b3V0X2ZtdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGFjLT5mdW5jX3R5cGUpIHsKKyAgICAgICAgY2FzZSBDT05WX0ZVTkNfVFlQRV9GTEFUOiB7CisgICAgICAgICAgICBpZiAoIWluLT5pc19wbGFuYXIpCisgICAgICAgICAgICAgICAgbGVuICo9IGluLT5jaGFubmVsczsKKyAgICAgICAgICAgIGlmICh1c2VfZ2VuZXJpYykgeworICAgICAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBhYy0+cGxhbmVzOyBwKyspCisgICAgICAgICAgICAgICAgICAgIGFjLT5jb252X2ZsYXRfZ2VuZXJpYyhvdXQtPmRhdGFbcF0sIGluLT5kYXRhW3BdLCBsZW4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgYWMtPnBsYW5lczsgcCsrKQorICAgICAgICAgICAgICAgICAgICBhYy0+Y29udl9mbGF0KG91dC0+ZGF0YVtwXSwgaW4tPmRhdGFbcF0sIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENPTlZfRlVOQ19UWVBFX0lOVEVSTEVBVkU6CisgICAgICAgICAgICBpZiAodXNlX2dlbmVyaWMpCisgICAgICAgICAgICAgICAgYWMtPmNvbnZfaW50ZXJsZWF2ZV9nZW5lcmljKG91dC0+ZGF0YVswXSwgaW4tPmRhdGEsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWMtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhYy0+Y29udl9pbnRlcmxlYXZlKG91dC0+ZGF0YVswXSwgaW4tPmRhdGEsIGxlbiwgYWMtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENPTlZfRlVOQ19UWVBFX0RFSU5URVJMRUFWRToKKyAgICAgICAgICAgIGlmICh1c2VfZ2VuZXJpYykKKyAgICAgICAgICAgICAgICBhYy0+Y29udl9kZWludGVybGVhdmVfZ2VuZXJpYyhvdXQtPmRhdGEsIGluLT5kYXRhWzBdLCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWMtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhYy0+Y29udl9kZWludGVybGVhdmUob3V0LT5kYXRhLCBpbi0+ZGF0YVswXSwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQtPm5iX3NhbXBsZXMgPSBpbi0+bmJfc2FtcGxlczsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2F1ZGlvX2NvbnZlcnQuaCBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2F1ZGlvX2NvbnZlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjE1NDQyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXVkaW9fY29udmVydC5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZSRVNBTVBMRV9BVURJT19DT05WRVJUX0gKKyNkZWZpbmUgQVZSRVNBTVBMRV9BVURJT19DT05WRVJUX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJhdnJlc2FtcGxlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdWRpb19kYXRhLmgiCisKKy8qKgorICogU2V0IGNvbnZlcnNpb24gZnVuY3Rpb24gaWYgdGhlIHBhcmFtZXRlcnMgbWF0Y2guCisgKgorICogVGhpcyBjb21wYXJlcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgY29udmVyc2lvbiBmdW5jdGlvbiB0byB0aGUgcGFyYW1ldGVycworICogaW4gdGhlIEF1ZGlvQ29udmVydCBjb250ZXh0LiBJZiB0aGUgcGFyYW1ldGVycyBkbyBub3QgbWF0Y2gsIG5vIGNoYW5nZXMgYXJlCisgKiBtYWRlIHRvIHRoZSBhY3RpdmUgZnVuY3Rpb25zLiBJZiB0aGUgcGFyYW1ldGVycyBkbyBtYXRjaCBhbmQgdGhlIGFsaWdubWVudAorICogaXMgbm90IGNvbnN0cmFpbmVkLCB0aGUgZnVuY3Rpb24gaXMgc2V0IGFzIHRoZSBnZW5lcmljIGNvbnZlcnNpb24gZnVuY3Rpb24uCisgKiBJZiB0aGUgcGFyYW1ldGVycyBtYXRjaCBhbmQgdGhlIGFsaWdubWVudCBpcyBjb25zdHJhaW5lZCwgdGhlIGZ1bmN0aW9uIGlzCisgKiBzZXQgYXMgdGhlIG9wdGltaXplZCBjb252ZXJzaW9uIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBhYyAgICAgICAgICAgICBBdWRpb0NvbnZlcnQgY29udGV4dAorICogQHBhcmFtIG91dF9mbXQgICAgICAgIG91dHB1dCBzYW1wbGUgZm9ybWF0CisgKiBAcGFyYW0gaW5fZm10ICAgICAgICAgaW5wdXQgc2FtcGxlIGZvcm1hdAorICogQHBhcmFtIGNoYW5uZWxzICAgICAgIG51bWJlciBvZiBjaGFubmVscywgb3IgMCBmb3IgYW55IG51bWJlciBvZiBjaGFubmVscworICogQHBhcmFtIHB0cl9hbGlnbiAgICAgIGJ1ZmZlciBwb2ludGVyIGFsaWdubWVudCwgaW4gYnl0ZXMKKyAqIEBwYXJhbSBzYW1wbGVzX2FsaWduICBidWZmZXIgc2l6ZSBhbGlnbm1lbnQsIGluIHNhbXBsZXMKKyAqIEBwYXJhbSBkZXNjciAgICAgICAgICBmdW5jdGlvbiB0eXBlIGRlc2NyaXB0aW9uIChlLmcuICJDIiBvciAiU1NFIikKKyAqIEBwYXJhbSBjb252ICAgICAgICAgICBjb252ZXJzaW9uIGZ1bmN0aW9uIHBvaW50ZXIKKyAqLwordm9pZCBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKEF1ZGlvQ29udmVydCAqYWMsIGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGluX2ZtdCwgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwdHJfYWxpZ24sIGludCBzYW1wbGVzX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2NyLCB2b2lkICpjb252KTsKKworLyoqCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBBdWRpb0NvbnZlcnQgY29udGV4dCBmb3Igc2FtcGxlIGZvcm1hdCBjb252ZXJzaW9uLgorICoKKyAqIEBwYXJhbSBhdnIgICAgICAgICBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0CisgKiBAcGFyYW0gb3V0X2ZtdCAgICAgb3V0cHV0IHNhbXBsZSBmb3JtYXQKKyAqIEBwYXJhbSBpbl9mbXQgICAgICBpbnB1dCBzYW1wbGUgZm9ybWF0CisgKiBAcGFyYW0gY2hhbm5lbHMgICAgbnVtYmVyIG9mIGNoYW5uZWxzCisgKiBAcGFyYW0gc2FtcGxlX3JhdGUgc2FtcGxlIHJhdGUgKHVzZWQgZm9yIGRpdGhlcmluZykKKyAqIEBwYXJhbSBhcHBseV9tYXAgICBhcHBseSBjaGFubmVsIG1hcCBkdXJpbmcgY29udmVyc2lvbgorICogQHJldHVybiAgICAgICAgICAgIG5ld2x5LWFsbG9jYXRlZCBBdWRpb0NvbnZlcnQgY29udGV4dAorICovCitBdWRpb0NvbnZlcnQgKmZmX2F1ZGlvX2NvbnZlcnRfYWxsb2MoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGluX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGludCBzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBwbHlfbWFwKTsKKworLyoqCisgKiBGcmVlIEF1ZGlvQ29udmVydC4KKyAqCisgKiBUaGUgQXVkaW9Db252ZXJ0IG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggZmZfYXVkaW9fY29udmVydF9hbGxvYygpLgorICoKKyAqIEBwYXJhbSBhYyAgQXVkaW9Db252ZXJ0IHN0cnVjdAorICovCit2b2lkIGZmX2F1ZGlvX2NvbnZlcnRfZnJlZShBdWRpb0NvbnZlcnQgKiphYyk7CisKKy8qKgorICogQ29udmVydCBhdWRpbyBkYXRhIGZyb20gb25lIHNhbXBsZSBmb3JtYXQgdG8gYW5vdGhlci4KKyAqCisgKiBGb3IgZWFjaCBjYWxsLCB0aGUgYWxpZ25tZW50IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IEF1ZGlvRGF0YSBidWZmZXJzIGFyZQorICogZXhhbWluZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIHRoZSBnZW5lcmljIG9yIG9wdGltaXplZCBjb252ZXJzaW9uCisgKiBmdW5jdGlvbiAod2hlbiBhdmFpbGFibGUpLgorICoKKyAqIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBjb252ZXJ0IGlzIGRldGVybWluZWQgYnkgaW4tPm5iX3NhbXBsZXMuIFRoZSBvdXRwdXQKKyAqIGJ1ZmZlciBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBoYW5kbGUgdGhpcyBtYW55IHNhbXBsZXMuIG91dC0+bmJfc2FtcGxlcyBpcworICogc2V0IGJ5IHRoaXMgZnVuY3Rpb24gYmVmb3JlIGEgc3VjY2Vzc2Z1bCByZXR1cm4uCisgKgorICogQHBhcmFtIGFjICAgICBBdWRpb0NvbnZlcnQgY29udGV4dAorICogQHBhcmFtIG91dCAgICBvdXRwdXQgYXVkaW8gZGF0YQorICogQHBhcmFtIGluICAgICBpbnB1dCBhdWRpbyBkYXRhCisgKiBAcmV0dXJuICAgICAgIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGZmX2F1ZGlvX2NvbnZlcnQoQXVkaW9Db252ZXJ0ICphYywgQXVkaW9EYXRhICpvdXQsIEF1ZGlvRGF0YSAqaW4pOworCisvKiBhcmNoLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCit2b2lkIGZmX2F1ZGlvX2NvbnZlcnRfaW5pdF9hYXJjaDY0KEF1ZGlvQ29udmVydCAqYWMpOwordm9pZCBmZl9hdWRpb19jb252ZXJ0X2luaXRfYXJtKEF1ZGlvQ29udmVydCAqYWMpOwordm9pZCBmZl9hdWRpb19jb252ZXJ0X2luaXRfeDg2KEF1ZGlvQ29udmVydCAqYWMpOworCisjZW5kaWYgLyogQVZSRVNBTVBMRV9BVURJT19DT05WRVJUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2F1ZGlvX2RhdGEuYyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2F1ZGlvX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmY1NDUwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXVkaW9fZGF0YS5jCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJhdWRpb19kYXRhLmgiCisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGF1ZGlvX2RhdGFfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiQXVkaW9EYXRhIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworLyoKKyAqIENhbGN1bGF0ZSBhbGlnbm1lbnQgZm9yIGRhdGEgcG9pbnRlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGNhbGNfcHRyX2FsaWdubWVudChBdWRpb0RhdGEgKmEpCit7CisgICAgaW50IHA7CisgICAgaW50IG1pbl9hbGlnbiA9IDEyODsKKworICAgIGZvciAocCA9IDA7IHAgPCBhLT5wbGFuZXM7IHArKykgeworICAgICAgICBpbnQgY3VyX2FsaWduID0gMTI4OworICAgICAgICB3aGlsZSAoKGludHB0cl90KWEtPmRhdGFbcF0gJSBjdXJfYWxpZ24pCisgICAgICAgICAgICBjdXJfYWxpZ24gPj49IDE7CisgICAgICAgIGlmIChjdXJfYWxpZ24gPCBtaW5fYWxpZ24pCisgICAgICAgICAgICBtaW5fYWxpZ24gPSBjdXJfYWxpZ247CisgICAgfQorICAgIGEtPnB0cl9hbGlnbiA9IG1pbl9hbGlnbjsKK30KKworaW50IGZmX3NhbXBsZV9mbXRfaXNfcGxhbmFyKGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwgaW50IGNoYW5uZWxzKQoreworICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihzYW1wbGVfZm10KTsKK30KKworaW50IGZmX2F1ZGlvX2RhdGFfc2V0X2NoYW5uZWxzKEF1ZGlvRGF0YSAqYSwgaW50IGNoYW5uZWxzKQoreworICAgIGlmIChjaGFubmVscyA8IDEgfHwgY2hhbm5lbHMgPiBBVlJFU0FNUExFX01BWF9DSEFOTkVMUyB8fAorICAgICAgICBjaGFubmVscyA+IGEtPmFsbG9jYXRlZF9jaGFubmVscykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGEtPmNoYW5uZWxzICA9IGNoYW5uZWxzOworICAgIGEtPnBsYW5lcyAgICA9IGEtPmlzX3BsYW5hciA/IGNoYW5uZWxzIDogMTsKKworICAgIGNhbGNfcHRyX2FsaWdubWVudChhKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfYXVkaW9fZGF0YV9pbml0KEF1ZGlvRGF0YSAqYSwgdWludDhfdCAqKnNyYywgaW50IHBsYW5lX3NpemUsIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlYWRfb25seSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgcDsKKworICAgIG1lbXNldChhLCAwLCBzaXplb2YoKmEpKTsKKyAgICBhLT5jbGFzcyA9ICZhdWRpb19kYXRhX2NsYXNzOworCisgICAgaWYgKGNoYW5uZWxzIDwgMSB8fCBjaGFubmVscyA+IEFWUkVTQU1QTEVfTUFYX0NIQU5ORUxTKSB7CisgICAgICAgIGF2X2xvZyhhLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGNoYW5uZWwgY291bnQ6ICVkXG4iLCBjaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYS0+c2FtcGxlX3NpemUgPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShzYW1wbGVfZm10KTsKKyAgICBpZiAoIWEtPnNhbXBsZV9zaXplKSB7CisgICAgICAgIGF2X2xvZyhhLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHNhbXBsZSBmb3JtYXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBhLT5pc19wbGFuYXIgPSBmZl9zYW1wbGVfZm10X2lzX3BsYW5hcihzYW1wbGVfZm10LCBjaGFubmVscyk7CisgICAgYS0+cGxhbmVzICAgID0gYS0+aXNfcGxhbmFyID8gY2hhbm5lbHMgOiAxOworICAgIGEtPnN0cmlkZSAgICA9IGEtPnNhbXBsZV9zaXplICogKGEtPmlzX3BsYW5hciA/IDEgOiBjaGFubmVscyk7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgKGEtPmlzX3BsYW5hciA/IGNoYW5uZWxzIDogMSk7IHArKykgeworICAgICAgICBpZiAoIXNyY1twXSkgeworICAgICAgICAgICAgYXZfbG9nKGEsIEFWX0xPR19FUlJPUiwgImludmFsaWQgTlVMTCBwb2ludGVyIGZvciBzcmNbJWRdXG4iLCBwKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgYS0+ZGF0YVtwXSA9IHNyY1twXTsKKyAgICB9CisgICAgYS0+YWxsb2NhdGVkX3NhbXBsZXMgID0gbmJfc2FtcGxlcyAqICFyZWFkX29ubHk7CisgICAgYS0+bmJfc2FtcGxlcyAgICAgICAgID0gbmJfc2FtcGxlczsKKyAgICBhLT5zYW1wbGVfZm10ICAgICAgICAgPSBzYW1wbGVfZm10OworICAgIGEtPmNoYW5uZWxzICAgICAgICAgICA9IGNoYW5uZWxzOworICAgIGEtPmFsbG9jYXRlZF9jaGFubmVscyA9IGNoYW5uZWxzOworICAgIGEtPnJlYWRfb25seSAgICAgICAgICA9IHJlYWRfb25seTsKKyAgICBhLT5hbGxvd19yZWFsbG9jICAgICAgPSAwOworICAgIGEtPm5hbWUgICAgICAgICAgICAgICA9IG5hbWUgPyBuYW1lIDogIntubyBuYW1lfSI7CisKKyAgICBjYWxjX3B0cl9hbGlnbm1lbnQoYSk7CisgICAgYS0+c2FtcGxlc19hbGlnbiA9IHBsYW5lX3NpemUgLyBhLT5zdHJpZGU7CisKKyAgICByZXR1cm4gMDsKK30KKworQXVkaW9EYXRhICpmZl9hdWRpb19kYXRhX2FsbG9jKGludCBjaGFubmVscywgaW50IG5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIEF1ZGlvRGF0YSAqYTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGNoYW5uZWxzIDwgMSB8fCBjaGFubmVscyA+IEFWUkVTQU1QTEVfTUFYX0NIQU5ORUxTKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGEgPSBhdl9tYWxsb2N6KHNpemVvZigqYSkpOworICAgIGlmICghYSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBhLT5zYW1wbGVfc2l6ZSA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKHNhbXBsZV9mbXQpOworICAgIGlmICghYS0+c2FtcGxlX3NpemUpIHsKKyAgICAgICAgYXZfZnJlZShhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGEtPmlzX3BsYW5hciA9IGZmX3NhbXBsZV9mbXRfaXNfcGxhbmFyKHNhbXBsZV9mbXQsIGNoYW5uZWxzKTsKKyAgICBhLT5wbGFuZXMgICAgPSBhLT5pc19wbGFuYXIgPyBjaGFubmVscyA6IDE7CisgICAgYS0+c3RyaWRlICAgID0gYS0+c2FtcGxlX3NpemUgKiAoYS0+aXNfcGxhbmFyID8gMSA6IGNoYW5uZWxzKTsKKworICAgIGEtPmNsYXNzICAgICAgICAgICAgICA9ICZhdWRpb19kYXRhX2NsYXNzOworICAgIGEtPnNhbXBsZV9mbXQgICAgICAgICA9IHNhbXBsZV9mbXQ7CisgICAgYS0+Y2hhbm5lbHMgICAgICAgICAgID0gY2hhbm5lbHM7CisgICAgYS0+YWxsb2NhdGVkX2NoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgYS0+cmVhZF9vbmx5ICAgICAgICAgID0gMDsKKyAgICBhLT5hbGxvd19yZWFsbG9jICAgICAgPSAxOworICAgIGEtPm5hbWUgICAgICAgICAgICAgICA9IG5hbWUgPyBuYW1lIDogIntubyBuYW1lfSI7CisKKyAgICBpZiAobmJfc2FtcGxlcyA+IDApIHsKKyAgICAgICAgcmV0ID0gZmZfYXVkaW9fZGF0YV9yZWFsbG9jKGEsIG5iX3NhbXBsZXMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZShhKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhOworICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGNfcHRyX2FsaWdubWVudChhKTsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorfQorCitpbnQgZmZfYXVkaW9fZGF0YV9yZWFsbG9jKEF1ZGlvRGF0YSAqYSwgaW50IG5iX3NhbXBsZXMpCit7CisgICAgaW50IHJldCwgbmV3X2J1Zl9zaXplLCBwbGFuZV9zaXplLCBwOworCisgICAgLyogY2hlY2sgaWYgYnVmZmVyIGlzIGFscmVhZHkgbGFyZ2UgZW5vdWdoICovCisgICAgaWYgKGEtPmFsbG9jYXRlZF9zYW1wbGVzID49IG5iX3NhbXBsZXMpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogdmFsaWRhdGUgdGhhdCB0aGUgb3V0cHV0IGlzIG5vdCByZWFkLW9ubHkgYW5kIHJlYWxsb2MgaXMgYWxsb3dlZCAqLworICAgIGlmIChhLT5yZWFkX29ubHkgfHwgIWEtPmFsbG93X3JlYWxsb2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBuZXdfYnVmX3NpemUgPSBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZSgmcGxhbmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hbGxvY2F0ZWRfY2hhbm5lbHMsIG5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2FtcGxlX2ZtdCwgMCk7CisgICAgaWYgKG5ld19idWZfc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBuZXdfYnVmX3NpemU7CisKKyAgICAvKiBpZiB0aGVyZSBpcyBhbHJlYWR5IGRhdGEgaW4gdGhlIGJ1ZmZlciBhbmQgdGhlIHNhbXBsZSBmb3JtYXQgaXMgcGxhbmFyLAorICAgICAgIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBhbmQgY29weSB0aGUgZGF0YSwgb3RoZXJ3aXNlIGp1c3QgcmVhbGxvYyB0aGUKKyAgICAgICBpbnRlcm5hbCBidWZmZXIgYW5kIHNldCBuZXcgZGF0YSBwb2ludGVycyAqLworICAgIGlmIChhLT5uYl9zYW1wbGVzID4gMCAmJiBhLT5pc19wbGFuYXIpIHsKKyAgICAgICAgdWludDhfdCAqbmV3X2RhdGFbQVZSRVNBTVBMRV9NQVhfQ0hBTk5FTFNdID0geyBOVUxMIH07CisKKyAgICAgICAgcmV0ID0gYXZfc2FtcGxlc19hbGxvYyhuZXdfZGF0YSwgJnBsYW5lX3NpemUsIGEtPmFsbG9jYXRlZF9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzLCBhLT5zYW1wbGVfZm10LCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGZvciAocCA9IDA7IHAgPCBhLT5wbGFuZXM7IHArKykKKyAgICAgICAgICAgIG1lbWNweShuZXdfZGF0YVtwXSwgYS0+ZGF0YVtwXSwgYS0+bmJfc2FtcGxlcyAqIGEtPnN0cmlkZSk7CisKKyAgICAgICAgYXZfZnJlZXAoJmEtPmJ1ZmZlcik7CisgICAgICAgIG1lbWNweShhLT5kYXRhLCBuZXdfZGF0YSwgc2l6ZW9mKG5ld19kYXRhKSk7CisgICAgICAgIGEtPmJ1ZmZlciA9IGEtPmRhdGFbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfZnJlZXAoJmEtPmJ1ZmZlcik7CisgICAgICAgIGEtPmJ1ZmZlciA9IGF2X21hbGxvYyhuZXdfYnVmX3NpemUpOworICAgICAgICBpZiAoIWEtPmJ1ZmZlcikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHJldCA9IGF2X3NhbXBsZXNfZmlsbF9hcnJheXMoYS0+ZGF0YSwgJnBsYW5lX3NpemUsIGEtPmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hbGxvY2F0ZWRfY2hhbm5lbHMsIG5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2FtcGxlX2ZtdCwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgYS0+YnVmZmVyX3NpemUgICAgICAgPSBuZXdfYnVmX3NpemU7CisgICAgYS0+YWxsb2NhdGVkX3NhbXBsZXMgPSBuYl9zYW1wbGVzOworCisgICAgY2FsY19wdHJfYWxpZ25tZW50KGEpOworICAgIGEtPnNhbXBsZXNfYWxpZ24gPSBwbGFuZV9zaXplIC8gYS0+c3RyaWRlOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZfYXVkaW9fZGF0YV9mcmVlKEF1ZGlvRGF0YSAqKmEpCit7CisgICAgaWYgKCEqYSkKKyAgICAgICAgcmV0dXJuOworICAgIGF2X2ZyZWUoKCphKS0+YnVmZmVyKTsKKyAgICBhdl9mcmVlcChhKTsKK30KKworaW50IGZmX2F1ZGlvX2RhdGFfY29weShBdWRpb0RhdGEgKmRzdCwgQXVkaW9EYXRhICpzcmMsIENoYW5uZWxNYXBJbmZvICptYXApCit7CisgICAgaW50IHJldCwgcDsKKworICAgIC8qIHZhbGlkYXRlIGlucHV0L291dHB1dCBjb21wYXRpYmlsaXR5ICovCisgICAgaWYgKGRzdC0+c2FtcGxlX2ZtdCAhPSBzcmMtPnNhbXBsZV9mbXQgfHwgZHN0LT5jaGFubmVscyA8IHNyYy0+Y2hhbm5lbHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAobWFwICYmICFzcmMtPmlzX3BsYW5hcikgeworICAgICAgICBhdl9sb2coc3JjLCBBVl9MT0dfRVJST1IsICJjYW5ub3QgcmVtYXAgcGFja2VkIGZvcm1hdCBkdXJpbmcgY29weVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogaWYgdGhlIGlucHV0IGlzIGVtcHR5LCBqdXN0IGVtcHR5IHRoZSBvdXRwdXQgKi8KKyAgICBpZiAoIXNyYy0+bmJfc2FtcGxlcykgeworICAgICAgICBkc3QtPm5iX3NhbXBsZXMgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiByZWFsbG9jYXRlIG91dHB1dCBpZiBuZWNlc3NhcnkgKi8KKyAgICByZXQgPSBmZl9hdWRpb19kYXRhX3JlYWxsb2MoZHN0LCBzcmMtPm5iX3NhbXBsZXMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogY29weSBkYXRhICovCisgICAgaWYgKG1hcCkgeworICAgICAgICBpZiAobWFwLT5kb19yZW1hcCkgeworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHNyYy0+cGxhbmVzOyBwKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWFwLT5jaGFubmVsX21hcFtwXSA+PSAwKQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LT5kYXRhW3BdLCBzcmMtPmRhdGFbbWFwLT5jaGFubmVsX21hcFtwXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPm5iX3NhbXBsZXMgKiBzcmMtPnN0cmlkZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcC0+ZG9fY29weSB8fCBtYXAtPmRvX3plcm8pIHsKKyAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBzcmMtPnBsYW5lczsgcCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hcC0+Y2hhbm5lbF9jb3B5W3BdKQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LT5kYXRhW3BdLCBkc3QtPmRhdGFbbWFwLT5jaGFubmVsX2NvcHlbcF1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5uYl9zYW1wbGVzICogc3JjLT5zdHJpZGUpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hcC0+Y2hhbm5lbF96ZXJvW3BdKQorICAgICAgICAgICAgICAgICAgICBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKCZkc3QtPmRhdGFbcF0sIDAsIHNyYy0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBkc3QtPnNhbXBsZV9mbXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IHNyYy0+cGxhbmVzOyBwKyspCisgICAgICAgICAgICBtZW1jcHkoZHN0LT5kYXRhW3BdLCBzcmMtPmRhdGFbcF0sIHNyYy0+bmJfc2FtcGxlcyAqIHNyYy0+c3RyaWRlKTsKKyAgICB9CisKKyAgICBkc3QtPm5iX3NhbXBsZXMgPSBzcmMtPm5iX3NhbXBsZXM7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2F1ZGlvX2RhdGFfY29tYmluZShBdWRpb0RhdGEgKmRzdCwgaW50IGRzdF9vZmZzZXQsIEF1ZGlvRGF0YSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX29mZnNldCwgaW50IG5iX3NhbXBsZXMpCit7CisgICAgaW50IHJldCwgcCwgZHN0X29mZnNldDIsIGRzdF9tb3ZlX3NpemU7CisKKyAgICAvKiB2YWxpZGF0ZSBpbnB1dC9vdXRwdXQgY29tcGF0aWJpbGl0eSAqLworICAgIGlmIChkc3QtPnNhbXBsZV9mbXQgIT0gc3JjLT5zYW1wbGVfZm10IHx8IGRzdC0+Y2hhbm5lbHMgIT0gc3JjLT5jaGFubmVscykgeworICAgICAgICBhdl9sb2coc3JjLCBBVl9MT0dfRVJST1IsICJzYW1wbGUgZm9ybWF0IG1pc21hdGNoXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvKiB2YWxpZGF0ZSBvZmZzZXRzIGFyZSB3aXRoaW4gdGhlIGJ1ZmZlciBib3VuZHMgKi8KKyAgICBpZiAoZHN0X29mZnNldCA8IDAgfHwgZHN0X29mZnNldCA+IGRzdC0+bmJfc2FtcGxlcyB8fAorICAgICAgICBzcmNfb2Zmc2V0IDwgMCB8fCBzcmNfb2Zmc2V0ID4gc3JjLT5uYl9zYW1wbGVzKSB7CisgICAgICAgIGF2X2xvZyhzcmMsIEFWX0xPR19FUlJPUiwgIm9mZnNldCBvdXQtb2YtYm91bmRzOiBzcmM9JWQgZHN0PSVkXG4iLAorICAgICAgICAgICAgICAgc3JjX29mZnNldCwgZHN0X29mZnNldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogY2hlY2sgb2Zmc2V0cyBhbmQgc2l6ZXMgdG8gc2VlIGlmIHdlIGNhbiBqdXN0IGRvIG5vdGhpbmcgYW5kIHJldHVybiAqLworICAgIGlmIChuYl9zYW1wbGVzID4gc3JjLT5uYl9zYW1wbGVzIC0gc3JjX29mZnNldCkKKyAgICAgICAgbmJfc2FtcGxlcyA9IHNyYy0+bmJfc2FtcGxlcyAtIHNyY19vZmZzZXQ7CisgICAgaWYgKG5iX3NhbXBsZXMgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiB2YWxpZGF0ZSB0aGF0IHRoZSBvdXRwdXQgaXMgbm90IHJlYWQtb25seSAqLworICAgIGlmIChkc3QtPnJlYWRfb25seSkgeworICAgICAgICBhdl9sb2coZHN0LCBBVl9MT0dfRVJST1IsICJkc3QgaXMgcmVhZC1vbmx5XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvKiByZWFsbG9jYXRlIG91dHB1dCBpZiBuZWNlc3NhcnkgKi8KKyAgICByZXQgPSBmZl9hdWRpb19kYXRhX3JlYWxsb2MoZHN0LCBkc3QtPm5iX3NhbXBsZXMgKyBuYl9zYW1wbGVzKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coZHN0LCBBVl9MT0dfRVJST1IsICJlcnJvciByZWFsbG9jYXRpbmcgZHN0XG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBkc3Rfb2Zmc2V0MiAgID0gZHN0X29mZnNldCArIG5iX3NhbXBsZXM7CisgICAgZHN0X21vdmVfc2l6ZSA9IGRzdC0+bmJfc2FtcGxlcyAtIGRzdF9vZmZzZXQ7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgc3JjLT5wbGFuZXM7IHArKykgeworICAgICAgICBpZiAoZHN0X21vdmVfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIG1lbW1vdmUoZHN0LT5kYXRhW3BdICsgZHN0X29mZnNldDIgKiBkc3QtPnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhW3BdICsgZHN0X29mZnNldCAgKiBkc3QtPnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgZHN0X21vdmVfc2l6ZSAqIGRzdC0+c3RyaWRlKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZHN0LT5kYXRhW3BdICsgZHN0X29mZnNldCAqIGRzdC0+c3RyaWRlLAorICAgICAgICAgICAgICAgc3JjLT5kYXRhW3BdICsgc3JjX29mZnNldCAqIHNyYy0+c3RyaWRlLAorICAgICAgICAgICAgICAgbmJfc2FtcGxlcyAqIHNyYy0+c3RyaWRlKTsKKyAgICB9CisgICAgZHN0LT5uYl9zYW1wbGVzICs9IG5iX3NhbXBsZXM7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl9hdWRpb19kYXRhX2RyYWluKEF1ZGlvRGF0YSAqYSwgaW50IG5iX3NhbXBsZXMpCit7CisgICAgaWYgKGEtPm5iX3NhbXBsZXMgPD0gbmJfc2FtcGxlcykgeworICAgICAgICAvKiBkcmFpbiB0aGUgd2hvbGUgYnVmZmVyICovCisgICAgICAgIGEtPm5iX3NhbXBsZXMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwOworICAgICAgICBpbnQgbW92ZV9vZmZzZXQgPSBhLT5zdHJpZGUgKiBuYl9zYW1wbGVzOworICAgICAgICBpbnQgbW92ZV9zaXplICAgPSBhLT5zdHJpZGUgKiAoYS0+bmJfc2FtcGxlcyAtIG5iX3NhbXBsZXMpOworCisgICAgICAgIGZvciAocCA9IDA7IHAgPCBhLT5wbGFuZXM7IHArKykKKyAgICAgICAgICAgIG1lbW1vdmUoYS0+ZGF0YVtwXSwgYS0+ZGF0YVtwXSArIG1vdmVfb2Zmc2V0LCBtb3ZlX3NpemUpOworCisgICAgICAgIGEtPm5iX3NhbXBsZXMgLT0gbmJfc2FtcGxlczsKKyAgICB9Cit9CisKK2ludCBmZl9hdWRpb19kYXRhX2FkZF90b19maWZvKEFWQXVkaW9GaWZvICphZiwgQXVkaW9EYXRhICphLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMpCit7CisgICAgdWludDhfdCAqb2Zmc2V0X2RhdGFbQVZSRVNBTVBMRV9NQVhfQ0hBTk5FTFNdOworICAgIGludCBvZmZzZXRfc2l6ZSwgcDsKKworICAgIGlmIChvZmZzZXQgPj0gYS0+bmJfc2FtcGxlcykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgb2Zmc2V0X3NpemUgPSBvZmZzZXQgKiBhLT5zdHJpZGU7CisgICAgZm9yIChwID0gMDsgcCA8IGEtPnBsYW5lczsgcCsrKQorICAgICAgICBvZmZzZXRfZGF0YVtwXSA9IGEtPmRhdGFbcF0gKyBvZmZzZXRfc2l6ZTsKKworICAgIHJldHVybiBhdl9hdWRpb19maWZvX3dyaXRlKGFmLCAodm9pZCAqKilvZmZzZXRfZGF0YSwgbmJfc2FtcGxlcyk7Cit9CisKK2ludCBmZl9hdWRpb19kYXRhX3JlYWRfZnJvbV9maWZvKEFWQXVkaW9GaWZvICphZiwgQXVkaW9EYXRhICphLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGEtPnJlYWRfb25seSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHJldCA9IGZmX2F1ZGlvX2RhdGFfcmVhbGxvYyhhLCBuYl9zYW1wbGVzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGF2X2F1ZGlvX2ZpZm9fcmVhZChhZiwgKHZvaWQgKiopYS0+ZGF0YSwgbmJfc2FtcGxlcyk7CisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICBhLT5uYl9zYW1wbGVzID0gcmV0OworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9hdWRpb19kYXRhLmggYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hdWRpb19kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwYmQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2F1ZGlvX2RhdGEuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBKdXN0aW4gUnVnZ2xlcyA8anVzdGluLnJ1Z2dsZXNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWUkVTQU1QTEVfQVVESU9fREFUQV9ICisjZGVmaW5lIEFWUkVTQU1QTEVfQVVESU9fREFUQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdWRpb19maWZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJhdnJlc2FtcGxlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworaW50IGZmX3NhbXBsZV9mbXRfaXNfcGxhbmFyKGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwgaW50IGNoYW5uZWxzKTsKKworLyoqCisgKiBBdWRpbyBidWZmZXIgdXNlZCBmb3IgaW50ZXJtZWRpYXRlIHN0b3JhZ2UgYmV0d2VlbiBjb252ZXJzaW9uIHBoYXNlcy4KKyAqLworc3RydWN0IEF1ZGlvRGF0YSB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7ICAgICAgICAgICAgICAgLyoqPCBBVkNsYXNzIGZvciBsb2dnaW5nICAgICAgICAgICAgKi8KKyAgICB1aW50OF90ICpkYXRhW0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsgLyoqPCBkYXRhIHBsYW5lIHBvaW50ZXJzICAgICAgICAqLworICAgIHVpbnQ4X3QgKmJ1ZmZlcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgZGF0YSBidWZmZXIgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplOyAgICAgICAgICAgLyoqPCBhbGxvY2F0ZWQgYnVmZmVyIHNpemUgICAgICAgICAgKi8KKyAgICBpbnQgYWxsb2NhdGVkX3NhbXBsZXM7ICAgICAgICAgICAgICAvKio8IG51bWJlciBvZiBzYW1wbGVzIHRoZSBidWZmZXIgY2FuIGhvbGQgKi8KKyAgICBpbnQgbmJfc2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAvKio8IGN1cnJlbnQgbnVtYmVyIG9mIHNhbXBsZXMgICAgICAqLworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdDsgICAgIC8qKjwgc2FtcGxlIGZvcm1hdCAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBjaGFubmVsIGNvdW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgYWxsb2NhdGVkX2NoYW5uZWxzOyAgICAgICAgICAgICAvKio8IGFsbG9jYXRlZCBjaGFubmVsIGNvdW50ICAgICAgICAqLworICAgIGludCBpc19wbGFuYXI7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2FtcGxlIGZvcm1hdCBpcyBwbGFuYXIgICAgICAgICovCisgICAgaW50IHBsYW5lczsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgZGF0YSBwbGFuZXMgICAgICAgICAgKi8KKyAgICBpbnQgc2FtcGxlX3NpemU7ICAgICAgICAgICAgICAgICAgICAvKio8IGJ5dGVzIHBlciBzYW1wbGUgICAgICAgICAgICAgICAqLworICAgIGludCBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2FtcGxlIGJ5dGUgb2Zmc2V0IHdpdGhpbiBhIHBsYW5lICovCisgICAgaW50IHJlYWRfb25seTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkYXRhIGlzIHJlYWQtb25seSAgICAgICAgICAgICAgKi8KKyAgICBpbnQgYWxsb3dfcmVhbGxvYzsgICAgICAgICAgICAgICAgICAvKio8IHJlYWxsb2MgaXMgYWxsb3dlZCAgICAgICAgICAgICAqLworICAgIGludCBwdHJfYWxpZ247ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgbWluaW11bSBkYXRhIHBvaW50ZXIgYWxpZ25tZW50ICovCisgICAgaW50IHNhbXBsZXNfYWxpZ247ICAgICAgICAgICAgICAgICAgLyoqPCBhbGxvY2F0ZWQgc2FtcGxlcyBhbGlnbm1lbnQgICAgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAvKio8IG5hbWUgZm9yIGRlYnVnIGxvZ2dpbmcgICAgICAgICAqLworfTsKKworaW50IGZmX2F1ZGlvX2RhdGFfc2V0X2NoYW5uZWxzKEF1ZGlvRGF0YSAqYSwgaW50IGNoYW5uZWxzKTsKKworLyoqCisgKiBJbml0aWFsaXplIEF1ZGlvRGF0YSB1c2luZyBhIGdpdmVuIHNvdXJjZS4KKyAqCisgKiBUaGlzIGRvZXMgbm90IGFsbG9jYXRlIGFuIGludGVybmFsIGJ1ZmZlci4gSXQgb25seSBzZXRzIHRoZSBkYXRhIHBvaW50ZXJzCisgKiBhbmQgYXVkaW8gcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gYSAgICAgICAgICAgICAgIEF1ZGlvRGF0YSBzdHJ1Y3QKKyAqIEBwYXJhbSBzcmMgICAgICAgICAgICAgc291cmNlIGRhdGEgcG9pbnRlcnMKKyAqIEBwYXJhbSBwbGFuZV9zaXplICAgICAgcGxhbmUgc2l6ZSwgaW4gYnl0ZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2FuIGJlIDAgaWYgdW5rbm93biwgYnV0IHRoYXQgd2lsbCBsZWFkIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplZCBmdW5jdGlvbnMgbm90IGJlaW5nIHVzZWQgaW4gbWFueSBjYXNlcywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggY291bGQgc2xvdyBkb3duIHNvbWUgY29udmVyc2lvbnMuCisgKiBAcGFyYW0gY2hhbm5lbHMgICAgICAgIGNoYW5uZWwgY291bnQKKyAqIEBwYXJhbSBuYl9zYW1wbGVzICAgICAgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIHNvdXJjZSBkYXRhCisgKiBAcGFyYW0gc2FtcGxlX2ZtdCAgICAgIHNhbXBsZSBmb3JtYXQKKyAqIEBwYXJhbSByZWFkX29ubHkgICAgICAgaW5kaWNhdGVzIGlmIGJ1ZmZlciBpcyByZWFkIG9ubHkgb3IgcmVhZC93cml0ZQorICogQHBhcmFtIG5hbWUgICAgICAgICAgICBuYW1lIGZvciBkZWJ1ZyBsb2dnaW5nIChjYW4gYmUgTlVMTCkKKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIHZhbHVlIG9uIGVycm9yCisgKi8KK2ludCBmZl9hdWRpb19kYXRhX2luaXQoQXVkaW9EYXRhICphLCB1aW50OF90ICoqc3JjLCBpbnQgcGxhbmVfc2l6ZSwgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVhZF9vbmx5LCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBBbGxvY2F0ZSBBdWRpb0RhdGEuCisgKgorICogVGhpcyBhbGxvY2F0ZXMgYW4gaW50ZXJuYWwgYnVmZmVyIGFuZCBzZXRzIGF1ZGlvIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIGNoYW5uZWxzICAgICAgICBjaGFubmVsIGNvdW50CisgKiBAcGFyYW0gbmJfc2FtcGxlcyAgICAgIG51bWJlciBvZiBzYW1wbGVzIHRvIGFsbG9jYXRlIHNwYWNlIGZvcgorICogQHBhcmFtIHNhbXBsZV9mbXQgICAgICBzYW1wbGUgZm9ybWF0CisgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgIG5hbWUgZm9yIGRlYnVnIGxvZ2dpbmcgKGNhbiBiZSBOVUxMKQorICogQHJldHVybiAgICAgICAgICAgICAgICBuZXdseSBhbGxvY2F0ZWQgQXVkaW9EYXRhIHN0cnVjdCwgb3IgTlVMTCBvbiBlcnJvcgorICovCitBdWRpb0RhdGEgKmZmX2F1ZGlvX2RhdGFfYWxsb2MoaW50IGNoYW5uZWxzLCBpbnQgbmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogUmVhbGxvY2F0ZSBBdWRpb0RhdGEuCisgKgorICogVGhlIEF1ZGlvRGF0YSBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIGZmX2F1ZGlvX2RhdGFfYWxsb2MoKS4KKyAqCisgKiBAcGFyYW0gYSAgICAgICAgICAgQXVkaW9EYXRhIHN0cnVjdAorICogQHBhcmFtIG5iX3NhbXBsZXMgIG51bWJlciBvZiBzYW1wbGVzIHRvIGFsbG9jYXRlIHNwYWNlIGZvcgorICogQHJldHVybiAgICAgICAgICAgIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgQVZFUlJPUiB2YWx1ZSBvbiBlcnJvcgorICovCitpbnQgZmZfYXVkaW9fZGF0YV9yZWFsbG9jKEF1ZGlvRGF0YSAqYSwgaW50IG5iX3NhbXBsZXMpOworCisvKioKKyAqIEZyZWUgQXVkaW9EYXRhLgorICoKKyAqIFRoZSBBdWRpb0RhdGEgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBhbGxvY2F0ZWQgd2l0aCBmZl9hdWRpb19kYXRhX2FsbG9jKCkuCisgKgorICogQHBhcmFtIGEgIEF1ZGlvRGF0YSBzdHJ1Y3QKKyAqLwordm9pZCBmZl9hdWRpb19kYXRhX2ZyZWUoQXVkaW9EYXRhICoqYSk7CisKKy8qKgorICogQ29weSBkYXRhIGZyb20gb25lIEF1ZGlvRGF0YSB0byBhbm90aGVyLgorICoKKyAqIEBwYXJhbSBvdXQgIG91dHB1dCBBdWRpb0RhdGEKKyAqIEBwYXJhbSBpbiAgIGlucHV0IEF1ZGlvRGF0YQorICogQHBhcmFtIG1hcCAgY2hhbm5lbCBtYXAsIE5VTEwgaWYgbm90IHJlbWFwcGluZworICogQHJldHVybiAgICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIHZhbHVlIG9uIGVycm9yCisgKi8KK2ludCBmZl9hdWRpb19kYXRhX2NvcHkoQXVkaW9EYXRhICpvdXQsIEF1ZGlvRGF0YSAqaW4sIENoYW5uZWxNYXBJbmZvICptYXApOworCisvKioKKyAqIEFwcGVuZCBkYXRhIGZyb20gb25lIEF1ZGlvRGF0YSB0byB0aGUgZW5kIG9mIGFub3RoZXIuCisgKgorICogQHBhcmFtIGRzdCAgICAgICAgIGRlc3RpbmF0aW9uIEF1ZGlvRGF0YQorICogQHBhcmFtIGRzdF9vZmZzZXQgIG9mZnNldCwgaW4gc2FtcGxlcywgdG8gc3RhcnQgd3JpdGluZywgcmVsYXRpdmUgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgc3RhcnQgb2YgZHN0CisgKiBAcGFyYW0gc3JjICAgICAgICAgc291cmNlIEF1ZGlvRGF0YQorICogQHBhcmFtIHNyY19vZmZzZXQgIG9mZnNldCwgaW4gc2FtcGxlcywgdG8gc3RhcnQgY29weWluZywgcmVsYXRpdmUgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgc3RhcnQgb2YgdGhlIHNyYworICogQHBhcmFtIG5iX3NhbXBsZXMgIG51bWJlciBvZiBzYW1wbGVzIHRvIGNvcHkKKyAqIEByZXR1cm4gICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIEFWRVJST1IgdmFsdWUgb24gZXJyb3IKKyAqLworaW50IGZmX2F1ZGlvX2RhdGFfY29tYmluZShBdWRpb0RhdGEgKmRzdCwgaW50IGRzdF9vZmZzZXQsIEF1ZGlvRGF0YSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX29mZnNldCwgaW50IG5iX3NhbXBsZXMpOworCisvKioKKyAqIERyYWluIHNhbXBsZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIEF1ZGlvRGF0YS4KKyAqCisgKiBSZW1haW5pbmcgc2FtcGxlcyBhcmUgc2hpZnRlZCB0byB0aGUgc3RhcnQgb2YgdGhlIEF1ZGlvRGF0YS4KKyAqCisgKiBAcGFyYW0gYSAgICAgICAgICAgQXVkaW9EYXRhIHN0cnVjdAorICogQHBhcmFtIG5iX3NhbXBsZXMgIG51bWJlciBvZiBzYW1wbGVzIHRvIGRyYWluCisgKi8KK3ZvaWQgZmZfYXVkaW9fZGF0YV9kcmFpbihBdWRpb0RhdGEgKmEsIGludCBuYl9zYW1wbGVzKTsKKworLyoqCisgKiBBZGQgc2FtcGxlcyBpbiBBdWRpb0RhdGEgdG8gYW4gQVZBdWRpb0ZpZm8uCisgKgorICogQHBhcmFtIGFmICAgICAgICAgIEF1ZGlvIEZJRk8gQnVmZmVyCisgKiBAcGFyYW0gYSAgICAgICAgICAgQXVkaW9EYXRhIHN0cnVjdAorICogQHBhcmFtIG9mZnNldCAgICAgIG51bWJlciBvZiBzYW1wbGVzIHRvIHNraXAgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGRhdGEKKyAqIEBwYXJhbSBuYl9zYW1wbGVzICBudW1iZXIgb2Ygc2FtcGxlcyB0byBhZGQgdG8gdGhlIEZJRk8KKyAqIEByZXR1cm4gICAgICAgICAgICBudW1iZXIgb2Ygc2FtcGxlcyBhY3R1YWxseSBhZGRlZCB0byB0aGUgRklGTywgb3IKKyAqICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZXJyb3IKKyAqLworaW50IGZmX2F1ZGlvX2RhdGFfYWRkX3RvX2ZpZm8oQVZBdWRpb0ZpZm8gKmFmLCBBdWRpb0RhdGEgKmEsIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcyk7CisKKy8qKgorICogUmVhZCBzYW1wbGVzIGZyb20gYW4gQVZBdWRpb0ZpZm8gdG8gQXVkaW9EYXRhLgorICoKKyAqIEBwYXJhbSBhZiAgICAgICAgICBBdWRpbyBGSUZPIEJ1ZmZlcgorICogQHBhcmFtIGEgICAgICAgICAgIEF1ZGlvRGF0YSBzdHJ1Y3QKKyAqIEBwYXJhbSBuYl9zYW1wbGVzICBudW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkIGZyb20gdGhlIEZJRk8KKyAqIEByZXR1cm4gICAgICAgICAgICBudW1iZXIgb2Ygc2FtcGxlcyBhY3R1YWxseSByZWFkIGZyb20gdGhlIEZJRk8sIG9yCisgKiAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGVycm9yCisgKi8KK2ludCBmZl9hdWRpb19kYXRhX3JlYWRfZnJvbV9maWZvKEFWQXVkaW9GaWZvICphZiwgQXVkaW9EYXRhICphLCBpbnQgbmJfc2FtcGxlcyk7CisKKyNlbmRpZiAvKiBBVlJFU0FNUExFX0FVRElPX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXVkaW9fbWl4LmMgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hdWRpb19taXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGYxODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXVkaW9fbWl4LmMKQEAgLTAsMCArMSw3NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9saWJtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImF2cmVzYW1wbGUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF1ZGlvX2RhdGEuaCIKKyNpbmNsdWRlICJhdWRpb19taXguaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb2VmZl90eXBlX25hbWVzW10gPSB7ICJxOCIsICJxMTUiLCAiZmx0IiB9OworCitzdHJ1Y3QgQXVkaW9NaXggeworICAgIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2cjsKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGZtdDsKKyAgICBlbnVtIEFWTWl4Q29lZmZUeXBlIGNvZWZmX3R5cGU7CisgICAgdWludDY0X3QgaW5fbGF5b3V0OworICAgIHVpbnQ2NF90IG91dF9sYXlvdXQ7CisgICAgaW50IGluX2NoYW5uZWxzOworICAgIGludCBvdXRfY2hhbm5lbHM7CisKKyAgICBpbnQgcHRyX2FsaWduOworICAgIGludCBzYW1wbGVzX2FsaWduOworICAgIGludCBoYXNfb3B0aW1pemVkX2Z1bmM7CisgICAgY29uc3QgY2hhciAqZnVuY19kZXNjcjsKKyAgICBjb25zdCBjaGFyICpmdW5jX2Rlc2NyX2dlbmVyaWM7CisgICAgbWl4X2Z1bmMgKm1peDsKKyAgICBtaXhfZnVuYyAqbWl4X2dlbmVyaWM7CisKKyAgICBpbnQgaW5fbWF0cml4X2NoYW5uZWxzOworICAgIGludCBvdXRfbWF0cml4X2NoYW5uZWxzOworICAgIGludCBvdXRwdXRfemVyb1tBVlJFU0FNUExFX01BWF9DSEFOTkVMU107CisgICAgaW50IGlucHV0X3NraXBbQVZSRVNBTVBMRV9NQVhfQ0hBTk5FTFNdOworICAgIGludCBvdXRwdXRfc2tpcFtBVlJFU0FNUExFX01BWF9DSEFOTkVMU107CisgICAgaW50MTZfdCAqbWF0cml4X3E4W0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsKKyAgICBpbnQzMl90ICptYXRyaXhfcTE1W0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsKKyAgICBmbG9hdCAgICptYXRyaXhfZmx0W0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsKKyAgICB2b2lkICAgKiptYXRyaXg7Cit9OworCit2b2lkIGZmX2F1ZGlvX21peF9zZXRfZnVuYyhBdWRpb01peCAqYW0sIGVudW0gQVZTYW1wbGVGb3JtYXQgZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVk1peENvZWZmVHlwZSBjb2VmZl90eXBlLCBpbnQgaW5fY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoYW5uZWxzLCBpbnQgcHRyX2FsaWduLCBpbnQgc2FtcGxlc19hbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2NyLCB2b2lkICptaXhfZnVuYykKK3sKKyAgICBpZiAoZm10ID09IGFtLT5mbXQgJiYgY29lZmZfdHlwZSA9PSBhbS0+Y29lZmZfdHlwZSAmJgorICAgICAgICAoIGluX2NoYW5uZWxzID09ICBhbS0+aW5fbWF0cml4X2NoYW5uZWxzIHx8ICBpbl9jaGFubmVscyA9PSAwKSAmJgorICAgICAgICAob3V0X2NoYW5uZWxzID09IGFtLT5vdXRfbWF0cml4X2NoYW5uZWxzIHx8IG91dF9jaGFubmVscyA9PSAwKSkgeworICAgICAgICBjaGFyIGNoYW5fc3RyWzE2XTsKKyAgICAgICAgYW0tPm1peCAgICAgICAgICAgPSBtaXhfZnVuYzsKKyAgICAgICAgYW0tPmZ1bmNfZGVzY3IgICAgPSBkZXNjcjsKKyAgICAgICAgYW0tPnB0cl9hbGlnbiAgICAgPSBwdHJfYWxpZ247CisgICAgICAgIGFtLT5zYW1wbGVzX2FsaWduID0gc2FtcGxlc19hbGlnbjsKKyAgICAgICAgaWYgKHB0cl9hbGlnbiA9PSAxICYmIHNhbXBsZXNfYWxpZ24gPT0gMSkgeworICAgICAgICAgICAgYW0tPm1peF9nZW5lcmljICAgICAgICA9IG1peF9mdW5jOworICAgICAgICAgICAgYW0tPmZ1bmNfZGVzY3JfZ2VuZXJpYyA9IGRlc2NyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYW0tPmhhc19vcHRpbWl6ZWRfZnVuYyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluX2NoYW5uZWxzKSB7CisgICAgICAgICAgICBpZiAob3V0X2NoYW5uZWxzKQorICAgICAgICAgICAgICAgIHNucHJpbnRmKGNoYW5fc3RyLCBzaXplb2YoY2hhbl9zdHIpLCAiWyVkIHRvICVkXSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluX2NoYW5uZWxzLCBvdXRfY2hhbm5lbHMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNucHJpbnRmKGNoYW5fc3RyLCBzaXplb2YoY2hhbl9zdHIpLCAiWyVkIHRvIGFueV0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbl9jaGFubmVscyk7CisgICAgICAgIH0gZWxzZSBpZiAob3V0X2NoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoY2hhbl9zdHIsIHNpemVvZihjaGFuX3N0ciksICJbYW55IHRvICVkXSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9jaGFubmVscyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihjaGFuX3N0ciwgc2l6ZW9mKGNoYW5fc3RyKSwgIlthbnkgdG8gYW55XSAiKTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coYW0tPmF2ciwgQVZfTE9HX0RFQlVHLCAiYXVkaW9fbWl4OiBmb3VuZCBmdW5jdGlvbjogW2ZtdD0lc10gIgorICAgICAgICAgICAgICAgIltjPSVzXSAlcyglcylcbiIsIGF2X2dldF9zYW1wbGVfZm10X25hbWUoZm10KSwKKyAgICAgICAgICAgICAgIGNvZWZmX3R5cGVfbmFtZXNbY29lZmZfdHlwZV0sIGNoYW5fc3RyLCBkZXNjcik7CisgICAgfQorfQorCisjZGVmaW5lIE1JWF9GVU5DX05BTUUoZm10LCBjZm10KSBtaXhfYW55XyAjIyBmbXQgIyNfIyMgY2ZtdCAjI19jCisKKyNkZWZpbmUgTUlYX0ZVTkNfR0VORVJJQyhmbXQsIGNmbXQsIHN0eXBlLCBjdHlwZSwgc3VtdHlwZSwgZXhwcikgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBNSVhfRlVOQ19OQU1FKGZtdCwgY2ZtdCkoc3R5cGUgKipzYW1wbGVzLCBjdHlwZSAqKm1hdHJpeCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBvdXRfY2gsIGludCBpbl9jaCkgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGluLCBvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0eXBlIHRlbXBbQVZSRVNBTVBMRV9NQVhfQ0hBTk5FTFNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAob3V0ID0gMDsgb3V0IDwgb3V0X2NoOyBvdXQrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3VtdHlwZSBzdW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoaW4gPSAwOyBpbiA8IGluX2NoOyBpbisrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3VtICs9IHNhbXBsZXNbaW5dW2ldICogbWF0cml4W291dF1baW5dOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcFtvdXRdID0gZXhwcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAob3V0ID0gMDsgb3V0IDwgb3V0X2NoOyBvdXQrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2FtcGxlc1tvdXRdW2ldID0gdGVtcFtvdXRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK01JWF9GVU5DX0dFTkVSSUMoRkxUUCwgRkxULCBmbG9hdCwgICBmbG9hdCwgICBmbG9hdCwgICBzdW0pCitNSVhfRlVOQ19HRU5FUklDKFMxNlAsIEZMVCwgaW50MTZfdCwgZmxvYXQsICAgZmxvYXQsICAgYXZfY2xpcF9pbnQxNihscmludGYoc3VtKSkpCitNSVhfRlVOQ19HRU5FUklDKFMxNlAsIFExNSwgaW50MTZfdCwgaW50MzJfdCwgaW50NjRfdCwgYXZfY2xpcF9pbnQxNihzdW0gPj4gMTUpKQorTUlYX0ZVTkNfR0VORVJJQyhTMTZQLCBROCwgIGludDE2X3QsIGludDE2X3QsIGludDMyX3QsIGF2X2NsaXBfaW50MTYoc3VtID4+ICA4KSkKKworLyogVE9ETzogdGVtcGxhdGl6ZSB0aGUgY2hhbm5lbC1zcGVjaWZpYyBDIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCBtaXhfMl90b18xX2ZsdHBfZmx0X2MoZmxvYXQgKipzYW1wbGVzLCBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpCit7CisgICAgZmxvYXQgKnNyYzAgPSBzYW1wbGVzWzBdOworICAgIGZsb2F0ICpzcmMxID0gc2FtcGxlc1sxXTsKKyAgICBmbG9hdCAqZHN0ICA9IHNyYzA7CisgICAgZmxvYXQgbTAgICAgPSBtYXRyaXhbMF1bMF07CisgICAgZmxvYXQgbTEgICAgPSBtYXRyaXhbMF1bMV07CisKKyAgICB3aGlsZSAobGVuID4gNCkgeworICAgICAgICAqZHN0KysgPSAqc3JjMCsrICogbTAgKyAqc3JjMSsrICogbTE7CisgICAgICAgICpkc3QrKyA9ICpzcmMwKysgKiBtMCArICpzcmMxKysgKiBtMTsKKyAgICAgICAgKmRzdCsrID0gKnNyYzArKyAqIG0wICsgKnNyYzErKyAqIG0xOworICAgICAgICAqZHN0KysgPSAqc3JjMCsrICogbTAgKyAqc3JjMSsrICogbTE7CisgICAgICAgIGxlbiAtPSA0OworICAgIH0KKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICAqZHN0KysgPSAqc3JjMCsrICogbTAgKyAqc3JjMSsrICogbTE7CisgICAgICAgIGxlbi0tOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbWl4XzJfdG9fMV9zMTZwX2ZsdF9jKGludDE2X3QgKipzYW1wbGVzLCBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpCit7CisgICAgaW50MTZfdCAqc3JjMCA9IHNhbXBsZXNbMF07CisgICAgaW50MTZfdCAqc3JjMSA9IHNhbXBsZXNbMV07CisgICAgaW50MTZfdCAqZHN0ICA9IHNyYzA7CisgICAgZmxvYXQgbTAgICAgICA9IG1hdHJpeFswXVswXTsKKyAgICBmbG9hdCBtMSAgICAgID0gbWF0cml4WzBdWzFdOworCisgICAgd2hpbGUgKGxlbiA+IDQpIHsKKyAgICAgICAgKmRzdCsrID0gYXZfY2xpcF9pbnQxNihscmludGYoKnNyYzArKyAqIG0wICsgKnNyYzErKyAqIG0xKSk7CisgICAgICAgICpkc3QrKyA9IGF2X2NsaXBfaW50MTYobHJpbnRmKCpzcmMwKysgKiBtMCArICpzcmMxKysgKiBtMSkpOworICAgICAgICAqZHN0KysgPSBhdl9jbGlwX2ludDE2KGxyaW50Zigqc3JjMCsrICogbTAgKyAqc3JjMSsrICogbTEpKTsKKyAgICAgICAgKmRzdCsrID0gYXZfY2xpcF9pbnQxNihscmludGYoKnNyYzArKyAqIG0wICsgKnNyYzErKyAqIG0xKSk7CisgICAgICAgIGxlbiAtPSA0OworICAgIH0KKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICAqZHN0KysgPSBhdl9jbGlwX2ludDE2KGxyaW50Zigqc3JjMCsrICogbTAgKyAqc3JjMSsrICogbTEpKTsKKyAgICAgICAgbGVuLS07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtaXhfMl90b18xX3MxNnBfcThfYyhpbnQxNl90ICoqc2FtcGxlcywgaW50MTZfdCAqKm1hdHJpeCwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfY2gsIGludCBpbl9jaCkKK3sKKyAgICBpbnQxNl90ICpzcmMwID0gc2FtcGxlc1swXTsKKyAgICBpbnQxNl90ICpzcmMxID0gc2FtcGxlc1sxXTsKKyAgICBpbnQxNl90ICpkc3QgID0gc3JjMDsKKyAgICBpbnQxNl90IG0wICAgID0gbWF0cml4WzBdWzBdOworICAgIGludDE2X3QgbTEgICAgPSBtYXRyaXhbMF1bMV07CisKKyAgICB3aGlsZSAobGVuID4gNCkgeworICAgICAgICAqZHN0KysgPSAoKnNyYzArKyAqIG0wICsgKnNyYzErKyAqIG0xKSA+PiA4OworICAgICAgICAqZHN0KysgPSAoKnNyYzArKyAqIG0wICsgKnNyYzErKyAqIG0xKSA+PiA4OworICAgICAgICAqZHN0KysgPSAoKnNyYzArKyAqIG0wICsgKnNyYzErKyAqIG0xKSA+PiA4OworICAgICAgICAqZHN0KysgPSAoKnNyYzArKyAqIG0wICsgKnNyYzErKyAqIG0xKSA+PiA4OworICAgICAgICBsZW4gLT0gNDsKKyAgICB9CisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgKmRzdCsrID0gKCpzcmMwKysgKiBtMCArICpzcmMxKysgKiBtMSkgPj4gODsKKyAgICAgICAgbGVuLS07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtaXhfMV90b18yX2ZsdHBfZmx0X2MoZmxvYXQgKipzYW1wbGVzLCBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpCit7CisgICAgZmxvYXQgdjsKKyAgICBmbG9hdCAqZHN0MCA9IHNhbXBsZXNbMF07CisgICAgZmxvYXQgKmRzdDEgPSBzYW1wbGVzWzFdOworICAgIGZsb2F0ICpzcmMgID0gZHN0MDsKKyAgICBmbG9hdCBtMCAgICA9IG1hdHJpeFswXVswXTsKKyAgICBmbG9hdCBtMSAgICA9IG1hdHJpeFsxXVswXTsKKworICAgIHdoaWxlIChsZW4gPiA0KSB7CisgICAgICAgIHYgPSAqc3JjKys7CisgICAgICAgICpkc3QwKysgPSB2ICogbTA7CisgICAgICAgICpkc3QxKysgPSB2ICogbTE7CisgICAgICAgIHYgPSAqc3JjKys7CisgICAgICAgICpkc3QwKysgPSB2ICogbTA7CisgICAgICAgICpkc3QxKysgPSB2ICogbTE7CisgICAgICAgIHYgPSAqc3JjKys7CisgICAgICAgICpkc3QwKysgPSB2ICogbTA7CisgICAgICAgICpkc3QxKysgPSB2ICogbTE7CisgICAgICAgIHYgPSAqc3JjKys7CisgICAgICAgICpkc3QwKysgPSB2ICogbTA7CisgICAgICAgICpkc3QxKysgPSB2ICogbTE7CisgICAgICAgIGxlbiAtPSA0OworICAgIH0KKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICB2ID0gKnNyYysrOworICAgICAgICAqZHN0MCsrID0gdiAqIG0wOworICAgICAgICAqZHN0MSsrID0gdiAqIG0xOworICAgICAgICBsZW4tLTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1peF82X3RvXzJfZmx0cF9mbHRfYyhmbG9hdCAqKnNhbXBsZXMsIGZsb2F0ICoqbWF0cml4LCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfY2gsIGludCBpbl9jaCkKK3sKKyAgICBmbG9hdCB2MCwgdjE7CisgICAgZmxvYXQgKnNyYzAgPSBzYW1wbGVzWzBdOworICAgIGZsb2F0ICpzcmMxID0gc2FtcGxlc1sxXTsKKyAgICBmbG9hdCAqc3JjMiA9IHNhbXBsZXNbMl07CisgICAgZmxvYXQgKnNyYzMgPSBzYW1wbGVzWzNdOworICAgIGZsb2F0ICpzcmM0ID0gc2FtcGxlc1s0XTsKKyAgICBmbG9hdCAqc3JjNSA9IHNhbXBsZXNbNV07CisgICAgZmxvYXQgKmRzdDAgPSBzcmMwOworICAgIGZsb2F0ICpkc3QxID0gc3JjMTsKKyAgICBmbG9hdCAqbTAgICA9IG1hdHJpeFswXTsKKyAgICBmbG9hdCAqbTEgICA9IG1hdHJpeFsxXTsKKworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIHYwID0gKnNyYzArKzsKKyAgICAgICAgdjEgPSAqc3JjMSsrOworICAgICAgICAqZHN0MCsrID0gdjAgICAgICAqIG0wWzBdICsKKyAgICAgICAgICAgICAgICAgIHYxICAgICAgKiBtMFsxXSArCisgICAgICAgICAgICAgICAgICAqc3JjMiAgICogbTBbMl0gKworICAgICAgICAgICAgICAgICAgKnNyYzMgICAqIG0wWzNdICsKKyAgICAgICAgICAgICAgICAgICpzcmM0ICAgKiBtMFs0XSArCisgICAgICAgICAgICAgICAgICAqc3JjNSAgICogbTBbNV07CisgICAgICAgICpkc3QxKysgPSB2MCAgICAgICogbTFbMF0gKworICAgICAgICAgICAgICAgICAgdjEgICAgICAqIG0xWzFdICsKKyAgICAgICAgICAgICAgICAgICpzcmMyKysgKiBtMVsyXSArCisgICAgICAgICAgICAgICAgICAqc3JjMysrICogbTFbM10gKworICAgICAgICAgICAgICAgICAgKnNyYzQrKyAqIG0xWzRdICsKKyAgICAgICAgICAgICAgICAgICpzcmM1KysgKiBtMVs1XTsKKyAgICAgICAgbGVuLS07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtaXhfMl90b182X2ZsdHBfZmx0X2MoZmxvYXQgKipzYW1wbGVzLCBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpCit7CisgICAgZmxvYXQgdjAsIHYxOworICAgIGZsb2F0ICpkc3QwID0gc2FtcGxlc1swXTsKKyAgICBmbG9hdCAqZHN0MSA9IHNhbXBsZXNbMV07CisgICAgZmxvYXQgKmRzdDIgPSBzYW1wbGVzWzJdOworICAgIGZsb2F0ICpkc3QzID0gc2FtcGxlc1szXTsKKyAgICBmbG9hdCAqZHN0NCA9IHNhbXBsZXNbNF07CisgICAgZmxvYXQgKmRzdDUgPSBzYW1wbGVzWzVdOworICAgIGZsb2F0ICpzcmMwID0gZHN0MDsKKyAgICBmbG9hdCAqc3JjMSA9IGRzdDE7CisKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICB2MCA9ICpzcmMwKys7CisgICAgICAgIHYxID0gKnNyYzErKzsKKyAgICAgICAgKmRzdDArKyA9IHYwICogbWF0cml4WzBdWzBdICsgdjEgKiBtYXRyaXhbMF1bMV07CisgICAgICAgICpkc3QxKysgPSB2MCAqIG1hdHJpeFsxXVswXSArIHYxICogbWF0cml4WzFdWzFdOworICAgICAgICAqZHN0MisrID0gdjAgKiBtYXRyaXhbMl1bMF0gKyB2MSAqIG1hdHJpeFsyXVsxXTsKKyAgICAgICAgKmRzdDMrKyA9IHYwICogbWF0cml4WzNdWzBdICsgdjEgKiBtYXRyaXhbM11bMV07CisgICAgICAgICpkc3Q0KysgPSB2MCAqIG1hdHJpeFs0XVswXSArIHYxICogbWF0cml4WzRdWzFdOworICAgICAgICAqZHN0NSsrID0gdjAgKiBtYXRyaXhbNV1bMF0gKyB2MSAqIG1hdHJpeFs1XVsxXTsKKyAgICAgICAgbGVuLS07CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbWl4X2Z1bmN0aW9uX2luaXQoQXVkaW9NaXggKmFtKQoreworICAgIGFtLT5mdW5jX2Rlc2NyID0gYW0tPmZ1bmNfZGVzY3JfZ2VuZXJpYyA9ICJuL2EiOworICAgIGFtLT5taXggPSBhbS0+bWl4X2dlbmVyaWMgPSBOVUxMOworCisgICAgLyogbm8gbmVlZCB0byBzZXQgYSBtaXggZnVuY3Rpb24gd2hlbiB3ZSdyZSBza2lwcGluZyBtaXhpbmcgKi8KKyAgICBpZiAoIWFtLT5pbl9tYXRyaXhfY2hhbm5lbHMgfHwgIWFtLT5vdXRfbWF0cml4X2NoYW5uZWxzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGFueS10by1hbnkgQyB2ZXJzaW9ucyAqLworCisgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX01JWF9DT0VGRl9UWVBFX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSwgMSwgIkMiLCBNSVhfRlVOQ19OQU1FKEZMVFAsIEZMVCkpOworCisgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX01JWF9DT0VGRl9UWVBFX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSwgMSwgIkMiLCBNSVhfRlVOQ19OQU1FKFMxNlAsIEZMVCkpOworCisgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX01JWF9DT0VGRl9UWVBFX1ExNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSwgMSwgIkMiLCBNSVhfRlVOQ19OQU1FKFMxNlAsIFExNSkpOworCisgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX01JWF9DT0VGRl9UWVBFX1E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxLCAxLCAiQyIsIE1JWF9GVU5DX05BTUUoUzE2UCwgUTgpKTsKKworICAgIC8qIGNoYW5uZWwtc3BlY2lmaWMgQyB2ZXJzaW9ucyAqLworCisgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX01JWF9DT0VGRl9UWVBFX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMSwgMSwgIkMiLCBtaXhfMl90b18xX2ZsdHBfZmx0X2MpOworCisgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX01JWF9DT0VGRl9UWVBFX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMSwgMSwgIkMiLCBtaXhfMl90b18xX3MxNnBfZmx0X2MpOworCisgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX01JWF9DT0VGRl9UWVBFX1E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAxLCAxLCAxLCAiQyIsIG1peF8yX3RvXzFfczE2cF9xOF9jKTsKKworICAgIGZmX2F1ZGlvX21peF9zZXRfZnVuYyhhbSwgQVZfU0FNUExFX0ZNVF9GTFRQLCBBVl9NSVhfQ09FRkZfVFlQRV9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDEsIDEsICJDIiwgbWl4XzFfdG9fMl9mbHRwX2ZsdF9jKTsKKworICAgIGZmX2F1ZGlvX21peF9zZXRfZnVuYyhhbSwgQVZfU0FNUExFX0ZNVF9GTFRQLCBBVl9NSVhfQ09FRkZfVFlQRV9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDIsIDEsIDEsICJDIiwgbWl4XzZfdG9fMl9mbHRwX2ZsdF9jKTsKKworICAgIGZmX2F1ZGlvX21peF9zZXRfZnVuYyhhbSwgQVZfU0FNUExFX0ZNVF9GTFRQLCBBVl9NSVhfQ09FRkZfVFlQRV9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDYsIDEsIDEsICJDIiwgbWl4XzJfdG9fNl9mbHRwX2ZsdF9jKTsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfYXVkaW9fbWl4X2luaXRfeDg2KGFtKTsKKworICAgIGlmICghYW0tPm1peCkgeworICAgICAgICBhdl9sb2coYW0tPmF2ciwgQVZfTE9HX0VSUk9SLCAiYXVkaW9fbWl4OiBOTyBGVU5DVElPTiBGT1VORDogW2ZtdD0lc10gIgorICAgICAgICAgICAgICAgIltjPSVzXSBbJWQgdG8gJWRdXG4iLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGFtLT5mbXQpLAorICAgICAgICAgICAgICAgY29lZmZfdHlwZV9uYW1lc1thbS0+Y29lZmZfdHlwZV0sIGFtLT5pbl9jaGFubmVscywKKyAgICAgICAgICAgICAgIGFtLT5vdXRfY2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitBdWRpb01peCAqZmZfYXVkaW9fbWl4X2FsbG9jKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2cikKK3sKKyAgICBBdWRpb01peCAqYW07CisgICAgaW50IHJldDsKKworICAgIGFtID0gYXZfbWFsbG9jeihzaXplb2YoKmFtKSk7CisgICAgaWYgKCFhbSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYW0tPmF2ciA9IGF2cjsKKworICAgIGlmIChhdnItPmludGVybmFsX3NhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9TMTZQICYmCisgICAgICAgIGF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdCAhPSBBVl9TQU1QTEVfRk1UX0ZMVFApIHsKKyAgICAgICAgYXZfbG9nKGF2ciwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgaW50ZXJuYWwgZm9ybWF0IGZvciAiCisgICAgICAgICAgICAgICAibWl4aW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUoYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10KSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgYW0tPmZtdCAgICAgICAgICA9IGF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdDsKKyAgICBhbS0+Y29lZmZfdHlwZSAgID0gYXZyLT5taXhfY29lZmZfdHlwZTsKKyAgICBhbS0+aW5fbGF5b3V0ICAgID0gYXZyLT5pbl9jaGFubmVsX2xheW91dDsKKyAgICBhbS0+b3V0X2xheW91dCAgID0gYXZyLT5vdXRfY2hhbm5lbF9sYXlvdXQ7CisgICAgYW0tPmluX2NoYW5uZWxzICA9IGF2ci0+aW5fY2hhbm5lbHM7CisgICAgYW0tPm91dF9jaGFubmVscyA9IGF2ci0+b3V0X2NoYW5uZWxzOworCisgICAgLyogYnVpbGQgbWF0cml4IGlmIHRoZSB1c2VyIGRpZCBub3QgYWxyZWFkeSBzZXQgb25lICovCisgICAgaWYgKGF2ci0+bWl4X21hdHJpeCkgeworICAgICAgICByZXQgPSBmZl9hdWRpb19taXhfc2V0X21hdHJpeChhbSwgYXZyLT5taXhfbWF0cml4LCBhdnItPmluX2NoYW5uZWxzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBhdl9mcmVlcCgmYXZyLT5taXhfbWF0cml4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBkb3VibGUgKm1hdHJpeF9kYmwgPSBhdl9tYWxsb2N6KGF2ci0+b3V0X2NoYW5uZWxzICogYXZyLT5pbl9jaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCptYXRyaXhfZGJsKSk7CisgICAgICAgIGlmICghbWF0cml4X2RibCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgcmV0ID0gYXZyZXNhbXBsZV9idWlsZF9tYXRyaXgoYXZyLT5pbl9jaGFubmVsX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZyLT5vdXRfY2hhbm5lbF9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ci0+Y2VudGVyX21peF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZyLT5zdXJyb3VuZF9taXhfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ci0+bGZlX21peF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZyLT5ub3JtYWxpemVfbWl4X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhfZGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPmluX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPm1hdHJpeF9lbmNvZGluZyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlKG1hdHJpeF9kYmwpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGZmX2F1ZGlvX21peF9zZXRfbWF0cml4KGFtLCBtYXRyaXhfZGJsLCBhdnItPmluX2NoYW5uZWxzKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdnIsIEFWX0xPR19FUlJPUiwgImVycm9yIHNldHRpbmcgbWl4IG1hdHJpeFxuIik7CisgICAgICAgICAgICBhdl9mcmVlKG1hdHJpeF9kYmwpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyZWUobWF0cml4X2RibCk7CisgICAgfQorCisgICAgcmV0dXJuIGFtOworCitlcnJvcjoKKyAgICBhdl9mcmVlKGFtKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBmZl9hdWRpb19taXhfZnJlZShBdWRpb01peCAqKmFtX3ApCit7CisgICAgQXVkaW9NaXggKmFtOworCisgICAgaWYgKCEqYW1fcCkKKyAgICAgICAgcmV0dXJuOworICAgIGFtID0gKmFtX3A7CisKKyAgICBpZiAoYW0tPm1hdHJpeCkgeworICAgICAgICBhdl9mcmVlKGFtLT5tYXRyaXhbMF0pOworICAgICAgICBhbS0+bWF0cml4ID0gTlVMTDsKKyAgICB9CisgICAgbWVtc2V0KGFtLT5tYXRyaXhfcTgsICAwLCBzaXplb2YoYW0tPm1hdHJpeF9xOCApKTsKKyAgICBtZW1zZXQoYW0tPm1hdHJpeF9xMTUsIDAsIHNpemVvZihhbS0+bWF0cml4X3ExNSkpOworICAgIG1lbXNldChhbS0+bWF0cml4X2ZsdCwgMCwgc2l6ZW9mKGFtLT5tYXRyaXhfZmx0KSk7CisKKyAgICBhdl9mcmVlcChhbV9wKTsKK30KKworaW50IGZmX2F1ZGlvX21peChBdWRpb01peCAqYW0sIEF1ZGlvRGF0YSAqc3JjKQoreworICAgIGludCB1c2VfZ2VuZXJpYyA9IDE7CisgICAgaW50IGxlbiA9IHNyYy0+bmJfc2FtcGxlczsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSB0aGUgb3B0aW1pemVkIGZ1bmN0aW9uIGJhc2VkIG9uIHBvaW50ZXIgYW5kCisgICAgICAgc2FtcGxlcyBhbGlnbm1lbnQgaW4gYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCAqLworICAgIGlmIChhbS0+aGFzX29wdGltaXplZF9mdW5jKSB7CisgICAgICAgIGludCBhbGlnbmVkX2xlbiA9IEZGQUxJR04obGVuLCBhbS0+c2FtcGxlc19hbGlnbik7CisgICAgICAgIGlmICghKHNyYy0+cHRyX2FsaWduICUgYW0tPnB0cl9hbGlnbikgJiYKKyAgICAgICAgICAgIHNyYy0+c2FtcGxlc19hbGlnbiA+PSBhbGlnbmVkX2xlbikgeworICAgICAgICAgICAgbGVuID0gYWxpZ25lZF9sZW47CisgICAgICAgICAgICB1c2VfZ2VuZXJpYyA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZGxvZyhhbS0+YXZyLCAiYXVkaW9fbWl4OiAlZCBzYW1wbGVzIC0gJWQgdG8gJWQgY2hhbm5lbHMgKCVzKVxuIiwKKyAgICAgICAgICAgIHNyYy0+bmJfc2FtcGxlcywgYW0tPmluX2NoYW5uZWxzLCBhbS0+b3V0X2NoYW5uZWxzLAorICAgICAgICAgICAgdXNlX2dlbmVyaWMgPyBhbS0+ZnVuY19kZXNjcl9nZW5lcmljIDogYW0tPmZ1bmNfZGVzY3IpOworCisgICAgaWYgKGFtLT5pbl9tYXRyaXhfY2hhbm5lbHMgJiYgYW0tPm91dF9tYXRyaXhfY2hhbm5lbHMpIHsKKyAgICAgICAgdWludDhfdCAqKmRhdGE7CisgICAgICAgIHVpbnQ4X3QgKmRhdGEwW0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXSA9IHsgTlVMTCB9OworCisgICAgICAgIGlmIChhbS0+b3V0X21hdHJpeF9jaGFubmVscyA8IGFtLT5vdXRfY2hhbm5lbHMgfHwKKyAgICAgICAgICAgICBhbS0+aW5fbWF0cml4X2NoYW5uZWxzIDwgIGFtLT5pbl9jaGFubmVscykgeworICAgICAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBGRk1BWChhbS0+aW5fY2hhbm5lbHMsIGFtLT5vdXRfY2hhbm5lbHMpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYW0tPmlucHV0X3NraXBbaV0gfHwgYW0tPm91dHB1dF9za2lwW2ldIHx8IGFtLT5vdXRwdXRfemVyb1tpXSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZGF0YTBbaisrXSA9IHNyYy0+ZGF0YVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEgPSBkYXRhMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEgPSBzcmMtPmRhdGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAodXNlX2dlbmVyaWMpCisgICAgICAgICAgICBhbS0+bWl4X2dlbmVyaWMoZGF0YSwgYW0tPm1hdHJpeCwgbGVuLCBhbS0+b3V0X21hdHJpeF9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbS0+aW5fbWF0cml4X2NoYW5uZWxzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYW0tPm1peChkYXRhLCBhbS0+bWF0cml4LCBsZW4sIGFtLT5vdXRfbWF0cml4X2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICBhbS0+aW5fbWF0cml4X2NoYW5uZWxzKTsKKyAgICB9CisKKyAgICBpZiAoYW0tPm91dF9tYXRyaXhfY2hhbm5lbHMgPCBhbS0+b3V0X2NoYW5uZWxzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhbS0+b3V0X2NoYW5uZWxzOyBpKyspCisgICAgICAgICAgICBpZiAoYW0tPm91dHB1dF96ZXJvW2ldKQorICAgICAgICAgICAgICAgIGF2X3NhbXBsZXNfc2V0X3NpbGVuY2UoJnNyYy0+ZGF0YVtpXSwgMCwgbGVuLCAxLCBhbS0+Zm10KTsKKyAgICB9CisKKyAgICBmZl9hdWRpb19kYXRhX3NldF9jaGFubmVscyhzcmMsIGFtLT5vdXRfY2hhbm5lbHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9hdWRpb19taXhfZ2V0X21hdHJpeChBdWRpb01peCAqYW0sIGRvdWJsZSAqbWF0cml4LCBpbnQgc3RyaWRlKQoreworICAgIGludCBpLCBvLCBpMCwgbzA7CisKKyAgICBpZiAoIGFtLT5pbl9jaGFubmVscyA8PSAwIHx8ICBhbS0+aW5fY2hhbm5lbHMgPiBBVlJFU0FNUExFX01BWF9DSEFOTkVMUyB8fAorICAgICAgICBhbS0+b3V0X2NoYW5uZWxzIDw9IDAgfHwgYW0tPm91dF9jaGFubmVscyA+IEFWUkVTQU1QTEVfTUFYX0NIQU5ORUxTKSB7CisgICAgICAgIGF2X2xvZyhhbS0+YXZyLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNoYW5uZWwgY291bnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyNkZWZpbmUgR0VUX01BVFJJWF9DT05WRVJUKHN1ZmZpeCwgc2NhbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFhbS0+bWF0cml4XyAjIyBzdWZmaXhbMF0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2coYW0tPmF2ciwgQVZfTE9HX0VSUk9SLCAibWF0cml4IGlzIG5vdCBzZXRcbiIpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAobyA9IDAsIG8wID0gMDsgbyA8IGFtLT5vdXRfY2hhbm5lbHM7IG8rKykgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMCwgaTAgPSAwOyBpIDwgYW0tPmluX2NoYW5uZWxzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoYW0tPmlucHV0X3NraXBbaV0gfHwgYW0tPm91dHB1dF96ZXJvW29dKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG1hdHJpeFtvICogc3RyaWRlICsgaV0gPSAwLjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbWF0cml4W28gKiBzdHJpZGUgKyBpXSA9IGFtLT5tYXRyaXhfICMjIHN1ZmZpeFtvMF1baTBdICogICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2NhbGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICghYW0tPmlucHV0X3NraXBbaV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaTArKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFhbS0+b3V0cHV0X3plcm9bb10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvMCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICAgIHN3aXRjaCAoYW0tPmNvZWZmX3R5cGUpIHsKKyAgICBjYXNlIEFWX01JWF9DT0VGRl9UWVBFX1E4OgorICAgICAgICBHRVRfTUFUUklYX0NPTlZFUlQocTgsIDEuMCAvIDI1Ni4wKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9NSVhfQ09FRkZfVFlQRV9RMTU6CisgICAgICAgIEdFVF9NQVRSSVhfQ09OVkVSVChxMTUsIDEuMCAvIDMyNzY4LjApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX01JWF9DT0VGRl9UWVBFX0ZMVDoKKyAgICAgICAgR0VUX01BVFJJWF9DT05WRVJUKGZsdCwgMS4wKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGFtLT5hdnIsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbWl4IGNvZWZmIHR5cGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZWR1Y2VfbWF0cml4KEF1ZGlvTWl4ICphbSwgY29uc3QgZG91YmxlICptYXRyaXgsIGludCBzdHJpZGUpCit7CisgICAgaW50IGksIG87CisKKyAgICBtZW1zZXQoYW0tPm91dHB1dF96ZXJvLCAwLCBzaXplb2YoYW0tPm91dHB1dF96ZXJvKSk7CisgICAgbWVtc2V0KGFtLT5pbnB1dF9za2lwLCAgMCwgc2l6ZW9mKGFtLT5pbnB1dF9za2lwKSk7CisgICAgbWVtc2V0KGFtLT5vdXRwdXRfc2tpcCwgMCwgc2l6ZW9mKGFtLT5vdXRwdXRfc2tpcCkpOworCisgICAgLyogZXhjbHVkZSBvdXRwdXQgY2hhbm5lbHMgaWYgdGhleSBjYW4gYmUgemVyb2VkIGluc3RlYWQgb2YgbWl4ZWQgKi8KKyAgICBmb3IgKG8gPSAwOyBvIDwgYW0tPm91dF9jaGFubmVsczsgbysrKSB7CisgICAgICAgIGludCB6ZXJvID0gMTsKKworICAgICAgICAvKiBjaGVjayBpZiB0aGUgb3V0cHV0IGlzIGFsd2F5cyBzaWxlbnQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFtLT5pbl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWF0cml4W28gKiBzdHJpZGUgKyBpXSAhPSAwLjApIHsKKyAgICAgICAgICAgICAgICB6ZXJvID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBjaGVjayBpZiB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCBjaGFubmVsIG1ha2VzIGEgY29udHJpYnV0aW9uIHRvCisgICAgICAgICAgIGFueSBvdXRwdXQgY2hhbm5lbCAqLworICAgICAgICBpZiAobyA8IGFtLT5pbl9jaGFubmVscykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFtLT5vdXRfY2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtYXRyaXhbaSAqIHN0cmlkZSArIG9dICE9IDAuMCkgeworICAgICAgICAgICAgICAgICAgICB6ZXJvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh6ZXJvKSB7CisgICAgICAgICAgICBhbS0+b3V0cHV0X3plcm9bb10gPSAxOworICAgICAgICAgICAgYW0tPm91dF9tYXRyaXhfY2hhbm5lbHMtLTsKKyAgICAgICAgICAgIGlmIChvIDwgYW0tPmluX2NoYW5uZWxzKQorICAgICAgICAgICAgICAgIGFtLT5pbl9tYXRyaXhfY2hhbm5lbHMtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYW0tPm91dF9tYXRyaXhfY2hhbm5lbHMgPT0gMCB8fCBhbS0+aW5fbWF0cml4X2NoYW5uZWxzID09IDApIHsKKyAgICAgICAgYW0tPm91dF9tYXRyaXhfY2hhbm5lbHMgPSAwOworICAgICAgICBhbS0+aW5fbWF0cml4X2NoYW5uZWxzID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHNraXAgaW5wdXQgY2hhbm5lbHMgdGhhdCBjb250cmlidXRlIGZ1bGx5IG9ubHkgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICBvdXRwdXQgY2hhbm5lbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBGRk1JTihhbS0+aW5fY2hhbm5lbHMsIGFtLT5vdXRfY2hhbm5lbHMpOyBpKyspIHsKKyAgICAgICAgaW50IHNraXAgPSAxOworCisgICAgICAgIGZvciAobyA9IDA7IG8gPCBhbS0+b3V0X2NoYW5uZWxzOyBvKyspIHsKKyAgICAgICAgICAgIGludCBpMDsKKyAgICAgICAgICAgIGlmICgobyAhPSBpICYmIG1hdHJpeFtvICogc3RyaWRlICsgaV0gIT0gMC4wKSB8fAorICAgICAgICAgICAgICAgIChvID09IGkgJiYgbWF0cml4W28gKiBzdHJpZGUgKyBpXSAhPSAxLjApKSB7CisgICAgICAgICAgICAgICAgc2tpcCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBpZiB0aGUgaW5wdXQgY29udHJpYnV0ZXMgZnVsbHkgdG8gdGhlIG91dHB1dCwgYWxzbyBjaGVjayB0aGF0IG5vCisgICAgICAgICAgICAgICBvdGhlciBpbnB1dHMgY29udHJpYnV0ZSB0byB0aGlzIG91dHB1dCAqLworICAgICAgICAgICAgaWYgKG8gPT0gaSkgeworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IGFtLT5pbl9jaGFubmVsczsgaTArKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaTAgIT0gaSAmJiBtYXRyaXhbbyAqIHN0cmlkZSArIGkwXSAhPSAwLjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNraXApIHsKKyAgICAgICAgICAgIGFtLT5pbnB1dF9za2lwW2ldID0gMTsKKyAgICAgICAgICAgIGFtLT5pbl9tYXRyaXhfY2hhbm5lbHMtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBza2lwIGlucHV0IGNoYW5uZWxzIHRoYXQgZG8gbm90IGNvbnRyaWJ1dGUgdG8gYW55IG91dHB1dCBjaGFubmVsICovCisgICAgZm9yICg7IGkgPCBhbS0+aW5fY2hhbm5lbHM7IGkrKykgeworICAgICAgICBpbnQgY29udHJpYiA9IDA7CisKKyAgICAgICAgZm9yIChvID0gMDsgbyA8IGFtLT5vdXRfY2hhbm5lbHM7IG8rKykgeworICAgICAgICAgICAgaWYgKG1hdHJpeFtvICogc3RyaWRlICsgaV0gIT0gMC4wKSB7CisgICAgICAgICAgICAgICAgY29udHJpYiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb250cmliKSB7CisgICAgICAgICAgICBhbS0+aW5wdXRfc2tpcFtpXSA9IDE7CisgICAgICAgICAgICBhbS0+aW5fbWF0cml4X2NoYW5uZWxzLS07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFtLT5pbl9tYXRyaXhfY2hhbm5lbHMgPT0gMCkgeworICAgICAgICBhbS0+b3V0X21hdHJpeF9jaGFubmVscyA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBza2lwIG91dHB1dCBjaGFubmVscyB0aGF0IG9ubHkgZ2V0IGZ1bGwgY29udHJpYnV0aW9uIGZyb20gdGhlCisgICAgICAgY29ycmVzcG9uZGluZyBpbnB1dCBjaGFubmVsICovCisgICAgZm9yIChvID0gMDsgbyA8IEZGTUlOKGFtLT5pbl9jaGFubmVscywgYW0tPm91dF9jaGFubmVscyk7IG8rKykgeworICAgICAgICBpbnQgc2tpcCA9IDE7CisgICAgICAgIGludCBvMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYW0tPmluX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgobyAhPSBpICYmIG1hdHJpeFtvICogc3RyaWRlICsgaV0gIT0gMC4wKSB8fAorICAgICAgICAgICAgICAgIChvID09IGkgJiYgbWF0cml4W28gKiBzdHJpZGUgKyBpXSAhPSAxLjApKSB7CisgICAgICAgICAgICAgICAgc2tpcCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgY2hhbm5lbCBtYWtlcyBhIGNvbnRyaWJ1dGlvbiB0bworICAgICAgICAgICBhbnkgb3RoZXIgb3V0cHV0IGNoYW5uZWwgKi8KKyAgICAgICAgaSA9IG87CisgICAgICAgIGZvciAobzAgPSAwOyBvMCA8IGFtLT5vdXRfY2hhbm5lbHM7IG8wKyspIHsKKyAgICAgICAgICAgIGlmIChvMCAhPSBpICYmIG1hdHJpeFtvMCAqIHN0cmlkZSArIGldICE9IDAuMCkgeworICAgICAgICAgICAgICAgIHNraXAgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChza2lwKSB7CisgICAgICAgICAgICBhbS0+b3V0cHV0X3NraXBbb10gPSAxOworICAgICAgICAgICAgYW0tPm91dF9tYXRyaXhfY2hhbm5lbHMtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYW0tPm91dF9tYXRyaXhfY2hhbm5lbHMgPT0gMCkgeworICAgICAgICBhbS0+aW5fbWF0cml4X2NoYW5uZWxzID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworaW50IGZmX2F1ZGlvX21peF9zZXRfbWF0cml4KEF1ZGlvTWl4ICphbSwgY29uc3QgZG91YmxlICptYXRyaXgsIGludCBzdHJpZGUpCit7CisgICAgaW50IGksIG8sIGkwLCBvMCwgcmV0OworICAgIGNoYXIgaW5fbGF5b3V0X25hbWVbMTI4XTsKKyAgICBjaGFyIG91dF9sYXlvdXRfbmFtZVsxMjhdOworCisgICAgaWYgKCBhbS0+aW5fY2hhbm5lbHMgPD0gMCB8fCAgYW0tPmluX2NoYW5uZWxzID4gQVZSRVNBTVBMRV9NQVhfQ0hBTk5FTFMgfHwKKyAgICAgICAgYW0tPm91dF9jaGFubmVscyA8PSAwIHx8IGFtLT5vdXRfY2hhbm5lbHMgPiBBVlJFU0FNUExFX01BWF9DSEFOTkVMUykgeworICAgICAgICBhdl9sb2coYW0tPmF2ciwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaGFubmVsIGNvdW50c1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGFtLT5tYXRyaXgpIHsKKyAgICAgICAgYXZfZnJlZShhbS0+bWF0cml4WzBdKTsKKyAgICAgICAgYW0tPm1hdHJpeCA9IE5VTEw7CisgICAgfQorCisgICAgYW0tPmluX21hdHJpeF9jaGFubmVscyAgPSBhbS0+aW5fY2hhbm5lbHM7CisgICAgYW0tPm91dF9tYXRyaXhfY2hhbm5lbHMgPSBhbS0+b3V0X2NoYW5uZWxzOworCisgICAgcmVkdWNlX21hdHJpeChhbSwgbWF0cml4LCBzdHJpZGUpOworCisjZGVmaW5lIENPTlZFUlRfTUFUUklYKHR5cGUsIGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFtLT5tYXRyaXhfIyMgdHlwZVswXSA9IGF2X21hbGxvY3ooYW0tPm91dF9tYXRyaXhfY2hhbm5lbHMgKiAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtLT5pbl9tYXRyaXhfY2hhbm5lbHMgICogICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmFtLT5tYXRyaXhfIyMgdHlwZVswXSkpOyAgICAgXAorICAgIGlmICghYW0tPm1hdHJpeF8jIyB0eXBlWzBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChvID0gMCwgbzAgPSAwOyBvIDwgYW0tPm91dF9jaGFubmVsczsgbysrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYW0tPm91dHB1dF96ZXJvW29dIHx8IGFtLT5vdXRwdXRfc2tpcFtvXSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChvMCA+IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYW0tPm1hdHJpeF8jIyB0eXBlW28wXSA9IGFtLT5tYXRyaXhfIyMgdHlwZVtvMCAtIDFdICsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbS0+aW5fbWF0cml4X2NoYW5uZWxzOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDAsIGkwID0gMDsgaSA8IGFtLT5pbl9jaGFubmVsczsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChhbS0+aW5wdXRfc2tpcFtpXSB8fCBhbS0+b3V0cHV0X3plcm9baV0pICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdiA9IG1hdHJpeFtvICogc3RyaWRlICsgaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFtLT5tYXRyaXhfIyMgdHlwZVtvMF1baTBdID0gZXhwcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpMCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbzArKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFtLT5tYXRyaXggPSAodm9pZCAqKilhbS0+bWF0cml4XyMjIHR5cGU7CisKKyAgICBpZiAoYW0tPmluX21hdHJpeF9jaGFubmVscyAmJiBhbS0+b3V0X21hdHJpeF9jaGFubmVscykgeworICAgICAgICBzd2l0Y2ggKGFtLT5jb2VmZl90eXBlKSB7CisgICAgICAgIGNhc2UgQVZfTUlYX0NPRUZGX1RZUEVfUTg6CisgICAgICAgICAgICBDT05WRVJUX01BVFJJWChxOCwgYXZfY2xpcF9pbnQxNihscmludCgyNTYuMCAqIHYpKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX01JWF9DT0VGRl9UWVBFX1ExNToKKyAgICAgICAgICAgIENPTlZFUlRfTUFUUklYKHExNSwgYXZfY2xpcGxfaW50MzIobGxyaW50KDMyNzY4LjAgKiB2KSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9NSVhfQ09FRkZfVFlQRV9GTFQ6CisgICAgICAgICAgICBDT05WRVJUX01BVFJJWChmbHQsIHYpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhbS0+YXZyLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG1peCBjb2VmZiB0eXBlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBtaXhfZnVuY3Rpb25faW5pdChhbSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGluX2xheW91dF9uYW1lLCBzaXplb2YoaW5fbGF5b3V0X25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW0tPmluX2NoYW5uZWxzLCBhbS0+aW5fbGF5b3V0KTsKKyAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKG91dF9sYXlvdXRfbmFtZSwgc2l6ZW9mKG91dF9sYXlvdXRfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbS0+b3V0X2NoYW5uZWxzLCBhbS0+b3V0X2xheW91dCk7CisgICAgYXZfbG9nKGFtLT5hdnIsIEFWX0xPR19ERUJVRywgImF1ZGlvX21peDogJXMgdG8gJXNcbiIsCisgICAgICAgICAgIGluX2xheW91dF9uYW1lLCBvdXRfbGF5b3V0X25hbWUpOworICAgIGF2X2xvZyhhbS0+YXZyLCBBVl9MT0dfREVCVUcsICJtYXRyaXggc2l6ZTogJWQgeCAlZFxuIiwKKyAgICAgICAgICAgYW0tPmluX21hdHJpeF9jaGFubmVscywgYW0tPm91dF9tYXRyaXhfY2hhbm5lbHMpOworICAgIGZvciAobyA9IDA7IG8gPCBhbS0+b3V0X2NoYW5uZWxzOyBvKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFtLT5pbl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYW0tPm91dHB1dF96ZXJvW29dKQorICAgICAgICAgICAgICAgIGF2X2xvZyhhbS0+YXZyLCBBVl9MT0dfREVCVUcsICIgIChaRVJPKSIpOworICAgICAgICAgICAgZWxzZSBpZiAoYW0tPmlucHV0X3NraXBbaV0gfHwgYW0tPm91dHB1dF96ZXJvW2ldIHx8IGFtLT5vdXRwdXRfc2tpcFtvXSkKKyAgICAgICAgICAgICAgICBhdl9sb2coYW0tPmF2ciwgQVZfTE9HX0RFQlVHLCAiICAoU0tJUCkiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdl9sb2coYW0tPmF2ciwgQVZfTE9HX0RFQlVHLCAiICAlMC4zZiAiLAorICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhbbyAqIGFtLT5pbl9jaGFubmVscyArIGldKTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coYW0tPmF2ciwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2F1ZGlvX21peC5oIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXVkaW9fbWl4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4N2QwZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2F1ZGlvX21peC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlJFU0FNUExFX0FVRElPX01JWF9ICisjZGVmaW5lIEFWUkVTQU1QTEVfQVVESU9fTUlYX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImF2cmVzYW1wbGUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF1ZGlvX2RhdGEuaCIKKwordHlwZWRlZiB2b2lkIChtaXhfZnVuYykodWludDhfdCAqKnNyYywgdm9pZCAqKm1hdHJpeCwgaW50IGxlbiwgaW50IG91dF9jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl9jaCk7CisKKy8qKgorICogU2V0IG1peGluZyBmdW5jdGlvbiBpZiB0aGUgcGFyYW1ldGVycyBtYXRjaC4KKyAqCisgKiBUaGlzIGNvbXBhcmVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtaXhpbmcgZnVuY3Rpb24gdG8gdGhlIHBhcmFtZXRlcnMgaW4gdGhlCisgKiBBdWRpb01peCBjb250ZXh0LiBJZiB0aGUgcGFyYW1ldGVycyBkbyBub3QgbWF0Y2gsIG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlCisgKiBhY3RpdmUgZnVuY3Rpb25zLiBJZiB0aGUgcGFyYW1ldGVycyBkbyBtYXRjaCBhbmQgdGhlIGFsaWdubWVudCBpcyBub3QKKyAqIGNvbnN0cmFpbmVkLCB0aGUgZnVuY3Rpb24gaXMgc2V0IGFzIHRoZSBnZW5lcmljIG1peGluZyBmdW5jdGlvbi4gSWYgdGhlCisgKiBwYXJhbWV0ZXJzIG1hdGNoIGFuZCB0aGUgYWxpZ25tZW50IGlzIGNvbnN0cmFpbmVkLCB0aGUgZnVuY3Rpb24gaXMgc2V0IGFzCisgKiB0aGUgb3B0aW1pemVkIG1peGluZyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gYW0gICAgICAgICAgICAgQXVkaW9NaXggY29udGV4dAorICogQHBhcmFtIGZtdCAgICAgICAgICAgIGlucHV0L291dHB1dCBzYW1wbGUgZm9ybWF0CisgKiBAcGFyYW0gY29lZmZfdHlwZSAgICAgbWl4aW5nIGNvZWZmaWNpZW50IHR5cGUKKyAqIEBwYXJhbSBpbl9jaGFubmVscyAgICBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMsIG9yIDAgZm9yIGFueSBudW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBwYXJhbSBvdXRfY2hhbm5lbHMgICBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLCBvciAwIGZvciBhbnkgbnVtYmVyIG9mIGNoYW5uZWxzCisgKiBAcGFyYW0gcHRyX2FsaWduICAgICAgYnVmZmVyIHBvaW50ZXIgYWxpZ25tZW50LCBpbiBieXRlcworICogQHBhcmFtIHNhbXBsZXNfYWxpZ24gIGJ1ZmZlciBzaXplIGFsaWdubWVudCwgaW4gc2FtcGxlcworICogQHBhcmFtIGRlc2NyICAgICAgICAgIGZ1bmN0aW9uIHR5cGUgZGVzY3JpcHRpb24gKGUuZy4gIkMiIG9yICJTU0UiKQorICogQHBhcmFtIG1peF9mdW5jICAgICAgIG1peGluZyBmdW5jdGlvbiBwb2ludGVyCisgKi8KK3ZvaWQgZmZfYXVkaW9fbWl4X3NldF9mdW5jKEF1ZGlvTWl4ICphbSwgZW51bSBBVlNhbXBsZUZvcm1hdCBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWTWl4Q29lZmZUeXBlIGNvZWZmX3R5cGUsIGludCBpbl9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfY2hhbm5lbHMsIGludCBwdHJfYWxpZ24sIGludCBzYW1wbGVzX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVzY3IsIHZvaWQgKm1peF9mdW5jKTsKKworLyoqCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBBdWRpb01peCBjb250ZXh0LgorICoKKyAqIFRoZSBwYXJhbWV0ZXJzIGluIHRoZSBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0IGFyZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlCisgKiBBdWRpb01peCBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBhdnIgIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQKKyAqIEByZXR1cm4gICAgIG5ld2x5LWFsbG9jYXRlZCBBdWRpb01peCBjb250ZXh0LgorICovCitBdWRpb01peCAqZmZfYXVkaW9fbWl4X2FsbG9jKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2cik7CisKKy8qKgorICogRnJlZSBhbiBBdWRpb01peCBjb250ZXh0LgorICovCit2b2lkIGZmX2F1ZGlvX21peF9mcmVlKEF1ZGlvTWl4ICoqYW0pOworCisvKioKKyAqIEFwcGx5IGNoYW5uZWwgbWl4aW5nIHRvIGF1ZGlvIGRhdGEgdXNpbmcgdGhlIGN1cnJlbnQgbWl4aW5nIG1hdHJpeC4KKyAqLworaW50IGZmX2F1ZGlvX21peChBdWRpb01peCAqYW0sIEF1ZGlvRGF0YSAqc3JjKTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgbWl4aW5nIG1hdHJpeC4KKyAqLworaW50IGZmX2F1ZGlvX21peF9nZXRfbWF0cml4KEF1ZGlvTWl4ICphbSwgZG91YmxlICptYXRyaXgsIGludCBzdHJpZGUpOworCisvKioKKyAqIFNldCB0aGUgY3VycmVudCBtaXhpbmcgbWF0cml4LgorICovCitpbnQgZmZfYXVkaW9fbWl4X3NldF9tYXRyaXgoQXVkaW9NaXggKmFtLCBjb25zdCBkb3VibGUgKm1hdHJpeCwgaW50IHN0cmlkZSk7CisKKy8qIGFyY2gtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICovCisKK3ZvaWQgZmZfYXVkaW9fbWl4X2luaXRfeDg2KEF1ZGlvTWl4ICphbSk7CisKKyNlbmRpZiAvKiBBVlJFU0FNUExFX0FVRElPX01JWF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9hdWRpb19taXhfbWF0cml4LmMgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hdWRpb19taXhfbWF0cml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5MjM1MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2F1ZGlvX21peF9tYXRyaXguYwpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBNaWNoYWVsIE5pZWRlcm1heWVyIChtaWNoYWVsbmlAZ214LmF0KQorICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJhdnJlc2FtcGxlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdWRpb19kYXRhLmgiCisjaW5jbHVkZSAiYXVkaW9fbWl4LmgiCisKKy8qIGNoYW5uZWwgcG9zaXRpb25zICovCisjZGVmaW5lIEZST05UX0xFRlQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRlJPTlRfUklHSFQgICAgICAgICAgICAgMQorI2RlZmluZSBGUk9OVF9DRU5URVIgICAgICAgICAgICAyCisjZGVmaW5lIExPV19GUkVRVUVOQ1kgICAgICAgICAgIDMKKyNkZWZpbmUgQkFDS19MRUZUICAgICAgICAgICAgICAgNAorI2RlZmluZSBCQUNLX1JJR0hUICAgICAgICAgICAgICA1CisjZGVmaW5lIEZST05UX0xFRlRfT0ZfQ0VOVEVSICAgIDYKKyNkZWZpbmUgRlJPTlRfUklHSFRfT0ZfQ0VOVEVSICAgNworI2RlZmluZSBCQUNLX0NFTlRFUiAgICAgICAgICAgICA4CisjZGVmaW5lIFNJREVfTEVGVCAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgU0lERV9SSUdIVCAgICAgICAgICAgICAxMAorI2RlZmluZSBUT1BfQ0VOVEVSICAgICAgICAgICAgIDExCisjZGVmaW5lIFRPUF9GUk9OVF9MRUZUICAgICAgICAgMTIKKyNkZWZpbmUgVE9QX0ZST05UX0NFTlRFUiAgICAgICAxMworI2RlZmluZSBUT1BfRlJPTlRfUklHSFQgICAgICAgIDE0CisjZGVmaW5lIFRPUF9CQUNLX0xFRlQgICAgICAgICAgMTUKKyNkZWZpbmUgVE9QX0JBQ0tfQ0VOVEVSICAgICAgICAxNgorI2RlZmluZSBUT1BfQkFDS19SSUdIVCAgICAgICAgIDE3CisjZGVmaW5lIFNURVJFT19MRUZUICAgICAgICAgICAgMjkKKyNkZWZpbmUgU1RFUkVPX1JJR0hUICAgICAgICAgICAzMAorI2RlZmluZSBXSURFX0xFRlQgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFdJREVfUklHSFQgICAgICAgICAgICAgMzIKKyNkZWZpbmUgU1VSUk9VTkRfRElSRUNUX0xFRlQgICAzMworI2RlZmluZSBTVVJST1VORF9ESVJFQ1RfUklHSFQgIDM0CisjZGVmaW5lIExPV19GUkVRVUVOQ1lfMiAgICAgICAgMzUKKworI2RlZmluZSBTUVJUM18yICAgICAgMS4yMjQ3NDQ4NzEzOTE1ODkwNDkwOSAgLyogc3FydCgzLzIpICovCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBldmVuKHVpbnQ2NF90IGxheW91dCkKK3sKKyAgICByZXR1cm4gKCFsYXlvdXQgfHwgISEobGF5b3V0ICYgKGxheW91dCAtIDEpKSk7Cit9CisKK3N0YXRpYyBpbnQgc2FuZV9sYXlvdXQodWludDY0X3QgbGF5b3V0KQoreworICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3QgMSBmcm9udCBzcGVha2VyICovCisgICAgaWYgKCEobGF5b3V0ICYgQVZfQ0hfTEFZT1VUX1NVUlJPVU5EKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayBmb3IgbGVmdC9yaWdodCBzeW1tZXRyeSAqLworICAgIGlmICghZXZlbihsYXlvdXQgJiAoQVZfQ0hfRlJPTlRfTEVGVCAgICAgICAgICAgfCBBVl9DSF9GUk9OVF9SSUdIVCkpICAgICAgICAgICB8fAorICAgICAgICAhZXZlbihsYXlvdXQgJiAoQVZfQ0hfU0lERV9MRUZUICAgICAgICAgICAgfCBBVl9DSF9TSURFX1JJR0hUKSkgICAgICAgICAgICB8fAorICAgICAgICAhZXZlbihsYXlvdXQgJiAoQVZfQ0hfQkFDS19MRUZUICAgICAgICAgICAgfCBBVl9DSF9CQUNLX1JJR0hUKSkgICAgICAgICAgICB8fAorICAgICAgICAhZXZlbihsYXlvdXQgJiAoQVZfQ0hfRlJPTlRfTEVGVF9PRl9DRU5URVIgfCBBVl9DSF9GUk9OVF9SSUdIVF9PRl9DRU5URVIpKSB8fAorICAgICAgICAhZXZlbihsYXlvdXQgJiAoQVZfQ0hfVE9QX0ZST05UX0xFRlQgICAgICAgfCBBVl9DSF9UT1BfRlJPTlRfUklHSFQpKSAgICAgICB8fAorICAgICAgICAhZXZlbihsYXlvdXQgJiAoQVZfQ0hfVE9QX0JBQ0tfTEVGVCAgICAgICAgfCBBVl9DSF9UT1BfQkFDS19SSUdIVCkpICAgICAgICB8fAorICAgICAgICAhZXZlbihsYXlvdXQgJiAoQVZfQ0hfU1RFUkVPX0xFRlQgICAgICAgICAgfCBBVl9DSF9TVEVSRU9fUklHSFQpKSAgICAgICAgICB8fAorICAgICAgICAhZXZlbihsYXlvdXQgJiAoQVZfQ0hfV0lERV9MRUZUICAgICAgICAgICAgfCBBVl9DSF9XSURFX1JJR0hUKSkgICAgICAgICAgICB8fAorICAgICAgICAhZXZlbihsYXlvdXQgJiAoQVZfQ0hfU1VSUk9VTkRfRElSRUNUX0xFRlQgfCBBVl9DSF9TVVJST1VORF9ESVJFQ1RfUklHSFQpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMTsKK30KKworaW50IGF2cmVzYW1wbGVfYnVpbGRfbWF0cml4KHVpbnQ2NF90IGluX2xheW91dCwgdWludDY0X3Qgb3V0X2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY2VudGVyX21peF9sZXZlbCwgZG91YmxlIHN1cnJvdW5kX21peF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGZlX21peF9sZXZlbCwgaW50IG5vcm1hbGl6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKm1hdHJpeF9vdXQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVk1hdHJpeEVuY29kaW5nIG1hdHJpeF9lbmNvZGluZykKK3sKKyAgICBpbnQgaSwgaiwgb3V0X2ksIG91dF9qOworICAgIGRvdWJsZSBtYXRyaXhbNjRdWzY0XSA9IHt7MH19OworICAgIGludDY0X3QgdW5hY2NvdW50ZWQ7CisgICAgZG91YmxlIG1heGNvZWYgPSAwOworICAgIGludCBpbl9jaGFubmVscywgb3V0X2NoYW5uZWxzOworCisgICAgaWYgKChvdXRfbGF5b3V0ICYgQVZfQ0hfTEFZT1VUX1NURVJFT19ET1dOTUlYKSA9PSBBVl9DSF9MQVlPVVRfU1RFUkVPX0RPV05NSVgpIHsKKyAgICAgICAgb3V0X2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgfQorCisgICAgdW5hY2NvdW50ZWQgPSBpbl9sYXlvdXQgJiB+b3V0X2xheW91dDsKKworICAgIGluX2NoYW5uZWxzICA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyggaW5fbGF5b3V0KTsKKyAgICBvdXRfY2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMob3V0X2xheW91dCk7CisKKyAgICBtZW1zZXQobWF0cml4X291dCwgMCwgb3V0X2NoYW5uZWxzICogc3RyaWRlICogc2l6ZW9mKCptYXRyaXhfb3V0KSk7CisKKyAgICAvKiBjaGVjayBpZiBsYXlvdXRzIGFyZSBzdXBwb3J0ZWQgKi8KKyAgICBpZiAoIWluX2xheW91dCB8fCBpbl9jaGFubmVscyA+IEFWUkVTQU1QTEVfTUFYX0NIQU5ORUxTKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGlmICghb3V0X2xheW91dCB8fCBvdXRfY2hhbm5lbHMgPiBBVlJFU0FNUExFX01BWF9DSEFOTkVMUykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIC8qIGNoZWNrIGlmIGxheW91dHMgYXJlIHVuYmFsYW5jZWQgb3IgYWJub3JtYWwgKi8KKyAgICBpZiAoIXNhbmVfbGF5b3V0KGluX2xheW91dCkgfHwgIXNhbmVfbGF5b3V0KG91dF9sYXlvdXQpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisKKyAgICAvKiByb3V0ZSBtYXRjaGluZyBpbnB1dC9vdXRwdXQgY2hhbm5lbHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBpZiAoaW5fbGF5b3V0ICYgb3V0X2xheW91dCAmICgxVUxMIDw8IGkpKQorICAgICAgICAgICAgbWF0cml4W2ldW2ldID0gMS4wOworICAgIH0KKworICAgIC8qIG1peCBmcm9udCBjZW50ZXIgdG8gZnJvbnQgbGVmdC9yaWdodCAqLworICAgIGlmICh1bmFjY291bnRlZCAmIEFWX0NIX0ZST05UX0NFTlRFUikgeworICAgICAgICBpZiAoKG91dF9sYXlvdXQgJiBBVl9DSF9MQVlPVVRfU1RFUkVPKSA9PSBBVl9DSF9MQVlPVVRfU1RFUkVPKSB7CisgICAgICAgICAgICBpZiAoKGluX2xheW91dCAmIEFWX0NIX0xBWU9VVF9TVEVSRU8pID09IEFWX0NIX0xBWU9VVF9TVEVSRU8pIHsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW0ZST05UX0NFTlRFUl0gKz0gY2VudGVyX21peF9sZXZlbDsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0ZST05UX0NFTlRFUl0gKz0gY2VudGVyX21peF9sZXZlbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtGUk9OVF9DRU5URVJdICs9IE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0ZST05UX0NFTlRFUl0gKz0gTV9TUVJUMV8yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgLyogbWl4IGZyb250IGxlZnQvcmlnaHQgdG8gY2VudGVyICovCisgICAgaWYgKHVuYWNjb3VudGVkICYgQVZfQ0hfTEFZT1VUX1NURVJFTykgeworICAgICAgICBpZiAob3V0X2xheW91dCAmIEFWX0NIX0ZST05UX0NFTlRFUikgeworICAgICAgICAgICAgbWF0cml4W0ZST05UX0NFTlRFUl1bRlJPTlRfTEVGVCBdICs9IE1fU1FSVDFfMjsKKyAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9DRU5URVJdW0ZST05UX1JJR0hUXSArPSBNX1NRUlQxXzI7CisgICAgICAgICAgICAvKiBtaXggbGVmdC9yaWdodC9jZW50ZXIgdG8gY2VudGVyICovCisgICAgICAgICAgICBpZiAoaW5fbGF5b3V0ICYgQVZfQ0hfRlJPTlRfQ0VOVEVSKQorICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9DRU5URVJdW0ZST05UX0NFTlRFUl0gPSBjZW50ZXJfbWl4X2xldmVsICogTV9TUVJUMjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIC8qIG1peCBiYWNrIGNlbnRlciB0byBiYWNrLCBzaWRlLCBvciBmcm9udCAqLworICAgIGlmICh1bmFjY291bnRlZCAmIEFWX0NIX0JBQ0tfQ0VOVEVSKSB7CisgICAgICAgIGlmIChvdXRfbGF5b3V0ICYgQVZfQ0hfQkFDS19MRUZUKSB7CisgICAgICAgICAgICBtYXRyaXhbQkFDS19MRUZUIF1bQkFDS19DRU5URVJdICs9IE1fU1FSVDFfMjsKKyAgICAgICAgICAgIG1hdHJpeFtCQUNLX1JJR0hUXVtCQUNLX0NFTlRFUl0gKz0gTV9TUVJUMV8yOworICAgICAgICB9IGVsc2UgaWYgKG91dF9sYXlvdXQgJiBBVl9DSF9TSURFX0xFRlQpIHsKKyAgICAgICAgICAgIG1hdHJpeFtTSURFX0xFRlQgXVtCQUNLX0NFTlRFUl0gKz0gTV9TUVJUMV8yOworICAgICAgICAgICAgbWF0cml4W1NJREVfUklHSFRdW0JBQ0tfQ0VOVEVSXSArPSBNX1NRUlQxXzI7CisgICAgICAgIH0gZWxzZSBpZiAob3V0X2xheW91dCAmIEFWX0NIX0ZST05UX0xFRlQpIHsKKyAgICAgICAgICAgIGlmIChtYXRyaXhfZW5jb2RpbmcgPT0gQVZfTUFUUklYX0VOQ09ESU5HX0RPTEJZIHx8CisgICAgICAgICAgICAgICAgbWF0cml4X2VuY29kaW5nID09IEFWX01BVFJJWF9FTkNPRElOR19EUExJSSkgeworICAgICAgICAgICAgICAgIGlmICh1bmFjY291bnRlZCAmIChBVl9DSF9CQUNLX0xFRlQgfCBBVl9DSF9TSURFX0xFRlQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19DRU5URVJdIC09IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX0NFTlRFUl0gKz0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19DRU5URVJdIC09IHN1cnJvdW5kX21peF9sZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX0NFTlRFUl0gKz0gc3Vycm91bmRfbWl4X2xldmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtCQUNLX0NFTlRFUl0gKz0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19DRU5URVJdICs9IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChvdXRfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfQ0VOVEVSKSB7CisgICAgICAgICAgICBtYXRyaXhbRlJPTlRfQ0VOVEVSXVtCQUNLX0NFTlRFUl0gKz0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgLyogbWl4IGJhY2sgbGVmdC9yaWdodCB0byBiYWNrIGNlbnRlciwgc2lkZSwgb3IgZnJvbnQgKi8KKyAgICBpZiAodW5hY2NvdW50ZWQgJiBBVl9DSF9CQUNLX0xFRlQpIHsKKyAgICAgICAgaWYgKG91dF9sYXlvdXQgJiBBVl9DSF9CQUNLX0NFTlRFUikgeworICAgICAgICAgICAgbWF0cml4W0JBQ0tfQ0VOVEVSXVtCQUNLX0xFRlQgXSArPSBNX1NRUlQxXzI7CisgICAgICAgICAgICBtYXRyaXhbQkFDS19DRU5URVJdW0JBQ0tfUklHSFRdICs9IE1fU1FSVDFfMjsKKyAgICAgICAgfSBlbHNlIGlmIChvdXRfbGF5b3V0ICYgQVZfQ0hfU0lERV9MRUZUKSB7CisgICAgICAgICAgICAvKiBpZiBzaWRlIGNoYW5uZWxzIGRvIG5vdCBleGlzdCBpbiB0aGUgaW5wdXQsIGp1c3QgY29weSBiYWNrCisgICAgICAgICAgICAgICBjaGFubmVscyB0byBzaWRlIGNoYW5uZWxzLCBvdGhlcndpc2UgbWl4IGJhY2sgaW50byBzaWRlICovCisgICAgICAgICAgICBpZiAoaW5fbGF5b3V0ICYgQVZfQ0hfU0lERV9MRUZUKSB7CisgICAgICAgICAgICAgICAgbWF0cml4W1NJREVfTEVGVCBdW0JBQ0tfTEVGVCBdICs9IE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbU0lERV9SSUdIVF1bQkFDS19SSUdIVF0gKz0gTV9TUVJUMV8yOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXRyaXhbU0lERV9MRUZUIF1bQkFDS19MRUZUIF0gKz0gMS4wOworICAgICAgICAgICAgICAgIG1hdHJpeFtTSURFX1JJR0hUXVtCQUNLX1JJR0hUXSArPSAxLjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAob3V0X2xheW91dCAmIEFWX0NIX0ZST05UX0xFRlQpIHsKKyAgICAgICAgICAgIGlmIChtYXRyaXhfZW5jb2RpbmcgPT0gQVZfTUFUUklYX0VOQ09ESU5HX0RPTEJZKSB7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtCQUNLX0xFRlQgXSAtPSBzdXJyb3VuZF9taXhfbGV2ZWwgKiBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtCQUNLX1JJR0hUXSAtPSBzdXJyb3VuZF9taXhfbGV2ZWwgKiBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX0xFRlQgXSArPSBzdXJyb3VuZF9taXhfbGV2ZWwgKiBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX1JJR0hUXSArPSBzdXJyb3VuZF9taXhfbGV2ZWwgKiBNX1NRUlQxXzI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdHJpeF9lbmNvZGluZyA9PSBBVl9NQVRSSVhfRU5DT0RJTkdfRFBMSUkpIHsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW0JBQ0tfTEVGVCBdIC09IHN1cnJvdW5kX21peF9sZXZlbCAqIFNRUlQzXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtCQUNLX1JJR0hUXSAtPSBzdXJyb3VuZF9taXhfbGV2ZWwgKiBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX0xFRlQgXSArPSBzdXJyb3VuZF9taXhfbGV2ZWwgKiBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX1JJR0hUXSArPSBzdXJyb3VuZF9taXhfbGV2ZWwgKiBTUVJUM18yOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW0JBQ0tfTEVGVCBdICs9IHN1cnJvdW5kX21peF9sZXZlbDsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0JBQ0tfUklHSFRdICs9IHN1cnJvdW5kX21peF9sZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChvdXRfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfQ0VOVEVSKSB7CisgICAgICAgICAgICBtYXRyaXhbRlJPTlRfQ0VOVEVSXVtCQUNLX0xFRlQgXSArPSBzdXJyb3VuZF9taXhfbGV2ZWwgKiBNX1NRUlQxXzI7CisgICAgICAgICAgICBtYXRyaXhbRlJPTlRfQ0VOVEVSXVtCQUNLX1JJR0hUXSArPSBzdXJyb3VuZF9taXhfbGV2ZWwgKiBNX1NRUlQxXzI7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICAvKiBtaXggc2lkZSBsZWZ0L3JpZ2h0IGludG8gYmFjayBvciBmcm9udCAqLworICAgIGlmICh1bmFjY291bnRlZCAmIEFWX0NIX1NJREVfTEVGVCkgeworICAgICAgICBpZiAob3V0X2xheW91dCAmIEFWX0NIX0JBQ0tfTEVGVCkgeworICAgICAgICAgICAgLyogaWYgYmFjayBjaGFubmVscyBkbyBub3QgZXhpc3QgaW4gdGhlIGlucHV0LCBqdXN0IGNvcHkgc2lkZQorICAgICAgICAgICAgICAgY2hhbm5lbHMgdG8gYmFjayBjaGFubmVscywgb3RoZXJ3aXNlIG1peCBzaWRlIGludG8gYmFjayAqLworICAgICAgICAgICAgaWYgKGluX2xheW91dCAmIEFWX0NIX0JBQ0tfTEVGVCkgeworICAgICAgICAgICAgICAgIG1hdHJpeFtCQUNLX0xFRlQgXVtTSURFX0xFRlQgXSArPSBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0JBQ0tfUklHSFRdW1NJREVfUklHSFRdICs9IE1fU1FSVDFfMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWF0cml4W0JBQ0tfTEVGVCBdW1NJREVfTEVGVCBdICs9IDEuMDsKKyAgICAgICAgICAgICAgICBtYXRyaXhbQkFDS19SSUdIVF1bU0lERV9SSUdIVF0gKz0gMS4wOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG91dF9sYXlvdXQgJiBBVl9DSF9CQUNLX0NFTlRFUikgeworICAgICAgICAgICAgbWF0cml4W0JBQ0tfQ0VOVEVSXVtTSURFX0xFRlQgXSArPSBNX1NRUlQxXzI7CisgICAgICAgICAgICBtYXRyaXhbQkFDS19DRU5URVJdW1NJREVfUklHSFRdICs9IE1fU1FSVDFfMjsKKyAgICAgICAgfSBlbHNlIGlmIChvdXRfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfTEVGVCkgeworICAgICAgICAgICAgaWYgKG1hdHJpeF9lbmNvZGluZyA9PSBBVl9NQVRSSVhfRU5DT0RJTkdfRE9MQlkpIHsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW1NJREVfTEVGVCBdIC09IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW1NJREVfUklHSFRdIC09IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW1NJREVfTEVGVCBdICs9IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW1NJREVfUklHSFRdICs9IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0cml4X2VuY29kaW5nID09IEFWX01BVFJJWF9FTkNPRElOR19EUExJSSkgeworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bU0lERV9MRUZUIF0gLT0gc3Vycm91bmRfbWl4X2xldmVsICogU1FSVDNfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW1NJREVfUklHSFRdIC09IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW1NJREVfTEVGVCBdICs9IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW1NJREVfUklHSFRdICs9IHN1cnJvdW5kX21peF9sZXZlbCAqIFNRUlQzXzI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bU0lERV9MRUZUIF0gKz0gc3Vycm91bmRfbWl4X2xldmVsOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bU0lERV9SSUdIVF0gKz0gc3Vycm91bmRfbWl4X2xldmVsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG91dF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9DRU5URVIpIHsKKyAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9DRU5URVJdW1NJREVfTEVGVCBdICs9IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9DRU5URVJdW1NJREVfUklHSFRdICs9IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIC8qIG1peCBsZWZ0LW9mLWNlbnRlci9yaWdodC1vZi1jZW50ZXIgaW50byBmcm9udCBsZWZ0L3JpZ2h0IG9yIGNlbnRlciAqLworICAgIGlmICh1bmFjY291bnRlZCAmIEFWX0NIX0ZST05UX0xFRlRfT0ZfQ0VOVEVSKSB7CisgICAgICAgIGlmIChvdXRfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfTEVGVCkgeworICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtGUk9OVF9MRUZUX09GX0NFTlRFUiBdICs9IDEuMDsKKyAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bRlJPTlRfUklHSFRfT0ZfQ0VOVEVSXSArPSAxLjA7CisgICAgICAgIH0gZWxzZSBpZiAob3V0X2xheW91dCAmIEFWX0NIX0ZST05UX0NFTlRFUikgeworICAgICAgICAgICAgbWF0cml4W0ZST05UX0NFTlRFUl1bRlJPTlRfTEVGVF9PRl9DRU5URVIgXSArPSBNX1NRUlQxXzI7CisgICAgICAgICAgICBtYXRyaXhbRlJPTlRfQ0VOVEVSXVtGUk9OVF9SSUdIVF9PRl9DRU5URVJdICs9IE1fU1FSVDFfMjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIC8qIG1peCBMRkUgaW50byBmcm9udCBsZWZ0L3JpZ2h0IG9yIGNlbnRlciAqLworICAgIGlmICh1bmFjY291bnRlZCAmIEFWX0NIX0xPV19GUkVRVUVOQ1kpIHsKKyAgICAgICAgaWYgKG91dF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9DRU5URVIpIHsKKyAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9DRU5URVJdW0xPV19GUkVRVUVOQ1ldICs9IGxmZV9taXhfbGV2ZWw7CisgICAgICAgIH0gZWxzZSBpZiAob3V0X2xheW91dCAmIEFWX0NIX0ZST05UX0xFRlQpIHsKKyAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bTE9XX0ZSRVFVRU5DWV0gKz0gbGZlX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bTE9XX0ZSRVFVRU5DWV0gKz0gbGZlX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgLyogdHJhbnNmZXIgaW50ZXJuYWwgbWF0cml4IHRvIG91dHB1dCBtYXRyaXggYW5kIGNhbGN1bGF0ZSBtYXhpbXVtCisgICAgICAgcGVyLWNoYW5uZWwgY29lZmZpY2llbnQgc3VtICovCisgICAgZm9yIChvdXRfaSA9IGkgPSAwOyBvdXRfaSA8IG91dF9jaGFubmVscyAmJiBpIDwgNjQ7IGkrKykgeworICAgICAgICBkb3VibGUgc3VtID0gMDsKKyAgICAgICAgZm9yIChvdXRfaiA9IGogPSAwOyBvdXRfaiA8IGluX2NoYW5uZWxzICYmIGogPCA2NDsgaisrKSB7CisgICAgICAgICAgICBtYXRyaXhfb3V0W291dF9pICogc3RyaWRlICsgb3V0X2pdID0gbWF0cml4W2ldW2pdOworICAgICAgICAgICAgc3VtICs9IGZhYnMobWF0cml4W2ldW2pdKTsKKyAgICAgICAgICAgIGlmIChpbl9sYXlvdXQgJiAoMVVMTCA8PCBqKSkKKyAgICAgICAgICAgICAgICBvdXRfaisrOworICAgICAgICB9CisgICAgICAgIG1heGNvZWYgPSBGRk1BWChtYXhjb2VmLCBzdW0pOworICAgICAgICBpZiAob3V0X2xheW91dCAmICgxVUxMIDw8IGkpKQorICAgICAgICAgICAgb3V0X2krKzsKKyAgICB9CisKKyAgICAvKiBub3JtYWxpemUgKi8KKyAgICBpZiAobm9ybWFsaXplICYmIG1heGNvZWYgPiAxLjApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dF9jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGluX2NoYW5uZWxzOyBqKyspCisgICAgICAgICAgICAgICAgbWF0cml4X291dFtpICogc3RyaWRlICsgal0gLz0gbWF4Y29lZjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2F2cmVzYW1wbGUtdGVzdC5jIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZS10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwYWU5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2F2cmVzYW1wbGUtdGVzdC5jCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJhdnJlc2FtcGxlLmgiCisKK3N0YXRpYyBkb3VibGUgZGJsX3JhbmQoQVZMRkcgKmxmZykKK3sKKyAgICByZXR1cm4gMi4wICogKGF2X2xmZ19nZXQobGZnKSAvIChkb3VibGUpVUlOVF9NQVgpIC0gMS4wOworfQorCisjZGVmaW5lIFBVVF9GVU5DKG5hbWUsIGZtdCwgdHlwZSwgZXhwcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgcHV0X3NhbXBsZV8gIyMgbmFtZSh2b2lkICoqZGF0YSwgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBpbnQgc2FtcGxlLCBpbnQgY2gsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2X2RibCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlIHYgPSBleHByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSAqKm91dCA9ICh0eXBlICoqKWRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihzYW1wbGVfZm10KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb3V0W2NoXVtzYW1wbGVdID0gdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvdXRbMF1bc2FtcGxlICogY2hhbm5lbHMgKyBjaF0gPSB2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworUFVUX0ZVTkModTgsICBBVl9TQU1QTEVfRk1UX1U4LCAgdWludDhfdCwgYXZfY2xpcF91aW50OCAoIGxyaW50KHZfZGJsICogKDEgIDw8ICA3KSkgKyAxMjgpKQorUFVUX0ZVTkMoczE2LCBBVl9TQU1QTEVfRk1UX1MxNiwgaW50MTZfdCwgYXZfY2xpcF9pbnQxNiAoIGxyaW50KHZfZGJsICogKDEgIDw8IDE1KSkpKQorUFVUX0ZVTkMoczMyLCBBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgYXZfY2xpcGxfaW50MzIobGxyaW50KHZfZGJsICogKDFVIDw8IDMxKSkpKQorUFVUX0ZVTkMoZmx0LCBBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQsICAgdl9kYmwpCitQVVRfRlVOQyhkYmwsIEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUsICB2X2RibCkKKworc3RhdGljIHZvaWQgcHV0X3NhbXBsZSh2b2lkICoqZGF0YSwgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGludCBzYW1wbGUsIGludCBjaCwgZG91YmxlIHZfZGJsKQoreworICAgIHN3aXRjaCAoYXZfZ2V0X3BhY2tlZF9zYW1wbGVfZm10KHNhbXBsZV9mbXQpKSB7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1U4OgorICAgICAgICBwdXRfc2FtcGxlX3U4KGRhdGEsIHNhbXBsZV9mbXQsIGNoYW5uZWxzLCBzYW1wbGUsIGNoLCB2X2RibCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6CisgICAgICAgIHB1dF9zYW1wbGVfczE2KGRhdGEsIHNhbXBsZV9mbXQsIGNoYW5uZWxzLCBzYW1wbGUsIGNoLCB2X2RibCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzI6CisgICAgICAgIHB1dF9zYW1wbGVfczMyKGRhdGEsIHNhbXBsZV9mbXQsIGNoYW5uZWxzLCBzYW1wbGUsIGNoLCB2X2RibCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFQ6CisgICAgICAgIHB1dF9zYW1wbGVfZmx0KGRhdGEsIHNhbXBsZV9mbXQsIGNoYW5uZWxzLCBzYW1wbGUsIGNoLCB2X2RibCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkw6CisgICAgICAgIHB1dF9zYW1wbGVfZGJsKGRhdGEsIHNhbXBsZV9mbXQsIGNoYW5uZWxzLCBzYW1wbGUsIGNoLCB2X2RibCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYXVkaW9nZW4oQVZMRkcgKnJuZCwgdm9pZCAqKmRhdGEsIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywgaW50IHNhbXBsZV9yYXRlLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgY2gsIGs7CisgICAgZG91YmxlIHYsIGYsIGEsIGFtcGE7CisgICAgZG91YmxlIHRhYmYxW0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsKKyAgICBkb3VibGUgdGFiZjJbQVZSRVNBTVBMRV9NQVhfQ0hBTk5FTFNdOworICAgIGRvdWJsZSB0YWJhW0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsKKworI2RlZmluZSBQVVRfU0FNUExFIHB1dF9zYW1wbGUoZGF0YSwgc2FtcGxlX2ZtdCwgY2hhbm5lbHMsIGssIGNoLCB2KTsKKworICAgIGsgPSAwOworCisgICAgLyogMSBzZWNvbmQgb2Ygc2luZ2xlIGZyZXEgc2luZSBhdCAxMDAwIEh6ICovCisgICAgYSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDEgKiBzYW1wbGVfcmF0ZSAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKKyAgICAgICAgdiA9IHNpbihhKSAqIDAuMzA7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgUFVUX1NBTVBMRQorICAgICAgICBhICs9IE1fUEkgKiAxMDAwLjAgKiAyLjAgLyBzYW1wbGVfcmF0ZTsKKyAgICB9CisKKyAgICAvKiAxIHNlY29uZCBvZiB2YXJ5aW5nIGZyZXF1ZW5jeSBiZXR3ZWVuIDEwMCBhbmQgMTAwMDAgSHogKi8KKyAgICBhID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMSAqIHNhbXBsZV9yYXRlICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgeworICAgICAgICB2ID0gc2luKGEpICogMC4zMDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBQVVRfU0FNUExFCisgICAgICAgIGYgID0gMTAwLjAgKyAoKCgxMDAwMC4wIC0gMTAwLjApICogaSkgLyBzYW1wbGVfcmF0ZSk7CisgICAgICAgIGEgKz0gTV9QSSAqIGYgKiAyLjAgLyBzYW1wbGVfcmF0ZTsKKyAgICB9CisKKyAgICAvKiAwLjUgc2Vjb25kIG9mIGxvdyBhbXBsaXR1ZGUgd2hpdGUgbm9pc2UgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlX3JhdGUgLyAyICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgeworICAgICAgICB2ID0gZGJsX3JhbmQocm5kKSAqIDAuMzA7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgUFVUX1NBTVBMRQorICAgIH0KKworICAgIC8qIDAuNSBzZWNvbmQgb2YgaGlnaCBhbXBsaXR1ZGUgd2hpdGUgbm9pc2UgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlX3JhdGUgLyAyICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgeworICAgICAgICB2ID0gZGJsX3JhbmQocm5kKTsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBQVVRfU0FNUExFCisgICAgfQorCisgICAgLyogMSBzZWNvbmQgb2YgdW5yZWxhdGVkIHJhbXBzIGZvciBlYWNoIGNoYW5uZWwgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICB0YWJhW2NoXSAgPSAwOworICAgICAgICB0YWJmMVtjaF0gPSAxMDAgKyBhdl9sZmdfZ2V0KHJuZCkgJSA1MDAwOworICAgICAgICB0YWJmMltjaF0gPSAxMDAgKyBhdl9sZmdfZ2V0KHJuZCkgJSA1MDAwOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMSAqIHNhbXBsZV9yYXRlICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgdiA9IHNpbih0YWJhW2NoXSkgKiAwLjMwOworICAgICAgICAgICAgUFVUX1NBTVBMRQorICAgICAgICAgICAgZiA9IHRhYmYxW2NoXSArICgoKHRhYmYyW2NoXSAtIHRhYmYxW2NoXSkgKiBpKSAvIHNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIHRhYmFbY2hdICs9IE1fUEkgKiBmICogMi4wIC8gc2FtcGxlX3JhdGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAyIHNlY29uZHMgb2YgNTAwIEh6IHdpdGggdmFyeWluZyB2b2x1bWUgKi8KKyAgICBhICAgID0gMDsKKyAgICBhbXBhID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMiAqIHNhbXBsZV9yYXRlICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgZG91YmxlIGFtcCA9ICgxLjAgKyBzaW4oYW1wYSkpICogMC4xNTsKKyAgICAgICAgICAgIGlmIChjaCAmIDEpCisgICAgICAgICAgICAgICAgYW1wID0gMC4zMCAtIGFtcDsKKyAgICAgICAgICAgIHYgPSBzaW4oYSkgKiBhbXA7CisgICAgICAgICAgICBQVVRfU0FNUExFCisgICAgICAgICAgICBhICAgICs9IE1fUEkgKiA1MDAuMCAqIDIuMCAvIHNhbXBsZV9yYXRlOworICAgICAgICAgICAgYW1wYSArPSBNX1BJICogIDIuMCAvIHNhbXBsZV9yYXRlOworICAgICAgICB9CisgICAgfQorfQorCisvKiBmb3JtYXRzLCByYXRlcywgYW5kIGxheW91dHMgYXJlIG9yZGVyZWQgZm9yIHByaW9yaXR5IGluIHRlc3RpbmcuCisgICBlLmcuICdhdnJlc2FtcGxlLXRlc3QgNCAyIDInIHdpbGwgdGVzdCBhbGwgaW5wdXQvb3V0cHV0IGNvbWJpbmF0aW9ucyBvZgorICAgUzE2L0ZMVFAvUzE2UC9GTFQsIDQ4MDAwLzQ0MTAwLCBhbmQgc3RlcmVvL21vbm8gKi8KKworc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgZm9ybWF0c1tdID0geworICAgIEFWX1NBTVBMRV9GTVRfUzE2LAorICAgIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgQVZfU0FNUExFX0ZNVF9TMzJQLAorICAgIEFWX1NBTVBMRV9GTVRfUzMyLAorICAgIEFWX1NBTVBMRV9GTVRfVThQLAorICAgIEFWX1NBTVBMRV9GTVRfVTgsCisgICAgQVZfU0FNUExFX0ZNVF9EQkxQLAorICAgIEFWX1NBTVBMRV9GTVRfREJMLAorfTsKKworc3RhdGljIGNvbnN0IGludCByYXRlc1tdID0geworICAgIDQ4MDAwLAorICAgIDQ0MTAwLAorICAgIDE2MDAwCit9OworCitzdGF0aWMgY29uc3QgdWludDY0X3QgbGF5b3V0c1tdID0geworICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgQVZfQ0hfTEFZT1VUX01PTk8sCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDEsCisgICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDEsCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqczsKKyAgICBBVkxGRyBybmQ7CisgICAgaW50IHJldCA9IDA7CisgICAgdWludDhfdCAqaW5fYnVmID0gTlVMTDsKKyAgICB1aW50OF90ICpvdXRfYnVmID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpbnQgaW5fYnVmX3NpemU7CisgICAgdW5zaWduZWQgaW50IG91dF9idWZfc2l6ZTsKKyAgICB1aW50OF90ICAqaW5fZGF0YVtBVlJFU0FNUExFX01BWF9DSEFOTkVMU10gPSB7IDAgfTsKKyAgICB1aW50OF90ICpvdXRfZGF0YVtBVlJFU0FNUExFX01BWF9DSEFOTkVMU10gPSB7IDAgfTsKKyAgICBpbnQgaW5fbGluZXNpemU7CisgICAgaW50IG91dF9saW5lc2l6ZTsKKyAgICB1aW50NjRfdCBpbl9jaF9sYXlvdXQ7CisgICAgaW50IGluX2NoYW5uZWxzOworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW5fZm10OworICAgIGludCBpbl9yYXRlOworICAgIHVpbnQ2NF90IG91dF9jaF9sYXlvdXQ7CisgICAgaW50IG91dF9jaGFubmVsczsKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IG91dF9mbXQ7CisgICAgaW50IG91dF9yYXRlOworICAgIGludCBudW1fZm9ybWF0cywgbnVtX3JhdGVzLCBudW1fbGF5b3V0czsKKyAgICBpbnQgaSwgaiwgaywgbCwgbSwgbjsKKworICAgIG51bV9mb3JtYXRzID0gMjsKKyAgICBudW1fcmF0ZXMgICA9IDI7CisgICAgbnVtX2xheW91dHMgPSAyOworICAgIGlmIChhcmdjID4gMSkgeworICAgICAgICBpZiAoIWF2X3N0cm5jYXNlY21wKGFyZ3ZbMV0sICItaCIsIDMpKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJVc2FnZTogYXZyZXNhbXBsZS10ZXN0IFs8bnVtIGZvcm1hdHM+ICIKKyAgICAgICAgICAgICAgICAgICAiWzxudW0gc2FtcGxlIHJhdGVzPiBbPG51bSBjaGFubmVsIGxheW91dHM+XV1dXG4iCisgICAgICAgICAgICAgICAgICAgIkRlZmF1bHQgaXMgMiAyIDJcbiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgbnVtX2Zvcm1hdHMgPSBzdHJ0b2woYXJndlsxXSwgTlVMTCwgMCk7CisgICAgICAgIG51bV9mb3JtYXRzID0gYXZfY2xpcChudW1fZm9ybWF0cywgMSwgRkZfQVJSQVlfRUxFTVMoZm9ybWF0cykpOworICAgIH0KKyAgICBpZiAoYXJnYyA+IDIpIHsKKyAgICAgICAgbnVtX3JhdGVzID0gc3RydG9sKGFyZ3ZbMl0sIE5VTEwsIDApOworICAgICAgICBudW1fcmF0ZXMgPSBhdl9jbGlwKG51bV9yYXRlcywgMSwgRkZfQVJSQVlfRUxFTVMocmF0ZXMpKTsKKyAgICB9CisgICAgaWYgKGFyZ2MgPiAzKSB7CisgICAgICAgIG51bV9sYXlvdXRzID0gc3RydG9sKGFyZ3ZbM10sIE5VTEwsIDApOworICAgICAgICBudW1fbGF5b3V0cyA9IGF2X2NsaXAobnVtX2xheW91dHMsIDEsIEZGX0FSUkFZX0VMRU1TKGxheW91dHMpKTsKKyAgICB9CisKKyAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7CisKKyAgICBhdl9sZmdfaW5pdCgmcm5kLCAweEMwRkZFRSk7CisKKyAgICBpbl9idWZfc2l6ZSA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKCZpbl9saW5lc2l6ZSwgOCwgNDgwMDAgKiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkxQLCAwKTsKKyAgICBvdXRfYnVmX3NpemUgPSBpbl9idWZfc2l6ZTsKKworICAgIGluX2J1ZiA9IGF2X21hbGxvYyhpbl9idWZfc2l6ZSk7CisgICAgaWYgKCFpbl9idWYpCisgICAgICAgIGdvdG8gZW5kOworICAgIG91dF9idWYgPSBhdl9tYWxsb2Mob3V0X2J1Zl9zaXplKTsKKyAgICBpZiAoIW91dF9idWYpCisgICAgICAgIGdvdG8gZW5kOworCisgICAgcyA9IGF2cmVzYW1wbGVfYWxsb2NfY29udGV4dCgpOworICAgIGlmICghcykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYWxsb2NhdGluZyBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0XG4iKTsKKyAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9mb3JtYXRzOyBpKyspIHsKKyAgICAgICAgaW5fZm10ID0gZm9ybWF0c1tpXTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG51bV9sYXlvdXRzOyBrKyspIHsKKyAgICAgICAgICAgIGluX2NoX2xheW91dCA9IGxheW91dHNba107CisgICAgICAgICAgICBpbl9jaGFubmVscyAgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoaW5fY2hfbGF5b3V0KTsKKyAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCBudW1fcmF0ZXM7IG0rKykgeworICAgICAgICAgICAgICAgIGluX3JhdGUgPSByYXRlc1ttXTsKKworICAgICAgICAgICAgICAgIHJldCA9IGF2X3NhbXBsZXNfZmlsbF9hcnJheXMoaW5fZGF0YSwgJmluX2xpbmVzaXplLCBpbl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9jaGFubmVscywgaW5fcmF0ZSAqIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9mbXQsIDApOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJmYWlsZWQgaW5fZGF0YSBmaWxsIGFycmF5c1xuIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdWRpb2dlbigmcm5kLCAodm9pZCAqKilpbl9kYXRhLCBpbl9mbXQsIGluX2NoYW5uZWxzLCBpbl9yYXRlLCBpbl9yYXRlICogNik7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX2Zvcm1hdHM7IGorKykgeworICAgICAgICAgICAgICAgICAgICBvdXRfZm10ID0gZm9ybWF0c1tqXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IG51bV9sYXlvdXRzOyBsKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dF9jaF9sYXlvdXQgPSBsYXlvdXRzW2xdOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2NoYW5uZWxzICA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhvdXRfY2hfbGF5b3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBudW1fcmF0ZXM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9yYXRlID0gcmF0ZXNbbl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlcyB0byAlcywgJWQgdG8gJWQgY2hhbm5lbHMsICVkIEh6IHRvICVkIEh6XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGluX2ZtdCksIGF2X2dldF9zYW1wbGVfZm10X25hbWUob3V0X2ZtdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2NoYW5uZWxzLCBvdXRfY2hhbm5lbHMsIGluX3JhdGUsIG91dF9yYXRlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2X3NhbXBsZXNfZmlsbF9hcnJheXMob3V0X2RhdGEsICZvdXRfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfYnVmLCBvdXRfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcmF0ZSAqIDYsIG91dF9mbXQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJmYWlsZWQgb3V0X2RhdGEgZmlsbCBhcnJheXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9vcHRfc2V0X2ludChzLCAiaW5fY2hhbm5lbF9sYXlvdXQiLCAgaW5fY2hfbGF5b3V0LCAgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQocywgImluX3NhbXBsZV9mbXQiLCAgICAgIGluX2ZtdCwgICAgICAgIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KHMsICJpbl9zYW1wbGVfcmF0ZSIsICAgICBpbl9yYXRlLCAgICAgICAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9vcHRfc2V0X2ludChzLCAib3V0X2NoYW5uZWxfbGF5b3V0Iiwgb3V0X2NoX2xheW91dCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQocywgIm91dF9zYW1wbGVfZm10IiwgICAgIG91dF9mbXQsICAgICAgIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KHMsICJvdXRfc2FtcGxlX3JhdGUiLCAgICBvdXRfcmF0ZSwgICAgICAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KHMsICJpbnRlcm5hbF9zYW1wbGVfZm10IiwgQVZfU0FNUExFX0ZNVF9GTFRQLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2cmVzYW1wbGVfb3BlbihzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3Igb3BlbmluZyBjb250ZXh0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZyZXNhbXBsZV9jb252ZXJ0KHMsIG91dF9kYXRhLCBvdXRfbGluZXNpemUsIG91dF9yYXRlICogNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2RhdGEsICBpbl9saW5lc2l6ZSwgIGluX3JhdGUgKiA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGVycmJ1ZlsyNTZdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9zdHJlcnJvcihyZXQsIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJXNcbiIsIGVycmJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJDb252ZXJ0ZWQgJWQgc2FtcGxlcyB0byAlZCBzYW1wbGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9yYXRlICogNiwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXZyZXNhbXBsZV9nZXRfZGVsYXkocykgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlZCBkZWxheSBzYW1wbGVzIG5vdCBjb252ZXJ0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnJlc2FtcGxlX2dldF9kZWxheShzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF2cmVzYW1wbGVfYXZhaWxhYmxlKHMpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJWQgc2FtcGxlcyBhdmFpbGFibGUgZm9yIG91dHB1dFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cmVzYW1wbGVfYXZhaWxhYmxlKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJcbiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZyZXNhbXBsZV9jbG9zZShzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IDA7CisKK2VuZDoKKyAgICBhdl9mcmVlcCgmaW5fYnVmKTsKKyAgICBhdl9mcmVlcCgmb3V0X2J1Zik7CisgICAgYXZyZXNhbXBsZV9mcmVlKCZzKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZS5oIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYjU1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9hdnJlc2FtcGxlLmgKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlJFU0FNUExFX0FWUkVTQU1QTEVfSAorI2RlZmluZSBBVlJFU0FNUExFX0FWUkVTQU1QTEVfSAorCisvKioKKyAqIEBmaWxlCisgKiBAaW5ncm91cCBsYXZyCisgKiBleHRlcm5hbCBBUEkgaGVhZGVyCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2ciBMaWJhdnJlc2FtcGxlCisgKiBAeworICoKKyAqIExpYmF2cmVzYW1wbGUgKGxhdnIpIGlzIGEgbGlicmFyeSB0aGF0IGhhbmRsZXMgYXVkaW8gcmVzYW1wbGluZywgc2FtcGxlCisgKiBmb3JtYXQgY29udmVyc2lvbiBhbmQgbWl4aW5nLgorICoKKyAqIEludGVyYWN0aW9uIHdpdGggbGF2ciBpcyBkb25lIHRocm91Z2ggQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCwgd2hpY2ggaXMKKyAqIGFsbG9jYXRlZCB3aXRoIGF2cmVzYW1wbGVfYWxsb2NfY29udGV4dCgpLiBJdCBpcyBvcGFxdWUsIHNvIGFsbCBwYXJhbWV0ZXJzCisgKiBtdXN0IGJlIHNldCB3aXRoIHRoZSBAcmVmIGF2b3B0aW9ucyBBUEkuCisgKgorICogRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgc2V0dXAgY29udmVyc2lvbiBmcm9tIHBsYW5hciBmbG9hdCBzYW1wbGUKKyAqIGZvcm1hdCB0byBpbnRlcmxlYXZlZCBzaWduZWQgMTYtYml0IGludGVnZXIsIGRvd25zYW1wbGluZyBmcm9tIDQ4a0h6IHRvCisgKiA0NC4xa0h6IGFuZCBkb3dubWl4aW5nIGZyb20gNS4xIGNoYW5uZWxzIHRvIHN0ZXJlbyAodXNpbmcgdGhlIGRlZmF1bHQgbWl4aW5nCisgKiBtYXRyaXgpOgorICogQGNvZGUKKyAqIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciA9IGF2cmVzYW1wbGVfYWxsb2NfY29udGV4dCgpOworICogYXZfb3B0X3NldF9pbnQoYXZyLCAiaW5fY2hhbm5lbF9sYXlvdXQiLCAgQVZfQ0hfTEFZT1VUXzVQT0lOVDEsIDApOworICogYXZfb3B0X3NldF9pbnQoYXZyLCAib3V0X2NoYW5uZWxfbGF5b3V0IiwgQVZfQ0hfTEFZT1VUX1NURVJFTywgIDApOworICogYXZfb3B0X3NldF9pbnQoYXZyLCAiaW5fc2FtcGxlX3JhdGUiLCAgICAgNDgwMDAsICAgICAgICAgICAgICAgIDApOworICogYXZfb3B0X3NldF9pbnQoYXZyLCAib3V0X3NhbXBsZV9yYXRlIiwgICAgNDQxMDAsICAgICAgICAgICAgICAgIDApOworICogYXZfb3B0X3NldF9pbnQoYXZyLCAiaW5fc2FtcGxlX2ZtdCIsICAgICAgQVZfU0FNUExFX0ZNVF9GTFRQLCAgIDApOworICogYXZfb3B0X3NldF9pbnQoYXZyLCAib3V0X3NhbXBsZV9mbXQiLCAgICAgQVZfU0FNUExFX0ZNVF9TMTYsICAgIDApOworICogQGVuZGNvZGUKKyAqCisgKiBPbmNlIHRoZSBjb250ZXh0IGlzIGluaXRpYWxpemVkLCBpdCBtdXN0IGJlIG9wZW5lZCB3aXRoIGF2cmVzYW1wbGVfb3BlbigpLiBJZgorICogeW91IG5lZWQgdG8gY2hhbmdlIHRoZSBjb252ZXJzaW9uIHBhcmFtZXRlcnMsIHlvdSBtdXN0IGNsb3NlIHRoZSBjb250ZXh0IHdpdGgKKyAqIGF2cmVzYW1wbGVfY2xvc2UoKSwgY2hhbmdlIHRoZSBwYXJhbWV0ZXJzIGFzIGRlc2NyaWJlZCBhYm92ZSwgdGhlbiByZW9wZW4gaXQKKyAqIGFnYWluLgorICoKKyAqIFRoZSBjb252ZXJzaW9uIGl0c2VsZiBpcyBkb25lIGJ5IHJlcGVhdGVkbHkgY2FsbGluZyBhdnJlc2FtcGxlX2NvbnZlcnQoKS4KKyAqIE5vdGUgdGhhdCB0aGUgc2FtcGxlcyBtYXkgZ2V0IGJ1ZmZlcmVkIGluIHR3byBwbGFjZXMgaW4gbGF2ci4gVGhlIGZpcnN0IG9uZQorICogaXMgdGhlIG91dHB1dCBGSUZPLCB3aGVyZSB0aGUgc2FtcGxlcyBlbmQgdXAgaWYgdGhlIG91dHB1dCBidWZmZXIgaXMgbm90CisgKiBsYXJnZSBlbm91Z2guIFRoZSBkYXRhIHN0b3JlZCBpbiB0aGVyZSBtYXkgYmUgcmV0cmlldmVkIGF0IGFueSB0aW1lIHdpdGgKKyAqIGF2cmVzYW1wbGVfcmVhZCgpLiBUaGUgc2Vjb25kIHBsYWNlIGlzIHRoZSByZXNhbXBsaW5nIGRlbGF5IGJ1ZmZlciwKKyAqIGFwcGxpY2FibGUgb25seSB3aGVuIHJlc2FtcGxpbmcgaXMgZG9uZS4gVGhlIHNhbXBsZXMgaW4gaXQgcmVxdWlyZSBtb3JlIGlucHV0CisgKiBiZWZvcmUgdGhleSBjYW4gYmUgcHJvY2Vzc2VkLiBUaGVpciBjdXJyZW50IGFtb3VudCBpcyByZXR1cm5lZCBieQorICogYXZyZXNhbXBsZV9nZXRfZGVsYXkoKS4gQXQgdGhlIGVuZCBvZiBjb252ZXJzaW9uIHRoZSByZXNhbXBsaW5nIGJ1ZmZlciBjYW4gYmUKKyAqIGZsdXNoZWQgYnkgY2FsbGluZyBhdnJlc2FtcGxlX2NvbnZlcnQoKSB3aXRoIE5VTEwgaW5wdXQuCisgKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGRlbW9uc3RyYXRlcyB0aGUgY29udmVyc2lvbiBsb29wIGFzc3VtaW5nIHRoZSBwYXJhbWV0ZXJzCisgKiBmcm9tIGFib3ZlIGFuZCBjYWxsZXItZGVmaW5lZCBmdW5jdGlvbnMgZ2V0X2lucHV0KCkgYW5kIGhhbmRsZV9vdXRwdXQoKToKKyAqIEBjb2RlCisgKiB1aW50OF90ICoqaW5wdXQ7CisgKiBpbnQgaW5fbGluZXNpemUsIGluX3NhbXBsZXM7CisgKgorICogd2hpbGUgKGdldF9pbnB1dCgmaW5wdXQsICZpbl9saW5lc2l6ZSwgJmluX3NhbXBsZXMpKSB7CisgKiAgICAgdWludDhfdCAqb3V0cHV0CisgKiAgICAgaW50IG91dF9saW5lc2l6ZTsKKyAqICAgICBpbnQgb3V0X3NhbXBsZXMgPSBhdnJlc2FtcGxlX2dldF9vdXRfc2FtcGxlcyhhdnIsIGluX3NhbXBsZXMpOworICoKKyAqICAgICBhdl9zYW1wbGVzX2FsbG9jKCZvdXRwdXQsICZvdXRfbGluZXNpemUsIDIsIG91dF9zYW1wbGVzLAorICogICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsIDApOworICogICAgIG91dF9zYW1wbGVzID0gYXZyZXNhbXBsZV9jb252ZXJ0KGF2ciwgJm91dHB1dCwgb3V0X2xpbmVzaXplLCBvdXRfc2FtcGxlcywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgaW5fbGluZXNpemUsIGluX3NhbXBsZXMpOworICogICAgIGhhbmRsZV9vdXRwdXQob3V0cHV0LCBvdXRfbGluZXNpemUsIG91dF9zYW1wbGVzKTsKKyAqICAgICBhdl9mcmVlcCgmb3V0cHV0KTsKKyAqICB9CisgKiAgQGVuZGNvZGUKKyAqCisgKiAgV2hlbiB0aGUgY29udmVyc2lvbiBpcyBmaW5pc2hlZCBhbmQgdGhlIEZJRk9zIGFyZSBmbHVzaGVkIGlmIHJlcXVpcmVkLCB0aGUKKyAqICBjb252ZXJzaW9uIGNvbnRleHQgYW5kIGV2ZXJ5dGhpbmcgYXNzb2NpYXRlZCB3aXRoIGl0IG11c3QgYmUgZnJlZWQgd2l0aAorICogIGF2cmVzYW1wbGVfZnJlZSgpLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisKKyNpbmNsdWRlICJsaWJhdnJlc2FtcGxlL3ZlcnNpb24uaCIKKworI2RlZmluZSBBVlJFU0FNUExFX01BWF9DSEFOTkVMUyAzMgorCit0eXBlZGVmIHN0cnVjdCBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0IEFWQXVkaW9SZXNhbXBsZUNvbnRleHQ7CisKKy8qKiBNaXhpbmcgQ29lZmZpY2llbnQgVHlwZXMgKi8KK2VudW0gQVZNaXhDb2VmZlR5cGUgeworICAgIEFWX01JWF9DT0VGRl9UWVBFX1E4LCAgIC8qKiAxNi1iaXQgOC44IGZpeGVkLXBvaW50ICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQVZfTUlYX0NPRUZGX1RZUEVfUTE1LCAgLyoqIDMyLWJpdCAxNy4xNSBmaXhlZC1wb2ludCAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBBVl9NSVhfQ09FRkZfVFlQRV9GTFQsICAvKiogZmxvYXRpbmctcG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEFWX01JWF9DT0VGRl9UWVBFX05CLCAgIC8qKiBOdW1iZXIgb2YgY29lZmYgdHlwZXMuIE5vdCBwYXJ0IG9mIEFCSSAgICAgICovCit9OworCisvKiogUmVzYW1wbGluZyBGaWx0ZXIgVHlwZXMgKi8KK2VudW0gQVZSZXNhbXBsZUZpbHRlclR5cGUgeworICAgIEFWX1JFU0FNUExFX0ZJTFRFUl9UWVBFX0NVQklDLCAgICAgICAgICAgICAgLyoqPCBDdWJpYyAqLworICAgIEFWX1JFU0FNUExFX0ZJTFRFUl9UWVBFX0JMQUNLTUFOX05VVFRBTEwsICAgLyoqPCBCbGFja21hbiBOdXR0YWxsIFdpbmRvd2VkIFNpbmMgKi8KKyAgICBBVl9SRVNBTVBMRV9GSUxURVJfVFlQRV9LQUlTRVIsICAgICAgICAgICAgIC8qKjwgS2Fpc2VyIFdpbmRvd2VkIFNpbmMgKi8KK307CisKK2VudW0gQVZSZXNhbXBsZURpdGhlck1ldGhvZCB7CisgICAgQVZfUkVTQU1QTEVfRElUSEVSX05PTkUsICAgICAgICAgICAgLyoqPCBEbyBub3QgdXNlIGRpdGhlcmluZyAqLworICAgIEFWX1JFU0FNUExFX0RJVEhFUl9SRUNUQU5HVUxBUiwgICAgIC8qKjwgUmVjdGFuZ3VsYXIgRGl0aGVyICovCisgICAgQVZfUkVTQU1QTEVfRElUSEVSX1RSSUFOR1VMQVIsICAgICAgLyoqPCBUcmlhbmd1bGFyIERpdGhlciovCisgICAgQVZfUkVTQU1QTEVfRElUSEVSX1RSSUFOR1VMQVJfSFAsICAgLyoqPCBUcmlhbmd1bGFyIERpdGhlciB3aXRoIEhpZ2ggUGFzcyAqLworICAgIEFWX1JFU0FNUExFX0RJVEhFUl9UUklBTkdVTEFSX05TLCAgIC8qKjwgVHJpYW5ndWxhciBEaXRoZXIgd2l0aCBOb2lzZSBTaGFwaW5nICovCisgICAgQVZfUkVTQU1QTEVfRElUSEVSX05CLCAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZGl0aGVyIHR5cGVzLiBOb3QgcGFydCBvZiBBQkkuICovCit9OworCisvKioKKyAqIFJldHVybiB0aGUgTElCQVZSRVNBTVBMRV9WRVJTSU9OX0lOVCBjb25zdGFudC4KKyAqLwordW5zaWduZWQgYXZyZXNhbXBsZV92ZXJzaW9uKHZvaWQpOworCisvKioKKyAqIFJldHVybiB0aGUgbGliYXZyZXNhbXBsZSBidWlsZC10aW1lIGNvbmZpZ3VyYXRpb24uCisgKiBAcmV0dXJuICBjb25maWd1cmUgc3RyaW5nCisgKi8KK2NvbnN0IGNoYXIgKmF2cmVzYW1wbGVfY29uZmlndXJhdGlvbih2b2lkKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGxpYmF2cmVzYW1wbGUgbGljZW5zZS4KKyAqLworY29uc3QgY2hhciAqYXZyZXNhbXBsZV9saWNlbnNlKHZvaWQpOworCisvKioKKyAqIEdldCB0aGUgQVZDbGFzcyBmb3IgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dC4KKyAqCisgKiBDYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkogZm9yIGV4YW1pbmluZyBvcHRpb25zCisgKiB3aXRob3V0IGFsbG9jYXRpbmcgYSBjb250ZXh0LgorICoKKyAqIEBzZWUgYXZfb3B0X2ZpbmQoKS4KKyAqCisgKiBAcmV0dXJuIEFWQ2xhc3MgZm9yIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQKKyAqLworY29uc3QgQVZDbGFzcyAqYXZyZXNhbXBsZV9nZXRfY2xhc3Modm9pZCk7CisKKy8qKgorICogQWxsb2NhdGUgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCBhbmQgc2V0IG9wdGlvbnMuCisgKgorICogQHJldHVybiAgYWxsb2NhdGVkIGF1ZGlvIHJlc2FtcGxlIGNvbnRleHQsIG9yIE5VTEwgb24gZmFpbHVyZQorICovCitBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnJlc2FtcGxlX2FsbG9jX2NvbnRleHQodm9pZCk7CisKKy8qKgorICogSW5pdGlhbGl6ZSBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0LgorICogQG5vdGUgVGhlIGNvbnRleHQgbXVzdCBiZSBjb25maWd1cmVkIHVzaW5nIHRoZSBBVk9wdGlvbiBBUEkuCisgKgorICogQHNlZSBhdl9vcHRfc2V0X2ludCgpCisgKiBAc2VlIGF2X29wdF9zZXRfZGljdCgpCisgKgorICogQHBhcmFtIGF2ciAgYXVkaW8gcmVzYW1wbGUgY29udGV4dAorICogQHJldHVybiAgICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgYXZyZXNhbXBsZV9vcGVuKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2cik7CisKKy8qKgorICogQ2hlY2sgd2hldGhlciBhbiBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0IGlzIG9wZW4gb3IgY2xvc2VkLgorICoKKyAqIEBwYXJhbSBhdnIgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCB0byBjaGVjaworICogQHJldHVybiAxIGlmIGF2ciBpcyBvcGVuLCAwIGlmIGF2ciBpcyBjbG9zZWQuCisgKi8KK2ludCBhdnJlc2FtcGxlX2lzX29wZW4oQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyKTsKKworLyoqCisgKiBDbG9zZSBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0LgorICoKKyAqIFRoaXMgY2xvc2VzIHRoZSBjb250ZXh0LCBidXQgaXQgZG9lcyBub3QgY2hhbmdlIHRoZSBwYXJhbWV0ZXJzLiBUaGUgY29udGV4dAorICogY2FuIGJlIHJlb3BlbmVkIHdpdGggYXZyZXNhbXBsZV9vcGVuKCkuIEl0IGRvZXMsIGhvd2V2ZXIsIGNsZWFyIHRoZSBvdXRwdXQKKyAqIEZJRk8gYW5kIGFueSByZW1haW5pbmcgbGVmdG92ZXIgc2FtcGxlcyBpbiB0aGUgcmVzYW1wbGluZyBkZWxheSBidWZmZXIuIElmCisgKiB0aGVyZSB3YXMgYSBjdXN0b20gbWF0cml4IGJlaW5nIHVzZWQsIHRoYXQgaXMgYWxzbyBjbGVhcmVkLgorICoKKyAqIEBzZWUgYXZyZXNhbXBsZV9jb252ZXJ0KCkKKyAqIEBzZWUgYXZyZXNhbXBsZV9zZXRfbWF0cml4KCkKKyAqCisgKiBAcGFyYW0gYXZyICBhdWRpbyByZXNhbXBsZSBjb250ZXh0CisgKi8KK3ZvaWQgYXZyZXNhbXBsZV9jbG9zZShBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIpOworCisvKioKKyAqIEZyZWUgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCBhbmQgYXNzb2NpYXRlZCBBVk9wdGlvbiB2YWx1ZXMuCisgKgorICogVGhpcyBhbHNvIGNhbGxzIGF2cmVzYW1wbGVfY2xvc2UoKSBiZWZvcmUgZnJlZWluZy4KKyAqCisgKiBAcGFyYW0gYXZyICBhdWRpbyByZXNhbXBsZSBjb250ZXh0CisgKi8KK3ZvaWQgYXZyZXNhbXBsZV9mcmVlKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKiphdnIpOworCisvKioKKyAqIEdlbmVyYXRlIGEgY2hhbm5lbCBtaXhpbmcgbWF0cml4LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9uZSB1c2VkIGludGVybmFsbHkgYnkgbGliYXZyZXNhbXBsZSBmb3IgYnVpbGRpbmcgdGhlCisgKiBkZWZhdWx0IG1peGluZyBtYXRyaXguIEl0IGlzIG1hZGUgcHVibGljIGp1c3QgYXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvcgorICogYnVpbGRpbmcgY3VzdG9tIG1hdHJpY2VzLgorICoKKyAqIEBwYXJhbSBpbl9sYXlvdXQgICAgICAgICAgIGlucHV0IGNoYW5uZWwgbGF5b3V0CisgKiBAcGFyYW0gb3V0X2xheW91dCAgICAgICAgICBvdXRwdXQgY2hhbm5lbCBsYXlvdXQKKyAqIEBwYXJhbSBjZW50ZXJfbWl4X2xldmVsICAgIG1peCBsZXZlbCBmb3IgdGhlIGNlbnRlciBjaGFubmVsCisgKiBAcGFyYW0gc3Vycm91bmRfbWl4X2xldmVsICBtaXggbGV2ZWwgZm9yIHRoZSBzdXJyb3VuZCBjaGFubmVsKHMpCisgKiBAcGFyYW0gbGZlX21peF9sZXZlbCAgICAgICBtaXggbGV2ZWwgZm9yIHRoZSBsb3ctZnJlcXVlbmN5IGVmZmVjdHMgY2hhbm5lbAorICogQHBhcmFtIG5vcm1hbGl6ZSAgICAgICAgICAgaWYgMSwgY29lZmZpY2llbnRzIHdpbGwgYmUgbm9ybWFsaXplZCB0byBwcmV2ZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy4gaWYgMCwgY29lZmZpY2llbnRzIHdpbGwgbm90IGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkLgorICogQHBhcmFtW291dF0gbWF0cml4ICAgICAgICAgbWl4aW5nIGNvZWZmaWNpZW50czsgbWF0cml4W2kgKyBzdHJpZGUgKiBvXSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdlaWdodCBvZiBpbnB1dCBjaGFubmVsIGkgaW4gb3V0cHV0IGNoYW5uZWwgby4KKyAqIEBwYXJhbSBzdHJpZGUgICAgICAgICAgICAgIGRpc3RhbmNlIGJldHdlZW4gYWRqYWNlbnQgaW5wdXQgY2hhbm5lbHMgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXggYXJyYXkKKyAqIEBwYXJhbSBtYXRyaXhfZW5jb2RpbmcgICAgIG1hdHJpeGVkIHN0ZXJlbyBkb3dubWl4IG1vZGUgKGUuZy4gZHBsaWkpCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBhdnJlc2FtcGxlX2J1aWxkX21hdHJpeCh1aW50NjRfdCBpbl9sYXlvdXQsIHVpbnQ2NF90IG91dF9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNlbnRlcl9taXhfbGV2ZWwsIGRvdWJsZSBzdXJyb3VuZF9taXhfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxmZV9taXhfbGV2ZWwsIGludCBub3JtYWxpemUsIGRvdWJsZSAqbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGVudW0gQVZNYXRyaXhFbmNvZGluZyBtYXRyaXhfZW5jb2RpbmcpOworCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBjaGFubmVsIG1peGluZyBtYXRyaXguCisgKgorICogSWYgbm8gY3VzdG9tIG1hdHJpeCBoYXMgYmVlbiBwcmV2aW91c2x5IHNldCBvciB0aGUgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCBpcworICogbm90IG9wZW4sIGFuIGVycm9yIGlzIHJldHVybmVkLgorICoKKyAqIEBwYXJhbSBhdnIgICAgIGF1ZGlvIHJlc2FtcGxlIGNvbnRleHQKKyAqIEBwYXJhbSBtYXRyaXggIG1peGluZyBjb2VmZmljaWVudHM7IG1hdHJpeFtpICsgc3RyaWRlICogb10gaXMgdGhlIHdlaWdodCBvZgorICogICAgICAgICAgICAgICAgaW5wdXQgY2hhbm5lbCBpIGluIG91dHB1dCBjaGFubmVsIG8uCisgKiBAcGFyYW0gc3RyaWRlICBkaXN0YW5jZSBiZXR3ZWVuIGFkamFjZW50IGlucHV0IGNoYW5uZWxzIGluIHRoZSBtYXRyaXggYXJyYXkKKyAqIEByZXR1cm4gICAgICAgIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGF2cmVzYW1wbGVfZ2V0X21hdHJpeChBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsIGRvdWJsZSAqbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKTsKKworLyoqCisgKiBTZXQgY2hhbm5lbCBtaXhpbmcgbWF0cml4LgorICoKKyAqIEFsbG93cyBmb3Igc2V0dGluZyBhIGN1c3RvbSBtaXhpbmcgbWF0cml4LCBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IG1hdHJpeAorICogZ2VuZXJhdGVkIGludGVybmFsbHkgZHVyaW5nIGF2cmVzYW1wbGVfb3BlbigpLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQKKyAqIGFueXRpbWUgb24gYW4gYWxsb2NhdGVkIGNvbnRleHQsIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgY2FsbGluZworICogYXZyZXNhbXBsZV9vcGVuKCksIGFzIGxvbmcgYXMgdGhlIGNoYW5uZWwgbGF5b3V0cyBoYXZlIGJlZW4gc2V0LgorICogYXZyZXNhbXBsZV9jb252ZXJ0KCkgYWx3YXlzIHVzZXMgdGhlIGN1cnJlbnQgbWF0cml4LgorICogQ2FsbGluZyBhdnJlc2FtcGxlX2Nsb3NlKCkgb24gdGhlIGNvbnRleHQgd2lsbCBjbGVhciB0aGUgY3VycmVudCBtYXRyaXguCisgKgorICogQHNlZSBhdnJlc2FtcGxlX2Nsb3NlKCkKKyAqCisgKiBAcGFyYW0gYXZyICAgICBhdWRpbyByZXNhbXBsZSBjb250ZXh0CisgKiBAcGFyYW0gbWF0cml4ICBtaXhpbmcgY29lZmZpY2llbnRzOyBtYXRyaXhbaSArIHN0cmlkZSAqIG9dIGlzIHRoZSB3ZWlnaHQgb2YKKyAqICAgICAgICAgICAgICAgIGlucHV0IGNoYW5uZWwgaSBpbiBvdXRwdXQgY2hhbm5lbCBvLgorICogQHBhcmFtIHN0cmlkZSAgZGlzdGFuY2UgYmV0d2VlbiBhZGphY2VudCBpbnB1dCBjaGFubmVscyBpbiB0aGUgbWF0cml4IGFycmF5CisgKiBAcmV0dXJuICAgICAgICAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBhdnJlc2FtcGxlX3NldF9tYXRyaXgoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLCBjb25zdCBkb3VibGUgKm1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSk7CisKKy8qKgorICogU2V0IGEgY3VzdG9taXplZCBpbnB1dCBjaGFubmVsIG1hcHBpbmcuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgYWxsb2NhdGVkIGNvbnRleHQgaXMgbm90IG9wZW4uCisgKiBBbHNvLCB0aGUgaW5wdXQgY2hhbm5lbCBsYXlvdXQgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBzZXQuCisgKgorICogQ2FsbGluZyBhdnJlc2FtcGxlX2Nsb3NlKCkgb24gdGhlIGNvbnRleHQgd2lsbCBjbGVhciB0aGUgY2hhbm5lbCBtYXBwaW5nLgorICoKKyAqIFRoZSBtYXAgZm9yIGVhY2ggaW5wdXQgY2hhbm5lbCBzcGVjaWZpZXMgdGhlIGNoYW5uZWwgaW5kZXggaW4gdGhlIHNvdXJjZSB0bworICogdXNlIGZvciB0aGF0IHBhcnRpY3VsYXIgY2hhbm5lbCwgb3IgLTEgdG8gbXV0ZSB0aGUgY2hhbm5lbC4gU291cmNlIGNoYW5uZWxzCisgKiBjYW4gYmUgZHVwbGljYXRlZCBieSB1c2luZyB0aGUgc2FtZSBpbmRleCBmb3IgbXVsdGlwbGUgaW5wdXQgY2hhbm5lbHMuCisgKgorICogRXhhbXBsZXM6CisgKgorICogUmVvcmRlcmluZyA1LjEgQUFDIG9yZGVyIChDLEwsUixMcyxScyxMRkUpIHRvIEZGbXBlZyBvcmRlciAoTCxSLEMsTEZFLExzLFJzKToKKyAqIHsgMSwgMiwgMCwgNSwgMywgNCB9CisgKgorICogTXV0aW5nIHRoZSAzcmQgY2hhbm5lbCBpbiA0LWNoYW5uZWwgaW5wdXQ6CisgKiB7IDAsIDEsIC0xLCAzIH0KKyAqCisgKiBEdXBsaWNhdGluZyB0aGUgbGVmdCBjaGFubmVsIG9mIHN0ZXJlbyBpbnB1dDoKKyAqIHsgMCwgMCB9CisgKgorICogQHBhcmFtIGF2ciAgICAgICAgIGF1ZGlvIHJlc2FtcGxlIGNvbnRleHQKKyAqIEBwYXJhbSBjaGFubmVsX21hcCBjdXN0b21pemVkIGlucHV0IGNoYW5uZWwgbWFwcGluZworICogQHJldHVybiAgICAgICAgICAgIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGF2cmVzYW1wbGVfc2V0X2NoYW5uZWxfbWFwcGluZyhBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqY2hhbm5lbF9tYXApOworCisvKioKKyAqIFNldCBjb21wZW5zYXRpb24gZm9yIHJlc2FtcGxpbmcuCisgKgorICogVGhpcyBjYW4gYmUgY2FsbGVkIGFueXRpbWUgYWZ0ZXIgYXZyZXNhbXBsZV9vcGVuKCkuIElmIHJlc2FtcGxpbmcgaXMgbm90CisgKiBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgYmVjYXVzZSBvZiBhIHNhbXBsZSByYXRlIGNvbnZlcnNpb24sIHRoZQorICogImZvcmNlX3Jlc2FtcGxpbmciIG9wdGlvbiBtdXN0IGhhdmUgYmVlbiBzZXQgdG8gMSB3aGVuIG9wZW5pbmcgdGhlIGNvbnRleHQKKyAqIGluIG9yZGVyIHRvIHVzZSByZXNhbXBsaW5nIGNvbXBlbnNhdGlvbi4KKyAqCisgKiBAcGFyYW0gYXZyICAgICAgICAgICAgICAgICAgICBhdWRpbyByZXNhbXBsZSBjb250ZXh0CisgKiBAcGFyYW0gc2FtcGxlX2RlbHRhICAgICAgICAgICBjb21wZW5zYXRpb24gZGVsdGEsIGluIHNhbXBsZXMKKyAqIEBwYXJhbSBjb21wZW5zYXRpb25fZGlzdGFuY2UgIGNvbXBlbnNhdGlvbiBkaXN0YW5jZSwgaW4gc2FtcGxlcworICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgYXZyZXNhbXBsZV9zZXRfY29tcGVuc2F0aW9uKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwgaW50IHNhbXBsZV9kZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBlbnNhdGlvbl9kaXN0YW5jZSk7CisKKy8qKgorICogUHJvdmlkZSB0aGUgdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRoZSBjb25maWd1cmVkCisgKiBjb252ZXJzaW9uIHdvdWxkIG91dHB1dC4KKyAqCisgKiBAcGFyYW0gYXZyICAgICAgICAgICBhdWRpbyByZXNhbXBsZSBjb250ZXh0CisgKiBAcGFyYW0gaW5fbmJfc2FtcGxlcyBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcworICoKKyAqIEByZXR1cm4gICAgICAgICAgICAgIG51bWJlciBvZiBzYW1wbGVzIG9yIEFWRVJST1IoRUlOVkFMKSBpZiB0aGUgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgIHdvdWxkIGV4Y2VlZCBJTlRfTUFYCisgKi8KKworaW50IGF2cmVzYW1wbGVfZ2V0X291dF9zYW1wbGVzKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwgaW50IGluX25iX3NhbXBsZXMpOworCisvKioKKyAqIENvbnZlcnQgaW5wdXQgc2FtcGxlcyBhbmQgd3JpdGUgdGhlbSB0byB0aGUgb3V0cHV0IEZJRk8uCisgKgorICogVGhlIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMgY2FuIGJlIG9idGFpbmVkIHRocm91Z2gKKyAqIGF2cmVzYW1wbGVfZ2V0X291dF9zYW1wbGVzKCkuCisgKgorICogVGhlIG91dHB1dCBkYXRhIGNhbiBiZSBOVUxMIG9yIGhhdmUgZmV3ZXIgYWxsb2NhdGVkIHNhbXBsZXMgdGhhbiByZXF1aXJlZC4KKyAqIEluIHRoaXMgY2FzZSwgYW55IHJlbWFpbmluZyBzYW1wbGVzIG5vdCB3cml0dGVuIHRvIHRoZSBvdXRwdXQgd2lsbCBiZSBhZGRlZAorICogdG8gYW4gaW50ZXJuYWwgRklGTyBidWZmZXIsIHRvIGJlIHJldHVybmVkIGF0IHRoZSBuZXh0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbgorICogb3IgdG8gYXZyZXNhbXBsZV9yZWFkKCkuCisgKgorICogSWYgY29udmVydGluZyBzYW1wbGUgcmF0ZSwgdGhlcmUgbWF5IGJlIGRhdGEgcmVtYWluaW5nIGluIHRoZSBpbnRlcm5hbAorICogcmVzYW1wbGluZyBkZWxheSBidWZmZXIuIGF2cmVzYW1wbGVfZ2V0X2RlbGF5KCkgdGVsbHMgdGhlIG51bWJlciBvZiByZW1haW5pbmcKKyAqIHNhbXBsZXMuIFRvIGdldCB0aGlzIGRhdGEgYXMgb3V0cHV0LCBjYWxsIGF2cmVzYW1wbGVfY29udmVydCgpIHdpdGggTlVMTAorICogaW5wdXQuCisgKgorICogQXQgdGhlIGVuZCBvZiB0aGUgY29udmVyc2lvbiBwcm9jZXNzLCB0aGVyZSBtYXkgYmUgZGF0YSByZW1haW5pbmcgaW4gdGhlCisgKiBpbnRlcm5hbCBGSUZPIGJ1ZmZlci4gYXZyZXNhbXBsZV9hdmFpbGFibGUoKSB0ZWxscyB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZworICogc2FtcGxlcy4gVG8gZ2V0IHRoaXMgZGF0YSBhcyBvdXRwdXQsIGVpdGhlciBjYWxsIGF2cmVzYW1wbGVfY29udmVydCgpIHdpdGgKKyAqIE5VTEwgaW5wdXQgb3IgY2FsbCBhdnJlc2FtcGxlX3JlYWQoKS4KKyAqCisgKiBAc2VlIGF2cmVzYW1wbGVfZ2V0X291dF9zYW1wbGVzKCkKKyAqIEBzZWUgYXZyZXNhbXBsZV9yZWFkKCkKKyAqIEBzZWUgYXZyZXNhbXBsZV9nZXRfZGVsYXkoKQorICoKKyAqIEBwYXJhbSBhdnIgICAgICAgICAgICAgYXVkaW8gcmVzYW1wbGUgY29udGV4dAorICogQHBhcmFtIG91dHB1dCAgICAgICAgICBvdXRwdXQgZGF0YSBwb2ludGVycworICogQHBhcmFtIG91dF9wbGFuZV9zaXplICBvdXRwdXQgcGxhbmUgc2l6ZSwgaW4gYnl0ZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2FuIGJlIDAgaWYgdW5rbm93biwgYnV0IHRoYXQgd2lsbCBsZWFkIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplZCBmdW5jdGlvbnMgbm90IGJlaW5nIHVzZWQgZGlyZWN0bHkgb24gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgd2hpY2ggY291bGQgc2xvdyBkb3duIHNvbWUgY29udmVyc2lvbnMuCisgKiBAcGFyYW0gb3V0X3NhbXBsZXMgICAgIG1heGltdW0gbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCB0aGUgb3V0cHV0IGJ1ZmZlciBjYW4gaG9sZAorICogQHBhcmFtIGlucHV0ICAgICAgICAgICBpbnB1dCBkYXRhIHBvaW50ZXJzCisgKiBAcGFyYW0gaW5fcGxhbmVfc2l6ZSAgIGlucHV0IHBsYW5lIHNpemUsIGluIGJ5dGVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2FuIGJlIDAgaWYgdW5rbm93biwgYnV0IHRoYXQgd2lsbCBsZWFkIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplZCBmdW5jdGlvbnMgbm90IGJlaW5nIHVzZWQgZGlyZWN0bHkgb24gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCB3aGljaCBjb3VsZCBzbG93IGRvd24gc29tZSBjb252ZXJzaW9ucy4KKyAqIEBwYXJhbSBpbl9zYW1wbGVzICAgICAgbnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgdG8gY29udmVydAorICogQHJldHVybiAgICAgICAgICAgICAgICBudW1iZXIgb2Ygc2FtcGxlcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgYnVmZmVyLAorICogICAgICAgICAgICAgICAgICAgICAgICBub3QgaW5jbHVkaW5nIGNvbnZlcnRlZCBzYW1wbGVzIGFkZGVkIHRvIHRoZSBpbnRlcm5hbAorICogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgRklGTworICovCitpbnQgYXZyZXNhbXBsZV9jb252ZXJ0KEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwgdWludDhfdCAqKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9wbGFuZV9zaXplLCBpbnQgb3V0X3NhbXBsZXMsIHVpbnQ4X3QgKippbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGluX3BsYW5lX3NpemUsIGludCBpbl9zYW1wbGVzKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIGN1cnJlbnRseSBpbiB0aGUgcmVzYW1wbGluZyBkZWxheSBidWZmZXIuCisgKgorICogV2hlbiByZXNhbXBsaW5nLCB0aGVyZSBtYXkgYmUgYSBkZWxheSBiZXR3ZWVuIHRoZSBpbnB1dCBhbmQgb3V0cHV0LiBBbnkKKyAqIHVuY29udmVydGVkIHNhbXBsZXMgaW4gZWFjaCBjYWxsIGFyZSBzdG9yZWQgaW50ZXJuYWxseSBpbiBhIGRlbGF5IGJ1ZmZlci4KKyAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSB1c2VyIHRvIGRldGVybWluZSB0aGUgY3VycmVudCBudW1iZXIgb2Ygc2FtcGxlcyBpbgorICogdGhlIGRlbGF5IGJ1ZmZlciwgd2hpY2ggY2FuIGJlIHVzZWZ1bCBmb3Igc3luY2hyb25pemF0aW9uLgorICoKKyAqIEBzZWUgYXZyZXNhbXBsZV9jb252ZXJ0KCkKKyAqCisgKiBAcGFyYW0gYXZyICBhdWRpbyByZXNhbXBsZSBjb250ZXh0CisgKiBAcmV0dXJuICAgICBudW1iZXIgb2Ygc2FtcGxlcyBjdXJyZW50bHkgaW4gdGhlIHJlc2FtcGxpbmcgZGVsYXkgYnVmZmVyCisgKi8KK2ludCBhdnJlc2FtcGxlX2dldF9kZWxheShBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIpOworCisvKioKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBzYW1wbGVzIGluIHRoZSBvdXRwdXQgRklGTy4KKyAqCisgKiBEdXJpbmcgY29udmVyc2lvbiwgaWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhbiBvdXRwdXQgYnVmZmVyIG9yCisgKiBzcGVjaWZpZXMgYW4gb3V0cHV0IGJ1ZmZlciB0aGF0IGlzIHNtYWxsZXIgdGhhbiB3aGF0IGlzIG5lZWRlZCwgcmVtYWluaW5nCisgKiBzYW1wbGVzIHRoYXQgYXJlIG5vdCB3cml0dGVuIHRvIHRoZSBvdXRwdXQgYXJlIHN0b3JlZCB0byBhbiBpbnRlcm5hbCBGSUZPCisgKiBidWZmZXIuIFRoZSBzYW1wbGVzIGluIHRoZSBGSUZPIGNhbiBiZSByZWFkIHdpdGggYXZyZXNhbXBsZV9yZWFkKCkgb3IKKyAqIGF2cmVzYW1wbGVfY29udmVydCgpLgorICoKKyAqIEBzZWUgYXZyZXNhbXBsZV9yZWFkKCkKKyAqIEBzZWUgYXZyZXNhbXBsZV9jb252ZXJ0KCkKKyAqCisgKiBAcGFyYW0gYXZyICBhdWRpbyByZXNhbXBsZSBjb250ZXh0CisgKiBAcmV0dXJuICAgICBudW1iZXIgb2Ygc2FtcGxlcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcKKyAqLworaW50IGF2cmVzYW1wbGVfYXZhaWxhYmxlKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2cik7CisKKy8qKgorICogUmVhZCBzYW1wbGVzIGZyb20gdGhlIG91dHB1dCBGSUZPLgorICoKKyAqIER1cmluZyBjb252ZXJzaW9uLCBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFuIG91dHB1dCBidWZmZXIgb3IKKyAqIHNwZWNpZmllcyBhbiBvdXRwdXQgYnVmZmVyIHRoYXQgaXMgc21hbGxlciB0aGFuIHdoYXQgaXMgbmVlZGVkLCByZW1haW5pbmcKKyAqIHNhbXBsZXMgdGhhdCBhcmUgbm90IHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBhcmUgc3RvcmVkIHRvIGFuIGludGVybmFsIEZJRk8KKyAqIGJ1ZmZlci4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZWFkIHNhbXBsZXMgZnJvbSB0aGF0IGludGVybmFsIEZJRk8uCisgKgorICogQHNlZSBhdnJlc2FtcGxlX2F2YWlsYWJsZSgpCisgKiBAc2VlIGF2cmVzYW1wbGVfY29udmVydCgpCisgKgorICogQHBhcmFtIGF2ciAgICAgICAgIGF1ZGlvIHJlc2FtcGxlIGNvbnRleHQKKyAqIEBwYXJhbSBvdXRwdXQgICAgICBvdXRwdXQgZGF0YSBwb2ludGVycy4gTWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2UKKyAqICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzIG9mIGRhdGEgaXMgZGlzY2FyZGVkIGZyb20gb3V0cHV0IEZJRk8uCisgKiBAcGFyYW0gbmJfc2FtcGxlcyAgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCBmcm9tIHRoZSBGSUZPCisgKiBAcmV0dXJuICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzYW1wbGVzIHdyaXR0ZW4gdG8gb3V0cHV0CisgKi8KK2ludCBhdnJlc2FtcGxlX3JlYWQoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLCB1aW50OF90ICoqb3V0cHV0LCBpbnQgbmJfc2FtcGxlcyk7CisKKy8qKgorICogQ29udmVydCB0aGUgc2FtcGxlcyBpbiB0aGUgaW5wdXQgQVZGcmFtZSBhbmQgd3JpdGUgdGhlbSB0byB0aGUgb3V0cHV0IEFWRnJhbWUuCisgKgorICogSW5wdXQgYW5kIG91dHB1dCBBVkZyYW1lcyBtdXN0IGhhdmUgY2hhbm5lbF9sYXlvdXQsIHNhbXBsZV9yYXRlIGFuZCBmb3JtYXQgc2V0LgorICoKKyAqIFRoZSB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIGlzIG9idGFpbmVkIHRocm91Z2gKKyAqIGF2cmVzYW1wbGVfZ2V0X291dF9zYW1wbGVzKCkuCisgKgorICogSWYgdGhlIG91dHB1dCBBVkZyYW1lIGRvZXMgbm90IGhhdmUgdGhlIGRhdGEgcG9pbnRlcnMgYWxsb2NhdGVkIHRoZSBuYl9zYW1wbGVzCisgKiBmaWVsZCB3aWxsIGJlIHNldCB1c2luZyBhdnJlc2FtcGxlX2dldF9vdXRfc2FtcGxlcygpIGFuZCBhdl9mcmFtZV9nZXRfYnVmZmVyKCkKKyAqIGlzIGNhbGxlZCB0byBhbGxvY2F0ZSB0aGUgZnJhbWUuCisgKgorICogVGhlIG91dHB1dCBBVkZyYW1lIGNhbiBiZSBOVUxMIG9yIGhhdmUgZmV3ZXIgYWxsb2NhdGVkIHNhbXBsZXMgdGhhbiByZXF1aXJlZC4KKyAqIEluIHRoaXMgY2FzZSwgYW55IHJlbWFpbmluZyBzYW1wbGVzIG5vdCB3cml0dGVuIHRvIHRoZSBvdXRwdXQgd2lsbCBiZSBhZGRlZAorICogdG8gYW4gaW50ZXJuYWwgRklGTyBidWZmZXIsIHRvIGJlIHJldHVybmVkIGF0IHRoZSBuZXh0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbgorICogb3IgdG8gYXZyZXNhbXBsZV9jb252ZXJ0KCkgb3IgdG8gYXZyZXNhbXBsZV9yZWFkKCkuCisgKgorICogSWYgY29udmVydGluZyBzYW1wbGUgcmF0ZSwgdGhlcmUgbWF5IGJlIGRhdGEgcmVtYWluaW5nIGluIHRoZSBpbnRlcm5hbAorICogcmVzYW1wbGluZyBkZWxheSBidWZmZXIuIGF2cmVzYW1wbGVfZ2V0X2RlbGF5KCkgdGVsbHMgdGhlIG51bWJlciBvZgorICogcmVtYWluaW5nIHNhbXBsZXMuIFRvIGdldCB0aGlzIGRhdGEgYXMgb3V0cHV0LCBjYWxsIHRoaXMgZnVuY3Rpb24gb3IKKyAqIGF2cmVzYW1wbGVfY29udmVydCgpIHdpdGggTlVMTCBpbnB1dC4KKyAqCisgKiBBdCB0aGUgZW5kIG9mIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MsIHRoZXJlIG1heSBiZSBkYXRhIHJlbWFpbmluZyBpbiB0aGUKKyAqIGludGVybmFsIEZJRk8gYnVmZmVyLiBhdnJlc2FtcGxlX2F2YWlsYWJsZSgpIHRlbGxzIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nCisgKiBzYW1wbGVzLiBUbyBnZXQgdGhpcyBkYXRhIGFzIG91dHB1dCwgZWl0aGVyIGNhbGwgdGhpcyBmdW5jdGlvbiBvcgorICogYXZyZXNhbXBsZV9jb252ZXJ0KCkgd2l0aCBOVUxMIGlucHV0IG9yIGNhbGwgYXZyZXNhbXBsZV9yZWFkKCkuCisgKgorICogSWYgdGhlIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBtYXRjaCB0aGUgb3V0cHV0IGFuZAorICogaW5wdXQgQVZGcmFtZSBzZXR0aW5ncyB0aGUgY29udmVyc2lvbiBkb2VzIG5vdCB0YWtlIHBsYWNlIGFuZCBkZXBlbmRpbmcgb24KKyAqIHdoaWNoIEFWRnJhbWUgaXMgbm90IG1hdGNoaW5nIEFWRVJST1JfT1VUUFVUX0NIQU5HRUQsIEFWRVJST1JfSU5QVVRfQ0hBTkdFRAorICogb3IgQVZFUlJPUl9PVVRQVVRfQ0hBTkdFRHxBVkVSUk9SX0lOUFVUX0NIQU5HRUQgaXMgcmV0dXJuZWQuCisgKgorICogQHNlZSBhdnJlc2FtcGxlX2dldF9vdXRfc2FtcGxlcygpCisgKiBAc2VlIGF2cmVzYW1wbGVfYXZhaWxhYmxlKCkKKyAqIEBzZWUgYXZyZXNhbXBsZV9jb252ZXJ0KCkKKyAqIEBzZWUgYXZyZXNhbXBsZV9yZWFkKCkKKyAqIEBzZWUgYXZyZXNhbXBsZV9nZXRfZGVsYXkoKQorICoKKyAqIEBwYXJhbSBhdnIgICAgICAgICAgICAgYXVkaW8gcmVzYW1wbGUgY29udGV4dAorICogQHBhcmFtIG91dHB1dCAgICAgICAgICBvdXRwdXQgQVZGcmFtZQorICogQHBhcmFtIGlucHV0ICAgICAgICAgICBpbnB1dCBBVkZyYW1lCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgIDAgb24gc3VjY2VzcywgQVZFUlJPUiBvbiBmYWlsdXJlIG9yIG5vbm1hdGNoaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCisgKi8KK2ludCBhdnJlc2FtcGxlX2NvbnZlcnRfZnJhbWUoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXRwdXQsIEFWRnJhbWUgKmlucHV0KTsKKworLyoqCisgKiBDb25maWd1cmUgb3IgcmVjb25maWd1cmUgdGhlIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgdXNpbmcgdGhlIGluZm9ybWF0aW9uCisgKiBwcm92aWRlZCBieSB0aGUgQVZGcmFtZXMuCisgKgorICogVGhlIG9yaWdpbmFsIHJlc2FtcGxpbmcgY29udGV4dCBpcyByZXNldCBldmVuIG9uIGZhaWx1cmUuCisgKiBUaGUgZnVuY3Rpb24gY2FsbHMgYXZyZXNhbXBsZV9jbG9zZSgpIGludGVybmFsbHkgaWYgdGhlIGNvbnRleHQgaXMgb3Blbi4KKyAqCisgKiBAc2VlIGF2cmVzYW1wbGVfb3BlbigpOworICogQHNlZSBhdnJlc2FtcGxlX2Nsb3NlKCk7CisgKgorICogQHBhcmFtIGF2ciAgICAgICAgICAgICBhdWRpbyByZXNhbXBsZSBjb250ZXh0CisgKiBAcGFyYW0gb3V0cHV0ICAgICAgICAgIG91dHB1dCBBVkZyYW1lCisgKiBAcGFyYW0gaW5wdXQgICAgICAgICAgIGlucHV0IEFWRnJhbWUKKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBBVkVSUk9SIG9uIGZhaWx1cmUuCisgKi8KK2ludCBhdnJlc2FtcGxlX2NvbmZpZyhBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsIEFWRnJhbWUgKm91dCwgQVZGcmFtZSAqaW4pOworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWUkVTQU1QTEVfQVZSRVNBTVBMRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9hdnJlc2FtcGxlcmVzLnJjIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZXJlcy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQwZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZXJlcy5yYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogV2luZG93cyByZXNvdXJjZSBmaWxlIGZvciBsaWJhdnJlc2FtcGxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEphbWVzIEFsbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGlhbmNoZW5nICJUaW1vdGh5IiBHdQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgImxpYmF2cmVzYW1wbGUvdmVyc2lvbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworMSBWRVJTSU9OSU5GTworRklMRVZFUlNJT04gICAgIExJQkFWUkVTQU1QTEVfVkVSU0lPTl9NQUpPUiwgTElCQVZSRVNBTVBMRV9WRVJTSU9OX01JTk9SLCBMSUJBVlJFU0FNUExFX1ZFUlNJT05fTUlDUk8sIDAKK1BST0RVQ1RWRVJTSU9OICBMSUJBVlJFU0FNUExFX1ZFUlNJT05fTUFKT1IsIExJQkFWUkVTQU1QTEVfVkVSU0lPTl9NSU5PUiwgTElCQVZSRVNBTVBMRV9WRVJTSU9OX01JQ1JPLCAwCitGSUxFRkxBR1NNQVNLICAgVlNfRkZJX0ZJTEVGTEFHU01BU0sKK0ZJTEVPUyAgICAgICAgICBWT1NfTlRfV0lORE9XUzMyCitGSUxFVFlQRSAgICAgICAgVkZUX0RMTAoreworICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICB7CisgICAgICAgIEJMT0NLICIwNDA5MDRCMCIKKyAgICAgICAgeworICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgICAgICAiRkZtcGVnIFByb2plY3QiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgICJMaWJhdiBhdWRpbyByZXNhbXBsaW5nIGxpYnJhcnkiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAgICAgIEFWX1NUUklOR0lGWShMSUJBVlJFU0FNUExFX1ZFUlNJT04pCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgICAgICJsaWJhdnJlc2FtcGxlIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgICAiQ29weXJpZ2h0IChDKSAyMDAwLSIgQVZfU1RSSU5HSUZZKENPTkZJR19USElTX1lFQVIpICIgRkZtcGVnIFByb2plY3QiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJhdnJlc2FtcGxlIiBCVUlMRFNVRiAiLSIgQVZfU1RSSU5HSUZZKExJQkFWUkVTQU1QTEVfVkVSU0lPTl9NQUpPUikgU0xJQlNVRgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgICAgICAiRkZtcGVnIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgICBGRk1QRUdfVkVSU0lPTgorICAgICAgICB9CisgICAgfQorCisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIHsKKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwNDA5LCAweDA0QjAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9kaXRoZXIuYyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2RpdGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZThkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9kaXRoZXIuYwpAQCAtMCwwICsxLDQ0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBKdXN0aW4gUnVnZ2xlcyA8anVzdGluLnJ1Z2dsZXNAZ21haWwuY29tPgorICoKKyAqIFRyaWFuZ3VsYXIgd2l0aCBOb2lzZSBTaGFwaW5nIGlzIGJhc2VkIG9uIG9wdXNmaWxlLgorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMTIgYnkgdGhlIFhpcGguT3JnIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9ycworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBEaXRoZXJlZCBBdWRpbyBTYW1wbGUgUXVhbnRpemF0aW9uCisgKgorICogQ29udmVydHMgZnJvbSBkYmwsIGZsdCwgb3IgczMyIHRvIHMxNiB1c2luZyBkaXRoZXJpbmcuCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImF1ZGlvX2NvbnZlcnQuaCIKKyNpbmNsdWRlICJkaXRoZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBEaXRoZXJTdGF0ZSB7CisgICAgaW50IG11dGU7CisgICAgdW5zaWduZWQgaW50IHNlZWQ7CisgICAgQVZMRkcgbGZnOworICAgIGZsb2F0ICpub2lzZV9idWY7CisgICAgaW50IG5vaXNlX2J1Zl9zaXplOworICAgIGludCBub2lzZV9idWZfcHRyOworICAgIGZsb2F0IGRpdGhlcl9hWzRdOworICAgIGZsb2F0IGRpdGhlcl9iWzRdOworfSBEaXRoZXJTdGF0ZTsKKworc3RydWN0IERpdGhlckNvbnRleHQgeworICAgIERpdGhlckRTUENvbnRleHQgIGRkc3A7CisgICAgZW51bSBBVlJlc2FtcGxlRGl0aGVyTWV0aG9kIG1ldGhvZDsKKyAgICBpbnQgYXBwbHlfbWFwOworICAgIENoYW5uZWxNYXBJbmZvICpjaF9tYXBfaW5mbzsKKworICAgIGludCBtdXRlX2RpdGhlcl90aHJlc2hvbGQ7ICAvLyB0aHJlc2hvbGQgZm9yIGRpc2FibGluZyBkaXRoZXIKKyAgICBpbnQgbXV0ZV9yZXNldF90aHJlc2hvbGQ7ICAgLy8gdGhyZXNob2xkIGZvciByZXNldHRpbmcgbm9pc2Ugc2hhcGluZworICAgIGNvbnN0IGZsb2F0ICpuc19jb2VmX2I7ICAgICAvLyBub2lzZSBzaGFwaW5nIGNvZWZmcworICAgIGNvbnN0IGZsb2F0ICpuc19jb2VmX2E7ICAgICAvLyBub2lzZSBzaGFwaW5nIGNvZWZmcworCisgICAgaW50IGNoYW5uZWxzOworICAgIERpdGhlclN0YXRlICpzdGF0ZTsgICAgICAgICAvLyBkaXRoZXIgc3RhdGVzIGZvciBlYWNoIGNoYW5uZWwKKworICAgIEF1ZGlvRGF0YSAqZmx0X2RhdGE7ICAgICAgICAvLyBpbnB1dCBkYXRhIGluIGZsdHAKKyAgICBBdWRpb0RhdGEgKnMxNl9kYXRhOyAgICAgICAgLy8gZGl0aGVyZWQgb3V0cHV0IGluIHMxNnAKKyAgICBBdWRpb0NvbnZlcnQgKmFjX2luOyAgICAgICAgLy8gY29udmVydGVyIGZvciBpbnB1dCB0byBmbHRwCisgICAgQXVkaW9Db252ZXJ0ICphY19vdXQ7ICAgICAgIC8vIGNvbnZlcnRlciBmb3IgczE2cCB0byBzMTYgKGlmIG5lZWRlZCkKKworICAgIHZvaWQgKCpxdWFudGl6ZSkoaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCAqZGl0aGVyLCBpbnQgbGVuKTsKKyAgICBpbnQgc2FtcGxlc19hbGlnbjsKK307CisKKy8qIG11dGUgdGhyZXNob2xkLCBpbiBzZWNvbmRzICovCisjZGVmaW5lIE1VVEVfVEhSRVNIT0xEX1NFQyAwLjAwMDMzMworCisvKiBzY2FsZSBmYWN0b3IgZm9yIDE2LWJpdCBvdXRwdXQuCisgICBUaGUgc2lnbmFsIGlzIGF0dGVudWF0ZWQgc2xpZ2h0bHkgdG8gYXZvaWQgY2xpcHBpbmcgKi8KKyNkZWZpbmUgUzE2X1NDQUxFIDMyNzUzLjBmCisKKy8qIHNjYWxlIHRvIGNvbnZlcnQgbGZnIGZyb20gSU5UX01JTi9JTlRfTUFYIHRvIC0wLjUvMC41ICovCisjZGVmaW5lIExGR19TQ0FMRSAoMS4wZiAvICgyLjBmICogSU5UMzJfTUFYKSkKKworLyogbm9pc2Ugc2hhcGluZyBjb2VmZmljaWVudHMgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IG5zXzQ4X2NvZWZfYls0XSA9IHsKKyAgICAyLjIzNzRmLCAtMC43MzM5ZiwgLTAuMTI1MWYsIC0wLjYwMzNmCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgbnNfNDhfY29lZl9hWzRdID0geworICAgIDAuOTAzMGYsIDAuMDExNmYsIC0wLjU4NTNmLCAtMC4yNTcxZgorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IG5zXzQ0X2NvZWZfYls0XSA9IHsKKyAgICAyLjIwNjFmLCAtMC40NzA3ZiwgLTAuMjUzNGYsIC0wLjYyMTNmCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgbnNfNDRfY29lZl9hWzRdID0geworICAgIDEuMDU4N2YsIDAuMDY3NmYsIC0wLjYwNTRmLCAtMC4yNzM4ZgorfTsKKworc3RhdGljIHZvaWQgZGl0aGVyX2ludF90b19mbG9hdF9yZWN0YW5ndWxhcl9jKGZsb2F0ICpkc3QsIGludCAqc3JjLCBpbnQgbGVuKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgZHN0W2ldID0gc3JjW2ldICogTEZHX1NDQUxFOworfQorCitzdGF0aWMgdm9pZCBkaXRoZXJfaW50X3RvX2Zsb2F0X3RyaWFuZ3VsYXJfYyhmbG9hdCAqZHN0LCBpbnQgKnNyYzAsIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgaW50ICpzcmMxICA9IHNyYzAgKyBsZW47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgZmxvYXQgciA9IHNyYzBbaV0gKiBMRkdfU0NBTEU7CisgICAgICAgIHIgICAgICArPSBzcmMxW2ldICogTEZHX1NDQUxFOworICAgICAgICBkc3RbaV0gID0gcjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHF1YW50aXplX2MoaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCAqZGl0aGVyLCBpbnQgbGVuKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgZHN0W2ldID0gYXZfY2xpcF9pbnQxNihscmludGYoc3JjW2ldICogUzE2X1NDQUxFICsgZGl0aGVyW2ldKSk7Cit9CisKKyNkZWZpbmUgU1FSVF8xXzYgMC40MDgyNDgyOTA0NjM4NjMwMTcyM2YKKworc3RhdGljIHZvaWQgZGl0aGVyX2hpZ2hwYXNzX2ZpbHRlcihmbG9hdCAqc3JjLCBpbnQgbGVuKQoreworICAgIGludCBpOworCisgICAgLyogZmlsdGVyIGlzIGZyb20gbGlic3dyZXNhbXBsZSBpbiBGRm1wZWcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMjsgaSsrKQorICAgICAgICBzcmNbaV0gPSAoLXNyY1tpXSArIDIgKiBzcmNbaSArIDFdIC0gc3JjW2kgKyAyXSkgKiBTUVJUXzFfNjsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9kaXRoZXJfbm9pc2UoRGl0aGVyQ29udGV4dCAqYywgRGl0aGVyU3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbl9zYW1wbGVzKQoreworICAgIGludCBpOworICAgIGludCBuYl9zYW1wbGVzICA9IEZGQUxJR04obWluX3NhbXBsZXMsIDE2KSArIDE2OworICAgIGludCBidWZfc2FtcGxlcyA9IG5iX3NhbXBsZXMgKgorICAgICAgICAgICAgICAgICAgICAgIChjLT5tZXRob2QgPT0gQVZfUkVTQU1QTEVfRElUSEVSX1JFQ1RBTkdVTEFSID8gMSA6IDIpOworICAgIHVuc2lnbmVkIGludCAqbm9pc2VfYnVmX3VpOworCisgICAgYXZfZnJlZXAoJnN0YXRlLT5ub2lzZV9idWYpOworICAgIHN0YXRlLT5ub2lzZV9idWZfc2l6ZSA9IHN0YXRlLT5ub2lzZV9idWZfcHRyID0gMDsKKworICAgIHN0YXRlLT5ub2lzZV9idWYgPSBhdl9tYWxsb2MoYnVmX3NhbXBsZXMgKiBzaXplb2YoKnN0YXRlLT5ub2lzZV9idWYpKTsKKyAgICBpZiAoIXN0YXRlLT5ub2lzZV9idWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3RhdGUtPm5vaXNlX2J1Zl9zaXplID0gRkZBTElHTihtaW5fc2FtcGxlcywgMTYpOworICAgIG5vaXNlX2J1Zl91aSAgICAgICAgICA9ICh1bnNpZ25lZCBpbnQgKilzdGF0ZS0+bm9pc2VfYnVmOworCisgICAgYXZfbGZnX2luaXQoJnN0YXRlLT5sZmcsIHN0YXRlLT5zZWVkKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NhbXBsZXM7IGkrKykKKyAgICAgICAgbm9pc2VfYnVmX3VpW2ldID0gYXZfbGZnX2dldCgmc3RhdGUtPmxmZyk7CisKKyAgICBjLT5kZHNwLmRpdGhlcl9pbnRfdG9fZmxvYXQoc3RhdGUtPm5vaXNlX2J1Ziwgbm9pc2VfYnVmX3VpLCBuYl9zYW1wbGVzKTsKKworICAgIGlmIChjLT5tZXRob2QgPT0gQVZfUkVTQU1QTEVfRElUSEVSX1RSSUFOR1VMQVJfSFApCisgICAgICAgIGRpdGhlcl9oaWdocGFzc19maWx0ZXIoc3RhdGUtPm5vaXNlX2J1ZiwgbmJfc2FtcGxlcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcXVhbnRpemVfdHJpYW5ndWxhcl9ucyhEaXRoZXJDb250ZXh0ICpjLCBEaXRoZXJTdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMpCit7CisgICAgaW50IGksIGo7CisgICAgZmxvYXQgKmRpdGhlciA9ICZzdGF0ZS0+bm9pc2VfYnVmW3N0YXRlLT5ub2lzZV9idWZfcHRyXTsKKworICAgIGlmIChzdGF0ZS0+bXV0ZSA+IGMtPm11dGVfcmVzZXRfdGhyZXNob2xkKQorICAgICAgICBtZW1zZXQoc3RhdGUtPmRpdGhlcl9hLCAwLCBzaXplb2Yoc3RhdGUtPmRpdGhlcl9hKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGZsb2F0IGVyciA9IDA7CisgICAgICAgIGZsb2F0IHNhbXBsZSA9IHNyY1tpXSAqIFMxNl9TQ0FMRTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICBlcnIgKz0gYy0+bnNfY29lZl9iW2pdICogc3RhdGUtPmRpdGhlcl9iW2pdIC0KKyAgICAgICAgICAgICAgICAgICBjLT5uc19jb2VmX2Fbal0gKiBzdGF0ZS0+ZGl0aGVyX2Fbal07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMzsgaiA+IDA7IGotLSkgeworICAgICAgICAgICAgc3RhdGUtPmRpdGhlcl9hW2pdID0gc3RhdGUtPmRpdGhlcl9hW2ogLSAxXTsKKyAgICAgICAgICAgIHN0YXRlLT5kaXRoZXJfYltqXSA9IHN0YXRlLT5kaXRoZXJfYltqIC0gMV07CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPmRpdGhlcl9hWzBdID0gZXJyOworICAgICAgICBzYW1wbGUgLT0gZXJyOworCisgICAgICAgIGlmIChzdGF0ZS0+bXV0ZSA+IGMtPm11dGVfZGl0aGVyX3RocmVzaG9sZCkgeworICAgICAgICAgICAgZHN0W2ldICAgICAgICAgICAgID0gYXZfY2xpcF9pbnQxNihscmludGYoc2FtcGxlKSk7CisgICAgICAgICAgICBzdGF0ZS0+ZGl0aGVyX2JbMF0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0W2ldICAgICAgICAgICAgID0gYXZfY2xpcF9pbnQxNihscmludGYoc2FtcGxlICsgZGl0aGVyW2ldKSk7CisgICAgICAgICAgICBzdGF0ZS0+ZGl0aGVyX2JbMF0gPSBhdl9jbGlwZihkc3RbaV0gLSBzYW1wbGUsIC0xLjVmLCAxLjVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlLT5tdXRlKys7CisgICAgICAgIGlmIChzcmNbaV0pCisgICAgICAgICAgICBzdGF0ZS0+bXV0ZSA9IDA7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbnZlcnRfc2FtcGxlcyhEaXRoZXJDb250ZXh0ICpjLCBpbnQxNl90ICoqZHN0LCBmbG9hdCAqIGNvbnN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGludCBuYl9zYW1wbGVzKQoreworICAgIGludCBjaCwgcmV0OworICAgIGludCBhbGlnbmVkX3NhbXBsZXMgPSBGRkFMSUdOKG5iX3NhbXBsZXMsIDE2KTsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIERpdGhlclN0YXRlICpzdGF0ZSA9ICZjLT5zdGF0ZVtjaF07CisKKyAgICAgICAgaWYgKHN0YXRlLT5ub2lzZV9idWZfc2l6ZSA8IGFsaWduZWRfc2FtcGxlcykgeworICAgICAgICAgICAgcmV0ID0gZ2VuZXJhdGVfZGl0aGVyX25vaXNlKGMsIHN0YXRlLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUtPm5vaXNlX2J1Zl9zaXplIC0gc3RhdGUtPm5vaXNlX2J1Zl9wdHIgPCBhbGlnbmVkX3NhbXBsZXMpIHsKKyAgICAgICAgICAgIHN0YXRlLT5ub2lzZV9idWZfcHRyID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjLT5tZXRob2QgPT0gQVZfUkVTQU1QTEVfRElUSEVSX1RSSUFOR1VMQVJfTlMpIHsKKyAgICAgICAgICAgIHF1YW50aXplX3RyaWFuZ3VsYXJfbnMoYywgc3RhdGUsIGRzdFtjaF0sIHNyY1tjaF0sIG5iX3NhbXBsZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYy0+cXVhbnRpemUoZHN0W2NoXSwgc3JjW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZS0+bm9pc2VfYnVmW3N0YXRlLT5ub2lzZV9idWZfcHRyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZGQUxJR04obmJfc2FtcGxlcywgYy0+c2FtcGxlc19hbGlnbikpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGUtPm5vaXNlX2J1Zl9wdHIgKz0gYWxpZ25lZF9zYW1wbGVzOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfY29udmVydF9kaXRoZXIoRGl0aGVyQ29udGV4dCAqYywgQXVkaW9EYXRhICpkc3QsIEF1ZGlvRGF0YSAqc3JjKQoreworICAgIGludCByZXQ7CisgICAgQXVkaW9EYXRhICpmbHRfZGF0YTsKKworICAgIC8qIG91dHB1dCBkaXJlY3RseSB0byBkc3QgaWYgaXQgaXMgcGxhbmFyICovCisgICAgaWYgKGRzdC0+c2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlApCisgICAgICAgIGMtPnMxNl9kYXRhID0gZHN0OworICAgIGVsc2UgeworICAgICAgICAvKiBtYWtlIHN1cmUgczE2X2RhdGEgaXMgbGFyZ2UgZW5vdWdoIGZvciB0aGUgb3V0cHV0ICovCisgICAgICAgIHJldCA9IGZmX2F1ZGlvX2RhdGFfcmVhbGxvYyhjLT5zMTZfZGF0YSwgc3JjLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChzcmMtPnNhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9GTFRQIHx8IGMtPmFwcGx5X21hcCkgeworICAgICAgICAvKiBtYWtlIHN1cmUgZmx0X2RhdGEgaXMgbGFyZ2UgZW5vdWdoIGZvciB0aGUgaW5wdXQgKi8KKyAgICAgICAgcmV0ID0gZmZfYXVkaW9fZGF0YV9yZWFsbG9jKGMtPmZsdF9kYXRhLCBzcmMtPm5iX3NhbXBsZXMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGZsdF9kYXRhID0gYy0+Zmx0X2RhdGE7CisgICAgfQorCisgICAgaWYgKHNyYy0+c2FtcGxlX2ZtdCAhPSBBVl9TQU1QTEVfRk1UX0ZMVFApIHsKKyAgICAgICAgLyogY29udmVydCBpbnB1dCBzYW1wbGVzIHRvIGZsdHAgYW5kIHNjYWxlIHRvIHMxNiByYW5nZSAqLworICAgICAgICByZXQgPSBmZl9hdWRpb19jb252ZXJ0KGMtPmFjX2luLCBmbHRfZGF0YSwgc3JjKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSBpZiAoYy0+YXBwbHlfbWFwKSB7CisgICAgICAgIHJldCA9IGZmX2F1ZGlvX2RhdGFfY29weShmbHRfZGF0YSwgc3JjLCBjLT5jaF9tYXBfaW5mbyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBmbHRfZGF0YSA9IHNyYzsKKyAgICB9CisKKyAgICAvKiBjaGVjayBhbGlnbm1lbnQgYW5kIHBhZGRpbmcgY29uc3RyYWludHMgKi8KKyAgICBpZiAoYy0+bWV0aG9kICE9IEFWX1JFU0FNUExFX0RJVEhFUl9UUklBTkdVTEFSX05TKSB7CisgICAgICAgIGludCBwdHJfYWxpZ24gICAgID0gRkZNSU4oZmx0X2RhdGEtPnB0cl9hbGlnbiwgICAgIGMtPnMxNl9kYXRhLT5wdHJfYWxpZ24pOworICAgICAgICBpbnQgc2FtcGxlc19hbGlnbiA9IEZGTUlOKGZsdF9kYXRhLT5zYW1wbGVzX2FsaWduLCBjLT5zMTZfZGF0YS0+c2FtcGxlc19hbGlnbik7CisgICAgICAgIGludCBhbGlnbmVkX2xlbiAgID0gRkZBTElHTihzcmMtPm5iX3NhbXBsZXMsIGMtPmRkc3Auc2FtcGxlc19hbGlnbik7CisKKyAgICAgICAgaWYgKCEocHRyX2FsaWduICUgYy0+ZGRzcC5wdHJfYWxpZ24pICYmIHNhbXBsZXNfYWxpZ24gPj0gYWxpZ25lZF9sZW4pIHsKKyAgICAgICAgICAgIGMtPnF1YW50aXplICAgICAgPSBjLT5kZHNwLnF1YW50aXplOworICAgICAgICAgICAgYy0+c2FtcGxlc19hbGlnbiA9IGMtPmRkc3Auc2FtcGxlc19hbGlnbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGMtPnF1YW50aXplICAgICAgPSBxdWFudGl6ZV9jOworICAgICAgICAgICAgYy0+c2FtcGxlc19hbGlnbiA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBjb252ZXJ0X3NhbXBsZXMoYywgKGludDE2X3QgKiopYy0+czE2X2RhdGEtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqIGNvbnN0ICopZmx0X2RhdGEtPmRhdGEsIHNyYy0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+bmJfc2FtcGxlcyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBjLT5zMTZfZGF0YS0+bmJfc2FtcGxlcyA9IHNyYy0+bmJfc2FtcGxlczsKKworICAgIC8qIGludGVybGVhdmUgb3V0cHV0IHRvIGRzdCBpZiBuZWVkZWQgKi8KKyAgICBpZiAoZHN0LT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfUzE2KSB7CisgICAgICAgIHJldCA9IGZmX2F1ZGlvX2NvbnZlcnQoYy0+YWNfb3V0LCBkc3QsIGMtPnMxNl9kYXRhKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZQorICAgICAgICBjLT5zMTZfZGF0YSA9IE5VTEw7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl9kaXRoZXJfZnJlZShEaXRoZXJDb250ZXh0ICoqY3ApCit7CisgICAgRGl0aGVyQ29udGV4dCAqYyA9ICpjcDsKKyAgICBpbnQgY2g7CisKKyAgICBpZiAoIWMpCisgICAgICAgIHJldHVybjsKKyAgICBmZl9hdWRpb19kYXRhX2ZyZWUoJmMtPmZsdF9kYXRhKTsKKyAgICBmZl9hdWRpb19kYXRhX2ZyZWUoJmMtPnMxNl9kYXRhKTsKKyAgICBmZl9hdWRpb19jb252ZXJ0X2ZyZWUoJmMtPmFjX2luKTsKKyAgICBmZl9hdWRpb19jb252ZXJ0X2ZyZWUoJmMtPmFjX291dCk7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgIGF2X2ZyZWUoYy0+c3RhdGVbY2hdLm5vaXNlX2J1Zik7CisgICAgYXZfZnJlZShjLT5zdGF0ZSk7CisgICAgYXZfZnJlZXAoY3ApOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGRpdGhlcl9pbml0KERpdGhlckRTUENvbnRleHQgKmRkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZSZXNhbXBsZURpdGhlck1ldGhvZCBtZXRob2QpCit7CisgICAgZGRzcC0+cXVhbnRpemUgICAgICA9IHF1YW50aXplX2M7CisgICAgZGRzcC0+cHRyX2FsaWduICAgICA9IDE7CisgICAgZGRzcC0+c2FtcGxlc19hbGlnbiA9IDE7CisKKyAgICBpZiAobWV0aG9kID09IEFWX1JFU0FNUExFX0RJVEhFUl9SRUNUQU5HVUxBUikKKyAgICAgICAgZGRzcC0+ZGl0aGVyX2ludF90b19mbG9hdCA9IGRpdGhlcl9pbnRfdG9fZmxvYXRfcmVjdGFuZ3VsYXJfYzsKKyAgICBlbHNlCisgICAgICAgIGRkc3AtPmRpdGhlcl9pbnRfdG9fZmxvYXQgPSBkaXRoZXJfaW50X3RvX2Zsb2F0X3RyaWFuZ3VsYXJfYzsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfZGl0aGVyX2luaXRfeDg2KGRkc3AsIG1ldGhvZCk7Cit9CisKK0RpdGhlckNvbnRleHQgKmZmX2RpdGhlcl9hbGxvYyhBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW5fZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywgaW50IHNhbXBsZV9yYXRlLCBpbnQgYXBwbHlfbWFwKQoreworICAgIEFWTEZHIHNlZWRfZ2VuOworICAgIERpdGhlckNvbnRleHQgKmM7CisgICAgaW50IGNoOworCisgICAgaWYgKGF2X2dldF9wYWNrZWRfc2FtcGxlX2ZtdChvdXRfZm10KSAhPSBBVl9TQU1QTEVfRk1UX1MxNiB8fAorICAgICAgICBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShpbl9mbXQpIDw9IDIpIHsKKyAgICAgICAgYXZfbG9nKGF2ciwgQVZfTE9HX0VSUk9SLCAiZGl0aGVyaW5nICVzIHRvICVzIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGluX2ZtdCksIGF2X2dldF9zYW1wbGVfZm10X25hbWUob3V0X2ZtdCkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjID0gYXZfbWFsbG9jeihzaXplb2YoKmMpKTsKKyAgICBpZiAoIWMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYy0+YXBwbHlfbWFwID0gYXBwbHlfbWFwOworICAgIGlmIChhcHBseV9tYXApCisgICAgICAgIGMtPmNoX21hcF9pbmZvID0gJmF2ci0+Y2hfbWFwX2luZm87CisKKyAgICBpZiAoYXZyLT5kaXRoZXJfbWV0aG9kID09IEFWX1JFU0FNUExFX0RJVEhFUl9UUklBTkdVTEFSX05TICYmCisgICAgICAgIHNhbXBsZV9yYXRlICE9IDQ4MDAwICYmIHNhbXBsZV9yYXRlICE9IDQ0MTAwKSB7CisgICAgICAgIGF2X2xvZyhhdnIsIEFWX0xPR19XQVJOSU5HLCAic2FtcGxlIHJhdGUgbXVzdCBiZSA0ODAwMCBvciA0NDEwMCBIeiAiCisgICAgICAgICAgICAgICAiZm9yIHRyaWFuZ3VsYXJfbnMgZGl0aGVyLiB1c2luZyB0cmlhbmd1bGFyX2hwIGluc3RlYWQuXG4iKTsKKyAgICAgICAgYXZyLT5kaXRoZXJfbWV0aG9kID0gQVZfUkVTQU1QTEVfRElUSEVSX1RSSUFOR1VMQVJfSFA7CisgICAgfQorICAgIGMtPm1ldGhvZCA9IGF2ci0+ZGl0aGVyX21ldGhvZDsKKyAgICBkaXRoZXJfaW5pdCgmYy0+ZGRzcCwgYy0+bWV0aG9kKTsKKworICAgIGlmIChjLT5tZXRob2QgPT0gQVZfUkVTQU1QTEVfRElUSEVSX1RSSUFOR1VMQVJfTlMpIHsKKyAgICAgICAgaWYgKHNhbXBsZV9yYXRlID09IDQ4MDAwKSB7CisgICAgICAgICAgICBjLT5uc19jb2VmX2IgPSBuc180OF9jb2VmX2I7CisgICAgICAgICAgICBjLT5uc19jb2VmX2EgPSBuc180OF9jb2VmX2E7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjLT5uc19jb2VmX2IgPSBuc180NF9jb2VmX2I7CisgICAgICAgICAgICBjLT5uc19jb2VmX2EgPSBuc180NF9jb2VmX2E7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFaXRoZXIgczE2IG9yIHMxNnAgb3V0cHV0IGZvcm1hdCBpcyBhbGxvd2VkLCBidXQgczE2cCBpcyB1c2VkCisgICAgICAgaW50ZXJuYWxseSwgc28gd2UgbmVlZCB0byB1c2UgYSB0ZW1wIGJ1ZmZlciBhbmQgaW50ZXJsZWF2ZSBpZiB0aGUgb3V0cHV0CisgICAgICAgZm9ybWF0IGlzIHMxNiAqLworICAgIGlmIChvdXRfZm10ICE9IEFWX1NBTVBMRV9GTVRfUzE2UCkgeworICAgICAgICBjLT5zMTZfZGF0YSA9IGZmX2F1ZGlvX2RhdGFfYWxsb2MoY2hhbm5lbHMsIDEwMjQsIEFWX1NBTVBMRV9GTVRfUzE2UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXRoZXIgczE2IGJ1ZmZlciIpOworICAgICAgICBpZiAoIWMtPnMxNl9kYXRhKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIGMtPmFjX291dCA9IGZmX2F1ZGlvX2NvbnZlcnRfYWxsb2MoYXZyLCBvdXRfZm10LCBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsIHNhbXBsZV9yYXRlLCAwKTsKKyAgICAgICAgaWYgKCFjLT5hY19vdXQpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGluX2ZtdCAhPSBBVl9TQU1QTEVfRk1UX0ZMVFAgfHwgYy0+YXBwbHlfbWFwKSB7CisgICAgICAgIGMtPmZsdF9kYXRhID0gZmZfYXVkaW9fZGF0YV9hbGxvYyhjaGFubmVscywgMTAyNCwgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpdGhlciBmbHQgYnVmZmVyIik7CisgICAgICAgIGlmICghYy0+Zmx0X2RhdGEpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChpbl9mbXQgIT0gQVZfU0FNUExFX0ZNVF9GTFRQKSB7CisgICAgICAgIGMtPmFjX2luID0gZmZfYXVkaW9fY29udmVydF9hbGxvYyhhdnIsIEFWX1NBTVBMRV9GTVRfRkxUUCwgaW5fZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsIHNhbXBsZV9yYXRlLCBjLT5hcHBseV9tYXApOworICAgICAgICBpZiAoIWMtPmFjX2luKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGMtPnN0YXRlID0gYXZfbWFsbG9jeihjaGFubmVscyAqIHNpemVvZigqYy0+c3RhdGUpKTsKKyAgICBpZiAoIWMtPnN0YXRlKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgYy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKworICAgIC8qIGNhbGN1bGF0ZSB0aHJlc2hvbGRzIGZvciB0dXJuaW5nIG9mZiBkaXRoZXJpbmcgZHVyaW5nIHBlcmlvZHMgb2YKKyAgICAgICBzaWxlbmNlIHRvIGF2b2lkIHJlcGxhY2luZyBkaWdpdGFsIHNpbGVuY2Ugd2l0aCBxdWlldCBkaXRoZXIgbm9pc2UgKi8KKyAgICBjLT5tdXRlX2RpdGhlcl90aHJlc2hvbGQgPSBscmludGYoc2FtcGxlX3JhdGUgKiBNVVRFX1RIUkVTSE9MRF9TRUMpOworICAgIGMtPm11dGVfcmVzZXRfdGhyZXNob2xkICA9IGMtPm11dGVfZGl0aGVyX3RocmVzaG9sZCAqIDQ7CisKKyAgICAvKiBpbml0aWFsaXplIGRpdGhlciBzdGF0ZXMgKi8KKyAgICBhdl9sZmdfaW5pdCgmc2VlZF9nZW4sIDB4QzBGRkVFKTsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICBEaXRoZXJTdGF0ZSAqc3RhdGUgPSAmYy0+c3RhdGVbY2hdOworICAgICAgICBzdGF0ZS0+bXV0ZSA9IGMtPm11dGVfcmVzZXRfdGhyZXNob2xkICsgMTsKKyAgICAgICAgc3RhdGUtPnNlZWQgPSBhdl9sZmdfZ2V0KCZzZWVkX2dlbik7CisgICAgICAgIGdlbmVyYXRlX2RpdGhlcl9ub2lzZShjLCBzdGF0ZSwgRkZNQVgoMzI3NjgsIHNhbXBsZV9yYXRlIC8gMikpOworICAgIH0KKworICAgIHJldHVybiBjOworCitmYWlsOgorICAgIGZmX2RpdGhlcl9mcmVlKCZjKTsKKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2RpdGhlci5oIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvZGl0aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzZTgyMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL2RpdGhlci5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlJFU0FNUExFX0RJVEhFUl9ICisjZGVmaW5lIEFWUkVTQU1QTEVfRElUSEVSX0gKKworI2luY2x1ZGUgImF2cmVzYW1wbGUuaCIKKyNpbmNsdWRlICJhdWRpb19kYXRhLmgiCisKK3R5cGVkZWYgc3RydWN0IERpdGhlckNvbnRleHQgRGl0aGVyQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgRGl0aGVyRFNQQ29udGV4dCB7CisgICAgLyoqCisgICAgICogQ29udmVydCBzYW1wbGVzIGZyb20gZmx0IHRvIHMxNiB3aXRoIGFkZGVkIGRpdGhlciBub2lzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkc3QgICAgZGVzdGluYXRpb24gZmxvYXQgYXJyYXksIHJhbmdlIC0wLjUgdG8gMC41CisgICAgICogQHBhcmFtIHNyYyAgICBzb3VyY2UgaW50IGFycmF5LCByYW5nZSBJTlRfTUlOIHRvIElOVF9NQVguCisgICAgICogQHBhcmFtIGRpdGhlciBmbG9hdCBkaXRoZXIgbm9pc2UgYXJyYXkKKyAgICAgKiBAcGFyYW0gbGVuICAgIG51bWJlciBvZiBzYW1wbGVzCisgICAgICovCisgICAgdm9pZCAoKnF1YW50aXplKShpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGZsb2F0ICpkaXRoZXIsIGludCBsZW4pOworCisgICAgaW50IHB0cl9hbGlnbjsgICAgICAvLy88IHNyYyBhbmQgZHN0IGNvbnN0cmFpdHMgZm9yIHF1YW50aXplKCkKKyAgICBpbnQgc2FtcGxlc19hbGlnbjsgIC8vLzwgbGVuIGNvbnN0cmFpdHMgZm9yIHF1YW50aXplKCkKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZGl0aGVyIG5vaXNlIGZyb20gaW50IHRvIGZsb2F0IHdpdGggdHJpYW5ndWxhciBkaXN0cmlidXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHN0ICBkZXN0aW5hdGlvbiBmbG9hdCBhcnJheSwgcmFuZ2UgLTAuNSB0byAwLjUKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogMzItYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIHNyYzAgc291cmNlIGludCBhcnJheSwgcmFuZ2UgSU5UX01JTiB0byBJTlRfTUFYLgorICAgICAqICAgICAgICAgICAgIHRoZSBhcnJheSBzaXplIGlzIGxlbiAqIDIKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogMzItYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIGxlbiAgbnVtYmVyIG9mIG91dHB1dCBub2lzZSBzYW1wbGVzCisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IG11bHRpcGxlIG9mIDE2CisgICAgICovCisgICAgdm9pZCAoKmRpdGhlcl9pbnRfdG9fZmxvYXQpKGZsb2F0ICpkc3QsIGludCAqc3JjMCwgaW50IGxlbik7Cit9IERpdGhlckRTUENvbnRleHQ7CisKKy8qKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBEaXRoZXJDb250ZXh0LgorICoKKyAqIFRoZSBwYXJhbWV0ZXJzIGluIHRoZSBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0IGFyZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlCisgKiBEaXRoZXJDb250ZXh0LgorICoKKyAqIEBwYXJhbSBhdnIgIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQKKyAqIEByZXR1cm4gICAgIG5ld2x5LWFsbG9jYXRlZCBEaXRoZXJDb250ZXh0CisgKi8KK0RpdGhlckNvbnRleHQgKmZmX2RpdGhlcl9hbGxvYyhBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW5fZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywgaW50IHNhbXBsZV9yYXRlLCBpbnQgYXBwbHlfbWFwKTsKKworLyoqCisgKiBGcmVlIGEgRGl0aGVyQ29udGV4dC4KKyAqCisgKiBAcGFyYW0gYyAgRGl0aGVyQ29udGV4dAorICovCit2b2lkIGZmX2RpdGhlcl9mcmVlKERpdGhlckNvbnRleHQgKipjKTsKKworLyoqCisgKiBDb252ZXJ0IGF1ZGlvIHNhbXBsZSBmb3JtYXQgd2l0aCBkaXRoZXJpbmcuCisgKgorICogQHBhcmFtIGMgICAgRGl0aGVyQ29udGV4dAorICogQHBhcmFtIGRzdCAgZGVzdGluYXRpb24gYXVkaW8gZGF0YQorICogQHBhcmFtIHNyYyAgc291cmNlIGF1ZGlvIGRhdGEKKyAqIEByZXR1cm4gICAgIDAgaWYgb2ssIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBmZl9jb252ZXJ0X2RpdGhlcihEaXRoZXJDb250ZXh0ICpjLCBBdWRpb0RhdGEgKmRzdCwgQXVkaW9EYXRhICpzcmMpOworCisvKiBhcmNoLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCit2b2lkIGZmX2RpdGhlcl9pbml0X3g4NihEaXRoZXJEU1BDb250ZXh0ICpkZHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlJlc2FtcGxlRGl0aGVyTWV0aG9kIG1ldGhvZCk7CisKKyNlbmRpZiAvKiBBVlJFU0FNUExFX0RJVEhFUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9pbnRlcm5hbC5oIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTZiZDhmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvaW50ZXJuYWwuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBKdXN0aW4gUnVnZ2xlcyA8anVzdGluLnJ1Z2dsZXNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWUkVTQU1QTEVfSU5URVJOQUxfSAorI2RlZmluZSBBVlJFU0FNUExFX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdWRpb19maWZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAiYXZyZXNhbXBsZS5oIgorCit0eXBlZGVmIHN0cnVjdCBBdWRpb0RhdGEgQXVkaW9EYXRhOwordHlwZWRlZiBzdHJ1Y3QgQXVkaW9Db252ZXJ0IEF1ZGlvQ29udmVydDsKK3R5cGVkZWYgc3RydWN0IEF1ZGlvTWl4IEF1ZGlvTWl4OwordHlwZWRlZiBzdHJ1Y3QgUmVzYW1wbGVDb250ZXh0IFJlc2FtcGxlQ29udGV4dDsKKworZW51bSBSZW1hcFBvaW50IHsKKyAgICBSRU1BUF9OT05FLAorICAgIFJFTUFQX0lOX0NPUFksCisgICAgUkVNQVBfSU5fQ09OVkVSVCwKKyAgICBSRU1BUF9PVVRfQ09QWSwKKyAgICBSRU1BUF9PVVRfQ09OVkVSVCwKK307CisKK3R5cGVkZWYgc3RydWN0IENoYW5uZWxNYXBJbmZvIHsKKyAgICBpbnQgY2hhbm5lbF9tYXBbQVZSRVNBTVBMRV9NQVhfQ0hBTk5FTFNdOyAgIC8qKjwgc291cmNlIGluZGV4IG9mIGVhY2ggb3V0cHV0IGNoYW5uZWwsIC0xIGlmIG5vdCByZW1hcHBlZCAqLworICAgIGludCBkb19yZW1hcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCByZW1hcCBuZWVkZWQgKi8KKyAgICBpbnQgY2hhbm5lbF9jb3B5W0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsgIC8qKjwgZGVzdCBpbmRleCB0byBjb3B5IGZyb20gKi8KKyAgICBpbnQgZG9fY29weTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgY29weSBuZWVkZWQgKi8KKyAgICBpbnQgY2hhbm5lbF96ZXJvW0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsgIC8qKjwgZGVzdCBpbmRleCB0byB6ZXJvICovCisgICAgaW50IGRvX3plcm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHplcm9pbmcgbmVlZGVkICovCisgICAgaW50IGlucHV0X21hcFtBVlJFU0FNUExFX01BWF9DSEFOTkVMU107ICAgICAvKio8IGRlc3QgaW5kZXggb2YgZWFjaCBpbnB1dCBjaGFubmVsICovCit9IENoYW5uZWxNYXBJbmZvOworCitzdHJ1Y3QgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqYXZfY2xhc3M7ICAgICAgICAvKio8IEFWQ2xhc3MgZm9yIGxvZ2dpbmcgYW5kIEFWT3B0aW9ucyAgKi8KKworICAgIHVpbnQ2NF90IGluX2NoYW5uZWxfbGF5b3V0OyAgICAgICAgICAgICAgICAgLyoqPCBpbnB1dCBjaGFubmVsIGxheW91dCAgICovCisgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBpbl9zYW1wbGVfZm10OyAgICAgICAgICAvKio8IGlucHV0IHNhbXBsZSBmb3JtYXQgICAgKi8KKyAgICBpbnQgaW5fc2FtcGxlX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgaW5wdXQgc2FtcGxlIHJhdGUgICAgICAqLworICAgIHVpbnQ2NF90IG91dF9jaGFubmVsX2xheW91dDsgICAgICAgICAgICAgICAgLyoqPCBvdXRwdXQgY2hhbm5lbCBsYXlvdXQgICovCisgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfc2FtcGxlX2ZtdDsgICAgICAgICAvKio8IG91dHB1dCBzYW1wbGUgZm9ybWF0ICAgKi8KKyAgICBpbnQgb3V0X3NhbXBsZV9yYXRlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgb3V0cHV0IHNhbXBsZSByYXRlICAgICAqLworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW50ZXJuYWxfc2FtcGxlX2ZtdDsgICAgLyoqPCBpbnRlcm5hbCBzYW1wbGUgZm9ybWF0ICovCisgICAgZW51bSBBVk1peENvZWZmVHlwZSBtaXhfY29lZmZfdHlwZTsgICAgICAgICAvKio8IG1peGluZyBjb2VmZmljaWVudCB0eXBlICovCisgICAgZG91YmxlIGNlbnRlcl9taXhfbGV2ZWw7ICAgICAgICAgICAgICAgICAgICAvKio8IGNlbnRlciBtaXggbGV2ZWwgICAgICAgKi8KKyAgICBkb3VibGUgc3Vycm91bmRfbWl4X2xldmVsOyAgICAgICAgICAgICAgICAgIC8qKjwgc3Vycm91bmQgbWl4IGxldmVsICAgICAqLworICAgIGRvdWJsZSBsZmVfbWl4X2xldmVsOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBsZmUgbWl4IGxldmVsICAgICAgICAgICovCisgICAgaW50IG5vcm1hbGl6ZV9taXhfbGV2ZWw7ICAgICAgICAgICAgICAgICAgICAvKio8IGVuYWJsZSBtaXggbGV2ZWwgbm9ybWFsaXphdGlvbiAqLworICAgIGludCBmb3JjZV9yZXNhbXBsaW5nOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBmb3JjZSByZXNhbXBsaW5nICAgICAgICovCisgICAgaW50IGZpbHRlcl9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGxlbmd0aCBvZiBlYWNoIEZJUiBmaWx0ZXIgaW4gdGhlIHJlc2FtcGxpbmcgZmlsdGVyYmFuayByZWxhdGl2ZSB0byB0aGUgY3V0b2ZmIGZyZXF1ZW5jeSAqLworICAgIGludCBwaGFzZV9zaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBsb2cyIG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcmVzYW1wbGluZyBwb2x5cGhhc2UgZmlsdGVyYmFuayAqLworICAgIGludCBsaW5lYXJfaW50ZXJwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBpZiAxIHRoZW4gdGhlIHJlc2FtcGxpbmcgRklSIGZpbHRlciB3aWxsIGJlIGxpbmVhcmx5IGludGVycG9sYXRlZCAqLworICAgIGRvdWJsZSBjdXRvZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCByZXNhbXBsaW5nIGN1dG9mZiBmcmVxdWVuY3kuIDEuMCBjb3JyZXNwb25kcyB0byBoYWxmIHRoZSBvdXRwdXQgc2FtcGxlIHJhdGUgKi8KKyAgICBlbnVtIEFWUmVzYW1wbGVGaWx0ZXJUeXBlIGZpbHRlcl90eXBlOyAgICAgIC8qKjwgcmVzYW1wbGluZyBmaWx0ZXIgdHlwZSAqLworICAgIGludCBrYWlzZXJfYmV0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiZXRhIHZhbHVlIGZvciBLYWlzZXIgd2luZG93IChvbmx5IGFwcGxpY2FibGUgaWYgZmlsdGVyX3R5cGUgPT0gQVZfRklMVEVSX1RZUEVfS0FJU0VSKSAqLworICAgIGVudW0gQVZSZXNhbXBsZURpdGhlck1ldGhvZCBkaXRoZXJfbWV0aG9kOyAgLyoqPCBkaXRoZXIgbWV0aG9kICAgICAgICAgICovCisKKyAgICBpbnQgaW5fY2hhbm5lbHM7ICAgICAgICAvKio8IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBvdXRfY2hhbm5lbHM7ICAgICAgIC8qKjwgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAgICAgICAgICAgICAgICAgICovCisgICAgaW50IHJlc2FtcGxlX2NoYW5uZWxzOyAgLyoqPCBudW1iZXIgb2YgY2hhbm5lbHMgdXNlZCBmb3IgcmVzYW1wbGluZyAgICAgKi8KKyAgICBpbnQgZG93bm1peF9uZWVkZWQ7ICAgICAvKio8IGRvd25taXhpbmcgaXMgbmVlZGVkICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCB1cG1peF9uZWVkZWQ7ICAgICAgIC8qKjwgdXBtaXhpbmcgaXMgbmVlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IG1peGluZ19uZWVkZWQ7ICAgICAgLyoqPCBlaXRoZXIgdXBtaXhpbmcgb3IgZG93bm1peGluZyBpcyBuZWVkZWQgICAgKi8KKyAgICBpbnQgcmVzYW1wbGVfbmVlZGVkOyAgICAvKio8IHJlc2FtcGxpbmcgaXMgbmVlZGVkICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9jb252ZXJ0X25lZWRlZDsgIC8qKjwgaW5wdXQgc2FtcGxlIGZvcm1hdCBjb252ZXJzaW9uIGlzIG5lZWRlZCAgICovCisgICAgaW50IG91dF9jb252ZXJ0X25lZWRlZDsgLyoqPCBvdXRwdXQgc2FtcGxlIGZvcm1hdCBjb252ZXJzaW9uIGlzIG5lZWRlZCAgKi8KKyAgICBpbnQgaW5fY29weV9uZWVkZWQ7ICAgICAvKio8IGlucHV0IGRhdGEgY29weSBpcyBuZWVkZWQgICAgICAgICAgICAgICAgICAqLworCisgICAgQXVkaW9EYXRhICppbl9idWZmZXI7ICAgICAgICAgICAvKio8IGJ1ZmZlciBmb3IgY29udmVydGVkIGlucHV0ICAgICAgICAgKi8KKyAgICBBdWRpb0RhdGEgKnJlc2FtcGxlX291dF9idWZmZXI7IC8qKjwgYnVmZmVyIGZvciBvdXRwdXQgZnJvbSByZXNhbXBsZXIgICAqLworICAgIEF1ZGlvRGF0YSAqb3V0X2J1ZmZlcjsgICAgICAgICAgLyoqPCBidWZmZXIgZm9yIGNvbnZlcnRlZCBvdXRwdXQgICAgICAgICovCisgICAgQVZBdWRpb0ZpZm8gKm91dF9maWZvOyAgICAgICAgICAvKio8IEZJRk8gZm9yIG91dHB1dCBzYW1wbGVzICAgICAgICAgICAgKi8KKworICAgIEF1ZGlvQ29udmVydCAqYWNfaW47ICAgICAgICAvKio8IGlucHV0IHNhbXBsZSBmb3JtYXQgY29udmVyc2lvbiBjb250ZXh0ICAqLworICAgIEF1ZGlvQ29udmVydCAqYWNfb3V0OyAgICAgICAvKio8IG91dHB1dCBzYW1wbGUgZm9ybWF0IGNvbnZlcnNpb24gY29udGV4dCAqLworICAgIFJlc2FtcGxlQ29udGV4dCAqcmVzYW1wbGU7ICAvKio8IHJlc2FtcGxpbmcgY29udGV4dCAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEF1ZGlvTWl4ICphbTsgICAgICAgICAgICAgICAvKio8IGNoYW5uZWwgbWl4aW5nIGNvbnRleHQgICAgICAgICAgICAgICAgICAqLworICAgIGVudW0gQVZNYXRyaXhFbmNvZGluZyBtYXRyaXhfZW5jb2Rpbmc7ICAgICAgLyoqPCBtYXRyaXhlZCBzdGVyZW8gZW5jb2RpbmcgKi8KKworICAgIC8qKgorICAgICAqIG1peCBtYXRyaXgKKyAgICAgKiBvbmx5IHVzZWQgaWYgYXZyZXNhbXBsZV9zZXRfbWF0cml4KCkgaXMgY2FsbGVkIGJlZm9yZSBhdnJlc2FtcGxlX29wZW4oKQorICAgICAqLworICAgIGRvdWJsZSAqbWl4X21hdHJpeDsKKworICAgIGludCB1c2VfY2hhbm5lbF9tYXA7CisgICAgZW51bSBSZW1hcFBvaW50IHJlbWFwX3BvaW50OworICAgIENoYW5uZWxNYXBJbmZvIGNoX21hcF9pbmZvOworfTsKKworCit2b2lkIGZmX2F1ZGlvX3Jlc2FtcGxlX2luaXRfYWFyY2g2NChSZXNhbXBsZUNvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQpOworI2VuZGlmIC8qIEFWUkVTQU1QTEVfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUvbGliYXZyZXNhbXBsZS52IGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvbGliYXZyZXNhbXBsZS52Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzdjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9saWJhdnJlc2FtcGxlLnYKQEAgLTAsMCArMSw0IEBACitMSUJBVlJFU0FNUExFXyRNQUpPUiB7CisgICAgICAgIGdsb2JhbDogYXYqOworICAgICAgICBsb2NhbDogICo7Cit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUvb3B0aW9ucy5jIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvb3B0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMDhjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS9vcHRpb25zLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdnJlc2FtcGxlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdWRpb19taXguaCIKKworLyoqCisgKiBAZmlsZQorICogT3B0aW9ucyBkZWZpbml0aW9uIGZvciBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0LgorICovCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQsIHgpCisjZGVmaW5lIFBBUkFNIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhdnJlc2FtcGxlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJpbl9jaGFubmVsX2xheW91dCIsICAgICAgIklucHV0IENoYW5uZWwgTGF5b3V0IiwgICAgIE9GRlNFVChpbl9jaGFubmVsX2xheW91dCksICAgICAgQVZfT1BUX1RZUEVfSU5UNjQsICB7IC5pNjQgPSAwICAgICAgICAgICAgICB9LCBJTlQ2NF9NSU4sICAgICAgICAgICAgSU5UNjRfTUFYLCAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJpbl9zYW1wbGVfZm10IiwgICAgICAgICAgIklucHV0IFNhbXBsZSBGb3JtYXQiLCAgICAgIE9GRlNFVChpbl9zYW1wbGVfZm10KSwgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSBBVl9TQU1QTEVfRk1UX1MxNiB9LCBBVl9TQU1QTEVfRk1UX1U4LCAgICAgQVZfU0FNUExFX0ZNVF9OQi0xLCAgICAgUEFSQU0gfSwKKyAgICB7ICJpbl9zYW1wbGVfcmF0ZSIsICAgICAgICAgIklucHV0IFNhbXBsZSBSYXRlIiwgICAgICAgIE9GRlNFVChpbl9zYW1wbGVfcmF0ZSksICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSA0ODAwMCAgICAgICAgICB9LCAxLCAgICAgICAgICAgICAgICAgICAgSU5UX01BWCwgICAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJvdXRfY2hhbm5lbF9sYXlvdXQiLCAgICAgIk91dHB1dCBDaGFubmVsIExheW91dCIsICAgIE9GRlNFVChvdXRfY2hhbm5lbF9sYXlvdXQpLCAgICAgQVZfT1BUX1RZUEVfSU5UNjQsICB7IC5pNjQgPSAwICAgICAgICAgICAgICB9LCBJTlQ2NF9NSU4sICAgICAgICAgICAgSU5UNjRfTUFYLCAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJvdXRfc2FtcGxlX2ZtdCIsICAgICAgICAgIk91dHB1dCBTYW1wbGUgRm9ybWF0IiwgICAgIE9GRlNFVChvdXRfc2FtcGxlX2ZtdCksICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSBBVl9TQU1QTEVfRk1UX1MxNiB9LCBBVl9TQU1QTEVfRk1UX1U4LCAgICAgQVZfU0FNUExFX0ZNVF9OQi0xLCAgICAgUEFSQU0gfSwKKyAgICB7ICJvdXRfc2FtcGxlX3JhdGUiLCAgICAgICAgIk91dHB1dCBTYW1wbGUgUmF0ZSIsICAgICAgIE9GRlNFVChvdXRfc2FtcGxlX3JhdGUpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSA0ODAwMCAgICAgICAgICB9LCAxLCAgICAgICAgICAgICAgICAgICAgSU5UX01BWCwgICAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJpbnRlcm5hbF9zYW1wbGVfZm10IiwgICAgIkludGVybmFsIFNhbXBsZSBGb3JtYXQiLCAgIE9GRlNFVChpbnRlcm5hbF9zYW1wbGVfZm10KSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSBBVl9TQU1QTEVfRk1UX05PTkUgfSwgQVZfU0FNUExFX0ZNVF9OT05FLCAgIEFWX1NBTVBMRV9GTVRfTkItMSwgICAgIFBBUkFNLCAiaW50ZXJuYWxfc2FtcGxlX2ZtdCIgfSwKKyAgICAgICAgeyJ1OCIgLCAgIjgtYml0IHVuc2lnbmVkIGludGVnZXIiLCAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfU0FNUExFX0ZNVF9VOCAgIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAiaW50ZXJuYWxfc2FtcGxlX2ZtdCJ9LAorICAgICAgICB7InMxNiIsICAiMTYtYml0IHNpZ25lZCBpbnRlZ2VyIiwgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9TQU1QTEVfRk1UX1MxNiAgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJpbnRlcm5hbF9zYW1wbGVfZm10In0sCisgICAgICAgIHsiczMyIiwgICIzMi1iaXQgc2lnbmVkIGludGVnZXIiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX1NBTVBMRV9GTVRfUzMyICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBQQVJBTSwgImludGVybmFsX3NhbXBsZV9mbXQifSwKKyAgICAgICAgeyJmbHQiLCAgIjMyLWJpdCBmbG9hdCIsICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfU0FNUExFX0ZNVF9GTFQgIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAiaW50ZXJuYWxfc2FtcGxlX2ZtdCJ9LAorICAgICAgICB7ImRibCIsICAiNjQtYml0IGRvdWJsZSIsICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9TQU1QTEVfRk1UX0RCTCAgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJpbnRlcm5hbF9zYW1wbGVfZm10In0sCisgICAgICAgIHsidThwIiAsICI4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHBsYW5hciIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX1NBTVBMRV9GTVRfVThQICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBQQVJBTSwgImludGVybmFsX3NhbXBsZV9mbXQifSwKKyAgICAgICAgeyJzMTZwIiwgIjE2LWJpdCBzaWduZWQgaW50ZWdlciBwbGFuYXIiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfU0FNUExFX0ZNVF9TMTZQIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAiaW50ZXJuYWxfc2FtcGxlX2ZtdCJ9LAorICAgICAgICB7InMzMnAiLCAiMzItYml0IHNpZ25lZCBpbnRlZ2VyIHBsYW5hciIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9TQU1QTEVfRk1UX1MzMlAgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJpbnRlcm5hbF9zYW1wbGVfZm10In0sCisgICAgICAgIHsiZmx0cCIsICIzMi1iaXQgZmxvYXQgcGxhbmFyIiwgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX1NBTVBMRV9GTVRfRkxUUCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBQQVJBTSwgImludGVybmFsX3NhbXBsZV9mbXQifSwKKyAgICAgICAgeyJkYmxwIiwgIjY0LWJpdCBkb3VibGUgcGxhbmFyIiwgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfU0FNUExFX0ZNVF9EQkxQIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAiaW50ZXJuYWxfc2FtcGxlX2ZtdCJ9LAorICAgIHsgIm1peF9jb2VmZl90eXBlIiwgICAgICAgICAiTWl4aW5nIENvZWZmaWNpZW50IFR5cGUiLCAgT0ZGU0VUKG1peF9jb2VmZl90eXBlKSwgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IEFWX01JWF9DT0VGRl9UWVBFX0ZMVCB9LCBBVl9NSVhfQ09FRkZfVFlQRV9ROCwgQVZfTUlYX0NPRUZGX1RZUEVfTkItMSwgUEFSQU0sICJtaXhfY29lZmZfdHlwZSIgfSwKKyAgICAgICAgeyAicTgiLCAgIjE2LWJpdCA4LjggRml4ZWQtUG9pbnQiLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9NSVhfQ09FRkZfVFlQRV9ROCAgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJtaXhfY29lZmZfdHlwZSIgfSwKKyAgICAgICAgeyAicTE1IiwgIjMyLWJpdCAxNy4xNSBGaXhlZC1Qb2ludCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9NSVhfQ09FRkZfVFlQRV9RMTUgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJtaXhfY29lZmZfdHlwZSIgfSwKKyAgICAgICAgeyAiZmx0IiwgIkZsb2F0aW5nLVBvaW50IiwgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9NSVhfQ09FRkZfVFlQRV9GTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJtaXhfY29lZmZfdHlwZSIgfSwKKyAgICB7ICJjZW50ZXJfbWl4X2xldmVsIiwgICAgICAgIkNlbnRlciBNaXggTGV2ZWwiLCAgICAgICAgIE9GRlNFVChjZW50ZXJfbWl4X2xldmVsKSwgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSBNX1NRUlQxXzIgICAgICB9LCAtMzIuMCwgICAgICAgICAgICAgICAgMzIuMCwgICAgICAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJzdXJyb3VuZF9taXhfbGV2ZWwiLCAgICAgIlN1cnJvdW5kIE1peCBMZXZlbCIsICAgICAgIE9GRlNFVChzdXJyb3VuZF9taXhfbGV2ZWwpLCAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSBNX1NRUlQxXzIgICAgICB9LCAtMzIuMCwgICAgICAgICAgICAgICAgMzIuMCwgICAgICAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJsZmVfbWl4X2xldmVsIiwgICAgICAgICAgIkxGRSBNaXggTGV2ZWwiLCAgICAgICAgICAgIE9GRlNFVChsZmVfbWl4X2xldmVsKSwgICAgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSAwLjAgICAgICAgICAgICB9LCAtMzIuMCwgICAgICAgICAgICAgICAgMzIuMCwgICAgICAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJub3JtYWxpemVfbWl4X2xldmVsIiwgICAgIk5vcm1hbGl6ZSBNaXggTGV2ZWwiLCAgICAgIE9GRlNFVChub3JtYWxpemVfbWl4X2xldmVsKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAxICAgICAgICAgICAgICB9LCAwLCAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJmb3JjZV9yZXNhbXBsaW5nIiwgICAgICAgIkZvcmNlIFJlc2FtcGxpbmciLCAgICAgICAgIE9GRlNFVChmb3JjZV9yZXNhbXBsaW5nKSwgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAwICAgICAgICAgICAgICB9LCAwLCAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJmaWx0ZXJfc2l6ZSIsICAgICAgICAgICAgIlJlc2FtcGxpbmcgRmlsdGVyIFNpemUiLCAgIE9GRlNFVChmaWx0ZXJfc2l6ZSksICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAxNiAgICAgICAgICAgICB9LCAwLCAgICAgICAgICAgICAgICAgICAgMzIsIC8qID8/PyAqLyAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJwaGFzZV9zaGlmdCIsICAgICAgICAgICAgIlJlc2FtcGxpbmcgUGhhc2UgU2hpZnQiLCAgIE9GRlNFVChwaGFzZV9zaGlmdCksICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAxMCAgICAgICAgICAgICB9LCAwLCAgICAgICAgICAgICAgICAgICAgMzAsIC8qID8/PyAqLyAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJsaW5lYXJfaW50ZXJwIiwgICAgICAgICAgIlVzZSBMaW5lYXIgSW50ZXJwb2xhdGlvbiIsIE9GRlNFVChsaW5lYXJfaW50ZXJwKSwgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAwICAgICAgICAgICAgICB9LCAwLCAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJjdXRvZmYiLCAgICAgICAgICAgICAgICAgIkN1dG9mZiBGcmVxdWVuY3kgUmF0aW8iLCAgIE9GRlNFVChjdXRvZmYpLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSAwLjggICAgICAgICAgICB9LCAwLjAsICAgICAgICAgICAgICAgICAgMS4wLCAgICAgICAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICAvKiBkdXBsaWNhdGUgb3B0aW9uIGluIG9yZGVyIHRvIHdvcmsgd2l0aCBhdmNvbnYgKi8KKyAgICB7ICJyZXNhbXBsZV9jdXRvZmYiLCAgICAgICAgIkN1dG9mZiBGcmVxdWVuY3kgUmF0aW8iLCAgIE9GRlNFVChjdXRvZmYpLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSAwLjggICAgICAgICAgICB9LCAwLjAsICAgICAgICAgICAgICAgICAgMS4wLCAgICAgICAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJtYXRyaXhfZW5jb2RpbmciLCAgICAgICAgIk1hdHJpeGVkIFN0ZXJlbyBFbmNvZGluZyIsIE9GRlNFVChtYXRyaXhfZW5jb2RpbmcpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9ICBBVl9NQVRSSVhfRU5DT0RJTkdfTk9ORX0sIEFWX01BVFJJWF9FTkNPRElOR19OT05FLCAgICAgQVZfTUFUUklYX0VOQ09ESU5HX05CLTEsIFBBUkFNLCAibWF0cml4X2VuY29kaW5nIiB9LAorICAgICAgICB7ICJub25lIiwgICJOb25lIiwgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfTUFUUklYX0VOQ09ESU5HX05PTkUgIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAibWF0cml4X2VuY29kaW5nIiB9LAorICAgICAgICB7ICJkb2xieSIsICJEb2xieSIsICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfTUFUUklYX0VOQ09ESU5HX0RPTEJZIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAibWF0cml4X2VuY29kaW5nIiB9LAorICAgICAgICB7ICJkcGxpaSIsICJEb2xieSBQcm8gTG9naWMgSUkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfTUFUUklYX0VOQ09ESU5HX0RQTElJIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAibWF0cml4X2VuY29kaW5nIiB9LAorICAgIHsgImZpbHRlcl90eXBlIiwgICAgICAgICAgICAiRmlsdGVyIFR5cGUiLCAgICAgICAgICAgICAgT0ZGU0VUKGZpbHRlcl90eXBlKSwgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IEFWX1JFU0FNUExFX0ZJTFRFUl9UWVBFX0tBSVNFUiB9LCBBVl9SRVNBTVBMRV9GSUxURVJfVFlQRV9DVUJJQywgQVZfUkVTQU1QTEVfRklMVEVSX1RZUEVfS0FJU0VSLCAgUEFSQU0sICJmaWx0ZXJfdHlwZSIgfSwKKyAgICAgICAgeyAiY3ViaWMiLCAgICAgICAgICAgICJDdWJpYyIsICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfUkVTQU1QTEVfRklMVEVSX1RZUEVfQ1VCSUMgICAgICAgICAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBQQVJBTSwgImZpbHRlcl90eXBlIiB9LAorICAgICAgICB7ICJibGFja21hbl9udXR0YWxsIiwgIkJsYWNrbWFuIE51dHRhbGwgV2luZG93ZWQgU2luYyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9SRVNBTVBMRV9GSUxURVJfVFlQRV9CTEFDS01BTl9OVVRUQUxMIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAiZmlsdGVyX3R5cGUiIH0sCisgICAgICAgIHsgImthaXNlciIsICAgICAgICAgICAiS2Fpc2VyIFdpbmRvd2VkIFNpbmMiLCAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX1JFU0FNUExFX0ZJTFRFUl9UWVBFX0tBSVNFUiAgICAgICAgICAgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJmaWx0ZXJfdHlwZSIgfSwKKyAgICB7ICJrYWlzZXJfYmV0YSIsICAgICAgICAgICAgIkthaXNlciBXaW5kb3cgQmV0YSIsICAgICAgIE9GRlNFVChrYWlzZXJfYmV0YSksICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSA5ICAgICAgICAgICAgICB9LCAyLCAgICAgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgICAgUEFSQU0gfSwKKyAgICB7ICJkaXRoZXJfbWV0aG9kIiwgICAgICAgICAgIkRpdGhlciBNZXRob2QiLCAgICAgICAgICAgIE9GRlNFVChkaXRoZXJfbWV0aG9kKSwgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSBBVl9SRVNBTVBMRV9ESVRIRVJfTk9ORSB9LCAwLCBBVl9SRVNBTVBMRV9ESVRIRVJfTkItMSwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCisgICAgICAgIHsibm9uZSIsICAgICAgICAgICJObyBEaXRoZXJpbmciLCAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfUkVTQU1QTEVfRElUSEVSX05PTkUgICAgICAgICAgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCisgICAgICAgIHsicmVjdGFuZ3VsYXIiLCAgICJSZWN0YW5ndWxhciBEaXRoZXIiLCAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfUkVTQU1QTEVfRElUSEVSX1JFQ1RBTkdVTEFSICAgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCisgICAgICAgIHsidHJpYW5ndWxhciIsICAgICJUcmlhbmd1bGFyIERpdGhlciIsICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfUkVTQU1QTEVfRElUSEVSX1RSSUFOR1VMQVIgICAgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCisgICAgICAgIHsidHJpYW5ndWxhcl9ocCIsICJUcmlhbmd1bGFyIERpdGhlciBXaXRoIEhpZ2ggUGFzcyIsICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfUkVTQU1QTEVfRElUSEVSX1RSSUFOR1VMQVJfSFAgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCisgICAgICAgIHsidHJpYW5ndWxhcl9ucyIsICJUcmlhbmd1bGFyIERpdGhlciBXaXRoIE5vaXNlIFNoYXBpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfUkVTQU1QTEVfRElUSEVSX1RSSUFOR1VMQVJfTlMgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBhdl9yZXNhbXBsZV9jb250ZXh0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIkFWQXVkaW9SZXNhbXBsZUNvbnRleHQiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBhdnJlc2FtcGxlX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnJlc2FtcGxlX2FsbG9jX2NvbnRleHQodm9pZCkKK3sKKyAgICBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnI7CisKKyAgICBhdnIgPSBhdl9tYWxsb2N6KHNpemVvZigqYXZyKSk7CisgICAgaWYgKCFhdnIpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYXZyLT5hdl9jbGFzcyA9ICZhdl9yZXNhbXBsZV9jb250ZXh0X2NsYXNzOworICAgIGF2X29wdF9zZXRfZGVmYXVsdHMoYXZyKTsKKworICAgIHJldHVybiBhdnI7Cit9CisKK2NvbnN0IEFWQ2xhc3MgKmF2cmVzYW1wbGVfZ2V0X2NsYXNzKHZvaWQpCit7CisgICAgcmV0dXJuICZhdl9yZXNhbXBsZV9jb250ZXh0X2NsYXNzOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUvcmVzYW1wbGUuYyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3Jlc2FtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjNzRhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3Jlc2FtcGxlLmMKQEAgLTAsMCArMSw1MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAxMiBKdXN0aW4gUnVnZ2xlcyA8anVzdGluLnJ1Z2dsZXNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9saWJtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicmVzYW1wbGUuaCIKKyNpbmNsdWRlICJhdWRpb19kYXRhLmgiCisKKworLyogZG91YmxlIHRlbXBsYXRlICovCisjZGVmaW5lIENPTkZJR19SRVNBTVBMRV9EQkwKKyNpbmNsdWRlICJyZXNhbXBsZV90ZW1wbGF0ZS5jIgorI3VuZGVmIENPTkZJR19SRVNBTVBMRV9EQkwKKworLyogZmxvYXQgdGVtcGxhdGUgKi8KKyNkZWZpbmUgQ09ORklHX1JFU0FNUExFX0ZMVAorI2luY2x1ZGUgInJlc2FtcGxlX3RlbXBsYXRlLmMiCisjdW5kZWYgQ09ORklHX1JFU0FNUExFX0ZMVAorCisvKiBzMzIgdGVtcGxhdGUgKi8KKyNkZWZpbmUgQ09ORklHX1JFU0FNUExFX1MzMgorI2luY2x1ZGUgInJlc2FtcGxlX3RlbXBsYXRlLmMiCisjdW5kZWYgQ09ORklHX1JFU0FNUExFX1MzMgorCisvKiBzMTYgdGVtcGxhdGUgKi8KKyNpbmNsdWRlICJyZXNhbXBsZV90ZW1wbGF0ZS5jIgorCisKKy8qIDB0aCBvcmRlciBtb2RpZmllZCBiZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQuICovCitzdGF0aWMgZG91YmxlIGJlc3NlbChkb3VibGUgeCkKK3sKKyAgICBkb3VibGUgdiAgICAgPSAxOworICAgIGRvdWJsZSBsYXN0diA9IDA7CisgICAgZG91YmxlIHQgICAgID0gMTsKKyAgICBpbnQgaTsKKworICAgIHggPSB4ICogeCAvIDQ7CisgICAgZm9yIChpID0gMTsgdiAhPSBsYXN0djsgaSsrKSB7CisgICAgICAgIGxhc3R2ID0gdjsKKyAgICAgICAgdCAgICAqPSB4IC8gKGkgKiBpKTsKKyAgICAgICAgdiAgICArPSB0OworICAgIH0KKyAgICByZXR1cm4gdjsKK30KKworLyogQnVpbGQgYSBwb2x5cGhhc2UgZmlsdGVyYmFuay4gKi8KK3N0YXRpYyBpbnQgYnVpbGRfZmlsdGVyKFJlc2FtcGxlQ29udGV4dCAqYywgZG91YmxlIGZhY3RvcikKK3sKKyAgICBpbnQgcGgsIGk7CisgICAgZG91YmxlIHgsIHksIHc7CisgICAgZG91YmxlICp0YWI7CisgICAgaW50IHRhcF9jb3VudCAgICA9IGMtPmZpbHRlcl9sZW5ndGg7CisgICAgaW50IHBoYXNlX2NvdW50ICA9IDEgPDwgYy0+cGhhc2Vfc2hpZnQ7CisgICAgY29uc3QgaW50IGNlbnRlciA9ICh0YXBfY291bnQgLSAxKSAvIDI7CisKKyAgICB0YWIgPSBhdl9tYWxsb2ModGFwX2NvdW50ICogc2l6ZW9mKCp0YWIpKTsKKyAgICBpZiAoIXRhYikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAocGggPSAwOyBwaCA8IHBoYXNlX2NvdW50OyBwaCsrKSB7CisgICAgICAgIGRvdWJsZSBub3JtID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhcF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICB4ID0gTV9QSSAqICgoZG91YmxlKShpIC0gY2VudGVyKSAtIChkb3VibGUpcGggLyBwaGFzZV9jb3VudCkgKiBmYWN0b3I7CisgICAgICAgICAgICBpZiAoeCA9PSAwKSB5ID0gMS4wOworICAgICAgICAgICAgZWxzZSAgICAgICAgeSA9IHNpbih4KSAvIHg7CisgICAgICAgICAgICBzd2l0Y2ggKGMtPmZpbHRlcl90eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFWX1JFU0FNUExFX0ZJTFRFUl9UWVBFX0NVQklDOiB7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgZCA9IC0wLjU7IC8vZmlyc3Qgb3JkZXIgZGVyaXZhdGl2ZSA9IC0wLjUKKyAgICAgICAgICAgICAgICB4ID0gZmFicygoKGRvdWJsZSkoaSAtIGNlbnRlcikgLSAoZG91YmxlKXBoIC8gcGhhc2VfY291bnQpICogZmFjdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAoeCA8IDEuMCkgeSA9IDEgLSAzICogeCp4ICsgMiAqIHgqeCp4ICsgZCAqICggICAgICAgICAgICAgICAgLXgqeCArIHgqeCp4KTsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgeSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgZCAqICgtNCArIDggKiB4IC0gNSAqIHgqeCArIHgqeCp4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVZfUkVTQU1QTEVfRklMVEVSX1RZUEVfQkxBQ0tNQU5fTlVUVEFMTDoKKyAgICAgICAgICAgICAgICB3ICA9IDIuMCAqIHggLyAoZmFjdG9yICogdGFwX2NvdW50KSArIE1fUEk7CisgICAgICAgICAgICAgICAgeSAqPSAwLjM2MzU4MTkgLSAwLjQ4OTE3NzUgKiBjb3MoICAgIHcpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTM2NTk5NSAqIGNvcygyICogdykgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTA2NDExICogY29zKDMgKiB3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUkVTQU1QTEVfRklMVEVSX1RZUEVfS0FJU0VSOgorICAgICAgICAgICAgICAgIHcgID0gMi4wICogeCAvIChmYWN0b3IgKiB0YXBfY291bnQgKiBNX1BJKTsKKyAgICAgICAgICAgICAgICB5ICo9IGJlc3NlbChjLT5rYWlzZXJfYmV0YSAqIHNxcnQoRkZNQVgoMSAtIHcgKiB3LCAwKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0YWJbaV0gPSB5OworICAgICAgICAgICAgbm9ybSAgKz0geTsKKyAgICAgICAgfQorICAgICAgICAvKiBub3JtYWxpemUgc28gdGhhdCBhbiB1bmlmb3JtIGNvbG9yIHJlbWFpbnMgdGhlIHNhbWUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhcF9jb3VudDsgaSsrKQorICAgICAgICAgICAgdGFiW2ldID0gdGFiW2ldIC8gbm9ybTsKKworICAgICAgICBjLT5zZXRfZmlsdGVyKGMtPmZpbHRlcl9iYW5rLCB0YWIsIHBoLCB0YXBfY291bnQpOworICAgIH0KKworICAgIGF2X2ZyZWUodGFiKTsKKyAgICByZXR1cm4gMDsKK30KKworUmVzYW1wbGVDb250ZXh0ICpmZl9hdWRpb19yZXNhbXBsZV9pbml0KEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2cikKK3sKKyAgICBSZXNhbXBsZUNvbnRleHQgKmM7CisgICAgaW50IG91dF9yYXRlICAgID0gYXZyLT5vdXRfc2FtcGxlX3JhdGU7CisgICAgaW50IGluX3JhdGUgICAgID0gYXZyLT5pbl9zYW1wbGVfcmF0ZTsKKyAgICBkb3VibGUgZmFjdG9yICAgPSBGRk1JTihvdXRfcmF0ZSAqIGF2ci0+Y3V0b2ZmIC8gaW5fcmF0ZSwgMS4wKTsKKyAgICBpbnQgcGhhc2VfY291bnQgPSAxIDw8IGF2ci0+cGhhc2Vfc2hpZnQ7CisgICAgaW50IGZlbGVtX3NpemU7CisKKyAgICBpZiAoYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10ICE9IEFWX1NBTVBMRV9GTVRfUzE2UCAmJgorICAgICAgICBhdnItPmludGVybmFsX3NhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9TMzJQICYmCisgICAgICAgIGF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdCAhPSBBVl9TQU1QTEVfRk1UX0ZMVFAgJiYKKyAgICAgICAgYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10ICE9IEFWX1NBTVBMRV9GTVRfREJMUCkgeworICAgICAgICBhdl9sb2coYXZyLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBpbnRlcm5hbCBmb3JtYXQgZm9yICIKKyAgICAgICAgICAgICAgICJyZXNhbXBsaW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUoYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10KSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjID0gYXZfbWFsbG9jeihzaXplb2YoKmMpKTsKKyAgICBpZiAoIWMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYy0+YXZyICAgICAgICAgICA9IGF2cjsKKyAgICBjLT5waGFzZV9zaGlmdCAgID0gYXZyLT5waGFzZV9zaGlmdDsKKyAgICBjLT5waGFzZV9tYXNrICAgID0gcGhhc2VfY291bnQgLSAxOworICAgIGMtPmxpbmVhciAgICAgICAgPSBhdnItPmxpbmVhcl9pbnRlcnA7CisgICAgYy0+ZmlsdGVyX2xlbmd0aCA9IEZGTUFYKChpbnQpY2VpbChhdnItPmZpbHRlcl9zaXplIC8gZmFjdG9yKSwgMSk7CisgICAgYy0+ZmlsdGVyX3R5cGUgICA9IGF2ci0+ZmlsdGVyX3R5cGU7CisgICAgYy0+a2Fpc2VyX2JldGEgICA9IGF2ci0+a2Fpc2VyX2JldGE7CisKKyAgICBzd2l0Y2ggKGF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdCkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQOgorICAgICAgICBjLT5yZXNhbXBsZV9vbmUgID0gYy0+bGluZWFyID8gcmVzYW1wbGVfbGluZWFyX2RibCA6IHJlc2FtcGxlX29uZV9kYmw7CisgICAgICAgIGMtPnJlc2FtcGxlX25lYXJlc3QgPSByZXNhbXBsZV9uZWFyZXN0X2RibDsKKyAgICAgICAgYy0+c2V0X2ZpbHRlciAgICA9IHNldF9maWx0ZXJfZGJsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUUDoKKyAgICAgICAgYy0+cmVzYW1wbGVfb25lICA9IGMtPmxpbmVhciA/IHJlc2FtcGxlX2xpbmVhcl9mbHQgOiByZXNhbXBsZV9vbmVfZmx0OworICAgICAgICBjLT5yZXNhbXBsZV9uZWFyZXN0ID0gcmVzYW1wbGVfbmVhcmVzdF9mbHQ7CisgICAgICAgIGMtPnNldF9maWx0ZXIgICAgPSBzZXRfZmlsdGVyX2ZsdDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMlA6CisgICAgICAgIGMtPnJlc2FtcGxlX29uZSAgPSBjLT5saW5lYXIgPyByZXNhbXBsZV9saW5lYXJfczMyIDogcmVzYW1wbGVfb25lX3MzMjsKKyAgICAgICAgYy0+cmVzYW1wbGVfbmVhcmVzdCA9IHJlc2FtcGxlX25lYXJlc3RfczMyOworICAgICAgICBjLT5zZXRfZmlsdGVyICAgID0gc2V0X2ZpbHRlcl9zMzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOgorICAgICAgICBjLT5yZXNhbXBsZV9vbmUgID0gYy0+bGluZWFyID8gcmVzYW1wbGVfbGluZWFyX3MxNiA6IHJlc2FtcGxlX29uZV9zMTY7CisgICAgICAgIGMtPnJlc2FtcGxlX25lYXJlc3QgPSByZXNhbXBsZV9uZWFyZXN0X3MxNjsKKyAgICAgICAgYy0+c2V0X2ZpbHRlciAgICA9IHNldF9maWx0ZXJfczE2OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoQVJDSF9BQVJDSDY0KQorICAgICAgICBmZl9hdWRpb19yZXNhbXBsZV9pbml0X2FhcmNoNjQoYywgYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10KTsKKworICAgIGZlbGVtX3NpemUgPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShhdnItPmludGVybmFsX3NhbXBsZV9mbXQpOworICAgIGMtPmZpbHRlcl9iYW5rID0gYXZfbWFsbG9jeihjLT5maWx0ZXJfbGVuZ3RoICogKHBoYXNlX2NvdW50ICsgMSkgKiBmZWxlbV9zaXplKTsKKyAgICBpZiAoIWMtPmZpbHRlcl9iYW5rKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKGJ1aWxkX2ZpbHRlcihjLCBmYWN0b3IpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIG1lbWNweSgmYy0+ZmlsdGVyX2JhbmtbKGMtPmZpbHRlcl9sZW5ndGggKiBwaGFzZV9jb3VudCArIDEpICogZmVsZW1fc2l6ZV0sCisgICAgICAgICAgIGMtPmZpbHRlcl9iYW5rLCAoYy0+ZmlsdGVyX2xlbmd0aCAtIDEpICogZmVsZW1fc2l6ZSk7CisgICAgbWVtY3B5KCZjLT5maWx0ZXJfYmFua1tjLT5maWx0ZXJfbGVuZ3RoICogcGhhc2VfY291bnQgKiBmZWxlbV9zaXplXSwKKyAgICAgICAgICAgJmMtPmZpbHRlcl9iYW5rWyhjLT5maWx0ZXJfbGVuZ3RoIC0gMSkgKiBmZWxlbV9zaXplXSwgZmVsZW1fc2l6ZSk7CisKKyAgICBjLT5jb21wZW5zYXRpb25fZGlzdGFuY2UgPSAwOworICAgIGlmICghYXZfcmVkdWNlKCZjLT5zcmNfaW5jciwgJmMtPmRzdF9pbmNyLCBvdXRfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICBpbl9yYXRlICogKGludDY0X3QpcGhhc2VfY291bnQsIElOVDMyX01BWCAvIDIpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGMtPmlkZWFsX2RzdF9pbmNyID0gYy0+ZHN0X2luY3I7CisKKyAgICBjLT5wYWRkaW5nX3NpemUgICA9IChjLT5maWx0ZXJfbGVuZ3RoIC0gMSkgLyAyOworICAgIGMtPmluaXRpYWxfcGFkZGluZ19maWxsZWQgPSAwOworICAgIGMtPmluZGV4ID0gMDsKKyAgICBjLT5mcmFjICA9IDA7CisKKyAgICAvKiBhbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXIgKi8KKyAgICBjLT5idWZmZXIgPSBmZl9hdWRpb19kYXRhX2FsbG9jKGF2ci0+cmVzYW1wbGVfY2hhbm5lbHMsIGMtPnBhZGRpbmdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNhbXBsZSBidWZmZXIiKTsKKyAgICBpZiAoIWMtPmJ1ZmZlcikKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBjLT5idWZmZXItPm5iX3NhbXBsZXMgICAgICA9IGMtPnBhZGRpbmdfc2l6ZTsKKyAgICBjLT5pbml0aWFsX3BhZGRpbmdfc2FtcGxlcyA9IGMtPnBhZGRpbmdfc2l6ZTsKKworICAgIGF2X2xvZyhhdnIsIEFWX0xPR19ERUJVRywgInJlc2FtcGxlOiAlcyBmcm9tICVkIEh6IHRvICVkIEh6XG4iLAorICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdCksCisgICAgICAgICAgIGF2ci0+aW5fc2FtcGxlX3JhdGUsIGF2ci0+b3V0X3NhbXBsZV9yYXRlKTsKKworICAgIHJldHVybiBjOworCitlcnJvcjoKKyAgICBmZl9hdWRpb19kYXRhX2ZyZWUoJmMtPmJ1ZmZlcik7CisgICAgYXZfZnJlZShjLT5maWx0ZXJfYmFuayk7CisgICAgYXZfZnJlZShjKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBmZl9hdWRpb19yZXNhbXBsZV9mcmVlKFJlc2FtcGxlQ29udGV4dCAqKmMpCit7CisgICAgaWYgKCEqYykKKyAgICAgICAgcmV0dXJuOworICAgIGZmX2F1ZGlvX2RhdGFfZnJlZSgmKCpjKS0+YnVmZmVyKTsKKyAgICBhdl9mcmVlKCgqYyktPmZpbHRlcl9iYW5rKTsKKyAgICBhdl9mcmVlcChjKTsKK30KKworaW50IGF2cmVzYW1wbGVfc2V0X2NvbXBlbnNhdGlvbihBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsIGludCBzYW1wbGVfZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wZW5zYXRpb25fZGlzdGFuY2UpCit7CisgICAgUmVzYW1wbGVDb250ZXh0ICpjOworICAgIEF1ZGlvRGF0YSAqZmlmb19idWYgPSBOVUxMOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGNvbXBlbnNhdGlvbl9kaXN0YW5jZSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKCFjb21wZW5zYXRpb25fZGlzdGFuY2UgJiYgc2FtcGxlX2RlbHRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKCFhdnItPnJlc2FtcGxlX25lZWRlZCkgeworI2lmIEZGX0FQSV9SRVNBTVBMRV9DTE9TRV9PUEVOCisgICAgICAgIC8qIGlmIHJlc2FtcGxpbmcgd2FzIG5vdCBlbmFibGVkIHByZXZpb3VzbHksIHJlLWluaXRpYWxpemUgdGhlCisgICAgICAgICAgIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgYW5kIGZvcmNlIHJlc2FtcGxpbmcgKi8KKyAgICAgICAgaW50IGZpZm9fc2FtcGxlczsKKyAgICAgICAgaW50IHJlc3RvcmVfbWF0cml4ID0gMDsKKyAgICAgICAgZG91YmxlIG1hdHJpeFtBVlJFU0FNUExFX01BWF9DSEFOTkVMUyAqIEFWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXSA9IHsgMCB9OworCisgICAgICAgIC8qIGJ1ZmZlciBhbnkgcmVtYWluaW5nIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBGSUZPIGJlZm9yZSBjbG9zaW5nICovCisgICAgICAgIGZpZm9fc2FtcGxlcyA9IGF2X2F1ZGlvX2ZpZm9fc2l6ZShhdnItPm91dF9maWZvKTsKKyAgICAgICAgaWYgKGZpZm9fc2FtcGxlcyA+IDApIHsKKyAgICAgICAgICAgIGZpZm9fYnVmID0gZmZfYXVkaW9fZGF0YV9hbGxvYyhhdnItPm91dF9jaGFubmVscywgZmlmb19zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ci0+b3V0X3NhbXBsZV9mbXQsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFmaWZvX2J1ZikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgcmV0ID0gZmZfYXVkaW9fZGF0YV9yZWFkX2Zyb21fZmlmbyhhdnItPm91dF9maWZvLCBmaWZvX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlmb19zYW1wbGVzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gcmVpbml0X2ZhaWw7CisgICAgICAgIH0KKyAgICAgICAgLyogc2F2ZSB0aGUgY2hhbm5lbCBtaXhpbmcgbWF0cml4ICovCisgICAgICAgIGlmIChhdnItPmFtKSB7CisgICAgICAgICAgICByZXQgPSBhdnJlc2FtcGxlX2dldF9tYXRyaXgoYXZyLCBtYXRyaXgsIEFWUkVTQU1QTEVfTUFYX0NIQU5ORUxTKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gcmVpbml0X2ZhaWw7CisgICAgICAgICAgICByZXN0b3JlX21hdHJpeCA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBjbG9zZSB0aGUgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqLworICAgICAgICBhdnJlc2FtcGxlX2Nsb3NlKGF2cik7CisKKyAgICAgICAgYXZyLT5mb3JjZV9yZXNhbXBsaW5nID0gMTsKKworICAgICAgICAvKiByZXN0b3JlIHRoZSBjaGFubmVsIG1peGluZyBtYXRyaXggKi8KKyAgICAgICAgaWYgKHJlc3RvcmVfbWF0cml4KSB7CisgICAgICAgICAgICByZXQgPSBhdnJlc2FtcGxlX3NldF9tYXRyaXgoYXZyLCBtYXRyaXgsIEFWUkVTQU1QTEVfTUFYX0NIQU5ORUxTKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gcmVpbml0X2ZhaWw7CisgICAgICAgIH0KKworICAgICAgICAvKiByZS1vcGVuIHRoZSBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICovCisgICAgICAgIHJldCA9IGF2cmVzYW1wbGVfb3BlbihhdnIpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gcmVpbml0X2ZhaWw7CisKKyAgICAgICAgLyogcmVzdG9yZSBidWZmZXJlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQgRklGTyAqLworICAgICAgICBpZiAoZmlmb19zYW1wbGVzID4gMCkgeworICAgICAgICAgICAgcmV0ID0gZmZfYXVkaW9fZGF0YV9hZGRfdG9fZmlmbyhhdnItPm91dF9maWZvLCBmaWZvX2J1ZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlmb19zYW1wbGVzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gcmVpbml0X2ZhaWw7CisgICAgICAgICAgICBmZl9hdWRpb19kYXRhX2ZyZWUoJmZpZm9fYnVmKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgYXZfbG9nKGF2ciwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNldCByZXNhbXBsaW5nIGNvbXBlbnNhdGlvblxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisjZW5kaWYKKyAgICB9CisgICAgYyA9IGF2ci0+cmVzYW1wbGU7CisgICAgYy0+Y29tcGVuc2F0aW9uX2Rpc3RhbmNlID0gY29tcGVuc2F0aW9uX2Rpc3RhbmNlOworICAgIGlmIChjb21wZW5zYXRpb25fZGlzdGFuY2UpIHsKKyAgICAgICAgYy0+ZHN0X2luY3IgPSBjLT5pZGVhbF9kc3RfaW5jciAtIGMtPmlkZWFsX2RzdF9pbmNyICoKKyAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdClzYW1wbGVfZGVsdGEgLyBjb21wZW5zYXRpb25fZGlzdGFuY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+ZHN0X2luY3IgPSBjLT5pZGVhbF9kc3RfaW5jcjsKKyAgICB9CisgICAgcmV0dXJuIDA7CisKK3JlaW5pdF9mYWlsOgorICAgIGZmX2F1ZGlvX2RhdGFfZnJlZSgmZmlmb19idWYpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVzYW1wbGUoUmVzYW1wbGVDb250ZXh0ICpjLCB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgaW50ICpjb25zdW1lZCwgaW50IHNyY19zaXplLCBpbnQgZHN0X3NpemUsIGludCB1cGRhdGVfY3R4LAorICAgICAgICAgICAgICAgICAgICBpbnQgbmVhcmVzdF9uZWlnaGJvdXIpCit7CisgICAgaW50IGRzdF9pbmRleDsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBjLT5pbmRleDsKKyAgICBpbnQgZnJhYyAgICAgICAgICA9IGMtPmZyYWM7CisgICAgaW50IGRzdF9pbmNyX2ZyYWMgPSBjLT5kc3RfaW5jciAlIGMtPnNyY19pbmNyOworICAgIGludCBkc3RfaW5jciAgICAgID0gYy0+ZHN0X2luY3IgLyBjLT5zcmNfaW5jcjsKKyAgICBpbnQgY29tcGVuc2F0aW9uX2Rpc3RhbmNlID0gYy0+Y29tcGVuc2F0aW9uX2Rpc3RhbmNlOworCisgICAgaWYgKCFkc3QgIT0gIXNyYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmIChuZWFyZXN0X25laWdoYm91cikgeworICAgICAgICB1aW50NjRfdCBpbmRleDIgPSAoKHVpbnQ2NF90KWluZGV4KSA8PCAzMjsKKyAgICAgICAgaW50NjRfdCBpbmNyICAgPSAoMUxMIDw8IDMyKSAqIGMtPmRzdF9pbmNyIC8gYy0+c3JjX2luY3I7CisgICAgICAgIGRzdF9zaXplICAgICAgID0gRkZNSU4oZHN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNyY19zaXplLTEtaW5kZXgpICogKGludDY0X3QpYy0+c3JjX2luY3IgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdF9pbmNyKTsKKworICAgICAgICBpZiAoZHN0KSB7CisgICAgICAgICAgICBmb3IoZHN0X2luZGV4ID0gMDsgZHN0X2luZGV4IDwgZHN0X3NpemU7IGRzdF9pbmRleCsrKSB7CisgICAgICAgICAgICAgICAgYy0+cmVzYW1wbGVfbmVhcmVzdChkc3QsIGRzdF9pbmRleCwgc3JjLCBpbmRleDIgPj4gMzIpOworICAgICAgICAgICAgICAgIGluZGV4MiArPSBpbmNyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0X2luZGV4ID0gZHN0X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggKz0gZHN0X2luZGV4ICogZHN0X2luY3I7CisgICAgICAgIGluZGV4ICs9IChmcmFjICsgZHN0X2luZGV4ICogKGludDY0X3QpZHN0X2luY3JfZnJhYykgLyBjLT5zcmNfaW5jcjsKKyAgICAgICAgZnJhYyAgID0gKGZyYWMgKyBkc3RfaW5kZXggKiAoaW50NjRfdClkc3RfaW5jcl9mcmFjKSAlIGMtPnNyY19pbmNyOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoZHN0X2luZGV4ID0gMDsgZHN0X2luZGV4IDwgZHN0X3NpemU7IGRzdF9pbmRleCsrKSB7CisgICAgICAgICAgICBpbnQgc2FtcGxlX2luZGV4ID0gaW5kZXggPj4gYy0+cGhhc2Vfc2hpZnQ7CisKKyAgICAgICAgICAgIGlmIChzYW1wbGVfaW5kZXggKyBjLT5maWx0ZXJfbGVuZ3RoID4gc3JjX3NpemUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmIChkc3QpCisgICAgICAgICAgICAgICAgYy0+cmVzYW1wbGVfb25lKGMsIGRzdCwgZHN0X2luZGV4LCBzcmMsIGluZGV4LCBmcmFjKTsKKworICAgICAgICAgICAgZnJhYyAgKz0gZHN0X2luY3JfZnJhYzsKKyAgICAgICAgICAgIGluZGV4ICs9IGRzdF9pbmNyOworICAgICAgICAgICAgaWYgKGZyYWMgPj0gYy0+c3JjX2luY3IpIHsKKyAgICAgICAgICAgICAgICBmcmFjIC09IGMtPnNyY19pbmNyOworICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHN0X2luZGV4ICsgMSA9PSBjb21wZW5zYXRpb25fZGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICBjb21wZW5zYXRpb25fZGlzdGFuY2UgPSAwOworICAgICAgICAgICAgICAgIGRzdF9pbmNyX2ZyYWMgPSBjLT5pZGVhbF9kc3RfaW5jciAlIGMtPnNyY19pbmNyOworICAgICAgICAgICAgICAgIGRzdF9pbmNyICAgICAgPSBjLT5pZGVhbF9kc3RfaW5jciAvIGMtPnNyY19pbmNyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChjb25zdW1lZCkKKyAgICAgICAgKmNvbnN1bWVkID0gaW5kZXggPj4gYy0+cGhhc2Vfc2hpZnQ7CisKKyAgICBpZiAodXBkYXRlX2N0eCkgeworICAgICAgICBpbmRleCAmPSBjLT5waGFzZV9tYXNrOworCisgICAgICAgIGlmIChjb21wZW5zYXRpb25fZGlzdGFuY2UpIHsKKyAgICAgICAgICAgIGNvbXBlbnNhdGlvbl9kaXN0YW5jZSAtPSBkc3RfaW5kZXg7CisgICAgICAgICAgICBpZiAoY29tcGVuc2F0aW9uX2Rpc3RhbmNlIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgICAgICB9CisgICAgICAgIGMtPmZyYWMgICAgID0gZnJhYzsKKyAgICAgICAgYy0+aW5kZXggICAgPSBpbmRleDsKKyAgICAgICAgYy0+ZHN0X2luY3IgPSBkc3RfaW5jcl9mcmFjICsgYy0+c3JjX2luY3IqZHN0X2luY3I7CisgICAgICAgIGMtPmNvbXBlbnNhdGlvbl9kaXN0YW5jZSA9IGNvbXBlbnNhdGlvbl9kaXN0YW5jZTsKKyAgICB9CisKKyAgICByZXR1cm4gZHN0X2luZGV4OworfQorCitpbnQgZmZfYXVkaW9fcmVzYW1wbGUoUmVzYW1wbGVDb250ZXh0ICpjLCBBdWRpb0RhdGEgKmRzdCwgQXVkaW9EYXRhICpzcmMpCit7CisgICAgaW50IGNoLCBpbl9zYW1wbGVzLCBpbl9sZWZ0b3ZlciwgY29uc3VtZWQgPSAwLCBvdXRfc2FtcGxlcyA9IDA7CisgICAgaW50IHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICBpbnQgbmVhcmVzdF9uZWlnaGJvdXIgPSAoYy0+Y29tcGVuc2F0aW9uX2Rpc3RhbmNlID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZmlsdGVyX2xlbmd0aCA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnBoYXNlX3NoaWZ0ID09IDApOworCisgICAgaW5fc2FtcGxlcyAgPSBzcmMgPyBzcmMtPm5iX3NhbXBsZXMgOiAwOworICAgIGluX2xlZnRvdmVyID0gYy0+YnVmZmVyLT5uYl9zYW1wbGVzOworCisgICAgLyogYWRkIGlucHV0IHNhbXBsZXMgdG8gdGhlIGludGVybmFsIGJ1ZmZlciAqLworICAgIGlmIChzcmMpIHsKKyAgICAgICAgcmV0ID0gZmZfYXVkaW9fZGF0YV9jb21iaW5lKGMtPmJ1ZmZlciwgaW5fbGVmdG92ZXIsIHNyYywgMCwgaW5fc2FtcGxlcyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKGluX2xlZnRvdmVyIDw9IGMtPmZpbmFsX3BhZGRpbmdfc2FtcGxlcykgeworICAgICAgICAvKiBubyByZW1haW5pbmcgc2FtcGxlcyB0byBmbHVzaCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIWMtPmluaXRpYWxfcGFkZGluZ19maWxsZWQpIHsKKyAgICAgICAgaW50IGJwcyA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGMtPmF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdCk7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmIChzcmMgJiYgYy0+YnVmZmVyLT5uYl9zYW1wbGVzIDwgMiAqIGMtPnBhZGRpbmdfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5wYWRkaW5nX3NpemU7IGkrKykKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmJ1ZmZlci0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYy0+YnVmZmVyLT5uYl9zYW1wbGVzID4gMiAqIGMtPnBhZGRpbmdfc2l6ZSAtIGkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGMtPmJ1ZmZlci0+ZGF0YVtjaF0gKyBicHMgKiBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YnVmZmVyLT5kYXRhW2NoXSArIGJwcyAqICgyICogYy0+cGFkZGluZ19zaXplIC0gaSksIGJwcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGMtPmJ1ZmZlci0+ZGF0YVtjaF0gKyBicHMgKiBpLCAwLCBicHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgYy0+aW5pdGlhbF9wYWRkaW5nX2ZpbGxlZCA9IDE7CisgICAgfQorCisgICAgaWYgKCFzcmMgJiYgIWMtPmZpbmFsX3BhZGRpbmdfZmlsbGVkKSB7CisgICAgICAgIGludCBicHMgPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShjLT5hdnItPmludGVybmFsX3NhbXBsZV9mbXQpOworICAgICAgICBpbnQgaTsKKworICAgICAgICByZXQgPSBmZl9hdWRpb19kYXRhX3JlYWxsb2MoYy0+YnVmZmVyLCBpbl9zYW1wbGVzICsgYy0+cGFkZGluZ19zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjLT5hdnIsIEFWX0xPR19FUlJPUiwgIkVycm9yIHJlYWxsb2NhdGluZyByZXNhbXBsaW5nIGJ1ZmZlclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPnBhZGRpbmdfc2l6ZTsgaSsrKQorICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+YnVmZmVyLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgICAgIGlmIChpbl9sZWZ0b3ZlciA+IGkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGMtPmJ1ZmZlci0+ZGF0YVtjaF0gKyBicHMgKiAoaW5fbGVmdG92ZXIgKyBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmJ1ZmZlci0+ZGF0YVtjaF0gKyBicHMgKiAoaW5fbGVmdG92ZXIgLSBpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBicHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjLT5idWZmZXItPmRhdGFbY2hdICsgYnBzICogKGluX2xlZnRvdmVyICsgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBicHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgYy0+YnVmZmVyLT5uYl9zYW1wbGVzICAgKz0gYy0+cGFkZGluZ19zaXplOworICAgICAgICBjLT5maW5hbF9wYWRkaW5nX3NhbXBsZXMgPSBjLT5wYWRkaW5nX3NpemU7CisgICAgICAgIGMtPmZpbmFsX3BhZGRpbmdfZmlsbGVkICA9IDE7CisgICAgfQorCisKKyAgICAvKiBjYWxjdWxhdGUgb3V0cHV0IHNpemUgYW5kIHJlYWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciBpZiBuZWVkZWQgKi8KKyAgICAvKiBUT0RPOiB0cnkgdG8gY2FsY3VsYXRlIHRoaXMgd2l0aG91dCB0aGUgZHVtbXkgcmVzYW1wbGUoKSBydW4gKi8KKyAgICBpZiAoIWRzdC0+cmVhZF9vbmx5ICYmIGRzdC0+YWxsb3dfcmVhbGxvYykgeworICAgICAgICBvdXRfc2FtcGxlcyA9IHJlc2FtcGxlKGMsIE5VTEwsIE5VTEwsIE5VTEwsIGMtPmJ1ZmZlci0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfTUFYLCAwLCBuZWFyZXN0X25laWdoYm91cik7CisgICAgICAgIHJldCA9IGZmX2F1ZGlvX2RhdGFfcmVhbGxvYyhkc3QsIG91dF9zYW1wbGVzKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjLT5hdnIsIEFWX0xPR19FUlJPUiwgImVycm9yIHJlYWxsb2NhdGluZyBvdXRwdXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlc2FtcGxlIGVhY2ggY2hhbm5lbCBwbGFuZSAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmJ1ZmZlci0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgb3V0X3NhbXBsZXMgPSByZXNhbXBsZShjLCAodm9pZCAqKWRzdC0+ZGF0YVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKiljLT5idWZmZXItPmRhdGFbY2hdLCAmY29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YnVmZmVyLT5uYl9zYW1wbGVzLCBkc3QtPmFsbG9jYXRlZF9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoICsgMSA9PSBjLT5idWZmZXItPmNoYW5uZWxzLCBuZWFyZXN0X25laWdoYm91cik7CisgICAgfQorICAgIGlmIChvdXRfc2FtcGxlcyA8IDApIHsKKyAgICAgICAgYXZfbG9nKGMtPmF2ciwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgZHVyaW5nIHJlc2FtcGxpbmdcbiIpOworICAgICAgICByZXR1cm4gb3V0X3NhbXBsZXM7CisgICAgfQorCisgICAgLyogZHJhaW4gY29uc3VtZWQgc2FtcGxlcyBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIgKi8KKyAgICBmZl9hdWRpb19kYXRhX2RyYWluKGMtPmJ1ZmZlciwgY29uc3VtZWQpOworICAgIGMtPmluaXRpYWxfcGFkZGluZ19zYW1wbGVzID0gRkZNQVgoYy0+aW5pdGlhbF9wYWRkaW5nX3NhbXBsZXMgLSBjb25zdW1lZCwgMCk7CisKKyAgICBhdl9kbG9nKGMtPmF2ciwgInJlc2FtcGxlZCAlZCBpbiArICVkIGxlZnRvdmVyIHRvICVkIG91dCArICVkIGxlZnRvdmVyXG4iLAorICAgICAgICAgICAgaW5fc2FtcGxlcywgaW5fbGVmdG92ZXIsIG91dF9zYW1wbGVzLCBjLT5idWZmZXItPm5iX3NhbXBsZXMpOworCisgICAgZHN0LT5uYl9zYW1wbGVzID0gb3V0X3NhbXBsZXM7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdnJlc2FtcGxlX2dldF9kZWxheShBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIpCit7CisgICAgUmVzYW1wbGVDb250ZXh0ICpjID0gYXZyLT5yZXNhbXBsZTsKKworICAgIGlmICghYXZyLT5yZXNhbXBsZV9uZWVkZWQgfHwgIWF2ci0+cmVzYW1wbGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEZGTUFYKGMtPmJ1ZmZlci0+bmJfc2FtcGxlcyAtIGMtPnBhZGRpbmdfc2l6ZSwgMCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS9yZXNhbXBsZS5oIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvcmVzYW1wbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTlmNTYyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUvcmVzYW1wbGUuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZSRVNBTVBMRV9SRVNBTVBMRV9ICisjZGVmaW5lIEFWUkVTQU1QTEVfUkVTQU1QTEVfSAorCisjaW5jbHVkZSAiYXZyZXNhbXBsZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXVkaW9fZGF0YS5oIgorCitzdHJ1Y3QgUmVzYW1wbGVDb250ZXh0IHsKKyAgICBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnI7CisgICAgQXVkaW9EYXRhICpidWZmZXI7CisgICAgdWludDhfdCAqZmlsdGVyX2Jhbms7CisgICAgaW50IGZpbHRlcl9sZW5ndGg7CisgICAgaW50IGlkZWFsX2RzdF9pbmNyOworICAgIGludCBkc3RfaW5jcjsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgICAgaW50IGZyYWM7CisgICAgaW50IHNyY19pbmNyOworICAgIGludCBjb21wZW5zYXRpb25fZGlzdGFuY2U7CisgICAgaW50IHBoYXNlX3NoaWZ0OworICAgIGludCBwaGFzZV9tYXNrOworICAgIGludCBsaW5lYXI7CisgICAgZW51bSBBVlJlc2FtcGxlRmlsdGVyVHlwZSBmaWx0ZXJfdHlwZTsKKyAgICBpbnQga2Fpc2VyX2JldGE7CisgICAgdm9pZCAoKnNldF9maWx0ZXIpKHZvaWQgKmZpbHRlciwgZG91YmxlICp0YWIsIGludCBwaGFzZSwgaW50IHRhcF9jb3VudCk7CisgICAgdm9pZCAoKnJlc2FtcGxlX29uZSkoc3RydWN0IFJlc2FtcGxlQ29udGV4dCAqYywgdm9pZCAqZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X2luZGV4LCBjb25zdCB2b2lkICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmRleCwgaW50IGZyYWMpOworICAgIHZvaWQgKCpyZXNhbXBsZV9uZWFyZXN0KSh2b2lkICpkc3QwLCBpbnQgZHN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzcmMwLCB1bnNpZ25lZCBpbnQgaW5kZXgpOworICAgIGludCBwYWRkaW5nX3NpemU7CisgICAgaW50IGluaXRpYWxfcGFkZGluZ19maWxsZWQ7CisgICAgaW50IGluaXRpYWxfcGFkZGluZ19zYW1wbGVzOworICAgIGludCBmaW5hbF9wYWRkaW5nX2ZpbGxlZDsKKyAgICBpbnQgZmluYWxfcGFkZGluZ19zYW1wbGVzOworfTsKKworLyoqCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIFJlc2FtcGxlQ29udGV4dC4KKyAqCisgKiBUaGUgcGFyYW1ldGVycyBpbiB0aGUgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCBhcmUgdXNlZCB0byBpbml0aWFsaXplIHRoZQorICogUmVzYW1wbGVDb250ZXh0LgorICoKKyAqIEBwYXJhbSBhdnIgIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQKKyAqIEByZXR1cm4gICAgIG5ld2x5LWFsbG9jYXRlZCBSZXNhbXBsZUNvbnRleHQKKyAqLworUmVzYW1wbGVDb250ZXh0ICpmZl9hdWRpb19yZXNhbXBsZV9pbml0KEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2cik7CisKKy8qKgorICogRnJlZSBhIFJlc2FtcGxlQ29udGV4dC4KKyAqCisgKiBAcGFyYW0gYyAgUmVzYW1wbGVDb250ZXh0CisgKi8KK3ZvaWQgZmZfYXVkaW9fcmVzYW1wbGVfZnJlZShSZXNhbXBsZUNvbnRleHQgKipjKTsKKworLyoqCisgKiBSZXNhbXBsZSBhdWRpbyBkYXRhLgorICoKKyAqIENoYW5nZXMgdGhlIHNhbXBsZSByYXRlLgorICoKKyAqIEBwYXIKKyAqIEFsbCBzYW1wbGVzIGluIHRoZSBzb3VyY2UgZGF0YSBtYXkgbm90IGJlIGNvbnN1bWVkIGRlcGVuZGluZyBvbiB0aGUKKyAqIHJlc2FtcGxpbmcgcGFyYW1ldGVycyBhbmQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuIFRoZSB1bmNvbnN1bWVkCisgKiBzYW1wbGVzIGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBzdGFydCBvZiB0aGUgc291cmNlIGluIHRoZSBuZXh0IGNhbGwuCisgKiBJZiB0aGUgZGVzdGluYXRpb24gZGF0YSBjYW4gYmUgcmVhbGxvY2F0ZWQsIHRoYXQgbWF5IGJlIGRvbmUgaW4gdGhpcyBmdW5jdGlvbgorICogaW4gb3JkZXIgdG8gZml0IGFsbCBhdmFpbGFibGUgb3V0cHV0LiBJZiBpdCBjYW5ub3QgYmUgcmVhbGxvY2F0ZWQsIGZld2VyCisgKiBpbnB1dCBzYW1wbGVzIHdpbGwgYmUgY29uc3VtZWQgaW4gb3JkZXIgdG8gaGF2ZSB0aGUgb3V0cHV0IGZpdCBpbiB0aGUKKyAqIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVycy4KKyAqCisgKiBAcGFyYW0gYyAgICAgICAgIFJlc2FtcGxlQ29udGV4dAorICogQHBhcmFtIGRzdCAgICAgICBkZXN0aW5hdGlvbiBhdWRpbyBkYXRhCisgKiBAcGFyYW0gc3JjICAgICAgIHNvdXJjZSBhdWRpbyBkYXRhCisgKiBAcmV0dXJuICAgICAgICAgIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGZmX2F1ZGlvX3Jlc2FtcGxlKFJlc2FtcGxlQ29udGV4dCAqYywgQXVkaW9EYXRhICpkc3QsIEF1ZGlvRGF0YSAqc3JjKTsKKworI2VuZGlmIC8qIEFWUkVTQU1QTEVfUkVTQU1QTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUvcmVzYW1wbGVfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3Jlc2FtcGxlX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzODUyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3Jlc2FtcGxlX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfUkVTQU1QTEVfREJMKQorI2RlZmluZSBTRVRfVFlQRShmdW5jKSAgZnVuYyAjIyBfZGJsCisjZGVmaW5lIEZFTEVNICAgICAgICAgZG91YmxlCisjZGVmaW5lIEZFTEVNMiAgICAgICAgZG91YmxlCisjZGVmaW5lIEZFTEVNTCAgICAgICAgZG91YmxlCisjZGVmaW5lIE9VVChkLCB2KSBkID0gdgorI2RlZmluZSBEQkxfVE9fRkVMRU0oZCwgdikgZCA9IHYKKyNlbGlmIGRlZmluZWQoQ09ORklHX1JFU0FNUExFX0ZMVCkKKyNkZWZpbmUgU0VUX1RZUEUoZnVuYykgIGZ1bmMgIyMgX2ZsdAorI2RlZmluZSBGRUxFTSAgICAgICAgIGZsb2F0CisjZGVmaW5lIEZFTEVNMiAgICAgICAgZmxvYXQKKyNkZWZpbmUgRkVMRU1MICAgICAgICBmbG9hdAorI2RlZmluZSBPVVQoZCwgdikgZCA9IHYKKyNkZWZpbmUgREJMX1RPX0ZFTEVNKGQsIHYpIGQgPSB2CisjZWxpZiBkZWZpbmVkKENPTkZJR19SRVNBTVBMRV9TMzIpCisjZGVmaW5lIFNFVF9UWVBFKGZ1bmMpICBmdW5jICMjIF9zMzIKKyNkZWZpbmUgRkVMRU0gICAgICAgICBpbnQzMl90CisjZGVmaW5lIEZFTEVNMiAgICAgICAgaW50NjRfdAorI2RlZmluZSBGRUxFTUwgICAgICAgIGludDY0X3QKKyNkZWZpbmUgT1VUKGQsIHYpIGQgPSBhdl9jbGlwbF9pbnQzMigodiArICgxIDw8IDI5KSkgPj4gMzApCisjZGVmaW5lIERCTF9UT19GRUxFTShkLCB2KSBkID0gYXZfY2xpcGxfaW50MzIobGxyaW50KHYgKiAoMSA8PCAzMCkpKTsKKyNlbHNlCisjZGVmaW5lIFNFVF9UWVBFKGZ1bmMpICBmdW5jICMjIF9zMTYKKyNkZWZpbmUgRkVMRU0gICAgICAgICBpbnQxNl90CisjZGVmaW5lIEZFTEVNMiAgICAgICAgaW50MzJfdAorI2RlZmluZSBGRUxFTUwgICAgICAgIGludDY0X3QKKyNkZWZpbmUgT1VUKGQsIHYpIGQgPSBhdl9jbGlwX2ludDE2KCh2ICsgKDEgPDwgMTQpKSA+PiAxNSkKKyNkZWZpbmUgREJMX1RPX0ZFTEVNKGQsIHYpIGQgPSBhdl9jbGlwX2ludDE2KGxyaW50KHYgKiAoMSA8PCAxNSkpKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIFNFVF9UWVBFKHJlc2FtcGxlX25lYXJlc3QpKHZvaWQgKmRzdDAsIGludCBkc3RfaW5kZXgsIGNvbnN0IHZvaWQgKnNyYzAsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKyAgICBGRUxFTSAqZHN0ID0gZHN0MDsKKyAgICBjb25zdCBGRUxFTSAqc3JjID0gc3JjMDsKKyAgICBkc3RbZHN0X2luZGV4XSA9IHNyY1tpbmRleF07Cit9CisKK3N0YXRpYyB2b2lkIFNFVF9UWVBFKHJlc2FtcGxlX2xpbmVhcikoUmVzYW1wbGVDb250ZXh0ICpjLCB2b2lkICpkc3QwLCBpbnQgZHN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzcmMwLCB1bnNpZ25lZCBpbnQgaW5kZXgsIGludCBmcmFjKQoreworICAgIEZFTEVNICpkc3QgPSBkc3QwOworICAgIGNvbnN0IEZFTEVNICpzcmMgPSBzcmMwOworICAgIGludCBpOworICAgIHVuc2lnbmVkIGludCBzYW1wbGVfaW5kZXggPSBpbmRleCA+PiBjLT5waGFzZV9zaGlmdDsKKyAgICBGRUxFTTIgdmFsID0gMDsKKyAgICBGRUxFTSAqZmlsdGVyID0gKChGRUxFTSAqKWMtPmZpbHRlcl9iYW5rKSArCisgICAgICAgICAgICAgICAgICAgIGMtPmZpbHRlcl9sZW5ndGggKiAoaW5kZXggJiBjLT5waGFzZV9tYXNrKTsKKyAgICBGRUxFTTIgdjIgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGMtPmZpbHRlcl9sZW5ndGg7IGkrKykgeworICAgICAgICB2YWwgKz0gc3JjW3NhbXBsZV9pbmRleCArIGldICogKEZFTEVNMilmaWx0ZXJbaV07CisgICAgICAgIHYyICArPSBzcmNbc2FtcGxlX2luZGV4ICsgaV0gKiAoRkVMRU0yKWZpbHRlcltpICsgYy0+ZmlsdGVyX2xlbmd0aF07CisgICAgfQorICAgIHZhbCArPSAodjIgLSB2YWwpICogKEZFTEVNTClmcmFjIC8gYy0+c3JjX2luY3I7CisKKyAgICBPVVQoZHN0W2RzdF9pbmRleF0sIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIFNFVF9UWVBFKHJlc2FtcGxlX29uZSkoUmVzYW1wbGVDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkc3QwLCBpbnQgZHN0X2luZGV4LCBjb25zdCB2b2lkICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIGludCBmcmFjKQoreworICAgIEZFTEVNICpkc3QgPSBkc3QwOworICAgIGNvbnN0IEZFTEVNICpzcmMgPSBzcmMwOworICAgIGludCBpOworICAgIHVuc2lnbmVkIGludCBzYW1wbGVfaW5kZXggPSBpbmRleCA+PiBjLT5waGFzZV9zaGlmdDsKKyAgICBGRUxFTTIgdmFsID0gMDsKKyAgICBGRUxFTSAqZmlsdGVyID0gKChGRUxFTSAqKWMtPmZpbHRlcl9iYW5rKSArCisgICAgICAgICAgICAgICAgICAgIGMtPmZpbHRlcl9sZW5ndGggKiAoaW5kZXggJiBjLT5waGFzZV9tYXNrKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5maWx0ZXJfbGVuZ3RoOyBpKyspCisgICAgICAgIHZhbCArPSBzcmNbc2FtcGxlX2luZGV4ICsgaV0gKiAoRkVMRU0yKWZpbHRlcltpXTsKKworICAgIE9VVChkc3RbZHN0X2luZGV4XSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgU0VUX1RZUEUoc2V0X2ZpbHRlcikodm9pZCAqZmlsdGVyMCwgZG91YmxlICp0YWIsIGludCBwaGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXBfY291bnQpCit7CisgICAgaW50IGk7CisgICAgRkVMRU0gKmZpbHRlciA9ICgoRkVMRU0gKilmaWx0ZXIwKSArIHBoYXNlICogdGFwX2NvdW50OworICAgIGZvciAoaSA9IDA7IGkgPCB0YXBfY291bnQ7IGkrKykgeworICAgICAgICBEQkxfVE9fRkVMRU0oZmlsdGVyW2ldLCB0YWJbaV0pOworICAgIH0KK30KKworI3VuZGVmIFNFVF9UWVBFCisjdW5kZWYgRkVMRU0KKyN1bmRlZiBGRUxFTTIKKyN1bmRlZiBGRUxFTUwKKyN1bmRlZiBPVVQKKyN1bmRlZiBEQkxfVE9fRkVMRU0KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3V0aWxzLmMgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyODU0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS91dGlscy5jCkBAIC0wLDAgKzEsNzkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKy8vICNpbmNsdWRlICJsaWJhdnV0aWwvZXJyb3IuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImF2cmVzYW1wbGUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF1ZGlvX2RhdGEuaCIKKyNpbmNsdWRlICJhdWRpb19jb252ZXJ0LmgiCisjaW5jbHVkZSAiYXVkaW9fbWl4LmgiCisjaW5jbHVkZSAicmVzYW1wbGUuaCIKKworaW50IGF2cmVzYW1wbGVfb3BlbihBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIpCit7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdnJlc2FtcGxlX2lzX29wZW4oYXZyKSkgeworICAgICAgICBhdl9sb2coYXZyLCBBVl9MT0dfRVJST1IsICJUaGUgcmVzYW1wbGluZyBjb250ZXh0IGlzIGFscmVhZHkgb3Blbi5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8qIHNldCBjaGFubmVsIG1peGluZyBwYXJhbWV0ZXJzICovCisgICAgYXZyLT5pbl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhhdnItPmluX2NoYW5uZWxfbGF5b3V0KTsKKyAgICBpZiAoYXZyLT5pbl9jaGFubmVscyA8PSAwIHx8IGF2ci0+aW5fY2hhbm5lbHMgPiBBVlJFU0FNUExFX01BWF9DSEFOTkVMUykgeworICAgICAgICBhdl9sb2coYXZyLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGlucHV0IGNoYW5uZWwgbGF5b3V0OiAlIlBSSXU2NCJcbiIsCisgICAgICAgICAgICAgICBhdnItPmluX2NoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXZyLT5vdXRfY2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoYXZyLT5vdXRfY2hhbm5lbF9sYXlvdXQpOworICAgIGlmIChhdnItPm91dF9jaGFubmVscyA8PSAwIHx8IGF2ci0+b3V0X2NoYW5uZWxzID4gQVZSRVNBTVBMRV9NQVhfQ0hBTk5FTFMpIHsKKyAgICAgICAgYXZfbG9nKGF2ciwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBvdXRwdXQgY2hhbm5lbCBsYXlvdXQ6ICUiUFJJdTY0IlxuIiwKKyAgICAgICAgICAgICAgIGF2ci0+b3V0X2NoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgYXZyLT5yZXNhbXBsZV9jaGFubmVscyA9IEZGTUlOKGF2ci0+aW5fY2hhbm5lbHMsIGF2ci0+b3V0X2NoYW5uZWxzKTsKKyAgICBhdnItPmRvd25taXhfbmVlZGVkICAgID0gYXZyLT5pbl9jaGFubmVscyAgPiBhdnItPm91dF9jaGFubmVsczsKKyAgICBhdnItPnVwbWl4X25lZWRlZCAgICAgID0gYXZyLT5vdXRfY2hhbm5lbHMgPiBhdnItPmluX2NoYW5uZWxzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghYXZyLT5kb3dubWl4X25lZWRlZCAmJiAoYXZyLT5taXhfbWF0cml4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPmluX2NoYW5uZWxfbGF5b3V0ICE9IGF2ci0+b3V0X2NoYW5uZWxfbGF5b3V0KSk7CisgICAgYXZyLT5taXhpbmdfbmVlZGVkICAgICA9IGF2ci0+ZG93bm1peF9uZWVkZWQgfHwgYXZyLT51cG1peF9uZWVkZWQ7CisKKyAgICAvKiBzZXQgcmVzYW1wbGluZyBwYXJhbWV0ZXJzICovCisgICAgYXZyLT5yZXNhbXBsZV9uZWVkZWQgICA9IGF2ci0+aW5fc2FtcGxlX3JhdGUgIT0gYXZyLT5vdXRfc2FtcGxlX3JhdGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZyLT5mb3JjZV9yZXNhbXBsaW5nOworCisgICAgLyogc2VsZWN0IGludGVybmFsIHNhbXBsZSBmb3JtYXQgaWYgbm90IHNwZWNpZmllZCBieSB0aGUgdXNlciAqLworICAgIGlmIChhdnItPmludGVybmFsX3NhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9OT05FICYmCisgICAgICAgIChhdnItPm1peGluZ19uZWVkZWQgfHwgYXZyLT5yZXNhbXBsZV9uZWVkZWQpKSB7CisgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgIGluX2ZtdCA9IGF2X2dldF9wbGFuYXJfc2FtcGxlX2ZtdChhdnItPmluX3NhbXBsZV9mbXQpOworICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IG91dF9mbXQgPSBhdl9nZXRfcGxhbmFyX3NhbXBsZV9mbXQoYXZyLT5vdXRfc2FtcGxlX2ZtdCk7CisgICAgICAgIGludCBtYXhfYnBzID0gRkZNQVgoYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoaW5fZm10KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShvdXRfZm10KSk7CisgICAgICAgIGlmIChtYXhfYnBzIDw9IDIpIHsKKyAgICAgICAgICAgIGF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzE2UDsKKyAgICAgICAgfSBlbHNlIGlmIChhdnItPm1peGluZ19uZWVkZWQpIHsKKyAgICAgICAgICAgIGF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfRkxUUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtYXhfYnBzIDw9IDQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5fZm10ICA9PSBBVl9TQU1QTEVfRk1UX1MzMlAgfHwKKyAgICAgICAgICAgICAgICAgICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMlApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluX2ZtdCAgPT0gQVZfU0FNUExFX0ZNVF9GTFRQIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgb25lIGlzIHMzMiBhbmQgdGhlIG90aGVyIGlzIGZsdCwgdXNlIGRibCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9EQkxQOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgb25lIGlzIHMzMiBhbmQgdGhlIG90aGVyIGlzIHMzMiwgczE2LCBvciB1OCwgdXNlIHMzMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMzJQOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaWYgb25lIGlzIGZsdCBhbmQgdGhlIG90aGVyIGlzIGZsdCwgczE2IG9yIHU4LCB1c2UgZmx0ICovCisgICAgICAgICAgICAgICAgICAgIGF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfRkxUUDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGlmIGVpdGhlciBpcyBkYmwsIHVzZSBkYmwgKi8KKyAgICAgICAgICAgICAgICBhdnItPmludGVybmFsX3NhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX0RCTFA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKGF2ciwgQVZfTE9HX0RFQlVHLCAiVXNpbmcgJXMgYXMgaW50ZXJuYWwgc2FtcGxlIGZvcm1hdFxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUoYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10KSk7CisgICAgfQorCisgICAgLyogd2UgbWF5IG5lZWQgdG8gYWRkIGFuIGV4dHJhIGNvbnZlcnNpb24gaW4gb3JkZXIgdG8gcmVtYXAgY2hhbm5lbHMgaWYKKyAgICAgICB0aGUgb3V0cHV0IGZvcm1hdCBpcyBub3QgcGxhbmFyICovCisgICAgaWYgKGF2ci0+dXNlX2NoYW5uZWxfbWFwICYmICFhdnItPm1peGluZ19uZWVkZWQgJiYgIWF2ci0+cmVzYW1wbGVfbmVlZGVkICYmCisgICAgICAgICFmZl9zYW1wbGVfZm10X2lzX3BsYW5hcihhdnItPm91dF9zYW1wbGVfZm10LCBhdnItPm91dF9jaGFubmVscykpIHsKKyAgICAgICAgYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10ID0gYXZfZ2V0X3BsYW5hcl9zYW1wbGVfZm10KGF2ci0+b3V0X3NhbXBsZV9mbXQpOworICAgIH0KKworICAgIC8qIHNldCBzYW1wbGUgZm9ybWF0IGNvbnZlcnNpb24gcGFyYW1ldGVycyAqLworICAgIGlmIChhdnItPnJlc2FtcGxlX25lZWRlZCB8fCBhdnItPm1peGluZ19uZWVkZWQpCisgICAgICAgIGF2ci0+aW5fY29udmVydF9uZWVkZWQgPSBhdnItPmluX3NhbXBsZV9mbXQgIT0gYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10OworICAgIGVsc2UKKyAgICAgICAgYXZyLT5pbl9jb252ZXJ0X25lZWRlZCA9IGF2ci0+dXNlX2NoYW5uZWxfbWFwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZmZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoYXZyLT5vdXRfc2FtcGxlX2ZtdCwgYXZyLT5vdXRfY2hhbm5lbHMpOworCisgICAgaWYgKGF2ci0+cmVzYW1wbGVfbmVlZGVkIHx8IGF2ci0+bWl4aW5nX25lZWRlZCB8fCBhdnItPmluX2NvbnZlcnRfbmVlZGVkKQorICAgICAgICBhdnItPm91dF9jb252ZXJ0X25lZWRlZCA9IGF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdCAhPSBhdnItPm91dF9zYW1wbGVfZm10OworICAgIGVsc2UKKyAgICAgICAgYXZyLT5vdXRfY29udmVydF9uZWVkZWQgPSBhdnItPmluX3NhbXBsZV9mbXQgIT0gYXZyLT5vdXRfc2FtcGxlX2ZtdDsKKworICAgIGF2ci0+aW5fY29weV9uZWVkZWQgPSAhYXZyLT5pbl9jb252ZXJ0X25lZWRlZCAmJiAoYXZyLT5taXhpbmdfbmVlZGVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChhdnItPnVzZV9jaGFubmVsX21hcCAmJiBhdnItPnJlc2FtcGxlX25lZWRlZCkpOworCisgICAgaWYgKGF2ci0+dXNlX2NoYW5uZWxfbWFwKSB7CisgICAgICAgIGlmIChhdnItPmluX2NvcHlfbmVlZGVkKSB7CisgICAgICAgICAgICBhdnItPnJlbWFwX3BvaW50ID0gUkVNQVBfSU5fQ09QWTsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAicmVtYXAgY2hhbm5lbHMgZHVyaW5nIGluX2NvcHlcbiIpOworICAgICAgICB9IGVsc2UgaWYgKGF2ci0+aW5fY29udmVydF9uZWVkZWQpIHsKKyAgICAgICAgICAgIGF2ci0+cmVtYXBfcG9pbnQgPSBSRU1BUF9JTl9DT05WRVJUOworICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJyZW1hcCBjaGFubmVscyBkdXJpbmcgaW5fY29udmVydFxuIik7CisgICAgICAgIH0gZWxzZSBpZiAoYXZyLT5vdXRfY29udmVydF9uZWVkZWQpIHsKKyAgICAgICAgICAgIGF2ci0+cmVtYXBfcG9pbnQgPSBSRU1BUF9PVVRfQ09OVkVSVDsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAicmVtYXAgY2hhbm5lbHMgZHVyaW5nIG91dF9jb252ZXJ0XG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2ci0+cmVtYXBfcG9pbnQgPSBSRU1BUF9PVVRfQ09QWTsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAicmVtYXAgY2hhbm5lbHMgZHVyaW5nIG91dF9jb3B5XG4iKTsKKyAgICAgICAgfQorCisjaWZkZWYgREVCVUcKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNoOworICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJvdXRwdXQgbWFwOiAiKTsKKyAgICAgICAgICAgIGlmIChhdnItPmNoX21hcF9pbmZvLmRvX3JlbWFwKQorICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2ci0+aW5fY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAiICUgMmQiLCBhdnItPmNoX21hcF9pbmZvLmNoYW5uZWxfbWFwW2NoXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJuL2EiKTsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAiXG4iKTsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAiY29weSBtYXA6ICAgIik7CisgICAgICAgICAgICBpZiAoYXZyLT5jaF9tYXBfaW5mby5kb19jb3B5KQorICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2ci0+aW5fY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAiICUgMmQiLCBhdnItPmNoX21hcF9pbmZvLmNoYW5uZWxfY29weVtjaF0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAibi9hIik7CisgICAgICAgICAgICBhdl9kbG9nKGF2ciwgIlxuIik7CisgICAgICAgICAgICBhdl9kbG9nKGF2ciwgInplcm8gbWFwOiAgICIpOworICAgICAgICAgICAgaWYgKGF2ci0+Y2hfbWFwX2luZm8uZG9femVybykKKyAgICAgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBhdnItPmluX2NoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgICAgICBhdl9kbG9nKGF2ciwgIiAlIDJkIiwgYXZyLT5jaF9tYXBfaW5mby5jaGFubmVsX3plcm9bY2hdKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdl9kbG9nKGF2ciwgIm4vYSIpOworICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJcbiIpOworICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJpbnB1dCBtYXA6ICAiKTsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2ci0+aW5fY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgYXZfZGxvZyhhdnIsICIgJSAyZCIsIGF2ci0+Y2hfbWFwX2luZm8uaW5wdXRfbWFwW2NoXSk7CisgICAgICAgICAgICBhdl9kbG9nKGF2ciwgIlxuIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgICBhdnItPnJlbWFwX3BvaW50ID0gUkVNQVBfTk9ORTsKKworICAgIC8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KKyAgICBpZiAoYXZyLT5pbl9jb3B5X25lZWRlZCB8fCBhdnItPmluX2NvbnZlcnRfbmVlZGVkKSB7CisgICAgICAgIGF2ci0+aW5fYnVmZmVyID0gZmZfYXVkaW9fZGF0YV9hbGxvYyhGRk1BWChhdnItPmluX2NoYW5uZWxzLCBhdnItPm91dF9jaGFubmVscyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBhdnItPmludGVybmFsX3NhbXBsZV9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5fYnVmZmVyIik7CisgICAgICAgIGlmICghYXZyLT5pbl9idWZmZXIpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGF2ci0+cmVzYW1wbGVfbmVlZGVkKSB7CisgICAgICAgIGF2ci0+cmVzYW1wbGVfb3V0X2J1ZmZlciA9IGZmX2F1ZGlvX2RhdGFfYWxsb2MoYXZyLT5vdXRfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCwgYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNhbXBsZV9vdXRfYnVmZmVyIik7CisgICAgICAgIGlmICghYXZyLT5yZXNhbXBsZV9vdXRfYnVmZmVyKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhdnItPm91dF9jb252ZXJ0X25lZWRlZCkgeworICAgICAgICBhdnItPm91dF9idWZmZXIgPSBmZl9hdWRpb19kYXRhX2FsbG9jKGF2ci0+b3V0X2NoYW5uZWxzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ci0+b3V0X3NhbXBsZV9mbXQsICJvdXRfYnVmZmVyIik7CisgICAgICAgIGlmICghYXZyLT5vdXRfYnVmZmVyKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIGF2ci0+b3V0X2ZpZm8gPSBhdl9hdWRpb19maWZvX2FsbG9jKGF2ci0+b3V0X3NhbXBsZV9mbXQsIGF2ci0+b3V0X2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQpOworICAgIGlmICghYXZyLT5vdXRfZmlmbykgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogc2V0dXAgY29udGV4dHMgKi8KKyAgICBpZiAoYXZyLT5pbl9jb252ZXJ0X25lZWRlZCkgeworICAgICAgICBhdnItPmFjX2luID0gZmZfYXVkaW9fY29udmVydF9hbGxvYyhhdnIsIGF2ci0+aW50ZXJuYWxfc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZyLT5pbl9zYW1wbGVfZm10LCBhdnItPmluX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPmluX3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPnJlbWFwX3BvaW50ID09IFJFTUFQX0lOX0NPTlZFUlQpOworICAgICAgICBpZiAoIWF2ci0+YWNfaW4pIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGF2ci0+b3V0X2NvbnZlcnRfbmVlZGVkKSB7CisgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc3JjX2ZtdDsKKyAgICAgICAgaWYgKGF2ci0+aW5fY29udmVydF9uZWVkZWQpCisgICAgICAgICAgICBzcmNfZm10ID0gYXZyLT5pbnRlcm5hbF9zYW1wbGVfZm10OworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcmNfZm10ID0gYXZyLT5pbl9zYW1wbGVfZm10OworICAgICAgICBhdnItPmFjX291dCA9IGZmX2F1ZGlvX2NvbnZlcnRfYWxsb2MoYXZyLCBhdnItPm91dF9zYW1wbGVfZm10LCBzcmNfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZyLT5vdXRfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPm91dF9zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ci0+cmVtYXBfcG9pbnQgPT0gUkVNQVBfT1VUX0NPTlZFUlQpOworICAgICAgICBpZiAoIWF2ci0+YWNfb3V0KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhdnItPnJlc2FtcGxlX25lZWRlZCkgeworICAgICAgICBhdnItPnJlc2FtcGxlID0gZmZfYXVkaW9fcmVzYW1wbGVfaW5pdChhdnIpOworICAgICAgICBpZiAoIWF2ci0+cmVzYW1wbGUpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGF2ci0+bWl4aW5nX25lZWRlZCkgeworICAgICAgICBhdnItPmFtID0gZmZfYXVkaW9fbWl4X2FsbG9jKGF2cik7CisgICAgICAgIGlmICghYXZyLT5hbSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBhdnJlc2FtcGxlX2Nsb3NlKGF2cik7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2cmVzYW1wbGVfaXNfb3BlbihBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIpCit7CisgICAgcmV0dXJuICEhYXZyLT5vdXRfZmlmbzsKK30KKwordm9pZCBhdnJlc2FtcGxlX2Nsb3NlKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2cikKK3sKKyAgICBmZl9hdWRpb19kYXRhX2ZyZWUoJmF2ci0+aW5fYnVmZmVyKTsKKyAgICBmZl9hdWRpb19kYXRhX2ZyZWUoJmF2ci0+cmVzYW1wbGVfb3V0X2J1ZmZlcik7CisgICAgZmZfYXVkaW9fZGF0YV9mcmVlKCZhdnItPm91dF9idWZmZXIpOworICAgIGF2X2F1ZGlvX2ZpZm9fZnJlZShhdnItPm91dF9maWZvKTsKKyAgICBhdnItPm91dF9maWZvID0gTlVMTDsKKyAgICBmZl9hdWRpb19jb252ZXJ0X2ZyZWUoJmF2ci0+YWNfaW4pOworICAgIGZmX2F1ZGlvX2NvbnZlcnRfZnJlZSgmYXZyLT5hY19vdXQpOworICAgIGZmX2F1ZGlvX3Jlc2FtcGxlX2ZyZWUoJmF2ci0+cmVzYW1wbGUpOworICAgIGZmX2F1ZGlvX21peF9mcmVlKCZhdnItPmFtKTsKKyAgICBhdl9mcmVlcCgmYXZyLT5taXhfbWF0cml4KTsKKworICAgIGF2ci0+dXNlX2NoYW5uZWxfbWFwID0gMDsKK30KKwordm9pZCBhdnJlc2FtcGxlX2ZyZWUoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqKmF2cikKK3sKKyAgICBpZiAoISphdnIpCisgICAgICAgIHJldHVybjsKKyAgICBhdnJlc2FtcGxlX2Nsb3NlKCphdnIpOworICAgIGF2X29wdF9mcmVlKCphdnIpOworICAgIGF2X2ZyZWVwKGF2cik7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2J1ZmZlcmVkX291dHB1dChBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EYXRhICpvdXRwdXQsIEF1ZGlvRGF0YSAqY29udmVydGVkKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoIW91dHB1dCB8fCBhdl9hdWRpb19maWZvX3NpemUoYXZyLT5vdXRfZmlmbykgPiAwIHx8CisgICAgICAgIChjb252ZXJ0ZWQgJiYgb3V0cHV0LT5hbGxvY2F0ZWRfc2FtcGxlcyA8IGNvbnZlcnRlZC0+bmJfc2FtcGxlcykpIHsKKyAgICAgICAgaWYgKGNvbnZlcnRlZCkgeworICAgICAgICAgICAgLyogaWYgdGhlcmUgYXJlIGFueSBzYW1wbGVzIGluIHRoZSBvdXRwdXQgRklGTyBvciBpZiB0aGUKKyAgICAgICAgICAgICAgIHVzZXItc3VwcGxpZWQgb3V0cHV0IGJ1ZmZlciBpcyBub3QgbGFyZ2UgZW5vdWdoIGZvciBhbGwgc2FtcGxlcywKKyAgICAgICAgICAgICAgIHdlIGFkZCB0byB0aGUgb3V0cHV0IEZJRk8gKi8KKyAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAiW0ZJRk9dIGFkZCAlcyB0byBvdXRfZmlmb1xuIiwgY29udmVydGVkLT5uYW1lKTsKKyAgICAgICAgICAgIHJldCA9IGZmX2F1ZGlvX2RhdGFfYWRkX3RvX2ZpZm8oYXZyLT5vdXRfZmlmbywgY29udmVydGVkLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQtPm5iX3NhbXBsZXMpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBhbiBvdXRwdXQgYnVmZmVyLCByZWFkIHNhbXBsZXMgZnJvbSB0aGUgb3V0cHV0CisgICAgICAgICAgIEZJRk8gdG8gdGhlIHVzZXIgb3V0cHV0ICovCisgICAgICAgIGlmIChvdXRwdXQgJiYgb3V0cHV0LT5hbGxvY2F0ZWRfc2FtcGxlcyA+IDApIHsKKyAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAiW0ZJRk9dIHJlYWQgZnJvbSBvdXRfZmlmbyB0byBvdXRwdXRcbiIpOworICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJbZW5kIGNvbnZlcnNpb25dXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBmZl9hdWRpb19kYXRhX3JlYWRfZnJvbV9maWZvKGF2ci0+b3V0X2ZpZm8sIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+YWxsb2NhdGVkX3NhbXBsZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjb252ZXJ0ZWQpIHsKKyAgICAgICAgLyogY29weSBkaXJlY3RseSB0byBvdXRwdXQgaWYgaXQgaXMgbGFyZ2UgZW5vdWdoIG9yIHRoZXJlIGlzIG5vdCBhbnkKKyAgICAgICAgICAgZGF0YSBpbiB0aGUgb3V0cHV0IEZJRk8gKi8KKyAgICAgICAgYXZfZGxvZyhhdnIsICJbY29weV0gJXMgdG8gb3V0cHV0XG4iLCBjb252ZXJ0ZWQtPm5hbWUpOworICAgICAgICBvdXRwdXQtPm5iX3NhbXBsZXMgPSAwOworICAgICAgICByZXQgPSBmZl9hdWRpb19kYXRhX2NvcHkob3V0cHV0LCBjb252ZXJ0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPnJlbWFwX3BvaW50ID09IFJFTUFQX09VVF9DT1BZID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdnItPmNoX21hcF9pbmZvIDogTlVMTCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYXZfZGxvZyhhdnIsICJbZW5kIGNvbnZlcnNpb25dXG4iKTsKKyAgICAgICAgcmV0dXJuIG91dHB1dC0+bmJfc2FtcGxlczsKKyAgICB9CisgICAgYXZfZGxvZyhhdnIsICJbZW5kIGNvbnZlcnNpb25dXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF0dHJpYnV0ZV9hbGlnbl9hcmcgYXZyZXNhbXBsZV9jb252ZXJ0KEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqb3V0cHV0LCBpbnQgb3V0X3BsYW5lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9zYW1wbGVzLCB1aW50OF90ICoqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluX3BsYW5lX3NpemUsIGludCBpbl9zYW1wbGVzKQoreworICAgIEF1ZGlvRGF0YSBpbnB1dF9idWZmZXI7CisgICAgQXVkaW9EYXRhIG91dHB1dF9idWZmZXI7CisgICAgQXVkaW9EYXRhICpjdXJyZW50X2J1ZmZlcjsKKyAgICBpbnQgcmV0LCBkaXJlY3Rfb3V0cHV0OworCisgICAgLyogcmVzZXQgaW50ZXJuYWwgYnVmZmVycyAqLworICAgIGlmIChhdnItPmluX2J1ZmZlcikgeworICAgICAgICBhdnItPmluX2J1ZmZlci0+bmJfc2FtcGxlcyA9IDA7CisgICAgICAgIGZmX2F1ZGlvX2RhdGFfc2V0X2NoYW5uZWxzKGF2ci0+aW5fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPmluX2J1ZmZlci0+YWxsb2NhdGVkX2NoYW5uZWxzKTsKKyAgICB9CisgICAgaWYgKGF2ci0+cmVzYW1wbGVfb3V0X2J1ZmZlcikgeworICAgICAgICBhdnItPnJlc2FtcGxlX291dF9idWZmZXItPm5iX3NhbXBsZXMgPSAwOworICAgICAgICBmZl9hdWRpb19kYXRhX3NldF9jaGFubmVscyhhdnItPnJlc2FtcGxlX291dF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ci0+cmVzYW1wbGVfb3V0X2J1ZmZlci0+YWxsb2NhdGVkX2NoYW5uZWxzKTsKKyAgICB9CisgICAgaWYgKGF2ci0+b3V0X2J1ZmZlcikgeworICAgICAgICBhdnItPm91dF9idWZmZXItPm5iX3NhbXBsZXMgPSAwOworICAgICAgICBmZl9hdWRpb19kYXRhX3NldF9jaGFubmVscyhhdnItPm91dF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ci0+b3V0X2J1ZmZlci0+YWxsb2NhdGVkX2NoYW5uZWxzKTsKKyAgICB9CisKKyAgICBhdl9kbG9nKGF2ciwgIltzdGFydCBjb252ZXJzaW9uXVxuIik7CisKKyAgICAvKiBpbml0aWFsaXplIG91dHB1dF9idWZmZXIgd2l0aCBvdXRwdXQgZGF0YSAqLworICAgIGRpcmVjdF9vdXRwdXQgPSBvdXRwdXQgJiYgYXZfYXVkaW9fZmlmb19zaXplKGF2ci0+b3V0X2ZpZm8pID09IDA7CisgICAgaWYgKG91dHB1dCkgeworICAgICAgICByZXQgPSBmZl9hdWRpb19kYXRhX2luaXQoJm91dHB1dF9idWZmZXIsIG91dHB1dCwgb3V0X3BsYW5lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPm91dF9jaGFubmVscywgb3V0X3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPm91dF9zYW1wbGVfZm10LCAwLCAib3V0cHV0Iik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgb3V0cHV0X2J1ZmZlci5uYl9zYW1wbGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQpIHsKKyAgICAgICAgLyogaW5pdGlhbGl6ZSBpbnB1dF9idWZmZXIgd2l0aCBpbnB1dCBkYXRhICovCisgICAgICAgIHJldCA9IGZmX2F1ZGlvX2RhdGFfaW5pdCgmaW5wdXRfYnVmZmVyLCBpbnB1dCwgaW5fcGxhbmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ci0+aW5fY2hhbm5lbHMsIGluX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPmluX3NhbXBsZV9mbXQsIDEsICJpbnB1dCIpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGN1cnJlbnRfYnVmZmVyID0gJmlucHV0X2J1ZmZlcjsKKworICAgICAgICBpZiAoYXZyLT51cG1peF9uZWVkZWQgJiYgIWF2ci0+aW5fY29udmVydF9uZWVkZWQgJiYgIWF2ci0+cmVzYW1wbGVfbmVlZGVkICYmCisgICAgICAgICAgICAhYXZyLT5vdXRfY29udmVydF9uZWVkZWQgJiYgZGlyZWN0X291dHB1dCAmJiBvdXRfc2FtcGxlcyA+PSBpbl9zYW1wbGVzKSB7CisgICAgICAgICAgICAvKiBpbiBzb21lIHJhcmUgY2FzZXMgd2UgY2FuIGNvcHkgaW5wdXQgdG8gb3V0cHV0IGFuZCB1cG1peAorICAgICAgICAgICAgICAgZGlyZWN0bHkgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAiW2NvcHldICVzIHRvIG91dHB1dFxuIiwgY3VycmVudF9idWZmZXItPm5hbWUpOworICAgICAgICAgICAgcmV0ID0gZmZfYXVkaW9fZGF0YV9jb3B5KCZvdXRwdXRfYnVmZmVyLCBjdXJyZW50X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPnJlbWFwX3BvaW50ID09IFJFTUFQX09VVF9DT1BZID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZyLT5jaF9tYXBfaW5mbyA6IE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyID0gJm91dHB1dF9idWZmZXI7CisgICAgICAgIH0gZWxzZSBpZiAoYXZyLT5yZW1hcF9wb2ludCA9PSBSRU1BUF9PVVRfQ09QWSAmJgorICAgICAgICAgICAgICAgICAgICghZGlyZWN0X291dHB1dCB8fCBvdXRfc2FtcGxlcyA8IGluX3NhbXBsZXMpKSB7CisgICAgICAgICAgICAvKiBpZiByZW1hcHBpbmcgY2hhbm5lbHMgZHVyaW5nIG91dHB1dCBjb3B5LCB3ZSBtYXkgbmVlZCB0bworICAgICAgICAgICAgICogdXNlIGFuIGludGVybWVkaWF0ZSBidWZmZXIgaW4gb3JkZXIgdG8gcmVtYXAgYmVmb3JlIGFkZGluZworICAgICAgICAgICAgICogc2FtcGxlcyB0byB0aGUgb3V0cHV0IGZpZm8gKi8KKyAgICAgICAgICAgIGF2X2Rsb2coYXZyLCAiW2NvcHldICVzIHRvIG91dF9idWZmZXJcbiIsIGN1cnJlbnRfYnVmZmVyLT5uYW1lKTsKKyAgICAgICAgICAgIHJldCA9IGZmX2F1ZGlvX2RhdGFfY29weShhdnItPm91dF9idWZmZXIsIGN1cnJlbnRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdnItPmNoX21hcF9pbmZvKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBjdXJyZW50X2J1ZmZlciA9IGF2ci0+b3V0X2J1ZmZlcjsKKyAgICAgICAgfSBlbHNlIGlmIChhdnItPmluX2NvcHlfbmVlZGVkIHx8IGF2ci0+aW5fY29udmVydF9uZWVkZWQpIHsKKyAgICAgICAgICAgIC8qIGlmIG5lZWRlZCwgY29weSBvciBjb252ZXJ0IGlucHV0IHRvIGluX2J1ZmZlciwgYW5kIGRvd25taXggaWYKKyAgICAgICAgICAgICAgIGFwcGxpY2FibGUgKi8KKyAgICAgICAgICAgIGlmIChhdnItPmluX2NvbnZlcnRfbmVlZGVkKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfYXVkaW9fZGF0YV9yZWFsbG9jKGF2ci0+aW5fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2J1ZmZlci0+bmJfc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJbY29udmVydF0gJXMgdG8gaW5fYnVmZmVyXG4iLCBjdXJyZW50X2J1ZmZlci0+bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfYXVkaW9fY29udmVydChhdnItPmFjX2luLCBhdnItPmluX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJbY29weV0gJXMgdG8gaW5fYnVmZmVyXG4iLCBjdXJyZW50X2J1ZmZlci0+bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfYXVkaW9fZGF0YV9jb3B5KGF2ci0+aW5fYnVmZmVyLCBjdXJyZW50X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZyLT5yZW1hcF9wb2ludCA9PSBSRU1BUF9JTl9DT1BZID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2ci0+Y2hfbWFwX2luZm8gOiBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZmX2F1ZGlvX2RhdGFfc2V0X2NoYW5uZWxzKGF2ci0+aW5fYnVmZmVyLCBhdnItPmluX2NoYW5uZWxzKTsKKyAgICAgICAgICAgIGlmIChhdnItPmRvd25taXhfbmVlZGVkKSB7CisgICAgICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJbZG93bm1peF0gaW5fYnVmZmVyXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBmZl9hdWRpb19taXgoYXZyLT5hbSwgYXZyLT5pbl9idWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudF9idWZmZXIgPSBhdnItPmluX2J1ZmZlcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGZsdXNoIHJlc2FtcGxpbmcgYnVmZmVyIGFuZC9vciBvdXRwdXQgRklGTyBpZiBpbnB1dCBpcyBOVUxMICovCisgICAgICAgIGlmICghYXZyLT5yZXNhbXBsZV9uZWVkZWQpCisgICAgICAgICAgICByZXR1cm4gaGFuZGxlX2J1ZmZlcmVkX291dHB1dChhdnIsIG91dHB1dCA/ICZvdXRwdXRfYnVmZmVyIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBjdXJyZW50X2J1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGF2ci0+cmVzYW1wbGVfbmVlZGVkKSB7CisgICAgICAgIEF1ZGlvRGF0YSAqcmVzYW1wbGVfb3V0OworCisgICAgICAgIGlmICghYXZyLT5vdXRfY29udmVydF9uZWVkZWQgJiYgZGlyZWN0X291dHB1dCAmJiBvdXRfc2FtcGxlcyA+IDApCisgICAgICAgICAgICByZXNhbXBsZV9vdXQgPSAmb3V0cHV0X2J1ZmZlcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzYW1wbGVfb3V0ID0gYXZyLT5yZXNhbXBsZV9vdXRfYnVmZmVyOworICAgICAgICBhdl9kbG9nKGF2ciwgIltyZXNhbXBsZV0gJXMgdG8gJXNcbiIsCisgICAgICAgICAgICAgICAgY3VycmVudF9idWZmZXIgPyBjdXJyZW50X2J1ZmZlci0+bmFtZSA6ICJudWxsIiwKKyAgICAgICAgICAgICAgICByZXNhbXBsZV9vdXQtPm5hbWUpOworICAgICAgICByZXQgPSBmZl9hdWRpb19yZXNhbXBsZShhdnItPnJlc2FtcGxlLCByZXNhbXBsZV9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIC8qIGlmIHJlc2FtcGxpbmcgZGlkIG5vdCBwcm9kdWNlIGFueSBzYW1wbGVzLCBqdXN0IHJldHVybiAwICovCisgICAgICAgIGlmIChyZXNhbXBsZV9vdXQtPm5iX3NhbXBsZXMgPT0gMCkgeworICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJbZW5kIGNvbnZlcnNpb25dXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudF9idWZmZXIgPSByZXNhbXBsZV9vdXQ7CisgICAgfQorCisgICAgaWYgKGF2ci0+dXBtaXhfbmVlZGVkKSB7CisgICAgICAgIGF2X2Rsb2coYXZyLCAiW3VwbWl4XSAlc1xuIiwgY3VycmVudF9idWZmZXItPm5hbWUpOworICAgICAgICByZXQgPSBmZl9hdWRpb19taXgoYXZyLT5hbSwgY3VycmVudF9idWZmZXIpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogaWYgd2UgcmVzYW1wbGVkIG9yIHVwbWl4ZWQgZGlyZWN0bHkgdG8gb3V0cHV0LCByZXR1cm4gaGVyZSAqLworICAgIGlmIChjdXJyZW50X2J1ZmZlciA9PSAmb3V0cHV0X2J1ZmZlcikgeworICAgICAgICBhdl9kbG9nKGF2ciwgIltlbmQgY29udmVyc2lvbl1cbiIpOworICAgICAgICByZXR1cm4gY3VycmVudF9idWZmZXItPm5iX3NhbXBsZXM7CisgICAgfQorCisgICAgaWYgKGF2ci0+b3V0X2NvbnZlcnRfbmVlZGVkKSB7CisgICAgICAgIGlmIChkaXJlY3Rfb3V0cHV0ICYmIG91dF9zYW1wbGVzID49IGN1cnJlbnRfYnVmZmVyLT5uYl9zYW1wbGVzKSB7CisgICAgICAgICAgICAvKiBjb252ZXJ0IGRpcmVjdGx5IHRvIG91dHB1dCAqLworICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJbY29udmVydF0gJXMgdG8gb3V0cHV0XG4iLCBjdXJyZW50X2J1ZmZlci0+bmFtZSk7CisgICAgICAgICAgICByZXQgPSBmZl9hdWRpb19jb252ZXJ0KGF2ci0+YWNfb3V0LCAmb3V0cHV0X2J1ZmZlciwgY3VycmVudF9idWZmZXIpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgYXZfZGxvZyhhdnIsICJbZW5kIGNvbnZlcnNpb25dXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXRfYnVmZmVyLm5iX3NhbXBsZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBmZl9hdWRpb19kYXRhX3JlYWxsb2MoYXZyLT5vdXRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBhdl9kbG9nKGF2ciwgIltjb252ZXJ0XSAlcyB0byBvdXRfYnVmZmVyXG4iLCBjdXJyZW50X2J1ZmZlci0+bmFtZSk7CisgICAgICAgICAgICByZXQgPSBmZl9hdWRpb19jb252ZXJ0KGF2ci0+YWNfb3V0LCBhdnItPm91dF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBjdXJyZW50X2J1ZmZlciA9IGF2ci0+b3V0X2J1ZmZlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBoYW5kbGVfYnVmZmVyZWRfb3V0cHV0KGF2ciwgb3V0cHV0ID8gJm91dHB1dF9idWZmZXIgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyKTsKK30KKworaW50IGF2cmVzYW1wbGVfY29uZmlnKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwgQVZGcmFtZSAqb3V0LCBBVkZyYW1lICppbikKK3sKKyAgICBpZiAoYXZyZXNhbXBsZV9pc19vcGVuKGF2cikpIHsKKyAgICAgICAgYXZyZXNhbXBsZV9jbG9zZShhdnIpOworICAgIH0KKworICAgIGlmIChpbikgeworICAgICAgICBhdnItPmluX2NoYW5uZWxfbGF5b3V0ICA9IGluLT5jaGFubmVsX2xheW91dDsKKyAgICAgICAgYXZyLT5pbl9zYW1wbGVfcmF0ZSAgICAgPSBpbi0+c2FtcGxlX3JhdGU7CisgICAgICAgIGF2ci0+aW5fc2FtcGxlX2ZtdCAgICAgID0gaW4tPmZvcm1hdDsKKyAgICB9CisKKyAgICBpZiAob3V0KSB7CisgICAgICAgIGF2ci0+b3V0X2NoYW5uZWxfbGF5b3V0ID0gb3V0LT5jaGFubmVsX2xheW91dDsKKyAgICAgICAgYXZyLT5vdXRfc2FtcGxlX3JhdGUgICAgPSBvdXQtPnNhbXBsZV9yYXRlOworICAgICAgICBhdnItPm91dF9zYW1wbGVfZm10ICAgICA9IG91dC0+Zm9ybWF0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19jaGFuZ2VkKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqb3V0LCBBVkZyYW1lICppbikKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChpbikgeworICAgICAgICBpZiAoYXZyLT5pbl9jaGFubmVsX2xheW91dCAhPSBpbi0+Y2hhbm5lbF9sYXlvdXQgfHwKKyAgICAgICAgICAgIGF2ci0+aW5fc2FtcGxlX3JhdGUgICAgIT0gaW4tPnNhbXBsZV9yYXRlIHx8CisgICAgICAgICAgICBhdnItPmluX3NhbXBsZV9mbXQgICAgICE9IGluLT5mb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCB8PSBBVkVSUk9SX0lOUFVUX0NIQU5HRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0KSB7CisgICAgICAgIGlmIChhdnItPm91dF9jaGFubmVsX2xheW91dCAhPSBvdXQtPmNoYW5uZWxfbGF5b3V0IHx8CisgICAgICAgICAgICBhdnItPm91dF9zYW1wbGVfcmF0ZSAgICAhPSBvdXQtPnNhbXBsZV9yYXRlIHx8CisgICAgICAgICAgICBhdnItPm91dF9zYW1wbGVfZm10ICAgICAhPSBvdXQtPmZvcm1hdCkgeworICAgICAgICAgICAgcmV0IHw9IEFWRVJST1JfT1VUUFVUX0NIQU5HRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBjb252ZXJ0X2ZyYW1lKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqb3V0LCBBVkZyYW1lICppbikKK3sKKyAgICBpbnQgcmV0OworICAgIHVpbnQ4X3QgKipvdXRfZGF0YSA9IE5VTEwsICoqaW5fZGF0YSA9IE5VTEw7CisgICAgaW50IG91dF9saW5lc2l6ZSA9IDAsIGluX2xpbmVzaXplID0gMDsKKyAgICBpbnQgb3V0X25iX3NhbXBsZXMgPSAwLCBpbl9uYl9zYW1wbGVzID0gMDsKKworICAgIGlmIChvdXQpIHsKKyAgICAgICAgb3V0X2RhdGEgICAgICAgPSBvdXQtPmV4dGVuZGVkX2RhdGE7CisgICAgICAgIG91dF9saW5lc2l6ZSAgID0gb3V0LT5saW5lc2l6ZVswXTsKKyAgICAgICAgb3V0X25iX3NhbXBsZXMgPSBvdXQtPm5iX3NhbXBsZXM7CisgICAgfQorCisgICAgaWYgKGluKSB7CisgICAgICAgIGluX2RhdGEgICAgICAgPSBpbi0+ZXh0ZW5kZWRfZGF0YTsKKyAgICAgICAgaW5fbGluZXNpemUgICA9IGluLT5saW5lc2l6ZVswXTsKKyAgICAgICAgaW5fbmJfc2FtcGxlcyA9IGluLT5uYl9zYW1wbGVzOworICAgIH0KKworICAgIHJldCA9IGF2cmVzYW1wbGVfY29udmVydChhdnIsIG91dF9kYXRhLCBvdXRfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9kYXRhLCBpbl9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fbmJfc2FtcGxlcyk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAob3V0KQorICAgICAgICAgICAgb3V0LT5uYl9zYW1wbGVzID0gMDsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAob3V0KQorICAgICAgICBvdXQtPm5iX3NhbXBsZXMgPSByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXZhaWxhYmxlX3NhbXBsZXMoQVZGcmFtZSAqb3V0KQoreworICAgIGludCBzYW1wbGVzOworICAgIGludCBieXRlc19wZXJfc2FtcGxlID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUob3V0LT5mb3JtYXQpOworICAgIGlmICghYnl0ZXNfcGVyX3NhbXBsZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHNhbXBsZXMgPSBvdXQtPmxpbmVzaXplWzBdIC8gYnl0ZXNfcGVyX3NhbXBsZTsKKyAgICBpZiAoYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIob3V0LT5mb3JtYXQpKSB7CisgICAgICAgIHJldHVybiBzYW1wbGVzOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBjaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhvdXQtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgcmV0dXJuIHNhbXBsZXMgLyBjaGFubmVsczsKKyAgICB9Cit9CisKK2ludCBhdnJlc2FtcGxlX2NvbnZlcnRfZnJhbWUoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXQsIEFWRnJhbWUgKmluKQoreworICAgIGludCByZXQsIHNldHVwID0gMDsKKworICAgIGlmICghYXZyZXNhbXBsZV9pc19vcGVuKGF2cikpIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdnJlc2FtcGxlX2NvbmZpZyhhdnIsIG91dCwgaW4pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IGF2cmVzYW1wbGVfb3BlbihhdnIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBzZXR1cCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcmV0dXJuIGFzIGlzIG9yIHJlY29uZmlndXJlIGZvciBpbnB1dCBjaGFuZ2VzPworICAgICAgICBpZiAoKHJldCA9IGNvbmZpZ19jaGFuZ2VkKGF2ciwgb3V0LCBpbikpKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAob3V0KSB7CisgICAgICAgIGlmICghb3V0LT5saW5lc2l6ZVswXSkgeworICAgICAgICAgICAgb3V0LT5uYl9zYW1wbGVzID0gYXZyZXNhbXBsZV9nZXRfb3V0X3NhbXBsZXMoYXZyLCBpbi0+bmJfc2FtcGxlcyk7CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX2dldF9idWZmZXIob3V0LCAwKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNldHVwKQorICAgICAgICAgICAgICAgICAgICBhdnJlc2FtcGxlX2Nsb3NlKGF2cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghb3V0LT5uYl9zYW1wbGVzKQorICAgICAgICAgICAgICAgIG91dC0+bmJfc2FtcGxlcyA9IGF2YWlsYWJsZV9zYW1wbGVzKG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY29udmVydF9mcmFtZShhdnIsIG91dCwgaW4pOworfQorCitpbnQgYXZyZXNhbXBsZV9nZXRfbWF0cml4KEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwgZG91YmxlICptYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCit7CisgICAgaW50IGluX2NoYW5uZWxzLCBvdXRfY2hhbm5lbHMsIGksIG87CisKKyAgICBpZiAoYXZyLT5hbSkKKyAgICAgICAgcmV0dXJuIGZmX2F1ZGlvX21peF9nZXRfbWF0cml4KGF2ci0+YW0sIG1hdHJpeCwgc3RyaWRlKTsKKworICAgIGluX2NoYW5uZWxzICA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhhdnItPmluX2NoYW5uZWxfbGF5b3V0KTsKKyAgICBvdXRfY2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoYXZyLT5vdXRfY2hhbm5lbF9sYXlvdXQpOworCisgICAgaWYgKCBpbl9jaGFubmVscyA8PSAwIHx8ICBpbl9jaGFubmVscyA+IEFWUkVTQU1QTEVfTUFYX0NIQU5ORUxTIHx8CisgICAgICAgIG91dF9jaGFubmVscyA8PSAwIHx8IG91dF9jaGFubmVscyA+IEFWUkVTQU1QTEVfTUFYX0NIQU5ORUxTKSB7CisgICAgICAgIGF2X2xvZyhhdnIsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY2hhbm5lbCBsYXlvdXRzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoIWF2ci0+bWl4X21hdHJpeCkgeworICAgICAgICBhdl9sb2coYXZyLCBBVl9MT0dfRVJST1IsICJtYXRyaXggaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZm9yIChvID0gMDsgbyA8IG91dF9jaGFubmVsczsgbysrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5fY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIG1hdHJpeFtvICogc3RyaWRlICsgaV0gPSBhdnItPm1peF9tYXRyaXhbbyAqIGluX2NoYW5uZWxzICsgaV07CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2cmVzYW1wbGVfc2V0X21hdHJpeChBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsIGNvbnN0IGRvdWJsZSAqbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQoreworICAgIGludCBpbl9jaGFubmVscywgb3V0X2NoYW5uZWxzLCBpLCBvOworCisgICAgaWYgKGF2ci0+YW0pCisgICAgICAgIHJldHVybiBmZl9hdWRpb19taXhfc2V0X21hdHJpeChhdnItPmFtLCBtYXRyaXgsIHN0cmlkZSk7CisKKyAgICBpbl9jaGFubmVscyAgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoYXZyLT5pbl9jaGFubmVsX2xheW91dCk7CisgICAgb3V0X2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGF2ci0+b3V0X2NoYW5uZWxfbGF5b3V0KTsKKworICAgIGlmICggaW5fY2hhbm5lbHMgPD0gMCB8fCAgaW5fY2hhbm5lbHMgPiBBVlJFU0FNUExFX01BWF9DSEFOTkVMUyB8fAorICAgICAgICBvdXRfY2hhbm5lbHMgPD0gMCB8fCBvdXRfY2hhbm5lbHMgPiBBVlJFU0FNUExFX01BWF9DSEFOTkVMUykgeworICAgICAgICBhdl9sb2coYXZyLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNoYW5uZWwgbGF5b3V0c1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGF2ci0+bWl4X21hdHJpeCkKKyAgICAgICAgYXZfZnJlZXAoJmF2ci0+bWl4X21hdHJpeCk7CisgICAgYXZyLT5taXhfbWF0cml4ID0gYXZfbWFsbG9jKGluX2NoYW5uZWxzICogb3V0X2NoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCphdnItPm1peF9tYXRyaXgpKTsKKyAgICBpZiAoIWF2ci0+bWl4X21hdHJpeCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAobyA9IDA7IG8gPCBvdXRfY2hhbm5lbHM7IG8rKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluX2NoYW5uZWxzOyBpKyspCisgICAgICAgICAgICBhdnItPm1peF9tYXRyaXhbbyAqIGluX2NoYW5uZWxzICsgaV0gPSBtYXRyaXhbbyAqIHN0cmlkZSArIGldOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdnJlc2FtcGxlX3NldF9jaGFubmVsX21hcHBpbmcoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmNoYW5uZWxfbWFwKQoreworICAgIENoYW5uZWxNYXBJbmZvICppbmZvID0gJmF2ci0+Y2hfbWFwX2luZm87CisgICAgaW50IGluX2NoYW5uZWxzLCBjaCwgaTsKKworICAgIGluX2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGF2ci0+aW5fY2hhbm5lbF9sYXlvdXQpOworICAgIGlmIChpbl9jaGFubmVscyA8PSAwIHx8ICBpbl9jaGFubmVscyA+IEFWUkVTQU1QTEVfTUFYX0NIQU5ORUxTKSB7CisgICAgICAgIGF2X2xvZyhhdnIsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgaW5wdXQgY2hhbm5lbCBsYXlvdXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKyAgICBtZW1zZXQoaW5mby0+aW5wdXRfbWFwLCAtMSwgc2l6ZW9mKGluZm8tPmlucHV0X21hcCkpOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgaW5fY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKGNoYW5uZWxfbWFwW2NoXSA+PSBpbl9jaGFubmVscykgeworICAgICAgICAgICAgYXZfbG9nKGF2ciwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaGFubmVsIG1hcFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGlmIChjaGFubmVsX21hcFtjaF0gPCAwKSB7CisgICAgICAgICAgICBpbmZvLT5jaGFubmVsX3plcm9bY2hdID0gIDE7CisgICAgICAgICAgICBpbmZvLT5jaGFubmVsX21hcFtjaF0gID0gLTE7CisgICAgICAgICAgICBpbmZvLT5kb196ZXJvICAgICAgICAgID0gIDE7CisgICAgICAgIH0gZWxzZSBpZiAoaW5mby0+aW5wdXRfbWFwW2NoYW5uZWxfbWFwW2NoXV0gPj0gMCkgeworICAgICAgICAgICAgaW5mby0+Y2hhbm5lbF9jb3B5W2NoXSA9IGluZm8tPmlucHV0X21hcFtjaGFubmVsX21hcFtjaF1dOworICAgICAgICAgICAgaW5mby0+Y2hhbm5lbF9tYXBbY2hdICA9IC0xOworICAgICAgICAgICAgaW5mby0+ZG9fY29weSAgICAgICAgICA9ICAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5mby0+Y2hhbm5lbF9tYXBbY2hdICAgICAgICAgICAgPSBjaGFubmVsX21hcFtjaF07CisgICAgICAgICAgICBpbmZvLT5pbnB1dF9tYXBbY2hhbm5lbF9tYXBbY2hdXSA9IGNoOworICAgICAgICAgICAgaW5mby0+ZG9fcmVtYXAgICAgICAgICAgICAgICAgICAgPSAgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBGaWxsLWluIHVubWFwcGVkIGlucHV0IGNoYW5uZWxzIHdpdGggdW5tYXBwZWQgb3V0cHV0IGNoYW5uZWxzLgorICAgICAgIFRoaXMgaXMgdXNlZCB3aGVuIHJlbWFwcGluZyBkdXJpbmcgY29udmVyc2lvbiBmcm9tIGludGVybGVhdmVkIHRvCisgICAgICAgcGxhbmFyIGZvcm1hdC4gKi8KKyAgICBmb3IgKGNoID0gMCwgaSA9IDA7IGNoIDwgaW5fY2hhbm5lbHMgJiYgaSA8IGluX2NoYW5uZWxzOyBjaCsrLCBpKyspIHsKKyAgICAgICAgd2hpbGUgKGNoIDwgaW5fY2hhbm5lbHMgJiYgaW5mby0+aW5wdXRfbWFwW2NoXSA+PSAwKQorICAgICAgICAgICAgY2grKzsKKyAgICAgICAgd2hpbGUgKGkgPCBpbl9jaGFubmVscyAmJiBpbmZvLT5jaGFubmVsX21hcFtpXSA+PSAwKQorICAgICAgICAgICAgaSsrOworICAgICAgICBpZiAoY2ggPj0gaW5fY2hhbm5lbHMgfHwgaSA+PSBpbl9jaGFubmVscykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpbmZvLT5pbnB1dF9tYXBbY2hdID0gaTsKKyAgICB9CisKKyAgICBhdnItPnVzZV9jaGFubmVsX21hcCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdnJlc2FtcGxlX2F2YWlsYWJsZShBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIpCit7CisgICAgcmV0dXJuIGF2X2F1ZGlvX2ZpZm9fc2l6ZShhdnItPm91dF9maWZvKTsKK30KKworaW50IGF2cmVzYW1wbGVfZ2V0X291dF9zYW1wbGVzKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwgaW50IGluX25iX3NhbXBsZXMpCit7CisgICAgaW50NjRfdCBzYW1wbGVzID0gYXZyZXNhbXBsZV9nZXRfZGVsYXkoYXZyKSArIChpbnQ2NF90KWluX25iX3NhbXBsZXM7CisKKyAgICBpZiAoYXZyLT5yZXNhbXBsZV9uZWVkZWQpIHsKKyAgICAgICAgc2FtcGxlcyA9IGF2X3Jlc2NhbGVfcm5kKHNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnItPm91dF9zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ci0+aW5fc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ST1VORF9VUCk7CisgICAgfQorCisgICAgc2FtcGxlcyArPSBhdnJlc2FtcGxlX2F2YWlsYWJsZShhdnIpOworCisgICAgaWYgKHNhbXBsZXMgPiBJTlRfTUFYKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgcmV0dXJuIHNhbXBsZXM7Cit9CisKK2ludCBhdnJlc2FtcGxlX3JlYWQoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLCB1aW50OF90ICoqb3V0cHV0LCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpZiAoIW91dHB1dCkKKyAgICAgICAgcmV0dXJuIGF2X2F1ZGlvX2ZpZm9fZHJhaW4oYXZyLT5vdXRfZmlmbywgbmJfc2FtcGxlcyk7CisgICAgcmV0dXJuIGF2X2F1ZGlvX2ZpZm9fcmVhZChhdnItPm91dF9maWZvLCAodm9pZCoqKW91dHB1dCwgbmJfc2FtcGxlcyk7Cit9CisKK3Vuc2lnbmVkIGF2cmVzYW1wbGVfdmVyc2lvbih2b2lkKQoreworICAgIHJldHVybiBMSUJBVlJFU0FNUExFX1ZFUlNJT05fSU5UOworfQorCitjb25zdCBjaGFyICphdnJlc2FtcGxlX2xpY2Vuc2Uodm9pZCkKK3sKKyNkZWZpbmUgTElDRU5TRV9QUkVGSVggImxpYmF2cmVzYW1wbGUgbGljZW5zZTogIgorICAgIHJldHVybiBMSUNFTlNFX1BSRUZJWCBGRk1QRUdfTElDRU5TRSArIHNpemVvZihMSUNFTlNFX1BSRUZJWCkgLSAxOworfQorCitjb25zdCBjaGFyICphdnJlc2FtcGxlX2NvbmZpZ3VyYXRpb24odm9pZCkKK3sKKyAgICByZXR1cm4gRkZNUEVHX0NPTkZJR1VSQVRJT047Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS92ZXJzaW9uLmggYi9mZm1wZWcvbGliYXZyZXNhbXBsZS92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmZjJhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3ZlcnNpb24uaApAQCAtMCwwICsxLDU0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZSRVNBTVBMRV9WRVJTSU9OX0gKKyNkZWZpbmUgQVZSRVNBTVBMRV9WRVJTSU9OX0gKKworLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbGF2cgorICogTGliYXZyZXNhbXBsZSB2ZXJzaW9uIG1hY3Jvcy4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3ZlcnNpb24uaCIKKworI2RlZmluZSBMSUJBVlJFU0FNUExFX1ZFUlNJT05fTUFKT1IgIDIKKyNkZWZpbmUgTElCQVZSRVNBTVBMRV9WRVJTSU9OX01JTk9SICAxCisjZGVmaW5lIExJQkFWUkVTQU1QTEVfVkVSU0lPTl9NSUNSTyAgMAorCisjZGVmaW5lIExJQkFWUkVTQU1QTEVfVkVSU0lPTl9JTlQgIEFWX1ZFUlNJT05fSU5UKExJQkFWUkVTQU1QTEVfVkVSU0lPTl9NQUpPUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJBVlJFU0FNUExFX1ZFUlNJT05fTUlOT1IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCQVZSRVNBTVBMRV9WRVJTSU9OX01JQ1JPKQorI2RlZmluZSBMSUJBVlJFU0FNUExFX1ZFUlNJT04gICAgICAgICAgQVZfVkVSU0lPTihMSUJBVlJFU0FNUExFX1ZFUlNJT05fTUFKT1IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCQVZSRVNBTVBMRV9WRVJTSU9OX01JTk9SLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWUkVTQU1QTEVfVkVSU0lPTl9NSUNSTykKKyNkZWZpbmUgTElCQVZSRVNBTVBMRV9CVUlMRCAgICAgICAgTElCQVZSRVNBTVBMRV9WRVJTSU9OX0lOVAorCisjZGVmaW5lIExJQkFWUkVTQU1QTEVfSURFTlQgICAgICAgICJMYXZyIiBBVl9TVFJJTkdJRlkoTElCQVZSRVNBTVBMRV9WRVJTSU9OKQorCisvKioKKyAqIEZGX0FQSV8qIGRlZmluZXMgbWF5IGJlIHBsYWNlZCBiZWxvdyB0byBpbmRpY2F0ZSBwdWJsaWMgQVBJIHRoYXQgd2lsbCBiZQorICogZHJvcHBlZCBhdCBhIGZ1dHVyZSB2ZXJzaW9uIGJ1bXAuIFRoZSBkZWZpbmVzIHRoZW1zZWx2ZXMgYXJlIG5vdCBwYXJ0IG9mCisgKiB0aGUgcHVibGljIEFQSSBhbmQgbWF5IGNoYW5nZSwgYnJlYWsgb3IgZGlzYXBwZWFyIGF0IGFueSB0aW1lLgorICovCisKKyNpZm5kZWYgRkZfQVBJX1JFU0FNUExFX0NMT1NFX09QRU4KKyNkZWZpbmUgRkZfQVBJX1JFU0FNUExFX0NMT1NFX09QRU4gKExJQkFWUkVTQU1QTEVfVkVSU0lPTl9NQUpPUiA8IDMpCisjZW5kaWYKKworI2VuZGlmIC8qIEFWUkVTQU1QTEVfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS94ODYvTWFrZWZpbGUgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS94ODYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhMmQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3g4Ni9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKK09CSlMgICAgICArPSB4ODYvYXVkaW9fY29udmVydF9pbml0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB4ODYvYXVkaW9fbWl4X2luaXQubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB4ODYvZGl0aGVyX2luaXQubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworT0JKUy0kKENPTkZJR19YTU1fQ0xPQkJFUl9URVNUKSArPSB4ODYvdzY0eG1tdGVzdC5vCisKK1lBU00tT0JKUyArPSB4ODYvYXVkaW9fY29udmVydC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB4ODYvYXVkaW9fbWl4Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB4ODYvZGl0aGVyLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3g4Ni9hdWRpb19jb252ZXJ0LmFzbSBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3g4Ni9hdWRpb19jb252ZXJ0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTIxZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUveDg2L2F1ZGlvX2NvbnZlcnQuYXNtCkBAIC0wLDAgKzEsMTI2MSBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2IG9wdGltaXplZCBGb3JtYXQgQ29udmVyc2lvbiBVdGlscworOyogQ29weXJpZ2h0IChjKSAyMDA4IExvcmVuIE1lcnJpdHQKKzsqIENvcHlyaWdodCAoYykgMjAxMiBKdXN0aW4gUnVnZ2xlcyA8anVzdGluLnJ1Z2dsZXNAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCislaW5jbHVkZSAidXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBIDMyCisKK3BmX3MzMl9pbnZfc2NhbGU6IHRpbWVzIDggZGQgMHgzMDAwMDAwMAorcGZfczMyX3NjYWxlOiAgICAgdGltZXMgOCBkZCAweDRmMDAwMDAwCitwZl9zMzJfY2xpcDogICAgICB0aW1lcyA4IGRkIDB4NGVmZmZmZmYKK3BmX3MxNl9pbnZfc2NhbGU6IHRpbWVzIDQgZGQgMHgzODAwMDAwMAorcGZfczE2X3NjYWxlOiAgICAgdGltZXMgNCBkZCAweDQ3MDAwMDAwCitwYl9zaHVmX3VucGFja19ldmVuOiAgICAgIGRiIC0xLCAtMSwgIDAsICAxLCAtMSwgLTEsICAyLCAgMywgLTEsIC0xLCAgOCwgIDksIC0xLCAtMSwgMTAsIDExCitwYl9zaHVmX3VucGFja19vZGQ6ICAgICAgIGRiIC0xLCAtMSwgIDQsICA1LCAtMSwgLTEsICA2LCAgNywgLTEsIC0xLCAxMiwgMTMsIC0xLCAtMSwgMTQsIDE1CitwYl9pbnRlcmxlYXZlX3dvcmRzOiBTSFVGRkxFX01BU0tfVyAgMCwgIDQsICAxLCAgNSwgIDIsICA2LCAgMywgIDcKK3BiX2RlaW50ZXJsZWF2ZV93b3JkczogU0hVRkZMRV9NQVNLX1cgIDAsICAyLCAgNCwgIDYsICAxLCAgMywgIDUsICA3Citwd196ZXJvX2V2ZW46ICAgICB0aW1lcyA0IGR3IDB4MDAwMCwgMHhmZmZmCisKK1NFQ1RJT05fVEVYVAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfY29udl9zMTZfdG9fczMyKGludDMyX3QgKmRzdCwgY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgbGVuKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBjb252X3MxNl90b19zMzIsIDMsMywzLCBkc3QsIHNyYywgbGVuCisgICAgbGVhICAgICAgbGVucSwgWzIqbGVuZF0KKyAgICBsZWEgICAgICBkc3RxLCBbZHN0cSsyKmxlbnFdCisgICAgYWRkICAgICAgc3JjcSwgbGVucQorICAgIG5lZyAgICAgIGxlbnEKKy5sb29wOgorICAgIG1vdmEgICAgICAgbTIsIFtzcmNxK2xlbnFdCisgICAgcHhvciAgICAgICBtMCwgbTAKKyAgICBweG9yICAgICAgIG0xLCBtMQorICAgIHB1bnBja2x3ZCAgbTAsIG0yCisgICAgcHVucGNraHdkICBtMSwgbTIKKyAgICBtb3ZhICBbZHN0cSsyKmxlbnEgICAgICAgXSwgbTAKKyAgICBtb3ZhICBbZHN0cSsyKmxlbnErbW1zaXplXSwgbTEKKyAgICBhZGQgICAgICBsZW5xLCBtbXNpemUKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2NvbnZfczE2X3RvX2ZsdChmbG9hdCAqZHN0LCBjb25zdCBpbnQxNl90ICpzcmMsIGludCBsZW4pOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQ09OVl9TMTZfVE9fRkxUIDAKK2NnbG9iYWwgY29udl9zMTZfdG9fZmx0LCAzLDMsMywgZHN0LCBzcmMsIGxlbgorICAgIGxlYSAgICAgIGxlbnEsIFsyKmxlbmRdCisgICAgYWRkICAgICAgc3JjcSwgbGVucQorICAgIGxlYSAgICAgIGRzdHEsIFtkc3RxICsgMipsZW5xXQorICAgIG5lZyAgICAgIGxlbnEKKyAgICBtb3ZhICAgICAgIG0yLCBbcGZfczE2X2ludl9zY2FsZV0KKyAgICBBTElHTiAxNgorLmxvb3A6CisgICAgbW92YSAgICAgICBtMCwgW3NyY3ErbGVucV0KKyAgICBTMTZfVE9fUzMyX1NYIDAsIDEKKyAgICBjdnRkcTJwcyAgIG0wLCBtMAorICAgIGN2dGRxMnBzICAgbTEsIG0xCisgICAgbXVscHMgICAgICBtMCwgbTIKKyAgICBtdWxwcyAgICAgIG0xLCBtMgorICAgIG1vdmEgIFtkc3RxKzIqbGVucSAgICAgICBdLCBtMAorICAgIG1vdmEgIFtkc3RxKzIqbGVucSttbXNpemVdLCBtMQorICAgIGFkZCAgICAgIGxlbnEsIG1tc2l6ZQorICAgIGpsIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK0NPTlZfUzE2X1RPX0ZMVAorSU5JVF9YTU0gc3NlNAorQ09OVl9TMTZfVE9fRkxUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jb252X3MzMl90b19zMTYoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsIGludCBsZW4pOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQ09OVl9TMzJfVE9fUzE2IDAKK2NnbG9iYWwgY29udl9zMzJfdG9fczE2LCAzLDMsNCwgZHN0LCBzcmMsIGxlbgorICAgIGxlYSAgICAgbGVucSwgWzIqbGVuZF0KKyAgICBsZWEgICAgIHNyY3EsIFtzcmNxKzIqbGVucV0KKyAgICBhZGQgICAgIGRzdHEsIGxlbnEKKyAgICBuZWcgICAgIGxlbnEKKy5sb29wOgorICAgIG1vdmEgICAgICBtMCwgW3NyY3ErMipsZW5xICAgICAgICAgXQorICAgIG1vdmEgICAgICBtMSwgW3NyY3ErMipsZW5xKyAgbW1zaXplXQorICAgIG1vdmEgICAgICBtMiwgW3NyY3ErMipsZW5xKzIqbW1zaXplXQorICAgIG1vdmEgICAgICBtMywgW3NyY3ErMipsZW5xKzMqbW1zaXplXQorICAgIHBzcmFkICAgICBtMCwgMTYKKyAgICBwc3JhZCAgICAgbTEsIDE2CisgICAgcHNyYWQgICAgIG0yLCAxNgorICAgIHBzcmFkICAgICBtMywgMTYKKyAgICBwYWNrc3NkdyAgbTAsIG0xCisgICAgcGFja3NzZHcgIG0yLCBtMworICAgIG1vdmEgIFtkc3RxK2xlbnEgICAgICAgXSwgbTAKKyAgICBtb3ZhICBbZHN0cStsZW5xK21tc2l6ZV0sIG0yCisgICAgYWRkICAgICBsZW5xLCBtbXNpemUqMgorICAgIGpsIC5sb29wCislaWYgbW1zaXplID09IDgKKyAgICBlbW1zCisgICAgUkVUCislZWxzZQorICAgIFJFUF9SRVQKKyVlbmRpZgorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teAorQ09OVl9TMzJfVE9fUzE2CitJTklUX1hNTSBzc2UyCitDT05WX1MzMl9UT19TMTYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2NvbnZfczMyX3RvX2ZsdChmbG9hdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsIGludCBsZW4pOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQ09OVl9TMzJfVE9fRkxUIDAKK2NnbG9iYWwgY29udl9zMzJfdG9fZmx0LCAzLDMsMywgZHN0LCBzcmMsIGxlbgorICAgIGxlYSAgICAgbGVucSwgWzQqbGVuZF0KKyAgICBhZGQgICAgIHNyY3EsIGxlbnEKKyAgICBhZGQgICAgIGRzdHEsIGxlbnEKKyAgICBuZWcgICAgIGxlbnEKKyAgICBtb3ZhICAgICAgbTAsIFtwZl9zMzJfaW52X3NjYWxlXQorICAgIEFMSUdOIDE2CisubG9vcDoKKyAgICBjdnRkcTJwcyAgbTEsIFtzcmNxK2xlbnEgICAgICAgXQorICAgIGN2dGRxMnBzICBtMiwgW3NyY3ErbGVucSttbXNpemVdCisgICAgbXVscHMgICAgIG0xLCBtMSwgbTAKKyAgICBtdWxwcyAgICAgbTIsIG0yLCBtMAorICAgIG1vdmEgIFtkc3RxK2xlbnEgICAgICAgXSwgbTEKKyAgICBtb3ZhICBbZHN0cStsZW5xK21tc2l6ZV0sIG0yCisgICAgYWRkICAgICBsZW5xLCBtbXNpemUqMgorICAgIGpsIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK0NPTlZfUzMyX1RPX0ZMVAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1lNTSBhdngKK0NPTlZfUzMyX1RPX0ZMVAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jb252X2ZsdF90b19zMTYoaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBpbnQgbGVuKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBjb252X2ZsdF90b19zMTYsIDMsMyw1LCBkc3QsIHNyYywgbGVuCisgICAgbGVhICAgICBsZW5xLCBbMipsZW5kXQorICAgIGxlYSAgICAgc3JjcSwgW3NyY3ErMipsZW5xXQorICAgIGFkZCAgICAgZHN0cSwgbGVucQorICAgIG5lZyAgICAgbGVucQorICAgIG1vdmEgICAgICBtNCwgW3BmX3MxNl9zY2FsZV0KKy5sb29wOgorICAgIG1vdmEgICAgICBtMCwgW3NyY3ErMipsZW5xICAgICAgICAgXQorICAgIG1vdmEgICAgICBtMSwgW3NyY3ErMipsZW5xKzEqbW1zaXplXQorICAgIG1vdmEgICAgICBtMiwgW3NyY3ErMipsZW5xKzIqbW1zaXplXQorICAgIG1vdmEgICAgICBtMywgW3NyY3ErMipsZW5xKzMqbW1zaXplXQorICAgIG11bHBzICAgICBtMCwgbTQKKyAgICBtdWxwcyAgICAgbTEsIG00CisgICAgbXVscHMgICAgIG0yLCBtNAorICAgIG11bHBzICAgICBtMywgbTQKKyAgICBjdnRwczJkcSAgbTAsIG0wCisgICAgY3Z0cHMyZHEgIG0xLCBtMQorICAgIGN2dHBzMmRxICBtMiwgbTIKKyAgICBjdnRwczJkcSAgbTMsIG0zCisgICAgcGFja3NzZHcgIG0wLCBtMQorICAgIHBhY2tzc2R3ICBtMiwgbTMKKyAgICBtb3ZhICBbZHN0cStsZW5xICAgICAgIF0sIG0wCisgICAgbW92YSAgW2RzdHErbGVucSttbXNpemVdLCBtMgorICAgIGFkZCAgICAgbGVucSwgbW1zaXplKjIKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2NvbnZfZmx0X3RvX3MzMihpbnQzMl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGludCBsZW4pOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQ09OVl9GTFRfVE9fUzMyIDAKK2NnbG9iYWwgY29udl9mbHRfdG9fczMyLCAzLDMsNiwgZHN0LCBzcmMsIGxlbgorICAgIGxlYSAgICAgbGVucSwgW2xlbmQqNF0KKyAgICBhZGQgICAgIHNyY3EsIGxlbnEKKyAgICBhZGQgICAgIGRzdHEsIGxlbnEKKyAgICBuZWcgICAgIGxlbnEKKyAgICBtb3ZhICAgICAgbTQsIFtwZl9zMzJfc2NhbGVdCisgICAgbW92YSAgICAgIG01LCBbcGZfczMyX2NsaXBdCisubG9vcDoKKyAgICBtdWxwcyAgICAgbTAsIG00LCBbc3JjcStsZW5xICAgICAgICAgXQorICAgIG11bHBzICAgICBtMSwgbTQsIFtzcmNxK2xlbnErMSptbXNpemVdCisgICAgbXVscHMgICAgIG0yLCBtNCwgW3NyY3ErbGVucSsyKm1tc2l6ZV0KKyAgICBtdWxwcyAgICAgbTMsIG00LCBbc3JjcStsZW5xKzMqbW1zaXplXQorICAgIG1pbnBzICAgICBtMCwgbTAsIG01CisgICAgbWlucHMgICAgIG0xLCBtMSwgbTUKKyAgICBtaW5wcyAgICAgbTIsIG0yLCBtNQorICAgIG1pbnBzICAgICBtMywgbTMsIG01CisgICAgY3Z0cHMyZHEgIG0wLCBtMAorICAgIGN2dHBzMmRxICBtMSwgbTEKKyAgICBjdnRwczJkcSAgbTIsIG0yCisgICAgY3Z0cHMyZHEgIG0zLCBtMworICAgIG1vdmEgIFtkc3RxK2xlbnEgICAgICAgICBdLCBtMAorICAgIG1vdmEgIFtkc3RxK2xlbnErMSptbXNpemVdLCBtMQorICAgIG1vdmEgIFtkc3RxK2xlbnErMiptbXNpemVdLCBtMgorICAgIG1vdmEgIFtkc3RxK2xlbnErMyptbXNpemVdLCBtMworICAgIGFkZCAgICAgbGVucSwgbW1zaXplKjQKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitDT05WX0ZMVF9UT19TMzIKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4CitDT05WX0ZMVF9UT19TMzIKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfY29udl9zMTZwX3RvX3MxNl8yY2goaW50MTZfdCAqZHN0LCBpbnQxNl90ICpjb25zdCAqc3JjLCBpbnQgbGVuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBDT05WX1MxNlBfVE9fUzE2XzJDSCAwCitjZ2xvYmFsIGNvbnZfczE2cF90b19zMTZfMmNoLCAzLDQsNSwgZHN0LCBzcmMwLCBsZW4sIHNyYzEKKyAgICBtb3YgICAgICAgc3JjMXEsIFtzcmMwcStncHJzaXplXQorICAgIG1vdiAgICAgICBzcmMwcSwgW3NyYzBxICAgICAgICBdCisgICAgbGVhICAgICAgICBsZW5xLCBbMipsZW5kXQorICAgIGFkZCAgICAgICBzcmMwcSwgbGVucQorICAgIGFkZCAgICAgICBzcmMxcSwgbGVucQorICAgIGxlYSAgICAgICAgZHN0cSwgW2RzdHErMipsZW5xXQorICAgIG5lZyAgICAgICAgbGVucQorLmxvb3A6CisgICAgbW92YSAgICAgICAgIG0wLCBbc3JjMHErbGVucSAgICAgICBdCisgICAgbW92YSAgICAgICAgIG0xLCBbc3JjMXErbGVucSAgICAgICBdCisgICAgbW92YSAgICAgICAgIG0yLCBbc3JjMHErbGVucSttbXNpemVdCisgICAgbW92YSAgICAgICAgIG0zLCBbc3JjMXErbGVucSttbXNpemVdCisgICAgU0JVVFRFUkZMWTIgIHdkLCAwLCAxLCA0CisgICAgU0JVVFRFUkZMWTIgIHdkLCAyLCAzLCA0CisgICAgbW92YSAgW2RzdHErMipsZW5xKzAqbW1zaXplXSwgbTAKKyAgICBtb3ZhICBbZHN0cSsyKmxlbnErMSptbXNpemVdLCBtMQorICAgIG1vdmEgIFtkc3RxKzIqbGVucSsyKm1tc2l6ZV0sIG0yCisgICAgbW92YSAgW2RzdHErMipsZW5xKzMqbW1zaXplXSwgbTMKKyAgICBhZGQgICAgICAgIGxlbnEsIDIqbW1zaXplCisgICAgamwgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorQ09OVl9TMTZQX1RPX1MxNl8yQ0gKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitDT05WX1MxNlBfVE9fUzE2XzJDSAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jb252X3MxNnBfdG9fczE2XzZjaChpbnQxNl90ICpkc3QsIGludDE2X3QgKmNvbnN0ICpzcmMsIGludCBsZW4sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBOT1RFOiBJbiB0aGUgNi1jaGFubmVsIGZ1bmN0aW9ucywgbGVuIGNvdWxkIGJlIHVzZWQgYXMgYW4gaW5kZXggb24geDg2LTY0Cis7ICAgICAgIGluc3RlYWQgb2YganVzdCBhIGNvdW50ZXIsIHdoaWNoIHdvdWxkIGF2b2lkIGluY3JlbWVudGluZyB0aGUKKzsgICAgICAgcG9pbnRlcnMsIGJ1dCB0aGUgZXh0cmEgY29tcGxleGl0eSBhbmQgYW1vdW50IG9mIGNvZGUgaXMgbm90IHdvcnRoCis7ICAgICAgIHRoZSBzbWFsbCBnYWluLiBPbiB4ODYtMzIgdGhlcmUgYXJlIG5vdCBlbm91Z2ggcmVnaXN0ZXJzIHRvIHVzZSBsZW4KKzsgICAgICAgYXMgYW4gaW5kZXggd2l0aG91dCBrZWVwaW5nIHR3byBvZiB0aGUgcG9pbnRlcnMgb24gdGhlIHN0YWNrIGFuZAorOyAgICAgICBsb2FkaW5nIHRoZW0gaW4gZWFjaCBpdGVyYXRpb24uCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBDT05WX1MxNlBfVE9fUzE2XzZDSCAwCislaWYgQVJDSF9YODZfNjQKK2NnbG9iYWwgY29udl9zMTZwX3RvX3MxNl82Y2gsIDMsOCw3LCBkc3QsIHNyYzAsIGxlbiwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNQorJWVsc2UKK2NnbG9iYWwgY29udl9zMTZwX3RvX3MxNl82Y2gsIDIsNyw3LCBkc3QsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUKKyVkZWZpbmUgbGVuZCBkd29yZCByMm0KKyVlbmRpZgorICAgIG1vdiAgICAgIHNyYzFxLCBbc3JjMHErMSpncHJzaXplXQorICAgIG1vdiAgICAgIHNyYzJxLCBbc3JjMHErMipncHJzaXplXQorICAgIG1vdiAgICAgIHNyYzNxLCBbc3JjMHErMypncHJzaXplXQorICAgIG1vdiAgICAgIHNyYzRxLCBbc3JjMHErNCpncHJzaXplXQorICAgIG1vdiAgICAgIHNyYzVxLCBbc3JjMHErNSpncHJzaXplXQorICAgIG1vdiAgICAgIHNyYzBxLCBbc3JjMHFdCisgICAgc3ViICAgICAgc3JjMXEsIHNyYzBxCisgICAgc3ViICAgICAgc3JjMnEsIHNyYzBxCisgICAgc3ViICAgICAgc3JjM3EsIHNyYzBxCisgICAgc3ViICAgICAgc3JjNHEsIHNyYzBxCisgICAgc3ViICAgICAgc3JjNXEsIHNyYzBxCisubG9vcDoKKyVpZiBjcHVmbGFnKHNzZTJzbG93KQorICAgIG1vdnEgICAgICAgIG0wLCBbc3JjMHEgICAgICBdICAgOyBtMCA9ICAwLCAgNiwgMTIsIDE4LCAgeCwgIHgsICB4LCAgeAorICAgIG1vdnEgICAgICAgIG0xLCBbc3JjMHErc3JjMXFdICAgOyBtMSA9ICAxLCAgNywgMTMsIDE5LCAgeCwgIHgsICB4LCAgeAorICAgIG1vdnEgICAgICAgIG0yLCBbc3JjMHErc3JjMnFdICAgOyBtMiA9ICAyLCAgOCwgMTQsIDIwLCAgeCwgIHgsICB4LCAgeAorICAgIG1vdnEgICAgICAgIG0zLCBbc3JjMHErc3JjM3FdICAgOyBtMyA9ICAzLCAgOSwgMTUsIDIxLCAgeCwgIHgsICB4LCAgeAorICAgIG1vdnEgICAgICAgIG00LCBbc3JjMHErc3JjNHFdICAgOyBtNCA9ICA0LCAxMCwgMTYsIDIyLCAgeCwgIHgsICB4LCAgeAorICAgIG1vdnEgICAgICAgIG01LCBbc3JjMHErc3JjNXFdICAgOyBtNSA9ICA1LCAxMSwgMTcsIDIzLCAgeCwgIHgsICB4LCAgeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB1bnBhY2sgd29yZHM6CisgICAgcHVucGNrbHdkICAgbTAsIG0xICAgICAgICAgICAgICA7IG0wID0gIDAsICAxLCAgNiwgIDcsIDEyLCAxMywgMTgsIDE5CisgICAgcHVucGNrbHdkICAgbTIsIG0zICAgICAgICAgICAgICA7IG0yID0gIDQsICA1LCAxMCwgMTEsIDE2LCAxNywgMjIsIDIzCisgICAgcHVucGNrbHdkICAgbTQsIG01ICAgICAgICAgICAgICA7IG00ID0gIDIsICAzLCAgOCwgIDksIDE0LCAxNSwgMjAsIDIxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGJsZW5kIGR3b3JkcworICAgIHNodWZwcyAgICAgIG0xLCBtMCwgbTIsIHEyMDIwICAgOyBtMSA9ICAwLCAgMSwgMTIsIDEzLCAgMiwgIDMsIDE0LCAxNQorICAgIHNodWZwcyAgICAgIG0wLCBtNCwgcTIwMzEgICAgICAgOyBtMCA9ICA2LCAgNywgMTgsIDE5LCAgNCwgIDUsIDE2LCAxNworICAgIHNodWZwcyAgICAgIG0yLCBtNCwgcTMxMzEgICAgICAgOyBtMiA9ICA4LCAgOSwgMjAsIDIxLCAxMCwgMTEsIDIyLCAyMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaHVmZmxlIGR3b3JkcworICAgIHBzaHVmZCAgICAgIG0wLCBtMCwgcTEzMDIgICAgICAgOyBtMCA9ICA0LCAgNSwgIDYsICA3LCAxNiwgMTcsIDE4LCAxOQorICAgIHBzaHVmZCAgICAgIG0xLCBtMSwgcTMxMjAgICAgICAgOyBtMSA9ICAwLCAgMSwgIDIsICAzLCAxMiwgMTMsIDE0LCAxNQorICAgIHBzaHVmZCAgICAgIG0yLCBtMiwgcTMxMjAgICAgICAgOyBtMiA9ICA4LCAgOSwgMTAsIDExLCAyMCwgMjEsIDIyLCAyMworICAgIG1vdnEgICBbZHN0cSswKm1tc2l6ZS8yXSwgbTEKKyAgICBtb3ZxICAgW2RzdHErMSptbXNpemUvMl0sIG0wCisgICAgbW92cSAgIFtkc3RxKzIqbW1zaXplLzJdLCBtMgorICAgIG1vdmhwcyBbZHN0cSszKm1tc2l6ZS8yXSwgbTEKKyAgICBtb3ZocHMgW2RzdHErNCptbXNpemUvMl0sIG0wCisgICAgbW92aHBzIFtkc3RxKzUqbW1zaXplLzJdLCBtMgorICAgIGFkZCAgICAgIHNyYzBxLCBtbXNpemUvMgorICAgIGFkZCAgICAgICBkc3RxLCBtbXNpemUqMworICAgIHN1YiAgICAgICBsZW5kLCBtbXNpemUvNAorJWVsc2UKKyAgICBtb3ZhICAgICAgICBtMCwgW3NyYzBxICAgICAgXSAgIDsgbTAgPSAgMCwgIDYsIDEyLCAxOCwgMjQsIDMwLCAzNiwgNDIKKyAgICBtb3ZhICAgICAgICBtMSwgW3NyYzBxK3NyYzFxXSAgIDsgbTEgPSAgMSwgIDcsIDEzLCAxOSwgMjUsIDMxLCAzNywgNDMKKyAgICBtb3ZhICAgICAgICBtMiwgW3NyYzBxK3NyYzJxXSAgIDsgbTIgPSAgMiwgIDgsIDE0LCAyMCwgMjYsIDMyLCAzOCwgNDQKKyAgICBtb3ZhICAgICAgICBtMywgW3NyYzBxK3NyYzNxXSAgIDsgbTMgPSAgMywgIDksIDE1LCAyMSwgMjcsIDMzLCAzOSwgNDUKKyAgICBtb3ZhICAgICAgICBtNCwgW3NyYzBxK3NyYzRxXSAgIDsgbTQgPSAgNCwgMTAsIDE2LCAyMiwgMjgsIDM0LCA0MCwgNDYKKyAgICBtb3ZhICAgICAgICBtNSwgW3NyYzBxK3NyYzVxXSAgIDsgbTUgPSAgNSwgMTEsIDE3LCAyMywgMjksIDM1LCA0MSwgNDcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHdvcmRzOgorICAgIFNCVVRURVJGTFkyIHdkLCAwLCAxLCA2ICAgICAgICAgOyBtMCA9ICAwLCAgMSwgIDYsICA3LCAxMiwgMTMsIDE4LCAxOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtMSA9IDI0LCAyNSwgMzAsIDMxLCAzNiwgMzcsIDQyLCA0MworICAgIFNCVVRURVJGTFkyIHdkLCAyLCAzLCA2ICAgICAgICAgOyBtMiA9ICAyLCAgMywgIDgsICA5LCAxNCwgMTUsIDIwLCAyMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtMyA9IDI2LCAyNywgMzIsIDMzLCAzOCwgMzksIDQ0LCA0NQorICAgIFNCVVRURVJGTFkyIHdkLCA0LCA1LCA2ICAgICAgICAgOyBtNCA9ICA0LCAgNSwgMTAsIDExLCAxNiwgMTcsIDIyLCAyMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtNSA9IDI4LCAyOSwgMzQsIDM1LCA0MCwgNDEsIDQ2LCA0NworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBibGVuZCBkd29yZHMKKyAgICBzaHVmcHMgICAgICBtNiwgbTAsIG0yLCBxMjAyMCAgIDsgbTYgPSAgMCwgIDEsIDEyLCAxMywgIDIsICAzLCAxNCwgMTUKKyAgICBzaHVmcHMgICAgICBtMCwgbTQsIHEyMDMxICAgICAgIDsgbTAgPSAgNiwgIDcsIDE4LCAxOSwgIDQsICA1LCAxNiwgMTcKKyAgICBzaHVmcHMgICAgICBtMiwgbTQsIHEzMTMxICAgICAgIDsgbTIgPSAgOCwgIDksIDIwLCAyMSwgMTAsIDExLCAyMiwgMjMKKyAgICBTV0FQIDQsNiAgICAgICAgICAgICAgICAgICAgICAgIDsgbTQgPSAgMCwgIDEsIDEyLCAxMywgIDIsICAzLCAxNCwgMTUKKyAgICBzaHVmcHMgICAgICBtNiwgbTEsIG0zLCBxMjAyMCAgIDsgbTYgPSAyNCwgMjUsIDM2LCAzNywgMjYsIDI3LCAzOCwgMzkKKyAgICBzaHVmcHMgICAgICBtMSwgbTUsIHEyMDMxICAgICAgIDsgbTEgPSAzMCwgMzEsIDQyLCA0MywgMjgsIDI5LCA0MCwgNDEKKyAgICBzaHVmcHMgICAgICBtMywgbTUsIHEzMTMxICAgICAgIDsgbTMgPSAzMiwgMzMsIDQ0LCA0NSwgMzQsIDM1LCA0NiwgNDcKKyAgICBTV0FQIDUsNiAgICAgICAgICAgICAgICAgICAgICAgIDsgbTUgPSAyNCwgMjUsIDM2LCAzNywgMjYsIDI3LCAzOCwgMzkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2h1ZmZsZSBkd29yZHMKKyAgICBwc2h1ZmQgICAgICBtMCwgbTAsIHExMzAyICAgICAgIDsgbTAgPSAgNCwgIDUsICA2LCAgNywgMTYsIDE3LCAxOCwgMTkKKyAgICBwc2h1ZmQgICAgICBtMiwgbTIsIHEzMTIwICAgICAgIDsgbTIgPSAgOCwgIDksIDEwLCAxMSwgMjAsIDIxLCAyMiwgMjMKKyAgICBwc2h1ZmQgICAgICBtNCwgbTQsIHEzMTIwICAgICAgIDsgbTQgPSAgMCwgIDEsICAyLCAgMywgMTIsIDEzLCAxNCwgMTUKKyAgICBwc2h1ZmQgICAgICBtMSwgbTEsIHExMzAyICAgICAgIDsgbTEgPSAyOCwgMjksIDMwLCAzMSwgNDAsIDQxLCA0MiwgNDMKKyAgICBwc2h1ZmQgICAgICBtMywgbTMsIHEzMTIwICAgICAgIDsgbTMgPSAzMiwgMzMsIDM0LCAzNSwgNDQsIDQ1LCA0NiwgNDcKKyAgICBwc2h1ZmQgICAgICBtNSwgbTUsIHEzMTIwICAgICAgIDsgbTUgPSAyNCwgMjUsIDI2LCAyNywgMzYsIDM3LCAzOCwgMzkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2h1ZmZsZSBxd29yZHMKKyAgICBwdW5wY2tscWRxICBtNiwgbTQsIG0wICAgICAgICAgIDsgbTYgPSAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcKKyAgICBwdW5wY2tocWRxICBtMCwgbTIgICAgICAgICAgICAgIDsgbTAgPSAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICBzaHVmcHMgICAgICBtMiwgbTQsIHEzMjEwICAgICAgIDsgbTIgPSAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKKyAgICBTV0FQIDQsNiAgICAgICAgICAgICAgICAgICAgICAgIDsgbTQgPSAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcKKyAgICBwdW5wY2tscWRxICBtNiwgbTUsIG0xICAgICAgICAgIDsgbTYgPSAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEKKyAgICBwdW5wY2tocWRxICBtMSwgbTMgICAgICAgICAgICAgIDsgbTEgPSA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcKKyAgICBzaHVmcHMgICAgICBtMywgbTUsIHEzMjEwICAgICAgIDsgbTMgPSAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzkKKyAgICBTV0FQIDUsNiAgICAgICAgICAgICAgICAgICAgICAgIDsgbTUgPSAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEKKyAgICBtb3ZhICAgW2RzdHErMCptbXNpemVdLCBtNAorICAgIG1vdmEgICBbZHN0cSsxKm1tc2l6ZV0sIG0yCisgICAgbW92YSAgIFtkc3RxKzIqbW1zaXplXSwgbTAKKyAgICBtb3ZhICAgW2RzdHErMyptbXNpemVdLCBtNQorICAgIG1vdmEgICBbZHN0cSs0Km1tc2l6ZV0sIG0zCisgICAgbW92YSAgIFtkc3RxKzUqbW1zaXplXSwgbTEKKyAgICBhZGQgICAgICBzcmMwcSwgbW1zaXplCisgICAgYWRkICAgICAgIGRzdHEsIG1tc2l6ZSo2CisgICAgc3ViICAgICAgIGxlbmQsIG1tc2l6ZS8yCislZW5kaWYKKyAgICBqZyAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitDT05WX1MxNlBfVE9fUzE2XzZDSAorSU5JVF9YTU0gc3NlMnNsb3cKK0NPTlZfUzE2UF9UT19TMTZfNkNICislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorQ09OVl9TMTZQX1RPX1MxNl82Q0gKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfY29udl9zMTZwX3RvX2ZsdF8yY2goZmxvYXQgKmRzdCwgaW50MTZfdCAqY29uc3QgKnNyYywgaW50IGxlbiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQ09OVl9TMTZQX1RPX0ZMVF8yQ0ggMAorY2dsb2JhbCBjb252X3MxNnBfdG9fZmx0XzJjaCwgMyw0LDYsIGRzdCwgc3JjMCwgbGVuLCBzcmMxCisgICAgbGVhICAgICAgIGxlbnEsIFsyKmxlbmRdCisgICAgbW92ICAgICAgc3JjMXEsIFtzcmMwcStncHJzaXplXQorICAgIG1vdiAgICAgIHNyYzBxLCBbc3JjMHEgICAgICAgIF0KKyAgICBsZWEgICAgICAgZHN0cSwgW2RzdHErNCpsZW5xXQorICAgIGFkZCAgICAgIHNyYzBxLCBsZW5xCisgICAgYWRkICAgICAgc3JjMXEsIGxlbnEKKyAgICBuZWcgICAgICAgbGVucQorICAgIG1vdmEgICAgICAgIG01LCBbcGZfczMyX2ludl9zY2FsZV0KKy5sb29wOgorICAgIG1vdmEgICAgICAgIG0yLCBbc3JjMHErbGVucV0gICAgOyBtMiA9ICAwLCAgMiwgIDQsICA2LCAgOCwgMTAsIDEyLCAxNAorICAgIG1vdmEgICAgICAgIG00LCBbc3JjMXErbGVucV0gICAgOyBtNCA9ICAxLCAgMywgIDUsICA3LCAgOSwgMTEsIDEzLCAxNQorICAgIFNCVVRURVJGTFkyIHdkLCAyLCA0LCAzICAgICAgICAgOyBtMiA9ICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtNCA9ICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorICAgIHB4b3IgICAgICAgIG0zLCBtMworICAgIHB1bnBja2x3ZCAgIG0wLCBtMywgbTIgICAgICAgICAgOyBtMCA9ICAgICAgMCwgICAgICAxLCAgICAgIDIsICAgICAgMworICAgIHB1bnBja2h3ZCAgIG0xLCBtMywgbTIgICAgICAgICAgOyBtMSA9ICAgICAgNCwgICAgICA1LCAgICAgIDYsICAgICAgNworICAgIHB1bnBja2x3ZCAgIG0yLCBtMywgbTQgICAgICAgICAgOyBtMiA9ICAgICAgOCwgICAgICA5LCAgICAgMTAsICAgICAxMQorICAgIHB1bnBja2h3ZCAgIG0zLCBtNCAgICAgICAgICAgICAgOyBtMyA9ICAgICAxMiwgICAgIDEzLCAgICAgMTQsICAgICAxNQorICAgIGN2dGRxMnBzICAgIG0wLCBtMAorICAgIGN2dGRxMnBzICAgIG0xLCBtMQorICAgIGN2dGRxMnBzICAgIG0yLCBtMgorICAgIGN2dGRxMnBzICAgIG0zLCBtMworICAgIG11bHBzICAgICAgIG0wLCBtNQorICAgIG11bHBzICAgICAgIG0xLCBtNQorICAgIG11bHBzICAgICAgIG0yLCBtNQorICAgIG11bHBzICAgICAgIG0zLCBtNQorICAgIG1vdmEgIFtkc3RxKzQqbGVucSAgICAgICAgIF0sIG0wCisgICAgbW92YSAgW2RzdHErNCpsZW5xKyAgbW1zaXplXSwgbTEKKyAgICBtb3ZhICBbZHN0cSs0KmxlbnErMiptbXNpemVdLCBtMgorICAgIG1vdmEgIFtkc3RxKzQqbGVucSszKm1tc2l6ZV0sIG0zCisgICAgYWRkICAgICAgIGxlbnEsIG1tc2l6ZQorICAgIGpsIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK0NPTlZfUzE2UF9UT19GTFRfMkNICislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorQ09OVl9TMTZQX1RPX0ZMVF8yQ0gKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfY29udl9zMTZwX3RvX2ZsdF82Y2goZmxvYXQgKmRzdCwgaW50MTZfdCAqY29uc3QgKnNyYywgaW50IGxlbiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQ09OVl9TMTZQX1RPX0ZMVF82Q0ggMAorJWlmIEFSQ0hfWDg2XzY0CitjZ2xvYmFsIGNvbnZfczE2cF90b19mbHRfNmNoLCAzLDgsOCwgZHN0LCBzcmMsIGxlbiwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNQorJWVsc2UKK2NnbG9iYWwgY29udl9zMTZwX3RvX2ZsdF82Y2gsIDIsNyw4LCBkc3QsIHNyYywgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNQorJWRlZmluZSBsZW5kIGR3b3JkIHIybQorJWVuZGlmCisgICAgbW92ICAgICBzcmMxcSwgW3NyY3ErMSpncHJzaXplXQorICAgIG1vdiAgICAgc3JjMnEsIFtzcmNxKzIqZ3Byc2l6ZV0KKyAgICBtb3YgICAgIHNyYzNxLCBbc3JjcSszKmdwcnNpemVdCisgICAgbW92ICAgICBzcmM0cSwgW3NyY3ErNCpncHJzaXplXQorICAgIG1vdiAgICAgc3JjNXEsIFtzcmNxKzUqZ3Byc2l6ZV0KKyAgICBtb3YgICAgICBzcmNxLCBbc3JjcV0KKyAgICBzdWIgICAgIHNyYzFxLCBzcmNxCisgICAgc3ViICAgICBzcmMycSwgc3JjcQorICAgIHN1YiAgICAgc3JjM3EsIHNyY3EKKyAgICBzdWIgICAgIHNyYzRxLCBzcmNxCisgICAgc3ViICAgICBzcmM1cSwgc3JjcQorICAgIG1vdmEgICAgICAgbTcsIFtwZl9zMzJfaW52X3NjYWxlXQorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgJWRlZmluZSB1bnBhY2tfZXZlbiBtNgorICAgIG1vdmEgICAgICAgbTYsIFtwYl9zaHVmX3VucGFja19ldmVuXQorJWlmIEFSQ0hfWDg2XzY0CisgICAgJWRlZmluZSB1bnBhY2tfb2RkIG04CisgICAgbW92YSAgICAgICBtOCwgW3BiX3NodWZfdW5wYWNrX29kZF0KKyVlbHNlCisgICAgJWRlZmluZSB1bnBhY2tfb2RkIFtwYl9zaHVmX3VucGFja19vZGRdCislZW5kaWYKKyVlbmRpZgorLmxvb3A6CisgICAgbW92cSAgICAgICBtMCwgW3NyY3EgICAgICBdICA7IG0wID0gIDAsICA2LCAxMiwgMTgsICB4LCAgeCwgIHgsICB4CisgICAgbW92cSAgICAgICBtMSwgW3NyY3Erc3JjMXFdICA7IG0xID0gIDEsICA3LCAxMywgMTksICB4LCAgeCwgIHgsICB4CisgICAgbW92cSAgICAgICBtMiwgW3NyY3Erc3JjMnFdICA7IG0yID0gIDIsICA4LCAxNCwgMjAsICB4LCAgeCwgIHgsICB4CisgICAgbW92cSAgICAgICBtMywgW3NyY3Erc3JjM3FdICA7IG0zID0gIDMsICA5LCAxNSwgMjEsICB4LCAgeCwgIHgsICB4CisgICAgbW92cSAgICAgICBtNCwgW3NyY3Erc3JjNHFdICA7IG00ID0gIDQsIDEwLCAxNiwgMjIsICB4LCAgeCwgIHgsICB4CisgICAgbW92cSAgICAgICBtNSwgW3NyY3Erc3JjNXFdICA7IG01ID0gIDUsIDExLCAxNywgMjMsICB4LCAgeCwgIHgsICB4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHVucGFjayB3b3JkczoKKyAgICBwdW5wY2tsd2QgIG0wLCBtMSAgICAgICAgICAgIDsgbTAgPSAgMCwgIDEsICA2LCAgNywgMTIsIDEzLCAxOCwgMTkKKyAgICBwdW5wY2tsd2QgIG0yLCBtMyAgICAgICAgICAgIDsgbTIgPSAgMiwgIDMsICA4LCAgOSwgMTQsIDE1LCAyMCwgMjEKKyAgICBwdW5wY2tsd2QgIG00LCBtNSAgICAgICAgICAgIDsgbTQgPSAgNCwgIDUsIDEwLCAxMSwgMTYsIDE3LCAyMiwgMjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYmxlbmQgZHdvcmRzCisgICAgc2h1ZnBzICAgICBtMSwgbTQsIG0wLCBxMzEyMCA7IG0xID0gIDQsICA1LCAxNiwgMTcsICA2LCAgNywgMTgsIDE5CisgICAgc2h1ZnBzICAgICAgICAgbTAsIG0yLCBxMjAyMCA7IG0wID0gIDAsICAxLCAxMiwgMTMsICAyLCAgMywgMTQsIDE1CisgICAgc2h1ZnBzICAgICAgICAgbTIsIG00LCBxMzEzMSA7IG0yID0gIDgsICA5LCAyMCwgMjEsIDEwLCAxMSwgMjIsIDIzCislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICBwc2h1ZmIgICAgIG0zLCBtMCwgdW5wYWNrX29kZCAgIDsgbTMgPSAgMTIsICAgICAxMywgICAgIDE0LCAgICAgMTUKKyAgICBwc2h1ZmIgICAgICAgICBtMCwgdW5wYWNrX2V2ZW4gIDsgbTAgPSAgIDAsICAgICAgMSwgICAgICAyLCAgICAgIDMKKyAgICBwc2h1ZmIgICAgIG00LCBtMSwgdW5wYWNrX29kZCAgIDsgbTQgPSAgMTYsICAgICAxNywgICAgIDE4LCAgICAgMTkKKyAgICBwc2h1ZmIgICAgICAgICBtMSwgdW5wYWNrX2V2ZW4gIDsgbTEgPSAgIDQsICAgICAgNSwgICAgICA2LCAgICAgIDcKKyAgICBwc2h1ZmIgICAgIG01LCBtMiwgdW5wYWNrX29kZCAgIDsgbTUgPSAgMjAsICAgICAyMSwgICAgIDIyLCAgICAgMjMKKyAgICBwc2h1ZmIgICAgICAgICBtMiwgdW5wYWNrX2V2ZW4gIDsgbTIgPSAgIDgsICAgICAgOSwgICAgIDEwLCAgICAgMTEKKyVlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHNodWZmbGUgZHdvcmRzCisgICAgcHNodWZkICAgICBtMCwgbTAsIHEzMTIwICAgICA7IG0wID0gIDAsICAxLCAgMiwgIDMsIDEyLCAxMywgMTQsIDE1CisgICAgcHNodWZkICAgICBtMSwgbTEsIHEzMTIwICAgICA7IG0xID0gIDQsICA1LCAgNiwgIDcsIDE2LCAxNywgMTgsIDE5CisgICAgcHNodWZkICAgICBtMiwgbTIsIHEzMTIwICAgICA7IG0yID0gIDgsICA5LCAxMCwgMTEsIDIwLCAyMSwgMjIsIDIzCisgICAgcHhvciAgICAgICBtNiwgbTYgICAgICAgICAgICA7IGNvbnZlcnQgczE2IGluIG0wLW0yIHRvIHMzMiBpbiBtMC1tNQorICAgIHB1bnBja2x3ZCAgbTMsIG02LCBtMCAgICAgICAgOyBtMyA9ICAgICAgMCwgICAgICAxLCAgICAgIDIsICAgICAgMworICAgIHB1bnBja2h3ZCAgbTQsIG02LCBtMCAgICAgICAgOyBtNCA9ICAgICAxMiwgICAgIDEzLCAgICAgMTQsICAgICAxNQorICAgIHB1bnBja2x3ZCAgbTAsIG02LCBtMSAgICAgICAgOyBtMCA9ICAgICAgNCwgICAgICA1LCAgICAgIDYsICAgICAgNworICAgIHB1bnBja2h3ZCAgbTUsIG02LCBtMSAgICAgICAgOyBtNSA9ICAgICAxNiwgICAgIDE3LCAgICAgMTgsICAgICAxOQorICAgIHB1bnBja2x3ZCAgbTEsIG02LCBtMiAgICAgICAgOyBtMSA9ICAgICAgOCwgICAgICA5LCAgICAgMTAsICAgICAxMQorICAgIHB1bnBja2h3ZCAgICAgIG02LCBtMiAgICAgICAgOyBtNiA9ICAgICAyMCwgICAgIDIxLCAgICAgMjIsICAgICAyMworICAgIFNXQVAgNiwyLDEsMCwzLDQsNSAgICAgICAgICAgOyBzd2FwIHJlZ2lzdGVycyAzLDAsMSw0LDUsNiB0byAwLDEsMiwzLDQsNQorJWVuZGlmCisgICAgY3Z0ZHEycHMgICBtMCwgbTAgICAgICAgICAgICA7IGNvbnZlcnQgczMyIHRvIGZsb2F0CisgICAgY3Z0ZHEycHMgICBtMSwgbTEKKyAgICBjdnRkcTJwcyAgIG0yLCBtMgorICAgIGN2dGRxMnBzICAgbTMsIG0zCisgICAgY3Z0ZHEycHMgICBtNCwgbTQKKyAgICBjdnRkcTJwcyAgIG01LCBtNQorICAgIG11bHBzICAgICAgbTAsIG03ICAgICAgICAgICAgOyBzY2FsZSBmbG9hdCBmcm9tIHMzMiByYW5nZSB0byBbLTEuMCwxLjBdCisgICAgbXVscHMgICAgICBtMSwgbTcKKyAgICBtdWxwcyAgICAgIG0yLCBtNworICAgIG11bHBzICAgICAgbTMsIG03CisgICAgbXVscHMgICAgICBtNCwgbTcKKyAgICBtdWxwcyAgICAgIG01LCBtNworICAgIG1vdmEgIFtkc3RxICAgICAgICAgXSwgbTAKKyAgICBtb3ZhICBbZHN0cSsgIG1tc2l6ZV0sIG0xCisgICAgbW92YSAgW2RzdHErMiptbXNpemVdLCBtMgorICAgIG1vdmEgIFtkc3RxKzMqbW1zaXplXSwgbTMKKyAgICBtb3ZhICBbZHN0cSs0Km1tc2l6ZV0sIG00CisgICAgbW92YSAgW2RzdHErNSptbXNpemVdLCBtNQorICAgIGFkZCAgICAgIHNyY3EsIG1tc2l6ZS8yCisgICAgYWRkICAgICAgZHN0cSwgbW1zaXplKjYKKyAgICBzdWIgICAgICBsZW5kLCBtbXNpemUvNAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK0NPTlZfUzE2UF9UT19GTFRfNkNICitJTklUX1hNTSBzc3NlMworQ09OVl9TMTZQX1RPX0ZMVF82Q0gKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitDT05WX1MxNlBfVE9fRkxUXzZDSAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jb252X2ZsdHBfdG9fczE2XzJjaChpbnQxNl90ICpkc3QsIGZsb2F0ICpjb25zdCAqc3JjLCBpbnQgbGVuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBDT05WX0ZMVFBfVE9fUzE2XzJDSCAwCitjZ2xvYmFsIGNvbnZfZmx0cF90b19zMTZfMmNoLCAzLDQsMywgZHN0LCBzcmMwLCBsZW4sIHNyYzEKKyAgICBsZWEgICAgICBsZW5xLCBbNCpsZW5kXQorICAgIG1vdiAgICAgc3JjMXEsIFtzcmMwcStncHJzaXplXQorICAgIG1vdiAgICAgc3JjMHEsIFtzcmMwcSAgICAgICAgXQorICAgIGFkZCAgICAgIGRzdHEsIGxlbnEKKyAgICBhZGQgICAgIHNyYzBxLCBsZW5xCisgICAgYWRkICAgICBzcmMxcSwgbGVucQorICAgIG5lZyAgICAgIGxlbnEKKyAgICBtb3ZhICAgICAgIG0yLCBbcGZfczE2X3NjYWxlXQorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92YSAgICAgICBtMywgW3BiX2ludGVybGVhdmVfd29yZHNdCislZW5kaWYKKy5sb29wOgorICAgIG11bHBzICAgICAgbTAsIG0yLCBbc3JjMHErbGVucV0gOyBtMCA9ICAgIDAsICAgIDIsICAgIDQsICAgIDYKKyAgICBtdWxwcyAgICAgIG0xLCBtMiwgW3NyYzFxK2xlbnFdIDsgbTEgPSAgICAxLCAgICAzLCAgICA1LCAgICA3CisgICAgY3Z0cHMyZHEgICBtMCwgbTAKKyAgICBjdnRwczJkcSAgIG0xLCBtMQorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgcGFja3NzZHcgICBtMCwgbTEgICAgICAgICAgICAgICA7IG0wID0gMCwgMiwgNCwgNiwgMSwgMywgNSwgNworICAgIHBzaHVmYiAgICAgbTAsIG0zICAgICAgICAgICAgICAgOyBtMCA9IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcKKyVlbHNlCisgICAgcGFja3NzZHcgICBtMCwgbTAgICAgICAgICAgICAgICA7IG0wID0gMCwgMiwgNCwgNiwgeCwgeCwgeCwgeAorICAgIHBhY2tzc2R3ICAgbTEsIG0xICAgICAgICAgICAgICAgOyBtMSA9IDEsIDMsIDUsIDcsIHgsIHgsIHgsIHgKKyAgICBwdW5wY2tsd2QgIG0wLCBtMSAgICAgICAgICAgICAgIDsgbTAgPSAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3CislZW5kaWYKKyAgICBtb3ZhICBbZHN0cStsZW5xXSwgbTAKKyAgICBhZGQgICAgICBsZW5xLCBtbXNpemUKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitDT05WX0ZMVFBfVE9fUzE2XzJDSAorSU5JVF9YTU0gc3NzZTMKK0NPTlZfRkxUUF9UT19TMTZfMkNICisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jb252X2ZsdHBfdG9fczE2XzZjaChpbnQxNl90ICpkc3QsIGZsb2F0ICpjb25zdCAqc3JjLCBpbnQgbGVuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBDT05WX0ZMVFBfVE9fUzE2XzZDSCAwCislaWYgQVJDSF9YODZfNjQKK2NnbG9iYWwgY29udl9mbHRwX3RvX3MxNl82Y2gsIDMsOCw3LCBkc3QsIHNyYywgbGVuLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1CislZWxzZQorY2dsb2JhbCBjb252X2ZsdHBfdG9fczE2XzZjaCwgMiw3LDcsIGRzdCwgc3JjLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1CislZGVmaW5lIGxlbmQgZHdvcmQgcjJtCislZW5kaWYKKyAgICBtb3YgICAgICAgIHNyYzFxLCBbc3JjcSsxKmdwcnNpemVdCisgICAgbW92ICAgICAgICBzcmMycSwgW3NyY3ErMipncHJzaXplXQorICAgIG1vdiAgICAgICAgc3JjM3EsIFtzcmNxKzMqZ3Byc2l6ZV0KKyAgICBtb3YgICAgICAgIHNyYzRxLCBbc3JjcSs0KmdwcnNpemVdCisgICAgbW92ICAgICAgICBzcmM1cSwgW3NyY3ErNSpncHJzaXplXQorICAgIG1vdiAgICAgICAgIHNyY3EsIFtzcmNxXQorICAgIHN1YiAgICAgICAgc3JjMXEsIHNyY3EKKyAgICBzdWIgICAgICAgIHNyYzJxLCBzcmNxCisgICAgc3ViICAgICAgICBzcmMzcSwgc3JjcQorICAgIHN1YiAgICAgICAgc3JjNHEsIHNyY3EKKyAgICBzdWIgICAgICAgIHNyYzVxLCBzcmNxCisgICAgbW92YXBzICAgICAgeG1tNiwgW3BmX3MxNl9zY2FsZV0KKy5sb29wOgorJWlmIGNwdWZsYWcoc3NlMikKKyAgICBtdWxwcyAgICAgICAgIG0wLCBtNiwgW3NyY3EgICAgICBdCisgICAgbXVscHMgICAgICAgICBtMSwgbTYsIFtzcmNxK3NyYzFxXQorICAgIG11bHBzICAgICAgICAgbTIsIG02LCBbc3JjcStzcmMycV0KKyAgICBtdWxwcyAgICAgICAgIG0zLCBtNiwgW3NyY3Erc3JjM3FdCisgICAgbXVscHMgICAgICAgICBtNCwgbTYsIFtzcmNxK3NyYzRxXQorICAgIG11bHBzICAgICAgICAgbTUsIG02LCBbc3JjcStzcmM1cV0KKyAgICBjdnRwczJkcSAgICAgIG0wLCBtMAorICAgIGN2dHBzMmRxICAgICAgbTEsIG0xCisgICAgY3Z0cHMyZHEgICAgICBtMiwgbTIKKyAgICBjdnRwczJkcSAgICAgIG0zLCBtMworICAgIGN2dHBzMmRxICAgICAgbTQsIG00CisgICAgY3Z0cHMyZHEgICAgICBtNSwgbTUKKyAgICBwYWNrc3NkdyAgICAgIG0wLCBtMyAgICAgICAgICAgIDsgbTAgPSAgMCwgIDYsIDEyLCAxOCwgIDMsICA5LCAxNSwgMjEKKyAgICBwYWNrc3NkdyAgICAgIG0xLCBtNCAgICAgICAgICAgIDsgbTEgPSAgMSwgIDcsIDEzLCAxOSwgIDQsIDEwLCAxNiwgMjIKKyAgICBwYWNrc3NkdyAgICAgIG0yLCBtNSAgICAgICAgICAgIDsgbTIgPSAgMiwgIDgsIDE0LCAyMCwgIDUsIDExLCAxNywgMjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHdvcmRzOgorICAgIG1vdmhscHMgICAgICAgbTMsIG0wICAgICAgICAgICAgOyBtMyA9ICAzLCAgOSwgMTUsIDIxLCAgeCwgIHgsICB4LCAgeAorICAgIHB1bnBja2x3ZCAgICAgbTAsIG0xICAgICAgICAgICAgOyBtMCA9ICAwLCAgMSwgIDYsICA3LCAxMiwgMTMsIDE4LCAxOQorICAgIHB1bnBja2h3ZCAgICAgbTEsIG0yICAgICAgICAgICAgOyBtMSA9ICA0LCAgNSwgMTAsIDExLCAxNiwgMTcsIDIyLCAyMworICAgIHB1bnBja2x3ZCAgICAgbTIsIG0zICAgICAgICAgICAgOyBtMiA9ICAyLCAgMywgIDgsICA5LCAxNCwgMTUsIDIwLCAyMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBibGVuZCBkd29yZHM6CisgICAgc2h1ZnBzICAgICAgICBtMywgbTAsIG0yLCBxMjAyMCA7IG0zID0gIDAsICAxLCAxMiwgMTMsICAyLCAgMywgMTQsIDE1CisgICAgc2h1ZnBzICAgICAgICBtMCwgbTEsIHEyMDMxICAgICA7IG0wID0gIDYsICA3LCAxOCwgMTksICA0LCAgNSwgMTYsIDE3CisgICAgc2h1ZnBzICAgICAgICBtMiwgbTEsIHEzMTMxICAgICA7IG0yID0gIDgsICA5LCAyMCwgMjEsIDEwLCAxMSwgMjIsIDIzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHNodWZmbGUgZHdvcmRzOgorICAgIHNodWZwcyAgICAgICAgbTEsIG0yLCBtMywgcTMxMjAgOyBtMSA9ICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorICAgIHNodWZwcyAgICAgICAgbTMsIG0wLCAgICAgcTAyMjAgOyBtMyA9ICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNworICAgIHNodWZwcyAgICAgICAgbTAsIG0yLCAgICAgcTMxMTMgOyBtMCA9IDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMworICAgIG1vdmEgIFtkc3RxKzAqbW1zaXplXSwgbTMKKyAgICBtb3ZhICBbZHN0cSsxKm1tc2l6ZV0sIG0xCisgICAgbW92YSAgW2RzdHErMiptbXNpemVdLCBtMAorJWVsc2UgOyBzc2UKKyAgICBtb3ZscHMgICAgICB4bW0wLCBbc3JjcSAgICAgIF0KKyAgICBtb3ZscHMgICAgICB4bW0xLCBbc3JjcStzcmMxcV0KKyAgICBtb3ZscHMgICAgICB4bW0yLCBbc3JjcStzcmMycV0KKyAgICBtb3ZscHMgICAgICB4bW0zLCBbc3JjcStzcmMzcV0KKyAgICBtb3ZscHMgICAgICB4bW00LCBbc3JjcStzcmM0cV0KKyAgICBtb3ZscHMgICAgICB4bW01LCBbc3JjcStzcmM1cV0KKyAgICBtdWxwcyAgICAgICB4bW0wLCB4bW02CisgICAgbXVscHMgICAgICAgeG1tMSwgeG1tNgorICAgIG11bHBzICAgICAgIHhtbTIsIHhtbTYKKyAgICBtdWxwcyAgICAgICB4bW0zLCB4bW02CisgICAgbXVscHMgICAgICAgeG1tNCwgeG1tNgorICAgIG11bHBzICAgICAgIHhtbTUsIHhtbTYKKyAgICBjdnRwczJwaSAgICAgbW0wLCB4bW0wCisgICAgY3Z0cHMycGkgICAgIG1tMSwgeG1tMQorICAgIGN2dHBzMnBpICAgICBtbTIsIHhtbTIKKyAgICBjdnRwczJwaSAgICAgbW0zLCB4bW0zCisgICAgY3Z0cHMycGkgICAgIG1tNCwgeG1tNAorICAgIGN2dHBzMnBpICAgICBtbTUsIHhtbTUKKyAgICBwYWNrc3NkdyAgICAgbW0wLCBtbTMgICAgICAgICAgIDsgbTAgPSAgMCwgIDYsICAzLCAgOQorICAgIHBhY2tzc2R3ICAgICBtbTEsIG1tNCAgICAgICAgICAgOyBtMSA9ICAxLCAgNywgIDQsIDEwCisgICAgcGFja3NzZHcgICAgIG1tMiwgbW01ICAgICAgICAgICA7IG0yID0gIDIsICA4LCAgNSwgMTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIHdvcmRzCisgICAgcHNodWZ3ICAgICAgIG1tMywgbW0wLCBxMTAzMiAgICA7IG0zID0gIDMsICA5LCAgMCwgIDYKKyAgICBwdW5wY2tsd2QgICAgbW0wLCBtbTEgICAgICAgICAgIDsgbTAgPSAgMCwgIDEsICA2LCAgNworICAgIHB1bnBja2h3ZCAgICBtbTEsIG1tMiAgICAgICAgICAgOyBtMSA9ICA0LCAgNSwgMTAsIDExCisgICAgcHVucGNrbHdkICAgIG1tMiwgbW0zICAgICAgICAgICA7IG0yID0gIDIsICAzLCAgOCwgIDkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgdW5wYWNrIGR3b3JkcworICAgIHBzaHVmdyAgICAgICBtbTMsIG1tMCwgcTEwMzIgICAgOyBtMyA9ICA2LCAgNywgIDAsICAxCisgICAgcHVucGNrbGRxICAgIG1tMCwgbW0yICAgICAgICAgICA7IG0wID0gIDAsICAxLCAgMiwgIDMgKGZpbmFsKQorICAgIHB1bnBja2hkcSAgICBtbTIsIG1tMSAgICAgICAgICAgOyBtMiA9ICA4LCAgOSwgMTAsIDExIChmaW5hbCkKKyAgICBwdW5wY2tsZHEgICAgbW0xLCBtbTMgICAgICAgICAgIDsgbTEgPSAgNCwgIDUsICA2LCAgNyAoZmluYWwpCisgICAgbW92YSAgW2RzdHErMCptbXNpemVdLCBtbTAKKyAgICBtb3ZhICBbZHN0cSsxKm1tc2l6ZV0sIG1tMQorICAgIG1vdmEgIFtkc3RxKzIqbW1zaXplXSwgbW0yCislZW5kaWYKKyAgICBhZGQgICAgICAgc3JjcSwgbW1zaXplCisgICAgYWRkICAgICAgIGRzdHEsIG1tc2l6ZSozCisgICAgc3ViICAgICAgIGxlbmQsIG1tc2l6ZS80CisgICAgamcgLmxvb3AKKyVpZiBtbXNpemUgPT0gOAorICAgIGVtbXMKKyAgICBSRVQKKyVlbHNlCisgICAgUkVQX1JFVAorJWVuZGlmCislZW5kbWFjcm8KKworSU5JVF9NTVggc3NlCitDT05WX0ZMVFBfVE9fUzE2XzZDSAorSU5JVF9YTU0gc3NlMgorQ09OVl9GTFRQX1RPX1MxNl82Q0gKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitDT05WX0ZMVFBfVE9fUzE2XzZDSAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jb252X2ZsdHBfdG9fZmx0XzJjaChmbG9hdCAqZHN0LCBmbG9hdCAqY29uc3QgKnNyYywgaW50IGxlbiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQ09OVl9GTFRQX1RPX0ZMVF8yQ0ggMAorY2dsb2JhbCBjb252X2ZsdHBfdG9fZmx0XzJjaCwgMyw0LDUsIGRzdCwgc3JjMCwgbGVuLCBzcmMxCisgICAgbW92ICBzcmMxcSwgW3NyYzBxK2dwcnNpemVdCisgICAgbW92ICBzcmMwcSwgW3NyYzBxXQorICAgIGxlYSAgIGxlbnEsIFs0KmxlbmRdCisgICAgYWRkICBzcmMwcSwgbGVucQorICAgIGFkZCAgc3JjMXEsIGxlbnEKKyAgICBsZWEgICBkc3RxLCBbZHN0cSsyKmxlbnFdCisgICAgbmVnICAgbGVucQorLmxvb3A6CisgICAgbW92YSAgICBtMCwgW3NyYzBxK2xlbnEgICAgICAgXQorICAgIG1vdmEgICAgbTEsIFtzcmMxcStsZW5xICAgICAgIF0KKyAgICBtb3ZhICAgIG0yLCBbc3JjMHErbGVucSttbXNpemVdCisgICAgbW92YSAgICBtMywgW3NyYzFxK2xlbnErbW1zaXplXQorICAgIFNCVVRURVJGTFlQUyAwLCAxLCA0CisgICAgU0JVVFRFUkZMWVBTIDIsIDMsIDQKKyAgICBtb3ZhICBbZHN0cSsyKmxlbnErMCptbXNpemVdLCBtMAorICAgIG1vdmEgIFtkc3RxKzIqbGVucSsxKm1tc2l6ZV0sIG0xCisgICAgbW92YSAgW2RzdHErMipsZW5xKzIqbW1zaXplXSwgbTIKKyAgICBtb3ZhICBbZHN0cSsyKmxlbnErMyptbXNpemVdLCBtMworICAgIGFkZCAgIGxlbnEsIDIqbW1zaXplCisgICAgamwgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlCitDT05WX0ZMVFBfVE9fRkxUXzJDSAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0NPTlZfRkxUUF9UT19GTFRfMkNICislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfY29udl9mbHRwX3RvX2ZsdF82Y2goZmxvYXQgKmRzdCwgZmxvYXQgKmNvbnN0ICpzcmMsIGludCBsZW4sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQ09OVl9GTFRQX1RPX0ZMVF82Q0ggMAorY2dsb2JhbCBjb252X2ZsdHBfdG9fZmx0XzZjaCwgMiw4LDcsIGRzdCwgc3JjLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBsZW4KKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdiAgICAgbGVuZCwgcjJkCislZWxzZQorICAgICVkZWZpbmUgbGVuZCBkd29yZCByMm0KKyVlbmRpZgorICAgIG1vdiAgICBzcmMxcSwgW3NyY3ErMSpncHJzaXplXQorICAgIG1vdiAgICBzcmMycSwgW3NyY3ErMipncHJzaXplXQorICAgIG1vdiAgICBzcmMzcSwgW3NyY3ErMypncHJzaXplXQorICAgIG1vdiAgICBzcmM0cSwgW3NyY3ErNCpncHJzaXplXQorICAgIG1vdiAgICBzcmM1cSwgW3NyY3ErNSpncHJzaXplXQorICAgIG1vdiAgICAgc3JjcSwgW3NyY3FdCisgICAgc3ViICAgIHNyYzFxLCBzcmNxCisgICAgc3ViICAgIHNyYzJxLCBzcmNxCisgICAgc3ViICAgIHNyYzNxLCBzcmNxCisgICAgc3ViICAgIHNyYzRxLCBzcmNxCisgICAgc3ViICAgIHNyYzVxLCBzcmNxCisubG9vcDoKKyAgICBtb3ZhICAgICAgbTAsIFtzcmNxICAgICAgXQorICAgIG1vdmEgICAgICBtMSwgW3NyY3Erc3JjMXFdCisgICAgbW92YSAgICAgIG0yLCBbc3JjcStzcmMycV0KKyAgICBtb3ZhICAgICAgbTMsIFtzcmNxK3NyYzNxXQorICAgIG1vdmEgICAgICBtNCwgW3NyY3Erc3JjNHFdCisgICAgbW92YSAgICAgIG01LCBbc3JjcStzcmM1cV0KKyVpZiBjcHVmbGFnKHNzZTQpCisgICAgU0JVVFRFUkZMWVBTIDAsIDEsIDYKKyAgICBTQlVUVEVSRkxZUFMgMiwgMywgNgorICAgIFNCVVRURVJGTFlQUyA0LCA1LCA2CisKKyAgICBibGVuZHBzICAgbTYsIG00LCBtMCwgMTEwMGIKKyAgICBtb3ZsaHBzICAgbTAsIG0yCisgICAgbW92aGxwcyAgIG00LCBtMgorICAgIGJsZW5kcHMgICBtMiwgbTUsIG0xLCAxMTAwYgorICAgIG1vdmxocHMgICBtMSwgbTMKKyAgICBtb3ZobHBzICAgbTUsIG0zCisKKyAgICBtb3ZhcHMgW2RzdHEgICBdLCBtMAorICAgIG1vdmFwcyBbZHN0cSsxNl0sIG02CisgICAgbW92YXBzIFtkc3RxKzMyXSwgbTQKKyAgICBtb3ZhcHMgW2RzdHErNDhdLCBtMQorICAgIG1vdmFwcyBbZHN0cSs2NF0sIG0yCisgICAgbW92YXBzIFtkc3RxKzgwXSwgbTUKKyVlbHNlIDsgbW14CisgICAgU0JVVFRFUkZMWSBkcSwgMCwgMSwgNgorICAgIFNCVVRURVJGTFkgZHEsIDIsIDMsIDYKKyAgICBTQlVUVEVSRkxZIGRxLCA0LCA1LCA2CisKKyAgICBtb3ZxICAgW2RzdHEgICBdLCBtMAorICAgIG1vdnEgICBbZHN0cSsgOF0sIG0yCisgICAgbW92cSAgIFtkc3RxKzE2XSwgbTQKKyAgICBtb3ZxICAgW2RzdHErMjRdLCBtMQorICAgIG1vdnEgICBbZHN0cSszMl0sIG0zCisgICAgbW92cSAgIFtkc3RxKzQwXSwgbTUKKyVlbmRpZgorICAgIGFkZCAgICAgIHNyY3EsIG1tc2l6ZQorICAgIGFkZCAgICAgIGRzdHEsIG1tc2l6ZSo2CisgICAgc3ViICAgICAgbGVuZCwgbW1zaXplLzQKKyAgICBqZyAubG9vcAorJWlmIG1tc2l6ZSA9PSA4CisgICAgZW1tcworICAgIFJFVAorJWVsc2UKKyAgICBSRVBfUkVUCislZW5kaWYKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK0NPTlZfRkxUUF9UT19GTFRfNkNICitJTklUX1hNTSBzc2U0CitDT05WX0ZMVFBfVE9fRkxUXzZDSAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0NPTlZfRkxUUF9UT19GTFRfNkNICislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2NvbnZfczE2X3RvX3MxNnBfMmNoKGludDE2X3QgKmNvbnN0ICpkc3QsIGludDE2X3QgKnNyYywgaW50IGxlbiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQ09OVl9TMTZfVE9fUzE2UF8yQ0ggMAorY2dsb2JhbCBjb252X3MxNl90b19zMTZwXzJjaCwgMyw0LDQsIGRzdDAsIHNyYywgbGVuLCBkc3QxCisgICAgbGVhICAgICAgIGxlbnEsIFsyKmxlbmRdCisgICAgbW92ICAgICAgZHN0MXEsIFtkc3QwcStncHJzaXplXQorICAgIG1vdiAgICAgIGRzdDBxLCBbZHN0MHEgICAgICAgIF0KKyAgICBsZWEgICAgICAgc3JjcSwgW3NyY3ErMipsZW5xXQorICAgIGFkZCAgICAgIGRzdDBxLCBsZW5xCisgICAgYWRkICAgICAgZHN0MXEsIGxlbnEKKyAgICBuZWcgICAgICAgbGVucQorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92YSAgICAgICAgbTMsIFtwYl9kZWludGVybGVhdmVfd29yZHNdCislZW5kaWYKKy5sb29wOgorICAgIG1vdmEgICAgICAgIG0wLCBbc3JjcSsyKmxlbnEgICAgICAgXSAgOyBtMCA9ICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNworICAgIG1vdmEgICAgICAgIG0xLCBbc3JjcSsyKmxlbnErbW1zaXplXSAgOyBtMSA9ICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgcHNodWZiICAgICAgbTAsIG0zICAgICAgICAgICAgICAgICAgICA7IG0wID0gIDAsICAyLCAgNCwgIDYsICAxLCAgMywgIDUsICA3CisgICAgcHNodWZiICAgICAgbTEsIG0zICAgICAgICAgICAgICAgICAgICA7IG0xID0gIDgsIDEwLCAxMiwgMTQsICA5LCAxMSwgMTMsIDE1CisgICAgU0JVVFRFUkZMWTIgcWRxLCAwLCAxLCAyICAgICAgICAgICAgICA7IG0wID0gIDAsICAyLCAgNCwgIDYsICA4LCAxMCwgMTIsIDE0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG0xID0gIDEsICAzLCAgNSwgIDcsICA5LCAxMSwgMTMsIDE1CislZWxzZSA7IHNzZTIKKyAgICBwc2h1Zmx3ICAgICBtMCwgbTAsIHEzMTIwICAgICAgICAgICAgIDsgbTAgPSAgMCwgIDIsICAxLCAgMywgIDQsICA1LCAgNiwgIDcKKyAgICBwc2h1Zmh3ICAgICBtMCwgbTAsIHEzMTIwICAgICAgICAgICAgIDsgbTAgPSAgMCwgIDIsICAxLCAgMywgIDQsICA2LCAgNSwgIDcKKyAgICBwc2h1Zmx3ICAgICBtMSwgbTEsIHEzMTIwICAgICAgICAgICAgIDsgbTEgPSAgOCwgMTAsICA5LCAxMSwgMTIsIDEzLCAxNCwgMTUKKyAgICBwc2h1Zmh3ICAgICBtMSwgbTEsIHEzMTIwICAgICAgICAgICAgIDsgbTEgPSAgOCwgMTAsICA5LCAxMSwgMTIsIDE0LCAxMywgMTUKKyAgICBERUlOVDJfUFMgICAgMCwgMSwgMiAgICAgICAgICAgICAgICAgIDsgbTAgPSAgMCwgIDIsICA0LCAgNiwgIDgsIDEwLCAxMiwgMTQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTEgPSAgMSwgIDMsICA1LCAgNywgIDksIDExLCAxMywgMTUKKyVlbmRpZgorICAgIG1vdmEgIFtkc3QwcStsZW5xXSwgbTAKKyAgICBtb3ZhICBbZHN0MXErbGVucV0sIG0xCisgICAgYWRkICAgICAgIGxlbnEsIG1tc2l6ZQorICAgIGpsIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK0NPTlZfUzE2X1RPX1MxNlBfMkNICitJTklUX1hNTSBzc3NlMworQ09OVl9TMTZfVE9fUzE2UF8yQ0gKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitDT05WX1MxNl9UT19TMTZQXzJDSAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jb252X3MxNl90b19zMTZwXzZjaChpbnQxNl90ICpjb25zdCAqZHN0LCBpbnQxNl90ICpzcmMsIGludCBsZW4sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIENPTlZfUzE2X1RPX1MxNlBfNkNIIDAKKyVpZiBBUkNIX1g4Nl82NAorY2dsb2JhbCBjb252X3MxNl90b19zMTZwXzZjaCwgMyw4LDUsIGRzdCwgc3JjLCBsZW4sIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUKKyVlbHNlCitjZ2xvYmFsIGNvbnZfczE2X3RvX3MxNnBfNmNoLCAyLDcsNSwgZHN0LCBzcmMsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUKKyVkZWZpbmUgbGVuZCBkd29yZCByMm0KKyVlbmRpZgorICAgIG1vdiAgICAgZHN0MXEsIFtkc3RxKyAgZ3Byc2l6ZV0KKyAgICBtb3YgICAgIGRzdDJxLCBbZHN0cSsyKmdwcnNpemVdCisgICAgbW92ICAgICBkc3QzcSwgW2RzdHErMypncHJzaXplXQorICAgIG1vdiAgICAgZHN0NHEsIFtkc3RxKzQqZ3Byc2l6ZV0KKyAgICBtb3YgICAgIGRzdDVxLCBbZHN0cSs1KmdwcnNpemVdCisgICAgbW92ICAgICAgZHN0cSwgW2RzdHEgICAgICAgICAgXQorICAgIHN1YiAgICAgZHN0MXEsIGRzdHEKKyAgICBzdWIgICAgIGRzdDJxLCBkc3RxCisgICAgc3ViICAgICBkc3QzcSwgZHN0cQorICAgIHN1YiAgICAgZHN0NHEsIGRzdHEKKyAgICBzdWIgICAgIGRzdDVxLCBkc3RxCisubG9vcDoKKyAgICBtb3ZhICAgICAgIG0wLCBbc3JjcSswKm1tc2l6ZV0gICAgICA7IG0wID0gIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3CisgICAgbW92YSAgICAgICBtMywgW3NyY3ErMSptbXNpemVdICAgICAgOyBtMyA9ICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorICAgIG1vdmEgICAgICAgbTIsIFtzcmNxKzIqbW1zaXplXSAgICAgIDsgbTIgPSAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICBQQUxJR05SICAgIG0xLCBtMywgbTAsIDEyLCBtNCAgICAgICA7IG0xID0gIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgIHgsICB4CisgICAgc2h1ZnBzICAgICBtMywgbTIsIHExMDMyICAgICAgICAgICAgOyBtMyA9IDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOQorICAgIHBzcmxkcSAgICAgbTIsIDQgICAgICAgICAgICAgICAgICAgIDsgbTIgPSAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAgeCwgIHgKKyAgICBTQlVUVEVSRkxZMiB3ZCwgMCwgMSwgNCAgICAgICAgICAgICA7IG0wID0gIDAsICA2LCAgMSwgIDcsICAyLCAgOCwgIDMsICA5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtMSA9ICA0LCAxMCwgIDUsIDExLCAgeCwgIHgsICB4LCAgeAorICAgIFNCVVRURVJGTFkyIHdkLCAzLCAyLCA0ICAgICAgICAgICAgIDsgbTMgPSAxMiwgMTgsIDEzLCAxOSwgMTQsIDIwLCAxNSwgMjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG0yID0gMTYsIDIyLCAxNywgMjMsICB4LCAgeCwgIHgsICB4CisgICAgU0JVVFRFUkZMWTIgZHEsIDAsIDMsIDQgICAgICAgICAgICAgOyBtMCA9ICAwLCAgNiwgMTIsIDE4LCAgMSwgIDcsIDEzLCAxOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTMgPSAgMiwgIDgsIDE0LCAyMCwgIDMsICA5LCAxNSwgMjEKKyAgICBwdW5wY2tsZHEgIG0xLCBtMiAgICAgICAgICAgICAgICAgICA7IG0xID0gIDQsIDEwLCAxNiwgMjIsICA1LCAxMSwgMTcsIDIzCisgICAgbW92cSAgICBbZHN0cSAgICAgIF0sIG0wCisgICAgbW92aHBzICBbZHN0cStkc3QxcV0sIG0wCisgICAgbW92cSAgICBbZHN0cStkc3QycV0sIG0zCisgICAgbW92aHBzICBbZHN0cStkc3QzcV0sIG0zCisgICAgbW92cSAgICBbZHN0cStkc3Q0cV0sIG0xCisgICAgbW92aHBzICBbZHN0cStkc3Q1cV0sIG0xCisgICAgYWRkICAgICAgc3JjcSwgbW1zaXplKjMKKyAgICBhZGQgICAgICBkc3RxLCBtbXNpemUvMgorICAgIHN1YiAgICAgIGxlbmQsIG1tc2l6ZS80CisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorQ09OVl9TMTZfVE9fUzE2UF82Q0gKK0lOSVRfWE1NIHNzc2UzCitDT05WX1MxNl9UT19TMTZQXzZDSAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0NPTlZfUzE2X1RPX1MxNlBfNkNICislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2NvbnZfczE2X3RvX2ZsdHBfMmNoKGZsb2F0ICpjb25zdCAqZHN0LCBpbnQxNl90ICpzcmMsIGludCBsZW4sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIENPTlZfUzE2X1RPX0ZMVFBfMkNIIDAKK2NnbG9iYWwgY29udl9zMTZfdG9fZmx0cF8yY2gsIDMsNCw1LCBkc3QwLCBzcmMsIGxlbiwgZHN0MQorICAgIGxlYSAgICAgICBsZW5xLCBbNCpsZW5kXQorICAgIG1vdiAgICAgIGRzdDFxLCBbZHN0MHErZ3Byc2l6ZV0KKyAgICBtb3YgICAgICBkc3QwcSwgW2RzdDBxICAgICAgICBdCisgICAgYWRkICAgICAgIHNyY3EsIGxlbnEKKyAgICBhZGQgICAgICBkc3QwcSwgbGVucQorICAgIGFkZCAgICAgIGRzdDFxLCBsZW5xCisgICAgbmVnICAgICAgIGxlbnEKKyAgICBtb3ZhICAgICAgICBtMywgW3BmX3MzMl9pbnZfc2NhbGVdCisgICAgbW92YSAgICAgICAgbTQsIFtwd196ZXJvX2V2ZW5dCisubG9vcDoKKyAgICBtb3ZhICAgICAgICBtMSwgW3NyY3ErbGVucV0KKyAgICBwc2xsZCAgICAgICBtMCwgbTEsIDE2CisgICAgcGFuZCAgICAgICAgbTEsIG00CisgICAgY3Z0ZHEycHMgICAgbTAsIG0wCisgICAgY3Z0ZHEycHMgICAgbTEsIG0xCisgICAgbXVscHMgICAgICAgbTAsIG0wLCBtMworICAgIG11bHBzICAgICAgIG0xLCBtMSwgbTMKKyAgICBtb3ZhICBbZHN0MHErbGVucV0sIG0wCisgICAgbW92YSAgW2RzdDFxK2xlbnFdLCBtMQorICAgIGFkZCAgICAgICBsZW5xLCBtbXNpemUKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitDT05WX1MxNl9UT19GTFRQXzJDSAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0NPTlZfUzE2X1RPX0ZMVFBfMkNICislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2NvbnZfczE2X3RvX2ZsdHBfNmNoKGZsb2F0ICpjb25zdCAqZHN0LCBpbnQxNl90ICpzcmMsIGludCBsZW4sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIENPTlZfUzE2X1RPX0ZMVFBfNkNIIDAKKyVpZiBBUkNIX1g4Nl82NAorY2dsb2JhbCBjb252X3MxNl90b19mbHRwXzZjaCwgMyw4LDcsIGRzdCwgc3JjLCBsZW4sIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUKKyVlbHNlCitjZ2xvYmFsIGNvbnZfczE2X3RvX2ZsdHBfNmNoLCAyLDcsNywgZHN0LCBzcmMsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUKKyVkZWZpbmUgbGVuZCBkd29yZCByMm0KKyVlbmRpZgorICAgIG1vdiAgICAgZHN0MXEsIFtkc3RxKyAgZ3Byc2l6ZV0KKyAgICBtb3YgICAgIGRzdDJxLCBbZHN0cSsyKmdwcnNpemVdCisgICAgbW92ICAgICBkc3QzcSwgW2RzdHErMypncHJzaXplXQorICAgIG1vdiAgICAgZHN0NHEsIFtkc3RxKzQqZ3Byc2l6ZV0KKyAgICBtb3YgICAgIGRzdDVxLCBbZHN0cSs1KmdwcnNpemVdCisgICAgbW92ICAgICAgZHN0cSwgW2RzdHEgICAgICAgICAgXQorICAgIHN1YiAgICAgZHN0MXEsIGRzdHEKKyAgICBzdWIgICAgIGRzdDJxLCBkc3RxCisgICAgc3ViICAgICBkc3QzcSwgZHN0cQorICAgIHN1YiAgICAgZHN0NHEsIGRzdHEKKyAgICBzdWIgICAgIGRzdDVxLCBkc3RxCisgICAgbW92YSAgICAgICBtNiwgW3BmX3MxNl9pbnZfc2NhbGVdCisubG9vcDoKKyAgICBtb3ZhICAgICAgIG0wLCBbc3JjcSswKm1tc2l6ZV0gIDsgbTAgPSAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcKKyAgICBtb3ZhICAgICAgIG0zLCBbc3JjcSsxKm1tc2l6ZV0gIDsgbTMgPSAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKKyAgICBtb3ZhICAgICAgIG0yLCBbc3JjcSsyKm1tc2l6ZV0gIDsgbTIgPSAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICBQQUxJR05SICAgIG0xLCBtMywgbTAsIDEyLCBtNCAgIDsgbTEgPSAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAgeCwgIHgKKyAgICBzaHVmcHMgICAgIG0zLCBtMiwgcTEwMzIgICAgICAgIDsgbTMgPSAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTkKKyAgICBwc3JsZHEgICAgIG0yLCA0ICAgICAgICAgICAgICAgIDsgbTIgPSAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAgeCwgIHgKKyAgICBTQlVUVEVSRkxZMiB3ZCwgMCwgMSwgNCAgICAgICAgIDsgbTAgPSAgMCwgIDYsICAxLCAgNywgIDIsICA4LCAgMywgIDkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTEgPSAgNCwgMTAsICA1LCAxMSwgIHgsICB4LCAgeCwgIHgKKyAgICBTQlVUVEVSRkxZMiB3ZCwgMywgMiwgNCAgICAgICAgIDsgbTMgPSAxMiwgMTgsIDEzLCAxOSwgMTQsIDIwLCAxNSwgMjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTIgPSAxNiwgMjIsIDE3LCAyMywgIHgsICB4LCAgeCwgIHgKKyAgICBTQlVUVEVSRkxZMiBkcSwgMCwgMywgNCAgICAgICAgIDsgbTAgPSAgMCwgIDYsIDEyLCAxOCwgIDEsICA3LCAxMywgMTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTMgPSAgMiwgIDgsIDE0LCAyMCwgIDMsICA5LCAxNSwgMjEKKyAgICBwdW5wY2tsZHEgIG0xLCBtMiAgICAgICAgICAgICAgIDsgbTEgPSAgNCwgMTAsIDE2LCAyMiwgIDUsIDExLCAxNywgMjMKKyAgICBTMTZfVE9fUzMyX1NYIDAsIDIgICAgICAgICAgICAgIDsgbTAgPSAgICAgIDAsICAgICAgNiwgICAgIDEyLCAgICAgMTgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTIgPSAgICAgIDEsICAgICAgNywgICAgIDEzLCAgICAgMTkKKyAgICBTMTZfVE9fUzMyX1NYIDMsIDQgICAgICAgICAgICAgIDsgbTMgPSAgICAgIDIsICAgICAgOCwgICAgIDE0LCAgICAgMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTQgPSAgICAgIDMsICAgICAgOSwgICAgIDE1LCAgICAgMjEKKyAgICBTMTZfVE9fUzMyX1NYIDEsIDUgICAgICAgICAgICAgIDsgbTEgPSAgICAgIDQsICAgICAxMCwgICAgIDE2LCAgICAgMjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTUgPSAgICAgIDUsICAgICAxMSwgICAgIDE3LCAgICAgMjMKKyAgICBTV0FQIDEsMiwzLDQKKyAgICBjdnRkcTJwcyAgIG0wLCBtMAorICAgIGN2dGRxMnBzICAgbTEsIG0xCisgICAgY3Z0ZHEycHMgICBtMiwgbTIKKyAgICBjdnRkcTJwcyAgIG0zLCBtMworICAgIGN2dGRxMnBzICAgbTQsIG00CisgICAgY3Z0ZHEycHMgICBtNSwgbTUKKyAgICBtdWxwcyAgICAgIG0wLCBtNgorICAgIG11bHBzICAgICAgbTEsIG02CisgICAgbXVscHMgICAgICBtMiwgbTYKKyAgICBtdWxwcyAgICAgIG0zLCBtNgorICAgIG11bHBzICAgICAgbTQsIG02CisgICAgbXVscHMgICAgICBtNSwgbTYKKyAgICBtb3ZhICBbZHN0cSAgICAgIF0sIG0wCisgICAgbW92YSAgW2RzdHErZHN0MXFdLCBtMQorICAgIG1vdmEgIFtkc3RxK2RzdDJxXSwgbTIKKyAgICBtb3ZhICBbZHN0cStkc3QzcV0sIG0zCisgICAgbW92YSAgW2RzdHErZHN0NHFdLCBtNAorICAgIG1vdmEgIFtkc3RxK2RzdDVxXSwgbTUKKyAgICBhZGQgICAgICBzcmNxLCBtbXNpemUqMworICAgIGFkZCAgICAgIGRzdHEsIG1tc2l6ZQorICAgIHN1YiAgICAgIGxlbmQsIG1tc2l6ZS80CisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorQ09OVl9TMTZfVE9fRkxUUF82Q0gKK0lOSVRfWE1NIHNzc2UzCitDT05WX1MxNl9UT19GTFRQXzZDSAorSU5JVF9YTU0gc3NlNAorQ09OVl9TMTZfVE9fRkxUUF82Q0gKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitDT05WX1MxNl9UT19GTFRQXzZDSAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jb252X2ZsdF90b19zMTZwXzJjaChpbnQxNl90ICpjb25zdCAqZHN0LCBmbG9hdCAqc3JjLCBpbnQgbGVuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBDT05WX0ZMVF9UT19TMTZQXzJDSCAwCitjZ2xvYmFsIGNvbnZfZmx0X3RvX3MxNnBfMmNoLCAzLDQsNiwgZHN0MCwgc3JjLCBsZW4sIGRzdDEKKyAgICBsZWEgICAgICAgbGVucSwgWzIqbGVuZF0KKyAgICBtb3YgICAgICBkc3QxcSwgW2RzdDBxK2dwcnNpemVdCisgICAgbW92ICAgICAgZHN0MHEsIFtkc3QwcSAgICAgICAgXQorICAgIGxlYSAgICAgICBzcmNxLCBbc3JjcSs0KmxlbnFdCisgICAgYWRkICAgICAgZHN0MHEsIGxlbnEKKyAgICBhZGQgICAgICBkc3QxcSwgbGVucQorICAgIG5lZyAgICAgICBsZW5xCisgICAgbW92YSAgICAgICAgbTUsIFtwZl9zMTZfc2NhbGVdCisubG9vcDoKKyAgICBtb3ZhICAgICAgIG0wLCBbc3JjcSs0KmxlbnEgICAgICAgICBdCisgICAgbW92YSAgICAgICBtMSwgW3NyY3ErNCpsZW5xKyAgbW1zaXplXQorICAgIG1vdmEgICAgICAgbTIsIFtzcmNxKzQqbGVucSsyKm1tc2l6ZV0KKyAgICBtb3ZhICAgICAgIG0zLCBbc3JjcSs0KmxlbnErMyptbXNpemVdCisgICAgREVJTlQyX1BTICAgMCwgMSwgNAorICAgIERFSU5UMl9QUyAgIDIsIDMsIDQKKyAgICBtdWxwcyAgICAgIG0wLCBtMCwgbTUKKyAgICBtdWxwcyAgICAgIG0xLCBtMSwgbTUKKyAgICBtdWxwcyAgICAgIG0yLCBtMiwgbTUKKyAgICBtdWxwcyAgICAgIG0zLCBtMywgbTUKKyAgICBjdnRwczJkcSAgIG0wLCBtMAorICAgIGN2dHBzMmRxICAgbTEsIG0xCisgICAgY3Z0cHMyZHEgICBtMiwgbTIKKyAgICBjdnRwczJkcSAgIG0zLCBtMworICAgIHBhY2tzc2R3ICAgbTAsIG0yCisgICAgcGFja3NzZHcgICBtMSwgbTMKKyAgICBtb3ZhICBbZHN0MHErbGVucV0sIG0wCisgICAgbW92YSAgW2RzdDFxK2xlbnFdLCBtMQorICAgIGFkZCAgICAgIGxlbnEsIG1tc2l6ZQorICAgIGpsIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK0NPTlZfRkxUX1RPX1MxNlBfMkNICislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorQ09OVl9GTFRfVE9fUzE2UF8yQ0gKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfY29udl9mbHRfdG9fczE2cF82Y2goaW50MTZfdCAqY29uc3QgKmRzdCwgZmxvYXQgKnNyYywgaW50IGxlbiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQ09OVl9GTFRfVE9fUzE2UF82Q0ggMAorJWlmIEFSQ0hfWDg2XzY0CitjZ2xvYmFsIGNvbnZfZmx0X3RvX3MxNnBfNmNoLCAzLDgsNywgZHN0LCBzcmMsIGxlbiwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NQorJWVsc2UKK2NnbG9iYWwgY29udl9mbHRfdG9fczE2cF82Y2gsIDIsNyw3LCBkc3QsIHNyYywgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NQorJWRlZmluZSBsZW5kIGR3b3JkIHIybQorJWVuZGlmCisgICAgbW92ICAgICBkc3QxcSwgW2RzdHErICBncHJzaXplXQorICAgIG1vdiAgICAgZHN0MnEsIFtkc3RxKzIqZ3Byc2l6ZV0KKyAgICBtb3YgICAgIGRzdDNxLCBbZHN0cSszKmdwcnNpemVdCisgICAgbW92ICAgICBkc3Q0cSwgW2RzdHErNCpncHJzaXplXQorICAgIG1vdiAgICAgZHN0NXEsIFtkc3RxKzUqZ3Byc2l6ZV0KKyAgICBtb3YgICAgICBkc3RxLCBbZHN0cSAgICAgICAgICBdCisgICAgc3ViICAgICBkc3QxcSwgZHN0cQorICAgIHN1YiAgICAgZHN0MnEsIGRzdHEKKyAgICBzdWIgICAgIGRzdDNxLCBkc3RxCisgICAgc3ViICAgICBkc3Q0cSwgZHN0cQorICAgIHN1YiAgICAgZHN0NXEsIGRzdHEKKyAgICBtb3ZhICAgICAgIG02LCBbcGZfczE2X3NjYWxlXQorLmxvb3A6CisgICAgbXVscHMgICAgICBtMCwgbTYsIFtzcmNxKzAqbW1zaXplXQorICAgIG11bHBzICAgICAgbTMsIG02LCBbc3JjcSsxKm1tc2l6ZV0KKyAgICBtdWxwcyAgICAgIG0xLCBtNiwgW3NyY3ErMiptbXNpemVdCisgICAgbXVscHMgICAgICBtNCwgbTYsIFtzcmNxKzMqbW1zaXplXQorICAgIG11bHBzICAgICAgbTIsIG02LCBbc3JjcSs0Km1tc2l6ZV0KKyAgICBtdWxwcyAgICAgIG01LCBtNiwgW3NyY3ErNSptbXNpemVdCisgICAgY3Z0cHMyZHEgICBtMCwgbTAKKyAgICBjdnRwczJkcSAgIG0xLCBtMQorICAgIGN2dHBzMmRxICAgbTIsIG0yCisgICAgY3Z0cHMyZHEgICBtMywgbTMKKyAgICBjdnRwczJkcSAgIG00LCBtNAorICAgIGN2dHBzMmRxICAgbTUsIG01CisgICAgcGFja3NzZHcgICBtMCwgbTMgICAgICAgICAgICAgICA7IG0wID0gIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3CisgICAgcGFja3NzZHcgICBtMSwgbTQgICAgICAgICAgICAgICA7IG0xID0gIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1CisgICAgcGFja3NzZHcgICBtMiwgbTUgICAgICAgICAgICAgICA7IG0yID0gMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzCisgICAgUEFMSUdOUiAgICBtMywgbTEsIG0wLCAxMiwgbTQgICA7IG0zID0gIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgIHgsICB4CisgICAgc2h1ZnBzICAgICBtMSwgbTIsIHExMDMyICAgICAgICA7IG0xID0gMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5CisgICAgcHNybGRxICAgICBtMiwgNCAgICAgICAgICAgICAgICA7IG0yID0gMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgIHgsICB4CisgICAgU0JVVFRFUkZMWTIgd2QsIDAsIDMsIDQgICAgICAgICA7IG0wID0gIDAsICA2LCAgMSwgIDcsICAyLCAgOCwgIDMsICA5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG0zID0gIDQsIDEwLCAgNSwgMTEsICB4LCAgeCwgIHgsICB4CisgICAgU0JVVFRFUkZMWTIgd2QsIDEsIDIsIDQgICAgICAgICA7IG0xID0gMTIsIDE4LCAxMywgMTksIDE0LCAyMCwgMTUsIDIxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG0yID0gMTYsIDIyLCAxNywgMjMsICB4LCAgeCwgIHgsICB4CisgICAgU0JVVFRFUkZMWTIgZHEsIDAsIDEsIDQgICAgICAgICA7IG0wID0gIDAsICA2LCAxMiwgMTgsICAxLCAgNywgMTMsIDE5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG0xID0gIDIsICA4LCAxNCwgMjAsICAzLCAgOSwgMTUsIDIxCisgICAgcHVucGNrbGRxICBtMywgbTIgICAgICAgICAgICAgICA7IG0zID0gIDQsIDEwLCAxNiwgMjIsICA1LCAxMSwgMTcsIDIzCisgICAgbW92cSAgICBbZHN0cSAgICAgIF0sIG0wCisgICAgbW92aHBzICBbZHN0cStkc3QxcV0sIG0wCisgICAgbW92cSAgICBbZHN0cStkc3QycV0sIG0xCisgICAgbW92aHBzICBbZHN0cStkc3QzcV0sIG0xCisgICAgbW92cSAgICBbZHN0cStkc3Q0cV0sIG0zCisgICAgbW92aHBzICBbZHN0cStkc3Q1cV0sIG0zCisgICAgYWRkICAgICAgc3JjcSwgbW1zaXplKjYKKyAgICBhZGQgICAgICBkc3RxLCBtbXNpemUvMgorICAgIHN1YiAgICAgIGxlbmQsIG1tc2l6ZS80CisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorQ09OVl9GTFRfVE9fUzE2UF82Q0gKK0lOSVRfWE1NIHNzc2UzCitDT05WX0ZMVF9UT19TMTZQXzZDSAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK0NPTlZfRkxUX1RPX1MxNlBfNkNICislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2NvbnZfZmx0X3RvX2ZsdHBfMmNoKGZsb2F0ICpjb25zdCAqZHN0LCBmbG9hdCAqc3JjLCBpbnQgbGVuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBDT05WX0ZMVF9UT19GTFRQXzJDSCAwCitjZ2xvYmFsIGNvbnZfZmx0X3RvX2ZsdHBfMmNoLCAzLDQsMywgZHN0MCwgc3JjLCBsZW4sIGRzdDEKKyAgICBsZWEgICAgbGVucSwgWzQqbGVuZF0KKyAgICBtb3YgICBkc3QxcSwgW2RzdDBxK2dwcnNpemVdCisgICAgbW92ICAgZHN0MHEsIFtkc3QwcSAgICAgICAgXQorICAgIGxlYSAgICBzcmNxLCBbc3JjcSsyKmxlbnFdCisgICAgYWRkICAgZHN0MHEsIGxlbnEKKyAgICBhZGQgICBkc3QxcSwgbGVucQorICAgIG5lZyAgICBsZW5xCisubG9vcDoKKyAgICBtb3ZhICAgICBtMCwgW3NyY3ErMipsZW5xICAgICAgIF0KKyAgICBtb3ZhICAgICBtMSwgW3NyY3ErMipsZW5xK21tc2l6ZV0KKyAgICBERUlOVDJfUFMgMCwgMSwgMgorICAgIG1vdmEgIFtkc3QwcStsZW5xXSwgbTAKKyAgICBtb3ZhICBbZHN0MXErbGVucV0sIG0xCisgICAgYWRkICAgIGxlbnEsIG1tc2l6ZQorICAgIGpsIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZQorQ09OVl9GTFRfVE9fRkxUUF8yQ0gKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitDT05WX0ZMVF9UT19GTFRQXzJDSAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jb252X2ZsdF90b19mbHRwXzZjaChmbG9hdCAqY29uc3QgKmRzdCwgZmxvYXQgKnNyYywgaW50IGxlbiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gQ09OVl9GTFRfVE9fRkxUUF82Q0ggMAorJWlmIEFSQ0hfWDg2XzY0CitjZ2xvYmFsIGNvbnZfZmx0X3RvX2ZsdHBfNmNoLCAzLDgsNywgZHN0LCBzcmMsIGxlbiwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NQorJWVsc2UKK2NnbG9iYWwgY29udl9mbHRfdG9fZmx0cF82Y2gsIDIsNyw3LCBkc3QsIHNyYywgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NQorJWRlZmluZSBsZW5kIGR3b3JkIHIybQorJWVuZGlmCisgICAgbW92ICAgICBkc3QxcSwgW2RzdHErICBncHJzaXplXQorICAgIG1vdiAgICAgZHN0MnEsIFtkc3RxKzIqZ3Byc2l6ZV0KKyAgICBtb3YgICAgIGRzdDNxLCBbZHN0cSszKmdwcnNpemVdCisgICAgbW92ICAgICBkc3Q0cSwgW2RzdHErNCpncHJzaXplXQorICAgIG1vdiAgICAgZHN0NXEsIFtkc3RxKzUqZ3Byc2l6ZV0KKyAgICBtb3YgICAgICBkc3RxLCBbZHN0cSAgICAgICAgICBdCisgICAgc3ViICAgICBkc3QxcSwgZHN0cQorICAgIHN1YiAgICAgZHN0MnEsIGRzdHEKKyAgICBzdWIgICAgIGRzdDNxLCBkc3RxCisgICAgc3ViICAgICBkc3Q0cSwgZHN0cQorICAgIHN1YiAgICAgZHN0NXEsIGRzdHEKKy5sb29wOgorICAgIG1vdmEgICAgICAgbTAsIFtzcmNxKzAqbW1zaXplXSAgOyBtMCA9ICAwLCAgMSwgIDIsICAzCisgICAgbW92YSAgICAgICBtMSwgW3NyY3ErMSptbXNpemVdICA7IG0xID0gIDQsICA1LCAgNiwgIDcKKyAgICBtb3ZhICAgICAgIG0yLCBbc3JjcSsyKm1tc2l6ZV0gIDsgbTIgPSAgOCwgIDksIDEwLCAxMQorICAgIG1vdmEgICAgICAgbTMsIFtzcmNxKzMqbW1zaXplXSAgOyBtMyA9IDEyLCAxMywgMTQsIDE1CisgICAgbW92YSAgICAgICBtNCwgW3NyY3ErNCptbXNpemVdICA7IG00ID0gMTYsIDE3LCAxOCwgMTkKKyAgICBtb3ZhICAgICAgIG01LCBbc3JjcSs1Km1tc2l6ZV0gIDsgbTUgPSAyMCwgMjEsIDIyLCAyMworCisgICAgU0JVVFRFUkZMWTIgZHEsIDAsIDMsIDYgICAgICAgICA7IG0wID0gIDAsIDEyLCAgMSwgMTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTMgPSAgMiwgMTQsICAzLCAxNQorICAgIFNCVVRURVJGTFkyIGRxLCAxLCA0LCA2ICAgICAgICAgOyBtMSA9ICA0LCAxNiwgIDUsIDE3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG00ID0gIDYsIDE4LCAgNywgMTkKKyAgICBTQlVUVEVSRkxZMiBkcSwgMiwgNSwgNiAgICAgICAgIDsgbTIgPSAgOCwgMjAsICA5LCAyMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtNSA9IDEwLCAyMiwgMTEsIDIzCisgICAgU0JVVFRFUkZMWTIgZHEsIDAsIDQsIDYgICAgICAgICA7IG0wID0gIDAsICA2LCAxMiwgMTgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTQgPSAgMSwgIDcsIDEzLCAxOQorICAgIFNCVVRURVJGTFkyIGRxLCAzLCAyLCA2ICAgICAgICAgOyBtMyA9ICAyLCAgOCwgMTQsIDIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG0yID0gIDMsICA5LCAxNSwgMjEKKyAgICBTQlVUVEVSRkxZMiBkcSwgMSwgNSwgNiAgICAgICAgIDsgbTEgPSAgNCwgMTAsIDE2LCAyMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtNSA9ICA1LCAxMSwgMTcsIDIzCisgICAgbW92YSBbZHN0cSAgICAgIF0sIG0wCisgICAgbW92YSBbZHN0cStkc3QxcV0sIG00CisgICAgbW92YSBbZHN0cStkc3QycV0sIG0zCisgICAgbW92YSBbZHN0cStkc3QzcV0sIG0yCisgICAgbW92YSBbZHN0cStkc3Q0cV0sIG0xCisgICAgbW92YSBbZHN0cStkc3Q1cV0sIG01CisgICAgYWRkICAgICAgc3JjcSwgbW1zaXplKjYKKyAgICBhZGQgICAgICBkc3RxLCBtbXNpemUKKyAgICBzdWIgICAgICBsZW5kLCBtbXNpemUvNAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK0NPTlZfRkxUX1RPX0ZMVFBfNkNICislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorQ09OVl9GTFRfVE9fRkxUUF82Q0gKKyVlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUveDg2L2F1ZGlvX2NvbnZlcnRfaW5pdC5jIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUveDg2L2F1ZGlvX2NvbnZlcnRfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OGRkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS94ODYvYXVkaW9fY29udmVydF9pbml0LmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2cmVzYW1wbGUvYXVkaW9fY29udmVydC5oIgorCisvKiBmbGF0IGNvbnZlcnNpb25zICovCisKK3ZvaWQgZmZfY29udl9zMTZfdG9fczMyX3NzZTIoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsIGludCBsZW4pOworCit2b2lkIGZmX2NvbnZfczE2X3RvX2ZsdF9zc2UyKGZsb2F0ICpkc3QsIGNvbnN0IGludDE2X3QgKnNyYywgaW50IGxlbik7Cit2b2lkIGZmX2NvbnZfczE2X3RvX2ZsdF9zc2U0KGZsb2F0ICpkc3QsIGNvbnN0IGludDE2X3QgKnNyYywgaW50IGxlbik7CisKK3ZvaWQgZmZfY29udl9zMzJfdG9fczE2X21teCAoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsIGludCBsZW4pOwordm9pZCBmZl9jb252X3MzMl90b19zMTZfc3NlMihpbnQxNl90ICpkc3QsIGNvbnN0IGludDMyX3QgKnNyYywgaW50IGxlbik7CisKK3ZvaWQgZmZfY29udl9zMzJfdG9fZmx0X3NzZTIoZmxvYXQgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLCBpbnQgbGVuKTsKK3ZvaWQgZmZfY29udl9zMzJfdG9fZmx0X2F2eCAoZmxvYXQgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLCBpbnQgbGVuKTsKKwordm9pZCBmZl9jb252X2ZsdF90b19zMTZfc3NlMihpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGludCBsZW4pOworCit2b2lkIGZmX2NvbnZfZmx0X3RvX3MzMl9zc2UyKGludDMyX3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgaW50IGxlbik7Cit2b2lkIGZmX2NvbnZfZmx0X3RvX3MzMl9hdnggKGludDMyX3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgaW50IGxlbik7CisKKy8qIGludGVybGVhdmUgY29udmVyc2lvbnMgKi8KKwordm9pZCBmZl9jb252X3MxNnBfdG9fczE2XzJjaF9zc2UyKGludDE2X3QgKmRzdCwgaW50MTZfdCAqY29uc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X3MxNnBfdG9fczE2XzJjaF9hdnggKGludDE2X3QgKmRzdCwgaW50MTZfdCAqY29uc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOworCit2b2lkIGZmX2NvbnZfczE2cF90b19zMTZfNmNoX3NzZTIoaW50MTZfdCAqZHN0LCBpbnQxNl90ICpjb25zdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBjaGFubmVscyk7Cit2b2lkIGZmX2NvbnZfczE2cF90b19zMTZfNmNoX3NzZTJzbG93KGludDE2X3QgKmRzdCwgaW50MTZfdCAqY29uc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKK3ZvaWQgZmZfY29udl9zMTZwX3RvX3MxNl82Y2hfYXZ4IChpbnQxNl90ICpkc3QsIGludDE2X3QgKmNvbnN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKKwordm9pZCBmZl9jb252X3MxNnBfdG9fZmx0XzJjaF9zc2UyKGZsb2F0ICpkc3QsIGludDE2X3QgKmNvbnN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKK3ZvaWQgZmZfY29udl9zMTZwX3RvX2ZsdF8yY2hfYXZ4IChmbG9hdCAqZHN0LCBpbnQxNl90ICpjb25zdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBjaGFubmVscyk7CisKK3ZvaWQgZmZfY29udl9zMTZwX3RvX2ZsdF82Y2hfc3NlMiAoZmxvYXQgKmRzdCwgaW50MTZfdCAqY29uc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKK3ZvaWQgZmZfY29udl9zMTZwX3RvX2ZsdF82Y2hfc3NzZTMoZmxvYXQgKmRzdCwgaW50MTZfdCAqY29uc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X3MxNnBfdG9fZmx0XzZjaF9hdnggIChmbG9hdCAqZHN0LCBpbnQxNl90ICpjb25zdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOworCit2b2lkIGZmX2NvbnZfZmx0cF90b19zMTZfMmNoX3NzZTIgKGludDE2X3QgKmRzdCwgZmxvYXQgKmNvbnN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBjaGFubmVscyk7Cit2b2lkIGZmX2NvbnZfZmx0cF90b19zMTZfMmNoX3Nzc2UzKGludDE2X3QgKmRzdCwgZmxvYXQgKmNvbnN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBjaGFubmVscyk7CisKK3ZvaWQgZmZfY29udl9mbHRwX3RvX3MxNl82Y2hfc3NlIChpbnQxNl90ICpkc3QsIGZsb2F0ICpjb25zdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBjaGFubmVscyk7Cit2b2lkIGZmX2NvbnZfZmx0cF90b19zMTZfNmNoX3NzZTIoaW50MTZfdCAqZHN0LCBmbG9hdCAqY29uc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X2ZsdHBfdG9fczE2XzZjaF9hdnggKGludDE2X3QgKmRzdCwgZmxvYXQgKmNvbnN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKKwordm9pZCBmZl9jb252X2ZsdHBfdG9fZmx0XzJjaF9zc2UoZmxvYXQgKmRzdCwgZmxvYXQgKmNvbnN0ICpzcmMsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X2ZsdHBfdG9fZmx0XzJjaF9hdngoZmxvYXQgKmRzdCwgZmxvYXQgKmNvbnN0ICpzcmMsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOworCit2b2lkIGZmX2NvbnZfZmx0cF90b19mbHRfNmNoX21teCAoZmxvYXQgKmRzdCwgZmxvYXQgKmNvbnN0ICpzcmMsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKTsKK3ZvaWQgZmZfY29udl9mbHRwX3RvX2ZsdF82Y2hfc3NlNChmbG9hdCAqZHN0LCBmbG9hdCAqY29uc3QgKnNyYywgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X2ZsdHBfdG9fZmx0XzZjaF9hdnggKGZsb2F0ICpkc3QsIGZsb2F0ICpjb25zdCAqc3JjLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyk7CisKKy8qIGRlaW50ZXJsZWF2ZSBjb252ZXJzaW9ucyAqLworCit2b2lkIGZmX2NvbnZfczE2X3RvX3MxNnBfMmNoX3NzZTIoaW50MTZfdCAqY29uc3QgKmRzdCwgaW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBjaGFubmVscyk7Cit2b2lkIGZmX2NvbnZfczE2X3RvX3MxNnBfMmNoX3Nzc2UzKGludDE2X3QgKmNvbnN0ICpkc3QsIGludDE2X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKK3ZvaWQgZmZfY29udl9zMTZfdG9fczE2cF8yY2hfYXZ4IChpbnQxNl90ICpjb25zdCAqZHN0LCBpbnQxNl90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKKwordm9pZCBmZl9jb252X3MxNl90b19zMTZwXzZjaF9zc2UyIChpbnQxNl90ICpjb25zdCAqZHN0LCBpbnQxNl90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBjaGFubmVscyk7Cit2b2lkIGZmX2NvbnZfczE2X3RvX3MxNnBfNmNoX3Nzc2UzKGludDE2X3QgKmNvbnN0ICpkc3QsIGludDE2X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKK3ZvaWQgZmZfY29udl9zMTZfdG9fczE2cF82Y2hfYXZ4ICAoaW50MTZfdCAqY29uc3QgKmRzdCwgaW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOworCit2b2lkIGZmX2NvbnZfczE2X3RvX2ZsdHBfMmNoX3NzZTIoZmxvYXQgKmNvbnN0ICpkc3QsIGludDE2X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X3MxNl90b19mbHRwXzJjaF9hdnggKGZsb2F0ICpjb25zdCAqZHN0LCBpbnQxNl90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKKwordm9pZCBmZl9jb252X3MxNl90b19mbHRwXzZjaF9zc2UyIChmbG9hdCAqY29uc3QgKmRzdCwgaW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X3MxNl90b19mbHRwXzZjaF9zc3NlMyhmbG9hdCAqY29uc3QgKmRzdCwgaW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X3MxNl90b19mbHRwXzZjaF9zc2U0IChmbG9hdCAqY29uc3QgKmRzdCwgaW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X3MxNl90b19mbHRwXzZjaF9hdnggIChmbG9hdCAqY29uc3QgKmRzdCwgaW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOworCit2b2lkIGZmX2NvbnZfZmx0X3RvX3MxNnBfMmNoX3NzZTIoaW50MTZfdCAqY29uc3QgKmRzdCwgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X2ZsdF90b19zMTZwXzJjaF9hdnggKGludDE2X3QgKmNvbnN0ICpkc3QsIGZsb2F0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKKwordm9pZCBmZl9jb252X2ZsdF90b19zMTZwXzZjaF9zc2UyIChpbnQxNl90ICpjb25zdCAqZHN0LCBmbG9hdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X2ZsdF90b19zMTZwXzZjaF9zc3NlMyhpbnQxNl90ICpjb25zdCAqZHN0LCBmbG9hdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X2ZsdF90b19zMTZwXzZjaF9hdnggIChpbnQxNl90ICpjb25zdCAqZHN0LCBmbG9hdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2hhbm5lbHMpOworCit2b2lkIGZmX2NvbnZfZmx0X3RvX2ZsdHBfMmNoX3NzZShmbG9hdCAqY29uc3QgKmRzdCwgZmxvYXQgKnNyYywgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyk7Cit2b2lkIGZmX2NvbnZfZmx0X3RvX2ZsdHBfMmNoX2F2eChmbG9hdCAqY29uc3QgKmRzdCwgZmxvYXQgKnNyYywgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyk7CisKK3ZvaWQgZmZfY29udl9mbHRfdG9fZmx0cF82Y2hfc3NlMihmbG9hdCAqY29uc3QgKmRzdCwgZmxvYXQgKnNyYywgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOwordm9pZCBmZl9jb252X2ZsdF90b19mbHRwXzZjaF9hdnggKGZsb2F0ICpjb25zdCAqZHN0LCBmbG9hdCAqc3JjLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyk7CisKK2F2X2NvbGQgdm9pZCBmZl9hdWRpb19jb252ZXJ0X2luaXRfeDg2KEF1ZGlvQ29udmVydCAqYWMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9TMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgOCwgIk1NWCIsIGZmX2NvbnZfczMyX3RvX3MxNl9tbXgpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDEsIDQsICJNTVgiLCBmZl9jb252X2ZsdHBfdG9fZmx0XzZjaF9tbXgpOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfU1NFKGNwdV9mbGFncykpIHsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAxLCAyLCAiU1NFIiwgZmZfY29udl9mbHRwX3RvX3MxNl82Y2hfc3NlKTsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9GTFQsIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAxNiwgOCwgIlNTRSIsIGZmX2NvbnZfZmx0cF90b19mbHRfMmNoX3NzZSk7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfRkxUUCwgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMTYsIDQsICJTU0UiLCBmZl9jb252X2ZsdF90b19mbHRwXzJjaF9zc2UpOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlmICghKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX1NTRTJTTE9XKSkgeworICAgICAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfUzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxNiwgMTYsICJTU0UyIiwgZmZfY29udl9zMzJfdG9fczE2X3NzZTIpOworICAgICAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfUzE2UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMTYsIDgsICJTU0UyIiwgZmZfY29udl9zMTZwX3RvX3MxNl82Y2hfc3NlMik7CisgICAgICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAxNiwgNCwgIlNTRTIiLCBmZl9jb252X2ZsdHBfdG9fczE2XzZjaF9zc2UyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDEsIDQsICJTU0UyU0xPVyIsIGZmX2NvbnZfczE2cF90b19zMTZfNmNoX3NzZTJzbG93KTsKKyAgICAgICAgfQorICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MzMiwgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMTYsIDgsICJTU0UyIiwgZmZfY29udl9zMTZfdG9fczMyX3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMTYsIDgsICJTU0UyIiwgZmZfY29udl9zMTZfdG9fZmx0X3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9TMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMTYsIDgsICJTU0UyIiwgZmZfY29udl9zMzJfdG9fZmx0X3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMTYsIDE2LCAiU1NFMiIsIGZmX2NvbnZfZmx0X3RvX3MxNl9zc2UyKTsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9TMzIsIEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDE2LCAxNiwgIlNTRTIiLCBmZl9jb252X2ZsdF90b19zMzJfc3NlMik7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMTYsIDE2LCAiU1NFMiIsIGZmX2NvbnZfczE2cF90b19zMTZfMmNoX3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDE2LCA4LCAiU1NFMiIsIGZmX2NvbnZfczE2cF90b19mbHRfMmNoX3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE2LCA0LCAiU1NFMiIsIGZmX2NvbnZfczE2cF90b19mbHRfNmNoX3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDE2LCA0LCAiU1NFMiIsIGZmX2NvbnZfZmx0cF90b19zMTZfMmNoX3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDE2LCA4LCAiU1NFMiIsIGZmX2NvbnZfczE2X3RvX3MxNnBfMmNoX3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE2LCA0LCAiU1NFMiIsIGZmX2NvbnZfczE2X3RvX3MxNnBfNmNoX3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDE2LCA4LCAiU1NFMiIsIGZmX2NvbnZfczE2X3RvX2ZsdHBfMmNoX3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE2LCA0LCAiU1NFMiIsIGZmX2NvbnZfczE2X3RvX2ZsdHBfNmNoX3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDE2LCA4LCAiU1NFMiIsIGZmX2NvbnZfZmx0X3RvX3MxNnBfMmNoX3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE2LCA0LCAiU1NFMiIsIGZmX2NvbnZfZmx0X3RvX3MxNnBfNmNoX3NzZTIpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE2LCA0LCAiU1NFMiIsIGZmX2NvbnZfZmx0X3RvX2ZsdHBfNmNoX3NzZTIpOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfU1NTRTMoY3B1X2ZsYWdzKSkgeworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE2LCA0LCAiU1NTRTMiLCBmZl9jb252X3MxNnBfdG9fZmx0XzZjaF9zc3NlMyk7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMTYsIDQsICJTU1NFMyIsIGZmX2NvbnZfZmx0cF90b19zMTZfMmNoX3Nzc2UzKTsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9TMTZQLCBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAxNiwgOCwgIlNTU0UzIiwgZmZfY29udl9zMTZfdG9fczE2cF8yY2hfc3NzZTMpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE2LCA0LCAiU1NTRTMiLCBmZl9jb252X3MxNl90b19zMTZwXzZjaF9zc3NlMyk7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfRkxUUCwgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMTYsIDQsICJTU1NFMyIsIGZmX2NvbnZfczE2X3RvX2ZsdHBfNmNoX3Nzc2UzKTsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9TMTZQLCBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAxNiwgNCwgIlNTU0UzIiwgZmZfY29udl9mbHRfdG9fczE2cF82Y2hfc3NzZTMpOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfU1NFNChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxNiwgOCwgIlNTRTQiLCBmZl9jb252X3MxNl90b19mbHRfc3NlNCk7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMTYsIDQsICJTU0U0IiwgZmZfY29udl9mbHRwX3RvX2ZsdF82Y2hfc3NlNCk7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkgeworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9TMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMzIsIDE2LCAiQVZYIiwgZmZfY29udl9zMzJfdG9fZmx0X2F2eCk7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfUzMyLCBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAzMiwgMzIsICJBVlgiLCBmZl9jb252X2ZsdF90b19zMzJfYXZ4KTsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfUzE2UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAxNiwgMTYsICJBVlgiLCBmZl9jb252X3MxNnBfdG9fczE2XzJjaF9hdngpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE2LCA4LCAiQVZYIiwgZmZfY29udl9zMTZwX3RvX3MxNl82Y2hfYXZ4KTsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9GTFQsIEFWX1NBTVBMRV9GTVRfUzE2UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAxNiwgOCwgIkFWWCIsIGZmX2NvbnZfczE2cF90b19mbHRfMmNoX2F2eCk7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMTYsIDQsICJBVlgiLCBmZl9jb252X3MxNnBfdG9fZmx0XzZjaF9hdngpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE2LCA0LCAiQVZYIiwgZmZfY29udl9mbHRwX3RvX3MxNl82Y2hfYXZ4KTsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9GTFQsIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAxNiwgNCwgIkFWWCIsIGZmX2NvbnZfZmx0cF90b19mbHRfNmNoX2F2eCk7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfUzE2UCwgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMTYsIDgsICJBVlgiLCBmZl9jb252X3MxNl90b19zMTZwXzJjaF9hdngpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE2LCA0LCAiQVZYIiwgZmZfY29udl9zMTZfdG9fczE2cF82Y2hfYXZ4KTsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9GTFRQLCBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAxNiwgOCwgIkFWWCIsIGZmX2NvbnZfczE2X3RvX2ZsdHBfMmNoX2F2eCk7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfRkxUUCwgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMTYsIDQsICJBVlgiLCBmZl9jb252X3MxNl90b19mbHRwXzZjaF9hdngpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDE2LCA4LCAiQVZYIiwgZmZfY29udl9mbHRfdG9fczE2cF8yY2hfYXZ4KTsKKyAgICAgICAgZmZfYXVkaW9fY29udmVydF9zZXRfZnVuYyhhYywgQVZfU0FNUExFX0ZNVF9TMTZQLCBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAxNiwgNCwgIkFWWCIsIGZmX2NvbnZfZmx0X3RvX3MxNnBfNmNoX2F2eCk7CisgICAgICAgIGZmX2F1ZGlvX2NvbnZlcnRfc2V0X2Z1bmMoYWMsIEFWX1NBTVBMRV9GTVRfRkxUUCwgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMTYsIDQsICJBVlgiLCBmZl9jb252X2ZsdF90b19mbHRwXzJjaF9hdngpOworICAgICAgICBmZl9hdWRpb19jb252ZXJ0X3NldF9mdW5jKGFjLCBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE2LCA0LCAiQVZYIiwgZmZfY29udl9mbHRfdG9fZmx0cF82Y2hfYXZ4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS94ODYvYXVkaW9fbWl4LmFzbSBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3g4Ni9hdWRpb19taXguYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YWIwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS94ODYvYXVkaW9fbWl4LmFzbQpAQCAtMCwwICsxLDUxMSBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2IG9wdGltaXplZCBjaGFubmVsIG1peGluZworOyogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKyVpbmNsdWRlICJ1dGlsLmFzbSIKKworU0VDVElPTl9URVhUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX21peF8yX3RvXzFfZmx0cF9mbHQoZmxvYXQgKipzcmMsIGZsb2F0ICoqbWF0cml4LCBpbnQgbGVuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gTUlYXzJfVE9fMV9GTFRQX0ZMVCAwCitjZ2xvYmFsIG1peF8yX3RvXzFfZmx0cF9mbHQsIDMsNCw2LCBzcmMsIG1hdHJpeCwgbGVuLCBzcmMxCisgICAgbW92ICAgICAgIHNyYzFxLCBbc3JjcStncHJzaXplXQorICAgIG1vdiAgICAgICAgc3JjcSwgW3NyY3EgICAgICAgIF0KKyAgICBzdWIgICAgICAgc3JjMXEsIHNyY3EKKyAgICBtb3YgICAgIG1hdHJpeHEsIFttYXRyaXhxICBdCisgICAgVkJST0FEQ0FTVFNTIG00LCBbbWF0cml4cSAgXQorICAgIFZCUk9BRENBU1RTUyBtNSwgW21hdHJpeHErNF0KKyAgICBBTElHTiAxNgorLmxvb3A6CisgICAgbXVscHMgICAgICAgIG0wLCBtNCwgW3NyY3EgICAgICAgICAgICAgXQorICAgIG11bHBzICAgICAgICBtMSwgbTUsIFtzcmNxK3NyYzFxICAgICAgIF0KKyAgICBtdWxwcyAgICAgICAgbTIsIG00LCBbc3JjcSsgICAgICBtbXNpemVdCisgICAgbXVscHMgICAgICAgIG0zLCBtNSwgW3NyY3Erc3JjMXErbW1zaXplXQorICAgIGFkZHBzICAgICAgICBtMCwgbTAsIG0xCisgICAgYWRkcHMgICAgICAgIG0yLCBtMiwgbTMKKyAgICBtb3ZhICBbc3JjcSAgICAgICBdLCBtMAorICAgIG1vdmEgIFtzcmNxK21tc2l6ZV0sIG0yCisgICAgYWRkICAgICAgICBzcmNxLCBtbXNpemUqMgorICAgIHN1YiAgICAgICAgbGVuZCwgbW1zaXplKjIvNAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZQorTUlYXzJfVE9fMV9GTFRQX0ZMVAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1lNTSBhdngKK01JWF8yX1RPXzFfRkxUUF9GTFQKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9taXhfMl90b18xX3MxNnBfZmx0KGludDE2X3QgKipzcmMsIGZsb2F0ICoqbWF0cml4LCBpbnQgbGVuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gTUlYXzJfVE9fMV9TMTZQX0ZMVCAwCitjZ2xvYmFsIG1peF8yX3RvXzFfczE2cF9mbHQsIDMsNCw2LCBzcmMsIG1hdHJpeCwgbGVuLCBzcmMxCisgICAgbW92ICAgICAgIHNyYzFxLCBbc3JjcStncHJzaXplXQorICAgIG1vdiAgICAgICAgc3JjcSwgW3NyY3FdCisgICAgc3ViICAgICAgIHNyYzFxLCBzcmNxCisgICAgbW92ICAgICBtYXRyaXhxLCBbbWF0cml4cSAgXQorICAgIFZCUk9BRENBU1RTUyBtNCwgW21hdHJpeHEgIF0KKyAgICBWQlJPQURDQVNUU1MgbTUsIFttYXRyaXhxKzRdCisgICAgQUxJR04gMTYKKy5sb29wOgorICAgIG1vdmEgICAgICAgICBtMCwgW3NyY3EgICAgICBdCisgICAgbW92YSAgICAgICAgIG0yLCBbc3JjcStzcmMxcV0KKyAgICBTMTZfVE9fUzMyX1NYIDAsIDEKKyAgICBTMTZfVE9fUzMyX1NYIDIsIDMKKyAgICBjdnRkcTJwcyAgICAgbTAsIG0wCisgICAgY3Z0ZHEycHMgICAgIG0xLCBtMQorICAgIGN2dGRxMnBzICAgICBtMiwgbTIKKyAgICBjdnRkcTJwcyAgICAgbTMsIG0zCisgICAgbXVscHMgICAgICAgIG0wLCBtNAorICAgIG11bHBzICAgICAgICBtMSwgbTQKKyAgICBtdWxwcyAgICAgICAgbTIsIG01CisgICAgbXVscHMgICAgICAgIG0zLCBtNQorICAgIGFkZHBzICAgICAgICBtMCwgbTIKKyAgICBhZGRwcyAgICAgICAgbTEsIG0zCisgICAgY3Z0cHMyZHEgICAgIG0wLCBtMAorICAgIGN2dHBzMmRxICAgICBtMSwgbTEKKyAgICBwYWNrc3NkdyAgICAgbTAsIG0xCisgICAgbW92YSAgICAgW3NyY3FdLCBtMAorICAgIGFkZCAgICAgICAgc3JjcSwgbW1zaXplCisgICAgc3ViICAgICAgICBsZW5kLCBtbXNpemUvMgorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK01JWF8yX1RPXzFfUzE2UF9GTFQKK0lOSVRfWE1NIHNzZTQKK01JWF8yX1RPXzFfUzE2UF9GTFQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfbWl4XzJfdG9fMV9zMTZwX3E4KGludDE2X3QgKipzcmMsIGludDE2X3QgKiptYXRyaXgsIGludCBsZW4sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfY2gsIGludCBpbl9jaCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBtaXhfMl90b18xX3MxNnBfcTgsIDMsNCw2LCBzcmMsIG1hdHJpeCwgbGVuLCBzcmMxCisgICAgbW92ICAgICAgIHNyYzFxLCBbc3JjcStncHJzaXplXQorICAgIG1vdiAgICAgICAgc3JjcSwgW3NyY3FdCisgICAgc3ViICAgICAgIHNyYzFxLCBzcmNxCisgICAgbW92ICAgICBtYXRyaXhxLCBbbWF0cml4cV0KKyAgICBtb3ZkICAgICAgICAgbTQsIFttYXRyaXhxXQorICAgIG1vdmQgICAgICAgICBtNSwgW21hdHJpeHFdCisgICAgU1BMQVRXICAgICAgIG00LCBtNCwgMAorICAgIFNQTEFUVyAgICAgICBtNSwgbTUsIDEKKyAgICBweG9yICAgICAgICAgbTAsIG0wCisgICAgcHVucGNrbHdkICAgIG00LCBtMAorICAgIHB1bnBja2x3ZCAgICBtNSwgbTAKKyAgICBBTElHTiAxNgorLmxvb3A6CisgICAgbW92YSAgICAgICAgIG0wLCBbc3JjcSAgICAgIF0KKyAgICBtb3ZhICAgICAgICAgbTIsIFtzcmNxK3NyYzFxXQorICAgIHB1bnBja2h3ZCAgICBtMSwgbTAsIG0wCisgICAgcHVucGNrbHdkICAgIG0wLCBtMAorICAgIHB1bnBja2h3ZCAgICBtMywgbTIsIG0yCisgICAgcHVucGNrbHdkICAgIG0yLCBtMgorICAgIHBtYWRkd2QgICAgICBtMCwgbTQKKyAgICBwbWFkZHdkICAgICAgbTEsIG00CisgICAgcG1hZGR3ZCAgICAgIG0yLCBtNQorICAgIHBtYWRkd2QgICAgICBtMywgbTUKKyAgICBwYWRkZCAgICAgICAgbTAsIG0yCisgICAgcGFkZGQgICAgICAgIG0xLCBtMworICAgIHBzcmFkICAgICAgICBtMCwgOAorICAgIHBzcmFkICAgICAgICBtMSwgOAorICAgIHBhY2tzc2R3ICAgICBtMCwgbTEKKyAgICBtb3ZhICAgICBbc3JjcV0sIG0wCisgICAgYWRkICAgICAgICBzcmNxLCBtbXNpemUKKyAgICBzdWIgICAgICAgIGxlbmQsIG1tc2l6ZS8yCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX21peF8xX3RvXzJfZmx0cF9mbHQoZmxvYXQgKipzcmMsIGZsb2F0ICoqbWF0cml4LCBpbnQgbGVuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gTUlYXzFfVE9fMl9GTFRQX0ZMVCAwCitjZ2xvYmFsIG1peF8xX3RvXzJfZmx0cF9mbHQsIDMsNSw0LCBzcmMwLCBtYXRyaXgwLCBsZW4sIHNyYzEsIG1hdHJpeDEKKyAgICBtb3YgICAgICAgc3JjMXEsIFtzcmMwcStncHJzaXplXQorICAgIG1vdiAgICAgICBzcmMwcSwgW3NyYzBxXQorICAgIHN1YiAgICAgICBzcmMxcSwgc3JjMHEKKyAgICBtb3YgICAgbWF0cml4MXEsIFttYXRyaXgwcStncHJzaXplXQorICAgIG1vdiAgICBtYXRyaXgwcSwgW21hdHJpeDBxXQorICAgIFZCUk9BRENBU1RTUyBtMiwgW21hdHJpeDBxXQorICAgIFZCUk9BRENBU1RTUyBtMywgW21hdHJpeDFxXQorICAgIEFMSUdOIDE2CisubG9vcDoKKyAgICBtb3ZhICAgICAgICAgbTAsIFtzcmMwcV0KKyAgICBtdWxwcyAgICAgICAgbTEsIG0wLCBtMworICAgIG11bHBzICAgICAgICBtMCwgbTAsIG0yCisgICAgbW92YSAgW3NyYzBxICAgICAgXSwgbTAKKyAgICBtb3ZhICBbc3JjMHErc3JjMXFdLCBtMQorICAgIGFkZCAgICAgICBzcmMwcSwgbW1zaXplCisgICAgc3ViICAgICAgICBsZW5kLCBtbXNpemUvNAorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZQorTUlYXzFfVE9fMl9GTFRQX0ZMVAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1lNTSBhdngKK01JWF8xX1RPXzJfRkxUUF9GTFQKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9taXhfMV90b18yX3MxNnBfZmx0KGludDE2X3QgKipzcmMsIGZsb2F0ICoqbWF0cml4LCBpbnQgbGVuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gTUlYXzFfVE9fMl9TMTZQX0ZMVCAwCitjZ2xvYmFsIG1peF8xX3RvXzJfczE2cF9mbHQsIDMsNSw2LCBzcmMwLCBtYXRyaXgwLCBsZW4sIHNyYzEsIG1hdHJpeDEKKyAgICBtb3YgICAgICAgc3JjMXEsIFtzcmMwcStncHJzaXplXQorICAgIG1vdiAgICAgICBzcmMwcSwgW3NyYzBxXQorICAgIHN1YiAgICAgICBzcmMxcSwgc3JjMHEKKyAgICBtb3YgICAgbWF0cml4MXEsIFttYXRyaXgwcStncHJzaXplXQorICAgIG1vdiAgICBtYXRyaXgwcSwgW21hdHJpeDBxXQorICAgIFZCUk9BRENBU1RTUyBtNCwgW21hdHJpeDBxXQorICAgIFZCUk9BRENBU1RTUyBtNSwgW21hdHJpeDFxXQorICAgIEFMSUdOIDE2CisubG9vcDoKKyAgICBtb3ZhICAgICAgICAgbTAsIFtzcmMwcV0KKyAgICBTMTZfVE9fUzMyX1NYIDAsIDIKKyAgICBjdnRkcTJwcyAgICAgbTAsIG0wCisgICAgY3Z0ZHEycHMgICAgIG0yLCBtMgorICAgIG11bHBzICAgICAgICBtMSwgbTAsIG01CisgICAgbXVscHMgICAgICAgIG0wLCBtMCwgbTQKKyAgICBtdWxwcyAgICAgICAgbTMsIG0yLCBtNQorICAgIG11bHBzICAgICAgICBtMiwgbTIsIG00CisgICAgY3Z0cHMyZHEgICAgIG0wLCBtMAorICAgIGN2dHBzMmRxICAgICBtMSwgbTEKKyAgICBjdnRwczJkcSAgICAgbTIsIG0yCisgICAgY3Z0cHMyZHEgICAgIG0zLCBtMworICAgIHBhY2tzc2R3ICAgICBtMCwgbTIKKyAgICBwYWNrc3NkdyAgICAgbTEsIG0zCisgICAgbW92YSAgW3NyYzBxICAgICAgXSwgbTAKKyAgICBtb3ZhICBbc3JjMHErc3JjMXFdLCBtMQorICAgIGFkZCAgICAgICBzcmMwcSwgbW1zaXplCisgICAgc3ViICAgICAgICBsZW5kLCBtbXNpemUvMgorICAgIGpnIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK01JWF8xX1RPXzJfUzE2UF9GTFQKK0lOSVRfWE1NIHNzZTQKK01JWF8xX1RPXzJfUzE2UF9GTFQKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitNSVhfMV9UT18yX1MxNlBfRkxUCislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfbWl4XzNfOF90b18xXzJfZmx0cC9zMTZwX2ZsdChmbG9hdC9pbnQxNl90ICoqc3JjLCBmbG9hdCAqKm1hdHJpeCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBvdXRfY2gsIGludCBpbl9jaCk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIE1JWF8zXzhfVE9fMV8yX0ZMVCAzIDsgJTEgPSBpbiBjaGFubmVscywgJTIgPSBvdXQgY2hhbm5lbHMsICUzID0gczE2cCBvciBmbHRwCis7IGRlZmluZSBzb21lIG5hbWVzIHRvIG1ha2UgdGhlIGNvZGUgY2xlYXJlcgorJWFzc2lnbiAgaW5fY2hhbm5lbHMgJTEKKyVhc3NpZ24gb3V0X2NoYW5uZWxzICUyCislYXNzaWduIHN0ZXJlbyBvdXRfY2hhbm5lbHMgLSAxCislaWZpZG4gJTMsIHMxNnAKKyAgICAlYXNzaWduIGlzX3MxNiAxCislZWxzZQorICAgICVhc3NpZ24gaXNfczE2IDAKKyVlbmRpZgorCis7IGRldGVybWluZSBob3cgbWFueSBtYXRyaXggZWxlbWVudHMgbXVzdCBnbyBvbiB0aGUgc3RhY2sgdnMuIG1tcmVncworJWFzc2lnbiBtYXRyaXhfZWxlbWVudHMgaW5fY2hhbm5lbHMgKiBvdXRfY2hhbm5lbHMKKyVpZiBpc19zMTYKKyAgICAlaWYgc3RlcmVvCisgICAgICAgICVhc3NpZ24gbmVlZGVkX21tcmVncyA3CisgICAgJWVsc2UKKyAgICAgICAgJWFzc2lnbiBuZWVkZWRfbW1yZWdzIDUKKyAgICAlZW5kaWYKKyVlbHNlCisgICAgJWlmIHN0ZXJlbworICAgICAgICAlYXNzaWduIG5lZWRlZF9tbXJlZ3MgNAorICAgICVlbHNlCisgICAgICAgICVhc3NpZ24gbmVlZGVkX21tcmVncyAzCisgICAgJWVuZGlmCislZW5kaWYKKyVhc3NpZ24gbWF0cml4X2VsZW1lbnRzX21tIG51bV9tbXJlZ3MgLSBuZWVkZWRfbW1yZWdzCislaWYgbWF0cml4X2VsZW1lbnRzIDwgbWF0cml4X2VsZW1lbnRzX21tCisgICAgJWFzc2lnbiBtYXRyaXhfZWxlbWVudHNfbW0gbWF0cml4X2VsZW1lbnRzCislZW5kaWYKKyVpZiBtYXRyaXhfZWxlbWVudHNfbW0gPCBtYXRyaXhfZWxlbWVudHMKKyAgICAlYXNzaWduIG1hdHJpeF9lbGVtZW50c19zdGFjayBtYXRyaXhfZWxlbWVudHMgLSBtYXRyaXhfZWxlbWVudHNfbW0KKyVlbHNlCisgICAgJWFzc2lnbiBtYXRyaXhfZWxlbWVudHNfc3RhY2sgMAorJWVuZGlmCislYXNzaWduIG1hdHJpeF9zdGFja19zaXplIG1hdHJpeF9lbGVtZW50c19zdGFjayAqIG1tc2l6ZQorCislYXNzaWduIG5lZWRlZF9zdGFja19zaXplIC0xICogbWF0cml4X3N0YWNrX3NpemUKKyVpZiBBUkNIX1g4Nl8zMiAmJiBpbl9jaGFubmVscyA+PSA3CislYXNzaWduIG5lZWRlZF9zdGFja19zaXplIG5lZWRlZF9zdGFja19zaXplIC0gMTYKKyVlbmRpZgorCitjZ2xvYmFsIG1peF8lMV90b18lMl8lM19mbHQsIDMsaW5fY2hhbm5lbHMrMixuZWVkZWRfbW1yZWdzK21hdHJpeF9lbGVtZW50c19tbSwgbmVlZGVkX3N0YWNrX3NpemUsIHNyYzAsIHNyYzEsIGxlbiwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNworCis7IGRlZmluZSBzcmMgcG9pbnRlcnMgb24gc3RhY2sgaWYgbmVlZGVkCislaWYgbWF0cml4X2VsZW1lbnRzX3N0YWNrID4gMCAmJiBBUkNIX1g4Nl8zMiAmJiBpbl9jaGFubmVscyA+PSA3CisgICAgJWRlZmluZSBzcmM1bSBbcnNwK21hdHJpeF9zdGFja19zaXplKzBdCisgICAgJWRlZmluZSBzcmM2bSBbcnNwK21hdHJpeF9zdGFja19zaXplKzRdCisgICAgJWRlZmluZSBzcmM3bSBbcnNwK21hdHJpeF9zdGFja19zaXplKzhdCislZW5kaWYKKworOyBsb2FkIG1hdHJpeCBwb2ludGVycworJWRlZmluZSBtYXRyaXgwcSByMXEKKyVkZWZpbmUgbWF0cml4MXEgcjNxCislaWYgc3RlcmVvCisgICAgbW92ICAgICAgbWF0cml4MXEsIFttYXRyaXgwcStncHJzaXplXQorJWVuZGlmCisgICAgbW92ICAgICAgbWF0cml4MHEsIFttYXRyaXgwcV0KKworOyBkZWZpbmUgbWF0cml4IGNvZWZmIG5hbWVzCislYXNzaWduICUlaSAwCislYXNzaWduICUlaiBuZWVkZWRfbW1yZWdzCislcmVwIGluX2NoYW5uZWxzCisgICAgJWlmICUlaSA+PSBtYXRyaXhfZWxlbWVudHNfbW0KKyAgICAgICAgQ0FUX1hERUZJTkUgbXhfc3RhY2tfMF8sICUlaSwgMQorICAgICAgICBDQVRfWERFRklORSBteF8wXywgJSVpLCBbcnNwKyglJWktbWF0cml4X2VsZW1lbnRzX21tKSptbXNpemVdCisgICAgJWVsc2UKKyAgICAgICAgQ0FUX1hERUZJTkUgbXhfc3RhY2tfMF8sICUlaSwgMAorICAgICAgICBDQVRfWERFRklORSBteF8wXywgJSVpLCBtICUrICUlagorICAgICAgICAlYXNzaWduICUlaiAlJWorMQorICAgICVlbmRpZgorICAgICVhc3NpZ24gJSVpICUlaSsxCislZW5kcmVwCislaWYgc3RlcmVvCislYXNzaWduICUlaSAwCislcmVwIGluX2NoYW5uZWxzCisgICAgJWlmIGluX2NoYW5uZWxzICsgJSVpID49IG1hdHJpeF9lbGVtZW50c19tbQorICAgICAgICBDQVRfWERFRklORSBteF9zdGFja18xXywgJSVpLCAxCisgICAgICAgIENBVF9YREVGSU5FIG14XzFfLCAlJWksIFtyc3ArKGluX2NoYW5uZWxzKyUlaS1tYXRyaXhfZWxlbWVudHNfbW0pKm1tc2l6ZV0KKyAgICAlZWxzZQorICAgICAgICBDQVRfWERFRklORSBteF9zdGFja18xXywgJSVpLCAwCisgICAgICAgIENBVF9YREVGSU5FIG14XzFfLCAlJWksIG0gJSsgJSVqCisgICAgICAgICVhc3NpZ24gJSVqICUlaisxCisgICAgJWVuZGlmCisgICAgJWFzc2lnbiAlJWkgJSVpKzEKKyVlbmRyZXAKKyVlbmRpZgorCis7IGxvYWQvc3BsYXQgbWF0cml4IGNvZWZmcworJWFzc2lnbiAlJWkgMAorJXJlcCBpbl9jaGFubmVscworICAgICVpZiBteF9zdGFja18wXyAlKyAlJWkKKyAgICAgICAgVkJST0FEQ0FTVFNTIG0wLCBbbWF0cml4MHErNColJWldCisgICAgICAgIG1vdmEgIG14XzBfICUrICUlaSwgbTAKKyAgICAlZWxzZQorICAgICAgICBWQlJPQURDQVNUU1MgbXhfMF8gJSsgJSVpLCBbbWF0cml4MHErNColJWldCisgICAgJWVuZGlmCisgICAgJWlmIHN0ZXJlbworICAgICVpZiBteF9zdGFja18xXyAlKyAlJWkKKyAgICAgICAgVkJST0FEQ0FTVFNTIG0wLCBbbWF0cml4MXErNColJWldCisgICAgICAgIG1vdmEgIG14XzFfICUrICUlaSwgbTAKKyAgICAlZWxzZQorICAgICAgICBWQlJPQURDQVNUU1MgbXhfMV8gJSsgJSVpLCBbbWF0cml4MXErNColJWldCisgICAgJWVuZGlmCisgICAgJWVuZGlmCisgICAgJWFzc2lnbiAlJWkgJSVpKzEKKyVlbmRyZXAKKworOyBsb2FkIGNoYW5uZWwgcG9pbnRlcnMgdG8gcmVnaXN0ZXJzIGFzIG9mZnNldHMgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbCBwb2ludGVyCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgbGVucSwgcjJkCislZW5kaWYKKyAgICBzaGwgICAgICAgICAgbGVucSwgMi1pc19zMTYKKyVhc3NpZ24gJSVpIDEKKyVyZXAgKGluX2NoYW5uZWxzIC0gMSkKKyAgICAlaWYgQVJDSF9YODZfMzIgJiYgaW5fY2hhbm5lbHMgPj0gNyAmJiAlJWkgPj0gNQorICAgIG1vdiAgICAgICAgIHNyYzVxLCBbc3JjMHErJSVpKmdwcnNpemVdCisgICAgYWRkICAgICAgICAgc3JjNXEsIGxlbnEKKyAgICBtb3YgICAgICAgICBzcmMgJSsgJSVpICUrIG0sIHNyYzVxCisgICAgJWVsc2UKKyAgICBtb3YgICAgICAgICBzcmMgJSsgJSVpICUrIHEsIFtzcmMwcSslJWkqZ3Byc2l6ZV0KKyAgICBhZGQgICAgICAgICBzcmMgJSsgJSVpICUrIHEsIGxlbnEKKyAgICAlZW5kaWYKKyAgICAlYXNzaWduICUlaSAlJWkrMQorJWVuZHJlcAorICAgIG1vdiAgICAgICAgIHNyYzBxLCBbc3JjMHFdCisgICAgYWRkICAgICAgICAgc3JjMHEsIGxlbnEKKyAgICBuZWcgICAgICAgICAgbGVucQorLmxvb3A6Cis7IGZvciB4ODYtMzIgd2l0aCA3LTggY2hhbm5lbHMgd2UgZG8gbm90IGhhdmUgZW5vdWdoIGdwIHJlZ2lzdGVycyBmb3IgYWxsIHNyYworOyBwb2ludGVycywgc28gd2UgaGF2ZSB0byBsb2FkIHNvbWUgb2YgdGhlbSBmcm9tIHRoZSBzdGFjayBlYWNoIHRpbWUKKyVkZWZpbmUgY29weV9zcmNfZnJvbV9zdGFjayBBUkNIX1g4Nl8zMiAmJiBpbl9jaGFubmVscyA+PSA3ICYmICUlaSA+PSA1CislaWYgaXNfczE2CisgICAgOyBtaXggd2l0aCBzMTZwIGlucHV0CisgICAgbW92YSAgICAgICAgICAgbTAsIFtzcmMwcStsZW5xXQorICAgIFMxNl9UT19TMzJfU1ggICAwLCAxCisgICAgY3Z0ZHEycHMgICAgICAgbTAsIG0wCisgICAgY3Z0ZHEycHMgICAgICAgbTEsIG0xCisgICAgJWlmIHN0ZXJlbworICAgIG11bHBzICAgICAgICAgIG0yLCBtMCwgbXhfMV8wCisgICAgbXVscHMgICAgICAgICAgbTMsIG0xLCBteF8xXzAKKyAgICAlZW5kaWYKKyAgICBtdWxwcyAgICAgICAgICBtMCwgbTAsIG14XzBfMAorICAgIG11bHBzICAgICAgICAgIG0xLCBtMSwgbXhfMF8wCislYXNzaWduICUlaSAxCislcmVwIChpbl9jaGFubmVscyAtIDEpCisgICAgJWlmIGNvcHlfc3JjX2Zyb21fc3RhY2sKKyAgICAgICAgJWRlZmluZSBzcmNfcHRyIHNyYzVxCisgICAgJWVsc2UKKyAgICAgICAgJWRlZmluZSBzcmNfcHRyIHNyYyAlKyAlJWkgJSsgcQorICAgICVlbmRpZgorICAgICVpZiBzdGVyZW8KKyAgICAlaWYgY29weV9zcmNfZnJvbV9zdGFjaworICAgIG1vdiAgICAgICBzcmNfcHRyLCBzcmMgJSsgJSVpICUrIG0KKyAgICAlZW5kaWYKKyAgICBtb3ZhICAgICAgICAgICBtNCwgW3NyY19wdHIrbGVucV0KKyAgICBTMTZfVE9fUzMyX1NYICAgNCwgNQorICAgIGN2dGRxMnBzICAgICAgIG00LCBtNAorICAgIGN2dGRxMnBzICAgICAgIG01LCBtNQorICAgIEZNVUxBRERfUFMgICAgIG0yLCBtNCwgbXhfMV8gJSsgJSVpLCBtMiwgbTYKKyAgICBGTVVMQUREX1BTICAgICBtMywgbTUsIG14XzFfICUrICUlaSwgbTMsIG02CisgICAgRk1VTEFERF9QUyAgICAgbTAsIG00LCBteF8wXyAlKyAlJWksIG0wLCBtNAorICAgIEZNVUxBRERfUFMgICAgIG0xLCBtNSwgbXhfMF8gJSsgJSVpLCBtMSwgbTUKKyAgICAlZWxzZQorICAgICVpZiBjb3B5X3NyY19mcm9tX3N0YWNrCisgICAgbW92ICAgICAgIHNyY19wdHIsIHNyYyAlKyAlJWkgJSsgbQorICAgICVlbmRpZgorICAgIG1vdmEgICAgICAgICAgIG0yLCBbc3JjX3B0citsZW5xXQorICAgIFMxNl9UT19TMzJfU1ggICAyLCAzCisgICAgY3Z0ZHEycHMgICAgICAgbTIsIG0yCisgICAgY3Z0ZHEycHMgICAgICAgbTMsIG0zCisgICAgRk1VTEFERF9QUyAgICAgbTAsIG0yLCBteF8wXyAlKyAlJWksIG0wLCBtNAorICAgIEZNVUxBRERfUFMgICAgIG0xLCBtMywgbXhfMF8gJSsgJSVpLCBtMSwgbTQKKyAgICAlZW5kaWYKKyAgICAlYXNzaWduICUlaSAlJWkrMQorJWVuZHJlcAorICAgICVpZiBzdGVyZW8KKyAgICBjdnRwczJkcSAgICAgICBtMiwgbTIKKyAgICBjdnRwczJkcSAgICAgICBtMywgbTMKKyAgICBwYWNrc3NkdyAgICAgICBtMiwgbTMKKyAgICBtb3ZhIFtzcmMxcStsZW5xXSwgbTIKKyAgICAlZW5kaWYKKyAgICBjdnRwczJkcSAgICAgICBtMCwgbTAKKyAgICBjdnRwczJkcSAgICAgICBtMSwgbTEKKyAgICBwYWNrc3NkdyAgICAgICBtMCwgbTEKKyAgICBtb3ZhIFtzcmMwcStsZW5xXSwgbTAKKyVlbHNlCisgICAgOyBtaXggd2l0aCBmbHRwIGlucHV0CisgICAgJWlmIHN0ZXJlbyB8fCBteF9zdGFja18wXzAKKyAgICBtb3ZhICAgICAgICAgICBtMCwgW3NyYzBxK2xlbnFdCisgICAgJWVuZGlmCisgICAgJWlmIHN0ZXJlbworICAgIG11bHBzICAgICAgICAgIG0xLCBtMCwgbXhfMV8wCisgICAgJWVuZGlmCisgICAgJWlmIHN0ZXJlbyB8fCBteF9zdGFja18wXzAKKyAgICBtdWxwcyAgICAgICAgICBtMCwgbTAsIG14XzBfMAorICAgICVlbHNlCisgICAgbXVscHMgICAgICAgICAgbTAsIG14XzBfMCwgW3NyYzBxK2xlbnFdCisgICAgJWVuZGlmCislYXNzaWduICUlaSAxCislcmVwIChpbl9jaGFubmVscyAtIDEpCisgICAgJWlmIGNvcHlfc3JjX2Zyb21fc3RhY2sKKyAgICAgICAgJWRlZmluZSBzcmNfcHRyIHNyYzVxCisgICAgICAgIG1vdiAgIHNyY19wdHIsIHNyYyAlKyAlJWkgJSsgbQorICAgICVlbHNlCisgICAgICAgICVkZWZpbmUgc3JjX3B0ciBzcmMgJSsgJSVpICUrIHEKKyAgICAlZW5kaWYKKyAgICA7IGF2b2lkIGV4dHJhIGxvYWQgZm9yIG1vbm8gaWYgbWF0cml4IGlzIGluIGEgbW0gcmVnaXN0ZXIKKyAgICAlaWYgc3RlcmVvIHx8IG14X3N0YWNrXzBfICUrICUlaQorICAgIG1vdmEgICAgICAgICAgIG0yLCBbc3JjX3B0citsZW5xXQorICAgICVlbmRpZgorICAgICVpZiBzdGVyZW8KKyAgICBGTVVMQUREX1BTICAgICBtMSwgbTIsIG14XzFfICUrICUlaSwgbTEsIG0zCisgICAgJWVuZGlmCisgICAgJWlmIHN0ZXJlbyB8fCBteF9zdGFja18wXyAlKyAlJWkKKyAgICBGTVVMQUREX1BTICAgICBtMCwgbTIsIG14XzBfICUrICUlaSwgbTAsIG0yCisgICAgJWVsc2UKKyAgICBGTVVMQUREX1BTICAgICBtMCwgbXhfMF8gJSsgJSVpLCBbc3JjX3B0citsZW5xXSwgbTAsIG0xCisgICAgJWVuZGlmCisgICAgJWFzc2lnbiAlJWkgJSVpKzEKKyVlbmRyZXAKKyAgICBtb3ZhIFtzcmMwcStsZW5xXSwgbTAKKyAgICAlaWYgc3RlcmVvCisgICAgbW92YSBbc3JjMXErbGVucV0sIG0xCisgICAgJWVuZGlmCislZW5kaWYKKworICAgIGFkZCAgICAgICAgICBsZW5xLCBtbXNpemUKKyAgICBqbCAubG9vcAorOyB6ZXJvIHltbSBoaWdoIGhhbHZlcworJWlmIG1tc2l6ZSA9PSAzMgorICAgIHZ6ZXJvdXBwZXIKKyVlbmRpZgorICAgIFJFVAorJWVuZG1hY3JvCisKKyVtYWNybyBNSVhfM184X1RPXzFfMl9GTFRfRlVOQ1MgMAorJWFzc2lnbiAlJWkgMworJXJlcCA2CisgICAgSU5JVF9YTU0gc3NlCisgICAgTUlYXzNfOF9UT18xXzJfRkxUICUlaSwgMSwgZmx0cAorICAgIE1JWF8zXzhfVE9fMV8yX0ZMVCAlJWksIDIsIGZsdHAKKyAgICBJTklUX1hNTSBzc2UyCisgICAgTUlYXzNfOF9UT18xXzJfRkxUICUlaSwgMSwgczE2cAorICAgIE1JWF8zXzhfVE9fMV8yX0ZMVCAlJWksIDIsIHMxNnAKKyAgICBJTklUX1hNTSBzc2U0CisgICAgTUlYXzNfOF9UT18xXzJfRkxUICUlaSwgMSwgczE2cAorICAgIE1JWF8zXzhfVE9fMV8yX0ZMVCAlJWksIDIsIHMxNnAKKyAgICA7IGRvIG5vdCB1c2UgeW1tIEFWWCBvciBGTUE0IGluIHg4Ni0zMiBmb3IgNiBvciBtb3JlIGNoYW5uZWxzIGR1ZSB0byBzdGFjayBhbGlnbm1lbnQgaXNzdWVzCisgICAgJWlmIEhBVkVfQVZYX0VYVEVSTkFMCisgICAgJWlmIEFSQ0hfWDg2XzY0IHx8ICUlaSA8IDYKKyAgICBJTklUX1lNTSBhdngKKyAgICAlZWxzZQorICAgIElOSVRfWE1NIGF2eAorICAgICVlbmRpZgorICAgIE1JWF8zXzhfVE9fMV8yX0ZMVCAlJWksIDEsIGZsdHAKKyAgICBNSVhfM184X1RPXzFfMl9GTFQgJSVpLCAyLCBmbHRwCisgICAgSU5JVF9YTU0gYXZ4CisgICAgTUlYXzNfOF9UT18xXzJfRkxUICUlaSwgMSwgczE2cAorICAgIE1JWF8zXzhfVE9fMV8yX0ZMVCAlJWksIDIsIHMxNnAKKyAgICAlZW5kaWYKKyAgICAlaWYgSEFWRV9GTUE0X0VYVEVSTkFMCisgICAgJWlmIEFSQ0hfWDg2XzY0IHx8ICUlaSA8IDYKKyAgICBJTklUX1lNTSBmbWE0CisgICAgJWVsc2UKKyAgICBJTklUX1hNTSBmbWE0CisgICAgJWVuZGlmCisgICAgTUlYXzNfOF9UT18xXzJfRkxUICUlaSwgMSwgZmx0cAorICAgIE1JWF8zXzhfVE9fMV8yX0ZMVCAlJWksIDIsIGZsdHAKKyAgICBJTklUX1hNTSBmbWE0CisgICAgTUlYXzNfOF9UT18xXzJfRkxUICUlaSwgMSwgczE2cAorICAgIE1JWF8zXzhfVE9fMV8yX0ZMVCAlJWksIDIsIHMxNnAKKyAgICAlZW5kaWYKKyAgICAlYXNzaWduICUlaSAlJWkrMQorJWVuZHJlcAorJWVuZG1hY3JvCisKK01JWF8zXzhfVE9fMV8yX0ZMVF9GVU5DUwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUveDg2L2F1ZGlvX21peF9pbml0LmMgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS94ODYvYXVkaW9fbWl4X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA1ZWVlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUveDg2L2F1ZGlvX21peF9pbml0LmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2cmVzYW1wbGUvYXVkaW9fbWl4LmgiCisKK3ZvaWQgZmZfbWl4XzJfdG9fMV9mbHRwX2ZsdF9zc2UoZmxvYXQgKipzcmMsIGZsb2F0ICoqbWF0cml4LCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpOwordm9pZCBmZl9taXhfMl90b18xX2ZsdHBfZmx0X2F2eChmbG9hdCAqKnNyYywgZmxvYXQgKiptYXRyaXgsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfY2gsIGludCBpbl9jaCk7CisKK3ZvaWQgZmZfbWl4XzJfdG9fMV9zMTZwX2ZsdF9zc2UyKGludDE2X3QgKipzcmMsIGZsb2F0ICoqbWF0cml4LCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsKK3ZvaWQgZmZfbWl4XzJfdG9fMV9zMTZwX2ZsdF9zc2U0KGludDE2X3QgKipzcmMsIGZsb2F0ICoqbWF0cml4LCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsKKwordm9pZCBmZl9taXhfMl90b18xX3MxNnBfcThfc3NlMihpbnQxNl90ICoqc3JjLCBpbnQxNl90ICoqbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpOworCit2b2lkIGZmX21peF8xX3RvXzJfZmx0cF9mbHRfc3NlKGZsb2F0ICoqc3JjLCBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsKK3ZvaWQgZmZfbWl4XzFfdG9fMl9mbHRwX2ZsdF9hdngoZmxvYXQgKipzcmMsIGZsb2F0ICoqbWF0cml4LCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpOworCit2b2lkIGZmX21peF8xX3RvXzJfczE2cF9mbHRfc3NlMihpbnQxNl90ICoqc3JjLCBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfY2gsIGludCBpbl9jaCk7Cit2b2lkIGZmX21peF8xX3RvXzJfczE2cF9mbHRfc3NlNChpbnQxNl90ICoqc3JjLCBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfY2gsIGludCBpbl9jaCk7Cit2b2lkIGZmX21peF8xX3RvXzJfczE2cF9mbHRfYXZ4IChpbnQxNl90ICoqc3JjLCBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfY2gsIGludCBpbl9jaCk7CisKKyNkZWZpbmUgREVGSU5FX01JWF8zXzhfVE9fMV8yKGNoYW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18xX2ZsdHBfZmx0X3NzZShmbG9hdCAqKnNyYywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpOyAgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18yX2ZsdHBfZmx0X3NzZShmbG9hdCAqKnNyYywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18xX3MxNnBfZmx0X3NzZTIoaW50MTZfdCAqKnNyYywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKiptYXRyaXgsIGludCBsZW4sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18yX3MxNnBfZmx0X3NzZTIoaW50MTZfdCAqKnNyYywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKiptYXRyaXgsIGludCBsZW4sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18xX3MxNnBfZmx0X3NzZTQoaW50MTZfdCAqKnNyYywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKiptYXRyaXgsIGludCBsZW4sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18yX3MxNnBfZmx0X3NzZTQoaW50MTZfdCAqKnNyYywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKiptYXRyaXgsIGludCBsZW4sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18xX2ZsdHBfZmx0X2F2eChmbG9hdCAqKnNyYywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpOyAgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18yX2ZsdHBfZmx0X2F2eChmbG9hdCAqKnNyYywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18xX3MxNnBfZmx0X2F2eChpbnQxNl90ICoqc3JjLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpOyAgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18yX3MxNnBfZmx0X2F2eChpbnQxNl90ICoqc3JjLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gpOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18xX2ZsdHBfZmx0X2ZtYTQoZmxvYXQgKipzcmMsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKiptYXRyaXgsIGludCBsZW4sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18yX2ZsdHBfZmx0X2ZtYTQoZmxvYXQgKipzcmMsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKiptYXRyaXgsIGludCBsZW4sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18xX3MxNnBfZmx0X2ZtYTQoaW50MTZfdCAqKnNyYywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKiptYXRyaXgsIGludCBsZW4sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsgICAgIFwKK3ZvaWQgZmZfbWl4XyAjIyBjaGFuICMjIF90b18yX3MxNnBfZmx0X2ZtYTQoaW50MTZfdCAqKnNyYywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKiptYXRyaXgsIGludCBsZW4sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoKTsKKworREVGSU5FX01JWF8zXzhfVE9fMV8yKDMpCitERUZJTkVfTUlYXzNfOF9UT18xXzIoNCkKK0RFRklORV9NSVhfM184X1RPXzFfMig1KQorREVGSU5FX01JWF8zXzhfVE9fMV8yKDYpCitERUZJTkVfTUlYXzNfOF9UT18xXzIoNykKK0RFRklORV9NSVhfM184X1RPXzFfMig4KQorCisjZGVmaW5lIFNFVF9NSVhfM184X1RPXzFfMihjaGFuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChFWFRFUk5BTF9TU0UoY3B1X2ZsYWdzKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX01JWF9DT0VGRl9UWVBFX0ZMVCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLCAxLCAxNiwgNCwgIlNTRSIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbWl4XyAjIyBjaGFuICMjIF90b18xX2ZsdHBfZmx0X3NzZSk7ICAgICAgIFwKKyAgICAgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX01JWF9DT0VGRl9UWVBFX0ZMVCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLCAyLCAxNiwgNCwgIlNTRSIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbWl4XyMjIGNoYW4gIyNfdG9fMl9mbHRwX2ZsdF9zc2UpOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfUzE2UCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4sIDEsIDE2LCA4LCAiU1NFMiIsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9taXhfICMjIGNoYW4gIyMgX3RvXzFfczE2cF9mbHRfc3NlMik7ICAgICAgXAorICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfUzE2UCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4sIDIsIDE2LCA4LCAiU1NFMiIsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9taXhfICMjIGNoYW4gIyMgX3RvXzJfczE2cF9mbHRfc3NlMik7ICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoRVhURVJOQUxfU1NFNChjcHVfZmxhZ3MpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZmX2F1ZGlvX21peF9zZXRfZnVuYyhhbSwgQVZfU0FNUExFX0ZNVF9TMTZQLCBBVl9NSVhfQ09FRkZfVFlQRV9GTFQsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbiwgMSwgMTYsIDgsICJTU0U0IiwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21peF8gIyMgY2hhbiAjIyBfdG9fMV9zMTZwX2ZsdF9zc2U0KTsgICAgICBcCisgICAgICAgIGZmX2F1ZGlvX21peF9zZXRfZnVuYyhhbSwgQVZfU0FNUExFX0ZNVF9TMTZQLCBBVl9NSVhfQ09FRkZfVFlQRV9GTFQsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbiwgMiwgMTYsIDgsICJTU0U0IiwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX21peF8gIyMgY2hhbiAjIyBfdG9fMl9zMTZwX2ZsdF9zc2U0KTsgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHB0cl9hbGlnbiA9IDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzbXBfYWxpZ24gPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoQVJDSF9YODZfMzIgfHwgY2hhbiA+PSA2KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHB0cl9hbGlnbiA9IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzbXBfYWxpZ24gPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX01JWF9DT0VGRl9UWVBFX0ZMVCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLCAxLCBwdHJfYWxpZ24sIHNtcF9hbGlnbiwgIkFWWCIsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbWl4XyAjIyBjaGFuICMjIF90b18xX2ZsdHBfZmx0X2F2eCk7ICAgICAgIFwKKyAgICAgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX01JWF9DT0VGRl9UWVBFX0ZMVCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLCAyLCBwdHJfYWxpZ24sIHNtcF9hbGlnbiwgIkFWWCIsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbWl4XyAjIyBjaGFuICMjIF90b18yX2ZsdHBfZmx0X2F2eCk7ICAgICAgIFwKKyAgICAgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX01JWF9DT0VGRl9UWVBFX0ZMVCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLCAxLCAxNiwgOCwgIkFWWCIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbWl4XyAjIyBjaGFuICMjIF90b18xX3MxNnBfZmx0X2F2eCk7ICAgICAgIFwKKyAgICAgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX01JWF9DT0VGRl9UWVBFX0ZMVCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLCAyLCAxNiwgOCwgIkFWWCIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbWl4XyAjIyBjaGFuICMjIF90b18yX3MxNnBfZmx0X2F2eCk7ICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEVYVEVSTkFMX0ZNQTQoY3B1X2ZsYWdzKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgcHRyX2FsaWduID0gMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHNtcF9hbGlnbiA9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChBUkNIX1g4Nl8zMiB8fCBjaGFuID49IDYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcHRyX2FsaWduID0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNtcF9hbGlnbiA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfRkxUUCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4sIDEsIHB0cl9hbGlnbiwgc21wX2FsaWduLCAiRk1BNCIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9taXhfICMjIGNoYW4gIyMgX3RvXzFfZmx0cF9mbHRfZm1hNCk7ICAgICAgXAorICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfRkxUUCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4sIDIsIHB0cl9hbGlnbiwgc21wX2FsaWduLCAiRk1BNCIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9taXhfICMjIGNoYW4gIyMgX3RvXzJfZmx0cF9mbHRfZm1hNCk7ICAgICAgXAorICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfUzE2UCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4sIDEsIDE2LCA4LCAiRk1BNCIsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9taXhfICMjIGNoYW4gIyMgX3RvXzFfczE2cF9mbHRfZm1hNCk7ICAgICAgXAorICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfUzE2UCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4sIDIsIDE2LCA4LCAiRk1BNCIsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9taXhfICMjIGNoYW4gIyMgX3RvXzJfczE2cF9mbHRfZm1hNCk7ICAgICAgXAorICAgIH0KKworYXZfY29sZCB2b2lkIGZmX2F1ZGlvX21peF9pbml0X3g4NihBdWRpb01peCAqYW0pCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9TU0UoY3B1X2ZsYWdzKSkgeworICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfRkxUUCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMTYsIDgsICJTU0UiLCBmZl9taXhfMl90b18xX2ZsdHBfZmx0X3NzZSk7CisgICAgICAgIGZmX2F1ZGlvX21peF9zZXRfZnVuYyhhbSwgQVZfU0FNUExFX0ZNVF9GTFRQLCBBVl9NSVhfQ09FRkZfVFlQRV9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyLCAxNiwgNCwgIlNTRSIsIGZmX21peF8xX3RvXzJfZmx0cF9mbHRfc3NlKTsKKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfUzE2UCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMTYsIDgsICJTU0UyIiwgZmZfbWl4XzJfdG9fMV9zMTZwX2ZsdF9zc2UyKTsKKyAgICAgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX01JWF9DT0VGRl9UWVBFX1E4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMTYsIDgsICJTU0UyIiwgZmZfbWl4XzJfdG9fMV9zMTZwX3E4X3NzZTIpOworICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfUzE2UCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMiwgMTYsIDgsICJTU0UyIiwgZmZfbWl4XzFfdG9fMl9zMTZwX2ZsdF9zc2UyKTsKKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkgeworICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfUzE2UCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMTYsIDgsICJTU0U0IiwgZmZfbWl4XzJfdG9fMV9zMTZwX2ZsdF9zc2U0KTsKKyAgICAgICAgZmZfYXVkaW9fbWl4X3NldF9mdW5jKGFtLCBBVl9TQU1QTEVfRk1UX1MxNlAsIEFWX01JWF9DT0VGRl9UWVBFX0ZMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDE2LCA4LCAiU1NFNCIsIGZmX21peF8xX3RvXzJfczE2cF9mbHRfc3NlNCk7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkgeworICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfRkxUUCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMzIsIDE2LCAiQVZYIiwgZmZfbWl4XzJfdG9fMV9mbHRwX2ZsdF9hdngpOworICAgICAgICBmZl9hdWRpb19taXhfc2V0X2Z1bmMoYW0sIEFWX1NBTVBMRV9GTVRfRkxUUCwgQVZfTUlYX0NPRUZGX1RZUEVfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMiwgMzIsIDgsICJBVlgiLCBmZl9taXhfMV90b18yX2ZsdHBfZmx0X2F2eCk7CisgICAgICAgIGZmX2F1ZGlvX21peF9zZXRfZnVuYyhhbSwgQVZfU0FNUExFX0ZNVF9TMTZQLCBBVl9NSVhfQ09FRkZfVFlQRV9GTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyLCAxNiwgOCwgIkFWWCIsIGZmX21peF8xX3RvXzJfczE2cF9mbHRfYXZ4KTsKKyAgICB9CisKKyAgICBTRVRfTUlYXzNfOF9UT18xXzIoMykKKyAgICBTRVRfTUlYXzNfOF9UT18xXzIoNCkKKyAgICBTRVRfTUlYXzNfOF9UT18xXzIoNSkKKyAgICBTRVRfTUlYXzNfOF9UT18xXzIoNikKKyAgICBTRVRfTUlYXzNfOF9UT18xXzIoNykKKyAgICBTRVRfTUlYXzNfOF9UT18xXzIoOCkKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3g4Ni9kaXRoZXIuYXNtIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUveDg2L2RpdGhlci5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3ZjI4MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3g4Ni9kaXRoZXIuYXNtCkBAIC0wLDAgKzEsMTE3IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiB4ODYgb3B0aW1pemVkIGRpdGhlcmluZyBmb3JtYXQgY29udmVyc2lvbgorOyogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEgMzIKKworOyAxLjBmIC8gKDIuMGYgKiBJTlQzMl9NQVgpCitwZl9kaXRoZXJfc2NhbGU6IHRpbWVzIDggZGQgMi4zMjgzMDY0Mzc2MmUtMTAKKworcGZfczE2X3NjYWxlOiB0aW1lcyA0IGRkIDMyNzUzLjAKKworU0VDVElPTl9URVhUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9xdWFudGl6ZShpbnQxNl90ICpkc3QsIGZsb2F0ICpzcmMsIGZsb2F0ICpkaXRoZXIsIGludCBsZW4pOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTklUX1hNTSBzc2UyCitjZ2xvYmFsIHF1YW50aXplLCA0LDQsMywgZHN0LCBzcmMsIGRpdGhlciwgbGVuCisgICAgbGVhICAgICAgICAgbGVucSwgWzIqbGVuZF0KKyAgICBhZGQgICAgICAgICBkc3RxLCBsZW5xCisgICAgbGVhICAgICAgICAgc3JjcSwgW3NyY3ErMipsZW5xXQorICAgIGxlYSAgICAgIGRpdGhlcnEsIFtkaXRoZXJxKzIqbGVucV0KKyAgICBuZWcgICAgICAgICBsZW5xCisgICAgbW92YSAgICAgICAgICBtMiwgW3BmX3MxNl9zY2FsZV0KKy5sb29wOgorICAgIG11bHBzICAgICAgICAgbTAsIG0yLCBbc3JjcSsyKmxlbnFdCisgICAgbXVscHMgICAgICAgICBtMSwgbTIsIFtzcmNxKzIqbGVucSttbXNpemVdCisgICAgYWRkcHMgICAgICAgICBtMCwgW2RpdGhlcnErMipsZW5xXQorICAgIGFkZHBzICAgICAgICAgbTEsIFtkaXRoZXJxKzIqbGVucSttbXNpemVdCisgICAgY3Z0cHMyZHEgICAgICBtMCwgbTAKKyAgICBjdnRwczJkcSAgICAgIG0xLCBtMQorICAgIHBhY2tzc2R3ICAgICAgbTAsIG0xCisgICAgbW92YSAgICAgW2RzdHErbGVucV0sIG0wCisgICAgYWRkICAgICAgICAgbGVucSwgbW1zaXplCisgICAgamwgLmxvb3AKKyAgICBSRVBfUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9kaXRoZXJfaW50X3RvX2Zsb2F0X3JlY3Rhbmd1bGFyKGZsb2F0ICpkc3QsIGludCAqc3JjLCBpbnQgbGVuKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gRElUSEVSX0lOVF9UT19GTE9BVF9SRUNUQU5HVUxBUiAwCitjZ2xvYmFsIGRpdGhlcl9pbnRfdG9fZmxvYXRfcmVjdGFuZ3VsYXIsIDMsMywzLCBkc3QsIHNyYywgbGVuCisgICAgbGVhICAgICAgICAgbGVucSwgWzQqbGVuZF0KKyAgICBhZGQgICAgICAgICBzcmNxLCBsZW5xCisgICAgYWRkICAgICAgICAgZHN0cSwgbGVucQorICAgIG5lZyAgICAgICAgIGxlbnEKKyAgICBtb3ZhICAgICAgICAgIG0wLCBbcGZfZGl0aGVyX3NjYWxlXQorLmxvb3A6CisgICAgY3Z0ZHEycHMgICAgICBtMSwgW3NyY3ErbGVucV0KKyAgICBjdnRkcTJwcyAgICAgIG0yLCBbc3JjcStsZW5xK21tc2l6ZV0KKyAgICBtdWxwcyAgICAgICAgIG0xLCBtMSwgbTAKKyAgICBtdWxwcyAgICAgICAgIG0yLCBtMiwgbTAKKyAgICBtb3ZhICBbZHN0cStsZW5xXSwgbTEKKyAgICBtb3ZhICBbZHN0cStsZW5xK21tc2l6ZV0sIG0yCisgICAgYWRkICAgICAgICAgbGVucSwgMiptbXNpemUKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitESVRIRVJfSU5UX1RPX0ZMT0FUX1JFQ1RBTkdVTEFSCitJTklUX1lNTSBhdngKK0RJVEhFUl9JTlRfVE9fRkxPQVRfUkVDVEFOR1VMQVIKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2RpdGhlcl9pbnRfdG9fZmxvYXRfdHJpYW5ndWxhcihmbG9hdCAqZHN0LCBpbnQgKnNyYzAsIGludCBsZW4pCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBESVRIRVJfSU5UX1RPX0ZMT0FUX1RSSUFOR1VMQVIgMAorY2dsb2JhbCBkaXRoZXJfaW50X3RvX2Zsb2F0X3RyaWFuZ3VsYXIsIDMsNCw1LCBkc3QsIHNyYzAsIGxlbiwgc3JjMQorICAgIGxlYSAgICAgICAgIGxlbnEsIFs0KmxlbmRdCisgICAgbGVhICAgICAgICBzcmMxcSwgW3NyYzBxKzIqbGVucV0KKyAgICBhZGQgICAgICAgIHNyYzBxLCBsZW5xCisgICAgYWRkICAgICAgICAgZHN0cSwgbGVucQorICAgIG5lZyAgICAgICAgIGxlbnEKKyAgICBtb3ZhICAgICAgICAgIG0wLCBbcGZfZGl0aGVyX3NjYWxlXQorLmxvb3A6CisgICAgY3Z0ZHEycHMgICAgICBtMSwgW3NyYzBxK2xlbnFdCisgICAgY3Z0ZHEycHMgICAgICBtMiwgW3NyYzBxK2xlbnErbW1zaXplXQorICAgIGN2dGRxMnBzICAgICAgbTMsIFtzcmMxcStsZW5xXQorICAgIGN2dGRxMnBzICAgICAgbTQsIFtzcmMxcStsZW5xK21tc2l6ZV0KKyAgICBhZGRwcyAgICAgICAgIG0xLCBtMSwgbTMKKyAgICBhZGRwcyAgICAgICAgIG0yLCBtMiwgbTQKKyAgICBtdWxwcyAgICAgICAgIG0xLCBtMSwgbTAKKyAgICBtdWxwcyAgICAgICAgIG0yLCBtMiwgbTAKKyAgICBtb3ZhICBbZHN0cStsZW5xXSwgbTEKKyAgICBtb3ZhICBbZHN0cStsZW5xK21tc2l6ZV0sIG0yCisgICAgYWRkICAgICAgICAgbGVucSwgMiptbXNpemUKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitESVRIRVJfSU5UX1RPX0ZMT0FUX1RSSUFOR1VMQVIKK0lOSVRfWU1NIGF2eAorRElUSEVSX0lOVF9UT19GTE9BVF9UUklBTkdVTEFSCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS94ODYvZGl0aGVyX2luaXQuYyBiL2ZmbXBlZy9saWJhdnJlc2FtcGxlL3g4Ni9kaXRoZXJfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNmQ0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS94ODYvZGl0aGVyX2luaXQuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnJlc2FtcGxlL2RpdGhlci5oIgorCit2b2lkIGZmX3F1YW50aXplX3NzZTIoaW50MTZfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCAqZGl0aGVyLCBpbnQgbGVuKTsKKwordm9pZCBmZl9kaXRoZXJfaW50X3RvX2Zsb2F0X3JlY3Rhbmd1bGFyX3NzZTIoZmxvYXQgKmRzdCwgaW50ICpzcmMsIGludCBsZW4pOwordm9pZCBmZl9kaXRoZXJfaW50X3RvX2Zsb2F0X3JlY3Rhbmd1bGFyX2F2eChmbG9hdCAqZHN0LCBpbnQgKnNyYywgaW50IGxlbik7CisKK3ZvaWQgZmZfZGl0aGVyX2ludF90b19mbG9hdF90cmlhbmd1bGFyX3NzZTIoZmxvYXQgKmRzdCwgaW50ICpzcmMwLCBpbnQgbGVuKTsKK3ZvaWQgZmZfZGl0aGVyX2ludF90b19mbG9hdF90cmlhbmd1bGFyX2F2eChmbG9hdCAqZHN0LCBpbnQgKnNyYzAsIGludCBsZW4pOworCithdl9jb2xkIHZvaWQgZmZfZGl0aGVyX2luaXRfeDg2KERpdGhlckRTUENvbnRleHQgKmRkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZSZXNhbXBsZURpdGhlck1ldGhvZCBtZXRob2QpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgZGRzcC0+cXVhbnRpemUgICAgICA9IGZmX3F1YW50aXplX3NzZTI7CisgICAgICAgIGRkc3AtPnB0cl9hbGlnbiAgICAgPSAxNjsKKyAgICAgICAgZGRzcC0+c2FtcGxlc19hbGlnbiA9IDg7CisgICAgfQorCisgICAgaWYgKG1ldGhvZCA9PSBBVl9SRVNBTVBMRV9ESVRIRVJfUkVDVEFOR1VMQVIpIHsKKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgZGRzcC0+ZGl0aGVyX2ludF90b19mbG9hdCA9IGZmX2RpdGhlcl9pbnRfdG9fZmxvYXRfcmVjdGFuZ3VsYXJfc3NlMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGRkc3AtPmRpdGhlcl9pbnRfdG9fZmxvYXQgPSBmZl9kaXRoZXJfaW50X3RvX2Zsb2F0X3JlY3Rhbmd1bGFyX2F2eDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGRkc3AtPmRpdGhlcl9pbnRfdG9fZmxvYXQgPSBmZl9kaXRoZXJfaW50X3RvX2Zsb2F0X3RyaWFuZ3VsYXJfc3NlMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGRkc3AtPmRpdGhlcl9pbnRfdG9fZmxvYXQgPSBmZl9kaXRoZXJfaW50X3RvX2Zsb2F0X3RyaWFuZ3VsYXJfYXZ4OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2cmVzYW1wbGUveDg2L3V0aWwuYXNtIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUveDg2L3V0aWwuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4N2E0YTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZyZXNhbXBsZS94ODYvdXRpbC5hc20KQEAgLTAsMCArMSw0MSBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2IHV0aWxpdHkgbWFjcm9zIGZvciBsaWJhdnJlc2FtcGxlCis7KiBDb3B5cmlnaHQgKGMpIDIwMTIgSnVzdGluIFJ1Z2dsZXMgPGp1c3Rpbi5ydWdnbGVzQGdtYWlsLmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVtYWNybyBTMTZfVE9fUzMyX1NYIDIgOyBzcmMvbG93IGRzdCwgaGlnaCBkc3QKKyVpZiBjcHVmbGFnKHNzZTQpCisgICAgcG1vdnN4d2QgICAgIG0lMiwgbSUxCisgICAgcHNybGRxICAgICAgIG0lMSwgOAorICAgIHBtb3ZzeHdkICAgICBtJTEsIG0lMQorICAgIFNXQVAgJTEsICUyCislZWxzZQorICAgIG1vdmEgICAgICAgICBtJTIsIG0lMQorICAgIHB1bnBja2h3ZCAgICBtJTIsIG0lMgorICAgIHB1bnBja2x3ZCAgICBtJTEsIG0lMQorICAgIHBzcmFkICAgICAgICBtJTIsIDE2CisgICAgcHNyYWQgICAgICAgIG0lMSwgMTYKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBERUlOVDJfUFMgMyA7IHNyYzAvZXZlbiBkc3QsIHNyYzEvb2RkIGRzdCwgdGVtcAorICAgIHNodWZwcyAgbSUzLCBtJTEsIG0lMiwgcTMxMzEKKyAgICBzaHVmcHMgICAgICAgbSUxLCBtJTIsIHEyMDIwCisgICAgU1dBUCAlMiwlMworJWVuZG1hY3JvCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZyZXNhbXBsZS94ODYvdzY0eG1tdGVzdC5jIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUveDg2L3c2NHhtbXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQyYmQxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2cmVzYW1wbGUveDg2L3c2NHhtbXRlc3QuYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogY2hlY2sgWE1NIHJlZ2lzdGVycyBmb3IgY2xvYmJlcnMgb24gV2luNjQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZyZXNhbXBsZS9hdnJlc2FtcGxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni93NjR4bW10ZXN0LmgiCisKK3dyYXAoYXZyZXNhbXBsZV9jb252ZXJ0KEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwgdWludDhfdCAqKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfcGxhbmVfc2l6ZSwgaW50IG91dF9zYW1wbGVzLCB1aW50OF90ICoqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5fcGxhbmVfc2l6ZSwgaW50IGluX3NhbXBsZXMpKQoreworICAgIHRlc3R4bW1jbG9iYmVycyhhdnJlc2FtcGxlX2NvbnZlcnQsIGF2ciwgb3V0cHV0LCBvdXRfcGxhbmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgb3V0X3NhbXBsZXMsIGlucHV0LCBpbl9wbGFuZV9zaXplLCBpbl9zYW1wbGVzKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvTWFrZWZpbGUgYi9mZm1wZWcvbGliYXZ1dGlsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWE4YWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL01ha2VmaWxlCkBAIC0wLDAgKzEsMTk0IEBACitpbmNsdWRlICQoU1VCRElSKS4uL2NvbmZpZy5tYWsKKworTkFNRSA9IGF2dXRpbAorCitIRUFERVJTID0gYWRsZXIzMi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYWVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYXR0cmlidXRlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYXVkaW9fZmlmby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYXVkaW9jb252ZXJ0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYXZhc3NlcnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYXZzdHJpbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYXZ1dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYmFzZTY0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYmxvd2Zpc2guaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYnByaW50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYnN3YXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYnVmZmVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY2FzdDUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY2hhbm5lbF9sYXlvdXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY29tbW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY3B1LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY3JjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZGlzcGxheS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZG93bm1peF9pbmZvLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZXJyb3IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZXZhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZmlmby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZmlsZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZnJhbWUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaGFzaC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaG1hYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaW1ndXRpbHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaW50ZmxvYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaW50cmVhZHdyaXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbGZnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9nLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWFjcm9zLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWF0aGVtYXRpY3MuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWQ1LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWVtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbW90aW9uX3ZlY3Rvci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbXVybXVyMy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZGljdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgb2xkX3BpeF9mbXRzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgb3B0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcGFyc2V1dGlscy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcGl4ZGVzYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcGl4ZWx1dGlscy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcGl4Zm10LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmFuZG9tX3NlZWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVwbGF5Z2Fpbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmF0aW9uYWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmlwZW1kLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc2FtcGxlZm10LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc2hhLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc2hhNTEyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc3RlcmVvM2QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdGhyZWFkbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdGltZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdGltZWNvZGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdGltZXN0YW1wLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdmVyc2lvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeHRlYS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK0hFQURFUlMtJChDT05GSUdfTFpPKSAgICAgICAgICAgICAgICAgICArPSBsem8uaAorCitIRUFERVJTLSQoQ09ORklHX09QRU5DTCkgICAgICAgICAgICAgICAgKz0gb3BlbmNsLmgKKworQVJDSF9IRUFERVJTID0gYnN3YXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgaW50bWF0aC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgaW50cmVhZHdyaXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgdGltZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitCVUlMVF9IRUFERVJTID0gYXZjb25maWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmZ2ZXJzaW9uLmgKKworT0JKUyA9IGFkbGVyMzIubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGFlcy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGF0b21pYy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGF1ZGlvX2ZpZm8ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGF2c3RyaW5nLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGJhc2U2NC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGJsb3dmaXNoLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGJwcmludC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGJ1ZmZlci5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGNhc3Q1Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGNoYW5uZWxfbGF5b3V0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGNwdS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGNyYy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGRlcy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGRpc3BsYXkubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGRvd25taXhfaW5mby5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGVycm9yLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGV2YWwubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGZpZm8ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGZpbGUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGZpbGVfb3Blbi5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGZsb2F0X2RzcC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGZpeGVkX2RzcC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGZyYW1lLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGhhc2gubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGhtYWMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGltZ3V0aWxzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGludG1hdGgubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGxmZy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGxscy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGxvZy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGxvZzJfdGFiLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIG1hdGhlbWF0aWNzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIG1kNS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIG1lbS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIG11cm11cjMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGRpY3QubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIG9wdC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHBhcnNldXRpbHMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHBpeGRlc2MubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHBpeGVsdXRpbHMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJhbmRvbV9zZWVkLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJhdGlvbmFsLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJjNC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJpcGVtZC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHNhbXBsZWZtdC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHNoYS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHNoYTUxMi5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN0ZXJlbzNkLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHRocmVhZG1lc3NhZ2UubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHRpbWUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHRpbWVjb2RlLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHRyZWUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHV0aWxzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHhnYV9mb250X2RhdGEubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHh0ZWEubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitPQkpTLSQoQ09ORklHX0xaTykgICAgICAgICAgICAgICAgICAgICAgKz0gbHpvLm8KK09CSlMtJChDT05GSUdfT1BFTkNMKSAgICAgICAgICAgICAgICAgICArPSBvcGVuY2wubyBvcGVuY2xfaW50ZXJuYWwubworCitPQkpTICs9ICQoQ09NUEFUX09CSlM6JT0uLi9jb21wYXQvJSkKKworIyBXaW5kb3dzIHJlc291cmNlIGZpbGUKK1NMSUJPQkpTLSQoSEFWRV9HTlVfV0lORFJFUykgICAgICAgICAgICArPSBhdnV0aWxyZXMubworCitTS0lQSEVBREVSUyAgICAgICAgICA9IG9sZF9waXhfZm10cy5oCisKK1NLSVBIRUFERVJTLSQoSEFWRV9BVE9NSUNTX0dDQykgICAgICAgICs9IGF0b21pY19nY2MuaAorU0tJUEhFQURFUlMtJChIQVZFX0FUT01JQ1NfU1VOQ0MpICAgICAgKz0gYXRvbWljX3N1bmNjLmgKK1NLSVBIRUFERVJTLSQoSEFWRV9BVE9NSUNTX1dJTjMyKSAgICAgICs9IGF0b21pY193aW4zMi5oCitTS0lQSEVBREVSUy0kKENPTkZJR19PUEVOQ0wpICAgICAgICAgICArPSBvcGVuY2wuaAorCitURVNUUFJPR1MgPSBhZGxlcjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdG9taWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdnN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiYXNlNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBibG93ZmlzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjYXN0NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjcHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjcmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBldmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmaWZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmbG9hdF9kc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBobWFjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtZDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtdXJtdXIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwY2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwYXJzZXV0aWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwaXhkZXNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwaXhlbHV0aWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByYW5kb21fc2VlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByaXBlbWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaGE1MTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzb2Z0ZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0cmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1dGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB4dGVhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK1RFU1RQUk9HUy0kKEhBVkVfTFpPMVhfOTk5X0NPTVBSRVNTKSArPSBsem8KKworVE9PTFMgPSBjcnlwdG9fYmVuY2ggZmZoYXNoIGZmZXZhbCBmZmVzY2FwZQorCit0b29scy9jcnlwdG9fYmVuY2gkKEVYRVNVRik6IEVMSUJTICs9ICQoaWYgJChWRVJTVVMpLCQoc3Vic3QgKywgLWwsKyQoVkVSU1VTKSksKQordG9vbHMvY3J5cHRvX2JlbmNoJChFWEVTVUYpOiBDRkxBR1MgKz0gLURVU0VfRVhUX0xJQlM9MCQoaWYgJChWRVJTVVMpLCQoc3Vic3QgKywrVVNFXywrJChWRVJTVVMpKSwpCisKKyQoU1VCRElSKWx6by10ZXN0JChFWEVTVUYpOiBFTElCUyA9IC1sbHpvMgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hYXJjaDY0L01ha2VmaWxlIGIvZmZtcGVnL2xpYmF2dXRpbC9hYXJjaDY0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MTM4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2FhcmNoNjQvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACitPQkpTICs9IGFhcmNoNjQvY3B1Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhYXJjaDY0L2Zsb2F0X2RzcF9pbml0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTkVPTi1PQkpTICs9IGFhcmNoNjQvZmxvYXRfZHNwX25lb24ubwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hYXJjaDY0L2FzbS5TIGIvZmZtcGVnL2xpYmF2dXRpbC9hYXJjaDY0L2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWRmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgX19FTEZfXworIyAgIGRlZmluZSBFTEYKKyNlbHNlCisjICAgZGVmaW5lIEVMRiAgIworI2VuZGlmCisKKyNpZiBIQVZFX0FTX0ZVTkMKKyMgICBkZWZpbmUgRlVOQworI2Vsc2UKKyMgICBkZWZpbmUgRlVOQyAjCisjZW5kaWYKKworLm1hY3JvICBmdW5jdGlvbiBuYW1lLCBleHBvcnQ9MCwgYWxpZ249MgorICAgIC5tYWNybyBlbmRmdW5jCitFTEYgICAgIC5zaXplICAgXG5hbWUsIC4gLSBcbmFtZQorRlVOQyAgICAuZW5kZnVuYworICAgICAgICAucHVyZ2VtIGVuZGZ1bmMKKyAgICAuZW5kbQorICAgICAgICAudGV4dAorICAgICAgICAuYWxpZ24gICAgICAgICAgXGFsaWduCisgICAgLmlmIFxleHBvcnQKKyAgICAgICAgLmdsb2JhbCBFWFRFUk5fQVNNXG5hbWUKK0VMRiAgICAgLnR5cGUgICBFWFRFUk5fQVNNXG5hbWUsICVmdW5jdGlvbgorRlVOQyAgICAuZnVuYyAgIEVYVEVSTl9BU01cbmFtZQorRVhURVJOX0FTTVxuYW1lOgorICAgIC5lbHNlCitFTEYgICAgIC50eXBlICAgXG5hbWUsICVmdW5jdGlvbgorRlVOQyAgICAuZnVuYyAgIFxuYW1lCitcbmFtZToKKyAgICAuZW5kaWYKKy5lbmRtCisKKy5tYWNybyAgY29uc3QgICBuYW1lLCBhbGlnbj0yCisgICAgLm1hY3JvIGVuZGNvbnN0CitFTEYgICAgIC5zaXplICAgXG5hbWUsIC4gLSBcbmFtZQorICAgICAgICAucHVyZ2VtIGVuZGNvbnN0CisgICAgLmVuZG0KKyNpZm5kZWYgX19NQUNIX18KKyAgICAgICAgLnNlY3Rpb24gICAgICAgIC5yb2RhdGEKKyNlbHNlCisgICAgICAgIC5jb25zdF9kYXRhCisjZW5kaWYKKyAgICAgICAgLmFsaWduICAgICAgICAgIFxhbGlnbgorXG5hbWU6CisuZW5kbQorCisubWFjcm8gIG1vdnJlbCByZCwgdmFsCisjaWYgQ09ORklHX1BJQyAmJiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAgICAgYWRycCAgICAgICAgICAgIFxyZCwgXHZhbEBQQUdFCisgICAgICAgIGFkZCAgICAgICAgICAgICBccmQsIFxyZCwgXHZhbEBQQUdFT0ZGCisjZWxpZiBDT05GSUdfUElDCisgICAgICAgIGFkcnAgICAgICAgICAgICBccmQsIFx2YWwKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxyZCwgXHJkLCA6bG8xMjpcdmFsCisjZWxzZQorICAgICAgICBsZHIgICAgICAgICAgICAgXHJkLCA9XHZhbAorI2VuZGlmCisuZW5kbQorCisjZGVmaW5lIEdMVUUoYSwgYikgYSAjIyBiCisjZGVmaW5lIEpPSU4oYSwgYikgR0xVRShhLCBiKQorI2RlZmluZSBYKHMpIEpPSU4oRVhURVJOX0FTTSwgcykKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYWFyY2g2NC9ic3dhcC5oIGIvZmZtcGVnL2xpYmF2dXRpbC9hYXJjaDY0L2Jzd2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3MzVjNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYWFyY2g2NC9ic3dhcC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQUFSQ0g2NF9CU1dBUF9ICisjZGVmaW5lIEFWVVRJTF9BQVJDSDY0X0JTV0FQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisKKyNpZiBIQVZFX0lOTElORV9BU00KKworI2RlZmluZSBhdl9ic3dhcDE2IGF2X2Jzd2FwMTYKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IHVuc2lnbmVkIGF2X2Jzd2FwMTYodW5zaWduZWQgeCkKK3sKKyAgICBfX2FzbV9fKCJyZXYxNiAldzAsICV3MCIgOiAiK3IiKHgpKTsKKyAgICByZXR1cm4geDsKK30KKworI2RlZmluZSBhdl9ic3dhcDMyIGF2X2Jzd2FwMzIKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IHVpbnQzMl90IGF2X2Jzd2FwMzIodWludDMyX3QgeCkKK3sKKyAgICBfX2FzbV9fKCJyZXYgJXcwLCAldzAiIDogIityIih4KSk7CisgICAgcmV0dXJuIHg7Cit9CisKKyNkZWZpbmUgYXZfYnN3YXA2NCBhdl9ic3dhcDY0CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCB1aW50NjRfdCBhdl9ic3dhcDY0KHVpbnQ2NF90IHgpCit7CisgICAgX19hc21fXygicmV2ICUwLCAlMCIgOiAiK3IiKHgpKTsKKyAgICByZXR1cm4geDsKK30KKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworI2VuZGlmIC8qIEFWVVRJTF9BQVJDSDY0X0JTV0FQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYWFyY2g2NC9jcHUuYyBiL2ZmbXBlZy9saWJhdnV0aWwvYWFyY2g2NC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWYwNzdhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hYXJjaDY0L2NwdS5jCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1X2ludGVybmFsLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKK2ludCBmZl9nZXRfY3B1X2ZsYWdzX2FhcmNoNjQodm9pZCkKK3sKKyAgICByZXR1cm4gQVZfQ1BVX0ZMQUdfQVJNVjggKiBIQVZFX0FSTVY4IHwKKyAgICAgICAgICAgQVZfQ1BVX0ZMQUdfTkVPTiAgKiBIQVZFX05FT04gIHwKKyAgICAgICAgICAgQVZfQ1BVX0ZMQUdfVkZQICAgKiBIQVZFX1ZGUDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYWFyY2g2NC9jcHUuaCBiL2ZmbXBlZy9saWJhdnV0aWwvYWFyY2g2NC9jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjFiOWNjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hYXJjaDY0L2NwdS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQUFSQ0g2NF9DUFVfSAorI2RlZmluZSBBVlVUSUxfQUFSQ0g2NF9DUFVfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHVfaW50ZXJuYWwuaCIKKworI2RlZmluZSBoYXZlX2FybXY4KGZsYWdzKSBDUFVFWFQoZmxhZ3MsIEFSTVY4KQorI2RlZmluZSBoYXZlX25lb24oZmxhZ3MpIENQVUVYVChmbGFncywgTkVPTikKKyNkZWZpbmUgaGF2ZV92ZnAoZmxhZ3MpICBDUFVFWFQoZmxhZ3MsIFZGUCkKKworI2VuZGlmIC8qIEFWVVRJTF9BQVJDSDY0X0NQVV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2FhcmNoNjQvZmxvYXRfZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdnV0aWwvYWFyY2g2NC9mbG9hdF9kc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjUwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2FhcmNoNjQvZmxvYXRfZHNwX2luaXQuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogQVJNIE5FT04gb3B0aW1pc2VkIEZsb2F0IERTUCBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImNwdS5oIgorCit2b2lkIGZmX3ZlY3Rvcl9mbXVsX25lb24oZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCit2b2lkIGZmX3ZlY3Rvcl9mbWFjX3NjYWxhcl9uZW9uKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGZsb2F0IG11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7CisKK3ZvaWQgZmZfdmVjdG9yX2ZtdWxfc2NhbGFyX25lb24oZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgZmxvYXQgbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKwordm9pZCBmZl92ZWN0b3JfZG11bF9zY2FsYXJfbmVvbihkb3VibGUgKmRzdCwgY29uc3QgZG91YmxlICpzcmMsIGRvdWJsZSBtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCit2b2lkIGZmX3ZlY3Rvcl9mbXVsX3dpbmRvd19uZW9uKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMSwgY29uc3QgZmxvYXQgKndpbiwgaW50IGxlbik7CisKK3ZvaWQgZmZfdmVjdG9yX2ZtdWxfYWRkX25lb24oZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMiwgaW50IGxlbik7CisKK3ZvaWQgZmZfdmVjdG9yX2ZtdWxfcmV2ZXJzZV9uZW9uKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzEsIGludCBsZW4pOworCit2b2lkIGZmX2J1dHRlcmZsaWVzX2Zsb2F0X25lb24oZmxvYXQgKnYxLCBmbG9hdCAqdjIsIGludCBsZW4pOworCitmbG9hdCBmZl9zY2FsYXJwcm9kdWN0X2Zsb2F0X25lb24oY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIsIGludCBsZW4pOworCithdl9jb2xkIHZvaWQgZmZfZmxvYXRfZHNwX2luaXRfYWFyY2g2NChBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGZkc3AtPmJ1dHRlcmZsaWVzX2Zsb2F0ICAgPSBmZl9idXR0ZXJmbGllc19mbG9hdF9uZW9uOworICAgICAgICBmZHNwLT5zY2FsYXJwcm9kdWN0X2Zsb2F0ID0gZmZfc2NhbGFycHJvZHVjdF9mbG9hdF9uZW9uOworICAgICAgICBmZHNwLT52ZWN0b3JfZG11bF9zY2FsYXIgID0gZmZfdmVjdG9yX2RtdWxfc2NhbGFyX25lb247CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsICAgICAgICAgPSBmZl92ZWN0b3JfZm11bF9uZW9uOworICAgICAgICBmZHNwLT52ZWN0b3JfZm1hY19zY2FsYXIgID0gZmZfdmVjdG9yX2ZtYWNfc2NhbGFyX25lb247CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX2FkZCAgICAgPSBmZl92ZWN0b3JfZm11bF9hZGRfbmVvbjsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZSA9IGZmX3ZlY3Rvcl9mbXVsX3JldmVyc2VfbmVvbjsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyICA9IGZmX3ZlY3Rvcl9mbXVsX3NjYWxhcl9uZW9uOworICAgICAgICBmZHNwLT52ZWN0b3JfZm11bF93aW5kb3cgID0gZmZfdmVjdG9yX2ZtdWxfd2luZG93X25lb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hYXJjaDY0L2Zsb2F0X2RzcF9uZW9uLlMgYi9mZm1wZWcvbGliYXZ1dGlsL2FhcmNoNjQvZmxvYXRfZHNwX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQ3OTBjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hYXJjaDY0L2Zsb2F0X2RzcF9uZW9uLlMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBBUk0gTkVPTiBvcHRpbWlzZWQgRmxvYXQgRFNQIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDE0IEphbm5lIEdydW5hdSA8amFubmUtbGliYXZAamFubmF1Lm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImFzbS5TIgorCitmdW5jdGlvbiBmZl92ZWN0b3JfZm11bF9uZW9uLCBleHBvcnQ9MQorMTogICAgICBzdWJzICAgICAgICAgICAgdzMsICB3MywgICMxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRTLCB2MS40U30sIFt4MV0sICMzMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRTLCB2My40U30sIFt4MV0sICMzMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRTLCB2NS40U30sIFt4Ml0sICMzMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjRTLCB2Ny40U30sIFt4Ml0sICMzMgorICAgICAgICBmbXVsICAgICAgICAgICAgdjE2LjRTLCB2MC40UywgIHY0LjRTCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MTcuNFMsIHYxLjRTLCAgdjUuNFMKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYxOC40UywgdjIuNFMsICB2Ni40UworICAgICAgICBmbXVsICAgICAgICAgICAgdjE5LjRTLCB2My40UywgIHY3LjRTCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LjRTLCB2MTcuNFN9LCBbeDBdLCAjMzIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguNFMsIHYxOS40U30sIFt4MF0sICMzMgorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZlY3Rvcl9mbWFjX3NjYWxhcl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICAjLTMyCisxOiAgICAgIHN1YnMgICAgICAgICAgICB3MiwgIHcyLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjRTLCB2MTcuNFN9LCBbeDBdLCAjMzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguNFMsIHYxOS40U30sIFt4MF0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNFMsICB2NS40U30sICBbeDFdLCAjMzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni40UywgIHY3LjRTfSwgIFt4MV0sICMzMgorICAgICAgICBmbWxhICAgICAgICAgICAgdjE2LjRTLCB2NC40UywgIHYwLlNbMF0KKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNy40UywgdjUuNFMsICB2MC5TWzBdCisgICAgICAgIGZtbGEgICAgICAgICAgICB2MTguNFMsIHY2LjRTLCAgdjAuU1swXQorICAgICAgICBmbWxhICAgICAgICAgICAgdjE5LjRTLCB2Ny40UywgIHYwLlNbMF0KKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuNFMsIHYxNy40U30sIFt4MF0sICMzMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxOC40UywgdjE5LjRTfSwgW3gwXSwgIzMyCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdmVjdG9yX2ZtdWxfc2NhbGFyX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB3NCwgICMxNQorICAgICAgICBiaWNzICAgICAgICAgICAgdzMsICB3MiwgIHc0CisgICAgICAgIGR1cCAgICAgICAgICAgICB2MTYuNFMsIHYwLlNbMF0KKyAgICAgICAgYi5lcSAgICAgICAgICAgIDNmCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNFMsIHYxLjRTfSwgW3gxXSwgIzMyCisxOiAgICAgIHN1YnMgICAgICAgICAgICB3MywgIHczLCAgIzE2CisgICAgICAgIGZtdWwgICAgICAgICAgICB2MC40UywgIHYwLjRTLCAgdjE2LjRTCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNFMsIHYzLjRTfSwgW3gxXSwgIzMyCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MS40UywgIHYxLjRTLCAgdjE2LjRTCisgICAgICAgIGZtdWwgICAgICAgICAgICB2Mi40UywgIHYyLjRTLCAgdjE2LjRTCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuNFMsIHYxLjRTfSwgW3gwXSwgIzMyCisgICAgICAgIGZtdWwgICAgICAgICAgICB2My40UywgIHYzLjRTLCAgdjE2LjRTCisgICAgICAgIGIuZXEgICAgICAgICAgICAyZgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRTLCB2MS40U30sIFt4MV0sICMzMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjRTLCB2My40U30sIFt4MF0sICMzMgorICAgICAgICBiICAgICAgICAgICAgICAgMWIKKzI6ICAgICAgYW5kcyAgICAgICAgICAgIHcyLCAgdzIsICAjMTUKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi40UywgdjMuNFN9LCBbeDBdLCAjMzIKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDRmCiszOiAgICAgIGxkMSAgICAgICAgICAgICB7djAuNFN9LCBbeDFdLCAjMTYKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYwLjRTLCAgdjAuNFMsICB2MTYuNFMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC40U30sIFt4MF0sICMxNgorICAgICAgICBzdWJzICAgICAgICAgICAgdzIsICB3MiwgICM0CisgICAgICAgIGIuZ3QgICAgICAgICAgICAzYgorNDogICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdmVjdG9yX2RtdWxfc2NhbGFyX25lb24sIGV4cG9ydD0xCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MTYuMkQsIHYwLkRbMF0KKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC4yRCwgdjEuMkR9LCBbeDFdLCAjMzIKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHcyLCAgdzIsICAjOAorICAgICAgICBmbXVsICAgICAgICAgICAgdjAuMkQsICB2MC4yRCwgIHYxNi4yRAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjJELCB2My4yRH0sIFt4MV0sICMzMgorICAgICAgICBmbXVsICAgICAgICAgICAgdjEuMkQsICB2MS4yRCwgIHYxNi4yRAorICAgICAgICBmbXVsICAgICAgICAgICAgdjIuMkQsICB2Mi4yRCwgIHYxNi4yRAorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLjJELCB2MS4yRH0sIFt4MF0sICMzMgorICAgICAgICBmbXVsICAgICAgICAgICAgdjMuMkQsICB2My4yRCwgIHYxNi4yRAorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjJELCB2MS4yRH0sIFt4MV0sICMzMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjJELCB2My4yRH0sIFt4MF0sICMzMgorICAgICAgICBiLmd0ICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZlY3Rvcl9mbXVsX3dpbmRvd19uZW9uLCBleHBvcnQ9MQorICAgICAgICBzeHR3ICAgICAgICAgICAgeDQsICB3NCAgICAgICAgICAgICAgICAgLy8gbGVuCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgIzgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg1LCAgeDQsICAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MiwgIHg1LCBsc2wgIzIgICAgLy8gc3JjMSArIDQgKiAobGVuIC0gNCkKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg2LCAgeDMsICB4NSwgbHNsICMzICAgIC8vIHdpbiAgKyA4ICogKGxlbiAtIDIpCisgICAgICAgIGFkZCAgICAgICAgICAgICB4NSwgIHgwLCAgeDUsIGxzbCAjMyAgICAvLyBkc3QgICsgOCAqIChsZW4gLSAyKQorICAgICAgICBtb3YgICAgICAgICAgICAgeDcsICAjLTE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNFN9LCAgW3gxXSwgIzE2ICAgICAvLyBzMAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRTfSwgIFt4M10sICMxNiAgICAgLy8gd2kKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40U30sICBbeDJdLCB4NyAgICAgIC8vIHMxCisxOiAgICAgIGxkMSAgICAgICAgICAgICB7djMuNFN9LCAgW3g2XSwgeDcgICAgICAvLyB3agorICAgICAgICBzdWJzICAgICAgICAgICAgeDQsICB4NCwgICM0CisgICAgICAgIGZtdWwgICAgICAgICAgICB2MTcuNFMsIHYwLjRTLCAgdjIuNFMgICAvLyBzMCAqIHdpCisgICAgICAgIHJldjY0ICAgICAgICAgICB2NC40UywgIHYxLjRTCisgICAgICAgIHJldjY0ICAgICAgICAgICB2NS40UywgIHYzLjRTCisgICAgICAgIHJldjY0ICAgICAgICAgICB2MTcuNFMsIHYxNy40UworICAgICAgICBleHQgICAgICAgICAgICAgdjQuMTZCLCAgdjQuMTZCLCAgdjQuMTZCLCAgIzggLy8gczFfcgorICAgICAgICBleHQgICAgICAgICAgICAgdjUuMTZCLCAgdjUuMTZCLCAgdjUuMTZCLCAgIzggLy8gd2pfcgorICAgICAgICBleHQgICAgICAgICAgICAgdjE3LjE2QiwgdjE3LjE2QiwgdjE3LjE2QiwgIzggLy8gKHMwICogd2kpX3JldgorICAgICAgICBmbXVsICAgICAgICAgICAgdjE2LjRTLCB2MC40UywgIHY1LjRTICAvLyBzMCAqIHdqX3IKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNy40UywgdjEuNFMsICB2My40UyAgLy8gKHMwICogd2kpX3JldiArIHMxICogd2oKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDJmCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNFN9LCAgW3gxXSwgIzE2CisgICAgICAgIGZtbHMgICAgICAgICAgICB2MTYuNFMsIHY0LjRTLCAgdjIuNFMgIC8vIHMwICogd2pfciAtIHMxX3IgKiB3aQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNy40U30sIFt4NV0sIHg3CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNFN9LCAgW3gzXSwgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNFN9LCAgW3gyXSwgeDcKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuNFN9LCBbeDBdLCAjMTYKKyAgICAgICAgYiAgICAgICAgICAgICAgIDFiCisyOgorICAgICAgICBmbWxzICAgICAgICAgICAgdjE2LjRTLCB2NC40UywgIHYyLjRTICAvLyBzMCAqIHdqX3IgLSBzMV9yICogd2kKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTcuNFN9LCBbeDVdLCB4NworICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi40U30sIFt4MF0sICMxNgorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdmVjdG9yX2ZtdWxfYWRkX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNFMsIHYxLjRTfSwgIFt4MV0sICMzMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRTLCB2My40U30sICBbeDJdLCAjMzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40UywgdjUuNFN9LCAgW3gzXSwgIzMyCisxOiAgICAgIHN1YnMgICAgICAgICAgICB3NCwgIHc0LCAgIzgKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHY0LjRTLCAgdjAuNFMsICB2Mi40UworICAgICAgICBmbWxhICAgICAgICAgICAgdjUuNFMsICB2MS40UywgIHYzLjRTCisgICAgICAgIGIuZXEgICAgICAgICAgICAyZgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRTLCB2MS40U30sICBbeDFdLCAjMzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi40UywgdjMuNFN9LCAgW3gyXSwgIzMyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNFMsIHY1LjRTfSwgIFt4MF0sICMzMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRTLCB2NS40U30sICBbeDNdLCAjMzIKKyAgICAgICAgYiAgICAgICAgICAgICAgIDFiCisyOiAgICAgIHN0MSAgICAgICAgICAgICB7djQuNFMsIHY1LjRTfSwgIFt4MF0sICMzMgorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdmVjdG9yX2ZtdWxfcmV2ZXJzZV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzeHR3ICAgICAgICAgICAgeDMsICB3MworICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MiwgIHgzLCAgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgIzMyCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NCwgIy0zMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRTLCB2My40U30sICBbeDJdLCB4NAorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRTLCB2MS40U30sICBbeDFdLCAjMzIKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHgzLCAgeDMsICAjOAorICAgICAgICByZXY2NCAgICAgICAgICAgdjMuNFMsICB2My40UworICAgICAgICByZXY2NCAgICAgICAgICAgdjIuNFMsICB2Mi40UworICAgICAgICBleHQgICAgICAgICAgICAgdjMuMTZCLCB2My4xNkIsIHYzLjE2QiwgICM4CisgICAgICAgIGV4dCAgICAgICAgICAgICB2Mi4xNkIsIHYyLjE2QiwgdjIuMTZCLCAgIzgKKyAgICAgICAgZm11bCAgICAgICAgICAgIHYxNi40UywgdjAuNFMsICB2My40UworICAgICAgICBmbXVsICAgICAgICAgICAgdjE3LjRTLCB2MS40UywgIHYyLjRTCisgICAgICAgIGIuZXEgICAgICAgICAgICAyZgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRTLCB2My40U30sICBbeDJdLCB4NAorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRTLCB2MS40U30sICBbeDFdLCAjMzIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuNFMsIHYxNy40U30sICBbeDBdLCAjMzIKKyAgICAgICAgYiAgICAgICAgICAgICAgIDFiCisyOiAgICAgIHN0MSAgICAgICAgICAgICB7djE2LjRTLCB2MTcuNFN9LCAgW3gwXSwgIzMyCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9idXR0ZXJmbGllc19mbG9hdF9uZW9uLCBleHBvcnQ9MQorMTogICAgICBsZDEgICAgICAgICAgICAge3YwLjRTfSwgW3gwXQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjRTfSwgW3gxXQorICAgICAgICBzdWJzICAgICAgICAgICAgdzIsICB3MiwgICM0CisgICAgICAgIGZzdWIgICAgICAgICAgICB2Mi40UywgICB2MC40UywgIHYxLjRTCisgICAgICAgIGZhZGQgICAgICAgICAgICB2My40UywgICB2MC40UywgIHYxLjRTCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuNFN9LCBbeDFdLCAgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLjRTfSwgW3gwXSwgICAjMTYKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zY2FsYXJwcm9kdWN0X2Zsb2F0X25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdmkgICAgICAgICAgICB2Mi40UywgICMwCisxOiAgICAgIGxkMSAgICAgICAgICAgICB7djAuNFN9LCBbeDBdLCAgICMxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjRTfSwgW3gxXSwgICAjMTYKKyAgICAgICAgc3VicyAgICAgICAgICAgIHcyLCAgICAgIHcyLCAgICAgIzQKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYyLjRTLCAgIHYwLjRTLCAgdjEuNFMKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFiCisgICAgICAgIGZhZGRwICAgICAgICAgICB2MC40UywgICB2Mi40UywgIHYyLjRTCisgICAgICAgIGZhZGRwICAgICAgICAgICBzMCwgICAgICB2MC4yUworICAgICAgICByZXQKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYWFyY2g2NC9uZW9udGVzdC5oIGIvZmZtcGVnL2xpYmF2dXRpbC9hYXJjaDY0L25lb250ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkNDk4NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYWFyY2g2NC9uZW9udGVzdC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBjaGVjayBORU9OIHJlZ2lzdGVycyBmb3IgY2xvYmJlcmluZworICogQ29weXJpZ2h0IChjKSAyMDA4IFJhbWlybyBQb2xsYSA8cmFtaXJvLnBvbGxhQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorCisjZGVmaW5lIHN0b3JlbmVvbnJlZ3MobWVtKSAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSggICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzdHAgZDgsICBkOSwgIFslMF1cblx0IiAgICAgICAgICBcCisgICAgICAgICJzdHAgZDEwLCBkMTEsIFslMCwgIzE2XVxuXHQiICAgICBcCisgICAgICAgICJzdHAgZDEyLCBkMTMsIFslMCwgIzMyXVxuXHQiICAgICBcCisgICAgICAgICJzdHAgZDE0LCBkMTUsIFslMCwgIzQ4XVxuXHQiICAgICBcCisgICAgICAgIDo6ICJyIihtZW0pIDogIm1lbW9yeSIpCisKKyNkZWZpbmUgdGVzdG5lb25jbG9iYmVycyhmdW5jLCBjdHgsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDY0X3QgbmVvblsyXVs4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdG9yZW5lb25yZWdzKG5lb25bMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0ID0gX19yZWFsXyAjIyBmdW5jKGN0eCwgX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0b3JlbmVvbnJlZ3MobmVvblsxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobWVtY21wKG5lb25bMF0sIG5lb25bMV0sIHNpemVvZihuZW9uWzBdKSkpIHsgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICJORU9OIFJFR1MgQ0xPQkJFUkVEIElOICVzIVxuIiwgI2Z1bmMpOyAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG5lb25bMF1baV0gIT0gbmVvblsxXVtpXSkgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICJkJS0yZCA9ICUwMTYiUFJJeDY0IlxuIiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICA4ICsgaSwgYXZfYnN3YXA2NChuZW9uWzBdW2ldKSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICIgICAtPiAlMDE2IlBSSXg2NCJcbiIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBhdl9ic3dhcDY0KG5lb25bMV1baV0pKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmV0CisKKyNkZWZpbmUgd3JhcChmdW5jKSAgICAgIFwKK2ludCBfX3JlYWxfICMjIGZ1bmM7ICAgIFwKK2ludCBfX3dyYXBfICMjIGZ1bmM7ICAgIFwKK2ludCBfX3dyYXBfICMjIGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYWRsZXIzMi5jIGIvZmZtcGVnL2xpYmF2dXRpbC9hZGxlcjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5ZDAyMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYWRsZXIzMi5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29tcHV0ZSB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YgYSBkYXRhIHN0cmVhbS4KKyAqIFRoaXMgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIGJhc2VkIG9uIGFkbGVyMzIuYyBmcm9tIHRoZSB6bGliIGxpYnJhcnkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1IE1hcmsgQWRsZXIKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIENvbXB1dGVzIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhIGRhdGEgc3RyZWFtCisgKgorICogVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gYmFzZWQgb24gYWRsZXIzMi5jIGZyb20gdGhlIHpsaWIgbGlicmFyeS4KKyAqIEBhdXRob3IgTWFyayBBZGxlcgorICogQGluZ3JvdXAgbGF2dV9hZGxlcjMyCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImFkbGVyMzIuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJpbnRyZWFkd3JpdGUuaCIKKworI2RlZmluZSBCQVNFIDY1NTIxTCAvKiBsYXJnZXN0IHByaW1lIHNtYWxsZXIgdGhhbiA2NTUzNiAqLworCisjZGVmaW5lIERPMShidWYpICB7IHMxICs9ICpidWYrKzsgczIgKz0gczE7IH0KKyNkZWZpbmUgRE80KGJ1ZikgIERPMShidWYpOyBETzEoYnVmKTsgRE8xKGJ1Zik7IERPMShidWYpOworI2RlZmluZSBETzE2KGJ1ZikgRE80KGJ1Zik7IERPNChidWYpOyBETzQoYnVmKTsgRE80KGJ1Zik7CisKK3Vuc2lnbmVkIGxvbmcgYXZfYWRsZXIzMl91cGRhdGUodW5zaWduZWQgbG9uZyBhZGxlciwgY29uc3QgdWludDhfdCAqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICB1bnNpZ25lZCBsb25nIHMxID0gYWRsZXIgJiAweGZmZmY7CisgICAgdW5zaWduZWQgbG9uZyBzMiA9IGFkbGVyID4+IDE2OworCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyNpZiBIQVZFX0ZBU1RfNjRCSVQgJiYgSEFWRV9GQVNUX1VOQUxJR05FRCAmJiAhQ09ORklHX1NNQUxMCisgICAgICAgIHVuc2lnbmVkIGxlbjIgPSBGRk1JTigobGVuLTEpICYgfjcsIDIzKjgpOworICAgICAgICBpZiAobGVuMikgeworICAgICAgICAgICAgdWludDY0X3QgYTE9IDA7CisgICAgICAgICAgICB1aW50NjRfdCBhMj0gMDsKKyAgICAgICAgICAgIHVpbnQ2NF90IGIxPSAwOworICAgICAgICAgICAgdWludDY0X3QgYjI9IDA7CisgICAgICAgICAgICBsZW4gLT0gbGVuMjsKKyAgICAgICAgICAgIHMyICs9IHMxKmxlbjI7CisgICAgICAgICAgICB3aGlsZSAobGVuMiA+PSA4KSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgdiA9IEFWX1JONjQoYnVmKTsKKyAgICAgICAgICAgICAgICBhMiArPSBhMTsKKyAgICAgICAgICAgICAgICBiMiArPSBiMTsKKyAgICAgICAgICAgICAgICBhMSArPSAgdiAgICAmMHgwMEZGMDBGRjAwRkYwMEZGOworICAgICAgICAgICAgICAgIGIxICs9ICh2Pj44KSYweDAwRkYwMEZGMDBGRjAwRkY7CisgICAgICAgICAgICAgICAgbGVuMiAtPSA4OworICAgICAgICAgICAgICAgIGJ1Zis9ODsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9XZSBjb21iaW5lIHRoZSA4IGludGVybGVhdmVkIGFkbGVyMzIgY2hlY2tzdW1zIHdpdGhvdXQgb3ZlcmZsb3dzCisgICAgICAgICAgICAvL0RlY3JlYXNpbmcgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIHdvdWxkIGFsbG93IGJlbG93IGNvZGUgdG8gYmUKKyAgICAgICAgICAgIC8vc2ltcGxpZmllZCBidXQgd291bGQgbGlrZWx5IGJlIHNsb3dlciBkdWUgdG8gdGhlIGZld2VyIGl0ZXJhdGlvbnMKKyAgICAgICAgICAgIC8vb2YgdGhlIGlubmVyIGxvb3AKKyAgICAgICAgICAgIHMxICs9ICgoYTErYjEpKjB4MTAwMDEwMDAxMDAwMSk+PjQ4OworICAgICAgICAgICAgczIgKz0gKCgoKGEyJjB4RkZGRjAwMDBGRkZGKSsoYjImMHhGRkZGMDAwMEZGRkYpKygoYTI+PjE2KSYweEZGRkYwMDAwRkZGRikrKChiMj4+MTYpJjB4RkZGRjAwMDBGRkZGKSkqMHg4MDAwMDAwMDgpPj4zMikKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICAgICAgICAgICArIDIqKChiMSoweDEwMDAyMDAwMzAwMDQpPj40OCkKKyAgICAgICAgICAgICAgICAgKyAgICgoYTEqMHgxMDAwMTAwMDEwMDAxKT4+NDgpCisgICAgICAgICAgICAgICAgICsgMiooKGExKjB4MDAwMDEwMDAyMDAwMyk+PjQ4KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICsgMiooKGExKjB4NDAwMDMwMDAyMDAwMSk+PjQ4KQorICAgICAgICAgICAgICAgICArICAgKChiMSoweDEwMDAxMDAwMTAwMDEpPj40OCkKKyAgICAgICAgICAgICAgICAgKyAyKigoYjEqMHgzMDAwMjAwMDEwMDAwKT4+NDgpOworI2VuZGlmCisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHdoaWxlIChsZW4gPiA0ICAmJiBzMiA8ICgxVSA8PCAzMSkpIHsKKyAgICAgICAgICAgIERPNChidWYpOworICAgICAgICAgICAgbGVuIC09IDQ7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBETzEoYnVmKTsgbGVuLS07CisgICAgICAgIHMxICU9IEJBU0U7CisgICAgICAgIHMyICU9IEJBU0U7CisgICAgfQorICAgIHJldHVybiAoczIgPDwgMTYpIHwgczE7Cit9CisKKyNpZmRlZiBURVNUCisvLyBMQ09WX0VYQ0xfU1RBUlQKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorI2RlZmluZSBMRU4gNzAwMQorCitzdGF0aWMgdm9sYXRpbGUgaW50IGNoZWNrc3VtOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IGk7CisgICAgY2hhciBkYXRhW0xFTl07CisKKyAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTEVOOyBpKyspCisgICAgICAgIGRhdGFbaV0gPSAoKGkgKiBpKSA+PiAzKSArIDEyMyAqIGk7CisKKyAgICBpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcChhcmd2WzFdLCAiLXQiKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICBTVEFSVF9USU1FUjsKKyAgICAgICAgICAgIGNoZWNrc3VtID0gYXZfYWRsZXIzMl91cGRhdGUoMSwgZGF0YSwgTEVOKTsKKyAgICAgICAgICAgIFNUT1BfVElNRVIoImFkbGVyIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjaGVja3N1bSA9IGF2X2FkbGVyMzJfdXBkYXRlKDEsIGRhdGEsIExFTik7CisgICAgfQorCisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiVYIChleHBlY3RlZCA1MEU2RTUwOClcbiIsIGNoZWNrc3VtKTsKKyAgICByZXR1cm4gY2hlY2tzdW0gPT0gMHg1MGU2ZTUwOCA/IDAgOiAxOworfQorLy8gTENPVl9FWENMX1NUT1AKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hZGxlcjMyLmggYi9mZm1wZWcvbGliYXZ1dGlsL2FkbGVyMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGM2OWVjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hZGxlcjMyLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBNYW5zIFJ1bGxnYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0FETEVSMzJfSAorI2RlZmluZSBBVlVUSUxfQURMRVIzMl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisKKy8qKgorICogQGZpbGUKKyAqIFB1YmxpYyBoZWFkZXIgZm9yIGxpYmF2dXRpbCBBZGxlcjMyIGhhc2hlcgorICoKKyAqIEBkZWZncm91cCBsYXZ1X2FkbGVyMzIgQWRsZXIzMgorICogQGluZ3JvdXAgbGF2dV9jcnlwdG8KKyAqIEB7CisgKi8KKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIEFkbGVyMzIgY2hlY2tzdW0gb2YgYSBidWZmZXIuCisgKgorICogUGFzc2luZyB0aGUgcmV0dXJuIHZhbHVlIHRvIGEgc3Vic2VxdWVudCBhdl9hZGxlcjMyX3VwZGF0ZSgpIGNhbGwKKyAqIGFsbG93cyB0aGUgY2hlY2tzdW0gb2YgbXVsdGlwbGUgYnVmZmVycyB0byBiZSBjYWxjdWxhdGVkIGFzIHRob3VnaAorICogdGhleSB3ZXJlIGNvbmNhdGVuYXRlZC4KKyAqCisgKiBAcGFyYW0gYWRsZXIgaW5pdGlhbCBjaGVja3N1bSB2YWx1ZQorICogQHBhcmFtIGJ1ZiAgIHBvaW50ZXIgdG8gaW5wdXQgYnVmZmVyCisgKiBAcGFyYW0gbGVuICAgc2l6ZSBvZiBpbnB1dCBidWZmZXIKKyAqIEByZXR1cm4gICAgICB1cGRhdGVkIGNoZWNrc3VtCisgKi8KK3Vuc2lnbmVkIGxvbmcgYXZfYWRsZXIzMl91cGRhdGUodW5zaWduZWQgbG9uZyBhZGxlciwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuKSBhdl9wdXJlOworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9BRExFUjMyX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYWVzLmMgYi9mZm1wZWcvbGliYXZ1dGlsL2Flcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOGZiODEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2Flcy5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDA3IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogc29tZSBvcHRpbWl6YXRpb24gaWRlYXMgZnJvbSBhZXMxMjguYyBieSBSZWltYXIgRG9lZmZpbmdlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiYWVzLmgiCisjaW5jbHVkZSAiaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKwordHlwZWRlZiB1bmlvbiB7CisgICAgdWludDY0X3QgdTY0WzJdOworICAgIHVpbnQzMl90IHUzMls0XTsKKyAgICB1aW50OF90IHU4eDRbNF1bNF07CisgICAgdWludDhfdCB1OFsxNl07Cit9IGF2X2Flc19ibG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgQVZBRVMgeworICAgIC8vIE5vdGU6IHJvdW5kX2tleVsxNl0gaXMgYWNjZXNzZWQgaW4gdGhlIGluaXQgY29kZSwgYnV0IHRoaXMgb25seQorICAgIC8vIG92ZXJ3cml0ZXMgc3RhdGUsIHdoaWNoIGRvZXMgbm90IG1hdHRlciAoc2VlIGFsc28gY29tbWl0IGJhNTU0YzApLgorICAgIGF2X2Flc19ibG9jayByb3VuZF9rZXlbMTVdOworICAgIGF2X2Flc19ibG9jayBzdGF0ZVsyXTsKKyAgICBpbnQgcm91bmRzOworfSBBVkFFUzsKKworY29uc3QgaW50IGF2X2Flc19zaXplPSBzaXplb2YoQVZBRVMpOworCitzdHJ1Y3QgQVZBRVMgKmF2X2Flc19hbGxvYyh2b2lkKQoreworICAgIHJldHVybiBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3QgQVZBRVMpKTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmNvblsxMF0gPSB7CisgIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYKK307CisKK3N0YXRpYyB1aW50OF90ICAgICBzYm94WzI1Nl07CitzdGF0aWMgdWludDhfdCBpbnZfc2JveFsyNTZdOworI2lmIENPTkZJR19TTUFMTAorc3RhdGljIHVpbnQzMl90IGVuY19tdWx0YmxbMV1bMjU2XTsKK3N0YXRpYyB1aW50MzJfdCBkZWNfbXVsdGJsWzFdWzI1Nl07CisjZWxzZQorc3RhdGljIHVpbnQzMl90IGVuY19tdWx0YmxbNF1bMjU2XTsKK3N0YXRpYyB1aW50MzJfdCBkZWNfbXVsdGJsWzRdWzI1Nl07CisjZW5kaWYKKworI2lmIEhBVkVfQklHRU5ESUFOCisjICAgZGVmaW5lIFJPVCh4LCBzKSAoKHggPj4gcykgfCAoeCA8PCAoMzItcykpKQorI2Vsc2UKKyMgICBkZWZpbmUgUk9UKHgsIHMpICgoeCA8PCBzKSB8ICh4ID4+ICgzMi1zKSkpCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGFkZGtleShhdl9hZXNfYmxvY2sgKmRzdCwgY29uc3QgYXZfYWVzX2Jsb2NrICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF2X2Flc19ibG9jayAqcm91bmRfa2V5KQoreworICAgIGRzdC0+dTY0WzBdID0gc3JjLT51NjRbMF0gXiByb3VuZF9rZXktPnU2NFswXTsKKyAgICBkc3QtPnU2NFsxXSA9IHNyYy0+dTY0WzFdIF4gcm91bmRfa2V5LT51NjRbMV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRrZXlfcyhhdl9hZXNfYmxvY2sgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF2X2Flc19ibG9jayAqcm91bmRfa2V5KQoreworICAgIGRzdC0+dTY0WzBdID0gQVZfUk42NChzcmMpICAgICBeIHJvdW5kX2tleS0+dTY0WzBdOworICAgIGRzdC0+dTY0WzFdID0gQVZfUk42NChzcmMgKyA4KSBeIHJvdW5kX2tleS0+dTY0WzFdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRka2V5X2QodWludDhfdCAqZHN0LCBjb25zdCBhdl9hZXNfYmxvY2sgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdl9hZXNfYmxvY2sgKnJvdW5kX2tleSkKK3sKKyAgICBBVl9XTjY0KGRzdCwgICAgIHNyYy0+dTY0WzBdIF4gcm91bmRfa2V5LT51NjRbMF0pOworICAgIEFWX1dONjQoZHN0ICsgOCwgc3JjLT51NjRbMV0gXiByb3VuZF9rZXktPnU2NFsxXSk7Cit9CisKK3N0YXRpYyB2b2lkIHN1YnNoaWZ0KGF2X2Flc19ibG9jayBzMFsyXSwgaW50IHMsIGNvbnN0IHVpbnQ4X3QgKmJveCkKK3sKKyAgICBhdl9hZXNfYmxvY2sgKnMxID0gKGF2X2Flc19ibG9jayAqKSAoczBbMF0udTggLSBzKTsKKyAgICBhdl9hZXNfYmxvY2sgKnMzID0gKGF2X2Flc19ibG9jayAqKSAoczBbMF0udTggKyBzKTsKKworICAgIHMwWzBdLnU4WyAwXSA9IGJveFtzMFsxXS51OFsgMF1dOworICAgIHMwWzBdLnU4WyA0XSA9IGJveFtzMFsxXS51OFsgNF1dOworICAgIHMwWzBdLnU4WyA4XSA9IGJveFtzMFsxXS51OFsgOF1dOworICAgIHMwWzBdLnU4WzEyXSA9IGJveFtzMFsxXS51OFsxMl1dOworICAgIHMxWzBdLnU4WyAzXSA9IGJveFtzMVsxXS51OFsgN11dOworICAgIHMxWzBdLnU4WyA3XSA9IGJveFtzMVsxXS51OFsxMV1dOworICAgIHMxWzBdLnU4WzExXSA9IGJveFtzMVsxXS51OFsxNV1dOworICAgIHMxWzBdLnU4WzE1XSA9IGJveFtzMVsxXS51OFsgM11dOworICAgIHMwWzBdLnU4WyAyXSA9IGJveFtzMFsxXS51OFsxMF1dOworICAgIHMwWzBdLnU4WzEwXSA9IGJveFtzMFsxXS51OFsgMl1dOworICAgIHMwWzBdLnU4WyA2XSA9IGJveFtzMFsxXS51OFsxNF1dOworICAgIHMwWzBdLnU4WzE0XSA9IGJveFtzMFsxXS51OFsgNl1dOworICAgIHMzWzBdLnU4WyAxXSA9IGJveFtzM1sxXS51OFsxM11dOworICAgIHMzWzBdLnU4WzEzXSA9IGJveFtzM1sxXS51OFsgOV1dOworICAgIHMzWzBdLnU4WyA5XSA9IGJveFtzM1sxXS51OFsgNV1dOworICAgIHMzWzBdLnU4WyA1XSA9IGJveFtzM1sxXS51OFsgMV1dOworfQorCitzdGF0aWMgaW5saW5lIGludCBtaXhfY29yZSh1aW50MzJfdCBtdWx0YmxbXVsyNTZdLCBpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCl7CisjaWYgQ09ORklHX1NNQUxMCisgICAgcmV0dXJuIG11bHRibFswXVthXSBeIFJPVChtdWx0YmxbMF1bYl0sIDgpIF4gUk9UKG11bHRibFswXVtjXSwgMTYpIF4gUk9UKG11bHRibFswXVtkXSwgMjQpOworI2Vsc2UKKyAgICByZXR1cm4gbXVsdGJsWzBdW2FdIF4gbXVsdGJsWzFdW2JdIF4gbXVsdGJsWzJdW2NdIF4gbXVsdGJsWzNdW2RdOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtaXgoYXZfYWVzX2Jsb2NrIHN0YXRlWzJdLCB1aW50MzJfdCBtdWx0YmxbXVsyNTZdLCBpbnQgczEsIGludCBzMyl7CisgICAgdWludDhfdCAoKnNyYylbNF0gPSBzdGF0ZVsxXS51OHg0OworICAgIHN0YXRlWzBdLnUzMlswXSA9IG1peF9jb3JlKG11bHRibCwgc3JjWzBdWzBdLCBzcmNbczEgIF1bMV0sIHNyY1syXVsyXSwgc3JjW3MzICBdWzNdKTsKKyAgICBzdGF0ZVswXS51MzJbMV0gPSBtaXhfY29yZShtdWx0YmwsIHNyY1sxXVswXSwgc3JjW3MzLTFdWzFdLCBzcmNbM11bMl0sIHNyY1tzMS0xXVszXSk7CisgICAgc3RhdGVbMF0udTMyWzJdID0gbWl4X2NvcmUobXVsdGJsLCBzcmNbMl1bMF0sIHNyY1tzMyAgXVsxXSwgc3JjWzBdWzJdLCBzcmNbczEgIF1bM10pOworICAgIHN0YXRlWzBdLnUzMlszXSA9IG1peF9jb3JlKG11bHRibCwgc3JjWzNdWzBdLCBzcmNbczEtMV1bMV0sIHNyY1sxXVsyXSwgc3JjW3MzLTFdWzNdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0KEFWQUVTICphLCBpbnQgcywgY29uc3QgdWludDhfdCAqc2JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtdWx0YmxbXVsyNTZdKQoreworICAgIGludCByOworCisgICAgZm9yIChyID0gYS0+cm91bmRzIC0gMTsgciA+IDA7IHItLSkgeworICAgICAgICBtaXgoYS0+c3RhdGUsIG11bHRibCwgMyAtIHMsIDEgKyBzKTsKKyAgICAgICAgYWRka2V5KCZhLT5zdGF0ZVsxXSwgJmEtPnN0YXRlWzBdLCAmYS0+cm91bmRfa2V5W3JdKTsKKyAgICB9CisKKyAgICBzdWJzaGlmdCgmYS0+c3RhdGVbMF0sIHMsIHNib3gpOworfQorCit2b2lkIGF2X2Flc19jcnlwdChBVkFFUyAqYSwgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIHVpbnQ4X3QgKml2LCBpbnQgZGVjcnlwdCkKK3sKKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICBhZGRrZXlfcygmYS0+c3RhdGVbMV0sIHNyYywgJmEtPnJvdW5kX2tleVthLT5yb3VuZHNdKTsKKyAgICAgICAgaWYgKGRlY3J5cHQpIHsKKyAgICAgICAgICAgIGNyeXB0KGEsIDAsIGludl9zYm94LCBkZWNfbXVsdGJsKTsKKyAgICAgICAgICAgIGlmIChpdikgeworICAgICAgICAgICAgICAgIGFkZGtleV9zKCZhLT5zdGF0ZVswXSwgaXYsICZhLT5zdGF0ZVswXSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGl2LCBzcmMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZGtleV9kKGRzdCwgJmEtPnN0YXRlWzBdLCAmYS0+cm91bmRfa2V5WzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpdikKKyAgICAgICAgICAgICAgICBhZGRrZXlfcygmYS0+c3RhdGVbMV0sIGl2LCAmYS0+c3RhdGVbMV0pOworICAgICAgICAgICAgY3J5cHQoYSwgMiwgc2JveCwgZW5jX211bHRibCk7CisgICAgICAgICAgICBhZGRrZXlfZChkc3QsICZhLT5zdGF0ZVswXSwgJmEtPnJvdW5kX2tleVswXSk7CisgICAgICAgICAgICBpZiAoaXYpCisgICAgICAgICAgICAgICAgbWVtY3B5KGl2LCBkc3QsIDE2KTsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gMTY7CisgICAgICAgIGRzdCArPSAxNjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfbXVsdGJsMih1aW50MzJfdCB0YmxbXVsyNTZdLCBjb25zdCBpbnQgY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpsb2c4LCBjb25zdCB1aW50OF90ICphbG9nOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzYm94KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGludCB4ID0gc2JveFtpXTsKKyAgICAgICAgaWYgKHgpIHsKKyAgICAgICAgICAgIGludCBrLCBsLCBtLCBuOworICAgICAgICAgICAgeCA9IGxvZzhbeF07CisgICAgICAgICAgICBrID0gYWxvZzhbeCArIGxvZzhbY1swXV1dOworICAgICAgICAgICAgbCA9IGFsb2c4W3ggKyBsb2c4W2NbMV1dXTsKKyAgICAgICAgICAgIG0gPSBhbG9nOFt4ICsgbG9nOFtjWzJdXV07CisgICAgICAgICAgICBuID0gYWxvZzhbeCArIGxvZzhbY1szXV1dOworICAgICAgICAgICAgdGJsWzBdW2ldID0gQVZfTkUoTUtCRVRBRyhrLGwsbSxuKSwgTUtUQUcoayxsLG0sbikpOworI2lmICFDT05GSUdfU01BTEwKKyAgICAgICAgICAgIHRibFsxXVtpXSA9IFJPVCh0YmxbMF1baV0sIDgpOworICAgICAgICAgICAgdGJsWzJdW2ldID0gUk9UKHRibFswXVtpXSwgMTYpOworICAgICAgICAgICAgdGJsWzNdW2ldID0gUk9UKHRibFswXVtpXSwgMjQpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHRoaXMgaXMgYmFzZWQgb24gdGhlIHJlZmVyZW5jZSBBRVMgY29kZSBieSBQYXVsbyBCYXJyZXRvIGFuZCBWaW5jZW50IFJpam1lbgoraW50IGF2X2Flc19pbml0KEFWQUVTICphLCBjb25zdCB1aW50OF90ICprZXksIGludCBrZXlfYml0cywgaW50IGRlY3J5cHQpCit7CisgICAgaW50IGksIGosIHQsIHJjb25wb2ludGVyID0gMDsKKyAgICB1aW50OF90IHRrWzhdWzRdOworICAgIGludCBLQyA9IGtleV9iaXRzID4+IDU7CisgICAgaW50IHJvdW5kcyA9IEtDICsgNjsKKyAgICB1aW50OF90IGxvZzhbMjU2XTsKKyAgICB1aW50OF90IGFsb2c4WzUxMl07CisKKyAgICBpZiAoIWVuY19tdWx0YmxbRkZfQVJSQVlfRUxFTVMoZW5jX211bHRibCktMV1bRkZfQVJSQVlfRUxFTVMoZW5jX211bHRibFswXSktMV0pIHsKKyAgICAgICAgaiA9IDE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTU7IGkrKykgeworICAgICAgICAgICAgYWxvZzhbaV0gPSBhbG9nOFtpICsgMjU1XSA9IGo7CisgICAgICAgICAgICBsb2c4W2pdID0gaTsKKyAgICAgICAgICAgIGogXj0gaiArIGo7CisgICAgICAgICAgICBpZiAoaiA+IDI1NSkKKyAgICAgICAgICAgICAgICBqIF49IDB4MTFCOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgICAgaiA9IGkgPyBhbG9nOFsyNTUgLSBsb2c4W2ldXSA6IDA7CisgICAgICAgICAgICBqIF49IChqIDw8IDEpIF4gKGogPDwgMikgXiAoaiA8PCAzKSBeIChqIDw8IDQpOworICAgICAgICAgICAgaiA9IChqIF4gKGogPj4gOCkgXiA5OSkgJiAyNTU7CisgICAgICAgICAgICBpbnZfc2JveFtqXSA9IGk7CisgICAgICAgICAgICBzYm94W2ldID0gajsKKyAgICAgICAgfQorICAgICAgICBpbml0X211bHRibDIoZGVjX211bHRibCwgKGNvbnN0IGludFs0XSkgeyAweGUsIDB4OSwgMHhkLCAweGIgfSwKKyAgICAgICAgICAgICAgICAgICAgIGxvZzgsIGFsb2c4LCBpbnZfc2JveCk7CisgICAgICAgIGluaXRfbXVsdGJsMihlbmNfbXVsdGJsLCAoY29uc3QgaW50WzRdKSB7IDB4MiwgMHgxLCAweDEsIDB4MyB9LAorICAgICAgICAgICAgICAgICAgICAgbG9nOCwgYWxvZzgsIHNib3gpOworICAgIH0KKworICAgIGlmIChrZXlfYml0cyAhPSAxMjggJiYga2V5X2JpdHMgIT0gMTkyICYmIGtleV9iaXRzICE9IDI1NikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYS0+cm91bmRzID0gcm91bmRzOworCisgICAgbWVtY3B5KHRrLCBrZXksIEtDICogNCk7CisgICAgbWVtY3B5KGEtPnJvdW5kX2tleVswXS51OCwga2V5LCBLQyAqIDQpOworCisgICAgZm9yICh0ID0gS0MgKiA0OyB0IDwgKHJvdW5kcyArIDEpICogMTY7IHQgKz0gS0MgKiA0KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICB0a1swXVtpXSBePSBzYm94W3RrW0tDIC0gMV1bKGkgKyAxKSAmIDNdXTsKKyAgICAgICAgdGtbMF1bMF0gXj0gcmNvbltyY29ucG9pbnRlcisrXTsKKworICAgICAgICBmb3IgKGogPSAxOyBqIDwgS0M7IGorKykgeworICAgICAgICAgICAgaWYgKEtDICE9IDggfHwgaiAhPSBLQyA+PiAxKQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHRrW2pdW2ldIF49IHRrW2ogLSAxXVtpXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB0a1tqXVtpXSBePSBzYm94W3RrW2ogLSAxXVtpXV07CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoYS0+cm91bmRfa2V5WzBdLnU4ICsgdCwgdGssIEtDICogNCk7CisgICAgfQorCisgICAgaWYgKGRlY3J5cHQpIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IHJvdW5kczsgaSsrKSB7CisgICAgICAgICAgICBhdl9hZXNfYmxvY2sgdG1wWzNdOworICAgICAgICAgICAgdG1wWzJdID0gYS0+cm91bmRfa2V5W2ldOworICAgICAgICAgICAgc3Vic2hpZnQoJnRtcFsxXSwgMCwgc2JveCk7CisgICAgICAgICAgICBtaXgodG1wLCBkZWNfbXVsdGJsLCAxLCAzKTsKKyAgICAgICAgICAgIGEtPnJvdW5kX2tleVtpXSA9IHRtcFswXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocm91bmRzICsgMSkgPj4gMTsgaSsrKSB7CisgICAgICAgICAgICBGRlNXQVAoYXZfYWVzX2Jsb2NrLCBhLT5yb3VuZF9rZXlbaV0sIGEtPnJvdW5kX2tleVtyb3VuZHMtaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBURVNUCisvLyBMQ09WX0VYQ0xfU1RBUlQKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJsZmcuaCIKKyNpbmNsdWRlICJsb2cuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCBpLCBqOworICAgIEFWQUVTIGI7CisgICAgdWludDhfdCBya2V5WzJdWzE2XSA9IHsKKyAgICAgICAgeyAwIH0sCisgICAgICAgIHsgMHgxMCwgMHhhNSwgMHg4OCwgMHg2OSwgMHhkNywgMHg0YiwgMHhlNSwgMHhhMywKKyAgICAgICAgICAweDc0LCAweGNmLCAweDg2LCAweDdjLCAweGZiLCAweDQ3LCAweDM4LCAweDU5IH0KKyAgICB9OworICAgIHVpbnQ4X3QgcHRbMTZdLCBycHRbMl1bMTZdPSB7CisgICAgICAgIHsgMHg2YSwgMHg4NCwgMHg4NiwgMHg3YywgMHhkNywgMHg3ZSwgMHgxMiwgMHhhZCwKKyAgICAgICAgICAweDA3LCAweGVhLCAweDFiLCAweGU4LCAweDk1LCAweGM1LCAweDNmLCAweGEzIH0sCisgICAgICAgIHsgMCB9CisgICAgfTsKKyAgICB1aW50OF90IHJjdFsyXVsxNl09IHsKKyAgICAgICAgeyAweDczLCAweDIyLCAweDgxLCAweGMwLCAweGEwLCAweGFhLCAweGI4LCAweGY3LAorICAgICAgICAgIDB4YTUsIDB4NGEsIDB4MGMsIDB4NjcsIDB4YTAsIDB4YzQsIDB4NWUsIDB4Y2YgfSwKKyAgICAgICAgeyAweDZkLCAweDI1LCAweDFlLCAweDY5LCAweDQ0LCAweGIwLCAweDUxLCAweGUwLAorICAgICAgICAgIDB4NGUsIDB4YWEsIDB4NmYsIDB4YjQsIDB4ZGIsIDB4ZjcsIDB4ODQsIDB4NjUgfQorICAgIH07CisgICAgdWludDhfdCB0ZW1wWzE2XTsKKyAgICBpbnQgZXJyID0gMDsKKworICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgYXZfYWVzX2luaXQoJmIsIHJrZXlbaV0sIDEyOCwgMSk7CisgICAgICAgIGF2X2Flc19jcnlwdCgmYiwgdGVtcCwgcmN0W2ldLCAxLCBOVUxMLCAxKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKyAgICAgICAgICAgIGlmIChycHRbaV1bal0gIT0gdGVtcFtqXSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZCAlMDJYICUwMlhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGosIHJwdFtpXVtqXSwgdGVtcFtqXSk7CisgICAgICAgICAgICAgICAgZXJyID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhcmdjID4gMSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItdCIpKSB7CisgICAgICAgIEFWQUVTIGFlLCBhZDsKKyAgICAgICAgQVZMRkcgcHJuZzsKKworICAgICAgICBhdl9hZXNfaW5pdCgmYWUsICJQST0zLjE0MTU5MjY1NC4uIiwgMTI4LCAwKTsKKyAgICAgICAgYXZfYWVzX2luaXQoJmFkLCAiUEk9My4xNDE1OTI2NTQuLiIsIDEyOCwgMSk7CisgICAgICAgIGF2X2xmZ19pbml0KCZwcm5nLCAxKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKyAgICAgICAgICAgICAgICBwdFtqXSA9IGF2X2xmZ19nZXQoJnBybmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNUQVJUX1RJTUVSOworICAgICAgICAgICAgICAgIGF2X2Flc19jcnlwdCgmYWUsIHRlbXAsIHB0LCAxLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIShpICYgKGkgLSAxKSkpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFswXSwgdGVtcFs1XSwgdGVtcFsxMF0sIHRlbXBbMTVdKTsKKyAgICAgICAgICAgICAgICBhdl9hZXNfY3J5cHQoJmFkLCB0ZW1wLCB0ZW1wLCAxLCBOVUxMLCAxKTsKKyAgICAgICAgICAgICAgICBTVE9QX1RJTUVSKCJhZXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHB0W2pdICE9IHRlbXBbal0pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkICVkICUwMlggJTAyWFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIHB0W2pdLCB0ZW1wW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKy8vIExDT1ZfRVhDTF9TVE9QCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYWVzLmggYi9mZm1wZWcvbGliYXZ1dGlsL2Flcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZWZiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2Flcy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDcgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQUVTX0gKKyNkZWZpbmUgQVZVVElMX0FFU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKy8qKgorICogQGRlZmdyb3VwIGxhdnVfYWVzIEFFUworICogQGluZ3JvdXAgbGF2dV9jcnlwdG8KKyAqIEB7CisgKi8KKworZXh0ZXJuIGNvbnN0IGludCBhdl9hZXNfc2l6ZTsKKworc3RydWN0IEFWQUVTOworCisvKioKKyAqIEFsbG9jYXRlIGFuIEFWQUVTIGNvbnRleHQuCisgKi8KK3N0cnVjdCBBVkFFUyAqYXZfYWVzX2FsbG9jKHZvaWQpOworCisvKioKKyAqIEluaXRpYWxpemUgYW4gQVZBRVMgY29udGV4dC4KKyAqIEBwYXJhbSBrZXlfYml0cyAxMjgsIDE5MiBvciAyNTYKKyAqIEBwYXJhbSBkZWNyeXB0IDAgZm9yIGVuY3J5cHRpb24sIDEgZm9yIGRlY3J5cHRpb24KKyAqLworaW50IGF2X2Flc19pbml0KHN0cnVjdCBBVkFFUyAqYSwgY29uc3QgdWludDhfdCAqa2V5LCBpbnQga2V5X2JpdHMsIGludCBkZWNyeXB0KTsKKworLyoqCisgKiBFbmNyeXB0IG9yIGRlY3J5cHQgYSBidWZmZXIgdXNpbmcgYSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGNvbnRleHQuCisgKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIDE2IGJ5dGUgYmxvY2tzCisgKiBAcGFyYW0gZHN0IGRlc3RpbmF0aW9uIGFycmF5LCBjYW4gYmUgZXF1YWwgdG8gc3JjCisgKiBAcGFyYW0gc3JjIHNvdXJjZSBhcnJheSwgY2FuIGJlIGVxdWFsIHRvIGRzdAorICogQHBhcmFtIGl2IGluaXRpYWxpemF0aW9uIHZlY3RvciBmb3IgQ0JDIG1vZGUsIGlmIE5VTEwgdGhlbiBFQ0Igd2lsbCBiZSB1c2VkCisgKiBAcGFyYW0gZGVjcnlwdCAwIGZvciBlbmNyeXB0aW9uLCAxIGZvciBkZWNyeXB0aW9uCisgKi8KK3ZvaWQgYXZfYWVzX2NyeXB0KHN0cnVjdCBBVkFFUyAqYSwgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBjb3VudCwgdWludDhfdCAqaXYsIGludCBkZWNyeXB0KTsKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBVlVUSUxfQUVTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXJtL01ha2VmaWxlIGIvZmZtcGVnL2xpYmF2dXRpbC9hcm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhNDRiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXJtL01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorT0JKUyArPSBhcm0vY3B1Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhcm0vZmxvYXRfZHNwX2luaXRfYXJtLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitWRlAtT0JKUyArPSBhcm0vZmxvYXRfZHNwX2luaXRfdmZwLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhcm0vZmxvYXRfZHNwX3ZmcC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK05FT04tT0JKUyArPSBhcm0vZmxvYXRfZHNwX2luaXRfbmVvbi5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICBhcm0vZmxvYXRfZHNwX25lb24ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXJtL2FzbS5TIGIvZmZtcGVnL2xpYmF2dXRpbC9hcm0vYXNtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1NTljZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXJtL2FzbS5TCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZmRlZiBfX0VMRl9fCisjICAgZGVmaW5lIEVMRgorI2Vsc2UKKyMgICBkZWZpbmUgRUxGIEAKKyNlbmRpZgorCisjaWYgQ09ORklHX1RIVU1CCisjICAgZGVmaW5lIEEgQAorIyAgIGRlZmluZSBUCisjZWxzZQorIyAgIGRlZmluZSBBCisjICAgZGVmaW5lIFQgQAorI2VuZGlmCisKKyNpZiBIQVZFX0FTX0ZVTkMKKyMgICBkZWZpbmUgRlVOQworI2Vsc2UKKyMgICBkZWZpbmUgRlVOQyBACisjZW5kaWYKKworI2lmICAgSEFWRV9ORU9OCisgICAgICAgIC5hcmNoICAgICAgICAgICBhcm12Ny1hCisjZWxpZiBIQVZFX0FSTVY2VDIKKyAgICAgICAgLmFyY2ggICAgICAgICAgIGFybXY2dDIKKyNlbGlmIEhBVkVfQVJNVjYKKyAgICAgICAgLmFyY2ggICAgICAgICAgIGFybXY2CisjZWxpZiBIQVZFX0FSTVY1VEUKKyAgICAgICAgLmFyY2ggICAgICAgICAgIGFybXY1dGUKKyNlbmRpZgorCisjaWYgICBIQVZFX05FT04KKyAgICAgICAgLmZwdSAgICAgICAgICAgIG5lb24KKyNlbGlmIEhBVkVfVkZQCisgICAgICAgIC5mcHUgICAgICAgICAgICB2ZnAKKyNlbmRpZgorCisgICAgICAgIC5zeW50YXggdW5pZmllZAorVCAgICAgICAudGh1bWIKK0VMRiAgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxICAgICAgICAgICBAIFRhZ19BQklfYWxpZ25fcHJlc2VydmVkCitFTEYgICAgIC5zZWN0aW9uIC5ub3RlLkdOVS1zdGFjaywiIiwlcHJvZ2JpdHMgQCBNYXJrIHN0YWNrIGFzIG5vbi1leGVjdXRhYmxlCisKKy5tYWNybyAgZnVuY3Rpb24gbmFtZSwgZXhwb3J0PTAsIGFsaWduPTIKKyAgICAgICAgLnNldCAgICAgICAgICAgIC5McGljX2lkeCwgMAorICAgICAgICAuc2V0ICAgICAgICAgICAgLkxwaWNfZ3AsIDAKKyAgICAubWFjcm8gZW5kZnVuYworICAgICAgLmlmIC5McGljX2lkeAorICAgICAgICAuYWxpZ24gICAgICAgICAgMgorICAgICAgICAuYWx0bWFjcm8KKyAgICAgICAgcHV0X3BpYyAgICAgICAgICUoLkxwaWNfaWR4IC0gMSkKKyAgICAgICAgLm5vYWx0bWFjcm8KKyAgICAgIC5lbmRpZgorRUxGICAgICAuc2l6ZSAgIFxuYW1lLCAuIC0gXG5hbWUKK0ZVTkMgICAgLmVuZGZ1bmMKKyAgICAgICAgLnB1cmdlbSBlbmRmdW5jCisgICAgLmVuZG0KKyAgICAgICAgLnRleHQKKyAgICAgICAgLmFsaWduICAgICAgICAgIFxhbGlnbgorICAgIC5pZiBcZXhwb3J0CisgICAgICAgIC5nbG9iYWwgRVhURVJOX0FTTVxuYW1lCitFTEYgICAgIC50eXBlICAgRVhURVJOX0FTTVxuYW1lLCAlZnVuY3Rpb24KK0ZVTkMgICAgLmZ1bmMgICBFWFRFUk5fQVNNXG5hbWUKK0VYVEVSTl9BU01cbmFtZToKKyAgICAuZWxzZQorRUxGICAgICAudHlwZSAgIFxuYW1lLCAlZnVuY3Rpb24KK0ZVTkMgICAgLmZ1bmMgICBcbmFtZQorXG5hbWU6CisgICAgLmVuZGlmCisuZW5kbQorCisubWFjcm8gIGNvbnN0ICAgbmFtZSwgYWxpZ249MgorICAgIC5tYWNybyBlbmRjb25zdAorRUxGICAgICAuc2l6ZSAgIFxuYW1lLCAuIC0gXG5hbWUKKyAgICAgICAgLnB1cmdlbSBlbmRjb25zdAorICAgIC5lbmRtCisgICAgICAgIC5zZWN0aW9uICAgICAgICAucm9kYXRhCisgICAgICAgIC5hbGlnbiAgICAgICAgICBcYWxpZ24KK1xuYW1lOgorLmVuZG0KKworI2lmICFIQVZFX0FSTVY2VDJfRVhURVJOQUwKKy5tYWNybyAgbW92dyAgICByZCwgdmFsCisgICAgICAgIG1vdiAgICAgXHJkLCBcdmFsICYgIDI1NQorICAgICAgICBvcnIgICAgIFxyZCwgXHZhbCAmIH4yNTUKKy5lbmRtCisjZW5kaWYKKworLm1hY3JvICBtb3YzMiAgIHJkLCB2YWwKKyNpZiBIQVZFX0FSTVY2VDJfRVhURVJOQUwKKyAgICAgICAgbW92dyAgICAgICAgICAgIFxyZCwgIyhcdmFsKSAmIDB4ZmZmZgorICAgIC5pZiAoXHZhbCkgPj4gMTYKKyAgICAgICAgbW92dCAgICAgICAgICAgIFxyZCwgIyhcdmFsKSA+PiAxNgorICAgIC5lbmRpZgorI2Vsc2UKKyAgICAgICAgbGRyICAgICAgICAgICAgIFxyZCwgPVx2YWwKKyNlbmRpZgorLmVuZG0KKworLm1hY3JvICBwdXRfcGljICAgICAgICAgbnVtCisgICAgICAgIHB1dF9waWNfXG51bQorLmVuZG0KKworLm1hY3JvICBkb19kZWZfcGljICAgICAgbnVtLCB2YWwsIGxhYmVsCisgICAgLm1hY3JvIHB1dF9waWNfXG51bQorICAgICAgLmlmIFxudW0KKyAgICAgICAgLmFsdG1hY3JvCisgICAgICAgIHB1dF9waWMgICAgICAgICAlKFxudW0gLSAxKQorICAgICAgICAubm9hbHRtYWNybworICAgICAgLmVuZGlmCitcbGFiZWw6IC53b3JkICAgICAgICAgICBcdmFsCisgICAgICAgIC5wdXJnZW0gICAgICAgICBwdXRfcGljX1xudW0KKyAgICAuZW5kbQorLmVuZG0KKworLm1hY3JvICBkZWZfcGljICAgICAgICAgdmFsLCBsYWJlbAorICAgICAgICAuYWx0bWFjcm8KKyAgICAgICAgZG9fZGVmX3BpYyAgICAgICUuTHBpY19pZHgsIFx2YWwsIFxsYWJlbAorICAgICAgICAubm9hbHRtYWNybworICAgICAgICAuc2V0ICAgICAgICAgICAgLkxwaWNfaWR4LCAuTHBpY19pZHggKyAxCisuZW5kbQorCisubWFjcm8gIGxkcGljICAgICAgICAgICByZCwgIHZhbCwgaW5kaXI9MAorICAgICAgICBsZHIgICAgICAgICAgICAgXHJkLCAuTHBpY29mZlxACisuTHBpY1xAOgorICAgIC5pZiBcaW5kaXIKK0EgICAgICAgbGRyICAgICAgICAgICAgIFxyZCwgW3BjLCBccmRdCitUICAgICAgIGFkZCAgICAgICAgICAgICBccmQsIHBjCitUICAgICAgIGxkciAgICAgICAgICAgICBccmQsIFtccmRdCisgICAgLmVsc2UKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxyZCwgcGMKKyAgICAuZW5kaWYKKyAgICAgICAgZGVmX3BpYyAgICAgICAgIFx2YWwgLSAoLkxwaWNcQCArICg4ID4+IENPTkZJR19USFVNQikpLCAuTHBpY29mZlxACisuZW5kbQorCisubWFjcm8gIG1vdnJlbCByZCwgdmFsCisjaWYgQ09ORklHX1BJQworICAgICAgICBsZHBpYyAgICAgICAgICAgXHJkLCBcdmFsCisjZWxpZiBIQVZFX0FSTVY2VDJfRVhURVJOQUwgJiYgIWRlZmluZWQoX19BUFBMRV9fKQorICAgICAgICBtb3Z3ICAgICAgICAgICAgXHJkLCAjOmxvd2VyMTY6XHZhbAorICAgICAgICBtb3Z0ICAgICAgICAgICAgXHJkLCAjOnVwcGVyMTY6XHZhbAorI2Vsc2UKKyAgICAgICAgbGRyICAgICAgICAgICAgIFxyZCwgPVx2YWwKKyNlbmRpZgorLmVuZG0KKworLm1hY3JvICBtb3ZyZWx4ICAgICAgICAgcmQsICB2YWwsIGdwCisjaWYgQ09ORklHX1BJQyAmJiBkZWZpbmVkKF9fRUxGX18pCisgICAgLmlmbmIgXGdwCisgICAgICAuaWYgLkxwaWNfZ3AKKyAgICAgICAgLnVucmVxICAgICAgICAgIGdwCisgICAgICAuZW5kaWYKKyAgICAgICAgZ3AgICAgICAucmVxICAgIFxncAorICAgICAgICBsZHBpYyAgICAgICAgICAgZ3AsICBfR0xPQkFMX09GRlNFVF9UQUJMRV8KKyAgICAuZWxzZWlmICEuTHBpY19ncAorICAgICAgICBncCAgICAgIC5yZXEgICAgcjEyCisgICAgICAgIGxkcGljICAgICAgICAgICBncCwgIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXworICAgIC5lbmRpZgorICAgICAgICAuc2V0ICAgICAgICAgICAgLkxwaWNfZ3AsIDEKKyAgICAgICAgbGRyICAgICAgICAgICAgIFxyZCwgLkxwaWNvZmZcQAorICAgICAgICBsZHIgICAgICAgICAgICAgXHJkLCBbZ3AsIFxyZF0KKyAgICAgICAgZGVmX3BpYyAgICAgICAgIFx2YWwoR09UKSwgLkxwaWNvZmZcQAorI2VsaWYgQ09ORklHX1BJQyAmJiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAgICAgbGRwaWMgICAgICAgICAgIFxyZCwgLkxwaWNcQCwgaW5kaXI9MQorICAgICAgICAubm9uX2xhenlfc3ltYm9sX3BvaW50ZXIKKy5McGljXEA6CisgICAgICAgIC5pbmRpcmVjdF9zeW1ib2wgXHZhbAorICAgICAgICAud29yZCAgICAgICAgICAgMAorICAgICAgICAudGV4dAorI2Vsc2UKKyAgICAgICAgbW92cmVsICAgICAgICAgIFxyZCwgXHZhbAorI2VuZGlmCisuZW5kbQorCisubWFjcm8gIGFkZF9zaCAgICAgICAgICByZCwgIHJuLCAgcm0sICBzaDp2YXJhcmcKK0EgICAgICAgYWRkICAgICAgICAgICAgIFxyZCwgXHJuLCBccm0sIFxzaAorVCAgICAgICBtb3YgICAgICAgICAgICAgXHJtLCBccm0sIFxzaAorVCAgICAgICBhZGQgICAgICAgICAgICAgXHJkLCBccm4sIFxybQorLmVuZG0KKworLm1hY3JvICBsZHJfcHJlICAgICAgICAgcnQsICBybiwgIHJtOnZhcmFyZworQSAgICAgICBsZHIgICAgICAgICAgICAgXHJ0LCBbXHJuLCBccm1dIQorVCAgICAgICBhZGQgICAgICAgICAgICAgXHJuLCBccm4sIFxybQorVCAgICAgICBsZHIgICAgICAgICAgICAgXHJ0LCBbXHJuXQorLmVuZG0KKworLm1hY3JvICBsZHJfZHByZSAgICAgICAgcnQsICBybiwgIHJtOnZhcmFyZworQSAgICAgICBsZHIgICAgICAgICAgICAgXHJ0LCBbXHJuLCAtXHJtXSEKK1QgICAgICAgc3ViICAgICAgICAgICAgIFxybiwgXHJuLCBccm0KK1QgICAgICAgbGRyICAgICAgICAgICAgIFxydCwgW1xybl0KKy5lbmRtCisKKy5tYWNybyAgbGRyX25yZWcgICAgICAgIHJ0LCAgcm4sICBybTp2YXJhcmcKK0EgICAgICAgbGRyICAgICAgICAgICAgIFxydCwgW1xybiwgLVxybV0KK1QgICAgICAgc3ViICAgICAgICAgICAgIFxydCwgXHJuLCBccm0KK1QgICAgICAgbGRyICAgICAgICAgICAgIFxydCwgW1xydF0KKy5lbmRtCisKKy5tYWNybyAgbGRyX3Bvc3QgICAgICAgIHJ0LCAgcm4sICBybTp2YXJhcmcKK0EgICAgICAgbGRyICAgICAgICAgICAgIFxydCwgW1xybl0sIFxybQorVCAgICAgICBsZHIgICAgICAgICAgICAgXHJ0LCBbXHJuXQorVCAgICAgICBhZGQgICAgICAgICAgICAgXHJuLCBccm4sIFxybQorLmVuZG0KKworLm1hY3JvICBsZHJjX3ByZSAgICAgICAgY2MsICBydCwgIHJuLCAgcm06dmFyYXJnCitBICAgICAgIGxkclxjYyAgICAgICAgICBccnQsIFtccm4sIFxybV0hCitUICAgICAgIGl0dCAgICAgICAgICAgICBcY2MKK1QgICAgICAgYWRkXGNjICAgICAgICAgIFxybiwgXHJuLCBccm0KK1QgICAgICAgbGRyXGNjICAgICAgICAgIFxydCwgW1xybl0KKy5lbmRtCisKKy5tYWNybyAgbGRyZF9yZWcgICAgICAgIHJ0LCAgcnQyLCBybiwgIHJtCitBICAgICAgIGxkcmQgICAgICAgICAgICBccnQsIFxydDIsIFtccm4sIFxybV0KK1QgICAgICAgYWRkICAgICAgICAgICAgIFxydCwgXHJuLCBccm0KK1QgICAgICAgbGRyZCAgICAgICAgICAgIFxydCwgXHJ0MiwgW1xydF0KKy5lbmRtCisKKy5tYWNybyAgbGRyZF9wb3N0ICAgICAgIHJ0LCAgcnQyLCBybiwgIHJtCitBICAgICAgIGxkcmQgICAgICAgICAgICBccnQsIFxydDIsIFtccm5dLCBccm0KK1QgICAgICAgbGRyZCAgICAgICAgICAgIFxydCwgXHJ0MiwgW1xybl0KK1QgICAgICAgYWRkICAgICAgICAgICAgIFxybiwgXHJuLCBccm0KKy5lbmRtCisKKy5tYWNybyAgbGRyaF9wcmUgICAgICAgIHJ0LCAgcm4sICBybQorQSAgICAgICBsZHJoICAgICAgICAgICAgXHJ0LCBbXHJuLCBccm1dIQorVCAgICAgICBhZGQgICAgICAgICAgICAgXHJuLCBccm4sIFxybQorVCAgICAgICBsZHJoICAgICAgICAgICAgXHJ0LCBbXHJuXQorLmVuZG0KKworLm1hY3JvICBsZHJoX2RwcmUgICAgICAgcnQsICBybiwgIHJtCitBICAgICAgIGxkcmggICAgICAgICAgICBccnQsIFtccm4sIC1ccm1dIQorVCAgICAgICBzdWIgICAgICAgICAgICAgXHJuLCBccm4sIFxybQorVCAgICAgICBsZHJoICAgICAgICAgICAgXHJ0LCBbXHJuXQorLmVuZG0KKworLm1hY3JvICBsZHJoX3Bvc3QgICAgICAgcnQsICBybiwgIHJtCitBICAgICAgIGxkcmggICAgICAgICAgICBccnQsIFtccm5dLCBccm0KK1QgICAgICAgbGRyaCAgICAgICAgICAgIFxydCwgW1xybl0KK1QgICAgICAgYWRkICAgICAgICAgICAgIFxybiwgXHJuLCBccm0KKy5lbmRtCisKKy5tYWNybyAgbGRyYl9wb3N0ICAgICAgIHJ0LCAgcm4sICBybQorQSAgICAgICBsZHJiICAgICAgICAgICAgXHJ0LCBbXHJuXSwgXHJtCitUICAgICAgIGxkcmIgICAgICAgICAgICBccnQsIFtccm5dCitUICAgICAgIGFkZCAgICAgICAgICAgICBccm4sIFxybiwgXHJtCisuZW5kbQorCisubWFjcm8gIHN0cl9wb3N0ICAgICAgIHJ0LCAgcm4sICBybTp2YXJhcmcKK0EgICAgICAgc3RyICAgICAgICAgICAgIFxydCwgW1xybl0sIFxybQorVCAgICAgICBzdHIgICAgICAgICAgICAgXHJ0LCBbXHJuXQorVCAgICAgICBhZGQgICAgICAgICAgICAgXHJuLCBccm4sIFxybQorLmVuZG0KKworLm1hY3JvICBzdHJiX3Bvc3QgICAgICAgcnQsICBybiwgIHJtOnZhcmFyZworQSAgICAgICBzdHJiICAgICAgICAgICAgXHJ0LCBbXHJuXSwgXHJtCitUICAgICAgIHN0cmIgICAgICAgICAgICBccnQsIFtccm5dCitUICAgICAgIGFkZCAgICAgICAgICAgICBccm4sIFxybiwgXHJtCisuZW5kbQorCisubWFjcm8gIHN0cmRfcG9zdCAgICAgICBydCwgIHJ0Miwgcm4sICBybQorQSAgICAgICBzdHJkICAgICAgICAgICAgXHJ0LCBccnQyLCBbXHJuXSwgXHJtCitUICAgICAgIHN0cmQgICAgICAgICAgICBccnQsIFxydDIsIFtccm5dCitUICAgICAgIGFkZCAgICAgICAgICAgICBccm4sIFxybiwgXHJtCisuZW5kbQorCisubWFjcm8gIHN0cmhfcHJlICAgICAgICBydCwgIHJuLCAgcm0KK0EgICAgICAgc3RyaCAgICAgICAgICAgIFxydCwgW1xybiwgXHJtXSEKK1QgICAgICAgYWRkICAgICAgICAgICAgIFxybiwgXHJuLCBccm0KK1QgICAgICAgc3RyaCAgICAgICAgICAgIFxydCwgW1xybl0KKy5lbmRtCisKKy5tYWNybyAgc3RyaF9kcHJlICAgICAgIHJ0LCAgcm4sICBybQorQSAgICAgICBzdHJoICAgICAgICAgICAgXHJ0LCBbXHJuLCAtXHJtXSEKK1QgICAgICAgc3ViICAgICAgICAgICAgIFxybiwgXHJuLCBccm0KK1QgICAgICAgc3RyaCAgICAgICAgICAgIFxydCwgW1xybl0KKy5lbmRtCisKKy5tYWNybyAgc3RyaF9wb3N0ICAgICAgIHJ0LCAgcm4sICBybQorQSAgICAgICBzdHJoICAgICAgICAgICAgXHJ0LCBbXHJuXSwgXHJtCitUICAgICAgIHN0cmggICAgICAgICAgICBccnQsIFtccm5dCitUICAgICAgIGFkZCAgICAgICAgICAgICBccm4sIFxybiwgXHJtCisuZW5kbQorCisubWFjcm8gIHN0cmhfZHBvc3QgICAgICAgcnQsICBybiwgIHJtCitBICAgICAgIHN0cmggICAgICAgICAgICBccnQsIFtccm5dLCAtXHJtCitUICAgICAgIHN0cmggICAgICAgICAgICBccnQsIFtccm5dCitUICAgICAgIHN1YiAgICAgICAgICAgICBccm4sIFxybiwgXHJtCisuZW5kbQorCisjaWYgSEFWRV9WRlBfQVJHUworRUxGICAgICAuZWFiaV9hdHRyaWJ1dGUgMjgsIDEKKyMgICBkZWZpbmUgVkZQCisjICAgZGVmaW5lIE5PVkZQIEAKKyNlbHNlCisjICAgZGVmaW5lIFZGUCAgIEAKKyMgICBkZWZpbmUgTk9WRlAKKyNlbmRpZgorCisjZGVmaW5lIEdMVUUoYSwgYikgYSAjIyBiCisjZGVmaW5lIEpPSU4oYSwgYikgR0xVRShhLCBiKQorI2RlZmluZSBYKHMpIEpPSU4oRVhURVJOX0FTTSwgcykKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXJtL2Jzd2FwLmggYi9mZm1wZWcvbGliYXZ1dGlsL2FybS9ic3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNWZkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2FybS9ic3dhcC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQVJNX0JTV0FQX0gKKyNkZWZpbmUgQVZVVElMX0FSTV9CU1dBUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorCisjaWZkZWYgX19BUk1DQ19WRVJTSU9OCisKKyNpZiBIQVZFX0FSTVY2CisjZGVmaW5lIGF2X2Jzd2FwMzIgYXZfYnN3YXAzMgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgdWludDMyX3QgYXZfYnN3YXAzMih1aW50MzJfdCB4KQoreworICAgIHJldHVybiBfX3Jldih4KTsKK30KKyNlbmRpZiAvKiBIQVZFX0FSTVY2ICovCisKKyNlbGlmIEhBVkVfSU5MSU5FX0FTTQorCisjaWYgSEFWRV9BUk1WNl9JTkxJTkUKKyNkZWZpbmUgYXZfYnN3YXAxNiBhdl9ic3dhcDE2CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCB1bnNpZ25lZCBhdl9ic3dhcDE2KHVuc2lnbmVkIHgpCit7CisgICAgX19hc21fXygicmV2MTYgJTAsICUwIiA6ICIrciIoeCkpOworICAgIHJldHVybiB4OworfQorI2VuZGlmCisKKyNpZiAhQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoNCw1KQorI2RlZmluZSBhdl9ic3dhcDMyIGF2X2Jzd2FwMzIKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IHVpbnQzMl90IGF2X2Jzd2FwMzIodWludDMyX3QgeCkKK3sKKyNpZiBIQVZFX0FSTVY2X0lOTElORQorICAgIF9fYXNtX18oInJldiAlMCwgJTAiIDogIityIih4KSk7CisjZWxzZQorICAgIHVpbnQzMl90IHQ7CisgICAgX19hc21fXyAoImVvciAlMSwgJTAsICUwLCByb3IgIzE2IFxuXHQiCisgICAgICAgICAgICAgImJpYyAlMSwgJTEsICMweEZGMDAwMCAgIFxuXHQiCisgICAgICAgICAgICAgIm1vdiAlMCwgJTAsIHJvciAjOCAgICAgIFxuXHQiCisgICAgICAgICAgICAgImVvciAlMCwgJTAsICUxLCBsc3IgIzggIFxuXHQiCisgICAgICAgICAgICAgOiAiK3IiKHgpLCAiPSZyIih0KSk7CisjZW5kaWYgLyogSEFWRV9BUk1WNl9JTkxJTkUgKi8KKyAgICByZXR1cm4geDsKK30KKyNlbmRpZiAvKiAhQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoNCw1KSAqLworCisjZW5kaWYgLyogX19BUk1DQ19WRVJTSU9OICovCisKKyNlbmRpZiAvKiBBVlVUSUxfQVJNX0JTV0FQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXJtL2NwdS5jIGIvZmZtcGVnL2xpYmF2dXRpbC9hcm0vY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2ODNlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXJtL2NwdS5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisjZGVmaW5lIENPUkVfRkxBRyhmKSBcCisgICAgKEFWX0NQVV9GTEFHXyAjIyBmICogKEhBVkVfICMjIGYgIyMgX0VYVEVSTkFMIHx8IEhBVkVfICMjIGYgIyMgX0lOTElORSkpCisKKyNkZWZpbmUgQ09SRV9DUFVfRkxBR1MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoQ09SRV9GTEFHKEFSTVY1VEUpIHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgQ09SRV9GTEFHKEFSTVY2KSAgIHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgQ09SRV9GTEFHKEFSTVY2VDIpIHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgQ09SRV9GTEFHKFZGUCkgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgQ09SRV9GTEFHKFZGUFYzKSAgIHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgQ09SRV9GTEFHKE5FT04pKQorCisjaWYgZGVmaW5lZCBfX2xpbnV4X18gfHwgZGVmaW5lZCBfX0FORFJPSURfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKworI2RlZmluZSBBVF9IV0NBUCAgICAgICAgMTYKKworLyogUmVsZXZhbnQgSFdDQVAgdmFsdWVzIGZyb20ga2VybmVsIGhlYWRlcnMgKi8KKyNkZWZpbmUgSFdDQVBfVkZQICAgICAgICgxIDw8IDYpCisjZGVmaW5lIEhXQ0FQX0VEU1AgICAgICAoMSA8PCA3KQorI2RlZmluZSBIV0NBUF9USFVNQkVFICAgKDEgPDwgMTEpCisjZGVmaW5lIEhXQ0FQX05FT04gICAgICAoMSA8PCAxMikKKyNkZWZpbmUgSFdDQVBfVkZQdjMgICAgICgxIDw8IDEzKQorI2RlZmluZSBIV0NBUF9UTFMgICAgICAgKDEgPDwgMTUpCisKK3N0YXRpYyBpbnQgZ2V0X2h3Y2FwKHVpbnQzMl90ICpod2NhcCkKK3sKKyAgICBzdHJ1Y3QgeyB1aW50MzJfdCBhX3R5cGU7IHVpbnQzMl90IGFfdmFsOyB9IGF1eHY7CisgICAgRklMRSAqZiA9IGZvcGVuKCIvcHJvYy9zZWxmL2F1eHYiLCAiciIpOworICAgIGludCBlcnIgPSAtMTsKKworICAgIGlmICghZikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgd2hpbGUgKGZyZWFkKCZhdXh2LCBzaXplb2YoYXV4diksIDEsIGYpID4gMCkgeworICAgICAgICBpZiAoYXV4di5hX3R5cGUgPT0gQVRfSFdDQVApIHsKKyAgICAgICAgICAgICpod2NhcCA9IGF1eHYuYV92YWw7CisgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmY2xvc2UoZik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBnZXRfY3B1aW5mbyh1aW50MzJfdCAqaHdjYXApCit7CisgICAgRklMRSAqZiA9IGZvcGVuKCIvcHJvYy9jcHVpbmZvIiwgInIiKTsKKyAgICBjaGFyIGJ1ZlsyMDBdOworCisgICAgaWYgKCFmKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAqaHdjYXAgPSAwOworICAgIHdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworICAgICAgICBpZiAoYXZfc3Ryc3RhcnQoYnVmLCAiRmVhdHVyZXMiLCBOVUxMKSkgeworICAgICAgICAgICAgaWYgKHN0cnN0cihidWYsICIgZWRzcCAiKSkKKyAgICAgICAgICAgICAgICAqaHdjYXAgfD0gSFdDQVBfRURTUDsKKyAgICAgICAgICAgIGlmIChzdHJzdHIoYnVmLCAiIHRscyAiKSkKKyAgICAgICAgICAgICAgICAqaHdjYXAgfD0gSFdDQVBfVExTOworICAgICAgICAgICAgaWYgKHN0cnN0cihidWYsICIgdGh1bWJlZSAiKSkKKyAgICAgICAgICAgICAgICAqaHdjYXAgfD0gSFdDQVBfVEhVTUJFRTsKKyAgICAgICAgICAgIGlmIChzdHJzdHIoYnVmLCAiIHZmcCAiKSkKKyAgICAgICAgICAgICAgICAqaHdjYXAgfD0gSFdDQVBfVkZQOworICAgICAgICAgICAgaWYgKHN0cnN0cihidWYsICIgdmZwdjMgIikpCisgICAgICAgICAgICAgICAgKmh3Y2FwIHw9IEhXQ0FQX1ZGUHYzOworICAgICAgICAgICAgaWYgKHN0cnN0cihidWYsICIgbmVvbiAiKSB8fCBzdHJzdHIoYnVmLCAiIGFzaW1kICIpKQorICAgICAgICAgICAgICAgICpod2NhcCB8PSBIV0NBUF9ORU9OOworICAgICAgICAgICAgaWYgKHN0cnN0cihidWYsICIgZnAgIikpIC8vIExpc3RlZCBvbiA2NCBiaXQgQVJNdjgga2VybmVscworICAgICAgICAgICAgICAgICpod2NhcCB8PSBIV0NBUF9WRlAgfCBIV0NBUF9WRlB2MzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2dldF9jcHVfZmxhZ3NfYXJtKHZvaWQpCit7CisgICAgaW50IGZsYWdzID0gQ09SRV9DUFVfRkxBR1M7CisgICAgdWludDMyX3QgaHdjYXA7CisKKyAgICBpZiAoZ2V0X2h3Y2FwKCZod2NhcCkgPCAwKQorICAgICAgICBpZiAoZ2V0X2NwdWluZm8oJmh3Y2FwKSA8IDApCisgICAgICAgICAgICByZXR1cm4gZmxhZ3M7CisKKyNkZWZpbmUgY2hlY2tfY2FwKGNhcCwgZmxhZykgZG8geyAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGh3Y2FwICYgSFdDQVBfICMjIGNhcCkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZsYWdzIHw9IEFWX0NQVV9GTEFHXyAjIyBmbGFnOyAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgLyogTm8gZmxhZ3MgZXhwbGljaXRseSBpbmRpY2F0ZSB2NiBvciB2NlQyIHNvIGNoZWNrIG90aGVycyB3aGljaAorICAgICAgIGltcGx5IHN1cHBvcnQuICovCisgICAgY2hlY2tfY2FwKEVEU1AsICAgIEFSTVY1VEUpOworICAgIGNoZWNrX2NhcChUTFMsICAgICBBUk1WNik7CisgICAgY2hlY2tfY2FwKFRIVU1CRUUsIEFSTVY2VDIpOworICAgIGNoZWNrX2NhcChWRlAsICAgICBWRlApOworICAgIGNoZWNrX2NhcChWRlB2MywgICBWRlBWMyk7CisgICAgY2hlY2tfY2FwKE5FT04sICAgIE5FT04pOworCisgICAgLyogVGhlIHY2IGNoZWNrcyBhYm92ZSBhcmUgbm90IHJlbGlhYmxlIHNvIGxldCBoaWdoZXIgZmxhZ3MKKyAgICAgICB0cmlja2xlIGRvd24uICovCisgICAgaWYgKGZsYWdzICYgKEFWX0NQVV9GTEFHX1ZGUFYzIHwgQVZfQ1BVX0ZMQUdfTkVPTikpCisgICAgICAgIGZsYWdzIHw9IEFWX0NQVV9GTEFHX0FSTVY2VDI7CisgICAgZWxzZQorICAgIC8qIFNvbWUgZnVuY3Rpb25zIHVzZSB0aGUgJ3NldGVuZCcgaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgZGVwcmVjYXRlZCBvbiBBUk12OAorICAgICAqIGFuZCBzZXJpYWxpemluZyBvbiBzb21lIEFSTXY3IGNvcmVzLiBUaGlzIGVuc3VyZXMgc3VjaCBmdW5jdGlvbnMKKyAgICAgKiBhcmUgb25seSBlbmFibGVkIG9uIEFSTXY2LiAqLworICAgICAgICBmbGFncyB8PSBBVl9DUFVfRkxBR19TRVRFTkQ7CisKKyAgICBpZiAoZmxhZ3MgJiBBVl9DUFVfRkxBR19BUk1WNlQyKQorICAgICAgICBmbGFncyB8PSBBVl9DUFVfRkxBR19BUk1WNjsKKworICAgIHJldHVybiBmbGFnczsKK30KKworI2Vsc2UKKworaW50IGZmX2dldF9jcHVfZmxhZ3NfYXJtKHZvaWQpCit7CisgICAgcmV0dXJuIEFWX0NQVV9GTEFHX0FSTVY1VEUgKiBIQVZFX0FSTVY1VEUgfAorICAgICAgICAgICBBVl9DUFVfRkxBR19BUk1WNiAgICogSEFWRV9BUk1WNiAgIHwKKyAgICAgICAgICAgQVZfQ1BVX0ZMQUdfQVJNVjZUMiAqIEhBVkVfQVJNVjZUMiB8CisgICAgICAgICAgIEFWX0NQVV9GTEFHX1ZGUCAgICAgKiBIQVZFX1ZGUCAgICAgfAorICAgICAgICAgICBBVl9DUFVfRkxBR19WRlBWMyAgICogSEFWRV9WRlBWMyAgIHwKKyAgICAgICAgICAgQVZfQ1BVX0ZMQUdfTkVPTiAgICAqIEhBVkVfTkVPTiAgICB8CisgICAgICAgICAgIEFWX0NQVV9GTEFHX1NFVEVORCAgKiAhKEhBVkVfTkVPTiB8IEhBVkVfVkZQVjMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXJtL2NwdS5oIGIvZmZtcGVnL2xpYmF2dXRpbC9hcm0vY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIzYjZmZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXJtL2NwdS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQVJNX0NQVV9ICisjZGVmaW5lIEFWVVRJTF9BUk1fQ1BVX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1X2ludGVybmFsLmgiCisKKyNkZWZpbmUgaGF2ZV9hcm12NXRlKGZsYWdzKSBDUFVFWFQoZmxhZ3MsIEFSTVY1VEUpCisjZGVmaW5lIGhhdmVfYXJtdjYoZmxhZ3MpICAgQ1BVRVhUKGZsYWdzLCBBUk1WNikKKyNkZWZpbmUgaGF2ZV9hcm12NnQyKGZsYWdzKSBDUFVFWFQoZmxhZ3MsIEFSTVY2VDIpCisjZGVmaW5lIGhhdmVfdmZwKGZsYWdzKSAgICAgQ1BVRVhUKGZsYWdzLCBWRlApCisjZGVmaW5lIGhhdmVfdmZwdjMoZmxhZ3MpICAgQ1BVRVhUKGZsYWdzLCBWRlBWMykKKyNkZWZpbmUgaGF2ZV9uZW9uKGZsYWdzKSAgICBDUFVFWFQoZmxhZ3MsIE5FT04pCisjZGVmaW5lIGhhdmVfc2V0ZW5kKGZsYWdzKSAgQ1BVRVhUKGZsYWdzLCBTRVRFTkQpCisKKyNlbmRpZiAvKiBBVlVUSUxfQVJNX0NQVV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2FybS9mbG9hdF9kc3BfYXJtLmggYi9mZm1wZWcvbGliYXZ1dGlsL2FybS9mbG9hdF9kc3BfYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzMTFjYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXJtL2Zsb2F0X2RzcF9hcm0uaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9BUk1fRkxPQVRfRFNQX0FSTV9ICisjZGVmaW5lIEFWVVRJTF9BUk1fRkxPQVRfRFNQX0FSTV9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisKK3ZvaWQgZmZfZmxvYXRfZHNwX2luaXRfdmZwKEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLCBpbnQgY3B1X2ZsYWdzKTsKK3ZvaWQgZmZfZmxvYXRfZHNwX2luaXRfbmVvbihBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCk7CisKKyNlbmRpZiAvKiBBVlVUSUxfQVJNX0ZMT0FUX0RTUF9BUk1fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hcm0vZmxvYXRfZHNwX2luaXRfYXJtLmMgYi9mZm1wZWcvbGliYXZ1dGlsL2FybS9mbG9hdF9kc3BfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzg3NjI4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hcm0vZmxvYXRfZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiZmxvYXRfZHNwX2FybS5oIgorCithdl9jb2xkIHZvaWQgZmZfZmxvYXRfZHNwX2luaXRfYXJtKEFWRmxvYXREU1BDb250ZXh0ICpmZHNwKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV92ZnAoY3B1X2ZsYWdzKSkKKyAgICAgICAgZmZfZmxvYXRfZHNwX2luaXRfdmZwKGZkc3AsIGNwdV9mbGFncyk7CisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKQorICAgICAgICBmZl9mbG9hdF9kc3BfaW5pdF9uZW9uKGZkc3ApOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hcm0vZmxvYXRfZHNwX2luaXRfbmVvbi5jIGIvZmZtcGVnL2xpYmF2dXRpbC9hcm0vZmxvYXRfZHNwX2luaXRfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWFhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2FybS9mbG9hdF9kc3BfaW5pdF9uZW9uLmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIEFSTSBORU9OIG9wdGltaXNlZCBGbG9hdCBEU1AgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImZsb2F0X2RzcF9hcm0uaCIKKwordm9pZCBmZl92ZWN0b3JfZm11bF9uZW9uKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSwgaW50IGxlbik7CisKK3ZvaWQgZmZfdmVjdG9yX2ZtYWNfc2NhbGFyX25lb24oZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgZmxvYXQgbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKwordm9pZCBmZl92ZWN0b3JfZm11bF9zY2FsYXJfbmVvbihmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCBtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCit2b2lkIGZmX3ZlY3Rvcl9mbXVsX3dpbmRvd19uZW9uKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMSwgY29uc3QgZmxvYXQgKndpbiwgaW50IGxlbik7CisKK3ZvaWQgZmZfdmVjdG9yX2ZtdWxfYWRkX25lb24oZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMiwgaW50IGxlbik7CisKK3ZvaWQgZmZfdmVjdG9yX2ZtdWxfcmV2ZXJzZV9uZW9uKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzEsIGludCBsZW4pOworCit2b2lkIGZmX2J1dHRlcmZsaWVzX2Zsb2F0X25lb24oZmxvYXQgKnYxLCBmbG9hdCAqdjIsIGludCBsZW4pOworCitmbG9hdCBmZl9zY2FsYXJwcm9kdWN0X2Zsb2F0X25lb24oY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIsIGludCBsZW4pOworCithdl9jb2xkIHZvaWQgZmZfZmxvYXRfZHNwX2luaXRfbmVvbihBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCkKK3sKKyAgICBmZHNwLT52ZWN0b3JfZm11bCA9IGZmX3ZlY3Rvcl9mbXVsX25lb247CisgICAgZmRzcC0+dmVjdG9yX2ZtYWNfc2NhbGFyID0gZmZfdmVjdG9yX2ZtYWNfc2NhbGFyX25lb247CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyID0gZmZfdmVjdG9yX2ZtdWxfc2NhbGFyX25lb247CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93ID0gZmZfdmVjdG9yX2ZtdWxfd2luZG93X25lb247CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfYWRkICAgID0gZmZfdmVjdG9yX2ZtdWxfYWRkX25lb247CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZSA9IGZmX3ZlY3Rvcl9mbXVsX3JldmVyc2VfbmVvbjsKKyAgICBmZHNwLT5idXR0ZXJmbGllc19mbG9hdCA9IGZmX2J1dHRlcmZsaWVzX2Zsb2F0X25lb247CisgICAgZmRzcC0+c2NhbGFycHJvZHVjdF9mbG9hdCA9IGZmX3NjYWxhcnByb2R1Y3RfZmxvYXRfbmVvbjsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXJtL2Zsb2F0X2RzcF9pbml0X3ZmcC5jIGIvZmZtcGVnL2xpYmF2dXRpbC9hcm0vZmxvYXRfZHNwX2luaXRfdmZwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1YWJmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXJtL2Zsb2F0X2RzcF9pbml0X3ZmcC5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2lhcmhlaSBTaWFtYXNoa2EgPHNzdmJAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiZmxvYXRfZHNwX2FybS5oIgorCit2b2lkIGZmX3ZlY3Rvcl9mbXVsX3ZmcChmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKwordm9pZCBmZl92ZWN0b3JfZm11bF93aW5kb3dfdmZwKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMxLCBjb25zdCBmbG9hdCAqd2luLCBpbnQgbGVuKTsKKwordm9pZCBmZl92ZWN0b3JfZm11bF9yZXZlcnNlX3ZmcChmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzEsIGludCBsZW4pOworCit2b2lkIGZmX2J1dHRlcmZsaWVzX2Zsb2F0X3ZmcChmbG9hdCAqYXZfcmVzdHJpY3QgdjEsIGZsb2F0ICphdl9yZXN0cmljdCB2MiwgaW50IGxlbik7CisKK2F2X2NvbGQgdm9pZCBmZl9mbG9hdF9kc3BfaW5pdF92ZnAoQVZGbG9hdERTUENvbnRleHQgKmZkc3AsIGludCBjcHVfZmxhZ3MpCit7CisgICAgaWYgKCFoYXZlX3ZmcHYzKGNwdV9mbGFncykpIHsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWwgPSBmZl92ZWN0b3JfZm11bF92ZnA7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyA9IGZmX3ZlY3Rvcl9mbXVsX3dpbmRvd192ZnA7CisgICAgfQorICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2UgPSBmZl92ZWN0b3JfZm11bF9yZXZlcnNlX3ZmcDsKKyAgICBpZiAoIWhhdmVfdmZwdjMoY3B1X2ZsYWdzKSkKKyAgICAgICAgZmRzcC0+YnV0dGVyZmxpZXNfZmxvYXQgPSBmZl9idXR0ZXJmbGllc19mbG9hdF92ZnA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2FybS9mbG9hdF9kc3BfbmVvbi5TIGIvZmZtcGVnL2xpYmF2dXRpbC9hcm0vZmxvYXRfZHNwX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODIzMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hcm0vZmxvYXRfZHNwX25lb24uUwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIEFSTSBORU9OIG9wdGltaXNlZCBGbG9hdCBEU1AgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJhc20uUyIKKworZnVuY3Rpb24gZmZfdmVjdG9yX2ZtdWxfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjOAorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwLWQzfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNC1kN30sICBbcjIsOjEyOF0hCisgICAgICAgIHZtdWwuZjMyICAgICAgICBxOCwgIHEwLCAgcTIKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHE5LCAgcTEsICBxMworICAgICAgICBiZXEgICAgICAgICAgICAgM2YKKyAgICAgICAgYmljcyAgICAgICAgICAgIGlwLCAgcjMsICAjMTUKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisxOiAgICAgIHN1YnMgICAgICAgICAgICBpcCwgIGlwLCAgIzE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDAtZDF9LCAgW3IxLDoxMjhdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0LWQ1fSwgIFtyMiw6MTI4XSEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHExMCwgcTAsICBxMgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyLWQzfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNi1kN30sICBbcjIsOjEyOF0hCisgICAgICAgIHZtdWwuZjMyICAgICAgICBxMTEsIHExLCAgcTMKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTYtZDE5fSxbcjAsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDAtZDF9LCAgW3IxLDoxMjhdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0LWQ1fSwgIFtyMiw6MTI4XSEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHE4LCAgcTAsICBxMgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyLWQzfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNi1kN30sICBbcjIsOjEyOF0hCisgICAgICAgIHZtdWwuZjMyICAgICAgICBxOSwgIHExLCAgcTMKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjAtZDIzfSxbcjAsOjEyOF0hCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBhbmRzICAgICAgICAgICAgcjMsICByMywgICMxNQorICAgICAgICBiZXEgICAgICAgICAgICAgM2YKKzI6ICAgICAgdmxkMS4zMiAgICAgICAgIHtkMC1kMX0sICBbcjEsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDQtZDV9LCAgW3IyLDoxMjhdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxNi1kMTd9LFtyMCw6MTI4XSEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHE4LCAgcTAsICBxMgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyLWQzfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNi1kN30sICBbcjIsOjEyOF0hCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE4LWQxOX0sW3IwLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTksICBxMSwgIHEzCiszOiAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE2LWQxOX0sW3IwLDoxMjhdIQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdmVjdG9yX2ZtYWNfc2NhbGFyX25lb24sIGV4cG9ydD0xCitWRlAgICAgIGxlbiAucmVxIHIyCitWRlAgICAgIGFjYyAucmVxIHIzCitOT1ZGUCAgIGxlbiAucmVxIHIzCitOT1ZGUCAgIGFjYyAucmVxIHIyCitWRlAgICAgIHZkdXAuMzIgICAgICAgICBxMTUsIGQwWzBdCitOT1ZGUCAgIHZkdXAuMzIgICAgICAgICBxMTUsIHIyCisgICAgICAgIGJpY3MgICAgICAgICAgICByMTIsIGxlbiwgIzE1CisgICAgICAgIG1vdiAgICAgICAgICAgICBhY2MsIHIwCisgICAgICAgIGJlcSAgICAgICAgICAgICAzZgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOH0sICAgICBbYWNjLDoxMjhdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOX0sICAgICBbYWNjLDoxMjhdIQorMTogICAgICB2bWxhLmYzMiAgICAgICAgcTgsICBxMCwgIHExNQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EyfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTB9LCAgICBbYWNjLDoxMjhdIQorICAgICAgICB2bWxhLmYzMiAgICAgICAgcTksICBxMSwgIHExNQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EzfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTF9LCAgICBbYWNjLDoxMjhdIQorICAgICAgICB2bWxhLmYzMiAgICAgICAgcTEwLCBxMiwgIHExNQorICAgICAgICB2c3QxLjMyICAgICAgICAge3E4fSwgICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIHExMSwgcTMsICBxMTUKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxOX0sICAgICBbcjAsOjEyOF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzE2CisgICAgICAgIGJlcSAgICAgICAgICAgICAyZgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOH0sICAgICBbYWNjLDoxMjhdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge3ExMH0sICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTl9LCAgICAgW2FjYyw6MTI4XSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxMTF9LCAgICBbcjAsOjEyOF0hCisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorMjogICAgICB2c3QxLjMyICAgICAgICAge3ExMH0sICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxMTF9LCAgICBbcjAsOjEyOF0hCisgICAgICAgIGFuZHMgICAgICAgICAgICBsZW4sIGxlbiwgIzE1CisgICAgICAgIGl0ICAgICAgICAgICAgICBlcQorICAgICAgICBieGVxICAgICAgICAgICAgbHIKKzM6ICAgICAgdmxkMS4zMiAgICAgICAgIHtxMH0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTh9LCAgICAgW2FjYyw6MTI4XSEKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIHE4LCAgcTAsICBxMTUKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxOH0sICAgICBbcjAsOjEyOF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICBsZW4sIGxlbiwgIzQKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDNiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorICAgICAgICAudW5yZXEgICAgICAgICAgbGVuCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZlY3Rvcl9mbXVsX3NjYWxhcl9uZW9uLCBleHBvcnQ9MQorVkZQICAgICBsZW4gLnJlcSByMgorTk9WRlAgICBsZW4gLnJlcSByMworVkZQICAgICB2ZHVwLjMyICAgICAgICAgcTgsICBkMFswXQorTk9WRlAgICB2ZHVwLjMyICAgICAgICAgcTgsICByMgorICAgICAgICBiaWNzICAgICAgICAgICAgcjEyLCBsZW4sICMxNQorICAgICAgICBiZXEgICAgICAgICAgICAgM2YKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMH0sW3IxLDoxMjhdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSxbcjEsOjEyOF0hCisxOiAgICAgIHZtdWwuZjMyICAgICAgICBxMCwgIHEwLCAgcTgKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMn0sW3IxLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTEsICBxMSwgIHE4CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTN9LFtyMSw6MTI4XSEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHEyLCAgcTIsICBxOAorICAgICAgICB2c3QxLjMyICAgICAgICAge3EwfSxbcjAsOjEyOF0hCisgICAgICAgIHZtdWwuZjMyICAgICAgICBxMywgIHEzLCAgcTgKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxMX0sW3IwLDoxMjhdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxNgorICAgICAgICBiZXEgICAgICAgICAgICAgMmYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMH0sW3IxLDoxMjhdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge3EyfSxbcjAsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTF9LFtyMSw6MTI4XSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxM30sW3IwLDoxMjhdIQorICAgICAgICBiICAgICAgICAgICAgICAgMWIKKzI6ICAgICAgdnN0MS4zMiAgICAgICAgIHtxMn0sW3IwLDoxMjhdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge3EzfSxbcjAsOjEyOF0hCisgICAgICAgIGFuZHMgICAgICAgICAgICBsZW4sIGxlbiwgIzE1CisgICAgICAgIGl0ICAgICAgICAgICAgICBlcQorICAgICAgICBieGVxICAgICAgICAgICAgbHIKKzM6ICAgICAgdmxkMS4zMiAgICAgICAgIHtxMH0sW3IxLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTAsICBxMCwgIHE4CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTB9LFtyMCw6MTI4XSEKKyAgICAgICAgc3VicyAgICAgICAgICAgIGxlbiwgbGVuLCAjNAorICAgICAgICBiZ3QgICAgICAgICAgICAgM2IKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCisgICAgICAgIC51bnJlcSAgICAgICAgICBsZW4KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdmVjdG9yX2ZtdWxfd2luZG93X25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQscjUsbHJ9CisgICAgICAgIGxkciAgICAgICAgICAgICBsciwgIFtzcCwgIzEyXQorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICM4CisgICAgICAgIHN1YiAgICAgICAgICAgICByNSwgIGxyLCAgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICByNSwgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIHIzLCAgcjUsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgaXAsICByMCwgIHI1LCBsc2wgIzMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI1LCAgIy0xNgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QwLGQxfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMixkM30sICBbcjIsOjEyOF0sIHI1CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDQsZDV9LCAgW3IzLDoxMjhdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q2LGQ3fSwgIFtyNCw6MTI4XSwgcjUKKzE6ICAgICAgc3VicyAgICAgICAgICAgIGxyLCAgbHIsICAjNAorICAgICAgICB2bXVsLmYzMiAgICAgICAgZDIyLCBkMCwgIGQ0CisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxMywgIHEzCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMjMsIGQxLCAgZDUKKyAgICAgICAgdnJldjY0LjMyICAgICAgIHExLCAgcTEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQyMCwgZDAsICBkNworICAgICAgICB2bXVsLmYzMiAgICAgICAgZDIxLCBkMSwgIGQ2CisgICAgICAgIGJlcSAgICAgICAgICAgICAyZgorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDIyLCBkMywgIGQ3CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDAsZDF9LCAgW3IxLDoxMjhdIQorICAgICAgICB2bWxhLmYzMiAgICAgICAgZDIzLCBkMiwgIGQ2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE4LGQxOX0sW3IyLDoxMjhdLCByNQorICAgICAgICB2bWxzLmYzMiAgICAgICAgZDIwLCBkMywgIGQ0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI0LGQyNX0sW3IzLDoxMjhdIQorICAgICAgICB2bWxzLmYzMiAgICAgICAgZDIxLCBkMiwgIGQ1CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDYsZDd9LCAgW3I0LDoxMjhdLCByNQorICAgICAgICB2bW92ICAgICAgICAgICAgcTEsICBxOQorICAgICAgICB2cmV2NjQuMzIgICAgICAgcTExLCBxMTEKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHEyLCAgcTEyCisgICAgICAgIHZzd3AgICAgICAgICAgICBkMjIsIGQyMworICAgICAgICB2c3QxLjMyICAgICAgICAge2QyMCxkMjF9LFtyMCw6MTI4XSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjIsZDIzfSxbaXAsOjEyOF0sIHI1CisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorMjogICAgICB2bWxhLmYzMiAgICAgICAgZDIyLCBkMywgIGQ3CisgICAgICAgIHZtbGEuZjMyICAgICAgICBkMjMsIGQyLCAgZDYKKyAgICAgICAgdm1scy5mMzIgICAgICAgIGQyMCwgZDMsICBkNAorICAgICAgICB2bWxzLmYzMiAgICAgICAgZDIxLCBkMiwgIGQ1CisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxMTEsIHExMQorICAgICAgICB2c3dwICAgICAgICAgICAgZDIyLCBkMjMKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjAsZDIxfSxbcjAsOjEyOF0hCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyLGQyM30sW2lwLDoxMjhdLCByNQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHI1LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl92ZWN0b3JfZm11bF9hZGRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwLXExfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOC1xOX0sICBbcjIsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTItcTN9LCAgW3IzLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTEwLCBxMCwgIHE4CisgICAgICAgIHZtdWwuZjMyICAgICAgICBxMTEsIHExLCAgcTkKKzE6ICAgICAgdmFkZC5mMzIgICAgICAgIHExMiwgcTIsICBxMTAKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIHExMywgcTMsICBxMTEKKyAgICAgICAgcGxkICAgICAgICAgICAgIFtyMSwgIzE2XQorICAgICAgICBwbGQgICAgICAgICAgICAgW3IyLCAjMTZdCisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjMsICMxNl0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjOAorICAgICAgICBiZXEgICAgICAgICAgICAgMmYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMH0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTh9LCAgICAgW3IyLDoxMjhdIQorICAgICAgICB2bXVsLmYzMiAgICAgICAgcTEwLCBxMCwgIHE4CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTF9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge3E5fSwgICAgIFtyMiw6MTI4XSEKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHExMSwgcTEsICBxOQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EyLXEzfSwgIFtyMyw6MTI4XSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxMTItcTEzfSxbcjAsOjEyOF0hCisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorMjogICAgICB2c3QxLjMyICAgICAgICAge3ExMi1xMTN9LFtyMCw6MTI4XSEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZlY3Rvcl9mbXVsX3JldmVyc2VfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICByMywgIGxzbCAjMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICMzMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjLTMyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTAtcTF9LCAgW3IxLDoxMjhdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EyLXEzfSwgIFtyMiw6MTI4XSwgcjEyCisxOiAgICAgIHBsZCAgICAgICAgICAgICBbcjEsICMzMl0KKyAgICAgICAgdnJldjY0LjMyICAgICAgIHEzLCAgcTMKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQxNiwgZDAsICBkNworICAgICAgICB2bXVsLmYzMiAgICAgICAgZDE3LCBkMSwgIGQ2CisgICAgICAgIHBsZCAgICAgICAgICAgICBbcjIsICMtMzJdCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBxMiwgIHEyCisgICAgICAgIHZtdWwuZjMyICAgICAgICBkMTgsIGQyLCAgZDUKKyAgICAgICAgdm11bC5mMzIgICAgICAgIGQxOSwgZDMsICBkNAorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICM4CisgICAgICAgIGJlcSAgICAgICAgICAgICAyZgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwLXExfSwgIFtyMSw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMi1xM30sICBbcjIsOjEyOF0sIHIxMgorICAgICAgICB2c3QxLjMyICAgICAgICAge3E4LXE5fSwgIFtyMCw6MTI4XSEKKyAgICAgICAgYiAgICAgICAgICAgICAgIDFiCisyOiAgICAgIHZzdDEuMzIgICAgICAgICB7cTgtcTl9LCAgW3IwLDoxMjhdIQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfYnV0dGVyZmxpZXNfZmxvYXRfbmVvbiwgZXhwb3J0PTEKKzE6ICAgICAgdmxkMS4zMiAgICAgICAgIHtxMH0sW3IwLDoxMjhdCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTF9LFtyMSw6MTI4XQorICAgICAgICB2c3ViLmYzMiAgICAgICAgcTIsICBxMCwgIHExCisgICAgICAgIHZhZGQuZjMyICAgICAgICBxMSwgIHEwLCAgcTEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxMn0sW3IxLDoxMjhdIQorICAgICAgICB2c3QxLjMyICAgICAgICAge3ExfSxbcjAsOjEyOF0hCisgICAgICAgIHN1YnMgICAgICAgICAgICByMiwgIHIyLCAgIzQKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zY2FsYXJwcm9kdWN0X2Zsb2F0X25lb24sIGV4cG9ydD0xCisgICAgICAgIHZtb3YuZjMyICAgICAgICBxMiwgICMwLjAKKzE6ICAgICAgdmxkMS4zMiAgICAgICAgIHtxMH0sW3IwLDoxMjhdIQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSxbcjEsOjEyOF0hCisgICAgICAgIHZtbGEuZjMyICAgICAgICBxMiwgIHEwLCAgcTEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjNAorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgdmFkZC5mMzIgICAgICAgIGQwLCAgZDQsICBkNQorICAgICAgICB2cGFkZC5mMzIgICAgICAgZDAsICBkMCwgIGQwCitOT1ZGUCAgIHZtb3YuMzIgICAgICAgICByMCwgIGQwWzBdCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hcm0vZmxvYXRfZHNwX3ZmcC5TIGIvZmZtcGVnL2xpYmF2dXRpbC9hcm0vZmxvYXRfZHNwX3ZmcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjI0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2FybS9mbG9hdF9kc3BfdmZwLlMKQEAgLTAsMCArMSw0NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2lhcmhlaSBTaWFtYXNoa2EgPHNzdmJAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZworICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJhc20uUyIKKworLyoqCisgKiBBc3N1bWUgdGhhdCBsZW4gaXMgYSBwb3NpdGl2ZSBudW1iZXIgYW5kIGlzIG11bHRpcGxlIG9mIDgKKyAqLworQCB2b2lkIGZmX3ZlY3Rvcl9mbXVsX3ZmcChmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEsIGludCBsZW4pCitmdW5jdGlvbiBmZl92ZWN0b3JfZm11bF92ZnAsIGV4cG9ydD0xCisgICAgICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBmbXJ4ICAgICAgICAgICAgcjEyLCBmcHNjcgorICAgICAgICBvcnIgICAgICAgICAgICAgcjEyLCByMTIsICMoMyA8PCAxNikgLyogc2V0IHZlY3RvciBzaXplIHRvIDQgKi8KKyAgICAgICAgZm14ciAgICAgICAgICAgIGZwc2NyLCByMTIKKworICAgICAgICB2bGRtaWEgICAgICAgICAgcjEhLCB7czAtczN9CisgICAgICAgIHZsZG1pYSAgICAgICAgICByMiEsIHtzOC1zMTF9CisgICAgICAgIHZsZG1pYSAgICAgICAgICByMSEsIHtzNC1zN30KKyAgICAgICAgdmxkbWlhICAgICAgICAgIHIyISwge3MxMi1zMTV9CisgICAgICAgIHZtdWwuZjMyICAgICAgICBzOCwgIHMwLCAgczgKKzE6CisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzE2CisgICAgICAgIHZtdWwuZjMyICAgICAgICBzMTIsIHM0LCAgczEyCisgICAgICAgIGl0dHR0ICAgICAgICAgICBnZQorICAgICAgICB2bGRtaWFnZSAgICAgICAgcjEhLCB7czE2LXMxOX0KKyAgICAgICAgdmxkbWlhZ2UgICAgICAgIHIyISwge3MyNC1zMjd9CisgICAgICAgIHZsZG1pYWdlICAgICAgICByMSEsIHtzMjAtczIzfQorICAgICAgICB2bGRtaWFnZSAgICAgICAgcjIhLCB7czI4LXMzMX0KKyAgICAgICAgaXQgICAgICAgICAgICAgIGdlCisgICAgICAgIHZtdWxnZS5mMzIgICAgICBzMjQsIHMxNiwgczI0CisgICAgICAgIHZzdG1pYSAgICAgICAgICByMCEsIHtzOC1zMTF9CisgICAgICAgIHZzdG1pYSAgICAgICAgICByMCEsIHtzMTItczE1fQorICAgICAgICBpdCAgICAgICAgICAgICAgZ2UKKyAgICAgICAgdm11bGdlLmYzMiAgICAgIHMyOCwgczIwLCBzMjgKKyAgICAgICAgaXR0dHQgICAgICAgICAgIGd0CisgICAgICAgIHZsZG1pYWd0ICAgICAgICByMSEsIHtzMC1zM30KKyAgICAgICAgdmxkbWlhZ3QgICAgICAgIHIyISwge3M4LXMxMX0KKyAgICAgICAgdmxkbWlhZ3QgICAgICAgIHIxISwge3M0LXM3fQorICAgICAgICB2bGRtaWFndCAgICAgICAgcjIhLCB7czEyLXMxNX0KKyAgICAgICAgaXR0dCAgICAgICAgICAgIGdlCisgICAgICAgIHZtdWxnZS5mMzIgICAgICBzOCwgIHMwLCAgczgKKyAgICAgICAgdnN0bWlhZ2UgICAgICAgIHIwISwge3MyNC1zMjd9CisgICAgICAgIHZzdG1pYWdlICAgICAgICByMCEsIHtzMjgtczMxfQorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICBiaWMgICAgICAgICAgICAgcjEyLCByMTIsICMoNyA8PCAxNikgLyogc2V0IHZlY3RvciBzaXplIGJhY2sgdG8gMSAqLworICAgICAgICBmbXhyICAgICAgICAgICAgZnBzY3IsIHIxMgorICAgICAgICB2cG9wICAgICAgICAgICAge2Q4LWQxNX0KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKy8qKgorICogQVJNIFZGUCBpbXBsZW1lbnRhdGlvbiBvZiAndmVjdG9yX2ZtdWxfd2luZG93X2MnIGZ1bmN0aW9uCisgKiBBc3N1bWUgdGhhdCBsZW4gaXMgYSBwb3NpdGl2ZSBub24temVybyBudW1iZXIKKyAqLworQCB2b2lkIGZmX3ZlY3Rvcl9mbXVsX3dpbmRvd192ZnAoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsCitAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMSwgY29uc3QgZmxvYXQgKndpbiwgaW50IGxlbikKK2Z1bmN0aW9uIGZmX3ZlY3Rvcl9mbXVsX3dpbmRvd192ZnAsIGV4cG9ydD0xCitEU1QwICAgIC5yZXEgICAgYTEKK1NSQzAgICAgLnJlcSAgICBhMgorU1JDMSAgICAucmVxICAgIGEzCitXSU4wICAgIC5yZXEgICAgYTQKK0xFTiAgICAgLnJlcSAgICB2MQorRFNUMSAgICAucmVxICAgIHYyCitXSU4xICAgIC5yZXEgICAgdjMKK09MREZQU0NSIC5yZXEgICBpcAorCisgICAgICAgIHB1c2ggICAge3YxLXYzLGxyfQorICAgICAgICBsZHIgICAgIExFTiwgW3NwLCAjNCo0KzBdCisgICAgICAgIHZwdXNoICAge3MxNi1zMzF9CisgICAgICAgIGZtcnggICAgT0xERlBTQ1IsIEZQU0NSCisgICAgICAgIGFkZCAgICAgRFNUMSwgRFNUMCwgTEVOLCBsc2wgIzMKKyAgICAgICAgYWRkICAgICBTUkMxLCBTUkMxLCBMRU4sIGxzbCAjMgorICAgICAgICBhZGQgICAgIFdJTjEsIFdJTjAsIExFTiwgbHNsICMzCisKKyAgICAgICAgdHN0ICAgICBMRU4sICM3CisgICAgICAgIGJlcSAgICAgNGYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY29tbW9uIGNhc2U6IGxlbiBpcyBhIG11bHRpcGxlIG9mIDgKKworICAgICAgICBsZHIgICAgIGxyLCA9MHgwMzAwMDAwMCAgICAgICAgICAgICBAIFJ1bkZhc3QgbW9kZSwgc2NhbGFyIG1vZGUKKyAgICAgICAgZm14ciAgICBGUFNDUiwgbHIKKworICAgICAgICB0c3QgICAgIExFTiwgIzEKKyAgICAgICAgYmVxICAgICAxZgorICAgICAgICB2bGRtZGIgIFdJTjEhLCB7czB9CisgICAgICAgIHZsZG1pYSAgU1JDMCEsIHtzOH0KKyAgICAgICAgdmxkbWlhICBXSU4wISwge3MxNn0KKyAgICAgICAgdm11bC5mICBzMjQsIHMwLCBzOAorICAgICAgICB2bGRtZGIgIFNSQzEhLCB7czIwfQorICAgICAgICB2bXVsLmYgIHM4LCBzMTYsIHM4CisgICAgICAgIHZtbHMuZiAgczI0LCBzMTYsIHMyMAorICAgICAgICB2bWxhLmYgIHM4LCBzMCwgczIwCisgICAgICAgIHZzdG1pYSAgRFNUMCEsIHtzMjR9CisgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzOH0KKzE6CisgICAgICAgIHRzdCAgICAgTEVOLCAjMgorICAgICAgICBiZXEgICAgIDJmCisgICAgICAgIHZsZG1kYiAgV0lOMSEsIHtzMH0KKyAgICAgICAgdmxkbWRiICBXSU4xISwge3MxfQorICAgICAgICB2bGRtaWEgIFNSQzAhLCB7czgtczl9CisgICAgICAgIHZsZG1pYSAgV0lOMCEsIHtzMTYtczE3fQorICAgICAgICB2bXVsLmYgIHMyNCwgczAsIHM4CisgICAgICAgIHZtdWwuZiAgczI1LCBzMSwgczkKKyAgICAgICAgdmxkbWRiICBTUkMxISwge3MyMH0KKyAgICAgICAgdmxkbWRiICBTUkMxISwge3MyMX0KKyAgICAgICAgdm11bC5mICBzOCwgczE2LCBzOAorICAgICAgICB2bXVsLmYgIHM5LCBzMTcsIHM5CisgICAgICAgIHZtbHMuZiAgczI0LCBzMTYsIHMyMAorICAgICAgICB2bWxzLmYgIHMyNSwgczE3LCBzMjEKKyAgICAgICAgdm1sYS5mICBzOCwgczAsIHMyMAorICAgICAgICB2bWxhLmYgIHM5LCBzMSwgczIxCisgICAgICAgIHZzdG1pYSAgRFNUMCEsIHtzMjQtczI1fQorICAgICAgICB2c3RtZGIgIERTVDEhLCB7czh9CisgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzOX0KKzI6CisgICAgICAgIHRzdCAgICAgTEVOLCAjNAorICAgICAgICBiZXEgICAgIDNmCisgICAgICAgIHZsZG1kYiAgV0lOMSEsIHtzMH0KKyAgICAgICAgdmxkbWRiICBXSU4xISwge3MxfQorICAgICAgICB2bGRtZGIgIFdJTjEhLCB7czJ9CisgICAgICAgIHZsZG1kYiAgV0lOMSEsIHtzM30KKyAgICAgICAgdmxkbWlhICBTUkMwISwge3M4LXMxMX0KKyAgICAgICAgdmxkbWlhICBXSU4wISwge3MxNi1zMTl9CisgICAgICAgIHZtdWwuZiAgczI0LCBzMCwgczgKKyAgICAgICAgdm11bC5mICBzMjUsIHMxLCBzOQorICAgICAgICB2bXVsLmYgIHMyNiwgczIsIHMxMAorICAgICAgICB2bXVsLmYgIHMyNywgczMsIHMxMQorICAgICAgICB2bGRtZGIgIFNSQzEhLCB7czIwfQorICAgICAgICB2bGRtZGIgIFNSQzEhLCB7czIxfQorICAgICAgICB2bGRtZGIgIFNSQzEhLCB7czIyfQorICAgICAgICB2bGRtZGIgIFNSQzEhLCB7czIzfQorICAgICAgICB2bXVsLmYgIHM4LCBzMTYsIHM4CisgICAgICAgIHZtdWwuZiAgczksIHMxNywgczkKKyAgICAgICAgdm11bC5mICBzMTAsIHMxOCwgczEwCisgICAgICAgIHZtdWwuZiAgczExLCBzMTksIHMxMQorICAgICAgICB2bWxzLmYgIHMyNCwgczE2LCBzMjAKKyAgICAgICAgdm1scy5mICBzMjUsIHMxNywgczIxCisgICAgICAgIHZtbHMuZiAgczI2LCBzMTgsIHMyMgorICAgICAgICB2bWxzLmYgIHMyNywgczE5LCBzMjMKKyAgICAgICAgdm1sYS5mICBzOCwgczAsIHMyMAorICAgICAgICB2bWxhLmYgIHM5LCBzMSwgczIxCisgICAgICAgIHZtbGEuZiAgczEwLCBzMiwgczIyCisgICAgICAgIHZtbGEuZiAgczExLCBzMywgczIzCisgICAgICAgIHZzdG1pYSAgRFNUMCEsIHtzMjQtczI3fQorICAgICAgICB2c3RtZGIgIERTVDEhLCB7czh9CisgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzOX0KKyAgICAgICAgdnN0bWRiICBEU1QxISwge3MxMH0KKyAgICAgICAgdnN0bWRiICBEU1QxISwge3MxMX0KKzM6CisgICAgICAgIGJpY3MgICAgTEVOLCBMRU4sICM3CisgICAgICAgIGJlcSAgICAgN2YKKzQ6CisgICAgICAgIGxkciAgICAgbHIsID0weDAzMDMwMDAwICAgICAgICAgICAgIEAgUnVuRmFzdCBtb2RlLCBzaG9ydCB2ZWN0b3JzIG9mIGxlbmd0aCA0LCBzdHJpZGUgMQorICAgICAgICBmbXhyICAgIEZQU0NSLCBscgorCisgICAgICAgIHZsZG1kYiAgV0lOMSEsIHtzMH0KKyAgICAgICAgdmxkbWRiICBXSU4xISwge3MxfQorICAgICAgICB2bGRtZGIgIFdJTjEhLCB7czJ9CisgICAgICAgIHZsZG1kYiAgV0lOMSEsIHtzM30KKyAgICAgICAgdmxkbWlhICBTUkMwISwge3M4LXMxMX0KKyAgICAgICAgdmxkbWlhICBXSU4wISwge3MxNi1zMTl9CisgICAgICAgIHZtdWwuZiAgczI0LCBzMCwgczggICAgICAgICAgICAgICAgICAgICBAIHZlY3RvciAqIHZlY3RvcgorICAgICAgICB2bGRtZGIgIFNSQzEhLCB7czIwfQorICAgICAgICB2bGRtZGIgIFNSQzEhLCB7czIxfQorICAgICAgICB2bGRtZGIgIFNSQzEhLCB7czIyfQorICAgICAgICB2bGRtZGIgIFNSQzEhLCB7czIzfQorICAgICAgICB2bXVsLmYgIHM4LCBzMTYsIHM4ICAgICAgICAgICAgICAgICAgICAgQCB2ZWN0b3IgKiB2ZWN0b3IKKyAgICAgICAgdm1scy5mICBzMjQsIHMxNiwgczIwICAgICAgICAgICAgICAgICAgIEAgdmVjdG9yICogdmVjdG9yCisgICAgICAgICAgICB2bGRtZGIgIFdJTjEhLCB7czR9CisgICAgICAgICAgICB2bGRtZGIgIFdJTjEhLCB7czV9CisgICAgICAgICAgICB2bGRtZGIgIFdJTjEhLCB7czZ9CisgICAgICAgICAgICB2bGRtZGIgIFdJTjEhLCB7czd9CisgICAgICAgICAgICB2bGRtaWEgIFNSQzAhLCB7czEyLXMxM30KKyAgICAgICAgdm1sYS5mICBzOCwgczAsIHMyMCAgICAgICAgICAgICAgICAgICAgIEAgdmVjdG9yICogdmVjdG9yCisgICAgICAgICAgICB2bGRtaWEgIFNSQzAhLCB7czE0LXMxNX0KKyAgICAgICAgc3VicyAgICBMRU4sIExFTiwgIzgKKyAgICAgICAgYmVxICAgICA2ZgorNTogICAgICAgICAgdmxkbWlhICBXSU4wISwge3MyMC1zMjN9CisgICAgICAgICAgICB2bXVsLmYgIHMyOCwgczQsIHMxMiAgICAgICAgICAgICAgICBAIHZlY3RvciAqIHZlY3RvcgorICAgICAgICB2c3RtaWEgIERTVDAhLCB7czI0LXMyNX0KKyAgICAgICAgICAgIHZsZG1kYiAgU1JDMSEsIHtzMTZ9CisgICAgICAgICAgICB2bGRtZGIgIFNSQzEhLCB7czE3fQorICAgICAgICAgICAgdmxkbWRiICBTUkMxISwge3MxOH0KKyAgICAgICAgICAgIHZsZG1kYiAgU1JDMSEsIHtzMTl9CisgICAgICAgICAgICB2bXVsLmYgIHMxMiwgczIwLCBzMTIgICAgICAgICAgICAgICBAIHZlY3RvciAqIHZlY3RvcgorICAgICAgICB2c3RtaWEgIERTVDAhLCB7czI2LXMyN30KKyAgICAgICAgdnN0bWRiICBEU1QxISwge3M4fQorICAgICAgICB2c3RtZGIgIERTVDEhLCB7czl9CisgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzMTB9CisgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzMTF9CisgICAgICAgICAgICB2bWxzLmYgIHMyOCwgczIwLCBzMTYgICAgICAgICAgICAgICBAIHZlY3RvciAqIHZlY3RvcgorICAgICAgICAgICAgICAgIHZsZG1kYiAgV0lOMSEsIHtzMH0KKyAgICAgICAgICAgICAgICB2bGRtZGIgIFdJTjEhLCB7czF9CisgICAgICAgICAgICAgICAgdmxkbWRiICBXSU4xISwge3MyfQorICAgICAgICAgICAgICAgIHZsZG1kYiAgV0lOMSEsIHtzM30KKyAgICAgICAgICAgICAgICB2bGRtaWEgIFNSQzAhLCB7czgtczl9CisgICAgICAgICAgICB2bWxhLmYgIHMxMiwgczQsIHMxNiAgICAgICAgICAgICAgICBAIHZlY3RvciAqIHZlY3RvcgorICAgICAgICAgICAgICAgIHZsZG1pYSAgU1JDMCEsIHtzMTAtczExfQorICAgICAgICBzdWJzICAgIExFTiwgTEVOLCAjOAorICAgICAgICAgICAgICAgIHZsZG1pYSAgV0lOMCEsIHtzMTYtczE5fQorICAgICAgICAgICAgICAgIHZtdWwuZiAgczI0LCBzMCwgczggICAgICAgICAgICAgQCB2ZWN0b3IgKiB2ZWN0b3IKKyAgICAgICAgICAgIHZzdG1pYSAgRFNUMCEsIHtzMjgtczI5fQorICAgICAgICAgICAgICAgIHZsZG1kYiAgU1JDMSEsIHtzMjB9CisgICAgICAgICAgICAgICAgdmxkbWRiICBTUkMxISwge3MyMX0KKyAgICAgICAgICAgICAgICB2bGRtZGIgIFNSQzEhLCB7czIyfQorICAgICAgICAgICAgICAgIHZsZG1kYiAgU1JDMSEsIHtzMjN9CisgICAgICAgICAgICAgICAgdm11bC5mICBzOCwgczE2LCBzOCAgICAgICAgICAgICBAIHZlY3RvciAqIHZlY3RvcgorICAgICAgICAgICAgdnN0bWlhICBEU1QwISwge3MzMC1zMzF9CisgICAgICAgICAgICB2c3RtZGIgIERTVDEhLCB7czEyfQorICAgICAgICAgICAgdnN0bWRiICBEU1QxISwge3MxM30KKyAgICAgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzMTR9CisgICAgICAgICAgICB2c3RtZGIgIERTVDEhLCB7czE1fQorICAgICAgICAgICAgICAgIHZtbHMuZiAgczI0LCBzMTYsIHMyMCAgICAgICAgICAgQCB2ZWN0b3IgKiB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgdmxkbWRiICBXSU4xISwge3M0fQorICAgICAgICAgICAgICAgICAgICB2bGRtZGIgIFdJTjEhLCB7czV9CisgICAgICAgICAgICAgICAgICAgIHZsZG1kYiAgV0lOMSEsIHtzNn0KKyAgICAgICAgICAgICAgICAgICAgdmxkbWRiICBXSU4xISwge3M3fQorICAgICAgICAgICAgICAgICAgICB2bGRtaWEgIFNSQzAhLCB7czEyLXMxM30KKyAgICAgICAgICAgICAgICB2bWxhLmYgIHM4LCBzMCwgczIwICAgICAgICAgICAgIEAgdmVjdG9yICogdmVjdG9yCisgICAgICAgICAgICAgICAgICAgIHZsZG1pYSAgU1JDMCEsIHtzMTQtczE1fQorICAgICAgICBibmUgICAgIDViCis2OiAgICAgICAgICAgICAgICAgIHZsZG1pYSAgV0lOMCEsIHtzMjAtczIzfQorICAgICAgICAgICAgICAgICAgICB2bXVsLmYgIHMyOCwgczQsIHMxMiAgICAgICAgQCB2ZWN0b3IgKiB2ZWN0b3IKKyAgICAgICAgICAgICAgICB2c3RtaWEgIERTVDAhLCB7czI0LXMyNX0KKyAgICAgICAgICAgICAgICAgICAgdmxkbWRiICBTUkMxISwge3MxNn0KKyAgICAgICAgICAgICAgICAgICAgdmxkbWRiICBTUkMxISwge3MxN30KKyAgICAgICAgICAgICAgICAgICAgdmxkbWRiICBTUkMxISwge3MxOH0KKyAgICAgICAgICAgICAgICAgICAgdmxkbWRiICBTUkMxISwge3MxOX0KKyAgICAgICAgICAgICAgICAgICAgdm11bC5mICBzMTIsIHMyMCwgczEyICAgICAgIEAgdmVjdG9yICogdmVjdG9yCisgICAgICAgICAgICAgICAgdnN0bWlhICBEU1QwISwge3MyNi1zMjd9CisgICAgICAgICAgICAgICAgdnN0bWRiICBEU1QxISwge3M4fQorICAgICAgICAgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzOX0KKyAgICAgICAgICAgICAgICB2c3RtZGIgIERTVDEhLCB7czEwfQorICAgICAgICAgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzMTF9CisgICAgICAgICAgICAgICAgICAgIHZtbHMuZiAgczI4LCBzMjAsIHMxNiAgICAgICBAIHZlY3RvciAqIHZlY3RvcgorICAgICAgICAgICAgICAgICAgICB2bWxhLmYgIHMxMiwgczQsIHMxNiAgICAgICAgQCB2ZWN0b3IgKiB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgdnN0bWlhICBEU1QwISwge3MyOC1zMzF9CisgICAgICAgICAgICAgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzMTJ9CisgICAgICAgICAgICAgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzMTN9CisgICAgICAgICAgICAgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzMTR9CisgICAgICAgICAgICAgICAgICAgIHZzdG1kYiAgRFNUMSEsIHtzMTV9Cis3OgorICAgICAgICBmbXhyICAgIEZQU0NSLCBPTERGUFNDUgorICAgICAgICB2cG9wICAgIHtzMTYtczMxfQorICAgICAgICBwb3AgICAgIHt2MS12MyxwY30KKworICAgICAgICAudW5yZXEgIERTVDAKKyAgICAgICAgLnVucmVxICBTUkMwCisgICAgICAgIC51bnJlcSAgU1JDMQorICAgICAgICAudW5yZXEgIFdJTjAKKyAgICAgICAgLnVucmVxICBMRU4KKyAgICAgICAgLnVucmVxICBPTERGUFNDUgorICAgICAgICAudW5yZXEgIERTVDEKKyAgICAgICAgLnVucmVxICBXSU4xCitlbmRmdW5jCisKKy8qKgorICogQVJNIFZGUCBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gb2YgJ3ZlY3Rvcl9mbXVsX3JldmVyc2VfYycgZnVuY3Rpb24uCisgKiBBc3N1bWUgdGhhdCBsZW4gaXMgYSBwb3NpdGl2ZSBudW1iZXIgYW5kIGlzIG11bHRpcGxlIG9mIDgKKyAqLworQCB2b2lkIGZmX3ZlY3Rvcl9mbXVsX3JldmVyc2VfdmZwKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLAorQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMxLCBpbnQgbGVuKQorZnVuY3Rpb24gZmZfdmVjdG9yX2ZtdWxfcmV2ZXJzZV92ZnAsIGV4cG9ydD0xCisgICAgICAgIHZwdXNoICAgICAgICAgICB7ZDgtZDE1fQorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgIHIzLCBsc2wgIzIKKyAgICAgICAgdmxkbWRiICAgICAgICAgIHIyISwge3MwLXMzfQorICAgICAgICB2bGRtaWEgICAgICAgICAgcjEhLCB7czgtczExfQorICAgICAgICB2bGRtZGIgICAgICAgICAgcjIhLCB7czQtczd9CisgICAgICAgIHZsZG1pYSAgICAgICAgICByMSEsIHtzMTItczE1fQorICAgICAgICB2bXVsLmYzMiAgICAgICAgczgsICBzMywgIHM4CisgICAgICAgIHZtdWwuZjMyICAgICAgICBzOSwgIHMyLCAgczkKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHMxMCwgczEsICBzMTAKKyAgICAgICAgdm11bC5mMzIgICAgICAgIHMxMSwgczAsICBzMTEKKzE6CisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzE2CisgICAgICAgIGl0ICAgICAgICAgICAgICBnZQorICAgICAgICB2bGRtZGJnZSAgICAgICAgcjIhLCB7czE2LXMxOX0KKyAgICAgICAgdm11bC5mMzIgICAgICAgIHMxMiwgczcsICBzMTIKKyAgICAgICAgaXQgICAgICAgICAgICAgIGdlCisgICAgICAgIHZsZG1pYWdlICAgICAgICByMSEsIHtzMjQtczI3fQorICAgICAgICB2bXVsLmYzMiAgICAgICAgczEzLCBzNiwgIHMxMworICAgICAgICBpdCAgICAgICAgICAgICAgZ2UKKyAgICAgICAgdmxkbWRiZ2UgICAgICAgIHIyISwge3MyMC1zMjN9CisgICAgICAgIHZtdWwuZjMyICAgICAgICBzMTQsIHM1LCAgczE0CisgICAgICAgIGl0ICAgICAgICAgICAgICBnZQorICAgICAgICB2bGRtaWFnZSAgICAgICAgcjEhLCB7czI4LXMzMX0KKyAgICAgICAgdm11bC5mMzIgICAgICAgIHMxNSwgczQsICBzMTUKKyAgICAgICAgaXQgICAgICAgICAgICAgIGdlCisgICAgICAgIHZtdWxnZS5mMzIgICAgICBzMjQsIHMxOSwgczI0CisgICAgICAgIGl0ICAgICAgICAgICAgICBndAorICAgICAgICB2bGRtZGJndCAgICAgICAgcjIhLCB7czAtczN9CisgICAgICAgIGl0ICAgICAgICAgICAgICBnZQorICAgICAgICB2bXVsZ2UuZjMyICAgICAgczI1LCBzMTgsIHMyNQorICAgICAgICB2c3RtaWEgICAgICAgICAgcjAhLCB7czgtczEzfQorICAgICAgICBpdCAgICAgICAgICAgICAgZ2UKKyAgICAgICAgdm11bGdlLmYzMiAgICAgIHMyNiwgczE3LCBzMjYKKyAgICAgICAgaXQgICAgICAgICAgICAgIGd0CisgICAgICAgIHZsZG1pYWd0ICAgICAgICByMSEsIHtzOC1zMTF9CisgICAgICAgIGl0dCAgICAgICAgICAgICBnZQorICAgICAgICB2bXVsZ2UuZjMyICAgICAgczI3LCBzMTYsIHMyNworICAgICAgICB2bXVsZ2UuZjMyICAgICAgczI4LCBzMjMsIHMyOAorICAgICAgICBpdCAgICAgICAgICAgICAgZ3QKKyAgICAgICAgdmxkbWRiZ3QgICAgICAgIHIyISwge3M0LXM3fQorICAgICAgICBpdCAgICAgICAgICAgICAgZ2UKKyAgICAgICAgdm11bGdlLmYzMiAgICAgIHMyOSwgczIyLCBzMjkKKyAgICAgICAgdnN0bWlhICAgICAgICAgIHIwISwge3MxNC1zMTV9CisgICAgICAgIGl0dHQgICAgICAgICAgICBnZQorICAgICAgICB2bXVsZ2UuZjMyICAgICAgczMwLCBzMjEsIHMzMAorICAgICAgICB2bXVsZ2UuZjMyICAgICAgczMxLCBzMjAsIHMzMQorICAgICAgICB2bXVsZ2UuZjMyICAgICAgczgsICBzMywgIHM4CisgICAgICAgIGl0ICAgICAgICAgICAgICBndAorICAgICAgICB2bGRtaWFndCAgICAgICAgcjEhLCB7czEyLXMxNX0KKyAgICAgICAgaXR0dHQgICAgICAgICAgIGdlCisgICAgICAgIHZtdWxnZS5mMzIgICAgICBzOSwgIHMyLCAgczkKKyAgICAgICAgdm11bGdlLmYzMiAgICAgIHMxMCwgczEsICBzMTAKKyAgICAgICAgdnN0bWlhZ2UgICAgICAgIHIwISwge3MyNC1zMjd9CisgICAgICAgIHZtdWxnZS5mMzIgICAgICBzMTEsIHMwLCAgczExCisgICAgICAgIGl0ICAgICAgICAgICAgICBnZQorICAgICAgICB2c3RtaWFnZSAgICAgICAgcjAhLCB7czI4LXMzMX0KKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCisvKioKKyAqIEFSTSBWRlAgaW1wbGVtZW50YXRpb24gb2YgJ2J1dHRlcmZsaWVzX2Zsb2F0X2MnIGZ1bmN0aW9uCisgKiBBc3N1bWUgdGhhdCBsZW4gaXMgYSBwb3NpdGl2ZSBub24temVybyBudW1iZXIKKyAqLworQCB2b2lkIGZmX2J1dHRlcmZsaWVzX2Zsb2F0X3ZmcChmbG9hdCAqcmVzdHJpY3QgdjEsIGZsb2F0ICpyZXN0cmljdCB2MiwgaW50IGxlbikKK2Z1bmN0aW9uIGZmX2J1dHRlcmZsaWVzX2Zsb2F0X3ZmcCwgZXhwb3J0PTEKK0JBU0UxICAgLnJlcSAgICBhMQorQkFTRTIgICAucmVxICAgIGEyCitMRU4gICAgIC5yZXEgICAgYTMKK09MREZQU0NSIC5yZXEgICBhNAorCisgICAgICAgIHZwdXNoICAge3MxNi1zMzF9CisgICAgICAgIGZtcnggICAgT0xERlBTQ1IsIEZQU0NSCisKKyAgICAgICAgdHN0ICAgICBMRU4sICM3CisgICAgICAgIGJlcSAgICAgNGYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY29tbW9uIGNhc2U6IGxlbiBpcyBhIG11bHRpcGxlIG9mIDgKKworICAgICAgICBsZHIgICAgIGlwLCA9MHgwMzAwMDAwMCAgICAgICAgICAgICBAIFJ1bkZhc3QgbW9kZSwgc2NhbGFyIG1vZGUKKyAgICAgICAgZm14ciAgICBGUFNDUiwgaXAKKworICAgICAgICB0c3QgICAgIExFTiwgIzEKKyAgICAgICAgYmVxICAgICAxZgorICAgICAgICB2bGRtaWEgIEJBU0UxISwge3MwfQorICAgICAgICB2bGRtaWEgIEJBU0UyISwge3M4fQorICAgICAgICB2YWRkLmYgIHMxNiwgczAsIHM4CisgICAgICAgIHZzdWIuZiAgczI0LCBzMCwgczgKKyAgICAgICAgdnN0ciAgICBzMTYsIFtCQVNFMSwgIzAtNCoxXQorICAgICAgICB2c3RyICAgIHMyNCwgW0JBU0UyLCAjMC00KjFdCisxOgorICAgICAgICB0c3QgICAgIExFTiwgIzIKKyAgICAgICAgYmVxICAgICAyZgorICAgICAgICB2bGRtaWEgIEJBU0UxISwge3MwLXMxfQorICAgICAgICB2bGRtaWEgIEJBU0UyISwge3M4LXM5fQorICAgICAgICB2YWRkLmYgIHMxNiwgczAsIHM4CisgICAgICAgIHZhZGQuZiAgczE3LCBzMSwgczkKKyAgICAgICAgdnN1Yi5mICBzMjQsIHMwLCBzOAorICAgICAgICB2c3ViLmYgIHMyNSwgczEsIHM5CisgICAgICAgIHZzdHIgICAgZDgsIFtCQVNFMSwgIzAtOCoxXSAgICBAIHMxNixzMTcKKyAgICAgICAgdnN0ciAgICBkMTIsIFtCQVNFMiwgIzAtOCoxXSAgIEAgczI0LHMyNQorMjoKKyAgICAgICAgdHN0ICAgICBMRU4sICM0CisgICAgICAgIGJlcSAgICAgM2YKKyAgICAgICAgdmxkbWlhICBCQVNFMSEsIHtzMC1zMX0KKyAgICAgICAgdmxkbWlhICBCQVNFMiEsIHtzOC1zOX0KKyAgICAgICAgdmxkbWlhICBCQVNFMSEsIHtzMi1zM30KKyAgICAgICAgdmxkbWlhICBCQVNFMiEsIHtzMTAtczExfQorICAgICAgICB2YWRkLmYgIHMxNiwgczAsIHM4CisgICAgICAgIHZhZGQuZiAgczE3LCBzMSwgczkKKyAgICAgICAgdnN1Yi5mICBzMjQsIHMwLCBzOAorICAgICAgICB2c3ViLmYgIHMyNSwgczEsIHM5CisgICAgICAgIHZhZGQuZiAgczE4LCBzMiwgczEwCisgICAgICAgIHZhZGQuZiAgczE5LCBzMywgczExCisgICAgICAgIHZzdWIuZiAgczI2LCBzMiwgczEwCisgICAgICAgIHZzdWIuZiAgczI3LCBzMywgczExCisgICAgICAgIHZzdHIgICAgZDgsIFtCQVNFMSwgIzAtMTYqMV0gICAgQCBzMTYsczE3CisgICAgICAgIHZzdHIgICAgZDEyLCBbQkFTRTIsICMwLTE2KjFdICAgQCBzMjQsczI1CisgICAgICAgIHZzdHIgICAgZDksIFtCQVNFMSwgIzgtMTYqMV0gICAgQCBzMTgsczE5CisgICAgICAgIHZzdHIgICAgZDEzLCBbQkFTRTIsICM4LTE2KjFdICAgQCBzMjYsczI3CiszOgorICAgICAgICBiaWNzICAgIExFTiwgTEVOLCAjNworICAgICAgICBiZXEgICAgIDdmCis0OgorICAgICAgICBsZHIgICAgIGlwLCA9MHgwMzAzMDAwMCAgICAgICAgICAgICBAIFJ1bkZhc3QgbW9kZSwgc2hvcnQgdmVjdG9ycyBvZiBsZW5ndGggNCwgc3RyaWRlIDEKKyAgICAgICAgZm14ciAgICBGUFNDUiwgaXAKKworICAgICAgICB2bGRtaWEgIEJBU0UxISwge3MwLXMxfQorICAgICAgICB2bGRtaWEgIEJBU0UyISwge3M4LXM5fQorICAgICAgICB2bGRtaWEgIEJBU0UxISwge3MyLXMzfQorICAgICAgICB2bGRtaWEgIEJBU0UyISwge3MxMC1zMTF9CisgICAgICAgIHZhZGQuZiAgczE2LCBzMCwgczgKKyAgICAgICAgICAgIHZsZG1pYSAgQkFTRTEhLCB7czQtczV9CisgICAgICAgICAgICB2bGRtaWEgIEJBU0UyISwge3MxMi1zMTN9CisgICAgICAgICAgICB2bGRtaWEgIEJBU0UxISwge3M2LXM3fQorICAgICAgICAgICAgdmxkbWlhICBCQVNFMiEsIHtzMTQtczE1fQorICAgICAgICB2c3ViLmYgIHMyNCwgczAsIHM4CisgICAgICAgICAgICB2YWRkLmYgIHMyMCwgczQsIHMxMgorICAgICAgICBzdWJzICAgIExFTiwgTEVOLCAjOAorICAgICAgICBiZXEgICAgIDZmCis1OiAgICAgICAgICAgICAgdmxkbWlhICBCQVNFMSEsIHtzMC1zM30KKyAgICAgICAgICAgICAgICB2bGRtaWEgIEJBU0UyISwge3M4LXMxMX0KKyAgICAgICAgICAgIHZzdWIuZiAgczI4LCBzNCwgczEyCisgICAgICAgIHZzdHIgICAgZDgsIFtCQVNFMSwgIzAtMTYqM10gICAgQCBzMTYsczE3CisgICAgICAgIHZzdHIgICAgZDksIFtCQVNFMSwgIzgtMTYqM10gICAgQCBzMTgsczE5CisgICAgICAgIHZzdHIgICAgZDEyLCBbQkFTRTIsICMwLTE2KjNdICAgQCBzMjQsczI1CisgICAgICAgIHZzdHIgICAgZDEzLCBbQkFTRTIsICM4LTE2KjNdICAgQCBzMjYsczI3CisgICAgICAgICAgICAgICAgdmFkZC5mICBzMTYsIHMwLCBzOAorICAgICAgICAgICAgICAgICAgICB2bGRtaWEgIEJBU0UxISwge3M0LXM3fQorICAgICAgICAgICAgICAgICAgICB2bGRtaWEgIEJBU0UyISwge3MxMi1zMTV9CisgICAgICAgICAgICAgICAgdnN1Yi5mICBzMjQsIHMwLCBzOAorICAgICAgICAgICAgdnN0ciAgICBkMTAsIFtCQVNFMSwgIzAtMTYqM10gICBAIHMyMCxzMjEKKyAgICAgICAgICAgIHZzdHIgICAgZDExLCBbQkFTRTEsICM4LTE2KjNdICAgQCBzMjIsczIzCisgICAgICAgICAgICB2c3RyICAgIGQxNCwgW0JBU0UyLCAjMC0xNiozXSAgIEAgczI4LHMyOQorICAgICAgICAgICAgdnN0ciAgICBkMTUsIFtCQVNFMiwgIzgtMTYqM10gICBAIHMzMCxzMzEKKyAgICAgICAgICAgICAgICAgICAgdmFkZC5mICBzMjAsIHM0LCBzMTIKKyAgICAgICAgc3VicyAgICBMRU4sIExFTiwgIzgKKyAgICAgICAgYm5lICAgICA1YgorNjogICAgICAgICAgICAgICAgICAgdnN1Yi5mICBzMjgsIHM0LCBzMTIKKyAgICAgICAgICAgICAgICB2c3RyICAgIGQ4LCBbQkFTRTEsICMwLTE2KjJdICAgIEAgczE2LHMxNworICAgICAgICAgICAgICAgIHZzdHIgICAgZDksIFtCQVNFMSwgIzgtMTYqMl0gICAgQCBzMTgsczE5CisgICAgICAgICAgICAgICAgdnN0ciAgICBkMTIsIFtCQVNFMiwgIzAtMTYqMl0gICBAIHMyNCxzMjUKKyAgICAgICAgICAgICAgICB2c3RyICAgIGQxMywgW0JBU0UyLCAjOC0xNioyXSAgIEAgczI2LHMyNworICAgICAgICAgICAgICAgICAgICB2c3RyICAgIGQxMCwgW0JBU0UxLCAjMC0xNioxXSAgIEAgczIwLHMyMQorICAgICAgICAgICAgICAgICAgICB2c3RyICAgIGQxMSwgW0JBU0UxLCAjOC0xNioxXSAgIEAgczIyLHMyMworICAgICAgICAgICAgICAgICAgICB2c3RyICAgIGQxNCwgW0JBU0UyLCAjMC0xNioxXSAgIEAgczI4LHMyOQorICAgICAgICAgICAgICAgICAgICB2c3RyICAgIGQxNSwgW0JBU0UyLCAjOC0xNioxXSAgIEAgczMwLHMzMQorNzoKKyAgICAgICAgZm14ciAgICBGUFNDUiwgT0xERlBTQ1IKKyAgICAgICAgdnBvcCAgICB7czE2LXMzMX0KKyAgICAgICAgYnggICAgICBscgorCisgICAgICAgIC51bnJlcSAgQkFTRTEKKyAgICAgICAgLnVucmVxICBCQVNFMgorICAgICAgICAudW5yZXEgIExFTgorICAgICAgICAudW5yZXEgIE9MREZQU0NSCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2FybS9pbnRtYXRoLmggYi9mZm1wZWcvbGliYXZ1dGlsL2FybS9pbnRtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1MjY0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXJtL2ludG1hdGguaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQVJNX0lOVE1BVEhfSAorI2RlZmluZSBBVlVUSUxfQVJNX0lOVE1BVEhfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKKyNpZiBIQVZFX0FSTVY2X0lOTElORQorCisjZGVmaW5lIGF2X2NsaXBfdWludDggYXZfY2xpcF91aW50OF9hcm0KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IHVuc2lnbmVkIGF2X2NsaXBfdWludDhfYXJtKGludCBhKQoreworICAgIHVuc2lnbmVkIHg7CisgICAgX19hc21fXyAoInVzYXQgJTAsICM4LCAgJTEiIDogIj1yIih4KSA6ICJyIihhKSk7CisgICAgcmV0dXJuIHg7Cit9CisKKyNkZWZpbmUgYXZfY2xpcF9pbnQ4IGF2X2NsaXBfaW50OF9hcm0KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IGludCBhdl9jbGlwX2ludDhfYXJtKGludCBhKQoreworICAgIGludCB4OworICAgIF9fYXNtX18gKCJzc2F0ICUwLCAjOCwgICUxIiA6ICI9ciIoeCkgOiAiciIoYSkpOworICAgIHJldHVybiB4OworfQorCisjZGVmaW5lIGF2X2NsaXBfdWludDE2IGF2X2NsaXBfdWludDE2X2FybQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgdW5zaWduZWQgYXZfY2xpcF91aW50MTZfYXJtKGludCBhKQoreworICAgIHVuc2lnbmVkIHg7CisgICAgX19hc21fXyAoInVzYXQgJTAsICMxNiwgJTEiIDogIj1yIih4KSA6ICJyIihhKSk7CisgICAgcmV0dXJuIHg7Cit9CisKKyNkZWZpbmUgYXZfY2xpcF9pbnQxNiBhdl9jbGlwX2ludDE2X2FybQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IGF2X2NsaXBfaW50MTZfYXJtKGludCBhKQoreworICAgIGludCB4OworICAgIF9fYXNtX18gKCJzc2F0ICUwLCAjMTYsICUxIiA6ICI9ciIoeCkgOiAiciIoYSkpOworICAgIHJldHVybiB4OworfQorCisjZGVmaW5lIGF2X2NsaXBfdWludHAyIGF2X2NsaXBfdWludHAyX2FybQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgdW5zaWduZWQgYXZfY2xpcF91aW50cDJfYXJtKGludCBhLCBpbnQgcCkKK3sKKyAgICB1bnNpZ25lZCB4OworICAgIF9fYXNtX18gKCJ1c2F0ICUwLCAlMiwgJTEiIDogIj1yIih4KSA6ICJyIihhKSwgImkiKHApKTsKKyAgICByZXR1cm4geDsKK30KKworI2RlZmluZSBhdl9zYXRfYWRkMzIgYXZfc2F0X2FkZDMyX2FybQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGF2X3NhdF9hZGQzMl9hcm0oaW50IGEsIGludCBiKQoreworICAgIGludCByOworICAgIF9fYXNtX18gKCJxYWRkICUwLCAlMSwgJTIiIDogIj1yIihyKSA6ICJyIihhKSwgInIiKGIpKTsKKyAgICByZXR1cm4gcjsKK30KKworI2RlZmluZSBhdl9zYXRfZGFkZDMyIGF2X3NhdF9kYWRkMzJfYXJtCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgYXZfc2F0X2RhZGQzMl9hcm0oaW50IGEsIGludCBiKQoreworICAgIGludCByOworICAgIF9fYXNtX18gKCJxZGFkZCAlMCwgJTEsICUyIiA6ICI9ciIocikgOiAiciIoYSksICJyIihiKSk7CisgICAgcmV0dXJuIHI7Cit9CisKKyNlbmRpZiAvKiBIQVZFX0FSTVY2X0lOTElORSAqLworCisjaWYgSEFWRV9BU01fTU9EX1EKKworI2RlZmluZSBhdl9jbGlwbF9pbnQzMiBhdl9jbGlwbF9pbnQzMl9hcm0KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IGludDMyX3QgYXZfY2xpcGxfaW50MzJfYXJtKGludDY0X3QgYSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBfX2FzbV9fICgiYWRkcyAgICUxLCAlUjIsICVRMiwgbHNyICMzMSAgXG5cdCIKKyAgICAgICAgICAgICAiaXRldCAgIG5lICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibXZubmUgICUxLCAjMTw8MzEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibW92ZXEgICUwLCAlUTIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAiZW9ybmUgICUwLCAlMSwgICVSMiwgYXNyICMzMSAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9ciIoeCksICI9JnIiKHkpIDogInIiKGEpIDogImNjIik7CisgICAgcmV0dXJuIHg7Cit9CisKKyNlbmRpZiAvKiBIQVZFX0FTTV9NT0RfUSAqLworCisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCisKKyNlbmRpZiAvKiBBVlVUSUxfQVJNX0lOVE1BVEhfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hcm0vaW50cmVhZHdyaXRlLmggYi9mZm1wZWcvbGliYXZ1dGlsL2FybS9pbnRyZWFkd3JpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQwYTlhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hcm0vaW50cmVhZHdyaXRlLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9BUk1fSU5UUkVBRFdSSVRFX0gKKyNkZWZpbmUgQVZVVElMX0FSTV9JTlRSRUFEV1JJVEVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKworI2lmIEhBVkVfRkFTVF9VTkFMSUdORUQgJiYgSEFWRV9JTkxJTkVfQVNNICYmICFBVl9HQ0NfVkVSU0lPTl9BVF9MRUFTVCg0LDcpCisKKyNkZWZpbmUgQVZfUk4xNiBBVl9STjE2CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBBVl9STjE2KGNvbnN0IHZvaWQgKnApCit7CisgICAgY29uc3QgdWludDhfdCAqcSA9IHA7CisgICAgdW5zaWduZWQgdjsKKyNpZiAhQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoNCw2KQorICAgIF9fYXNtX18gKCJsZHJoICUwLCAlMSIgOiAiPXIiKHYpIDogIm0iKCooY29uc3QgdWludDE2X3QgKilxKSk7CisjZWxpZiBkZWZpbmVkIF9fdGh1bWJfXworICAgIF9fYXNtX18gKCJsZHJoICUwLCAlMSIgOiAiPXIiKHYpIDogIm0iKHFbMF0pLCAibSIocVsxXSkpOworI2Vsc2UKKyAgICBfX2FzbV9fICgibGRyaCAlMCwgJTEiIDogIj1yIih2KSA6ICJVcSIocVswXSksICJtIihxWzFdKSk7CisjZW5kaWYKKyAgICByZXR1cm4gdjsKK30KKworI2RlZmluZSBBVl9XTjE2IEFWX1dOMTYKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgQVZfV04xNih2b2lkICpwLCB1aW50MTZfdCB2KQoreworICAgIF9fYXNtX18gKCJzdHJoICUxLCAlMCIgOiAiPW0iKCoodWludDE2X3QgKilwKSA6ICJyIih2KSk7Cit9CisKKyNkZWZpbmUgQVZfUk4zMiBBVl9STjMyCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50MzJfdCBBVl9STjMyKGNvbnN0IHZvaWQgKnApCit7CisgICAgY29uc3Qgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHsgdWludDMyX3QgdjsgfSAqcSA9IHA7CisgICAgdWludDMyX3QgdjsKKyAgICBfX2FzbV9fICgibGRyICAlMCwgJTEiIDogIj1yIih2KSA6ICJtIigqcSkpOworICAgIHJldHVybiB2OworfQorCisjZGVmaW5lIEFWX1dOMzIgQVZfV04zMgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBBVl9XTjMyKHZvaWQgKnAsIHVpbnQzMl90IHYpCit7CisgICAgX19hc21fXyAoInN0ciAgJTEsICUwIiA6ICI9bSIoKih1aW50MzJfdCAqKXApIDogInIiKHYpKTsKK30KKworI2lmIEhBVkVfQVNNX01PRF9RCisKKyNkZWZpbmUgQVZfUk42NCBBVl9STjY0CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50NjRfdCBBVl9STjY0KGNvbnN0IHZvaWQgKnApCit7CisgICAgY29uc3Qgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHsgdWludDMyX3QgdjsgfSAqcSA9IHA7CisgICAgdWludDY0X3QgdjsKKyAgICBfX2FzbV9fICgibGRyICAgJVEwLCAlMSAgXG5cdCIKKyAgICAgICAgICAgICAibGRyICAgJVIwLCAlMiAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9JnIiKHYpCisgICAgICAgICAgICAgOiAibSIocVswXSksICJtIihxWzFdKSk7CisgICAgcmV0dXJuIHY7Cit9CisKKyNkZWZpbmUgQVZfV042NCBBVl9XTjY0CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEFWX1dONjQodm9pZCAqcCwgdWludDY0X3QgdikKK3sKKyAgICBfX2FzbV9fICgic3RyICAlUTIsICUwICBcblx0IgorICAgICAgICAgICAgICJzdHIgICVSMiwgJTEgIFxuXHQiCisgICAgICAgICAgICAgOiAiPW0iKCoodWludDMyX3QqKXApLCAiPW0iKCooKHVpbnQzMl90KilwKzEpKQorICAgICAgICAgICAgIDogInIiKHYpKTsKK30KKworI2VuZGlmIC8qIEhBVkVfQVNNX01PRF9RICovCisKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworI2VuZGlmIC8qIEFWVVRJTF9BUk1fSU5UUkVBRFdSSVRFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXJtL25lb250ZXN0LmggYi9mZm1wZWcvbGliYXZ1dGlsL2FybS9uZW9udGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjhjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2FybS9uZW9udGVzdC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBjaGVjayBORU9OIHJlZ2lzdGVycyBmb3IgY2xvYmJlcmluZworICogQ29weXJpZ2h0IChjKSAyMDA4IFJhbWlybyBQb2xsYSA8cmFtaXJvLnBvbGxhQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorCisjZGVmaW5lIHN0b3JlbmVvbnJlZ3MobWVtKSAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSggICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJ2c3RtICUwLCB7ZDgtZDE1fVxuXHQiICAgICAgICAgICBcCisgICAgICAgIDo6ICJyIihtZW0pIDogIm1lbW9yeSIpCisKKyNkZWZpbmUgdGVzdG5lb25jbG9iYmVycyhmdW5jLCBjdHgsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDY0X3QgbmVvblsyXVs4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdG9yZW5lb25yZWdzKG5lb25bMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0ID0gX19yZWFsXyAjIyBmdW5jKGN0eCwgX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0b3JlbmVvbnJlZ3MobmVvblsxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobWVtY21wKG5lb25bMF0sIG5lb25bMV0sIHNpemVvZihuZW9uWzBdKSkpIHsgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICJORU9OIFJFR1MgQ0xPQkJFUkVEIElOICVzIVxuIiwgI2Z1bmMpOyAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG5lb25bMF1baV0gIT0gbmVvblsxXVtpXSkgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICJkJS0yZCA9ICUwMTYiUFJJeDY0IlxuIiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICA4ICsgaSwgYXZfYnN3YXA2NChuZW9uWzBdW2ldKSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICIgICAtPiAlMDE2IlBSSXg2NCJcbiIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBhdl9ic3dhcDY0KG5lb25bMV1baV0pKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmV0CisKKyNkZWZpbmUgd3JhcChmdW5jKSAgICAgIFwKK2ludCBfX3JlYWxfICMjIGZ1bmM7ICAgIFwKK2ludCBfX3dyYXBfICMjIGZ1bmM7ICAgIFwKK2ludCBfX3dyYXBfICMjIGZ1bmMKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXJtL3RpbWVyLmggYi9mZm1wZWcvbGliYXZ1dGlsL2FybS90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOGJjOGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2FybS90aW1lci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0FSTV9USU1FUl9ICisjZGVmaW5lIEFWVVRJTF9BUk1fVElNRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX0lOTElORV9BU00gJiYgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pCisKKyNkZWZpbmUgQVZfUkVBRF9USU1FIHJlYWRfdGltZQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IHJlYWRfdGltZSh2b2lkKQoreworICAgIHVuc2lnbmVkIGNjOworICAgIF9fYXNtX18gdm9sYXRpbGUgKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMywgMCIgOiAiPXIiKGNjKSk7CisgICAgcmV0dXJuIGNjOworfQorCisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICYmIF9fQVJNX0FSQ0hfN0FfXyAqLworCisjZW5kaWYgLyogQVZVVElMX0FSTV9USU1FUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2F0b21pYy5jIGIvZmZtcGVnL2xpYmF2dXRpbC9hdG9taWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmE2MzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hdG9taWMuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJhdG9taWMuaCIKKworI2lmICFIQVZFX0FUT01JQ1NfTkFUSVZFCisKKyNpZiBIQVZFX1BUSFJFQURTCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgYXRvbWljX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCitpbnQgYXZwcml2X2F0b21pY19pbnRfZ2V0KHZvbGF0aWxlIGludCAqcHRyKQoreworICAgIGludCByZXM7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmF0b21pY19sb2NrKTsKKyAgICByZXMgPSAqcHRyOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhdG9taWNfbG9jayk7CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIGF2cHJpdl9hdG9taWNfaW50X3NldCh2b2xhdGlsZSBpbnQgKnB0ciwgaW50IHZhbCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmF0b21pY19sb2NrKTsKKyAgICAqcHRyID0gdmFsOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhdG9taWNfbG9jayk7Cit9CisKK2ludCBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKHZvbGF0aWxlIGludCAqcHRyLCBpbnQgaW5jKQoreworICAgIGludCByZXM7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmF0b21pY19sb2NrKTsKKyAgICAqcHRyICs9IGluYzsKKyAgICByZXMgPSAqcHRyOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhdG9taWNfbG9jayk7CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkICphdnByaXZfYXRvbWljX3B0cl9jYXModm9pZCAqIHZvbGF0aWxlICpwdHIsIHZvaWQgKm9sZHZhbCwgdm9pZCAqbmV3dmFsKQoreworICAgIHZvaWQgKnJldDsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmF0b21pY19sb2NrKTsKKyAgICByZXQgPSAqcHRyOworICAgIGlmICgqcHRyID09IG9sZHZhbCkKKyAgICAgICAgKnB0ciA9IG5ld3ZhbDsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYXRvbWljX2xvY2spOworICAgIHJldHVybiByZXQ7Cit9CisKKyNlbGlmICFIQVZFX1RIUkVBRFMKKworaW50IGF2cHJpdl9hdG9taWNfaW50X2dldCh2b2xhdGlsZSBpbnQgKnB0cikKK3sKKyAgICByZXR1cm4gKnB0cjsKK30KKwordm9pZCBhdnByaXZfYXRvbWljX2ludF9zZXQodm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWwpCit7CisgICAgKnB0ciA9IHZhbDsKK30KKworaW50IGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2godm9sYXRpbGUgaW50ICpwdHIsIGludCBpbmMpCit7CisgICAgKnB0ciArPSBpbmM7CisgICAgcmV0dXJuICpwdHI7Cit9CisKK3ZvaWQgKmF2cHJpdl9hdG9taWNfcHRyX2Nhcyh2b2lkICogdm9sYXRpbGUgKnB0ciwgdm9pZCAqb2xkdmFsLCB2b2lkICpuZXd2YWwpCit7CisgICAgaWYgKCpwdHIgPT0gb2xkdmFsKSB7CisgICAgICAgICpwdHIgPSBuZXd2YWw7CisgICAgICAgIHJldHVybiBvbGR2YWw7CisgICAgfQorICAgIHJldHVybiAqcHRyOworfQorCisjZWxzZSAvKiBIQVZFX1RIUkVBRFMgKi8KKworLyogVGhpcyBzaG91bGQgbmV2ZXIgdHJpZ2dlciwgdW5sZXNzIGEgbmV3IHRocmVhZGluZyBpbXBsZW1lbnRhdGlvbgorICogd2l0aG91dCBjb3JyZWN0IGF0b21pY3MgZGVwZW5kZW5jaWVzIGluIGNvbmZpZ3VyZSBvciBhIGNvcnJlc3BvbmRpbmcKKyAqIGF0b21pY3MgaW1wbGVtZW50YXRpb24gaXMgYWRkZWQuICovCisjZXJyb3IgIlRocmVhZGluZyBpcyBlbmFibGVkLCBidXQgdGhlcmUgaXMgbm8gaW1wbGVtZW50YXRpb24gb2YgYXRvbWljIG9wZXJhdGlvbnMgYXZhaWxhYmxlIgorCisjZW5kaWYgLyogSEFWRV9QVEhSRUFEUyAqLworCisjZW5kaWYgLyogIUhBVkVfQVRPTUlDU19OQVRJVkUgKi8KKworI2lmZGVmIFRFU1QKKyNpbmNsdWRlICJhdmFzc2VydC5oIgorCitpbnQgbWFpbih2b2lkKQoreworICAgIHZvbGF0aWxlIGludCB2YWwgPSAxOworICAgIGludCByZXM7CisKKyAgICByZXMgPSBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZ2YWwsIDEpOworICAgIGF2X2Fzc2VydDAocmVzID09IDIpOworICAgIGF2cHJpdl9hdG9taWNfaW50X3NldCgmdmFsLCAzKTsKKyAgICByZXMgPSBhdnByaXZfYXRvbWljX2ludF9nZXQoJnZhbCk7CisgICAgYXZfYXNzZXJ0MChyZXMgPT0gMyk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hdG9taWMuaCBiL2ZmbXBlZy9saWJhdnV0aWwvYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5MDZkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXRvbWljLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0FUT01JQ19ICisjZGVmaW5lIEFWVVRJTF9BVE9NSUNfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX0FUT01JQ1NfTkFUSVZFCisKKyNpZiBIQVZFX0FUT01JQ1NfR0NDCisjaW5jbHVkZSAiYXRvbWljX2djYy5oIgorI2VsaWYgSEFWRV9BVE9NSUNTX1dJTjMyCisjaW5jbHVkZSAiYXRvbWljX3dpbjMyLmgiCisjZWxpZiBIQVZFX0FUT01JQ1NfU1VOQ0MKKyNpbmNsdWRlICJhdG9taWNfc3VuY2MuaCIKKyNlbmRpZgorCisjZWxzZQorCisvKioKKyAqIExvYWQgdGhlIGN1cnJlbnQgdmFsdWUgc3RvcmVkIGluIGFuIGF0b21pYyBpbnRlZ2VyLgorICoKKyAqIEBwYXJhbSBwdHIgYXRvbWljIGludGVnZXIKKyAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGF0b21pYyBpbnRlZ2VyCisgKiBAbm90ZSBUaGlzIGFjdHMgYXMgYSBtZW1vcnkgYmFycmllci4KKyAqLworaW50IGF2cHJpdl9hdG9taWNfaW50X2dldCh2b2xhdGlsZSBpbnQgKnB0cik7CisKKy8qKgorICogU3RvcmUgYSBuZXcgdmFsdWUgaW4gYW4gYXRvbWljIGludGVnZXIuCisgKgorICogQHBhcmFtIHB0ciBhdG9taWMgaW50ZWdlcgorICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIGF0b21pYyBpbnRlZ2VyCisgKiBAbm90ZSBUaGlzIGFjdHMgYXMgYSBtZW1vcnkgYmFycmllci4KKyAqLwordm9pZCBhdnByaXZfYXRvbWljX2ludF9zZXQodm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWwpOworCisvKioKKyAqIEFkZCBhIHZhbHVlIHRvIGFuIGF0b21pYyBpbnRlZ2VyLgorICoKKyAqIEBwYXJhbSBwdHIgYXRvbWljIGludGVnZXIKKyAqIEBwYXJhbSBpbmMgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgYXRvbWljIGludGVnZXIgKG1heSBiZSBuZWdhdGl2ZSkKKyAqIEByZXR1cm4gdGhlIG5ldyB2YWx1ZSBvZiB0aGUgYXRvbWljIGludGVnZXIuCisgKiBAbm90ZSBUaGlzIGRvZXMgTk9UIGFjdCBhcyBhIG1lbW9yeSBiYXJyaWVyLiBUaGlzIGlzIHByaW1hcmlseQorICogICAgICAgaW50ZW5kZWQgZm9yIHJlZmVyZW5jZSBjb3VudGluZy4KKyAqLworaW50IGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2godm9sYXRpbGUgaW50ICpwdHIsIGludCBpbmMpOworCisvKioKKyAqIEF0b21pYyBwb2ludGVyIGNvbXBhcmUgYW5kIHN3YXAuCisgKgorICogQHBhcmFtIHB0ciBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIG9wZXJhdGUgb24KKyAqIEBwYXJhbSBvbGR2YWwgZG8gdGhlIHN3YXAgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgKnB0ciBlcXVhbHMgdG8gb2xkdmFsCisgKiBAcGFyYW0gbmV3dmFsIHZhbHVlIHRvIHJlcGxhY2UgKnB0ciB3aXRoCisgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiAqcHRyIGJlZm9yZSBjb21wYXJpc29uCisgKi8KK3ZvaWQgKmF2cHJpdl9hdG9taWNfcHRyX2Nhcyh2b2lkICogdm9sYXRpbGUgKnB0ciwgdm9pZCAqb2xkdmFsLCB2b2lkICpuZXd2YWwpOworCisjZW5kaWYgLyogSEFWRV9BVE9NSUNTX05BVElWRSAqLworCisjZW5kaWYgLyogQVZVVElMX0FUT01JQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2F0b21pY19nY2MuaCBiL2ZmbXBlZy9saWJhdnV0aWwvYXRvbWljX2djYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOWZjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2F0b21pY19nY2MuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQVRPTUlDX0dDQ19ICisjZGVmaW5lIEFWVVRJTF9BVE9NSUNfR0NDX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYXRvbWljLmgiCisKKyNkZWZpbmUgYXZwcml2X2F0b21pY19pbnRfZ2V0IGF0b21pY19pbnRfZ2V0X2djYworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2ludF9nZXRfZ2NjKHZvbGF0aWxlIGludCAqcHRyKQoreworI2lmIEhBVkVfQVRPTUlDX0NPTVBBUkVfRVhDSEFOR0UKKyAgICByZXR1cm4gX19hdG9taWNfbG9hZF9uKHB0ciwgX19BVE9NSUNfU0VRX0NTVCk7CisjZWxzZQorICAgIF9fc3luY19zeW5jaHJvbml6ZSgpOworICAgIHJldHVybiAqcHRyOworI2VuZGlmCit9CisKKyNkZWZpbmUgYXZwcml2X2F0b21pY19pbnRfc2V0IGF0b21pY19pbnRfc2V0X2djYworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19pbnRfc2V0X2djYyh2b2xhdGlsZSBpbnQgKnB0ciwgaW50IHZhbCkKK3sKKyNpZiBIQVZFX0FUT01JQ19DT01QQVJFX0VYQ0hBTkdFCisgICAgX19hdG9taWNfc3RvcmVfbihwdHIsIHZhbCwgX19BVE9NSUNfU0VRX0NTVCk7CisjZWxzZQorICAgICpwdHIgPSB2YWw7CisgICAgX19zeW5jX3N5bmNocm9uaXplKCk7CisjZW5kaWYKK30KKworI2RlZmluZSBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoIGF0b21pY19pbnRfYWRkX2FuZF9mZXRjaF9nY2MKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19pbnRfYWRkX2FuZF9mZXRjaF9nY2Modm9sYXRpbGUgaW50ICpwdHIsIGludCBpbmMpCit7CisjaWYgSEFWRV9BVE9NSUNfQ09NUEFSRV9FWENIQU5HRQorICAgIHJldHVybiBfX2F0b21pY19hZGRfZmV0Y2gocHRyLCBpbmMsIF9fQVRPTUlDX1NFUV9DU1QpOworI2Vsc2UKKyAgICByZXR1cm4gX19zeW5jX2FkZF9hbmRfZmV0Y2gocHRyLCBpbmMpOworI2VuZGlmCit9CisKKyNkZWZpbmUgYXZwcml2X2F0b21pY19wdHJfY2FzIGF0b21pY19wdHJfY2FzX2djYworc3RhdGljIGlubGluZSB2b2lkICphdG9taWNfcHRyX2Nhc19nY2Modm9pZCAqIHZvbGF0aWxlICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvbGR2YWwsIHZvaWQgKm5ld3ZhbCkKK3sKKyNpZiBIQVZFX1NZTkNfVkFMX0NPTVBBUkVfQU5EX1NXQVAKKyNpZmRlZiBfX0FSTUNDX1ZFUlNJT04KKyAgICAvLyBhcm1jYyB3aWxsIHRocm93IGFuIGVycm9yIGlmIHB0ciBpcyBub3QgYW4gaW50ZWdlciB0eXBlCisgICAgdm9sYXRpbGUgdWludHB0cl90ICp0bXAgPSAodm9sYXRpbGUgdWludHB0cl90KilwdHI7CisgICAgcmV0dXJuICh2b2lkKilfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAodG1wLCBvbGR2YWwsIG5ld3ZhbCk7CisjZWxzZQorICAgIHJldHVybiBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAocHRyLCBvbGR2YWwsIG5ld3ZhbCk7CisjZW5kaWYKKyNlbHNlCisgICAgX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKHB0ciwgJm9sZHZhbCwgbmV3dmFsLCAwLCBfX0FUT01JQ19TRVFfQ1NULCBfX0FUT01JQ19TRVFfQ1NUKTsKKyAgICByZXR1cm4gb2xkdmFsOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBBVlVUSUxfQVRPTUlDX0dDQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2F0b21pY19zdW5jYy5oIGIvZmZtcGVnL2xpYmF2dXRpbC9hdG9taWNfc3VuY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2FkMjRhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hdG9taWNfc3VuY2MuaApAQCAtMCwwICsxLDU1IEBACisvKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9BVE9NSUNfU1VOQ0NfSAorI2RlZmluZSBBVlVUSUxfQVRPTUlDX1NVTkNDX0gKKworI2luY2x1ZGUgPGF0b21pYy5oPgorI2luY2x1ZGUgPG1iYXJyaWVyLmg+CisKKyNpbmNsdWRlICJhdG9taWMuaCIKKworI2RlZmluZSBhdnByaXZfYXRvbWljX2ludF9nZXQgYXRvbWljX2ludF9nZXRfc3VuY2MKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19pbnRfZ2V0X3N1bmNjKHZvbGF0aWxlIGludCAqcHRyKQoreworICAgIF9fbWFjaGluZV9yd19iYXJyaWVyKCk7CisgICAgcmV0dXJuICpwdHI7Cit9CisKKyNkZWZpbmUgYXZwcml2X2F0b21pY19pbnRfc2V0IGF0b21pY19pbnRfc2V0X3N1bmNjCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2ludF9zZXRfc3VuY2Modm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWwpCit7CisgICAgKnB0ciA9IHZhbDsKKyAgICBfX21hY2hpbmVfcndfYmFycmllcigpOworfQorCisjZGVmaW5lIGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2ggYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoX3N1bmNjCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfaW50X2FkZF9hbmRfZmV0Y2hfc3VuY2Modm9sYXRpbGUgaW50ICpwdHIsIGludCBpbmMpCit7CisgICAgcmV0dXJuIGF0b21pY19hZGRfaW50X252KHB0ciwgaW5jKTsKK30KKworI2RlZmluZSBhdnByaXZfYXRvbWljX3B0cl9jYXMgYXRvbWljX3B0cl9jYXNfc3VuY2MKK3N0YXRpYyBpbmxpbmUgdm9pZCAqYXRvbWljX3B0cl9jYXNfc3VuY2Modm9pZCAqIHZvbGF0aWxlICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9sZHZhbCwgdm9pZCAqbmV3dmFsKQoreworICAgIHJldHVybiBhdG9taWNfY2FzX3B0cihwdHIsIG9sZHZhbCwgbmV3dmFsKTsKK30KKworI2VuZGlmIC8qIEFWVVRJTF9BVE9NSUNfU1VOQ0NfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hdG9taWNfd2luMzIuaCBiL2ZmbXBlZy9saWJhdnV0aWwvYXRvbWljX3dpbjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyOTkzMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXRvbWljX3dpbjMyLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0FUT01JQ19XSU4zMl9ICisjZGVmaW5lIEFWVVRJTF9BVE9NSUNfV0lOMzJfSAorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNkZWZpbmUgYXZwcml2X2F0b21pY19pbnRfZ2V0IGF0b21pY19pbnRfZ2V0X3dpbjMyCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfaW50X2dldF93aW4zMih2b2xhdGlsZSBpbnQgKnB0cikKK3sKKyAgICBNZW1vcnlCYXJyaWVyKCk7CisgICAgcmV0dXJuICpwdHI7Cit9CisKKyNkZWZpbmUgYXZwcml2X2F0b21pY19pbnRfc2V0IGF0b21pY19pbnRfc2V0X3dpbjMyCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2ludF9zZXRfd2luMzIodm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWwpCit7CisgICAgKnB0ciA9IHZhbDsKKyAgICBNZW1vcnlCYXJyaWVyKCk7Cit9CisKKyNkZWZpbmUgYXZwcml2X2F0b21pY19pbnRfYWRkX2FuZF9mZXRjaCBhdG9taWNfaW50X2FkZF9hbmRfZmV0Y2hfd2luMzIKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19pbnRfYWRkX2FuZF9mZXRjaF93aW4zMih2b2xhdGlsZSBpbnQgKnB0ciwgaW50IGluYykKK3sKKyAgICByZXR1cm4gaW5jICsgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZChwdHIsIGluYyk7Cit9CisKKyNkZWZpbmUgYXZwcml2X2F0b21pY19wdHJfY2FzIGF0b21pY19wdHJfY2FzX3dpbjMyCitzdGF0aWMgaW5saW5lIHZvaWQgKmF0b21pY19wdHJfY2FzX3dpbjMyKHZvaWQgKiB2b2xhdGlsZSAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvbGR2YWwsIHZvaWQgKm5ld3ZhbCkKK3sKKyAgICByZXR1cm4gSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKHB0ciwgbmV3dmFsLCBvbGR2YWwpOworfQorCisjZW5kaWYgLyogQVZVVElMX0FUT01JQ19XSU4zMl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCBiL2ZmbXBlZy9saWJhdnV0aWwvYXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkM2Y0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2F0dHJpYnV0ZXMuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBmdW5jdGlvbi92YXJpYWJsZSBhdHRyaWJ1dGVzCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQVRUUklCVVRFU19ICisjZGVmaW5lIEFWVVRJTF9BVFRSSUJVVEVTX0gKKworI2lmZGVmIF9fR05VQ19fCisjICAgIGRlZmluZSBBVl9HQ0NfVkVSU0lPTl9BVF9MRUFTVCh4LHkpIChfX0dOVUNfXyA+IHggfHwgX19HTlVDX18gPT0geCAmJiBfX0dOVUNfTUlOT1JfXyA+PSB5KQorI2Vsc2UKKyMgICAgZGVmaW5lIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKHgseSkgMAorI2VuZGlmCisKKyNpZm5kZWYgYXZfYWx3YXlzX2lubGluZQorI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsMSkKKyMgICAgZGVmaW5lIGF2X2Fsd2F5c19pbmxpbmUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpIGlubGluZQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgICAgZGVmaW5lIGF2X2Fsd2F5c19pbmxpbmUgX19mb3JjZWlubGluZQorI2Vsc2UKKyMgICAgZGVmaW5lIGF2X2Fsd2F5c19pbmxpbmUgaW5saW5lCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIGF2X2V4dGVybl9pbmxpbmUKKyNpZiBkZWZpbmVkKF9fSUNMKSAmJiBfX0lDTCA+PSAxMjEwIHx8IGRlZmluZWQoX19HTlVDX1NURENfSU5MSU5FX18pCisjICAgIGRlZmluZSBhdl9leHRlcm5faW5saW5lIGV4dGVybiBpbmxpbmUKKyNlbHNlCisjICAgIGRlZmluZSBhdl9leHRlcm5faW5saW5lIGlubGluZQorI2VuZGlmCisjZW5kaWYKKworI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsMSkKKyMgICAgZGVmaW5lIGF2X25vaW5saW5lIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjICAgIGRlZmluZSBhdl9ub2lubGluZSBfX2RlY2xzcGVjKG5vaW5saW5lKQorI2Vsc2UKKyMgICAgZGVmaW5lIGF2X25vaW5saW5lCisjZW5kaWYKKworI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsMSkKKyMgICAgZGVmaW5lIGF2X3B1cmUgX19hdHRyaWJ1dGVfXygocHVyZSkpCisjZWxzZQorIyAgICBkZWZpbmUgYXZfcHVyZQorI2VuZGlmCisKKyNpZiBBVl9HQ0NfVkVSU0lPTl9BVF9MRUFTVCgyLDYpCisjICAgIGRlZmluZSBhdl9jb25zdCBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCisjZWxzZQorIyAgICBkZWZpbmUgYXZfY29uc3QKKyNlbmRpZgorCisjaWYgQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoNCwzKQorIyAgICBkZWZpbmUgYXZfY29sZCBfX2F0dHJpYnV0ZV9fKChjb2xkKSkKKyNlbHNlCisjICAgIGRlZmluZSBhdl9jb2xkCisjZW5kaWYKKworI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDQsMSkgJiYgIWRlZmluZWQoX19sbHZtX18pCisjICAgIGRlZmluZSBhdl9mbGF0dGVuIF9fYXR0cmlidXRlX18oKGZsYXR0ZW4pKQorI2Vsc2UKKyMgICAgZGVmaW5lIGF2X2ZsYXR0ZW4KKyNlbmRpZgorCisjaWYgQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoMywxKQorIyAgICBkZWZpbmUgYXR0cmlidXRlX2RlcHJlY2F0ZWQgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgICBkZWZpbmUgYXR0cmlidXRlX2RlcHJlY2F0ZWQgX19kZWNsc3BlYyhkZXByZWNhdGVkKQorI2Vsc2UKKyMgICAgZGVmaW5lIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisjZW5kaWYKKworLyoqCisgKiBEaXNhYmxlIHdhcm5pbmdzIGFib3V0IGRlcHJlY2F0ZWQgZmVhdHVyZXMKKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBzZWN0aW9ucyBvZiBjb2RlIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kCisgKiBzY2hlZHVsZWQgZm9yIHJlbW92YWwuCisgKi8KKyNpZm5kZWYgQVZfTk9XQVJOX0RFUFJFQ0FURUQKKyNpZiBBVl9HQ0NfVkVSU0lPTl9BVF9MRUFTVCg0LDYpCisjICAgIGRlZmluZSBBVl9OT1dBUk5fREVQUkVDQVRFRChjb2RlKSBcCisgICAgICAgIF9QcmFnbWEoIkdDQyBkaWFnbm9zdGljIHB1c2giKSBcCisgICAgICAgIF9QcmFnbWEoIkdDQyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zXCIiKSBcCisgICAgICAgIGNvZGUgXAorICAgICAgICBfUHJhZ21hKCJHQ0MgZGlhZ25vc3RpYyBwb3AiKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgICAgZGVmaW5lIEFWX05PV0FSTl9ERVBSRUNBVEVEKGNvZGUpIFwKKyAgICAgICAgX19wcmFnbWEod2FybmluZyhwdXNoKSkgXAorICAgICAgICBfX3ByYWdtYSh3YXJuaW5nKGRpc2FibGUgOiA0OTk2KSkgXAorICAgICAgICBjb2RlOyBcCisgICAgICAgIF9fcHJhZ21hKHdhcm5pbmcocG9wKSkKKyNlbHNlCisjICAgIGRlZmluZSBBVl9OT1dBUk5fREVQUkVDQVRFRChjb2RlKSBjb2RlCisjZW5kaWYKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgICBkZWZpbmUgYXZfdW51c2VkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorIyAgICBkZWZpbmUgYXZfdW51c2VkCisjZW5kaWYKKworLyoqCisgKiBNYXJrIGEgdmFyaWFibGUgYXMgdXNlZCBhbmQgcHJldmVudCB0aGUgY29tcGlsZXIgZnJvbSBvcHRpbWl6aW5nIGl0CisgKiBhd2F5LiAgVGhpcyBpcyB1c2VmdWwgZm9yIHZhcmlhYmxlcyBhY2Nlc3NlZCBvbmx5IGZyb20gaW5saW5lCisgKiBhc3NlbWJsZXIgd2l0aG91dCB0aGUgY29tcGlsZXIgYmVpbmcgYXdhcmUuCisgKi8KKyNpZiBBVl9HQ0NfVkVSU0lPTl9BVF9MRUFTVCgzLDEpCisjICAgIGRlZmluZSBhdl91c2VkIF9fYXR0cmlidXRlX18oKHVzZWQpKQorI2Vsc2UKKyMgICAgZGVmaW5lIGF2X3VzZWQKKyNlbmRpZgorCisjaWYgQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoMywzKQorIyAgIGRlZmluZSBhdl9hbGlhcyBfX2F0dHJpYnV0ZV9fKChtYXlfYWxpYXMpKQorI2Vsc2UKKyMgICBkZWZpbmUgYXZfYWxpYXMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgIWRlZmluZWQoX19jbGFuZ19fKQorIyAgICBkZWZpbmUgYXZfdW5pbml0KHgpIHg9eAorI2Vsc2UKKyMgICAgZGVmaW5lIGF2X3VuaW5pdCh4KSB4CisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjICAgIGRlZmluZSBhdl9idWlsdGluX2NvbnN0YW50X3AgX19idWlsdGluX2NvbnN0YW50X3AKKyMgICAgZGVmaW5lIGF2X3ByaW50Zl9mb3JtYXQoZm10cG9zLCBhdHRycG9zKSBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fKF9fcHJpbnRmX18sIGZtdHBvcywgYXR0cnBvcykpKQorI2Vsc2UKKyMgICAgZGVmaW5lIGF2X2J1aWx0aW5fY29uc3RhbnRfcCh4KSAwCisjICAgIGRlZmluZSBhdl9wcmludGZfZm9ybWF0KGZtdHBvcywgYXR0cnBvcykKKyNlbmRpZgorCisjaWYgQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoMiw1KQorIyAgICBkZWZpbmUgYXZfbm9yZXR1cm4gX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKQorI2Vsc2UKKyMgICAgZGVmaW5lIGF2X25vcmV0dXJuCisjZW5kaWYKKworI2VuZGlmIC8qIEFWVVRJTF9BVFRSSUJVVEVTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXVkaW9fZmlmby5jIGIvZmZtcGVnL2xpYmF2dXRpbC9hdWRpb19maWZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhYWRmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXVkaW9fZmlmby5jCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogQXVkaW8gRklGTworICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEF1ZGlvIEZJRk8KKyAqLworCisjaW5jbHVkZSAiYXZ1dGlsLmgiCisjaW5jbHVkZSAiYXVkaW9fZmlmby5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImZpZm8uaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJzYW1wbGVmbXQuaCIKKworc3RydWN0IEFWQXVkaW9GaWZvIHsKKyAgICBBVkZpZm9CdWZmZXIgKipidWY7ICAgICAgICAgICAgIC8qKjwgc2luZ2xlIGJ1ZmZlciBmb3IgaW50ZXJsZWF2ZWQsIHBlci1jaGFubmVsIGJ1ZmZlcnMgZm9yIHBsYW5hciAqLworICAgIGludCBuYl9idWZmZXJzOyAgICAgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgYnVmZmVycyAqLworICAgIGludCBuYl9zYW1wbGVzOyAgICAgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2Ygc2FtcGxlcyBjdXJyZW50bHkgaW4gdGhlIEZJRk8gKi8KKyAgICBpbnQgYWxsb2NhdGVkX3NhbXBsZXM7ICAgICAgICAgIC8qKjwgY3VycmVudCBhbGxvY2F0ZWQgc2l6ZSwgaW4gc2FtcGxlcyAqLworCisgICAgaW50IGNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAvKio8IG51bWJlciBvZiBjaGFubmVscyAqLworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdDsgLyoqPCBzYW1wbGUgZm9ybWF0ICovCisgICAgaW50IHNhbXBsZV9zaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUsIGluIGJ5dGVzLCBvZiBvbmUgc2FtcGxlIGluIGEgYnVmZmVyICovCit9OworCit2b2lkIGF2X2F1ZGlvX2ZpZm9fZnJlZShBVkF1ZGlvRmlmbyAqYWYpCit7CisgICAgaWYgKGFmKSB7CisgICAgICAgIGlmIChhZi0+YnVmKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhZi0+bmJfYnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGFmLT5idWZbaV0pCisgICAgICAgICAgICAgICAgICAgIGF2X2ZpZm9fZnJlZShhZi0+YnVmW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyZWUoYWYtPmJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZShhZik7CisgICAgfQorfQorCitBVkF1ZGlvRmlmbyAqYXZfYXVkaW9fZmlmb19hbGxvYyhlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQsIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzKQoreworICAgIEFWQXVkaW9GaWZvICphZjsKKyAgICBpbnQgYnVmX3NpemUsIGk7CisKKyAgICAvKiBnZXQgY2hhbm5lbCBidWZmZXIgc2l6ZSAoYWxzbyB2YWxpZGF0ZXMgcGFyYW1ldGVycykgKi8KKyAgICBpZiAoYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoJmJ1Zl9zaXplLCBjaGFubmVscywgbmJfc2FtcGxlcywgc2FtcGxlX2ZtdCwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGFmID0gYXZfbWFsbG9jeihzaXplb2YoKmFmKSk7CisgICAgaWYgKCFhZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBhZi0+Y2hhbm5lbHMgICAgPSBjaGFubmVsczsKKyAgICBhZi0+c2FtcGxlX2ZtdCAgPSBzYW1wbGVfZm10OworICAgIGFmLT5zYW1wbGVfc2l6ZSA9IGJ1Zl9zaXplIC8gbmJfc2FtcGxlczsKKyAgICBhZi0+bmJfYnVmZmVycyAgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihzYW1wbGVfZm10KSA/IGNoYW5uZWxzIDogMTsKKworICAgIGFmLT5idWYgPSBhdl9tYWxsb2N6X2FycmF5KGFmLT5uYl9idWZmZXJzLCBzaXplb2YoKmFmLT5idWYpKTsKKyAgICBpZiAoIWFmLT5idWYpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYWYtPm5iX2J1ZmZlcnM7IGkrKykgeworICAgICAgICBhZi0+YnVmW2ldID0gYXZfZmlmb19hbGxvYyhidWZfc2l6ZSk7CisgICAgICAgIGlmICghYWYtPmJ1ZltpXSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGFmLT5hbGxvY2F0ZWRfc2FtcGxlcyA9IG5iX3NhbXBsZXM7CisKKyAgICByZXR1cm4gYWY7CisKK2Vycm9yOgorICAgIGF2X2F1ZGlvX2ZpZm9fZnJlZShhZik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBhdl9hdWRpb19maWZvX3JlYWxsb2MoQVZBdWRpb0ZpZm8gKmFmLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgcmV0LCBidWZfc2l6ZTsKKworICAgIGlmICgocmV0ID0gYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoJmJ1Zl9zaXplLCBhZi0+Y2hhbm5lbHMsIG5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZi0+c2FtcGxlX2ZtdCwgMSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhZi0+bmJfYnVmZmVyczsgaSsrKSB7CisgICAgICAgIGlmICgocmV0ID0gYXZfZmlmb19yZWFsbG9jMihhZi0+YnVmW2ldLCBidWZfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGFmLT5hbGxvY2F0ZWRfc2FtcGxlcyA9IG5iX3NhbXBsZXM7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9hdWRpb19maWZvX3dyaXRlKEFWQXVkaW9GaWZvICphZiwgdm9pZCAqKmRhdGEsIGludCBuYl9zYW1wbGVzKQoreworICAgIGludCBpLCByZXQsIHNpemU7CisKKyAgICAvKiBhdXRvbWF0aWNhbGx5IHJlYWxsb2NhdGUgYnVmZmVycyBpZiBuZWVkZWQgKi8KKyAgICBpZiAoYXZfYXVkaW9fZmlmb19zcGFjZShhZikgPCBuYl9zYW1wbGVzKSB7CisgICAgICAgIGludCBjdXJyZW50X3NpemUgPSBhdl9hdWRpb19maWZvX3NpemUoYWYpOworICAgICAgICAvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyBpbiBuZXcgc2l6ZSBjYWxjdWxhdGlvbiAqLworICAgICAgICBpZiAoSU5UX01BWCAvIDIgLSBjdXJyZW50X3NpemUgPCBuYl9zYW1wbGVzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgLyogcmVhbGxvY2F0ZSBidWZmZXJzICovCisgICAgICAgIGlmICgocmV0ID0gYXZfYXVkaW9fZmlmb19yZWFsbG9jKGFmLCAyICogKGN1cnJlbnRfc2l6ZSArIG5iX3NhbXBsZXMpKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzaXplID0gbmJfc2FtcGxlcyAqIGFmLT5zYW1wbGVfc2l6ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYWYtPm5iX2J1ZmZlcnM7IGkrKykgeworICAgICAgICByZXQgPSBhdl9maWZvX2dlbmVyaWNfd3JpdGUoYWYtPmJ1ZltpXSwgZGF0YVtpXSwgc2l6ZSwgTlVMTCk7CisgICAgICAgIGlmIChyZXQgIT0gc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICB9CisgICAgYWYtPm5iX3NhbXBsZXMgKz0gbmJfc2FtcGxlczsKKworICAgIHJldHVybiBuYl9zYW1wbGVzOworfQorCitpbnQgYXZfYXVkaW9fZmlmb19yZWFkKEFWQXVkaW9GaWZvICphZiwgdm9pZCAqKmRhdGEsIGludCBuYl9zYW1wbGVzKQoreworICAgIGludCBpLCByZXQsIHNpemU7CisKKyAgICBpZiAobmJfc2FtcGxlcyA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgbmJfc2FtcGxlcyA9IEZGTUlOKG5iX3NhbXBsZXMsIGFmLT5uYl9zYW1wbGVzKTsKKyAgICBpZiAoIW5iX3NhbXBsZXMpCisgICAgICAgIHJldHVybiAwOworCisgICAgc2l6ZSA9IG5iX3NhbXBsZXMgKiBhZi0+c2FtcGxlX3NpemU7CisgICAgZm9yIChpID0gMDsgaSA8IGFmLT5uYl9idWZmZXJzOyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9maWZvX2dlbmVyaWNfcmVhZChhZi0+YnVmW2ldLCBkYXRhW2ldLCBzaXplLCBOVUxMKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgIH0KKyAgICBhZi0+bmJfc2FtcGxlcyAtPSBuYl9zYW1wbGVzOworCisgICAgcmV0dXJuIG5iX3NhbXBsZXM7Cit9CisKK2ludCBhdl9hdWRpb19maWZvX2RyYWluKEFWQXVkaW9GaWZvICphZiwgaW50IG5iX3NhbXBsZXMpCit7CisgICAgaW50IGksIHNpemU7CisKKyAgICBpZiAobmJfc2FtcGxlcyA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgbmJfc2FtcGxlcyA9IEZGTUlOKG5iX3NhbXBsZXMsIGFmLT5uYl9zYW1wbGVzKTsKKworICAgIGlmIChuYl9zYW1wbGVzKSB7CisgICAgICAgIHNpemUgPSBuYl9zYW1wbGVzICogYWYtPnNhbXBsZV9zaXplOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWYtPm5iX2J1ZmZlcnM7IGkrKykKKyAgICAgICAgICAgIGF2X2ZpZm9fZHJhaW4oYWYtPmJ1ZltpXSwgc2l6ZSk7CisgICAgICAgIGFmLT5uYl9zYW1wbGVzIC09IG5iX3NhbXBsZXM7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIGF2X2F1ZGlvX2ZpZm9fcmVzZXQoQVZBdWRpb0ZpZm8gKmFmKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGFmLT5uYl9idWZmZXJzOyBpKyspCisgICAgICAgIGF2X2ZpZm9fcmVzZXQoYWYtPmJ1ZltpXSk7CisKKyAgICBhZi0+bmJfc2FtcGxlcyA9IDA7Cit9CisKK2ludCBhdl9hdWRpb19maWZvX3NpemUoQVZBdWRpb0ZpZm8gKmFmKQoreworICAgIHJldHVybiBhZi0+bmJfc2FtcGxlczsKK30KKworaW50IGF2X2F1ZGlvX2ZpZm9fc3BhY2UoQVZBdWRpb0ZpZm8gKmFmKQoreworICAgIHJldHVybiBhZi0+YWxsb2NhdGVkX3NhbXBsZXMgLSBhZi0+bmJfc2FtcGxlczsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXVkaW9fZmlmby5oIGIvZmZtcGVnL2xpYmF2dXRpbC9hdWRpb19maWZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxZTZhMQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXVkaW9fZmlmby5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQXVkaW8gRklGTworICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEF1ZGlvIEZJRk8gQnVmZmVyCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQVVESU9fRklGT19ICisjZGVmaW5lIEFWVVRJTF9BVURJT19GSUZPX0gKKworI2luY2x1ZGUgImF2dXRpbC5oIgorI2luY2x1ZGUgImZpZm8uaCIKKyNpbmNsdWRlICJzYW1wbGVmbXQuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBsYXZ1X2F1ZGlvCisgKiBAeworICoKKyAqIEBkZWZncm91cCBsYXZ1X2F1ZGlvZmlmbyBBdWRpbyBGSUZPIEJ1ZmZlcgorICogQHsKKyAqLworCisvKioKKyAqIENvbnRleHQgZm9yIGFuIEF1ZGlvIEZJRk8gQnVmZmVyLgorICoKKyAqIC0gT3BlcmF0ZXMgYXQgdGhlIHNhbXBsZSBsZXZlbCByYXRoZXIgdGhhbiB0aGUgYnl0ZSBsZXZlbC4KKyAqIC0gU3VwcG9ydHMgbXVsdGlwbGUgY2hhbm5lbHMgd2l0aCBlaXRoZXIgcGxhbmFyIG9yIHBhY2tlZCBzYW1wbGUgZm9ybWF0LgorICogLSBBdXRvbWF0aWMgcmVhbGxvY2F0aW9uIHdoZW4gd3JpdGluZyB0byBhIGZ1bGwgYnVmZmVyLgorICovCit0eXBlZGVmIHN0cnVjdCBBVkF1ZGlvRmlmbyBBVkF1ZGlvRmlmbzsKKworLyoqCisgKiBGcmVlIGFuIEFWQXVkaW9GaWZvLgorICoKKyAqIEBwYXJhbSBhZiAgQVZBdWRpb0ZpZm8gdG8gZnJlZQorICovCit2b2lkIGF2X2F1ZGlvX2ZpZm9fZnJlZShBVkF1ZGlvRmlmbyAqYWYpOworCisvKioKKyAqIEFsbG9jYXRlIGFuIEFWQXVkaW9GaWZvLgorICoKKyAqIEBwYXJhbSBzYW1wbGVfZm10ICBzYW1wbGUgZm9ybWF0CisgKiBAcGFyYW0gY2hhbm5lbHMgICAgbnVtYmVyIG9mIGNoYW5uZWxzCisgKiBAcGFyYW0gbmJfc2FtcGxlcyAgaW5pdGlhbCBhbGxvY2F0aW9uIHNpemUsIGluIHNhbXBsZXMKKyAqIEByZXR1cm4gICAgICAgICAgICBuZXdseSBhbGxvY2F0ZWQgQVZBdWRpb0ZpZm8sIG9yIE5VTEwgb24gZXJyb3IKKyAqLworQVZBdWRpb0ZpZm8gKmF2X2F1ZGlvX2ZpZm9fYWxsb2MoZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcyk7CisKKy8qKgorICogUmVhbGxvY2F0ZSBhbiBBVkF1ZGlvRmlmby4KKyAqCisgKiBAcGFyYW0gYWYgICAgICAgICAgQVZBdWRpb0ZpZm8gdG8gcmVhbGxvY2F0ZQorICogQHBhcmFtIG5iX3NhbXBsZXMgIG5ldyBhbGxvY2F0aW9uIHNpemUsIGluIHNhbXBsZXMKKyAqIEByZXR1cm4gICAgICAgICAgICAwIGlmIE9LLCBvciBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgYXZfYXVkaW9fZmlmb19yZWFsbG9jKEFWQXVkaW9GaWZvICphZiwgaW50IG5iX3NhbXBsZXMpOworCisvKioKKyAqIFdyaXRlIGRhdGEgdG8gYW4gQVZBdWRpb0ZpZm8uCisgKgorICogVGhlIEFWQXVkaW9GaWZvIHdpbGwgYmUgcmVhbGxvY2F0ZWQgYXV0b21hdGljYWxseSBpZiB0aGUgYXZhaWxhYmxlIHNwYWNlCisgKiBpcyBsZXNzIHRoYW4gbmJfc2FtcGxlcy4KKyAqCisgKiBAc2VlIGVudW0gQVZTYW1wbGVGb3JtYXQKKyAqIFRoZSBkb2N1bWVudGF0aW9uIGZvciBBVlNhbXBsZUZvcm1hdCBkZXNjcmliZXMgdGhlIGRhdGEgbGF5b3V0LgorICoKKyAqIEBwYXJhbSBhZiAgICAgICAgICBBVkF1ZGlvRmlmbyB0byB3cml0ZSB0bworICogQHBhcmFtIGRhdGEgICAgICAgIGF1ZGlvIGRhdGEgcGxhbmUgcG9pbnRlcnMKKyAqIEBwYXJhbSBuYl9zYW1wbGVzICBudW1iZXIgb2Ygc2FtcGxlcyB0byB3cml0ZQorICogQHJldHVybiAgICAgICAgICAgIG51bWJlciBvZiBzYW1wbGVzIGFjdHVhbGx5IHdyaXR0ZW4sIG9yIG5lZ2F0aXZlIEFWRVJST1IKKyAqICAgICAgICAgICAgICAgICAgICBjb2RlIG9uIGZhaWx1cmUuIElmIHN1Y2Nlc3NmdWwsIHRoZSBudW1iZXIgb2Ygc2FtcGxlcworICogICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5IHdyaXR0ZW4gd2lsbCBhbHdheXMgYmUgbmJfc2FtcGxlcy4KKyAqLworaW50IGF2X2F1ZGlvX2ZpZm9fd3JpdGUoQVZBdWRpb0ZpZm8gKmFmLCB2b2lkICoqZGF0YSwgaW50IG5iX3NhbXBsZXMpOworCisvKioKKyAqIFJlYWQgZGF0YSBmcm9tIGFuIEFWQXVkaW9GaWZvLgorICoKKyAqIEBzZWUgZW51bSBBVlNhbXBsZUZvcm1hdAorICogVGhlIGRvY3VtZW50YXRpb24gZm9yIEFWU2FtcGxlRm9ybWF0IGRlc2NyaWJlcyB0aGUgZGF0YSBsYXlvdXQuCisgKgorICogQHBhcmFtIGFmICAgICAgICAgIEFWQXVkaW9GaWZvIHRvIHJlYWQgZnJvbQorICogQHBhcmFtIGRhdGEgICAgICAgIGF1ZGlvIGRhdGEgcGxhbmUgcG9pbnRlcnMKKyAqIEBwYXJhbSBuYl9zYW1wbGVzICBudW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkCisgKiBAcmV0dXJuICAgICAgICAgICAgbnVtYmVyIG9mIHNhbXBsZXMgYWN0dWFsbHkgcmVhZCwgb3IgbmVnYXRpdmUgQVZFUlJPUiBjb2RlCisgKiAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhlIG51bWJlciBvZiBzYW1wbGVzIGFjdHVhbGx5IHJlYWQgd2lsbCBub3QKKyAqICAgICAgICAgICAgICAgICAgICBiZSBncmVhdGVyIHRoYW4gbmJfc2FtcGxlcywgYW5kIHdpbGwgb25seSBiZSBsZXNzIHRoYW4KKyAqICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzIGlmIGF2X2F1ZGlvX2ZpZm9fc2l6ZSBpcyBsZXNzIHRoYW4gbmJfc2FtcGxlcy4KKyAqLworaW50IGF2X2F1ZGlvX2ZpZm9fcmVhZChBVkF1ZGlvRmlmbyAqYWYsIHZvaWQgKipkYXRhLCBpbnQgbmJfc2FtcGxlcyk7CisKKy8qKgorICogRHJhaW4gZGF0YSBmcm9tIGFuIEFWQXVkaW9GaWZvLgorICoKKyAqIFJlbW92ZXMgdGhlIGRhdGEgd2l0aG91dCByZWFkaW5nIGl0LgorICoKKyAqIEBwYXJhbSBhZiAgICAgICAgICBBVkF1ZGlvRmlmbyB0byBkcmFpbgorICogQHBhcmFtIG5iX3NhbXBsZXMgIG51bWJlciBvZiBzYW1wbGVzIHRvIGRyYWluCisgKiBAcmV0dXJuICAgICAgICAgICAgMCBpZiBPSywgb3IgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGF2X2F1ZGlvX2ZpZm9fZHJhaW4oQVZBdWRpb0ZpZm8gKmFmLCBpbnQgbmJfc2FtcGxlcyk7CisKKy8qKgorICogUmVzZXQgdGhlIEFWQXVkaW9GaWZvIGJ1ZmZlci4KKyAqCisgKiBUaGlzIGVtcHRpZXMgYWxsIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gYWYgIEFWQXVkaW9GaWZvIHRvIHJlc2V0CisgKi8KK3ZvaWQgYXZfYXVkaW9fZmlmb19yZXNldChBVkF1ZGlvRmlmbyAqYWYpOworCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgQVZBdWRpb0ZpZm8gYXZhaWxhYmxlIGZvciByZWFkaW5nLgorICoKKyAqIEBwYXJhbSBhZiAgdGhlIEFWQXVkaW9GaWZvIHRvIHF1ZXJ5CisgKiBAcmV0dXJuICAgIG51bWJlciBvZiBzYW1wbGVzIGF2YWlsYWJsZSBmb3IgcmVhZGluZworICovCitpbnQgYXZfYXVkaW9fZmlmb19zaXplKEFWQXVkaW9GaWZvICphZik7CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBBVkF1ZGlvRmlmbyBhdmFpbGFibGUgZm9yIHdyaXRpbmcuCisgKgorICogQHBhcmFtIGFmICB0aGUgQVZBdWRpb0ZpZm8gdG8gcXVlcnkKKyAqIEByZXR1cm4gICAgbnVtYmVyIG9mIHNhbXBsZXMgYXZhaWxhYmxlIGZvciB3cml0aW5nCisgKi8KK2ludCBhdl9hdWRpb19maWZvX3NwYWNlKEFWQXVkaW9GaWZvICphZik7CisKKy8qKgorICogQH0KKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9BVURJT19GSUZPX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXVkaW9jb252ZXJ0LmggYi9mZm1wZWcvbGliYXZ1dGlsL2F1ZGlvY29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMGE2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2F1ZGlvY29udmVydC5oCkBAIC0wLDAgKzEsNiBAQAorCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjaWYgRkZfQVBJX0FVRElPQ09OVkVSVAorI2luY2x1ZGUgImNoYW5uZWxfbGF5b3V0LmgiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXZhc3NlcnQuaCBiL2ZmbXBlZy9saWJhdnV0aWwvYXZhc3NlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWY1ZTBlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hdmFzc2VydC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMTAgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogc2ltcGxlIGFzc2VydCgpIG1hY3JvcyB0aGF0IGFyZSBhIGJpdCBtb3JlIGZsZXhpYmxlIHRoYW4gSVNPIEMgYXNzZXJ0KCkuCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2lmbmRlZiBBVlVUSUxfQVZBU1NFUlRfSAorI2RlZmluZSBBVlVUSUxfQVZBU1NFUlRfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiYXZ1dGlsLmgiCisjaW5jbHVkZSAibG9nLmgiCisKKy8qKgorICogYXNzZXJ0KCkgZXF1aXZhbGVudCwgdGhhdCBpcyBhbHdheXMgZW5hYmxlZC4KKyAqLworI2RlZmluZSBhdl9hc3NlcnQwKGNvbmQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1BBTklDLCAiQXNzZXJ0aW9uICVzIGZhaWxlZCBhdCAlczolZFxuIiwgICAgXAorICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKGNvbmQpLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBhYm9ydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworCisvKioKKyAqIGFzc2VydCgpIGVxdWl2YWxlbnQsIHRoYXQgZG9lcyBub3QgbGllIGluIHNwZWVkIGNyaXRpY2FsIGNvZGUuCisgKiBUaGVzZSBhc3NlcnRzKCkgdGh1cyBjYW4gYmUgZW5hYmxlZCB3aXRob3V0IGZlYXJpbmcgc3BlZWRsb3NzLgorICovCisjaWYgZGVmaW5lZChBU1NFUlRfTEVWRUwpICYmIEFTU0VSVF9MRVZFTCA+IDAKKyNkZWZpbmUgYXZfYXNzZXJ0MShjb25kKSBhdl9hc3NlcnQwKGNvbmQpCisjZWxzZQorI2RlZmluZSBhdl9hc3NlcnQxKGNvbmQpICgodm9pZCkwKQorI2VuZGlmCisKKworLyoqCisgKiBhc3NlcnQoKSBlcXVpdmFsZW50LCB0aGF0IGRvZXMgbGllIGluIHNwZWVkIGNyaXRpY2FsIGNvZGUuCisgKi8KKyNpZiBkZWZpbmVkKEFTU0VSVF9MRVZFTCkgJiYgQVNTRVJUX0xFVkVMID4gMQorI2RlZmluZSBhdl9hc3NlcnQyKGNvbmQpIGF2X2Fzc2VydDAoY29uZCkKKyNlbHNlCisjZGVmaW5lIGF2X2Fzc2VydDIoY29uZCkgKCh2b2lkKTApCisjZW5kaWYKKworI2VuZGlmIC8qIEFWVVRJTF9BVkFTU0VSVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2F2Y29uZmlnLmggYi9mZm1wZWcvbGliYXZ1dGlsL2F2Y29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2ODViNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXZjb25maWcuaApAQCAtMCwwICsxLDggQEAKKy8qIEdlbmVyYXRlZCBieSBmZmNvbmYgKi8KKyNpZm5kZWYgQVZVVElMX0FWQ09ORklHX0gKKyNkZWZpbmUgQVZVVElMX0FWQ09ORklHX0gKKyNkZWZpbmUgQVZfSEFWRV9CSUdFTkRJQU4gMAorI2RlZmluZSBBVl9IQVZFX0ZBU1RfVU5BTElHTkVEIDEKKyNkZWZpbmUgQVZfSEFWRV9JTkNPTVBBVElCTEVfTElCQVZfQUJJIDAKKyNkZWZpbmUgQVZfSEFWRV9JTkNPTVBBVElCTEVfRk9SS19BQkkgMAorI2VuZGlmIC8qIEFWVVRJTF9BVkNPTkZJR19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2F2cjMyL2Jzd2FwLmggYi9mZm1wZWcvbGliYXZ1dGlsL2F2cjMyL2Jzd2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5ZDUzZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXZyMzIvYnN3YXAuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0FWUjMyX0JTV0FQX0gKKyNkZWZpbmUgQVZVVElMX0FWUjMyX0JTV0FQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisKKyNpZiBIQVZFX0lOTElORV9BU00KKworI2RlZmluZSBhdl9ic3dhcDE2IGF2X2Jzd2FwMTYKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IHVpbnQxNl90IGF2X2Jzd2FwMTYodWludDE2X3QgeCkKK3sKKyAgICBfX2FzbV9fICgic3dhcC5iaCAlMCIgOiAiK3IiKHgpKTsKKyAgICByZXR1cm4geDsKK30KKworI2RlZmluZSBhdl9ic3dhcDMyIGF2X2Jzd2FwMzIKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IHVpbnQzMl90IGF2X2Jzd2FwMzIodWludDMyX3QgeCkKK3sKKyAgICBfX2FzbV9fICgic3dhcC5iICAlMCIgOiAiK3IiKHgpKTsKKyAgICByZXR1cm4geDsKK30KKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCisjZW5kaWYgLyogQVZVVElMX0FWUjMyX0JTV0FQX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYXZyMzIvaW50cmVhZHdyaXRlLmggYi9mZm1wZWcvbGliYXZ1dGlsL2F2cjMyL2ludHJlYWR3cml0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZmQzYWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2F2cjMyL2ludHJlYWR3cml0ZS5oCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9BVlIzMl9JTlRSRUFEV1JJVEVfSAorI2RlZmluZSBBVlVUSUxfQVZSMzJfSU5UUkVBRFdSSVRFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorCisvKgorICogQVZSMzIgZG9lcyBub3Qgc3VwcG9ydCB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLCBleGNlcHQgZm9yIHRoZSBBUAorICogc2VyaWVzIHdoaWNoIHN1cHBwb3J0cyB1bmFsaWduZWQgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMuICAxNi1iaXQKKyAqIGFuZCA2NC1iaXQgYWNjZXNzZXMgbXVzdCBiZSBhbGlnbmVkIHRvIDE2IGFuZCAzMiBiaXRzLCByZXNwZWN0aXZlbHkuCisgKiBUaGlzIG1lYW5zIHdlIGNhbm5vdCB1c2UgdGhlIGJ5dGUtc3dhcHBpbmcgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMKKyAqIGhlcmUuCisgKgorICogRm9yIDE2LWJpdCwgMjQtYml0LCBhbmQgKG9uIFVDIHNlcmllcykgMzItYml0IGxvYWRzLCB3ZSBpbnN0ZWFkIHVzZQorICogdGhlIExESU5TLkIgaW5zdHJ1Y3Rpb24sIHdoaWNoIGdjYyBmYWlscyB0byB1dGlsaXNlIHdpdGggdGhlCisgKiBnZW5lcmljIGNvZGUuICBHQ0MgYWxzbyBmYWlscyB0byB1c2UgcGxhaW4gTEQuVyBhbmQgU1QuVyBldmVuIGZvcgorICogQVAgcHJvY2Vzc29ycywgc28gd2Ugb3ZlcnJpZGUgdGhlIGdlbmVyaWMgY29kZS4gIFRoZSA2NC1iaXQKKyAqIHZlcnNpb25zIGFyZSBpbXByb3ZlZCBieSB1c2luZyBvdXIgb3B0aW1pc2VkIDMyLWJpdCBmdW5jdGlvbnMuCisgKi8KKworI2RlZmluZSBBVl9STDE2IEFWX1JMMTYKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQxNl90IEFWX1JMMTYoY29uc3Qgdm9pZCAqcCkKK3sKKyAgICB1aW50MTZfdCB2OworICAgIF9fYXNtX18gKCJsZC51YiAgICAlMCwgICAlMSAgXG5cdCIKKyAgICAgICAgICAgICAibGRpbnMuYiAgJTA6bCwgJTIgIFxuXHQiCisgICAgICAgICAgICAgOiAiPSZyIih2KQorICAgICAgICAgICAgIDogIm0iKCooY29uc3QgdWludDhfdCopcCksICJSS3MxMiIoKigoY29uc3QgdWludDhfdCopcCsxKSkpOworICAgIHJldHVybiB2OworfQorCisjZGVmaW5lIEFWX1JCMTYgQVZfUkIxNgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDE2X3QgQVZfUkIxNihjb25zdCB2b2lkICpwKQoreworICAgIHVpbnQxNl90IHY7CisgICAgX19hc21fXyAoImxkLnViICAgICUwLCAgICUyICBcblx0IgorICAgICAgICAgICAgICJsZGlucy5iICAlMDpsLCAlMSAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9JnIiKHYpCisgICAgICAgICAgICAgOiAiUktzMTIiKCooY29uc3QgdWludDhfdCopcCksICJtIigqKChjb25zdCB1aW50OF90KilwKzEpKSk7CisgICAgcmV0dXJuIHY7Cit9CisKKyNkZWZpbmUgQVZfUkIyNCBBVl9SQjI0CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50MzJfdCBBVl9SQjI0KGNvbnN0IHZvaWQgKnApCit7CisgICAgdWludDMyX3QgdjsKKyAgICBfX2FzbV9fICgibGQudWIgICAgJTAsICAgJTMgIFxuXHQiCisgICAgICAgICAgICAgImxkaW5zLmIgICUwOmwsICUyICBcblx0IgorICAgICAgICAgICAgICJsZGlucy5iICAlMDp1LCAlMSAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9JnIiKHYpCisgICAgICAgICAgICAgOiAiUktzMTIiKCogKGNvbnN0IHVpbnQ4X3QqKXApLAorICAgICAgICAgICAgICAgIlJLczEyIigqKChjb25zdCB1aW50OF90KilwKzEpKSwKKyAgICAgICAgICAgICAgICJtIiAgICAoKigoY29uc3QgdWludDhfdCopcCsyKSkpOworICAgIHJldHVybiB2OworfQorCisjZGVmaW5lIEFWX1JMMjQgQVZfUkwyNAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3QgQVZfUkwyNChjb25zdCB2b2lkICpwKQoreworICAgIHVpbnQzMl90IHY7CisgICAgX19hc21fXyAoImxkLnViICAgICUwLCAgICUxICBcblx0IgorICAgICAgICAgICAgICJsZGlucy5iICAlMDpsLCAlMiAgXG5cdCIKKyAgICAgICAgICAgICAibGRpbnMuYiAgJTA6dSwgJTMgIFxuXHQiCisgICAgICAgICAgICAgOiAiPSZyIih2KQorICAgICAgICAgICAgIDogIm0iICAgICgqIChjb25zdCB1aW50OF90KilwKSwKKyAgICAgICAgICAgICAgICJSS3MxMiIoKigoY29uc3QgdWludDhfdCopcCsxKSksCisgICAgICAgICAgICAgICAiUktzMTIiKCooKGNvbnN0IHVpbnQ4X3QqKXArMikpKTsKKyAgICByZXR1cm4gdjsKK30KKworI2lmIEFSQ0hfQVZSMzJfQVAKKworI2RlZmluZSBBVl9SQjMyIEFWX1JCMzIKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQzMl90IEFWX1JCMzIoY29uc3Qgdm9pZCAqcCkKK3sKKyAgICB1aW50MzJfdCB2OworICAgIF9fYXNtX18gKCJsZC53ICUwLCAlMSIgOiAiPXIiKHYpIDogIm0iKCooY29uc3QgdWludDMyX3QqKXApKTsKKyAgICByZXR1cm4gdjsKK30KKworI2RlZmluZSBBVl9XQjMyIEFWX1dCMzIKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgQVZfV0IzMih2b2lkICpwLCB1aW50MzJfdCB2KQoreworICAgIF9fYXNtX18gKCJzdC53ICUwLCAlMSIgOiAiPW0iKCoodWludDMyX3QqKXApIDogInIiKHYpKTsKK30KKworLyogVGhlc2UgdHdvIHdvdWxkIGJlIGRlZmluZWQgYnkgZ2VuZXJpYyBjb2RlLCBidXQgd2UgbmVlZCB0aGVtIHNvb25lci4gKi8KKyNkZWZpbmUgQVZfUkwzMihwKSAgICBhdl9ic3dhcDMyKEFWX1JCMzIocCkpCisjZGVmaW5lIEFWX1dMMzIocCwgdikgQVZfV0IzMihwLCBhdl9ic3dhcDMyKHYpKQorCisjZGVmaW5lIEFWX1dCNjQgQVZfV0I2NAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBBVl9XQjY0KHZvaWQgKnAsIHVpbnQ2NF90IHYpCit7CisgICAgdW5pb24geyB1aW50NjRfdCB2OyB1aW50MzJfdCBobFsyXTsgfSB2diA9IHsgdiB9OworICAgIEFWX1dCMzIocCwgdnYuaGxbMF0pOworICAgIEFWX1dCMzIoKHVpbnQzMl90KilwKzEsIHZ2LmhsWzFdKTsKK30KKworI2RlZmluZSBBVl9XTDY0IEFWX1dMNjQKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgQVZfV0w2NCh2b2lkICpwLCB1aW50NjRfdCB2KQoreworICAgIHVuaW9uIHsgdWludDY0X3QgdjsgdWludDMyX3QgaGxbMl07IH0gdnYgPSB7IHYgfTsKKyAgICBBVl9XTDMyKHAsIHZ2LmhsWzFdKTsKKyAgICBBVl9XTDMyKCh1aW50MzJfdCopcCsxLCB2di5obFswXSk7Cit9CisKKyNlbHNlIC8qIEFSQ0hfQVZSMzJfQVAgKi8KKworI2RlZmluZSBBVl9SQjMyIEFWX1JCMzIKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQzMl90IEFWX1JCMzIoY29uc3Qgdm9pZCAqcCkKK3sKKyAgICB1aW50MzJfdCB2OworICAgIF9fYXNtX18gKCJsZC51YiAgICAlMCwgICAlNCAgXG5cdCIKKyAgICAgICAgICAgICAibGRpbnMuYiAgJTA6bCwgJTMgIFxuXHQiCisgICAgICAgICAgICAgImxkaW5zLmIgICUwOnUsICUyICBcblx0IgorICAgICAgICAgICAgICJsZGlucy5iICAlMDp0LCAlMSAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9JnIiKHYpCisgICAgICAgICAgICAgOiAiUktzMTIiKCogKGNvbnN0IHVpbnQ4X3QqKXApLAorICAgICAgICAgICAgICAgIlJLczEyIigqKChjb25zdCB1aW50OF90KilwKzEpKSwKKyAgICAgICAgICAgICAgICJSS3MxMiIoKigoY29uc3QgdWludDhfdCopcCsyKSksCisgICAgICAgICAgICAgICAibSIgICAgKCooKGNvbnN0IHVpbnQ4X3QqKXArMykpKTsKKyAgICByZXR1cm4gdjsKK30KKworI2RlZmluZSBBVl9STDMyIEFWX1JMMzIKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQzMl90IEFWX1JMMzIoY29uc3Qgdm9pZCAqcCkKK3sKKyAgICB1aW50MzJfdCB2OworICAgIF9fYXNtX18gKCJsZC51YiAgICAlMCwgICAlMSAgXG5cdCIKKyAgICAgICAgICAgICAibGRpbnMuYiAgJTA6bCwgJTIgIFxuXHQiCisgICAgICAgICAgICAgImxkaW5zLmIgICUwOnUsICUzICBcblx0IgorICAgICAgICAgICAgICJsZGlucy5iICAlMDp0LCAlNCAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9JnIiKHYpCisgICAgICAgICAgICAgOiAibSIgICAgKCogKGNvbnN0IHVpbnQ4X3QqKXApLAorICAgICAgICAgICAgICAgIlJLczEyIigqKChjb25zdCB1aW50OF90KilwKzEpKSwKKyAgICAgICAgICAgICAgICJSS3MxMiIoKigoY29uc3QgdWludDhfdCopcCsyKSksCisgICAgICAgICAgICAgICAiUktzMTIiKCooKGNvbnN0IHVpbnQ4X3QqKXArMykpKTsKKyAgICByZXR1cm4gdjsKK30KKworI2VuZGlmIC8qIEFSQ0hfQVZSMzJfQVAgKi8KKworI2RlZmluZSBBVl9SQjY0IEFWX1JCNjQKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQ2NF90IEFWX1JCNjQoY29uc3Qgdm9pZCAqcCkKK3sKKyAgICB1bmlvbiB7IHVpbnQ2NF90IHY7IHVpbnQzMl90IGhsWzJdOyB9IHY7CisgICAgdi5obFswXSA9IEFWX1JCMzIocCk7CisgICAgdi5obFsxXSA9IEFWX1JCMzIoKGNvbnN0IHVpbnQzMl90KilwKzEpOworICAgIHJldHVybiB2LnY7Cit9CisKKyNkZWZpbmUgQVZfUkw2NCBBVl9STDY0CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50NjRfdCBBVl9STDY0KGNvbnN0IHZvaWQgKnApCit7CisgICAgdW5pb24geyB1aW50NjRfdCB2OyB1aW50MzJfdCBobFsyXTsgfSB2OworICAgIHYuaGxbMV0gPSBBVl9STDMyKHApOworICAgIHYuaGxbMF0gPSBBVl9STDMyKChjb25zdCB1aW50MzJfdCopcCsxKTsKKyAgICByZXR1cm4gdi52OworfQorCisjZW5kaWYgLyogQVZVVElMX0FWUjMyX0lOVFJFQURXUklURV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2F2c3RyaW5nLmMgYi9mZm1wZWcvbGliYXZ1dGlsL2F2c3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjNjViNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYXZzdHJpbmcuYwpAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwNyBNYW5zIFJ1bGxnYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAiYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdnN0cmluZy5oIgorI2luY2x1ZGUgImJwcmludC5oIgorCitpbnQgYXZfc3Ryc3RhcnQoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwZngsIGNvbnN0IGNoYXIgKipwdHIpCit7CisgICAgd2hpbGUgKCpwZnggJiYgKnBmeCA9PSAqc3RyKSB7CisgICAgICAgIHBmeCsrOworICAgICAgICBzdHIrKzsKKyAgICB9CisgICAgaWYgKCEqcGZ4ICYmIHB0cikKKyAgICAgICAgKnB0ciA9IHN0cjsKKyAgICByZXR1cm4gISpwZng7Cit9CisKK2ludCBhdl9zdHJpc3RhcnQoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwZngsIGNvbnN0IGNoYXIgKipwdHIpCit7CisgICAgd2hpbGUgKCpwZnggJiYgYXZfdG91cHBlcigodW5zaWduZWQpKnBmeCkgPT0gYXZfdG91cHBlcigodW5zaWduZWQpKnN0cikpIHsKKyAgICAgICAgcGZ4Kys7CisgICAgICAgIHN0cisrOworICAgIH0KKyAgICBpZiAoISpwZnggJiYgcHRyKQorICAgICAgICAqcHRyID0gc3RyOworICAgIHJldHVybiAhKnBmeDsKK30KKworY2hhciAqYXZfc3RyaXN0cihjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisgICAgaWYgKCEqczIpCisgICAgICAgIHJldHVybiAoY2hhciopKGludHB0cl90KXMxOworCisgICAgZG8KKyAgICAgICAgaWYgKGF2X3N0cmlzdGFydChzMSwgczIsIE5VTEwpKQorICAgICAgICAgICAgcmV0dXJuIChjaGFyKikoaW50cHRyX3QpczE7CisgICAgd2hpbGUgKCpzMSsrKTsKKworICAgIHJldHVybiBOVUxMOworfQorCitjaGFyICphdl9zdHJuc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUsIHNpemVfdCBoYXlfbGVuZ3RoKQoreworICAgIHNpemVfdCBuZWVkbGVfbGVuID0gc3RybGVuKG5lZWRsZSk7CisgICAgaWYgKCFuZWVkbGVfbGVuKQorICAgICAgICByZXR1cm4gKGNoYXIqKWhheXN0YWNrOworICAgIHdoaWxlIChoYXlfbGVuZ3RoID49IG5lZWRsZV9sZW4pIHsKKyAgICAgICAgaGF5X2xlbmd0aC0tOworICAgICAgICBpZiAoIW1lbWNtcChoYXlzdGFjaywgbmVlZGxlLCBuZWVkbGVfbGVuKSkKKyAgICAgICAgICAgIHJldHVybiAoY2hhciopaGF5c3RhY2s7CisgICAgICAgIGhheXN0YWNrKys7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzaXplX3QgYXZfc3RybGNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpCit7CisgICAgc2l6ZV90IGxlbiA9IDA7CisgICAgd2hpbGUgKCsrbGVuIDwgc2l6ZSAmJiAqc3JjKQorICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgaWYgKGxlbiA8PSBzaXplKQorICAgICAgICAqZHN0ID0gMDsKKyAgICByZXR1cm4gbGVuICsgc3RybGVuKHNyYykgLSAxOworfQorCitzaXplX3QgYXZfc3RybGNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpCit7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihkc3QpOworICAgIGlmIChzaXplIDw9IGxlbiArIDEpCisgICAgICAgIHJldHVybiBsZW4gKyBzdHJsZW4oc3JjKTsKKyAgICByZXR1cm4gbGVuICsgYXZfc3RybGNweShkc3QgKyBsZW4sIHNyYywgc2l6ZSAtIGxlbik7Cit9CisKK3NpemVfdCBhdl9zdHJsY2F0ZihjaGFyICpkc3QsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBpbnQgbGVuID0gc3RybGVuKGRzdCk7CisgICAgdmFfbGlzdCB2bDsKKworICAgIHZhX3N0YXJ0KHZsLCBmbXQpOworICAgIGxlbiArPSB2c25wcmludGYoZHN0ICsgbGVuLCBzaXplID4gbGVuID8gc2l6ZSAtIGxlbiA6IDAsIGZtdCwgdmwpOworICAgIHZhX2VuZCh2bCk7CisKKyAgICByZXR1cm4gbGVuOworfQorCitjaGFyICphdl9hc3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBjaGFyICpwID0gTlVMTDsKKyAgICB2YV9saXN0IHZhOworICAgIGludCBsZW47CisKKyAgICB2YV9zdGFydCh2YSwgZm10KTsKKyAgICBsZW4gPSB2c25wcmludGYoTlVMTCwgMCwgZm10LCB2YSk7CisgICAgdmFfZW5kKHZhKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBwID0gYXZfbWFsbG9jKGxlbiArIDEpOworICAgIGlmICghcCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICB2YV9zdGFydCh2YSwgZm10KTsKKyAgICBsZW4gPSB2c25wcmludGYocCwgbGVuICsgMSwgZm10LCB2YSk7CisgICAgdmFfZW5kKHZhKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgYXZfZnJlZXAoJnApOworCitlbmQ6CisgICAgcmV0dXJuIHA7Cit9CisKK2NoYXIgKmF2X2Qyc3RyKGRvdWJsZSBkKQoreworICAgIGNoYXIgKnN0ciA9IGF2X21hbGxvYygxNik7CisgICAgaWYgKHN0cikKKyAgICAgICAgc25wcmludGYoc3RyLCAxNiwgIiVmIiwgZCk7CisgICAgcmV0dXJuIHN0cjsKK30KKworI2RlZmluZSBXSElURVNQQUNFUyAiIFxuXHQiCisKK2NoYXIgKmF2X2dldF90b2tlbihjb25zdCBjaGFyICoqYnVmLCBjb25zdCBjaGFyICp0ZXJtKQoreworICAgIGNoYXIgKm91dCAgICAgPSBhdl9tYWxsb2Moc3RybGVuKCpidWYpICsgMSk7CisgICAgY2hhciAqcmV0ICAgICA9IG91dCwgKmVuZCA9IG91dDsKKyAgICBjb25zdCBjaGFyICpwID0gKmJ1ZjsKKyAgICBpZiAoIW91dCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCArPSBzdHJzcG4ocCwgV0hJVEVTUEFDRVMpOworCisgICAgd2hpbGUgKCpwICYmICFzdHJzcG4ocCwgdGVybSkpIHsKKyAgICAgICAgY2hhciBjID0gKnArKzsKKyAgICAgICAgaWYgKGMgPT0gJ1xcJyAmJiAqcCkgeworICAgICAgICAgICAgKm91dCsrID0gKnArKzsKKyAgICAgICAgICAgIGVuZCAgICA9IG91dDsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICdcJycpIHsKKyAgICAgICAgICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXCcnKQorICAgICAgICAgICAgICAgICpvdXQrKyA9ICpwKys7CisgICAgICAgICAgICBpZiAoKnApIHsKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgZW5kID0gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm91dCsrID0gYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRvCisgICAgICAgICpvdXQtLSA9IDA7CisgICAgd2hpbGUgKG91dCA+PSBlbmQgJiYgc3Ryc3BuKG91dCwgV0hJVEVTUEFDRVMpKTsKKworICAgICpidWYgPSBwOworCisgICAgcmV0dXJuIHJldDsKK30KKworY2hhciAqYXZfc3RydG9rKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmRlbGltLCBjaGFyICoqc2F2ZXB0cikKK3sKKyAgICBjaGFyICp0b2s7CisKKyAgICBpZiAoIXMgJiYgIShzID0gKnNhdmVwdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIHNraXAgbGVhZGluZyBkZWxpbWl0ZXJzICovCisgICAgcyArPSBzdHJzcG4ocywgZGVsaW0pOworCisgICAgLyogcyBub3cgcG9pbnRzIHRvIHRoZSBmaXJzdCBub24gZGVsaW1pdGVyIGNoYXIsIG9yIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLworICAgIGlmICghKnMpIHsKKyAgICAgICAgKnNhdmVwdHIgPSBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdG9rID0gcysrOworCisgICAgLyogc2tpcCBub24gZGVsaW1pdGVycyAqLworICAgIHMgKz0gc3RyY3NwbihzLCBkZWxpbSk7CisgICAgaWYgKCpzKSB7CisgICAgICAgICpzID0gMDsKKyAgICAgICAgKnNhdmVwdHIgPSBzKzE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnNhdmVwdHIgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiB0b2s7Cit9CisKK2ludCBhdl9zdHJjYXNlY21wKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCit7CisgICAgdWludDhfdCBjMSwgYzI7CisgICAgZG8geworICAgICAgICBjMSA9IGF2X3RvbG93ZXIoKmErKyk7CisgICAgICAgIGMyID0gYXZfdG9sb3dlcigqYisrKTsKKyAgICB9IHdoaWxlIChjMSAmJiBjMSA9PSBjMik7CisgICAgcmV0dXJuIGMxIC0gYzI7Cit9CisKK2ludCBhdl9zdHJuY2FzZWNtcChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiLCBzaXplX3QgbikKK3sKKyAgICBjb25zdCBjaGFyICplbmQgPSBhICsgbjsKKyAgICB1aW50OF90IGMxLCBjMjsKKyAgICBkbyB7CisgICAgICAgIGMxID0gYXZfdG9sb3dlcigqYSsrKTsKKyAgICAgICAgYzIgPSBhdl90b2xvd2VyKCpiKyspOworICAgIH0gd2hpbGUgKGEgPCBlbmQgJiYgYzEgJiYgYzEgPT0gYzIpOworICAgIHJldHVybiBjMSAtIGMyOworfQorCitjb25zdCBjaGFyICphdl9iYXNlbmFtZShjb25zdCBjaGFyICpwYXRoKQoreworICAgIGNoYXIgKnAgPSBzdHJyY2hyKHBhdGgsICcvJyk7CisKKyNpZiBIQVZFX0RPU19QQVRIUworICAgIGNoYXIgKnEgPSBzdHJyY2hyKHBhdGgsICdcXCcpOworICAgIGNoYXIgKmQgPSBzdHJjaHIocGF0aCwgJzonKTsKKworICAgIHAgPSBGRk1BWDMocCwgcSwgZCk7CisjZW5kaWYKKworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICByZXR1cm4gcCArIDE7Cit9CisKK2NvbnN0IGNoYXIgKmF2X2Rpcm5hbWUoY2hhciAqcGF0aCkKK3sKKyAgICBjaGFyICpwID0gc3RycmNocihwYXRoLCAnLycpOworCisjaWYgSEFWRV9ET1NfUEFUSFMKKyAgICBjaGFyICpxID0gc3RycmNocihwYXRoLCAnXFwnKTsKKyAgICBjaGFyICpkID0gc3RyY2hyKHBhdGgsICc6Jyk7CisKKyAgICBkID0gZCA/IGQgKyAxIDogZDsKKworICAgIHAgPSBGRk1BWDMocCwgcSwgZCk7CisjZW5kaWYKKworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuICIuIjsKKworICAgICpwID0gJ1wwJzsKKworICAgIHJldHVybiBwYXRoOworfQorCitpbnQgYXZfZXNjYXBlKGNoYXIgKipkc3QsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqc3BlY2lhbF9jaGFycywKKyAgICAgICAgICAgICAgZW51bSBBVkVzY2FwZU1vZGUgbW9kZSwgaW50IGZsYWdzKQoreworICAgIEFWQlByaW50IGRzdGJ1ZjsKKworICAgIGF2X2JwcmludF9pbml0KCZkc3RidWYsIDEsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgYXZfYnByaW50X2VzY2FwZSgmZHN0YnVmLCBzcmMsIHNwZWNpYWxfY2hhcnMsIG1vZGUsIGZsYWdzKTsKKworICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKCZkc3RidWYpKSB7CisgICAgICAgIGF2X2JwcmludF9maW5hbGl6ZSgmZHN0YnVmLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmRzdGJ1ZiwgZHN0KTsKKyAgICAgICAgcmV0dXJuIGRzdGJ1Zi5sZW47CisgICAgfQorfQorCitpbnQgYXZfaXNkaWdpdChpbnQgYykKK3sKKyAgICByZXR1cm4gYyA+PSAnMCcgJiYgYyA8PSAnOSc7Cit9CisKK2ludCBhdl9pc2dyYXBoKGludCBjKQoreworICAgIHJldHVybiBjID4gMzIgJiYgYyA8IDEyNzsKK30KKworaW50IGF2X2lzc3BhY2UoaW50IGMpCit7CisgICAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1xmJyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1x0JyB8fAorICAgICAgICAgICBjID09ICdcdic7Cit9CisKK2ludCBhdl9pc3hkaWdpdChpbnQgYykKK3sKKyAgICBjID0gYXZfdG9sb3dlcihjKTsKKyAgICByZXR1cm4gYXZfaXNkaWdpdChjKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAnZicpOworfQorCitpbnQgYXZfbWF0Y2hfbmFtZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpuYW1lcykKK3sKKyAgICBjb25zdCBjaGFyICpwOworICAgIGludCBsZW4sIG5hbWVsZW47CisKKyAgICBpZiAoIW5hbWUgfHwgIW5hbWVzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgd2hpbGUgKChwID0gc3RyY2hyKG5hbWVzLCAnLCcpKSkgeworICAgICAgICBsZW4gPSBGRk1BWChwIC0gbmFtZXMsIG5hbWVsZW4pOworICAgICAgICBpZiAoIWF2X3N0cm5jYXNlY21wKG5hbWUsIG5hbWVzLCBsZW4pKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIG5hbWVzID0gcCArIDE7CisgICAgfQorICAgIHJldHVybiAhYXZfc3RyY2FzZWNtcChuYW1lLCBuYW1lcyk7Cit9CisKK2ludCBhdl91dGY4X2RlY29kZShpbnQzMl90ICpjb2RlcCwgY29uc3QgdWludDhfdCAqKmJ1ZnAsIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSAqYnVmcDsKKyAgICB1aW50MzJfdCB0b3A7CisgICAgdWludDY0X3QgY29kZTsKKyAgICBpbnQgcmV0ID0gMCwgdGFpbF9sZW47CisgICAgdWludDMyX3Qgb3ZlcmxvbmdfZW5jb2RpbmdfbWluc1s2XSA9IHsKKyAgICAgICAgMHgwMDAwMDAwMCwgMHgwMDAwMDA4MCwgMHgwMDAwMDgwMCwgMHgwMDAxMDAwMCwgMHgwMDIwMDAwMCwgMHgwNDAwMDAwMCwKKyAgICB9OworCisgICAgaWYgKHAgPj0gYnVmX2VuZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjb2RlID0gKnArKzsKKworICAgIC8qIGZpcnN0IHNlcXVlbmNlIGJ5dGUgc3RhcnRzIHdpdGggMTAsIG9yIGlzIDExMTEtMTExMCBvciAxMTExLTExMTEsCisgICAgICAgd2hpY2ggaXMgbm90IGFkbWl0dGVkICovCisgICAgaWYgKChjb2RlICYgMHhjMCkgPT0gMHg4MCB8fCBjb2RlID49IDB4RkUpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSUxTRVEpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgdG9wID0gKGNvZGUgJiAxMjgpID4+IDE7CisKKyAgICB0YWlsX2xlbiA9IDA7CisgICAgd2hpbGUgKGNvZGUgJiB0b3ApIHsKKyAgICAgICAgaW50IHRtcDsKKyAgICAgICAgdGFpbF9sZW4rKzsKKyAgICAgICAgaWYgKHAgPj0gYnVmX2VuZCkgeworICAgICAgICAgICAgKCpidWZwKSArKzsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTFNFUSk7IC8qIGluY29tcGxldGUgc2VxdWVuY2UgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIHdlIGFzc3VtZSB0aGUgYnl0ZSB0byBiZSBpbiB0aGUgZm9ybSAxMHh4LXh4eHggKi8KKyAgICAgICAgdG1wID0gKnArKyAtIDEyODsgICAvKiBzdHJpcCBsZWFkaW5nIDEgKi8KKyAgICAgICAgaWYgKHRtcD4+NikgeworICAgICAgICAgICAgKCpidWZwKSArKzsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTFNFUSk7CisgICAgICAgIH0KKyAgICAgICAgY29kZSA9IChjb2RlPDw2KSArIHRtcDsKKyAgICAgICAgdG9wIDw8PSA1OworICAgIH0KKyAgICBjb2RlICY9ICh0b3AgPDwgMSkgLSAxOworCisgICAgLyogY2hlY2sgZm9yIG92ZXJsb25nIGVuY29kaW5ncyAqLworICAgIGF2X2Fzc2VydDAodGFpbF9sZW4gPD0gNSk7CisgICAgaWYgKGNvZGUgPCBvdmVybG9uZ19lbmNvZGluZ19taW5zW3RhaWxfbGVuXSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTFNFUSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmIChjb2RlID49IDE8PDMxKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlMU0VRKTsgIC8qIG91dC1vZi1yYW5nZSB2YWx1ZSAqLworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICAqY29kZXAgPSBjb2RlOworCisgICAgaWYgKGNvZGUgPiAweDEwRkZGRiAmJgorICAgICAgICAhKGZsYWdzICYgQVZfVVRGOF9GTEFHX0FDQ0VQVF9JTlZBTElEX0JJR19DT0RFUykpCisgICAgICAgIHJldCA9IEFWRVJST1IoRUlMU0VRKTsKKyAgICBpZiAoY29kZSA8IDB4MjAgJiYgY29kZSAhPSAweDkgJiYgY29kZSAhPSAweEEgJiYgY29kZSAhPSAweEQgJiYKKyAgICAgICAgZmxhZ3MgJiBBVl9VVEY4X0ZMQUdfRVhDTFVERV9YTUxfSU5WQUxJRF9DT05UUk9MX0NPREVTKQorICAgICAgICByZXQgPSBBVkVSUk9SKEVJTFNFUSk7CisgICAgaWYgKGNvZGUgPj0gMHhEODAwICYmIGNvZGUgPD0gMHhERkZGICYmCisgICAgICAgICEoZmxhZ3MgJiBBVl9VVEY4X0ZMQUdfQUNDRVBUX1NVUlJPR0FURVMpKQorICAgICAgICByZXQgPSBBVkVSUk9SKEVJTFNFUSk7CisgICAgaWYgKChjb2RlID09IDB4RkZGRSB8fCBjb2RlID09IDB4RkZGRikgJiYKKyAgICAgICAgIShmbGFncyAmIEFWX1VURjhfRkxBR19BQ0NFUFRfTk9OX0NIQVJBQ1RFUlMpKQorICAgICAgICByZXQgPSBBVkVSUk9SKEVJTFNFUSk7CisKK2VuZDoKKyAgICAqYnVmcCA9IHA7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2X21hdGNoX2xpc3QoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbGlzdCwgY2hhciBzZXBhcmF0b3IpCit7CisgICAgY29uc3QgY2hhciAqcCwgKnE7CisKKyAgICBmb3IgKHAgPSBuYW1lOyBwICYmICpwOyApIHsKKyAgICAgICAgZm9yIChxID0gbGlzdDsgcSAmJiAqcTsgKSB7CisgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IHBba10gPT0gcVtrXSB8fCAocFtrXSpxW2tdID09IDAgJiYgcFtrXStxW2tdID09IHNlcGFyYXRvcik7IGsrKykKKyAgICAgICAgICAgICAgICBpZiAoayAmJiAoIXBba10gfHwgcFtrXSA9PSBzZXBhcmF0b3IpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIHEgPSBzdHJjaHIocSwgc2VwYXJhdG9yKTsKKyAgICAgICAgICAgIHEgKz0gISFxOworICAgICAgICB9CisgICAgICAgIHAgPSBzdHJjaHIocCwgc2VwYXJhdG9yKTsKKyAgICAgICAgcCArPSAhIXA7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBURVNUCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10gPSB7CisgICAgICAgICInJyIsCisgICAgICAgICIiLAorICAgICAgICAiOiIsCisgICAgICAgICJcXCIsCisgICAgICAgICInIiwKKyAgICAgICAgIiAgICAnJyAgICA6IiwKKyAgICAgICAgIiAgICAnJyAgJycgIDoiLAorICAgICAgICAiZm9vICAgJycgOiIsCisgICAgICAgICInZm9vJyIsCisgICAgICAgICJmb28gICAgICIsCisgICAgICAgICIgICcgIGZvbyAgJyAgIiwKKyAgICAgICAgImZvb1xcIiwKKyAgICAgICAgImZvbyc6ICBibGFoOmJsYWgiLAorICAgICAgICAiZm9vXFw6ICBibGFoOmJsYWgiLAorICAgICAgICAiZm9vXCciLAorICAgICAgICAiJ2ZvbyA6ICAnICA6YmxhaGJsYWgiLAorICAgICAgICAiXFwgOmJsYWgiLAorICAgICAgICAiICAgICBmb28iLAorICAgICAgICAiICAgICAgZm9vICAgICAgICIsCisgICAgICAgICIgICAgICBmb28gICAgIFxcICIsCisgICAgICAgICJmb28gJzpibGFoIiwKKyAgICAgICAgIiBmb28gICBiYXIgICAgOiAgIGJsYWhibGFoIiwKKyAgICAgICAgIlxcZlxcb1xcbyIsCisgICAgICAgICInZm9vIDogXFwgXFwgICcgICA6IGJsYWhibGFoIiwKKyAgICAgICAgIidcXGZvXFxvOic6IGJsYWhibGFoIiwKKyAgICAgICAgIlxcJ2ZvXFxvXFw6JzogIGZvbyAgJyAgOmJsYWhibGFoIgorICAgIH07CisKKyAgICBwcmludGYoIlRlc3RpbmcgYXZfZ2V0X3Rva2VuKClcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzdHJpbmdzKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBzdHJpbmdzW2ldOworICAgICAgICBjaGFyICpxOworICAgICAgICBwcmludGYoInwlc3wiLCBwKTsKKyAgICAgICAgcSA9IGF2X2dldF90b2tlbigmcCwgIjoiKTsKKyAgICAgICAgcHJpbnRmKCIgLT4gfCVzfCIsIHEpOworICAgICAgICBwcmludGYoIiArIHwlc3xcbiIsIHApOworICAgICAgICBhdl9mcmVlKHEpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hdnN0cmluZy5oIGIvZmZtcGVnL2xpYmF2dXRpbC9hdnN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYjdhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2F2c3RyaW5nLmgKQEAgLTAsMCArMSwzNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTWFucyBSdWxsZ2FyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9BVlNUUklOR19ICisjZGVmaW5lIEFWVVRJTF9BVlNUUklOR19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisKKy8qKgorICogQGFkZHRvZ3JvdXAgbGF2dV9zdHJpbmcKKyAqIEB7CisgKi8KKworLyoqCisgKiBSZXR1cm4gbm9uLXplcm8gaWYgcGZ4IGlzIGEgcHJlZml4IG9mIHN0ci4gSWYgaXQgaXMsICpwdHIgaXMgc2V0IHRvCisgKiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHN0ciBhZnRlciB0aGUgcHJlZml4LgorICoKKyAqIEBwYXJhbSBzdHIgaW5wdXQgc3RyaW5nCisgKiBAcGFyYW0gcGZ4IHByZWZpeCB0byB0ZXN0CisgKiBAcGFyYW0gcHRyIHVwZGF0ZWQgaWYgdGhlIHByZWZpeCBpcyBtYXRjaGVkIGluc2lkZSBzdHIKKyAqIEByZXR1cm4gbm9uLXplcm8gaWYgdGhlIHByZWZpeCBtYXRjaGVzLCB6ZXJvIG90aGVyd2lzZQorICovCitpbnQgYXZfc3Ryc3RhcnQoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwZngsIGNvbnN0IGNoYXIgKipwdHIpOworCisvKioKKyAqIFJldHVybiBub24temVybyBpZiBwZnggaXMgYSBwcmVmaXggb2Ygc3RyIGluZGVwZW5kZW50IG9mIGNhc2UuIElmCisgKiBpdCBpcywgKnB0ciBpcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBzdHIKKyAqIGFmdGVyIHRoZSBwcmVmaXguCisgKgorICogQHBhcmFtIHN0ciBpbnB1dCBzdHJpbmcKKyAqIEBwYXJhbSBwZnggcHJlZml4IHRvIHRlc3QKKyAqIEBwYXJhbSBwdHIgdXBkYXRlZCBpZiB0aGUgcHJlZml4IGlzIG1hdGNoZWQgaW5zaWRlIHN0cgorICogQHJldHVybiBub24temVybyBpZiB0aGUgcHJlZml4IG1hdGNoZXMsIHplcm8gb3RoZXJ3aXNlCisgKi8KK2ludCBhdl9zdHJpc3RhcnQoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwZngsIGNvbnN0IGNoYXIgKipwdHIpOworCisvKioKKyAqIExvY2F0ZSB0aGUgZmlyc3QgY2FzZS1pbmRlcGVuZGVudCBvY2N1cnJlbmNlIGluIHRoZSBzdHJpbmcgaGF5c3RhY2sKKyAqIG9mIHRoZSBzdHJpbmcgbmVlZGxlLiAgQSB6ZXJvLWxlbmd0aCBzdHJpbmcgbmVlZGxlIGlzIGNvbnNpZGVyZWQgdG8KKyAqIG1hdGNoIGF0IHRoZSBzdGFydCBvZiBoYXlzdGFjay4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FzZS1pbnNlbnNpdGl2ZSB2ZXJzaW9uIG9mIHRoZSBzdGFuZGFyZCBzdHJzdHIoKS4KKyAqCisgKiBAcGFyYW0gaGF5c3RhY2sgc3RyaW5nIHRvIHNlYXJjaCBpbgorICogQHBhcmFtIG5lZWRsZSAgIHN0cmluZyB0byBzZWFyY2ggZm9yCisgKiBAcmV0dXJuICAgICAgICAgcG9pbnRlciB0byB0aGUgbG9jYXRlZCBtYXRjaCB3aXRoaW4gaGF5c3RhY2sKKyAqICAgICAgICAgICAgICAgICBvciBhIG51bGwgcG9pbnRlciBpZiBubyBtYXRjaAorICovCitjaGFyICphdl9zdHJpc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpOworCisvKioKKyAqIExvY2F0ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3RyaW5nIG5lZWRsZSBpbiB0aGUgc3RyaW5nIGhheXN0YWNrCisgKiB3aGVyZSBub3QgbW9yZSB0aGFuIGhheV9sZW5ndGggY2hhcmFjdGVycyBhcmUgc2VhcmNoZWQuIEEgemVyby1sZW5ndGgKKyAqIHN0cmluZyBuZWVkbGUgaXMgY29uc2lkZXJlZCB0byBtYXRjaCBhdCB0aGUgc3RhcnQgb2YgaGF5c3RhY2suCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBhIGxlbmd0aC1saW1pdGVkIHZlcnNpb24gb2YgdGhlIHN0YW5kYXJkIHN0cnN0cigpLgorICoKKyAqIEBwYXJhbSBoYXlzdGFjayAgIHN0cmluZyB0byBzZWFyY2ggaW4KKyAqIEBwYXJhbSBuZWVkbGUgICAgIHN0cmluZyB0byBzZWFyY2ggZm9yCisgKiBAcGFyYW0gaGF5X2xlbmd0aCBsZW5ndGggb2Ygc3RyaW5nIHRvIHNlYXJjaCBpbgorICogQHJldHVybiAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbG9jYXRlZCBtYXRjaCB3aXRoaW4gaGF5c3RhY2sKKyAqICAgICAgICAgICAgICAgICAgIG9yIGEgbnVsbCBwb2ludGVyIGlmIG5vIG1hdGNoCisgKi8KK2NoYXIgKmF2X3N0cm5zdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSwgc2l6ZV90IGhheV9sZW5ndGgpOworCisvKioKKyAqIENvcHkgdGhlIHN0cmluZyBzcmMgdG8gZHN0LCBidXQgbm8gbW9yZSB0aGFuIHNpemUgLSAxIGJ5dGVzLCBhbmQKKyAqIG51bGwtdGVybWluYXRlIGRzdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIEJTRCBzdHJsY3B5KCkuCisgKgorICogQHBhcmFtIGRzdCBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBwYXJhbSBzcmMgc291cmNlIHN0cmluZworICogQHBhcmFtIHNpemUgc2l6ZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiBzcmMKKyAqCisgKiBAd2FybmluZyBzaW5jZSB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBsZW5ndGggb2Ygc3JjLCBzcmMgYWJzb2x1dGVseQorICogX211c3RfIGJlIGEgcHJvcGVybHkgMC10ZXJtaW5hdGVkIHN0cmluZywgb3RoZXJ3aXNlIHRoaXMgd2lsbCByZWFkIGJleW9uZAorICogdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGFuZCBwb3NzaWJseSBjcmFzaC4KKyAqLworc2l6ZV90IGF2X3N0cmxjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBBcHBlbmQgdGhlIHN0cmluZyBzcmMgdG8gdGhlIHN0cmluZyBkc3QsIGJ1dCB0byBhIHRvdGFsIGxlbmd0aCBvZgorICogbm8gbW9yZSB0aGFuIHNpemUgLSAxIGJ5dGVzLCBhbmQgbnVsbC10ZXJtaW5hdGUgZHN0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBCU0Qgc3RybGNhdCgpLCBidXQgZGlmZmVycyB3aGVuCisgKiBzaXplIDw9IHN0cmxlbihkc3QpLgorICoKKyAqIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW0gc3JjIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBzaXplIHNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAcmV0dXJuIHRoZSB0b3RhbCBsZW5ndGggb2Ygc3JjIGFuZCBkc3QKKyAqCisgKiBAd2FybmluZyBzaW5jZSB0aGUgcmV0dXJuIHZhbHVlIHVzZSB0aGUgbGVuZ3RoIG9mIHNyYyBhbmQgZHN0LCB0aGVzZQorICogYWJzb2x1dGVseSBfbXVzdF8gYmUgYSBwcm9wZXJseSAwLXRlcm1pbmF0ZWQgc3RyaW5ncywgb3RoZXJ3aXNlIHRoaXMKKyAqIHdpbGwgcmVhZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGFuZCBwb3NzaWJseSBjcmFzaC4KKyAqLworc2l6ZV90IGF2X3N0cmxjYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBBcHBlbmQgb3V0cHV0IHRvIGEgc3RyaW5nLCBhY2NvcmRpbmcgdG8gYSBmb3JtYXQuIE5ldmVyIHdyaXRlIG91dCBvZgorICogdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW5kIGFsd2F5cyBwdXQgYSB0ZXJtaW5hdGluZyAwIHdpdGhpbgorICogdGhlIGJ1ZmZlci4KKyAqIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gYnVmZmVyIChzdHJpbmcgdG8gd2hpY2ggdGhlIG91dHB1dCBpcworICogIGFwcGVuZGVkKQorICogQHBhcmFtIHNpemUgdG90YWwgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW0gZm10IHByaW50Zi1jb21wYXRpYmxlIGZvcm1hdCBzdHJpbmcsIHNwZWNpZnlpbmcgaG93IHRoZQorICogIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkCisgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQKKyAqICBpZiBlbm91Z2ggc3BhY2UgaGFkIGJlZW4gYXZhaWxhYmxlCisgKi8KK3NpemVfdCBhdl9zdHJsY2F0ZihjaGFyICpkc3QsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIC4uLikgYXZfcHJpbnRmX2Zvcm1hdCgzLCA0KTsKKworLyoqCisgKiBHZXQgdGhlIGNvdW50IG9mIGNvbnRpbnVvdXMgbm9uIHplcm8gY2hhcnMgc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLgorICoKKyAqIEBwYXJhbSBsZW4gbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjaGVjayBpbiB0aGUgc3RyaW5nLCB0aGF0CisgKiAgICAgICAgICAgIGlzIHRoZSBtYXhpbXVtIHZhbHVlIHdoaWNoIGlzIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbgorICovCitzdGF0aWMgaW5saW5lIHNpemVfdCBhdl9zdHJubGVuKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pCit7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbiAmJiBzW2ldOyBpKyspCisgICAgICAgIDsKKyAgICByZXR1cm4gaTsKK30KKworLyoqCisgKiBQcmludCBhcmd1bWVudHMgZm9sbG93aW5nIHNwZWNpZmllZCBmb3JtYXQgaW50byBhIGxhcmdlIGVub3VnaCBhdXRvCisgKiBhbGxvY2F0ZWQgYnVmZmVyLiBJdCBpcyBzaW1pbGFyIHRvIEdOVSBhc3ByaW50ZigpLgorICogQHBhcmFtIGZtdCBwcmludGYtY29tcGF0aWJsZSBmb3JtYXQgc3RyaW5nLCBzcGVjaWZ5aW5nIGhvdyB0aGUKKyAqICAgICAgICAgICAgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQuCisgKiBAcmV0dXJuIHRoZSBhbGxvY2F0ZWQgc3RyaW5nCisgKiBAbm90ZSBZb3UgaGF2ZSB0byBmcmVlIHRoZSBzdHJpbmcgeW91cnNlbGYgd2l0aCBhdl9mcmVlKCkuCisgKi8KK2NoYXIgKmF2X2FzcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBhdl9wcmludGZfZm9ybWF0KDEsIDIpOworCisvKioKKyAqIENvbnZlcnQgYSBudW1iZXIgdG8gYSBhdl9tYWxsb2NlZCBzdHJpbmcuCisgKi8KK2NoYXIgKmF2X2Qyc3RyKGRvdWJsZSBkKTsKKworLyoqCisgKiBVbmVzY2FwZSB0aGUgZ2l2ZW4gc3RyaW5nIHVudGlsIGEgbm9uIGVzY2FwZWQgdGVybWluYXRpbmcgY2hhciwKKyAqIGFuZCByZXR1cm4gdGhlIHRva2VuIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZXNjYXBlZCBzdHJpbmcuCisgKgorICogVGhlIG5vcm1hbCBcIGFuZCAnIGVzY2FwaW5nIGlzIHN1cHBvcnRlZC4gTGVhZGluZyBhbmQgdHJhaWxpbmcKKyAqIHdoaXRlc3BhY2VzIGFyZSByZW1vdmVkLCB1bmxlc3MgdGhleSBhcmUgZXNjYXBlZCB3aXRoICdcJyBvciBhcmUKKyAqIGVuY2xvc2VkIGJldHdlZW4gJycuCisgKgorICogQHBhcmFtIGJ1ZiB0aGUgYnVmZmVyIHRvIHBhcnNlLCBidWYgd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZQorICogdGVybWluYXRpbmcgY2hhcgorICogQHBhcmFtIHRlcm0gYSAwLXRlcm1pbmF0ZWQgbGlzdCBvZiB0ZXJtaW5hdGluZyBjaGFycworICogQHJldHVybiB0aGUgbWFsbG9jZWQgdW5lc2NhcGVkIHN0cmluZywgd2hpY2ggbXVzdCBiZSBhdl9mcmVlZCBieQorICogdGhlIHVzZXIsIE5VTEwgaW4gY2FzZSBvZiBhbGxvY2F0aW9uIGZhaWx1cmUKKyAqLworY2hhciAqYXZfZ2V0X3Rva2VuKGNvbnN0IGNoYXIgKipidWYsIGNvbnN0IGNoYXIgKnRlcm0pOworCisvKioKKyAqIFNwbGl0IHRoZSBzdHJpbmcgaW50byBzZXZlcmFsIHRva2VucyB3aGljaCBjYW4gYmUgYWNjZXNzZWQgYnkKKyAqIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gYXZfc3RydG9rKCkuCisgKgorICogQSB0b2tlbiBpcyBkZWZpbmVkIGFzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBub3QgYmVsb25naW5nIHRvIHRoZQorICogc2V0IHNwZWNpZmllZCBpbiBkZWxpbS4KKyAqCisgKiBPbiB0aGUgZmlyc3QgY2FsbCB0byBhdl9zdHJ0b2soKSwgcyBzaG91bGQgcG9pbnQgdG8gdGhlIHN0cmluZyB0bworICogcGFyc2UsIGFuZCB0aGUgdmFsdWUgb2Ygc2F2ZXB0ciBpcyBpZ25vcmVkLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzCisgKiBzaG91bGQgYmUgTlVMTCwgYW5kIHNhdmVwdHIgc2hvdWxkIGJlIHVuY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMKKyAqIGNhbGwuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHN0cnRva19yKCkgZGVmaW5lZCBpbiBQT1NJWC4xLgorICoKKyAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gcGFyc2UsIG1heSBiZSBOVUxMCisgKiBAcGFyYW0gZGVsaW0gMC10ZXJtaW5hdGVkIGxpc3Qgb2YgdG9rZW4gZGVsaW1pdGVycywgbXVzdCBiZSBub24tTlVMTAorICogQHBhcmFtIHNhdmVwdHIgdXNlci1wcm92aWRlZCBwb2ludGVyIHdoaWNoIHBvaW50cyB0byBzdG9yZWQKKyAqIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgYXZfc3RydG9rKCkgdG8gY29udGludWUgc2Nhbm5pbmcgdGhlIHNhbWUKKyAqIHN0cmluZy4gc2F2ZXB0ciBpcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBuZXh0IGNoYXJhY3RlciBhZnRlciB0aGUKKyAqIGZpcnN0IGRlbGltaXRlciBmb3VuZCwgb3IgdG8gTlVMTCBpZiB0aGUgc3RyaW5nIHdhcyB0ZXJtaW5hdGVkCisgKiBAcmV0dXJuIHRoZSBmb3VuZCB0b2tlbiwgb3IgTlVMTCB3aGVuIG5vIHRva2VuIGlzIGZvdW5kCisgKi8KK2NoYXIgKmF2X3N0cnRvayhjaGFyICpzLCBjb25zdCBjaGFyICpkZWxpbSwgY2hhciAqKnNhdmVwdHIpOworCisvKioKKyAqIExvY2FsZS1pbmRlcGVuZGVudCBjb252ZXJzaW9uIG9mIEFTQ0lJIGlzZGlnaXQuCisgKi8KK2F2X2NvbnN0IGludCBhdl9pc2RpZ2l0KGludCBjKTsKKworLyoqCisgKiBMb2NhbGUtaW5kZXBlbmRlbnQgY29udmVyc2lvbiBvZiBBU0NJSSBpc2dyYXBoLgorICovCithdl9jb25zdCBpbnQgYXZfaXNncmFwaChpbnQgYyk7CisKKy8qKgorICogTG9jYWxlLWluZGVwZW5kZW50IGNvbnZlcnNpb24gb2YgQVNDSUkgaXNzcGFjZS4KKyAqLworYXZfY29uc3QgaW50IGF2X2lzc3BhY2UoaW50IGMpOworCisvKioKKyAqIExvY2FsZS1pbmRlcGVuZGVudCBjb252ZXJzaW9uIG9mIEFTQ0lJIGNoYXJhY3RlcnMgdG8gdXBwZXJjYXNlLgorICovCitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IGludCBhdl90b3VwcGVyKGludCBjKQoreworICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKKyAgICAgICAgYyBePSAweDIwOworICAgIHJldHVybiBjOworfQorCisvKioKKyAqIExvY2FsZS1pbmRlcGVuZGVudCBjb252ZXJzaW9uIG9mIEFTQ0lJIGNoYXJhY3RlcnMgdG8gbG93ZXJjYXNlLgorICovCitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IGludCBhdl90b2xvd2VyKGludCBjKQoreworICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKKyAgICAgICAgYyBePSAweDIwOworICAgIHJldHVybiBjOworfQorCisvKioKKyAqIExvY2FsZS1pbmRlcGVuZGVudCBjb252ZXJzaW9uIG9mIEFTQ0lJIGlzeGRpZ2l0LgorICovCithdl9jb25zdCBpbnQgYXZfaXN4ZGlnaXQoaW50IGMpOworCisvKioKKyAqIExvY2FsZS1pbmRlcGVuZGVudCBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmUuCisgKiBAbm90ZSBUaGlzIG1lYW5zIG9ubHkgQVNDSUktcmFuZ2UgY2hhcmFjdGVycyBhcmUgY2FzZS1pbnNlbnNpdGl2ZQorICovCitpbnQgYXZfc3RyY2FzZWNtcChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKTsKKworLyoqCisgKiBMb2NhbGUtaW5kZXBlbmRlbnQgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJlLgorICogQG5vdGUgVGhpcyBtZWFucyBvbmx5IEFTQ0lJLXJhbmdlIGNoYXJhY3RlcnMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKKyAqLworaW50IGF2X3N0cm5jYXNlY21wKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsIHNpemVfdCBuKTsKKworCisvKioKKyAqIFRocmVhZCBzYWZlIGJhc2VuYW1lLgorICogQHBhcmFtIHBhdGggdGhlIHBhdGgsIG9uIERPUyBib3RoIFwgYW5kIC8gYXJlIGNvbnNpZGVyZWQgc2VwYXJhdG9ycy4KKyAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgYmFzZW5hbWUgc3Vic3RyaW5nLgorICovCitjb25zdCBjaGFyICphdl9iYXNlbmFtZShjb25zdCBjaGFyICpwYXRoKTsKKworLyoqCisgKiBUaHJlYWQgc2FmZSBkaXJuYW1lLgorICogQHBhcmFtIHBhdGggdGhlIHBhdGgsIG9uIERPUyBib3RoIFwgYW5kIC8gYXJlIGNvbnNpZGVyZWQgc2VwYXJhdG9ycy4KKyAqIEByZXR1cm4gdGhlIHBhdGggd2l0aCB0aGUgc2VwYXJhdG9yIHJlcGxhY2VkIGJ5IHRoZSBzdHJpbmcgdGVybWluYXRvciBvciAiLiIuCisgKiBAbm90ZSB0aGUgZnVuY3Rpb24gbWF5IGNoYW5nZSB0aGUgaW5wdXQgc3RyaW5nLgorICovCitjb25zdCBjaGFyICphdl9kaXJuYW1lKGNoYXIgKnBhdGgpOworCisvKioKKyAqIE1hdGNoIGluc3RhbmNlcyBvZiBhIG5hbWUgaW4gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBuYW1lcy4KKyAqIEBwYXJhbSBuYW1lICBOYW1lIHRvIGxvb2sgZm9yLgorICogQHBhcmFtIG5hbWVzIExpc3Qgb2YgbmFtZXMuCisgKiBAcmV0dXJuIDEgb24gbWF0Y2gsIDAgb3RoZXJ3aXNlLgorICovCitpbnQgYXZfbWF0Y2hfbmFtZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpuYW1lcyk7CisKK2VudW0gQVZFc2NhcGVNb2RlIHsKKyAgICBBVl9FU0NBUEVfTU9ERV9BVVRPLCAgICAgIC8vLzwgVXNlIGF1dG8tc2VsZWN0ZWQgZXNjYXBpbmcgbW9kZS4KKyAgICBBVl9FU0NBUEVfTU9ERV9CQUNLU0xBU0gsIC8vLzwgVXNlIGJhY2tzbGFzaCBlc2NhcGluZy4KKyAgICBBVl9FU0NBUEVfTU9ERV9RVU9URSwgICAgIC8vLzwgVXNlIHNpbmdsZS1xdW90ZSBlc2NhcGluZy4KK307CisKKy8qKgorICogQ29uc2lkZXIgc3BhY2VzIHNwZWNpYWwgYW5kIGVzY2FwZSB0aGVtIGV2ZW4gaW4gdGhlIG1pZGRsZSBvZiB0aGUKKyAqIHN0cmluZy4KKyAqCisgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYWRkaW5nIHRoZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpYWwKKyAqIGNoYXJhY3RlcnMgbGlzdHMsIGV4Y2VwdCBpdCBpcyBndWFyYW50ZWVkIHRvIHVzZSB0aGUgZXhhY3Qgc2FtZSBsaXN0CisgKiBvZiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXMgdGhlIHJlc3Qgb2YgbGliYXZ1dGlsLgorICovCisjZGVmaW5lIEFWX0VTQ0FQRV9GTEFHX1dISVRFU1BBQ0UgMHgwMQorCisvKioKKyAqIEVzY2FwZSBvbmx5IHNwZWNpZmllZCBzcGVjaWFsIGNoYXJhY3RlcnMuCisgKiBXaXRob3V0IHRoaXMgZmxhZywgZXNjYXBlIGFsc28gYW55IGNoYXJhY3RlcnMgdGhhdCBtYXkgYmUgY29uc2lkZXJlZAorICogc3BlY2lhbCBieSBhdl9nZXRfdG9rZW4oKSwgc3VjaCBhcyB0aGUgc2luZ2xlIHF1b3RlLgorICovCisjZGVmaW5lIEFWX0VTQ0FQRV9GTEFHX1NUUklDVCAweDAyCisKKy8qKgorICogRXNjYXBlIHN0cmluZyBpbiBzcmMsIGFuZCBwdXQgdGhlIGVzY2FwZWQgc3RyaW5nIGluIGFuIGFsbG9jYXRlZAorICogc3RyaW5nIGluICpkc3QsIHdoaWNoIG11c3QgYmUgZnJlZWQgd2l0aCBhdl9mcmVlKCkuCisgKgorICogQHBhcmFtIGRzdCAgICAgICAgICAgcG9pbnRlciB3aGVyZSBhbiBhbGxvY2F0ZWQgc3RyaW5nIGlzIHB1dAorICogQHBhcmFtIHNyYyAgICAgICAgICAgc3RyaW5nIHRvIGVzY2FwZSwgbXVzdCBiZSBub24tTlVMTAorICogQHBhcmFtIHNwZWNpYWxfY2hhcnMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyB3aGljaAorICogICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBiZSBlc2NhcGVkLCBjYW4gYmUgTlVMTAorICogQHBhcmFtIG1vZGUgICAgICAgICAgZXNjYXBlIG1vZGUgdG8gZW1wbG95LCBzZWUgQVZfRVNDQVBFX01PREVfKiBtYWNyb3MuCisgKiAgICAgICAgICAgICAgICAgICAgICBBbnkgdW5rbm93biB2YWx1ZSBmb3IgbW9kZSB3aWxsIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCB0bworICogICAgICAgICAgICAgICAgICAgICAgQVZfRVNDQVBFX01PREVfQkFDS1NMQVNILCBidXQgdGhpcyBiZWhhdmlvdXIgY2FuIGNoYW5nZSB3aXRob3V0CisgKiAgICAgICAgICAgICAgICAgICAgICBub3RpY2UuCisgKiBAcGFyYW0gZmxhZ3MgICAgICAgICBmbGFncyB3aGljaCBjb250cm9sIGhvdyB0byBlc2NhcGUsIHNlZSBBVl9FU0NBUEVfRkxBR18gbWFjcm9zCisgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGFsbG9jYXRlZCBzdHJpbmcsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGVycm9yCisgKiBAc2VlIGF2X2JwcmludF9lc2NhcGUoKQorICovCitpbnQgYXZfZXNjYXBlKGNoYXIgKipkc3QsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqc3BlY2lhbF9jaGFycywKKyAgICAgICAgICAgICAgZW51bSBBVkVzY2FwZU1vZGUgbW9kZSwgaW50IGZsYWdzKTsKKworI2RlZmluZSBBVl9VVEY4X0ZMQUdfQUNDRVBUX0lOVkFMSURfQklHX0NPREVTICAgICAgICAgIDEgLy8vPCBhY2NlcHQgY29kZXBvaW50cyBvdmVyIDB4MTBGRkZGCisjZGVmaW5lIEFWX1VURjhfRkxBR19BQ0NFUFRfTk9OX0NIQVJBQ1RFUlMgICAgICAgICAgICAgMiAvLy88IGFjY2VwdCBub24tY2hhcmFjdGVycyAtIDB4RkZGRSBhbmQgMHhGRkZGCisjZGVmaW5lIEFWX1VURjhfRkxBR19BQ0NFUFRfU1VSUk9HQVRFUyAgICAgICAgICAgICAgICAgNCAvLy88IGFjY2VwdCBVVEYtMTYgc3Vycm9nYXRlcyBjb2RlcworI2RlZmluZSBBVl9VVEY4X0ZMQUdfRVhDTFVERV9YTUxfSU5WQUxJRF9DT05UUk9MX0NPREVTIDggLy8vPCBleGNsdWRlIGNvbnRyb2wgY29kZXMgbm90IGFjY2VwdGVkIGJ5IFhNTAorCisjZGVmaW5lIEFWX1VURjhfRkxBR19BQ0NFUFRfQUxMIFwKKyAgICBBVl9VVEY4X0ZMQUdfQUNDRVBUX0lOVkFMSURfQklHX0NPREVTfEFWX1VURjhfRkxBR19BQ0NFUFRfTk9OX0NIQVJBQ1RFUlN8QVZfVVRGOF9GTEFHX0FDQ0VQVF9TVVJST0dBVEVTCisKKy8qKgorICogUmVhZCBhbmQgZGVjb2RlIGEgc2luZ2xlIFVURi04IGNvZGUgcG9pbnQgKGNoYXJhY3RlcikgZnJvbSB0aGUKKyAqIGJ1ZmZlciBpbiAqYnVmLCBhbmQgdXBkYXRlICpidWYgdG8gcG9pbnQgdG8gdGhlIG5leHQgYnl0ZSB0bworICogZGVjb2RlLgorICoKKyAqIEluIGNhc2Ugb2YgYW4gaW52YWxpZCBieXRlIHNlcXVlbmNlLCB0aGUgcG9pbnRlciB3aWxsIGJlIHVwZGF0ZWQgdG8KKyAqIHRoZSBuZXh0IGJ5dGUgYWZ0ZXIgdGhlIGludmFsaWQgc2VxdWVuY2UgYW5kIHRoZSBmdW5jdGlvbiB3aWxsCisgKiByZXR1cm4gYW4gZXJyb3IgY29kZS4KKyAqCisgKiBEZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCBmbGFncywgdGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBmYWlsIGluCisgKiBjYXNlIHRoZSBkZWNvZGVkIGNvZGUgcG9pbnQgZG9lcyBub3QgYmVsb25nIHRvIGEgdmFsaWQgcmFuZ2UuCisgKgorICogQG5vdGUgRm9yIHNwZWVkLXJlbGV2YW50IGNvZGUgYSBjYXJlZnVsbHkgaW1wbGVtZW50ZWQgdXNlIG9mCisgKiBHRVRfVVRGOCgpIG1heSBiZSBwcmVmZXJyZWQuCisgKgorICogQHBhcmFtIGNvZGVwICAgcG9pbnRlciB1c2VkIHRvIHJldHVybiB0aGUgcGFyc2VkIGNvZGUgaW4gY2FzZSBvZiBzdWNjZXNzLgorICogICAgICAgICAgICAgICAgVGhlIHZhbHVlIGluICpjb2RlcCBpcyBzZXQgZXZlbiBpbiBjYXNlIHRoZSByYW5nZSBjaGVjayBmYWlscy4KKyAqIEBwYXJhbSBidWZwICAgIHBvaW50ZXIgdG8gdGhlIGFkZHJlc3MgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNlcXVlbmNlCisgKiAgICAgICAgICAgICAgICB0byBkZWNvZGUsIHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uIHRvIHBvaW50IHRvIHRoZQorICogICAgICAgICAgICAgICAgYnl0ZSBuZXh0IGFmdGVyIHRoZSBkZWNvZGVkIHNlcXVlbmNlCisgKiBAcGFyYW0gYnVmX2VuZCBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiAgICAgICAgICAgICAgICBieXRlIHBhc3QgdGhlIGxhc3QgaW4gdGhlIGJ1ZmZlci4gVGhpcyBpcyB1c2VkIHRvCisgKiAgICAgICAgICAgICAgICBhdm9pZCBidWZmZXIgb3ZlcnJlYWRzIChpbiBjYXNlIG9mIGFuIHVuZmluaXNoZWQKKyAqICAgICAgICAgICAgICAgIFVURi04IHNlcXVlbmNlIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgYnVmZmVyKS4KKyAqIEBwYXJhbSBmbGFncyAgIGEgY29sbGVjdGlvbiBvZiBBVl9VVEY4X0ZMQUdfKiBmbGFncworICogQHJldHVybiA+PSAwIGluIGNhc2UgYSBzZXF1ZW5jZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQsIGEgbmVnYXRpdmUKKyAqIHZhbHVlIGluIGNhc2Ugb2YgaW52YWxpZCBzZXF1ZW5jZQorICovCitpbnQgYXZfdXRmOF9kZWNvZGUoaW50MzJfdCAqY29kZXAsIGNvbnN0IHVpbnQ4X3QgKipidWZwLCBjb25zdCB1aW50OF90ICpidWZfZW5kLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7CisKKy8qKgorICogQ2hlY2sgaWYgYSBuYW1lIGlzIGluIGEgbGlzdC4KKyAqIEByZXR1cm5zIDAgaWYgbm90IGZvdW5kLCBvciB0aGUgMSBiYXNlZCBpbmRleCB3aGVyZSBpdCBoYXMgYmVlbiBmb3VuZCBpbiB0aGUKKyAqICAgICAgICAgICAgbGlzdC4KKyAqLworaW50IGF2X21hdGNoX2xpc3QoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbGlzdCwgY2hhciBzZXBhcmF0b3IpOworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9BVlNUUklOR19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2F2dXRpbC5oIGIvZmZtcGVnL2xpYmF2dXRpbC9hdnV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmViYjZjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hdnV0aWwuaApAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9BVlVUSUxfSAorI2RlZmluZSBBVlVUSUxfQVZVVElMX0gKKworLyoqCisgKiBAZmlsZQorICogZXh0ZXJuYWwgQVBJIGhlYWRlcgorICovCisKKy8qKgorICogQG1haW5wYWdlCisgKgorICogQHNlY3Rpb24gZmZtcGVnX2ludHJvIEludHJvZHVjdGlvbgorICoKKyAqIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSB1c2FnZSBvZiB0aGUgZGlmZmVyZW50IGxpYnJhcmllcworICogcHJvdmlkZWQgYnkgRkZtcGVnLgorICoKKyAqIEBsaSBAcmVmIGxpYmF2YyAibGliYXZjb2RlYyIgZW5jb2RpbmcvZGVjb2RpbmcgbGlicmFyeQorICogQGxpIEByZWYgbGF2ZmkgImxpYmF2ZmlsdGVyIiBncmFwaC1iYXNlZCBmcmFtZSBlZGl0aW5nIGxpYnJhcnkKKyAqIEBsaSBAcmVmIGxpYmF2ZiAibGliYXZmb3JtYXQiIEkvTyBhbmQgbXV4aW5nL2RlbXV4aW5nIGxpYnJhcnkKKyAqIEBsaSBAcmVmIGxhdmQgImxpYmF2ZGV2aWNlIiBzcGVjaWFsIGRldmljZXMgbXV4aW5nL2RlbXV4aW5nIGxpYnJhcnkKKyAqIEBsaSBAcmVmIGxhdnUgImxpYmF2dXRpbCIgY29tbW9uIHV0aWxpdHkgbGlicmFyeQorICogQGxpIEByZWYgbHN3ciAibGlic3dyZXNhbXBsZSIgYXVkaW8gcmVzYW1wbGluZywgZm9ybWF0IGNvbnZlcnNpb24gYW5kIG1peGluZworICogQGxpIEByZWYgbHBwICAibGlicG9zdHByb2MiIHBvc3QgcHJvY2Vzc2luZyBsaWJyYXJ5CisgKiBAbGkgQHJlZiBsaWJzd3MgImxpYnN3c2NhbGUiIGNvbG9yIGNvbnZlcnNpb24gYW5kIHNjYWxpbmcgbGlicmFyeQorICoKKyAqIEBzZWN0aW9uIGZmbXBlZ192ZXJzaW9uaW5nIFZlcnNpb25pbmcgYW5kIGNvbXBhdGliaWxpdHkKKyAqCisgKiBFYWNoIG9mIHRoZSBGRm1wZWcgbGlicmFyaWVzIGNvbnRhaW5zIGEgdmVyc2lvbi5oIGhlYWRlciwgd2hpY2ggZGVmaW5lcyBhCisgKiBtYWpvciwgbWlub3IgYW5kIG1pY3JvIHZlcnNpb24gbnVtYmVyIHdpdGggdGhlCisgKiA8ZW0+TElCUkFSWU5BTUVfVkVSU0lPTl97TUFKT1IsTUlOT1IsTUlDUk99PC9lbT4gbWFjcm9zLiBUaGUgbWFqb3IgdmVyc2lvbgorICogbnVtYmVyIGlzIGluY3JlbWVudGVkIHdpdGggYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZXMgLSBlLmcuIHJlbW92aW5nCisgKiBwYXJ0cyBvZiB0aGUgcHVibGljIEFQSSwgcmVvcmRlcmluZyBwdWJsaWMgc3RydWN0IG1lbWJlcnMsIGV0Yy4gVGhlIG1pbm9yCisgKiB2ZXJzaW9uIG51bWJlciBpcyBpbmNyZW1lbnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJsZSBBUEkgY2hhbmdlcyBvciBtYWpvcgorICogbmV3IGZlYXR1cmVzIC0gZS5nLiBhZGRpbmcgYSBuZXcgcHVibGljIGZ1bmN0aW9uIG9yIGEgbmV3IGRlY29kZXIuIFRoZSBtaWNybworICogdmVyc2lvbiBudW1iZXIgaXMgaW5jcmVtZW50ZWQgZm9yIHNtYWxsZXIgY2hhbmdlcyB0aGF0IGEgY2FsbGluZyBwcm9ncmFtCisgKiBtaWdodCBzdGlsbCB3YW50IHRvIGNoZWNrIGZvciAtIGUuZy4gY2hhbmdpbmcgYmVoYXZpb3IgaW4gYSBwcmV2aW91c2x5CisgKiB1bnNwZWNpZmllZCBzaXR1YXRpb24uCisgKgorICogRkZtcGVnIGd1YXJhbnRlZXMgYmFja3dhcmQgQVBJIGFuZCBBQkkgY29tcGF0aWJpbGl0eSBmb3IgZWFjaCBsaWJyYXJ5IGFzIGxvbmcKKyAqIGFzIGl0cyBtYWpvciB2ZXJzaW9uIG51bWJlciBpcyB1bmNoYW5nZWQuIFRoaXMgbWVhbnMgdGhhdCBubyBwdWJsaWMgc3ltYm9scworICogd2lsbCBiZSByZW1vdmVkIG9yIHJlbmFtZWQuIFR5cGVzIGFuZCBuYW1lcyBvZiB0aGUgcHVibGljIHN0cnVjdCBtZW1iZXJzIGFuZAorICogdmFsdWVzIG9mIHB1YmxpYyBtYWNyb3MgYW5kIGVudW1zIHdpbGwgcmVtYWluIHRoZSBzYW1lICh1bmxlc3MgdGhleSB3ZXJlCisgKiBleHBsaWNpdGx5IGRlY2xhcmVkIGFzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJKS4gRG9jdW1lbnRlZCBiZWhhdmlvciB3aWxsCisgKiBub3QgY2hhbmdlLgorICoKKyAqIEluIG90aGVyIHdvcmRzLCBhbnkgY29ycmVjdCBwcm9ncmFtIHRoYXQgd29ya3Mgd2l0aCBhIGdpdmVuIEZGbXBlZyBzbmFwc2hvdAorICogc2hvdWxkIHdvcmsganVzdCBhcyB3ZWxsIHdpdGhvdXQgYW55IGNoYW5nZXMgd2l0aCBhbnkgbGF0ZXIgc25hcHNob3Qgd2l0aCB0aGUKKyAqIHNhbWUgbWFqb3IgdmVyc2lvbnMuIFRoaXMgYXBwbGllcyB0byBib3RoIHJlYnVpbGRpbmcgdGhlIHByb2dyYW0gYWdhaW5zdCBuZXcKKyAqIEZGbXBlZyB2ZXJzaW9ucyBvciB0byByZXBsYWNpbmcgdGhlIGR5bmFtaWMgRkZtcGVnIGxpYnJhcmllcyB0aGF0IGEgcHJvZ3JhbQorICogbGlua3MgYWdhaW5zdC4KKyAqCisgKiBIb3dldmVyLCBuZXcgcHVibGljIHN5bWJvbHMgbWF5IGJlIGFkZGVkIGFuZCBuZXcgbWVtYmVycyBtYXkgYmUgYXBwZW5kZWQgdG8KKyAqIHB1YmxpYyBzdHJ1Y3RzIHdob3NlIHNpemUgaXMgbm90IHBhcnQgb2YgcHVibGljIEFCSSAobW9zdCBwdWJsaWMgc3RydWN0cyBpbgorICogRkZtcGVnKS4gTmV3IG1hY3JvcyBhbmQgZW51bSB2YWx1ZXMgbWF5IGJlIGFkZGVkLiBCZWhhdmlvciBpbiB1bmRvY3VtZW50ZWQKKyAqIHNpdHVhdGlvbnMgbWF5IGNoYW5nZSBzbGlnaHRseSAoYW5kIGJlIGRvY3VtZW50ZWQpLiBBbGwgdGhvc2UgYXJlIGFjY29tcGFuaWVkCisgKiBieSBhbiBlbnRyeSBpbiBkb2MvQVBJY2hhbmdlcyBhbmQgaW5jcmVtZW50aW5nIGVpdGhlciB0aGUgbWlub3Igb3IgbWljcm8KKyAqIHZlcnNpb24gbnVtYmVyLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIGxhdnUgQ29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogQGJyaWVmCisgKiBsaWJhdnV0aWwgY29udGFpbnMgdGhlIGNvZGUgc2hhcmVkIGFjcm9zcyBhbGwgdGhlIG90aGVyIEZGbXBlZworICogbGlicmFyaWVzCisgKgorICogQG5vdGUgSW4gb3JkZXIgdG8gdXNlIHRoZSBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgYXZ1dGlsIHlvdSBtdXN0IGluY2x1ZGUKKyAqIHRoZSBzcGVjaWZpYyBoZWFkZXIuCisgKgorICogQHsKKyAqCisgKiBAZGVmZ3JvdXAgbGF2dV9jcnlwdG8gQ3J5cHRvIGFuZCBIYXNoaW5nCisgKgorICogQHsKKyAqIEB9CisgKgorICogQGRlZmdyb3VwIGxhdnVfbWF0aCBNYXRocworICogQHsKKyAqCisgKiBAfQorICoKKyAqIEBkZWZncm91cCBsYXZ1X3N0cmluZyBTdHJpbmcgTWFuaXB1bGF0aW9uCisgKgorICogQHsKKyAqCisgKiBAfQorICoKKyAqIEBkZWZncm91cCBsYXZ1X21lbSBNZW1vcnkgTWFuYWdlbWVudAorICoKKyAqIEB7CisgKgorICogQH0KKyAqCisgKiBAZGVmZ3JvdXAgbGF2dV9kYXRhIERhdGEgU3RydWN0dXJlcworICogQHsKKyAqCisgKiBAfQorICoKKyAqIEBkZWZncm91cCBsYXZ1X2F1ZGlvIEF1ZGlvIHJlbGF0ZWQKKyAqCisgKiBAeworICoKKyAqIEB9CisgKgorICogQGRlZmdyb3VwIGxhdnVfZXJyb3IgRXJyb3IgQ29kZXMKKyAqCisgKiBAeworICoKKyAqIEB9CisgKgorICogQGRlZmdyb3VwIGxhdnVfbG9nIExvZ2dpbmcgRmFjaWxpdHkKKyAqCisgKiBAeworICoKKyAqIEB9CisgKgorICogQGRlZmdyb3VwIGxhdnVfbWlzYyBPdGhlcgorICoKKyAqIEB7CisgKgorICogQGRlZmdyb3VwIGxhdnVfaW50ZXJuYWwgSW50ZXJuYWwKKyAqCisgKiBOb3QgZXhwb3J0ZWQgZnVuY3Rpb25zLCBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQorICoKKyAqIEB7CisgKgorICogQH0KKyAqCisgKiBAZGVmZ3JvdXAgcHJlcHJvY19taXNjIFByZXByb2Nlc3NvciBTdHJpbmcgTWFjcm9zCisgKgorICogQHsKKyAqCisgKiBAfQorICoKKyAqIEBkZWZncm91cCB2ZXJzaW9uX3V0aWxzIExpYnJhcnkgVmVyc2lvbiBNYWNyb3MKKyAqCisgKiBAeworICoKKyAqIEB9CisgKi8KKworCisvKioKKyAqIEBhZGR0b2dyb3VwIGxhdnVfdmVyCisgKiBAeworICovCisKKy8qKgorICogUmV0dXJuIHRoZSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQgY29uc3RhbnQuCisgKi8KK3Vuc2lnbmVkIGF2dXRpbF92ZXJzaW9uKHZvaWQpOworCisvKioKKyAqIFJldHVybiB0aGUgbGliYXZ1dGlsIGJ1aWxkLXRpbWUgY29uZmlndXJhdGlvbi4KKyAqLworY29uc3QgY2hhciAqYXZ1dGlsX2NvbmZpZ3VyYXRpb24odm9pZCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBsaWJhdnV0aWwgbGljZW5zZS4KKyAqLworY29uc3QgY2hhciAqYXZ1dGlsX2xpY2Vuc2Uodm9pZCk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIGxhdnVfbWVkaWEgTWVkaWEgVHlwZQorICogQGJyaWVmIE1lZGlhIFR5cGUKKyAqLworCitlbnVtIEFWTWVkaWFUeXBlIHsKKyAgICBBVk1FRElBX1RZUEVfVU5LTk9XTiA9IC0xLCAgLy8vPCBVc3VhbGx5IHRyZWF0ZWQgYXMgQVZNRURJQV9UWVBFX0RBVEEKKyAgICBBVk1FRElBX1RZUEVfVklERU8sCisgICAgQVZNRURJQV9UWVBFX0FVRElPLAorICAgIEFWTUVESUFfVFlQRV9EQVRBLCAgICAgICAgICAvLy88IE9wYXF1ZSBkYXRhIGluZm9ybWF0aW9uIHVzdWFsbHkgY29udGludW91cworICAgIEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICBBVk1FRElBX1RZUEVfQVRUQUNITUVOVCwgICAgLy8vPCBPcGFxdWUgZGF0YSBpbmZvcm1hdGlvbiB1c3VhbGx5IHNwYXJzZQorICAgIEFWTUVESUFfVFlQRV9OQgorfTsKKworLyoqCisgKiBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbWVkaWFfdHlwZSBlbnVtLCBOVUxMIGlmIG1lZGlhX3R5cGUKKyAqIGlzIHVua25vd24uCisgKi8KK2NvbnN0IGNoYXIgKmF2X2dldF9tZWRpYV90eXBlX3N0cmluZyhlbnVtIEFWTWVkaWFUeXBlIG1lZGlhX3R5cGUpOworCisvKioKKyAqIEBkZWZncm91cCBsYXZ1X2NvbnN0IENvbnN0YW50cworICogQHsKKyAqCisgKiBAZGVmZ3JvdXAgbGF2dV9lbmMgRW5jb2Rpbmcgc3BlY2lmaWMKKyAqCisgKiBAbm90ZSB0aG9zZSBkZWZpbml0aW9uIHNob3VsZCBtb3ZlIHRvIGF2Y29kZWMKKyAqIEB7CisgKi8KKworI2RlZmluZSBGRl9MQU1CREFfU0hJRlQgNworI2RlZmluZSBGRl9MQU1CREFfU0NBTEUgKDE8PEZGX0xBTUJEQV9TSElGVCkKKyNkZWZpbmUgRkZfUVAyTEFNQkRBIDExOCAvLy88IGZhY3RvciB0byBjb252ZXJ0IGZyb20gSC4yNjMgUVAgdG8gbGFtYmRhCisjZGVmaW5lIEZGX0xBTUJEQV9NQVggKDI1NioxMjgtMSkKKworI2RlZmluZSBGRl9RVUFMSVRZX1NDQUxFIEZGX0xBTUJEQV9TQ0FMRSAvL0ZJWE1FIG1heWJlIHJlbW92ZQorCisvKioKKyAqIEB9CisgKiBAZGVmZ3JvdXAgbGF2dV90aW1lIFRpbWVzdGFtcCBzcGVjaWZpYworICoKKyAqIEZGbXBlZyBpbnRlcm5hbCB0aW1lYmFzZSBhbmQgdGltZXN0YW1wIGRlZmluaXRpb25zCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiBVbmRlZmluZWQgdGltZXN0YW1wIHZhbHVlCisgKgorICogVXN1YWxseSByZXBvcnRlZCBieSBkZW11eGVyIHRoYXQgd29yayBvbiBjb250YWluZXJzIHRoYXQgZG8gbm90IHByb3ZpZGUKKyAqIGVpdGhlciBwdHMgb3IgZHRzLgorICovCisKKyNkZWZpbmUgQVZfTk9QVFNfVkFMVUUgICAgICAgICAgKChpbnQ2NF90KVVJTlQ2NF9DKDB4ODAwMDAwMDAwMDAwMDAwMCkpCisKKy8qKgorICogSW50ZXJuYWwgdGltZSBiYXNlIHJlcHJlc2VudGVkIGFzIGludGVnZXIKKyAqLworCisjZGVmaW5lIEFWX1RJTUVfQkFTRSAgICAgICAgICAgIDEwMDAwMDAKKworLyoqCisgKiBJbnRlcm5hbCB0aW1lIGJhc2UgcmVwcmVzZW50ZWQgYXMgZnJhY3Rpb25hbCB2YWx1ZQorICovCisKKyNkZWZpbmUgQVZfVElNRV9CQVNFX1EgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIEFWX1RJTUVfQkFTRX0KKworLyoqCisgKiBAfQorICogQH0KKyAqIEBkZWZncm91cCBsYXZ1X3BpY3R1cmUgSW1hZ2UgcmVsYXRlZAorICoKKyAqIEFWUGljdHVyZSB0eXBlcywgcGl4ZWwgZm9ybWF0cyBhbmQgYmFzaWMgaW1hZ2UgcGxhbmVzIG1hbmlwdWxhdGlvbi4KKyAqCisgKiBAeworICovCisKK2VudW0gQVZQaWN0dXJlVHlwZSB7CisgICAgQVZfUElDVFVSRV9UWVBFX05PTkUgPSAwLCAvLy88IFVuZGVmaW5lZAorICAgIEFWX1BJQ1RVUkVfVFlQRV9JLCAgICAgLy8vPCBJbnRyYQorICAgIEFWX1BJQ1RVUkVfVFlQRV9QLCAgICAgLy8vPCBQcmVkaWN0ZWQKKyAgICBBVl9QSUNUVVJFX1RZUEVfQiwgICAgIC8vLzwgQmktZGlyIHByZWRpY3RlZAorICAgIEFWX1BJQ1RVUkVfVFlQRV9TLCAgICAgLy8vPCBTKEdNQyktVk9QIE1QRUc0CisgICAgQVZfUElDVFVSRV9UWVBFX1NJLCAgICAvLy88IFN3aXRjaGluZyBJbnRyYQorICAgIEFWX1BJQ1RVUkVfVFlQRV9TUCwgICAgLy8vPCBTd2l0Y2hpbmcgUHJlZGljdGVkCisgICAgQVZfUElDVFVSRV9UWVBFX0JJLCAgICAvLy88IEJJIHR5cGUKK307CisKKy8qKgorICogUmV0dXJuIGEgc2luZ2xlIGxldHRlciB0byBkZXNjcmliZSB0aGUgZ2l2ZW4gcGljdHVyZSB0eXBlCisgKiBwaWN0X3R5cGUuCisgKgorICogQHBhcmFtW2luXSBwaWN0X3R5cGUgdGhlIHBpY3R1cmUgdHlwZSBAcmV0dXJuIGEgc2luZ2xlIGNoYXJhY3RlcgorICogcmVwcmVzZW50aW5nIHRoZSBwaWN0dXJlIHR5cGUsICc/JyBpZiBwaWN0X3R5cGUgaXMgdW5rbm93bgorICovCitjaGFyIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihlbnVtIEFWUGljdHVyZVR5cGUgcGljdF90eXBlKTsKKworLyoqCisgKiBAfQorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInJhdGlvbmFsLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgIm1hY3Jvcy5oIgorI2luY2x1ZGUgIm1hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAicGl4Zm10LmgiCisKKy8qKgorICogUmV0dXJuIHggZGVmYXVsdCBwb2ludGVyIGluIGNhc2UgcCBpcyBOVUxMLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmF2X3hfaWZfbnVsbChjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICp4KQoreworICAgIHJldHVybiAodm9pZCAqKShpbnRwdHJfdCkocCA/IHAgOiB4KTsKK30KKworLyoqCisgKiBDb21wdXRlIHRoZSBsZW5ndGggb2YgYW4gaW50ZWdlciBsaXN0LgorICoKKyAqIEBwYXJhbSBlbHNpemUgIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBsaXN0IGVsZW1lbnQgKG9ubHkgMSwgMiwgNCBvciA4KQorICogQHBhcmFtIHRlcm0gICAgbGlzdCB0ZXJtaW5hdG9yICh1c3VhbGx5IDAgb3IgLTEpCisgKiBAcGFyYW0gbGlzdCAgICBwb2ludGVyIHRvIHRoZSBsaXN0CisgKiBAcmV0dXJuICBsZW5ndGggb2YgdGhlIGxpc3QsIGluIGVsZW1lbnRzLCBub3QgY291bnRpbmcgdGhlIHRlcm1pbmF0b3IKKyAqLwordW5zaWduZWQgYXZfaW50X2xpc3RfbGVuZ3RoX2Zvcl9zaXplKHVuc2lnbmVkIGVsc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpsaXN0LCB1aW50NjRfdCB0ZXJtKSBhdl9wdXJlOworCisvKioKKyAqIENvbXB1dGUgdGhlIGxlbmd0aCBvZiBhbiBpbnRlZ2VyIGxpc3QuCisgKgorICogQHBhcmFtIHRlcm0gIGxpc3QgdGVybWluYXRvciAodXN1YWxseSAwIG9yIC0xKQorICogQHBhcmFtIGxpc3QgIHBvaW50ZXIgdG8gdGhlIGxpc3QKKyAqIEByZXR1cm4gIGxlbmd0aCBvZiB0aGUgbGlzdCwgaW4gZWxlbWVudHMsIG5vdCBjb3VudGluZyB0aGUgdGVybWluYXRvcgorICovCisjZGVmaW5lIGF2X2ludF9saXN0X2xlbmd0aChsaXN0LCB0ZXJtKSBcCisgICAgYXZfaW50X2xpc3RfbGVuZ3RoX2Zvcl9zaXplKHNpemVvZigqKGxpc3QpKSwgbGlzdCwgdGVybSkKKworLyoqCisgKiBPcGVuIGEgZmlsZSB1c2luZyBhIFVURi04IGZpbGVuYW1lLgorICogVGhlIEFQSSBvZiB0aGlzIGZ1bmN0aW9uIG1hdGNoZXMgUE9TSVggZm9wZW4oKSwgZXJyb3JzIGFyZSByZXR1cm5lZCB0aHJvdWdoCisgKiBlcnJuby4KKyAqLworRklMRSAqYXZfZm9wZW5fdXRmOChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGZyYWN0aW9uYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludGVybmFsIHRpbWUgYmFzZS4KKyAqLworQVZSYXRpb25hbCBhdl9nZXRfdGltZV9iYXNlX3Eodm9pZCk7CisKKy8qKgorICogQH0KKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9BVlVUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9hdnV0aWxyZXMucmMgYi9mZm1wZWcvbGliYXZ1dGlsL2F2dXRpbHJlcy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE3NWViCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9hdnV0aWxyZXMucmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIFdpbmRvd3MgcmVzb3VyY2UgZmlsZSBmb3IgbGliYXZ1dGlsCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEphbWVzIEFsbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGlhbmNoZW5nICJUaW1vdGh5IiBHdQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC92ZXJzaW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZmdmVyc2lvbi5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisxIFZFUlNJT05JTkZPCitGSUxFVkVSU0lPTiAgICAgTElCQVZVVElMX1ZFUlNJT05fTUFKT1IsIExJQkFWVVRJTF9WRVJTSU9OX01JTk9SLCBMSUJBVlVUSUxfVkVSU0lPTl9NSUNSTywgMAorUFJPRFVDVFZFUlNJT04gIExJQkFWVVRJTF9WRVJTSU9OX01BSk9SLCBMSUJBVlVUSUxfVkVSU0lPTl9NSU5PUiwgTElCQVZVVElMX1ZFUlNJT05fTUlDUk8sIDAKK0ZJTEVGTEFHU01BU0sgICBWU19GRklfRklMRUZMQUdTTUFTSworRklMRU9TICAgICAgICAgIFZPU19OVF9XSU5ET1dTMzIKK0ZJTEVUWVBFICAgICAgICBWRlRfRExMCit7CisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIHsKKyAgICAgICAgQkxPQ0sgIjA0MDkwNEIwIgorICAgICAgICB7CisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAgICAgICJGRm1wZWcgUHJvamVjdCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAgIkZGbXBlZyB1dGlsaXR5IGxpYnJhcnkiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAgICAgIEFWX1NUUklOR0lGWShMSUJBVlVUSUxfVkVSU0lPTikKKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAgICAgImxpYmF2dXRpbCIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICAgIkNvcHlyaWdodCAoQykgMjAwMC0iIEFWX1NUUklOR0lGWShDT05GSUdfVEhJU19ZRUFSKSAiIEZGbXBlZyBQcm9qZWN0IgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAiYXZ1dGlsIiBCVUlMRFNVRiAiLSIgQVZfU1RSSU5HSUZZKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SKSBTTElCU1VGCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAgICAgICJGRm1wZWciCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAgIEZGTVBFR19WRVJTSU9OCisgICAgICAgIH0KKyAgICB9CisKKyAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgeworICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDA0MDksIDB4MDRCMAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYmFzZTY0LmMgYi9mZm1wZWcvbGliYXZ1dGlsL2Jhc2U2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZWJjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2Jhc2U2NC5jCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFJ5YW4gTWFydGVsbC4gKHJkbTRAbWFydGVsbHZlbnR1cmVzLmNvbSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIEJhc2U2NCBlbmNvZGUvZGVjb2RlCisgKiBAYXV0aG9yIFJ5YW4gTWFydGVsbCA8cmRtNEBtYXJ0ZWxsdmVudHVyZXMuY29tPiAod2l0aCBsb3RzIG9mIE1pY2hhZWwpCisgKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImJhc2U2NC5oIgorI2luY2x1ZGUgImludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgInRpbWVyLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0gcHJpdmF0ZSBjb2RlICovCitzdGF0aWMgY29uc3QgdWludDhfdCBtYXAyWzI1Nl0gPQoreworICAgIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLAorCisgICAgMHgzZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHgzZiwgMHgzNCwgMHgzNSwgMHgzNiwKKyAgICAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDEsCisgICAgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwKKyAgICAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLAorICAgIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgxYSwgMHgxYiwKKyAgICAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLCAweDIzLAorICAgIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsCisgICAgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywKKworICAgICAgICAgICAgICAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKK307CisKKyNkZWZpbmUgQkFTRTY0X0RFQ19TVEVQKGkpIGRvIHsgXAorICAgIGJpdHMgPSBtYXAyW2luW2ldXTsgXAorICAgIGlmIChiaXRzICYgMHg4MCkgXAorICAgICAgICBnb3RvIG91dCAjIyBpOyBcCisgICAgdiA9IGkgPyAodiA8PCA2KSArIGJpdHMgOiBiaXRzOyBcCit9IHdoaWxlKDApCisKK2ludCBhdl9iYXNlNjRfZGVjb2RlKHVpbnQ4X3QgKm91dCwgY29uc3QgY2hhciAqaW5fc3RyLCBpbnQgb3V0X3NpemUpCit7CisgICAgdWludDhfdCAqZHN0ID0gb3V0OworICAgIHVpbnQ4X3QgKmVuZCA9IG91dCArIG91dF9zaXplOworICAgIC8vIG5vIHNpZ24gZXh0ZW5zaW9uCisgICAgY29uc3QgdWludDhfdCAqaW4gPSBpbl9zdHI7CisgICAgdW5zaWduZWQgYml0cyA9IDB4ZmY7CisgICAgdW5zaWduZWQgdjsKKworICAgIHdoaWxlIChlbmQgLSBkc3QgPiAzKSB7CisgICAgICAgIEJBU0U2NF9ERUNfU1RFUCgwKTsKKyAgICAgICAgQkFTRTY0X0RFQ19TVEVQKDEpOworICAgICAgICBCQVNFNjRfREVDX1NURVAoMik7CisgICAgICAgIEJBU0U2NF9ERUNfU1RFUCgzKTsKKyAgICAgICAgLy8gVXNpbmcgQVZfV0IzMiBkaXJlY3RseSBjb25mdXNlcyBjb21waWxlcgorICAgICAgICB2ID0gYXZfYmUybmUzMih2IDw8IDgpOworICAgICAgICBBVl9XTjMyKGRzdCwgdik7CisgICAgICAgIGRzdCArPSAzOworICAgICAgICBpbiArPSA0OworICAgIH0KKyAgICBpZiAoZW5kIC0gZHN0KSB7CisgICAgICAgIEJBU0U2NF9ERUNfU1RFUCgwKTsKKyAgICAgICAgQkFTRTY0X0RFQ19TVEVQKDEpOworICAgICAgICBCQVNFNjRfREVDX1NURVAoMik7CisgICAgICAgIEJBU0U2NF9ERUNfU1RFUCgzKTsKKyAgICAgICAgKmRzdCsrID0gdiA+PiAxNjsKKyAgICAgICAgaWYgKGVuZCAtIGRzdCkKKyAgICAgICAgICAgICpkc3QrKyA9IHYgPj4gODsKKyAgICAgICAgaWYgKGVuZCAtIGRzdCkKKyAgICAgICAgICAgICpkc3QrKyA9IHY7CisgICAgICAgIGluICs9IDQ7CisgICAgfQorICAgIHdoaWxlICgxKSB7CisgICAgICAgIEJBU0U2NF9ERUNfU1RFUCgwKTsKKyAgICAgICAgaW4rKzsKKyAgICAgICAgQkFTRTY0X0RFQ19TVEVQKDApOworICAgICAgICBpbisrOworICAgICAgICBCQVNFNjRfREVDX1NURVAoMCk7CisgICAgICAgIGluKys7CisgICAgICAgIEJBU0U2NF9ERUNfU1RFUCgwKTsKKyAgICAgICAgaW4rKzsKKyAgICB9CisKK291dDM6CisgICAgKmRzdCsrID0gdiA+PiAxMDsKKyAgICB2IDw8PSAyOworb3V0MjoKKyAgICAqZHN0KysgPSB2ID4+IDQ7CitvdXQxOgorb3V0MDoKKyAgICByZXR1cm4gYml0cyAmIDEgPyBBVkVSUk9SX0lOVkFMSUREQVRBIDogZHN0IC0gb3V0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogYjY0X2VuY29kZTogU3RvbGVuIGZyb20gVkxDJ3MgaHR0cC5jLgorKiBTaW1wbGlmaWVkIGJ5IE1pY2hhZWwuCisqIEZpeGVkIGVkZ2UgY2FzZXMgYW5kIG1hZGUgaXQgd29yayBmcm9tIGRhdGEgKHZzLiBzdHJpbmdzKSBieSBSeWFuLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NoYXIgKmF2X2Jhc2U2NF9lbmNvZGUoY2hhciAqb3V0LCBpbnQgb3V0X3NpemUsIGNvbnN0IHVpbnQ4X3QgKmluLCBpbnQgaW5fc2l6ZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciBiNjRbXSA9CisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKyAgICBjaGFyICpyZXQsICpkc3Q7CisgICAgdW5zaWduZWQgaV9iaXRzID0gMDsKKyAgICBpbnQgaV9zaGlmdCA9IDA7CisgICAgaW50IGJ5dGVzX3JlbWFpbmluZyA9IGluX3NpemU7CisKKyAgICBpZiAoaW5fc2l6ZSA+PSBVSU5UX01BWCAvIDQgfHwKKyAgICAgICAgb3V0X3NpemUgPCBBVl9CQVNFNjRfU0laRShpbl9zaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0ID0gZHN0ID0gb3V0OworICAgIHdoaWxlIChieXRlc19yZW1haW5pbmcgPiAzKSB7CisgICAgICAgIGlfYml0cyA9IEFWX1JCMzIoaW4pOworICAgICAgICBpbiArPSAzOyBieXRlc19yZW1haW5pbmcgLT0gMzsKKyAgICAgICAgKmRzdCsrID0gYjY0WyBpX2JpdHM+PjI2ICAgICAgICBdOworICAgICAgICAqZHN0KysgPSBiNjRbKGlfYml0cz4+MjApICYgMHgzRl07CisgICAgICAgICpkc3QrKyA9IGI2NFsoaV9iaXRzPj4xNCkgJiAweDNGXTsKKyAgICAgICAgKmRzdCsrID0gYjY0WyhpX2JpdHM+PjggKSAmIDB4M0ZdOworICAgIH0KKyAgICBpX2JpdHMgPSAwOworICAgIHdoaWxlIChieXRlc19yZW1haW5pbmcpIHsKKyAgICAgICAgaV9iaXRzID0gKGlfYml0cyA8PCA4KSArICppbisrOworICAgICAgICBieXRlc19yZW1haW5pbmctLTsKKyAgICAgICAgaV9zaGlmdCArPSA4OworICAgIH0KKyAgICB3aGlsZSAoaV9zaGlmdCA+IDApIHsKKyAgICAgICAgKmRzdCsrID0gYjY0WyhpX2JpdHMgPDwgNiA+PiBpX3NoaWZ0KSAmIDB4M2ZdOworICAgICAgICBpX3NoaWZ0IC09IDY7CisgICAgfQorICAgIHdoaWxlICgoZHN0IC0gcmV0KSAmIDMpCisgICAgICAgICpkc3QrKyA9ICc9JzsKKyAgICAqZHN0ID0gJ1wwJzsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBURVNUCisvLyBMQ09WX0VYQ0xfU1RBUlQKKworI2RlZmluZSBNQVhfREFUQV9TSVpFICAgIDEwMjQKKyNkZWZpbmUgTUFYX0VOQ09ERURfU0laRSAyMDQ4CisKK3N0YXRpYyBpbnQgdGVzdF9lbmNvZGVfZGVjb2RlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGVkX3JlZikKK3sKKyAgICBjaGFyICBlbmNvZGVkW01BWF9FTkNPREVEX1NJWkVdOworICAgIHVpbnQ4X3QgZGF0YTJbTUFYX0RBVEFfU0laRV07CisgICAgaW50IGRhdGEyX3NpemUsIG1heF9kYXRhMl9zaXplID0gTUFYX0RBVEFfU0laRTsKKworICAgIGlmICghYXZfYmFzZTY0X2VuY29kZShlbmNvZGVkLCBNQVhfRU5DT0RFRF9TSVpFLCBkYXRhLCBkYXRhX3NpemUpKSB7CisgICAgICAgIHByaW50ZigiRmFpbGVkOiBjYW5ub3QgZW5jb2RlIHRoZSBpbnB1dCBkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChlbmNvZGVkX3JlZiAmJiBzdHJjbXAoZW5jb2RlZCwgZW5jb2RlZF9yZWYpKSB7CisgICAgICAgIHByaW50ZigiRmFpbGVkOiBlbmNvZGVkIHN0cmluZyBkaWZmZXJzIGZyb20gcmVmZXJlbmNlXG4iCisgICAgICAgICAgICAgICAiRW5jb2RlZDpcbiVzXG5SZWZlcmVuY2U6XG4lc1xuIiwgZW5jb2RlZCwgZW5jb2RlZF9yZWYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoKGRhdGEyX3NpemUgPSBhdl9iYXNlNjRfZGVjb2RlKGRhdGEyLCBlbmNvZGVkLCBtYXhfZGF0YTJfc2l6ZSkpICE9IGRhdGFfc2l6ZSkgeworICAgICAgICBwcmludGYoIkZhaWxlZDogY2Fubm90IGRlY29kZSB0aGUgZW5jb2RlZCBzdHJpbmdcbiIKKyAgICAgICAgICAgICAgICJFbmNvZGVkOlxuJXNcbiIsIGVuY29kZWQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKChkYXRhMl9zaXplID0gYXZfYmFzZTY0X2RlY29kZShkYXRhMiwgZW5jb2RlZCwgZGF0YV9zaXplKSkgIT0gZGF0YV9zaXplKSB7CisgICAgICAgIHByaW50ZigiRmFpbGVkOiBjYW5ub3QgZGVjb2RlIHdpdGggbWluaW1hbCBidWZmZXJcbiIKKyAgICAgICAgICAgICAgICJFbmNvZGVkOlxuJXNcbiIsIGVuY29kZWQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKG1lbWNtcChkYXRhMiwgZGF0YSwgZGF0YV9zaXplKSkgeworICAgICAgICBwcmludGYoIkZhaWxlZDogZW5jb2RlZC9kZWNvZGVkIGRhdGEgZGlmZmVycyBmcm9tIG9yaWdpbmFsIGRhdGFcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGF2X2Jhc2U2NF9kZWNvZGUoTlVMTCwgZW5jb2RlZCwgMCkgIT0gMCkgeworICAgICAgICBwcmludGYoIkZhaWxlZDogZGVjb2RlIHRvIE5VTEwgYnVmZmVyXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChzdHJsZW4oZW5jb2RlZCkpIHsKKyAgICAgICAgY2hhciAqZW5kID0gc3RyY2hyKGVuY29kZWQsICc9Jyk7CisgICAgICAgIGlmICghZW5kKQorICAgICAgICAgICAgZW5kID0gZW5jb2RlZCArIHN0cmxlbihlbmNvZGVkKSAtIDE7CisgICAgICAgICplbmQgPSAnJSc7CisgICAgICAgIGlmIChhdl9iYXNlNjRfZGVjb2RlKE5VTEwsIGVuY29kZWQsIDApID49IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiRmFpbGVkOiBlcnJvciBkZXRlY3Rpb25cbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcmludGYoIlBhc3NlZCFcbiIpOworICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQoreworICAgIGludCBpLCBlcnJvcl9jb3VudCA9IDA7CisgICAgc3RydWN0IHRlc3QgeworICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhOworICAgICAgICBjb25zdCBjaGFyICplbmNvZGVkX3JlZjsKKyAgICB9IHRlc3RzW10gPSB7CisgICAgICAgIHsgIiIsICAgICAgICAiIn0sCisgICAgICAgIHsgIjEiLCAgICAgICAiTVE9PSJ9LAorICAgICAgICB7ICIyMiIsICAgICAgIk1qST0ifSwKKyAgICAgICAgeyAiMzMzIiwgICAgICJNek16In0sCisgICAgICAgIHsgIjQ0NDQiLCAgICAiTkRRME5BPT0ifSwKKyAgICAgICAgeyAiNTU1NTUiLCAgICJOVFUxTlRVPSJ9LAorICAgICAgICB7ICI2NjY2NjYiLCAgIk5qWTJOalkyIn0sCisgICAgICAgIHsgImFiYzpkZWYiLCAiWVdKak9tUmxaZz09In0sCisgICAgfTsKKyAgICBjaGFyIGluWzEwMjRdLCBvdXRbMjA0OF07CisKKyAgICBwcmludGYoIkVuY29kaW5nL2RlY29kaW5nIHRlc3RzXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVModGVzdHMpOyBpKyspCisgICAgICAgIGVycm9yX2NvdW50ICs9IHRlc3RfZW5jb2RlX2RlY29kZSh0ZXN0c1tpXS5kYXRhLCBzdHJsZW4odGVzdHNbaV0uZGF0YSksIHRlc3RzW2ldLmVuY29kZWRfcmVmKTsKKworICAgIGlmIChhcmdjPjEgJiYgIXN0cmNtcChhcmd2WzFdLCAiLXQiKSkgeworICAgICAgICBtZW1zZXQoaW4sIDEyMywgc2l6ZW9mKGluKSk7CisgICAgICAgIGZvcihpPTA7IGk8MTAwMDA7IGkrKyl7CisgICAgICAgICAgICBTVEFSVF9USU1FUgorICAgICAgICAgICAgYXZfYmFzZTY0X2VuY29kZShvdXQsIHNpemVvZihvdXQpLCBpbiwgc2l6ZW9mKGluKSk7CisgICAgICAgICAgICBTVE9QX1RJTUVSKCJlbmNvZGUiKQorICAgICAgICB9CisgICAgICAgIGZvcihpPTA7IGk8MTAwMDA7IGkrKyl7CisgICAgICAgICAgICBTVEFSVF9USU1FUgorICAgICAgICAgICAgYXZfYmFzZTY0X2RlY29kZShpbiwgb3V0LCBzaXplb2YoaW4pKTsKKyAgICAgICAgICAgIFNUT1BfVElNRVIoImRlY29kZSIpCisgICAgICAgIH0KKworICAgICAgICBmb3IoaT0wOyBpPDEwMDAwOyBpKyspeworICAgICAgICAgICAgU1RBUlRfVElNRVIKKyAgICAgICAgICAgIGF2X2Jhc2U2NF9kZWNvZGUoTlVMTCwgb3V0LCAwKTsKKyAgICAgICAgICAgIFNUT1BfVElNRVIoInN5bnRheCBjaGVjayIpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyb3JfY291bnQpCisgICAgICAgIHByaW50ZigiRXJyb3IgQ291bnQ6ICVkLlxuIiwgZXJyb3JfY291bnQpOworCisgICAgcmV0dXJuICEhZXJyb3JfY291bnQ7Cit9CisKKy8vIExDT1ZfRVhDTF9TVE9QCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYmFzZTY0LmggYi9mZm1wZWcvbGliYXZ1dGlsL2Jhc2U2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDQ5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2Jhc2U2NC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUnlhbiBNYXJ0ZWxsLiAocmRtNEBtYXJ0ZWxsdmVudHVyZXMuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9CQVNFNjRfSAorI2RlZmluZSBBVlVUSUxfQkFTRTY0X0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIEBkZWZncm91cCBsYXZ1X2Jhc2U2NCBCYXNlNjQKKyAqIEBpbmdyb3VwIGxhdnVfY3J5cHRvCisgKiBAeworICovCisKKworLyoqCisgKiBEZWNvZGUgYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcuCisgKgorICogQHBhcmFtIG91dCAgICAgIGJ1ZmZlciBmb3IgZGVjb2RlZCBkYXRhCisgKiBAcGFyYW0gaW4gICAgICAgbnVsbC10ZXJtaW5hdGVkIGlucHV0IHN0cmluZworICogQHBhcmFtIG91dF9zaXplIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG91dCBidWZmZXIsIG11c3QgYmUgYXQKKyAqICAgICAgICAgICAgICAgICBsZWFzdCAzLzQgb2YgdGhlIGxlbmd0aCBvZiBpbgorICogQHJldHVybiAgICAgICAgIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvciBhIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YKKyAqICAgICAgICAgICAgICAgICBpbnZhbGlkIGlucHV0CisgKi8KK2ludCBhdl9iYXNlNjRfZGVjb2RlKHVpbnQ4X3QgKm91dCwgY29uc3QgY2hhciAqaW4sIGludCBvdXRfc2l6ZSk7CisKKy8qKgorICogRW5jb2RlIGRhdGEgdG8gYmFzZTY0IGFuZCBudWxsLXRlcm1pbmF0ZS4KKyAqCisgKiBAcGFyYW0gb3V0ICAgICAgYnVmZmVyIGZvciBlbmNvZGVkIGRhdGEKKyAqIEBwYXJhbSBvdXRfc2l6ZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBvdXQgYnVmZmVyIChpbmNsdWRpbmcgdGhlCisgKiAgICAgICAgICAgICAgICAgbnVsbCB0ZXJtaW5hdG9yKSwgbXVzdCBiZSBhdCBsZWFzdCBBVl9CQVNFNjRfU0laRShpbl9zaXplKQorICogQHBhcmFtIGluICAgICAgIGlucHV0IGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIGVuY29kZQorICogQHBhcmFtIGluX3NpemUgIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGluIGJ1ZmZlcgorICogQHJldHVybiAgICAgICAgIG91dCBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IKKyAqLworY2hhciAqYXZfYmFzZTY0X2VuY29kZShjaGFyICpvdXQsIGludCBvdXRfc2l6ZSwgY29uc3QgdWludDhfdCAqaW4sIGludCBpbl9zaXplKTsKKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIG91dHB1dCBzaXplIG5lZWRlZCB0byBiYXNlNjQtZW5jb2RlIHggYnl0ZXMgdG8gYQorICogbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAqLworI2RlZmluZSBBVl9CQVNFNjRfU0laRSh4KSAgKCgoeCkrMikgLyAzICogNCArIDEpCisKKyAvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogQVZVVElMX0JBU0U2NF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2JmaW4vYnN3YXAuaCBiL2ZmbXBlZy9saWJhdnV0aWwvYmZpbi9ic3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2M2VkNDAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2JmaW4vYnN3YXAuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1hcmMgSG9mZm1hbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBieXRlIHN3YXBwaW5nIHJvdXRpbmVzCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQkZJTl9CU1dBUF9ICisjZGVmaW5lIEFWVVRJTF9CRklOX0JTV0FQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisKKyNkZWZpbmUgYXZfYnN3YXAzMiBhdl9ic3dhcDMyCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCB1aW50MzJfdCBhdl9ic3dhcDMyKHVpbnQzMl90IHgpCit7CisgICAgdW5zaWduZWQgdG1wOworICAgIF9fYXNtX18oIiUxID0gJTAgPj4gOCAoVik7ICAgICAgXG5cdCIKKyAgICAgICAgICAgICIlMCA9ICUwIDw8IDggKFYpOyAgICAgIFxuXHQiCisgICAgICAgICAgICAiJTAgPSAlMCB8ICUxOyAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIiUwID0gUEFDSyglMC5MLCAlMC5IKTsgXG5cdCIKKyAgICAgICAgICAgIDogIitkIih4KSwgIj0mZCIodG1wKSk7CisgICAgcmV0dXJuIHg7Cit9CisKKyNlbmRpZiAvKiBBVlVUSUxfQkZJTl9CU1dBUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2JmaW4vdGltZXIuaCBiL2ZmbXBlZy9saWJhdnV0aWwvYmZpbi90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDU3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2JmaW4vdGltZXIuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1hcmMgSG9mZm1hbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9CRklOX1RJTUVSX0gKKyNkZWZpbmUgQVZVVElMX0JGSU5fVElNRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgQVZfUkVBRF9USU1FIHJlYWRfdGltZQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IHJlYWRfdGltZSh2b2lkKQoreworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvOworICAgICAgICAgICAgdW5zaWduZWQgaGk7CisgICAgICAgIH0gcDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGM7CisgICAgfSB0OworICAgIF9fYXNtX18gdm9sYXRpbGUgKCIlMD1jeWNsZXM7ICUxPWN5Y2xlczI7IiA6ICI9ZCIgKHQucC5sbyksICI9ZCIgKHQucC5oaSkpOworICAgIHJldHVybiB0LmM7Cit9CisKKyNlbmRpZiAvKiBBVlVUSUxfQkZJTl9USU1FUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2Jsb3dmaXNoLmMgYi9mZm1wZWcvbGliYXZ1dGlsL2Jsb3dmaXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyMTQyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYmxvd2Zpc2guYwpAQCAtMCwwICsxLDU4OCBAQAorLyoKKyAqIEJsb3dmaXNoIGFsZ29yaXRobQorICogQ29weXJpZ2h0IChjKSAyMDEyIFNhbXVlbCBQaXRvaXNldAorICoKKyAqIGxvb3NlbHkgYmFzZWQgb24gUGF1bCBLb2NoZXIncyBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZ1dGlsLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYmxvd2Zpc2guaCIKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IG9yaWdfcFtBVl9CRl9ST1VORFMgKyAyXSA9IHsKKyAgICAweDI0M0Y2QTg4LCAweDg1QTMwOEQzLCAweDEzMTk4QTJFLCAweDAzNzA3MzQ0LAorICAgIDB4QTQwOTM4MjIsIDB4Mjk5RjMxRDAsIDB4MDgyRUZBOTgsIDB4RUM0RTZDODksCisgICAgMHg0NTI4MjFFNiwgMHgzOEQwMTM3NywgMHhCRTU0NjZDRiwgMHgzNEU5MEM2QywKKyAgICAweEMwQUMyOUI3LCAweEM5N0M1MERELCAweDNGODRENUI1LCAweEI1NDcwOTE3LAorICAgIDB4OTIxNkQ1RDksIDB4ODk3OUZCMUIKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBvcmlnX3NbNF1bMjU2XSA9IHsKKyAgICB7IDB4RDEzMTBCQTYsIDB4OThERkI1QUMsIDB4MkZGRDcyREIsIDB4RDAxQURGQjcsCisgICAgICAweEI4RTFBRkVELCAweDZBMjY3RTk2LCAweEJBN0M5MDQ1LCAweEYxMkM3Rjk5LAorICAgICAgMHgyNEExOTk0NywgMHhCMzkxNkNGNywgMHgwODAxRjJFMiwgMHg4NThFRkMxNiwKKyAgICAgIDB4NjM2OTIwRDgsIDB4NzE1NzRFNjksIDB4QTQ1OEZFQTMsIDB4RjQ5MzNEN0UsCisgICAgICAweDBEOTU3NDhGLCAweDcyOEVCNjU4LCAweDcxOEJDRDU4LCAweDgyMTU0QUVFLAorICAgICAgMHg3QjU0QTQxRCwgMHhDMjVBNTlCNSwgMHg5QzMwRDUzOSwgMHgyQUYyNjAxMywKKyAgICAgIDB4QzVEMUIwMjMsIDB4Mjg2MDg1RjAsIDB4Q0E0MTc5MTgsIDB4QjhEQjM4RUYsCisgICAgICAweDhFNzlEQ0IwLCAweDYwM0ExODBFLCAweDZDOUUwRThCLCAweEIwMUU4QTNFLAorICAgICAgMHhENzE1NzdDMSwgMHhCRDMxNEIyNywgMHg3OEFGMkZEQSwgMHg1NTYwNUM2MCwKKyAgICAgIDB4RTY1NTI1RjMsIDB4QUE1NUFCOTQsIDB4NTc0ODk4NjIsIDB4NjNFODE0NDAsCisgICAgICAweDU1Q0EzOTZBLCAweDJBQUIxMEI2LCAweEI0Q0M1QzM0LCAweDExNDFFOENFLAorICAgICAgMHhBMTU0ODZBRiwgMHg3QzcyRTk5MywgMHhCM0VFMTQxMSwgMHg2MzZGQkMyQSwKKyAgICAgIDB4MkJBOUM1NUQsIDB4NzQxODMxRjYsIDB4Q0U1QzNFMTYsIDB4OUI4NzkzMUUsCisgICAgICAweEFGRDZCQTMzLCAweDZDMjRDRjVDLCAweDdBMzI1MzgxLCAweDI4OTU4Njc3LAorICAgICAgMHgzQjhGNDg5OCwgMHg2QjRCQjlBRiwgMHhDNEJGRTgxQiwgMHg2NjI4MjE5MywKKyAgICAgIDB4NjFEODA5Q0MsIDB4RkIyMUE5OTEsIDB4NDg3Q0FDNjAsIDB4NURFQzgwMzIsCisgICAgICAweEVGODQ1RDVELCAweEU5ODU3NUIxLCAweERDMjYyMzAyLCAweEVCNjUxQjg4LAorICAgICAgMHgyMzg5M0U4MSwgMHhEMzk2QUNDNSwgMHgwRjZENkZGMywgMHg4M0Y0NDIzOSwKKyAgICAgIDB4MkUwQjQ0ODIsIDB4QTQ4NDIwMDQsIDB4NjlDOEYwNEEsIDB4OUUxRjlCNUUsCisgICAgICAweDIxQzY2ODQyLCAweEY2RTk2QzlBLCAweDY3MEM5QzYxLCAweEFCRDM4OEYwLAorICAgICAgMHg2QTUxQTBEMiwgMHhEODU0MkY2OCwgMHg5NjBGQTcyOCwgMHhBQjUxMzNBMywKKyAgICAgIDB4NkVFRjBCNkMsIDB4MTM3QTNCRTQsIDB4QkEzQkYwNTAsIDB4N0VGQjJBOTgsCisgICAgICAweEExRjE2NTFELCAweDM5QUYwMTc2LCAweDY2Q0E1OTNFLCAweDgyNDMwRTg4LAorICAgICAgMHg4Q0VFODYxOSwgMHg0NTZGOUZCNCwgMHg3RDg0QTVDMywgMHgzQjhCNUVCRSwKKyAgICAgIDB4RTA2Rjc1RDgsIDB4ODVDMTIwNzMsIDB4NDAxQTQ0OUYsIDB4NTZDMTZBQTYsCisgICAgICAweDRFRDNBQTYyLCAweDM2M0Y3NzA2LCAweDFCRkVERjcyLCAweDQyOUIwMjNELAorICAgICAgMHgzN0QwRDcyNCwgMHhEMDBBMTI0OCwgMHhEQjBGRUFEMywgMHg0OUYxQzA5QiwKKyAgICAgIDB4MDc1MzcyQzksIDB4ODA5OTFCN0IsIDB4MjVENDc5RDgsIDB4RjZFOERFRjcsCisgICAgICAweEUzRkU1MDFBLCAweEI2Nzk0QzNCLCAweDk3NkNFMEJELCAweDA0QzAwNkJBLAorICAgICAgMHhDMUE5NEZCNiwgMHg0MDlGNjBDNCwgMHg1RTVDOUVDMiwgMHgxOTZBMjQ2MywKKyAgICAgIDB4NjhGQjZGQUYsIDB4M0U2QzUzQjUsIDB4MTMzOUIyRUIsIDB4M0I1MkVDNkYsCisgICAgICAweDZERkM1MTFGLCAweDlCMzA5NTJDLCAweENDODE0NTQ0LCAweEFGNUVCRDA5LAorICAgICAgMHhCRUUzRDAwNCwgMHhERTMzNEFGRCwgMHg2NjBGMjgwNywgMHgxOTJFNEJCMywKKyAgICAgIDB4QzBDQkE4NTcsIDB4NDVDODc0MEYsIDB4RDIwQjVGMzksIDB4QjlEM0ZCREIsCisgICAgICAweDU1NzlDMEJELCAweDFBNjAzMjBBLCAweEQ2QTEwMEM2LCAweDQwMkM3Mjc5LAorICAgICAgMHg2NzlGMjVGRSwgMHhGQjFGQTNDQywgMHg4RUE1RTlGOCwgMHhEQjMyMjJGOCwKKyAgICAgIDB4M0M3NTE2REYsIDB4RkQ2MTZCMTUsIDB4MkY1MDFFQzgsIDB4QUQwNTUyQUIsCisgICAgICAweDMyM0RCNUZBLCAweEZEMjM4NzYwLCAweDUzMzE3QjQ4LCAweDNFMDBERjgyLAorICAgICAgMHg5RTVDNTdCQiwgMHhDQTZGOENBMCwgMHgxQTg3NTYyRSwgMHhERjE3NjlEQiwKKyAgICAgIDB4RDU0MkE4RjYsIDB4Mjg3RUZGQzMsIDB4QUM2NzMyQzYsIDB4OEM0RjU1NzMsCisgICAgICAweDY5NUIyN0IwLCAweEJCQ0E1OEM4LCAweEUxRkZBMzVELCAweEI4RjAxMUEwLAorICAgICAgMHgxMEZBM0Q5OCwgMHhGRDIxODNCOCwgMHg0QUZDQjU2QywgMHgyREQxRDM1QiwKKyAgICAgIDB4OUE1M0U0NzksIDB4QjZGODQ1NjUsIDB4RDI4RTQ5QkMsIDB4NEJGQjk3OTAsCisgICAgICAweEUxRERGMkRBLCAweEE0Q0I3RTMzLCAweDYyRkIxMzQxLCAweENFRTRDNkU4LAorICAgICAgMHhFRjIwQ0FEQSwgMHgzNjc3NEMwMSwgMHhEMDdFOUVGRSwgMHgyQkYxMUZCNCwKKyAgICAgIDB4OTVEQkRBNEQsIDB4QUU5MDkxOTgsIDB4RUFBRDhFNzEsIDB4NkI5M0Q1QTAsCisgICAgICAweEQwOEVEMUQwLCAweEFGQzcyNUUwLCAweDhFM0M1QjJGLCAweDhFNzU5NEI3LAorICAgICAgMHg4RkY2RTJGQiwgMHhGMjEyMkI2NCwgMHg4ODg4QjgxMiwgMHg5MDBERjAxQywKKyAgICAgIDB4NEZBRDVFQTAsIDB4Njg4RkMzMUMsIDB4RDFDRkYxOTEsIDB4QjNBOEMxQUQsCisgICAgICAweDJGMkYyMjE4LCAweEJFMEUxNzc3LCAweEVBNzUyREZFLCAweDhCMDIxRkExLAorICAgICAgMHhFNUEwQ0MwRiwgMHhCNTZGNzRFOCwgMHgxOEFDRjNENiwgMHhDRTg5RTI5OSwKKyAgICAgIDB4QjRBODRGRTAsIDB4RkQxM0UwQjcsIDB4N0NDNDNCODEsIDB4RDJBREE4RDksCisgICAgICAweDE2NUZBMjY2LCAweDgwOTU3NzA1LCAweDkzQ0M3MzE0LCAweDIxMUExNDc3LAorICAgICAgMHhFNkFEMjA2NSwgMHg3N0I1RkE4NiwgMHhDNzU0NDJGNSwgMHhGQjlEMzVDRiwKKyAgICAgIDB4RUJDREFGMEMsIDB4N0IzRTg5QTAsIDB4RDY0MTFCRDMsIDB4QUUxRTdFNDksCisgICAgICAweDAwMjUwRTJELCAweDIwNzFCMzVFLCAweDIyNjgwMEJCLCAweDU3QjhFMEFGLAorICAgICAgMHgyNDY0MzY5QiwgMHhGMDA5QjkxRSwgMHg1NTYzOTExRCwgMHg1OURGQTZBQSwKKyAgICAgIDB4NzhDMTQzODksIDB4RDk1QTUzN0YsIDB4MjA3RDVCQTIsIDB4MDJFNUI5QzUsCisgICAgICAweDgzMjYwMzc2LCAweDYyOTVDRkE5LCAweDExQzgxOTY4LCAweDRFNzM0QTQxLAorICAgICAgMHhCMzQ3MkRDQSwgMHg3QjE0QTk0QSwgMHgxQjUxMDA1MiwgMHg5QTUzMjkxNSwKKyAgICAgIDB4RDYwRjU3M0YsIDB4QkM5QkM2RTQsIDB4MkI2MEE0NzYsIDB4ODFFNjc0MDAsCisgICAgICAweDA4QkE2RkI1LCAweDU3MUJFOTFGLCAweEYyOTZFQzZCLCAweDJBMEREOTE1LAorICAgICAgMHhCNjYzNjUyMSwgMHhFN0I5RjlCNiwgMHhGRjM0MDUyRSwgMHhDNTg1NTY2NCwKKyAgICAgIDB4NTNCMDJENUQsIDB4QTk5RjhGQTEsIDB4MDhCQTQ3OTksIDB4NkU4NTA3NkEgfSwKKyAgICB7IDB4NEI3QTcwRTksIDB4QjVCMzI5NDQsIDB4REI3NTA5MkUsIDB4QzQxOTI2MjMsCisgICAgICAweEFENkVBNkIwLCAweDQ5QTdERjdELCAweDlDRUU2MEI4LCAweDhGRURCMjY2LAorICAgICAgMHhFQ0FBOEM3MSwgMHg2OTlBMTdGRiwgMHg1NjY0NTI2QywgMHhDMkIxOUVFMSwKKyAgICAgIDB4MTkzNjAyQTUsIDB4NzUwOTRDMjksIDB4QTA1OTEzNDAsIDB4RTQxODNBM0UsCisgICAgICAweDNGNTQ5ODlBLCAweDVCNDI5RDY1LCAweDZCOEZFNEQ2LCAweDk5RjczRkQ2LAorICAgICAgMHhBMUQyOUMwNywgMHhFRkU4MzBGNSwgMHg0RDJEMzhFNiwgMHhGMDI1NURDMSwKKyAgICAgIDB4NENERDIwODYsIDB4ODQ3MEVCMjYsIDB4NjM4MkU5QzYsIDB4MDIxRUNDNUUsCisgICAgICAweDA5Njg2QjNGLCAweDNFQkFFRkM5LCAweDNDOTcxODE0LCAweDZCNkE3MEExLAorICAgICAgMHg2ODdGMzU4NCwgMHg1MkEwRTI4NiwgMHhCNzlDNTMwNSwgMHhBQTUwMDczNywKKyAgICAgIDB4M0UwNzg0MUMsIDB4N0ZERUFFNUMsIDB4OEU3RDQ0RUMsIDB4NTcxNkYyQjgsCisgICAgICAweEIwM0FEQTM3LCAweEYwNTAwQzBELCAweEYwMUMxRjA0LCAweDAyMDBCM0ZGLAorICAgICAgMHhBRTBDRjUxQSwgMHgzQ0I1NzRCMiwgMHgyNTgzN0E1OCwgMHhEQzA5MjFCRCwKKyAgICAgIDB4RDE5MTEzRjksIDB4N0NBOTJGRjYsIDB4OTQzMjQ3NzMsIDB4MjJGNTQ3MDEsCisgICAgICAweDNBRTVFNTgxLCAweDM3QzJEQURDLCAweEM4QjU3NjM0LCAweDlBRjNEREE3LAorICAgICAgMHhBOTQ0NjE0NiwgMHgwRkQwMDMwRSwgMHhFQ0M4QzczRSwgMHhBNDc1MUU0MSwKKyAgICAgIDB4RTIzOENEOTksIDB4M0JFQTBFMkYsIDB4MzI4MEJCQTEsIDB4MTgzRUIzMzEsCisgICAgICAweDRFNTQ4QjM4LCAweDRGNkRCOTA4LCAweDZGNDIwRDAzLCAweEY2MEEwNEJGLAorICAgICAgMHgyQ0I4MTI5MCwgMHgyNDk3N0M3OSwgMHg1Njc5QjA3MiwgMHhCQ0FGODlBRiwKKyAgICAgIDB4REU5QTc3MUYsIDB4RDk5MzA4MTAsIDB4QjM4QkFFMTIsIDB4RENDRjNGMkUsCisgICAgICAweDU1MTI3MjFGLCAweDJFNkI3MTI0LCAweDUwMUFEREU2LCAweDlGODRDRDg3LAorICAgICAgMHg3QTU4NDcxOCwgMHg3NDA4REExNywgMHhCQzlGOUFCQywgMHhFOTRCN0Q4QywKKyAgICAgIDB4RUM3QUVDM0EsIDB4REI4NTFERkEsIDB4NjMwOTQzNjYsIDB4QzQ2NEMzRDIsCisgICAgICAweEVGMUMxODQ3LCAweDMyMTVEOTA4LCAweERENDMzQjM3LCAweDI0QzJCQTE2LAorICAgICAgMHgxMkExNEQ0MywgMHgyQTY1QzQ1MSwgMHg1MDk0MDAwMiwgMHgxMzNBRTRERCwKKyAgICAgIDB4NzFERkY4OUUsIDB4MTAzMTRFNTUsIDB4ODFBQzc3RDYsIDB4NUYxMTE5OUIsCisgICAgICAweDA0MzU1NkYxLCAweEQ3QTNDNzZCLCAweDNDMTExODNCLCAweDU5MjRBNTA5LAorICAgICAgMHhGMjhGRTZFRCwgMHg5N0YxRkJGQSwgMHg5RUJBQkYyQywgMHgxRTE1M0M2RSwKKyAgICAgIDB4ODZFMzQ1NzAsIDB4RUFFOTZGQjEsIDB4ODYwRTVFMEEsIDB4NUEzRTJBQjMsCisgICAgICAweDc3MUZFNzFDLCAweDRFM0QwNkZBLCAweDI5NjVEQ0I5LCAweDk5RTcxRDBGLAorICAgICAgMHg4MDNFODlENiwgMHg1MjY2QzgyNSwgMHgyRTRDQzk3OCwgMHg5QzEwQjM2QSwKKyAgICAgIDB4QzYxNTBFQkEsIDB4OTRFMkVBNzgsIDB4QTVGQzNDNTMsIDB4MUUwQTJERjQsCisgICAgICAweEYyRjc0RUE3LCAweDM2MUQyQjNELCAweDE5MzkyNjBGLCAweDE5QzI3OTYwLAorICAgICAgMHg1MjIzQTcwOCwgMHhGNzEzMTJCNiwgMHhFQkFERkU2RSwgMHhFQUMzMUY2NiwKKyAgICAgIDB4RTNCQzQ1OTUsIDB4QTY3QkM4ODMsIDB4QjE3RjM3RDEsIDB4MDE4Q0ZGMjgsCisgICAgICAweEMzMzJEREVGLCAweEJFNkM1QUE1LCAweDY1NTgyMTg1LCAweDY4QUI5ODAyLAorICAgICAgMHhFRUNFQTUwRiwgMHhEQjJGOTUzQiwgMHgyQUVGN0RBRCwgMHg1QjZFMkY4NCwKKyAgICAgIDB4MTUyMUI2MjgsIDB4MjkwNzYxNzAsIDB4RUNERDQ3NzUsIDB4NjE5RjE1MTAsCisgICAgICAweDEzQ0NBODMwLCAweEVCNjFCRDk2LCAweDAzMzRGRTFFLCAweEFBMDM2M0NGLAorICAgICAgMHhCNTczNUM5MCwgMHg0QzcwQTIzOSwgMHhENTlFOUUwQiwgMHhDQkFBREUxNCwKKyAgICAgIDB4RUVDQzg2QkMsIDB4NjA2MjJDQTcsIDB4OUNBQjVDQUIsIDB4QjJGMzg0NkUsCisgICAgICAweDY0OEIxRUFGLCAweDE5QkRGMENBLCAweEEwMjM2OUI5LCAweDY1NUFCQjUwLAorICAgICAgMHg0MDY4NUEzMiwgMHgzQzJBQjRCMywgMHgzMTlFRTlENSwgMHhDMDIxQjhGNywKKyAgICAgIDB4OUI1NDBCMTksIDB4ODc1RkEwOTksIDB4OTVGNzk5N0UsIDB4NjIzRDdEQTgsCisgICAgICAweEY4Mzc4ODlBLCAweDk3RTMyRDc3LCAweDExRUQ5MzVGLCAweDE2NjgxMjgxLAorICAgICAgMHgwRTM1ODgyOSwgMHhDN0U2MUZENiwgMHg5NkRFREZBMSwgMHg3ODU4QkE5OSwKKyAgICAgIDB4NTdGNTg0QTUsIDB4MUIyMjcyNjMsIDB4OUI4M0MzRkYsIDB4MUFDMjQ2OTYsCisgICAgICAweENEQjMwQUVCLCAweDUzMkUzMDU0LCAweDhGRDk0OEU0LCAweDZEQkMzMTI4LAorICAgICAgMHg1OEVCRjJFRiwgMHgzNEM2RkZFQSwgMHhGRTI4RUQ2MSwgMHhFRTdDM0M3MywKKyAgICAgIDB4NUQ0QTE0RDksIDB4RTg2NEI3RTMsIDB4NDIxMDVEMTQsIDB4MjAzRTEzRTAsCisgICAgICAweDQ1RUVFMkI2LCAweEEzQUFBQkVBLCAweERCNkM0RjE1LCAweEZBQ0I0RkQwLAorICAgICAgMHhDNzQyRjQ0MiwgMHhFRjZBQkJCNSwgMHg2NTRGM0IxRCwgMHg0MUNEMjEwNSwKKyAgICAgIDB4RDgxRTc5OUUsIDB4ODY4NTREQzcsIDB4RTQ0QjQ3NkEsIDB4M0Q4MTYyNTAsCisgICAgICAweENGNjJBMUYyLCAweDVCOEQyNjQ2LCAweEZDODg4M0EwLCAweEMxQzdCNkEzLAorICAgICAgMHg3RjE1MjRDMywgMHg2OUNCNzQ5MiwgMHg0Nzg0OEEwQiwgMHg1NjkyQjI4NSwKKyAgICAgIDB4MDk1QkJGMDAsIDB4QUQxOTQ4OUQsIDB4MTQ2MkIxNzQsIDB4MjM4MjBFMDAsCisgICAgICAweDU4NDI4RDJBLCAweDBDNTVGNUVBLCAweDFEQURGNDNFLCAweDIzM0Y3MDYxLAorICAgICAgMHgzMzcyRjA5MiwgMHg4RDkzN0U0MSwgMHhENjVGRUNGMSwgMHg2QzIyM0JEQiwKKyAgICAgIDB4N0NERTM3NTksIDB4Q0JFRTc0NjAsIDB4NDA4NUYyQTcsIDB4Q0U3NzMyNkUsCisgICAgICAweEE2MDc4MDg0LCAweDE5Rjg1MDlFLCAweEU4RUZEODU1LCAweDYxRDk5NzM1LAorICAgICAgMHhBOTY5QTdBQSwgMHhDNTBDMDZDMiwgMHg1QTA0QUJGQywgMHg4MDBCQ0FEQywKKyAgICAgIDB4OUU0NDdBMkUsIDB4QzM0NTM0ODQsIDB4RkRENTY3MDUsIDB4MEUxRTlFQzksCisgICAgICAweERCNzNEQkQzLCAweDEwNTU4OENELCAweDY3NUZEQTc5LCAweEUzNjc0MzQwLAorICAgICAgMHhDNUM0MzQ2NSwgMHg3MTNFMzhEOCwgMHgzRDI4Rjg5RSwgMHhGMTZERkYyMCwKKyAgICAgIDB4MTUzRTIxRTcsIDB4OEZCMDNENEEsIDB4RTZFMzlGMkIsIDB4REI4M0FERjcgfSwKKyAgICB7IDB4RTkzRDVBNjgsIDB4OTQ4MTQwRjcsIDB4RjY0QzI2MUMsIDB4OTQ2OTI5MzQsCisgICAgICAweDQxMTUyMEY3LCAweDc2MDJENEY3LCAweEJDRjQ2QjJFLCAweEQ0QTIwMDY4LAorICAgICAgMHhENDA4MjQ3MSwgMHgzMzIwRjQ2QSwgMHg0M0I3RDRCNywgMHg1MDAwNjFBRiwKKyAgICAgIDB4MUUzOUY2MkUsIDB4OTcyNDQ1NDYsIDB4MTQyMTRGNzQsIDB4QkY4Qjg4NDAsCisgICAgICAweDREOTVGQzFELCAweDk2QjU5MUFGLCAweDcwRjREREQzLCAweDY2QTAyRjQ1LAorICAgICAgMHhCRkJDMDlFQywgMHgwM0JEOTc4NSwgMHg3RkFDNkREMCwgMHgzMUNCODUwNCwKKyAgICAgIDB4OTZFQjI3QjMsIDB4NTVGRDM5NDEsIDB4REEyNTQ3RTYsIDB4QUJDQTBBOUEsCisgICAgICAweDI4NTA3ODI1LCAweDUzMDQyOUY0LCAweDBBMkM4NkRBLCAweEU5QjY2REZCLAorICAgICAgMHg2OERDMTQ2MiwgMHhENzQ4NjkwMCwgMHg2ODBFQzBBNCwgMHgyN0ExOERFRSwKKyAgICAgIDB4NEYzRkZFQTIsIDB4RTg4N0FEOEMsIDB4QjU4Q0UwMDYsIDB4N0FGNEQ2QjYsCisgICAgICAweEFBQ0UxRTdDLCAweEQzMzc1RkVDLCAweENFNzhBMzk5LCAweDQwNkIyQTQyLAorICAgICAgMHgyMEZFOUUzNSwgMHhEOUYzODVCOSwgMHhFRTM5RDdBQiwgMHgzQjEyNEU4QiwKKyAgICAgIDB4MURDOUZBRjcsIDB4NEI2RDE4NTYsIDB4MjZBMzY2MzEsIDB4RUFFMzk3QjIsCisgICAgICAweDNBNkVGQTc0LCAweERENUI0MzMyLCAweDY4NDFFN0Y3LCAweENBNzgyMEZCLAorICAgICAgMHhGQjBBRjU0RSwgMHhEOEZFQjM5NywgMHg0NTQwNTZBQywgMHhCQTQ4OTUyNywKKyAgICAgIDB4NTU1MzNBM0EsIDB4MjA4MzhEODcsIDB4RkU2QkE5QjcsIDB4RDA5Njk1NEIsCisgICAgICAweDU1QTg2N0JDLCAweEExMTU5QTU4LCAweENDQTkyOTYzLCAweDk5RTFEQjMzLAorICAgICAgMHhBNjJBNEE1NiwgMHgzRjMxMjVGOSwgMHg1RUY0N0UxQywgMHg5MDI5MzE3QywKKyAgICAgIDB4RkRGOEU4MDIsIDB4MDQyNzJGNzAsIDB4ODBCQjE1NUMsIDB4MDUyODJDRTMsCisgICAgICAweDk1QzExNTQ4LCAweEU0QzY2RDIyLCAweDQ4QzExMzNGLCAweEM3MEY4NkRDLAorICAgICAgMHgwN0Y5QzlFRSwgMHg0MTA0MUYwRiwgMHg0MDQ3NzlBNCwgMHg1RDg4NkUxNywKKyAgICAgIDB4MzI1RjUxRUIsIDB4RDU5QkMwRDEsIDB4RjJCQ0MxOEYsIDB4NDExMTM1NjQsCisgICAgICAweDI1N0I3ODM0LCAweDYwMkE5QzYwLCAweERGRjhFOEEzLCAweDFGNjM2QzFCLAorICAgICAgMHgwRTEyQjRDMiwgMHgwMkUxMzI5RSwgMHhBRjY2NEZEMSwgMHhDQUQxODExNSwKKyAgICAgIDB4NkIyMzk1RTAsIDB4MzMzRTkyRTEsIDB4M0IyNDBCNjIsIDB4RUVCRUI5MjIsCisgICAgICAweDg1QjJBMjBFLCAweEU2QkEwRDk5LCAweERFNzIwQzhDLCAweDJEQTJGNzI4LAorICAgICAgMHhEMDEyNzg0NSwgMHg5NUI3OTRGRCwgMHg2NDdEMDg2MiwgMHhFN0NDRjVGMCwKKyAgICAgIDB4NTQ0OUEzNkYsIDB4ODc3RDQ4RkEsIDB4QzM5REZEMjcsIDB4RjMzRThEMUUsCisgICAgICAweDBBNDc2MzQxLCAweDk5MkVGRjc0LCAweDNBNkY2RUFCLCAweEY0RjhGRDM3LAorICAgICAgMHhBODEyREM2MCwgMHhBMUVCRERGOCwgMHg5OTFCRTE0QywgMHhEQjZFNkIwRCwKKyAgICAgIDB4QzY3QjU1MTAsIDB4NkQ2NzJDMzcsIDB4Mjc2NUQ0M0IsIDB4RENEMEU4MDQsCisgICAgICAweEYxMjkwREM3LCAweENDMDBGRkEzLCAweEI1MzkwRjkyLCAweDY5MEZFRDBCLAorICAgICAgMHg2NjdCOUZGQiwgMHhDRURCN0Q5QywgMHhBMDkxQ0YwQiwgMHhEOTE1NUVBMywKKyAgICAgIDB4QkIxMzJGODgsIDB4NTE1QkFEMjQsIDB4N0I5NDc5QkYsIDB4NzYzQkQ2RUIsCisgICAgICAweDM3MzkyRUIzLCAweENDMTE1OTc5LCAweDgwMjZFMjk3LCAweEY0MkUzMTJELAorICAgICAgMHg2ODQyQURBNywgMHhDNjZBMkIzQiwgMHgxMjc1NENDQywgMHg3ODJFRjExQywKKyAgICAgIDB4NkExMjQyMzcsIDB4Qjc5MjUxRTcsIDB4MDZBMUJCRTYsIDB4NEJGQjYzNTAsCisgICAgICAweDFBNkIxMDE4LCAweDExQ0FFREZBLCAweDNEMjVCREQ4LCAweEUyRTFDM0M5LAorICAgICAgMHg0NDQyMTY1OSwgMHgwQTEyMTM4NiwgMHhEOTBDRUM2RSwgMHhENUFCRUEyQSwKKyAgICAgIDB4NjRBRjY3NEUsIDB4REE4NkE4NUYsIDB4QkVCRkU5ODgsIDB4NjRFNEMzRkUsCisgICAgICAweDlEQkM4MDU3LCAweEYwRjdDMDg2LCAweDYwNzg3QkY4LCAweDYwMDM2MDRELAorICAgICAgMHhEMUZEODM0NiwgMHhGNjM4MUZCMCwgMHg3NzQ1QUUwNCwgMHhENzM2RkNDQywKKyAgICAgIDB4ODM0MjZCMzMsIDB4RjAxRUFCNzEsIDB4QjA4MDQxODcsIDB4M0MwMDVFNUYsCisgICAgICAweDc3QTA1N0JFLCAweEJERThBRTI0LCAweDU1NDY0Mjk5LCAweEJGNTgyRTYxLAorICAgICAgMHg0RTU4RjQ4RiwgMHhGMkRERkRBMiwgMHhGNDc0RUYzOCwgMHg4Nzg5QkRDMiwKKyAgICAgIDB4NTM2NkY5QzMsIDB4QzhCMzhFNzQsIDB4QjQ3NUYyNTUsIDB4NDZGQ0Q5QjksCisgICAgICAweDdBRUIyNjYxLCAweDhCMURERjg0LCAweDg0NkEwRTc5LCAweDkxNUY5NUUyLAorICAgICAgMHg0NjZFNTk4RSwgMHgyMEI0NTc3MCwgMHg4Q0Q1NTU5MSwgMHhDOTAyREU0QywKKyAgICAgIDB4QjkwQkFDRTEsIDB4QkI4MjA1RDAsIDB4MTFBODYyNDgsIDB4NzU3NEE5OUUsCisgICAgICAweEI3N0YxOUI2LCAweEUwQTlEQzA5LCAweDY2MkQwOUExLCAweEM0MzI0NjMzLAorICAgICAgMHhFODVBMUYwMiwgMHgwOUYwQkU4QywgMHg0QTk5QTAyNSwgMHgxRDZFRkUxMCwKKyAgICAgIDB4MUFCOTNEMUQsIDB4MEJBNUE0REYsIDB4QTE4NkYyMEYsIDB4Mjg2OEYxNjksCisgICAgICAweERDQjdEQTgzLCAweDU3MzkwNkZFLCAweEExRTJDRTlCLCAweDRGQ0Q3RjUyLAorICAgICAgMHg1MDExNUUwMSwgMHhBNzA2ODNGQSwgMHhBMDAyQjVDNCwgMHgwREU2RDAyNywKKyAgICAgIDB4OUFGODhDMjcsIDB4NzczRjg2NDEsIDB4QzM2MDRDMDYsIDB4NjFBODA2QjUsCisgICAgICAweEYwMTc3QTI4LCAweEMwRjU4NkUwLCAweDAwNjA1OEFBLCAweDMwREM3RDYyLAorICAgICAgMHgxMUU2OUVENywgMHgyMzM4RUE2MywgMHg1M0MyREQ5NCwgMHhDMkMyMTYzNCwKKyAgICAgIDB4QkJDQkVFNTYsIDB4OTBCQ0I2REUsIDB4RUJGQzdEQTEsIDB4Q0U1OTFENzYsCisgICAgICAweDZGMDVFNDA5LCAweDRCN0MwMTg4LCAweDM5NzIwQTNELCAweDdDOTI3QzI0LAorICAgICAgMHg4NkUzNzI1RiwgMHg3MjREOURCOSwgMHgxQUMxNUJCNCwgMHhEMzlFQjhGQywKKyAgICAgIDB4RUQ1NDU1NzgsIDB4MDhGQ0E1QjUsIDB4RDgzRDdDRDMsIDB4NERBRDBGQzQsCisgICAgICAweDFFNTBFRjVFLCAweEIxNjFFNkY4LCAweEEyODUxNEQ5LCAweDZDNTExMzNDLAorICAgICAgMHg2RkQ1QzdFNywgMHg1NkUxNEVDNCwgMHgzNjJBQkZDRSwgMHhEREM2QzgzNywKKyAgICAgIDB4RDc5QTMyMzQsIDB4OTI2MzgyMTIsIDB4NjcwRUZBOEUsIDB4NDA2MDAwRTAgfSwKKyAgICB7IDB4M0EzOUNFMzcsIDB4RDNGQUY1Q0YsIDB4QUJDMjc3MzcsIDB4NUFDNTJEMUIsCisgICAgICAweDVDQjA2NzlFLCAweDRGQTMzNzQyLCAweEQzODIyNzQwLCAweDk5QkM5QkJFLAorICAgICAgMHhENTExOEU5RCwgMHhCRjBGNzMxNSwgMHhENjJEMUM3RSwgMHhDNzAwQzQ3QiwKKyAgICAgIDB4Qjc4QzFCNkIsIDB4MjFBMTkwNDUsIDB4QjI2RUIxQkUsIDB4NkEzNjZFQjQsCisgICAgICAweDU3NDhBQjJGLCAweEJDOTQ2RTc5LCAweEM2QTM3NkQyLCAweDY1NDlDMkM4LAorICAgICAgMHg1MzBGRjhFRSwgMHg0NjhEREU3RCwgMHhENTczMEExRCwgMHg0Q0QwNERDNiwKKyAgICAgIDB4MjkzOUJCREIsIDB4QTlCQTQ2NTAsIDB4QUM5NTI2RTgsIDB4QkU1RUUzMDQsCisgICAgICAweEExRkFENUYwLCAweDZBMkQ1MTlBLCAweDYzRUY4Q0UyLCAweDlBODZFRTIyLAorICAgICAgMHhDMDg5QzJCOCwgMHg0MzI0MkVGNiwgMHhBNTFFMDNBQSwgMHg5Q0YyRDBBNCwKKyAgICAgIDB4ODNDMDYxQkEsIDB4OUJFOTZBNEQsIDB4OEZFNTE1NTAsIDB4QkE2NDVCRDYsCisgICAgICAweDI4MjZBMkY5LCAweEE3M0EzQUUxLCAweDRCQTk5NTg2LCAweEVGNTU2MkU5LAorICAgICAgMHhDNzJGRUZEMywgMHhGNzUyRjdEQSwgMHgzRjA0NkY2OSwgMHg3N0ZBMEE1OSwKKyAgICAgIDB4ODBFNEE5MTUsIDB4ODdCMDg2MDEsIDB4OUIwOUU2QUQsIDB4M0IzRUU1OTMsCisgICAgICAweEU5OTBGRDVBLCAweDlFMzRENzk3LCAweDJDRjBCN0Q5LCAweDAyMkI4QjUxLAorICAgICAgMHg5NkQ1QUMzQSwgMHgwMTdEQTY3RCwgMHhEMUNGM0VENiwgMHg3QzdEMkQyOCwKKyAgICAgIDB4MUY5RjI1Q0YsIDB4QURGMkI4OUIsIDB4NUFENkI0NzIsIDB4NUE4OEY1NEMsCisgICAgICAweEUwMjlBQzcxLCAweEUwMTlBNUU2LCAweDQ3QjBBQ0ZELCAweEVEOTNGQTlCLAorICAgICAgMHhFOEQzQzQ4RCwgMHgyODNCNTdDQywgMHhGOEQ1NjYyOSwgMHg3OTEzMkUyOCwKKyAgICAgIDB4Nzg1RjAxOTEsIDB4RUQ3NTYwNTUsIDB4Rjc5NjBFNDQsIDB4RTNEMzVFOEMsCisgICAgICAweDE1MDU2REQ0LCAweDg4RjQ2REJBLCAweDAzQTE2MTI1LCAweDA1NjRGMEJELAorICAgICAgMHhDM0VCOUUxNSwgMHgzQzkwNTdBMiwgMHg5NzI3MUFFQywgMHhBOTNBMDcyQSwKKyAgICAgIDB4MUIzRjZEOUIsIDB4MUU2MzIxRjUsIDB4RjU5QzY2RkIsIDB4MjZEQ0YzMTksCisgICAgICAweDc1MzNEOTI4LCAweEIxNTVGREY1LCAweDAzNTYzNDgyLCAweDhBQkEzQ0JCLAorICAgICAgMHgyODUxNzcxMSwgMHhDMjBBRDlGOCwgMHhBQkNDNTE2NywgMHhDQ0FEOTI1RiwKKyAgICAgIDB4NERFODE3NTEsIDB4MzgzMERDOEUsIDB4Mzc5RDU4NjIsIDB4OTMyMEY5OTEsCisgICAgICAweEVBN0E5MEMyLCAweEZCM0U3QkNFLCAweDUxMjFDRTY0LCAweDc3NEZCRTMyLAorICAgICAgMHhBOEI2RTM3RSwgMHhDMzI5M0Q0NiwgMHg0OERFNTM2OSwgMHg2NDEzRTY4MCwKKyAgICAgIDB4QTJBRTA4MTAsIDB4REQ2REIyMjQsIDB4Njk4NTJERkQsIDB4MDkwNzIxNjYsCisgICAgICAweEIzOUE0NjBBLCAweDY0NDVDMERELCAweDU4NkNERUNGLCAweDFDMjBDOEFFLAorICAgICAgMHg1QkJFRjdERCwgMHgxQjU4OEQ0MCwgMHhDQ0QyMDE3RiwgMHg2QkI0RTNCQiwKKyAgICAgIDB4RERBMjZBN0UsIDB4M0E1OUZGNDUsIDB4M0UzNTBBNDQsIDB4QkNCNENERDUsCisgICAgICAweDcyRUFDRUE4LCAweEZBNjQ4NEJCLCAweDhENjYxMkFFLCAweEJGM0M2RjQ3LAorICAgICAgMHhEMjlCRTQ2MywgMHg1NDJGNUQ5RSwgMHhBRUMyNzcxQiwgMHhGNjRFNjM3MCwKKyAgICAgIDB4NzQwRTBEOEQsIDB4RTc1QjEzNTcsIDB4Rjg3MjE2NzEsIDB4QUY1MzdENUQsCisgICAgICAweDQwNDBDQjA4LCAweDRFQjRFMkNDLCAweDM0RDI0NjZBLCAweDAxMTVBRjg0LAorICAgICAgMHhFMUIwMDQyOCwgMHg5NTk4M0ExRCwgMHgwNkI4OUZCNCwgMHhDRTZFQTA0OCwKKyAgICAgIDB4NkYzRjNCODIsIDB4MzUyMEFCODIsIDB4MDExQTFENEIsIDB4Mjc3MjI3RjgsCisgICAgICAweDYxMTU2MEIxLCAweEU3OTMzRkRDLCAweEJCM0E3OTJCLCAweDM0NDUyNUJELAorICAgICAgMHhBMDg4MzlFMSwgMHg1MUNFNzk0QiwgMHgyRjMyQzlCNywgMHhBMDFGQkFDOSwKKyAgICAgIDB4RTAxQ0M4N0UsIDB4QkNDN0QxRjYsIDB4Q0YwMTExQzMsIDB4QTFFOEFBQzcsCisgICAgICAweDFBOTA4NzQ5LCAweEQ0NEZCRDlBLCAweEQwREFERUNCLCAweEQ1MEFEQTM4LAorICAgICAgMHgwMzM5QzMyQSwgMHhDNjkxMzY2NywgMHg4REY5MzE3QywgMHhFMEIxMkI0RiwKKyAgICAgIDB4Rjc5RTU5QjcsIDB4NDNGNUJCM0EsIDB4RjJENTE5RkYsIDB4MjdEOTQ1OUMsCisgICAgICAweEJGOTcyMjJDLCAweDE1RTZGQzJBLCAweDBGOTFGQzcxLCAweDlCOTQxNTI1LAorICAgICAgMHhGQUU1OTM2MSwgMHhDRUI2OUNFQiwgMHhDMkE4NjQ1OSwgMHgxMkJBQThEMSwKKyAgICAgIDB4QjZDMTA3NUUsIDB4RTMwNTZBMEMsIDB4MTBEMjUwNjUsIDB4Q0IwM0E0NDIsCisgICAgICAweEUwRUM2RTBFLCAweDE2OThEQjNCLCAweDRDOThBMEJFLCAweDMyNzhFOTY0LAorICAgICAgMHg5RjFGOTUzMiwgMHhFMEQzOTJERiwgMHhEM0EwMzQyQiwgMHg4OTcxRjIxRSwKKyAgICAgIDB4MUIwQTc0NDEsIDB4NEJBMzM0OEMsIDB4QzVCRTcxMjAsIDB4QzM3NjMyRDgsCisgICAgICAweERGMzU5RjhELCAweDlCOTkyRjJFLCAweEU2MEI2RjQ3LCAweDBGRTNGMTFELAorICAgICAgMHhFNTRDREE1NCwgMHgxRURBRDg5MSwgMHhDRTYyNzlDRiwgMHhDRDNFN0U2RiwKKyAgICAgIDB4MTYxOEIxNjYsIDB4RkQyQzFEMDUsIDB4ODQ4RkQyQzUsIDB4RjZGQjIyOTksCisgICAgICAweEY1MjNGMzU3LCAweEE2MzI3NjIzLCAweDkzQTgzNTMxLCAweDU2Q0NDRDAyLAorICAgICAgMHhBQ0YwODE2MiwgMHg1QTc1RUJCNSwgMHg2RTE2MzY5NywgMHg4OEQyNzNDQywKKyAgICAgIDB4REU5NjYyOTIsIDB4ODFCOTQ5RDAsIDB4NEM1MDkwMUIsIDB4NzFDNjU2MTQsCisgICAgICAweEU2QzZDN0JELCAweDMyN0ExNDBBLCAweDQ1RTFEMDA2LCAweEMzRjI3QjlBLAorICAgICAgMHhDOUFBNTNGRCwgMHg2MkE4MEYwMCwgMHhCQjI1QkZFMiwgMHgzNUJERDJGNiwKKyAgICAgIDB4NzExMjY5MDUsIDB4QjIwNDAyMjIsIDB4QjZDQkNGN0MsIDB4Q0Q3NjlDMkIsCisgICAgICAweDUzMTEzRUMwLCAweDE2NDBFM0QzLCAweDM4QUJCRDYwLCAweDI1NDdBREYwLAorICAgICAgMHhCQTM4MjA5QywgMHhGNzQ2Q0U3NiwgMHg3N0FGQTFDNSwgMHgyMDc1NjA2MCwKKyAgICAgIDB4ODVDQkZFNEUsIDB4OEFFODhERDgsIDB4N0FBQUY5QjAsIDB4NENGOUFBN0UsCisgICAgICAweDE5NDhDMjVDLCAweDAyRkI4QThDLCAweDAxQzM2QUU0LCAweEQ2RUJFMUY5LAorICAgICAgMHg5MEQ0Rjg2OSwgMHhBNjVDREVBMCwgMHgzRjA5MjUyRCwgMHhDMjA4RTY5RiwKKyAgICAgIDB4Qjc0RTYxMzIsIDB4Q0U3N0UyNUIsIDB4NTc4RkRGRTMsIDB4M0FDMzcyRTYgfQorfTsKKworI2RlZmluZSBGKFhsLCBYciwgUCkgXAorICAgIFhyIF49KCgoIGN0eC0+c1swXVsgWGwgPj4gMjQgICAgICAgIF0gXAorICAgICAgICAgICArIGN0eC0+c1sxXVsoWGwgPj4gMTYpICYgMHhGRl0pXAorICAgICAgICAgICBeIGN0eC0+c1syXVsoWGwgPj4gIDgpICYgMHhGRl0pXAorICAgICAgICAgICArIGN0eC0+c1szXVsgWGwgICAgICAgICYgMHhGRl0pXAorICAgICAgICAgICBeIFA7CisKK2F2X2NvbGQgdm9pZCBhdl9ibG93ZmlzaF9pbml0KEFWQmxvd2Zpc2ggKmN0eCwgY29uc3QgdWludDhfdCAqa2V5LCBpbnQga2V5X2xlbikKK3sKKyAgICB1aW50MzJfdCBkYXRhLCBkYXRhX2wsIGRhdGFfcjsKKyAgICBpbnQgaSwgaiwgazsKKworICAgIG1lbWNweShjdHgtPnMsIG9yaWdfcywgc2l6ZW9mKG9yaWdfcykpOworCisgICAgaiA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IEFWX0JGX1JPVU5EUyArIDI7ICsraSkgeworICAgICAgICBkYXRhID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgZGF0YSA9IChkYXRhIDw8IDgpIHwga2V5W2pdOworICAgICAgICAgICAgaWYgKCsraiA+PSBrZXlfbGVuKQorICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgICAgIGN0eC0+cFtpXSA9IG9yaWdfcFtpXSBeIGRhdGE7CisgICAgfQorCisgICAgZGF0YV9sID0gZGF0YV9yID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBVl9CRl9ST1VORFMgKyAyOyBpICs9IDIpIHsKKyAgICAgICAgYXZfYmxvd2Zpc2hfY3J5cHRfZWNiKGN0eCwgJmRhdGFfbCwgJmRhdGFfciwgMCk7CisgICAgICAgIGN0eC0+cFtpXSAgICAgPSBkYXRhX2w7CisgICAgICAgIGN0eC0+cFtpICsgMV0gPSBkYXRhX3I7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqICs9IDIpIHsKKyAgICAgICAgICAgIGF2X2Jsb3dmaXNoX2NyeXB0X2VjYihjdHgsICZkYXRhX2wsICZkYXRhX3IsIDApOworICAgICAgICAgICAgY3R4LT5zW2ldW2pdICAgICA9IGRhdGFfbDsKKyAgICAgICAgICAgIGN0eC0+c1tpXVtqICsgMV0gPSBkYXRhX3I7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgYXZfYmxvd2Zpc2hfY3J5cHRfZWNiKEFWQmxvd2Zpc2ggKmN0eCwgdWludDMyX3QgKnhsLCB1aW50MzJfdCAqeHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdCkKK3sKKyAgICB1aW50MzJfdCBYbCwgWHI7CisgICAgaW50IGk7CisKKyAgICBYbCA9ICp4bDsKKyAgICBYciA9ICp4cjsKKworICAgIGlmIChkZWNyeXB0KSB7CisgICAgICAgIFhsIF49IGN0eC0+cFtBVl9CRl9ST1VORFMgKyAxXTsKKyAgICAgICAgZm9yIChpID0gQVZfQkZfUk9VTkRTOyBpID4gMDsgaS09MikgeworICAgICAgICAgICAgRihYbCwgWHIsIGN0eC0+cFtpICBdKTsKKyAgICAgICAgICAgIEYoWHIsIFhsLCBjdHgtPnBbaS0xXSk7CisgICAgICAgIH0KKworICAgICAgICBYciBePSBjdHgtPnBbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgWGwgXj0gY3R4LT5wWzBdOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgQVZfQkZfUk9VTkRTKzE7IGkrPTIpeworICAgICAgICAgICAgRihYbCwgWHIsIGN0eC0+cFtpICBdKTsKKyAgICAgICAgICAgIEYoWHIsIFhsLCBjdHgtPnBbaSsxXSk7CisgICAgICAgIH0KKworICAgICAgICBYciBePSBjdHgtPnBbQVZfQkZfUk9VTkRTICsgMV07CisgICAgfQorCisgICAgKnhsID0gWHI7CisgICAgKnhyID0gWGw7Cit9CisKK3ZvaWQgYXZfYmxvd2Zpc2hfY3J5cHQoQVZCbG93ZmlzaCAqY3R4LCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB1aW50OF90ICppdiwgaW50IGRlY3J5cHQpCit7CisgICAgdWludDMyX3QgdjAsIHYxOworICAgIGludCBpOworCisgICAgaWYgKGRlY3J5cHQpIHsKKyAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICAgIHYwID0gQVZfUkIzMihzcmMpOworICAgICAgICAgICAgdjEgPSBBVl9SQjMyKHNyYyArIDQpOworCisgICAgICAgICAgICBhdl9ibG93ZmlzaF9jcnlwdF9lY2IoY3R4LCAmdjAsICZ2MSwgZGVjcnlwdCk7CisKKyAgICAgICAgICAgIGlmIChpdikgeworICAgICAgICAgICAgICAgIHYwIF49IEFWX1JCMzIoaXYpOworICAgICAgICAgICAgICAgIHYxIF49IEFWX1JCMzIoaXYgKyA0KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoaXYsIHNyYywgOCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFWX1dCMzIoZHN0LCB2MCk7CisgICAgICAgICAgICBBVl9XQjMyKGRzdCArIDQsIHYxKTsKKworICAgICAgICAgICAgc3JjICAgKz0gODsKKyAgICAgICAgICAgIGRzdCAgICs9IDg7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICAgICAgaWYgKGl2KSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gc3JjW2ldIF4gaXZbaV07CisgICAgICAgICAgICAgICAgdjAgPSBBVl9SQjMyKGRzdCk7CisgICAgICAgICAgICAgICAgdjEgPSBBVl9SQjMyKGRzdCArIDQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2MCA9IEFWX1JCMzIoc3JjKTsKKyAgICAgICAgICAgICAgICB2MSA9IEFWX1JCMzIoc3JjICsgNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2Jsb3dmaXNoX2NyeXB0X2VjYihjdHgsICZ2MCwgJnYxLCBkZWNyeXB0KTsKKworICAgICAgICAgICAgQVZfV0IzMihkc3QsIHYwKTsKKyAgICAgICAgICAgIEFWX1dCMzIoZHN0ICsgNCwgdjEpOworCisgICAgICAgICAgICBpZiAoaXYpCisgICAgICAgICAgICAgICAgbWVtY3B5KGl2LCBkc3QsIDgpOworCisgICAgICAgICAgICBzcmMgICArPSA4OworICAgICAgICAgICAgZHN0ICAgKz0gODsKKyAgICAgICAgfQorICAgIH0KK30KKworI2lmZGVmIFRFU1QKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIE5VTV9WQVJJQUJMRV9LRVlfVEVTVFMgMzQKKworLyogcGxhaW50ZXh0IGJ5dGVzIC0tIGxlZnQgaGFsdmVzICovCitzdGF0aWMgY29uc3QgdWludDMyX3QgcGxhaW50ZXh0X2xbTlVNX1ZBUklBQkxFX0tFWV9URVNUU10gPSB7CisgICAgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRiwgMHgxMDAwMDAwMCwgMHgxMTExMTExMSwgMHgxMTExMTExMSwKKyAgICAweDAxMjM0NTY3LCAweDAwMDAwMDAwLCAweDAxMjM0NTY3LCAweDAxQTFENkQwLCAweDVDRDU0Q0E4LAorICAgIDB4MDI0OEQ0MzgsIDB4NTE0NTRCNTgsIDB4NDJGRDQ0MzAsIDB4MDU5QjVFMDgsIDB4MDc1NkQ4RTAsCisgICAgMHg3NjI1MTRCOCwgMHgzQkREMTE5MCwgMHgyNjk1NUY2OCwgMHgxNjRENUU0MCwgMHg2QjA1NkUxOCwKKyAgICAweDAwNEJENkVGLCAweDQ4MEQzOTAwLCAweDQzNzU0MEM4LCAweDA3MkQ0M0EwLCAweDAyRkU1NTc3LAorICAgIDB4MUQ5RDVDNTAsIDB4MzA1NTMyMjgsIDB4MDEyMzQ1NjcsIDB4MDEyMzQ1NjcsIDB4MDEyMzQ1NjcsCisgICAgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRgorfTsKKworLyogcGxhaW50ZXh0IGJ5dGVzIC0tIHJpZ2h0IGhhbHZlcyAqLworc3RhdGljIGNvbnN0IHVpbnQzMl90IHBsYWludGV4dF9yW05VTV9WQVJJQUJMRV9LRVlfVEVTVFNdID0geworICAgIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDEsIDB4MTExMTExMTEsIDB4MTExMTExMTEsCisgICAgMHg4OUFCQ0RFRiwgMHgwMDAwMDAwMCwgMHg4OUFCQ0RFRiwgMHgzOTc3Njc0MiwgMHgzREVGNTdEQSwKKyAgICAweDA2RjY3MTcyLCAweDJEREY0NDBBLCAweDU5NTc3RkEyLCAweDUxQ0YxNDNBLCAweDc3NDc2MUQyLAorICAgIDB4MjlCRjQ4NkEsIDB4NDkzNzI4MDIsIDB4MzVBRjYwOUEsIDB4NEYyNzUyMzIsIDB4NzU5RjVDQ0EsCisgICAgMHgwOTE3NjA2MiwgMHg2RUU3NjJGMiwgMHg2OThGM0NGQSwgMHg3NzA3NTI5MiwgMHg4MTE3RjEyQSwKKyAgICAweDE4RjcyOEMyLCAweDZENkYyOTVBLCAweDg5QUJDREVGLCAweDg5QUJDREVGLCAweDg5QUJDREVGLAorICAgIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYKK307CisKKy8qIGtleSBieXRlcyBmb3IgdmFyaWFibGUga2V5IHRlc3RzICovCitzdGF0aWMgY29uc3QgdWludDhfdCB2YXJpYWJsZV9rZXlbTlVNX1ZBUklBQkxFX0tFWV9URVNUU11bOF0gPSB7CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgeyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH0sCisgICAgeyAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgeyAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExIH0sCisgICAgeyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweEVGIH0sCisgICAgeyAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExIH0sCisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgeyAweEZFLCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwIH0sCisgICAgeyAweDdDLCAweEExLCAweDEwLCAweDQ1LCAweDRBLCAweDFBLCAweDZFLCAweDU3IH0sCisgICAgeyAweDAxLCAweDMxLCAweEQ5LCAweDYxLCAweDlELCAweEMxLCAweDM3LCAweDZFIH0sCisgICAgeyAweDA3LCAweEExLCAweDEzLCAweDNFLCAweDRBLCAweDBCLCAweDI2LCAweDg2IH0sCisgICAgeyAweDM4LCAweDQ5LCAweDY3LCAweDRDLCAweDI2LCAweDAyLCAweDMxLCAweDlFIH0sCisgICAgeyAweDA0LCAweEI5LCAweDE1LCAweEJBLCAweDQzLCAweEZFLCAweEI1LCAweEI2IH0sCisgICAgeyAweDAxLCAweDEzLCAweEI5LCAweDcwLCAweEZELCAweDM0LCAweEYyLCAweENFIH0sCisgICAgeyAweDAxLCAweDcwLCAweEYxLCAweDc1LCAweDQ2LCAweDhGLCAweEI1LCAweEU2IH0sCisgICAgeyAweDQzLCAweDI5LCAweDdGLCAweEFELCAweDM4LCAweEUzLCAweDczLCAweEZFIH0sCisgICAgeyAweDA3LCAweEE3LCAweDEzLCAweDcwLCAweDQ1LCAweERBLCAweDJBLCAweDE2IH0sCisgICAgeyAweDA0LCAweDY4LCAweDkxLCAweDA0LCAweEMyLCAweEZELCAweDNCLCAweDJGIH0sCisgICAgeyAweDM3LCAweEQwLCAweDZCLCAweEI1LCAweDE2LCAweENCLCAweDc1LCAweDQ2IH0sCisgICAgeyAweDFGLCAweDA4LCAweDI2LCAweDBELCAweDFBLCAweEMyLCAweDQ2LCAweDVFIH0sCisgICAgeyAweDU4LCAweDQwLCAweDIzLCAweDY0LCAweDFBLCAweEJBLCAweDYxLCAweDc2IH0sCisgICAgeyAweDAyLCAweDU4LCAweDE2LCAweDE2LCAweDQ2LCAweDI5LCAweEIwLCAweDA3IH0sCisgICAgeyAweDQ5LCAweDc5LCAweDNFLCAweEJDLCAweDc5LCAweEIzLCAweDI1LCAweDhGIH0sCisgICAgeyAweDRGLCAweEIwLCAweDVFLCAweDE1LCAweDE1LCAweEFCLCAweDczLCAweEE3IH0sCisgICAgeyAweDQ5LCAweEU5LCAweDVELCAweDZELCAweDRDLCAweEEyLCAweDI5LCAweEJGIH0sCisgICAgeyAweDAxLCAweDgzLCAweDEwLCAweERDLCAweDQwLCAweDlCLCAweDI2LCAweEQ2IH0sCisgICAgeyAweDFDLCAweDU4LCAweDdGLCAweDFDLCAweDEzLCAweDkyLCAweDRGLCAweEVGIH0sCisgICAgeyAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxIH0sCisgICAgeyAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDBFLCAweDBFLCAweDBFLCAweDBFIH0sCisgICAgeyAweEUwLCAweEZFLCAweEUwLCAweEZFLCAweEYxLCAweEZFLCAweEYxLCAweEZFIH0sCisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgeyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH0sCisgICAgeyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweEVGIH0sCisgICAgeyAweEZFLCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwIH0KK307CisKKy8qIGNpcGhlcnRleHQgYnl0ZXMgLS0gbGVmdCBoYWx2ZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBjaXBoZXJ0ZXh0X2xbTlVNX1ZBUklBQkxFX0tFWV9URVNUU10gPSB7CisgICAgMHg0RUY5OTc0NSwgMHg1MTg2NkZENSwgMHg3RDg1NkY5QSwgMHgyNDY2REQ4NywgMHg2MUY5QzM4MCwKKyAgICAweDdEMENDNjMwLCAweDRFRjk5NzQ1LCAweDBBQ0VBQjBGLCAweDU5QzY4MjQ1LCAweEIxQjhDQzBCLAorICAgIDB4MTczMEU1NzcsIDB4QTI1RTc4NTYsIDB4MzUzODgyQjEsIDB4NDhGNEQwODgsIDB4NDMyMTkzQjcsCisgICAgMHgxM0YwNDE1NCwgMHgyRUVEREE5MywgMHhEODg3RTAzOSwgMHg1Rjk5RDA0RiwgMHg0QTA1N0EzQiwKKyAgICAweDQ1MjAzMUMxLCAweDc1NTVBRTM5LCAweDUzQzU1RjlDLCAweDdBOEU3QkZBLCAweENGOUM1RDdBLAorICAgIDB4RDFBQkIyOTAsIDB4NTVDQjM3NzQsIDB4RkEzNEVDNDgsIDB4QTc5MDc5NTEsIDB4QzM5RTA3MkQsCisgICAgMHgwMTQ5MzNFMCwgMHhGMjFFOUE3NywgMHgyNDU5NDY4OCwgMHg2QjVDNUE5QworfTsKKworLyogY2lwaGVydGV4dCBieXRlcyAtLSByaWdodCBoYWx2ZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBjaXBoZXJ0ZXh0X3JbTlVNX1ZBUklBQkxFX0tFWV9URVNUU10gPSB7CisgICAgMHg2MTk4REQ3OCwgMHhCODVFQ0I4QSwgMHg2MTMwNjNGMiwgMHg4Qjk2M0M5RCwgMHgyMjgxQjA5NiwKKyAgICAweEFGREExRUM3LCAweDYxOThERDc4LCAweEM2QTBBMjhELCAweEVCMDUyODJCLCAweDI1MEYwOUEwLAorICAgIDB4OEJFQTFEQTQsIDB4Q0YyNjUxRUIsIDB4MDlDRThGMUEsIDB4NEMzNzk5MTgsIDB4ODk1MUZDOTgsCisgICAgMHhENjlEMUFFNSwgMHhGRkQzOUM3OSwgMHgzQzJEQTZFMywgMHg1QjE2Mzk2OSwgMHgyNEQzOTc3QiwKKyAgICAweEU0RkFEQThFLCAweEY1OUI4N0JELCAweEI0OUZDMDE5LCAweDkzN0U4OUEzLCAweDQ5ODZBREI1LAorICAgIDB4NjU4QkM3NzgsIDB4RDEzRUYyMDEsIDB4NDdCMjY4QjIsIDB4MDhFQTNDQUUsIDB4OUZBQzYzMUQsCisgICAgMHhDREFGRjZFNCwgMHhCNzFDNDlCQywgMHg1NzU0MzY5QSwgMHg1RDlFMEE1QQorfTsKKworLyogcGxhaW50ZXh0IGJ5dGVzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBwbGFpbnRleHRbOF0gPSAiQkxPV0ZJU0giOworCitzdGF0aWMgY29uc3QgdWludDhfdCBwbGFpbnRleHQyWzE2XSA9ICJCTE9XRklTSEJMT1dGSVNIIjsKKworLyogY2lwaGVydGV4dCBieXRlcyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2lwaGVydGV4dFs4XSA9IHsKKyAgICAweDMyLCAweDRFLCAweEQwLCAweEZFLCAweEY0LCAweDEzLCAweEEyLCAweDAzCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjaXBoZXJ0ZXh0MlsxNl0gPSB7CisgICAgMHg1MywgMHgwMCwgMHg0MCwgMHgwNiwgMHg2MywgMHhmMiwgMHgxZCwgMHg5OSwKKyAgICAweDNiLCAweDliLCAweDI3LCAweDY0LCAweDQ2LCAweGZkLCAweDIwLCAweGMxLAorfTsKKworI2RlZmluZSBJViAiYmxvd2Zpc2giCisKK3N0YXRpYyB2b2lkIHRlc3RfYmxvd2Zpc2goQVZCbG93ZmlzaCAqY3R4LCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmLCBpbnQgbGVuLCB1aW50OF90ICppdiwgaW50IGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGVzdCkKK3sKKyAgICBhdl9ibG93ZmlzaF9jcnlwdChjdHgsIGRzdCwgc3JjLCBsZW4sIGl2LCBkaXIpOworICAgIGlmIChtZW1jbXAoZHN0LCByZWYsIDgqbGVuKSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgcHJpbnRmKCIlcyBmYWlsZWRcbmdvdCAgICAgICIsIHRlc3QpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOCpsZW47IGkrKykKKyAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLCBkc3RbaV0pOworICAgICAgICBwcmludGYoIlxuZXhwZWN0ZWQgIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4KmxlbjsgaSsrKQorICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIHJlZltpXSk7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgQVZCbG93ZmlzaCBjdHg7CisgICAgdWludDMyX3QgdG1wdGV4dF9sW05VTV9WQVJJQUJMRV9LRVlfVEVTVFNdOworICAgIHVpbnQzMl90IHRtcHRleHRfcltOVU1fVkFSSUFCTEVfS0VZX1RFU1RTXTsKKyAgICB1aW50OF90IHRtcFsxNl0sIGl2WzhdOworICAgIGludCBpOworCisgICAgYXZfYmxvd2Zpc2hfaW5pdCgmY3R4LCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLCAyNik7CisKKyAgICB0ZXN0X2Jsb3dmaXNoKCZjdHgsIHRtcCwgcGxhaW50ZXh0LCBjaXBoZXJ0ZXh0LCAxLCBOVUxMLCAwLCAiZW5jcnlwdGlvbiIpOworICAgIHRlc3RfYmxvd2Zpc2goJmN0eCwgdG1wLCBjaXBoZXJ0ZXh0LCBwbGFpbnRleHQsIDEsIE5VTEwsIDEsICJkZWNyeXB0aW9uIik7CisgICAgdGVzdF9ibG93ZmlzaCgmY3R4LCB0bXAsIHRtcCwgY2lwaGVydGV4dCwgMSwgTlVMTCwgMCwgIklucGxhY2UgZW5jcnlwdGlvbiIpOworICAgIHRlc3RfYmxvd2Zpc2goJmN0eCwgdG1wLCB0bXAsIHBsYWludGV4dCwgIDEsIE5VTEwsIDEsICJJbnBsYWNlIGRlY3J5cHRpb24iKTsKKyAgICBtZW1jcHkoaXYsIElWLCA4KTsKKyAgICB0ZXN0X2Jsb3dmaXNoKCZjdHgsIHRtcCwgcGxhaW50ZXh0MiwgY2lwaGVydGV4dDIsIDIsIGl2LCAwLCAiQ0JDIGVuY3J5cHRpb24iKTsKKyAgICBtZW1jcHkoaXYsIElWLCA4KTsKKyAgICB0ZXN0X2Jsb3dmaXNoKCZjdHgsIHRtcCwgY2lwaGVydGV4dDIsIHBsYWludGV4dDIsIDIsIGl2LCAxLCAiQ0JDIGRlY3J5cHRpb24iKTsKKyAgICBtZW1jcHkoaXYsIElWLCA4KTsKKyAgICB0ZXN0X2Jsb3dmaXNoKCZjdHgsIHRtcCwgdG1wLCBjaXBoZXJ0ZXh0MiwgMiwgaXYsIDAsICJJbnBsYWNlIENCQyBlbmNyeXB0aW9uIik7CisgICAgbWVtY3B5KGl2LCBJViwgOCk7CisgICAgdGVzdF9ibG93ZmlzaCgmY3R4LCB0bXAsIHRtcCwgcGxhaW50ZXh0MiwgIDIsIGl2LCAxLCAiSW5wbGFjZSBDQkMgZGVjcnlwdGlvbiIpOworCisgICAgbWVtY3B5KHRtcHRleHRfbCwgcGxhaW50ZXh0X2wsIHNpemVvZigqcGxhaW50ZXh0X2wpICogTlVNX1ZBUklBQkxFX0tFWV9URVNUUyk7CisgICAgbWVtY3B5KHRtcHRleHRfciwgcGxhaW50ZXh0X3IsIHNpemVvZigqcGxhaW50ZXh0X3IpICogTlVNX1ZBUklBQkxFX0tFWV9URVNUUyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1ZBUklBQkxFX0tFWV9URVNUUzsgaSsrKSB7CisgICAgICAgIGF2X2Jsb3dmaXNoX2luaXQoJmN0eCwgdmFyaWFibGVfa2V5W2ldLCA4KTsKKworICAgICAgICBhdl9ibG93ZmlzaF9jcnlwdF9lY2IoJmN0eCwgJnRtcHRleHRfbFtpXSwgJnRtcHRleHRfcltpXSwgMCk7CisgICAgICAgIGlmICh0bXB0ZXh0X2xbaV0gIT0gY2lwaGVydGV4dF9sW2ldIHx8IHRtcHRleHRfcltpXSAhPSBjaXBoZXJ0ZXh0X3JbaV0pIHsKKyAgICAgICAgICAgIHByaW50ZigiVGVzdCBlbmNyeXB0aW9uIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBhdl9ibG93ZmlzaF9jcnlwdF9lY2IoJmN0eCwgJnRtcHRleHRfbFtpXSwgJnRtcHRleHRfcltpXSwgMSk7CisgICAgICAgIGlmICh0bXB0ZXh0X2xbaV0gIT0gcGxhaW50ZXh0X2xbaV0gfHwgdG1wdGV4dF9yW2ldICE9IHBsYWludGV4dF9yW2ldKSB7CisgICAgICAgICAgICBwcmludGYoIlRlc3QgZGVjcnlwdGlvbiBmYWlsZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIHByaW50ZigiVGVzdCBlbmNyeXB0aW9uL2RlY3J5cHRpb24gc3VjY2Vzcy5cbiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9ibG93ZmlzaC5oIGIvZmZtcGVnL2xpYmF2dXRpbC9ibG93ZmlzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMDA0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2Jsb3dmaXNoLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIEJsb3dmaXNoIGFsZ29yaXRobQorICogQ29weXJpZ2h0IChjKSAyMDEyIFNhbXVlbCBQaXRvaXNldAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9CTE9XRklTSF9ICisjZGVmaW5lIEFWVVRJTF9CTE9XRklTSF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2dV9ibG93ZmlzaCBCbG93ZmlzaAorICogQGluZ3JvdXAgbGF2dV9jcnlwdG8KKyAqIEB7CisgKi8KKworI2RlZmluZSBBVl9CRl9ST1VORFMgMTYKKwordHlwZWRlZiBzdHJ1Y3QgQVZCbG93ZmlzaCB7CisgICAgdWludDMyX3QgcFtBVl9CRl9ST1VORFMgKyAyXTsKKyAgICB1aW50MzJfdCBzWzRdWzI1Nl07Cit9IEFWQmxvd2Zpc2g7CisKKy8qKgorICogSW5pdGlhbGl6ZSBhbiBBVkJsb3dmaXNoIGNvbnRleHQuCisgKgorICogQHBhcmFtIGN0eCBhbiBBVkJsb3dmaXNoIGNvbnRleHQKKyAqIEBwYXJhbSBrZXkgYSBrZXkKKyAqIEBwYXJhbSBrZXlfbGVuIGxlbmd0aCBvZiB0aGUga2V5CisgKi8KK3ZvaWQgYXZfYmxvd2Zpc2hfaW5pdChzdHJ1Y3QgQVZCbG93ZmlzaCAqY3R4LCBjb25zdCB1aW50OF90ICprZXksIGludCBrZXlfbGVuKTsKKworLyoqCisgKiBFbmNyeXB0IG9yIGRlY3J5cHQgYSBidWZmZXIgdXNpbmcgYSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGNvbnRleHQuCisgKgorICogQHBhcmFtIGN0eCBhbiBBVkJsb3dmaXNoIGNvbnRleHQKKyAqIEBwYXJhbSB4bCBsZWZ0IGZvdXIgYnl0ZXMgaGFsdmVzIG9mIGlucHV0IHRvIGJlIGVuY3J5cHRlZAorICogQHBhcmFtIHhyIHJpZ2h0IGZvdXIgYnl0ZXMgaGFsdmVzIG9mIGlucHV0IHRvIGJlIGVuY3J5cHRlZAorICogQHBhcmFtIGRlY3J5cHQgMCBmb3IgZW5jcnlwdGlvbiwgMSBmb3IgZGVjcnlwdGlvbgorICovCit2b2lkIGF2X2Jsb3dmaXNoX2NyeXB0X2VjYihzdHJ1Y3QgQVZCbG93ZmlzaCAqY3R4LCB1aW50MzJfdCAqeGwsIHVpbnQzMl90ICp4ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0KTsKKworLyoqCisgKiBFbmNyeXB0IG9yIGRlY3J5cHQgYSBidWZmZXIgdXNpbmcgYSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGNvbnRleHQuCisgKgorICogQHBhcmFtIGN0eCBhbiBBVkJsb3dmaXNoIGNvbnRleHQKKyAqIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gYXJyYXksIGNhbiBiZSBlcXVhbCB0byBzcmMKKyAqIEBwYXJhbSBzcmMgc291cmNlIGFycmF5LCBjYW4gYmUgZXF1YWwgdG8gZHN0CisgKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIDggYnl0ZSBibG9ja3MKKyAqIEBwYXJhbSBpdiBpbml0aWFsaXphdGlvbiB2ZWN0b3IgZm9yIENCQyBtb2RlLCBpZiBOVUxMIEVDQiB3aWxsIGJlIHVzZWQKKyAqIEBwYXJhbSBkZWNyeXB0IDAgZm9yIGVuY3J5cHRpb24sIDEgZm9yIGRlY3J5cHRpb24KKyAqLwordm9pZCBhdl9ibG93ZmlzaF9jcnlwdChzdHJ1Y3QgQVZCbG93ZmlzaCAqY3R4LCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB1aW50OF90ICppdiwgaW50IGRlY3J5cHQpOworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9CTE9XRklTSF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2JwcmludC5jIGIvZmZtcGVnL2xpYmF2dXRpbC9icHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTBkMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9icHJpbnQuYwpAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBOaWNvbGFzIEdlb3JnZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdnN0cmluZy5oIgorI2luY2x1ZGUgImJwcmludC5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImNvbXBhdC92YV9jb3B5LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJtZW0uaCIKKworI2RlZmluZSBhdl9icHJpbnRfcm9vbShidWYpICgoYnVmKS0+c2l6ZSAtIEZGTUlOKChidWYpLT5sZW4sIChidWYpLT5zaXplKSkKKyNkZWZpbmUgYXZfYnByaW50X2lzX2FsbG9jYXRlZChidWYpICgoYnVmKS0+c3RyICE9IChidWYpLT5yZXNlcnZlZF9pbnRlcm5hbF9idWZmZXIpCisKK3N0YXRpYyBpbnQgYXZfYnByaW50X2FsbG9jKEFWQlByaW50ICpidWYsIHVuc2lnbmVkIHJvb20pCit7CisgICAgY2hhciAqb2xkX3N0ciwgKm5ld19zdHI7CisgICAgdW5zaWduZWQgbWluX3NpemUsIG5ld19zaXplOworCisgICAgaWYgKGJ1Zi0+c2l6ZSA9PSBidWYtPnNpemVfbWF4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKGJ1ZikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAvKiBpdCBpcyBhbHJlYWR5IHRydW5jYXRlZCBhbnl3YXkgKi8KKyAgICBtaW5fc2l6ZSA9IGJ1Zi0+bGVuICsgMSArIEZGTUlOKFVJTlRfTUFYIC0gYnVmLT5sZW4gLSAxLCByb29tKTsKKyAgICBuZXdfc2l6ZSA9IGJ1Zi0+c2l6ZSA+IGJ1Zi0+c2l6ZV9tYXggLyAyID8gYnVmLT5zaXplX21heCA6IGJ1Zi0+c2l6ZSAqIDI7CisgICAgaWYgKG5ld19zaXplIDwgbWluX3NpemUpCisgICAgICAgIG5ld19zaXplID0gRkZNSU4oYnVmLT5zaXplX21heCwgbWluX3NpemUpOworICAgIG9sZF9zdHIgPSBhdl9icHJpbnRfaXNfYWxsb2NhdGVkKGJ1ZikgPyBidWYtPnN0ciA6IE5VTEw7CisgICAgbmV3X3N0ciA9IGF2X3JlYWxsb2Mob2xkX3N0ciwgbmV3X3NpemUpOworICAgIGlmICghbmV3X3N0cikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpZiAoIW9sZF9zdHIpCisgICAgICAgIG1lbWNweShuZXdfc3RyLCBidWYtPnN0ciwgYnVmLT5sZW4gKyAxKTsKKyAgICBidWYtPnN0ciAgPSBuZXdfc3RyOworICAgIGJ1Zi0+c2l6ZSA9IG5ld19zaXplOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdl9icHJpbnRfZ3JvdyhBVkJQcmludCAqYnVmLCB1bnNpZ25lZCBleHRyYV9sZW4pCit7CisgICAgLyogYXJiaXRyYXJ5IG1hcmdpbiB0byBhdm9pZCBzbWFsbCBvdmVyZmxvd3MgKi8KKyAgICBleHRyYV9sZW4gPSBGRk1JTihleHRyYV9sZW4sIFVJTlRfTUFYIC0gNSAtIGJ1Zi0+bGVuKTsKKyAgICBidWYtPmxlbiArPSBleHRyYV9sZW47CisgICAgaWYgKGJ1Zi0+c2l6ZSkKKyAgICAgICAgYnVmLT5zdHJbRkZNSU4oYnVmLT5sZW4sIGJ1Zi0+c2l6ZSAtIDEpXSA9IDA7Cit9CisKK3ZvaWQgYXZfYnByaW50X2luaXQoQVZCUHJpbnQgKmJ1ZiwgdW5zaWduZWQgc2l6ZV9pbml0LCB1bnNpZ25lZCBzaXplX21heCkKK3sKKyAgICB1bnNpZ25lZCBzaXplX2F1dG8gPSAoY2hhciAqKWJ1ZiArIHNpemVvZigqYnVmKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5yZXNlcnZlZF9pbnRlcm5hbF9idWZmZXI7CisKKyAgICBpZiAoc2l6ZV9tYXggPT0gMSkKKyAgICAgICAgc2l6ZV9tYXggPSBzaXplX2F1dG87CisgICAgYnVmLT5zdHIgICAgICA9IGJ1Zi0+cmVzZXJ2ZWRfaW50ZXJuYWxfYnVmZmVyOworICAgIGJ1Zi0+bGVuICAgICAgPSAwOworICAgIGJ1Zi0+c2l6ZSAgICAgPSBGRk1JTihzaXplX2F1dG8sIHNpemVfbWF4KTsKKyAgICBidWYtPnNpemVfbWF4ID0gc2l6ZV9tYXg7CisgICAgKmJ1Zi0+c3RyID0gMDsKKyAgICBpZiAoc2l6ZV9pbml0ID4gYnVmLT5zaXplKQorICAgICAgICBhdl9icHJpbnRfYWxsb2MoYnVmLCBzaXplX2luaXQgLSAxKTsKK30KKwordm9pZCBhdl9icHJpbnRfaW5pdF9mb3JfYnVmZmVyKEFWQlByaW50ICpidWYsIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBidWYtPnN0ciAgICAgID0gYnVmZmVyOworICAgIGJ1Zi0+bGVuICAgICAgPSAwOworICAgIGJ1Zi0+c2l6ZSAgICAgPSBzaXplOworICAgIGJ1Zi0+c2l6ZV9tYXggPSBzaXplOworICAgICpidWYtPnN0ciA9IDA7Cit9CisKK3ZvaWQgYXZfYnByaW50ZihBVkJQcmludCAqYnVmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB1bnNpZ25lZCByb29tOworICAgIGNoYXIgKmRzdDsKKyAgICB2YV9saXN0IHZsOworICAgIGludCBleHRyYV9sZW47CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICByb29tID0gYXZfYnByaW50X3Jvb20oYnVmKTsKKyAgICAgICAgZHN0ID0gcm9vbSA/IGJ1Zi0+c3RyICsgYnVmLT5sZW4gOiBOVUxMOworICAgICAgICB2YV9zdGFydCh2bCwgZm10KTsKKyAgICAgICAgZXh0cmFfbGVuID0gdnNucHJpbnRmKGRzdCwgcm9vbSwgZm10LCB2bCk7CisgICAgICAgIHZhX2VuZCh2bCk7CisgICAgICAgIGlmIChleHRyYV9sZW4gPD0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGV4dHJhX2xlbiA8IHJvb20pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGF2X2JwcmludF9hbGxvYyhidWYsIGV4dHJhX2xlbikpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgYXZfYnByaW50X2dyb3coYnVmLCBleHRyYV9sZW4pOworfQorCit2b2lkIGF2X3ZicHJpbnRmKEFWQlByaW50ICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2bF9hcmcpCit7CisgICAgdW5zaWduZWQgcm9vbTsKKyAgICBjaGFyICpkc3Q7CisgICAgaW50IGV4dHJhX2xlbjsKKyAgICB2YV9saXN0IHZsOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcm9vbSA9IGF2X2JwcmludF9yb29tKGJ1Zik7CisgICAgICAgIGRzdCA9IHJvb20gPyBidWYtPnN0ciArIGJ1Zi0+bGVuIDogTlVMTDsKKyAgICAgICAgdmFfY29weSh2bCwgdmxfYXJnKTsKKyAgICAgICAgZXh0cmFfbGVuID0gdnNucHJpbnRmKGRzdCwgcm9vbSwgZm10LCB2bCk7CisgICAgICAgIHZhX2VuZCh2bCk7CisgICAgICAgIGlmIChleHRyYV9sZW4gPD0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGV4dHJhX2xlbiA8IHJvb20pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGF2X2JwcmludF9hbGxvYyhidWYsIGV4dHJhX2xlbikpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgYXZfYnByaW50X2dyb3coYnVmLCBleHRyYV9sZW4pOworfQorCit2b2lkIGF2X2JwcmludF9jaGFycyhBVkJQcmludCAqYnVmLCBjaGFyIGMsIHVuc2lnbmVkIG4pCit7CisgICAgdW5zaWduZWQgcm9vbSwgcmVhbF9uOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcm9vbSA9IGF2X2JwcmludF9yb29tKGJ1Zik7CisgICAgICAgIGlmIChuIDwgcm9vbSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoYXZfYnByaW50X2FsbG9jKGJ1ZiwgbikpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHJvb20pIHsKKyAgICAgICAgcmVhbF9uID0gRkZNSU4obiwgcm9vbSAtIDEpOworICAgICAgICBtZW1zZXQoYnVmLT5zdHIgKyBidWYtPmxlbiwgYywgcmVhbF9uKTsKKyAgICB9CisgICAgYXZfYnByaW50X2dyb3coYnVmLCBuKTsKK30KKwordm9pZCBhdl9icHJpbnRfYXBwZW5kX2RhdGEoQVZCUHJpbnQgKmJ1ZiwgY29uc3QgY2hhciAqZGF0YSwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCByb29tLCByZWFsX247CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICByb29tID0gYXZfYnByaW50X3Jvb20oYnVmKTsKKyAgICAgICAgaWYgKHNpemUgPCByb29tKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChhdl9icHJpbnRfYWxsb2MoYnVmLCBzaXplKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocm9vbSkgeworICAgICAgICByZWFsX24gPSBGRk1JTihzaXplLCByb29tIC0gMSk7CisgICAgICAgIG1lbWNweShidWYtPnN0ciArIGJ1Zi0+bGVuLCBkYXRhLCByZWFsX24pOworICAgIH0KKyAgICBhdl9icHJpbnRfZ3JvdyhidWYsIHNpemUpOworfQorCit2b2lkIGF2X2JwcmludF9zdHJmdGltZShBVkJQcmludCAqYnVmLCBjb25zdCBjaGFyICpmbXQsIGNvbnN0IHN0cnVjdCB0bSAqdG0pCit7CisgICAgdW5zaWduZWQgcm9vbTsKKyAgICBzaXplX3QgbDsKKworICAgIGlmICghKmZtdCkKKyAgICAgICAgcmV0dXJuOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHJvb20gPSBhdl9icHJpbnRfcm9vbShidWYpOworICAgICAgICBpZiAocm9vbSAmJiAobCA9IHN0cmZ0aW1lKGJ1Zi0+c3RyICsgYnVmLT5sZW4sIHJvb20sIGZtdCwgdG0pKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiBzdHJmdGltZSBkb2VzIG5vdCB0ZWxsIHVzIGhvdyBtdWNoIHJvb20gaXQgd291bGQgbmVlZDogbGV0IHVzCisgICAgICAgICAgIHJldHJ5IHdpdGggdHdpY2UgYXMgbXVjaCB1bnRpbCB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCAqLworICAgICAgICByb29tID0gIXJvb20gPyBzdHJsZW4oZm10KSArIDEgOgorICAgICAgICAgICAgICAgcm9vbSA8PSBJTlRfTUFYIC8gMiA/IHJvb20gKiAyIDogSU5UX01BWDsKKyAgICAgICAgaWYgKGF2X2JwcmludF9hbGxvYyhidWYsIHJvb20pKSB7CisgICAgICAgICAgICAvKiBpbXBvc3NpYmxlIHRvIGdyb3csIHRyeSB0byBtYW5hZ2Ugc29tZXRoaW5nIHVzZWZ1bCBhbnl3YXkgKi8KKyAgICAgICAgICAgIHJvb20gPSBhdl9icHJpbnRfcm9vbShidWYpOworICAgICAgICAgICAgaWYgKHJvb20gPCAxMDI0KSB7CisgICAgICAgICAgICAgICAgLyogaWYgc3RyZnRpbWUgZmFpbHMgYmVjYXVzZSB0aGUgYnVmZmVyIGhhcyAoYWxtb3N0KSByZWFjaGVkCisgICAgICAgICAgICAgICAgICAgaXRzIG1heGltdW0gc2l6ZSwgbGV0IHVzIHRyeSBpbiBhIGxvY2FsIGJ1ZmZlcjsgMWsgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgYmUgZW5vdWdoIHRvIGZvcm1hdCBhbnkgcmVhbCBkYXRlK3RpbWUgc3RyaW5nICovCisgICAgICAgICAgICAgICAgY2hhciBidWYyWzEwMjRdOworICAgICAgICAgICAgICAgIGlmICgobCA9IHN0cmZ0aW1lKGJ1ZjIsIHNpemVvZihidWYyKSwgZm10LCB0bSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiJXMiLCBidWYyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyb29tKSB7CisgICAgICAgICAgICAgICAgLyogaWYgYW55dGhpbmcgZWxzZSBmYWlsZWQgYW5kIHRoZSBidWZmZXIgaXMgbm90IGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZWQsIGxldCB1cyBhZGQgYSBzdG9jayBzdHJpbmcgYW5kIGZvcmNlIHRydW5jYXRpb24gKi8KKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0eHRbXSA9ICJbdHJ1bmNhdGVkIHN0cmZ0aW1lIG91dHB1dF0iOworICAgICAgICAgICAgICAgIG1lbXNldChidWYtPnN0ciArIGJ1Zi0+bGVuLCAnIScsIHJvb20pOworICAgICAgICAgICAgICAgIG1lbWNweShidWYtPnN0ciArIGJ1Zi0+bGVuLCB0eHQsIEZGTUlOKHNpemVvZih0eHQpIC0gMSwgcm9vbSkpOworICAgICAgICAgICAgICAgIGF2X2JwcmludF9ncm93KGJ1Ziwgcm9vbSk7IC8qIGZvcmNlIHRydW5jYXRpb24gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9icHJpbnRfZ3JvdyhidWYsIGwpOworfQorCit2b2lkIGF2X2JwcmludF9nZXRfYnVmZmVyKEFWQlByaW50ICpidWYsIHVuc2lnbmVkIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiptZW0sIHVuc2lnbmVkICphY3R1YWxfc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA+IGF2X2JwcmludF9yb29tKGJ1ZikpCisgICAgICAgIGF2X2JwcmludF9hbGxvYyhidWYsIHNpemUpOworICAgICphY3R1YWxfc2l6ZSA9IGF2X2JwcmludF9yb29tKGJ1Zik7CisgICAgKm1lbSA9ICphY3R1YWxfc2l6ZSA/IGJ1Zi0+c3RyICsgYnVmLT5sZW4gOiBOVUxMOworfQorCit2b2lkIGF2X2JwcmludF9jbGVhcihBVkJQcmludCAqYnVmKQoreworICAgIGlmIChidWYtPmxlbikgeworICAgICAgICAqYnVmLT5zdHIgPSAwOworICAgICAgICBidWYtPmxlbiAgPSAwOworICAgIH0KK30KKworaW50IGF2X2JwcmludF9maW5hbGl6ZShBVkJQcmludCAqYnVmLCBjaGFyICoqcmV0X3N0cikKK3sKKyAgICB1bnNpZ25lZCByZWFsX3NpemUgPSBGRk1JTihidWYtPmxlbiArIDEsIGJ1Zi0+c2l6ZSk7CisgICAgY2hhciAqc3RyOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKHJldF9zdHIpIHsKKyAgICAgICAgaWYgKGF2X2JwcmludF9pc19hbGxvY2F0ZWQoYnVmKSkgeworICAgICAgICAgICAgc3RyID0gYXZfcmVhbGxvYyhidWYtPnN0ciwgcmVhbF9zaXplKTsKKyAgICAgICAgICAgIGlmICghc3RyKQorICAgICAgICAgICAgICAgIHN0ciA9IGJ1Zi0+c3RyOworICAgICAgICAgICAgYnVmLT5zdHIgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyID0gYXZfbWFsbG9jKHJlYWxfc2l6ZSk7CisgICAgICAgICAgICBpZiAoc3RyKQorICAgICAgICAgICAgICAgIG1lbWNweShzdHIsIGJ1Zi0+c3RyLCByZWFsX3NpemUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICAqcmV0X3N0ciA9IHN0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXZfYnByaW50X2lzX2FsbG9jYXRlZChidWYpKQorICAgICAgICAgICAgYXZfZnJlZXAoJmJ1Zi0+c3RyKTsKKyAgICB9CisgICAgYnVmLT5zaXplID0gcmVhbF9zaXplOworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgV0hJVEVTUEFDRVMgIiBcblx0IgorCit2b2lkIGF2X2JwcmludF9lc2NhcGUoQVZCUHJpbnQgKmRzdGJ1ZiwgY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICpzcGVjaWFsX2NoYXJzLAorICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZFc2NhcGVNb2RlIG1vZGUsIGludCBmbGFncykKK3sKKyAgICBjb25zdCBjaGFyICpzcmMwID0gc3JjOworCisgICAgaWYgKG1vZGUgPT0gQVZfRVNDQVBFX01PREVfQVVUTykKKyAgICAgICAgbW9kZSA9IEFWX0VTQ0FQRV9NT0RFX0JBQ0tTTEFTSDsgLyogVE9ETzogaW1wbGVtZW50IGEgaGV1cmlzdGljICovCisKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEFWX0VTQ0FQRV9NT0RFX1FVT1RFOgorICAgICAgICAvKiBlbmNsb3NlIHRoZSBzdHJpbmcgYmV0d2VlbiAnJyAqLworICAgICAgICBhdl9icHJpbnRfY2hhcnMoZHN0YnVmLCAnXCcnLCAxKTsKKyAgICAgICAgZm9yICg7ICpzcmM7IHNyYysrKSB7CisgICAgICAgICAgICBpZiAoKnNyYyA9PSAnXCcnKQorICAgICAgICAgICAgICAgIGF2X2JwcmludGYoZHN0YnVmLCAiJ1xcJyciKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoZHN0YnVmLCAqc3JjLCAxKTsKKyAgICAgICAgfQorICAgICAgICBhdl9icHJpbnRfY2hhcnMoZHN0YnVmLCAnXCcnLCAxKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAvKiBjYXNlIEFWX0VTQ0FQRV9NT0RFX0JBQ0tTTEFTSCBvciB1bmtub3duIG1vZGUgKi8KKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBcLWVzY2FwZSBjaGFyYWN0ZXJzICovCisgICAgICAgIGZvciAoOyAqc3JjOyBzcmMrKykgeworICAgICAgICAgICAgaW50IGlzX2ZpcnN0X2xhc3QgICAgICAgPSBzcmMgPT0gc3JjMCB8fCAhKihzcmMrMSk7CisgICAgICAgICAgICBpbnQgaXNfd3MgICAgICAgICAgICAgICA9ICEhc3RyY2hyKFdISVRFU1BBQ0VTLCAqc3JjKTsKKyAgICAgICAgICAgIGludCBpc19zdHJpY3RseV9zcGVjaWFsID0gc3BlY2lhbF9jaGFycyAmJiBzdHJjaHIoc3BlY2lhbF9jaGFycywgKnNyYyk7CisgICAgICAgICAgICBpbnQgaXNfc3BlY2lhbCAgICAgICAgICA9CisgICAgICAgICAgICAgICAgaXNfc3RyaWN0bHlfc3BlY2lhbCB8fCBzdHJjaHIoIidcXCIsICpzcmMpIHx8CisgICAgICAgICAgICAgICAgKGlzX3dzICYmIChmbGFncyAmIEFWX0VTQ0FQRV9GTEFHX1dISVRFU1BBQ0UpKTsKKworICAgICAgICAgICAgaWYgKGlzX3N0cmljdGx5X3NwZWNpYWwgfHwKKyAgICAgICAgICAgICAgICAoIShmbGFncyAmIEFWX0VTQ0FQRV9GTEFHX1NUUklDVCkgJiYKKyAgICAgICAgICAgICAgICAgKGlzX3NwZWNpYWwgfHwgKGlzX3dzICYmIGlzX2ZpcnN0X2xhc3QpKSkpCisgICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdGJ1ZiwgJ1xcJywgMSk7CisgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoZHN0YnVmLCAqc3JjLCAxKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKyNpZmRlZiBURVNUCisKKyN1bmRlZiBwcmludGYKKworc3RhdGljIHZvaWQgYnByaW50X3Bhc2NhbChBVkJQcmludCAqYiwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBpLCBqOworICAgIHVuc2lnbmVkIHBbNDJdOworCisgICAgYXZfYXNzZXJ0MChzaXplIDwgRkZfQVJSQVlfRUxFTVMocCkpOworCisgICAgcFswXSA9IDE7CisgICAgYXZfYnByaW50ZihiLCAiJThkXG4iLCAxKTsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IHNpemU7IGkrKykgeworICAgICAgICBwW2ldID0gMTsKKyAgICAgICAgZm9yIChqID0gaSAtIDE7IGogPiAwOyBqLS0pCisgICAgICAgICAgICBwW2pdID0gcFtqXSArIHBbaiAtIDFdOworICAgICAgICBmb3IgKGogPSAwOyBqIDw9IGk7IGorKykKKyAgICAgICAgICAgIGF2X2JwcmludGYoYiwgIiU4ZCIsIHBbal0pOworICAgICAgICBhdl9icHJpbnRmKGIsICJcbiIpOworICAgIH0KK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBBVkJQcmludCBiOworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgc3RydWN0IHRtIHRlc3R0aW1lID0geyAudG1feWVhciA9IDEwMCwgLnRtX21vbiA9IDExLCAudG1fbWRheSA9IDIwIH07CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYiwgMCwgLTEpOworICAgIGJwcmludF9wYXNjYWwoJmIsIDUpOworICAgIHByaW50ZigiU2hvcnQgdGV4dCBpbiB1bmxpbWl0ZWQgYnVmZmVyOiAldS8ldVxuIiwgKHVuc2lnbmVkKXN0cmxlbihiLnN0ciksIGIubGVuKTsKKyAgICBwcmludGYoIiVzXG4iLCBiLnN0cik7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZiLCBOVUxMKTsKKworICAgIGF2X2JwcmludF9pbml0KCZiLCAwLCAtMSk7CisgICAgYnByaW50X3Bhc2NhbCgmYiwgMjUpOworICAgIHByaW50ZigiTG9uZyB0ZXh0IGluIHVubGltaXRlZCBidWZmZXI6ICV1LyV1XG4iLCAodW5zaWduZWQpc3RybGVuKGIuc3RyKSwgYi5sZW4pOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYiwgTlVMTCk7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYiwgMCwgMjA0OCk7CisgICAgYnByaW50X3Bhc2NhbCgmYiwgMjUpOworICAgIHByaW50ZigiTG9uZyB0ZXh0IGluIGxpbWl0ZWQgYnVmZmVyOiAldS8ldVxuIiwgKHVuc2lnbmVkKXN0cmxlbihiLnN0ciksIGIubGVuKTsKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmIsIE5VTEwpOworCisgICAgYXZfYnByaW50X2luaXQoJmIsIDAsIDEpOworICAgIGJwcmludF9wYXNjYWwoJmIsIDUpOworICAgIHByaW50ZigiU2hvcnQgdGV4dCBpbiBhdXRvbWF0aWMgYnVmZmVyOiAldS8ldVxuIiwgKHVuc2lnbmVkKXN0cmxlbihiLnN0ciksIGIubGVuKTsKKworICAgIGF2X2JwcmludF9pbml0KCZiLCAwLCAxKTsKKyAgICBicHJpbnRfcGFzY2FsKCZiLCAyNSk7CisgICAgcHJpbnRmKCJMb25nIHRleHQgaW4gYXV0b21hdGljIGJ1ZmZlcjogJXUvJXVcbiIsICh1bnNpZ25lZClzdHJsZW4oYi5zdHIpLzgqOCwgYi5sZW4pOworICAgIC8qIE5vdGUgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgYXV0b21hdGljIGJ1ZmZlciBpcyBhcmNoLWRlcGVuZGVudC4gKi8KKworICAgIGF2X2JwcmludF9pbml0KCZiLCAwLCAwKTsKKyAgICBicHJpbnRfcGFzY2FsKCZiLCAyNSk7CisgICAgcHJpbnRmKCJMb25nIHRleHQgY291bnQgb25seSBidWZmZXI6ICV1LyV1XG4iLCAodW5zaWduZWQpc3RybGVuKGIuc3RyKSwgYi5sZW4pOworCisgICAgYXZfYnByaW50X2luaXRfZm9yX2J1ZmZlcigmYiwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgYnByaW50X3Bhc2NhbCgmYiwgMjUpOworICAgIHByaW50ZigiTG9uZyB0ZXh0IGNvdW50IG9ubHkgYnVmZmVyOiAldS8ldVxuIiwgKHVuc2lnbmVkKXN0cmxlbihidWYpLCBiLmxlbik7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYiwgMCwgLTEpOworICAgIGF2X2JwcmludF9zdHJmdGltZSgmYiwgIiVZLSVtLSVkIiwgJnRlc3R0aW1lKTsKKyAgICBwcmludGYoInN0cmZ0aW1lIGZ1bGw6ICV1LyV1IFwiJXNcIlxuIiwgKHVuc2lnbmVkKXN0cmxlbihidWYpLCBiLmxlbiwgYi5zdHIpOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYiwgTlVMTCk7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYiwgMCwgOCk7CisgICAgYXZfYnByaW50X3N0cmZ0aW1lKCZiLCAiJVktJW0tJWQiLCAmdGVzdHRpbWUpOworICAgIHByaW50Zigic3RyZnRpbWUgdHJ1bmNhdGVkOiAldS8ldSBcIiVzXCJcbiIsICh1bnNpZ25lZClzdHJsZW4oYnVmKSwgYi5sZW4sIGIuc3RyKTsKKworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvYnByaW50LmggYi9mZm1wZWcvbGliYXZ1dGlsL2JwcmludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWIxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2JwcmludC5oCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0JQUklOVF9ICisjZGVmaW5lIEFWVVRJTF9CUFJJTlRfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiYXZzdHJpbmcuaCIKKworLyoqCisgKiBEZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBleHRyYSBwYWRkaW5nIHRvIGEgZml4ZWQgc2l6ZQorICogVGhpcyBoZWxwcyBlbnN1cmluZyBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucy4KKyAqLworCisjZGVmaW5lIEZGX1BBRF9TVFJVQ1RVUkUobmFtZSwgc2l6ZSwgLi4uKSBcCitzdHJ1Y3QgZmZfcGFkX2hlbHBlcl8jI25hbWUgeyBfX1ZBX0FSR1NfXyB9OyBcCit0eXBlZGVmIHN0cnVjdCBuYW1lIHsgXAorICAgIF9fVkFfQVJHU19fIFwKKyAgICBjaGFyIHJlc2VydmVkX3BhZGRpbmdbc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmZfcGFkX2hlbHBlcl8jI25hbWUpXTsgXAorfSBuYW1lOworCisvKioKKyAqIEJ1ZmZlciB0byBwcmludCBkYXRhIHByb2dyZXNzaXZlbHkKKyAqCisgKiBUaGUgc3RyaW5nIGJ1ZmZlciBncm93cyBhcyBuZWNlc3NhcnkgYW5kIGlzIGFsd2F5cyAwLXRlcm1pbmF0ZWQuCisgKiBUaGUgY29udGVudCBvZiB0aGUgc3RyaW5nIGlzIG5ldmVyIGFjY2Vzc2VkLCBhbmQgdGh1cyBpcworICogZW5jb2RpbmctYWdub3N0aWMgYW5kIGNhbiBldmVuIGhvbGQgYmluYXJ5IGRhdGEuCisgKgorICogU21hbGwgYnVmZmVycyBhcmUga2VwdCBpbiB0aGUgc3RydWN0dXJlIGl0c2VsZiwgYW5kIHRodXMgcmVxdWlyZSBubworICogbWVtb3J5IGFsbG9jYXRpb24gYXQgYWxsICh1bmxlc3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgaXMgbmVlZGVkCisgKiBhZnRlciB0aGUgc3RydWN0dXJlIGdvZXMgb3V0IG9mIHNjb3BlKS4gVGhpcyBpcyBhbG1vc3QgYXMgbGlnaHR3ZWlnaHQgYXMKKyAqIGRlY2xhcmluZyBhIGxvY2FsICJjaGFyIGJ1Zls1MTJdIi4KKyAqCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgY2FuIGdvIGJleW9uZCB0aGUgYWxsb2NhdGVkIHNpemU6IHRoZSBidWZmZXIgaXMKKyAqIHRoZW4gdHJ1bmNhdGVkLCBidXQgdGhlIGZ1bmN0aW9ucyBzdGlsbCBrZWVwIGFjY291bnQgb2YgdGhlIGFjdHVhbCB0b3RhbAorICogbGVuZ3RoLgorICoKKyAqIEluIG90aGVyIHdvcmRzLCBidWYtPmxlbiBjYW4gYmUgZ3JlYXRlciB0aGFuIGJ1Zi0+c2l6ZSBhbmQgcmVjb3JkcyB0aGUKKyAqIHRvdGFsIGxlbmd0aCBvZiB3aGF0IHdvdWxkIGhhdmUgYmVlbiB0byB0aGUgYnVmZmVyIGlmIHRoZXJlIGhhZCBiZWVuCisgKiBlbm91Z2ggbWVtb3J5LgorICoKKyAqIEFwcGVuZCBvcGVyYXRpb25zIGRvIG5vdCBuZWVkIHRvIGJlIHRlc3RlZCBmb3IgZmFpbHVyZTogaWYgYSBtZW1vcnkKKyAqIGFsbG9jYXRpb24gZmFpbHMsIGRhdGEgc3RvcCBiZWluZyBhcHBlbmRlZCB0byB0aGUgYnVmZmVyLCBidXQgdGhlIGxlbmd0aAorICogaXMgc3RpbGwgdXBkYXRlZC4gVGhpcyBzaXR1YXRpb24gY2FuIGJlIHRlc3RlZCB3aXRoCisgKiBhdl9icHJpbnRfaXNfY29tcGxldGUoKS4KKyAqCisgKiBUaGUgc2l6ZV9tYXggZmllbGQgZGV0ZXJtaW5lcyBzZXZlcmFsIHBvc3NpYmxlIGJlaGF2aW91cnM6CisgKgorICogc2l6ZV9tYXggPSAtMSAoPSBVSU5UX01BWCkgb3IgYW55IGxhcmdlIHZhbHVlIHdpbGwgbGV0IHRoZSBidWZmZXIgYmUKKyAqIHJlYWxsb2NhdGVkIGFzIG5lY2Vzc2FyeSwgd2l0aCBhbiBhbW9ydGl6ZWQgbGluZWFyIGNvc3QuCisgKgorICogc2l6ZV9tYXggPSAwIHByZXZlbnRzIHdyaXRpbmcgYW55dGhpbmcgdG8gdGhlIGJ1ZmZlcjogb25seSB0aGUgdG90YWwKKyAqIGxlbmd0aCBpcyBjb21wdXRlZC4gVGhlIHdyaXRlIG9wZXJhdGlvbnMgY2FuIHRoZW4gcG9zc2libHkgYmUgcmVwZWF0ZWQgaW4KKyAqIGEgYnVmZmVyIHdpdGggZXhhY3RseSB0aGUgbmVjZXNzYXJ5IHNpemUKKyAqICh1c2luZyBzaXplX2luaXQgPSBzaXplX21heCA9IGxlbiArIDEpLgorICoKKyAqIHNpemVfbWF4ID0gMSBpcyBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIGJ5IHRoZSBleGFjdCBzaXplIGF2YWlsYWJsZSBpbiB0aGUKKyAqIHN0cnVjdHVyZSBpdHNlbGYsIHRodXMgZW5zdXJpbmcgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4gVGhlCisgKiBpbnRlcm5hbCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSByZWFzb25hYmxlIHBhcmFncmFwaCBvZiB0ZXh0LAorICogc3VjaCBhcyB0aGUgY3VycmVudCBwYXJhZ3JhcGguCisgKi8KKworRkZfUEFEX1NUUlVDVFVSRShBVkJQcmludCwgMTAyNCwKKyAgICBjaGFyICpzdHI7ICAgICAgICAgLyoqPCBzdHJpbmcgc28gZmFyICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgIC8qKjwgbGVuZ3RoIHNvIGZhciAqLworICAgIHVuc2lnbmVkIHNpemU7ICAgICAvKio8IGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICB1bnNpZ25lZCBzaXplX21heDsgLyoqPCBtYXhpbXVtIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICBjaGFyIHJlc2VydmVkX2ludGVybmFsX2J1ZmZlclsxXTsKKykKKworLyoqCisgKiBDb252ZW5pZW5jZSBtYWNyb3MgZm9yIHNwZWNpYWwgdmFsdWVzIGZvciBhdl9icHJpbnRfaW5pdCgpIHNpemVfbWF4CisgKiBwYXJhbWV0ZXIuCisgKi8KKyNkZWZpbmUgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEICAoKHVuc2lnbmVkKS0xKQorI2RlZmluZSBBVl9CUFJJTlRfU0laRV9BVVRPTUFUSUMgIDEKKyNkZWZpbmUgQVZfQlBSSU5UX1NJWkVfQ09VTlRfT05MWSAwCisKKy8qKgorICogSW5pdCBhIHByaW50IGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gYnVmICAgICAgICBidWZmZXIgdG8gaW5pdAorICogQHBhcmFtIHNpemVfaW5pdCAgaW5pdGlhbCBzaXplIChpbmNsdWRpbmcgdGhlIGZpbmFsIDApCisgKiBAcGFyYW0gc2l6ZV9tYXggICBtYXhpbXVtIHNpemU7CisgKiAgICAgICAgICAgICAgICAgICAwIG1lYW5zIGRvIG5vdCB3cml0ZSBhbnl0aGluZywganVzdCBjb3VudCB0aGUgbGVuZ3RoOworICogICAgICAgICAgICAgICAgICAgMSBpcyByZXBsYWNlZCBieSB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgYXV0b21hdGljIHN0b3JhZ2U7CisgKiAgICAgICAgICAgICAgICAgICBhbnkgbGFyZ2UgdmFsdWUgbWVhbnMgdGhhdCB0aGUgaW50ZXJuYWwgYnVmZmVyIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgIHJlYWxsb2NhdGVkIGFzIG5lZWRlZCB1cCB0byB0aGF0IGxpbWl0OyAtMSBpcyBjb252ZXJ0ZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgIFVJTlRfTUFYLCB0aGUgbGFyZ2VzdCBsaW1pdCBwb3NzaWJsZS4KKyAqICAgICAgICAgICAgICAgICAgIENoZWNrIGFsc28gQVZfQlBSSU5UX1NJWkVfKiBtYWNyb3MuCisgKi8KK3ZvaWQgYXZfYnByaW50X2luaXQoQVZCUHJpbnQgKmJ1ZiwgdW5zaWduZWQgc2l6ZV9pbml0LCB1bnNpZ25lZCBzaXplX21heCk7CisKKy8qKgorICogSW5pdCBhIHByaW50IGJ1ZmZlciB1c2luZyBhIHByZS1leGlzdGluZyBidWZmZXIuCisgKgorICogVGhlIGJ1ZmZlciB3aWxsIG5vdCBiZSByZWFsbG9jYXRlZC4KKyAqCisgKiBAcGFyYW0gYnVmICAgICBidWZmZXIgc3RydWN0dXJlIHRvIGluaXQKKyAqIEBwYXJhbSBidWZmZXIgIGJ5dGUgYnVmZmVyIHRvIHVzZSBmb3IgdGhlIHN0cmluZyBkYXRhCisgKiBAcGFyYW0gc2l6ZSAgICBzaXplIG9mIGJ1ZmZlcgorICovCit2b2lkIGF2X2JwcmludF9pbml0X2Zvcl9idWZmZXIoQVZCUHJpbnQgKmJ1ZiwgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBzaXplKTsKKworLyoqCisgKiBBcHBlbmQgYSBmb3JtYXR0ZWQgc3RyaW5nIHRvIGEgcHJpbnQgYnVmZmVyLgorICovCit2b2lkIGF2X2JwcmludGYoQVZCUHJpbnQgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pIGF2X3ByaW50Zl9mb3JtYXQoMiwgMyk7CisKKy8qKgorICogQXBwZW5kIGEgZm9ybWF0dGVkIHN0cmluZyB0byBhIHByaW50IGJ1ZmZlci4KKyAqLwordm9pZCBhdl92YnByaW50ZihBVkJQcmludCAqYnVmLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmxfYXJnKTsKKworLyoqCisgKiBBcHBlbmQgY2hhciBjIG4gdGltZXMgdG8gYSBwcmludCBidWZmZXIuCisgKi8KK3ZvaWQgYXZfYnByaW50X2NoYXJzKEFWQlByaW50ICpidWYsIGNoYXIgYywgdW5zaWduZWQgbik7CisKKy8qKgorICogQXBwZW5kIGRhdGEgdG8gYSBwcmludCBidWZmZXIuCisgKgorICogcGFyYW0gYnVmICBicHJpbnQgYnVmZmVyIHRvIHVzZQorICogcGFyYW0gZGF0YSBwb2ludGVyIHRvIGRhdGEKKyAqIHBhcmFtIHNpemUgc2l6ZSBvZiBkYXRhCisgKi8KK3ZvaWQgYXZfYnByaW50X2FwcGVuZF9kYXRhKEFWQlByaW50ICpidWYsIGNvbnN0IGNoYXIgKmRhdGEsIHVuc2lnbmVkIHNpemUpOworCitzdHJ1Y3QgdG07CisvKioKKyAqIEFwcGVuZCBhIGZvcm1hdHRlZCBkYXRlIGFuZCB0aW1lIHRvIGEgcHJpbnQgYnVmZmVyLgorICoKKyAqIHBhcmFtIGJ1ZiAgYnByaW50IGJ1ZmZlciB0byB1c2UKKyAqIHBhcmFtIGZtdCAgZGF0ZSBhbmQgdGltZSBmb3JtYXQgc3RyaW5nLCBzZWUgc3RyZnRpbWUoKQorICogcGFyYW0gdG0gICBicm9rZW4tZG93biB0aW1lIHN0cnVjdHVyZSB0byB0cmFuc2xhdGUKKyAqCisgKiBAbm90ZSBkdWUgdG8gcG9vciBkZXNpZ24gb2YgdGhlIHN0YW5kYXJkIHN0cmZ0aW1lIGZ1bmN0aW9uLCBpdCBtYXkKKyAqIHByb2R1Y2UgcG9vciByZXN1bHRzIGlmIHRoZSBmb3JtYXQgc3RyaW5nIGV4cGFuZHMgdG8gYSB2ZXJ5IGxvbmcgdGV4dCBhbmQKKyAqIHRoZSBicHJpbnQgYnVmZmVyIGlzIG5lYXIgdGhlIGxpbWl0IHN0YXRlZCBieSB0aGUgc2l6ZV9tYXggb3B0aW9uLgorICovCit2b2lkIGF2X2JwcmludF9zdHJmdGltZShBVkJQcmludCAqYnVmLCBjb25zdCBjaGFyICpmbXQsIGNvbnN0IHN0cnVjdCB0bSAqdG0pOworCisvKioKKyAqIEFsbG9jYXRlIGJ5dGVzIGluIHRoZSBidWZmZXIgZm9yIGV4dGVybmFsIHVzZS4KKyAqCisgKiBAcGFyYW1baW5dICBidWYgICAgICAgICAgYnVmZmVyIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSAgc2l6ZSAgICAgICAgIHJlcXVpcmVkIHNpemUKKyAqIEBwYXJhbVtvdXRdIG1lbSAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtZW1vcnkgYXJlYQorICogQHBhcmFtW291dF0gYWN0dWFsX3NpemUgIHNpemUgb2YgdGhlIG1lbW9yeSBhcmVhIGFmdGVyIGFsbG9jYXRpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGxhcmdlciBvciBzbWFsbGVyIHRoYW4gc2l6ZQorICovCit2b2lkIGF2X2JwcmludF9nZXRfYnVmZmVyKEFWQlByaW50ICpidWYsIHVuc2lnbmVkIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiptZW0sIHVuc2lnbmVkICphY3R1YWxfc2l6ZSk7CisKKy8qKgorICogUmVzZXQgdGhlIHN0cmluZyB0byAiIiBidXQga2VlcCBpbnRlcm5hbCBhbGxvY2F0ZWQgZGF0YS4KKyAqLwordm9pZCBhdl9icHJpbnRfY2xlYXIoQVZCUHJpbnQgKmJ1Zik7CisKKy8qKgorICogVGVzdCBpZiB0aGUgcHJpbnQgYnVmZmVyIGlzIGNvbXBsZXRlIChub3QgdHJ1bmNhdGVkKS4KKyAqCisgKiBJdCBtYXkgaGF2ZSBiZWVuIHRydW5jYXRlZCBkdWUgdG8gYSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCisgKiBvciB0aGUgc2l6ZV9tYXggbGltaXQgKGNvbXBhcmUgc2l6ZSBhbmQgc2l6ZV9tYXggaWYgbmVjZXNzYXJ5KS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXZfYnByaW50X2lzX2NvbXBsZXRlKGNvbnN0IEFWQlByaW50ICpidWYpCit7CisgICAgcmV0dXJuIGJ1Zi0+bGVuIDwgYnVmLT5zaXplOworfQorCisvKioKKyAqIEZpbmFsaXplIGEgcHJpbnQgYnVmZmVyLgorICoKKyAqIFRoZSBwcmludCBidWZmZXIgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGFmdGVyd2FyZHMsCisgKiBidXQgdGhlIGxlbiBhbmQgc2l6ZSBmaWVsZHMgYXJlIHN0aWxsIHZhbGlkLgorICoKKyAqIEBhcmdbb3V0XSByZXRfc3RyICBpZiBub3QgTlVMTCwgdXNlZCB0byByZXR1cm4gYSBwZXJtYW5lbnQgY29weSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICBidWZmZXIgY29udGVudHMsIG9yIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHM7CisgKiAgICAgICAgICAgICAgICAgICAgaWYgTlVMTCwgdGhlIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGZyZWVkCisgKiBAcmV0dXJuICAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUgKHByb2JhYmx5IEFWRVJST1IoRU5PTUVNKSkKKyAqLworaW50IGF2X2JwcmludF9maW5hbGl6ZShBVkJQcmludCAqYnVmLCBjaGFyICoqcmV0X3N0cik7CisKKy8qKgorICogRXNjYXBlIHRoZSBjb250ZW50IGluIHNyYyBhbmQgYXBwZW5kIGl0IHRvIGRzdGJ1Zi4KKyAqCisgKiBAcGFyYW0gZHN0YnVmICAgICAgICBhbHJlYWR5IGluaXRlZCBkZXN0aW5hdGlvbiBicHJpbnQgYnVmZmVyCisgKiBAcGFyYW0gc3JjICAgICAgICAgICBzdHJpbmcgY29udGFpbmluZyB0aGUgdGV4dCB0byBlc2NhcGUKKyAqIEBwYXJhbSBzcGVjaWFsX2NoYXJzIHN0cmluZyBjb250YWluaW5nIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgd2hpY2gKKyAqICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gYmUgZXNjYXBlZCwgY2FuIGJlIE5VTEwKKyAqIEBwYXJhbSBtb2RlICAgICAgICAgIGVzY2FwZSBtb2RlIHRvIGVtcGxveSwgc2VlIEFWX0VTQ0FQRV9NT0RFXyogbWFjcm9zLgorICogICAgICAgICAgICAgICAgICAgICAgQW55IHVua25vd24gdmFsdWUgZm9yIG1vZGUgd2lsbCBiZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIEFWX0VTQ0FQRV9NT0RFX0JBQ0tTTEFTSCwgYnV0IHRoaXMgYmVoYXZpb3VyIGNhbiBjaGFuZ2Ugd2l0aG91dAorICogICAgICAgICAgICAgICAgICAgICAgbm90aWNlLgorICogQHBhcmFtIGZsYWdzICAgICAgICAgZmxhZ3Mgd2hpY2ggY29udHJvbCBob3cgdG8gZXNjYXBlLCBzZWUgQVZfRVNDQVBFX0ZMQUdfKiBtYWNyb3MKKyAqLwordm9pZCBhdl9icHJpbnRfZXNjYXBlKEFWQlByaW50ICpkc3RidWYsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqc3BlY2lhbF9jaGFycywKKyAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWRXNjYXBlTW9kZSBtb2RlLCBpbnQgZmxhZ3MpOworCisjZW5kaWYgLyogQVZVVElMX0JQUklOVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2Jzd2FwLmggYi9mZm1wZWcvbGliYXZ1dGlsL2Jzd2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjYjc5NQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYnN3YXAuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBieXRlIHN3YXBwaW5nIHJvdXRpbmVzCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQlNXQVBfSAorI2RlZmluZSBBVlVUSUxfQlNXQVBfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2Y29uZmlnLmgiCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorCisjaWZkZWYgSEFWRV9BVl9DT05GSUdfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiAgIEFSQ0hfQUFSQ0g2NAorIyAgIGluY2x1ZGUgImFhcmNoNjQvYnN3YXAuaCIKKyNlbGlmIEFSQ0hfQVJNCisjICAgaW5jbHVkZSAiYXJtL2Jzd2FwLmgiCisjZWxpZiBBUkNIX0FWUjMyCisjICAgaW5jbHVkZSAiYXZyMzIvYnN3YXAuaCIKKyNlbGlmIEFSQ0hfU0g0CisjICAgaW5jbHVkZSAic2g0L2Jzd2FwLmgiCisjZWxpZiBBUkNIX1g4NgorIyAgIGluY2x1ZGUgIng4Ni9ic3dhcC5oIgorI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX0FWX0NPTkZJR19IICovCisKKyNkZWZpbmUgQVZfQlNXQVAxNkMoeCkgKCgoeCkgPDwgOCAmIDB4ZmYwMCkgIHwgKCh4KSA+PiA4ICYgMHgwMGZmKSkKKyNkZWZpbmUgQVZfQlNXQVAzMkMoeCkgKEFWX0JTV0FQMTZDKHgpIDw8IDE2IHwgQVZfQlNXQVAxNkMoKHgpID4+IDE2KSkKKyNkZWZpbmUgQVZfQlNXQVA2NEMoeCkgKEFWX0JTV0FQMzJDKHgpIDw8IDMyIHwgQVZfQlNXQVAzMkMoKHgpID4+IDMyKSkKKworI2RlZmluZSBBVl9CU1dBUEMocywgeCkgQVZfQlNXQVAjI3MjI0MoeCkKKworI2lmbmRlZiBhdl9ic3dhcDE2CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCB1aW50MTZfdCBhdl9ic3dhcDE2KHVpbnQxNl90IHgpCit7CisgICAgeD0gKHg+PjgpIHwgKHg8PDgpOworICAgIHJldHVybiB4OworfQorI2VuZGlmCisKKyNpZm5kZWYgYXZfYnN3YXAzMgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgdWludDMyX3QgYXZfYnN3YXAzMih1aW50MzJfdCB4KQoreworICAgIHJldHVybiBBVl9CU1dBUDMyQyh4KTsKK30KKyNlbmRpZgorCisjaWZuZGVmIGF2X2Jzd2FwNjQKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgYXZfY29uc3QgYXZfYnN3YXA2NCh1aW50NjRfdCB4KQoreworICAgIHJldHVybiAodWludDY0X3QpYXZfYnN3YXAzMih4KSA8PCAzMiB8IGF2X2Jzd2FwMzIoeCA+PiAzMik7Cit9CisjZW5kaWYKKworLy8gYmUybmUgLi4uIGJpZy1lbmRpYW4gdG8gbmF0aXZlLWVuZGlhbgorLy8gbGUybmUgLi4uIGxpdHRsZS1lbmRpYW4gdG8gbmF0aXZlLWVuZGlhbgorCisjaWYgQVZfSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgYXZfYmUybmUxNih4KSAoeCkKKyNkZWZpbmUgYXZfYmUybmUzMih4KSAoeCkKKyNkZWZpbmUgYXZfYmUybmU2NCh4KSAoeCkKKyNkZWZpbmUgYXZfbGUybmUxNih4KSBhdl9ic3dhcDE2KHgpCisjZGVmaW5lIGF2X2xlMm5lMzIoeCkgYXZfYnN3YXAzMih4KQorI2RlZmluZSBhdl9sZTJuZTY0KHgpIGF2X2Jzd2FwNjQoeCkKKyNkZWZpbmUgQVZfQkUyTkVDKHMsIHgpICh4KQorI2RlZmluZSBBVl9MRTJORUMocywgeCkgQVZfQlNXQVBDKHMsIHgpCisjZWxzZQorI2RlZmluZSBhdl9iZTJuZTE2KHgpIGF2X2Jzd2FwMTYoeCkKKyNkZWZpbmUgYXZfYmUybmUzMih4KSBhdl9ic3dhcDMyKHgpCisjZGVmaW5lIGF2X2JlMm5lNjQoeCkgYXZfYnN3YXA2NCh4KQorI2RlZmluZSBhdl9sZTJuZTE2KHgpICh4KQorI2RlZmluZSBhdl9sZTJuZTMyKHgpICh4KQorI2RlZmluZSBhdl9sZTJuZTY0KHgpICh4KQorI2RlZmluZSBBVl9CRTJORUMocywgeCkgQVZfQlNXQVBDKHMsIHgpCisjZGVmaW5lIEFWX0xFMk5FQyhzLCB4KSAoeCkKKyNlbmRpZgorCisjZGVmaW5lIEFWX0JFMk5FMTZDKHgpIEFWX0JFMk5FQygxNiwgeCkKKyNkZWZpbmUgQVZfQkUyTkUzMkMoeCkgQVZfQkUyTkVDKDMyLCB4KQorI2RlZmluZSBBVl9CRTJORTY0Qyh4KSBBVl9CRTJORUMoNjQsIHgpCisjZGVmaW5lIEFWX0xFMk5FMTZDKHgpIEFWX0xFMk5FQygxNiwgeCkKKyNkZWZpbmUgQVZfTEUyTkUzMkMoeCkgQVZfTEUyTkVDKDMyLCB4KQorI2RlZmluZSBBVl9MRTJORTY0Qyh4KSBBVl9MRTJORUMoNjQsIHgpCisKKyNlbmRpZiAvKiBBVlVUSUxfQlNXQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9idWZmZXIuYyBiL2ZmbXBlZy9saWJhdnV0aWwvYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExNGFmYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvYnVmZmVyLmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXRvbWljLmgiCisjaW5jbHVkZSAiYnVmZmVyX2ludGVybmFsLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisKK0FWQnVmZmVyUmVmICphdl9idWZmZXJfY3JlYXRlKHVpbnQ4X3QgKmRhdGEsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZyZWUpKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsIGludCBmbGFncykKK3sKKyAgICBBVkJ1ZmZlclJlZiAqcmVmID0gTlVMTDsKKyAgICBBVkJ1ZmZlciAgICAqYnVmID0gTlVMTDsKKworICAgIGJ1ZiA9IGF2X21hbGxvY3ooc2l6ZW9mKCpidWYpKTsKKyAgICBpZiAoIWJ1ZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBidWYtPmRhdGEgICAgID0gZGF0YTsKKyAgICBidWYtPnNpemUgICAgID0gc2l6ZTsKKyAgICBidWYtPmZyZWUgICAgID0gZnJlZSA/IGZyZWUgOiBhdl9idWZmZXJfZGVmYXVsdF9mcmVlOworICAgIGJ1Zi0+b3BhcXVlICAgPSBvcGFxdWU7CisgICAgYnVmLT5yZWZjb3VudCA9IDE7CisKKyAgICBpZiAoZmxhZ3MgJiBBVl9CVUZGRVJfRkxBR19SRUFET05MWSkKKyAgICAgICAgYnVmLT5mbGFncyB8PSBCVUZGRVJfRkxBR19SRUFET05MWTsKKworICAgIHJlZiA9IGF2X21hbGxvY3ooc2l6ZW9mKCpyZWYpKTsKKyAgICBpZiAoIXJlZikgeworICAgICAgICBhdl9mcmVlcCgmYnVmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmVmLT5idWZmZXIgPSBidWY7CisgICAgcmVmLT5kYXRhICAgPSBkYXRhOworICAgIHJlZi0+c2l6ZSAgID0gc2l6ZTsKKworICAgIHJldHVybiByZWY7Cit9CisKK3ZvaWQgYXZfYnVmZmVyX2RlZmF1bHRfZnJlZSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCit7CisgICAgYXZfZnJlZShkYXRhKTsKK30KKworQVZCdWZmZXJSZWYgKmF2X2J1ZmZlcl9hbGxvYyhpbnQgc2l6ZSkKK3sKKyAgICBBVkJ1ZmZlclJlZiAqcmV0ID0gTlVMTDsKKyAgICB1aW50OF90ICAgICpkYXRhID0gTlVMTDsKKworICAgIGRhdGEgPSBhdl9tYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFkYXRhKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldCA9IGF2X2J1ZmZlcl9jcmVhdGUoZGF0YSwgc2l6ZSwgYXZfYnVmZmVyX2RlZmF1bHRfZnJlZSwgTlVMTCwgMCk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIGF2X2ZyZWVwKCZkYXRhKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK0FWQnVmZmVyUmVmICphdl9idWZmZXJfYWxsb2N6KGludCBzaXplKQoreworICAgIEFWQnVmZmVyUmVmICpyZXQgPSBhdl9idWZmZXJfYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbWVtc2V0KHJldC0+ZGF0YSwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIHJldDsKK30KKworQVZCdWZmZXJSZWYgKmF2X2J1ZmZlcl9yZWYoQVZCdWZmZXJSZWYgKmJ1ZikKK3sKKyAgICBBVkJ1ZmZlclJlZiAqcmV0ID0gYXZfbWFsbG9jeihzaXplb2YoKnJldCkpOworCisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgKnJldCA9ICpidWY7CisKKyAgICBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZidWYtPmJ1ZmZlci0+cmVmY291bnQsIDEpOworCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBhdl9idWZmZXJfdW5yZWYoQVZCdWZmZXJSZWYgKipidWYpCit7CisgICAgQVZCdWZmZXIgKmI7CisKKyAgICBpZiAoIWJ1ZiB8fCAhKmJ1ZikKKyAgICAgICAgcmV0dXJuOworICAgIGIgPSAoKmJ1ZiktPmJ1ZmZlcjsKKyAgICBhdl9mcmVlcChidWYpOworCisgICAgaWYgKCFhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZiLT5yZWZjb3VudCwgLTEpKSB7CisgICAgICAgIGItPmZyZWUoYi0+b3BhcXVlLCBiLT5kYXRhKTsKKyAgICAgICAgYXZfZnJlZXAoJmIpOworICAgIH0KK30KKworaW50IGF2X2J1ZmZlcl9pc193cml0YWJsZShjb25zdCBBVkJ1ZmZlclJlZiAqYnVmKQoreworICAgIGlmIChidWYtPmJ1ZmZlci0+ZmxhZ3MgJiBBVl9CVUZGRVJfRkxBR19SRUFET05MWSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gYXZwcml2X2F0b21pY19pbnRfZ2V0KCZidWYtPmJ1ZmZlci0+cmVmY291bnQpID09IDE7Cit9CisKK3ZvaWQgKmF2X2J1ZmZlcl9nZXRfb3BhcXVlKGNvbnN0IEFWQnVmZmVyUmVmICpidWYpCit7CisgICAgcmV0dXJuIGJ1Zi0+YnVmZmVyLT5vcGFxdWU7Cit9CisKK2ludCBhdl9idWZmZXJfZ2V0X3JlZl9jb3VudChjb25zdCBBVkJ1ZmZlclJlZiAqYnVmKQoreworICAgIHJldHVybiBidWYtPmJ1ZmZlci0+cmVmY291bnQ7Cit9CisKK2ludCBhdl9idWZmZXJfbWFrZV93cml0YWJsZShBVkJ1ZmZlclJlZiAqKnBidWYpCit7CisgICAgQVZCdWZmZXJSZWYgKm5ld2J1ZiwgKmJ1ZiA9ICpwYnVmOworCisgICAgaWYgKGF2X2J1ZmZlcl9pc193cml0YWJsZShidWYpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG5ld2J1ZiA9IGF2X2J1ZmZlcl9hbGxvYyhidWYtPnNpemUpOworICAgIGlmICghbmV3YnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgbWVtY3B5KG5ld2J1Zi0+ZGF0YSwgYnVmLT5kYXRhLCBidWYtPnNpemUpOworICAgIGF2X2J1ZmZlcl91bnJlZihwYnVmKTsKKyAgICAqcGJ1ZiA9IG5ld2J1ZjsKKworICAgIHJldHVybiAwOworfQorCitpbnQgYXZfYnVmZmVyX3JlYWxsb2MoQVZCdWZmZXJSZWYgKipwYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBBVkJ1ZmZlclJlZiAqYnVmID0gKnBidWY7CisgICAgdWludDhfdCAqdG1wOworCisgICAgaWYgKCFidWYpIHsKKyAgICAgICAgLyogYWxsb2NhdGUgYSBuZXcgYnVmZmVyIHdpdGggYXZfcmVhbGxvYygpLCBzbyBpdCB3aWxsIGJlIHJlYWxsb2NhdGFibGUKKyAgICAgICAgICogbGF0ZXIgKi8KKyAgICAgICAgdWludDhfdCAqZGF0YSA9IGF2X3JlYWxsb2MoTlVMTCwgc2l6ZSk7CisgICAgICAgIGlmICghZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgYnVmID0gYXZfYnVmZmVyX2NyZWF0ZShkYXRhLCBzaXplLCBhdl9idWZmZXJfZGVmYXVsdF9mcmVlLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKCFidWYpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZkYXRhKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBidWYtPmJ1ZmZlci0+ZmxhZ3MgfD0gQlVGRkVSX0ZMQUdfUkVBTExPQ0FUQUJMRTsKKyAgICAgICAgKnBidWYgPSBidWY7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChidWYtPnNpemUgPT0gc2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIShidWYtPmJ1ZmZlci0+ZmxhZ3MgJiBCVUZGRVJfRkxBR19SRUFMTE9DQVRBQkxFKSB8fAorICAgICAgICAhYXZfYnVmZmVyX2lzX3dyaXRhYmxlKGJ1ZikpIHsKKyAgICAgICAgLyogY2Fubm90IHJlYWxsb2MsIGFsbG9jYXRlIGEgbmV3IHJlYWxsb2NhYmxlIGJ1ZmZlciBhbmQgY29weSBkYXRhICovCisgICAgICAgIEFWQnVmZmVyUmVmICpuZXcgPSBOVUxMOworCisgICAgICAgIGF2X2J1ZmZlcl9yZWFsbG9jKCZuZXcsIHNpemUpOworICAgICAgICBpZiAoIW5ldykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgbWVtY3B5KG5ldy0+ZGF0YSwgYnVmLT5kYXRhLCBGRk1JTihzaXplLCBidWYtPnNpemUpKTsKKworICAgICAgICBhdl9idWZmZXJfdW5yZWYocGJ1Zik7CisgICAgICAgICpwYnVmID0gbmV3OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB0bXAgPSBhdl9yZWFsbG9jKGJ1Zi0+YnVmZmVyLT5kYXRhLCBzaXplKTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGJ1Zi0+YnVmZmVyLT5kYXRhID0gYnVmLT5kYXRhID0gdG1wOworICAgIGJ1Zi0+YnVmZmVyLT5zaXplID0gYnVmLT5zaXplID0gc2l6ZTsKKyAgICByZXR1cm4gMDsKK30KKworQVZCdWZmZXJQb29sICphdl9idWZmZXJfcG9vbF9pbml0KGludCBzaXplLCBBVkJ1ZmZlclJlZiogKCphbGxvYykoaW50IHNpemUpKQoreworICAgIEFWQnVmZmVyUG9vbCAqcG9vbCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpwb29sKSk7CisgICAgaWYgKCFwb29sKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZmX211dGV4X2luaXQoJnBvb2wtPm11dGV4LCBOVUxMKTsKKworICAgIHBvb2wtPnNpemUgICAgID0gc2l6ZTsKKyAgICBwb29sLT5hbGxvYyAgICA9IGFsbG9jID8gYWxsb2MgOiBhdl9idWZmZXJfYWxsb2M7CisKKyAgICBhdnByaXZfYXRvbWljX2ludF9zZXQoJnBvb2wtPnJlZmNvdW50LCAxKTsKKworICAgIHJldHVybiBwb29sOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aGVuIHRoZSBwb29sIGhhcyBiZWVuIHVuaW5pdGVkIGFuZAorICogYWxsIHRoZSBidWZmZXJzIHJldHVybmVkIHRvIGl0LgorICovCitzdGF0aWMgdm9pZCBidWZmZXJfcG9vbF9mcmVlKEFWQnVmZmVyUG9vbCAqcG9vbCkKK3sKKyAgICB3aGlsZSAocG9vbC0+cG9vbCkgeworICAgICAgICBCdWZmZXJQb29sRW50cnkgKmJ1ZiA9IHBvb2wtPnBvb2w7CisgICAgICAgIHBvb2wtPnBvb2wgPSBidWYtPm5leHQ7CisKKyAgICAgICAgYnVmLT5mcmVlKGJ1Zi0+b3BhcXVlLCBidWYtPmRhdGEpOworICAgICAgICBhdl9mcmVlcCgmYnVmKTsKKyAgICB9CisgICAgZmZfbXV0ZXhfZGVzdHJveSgmcG9vbC0+bXV0ZXgpOworICAgIGF2X2ZyZWVwKCZwb29sKTsKK30KKwordm9pZCBhdl9idWZmZXJfcG9vbF91bmluaXQoQVZCdWZmZXJQb29sICoqcHBvb2wpCit7CisgICAgQVZCdWZmZXJQb29sICpwb29sOworCisgICAgaWYgKCFwcG9vbCB8fCAhKnBwb29sKQorICAgICAgICByZXR1cm47CisgICAgcG9vbCAgID0gKnBwb29sOworICAgICpwcG9vbCA9IE5VTEw7CisKKyAgICBpZiAoIWF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2goJnBvb2wtPnJlZmNvdW50LCAtMSkpCisgICAgICAgIGJ1ZmZlcl9wb29sX2ZyZWUocG9vbCk7Cit9CisKKy8qIHJlbW92ZSB0aGUgd2hvbGUgYnVmZmVyIGxpc3QgZnJvbSB0aGUgcG9vbCBhbmQgcmV0dXJuIGl0ICovCitzdGF0aWMgQnVmZmVyUG9vbEVudHJ5ICpnZXRfcG9vbChBVkJ1ZmZlclBvb2wgKnBvb2wpCit7CisgICAgQnVmZmVyUG9vbEVudHJ5ICpjdXIgPSAqKHZvaWQgKiB2b2xhdGlsZSAqKSZwb29sLT5wb29sLCAqbGFzdCA9IE5VTEw7CisKKyAgICB3aGlsZSAoY3VyICE9IGxhc3QpIHsKKyAgICAgICAgbGFzdCA9IGN1cjsKKyAgICAgICAgY3VyID0gYXZwcml2X2F0b21pY19wdHJfY2FzKCh2b2lkICogdm9sYXRpbGUgKikmcG9vbC0+cG9vbCwgbGFzdCwgTlVMTCk7CisgICAgICAgIGlmICghY3VyKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGN1cjsKK30KKworc3RhdGljIHZvaWQgYWRkX3RvX3Bvb2woQnVmZmVyUG9vbEVudHJ5ICpidWYpCit7CisgICAgQVZCdWZmZXJQb29sICpwb29sOworICAgIEJ1ZmZlclBvb2xFbnRyeSAqY3VyLCAqZW5kID0gYnVmOworCisgICAgaWYgKCFidWYpCisgICAgICAgIHJldHVybjsKKyAgICBwb29sID0gYnVmLT5wb29sOworCisgICAgd2hpbGUgKGVuZC0+bmV4dCkKKyAgICAgICAgZW5kID0gZW5kLT5uZXh0OworCisgICAgd2hpbGUgKGF2cHJpdl9hdG9taWNfcHRyX2Nhcygodm9pZCAqIHZvbGF0aWxlICopJnBvb2wtPnBvb2wsIE5VTEwsIGJ1ZikpIHsKKyAgICAgICAgLyogcG9vbCBpcyBub3QgZW1wdHksIHJldHJpZXZlIGl0IGFuZCBhcHBlbmQgaXQgdG8gb3VyIGxpc3QgKi8KKyAgICAgICAgY3VyID0gZ2V0X3Bvb2wocG9vbCk7CisgICAgICAgIGVuZC0+bmV4dCA9IGN1cjsKKyAgICAgICAgd2hpbGUgKGVuZC0+bmV4dCkKKyAgICAgICAgICAgIGVuZCA9IGVuZC0+bmV4dDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBvb2xfcmVsZWFzZV9idWZmZXIodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKQoreworICAgIEJ1ZmZlclBvb2xFbnRyeSAqYnVmID0gb3BhcXVlOworICAgIEFWQnVmZmVyUG9vbCAqcG9vbCA9IGJ1Zi0+cG9vbDsKKworICAgIGlmKENPTkZJR19NRU1PUllfUE9JU09OSU5HKQorICAgICAgICBtZW1zZXQoYnVmLT5kYXRhLCBGRl9NRU1PUllfUE9JU09OLCBwb29sLT5zaXplKTsKKworI2lmIFVTRV9BVE9NSUNTCisgICAgYWRkX3RvX3Bvb2woYnVmKTsKKyNlbHNlCisgICAgZmZfbXV0ZXhfbG9jaygmcG9vbC0+bXV0ZXgpOworICAgIGJ1Zi0+bmV4dCA9IHBvb2wtPnBvb2w7CisgICAgcG9vbC0+cG9vbCA9IGJ1ZjsKKyAgICBmZl9tdXRleF91bmxvY2soJnBvb2wtPm11dGV4KTsKKyNlbmRpZgorCisgICAgaWYgKCFhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZwb29sLT5yZWZjb3VudCwgLTEpKQorICAgICAgICBidWZmZXJfcG9vbF9mcmVlKHBvb2wpOworfQorCisvKiBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgYW5kIG92ZXJyaWRlIGl0cyBmcmVlKCkgY2FsbGJhY2sgc28gdGhhdAorICogaXQgaXMgcmV0dXJuZWQgdG8gdGhlIHBvb2wgb24gZnJlZSAqLworc3RhdGljIEFWQnVmZmVyUmVmICpwb29sX2FsbG9jX2J1ZmZlcihBVkJ1ZmZlclBvb2wgKnBvb2wpCit7CisgICAgQnVmZmVyUG9vbEVudHJ5ICpidWY7CisgICAgQVZCdWZmZXJSZWYgICAgICpyZXQ7CisKKyAgICByZXQgPSBwb29sLT5hbGxvYyhwb29sLT5zaXplKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBidWYgPSBhdl9tYWxsb2N6KHNpemVvZigqYnVmKSk7CisgICAgaWYgKCFidWYpIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZyZXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBidWYtPmRhdGEgICA9IHJldC0+YnVmZmVyLT5kYXRhOworICAgIGJ1Zi0+b3BhcXVlID0gcmV0LT5idWZmZXItPm9wYXF1ZTsKKyAgICBidWYtPmZyZWUgICA9IHJldC0+YnVmZmVyLT5mcmVlOworICAgIGJ1Zi0+cG9vbCAgID0gcG9vbDsKKworICAgIHJldC0+YnVmZmVyLT5vcGFxdWUgPSBidWY7CisgICAgcmV0LT5idWZmZXItPmZyZWUgICA9IHBvb2xfcmVsZWFzZV9idWZmZXI7CisKKyNpZiBVU0VfQVRPTUlDUworICAgIGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2goJnBvb2wtPnJlZmNvdW50LCAxKTsKKyAgICBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZwb29sLT5uYl9hbGxvY2F0ZWQsIDEpOworI2VuZGlmCisKKyAgICByZXR1cm4gcmV0OworfQorCitBVkJ1ZmZlclJlZiAqYXZfYnVmZmVyX3Bvb2xfZ2V0KEFWQnVmZmVyUG9vbCAqcG9vbCkKK3sKKyAgICBBVkJ1ZmZlclJlZiAqcmV0OworICAgIEJ1ZmZlclBvb2xFbnRyeSAqYnVmOworCisjaWYgVVNFX0FUT01JQ1MKKyAgICAvKiBjaGVjayB3aGV0aGVyIHRoZSBwb29sIGlzIGVtcHR5ICovCisgICAgYnVmID0gZ2V0X3Bvb2wocG9vbCk7CisgICAgaWYgKCFidWYgJiYgcG9vbC0+cmVmY291bnQgPD0gcG9vbC0+bmJfYWxsb2NhdGVkKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJQb29sIHJhY2UgZGVjdGVjdGVkLCBzcGluaW5nIHRvIGF2b2lkIG92ZXJhbGxvY2F0aW9uIGFuZCBldmVudHVhbCBPT01cbiIpOworICAgICAgICB3aGlsZSAoIWJ1ZiAmJiBhdnByaXZfYXRvbWljX2ludF9nZXQoJnBvb2wtPnJlZmNvdW50KSA8PSBhdnByaXZfYXRvbWljX2ludF9nZXQoJnBvb2wtPm5iX2FsbG9jYXRlZCkpCisgICAgICAgICAgICBidWYgPSBnZXRfcG9vbChwb29sKTsKKyAgICB9CisKKyAgICBpZiAoIWJ1ZikKKyAgICAgICAgcmV0dXJuIHBvb2xfYWxsb2NfYnVmZmVyKHBvb2wpOworCisgICAgLyoga2VlcCB0aGUgZmlyc3QgZW50cnksIHJldHVybiB0aGUgcmVzdCBvZiB0aGUgbGlzdCB0byB0aGUgcG9vbCAqLworICAgIGFkZF90b19wb29sKGJ1Zi0+bmV4dCk7CisgICAgYnVmLT5uZXh0ID0gTlVMTDsKKworICAgIHJldCA9IGF2X2J1ZmZlcl9jcmVhdGUoYnVmLT5kYXRhLCBwb29sLT5zaXplLCBwb29sX3JlbGVhc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCAwKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgICBhZGRfdG9fcG9vbChidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjZWxzZQorICAgIGZmX211dGV4X2xvY2soJnBvb2wtPm11dGV4KTsKKyAgICBidWYgPSBwb29sLT5wb29sOworICAgIGlmIChidWYpIHsKKyAgICAgICAgcmV0ID0gYXZfYnVmZmVyX2NyZWF0ZShidWYtPmRhdGEsIHBvb2wtPnNpemUsIHBvb2xfcmVsZWFzZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCAwKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgcG9vbC0+cG9vbCA9IGJ1Zi0+bmV4dDsKKyAgICAgICAgICAgIGJ1Zi0+bmV4dCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBwb29sX2FsbG9jX2J1ZmZlcihwb29sKTsKKyAgICB9CisgICAgZmZfbXV0ZXhfdW5sb2NrKCZwb29sLT5tdXRleCk7CisjZW5kaWYKKworICAgIGlmIChyZXQpCisgICAgICAgIGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2goJnBvb2wtPnJlZmNvdW50LCAxKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2J1ZmZlci5oIGIvZmZtcGVnL2xpYmF2dXRpbC9idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDM5OWZkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9idWZmZXIuaApAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAaW5ncm91cCBsYXZ1X2J1ZmZlcgorICogcmVmY291bnRlZCBkYXRhIGJ1ZmZlciBBUEkKKyAqLworCisjaWZuZGVmIEFWVVRJTF9CVUZGRVJfSAorI2RlZmluZSBBVlVUSUxfQlVGRkVSX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIEBkZWZncm91cCBsYXZ1X2J1ZmZlciBBVkJ1ZmZlcgorICogQGluZ3JvdXAgbGF2dV9kYXRhCisgKgorICogQHsKKyAqIEFWQnVmZmVyIGlzIGFuIEFQSSBmb3IgcmVmZXJlbmNlLWNvdW50ZWQgZGF0YSBidWZmZXJzLgorICoKKyAqIFRoZXJlIGFyZSB0d28gY29yZSBvYmplY3RzIGluIHRoaXMgQVBJIC0tIEFWQnVmZmVyIGFuZCBBVkJ1ZmZlclJlZi4gQVZCdWZmZXIKKyAqIHJlcHJlc2VudHMgdGhlIGRhdGEgYnVmZmVyIGl0c2VsZjsgaXQgaXMgb3BhcXVlIGFuZCBub3QgbWVhbnQgdG8gYmUgYWNjZXNzZWQKKyAqIGJ5IHRoZSBjYWxsZXIgZGlyZWN0bHksIGJ1dCBvbmx5IHRocm91Z2ggQVZCdWZmZXJSZWYuIEhvd2V2ZXIsIHRoZSBjYWxsZXIgbWF5CisgKiBlLmcuIGNvbXBhcmUgdHdvIEFWQnVmZmVyIHBvaW50ZXJzIHRvIGNoZWNrIHdoZXRoZXIgdHdvIGRpZmZlcmVudCByZWZlcmVuY2VzCisgKiBhcmUgZGVzY3JpYmluZyB0aGUgc2FtZSBkYXRhIGJ1ZmZlci4gQVZCdWZmZXJSZWYgcmVwcmVzZW50cyBhIHNpbmdsZQorICogcmVmZXJlbmNlIHRvIGFuIEFWQnVmZmVyIGFuZCBpdCBpcyB0aGUgb2JqZWN0IHRoYXQgbWF5IGJlIG1hbmlwdWxhdGVkIGJ5IHRoZQorICogY2FsbGVyIGRpcmVjdGx5LgorICoKKyAqIFRoZXJlIGFyZSB0d28gZnVuY3Rpb25zIHByb3ZpZGVkIGZvciBjcmVhdGluZyBhIG5ldyBBVkJ1ZmZlciB3aXRoIGEgc2luZ2xlCisgKiByZWZlcmVuY2UgLS0gYXZfYnVmZmVyX2FsbG9jKCkgdG8ganVzdCBhbGxvY2F0ZSBhIG5ldyBidWZmZXIsIGFuZAorICogYXZfYnVmZmVyX2NyZWF0ZSgpIHRvIHdyYXAgYW4gZXhpc3RpbmcgYXJyYXkgaW4gYW4gQVZCdWZmZXIuIEZyb20gYW4gZXhpc3RpbmcKKyAqIHJlZmVyZW5jZSwgYWRkaXRpb25hbCByZWZlcmVuY2VzIG1heSBiZSBjcmVhdGVkIHdpdGggYXZfYnVmZmVyX3JlZigpLgorICogVXNlIGF2X2J1ZmZlcl91bnJlZigpIHRvIGZyZWUgYSByZWZlcmVuY2UgKHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGZyZWUgdGhlCisgKiBkYXRhIG9uY2UgYWxsIHRoZSByZWZlcmVuY2VzIGFyZSBmcmVlZCkuCisgKgorICogVGhlIGNvbnZlbnRpb24gdGhyb3VnaG91dCB0aGlzIEFQSSBhbmQgdGhlIHJlc3Qgb2YgRkZtcGVnIGlzIHN1Y2ggdGhhdCB0aGUKKyAqIGJ1ZmZlciBpcyBjb25zaWRlcmVkIHdyaXRhYmxlIGlmIHRoZXJlIGV4aXN0cyBvbmx5IG9uZSByZWZlcmVuY2UgdG8gaXQgKGFuZAorICogaXQgaGFzIG5vdCBiZWVuIG1hcmtlZCBhcyByZWFkLW9ubHkpLiBUaGUgYXZfYnVmZmVyX2lzX3dyaXRhYmxlKCkgZnVuY3Rpb24gaXMKKyAqIHByb3ZpZGVkIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyB0cnVlIGFuZCBhdl9idWZmZXJfbWFrZV93cml0YWJsZSgpIHdpbGwKKyAqIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgbmV3IHdyaXRhYmxlIGJ1ZmZlciB3aGVuIG5lY2Vzc2FyeS4KKyAqIE9mIGNvdXJzZSBub3RoaW5nIHByZXZlbnRzIHRoZSBjYWxsaW5nIGNvZGUgZnJvbSB2aW9sYXRpbmcgdGhpcyBjb252ZW50aW9uLAorICogaG93ZXZlciB0aGF0IGlzIHNhZmUgb25seSB3aGVuIGFsbCB0aGUgZXhpc3RpbmcgcmVmZXJlbmNlcyBhcmUgdW5kZXIgaXRzCisgKiBjb250cm9sLgorICoKKyAqIEBub3RlIFJlZmVyZW5jaW5nIGFuZCB1bnJlZmVyZW5jaW5nIHRoZSBidWZmZXJzIGlzIHRocmVhZC1zYWZlIGFuZCB0aHVzCisgKiBtYXkgYmUgZG9uZSBmcm9tIG11bHRpcGxlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkgd2l0aG91dCBhbnkgbmVlZCBmb3IKKyAqIGFkZGl0aW9uYWwgbG9ja2luZy4KKyAqCisgKiBAbm90ZSBUd28gZGlmZmVyZW50IHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgYnVmZmVyIGNhbiBwb2ludCB0byBkaWZmZXJlbnQKKyAqIHBhcnRzIG9mIHRoZSBidWZmZXIgKGkuZS4gdGhlaXIgQVZCdWZmZXJSZWYuZGF0YSB3aWxsIG5vdCBiZSBlcXVhbCkuCisgKi8KKworLyoqCisgKiBBIHJlZmVyZW5jZSBjb3VudGVkIGJ1ZmZlciB0eXBlLiBJdCBpcyBvcGFxdWUgYW5kIGlzIG1lYW50IHRvIGJlIHVzZWQgdGhyb3VnaAorICogcmVmZXJlbmNlcyAoQVZCdWZmZXJSZWYpLgorICovCit0eXBlZGVmIHN0cnVjdCBBVkJ1ZmZlciBBVkJ1ZmZlcjsKKworLyoqCisgKiBBIHJlZmVyZW5jZSB0byBhIGRhdGEgYnVmZmVyLgorICoKKyAqIFRoZSBzaXplIG9mIHRoaXMgc3RydWN0IGlzIG5vdCBhIHBhcnQgb2YgdGhlIHB1YmxpYyBBQkkgYW5kIGl0IGlzIG5vdCBtZWFudAorICogdG8gYmUgYWxsb2NhdGVkIGRpcmVjdGx5LgorICovCit0eXBlZGVmIHN0cnVjdCBBVkJ1ZmZlclJlZiB7CisgICAgQVZCdWZmZXIgKmJ1ZmZlcjsKKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIGJ1ZmZlci4gSXQgaXMgY29uc2lkZXJlZCB3cml0YWJsZSBpZiBhbmQgb25seSBpZgorICAgICAqIHRoaXMgaXMgdGhlIG9ubHkgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIsIGluIHdoaWNoIGNhc2UKKyAgICAgKiBhdl9idWZmZXJfaXNfd3JpdGFibGUoKSByZXR1cm5zIDEuCisgICAgICovCisgICAgdWludDhfdCAqZGF0YTsKKyAgICAvKioKKyAgICAgKiBTaXplIG9mIGRhdGEgaW4gYnl0ZXMuCisgICAgICovCisgICAgaW50ICAgICAgc2l6ZTsKK30gQVZCdWZmZXJSZWY7CisKKy8qKgorICogQWxsb2NhdGUgYW4gQVZCdWZmZXIgb2YgdGhlIGdpdmVuIHNpemUgdXNpbmcgYXZfbWFsbG9jKCkuCisgKgorICogQHJldHVybiBhbiBBVkJ1ZmZlclJlZiBvZiBnaXZlbiBzaXplIG9yIE5VTEwgd2hlbiBvdXQgb2YgbWVtb3J5CisgKi8KK0FWQnVmZmVyUmVmICphdl9idWZmZXJfYWxsb2MoaW50IHNpemUpOworCisvKioKKyAqIFNhbWUgYXMgYXZfYnVmZmVyX2FsbG9jKCksIGV4Y2VwdCB0aGUgcmV0dXJuZWQgYnVmZmVyIHdpbGwgYmUgaW5pdGlhbGl6ZWQKKyAqIHRvIHplcm8uCisgKi8KK0FWQnVmZmVyUmVmICphdl9idWZmZXJfYWxsb2N6KGludCBzaXplKTsKKworLyoqCisgKiBBbHdheXMgdHJlYXQgdGhlIGJ1ZmZlciBhcyByZWFkLW9ubHksIGV2ZW4gd2hlbiBpdCBoYXMgb25seSBvbmUKKyAqIHJlZmVyZW5jZS4KKyAqLworI2RlZmluZSBBVl9CVUZGRVJfRkxBR19SRUFET05MWSAoMSA8PCAwKQorCisvKioKKyAqIENyZWF0ZSBhbiBBVkJ1ZmZlciBmcm9tIGFuIGV4aXN0aW5nIGFycmF5LgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgZGF0YSBpcyBvd25lZCBieSB0aGUgQVZCdWZmZXIuIFRoZSBjYWxsZXIgbWF5CisgKiBvbmx5IGFjY2VzcyBkYXRhIHRocm91Z2ggdGhlIHJldHVybmVkIEFWQnVmZmVyUmVmIGFuZCByZWZlcmVuY2VzIGRlcml2ZWQgZnJvbQorICogaXQuCisgKiBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCBkYXRhIGlzIGxlZnQgdW50b3VjaGVkLgorICogQHBhcmFtIGRhdGEgICBkYXRhIGFycmF5CisgKiBAcGFyYW0gc2l6ZSAgIHNpemUgb2YgZGF0YSBpbiBieXRlcworICogQHBhcmFtIGZyZWUgICBhIGNhbGxiYWNrIGZvciBmcmVlaW5nIHRoaXMgYnVmZmVyJ3MgZGF0YQorICogQHBhcmFtIG9wYXF1ZSBwYXJhbWV0ZXIgdG8gYmUgZ290IGZvciBwcm9jZXNzaW5nIG9yIHBhc3NlZCB0byBmcmVlCisgKiBAcGFyYW0gZmxhZ3MgIGEgY29tYmluYXRpb24gb2YgQVZfQlVGRkVSX0ZMQUdfKgorICoKKyAqIEByZXR1cm4gYW4gQVZCdWZmZXJSZWYgcmVmZXJyaW5nIHRvIGRhdGEgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICovCitBVkJ1ZmZlclJlZiAqYXZfYnVmZmVyX2NyZWF0ZSh1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmcmVlKSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlLCBpbnQgZmxhZ3MpOworCisvKioKKyAqIERlZmF1bHQgZnJlZSBjYWxsYmFjaywgd2hpY2ggY2FsbHMgYXZfZnJlZSgpIG9uIHRoZSBidWZmZXIgZGF0YS4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgcGFzc2VkIHRvIGF2X2J1ZmZlcl9jcmVhdGUoKSwgbm90IGNhbGxlZAorICogZGlyZWN0bHkuCisgKi8KK3ZvaWQgYXZfYnVmZmVyX2RlZmF1bHRfZnJlZSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpOworCisvKioKKyAqIENyZWF0ZSBhIG5ldyByZWZlcmVuY2UgdG8gYW4gQVZCdWZmZXIuCisgKgorICogQHJldHVybiBhIG5ldyBBVkJ1ZmZlclJlZiByZWZlcnJpbmcgdG8gdGhlIHNhbWUgQVZCdWZmZXIgYXMgYnVmIG9yIE5VTEwgb24KKyAqIGZhaWx1cmUuCisgKi8KK0FWQnVmZmVyUmVmICphdl9idWZmZXJfcmVmKEFWQnVmZmVyUmVmICpidWYpOworCisvKioKKyAqIEZyZWUgYSBnaXZlbiByZWZlcmVuY2UgYW5kIGF1dG9tYXRpY2FsbHkgZnJlZSB0aGUgYnVmZmVyIGlmIHRoZXJlIGFyZSBubyBtb3JlCisgKiByZWZlcmVuY2VzIHRvIGl0LgorICoKKyAqIEBwYXJhbSBidWYgdGhlIHJlZmVyZW5jZSB0byBiZSBmcmVlZC4gVGhlIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwgb24gcmV0dXJuLgorICovCit2b2lkIGF2X2J1ZmZlcl91bnJlZihBVkJ1ZmZlclJlZiAqKmJ1Zik7CisKKy8qKgorICogQHJldHVybiAxIGlmIHRoZSBjYWxsZXIgbWF5IHdyaXRlIHRvIHRoZSBkYXRhIHJlZmVycmVkIHRvIGJ5IGJ1ZiAod2hpY2ggaXMKKyAqIHRydWUgaWYgYW5kIG9ubHkgaWYgYnVmIGlzIHRoZSBvbmx5IHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBBVkJ1ZmZlcikuCisgKiBSZXR1cm4gMCBvdGhlcndpc2UuCisgKiBBIHBvc2l0aXZlIGFuc3dlciBpcyB2YWxpZCB1bnRpbCBhdl9idWZmZXJfcmVmKCkgaXMgY2FsbGVkIG9uIGJ1Zi4KKyAqLworaW50IGF2X2J1ZmZlcl9pc193cml0YWJsZShjb25zdCBBVkJ1ZmZlclJlZiAqYnVmKTsKKworLyoqCisgKiBAcmV0dXJuIHRoZSBvcGFxdWUgcGFyYW1ldGVyIHNldCBieSBhdl9idWZmZXJfY3JlYXRlLgorICovCit2b2lkICphdl9idWZmZXJfZ2V0X29wYXF1ZShjb25zdCBBVkJ1ZmZlclJlZiAqYnVmKTsKKworaW50IGF2X2J1ZmZlcl9nZXRfcmVmX2NvdW50KGNvbnN0IEFWQnVmZmVyUmVmICpidWYpOworCisvKioKKyAqIENyZWF0ZSBhIHdyaXRhYmxlIHJlZmVyZW5jZSBmcm9tIGEgZ2l2ZW4gYnVmZmVyIHJlZmVyZW5jZSwgYXZvaWRpbmcgZGF0YSBjb3B5CisgKiBpZiBwb3NzaWJsZS4KKyAqCisgKiBAcGFyYW0gYnVmIGJ1ZmZlciByZWZlcmVuY2UgdG8gbWFrZSB3cml0YWJsZS4gT24gc3VjY2VzcywgYnVmIGlzIGVpdGhlciBsZWZ0CisgKiAgICAgICAgICAgIHVudG91Y2hlZCwgb3IgaXQgaXMgdW5yZWZlcmVuY2VkIGFuZCBhIG5ldyB3cml0YWJsZSBBVkJ1ZmZlclJlZiBpcworICogICAgICAgICAgICB3cml0dGVuIGluIGl0cyBwbGFjZS4gT24gZmFpbHVyZSwgYnVmIGlzIGxlZnQgdW50b3VjaGVkLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBvbiBmYWlsdXJlLgorICovCitpbnQgYXZfYnVmZmVyX21ha2Vfd3JpdGFibGUoQVZCdWZmZXJSZWYgKipidWYpOworCisvKioKKyAqIFJlYWxsb2NhdGUgYSBnaXZlbiBidWZmZXIuCisgKgorICogQHBhcmFtIGJ1ZiAgYSBidWZmZXIgcmVmZXJlbmNlIHRvIHJlYWxsb2NhdGUuIE9uIHN1Y2Nlc3MsIGJ1ZiB3aWxsIGJlCisgKiAgICAgICAgICAgICB1bnJlZmVyZW5jZWQgYW5kIGEgbmV3IHJlZmVyZW5jZSB3aXRoIHRoZSByZXF1aXJlZCBzaXplIHdpbGwgYmUKKyAqICAgICAgICAgICAgIHdyaXR0ZW4gaW4gaXRzIHBsYWNlLiBPbiBmYWlsdXJlIGJ1ZiB3aWxsIGJlIGxlZnQgdW50b3VjaGVkLiAqYnVmCisgKiAgICAgICAgICAgICBtYXkgYmUgTlVMTCwgdGhlbiBhIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkLgorICogQHBhcmFtIHNpemUgcmVxdWlyZWQgbmV3IGJ1ZmZlciBzaXplLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBvbiBmYWlsdXJlLgorICoKKyAqIEBub3RlIHRoZSBidWZmZXIgaXMgYWN0dWFsbHkgcmVhbGxvY2F0ZWQgd2l0aCBhdl9yZWFsbG9jKCkgb25seSBpZiBpdCB3YXMKKyAqIGluaXRpYWxseSBhbGxvY2F0ZWQgdGhyb3VnaCBhdl9idWZmZXJfcmVhbGxvYyhOVUxMKSBhbmQgdGhlcmUgaXMgb25seSBvbmUKKyAqIHJlZmVyZW5jZSB0byBpdCAoaS5lLiB0aGUgb25lIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uKS4gSW4gYWxsIG90aGVyIGNhc2VzCisgKiBhIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkIGFuZCB0aGUgZGF0YSBpcyBjb3BpZWQuCisgKi8KK2ludCBhdl9idWZmZXJfcmVhbGxvYyhBVkJ1ZmZlclJlZiAqKmJ1ZiwgaW50IHNpemUpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2dV9idWZmZXJwb29sIEFWQnVmZmVyUG9vbAorICogQGluZ3JvdXAgbGF2dV9kYXRhCisgKgorICogQHsKKyAqIEFWQnVmZmVyUG9vbCBpcyBhbiBBUEkgZm9yIGEgbG9jay1mcmVlIHRocmVhZC1zYWZlIHBvb2wgb2YgQVZCdWZmZXJzLgorICoKKyAqIEZyZXF1ZW50bHkgYWxsb2NhdGluZyBhbmQgZnJlZWluZyBsYXJnZSBidWZmZXJzIG1heSBiZSBzbG93LiBBVkJ1ZmZlclBvb2wgaXMKKyAqIG1lYW50IHRvIHNvbHZlIHRoaXMgaW4gY2FzZXMgd2hlbiB0aGUgY2FsbGVyIG5lZWRzIGEgc2V0IG9mIGJ1ZmZlcnMgb2YgdGhlCisgKiBzYW1lIHNpemUgKHRoZSBtb3N0IG9idmlvdXMgdXNlIGNhc2UgYmVpbmcgYnVmZmVycyBmb3IgcmF3IHZpZGVvIG9yIGF1ZGlvCisgKiBmcmFtZXMpLgorICoKKyAqIEF0IHRoZSBiZWdpbm5pbmcsIHRoZSB1c2VyIG11c3QgY2FsbCBhdl9idWZmZXJfcG9vbF9pbml0KCkgdG8gY3JlYXRlIHRoZQorICogYnVmZmVyIHBvb2wuIFRoZW4gd2hlbmV2ZXIgYSBidWZmZXIgaXMgbmVlZGVkLCBjYWxsIGF2X2J1ZmZlcl9wb29sX2dldCgpIHRvCisgKiBnZXQgYSByZWZlcmVuY2UgdG8gYSBuZXcgYnVmZmVyLCBzaW1pbGFyIHRvIGF2X2J1ZmZlcl9hbGxvYygpLiBUaGlzIG5ldworICogcmVmZXJlbmNlIHdvcmtzIGluIGFsbCBhc3BlY3RzIHRoZSBzYW1lIHdheSBhcyB0aGUgb25lIGNyZWF0ZWQgYnkKKyAqIGF2X2J1ZmZlcl9hbGxvYygpLiBIb3dldmVyLCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGlzIGJ1ZmZlciBpcworICogdW5yZWZlcmVuY2VkLCBpdCBpcyByZXR1cm5lZCB0byB0aGUgcG9vbCBpbnN0ZWFkIG9mIGJlaW5nIGZyZWVkIGFuZCB3aWxsIGJlCisgKiByZXVzZWQgZm9yIHN1YnNlcXVlbnQgYXZfYnVmZmVyX3Bvb2xfZ2V0KCkgY2FsbHMuCisgKgorICogV2hlbiB0aGUgY2FsbGVyIGlzIGRvbmUgd2l0aCB0aGUgcG9vbCBhbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIGFsbG9jYXRlIGFueSBuZXcKKyAqIGJ1ZmZlcnMsIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgpIG11c3QgYmUgY2FsbGVkIHRvIG1hcmsgdGhlIHBvb2wgYXMgZnJlZWFibGUuCisgKiBPbmNlIGFsbCB0aGUgYnVmZmVycyBhcmUgcmVsZWFzZWQsIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBmcmVlZC4KKyAqCisgKiBBbGxvY2F0aW5nIGFuZCByZWxlYXNpbmcgYnVmZmVycyB3aXRoIHRoaXMgQVBJIGlzIHRocmVhZC1zYWZlIGFzIGxvbmcgYXMKKyAqIGVpdGhlciB0aGUgZGVmYXVsdCBhbGxvYyBjYWxsYmFjayBpcyB1c2VkLCBvciB0aGUgdXNlci1zdXBwbGllZCBvbmUgaXMKKyAqIHRocmVhZC1zYWZlLgorICovCisKKy8qKgorICogVGhlIGJ1ZmZlciBwb29sLiBUaGlzIHN0cnVjdHVyZSBpcyBvcGFxdWUgYW5kIG5vdCBtZWFudCB0byBiZSBhY2Nlc3NlZAorICogZGlyZWN0bHkuIEl0IGlzIGFsbG9jYXRlZCB3aXRoIGF2X2J1ZmZlcl9wb29sX2luaXQoKSBhbmQgZnJlZWQgd2l0aAorICogYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWQnVmZmVyUG9vbCBBVkJ1ZmZlclBvb2w7CisKKy8qKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBidWZmZXIgcG9vbC4KKyAqCisgKiBAcGFyYW0gc2l6ZSBzaXplIG9mIGVhY2ggYnVmZmVyIGluIHRoaXMgcG9vbAorICogQHBhcmFtIGFsbG9jIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWxsb2NhdGUgbmV3IGJ1ZmZlcnMgd2hlbiB0aGUKKyAqIHBvb2wgaXMgZW1wdHkuIE1heSBiZSBOVUxMLCB0aGVuIHRoZSBkZWZhdWx0IGFsbG9jYXRvciB3aWxsIGJlIHVzZWQKKyAqIChhdl9idWZmZXJfYWxsb2MoKSkuCisgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgYnVmZmVyIHBvb2wgb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvci4KKyAqLworQVZCdWZmZXJQb29sICphdl9idWZmZXJfcG9vbF9pbml0KGludCBzaXplLCBBVkJ1ZmZlclJlZiogKCphbGxvYykoaW50IHNpemUpKTsKKworLyoqCisgKiBNYXJrIHRoZSBwb29sIGFzIGJlaW5nIGF2YWlsYWJsZSBmb3IgZnJlZWluZy4gSXQgd2lsbCBhY3R1YWxseSBiZSBmcmVlZCBvbmx5CisgKiBvbmNlIGFsbCB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb29sIGFyZSByZWxlYXNlZC4gVGh1cyBpdAorICogaXMgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2hpbGUgc29tZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgYXJlIHN0aWxsCisgKiBpbiB1c2UuCisgKgorICogQHBhcmFtIHBvb2wgcG9pbnRlciB0byB0aGUgcG9vbCB0byBiZSBmcmVlZC4gSXQgd2lsbCBiZSBzZXQgdG8gTlVMTC4KKyAqIEBzZWUgYXZfYnVmZmVyX3Bvb2xfY2FuX3VuaW5pdCgpCisgKi8KK3ZvaWQgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KEFWQnVmZmVyUG9vbCAqKnBvb2wpOworCisvKioKKyAqIEFsbG9jYXRlIGEgbmV3IEFWQnVmZmVyLCByZXVzaW5nIGFuIG9sZCBidWZmZXIgZnJvbSB0aGUgcG9vbCB3aGVuIGF2YWlsYWJsZS4KKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBzaW11bHRhbmVvdXNseSBmcm9tIG11bHRpcGxlIHRocmVhZHMuCisgKgorICogQHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgbmV3IGJ1ZmZlciBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yLgorICovCitBVkJ1ZmZlclJlZiAqYXZfYnVmZmVyX3Bvb2xfZ2V0KEFWQnVmZmVyUG9vbCAqcG9vbCk7CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZVVElMX0JVRkZFUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2J1ZmZlcl9pbnRlcm5hbC5oIGIvZmZtcGVnL2xpYmF2dXRpbC9idWZmZXJfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjUzMDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9idWZmZXJfaW50ZXJuYWwuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0JVRkZFUl9JTlRFUk5BTF9ICisjZGVmaW5lIEFWVVRJTF9CVUZGRVJfSU5URVJOQUxfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKworLyoqCisgKiBUaGUgYnVmZmVyIGlzIGFsd2F5cyB0cmVhdGVkIGFzIHJlYWQtb25seS4KKyAqLworI2RlZmluZSBCVUZGRVJfRkxBR19SRUFET05MWSAgICAgICgxIDw8IDApCisvKioKKyAqIFRoZSBidWZmZXIgd2FzIGF2X3JlYWxsb2MoKWVkLCBzbyBpdCBpcyByZWFsbG9jYXRhYmxlLgorICovCisjZGVmaW5lIEJVRkZFUl9GTEFHX1JFQUxMT0NBVEFCTEUgKDEgPDwgMSkKKworc3RydWN0IEFWQnVmZmVyIHsKKyAgICB1aW50OF90ICpkYXRhOyAvKio8IGRhdGEgZGVzY3JpYmVkIGJ5IHRoaXMgYnVmZmVyICovCisgICAgaW50ICAgICAgc2l6ZTsgLyoqPCBzaXplIG9mIGRhdGEgaW4gYnl0ZXMgKi8KKworICAgIC8qKgorICAgICAqICBudW1iZXIgb2YgZXhpc3RpbmcgQVZCdWZmZXJSZWYgaW5zdGFuY2VzIHJlZmVycmluZyB0byB0aGlzIGJ1ZmZlcgorICAgICAqLworICAgIHZvbGF0aWxlIGludCByZWZjb3VudDsKKworICAgIC8qKgorICAgICAqIGEgY2FsbGJhY2sgZm9yIGZyZWVpbmcgdGhlIGRhdGEKKyAgICAgKi8KKyAgICB2b2lkICgqZnJlZSkodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKTsKKworICAgIC8qKgorICAgICAqIGFuIG9wYXF1ZSBwb2ludGVyLCB0byBiZSB1c2VkIGJ5IHRoZSBmcmVlaW5nIGNhbGxiYWNrCisgICAgICovCisgICAgdm9pZCAqb3BhcXVlOworCisgICAgLyoqCisgICAgICogQSBjb21iaW5hdGlvbiBvZiBCVUZGRVJfRkxBR18qCisgICAgICovCisgICAgaW50IGZsYWdzOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgQnVmZmVyUG9vbEVudHJ5IHsKKyAgICB1aW50OF90ICpkYXRhOworCisgICAgLyoKKyAgICAgKiBCYWNrdXBzIG9mIHRoZSBvcmlnaW5hbCBvcGFxdWUvZnJlZSBvZiB0aGUgQVZCdWZmZXIgY29ycmVzcG9uZGluZyB0bworICAgICAqIGRhdGEuIFRoZXkgd2lsbCBiZSB1c2VkIHRvIGZyZWUgdGhlIGJ1ZmZlciB3aGVuIHRoZSBwb29sIGlzIGZyZWVkLgorICAgICAqLworICAgIHZvaWQgKm9wYXF1ZTsKKyAgICB2b2lkICgqZnJlZSkodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKTsKKworICAgIEFWQnVmZmVyUG9vbCAqcG9vbDsKKyAgICBzdHJ1Y3QgQnVmZmVyUG9vbEVudHJ5ICpuZXh0OworfSBCdWZmZXJQb29sRW50cnk7CisKK3N0cnVjdCBBVkJ1ZmZlclBvb2wgeworICAgIEFWTXV0ZXggbXV0ZXg7CisgICAgQnVmZmVyUG9vbEVudHJ5ICpwb29sOworCisgICAgLyoKKyAgICAgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgd2hlbiB0aGUgcG9vbCBpcyB0byBiZSBmcmVlZC4KKyAgICAgKiBUaGUgcG9pbnRlciB0byB0aGUgcG9vbCBpdHNlbGYgaGVsZCBieSB0aGUgY2FsbGVyIGlzIGNvbnNpZGVyZWQgdG8KKyAgICAgKiBiZSBvbmUgcmVmZXJlbmNlLiBFYWNoIGJ1ZmZlciByZXF1ZXN0ZWQgYnkgdGhlIGNhbGxlciBpbmNyZWFzZXMgcmVmY291bnQKKyAgICAgKiBieSBvbmUsIHJldHVybmluZyB0aGUgYnVmZmVyIHRvIHRoZSBwb29sIGRlY3JlYXNlcyBpdCBieSBvbmUuCisgICAgICogcmVmY291bnQgcmVhY2hlcyB6ZXJvIHdoZW4gdGhlIGJ1ZmZlciBoYXMgYmVlbiB1bmluaXRlZCBBTkQgYWxsIHRoZQorICAgICAqIGJ1ZmZlcnMgaGF2ZSBiZWVuIHJlbGVhc2VkLCB0aGVuIGl0J3Mgc2FmZSB0byBmcmVlIHRoZSBwb29sIGFuZCBhbGwKKyAgICAgKiB0aGUgYnVmZmVycyBpbiBpdC4KKyAgICAgKi8KKyAgICB2b2xhdGlsZSBpbnQgcmVmY291bnQ7CisKKyAgICB2b2xhdGlsZSBpbnQgbmJfYWxsb2NhdGVkOworCisgICAgaW50IHNpemU7CisgICAgQVZCdWZmZXJSZWYqICgqYWxsb2MpKGludCBzaXplKTsKK307CisKKyNlbmRpZiAvKiBBVlVUSUxfQlVGRkVSX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvY2FzdDUuYyBiL2ZmbXBlZy9saWJhdnV0aWwvY2FzdDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ2ZDFlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9jYXN0NS5jCkBAIC0wLDAgKzEsNTQxIEBACisvKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENBU1QxMjggYWxnb3JpdGhtIGFzIG1lbnRpb25lZCBpbiBSRkMyMTQ0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgU3VwcmFqYSBNZWVkaW50aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImNhc3Q1LmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorCisjZGVmaW5lIElBKHgpICgoeCk+PjI0KQorI2RlZmluZSBJQih4KSAoKCh4KT4+MTYpICYgMHhmZikKKyNkZWZpbmUgSUMoeCkgKCgoeCk+PjgpICYgMHhmZikKKyNkZWZpbmUgSUQoeCkgKCh4KSAmIDB4ZmYpCisKKyNkZWZpbmUgTFIoeCxjKSAoKCh4KTw8KGMpKXwoKHgpPj4oMzItKGMpKSkpCisKKyNkZWZpbmUgRjMobCxyLGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEk9TFIoY3MtPkttW2ldLXIsY3MtPktyW2ldKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZj0oKFMxW0lBKEkpXStTMltJQihJKV0pXlMzW0lDKEkpXSktUzRbSUQoSSldOyAgXAorICAgICAgICBsPWZebDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBGMihsLHIsaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgST1MUihjcy0+S21baV1ecixjcy0+S3JbaV0pOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmPSgoUzFbSUEoSSldLVMyW0lCKEkpXSkrUzNbSUMoSSldKV5TNFtJRChJKV07ICBcCisgICAgICAgIGw9Zl5sOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEYxKGwscixpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJPUxSKGNzLT5LbVtpXStyLGNzLT5LcltpXSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGY9KChTMVtJQShJKV1eUzJbSUIoSSldKS1TM1tJQyhJKV0pK1M0W0lEKEkpXTsgIFwKKyAgICAgICAgbD1mXmw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ09NUFVURV9aICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgelswXT14WzBdXlM1W0lCKHhbM10pXV5TNltJRCh4WzNdKV1eUzdbSUEoeFszXSldXlM4W0lDKHhbM10pXV5TN1tJQSh4WzJdKV07ICAgIFwKKyAgICAgICAgelsxXT14WzJdXlM1W0lBKHpbMF0pXV5TNltJQyh6WzBdKV1eUzdbSUIoelswXSldXlM4W0lEKHpbMF0pXV5TOFtJQyh4WzJdKV07ICAgIFwKKyAgICAgICAgelsyXT14WzNdXlM1W0lEKHpbMV0pXV5TNltJQyh6WzFdKV1eUzdbSUIoelsxXSldXlM4W0lBKHpbMV0pXV5TNVtJQih4WzJdKV07ICAgIFwKKyAgICAgICAgelszXT14WzFdXlM1W0lDKHpbMl0pXV5TNltJQih6WzJdKV1eUzdbSUQoelsyXSldXlM4W0lBKHpbMl0pXV5TNltJRCh4WzJdKV07ICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTVBVVEVfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHhbMF09elsyXV5TNVtJQih6WzFdKV1eUzZbSUQoelsxXSldXlM3W0lBKHpbMV0pXV5TOFtJQyh6WzFdKV1eUzdbSUEoelswXSldOyAgICBcCisgICAgICAgIHhbMV09elswXV5TNVtJQSh4WzBdKV1eUzZbSUMoeFswXSldXlM3W0lCKHhbMF0pXV5TOFtJRCh4WzBdKV1eUzhbSUMoelswXSldOyAgICBcCisgICAgICAgIHhbMl09elsxXV5TNVtJRCh4WzFdKV1eUzZbSUMoeFsxXSldXlM3W0lCKHhbMV0pXV5TOFtJQSh4WzFdKV1eUzVbSUIoelswXSldOyAgICBcCisgICAgICAgIHhbM109elszXV5TNVtJQyh4WzJdKV1eUzZbSUIoeFsyXSldXlM3W0lEKHhbMl0pXV5TOFtJQSh4WzJdKV1eUzZbSUQoelswXSldOyAgICBcCisgICAgfSB3aGlsZSAoMCkKKworCit0eXBlZGVmIHN0cnVjdCBBVkNBU1Q1IHsKKyAgICB1aW50MzJfdCBLbVsxN107CisgICAgdWludDMyX3QgS3JbMTddOworICAgIGludCByb3VuZHM7Cit9IEFWQ0FTVDU7CisKK2NvbnN0IGludCBhdl9jYXN0NV9zaXplPSBzaXplb2YoQVZDQVNUNSk7CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBTMVsyNTZdPXsKKyAgICAweDMwZmI0MGQ0LCAweDlmYTBmZjBiLCAweDZiZWNjZDJmLCAweDNmMjU4YzdhLCAweDFlMjEzZjJmLCAweDljMDA0ZGQzLCAweDYwMDNlNTQwLCAweGNmOWZjOTQ5LAorICAgIDB4YmZkNGFmMjcsIDB4ODhiYmJkYjUsIDB4ZTIwMzQwOTAsIDB4OThkMDk2NzUsIDB4NmU2M2EwZTAsIDB4MTVjMzYxZDIsIDB4YzJlNzY2MWQsIDB4MjJkNGZmOGUsCisgICAgMHgyODY4M2I2ZiwgMHhjMDdmZDA1OSwgMHhmZjIzNzljOCwgMHg3NzVmNTBlMiwgMHg0M2MzNDBkMywgMHhkZjJmODY1NiwgMHg4ODdjYTQxYSwgMHhhMmQyYmQyZCwKKyAgICAweGExYzllMGQ2LCAweDM0NmM0ODE5LCAweDYxYjc2ZDg3LCAweDIyNTQwZjJmLCAweDJhYmUzMmUxLCAweGFhNTQxNjZiLCAweDIyNTY4ZTNhLCAweGEyZDM0MWQwLAorICAgIDB4NjZkYjQwYzgsIDB4YTc4NDM5MmYsIDB4MDA0ZGZmMmYsIDB4MmRiOWQyZGUsIDB4OTc5NDNmYWMsIDB4NGE5N2MxZDgsIDB4NTI3NjQ0YjcsIDB4YjVmNDM3YTcsCisgICAgMHhiODJjYmFlZiwgMHhkNzUxZDE1OSwgMHg2ZmY3ZjBlZCwgMHg1YTA5N2ExZiwgMHg4MjdiNjhkMCwgMHg5MGVjZjUyZSwgMHgyMmIwYzA1NCwgMHhiYzhlNTkzNSwKKyAgICAweDRiNmQyZjdmLCAweDUwYmI2NGEyLCAweGQyNjY0OTEwLCAweGJlZTU4MTJkLCAweGI3MzMyMjkwLCAweGU5M2IxNTlmLCAweGI0OGVlNDExLCAweDRiZmYzNDVkLAorICAgIDB4ZmQ0NWMyNDAsIDB4YWQzMTk3M2YsIDB4YzRmNmQwMmUsIDB4NTVmYzgxNjUsIDB4ZDViMWNhYWQsIDB4YTFhYzJkYWUsIDB4YTJkNGI3NmQsIDB4YzE5YjBjNTAsCisgICAgMHg4ODIyNDBmMiwgMHgwYzZlNGYzOCwgMHhhNGU0YmZkNywgMHg0ZjViYTI3MiwgMHg1NjRjMWQyZiwgMHhjNTljNTMxOSwgMHhiOTQ5ZTM1NCwgMHhiMDQ2NjlmZSwKKyAgICAweGIxYjZhYjhhLCAweGM3MTM1OGRkLCAweDYzODVjNTQ1LCAweDExMGY5MzVkLCAweDU3NTM4YWQ1LCAweDZhMzkwNDkzLCAweGU2M2QzN2UwLCAweDJhNTRmNmIzLAorICAgIDB4M2E3ODdkNWYsIDB4NjI3NmEwYjUsIDB4MTlhNmZjZGYsIDB4N2E0MjIwNmEsIDB4MjlmOWQ0ZDUsIDB4ZjYxYjE4OTEsIDB4YmI3MjI3NWUsIDB4YWE1MDgxNjcsCisgICAgMHgzODkwMTA5MSwgMHhjNmI1MDVlYiwgMHg4NGM3Y2I4YywgMHgyYWQ3NWEwZiwgMHg4NzRhMTQyNywgMHhhMmQxOTM2YiwgMHgyYWQyODZhZiwgMHhhYTU2ZDI5MSwKKyAgICAweGQ3ODk0MzYwLCAweDQyNWM3NTBkLCAweDkzYjM5ZTI2LCAweDE4NzE4NGM5LCAweDZjMDBiMzJkLCAweDczZTJiYjE0LCAweGEwYmViYzNjLCAweDU0NjIzNzc5LAorICAgIDB4NjQ0NTllYWIsIDB4M2YzMjhiODIsIDB4NzcxOGNmODIsIDB4NTlhMmNlYTYsIDB4MDRlZTAwMmUsIDB4ODlmZTc4ZTYsIDB4M2ZhYjA5NTAsIDB4MzI1ZmY2YzIsCisgICAgMHg4MTM4M2YwNSwgMHg2OTYzYzVjOCwgMHg3NmNiNWFkNiwgMHhkNDk5NzRjOSwgMHhjYTE4MGRjZiwgMHgzODA3ODJkNSwgMHhjN2ZhNWNmNiwgMHg4YWMzMTUxMSwKKyAgICAweDM1ZTc5ZTEzLCAweDQ3ZGE5MWQwLCAweGY0MGY5MDg2LCAweGE3ZTI0MTllLCAweDMxMzY2MjQxLCAweDA1MWVmNDk1LCAweGFhNTczYjA0LCAweDRhODA1ZDhkLAorICAgIDB4NTQ4MzAwZDAsIDB4MDAzMjJhM2MsIDB4YmY2NGNkZGYsIDB4YmE1N2E2OGUsIDB4NzVjNjM3MmIsIDB4NTBhZmQzNDEsIDB4YTdjMTMyNzUsIDB4OTE1YTBiZjUsCisgICAgMHg2YjU0YmZhYiwgMHgyYjBiMTQyNiwgMHhhYjRjYzlkNywgMHg0NDljY2Q4MiwgMHhmN2ZiZjI2NSwgMHhhYjg1YzVmMywgMHgxYjU1ZGI5NCwgMHhhYWQ0ZTMyNCwKKyAgICAweGNmYTRiZDNmLCAweDJkZWFhM2UyLCAweDllMjA0ZDAyLCAweGM4YmQyNWFjLCAweGVhZGY1NWIzLCAweGQ1YmQ5ZTk4LCAweGUzMTIzMWIyLCAweDJhZDVhZDZjLAorICAgIDB4OTU0MzI5ZGUsIDB4YWRiZTQ1MjgsIDB4ZDg3MTBmNjksIDB4YWE1MWM5MGYsIDB4YWE3ODZiZjYsIDB4MjI1MTNmMWUsIDB4YWE1MWE3OWIsIDB4MmFkMzQ0Y2MsCisgICAgMHg3YjVhNDFmMCwgMHhkMzdjZmJhZCwgMHgxYjA2OTUwNSwgMHg0MWVjZTQ5MSwgMHhiNGMzMzJlNiwgMHgwMzIyNjhkNCwgMHhjOTYwMGFjYywgMHhjZTM4N2U2ZCwKKyAgICAweGJmNmJiMTZjLCAweDZhNzBmYjc4LCAweDBkMDNkOWM5LCAweGQ0ZGYzOWRlLCAweGUwMTA2M2RhLCAweDQ3MzZmNDY0LCAweDVhZDMyOGQ4LCAweGIzNDdjYzk2LAorICAgIDB4NzViYjBmYzMsIDB4OTg1MTFiZmIsIDB4NGZmYmNjMzUsIDB4YjU4YmNmNmEsIDB4ZTExZjBhYmMsIDB4YmZjNWZlNGEsIDB4YTcwYWVjMTAsIDB4YWMzOTU3MGEsCisgICAgMHgzZjA0NDQyZiwgMHg2MTg4YjE1MywgMHhlMDM5N2EyZSwgMHg1NzI3Y2I3OSwgMHg5Y2ViNDE4ZiwgMHgxY2FjZDY4ZCwgMHgyYWQzN2M5NiwgMHgwMTc1Y2I5ZCwKKyAgICAweGM2OWRmZjA5LCAweGM3NWI2NWYwLCAweGQ5ZGI0MGQ4LCAweGVjMGU3Nzc5LCAweDQ3NDRlYWQ0LCAweGIxMWMzMjc0LCAweGRkMjRjYjllLCAweDdlMWM1NGJkLAorICAgIDB4ZjAxMTQ0ZjksIDB4ZDIyNDBlYjEsIDB4OTY3NWIzZmQsIDB4YTNhYzM3NTUsIDB4ZDQ3YzI3YWYsIDB4NTFjODVmNGQsIDB4NTY5MDc1OTYsIDB4YTViYjE1ZTYsCisgICAgMHg1ODAzMDRmMCwgMHhjYTA0MmNmMSwgMHgwMTFhMzdlYSwgMHg4ZGJmYWFkYiwgMHgzNWJhM2U0YSwgMHgzNTI2ZmZhMCwgMHhjMzdiNGQwOSwgMHhiYzMwNmVkOSwKKyAgICAweDk4YTUyNjY2LCAweDU2NDhmNzI1LCAweGZmNWU1NjlkLCAweDBjZWQ2M2QwLCAweDdjNjNiMmNmLCAweDcwMGI0NWUxLCAweGQ1ZWE1MGYxLCAweDg1YTkyODcyLAorICAgIDB4YWYxZmJkYTcsIDB4ZDQyMzQ4NzAsIDB4YTc4NzBiZjMsIDB4MmQzYjRkNzksIDB4NDJlMDQxOTgsIDB4MGNkMGVkZTcsIDB4MjY0NzBkYjgsIDB4Zjg4MTgxNGMsCisgICAgMHg0NzRkNmFkNywgMHg3YzBjNWU1YywgMHhkMTIzMTk1OSwgMHgzODFiNzI5OCwgMHhmNWQyZjRkYiwgMHhhYjgzODY1MywgMHg2ZTJmMWUyMywgMHg4MzcxOWM5ZSwKKyAgICAweGJkOTFlMDQ2LCAweDlhNTY0NTZlLCAweGRjMzkyMDBjLCAweDIwYzhjNTcxLCAweDk2MmJkYTFjLCAweGUxZTY5NmZmLCAweGIxNDFhYjA4LCAweDdjY2E4OWI5LAorICAgIDB4MWE2OWU3ODMsIDB4MDJjYzQ4NDMsIDB4YTJmN2M1NzksIDB4NDI5ZWY0N2QsIDB4NDI3YjE2OWMsIDB4NWFjOWYwNDksIDB4ZGQ4ZjBmMDAsIDB4NWM4MTY1YmZ9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgUzJbMjU2XT17CisgICAgMHgxZjIwMTA5NCwgMHhlZjBiYTc1YiwgMHg2OWUzY2Y3ZSwgMHgzOTNmNDM4MCwgMHhmZTYxY2Y3YSwgMHhlZWM1MjA3YSwgMHg1NTg4OWM5NCwgMHg3MmZjMDY1MSwKKyAgICAweGFkYTdlZjc5LCAweDRlMWQ3MjM1LCAweGQ1NWE2M2NlLCAweGRlMDQzNmJhLCAweDk5YzQzMGVmLCAweDVmMGMwNzk0LCAweDE4ZGNkYjdkLCAweGExZDZlZmYzLAorICAgIDB4YTBiNTJmN2IsIDB4NTllODM2MDUsIDB4ZWUxNWIwOTQsIDB4ZTlmZmQ5MDksIDB4ZGM0NDAwODYsIDB4ZWY5NDQ0NTksIDB4YmE4M2NjYjMsIDB4ZTBjM2NkZmIsCisgICAgMHhkMWRhNDE4MSwgMHgzYjA5MmFiMSwgMHhmOTk3ZjFjMSwgMHhhNWU2Y2Y3YiwgMHgwMTQyMGRkYiwgMHhlNGU3ZWY1YiwgMHgyNWExZmY0MSwgMHhlMTgwZjgwNiwKKyAgICAweDFmYzQxMDgwLCAweDE3OWJlZTdhLCAweGQzN2FjNmE5LCAweGZlNTgzMGE0LCAweDk4ZGU4YjdmLCAweDc3ZTgzZjRlLCAweDc5OTI5MjY5LCAweDI0ZmE5ZjdiLAorICAgIDB4ZTExM2M4NWIsIDB4YWNjNDAwODMsIDB4ZDc1MDM1MjUsIDB4ZjdlYTYxNWYsIDB4NjIxNDMxNTQsIDB4MGQ1NTRiNjMsIDB4NWQ2ODExMjEsIDB4Yzg2NmMzNTksCisgICAgMHgzZDYzY2Y3MywgMHhjZWUyMzRjMCwgMHhkNGQ4N2U4NywgMHg1YzY3MmIyMSwgMHgwNzFmNjE4MSwgMHgzOWY3NjI3ZiwgMHgzNjFlMzA4NCwgMHhlNGViNTczYiwKKyAgICAweDYwMmY2NGE0LCAweGQ2M2FjZDljLCAweDFiYmM0NjM1LCAweDllODEwMzJkLCAweDI3MDFmNTBjLCAweDk5ODQ3YWI0LCAweGEwZTNkZjc5LCAweGJhNmNmMzhjLAorICAgIDB4MTA4NDMwOTQsIDB4MjUzN2E5NWUsIDB4ZjQ2ZjZmZmUsIDB4YTFmZjNiMWYsIDB4MjA4Y2ZiNmEsIDB4OGY0NThjNzQsIDB4ZDllMGEyMjcsIDB4NGVjNzNhMzQsCisgICAgMHhmYzg4NGY2OSwgMHgzZTRkZThkZiwgMHhlZjBlMDA4OCwgMHgzNTU5NjQ4ZCwgMHg4YTQ1Mzg4YywgMHgxZDgwNDM2NiwgMHg3MjFkOWJmZCwgMHhhNTg2ODRiYiwKKyAgICAweGU4MjU2MzMzLCAweDg0NGU4MjEyLCAweDEyOGQ4MDk4LCAweGZlZDMzZmI0LCAweGNlMjgwYWUxLCAweDI3ZTE5YmE1LCAweGQ1YTZjMjUyLCAweGU0OTc1NGJkLAorICAgIDB4YzVkNjU1ZGQsIDB4ZWI2NjcwNjQsIDB4Nzc4NDBiNGQsIDB4YTFiNmE4MDEsIDB4ODRkYjI2YTksIDB4ZTBiNTY3MTQsIDB4MjFmMDQzYjcsIDB4ZTVkMDU4NjAsCisgICAgMHg1NGYwMzA4NCwgMHgwNjZmZjQ3MiwgMHhhMzFhYTE1MywgMHhkYWRjNDc1NSwgMHhiNTYyNWRiZiwgMHg2ODU2MWJlNiwgMHg4M2NhNmI5NCwgMHgyZDZlZDIzYiwKKyAgICAweGVjY2YwMWRiLCAweGE2ZDNkMGJhLCAweGI2ODAzZDVjLCAweGFmNzdhNzA5LCAweDMzYjRhMzRjLCAweDM5N2JjOGQ2LCAweDVlZTIyYjk1LCAweDVmMGU1MzA0LAorICAgIDB4ODFlZDZmNjEsIDB4MjBlNzQzNjQsIDB4YjQ1ZTEzNzgsIDB4ZGUxODYzOWIsIDB4ODgxY2ExMjIsIDB4Yjk2NzI2ZDEsIDB4ODA0OWE3ZTgsIDB4MjJiN2RhN2IsCisgICAgMHg1ZTU1MmQyNSwgMHg1MjcyZDIzNywgMHg3OWQyOTUxYywgMHhjNjBkODk0YywgMHg0ODhjYjQwMiwgMHgxYmE0ZmU1YiwgMHhhNGIwOWY2YiwgMHgxY2E4MTVjZiwKKyAgICAweGEyMGMzMDA1LCAweDg4NzFkZjYzLCAweGI5ZGUyZmNiLCAweDBjYzZjOWU5LCAweDBiZWVmZjUzLCAweGUzMjE0NTE3LCAweGI0NTQyODM1LCAweDlmNjMyOTNjLAorICAgIDB4ZWU0MWU3MjksIDB4NmUxZDJkN2MsIDB4NTAwNDUyODYsIDB4MWU2Njg1ZjMsIDB4ZjMzNDAxYzYsIDB4MzBhMjJjOTUsIDB4MzFhNzA4NTAsIDB4NjA5MzBmMTMsCisgICAgMHg3M2Y5ODQxNywgMHhhMTI2OTg1OSwgMHhlYzY0NWM0NCwgMHg1MmM4NzdhOSwgMHhjZGZmMzNhNiwgMHhhMDJiMTc0MSwgMHg3Y2JhZDlhMiwgMHgyMTgwMDM2ZiwKKyAgICAweDUwZDk5YzA4LCAweGNiM2Y0ODYxLCAweGMyNmJkNzY1LCAweDY0YTNmNmFiLCAweDgwMzQyNjc2LCAweDI1YTc1ZTdiLCAweGU0ZTZkMWZjLCAweDIwYzcxMGU2LAorICAgIDB4Y2RmMGI2ODAsIDB4MTc4NDRkM2IsIDB4MzFlZWY4NGQsIDB4N2UwODI0ZTQsIDB4MmNjYjQ5ZWIsIDB4ODQ2YTNiYWUsIDB4OGZmNzc4ODgsIDB4ZWU1ZDYwZjYsCisgICAgMHg3YWY3NTY3MywgMHgyZmRkNWNkYiwgMHhhMTE2MzFjMSwgMHgzMGY2NmY0MywgMHhiM2ZhZWM1NCwgMHgxNTdmZDdmYSwgMHhlZjg1NzljYywgMHhkMTUyZGU1OCwKKyAgICAweGRiMmZmZDVlLCAweDhmMzJjZTE5LCAweDMwNmFmOTdhLCAweDAyZjAzZWY4LCAweDk5MzE5YWQ1LCAweGMyNDJmYTBmLCAweGE3ZTNlYmIwLCAweGM2OGU0OTA2LAorICAgIDB4YjhkYTIzMGMsIDB4ODA4MjMwMjgsIDB4ZGNkZWYzYzgsIDB4ZDM1ZmIxNzEsIDB4MDg4YTFiYzgsIDB4YmVjMGM1NjAsIDB4NjFhM2M5ZTgsIDB4YmNhOGY1NGQsCisgICAgMHhjNzJmZWZmYSwgMHgyMjgyMmU5OSwgMHg4MmM1NzBiNCwgMHhkOGQ5NGU4OSwgMHg4YjFjMzRiYywgMHgzMDFlMTZlNiwgMHgyNzNiZTk3OSwgMHhiMGZmZWFhNiwKKyAgICAweDYxZDliOGM2LCAweDAwYjI0ODY5LCAweGI3ZmZjZTNmLCAweDA4ZGMyODNiLCAweDQzZGFmNjVhLCAweGY3ZTE5Nzk4LCAweDc2MTliNzJmLCAweDhmMWM5YmE0LAorICAgIDB4ZGM4NjM3YTAsIDB4MTZhN2QzYjEsIDB4OWZjMzkzYjcsIDB4YTcxMzZlZWIsIDB4YzZiY2M2M2UsIDB4MWE1MTM3NDIsIDB4ZWY2ODI4YmMsIDB4NTIwMzY1ZDYsCisgICAgMHgyZDZhNzdhYiwgMHgzNTI3ZWQ0YiwgMHg4MjFmZDIxNiwgMHgwOTVjNmUyZSwgMHhkYjkyZjJmYiwgMHg1ZWVhMjljYiwgMHgxNDU4OTJmNSwgMHg5MTU4NGY3ZiwKKyAgICAweDU0ODM2OTdiLCAweDI2NjdhOGNjLCAweDg1MTk2MDQ4LCAweDhjNGJhY2VhLCAweDgzMzg2MGQ0LCAweDBkMjNlMGY5LCAweDZjMzg3ZThhLCAweDBhZTZkMjQ5LAorICAgIDB4YjI4NDYwMGMsIDB4ZDgzNTczMWQsIDB4ZGNiMWM2NDcsIDB4YWM0YzU2ZWEsIDB4M2ViZDgxYjMsIDB4MjMwZWFiYjAsIDB4NjQzOGJjODcsIDB4ZjBiNWIxZmEsCisgICAgMHg4ZjVlYTJiMywgMHhmYzE4NDY0MiwgMHgwYTAzNmI3YSwgMHg0ZmIwODliZCwgMHg2NDlkYTU4OSwgMHhhMzQ1NDE1ZSwgMHg1YzAzODMyMywgMHgzZTVkM2JiOSwKKyAgICAweDQzZDc5NTcyLCAweDdlNmRkMDdjLCAweDA2ZGZkZjFlLCAweDZjNmNjNGVmLCAweDcxNjBhNTM5LCAweDczYmZiZTcwLCAweDgzODc3NjA1LCAweDQ1MjNlY2YxfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IFMzWzI1Nl09eworICAgIDB4OGRlZmMyNDAsIDB4MjVmYTVkOWYsIDB4ZWI5MDNkYmYsIDB4ZTgxMGM5MDcsIDB4NDc2MDdmZmYsIDB4MzY5ZmU0NGIsIDB4OGMxZmM2NDQsIDB4YWVjZWNhOTAsCisgICAgMHhiZWIxZjliZiwgMHhlZWZiY2FlYSwgMHhlOGNmMTk1MCwgMHg1MWRmMDdhZSwgMHg5MjBlODgwNiwgMHhmMGFkMDU0OCwgMHhlMTNjOGQ4MywgMHg5MjcwMTBkNSwKKyAgICAweDExMTA3ZDlmLCAweDA3NjQ3ZGI5LCAweGIyZTNlNGQ0LCAweDNkNGYyODVlLCAweGI5YWZhODIwLCAweGZhZGU4MmUwLCAweGEwNjcyNjhiLCAweDgyNzI3OTJlLAorICAgIDB4NTUzZmIyYzAsIDB4NDg5YWUyMmIsIDB4ZDRlZjk3OTQsIDB4MTI1ZTNmYmMsIDB4MjFmZmZjZWUsIDB4ODI1YjFiZmQsIDB4OTI1NWM1ZWQsIDB4MTI1N2EyNDAsCisgICAgMHg0ZTFhODMwMiwgMHhiYWUwN2ZmZiwgMHg1MjgyNDZlNywgMHg4ZTU3MTQwZSwgMHgzMzczZjdiZiwgMHg4YzlmODE4OCwgMHhhNmZjNGVlOCwgMHhjOTgyYjVhNSwKKyAgICAweGE4YzAxZGI3LCAweDU3OWZjMjY0LCAweDY3MDk0ZjMxLCAweGYyYmQzZjVmLCAweDQwZmZmN2MxLCAweDFmYjc4ZGZjLCAweDhlNmJkMmMxLCAweDQzN2JlNTliLAorICAgIDB4OTliMDNkYmYsIDB4YjVkYmM2NGIsIDB4NjM4ZGMwZTYsIDB4NTU4MTlkOTksIDB4YTE5N2M4MWMsIDB4NGEwMTJkNmUsIDB4YzU4ODRhMjgsIDB4Y2NjMzZmNzEsCisgICAgMHhiODQzYzIxMywgMHg2YzA3NDNmMSwgMHg4MzA5ODkzYywgMHgwZmVkZGQ1ZiwgMHgyZjdmZTg1MCwgMHhkN2MwN2Y3ZSwgMHgwMjUwN2ZiZiwgMHg1YWZiOWEwNCwKKyAgICAweGE3NDdkMmQwLCAweDE2NTExOTJlLCAweGFmNzBiZjNlLCAweDU4YzMxMzgwLCAweDVmOTgzMDJlLCAweDcyN2NjM2M0LCAweDBhMGZiNDAyLCAweDBmN2ZlZjgyLAorICAgIDB4OGM5NmZkYWQsIDB4NWQyYzJhYWUsIDB4OGVlOTlhNDksIDB4NTBkYTg4YjgsIDB4ODQyN2Y0YTAsIDB4MWVhYzU3OTAsIDB4Nzk2ZmI0NDksIDB4ODI1MmRjMTUsCisgICAgMHhlZmJkN2Q5YiwgMHhhNjcyNTk3ZCwgMHhhZGE4NDBkOCwgMHg0NWY1NDUwNCwgMHhmYTVkNzQwMywgMHhlODNlYzMwNSwgMHg0ZjkxNzUxYSwgMHg5MjU2NjljMiwKKyAgICAweDIzZWZlOTQxLCAweGE5MDNmMTJlLCAweDYwMjcwZGYyLCAweDAyNzZlNGI2LCAweDk0ZmQ2NTc0LCAweDkyNzk4NWIyLCAweDgyNzZkYmNiLCAweDAyNzc4MTc2LAorICAgIDB4ZjhhZjkxOGQsIDB4NGU0OGY3OWUsIDB4OGY2MTZkZGYsIDB4ZTI5ZDg0MGUsIDB4ODQyZjdkODMsIDB4MzQwY2U1YzgsIDB4OTZiYmI2ODIsIDB4OTNiNGIxNDgsCisgICAgMHhlZjMwM2NhYiwgMHg5ODRmYWYyOCwgMHg3NzlmYWY5YiwgMHg5MmRjNTYwZCwgMHgyMjRkMWUyMCwgMHg4NDM3YWE4OCwgMHg3ZDI5ZGM5NiwgMHgyNzU2ZDNkYywKKyAgICAweDhiOTA3Y2VlLCAweGI1MWZkMjQwLCAweGU3YzA3Y2UzLCAweGU1NjZiNGExLCAweGMzZTk2MTVlLCAweDNjZjgyMDlkLCAweDYwOTRkMWUzLCAweGNkOWNhMzQxLAorICAgIDB4NWM3NjQ2MGUsIDB4MDBlYTk4M2IsIDB4ZDRkNjc4ODEsIDB4ZmQ0NzU3MmMsIDB4Zjc2Y2VkZDksIDB4YmRhODIyOWMsIDB4MTI3ZGFkYWEsIDB4NDM4YTA3NGUsCisgICAgMHgxZjk3YzA5MCwgMHgwODFiZGI4YSwgMHg5M2EwN2ViZSwgMHhiOTM4Y2ExNSwgMHg5N2IwM2NmZiwgMHgzZGMyYzBmOCwgMHg4ZDFhYjJlYywgMHg2NDM4MGU1MSwKKyAgICAweDY4Y2M3YmZiLCAweGQ5MGYyNzg4LCAweDEyNDkwMTgxLCAweDVkZTVmZmQ0LCAweGRkN2VmODZhLCAweDc2YTJlMjE0LCAweGI5YTQwMzY4LCAweDkyNWQ5NThmLAorICAgIDB4NGIzOWZmZmEsIDB4YmEzOWFlZTksIDB4YTRmZmQzMGIsIDB4ZmFmNzkzM2IsIDB4NmQ0OTg2MjMsIDB4MTkzY2JjZmEsIDB4Mjc2Mjc1NDUsIDB4ODI1Y2Y0N2EsCisgICAgMHg2MWJkOGJhMCwgMHhkMTFlNDJkMSwgMHhjZWFkMDRmNCwgMHgxMjdlYTM5MiwgMHgxMDQyOGRiNywgMHg4MjcyYTk3MiwgMHg5MjcwYzRhOCwgMHgxMjdkZTUwYiwKKyAgICAweDI4NWJhMWM4LCAweDNjNjJmNDRmLCAweDM1YzBlYWE1LCAweGU4MDVkMjMxLCAweDQyODkyOWZiLCAweGI0ZmNkZjgyLCAweDRmYjY2YTUzLCAweDBlN2RjMTViLAorICAgIDB4MWYwODFmYWIsIDB4MTA4NjE4YWUsIDB4ZmNmZDA4NmQsIDB4ZjlmZjI4ODksIDB4Njk0YmNjMTEsIDB4MjM2YTVjYWUsIDB4MTJkZWNhNGQsIDB4MmMzZjhjYzUsCisgICAgMHhkMmQwMmRmZSwgMHhmOGVmNTg5NiwgMHhlNGNmNTJkYSwgMHg5NTE1NWI2NywgMHg0OTRhNDg4YywgMHhiOWI2YTgwYywgMHg1YzhmODJiYywgMHg4OWQzNmI0NSwKKyAgICAweDNhNjA5NDM3LCAweGVjMDBjOWE5LCAweDQ0NzE1MjUzLCAweDBhODc0YjQ5LCAweGQ3NzNiYzQwLCAweDdjMzQ2NzFjLCAweDAyNzE3ZWY2LCAweDRmZWI1NTM2LAorICAgIDB4YTJkMDJmZmYsIDB4ZDJiZjYwYzQsIDB4ZDQzZjAzYzAsIDB4NTBiNGVmNmQsIDB4MDc0NzhjZDEsIDB4MDA2ZTE4ODgsIDB4YTJlNTNmNTUsIDB4YjllNmQ0YmMsCisgICAgMHhhMjA0ODAxNiwgMHg5NzU3MzgzMywgMHhkNzIwN2Q2NywgMHhkZTBmOGYzZCwgMHg3MmY4N2IzMywgMHhhYmNjNGYzMywgMHg3Njg4YzU1ZCwgMHg3YjAwYTZiMCwKKyAgICAweDk0N2IwMDAxLCAweDU3MDA3NWQyLCAweGY5YmI4OGY4LCAweDg5NDIwMTllLCAweDQyNjRhNWZmLCAweDg1NjMwMmUwLCAweDcyZGJkOTJiLCAweGVlOTcxYjY5LAorICAgIDB4NmVhMjJmZGUsIDB4NWYwOGFlMmIsIDB4YWY3YTYxNmQsIDB4ZTVjOTg3NjcsIDB4Y2YxZmViZDIsIDB4NjFlZmM4YzIsIDB4ZjFhYzI1NzEsIDB4Y2M4MjM5YzIsCisgICAgMHg2NzIxNGNiOCwgMHhiMWU1ODNkMSwgMHhiN2RjM2U2MiwgMHg3ZjEwYmRjZSwgMHhmOTBhNWMzOCwgMHgwZmYwNDQzZCwgMHg2MDZlNmRjNiwgMHg2MDU0M2E0OSwKKyAgICAweDU3MjdjMTQ4LCAweDJiZTk4YTFkLCAweDhhYjQxNzM4LCAweDIwZTFiZTI0LCAweGFmOTZkYTBmLCAweDY4NDU4NDI1LCAweDk5ODMzYmU1LCAweDYwMGQ0NTdkLAorICAgIDB4MjgyZjkzNTAsIDB4ODMzNGIzNjIsIDB4ZDkxZDExMjAsIDB4MmI2ZDhkYTAsIDB4NjQyYjFlMzEsIDB4OWMzMDVhMDAsIDB4NTJiY2U2ODgsIDB4MWIwMzU4OGEsCisgICAgMHhmN2JhZWZkNSwgMHg0MTQyZWQ5YywgMHhhNDMxNWMxMSwgMHg4MzMyM2VjNSwgMHhkZmVmNDYzNiwgMHhhMTMzYzUwMSwgMHhlOWQzNTMxYywgMHhlZTM1Mzc4M307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBTNFsyNTZdPXsKKyAgICAweDlkYjMwNDIwLCAweDFmYjZlOWRlLCAweGE3YmU3YmVmLCAweGQyNzNhMjk4LCAweDRhNGY3YmRiLCAweDY0YWQ4YzU3LCAweDg1NTEwNDQzLCAweGZhMDIwZWQxLAorICAgIDB4N2UyODdhZmYsIDB4ZTYwZmI2NjMsIDB4MDk1ZjM1YTEsIDB4NzllYmYxMjAsIDB4ZmQwNTlkNDMsIDB4NjQ5N2I3YjEsIDB4ZjM2NDFmNjMsIDB4MjQxZTRhZGYsCisgICAgMHgyODE0N2Y1ZiwgMHg0ZmEyYjhjZCwgMHhjOTQzMDA0MCwgMHgwY2MzMjIyMCwgMHhmZGQzMGIzMCwgMHhjMGE1Mzc0ZiwgMHgxZDJkMDBkOSwgMHgyNDE0N2IxNSwKKyAgICAweGVlNGQxMTFhLCAweDBmY2E1MTY3LCAweDcxZmY5MDRjLCAweDJkMTk1ZmZlLCAweDFhMDU2NDVmLCAweDBjMTNmZWZlLCAweDA4MWIwOGNhLCAweDA1MTcwMTIxLAorICAgIDB4ODA1MzAxMDAsIDB4ZTgzZTVlZmUsIDB4YWM5YWY0ZjgsIDB4N2ZlNzI3MDEsIDB4ZDJiOGVlNWYsIDB4MDZkZjQyNjEsIDB4YmI5ZTliOGEsIDB4NzI5M2VhMjUsCisgICAgMHhjZTg0ZmZkZiwgMHhmNTcxODgwMSwgMHgzZGQ2NGIwNCwgMHhhMjZmMjYzYiwgMHg3ZWQ0ODQwMCwgMHg1NDdlZWJlNiwgMHg0NDZkNGNhMCwgMHg2Y2YzZDZmNSwKKyAgICAweDI2NDlhYmRmLCAweGFlYTBjN2Y1LCAweDM2MzM4Y2MxLCAweDUwM2Y3ZTkzLCAweGQzNzcyMDYxLCAweDExYjYzOGUxLCAweDcyNTAwZTAzLCAweGY4MGViMmJiLAorICAgIDB4YWJlMDUwMmUsIDB4ZWM4ZDc3ZGUsIDB4NTc5NzFlODEsIDB4ZTE0ZjY3NDYsIDB4YzkzMzU0MDAsIDB4NjkyMDMxOGYsIDB4MDgxZGJiOTksIDB4ZmZjMzA0YTUsCisgICAgMHg0ZDM1MTgwNSwgMHg3ZjNkNWNlMywgMHhhNmM4NjZjNiwgMHg1ZDViY2NhOSwgMHhkYWVjNmZlYSwgMHg5ZjkyNmY5MSwgMHg5ZjQ2MjIyZiwgMHgzOTkxNDY3ZCwKKyAgICAweGE1YmY2ZDhlLCAweDExNDNjNDRmLCAweDQzOTU4MzAyLCAweGQwMjE0ZWViLCAweDAyMjA4M2I4LCAweDNmYjYxODBjLCAweDE4Zjg5MzFlLCAweDI4MTY1OGU2LAorICAgIDB4MjY0ODZlM2UsIDB4OGJkNzhhNzAsIDB4NzQ3N2U0YzEsIDB4YjUwNmUwN2MsIDB4ZjMyZDBhMjUsIDB4NzkwOThiMDIsIDB4ZTRlYWJiODEsIDB4MjgxMjNiMjMsCisgICAgMHg2OWRlYWQzOCwgMHgxNTc0Y2ExNiwgMHhkZjg3MWI2MiwgMHgyMTFjNDBiNywgMHhhNTFhOWVmOSwgMHgwMDE0Mzc3YiwgMHgwNDFlOGFjOCwgMHgwOTExNDAwMywKKyAgICAweGJkNTllNGQyLCAweGUzZDE1NmQ1LCAweDRmZTg3NmQ1LCAweDJmOTFhMzQwLCAweDU1N2JlOGRlLCAweDAwZWFlNGE3LCAweDBjZTVjMmVjLCAweDRkYjRiYmE2LAorICAgIDB4ZTc1NmJkZmYsIDB4ZGQzMzY5YWMsIDB4ZWMxN2IwMzUsIDB4MDY1NzIzMjcsIDB4OTlhZmM4YjAsIDB4NTZjOGMzOTEsIDB4NmI2NTgxMWMsIDB4NWUxNDYxMTksCisgICAgMHg2ZTg1Y2I3NSwgMHhiZTA3YzAwMiwgMHhjMjMyNTU3NywgMHg4OTNmZjRlYywgMHg1YmJmYzkyZCwgMHhkMGVjM2IyNSwgMHhiNzgwMWFiNywgMHg4ZDZkM2IyNCwKKyAgICAweDIwYzc2M2VmLCAweGMzNjZhNWZjLCAweDljMzgyODgwLCAweDBhY2UzMjA1LCAweGFhYzk1NDhhLCAweGVjYTFkN2M3LCAweDA0MWFmYTMyLCAweDFkMTY2MjVhLAorICAgIDB4NjcwMTkwMmMsIDB4OWI3NTdhNTQsIDB4MzFkNDc3ZjcsIDB4OTEyNmIwMzEsIDB4MzZjYzZmZGIsIDB4YzcwYjhiNDYsIDB4ZDllNjZhNDgsIDB4NTZlNTVhNzksCisgICAgMHgwMjZhNGNlYiwgMHg1MjQzN2VmZiwgMHgyZjhmNzZiNCwgMHgwZGY5ODBhNSwgMHg4Njc0Y2RlMywgMHhlZGRhMDRlYiwgMHgxN2E5YmUwNCwgMHgyYzE4ZjRkZiwKKyAgICAweGI3NzQ3ZjlkLCAweGFiMmFmN2I0LCAweGVmYzM0ZDIwLCAweDJlMDk2YjdjLCAweDE3NDFhMjU0LCAweGU1YjZhMDM1LCAweDIxM2Q0MmY2LCAweDJjMWM3YzI2LAorICAgIDB4NjFjMmY1MGYsIDB4NjU1MmRhZjksIDB4ZDJjMjMxZjgsIDB4MjUxMzBmNjksIDB4ZDgxNjdmYTIsIDB4MDQxOGYyYzgsIDB4MDAxYTk2YTYsIDB4MGQxNTI2YWIsCisgICAgMHg2MzMxNWMyMSwgMHg1ZTBhNzJlYywgMHg0OWJhZmVmZCwgMHgxODc5MDhkOSwgMHg4ZDBkYmQ4NiwgMHgzMTExNzBhNywgMHgzZTliNjQwYywgMHhjYzNlMTBkNywKKyAgICAweGQ1Y2FkM2I2LCAweDBjYWVjMzg4LCAweGY3MzAwMWUxLCAweDZjNzI4YWZmLCAweDcxZWFlMmExLCAweDFmOWFmMzZlLCAweGNmY2JkMTJmLCAweGMxZGU4NDE3LAorICAgIDB4YWMwN2JlNmIsIDB4Y2I0NGExZDgsIDB4OGI5YjBmNTYsIDB4MDEzOTg4YzMsIDB4YjFjNTJmY2EsIDB4YjRiZTMxY2QsIDB4ZDg3ODI4MDYsIDB4MTJhM2E0ZTIsCisgICAgMHg2ZjdkZTUzMiwgMHg1OGZkN2ViNiwgMHhkMDFlZTkwMCwgMHgyNGFkZmZjMiwgMHhmNDk5MGZjNSwgMHg5NzExYWFjNSwgMHgwMDFkN2I5NSwgMHg4MmU1ZTdkMiwKKyAgICAweDEwOTg3M2Y2LCAweDAwNjEzMDk2LCAweGMzMmQ5NTIxLCAweGFkYTEyMWZmLCAweDI5OTA4NDE1LCAweDdmYmI5NzdmLCAweGFmOWViM2RiLCAweDI5YzllZDJhLAorICAgIDB4NWNlMmE0NjUsIDB4YTczMGYzMmMsIDB4ZDBhYTNmZTgsIDB4OGE1Y2MwOTEsIDB4ZDQ5ZTJjZTcsIDB4MGNlNDU0YTksIDB4ZDYwYWNkODYsIDB4MDE1ZjE5MTksCisgICAgMHg3NzA3OTEwMywgMHhkZWEwM2FmNiwgMHg3OGE4NTY1ZSwgMHhkZWUzNTZkZiwgMHgyMWYwNWNiZSwgMHg4Yjc1ZTM4NywgMHhiM2M1MDY1MSwgMHhiOGE1YzNlZiwKKyAgICAweGQ4ZWViNmQyLCAweGU1MjNiZTc3LCAweGMyMTU0NTI5LCAweDJmNjllZmRmLCAweGFmZTY3YWZiLCAweGY0NzBjNGIyLCAweGYzZTBlYjViLCAweGQ2Y2M5ODc2LAorICAgIDB4MzllNDQ2MGMsIDB4MWZkYTg1MzgsIDB4MTk4NzgzMmYsIDB4Y2EwMDczNjcsIDB4YTk5MTQ0ZjgsIDB4Mjk2YjI5OWUsIDB4NDkyZmMyOTUsIDB4OTI2NmJlYWIsCisgICAgMHhiNTY3NmU2OSwgMHg5YmQzZGRkYSwgMHhkZjdlMDUyZiwgMHhkYjI1NzAxYywgMHgxYjVlNTFlZSwgMHhmNjUzMjRlNiwgMHg2YWZjZTM2YywgMHgwMzE2Y2MwNCwKKyAgICAweDg2NDQyMTNlLCAweGI3ZGM1OWQwLCAweDc5NjUyOTFmLCAweGNjZDZmZDQzLCAweDQxODIzOTc5LCAweDkzMmJjZGY2LCAweGI2NTdjMzRkLCAweDRlZGZkMjgyLAorICAgIDB4N2FlNTI5MGMsIDB4M2NiOTUzNmIsIDB4ODUxZTIwZmUsIDB4OTgzMzU1N2UsIDB4MTNlY2YwYjAsIDB4ZDNmZmIzNzIsIDB4M2Y4NWM1YzEsIDB4MGFlZjdlZDJ9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgUzVbMjU2XT17CisgICAgMHg3ZWM5MGMwNCwgMHgyYzZlNzRiOSwgMHg5YjBlNjZkZiwgMHhhNjMzNzkxMSwgMHhiODZhN2ZmZiwgMHgxZGQzNThmNSwgMHg0NGRkOWQ0NCwgMHgxNzMxMTY3ZiwKKyAgICAweDA4ZmJmMWZhLCAweGU3ZjUxMWNjLCAweGQyMDUxYjAwLCAweDczNWFiYTAwLCAweDJhYjcyMmQ4LCAweDM4NjM4MWNiLCAweGFjZjYyNDNhLCAweDY5YmVmZDdhLAorICAgIDB4ZTZhMmU3N2YsIDB4ZjBjNzIwY2QsIDB4YzQ0OTQ4MTYsIDB4Y2NmNWMxODAsIDB4Mzg4NTE2NDAsIDB4MTViMGE4NDgsIDB4ZTY4YjE4Y2IsIDB4NGNhYWRlZmYsCisgICAgMHg1ZjQ4MGEwMSwgMHgwNDEyYjJhYSwgMHgyNTk4MTRmYywgMHg0MWQwZWZlMiwgMHg0ZTQwYjQ4ZCwgMHgyNDhlYjZmYiwgMHg4ZGJhMWNmZSwgMHg0MWE5OWIwMiwKKyAgICAweDFhNTUwYTA0LCAweGJhOGY2NWNiLCAweDcyNTFmNGU3LCAweDk1YTUxNzI1LCAweGMxMDZlY2Q3LCAweDk3YTU5ODBhLCAweGM1MzliOWFhLCAweDRkNzlmZTZhLAorICAgIDB4ZjJmM2Y3NjMsIDB4NjhhZjgwNDAsIDB4ZWQwYzllNTYsIDB4MTFiNDk1OGIsIDB4ZTFlYjVhODgsIDB4ODcwOWU2YjAsIDB4ZDdlMDcxNTYsIDB4NGUyOWZlYTcsCisgICAgMHg2MzY2ZTUyZCwgMHgwMmQxYzAwMCwgMHhjNGFjOGUwNSwgMHg5Mzc3ZjU3MSwgMHgwYzA1MzcyYSwgMHg1Nzg1MzVmMiwgMHgyMjYxYmUwMiwgMHhkNjQyYTBjOSwKKyAgICAweGRmMTNhMjgwLCAweDc0YjU1YmQyLCAweDY4MjE5OWMwLCAweGQ0MjFlNWVjLCAweDUzZmIzY2U4LCAweGM4YWRlZGIzLCAweDI4YTg3ZmM5LCAweDNkOTU5OTgxLAorICAgIDB4NWMxZmY5MDAsIDB4ZmUzOGQzOTksIDB4MGM0ZWZmMGIsIDB4MDYyNDA3ZWEsIDB4YWEyZjRmYjEsIDB4NGZiOTY5NzYsIDB4OTBjNzk1MDUsIDB4YjBhOGE3NzQsCisgICAgMHhlZjU1YTFmZiwgMHhlNTljYTJjMiwgMHhhNmI2MmQyNywgMHhlNjZhNDI2MywgMHhkZjY1MDAxZiwgMHgwZWM1MDk2NiwgMHhkZmRkNTViYywgMHgyOWRlMDY1NSwKKyAgICAweDkxMWU3MzlhLCAweDE3YWY4OTc1LCAweDMyYzc5MTFjLCAweDg5Zjg5NDY4LCAweDBkMDFlOTgwLCAweDUyNDc1NWY0LCAweDAzYjYzY2M5LCAweDBjYzg0NGIyLAorICAgIDB4YmNmM2YwYWEsIDB4ODdhYzM2ZTksIDB4ZTUzYTc0MjYsIDB4MDFiM2Q4MmIsIDB4MWE5ZTc0NDksIDB4NjRlZTJkN2UsIDB4Y2RkYmIxZGEsIDB4MDFjOTQ5MTAsCisgICAgMHhiODY4YmY4MCwgMHgwZDI2ZjNmZCwgMHg5MzQyZWRlNywgMHgwNGE1YzI4NCwgMHg2MzY3MzdiNiwgMHg1MGY1YjYxNiwgMHhmMjQ3NjZlMywgMHg4ZWNhMzZjMSwKKyAgICAweDEzNmUwNWRiLCAweGZlZjE4MzkxLCAweGZiODg3YTM3LCAweGQ2ZTdmN2Q0LCAweGM3ZmI3ZGM5LCAweDMwNjNmY2RmLCAweGI2ZjU4OWRlLCAweGVjMjk0MWRhLAorICAgIDB4MjZlNDY2OTUsIDB4Yjc1NjY0MTksIDB4ZjY1NGVmYzUsIDB4ZDA4ZDU4YjcsIDB4NDg5MjU0MDEsIDB4YzFiYWNiN2YsIDB4ZTVmZjU1MGYsIDB4YjYwODMwNDksCisgICAgMHg1YmI1ZDBlOCwgMHg4N2Q3MmU1YSwgMHhhYjZhNmVlMSwgMHgyMjNhNjZjZSwgMHhjNjJiZjNjZCwgMHg5ZTA4ODVmOSwgMHg2OGNiM2U0NywgMHgwODZjMDEwZiwKKyAgICAweGEyMWRlODIwLCAweGQxOGI2OWRlLCAweGYzZjY1Nzc3LCAweGZhMDJjM2Y2LCAweDQwN2VkYWMzLCAweGNiYjNkNTUwLCAweDE3OTMwODRkLCAweGIwZDcwZWJhLAorICAgIDB4MGFiMzc4ZDUsIDB4ZDk1MWZiMGMsIDB4ZGVkN2RhNTYsIDB4NDEyNGJiZTQsIDB4OTRjYTBiNTYsIDB4MGY1NzU1ZDEsIDB4ZTBlMWU1NmUsIDB4NjE4NGI1YmUsCisgICAgMHg1ODBhMjQ5ZiwgMHg5NGY3NGJjMCwgMHhlMzI3ODg4ZSwgMHg5ZjdiNTU2MSwgMHhjM2RjMDI4MCwgMHgwNTY4NzcxNSwgMHg2NDZjNmJkNywgMHg0NDkwNGRiMywKKyAgICAweDY2YjRmMGEzLCAweGMwZjE2NDhhLCAweDY5N2VkNWFmLCAweDQ5ZTkyZmY2LCAweDMwOWUzNzRmLCAweDJjYjYzNTZhLCAweDg1ODA4NTczLCAweDQ5OTFmODQwLAorICAgIDB4NzZmMGFlMDIsIDB4MDgzYmU4NGQsIDB4Mjg0MjFjOWEsIDB4NDQ0ODk0MDYsIDB4NzM2ZTRjYjgsIDB4YzEwOTI5MTAsIDB4OGJjOTVmYzYsIDB4N2Q4NjljZjQsCisgICAgMHgxMzRmNjE2ZiwgMHgyZTc3MTE4ZCwgMHhiMzFiMmJlMSwgMHhhYTkwYjQ3MiwgMHgzY2E1ZDcxNywgMHg3ZDE2MWJiYSwgMHg5Y2FkOTAxMCwgMHhhZjQ2MmJhMiwKKyAgICAweDlmZTQ1OWQyLCAweDQ1ZDM0NTU5LCAweGQ5ZjJkYTEzLCAweGRiYzY1NDg3LCAweGYzZTRmOTRlLCAweDE3NmQ0ODZmLCAweDA5N2MxM2VhLCAweDYzMWRhNWM3LAorICAgIDB4NDQ1ZjczODIsIDB4MTc1NjgzZjQsIDB4Y2RjNjZhOTcsIDB4NzBiZTAyODgsIDB4YjNjZGNmNzIsIDB4NmU1ZGQyZjMsIDB4MjA5MzYwNzksIDB4NDU5YjgwYTUsCisgICAgMHhiZTYwZTJkYiwgMHhhOWMyMzEwMSwgMHhlYmE1MzE1YywgMHgyMjRlNDJmMiwgMHgxYzVjMTU3MiwgMHhmNjcyMWIyYywgMHgxYWQyZmZmMywgMHg4YzI1NDA0ZSwKKyAgICAweDMyNGVkNzJmLCAweDQwNjdiN2ZkLCAweDA1MjMxMzhlLCAweDVjYTNiYzc4LCAweGRjMGZkNjZlLCAweDc1OTIyMjgzLCAweDc4NGQ2YjE3LCAweDU4ZWJiMTZlLAorICAgIDB4NDQwOTRmODUsIDB4M2Y0ODFkODcsIDB4ZmNmZWFlN2IsIDB4NzdiNWZmNzYsIDB4OGMyMzAyYmYsIDB4YWFmNDc1NTYsIDB4NWY0NmIwMmEsIDB4MmIwOTI4MDEsCisgICAgMHgzZDM4ZjVmNywgMHgwY2E4MWYzNiwgMHg1MmFmNGE4YSwgMHg2NmQ1ZTdjMCwgMHhkZjNiMDg3NCwgMHg5NTA1NTExMCwgMHgxYjVhZDdhOCwgMHhmNjFlZDVhZCwKKyAgICAweDZjZjZlNDc5LCAweDIwNzU4MTg0LCAweGQwY2VmYTY1LCAweDg4ZjdiZTU4LCAweDRhMDQ2ODI2LCAweDBmZjZmOGYzLCAweGEwOWM3ZjcwLCAweDUzNDZhYmEwLAorICAgIDB4NWNlOTZjMjgsIDB4ZTE3NmVkYTMsIDB4NmJhYzMwN2YsIDB4Mzc2ODI5ZDIsIDB4ODUzNjBmYTksIDB4MTdlM2ZlMmEsIDB4MjRiNzk3NjcsIDB4ZjVhOTZiMjAsCisgICAgMHhkNmNkMjU5NSwgMHg2OGZmMWViZiwgMHg3NTU1NDQyYywgMHhmMTlmMDZiZSwgMHhmOWUwNjU5YSwgMHhlZWI5NDkxZCwgMHgzNDAxMDcxOCwgMHhiYjMwY2FiOCwKKyAgICAweGU4MjJmZTE1LCAweDg4NTcwOTgzLCAweDc1MGU2MjQ5LCAweGRhNjI3ZTU1LCAweDVlNzZmZmE4LCAweGIxNTM0NTQ2LCAweDZkNDdkZTA4LCAweGVmZTllN2Q0fTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IFM2WzI1Nl09eworICAgIDB4ZjZmYThmOWQsIDB4MmNhYzZjZTEsIDB4NGNhMzQ4NjcsIDB4ZTIzMzdmN2MsIDB4OTVkYjA4ZTcsIDB4MDE2ODQzYjQsIDB4ZWNlZDVjYmMsIDB4MzI1NTUzYWMsCisgICAgMHhiZjlmMDk2MCwgMHhkZmExZTJlZCwgMHg4M2YwNTc5ZCwgMHg2M2VkODZiOSwgMHgxYWI2YTZiOCwgMHhkZTVlYmUzOSwgMHhmMzhmZjczMiwgMHg4OTg5YjEzOCwKKyAgICAweDMzZjE0OTYxLCAweGMwMTkzN2JkLCAweGY1MDZjNmRhLCAweGU0NjI1ZTdlLCAweGEzMDhlYTk5LCAweDRlMjNlMzNjLCAweDc5Y2JkN2NjLCAweDQ4YTE0MzY3LAorICAgIDB4YTMxNDk2MTksIDB4ZmVjOTRiZDUsIDB4YTExNDE3NGEsIDB4ZWFhMDE4NjYsIDB4YTA4NGRiMmQsIDB4MDlhODQ4NmYsIDB4YTg4ODYxNGEsIDB4MjkwMGFmOTgsCisgICAgMHgwMTY2NTk5MSwgMHhlMTk5Mjg2MywgMHhjOGYzMGM2MCwgMHgyZTc4ZWYzYywgMHhkMGQ1MTkzMiwgMHhjZjBmZWMxNCwgMHhmN2NhMDdkMiwgMHhkMGE4MjA3MiwKKyAgICAweGZkNDExOTdlLCAweDkzMDVhNmIwLCAweGU4NmJlM2RhLCAweDc0YmVkM2NkLCAweDM3MmRhNTNjLCAweDRjN2Y0NDQ4LCAweGRhYjVkNDQwLCAweDZkYmEwZWMzLAorICAgIDB4MDgzOTE5YTcsIDB4OWZiYWVlZDksIDB4NDlkYmNmYjAsIDB4NGU2NzBjNTMsIDB4NWMzZDljMDEsIDB4NjRiZGI5NDEsIDB4MmMwZTYzNmEsIDB4YmE3ZGQ5Y2QsCisgICAgMHhlYTZmNzM4OCwgMHhlNzBiYzc2MiwgMHgzNWYyOWFkYiwgMHg1YzRjZGQ4ZCwgMHhmMGQ0OGQ4YywgMHhiODgxNTNlMiwgMHgwOGExOTg2NiwgMHgxYWUyZWFjOCwKKyAgICAweDI4NGNhZjg5LCAweGFhOTI4MjIzLCAweDkzMzRiZTUzLCAweDNiM2EyMWJmLCAweDE2NDM0YmUzLCAweDlhZWEzOTA2LCAweGVmZThjMzZlLCAweGY4OTBjZGQ5LAorICAgIDB4ODAyMjZkYWUsIDB4YzM0MGE0YTMsIDB4ZGY3ZTljMDksIDB4YTY5NGE4MDcsIDB4NWI3YzVlY2MsIDB4MjIxZGIzYTYsIDB4OWE2OWEwMmYsIDB4Njg4MThhNTQsCisgICAgMHhjZWIyMjk2ZiwgMHg1M2MwODQzYSwgMHhmZTg5MzY1NSwgMHgyNWJmZTY4YSwgMHhiNDYyOGFiYywgMHhjZjIyMmViZiwgMHgyNWFjNmY0OCwgMHhhOWE5OTM4NywKKyAgICAweDUzYmRkYjY1LCAweGU3NmZmYmU3LCAweGU5NjdmZDc4LCAweDBiYTkzNTYzLCAweDhlMzQyYmMxLCAweGU4YTExYmU5LCAweDQ5ODA3NDBkLCAweGM4MDg3ZGZjLAorICAgIDB4OGRlNGJmOTksIDB4YTExMTAxYTAsIDB4N2ZkMzc5NzUsIDB4ZGE1YTI2YzAsIDB4ZTgxZjk5NGYsIDB4OTUyOGNkODksIDB4ZmQzMzlmZWQsIDB4Yjg3ODM0YmYsCisgICAgMHg1ZjA0NDU2ZCwgMHgyMjI1ODY5OCwgMHhjOWM0YzgzYiwgMHgyZGMxNTZiZSwgMHg0ZjYyOGRhYSwgMHg1N2Y1NWVjNSwgMHhlMjIyMGFiZSwgMHhkMjkxNmViZiwKKyAgICAweDRlYzc1Yjk1LCAweDI0ZjJjM2MwLCAweDQyZDE1ZDk5LCAweGNkMGQ3ZmEwLCAweDdiNmUyN2ZmLCAweGE4ZGM4YWYwLCAweDczNDVjMTA2LCAweGY0MWUyMzJmLAorICAgIDB4MzUxNjIzODYsIDB4ZTZlYTg5MjYsIDB4MzMzM2IwOTQsIDB4MTU3ZWM2ZjIsIDB4MzcyYjc0YWYsIDB4NjkyNTczZTQsIDB4ZTlhOWQ4NDgsIDB4ZjMxNjAyODksCisgICAgMHgzYTYyZWYxZCwgMHhhNzg3ZTIzOCwgMHhmM2E1ZjY3NiwgMHg3NDM2NDg1MywgMHgyMDk1MTA2MywgMHg0NTc2Njk4ZCwgMHhiNmZhZDQwNywgMHg1OTJhZjk1MCwKKyAgICAweDM2ZjczNTIzLCAweDRjZmI2ZTg3LCAweDdkYTRjZWMwLCAweDZjMTUyZGFhLCAweGNiMDM5NmE4LCAweGM1MGRmZTVkLCAweGZjZDcwN2FiLCAweDA5MjFjNDJmLAorICAgIDB4ODlkZmYwYmIsIDB4NWZlMmJlNzgsIDB4NDQ4ZjRmMzMsIDB4NzU0NjEzYzksIDB4MmIwNWQwOGQsIDB4NDhiOWQ1ODUsIDB4ZGMwNDk0NDEsIDB4YzgwOThmOWIsCisgICAgMHg3ZGVkZTc4NiwgMHhjMzlhMzM3MywgMHg0MjQxMDAwNSwgMHg2YTA5MTc1MSwgMHgwZWYzYzhhNiwgMHg4OTAwNzJkNiwgMHgyODIwNzY4MiwgMHhhOWE5ZjdiZSwKKyAgICAweGJmMzI2NzlkLCAweGQ0NWI1Yjc1LCAweGIzNTNmZDAwLCAweGNiYjBlMzU4LCAweDgzMGYyMjBhLCAweDFmOGZiMjE0LCAweGQzNzJjZjA4LCAweGNjM2M0YTEzLAorICAgIDB4OGNmNjMxNjYsIDB4MDYxYzg3YmUsIDB4ODhjOThmODgsIDB4NjA2MmUzOTcsIDB4NDdjZjhlN2EsIDB4YjZjODUyODMsIDB4M2NjMmFjZmIsIDB4M2ZjMDY5NzYsCisgICAgMHg0ZThmMDI1MiwgMHg2NGQ4MzE0ZCwgMHhkYTM4NzBlMywgMHgxZTY2NTQ1OSwgMHhjMTA5MDhmMCwgMHg1MTMwMjFhNSwgMHg2YzViNjhiNywgMHg4MjJmOGFhMCwKKyAgICAweDMwMDdjZDNlLCAweDc0NzE5ZWVmLCAweGRjODcyNjgxLCAweDA3MzM0MGQ0LCAweDdlNDMyZmQ5LCAweDBjNWVjMjQxLCAweDg4MDkyODZjLCAweGY1OTJkODkxLAorICAgIDB4MDhhOTMwZjYsIDB4OTU3ZWYzMDUsIDB4YjdmYmZmYmQsIDB4YzI2NmU5NmYsIDB4NmZlNGFjOTgsIDB4YjE3M2VjYzAsIDB4YmM2MGI0MmEsIDB4OTUzNDk4ZGEsCisgICAweGZiYTFhZTEyLCAweDJkNGJkNzM2LCAweDBmMjVmYWFiLCAweGE0ZjNmY2ViLCAweGUyOTY5MTIzLCAweDI1N2YwYzNkLCAweDkzNDhhZjQ5LCAweDM2MTQwMGJjLAorICAgIDB4ZTg4MTZmNGEsIDB4MzgxNGYyMDAsIDB4YTNmOTQwNDMsIDB4OWM3YTU0YzIsIDB4YmM3MDRmNTcsIDB4ZGE0MWU3ZjksIDB4YzI1YWQzM2EsIDB4NTRmNGEwODQsCisgICAgMHhiMTdmNTUwNSwgMHg1OTM1N2NiZSwgMHhlZGJkMTVjOCwgMHg3Zjk3YzVhYiwgMHhiYTVhYzdiNSwgMHhiNmY2ZGVhZiwgMHgzYTQ3OWMzYSwgMHg1MzAyZGEyNSwKKyAgICAweDY1M2Q3ZTZhLCAweDU0MjY4ZDQ5LCAweDUxYTQ3N2VhLCAweDUwMTdkNTViLCAweGQ3ZDI1ZDg4LCAweDQ0MTM2Yzc2LCAweDA0MDRhOGM4LCAweGI4ZTVhMTIxLAorICAgIDB4YjgxYTkyOGEsIDB4NjBlZDU4NjksIDB4OTdjNTViOTYsIDB4ZWFlYzk5MWIsIDB4Mjk5MzU5MTMsIDB4MDFmZGI3ZjEsIDB4MDg4ZThkZmEsIDB4OWFiNmY2ZjUsCisgICAgMHgzYjRjYmY5ZiwgMHg0YTVkZTNhYiwgMHhlNjA1MWQzNSwgMHhhMGUxZDg1NSwgMHhkMzZiNGNmMSwgMHhmNTQ0ZWRlYiwgMHhiMGU5MzUyNCwgMHhiZWJiOGZiZCwKKyAgICAweGEyZDc2MmNmLCAweDQ5YzkyZjU0LCAweDM4YjVmMzMxLCAweDcxMjhhNDU0LCAweDQ4MzkyOTA1LCAweGE2NWIxZGI4LCAweDg1MWM5N2JkLCAweGQ2NzVjZjJmfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IFM3WzI1Nl09eworICAgIDB4ODVlMDQwMTksIDB4MzMyYmY1NjcsIDB4NjYyZGJmZmYsIDB4Y2ZjNjU2OTMsIDB4MmE4ZDdmNmYsIDB4YWI5YmM5MTIsIDB4ZGU2MDA4YTEsIDB4MjAyOGRhMWYsCisgICAgMHgwMjI3YmNlNywgMHg0ZDY0MjkxNiwgMHgxOGZhYzMwMCwgMHg1MGYxOGI4MiwgMHgyY2IyY2IxMSwgMHhiMjMyZTc1YywgMHg0YjM2OTVmMiwgMHhiMjg3MDdkZSwKKyAgICAweGEwNWZiY2Y2LCAweGNkNDE4MWU5LCAweGUxNTAyMTBjLCAweGUyNGVmMWJkLCAweGIxNjhjMzgxLCAweGZkZTRlNzg5LCAweDVjNzliMGQ4LCAweDFlOGJmZDQzLAorICAgIDB4NGQ0OTUwMDEsIDB4MzhiZTQzNDEsIDB4OTEzY2VlMWQsIDB4OTJhNzljM2YsIDB4MDg5NzY2YmUsIDB4YmFlZWFkZjQsIDB4MTI4NmJlY2YsIDB4YjZlYWNiMTksCisgICAgMHgyNjYwYzIwMCwgMHg3NTY1YmRlNCwgMHg2NDI0MWY3YSwgMHg4MjQ4ZGNhOSwgMHhjM2IzYWQ2NiwgMHgyODEzNjA4NiwgMHgwYmQ4ZGZhOCwgMHgzNTZkMWNmMiwKKyAgICAweDEwNzc4OWJlLCAweGIzYjJlOWNlLCAweDA1MDJhYThmLCAweDBiYzAzNTFlLCAweDE2NmJmNTJhLCAweGViMTJmZjgyLCAweGUzNDg2OTExLCAweGQzNGQ3NTE2LAorICAgIDB4NGU3YjNhZmYsIDB4NWY0MzY3MWIsIDB4OWNmNmUwMzcsIDB4NDk4MWFjODMsIDB4MzM0MjY2Y2UsIDB4OGM5MzQxYjcsIDB4ZDBkODU0YzAsIDB4Y2IzYTZjODgsCisgICAgMHg0N2JjMjgyOSwgMHg0NzI1YmEzNywgMHhhNjZhZDIyYiwgMHg3YWQ2MWYxZSwgMHgwYzVjYmFmYSwgMHg0NDM3ZjEwNywgMHhiNmU3OTk2MiwgMHg0MmQyZDgxNiwKKyAgICAweDBhOTYxMjg4LCAweGUxYTVjMDZlLCAweDEzNzQ5ZTY3LCAweDcyZmMwODFhLCAweGIxZDEzOWY3LCAweGY5NTgzNzQ1LCAweGNmMTlkZjU4LCAweGJlYzNmNzU2LAorICAgIDB4YzA2ZWJhMzAsIDB4MDcyMTFiMjQsIDB4NDVjMjg4MjksIDB4Yzk1ZTMxN2YsIDB4YmM4ZWM1MTEsIDB4MzhiYzQ2ZTksIDB4YzZlNmZhMTQsIDB4YmFlODU4NGEsCisgICAgMHhhZDRlYmM0NiwgMHg0NjhmNTA4YiwgMHg3ODI5NDM1ZiwgMHhmMTI0MTgzYiwgMHg4MjFkYmE5ZiwgMHhhZmY2MGZmNCwgMHhlYTJjNGU2ZCwgMHgxNmUzOTI2NCwKKyAgICAweDkyNTQ0YThiLCAweDAwOWI0ZmMzLCAweGFiYTY4Y2VkLCAweDlhYzk2Zjc4LCAweDA2YTViNzlhLCAweGIyODU2ZTZlLCAweDFhZWMzY2E5LCAweGJlODM4Njg4LAorICAgIDB4MGUwODA0ZTksIDB4NTVmMWJlNTYsIDB4ZTdlNTM2M2IsIDB4YjNhMWYyNWQsIDB4ZjdkZWJiODUsIDB4NjFmZTAzM2MsIDB4MTY3NDYyMzMsIDB4M2MwMzRjMjgsCisgICAgMHhkYTZkMGM3NCwgMHg3OWFhYzU2YywgMHgzY2U0ZTFhZCwgMHg1MWYwYzgwMiwgMHg5OGY4ZjM1YSwgMHgxNjI2YTQ5ZiwgMHhlZWQ4MmIyOSwgMHgxZDM4MmZlMywKKyAgICAweDBjNGZiOTlhLCAweGJiMzI1Nzc4LCAweDNlYzZkOTdiLCAweDZlNzdhNmE5LCAweGNiNjU4YjVjLCAweGQ0NTIzMGM3LCAweDJiZDE0MDhiLCAweDYwYzAzZWI3LAorICAgIDB4YjkwNjhkNzgsIDB4YTMzNzU0ZjQsIDB4ZjQzMGM4N2QsIDB4YzhhNzEzMDIsIDB4Yjk2ZDhjMzIsIDB4ZWJkNGU3YmUsIDB4YmU4YjlkMmQsIDB4Nzk3OWZiMDYsCisgICAgMHhlNzIyNTMwOCwgMHg4Yjc1Y2Y3NywgMHgxMWVmOGRhNCwgMHhlMDgzYzg1OCwgMHg4ZDZiNzg2ZiwgMHg1YTYzMTdhNiwgMHhmYTVjZjdhMCwgMHg1ZGRhMDAzMywKKyAgICAweGYyOGViZmIwLCAweGY1YjljMzEwLCAweGEwZWFjMjgwLCAweDA4Yjk3NjdhLCAweGEzZDlkMmIwLCAweDc5ZDM0MjE3LCAweDAyMWE3MThkLCAweDlhYzYzMzZhLAorICAgIDB4MjcxMWZkNjAsIDB4NDM4MDUwZTMsIDB4MDY5OTA4YTgsIDB4M2Q3ZmVkYzQsIDB4ODI2ZDJiZWYsIDB4NGVlYjg0NzYsIDB4NDg4ZGNmMjUsIDB4MzZjOWQ1NjYsCisgICAgMHgyOGU3NGU0MSwgMHhjMjYxMGFjYSwgMHgzZDQ5YTljZiwgMHhiYWUzYjlkZiwgMHhiNjVmOGRlNiwgMHg5MmFlYWY2NCwgMHgzYWM3ZDVlNiwgMHg5ZWE4MDUwOSwKKyAgICAweGYyMmIwMTdkLCAweGE0MTczZjcwLCAweGRkMWUxNmMzLCAweDE1ZTBkN2Y5LCAweDUwYjFiODg3LCAweDJiOWY0ZmQ1LCAweDYyNWFiYTgyLCAweDZhMDE3OTYyLAorICAgIDB4MmVjMDFiOWMsIDB4MTU0ODhhYTksIDB4ZDcxNmU3NDAsIDB4NDAwNTVhMmMsIDB4OTNkMjlhMjIsIDB4ZTMyZGJmOWEsIDB4MDU4NzQ1YjksIDB4MzQ1M2RjMWUsCisgICAgMHhkNjk5Mjk2ZSwgMHg0OTZjZmY2ZiwgMHgxYzlmNDk4NiwgMHhkZmUyZWQwNywgMHhiODcyNDJkMSwgMHgxOWRlN2VhZSwgMHgwNTNlNTYxYSwgMHgxNWFkNmY4YywKKyAgICAweDY2NjI2YzFjLCAweDcxNTRjMjRjLCAweGVhMDgyYjJhLCAweDkzZWIyOTM5LCAweDE3ZGNiMGYwLCAweDU4ZDRmMmFlLCAweDllYTI5NGZiLCAweDUyY2Y1NjRjLAorICAgIDB4OTg4M2ZlNjYsIDB4MmVjNDA1ODEsIDB4NzYzOTUzYzMsIDB4MDFkNjY5MmUsIDB4ZDNhMGMxMDgsIDB4YTFlNzE2MGUsIDB4ZTRmMmRmYTYsIDB4NjkzZWQyODUsCisgICAgMHg3NDkwNDY5OCwgMHg0YzJiMGVkZCwgMHg0Zjc1NzY1NiwgMHg1ZDM5MzM3OCwgMHhhMTMyMjM0ZiwgMHgzZDMyMWM1ZCwgMHhjM2Y1ZTE5NCwgMHg0YjI2OTMwMSwKKyAgICAweGM3OWYwMjJmLCAweDNjOTk3ZTdlLCAweDVlNGY5NTA0LCAweDNmZmFmYmJkLCAweDc2ZjdhZDBlLCAweDI5NjY5M2Y0LCAweDNkMWZjZTZmLCAweGM2MWU0NWJlLAorICAgIDB4ZDNiNWFiMzQsIDB4ZjcyYmY5YjcsIDB4MWIwNDM0YzAsIDB4NGU3MmI1NjcsIDB4NTU5MmEzM2QsIDB4YjUyMjkzMDEsIDB4Y2ZkMmE4N2YsIDB4NjBhZWI3NjcsCisgICAgMHgxODE0Mzg2YiwgMHgzMGJjYzMzZCwgMHgzOGEwYzA3ZCwgMHhmZDE2MDZmMiwgMHhjMzYzNTE5YiwgMHg1ODlkZDM5MCwgMHg1NDc5ZjhlNiwgMHgxY2I4ZDY0NywKKyAgICAweDk3ZmQ2MWE5LCAweGVhNzc1OWY0LCAweDJkNTc1MzlkLCAweDU2OWE1OGNmLCAweGU4NGU2M2FkLCAweDQ2MmUxYjc4LCAweDY1ODBmODdlLCAweGYzODE3OTE0LAorICAgIDB4OTFkYTU1ZjQsIDB4NDBhMjMwZjMsIDB4ZDE5ODhmMzUsIDB4YjZlMzE4ZDIsIDB4M2ZmYTUwYmMsIDB4M2Q0MGYwMjEsIDB4YzNjMGJkYWUsIDB4NDk1OGMyNGMsCisgICAgMHg1MThmMzZiMiwgMHg4NGIxZDM3MCwgMHgwZmVkY2U4MywgMHg4NzhkZGFkYSwgMHhmMmEyNzljNywgMHg5NGUwMWJlOCwgMHg5MDcxNmY0YiwgMHg5NTRiOGFhM307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBTOFsyNTZdPXsKKyAgICAweGUyMTYzMDBkLCAweGJiZGRmZmZjLCAweGE3ZWJkYWJkLCAweDM1NjQ4MDk1LCAweDc3ODlmOGI3LCAweGU2YzExMjFiLCAweDBlMjQxNjAwLCAweDA1MmNlOGI1LAorICAgIDB4MTFhOWNmYjAsIDB4ZTU5NTJmMTEsIDB4ZWNlNzk5MGEsIDB4OTM4NmQxNzQsIDB4MmE0MjkzMWMsIDB4NzZlMzgxMTEsIDB4YjEyZGVmM2EsIDB4MzdkZGRkZmMsCisgICAgMHhkZTlhZGViMSwgMHgwYTBjYzMyYywgMHhiZTE5NzAyOSwgMHg4NGEwMDk0MCwgMHhiYjI0M2EwZiwgMHhiNGQxMzdjZiwgMHhiNDRlNzlmMCwgMHgwNDllZWRmZCwKKyAgICAweDBiMTVhMTVkLCAweDQ4MGQzMTY4LCAweDhiYmJkZTVhLCAweDY2OWRlZDQyLCAweGM3ZWNlODMxLCAweDNmOGY5NWU3LCAweDcyZGYxOTFiLCAweDc1ODAzMzBkLAorICAgIDB4OTQwNzQyNTEsIDB4NWM3ZGNkZmEsIDB4YWJiZTZkNjMsIDB4YWE0MDIxNjQsIDB4YjMwMWQ0MGEsIDB4MDJlN2QxY2EsIDB4NTM1NzFkYWUsIDB4N2EzMTgyYTIsCisgICAgMHgxMmE4ZGRlYywgMHhmZGFhMzM1ZCwgMHgxNzZmNDNlOCwgMHg3MWZiNDZkNCwgMHgzODEyOTAyMiwgMHhjZTk0OWFkNCwgMHhiODQ3NjlhZCwgMHg5NjViZDg2MiwKKyAgICAweDgyZjNkMDU1LCAweDY2ZmI5NzY3LCAweDE1YjgwYjRlLCAweDFkNWI0N2EwLCAweDRjZmRlMDZmLCAweGMyOGVjNGI4LCAweDU3ZTg3MjZlLCAweDY0N2E3OGZjLAorICAgIDB4OTk4NjVkNDQsIDB4NjA4YmQ1OTMsIDB4NmMyMDBlMDMsIDB4MzlkYzVmZjYsIDB4NWQwYjAwYTMsIDB4YWU2M2FmZjIsIDB4N2U4YmQ2MzIsIDB4NzAxMDhjMGMsCisgICAgMHhiYmQzNTA0OSwgMHgyOTk4ZGYwNCwgMHg5ODBjZjQyYSwgMHg5YjZkZjQ5MSwgMHg5ZTdlZGQ1MywgMHgwNjkxODU0OCwgMHg1OGNiN2UwNywgMHgzYjc0ZWYyZSwKKyAgICAweDUyMmZmZmIxLCAweGQyNDcwOGNjLCAweDFjN2UyN2NkLCAweGE0ZWIyMTViLCAweDNjZjFkMmUyLCAweDE5YjQ3YTM4LCAweDQyNGY3NjE4LCAweDM1ODU2MDM5LAorICAgIDB4OWQxN2RlZTcsIDB4MjdlYjM1ZTYsIDB4YzlhZmY2N2IsIDB4MzZiYWY1YjgsIDB4MDljNDY3Y2QsIDB4YzE4OTEwYjEsIDB4ZTExZGJmN2IsIDB4MDZjZDFhZjgsCisgICAgMHg3MTcwYzYwOCwgMHgyZDVlMzM1NCwgMHhkNGRlNDk1YSwgMHg2NGM2ZDAwNiwgMHhiY2MwYzYyYywgMHgzZGQwMGRiMywgMHg3MDhmOGYzNCwgMHg3N2Q1MWI0MiwKKyAgICAweDI2NGY2MjBmLCAweDI0YjhkMmJmLCAweDE1YzFiNzllLCAweDQ2YTUyNTY0LCAweGY4ZDdlNTRlLCAweDNlMzc4MTYwLCAweDc4OTVjZGE1LCAweDg1OWMxNWE1LAorICAgIDB4ZTY0NTk3ODgsIDB4YzM3YmM3NWYsIDB4ZGIwN2JhMGMsIDB4MDY3NmEzYWIsIDB4N2YyMjliMWUsIDB4MzE4NDJlN2IsIDB4MjQyNTlmZDcsIDB4ZjhiZWY0NzIsCisgICAgMHg4MzVmZmNiOCwgMHg2ZGY0YzFmMiwgMHg5NmY1YjE5NSwgMHhmZDBhZjBmYywgMHhiMGZlMTM0YywgMHhlMjUwNmQzZCwgMHg0ZjliMTJlYSwgMHhmMjE1ZjIyNSwKKyAgICAweGEyMjM3MzZmLCAweDlmYjRjNDI4LCAweDI1ZDA0OTc5LCAweDM0YzcxM2Y4LCAweGM0NjE4MTg3LCAweGVhN2E2ZTk4LCAweDdjZDE2ZWZjLCAweDE0MzY4NzZjLAorICAgIDB4ZjE1NDQxMDcsIDB4YmVkZWVlMTQsIDB4NTZlOWFmMjcsIDB4YTA0YWE0NDEsIDB4M2NmN2M4OTksIDB4OTJlY2JhZTYsIDB4ZGQ2NzAxNmQsIDB4MTUxNjgyZWIsCisgICAgMHhhODQyZWVkZiwgMHhmZGJhNjBiNCwgMHhmMTkwN2I3NSwgMHgyMGUzMDMwZiwgMHgyNGQ4YzI5ZSwgMHhlMTM5NjczYiwgMHhlZmE2M2ZiOCwgMHg3MTg3MzA1NCwKKyAgICAweGI2ZjJjZjNiLCAweDlmMzI2NDQyLCAweGNiMTVhNGNjLCAweGIwMWE0NTA0LCAweGYxZTQ3ZDhkLCAweDg0NGExYmU1LCAweGJhZTdkZmRjLCAweDQyY2JkYTcwLAorICAgIDB4Y2Q3ZGFlMGEsIDB4NTdlODViN2EsIDB4ZDUzZjVhZjYsIDB4MjBjZjRkOGMsIDB4Y2VhNGQ0MjgsIDB4NzlkMTMwYTQsIDB4MzQ4NmViZmIsIDB4MzNkM2NkZGMsCisgICAgMHg3Nzg1M2I1MywgMHgzN2VmZmNiNSwgMHhjNTA2ODc3OCwgMHhlNTgwYjNlNiwgMHg0ZTY4YjhmNCwgMHhjNWM4YjM3ZSwgMHgwZDgwOWVhMiwgMHgzOThmZWI3YywKKyAgICAweDEzMmE0Zjk0LCAweDQzYjc5NTBlLCAweDJmZWU3ZDFjLCAweDIyMzYxM2JkLCAweGRkMDZjYWEyLCAweDM3ZGY5MzJiLCAweGM0MjQ4Mjg5LCAweGFjZjNlYmMzLAorICAgIDB4NTcxNWY2YjcsIDB4ZWYzNDc4ZGQsIDB4ZjI2NzYxNmYsIDB4YzE0OGNiZTQsIDB4OTA1MjgxNWUsIDB4NWU0MTBmYWIsIDB4YjQ4YTI0NjUsIDB4MmVkYTdmYTQsCisgICAgMHhlODdiNDBlNCwgMHhlOThlYTA4NCwgMHg1ODg5ZTllMSwgMHhlZmQzOTBmYywgMHhkZDA3ZDM1YiwgMHhkYjQ4NTY5NCwgMHgzOGQ3ZTViMiwgMHg1NzcyMDEwMSwKKyAgICAweDczMGVkZWJjLCAweDViNjQzMTEzLCAweDk0OTE3ZTRmLCAweDUwM2MyZmJhLCAweDY0NmYxMjgyLCAweDc1MjNkMjRhLCAweGUwNzc5Njk1LCAweGY5YzE3YThmLAorICAgIDB4N2E1YjIxMjEsIDB4ZDE4N2I4OTYsIDB4MjkyNjNhNGQsIDB4YmE1MTBjZGYsIDB4ODFmNDdjOWYsIDB4YWQxMTYzZWQsIDB4ZWE3YjU5NjUsIDB4MWEwMDcyNmUsCisgICAgMHgxMTQwMzA5MiwgMHgwMGRhNmQ3NywgMHg0YTBjZGQ2MSwgMHhhZDFmNDYwMywgMHg2MDViZGZiMCwgMHg5ZWVkYzM2NCwgMHgyMmViZTZhOCwgMHhjZWU3ZDI4YSwKKyAgICAweGEwZTczNmEwLCAweDU1NjRhNmI5LCAweDEwODUzMjA5LCAweGM3ZWI4ZjM3LCAweDJkZTcwNWNhLCAweDg5NTE1NzBmLCAweGRmMDk4MjJiLCAweGJkNjkxYTZjLAorICAgIDB4YWExMmU0ZjIsIDB4ODc0NTFjMGYsIDB4ZTBmNmEyN2EsIDB4M2FkYTQ4MTksIDB4NGNmMTc2NGYsIDB4MGQ3NzFjMmIsIDB4NjdjZGIxNTYsIDB4MzUwZDgzODQsCisgICAgMHg1OTM4ZmEwZiwgMHg0MjM5OWVmMywgMHgzNjk5N2IwNywgMHgwZTg0MDkzZCwgMHg0YWE5M2U2MSwgMHg4MzYwZDg3YiwgMHgxZmE5OGIwYywgMHgxMTQ5MzgyYywKKyAgICAweGU5NzYyNWE1LCAweDA2MTRkMWI3LCAweDBlMjUyNDRiLCAweDBjNzY4MzQ3LCAweDU4OWU4ZDgyLCAweDBkMjA1OWQxLCAweGE0NjZiYjFlLCAweGY4ZGEwYTgyLAorICAgIDB4MDRmMTkxMzAsIDB4YmE2ZTRlYzAsIDB4OTkyNjUxNjQsIDB4MWVlNzIzMGQsIDB4NTBiMmFkODAsIDB4ZWFlZTY4MDEsIDB4OGRiMmEyODMsIDB4ZWE4YmY1OWV9OworCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9yb3VuZF9rZXlzKGludCBybmRzLHVpbnQzMl90KiBLLCB1aW50MzJfdCogeCwgdWludDMyX3QqIHopCit7CisgICAgQ09NUFVURV9aOworCisgICAgS1sxXT1TNVtJQSh6WzJdKV1eUzZbSUIoelsyXSldXlM3W0lEKHpbMV0pXV5TOFtJQyh6WzFdKV1eUzVbSUMoelswXSldOworICAgIEtbMl09UzVbSUMoelsyXSldXlM2W0lEKHpbMl0pXV5TN1tJQih6WzFdKV1eUzhbSUEoelsxXSldXlM2W0lDKHpbMV0pXTsKKyAgICBLWzNdPVM1W0lBKHpbM10pXV5TNltJQih6WzNdKV1eUzdbSUQoelswXSldXlM4W0lDKHpbMF0pXV5TN1tJQih6WzJdKV07CisgICAgS1s0XT1TNVtJQyh6WzNdKV1eUzZbSUQoelszXSldXlM3W0lCKHpbMF0pXV5TOFtJQSh6WzBdKV1eUzhbSUEoelszXSldOworCisgICAgQ09NUFVURV9YOworCisgICAgS1s1XT1TNVtJRCh4WzBdKV1eUzZbSUMoeFswXSldXlM3W0lBKHhbM10pXV5TOFtJQih4WzNdKV1eUzVbSUEoeFsyXSldOworICAgIEtbNl09UzVbSUIoeFswXSldXlM2W0lBKHhbMF0pXV5TN1tJQyh4WzNdKV1eUzhbSUQoeFszXSldXlM2W0lCKHhbM10pXTsKKyAgICBLWzddPVM1W0lEKHhbMV0pXV5TNltJQyh4WzFdKV1eUzdbSUEoeFsyXSldXlM4W0lCKHhbMl0pXV5TN1tJRCh4WzBdKV07CisgICAgS1s4XT1TNVtJQih4WzFdKV1eUzZbSUEoeFsxXSldXlM3W0lDKHhbMl0pXV5TOFtJRCh4WzJdKV1eUzhbSUQoeFsxXSldOworCisgICAgQ09NUFVURV9aOworCisgICAgS1s5XT1TNVtJRCh6WzBdKV1eUzZbSUMoelswXSldXlM3W0lBKHpbM10pXV5TOFtJQih6WzNdKV1eUzVbSUIoelsyXSldOworICAgIEtbMTBdPVM1W0lCKHpbMF0pXV5TNltJQSh6WzBdKV1eUzdbSUMoelszXSldXlM4W0lEKHpbM10pXV5TNltJQSh6WzNdKV07CisgICAgS1sxMV09UzVbSUQoelsxXSldXlM2W0lDKHpbMV0pXV5TN1tJQSh6WzJdKV1eUzhbSUIoelsyXSldXlM3W0lDKHpbMF0pXTsKKyAgICBLWzEyXT1TNVtJQih6WzFdKV1eUzZbSUEoelsxXSldXlM3W0lDKHpbMl0pXV5TOFtJRCh6WzJdKV1eUzhbSUMoelsxXSldOworCisgICAgQ09NUFVURV9YOworCisgICAgaWYgKHJuZHM9PTE2KSB7CisgICAgICAgIEtbMTNdPVM1W0lBKHhbMl0pXV5TNltJQih4WzJdKV1eUzdbSUQoeFsxXSldXlM4W0lDKHhbMV0pXV5TNVtJRCh4WzBdKV07CisgICAgICAgIEtbMTRdPVM1W0lDKHhbMl0pXV5TNltJRCh4WzJdKV1eUzdbSUIoeFsxXSldXlM4W0lBKHhbMV0pXV5TNltJRCh4WzFdKV07CisgICAgICAgIEtbMTVdPVM1W0lBKHhbM10pXV5TNltJQih4WzNdKV1eUzdbSUQoeFswXSldXlM4W0lDKHhbMF0pXV5TN1tJQSh4WzJdKV07CisgICAgICAgIEtbMTZdPVM1W0lDKHhbM10pXV5TNltJRCh4WzNdKV1eUzdbSUIoeFswXSldXlM4W0lBKHhbMF0pXV5TOFtJQih4WzNdKV07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlbmNpcGhlcihBVkNBU1Q1KiBjcyx1aW50OF90KiBkc3QsY29uc3QgdWludDhfdCogc3JjKQoreworICAgIHVpbnQzMl90IHIsbCxmLEk7CisgICAgbD1BVl9SQjMyKHNyYyk7CisgICAgcj1BVl9SQjMyKHNyYys0KTsKKyAgICBGMShsLHIsMSk7CisgICAgRjIocixsLDIpOworICAgIEYzKGwsciwzKTsKKyAgICBGMShyLGwsNCk7CisgICAgRjIobCxyLDUpOworICAgIEYzKHIsbCw2KTsKKyAgICBGMShsLHIsNyk7CisgICAgRjIocixsLDgpOworICAgIEYzKGwsciw5KTsKKyAgICBGMShyLGwsMTApOworICAgIEYyKGwsciwxMSk7CisgICAgRjMocixsLDEyKTsKKyAgICBpZiAoY3MtPnJvdW5kcz09MTYpIHsKKyAgICAgICAgRjEobCxyLDEzKTsKKyAgICAgICAgRjIocixsLDE0KTsKKyAgICAgICAgRjMobCxyLDE1KTsKKyAgICAgICAgRjEocixsLDE2KTsKKyAgICB9CisgICAgQVZfV0IzMihkc3Qscik7CisgICAgQVZfV0IzMihkc3QrNCxsKTsKK30KKworc3RhdGljIHZvaWQgZGVjaXBoZXIoQVZDQVNUNSogY3MsdWludDhfdCogZHN0LGNvbnN0IHVpbnQ4X3QqIHNyYykKK3sKKyAgICB1aW50MzJfdCBmLEkscixsOworICAgIGw9QVZfUkIzMihzcmMpOworICAgIHI9QVZfUkIzMihzcmMrNCk7CisgICAgaWYgKGNzLT5yb3VuZHM9PTE2KSB7CisgICAgICAgIEYxKGwsciwxNik7CisgICAgICAgIEYzKHIsbCwxNSk7CisgICAgICAgIEYyKGwsciwxNCk7CisgICAgICAgIEYxKHIsbCwxMyk7CisgICAgfQorICAgIEYzKGwsciwxMik7CisgICAgRjIocixsLDExKTsKKyAgICBGMShsLHIsMTApOworICAgIEYzKHIsbCw5KTsKKyAgICBGMihsLHIsOCk7CisgICAgRjEocixsLDcpOworICAgIEYzKGwsciw2KTsKKyAgICBGMihyLGwsNSk7CisgICAgRjEobCxyLDQpOworICAgIEYzKHIsbCwzKTsKKyAgICBGMihsLHIsMik7CisgICAgRjEocixsLDEpOworCisgICAgQVZfV0IzMihkc3Qscik7CisgICAgQVZfV0IzMihkc3QrNCxsKTsKKworfQorCitzdHJ1Y3QgQVZDQVNUNSAqYXZfY2FzdDVfYWxsb2Modm9pZCkKK3sKKyAgICByZXR1cm4gYXZfbWFsbG9jeihzaXplb2Yoc3RydWN0IEFWQ0FTVDUpKTsKK30KKworYXZfY29sZCBpbnQgYXZfY2FzdDVfaW5pdChBVkNBU1Q1KiBjcywgY29uc3QgdWludDhfdCAqa2V5LCBpbnQga2V5X2JpdHMpCit7CisgICAgdWludDhfdCBuZXdLZXlbMTZdOworICAgIGludCBpOworICAgIHVpbnQzMl90IHBbNF0scVs0XTsKKyAgICBpZiAoa2V5X2JpdHMlOHx8a2V5X2JpdHM8NDB8fGtleV9iaXRzPjEyOCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG1lbXNldChuZXdLZXksMCxzaXplb2YobmV3S2V5KSk7CisgICAgbWVtY3B5KG5ld0tleSxrZXksa2V5X2JpdHM+PjMpOworCisgICAgY3MtPnJvdW5kcyA9IGtleV9iaXRzPD04MCA/IDEyOjE2OworICAgIGZvciAoaT0wO2k8NDtpKyspCisgICAgICAgIHFbaV09QVZfUkIzMihuZXdLZXkrKDQqaSkpOworICAgIGdlbmVyYXRlX3JvdW5kX2tleXMoY3MtPnJvdW5kcyxjcy0+S20scSxwKTsKKyAgICBnZW5lcmF0ZV9yb3VuZF9rZXlzKGNzLT5yb3VuZHMsY3MtPktyLHEscCk7CisgICAgZm9yIChpPTA7aTw9Y3MtPnJvdW5kcztpKyspCisgICAgICAgIGNzLT5LcltpXT1jcy0+S3JbaV0mMHgxZjsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBhdl9jYXN0NV9jcnlwdChBVkNBU1Q1KiBjcywgdWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBzcmMsIGludCBjb3VudCwgaW50IGRlY3J5cHQpCit7CisgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgaWYgKGRlY3J5cHQpeworICAgICAgICAgICAgZGVjaXBoZXIoY3MsZHN0LHNyYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbmNpcGhlcihjcyxkc3Qsc3JjKTsKKyAgICAgICAgfQorICAgICAgICBzcmM9c3JjKzg7CisgICAgICAgIGRzdD1kc3QrODsKKyAgICB9Cit9CisKKyNpZmRlZiBURVNUCisjaW5jbHVkZTxzdGRpby5oPgorI2luY2x1ZGU8c3RkbGliLmg+CisjaW5jbHVkZSJsb2cuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgS2V5WzNdWzE2XT17ezB4MDEsMHgyMywweDQ1LDB4NjcsMHgxMiwweDM0LDB4NTYsMHg3OCwweDIzLDB4NDUsMHg2NywweDg5LDB4MzQsMHg1NiwweDc4LDB4OWF9LAorICAgICAgICB7MHgwMSwweDIzLDB4NDUsMHg2NywweDEyLDB4MzQsMHg1NiwweDc4LDB4MjMsMHg0NX0sCisgICAgICAgIHsweDAxLDB4MjMsMHg0NSwweDY3LDB4MTJ9fTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBycHRbOF09ezB4MDEsMHgyMywweDQ1LDB4NjcsMHg4OSwweGFiLDB4Y2QsMHhlZn07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmN0WzNdWzhdPXt7MHgyMywweDhiLDB4NGYsMHhlNSwweDg0LDB4N2UsMHg0NCwweGIyfSwKKyAgICAgICAgezB4ZWIsMHg2YSwweDcxLDB4MWEsMHgyYywweDAyLDB4MjcsMHgxYn0sCisgICAgICAgIHsweDdhLDB4YzgsMHgxNiwweGQxLDB4NmUsMHg5YiwweDMwLDB4MmV9fTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCByY3QyWzJdWzE2XT17ezB4ZWUsMHhhOSwweGQwLDB4YTIsMHg0OSwweGZkLDB4M2IsMHhhNiwweGIzLDB4NDMsMHg2ZiwweGI4LDB4OWQsMHg2ZCwweGNhLDB4OTJ9LAorICAgICAgICB7MHhiMiwweGM5LDB4NWUsMHhiMCwweDBjLDB4MzEsMHhhZCwweDcxLDB4ODAsMHhhYywweDA1LDB4YjgsMHhlOCwweDNkLDB4NjksMHg2ZX19OworICAgIHN0YXRpYyB1aW50OF90IHJwdDJbMl1bMTZdOworICAgIGludCBpLGosZXJyPTA7CisgICAgc3RhdGljIGludCBrZXlfYml0c1szXT17MTI4LDgwLDQwfTsKKyAgICB1aW50OF90IHRlbXBbOF07CisgICAgQVZDQVNUNSAqY3M7CisgICAgY3M9YXZfY2FzdDVfYWxsb2MoKTsKKyAgICBpZiAoIWNzKQorICAgICAgICByZXR1cm4gMTsKKyAgICBmb3IgKGo9MDtqPDM7aisrKXsKKworICAgICAgICBhdl9jYXN0NV9pbml0KGNzLEtleVtqXSxrZXlfYml0c1tqXSk7CisgICAgICAgIGF2X2Nhc3Q1X2NyeXB0KGNzLHRlbXAscnB0LDEsMCk7CisgICAgICAgIGZvciAoaT0wO2k8ODtpKyspeworICAgICAgICAgICAgaWYgKHJjdFtqXVtpXSE9dGVtcFtpXSl7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsQVZfTE9HX0VSUk9SLCIlZCAlMDJ4ICUwMnhcbiIsaSxyY3Rbal1baV0sdGVtcFtpXSk7CisgICAgICAgICAgICAgICAgZXJyPTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdl9jYXN0NV9jcnlwdChjcyx0ZW1wLHJjdFtqXSwxLDEpOworICAgICAgICBmb3IgKGk9MDtpPDg7aSsrKXsKKyAgICAgICAgICAgIGlmIChycHRbaV0hPXRlbXBbaV0peworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLEFWX0xPR19FUlJPUiwiJWQgJTAyeCAlMDJ4XG4iLGkscnB0W2ldLHRlbXBbaV0pOworICAgICAgICAgICAgICAgIGVycj0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1lbWNweShycHQyWzBdLEtleVswXSwxNik7CisgICAgbWVtY3B5KHJwdDJbMV0sS2V5WzBdLDE2KTsKKyAgICBmb3IgKGk9MDtpPDEwMDAwMDA7aSsrKXsKKyAgICAgICAgYXZfY2FzdDVfaW5pdChjcyxycHQyWzFdLDEyOCk7CisgICAgICAgIGF2X2Nhc3Q1X2NyeXB0KGNzLHJwdDJbMF0scnB0MlswXSwyLDApOworICAgICAgICBhdl9jYXN0NV9pbml0KGNzLHJwdDJbMF0sMTI4KTsKKyAgICAgICAgYXZfY2FzdDVfY3J5cHQoY3MscnB0MlsxXSxycHQyWzFdLDIsMCk7CisgICAgfQorICAgIGZvciAoaj0wO2o8MjtqKyspeworICAgICAgICBmb3IgKGk9MDtpPDE2O2krKyl7CisgICAgICAgICAgICBpZiAocmN0MltqXVtpXSE9cnB0MltqXVtpXSl7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsQVZfTE9HX0VSUk9SLCIlZCAlMDJ4ICUwMnhcbiIsaSxyY3QyW2pdW2ldLHJwdDJbal1baV0pOworICAgICAgICAgICAgICAgIGVycj0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWUoY3MpOworICAgIHJldHVybiBlcnI7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvY2FzdDUuaCBiL2ZmbXBlZy9saWJhdnV0aWwvY2FzdDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGRmNmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9jYXN0NS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ0FTVDEyOCBhbGdvcml0aG0gYXMgbWVudGlvbmVkIGluIFJGQzIxNDQKKyAqIENvcHlyaWdodCAoYykgMjAxNCBTdXByYWphIE1lZWRpbnRpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0NBU1Q1X0gKKyNkZWZpbmUgQVZVVElMX0NBU1Q1X0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKy8qKgorICAqIEBmaWxlCisgICogQGJyaWVmIFB1YmxpYyBoZWFkZXIgZm9yIGxpYmF2dXRpbCBDQVNUNSBhbGdvcml0aG0KKyAgKiBAZGVmZ3JvdXAgbGF2dV9jYXN0NSBDQVNUNQorICAqIEBpbmdyb3VwIGxhdnVfY3J5cHRvCisgICogQHsKKyAgKi8KKworZXh0ZXJuIGNvbnN0IGludCBhdl9jYXN0NV9zaXplOworCitzdHJ1Y3QgQVZDQVNUNTsKKworLyoqCisgICogQWxsb2NhdGUgYW4gQVZDQVNUNSBjb250ZXh0CisgICogVG8gZnJlZSB0aGUgc3RydWN0OiBhdl9mcmVlKHB0cikKKyAgKi8KK3N0cnVjdCBBVkNBU1Q1ICphdl9jYXN0NV9hbGxvYyh2b2lkKTsKKy8qKgorICAqIEluaXRpYWxpemUgYW4gQVZDQVNUNSBjb250ZXh0LgorICAqCisgICogQHBhcmFtIGN0eCBhbiBBVkNBU1Q1IGNvbnRleHQKKyAgKiBAcGFyYW0ga2V5IGEga2V5IG9mIDUsNiwuLi4xNiBieXRlcyB1c2VkIGZvciBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyAgKiBAcGFyYW0ga2V5X2JpdHMgbnVtYmVyIG9mIGtleWJpdHM6IHBvc3NpYmxlIGFyZSA0MCw0OCwuLi4sMTI4CisgKi8KK2ludCBhdl9jYXN0NV9pbml0KHN0cnVjdCBBVkNBU1Q1ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmtleSwgaW50IGtleV9iaXRzKTsKKworLyoqCisgICogRW5jcnlwdCBvciBkZWNyeXB0IGEgYnVmZmVyIHVzaW5nIGEgcHJldmlvdXNseSBpbml0aWFsaXplZCBjb250ZXh0CisgICoKKyAgKiBAcGFyYW0gY3R4IGFuIEFWQ0FTVDUgY29udGV4dAorICAqIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gYXJyYXksIGNhbiBiZSBlcXVhbCB0byBzcmMKKyAgKiBAcGFyYW0gc3JjIHNvdXJjZSBhcnJheSwgY2FuIGJlIGVxdWFsIHRvIGRzdAorICAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2YgOCBieXRlIGJsb2NrcworICAqIEBwYXJhbSBkZWNyeXB0IDAgZm9yIGVuY3J5cHRpb24sIDEgZm9yIGRlY3J5cHRpb24KKyAqLwordm9pZCBhdl9jYXN0NV9jcnlwdChzdHJ1Y3QgQVZDQVNUNSAqY3R4LCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvdW50LGludCBkZWNyeXB0KTsKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIEFWVVRJTF9DQVNUNV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmMgYi9mZm1wZWcvbGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwNjc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBhdWRpbyBjaGFubmVsIGxheW91dCB1dGlsaXR5IGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2c3RyaW5nLmgiCisjaW5jbHVkZSAiYXZ1dGlsLmgiCisjaW5jbHVkZSAiY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJicHJpbnQuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RydWN0IGNoYW5uZWxfbmFtZSB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hhbm5lbF9uYW1lIGNoYW5uZWxfbmFtZXNbXSA9IHsKKyAgICAgWzBdID0geyAiRkwiLCAgICAgICAgImZyb250IGxlZnQiICAgICAgICAgICAgfSwKKyAgICAgWzFdID0geyAiRlIiLCAgICAgICAgImZyb250IHJpZ2h0IiAgICAgICAgICAgfSwKKyAgICAgWzJdID0geyAiRkMiLCAgICAgICAgImZyb250IGNlbnRlciIgICAgICAgICAgfSwKKyAgICAgWzNdID0geyAiTEZFIiwgICAgICAgImxvdyBmcmVxdWVuY3kiICAgICAgICAgfSwKKyAgICAgWzRdID0geyAiQkwiLCAgICAgICAgImJhY2sgbGVmdCIgICAgICAgICAgICAgfSwKKyAgICAgWzVdID0geyAiQlIiLCAgICAgICAgImJhY2sgcmlnaHQiICAgICAgICAgICAgfSwKKyAgICAgWzZdID0geyAiRkxDIiwgICAgICAgImZyb250IGxlZnQtb2YtY2VudGVyIiAgfSwKKyAgICAgWzddID0geyAiRlJDIiwgICAgICAgImZyb250IHJpZ2h0LW9mLWNlbnRlciIgfSwKKyAgICAgWzhdID0geyAiQkMiLCAgICAgICAgImJhY2sgY2VudGVyIiAgICAgICAgICAgfSwKKyAgICAgWzldID0geyAiU0wiLCAgICAgICAgInNpZGUgbGVmdCIgICAgICAgICAgICAgfSwKKyAgICBbMTBdID0geyAiU1IiLCAgICAgICAgInNpZGUgcmlnaHQiICAgICAgICAgICAgfSwKKyAgICBbMTFdID0geyAiVEMiLCAgICAgICAgInRvcCBjZW50ZXIiICAgICAgICAgICAgfSwKKyAgICBbMTJdID0geyAiVEZMIiwgICAgICAgInRvcCBmcm9udCBsZWZ0IiAgICAgICAgfSwKKyAgICBbMTNdID0geyAiVEZDIiwgICAgICAgInRvcCBmcm9udCBjZW50ZXIiICAgICAgfSwKKyAgICBbMTRdID0geyAiVEZSIiwgICAgICAgInRvcCBmcm9udCByaWdodCIgICAgICAgfSwKKyAgICBbMTVdID0geyAiVEJMIiwgICAgICAgInRvcCBiYWNrIGxlZnQiICAgICAgICAgfSwKKyAgICBbMTZdID0geyAiVEJDIiwgICAgICAgInRvcCBiYWNrIGNlbnRlciIgICAgICAgfSwKKyAgICBbMTddID0geyAiVEJSIiwgICAgICAgInRvcCBiYWNrIHJpZ2h0IiAgICAgICAgfSwKKyAgICBbMjldID0geyAiREwiLCAgICAgICAgImRvd25taXggbGVmdCIgICAgICAgICAgfSwKKyAgICBbMzBdID0geyAiRFIiLCAgICAgICAgImRvd25taXggcmlnaHQiICAgICAgICAgfSwKKyAgICBbMzFdID0geyAiV0wiLCAgICAgICAgIndpZGUgbGVmdCIgICAgICAgICAgICAgfSwKKyAgICBbMzJdID0geyAiV1IiLCAgICAgICAgIndpZGUgcmlnaHQiICAgICAgICAgICAgfSwKKyAgICBbMzNdID0geyAiU0RMIiwgICAgICAgInN1cnJvdW5kIGRpcmVjdCBsZWZ0IiAgfSwKKyAgICBbMzRdID0geyAiU0RSIiwgICAgICAgInN1cnJvdW5kIGRpcmVjdCByaWdodCIgfSwKKyAgICBbMzVdID0geyAiTEZFMiIsICAgICAgImxvdyBmcmVxdWVuY3kgMiIgICAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfY2hhbm5lbF9uYW1lKGludCBjaGFubmVsX2lkKQoreworICAgIGlmIChjaGFubmVsX2lkIDwgMCB8fCBjaGFubmVsX2lkID49IEZGX0FSUkFZX0VMRU1TKGNoYW5uZWxfbmFtZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gY2hhbm5lbF9uYW1lc1tjaGFubmVsX2lkXS5uYW1lOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCAgICAgICAgIG5iX2NoYW5uZWxzOworICAgIHVpbnQ2NF90ICAgICBsYXlvdXQ7Cit9IGNoYW5uZWxfbGF5b3V0X21hcFtdID0geworICAgIHsgIm1vbm8iLCAgICAgICAgMSwgIEFWX0NIX0xBWU9VVF9NT05PIH0sCisgICAgeyAic3RlcmVvIiwgICAgICAyLCAgQVZfQ0hfTEFZT1VUX1NURVJFTyB9LAorICAgIHsgIjIuMSIsICAgICAgICAgMywgIEFWX0NIX0xBWU9VVF8yUE9JTlQxIH0sCisgICAgeyAiMy4wIiwgICAgICAgICAzLCAgQVZfQ0hfTEFZT1VUX1NVUlJPVU5EIH0sCisgICAgeyAiMy4wKGJhY2spIiwgICAzLCAgQVZfQ0hfTEFZT1VUXzJfMSB9LAorICAgIHsgIjQuMCIsICAgICAgICAgNCwgIEFWX0NIX0xBWU9VVF80UE9JTlQwIH0sCisgICAgeyAicXVhZCIsICAgICAgICA0LCAgQVZfQ0hfTEFZT1VUX1FVQUQgfSwKKyAgICB7ICJxdWFkKHNpZGUpIiwgIDQsICBBVl9DSF9MQVlPVVRfMl8yIH0sCisgICAgeyAiMy4xIiwgICAgICAgICA0LCAgQVZfQ0hfTEFZT1VUXzNQT0lOVDEgfSwKKyAgICB7ICI1LjAiLCAgICAgICAgIDUsICBBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLIH0sCisgICAgeyAiNS4wKHNpZGUpIiwgICA1LCAgQVZfQ0hfTEFZT1VUXzVQT0lOVDAgfSwKKyAgICB7ICI0LjEiLCAgICAgICAgIDUsICBBVl9DSF9MQVlPVVRfNFBPSU5UMSB9LAorICAgIHsgIjUuMSIsICAgICAgICAgNiwgIEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0sgfSwKKyAgICB7ICI1LjEoc2lkZSkiLCAgIDYsICBBVl9DSF9MQVlPVVRfNVBPSU5UMSB9LAorICAgIHsgIjYuMCIsICAgICAgICAgNiwgIEFWX0NIX0xBWU9VVF82UE9JTlQwIH0sCisgICAgeyAiNi4wKGZyb250KSIsICA2LCAgQVZfQ0hfTEFZT1VUXzZQT0lOVDBfRlJPTlQgfSwKKyAgICB7ICJoZXhhZ29uYWwiLCAgIDYsICBBVl9DSF9MQVlPVVRfSEVYQUdPTkFMIH0sCisgICAgeyAiNi4xIiwgICAgICAgICA3LCAgQVZfQ0hfTEFZT1VUXzZQT0lOVDEgfSwKKyAgICB7ICI2LjEiLCAgICAgICAgIDcsICBBVl9DSF9MQVlPVVRfNlBPSU5UMV9CQUNLIH0sCisgICAgeyAiNi4xKGZyb250KSIsICA3LCAgQVZfQ0hfTEFZT1VUXzZQT0lOVDFfRlJPTlQgfSwKKyAgICB7ICI3LjAiLCAgICAgICAgIDcsICBBVl9DSF9MQVlPVVRfN1BPSU5UMCB9LAorICAgIHsgIjcuMChmcm9udCkiLCAgNywgIEFWX0NIX0xBWU9VVF83UE9JTlQwX0ZST05UIH0sCisgICAgeyAiNy4xIiwgICAgICAgICA4LCAgQVZfQ0hfTEFZT1VUXzdQT0lOVDEgfSwKKyAgICB7ICI3LjEod2lkZSkiLCAgIDgsICBBVl9DSF9MQVlPVVRfN1BPSU5UMV9XSURFX0JBQ0sgfSwKKyAgICB7ICI3LjEod2lkZS1zaWRlKSIsICAgOCwgIEFWX0NIX0xBWU9VVF83UE9JTlQxX1dJREUgfSwKKyAgICB7ICJvY3RhZ29uYWwiLCAgIDgsICBBVl9DSF9MQVlPVVRfT0NUQUdPTkFMIH0sCisgICAgeyAiZG93bm1peCIsICAgICAyLCAgQVZfQ0hfTEFZT1VUX1NURVJFT19ET1dOTUlYLCB9LAorfTsKKworI2lmIEZGX0FQSV9HRVRfQ0hBTk5FTF9MQVlPVVRfQ09NUEFUCitzdGF0aWMgdWludDY0X3QgZ2V0X2NoYW5uZWxfbGF5b3V0X3NpbmdsZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4sIGludCBjb21wYXQpCisjZWxzZQorc3RhdGljIHVpbnQ2NF90IGdldF9jaGFubmVsX2xheW91dF9zaW5nbGUoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuKQorI2VuZGlmCit7CisgICAgaW50IGk7CisgICAgY2hhciAqZW5kOworICAgIGludDY0X3QgbGF5b3V0OworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGNoYW5uZWxfbGF5b3V0X21hcCk7IGkrKykgeworICAgICAgICBpZiAoc3RybGVuKGNoYW5uZWxfbGF5b3V0X21hcFtpXS5uYW1lKSA9PSBuYW1lX2xlbiAmJgorICAgICAgICAgICAgIW1lbWNtcChjaGFubmVsX2xheW91dF9tYXBbaV0ubmFtZSwgbmFtZSwgbmFtZV9sZW4pKQorICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxfbGF5b3V0X21hcFtpXS5sYXlvdXQ7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjaGFubmVsX25hbWVzKTsgaSsrKQorICAgICAgICBpZiAoY2hhbm5lbF9uYW1lc1tpXS5uYW1lICYmCisgICAgICAgICAgICBzdHJsZW4oY2hhbm5lbF9uYW1lc1tpXS5uYW1lKSA9PSBuYW1lX2xlbiAmJgorICAgICAgICAgICAgIW1lbWNtcChjaGFubmVsX25hbWVzW2ldLm5hbWUsIG5hbWUsIG5hbWVfbGVuKSkKKyAgICAgICAgICAgIHJldHVybiAoaW50NjRfdCkxIDw8IGk7CisgICAgaSA9IHN0cnRvbChuYW1lLCAmZW5kLCAxMCk7CisKKyNpZiBGRl9BUElfR0VUX0NIQU5ORUxfTEFZT1VUX0NPTVBBVAorICAgIGlmIChjb21wYXQpIHsKKyAgICAgICAgaWYgKGVuZCAtIG5hbWUgPT0gbmFtZV9sZW4gfHwKKyAgICAgICAgICAgIChlbmQgKyAxIC0gbmFtZSA9PSBuYW1lX2xlbiAmJiAqZW5kICA9PSAnYycpKSB7CisgICAgICAgICAgICBsYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChpKTsKKyAgICAgICAgICAgIGlmIChlbmQgLSBuYW1lID09IG5hbWVfbGVuKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiU2luZ2xlIGNoYW5uZWwgbGF5b3V0ICclLipzJyBpcyBpbnRlcnByZXRlZCBhcyBhIG51bWJlciBvZiBjaGFubmVscywgIgorICAgICAgICAgICAgICAgICAgICAgICAic3dpdGNoIHRvIHRoZSBzeW50YXggJyUuKnNjJyBvdGhlcndpc2UgaXQgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbGF5b3V0IG51bWJlciBpbiBhIGxhdGVyIHZlcnNpb25cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfbGVuLCBuYW1lLCBuYW1lX2xlbiwgbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxheW91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICBpZiAoKGVuZCArIDEgLSBuYW1lID09IG5hbWVfbGVuICYmICplbmQgID09ICdjJykpCisgICAgICAgIHJldHVybiBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChpKTsKKyNpZiBGRl9BUElfR0VUX0NIQU5ORUxfTEFZT1VUX0NPTVBBVAorICAgIH0KKyNlbmRpZgorCisgICAgbGF5b3V0ID0gc3RydG9sbChuYW1lLCAmZW5kLCAwKTsKKyAgICBpZiAoZW5kIC0gbmFtZSA9PSBuYW1lX2xlbikKKyAgICAgICAgcmV0dXJuIEZGTUFYKGxheW91dCwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBGRl9BUElfR0VUX0NIQU5ORUxfTEFZT1VUX0NPTVBBVAordWludDY0X3QgZmZfZ2V0X2NoYW5uZWxfbGF5b3V0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBjb21wYXQpCisjZWxzZQordWludDY0X3QgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0KGNvbnN0IGNoYXIgKm5hbWUpCisjZW5kaWYKK3sKKyAgICBjb25zdCBjaGFyICpuLCAqZTsKKyAgICBjb25zdCBjaGFyICpuYW1lX2VuZCA9IG5hbWUgKyBzdHJsZW4obmFtZSk7CisgICAgaW50NjRfdCBsYXlvdXQgPSAwLCBsYXlvdXRfc2luZ2xlOworCisgICAgZm9yIChuID0gbmFtZTsgbiA8IG5hbWVfZW5kOyBuID0gZSArIDEpIHsKKyAgICAgICAgZm9yIChlID0gbjsgZSA8IG5hbWVfZW5kICYmICplICE9ICcrJyAmJiAqZSAhPSAnfCc7IGUrKyk7CisjaWYgRkZfQVBJX0dFVF9DSEFOTkVMX0xBWU9VVF9DT01QQVQKKyAgICAgICAgbGF5b3V0X3NpbmdsZSA9IGdldF9jaGFubmVsX2xheW91dF9zaW5nbGUobiwgZSAtIG4sIGNvbXBhdCk7CisjZWxzZQorICAgICAgICBsYXlvdXRfc2luZ2xlID0gZ2V0X2NoYW5uZWxfbGF5b3V0X3NpbmdsZShuLCBlIC0gbik7CisjZW5kaWYKKyAgICAgICAgaWYgKCFsYXlvdXRfc2luZ2xlKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGxheW91dCB8PSBsYXlvdXRfc2luZ2xlOworICAgIH0KKyAgICByZXR1cm4gbGF5b3V0OworfQorCisjaWYgRkZfQVBJX0dFVF9DSEFOTkVMX0xBWU9VVF9DT01QQVQKK3VpbnQ2NF90IGF2X2dldF9jaGFubmVsX2xheW91dChjb25zdCBjaGFyICpuYW1lKQoreworICAgIHJldHVybiBmZl9nZXRfY2hhbm5lbF9sYXlvdXQobmFtZSwgMSk7Cit9CisjZW5kaWYKKwordm9pZCBhdl9icHJpbnRfY2hhbm5lbF9sYXlvdXQoc3RydWN0IEFWQlByaW50ICpicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9jaGFubmVscywgdWludDY0X3QgY2hhbm5lbF9sYXlvdXQpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAobmJfY2hhbm5lbHMgPD0gMCkKKyAgICAgICAgbmJfY2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoY2hhbm5lbF9sYXlvdXQpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGNoYW5uZWxfbGF5b3V0X21hcCk7IGkrKykKKyAgICAgICAgaWYgKG5iX2NoYW5uZWxzICAgID09IGNoYW5uZWxfbGF5b3V0X21hcFtpXS5uYl9jaGFubmVscyAmJgorICAgICAgICAgICAgY2hhbm5lbF9sYXlvdXQgPT0gY2hhbm5lbF9sYXlvdXRfbWFwW2ldLmxheW91dCkgeworICAgICAgICAgICAgYXZfYnByaW50ZihicCwgIiVzIiwgY2hhbm5lbF9sYXlvdXRfbWFwW2ldLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICBhdl9icHJpbnRmKGJwLCAiJWQgY2hhbm5lbHMiLCBuYl9jaGFubmVscyk7CisgICAgaWYgKGNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgIGludCBpLCBjaDsKKyAgICAgICAgYXZfYnByaW50ZihicCwgIiAoIik7CisgICAgICAgIGZvciAoaSA9IDAsIGNoID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoY2hhbm5lbF9sYXlvdXQgJiAoVUlOVDY0X0MoMSkgPDwgaSkpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGdldF9jaGFubmVsX25hbWUoaSk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoYnAsICIrIik7CisgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoYnAsICIlcyIsIG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2X2JwcmludGYoYnAsICIpIik7CisgICAgfQorfQorCit2b2lkIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX2NoYW5uZWxzLCB1aW50NjRfdCBjaGFubmVsX2xheW91dCkKK3sKKyAgICBBVkJQcmludCBicDsKKworICAgIGF2X2JwcmludF9pbml0X2Zvcl9idWZmZXIoJmJwLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBhdl9icHJpbnRfY2hhbm5lbF9sYXlvdXQoJmJwLCBuYl9jaGFubmVscywgY2hhbm5lbF9sYXlvdXQpOworfQorCitpbnQgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0KQoreworICAgIHJldHVybiBhdl9wb3Bjb3VudDY0KGNoYW5uZWxfbGF5b3V0KTsKK30KKworaW50NjRfdCBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChpbnQgbmJfY2hhbm5lbHMpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoY2hhbm5lbF9sYXlvdXRfbWFwKTsgaSsrKQorICAgICAgICBpZiAobmJfY2hhbm5lbHMgPT0gY2hhbm5lbF9sYXlvdXRfbWFwW2ldLm5iX2NoYW5uZWxzKQorICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxfbGF5b3V0X21hcFtpXS5sYXlvdXQ7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfY2hhbm5lbF9pbmRleCh1aW50NjRfdCBjaGFubmVsX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjaGFubmVsKQoreworICAgIGlmICghKGNoYW5uZWxfbGF5b3V0ICYgY2hhbm5lbCkgfHwKKyAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGNoYW5uZWwpICE9IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgY2hhbm5lbF9sYXlvdXQgJj0gY2hhbm5lbCAtIDE7CisgICAgcmV0dXJuIGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhjaGFubmVsX2xheW91dCk7Cit9CisKK2NvbnN0IGNoYXIgKmF2X2dldF9jaGFubmVsX25hbWUodWludDY0X3QgY2hhbm5lbCkKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAoYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGNoYW5uZWwpICE9IDEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICBpZiAoKDFVTEw8PGkpICYgY2hhbm5lbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRfY2hhbm5lbF9uYW1lKGkpOworICAgIHJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyICphdl9nZXRfY2hhbm5lbF9kZXNjcmlwdGlvbih1aW50NjRfdCBjaGFubmVsKQoreworICAgIGludCBpOworICAgIGlmIChhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoY2hhbm5lbCkgIT0gMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGNoYW5uZWxfbmFtZXMpOyBpKyspCisgICAgICAgIGlmICgoMVVMTDw8aSkgJiBjaGFubmVsKQorICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxfbmFtZXNbaV0uZGVzY3JpcHRpb247CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3VpbnQ2NF90IGF2X2NoYW5uZWxfbGF5b3V0X2V4dHJhY3RfY2hhbm5lbCh1aW50NjRfdCBjaGFubmVsX2xheW91dCwgaW50IGluZGV4KQoreworICAgIGludCBpOworCisgICAgaWYgKGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhjaGFubmVsX2xheW91dCkgPD0gaW5kZXgpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgaWYgKCgxVUxMIDw8IGkpICYgY2hhbm5lbF9sYXlvdXQgJiYgIWluZGV4LS0pCisgICAgICAgICAgICByZXR1cm4gMVVMTCA8PCBpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X2dldF9zdGFuZGFyZF9jaGFubmVsX2xheW91dCh1bnNpZ25lZCBpbmRleCwgdWludDY0X3QgKmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5hbWUpCit7CisgICAgaWYgKGluZGV4ID49IEZGX0FSUkFZX0VMRU1TKGNoYW5uZWxfbGF5b3V0X21hcCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICBpZiAobGF5b3V0KSAqbGF5b3V0ID0gY2hhbm5lbF9sYXlvdXRfbWFwW2luZGV4XS5sYXlvdXQ7CisgICAgaWYgKG5hbWUpICAgKm5hbWUgICA9IGNoYW5uZWxfbGF5b3V0X21hcFtpbmRleF0ubmFtZTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCBiL2ZmbXBlZy9saWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWE0ZDYwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUGV0ZXIgUm9zcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9DSEFOTkVMX0xBWU9VVF9ICisjZGVmaW5lIEFWVVRJTF9DSEFOTkVMX0xBWU9VVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBAZmlsZQorICogYXVkaW8gY2hhbm5lbCBsYXlvdXQgdXRpbGl0eSBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIGxhdnVfYXVkaW8KKyAqIEB7CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgY2hhbm5lbF9tYXNrcyBBdWRpbyBjaGFubmVsIG1hc2tzCisgKgorICogQSBjaGFubmVsIGxheW91dCBpcyBhIDY0LWJpdHMgaW50ZWdlciB3aXRoIGEgYml0IHNldCBmb3IgZXZlcnkgY2hhbm5lbC4KKyAqIFRoZSBudW1iZXIgb2YgYml0cyBzZXQgbXVzdCBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLgorICogVGhlIHZhbHVlIDAgbWVhbnMgdGhhdCB0aGUgY2hhbm5lbCBsYXlvdXQgaXMgbm90IGtub3duLgorICogQG5vdGUgdGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBub3QgcG93ZXJmdWwgZW5vdWdoIHRvIGhhbmRsZSBjaGFubmVscworICogY29tYmluYXRpb25zIHRoYXQgaGF2ZSB0aGUgc2FtZSBjaGFubmVsIG11bHRpcGxlIHRpbWVzLCBzdWNoIGFzCisgKiBkdWFsLW1vbm8uCisgKgorICogQHsKKyAqLworI2RlZmluZSBBVl9DSF9GUk9OVF9MRUZUICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVZfQ0hfRlJPTlRfUklHSFQgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFWX0NIX0ZST05UX0NFTlRFUiAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBVl9DSF9MT1dfRlJFUVVFTkNZICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQVZfQ0hfQkFDS19MRUZUICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFWX0NIX0JBQ0tfUklHSFQgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUiAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQVZfQ0hfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSICAweDAwMDAwMDgwCisjZGVmaW5lIEFWX0NIX0JBQ0tfQ0VOVEVSICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBVl9DSF9TSURFX0xFRlQgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQVZfQ0hfU0lERV9SSUdIVCAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEFWX0NIX1RPUF9DRU5URVIgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBBVl9DSF9UT1BfRlJPTlRfTEVGVCAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQVZfQ0hfVE9QX0ZST05UX0NFTlRFUiAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEFWX0NIX1RPUF9GUk9OVF9SSUdIVCAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBBVl9DSF9UT1BfQkFDS19MRUZUICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQVZfQ0hfVE9QX0JBQ0tfQ0VOVEVSICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFWX0NIX1RPUF9CQUNLX1JJR0hUICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBBVl9DSF9TVEVSRU9fTEVGVCAgICAgICAgICAgIDB4MjAwMDAwMDAgIC8vLzwgU3RlcmVvIGRvd25taXguCisjZGVmaW5lIEFWX0NIX1NURVJFT19SSUdIVCAgICAgICAgICAgMHg0MDAwMDAwMCAgLy8vPCBTZWUgQVZfQ0hfU1RFUkVPX0xFRlQuCisjZGVmaW5lIEFWX0NIX1dJREVfTEVGVCAgICAgICAgICAgICAgMHgwMDAwMDAwMDgwMDAwMDAwVUxMCisjZGVmaW5lIEFWX0NIX1dJREVfUklHSFQgICAgICAgICAgICAgMHgwMDAwMDAwMTAwMDAwMDAwVUxMCisjZGVmaW5lIEFWX0NIX1NVUlJPVU5EX0RJUkVDVF9MRUZUICAgMHgwMDAwMDAwMjAwMDAwMDAwVUxMCisjZGVmaW5lIEFWX0NIX1NVUlJPVU5EX0RJUkVDVF9SSUdIVCAgMHgwMDAwMDAwNDAwMDAwMDAwVUxMCisjZGVmaW5lIEFWX0NIX0xPV19GUkVRVUVOQ1lfMiAgICAgICAgMHgwMDAwMDAwODAwMDAwMDAwVUxMCisKKy8qKiBDaGFubmVsIG1hc2sgdmFsdWUgdXNlZCBmb3IgQVZDb2RlY0NvbnRleHQucmVxdWVzdF9jaGFubmVsX2xheW91dAorICAgIHRvIGluZGljYXRlIHRoYXQgdGhlIHVzZXIgcmVxdWVzdHMgdGhlIGNoYW5uZWwgb3JkZXIgb2YgdGhlIGRlY29kZXIgb3V0cHV0CisgICAgdG8gYmUgdGhlIG5hdGl2ZSBjb2RlYyBjaGFubmVsIG9yZGVyLiAqLworI2RlZmluZSBBVl9DSF9MQVlPVVRfTkFUSVZFICAgICAgICAgIDB4ODAwMDAwMDAwMDAwMDAwMFVMTAorCisvKioKKyAqIEB9CisgKiBAZGVmZ3JvdXAgY2hhbm5lbF9tYXNrX2MgQXVkaW8gY2hhbm5lbCBsYXlvdXRzCisgKiBAeworICogKi8KKyNkZWZpbmUgQVZfQ0hfTEFZT1VUX01PTk8gICAgICAgICAgICAgIChBVl9DSF9GUk9OVF9DRU5URVIpCisjZGVmaW5lIEFWX0NIX0xBWU9VVF9TVEVSRU8gICAgICAgICAgICAoQVZfQ0hfRlJPTlRfTEVGVHxBVl9DSF9GUk9OVF9SSUdIVCkKKyNkZWZpbmUgQVZfQ0hfTEFZT1VUXzJQT0lOVDEgICAgICAgICAgIChBVl9DSF9MQVlPVVRfU1RFUkVPfEFWX0NIX0xPV19GUkVRVUVOQ1kpCisjZGVmaW5lIEFWX0NIX0xBWU9VVF8yXzEgICAgICAgICAgICAgICAoQVZfQ0hfTEFZT1VUX1NURVJFT3xBVl9DSF9CQUNLX0NFTlRFUikKKyNkZWZpbmUgQVZfQ0hfTEFZT1VUX1NVUlJPVU5EICAgICAgICAgIChBVl9DSF9MQVlPVVRfU1RFUkVPfEFWX0NIX0ZST05UX0NFTlRFUikKKyNkZWZpbmUgQVZfQ0hfTEFZT1VUXzNQT0lOVDEgICAgICAgICAgIChBVl9DSF9MQVlPVVRfU1VSUk9VTkR8QVZfQ0hfTE9XX0ZSRVFVRU5DWSkKKyNkZWZpbmUgQVZfQ0hfTEFZT1VUXzRQT0lOVDAgICAgICAgICAgIChBVl9DSF9MQVlPVVRfU1VSUk9VTkR8QVZfQ0hfQkFDS19DRU5URVIpCisjZGVmaW5lIEFWX0NIX0xBWU9VVF80UE9JTlQxICAgICAgICAgICAoQVZfQ0hfTEFZT1VUXzRQT0lOVDB8QVZfQ0hfTE9XX0ZSRVFVRU5DWSkKKyNkZWZpbmUgQVZfQ0hfTEFZT1VUXzJfMiAgICAgICAgICAgICAgIChBVl9DSF9MQVlPVVRfU1RFUkVPfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hUKQorI2RlZmluZSBBVl9DSF9MQVlPVVRfUVVBRCAgICAgICAgICAgICAgKEFWX0NIX0xBWU9VVF9TVEVSRU98QVZfQ0hfQkFDS19MRUZUfEFWX0NIX0JBQ0tfUklHSFQpCisjZGVmaW5lIEFWX0NIX0xBWU9VVF81UE9JTlQwICAgICAgICAgICAoQVZfQ0hfTEFZT1VUX1NVUlJPVU5EfEFWX0NIX1NJREVfTEVGVHxBVl9DSF9TSURFX1JJR0hUKQorI2RlZmluZSBBVl9DSF9MQVlPVVRfNVBPSU5UMSAgICAgICAgICAgKEFWX0NIX0xBWU9VVF81UE9JTlQwfEFWX0NIX0xPV19GUkVRVUVOQ1kpCisjZGVmaW5lIEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0sgICAgICAoQVZfQ0hfTEFZT1VUX1NVUlJPVU5EfEFWX0NIX0JBQ0tfTEVGVHxBVl9DSF9CQUNLX1JJR0hUKQorI2RlZmluZSBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLICAgICAgKEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0t8QVZfQ0hfTE9XX0ZSRVFVRU5DWSkKKyNkZWZpbmUgQVZfQ0hfTEFZT1VUXzZQT0lOVDAgICAgICAgICAgIChBVl9DSF9MQVlPVVRfNVBPSU5UMHxBVl9DSF9CQUNLX0NFTlRFUikKKyNkZWZpbmUgQVZfQ0hfTEFZT1VUXzZQT0lOVDBfRlJPTlQgICAgIChBVl9DSF9MQVlPVVRfMl8yfEFWX0NIX0ZST05UX0xFRlRfT0ZfQ0VOVEVSfEFWX0NIX0ZST05UX1JJR0hUX09GX0NFTlRFUikKKyNkZWZpbmUgQVZfQ0hfTEFZT1VUX0hFWEFHT05BTCAgICAgICAgIChBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLfEFWX0NIX0JBQ0tfQ0VOVEVSKQorI2RlZmluZSBBVl9DSF9MQVlPVVRfNlBPSU5UMSAgICAgICAgICAgKEFWX0NIX0xBWU9VVF81UE9JTlQxfEFWX0NIX0JBQ0tfQ0VOVEVSKQorI2RlZmluZSBBVl9DSF9MQVlPVVRfNlBPSU5UMV9CQUNLICAgICAgKEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0t8QVZfQ0hfQkFDS19DRU5URVIpCisjZGVmaW5lIEFWX0NIX0xBWU9VVF82UE9JTlQxX0ZST05UICAgICAoQVZfQ0hfTEFZT1VUXzZQT0lOVDBfRlJPTlR8QVZfQ0hfTE9XX0ZSRVFVRU5DWSkKKyNkZWZpbmUgQVZfQ0hfTEFZT1VUXzdQT0lOVDAgICAgICAgICAgIChBVl9DSF9MQVlPVVRfNVBPSU5UMHxBVl9DSF9CQUNLX0xFRlR8QVZfQ0hfQkFDS19SSUdIVCkKKyNkZWZpbmUgQVZfQ0hfTEFZT1VUXzdQT0lOVDBfRlJPTlQgICAgIChBVl9DSF9MQVlPVVRfNVBPSU5UMHxBVl9DSF9GUk9OVF9MRUZUX09GX0NFTlRFUnxBVl9DSF9GUk9OVF9SSUdIVF9PRl9DRU5URVIpCisjZGVmaW5lIEFWX0NIX0xBWU9VVF83UE9JTlQxICAgICAgICAgICAoQVZfQ0hfTEFZT1VUXzVQT0lOVDF8QVZfQ0hfQkFDS19MRUZUfEFWX0NIX0JBQ0tfUklHSFQpCisjZGVmaW5lIEFWX0NIX0xBWU9VVF83UE9JTlQxX1dJREUgICAgICAoQVZfQ0hfTEFZT1VUXzVQT0lOVDF8QVZfQ0hfRlJPTlRfTEVGVF9PRl9DRU5URVJ8QVZfQ0hfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSKQorI2RlZmluZSBBVl9DSF9MQVlPVVRfN1BPSU5UMV9XSURFX0JBQ0sgKEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0t8QVZfQ0hfRlJPTlRfTEVGVF9PRl9DRU5URVJ8QVZfQ0hfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSKQorI2RlZmluZSBBVl9DSF9MQVlPVVRfT0NUQUdPTkFMICAgICAgICAgKEFWX0NIX0xBWU9VVF81UE9JTlQwfEFWX0NIX0JBQ0tfTEVGVHxBVl9DSF9CQUNLX0NFTlRFUnxBVl9DSF9CQUNLX1JJR0hUKQorI2RlZmluZSBBVl9DSF9MQVlPVVRfU1RFUkVPX0RPV05NSVggICAgKEFWX0NIX1NURVJFT19MRUZUfEFWX0NIX1NURVJFT19SSUdIVCkKKworZW51bSBBVk1hdHJpeEVuY29kaW5nIHsKKyAgICBBVl9NQVRSSVhfRU5DT0RJTkdfTk9ORSwKKyAgICBBVl9NQVRSSVhfRU5DT0RJTkdfRE9MQlksCisgICAgQVZfTUFUUklYX0VOQ09ESU5HX0RQTElJLAorICAgIEFWX01BVFJJWF9FTkNPRElOR19EUExJSVgsCisgICAgQVZfTUFUUklYX0VOQ09ESU5HX0RQTElJWiwKKyAgICBBVl9NQVRSSVhfRU5DT0RJTkdfRE9MQllFWCwKKyAgICBBVl9NQVRSSVhfRU5DT0RJTkdfRE9MQllIRUFEUEhPTkUsCisgICAgQVZfTUFUUklYX0VOQ09ESU5HX05CCit9OworCisvKioKKyAqIFJldHVybiBhIGNoYW5uZWwgbGF5b3V0IGlkIHRoYXQgbWF0Y2hlcyBuYW1lLCBvciAwIGlmIG5vIG1hdGNoIGlzIGZvdW5kLgorICoKKyAqIG5hbWUgY2FuIGJlIG9uZSBvciBzZXZlcmFsIG9mIHRoZSBmb2xsb3dpbmcgbm90YXRpb25zLAorICogc2VwYXJhdGVkIGJ5ICcrJyBvciAnfCc6CisgKiAtIHRoZSBuYW1lIG9mIGFuIHVzdWFsIGNoYW5uZWwgbGF5b3V0IChtb25vLCBzdGVyZW8sIDQuMCwgcXVhZCwgNS4wLAorICogICA1LjAoc2lkZSksIDUuMSwgNS4xKHNpZGUpLCA3LjEsIDcuMSh3aWRlKSwgZG93bm1peCk7CisgKiAtIHRoZSBuYW1lIG9mIGEgc2luZ2xlIGNoYW5uZWwgKEZMLCBGUiwgRkMsIExGRSwgQkwsIEJSLCBGTEMsIEZSQywgQkMsCisgKiAgIFNMLCBTUiwgVEMsIFRGTCwgVEZDLCBURlIsIFRCTCwgVEJDLCBUQlIsIERMLCBEUik7CisgKiAtIGEgbnVtYmVyIG9mIGNoYW5uZWxzLCBpbiBkZWNpbWFsLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5ICdjJywgeWllbGRpbmcKKyAqICAgdGhlIGRlZmF1bHQgY2hhbm5lbCBsYXlvdXQgZm9yIHRoYXQgbnVtYmVyIG9mIGNoYW5uZWxzIChAc2VlCisgKiAgIGF2X2dldF9kZWZhdWx0X2NoYW5uZWxfbGF5b3V0KTsKKyAqIC0gYSBjaGFubmVsIGxheW91dCBtYXNrLCBpbiBoZXhhZGVjaW1hbCBzdGFydGluZyB3aXRoICIweCIgKHNlZSB0aGUKKyAqICAgQVZfQ0hfKiBtYWNyb3MpLgorICoKKyAqIEB3YXJuaW5nIFN0YXJ0aW5nIGZyb20gdGhlIG5leHQgbWFqb3IgYnVtcCB0aGUgdHJhaWxpbmcgY2hhcmFjdGVyCisgKiAnYycgdG8gc3BlY2lmeSBhIG51bWJlciBvZiBjaGFubmVscyB3aWxsIGJlIHJlcXVpcmVkLCB3aGlsZSBhCisgKiBjaGFubmVsIGxheW91dCBtYXNrIGNvdWxkIGFsc28gYmUgc3BlY2lmaWVkIGFzIGEgZGVjaW1hbCBudW1iZXIKKyAqIChpZiBhbmQgb25seSBpZiBub3QgZm9sbG93ZWQgYnkgImMiKS4KKyAqCisgKiBFeGFtcGxlOiAic3RlcmVvK0ZDIiA9ICIyYytGQyIgPSAiMmMrMWMiID0gIjB4NyIKKyAqLwordWludDY0X3QgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0KGNvbnN0IGNoYXIgKm5hbWUpOworCisvKioKKyAqIFJldHVybiBhIGRlc2NyaXB0aW9uIG9mIGEgY2hhbm5lbCBsYXlvdXQuCisgKiBJZiBuYl9jaGFubmVscyBpcyA8PSAwLCBpdCBpcyBndWVzc2VkIGZyb20gdGhlIGNoYW5uZWxfbGF5b3V0LgorICoKKyAqIEBwYXJhbSBidWYgcHV0IGhlcmUgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBjaGFubmVsIGxheW91dAorICogQHBhcmFtIGJ1Zl9zaXplIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlcgorICovCit2b2lkIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBuYl9jaGFubmVscywgdWludDY0X3QgY2hhbm5lbF9sYXlvdXQpOworCitzdHJ1Y3QgQVZCUHJpbnQ7CisvKioKKyAqIEFwcGVuZCBhIGRlc2NyaXB0aW9uIG9mIGEgY2hhbm5lbCBsYXlvdXQgdG8gYSBicHJpbnQgYnVmZmVyLgorICovCit2b2lkIGF2X2JwcmludF9jaGFubmVsX2xheW91dChzdHJ1Y3QgQVZCUHJpbnQgKmJwLCBpbnQgbmJfY2hhbm5lbHMsIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0KTsKKworLyoqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgY2hhbm5lbCBsYXlvdXQuCisgKi8KK2ludCBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHModWludDY0X3QgY2hhbm5lbF9sYXlvdXQpOworCisvKioKKyAqIFJldHVybiBkZWZhdWx0IGNoYW5uZWwgbGF5b3V0IGZvciBhIGdpdmVuIG51bWJlciBvZiBjaGFubmVscy4KKyAqLworaW50NjRfdCBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChpbnQgbmJfY2hhbm5lbHMpOworCisvKioKKyAqIEdldCB0aGUgaW5kZXggb2YgYSBjaGFubmVsIGluIGNoYW5uZWxfbGF5b3V0LgorICoKKyAqIEBwYXJhbSBjaGFubmVsIGEgY2hhbm5lbCBsYXlvdXQgZGVzY3JpYmluZyBleGFjdGx5IG9uZSBjaGFubmVsIHdoaWNoIG11c3QgYmUKKyAqICAgICAgICAgICAgICAgIHByZXNlbnQgaW4gY2hhbm5lbF9sYXlvdXQuCisgKgorICogQHJldHVybiBpbmRleCBvZiBjaGFubmVsIGluIGNoYW5uZWxfbGF5b3V0IG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUgorICogICAgICAgICBvbiBlcnJvci4KKyAqLworaW50IGF2X2dldF9jaGFubmVsX2xheW91dF9jaGFubmVsX2luZGV4KHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNoYW5uZWwpOworCisvKioKKyAqIEdldCB0aGUgY2hhbm5lbCB3aXRoIHRoZSBnaXZlbiBpbmRleCBpbiBjaGFubmVsX2xheW91dC4KKyAqLwordWludDY0X3QgYXZfY2hhbm5lbF9sYXlvdXRfZXh0cmFjdF9jaGFubmVsKHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0LCBpbnQgaW5kZXgpOworCisvKioKKyAqIEdldCB0aGUgbmFtZSBvZiBhIGdpdmVuIGNoYW5uZWwuCisgKgorICogQHJldHVybiBjaGFubmVsIG5hbWUgb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvci4KKyAqLworY29uc3QgY2hhciAqYXZfZ2V0X2NoYW5uZWxfbmFtZSh1aW50NjRfdCBjaGFubmVsKTsKKworLyoqCisgKiBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIGEgZ2l2ZW4gY2hhbm5lbC4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCAgYSBjaGFubmVsIGxheW91dCB3aXRoIGEgc2luZ2xlIGNoYW5uZWwKKyAqIEByZXR1cm4gIGNoYW5uZWwgZGVzY3JpcHRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvcgorICovCitjb25zdCBjaGFyICphdl9nZXRfY2hhbm5lbF9kZXNjcmlwdGlvbih1aW50NjRfdCBjaGFubmVsKTsKKworLyoqCisgKiBHZXQgdGhlIHZhbHVlIGFuZCBuYW1lIG9mIGEgc3RhbmRhcmQgY2hhbm5lbCBsYXlvdXQuCisgKgorICogQHBhcmFtW2luXSAgaW5kZXggICBpbmRleCBpbiBhbiBpbnRlcm5hbCBsaXN0LCBzdGFydGluZyBhdCAwCisgKiBAcGFyYW1bb3V0XSBsYXlvdXQgIGNoYW5uZWwgbGF5b3V0IG1hc2sKKyAqIEBwYXJhbVtvdXRdIG5hbWUgICAgbmFtZSBvZiB0aGUgbGF5b3V0CisgKiBAcmV0dXJuICAwICBpZiB0aGUgbGF5b3V0IGV4aXN0cywKKyAqICAgICAgICAgIDwwIGlmIGluZGV4IGlzIGJleW9uZCB0aGUgbGltaXRzCisgKi8KK2ludCBhdl9nZXRfc3RhbmRhcmRfY2hhbm5lbF9sYXlvdXQodW5zaWduZWQgaW5kZXgsIHVpbnQ2NF90ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuYW1lKTsKKworLyoqCisgKiBAfQorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZVVElMX0NIQU5ORUxfTEFZT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvY29sb3JzcGFjZS5oIGIvZmZtcGVnL2xpYmF2dXRpbC9jb2xvcnNwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzODE1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvY29sb3JzcGFjZS5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29sb3JzcGFjZSBjb252ZXJzaW9uIGRlZmluZXMKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVmFyaW91cyBkZWZpbmVzIGZvciBZVVY8LT5SR0IgY29udmVyc2lvbgorICovCisKKyNpZm5kZWYgQVZVVElMX0NPTE9SU1BBQ0VfSAorI2RlZmluZSBBVlVUSUxfQ09MT1JTUEFDRV9ICisKKyNkZWZpbmUgU0NBTEVCSVRTIDEwCisjZGVmaW5lIE9ORV9IQUxGICAoMSA8PCAoU0NBTEVCSVRTIC0gMSkpCisjZGVmaW5lIEZJWCh4KSAgICAoKGludCkgKCh4KSAqICgxPDxTQ0FMRUJJVFMpICsgMC41KSkKKworI2RlZmluZSBZVVZfVE9fUkdCMV9DQ0lSKGNiMSwgY3IxKVwKK3tcCisgICAgY2IgPSAoY2IxKSAtIDEyODtcCisgICAgY3IgPSAoY3IxKSAtIDEyODtcCisgICAgcl9hZGQgPSBGSVgoMS40MDIwMCoyNTUuMC8yMjQuMCkgKiBjciArIE9ORV9IQUxGO1wKKyAgICBnX2FkZCA9IC0gRklYKDAuMzQ0MTQqMjU1LjAvMjI0LjApICogY2IgLSBGSVgoMC43MTQxNCoyNTUuMC8yMjQuMCkgKiBjciArIFwKKyAgICAgICAgICAgIE9ORV9IQUxGO1wKKyAgICBiX2FkZCA9IEZJWCgxLjc3MjAwKjI1NS4wLzIyNC4wKSAqIGNiICsgT05FX0hBTEY7XAorfQorCisjZGVmaW5lIFlVVl9UT19SR0IyX0NDSVIociwgZywgYiwgeTEpXAore1wKKyAgICB5ID0gKCh5MSkgLSAxNikgKiBGSVgoMjU1LjAvMjE5LjApO1wKKyAgICByID0gY21bKHkgKyByX2FkZCkgPj4gU0NBTEVCSVRTXTtcCisgICAgZyA9IGNtWyh5ICsgZ19hZGQpID4+IFNDQUxFQklUU107XAorICAgIGIgPSBjbVsoeSArIGJfYWRkKSA+PiBTQ0FMRUJJVFNdO1wKK30KKworI2RlZmluZSBZVVZfVE9fUkdCMShjYjEsIGNyMSlcCit7XAorICAgIGNiID0gKGNiMSkgLSAxMjg7XAorICAgIGNyID0gKGNyMSkgLSAxMjg7XAorICAgIHJfYWRkID0gRklYKDEuNDAyMDApICogY3IgKyBPTkVfSEFMRjtcCisgICAgZ19hZGQgPSAtIEZJWCgwLjM0NDE0KSAqIGNiIC0gRklYKDAuNzE0MTQpICogY3IgKyBPTkVfSEFMRjtcCisgICAgYl9hZGQgPSBGSVgoMS43NzIwMCkgKiBjYiArIE9ORV9IQUxGO1wKK30KKworI2RlZmluZSBZVVZfVE9fUkdCMihyLCBnLCBiLCB5MSlcCit7XAorICAgIHkgPSAoeTEpIDw8IFNDQUxFQklUUztcCisgICAgciA9IGNtWyh5ICsgcl9hZGQpID4+IFNDQUxFQklUU107XAorICAgIGcgPSBjbVsoeSArIGdfYWRkKSA+PiBTQ0FMRUJJVFNdO1wKKyAgICBiID0gY21bKHkgKyBiX2FkZCkgPj4gU0NBTEVCSVRTXTtcCit9CisKKyNkZWZpbmUgWV9DQ0lSX1RPX0pQRUcoeSlcCisgY21bKCh5KSAqIEZJWCgyNTUuMC8yMTkuMCkgKyAoT05FX0hBTEYgLSAxNiAqIEZJWCgyNTUuMC8yMTkuMCkpKSA+PiBTQ0FMRUJJVFNdCisKKyNkZWZpbmUgWV9KUEVHX1RPX0NDSVIoeSlcCisgKCgoeSkgKiBGSVgoMjE5LjAvMjU1LjApICsgKE9ORV9IQUxGICsgKDE2IDw8IFNDQUxFQklUUykpKSA+PiBTQ0FMRUJJVFMpCisKKyNkZWZpbmUgQ19DQ0lSX1RPX0pQRUcoeSlcCisgY21bKCgoeSkgLSAxMjgpICogRklYKDEyNy4wLzExMi4wKSArIChPTkVfSEFMRiArICgxMjggPDwgU0NBTEVCSVRTKSkpID4+IFNDQUxFQklUU10KKworLyogTk9URTogdGhlIGNsYW1wIGlzIHJlYWxseSBuZWNlc3NhcnkhICovCitzdGF0aWMgaW5saW5lIGludCBDX0pQRUdfVE9fQ0NJUihpbnQgeSkgeworICAgIHkgPSAoKCh5IC0gMTI4KSAqIEZJWCgxMTIuMC8xMjcuMCkgKyAoT05FX0hBTEYgKyAoMTI4IDw8IFNDQUxFQklUUykpKSA+PiBTQ0FMRUJJVFMpOworICAgIGlmICh5IDwgMTYpCisgICAgICAgIHkgPSAxNjsKKyAgICByZXR1cm4geTsKK30KKworCisjZGVmaW5lIFJHQl9UT19ZKHIsIGcsIGIpIFwKKygoRklYKDAuMjk5MDApICogKHIpICsgRklYKDAuNTg3MDApICogKGcpICsgXAorICBGSVgoMC4xMTQwMCkgKiAoYikgKyBPTkVfSEFMRikgPj4gU0NBTEVCSVRTKQorCisjZGVmaW5lIFJHQl9UT19VKHIxLCBnMSwgYjEsIHNoaWZ0KVwKKygoKC0gRklYKDAuMTY4NzQpICogcjEgLSBGSVgoMC4zMzEyNikgKiBnMSArICAgICAgICAgXAorICAgICBGSVgoMC41MDAwMCkgKiBiMSArIChPTkVfSEFMRiA8PCBzaGlmdCkgLSAxKSA+PiAoU0NBTEVCSVRTICsgc2hpZnQpKSArIDEyOCkKKworI2RlZmluZSBSR0JfVE9fVihyMSwgZzEsIGIxLCBzaGlmdClcCisoKChGSVgoMC41MDAwMCkgKiByMSAtIEZJWCgwLjQxODY5KSAqIGcxIC0gICAgICAgICAgIFwKKyAgIEZJWCgwLjA4MTMxKSAqIGIxICsgKE9ORV9IQUxGIDw8IHNoaWZ0KSAtIDEpID4+IChTQ0FMRUJJVFMgKyBzaGlmdCkpICsgMTI4KQorCisjZGVmaW5lIFJHQl9UT19ZX0NDSVIociwgZywgYikgXAorKChGSVgoMC4yOTkwMCoyMTkuMC8yNTUuMCkgKiAocikgKyBGSVgoMC41ODcwMCoyMTkuMC8yNTUuMCkgKiAoZykgKyBcCisgIEZJWCgwLjExNDAwKjIxOS4wLzI1NS4wKSAqIChiKSArIChPTkVfSEFMRiArICgxNiA8PCBTQ0FMRUJJVFMpKSkgPj4gU0NBTEVCSVRTKQorCisjZGVmaW5lIFJHQl9UT19VX0NDSVIocjEsIGcxLCBiMSwgc2hpZnQpXAorKCgoLSBGSVgoMC4xNjg3NCoyMjQuMC8yNTUuMCkgKiByMSAtIEZJWCgwLjMzMTI2KjIyNC4wLzI1NS4wKSAqIGcxICsgICAgICAgICBcCisgICAgIEZJWCgwLjUwMDAwKjIyNC4wLzI1NS4wKSAqIGIxICsgKE9ORV9IQUxGIDw8IHNoaWZ0KSAtIDEpID4+IChTQ0FMRUJJVFMgKyBzaGlmdCkpICsgMTI4KQorCisjZGVmaW5lIFJHQl9UT19WX0NDSVIocjEsIGcxLCBiMSwgc2hpZnQpXAorKCgoRklYKDAuNTAwMDAqMjI0LjAvMjU1LjApICogcjEgLSBGSVgoMC40MTg2OSoyMjQuMC8yNTUuMCkgKiBnMSAtICAgICAgICAgICBcCisgICBGSVgoMC4wODEzMSoyMjQuMC8yNTUuMCkgKiBiMSArIChPTkVfSEFMRiA8PCBzaGlmdCkgLSAxKSA+PiAoU0NBTEVCSVRTICsgc2hpZnQpKSArIDEyOCkKKworI2VuZGlmIC8qIEFWVVRJTF9DT0xPUlNQQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvY29tbW9uLmggYi9mZm1wZWcvbGliYXZ1dGlsL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmEzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2NvbW1vbi5oCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGNvbW1vbiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgQVBJIGhlYWRlcgorICovCisKKyNpZm5kZWYgQVZVVElMX0NPTU1PTl9ICisjZGVmaW5lIEFWVVRJTF9DT01NT05fSAorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoX19TVERDX0NPTlNUQU5UX01BQ1JPUykgJiYgIWRlZmluZWQoVUlOVDY0X0MpCisjZXJyb3IgbWlzc2luZyAtRF9fU1REQ19DT05TVEFOVF9NQUNST1MgLyAjZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZjb25maWcuaCIKKworI2lmIEFWX0hBVkVfQklHRU5ESUFOCisjICAgZGVmaW5lIEFWX05FKGJlLCBsZSkgKGJlKQorI2Vsc2UKKyMgICBkZWZpbmUgQVZfTkUoYmUsIGxlKSAobGUpCisjZW5kaWYKKworLy9yb3VuZGVkIGRpdmlzaW9uICYgc2hpZnQKKyNkZWZpbmUgUlNISUZUKGEsYikgKChhKSA+IDAgPyAoKGEpICsgKCgxPDwoYikpPj4xKSk+PihiKSA6ICgoYSkgKyAoKDE8PChiKSk+PjEpLTEpPj4oYikpCisvKiBhc3N1bWUgYj4wICovCisjZGVmaW5lIFJPVU5ERURfRElWKGEsYikgKCgoYSk+MCA/IChhKSArICgoYik+PjEpIDogKGEpIC0gKChiKT4+MSkpLyhiKSkKKy8qIGFzc3VtZSBhPjAgYW5kIGI+MCAqLworI2RlZmluZSBGRl9DRUlMX1JTSElGVChhLGIpICghYXZfYnVpbHRpbl9jb25zdGFudF9wKGIpID8gLSgoLShhKSkgPj4gKGIpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGEpICsgKDE8PChiKSkgLSAxKSA+PiAoYikpCisjZGVmaW5lIEZGVURJVihhLGIpICgoKGEpPjAgPyhhKTooYSktKGIpKzEpIC8gKGIpKQorI2RlZmluZSBGRlVNT0QoYSxiKSAoKGEpLShiKSpGRlVESVYoYSxiKSkKKyNkZWZpbmUgRkZBQlMoYSkgKChhKSA+PSAwID8gKGEpIDogKC0oYSkpKQorI2RlZmluZSBGRlNJR04oYSkgKChhKSA+IDAgPyAxIDogLTEpCisKKyNkZWZpbmUgRkZNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBGRk1BWDMoYSxiLGMpIEZGTUFYKEZGTUFYKGEsYiksYykKKyNkZWZpbmUgRkZNSU4oYSxiKSAoKGEpID4gKGIpID8gKGIpIDogKGEpKQorI2RlZmluZSBGRk1JTjMoYSxiLGMpIEZGTUlOKEZGTUlOKGEsYiksYykKKworI2RlZmluZSBGRlNXQVAodHlwZSxhLGIpIGRve3R5cGUgU1dBUF90bXA9IGI7IGI9IGE7IGE9IFNXQVBfdG1wO313aGlsZSgwKQorI2RlZmluZSBGRl9BUlJBWV9FTEVNUyhhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisjZGVmaW5lIEZGQUxJR04oeCwgYSkgKCgoeCkrKGEpLTEpJn4oKGEpLTEpKQorCisvKiBtaXNjIG1hdGggZnVuY3Rpb25zICovCisKKy8qKgorICogUmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIGJpdHMgb2YgYW4gOC1iaXRzIHVuc2lnbmVkIGludGVnZXIuCisgKi8KKyNpZiBGRl9BUElfQVZfUkVWRVJTRQorZXh0ZXJuIGF0dHJpYnV0ZV9kZXByZWNhdGVkIGNvbnN0IHVpbnQ4X3QgYXZfcmV2ZXJzZVsyNTZdOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0FWX0NPTkZJR19ICisjICAgaW5jbHVkZSAiY29uZmlnLmgiCisjICAgaW5jbHVkZSAiaW50bWF0aC5oIgorI2VuZGlmCisKKy8qIFB1bGwgaW4gdW5ndWFyZGVkIGZhbGxiYWNrIGRlZmluZXMgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuICovCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNpZm5kZWYgYXZfbG9nMgorYXZfY29uc3QgaW50IGF2X2xvZzIodW5zaWduZWQgdik7CisjZW5kaWYKKworI2lmbmRlZiBhdl9sb2cyXzE2Yml0Cithdl9jb25zdCBpbnQgYXZfbG9nMl8xNmJpdCh1bnNpZ25lZCB2KTsKKyNlbmRpZgorCisvKioKKyAqIENsaXAgYSBzaWduZWQgaW50ZWdlciB2YWx1ZSBpbnRvIHRoZSBhbWluLWFtYXggcmFuZ2UuCisgKiBAcGFyYW0gYSB2YWx1ZSB0byBjbGlwCisgKiBAcGFyYW0gYW1pbiBtaW5pbXVtIHZhbHVlIG9mIHRoZSBjbGlwIHJhbmdlCisgKiBAcGFyYW0gYW1heCBtYXhpbXVtIHZhbHVlIG9mIHRoZSBjbGlwIHJhbmdlCisgKiBAcmV0dXJuIGNsaXBwZWQgdmFsdWUKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IGF2X2NsaXBfYyhpbnQgYSwgaW50IGFtaW4sIGludCBhbWF4KQoreworI2lmIGRlZmluZWQoSEFWRV9BVl9DT05GSUdfSCkgJiYgZGVmaW5lZChBU1NFUlRfTEVWRUwpICYmIEFTU0VSVF9MRVZFTCA+PSAyCisgICAgaWYgKGFtaW4gPiBhbWF4KSBhYm9ydCgpOworI2VuZGlmCisgICAgaWYgICAgICAoYSA8IGFtaW4pIHJldHVybiBhbWluOworICAgIGVsc2UgaWYgKGEgPiBhbWF4KSByZXR1cm4gYW1heDsKKyAgICBlbHNlICAgICAgICAgICAgICAgcmV0dXJuIGE7Cit9CisKKy8qKgorICogQ2xpcCBhIHNpZ25lZCA2NGJpdCBpbnRlZ2VyIHZhbHVlIGludG8gdGhlIGFtaW4tYW1heCByYW5nZS4KKyAqIEBwYXJhbSBhIHZhbHVlIHRvIGNsaXAKKyAqIEBwYXJhbSBhbWluIG1pbmltdW0gdmFsdWUgb2YgdGhlIGNsaXAgcmFuZ2UKKyAqIEBwYXJhbSBhbWF4IG1heGltdW0gdmFsdWUgb2YgdGhlIGNsaXAgcmFuZ2UKKyAqIEByZXR1cm4gY2xpcHBlZCB2YWx1ZQorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCBpbnQ2NF90IGF2X2NsaXA2NF9jKGludDY0X3QgYSwgaW50NjRfdCBhbWluLCBpbnQ2NF90IGFtYXgpCit7CisjaWYgZGVmaW5lZChIQVZFX0FWX0NPTkZJR19IKSAmJiBkZWZpbmVkKEFTU0VSVF9MRVZFTCkgJiYgQVNTRVJUX0xFVkVMID49IDIKKyAgICBpZiAoYW1pbiA+IGFtYXgpIGFib3J0KCk7CisjZW5kaWYKKyAgICBpZiAgICAgIChhIDwgYW1pbikgcmV0dXJuIGFtaW47CisgICAgZWxzZSBpZiAoYSA+IGFtYXgpIHJldHVybiBhbWF4OworICAgIGVsc2UgICAgICAgICAgICAgICByZXR1cm4gYTsKK30KKworLyoqCisgKiBDbGlwIGEgc2lnbmVkIGludGVnZXIgdmFsdWUgaW50byB0aGUgMC0yNTUgcmFuZ2UuCisgKiBAcGFyYW0gYSB2YWx1ZSB0byBjbGlwCisgKiBAcmV0dXJuIGNsaXBwZWQgdmFsdWUKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgdWludDhfdCBhdl9jbGlwX3VpbnQ4X2MoaW50IGEpCit7CisgICAgaWYgKGEmKH4weEZGKSkgcmV0dXJuICgtYSk+PjMxOworICAgIGVsc2UgICAgICAgICAgIHJldHVybiBhOworfQorCisvKioKKyAqIENsaXAgYSBzaWduZWQgaW50ZWdlciB2YWx1ZSBpbnRvIHRoZSAtMTI4LDEyNyByYW5nZS4KKyAqIEBwYXJhbSBhIHZhbHVlIHRvIGNsaXAKKyAqIEByZXR1cm4gY2xpcHBlZCB2YWx1ZQorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCBpbnQ4X3QgYXZfY2xpcF9pbnQ4X2MoaW50IGEpCit7CisgICAgaWYgKChhKzB4ODApICYgfjB4RkYpIHJldHVybiAoYT4+MzEpIF4gMHg3RjsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7Cit9CisKKy8qKgorICogQ2xpcCBhIHNpZ25lZCBpbnRlZ2VyIHZhbHVlIGludG8gdGhlIDAtNjU1MzUgcmFuZ2UuCisgKiBAcGFyYW0gYSB2YWx1ZSB0byBjbGlwCisgKiBAcmV0dXJuIGNsaXBwZWQgdmFsdWUKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgdWludDE2X3QgYXZfY2xpcF91aW50MTZfYyhpbnQgYSkKK3sKKyAgICBpZiAoYSYofjB4RkZGRikpIHJldHVybiAoLWEpPj4zMTsKKyAgICBlbHNlICAgICAgICAgICAgIHJldHVybiBhOworfQorCisvKioKKyAqIENsaXAgYSBzaWduZWQgaW50ZWdlciB2YWx1ZSBpbnRvIHRoZSAtMzI3NjgsMzI3NjcgcmFuZ2UuCisgKiBAcGFyYW0gYSB2YWx1ZSB0byBjbGlwCisgKiBAcmV0dXJuIGNsaXBwZWQgdmFsdWUKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50MTZfdCBhdl9jbGlwX2ludDE2X2MoaW50IGEpCit7CisgICAgaWYgKChhKzB4ODAwMCkgJiB+MHhGRkZGKSByZXR1cm4gKGE+PjMxKSBeIDB4N0ZGRjsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOworfQorCisvKioKKyAqIENsaXAgYSBzaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWUgaW50byB0aGUgLTIxNDc0ODM2NDgsMjE0NzQ4MzY0NyByYW5nZS4KKyAqIEBwYXJhbSBhIHZhbHVlIHRvIGNsaXAKKyAqIEByZXR1cm4gY2xpcHBlZCB2YWx1ZQorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCBpbnQzMl90IGF2X2NsaXBsX2ludDMyX2MoaW50NjRfdCBhKQoreworICAgIGlmICgoYSsweDgwMDAwMDAwdSkgJiB+VUlOVDY0X0MoMHhGRkZGRkZGRikpIHJldHVybiAoaW50MzJfdCkoKGE+PjYzKSBeIDB4N0ZGRkZGRkYpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdClhOworfQorCisvKioKKyAqIENsaXAgYSBzaWduZWQgaW50ZWdlciB0byBhbiB1bnNpZ25lZCBwb3dlciBvZiB0d28gcmFuZ2UuCisgKiBAcGFyYW0gIGEgdmFsdWUgdG8gY2xpcAorICogQHBhcmFtICBwIGJpdCBwb3NpdGlvbiB0byBjbGlwIGF0CisgKiBAcmV0dXJuIGNsaXBwZWQgdmFsdWUKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgdW5zaWduZWQgYXZfY2xpcF91aW50cDJfYyhpbnQgYSwgaW50IHApCit7CisgICAgaWYgKGEgJiB+KCgxPDxwKSAtIDEpKSByZXR1cm4gLWEgPj4gMzEgJiAoKDE8PHApIC0gMSk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICByZXR1cm4gIGE7Cit9CisKKy8qKgorICogQWRkIHR3byBzaWduZWQgMzItYml0IHZhbHVlcyB3aXRoIHNhdHVyYXRpb24uCisgKgorICogQHBhcmFtICBhIG9uZSB2YWx1ZQorICogQHBhcmFtICBiIGFub3RoZXIgdmFsdWUKKyAqIEByZXR1cm4gc3VtIHdpdGggc2lnbmVkIHNhdHVyYXRpb24KKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGF2X3NhdF9hZGQzMl9jKGludCBhLCBpbnQgYikKK3sKKyAgICByZXR1cm4gYXZfY2xpcGxfaW50MzIoKGludDY0X3QpYSArIGIpOworfQorCisvKioKKyAqIEFkZCBhIGRvdWJsZWQgdmFsdWUgdG8gYW5vdGhlciB2YWx1ZSB3aXRoIHNhdHVyYXRpb24gYXQgYm90aCBzdGFnZXMuCisgKgorICogQHBhcmFtICBhIGZpcnN0IHZhbHVlCisgKiBAcGFyYW0gIGIgdmFsdWUgZG91YmxlZCBhbmQgYWRkZWQgdG8gYQorICogQHJldHVybiBzdW0gd2l0aCBzaWduZWQgc2F0dXJhdGlvbgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgYXZfc2F0X2RhZGQzMl9jKGludCBhLCBpbnQgYikKK3sKKyAgICByZXR1cm4gYXZfc2F0X2FkZDMyKGEsIGF2X3NhdF9hZGQzMihiLCBiKSk7Cit9CisKKy8qKgorICogQ2xpcCBhIGZsb2F0IHZhbHVlIGludG8gdGhlIGFtaW4tYW1heCByYW5nZS4KKyAqIEBwYXJhbSBhIHZhbHVlIHRvIGNsaXAKKyAqIEBwYXJhbSBhbWluIG1pbmltdW0gdmFsdWUgb2YgdGhlIGNsaXAgcmFuZ2UKKyAqIEBwYXJhbSBhbWF4IG1heGltdW0gdmFsdWUgb2YgdGhlIGNsaXAgcmFuZ2UKKyAqIEByZXR1cm4gY2xpcHBlZCB2YWx1ZQorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCBmbG9hdCBhdl9jbGlwZl9jKGZsb2F0IGEsIGZsb2F0IGFtaW4sIGZsb2F0IGFtYXgpCit7CisjaWYgZGVmaW5lZChIQVZFX0FWX0NPTkZJR19IKSAmJiBkZWZpbmVkKEFTU0VSVF9MRVZFTCkgJiYgQVNTRVJUX0xFVkVMID49IDIKKyAgICBpZiAoYW1pbiA+IGFtYXgpIGFib3J0KCk7CisjZW5kaWYKKyAgICBpZiAgICAgIChhIDwgYW1pbikgcmV0dXJuIGFtaW47CisgICAgZWxzZSBpZiAoYSA+IGFtYXgpIHJldHVybiBhbWF4OworICAgIGVsc2UgICAgICAgICAgICAgICByZXR1cm4gYTsKK30KKworLyoqCisgKiBDbGlwIGEgZG91YmxlIHZhbHVlIGludG8gdGhlIGFtaW4tYW1heCByYW5nZS4KKyAqIEBwYXJhbSBhIHZhbHVlIHRvIGNsaXAKKyAqIEBwYXJhbSBhbWluIG1pbmltdW0gdmFsdWUgb2YgdGhlIGNsaXAgcmFuZ2UKKyAqIEBwYXJhbSBhbWF4IG1heGltdW0gdmFsdWUgb2YgdGhlIGNsaXAgcmFuZ2UKKyAqIEByZXR1cm4gY2xpcHBlZCB2YWx1ZQorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCBkb3VibGUgYXZfY2xpcGRfYyhkb3VibGUgYSwgZG91YmxlIGFtaW4sIGRvdWJsZSBhbWF4KQoreworI2lmIGRlZmluZWQoSEFWRV9BVl9DT05GSUdfSCkgJiYgZGVmaW5lZChBU1NFUlRfTEVWRUwpICYmIEFTU0VSVF9MRVZFTCA+PSAyCisgICAgaWYgKGFtaW4gPiBhbWF4KSBhYm9ydCgpOworI2VuZGlmCisgICAgaWYgICAgICAoYSA8IGFtaW4pIHJldHVybiBhbWluOworICAgIGVsc2UgaWYgKGEgPiBhbWF4KSByZXR1cm4gYW1heDsKKyAgICBlbHNlICAgICAgICAgICAgICAgcmV0dXJuIGE7Cit9CisKKy8qKiBDb21wdXRlIGNlaWwobG9nMih4KSkuCisgKiBAcGFyYW0geCB2YWx1ZSB1c2VkIHRvIGNvbXB1dGUgY2VpbChsb2cyKHgpKQorICogQHJldHVybiBjb21wdXRlZCBjZWlsaW5nIG9mIGxvZzIoeCkKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IGF2X2NlaWxfbG9nMl9jKGludCB4KQoreworICAgIHJldHVybiBhdl9sb2cyKCh4IC0gMSkgPDwgMSk7Cit9CisKKy8qKgorICogQ291bnQgbnVtYmVyIG9mIGJpdHMgc2V0IHRvIG9uZSBpbiB4CisgKiBAcGFyYW0geCB2YWx1ZSB0byBjb3VudCBiaXRzIG9mCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgdG8gb25lIGluIHgKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IGF2X3BvcGNvdW50X2ModWludDMyX3QgeCkKK3sKKyAgICB4IC09ICh4ID4+IDEpICYgMHg1NTU1NTU1NTsKKyAgICB4ID0gKHggJiAweDMzMzMzMzMzKSArICgoeCA+PiAyKSAmIDB4MzMzMzMzMzMpOworICAgIHggPSAoeCArICh4ID4+IDQpKSAmIDB4MEYwRjBGMEY7CisgICAgeCArPSB4ID4+IDg7CisgICAgcmV0dXJuICh4ICsgKHggPj4gMTYpKSAmIDB4M0Y7Cit9CisKKy8qKgorICogQ291bnQgbnVtYmVyIG9mIGJpdHMgc2V0IHRvIG9uZSBpbiB4CisgKiBAcGFyYW0geCB2YWx1ZSB0byBjb3VudCBiaXRzIG9mCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgdG8gb25lIGluIHgKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IGF2X3BvcGNvdW50NjRfYyh1aW50NjRfdCB4KQoreworICAgIHJldHVybiBhdl9wb3Bjb3VudCgodWludDMyX3QpeCkgKyBhdl9wb3Bjb3VudCgodWludDMyX3QpKHggPj4gMzIpKTsKK30KKworI2RlZmluZSBNS1RBRyhhLGIsYyxkKSAoKGEpIHwgKChiKSA8PCA4KSB8ICgoYykgPDwgMTYpIHwgKCh1bnNpZ25lZCkoZCkgPDwgMjQpKQorI2RlZmluZSBNS0JFVEFHKGEsYixjLGQpICgoZCkgfCAoKGMpIDw8IDgpIHwgKChiKSA8PCAxNikgfCAoKHVuc2lnbmVkKShhKSA8PCAyNCkpCisKKy8qKgorICogQ29udmVydCBhIFVURi04IGNoYXJhY3RlciAodXAgdG8gNCBieXRlcykgdG8gaXRzIDMyLWJpdCBVQ1MtNCBlbmNvZGVkIGZvcm0uCisgKgorICogQHBhcmFtIHZhbCAgICAgIE91dHB1dCB2YWx1ZSwgbXVzdCBiZSBhbiBsdmFsdWUgb2YgdHlwZSB1aW50MzJfdC4KKyAqIEBwYXJhbSBHRVRfQllURSBFeHByZXNzaW9uIHJlYWRpbmcgb25lIGJ5dGUgZnJvbSB0aGUgaW5wdXQuCisgKiAgICAgICAgICAgICAgICAgRXZhbHVhdGVkIHVwIHRvIDcgdGltZXMgKDQgZm9yIHRoZSBjdXJyZW50bHkKKyAqICAgICAgICAgICAgICAgICBhc3NpZ25lZCBVbmljb2RlIHJhbmdlKS4gIFdpdGggYSBtZW1vcnkgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMgY291bGQgYmUgKnB0cisrLgorICogQHBhcmFtIEVSUk9SICAgIEV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkIG9uIGludmFsaWQgaW5wdXQsCisgKiAgICAgICAgICAgICAgICAgdHlwaWNhbGx5IGEgZ290byBzdGF0ZW1lbnQuCisgKgorICogQHdhcm5pbmcgRVJST1Igc2hvdWxkIG5vdCBjb250YWluIGEgbG9vcCBjb250cm9sIHN0YXRlbWVudCB3aGljaAorICogY291bGQgaW50ZXJhY3Qgd2l0aCB0aGUgaW50ZXJuYWwgd2hpbGUgbG9vcCwgYW5kIHNob3VsZCBmb3JjZSBhbgorICogZXhpdCBmcm9tIHRoZSBtYWNybyBjb2RlIChlLmcuIHRocm91Z2ggYSBnb3RvIG9yIGEgcmV0dXJuKSBpbiBvcmRlcgorICogdG8gcHJldmVudCB1bmRlZmluZWQgcmVzdWx0cy4KKyAqLworI2RlZmluZSBHRVRfVVRGOCh2YWwsIEdFVF9CWVRFLCBFUlJPUilcCisgICAgdmFsPSBHRVRfQllURTtcCisgICAge1wKKyAgICAgICAgdWludDMyX3QgdG9wID0gKHZhbCAmIDEyOCkgPj4gMTtcCisgICAgICAgIGlmICgodmFsICYgMHhjMCkgPT0gMHg4MCB8fCB2YWwgPj0gMHhGRSlcCisgICAgICAgICAgICBFUlJPUlwKKyAgICAgICAgd2hpbGUgKHZhbCAmIHRvcCkge1wKKyAgICAgICAgICAgIGludCB0bXA9IEdFVF9CWVRFIC0gMTI4O1wKKyAgICAgICAgICAgIGlmKHRtcD4+NilcCisgICAgICAgICAgICAgICAgRVJST1JcCisgICAgICAgICAgICB2YWw9ICh2YWw8PDYpICsgdG1wO1wKKyAgICAgICAgICAgIHRvcCA8PD0gNTtcCisgICAgICAgIH1cCisgICAgICAgIHZhbCAmPSAodG9wIDw8IDEpIC0gMTtcCisgICAgfQorCisvKioKKyAqIENvbnZlcnQgYSBVVEYtMTYgY2hhcmFjdGVyICgyIG9yIDQgYnl0ZXMpIHRvIGl0cyAzMi1iaXQgVUNTLTQgZW5jb2RlZCBmb3JtLgorICoKKyAqIEBwYXJhbSB2YWwgICAgICAgT3V0cHV0IHZhbHVlLCBtdXN0IGJlIGFuIGx2YWx1ZSBvZiB0eXBlIHVpbnQzMl90LgorICogQHBhcmFtIEdFVF8xNkJJVCBFeHByZXNzaW9uIHJldHVybmluZyB0d28gYnl0ZXMgb2YgVVRGLTE2IGRhdGEgY29udmVydGVkCisgKiAgICAgICAgICAgICAgICAgIHRvIG5hdGl2ZSBieXRlIG9yZGVyLiAgRXZhbHVhdGVkIG9uZSBvciB0d28gdGltZXMuCisgKiBAcGFyYW0gRVJST1IgICAgIEV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkIG9uIGludmFsaWQgaW5wdXQsCisgKiAgICAgICAgICAgICAgICAgIHR5cGljYWxseSBhIGdvdG8gc3RhdGVtZW50LgorICovCisjZGVmaW5lIEdFVF9VVEYxNih2YWwsIEdFVF8xNkJJVCwgRVJST1IpXAorICAgIHZhbCA9IEdFVF8xNkJJVDtcCisgICAge1wKKyAgICAgICAgdW5zaWduZWQgaW50IGhpID0gdmFsIC0gMHhEODAwO1wKKyAgICAgICAgaWYgKGhpIDwgMHg4MDApIHtcCisgICAgICAgICAgICB2YWwgPSBHRVRfMTZCSVQgLSAweERDMDA7XAorICAgICAgICAgICAgaWYgKHZhbCA+IDB4M0ZGVSB8fCBoaSA+IDB4M0ZGVSlcCisgICAgICAgICAgICAgICAgRVJST1JcCisgICAgICAgICAgICB2YWwgKz0gKGhpPDwxMCkgKyAweDEwMDAwO1wKKyAgICAgICAgfVwKKyAgICB9XAorCisvKioKKyAqIEBkZWYgUFVUX1VURjgodmFsLCB0bXAsIFBVVF9CWVRFKQorICogQ29udmVydCBhIDMyLWJpdCBVbmljb2RlIGNoYXJhY3RlciB0byBpdHMgVVRGLTggZW5jb2RlZCBmb3JtICh1cCB0byA0IGJ5dGVzIGxvbmcpLgorICogQHBhcmFtIHZhbCBpcyBhbiBpbnB1dC1vbmx5IGFyZ3VtZW50IGFuZCBzaG91bGQgYmUgb2YgdHlwZSB1aW50MzJfdC4gSXQgaG9sZHMKKyAqIGEgVUNTLTQgZW5jb2RlZCBVbmljb2RlIGNoYXJhY3RlciB0aGF0IGlzIHRvIGJlIGNvbnZlcnRlZCB0byBVVEYtOC4gSWYKKyAqIHZhbCBpcyBnaXZlbiBhcyBhIGZ1bmN0aW9uIGl0IGlzIGV4ZWN1dGVkIG9ubHkgb25jZS4KKyAqIEBwYXJhbSB0bXAgaXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgYW5kIHNob3VsZCBiZSBvZiB0eXBlIHVpbnQ4X3QuIEl0CisgKiByZXByZXNlbnRzIGFuIGludGVybWVkaWF0ZSB2YWx1ZSBkdXJpbmcgY29udmVyc2lvbiB0aGF0IGlzIHRvIGJlCisgKiBvdXRwdXQgYnkgUFVUX0JZVEUuCisgKiBAcGFyYW0gUFVUX0JZVEUgd3JpdGVzIHRoZSBjb252ZXJ0ZWQgVVRGLTggYnl0ZXMgdG8gYW55IHByb3BlciBkZXN0aW5hdGlvbi4KKyAqIEl0IGNvdWxkIGJlIGEgZnVuY3Rpb24gb3IgYSBzdGF0ZW1lbnQsIGFuZCB1c2VzIHRtcCBhcyB0aGUgaW5wdXQgYnl0ZS4KKyAqIEZvciBleGFtcGxlLCBQVVRfQllURSBjb3VsZCBiZSAiKm91dHB1dCsrID0gdG1wOyIgUFVUX0JZVEUgd2lsbCBiZQorICogZXhlY3V0ZWQgdXAgdG8gNCB0aW1lcyBmb3IgdmFsdWVzIGluIHRoZSB2YWxpZCBVVEYtOCByYW5nZSBhbmQgdXAgdG8KKyAqIDcgdGltZXMgaW4gdGhlIGdlbmVyYWwgY2FzZSwgZGVwZW5kaW5nIG9uIHRoZSBsZW5ndGggb2YgdGhlIGNvbnZlcnRlZAorICogVW5pY29kZSBjaGFyYWN0ZXIuCisgKi8KKyNkZWZpbmUgUFVUX1VURjgodmFsLCB0bXAsIFBVVF9CWVRFKVwKKyAgICB7XAorICAgICAgICBpbnQgYnl0ZXMsIHNoaWZ0O1wKKyAgICAgICAgdWludDMyX3QgaW4gPSB2YWw7XAorICAgICAgICBpZiAoaW4gPCAweDgwKSB7XAorICAgICAgICAgICAgdG1wID0gaW47XAorICAgICAgICAgICAgUFVUX0JZVEVcCisgICAgICAgIH0gZWxzZSB7XAorICAgICAgICAgICAgYnl0ZXMgPSAoYXZfbG9nMihpbikgKyA0KSAvIDU7XAorICAgICAgICAgICAgc2hpZnQgPSAoYnl0ZXMgLSAxKSAqIDY7XAorICAgICAgICAgICAgdG1wID0gKDI1NiAtICgyNTYgPj4gYnl0ZXMpKSB8IChpbiA+PiBzaGlmdCk7XAorICAgICAgICAgICAgUFVUX0JZVEVcCisgICAgICAgICAgICB3aGlsZSAoc2hpZnQgPj0gNikge1wKKyAgICAgICAgICAgICAgICBzaGlmdCAtPSA2O1wKKyAgICAgICAgICAgICAgICB0bXAgPSAweDgwIHwgKChpbiA+PiBzaGlmdCkgJiAweDNmKTtcCisgICAgICAgICAgICAgICAgUFVUX0JZVEVcCisgICAgICAgICAgICB9XAorICAgICAgICB9XAorICAgIH0KKworLyoqCisgKiBAZGVmIFBVVF9VVEYxNih2YWwsIHRtcCwgUFVUXzE2QklUKQorICogQ29udmVydCBhIDMyLWJpdCBVbmljb2RlIGNoYXJhY3RlciB0byBpdHMgVVRGLTE2IGVuY29kZWQgZm9ybSAoMiBvciA0IGJ5dGVzKS4KKyAqIEBwYXJhbSB2YWwgaXMgYW4gaW5wdXQtb25seSBhcmd1bWVudCBhbmQgc2hvdWxkIGJlIG9mIHR5cGUgdWludDMyX3QuIEl0IGhvbGRzCisgKiBhIFVDUy00IGVuY29kZWQgVW5pY29kZSBjaGFyYWN0ZXIgdGhhdCBpcyB0byBiZSBjb252ZXJ0ZWQgdG8gVVRGLTE2LiBJZgorICogdmFsIGlzIGdpdmVuIGFzIGEgZnVuY3Rpb24gaXQgaXMgZXhlY3V0ZWQgb25seSBvbmNlLgorICogQHBhcmFtIHRtcCBpcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSBhbmQgc2hvdWxkIGJlIG9mIHR5cGUgdWludDE2X3QuIEl0CisgKiByZXByZXNlbnRzIGFuIGludGVybWVkaWF0ZSB2YWx1ZSBkdXJpbmcgY29udmVyc2lvbiB0aGF0IGlzIHRvIGJlCisgKiBvdXRwdXQgYnkgUFVUXzE2QklULgorICogQHBhcmFtIFBVVF8xNkJJVCB3cml0ZXMgdGhlIGNvbnZlcnRlZCBVVEYtMTYgZGF0YSB0byBhbnkgcHJvcGVyIGRlc3RpbmF0aW9uCisgKiBpbiBkZXNpcmVkIGVuZGlhbm5lc3MuIEl0IGNvdWxkIGJlIGEgZnVuY3Rpb24gb3IgYSBzdGF0ZW1lbnQsIGFuZCB1c2VzIHRtcAorICogYXMgdGhlIGlucHV0IGJ5dGUuICBGb3IgZXhhbXBsZSwgUFVUX0JZVEUgY291bGQgYmUgIipvdXRwdXQrKyA9IHRtcDsiCisgKiBQVVRfQllURSB3aWxsIGJlIGV4ZWN1dGVkIDEgb3IgMiB0aW1lcyBkZXBlbmRpbmcgb24gaW5wdXQgY2hhcmFjdGVyLgorICovCisjZGVmaW5lIFBVVF9VVEYxNih2YWwsIHRtcCwgUFVUXzE2QklUKVwKKyAgICB7XAorICAgICAgICB1aW50MzJfdCBpbiA9IHZhbDtcCisgICAgICAgIGlmIChpbiA8IDB4MTAwMDApIHtcCisgICAgICAgICAgICB0bXAgPSBpbjtcCisgICAgICAgICAgICBQVVRfMTZCSVRcCisgICAgICAgIH0gZWxzZSB7XAorICAgICAgICAgICAgdG1wID0gMHhEODAwIHwgKChpbiAtIDB4MTAwMDApID4+IDEwKTtcCisgICAgICAgICAgICBQVVRfMTZCSVRcCisgICAgICAgICAgICB0bXAgPSAweERDMDAgfCAoKGluIC0gMHgxMDAwMCkgJiAweDNGRik7XAorICAgICAgICAgICAgUFVUXzE2QklUXAorICAgICAgICB9XAorICAgIH1cCisKKworCisjaW5jbHVkZSAibWVtLmgiCisKKyNpZmRlZiBIQVZFX0FWX0NPTkZJR19ICisjICAgIGluY2x1ZGUgImludGVybmFsLmgiCisjZW5kaWYgLyogSEFWRV9BVl9DT05GSUdfSCAqLworCisjZW5kaWYgLyogQVZVVElMX0NPTU1PTl9IICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSBvdXRzaWRlIHRoZSBtdWx0aXBsZSBpbmNsdXNpb24gZ3VhcmQKKyAqIHRvIGVuc3VyZSB0aGV5IGFyZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgaW4gaW50bWF0aC5oLgorICovCisKKyNpZm5kZWYgYXZfY2VpbF9sb2cyCisjICAgZGVmaW5lIGF2X2NlaWxfbG9nMiAgICAgYXZfY2VpbF9sb2cyX2MKKyNlbmRpZgorI2lmbmRlZiBhdl9jbGlwCisjICAgZGVmaW5lIGF2X2NsaXAgICAgICAgICAgYXZfY2xpcF9jCisjZW5kaWYKKyNpZm5kZWYgYXZfY2xpcDY0CisjICAgZGVmaW5lIGF2X2NsaXA2NCAgICAgICAgYXZfY2xpcDY0X2MKKyNlbmRpZgorI2lmbmRlZiBhdl9jbGlwX3VpbnQ4CisjICAgZGVmaW5lIGF2X2NsaXBfdWludDggICAgYXZfY2xpcF91aW50OF9jCisjZW5kaWYKKyNpZm5kZWYgYXZfY2xpcF9pbnQ4CisjICAgZGVmaW5lIGF2X2NsaXBfaW50OCAgICAgYXZfY2xpcF9pbnQ4X2MKKyNlbmRpZgorI2lmbmRlZiBhdl9jbGlwX3VpbnQxNgorIyAgIGRlZmluZSBhdl9jbGlwX3VpbnQxNiAgIGF2X2NsaXBfdWludDE2X2MKKyNlbmRpZgorI2lmbmRlZiBhdl9jbGlwX2ludDE2CisjICAgZGVmaW5lIGF2X2NsaXBfaW50MTYgICAgYXZfY2xpcF9pbnQxNl9jCisjZW5kaWYKKyNpZm5kZWYgYXZfY2xpcGxfaW50MzIKKyMgICBkZWZpbmUgYXZfY2xpcGxfaW50MzIgICBhdl9jbGlwbF9pbnQzMl9jCisjZW5kaWYKKyNpZm5kZWYgYXZfY2xpcF91aW50cDIKKyMgICBkZWZpbmUgYXZfY2xpcF91aW50cDIgICBhdl9jbGlwX3VpbnRwMl9jCisjZW5kaWYKKyNpZm5kZWYgYXZfc2F0X2FkZDMyCisjICAgZGVmaW5lIGF2X3NhdF9hZGQzMiAgICAgYXZfc2F0X2FkZDMyX2MKKyNlbmRpZgorI2lmbmRlZiBhdl9zYXRfZGFkZDMyCisjICAgZGVmaW5lIGF2X3NhdF9kYWRkMzIgICAgYXZfc2F0X2RhZGQzMl9jCisjZW5kaWYKKyNpZm5kZWYgYXZfY2xpcGYKKyMgICBkZWZpbmUgYXZfY2xpcGYgICAgICAgICBhdl9jbGlwZl9jCisjZW5kaWYKKyNpZm5kZWYgYXZfY2xpcGQKKyMgICBkZWZpbmUgYXZfY2xpcGQgICAgICAgICBhdl9jbGlwZF9jCisjZW5kaWYKKyNpZm5kZWYgYXZfcG9wY291bnQKKyMgICBkZWZpbmUgYXZfcG9wY291bnQgICAgICBhdl9wb3Bjb3VudF9jCisjZW5kaWYKKyNpZm5kZWYgYXZfcG9wY291bnQ2NAorIyAgIGRlZmluZSBhdl9wb3Bjb3VudDY0ICAgIGF2X3BvcGNvdW50NjRfYworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2NwdS5jIGIvZmZtcGVnL2xpYmF2dXRpbC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2MxMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9jcHUuYwpAQCAtMCwwICsxLDQwNSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJjcHVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJvcHQuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKworI2lmIEhBVkVfU0NIRURfR0VUQUZGSU5JVFkKKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFCisjZW5kaWYKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2VuZGlmCisjaWYgSEFWRV9HRVRQUk9DRVNTQUZGSU5JVFlNQVNLCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNDVEwKKyNpZiBIQVZFX1NZU19QQVJBTV9ICisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjZW5kaWYKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworc3RhdGljIGludCBmbGFncywgY2hlY2tlZDsKKwordm9pZCBhdl9mb3JjZV9jcHVfZmxhZ3MoaW50IGFyZyl7CisgICAgaWYgKCAgIChhcmcgJiAoIEFWX0NQVV9GTEFHXzNETk9XICAgIHwKKyAgICAgICAgICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfM0ROT1dFWFQgfAorICAgICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU0UgICAgICB8CisgICAgICAgICAgICAgICAgICAgIEFWX0NQVV9GTEFHX1NTRTIgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfU1NFMlNMT1cgfAorICAgICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU0UzICAgICB8CisgICAgICAgICAgICAgICAgICAgIEFWX0NQVV9GTEFHX1NTRTNTTE9XIHwKKyAgICAgICAgICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfU1NTRTMgICAgfAorICAgICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU0U0ICAgICB8CisgICAgICAgICAgICAgICAgICAgIEFWX0NQVV9GTEFHX1NTRTQyICAgIHwKKyAgICAgICAgICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfQVZYICAgICAgfAorICAgICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19YT1AgICAgICB8CisgICAgICAgICAgICAgICAgICAgIEFWX0NQVV9GTEFHX0ZNQTMgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfRk1BNCAgICAgfAorICAgICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19BVlgyICAgICApKQorICAgICAgICAmJiAhKGFyZyAmIEFWX0NQVV9GTEFHX01NWCkpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiTU1YIGltcGxpZWQgYnkgc3BlY2lmaWVkIGZsYWdzXG4iKTsKKyAgICAgICAgYXJnIHw9IEFWX0NQVV9GTEFHX01NWDsKKyAgICB9CisKKyAgICBmbGFncyAgID0gYXJnOworICAgIGNoZWNrZWQgPSBhcmcgIT0gLTE7Cit9CisKK2ludCBhdl9nZXRfY3B1X2ZsYWdzKHZvaWQpCit7CisgICAgaWYgKGNoZWNrZWQpCisgICAgICAgIHJldHVybiBmbGFnczsKKworICAgIGlmIChBUkNIX0FBUkNINjQpCisgICAgICAgIGZsYWdzID0gZmZfZ2V0X2NwdV9mbGFnc19hYXJjaDY0KCk7CisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmbGFncyA9IGZmX2dldF9jcHVfZmxhZ3NfYXJtKCk7CisgICAgaWYgKEFSQ0hfUFBDKQorICAgICAgICBmbGFncyA9IGZmX2dldF9jcHVfZmxhZ3NfcHBjKCk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmbGFncyA9IGZmX2dldF9jcHVfZmxhZ3NfeDg2KCk7CisKKyAgICBjaGVja2VkID0gMTsKKyAgICByZXR1cm4gZmxhZ3M7Cit9CisKK3ZvaWQgYXZfc2V0X2NwdV9mbGFnc19tYXNrKGludCBtYXNrKQoreworICAgIGNoZWNrZWQgICAgICAgPSAwOworICAgIGZsYWdzICAgICAgICAgPSBhdl9nZXRfY3B1X2ZsYWdzKCkgJiBtYXNrOworICAgIGNoZWNrZWQgICAgICAgPSAxOworfQorCitpbnQgYXZfcGFyc2VfY3B1X2ZsYWdzKGNvbnN0IGNoYXIgKnMpCit7CisjZGVmaW5lIENQVUZMQUdfTU1YRVhUICAgKEFWX0NQVV9GTEFHX01NWCAgICAgIHwgQVZfQ1BVX0ZMQUdfTU1YRVhUIHwgQVZfQ1BVX0ZMQUdfQ01PVikKKyNkZWZpbmUgQ1BVRkxBR18zRE5PVyAgICAoQVZfQ1BVX0ZMQUdfM0ROT1cgICAgfCBBVl9DUFVfRkxBR19NTVgpCisjZGVmaW5lIENQVUZMQUdfM0ROT1dFWFQgKEFWX0NQVV9GTEFHXzNETk9XRVhUIHwgQ1BVRkxBR18zRE5PVykKKyNkZWZpbmUgQ1BVRkxBR19TU0UgICAgICAoQVZfQ1BVX0ZMQUdfU1NFICAgICAgfCBDUFVGTEFHX01NWEVYVCkKKyNkZWZpbmUgQ1BVRkxBR19TU0UyICAgICAoQVZfQ1BVX0ZMQUdfU1NFMiAgICAgfCBDUFVGTEFHX1NTRSkKKyNkZWZpbmUgQ1BVRkxBR19TU0UyU0xPVyAoQVZfQ1BVX0ZMQUdfU1NFMlNMT1cgfCBDUFVGTEFHX1NTRTIpCisjZGVmaW5lIENQVUZMQUdfU1NFMyAgICAgKEFWX0NQVV9GTEFHX1NTRTMgICAgIHwgQ1BVRkxBR19TU0UyKQorI2RlZmluZSBDUFVGTEFHX1NTRTNTTE9XIChBVl9DUFVfRkxBR19TU0UzU0xPVyB8IENQVUZMQUdfU1NFMykKKyNkZWZpbmUgQ1BVRkxBR19TU1NFMyAgICAoQVZfQ1BVX0ZMQUdfU1NTRTMgICAgfCBDUFVGTEFHX1NTRTMpCisjZGVmaW5lIENQVUZMQUdfU1NFNCAgICAgKEFWX0NQVV9GTEFHX1NTRTQgICAgIHwgQ1BVRkxBR19TU1NFMykKKyNkZWZpbmUgQ1BVRkxBR19TU0U0MiAgICAoQVZfQ1BVX0ZMQUdfU1NFNDIgICAgfCBDUFVGTEFHX1NTRTQpCisjZGVmaW5lIENQVUZMQUdfQVZYICAgICAgKEFWX0NQVV9GTEFHX0FWWCAgICAgIHwgQ1BVRkxBR19TU0U0MikKKyNkZWZpbmUgQ1BVRkxBR19YT1AgICAgICAoQVZfQ1BVX0ZMQUdfWE9QICAgICAgfCBDUFVGTEFHX0FWWCkKKyNkZWZpbmUgQ1BVRkxBR19GTUEzICAgICAoQVZfQ1BVX0ZMQUdfRk1BMyAgICAgfCBDUFVGTEFHX0FWWCkKKyNkZWZpbmUgQ1BVRkxBR19GTUE0ICAgICAoQVZfQ1BVX0ZMQUdfRk1BNCAgICAgfCBDUFVGTEFHX0FWWCkKKyNkZWZpbmUgQ1BVRkxBR19BVlgyICAgICAoQVZfQ1BVX0ZMQUdfQVZYMiAgICAgfCBDUFVGTEFHX0FWWCkKKyNkZWZpbmUgQ1BVRkxBR19CTUkxICAgICAoQVZfQ1BVX0ZMQUdfQk1JMSkKKyNkZWZpbmUgQ1BVRkxBR19CTUkyICAgICAoQVZfQ1BVX0ZMQUdfQk1JMiAgICAgfCBDUFVGTEFHX0JNSTEpCisgICAgc3RhdGljIGNvbnN0IEFWT3B0aW9uIGNwdWZsYWdzX29wdHNbXSA9IHsKKyAgICAgICAgeyAiZmxhZ3MiICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9GTEFHUywgeyAuaTY0ID0gMCB9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgLnVuaXQgPSAiZmxhZ3MiIH0sCisjaWYgICBBUkNIX1BQQworICAgICAgICB7ICJhbHRpdmVjIiAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19BTFRJVkVDICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyNlbGlmIEFSQ0hfWDg2CisgICAgICAgIHsgIm1teCIgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX01NWCAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJtbXhleHQiICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBDUFVGTEFHX01NWEVYVCAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAic3NlIiAgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ1BVRkxBR19TU0UgICAgICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgInNzZTIiICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENQVUZMQUdfU1NFMiAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJzc2Uyc2xvdyIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBDUFVGTEFHX1NTRTJTTE9XICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAic3NlMyIgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ1BVRkxBR19TU0UzICAgICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgInNzZTNzbG93IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENQVUZMQUdfU1NFM1NMT1cgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJzc3NlMyIgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBDUFVGTEFHX1NTU0UzICAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAiYXRvbSIgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfQVRPTSAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgInNzZTQuMSIgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENQVUZMQUdfU1NFNCAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJzc2U0LjIiICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBDUFVGTEFHX1NTRTQyICAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAiYXZ4IiAgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ1BVRkxBR19BVlggICAgICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgInhvcCIgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENQVUZMQUdfWE9QICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJmbWEzIiAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBDUFVGTEFHX0ZNQTMgICAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAiZm1hNCIgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ1BVRkxBR19GTUE0ICAgICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgImF2eDIiICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENQVUZMQUdfQVZYMiAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJibWkxIiAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBDUFVGTEFHX0JNSTEgICAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAiYm1pMiIgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ1BVRkxBR19CTUkyICAgICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgIjNkbm93IiAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENQVUZMQUdfM0ROT1cgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICIzZG5vd2V4dCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBDUFVGTEFHXzNETk9XRVhUICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAiY21vdiIsICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfQ01PViAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisjZWxpZiBBUkNIX0FSTQorICAgICAgICB7ICJhcm12NXRlIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19BUk1WNVRFICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAiYXJtdjYiLCAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfQVJNVjYgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgImFybXY2dDIiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX0FSTVY2VDIgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJ2ZnAiLCAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19WRlAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAidmZwdjMiLCAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfVkZQVjMgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgIm5lb24iLCAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX05FT04gICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorI2VsaWYgQVJDSF9BQVJDSDY0CisgICAgICAgIHsgImFybXY4IiwgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX0FSTVY4ICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJuZW9uIiwgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19ORU9OICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAidmZwIiwgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfVkZQICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisjZW5kaWYKKyAgICAgICAgeyBOVUxMIH0sCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgQVZDbGFzcyBjbGFzcyA9IHsKKyAgICAgICAgLmNsYXNzX25hbWUgPSAiY3B1ZmxhZ3MiLAorICAgICAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgICAgICAub3B0aW9uICAgICA9IGNwdWZsYWdzX29wdHMsCisgICAgICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIH07CisKKyAgICBpbnQgZmxhZ3MgPSAwLCByZXQ7CisgICAgY29uc3QgQVZDbGFzcyAqcGNsYXNzID0gJmNsYXNzOworCisgICAgaWYgKChyZXQgPSBhdl9vcHRfZXZhbF9mbGFncygmcGNsYXNzLCAmY3B1ZmxhZ3Nfb3B0c1swXSwgcywgJmZsYWdzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIGZsYWdzICYgSU5UX01BWDsKK30KKworaW50IGF2X3BhcnNlX2NwdV9jYXBzKHVuc2lnbmVkICpmbGFncywgY29uc3QgY2hhciAqcykKK3sKKyAgICAgICAgc3RhdGljIGNvbnN0IEFWT3B0aW9uIGNwdWZsYWdzX29wdHNbXSA9IHsKKyAgICAgICAgeyAiZmxhZ3MiICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9GTEFHUywgeyAuaTY0ID0gMCB9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgLnVuaXQgPSAiZmxhZ3MiIH0sCisjaWYgICBBUkNIX1BQQworICAgICAgICB7ICJhbHRpdmVjIiAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19BTFRJVkVDICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyNlbGlmIEFSQ0hfWDg2CisgICAgICAgIHsgIm1teCIgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX01NWCAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJtbXgyIiAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19NTVgyICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAibW14ZXh0IiAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfTU1YMiAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgInNzZSIgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX1NTRSAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJzc2UyIiAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19TU0UyICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAic3NlMnNsb3ciLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfU1NFMlNMT1cgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgInNzZTMiICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX1NTRTMgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJzc2Uzc2xvdyIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19TU0UzU0xPVyB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAic3NzZTMiICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfU1NTRTMgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgImF0b20iICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX0FUT00gICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJzc2U0LjEiICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19TU0U0ICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAic3NlNC4yIiAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfU1NFNDIgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgImF2eCIgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX0FWWCAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJ4b3AiICAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19YT1AgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAiZm1hMyIgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfRk1BMyAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgImZtYTQiICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX0ZNQTQgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJhdngyIiAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19BVlgyICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAiYm1pMSIgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfQk1JMSAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgImJtaTIiICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX0JNSTIgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICIzZG5vdyIgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR18zRE5PVyAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAiM2Rub3dleHQiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfM0ROT1dFWFQgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgImNtb3YiLCAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX0NNT1YgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorCisjZGVmaW5lIENQVV9GTEFHX1AyIEFWX0NQVV9GTEFHX0NNT1YgfCBBVl9DUFVfRkxBR19NTVgKKyNkZWZpbmUgQ1BVX0ZMQUdfUDMgQ1BVX0ZMQUdfUDIgfCBBVl9DUFVfRkxBR19NTVgyIHwgQVZfQ1BVX0ZMQUdfU1NFCisjZGVmaW5lIENQVV9GTEFHX1A0IENQVV9GTEFHX1AzfCBBVl9DUFVfRkxBR19TU0UyCisgICAgICAgIHsgInBlbnRpdW0yIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENQVV9GTEFHX1AyICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJwZW50aXVtMyIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBDUFVfRkxBR19QMyAgICAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAicGVudGl1bTQiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ1BVX0ZMQUdfUDQgICAgICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisKKyNkZWZpbmUgQ1BVX0ZMQUdfSzYyIEFWX0NQVV9GTEFHX01NWCB8IEFWX0NQVV9GTEFHXzNETk9XCisjZGVmaW5lIENQVV9GTEFHX0FUSExPTiAgIENQVV9GTEFHX0s2MiB8IEFWX0NQVV9GTEFHX0NNT1YgfCBBVl9DUFVfRkxBR18zRE5PV0VYVCB8IEFWX0NQVV9GTEFHX01NWDIKKyNkZWZpbmUgQ1BVX0ZMQUdfQVRITE9OWFAgQ1BVX0ZMQUdfQVRITE9OIHwgQVZfQ1BVX0ZMQUdfU1NFCisjZGVmaW5lIENQVV9GTEFHX0s4ICBDUFVfRkxBR19BVEhMT05YUCB8IEFWX0NQVV9GTEFHX1NTRTIKKyAgICAgICAgeyAiazYiLCAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfTU1YICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgIms2MiIsICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENQVV9GTEFHX0s2MiAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJhdGhsb24iLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBDUFVfRkxBR19BVEhMT04gICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAiYXRobG9ueHAiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ1BVX0ZMQUdfQVRITE9OWFAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgIms4IiwgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENQVV9GTEFHX0s4ICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorI2VsaWYgQVJDSF9BUk0KKyAgICAgICAgeyAiYXJtdjV0ZSIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfQVJNVjVURSAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgImFybXY2IiwgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX0FSTVY2ICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJhcm12NnQyIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19BUk1WNlQyICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAidmZwIiwgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfVkZQICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgInZmcHYzIiwgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX1ZGUFYzICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJuZW9uIiwgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19ORU9OICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyAic2V0ZW5kIiwgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfU0VURU5EICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisjZWxpZiBBUkNIX0FBUkNINjQKKyAgICAgICAgeyAiYXJtdjgiLCAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfQVJNVjggICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgIm5lb24iLCAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX05FT04gICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJ2ZnAiLCAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19WRlAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyNlbmRpZgorICAgICAgICB7IE5VTEwgfSwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBBVkNsYXNzIGNsYXNzID0geworICAgICAgICAuY2xhc3NfbmFtZSA9ICJjcHVmbGFncyIsCisgICAgICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgICAgIC5vcHRpb24gICAgID0gY3B1ZmxhZ3Nfb3B0cywKKyAgICAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgfTsKKyAgICBjb25zdCBBVkNsYXNzICpwY2xhc3MgPSAmY2xhc3M7CisKKyAgICByZXR1cm4gYXZfb3B0X2V2YWxfZmxhZ3MoJnBjbGFzcywgJmNwdWZsYWdzX29wdHNbMF0sIHMsIGZsYWdzKTsKK30KKworaW50IGF2X2NwdV9jb3VudCh2b2lkKQoreworICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcHJpbnRlZDsKKworICAgIGludCBuYl9jcHVzID0gMTsKKyNpZiBIQVZFX1NDSEVEX0dFVEFGRklOSVRZICYmIGRlZmluZWQoQ1BVX0NPVU5UKQorICAgIGNwdV9zZXRfdCBjcHVzZXQ7CisKKyAgICBDUFVfWkVSTygmY3B1c2V0KTsKKworICAgIGlmICghc2NoZWRfZ2V0YWZmaW5pdHkoMCwgc2l6ZW9mKGNwdXNldCksICZjcHVzZXQpKQorICAgICAgICBuYl9jcHVzID0gQ1BVX0NPVU5UKCZjcHVzZXQpOworI2VsaWYgSEFWRV9HRVRQUk9DRVNTQUZGSU5JVFlNQVNLCisgICAgRFdPUkRfUFRSIHByb2NfYWZmLCBzeXNfYWZmOworICAgIGlmIChHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRQcm9jZXNzKCksICZwcm9jX2FmZiwgJnN5c19hZmYpKQorICAgICAgICBuYl9jcHVzID0gYXZfcG9wY291bnQ2NChwcm9jX2FmZik7CisjZWxpZiBIQVZFX1NZU0NUTCAmJiBkZWZpbmVkKEhXX05DUFUpCisgICAgaW50IG1pYlsyXSA9IHsgQ1RMX0hXLCBIV19OQ1BVIH07CisgICAgc2l6ZV90IGxlbiA9IHNpemVvZihuYl9jcHVzKTsKKworICAgIGlmIChzeXNjdGwobWliLCAyLCAmbmJfY3B1cywgJmxlbiwgTlVMTCwgMCkgPT0gLTEpCisgICAgICAgIG5iX2NwdXMgPSAwOworI2VsaWYgSEFWRV9TWVNDT05GICYmIGRlZmluZWQoX1NDX05QUk9DX09OTE4pCisgICAgbmJfY3B1cyA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VsaWYgSEFWRV9TWVNDT05GICYmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgbmJfY3B1cyA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2VuZGlmCisKKyAgICBpZiAoIXByaW50ZWQpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgImRldGVjdGVkICVkIGxvZ2ljYWwgY29yZXNcbiIsIG5iX2NwdXMpOworICAgICAgICBwcmludGVkID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gbmJfY3B1czsKK30KKworI2lmZGVmIFRFU1QKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYXZzdHJpbmcuaCIKKworI2lmICFIQVZFX0dFVE9QVAorI2luY2x1ZGUgImNvbXBhdC9nZXRvcHQuYyIKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBpbnQgZmxhZzsKKyAgICBjb25zdCBjaGFyICpuYW1lOworfSBjcHVfZmxhZ190YWJbXSA9IHsKKyNpZiAgIEFSQ0hfQUFSQ0g2NAorICAgIHsgQVZfQ1BVX0ZMQUdfQVJNVjgsICAgICAiYXJtdjgiICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX05FT04sICAgICAgIm5lb24iICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19WRlAsICAgICAgICJ2ZnAiICAgICAgICB9LAorI2VsaWYgQVJDSF9BUk0KKyAgICB7IEFWX0NQVV9GTEFHX0FSTVY1VEUsICAgImFybXY1dGUiICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19BUk1WNiwgICAgICJhcm12NiIgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfQVJNVjZUMiwgICAiYXJtdjZ0MiIgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX1ZGUCwgICAgICAgInZmcCIgICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19WRlBWMywgICAgICJ2ZnB2MyIgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfTkVPTiwgICAgICAibmVvbiIgICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX1NFVEVORCwgICAgInNldGVuZCIgICAgIH0sCisjZWxpZiBBUkNIX1BQQworICAgIHsgQVZfQ1BVX0ZMQUdfQUxUSVZFQywgICAiYWx0aXZlYyIgICAgfSwKKyNlbGlmIEFSQ0hfWDg2CisgICAgeyBBVl9DUFVfRkxBR19NTVgsICAgICAgICJtbXgiICAgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfTU1YRVhULCAgICAibW14ZXh0IiAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX1NTRSwgICAgICAgInNzZSIgICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19TU0UyLCAgICAgICJzc2UyIiAgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfU1NFMlNMT1csICAic3NlMnNsb3ciICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX1NTRTMsICAgICAgInNzZTMiICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19TU0UzU0xPVywgICJzc2Uzc2xvdyIgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfU1NTRTMsICAgICAic3NzZTMiICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX0FUT00sICAgICAgImF0b20iICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19TU0U0LCAgICAgICJzc2U0LjEiICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfU1NFNDIsICAgICAic3NlNC4yIiAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX0FWWCwgICAgICAgImF2eCIgICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19YT1AsICAgICAgICJ4b3AiICAgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfRk1BMywgICAgICAiZm1hMyIgICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX0ZNQTQsICAgICAgImZtYTQiICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR18zRE5PVywgICAgICIzZG5vdyIgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfM0ROT1dFWFQsICAiM2Rub3dleHQiICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX0NNT1YsICAgICAgImNtb3YiICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19BVlgyLCAgICAgICJhdngyIiAgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfQk1JMSwgICAgICAiYm1pMSIgICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX0JNSTIsICAgICAgImJtaTIiICAgICAgIH0sCisjZW5kaWYKKyAgICB7IDAgfQorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfY3B1X2ZsYWdzKGludCBjcHVfZmxhZ3MsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisgICAgaW50IGk7CisKKyAgICBwcmludGYoImNwdV9mbGFncyglcykgPSAweCUwOFhcbiIsIHR5cGUsIGNwdV9mbGFncyk7CisgICAgcHJpbnRmKCJjcHVfZmxhZ3Nfc3RyKCVzKSA9IiwgdHlwZSk7CisgICAgZm9yIChpID0gMDsgY3B1X2ZsYWdfdGFiW2ldLmZsYWc7IGkrKykKKyAgICAgICAgaWYgKGNwdV9mbGFncyAmIGNwdV9mbGFnX3RhYltpXS5mbGFnKQorICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBjcHVfZmxhZ190YWJbaV0ubmFtZSk7CisgICAgcHJpbnRmKCJcbiIpOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgY3B1X2ZsYWdzX3JhdyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKyAgICBpbnQgY3B1X2ZsYWdzX2VmZjsKKyAgICBpbnQgY3B1X2NvdW50ID0gYXZfY3B1X2NvdW50KCk7CisgICAgY2hhciB0aHJlYWRzWzVdID0gImF1dG8iOworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwOyBjcHVfZmxhZ190YWJbaV0uZmxhZzsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIHRtcCA9IDA7CisgICAgICAgIGlmIChhdl9wYXJzZV9jcHVfY2FwcygmdG1wLCBjcHVfZmxhZ190YWJbaV0ubmFtZSkgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRhYmxlIG1pc3NpbmcgJXNcbiIsIGNwdV9mbGFnX3RhYltpXS5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNwdV9mbGFnc19yYXcgPCAwKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImM6dDoiKTsKKyAgICAgICAgaWYgKGMgPT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBmbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKyAgICAgICAgICAgIGlmIChhdl9wYXJzZV9jcHVfY2FwcygmZmxhZ3MsIG9wdGFyZykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAyOworCisgICAgICAgICAgICBhdl9mb3JjZV9jcHVfZmxhZ3MoZmxhZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAndCc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBhdl9zdHJsY3B5KHRocmVhZHMsIG9wdGFyZywgc2l6ZW9mKHRocmVhZHMpKTsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gc2l6ZW9mKHRocmVhZHMpKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHRocmVhZCBjb3VudCAnJXMnXG4iLCBvcHRhcmcpOworICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjcHVfZmxhZ3NfZWZmID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGNwdV9mbGFnc19lZmYgPCAwKQorICAgICAgICByZXR1cm4gMzsKKworICAgIHByaW50X2NwdV9mbGFncyhjcHVfZmxhZ3NfcmF3LCAicmF3Iik7CisgICAgcHJpbnRfY3B1X2ZsYWdzKGNwdV9mbGFnc19lZmYsICJlZmZlY3RpdmUiKTsKKyAgICBwcmludGYoInRocmVhZHMgPSAlcyAoY3B1X2NvdW50ID0gJWQpXG4iLCB0aHJlYWRzLCBjcHVfY291bnQpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9jcHUuaCBiL2ZmbXBlZy9saWJhdnV0aWwvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3ZTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvY3B1LmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0NQVV9ICisjZGVmaW5lIEFWVVRJTF9DUFVfSAorCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorCisjZGVmaW5lIEFWX0NQVV9GTEFHX0ZPUkNFICAgIDB4ODAwMDAwMDAgLyogZm9yY2UgdXNhZ2Ugb2Ygc2VsZWN0ZWQgZmxhZ3MgKE9SKSAqLworCisgICAgLyogbG93ZXIgMTYgYml0cyAtIENQVSBmZWF0dXJlcyAqLworI2RlZmluZSBBVl9DUFVfRkxBR19NTVggICAgICAgICAgMHgwMDAxIC8vLzwgc3RhbmRhcmQgTU1YCisjZGVmaW5lIEFWX0NQVV9GTEFHX01NWEVYVCAgICAgICAweDAwMDIgLy8vPCBTU0UgaW50ZWdlciBmdW5jdGlvbnMgb3IgQU1EIE1NWCBleHQKKyNkZWZpbmUgQVZfQ1BVX0ZMQUdfTU1YMiAgICAgICAgIDB4MDAwMiAvLy88IFNTRSBpbnRlZ2VyIGZ1bmN0aW9ucyBvciBBTUQgTU1YIGV4dAorI2RlZmluZSBBVl9DUFVfRkxBR18zRE5PVyAgICAgICAgMHgwMDA0IC8vLzwgQU1EIDNETk9XCisjZGVmaW5lIEFWX0NQVV9GTEFHX1NTRSAgICAgICAgICAweDAwMDggLy8vPCBTU0UgZnVuY3Rpb25zCisjZGVmaW5lIEFWX0NQVV9GTEFHX1NTRTIgICAgICAgICAweDAwMTAgLy8vPCBQSVYgU1NFMiBmdW5jdGlvbnMKKyNkZWZpbmUgQVZfQ1BVX0ZMQUdfU1NFMlNMT1cgMHg0MDAwMDAwMCAvLy88IFNTRTIgc3VwcG9ydGVkLCBidXQgdXN1YWxseSBub3QgZmFzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0aGFuIHJlZ3VsYXIgTU1YL1NTRSAoZS5nLiBDb3JlMSkKKyNkZWZpbmUgQVZfQ1BVX0ZMQUdfM0ROT1dFWFQgICAgIDB4MDAyMCAvLy88IEFNRCAzRE5vd0V4dAorI2RlZmluZSBBVl9DUFVfRkxBR19TU0UzICAgICAgICAgMHgwMDQwIC8vLzwgUHJlc2NvdHQgU1NFMyBmdW5jdGlvbnMKKyNkZWZpbmUgQVZfQ1BVX0ZMQUdfU1NFM1NMT1cgMHgyMDAwMDAwMCAvLy88IFNTRTMgc3VwcG9ydGVkLCBidXQgdXN1YWxseSBub3QgZmFzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0aGFuIHJlZ3VsYXIgTU1YL1NTRSAoZS5nLiBDb3JlMSkKKyNkZWZpbmUgQVZfQ1BVX0ZMQUdfU1NTRTMgICAgICAgIDB4MDA4MCAvLy88IENvbnJvZSBTU1NFMyBmdW5jdGlvbnMKKyNkZWZpbmUgQVZfQ1BVX0ZMQUdfQVRPTSAgICAgMHgxMDAwMDAwMCAvLy88IEF0b20gcHJvY2Vzc29yLCBzb21lIFNTU0UzIGluc3RydWN0aW9ucyBhcmUgc2xvd2VyCisjZGVmaW5lIEFWX0NQVV9GTEFHX1NTRTQgICAgICAgICAweDAxMDAgLy8vPCBQZW5yeW4gU1NFNC4xIGZ1bmN0aW9ucworI2RlZmluZSBBVl9DUFVfRkxBR19TU0U0MiAgICAgICAgMHgwMjAwIC8vLzwgTmVoYWxlbSBTU0U0LjIgZnVuY3Rpb25zCisjZGVmaW5lIEFWX0NQVV9GTEFHX0FWWCAgICAgICAgICAweDQwMDAgLy8vPCBBVlggZnVuY3Rpb25zOiByZXF1aXJlcyBPUyBzdXBwb3J0IGV2ZW4gaWYgWU1NIHJlZ2lzdGVycyBhcmVuJ3QgdXNlZAorI2RlZmluZSBBVl9DUFVfRkxBR19YT1AgICAgICAgICAgMHgwNDAwIC8vLzwgQnVsbGRvemVyIFhPUCBmdW5jdGlvbnMKKyNkZWZpbmUgQVZfQ1BVX0ZMQUdfRk1BNCAgICAgICAgIDB4MDgwMCAvLy88IEJ1bGxkb3plciBGTUE0IGZ1bmN0aW9ucworLy8gI2lmIExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDw1MgorI2RlZmluZSBBVl9DUFVfRkxBR19DTU9WICAgICAgMHgxMDAxMDAwIC8vLzwgc3VwcG9ydHMgY21vdiBpbnN0cnVjdGlvbgorLy8gI2Vsc2UKKy8vICNkZWZpbmUgQVZfQ1BVX0ZMQUdfQ01PViAgICAgICAgIDB4MTAwMCAvLy88IHN1cHBvcnRzIGNtb3YgaW5zdHJ1Y3Rpb24KKy8vICNlbmRpZgorI2RlZmluZSBBVl9DUFVfRkxBR19BVlgyICAgICAgICAgMHg4MDAwIC8vLzwgQVZYMiBmdW5jdGlvbnM6IHJlcXVpcmVzIE9TIHN1cHBvcnQgZXZlbiBpZiBZTU0gcmVnaXN0ZXJzIGFyZW4ndCB1c2VkCisjZGVmaW5lIEFWX0NQVV9GTEFHX0ZNQTMgICAgICAgIDB4MTAwMDAgLy8vPCBIYXN3ZWxsIEZNQTMgZnVuY3Rpb25zCisjZGVmaW5lIEFWX0NQVV9GTEFHX0JNSTEgICAgICAgIDB4MjAwMDAgLy8vPCBCaXQgTWFuaXB1bGF0aW9uIEluc3RydWN0aW9uIFNldCAxCisjZGVmaW5lIEFWX0NQVV9GTEFHX0JNSTIgICAgICAgIDB4NDAwMDAgLy8vPCBCaXQgTWFuaXB1bGF0aW9uIEluc3RydWN0aW9uIFNldCAyCisKKyNkZWZpbmUgQVZfQ1BVX0ZMQUdfQUxUSVZFQyAgICAgIDB4MDAwMSAvLy88IHN0YW5kYXJkCisKKyNkZWZpbmUgQVZfQ1BVX0ZMQUdfQVJNVjVURSAgICAgICgxIDw8IDApCisjZGVmaW5lIEFWX0NQVV9GTEFHX0FSTVY2ICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBBVl9DUFVfRkxBR19BUk1WNlQyICAgICAgKDEgPDwgMikKKyNkZWZpbmUgQVZfQ1BVX0ZMQUdfVkZQICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEFWX0NQVV9GTEFHX1ZGUFYzICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBBVl9DUFVfRkxBR19ORU9OICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgQVZfQ1BVX0ZMQUdfQVJNVjggICAgICAgICgxIDw8IDYpCisjZGVmaW5lIEFWX0NQVV9GTEFHX1NFVEVORCAgICAgICAoMSA8PDE2KQorCisvKioKKyAqIFJldHVybiB0aGUgZmxhZ3Mgd2hpY2ggc3BlY2lmeSBleHRlbnNpb25zIHN1cHBvcnRlZCBieSB0aGUgQ1BVLgorICogVGhlIHJldHVybmVkIHZhbHVlIGlzIGFmZmVjdGVkIGJ5IGF2X2ZvcmNlX2NwdV9mbGFncygpIGlmIHRoYXQgd2FzIHVzZWQKKyAqIGJlZm9yZS4gU28gYXZfZ2V0X2NwdV9mbGFncygpIGNhbiBlYXNpbHkgYmUgdXNlZCBpbiBhIGFwcGxpY2F0aW9uIHRvCisgKiBkZXRlY3QgdGhlIGVuYWJsZWQgY3B1IGZsYWdzLgorICovCitpbnQgYXZfZ2V0X2NwdV9mbGFncyh2b2lkKTsKKworLyoqCisgKiBEaXNhYmxlcyBjcHUgZGV0ZWN0aW9uIGFuZCBmb3JjZXMgdGhlIHNwZWNpZmllZCBmbGFncy4KKyAqIC0xIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgZGlzYWJsZXMgZm9yY2luZyBvZiBzcGVjaWZpYyBmbGFncy4KKyAqLwordm9pZCBhdl9mb3JjZV9jcHVfZmxhZ3MoaW50IGZsYWdzKTsKKworLyoqCisgKiBTZXQgYSBtYXNrIG9uIGZsYWdzIHJldHVybmVkIGJ5IGF2X2dldF9jcHVfZmxhZ3MoKS4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IHVzZWZ1bCBmb3IgdGVzdGluZy4KKyAqIFBsZWFzZSB1c2UgYXZfZm9yY2VfY3B1X2ZsYWdzKCkgYW5kIGF2X2dldF9jcHVfZmxhZ3MoKSBpbnN0ZWFkIHdoaWNoIGFyZSBtb3JlIGZsZXhpYmxlCisgKgorICogQHdhcm5pbmcgdGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUuCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkIHZvaWQgYXZfc2V0X2NwdV9mbGFnc19tYXNrKGludCBtYXNrKTsKKworLyoqCisgKiBQYXJzZSBDUFUgZmxhZ3MgZnJvbSBhIHN0cmluZy4KKyAqCisgKiBUaGUgcmV0dXJuZWQgZmxhZ3MgY29udGFpbiB0aGUgc3BlY2lmaWVkIGZsYWdzIGFzIHdlbGwgYXMgcmVsYXRlZCB1bnNwZWNpZmllZCBmbGFncy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggbGliYXYuCisgKiBQbGVhc2UgdXNlIGF2X3BhcnNlX2NwdV9jYXBzKCkgd2hlbiBwb3NzaWJsZS4KKyAqIEByZXR1cm4gYSBjb21iaW5hdGlvbiBvZiBBVl9DUFVfKiBmbGFncywgbmVnYXRpdmUgb24gZXJyb3IuCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitpbnQgYXZfcGFyc2VfY3B1X2ZsYWdzKGNvbnN0IGNoYXIgKnMpOworCisvKioKKyAqIFBhcnNlIENQVSBjYXBzIGZyb20gYSBzdHJpbmcgYW5kIHVwZGF0ZSB0aGUgZ2l2ZW4gQVZfQ1BVXyogZmxhZ3MgYmFzZWQgb24gdGhhdC4KKyAqCisgKiBAcmV0dXJuIG5lZ2F0aXZlIG9uIGVycm9yLgorICovCitpbnQgYXZfcGFyc2VfY3B1X2NhcHModW5zaWduZWQgKmZsYWdzLCBjb25zdCBjaGFyICpzKTsKKworLyoqCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbG9naWNhbCBDUFUgY29yZXMgcHJlc2VudC4KKyAqLworaW50IGF2X2NwdV9jb3VudCh2b2lkKTsKKworI2VuZGlmIC8qIEFWVVRJTF9DUFVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9jcHVfaW50ZXJuYWwuaCBiL2ZmbXBlZy9saWJhdnV0aWwvY3B1X2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2Y2U2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvY3B1X2ludGVybmFsLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9DUFVfSU5URVJOQUxfSAorI2RlZmluZSBBVlVUSUxfQ1BVX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgImNwdS5oIgorCisjZGVmaW5lIENQVUVYVF9TVUZGSVgoZmxhZ3MsIHN1ZmZpeCwgY3B1ZXh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKEhBVkVfICMjIGNwdWV4dCAjIyBzdWZmaXggJiYgKChmbGFncykgJiBBVl9DUFVfRkxBR18gIyMgY3B1ZXh0KSkKKworI2RlZmluZSBDUFVFWFQoZmxhZ3MsIGNwdWV4dCkgQ1BVRVhUX1NVRkZJWChmbGFncywgLCBjcHVleHQpCisKK2ludCBmZl9nZXRfY3B1X2ZsYWdzX2FhcmNoNjQodm9pZCk7CitpbnQgZmZfZ2V0X2NwdV9mbGFnc19hcm0odm9pZCk7CitpbnQgZmZfZ2V0X2NwdV9mbGFnc19wcGModm9pZCk7CitpbnQgZmZfZ2V0X2NwdV9mbGFnc194ODYodm9pZCk7CisKKyNlbmRpZiAvKiBBVlVUSUxfQ1BVX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvY3JjLmMgYi9mZm1wZWcvbGliYXZ1dGlsL2NyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YjFjOTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2NyYy5jCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJic3dhcC5oIgorI2luY2x1ZGUgImNyYy5oIgorCisjaWYgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKK3N0YXRpYyBjb25zdCBBVkNSQyBhdl9jcmNfdGFibGVbQVZfQ1JDX01BWF1bMjU3XSA9IHsKKyAgICBbQVZfQ1JDXzhfQVRNXSA9IHsKKyAgICAgICAgMHgwMCwgMHgwNywgMHgwRSwgMHgwOSwgMHgxQywgMHgxQiwgMHgxMiwgMHgxNSwgMHgzOCwgMHgzRiwgMHgzNiwgMHgzMSwKKyAgICAgICAgMHgyNCwgMHgyMywgMHgyQSwgMHgyRCwgMHg3MCwgMHg3NywgMHg3RSwgMHg3OSwgMHg2QywgMHg2QiwgMHg2MiwgMHg2NSwKKyAgICAgICAgMHg0OCwgMHg0RiwgMHg0NiwgMHg0MSwgMHg1NCwgMHg1MywgMHg1QSwgMHg1RCwgMHhFMCwgMHhFNywgMHhFRSwgMHhFOSwKKyAgICAgICAgMHhGQywgMHhGQiwgMHhGMiwgMHhGNSwgMHhEOCwgMHhERiwgMHhENiwgMHhEMSwgMHhDNCwgMHhDMywgMHhDQSwgMHhDRCwKKyAgICAgICAgMHg5MCwgMHg5NywgMHg5RSwgMHg5OSwgMHg4QywgMHg4QiwgMHg4MiwgMHg4NSwgMHhBOCwgMHhBRiwgMHhBNiwgMHhBMSwKKyAgICAgICAgMHhCNCwgMHhCMywgMHhCQSwgMHhCRCwgMHhDNywgMHhDMCwgMHhDOSwgMHhDRSwgMHhEQiwgMHhEQywgMHhENSwgMHhEMiwKKyAgICAgICAgMHhGRiwgMHhGOCwgMHhGMSwgMHhGNiwgMHhFMywgMHhFNCwgMHhFRCwgMHhFQSwgMHhCNywgMHhCMCwgMHhCOSwgMHhCRSwKKyAgICAgICAgMHhBQiwgMHhBQywgMHhBNSwgMHhBMiwgMHg4RiwgMHg4OCwgMHg4MSwgMHg4NiwgMHg5MywgMHg5NCwgMHg5RCwgMHg5QSwKKyAgICAgICAgMHgyNywgMHgyMCwgMHgyOSwgMHgyRSwgMHgzQiwgMHgzQywgMHgzNSwgMHgzMiwgMHgxRiwgMHgxOCwgMHgxMSwgMHgxNiwKKyAgICAgICAgMHgwMywgMHgwNCwgMHgwRCwgMHgwQSwgMHg1NywgMHg1MCwgMHg1OSwgMHg1RSwgMHg0QiwgMHg0QywgMHg0NSwgMHg0MiwKKyAgICAgICAgMHg2RiwgMHg2OCwgMHg2MSwgMHg2NiwgMHg3MywgMHg3NCwgMHg3RCwgMHg3QSwgMHg4OSwgMHg4RSwgMHg4NywgMHg4MCwKKyAgICAgICAgMHg5NSwgMHg5MiwgMHg5QiwgMHg5QywgMHhCMSwgMHhCNiwgMHhCRiwgMHhCOCwgMHhBRCwgMHhBQSwgMHhBMywgMHhBNCwKKyAgICAgICAgMHhGOSwgMHhGRSwgMHhGNywgMHhGMCwgMHhFNSwgMHhFMiwgMHhFQiwgMHhFQywgMHhDMSwgMHhDNiwgMHhDRiwgMHhDOCwKKyAgICAgICAgMHhERCwgMHhEQSwgMHhEMywgMHhENCwgMHg2OSwgMHg2RSwgMHg2NywgMHg2MCwgMHg3NSwgMHg3MiwgMHg3QiwgMHg3QywKKyAgICAgICAgMHg1MSwgMHg1NiwgMHg1RiwgMHg1OCwgMHg0RCwgMHg0QSwgMHg0MywgMHg0NCwgMHgxOSwgMHgxRSwgMHgxNywgMHgxMCwKKyAgICAgICAgMHgwNSwgMHgwMiwgMHgwQiwgMHgwQywgMHgyMSwgMHgyNiwgMHgyRiwgMHgyOCwgMHgzRCwgMHgzQSwgMHgzMywgMHgzNCwKKyAgICAgICAgMHg0RSwgMHg0OSwgMHg0MCwgMHg0NywgMHg1MiwgMHg1NSwgMHg1QywgMHg1QiwgMHg3NiwgMHg3MSwgMHg3OCwgMHg3RiwKKyAgICAgICAgMHg2QSwgMHg2RCwgMHg2NCwgMHg2MywgMHgzRSwgMHgzOSwgMHgzMCwgMHgzNywgMHgyMiwgMHgyNSwgMHgyQywgMHgyQiwKKyAgICAgICAgMHgwNiwgMHgwMSwgMHgwOCwgMHgwRiwgMHgxQSwgMHgxRCwgMHgxNCwgMHgxMywgMHhBRSwgMHhBOSwgMHhBMCwgMHhBNywKKyAgICAgICAgMHhCMiwgMHhCNSwgMHhCQywgMHhCQiwgMHg5NiwgMHg5MSwgMHg5OCwgMHg5RiwgMHg4QSwgMHg4RCwgMHg4NCwgMHg4MywKKyAgICAgICAgMHhERSwgMHhEOSwgMHhEMCwgMHhENywgMHhDMiwgMHhDNSwgMHhDQywgMHhDQiwgMHhFNiwgMHhFMSwgMHhFOCwgMHhFRiwKKyAgICAgICAgMHhGQSwgMHhGRCwgMHhGNCwgMHhGMywgMHgwMQorICAgIH0sCisgICAgW0FWX0NSQ18xNl9BTlNJXSA9IHsKKyAgICAgICAgMHgwMDAwLCAweDA1ODAsIDB4MEY4MCwgMHgwQTAwLCAweDFCODAsIDB4MUUwMCwgMHgxNDAwLCAweDExODAsCisgICAgICAgIDB4MzM4MCwgMHgzNjAwLCAweDNDMDAsIDB4Mzk4MCwgMHgyODAwLCAweDJEODAsIDB4Mjc4MCwgMHgyMjAwLAorICAgICAgICAweDYzODAsIDB4NjYwMCwgMHg2QzAwLCAweDY5ODAsIDB4NzgwMCwgMHg3RDgwLCAweDc3ODAsIDB4NzIwMCwKKyAgICAgICAgMHg1MDAwLCAweDU1ODAsIDB4NUY4MCwgMHg1QTAwLCAweDRCODAsIDB4NEUwMCwgMHg0NDAwLCAweDQxODAsCisgICAgICAgIDB4QzM4MCwgMHhDNjAwLCAweENDMDAsIDB4Qzk4MCwgMHhEODAwLCAweEREODAsIDB4RDc4MCwgMHhEMjAwLAorICAgICAgICAweEYwMDAsIDB4RjU4MCwgMHhGRjgwLCAweEZBMDAsIDB4RUI4MCwgMHhFRTAwLCAweEU0MDAsIDB4RTE4MCwKKyAgICAgICAgMHhBMDAwLCAweEE1ODAsIDB4QUY4MCwgMHhBQTAwLCAweEJCODAsIDB4QkUwMCwgMHhCNDAwLCAweEIxODAsCisgICAgICAgIDB4OTM4MCwgMHg5NjAwLCAweDlDMDAsIDB4OTk4MCwgMHg4ODAwLCAweDhEODAsIDB4ODc4MCwgMHg4MjAwLAorICAgICAgICAweDgzODEsIDB4ODYwMSwgMHg4QzAxLCAweDg5ODEsIDB4OTgwMSwgMHg5RDgxLCAweDk3ODEsIDB4OTIwMSwKKyAgICAgICAgMHhCMDAxLCAweEI1ODEsIDB4QkY4MSwgMHhCQTAxLCAweEFCODEsIDB4QUUwMSwgMHhBNDAxLCAweEExODEsCisgICAgICAgIDB4RTAwMSwgMHhFNTgxLCAweEVGODEsIDB4RUEwMSwgMHhGQjgxLCAweEZFMDEsIDB4RjQwMSwgMHhGMTgxLAorICAgICAgICAweEQzODEsIDB4RDYwMSwgMHhEQzAxLCAweEQ5ODEsIDB4QzgwMSwgMHhDRDgxLCAweEM3ODEsIDB4QzIwMSwKKyAgICAgICAgMHg0MDAxLCAweDQ1ODEsIDB4NEY4MSwgMHg0QTAxLCAweDVCODEsIDB4NUUwMSwgMHg1NDAxLCAweDUxODEsCisgICAgICAgIDB4NzM4MSwgMHg3NjAxLCAweDdDMDEsIDB4Nzk4MSwgMHg2ODAxLCAweDZEODEsIDB4Njc4MSwgMHg2MjAxLAorICAgICAgICAweDIzODEsIDB4MjYwMSwgMHgyQzAxLCAweDI5ODEsIDB4MzgwMSwgMHgzRDgxLCAweDM3ODEsIDB4MzIwMSwKKyAgICAgICAgMHgxMDAxLCAweDE1ODEsIDB4MUY4MSwgMHgxQTAxLCAweDBCODEsIDB4MEUwMSwgMHgwNDAxLCAweDAxODEsCisgICAgICAgIDB4MDM4MywgMHgwNjAzLCAweDBDMDMsIDB4MDk4MywgMHgxODAzLCAweDFEODMsIDB4MTc4MywgMHgxMjAzLAorICAgICAgICAweDMwMDMsIDB4MzU4MywgMHgzRjgzLCAweDNBMDMsIDB4MkI4MywgMHgyRTAzLCAweDI0MDMsIDB4MjE4MywKKyAgICAgICAgMHg2MDAzLCAweDY1ODMsIDB4NkY4MywgMHg2QTAzLCAweDdCODMsIDB4N0UwMywgMHg3NDAzLCAweDcxODMsCisgICAgICAgIDB4NTM4MywgMHg1NjAzLCAweDVDMDMsIDB4NTk4MywgMHg0ODAzLCAweDREODMsIDB4NDc4MywgMHg0MjAzLAorICAgICAgICAweEMwMDMsIDB4QzU4MywgMHhDRjgzLCAweENBMDMsIDB4REI4MywgMHhERTAzLCAweEQ0MDMsIDB4RDE4MywKKyAgICAgICAgMHhGMzgzLCAweEY2MDMsIDB4RkMwMywgMHhGOTgzLCAweEU4MDMsIDB4RUQ4MywgMHhFNzgzLCAweEUyMDMsCisgICAgICAgIDB4QTM4MywgMHhBNjAzLCAweEFDMDMsIDB4QTk4MywgMHhCODAzLCAweEJEODMsIDB4Qjc4MywgMHhCMjAzLAorICAgICAgICAweDkwMDMsIDB4OTU4MywgMHg5RjgzLCAweDlBMDMsIDB4OEI4MywgMHg4RTAzLCAweDg0MDMsIDB4ODE4MywKKyAgICAgICAgMHg4MDAyLCAweDg1ODIsIDB4OEY4MiwgMHg4QTAyLCAweDlCODIsIDB4OUUwMiwgMHg5NDAyLCAweDkxODIsCisgICAgICAgIDB4QjM4MiwgMHhCNjAyLCAweEJDMDIsIDB4Qjk4MiwgMHhBODAyLCAweEFEODIsIDB4QTc4MiwgMHhBMjAyLAorICAgICAgICAweEUzODIsIDB4RTYwMiwgMHhFQzAyLCAweEU5ODIsIDB4RjgwMiwgMHhGRDgyLCAweEY3ODIsIDB4RjIwMiwKKyAgICAgICAgMHhEMDAyLCAweEQ1ODIsIDB4REY4MiwgMHhEQTAyLCAweENCODIsIDB4Q0UwMiwgMHhDNDAyLCAweEMxODIsCisgICAgICAgIDB4NDM4MiwgMHg0NjAyLCAweDRDMDIsIDB4NDk4MiwgMHg1ODAyLCAweDVEODIsIDB4NTc4MiwgMHg1MjAyLAorICAgICAgICAweDcwMDIsIDB4NzU4MiwgMHg3RjgyLCAweDdBMDIsIDB4NkI4MiwgMHg2RTAyLCAweDY0MDIsIDB4NjE4MiwKKyAgICAgICAgMHgyMDAyLCAweDI1ODIsIDB4MkY4MiwgMHgyQTAyLCAweDNCODIsIDB4M0UwMiwgMHgzNDAyLCAweDMxODIsCisgICAgICAgIDB4MTM4MiwgMHgxNjAyLCAweDFDMDIsIDB4MTk4MiwgMHgwODAyLCAweDBEODIsIDB4MDc4MiwgMHgwMjAyLAorICAgICAgICAweDAwMDEKKyAgICB9LAorICAgIFtBVl9DUkNfMTZfQ0NJVFRdID0geworICAgICAgICAweDAwMDAsIDB4MjExMCwgMHg0MjIwLCAweDYzMzAsIDB4ODQ0MCwgMHhBNTUwLCAweEM2NjAsIDB4RTc3MCwKKyAgICAgICAgMHgwODgxLCAweDI5OTEsIDB4NEFBMSwgMHg2QkIxLCAweDhDQzEsIDB4QUREMSwgMHhDRUUxLCAweEVGRjEsCisgICAgICAgIDB4MzExMiwgMHgxMDAyLCAweDczMzIsIDB4NTIyMiwgMHhCNTUyLCAweDk0NDIsIDB4Rjc3MiwgMHhENjYyLAorICAgICAgICAweDM5OTMsIDB4MTg4MywgMHg3QkIzLCAweDVBQTMsIDB4QkREMywgMHg5Q0MzLCAweEZGRjMsIDB4REVFMywKKyAgICAgICAgMHg2MjI0LCAweDQzMzQsIDB4MjAwNCwgMHgwMTE0LCAweEU2NjQsIDB4Qzc3NCwgMHhBNDQ0LCAweDg1NTQsCisgICAgICAgIDB4NkFBNSwgMHg0QkI1LCAweDI4ODUsIDB4MDk5NSwgMHhFRUU1LCAweENGRjUsIDB4QUNDNSwgMHg4REQ1LAorICAgICAgICAweDUzMzYsIDB4NzIyNiwgMHgxMTE2LCAweDMwMDYsIDB4RDc3NiwgMHhGNjY2LCAweDk1NTYsIDB4QjQ0NiwKKyAgICAgICAgMHg1QkI3LCAweDdBQTcsIDB4MTk5NywgMHgzODg3LCAweERGRjcsIDB4RkVFNywgMHg5REQ3LCAweEJDQzcsCisgICAgICAgIDB4QzQ0OCwgMHhFNTU4LCAweDg2NjgsIDB4QTc3OCwgMHg0MDA4LCAweDYxMTgsIDB4MDIyOCwgMHgyMzM4LAorICAgICAgICAweENDQzksIDB4RUREOSwgMHg4RUU5LCAweEFGRjksIDB4NDg4OSwgMHg2OTk5LCAweDBBQTksIDB4MkJCOSwKKyAgICAgICAgMHhGNTVBLCAweEQ0NEEsIDB4Qjc3QSwgMHg5NjZBLCAweDcxMUEsIDB4NTAwQSwgMHgzMzNBLCAweDEyMkEsCisgICAgICAgIDB4RkREQiwgMHhEQ0NCLCAweEJGRkIsIDB4OUVFQiwgMHg3OTlCLCAweDU4OEIsIDB4M0JCQiwgMHgxQUFCLAorICAgICAgICAweEE2NkMsIDB4ODc3QywgMHhFNDRDLCAweEM1NUMsIDB4MjIyQywgMHgwMzNDLCAweDYwMEMsIDB4NDExQywKKyAgICAgICAgMHhBRUVELCAweDhGRkQsIDB4RUNDRCwgMHhDRERELCAweDJBQUQsIDB4MEJCRCwgMHg2ODhELCAweDQ5OUQsCisgICAgICAgIDB4OTc3RSwgMHhCNjZFLCAweEQ1NUUsIDB4RjQ0RSwgMHgxMzNFLCAweDMyMkUsIDB4NTExRSwgMHg3MDBFLAorICAgICAgICAweDlGRkYsIDB4QkVFRiwgMHhERERGLCAweEZDQ0YsIDB4MUJCRiwgMHgzQUFGLCAweDU5OUYsIDB4Nzg4RiwKKyAgICAgICAgMHg4ODkxLCAweEE5ODEsIDB4Q0FCMSwgMHhFQkExLCAweDBDRDEsIDB4MkRDMSwgMHg0RUYxLCAweDZGRTEsCisgICAgICAgIDB4ODAxMCwgMHhBMTAwLCAweEMyMzAsIDB4RTMyMCwgMHgwNDUwLCAweDI1NDAsIDB4NDY3MCwgMHg2NzYwLAorICAgICAgICAweEI5ODMsIDB4OTg5MywgMHhGQkEzLCAweERBQjMsIDB4M0RDMywgMHgxQ0QzLCAweDdGRTMsIDB4NUVGMywKKyAgICAgICAgMHhCMTAyLCAweDkwMTIsIDB4RjMyMiwgMHhEMjMyLCAweDM1NDIsIDB4MTQ1MiwgMHg3NzYyLCAweDU2NzIsCisgICAgICAgIDB4RUFCNSwgMHhDQkE1LCAweEE4OTUsIDB4ODk4NSwgMHg2RUY1LCAweDRGRTUsIDB4MkNENSwgMHgwREM1LAorICAgICAgICAweEUyMzQsIDB4QzMyNCwgMHhBMDE0LCAweDgxMDQsIDB4NjY3NCwgMHg0NzY0LCAweDI0NTQsIDB4MDU0NCwKKyAgICAgICAgMHhEQkE3LCAweEZBQjcsIDB4OTk4NywgMHhCODk3LCAweDVGRTcsIDB4N0VGNywgMHgxREM3LCAweDNDRDcsCisgICAgICAgIDB4RDMyNiwgMHhGMjM2LCAweDkxMDYsIDB4QjAxNiwgMHg1NzY2LCAweDc2NzYsIDB4MTU0NiwgMHgzNDU2LAorICAgICAgICAweDRDRDksIDB4NkRDOSwgMHgwRUY5LCAweDJGRTksIDB4Qzg5OSwgMHhFOTg5LCAweDhBQjksIDB4QUJBOSwKKyAgICAgICAgMHg0NDU4LCAweDY1NDgsIDB4MDY3OCwgMHgyNzY4LCAweEMwMTgsIDB4RTEwOCwgMHg4MjM4LCAweEEzMjgsCisgICAgICAgIDB4N0RDQiwgMHg1Q0RCLCAweDNGRUIsIDB4MUVGQiwgMHhGOThCLCAweEQ4OUIsIDB4QkJBQiwgMHg5QUJCLAorICAgICAgICAweDc1NEEsIDB4NTQ1QSwgMHgzNzZBLCAweDE2N0EsIDB4RjEwQSwgMHhEMDFBLCAweEIzMkEsIDB4OTIzQSwKKyAgICAgICAgMHgyRUZELCAweDBGRUQsIDB4NkNERCwgMHg0RENELCAweEFBQkQsIDB4OEJBRCwgMHhFODlELCAweEM5OEQsCisgICAgICAgIDB4MjY3QywgMHgwNzZDLCAweDY0NUMsIDB4NDU0QywgMHhBMjNDLCAweDgzMkMsIDB4RTAxQywgMHhDMTBDLAorICAgICAgICAweDFGRUYsIDB4M0VGRiwgMHg1RENGLCAweDdDREYsIDB4OUJBRiwgMHhCQUJGLCAweEQ5OEYsIDB4Rjg5RiwKKyAgICAgICAgMHgxNzZFLCAweDM2N0UsIDB4NTU0RSwgMHg3NDVFLCAweDkzMkUsIDB4QjIzRSwgMHhEMTBFLCAweEYwMUUsCisgICAgICAgIDB4MDAwMQorICAgIH0sCisgICAgW0FWX0NSQ18yNF9JRUVFXSA9IHsKKyAgICAgICAgMHgwMDAwMDAsIDB4RkI0Qzg2LCAweDBERDU4QSwgMHhGNjk5MEMsIDB4RTFFNjkzLCAweDFBQUExNSwgMHhFQzMzMTksCisgICAgICAgIDB4MTc3RjlGLCAweDM5ODFBMSwgMHhDMkNEMjcsIDB4MzQ1NDJCLCAweENGMThBRCwgMHhEODY3MzIsIDB4MjMyQkI0LAorICAgICAgICAweEQ1QjJCOCwgMHgyRUZFM0UsIDB4ODk0RUM1LCAweDcyMDI0MywgMHg4NDlCNEYsIDB4N0ZEN0M5LCAweDY4QTg1NiwKKyAgICAgICAgMHg5M0U0RDAsIDB4NjU3RERDLCAweDlFMzE1QSwgMHhCMENGNjQsIDB4NEI4M0UyLCAweEJEMUFFRSwgMHg0NjU2NjgsCisgICAgICAgIDB4NTEyOUY3LCAweEFBNjU3MSwgMHg1Q0ZDN0QsIDB4QTdCMEZCLCAweEU5RDEwQywgMHgxMjlEOEEsIDB4RTQwNDg2LAorICAgICAgICAweDFGNDgwMCwgMHgwODM3OUYsIDB4RjM3QjE5LCAweDA1RTIxNSwgMHhGRUFFOTMsIDB4RDA1MEFELCAweDJCMUMyQiwKKyAgICAgICAgMHhERDg1MjcsIDB4MjZDOUExLCAweDMxQjYzRSwgMHhDQUZBQjgsIDB4M0M2M0I0LCAweEM3MkYzMiwgMHg2MDlGQzksCisgICAgICAgIDB4OUJEMzRGLCAweDZENEE0MywgMHg5NjA2QzUsIDB4ODE3OTVBLCAweDdBMzVEQywgMHg4Q0FDRDAsIDB4NzdFMDU2LAorICAgICAgICAweDU5MUU2OCwgMHhBMjUyRUUsIDB4NTRDQkUyLCAweEFGODc2NCwgMHhCOEY4RkIsIDB4NDNCNDdELCAweEI1MkQ3MSwKKyAgICAgICAgMHg0RTYxRjcsIDB4RDJBMzE5LCAweDI5RUY5RiwgMHhERjc2OTMsIDB4MjQzQTE1LCAweDMzNDU4QSwgMHhDODA5MEMsCisgICAgICAgIDB4M0U5MDAwLCAweEM1REM4NiwgMHhFQjIyQjgsIDB4MTA2RTNFLCAweEU2RjczMiwgMHgxREJCQjQsIDB4MEFDNDJCLAorICAgICAgICAweEYxODhBRCwgMHgwNzExQTEsIDB4RkM1RDI3LCAweDVCRUREQywgMHhBMEExNUEsIDB4NTYzODU2LCAweEFENzREMCwKKyAgICAgICAgMHhCQTBCNEYsIDB4NDE0N0M5LCAweEI3REVDNSwgMHg0QzkyNDMsIDB4NjI2QzdELCAweDk5MjBGQiwgMHg2RkI5RjcsCisgICAgICAgIDB4OTRGNTcxLCAweDgzOEFFRSwgMHg3OEM2NjgsIDB4OEU1RjY0LCAweDc1MTNFMiwgMHgzQjcyMTUsIDB4QzAzRTkzLAorICAgICAgICAweDM2QTc5RiwgMHhDREVCMTksIDB4REE5NDg2LCAweDIxRDgwMCwgMHhENzQxMEMsIDB4MkMwRDhBLCAweDAyRjNCNCwKKyAgICAgICAgMHhGOUJGMzIsIDB4MEYyNjNFLCAweEY0NkFCOCwgMHhFMzE1MjcsIDB4MTg1OUExLCAweEVFQzBBRCwgMHgxNThDMkIsCisgICAgICAgIDB4QjIzQ0QwLCAweDQ5NzA1NiwgMHhCRkU5NUEsIDB4NDRBNURDLCAweDUzREE0MywgMHhBODk2QzUsIDB4NUUwRkM5LAorICAgICAgICAweEE1NDM0RiwgMHg4QkJENzEsIDB4NzBGMUY3LCAweDg2NjhGQiwgMHg3RDI0N0QsIDB4NkE1QkUyLCAweDkxMTc2NCwKKyAgICAgICAgMHg2NzhFNjgsIDB4OUNDMkVFLCAweEE0NDczMywgMHg1RjBCQjUsIDB4QTk5MkI5LCAweDUyREUzRiwgMHg0NUExQTAsCisgICAgICAgIDB4QkVFRDI2LCAweDQ4NzQyQSwgMHhCMzM4QUMsIDB4OURDNjkyLCAweDY2OEExNCwgMHg5MDEzMTgsIDB4NkI1RjlFLAorICAgICAgICAweDdDMjAwMSwgMHg4NzZDODcsIDB4NzFGNThCLCAweDhBQjkwRCwgMHgyRDA5RjYsIDB4RDY0NTcwLCAweDIwREM3QywKKyAgICAgICAgMHhEQjkwRkEsIDB4Q0NFRjY1LCAweDM3QTNFMywgMHhDMTNBRUYsIDB4M0E3NjY5LCAweDE0ODg1NywgMHhFRkM0RDEsCisgICAgICAgIDB4MTk1RERELCAweEUyMTE1QiwgMHhGNTZFQzQsIDB4MEUyMjQyLCAweEY4QkI0RSwgMHgwM0Y3QzgsIDB4NEQ5NjNGLAorICAgICAgICAweEI2REFCOSwgMHg0MDQzQjUsIDB4QkIwRjMzLCAweEFDNzBBQywgMHg1NzNDMkEsIDB4QTFBNTI2LCAweDVBRTlBMCwKKyAgICAgICAgMHg3NDE3OUUsIDB4OEY1QjE4LCAweDc5QzIxNCwgMHg4MjhFOTIsIDB4OTVGMTBELCAweDZFQkQ4QiwgMHg5ODI0ODcsCisgICAgICAgIDB4NjM2ODAxLCAweEM0RDhGQSwgMHgzRjk0N0MsIDB4QzkwRDcwLCAweDMyNDFGNiwgMHgyNTNFNjksIDB4REU3MkVGLAorICAgICAgICAweDI4RUJFMywgMHhEM0E3NjUsIDB4RkQ1OTVCLCAweDA2MTVERCwgMHhGMDhDRDEsIDB4MEJDMDU3LCAweDFDQkZDOCwKKyAgICAgICAgMHhFN0YzNEUsIDB4MTE2QTQyLCAweEVBMjZDNCwgMHg3NkU0MkEsIDB4OERBOEFDLCAweDdCMzFBMCwgMHg4MDdEMjYsCisgICAgICAgIDB4OTcwMkI5LCAweDZDNEUzRiwgMHg5QUQ3MzMsIDB4NjE5QkI1LCAweDRGNjU4QiwgMHhCNDI5MEQsIDB4NDJCMDAxLAorICAgICAgICAweEI5RkM4NywgMHhBRTgzMTgsIDB4NTVDRjlFLCAweEEzNTY5MiwgMHg1ODFBMTQsIDB4RkZBQUVGLCAweDA0RTY2OSwKKyAgICAgICAgMHhGMjdGNjUsIDB4MDkzM0UzLCAweDFFNEM3QywgMHhFNTAwRkEsIDB4MTM5OUY2LCAweEU4RDU3MCwgMHhDNjJCNEUsCisgICAgICAgIDB4M0Q2N0M4LCAweENCRkVDNCwgMHgzMEIyNDIsIDB4MjdDRERELCAweERDODE1QiwgMHgyQTE4NTcsIDB4RDE1NEQxLAorICAgICAgICAweDlGMzUyNiwgMHg2NDc5QTAsIDB4OTJFMEFDLCAweDY5QUMyQSwgMHg3RUQzQjUsIDB4ODU5RjMzLCAweDczMDYzRiwKKyAgICAgICAgMHg4ODRBQjksIDB4QTZCNDg3LCAweDVERjgwMSwgMHhBQjYxMEQsIDB4NTAyRDhCLCAweDQ3NTIxNCwgMHhCQzFFOTIsCisgICAgICAgIDB4NEE4NzlFLCAweEIxQ0IxOCwgMHgxNjdCRTMsIDB4RUQzNzY1LCAweDFCQUU2OSwgMHhFMEUyRUYsIDB4Rjc5RDcwLAorICAgICAgICAweDBDRDFGNiwgMHhGQTQ4RkEsIDB4MDEwNDdDLCAweDJGRkE0MiwgMHhENEI2QzQsIDB4MjIyRkM4LCAweEQ5NjM0RSwKKyAgICAgICAgMHhDRTFDRDEsIDB4MzU1MDU3LCAweEMzQzk1QiwgMHgzODg1REQsIDB4MDAwMDAxLAorICAgIH0sCisgICAgW0FWX0NSQ18zMl9JRUVFXSA9IHsKKyAgICAgICAgMHgwMDAwMDAwMCwgMHhCNzFEQzEwNCwgMHg2RTNCODIwOSwgMHhEOTI2NDMwRCwgMHhEQzc2MDQxMywgMHg2QjZCQzUxNywKKyAgICAgICAgMHhCMjREODYxQSwgMHgwNTUwNDcxRSwgMHhCOEVEMDgyNiwgMHgwRkYwQzkyMiwgMHhENkQ2OEEyRiwgMHg2MUNCNEIyQiwKKyAgICAgICAgMHg2NDlCMEMzNSwgMHhEMzg2Q0QzMSwgMHgwQUEwOEUzQywgMHhCREJENEYzOCwgMHg3MERCMTE0QywgMHhDN0M2RDA0OCwKKyAgICAgICAgMHgxRUUwOTM0NSwgMHhBOUZENTI0MSwgMHhBQ0FEMTU1RiwgMHgxQkIwRDQ1QiwgMHhDMjk2OTc1NiwgMHg3NThCNTY1MiwKKyAgICAgICAgMHhDODM2MTk2QSwgMHg3RjJCRDg2RSwgMHhBNjBEOUI2MywgMHgxMTEwNUE2NywgMHgxNDQwMUQ3OSwgMHhBMzVEREM3RCwKKyAgICAgICAgMHg3QTdCOUY3MCwgMHhDRDY2NUU3NCwgMHhFMEI2MjM5OCwgMHg1N0FCRTI5QywgMHg4RThEQTE5MSwgMHgzOTkwNjA5NSwKKyAgICAgICAgMHgzQ0MwMjc4QiwgMHg4QkRERTY4RiwgMHg1MkZCQTU4MiwgMHhFNUU2NjQ4NiwgMHg1ODVCMkJCRSwgMHhFRjQ2RUFCQSwKKyAgICAgICAgMHgzNjYwQTlCNywgMHg4MTdENjhCMywgMHg4NDJEMkZBRCwgMHgzMzMwRUVBOSwgMHhFQTE2QURBNCwgMHg1RDBCNkNBMCwKKyAgICAgICAgMHg5MDZEMzJENCwgMHgyNzcwRjNEMCwgMHhGRTU2QjBERCwgMHg0OTRCNzFEOSwgMHg0QzFCMzZDNywgMHhGQjA2RjdDMywKKyAgICAgICAgMHgyMjIwQjRDRSwgMHg5NTNENzVDQSwgMHgyODgwM0FGMiwgMHg5RjlERkJGNiwgMHg0NkJCQjhGQiwgMHhGMUE2NzlGRiwKKyAgICAgICAgMHhGNEY2M0VFMSwgMHg0M0VCRkZFNSwgMHg5QUNEQkNFOCwgMHgyREQwN0RFQywgMHg3NzcwODYzNCwgMHhDMDZENDczMCwKKyAgICAgICAgMHgxOTRCMDQzRCwgMHhBRTU2QzUzOSwgMHhBQjA2ODIyNywgMHgxQzFCNDMyMywgMHhDNTNEMDAyRSwgMHg3MjIwQzEyQSwKKyAgICAgICAgMHhDRjlEOEUxMiwgMHg3ODgwNEYxNiwgMHhBMUE2MEMxQiwgMHgxNkJCQ0QxRiwgMHgxM0VCOEEwMSwgMHhBNEY2NEIwNSwKKyAgICAgICAgMHg3REQwMDgwOCwgMHhDQUNEQzkwQywgMHgwN0FCOTc3OCwgMHhCMEI2NTY3QywgMHg2OTkwMTU3MSwgMHhERThERDQ3NSwKKyAgICAgICAgMHhEQkREOTM2QiwgMHg2Q0MwNTI2RiwgMHhCNUU2MTE2MiwgMHgwMkZCRDA2NiwgMHhCRjQ2OUY1RSwgMHgwODVCNUU1QSwKKyAgICAgICAgMHhEMTdEMUQ1NywgMHg2NjYwREM1MywgMHg2MzMwOUI0RCwgMHhENDJENUE0OSwgMHgwRDBCMTk0NCwgMHhCQTE2RDg0MCwKKyAgICAgICAgMHg5N0M2QTVBQywgMHgyMERCNjRBOCwgMHhGOUZEMjdBNSwgMHg0RUUwRTZBMSwgMHg0QkIwQTFCRiwgMHhGQ0FENjBCQiwKKyAgICAgICAgMHgyNThCMjNCNiwgMHg5Mjk2RTJCMiwgMHgyRjJCQUQ4QSwgMHg5ODM2NkM4RSwgMHg0MTEwMkY4MywgMHhGNjBERUU4NywKKyAgICAgICAgMHhGMzVEQTk5OSwgMHg0NDQwNjg5RCwgMHg5RDY2MkI5MCwgMHgyQTdCRUE5NCwgMHhFNzFEQjRFMCwgMHg1MDAwNzVFNCwKKyAgICAgICAgMHg4OTI2MzZFOSwgMHgzRTNCRjdFRCwgMHgzQjZCQjBGMywgMHg4Qzc2NzFGNywgMHg1NTUwMzJGQSwgMHhFMjRERjNGRSwKKyAgICAgICAgMHg1RkYwQkNDNiwgMHhFOEVEN0RDMiwgMHgzMUNCM0VDRiwgMHg4NkQ2RkZDQiwgMHg4Mzg2QjhENSwgMHgzNDlCNzlEMSwKKyAgICAgICAgMHhFREJEM0FEQywgMHg1QUEwRkJEOCwgMHhFRUUwMEM2OSwgMHg1OUZEQ0Q2RCwgMHg4MERCOEU2MCwgMHgzN0M2NEY2NCwKKyAgICAgICAgMHgzMjk2MDg3QSwgMHg4NThCQzk3RSwgMHg1Q0FEOEE3MywgMHhFQkIwNEI3NywgMHg1NjBEMDQ0RiwgMHhFMTEwQzU0QiwKKyAgICAgICAgMHgzODM2ODY0NiwgMHg4RjJCNDc0MiwgMHg4QTdCMDA1QywgMHgzRDY2QzE1OCwgMHhFNDQwODI1NSwgMHg1MzVENDM1MSwKKyAgICAgICAgMHg5RTNCMUQyNSwgMHgyOTI2REMyMSwgMHhGMDAwOUYyQywgMHg0NzFENUUyOCwgMHg0MjREMTkzNiwgMHhGNTUwRDgzMiwKKyAgICAgICAgMHgyQzc2OUIzRiwgMHg5QjZCNUEzQiwgMHgyNkQ2MTUwMywgMHg5MUNCRDQwNywgMHg0OEVEOTcwQSwgMHhGRkYwNTYwRSwKKyAgICAgICAgMHhGQUEwMTExMCwgMHg0REJERDAxNCwgMHg5NDlCOTMxOSwgMHgyMzg2NTIxRCwgMHgwRTU2MkZGMSwgMHhCOTRCRUVGNSwKKyAgICAgICAgMHg2MDZEQURGOCwgMHhENzcwNkNGQywgMHhEMjIwMkJFMiwgMHg2NTNERUFFNiwgMHhCQzFCQTlFQiwgMHgwQjA2NjhFRiwKKyAgICAgICAgMHhCNkJCMjdENywgMHgwMUE2RTZEMywgMHhEODgwQTVERSwgMHg2RjlENjREQSwgMHg2QUNEMjNDNCwgMHhEREQwRTJDMCwKKyAgICAgICAgMHgwNEY2QTFDRCwgMHhCM0VCNjBDOSwgMHg3RThEM0VCRCwgMHhDOTkwRkZCOSwgMHgxMEI2QkNCNCwgMHhBN0FCN0RCMCwKKyAgICAgICAgMHhBMkZCM0FBRSwgMHgxNUU2RkJBQSwgMHhDQ0MwQjhBNywgMHg3QkRENzlBMywgMHhDNjYwMzY5QiwgMHg3MTdERjc5RiwKKyAgICAgICAgMHhBODVCQjQ5MiwgMHgxRjQ2NzU5NiwgMHgxQTE2MzI4OCwgMHhBRDBCRjM4QywgMHg3NDJEQjA4MSwgMHhDMzMwNzE4NSwKKyAgICAgICAgMHg5OTkwOEE1RCwgMHgyRThENEI1OSwgMHhGN0FCMDg1NCwgMHg0MEI2Qzk1MCwgMHg0NUU2OEU0RSwgMHhGMkZCNEY0QSwKKyAgICAgICAgMHgyQkREMEM0NywgMHg5Q0MwQ0Q0MywgMHgyMTdEODI3QiwgMHg5NjYwNDM3RiwgMHg0RjQ2MDA3MiwgMHhGODVCQzE3NiwKKyAgICAgICAgMHhGRDBCODY2OCwgMHg0QTE2NDc2QywgMHg5MzMwMDQ2MSwgMHgyNDJEQzU2NSwgMHhFOTRCOUIxMSwgMHg1RTU2NUExNSwKKyAgICAgICAgMHg4NzcwMTkxOCwgMHgzMDZERDgxQywgMHgzNTNEOUYwMiwgMHg4MjIwNUUwNiwgMHg1QjA2MUQwQiwgMHhFQzFCREMwRiwKKyAgICAgICAgMHg1MUE2OTMzNywgMHhFNkJCNTIzMywgMHgzRjlEMTEzRSwgMHg4ODgwRDAzQSwgMHg4REQwOTcyNCwgMHgzQUNENTYyMCwKKyAgICAgICAgMHhFM0VCMTUyRCwgMHg1NEY2RDQyOSwgMHg3OTI2QTlDNSwgMHhDRTNCNjhDMSwgMHgxNzFEMkJDQywgMHhBMDAwRUFDOCwKKyAgICAgICAgMHhBNTUwQURENiwgMHgxMjRENkNEMiwgMHhDQjZCMkZERiwgMHg3Qzc2RUVEQiwgMHhDMUNCQTFFMywgMHg3NkQ2NjBFNywKKyAgICAgICAgMHhBRkYwMjNFQSwgMHgxOEVERTJFRSwgMHgxREJEQTVGMCwgMHhBQUEwNjRGNCwgMHg3Mzg2MjdGOSwgMHhDNDlCRTZGRCwKKyAgICAgICAgMHgwOUZEQjg4OSwgMHhCRUUwNzk4RCwgMHg2N0M2M0E4MCwgMHhEMERCRkI4NCwgMHhENThCQkM5QSwgMHg2Mjk2N0Q5RSwKKyAgICAgICAgMHhCQkIwM0U5MywgMHgwQ0FERkY5NywgMHhCMTEwQjBBRiwgMHgwNjBENzFBQiwgMHhERjJCMzJBNiwgMHg2ODM2RjNBMiwKKyAgICAgICAgMHg2RDY2QjRCQywgMHhEQTdCNzVCOCwgMHgwMzVEMzZCNSwgMHhCNDQwRjdCMSwgMHgwMDAwMDAwMQorICAgIH0sCisgICAgW0FWX0NSQ18zMl9JRUVFX0xFXSA9IHsKKyAgICAgICAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhFRTBFNjEyQywgMHg5OTA5NTFCQSwgMHgwNzZEQzQxOSwgMHg3MDZBRjQ4RiwKKyAgICAgICAgMHhFOTYzQTUzNSwgMHg5RTY0OTVBMywgMHgwRURCODgzMiwgMHg3OURDQjhBNCwgMHhFMEQ1RTkxRSwgMHg5N0QyRDk4OCwKKyAgICAgICAgMHgwOUI2NEMyQiwgMHg3RUIxN0NCRCwgMHhFN0I4MkQwNywgMHg5MEJGMUQ5MSwgMHgxREI3MTA2NCwgMHg2QUIwMjBGMiwKKyAgICAgICAgMHhGM0I5NzE0OCwgMHg4NEJFNDFERSwgMHgxQURBRDQ3RCwgMHg2RERERTRFQiwgMHhGNEQ0QjU1MSwgMHg4M0QzODVDNywKKyAgICAgICAgMHgxMzZDOTg1NiwgMHg2NDZCQThDMCwgMHhGRDYyRjk3QSwgMHg4QTY1QzlFQywgMHgxNDAxNUM0RiwgMHg2MzA2NkNEOSwKKyAgICAgICAgMHhGQTBGM0Q2MywgMHg4RDA4MERGNSwgMHgzQjZFMjBDOCwgMHg0QzY5MTA1RSwgMHhENTYwNDFFNCwgMHhBMjY3NzE3MiwKKyAgICAgICAgMHgzQzAzRTREMSwgMHg0QjA0RDQ0NywgMHhEMjBEODVGRCwgMHhBNTBBQjU2QiwgMHgzNUI1QThGQSwgMHg0MkIyOTg2QywKKyAgICAgICAgMHhEQkJCQzlENiwgMHhBQ0JDRjk0MCwgMHgzMkQ4NkNFMywgMHg0NURGNUM3NSwgMHhEQ0Q2MERDRiwgMHhBQkQxM0Q1OSwKKyAgICAgICAgMHgyNkQ5MzBBQywgMHg1MURFMDAzQSwgMHhDOEQ3NTE4MCwgMHhCRkQwNjExNiwgMHgyMUI0RjRCNSwgMHg1NkIzQzQyMywKKyAgICAgICAgMHhDRkJBOTU5OSwgMHhCOEJEQTUwRiwgMHgyODAyQjg5RSwgMHg1RjA1ODgwOCwgMHhDNjBDRDlCMiwgMHhCMTBCRTkyNCwKKyAgICAgICAgMHgyRjZGN0M4NywgMHg1ODY4NEMxMSwgMHhDMTYxMURBQiwgMHhCNjY2MkQzRCwgMHg3NkRDNDE5MCwgMHgwMURCNzEwNiwKKyAgICAgICAgMHg5OEQyMjBCQywgMHhFRkQ1MTAyQSwgMHg3MUIxODU4OSwgMHgwNkI2QjUxRiwgMHg5RkJGRTRBNSwgMHhFOEI4RDQzMywKKyAgICAgICAgMHg3ODA3QzlBMiwgMHgwRjAwRjkzNCwgMHg5NjA5QTg4RSwgMHhFMTBFOTgxOCwgMHg3RjZBMERCQiwgMHgwODZEM0QyRCwKKyAgICAgICAgMHg5MTY0NkM5NywgMHhFNjYzNUMwMSwgMHg2QjZCNTFGNCwgMHgxQzZDNjE2MiwgMHg4NTY1MzBEOCwgMHhGMjYyMDA0RSwKKyAgICAgICAgMHg2QzA2OTVFRCwgMHgxQjAxQTU3QiwgMHg4MjA4RjRDMSwgMHhGNTBGQzQ1NywgMHg2NUIwRDlDNiwgMHgxMkI3RTk1MCwKKyAgICAgICAgMHg4QkJFQjhFQSwgMHhGQ0I5ODg3QywgMHg2MkREMURERiwgMHgxNURBMkQ0OSwgMHg4Q0QzN0NGMywgMHhGQkQ0NEM2NSwKKyAgICAgICAgMHg0REIyNjE1OCwgMHgzQUI1NTFDRSwgMHhBM0JDMDA3NCwgMHhENEJCMzBFMiwgMHg0QURGQTU0MSwgMHgzREQ4OTVENywKKyAgICAgICAgMHhBNEQxQzQ2RCwgMHhEM0Q2RjRGQiwgMHg0MzY5RTk2QSwgMHgzNDZFRDlGQywgMHhBRDY3ODg0NiwgMHhEQTYwQjhEMCwKKyAgICAgICAgMHg0NDA0MkQ3MywgMHgzMzAzMURFNSwgMHhBQTBBNEM1RiwgMHhERDBEN0NDOSwgMHg1MDA1NzEzQywgMHgyNzAyNDFBQSwKKyAgICAgICAgMHhCRTBCMTAxMCwgMHhDOTBDMjA4NiwgMHg1NzY4QjUyNSwgMHgyMDZGODVCMywgMHhCOTY2RDQwOSwgMHhDRTYxRTQ5RiwKKyAgICAgICAgMHg1RURFRjkwRSwgMHgyOUQ5Qzk5OCwgMHhCMEQwOTgyMiwgMHhDN0Q3QThCNCwgMHg1OUIzM0QxNywgMHgyRUI0MEQ4MSwKKyAgICAgICAgMHhCN0JENUMzQiwgMHhDMEJBNkNBRCwgMHhFREI4ODMyMCwgMHg5QUJGQjNCNiwgMHgwM0I2RTIwQywgMHg3NEIxRDI5QSwKKyAgICAgICAgMHhFQUQ1NDczOSwgMHg5REQyNzdBRiwgMHgwNERCMjYxNSwgMHg3M0RDMTY4MywgMHhFMzYzMEIxMiwgMHg5NDY0M0I4NCwKKyAgICAgICAgMHgwRDZENkEzRSwgMHg3QTZBNUFBOCwgMHhFNDBFQ0YwQiwgMHg5MzA5RkY5RCwgMHgwQTAwQUUyNywgMHg3RDA3OUVCMSwKKyAgICAgICAgMHhGMDBGOTM0NCwgMHg4NzA4QTNEMiwgMHgxRTAxRjI2OCwgMHg2OTA2QzJGRSwgMHhGNzYyNTc1RCwgMHg4MDY1NjdDQiwKKyAgICAgICAgMHgxOTZDMzY3MSwgMHg2RTZCMDZFNywgMHhGRUQ0MUI3NiwgMHg4OUQzMkJFMCwgMHgxMERBN0E1QSwgMHg2N0RENEFDQywKKyAgICAgICAgMHhGOUI5REY2RiwgMHg4RUJFRUZGOSwgMHgxN0I3QkU0MywgMHg2MEIwOEVENSwgMHhENkQ2QTNFOCwgMHhBMUQxOTM3RSwKKyAgICAgICAgMHgzOEQ4QzJDNCwgMHg0RkRGRjI1MiwgMHhEMUJCNjdGMSwgMHhBNkJDNTc2NywgMHgzRkI1MDZERCwgMHg0OEIyMzY0QiwKKyAgICAgICAgMHhEODBEMkJEQSwgMHhBRjBBMUI0QywgMHgzNjAzNEFGNiwgMHg0MTA0N0E2MCwgMHhERjYwRUZDMywgMHhBODY3REY1NSwKKyAgICAgICAgMHgzMTZFOEVFRiwgMHg0NjY5QkU3OSwgMHhDQjYxQjM4QywgMHhCQzY2ODMxQSwgMHgyNTZGRDJBMCwgMHg1MjY4RTIzNiwKKyAgICAgICAgMHhDQzBDNzc5NSwgMHhCQjBCNDcwMywgMHgyMjAyMTZCOSwgMHg1NTA1MjYyRiwgMHhDNUJBM0JCRSwgMHhCMkJEMEIyOCwKKyAgICAgICAgMHgyQkI0NUE5MiwgMHg1Q0IzNkEwNCwgMHhDMkQ3RkZBNywgMHhCNUQwQ0YzMSwgMHgyQ0Q5OUU4QiwgMHg1QkRFQUUxRCwKKyAgICAgICAgMHg5QjY0QzJCMCwgMHhFQzYzRjIyNiwgMHg3NTZBQTM5QywgMHgwMjZEOTMwQSwgMHg5QzA5MDZBOSwgMHhFQjBFMzYzRiwKKyAgICAgICAgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywgMHg5NUJGNEE4MiwgMHhFMkI4N0ExNCwgMHg3QkIxMkJBRSwgMHgwQ0I2MUIzOCwKKyAgICAgICAgMHg5MkQyOEU5QiwgMHhFNUQ1QkUwRCwgMHg3Q0RDRUZCNywgMHgwQkRCREYyMSwgMHg4NkQzRDJENCwgMHhGMUQ0RTI0MiwKKyAgICAgICAgMHg2OEREQjNGOCwgMHgxRkRBODM2RSwgMHg4MUJFMTZDRCwgMHhGNkI5MjY1QiwgMHg2RkIwNzdFMSwgMHgxOEI3NDc3NywKKyAgICAgICAgMHg4ODA4NUFFNiwgMHhGRjBGNkE3MCwgMHg2NjA2M0JDQSwgMHgxMTAxMEI1QywgMHg4RjY1OUVGRiwgMHhGODYyQUU2OSwKKyAgICAgICAgMHg2MTZCRkZEMywgMHgxNjZDQ0Y0NSwgMHhBMDBBRTI3OCwgMHhENzBERDJFRSwgMHg0RTA0ODM1NCwgMHgzOTAzQjNDMiwKKyAgICAgICAgMHhBNzY3MjY2MSwgMHhEMDYwMTZGNywgMHg0OTY5NDc0RCwgMHgzRTZFNzdEQiwgMHhBRUQxNkE0QSwgMHhEOUQ2NUFEQywKKyAgICAgICAgMHg0MERGMEI2NiwgMHgzN0Q4M0JGMCwgMHhBOUJDQUU1MywgMHhERUJCOUVDNSwgMHg0N0IyQ0Y3RiwgMHgzMEI1RkZFOSwKKyAgICAgICAgMHhCREJERjIxQywgMHhDQUJBQzI4QSwgMHg1M0IzOTMzMCwgMHgyNEI0QTNBNiwgMHhCQUQwMzYwNSwgMHhDREQ3MDY5MywKKyAgICAgICAgMHg1NERFNTcyOSwgMHgyM0Q5NjdCRiwgMHhCMzY2N0EyRSwgMHhDNDYxNEFCOCwgMHg1RDY4MUIwMiwgMHgyQTZGMkI5NCwKKyAgICAgICAgMHhCNDBCQkUzNywgMHhDMzBDOEVBMSwgMHg1QTA1REYxQiwgMHgyRDAyRUY4RCwgMHgwMDAwMDAwMQorICAgIH0sCisgICAgW0FWX0NSQ18xNl9BTlNJX0xFXSA9IHsKKyAgICAgICAgMHgwMDAwLCAweEMwQzEsIDB4QzE4MSwgMHgwMTQwLCAweEMzMDEsIDB4MDNDMCwgMHgwMjgwLCAweEMyNDEsCisgICAgICAgIDB4QzYwMSwgMHgwNkMwLCAweDA3ODAsIDB4Qzc0MSwgMHgwNTAwLCAweEM1QzEsIDB4QzQ4MSwgMHgwNDQwLAorICAgICAgICAweENDMDEsIDB4MENDMCwgMHgwRDgwLCAweENENDEsIDB4MEYwMCwgMHhDRkMxLCAweENFODEsIDB4MEU0MCwKKyAgICAgICAgMHgwQTAwLCAweENBQzEsIDB4Q0I4MSwgMHgwQjQwLCAweEM5MDEsIDB4MDlDMCwgMHgwODgwLCAweEM4NDEsCisgICAgICAgIDB4RDgwMSwgMHgxOEMwLCAweDE5ODAsIDB4RDk0MSwgMHgxQjAwLCAweERCQzEsIDB4REE4MSwgMHgxQTQwLAorICAgICAgICAweDFFMDAsIDB4REVDMSwgMHhERjgxLCAweDFGNDAsIDB4REQwMSwgMHgxREMwLCAweDFDODAsIDB4REM0MSwKKyAgICAgICAgMHgxNDAwLCAweEQ0QzEsIDB4RDU4MSwgMHgxNTQwLCAweEQ3MDEsIDB4MTdDMCwgMHgxNjgwLCAweEQ2NDEsCisgICAgICAgIDB4RDIwMSwgMHgxMkMwLCAweDEzODAsIDB4RDM0MSwgMHgxMTAwLCAweEQxQzEsIDB4RDA4MSwgMHgxMDQwLAorICAgICAgICAweEYwMDEsIDB4MzBDMCwgMHgzMTgwLCAweEYxNDEsIDB4MzMwMCwgMHhGM0MxLCAweEYyODEsIDB4MzI0MCwKKyAgICAgICAgMHgzNjAwLCAweEY2QzEsIDB4Rjc4MSwgMHgzNzQwLCAweEY1MDEsIDB4MzVDMCwgMHgzNDgwLCAweEY0NDEsCisgICAgICAgIDB4M0MwMCwgMHhGQ0MxLCAweEZEODEsIDB4M0Q0MCwgMHhGRjAxLCAweDNGQzAsIDB4M0U4MCwgMHhGRTQxLAorICAgICAgICAweEZBMDEsIDB4M0FDMCwgMHgzQjgwLCAweEZCNDEsIDB4MzkwMCwgMHhGOUMxLCAweEY4ODEsIDB4Mzg0MCwKKyAgICAgICAgMHgyODAwLCAweEU4QzEsIDB4RTk4MSwgMHgyOTQwLCAweEVCMDEsIDB4MkJDMCwgMHgyQTgwLCAweEVBNDEsCisgICAgICAgIDB4RUUwMSwgMHgyRUMwLCAweDJGODAsIDB4RUY0MSwgMHgyRDAwLCAweEVEQzEsIDB4RUM4MSwgMHgyQzQwLAorICAgICAgICAweEU0MDEsIDB4MjRDMCwgMHgyNTgwLCAweEU1NDEsIDB4MjcwMCwgMHhFN0MxLCAweEU2ODEsIDB4MjY0MCwKKyAgICAgICAgMHgyMjAwLCAweEUyQzEsIDB4RTM4MSwgMHgyMzQwLCAweEUxMDEsIDB4MjFDMCwgMHgyMDgwLCAweEUwNDEsCisgICAgICAgIDB4QTAwMSwgMHg2MEMwLCAweDYxODAsIDB4QTE0MSwgMHg2MzAwLCAweEEzQzEsIDB4QTI4MSwgMHg2MjQwLAorICAgICAgICAweDY2MDAsIDB4QTZDMSwgMHhBNzgxLCAweDY3NDAsIDB4QTUwMSwgMHg2NUMwLCAweDY0ODAsIDB4QTQ0MSwKKyAgICAgICAgMHg2QzAwLCAweEFDQzEsIDB4QUQ4MSwgMHg2RDQwLCAweEFGMDEsIDB4NkZDMCwgMHg2RTgwLCAweEFFNDEsCisgICAgICAgIDB4QUEwMSwgMHg2QUMwLCAweDZCODAsIDB4QUI0MSwgMHg2OTAwLCAweEE5QzEsIDB4QTg4MSwgMHg2ODQwLAorICAgICAgICAweDc4MDAsIDB4QjhDMSwgMHhCOTgxLCAweDc5NDAsIDB4QkIwMSwgMHg3QkMwLCAweDdBODAsIDB4QkE0MSwKKyAgICAgICAgMHhCRTAxLCAweDdFQzAsIDB4N0Y4MCwgMHhCRjQxLCAweDdEMDAsIDB4QkRDMSwgMHhCQzgxLCAweDdDNDAsCisgICAgICAgIDB4QjQwMSwgMHg3NEMwLCAweDc1ODAsIDB4QjU0MSwgMHg3NzAwLCAweEI3QzEsIDB4QjY4MSwgMHg3NjQwLAorICAgICAgICAweDcyMDAsIDB4QjJDMSwgMHhCMzgxLCAweDczNDAsIDB4QjEwMSwgMHg3MUMwLCAweDcwODAsIDB4QjA0MSwKKyAgICAgICAgMHg1MDAwLCAweDkwQzEsIDB4OTE4MSwgMHg1MTQwLCAweDkzMDEsIDB4NTNDMCwgMHg1MjgwLCAweDkyNDEsCisgICAgICAgIDB4OTYwMSwgMHg1NkMwLCAweDU3ODAsIDB4OTc0MSwgMHg1NTAwLCAweDk1QzEsIDB4OTQ4MSwgMHg1NDQwLAorICAgICAgICAweDlDMDEsIDB4NUNDMCwgMHg1RDgwLCAweDlENDEsIDB4NUYwMCwgMHg5RkMxLCAweDlFODEsIDB4NUU0MCwKKyAgICAgICAgMHg1QTAwLCAweDlBQzEsIDB4OUI4MSwgMHg1QjQwLCAweDk5MDEsIDB4NTlDMCwgMHg1ODgwLCAweDk4NDEsCisgICAgICAgIDB4ODgwMSwgMHg0OEMwLCAweDQ5ODAsIDB4ODk0MSwgMHg0QjAwLCAweDhCQzEsIDB4OEE4MSwgMHg0QTQwLAorICAgICAgICAweDRFMDAsIDB4OEVDMSwgMHg4RjgxLCAweDRGNDAsIDB4OEQwMSwgMHg0REMwLCAweDRDODAsIDB4OEM0MSwKKyAgICAgICAgMHg0NDAwLCAweDg0QzEsIDB4ODU4MSwgMHg0NTQwLCAweDg3MDEsIDB4NDdDMCwgMHg0NjgwLCAweDg2NDEsCisgICAgICAgIDB4ODIwMSwgMHg0MkMwLCAweDQzODAsIDB4ODM0MSwgMHg0MTAwLCAweDgxQzEsIDB4ODA4MSwgMHg0MDQwLAorICAgICAgICAweDAwMDEKKyAgICB9LAorfTsKKyNlbHNlCisjaWYgQ09ORklHX1NNQUxMCisjZGVmaW5lIENSQ19UQUJMRV9TSVpFIDI1NworI2Vsc2UKKyNkZWZpbmUgQ1JDX1RBQkxFX1NJWkUgMTAyNAorI2VuZGlmCitzdGF0aWMgc3RydWN0IHsKKyAgICB1aW50OF90ICBsZTsKKyAgICB1aW50OF90ICBiaXRzOworICAgIHVpbnQzMl90IHBvbHk7Cit9IGF2X2NyY190YWJsZV9wYXJhbXNbQVZfQ1JDX01BWF0gPSB7CisgICAgW0FWX0NSQ184X0FUTV0gICAgICA9IHsgMCwgIDgsICAgICAgIDB4MDcgfSwKKyAgICBbQVZfQ1JDXzE2X0FOU0ldICAgID0geyAwLCAxNiwgICAgIDB4ODAwNSB9LAorICAgIFtBVl9DUkNfMTZfQ0NJVFRdICAgPSB7IDAsIDE2LCAgICAgMHgxMDIxIH0sCisgICAgW0FWX0NSQ18yNF9JRUVFXSAgICA9IHsgMCwgMjQsICAgMHg4NjRDRkIgfSwKKyAgICBbQVZfQ1JDXzMyX0lFRUVdICAgID0geyAwLCAzMiwgMHgwNEMxMURCNyB9LAorICAgIFtBVl9DUkNfMzJfSUVFRV9MRV0gPSB7IDEsIDMyLCAweEVEQjg4MzIwIH0sCisgICAgW0FWX0NSQ18xNl9BTlNJX0xFXSA9IHsgMSwgMTYsICAgICAweEEwMDEgfSwKK307CitzdGF0aWMgQVZDUkMgYXZfY3JjX3RhYmxlW0FWX0NSQ19NQVhdW0NSQ19UQUJMRV9TSVpFXTsKKyNlbmRpZgorCitpbnQgYXZfY3JjX2luaXQoQVZDUkMgKmN0eCwgaW50IGxlLCBpbnQgYml0cywgdWludDMyX3QgcG9seSwgaW50IGN0eF9zaXplKQoreworICAgIHVuc2lnbmVkIGksIGo7CisgICAgdWludDMyX3QgYzsKKworICAgIGlmIChiaXRzIDwgOCB8fCBiaXRzID4gMzIgfHwgcG9seSA+PSAoMUxMIDw8IGJpdHMpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGN0eF9zaXplICE9IHNpemVvZihBVkNSQykgKiAyNTcgJiYgY3R4X3NpemUgIT0gc2l6ZW9mKEFWQ1JDKSAqIDEwMjQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBpZiAobGUpIHsKKyAgICAgICAgICAgIGZvciAoYyA9IGksIGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgICAgIGMgPSAoYyA+PiAxKSBeIChwb2x5ICYgKC0oYyAmIDEpKSk7CisgICAgICAgICAgICBjdHhbaV0gPSBjOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChjID0gaSA8PCAyNCwgaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICAgICAgYyA9IChjIDw8IDEpIF4gKChwb2x5IDw8ICgzMiAtIGJpdHMpKSAmICgoKGludDMyX3QpIGMpID4+IDMxKSk7CisgICAgICAgICAgICBjdHhbaV0gPSBhdl9ic3dhcDMyKGMpOworICAgICAgICB9CisgICAgfQorICAgIGN0eFsyNTZdID0gMTsKKyNpZiAhQ09ORklHX1NNQUxMCisgICAgaWYgKGN0eF9zaXplID49IHNpemVvZihBVkNSQykgKiAxMDI0KQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgICAgIGN0eFsyNTYgKihqICsgMSkgKyBpXSA9CisgICAgICAgICAgICAgICAgICAgIChjdHhbMjU2ICogaiArIGldID4+IDgpIF4gY3R4W2N0eFsyNTYgKiBqICsgaV0gJiAweEZGXTsKKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IEFWQ1JDICphdl9jcmNfZ2V0X3RhYmxlKEFWQ1JDSWQgY3JjX2lkKQoreworI2lmICFDT05GSUdfSEFSRENPREVEX1RBQkxFUworICAgIGlmICghYXZfY3JjX3RhYmxlW2NyY19pZF1bRkZfQVJSQVlfRUxFTVMoYXZfY3JjX3RhYmxlW2NyY19pZF0pIC0gMV0pCisgICAgICAgIGlmIChhdl9jcmNfaW5pdChhdl9jcmNfdGFibGVbY3JjX2lkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2NyY190YWJsZV9wYXJhbXNbY3JjX2lkXS5sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2NyY190YWJsZV9wYXJhbXNbY3JjX2lkXS5iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgYXZfY3JjX3RhYmxlX3BhcmFtc1tjcmNfaWRdLnBvbHksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXZfY3JjX3RhYmxlW2NyY19pZF0pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIHJldHVybiBhdl9jcmNfdGFibGVbY3JjX2lkXTsKK30KKwordWludDMyX3QgYXZfY3JjKGNvbnN0IEFWQ1JDICpjdHgsIHVpbnQzMl90IGNyYywKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisgICAgY29uc3QgdWludDhfdCAqZW5kID0gYnVmZmVyICsgbGVuZ3RoOworCisjaWYgIUNPTkZJR19TTUFMTAorICAgIGlmICghY3R4WzI1Nl0pIHsKKyAgICAgICAgd2hpbGUgKCgoaW50cHRyX3QpIGJ1ZmZlciAmIDMpICYmIGJ1ZmZlciA8IGVuZCkKKyAgICAgICAgICAgIGNyYyA9IGN0eFsoKHVpbnQ4X3QpIGNyYykgXiAqYnVmZmVyKytdIF4gKGNyYyA+PiA4KTsKKworICAgICAgICB3aGlsZSAoYnVmZmVyIDwgZW5kIC0gMykgeworICAgICAgICAgICAgY3JjIF49IGF2X2xlMm5lMzIoKihjb25zdCB1aW50MzJfdCAqKSBidWZmZXIpOyBidWZmZXIgKz0gNDsKKyAgICAgICAgICAgIGNyYyA9IGN0eFszICogMjU2ICsgKCBjcmMgICAgICAgICYgMHhGRildIF4KKyAgICAgICAgICAgICAgICAgIGN0eFsyICogMjU2ICsgKChjcmMgPj4gOCApICYgMHhGRildIF4KKyAgICAgICAgICAgICAgICAgIGN0eFsxICogMjU2ICsgKChjcmMgPj4gMTYpICYgMHhGRildIF4KKyAgICAgICAgICAgICAgICAgIGN0eFswICogMjU2ICsgKChjcmMgPj4gMjQpICAgICAgICldOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgd2hpbGUgKGJ1ZmZlciA8IGVuZCkKKyAgICAgICAgY3JjID0gY3R4WygodWludDhfdCkgY3JjKSBeICpidWZmZXIrK10gXiAoY3JjID4+IDgpOworCisgICAgcmV0dXJuIGNyYzsKK30KKworI2lmZGVmIFRFU1QKK2ludCBtYWluKHZvaWQpCit7CisgICAgdWludDhfdCBidWZbMTk5OV07CisgICAgaW50IGk7CisgICAgaW50IHBbNl1bM10gPSB7IHsgQVZfQ1JDXzMyX0lFRUVfTEUsIDB4RURCODgzMjAsIDB4M0Q1Q0REMDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyBBVl9DUkNfMzJfSUVFRSAgICwgMHgwNEMxMURCNywgMHhDMEY1QkFFMCB9LAorICAgICAgICAgICAgICAgICAgICB7IEFWX0NSQ18yNF9JRUVFICAgLCAweDg2NENGQiAgLCAweEI3MDRDRSAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsgQVZfQ1JDXzE2X0FOU0lfTEUsIDB4QTAwMSAgICAsIDB4QkZEOCAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyBBVl9DUkNfMTZfQU5TSSAgICwgMHg4MDA1ICAgICwgMHgxRkJCICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7IEFWX0NSQ184X0FUTSAgICAgLCAweDA3ICAgICAgLCAweEUzICAgICAgIH0KKyAgICB9OworICAgIGNvbnN0IEFWQ1JDICpjdHg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1Zik7IGkrKykKKyAgICAgICAgYnVmW2ldID0gaSArIGkgKiBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICBjdHggPSBhdl9jcmNfZ2V0X3RhYmxlKHBbaV1bMF0pOworICAgICAgICBwcmludGYoImNyYyAlMDhYID0gJVhcbiIsIHBbaV1bMV0sIGF2X2NyYyhjdHgsIDAsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvY3JjLmggYi9mZm1wZWcvbGliYXZ1dGlsL2NyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NmJmMWQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2NyYy5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfQ1JDX0gKKyNkZWZpbmUgQVZVVElMX0NSQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisKKy8qKgorICogQGRlZmdyb3VwIGxhdnVfY3JjMzIgQ1JDMzIKKyAqIEBpbmdyb3VwIGxhdnVfY3J5cHRvCisgKiBAeworICovCisKK3R5cGVkZWYgdWludDMyX3QgQVZDUkM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQVZfQ1JDXzhfQVRNLAorICAgIEFWX0NSQ18xNl9BTlNJLAorICAgIEFWX0NSQ18xNl9DQ0lUVCwKKyAgICBBVl9DUkNfMzJfSUVFRSwKKyAgICBBVl9DUkNfMzJfSUVFRV9MRSwgIC8qPCByZXZlcnNlZCBiaXRvcmRlciB2ZXJzaW9uIG9mIEFWX0NSQ18zMl9JRUVFICovCisgICAgQVZfQ1JDXzE2X0FOU0lfTEUsICAvKjwgcmV2ZXJzZWQgYml0b3JkZXIgdmVyc2lvbiBvZiBBVl9DUkNfMTZfQU5TSSAqLworICAgIEFWX0NSQ18yNF9JRUVFID0gMTIsCisgICAgQVZfQ1JDX01BWCwgICAgICAgICAvKjwgTm90IHBhcnQgb2YgcHVibGljIEFQSSEgRG8gbm90IHVzZSBvdXRzaWRlIGxpYmF2dXRpbC4gKi8KK31BVkNSQ0lkOworCisvKioKKyAqIEluaXRpYWxpemUgYSBDUkMgdGFibGUuCisgKiBAcGFyYW0gY3R4IG11c3QgYmUgYW4gYXJyYXkgb2Ygc2l6ZSBzaXplb2YoQVZDUkMpKjI1NyBvciBzaXplb2YoQVZDUkMpKjEwMjQKKyAqIEBwYXJhbSBsZSBJZiAxLCB0aGUgbG93ZXN0IGJpdCByZXByZXNlbnRzIHRoZSBjb2VmZmljaWVudCBmb3IgdGhlIGhpZ2hlc3QKKyAqICAgICAgICAgICBleHBvbmVudCBvZiB0aGUgY29ycmVzcG9uZGluZyBwb2x5bm9taWFsIChib3RoIGZvciBwb2x5IGFuZAorICogICAgICAgICAgIGFjdHVhbCBDUkMpLgorICogICAgICAgICAgIElmIDAsIHlvdSBtdXN0IHN3YXAgdGhlIENSQyBwYXJhbWV0ZXIgYW5kIHRoZSByZXN1bHQgb2YgYXZfY3JjCisgKiAgICAgICAgICAgaWYgeW91IG5lZWQgdGhlIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uIChjYW4gYmUgc2ltcGxpZmllZCBpbgorICogICAgICAgICAgIG1vc3QgY2FzZXMgdG8gZS5nLiBic3dhcDE2KToKKyAqICAgICAgICAgICBhdl9ic3dhcDMyKGNyYyA8PCAoMzItYml0cykpCisgKiBAcGFyYW0gYml0cyBudW1iZXIgb2YgYml0cyBmb3IgdGhlIENSQworICogQHBhcmFtIHBvbHkgZ2VuZXJhdG9yIHBvbHlub21pYWwgd2l0aG91dCB0aGUgeCoqYml0cyBjb2VmZmljaWVudCwgaW4gdGhlCisgKiAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBhcyBzcGVjaWZpZWQgYnkgbGUKKyAqIEBwYXJhbSBjdHhfc2l6ZSBzaXplIG9mIGN0eCBpbiBieXRlcworICogQHJldHVybiA8MCBvbiBmYWlsdXJlCisgKi8KK2ludCBhdl9jcmNfaW5pdChBVkNSQyAqY3R4LCBpbnQgbGUsIGludCBiaXRzLCB1aW50MzJfdCBwb2x5LCBpbnQgY3R4X3NpemUpOworCisvKioKKyAqIEdldCBhbiBpbml0aWFsaXplZCBzdGFuZGFyZCBDUkMgdGFibGUuCisgKiBAcGFyYW0gY3JjX2lkIElEIG9mIGEgc3RhbmRhcmQgQ1JDCisgKiBAcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgQ1JDIHRhYmxlIG9yIE5VTEwgb24gZmFpbHVyZQorICovCitjb25zdCBBVkNSQyAqYXZfY3JjX2dldF90YWJsZShBVkNSQ0lkIGNyY19pZCk7CisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSBDUkMgb2YgYSBibG9jay4KKyAqIEBwYXJhbSBjcmMgQ1JDIG9mIHByZXZpb3VzIGJsb2NrcyBpZiBhbnkgb3IgaW5pdGlhbCB2YWx1ZSBmb3IgQ1JDCisgKiBAcmV0dXJuIENSQyB1cGRhdGVkIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gYmxvY2sKKyAqCisgKiBAc2VlIGF2X2NyY19pbml0KCkgImxlIiBwYXJhbWV0ZXIKKyAqLwordWludDMyX3QgYXZfY3JjKGNvbnN0IEFWQ1JDICpjdHgsIHVpbnQzMl90IGNyYywKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpIGF2X3B1cmU7CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZVVElMX0NSQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2Rlcy5jIGIvZmZtcGVnL2xpYmF2dXRpbC9kZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2FkMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9kZXMuYwpAQCAtMCwwICsxLDQ0MyBAQAorLyoKKyAqIERFUyBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNyBSZWltYXIgRG9lZmZpbmdlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSAiYXZ1dGlsLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiZGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IEFWREVTIEFWREVTOworCisjZGVmaW5lIFQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgNjQtYSw2NC1iLDY0LWMsNjQtZCw2NC1lLDY0LWYsNjQtZyw2NC1oCitzdGF0aWMgY29uc3QgdWludDhfdCBJUF9zaHVmZmxlW10gPSB7CisgICAgVCg1OCwgNTAsIDQyLCAzNCwgMjYsIDE4LCAxMCwgMiksCisgICAgVCg2MCwgNTIsIDQ0LCAzNiwgMjgsIDIwLCAxMiwgNCksCisgICAgVCg2MiwgNTQsIDQ2LCAzOCwgMzAsIDIyLCAxNCwgNiksCisgICAgVCg2NCwgNTYsIDQ4LCA0MCwgMzIsIDI0LCAxNiwgOCksCisgICAgVCg1NywgNDksIDQxLCAzMywgMjUsIDE3LCAgOSwgMSksCisgICAgVCg1OSwgNTEsIDQzLCAzNSwgMjcsIDE5LCAxMSwgMyksCisgICAgVCg2MSwgNTMsIDQ1LCAzNywgMjksIDIxLCAxMywgNSksCisgICAgVCg2MywgNTUsIDQ3LCAzOSwgMzEsIDIzLCAxNSwgNykKK307CisjdW5kZWYgVAorCisjaWYgQ09ORklHX1NNQUxMIHx8IGRlZmluZWQoR0VOVEFCTEVTKQorI2RlZmluZSBUKGEsIGIsIGMsIGQpIDMyLWEsMzItYiwzMi1jLDMyLWQKK3N0YXRpYyBjb25zdCB1aW50OF90IFBfc2h1ZmZsZVtdID0geworICAgIFQoMTYsICA3LCAyMCwgMjEpLAorICAgIFQoMjksIDEyLCAyOCwgMTcpLAorICAgIFQoIDEsIDE1LCAyMywgMjYpLAorICAgIFQoIDUsIDE4LCAzMSwgMTApLAorICAgIFQoIDIsICA4LCAyNCwgMTQpLAorICAgIFQoMzIsIDI3LCAgMywgIDkpLAorICAgIFQoMTksIDEzLCAzMCwgIDYpLAorICAgIFQoMjIsIDExLCAgNCwgMjUpCit9OworI3VuZGVmIFQKKyNlbmRpZgorCisjZGVmaW5lIFQoYSwgYiwgYywgZCwgZSwgZiwgZykgNjQtYSw2NC1iLDY0LWMsNjQtZCw2NC1lLDY0LWYsNjQtZworc3RhdGljIGNvbnN0IHVpbnQ4X3QgUEMxX3NodWZmbGVbXSA9IHsKKyAgICBUKDU3LCA0OSwgNDEsIDMzLCAyNSwgMTcsICA5KSwKKyAgICBUKCAxLCA1OCwgNTAsIDQyLCAzNCwgMjYsIDE4KSwKKyAgICBUKDEwLCAgMiwgNTksIDUxLCA0MywgMzUsIDI3KSwKKyAgICBUKDE5LCAxMSwgIDMsIDYwLCA1MiwgNDQsIDM2KSwKKyAgICBUKDYzLCA1NSwgNDcsIDM5LCAzMSwgMjMsIDE1KSwKKyAgICBUKCA3LCA2MiwgNTQsIDQ2LCAzOCwgMzAsIDIyKSwKKyAgICBUKDE0LCAgNiwgNjEsIDUzLCA0NSwgMzcsIDI5KSwKKyAgICBUKDIxLCAxMywgIDUsIDI4LCAyMCwgMTIsICA0KQorfTsKKyN1bmRlZiBUCisKKyNkZWZpbmUgVChhLCBiLCBjLCBkLCBlLCBmKSA1Ni1hLDU2LWIsNTYtYyw1Ni1kLDU2LWUsNTYtZgorc3RhdGljIGNvbnN0IHVpbnQ4X3QgUEMyX3NodWZmbGVbXSA9IHsKKyAgICBUKDE0LCAxNywgMTEsIDI0LCAgMSwgIDUpLAorICAgIFQoIDMsIDI4LCAxNSwgIDYsIDIxLCAxMCksCisgICAgVCgyMywgMTksIDEyLCAgNCwgMjYsICA4KSwKKyAgICBUKDE2LCAgNywgMjcsIDIwLCAxMywgIDIpLAorICAgIFQoNDEsIDUyLCAzMSwgMzcsIDQ3LCA1NSksCisgICAgVCgzMCwgNDAsIDUxLCA0NSwgMzMsIDQ4KSwKKyAgICBUKDQ0LCA0OSwgMzksIDU2LCAzNCwgNTMpLAorICAgIFQoNDYsIDQyLCA1MCwgMzYsIDI5LCAzMikKK307CisjdW5kZWYgVAorCisjaWYgQ09ORklHX1NNQUxMCitzdGF0aWMgY29uc3QgdWludDhfdCBTX2JveGVzWzhdWzMyXSA9IHsKKyAgICB7CisgICAgMHgwZSwgMHhmNCwgMHg3ZCwgMHg0MSwgMHhlMiwgMHgyZiwgMHhkYiwgMHgxOCwgMHhhMywgMHg2YSwgMHhjNiwgMHhiYywgMHg5NSwgMHg1OSwgMHgzMCwgMHg4NywKKyAgICAweGY0LCAweGMxLCAweDhlLCAweDI4LCAweDRkLCAweDk2LCAweDEyLCAweDdiLCAweDVmLCAweGJjLCAweDM5LCAweGU3LCAweGEzLCAweDBhLCAweDY1LCAweGQwLAorICAgIH0sIHsKKyAgICAweDNmLCAweGQxLCAweDQ4LCAweDdlLCAweGY2LCAweDJiLCAweDgzLCAweGU0LCAweGM5LCAweDA3LCAweDEyLCAweGFkLCAweDZjLCAweDkwLCAweGI1LCAweDVhLAorICAgIDB4ZDAsIDB4OGUsIDB4YTcsIDB4MWIsIDB4M2EsIDB4ZjQsIDB4NGQsIDB4MjEsIDB4YjUsIDB4NjgsIDB4N2MsIDB4YzYsIDB4MDksIDB4NTMsIDB4ZTIsIDB4OWYsCisgICAgfSwgeworICAgIDB4ZGEsIDB4NzAsIDB4MDksIDB4OWUsIDB4MzYsIDB4NDMsIDB4NmYsIDB4YTUsIDB4MjEsIDB4OGQsIDB4NWMsIDB4ZTcsIDB4Y2IsIDB4YjQsIDB4ZjIsIDB4MTgsCisgICAgMHgxZCwgMHhhNiwgMHhkNCwgMHgwOSwgMHg2OCwgMHg5ZiwgMHg4MywgMHg3MCwgMHg0YiwgMHhmMSwgMHhlMiwgMHgzYywgMHhiNSwgMHg1YSwgMHgyZSwgMHhjNywKKyAgICB9LCB7CisgICAgMHhkNywgMHg4ZCwgMHhiZSwgMHg1MywgMHg2MCwgMHhmNiwgMHgwOSwgMHgzYSwgMHg0MSwgMHg3MiwgMHgyOCwgMHhjNSwgMHgxYiwgMHhhYywgMHhlNCwgMHg5ZiwKKyAgICAweDNhLCAweGY2LCAweDA5LCAweDYwLCAweGFjLCAweDFiLCAweGQ3LCAweDhkLCAweDlmLCAweDQxLCAweDUzLCAweGJlLCAweGM1LCAweDcyLCAweDI4LCAweGU0LAorICAgIH0sIHsKKyAgICAweGUyLCAweGJjLCAweDI0LCAweGMxLCAweDQ3LCAweDdhLCAweGRiLCAweDE2LCAweDU4LCAweDA1LCAweGYzLCAweGFmLCAweDNkLCAweDkwLCAweDhlLCAweDY5LAorICAgIDB4YjQsIDB4ODIsIDB4YzEsIDB4N2IsIDB4MWEsIDB4ZWQsIDB4MjcsIDB4ZDgsIDB4NmYsIDB4ZjksIDB4MGMsIDB4OTUsIDB4YTYsIDB4NDMsIDB4NTAsIDB4M2UsCisgICAgfSwgeworICAgIDB4YWMsIDB4ZjEsIDB4NGEsIDB4MmYsIDB4NzksIDB4YzIsIDB4OTYsIDB4NTgsIDB4NjAsIDB4MWQsIDB4ZDMsIDB4ZTQsIDB4MGUsIDB4YjcsIDB4MzUsIDB4OGIsCisgICAgMHg0OSwgMHgzZSwgMHgyZiwgMHhjNSwgMHg5MiwgMHg1OCwgMHhmYywgMHhhMywgMHhiNywgMHhlMCwgMHgxNCwgMHg3YSwgMHg2MSwgMHgwZCwgMHg4YiwgMHhkNiwKKyAgICB9LCB7CisgICAgMHhkNCwgMHgwYiwgMHhiMiwgMHg3ZSwgMHg0ZiwgMHg5MCwgMHgxOCwgMHhhZCwgMHhlMywgMHgzYywgMHg1OSwgMHhjNywgMHgyNSwgMHhmYSwgMHg4NiwgMHg2MSwKKyAgICAweDYxLCAweGI0LCAweGRiLCAweDhkLCAweDFjLCAweDQzLCAweGE3LCAweDdlLCAweDlhLCAweDVmLCAweDA2LCAweGY4LCAweGUwLCAweDI1LCAweDM5LCAweGMyLAorICAgIH0sIHsKKyAgICAweDFkLCAweGYyLCAweGQ4LCAweDg0LCAweGE2LCAweDNmLCAweDdiLCAweDQxLCAweGNhLCAweDU5LCAweDYzLCAweGJlLCAweDA1LCAweGUwLCAweDljLCAweDI3LAorICAgIDB4MjcsIDB4MWIsIDB4ZTQsIDB4NzEsIDB4NDksIDB4YWMsIDB4OGUsIDB4ZDIsIDB4ZjAsIDB4YzYsIDB4OWEsIDB4MGQsIDB4M2YsIDB4NTMsIDB4NjUsIDB4YjgsCisgICAgfQorfTsKKyNlbHNlCisvKioKKyAqIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgYm90aCB0aGUgUy1ib3ggYW5kIFAtc2h1ZmZsZS4KKyAqIEl0IGNhbiBiZSByZWdlbmVyYXRlZCBieSBjb21waWxpbmcgdGhpcyBmaWxlIHdpdGggLURDT05GSUdfU01BTEwgLURURVNUIC1ER0VOVEFCTEVTCisgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBTX2JveGVzX1Bfc2h1ZmZsZVs4XVs2NF0gPSB7CisgICAgeworICAgIDB4MDA4MDgyMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDgwMDAsIDB4MDA4MDgyMDIsIDB4MDA4MDgwMDIsIDB4MDAwMDgyMDIsIDB4MDAwMDAwMDIsIDB4MDAwMDgwMDAsCisgICAgMHgwMDAwMDIwMCwgMHgwMDgwODIwMCwgMHgwMDgwODIwMiwgMHgwMDAwMDIwMCwgMHgwMDgwMDIwMiwgMHgwMDgwODAwMiwgMHgwMDgwMDAwMCwgMHgwMDAwMDAwMiwKKyAgICAweDAwMDAwMjAyLCAweDAwODAwMjAwLCAweDAwODAwMjAwLCAweDAwMDA4MjAwLCAweDAwMDA4MjAwLCAweDAwODA4MDAwLCAweDAwODA4MDAwLCAweDAwODAwMjAyLAorICAgIDB4MDAwMDgwMDIsIDB4MDA4MDAwMDIsIDB4MDA4MDAwMDIsIDB4MDAwMDgwMDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAyMDIsIDB4MDAwMDgyMDIsIDB4MDA4MDAwMDAsCisgICAgMHgwMDAwODAwMCwgMHgwMDgwODIwMiwgMHgwMDAwMDAwMiwgMHgwMDgwODAwMCwgMHgwMDgwODIwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDAwMDIwMCwKKyAgICAweDAwODA4MDAyLCAweDAwMDA4MDAwLCAweDAwMDA4MjAwLCAweDAwODAwMDAyLCAweDAwMDAwMjAwLCAweDAwMDAwMDAyLCAweDAwODAwMjAyLCAweDAwMDA4MjAyLAorICAgIDB4MDA4MDgyMDIsIDB4MDAwMDgwMDIsIDB4MDA4MDgwMDAsIDB4MDA4MDAyMDIsIDB4MDA4MDAwMDIsIDB4MDAwMDAyMDIsIDB4MDAwMDgyMDIsIDB4MDA4MDgyMDAsCisgICAgMHgwMDAwMDIwMiwgMHgwMDgwMDIwMCwgMHgwMDgwMDIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwODAwMiwgMHgwMDAwODIwMCwgMHgwMDAwMDAwMCwgMHgwMDgwODAwMiwKKyAgICB9LAorICAgIHsKKyAgICAweDQwMDg0MDEwLCAweDQwMDA0MDAwLCAweDAwMDA0MDAwLCAweDAwMDg0MDEwLCAweDAwMDgwMDAwLCAweDAwMDAwMDEwLCAweDQwMDgwMDEwLCAweDQwMDA0MDEwLAorICAgIDB4NDAwMDAwMTAsIDB4NDAwODQwMTAsIDB4NDAwODQwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDQwMDAsIDB4MDAwODAwMDAsIDB4MDAwMDAwMTAsIDB4NDAwODAwMTAsCisgICAgMHgwMDA4NDAwMCwgMHgwMDA4MDAxMCwgMHg0MDAwNDAxMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwNDAwMCwgMHgwMDA4NDAxMCwgMHg0MDA4MDAwMCwKKyAgICAweDAwMDgwMDEwLCAweDQwMDAwMDEwLCAweDAwMDAwMDAwLCAweDAwMDg0MDAwLCAweDAwMDA0MDEwLCAweDQwMDg0MDAwLCAweDQwMDgwMDAwLCAweDAwMDA0MDEwLAorICAgIDB4MDAwMDAwMDAsIDB4MDAwODQwMTAsIDB4NDAwODAwMTAsIDB4MDAwODAwMDAsIDB4NDAwMDQwMTAsIDB4NDAwODAwMDAsIDB4NDAwODQwMDAsIDB4MDAwMDQwMDAsCisgICAgMHg0MDA4MDAwMCwgMHg0MDAwNDAwMCwgMHgwMDAwMDAxMCwgMHg0MDA4NDAxMCwgMHgwMDA4NDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwNDAwMCwgMHg0MDAwMDAwMCwKKyAgICAweDAwMDA0MDEwLCAweDQwMDg0MDAwLCAweDAwMDgwMDAwLCAweDQwMDAwMDEwLCAweDAwMDgwMDEwLCAweDQwMDA0MDEwLCAweDQwMDAwMDEwLCAweDAwMDgwMDEwLAorICAgIDB4MDAwODQwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDQwMDAsIDB4MDAwMDQwMTAsIDB4NDAwMDAwMDAsIDB4NDAwODAwMTAsIDB4NDAwODQwMTAsIDB4MDAwODQwMDAsCisgICAgfSwKKyAgICB7CisgICAgMHgwMDAwMDEwNCwgMHgwNDAxMDEwMCwgMHgwMDAwMDAwMCwgMHgwNDAxMDAwNCwgMHgwNDAwMDEwMCwgMHgwMDAwMDAwMCwgMHgwMDAxMDEwNCwgMHgwNDAwMDEwMCwKKyAgICAweDAwMDEwMDA0LCAweDA0MDAwMDA0LCAweDA0MDAwMDA0LCAweDAwMDEwMDAwLCAweDA0MDEwMTA0LCAweDAwMDEwMDA0LCAweDA0MDEwMDAwLCAweDAwMDAwMTA0LAorICAgIDB4MDQwMDAwMDAsIDB4MDAwMDAwMDQsIDB4MDQwMTAxMDAsIDB4MDAwMDAxMDAsIDB4MDAwMTAxMDAsIDB4MDQwMTAwMDAsIDB4MDQwMTAwMDQsIDB4MDAwMTAxMDQsCisgICAgMHgwNDAwMDEwNCwgMHgwMDAxMDEwMCwgMHgwMDAxMDAwMCwgMHgwNDAwMDEwNCwgMHgwMDAwMDAwNCwgMHgwNDAxMDEwNCwgMHgwMDAwMDEwMCwgMHgwNDAwMDAwMCwKKyAgICAweDA0MDEwMTAwLCAweDA0MDAwMDAwLCAweDAwMDEwMDA0LCAweDAwMDAwMTA0LCAweDAwMDEwMDAwLCAweDA0MDEwMTAwLCAweDA0MDAwMTAwLCAweDAwMDAwMDAwLAorICAgIDB4MDAwMDAxMDAsIDB4MDAwMTAwMDQsIDB4MDQwMTAxMDQsIDB4MDQwMDAxMDAsIDB4MDQwMDAwMDQsIDB4MDAwMDAxMDAsIDB4MDAwMDAwMDAsIDB4MDQwMTAwMDQsCisgICAgMHgwNDAwMDEwNCwgMHgwMDAxMDAwMCwgMHgwNDAwMDAwMCwgMHgwNDAxMDEwNCwgMHgwMDAwMDAwNCwgMHgwMDAxMDEwNCwgMHgwMDAxMDEwMCwgMHgwNDAwMDAwNCwKKyAgICAweDA0MDEwMDAwLCAweDA0MDAwMTA0LCAweDAwMDAwMTA0LCAweDA0MDEwMDAwLCAweDAwMDEwMTA0LCAweDAwMDAwMDA0LCAweDA0MDEwMDA0LCAweDAwMDEwMTAwLAorICAgIH0sCisgICAgeworICAgIDB4ODA0MDEwMDAsIDB4ODAwMDEwNDAsIDB4ODAwMDEwNDAsIDB4MDAwMDAwNDAsIDB4MDA0MDEwNDAsIDB4ODA0MDAwNDAsIDB4ODA0MDAwMDAsIDB4ODAwMDEwMDAsCisgICAgMHgwMDAwMDAwMCwgMHgwMDQwMTAwMCwgMHgwMDQwMTAwMCwgMHg4MDQwMTA0MCwgMHg4MDAwMDA0MCwgMHgwMDAwMDAwMCwgMHgwMDQwMDA0MCwgMHg4MDQwMDAwMCwKKyAgICAweDgwMDAwMDAwLCAweDAwMDAxMDAwLCAweDAwNDAwMDAwLCAweDgwNDAxMDAwLCAweDAwMDAwMDQwLCAweDAwNDAwMDAwLCAweDgwMDAxMDAwLCAweDAwMDAxMDQwLAorICAgIDB4ODA0MDAwNDAsIDB4ODAwMDAwMDAsIDB4MDAwMDEwNDAsIDB4MDA0MDAwNDAsIDB4MDAwMDEwMDAsIDB4MDA0MDEwNDAsIDB4ODA0MDEwNDAsIDB4ODAwMDAwNDAsCisgICAgMHgwMDQwMDA0MCwgMHg4MDQwMDAwMCwgMHgwMDQwMTAwMCwgMHg4MDQwMTA0MCwgMHg4MDAwMDA0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDQwMTAwMCwKKyAgICAweDAwMDAxMDQwLCAweDAwNDAwMDQwLCAweDgwNDAwMDQwLCAweDgwMDAwMDAwLCAweDgwNDAxMDAwLCAweDgwMDAxMDQwLCAweDgwMDAxMDQwLCAweDAwMDAwMDQwLAorICAgIDB4ODA0MDEwNDAsIDB4ODAwMDAwNDAsIDB4ODAwMDAwMDAsIDB4MDAwMDEwMDAsIDB4ODA0MDAwMDAsIDB4ODAwMDEwMDAsIDB4MDA0MDEwNDAsIDB4ODA0MDAwNDAsCisgICAgMHg4MDAwMTAwMCwgMHgwMDAwMTA0MCwgMHgwMDQwMDAwMCwgMHg4MDQwMTAwMCwgMHgwMDAwMDA0MCwgMHgwMDQwMDAwMCwgMHgwMDAwMTAwMCwgMHgwMDQwMTA0MCwKKyAgICB9LAorICAgIHsKKyAgICAweDAwMDAwMDgwLCAweDAxMDQwMDgwLCAweDAxMDQwMDAwLCAweDIxMDAwMDgwLCAweDAwMDQwMDAwLCAweDAwMDAwMDgwLCAweDIwMDAwMDAwLCAweDAxMDQwMDAwLAorICAgIDB4MjAwNDAwODAsIDB4MDAwNDAwMDAsIDB4MDEwMDAwODAsIDB4MjAwNDAwODAsIDB4MjEwMDAwODAsIDB4MjEwNDAwMDAsIDB4MDAwNDAwODAsIDB4MjAwMDAwMDAsCisgICAgMHgwMTAwMDAwMCwgMHgyMDA0MDAwMCwgMHgyMDA0MDAwMCwgMHgwMDAwMDAwMCwgMHgyMDAwMDA4MCwgMHgyMTA0MDA4MCwgMHgyMTA0MDA4MCwgMHgwMTAwMDA4MCwKKyAgICAweDIxMDQwMDAwLCAweDIwMDAwMDgwLCAweDAwMDAwMDAwLCAweDIxMDAwMDAwLCAweDAxMDQwMDgwLCAweDAxMDAwMDAwLCAweDIxMDAwMDAwLCAweDAwMDQwMDgwLAorICAgIDB4MDAwNDAwMDAsIDB4MjEwMDAwODAsIDB4MDAwMDAwODAsIDB4MDEwMDAwMDAsIDB4MjAwMDAwMDAsIDB4MDEwNDAwMDAsIDB4MjEwMDAwODAsIDB4MjAwNDAwODAsCisgICAgMHgwMTAwMDA4MCwgMHgyMDAwMDAwMCwgMHgyMTA0MDAwMCwgMHgwMTA0MDA4MCwgMHgyMDA0MDA4MCwgMHgwMDAwMDA4MCwgMHgwMTAwMDAwMCwgMHgyMTA0MDAwMCwKKyAgICAweDIxMDQwMDgwLCAweDAwMDQwMDgwLCAweDIxMDAwMDAwLCAweDIxMDQwMDgwLCAweDAxMDQwMDAwLCAweDAwMDAwMDAwLCAweDIwMDQwMDAwLCAweDIxMDAwMDAwLAorICAgIDB4MDAwNDAwODAsIDB4MDEwMDAwODAsIDB4MjAwMDAwODAsIDB4MDAwNDAwMDAsIDB4MDAwMDAwMDAsIDB4MjAwNDAwMDAsIDB4MDEwNDAwODAsIDB4MjAwMDAwODAsCisgICAgfSwKKyAgICB7CisgICAgMHgxMDAwMDAwOCwgMHgxMDIwMDAwMCwgMHgwMDAwMjAwMCwgMHgxMDIwMjAwOCwgMHgxMDIwMDAwMCwgMHgwMDAwMDAwOCwgMHgxMDIwMjAwOCwgMHgwMDIwMDAwMCwKKyAgICAweDEwMDAyMDAwLCAweDAwMjAyMDA4LCAweDAwMjAwMDAwLCAweDEwMDAwMDA4LCAweDAwMjAwMDA4LCAweDEwMDAyMDAwLCAweDEwMDAwMDAwLCAweDAwMDAyMDA4LAorICAgIDB4MDAwMDAwMDAsIDB4MDAyMDAwMDgsIDB4MTAwMDIwMDgsIDB4MDAwMDIwMDAsIDB4MDAyMDIwMDAsIDB4MTAwMDIwMDgsIDB4MDAwMDAwMDgsIDB4MTAyMDAwMDgsCisgICAgMHgxMDIwMDAwOCwgMHgwMDAwMDAwMCwgMHgwMDIwMjAwOCwgMHgxMDIwMjAwMCwgMHgwMDAwMjAwOCwgMHgwMDIwMjAwMCwgMHgxMDIwMjAwMCwgMHgxMDAwMDAwMCwKKyAgICAweDEwMDAyMDAwLCAweDAwMDAwMDA4LCAweDEwMjAwMDA4LCAweDAwMjAyMDAwLCAweDEwMjAyMDA4LCAweDAwMjAwMDAwLCAweDAwMDAyMDA4LCAweDEwMDAwMDA4LAorICAgIDB4MDAyMDAwMDAsIDB4MTAwMDIwMDAsIDB4MTAwMDAwMDAsIDB4MDAwMDIwMDgsIDB4MTAwMDAwMDgsIDB4MTAyMDIwMDgsIDB4MDAyMDIwMDAsIDB4MTAyMDAwMDAsCisgICAgMHgwMDIwMjAwOCwgMHgxMDIwMjAwMCwgMHgwMDAwMDAwMCwgMHgxMDIwMDAwOCwgMHgwMDAwMDAwOCwgMHgwMDAwMjAwMCwgMHgxMDIwMDAwMCwgMHgwMDIwMjAwOCwKKyAgICAweDAwMDAyMDAwLCAweDAwMjAwMDA4LCAweDEwMDAyMDA4LCAweDAwMDAwMDAwLCAweDEwMjAyMDAwLCAweDEwMDAwMDAwLCAweDAwMjAwMDA4LCAweDEwMDAyMDA4LAorICAgIH0sCisgICAgeworICAgIDB4MDAxMDAwMDAsIDB4MDIxMDAwMDEsIDB4MDIwMDA0MDEsIDB4MDAwMDAwMDAsIDB4MDAwMDA0MDAsIDB4MDIwMDA0MDEsIDB4MDAxMDA0MDEsIDB4MDIxMDA0MDAsCisgICAgMHgwMjEwMDQwMSwgMHgwMDEwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMjAwMDAwMCwgMHgwMjEwMDAwMSwgMHgwMDAwMDQwMSwKKyAgICAweDAyMDAwNDAwLCAweDAwMTAwNDAxLCAweDAwMTAwMDAxLCAweDAyMDAwNDAwLCAweDAyMDAwMDAxLCAweDAyMTAwMDAwLCAweDAyMTAwNDAwLCAweDAwMTAwMDAxLAorICAgIDB4MDIxMDAwMDAsIDB4MDAwMDA0MDAsIDB4MDAwMDA0MDEsIDB4MDIxMDA0MDEsIDB4MDAxMDA0MDAsIDB4MDAwMDAwMDEsIDB4MDIwMDAwMDAsIDB4MDAxMDA0MDAsCisgICAgMHgwMjAwMDAwMCwgMHgwMDEwMDQwMCwgMHgwMDEwMDAwMCwgMHgwMjAwMDQwMSwgMHgwMjAwMDQwMSwgMHgwMjEwMDAwMSwgMHgwMjEwMDAwMSwgMHgwMDAwMDAwMSwKKyAgICAweDAwMTAwMDAxLCAweDAyMDAwMDAwLCAweDAyMDAwNDAwLCAweDAwMTAwMDAwLCAweDAyMTAwNDAwLCAweDAwMDAwNDAxLCAweDAwMTAwNDAxLCAweDAyMTAwNDAwLAorICAgIDB4MDAwMDA0MDEsIDB4MDIwMDAwMDEsIDB4MDIxMDA0MDEsIDB4MDIxMDAwMDAsIDB4MDAxMDA0MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEsIDB4MDIxMDA0MDEsCisgICAgMHgwMDAwMDAwMCwgMHgwMDEwMDQwMSwgMHgwMjEwMDAwMCwgMHgwMDAwMDQwMCwgMHgwMjAwMDAwMSwgMHgwMjAwMDQwMCwgMHgwMDAwMDQwMCwgMHgwMDEwMDAwMSwKKyAgICB9LAorICAgIHsKKyAgICAweDA4MDAwODIwLCAweDAwMDAwODAwLCAweDAwMDIwMDAwLCAweDA4MDIwODIwLCAweDA4MDAwMDAwLCAweDA4MDAwODIwLCAweDAwMDAwMDIwLCAweDA4MDAwMDAwLAorICAgIDB4MDAwMjAwMjAsIDB4MDgwMjAwMDAsIDB4MDgwMjA4MjAsIDB4MDAwMjA4MDAsIDB4MDgwMjA4MDAsIDB4MDAwMjA4MjAsIDB4MDAwMDA4MDAsIDB4MDAwMDAwMjAsCisgICAgMHgwODAyMDAwMCwgMHgwODAwMDAyMCwgMHgwODAwMDgwMCwgMHgwMDAwMDgyMCwgMHgwMDAyMDgwMCwgMHgwMDAyMDAyMCwgMHgwODAyMDAyMCwgMHgwODAyMDgwMCwKKyAgICAweDAwMDAwODIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDA4MDIwMDIwLCAweDA4MDAwMDIwLCAweDA4MDAwODAwLCAweDAwMDIwODIwLCAweDAwMDIwMDAwLAorICAgIDB4MDAwMjA4MjAsIDB4MDAwMjAwMDAsIDB4MDgwMjA4MDAsIDB4MDAwMDA4MDAsIDB4MDAwMDAwMjAsIDB4MDgwMjAwMjAsIDB4MDAwMDA4MDAsIDB4MDAwMjA4MjAsCisgICAgMHgwODAwMDgwMCwgMHgwMDAwMDAyMCwgMHgwODAwMDAyMCwgMHgwODAyMDAwMCwgMHgwODAyMDAyMCwgMHgwODAwMDAwMCwgMHgwMDAyMDAwMCwgMHgwODAwMDgyMCwKKyAgICAweDAwMDAwMDAwLCAweDA4MDIwODIwLCAweDAwMDIwMDIwLCAweDA4MDAwMDIwLCAweDA4MDIwMDAwLCAweDA4MDAwODAwLCAweDA4MDAwODIwLCAweDAwMDAwMDAwLAorICAgIDB4MDgwMjA4MjAsIDB4MDAwMjA4MDAsIDB4MDAwMjA4MDAsIDB4MDAwMDA4MjAsIDB4MDAwMDA4MjAsIDB4MDAwMjAwMjAsIDB4MDgwMDAwMDAsIDB4MDgwMjA4MDAsCisgICAgfSwKK307CisjZW5kaWYKKworc3RhdGljIHVpbnQ2NF90IHNodWZmbGUodWludDY0X3QgaW4sIGNvbnN0IHVpbnQ4X3QgKnNodWZmbGUsIGludCBzaHVmZmxlX2xlbikgeworICAgIGludCBpOworICAgIHVpbnQ2NF90IHJlcyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHNodWZmbGVfbGVuOyBpKyspCisgICAgICAgIHJlcyArPSByZXMgKyAoKGluID4+ICpzaHVmZmxlKyspICYgMSk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHVpbnQ2NF90IHNodWZmbGVfaW52KHVpbnQ2NF90IGluLCBjb25zdCB1aW50OF90ICpzaHVmZmxlLCBpbnQgc2h1ZmZsZV9sZW4pIHsKKyAgICBpbnQgaTsKKyAgICB1aW50NjRfdCByZXMgPSAwOworICAgIHNodWZmbGUgKz0gc2h1ZmZsZV9sZW4gLSAxOworICAgIGZvciAoaSA9IDA7IGkgPCBzaHVmZmxlX2xlbjsgaSsrKSB7CisgICAgICAgIHJlcyB8PSAoaW4gJiAxKSA8PCAqc2h1ZmZsZS0tOworICAgICAgICBpbiA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHVpbnQzMl90IGZfZnVuYyh1aW50MzJfdCByLCB1aW50NjRfdCBrKSB7CisgICAgaW50IGk7CisgICAgdWludDMyX3Qgb3V0ID0gMDsKKyAgICAvLyByb3RhdGUgdG8gZ2V0IGZpcnN0IHBhcnQgb2YgRS1zaHVmZmxlIGluIHRoZSBsb3dlc3QgNiBiaXRzCisgICAgciA9IChyIDw8IDEpIHwgKHIgPj4gMzEpOworICAgIC8vIGFwcGx5IFMtYm94ZXMsIHRob3NlIGNvbXByZXNzIHRoZSBkYXRhIGFnYWluIGZyb20gOCAqIDYgdG8gOCAqIDQgYml0cworICAgIGZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHVpbnQ4X3QgdG1wID0gKHIgXiBrKSAmIDB4M2Y7CisjaWYgQ09ORklHX1NNQUxMCisgICAgICAgIHVpbnQ4X3QgdiA9IFNfYm94ZXNbaV1bdG1wID4+IDFdOworICAgICAgICBpZiAodG1wICYgMSkgdiA+Pj0gNDsKKyAgICAgICAgb3V0ID0gKG91dCA+PiA0KSB8ICh2IDw8IDI4KTsKKyNlbHNlCisgICAgICAgIG91dCB8PSBTX2JveGVzX1Bfc2h1ZmZsZVtpXVt0bXBdOworI2VuZGlmCisgICAgICAgIC8vIGdldCBuZXh0IDYgYml0cyBvZiBFLXNodWZmbGUgYW5kIHJvdW5kIGtleSBrIGludG8gdGhlIGxvd2VzdCBiaXRzCisgICAgICAgIHIgPSAociA+PiA0KSB8IChyIDw8IDI4KTsKKyAgICAgICAgayA+Pj0gNjsKKyAgICB9CisjaWYgQ09ORklHX1NNQUxMCisgICAgb3V0ID0gc2h1ZmZsZShvdXQsIFBfc2h1ZmZsZSwgc2l6ZW9mKFBfc2h1ZmZsZSkpOworI2VuZGlmCisgICAgcmV0dXJuIG91dDsKK30KKworLyoqCisgKiBAYnJpZWYgcm90YXRlIHRoZSB0d28gaGFsdmVzIG9mIHRoZSBleHBhbmRlZCA1NiBiaXQga2V5IGVhY2ggMSBiaXQgbGVmdAorICoKKyAqIE5vdGU6IHRoZSBzcGVjaWZpY2F0aW9uIGNhbGxzIHRoaXMgInNoaWZ0Iiwgc28gSSBrZXB0IGl0IGFsdGhvdWdoCisgKiBpdCBpcyBjb25mdXNpbmcuCisgKi8KK3N0YXRpYyB1aW50NjRfdCBrZXlfc2hpZnRfbGVmdCh1aW50NjRfdCBDRG4pIHsKKyAgICB1aW50NjRfdCBjYXJyaWVzID0gKENEbiA+PiAyNykgJiAweDEwMDAwMDAxOworICAgIENEbiA8PD0gMTsKKyAgICBDRG4gJj0gfjB4MTAwMDAwMDE7CisgICAgQ0RuIHw9IGNhcnJpZXM7CisgICAgcmV0dXJuIENEbjsKK30KKworc3RhdGljIHZvaWQgZ2VuX3JvdW5ka2V5cyh1aW50NjRfdCBLWzE2XSwgdWludDY0X3Qga2V5KSB7CisgICAgaW50IGk7CisgICAgLy8gZGlzY2FyZCBwYXJpdHkgYml0cyBmcm9tIGtleSBhbmQgc2h1ZmZsZSBpdCBpbnRvIEMgYW5kIEQgcGFydHMKKyAgICB1aW50NjRfdCBDRG4gPSBzaHVmZmxlKGtleSwgUEMxX3NodWZmbGUsIHNpemVvZihQQzFfc2h1ZmZsZSkpOworICAgIC8vIGdlbmVyYXRlIHJvdW5kIGtleXMKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBDRG4gPSBrZXlfc2hpZnRfbGVmdChDRG4pOworICAgICAgICBpZiAoaSA+IDEgJiYgaSAhPSA4ICYmIGkgIT0gMTUpCisgICAgICAgICAgICBDRG4gPSBrZXlfc2hpZnRfbGVmdChDRG4pOworICAgICAgICBLW2ldID0gc2h1ZmZsZShDRG4sIFBDMl9zaHVmZmxlLCBzaXplb2YoUEMyX3NodWZmbGUpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB1aW50NjRfdCBkZXNfZW5jZGVjKHVpbnQ2NF90IGluLCB1aW50NjRfdCBLWzE2XSwgaW50IGRlY3J5cHQpIHsKKyAgICBpbnQgaTsKKyAgICAvLyB1c2VkIHRvIGFwcGx5IHJvdW5kIGtleXMgaW4gcmV2ZXJzZSBvcmRlciBmb3IgZGVjcnlwdGlvbgorICAgIGRlY3J5cHQgPSBkZWNyeXB0ID8gMTUgOiAwOworICAgIC8vIHNodWZmbGUgaXJyZWxldmFudCB0byBzZWN1cml0eSBidXQgdG8gZWFzZSBoYXJkd2FyZSBpbXBsZW1lbnRhdGlvbnMKKyAgICBpbiA9IHNodWZmbGUoaW4sIElQX3NodWZmbGUsIHNpemVvZihJUF9zaHVmZmxlKSk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgZl9yZXM7CisgICAgICAgIGZfcmVzID0gZl9mdW5jKGluLCBLW2RlY3J5cHQgXiBpXSk7CisgICAgICAgIGluID0gKGluIDw8IDMyKSB8IChpbiA+PiAzMik7CisgICAgICAgIGluIF49IGZfcmVzOworICAgIH0KKyAgICBpbiA9IChpbiA8PCAzMikgfCAoaW4gPj4gMzIpOworICAgIC8vIHJldmVyc2Ugc2h1ZmZsZSB1c2VkIHRvIGVhc2UgaGFyZHdhcmUgaW1wbGVtZW50YXRpb25zCisgICAgaW4gPSBzaHVmZmxlX2ludihpbiwgSVBfc2h1ZmZsZSwgc2l6ZW9mKElQX3NodWZmbGUpKTsKKyAgICByZXR1cm4gaW47Cit9CisKK2ludCBhdl9kZXNfaW5pdChBVkRFUyAqZCwgY29uc3QgdWludDhfdCAqa2V5LCBpbnQga2V5X2JpdHMsIGF2X3VudXNlZCBpbnQgZGVjcnlwdCkgeworICAgIGlmIChrZXlfYml0cyAhPSA2NCAmJiBrZXlfYml0cyAhPSAxOTIpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBkLT50cmlwbGVfZGVzID0ga2V5X2JpdHMgPiA2NDsKKyAgICBnZW5fcm91bmRrZXlzKGQtPnJvdW5kX2tleXNbMF0sIEFWX1JCNjQoa2V5KSk7CisgICAgaWYgKGQtPnRyaXBsZV9kZXMpIHsKKyAgICAgICAgZ2VuX3JvdW5ka2V5cyhkLT5yb3VuZF9rZXlzWzFdLCBBVl9SQjY0KGtleSArICA4KSk7CisgICAgICAgIGdlbl9yb3VuZGtleXMoZC0+cm91bmRfa2V5c1syXSwgQVZfUkI2NChrZXkgKyAxNikpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXZfZGVzX2NyeXB0X21hYyhBVkRFUyAqZCwgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBjb3VudCwgdWludDhfdCAqaXYsIGludCBkZWNyeXB0LCBpbnQgbWFjKSB7CisgICAgdWludDY0X3QgaXZfdmFsID0gaXYgPyBBVl9SQjY0KGl2KSA6IDA7CisgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgIHVpbnQ2NF90IGRzdF92YWw7CisgICAgICAgIHVpbnQ2NF90IHNyY192YWwgPSBzcmMgPyBBVl9SQjY0KHNyYykgOiAwOworICAgICAgICBpZiAoZGVjcnlwdCkgeworICAgICAgICAgICAgdWludDY0X3QgdG1wID0gc3JjX3ZhbDsKKyAgICAgICAgICAgIGlmIChkLT50cmlwbGVfZGVzKSB7CisgICAgICAgICAgICAgICAgc3JjX3ZhbCA9IGRlc19lbmNkZWMoc3JjX3ZhbCwgZC0+cm91bmRfa2V5c1syXSwgMSk7CisgICAgICAgICAgICAgICAgc3JjX3ZhbCA9IGRlc19lbmNkZWMoc3JjX3ZhbCwgZC0+cm91bmRfa2V5c1sxXSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RfdmFsID0gZGVzX2VuY2RlYyhzcmNfdmFsLCBkLT5yb3VuZF9rZXlzWzBdLCAxKSBeIGl2X3ZhbDsKKyAgICAgICAgICAgIGl2X3ZhbCA9IGl2ID8gdG1wIDogMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdF92YWwgPSBkZXNfZW5jZGVjKHNyY192YWwgXiBpdl92YWwsIGQtPnJvdW5kX2tleXNbMF0sIDApOworICAgICAgICAgICAgaWYgKGQtPnRyaXBsZV9kZXMpIHsKKyAgICAgICAgICAgICAgICBkc3RfdmFsID0gZGVzX2VuY2RlYyhkc3RfdmFsLCBkLT5yb3VuZF9rZXlzWzFdLCAxKTsKKyAgICAgICAgICAgICAgICBkc3RfdmFsID0gZGVzX2VuY2RlYyhkc3RfdmFsLCBkLT5yb3VuZF9rZXlzWzJdLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGl2X3ZhbCA9IGl2ID8gZHN0X3ZhbCA6IDA7CisgICAgICAgIH0KKyAgICAgICAgQVZfV0I2NChkc3QsIGRzdF92YWwpOworICAgICAgICBzcmMgKz0gODsKKyAgICAgICAgaWYgKCFtYWMpCisgICAgICAgICAgICBkc3QgKz0gODsKKyAgICB9CisgICAgaWYgKGl2KQorICAgICAgICBBVl9XQjY0KGl2LCBpdl92YWwpOworfQorCit2b2lkIGF2X2Rlc19jcnlwdChBVkRFUyAqZCwgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBjb3VudCwgdWludDhfdCAqaXYsIGludCBkZWNyeXB0KSB7CisgICAgYXZfZGVzX2NyeXB0X21hYyhkLCBkc3QsIHNyYywgY291bnQsIGl2LCBkZWNyeXB0LCAwKTsKK30KKwordm9pZCBhdl9kZXNfbWFjKEFWREVTICpkLCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvdW50KSB7CisgICAgYXZfZGVzX2NyeXB0X21hYyhkLCBkc3QsIHNyYywgY291bnQsICh1aW50OF90WzhdKXswfSwgMCwgMSk7Cit9CisKKyNpZmRlZiBURVNUCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInRpbWUuaCIKKworc3RhdGljIHVpbnQ2NF90IHJhbmQ2NCh2b2lkKSB7CisgICAgdWludDY0X3QgciA9IHJhbmQoKTsKKyAgICByID0gKHIgPDwgMzIpIHwgcmFuZCgpOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCB0ZXN0X2tleVtdID0gezB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OWEsIDB4YmMsIDB4ZGUsIDB4ZjB9Oworc3RhdGljIGNvbnN0IERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCBwbGFpbilbXSA9IHsweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwfTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgY3J5cHQpW10gPSB7MHg0YSwgMHhiNiwgMHg1YiwgMHgzZCwgMHg0YiwgMHgwNiwgMHgxNSwgMHgxOH07CitzdGF0aWMgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIHRtcClbOF07CitzdGF0aWMgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIGxhcmdlX2J1ZmZlcilbMTAwMDJdWzhdOworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2JjX2tleVtdID0geworICAgIDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisgICAgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwgMHgwMSwKKyAgICAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLCAweDAxLCAweDIzCit9OworCitzdGF0aWMgaW50IHJ1bl90ZXN0KGludCBjYmMsIGludCBkZWNyeXB0KSB7CisgICAgQVZERVMgZDsKKyAgICBpbnQgZGVsYXkgPSBjYmMgJiYgIWRlY3J5cHQgPyAyIDogMTsKKyAgICB1aW50NjRfdCByZXM7CisgICAgQVZfV0I2NChsYXJnZV9idWZmZXJbMF0sIDB4NGU2Zjc3MjA2OTczMjA3NFVMTCk7CisgICAgQVZfV0I2NChsYXJnZV9idWZmZXJbMV0sIDB4MTIzNDU2Nzg5MGFiY2RlZlVMTCk7CisgICAgQVZfV0I2NCh0bXAsICAgICAgICAgICAgIDB4MTIzNDU2Nzg5MGFiY2RlZlVMTCk7CisgICAgYXZfZGVzX2luaXQoJmQsIGNiY19rZXksIDE5MiwgZGVjcnlwdCk7CisgICAgYXZfZGVzX2NyeXB0KCZkLCBsYXJnZV9idWZmZXJbZGVsYXldLCBsYXJnZV9idWZmZXJbMF0sIDEwMDAwLCBjYmMgPyB0bXAgOiBOVUxMLCBkZWNyeXB0KTsKKyAgICByZXMgPSBBVl9SQjY0KGxhcmdlX2J1ZmZlcls5OTk5ICsgZGVsYXldKTsKKyAgICBpZiAoY2JjKSB7CisgICAgICAgIGlmIChkZWNyeXB0KQorICAgICAgICAgICAgcmV0dXJuIHJlcyA9PSAweGM1Y2VjZjYzZWNlYzUxNGNVTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiByZXMgPT0gMHhjYjE5MWY4NWQxZWQ4NDM5VUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkZWNyeXB0KQorICAgICAgICAgICAgcmV0dXJuIHJlcyA9PSAweDgzMjUzOTc2NDQwOTFhMGFVTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiByZXMgPT0gMHhkZDE3ZThiOGI0MzdkMjMyVUxMOworICAgIH0KK30KKworaW50IG1haW4odm9pZCkgeworICAgIEFWREVTIGQ7CisgICAgaW50IGk7CisjaWZkZWYgR0VOVEFCTEVTCisgICAgaW50IGo7CisjZW5kaWYKKyAgICB1aW50NjRfdCBrZXlbM107CisgICAgdWludDY0X3QgZGF0YTsKKyAgICB1aW50NjRfdCBjdDsKKyAgICB1aW50NjRfdCByb3VuZGtleXNbMTZdOworICAgIHNyYW5kKGF2X2dldHRpbWUoKSk7CisgICAga2V5WzBdID0gQVZfUkI2NCh0ZXN0X2tleSk7CisgICAgZGF0YSA9IEFWX1JCNjQocGxhaW4pOworICAgIGdlbl9yb3VuZGtleXMocm91bmRrZXlzLCBrZXlbMF0pOworICAgIGlmIChkZXNfZW5jZGVjKGRhdGEsIHJvdW5ka2V5cywgMCkgIT0gQVZfUkI2NChjcnlwdCkpIHsKKyAgICAgICAgcHJpbnRmKCJUZXN0IDEgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGF2X2Rlc19pbml0KCZkLCB0ZXN0X2tleSwgNjQsIDApOworICAgIGF2X2Rlc19jcnlwdCgmZCwgdG1wLCBwbGFpbiwgMSwgTlVMTCwgMCk7CisgICAgaWYgKG1lbWNtcCh0bXAsIGNyeXB0LCBzaXplb2YoY3J5cHQpKSkgeworICAgICAgICBwcmludGYoIlB1YmxpYyBBUEkgZGVjcnlwdGlvbiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFydW5fdGVzdCgwLCAwKSB8fCAhcnVuX3Rlc3QoMCwgMSkgfHwgIXJ1bl90ZXN0KDEsIDApIHx8ICFydW5fdGVzdCgxLCAxKSkgeworICAgICAgICBwcmludGYoIlBhcnRpYWwgTW9udGUtQ2FybG8gdGVzdCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBrZXlbMF0gPSByYW5kNjQoKTsga2V5WzFdID0gcmFuZDY0KCk7IGtleVsyXSA9IHJhbmQ2NCgpOworICAgICAgICBkYXRhID0gcmFuZDY0KCk7CisgICAgICAgIGF2X2Rlc19pbml0KCZkLCAodWludDhfdCopa2V5LCAxOTIsIDApOworICAgICAgICBhdl9kZXNfY3J5cHQoJmQsICh1aW50OF90KikmY3QsICh1aW50OF90KikmZGF0YSwgMSwgTlVMTCwgMCk7CisgICAgICAgIGF2X2Rlc19pbml0KCZkLCAodWludDhfdCopa2V5LCAxOTIsIDEpOworICAgICAgICBhdl9kZXNfY3J5cHQoJmQsICh1aW50OF90KikmY3QsICh1aW50OF90KikmY3QsIDEsIE5VTEwsIDEpOworICAgICAgICBpZiAoY3QgIT0gZGF0YSkgeworICAgICAgICAgICAgcHJpbnRmKCJUZXN0IDIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorI2lmZGVmIEdFTlRBQkxFUworICAgIHByaW50Zigic3RhdGljIGNvbnN0IHVpbnQzMl90IFNfYm94ZXNfUF9zaHVmZmxlWzhdWzY0XSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIgICAgeyIpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgeworICAgICAgICAgICAgdWludDMyX3QgdiA9IFNfYm94ZXNbaV1baiA+PiAxXTsKKyAgICAgICAgICAgIHYgPSBqICYgMSA/IHYgPj4gNCA6IHYgJiAweGY7CisgICAgICAgICAgICB2IDw8PSAyOCAtIDQgKiBpOworICAgICAgICAgICAgdiA9IHNodWZmbGUodiwgUF9zaHVmZmxlLCBzaXplb2YoUF9zaHVmZmxlKSk7CisgICAgICAgICAgICBwcmludGYoKGogJiA3KSA9PSAwID8gIlxuICAgICIgOiAiICIpOworICAgICAgICAgICAgcHJpbnRmKCIweCUwOFgsIiwgdik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiAgICB9LFxuIik7CisgICAgfQorICAgIHByaW50ZigifTtcbiIpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvZGVzLmggYi9mZm1wZWcvbGliYXZ1dGlsL2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZWIwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2Rlcy5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBERVMgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgUmVpbWFyIERvZWZmaW5nZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfREVTX0gKKyNkZWZpbmUgQVZVVElMX0RFU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RydWN0IEFWREVTIHsKKyAgICB1aW50NjRfdCByb3VuZF9rZXlzWzNdWzE2XTsKKyAgICBpbnQgdHJpcGxlX2RlczsKK307CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIGFuIEFWREVTIGNvbnRleHQuCisgKgorICogQHBhcmFtIGtleV9iaXRzIG11c3QgYmUgNjQgb3IgMTkyCisgKiBAcGFyYW0gZGVjcnlwdCAwIGZvciBlbmNyeXB0aW9uL0NCQy1NQUMsIDEgZm9yIGRlY3J5cHRpb24KKyAqLworaW50IGF2X2Rlc19pbml0KHN0cnVjdCBBVkRFUyAqZCwgY29uc3QgdWludDhfdCAqa2V5LCBpbnQga2V5X2JpdHMsIGludCBkZWNyeXB0KTsKKworLyoqCisgKiBAYnJpZWYgRW5jcnlwdHMgLyBkZWNyeXB0cyB1c2luZyB0aGUgREVTIGFsZ29yaXRobS4KKyAqCisgKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIDggYnl0ZSBibG9ja3MKKyAqIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gYXJyYXksIGNhbiBiZSBlcXVhbCB0byBzcmMsIG11c3QgYmUgOC1ieXRlIGFsaWduZWQKKyAqIEBwYXJhbSBzcmMgc291cmNlIGFycmF5LCBjYW4gYmUgZXF1YWwgdG8gZHN0LCBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLCBtYXkgYmUgTlVMTAorICogQHBhcmFtIGl2IGluaXRpYWxpemF0aW9uIHZlY3RvciBmb3IgQ0JDIG1vZGUsIGlmIE5VTEwgdGhlbiBFQ0Igd2lsbCBiZSB1c2VkLAorICogICAgICAgICAgIG11c3QgYmUgOC1ieXRlIGFsaWduZWQKKyAqIEBwYXJhbSBkZWNyeXB0IDAgZm9yIGVuY3J5cHRpb24sIDEgZm9yIGRlY3J5cHRpb24KKyAqLwordm9pZCBhdl9kZXNfY3J5cHQoc3RydWN0IEFWREVTICpkLCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvdW50LCB1aW50OF90ICppdiwgaW50IGRlY3J5cHQpOworCisvKioKKyAqIEBicmllZiBDYWxjdWxhdGVzIENCQy1NQUMgdXNpbmcgdGhlIERFUyBhbGdvcml0aG0uCisgKgorICogQHBhcmFtIGNvdW50IG51bWJlciBvZiA4IGJ5dGUgYmxvY2tzCisgKiBAcGFyYW0gZHN0IGRlc3RpbmF0aW9uIGFycmF5LCBjYW4gYmUgZXF1YWwgdG8gc3JjLCBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkCisgKiBAcGFyYW0gc3JjIHNvdXJjZSBhcnJheSwgY2FuIGJlIGVxdWFsIHRvIGRzdCwgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZCwgbWF5IGJlIE5VTEwKKyAqLwordm9pZCBhdl9kZXNfbWFjKHN0cnVjdCBBVkRFUyAqZCwgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBjb3VudCk7CisKKyNlbmRpZiAvKiBBVlVUSUxfREVTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvZGljdC5jIGIvZmZtcGVnL2xpYmF2dXRpbC9kaWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4M2VhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvZGljdC5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDA5IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJkaWN0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJicHJpbnQuaCIKKworc3RydWN0IEFWRGljdGlvbmFyeSB7CisgICAgaW50IGNvdW50OworICAgIEFWRGljdGlvbmFyeUVudHJ5ICplbGVtczsKK307CisKK2ludCBhdl9kaWN0X2NvdW50KGNvbnN0IEFWRGljdGlvbmFyeSAqbSkKK3sKKyAgICByZXR1cm4gbSA/IG0tPmNvdW50IDogMDsKK30KKworQVZEaWN0aW9uYXJ5RW50cnkgKmF2X2RpY3RfZ2V0KGNvbnN0IEFWRGljdGlvbmFyeSAqbSwgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRGljdGlvbmFyeUVudHJ5ICpwcmV2LCBpbnQgZmxhZ3MpCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgICBpZiAoIW0pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHByZXYpCisgICAgICAgIGkgPSBwcmV2IC0gbS0+ZWxlbXMgKyAxOworICAgIGVsc2UKKyAgICAgICAgaSA9IDA7CisKKyAgICBmb3IgKDsgaSA8IG0tPmNvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciAqcyA9IG0tPmVsZW1zW2ldLmtleTsKKyAgICAgICAgaWYgKGZsYWdzICYgQVZfRElDVF9NQVRDSF9DQVNFKQorICAgICAgICAgICAgZm9yIChqID0gMDsgc1tqXSA9PSBrZXlbal0gJiYga2V5W2pdOyBqKyspCisgICAgICAgICAgICAgICAgOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IgKGogPSAwOyBhdl90b3VwcGVyKHNbal0pID09IGF2X3RvdXBwZXIoa2V5W2pdKSAmJiBrZXlbal07IGorKykKKyAgICAgICAgICAgICAgICA7CisgICAgICAgIGlmIChrZXlbal0pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHNbal0gJiYgIShmbGFncyAmIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcmV0dXJuICZtLT5lbGVtc1tpXTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBhdl9kaWN0X3NldChBVkRpY3Rpb25hcnkgKipwbSwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgQVZEaWN0aW9uYXJ5ICptID0gKnBtOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0YWcgPSBhdl9kaWN0X2dldChtLCBrZXksIE5VTEwsIGZsYWdzKTsKKyAgICBjaGFyICpvbGR2YWwgPSBOVUxMOworCisgICAgaWYgKCFtKQorICAgICAgICBtID0gKnBtID0gYXZfbWFsbG9jeihzaXplb2YoKm0pKTsKKworICAgIGlmICh0YWcpIHsKKyAgICAgICAgaWYgKGZsYWdzICYgQVZfRElDVF9ET05UX09WRVJXUklURSkgeworICAgICAgICAgICAgaWYgKGZsYWdzICYgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkpIGF2X2ZyZWUoKHZvaWQqKWtleSk7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCkgYXZfZnJlZSgodm9pZCopdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICYgQVZfRElDVF9BUFBFTkQpCisgICAgICAgICAgICBvbGR2YWwgPSB0YWctPnZhbHVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdl9mcmVlKHRhZy0+dmFsdWUpOworICAgICAgICBhdl9mcmVlKHRhZy0+a2V5KTsKKyAgICAgICAgKnRhZyA9IG0tPmVsZW1zWy0tbS0+Y291bnRdOworICAgIH0gZWxzZSB7CisgICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0bXAgPSBhdl9yZWFsbG9jKG0tPmVsZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobS0+Y291bnQgKyAxKSAqIHNpemVvZigqbS0+ZWxlbXMpKTsKKyAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICBnb3RvIGVycl9vdXQ7CisgICAgICAgIG0tPmVsZW1zID0gdG1wOworICAgIH0KKyAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgaWYgKGZsYWdzICYgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkpCisgICAgICAgICAgICBtLT5lbGVtc1ttLT5jb3VudF0ua2V5ID0gKGNoYXIqKShpbnRwdHJfdClrZXk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG0tPmVsZW1zW20tPmNvdW50XS5rZXkgPSBhdl9zdHJkdXAoa2V5KTsKKyAgICAgICAgaWYgKGZsYWdzICYgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpIHsKKyAgICAgICAgICAgIG0tPmVsZW1zW20tPmNvdW50XS52YWx1ZSA9IChjaGFyKikoaW50cHRyX3QpdmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAob2xkdmFsICYmIGZsYWdzICYgQVZfRElDVF9BUFBFTkQpIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4ob2xkdmFsKSArIHN0cmxlbih2YWx1ZSkgKyAxOworICAgICAgICAgICAgY2hhciAqbmV3dmFsID0gYXZfbWFsbG9jeihsZW4pOworICAgICAgICAgICAgaWYgKCFuZXd2YWwpCisgICAgICAgICAgICAgICAgZ290byBlcnJfb3V0OworICAgICAgICAgICAgYXZfc3RybGNhdChuZXd2YWwsIG9sZHZhbCwgbGVuKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZvbGR2YWwpOworICAgICAgICAgICAgYXZfc3RybGNhdChuZXd2YWwsIHZhbHVlLCBsZW4pOworICAgICAgICAgICAgbS0+ZWxlbXNbbS0+Y291bnRdLnZhbHVlID0gbmV3dmFsOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG0tPmVsZW1zW20tPmNvdW50XS52YWx1ZSA9IGF2X3N0cmR1cCh2YWx1ZSk7CisgICAgICAgIG0tPmNvdW50Kys7CisgICAgfQorICAgIGlmICghbS0+Y291bnQpIHsKKyAgICAgICAgYXZfZnJlZShtLT5lbGVtcyk7CisgICAgICAgIGF2X2ZyZWVwKHBtKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZXJyX291dDoKKyAgICBpZiAoIW0tPmNvdW50KSB7CisgICAgICAgIGF2X2ZyZWUobS0+ZWxlbXMpOworICAgICAgICBhdl9mcmVlcChwbSk7CisgICAgfQorICAgIGlmIChmbGFncyAmIEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZKSBhdl9mcmVlKCh2b2lkKilrZXkpOworICAgIGlmIChmbGFncyAmIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKSBhdl9mcmVlKCh2b2lkKil2YWx1ZSk7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworaW50IGF2X2RpY3Rfc2V0X2ludChBVkRpY3Rpb25hcnkgKipwbSwgY29uc3QgY2hhciAqa2V5LCBpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBjaGFyIHZhbHVlc3RyWzIyXTsKKyAgICBzbnByaW50Zih2YWx1ZXN0ciwgc2l6ZW9mKHZhbHVlc3RyKSwgIiUiUFJJZDY0LCB2YWx1ZSk7CisgICAgcmV0dXJuIGF2X2RpY3Rfc2V0KHBtLCBrZXksIHZhbHVlc3RyLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfa2V5X3ZhbHVlX3BhaXIoQVZEaWN0aW9uYXJ5ICoqcG0sIGNvbnN0IGNoYXIgKipidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleV92YWxfc2VwLCBjb25zdCBjaGFyICpwYWlyc19zZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBjaGFyICprZXkgPSBhdl9nZXRfdG9rZW4oYnVmLCBrZXlfdmFsX3NlcCk7CisgICAgY2hhciAqdmFsID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGtleSAmJiAqa2V5ICYmIHN0cnNwbigqYnVmLCBrZXlfdmFsX3NlcCkpIHsKKyAgICAgICAgKCpidWYpKys7CisgICAgICAgIHZhbCA9IGF2X2dldF90b2tlbihidWYsIHBhaXJzX3NlcCk7CisgICAgfQorCisgICAgaWYgKGtleSAmJiAqa2V5ICYmIHZhbCAmJiAqdmFsKQorICAgICAgICByZXQgPSBhdl9kaWN0X3NldChwbSwga2V5LCB2YWwsIGZsYWdzKTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKworICAgIGF2X2ZyZWVwKCZrZXkpOworICAgIGF2X2ZyZWVwKCZ2YWwpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2X2RpY3RfcGFyc2Vfc3RyaW5nKEFWRGljdGlvbmFyeSAqKnBtLCBjb25zdCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5X3ZhbF9zZXAsIGNvbnN0IGNoYXIgKnBhaXJzX3NlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICghc3RyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGlnbm9yZSBTVFJEVVAgZmxhZ3MgKi8KKyAgICBmbGFncyAmPSB+KEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZIHwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworCisgICAgd2hpbGUgKCpzdHIpIHsKKyAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9rZXlfdmFsdWVfcGFpcihwbSwgJnN0ciwga2V5X3ZhbF9zZXAsIHBhaXJzX3NlcCwgZmxhZ3MpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmICgqc3RyKQorICAgICAgICAgICAgc3RyKys7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXZfZGljdF9mcmVlKEFWRGljdGlvbmFyeSAqKnBtKQoreworICAgIEFWRGljdGlvbmFyeSAqbSA9ICpwbTsKKworICAgIGlmIChtKSB7CisgICAgICAgIHdoaWxlIChtLT5jb3VudC0tKSB7CisgICAgICAgICAgICBhdl9mcmVlKG0tPmVsZW1zW20tPmNvdW50XS5rZXkpOworICAgICAgICAgICAgYXZfZnJlZShtLT5lbGVtc1ttLT5jb3VudF0udmFsdWUpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWUobS0+ZWxlbXMpOworICAgIH0KKyAgICBhdl9mcmVlcChwbSk7Cit9CisKK3ZvaWQgYXZfZGljdF9jb3B5KEFWRGljdGlvbmFyeSAqKmRzdCwgY29uc3QgQVZEaWN0aW9uYXJ5ICpzcmMsIGludCBmbGFncykKK3sKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IE5VTEw7CisKKyAgICB3aGlsZSAoKHQgPSBhdl9kaWN0X2dldChzcmMsICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKKyAgICAgICAgYXZfZGljdF9zZXQoZHN0LCB0LT5rZXksIHQtPnZhbHVlLCBmbGFncyk7Cit9CisKK2ludCBhdl9kaWN0X2dldF9zdHJpbmcoY29uc3QgQVZEaWN0aW9uYXJ5ICptLCBjaGFyICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGtleV92YWxfc2VwLCBjb25zdCBjaGFyIHBhaXJzX3NlcCkKK3sKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IE5VTEw7CisgICAgQVZCUHJpbnQgYnByaW50OworICAgIGludCBjbnQgPSAwOworICAgIGNoYXIgc3BlY2lhbF9jaGFyc1tdID0ge3BhaXJzX3NlcCwga2V5X3ZhbF9zZXAsICdcMCd9OworCisgICAgaWYgKCFidWZmZXIgfHwgcGFpcnNfc2VwID09ICdcMCcgfHwga2V5X3ZhbF9zZXAgPT0gJ1wwJyB8fCBwYWlyc19zZXAgPT0ga2V5X3ZhbF9zZXAgfHwKKyAgICAgICAgcGFpcnNfc2VwID09ICdcXCcgfHwga2V5X3ZhbF9zZXAgPT0gJ1xcJykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmICghYXZfZGljdF9jb3VudChtKSkgeworICAgICAgICAqYnVmZmVyID0gYXZfc3RyZHVwKCIiKTsKKyAgICAgICAgcmV0dXJuICpidWZmZXIgPyAwIDogQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF2X2JwcmludF9pbml0KCZicHJpbnQsIDY0LCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgIHdoaWxlICgodCA9IGF2X2RpY3RfZ2V0KG0sICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICBpZiAoY250KyspCisgICAgICAgICAgICBhdl9icHJpbnRfYXBwZW5kX2RhdGEoJmJwcmludCwgJnBhaXJzX3NlcCwgMSk7CisgICAgICAgIGF2X2JwcmludF9lc2NhcGUoJmJwcmludCwgdC0+a2V5LCBzcGVjaWFsX2NoYXJzLCBBVl9FU0NBUEVfTU9ERV9CQUNLU0xBU0gsIDApOworICAgICAgICBhdl9icHJpbnRfYXBwZW5kX2RhdGEoJmJwcmludCwgJmtleV92YWxfc2VwLCAxKTsKKyAgICAgICAgYXZfYnByaW50X2VzY2FwZSgmYnByaW50LCB0LT52YWx1ZSwgc3BlY2lhbF9jaGFycywgQVZfRVNDQVBFX01PREVfQkFDS1NMQVNILCAwKTsKKyAgICB9CisgICAgcmV0dXJuIGF2X2JwcmludF9maW5hbGl6ZSgmYnByaW50LCBidWZmZXIpOworfQorCisjaWZkZWYgVEVTVAorc3RhdGljIHZvaWQgcHJpbnRfZGljdChjb25zdCBBVkRpY3Rpb25hcnkgKm0pCit7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBOVUxMOworICAgIHdoaWxlICgodCA9IGF2X2RpY3RfZ2V0KG0sICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKKyAgICAgICAgcHJpbnRmKCIlcyAlcyAgICIsIHQtPmtleSwgdC0+dmFsdWUpOworICAgIHByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zZXBhcmF0b3JzKGNvbnN0IEFWRGljdGlvbmFyeSAqbSwgY29uc3QgY2hhciBwYWlyLCBjb25zdCBjaGFyIHZhbCkKK3sKKyAgICBBVkRpY3Rpb25hcnkgKmRpY3QgPSBOVUxMOworICAgIGNoYXIgcGFpcnNbXSA9IHtwYWlyICwgJ1wwJ307CisgICAgY2hhciB2YWxzW10gID0ge3ZhbCwgJ1wwJ307CisKKyAgICBjaGFyICpidWZmZXIgPSBOVUxMOworICAgIGF2X2RpY3RfY29weSgmZGljdCwgbSwgMCk7CisgICAgcHJpbnRfZGljdChkaWN0KTsKKyAgICBhdl9kaWN0X2dldF9zdHJpbmcoZGljdCwgJmJ1ZmZlciwgdmFsLCBwYWlyKTsKKyAgICBwcmludGYoIiVzXG4iLCBidWZmZXIpOworICAgIGF2X2RpY3RfZnJlZSgmZGljdCk7CisgICAgYXZfZGljdF9wYXJzZV9zdHJpbmcoJmRpY3QsIGJ1ZmZlciwgdmFscywgcGFpcnMsIDApOworICAgIGF2X2ZyZWVwKCZidWZmZXIpOworICAgIHByaW50X2RpY3QoZGljdCk7CisgICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBBVkRpY3Rpb25hcnkgKmRpY3QgPSBOVUxMOworICAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CisKKyAgICBwcmludGYoIlRlc3RpbmcgYXZfZGljdF9nZXRfc3RyaW5nKCkgYW5kIGF2X2RpY3RfcGFyc2Vfc3RyaW5nKClcbiIpOworICAgIGF2X2RpY3RfZ2V0X3N0cmluZyhkaWN0LCAmYnVmZmVyLCAnPScsICcsJyk7CisgICAgcHJpbnRmKCIlc1xuIiwgYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmYnVmZmVyKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImFhYSIsICJhYWEiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImIsYiIsICJiYmIiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImM9YyIsICJjY2MiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImRkZCIsICJkLGQiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImVlZSIsICJlPWUiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImYsZiIsICJmPWYiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImc9ZyIsICJnLGciLCAwKTsKKyAgICB0ZXN0X3NlcGFyYXRvcnMoZGljdCwgJywnLCAnPScpOworICAgIGF2X2RpY3RfZnJlZSgmZGljdCk7CisgICAgYXZfZGljdF9zZXQoJmRpY3QsICJhYWEiLCAiYWFhIiwgMCk7CisgICAgYXZfZGljdF9zZXQoJmRpY3QsICJiYmIiLCAiYmJiIiwgMCk7CisgICAgYXZfZGljdF9zZXQoJmRpY3QsICJjY2MiLCAiY2NjIiwgMCk7CisgICAgYXZfZGljdF9zZXQoJmRpY3QsICJcXCw9XCdcIiIsICJcXCw9XCdcIiIsIDApOworICAgIHRlc3Rfc2VwYXJhdG9ycyhkaWN0LCAnIicsICAnPScpOworICAgIHRlc3Rfc2VwYXJhdG9ycyhkaWN0LCAnXCcnLCAnPScpOworICAgIHRlc3Rfc2VwYXJhdG9ycyhkaWN0LCAnLCcsICciJyk7CisgICAgdGVzdF9zZXBhcmF0b3JzKGRpY3QsICcsJywgJ1wnJyk7CisgICAgdGVzdF9zZXBhcmF0b3JzKGRpY3QsICdcJycsICciJyk7CisgICAgdGVzdF9zZXBhcmF0b3JzKGRpY3QsICciJywgJ1wnJyk7CisgICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2RpY3QuaCBiL2ZmbXBlZy9saWJhdnV0aWwvZGljdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZGY2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2RpY3QuaApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUHVibGljIGRpY3Rpb25hcnkgQVBJLgorICogQGRlcHJlY2F0ZWQKKyAqICBBVkRpY3Rpb25hcnkgaXMgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsaWJhdi4gSXQgaXMgYm90aCBpbgorICogIGltcGxlbWVudGF0aW9uIGFzIHdlbGwgYXMgQVBJIGluZWZmaWNpZW50LiBJdCBkb2VzIG5vdCBzY2FsZSBhbmQgaXMKKyAqICBleHRyZW1lbHkgc2xvdyB3aXRoIGxhcmdlIGRpY3Rpb25hcmllcy4KKyAqICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5ldyBjb2RlIHVzZXMgb3VyIHRyZWUgY29udGFpbmVyIGZyb20gdHJlZS5jL2gKKyAqICB3aGVyZSBhcHBsaWNhYmxlLCB3aGljaCB1c2VzIEFWTCB0cmVlcyB0byBhY2hpZXZlIE8obG9nIG4pIHBlcmZvcm1hbmNlLgorICovCisKKyNpZm5kZWYgQVZVVElMX0RJQ1RfSAorI2RlZmluZSBBVlVUSUxfRElDVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInZlcnNpb24uaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBsYXZ1X2RpY3QgQVZEaWN0aW9uYXJ5CisgKiBAaW5ncm91cCBsYXZ1X2RhdGEKKyAqCisgKiBAYnJpZWYgU2ltcGxlIGtleTp2YWx1ZSBzdG9yZQorICoKKyAqIEB7CisgKiBEaWN0aW9uYXJpZXMgYXJlIHVzZWQgZm9yIHN0b3Jpbmcga2V5OnZhbHVlIHBhaXJzLiBUbyBjcmVhdGUKKyAqIGFuIEFWRGljdGlvbmFyeSwgc2ltcGx5IHBhc3MgYW4gYWRkcmVzcyBvZiBhIE5VTEwgcG9pbnRlciB0bworICogYXZfZGljdF9zZXQoKS4gTlVMTCBjYW4gYmUgdXNlZCBhcyBhbiBlbXB0eSBkaWN0aW9uYXJ5IHdoZXJldmVyCisgKiBhIHBvaW50ZXIgdG8gYW4gQVZEaWN0aW9uYXJ5IGlzIHJlcXVpcmVkLgorICogVXNlIGF2X2RpY3RfZ2V0KCkgdG8gcmV0cmlldmUgYW4gZW50cnkgb3IgaXRlcmF0ZSBvdmVyIGFsbAorICogZW50cmllcyBhbmQgZmluYWxseSBhdl9kaWN0X2ZyZWUoKSB0byBmcmVlIHRoZSBkaWN0aW9uYXJ5CisgKiBhbmQgYWxsIGl0cyBjb250ZW50cy4KKyAqCisgQGNvZGUKKyAgIEFWRGljdGlvbmFyeSAqZCA9IE5VTEw7ICAgICAgICAgICAvLyAiY3JlYXRlIiBhbiBlbXB0eSBkaWN0aW9uYXJ5CisgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IE5VTEw7CisKKyAgIGF2X2RpY3Rfc2V0KCZkLCAiZm9vIiwgImJhciIsIDApOyAvLyBhZGQgYW4gZW50cnkKKworICAgY2hhciAqayA9IGF2X3N0cmR1cCgia2V5Iik7ICAgICAgIC8vIGlmIHlvdXIgc3RyaW5ncyBhcmUgYWxyZWFkeSBhbGxvY2F0ZWQsCisgICBjaGFyICp2ID0gYXZfc3RyZHVwKCJ2YWx1ZSIpOyAgICAgLy8geW91IGNhbiBhdm9pZCBjb3B5aW5nIHRoZW0gbGlrZSB0aGlzCisgICBhdl9kaWN0X3NldCgmZCwgaywgdiwgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkgfCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisKKyAgIHdoaWxlICh0ID0gYXZfZGljdF9nZXQoZCwgIiIsIHQsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpIHsKKyAgICAgICA8Li4uLj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBhbGwgZW50cmllcyBpbiBkCisgICB9CisgICBhdl9kaWN0X2ZyZWUoJmQpOworIEBlbmRjb2RlCisgKgorICovCisKKyNkZWZpbmUgQVZfRElDVF9NQVRDSF9DQVNFICAgICAgMSAgIC8qKjwgT25seSBnZXQgYW4gZW50cnkgd2l0aCBleGFjdC1jYXNlIGtleSBtYXRjaC4gT25seSByZWxldmFudCBpbiBhdl9kaWN0X2dldCgpLiAqLworI2RlZmluZSBBVl9ESUNUX0lHTk9SRV9TVUZGSVggICAyICAgLyoqPCBSZXR1cm4gZmlyc3QgZW50cnkgaW4gYSBkaWN0aW9uYXJ5IHdob3NlIGZpcnN0IHBhcnQgY29ycmVzcG9uZHMgdG8gdGhlIHNlYXJjaCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yaW5nIHRoZSBzdWZmaXggb2YgdGhlIGZvdW5kIGtleSBzdHJpbmcuIE9ubHkgcmVsZXZhbnQgaW4gYXZfZGljdF9nZXQoKS4gKi8KKyNkZWZpbmUgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkgNCAgIC8qKjwgVGFrZSBvd25lcnNoaXAgb2YgYSBrZXkgdGhhdCdzIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIHdpdGggYXZfbWFsbG9jKCkgb3IgYW5vdGhlciBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwgOCAgIC8qKjwgVGFrZSBvd25lcnNoaXAgb2YgYSB2YWx1ZSB0aGF0J3MgYmVlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgd2l0aCBhdl9tYWxsb2MoKSBvciBhbm90aGVyIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLiAqLworI2RlZmluZSBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFIDE2ICAgLy8vPCBEb24ndCBvdmVyd3JpdGUgZXhpc3RpbmcgZW50cmllcy4KKyNkZWZpbmUgQVZfRElDVF9BUFBFTkQgICAgICAgICAzMiAgIC8qKjwgSWYgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RzLCBhcHBlbmQgdG8gaXQuICBOb3RlIHRoYXQgbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyIGlzIGFkZGVkLCB0aGUgc3RyaW5ncyBhcmUgc2ltcGx5IGNvbmNhdGVuYXRlZC4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgQVZEaWN0aW9uYXJ5RW50cnkgeworICAgIGNoYXIgKmtleTsKKyAgICBjaGFyICp2YWx1ZTsKK30gQVZEaWN0aW9uYXJ5RW50cnk7CisKK3R5cGVkZWYgc3RydWN0IEFWRGljdGlvbmFyeSBBVkRpY3Rpb25hcnk7CisKKy8qKgorICogR2V0IGEgZGljdGlvbmFyeSBlbnRyeSB3aXRoIG1hdGNoaW5nIGtleS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgZW50cnkga2V5IG9yIHZhbHVlIG11c3Qgbm90IGJlIGNoYW5nZWQsIG9yIGl0IHdpbGwKKyAqIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAqCisgKiBUbyBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBkaWN0aW9uYXJ5IGVudHJpZXMsIHlvdSBjYW4gc2V0IHRoZSBtYXRjaGluZyBrZXkKKyAqIHRvIHRoZSBudWxsIHN0cmluZyAiIiBhbmQgc2V0IHRoZSBBVl9ESUNUX0lHTk9SRV9TVUZGSVggZmxhZy4KKyAqCisgKiBAcGFyYW0gcHJldiBTZXQgdG8gdGhlIHByZXZpb3VzIG1hdGNoaW5nIGVsZW1lbnQgdG8gZmluZCB0aGUgbmV4dC4KKyAqICAgICAgICAgICAgIElmIHNldCB0byBOVUxMIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGlzIHJldHVybmVkLgorICogQHBhcmFtIGtleSBtYXRjaGluZyBrZXkKKyAqIEBwYXJhbSBmbGFncyBhIGNvbGxlY3Rpb24gb2YgQVZfRElDVF8qIGZsYWdzIGNvbnRyb2xsaW5nIGhvdyB0aGUgZW50cnkgaXMgcmV0cmlldmVkCisgKiBAcmV0dXJuIGZvdW5kIGVudHJ5IG9yIE5VTEwgaW4gY2FzZSBubyBtYXRjaGluZyBlbnRyeSB3YXMgZm91bmQgaW4gdGhlIGRpY3Rpb25hcnkKKyAqLworQVZEaWN0aW9uYXJ5RW50cnkgKmF2X2RpY3RfZ2V0KGNvbnN0IEFWRGljdGlvbmFyeSAqbSwgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRGljdGlvbmFyeUVudHJ5ICpwcmV2LCBpbnQgZmxhZ3MpOworCisvKioKKyAqIEdldCBudW1iZXIgb2YgZW50cmllcyBpbiBkaWN0aW9uYXJ5LgorICoKKyAqIEBwYXJhbSBtIGRpY3Rpb25hcnkKKyAqIEByZXR1cm4gIG51bWJlciBvZiBlbnRyaWVzIGluIGRpY3Rpb25hcnkKKyAqLworaW50IGF2X2RpY3RfY291bnQoY29uc3QgQVZEaWN0aW9uYXJ5ICptKTsKKworLyoqCisgKiBTZXQgdGhlIGdpdmVuIGVudHJ5IGluICpwbSwgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZW50cnkuCisgKgorICogTm90ZTogSWYgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkgb3IgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwgaXMgc2V0LAorICogdGhlc2UgYXJndW1lbnRzIHdpbGwgYmUgZnJlZWQgb24gZXJyb3IuCisgKgorICogQHBhcmFtIHBtIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIGEgZGljdGlvbmFyeSBzdHJ1Y3QuIElmICpwbSBpcyBOVUxMCisgKiBhIGRpY3Rpb25hcnkgc3RydWN0IGlzIGFsbG9jYXRlZCBhbmQgcHV0IGluICpwbS4KKyAqIEBwYXJhbSBrZXkgZW50cnkga2V5IHRvIGFkZCB0byAqcG0gKHdpbGwgYmUgYXZfc3RyZHVwZWQgZGVwZW5kaW5nIG9uIGZsYWdzKQorICogQHBhcmFtIHZhbHVlIGVudHJ5IHZhbHVlIHRvIGFkZCB0byAqcG0gKHdpbGwgYmUgYXZfc3RyZHVwZWQgZGVwZW5kaW5nIG9uIGZsYWdzKS4KKyAqICAgICAgICBQYXNzaW5nIGEgTlVMTCB2YWx1ZSB3aWxsIGNhdXNlIGFuIGV4aXN0aW5nIGVudHJ5IHRvIGJlIGRlbGV0ZWQuCisgKiBAcmV0dXJuID49IDAgb24gc3VjY2VzcyBvdGhlcndpc2UgYW4gZXJyb3IgY29kZSA8MAorICovCitpbnQgYXZfZGljdF9zZXQoQVZEaWN0aW9uYXJ5ICoqcG0sIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUsIGludCBmbGFncyk7CisKKy8qKgorICogQ29udmVuaWVuY2Ugd3JhcHBlciBmb3IgYXZfZGljdF9zZXQgdGhhdCBjb252ZXJ0cyB0aGUgdmFsdWUgdG8gYSBzdHJpbmcKKyAqIGFuZCBzdG9yZXMgaXQuCisgKgorICogTm90ZTogSWYgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkgaXMgc2V0LCBrZXkgd2lsbCBiZSBmcmVlZCBvbiBlcnJvci4KKyAqLworaW50IGF2X2RpY3Rfc2V0X2ludChBVkRpY3Rpb25hcnkgKipwbSwgY29uc3QgY2hhciAqa2V5LCBpbnQ2NF90IHZhbHVlLCBpbnQgZmxhZ3MpOworCisvKioKKyAqIFBhcnNlIHRoZSBrZXkvdmFsdWUgcGFpcnMgbGlzdCBhbmQgYWRkIHRoZSBwYXJzZWQgZW50cmllcyB0byBhIGRpY3Rpb25hcnkuCisgKgorICogSW4gY2FzZSBvZiBmYWlsdXJlLCBhbGwgdGhlIHN1Y2Nlc3NmdWxseSBzZXQgZW50cmllcyBhcmUgc3RvcmVkIGluCisgKiAqcG0uIFlvdSBtYXkgbmVlZCB0byBtYW51YWxseSBmcmVlIHRoZSBjcmVhdGVkIGRpY3Rpb25hcnkuCisgKgorICogQHBhcmFtIGtleV92YWxfc2VwICBhIDAtdGVybWluYXRlZCBsaXN0IG9mIGNoYXJhY3RlcnMgdXNlZCB0byBzZXBhcmF0ZQorICogICAgICAgICAgICAgICAgICAgICBrZXkgZnJvbSB2YWx1ZQorICogQHBhcmFtIHBhaXJzX3NlcCAgICBhIDAtdGVybWluYXRlZCBsaXN0IG9mIGNoYXJhY3RlcnMgdXNlZCB0byBzZXBhcmF0ZQorICogICAgICAgICAgICAgICAgICAgICB0d28gcGFpcnMgZnJvbSBlYWNoIG90aGVyCisgKiBAcGFyYW0gZmxhZ3MgICAgICAgIGZsYWdzIHRvIHVzZSB3aGVuIGFkZGluZyB0byBkaWN0aW9uYXJ5LgorICogICAgICAgICAgICAgICAgICAgICBBVl9ESUNUX0RPTlRfU1RSRFVQX0tFWSBhbmQgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwKKyAqICAgICAgICAgICAgICAgICAgICAgYXJlIGlnbm9yZWQgc2luY2UgdGhlIGtleS92YWx1ZSB0b2tlbnMgd2lsbCBhbHdheXMKKyAqICAgICAgICAgICAgICAgICAgICAgYmUgZHVwbGljYXRlZC4KKyAqIEByZXR1cm4gICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgYXZfZGljdF9wYXJzZV9zdHJpbmcoQVZEaWN0aW9uYXJ5ICoqcG0sIGNvbnN0IGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlfdmFsX3NlcCwgY29uc3QgY2hhciAqcGFpcnNfc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisKKy8qKgorICogQ29weSBlbnRyaWVzIGZyb20gb25lIEFWRGljdGlvbmFyeSBzdHJ1Y3QgaW50byBhbm90aGVyLgorICogQHBhcmFtIGRzdCBwb2ludGVyIHRvIGEgcG9pbnRlciB0byBhIEFWRGljdGlvbmFyeSBzdHJ1Y3QuIElmICpkc3QgaXMgTlVMTCwKKyAqICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIGEgc3RydWN0IGZvciB5b3UgYW5kIHB1dCBpdCBpbiAqZHN0CisgKiBAcGFyYW0gc3JjIHBvaW50ZXIgdG8gc291cmNlIEFWRGljdGlvbmFyeSBzdHJ1Y3QKKyAqIEBwYXJhbSBmbGFncyBmbGFncyB0byB1c2Ugd2hlbiBzZXR0aW5nIGVudHJpZXMgaW4gKmRzdAorICogQG5vdGUgbWV0YWRhdGEgaXMgcmVhZCB1c2luZyB0aGUgQVZfRElDVF9JR05PUkVfU1VGRklYIGZsYWcKKyAqLwordm9pZCBhdl9kaWN0X2NvcHkoQVZEaWN0aW9uYXJ5ICoqZHN0LCBjb25zdCBBVkRpY3Rpb25hcnkgKnNyYywgaW50IGZsYWdzKTsKKworLyoqCisgKiBGcmVlIGFsbCB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYW4gQVZEaWN0aW9uYXJ5IHN0cnVjdAorICogYW5kIGFsbCBrZXlzIGFuZCB2YWx1ZXMuCisgKi8KK3ZvaWQgYXZfZGljdF9mcmVlKEFWRGljdGlvbmFyeSAqKm0pOworCisvKioKKyAqIEdldCBkaWN0aW9uYXJ5IGVudHJpZXMgYXMgYSBzdHJpbmcuCisgKgorICogQ3JlYXRlIGEgc3RyaW5nIGNvbnRhaW5pbmcgZGljdGlvbmFyeSdzIGVudHJpZXMuCisgKiBTdWNoIHN0cmluZyBtYXkgYmUgcGFzc2VkIGJhY2sgdG8gYXZfZGljdF9wYXJzZV9zdHJpbmcoKS4KKyAqIEBub3RlIFN0cmluZyBpcyBlc2NhcGVkIHdpdGggYmFja3NsYXNoZXMgKCdcJykuCisgKgorICogQHBhcmFtW2luXSAgbSAgICAgICAgICAgICBkaWN0aW9uYXJ5CisgKiBAcGFyYW1bb3V0XSBidWZmZXIgICAgICAgIFBvaW50ZXIgdG8gYnVmZmVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgd2l0aCBzdHJpbmcgY29udGFpbmcgZW50cmllcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB3aGVuIGlzIG5vIGxvbmdlciBuZWVkZWQuCisgKiBAcGFyYW1baW5dICBrZXlfdmFsX3NlcCAgIGNoYXJhY3RlciB1c2VkIHRvIHNlcGFyYXRlIGtleSBmcm9tIHZhbHVlCisgKiBAcGFyYW1baW5dICBwYWlyc19zZXAgICAgIGNoYXJhY3RlciB1c2VkIHRvIHNlcGFyYXRlIHR3byBwYWlycyBmcm9tIGVhY2ggb3RoZXIKKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgPj0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBlcnJvcgorICogQHdhcm5pbmcgU2VwYXJhdG9ycyBjYW5ub3QgYmUgbmVpdGhlciAnXFwnIG5vciAnXDAnLiBUaGV5IGFsc28gY2Fubm90IGJlIHRoZSBzYW1lLgorICovCitpbnQgYXZfZGljdF9nZXRfc3RyaW5nKGNvbnN0IEFWRGljdGlvbmFyeSAqbSwgY2hhciAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBrZXlfdmFsX3NlcCwgY29uc3QgY2hhciBwYWlyc19zZXApOworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9ESUNUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvZGlzcGxheS5jIGIvZmZtcGVnL2xpYmF2dXRpbC9kaXNwbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlOGFhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvZGlzcGxheS5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgVml0dG9yaW8gR2lvdmFyYSA8dml0dG9yaW8uZ2lvdmFyYUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisjaW5jbHVkZSAibWF0aGVtYXRpY3MuaCIKKworLy8gZml4ZWQgcG9pbnQgdG8gZG91YmxlCisjZGVmaW5lIENPTlZfRlAoeCkgKChkb3VibGUpICh4KSkgLyAoMSA8PCAxNikKKworLy8gZG91YmxlIHRvIGZpeGVkIHBvaW50CisjZGVmaW5lIENPTlZfREIoeCkgKGludDMyX3QpICgoeCkgKiAoMSA8PCAxNikpCisKK2RvdWJsZSBhdl9kaXNwbGF5X3JvdGF0aW9uX2dldChjb25zdCBpbnQzMl90IG1hdHJpeFs5XSkKK3sKKyAgICBkb3VibGUgcm90YXRpb24sIHNjYWxlWzJdOworCisgICAgc2NhbGVbMF0gPSBoeXBvdChDT05WX0ZQKG1hdHJpeFswXSksIENPTlZfRlAobWF0cml4WzNdKSk7CisgICAgc2NhbGVbMV0gPSBoeXBvdChDT05WX0ZQKG1hdHJpeFsxXSksIENPTlZfRlAobWF0cml4WzRdKSk7CisKKyAgICBpZiAoc2NhbGVbMF0gPT0gMC4wIHx8IHNjYWxlWzFdID09IDAuMCkKKyAgICAgICAgcmV0dXJuIE5BTjsKKworICAgIHJvdGF0aW9uID0gYXRhbjIoQ09OVl9GUChtYXRyaXhbMV0pIC8gc2NhbGVbMV0sCisgICAgICAgICAgICAgICAgICAgICBDT05WX0ZQKG1hdHJpeFswXSkgLyBzY2FsZVswXSkgKiAxODAgLyBNX1BJOworCisgICAgcmV0dXJuIHJvdGF0aW9uOworfQorCit2b2lkIGF2X2Rpc3BsYXlfcm90YXRpb25fc2V0KGludDMyX3QgbWF0cml4WzldLCBkb3VibGUgYW5nbGUpCit7CisgICAgZG91YmxlIHJhZGlhbnMgPSBhbmdsZSAqIE1fUEkgLyAxODAuMGY7CisgICAgZG91YmxlIGMgPSBjb3MocmFkaWFucyk7CisgICAgZG91YmxlIHMgPSBzaW4ocmFkaWFucyk7CisKKyAgICBtZW1zZXQobWF0cml4LCAwLCA5ICogc2l6ZW9mKGludDMyX3QpKTsKKworICAgIG1hdHJpeFswXSA9IENPTlZfREIoYyk7CisgICAgbWF0cml4WzFdID0gQ09OVl9EQigtcyk7CisgICAgbWF0cml4WzNdID0gQ09OVl9EQihzKTsKKyAgICBtYXRyaXhbNF0gPSBDT05WX0RCKGMpOworICAgIG1hdHJpeFs4XSA9IDEgPDwgMzA7Cit9CisKK3ZvaWQgYXZfZGlzcGxheV9tYXRyaXhfZmxpcChpbnQzMl90IG1hdHJpeFs5XSwgaW50IGhmbGlwLCBpbnQgdmZsaXApCit7CisgICAgaW50IGk7CisgICAgY29uc3QgaW50IGZsaXBbXSA9IHsgMSAtIDIgKiAoISFoZmxpcCksIDEgLSAyICogKCEhdmZsaXApLCAxIH07CisKKyAgICBpZiAoaGZsaXAgfHwgdmZsaXApCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisgICAgICAgICAgICBtYXRyaXhbaV0gKj0gZmxpcFtpICUgM107Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2Rpc3BsYXkuaCBiL2ZmbXBlZy9saWJhdnV0aWwvZGlzcGxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYjkzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2Rpc3BsYXkuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFZpdHRvcmlvIEdpb3ZhcmEgPHZpdHRvcmlvLmdpb3ZhcmFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9ESVNQTEFZX0gKKyNkZWZpbmUgQVZVVElMX0RJU1BMQVlfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKgorICogVGhlIGRpc3BsYXkgdHJhbnNmb3JtYXRpb24gbWF0cml4IHNwZWNpZmllcyBhbiBhZmZpbmUgdHJhbnNmb3JtYXRpb24gdGhhdAorICogc2hvdWxkIGJlIGFwcGxpZWQgdG8gdmlkZW8gZnJhbWVzIGZvciBjb3JyZWN0IHByZXNlbnRhdGlvbi4gSXQgaXMgY29tcGF0aWJsZQorICogd2l0aCB0aGUgbWF0cmljZXMgc3RvcmVkIGluIHRoZSBJU08vSUVDIDE0NDk2LTEyIGNvbnRhaW5lciBmb3JtYXQuCisgKgorICogVGhlIGRhdGEgaXMgYSAzeDMgbWF0cml4IHJlcHJlc2VudGVkIGFzIGEgOS1lbGVtZW50IGFycmF5OgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYSBiIHUgfAorICogICAoYSwgYiwgdSwgYywgZCwgdiwgeCwgeSwgdykgLT4gfCBjIGQgdiB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHggeSB3IHwKKyAqCisgKiBBbGwgbnVtYmVycyBhcmUgc3RvcmVkIGluIG5hdGl2ZSBlbmRpYW5uZXNzLCBhcyAxNi4xNiBmaXhlZC1wb2ludCB2YWx1ZXMsCisgKiBleGNlcHQgZm9yIHUsIHYgYW5kIHcsIHdoaWNoIGFyZSBzdG9yZWQgYXMgMi4zMCBmaXhlZC1wb2ludCB2YWx1ZXMuCisgKgorICogVGhlIHRyYW5zZm9ybWF0aW9uIG1hcHMgYSBwb2ludCAocCwgcSkgaW4gdGhlIHNvdXJjZSAocHJlLXRyYW5zZm9ybWF0aW9uKQorICogZnJhbWUgdG8gdGhlIHBvaW50IChwJywgcScpIGluIHRoZSBkZXN0aW5hdGlvbiAocG9zdC10cmFuc2Zvcm1hdGlvbikgZnJhbWUgYXMKKyAqIGZvbGxvd3M6CisgKiAgICAgICAgICAgICAgIHwgYSBiIHUgfAorICogICAocCwgcSwgMSkgLiB8IGMgZCB2IHwgPSB6ICogKHAnLCBxJywgMSkKKyAqICAgICAgICAgICAgICAgfCB4IHkgdyB8CisgKgorICogVGhlIHRyYW5zZm9ybWF0aW9uIGNhbiBhbHNvIGJlIG1vcmUgZXhwbGljaXRseSB3cml0dGVuIGluIGNvbXBvbmVudHMgYXMKKyAqIGZvbGxvd3M6CisgKiAgIHAnID0gKGEgKiBwICsgYyAqIHEgKyB4KSAvIHo7CisgKiAgIHEnID0gKGIgKiBwICsgZCAqIHEgKyB5KSAvIHo7CisgKiAgIHogID0gIHUgKiBwICsgdiAqIHEgKyB3CisgKi8KKworLyoqCisgKiBFeHRyYWN0IHRoZSByb3RhdGlvbiBjb21wb25lbnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAqCisgKiBAcGFyYW0gbWF0cml4IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKKyAqIEByZXR1cm4gdGhlIGFuZ2xlIChpbiBkZWdyZWVzKSBieSB3aGljaCB0aGUgdHJhbnNmb3JtYXRpb24gcm90YXRlcyB0aGUgZnJhbWUuCisgKiAgICAgICAgIFRoZSBhbmdsZSB3aWxsIGJlIGluIHJhbmdlIFstMTgwLjAsIDE4MC4wXSwgb3IgTmFOIGlmIHRoZSBtYXRyaXggaXMKKyAqICAgICAgICAgc2luZ3VsYXIuCisgKgorICogQG5vdGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUgaW5oZXJlbnRseSBpbmV4YWN0LCBzbyBjYWxsZXJzIGFyZQorICogICAgICAgcmVjb21tZW5kZWQgdG8gcm91bmQgdGhlIHJldHVybiB2YWx1ZSB0byBuZWFyZXN0IGludGVnZXIgYmVmb3JlIHVzZS4KKyAqLworZG91YmxlIGF2X2Rpc3BsYXlfcm90YXRpb25fZ2V0KGNvbnN0IGludDMyX3QgbWF0cml4WzldKTsKKworLyoqCisgKiBJbml0aWFsaXplIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4IGRlc2NyaWJpbmcgYSBwdXJlIHJvdGF0aW9uIGJ5IHRoZQorICogc3BlY2lmaWVkIGFuZ2xlIChpbiBkZWdyZWVzKS4KKyAqCisgKiBAcGFyYW0gbWF0cml4IGFuIGFsbG9jYXRlZCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKHdpbGwgYmUgZnVsbHkgb3ZlcndyaXR0ZW4KKyAqICAgICAgICAgICAgICAgYnkgdGhpcyBmdW5jdGlvbikKKyAqIEBwYXJhbSBhbmdsZSByb3RhdGlvbiBhbmdsZSBpbiBkZWdyZWVzLgorICovCit2b2lkIGF2X2Rpc3BsYXlfcm90YXRpb25fc2V0KGludDMyX3QgbWF0cml4WzldLCBkb3VibGUgYW5nbGUpOworCisvKioKKyAqIEZsaXAgdGhlIGlucHV0IG1hdHJpeCBob3Jpem9udGFsbHkgYW5kL29yIHZlcnRpY2FsbHkuCisgKgorICogQHBhcmFtIG1hdHJpeCBhbiBhbGxvY2F0ZWQgdHJhbnNmb3JtYXRpb24gbWF0cml4CisgKiBAcGFyYW0gaGZsaXAgd2hldGhlciB0aGUgbWF0cml4IHNob3VsZCBiZSBmbGlwcGVkIGhvcml6b250YWxseQorICogQHBhcmFtIHZmbGlwIHdoZXRoZXIgdGhlIG1hdHJpeCBzaG91bGQgYmUgZmxpcHBlZCB2ZXJ0aWNhbGx5CisgKi8KK3ZvaWQgYXZfZGlzcGxheV9tYXRyaXhfZmxpcChpbnQzMl90IG1hdHJpeFs5XSwgaW50IGhmbGlwLCBpbnQgdmZsaXApOworCisjZW5kaWYgLyogQVZVVElMX0RJU1BMQVlfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9kb3dubWl4X2luZm8uYyBiL2ZmbXBlZy9saWJhdnV0aWwvZG93bm1peF9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzNGM2YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvZG93bm1peF9pbmZvLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaW0gV2Fsa2VyIDx0ZHNreXdhbGtlckBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkb3dubWl4X2luZm8uaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorCitBVkRvd25taXhJbmZvICphdl9kb3dubWl4X2luZm9fdXBkYXRlX3NpZGVfZGF0YShBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZyYW1lU2lkZURhdGEgKnNpZGVfZGF0YTsKKworICAgIHNpZGVfZGF0YSA9IGF2X2ZyYW1lX2dldF9zaWRlX2RhdGEoZnJhbWUsIEFWX0ZSQU1FX0RBVEFfRE9XTk1JWF9JTkZPKTsKKworICAgIGlmICghc2lkZV9kYXRhKQorICAgICAgICBzaWRlX2RhdGEgPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKGZyYW1lLCBBVl9GUkFNRV9EQVRBX0RPV05NSVhfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQVZEb3dubWl4SW5mbykpOworCisgICAgaWYgKCFzaWRlX2RhdGEpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIChBVkRvd25taXhJbmZvKilzaWRlX2RhdGEtPmRhdGE7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2Rvd25taXhfaW5mby5oIGIvZmZtcGVnL2xpYmF2dXRpbC9kb3dubWl4X2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjFjZjViCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9kb3dubWl4X2luZm8uaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaW0gV2Fsa2VyIDx0ZHNreXdhbGtlckBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0RPV05NSVhfSU5GT19ICisjZGVmaW5lIEFWVVRJTF9ET1dOTUlYX0lORk9fSAorCisjaW5jbHVkZSAiZnJhbWUuaCIKKworLyoqCisgKiBAZmlsZQorICogYXVkaW8gZG93bm1peCBtZWRhdGF0YQorICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgbGF2dV9hdWRpbworICogQHsKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBkb3dubWl4X2luZm8gQXVkaW8gZG93bm1peCBtZXRhZGF0YQorICogQHsKKyAqLworCisvKioKKyAqIFBvc3NpYmxlIGRvd25taXggdHlwZXMuCisgKi8KK2VudW0gQVZEb3dubWl4VHlwZSB7CisgICAgQVZfRE9XTk1JWF9UWVBFX1VOS05PV04sIC8qKjwgTm90IGluZGljYXRlZC4gKi8KKyAgICBBVl9ET1dOTUlYX1RZUEVfTE9STywgICAgLyoqPCBMby9SbyAyLWNoYW5uZWwgZG93bm1peCAoU3RlcmVvKS4gKi8KKyAgICBBVl9ET1dOTUlYX1RZUEVfTFRSVCwgICAgLyoqPCBMdC9SdCAyLWNoYW5uZWwgZG93bm1peCwgRG9sYnkgU3Vycm91bmQgY29tcGF0aWJsZS4gKi8KKyAgICBBVl9ET1dOTUlYX1RZUEVfRFBMSUksICAgLyoqPCBMdC9SdCAyLWNoYW5uZWwgZG93bm1peCwgRG9sYnkgUHJvIExvZ2ljIElJIGNvbXBhdGlibGUuICovCisgICAgQVZfRE9XTk1JWF9UWVBFX05CICAgICAgIC8qKjwgTnVtYmVyIG9mIGRvd25taXggdHlwZXMuIE5vdCBwYXJ0IG9mIEFCSS4gKi8KK307CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIG9wdGlvbmFsIG1ldGFkYXRhIHJlbGV2YW50IHRvIGEgZG93bm1peCBwcm9jZWR1cmUuCisgKgorICogQWxsIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZSBkZWNvZGVyIHRvIHRoZSB2YWx1ZSBpbmRpY2F0ZWQgaW4gdGhlIGF1ZGlvCisgKiBiaXRzdHJlYW0gKGlmIHByZXNlbnQpLCBvciB0byBhICJzYW5lIiBkZWZhdWx0IG90aGVyd2lzZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZEb3dubWl4SW5mbyB7CisgICAgLyoqCisgICAgICogVHlwZSBvZiBkb3dubWl4IHByZWZlcnJlZCBieSB0aGUgbWFzdGVyaW5nIGVuZ2luZWVyLgorICAgICAqLworICAgIGVudW0gQVZEb3dubWl4VHlwZSBwcmVmZXJyZWRfZG93bm1peF90eXBlOworCisgICAgLyoqCisgICAgICogQWJzb2x1dGUgc2NhbGUgZmFjdG9yIHJlcHJlc2VudGluZyB0aGUgbm9taW5hbCBsZXZlbCBvZiB0aGUgY2VudGVyCisgICAgICogY2hhbm5lbCBkdXJpbmcgYSByZWd1bGFyIGRvd25taXguCisgICAgICovCisgICAgZG91YmxlIGNlbnRlcl9taXhfbGV2ZWw7CisKKyAgICAvKioKKyAgICAgKiBBYnNvbHV0ZSBzY2FsZSBmYWN0b3IgcmVwcmVzZW50aW5nIHRoZSBub21pbmFsIGxldmVsIG9mIHRoZSBjZW50ZXIKKyAgICAgKiBjaGFubmVsIGR1cmluZyBhbiBMdC9SdCBjb21wYXRpYmxlIGRvd25taXguCisgICAgICovCisgICAgZG91YmxlIGNlbnRlcl9taXhfbGV2ZWxfbHRydDsKKworICAgIC8qKgorICAgICAqIEFic29sdXRlIHNjYWxlIGZhY3RvciByZXByZXNlbnRpbmcgdGhlIG5vbWluYWwgbGV2ZWwgb2YgdGhlIHN1cnJvdW5kCisgICAgICogY2hhbm5lbHMgZHVyaW5nIGEgcmVndWxhciBkb3dubWl4LgorICAgICAqLworICAgIGRvdWJsZSBzdXJyb3VuZF9taXhfbGV2ZWw7CisKKyAgICAvKioKKyAgICAgKiBBYnNvbHV0ZSBzY2FsZSBmYWN0b3IgcmVwcmVzZW50aW5nIHRoZSBub21pbmFsIGxldmVsIG9mIHRoZSBzdXJyb3VuZAorICAgICAqIGNoYW5uZWxzIGR1cmluZyBhbiBMdC9SdCBjb21wYXRpYmxlIGRvd25taXguCisgICAgICovCisgICAgZG91YmxlIHN1cnJvdW5kX21peF9sZXZlbF9sdHJ0OworCisgICAgLyoqCisgICAgICogQWJzb2x1dGUgc2NhbGUgZmFjdG9yIHJlcHJlc2VudGluZyB0aGUgbGV2ZWwgYXQgd2hpY2ggdGhlIExGRSBkYXRhIGlzCisgICAgICogbWl4ZWQgaW50byBML1IgY2hhbm5lbHMgZHVyaW5nIGRvd25taXhpbmcuCisgICAgICovCisgICAgZG91YmxlIGxmZV9taXhfbGV2ZWw7Cit9IEFWRG93bm1peEluZm87CisKKy8qKgorICogR2V0IGEgZnJhbWUncyBBVl9GUkFNRV9EQVRBX0RPV05NSVhfSU5GTyBzaWRlIGRhdGEgZm9yIGVkaXRpbmcuCisgKgorICogSWYgdGhlIHNpZGUgZGF0YSBpcyBhYnNlbnQsIGl0IGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBmcmFtZS4KKyAqCisgKiBAcGFyYW0gZnJhbWUgdGhlIGZyYW1lIGZvciB3aGljaCB0aGUgc2lkZSBkYXRhIGlzIHRvIGJlIG9idGFpbmVkIG9yIGNyZWF0ZWQKKyAqCisgKiBAcmV0dXJuIHRoZSBBVkRvd25taXhJbmZvIHN0cnVjdHVyZSB0byBiZSBlZGl0ZWQgYnkgdGhlIGNhbGxlciwgb3IgTlVMTCBpZgorICogICAgICAgICB0aGUgc3RydWN0dXJlIGNhbm5vdCBiZSBhbGxvY2F0ZWQuCisgKi8KK0FWRG93bm1peEluZm8gKmF2X2Rvd25taXhfaW5mb191cGRhdGVfc2lkZV9kYXRhKEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZVVElMX0RPV05NSVhfSU5GT19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2R5bmFycmF5LmggYi9mZm1wZWcvbGliYXZ1dGlsL2R5bmFycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0N2Q5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvZHluYXJyYXkuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0RZTkFSUkFZX0gKKyNkZWZpbmUgQVZVVElMX0RZTkFSUkFZX0gKKworI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1lbS5oIgorCisvKioKKyAqIEFkZCBhbiBlbGVtZW50IG9mIHRvIGEgZHluYW1pYyBhcnJheS4KKyAqCisgKiBUaGUgYXJyYXkgaXMgcmVhbGxvY2F0ZWQgd2hlbiBpdHMgbnVtYmVyIG9mIGVsZW1lbnRzIHJlYWNoZXMgcG93ZXJzIG9mIDIuCisgKiBUaGVyZWZvcmUsIHRoZSBhbW9ydGl6ZWQgY29zdCBvZiBhZGRpbmcgYW4gZWxlbWVudCBpcyBjb25zdGFudC4KKyAqCisgKiBJbiBjYXNlIG9mIHN1Y2Nlc3MsIHRoZSBwb2ludGVyIHRvIHRoZSBhcnJheSBpcyB1cGRhdGVkIGluIG9yZGVyIHRvCisgKiBwb2ludCB0byB0aGUgbmV3IGdyb3duIGFycmF5LCBhbmQgdGhlIHNpemUgaXMgaW5jcmVtZW50ZWQuCisgKgorICogQHBhcmFtIGF2X3NpemVfbWF4ICBtYXhpbXVtIHNpemUgb2YgdGhlIGFycmF5LCB1c3VhbGx5IHRoZSBNQVggbWFjcm8gb2YKKyAqICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHNpemUKKyAqIEBwYXJhbSBhdl9lbHRfc2l6ZSAgc2l6ZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LCBpbiBieXRlcworICogQHBhcmFtIGF2X2FycmF5ICAgICBwb2ludGVyIHRvIHRoZSBhcnJheSwgbXVzdCBiZSBhIGx2YWx1ZQorICogQHBhcmFtIGF2X3NpemUgICAgICBzaXplIG9mIHRoZSBhcnJheSwgbXVzdCBiZSBhbiBpbnRlZ2VyIGx2YWx1ZQorICogQHBhcmFtIGF2X3N1Y2Nlc3MgICBzdGF0ZW1lbnQgdG8gZXhlY3V0ZSBvbiBzdWNjZXNzOyBhdCB0aGlzIHBvaW50LCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgc2l6ZSB2YXJpYWJsZSBpcyBub3QgeWV0IGluY3JlbWVudGVkCisgKiBAcGFyYW0gYXZfZmFpbHVyZSAgIHN0YXRlbWVudCB0byBleGVjdXRlIG9uIGZhaWx1cmU7IGlmIHRoaXMgaGFwcGVucywgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgIGFycmF5IGFuZCBzaXplIGFyZSBub3QgY2hhbmdlZDsgdGhlIHN0YXRlbWVudCBjYW4gZW5kCisgKiAgICAgICAgICAgICAgICAgICAgIHdpdGggYSByZXR1cm4gb3IgYSBnb3RvCisgKi8KKyNkZWZpbmUgQVZfRFlOQVJSQVlfQUREKGF2X3NpemVfbWF4LCBhdl9lbHRfc2l6ZSwgYXZfYXJyYXksIGF2X3NpemUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X3N1Y2Nlc3MsIGF2X2ZhaWx1cmUpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgc2l6ZV90IGF2X3NpemVfbmV3ID0gKGF2X3NpemUpOyBcCisgICAgICAgIGlmICghKChhdl9zaXplKSAmICgoYXZfc2l6ZSkgLSAxKSkpIHsgXAorICAgICAgICAgICAgYXZfc2l6ZV9uZXcgPSAoYXZfc2l6ZSkgPyAoYXZfc2l6ZSkgPDwgMSA6IDE7IFwKKyAgICAgICAgICAgIGlmIChhdl9zaXplX25ldyA+IChhdl9zaXplX21heCkgLyAoYXZfZWx0X3NpemUpKSB7IFwKKyAgICAgICAgICAgICAgICBhdl9zaXplX25ldyA9IDA7IFwKKyAgICAgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgICAgICB2b2lkICphdl9hcnJheV9uZXcgPSBcCisgICAgICAgICAgICAgICAgICAgIGF2X3JlYWxsb2MoKGF2X2FycmF5KSwgYXZfc2l6ZV9uZXcgKiAoYXZfZWx0X3NpemUpKTsgXAorICAgICAgICAgICAgICAgIGlmICghYXZfYXJyYXlfbmV3KSBcCisgICAgICAgICAgICAgICAgICAgIGF2X3NpemVfbmV3ID0gMDsgXAorICAgICAgICAgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgICAgICAgICAoYXZfYXJyYXkpID0gYXZfYXJyYXlfbmV3OyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgICAgIGlmIChhdl9zaXplX25ldykgeyBcCisgICAgICAgICAgICB7IGF2X3N1Y2Nlc3MgfSBcCisgICAgICAgICAgICAoYXZfc2l6ZSkrKzsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICBhdl9mYWlsdXJlIFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIEFWVVRJTF9EWU5BUlJBWV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2Vycm9yLmMgYi9mZm1wZWcvbGliYXZ1dGlsL2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4NjhhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvZXJyb3IuYwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjdW5kZWYgX0dOVV9TT1VSQ0UKKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA2MDAgLyogWFNJLWNvbXBsaWFudCB2ZXJzaW9uIG9mIHN0cmVycm9yX3IgKi8KKyNpbmNsdWRlICJhdnV0aWwuaCIKKyNpbmNsdWRlICJhdnN0cmluZy5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorCitzdHJ1Y3QgZXJyb3JfZW50cnkgeworICAgIGludCBudW07CisgICAgY29uc3QgY2hhciAqdGFnOworICAgIGNvbnN0IGNoYXIgKnN0cjsKK307CisKKyNkZWZpbmUgRVJST1JfVEFHKHRhZykgQVZFUlJPUl8jI3RhZywgI3RhZworI2RlZmluZSBBVkVSUk9SX0lOUFVUX0FORF9PVVRQVVRfQ0hBTkdFRCAoQVZFUlJPUl9JTlBVVF9DSEFOR0VEIHwgQVZFUlJPUl9PVVRQVVRfQ0hBTkdFRCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXJyb3JfZW50cnkgZXJyb3JfZW50cmllc1tdID0geworICAgIHsgRVJST1JfVEFHKEJTRl9OT1RfRk9VTkQpLCAgICAgICJCaXRzdHJlYW0gZmlsdGVyIG5vdCBmb3VuZCIgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKEJVRyksICAgICAgICAgICAgICAgICJJbnRlcm5hbCBidWcsIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCIgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKEJVRzIpLCAgICAgICAgICAgICAgICJJbnRlcm5hbCBidWcsIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCIgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKEJVRkZFUl9UT09fU01BTEwpLCAgICJCdWZmZXIgdG9vIHNtYWxsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKERFQ09ERVJfTk9UX0ZPVU5EKSwgICJEZWNvZGVyIG5vdCBmb3VuZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKERFTVVYRVJfTk9UX0ZPVU5EKSwgICJEZW11eGVyIG5vdCBmb3VuZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKEVOQ09ERVJfTk9UX0ZPVU5EKSwgICJFbmNvZGVyIG5vdCBmb3VuZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKEVPRiksICAgICAgICAgICAgICAgICJFbmQgb2YgZmlsZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKEVYSVQpLCAgICAgICAgICAgICAgICJJbW1lZGlhdGUgZXhpdCByZXF1ZXN0ZWQiICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKEVYVEVSTkFMKSwgICAgICAgICAgICJHZW5lcmljIGVycm9yIGluIGFuIGV4dGVybmFsIGxpYnJhcnkiICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKEZJTFRFUl9OT1RfRk9VTkQpLCAgICJGaWx0ZXIgbm90IGZvdW5kIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKElOUFVUX0NIQU5HRUQpLCAgICAgICJJbnB1dCBjaGFuZ2VkIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKElOVkFMSUREQVRBKSwgICAgICAgICJJbnZhbGlkIGRhdGEgZm91bmQgd2hlbiBwcm9jZXNzaW5nIGlucHV0IiAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKE1VWEVSX05PVF9GT1VORCksICAgICJNdXhlciBub3QgZm91bmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKE9QVElPTl9OT1RfRk9VTkQpLCAgICJPcHRpb24gbm90IGZvdW5kIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKE9VVFBVVF9DSEFOR0VEKSwgICAgICJPdXRwdXQgY2hhbmdlZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKFBBVENIV0VMQ09NRSksICAgICAgICJOb3QgeWV0IGltcGxlbWVudGVkIGluIEZGbXBlZywgcGF0Y2hlcyB3ZWxjb21lIiB9LAorICAgIHsgRVJST1JfVEFHKFBST1RPQ09MX05PVF9GT1VORCksICJQcm90b2NvbCBub3QgZm91bmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKFNUUkVBTV9OT1RfRk9VTkQpLCAgICJTdHJlYW0gbm90IGZvdW5kIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKFVOS05PV04pLCAgICAgICAgICAgICJVbmtub3duIGVycm9yIG9jY3VycmVkIiAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKEVYUEVSSU1FTlRBTCksICAgICAgICJFeHBlcmltZW50YWwgZmVhdHVyZSIgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKElOUFVUX0FORF9PVVRQVVRfQ0hBTkdFRCksICJJbnB1dCBhbmQgb3V0cHV0IGNoYW5nZWQiICAgICAgICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKEhUVFBfQkFEX1JFUVVFU1QpLCAgICJTZXJ2ZXIgcmV0dXJuZWQgNDAwIEJhZCBSZXF1ZXN0IiAgICAgICAgIH0sCisgICAgeyBFUlJPUl9UQUcoSFRUUF9VTkFVVEhPUklaRUQpLCAgIlNlcnZlciByZXR1cm5lZCA0MDEgVW5hdXRob3JpemVkIChhdXRob3JpemF0aW9uIGZhaWxlZCkiIH0sCisgICAgeyBFUlJPUl9UQUcoSFRUUF9GT1JCSURERU4pLCAgICAgIlNlcnZlciByZXR1cm5lZCA0MDMgRm9yYmlkZGVuIChhY2Nlc3MgZGVuaWVkKSIgfSwKKyAgICB7IEVSUk9SX1RBRyhIVFRQX05PVF9GT1VORCksICAgICAiU2VydmVyIHJldHVybmVkIDQwNCBOb3QgRm91bmQiICAgICAgICAgICB9LAorICAgIHsgRVJST1JfVEFHKEhUVFBfT1RIRVJfNFhYKSwgICAgICJTZXJ2ZXIgcmV0dXJuZWQgNFhYIENsaWVudCBFcnJvciwgYnV0IG5vdCBvbmUgb2YgNDB7MCwxLDMsNH0iIH0sCisgICAgeyBFUlJPUl9UQUcoSFRUUF9TRVJWRVJfRVJST1IpLCAgIlNlcnZlciByZXR1cm5lZCA1WFggU2VydmVyIEVycm9yIHJlcGx5IiB9LAorfTsKKworaW50IGF2X3N0cmVycm9yKGludCBlcnJudW0sIGNoYXIgKmVycmJ1Ziwgc2l6ZV90IGVycmJ1Zl9zaXplKQoreworICAgIGludCByZXQgPSAwLCBpOworICAgIGNvbnN0IHN0cnVjdCBlcnJvcl9lbnRyeSAqZW50cnkgPSBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGVycm9yX2VudHJpZXMpOyBpKyspIHsKKyAgICAgICAgaWYgKGVycm51bSA9PSBlcnJvcl9lbnRyaWVzW2ldLm51bSkgeworICAgICAgICAgICAgZW50cnkgPSAmZXJyb3JfZW50cmllc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlbnRyeSkgeworICAgICAgICBhdl9zdHJsY3B5KGVycmJ1ZiwgZW50cnktPnN0ciwgZXJyYnVmX3NpemUpOworICAgIH0gZWxzZSB7CisjaWYgSEFWRV9TVFJFUlJPUl9SCisgICAgICAgIHJldCA9IEFWRVJST1Ioc3RyZXJyb3JfcihBVlVORVJST1IoZXJybnVtKSwgZXJyYnVmLCBlcnJidWZfc2l6ZSkpOworI2Vsc2UKKyAgICAgICAgcmV0ID0gLTE7CisjZW5kaWYKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBzbnByaW50ZihlcnJidWYsIGVycmJ1Zl9zaXplLCAiRXJyb3IgbnVtYmVyICVkIG9jY3VycmVkIiwgZXJybnVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisjaWZkZWYgVEVTVAorCisjdW5kZWYgcHJpbnRmCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZXJyb3JfZW50cmllcyk7IGkrKykgeworICAgICAgICBjb25zdCBzdHJ1Y3QgZXJyb3JfZW50cnkgKmVudHJ5ID0gJmVycm9yX2VudHJpZXNbaV07CisgICAgICAgIHByaW50ZigiJWQ6ICVzIFslc11cbiIsIGVudHJ5LT5udW0sIGF2X2VycjJzdHIoZW50cnktPm51bSksIGVudHJ5LT50YWcpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBwcmludGYoIiVkOiAlc1xuIiwgLWksIGF2X2VycjJzdHIoLWkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvZXJyb3IuaCBiL2ZmbXBlZy9saWJhdnV0aWwvZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWRmNGRhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9lcnJvci5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGVycm9yIGNvZGUgZGVmaW5pdGlvbnMKKyAqLworCisjaWZuZGVmIEFWVVRJTF9FUlJPUl9ICisjZGVmaW5lIEFWVVRJTF9FUlJPUl9ICisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKioKKyAqIEBhZGR0b2dyb3VwIGxhdnVfZXJyb3IKKyAqCisgKiBAeworICovCisKKworLyogZXJyb3IgaGFuZGxpbmcgKi8KKyNpZiBFRE9NID4gMAorI2RlZmluZSBBVkVSUk9SKGUpICgtKGUpKSAgIC8vLzwgUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgZnJvbSBhIFBPU0lYIGVycm9yIGNvZGUsIHRvIHJldHVybiBmcm9tIGxpYnJhcnkgZnVuY3Rpb25zLgorI2RlZmluZSBBVlVORVJST1IoZSkgKC0oZSkpIC8vLzwgUmV0dXJucyBhIFBPU0lYIGVycm9yIGNvZGUgZnJvbSBhIGxpYnJhcnkgZnVuY3Rpb24gZXJyb3IgcmV0dXJuIHZhbHVlLgorI2Vsc2UKKy8qIFNvbWUgcGxhdGZvcm1zIGhhdmUgRSogYW5kIGVycm5vIGFscmVhZHkgbmVnYXRlZC4gKi8KKyNkZWZpbmUgQVZFUlJPUihlKSAoZSkKKyNkZWZpbmUgQVZVTkVSUk9SKGUpIChlKQorI2VuZGlmCisKKyNkZWZpbmUgRkZFUlJUQUcoYSwgYiwgYywgZCkgKC0oaW50KU1LVEFHKGEsIGIsIGMsIGQpKQorCisjZGVmaW5lIEFWRVJST1JfQlNGX05PVF9GT1VORCAgICAgIEZGRVJSVEFHKDB4RjgsJ0InLCdTJywnRicpIC8vLzwgQml0c3RyZWFtIGZpbHRlciBub3QgZm91bmQKKyNkZWZpbmUgQVZFUlJPUl9CVUcgICAgICAgICAgICAgICAgRkZFUlJUQUcoICdCJywnVScsJ0cnLCchJykgLy8vPCBJbnRlcm5hbCBidWcsIGFsc28gc2VlIEFWRVJST1JfQlVHMgorI2RlZmluZSBBVkVSUk9SX0JVRkZFUl9UT09fU01BTEwgICBGRkVSUlRBRyggJ0InLCdVJywnRicsJ1MnKSAvLy88IEJ1ZmZlciB0b28gc21hbGwKKyNkZWZpbmUgQVZFUlJPUl9ERUNPREVSX05PVF9GT1VORCAgRkZFUlJUQUcoMHhGOCwnRCcsJ0UnLCdDJykgLy8vPCBEZWNvZGVyIG5vdCBmb3VuZAorI2RlZmluZSBBVkVSUk9SX0RFTVVYRVJfTk9UX0ZPVU5EICBGRkVSUlRBRygweEY4LCdEJywnRScsJ00nKSAvLy88IERlbXV4ZXIgbm90IGZvdW5kCisjZGVmaW5lIEFWRVJST1JfRU5DT0RFUl9OT1RfRk9VTkQgIEZGRVJSVEFHKDB4RjgsJ0UnLCdOJywnQycpIC8vLzwgRW5jb2RlciBub3QgZm91bmQKKyNkZWZpbmUgQVZFUlJPUl9FT0YgICAgICAgICAgICAgICAgRkZFUlJUQUcoICdFJywnTycsJ0YnLCcgJykgLy8vPCBFbmQgb2YgZmlsZQorI2RlZmluZSBBVkVSUk9SX0VYSVQgICAgICAgICAgICAgICBGRkVSUlRBRyggJ0UnLCdYJywnSScsJ1QnKSAvLy88IEltbWVkaWF0ZSBleGl0IHdhcyByZXF1ZXN0ZWQ7IHRoZSBjYWxsZWQgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSByZXN0YXJ0ZWQKKyNkZWZpbmUgQVZFUlJPUl9FWFRFUk5BTCAgICAgICAgICAgRkZFUlJUQUcoICdFJywnWCcsJ1QnLCcgJykgLy8vPCBHZW5lcmljIGVycm9yIGluIGFuIGV4dGVybmFsIGxpYnJhcnkKKyNkZWZpbmUgQVZFUlJPUl9GSUxURVJfTk9UX0ZPVU5EICAgRkZFUlJUQUcoMHhGOCwnRicsJ0knLCdMJykgLy8vPCBGaWx0ZXIgbm90IGZvdW5kCisjZGVmaW5lIEFWRVJST1JfSU5WQUxJRERBVEEgICAgICAgIEZGRVJSVEFHKCAnSScsJ04nLCdEJywnQScpIC8vLzwgSW52YWxpZCBkYXRhIGZvdW5kIHdoZW4gcHJvY2Vzc2luZyBpbnB1dAorI2RlZmluZSBBVkVSUk9SX01VWEVSX05PVF9GT1VORCAgICBGRkVSUlRBRygweEY4LCdNJywnVScsJ1gnKSAvLy88IE11eGVyIG5vdCBmb3VuZAorI2RlZmluZSBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQgICBGRkVSUlRBRygweEY4LCdPJywnUCcsJ1QnKSAvLy88IE9wdGlvbiBub3QgZm91bmQKKyNkZWZpbmUgQVZFUlJPUl9QQVRDSFdFTENPTUUgICAgICAgRkZFUlJUQUcoICdQJywnQScsJ1cnLCdFJykgLy8vPCBOb3QgeWV0IGltcGxlbWVudGVkIGluIEZGbXBlZywgcGF0Y2hlcyB3ZWxjb21lCisjZGVmaW5lIEFWRVJST1JfUFJPVE9DT0xfTk9UX0ZPVU5EIEZGRVJSVEFHKDB4RjgsJ1AnLCdSJywnTycpIC8vLzwgUHJvdG9jb2wgbm90IGZvdW5kCisKKyNkZWZpbmUgQVZFUlJPUl9TVFJFQU1fTk9UX0ZPVU5EICAgRkZFUlJUQUcoMHhGOCwnUycsJ1QnLCdSJykgLy8vPCBTdHJlYW0gbm90IGZvdW5kCisvKioKKyAqIFRoaXMgaXMgc2VtYW50aWNhbGx5IGlkZW50aWNhbCB0byBBVkVSUk9SX0JVRworICogaXQgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiBMaWJhdiBhZnRlciBvdXIgQVZFUlJPUl9CVUcgYW5kIHdpdGggYSBtb2RpZmllZCB2YWx1ZS4KKyAqLworI2RlZmluZSBBVkVSUk9SX0JVRzIgICAgICAgICAgICAgICBGRkVSUlRBRyggJ0InLCdVJywnRycsJyAnKQorI2RlZmluZSBBVkVSUk9SX1VOS05PV04gICAgICAgICAgICBGRkVSUlRBRyggJ1UnLCdOJywnSycsJ04nKSAvLy88IFVua25vd24gZXJyb3IsIHR5cGljYWxseSBmcm9tIGFuIGV4dGVybmFsIGxpYnJhcnkKKyNkZWZpbmUgQVZFUlJPUl9FWFBFUklNRU5UQUwgICAgICAgKC0weDJiYjJhZmE4KSAvLy88IFJlcXVlc3RlZCBmZWF0dXJlIGlzIGZsYWdnZWQgZXhwZXJpbWVudGFsLiBTZXQgc3RyaWN0X3N0ZF9jb21wbGlhbmNlIGlmIHlvdSByZWFsbHkgd2FudCB0byB1c2UgaXQuCisjZGVmaW5lIEFWRVJST1JfSU5QVVRfQ0hBTkdFRCAgICAgICgtMHg2MzZlNjcwMSkgLy8vPCBJbnB1dCBjaGFuZ2VkIGJldHdlZW4gY2FsbHMuIFJlY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZC4gKGNhbiBiZSBPUi1lZCB3aXRoIEFWRVJST1JfT1VUUFVUX0NIQU5HRUQpCisjZGVmaW5lIEFWRVJST1JfT1VUUFVUX0NIQU5HRUQgICAgICgtMHg2MzZlNjcwMikgLy8vPCBPdXRwdXQgY2hhbmdlZCBiZXR3ZWVuIGNhbGxzLiBSZWNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQuIChjYW4gYmUgT1ItZWQgd2l0aCBBVkVSUk9SX0lOUFVUX0NIQU5HRUQpCisvKiBIVFRQICYgUlRTUCBlcnJvcnMgKi8KKyNkZWZpbmUgQVZFUlJPUl9IVFRQX0JBRF9SRVFVRVNUICAgRkZFUlJUQUcoMHhGOCwnNCcsJzAnLCcwJykKKyNkZWZpbmUgQVZFUlJPUl9IVFRQX1VOQVVUSE9SSVpFRCAgRkZFUlJUQUcoMHhGOCwnNCcsJzAnLCcxJykKKyNkZWZpbmUgQVZFUlJPUl9IVFRQX0ZPUkJJRERFTiAgICAgRkZFUlJUQUcoMHhGOCwnNCcsJzAnLCczJykKKyNkZWZpbmUgQVZFUlJPUl9IVFRQX05PVF9GT1VORCAgICAgRkZFUlJUQUcoMHhGOCwnNCcsJzAnLCc0JykKKyNkZWZpbmUgQVZFUlJPUl9IVFRQX09USEVSXzRYWCAgICAgRkZFUlJUQUcoMHhGOCwnNCcsJ1gnLCdYJykKKyNkZWZpbmUgQVZFUlJPUl9IVFRQX1NFUlZFUl9FUlJPUiAgRkZFUlJUQUcoMHhGOCwnNScsJ1gnLCdYJykKKworI2RlZmluZSBBVl9FUlJPUl9NQVhfU1RSSU5HX1NJWkUgNjQKKworLyoqCisgKiBQdXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgQVZFUlJPUiBjb2RlIGVycm51bSBpbiBlcnJidWYuCisgKiBJbiBjYXNlIG9mIGZhaWx1cmUgdGhlIGdsb2JhbCB2YXJpYWJsZSBlcnJubyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhlCisgKiBlcnJvci4gRXZlbiBpbiBjYXNlIG9mIGZhaWx1cmUgYXZfc3RyZXJyb3IoKSB3aWxsIHByaW50IGEgZ2VuZXJpYworICogZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSBlcnJudW0gcHJvdmlkZWQgdG8gZXJyYnVmLgorICoKKyAqIEBwYXJhbSBlcnJudW0gICAgICBlcnJvciBjb2RlIHRvIGRlc2NyaWJlCisgKiBAcGFyYW0gZXJyYnVmICAgICAgYnVmZmVyIHRvIHdoaWNoIGRlc2NyaXB0aW9uIGlzIHdyaXR0ZW4KKyAqIEBwYXJhbSBlcnJidWZfc2l6ZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiBlcnJidWYKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIHZhbHVlIGlmIGEgZGVzY3JpcHRpb24gZm9yIGVycm51bQorICogY2Fubm90IGJlIGZvdW5kCisgKi8KK2ludCBhdl9zdHJlcnJvcihpbnQgZXJybnVtLCBjaGFyICplcnJidWYsIHNpemVfdCBlcnJidWZfc2l6ZSk7CisKKy8qKgorICogRmlsbCB0aGUgcHJvdmlkZWQgYnVmZmVyIHdpdGggYSBzdHJpbmcgY29udGFpbmluZyBhbiBlcnJvciBzdHJpbmcKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFWRVJST1IgY29kZSBlcnJudW0uCisgKgorICogQHBhcmFtIGVycmJ1ZiAgICAgICAgIGEgYnVmZmVyCisgKiBAcGFyYW0gZXJyYnVmX3NpemUgICAgc2l6ZSBpbiBieXRlcyBvZiBlcnJidWYKKyAqIEBwYXJhbSBlcnJudW0gICAgICAgICBlcnJvciBjb2RlIHRvIGRlc2NyaWJlCisgKiBAcmV0dXJuIHRoZSBidWZmZXIgaW4gaW5wdXQsIGZpbGxlZCB3aXRoIHRoZSBlcnJvciBkZXNjcmlwdGlvbgorICogQHNlZSBhdl9zdHJlcnJvcigpCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqYXZfbWFrZV9lcnJvcl9zdHJpbmcoY2hhciAqZXJyYnVmLCBzaXplX3QgZXJyYnVmX3NpemUsIGludCBlcnJudW0pCit7CisgICAgYXZfc3RyZXJyb3IoZXJybnVtLCBlcnJidWYsIGVycmJ1Zl9zaXplKTsKKyAgICByZXR1cm4gZXJyYnVmOworfQorCisvKioKKyAqIENvbnZlbmllbmNlIG1hY3JvLCB0aGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSB1c2VkIG9ubHkgZGlyZWN0bHkgaW4KKyAqIGZ1bmN0aW9uIGFyZ3VtZW50cyBidXQgbmV2ZXIgc3RhbmQtYWxvbmUuCisgKi8KKyNkZWZpbmUgYXZfZXJyMnN0cihlcnJudW0pIFwKKyAgICBhdl9tYWtlX2Vycm9yX3N0cmluZygoY2hhcltBVl9FUlJPUl9NQVhfU1RSSU5HX1NJWkVdKXswfSwgQVZfRVJST1JfTUFYX1NUUklOR19TSVpFLCBlcnJudW0pCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZVVElMX0VSUk9SX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvZXZhbC5jIGIvZmZtcGVnL2xpYmF2dXRpbC9ldmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5OWU1NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvZXZhbC5jCkBAIC0wLDAgKzEsODgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBPZGVkIFNoaW1vbiA8b2RzMTVAb2RzMTUuZHluZG5zLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogc2ltcGxlIGFyaXRobWV0aWMgZXhwcmVzc2lvbiBldmFsdWF0b3IuCisgKgorICogc2VlIGh0dHA6Ly9qb2UuaG90Y2hraXNzLmNvbS9wcm9ncmFtbWluZy9ldmFsL2V2YWwuaHRtbAorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgImF0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJhdnV0aWwuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJldmFsLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJ0aW1lLmgiCisjaW5jbHVkZSAiYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorCit0eXBlZGVmIHN0cnVjdCBQYXJzZXIgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBzdGFja19pbmRleDsKKyAgICBjaGFyICpzOworICAgIGNvbnN0IGRvdWJsZSAqY29uc3RfdmFsdWVzOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqY29uc3RfbmFtZXM7ICAgICAgICAgIC8vIE5VTEwgdGVybWluYXRlZAorICAgIGRvdWJsZSAoKiBjb25zdCAqZnVuY3MxKSh2b2lkICosIGRvdWJsZSBhKTsgICAgICAgICAgIC8vIE5VTEwgdGVybWluYXRlZAorICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqZnVuYzFfbmFtZXM7ICAgICAgICAgIC8vIE5VTEwgdGVybWluYXRlZAorICAgIGRvdWJsZSAoKiBjb25zdCAqZnVuY3MyKSh2b2lkICosIGRvdWJsZSBhLCBkb3VibGUgYik7IC8vIE5VTEwgdGVybWluYXRlZAorICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqZnVuYzJfbmFtZXM7ICAgICAgICAgIC8vIE5VTEwgdGVybWluYXRlZAorICAgIHZvaWQgKm9wYXF1ZTsKKyAgICBpbnQgbG9nX29mZnNldDsKKyAgICB2b2lkICpsb2dfY3R4OworI2RlZmluZSBWQVJTIDEwCisgICAgZG91YmxlICp2YXI7Cit9IFBhcnNlcjsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZXZhbF9jbGFzcyA9IHsgIkV2YWwiLCBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwgTlVMTCwgTElCQVZVVElMX1ZFUlNJT05fSU5ULCBvZmZzZXRvZihQYXJzZXIsbG9nX29mZnNldCksIG9mZnNldG9mKFBhcnNlcixsb2dfY3R4KSB9OworCitzdGF0aWMgY29uc3QgaW50OF90IHNpX3ByZWZpeGVzWyd6JyAtICdFJyArIDFdID0geworICAgIFsneSctJ0UnXT0gLTI0LAorICAgIFsneictJ0UnXT0gLTIxLAorICAgIFsnYSctJ0UnXT0gLTE4LAorICAgIFsnZictJ0UnXT0gLTE1LAorICAgIFsncCctJ0UnXT0gLTEyLAorICAgIFsnbictJ0UnXT0gLSA5LAorICAgIFsndSctJ0UnXT0gLSA2LAorICAgIFsnbSctJ0UnXT0gLSAzLAorICAgIFsnYyctJ0UnXT0gLSAyLAorICAgIFsnZCctJ0UnXT0gLSAxLAorICAgIFsnaCctJ0UnXT0gICAyLAorICAgIFsnayctJ0UnXT0gICAzLAorICAgIFsnSyctJ0UnXT0gICAzLAorICAgIFsnTSctJ0UnXT0gICA2LAorICAgIFsnRyctJ0UnXT0gICA5LAorICAgIFsnVCctJ0UnXT0gIDEyLAorICAgIFsnUCctJ0UnXT0gIDE1LAorICAgIFsnRSctJ0UnXT0gIDE4LAorICAgIFsnWictJ0UnXT0gIDIxLAorICAgIFsnWSctJ0UnXT0gIDI0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBkb3VibGUgdmFsdWU7Cit9IGNvbnN0YW50c1tdID0geworICAgIHsgIkUiLCAgIE1fRSAgIH0sCisgICAgeyAiUEkiLCAgTV9QSSAgfSwKKyAgICB7ICJQSEkiLCBNX1BISSB9LAorICAgIHsgIlFQMkxBTUJEQSIsIEZGX1FQMkxBTUJEQSB9LAorfTsKKworZG91YmxlIGF2X3N0cnRvZChjb25zdCBjaGFyICpudW1zdHIsIGNoYXIgKip0YWlsKQoreworICAgIGRvdWJsZSBkOworICAgIGNoYXIgKm5leHQ7CisgICAgaWYobnVtc3RyWzBdPT0nMCcgJiYgKG51bXN0clsxXXwweDIwKT09J3gnKSB7CisgICAgICAgIGQgPSBzdHJ0b3VsKG51bXN0ciwgJm5leHQsIDE2KTsKKyAgICB9IGVsc2UKKyAgICAgICAgZCA9IHN0cnRvZChudW1zdHIsICZuZXh0KTsKKyAgICAvKiBpZiBwYXJzaW5nIHN1Y2NlZWRlZCwgY2hlY2sgZm9yIGFuZCBpbnRlcnByZXQgcG9zdGZpeGVzICovCisgICAgaWYgKG5leHQhPW51bXN0cikgeworICAgICAgICBpZiAobmV4dFswXSA9PSAnZCcgJiYgbmV4dFsxXSA9PSAnQicpIHsKKyAgICAgICAgICAgIC8qIHRyZWF0IGRCIGFzIGRlY2liZWxzIGluc3RlYWQgb2YgZGVjaWJ5dGVzICovCisgICAgICAgICAgICBkID0gcG93KDEwLCBkIC8gMjApOworICAgICAgICAgICAgbmV4dCArPSAyOworICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID49ICdFJyAmJiAqbmV4dCA8PSAneicpIHsKKyAgICAgICAgICAgIGludCBlPSBzaV9wcmVmaXhlc1sqbmV4dCAtICdFJ107CisgICAgICAgICAgICBpZiAoZSkgeworICAgICAgICAgICAgICAgIGlmIChuZXh0WzFdID09ICdpJykgeworICAgICAgICAgICAgICAgICAgICBkKj0gcG93KCAyLCBlLzAuMyk7CisgICAgICAgICAgICAgICAgICAgIG5leHQrPTI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZCo9IHBvdygxMCwgZSk7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKm5leHQ9PSdCJykgeworICAgICAgICAgICAgZCo9ODsKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBpZiByZXF1ZXN0ZWQsIGZpbGwgaW4gdGFpbCB3aXRoIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgbGFzdCBwYXJzZWQKKyAgICAgICBjaGFyYWN0ZXIgKi8KKyAgICBpZiAodGFpbCkKKyAgICAgICAgKnRhaWwgPSBuZXh0OworICAgIHJldHVybiBkOworfQorCisjZGVmaW5lIElTX0lERU5USUZJRVJfQ0hBUihjKSAoKGMpIC0gJzAnIDw9IDlVIHx8IChjKSAtICdhJyA8PSAyNVUgfHwgKGMpIC0gJ0EnIDw9IDI1VSB8fCAoYykgPT0gJ18nKQorCitzdGF0aWMgaW50IHN0cm1hdGNoKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGk9MDsgcHJlZml4W2ldOyBpKyspIHsKKyAgICAgICAgaWYgKHByZWZpeFtpXSAhPSBzW2ldKSByZXR1cm4gMDsKKyAgICB9CisgICAgLyogcmV0dXJuIDEgb25seSBpZiB0aGUgcyBpZGVudGlmaWVyIGlzIHRlcm1pbmF0ZWQgKi8KKyAgICByZXR1cm4gIUlTX0lERU5USUZJRVJfQ0hBUihzW2ldKTsKK30KKworc3RydWN0IEFWRXhwciB7CisgICAgZW51bSB7CisgICAgICAgIGVfdmFsdWUsIGVfY29uc3QsIGVfZnVuYzAsIGVfZnVuYzEsIGVfZnVuYzIsCisgICAgICAgIGVfc3F1aXNoLCBlX2dhdXNzLCBlX2xkLCBlX2lzbmFuLCBlX2lzaW5mLAorICAgICAgICBlX21vZCwgZV9tYXgsIGVfbWluLCBlX2VxLCBlX2d0LCBlX2d0ZSwgZV9sdGUsIGVfbHQsCisgICAgICAgIGVfcG93LCBlX211bCwgZV9kaXYsIGVfYWRkLAorICAgICAgICBlX2xhc3QsIGVfc3QsIGVfd2hpbGUsIGVfdGF5bG9yLCBlX3Jvb3QsIGVfZmxvb3IsIGVfY2VpbCwgZV90cnVuYywKKyAgICAgICAgZV9zcXJ0LCBlX25vdCwgZV9yYW5kb20sIGVfaHlwb3QsIGVfZ2NkLAorICAgICAgICBlX2lmLCBlX2lmbm90LCBlX3ByaW50LCBlX2JpdGFuZCwgZV9iaXRvciwgZV9iZXR3ZWVuLCBlX2NsaXAKKyAgICB9IHR5cGU7CisgICAgZG91YmxlIHZhbHVlOyAvLyBpcyBzaWduIGluIG90aGVyIHR5cGVzCisgICAgdW5pb24geworICAgICAgICBpbnQgY29uc3RfaW5kZXg7CisgICAgICAgIGRvdWJsZSAoKmZ1bmMwKShkb3VibGUpOworICAgICAgICBkb3VibGUgKCpmdW5jMSkodm9pZCAqLCBkb3VibGUpOworICAgICAgICBkb3VibGUgKCpmdW5jMikodm9pZCAqLCBkb3VibGUsIGRvdWJsZSk7CisgICAgfSBhOworICAgIHN0cnVjdCBBVkV4cHIgKnBhcmFtWzNdOworICAgIGRvdWJsZSAqdmFyOworfTsKKworc3RhdGljIGRvdWJsZSBldGltZShkb3VibGUgdikKK3sKKyAgICByZXR1cm4gYXZfZ2V0dGltZSgpICogMC4wMDAwMDE7Cit9CisKK3N0YXRpYyBkb3VibGUgZXZhbF9leHByKFBhcnNlciAqcCwgQVZFeHByICplKQoreworICAgIHN3aXRjaCAoZS0+dHlwZSkgeworICAgICAgICBjYXNlIGVfdmFsdWU6ICByZXR1cm4gZS0+dmFsdWU7CisgICAgICAgIGNhc2UgZV9jb25zdDogIHJldHVybiBlLT52YWx1ZSAqIHAtPmNvbnN0X3ZhbHVlc1tlLT5hLmNvbnN0X2luZGV4XTsKKyAgICAgICAgY2FzZSBlX2Z1bmMwOiAgcmV0dXJuIGUtPnZhbHVlICogZS0+YS5mdW5jMChldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pKTsKKyAgICAgICAgY2FzZSBlX2Z1bmMxOiAgcmV0dXJuIGUtPnZhbHVlICogZS0+YS5mdW5jMShwLT5vcGFxdWUsIGV2YWxfZXhwcihwLCBlLT5wYXJhbVswXSkpOworICAgICAgICBjYXNlIGVfZnVuYzI6ICByZXR1cm4gZS0+dmFsdWUgKiBlLT5hLmZ1bmMyKHAtPm9wYXF1ZSwgZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKSwgZXZhbF9leHByKHAsIGUtPnBhcmFtWzFdKSk7CisgICAgICAgIGNhc2UgZV9zcXVpc2g6IHJldHVybiAxLygxK2V4cCg0KmV2YWxfZXhwcihwLCBlLT5wYXJhbVswXSkpKTsKKyAgICAgICAgY2FzZSBlX2dhdXNzOiB7IGRvdWJsZSBkID0gZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKTsgcmV0dXJuIGV4cCgtZCpkLzIpL3NxcnQoMipNX1BJKTsgfQorICAgICAgICBjYXNlIGVfbGQ6ICAgICByZXR1cm4gZS0+dmFsdWUgKiBwLT52YXJbYXZfY2xpcChldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pLCAwLCBWQVJTLTEpXTsKKyAgICAgICAgY2FzZSBlX2lzbmFuOiAgcmV0dXJuIGUtPnZhbHVlICogISFpc25hbihldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pKTsKKyAgICAgICAgY2FzZSBlX2lzaW5mOiAgcmV0dXJuIGUtPnZhbHVlICogISFpc2luZihldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pKTsKKyAgICAgICAgY2FzZSBlX2Zsb29yOiAgcmV0dXJuIGUtPnZhbHVlICogZmxvb3IoZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKSk7CisgICAgICAgIGNhc2UgZV9jZWlsIDogIHJldHVybiBlLT52YWx1ZSAqIGNlaWwgKGV2YWxfZXhwcihwLCBlLT5wYXJhbVswXSkpOworICAgICAgICBjYXNlIGVfdHJ1bmM6ICByZXR1cm4gZS0+dmFsdWUgKiB0cnVuYyhldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pKTsKKyAgICAgICAgY2FzZSBlX3NxcnQ6ICAgcmV0dXJuIGUtPnZhbHVlICogc3FydCAoZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKSk7CisgICAgICAgIGNhc2UgZV9ub3Q6ICAgIHJldHVybiBlLT52YWx1ZSAqIChldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pID09IDApOworICAgICAgICBjYXNlIGVfaWY6ICAgICByZXR1cm4gZS0+dmFsdWUgKiAoZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKSA/IGV2YWxfZXhwcihwLCBlLT5wYXJhbVsxXSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+cGFyYW1bMl0gPyBldmFsX2V4cHIocCwgZS0+cGFyYW1bMl0pIDogMCk7CisgICAgICAgIGNhc2UgZV9pZm5vdDogIHJldHVybiBlLT52YWx1ZSAqICghZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKSA/IGV2YWxfZXhwcihwLCBlLT5wYXJhbVsxXSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+cGFyYW1bMl0gPyBldmFsX2V4cHIocCwgZS0+cGFyYW1bMl0pIDogMCk7CisgICAgICAgIGNhc2UgZV9jbGlwOiB7CisgICAgICAgICAgICBkb3VibGUgeCA9IGV2YWxfZXhwcihwLCBlLT5wYXJhbVswXSk7CisgICAgICAgICAgICBkb3VibGUgbWluID0gZXZhbF9leHByKHAsIGUtPnBhcmFtWzFdKSwgbWF4ID0gZXZhbF9leHByKHAsIGUtPnBhcmFtWzJdKTsKKyAgICAgICAgICAgIGlmIChpc25hbihtaW4pIHx8IGlzbmFuKG1heCkgfHwgaXNuYW4oeCkgfHwgbWluID4gbWF4KQorICAgICAgICAgICAgICAgIHJldHVybiBOQU47CisgICAgICAgICAgICByZXR1cm4gZS0+dmFsdWUgKiBhdl9jbGlwZChldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pLCBtaW4sIG1heCk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBlX2JldHdlZW46IHsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKTsKKyAgICAgICAgICAgIHJldHVybiBlLT52YWx1ZSAqIChkID49IGV2YWxfZXhwcihwLCBlLT5wYXJhbVsxXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkIDw9IGV2YWxfZXhwcihwLCBlLT5wYXJhbVsyXSkpOworICAgICAgICB9CisgICAgICAgIGNhc2UgZV9wcmludDogeworICAgICAgICAgICAgZG91YmxlIHggPSBldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pOworICAgICAgICAgICAgaW50IGxldmVsID0gZS0+cGFyYW1bMV0gPyBhdl9jbGlwKGV2YWxfZXhwcihwLCBlLT5wYXJhbVsxXSksIElOVF9NSU4sIElOVF9NQVgpIDogQVZfTE9HX0lORk87CisgICAgICAgICAgICBhdl9sb2cocCwgbGV2ZWwsICIlZlxuIiwgeCk7CisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGVfcmFuZG9tOnsKKyAgICAgICAgICAgIGludCBpZHg9IGF2X2NsaXAoZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKSwgMCwgVkFSUy0xKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHI9IGlzbmFuKHAtPnZhcltpZHhdKSA/IDAgOiBwLT52YXJbaWR4XTsKKyAgICAgICAgICAgIHI9IHIqMTY2NDUyNSsxMDEzOTA0MjIzOworICAgICAgICAgICAgcC0+dmFyW2lkeF09IHI7CisgICAgICAgICAgICByZXR1cm4gZS0+dmFsdWUgKiAociAqICgxLjAvVUlOVDY0X01BWCkpOworICAgICAgICB9CisgICAgICAgIGNhc2UgZV93aGlsZTogeworICAgICAgICAgICAgZG91YmxlIGQgPSBOQU47CisgICAgICAgICAgICB3aGlsZSAoZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKSkKKyAgICAgICAgICAgICAgICBkPWV2YWxfZXhwcihwLCBlLT5wYXJhbVsxXSk7CisgICAgICAgICAgICByZXR1cm4gZDsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGVfdGF5bG9yOiB7CisgICAgICAgICAgICBkb3VibGUgdCA9IDEsIGQgPSAwLCB2OworICAgICAgICAgICAgZG91YmxlIHggPSBldmFsX2V4cHIocCwgZS0+cGFyYW1bMV0pOworICAgICAgICAgICAgaW50IGlkID0gZS0+cGFyYW1bMl0gPyBhdl9jbGlwKGV2YWxfZXhwcihwLCBlLT5wYXJhbVsyXSksIDAsIFZBUlMtMSkgOiAwOworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBkb3VibGUgdmFyMCA9IHAtPnZhcltpZF07CisgICAgICAgICAgICBmb3IoaT0wOyBpPDEwMDA7IGkrKykgeworICAgICAgICAgICAgICAgIGRvdWJsZSBsZCA9IGQ7CisgICAgICAgICAgICAgICAgcC0+dmFyW2lkXSA9IGk7CisgICAgICAgICAgICAgICAgdiA9IGV2YWxfZXhwcihwLCBlLT5wYXJhbVswXSk7CisgICAgICAgICAgICAgICAgZCArPSB0KnY7CisgICAgICAgICAgICAgICAgaWYobGQ9PWQgJiYgdikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgdCAqPSB4IC8gKGkrMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwLT52YXJbaWRdID0gdmFyMDsKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisgICAgICAgIGNhc2UgZV9yb290OiB7CisgICAgICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgICAgIGRvdWJsZSBsb3cgPSAtMSwgaGlnaCA9IC0xLCB2LCBsb3dfdiA9IC1EQkxfTUFYLCBoaWdoX3YgPSBEQkxfTUFYOworICAgICAgICAgICAgZG91YmxlIHZhcjAgPSBwLT52YXJbMF07CisgICAgICAgICAgICBkb3VibGUgeF9tYXggPSBldmFsX2V4cHIocCwgZS0+cGFyYW1bMV0pOworICAgICAgICAgICAgZm9yKGk9LTE7IGk8MTAyNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYoaTwyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgcC0+dmFyWzBdID0gYXZfcmV2ZXJzZVtpJjI1NV0qeF9tYXgvMjU1OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHAtPnZhclswXSA9IHhfbWF4KnBvdygwLjksIGktMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkmMSkgcC0+dmFyWzBdICo9IC0xOworICAgICAgICAgICAgICAgICAgICBpZiAoaSYyKSBwLT52YXJbMF0gKz0gbG93OworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICBwLT52YXJbMF0gKz0gaGlnaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdiA9IGV2YWxfZXhwcihwLCBlLT5wYXJhbVswXSk7CisgICAgICAgICAgICAgICAgaWYgKHY8PTAgJiYgdj5sb3dfdikgeworICAgICAgICAgICAgICAgICAgICBsb3cgICAgPSBwLT52YXJbMF07CisgICAgICAgICAgICAgICAgICAgIGxvd192ICA9IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2Pj0wICYmIHY8aGlnaF92KSB7CisgICAgICAgICAgICAgICAgICAgIGhpZ2ggICA9IHAtPnZhclswXTsKKyAgICAgICAgICAgICAgICAgICAgaGlnaF92ID0gdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvdz49MCAmJiBoaWdoPj0wKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8MTAwMDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwLT52YXJbMF0gPSAobG93K2hpZ2gpKjAuNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb3cgPT0gcC0+dmFyWzBdIHx8IGhpZ2ggPT0gcC0+dmFyWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGV2YWxfZXhwcihwLCBlLT5wYXJhbVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodjw9MCkgbG93ID0gcC0+dmFyWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHY+PTApIGhpZ2g9IHAtPnZhclswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc25hbih2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdyA9IGhpZ2ggPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAtPnZhclswXSA9IHZhcjA7CisgICAgICAgICAgICByZXR1cm4gLWxvd192PGhpZ2hfdiA/IGxvdyA6IGhpZ2g7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgZG91YmxlIGQgPSBldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pOworICAgICAgICAgICAgZG91YmxlIGQyID0gZXZhbF9leHByKHAsIGUtPnBhcmFtWzFdKTsKKyAgICAgICAgICAgIHN3aXRjaCAoZS0+dHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgZV9tb2Q6IHJldHVybiBlLT52YWx1ZSAqIChkIC0gZmxvb3IoKCFDT05GSUdfRlRSQVBWIHx8IGQyKSA/IGQgLyBkMiA6IGQgKiBJTkZJTklUWSkgKiBkMik7CisgICAgICAgICAgICAgICAgY2FzZSBlX2djZDogcmV0dXJuIGUtPnZhbHVlICogYXZfZ2NkKGQsZDIpOworICAgICAgICAgICAgICAgIGNhc2UgZV9tYXg6IHJldHVybiBlLT52YWx1ZSAqIChkID4gIGQyID8gICBkIDogZDIpOworICAgICAgICAgICAgICAgIGNhc2UgZV9taW46IHJldHVybiBlLT52YWx1ZSAqIChkIDwgIGQyID8gICBkIDogZDIpOworICAgICAgICAgICAgICAgIGNhc2UgZV9lcTogIHJldHVybiBlLT52YWx1ZSAqIChkID09IGQyID8gMS4wIDogMC4wKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVfZ3Q6ICByZXR1cm4gZS0+dmFsdWUgKiAoZCA+ICBkMiA/IDEuMCA6IDAuMCk7CisgICAgICAgICAgICAgICAgY2FzZSBlX2d0ZTogcmV0dXJuIGUtPnZhbHVlICogKGQgPj0gZDIgPyAxLjAgOiAwLjApOworICAgICAgICAgICAgICAgIGNhc2UgZV9sdDogIHJldHVybiBlLT52YWx1ZSAqIChkIDwgIGQyID8gMS4wIDogMC4wKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVfbHRlOiByZXR1cm4gZS0+dmFsdWUgKiAoZCA8PSBkMiA/IDEuMCA6IDAuMCk7CisgICAgICAgICAgICAgICAgY2FzZSBlX3BvdzogcmV0dXJuIGUtPnZhbHVlICogcG93KGQsIGQyKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVfbXVsOiByZXR1cm4gZS0+dmFsdWUgKiAoZCAqIGQyKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVfZGl2OiByZXR1cm4gZS0+dmFsdWUgKiAoKCFDT05GSUdfRlRSQVBWIHx8IGQyICkgPyAoZCAvIGQyKSA6IGQgKiBJTkZJTklUWSk7CisgICAgICAgICAgICAgICAgY2FzZSBlX2FkZDogcmV0dXJuIGUtPnZhbHVlICogKGQgKyBkMik7CisgICAgICAgICAgICAgICAgY2FzZSBlX2xhc3Q6cmV0dXJuIGUtPnZhbHVlICogZDI7CisgICAgICAgICAgICAgICAgY2FzZSBlX3N0IDogcmV0dXJuIGUtPnZhbHVlICogKHAtPnZhclthdl9jbGlwKGQsIDAsIFZBUlMtMSldPSBkMik7CisgICAgICAgICAgICAgICAgY2FzZSBlX2h5cG90OnJldHVybiBlLT52YWx1ZSAqIChzcXJ0KGQqZCArIGQyKmQyKSk7CisgICAgICAgICAgICAgICAgY2FzZSBlX2JpdGFuZDogcmV0dXJuIGlzbmFuKGQpIHx8IGlzbmFuKGQyKSA/IE5BTiA6IGUtPnZhbHVlICogKChsb25nIGludClkICYgKGxvbmcgaW50KWQyKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVfYml0b3I6ICByZXR1cm4gaXNuYW4oZCkgfHwgaXNuYW4oZDIpID8gTkFOIDogZS0+dmFsdWUgKiAoKGxvbmcgaW50KWQgfCAobG9uZyBpbnQpZDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOQU47Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZXhwcihBVkV4cHIgKiplLCBQYXJzZXIgKnApOworCit2b2lkIGF2X2V4cHJfZnJlZShBVkV4cHIgKmUpCit7CisgICAgaWYgKCFlKSByZXR1cm47CisgICAgYXZfZXhwcl9mcmVlKGUtPnBhcmFtWzBdKTsKKyAgICBhdl9leHByX2ZyZWUoZS0+cGFyYW1bMV0pOworICAgIGF2X2V4cHJfZnJlZShlLT5wYXJhbVsyXSk7CisgICAgYXZfZnJlZXAoJmUtPnZhcik7CisgICAgYXZfZnJlZXAoJmUpOworfQorCitzdGF0aWMgaW50IHBhcnNlX3ByaW1hcnkoQVZFeHByICoqZSwgUGFyc2VyICpwKQoreworICAgIEFWRXhwciAqZCA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWRXhwcikpOworICAgIGNoYXIgKm5leHQgPSBwLT5zLCAqczAgPSBwLT5zOworICAgIGludCByZXQsIGk7CisKKyAgICBpZiAoIWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBudW1iZXIgKi8KKyAgICBkLT52YWx1ZSA9IGF2X3N0cnRvZChwLT5zLCAmbmV4dCk7CisgICAgaWYgKG5leHQgIT0gcC0+cykgeworICAgICAgICBkLT50eXBlID0gZV92YWx1ZTsKKyAgICAgICAgcC0+cz0gbmV4dDsKKyAgICAgICAgKmUgPSBkOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZC0+dmFsdWUgPSAxOworCisgICAgLyogbmFtZWQgY29uc3RhbnRzICovCisgICAgZm9yIChpPTA7IHAtPmNvbnN0X25hbWVzICYmIHAtPmNvbnN0X25hbWVzW2ldOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cm1hdGNoKHAtPnMsIHAtPmNvbnN0X25hbWVzW2ldKSkgeworICAgICAgICAgICAgcC0+cys9IHN0cmxlbihwLT5jb25zdF9uYW1lc1tpXSk7CisgICAgICAgICAgICBkLT50eXBlID0gZV9jb25zdDsKKyAgICAgICAgICAgIGQtPmEuY29uc3RfaW5kZXggPSBpOworICAgICAgICAgICAgKmUgPSBkOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGNvbnN0YW50cyk7IGkrKykgeworICAgICAgICBpZiAoc3RybWF0Y2gocC0+cywgY29uc3RhbnRzW2ldLm5hbWUpKSB7CisgICAgICAgICAgICBwLT5zICs9IHN0cmxlbihjb25zdGFudHNbaV0ubmFtZSk7CisgICAgICAgICAgICBkLT50eXBlID0gZV92YWx1ZTsKKyAgICAgICAgICAgIGQtPnZhbHVlID0gY29uc3RhbnRzW2ldLnZhbHVlOworICAgICAgICAgICAgKmUgPSBkOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwLT5zPSBzdHJjaHIocC0+cywgJygnKTsKKyAgICBpZiAoIXAtPnMpIHsKKyAgICAgICAgYXZfbG9nKHAsIEFWX0xPR19FUlJPUiwgIlVuZGVmaW5lZCBjb25zdGFudCBvciBtaXNzaW5nICcoJyBpbiAnJXMnXG4iLCBzMCk7CisgICAgICAgIHAtPnM9IG5leHQ7CisgICAgICAgIGF2X2V4cHJfZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcC0+cysrOyAvLyAiKCIKKyAgICBpZiAoKm5leHQgPT0gJygnKSB7IC8vIHNwZWNpYWwgY2FzZSBkby1ub3RoaW5nCisgICAgICAgIGF2X2ZyZWVwKCZkKTsKKyAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9leHByKCZkLCBwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHAtPnNbMF0gIT0gJyknKSB7CisgICAgICAgICAgICBhdl9sb2cocCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyAnKScgaW4gJyVzJ1xuIiwgczApOworICAgICAgICAgICAgYXZfZXhwcl9mcmVlKGQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBwLT5zKys7IC8vICIpIgorICAgICAgICAqZSA9IGQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKHJldCA9IHBhcnNlX2V4cHIoJihkLT5wYXJhbVswXSksIHApKSA8IDApIHsKKyAgICAgICAgYXZfZXhwcl9mcmVlKGQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAocC0+c1swXT09ICcsJykgeworICAgICAgICBwLT5zKys7IC8vICIsIgorICAgICAgICBwYXJzZV9leHByKCZkLT5wYXJhbVsxXSwgcCk7CisgICAgfQorICAgIGlmIChwLT5zWzBdPT0gJywnKSB7CisgICAgICAgIHAtPnMrKzsgLy8gIiwiCisgICAgICAgIHBhcnNlX2V4cHIoJmQtPnBhcmFtWzJdLCBwKTsKKyAgICB9CisgICAgaWYgKHAtPnNbMF0gIT0gJyknKSB7CisgICAgICAgIGF2X2xvZyhwLCBBVl9MT0dfRVJST1IsICJNaXNzaW5nICcpJyBvciB0b28gbWFueSBhcmdzIGluICclcydcbiIsIHMwKTsKKyAgICAgICAgYXZfZXhwcl9mcmVlKGQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBwLT5zKys7IC8vICIpIgorCisgICAgZC0+dHlwZSA9IGVfZnVuYzA7CisgICAgICAgICBpZiAoc3RybWF0Y2gobmV4dCwgInNpbmgiICApKSBkLT5hLmZ1bmMwID0gc2luaDsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAiY29zaCIgICkpIGQtPmEuZnVuYzAgPSBjb3NoOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJ0YW5oIiAgKSkgZC0+YS5mdW5jMCA9IHRhbmg7CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgInNpbiIgICApKSBkLT5hLmZ1bmMwID0gc2luOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJjb3MiICAgKSkgZC0+YS5mdW5jMCA9IGNvczsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAidGFuIiAgICkpIGQtPmEuZnVuYzAgPSB0YW47CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgImF0YW4iICApKSBkLT5hLmZ1bmMwID0gYXRhbjsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAiYXNpbiIgICkpIGQtPmEuZnVuYzAgPSBhc2luOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJhY29zIiAgKSkgZC0+YS5mdW5jMCA9IGFjb3M7CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgImV4cCIgICApKSBkLT5hLmZ1bmMwID0gZXhwOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJsb2ciICAgKSkgZC0+YS5mdW5jMCA9IGxvZzsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAiYWJzIiAgICkpIGQtPmEuZnVuYzAgPSBmYWJzOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJ0aW1lIiAgKSkgZC0+YS5mdW5jMCA9IGV0aW1lOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJzcXVpc2giKSkgZC0+dHlwZSA9IGVfc3F1aXNoOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJnYXVzcyIgKSkgZC0+dHlwZSA9IGVfZ2F1c3M7CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgIm1vZCIgICApKSBkLT50eXBlID0gZV9tb2Q7CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgIm1heCIgICApKSBkLT50eXBlID0gZV9tYXg7CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgIm1pbiIgICApKSBkLT50eXBlID0gZV9taW47CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgImVxIiAgICApKSBkLT50eXBlID0gZV9lcTsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAiZ3RlIiAgICkpIGQtPnR5cGUgPSBlX2d0ZTsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAiZ3QiICAgICkpIGQtPnR5cGUgPSBlX2d0OworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJsdGUiICAgKSkgZC0+dHlwZSA9IGVfbHRlOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJsdCIgICAgKSkgZC0+dHlwZSA9IGVfbHQ7CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgImxkIiAgICApKSBkLT50eXBlID0gZV9sZDsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAiaXNuYW4iICkpIGQtPnR5cGUgPSBlX2lzbmFuOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJpc2luZiIgKSkgZC0+dHlwZSA9IGVfaXNpbmY7CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgInN0IiAgICApKSBkLT50eXBlID0gZV9zdDsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAid2hpbGUiICkpIGQtPnR5cGUgPSBlX3doaWxlOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJ0YXlsb3IiKSkgZC0+dHlwZSA9IGVfdGF5bG9yOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJyb290IiAgKSkgZC0+dHlwZSA9IGVfcm9vdDsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAiZmxvb3IiICkpIGQtPnR5cGUgPSBlX2Zsb29yOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJjZWlsIiAgKSkgZC0+dHlwZSA9IGVfY2VpbDsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAidHJ1bmMiICkpIGQtPnR5cGUgPSBlX3RydW5jOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJzcXJ0IiAgKSkgZC0+dHlwZSA9IGVfc3FydDsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAibm90IiAgICkpIGQtPnR5cGUgPSBlX25vdDsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAicG93IiAgICkpIGQtPnR5cGUgPSBlX3BvdzsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAicHJpbnQiICkpIGQtPnR5cGUgPSBlX3ByaW50OworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJyYW5kb20iKSkgZC0+dHlwZSA9IGVfcmFuZG9tOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJoeXBvdCIgKSkgZC0+dHlwZSA9IGVfaHlwb3Q7CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgImdjZCIgICApKSBkLT50eXBlID0gZV9nY2Q7CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgImlmIiAgICApKSBkLT50eXBlID0gZV9pZjsKKyAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAiaWZub3QiICkpIGQtPnR5cGUgPSBlX2lmbm90OworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJiaXRhbmQiKSkgZC0+dHlwZSA9IGVfYml0YW5kOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJiaXRvciIgKSkgZC0+dHlwZSA9IGVfYml0b3I7CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgImJldHdlZW4iKSlkLT50eXBlID0gZV9iZXR3ZWVuOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJjbGlwIiAgKSkgZC0+dHlwZSA9IGVfY2xpcDsKKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChpPTA7IHAtPmZ1bmMxX25hbWVzICYmIHAtPmZ1bmMxX25hbWVzW2ldOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJtYXRjaChuZXh0LCBwLT5mdW5jMV9uYW1lc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBkLT5hLmZ1bmMxID0gcC0+ZnVuY3MxW2ldOworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBlX2Z1bmMxOworICAgICAgICAgICAgICAgICplID0gZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wOyBwLT5mdW5jMl9uYW1lcyAmJiBwLT5mdW5jMl9uYW1lc1tpXTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3RybWF0Y2gobmV4dCwgcC0+ZnVuYzJfbmFtZXNbaV0pKSB7CisgICAgICAgICAgICAgICAgZC0+YS5mdW5jMiA9IHAtPmZ1bmNzMltpXTsKKyAgICAgICAgICAgICAgICBkLT50eXBlID0gZV9mdW5jMjsKKyAgICAgICAgICAgICAgICAqZSA9IGQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdl9sb2cocCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBmdW5jdGlvbiBpbiAnJXMnXG4iLCBzMCk7CisgICAgICAgIGF2X2V4cHJfZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAqZSA9IGQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBBVkV4cHIgKm1ha2VfZXZhbF9leHByKGludCB0eXBlLCBpbnQgdmFsdWUsIEFWRXhwciAqcDAsIEFWRXhwciAqcDEpCit7CisgICAgQVZFeHByICplID0gYXZfbWFsbG9jeihzaXplb2YoQVZFeHByKSk7CisgICAgaWYgKCFlKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlLT50eXBlICAgICA9dHlwZSAgIDsKKyAgICBlLT52YWx1ZSAgICA9dmFsdWUgIDsKKyAgICBlLT5wYXJhbVswXSA9cDAgICAgIDsKKyAgICBlLT5wYXJhbVsxXSA9cDEgICAgIDsKKyAgICByZXR1cm4gZTsKK30KKworc3RhdGljIGludCBwYXJzZV9wb3coQVZFeHByICoqZSwgUGFyc2VyICpwLCBpbnQgKnNpZ24pCit7CisgICAgKnNpZ249ICgqcC0+cyA9PSAnKycpIC0gKCpwLT5zID09ICctJyk7CisgICAgcC0+cyArPSAqc2lnbiYxOworICAgIHJldHVybiBwYXJzZV9wcmltYXJ5KGUsIHApOworfQorCitzdGF0aWMgaW50IHBhcnNlX2RCKEFWRXhwciAqKmUsIFBhcnNlciAqcCwgaW50ICpzaWduKQoreworICAgIC8qIGRvIG5vdCBmaWx0ZXIgb3V0IHRoZSBuZWdhdGl2ZSBzaWduIHdoZW4gcGFyc2luZyBhIGRCIHZhbHVlLgorICAgICAgIGZvciBleGFtcGxlLCAtM2RCIGlzIG5vdCB0aGUgc2FtZSBhcyAtKDNkQikgKi8KKyAgICBpZiAoKnAtPnMgPT0gJy0nKSB7CisgICAgICAgIGNoYXIgKm5leHQ7CisgICAgICAgIGRvdWJsZSBhdl91bnVzZWQgaWdub3JlZCA9IHN0cnRvZChwLT5zLCAmbmV4dCk7CisgICAgICAgIGlmIChuZXh0ICE9IHAtPnMgJiYgbmV4dFswXSA9PSAnZCcgJiYgbmV4dFsxXSA9PSAnQicpIHsKKyAgICAgICAgICAgICpzaWduID0gMDsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZV9wcmltYXJ5KGUsIHApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYXJzZV9wb3coZSwgcCwgc2lnbik7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZmFjdG9yKEFWRXhwciAqKmUsIFBhcnNlciAqcCkKK3sKKyAgICBpbnQgc2lnbiwgc2lnbjIsIHJldDsKKyAgICBBVkV4cHIgKmUwLCAqZTEsICplMjsKKyAgICBpZiAoKHJldCA9IHBhcnNlX2RCKCZlMCwgcCwgJnNpZ24pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgd2hpbGUocC0+c1swXT09J14nKXsKKyAgICAgICAgZTEgPSBlMDsKKyAgICAgICAgcC0+cysrOworICAgICAgICBpZiAoKHJldCA9IHBhcnNlX2RCKCZlMiwgcCwgJnNpZ24yKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9leHByX2ZyZWUoZTEpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBlMCA9IG1ha2VfZXZhbF9leHByKGVfcG93LCAxLCBlMSwgZTIpOworICAgICAgICBpZiAoIWUwKSB7CisgICAgICAgICAgICBhdl9leHByX2ZyZWUoZTEpOworICAgICAgICAgICAgYXZfZXhwcl9mcmVlKGUyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGUwLT5wYXJhbVsxXSkgZTAtPnBhcmFtWzFdLT52YWx1ZSAqPSAoc2lnbjJ8MSk7CisgICAgfQorICAgIGlmIChlMCkgZTAtPnZhbHVlICo9IChzaWdufDEpOworCisgICAgKmUgPSBlMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV90ZXJtKEFWRXhwciAqKmUsIFBhcnNlciAqcCkKK3sKKyAgICBpbnQgcmV0OworICAgIEFWRXhwciAqZTAsICplMSwgKmUyOworICAgIGlmICgocmV0ID0gcGFyc2VfZmFjdG9yKCZlMCwgcCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB3aGlsZSAocC0+c1swXT09JyonIHx8IHAtPnNbMF09PScvJykgeworICAgICAgICBpbnQgYz0gKnAtPnMrKzsKKyAgICAgICAgZTEgPSBlMDsKKyAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9mYWN0b3IoJmUyLCBwKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9leHByX2ZyZWUoZTEpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBlMCA9IG1ha2VfZXZhbF9leHByKGMgPT0gJyonID8gZV9tdWwgOiBlX2RpdiwgMSwgZTEsIGUyKTsKKyAgICAgICAgaWYgKCFlMCkgeworICAgICAgICAgICAgYXZfZXhwcl9mcmVlKGUxKTsKKyAgICAgICAgICAgIGF2X2V4cHJfZnJlZShlMik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorICAgICplID0gZTA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3ViZXhwcihBVkV4cHIgKiplLCBQYXJzZXIgKnApCit7CisgICAgaW50IHJldDsKKyAgICBBVkV4cHIgKmUwLCAqZTEsICplMjsKKyAgICBpZiAoKHJldCA9IHBhcnNlX3Rlcm0oJmUwLCBwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHdoaWxlICgqcC0+cyA9PSAnKycgfHwgKnAtPnMgPT0gJy0nKSB7CisgICAgICAgIGUxID0gZTA7CisgICAgICAgIGlmICgocmV0ID0gcGFyc2VfdGVybSgmZTIsIHApKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2V4cHJfZnJlZShlMSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGUwID0gbWFrZV9ldmFsX2V4cHIoZV9hZGQsIDEsIGUxLCBlMik7CisgICAgICAgIGlmICghZTApIHsKKyAgICAgICAgICAgIGF2X2V4cHJfZnJlZShlMSk7CisgICAgICAgICAgICBhdl9leHByX2ZyZWUoZTIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAqZSA9IGUwOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2V4cHIoQVZFeHByICoqZSwgUGFyc2VyICpwKQoreworICAgIGludCByZXQ7CisgICAgQVZFeHByICplMCwgKmUxLCAqZTI7CisgICAgaWYgKHAtPnN0YWNrX2luZGV4IDw9IDApIC8vcHJvdGVjdCBhZ2FpbnN0IHN0YWNrIG92ZXJmbG93cworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIHAtPnN0YWNrX2luZGV4LS07CisKKyAgICBpZiAoKHJldCA9IHBhcnNlX3N1YmV4cHIoJmUwLCBwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHdoaWxlICgqcC0+cyA9PSAnOycpIHsKKyAgICAgICAgcC0+cysrOworICAgICAgICBlMSA9IGUwOworICAgICAgICBpZiAoKHJldCA9IHBhcnNlX3N1YmV4cHIoJmUyLCBwKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9leHByX2ZyZWUoZTEpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBlMCA9IG1ha2VfZXZhbF9leHByKGVfbGFzdCwgMSwgZTEsIGUyKTsKKyAgICAgICAgaWYgKCFlMCkgeworICAgICAgICAgICAgYXZfZXhwcl9mcmVlKGUxKTsKKyAgICAgICAgICAgIGF2X2V4cHJfZnJlZShlMik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfTsKKworICAgIHAtPnN0YWNrX2luZGV4Kys7CisgICAgKmUgPSBlMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfZXhwcihBVkV4cHIgKmUpCit7CisgICAgaWYgKCFlKSByZXR1cm4gMDsKKyAgICBzd2l0Y2ggKGUtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBlX3ZhbHVlOgorICAgICAgICBjYXNlIGVfY29uc3Q6IHJldHVybiAxOworICAgICAgICBjYXNlIGVfZnVuYzA6CisgICAgICAgIGNhc2UgZV9mdW5jMToKKyAgICAgICAgY2FzZSBlX3NxdWlzaDoKKyAgICAgICAgY2FzZSBlX2xkOgorICAgICAgICBjYXNlIGVfZ2F1c3M6CisgICAgICAgIGNhc2UgZV9pc25hbjoKKyAgICAgICAgY2FzZSBlX2lzaW5mOgorICAgICAgICBjYXNlIGVfZmxvb3I6CisgICAgICAgIGNhc2UgZV9jZWlsOgorICAgICAgICBjYXNlIGVfdHJ1bmM6CisgICAgICAgIGNhc2UgZV9zcXJ0OgorICAgICAgICBjYXNlIGVfbm90OgorICAgICAgICBjYXNlIGVfcmFuZG9tOgorICAgICAgICAgICAgcmV0dXJuIHZlcmlmeV9leHByKGUtPnBhcmFtWzBdKSAmJiAhZS0+cGFyYW1bMV07CisgICAgICAgIGNhc2UgZV9wcmludDoKKyAgICAgICAgICAgIHJldHVybiB2ZXJpZnlfZXhwcihlLT5wYXJhbVswXSkKKyAgICAgICAgICAgICAgICAgICAmJiAoIWUtPnBhcmFtWzFdIHx8IHZlcmlmeV9leHByKGUtPnBhcmFtWzFdKSk7CisgICAgICAgIGNhc2UgZV9pZjoKKyAgICAgICAgY2FzZSBlX2lmbm90OgorICAgICAgICBjYXNlIGVfdGF5bG9yOgorICAgICAgICAgICAgcmV0dXJuIHZlcmlmeV9leHByKGUtPnBhcmFtWzBdKSAmJiB2ZXJpZnlfZXhwcihlLT5wYXJhbVsxXSkKKyAgICAgICAgICAgICAgICAgICAmJiAoIWUtPnBhcmFtWzJdIHx8IHZlcmlmeV9leHByKGUtPnBhcmFtWzJdKSk7CisgICAgICAgIGNhc2UgZV9iZXR3ZWVuOgorICAgICAgICBjYXNlIGVfY2xpcDoKKyAgICAgICAgICAgIHJldHVybiB2ZXJpZnlfZXhwcihlLT5wYXJhbVswXSkgJiYKKyAgICAgICAgICAgICAgICAgICB2ZXJpZnlfZXhwcihlLT5wYXJhbVsxXSkgJiYKKyAgICAgICAgICAgICAgICAgICB2ZXJpZnlfZXhwcihlLT5wYXJhbVsyXSk7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiB2ZXJpZnlfZXhwcihlLT5wYXJhbVswXSkgJiYgdmVyaWZ5X2V4cHIoZS0+cGFyYW1bMV0pICYmICFlLT5wYXJhbVsyXTsKKyAgICB9Cit9CisKK2ludCBhdl9leHByX3BhcnNlKEFWRXhwciAqKmV4cHIsIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmNvbnN0X25hbWVzLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICpmdW5jMV9uYW1lcywgZG91YmxlICgqIGNvbnN0ICpmdW5jczEpKHZvaWQgKiwgZG91YmxlKSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqZnVuYzJfbmFtZXMsIGRvdWJsZSAoKiBjb25zdCAqZnVuY3MyKSh2b2lkICosIGRvdWJsZSwgZG91YmxlKSwKKyAgICAgICAgICAgICAgICAgIGludCBsb2dfb2Zmc2V0LCB2b2lkICpsb2dfY3R4KQoreworICAgIFBhcnNlciBwID0geyAwIH07CisgICAgQVZFeHByICplID0gTlVMTDsKKyAgICBjaGFyICp3ID0gYXZfbWFsbG9jKHN0cmxlbihzKSArIDEpOworICAgIGNoYXIgKndwID0gdzsKKyAgICBjb25zdCBjaGFyICpzMCA9IHM7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIXcpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB3aGlsZSAoKnMpCisgICAgICAgIGlmICghYXZfaXNzcGFjZSgqcysrKSkgKndwKysgPSBzWy0xXTsKKyAgICAqd3ArKyA9IDA7CisKKyAgICBwLmNsYXNzICAgICAgPSAmZXZhbF9jbGFzczsKKyAgICBwLnN0YWNrX2luZGV4PTEwMDsKKyAgICBwLnM9IHc7CisgICAgcC5jb25zdF9uYW1lcyA9IGNvbnN0X25hbWVzOworICAgIHAuZnVuY3MxICAgICAgPSBmdW5jczE7CisgICAgcC5mdW5jMV9uYW1lcyA9IGZ1bmMxX25hbWVzOworICAgIHAuZnVuY3MyICAgICAgPSBmdW5jczI7CisgICAgcC5mdW5jMl9uYW1lcyA9IGZ1bmMyX25hbWVzOworICAgIHAubG9nX29mZnNldCA9IGxvZ19vZmZzZXQ7CisgICAgcC5sb2dfY3R4ICAgID0gbG9nX2N0eDsKKworICAgIGlmICgocmV0ID0gcGFyc2VfZXhwcigmZSwgJnApKSA8IDApCisgICAgICAgIGdvdG8gZW5kOworICAgIGlmICgqcC5zKSB7CisgICAgICAgIGF2X2V4cHJfZnJlZShlKTsKKyAgICAgICAgYXZfbG9nKCZwLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNoYXJzICclcycgYXQgdGhlIGVuZCBvZiBleHByZXNzaW9uICclcydcbiIsIHAucywgczApOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZiAoIXZlcmlmeV9leHByKGUpKSB7CisgICAgICAgIGF2X2V4cHJfZnJlZShlKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZS0+dmFyPSBhdl9tYWxsb2N6KHNpemVvZihkb3VibGUpICpWQVJTKTsKKyAgICAqZXhwciA9IGU7CitlbmQ6CisgICAgYXZfZnJlZSh3KTsKKyAgICByZXR1cm4gcmV0OworfQorCitkb3VibGUgYXZfZXhwcl9ldmFsKEFWRXhwciAqZSwgY29uc3QgZG91YmxlICpjb25zdF92YWx1ZXMsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBQYXJzZXIgcCA9IHsgMCB9OworICAgIHAudmFyPSBlLT52YXI7CisKKyAgICBwLmNvbnN0X3ZhbHVlcyA9IGNvbnN0X3ZhbHVlczsKKyAgICBwLm9wYXF1ZSAgICAgPSBvcGFxdWU7CisgICAgcmV0dXJuIGV2YWxfZXhwcigmcCwgZSk7Cit9CisKK2ludCBhdl9leHByX3BhcnNlX2FuZF9ldmFsKGRvdWJsZSAqZCwgY29uc3QgY2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqY29uc3RfbmFtZXMsIGNvbnN0IGRvdWJsZSAqY29uc3RfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICpmdW5jMV9uYW1lcywgZG91YmxlICgqIGNvbnN0ICpmdW5jczEpKHZvaWQgKiwgZG91YmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqZnVuYzJfbmFtZXMsIGRvdWJsZSAoKiBjb25zdCAqZnVuY3MyKSh2b2lkICosIGRvdWJsZSwgZG91YmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSwgaW50IGxvZ19vZmZzZXQsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgQVZFeHByICplID0gTlVMTDsKKyAgICBpbnQgcmV0ID0gYXZfZXhwcl9wYXJzZSgmZSwgcywgY29uc3RfbmFtZXMsIGZ1bmMxX25hbWVzLCBmdW5jczEsIGZ1bmMyX25hbWVzLCBmdW5jczIsIGxvZ19vZmZzZXQsIGxvZ19jdHgpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgKmQgPSBOQU47CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgICpkID0gYXZfZXhwcl9ldmFsKGUsIGNvbnN0X3ZhbHVlcywgb3BhcXVlKTsKKyAgICBhdl9leHByX2ZyZWUoZSk7CisgICAgcmV0dXJuIGlzbmFuKCpkKSA/IEFWRVJST1IoRUlOVkFMKSA6IDA7Cit9CisKKyNpZmRlZiBURVNUCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBjb25zdCBkb3VibGUgY29uc3RfdmFsdWVzW10gPSB7CisgICAgTV9QSSwKKyAgICBNX0UsCisgICAgMAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbnN0X25hbWVzW10gPSB7CisgICAgIlBJIiwKKyAgICAiRSIsCisgICAgMAorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCBpOworICAgIGRvdWJsZSBkOworICAgIGNvbnN0IGNoYXIgKmNvbnN0ICpleHByOworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBleHByc1tdID0geworICAgICAgICAiIiwKKyAgICAgICAgIjE7MiIsCisgICAgICAgICItMjAiLAorICAgICAgICAiLVBJIiwKKyAgICAgICAgIitQSSIsCisgICAgICAgICIxKyg1LTIpXigzLTEpKzEvMitzaW4oUEkpLW1heCgtMi4yLC0zLjEpIiwKKyAgICAgICAgIjgwRy84MEdpIiwKKyAgICAgICAgIjFrIiwKKyAgICAgICAgIjFHaSIsCisgICAgICAgICIxZ2kiLAorICAgICAgICAiMUdpRm9vIiwKKyAgICAgICAgIjFrKzFrIiwKKyAgICAgICAgIjFHaSozZm9vIiwKKyAgICAgICAgImZvbyIsCisgICAgICAgICJmb28oIiwKKyAgICAgICAgImZvbygpIiwKKyAgICAgICAgImZvbykiLAorICAgICAgICAic2luIiwKKyAgICAgICAgInNpbigiLAorICAgICAgICAic2luKCkiLAorICAgICAgICAic2luKSIsCisgICAgICAgICJzaW4gMTAiLAorICAgICAgICAic2luKDEsMiwzKSIsCisgICAgICAgICJzaW4oMSApIiwKKyAgICAgICAgIjEiLAorICAgICAgICAiMWZvbyIsCisgICAgICAgICJiYXIgKyBQSSArIEUgKyAxMDBmKjIgKyBmb28iLAorICAgICAgICAiMTNrICsgMTJmIC0gZm9vKDEsIDIpIiwKKyAgICAgICAgIjFnaSIsCisgICAgICAgICIxR2kiLAorICAgICAgICAic3QoMCwgMTIzKSIsCisgICAgICAgICJzdCgxLCAxMjMpOyBsZCgxKSIsCisgICAgICAgICJsdGUoMCwgMSkiLAorICAgICAgICAibHRlKDEsIDEpIiwKKyAgICAgICAgImx0ZSgxLCAwKSIsCisgICAgICAgICJsdCgwLCAxKSIsCisgICAgICAgICJsdCgxLCAxKSIsCisgICAgICAgICJndCgxLCAwKSIsCisgICAgICAgICJndCgyLCA3KSIsCisgICAgICAgICJndGUoMTIyLCAxMjIpIiwKKyAgICAgICAgLyogY29tcHV0ZSAxKzIrLi4uK04gKi8KKyAgICAgICAgInN0KDAsIDEpOyB3aGlsZShsdGUobGQoMCksIDEwMCksIHN0KDEsIGxkKDEpK2xkKDApKTtzdCgwLCBsZCgwKSsxKSk7IGxkKDEpIiwKKyAgICAgICAgLyogY29tcHV0ZSBGaWIoTikgKi8KKyAgICAgICAgInN0KDEsIDEpOyBzdCgyLCAyKTsgc3QoMCwgMSk7IHdoaWxlKGx0ZShsZCgwKSwxMCksIHN0KDMsIGxkKDEpK2xkKDIpKTsgc3QoMSwgbGQoMikpOyBzdCgyLCBsZCgzKSk7IHN0KDAsIGxkKDApKzEpKTsgbGQoMykiLAorICAgICAgICAid2hpbGUoMCwgMTApIiwKKyAgICAgICAgInN0KDAsIDEpOyB3aGlsZShsdGUobGQoMCksMTAwKSwgc3QoMSwgbGQoMSkrbGQoMCkpOyBzdCgwLCBsZCgwKSsxKSkiLAorICAgICAgICAiaXNuYW4oMSkiLAorICAgICAgICAiaXNuYW4oTkFOKSIsCisgICAgICAgICJpc25hbihJTkYpIiwKKyAgICAgICAgImlzaW5mKDEpIiwKKyAgICAgICAgImlzaW5mKE5BTikiLAorICAgICAgICAiaXNpbmYoSU5GKSIsCisgICAgICAgICJmbG9vcihOQU4pIiwKKyAgICAgICAgImZsb29yKDEyMy4xMjMpIiwKKyAgICAgICAgImZsb29yKC0xMjMuMTIzKSIsCisgICAgICAgICJ0cnVuYygxMjMuMTIzKSIsCisgICAgICAgICJ0cnVuYygtMTIzLjEyMykiLAorICAgICAgICAiY2VpbCgxMjMuMTIzKSIsCisgICAgICAgICJjZWlsKC0xMjMuMTIzKSIsCisgICAgICAgICJzcXJ0KDE3NjQpIiwKKyAgICAgICAgImlzbmFuKHNxcnQoLTEpKSIsCisgICAgICAgICJub3QoMSkiLAorICAgICAgICAibm90KE5BTikiLAorICAgICAgICAibm90KDApIiwKKyAgICAgICAgIjYuMDIwNmRCIiwKKyAgICAgICAgIi0zLjAxMDNkQiIsCisgICAgICAgICJwb3coMCwxLjIzKSIsCisgICAgICAgICJwb3coUEksMS4yMykiLAorICAgICAgICAiUEleMS4yMyIsCisgICAgICAgICJwb3coLTEsMS4yMykiLAorICAgICAgICAiaWYoMSwgMikiLAorICAgICAgICAiaWYoMSwgMSwgMikiLAorICAgICAgICAiaWYoMCwgMSwgMikiLAorICAgICAgICAiaWZub3QoMCwgMjMpIiwKKyAgICAgICAgImlmbm90KDEsIE5hTikgKyBpZigwLCAxKSIsCisgICAgICAgICJpZm5vdCgxLCAxLCAyKSIsCisgICAgICAgICJpZm5vdCgwLCAxLCAyKSIsCisgICAgICAgICJ0YXlsb3IoMSwgMSkiLAorICAgICAgICAidGF5bG9yKGVxKG1vZChsZCgxKSw0KSwxKS1lcShtb2QobGQoMSksNCksMyksIFBJLzIsIDEpIiwKKyAgICAgICAgInJvb3Qoc2luKGxkKDApKS0xLCAyKSIsCisgICAgICAgICJyb290KHNpbihsZCgwKSkrNitzaW4obGQoMCkvMTIpLWxvZyhsZCgwKSksIDEwMCkiLAorICAgICAgICAiNzAwMDAwMEIqcmFuZG9tKDApIiwKKyAgICAgICAgInNxdWlzaCgyKSIsCisgICAgICAgICJnYXVzcygwLjEpIiwKKyAgICAgICAgImh5cG90KDQsMykiLAorICAgICAgICAiZ2NkKDMwLDU1KSpwcmludChtaW4oOSwxKSkiLAorICAgICAgICAiYml0b3IoNDIsIDEyKSIsCisgICAgICAgICJiaXRhbmQoNDIsIDEyKSIsCisgICAgICAgICJiaXRhbmQoTkFOLCAxKSIsCisgICAgICAgICJiZXR3ZWVuKDEwLCAtMywgMTApIiwKKyAgICAgICAgImJldHdlZW4oLTQsIC0yLCAtMSkiLAorICAgICAgICAiYmV0d2VlbigxLDIpIiwKKyAgICAgICAgImNsaXAoMCwgMiwgMSkiLAorICAgICAgICAiY2xpcCgwLzAsIDEsIDIpIiwKKyAgICAgICAgImNsaXAoMCwgMC8wLCAxKSIsCisgICAgICAgIE5VTEwKKyAgICB9OworCisgICAgZm9yIChleHByID0gZXhwcnM7ICpleHByOyBleHByKyspIHsKKyAgICAgICAgcHJpbnRmKCJFdmFsdWF0aW5nICclcydcbiIsICpleHByKTsKKyAgICAgICAgYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmZCwgKmV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfbmFtZXMsIGNvbnN0X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBOVUxMKTsKKyAgICAgICAgaWYgKGlzbmFuKGQpKQorICAgICAgICAgICAgcHJpbnRmKCInJXMnIC0+IG5hblxuXG4iLCAqZXhwcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiJyVzJyAtPiAlZlxuXG4iLCAqZXhwciwgZCk7CisgICAgfQorCisgICAgYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmZCwgIjErKDUtMileKDMtMSkrMS8yK3NpbihQSSktbWF4KC0yLjIsLTMuMSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfbmFtZXMsIGNvbnN0X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOworICAgIHByaW50ZigiJWYgPT0gMTIuN1xuIiwgZCk7CisgICAgYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmZCwgIjgwRy84MEdpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X25hbWVzLCBjb25zdF92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBOVUxMKTsKKyAgICBwcmludGYoIiVmID09IDAuOTMxMzIyNTc1XG4iLCBkKTsKKworICAgIGlmIChhcmdjID4gMSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItdCIpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDUwOyBpKyspIHsKKyAgICAgICAgICAgIFNUQVJUX1RJTUVSOworICAgICAgICAgICAgYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmZCwgIjErKDUtMileKDMtMSkrMS8yK3NpbihQSSktbWF4KC0yLjIsLTMuMSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9uYW1lcywgY29uc3RfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIFNUT1BfVElNRVIoImF2X2V4cHJfcGFyc2VfYW5kX2V2YWwiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2V2YWwuaCBiL2ZmbXBlZy9saWJhdnV0aWwvZXZhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNTliMGYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2V2YWwuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBzaW1wbGUgYXJpdGhtZXRpYyBleHByZXNzaW9uIGV2YWx1YXRvcgorICovCisKKyNpZm5kZWYgQVZVVElMX0VWQUxfSAorI2RlZmluZSBBVlVUSUxfRVZBTF9ICisKKyNpbmNsdWRlICJhdnV0aWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQVZFeHByIEFWRXhwcjsKKworLyoqCisgKiBQYXJzZSBhbmQgZXZhbHVhdGUgYW4gZXhwcmVzc2lvbi4KKyAqIE5vdGUsIHRoaXMgaXMgc2lnbmlmaWNhbnRseSBzbG93ZXIgdGhhbiBhdl9leHByX2V2YWwoKS4KKyAqCisgKiBAcGFyYW0gcmVzIGEgcG9pbnRlciB0byBhIGRvdWJsZSB3aGVyZSBpcyBwdXQgdGhlIHJlc3VsdCB2YWx1ZSBvZgorICogdGhlIGV4cHJlc3Npb24sIG9yIE5BTiBpbiBjYXNlIG9mIGVycm9yCisgKiBAcGFyYW0gcyBleHByZXNzaW9uIGFzIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZywgZm9yIGV4YW1wbGUgIjErMl4zKzUqNStzaW4oMi8zKSIKKyAqIEBwYXJhbSBjb25zdF9uYW1lcyBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgemVybyB0ZXJtaW5hdGVkIHN0cmluZ3Mgb2YgY29uc3RhbnQgaWRlbnRpZmllcnMsIGZvciBleGFtcGxlIHsiUEkiLCAiRSIsIDB9CisgKiBAcGFyYW0gY29uc3RfdmFsdWVzIGEgemVybyB0ZXJtaW5hdGVkIGFycmF5IG9mIHZhbHVlcyBmb3IgdGhlIGlkZW50aWZpZXJzIGZyb20gY29uc3RfbmFtZXMKKyAqIEBwYXJhbSBmdW5jMV9uYW1lcyBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgemVybyB0ZXJtaW5hdGVkIHN0cmluZ3Mgb2YgZnVuY3MxIGlkZW50aWZpZXJzCisgKiBAcGFyYW0gZnVuY3MxIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IgZnVuY3Rpb25zIHdoaWNoIHRha2UgMSBhcmd1bWVudAorICogQHBhcmFtIGZ1bmMyX25hbWVzIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5ncyBvZiBmdW5jczIgaWRlbnRpZmllcnMKKyAqIEBwYXJhbSBmdW5jczIgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciBmdW5jdGlvbnMgd2hpY2ggdGFrZSAyIGFyZ3VtZW50cworICogQHBhcmFtIG9wYXF1ZSBhIHBvaW50ZXIgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gYWxsIGZ1bmN0aW9ucyBmcm9tIGZ1bmNzMSBhbmQgZnVuY3MyCisgKiBAcGFyYW0gbG9nX2N0eCBwYXJlbnQgbG9nZ2luZyBjb250ZXh0CisgKiBAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4KKyAqIEFWRVJST1IgY29kZSBvdGhlcndpc2UKKyAqLworaW50IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoZG91YmxlICpyZXMsIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmNvbnN0X25hbWVzLCBjb25zdCBkb3VibGUgKmNvbnN0X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqZnVuYzFfbmFtZXMsIGRvdWJsZSAoKiBjb25zdCAqZnVuY3MxKSh2b2lkICosIGRvdWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmZ1bmMyX25hbWVzLCBkb3VibGUgKCogY29uc3QgKmZ1bmNzMikodm9pZCAqLCBkb3VibGUsIGRvdWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsIGludCBsb2dfb2Zmc2V0LCB2b2lkICpsb2dfY3R4KTsKKworLyoqCisgKiBQYXJzZSBhbiBleHByZXNzaW9uLgorICoKKyAqIEBwYXJhbSBleHByIGEgcG9pbnRlciB3aGVyZSBpcyBwdXQgYW4gQVZFeHByIGNvbnRhaW5pbmcgdGhlIHBhcnNlZAorICogdmFsdWUgaW4gY2FzZSBvZiBzdWNjZXNzZnVsIHBhcnNpbmcsIG9yIE5VTEwgb3RoZXJ3aXNlLgorICogVGhlIHBvaW50ZWQgdG8gQVZFeHByIG11c3QgYmUgZnJlZWQgd2l0aCBhdl9leHByX2ZyZWUoKSBieSB0aGUgdXNlcgorICogd2hlbiBpdCBpcyBub3QgbmVlZGVkIGFueW1vcmUuCisgKiBAcGFyYW0gcyBleHByZXNzaW9uIGFzIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZywgZm9yIGV4YW1wbGUgIjErMl4zKzUqNStzaW4oMi8zKSIKKyAqIEBwYXJhbSBjb25zdF9uYW1lcyBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgemVybyB0ZXJtaW5hdGVkIHN0cmluZ3Mgb2YgY29uc3RhbnQgaWRlbnRpZmllcnMsIGZvciBleGFtcGxlIHsiUEkiLCAiRSIsIDB9CisgKiBAcGFyYW0gZnVuYzFfbmFtZXMgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIHplcm8gdGVybWluYXRlZCBzdHJpbmdzIG9mIGZ1bmNzMSBpZGVudGlmaWVycworICogQHBhcmFtIGZ1bmNzMSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIGZ1bmN0aW9ucyB3aGljaCB0YWtlIDEgYXJndW1lbnQKKyAqIEBwYXJhbSBmdW5jMl9uYW1lcyBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgemVybyB0ZXJtaW5hdGVkIHN0cmluZ3Mgb2YgZnVuY3MyIGlkZW50aWZpZXJzCisgKiBAcGFyYW0gZnVuY3MyIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IgZnVuY3Rpb25zIHdoaWNoIHRha2UgMiBhcmd1bWVudHMKKyAqIEBwYXJhbSBsb2dfY3R4IHBhcmVudCBsb2dnaW5nIGNvbnRleHQKKyAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbgorICogQVZFUlJPUiBjb2RlIG90aGVyd2lzZQorICovCitpbnQgYXZfZXhwcl9wYXJzZShBVkV4cHIgKipleHByLCBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICpjb25zdF9uYW1lcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqZnVuYzFfbmFtZXMsIGRvdWJsZSAoKiBjb25zdCAqZnVuY3MxKSh2b2lkICosIGRvdWJsZSksCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmZ1bmMyX25hbWVzLCBkb3VibGUgKCogY29uc3QgKmZ1bmNzMikodm9pZCAqLCBkb3VibGUsIGRvdWJsZSksCisgICAgICAgICAgICAgICAgICBpbnQgbG9nX29mZnNldCwgdm9pZCAqbG9nX2N0eCk7CisKKy8qKgorICogRXZhbHVhdGUgYSBwcmV2aW91c2x5IHBhcnNlZCBleHByZXNzaW9uLgorICoKKyAqIEBwYXJhbSBjb25zdF92YWx1ZXMgYSB6ZXJvIHRlcm1pbmF0ZWQgYXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgaWRlbnRpZmllcnMgZnJvbSBhdl9leHByX3BhcnNlKCkgY29uc3RfbmFtZXMKKyAqIEBwYXJhbSBvcGFxdWUgYSBwb2ludGVyIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGFsbCBmdW5jdGlvbnMgZnJvbSBmdW5jczEgYW5kIGZ1bmNzMgorICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24KKyAqLworZG91YmxlIGF2X2V4cHJfZXZhbChBVkV4cHIgKmUsIGNvbnN0IGRvdWJsZSAqY29uc3RfdmFsdWVzLCB2b2lkICpvcGFxdWUpOworCisvKioKKyAqIEZyZWUgYSBwYXJzZWQgZXhwcmVzc2lvbiBwcmV2aW91c2x5IGNyZWF0ZWQgd2l0aCBhdl9leHByX3BhcnNlKCkuCisgKi8KK3ZvaWQgYXZfZXhwcl9mcmVlKEFWRXhwciAqZSk7CisKKy8qKgorICogUGFyc2UgdGhlIHN0cmluZyBpbiBudW1zdHIgYW5kIHJldHVybiBpdHMgdmFsdWUgYXMgYSBkb3VibGUuIElmCisgKiB0aGUgc3RyaW5nIGlzIGVtcHR5LCBjb250YWlucyBvbmx5IHdoaXRlc3BhY2VzLCBvciBkb2VzIG5vdCBjb250YWluCisgKiBhbiBpbml0aWFsIHN1YnN0cmluZyB0aGF0IGhhcyB0aGUgZXhwZWN0ZWQgc3ludGF4IGZvciBhCisgKiBmbG9hdGluZy1wb2ludCBudW1iZXIsIG5vIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLiBJbiB0aGlzIGNhc2UsCisgKiByZXR1cm5zIGEgdmFsdWUgb2YgemVybyBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGluIHRhaWwgaXMgdGhlIHZhbHVlCisgKiBvZiBudW1zdHIuCisgKgorICogQHBhcmFtIG51bXN0ciBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBudW1iZXIsIG1heSBjb250YWluIG9uZSBvZgorICogdGhlIEludGVybmF0aW9uYWwgU3lzdGVtIG51bWJlciBwb3N0Zml4ZXMsIGZvciBleGFtcGxlICdLJywgJ00nLAorICogJ0cnLiBJZiAnaScgaXMgYXBwZW5kZWQgYWZ0ZXIgdGhlIHBvc3RmaXgsIHBvd2VycyBvZiAyIGFyZSB1c2VkCisgKiBpbnN0ZWFkIG9mIHBvd2VycyBvZiAxMC4gVGhlICdCJyBwb3N0Zml4IG11bHRpcGxpZXMgdGhlIHZhbHVlIGZvcgorICogOCwgYW5kIGNhbiBiZSBhcHBlbmRlZCBhZnRlciBhbm90aGVyIHBvc3RmaXggb3IgdXNlZCBhbG9uZS4gVGhpcworICogYWxsb3dzIHVzaW5nIGZvciBleGFtcGxlICdLQicsICdNaUInLCAnRycgYW5kICdCJyBhcyBwb3N0Zml4LgorICogQHBhcmFtIHRhaWwgaWYgbm9uLU5VTEwgcHV0cyBoZXJlIHRoZSBwb2ludGVyIHRvIHRoZSBjaGFyIG5leHQKKyAqIGFmdGVyIHRoZSBsYXN0IHBhcnNlZCBjaGFyYWN0ZXIKKyAqLworZG91YmxlIGF2X3N0cnRvZChjb25zdCBjaGFyICpudW1zdHIsIGNoYXIgKip0YWlsKTsKKworI2VuZGlmIC8qIEFWVVRJTF9FVkFMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvZmlmby5jIGIvZmZtcGVnL2xpYmF2dXRpbC9maWZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmMzE5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvZmlmby5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogYSB2ZXJ5IHNpbXBsZSBjaXJjdWxhciBidWZmZXIgRklGTyBpbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA2IFJvbWFuIFNoYXBvc2huaWsKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2YXNzZXJ0LmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZmlmby5oIgorCitzdGF0aWMgQVZGaWZvQnVmZmVyICpmaWZvX2FsbG9jX2NvbW1vbih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIEFWRmlmb0J1ZmZlciAqZjsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZiA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWRmlmb0J1ZmZlcikpOworICAgIGlmICghZikgeworICAgICAgICBhdl9mcmVlKGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmLT5idWZmZXIgPSBidWZmZXI7CisgICAgZi0+ZW5kICAgID0gZi0+YnVmZmVyICsgc2l6ZTsKKyAgICBhdl9maWZvX3Jlc2V0KGYpOworICAgIHJldHVybiBmOworfQorCitBVkZpZm9CdWZmZXIgKmF2X2ZpZm9fYWxsb2ModW5zaWduZWQgaW50IHNpemUpCit7CisgICAgdm9pZCAqYnVmZmVyID0gYXZfbWFsbG9jKHNpemUpOworICAgIHJldHVybiBmaWZvX2FsbG9jX2NvbW1vbihidWZmZXIsIHNpemUpOworfQorCitBVkZpZm9CdWZmZXIgKmF2X2ZpZm9fYWxsb2NfYXJyYXkoc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB2b2lkICpidWZmZXIgPSBhdl9tYWxsb2NfYXJyYXkobm1lbWIsIHNpemUpOworICAgIHJldHVybiBmaWZvX2FsbG9jX2NvbW1vbihidWZmZXIsIG5tZW1iICogc2l6ZSk7Cit9CisKK3ZvaWQgYXZfZmlmb19mcmVlKEFWRmlmb0J1ZmZlciAqZikKK3sKKyAgICBpZiAoZikgeworICAgICAgICBhdl9mcmVlcCgmZi0+YnVmZmVyKTsKKyAgICAgICAgYXZfZnJlZShmKTsKKyAgICB9Cit9CisKK3ZvaWQgYXZfZmlmb19mcmVlcChBVkZpZm9CdWZmZXIgKipmKQoreworICAgIGlmIChmKSB7CisgICAgICAgIGF2X2ZpZm9fZnJlZSgqZik7CisgICAgICAgICpmID0gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgYXZfZmlmb19yZXNldChBVkZpZm9CdWZmZXIgKmYpCit7CisgICAgZi0+d3B0ciA9IGYtPnJwdHIgPSBmLT5idWZmZXI7CisgICAgZi0+d25keCA9IGYtPnJuZHggPSAwOworfQorCitpbnQgYXZfZmlmb19zaXplKGNvbnN0IEFWRmlmb0J1ZmZlciAqZikKK3sKKyAgICByZXR1cm4gKHVpbnQzMl90KShmLT53bmR4IC0gZi0+cm5keCk7Cit9CisKK2ludCBhdl9maWZvX3NwYWNlKGNvbnN0IEFWRmlmb0J1ZmZlciAqZikKK3sKKyAgICByZXR1cm4gZi0+ZW5kIC0gZi0+YnVmZmVyIC0gYXZfZmlmb19zaXplKGYpOworfQorCitpbnQgYXZfZmlmb19yZWFsbG9jMihBVkZpZm9CdWZmZXIgKmYsIHVuc2lnbmVkIGludCBuZXdfc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgb2xkX3NpemUgPSBmLT5lbmQgLSBmLT5idWZmZXI7CisKKyAgICBpZiAob2xkX3NpemUgPCBuZXdfc2l6ZSkgeworICAgICAgICBpbnQgbGVuICAgICAgICAgID0gYXZfZmlmb19zaXplKGYpOworICAgICAgICBBVkZpZm9CdWZmZXIgKmYyID0gYXZfZmlmb19hbGxvYyhuZXdfc2l6ZSk7CisKKyAgICAgICAgaWYgKCFmMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKGYsIGYyLT5idWZmZXIsIGxlbiwgTlVMTCk7CisgICAgICAgIGYyLT53cHRyICs9IGxlbjsKKyAgICAgICAgZjItPnduZHggKz0gbGVuOworICAgICAgICBhdl9mcmVlKGYtPmJ1ZmZlcik7CisgICAgICAgICpmID0gKmYyOworICAgICAgICBhdl9mcmVlKGYyKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9maWZvX2dyb3coQVZGaWZvQnVmZmVyICpmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgb2xkX3NpemUgPSBmLT5lbmQgLSBmLT5idWZmZXI7CisgICAgaWYoc2l6ZSArICh1bnNpZ25lZClhdl9maWZvX3NpemUoZikgPCBzaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgc2l6ZSArPSBhdl9maWZvX3NpemUoZik7CisKKyAgICBpZiAob2xkX3NpemUgPCBzaXplKQorICAgICAgICByZXR1cm4gYXZfZmlmb19yZWFsbG9jMihmLCBGRk1BWChzaXplLCAyKnNpemUpKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogc3JjIG11c3QgTk9UIGJlIGNvbnN0IGFzIGl0IGNhbiBiZSBhIGNvbnRleHQgZm9yIGZ1bmMgdGhhdCBtYXkgbmVlZAorICogdXBkYXRpbmcgKGxpa2UgYSBwb2ludGVyIG9yIGJ5dGUgY291bnRlcikgKi8KK2ludCBhdl9maWZvX2dlbmVyaWNfd3JpdGUoQVZGaWZvQnVmZmVyICpmLCB2b2lkICpzcmMsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpmdW5jKSh2b2lkICosIHZvaWQgKiwgaW50KSkKK3sKKyAgICBpbnQgdG90YWwgPSBzaXplOworICAgIHVpbnQzMl90IHduZHg9IGYtPnduZHg7CisgICAgdWludDhfdCAqd3B0cj0gZi0+d3B0cjsKKworICAgIGRvIHsKKyAgICAgICAgaW50IGxlbiA9IEZGTUlOKGYtPmVuZCAtIHdwdHIsIHNpemUpOworICAgICAgICBpZiAoZnVuYykgeworICAgICAgICAgICAgaWYgKGZ1bmMoc3JjLCB3cHRyLCBsZW4pIDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkod3B0ciwgc3JjLCBsZW4pOworICAgICAgICAgICAgc3JjID0gKHVpbnQ4X3QgKilzcmMgKyBsZW47CisgICAgICAgIH0KKy8vIFdyaXRlIG1lbW9yeSBiYXJyaWVyIG5lZWRlZCBmb3IgU01QIGhlcmUgaW4gdGhlb3J5CisgICAgICAgIHdwdHIgKz0gbGVuOworICAgICAgICBpZiAod3B0ciA+PSBmLT5lbmQpCisgICAgICAgICAgICB3cHRyID0gZi0+YnVmZmVyOworICAgICAgICB3bmR4ICAgICs9IGxlbjsKKyAgICAgICAgc2l6ZSAgICAtPSBsZW47CisgICAgfSB3aGlsZSAoc2l6ZSA+IDApOworICAgIGYtPnduZHg9IHduZHg7CisgICAgZi0+d3B0cj0gd3B0cjsKKyAgICByZXR1cm4gdG90YWwgLSBzaXplOworfQorCitpbnQgYXZfZmlmb19nZW5lcmljX3JlYWQoQVZGaWZvQnVmZmVyICpmLCB2b2lkICpkZXN0LCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZ1bmMpKHZvaWQgKiwgdm9pZCAqLCBpbnQpKQoreworLy8gUmVhZCBtZW1vcnkgYmFycmllciBuZWVkZWQgZm9yIFNNUCBoZXJlIGluIHRoZW9yeQorICAgIGRvIHsKKyAgICAgICAgaW50IGxlbiA9IEZGTUlOKGYtPmVuZCAtIGYtPnJwdHIsIGJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKGZ1bmMpCisgICAgICAgICAgICBmdW5jKGRlc3QsIGYtPnJwdHIsIGxlbik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KGRlc3QsIGYtPnJwdHIsIGxlbik7CisgICAgICAgICAgICBkZXN0ID0gKHVpbnQ4X3QgKilkZXN0ICsgbGVuOworICAgICAgICB9CisvLyBtZW1vcnkgYmFycmllciBuZWVkZWQgZm9yIFNNUCBoZXJlIGluIHRoZW9yeQorICAgICAgICBhdl9maWZvX2RyYWluKGYsIGxlbik7CisgICAgICAgIGJ1Zl9zaXplIC09IGxlbjsKKyAgICB9IHdoaWxlIChidWZfc2l6ZSA+IDApOworICAgIHJldHVybiAwOworfQorCisvKiogRGlzY2FyZCBkYXRhIGZyb20gdGhlIEZJRk8uICovCit2b2lkIGF2X2ZpZm9fZHJhaW4oQVZGaWZvQnVmZmVyICpmLCBpbnQgc2l6ZSkKK3sKKyAgICBhdl9hc3NlcnQyKGF2X2ZpZm9fc2l6ZShmKSA+PSBzaXplKTsKKyAgICBmLT5ycHRyICs9IHNpemU7CisgICAgaWYgKGYtPnJwdHIgPj0gZi0+ZW5kKQorICAgICAgICBmLT5ycHRyIC09IGYtPmVuZCAtIGYtPmJ1ZmZlcjsKKyAgICBmLT5ybmR4ICs9IHNpemU7Cit9CisKKyNpZmRlZiBURVNUCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgLyogY3JlYXRlIGEgRklGTyBidWZmZXIgKi8KKyAgICBBVkZpZm9CdWZmZXIgKmZpZm8gPSBhdl9maWZvX2FsbG9jKDEzICogc2l6ZW9mKGludCkpOworICAgIGludCBpLCBqLCBuOworCisgICAgLyogZmlsbCBkYXRhICovCisgICAgZm9yIChpID0gMDsgYXZfZmlmb19zcGFjZShmaWZvKSA+PSBzaXplb2YoaW50KTsgaSsrKQorICAgICAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoZmlmbywgJmksIHNpemVvZihpbnQpLCBOVUxMKTsKKworICAgIC8qIHBlZWsgYXQgRklGTyAqLworICAgIG4gPSBhdl9maWZvX3NpemUoZmlmbykgLyBzaXplb2YoaW50KTsKKyAgICBmb3IgKGkgPSAtbiArIDE7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaW50ICp2ID0gKGludCAqKWF2X2ZpZm9fcGVlazIoZmlmbywgaSAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgcHJpbnRmKCIlZDogJWRcbiIsIGksICp2KTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgLyogcmVhZCBkYXRhICovCisgICAgZm9yIChpID0gMDsgYXZfZmlmb19zaXplKGZpZm8pID49IHNpemVvZihpbnQpOyBpKyspIHsKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQoZmlmbywgJmosIHNpemVvZihpbnQpLCBOVUxMKTsKKyAgICAgICAgcHJpbnRmKCIlZCAiLCBqKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgYXZfZmlmb19mcmVlKGZpZm8pOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9maWZvLmggYi9mZm1wZWcvbGliYXZ1dGlsL2ZpZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2JkY2JjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9maWZvLmgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogYSB2ZXJ5IHNpbXBsZSBjaXJjdWxhciBidWZmZXIgRklGTyBpbXBsZW1lbnRhdGlvbgorICovCisKKyNpZm5kZWYgQVZVVElMX0ZJRk9fSAorI2RlZmluZSBBVlVUSUxfRklGT19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdnV0aWwuaCIKKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IEFWRmlmb0J1ZmZlciB7CisgICAgdWludDhfdCAqYnVmZmVyOworICAgIHVpbnQ4X3QgKnJwdHIsICp3cHRyLCAqZW5kOworICAgIHVpbnQzMl90IHJuZHgsIHduZHg7Cit9IEFWRmlmb0J1ZmZlcjsKKworLyoqCisgKiBJbml0aWFsaXplIGFuIEFWRmlmb0J1ZmZlci4KKyAqIEBwYXJhbSBzaXplIG9mIEZJRk8KKyAqIEByZXR1cm4gQVZGaWZvQnVmZmVyIG9yIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCisgKi8KK0FWRmlmb0J1ZmZlciAqYXZfZmlmb19hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKy8qKgorICogSW5pdGlhbGl6ZSBhbiBBVkZpZm9CdWZmZXIuCisgKiBAcGFyYW0gbm1lbWIgbnVtYmVyIG9mIGVsZW1lbnRzCisgKiBAcGFyYW0gc2l6ZSAgc2l6ZSBvZiB0aGUgc2luZ2xlIGVsZW1lbnQKKyAqIEByZXR1cm4gQVZGaWZvQnVmZmVyIG9yIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCisgKi8KK0FWRmlmb0J1ZmZlciAqYXZfZmlmb19hbGxvY19hcnJheShzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBGcmVlIGFuIEFWRmlmb0J1ZmZlci4KKyAqIEBwYXJhbSBmIEFWRmlmb0J1ZmZlciB0byBmcmVlCisgKi8KK3ZvaWQgYXZfZmlmb19mcmVlKEFWRmlmb0J1ZmZlciAqZik7CisKKy8qKgorICogRnJlZSBhbiBBVkZpZm9CdWZmZXIgYW5kIHJlc2V0IHBvaW50ZXIgdG8gTlVMTC4KKyAqIEBwYXJhbSBmIEFWRmlmb0J1ZmZlciB0byBmcmVlCisgKi8KK3ZvaWQgYXZfZmlmb19mcmVlcChBVkZpZm9CdWZmZXIgKipmKTsKKworLyoqCisgKiBSZXNldCB0aGUgQVZGaWZvQnVmZmVyIHRvIHRoZSBzdGF0ZSByaWdodCBhZnRlciBhdl9maWZvX2FsbG9jLCBpbiBwYXJ0aWN1bGFyIGl0IGlzIGVtcHRpZWQuCisgKiBAcGFyYW0gZiBBVkZpZm9CdWZmZXIgdG8gcmVzZXQKKyAqLwordm9pZCBhdl9maWZvX3Jlc2V0KEFWRmlmb0J1ZmZlciAqZik7CisKKy8qKgorICogUmV0dXJuIHRoZSBhbW91bnQgb2YgZGF0YSBpbiBieXRlcyBpbiB0aGUgQVZGaWZvQnVmZmVyLCB0aGF0IGlzIHRoZQorICogYW1vdW50IG9mIGRhdGEgeW91IGNhbiByZWFkIGZyb20gaXQuCisgKiBAcGFyYW0gZiBBVkZpZm9CdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBAcmV0dXJuIHNpemUKKyAqLworaW50IGF2X2ZpZm9fc2l6ZShjb25zdCBBVkZpZm9CdWZmZXIgKmYpOworCisvKioKKyAqIFJldHVybiB0aGUgYW1vdW50IG9mIHNwYWNlIGluIGJ5dGVzIGluIHRoZSBBVkZpZm9CdWZmZXIsIHRoYXQgaXMgdGhlCisgKiBhbW91bnQgb2YgZGF0YSB5b3UgY2FuIHdyaXRlIGludG8gaXQuCisgKiBAcGFyYW0gZiBBVkZpZm9CdWZmZXIgdG8gd3JpdGUgaW50bworICogQHJldHVybiBzaXplCisgKi8KK2ludCBhdl9maWZvX3NwYWNlKGNvbnN0IEFWRmlmb0J1ZmZlciAqZik7CisKKy8qKgorICogRmVlZCBkYXRhIGZyb20gYW4gQVZGaWZvQnVmZmVyIHRvIGEgdXNlci1zdXBwbGllZCBjYWxsYmFjay4KKyAqIEBwYXJhbSBmIEFWRmlmb0J1ZmZlciB0byByZWFkIGZyb20KKyAqIEBwYXJhbSBidWZfc2l6ZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQHBhcmFtIGZ1bmMgZ2VuZXJpYyByZWFkIGZ1bmN0aW9uCisgKiBAcGFyYW0gZGVzdCBkYXRhIGRlc3RpbmF0aW9uCisgKi8KK2ludCBhdl9maWZvX2dlbmVyaWNfcmVhZChBVkZpZm9CdWZmZXIgKmYsIHZvaWQgKmRlc3QsIGludCBidWZfc2l6ZSwgdm9pZCAoKmZ1bmMpKHZvaWQqLCB2b2lkKiwgaW50KSk7CisKKy8qKgorICogRmVlZCBkYXRhIGZyb20gYSB1c2VyLXN1cHBsaWVkIGNhbGxiYWNrIHRvIGFuIEFWRmlmb0J1ZmZlci4KKyAqIEBwYXJhbSBmIEFWRmlmb0J1ZmZlciB0byB3cml0ZSB0bworICogQHBhcmFtIHNyYyBkYXRhIHNvdXJjZTsgbm9uLWNvbnN0IHNpbmNlIGl0IG1heSBiZSB1c2VkIGFzIGEKKyAqIG1vZGlmaWFibGUgY29udGV4dCBieSB0aGUgZnVuY3Rpb24gZGVmaW5lZCBpbiBmdW5jCisgKiBAcGFyYW0gc2l6ZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqIEBwYXJhbSBmdW5jIGdlbmVyaWMgd3JpdGUgZnVuY3Rpb247IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgc3JjLAorICogdGhlIHNlY29uZCBpcyBkZXN0X2J1ZiwgdGhlIHRoaXJkIGlzIGRlc3RfYnVmX3NpemUuCisgKiBmdW5jIG11c3QgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBkZXN0X2J1Ziwgb3IgPD0gMCB0bworICogaW5kaWNhdGUgbm8gbW9yZSBkYXRhIGF2YWlsYWJsZSB0byB3cml0ZS4KKyAqIElmIGZ1bmMgaXMgTlVMTCwgc3JjIGlzIGludGVycHJldGVkIGFzIGEgc2ltcGxlIGJ5dGUgYXJyYXkgZm9yIHNvdXJjZSBkYXRhLgorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIEZJRk8KKyAqLworaW50IGF2X2ZpZm9fZ2VuZXJpY193cml0ZShBVkZpZm9CdWZmZXIgKmYsIHZvaWQgKnNyYywgaW50IHNpemUsIGludCAoKmZ1bmMpKHZvaWQqLCB2b2lkKiwgaW50KSk7CisKKy8qKgorICogUmVzaXplIGFuIEFWRmlmb0J1ZmZlci4KKyAqIEluIGNhc2Ugb2YgcmVhbGxvY2F0aW9uIGZhaWx1cmUsIHRoZSBvbGQgRklGTyBpcyBrZXB0IHVuY2hhbmdlZC4KKyAqCisgKiBAcGFyYW0gZiBBVkZpZm9CdWZmZXIgdG8gcmVzaXplCisgKiBAcGFyYW0gc2l6ZSBuZXcgQVZGaWZvQnVmZmVyIHNpemUgaW4gYnl0ZXMKKyAqIEByZXR1cm4gPDAgZm9yIGZhaWx1cmUsID49MCBvdGhlcndpc2UKKyAqLworaW50IGF2X2ZpZm9fcmVhbGxvYzIoQVZGaWZvQnVmZmVyICpmLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKy8qKgorICogRW5sYXJnZSBhbiBBVkZpZm9CdWZmZXIuCisgKiBJbiBjYXNlIG9mIHJlYWxsb2NhdGlvbiBmYWlsdXJlLCB0aGUgb2xkIEZJRk8gaXMga2VwdCB1bmNoYW5nZWQuCisgKiBUaGUgbmV3IGZpZm8gc2l6ZSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIHJlcXVlc3RlZCBzaXplLgorICoKKyAqIEBwYXJhbSBmIEFWRmlmb0J1ZmZlciB0byByZXNpemUKKyAqIEBwYXJhbSBhZGRpdGlvbmFsX3NwYWNlIHRoZSBhbW91bnQgb2Ygc3BhY2UgaW4gYnl0ZXMgdG8gYWxsb2NhdGUgaW4gYWRkaXRpb24gdG8gYXZfZmlmb19zaXplKCkKKyAqIEByZXR1cm4gPDAgZm9yIGZhaWx1cmUsID49MCBvdGhlcndpc2UKKyAqLworaW50IGF2X2ZpZm9fZ3JvdyhBVkZpZm9CdWZmZXIgKmYsIHVuc2lnbmVkIGludCBhZGRpdGlvbmFsX3NwYWNlKTsKKworLyoqCisgKiBSZWFkIGFuZCBkaXNjYXJkIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGRhdGEgZnJvbSBhbiBBVkZpZm9CdWZmZXIuCisgKiBAcGFyYW0gZiBBVkZpZm9CdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gc2l6ZSBhbW91bnQgb2YgZGF0YSB0byByZWFkIGluIGJ5dGVzCisgKi8KK3ZvaWQgYXZfZmlmb19kcmFpbihBVkZpZm9CdWZmZXIgKmYsIGludCBzaXplKTsKKworLyoqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBkYXRhIHN0b3JlZCBpbiBhIEZJRk8gYnVmZmVyIGF0IGEgY2VydGFpbiBvZmZzZXQuCisgKiBUaGUgRklGTyBidWZmZXIgaXMgbm90IG1vZGlmaWVkLgorICoKKyAqIEBwYXJhbSBmICAgIEFWRmlmb0J1ZmZlciB0byBwZWVrIGF0LCBmIG11c3QgYmUgbm9uLU5VTEwKKyAqIEBwYXJhbSBvZmZzIGFuIG9mZnNldCBpbiBieXRlcywgaXRzIGFic29sdXRlIHZhbHVlIG11c3QgYmUgbGVzcworICogICAgICAgICAgICAgdGhhbiB0aGUgdXNlZCBidWZmZXIgc2l6ZSBvciB0aGUgcmV0dXJuZWQgcG9pbnRlciB3aWxsCisgKiAgICAgICAgICAgICBwb2ludCBvdXRzaWRlIHRvIHRoZSBidWZmZXIgZGF0YS4KKyAqICAgICAgICAgICAgIFRoZSB1c2VkIGJ1ZmZlciBzaXplIGNhbiBiZSBjaGVja2VkIHdpdGggYXZfZmlmb19zaXplKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqYXZfZmlmb19wZWVrMihjb25zdCBBVkZpZm9CdWZmZXIgKmYsIGludCBvZmZzKQoreworICAgIHVpbnQ4X3QgKnB0ciA9IGYtPnJwdHIgKyBvZmZzOworICAgIGlmIChwdHIgPj0gZi0+ZW5kKQorICAgICAgICBwdHIgPSBmLT5idWZmZXIgKyAocHRyIC0gZi0+ZW5kKTsKKyAgICBlbHNlIGlmIChwdHIgPCBmLT5idWZmZXIpCisgICAgICAgIHB0ciA9IGYtPmVuZCAtIChmLT5idWZmZXIgLSBwdHIpOworICAgIHJldHVybiBwdHI7Cit9CisKKyNlbmRpZiAvKiBBVlVUSUxfRklGT19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2ZpbGUuYyBiL2ZmbXBlZy9saWJhdnV0aWwvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OWQyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2ZpbGUuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfSU9fSAorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKyNpZiBIQVZFX01NQVAKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2VsaWYgSEFWRV9NQVBWSUVXT0ZGSUxFCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgICBsb2dfb2Zmc2V0OworICAgIHZvaWQgKmxvZ19jdHg7Cit9IEZpbGVMb2dDb250ZXh0OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmaWxlX2xvZ19jdHhfY2xhc3MgPSB7CisgICAgIkZJTEUiLCBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwgTlVMTCwgTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIG9mZnNldG9mKEZpbGVMb2dDb250ZXh0LCBsb2dfb2Zmc2V0KSwgb2Zmc2V0b2YoRmlsZUxvZ0NvbnRleHQsIGxvZ19jdHgpCit9OworCitpbnQgYXZfZmlsZV9tYXAoY29uc3QgY2hhciAqZmlsZW5hbWUsIHVpbnQ4X3QgKipidWZwdHIsIHNpemVfdCAqc2l6ZSwKKyAgICAgICAgICAgICAgICBpbnQgbG9nX29mZnNldCwgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBGaWxlTG9nQ29udGV4dCBmaWxlX2xvZ19jdHggPSB7ICZmaWxlX2xvZ19jdHhfY2xhc3MsIGxvZ19vZmZzZXQsIGxvZ19jdHggfTsKKyAgICBpbnQgZXJyLCBmZCA9IGF2cHJpdl9vcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgYXZfdW51c2VkIHZvaWQgKnB0cjsKKyAgICBvZmZfdCBvZmZfc2l6ZTsKKyAgICBjaGFyIGVycmJ1ZlsxMjhdOworICAgICpidWZwdHIgPSBOVUxMOworCisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBlcnIgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfc3RyZXJyb3IoZXJyLCBlcnJidWYsIHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgYXZfbG9nKCZmaWxlX2xvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCByZWFkIGZpbGUgJyVzJzogJXNcbiIsIGZpbGVuYW1lLCBlcnJidWYpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChmc3RhdChmZCwgJnN0KSA8IDApIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X3N0cmVycm9yKGVyciwgZXJyYnVmLCBzaXplb2YoZXJyYnVmKSk7CisgICAgICAgIGF2X2xvZygmZmlsZV9sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBvY2N1cnJlZCBpbiBmc3RhdCgpOiAlc1xuIiwgZXJyYnVmKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG9mZl9zaXplID0gc3Quc3Rfc2l6ZTsKKyAgICBpZiAob2ZmX3NpemUgPiBTSVpFX01BWCkgeworICAgICAgICBhdl9sb2coJmZpbGVfbG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkZpbGUgc2l6ZSBmb3IgZmlsZSAnJXMnIGlzIHRvbyBiaWdcbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICAqc2l6ZSA9IG9mZl9zaXplOworCisjaWYgSEFWRV9NTUFQCisgICAgcHRyID0gbW1hcChOVUxMLCAqc2l6ZSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisgICAgaWYgKHB0ciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoZXJybm8pOworICAgICAgICBhdl9zdHJlcnJvcihlcnIsIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpOworICAgICAgICBhdl9sb2coJmZpbGVfbG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igb2NjdXJyZWQgaW4gbW1hcCgpOiAlc1xuIiwgZXJyYnVmKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAqYnVmcHRyID0gcHRyOworI2VsaWYgSEFWRV9NQVBWSUVXT0ZGSUxFCisgICAgeworICAgICAgICBIQU5ETEUgbWgsIGZoID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmZCk7CisKKyAgICAgICAgbWggPSBDcmVhdGVGaWxlTWFwcGluZyhmaCwgTlVMTCwgUEFHRV9SRUFET05MWSwgMCwgMCwgTlVMTCk7CisgICAgICAgIGlmICghbWgpIHsKKyAgICAgICAgICAgIGF2X2xvZygmZmlsZV9sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBvY2N1cnJlZCBpbiBDcmVhdGVGaWxlTWFwcGluZygpXG4iKTsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHB0ciA9IE1hcFZpZXdPZkZpbGUobWgsIEZJTEVfTUFQX1JFQUQsIDAsIDAsICpzaXplKTsKKyAgICAgICAgQ2xvc2VIYW5kbGUobWgpOworICAgICAgICBpZiAoIXB0cikgeworICAgICAgICAgICAgYXZfbG9nKCZmaWxlX2xvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIG9jY3VycmVkIGluIE1hcFZpZXdPZkZpbGUoKVxuIik7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAqYnVmcHRyID0gcHRyOworICAgIH0KKyNlbHNlCisgICAgKmJ1ZnB0ciA9IGF2X21hbGxvYygqc2l6ZSk7CisgICAgaWYgKCEqYnVmcHRyKSB7CisgICAgICAgIGF2X2xvZygmZmlsZV9sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvciBvY2N1cnJlZFxuIik7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgcmVhZChmZCwgKmJ1ZnB0ciwgKnNpemUpOworI2VuZGlmCisKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXZfZmlsZV91bm1hcCh1aW50OF90ICpidWZwdHIsIHNpemVfdCBzaXplKQoreworI2lmIEhBVkVfTU1BUAorICAgIG11bm1hcChidWZwdHIsIHNpemUpOworI2VsaWYgSEFWRV9NQVBWSUVXT0ZGSUxFCisgICAgVW5tYXBWaWV3T2ZGaWxlKGJ1ZnB0cik7CisjZWxzZQorICAgIGF2X2ZyZWUoYnVmcHRyKTsKKyNlbmRpZgorfQorCitpbnQgYXZfdGVtcGZpbGUoY29uc3QgY2hhciAqcHJlZml4LCBjaGFyICoqZmlsZW5hbWUsIGludCBsb2dfb2Zmc2V0LCB2b2lkICpsb2dfY3R4KQoreworICAgIEZpbGVMb2dDb250ZXh0IGZpbGVfbG9nX2N0eCA9IHsgJmZpbGVfbG9nX2N0eF9jbGFzcywgbG9nX29mZnNldCwgbG9nX2N0eCB9OworICAgIGludCBmZCA9IC0xOworI2lmICFIQVZFX01LU1RFTVAKKyAgICB2b2lkICpwdHI9IHRlbXBuYW0oTlVMTCwgcHJlZml4KTsKKyAgICBpZighcHRyKQorICAgICAgICBwdHI9IHRlbXBuYW0oIi4iLCBwcmVmaXgpOworICAgICpmaWxlbmFtZSA9IGF2X3N0cmR1cChwdHIpOworI3VuZGVmIGZyZWUKKyAgICBmcmVlKHB0cik7CisjZWxzZQorICAgIHNpemVfdCBsZW4gPSBzdHJsZW4ocHJlZml4KSArIDEyOyAvKiByb29tIGZvciAiL3RtcC8iIGFuZCAiWFhYWFhYXDAiICovCisgICAgKmZpbGVuYW1lICA9IGF2X21hbGxvYyhsZW4pOworI2VuZGlmCisgICAgLyogLS0tLS1jb21tb24gc2VjdGlvbi0tLS0tKi8KKyAgICBpZiAoISpmaWxlbmFtZSkgeworICAgICAgICBhdl9sb2coJmZpbGVfbG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiZmZfdGVtcGZpbGU6IENhbm5vdCBhbGxvY2F0ZSBmaWxlIG5hbWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyNpZiAhSEFWRV9NS1NURU1QCisjICAgaWZuZGVmIE9fQklOQVJZCisjICAgICAgIGRlZmluZSBPX0JJTkFSWSAwCisjICAgZW5kaWYKKyMgICBpZm5kZWYgT19FWENMCisjICAgICAgIGRlZmluZSBPX0VYQ0wgMAorIyAgIGVuZGlmCisgICAgZmQgPSBvcGVuKCpmaWxlbmFtZSwgT19SRFdSIHwgT19CSU5BUlkgfCBPX0NSRUFUIHwgT19FWENMLCAwNjAwKTsKKyNlbHNlCisgICAgc25wcmludGYoKmZpbGVuYW1lLCBsZW4sICIvdG1wLyVzWFhYWFhYIiwgcHJlZml4KTsKKyAgICBmZCA9IG1rc3RlbXAoKmZpbGVuYW1lKTsKKyNpZmRlZiBfV0lOMzIKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHNucHJpbnRmKCpmaWxlbmFtZSwgbGVuLCAiLi8lc1hYWFhYWCIsIHByZWZpeCk7CisgICAgICAgIGZkID0gbWtzdGVtcCgqZmlsZW5hbWUpOworICAgIH0KKyNlbmRpZgorI2VuZGlmCisgICAgLyogLS0tLS1jb21tb24gc2VjdGlvbi0tLS0tKi8KKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIGludCBlcnIgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKCZmaWxlX2xvZ19jdHgsIEFWX0xPR19FUlJPUiwgImZmX3RlbXBmaWxlOiBDYW5ub3Qgb3BlbiB0ZW1wb3JhcnkgZmlsZSAlc1xuIiwgKmZpbGVuYW1lKTsKKyAgICAgICAgYXZfZnJlZXAoZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICByZXR1cm4gZmQ7IC8qIHN1Y2Nlc3MgKi8KK30KKworI2lmZGVmIFRFU1QKKworI3VuZGVmIHByaW50ZgorCitpbnQgbWFpbih2b2lkKQoreworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpZiAoYXZfZmlsZV9tYXAoImZpbGUuYyIsICZidWYsICZzaXplLCAwLCBOVUxMKSA8IDApCisgICAgICAgIHJldHVybiAxOworCisgICAgYnVmWzBdID0gJ3MnOworICAgIHByaW50ZigiJXMiLCBidWYpOworICAgIGF2X2ZpbGVfdW5tYXAoYnVmLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2ZpbGUuaCBiL2ZmbXBlZy9saWJhdnV0aWwvZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYWUyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2ZpbGUuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0ZJTEVfSAorI2RlZmluZSBBVlVUSUxfRklMRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2dXRpbC5oIgorCisvKioKKyAqIEBmaWxlCisgKiBNaXNjIGZpbGUgdXRpbGl0aWVzLgorICovCisKKy8qKgorICogUmVhZCB0aGUgZmlsZSB3aXRoIG5hbWUgZmlsZW5hbWUsIGFuZCBwdXQgaXRzIGNvbnRlbnQgaW4gYSBuZXdseQorICogYWxsb2NhdGVkIGJ1ZmZlciBvciBtYXAgaXQgd2l0aCBtbWFwKCkgd2hlbiBhdmFpbGFibGUuCisgKiBJbiBjYXNlIG9mIHN1Y2Nlc3Mgc2V0ICpidWZwdHIgdG8gdGhlIHJlYWQgb3IgbW1hcHBlZCBidWZmZXIsIGFuZAorICogKnNpemUgdG8gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciBpbiAqYnVmcHRyLgorICogVGhlIHJldHVybmVkIGJ1ZmZlciBtdXN0IGJlIHJlbGVhc2VkIHdpdGggYXZfZmlsZV91bm1hcCgpLgorICoKKyAqIEBwYXJhbSBsb2dfb2Zmc2V0IGxvZ2xldmVsIG9mZnNldCB1c2VkIGZvciBsb2dnaW5nCisgKiBAcGFyYW0gbG9nX2N0eCBjb250ZXh0IHVzZWQgZm9yIGxvZ2dpbmcKKyAqIEByZXR1cm4gYSBub24gbmVnYXRpdmUgbnVtYmVyIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSB2YWx1ZQorICogY29ycmVzcG9uZGluZyB0byBhbiBBVkVSUk9SIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCBhdl9maWxlX21hcChjb25zdCBjaGFyICpmaWxlbmFtZSwgdWludDhfdCAqKmJ1ZnB0ciwgc2l6ZV90ICpzaXplLAorICAgICAgICAgICAgICAgIGludCBsb2dfb2Zmc2V0LCB2b2lkICpsb2dfY3R4KTsKKworLyoqCisgKiBVbm1hcCBvciBmcmVlIHRoZSBidWZmZXIgYnVmcHRyIGNyZWF0ZWQgYnkgYXZfZmlsZV9tYXAoKS4KKyAqCisgKiBAcGFyYW0gc2l6ZSBzaXplIGluIGJ5dGVzIG9mIGJ1ZnB0ciwgbXVzdCBiZSB0aGUgc2FtZSBhcyByZXR1cm5lZAorICogYnkgYXZfZmlsZV9tYXAoKQorICovCit2b2lkIGF2X2ZpbGVfdW5tYXAodWludDhfdCAqYnVmcHRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKgorICogV3JhcHBlciB0byB3b3JrIGFyb3VuZCB0aGUgbGFjayBvZiBta3N0ZW1wKCkgb24gbWluZ3cuCisgKiBBbHNvLCB0cmllcyB0byBjcmVhdGUgZmlsZSBpbiAvdG1wIGZpcnN0LCBpZiBwb3NzaWJsZS4KKyAqICpwcmVmaXggY2FuIGJlIGEgY2hhcmFjdGVyIGNvbnN0YW50OyAqZmlsZW5hbWUgd2lsbCBiZSBhbGxvY2F0ZWQgaW50ZXJuYWxseS4KKyAqIEByZXR1cm4gZmlsZSBkZXNjcmlwdG9yIG9mIG9wZW5lZCBmaWxlIChvciBuZWdhdGl2ZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuCisgKiBBVkVSUk9SIGNvZGUgb24gZXJyb3IpCisgKiBhbmQgb3BlbmVkIGZpbGUgbmFtZSBpbiAqKmZpbGVuYW1lLgorICogQG5vdGUgT24gdmVyeSBvbGQgbGliY3MgaXQgaXMgbmVjZXNzYXJ5IHRvIHNldCBhIHNlY3VyZSB1bWFzayBiZWZvcmUKKyAqICAgICAgIGNhbGxpbmcgdGhpcywgYXZfdGVtcGZpbGUoKSBjYW4ndCBjYWxsIHVtYXNrIGl0c2VsZiBhcyBpdCBpcyB1c2VkIGluCisgKiAgICAgICBsaWJyYXJpZXMgYW5kIGNvdWxkIGludGVyZmVyZSB3aXRoIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLgorICovCitpbnQgYXZfdGVtcGZpbGUoY29uc3QgY2hhciAqcHJlZml4LCBjaGFyICoqZmlsZW5hbWUsIGludCBsb2dfb2Zmc2V0LCB2b2lkICpsb2dfY3R4KTsKKworI2VuZGlmIC8qIEFWVVRJTF9GSUxFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvZmlsZV9vcGVuLmMgYi9mZm1wZWcvbGliYXZ1dGlsL2ZpbGVfb3Blbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWE2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2ZpbGVfb3Blbi5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZiBIQVZFX0lPX0gKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19NSU5HVzMyQ0VfXykKKyN1bmRlZiBvcGVuCisjdW5kZWYgbHNlZWsKKyN1bmRlZiBzdGF0CisjdW5kZWYgZnN0YXQKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8c2hhcmUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgIndjaGFyX2ZpbGVuYW1lLmgiCisKK3N0YXRpYyBpbnQgd2luMzJfb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZV91dGY4LCBpbnQgb2ZsYWcsIGludCBwbW9kZSkKK3sKKyAgICBpbnQgZmQ7CisgICAgd2NoYXJfdCAqZmlsZW5hbWVfdzsKKworICAgIC8qIGNvbnZlcnQgVVRGLTggdG8gd2lkZSBjaGFycyAqLworICAgIGlmICh1dGY4dG93Y2hhcihmaWxlbmFtZV91dGY4LCAmZmlsZW5hbWVfdykpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIWZpbGVuYW1lX3cpCisgICAgICAgIGdvdG8gZmFsbGJhY2s7CisKKyAgICBmZCA9IF93c29wZW4oZmlsZW5hbWVfdywgb2ZsYWcsIFNIX0RFTllOTywgcG1vZGUpOworICAgIGF2X2ZyZWVwKCZmaWxlbmFtZV93KTsKKworICAgIGlmIChmZCAhPSAtMSB8fCAob2ZsYWcgJiBPX0NSRUFUKSkKKyAgICAgICAgcmV0dXJuIGZkOworCitmYWxsYmFjazoKKyAgICAvKiBmaWxlbmFtZSBtYXkgYmUgaW4gQ1BfQUNQICovCisgICAgcmV0dXJuIF9zb3BlbihmaWxlbmFtZV91dGY4LCBvZmxhZywgU0hfREVOWU5PLCBwbW9kZSk7Cit9CisjZGVmaW5lIG9wZW4gd2luMzJfb3BlbgorI2VuZGlmCisKK2ludCBhdnByaXZfb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLCAuLi4pCit7CisgICAgaW50IGZkOworICAgIHVuc2lnbmVkIGludCBtb2RlID0gMDsKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIGZsYWdzKTsKKyAgICBpZiAoZmxhZ3MgJiBPX0NSRUFUKQorICAgICAgICBtb2RlID0gdmFfYXJnKGFwLCB1bnNpZ25lZCBpbnQpOworICAgIHZhX2VuZChhcCk7CisKKyNpZmRlZiBPX0NMT0VYRUMKKyAgICBmbGFncyB8PSBPX0NMT0VYRUM7CisjZW5kaWYKKworICAgIGZkID0gb3BlbihmaWxlbmFtZSwgZmxhZ3MsIG1vZGUpOworI2lmIEhBVkVfRkNOVEwKKyAgICBpZiAoZmQgIT0gLTEpIHsKKyAgICAgICAgaWYgKGZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKSA9PSAtMSkKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJGYWlsZWQgdG8gc2V0IGNsb3NlIG9uIGV4ZWNcbiIpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIGZkOworfQorCitGSUxFICphdl9mb3Blbl91dGY4KGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpCit7CisgICAgaW50IGZkOworICAgIGludCBhY2Nlc3M7CisgICAgY29uc3QgY2hhciAqbSA9IG1vZGU7CisKKyAgICBzd2l0Y2ggKCptKyspIHsKKyAgICBjYXNlICdyJzogYWNjZXNzID0gT19SRE9OTFk7IGJyZWFrOworICAgIGNhc2UgJ3cnOiBhY2Nlc3MgPSBPX0NSRUFUfE9fV1JPTkxZfE9fVFJVTkM7IGJyZWFrOworICAgIGNhc2UgJ2EnOiBhY2Nlc3MgPSBPX0NSRUFUfE9fV1JPTkxZfE9fQVBQRU5EOyBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3aGlsZSAoKm0pIHsKKyAgICAgICAgaWYgKCptID09ICcrJykgeworICAgICAgICAgICAgYWNjZXNzICY9IH4oT19SRE9OTFkgfCBPX1dST05MWSk7CisgICAgICAgICAgICBhY2Nlc3MgfD0gT19SRFdSOworICAgICAgICB9IGVsc2UgaWYgKCptID09ICdiJykgeworI2lmZGVmIE9fQklOQVJZCisgICAgICAgICAgICBhY2Nlc3MgfD0gT19CSU5BUlk7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIGlmICgqbSkgeworICAgICAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBtKys7CisgICAgfQorICAgIGZkID0gYXZwcml2X29wZW4ocGF0aCwgYWNjZXNzLCAwNjY2KTsKKyAgICBpZiAoZmQgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBmZG9wZW4oZmQsIG1vZGUpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9maXhlZF9kc3AuYyBiL2ZmbXBlZy9saWJhdnV0aWwvZml4ZWRfZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5ZmVhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvZml4ZWRfZHNwLmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogIE5lZGVsamtvIEJhYmljIChuYmFiaWNAbWlwcy5jb20pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJmaXhlZF9kc3AuaCIKKworc3RhdGljIHZvaWQgdmVjdG9yX2ZtdWxfd2luZG93X2ZpeGVkX3NjYWxlZF9jKGludDE2X3QgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKnNyYzEsIGNvbnN0IGludDMyX3QgKndpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIHVpbnQ4X3QgYml0cykKK3sKKyAgICBpbnQzMl90IHMwLCBzMSwgd2ksIHdqLCBpLGosIHJvdW5kOworCisgICAgZHN0ICs9IGxlbjsKKyAgICB3aW4gKz0gbGVuOworICAgIHNyYzArPSBsZW47CisgICAgcm91bmQgPSBiaXRzPyAxIDw8IChiaXRzLTEpIDogMDsKKworICAgIGZvciAoaT0tbGVuLCBqPWxlbi0xOyBpPDA7IGkrKywgai0tKSB7CisgICAgICAgIHMwID0gc3JjMFtpXTsKKyAgICAgICAgczEgPSBzcmMxW2pdOworICAgICAgICB3aSA9IHdpbltpXTsKKyAgICAgICAgd2ogPSB3aW5bal07CisgICAgICAgIGRzdFtpXSA9IGF2X2NsaXBfaW50MTZfYygoKCgoaW50NjRfdClzMCp3aiAtIChpbnQ2NF90KXMxKndpICsgMHg0MDAwMDAwMCkgPj4gMzEpICsgcm91bmQpID4+IGJpdHMpOworICAgICAgICBkc3Rbal0gPSBhdl9jbGlwX2ludDE2X2MoKCgoKGludDY0X3QpczAqd2kgKyAoaW50NjRfdClzMSp3aiArIDB4NDAwMDAwMDApID4+IDMxKSArIHJvdW5kKSA+PiBiaXRzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZlY3Rvcl9mbXVsX3dpbmRvd19maXhlZF9jKGludDMyX3QgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKnNyYzEsIGNvbnN0IGludDMyX3QgKndpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgaW50MzJfdCBzMCwgczEsIHdpLCB3aiwgaSwgajsKKworICAgIGRzdCArPSBsZW47CisgICAgd2luICs9IGxlbjsKKyAgICBzcmMwKz0gbGVuOworCisgICAgZm9yIChpPS1sZW4sIGo9bGVuLTE7IGk8MDsgaSsrLCBqLS0pIHsKKyAgICAgICAgczAgPSBzcmMwW2ldOworICAgICAgICBzMSA9IHNyYzFbal07CisgICAgICAgIHdpID0gd2luW2ldOworICAgICAgICB3aiA9IHdpbltqXTsKKyAgICAgICAgZHN0W2ldID0gKChpbnQ2NF90KXMwKndqIC0gKGludDY0X3QpczEqd2kgKyAweDQwMDAwMDAwKSA+PiAzMTsKKyAgICAgICAgZHN0W2pdID0gKChpbnQ2NF90KXMwKndpICsgKGludDY0X3QpczEqd2ogKyAweDQwMDAwMDAwKSA+PiAzMTsKKyAgICB9Cit9CisKK0FWRml4ZWREU1BDb250ZXh0ICogYXZwcml2X2FsbG9jX2ZpeGVkX2RzcChpbnQgYml0X2V4YWN0KQoreworICAgIEFWRml4ZWREU1BDb250ZXh0ICogZmRzcCA9IGF2X21hbGxvYyhzaXplb2YoQVZGaXhlZERTUENvbnRleHQpKTsKKyAgICBmZHNwLT52ZWN0b3JfZm11bF93aW5kb3dfc2NhbGVkID0gdmVjdG9yX2ZtdWxfd2luZG93X2ZpeGVkX3NjYWxlZF9jOworICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyA9IHZlY3Rvcl9mbXVsX3dpbmRvd19maXhlZF9jOworCisgICAgcmV0dXJuIGZkc3A7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2ZpeGVkX2RzcC5oIGIvZmZtcGVnL2xpYmF2dXRpbC9maXhlZF9kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjZmMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9maXhlZF9kc3AuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogIE5lZGVsamtvIEJhYmljIChuYmFiaWNAbWlwcy5jb20pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0ZJWEVEX0RTUF9ICisjZGVmaW5lIEFWVVRJTF9GSVhFRF9EU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWF0aG9wcy5oIgorCit0eXBlZGVmIHN0cnVjdCBBVkZpeGVkRFNQQ29udGV4dCB7CisgICAgLyoqCisgICAgICogT3ZlcmxhcC9hZGQgd2l0aCB3aW5kb3cgZnVuY3Rpb24uCisgICAgICogVXNlZCBwcmltYXJpbHkgYnkgTURDVC1iYXNlZCBhdWRpbyBjb2RlY3MuCisgICAgICogU291cmNlIGFuZCBkZXN0aW5hdGlvbiB2ZWN0b3JzIG11c3Qgb3ZlcmxhcCBleGFjdGx5IG9yIG5vdCBhdCBhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHN0ICByZXN1bHQgdmVjdG9yCisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IDE2LWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBzcmMwIGZpcnN0IHNvdXJjZSB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogMTYtYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIHNyYzEgc2Vjb25kIHNvdXJjZSB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogMTYtYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIHdpbiAgaGFsZi13aW5kb3cgdmVjdG9yCisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IDE2LWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBsZW4gIGxlbmd0aCBvZiB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogbXVsdGlwbGUgb2YgNAorICAgICAqIEBwYXJhbSBiaXRzIHNjYWxpbmcgcGFyYW1ldGVyCisgICAgICoKKyAgICAgKi8KKyAgICB2b2lkICgqdmVjdG9yX2ZtdWxfd2luZG93X3NjYWxlZCkoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMwLCBjb25zdCBpbnQzMl90ICpzcmMxLCBjb25zdCBpbnQzMl90ICp3aW4sIGludCBsZW4sIHVpbnQ4X3QgYml0cyk7CisKKyAgICAvKioKKyAgICAgKiBPdmVybGFwL2FkZCB3aXRoIHdpbmRvdyBmdW5jdGlvbi4KKyAgICAgKiBVc2VkIHByaW1hcmlseSBieSBNRENULWJhc2VkIGF1ZGlvIGNvZGVjcy4KKyAgICAgKiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHZlY3RvcnMgbXVzdCBvdmVybGFwIGV4YWN0bHkgb3Igbm90IGF0IGFsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkc3QgIHJlc3VsdCB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogMzItYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIHNyYzAgZmlyc3Qgc291cmNlIHZlY3RvcgorICAgICAqICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gc3JjMSBzZWNvbmQgc291cmNlIHZlY3RvcgorICAgICAqICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gd2luICBoYWxmLXdpbmRvdyB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogMTYtYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIGxlbiAgbGVuZ3RoIG9mIHZlY3RvcgorICAgICAqICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBtdWx0aXBsZSBvZiA0CisgICAgICovCisgICAgdm9pZCAoKnZlY3Rvcl9mbXVsX3dpbmRvdykoaW50MzJfdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMwLCBjb25zdCBpbnQzMl90ICpzcmMxLCBjb25zdCBpbnQzMl90ICp3aW4sIGludCBsZW4pOworCit9IEFWRml4ZWREU1BDb250ZXh0OworCisvKioKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgZml4ZWQgRFNQIGNvbnRleHQuCisgKiBub3RlOiBzaG91bGQgYmUgZnJlZWQgd2l0aCBhIGF2X2ZyZWUgY2FsbCB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCisgKgorICogQHBhcmFtIHN0cmljdCAgc2V0dGluZyB0byBub24temVybyBhdm9pZHMgdXNpbmcgZnVuY3Rpb25zIHdoaWNoIG1heSBub3QgYmUgSUVFRS03NTQgY29tcGxpYW50CisgKi8KK0FWRml4ZWREU1BDb250ZXh0ICogYXZwcml2X2FsbG9jX2ZpeGVkX2RzcChpbnQgc3RyaWN0KTsKKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIHNxdWFyZSByb290CisgKgorICogQHBhcmFtIHggICAgaW5wdXQgZml4ZWQgcG9pbnQgbnVtYmVyCisgKgorICogQHBhcmFtIGJpdHMgZm9ybWF0IG9mIGZpeGVkIHBvaW50IG51bWJlciAoMzIgLSBiaXRzKS5iaXRzCisgKgorICogbm90ZTogaW5wdXQgaXMgbm9ybWFsaXplZCB0byAoMCwgMSkgZml4ZWQgcG9pbnQgdmFsdWUKKyAqLworCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZml4ZWRfc3FydChpbnQgeCwgaW50IGJpdHMpCit7CisgICAgaW50IHJldHZhbCwgYml0X21hc2ssIGd1ZXNzLCBzcXVhcmUsIGk7CisgICAgaW50NjRfdCBhY2N1OworICAgIGludCBzaGlmdDEgPSAzMCAtIGJpdHM7CisgICAgaW50IHNoaWZ0MiA9IGJpdHMgLSAxNTsKKworICAgIGlmIChzaGlmdDEgPiAwKSByZXR2YWwgPSBmZl9zcXJ0KHggPDwgc2hpZnQxKTsKKyAgICBlbHNlIHJldHZhbCA9IGZmX3NxcnQoeCA+PiAtc2hpZnQxKTsKKworICAgIGlmIChzaGlmdDIgPiAwKSB7CisgICAgICAgIHJldHZhbCA9IHJldHZhbCA8PCBzaGlmdDI7CisgICAgICAgIGJpdF9tYXNrID0gKDEgPDwgKHNoaWZ0MiAtIDEpKTsKKworICAgICAgICBmb3IgKGk9MDsgaTxzaGlmdDI7IGkrKyl7CisgICAgICAgICAgICBndWVzcyA9IHJldHZhbCArIGJpdF9tYXNrOworICAgICAgICAgICAgYWNjdSA9IChpbnQ2NF90KWd1ZXNzICogZ3Vlc3M7CisgICAgICAgICAgICBzcXVhcmUgPSAoaW50KSgoYWNjdSArIGJpdF9tYXNrKSA+PiBiaXRzKTsKKyAgICAgICAgICAgIGlmICh4ID49IHNxdWFyZSkKKyAgICAgICAgICAgICAgICByZXR2YWwgKz0gYml0X21hc2s7CisgICAgICAgICAgICBiaXRfbWFzayA+Pj0gMTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UgcmV0dmFsID4+PSAoLXNoaWZ0Mik7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYgLyogQVZVVElMX0ZJWEVEX0RTUF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2Zsb2F0X2RzcC5jIGIvZmZtcGVnL2xpYmF2dXRpbC9mbG9hdF9kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdkN2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9mbG9hdF9kc3AuYwpAQCAtMCwwICsxLDQ1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IEJhbGF0b25pIERlbmVzCisgKiBDb3B5cmlnaHQgMjAwNiBMb3JlbiBNZXJyaXR0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibWVtLmgiCisKK3N0YXRpYyB2b2lkIHZlY3Rvcl9mbXVsX2MoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgZHN0W2ldID0gc3JjMFtpXSAqIHNyYzFbaV07Cit9CisKK3N0YXRpYyB2b2lkIHZlY3Rvcl9mbWFjX3NjYWxhcl9jKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGZsb2F0IG11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICBkc3RbaV0gKz0gc3JjW2ldICogbXVsOworfQorCitzdGF0aWMgdm9pZCB2ZWN0b3JfZm11bF9zY2FsYXJfYyhmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCBtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgZHN0W2ldID0gc3JjW2ldICogbXVsOworfQorCitzdGF0aWMgdm9pZCB2ZWN0b3JfZG11bF9zY2FsYXJfYyhkb3VibGUgKmRzdCwgY29uc3QgZG91YmxlICpzcmMsIGRvdWJsZSBtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgZHN0W2ldID0gc3JjW2ldICogbXVsOworfQorCitzdGF0aWMgdm9pZCB2ZWN0b3JfZm11bF93aW5kb3dfYyhmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMxLCBjb25zdCBmbG9hdCAqd2luLCBpbnQgbGVuKQoreworICAgIGludCBpLCBqOworCisgICAgZHN0ICArPSBsZW47CisgICAgd2luICArPSBsZW47CisgICAgc3JjMCArPSBsZW47CisKKyAgICBmb3IgKGkgPSAtbGVuLCBqID0gbGVuIC0gMTsgaSA8IDA7IGkrKywgai0tKSB7CisgICAgICAgIGZsb2F0IHMwID0gc3JjMFtpXTsKKyAgICAgICAgZmxvYXQgczEgPSBzcmMxW2pdOworICAgICAgICBmbG9hdCB3aSA9IHdpbltpXTsKKyAgICAgICAgZmxvYXQgd2ogPSB3aW5bal07CisgICAgICAgIGRzdFtpXSA9IHMwICogd2ogLSBzMSAqIHdpOworICAgICAgICBkc3Rbal0gPSBzMCAqIHdpICsgczEgKiB3ajsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZlY3Rvcl9mbXVsX2FkZF9jKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMyLCBpbnQgbGVuKXsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgZHN0W2ldID0gc3JjMFtpXSAqIHNyYzFbaV0gKyBzcmMyW2ldOworfQorCitzdGF0aWMgdm9pZCB2ZWN0b3JfZm11bF9yZXZlcnNlX2MoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzEsIGludCBsZW4pCit7CisgICAgaW50IGk7CisKKyAgICBzcmMxICs9IGxlbi0xOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgZHN0W2ldID0gc3JjMFtpXSAqIHNyYzFbLWldOworfQorCitzdGF0aWMgdm9pZCBidXR0ZXJmbGllc19mbG9hdF9jKGZsb2F0ICphdl9yZXN0cmljdCB2MSwgZmxvYXQgKmF2X3Jlc3RyaWN0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGZsb2F0IHQgPSB2MVtpXSAtIHYyW2ldOworICAgICAgICB2MVtpXSArPSB2MltpXTsKKyAgICAgICAgdjJbaV0gPSB0OworICAgIH0KK30KKworZmxvYXQgYXZwcml2X3NjYWxhcnByb2R1Y3RfZmxvYXRfYyhjb25zdCBmbG9hdCAqdjEsIGNvbnN0IGZsb2F0ICp2MiwgaW50IGxlbikKK3sKKyAgICBmbG9hdCBwID0gMC4wOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICBwICs9IHYxW2ldICogdjJbaV07CisKKyAgICByZXR1cm4gcDsKK30KKworYXZfY29sZCB2b2lkIGF2cHJpdl9mbG9hdF9kc3BfaW5pdChBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCwgaW50IGJpdF9leGFjdCkKK3sKKyAgICBmZHNwLT52ZWN0b3JfZm11bCA9IHZlY3Rvcl9mbXVsX2M7CisgICAgZmRzcC0+dmVjdG9yX2ZtYWNfc2NhbGFyID0gdmVjdG9yX2ZtYWNfc2NhbGFyX2M7CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyID0gdmVjdG9yX2ZtdWxfc2NhbGFyX2M7CisgICAgZmRzcC0+dmVjdG9yX2RtdWxfc2NhbGFyID0gdmVjdG9yX2RtdWxfc2NhbGFyX2M7CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93ID0gdmVjdG9yX2ZtdWxfd2luZG93X2M7CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfYWRkID0gdmVjdG9yX2ZtdWxfYWRkX2M7CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZSA9IHZlY3Rvcl9mbXVsX3JldmVyc2VfYzsKKyAgICBmZHNwLT5idXR0ZXJmbGllc19mbG9hdCA9IGJ1dHRlcmZsaWVzX2Zsb2F0X2M7CisgICAgZmRzcC0+c2NhbGFycHJvZHVjdF9mbG9hdCA9IGF2cHJpdl9zY2FsYXJwcm9kdWN0X2Zsb2F0X2M7CisKKyAgICBpZiAoQVJDSF9BQVJDSDY0KQorICAgICAgICBmZl9mbG9hdF9kc3BfaW5pdF9hYXJjaDY0KGZkc3ApOworICAgIGlmIChBUkNIX0FSTSkKKyAgICAgICAgZmZfZmxvYXRfZHNwX2luaXRfYXJtKGZkc3ApOworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfZmxvYXRfZHNwX2luaXRfcHBjKGZkc3AsIGJpdF9leGFjdCk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9mbG9hdF9kc3BfaW5pdF94ODYoZmRzcCk7CisgICAgaWYgKEFSQ0hfTUlQUykKKyAgICAgICAgZmZfZmxvYXRfZHNwX2luaXRfbWlwcyhmZHNwKTsKK30KKworYXZfY29sZCBBVkZsb2F0RFNQQ29udGV4dCAqYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhpbnQgYml0X2V4YWN0KQoreworICAgIEFWRmxvYXREU1BDb250ZXh0ICpyZXQgPSBhdl9tYWxsb2N6KHNpemVvZihBVkZsb2F0RFNQQ29udGV4dCkpOworICAgIGlmIChyZXQpCisgICAgICAgIGF2cHJpdl9mbG9hdF9kc3BfaW5pdChyZXQsIGJpdF9leGFjdCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisjaWZkZWYgVEVTVAorCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPiAvKiBmb3IgZ2V0b3B0ICovCisjZW5kaWYKKyNpZiAhSEFWRV9HRVRPUFQKKyNpbmNsdWRlICJjb21wYXQvZ2V0b3B0LmMiCisjZW5kaWYKKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGZnLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAicmFuZG9tX3NlZWQuaCIKKworI2RlZmluZSBMRU4gMjQwCisKK3N0YXRpYyB2b2lkIGZpbGxfZmxvYXRfYXJyYXkoQVZMRkcgKmxmZywgZmxvYXQgKmEsIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIGJtZ1syXSwgc3RkZGV2ID0gMTAuMCwgbWVhbiA9IDAuMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworICAgICAgICBhdl9ibWdfZ2V0KGxmZywgYm1nKTsKKyAgICAgICAgYVtpXSAgICAgPSBibWdbMF0gKiBzdGRkZXYgKyBtZWFuOworICAgICAgICBhW2kgKyAxXSA9IGJtZ1sxXSAqIHN0ZGRldiArIG1lYW47CisgICAgfQorfQorc3RhdGljIGludCBjb21wYXJlX2Zsb2F0cyhjb25zdCBmbG9hdCAqYSwgY29uc3QgZmxvYXQgKmIsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heF9kaWZmKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpZiAoZmFic2YoYVtpXSAtIGJbaV0pID4gbWF4X2RpZmYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZDogJS0gLjEyZiAtICUtIC4xMmYgPSAlIC4xMmdcbiIsCisgICAgICAgICAgICAgICAgICAgaSwgYVtpXSwgYltpXSwgYVtpXSAtIGJbaV0pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2RvdWJsZV9hcnJheShBVkxGRyAqbGZnLCBkb3VibGUgKmEsIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIGJtZ1syXSwgc3RkZGV2ID0gMTAuMCwgbWVhbiA9IDAuMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworICAgICAgICBhdl9ibWdfZ2V0KGxmZywgYm1nKTsKKyAgICAgICAgYVtpXSAgICAgPSBibWdbMF0gKiBzdGRkZXYgKyBtZWFuOworICAgICAgICBhW2kgKyAxXSA9IGJtZ1sxXSAqIHN0ZGRldiArIG1lYW47CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbXBhcmVfZG91Ymxlcyhjb25zdCBkb3VibGUgKmEsIGNvbnN0IGRvdWJsZSAqYiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXhfZGlmZikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpZiAoZmFicyhhW2ldIC0gYltpXSkgPiBtYXhfZGlmZikgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkOiAlLSAuMTJmIC0gJS0gLjEyZiA9ICUgLjEyZ1xuIiwKKyAgICAgICAgICAgICAgICAgICBpLCBhW2ldLCBiW2ldLCBhW2ldIC0gYltpXSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF92ZWN0b3JfZm11bChBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCwgQVZGbG9hdERTUENvbnRleHQgKmNkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIpCit7CisgICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIGNkc3QsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgb2RzdCwgW0xFTl0pOworICAgIGludCByZXQ7CisKKyAgICBjZHNwLT52ZWN0b3JfZm11bChjZHN0LCB2MSwgdjIsIExFTik7CisgICAgZmRzcC0+dmVjdG9yX2ZtdWwob2RzdCwgdjEsIHYyLCBMRU4pOworCisgICAgaWYgKHJldCA9IGNvbXBhcmVfZmxvYXRzKGNkc3QsIG9kc3QsIExFTiwgRkxUX0VQU0lMT04pKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAidmVjdG9yX2ZtdWwgZmFpbGVkXG4iKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgQVJCSVRSQVJZX0ZNQUNfU0NBTEFSX0NPTlNUIDAuMDA1CitzdGF0aWMgaW50IHRlc3RfdmVjdG9yX2ZtYWNfc2NhbGFyKEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLCBBVkZsb2F0RFNQQ29udGV4dCAqY2RzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqc3JjMCwgZmxvYXQgc2NhbGUpCit7CisgICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIGNkc3QsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgb2RzdCwgW0xFTl0pOworICAgIGludCByZXQ7CisKKyAgICBtZW1jcHkoY2RzdCwgdjEsIExFTiAqIHNpemVvZigqdjEpKTsKKyAgICBtZW1jcHkob2RzdCwgdjEsIExFTiAqIHNpemVvZigqdjEpKTsKKworICAgIGNkc3AtPnZlY3Rvcl9mbWFjX3NjYWxhcihjZHN0LCBzcmMwLCBzY2FsZSwgTEVOKTsKKyAgICBmZHNwLT52ZWN0b3JfZm1hY19zY2FsYXIob2RzdCwgc3JjMCwgc2NhbGUsIExFTik7CisKKyAgICBpZiAocmV0ID0gY29tcGFyZV9mbG9hdHMoY2RzdCwgb2RzdCwgTEVOLCBBUkJJVFJBUllfRk1BQ19TQ0FMQVJfQ09OU1QpKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAidmVjdG9yX2ZtYWNfc2NhbGFyIGZhaWxlZFxuIik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRlc3RfdmVjdG9yX2ZtdWxfc2NhbGFyKEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLCBBVkZsb2F0RFNQQ29udGV4dCAqY2RzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBmbG9hdCBzY2FsZSkKK3sKKyAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgY2RzdCwgW0xFTl0pOworICAgIExPQ0FMX0FMSUdORUQoMzIsIGZsb2F0LCBvZHN0LCBbTEVOXSk7CisgICAgaW50IHJldDsKKworICAgIGNkc3AtPnZlY3Rvcl9mbXVsX3NjYWxhcihjZHN0LCB2MSwgc2NhbGUsIExFTik7CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyKG9kc3QsIHYxLCBzY2FsZSwgTEVOKTsKKworICAgIGlmIChyZXQgPSBjb21wYXJlX2Zsb2F0cyhjZHN0LCBvZHN0LCBMRU4sIEZMVF9FUFNJTE9OKSkKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInZlY3Rvcl9mbXVsX3NjYWxhciBmYWlsZWRcbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZXN0X3ZlY3Rvcl9kbXVsX3NjYWxhcihBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCwgQVZGbG9hdERTUENvbnRleHQgKmNkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqdjEsIGRvdWJsZSBzY2FsZSkKK3sKKyAgICBMT0NBTF9BTElHTkVEKDMyLCBkb3VibGUsIGNkc3QsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEKDMyLCBkb3VibGUsIG9kc3QsIFtMRU5dKTsKKyAgICBpbnQgcmV0OworCisgICAgY2RzcC0+dmVjdG9yX2RtdWxfc2NhbGFyKGNkc3QsIHYxLCBzY2FsZSwgTEVOKTsKKyAgICBmZHNwLT52ZWN0b3JfZG11bF9zY2FsYXIob2RzdCwgdjEsIHNjYWxlLCBMRU4pOworCisgICAgaWYgKHJldCA9IGNvbXBhcmVfZG91YmxlcyhjZHN0LCBvZHN0LCBMRU4sIERCTF9FUFNJTE9OKSkKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInZlY3Rvcl9kbXVsX3NjYWxhciBmYWlsZWRcbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBBUkJJVFJBUllfRk1VTF9XSU5ET1dfQ09OU1QgMC4wMDgKK3N0YXRpYyBpbnQgdGVzdF92ZWN0b3JfZm11bF93aW5kb3coQVZGbG9hdERTUENvbnRleHQgKmZkc3AsIEFWRmxvYXREU1BDb250ZXh0ICpjZHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqdjEsIGNvbnN0IGZsb2F0ICp2MiwgY29uc3QgZmxvYXQgKnYzKQoreworICAgIExPQ0FMX0FMSUdORUQoMzIsIGZsb2F0LCBjZHN0LCBbTEVOXSk7CisgICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIG9kc3QsIFtMRU5dKTsKKyAgICBpbnQgcmV0OworCisgICAgY2RzcC0+dmVjdG9yX2ZtdWxfd2luZG93KGNkc3QsIHYxLCB2MiwgdjMsIExFTiAvIDIpOworICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvZHN0LCB2MSwgdjIsIHYzLCBMRU4gLyAyKTsKKworICAgIGlmIChyZXQgPSBjb21wYXJlX2Zsb2F0cyhjZHN0LCBvZHN0LCBMRU4sIEFSQklUUkFSWV9GTVVMX1dJTkRPV19DT05TVCkpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJ2ZWN0b3JfZm11bF93aW5kb3cgZmFpbGVkXG4iKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgQVJCSVRSQVJZX0ZNVUxfQUREX0NPTlNUIDAuMDA1CitzdGF0aWMgaW50IHRlc3RfdmVjdG9yX2ZtdWxfYWRkKEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLCBBVkZsb2F0RFNQQ29udGV4dCAqY2RzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIsIGNvbnN0IGZsb2F0ICp2MykKK3sKKyAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgY2RzdCwgW0xFTl0pOworICAgIExPQ0FMX0FMSUdORUQoMzIsIGZsb2F0LCBvZHN0LCBbTEVOXSk7CisgICAgaW50IHJldDsKKworICAgIGNkc3AtPnZlY3Rvcl9mbXVsX2FkZChjZHN0LCB2MSwgdjIsIHYzLCBMRU4pOworICAgIGZkc3AtPnZlY3Rvcl9mbXVsX2FkZChvZHN0LCB2MSwgdjIsIHYzLCBMRU4pOworCisgICAgaWYgKHJldCA9IGNvbXBhcmVfZmxvYXRzKGNkc3QsIG9kc3QsIExFTiwgQVJCSVRSQVJZX0ZNVUxfQUREX0NPTlNUKSkKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInZlY3Rvcl9mbXVsX2FkZCBmYWlsZWRcbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZXN0X3ZlY3Rvcl9mbXVsX3JldmVyc2UoQVZGbG9hdERTUENvbnRleHQgKmZkc3AsIEFWRmxvYXREU1BDb250ZXh0ICpjZHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIpCit7CisgICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIGNkc3QsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgb2RzdCwgW0xFTl0pOworICAgIGludCByZXQ7CisKKyAgICBjZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKGNkc3QsIHYxLCB2MiwgTEVOKTsKKyAgICBmZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKG9kc3QsIHYxLCB2MiwgTEVOKTsKKworICAgIGlmIChyZXQgPSBjb21wYXJlX2Zsb2F0cyhjZHN0LCBvZHN0LCBMRU4sIEZMVF9FUFNJTE9OKSkKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInZlY3Rvcl9mbXVsX3JldmVyc2UgZmFpbGVkXG4iKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9idXR0ZXJmbGllc19mbG9hdChBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCwgQVZGbG9hdERTUENvbnRleHQgKmNkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIpCit7CisgICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIGN2MSwgW0xFTl0pOworICAgIExPQ0FMX0FMSUdORUQoMzIsIGZsb2F0LCBjdjIsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgb3YxLCBbTEVOXSk7CisgICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIG92MiwgW0xFTl0pOworICAgIGludCByZXQ7CisKKyAgICBtZW1jcHkoY3YxLCB2MSwgTEVOICogc2l6ZW9mKCp2MSkpOworICAgIG1lbWNweShjdjIsIHYyLCBMRU4gKiBzaXplb2YoKnYyKSk7CisgICAgbWVtY3B5KG92MSwgdjEsIExFTiAqIHNpemVvZigqdjEpKTsKKyAgICBtZW1jcHkob3YyLCB2MiwgTEVOICogc2l6ZW9mKCp2MikpOworCisgICAgY2RzcC0+YnV0dGVyZmxpZXNfZmxvYXQoY3YxLCBjdjIsIExFTik7CisgICAgZmRzcC0+YnV0dGVyZmxpZXNfZmxvYXQob3YxLCBvdjIsIExFTik7CisKKyAgICBpZiAoKHJldCA9IGNvbXBhcmVfZmxvYXRzKGN2MSwgb3YxLCBMRU4sIEZMVF9FUFNJTE9OKSkgfHwKKyAgICAgICAgKHJldCA9IGNvbXBhcmVfZmxvYXRzKGN2Miwgb3YyLCBMRU4sIEZMVF9FUFNJTE9OKSkpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJidXR0ZXJmbGllc19mbG9hdCBmYWlsZWRcbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBBUkJJVFJBUllfU0NBTEFSUFJPRFVDVF9DT05TVCAwLjIKK3N0YXRpYyBpbnQgdGVzdF9zY2FsYXJwcm9kdWN0X2Zsb2F0KEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLCBBVkZsb2F0RFNQQ29udGV4dCAqY2RzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICp2MSwgY29uc3QgZmxvYXQgKnYyKQoreworICAgIGZsb2F0IGNwcm9kLCBvcHJvZDsKKyAgICBpbnQgcmV0OworCisgICAgY3Byb2QgPSBjZHNwLT5zY2FsYXJwcm9kdWN0X2Zsb2F0KHYxLCB2MiwgTEVOKTsKKyAgICBvcHJvZCA9IGZkc3AtPnNjYWxhcnByb2R1Y3RfZmxvYXQodjEsIHYyLCBMRU4pOworCisgICAgaWYgKHJldCA9IGNvbXBhcmVfZmxvYXRzKCZjcHJvZCwgJm9wcm9kLCAxLCBBUkJJVFJBUllfU0NBTEFSUFJPRFVDVF9DT05TVCkpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJzY2FsYXJwcm9kdWN0X2Zsb2F0IGZhaWxlZFxuIik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IHJldCA9IDAsIHNlZWRlZCA9IDA7CisgICAgdWludDMyX3Qgc2VlZDsKKyAgICBBVkZsb2F0RFNQQ29udGV4dCBmZHNwLCBjZHNwOworICAgIEFWTEZHIGxmZzsKKworICAgIExPQ0FMX0FMSUdORUQoMzIsIGZsb2F0LCBzcmMwLCBbTEVOXSk7CisgICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIHNyYzEsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgc3JjMiwgW0xFTl0pOworICAgIExPQ0FMX0FMSUdORUQoMzIsIGRvdWJsZSwgZGJsX3NyYzAsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEKDMyLCBkb3VibGUsIGRibF9zcmMxLCBbTEVOXSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBhcmcgPSBnZXRvcHQoYXJnYywgYXJndiwgInM6YzoiKTsKKyAgICAgICAgaWYgKGFyZyA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKGFyZykgeworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgIHNlZWQgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMTApOworICAgICAgICAgICAgc2VlZGVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNwdWZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgICAgICAgICBpZiAoYXZfcGFyc2VfY3B1X2NhcHMoJmNwdWZsYWdzLCBvcHRhcmcpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgYXZfZm9yY2VfY3B1X2ZsYWdzKGNwdWZsYWdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzZWVkZWQpCisgICAgICAgIHNlZWQgPSBhdl9nZXRfcmFuZG9tX3NlZWQoKTsKKworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgImZsb2F0X2RzcC10ZXN0OiAlcyAldVxuIiwgc2VlZGVkID8gInNlZWQiIDogInJhbmRvbSBzZWVkIiwgc2VlZCk7CisKKyAgICBhdl9sZmdfaW5pdCgmbGZnLCBzZWVkKTsKKworICAgIGZpbGxfZmxvYXRfYXJyYXkoJmxmZywgc3JjMCwgTEVOKTsKKyAgICBmaWxsX2Zsb2F0X2FycmF5KCZsZmcsIHNyYzEsIExFTik7CisgICAgZmlsbF9mbG9hdF9hcnJheSgmbGZnLCBzcmMyLCBMRU4pOworCisgICAgZmlsbF9kb3VibGVfYXJyYXkoJmxmZywgZGJsX3NyYzAsIExFTik7CisgICAgZmlsbF9kb3VibGVfYXJyYXkoJmxmZywgZGJsX3NyYzEsIExFTik7CisKKyAgICBhdnByaXZfZmxvYXRfZHNwX2luaXQoJmZkc3AsIDEpOworICAgIGF2X3NldF9jcHVfZmxhZ3NfbWFzaygwKTsKKyAgICBhdnByaXZfZmxvYXRfZHNwX2luaXQoJmNkc3AsIDEpOworCisgICAgaWYgKHRlc3RfdmVjdG9yX2ZtdWwoJmZkc3AsICZjZHNwLCBzcmMwLCBzcmMxKSkKKyAgICAgICAgcmV0IC09IDEgPDwgMDsKKyAgICBpZiAodGVzdF92ZWN0b3JfZm1hY19zY2FsYXIoJmZkc3AsICZjZHNwLCBzcmMyLCBzcmMwLCBzcmMxWzBdKSkKKyAgICAgICAgcmV0IC09IDEgPDwgMTsKKyAgICBpZiAodGVzdF92ZWN0b3JfZm11bF9zY2FsYXIoJmZkc3AsICZjZHNwLCBzcmMwLCBzcmMxWzBdKSkKKyAgICAgICAgcmV0IC09IDEgPDwgMjsKKyAgICBpZiAodGVzdF92ZWN0b3JfZm11bF93aW5kb3coJmZkc3AsICZjZHNwLCBzcmMwLCBzcmMxLCBzcmMyKSkKKyAgICAgICAgcmV0IC09IDEgPDwgMzsKKyAgICBpZiAodGVzdF92ZWN0b3JfZm11bF9hZGQoJmZkc3AsICZjZHNwLCBzcmMwLCBzcmMxLCBzcmMyKSkKKyAgICAgICAgcmV0IC09IDEgPDwgNDsKKyAgICBpZiAodGVzdF92ZWN0b3JfZm11bF9yZXZlcnNlKCZmZHNwLCAmY2RzcCwgc3JjMCwgc3JjMSkpCisgICAgICAgIHJldCAtPSAxIDw8IDU7CisgICAgaWYgKHRlc3RfYnV0dGVyZmxpZXNfZmxvYXQoJmZkc3AsICZjZHNwLCBzcmMwLCBzcmMxKSkKKyAgICAgICAgcmV0IC09IDEgPDwgNjsKKyAgICBpZiAodGVzdF9zY2FsYXJwcm9kdWN0X2Zsb2F0KCZmZHNwLCAmY2RzcCwgc3JjMCwgc3JjMSkpCisgICAgICAgIHJldCAtPSAxIDw8IDc7CisgICAgaWYgKHRlc3RfdmVjdG9yX2RtdWxfc2NhbGFyKCZmZHNwLCAmY2RzcCwgZGJsX3NyYzAsIGRibF9zcmMxWzBdKSkKKyAgICAgICAgcmV0IC09IDEgPDwgODsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2Zsb2F0X2RzcC5oIGIvZmZtcGVnL2xpYmF2dXRpbC9mbG9hdF9kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDNmNzAxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9mbG9hdF9kc3AuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9GTE9BVF9EU1BfSAorI2RlZmluZSBBVlVUSUxfRkxPQVRfRFNQX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCit0eXBlZGVmIHN0cnVjdCBBVkZsb2F0RFNQQ29udGV4dCB7CisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzIG9mIGZsb2F0cyBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbgorICAgICAqIGEgdmVjdG9yIG9mIGZsb2F0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkc3QgIG91dHB1dCB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogMzItYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIHNyYzAgZmlyc3QgaW5wdXQgdmVjdG9yCisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IDMyLWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBzcmMxIHNlY29uZCBpbnB1dCB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogMzItYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIGxlbiAgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dAorICAgICAqICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBtdWx0aXBsZSBvZiAxNgorICAgICAqLworICAgIHZvaWQgKCp2ZWN0b3JfZm11bCkoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7CisKKyAgICAvKioKKyAgICAgKiBNdWx0aXBseSBhIHZlY3RvciBvZiBmbG9hdHMgYnkgYSBzY2FsYXIgZmxvYXQgYW5kIGFkZCB0bworICAgICAqIGRlc3RpbmF0aW9uIHZlY3Rvci4gIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gdmVjdG9ycyBtdXN0CisgICAgICogb3ZlcmxhcCBleGFjdGx5IG9yIG5vdCBhdCBhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHN0IHJlc3VsdCB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAzMi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gc3JjIGlucHV0IHZlY3RvcgorICAgICAqICAgICAgICAgICAgY29uc3RyYWludHM6IDMyLWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBtdWwgc2NhbGFyIHZhbHVlCisgICAgICogQHBhcmFtIGxlbiBsZW5ndGggb2YgdmVjdG9yCisgICAgICogICAgICAgICAgICBjb25zdHJhaW50czogbXVsdGlwbGUgb2YgMTYKKyAgICAgKi8KKyAgICB2b2lkICgqdmVjdG9yX2ZtYWNfc2NhbGFyKShmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCBtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7CisKKyAgICAvKioKKyAgICAgKiBNdWx0aXBseSBhIHZlY3RvciBvZiBmbG9hdHMgYnkgYSBzY2FsYXIgZmxvYXQuICBTb3VyY2UgYW5kCisgICAgICogZGVzdGluYXRpb24gdmVjdG9ycyBtdXN0IG92ZXJsYXAgZXhhY3RseSBvciBub3QgYXQgYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGRzdCByZXN1bHQgdmVjdG9yCisgICAgICogICAgICAgICAgICBjb25zdHJhaW50czogMTYtYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIHNyYyBpbnB1dCB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gbXVsIHNjYWxhciB2YWx1ZQorICAgICAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHZlY3RvcgorICAgICAqICAgICAgICAgICAgY29uc3RyYWludHM6IG11bHRpcGxlIG9mIDQKKyAgICAgKi8KKyAgICB2b2lkICgqdmVjdG9yX2ZtdWxfc2NhbGFyKShmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCBtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7CisKKyAgICAvKioKKyAgICAgKiBNdWx0aXBseSBhIHZlY3RvciBvZiBkb3VibGUgYnkgYSBzY2FsYXIgZG91YmxlLiAgU291cmNlIGFuZAorICAgICAqIGRlc3RpbmF0aW9uIHZlY3RvcnMgbXVzdCBvdmVybGFwIGV4YWN0bHkgb3Igbm90IGF0IGFsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkc3QgcmVzdWx0IHZlY3RvcgorICAgICAqICAgICAgICAgICAgY29uc3RyYWludHM6IDMyLWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBzcmMgaW5wdXQgdmVjdG9yCisgICAgICogICAgICAgICAgICBjb25zdHJhaW50czogMzItYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIG11bCBzY2FsYXIgdmFsdWUKKyAgICAgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBtdWx0aXBsZSBvZiA4CisgICAgICovCisgICAgdm9pZCAoKnZlY3Rvcl9kbXVsX3NjYWxhcikoZG91YmxlICpkc3QsIGNvbnN0IGRvdWJsZSAqc3JjLCBkb3VibGUgbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCisgICAgLyoqCisgICAgICogT3ZlcmxhcC9hZGQgd2l0aCB3aW5kb3cgZnVuY3Rpb24uCisgICAgICogVXNlZCBwcmltYXJpbHkgYnkgTURDVC1iYXNlZCBhdWRpbyBjb2RlY3MuCisgICAgICogU291cmNlIGFuZCBkZXN0aW5hdGlvbiB2ZWN0b3JzIG11c3Qgb3ZlcmxhcCBleGFjdGx5IG9yIG5vdCBhdCBhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHN0ICByZXN1bHQgdmVjdG9yCisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IDE2LWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBzcmMwIGZpcnN0IHNvdXJjZSB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogMTYtYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIHNyYzEgc2Vjb25kIHNvdXJjZSB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogMTYtYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIHdpbiAgaGFsZi13aW5kb3cgdmVjdG9yCisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IDE2LWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBsZW4gIGxlbmd0aCBvZiB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogbXVsdGlwbGUgb2YgNAorICAgICAqLworICAgIHZvaWQgKCp2ZWN0b3JfZm11bF93aW5kb3cpKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMxLCBjb25zdCBmbG9hdCAqd2luLCBpbnQgbGVuKTsKKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiB0d28gdmVjdG9ycyBvZiBmbG9hdHMsIGFkZCBhIHRoaXJkIHZlY3RvciBvZgorICAgICAqIGZsb2F0cyBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBhIHZlY3RvciBvZiBmbG9hdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHN0ICBvdXRwdXQgdmVjdG9yCisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IDMyLWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBzcmMwIGZpcnN0IGlucHV0IHZlY3RvcgorICAgICAqICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAzMi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gc3JjMSBzZWNvbmQgaW5wdXQgdmVjdG9yCisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IDMyLWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBzcmMyIHRoaXJkIGlucHV0IHZlY3RvcgorICAgICAqICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAzMi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gbGVuICBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0CisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IG11bHRpcGxlIG9mIDE2CisgICAgICovCisgICAgdm9pZCAoKnZlY3Rvcl9mbXVsX2FkZCkoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMyLCBpbnQgbGVuKTsKKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiB0d28gdmVjdG9ycyBvZiBmbG9hdHMsIGFuZCBzdG9yZSB0aGUgcmVzdWx0CisgICAgICogaW4gYSB2ZWN0b3Igb2YgZmxvYXRzLiBUaGUgc2Vjb25kIHZlY3RvciBvZiBmbG9hdHMgaXMgaXRlcmF0ZWQgb3ZlcgorICAgICAqIGluIHJldmVyc2Ugb3JkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHN0ICBvdXRwdXQgdmVjdG9yCisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IDMyLWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBzcmMwIGZpcnN0IGlucHV0IHZlY3RvcgorICAgICAqICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiAzMi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gc3JjMSBzZWNvbmQgaW5wdXQgdmVjdG9yCisgICAgICogICAgICAgICAgICAgY29uc3RyYWludHM6IDMyLWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBsZW4gIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQKKyAgICAgKiAgICAgICAgICAgICBjb25zdHJhaW50czogbXVsdGlwbGUgb2YgMTYKKyAgICAgKi8KKyAgICB2b2lkICgqdmVjdG9yX2ZtdWxfcmV2ZXJzZSkoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMxLCBpbnQgbGVuKTsKKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgc3VtIGFuZCBkaWZmZXJlbmNlIG9mIHR3byB2ZWN0b3JzIG9mIGZsb2F0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2MSAgZmlyc3QgaW5wdXQgdmVjdG9yLCBzdW0gb3V0cHV0LCAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gdjIgIHNlY29uZCBpbnB1dCB2ZWN0b3IsIGRpZmZlcmVuY2Ugb3V0cHV0LCAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB2ZWN0b3JzLCBtdWx0aXBsZSBvZiA0CisgICAgICovCisgICAgdm9pZCAoKmJ1dHRlcmZsaWVzX2Zsb2F0KShmbG9hdCAqYXZfcmVzdHJpY3QgdjEsIGZsb2F0ICphdl9yZXN0cmljdCB2MiwgaW50IGxlbik7CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHNjYWxhciBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzIG9mIGZsb2F0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2MSAgZmlyc3QgdmVjdG9yLCAxNi1ieXRlIGFsaWduZWQKKyAgICAgKiBAcGFyYW0gdjIgIHNlY29uZCB2ZWN0b3IsIDE2LWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHZlY3RvcnMsIG11bHRpcGxlIG9mIDQKKyAgICAgKgorICAgICAqIEByZXR1cm4gc3VtIG9mIGVsZW1lbnR3aXNlIHByb2R1Y3RzCisgICAgICovCisgICAgZmxvYXQgKCpzY2FsYXJwcm9kdWN0X2Zsb2F0KShjb25zdCBmbG9hdCAqdjEsIGNvbnN0IGZsb2F0ICp2MiwgaW50IGxlbik7Cit9IEFWRmxvYXREU1BDb250ZXh0OworCisvKioKKyAqIFJldHVybiB0aGUgc2NhbGFyIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnMuCisgKgorICogQHBhcmFtIHYxICBmaXJzdCBpbnB1dCB2ZWN0b3IKKyAqIEBwYXJhbSB2MiAgZmlyc3QgaW5wdXQgdmVjdG9yCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBlbGVtZW50cworICoKKyAqIEByZXR1cm4gc3VtIG9mIGVsZW1lbnR3aXNlIHByb2R1Y3RzCisgKi8KK2Zsb2F0IGF2cHJpdl9zY2FsYXJwcm9kdWN0X2Zsb2F0X2MoY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIsIGludCBsZW4pOworCisvKioKKyAqIEluaXRpYWxpemUgYSBmbG9hdCBEU1AgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gZmRzcCAgICBmbG9hdCBEU1AgY29udGV4dAorICogQHBhcmFtIHN0cmljdCAgc2V0dGluZyB0byBub24temVybyBhdm9pZHMgdXNpbmcgZnVuY3Rpb25zIHdoaWNoIG1heSBub3QgYmUgSUVFRS03NTQgY29tcGxpYW50CisgKi8KK3ZvaWQgYXZwcml2X2Zsb2F0X2RzcF9pbml0KEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLCBpbnQgc3RyaWN0KTsKKworCit2b2lkIGZmX2Zsb2F0X2RzcF9pbml0X2FhcmNoNjQoQVZGbG9hdERTUENvbnRleHQgKmZkc3ApOwordm9pZCBmZl9mbG9hdF9kc3BfaW5pdF9hcm0oQVZGbG9hdERTUENvbnRleHQgKmZkc3ApOwordm9pZCBmZl9mbG9hdF9kc3BfaW5pdF9wcGMoQVZGbG9hdERTUENvbnRleHQgKmZkc3AsIGludCBzdHJpY3QpOwordm9pZCBmZl9mbG9hdF9kc3BfaW5pdF94ODYoQVZGbG9hdERTUENvbnRleHQgKmZkc3ApOwordm9pZCBmZl9mbG9hdF9kc3BfaW5pdF9taXBzKEFWRmxvYXREU1BDb250ZXh0ICpmZHNwKTsKKworLyoqCisgKiBBbGxvY2F0ZSBhIGZsb2F0IERTUCBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBzdHJpY3QgIHNldHRpbmcgdG8gbm9uLXplcm8gYXZvaWRzIHVzaW5nIGZ1bmN0aW9ucyB3aGljaCBtYXkgbm90IGJlIElFRUUtNzU0IGNvbXBsaWFudAorICovCitBVkZsb2F0RFNQQ29udGV4dCAqYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhpbnQgc3RyaWN0KTsKKworI2VuZGlmIC8qIEFWVVRJTF9GTE9BVF9EU1BfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9mcmFtZS5jIGIvZmZtcGVnL2xpYmF2dXRpbC9mcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTA2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2ZyYW1lLmMKQEAgLTAsMCArMSw2ODkgQEAKKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImF2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZGljdC5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJzYW1wbGVmbXQuaCIKKworTUFLRV9BQ0NFU1NPUlMoQVZGcmFtZSwgZnJhbWUsIGludDY0X3QsIGJlc3RfZWZmb3J0X3RpbWVzdGFtcCkKK01BS0VfQUNDRVNTT1JTKEFWRnJhbWUsIGZyYW1lLCBpbnQ2NF90LCBwa3RfZHVyYXRpb24pCitNQUtFX0FDQ0VTU09SUyhBVkZyYW1lLCBmcmFtZSwgaW50NjRfdCwgcGt0X3BvcykKK01BS0VfQUNDRVNTT1JTKEFWRnJhbWUsIGZyYW1lLCBpbnQ2NF90LCBjaGFubmVsX2xheW91dCkKK01BS0VfQUNDRVNTT1JTKEFWRnJhbWUsIGZyYW1lLCBpbnQsICAgICBjaGFubmVscykKK01BS0VfQUNDRVNTT1JTKEFWRnJhbWUsIGZyYW1lLCBpbnQsICAgICBzYW1wbGVfcmF0ZSkKK01BS0VfQUNDRVNTT1JTKEFWRnJhbWUsIGZyYW1lLCBBVkRpY3Rpb25hcnkgKiwgbWV0YWRhdGEpCitNQUtFX0FDQ0VTU09SUyhBVkZyYW1lLCBmcmFtZSwgaW50LCAgICAgZGVjb2RlX2Vycm9yX2ZsYWdzKQorTUFLRV9BQ0NFU1NPUlMoQVZGcmFtZSwgZnJhbWUsIGludCwgICAgIHBrdF9zaXplKQorTUFLRV9BQ0NFU1NPUlMoQVZGcmFtZSwgZnJhbWUsIGVudW0gQVZDb2xvclNwYWNlLCBjb2xvcnNwYWNlKQorTUFLRV9BQ0NFU1NPUlMoQVZGcmFtZSwgZnJhbWUsIGVudW0gQVZDb2xvclJhbmdlLCBjb2xvcl9yYW5nZSkKKworI2RlZmluZSBDSEVDS19DSEFOTkVMU19DT05TSVNURU5DWShmcmFtZSkgXAorICAgIGF2X2Fzc2VydDIoIShmcmFtZSktPmNoYW5uZWxfbGF5b3V0IHx8IFwKKyAgICAgICAgICAgICAgIChmcmFtZSktPmNoYW5uZWxzID09IFwKKyAgICAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscygoZnJhbWUpLT5jaGFubmVsX2xheW91dCkpCisKK0FWRGljdGlvbmFyeSAqKmF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKEFWRnJhbWUgKmZyYW1lKSB7cmV0dXJuICZmcmFtZS0+bWV0YWRhdGE7fTsKKworaW50IGF2X2ZyYW1lX3NldF9xcF90YWJsZShBVkZyYW1lICpmLCBBVkJ1ZmZlclJlZiAqYnVmLCBpbnQgc3RyaWRlLCBpbnQgcXBfdHlwZSkKK3sKKyAgICBhdl9idWZmZXJfdW5yZWYoJmYtPnFwX3RhYmxlX2J1Zik7CisKKyAgICBmLT5xcF90YWJsZV9idWYgPSBidWY7CisKKyAgICBmLT5xc2NhbGVfdGFibGUgPSBidWYtPmRhdGE7CisgICAgZi0+cXN0cmlkZSAgICAgID0gc3RyaWRlOworICAgIGYtPnFzY2FsZV90eXBlICA9IHFwX3R5cGU7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50OF90ICphdl9mcmFtZV9nZXRfcXBfdGFibGUoQVZGcmFtZSAqZiwgaW50ICpzdHJpZGUsIGludCAqdHlwZSkKK3sKKyAgICAqc3RyaWRlID0gZi0+cXN0cmlkZTsKKyAgICAqdHlwZSAgID0gZi0+cXNjYWxlX3R5cGU7CisKKyAgICBpZiAoIWYtPnFwX3RhYmxlX2J1ZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gZi0+cXBfdGFibGVfYnVmLT5kYXRhOworfQorCitjb25zdCBjaGFyICphdl9nZXRfY29sb3JzcGFjZV9uYW1lKGVudW0gQVZDb2xvclNwYWNlIHZhbCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVbXSA9IHsKKyAgICAgICAgW0FWQ09MX1NQQ19SR0JdICAgICAgID0gIkdCUiIsCisgICAgICAgIFtBVkNPTF9TUENfQlQ3MDldICAgICA9ICJidDcwOSIsCisgICAgICAgIFtBVkNPTF9TUENfRkNDXSAgICAgICA9ICJmY2MiLAorICAgICAgICBbQVZDT0xfU1BDX0JUNDcwQkddICAgPSAiYnQ0NzBiZyIsCisgICAgICAgIFtBVkNPTF9TUENfU01QVEUxNzBNXSA9ICJzbXB0ZTE3MG0iLAorICAgICAgICBbQVZDT0xfU1BDX1NNUFRFMjQwTV0gPSAic21wdGUyNDBtIiwKKyAgICAgICAgW0FWQ09MX1NQQ19ZQ09DR10gICAgID0gIllDZ0NvIiwKKyAgICB9OworICAgIGlmICgodW5zaWduZWQpdmFsID49IEZGX0FSUkFZX0VMRU1TKG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmFtZVt2YWxdOworfQorCitzdGF0aWMgdm9pZCBnZXRfZnJhbWVfZGVmYXVsdHMoQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaWYgKGZyYW1lLT5leHRlbmRlZF9kYXRhICE9IGZyYW1lLT5kYXRhKQorICAgICAgICBhdl9mcmVlcCgmZnJhbWUtPmV4dGVuZGVkX2RhdGEpOworCisgICAgbWVtc2V0KGZyYW1lLCAwLCBzaXplb2YoKmZyYW1lKSk7CisKKyAgICBmcmFtZS0+cHRzICAgICAgICAgICAgICAgICAgID0KKyAgICBmcmFtZS0+cGt0X2R0cyAgICAgICAgICAgICAgID0KKyAgICBmcmFtZS0+cGt0X3B0cyAgICAgICAgICAgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgYXZfZnJhbWVfc2V0X2Jlc3RfZWZmb3J0X3RpbWVzdGFtcChmcmFtZSwgQVZfTk9QVFNfVkFMVUUpOworICAgIGF2X2ZyYW1lX3NldF9wa3RfZHVyYXRpb24gICAgICAgICAoZnJhbWUsIDApOworICAgIGF2X2ZyYW1lX3NldF9wa3RfcG9zICAgICAgICAgICAgICAoZnJhbWUsIC0xKTsKKyAgICBhdl9mcmFtZV9zZXRfcGt0X3NpemUgICAgICAgICAgICAgKGZyYW1lLCAtMSk7CisgICAgZnJhbWUtPmtleV9mcmFtZSAgICAgICAgICAgPSAxOworICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpeyAwLCAxIH07CisgICAgZnJhbWUtPmZvcm1hdCAgICAgICAgICAgICAgPSAtMTsgLyogdW5rbm93biAqLworICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhICAgICAgID0gZnJhbWUtPmRhdGE7CisgICAgZnJhbWUtPmNvbG9yX3ByaW1hcmllcyAgICAgPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQ7CisgICAgZnJhbWUtPmNvbG9yX3RyYyAgICAgICAgICAgPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQ7CisgICAgZnJhbWUtPmNvbG9yc3BhY2UgICAgICAgICAgPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQ7CisgICAgZnJhbWUtPmNvbG9yX3JhbmdlICAgICAgICAgPSBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRDsKKyAgICBmcmFtZS0+Y2hyb21hX2xvY2F0aW9uICAgICA9IEFWQ0hST01BX0xPQ19VTlNQRUNJRklFRDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9zaWRlX2RhdGEoQVZGcmFtZVNpZGVEYXRhICoqcHRyX3NkKQoreworICAgIEFWRnJhbWVTaWRlRGF0YSAqc2QgPSAqcHRyX3NkOworCisgICAgYXZfZnJlZXAoJnNkLT5kYXRhKTsKKyAgICBhdl9kaWN0X2ZyZWUoJnNkLT5tZXRhZGF0YSk7CisgICAgYXZfZnJlZXAocHRyX3NkKTsKK30KKworQVZGcmFtZSAqYXZfZnJhbWVfYWxsb2Modm9pZCkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpmcmFtZSkpOworCisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSA9IE5VTEw7CisgICAgZ2V0X2ZyYW1lX2RlZmF1bHRzKGZyYW1lKTsKKworICAgIHJldHVybiBmcmFtZTsKK30KKwordm9pZCBhdl9mcmFtZV9mcmVlKEFWRnJhbWUgKipmcmFtZSkKK3sKKyAgICBpZiAoIWZyYW1lIHx8ICEqZnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIGF2X2ZyYW1lX3VucmVmKCpmcmFtZSk7CisgICAgYXZfZnJlZXAoZnJhbWUpOworfQorCitzdGF0aWMgaW50IGdldF92aWRlb19idWZmZXIoQVZGcmFtZSAqZnJhbWUsIGludCBhbGlnbikKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGZyYW1lLT5mb3JtYXQpOworICAgIGludCByZXQsIGk7CisKKyAgICBpZiAoIWRlc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoKHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUoZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0LCAwLCBOVUxMKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCFmcmFtZS0+bGluZXNpemVbMF0pIHsKKyAgICAgICAgZm9yKGk9MTsgaTw9YWxpZ247IGkrPWkpIHsKKyAgICAgICAgICAgIHJldCA9IGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKGZyYW1lLT5saW5lc2l6ZSwgZnJhbWUtPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGQUxJR04oZnJhbWUtPndpZHRoLCBpKSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKCEoZnJhbWUtPmxpbmVzaXplWzBdICYgKGFsaWduLTEpKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIGZyYW1lLT5saW5lc2l6ZVtpXTsgaSsrKQorICAgICAgICAgICAgZnJhbWUtPmxpbmVzaXplW2ldID0gRkZBTElHTihmcmFtZS0+bGluZXNpemVbaV0sIGFsaWduKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBmcmFtZS0+bGluZXNpemVbaV07IGkrKykgeworICAgICAgICBpbnQgaCA9IEZGQUxJR04oZnJhbWUtPmhlaWdodCwgMzIpOworICAgICAgICBpZiAoaSA9PSAxIHx8IGkgPT0gMikKKyAgICAgICAgICAgIGggPSBGRl9DRUlMX1JTSElGVChoLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKworICAgICAgICBmcmFtZS0+YnVmW2ldID0gYXZfYnVmZmVyX2FsbG9jKGZyYW1lLT5saW5lc2l6ZVtpXSAqIGggKyAxNiArIDE2LypTVFJJREVfQUxJR04qLyAtIDEpOworICAgICAgICBpZiAoIWZyYW1lLT5idWZbaV0pCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgZnJhbWUtPmRhdGFbaV0gPSBmcmFtZS0+YnVmW2ldLT5kYXRhOworICAgIH0KKyAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCkgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lLT5idWZbMV0pOworICAgICAgICBmcmFtZS0+YnVmWzFdID0gYXZfYnVmZmVyX2FsbG9jKDEwMjQpOworICAgICAgICBpZiAoIWZyYW1lLT5idWZbMV0pCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGZyYW1lLT5kYXRhWzFdID0gZnJhbWUtPmJ1ZlsxXS0+ZGF0YTsKKyAgICB9CisKKyAgICBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSA9IGZyYW1lLT5kYXRhOworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCitzdGF0aWMgaW50IGdldF9hdWRpb19idWZmZXIoQVZGcmFtZSAqZnJhbWUsIGludCBhbGlnbikKK3sKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IHBsYW5hciAgID0gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoZnJhbWUtPmZvcm1hdCk7CisgICAgaW50IHBsYW5lczsKKyAgICBpbnQgcmV0LCBpOworCisgICAgaWYgKCFmcmFtZS0+Y2hhbm5lbHMpCisgICAgICAgIGZyYW1lLT5jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpOworCisgICAgY2hhbm5lbHMgPSBmcmFtZS0+Y2hhbm5lbHM7CisgICAgcGxhbmVzID0gcGxhbmFyID8gY2hhbm5lbHMgOiAxOworCisgICAgQ0hFQ0tfQ0hBTk5FTFNfQ09OU0lTVEVOQ1koZnJhbWUpOworICAgIGlmICghZnJhbWUtPmxpbmVzaXplWzBdKSB7CisgICAgICAgIHJldCA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKCZmcmFtZS0+bGluZXNpemVbMF0sIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcywgZnJhbWUtPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKHBsYW5lcyA+IEFWX05VTV9EQVRBX1BPSU5URVJTKSB7CisgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhID0gYXZfbWFsbG9jel9hcnJheShwbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmZyYW1lLT5leHRlbmRlZF9kYXRhKSk7CisgICAgICAgIGZyYW1lLT5leHRlbmRlZF9idWYgID0gYXZfbWFsbG9jel9hcnJheSgocGxhbmVzIC0gQVZfTlVNX0RBVEFfUE9JTlRFUlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpmcmFtZS0+ZXh0ZW5kZWRfYnVmKSk7CisgICAgICAgIGlmICghZnJhbWUtPmV4dGVuZGVkX2RhdGEgfHwgIWZyYW1lLT5leHRlbmRlZF9idWYpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZmcmFtZS0+ZXh0ZW5kZWRfZGF0YSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmZnJhbWUtPmV4dGVuZGVkX2J1Zik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGZyYW1lLT5uYl9leHRlbmRlZF9idWYgPSBwbGFuZXMgLSBBVl9OVU1fREFUQV9QT0lOVEVSUzsKKyAgICB9IGVsc2UKKyAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2RhdGEgPSBmcmFtZS0+ZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRk1JTihwbGFuZXMsIEFWX05VTV9EQVRBX1BPSU5URVJTKTsgaSsrKSB7CisgICAgICAgIGZyYW1lLT5idWZbaV0gPSBhdl9idWZmZXJfYWxsb2MoZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgaWYgKCFmcmFtZS0+YnVmW2ldKSB7CisgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhW2ldID0gZnJhbWUtPmRhdGFbaV0gPSBmcmFtZS0+YnVmW2ldLT5kYXRhOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzIC0gQVZfTlVNX0RBVEFfUE9JTlRFUlM7IGkrKykgeworICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfYnVmW2ldID0gYXZfYnVmZmVyX2FsbG9jKGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgICAgIGlmICghZnJhbWUtPmV4dGVuZGVkX2J1ZltpXSkgeworICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtpICsgQVZfTlVNX0RBVEFfUE9JTlRFUlNdID0gZnJhbWUtPmV4dGVuZGVkX2J1ZltpXS0+ZGF0YTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisKK30KKworaW50IGF2X2ZyYW1lX2dldF9idWZmZXIoQVZGcmFtZSAqZnJhbWUsIGludCBhbGlnbikKK3sKKyAgICBpZiAoZnJhbWUtPmZvcm1hdCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoZnJhbWUtPndpZHRoID4gMCAmJiBmcmFtZS0+aGVpZ2h0ID4gMCkKKyAgICAgICAgcmV0dXJuIGdldF92aWRlb19idWZmZXIoZnJhbWUsIGFsaWduKTsKKyAgICBlbHNlIGlmIChmcmFtZS0+bmJfc2FtcGxlcyA+IDAgJiYgKGZyYW1lLT5jaGFubmVsX2xheW91dCB8fCBmcmFtZS0+Y2hhbm5lbHMgPiAwKSkKKyAgICAgICAgcmV0dXJuIGdldF9hdWRpb19idWZmZXIoZnJhbWUsIGFsaWduKTsKKworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKK2ludCBhdl9mcmFtZV9yZWYoQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgaW50IGksIHJldCA9IDA7CisKKyAgICBkc3QtPmZvcm1hdCAgICAgICAgID0gc3JjLT5mb3JtYXQ7CisgICAgZHN0LT53aWR0aCAgICAgICAgICA9IHNyYy0+d2lkdGg7CisgICAgZHN0LT5oZWlnaHQgICAgICAgICA9IHNyYy0+aGVpZ2h0OworICAgIGRzdC0+Y2hhbm5lbHMgICAgICAgPSBzcmMtPmNoYW5uZWxzOworICAgIGRzdC0+Y2hhbm5lbF9sYXlvdXQgPSBzcmMtPmNoYW5uZWxfbGF5b3V0OworICAgIGRzdC0+bmJfc2FtcGxlcyAgICAgPSBzcmMtPm5iX3NhbXBsZXM7CisKKyAgICByZXQgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKGRzdCwgc3JjKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGR1cGxpY2F0ZSB0aGUgZnJhbWUgZGF0YSBpZiBpdCdzIG5vdCByZWZjb3VudGVkICovCisgICAgaWYgKCFzcmMtPmJ1ZlswXSkgeworICAgICAgICByZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKGRzdCwgMzIpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weShkc3QsIHNyYyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYoZHN0KTsKKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIHJlZiB0aGUgYnVmZmVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzcmMtPmJ1Zik7IGkrKykgeworICAgICAgICBpZiAoIXNyYy0+YnVmW2ldKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRzdC0+YnVmW2ldID0gYXZfYnVmZmVyX3JlZihzcmMtPmJ1ZltpXSk7CisgICAgICAgIGlmICghZHN0LT5idWZbaV0pIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzcmMtPmV4dGVuZGVkX2J1ZikgeworICAgICAgICBkc3QtPmV4dGVuZGVkX2J1ZiA9IGF2X21hbGxvY3pfYXJyYXkoc2l6ZW9mKCpkc3QtPmV4dGVuZGVkX2J1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPm5iX2V4dGVuZGVkX2J1Zik7CisgICAgICAgIGlmICghZHN0LT5leHRlbmRlZF9idWYpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBkc3QtPm5iX2V4dGVuZGVkX2J1ZiA9IHNyYy0+bmJfZXh0ZW5kZWRfYnVmOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcmMtPm5iX2V4dGVuZGVkX2J1ZjsgaSsrKSB7CisgICAgICAgICAgICBkc3QtPmV4dGVuZGVkX2J1ZltpXSA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5leHRlbmRlZF9idWZbaV0pOworICAgICAgICAgICAgaWYgKCFkc3QtPmV4dGVuZGVkX2J1ZltpXSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBkdXBsaWNhdGUgZXh0ZW5kZWQgZGF0YSAqLworICAgIGlmIChzcmMtPmV4dGVuZGVkX2RhdGEgIT0gc3JjLT5kYXRhKSB7CisgICAgICAgIGludCBjaCA9IHNyYy0+Y2hhbm5lbHM7CisKKyAgICAgICAgaWYgKCFjaCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIENIRUNLX0NIQU5ORUxTX0NPTlNJU1RFTkNZKHNyYyk7CisKKyAgICAgICAgZHN0LT5leHRlbmRlZF9kYXRhID0gYXZfbWFsbG9jX2FycmF5KHNpemVvZigqZHN0LT5leHRlbmRlZF9kYXRhKSwgY2gpOworICAgICAgICBpZiAoIWRzdC0+ZXh0ZW5kZWRfZGF0YSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIG1lbWNweShkc3QtPmV4dGVuZGVkX2RhdGEsIHNyYy0+ZXh0ZW5kZWRfZGF0YSwgc2l6ZW9mKCpzcmMtPmV4dGVuZGVkX2RhdGEpICogY2gpOworICAgIH0gZWxzZQorICAgICAgICBkc3QtPmV4dGVuZGVkX2RhdGEgPSBkc3QtPmRhdGE7CisKKyAgICBtZW1jcHkoZHN0LT5kYXRhLCAgICAgc3JjLT5kYXRhLCAgICAgc2l6ZW9mKHNyYy0+ZGF0YSkpOworICAgIG1lbWNweShkc3QtPmxpbmVzaXplLCBzcmMtPmxpbmVzaXplLCBzaXplb2Yoc3JjLT5saW5lc2l6ZSkpOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfZnJhbWVfdW5yZWYoZHN0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitBVkZyYW1lICphdl9mcmFtZV9jbG9uZShjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgQVZGcmFtZSAqcmV0ID0gYXZfZnJhbWVfYWxsb2MoKTsKKworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChhdl9mcmFtZV9yZWYocmV0LCBzcmMpIDwgMCkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXZfZnJhbWVfdW5yZWYoQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm5iX3NpZGVfZGF0YTsgaSsrKSB7CisgICAgICAgIGZyZWVfc2lkZV9kYXRhKCZmcmFtZS0+c2lkZV9kYXRhW2ldKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmZyYW1lLT5zaWRlX2RhdGEpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGZyYW1lLT5idWYpOyBpKyspCisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmZnJhbWUtPmJ1ZltpXSk7CisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5uYl9leHRlbmRlZF9idWY7IGkrKykKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZS0+ZXh0ZW5kZWRfYnVmW2ldKTsKKyAgICBhdl9mcmVlcCgmZnJhbWUtPmV4dGVuZGVkX2J1Zik7CisgICAgYXZfZGljdF9mcmVlKCZmcmFtZS0+bWV0YWRhdGEpOworICAgIGF2X2J1ZmZlcl91bnJlZigmZnJhbWUtPnFwX3RhYmxlX2J1Zik7CisKKyAgICBnZXRfZnJhbWVfZGVmYXVsdHMoZnJhbWUpOworfQorCit2b2lkIGF2X2ZyYW1lX21vdmVfcmVmKEFWRnJhbWUgKmRzdCwgQVZGcmFtZSAqc3JjKQoreworICAgICpkc3QgPSAqc3JjOworICAgIGlmIChzcmMtPmV4dGVuZGVkX2RhdGEgPT0gc3JjLT5kYXRhKQorICAgICAgICBkc3QtPmV4dGVuZGVkX2RhdGEgPSBkc3QtPmRhdGE7CisgICAgbWVtc2V0KHNyYywgMCwgc2l6ZW9mKCpzcmMpKTsKKyAgICBnZXRfZnJhbWVfZGVmYXVsdHMoc3JjKTsKK30KKworaW50IGF2X2ZyYW1lX2lzX3dyaXRhYmxlKEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCBpLCByZXQgPSAxOworCisgICAgLyogYXNzdW1lIG5vbi1yZWZjb3VudGVkIGZyYW1lcyBhcmUgbm90IHdyaXRhYmxlICovCisgICAgaWYgKCFmcmFtZS0+YnVmWzBdKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhmcmFtZS0+YnVmKTsgaSsrKQorICAgICAgICBpZiAoZnJhbWUtPmJ1ZltpXSkKKyAgICAgICAgICAgIHJldCAmPSAhIWF2X2J1ZmZlcl9pc193cml0YWJsZShmcmFtZS0+YnVmW2ldKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm5iX2V4dGVuZGVkX2J1ZjsgaSsrKQorICAgICAgICByZXQgJj0gISFhdl9idWZmZXJfaXNfd3JpdGFibGUoZnJhbWUtPmV4dGVuZGVkX2J1ZltpXSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZfZnJhbWVfbWFrZV93cml0YWJsZShBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZyYW1lIHRtcDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFmcmFtZS0+YnVmWzBdKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGZyYW1lKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworICAgIHRtcC5mb3JtYXQgICAgICAgICA9IGZyYW1lLT5mb3JtYXQ7CisgICAgdG1wLndpZHRoICAgICAgICAgID0gZnJhbWUtPndpZHRoOworICAgIHRtcC5oZWlnaHQgICAgICAgICA9IGZyYW1lLT5oZWlnaHQ7CisgICAgdG1wLmNoYW5uZWxzICAgICAgID0gZnJhbWUtPmNoYW5uZWxzOworICAgIHRtcC5jaGFubmVsX2xheW91dCA9IGZyYW1lLT5jaGFubmVsX2xheW91dDsKKyAgICB0bXAubmJfc2FtcGxlcyAgICAgPSBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICByZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKCZ0bXAsIDMyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGF2X2ZyYW1lX2NvcHkoJnRtcCwgZnJhbWUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyYW1lX3VucmVmKCZ0bXApOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMoJnRtcCwgZnJhbWUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyYW1lX3VucmVmKCZ0bXApOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKKworICAgICpmcmFtZSA9IHRtcDsKKyAgICBpZiAodG1wLmRhdGEgPT0gdG1wLmV4dGVuZGVkX2RhdGEpCisgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhID0gZnJhbWUtPmRhdGE7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X2ZyYW1lX2NvcHlfcHJvcHMoQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgaW50IGk7CisKKyAgICBkc3QtPmtleV9mcmFtZSAgICAgICAgICAgICAgPSBzcmMtPmtleV9mcmFtZTsKKyAgICBkc3QtPnBpY3RfdHlwZSAgICAgICAgICAgICAgPSBzcmMtPnBpY3RfdHlwZTsKKyAgICBkc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gICAgPSBzcmMtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgZHN0LT5wdHMgICAgICAgICAgICAgICAgICAgID0gc3JjLT5wdHM7CisgICAgZHN0LT5yZXBlYXRfcGljdCAgICAgICAgICAgID0gc3JjLT5yZXBlYXRfcGljdDsKKyAgICBkc3QtPmludGVybGFjZWRfZnJhbWUgICAgICAgPSBzcmMtPmludGVybGFjZWRfZnJhbWU7CisgICAgZHN0LT50b3BfZmllbGRfZmlyc3QgICAgICAgID0gc3JjLT50b3BfZmllbGRfZmlyc3Q7CisgICAgZHN0LT5wYWxldHRlX2hhc19jaGFuZ2VkICAgID0gc3JjLT5wYWxldHRlX2hhc19jaGFuZ2VkOworICAgIGRzdC0+c2FtcGxlX3JhdGUgICAgICAgICAgICA9IHNyYy0+c2FtcGxlX3JhdGU7CisgICAgZHN0LT5vcGFxdWUgICAgICAgICAgICAgICAgID0gc3JjLT5vcGFxdWU7CisjaWYgRkZfQVBJX0FWRlJBTUVfTEFWQworICAgIGRzdC0+dHlwZSAgICAgICAgICAgICAgICAgICA9IHNyYy0+dHlwZTsKKyNlbmRpZgorICAgIGRzdC0+cGt0X3B0cyAgICAgICAgICAgICAgICA9IHNyYy0+cGt0X3B0czsKKyAgICBkc3QtPnBrdF9kdHMgICAgICAgICAgICAgICAgPSBzcmMtPnBrdF9kdHM7CisgICAgZHN0LT5wa3RfcG9zICAgICAgICAgICAgICAgID0gc3JjLT5wa3RfcG9zOworICAgIGRzdC0+cGt0X3NpemUgICAgICAgICAgICAgICA9IHNyYy0+cGt0X3NpemU7CisgICAgZHN0LT5wa3RfZHVyYXRpb24gICAgICAgICAgID0gc3JjLT5wa3RfZHVyYXRpb247CisgICAgZHN0LT5yZW9yZGVyZWRfb3BhcXVlICAgICAgID0gc3JjLT5yZW9yZGVyZWRfb3BhcXVlOworICAgIGRzdC0+cXVhbGl0eSAgICAgICAgICAgICAgICA9IHNyYy0+cXVhbGl0eTsKKyAgICBkc3QtPmJlc3RfZWZmb3J0X3RpbWVzdGFtcCAgPSBzcmMtPmJlc3RfZWZmb3J0X3RpbWVzdGFtcDsKKyAgICBkc3QtPmNvZGVkX3BpY3R1cmVfbnVtYmVyICAgPSBzcmMtPmNvZGVkX3BpY3R1cmVfbnVtYmVyOworICAgIGRzdC0+ZGlzcGxheV9waWN0dXJlX251bWJlciA9IHNyYy0+ZGlzcGxheV9waWN0dXJlX251bWJlcjsKKyAgICBkc3QtPmZsYWdzICAgICAgICAgICAgICAgICAgPSBzcmMtPmZsYWdzOworICAgIGRzdC0+ZGVjb2RlX2Vycm9yX2ZsYWdzICAgICA9IHNyYy0+ZGVjb2RlX2Vycm9yX2ZsYWdzOworICAgIGRzdC0+Y29sb3JfcHJpbWFyaWVzICAgICAgICA9IHNyYy0+Y29sb3JfcHJpbWFyaWVzOworICAgIGRzdC0+Y29sb3JfdHJjICAgICAgICAgICAgICA9IHNyYy0+Y29sb3JfdHJjOworICAgIGRzdC0+Y29sb3JzcGFjZSAgICAgICAgICAgICA9IHNyYy0+Y29sb3JzcGFjZTsKKyAgICBkc3QtPmNvbG9yX3JhbmdlICAgICAgICAgICAgPSBzcmMtPmNvbG9yX3JhbmdlOworICAgIGRzdC0+Y2hyb21hX2xvY2F0aW9uICAgICAgICA9IHNyYy0+Y2hyb21hX2xvY2F0aW9uOworCisgICAgYXZfZGljdF9jb3B5KCZkc3QtPm1ldGFkYXRhLCBzcmMtPm1ldGFkYXRhLCAwKTsKKworICAgIG1lbWNweShkc3QtPmVycm9yLCBzcmMtPmVycm9yLCBzaXplb2YoZHN0LT5lcnJvcikpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNyYy0+bmJfc2lkZV9kYXRhOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVZGcmFtZVNpZGVEYXRhICpzZF9zcmMgPSBzcmMtPnNpZGVfZGF0YVtpXTsKKyAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZF9kc3Q7CisgICAgICAgIGlmICggICBzZF9zcmMtPnR5cGUgPT0gQVZfRlJBTUVfREFUQV9QQU5TQ0FOCisgICAgICAgICAgICAmJiAoc3JjLT53aWR0aCAhPSBkc3QtPndpZHRoIHx8IHNyYy0+aGVpZ2h0ICE9IGRzdC0+aGVpZ2h0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBzZF9kc3QgPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKGRzdCwgc2Rfc3JjLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Rfc3JjLT5zaXplKTsKKyAgICAgICAgaWYgKCFzZF9kc3QpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkc3QtPm5iX3NpZGVfZGF0YTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZnJlZV9zaWRlX2RhdGEoJmRzdC0+c2lkZV9kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyZWVwKCZkc3QtPnNpZGVfZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIG1lbWNweShzZF9kc3QtPmRhdGEsIHNkX3NyYy0+ZGF0YSwgc2Rfc3JjLT5zaXplKTsKKyAgICAgICAgYXZfZGljdF9jb3B5KCZzZF9kc3QtPm1ldGFkYXRhLCBzZF9zcmMtPm1ldGFkYXRhLCAwKTsKKyAgICB9CisKKyAgICBkc3QtPnFzY2FsZV90YWJsZSA9IE5VTEw7CisgICAgZHN0LT5xc3RyaWRlICAgICAgPSAwOworICAgIGRzdC0+cXNjYWxlX3R5cGUgID0gMDsKKyAgICBpZiAoc3JjLT5xcF90YWJsZV9idWYpIHsKKyAgICAgICAgZHN0LT5xcF90YWJsZV9idWYgPSBhdl9idWZmZXJfcmVmKHNyYy0+cXBfdGFibGVfYnVmKTsKKyAgICAgICAgaWYgKGRzdC0+cXBfdGFibGVfYnVmKSB7CisgICAgICAgICAgICBkc3QtPnFzY2FsZV90YWJsZSA9IGRzdC0+cXBfdGFibGVfYnVmLT5kYXRhOworICAgICAgICAgICAgZHN0LT5xc3RyaWRlICAgICAgPSBzcmMtPnFzdHJpZGU7CisgICAgICAgICAgICBkc3QtPnFzY2FsZV90eXBlICA9IHNyYy0+cXNjYWxlX3R5cGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworQVZCdWZmZXJSZWYgKmF2X2ZyYW1lX2dldF9wbGFuZV9idWZmZXIoQVZGcmFtZSAqZnJhbWUsIGludCBwbGFuZSkKK3sKKyAgICB1aW50OF90ICpkYXRhOworICAgIGludCBwbGFuZXMsIGk7CisKKyAgICBpZiAoZnJhbWUtPm5iX3NhbXBsZXMpIHsKKyAgICAgICAgaW50IGNoYW5uZWxzID0gZnJhbWUtPmNoYW5uZWxzOworICAgICAgICBpZiAoIWNoYW5uZWxzKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIENIRUNLX0NIQU5ORUxTX0NPTlNJU1RFTkNZKGZyYW1lKTsKKyAgICAgICAgcGxhbmVzID0gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoZnJhbWUtPmZvcm1hdCkgPyBjaGFubmVscyA6IDE7CisgICAgfSBlbHNlCisgICAgICAgIHBsYW5lcyA9IDQ7CisKKyAgICBpZiAocGxhbmUgPCAwIHx8IHBsYW5lID49IHBsYW5lcyB8fCAhZnJhbWUtPmV4dGVuZGVkX2RhdGFbcGxhbmVdKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gZnJhbWUtPmV4dGVuZGVkX2RhdGFbcGxhbmVdOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGZyYW1lLT5idWYpICYmIGZyYW1lLT5idWZbaV07IGkrKykgeworICAgICAgICBBVkJ1ZmZlclJlZiAqYnVmID0gZnJhbWUtPmJ1ZltpXTsKKyAgICAgICAgaWYgKGRhdGEgPj0gYnVmLT5kYXRhICYmIGRhdGEgPCBidWYtPmRhdGEgKyBidWYtPnNpemUpCisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm5iX2V4dGVuZGVkX2J1ZjsgaSsrKSB7CisgICAgICAgIEFWQnVmZmVyUmVmICpidWYgPSBmcmFtZS0+ZXh0ZW5kZWRfYnVmW2ldOworICAgICAgICBpZiAoZGF0YSA+PSBidWYtPmRhdGEgJiYgZGF0YSA8IGJ1Zi0+ZGF0YSArIGJ1Zi0+c2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitBVkZyYW1lU2lkZURhdGEgKmF2X2ZyYW1lX25ld19zaWRlX2RhdGEoQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkZyYW1lU2lkZURhdGFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCit7CisgICAgQVZGcmFtZVNpZGVEYXRhICpyZXQsICoqdG1wOworCisgICAgaWYgKGZyYW1lLT5uYl9zaWRlX2RhdGEgPiBJTlRfTUFYIC8gc2l6ZW9mKCpmcmFtZS0+c2lkZV9kYXRhKSAtIDEpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgdG1wID0gYXZfcmVhbGxvYyhmcmFtZS0+c2lkZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgKGZyYW1lLT5uYl9zaWRlX2RhdGEgKyAxKSAqIHNpemVvZigqZnJhbWUtPnNpZGVfZGF0YSkpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcmFtZS0+c2lkZV9kYXRhID0gdG1wOworCisgICAgcmV0ID0gYXZfbWFsbG9jeihzaXplb2YoKnJldCkpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldC0+ZGF0YSA9IGF2X21hbGxvYyhzaXplKTsKKyAgICBpZiAoIXJldC0+ZGF0YSkgeworICAgICAgICBhdl9mcmVlcCgmcmV0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0LT5zaXplID0gc2l6ZTsKKyAgICByZXQtPnR5cGUgPSB0eXBlOworCisgICAgZnJhbWUtPnNpZGVfZGF0YVtmcmFtZS0+bmJfc2lkZV9kYXRhKytdID0gcmV0OworCisgICAgcmV0dXJuIHJldDsKK30KKworQVZGcmFtZVNpZGVEYXRhICphdl9mcmFtZV9nZXRfc2lkZV9kYXRhKGNvbnN0IEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZGcmFtZVNpZGVEYXRhVHlwZSB0eXBlKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5uYl9zaWRlX2RhdGE7IGkrKykgeworICAgICAgICBpZiAoZnJhbWUtPnNpZGVfZGF0YVtpXS0+dHlwZSA9PSB0eXBlKQorICAgICAgICAgICAgcmV0dXJuIGZyYW1lLT5zaWRlX2RhdGFbaV07CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGZyYW1lX2NvcHlfdmlkZW8oQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgY29uc3QgdWludDhfdCAqc3JjX2RhdGFbNF07CisgICAgaW50IGksIHBsYW5lczsKKworICAgIGlmIChkc3QtPndpZHRoICA8IHNyYy0+d2lkdGggfHwKKyAgICAgICAgZHN0LT5oZWlnaHQgPCBzcmMtPmhlaWdodCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHBsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGRzdC0+Zm9ybWF0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspCisgICAgICAgIGlmICghZHN0LT5kYXRhW2ldIHx8ICFzcmMtPmRhdGFbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgbWVtY3B5KHNyY19kYXRhLCBzcmMtPmRhdGEsIHNpemVvZihzcmNfZGF0YSkpOworICAgIGF2X2ltYWdlX2NvcHkoZHN0LT5kYXRhLCBkc3QtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgc3JjX2RhdGEsIHNyYy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICBkc3QtPmZvcm1hdCwgc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnJhbWVfY29weV9hdWRpbyhBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYykKK3sKKyAgICBpbnQgcGxhbmFyICAgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihkc3QtPmZvcm1hdCk7CisgICAgaW50IGNoYW5uZWxzID0gZHN0LT5jaGFubmVsczsKKyAgICBpbnQgcGxhbmVzICAgPSBwbGFuYXIgPyBjaGFubmVscyA6IDE7CisgICAgaW50IGk7CisKKyAgICBpZiAoZHN0LT5uYl9zYW1wbGVzICAgICAhPSBzcmMtPm5iX3NhbXBsZXMgfHwKKyAgICAgICAgZHN0LT5jaGFubmVscyAgICAgICAhPSBzcmMtPmNoYW5uZWxzIHx8CisgICAgICAgIGRzdC0+Y2hhbm5lbF9sYXlvdXQgIT0gc3JjLT5jaGFubmVsX2xheW91dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIENIRUNLX0NIQU5ORUxTX0NPTlNJU1RFTkNZKHNyYyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspCisgICAgICAgIGlmICghZHN0LT5leHRlbmRlZF9kYXRhW2ldIHx8ICFzcmMtPmV4dGVuZGVkX2RhdGFbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgYXZfc2FtcGxlc19jb3B5KGRzdC0+ZXh0ZW5kZWRfZGF0YSwgc3JjLT5leHRlbmRlZF9kYXRhLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICBkc3QtPm5iX3NhbXBsZXMsIGNoYW5uZWxzLCBkc3QtPmZvcm1hdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X2ZyYW1lX2NvcHkoQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgaWYgKGRzdC0+Zm9ybWF0ICE9IHNyYy0+Zm9ybWF0IHx8IGRzdC0+Zm9ybWF0IDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmIChkc3QtPndpZHRoID4gMCAmJiBkc3QtPmhlaWdodCA+IDApCisgICAgICAgIHJldHVybiBmcmFtZV9jb3B5X3ZpZGVvKGRzdCwgc3JjKTsKKyAgICBlbHNlIGlmIChkc3QtPm5iX3NhbXBsZXMgPiAwICYmIGRzdC0+Y2hhbm5lbF9sYXlvdXQpCisgICAgICAgIHJldHVybiBmcmFtZV9jb3B5X2F1ZGlvKGRzdCwgc3JjKTsKKworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKK3ZvaWQgYXZfZnJhbWVfcmVtb3ZlX3NpZGVfZGF0YShBVkZyYW1lICpmcmFtZSwgZW51bSBBVkZyYW1lU2lkZURhdGFUeXBlIHR5cGUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm5iX3NpZGVfZGF0YTsgaSsrKSB7CisgICAgICAgIEFWRnJhbWVTaWRlRGF0YSAqc2QgPSBmcmFtZS0+c2lkZV9kYXRhW2ldOworICAgICAgICBpZiAoc2QtPnR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgZnJlZV9zaWRlX2RhdGEoJmZyYW1lLT5zaWRlX2RhdGFbaV0pOworICAgICAgICAgICAgZnJhbWUtPnNpZGVfZGF0YVtpXSA9IGZyYW1lLT5zaWRlX2RhdGFbZnJhbWUtPm5iX3NpZGVfZGF0YSAtIDFdOworICAgICAgICAgICAgZnJhbWUtPm5iX3NpZGVfZGF0YS0tOworICAgICAgICB9CisgICAgfQorfQorCitjb25zdCBjaGFyICphdl9mcmFtZV9zaWRlX2RhdGFfbmFtZShlbnVtIEFWRnJhbWVTaWRlRGF0YVR5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgQVZfRlJBTUVfREFUQV9QQU5TQ0FOOiAgICAgICAgIHJldHVybiAiQVZQYW5TY2FuIjsKKyAgICBjYXNlIEFWX0ZSQU1FX0RBVEFfQTUzX0NDOiAgICAgICAgICByZXR1cm4gIkFUU0MgQTUzIFBhcnQgNCBDbG9zZWQgQ2FwdGlvbnMiOworICAgIGNhc2UgQVZfRlJBTUVfREFUQV9TVEVSRU8zRDogICAgICAgIHJldHVybiAiU3RlcmVvc2NvcGljIDNkIG1ldGFkYXRhIjsKKyAgICBjYXNlIEFWX0ZSQU1FX0RBVEFfTUFUUklYRU5DT0RJTkc6ICByZXR1cm4gIkFWTWF0cml4RW5jb2RpbmciOworICAgIGNhc2UgQVZfRlJBTUVfREFUQV9ET1dOTUlYX0lORk86ICAgIHJldHVybiAiTWV0YWRhdGEgcmVsZXZhbnQgdG8gYSBkb3dubWl4IHByb2NlZHVyZSI7CisgICAgY2FzZSBBVl9GUkFNRV9EQVRBX1JFUExBWUdBSU46ICAgICAgcmV0dXJuICJBVlJlcGxheUdhaW4iOworICAgIGNhc2UgQVZfRlJBTUVfREFUQV9ESVNQTEFZTUFUUklYOiAgIHJldHVybiAiM3gzIGRpc3BsYXltYXRyaXgiOworICAgIGNhc2UgQVZfRlJBTUVfREFUQV9NT1RJT05fVkVDVE9SUzogIHJldHVybiAiTW90aW9uIHZlY3RvcnMiOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvZnJhbWUuaCBiL2ZmbXBlZy9saWJhdnV0aWwvZnJhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzM1YmVlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9mcmFtZS5oCkBAIC0wLDAgKzEsNzcxIEBACisvKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAaW5ncm91cCBsYXZ1X2ZyYW1lCisgKiByZWZlcmVuY2UtY291bnRlZCBmcmFtZSBBUEkKKyAqLworCisjaWZuZGVmIEFWVVRJTF9GUkFNRV9ICisjZGVmaW5lIEFWVVRJTF9GUkFNRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF2dXRpbC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImRpY3QuaCIKKyNpbmNsdWRlICJyYXRpb25hbC5oIgorI2luY2x1ZGUgInNhbXBsZWZtdC5oIgorI2luY2x1ZGUgInBpeGZtdC5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworCisvKioKKyAqIEBkZWZncm91cCBsYXZ1X2ZyYW1lIEFWRnJhbWUKKyAqIEBpbmdyb3VwIGxhdnVfZGF0YQorICoKKyAqIEB7CisgKiBBVkZyYW1lIGlzIGFuIGFic3RyYWN0aW9uIGZvciByZWZlcmVuY2UtY291bnRlZCByYXcgbXVsdGltZWRpYSBkYXRhLgorICovCisKK2VudW0gQVZGcmFtZVNpZGVEYXRhVHlwZSB7CisgICAgLyoqCisgICAgICogVGhlIGRhdGEgaXMgdGhlIEFWUGFuU2NhbiBzdHJ1Y3QgZGVmaW5lZCBpbiBsaWJhdmNvZGVjLgorICAgICAqLworICAgIEFWX0ZSQU1FX0RBVEFfUEFOU0NBTiwKKyAgICAvKioKKyAgICAgKiBBVFNDIEE1MyBQYXJ0IDQgQ2xvc2VkIENhcHRpb25zLgorICAgICAqIEE1MyBDQyBiaXRzdHJlYW0gaXMgc3RvcmVkIGFzIHVpbnQ4X3QgaW4gQVZGcmFtZVNpZGVEYXRhLmRhdGEuCisgICAgICogVGhlIG51bWJlciBvZiBieXRlcyBvZiBDQyBkYXRhIGlzIEFWRnJhbWVTaWRlRGF0YS5zaXplLgorICAgICAqLworICAgIEFWX0ZSQU1FX0RBVEFfQTUzX0NDLAorICAgIC8qKgorICAgICAqIFN0ZXJlb3Njb3BpYyAzZCBtZXRhZGF0YS4KKyAgICAgKiBUaGUgZGF0YSBpcyB0aGUgQVZTdGVyZW8zRCBzdHJ1Y3QgZGVmaW5lZCBpbiBsaWJhdnV0aWwvc3RlcmVvM2QuaC4KKyAgICAgKi8KKyAgICBBVl9GUkFNRV9EQVRBX1NURVJFTzNELAorICAgIC8qKgorICAgICAqIFRoZSBkYXRhIGlzIHRoZSBBVk1hdHJpeEVuY29kaW5nIGVudW0gZGVmaW5lZCBpbiBsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaC4KKyAgICAgKi8KKyAgICBBVl9GUkFNRV9EQVRBX01BVFJJWEVOQ09ESU5HLAorICAgIC8qKgorICAgICAqIE1ldGFkYXRhIHJlbGV2YW50IHRvIGEgZG93bm1peCBwcm9jZWR1cmUuCisgICAgICogVGhlIGRhdGEgaXMgdGhlIEFWRG93bm1peEluZm8gc3RydWN0IGRlZmluZWQgaW4gbGliYXZ1dGlsL2Rvd25taXhfaW5mby5oLgorICAgICAqLworICAgIEFWX0ZSQU1FX0RBVEFfRE9XTk1JWF9JTkZPLAorICAgIC8qKgorICAgICAqIFJlcGxheUdhaW4gaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgdGhlIEFWUmVwbGF5R2FpbiBzdHJ1Y3QuCisgICAgICovCisgICAgQVZfRlJBTUVfREFUQV9SRVBMQVlHQUlOLAorICAgIC8qKgorICAgICAqIFRoaXMgc2lkZSBkYXRhIGNvbnRhaW5zIGEgM3gzIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBkZXNjcmliaW5nIGFuIGFmZmluZQorICAgICAqIHRyYW5zZm9ybWF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgYXBwbGllZCB0byB0aGUgZnJhbWUgZm9yIGNvcnJlY3QKKyAgICAgKiBwcmVzZW50YXRpb24uCisgICAgICoKKyAgICAgKiBTZWUgbGliYXZ1dGlsL2Rpc3BsYXkuaCBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YS4KKyAgICAgKi8KKyAgICBBVl9GUkFNRV9EQVRBX0RJU1BMQVlNQVRSSVgsCisgICAgLyoqCisgICAgICogQWN0aXZlIEZvcm1hdCBEZXNjcmlwdGlvbiBkYXRhIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgYnl0ZSBhcyBzcGVjaWZpZWQKKyAgICAgKiBpbiBFVFNJIFRTIDEwMSAxNTQgdXNpbmcgQVZBY3RpdmVGb3JtYXREZXNjcmlwdGlvbiBlbnVtLgorICAgICAqLworICAgIEFWX0ZSQU1FX0RBVEFfQUZELAorICAgIC8qKgorICAgICAqIE1vdGlvbiB2ZWN0b3JzIGV4cG9ydGVkIGJ5IHNvbWUgY29kZWNzIChvbiBkZW1hbmQgdGhyb3VnaCB0aGUgZXhwb3J0X212cworICAgICAqIGZsYWcgc2V0IGluIHRoZSBsaWJhdmNvZGVjIEFWQ29kZWNDb250ZXh0IGZsYWdzMiBvcHRpb24pLgorICAgICAqIFRoZSBkYXRhIGlzIHRoZSBBVk1vdGlvblZlY3RvciBzdHJ1Y3QgZGVmaW5lZCBpbgorICAgICAqIGxpYmF2dXRpbC9tb3Rpb25fdmVjdG9yLmguCisgICAgICovCisgICAgQVZfRlJBTUVfREFUQV9NT1RJT05fVkVDVE9SUywKKyAgICAvKioKKyAgICAgKiBSZWNvbW1tZW5kcyBza2lwcGluZyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzYW1wbGVzLiBUaGlzIGlzIGV4cG9ydGVkCisgICAgICogb25seSBpZiB0aGUgInNraXBfbWFudWFsIiBBVk9wdGlvbiBpcyBzZXQgaW4gbGliYXZjb2RlYy4KKyAgICAgKiBUaGlzIGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgQVZfUEtUX0RBVEFfU0tJUF9TQU1QTEVTLgorICAgICAqIEBjb2RlCisgICAgICogdTMybGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gc2tpcCBmcm9tIHN0YXJ0IG9mIHRoaXMgcGFja2V0CisgICAgICogdTMybGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gc2tpcCBmcm9tIGVuZCBvZiB0aGlzIHBhY2tldAorICAgICAqIHU4ICAgIHJlYXNvbiBmb3Igc3RhcnQgc2tpcAorICAgICAqIHU4ICAgIHJlYXNvbiBmb3IgZW5kICAgc2tpcCAoMD1wYWRkaW5nIHNpbGVuY2UsIDE9Y29udmVyZ2VuY2UpCisgICAgICogQGVuZGNvZGUKKyAgICAgKi8KKyAgICBBVl9GUkFNRV9EQVRBX1NLSVBfU0FNUExFUywKK307CisKK2VudW0gQVZBY3RpdmVGb3JtYXREZXNjcmlwdGlvbiB7CisgICAgQVZfQUZEX1NBTUUgICAgICAgICA9IDgsCisgICAgQVZfQUZEXzRfMyAgICAgICAgICA9IDksCisgICAgQVZfQUZEXzE2XzkgICAgICAgICA9IDEwLAorICAgIEFWX0FGRF8xNF85ICAgICAgICAgPSAxMSwKKyAgICBBVl9BRkRfNF8zX1NQXzE0XzkgID0gMTMsCisgICAgQVZfQUZEXzE2XzlfU1BfMTRfOSA9IDE0LAorICAgIEFWX0FGRF9TUF80XzMgICAgICAgPSAxNSwKK307CisKK3R5cGVkZWYgc3RydWN0IEFWRnJhbWVTaWRlRGF0YSB7CisgICAgZW51bSBBVkZyYW1lU2lkZURhdGFUeXBlIHR5cGU7CisgICAgdWludDhfdCAqZGF0YTsKKyAgICBpbnQgICAgICBzaXplOworICAgIEFWRGljdGlvbmFyeSAqbWV0YWRhdGE7Cit9IEFWRnJhbWVTaWRlRGF0YTsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgZGVjb2RlZCAocmF3KSBhdWRpbyBvciB2aWRlbyBkYXRhLgorICoKKyAqIEFWRnJhbWUgbXVzdCBiZSBhbGxvY2F0ZWQgdXNpbmcgYXZfZnJhbWVfYWxsb2MoKS4gTm90ZSB0aGF0IHRoaXMgb25seQorICogYWxsb2NhdGVzIHRoZSBBVkZyYW1lIGl0c2VsZiwgdGhlIGJ1ZmZlcnMgZm9yIHRoZSBkYXRhIG11c3QgYmUgbWFuYWdlZAorICogdGhyb3VnaCBvdGhlciBtZWFucyAoc2VlIGJlbG93KS4KKyAqIEFWRnJhbWUgbXVzdCBiZSBmcmVlZCB3aXRoIGF2X2ZyYW1lX2ZyZWUoKS4KKyAqCisgKiBBVkZyYW1lIGlzIHR5cGljYWxseSBhbGxvY2F0ZWQgb25jZSBhbmQgdGhlbiByZXVzZWQgbXVsdGlwbGUgdGltZXMgdG8gaG9sZAorICogZGlmZmVyZW50IGRhdGEgKGUuZy4gYSBzaW5nbGUgQVZGcmFtZSB0byBob2xkIGZyYW1lcyByZWNlaXZlZCBmcm9tIGEKKyAqIGRlY29kZXIpLiBJbiBzdWNoIGEgY2FzZSwgYXZfZnJhbWVfdW5yZWYoKSB3aWxsIGZyZWUgYW55IHJlZmVyZW5jZXMgaGVsZCBieQorICogdGhlIGZyYW1lIGFuZCByZXNldCBpdCB0byBpdHMgb3JpZ2luYWwgY2xlYW4gc3RhdGUgYmVmb3JlIGl0CisgKiBpcyByZXVzZWQgYWdhaW4uCisgKgorICogVGhlIGRhdGEgZGVzY3JpYmVkIGJ5IGFuIEFWRnJhbWUgaXMgdXN1YWxseSByZWZlcmVuY2UgY291bnRlZCB0aHJvdWdoIHRoZQorICogQVZCdWZmZXIgQVBJLiBUaGUgdW5kZXJseWluZyBidWZmZXIgcmVmZXJlbmNlcyBhcmUgc3RvcmVkIGluIEFWRnJhbWUuYnVmIC8KKyAqIEFWRnJhbWUuZXh0ZW5kZWRfYnVmLiBBbiBBVkZyYW1lIGlzIGNvbnNpZGVyZWQgdG8gYmUgcmVmZXJlbmNlIGNvdW50ZWQgaWYgYXQKKyAqIGxlYXN0IG9uZSByZWZlcmVuY2UgaXMgc2V0LCBpLmUuIGlmIEFWRnJhbWUuYnVmWzBdICE9IE5VTEwuIEluIHN1Y2ggYSBjYXNlLAorICogZXZlcnkgc2luZ2xlIGRhdGEgcGxhbmUgbXVzdCBiZSBjb250YWluZWQgaW4gb25lIG9mIHRoZSBidWZmZXJzIGluCisgKiBBVkZyYW1lLmJ1ZiBvciBBVkZyYW1lLmV4dGVuZGVkX2J1Zi4KKyAqIFRoZXJlIG1heSBiZSBhIHNpbmdsZSBidWZmZXIgZm9yIGFsbCB0aGUgZGF0YSwgb3Igb25lIHNlcGFyYXRlIGJ1ZmZlciBmb3IKKyAqIGVhY2ggcGxhbmUsIG9yIGFueXRoaW5nIGluIGJldHdlZW4uCisgKgorICogc2l6ZW9mKEFWRnJhbWUpIGlzIG5vdCBhIHBhcnQgb2YgdGhlIHB1YmxpYyBBQkksIHNvIG5ldyBmaWVsZHMgbWF5IGJlIGFkZGVkCisgKiB0byB0aGUgZW5kIHdpdGggYSBtaW5vciBidW1wLgorICogU2ltaWxhcmx5IGZpZWxkcyB0aGF0IGFyZSBtYXJrZWQgYXMgdG8gYmUgb25seSBhY2Nlc3NlZCBieQorICogYXZfb3B0X3B0cigpIGNhbiBiZSByZW9yZGVyZWQuIFRoaXMgYWxsb3dzIDIgZm9ya3MgdG8gYWRkIGZpZWxkcworICogd2l0aG91dCBicmVha2luZyBjb21wYXRpYmlsaXR5IHdpdGggZWFjaCBvdGhlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZGcmFtZSB7CisjZGVmaW5lIEFWX05VTV9EQVRBX1BPSU5URVJTIDgKKyAgICAvKioKKyAgICAgKiBwb2ludGVyIHRvIHRoZSBwaWN0dXJlL2NoYW5uZWwgcGxhbmVzLgorICAgICAqIFRoaXMgbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gdGhlIGZpcnN0IGFsbG9jYXRlZCBieXRlCisgICAgICoKKyAgICAgKiBTb21lIGRlY29kZXJzIGFjY2VzcyBhcmVhcyBvdXRzaWRlIDAsMCAtIHdpZHRoLGhlaWdodCwgcGxlYXNlCisgICAgICogc2VlIGF2Y29kZWNfYWxpZ25fZGltZW5zaW9uczIoKS4gU29tZSBmaWx0ZXJzIGFuZCBzd3NjYWxlIGNhbiByZWFkCisgICAgICogdXAgdG8gMTYgYnl0ZXMgYmV5b25kIHRoZSBwbGFuZXMsIGlmIHRoZXNlIGZpbHRlcnMgYXJlIHRvIGJlIHVzZWQsCisgICAgICogdGhlbiAxNiBleHRyYSBieXRlcyBtdXN0IGJlIGFsbG9jYXRlZC4KKyAgICAgKi8KKyAgICB1aW50OF90ICpkYXRhW0FWX05VTV9EQVRBX1BPSU5URVJTXTsKKworICAgIC8qKgorICAgICAqIEZvciB2aWRlbywgc2l6ZSBpbiBieXRlcyBvZiBlYWNoIHBpY3R1cmUgbGluZS4KKyAgICAgKiBGb3IgYXVkaW8sIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBwbGFuZS4KKyAgICAgKgorICAgICAqIEZvciBhdWRpbywgb25seSBsaW5lc2l6ZVswXSBtYXkgYmUgc2V0LiBGb3IgcGxhbmFyIGF1ZGlvLCBlYWNoIGNoYW5uZWwKKyAgICAgKiBwbGFuZSBtdXN0IGJlIHRoZSBzYW1lIHNpemUuCisgICAgICoKKyAgICAgKiBGb3IgdmlkZW8gdGhlIGxpbmVzaXplcyBzaG91bGQgYmUgbXVsdGlwbGVzIG9mIHRoZSBDUFVzIGFsaWdubWVudAorICAgICAqIHByZWZlcmVuY2UsIHRoaXMgaXMgMTYgb3IgMzIgZm9yIG1vZGVybiBkZXNrdG9wIENQVXMuCisgICAgICogU29tZSBjb2RlIHJlcXVpcmVzIHN1Y2ggYWxpZ25tZW50IG90aGVyIGNvZGUgY2FuIGJlIHNsb3dlciB3aXRob3V0CisgICAgICogY29ycmVjdCBhbGlnbm1lbnQsIGZvciB5ZXQgb3RoZXIgaXQgbWFrZXMgbm8gZGlmZmVyZW5jZS4KKyAgICAgKgorICAgICAqIEBub3RlIFRoZSBsaW5lc2l6ZSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdXNhYmxlIGRhdGEgLS0gdGhlcmUKKyAgICAgKiBtYXkgYmUgZXh0cmEgcGFkZGluZyBwcmVzZW50IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorICAgICAqLworICAgIGludCBsaW5lc2l6ZVtBVl9OVU1fREFUQV9QT0lOVEVSU107CisKKyAgICAvKioKKyAgICAgKiBwb2ludGVycyB0byB0aGUgZGF0YSBwbGFuZXMvY2hhbm5lbHMuCisgICAgICoKKyAgICAgKiBGb3IgdmlkZW8sIHRoaXMgc2hvdWxkIHNpbXBseSBwb2ludCB0byBkYXRhW10uCisgICAgICoKKyAgICAgKiBGb3IgcGxhbmFyIGF1ZGlvLCBlYWNoIGNoYW5uZWwgaGFzIGEgc2VwYXJhdGUgZGF0YSBwb2ludGVyLCBhbmQKKyAgICAgKiBsaW5lc2l6ZVswXSBjb250YWlucyB0aGUgc2l6ZSBvZiBlYWNoIGNoYW5uZWwgYnVmZmVyLgorICAgICAqIEZvciBwYWNrZWQgYXVkaW8sIHRoZXJlIGlzIGp1c3Qgb25lIGRhdGEgcG9pbnRlciwgYW5kIGxpbmVzaXplWzBdCisgICAgICogY29udGFpbnMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGJ1ZmZlciBmb3IgYWxsIGNoYW5uZWxzLgorICAgICAqCisgICAgICogTm90ZTogQm90aCBkYXRhIGFuZCBleHRlbmRlZF9kYXRhIHNob3VsZCBhbHdheXMgYmUgc2V0IGluIGEgdmFsaWQgZnJhbWUsCisgICAgICogYnV0IGZvciBwbGFuYXIgYXVkaW8gd2l0aCBtb3JlIGNoYW5uZWxzIHRoYXQgY2FuIGZpdCBpbiBkYXRhLAorICAgICAqIGV4dGVuZGVkX2RhdGEgbXVzdCBiZSB1c2VkIGluIG9yZGVyIHRvIGFjY2VzcyBhbGwgY2hhbm5lbHMuCisgICAgICovCisgICAgdWludDhfdCAqKmV4dGVuZGVkX2RhdGE7CisKKyAgICAvKioKKyAgICAgKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSB2aWRlbyBmcmFtZQorICAgICAqLworICAgIGludCB3aWR0aCwgaGVpZ2h0OworCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIGF1ZGlvIHNhbXBsZXMgKHBlciBjaGFubmVsKSBkZXNjcmliZWQgYnkgdGhpcyBmcmFtZQorICAgICAqLworICAgIGludCBuYl9zYW1wbGVzOworCisgICAgLyoqCisgICAgICogZm9ybWF0IG9mIHRoZSBmcmFtZSwgLTEgaWYgdW5rbm93biBvciB1bnNldAorICAgICAqIFZhbHVlcyBjb3JyZXNwb25kIHRvIGVudW0gQVZQaXhlbEZvcm1hdCBmb3IgdmlkZW8gZnJhbWVzLAorICAgICAqIGVudW0gQVZTYW1wbGVGb3JtYXQgZm9yIGF1ZGlvKQorICAgICAqLworICAgIGludCBmb3JtYXQ7CisKKyAgICAvKioKKyAgICAgKiAxIC0+IGtleWZyYW1lLCAwLT4gbm90CisgICAgICovCisgICAgaW50IGtleV9mcmFtZTsKKworICAgIC8qKgorICAgICAqIFBpY3R1cmUgdHlwZSBvZiB0aGUgZnJhbWUuCisgICAgICovCisgICAgZW51bSBBVlBpY3R1cmVUeXBlIHBpY3RfdHlwZTsKKworI2lmIEZGX0FQSV9BVkZSQU1FX0xBVkMKKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorICAgIHVpbnQ4X3QgKmJhc2VbQVZfTlVNX0RBVEFfUE9JTlRFUlNdOworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBTYW1wbGUgYXNwZWN0IHJhdGlvIGZvciB0aGUgdmlkZW8gZnJhbWUsIDAvMSBpZiB1bmtub3duL3Vuc3BlY2lmaWVkLgorICAgICAqLworICAgIEFWUmF0aW9uYWwgc2FtcGxlX2FzcGVjdF9yYXRpbzsKKworICAgIC8qKgorICAgICAqIFByZXNlbnRhdGlvbiB0aW1lc3RhbXAgaW4gdGltZV9iYXNlIHVuaXRzICh0aW1lIHdoZW4gZnJhbWUgc2hvdWxkIGJlIHNob3duIHRvIHVzZXIpLgorICAgICAqLworICAgIGludDY0X3QgcHRzOworCisgICAgLyoqCisgICAgICogUFRTIGNvcGllZCBmcm9tIHRoZSBBVlBhY2tldCB0aGF0IHdhcyBkZWNvZGVkIHRvIHByb2R1Y2UgdGhpcyBmcmFtZS4KKyAgICAgKi8KKyAgICBpbnQ2NF90IHBrdF9wdHM7CisKKyAgICAvKioKKyAgICAgKiBEVFMgY29waWVkIGZyb20gdGhlIEFWUGFja2V0IHRoYXQgdHJpZ2dlcmVkIHJldHVybmluZyB0aGlzIGZyYW1lLiAoaWYgZnJhbWUgdGhyZWFkaW5nIGlzbid0IHVzZWQpCisgICAgICogVGhpcyBpcyBhbHNvIHRoZSBQcmVzZW50YXRpb24gdGltZSBvZiB0aGlzIEFWRnJhbWUgY2FsY3VsYXRlZCBmcm9tCisgICAgICogb25seSBBVlBhY2tldC5kdHMgdmFsdWVzIHdpdGhvdXQgcHRzIHZhbHVlcy4KKyAgICAgKi8KKyAgICBpbnQ2NF90IHBrdF9kdHM7CisKKyAgICAvKioKKyAgICAgKiBwaWN0dXJlIG51bWJlciBpbiBiaXRzdHJlYW0gb3JkZXIKKyAgICAgKi8KKyAgICBpbnQgY29kZWRfcGljdHVyZV9udW1iZXI7CisgICAgLyoqCisgICAgICogcGljdHVyZSBudW1iZXIgaW4gZGlzcGxheSBvcmRlcgorICAgICAqLworICAgIGludCBkaXNwbGF5X3BpY3R1cmVfbnVtYmVyOworCisgICAgLyoqCisgICAgICogcXVhbGl0eSAoYmV0d2VlbiAxIChnb29kKSBhbmQgRkZfTEFNQkRBX01BWCAoYmFkKSkKKyAgICAgKi8KKyAgICBpbnQgcXVhbGl0eTsKKworI2lmIEZGX0FQSV9BVkZSQU1FX0xBVkMKKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorICAgIGludCByZWZlcmVuY2U7CisKKyAgICAvKioKKyAgICAgKiBRUCB0YWJsZQorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgaW50OF90ICpxc2NhbGVfdGFibGU7CisgICAgLyoqCisgICAgICogUVAgc3RvcmUgc3RyaWRlCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICBpbnQgcXN0cmlkZTsKKworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgaW50IHFzY2FsZV90eXBlOworCisgICAgLyoqCisgICAgICogbWJza2lwX3RhYmxlW21iXT49MSBpZiBNQiBkaWRuJ3QgY2hhbmdlCisgICAgICogc3RyaWRlPSBtYl93aWR0aCA9ICh3aWR0aCsxNSk+PjQKKyAgICAgKi8KKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorICAgIHVpbnQ4X3QgKm1ic2tpcF90YWJsZTsKKworICAgIC8qKgorICAgICAqIG1vdGlvbiB2ZWN0b3IgdGFibGUKKyAgICAgKiBAY29kZQorICAgICAqIGV4YW1wbGU6CisgICAgICogaW50IG12X3NhbXBsZV9sb2cyPSA0IC0gbW90aW9uX3N1YnNhbXBsZV9sb2cyOworICAgICAqIGludCBtYl93aWR0aD0gKHdpZHRoKzE1KT4+NDsKKyAgICAgKiBpbnQgbXZfc3RyaWRlPSAobWJfd2lkdGggPDwgbXZfc2FtcGxlX2xvZzIpICsgMTsKKyAgICAgKiBtb3Rpb25fdmFsW2RpcmVjdGlvbl1beCArIHkqbXZfc3RyaWRlXVswLT5tdl94LCAxLT5tdl95XTsKKyAgICAgKiBAZW5kY29kZQorICAgICAqLworICAgIGludDE2X3QgKCptb3Rpb25fdmFsWzJdKVsyXTsKKworICAgIC8qKgorICAgICAqIG1hY3JvYmxvY2sgdHlwZSB0YWJsZQorICAgICAqIG1iX3R5cGVfYmFzZSArIG1iX3dpZHRoICsgMgorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgdWludDMyX3QgKm1iX3R5cGU7CisKKyAgICAvKioKKyAgICAgKiBEQ1QgY29lZmZpY2llbnRzCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICBzaG9ydCAqZGN0X2NvZWZmOworCisgICAgLyoqCisgICAgICogbW90aW9uIHJlZmVyZW5jZSBmcmFtZSBpbmRleAorICAgICAqIHRoZSBvcmRlciBpbiB3aGljaCB0aGVzZSBhcmUgc3RvcmVkIGNhbiBkZXBlbmQgb24gdGhlIGNvZGVjLgorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgaW50OF90ICpyZWZfaW5kZXhbMl07CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIGZvciBzb21lIHByaXZhdGUgZGF0YSBvZiB0aGUgdXNlcgorICAgICAqLworICAgIHZvaWQgKm9wYXF1ZTsKKworICAgIC8qKgorICAgICAqIGVycm9yCisgICAgICovCisgICAgdWludDY0X3QgZXJyb3JbQVZfTlVNX0RBVEFfUE9JTlRFUlNdOworCisjaWYgRkZfQVBJX0FWRlJBTUVfTEFWQworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgaW50IHR5cGU7CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIFdoZW4gZGVjb2RpbmcsIHRoaXMgc2lnbmFscyBob3cgbXVjaCB0aGUgcGljdHVyZSBtdXN0IGJlIGRlbGF5ZWQuCisgICAgICogZXh0cmFfZGVsYXkgPSByZXBlYXRfcGljdCAvICgyKmZwcykKKyAgICAgKi8KKyAgICBpbnQgcmVwZWF0X3BpY3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgcGljdHVyZSBpcyBpbnRlcmxhY2VkLgorICAgICAqLworICAgIGludCBpbnRlcmxhY2VkX2ZyYW1lOworCisgICAgLyoqCisgICAgICogSWYgdGhlIGNvbnRlbnQgaXMgaW50ZXJsYWNlZCwgaXMgdG9wIGZpZWxkIGRpc3BsYXllZCBmaXJzdC4KKyAgICAgKi8KKyAgICBpbnQgdG9wX2ZpZWxkX2ZpcnN0OworCisgICAgLyoqCisgICAgICogVGVsbCB1c2VyIGFwcGxpY2F0aW9uIHRoYXQgcGFsZXR0ZSBoYXMgY2hhbmdlZCBmcm9tIHByZXZpb3VzIGZyYW1lLgorICAgICAqLworICAgIGludCBwYWxldHRlX2hhc19jaGFuZ2VkOworCisjaWYgRkZfQVBJX0FWRlJBTUVfTEFWQworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgaW50IGJ1ZmZlcl9oaW50czsKKworICAgIC8qKgorICAgICAqIFBhbiBzY2FuLgorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgc3RydWN0IEFWUGFuU2NhbiAqcGFuX3NjYW47CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIHJlb3JkZXJlZCBvcGFxdWUgNjRiaXQgKGdlbmVyYWxseSBhbiBpbnRlZ2VyIG9yIGEgZG91YmxlIHByZWNpc2lvbiBmbG9hdAorICAgICAqIFBUUyBidXQgY2FuIGJlIGFueXRoaW5nKS4KKyAgICAgKiBUaGUgdXNlciBzZXRzIEFWQ29kZWNDb250ZXh0LnJlb3JkZXJlZF9vcGFxdWUgdG8gcmVwcmVzZW50IHRoZSBpbnB1dCBhdAorICAgICAqIHRoYXQgdGltZSwKKyAgICAgKiB0aGUgZGVjb2RlciByZW9yZGVycyB2YWx1ZXMgYXMgbmVlZGVkIGFuZCBzZXRzIEFWRnJhbWUucmVvcmRlcmVkX29wYXF1ZQorICAgICAqIHRvIGV4YWN0bHkgb25lIG9mIHRoZSB2YWx1ZXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgdGhyb3VnaCBBVkNvZGVjQ29udGV4dC5yZW9yZGVyZWRfb3BhcXVlCisgICAgICogQGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgcGt0X3B0cworICAgICAqLworICAgIGludDY0X3QgcmVvcmRlcmVkX29wYXF1ZTsKKworI2lmIEZGX0FQSV9BVkZSQU1FX0xBVkMKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIGZpZWxkIGlzIHVudXNlZAorICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkIHZvaWQgKmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICBzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKm93bmVyOworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisgICAgdm9pZCAqdGhyZWFkX29wYXF1ZTsKKworICAgIC8qKgorICAgICAqIGxvZzIgb2YgdGhlIHNpemUgb2YgdGhlIGJsb2NrIHdoaWNoIGEgc2luZ2xlIHZlY3RvciBpbiBtb3Rpb25fdmFsIHJlcHJlc2VudHM6CisgICAgICogKDQtPjE2eDE2LCAzLT44eDgsIDItPiA0eDQsIDEtPiAyeDIpCisgICAgICovCisgICAgdWludDhfdCBtb3Rpb25fc3Vic2FtcGxlX2xvZzI7CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIFNhbXBsZSByYXRlIG9mIHRoZSBhdWRpbyBkYXRhLgorICAgICAqLworICAgIGludCBzYW1wbGVfcmF0ZTsKKworICAgIC8qKgorICAgICAqIENoYW5uZWwgbGF5b3V0IG9mIHRoZSBhdWRpbyBkYXRhLgorICAgICAqLworICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OworCisgICAgLyoqCisgICAgICogQVZCdWZmZXIgcmVmZXJlbmNlcyBiYWNraW5nIHRoZSBkYXRhIGZvciB0aGlzIGZyYW1lLiBJZiBhbGwgZWxlbWVudHMgb2YKKyAgICAgKiB0aGlzIGFycmF5IGFyZSBOVUxMLCB0aGVuIHRoaXMgZnJhbWUgaXMgbm90IHJlZmVyZW5jZSBjb3VudGVkLgorICAgICAqCisgICAgICogVGhlcmUgbWF5IGJlIGF0IG1vc3Qgb25lIEFWQnVmZmVyIHBlciBkYXRhIHBsYW5lLCBzbyBmb3IgdmlkZW8gdGhpcyBhcnJheQorICAgICAqIGFsd2F5cyBjb250YWlucyBhbGwgdGhlIHJlZmVyZW5jZXMuIEZvciBwbGFuYXIgYXVkaW8gd2l0aCBtb3JlIHRoYW4KKyAgICAgKiBBVl9OVU1fREFUQV9QT0lOVEVSUyBjaGFubmVscywgdGhlcmUgbWF5IGJlIG1vcmUgYnVmZmVycyB0aGFuIGNhbiBmaXQgaW4KKyAgICAgKiB0aGlzIGFycmF5LiBUaGVuIHRoZSBleHRyYSBBVkJ1ZmZlclJlZiBwb2ludGVycyBhcmUgc3RvcmVkIGluIHRoZQorICAgICAqIGV4dGVuZGVkX2J1ZiBhcnJheS4KKyAgICAgKi8KKyAgICBBVkJ1ZmZlclJlZiAqYnVmW0FWX05VTV9EQVRBX1BPSU5URVJTXTsKKworICAgIC8qKgorICAgICAqIEZvciBwbGFuYXIgYXVkaW8gd2hpY2ggcmVxdWlyZXMgbW9yZSB0aGFuIEFWX05VTV9EQVRBX1BPSU5URVJTCisgICAgICogQVZCdWZmZXJSZWYgcG9pbnRlcnMsIHRoaXMgYXJyYXkgd2lsbCBob2xkIGFsbCB0aGUgcmVmZXJlbmNlcyB3aGljaAorICAgICAqIGNhbm5vdCBmaXQgaW50byBBVkZyYW1lLmJ1Zi4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIEFWRnJhbWUuZXh0ZW5kZWRfZGF0YSwgd2hpY2ggYWx3YXlzCisgICAgICogY29udGFpbnMgYWxsIHRoZSBwb2ludGVycy4gVGhpcyBhcnJheSBvbmx5IGNvbnRhaW5zIHRoZSBleHRyYSBwb2ludGVycywKKyAgICAgKiB3aGljaCBjYW5ub3QgZml0IGludG8gQVZGcmFtZS5idWYuCisgICAgICoKKyAgICAgKiBUaGlzIGFycmF5IGlzIGFsd2F5cyBhbGxvY2F0ZWQgdXNpbmcgYXZfbWFsbG9jKCkgYnkgd2hvZXZlciBjb25zdHJ1Y3RzCisgICAgICogdGhlIGZyYW1lLiBJdCBpcyBmcmVlZCBpbiBhdl9mcmFtZV91bnJlZigpLgorICAgICAqLworICAgIEFWQnVmZmVyUmVmICoqZXh0ZW5kZWRfYnVmOworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBlbGVtZW50cyBpbiBleHRlbmRlZF9idWYuCisgICAgICovCisgICAgaW50ICAgICAgICBuYl9leHRlbmRlZF9idWY7CisKKyAgICBBVkZyYW1lU2lkZURhdGEgKipzaWRlX2RhdGE7CisgICAgaW50ICAgICAgICAgICAgbmJfc2lkZV9kYXRhOworCisvKioKKyAqIEBkZWZncm91cCBsYXZ1X2ZyYW1lX2ZsYWdzIEFWX0ZSQU1FX0ZMQUdTCisgKiBGbGFncyBkZXNjcmliaW5nIGFkZGl0aW9uYWwgZnJhbWUgcHJvcGVydGllcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogVGhlIGZyYW1lIGRhdGEgbWF5IGJlIGNvcnJ1cHRlZCwgZS5nLiBkdWUgdG8gZGVjb2RpbmcgZXJyb3JzLgorICovCisjZGVmaW5lIEFWX0ZSQU1FX0ZMQUdfQ09SUlVQVCAgICAgICAoMSA8PCAwKQorLyoqCisgKiBAfQorICovCisKKyAgICAvKioKKyAgICAgKiBGcmFtZSBmbGFncywgYSBjb21iaW5hdGlvbiBvZiBAcmVmIGxhdnVfZnJhbWVfZmxhZ3MKKyAgICAgKi8KKyAgICBpbnQgZmxhZ3M7CisKKyAgICAvKioKKyAgICAgKiBNUEVHIHZzIEpQRUcgWVVWIHJhbmdlLgorICAgICAqIEl0IG11c3QgYmUgYWNjZXNzZWQgdXNpbmcgYXZfZnJhbWVfZ2V0X2NvbG9yX3JhbmdlKCkgYW5kCisgICAgICogYXZfZnJhbWVfc2V0X2NvbG9yX3JhbmdlKCkuCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYworICAgICAqLworICAgIGVudW0gQVZDb2xvclJhbmdlIGNvbG9yX3JhbmdlOworCisgICAgZW51bSBBVkNvbG9yUHJpbWFyaWVzIGNvbG9yX3ByaW1hcmllczsKKworICAgIGVudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgY29sb3JfdHJjOworCisgICAgLyoqCisgICAgICogWVVWIGNvbG9yc3BhY2UgdHlwZS4KKyAgICAgKiBJdCBtdXN0IGJlIGFjY2Vzc2VkIHVzaW5nIGF2X2ZyYW1lX2dldF9jb2xvcnNwYWNlKCkgYW5kCisgICAgICogYXZfZnJhbWVfc2V0X2NvbG9yc3BhY2UoKS4KKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlcgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjCisgICAgICovCisgICAgZW51bSBBVkNvbG9yU3BhY2UgY29sb3JzcGFjZTsKKworICAgIGVudW0gQVZDaHJvbWFMb2NhdGlvbiBjaHJvbWFfbG9jYXRpb247CisKKyAgICAvKioKKyAgICAgKiBmcmFtZSB0aW1lc3RhbXAgZXN0aW1hdGVkIHVzaW5nIHZhcmlvdXMgaGV1cmlzdGljcywgaW4gc3RyZWFtIHRpbWUgYmFzZQorICAgICAqIENvZGUgb3V0c2lkZSBsaWJhdmNvZGVjIHNob3VsZCBhY2Nlc3MgdGhpcyBmaWVsZCB1c2luZzoKKyAgICAgKiBhdl9mcmFtZV9nZXRfYmVzdF9lZmZvcnRfdGltZXN0YW1wKGZyYW1lKQorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSBsaWJhdmNvZGVjLCByZWFkIGJ5IHVzZXIuCisgICAgICovCisgICAgaW50NjRfdCBiZXN0X2VmZm9ydF90aW1lc3RhbXA7CisKKyAgICAvKioKKyAgICAgKiByZW9yZGVyZWQgcG9zIGZyb20gdGhlIGxhc3QgQVZQYWNrZXQgdGhhdCBoYXMgYmVlbiBpbnB1dCBpbnRvIHRoZSBkZWNvZGVyCisgICAgICogQ29kZSBvdXRzaWRlIGxpYmF2Y29kZWMgc2hvdWxkIGFjY2VzcyB0aGlzIGZpZWxkIHVzaW5nOgorICAgICAqIGF2X2ZyYW1lX2dldF9wa3RfcG9zKGZyYW1lKQorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFJlYWQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBpbnQ2NF90IHBrdF9wb3M7CisKKyAgICAvKioKKyAgICAgKiBkdXJhdGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBwYWNrZXQsIGV4cHJlc3NlZCBpbgorICAgICAqIEFWU3RyZWFtLT50aW1lX2Jhc2UgdW5pdHMsIDAgaWYgdW5rbm93bi4KKyAgICAgKiBDb2RlIG91dHNpZGUgbGliYXZjb2RlYyBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmc6CisgICAgICogYXZfZnJhbWVfZ2V0X3BrdF9kdXJhdGlvbihmcmFtZSkKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBSZWFkIGJ5IHVzZXIuCisgICAgICovCisgICAgaW50NjRfdCBwa3RfZHVyYXRpb247CisKKyAgICAvKioKKyAgICAgKiBtZXRhZGF0YS4KKyAgICAgKiBDb2RlIG91dHNpZGUgbGliYXZjb2RlYyBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmc6CisgICAgICogYXZfZnJhbWVfZ2V0X21ldGFkYXRhKGZyYW1lKQorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorICAgICAqLworICAgIEFWRGljdGlvbmFyeSAqbWV0YWRhdGE7CisKKyAgICAvKioKKyAgICAgKiBkZWNvZGUgZXJyb3IgZmxhZ3Mgb2YgdGhlIGZyYW1lLCBzZXQgdG8gYSBjb21iaW5hdGlvbiBvZgorICAgICAqIEZGX0RFQ09ERV9FUlJPUl94eHggZmxhZ3MgaWYgdGhlIGRlY29kZXIgcHJvZHVjZWQgYSBmcmFtZSwgYnV0IHRoZXJlCisgICAgICogd2VyZSBlcnJvcnMgZHVyaW5nIHRoZSBkZWNvZGluZy4KKyAgICAgKiBDb2RlIG91dHNpZGUgbGliYXZjb2RlYyBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmc6CisgICAgICogYXZfZnJhbWVfZ2V0X2RlY29kZV9lcnJvcl9mbGFncyhmcmFtZSkKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgbGliYXZjb2RlYywgcmVhZCBieSB1c2VyLgorICAgICAqLworICAgIGludCBkZWNvZGVfZXJyb3JfZmxhZ3M7CisjZGVmaW5lIEZGX0RFQ09ERV9FUlJPUl9JTlZBTElEX0JJVFNUUkVBTSAgIDEKKyNkZWZpbmUgRkZfREVDT0RFX0VSUk9SX01JU1NJTkdfUkVGRVJFTkNFICAgMgorCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLCBvbmx5IHVzZWQgZm9yIGF1ZGlvLgorICAgICAqIENvZGUgb3V0c2lkZSBsaWJhdmNvZGVjIHNob3VsZCBhY2Nlc3MgdGhpcyBmaWVsZCB1c2luZzoKKyAgICAgKiBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoZnJhbWUpCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogUmVhZCBieSB1c2VyLgorICAgICAqLworICAgIGludCBjaGFubmVsczsKKworICAgIC8qKgorICAgICAqIHNpemUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFja2V0IGNvbnRhaW5pbmcgdGhlIGNvbXByZXNzZWQKKyAgICAgKiBmcmFtZS4gSXQgbXVzdCBiZSBhY2Nlc3NlZCB1c2luZyBhdl9mcmFtZV9nZXRfcGt0X3NpemUoKSBhbmQKKyAgICAgKiBhdl9mcmFtZV9zZXRfcGt0X3NpemUoKS4KKyAgICAgKiBJdCBpcyBzZXQgdG8gYSBuZWdhdGl2ZSB2YWx1ZSBpZiB1bmtub3duLgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSBsaWJhdmNvZGVjLCByZWFkIGJ5IHVzZXIuCisgICAgICovCisgICAgaW50IHBrdF9zaXplOworCisgICAgLyoqCisgICAgICogTm90IHRvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gb3V0c2lkZSBsaWJhdnV0aWwKKyAgICAgKi8KKyAgICBBVkJ1ZmZlclJlZiAqcXBfdGFibGVfYnVmOworfSBBVkZyYW1lOworCisvKioKKyAqIEFjY2Vzc29ycyBmb3Igc29tZSBBVkZyYW1lIGZpZWxkcy4KKyAqIFRoZSBwb3NpdGlvbiBvZiB0aGVzZSBmaWVsZCBpbiB0aGUgc3RydWN0dXJlIGlzIG5vdCBwYXJ0IG9mIHRoZSBBQkksCisgKiB0aGV5IHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHkgb3V0c2lkZSBsaWJhdmNvZGVjLgorICovCitpbnQ2NF90IGF2X2ZyYW1lX2dldF9iZXN0X2VmZm9ydF90aW1lc3RhbXAoY29uc3QgQVZGcmFtZSAqZnJhbWUpOwordm9pZCAgICBhdl9mcmFtZV9zZXRfYmVzdF9lZmZvcnRfdGltZXN0YW1wKEFWRnJhbWUgKmZyYW1lLCBpbnQ2NF90IHZhbCk7CitpbnQ2NF90IGF2X2ZyYW1lX2dldF9wa3RfZHVyYXRpb24gICAgICAgICAoY29uc3QgQVZGcmFtZSAqZnJhbWUpOwordm9pZCAgICBhdl9mcmFtZV9zZXRfcGt0X2R1cmF0aW9uICAgICAgICAgKEFWRnJhbWUgKmZyYW1lLCBpbnQ2NF90IHZhbCk7CitpbnQ2NF90IGF2X2ZyYW1lX2dldF9wa3RfcG9zICAgICAgICAgICAgICAoY29uc3QgQVZGcmFtZSAqZnJhbWUpOwordm9pZCAgICBhdl9mcmFtZV9zZXRfcGt0X3BvcyAgICAgICAgICAgICAgKEFWRnJhbWUgKmZyYW1lLCBpbnQ2NF90IHZhbCk7CitpbnQ2NF90IGF2X2ZyYW1lX2dldF9jaGFubmVsX2xheW91dCAgICAgICAoY29uc3QgQVZGcmFtZSAqZnJhbWUpOwordm9pZCAgICBhdl9mcmFtZV9zZXRfY2hhbm5lbF9sYXlvdXQgICAgICAgKEFWRnJhbWUgKmZyYW1lLCBpbnQ2NF90IHZhbCk7CitpbnQgICAgIGF2X2ZyYW1lX2dldF9jaGFubmVscyAgICAgICAgICAgICAoY29uc3QgQVZGcmFtZSAqZnJhbWUpOwordm9pZCAgICBhdl9mcmFtZV9zZXRfY2hhbm5lbHMgICAgICAgICAgICAgKEFWRnJhbWUgKmZyYW1lLCBpbnQgICAgIHZhbCk7CitpbnQgICAgIGF2X2ZyYW1lX2dldF9zYW1wbGVfcmF0ZSAgICAgICAgICAoY29uc3QgQVZGcmFtZSAqZnJhbWUpOwordm9pZCAgICBhdl9mcmFtZV9zZXRfc2FtcGxlX3JhdGUgICAgICAgICAgKEFWRnJhbWUgKmZyYW1lLCBpbnQgICAgIHZhbCk7CitBVkRpY3Rpb25hcnkgKmF2X2ZyYW1lX2dldF9tZXRhZGF0YSAgICAgICAoY29uc3QgQVZGcmFtZSAqZnJhbWUpOwordm9pZCAgICAgICAgICBhdl9mcmFtZV9zZXRfbWV0YWRhdGEgICAgICAgKEFWRnJhbWUgKmZyYW1lLCBBVkRpY3Rpb25hcnkgKnZhbCk7CitpbnQgICAgIGF2X2ZyYW1lX2dldF9kZWNvZGVfZXJyb3JfZmxhZ3MgICAoY29uc3QgQVZGcmFtZSAqZnJhbWUpOwordm9pZCAgICBhdl9mcmFtZV9zZXRfZGVjb2RlX2Vycm9yX2ZsYWdzICAgKEFWRnJhbWUgKmZyYW1lLCBpbnQgICAgIHZhbCk7CitpbnQgICAgIGF2X2ZyYW1lX2dldF9wa3Rfc2l6ZShjb25zdCBBVkZyYW1lICpmcmFtZSk7Cit2b2lkICAgIGF2X2ZyYW1lX3NldF9wa3Rfc2l6ZShBVkZyYW1lICpmcmFtZSwgaW50IHZhbCk7CitBVkRpY3Rpb25hcnkgKiphdnByaXZfZnJhbWVfZ2V0X21ldGFkYXRhcChBVkZyYW1lICpmcmFtZSk7CitpbnQ4X3QgKmF2X2ZyYW1lX2dldF9xcF90YWJsZShBVkZyYW1lICpmLCBpbnQgKnN0cmlkZSwgaW50ICp0eXBlKTsKK2ludCBhdl9mcmFtZV9zZXRfcXBfdGFibGUoQVZGcmFtZSAqZiwgQVZCdWZmZXJSZWYgKmJ1ZiwgaW50IHN0cmlkZSwgaW50IHR5cGUpOworZW51bSBBVkNvbG9yU3BhY2UgYXZfZnJhbWVfZ2V0X2NvbG9yc3BhY2UoY29uc3QgQVZGcmFtZSAqZnJhbWUpOwordm9pZCAgICBhdl9mcmFtZV9zZXRfY29sb3JzcGFjZShBVkZyYW1lICpmcmFtZSwgZW51bSBBVkNvbG9yU3BhY2UgdmFsKTsKK2VudW0gQVZDb2xvclJhbmdlIGF2X2ZyYW1lX2dldF9jb2xvcl9yYW5nZShjb25zdCBBVkZyYW1lICpmcmFtZSk7Cit2b2lkICAgIGF2X2ZyYW1lX3NldF9jb2xvcl9yYW5nZShBVkZyYW1lICpmcmFtZSwgZW51bSBBVkNvbG9yUmFuZ2UgdmFsKTsKKworLyoqCisgKiBHZXQgdGhlIG5hbWUgb2YgYSBjb2xvcnNwYWNlLgorICogQHJldHVybiBhIHN0YXRpYyBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGNvbG9yc3BhY2U7IGNhbiBiZSBOVUxMLgorICovCitjb25zdCBjaGFyICphdl9nZXRfY29sb3JzcGFjZV9uYW1lKGVudW0gQVZDb2xvclNwYWNlIHZhbCk7CisKKy8qKgorICogQWxsb2NhdGUgYW4gQVZGcmFtZSBhbmQgc2V0IGl0cyBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuICBUaGUgcmVzdWx0aW5nCisgKiBzdHJ1Y3QgbXVzdCBiZSBmcmVlZCB1c2luZyBhdl9mcmFtZV9mcmVlKCkuCisgKgorICogQHJldHVybiBBbiBBVkZyYW1lIGZpbGxlZCB3aXRoIGRlZmF1bHQgdmFsdWVzIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqCisgKiBAbm90ZSB0aGlzIG9ubHkgYWxsb2NhdGVzIHRoZSBBVkZyYW1lIGl0c2VsZiwgbm90IHRoZSBkYXRhIGJ1ZmZlcnMuIFRob3NlCisgKiBtdXN0IGJlIGFsbG9jYXRlZCB0aHJvdWdoIG90aGVyIG1lYW5zLCBlLmcuIHdpdGggYXZfZnJhbWVfZ2V0X2J1ZmZlcigpIG9yCisgKiBtYW51YWxseS4KKyAqLworQVZGcmFtZSAqYXZfZnJhbWVfYWxsb2Modm9pZCk7CisKKy8qKgorICogRnJlZSB0aGUgZnJhbWUgYW5kIGFueSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgb2JqZWN0cyBpbiBpdCwKKyAqIGUuZy4gZXh0ZW5kZWRfZGF0YS4gSWYgdGhlIGZyYW1lIGlzIHJlZmVyZW5jZSBjb3VudGVkLCBpdCB3aWxsIGJlCisgKiB1bnJlZmVyZW5jZWQgZmlyc3QuCisgKgorICogQHBhcmFtIGZyYW1lIGZyYW1lIHRvIGJlIGZyZWVkLiBUaGUgcG9pbnRlciB3aWxsIGJlIHNldCB0byBOVUxMLgorICovCit2b2lkIGF2X2ZyYW1lX2ZyZWUoQVZGcmFtZSAqKmZyYW1lKTsKKworLyoqCisgKiBTZXQgdXAgYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGRlc2NyaWJlZCBieSB0aGUgc291cmNlIGZyYW1lLgorICoKKyAqIENvcHkgZnJhbWUgcHJvcGVydGllcyBmcm9tIHNyYyB0byBkc3QgYW5kIGNyZWF0ZSBhIG5ldyByZWZlcmVuY2UgZm9yIGVhY2gKKyAqIEFWQnVmZmVyUmVmIGZyb20gc3JjLgorICoKKyAqIElmIHNyYyBpcyBub3QgcmVmZXJlbmNlIGNvdW50ZWQsIG5ldyBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgYW5kIHRoZSBkYXRhIGlzCisgKiBjb3BpZWQuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBvbiBlcnJvcgorICovCitpbnQgYXZfZnJhbWVfcmVmKEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjKTsKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgZnJhbWUgdGhhdCByZWZlcmVuY2VzIHRoZSBzYW1lIGRhdGEgYXMgc3JjLgorICoKKyAqIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3IgYXZfZnJhbWVfYWxsb2MoKSthdl9mcmFtZV9yZWYoKS4KKyAqCisgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgQVZGcmFtZSBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yLgorICovCitBVkZyYW1lICphdl9mcmFtZV9jbG9uZShjb25zdCBBVkZyYW1lICpzcmMpOworCisvKioKKyAqIFVucmVmZXJlbmNlIGFsbCB0aGUgYnVmZmVycyByZWZlcmVuY2VkIGJ5IGZyYW1lIGFuZCByZXNldCB0aGUgZnJhbWUgZmllbGRzLgorICovCit2b2lkIGF2X2ZyYW1lX3VucmVmKEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBNb3ZlIGV2ZXJ5dGhuaWcgY29udGFpbmVkIGluIHNyYyB0byBkc3QgYW5kIHJlc2V0IHNyYy4KKyAqLwordm9pZCBhdl9mcmFtZV9tb3ZlX3JlZihBVkZyYW1lICpkc3QsIEFWRnJhbWUgKnNyYyk7CisKKy8qKgorICogQWxsb2NhdGUgbmV3IGJ1ZmZlcihzKSBmb3IgYXVkaW8gb3IgdmlkZW8gZGF0YS4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBtdXN0IGJlIHNldCBvbiBmcmFtZSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgorICogLSBmb3JtYXQgKHBpeGVsIGZvcm1hdCBmb3IgdmlkZW8sIHNhbXBsZSBmb3JtYXQgZm9yIGF1ZGlvKQorICogLSB3aWR0aCBhbmQgaGVpZ2h0IGZvciB2aWRlbworICogLSBuYl9zYW1wbGVzIGFuZCBjaGFubmVsX2xheW91dCBmb3IgYXVkaW8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmlsbCBBVkZyYW1lLmRhdGEgYW5kIEFWRnJhbWUuYnVmIGFycmF5cyBhbmQsIGlmCisgKiBuZWNlc3NhcnksIGFsbG9jYXRlIGFuZCBmaWxsIEFWRnJhbWUuZXh0ZW5kZWRfZGF0YSBhbmQgQVZGcmFtZS5leHRlbmRlZF9idWYuCisgKiBGb3IgcGxhbmFyIGZvcm1hdHMsIG9uZSBidWZmZXIgd2lsbCBiZSBhbGxvY2F0ZWQgZm9yIGVhY2ggcGxhbmUuCisgKgorICogQHBhcmFtIGZyYW1lIGZyYW1lIGluIHdoaWNoIHRvIHN0b3JlIHRoZSBuZXcgYnVmZmVycy4KKyAqIEBwYXJhbSBhbGlnbiByZXF1aXJlZCBidWZmZXIgc2l6ZSBhbGlnbm1lbnQKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIG9uIGVycm9yLgorICovCitpbnQgYXZfZnJhbWVfZ2V0X2J1ZmZlcihBVkZyYW1lICpmcmFtZSwgaW50IGFsaWduKTsKKworLyoqCisgKiBDaGVjayBpZiB0aGUgZnJhbWUgZGF0YSBpcyB3cml0YWJsZS4KKyAqCisgKiBAcmV0dXJuIEEgcG9zaXRpdmUgdmFsdWUgaWYgdGhlIGZyYW1lIGRhdGEgaXMgd3JpdGFibGUgKHdoaWNoIGlzIHRydWUgaWYgYW5kCisgKiBvbmx5IGlmIGVhY2ggb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVycyBoYXMgb25seSBvbmUgcmVmZXJlbmNlLCBuYW1lbHkgdGhlIG9uZQorICogc3RvcmVkIGluIHRoaXMgZnJhbWUpLiBSZXR1cm4gMCBvdGhlcndpc2UuCisgKgorICogSWYgMSBpcyByZXR1cm5lZCB0aGUgYW5zd2VyIGlzIHZhbGlkIHVudGlsIGF2X2J1ZmZlcl9yZWYoKSBpcyBjYWxsZWQgb24gYW55CisgKiBvZiB0aGUgdW5kZXJseWluZyBBVkJ1ZmZlclJlZnMgKGUuZy4gdGhyb3VnaCBhdl9mcmFtZV9yZWYoKSBvciBkaXJlY3RseSkuCisgKgorICogQHNlZSBhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKCksIGF2X2J1ZmZlcl9pc193cml0YWJsZSgpCisgKi8KK2ludCBhdl9mcmFtZV9pc193cml0YWJsZShBVkZyYW1lICpmcmFtZSk7CisKKy8qKgorICogRW5zdXJlIHRoYXQgdGhlIGZyYW1lIGRhdGEgaXMgd3JpdGFibGUsIGF2b2lkaW5nIGRhdGEgY29weSBpZiBwb3NzaWJsZS4KKyAqCisgKiBEbyBub3RoaW5nIGlmIHRoZSBmcmFtZSBpcyB3cml0YWJsZSwgYWxsb2NhdGUgbmV3IGJ1ZmZlcnMgYW5kIGNvcHkgdGhlIGRhdGEKKyAqIGlmIGl0IGlzIG5vdC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIG9uIGVycm9yLgorICoKKyAqIEBzZWUgYXZfZnJhbWVfaXNfd3JpdGFibGUoKSwgYXZfYnVmZmVyX2lzX3dyaXRhYmxlKCksCisgKiBhdl9idWZmZXJfbWFrZV93cml0YWJsZSgpCisgKi8KK2ludCBhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBDb3B5IHRoZSBmcmFtZSBkYXRhIGZyb20gc3JjIHRvIGRzdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsbG9jYXRlIGFueXRoaW5nLCBkc3QgbXVzdCBiZSBhbHJlYWR5IGluaXRpYWxpemVkIGFuZAorICogYWxsb2NhdGVkIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBzcmMuCisgKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IGNvcGllcyB0aGUgZnJhbWUgZGF0YSAoaS5lLiB0aGUgY29udGVudHMgb2YgdGhlIGRhdGEgLworICogZXh0ZW5kZWQgZGF0YSBhcnJheXMpLCBub3QgYW55IG90aGVyIHByb3BlcnRpZXMuCisgKgorICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBvbiBlcnJvci4KKyAqLworaW50IGF2X2ZyYW1lX2NvcHkoQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMpOworCisvKioKKyAqIENvcHkgb25seSAibWV0YWRhdGEiIGZpZWxkcyBmcm9tIHNyYyB0byBkc3QuCisgKgorICogTWV0YWRhdGEgZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gYXJlIHRob3NlIGZpZWxkcyB0aGF0IGRvIG5vdCBhZmZlY3QKKyAqIHRoZSBkYXRhIGxheW91dCBpbiB0aGUgYnVmZmVycy4gIEUuZy4gcHRzLCBzYW1wbGUgcmF0ZSAoZm9yIGF1ZGlvKSBvciBzYW1wbGUKKyAqIGFzcGVjdCByYXRpbyAoZm9yIHZpZGVvKSwgYnV0IG5vdCB3aWR0aC9oZWlnaHQgb3IgY2hhbm5lbCBsYXlvdXQuCisgKiBTaWRlIGRhdGEgaXMgYWxzbyBjb3BpZWQuCisgKi8KK2ludCBhdl9mcmFtZV9jb3B5X3Byb3BzKEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjKTsKKworLyoqCisgKiBHZXQgdGhlIGJ1ZmZlciByZWZlcmVuY2UgYSBnaXZlbiBkYXRhIHBsYW5lIGlzIHN0b3JlZCBpbi4KKyAqCisgKiBAcGFyYW0gcGxhbmUgaW5kZXggb2YgdGhlIGRhdGEgcGxhbmUgb2YgaW50ZXJlc3QgaW4gZnJhbWUtPmV4dGVuZGVkX2RhdGEuCisgKgorICogQHJldHVybiB0aGUgYnVmZmVyIHJlZmVyZW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBwbGFuZSBvciBOVUxMIGlmIHRoZSBpbnB1dAorICogZnJhbWUgaXMgbm90IHZhbGlkLgorICovCitBVkJ1ZmZlclJlZiAqYXZfZnJhbWVfZ2V0X3BsYW5lX2J1ZmZlcihBVkZyYW1lICpmcmFtZSwgaW50IHBsYW5lKTsKKworLyoqCisgKiBBZGQgYSBuZXcgc2lkZSBkYXRhIHRvIGEgZnJhbWUuCisgKgorICogQHBhcmFtIGZyYW1lIGEgZnJhbWUgdG8gd2hpY2ggdGhlIHNpZGUgZGF0YSBzaG91bGQgYmUgYWRkZWQKKyAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdGhlIGFkZGVkIHNpZGUgZGF0YQorICogQHBhcmFtIHNpemUgc2l6ZSBvZiB0aGUgc2lkZSBkYXRhCisgKgorICogQHJldHVybiBuZXdseSBhZGRlZCBzaWRlIGRhdGEgb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvcgorICovCitBVkZyYW1lU2lkZURhdGEgKmF2X2ZyYW1lX25ld19zaWRlX2RhdGEoQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkZyYW1lU2lkZURhdGFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpOworCisvKioKKyAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzaWRlIGRhdGEgb2YgYSBnaXZlbiB0eXBlIG9uIHN1Y2Nlc3MsIE5VTEwgaWYgdGhlcmUKKyAqIGlzIG5vIHNpZGUgZGF0YSB3aXRoIHN1Y2ggdHlwZSBpbiB0aGlzIGZyYW1lLgorICovCitBVkZyYW1lU2lkZURhdGEgKmF2X2ZyYW1lX2dldF9zaWRlX2RhdGEoY29uc3QgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkZyYW1lU2lkZURhdGFUeXBlIHR5cGUpOworCisvKioKKyAqIElmIHNpZGUgZGF0YSBvZiB0aGUgc3VwcGxpZWQgdHlwZSBleGlzdHMgaW4gdGhlIGZyYW1lLCBmcmVlIGl0IGFuZCByZW1vdmUgaXQKKyAqIGZyb20gdGhlIGZyYW1lLgorICovCit2b2lkIGF2X2ZyYW1lX3JlbW92ZV9zaWRlX2RhdGEoQVZGcmFtZSAqZnJhbWUsIGVudW0gQVZGcmFtZVNpZGVEYXRhVHlwZSB0eXBlKTsKKworLyoqCisgKiBAcmV0dXJuIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBzaWRlIGRhdGEgdHlwZQorICovCitjb25zdCBjaGFyICphdl9mcmFtZV9zaWRlX2RhdGFfbmFtZShlbnVtIEFWRnJhbWVTaWRlRGF0YVR5cGUgdHlwZSk7CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZVVElMX0ZSQU1FX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvaGFzaC5jIGIvZmZtcGVnL2xpYmF2dXRpbC9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzN2IwZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvaGFzaC5jCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiaGFzaC5oIgorCisjaW5jbHVkZSAiYWRsZXIzMi5oIgorI2luY2x1ZGUgImNyYy5oIgorI2luY2x1ZGUgIm1kNS5oIgorI2luY2x1ZGUgIm11cm11cjMuaCIKKyNpbmNsdWRlICJyaXBlbWQuaCIKKyNpbmNsdWRlICJzaGEuaCIKKyNpbmNsdWRlICJzaGE1MTIuaCIKKworI2luY2x1ZGUgImF2c3RyaW5nLmgiCisjaW5jbHVkZSAiYmFzZTY0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJpbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJtZW0uaCIKKworZW51bSBoYXNodHlwZSB7CisgICAgTUQ1LAorICAgIE1VUk1VUjMsCisgICAgUklQRU1EMTI4LAorICAgIFJJUEVNRDE2MCwKKyAgICBSSVBFTUQyNTYsCisgICAgUklQRU1EMzIwLAorICAgIFNIQTE2MCwKKyAgICBTSEEyMjQsCisgICAgU0hBMjU2LAorICAgIFNIQTUxMl8yMjQsCisgICAgU0hBNTEyXzI1NiwKKyAgICBTSEEzODQsCisgICAgU0hBNTEyLAorICAgIENSQzMyLAorICAgIEFETEVSMzIsCisgICAgTlVNX0hBU0hFUworfTsKKwordHlwZWRlZiBzdHJ1Y3QgQVZIYXNoQ29udGV4dCB7CisgICAgdm9pZCAqY3R4OworICAgIGVudW0gaGFzaHR5cGUgdHlwZTsKKyAgICBjb25zdCBBVkNSQyAqY3JjdGFiOworICAgIHVpbnQzMl90IGNyYzsKK30gQVZIYXNoQ29udGV4dDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBpbnQgc2l6ZTsKK30gaGFzaGRlc2NbXSA9IHsKKyAgICBbTUQ1XSAgICAgPSB7Ik1ENSIsICAgICAxNn0sCisgICAgW01VUk1VUjNdID0geyJtdXJtdXIzIiwgMTZ9LAorICAgIFtSSVBFTUQxMjhdID0geyJSSVBFTUQxMjgiLCAxNn0sCisgICAgW1JJUEVNRDE2MF0gPSB7IlJJUEVNRDE2MCIsIDIwfSwKKyAgICBbUklQRU1EMjU2XSA9IHsiUklQRU1EMjU2IiwgMzJ9LAorICAgIFtSSVBFTUQzMjBdID0geyJSSVBFTUQzMjAiLCA0MH0sCisgICAgW1NIQTE2MF0gID0geyJTSEExNjAiLCAgMjB9LAorICAgIFtTSEEyMjRdICA9IHsiU0hBMjI0IiwgIDI4fSwKKyAgICBbU0hBMjU2XSAgPSB7IlNIQTI1NiIsICAzMn0sCisgICAgW1NIQTUxMl8yMjRdICA9IHsiU0hBNTEyLzIyNCIsICAyOH0sCisgICAgW1NIQTUxMl8yNTZdICA9IHsiU0hBNTEyLzI1NiIsICAzMn0sCisgICAgW1NIQTM4NF0gID0geyJTSEEzODQiLCAgNDh9LAorICAgIFtTSEE1MTJdICA9IHsiU0hBNTEyIiwgIDY0fSwKKyAgICBbQ1JDMzJdICAgPSB7IkNSQzMyIiwgICAgNH0sCisgICAgW0FETEVSMzJdID0geyJhZGxlcjMyIiwgIDR9LAorfTsKKworY29uc3QgY2hhciAqYXZfaGFzaF9uYW1lcyhpbnQgaSkKK3sKKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBOVU1fSEFTSEVTKSByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gaGFzaGRlc2NbaV0ubmFtZTsKK30KKworY29uc3QgY2hhciAqYXZfaGFzaF9nZXRfbmFtZShjb25zdCBBVkhhc2hDb250ZXh0ICpjdHgpCit7CisgICAgcmV0dXJuIGhhc2hkZXNjW2N0eC0+dHlwZV0ubmFtZTsKK30KKworaW50IGF2X2hhc2hfZ2V0X3NpemUoY29uc3QgQVZIYXNoQ29udGV4dCAqY3R4KQoreworICAgIHJldHVybiBoYXNoZGVzY1tjdHgtPnR5cGVdLnNpemU7Cit9CisKK2ludCBhdl9oYXNoX2FsbG9jKEFWSGFzaENvbnRleHQgKipjdHgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgQVZIYXNoQ29udGV4dCAqcmVzOworICAgIGludCBpOworICAgICpjdHggPSBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fSEFTSEVTOyBpKyspCisgICAgICAgIGlmIChhdl9zdHJjYXNlY21wKG5hbWUsIGhhc2hkZXNjW2ldLm5hbWUpID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaSA+PSBOVU1fSEFTSEVTKSByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIHJlcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpyZXMpKTsKKyAgICBpZiAoIXJlcykgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXMtPnR5cGUgPSBpOworICAgIHN3aXRjaCAoaSkgeworICAgIGNhc2UgTUQ1OiAgICAgcmVzLT5jdHggPSBhdl9tZDVfYWxsb2MoKTsgYnJlYWs7CisgICAgY2FzZSBNVVJNVVIzOiByZXMtPmN0eCA9IGF2X211cm11cjNfYWxsb2MoKTsgYnJlYWs7CisgICAgY2FzZSBSSVBFTUQxMjg6CisgICAgY2FzZSBSSVBFTUQxNjA6CisgICAgY2FzZSBSSVBFTUQyNTY6CisgICAgY2FzZSBSSVBFTUQzMjA6IHJlcy0+Y3R4ID0gYXZfcmlwZW1kX2FsbG9jKCk7IGJyZWFrOworICAgIGNhc2UgU0hBMTYwOgorICAgIGNhc2UgU0hBMjI0OgorICAgIGNhc2UgU0hBMjU2OiAgcmVzLT5jdHggPSBhdl9zaGFfYWxsb2MoKTsgYnJlYWs7CisgICAgY2FzZSBTSEE1MTJfMjI0OgorICAgIGNhc2UgU0hBNTEyXzI1NjoKKyAgICBjYXNlIFNIQTM4NDoKKyAgICBjYXNlIFNIQTUxMjogIHJlcy0+Y3R4ID0gYXZfc2hhNTEyX2FsbG9jKCk7IGJyZWFrOworICAgIGNhc2UgQ1JDMzI6ICAgcmVzLT5jcmN0YWIgPSBhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18zMl9JRUVFX0xFKTsgYnJlYWs7CisgICAgY2FzZSBBRExFUjMyOiBicmVhazsKKyAgICB9CisgICAgaWYgKGkgIT0gQURMRVIzMiAmJiBpICE9IENSQzMyICYmICFyZXMtPmN0eCkgeworICAgICAgICBhdl9mcmVlKHJlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgICpjdHggPSByZXM7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXZfaGFzaF9pbml0KEFWSGFzaENvbnRleHQgKmN0eCkKK3sKKyAgICBzd2l0Y2ggKGN0eC0+dHlwZSkgeworICAgIGNhc2UgTUQ1OiAgICAgYXZfbWQ1X2luaXQoY3R4LT5jdHgpOyBicmVhazsKKyAgICBjYXNlIE1VUk1VUjM6IGF2X211cm11cjNfaW5pdChjdHgtPmN0eCk7IGJyZWFrOworICAgIGNhc2UgUklQRU1EMTI4OiBhdl9yaXBlbWRfaW5pdChjdHgtPmN0eCwgMTI4KTsgYnJlYWs7CisgICAgY2FzZSBSSVBFTUQxNjA6IGF2X3JpcGVtZF9pbml0KGN0eC0+Y3R4LCAxNjApOyBicmVhazsKKyAgICBjYXNlIFJJUEVNRDI1NjogYXZfcmlwZW1kX2luaXQoY3R4LT5jdHgsIDI1Nik7IGJyZWFrOworICAgIGNhc2UgUklQRU1EMzIwOiBhdl9yaXBlbWRfaW5pdChjdHgtPmN0eCwgMzIwKTsgYnJlYWs7CisgICAgY2FzZSBTSEExNjA6ICBhdl9zaGFfaW5pdChjdHgtPmN0eCwgMTYwKTsgYnJlYWs7CisgICAgY2FzZSBTSEEyMjQ6ICBhdl9zaGFfaW5pdChjdHgtPmN0eCwgMjI0KTsgYnJlYWs7CisgICAgY2FzZSBTSEEyNTY6ICBhdl9zaGFfaW5pdChjdHgtPmN0eCwgMjU2KTsgYnJlYWs7CisgICAgY2FzZSBTSEE1MTJfMjI0OiAgYXZfc2hhNTEyX2luaXQoY3R4LT5jdHgsIDIyNCk7IGJyZWFrOworICAgIGNhc2UgU0hBNTEyXzI1NjogIGF2X3NoYTUxMl9pbml0KGN0eC0+Y3R4LCAyNTYpOyBicmVhazsKKyAgICBjYXNlIFNIQTM4NDogIGF2X3NoYTUxMl9pbml0KGN0eC0+Y3R4LCAzODQpOyBicmVhazsKKyAgICBjYXNlIFNIQTUxMjogIGF2X3NoYTUxMl9pbml0KGN0eC0+Y3R4LCA1MTIpOyBicmVhazsKKyAgICBjYXNlIENSQzMyOiAgIGN0eC0+Y3JjID0gVUlOVDMyX01BWDsgYnJlYWs7CisgICAgY2FzZSBBRExFUjMyOiBjdHgtPmNyYyA9IDE7IGJyZWFrOworICAgIH0KK30KKwordm9pZCBhdl9oYXNoX3VwZGF0ZShBVkhhc2hDb250ZXh0ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbikKK3sKKyAgICBzd2l0Y2ggKGN0eC0+dHlwZSkgeworICAgIGNhc2UgTUQ1OiAgICAgYXZfbWQ1X3VwZGF0ZShjdHgtPmN0eCwgc3JjLCBsZW4pOyBicmVhazsKKyAgICBjYXNlIE1VUk1VUjM6IGF2X211cm11cjNfdXBkYXRlKGN0eC0+Y3R4LCBzcmMsIGxlbik7IGJyZWFrOworICAgIGNhc2UgUklQRU1EMTI4OgorICAgIGNhc2UgUklQRU1EMTYwOgorICAgIGNhc2UgUklQRU1EMjU2OgorICAgIGNhc2UgUklQRU1EMzIwOiBhdl9yaXBlbWRfdXBkYXRlKGN0eC0+Y3R4LCBzcmMsIGxlbik7IGJyZWFrOworICAgIGNhc2UgU0hBMTYwOgorICAgIGNhc2UgU0hBMjI0OgorICAgIGNhc2UgU0hBMjU2OiAgYXZfc2hhX3VwZGF0ZShjdHgtPmN0eCwgc3JjLCBsZW4pOyBicmVhazsKKyAgICBjYXNlIFNIQTUxMl8yMjQ6CisgICAgY2FzZSBTSEE1MTJfMjU2OgorICAgIGNhc2UgU0hBMzg0OgorICAgIGNhc2UgU0hBNTEyOiAgYXZfc2hhNTEyX3VwZGF0ZShjdHgtPmN0eCwgc3JjLCBsZW4pOyBicmVhazsKKyAgICBjYXNlIENSQzMyOiAgIGN0eC0+Y3JjID0gYXZfY3JjKGN0eC0+Y3JjdGFiLCBjdHgtPmNyYywgc3JjLCBsZW4pOyBicmVhazsKKyAgICBjYXNlIEFETEVSMzI6IGN0eC0+Y3JjID0gYXZfYWRsZXIzMl91cGRhdGUoY3R4LT5jcmMsIHNyYywgbGVuKTsgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGF2X2hhc2hfZmluYWwoQVZIYXNoQ29udGV4dCAqY3R4LCB1aW50OF90ICpkc3QpCit7CisgICAgc3dpdGNoIChjdHgtPnR5cGUpIHsKKyAgICBjYXNlIE1ENTogICAgIGF2X21kNV9maW5hbChjdHgtPmN0eCwgZHN0KTsgYnJlYWs7CisgICAgY2FzZSBNVVJNVVIzOiBhdl9tdXJtdXIzX2ZpbmFsKGN0eC0+Y3R4LCBkc3QpOyBicmVhazsKKyAgICBjYXNlIFJJUEVNRDEyODoKKyAgICBjYXNlIFJJUEVNRDE2MDoKKyAgICBjYXNlIFJJUEVNRDI1NjoKKyAgICBjYXNlIFJJUEVNRDMyMDogYXZfcmlwZW1kX2ZpbmFsKGN0eC0+Y3R4LCBkc3QpOyBicmVhazsKKyAgICBjYXNlIFNIQTE2MDoKKyAgICBjYXNlIFNIQTIyNDoKKyAgICBjYXNlIFNIQTI1NjogIGF2X3NoYV9maW5hbChjdHgtPmN0eCwgZHN0KTsgYnJlYWs7CisgICAgY2FzZSBTSEE1MTJfMjI0OgorICAgIGNhc2UgU0hBNTEyXzI1NjoKKyAgICBjYXNlIFNIQTM4NDoKKyAgICBjYXNlIFNIQTUxMjogIGF2X3NoYTUxMl9maW5hbChjdHgtPmN0eCwgZHN0KTsgYnJlYWs7CisgICAgY2FzZSBDUkMzMjogICBBVl9XQjMyKGRzdCwgY3R4LT5jcmMgXiBVSU5UMzJfTUFYKTsgYnJlYWs7CisgICAgY2FzZSBBRExFUjMyOiBBVl9XQjMyKGRzdCwgY3R4LT5jcmMpOyBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgYXZfaGFzaF9maW5hbF9iaW4oc3RydWN0IEFWSGFzaENvbnRleHQgKmN0eCwgdWludDhfdCAqZHN0LCBpbnQgc2l6ZSkKK3sKKyAgICB1aW50OF90IGJ1ZltBVl9IQVNIX01BWF9TSVpFXTsKKyAgICB1bnNpZ25lZCByc2l6ZSA9IGF2X2hhc2hfZ2V0X3NpemUoY3R4KTsKKworICAgIGF2X2hhc2hfZmluYWwoY3R4LCBidWYpOworICAgIG1lbWNweShkc3QsIGJ1ZiwgRkZNSU4oc2l6ZSwgcnNpemUpKTsKKyAgICBpZiAoc2l6ZSA+IHJzaXplKQorICAgICAgICBtZW1zZXQoZHN0ICsgcnNpemUsIDAsIHNpemUgLSByc2l6ZSk7Cit9CisKK3ZvaWQgYXZfaGFzaF9maW5hbF9oZXgoc3RydWN0IEFWSGFzaENvbnRleHQgKmN0eCwgdWludDhfdCAqZHN0LCBpbnQgc2l6ZSkKK3sKKyAgICB1aW50OF90IGJ1ZltBVl9IQVNIX01BWF9TSVpFXTsKKyAgICB1bnNpZ25lZCByc2l6ZSA9IGF2X2hhc2hfZ2V0X3NpemUoY3R4KSwgaTsKKworICAgIGF2X2hhc2hfZmluYWwoY3R4LCBidWYpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRk1JTihyc2l6ZSwgc2l6ZSAvIDIpOyBpKyspCisgICAgICAgIHNucHJpbnRmKGRzdCArIGkgKiAyLCBzaXplIC0gaSAqIDIsICIlMDJ4IiwgYnVmW2ldKTsKK30KKwordm9pZCBhdl9oYXNoX2ZpbmFsX2I2NChzdHJ1Y3QgQVZIYXNoQ29udGV4dCAqY3R4LCB1aW50OF90ICpkc3QsIGludCBzaXplKQoreworICAgIHVpbnQ4X3QgYnVmW0FWX0hBU0hfTUFYX1NJWkVdLCBiNjRbQVZfQkFTRTY0X1NJWkUoQVZfSEFTSF9NQVhfU0laRSldOworICAgIHVuc2lnbmVkIHJzaXplID0gYXZfaGFzaF9nZXRfc2l6ZShjdHgpLCBvc2l6ZTsKKworICAgIGF2X2hhc2hfZmluYWwoY3R4LCBidWYpOworICAgIGF2X2Jhc2U2NF9lbmNvZGUoYjY0LCBzaXplb2YoYjY0KSwgYnVmLCByc2l6ZSk7CisgICAgb3NpemUgPSBBVl9CQVNFNjRfU0laRShyc2l6ZSk7CisgICAgbWVtY3B5KGRzdCwgYjY0LCBGRk1JTihvc2l6ZSwgc2l6ZSkpOworICAgIGlmIChzaXplIDwgb3NpemUpCisgICAgICAgIGRzdFtzaXplIC0gMV0gPSAwOworfQorCit2b2lkIGF2X2hhc2hfZnJlZXAoQVZIYXNoQ29udGV4dCAqKmN0eCkKK3sKKyAgICBpZiAoKmN0eCkKKyAgICAgICAgYXZfZnJlZXAoJigqY3R4KS0+Y3R4KTsKKyAgICBhdl9mcmVlcChjdHgpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9oYXNoLmggYi9mZm1wZWcvbGliYXZ1dGlsL2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGJjYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9oYXNoLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfSEFTSF9ICisjZGVmaW5lIEFWVVRJTF9IQVNIX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdHJ1Y3QgQVZIYXNoQ29udGV4dDsKKworLyoqCisgKiBBbGxvY2F0ZSBhIGhhc2ggY29udGV4dCBmb3IgdGhlIGFsZ29yaXRobSBzcGVjaWZpZWQgYnkgbmFtZS4KKyAqCisgKiBAcmV0dXJuICA+PSAwIGZvciBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUKKyAqIEBub3RlICBUaGUgY29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQsIHlvdSBtdXN0IGNhbGwgYXZfaGFzaF9pbml0KCkuCisgKi8KK2ludCBhdl9oYXNoX2FsbG9jKHN0cnVjdCBBVkhhc2hDb250ZXh0ICoqY3R4LCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBHZXQgdGhlIG5hbWVzIG9mIGF2YWlsYWJsZSBoYXNoIGFsZ29yaXRobXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBlbnVtZXJhdGUgdGhlIGFsZ29yaXRobXMuCisgKgorICogQHBhcmFtIGkgIGluZGV4IG9mIHRoZSBoYXNoIGFsZ29yaXRobSwgc3RhcnRpbmcgZnJvbSAwCisgKiBAcmV0dXJuICAgYSBwb2ludGVyIHRvIGEgc3RhdGljIHN0cmluZyBvciBOVUxMIGlmIGkgaXMgb3V0IG9mIHJhbmdlCisgKi8KK2NvbnN0IGNoYXIgKmF2X2hhc2hfbmFtZXMoaW50IGkpOworCisvKioKKyAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGhhc2ggY29udGV4dC4KKyAqLworY29uc3QgY2hhciAqYXZfaGFzaF9nZXRfbmFtZShjb25zdCBzdHJ1Y3QgQVZIYXNoQ29udGV4dCAqY3R4KTsKKworLyoqCisgKiBNYXhpbXVtIHZhbHVlIHRoYXQgYXZfaGFzaF9nZXRfc2l6ZSB3aWxsIGN1cnJlbnRseSByZXR1cm4uCisgKgorICogWW91IGNhbiB1c2UgdGhpcyBpZiB5b3UgYWJzb2x1dGVseSB3YW50IG9yIG5lZWQgdG8gdXNlIHN0YXRpYyBhbGxvY2F0aW9uCisgKiBhbmQgYXJlIGZpbmUgd2l0aCBub3Qgc3VwcG9ydGluZyBoYXNoZXMgbmV3bHkgYWRkZWQgdG8gbGliYXZ1dGlsIHdpdGhvdXQKKyAqIHJlY29tcGlsYXRpb24uCisgKiBOb3RlIHRoYXQgeW91IHN0aWxsIG5lZWQgdG8gY2hlY2sgYWdhaW5zdCBhdl9oYXNoX2dldF9zaXplLCBhZGRpbmcgbmV3IGhhc2hlcworICogd2l0aCBsYXJnZXIgc2l6ZXMgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBhbiBBQkkgY2hhbmdlIGFuZCBzaG91bGQgbm90IGNhdXNlCisgKiB5b3VyIGNvZGUgdG8gb3ZlcmZsb3cgYSBidWZmZXIuCisgKi8KKyNkZWZpbmUgQVZfSEFTSF9NQVhfU0laRSA2NAorCisvKioKKyAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGhhc2ggdmFsdWUgaW4gYnl0ZXMuCisgKgorICogVGhlIHBvaW50ZXIgcGFzc2VkIHRvIGF2X2hhc2hfZmluYWwgaGF2ZSBzcGFjZSBmb3IgYXQgbGVhc3QgdGhpcyBtYW55IGJ5dGVzLgorICovCitpbnQgYXZfaGFzaF9nZXRfc2l6ZShjb25zdCBzdHJ1Y3QgQVZIYXNoQ29udGV4dCAqY3R4KTsKKworLyoqCisgKiBJbml0aWFsaXplIG9yIHJlc2V0IGEgaGFzaCBjb250ZXh0LgorICovCit2b2lkIGF2X2hhc2hfaW5pdChzdHJ1Y3QgQVZIYXNoQ29udGV4dCAqY3R4KTsKKworLyoqCisgKiBVcGRhdGUgYSBoYXNoIGNvbnRleHQgd2l0aCBhZGRpdGlvbmFsIGRhdGEuCisgKi8KK3ZvaWQgYXZfaGFzaF91cGRhdGUoc3RydWN0IEFWSGFzaENvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgbGVuKTsKKworLyoqCisgKiBGaW5hbGl6ZSBhIGhhc2ggY29udGV4dCBhbmQgY29tcHV0ZSB0aGUgYWN0dWFsIGhhc2ggdmFsdWUuCisgKi8KK3ZvaWQgYXZfaGFzaF9maW5hbChzdHJ1Y3QgQVZIYXNoQ29udGV4dCAqY3R4LCB1aW50OF90ICpkc3QpOworCisvKioKKyAqIEZpbmFsaXplIGEgaGFzaCBjb250ZXh0IGFuZCBjb21wdXRlIHRoZSBhY3R1YWwgaGFzaCB2YWx1ZS4KKyAqIElmIHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSBoYXNoIHNpemUsIHRoZSBoYXNoIGlzIHRydW5jYXRlZDsKKyAqIGlmIHNpemUgaXMgbGFyZ2VyLCB0aGUgYnVmZmVyIGlzIHBhZGRlZCB3aXRoIDAuCisgKi8KK3ZvaWQgYXZfaGFzaF9maW5hbF9iaW4oc3RydWN0IEFWSGFzaENvbnRleHQgKmN0eCwgdWludDhfdCAqZHN0LCBpbnQgc2l6ZSk7CisKKy8qKgorICogRmluYWxpemUgYSBoYXNoIGNvbnRleHQgYW5kIGNvbXB1dGUgdGhlIGFjdHVhbCBoYXNoIHZhbHVlIGFzIGEgaGV4IHN0cmluZy4KKyAqIFRoZSBzdHJpbmcgaXMgYWx3YXlzIDAtdGVybWluYXRlZC4KKyAqIElmIHNpemUgaXMgc21hbGxlciB0aGFuIDIgKiBoYXNoX3NpemUgKyAxLCB0aGUgaGV4IHN0cmluZyBpcyB0cnVuY2F0ZWQuCisgKi8KK3ZvaWQgYXZfaGFzaF9maW5hbF9oZXgoc3RydWN0IEFWSGFzaENvbnRleHQgKmN0eCwgdWludDhfdCAqZHN0LCBpbnQgc2l6ZSk7CisKKy8qKgorICogRmluYWxpemUgYSBoYXNoIGNvbnRleHQgYW5kIGNvbXB1dGUgdGhlIGFjdHVhbCBoYXNoIHZhbHVlIGFzIGEgYmFzZTY0IHN0cmluZy4KKyAqIFRoZSBzdHJpbmcgaXMgYWx3YXlzIDAtdGVybWluYXRlZC4KKyAqIElmIHNpemUgaXMgc21hbGxlciB0aGFuIEFWX0JBU0U2NF9TSVpFKGhhc2hfc2l6ZSksIHRoZSBiYXNlNjQgc3RyaW5nIGlzCisgKiB0cnVuY2F0ZWQuCisgKi8KK3ZvaWQgYXZfaGFzaF9maW5hbF9iNjQoc3RydWN0IEFWSGFzaENvbnRleHQgKmN0eCwgdWludDhfdCAqZHN0LCBpbnQgc2l6ZSk7CisKKy8qKgorICogRnJlZSBoYXNoIGNvbnRleHQuCisgKi8KK3ZvaWQgYXZfaGFzaF9mcmVlcChzdHJ1Y3QgQVZIYXNoQ29udGV4dCAqKmN0eCk7CisKKyNlbmRpZiAvKiBBVlVUSUxfSEFTSF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2htYWMuYyBiL2ZmbXBlZy9saWJhdnV0aWwvaG1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYmRjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2htYWMuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiaG1hYy5oIgorI2luY2x1ZGUgIm1kNS5oIgorI2luY2x1ZGUgInNoYS5oIgorI2luY2x1ZGUgInNoYTUxMi5oIgorI2luY2x1ZGUgIm1lbS5oIgorCisjZGVmaW5lIE1BWF9IQVNITEVOIDY0CisjZGVmaW5lIE1BWF9CTE9DS0xFTiAxMjgKKworc3RydWN0IEFWSE1BQyB7CisgICAgdm9pZCAqaGFzaDsKKyAgICBpbnQgYmxvY2tsZW4sIGhhc2hsZW47CisgICAgdm9pZCAoKmZpbmFsKSh2b2lkKiwgdWludDhfdCopOworICAgIHZvaWQgKCp1cGRhdGUpKHZvaWQqLCBjb25zdCB1aW50OF90KiwgaW50IGxlbik7CisgICAgdm9pZCAoKmluaXQpKHZvaWQqKTsKKyAgICB1aW50OF90IGtleVtNQVhfQkxPQ0tMRU5dOworICAgIGludCBrZXlsZW47Cit9OworCisjZGVmaW5lIERFRklORV9TSEEoYml0cykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgYXZfY29sZCB2b2lkIHNoYSAjIyBiaXRzICMjX2luaXQodm9pZCAqY3R4KSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZfc2hhX2luaXQoY3R4LCBiaXRzKTsgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgREVGSU5FX1NIQTUxMihiaXRzKSAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBhdl9jb2xkIHZvaWQgc2hhICMjIGJpdHMgIyNfaW5pdCh2b2lkICpjdHgpIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdl9zaGE1MTJfaW5pdChjdHgsIGJpdHMpOyAgICAgICAgICAgICAgICAgICAgIFwKK30KKworREVGSU5FX1NIQSgxNjApCitERUZJTkVfU0hBKDIyNCkKK0RFRklORV9TSEEoMjU2KQorREVGSU5FX1NIQTUxMigzODQpCitERUZJTkVfU0hBNTEyKDUxMikKKworQVZITUFDICphdl9obWFjX2FsbG9jKGVudW0gQVZITUFDVHlwZSB0eXBlKQoreworICAgIEFWSE1BQyAqYyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpjKSk7CisgICAgaWYgKCFjKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFWX0hNQUNfTUQ1OgorICAgICAgICBjLT5ibG9ja2xlbiA9IDY0OworICAgICAgICBjLT5oYXNobGVuICA9IDE2OworICAgICAgICBjLT5pbml0ICAgICA9ICh2b2lkKilhdl9tZDVfaW5pdDsKKyAgICAgICAgYy0+dXBkYXRlICAgPSAodm9pZCopYXZfbWQ1X3VwZGF0ZTsKKyAgICAgICAgYy0+ZmluYWwgICAgPSAodm9pZCopYXZfbWQ1X2ZpbmFsOworICAgICAgICBjLT5oYXNoICAgICA9IGF2X21kNV9hbGxvYygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0hNQUNfU0hBMToKKyAgICAgICAgYy0+YmxvY2tsZW4gPSA2NDsKKyAgICAgICAgYy0+aGFzaGxlbiAgPSAyMDsKKyAgICAgICAgYy0+aW5pdCAgICAgPSBzaGExNjBfaW5pdDsKKyAgICAgICAgYy0+dXBkYXRlICAgPSAodm9pZCopYXZfc2hhX3VwZGF0ZTsKKyAgICAgICAgYy0+ZmluYWwgICAgPSAodm9pZCopYXZfc2hhX2ZpbmFsOworICAgICAgICBjLT5oYXNoICAgICA9IGF2X3NoYV9hbGxvYygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0hNQUNfU0hBMjI0OgorICAgICAgICBjLT5ibG9ja2xlbiA9IDY0OworICAgICAgICBjLT5oYXNobGVuICA9IDI4OworICAgICAgICBjLT5pbml0ICAgICA9IHNoYTIyNF9pbml0OworICAgICAgICBjLT51cGRhdGUgICA9ICh2b2lkKilhdl9zaGFfdXBkYXRlOworICAgICAgICBjLT5maW5hbCAgICA9ICh2b2lkKilhdl9zaGFfZmluYWw7CisgICAgICAgIGMtPmhhc2ggICAgID0gYXZfc2hhX2FsbG9jKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfSE1BQ19TSEEyNTY6CisgICAgICAgIGMtPmJsb2NrbGVuID0gNjQ7CisgICAgICAgIGMtPmhhc2hsZW4gID0gMzI7CisgICAgICAgIGMtPmluaXQgICAgID0gc2hhMjU2X2luaXQ7CisgICAgICAgIGMtPnVwZGF0ZSAgID0gKHZvaWQqKWF2X3NoYV91cGRhdGU7CisgICAgICAgIGMtPmZpbmFsICAgID0gKHZvaWQqKWF2X3NoYV9maW5hbDsKKyAgICAgICAgYy0+aGFzaCAgICAgPSBhdl9zaGFfYWxsb2MoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9ITUFDX1NIQTM4NDoKKyAgICAgICAgYy0+YmxvY2tsZW4gPSAxMjg7CisgICAgICAgIGMtPmhhc2hsZW4gID0gNDg7CisgICAgICAgIGMtPmluaXQgICAgID0gc2hhMzg0X2luaXQ7CisgICAgICAgIGMtPnVwZGF0ZSAgID0gKHZvaWQqKWF2X3NoYTUxMl91cGRhdGU7CisgICAgICAgIGMtPmZpbmFsICAgID0gKHZvaWQqKWF2X3NoYTUxMl9maW5hbDsKKyAgICAgICAgYy0+aGFzaCAgICAgPSBhdl9zaGE1MTJfYWxsb2MoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9ITUFDX1NIQTUxMjoKKyAgICAgICAgYy0+YmxvY2tsZW4gPSAxMjg7CisgICAgICAgIGMtPmhhc2hsZW4gID0gNjQ7CisgICAgICAgIGMtPmluaXQgICAgID0gc2hhNTEyX2luaXQ7CisgICAgICAgIGMtPnVwZGF0ZSAgID0gKHZvaWQqKWF2X3NoYTUxMl91cGRhdGU7CisgICAgICAgIGMtPmZpbmFsICAgID0gKHZvaWQqKWF2X3NoYTUxMl9maW5hbDsKKyAgICAgICAgYy0+aGFzaCAgICAgPSBhdl9zaGE1MTJfYWxsb2MoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfZnJlZShjKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghYy0+aGFzaCkgeworICAgICAgICBhdl9mcmVlKGMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGM7Cit9CisKK3ZvaWQgYXZfaG1hY19mcmVlKEFWSE1BQyAqYykKK3sKKyAgICBpZiAoIWMpCisgICAgICAgIHJldHVybjsKKyAgICBhdl9mcmVlKGMtPmhhc2gpOworICAgIGF2X2ZyZWUoYyk7Cit9CisKK3ZvaWQgYXZfaG1hY19pbml0KEFWSE1BQyAqYywgY29uc3QgdWludDhfdCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworICAgIGludCBpOworICAgIHVpbnQ4X3QgYmxvY2tbTUFYX0JMT0NLTEVOXTsKKyAgICBpZiAoa2V5bGVuID4gYy0+YmxvY2tsZW4pIHsKKyAgICAgICAgYy0+aW5pdChjLT5oYXNoKTsKKyAgICAgICAgYy0+dXBkYXRlKGMtPmhhc2gsIGtleSwga2V5bGVuKTsKKyAgICAgICAgYy0+ZmluYWwoYy0+aGFzaCwgYy0+a2V5KTsKKyAgICAgICAgYy0+a2V5bGVuID0gYy0+aGFzaGxlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkoYy0+a2V5LCBrZXksIGtleWxlbik7CisgICAgICAgIGMtPmtleWxlbiA9IGtleWxlbjsKKyAgICB9CisgICAgYy0+aW5pdChjLT5oYXNoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+a2V5bGVuOyBpKyspCisgICAgICAgIGJsb2NrW2ldID0gYy0+a2V5W2ldIF4gMHgzNjsKKyAgICBmb3IgKGkgPSBjLT5rZXlsZW47IGkgPCBjLT5ibG9ja2xlbjsgaSsrKQorICAgICAgICBibG9ja1tpXSA9IDB4MzY7CisgICAgYy0+dXBkYXRlKGMtPmhhc2gsIGJsb2NrLCBjLT5ibG9ja2xlbik7Cit9CisKK3ZvaWQgYXZfaG1hY191cGRhdGUoQVZITUFDICpjLCBjb25zdCB1aW50OF90ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworICAgIGMtPnVwZGF0ZShjLT5oYXNoLCBkYXRhLCBsZW4pOworfQorCitpbnQgYXZfaG1hY19maW5hbChBVkhNQUMgKmMsIHVpbnQ4X3QgKm91dCwgdW5zaWduZWQgaW50IG91dGxlbikKK3sKKyAgICB1aW50OF90IGJsb2NrW01BWF9CTE9DS0xFTl07CisgICAgaW50IGk7CisgICAgaWYgKG91dGxlbiA8IGMtPmhhc2hsZW4pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgYy0+ZmluYWwoYy0+aGFzaCwgb3V0KTsKKyAgICBjLT5pbml0KGMtPmhhc2gpOworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5rZXlsZW47IGkrKykKKyAgICAgICAgYmxvY2tbaV0gPSBjLT5rZXlbaV0gXiAweDVDOworICAgIGZvciAoaSA9IGMtPmtleWxlbjsgaSA8IGMtPmJsb2NrbGVuOyBpKyspCisgICAgICAgIGJsb2NrW2ldID0gMHg1QzsKKyAgICBjLT51cGRhdGUoYy0+aGFzaCwgYmxvY2ssIGMtPmJsb2NrbGVuKTsKKyAgICBjLT51cGRhdGUoYy0+aGFzaCwgb3V0LCBjLT5oYXNobGVuKTsKKyAgICBjLT5maW5hbChjLT5oYXNoLCBvdXQpOworICAgIHJldHVybiBjLT5oYXNobGVuOworfQorCitpbnQgYXZfaG1hY19jYWxjKEFWSE1BQyAqYywgY29uc3QgdWludDhfdCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuLAorICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQsIHVuc2lnbmVkIGludCBvdXRsZW4pCit7CisgICAgYXZfaG1hY19pbml0KGMsIGtleSwga2V5bGVuKTsKKyAgICBhdl9obWFjX3VwZGF0ZShjLCBkYXRhLCBsZW4pOworICAgIHJldHVybiBhdl9obWFjX2ZpbmFsKGMsIG91dCwgb3V0bGVuKTsKK30KKworI2lmZGVmIFRFU1QKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgdm9pZCB0ZXN0KEFWSE1BQyAqaG1hYywgY29uc3QgdWludDhfdCAqa2V5LCBpbnQga2V5bGVuLAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgZGF0YWxlbikKK3sKKyAgICB1aW50OF90IGJ1ZltNQVhfSEFTSExFTl07CisgICAgaW50IG91dCwgaTsKKyAgICAvLyBTb21lIG9mIHRoZSB0ZXN0IHZlY3RvcnMgYXJlIHN0cmluZ3MsIHdoZXJlIHNpemVvZigpIGluY2x1ZGVzIHRoZQorICAgIC8vIHRyYWlsaW5nIG51bGwgYnl0ZSAtIHJlbW92ZSB0aGF0LgorICAgIGlmICgha2V5W2tleWxlbiAtIDFdKQorICAgICAgICBrZXlsZW4tLTsKKyAgICBpZiAoIWRhdGFbZGF0YWxlbiAtIDFdKQorICAgICAgICBkYXRhbGVuLS07CisgICAgb3V0ID0gYXZfaG1hY19jYWxjKGhtYWMsIGRhdGEsIGRhdGFsZW4sIGtleSwga2V5bGVuLCBidWYsIHNpemVvZihidWYpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3V0OyBpKyspCisgICAgICAgIHByaW50ZigiJTAyeCIsIGJ1ZltpXSk7CisgICAgcHJpbnRmKCJcbiIpOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIHVpbnQ4X3Qga2V5MVsyMF0sIGtleTNbMTMxXSwgZGF0YTNbNTBdOworICAgIGVudW0gQVZITUFDVHlwZSBpID0gQVZfSE1BQ19TSEEyMjQ7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga2V5MltdICA9ICJKZWZlIjsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkYXRhMVtdID0gIkhpIFRoZXJlIjsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkYXRhMltdID0gIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRhdGE0W10gPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IjsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkYXRhNVtdID0gIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgYW5kIExhcmdlciBUaGFuIE9uZSBCbG9jay1TaXplIERhdGEiOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRhdGE2W10gPSAiVGhpcyBpcyBhIHRlc3QgdXNpbmcgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGtleSBhbmQgYSBsYXJnZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFuIGJsb2NrLXNpemUgZGF0YS4gVGhlIGtleSBuZWVkcyB0byBiZSBoYXNoZWQgYmVmb3JlIGJlaW5nIHVzZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBieSB0aGUgSE1BQyBhbGdvcml0aG0uIjsKKyAgICBBVkhNQUMgKmhtYWMgPSBhdl9obWFjX2FsbG9jKEFWX0hNQUNfTUQ1KTsKKyAgICBpZiAoIWhtYWMpCisgICAgICAgIHJldHVybiAxOworICAgIG1lbXNldChrZXkxLCAweDBiLCBzaXplb2Yoa2V5MSkpOworICAgIG1lbXNldChrZXkzLCAweGFhLCBzaXplb2Yoa2V5MykpOworICAgIG1lbXNldChkYXRhMywgMHhkZCwgc2l6ZW9mKGRhdGEzKSk7CisgICAgLy8gUkZDIDIyMDIgdGVzdCB2ZWN0b3JzCisgICAgdGVzdChobWFjLCBrZXkxLCAxNiwgZGF0YTEsIHNpemVvZihkYXRhMSkpOworICAgIHRlc3QoaG1hYywga2V5Miwgc2l6ZW9mKGtleTIpLCBkYXRhMiwgc2l6ZW9mKGRhdGEyKSk7CisgICAgdGVzdChobWFjLCBrZXkzLCAxNiwgZGF0YTMsIHNpemVvZihkYXRhMykpOworICAgIHRlc3QoaG1hYywga2V5MywgODAsIGRhdGE0LCBzaXplb2YoZGF0YTQpKTsKKyAgICB0ZXN0KGhtYWMsIGtleTMsIDgwLCBkYXRhNSwgc2l6ZW9mKGRhdGE1KSk7CisgICAgYXZfaG1hY19mcmVlKGhtYWMpOworCisgICAgLyogU0hBLTEgKi8KKyAgICBobWFjID0gYXZfaG1hY19hbGxvYyhBVl9ITUFDX1NIQTEpOworICAgIGlmICghaG1hYykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgLy8gUkZDIDIyMDIgdGVzdCB2ZWN0b3JzCisgICAgdGVzdChobWFjLCBrZXkxLCBzaXplb2Yoa2V5MSksIGRhdGExLCBzaXplb2YoZGF0YTEpKTsKKyAgICB0ZXN0KGhtYWMsIGtleTIsIHNpemVvZihrZXkyKSwgZGF0YTIsIHNpemVvZihkYXRhMikpOworICAgIHRlc3QoaG1hYywga2V5MywgMjAsIGRhdGEzLCBzaXplb2YoZGF0YTMpKTsKKyAgICB0ZXN0KGhtYWMsIGtleTMsIDgwLCBkYXRhNCwgc2l6ZW9mKGRhdGE0KSk7CisgICAgdGVzdChobWFjLCBrZXkzLCA4MCwgZGF0YTUsIHNpemVvZihkYXRhNSkpOworICAgIGF2X2htYWNfZnJlZShobWFjKTsKKworICAgIC8qIFNIQS0yICovCisgICAgd2hpbGUgKGkgPD0gQVZfSE1BQ19TSEE1MTIpIHsKKyAgICAgICAgaG1hYyA9IGF2X2htYWNfYWxsb2MoaSk7CisgICAgICAgIC8vIFJGQyA0MjMxIHRlc3QgdmVjdG9ycworICAgICAgICB0ZXN0KGhtYWMsIGtleTEsIHNpemVvZihrZXkxKSwgZGF0YTEsIHNpemVvZihkYXRhMSkpOworICAgICAgICB0ZXN0KGhtYWMsIGtleTIsIHNpemVvZihrZXkyKSwgZGF0YTIsIHNpemVvZihkYXRhMikpOworICAgICAgICB0ZXN0KGhtYWMsIGtleTMsIDIwLCBkYXRhMywgc2l6ZW9mKGRhdGEzKSk7CisgICAgICAgIHRlc3QoaG1hYywga2V5Mywgc2l6ZW9mKGtleTMpLCBkYXRhNCwgc2l6ZW9mKGRhdGE0KSk7CisgICAgICAgIHRlc3QoaG1hYywga2V5Mywgc2l6ZW9mKGtleTMpLCBkYXRhNiwgc2l6ZW9mKGRhdGE2KSk7CisgICAgICAgIGF2X2htYWNfZnJlZShobWFjKTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2htYWMuaCBiL2ZmbXBlZy9saWJhdnV0aWwvaG1hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNmQ0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2htYWMuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0hNQUNfSAorI2RlZmluZSBBVlVUSUxfSE1BQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2dV9obWFjIEhNQUMKKyAqIEBpbmdyb3VwIGxhdnVfY3J5cHRvCisgKiBAeworICovCisKK2VudW0gQVZITUFDVHlwZSB7CisgICAgQVZfSE1BQ19NRDUsCisgICAgQVZfSE1BQ19TSEExLAorICAgIEFWX0hNQUNfU0hBMjI0ID0gMTAsCisgICAgQVZfSE1BQ19TSEEyNTYsCisgICAgQVZfSE1BQ19TSEEzODQsCisgICAgQVZfSE1BQ19TSEE1MTIsCit9OworCit0eXBlZGVmIHN0cnVjdCBBVkhNQUMgQVZITUFDOworCisvKioKKyAqIEFsbG9jYXRlIGFuIEFWSE1BQyBjb250ZXh0LgorICogQHBhcmFtIHR5cGUgVGhlIGhhc2ggZnVuY3Rpb24gdXNlZCBmb3IgdGhlIEhNQUMuCisgKi8KK0FWSE1BQyAqYXZfaG1hY19hbGxvYyhlbnVtIEFWSE1BQ1R5cGUgdHlwZSk7CisKKy8qKgorICogRnJlZSBhbiBBVkhNQUMgY29udGV4dC4KKyAqIEBwYXJhbSBjdHggVGhlIGNvbnRleHQgdG8gZnJlZSwgbWF5IGJlIE5VTEwKKyAqLwordm9pZCBhdl9obWFjX2ZyZWUoQVZITUFDICpjdHgpOworCisvKioKKyAqIEluaXRpYWxpemUgYW4gQVZITUFDIGNvbnRleHQgd2l0aCBhbiBhdXRoZW50aWNhdGlvbiBrZXkuCisgKiBAcGFyYW0gY3R4ICAgIFRoZSBITUFDIGNvbnRleHQKKyAqIEBwYXJhbSBrZXkgICAgVGhlIGF1dGhlbnRpY2F0aW9uIGtleQorICogQHBhcmFtIGtleWxlbiBUaGUgbGVuZ3RoIG9mIHRoZSBrZXksIGluIGJ5dGVzCisgKi8KK3ZvaWQgYXZfaG1hY19pbml0KEFWSE1BQyAqY3R4LCBjb25zdCB1aW50OF90ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOworCisvKioKKyAqIEhhc2ggZGF0YSB3aXRoIHRoZSBITUFDLgorICogQHBhcmFtIGN0eCAgVGhlIEhNQUMgY29udGV4dAorICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gaGFzaAorICogQHBhcmFtIGxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSwgaW4gYnl0ZXMKKyAqLwordm9pZCBhdl9obWFjX3VwZGF0ZShBVkhNQUMgKmN0eCwgY29uc3QgdWludDhfdCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbik7CisKKy8qKgorICogRmluaXNoIGhhc2hpbmcgYW5kIG91dHB1dCB0aGUgSE1BQyBkaWdlc3QuCisgKiBAcGFyYW0gY3R4ICAgIFRoZSBITUFDIGNvbnRleHQKKyAqIEBwYXJhbSBvdXQgICAgVGhlIG91dHB1dCBidWZmZXIgdG8gd3JpdGUgdGhlIGRpZ2VzdCBpbnRvCisgKiBAcGFyYW0gb3V0bGVuIFRoZSBsZW5ndGggb2YgdGhlIG91dCBidWZmZXIsIGluIGJ5dGVzCisgKiBAcmV0dXJuICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBvdXQsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IGF2X2htYWNfZmluYWwoQVZITUFDICpjdHgsIHVpbnQ4X3QgKm91dCwgdW5zaWduZWQgaW50IG91dGxlbik7CisKKy8qKgorICogSGFzaCBhbiBhcnJheSBvZiBkYXRhIHdpdGggYSBrZXkuCisgKiBAcGFyYW0gY3R4ICAgIFRoZSBITUFDIGNvbnRleHQKKyAqIEBwYXJhbSBkYXRhICAgVGhlIGRhdGEgdG8gaGFzaAorICogQHBhcmFtIGxlbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhLCBpbiBieXRlcworICogQHBhcmFtIGtleSAgICBUaGUgYXV0aGVudGljYXRpb24ga2V5CisgKiBAcGFyYW0ga2V5bGVuIFRoZSBsZW5ndGggb2YgdGhlIGtleSwgaW4gYnl0ZXMKKyAqIEBwYXJhbSBvdXQgICAgVGhlIG91dHB1dCBidWZmZXIgdG8gd3JpdGUgdGhlIGRpZ2VzdCBpbnRvCisgKiBAcGFyYW0gb3V0bGVuIFRoZSBsZW5ndGggb2YgdGhlIG91dCBidWZmZXIsIGluIGJ5dGVzCisgKiBAcmV0dXJuICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBvdXQsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IGF2X2htYWNfY2FsYyhBVkhNQUMgKmN0eCwgY29uc3QgdWludDhfdCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuLAorICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQsIHVuc2lnbmVkIGludCBvdXRsZW4pOworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9ITUFDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvaW1ndXRpbHMuYyBiL2ZmbXBlZy9saWJhdnV0aWwvaW1ndXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjMwMzJiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9pbWd1dGlscy5jCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIG1pc2MgaW1hZ2UgdXRpbGl0aWVzCisgKi8KKworI2luY2x1ZGUgImF2YXNzZXJ0LmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAicGl4ZGVzYy5oIgorI2luY2x1ZGUgInJhdGlvbmFsLmgiCisKK3ZvaWQgYXZfaW1hZ2VfZmlsbF9tYXhfcGl4c3RlcHMoaW50IG1heF9waXhzdGVwc1s0XSwgaW50IG1heF9waXhzdGVwX2NvbXBzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeGRlc2MpCit7CisgICAgaW50IGk7CisgICAgbWVtc2V0KG1heF9waXhzdGVwcywgMCwgNCpzaXplb2YobWF4X3BpeHN0ZXBzWzBdKSk7CisgICAgaWYgKG1heF9waXhzdGVwX2NvbXBzKQorICAgICAgICBtZW1zZXQobWF4X3BpeHN0ZXBfY29tcHMsIDAsIDQqc2l6ZW9mKG1heF9waXhzdGVwX2NvbXBzWzBdKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGNvbnN0IEFWQ29tcG9uZW50RGVzY3JpcHRvciAqY29tcCA9ICYocGl4ZGVzYy0+Y29tcFtpXSk7CisgICAgICAgIGlmICgoY29tcC0+c3RlcF9taW51czErMSkgPiBtYXhfcGl4c3RlcHNbY29tcC0+cGxhbmVdKSB7CisgICAgICAgICAgICBtYXhfcGl4c3RlcHNbY29tcC0+cGxhbmVdID0gY29tcC0+c3RlcF9taW51czErMTsKKyAgICAgICAgICAgIGlmIChtYXhfcGl4c3RlcF9jb21wcykKKyAgICAgICAgICAgICAgICBtYXhfcGl4c3RlcF9jb21wc1tjb21wLT5wbGFuZV0gPSBpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lCitpbnQgaW1hZ2VfZ2V0X2xpbmVzaXplKGludCB3aWR0aCwgaW50IHBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3N0ZXAsIGludCBtYXhfc3RlcF9jb21wLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MpCit7CisgICAgaW50IHMsIHNoaWZ0ZWRfdywgbGluZXNpemU7CisKKyAgICBpZiAoIWRlc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAod2lkdGggPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIHMgPSAobWF4X3N0ZXBfY29tcCA9PSAxIHx8IG1heF9zdGVwX2NvbXAgPT0gMikgPyBkZXNjLT5sb2cyX2Nocm9tYV93IDogMDsKKyAgICBzaGlmdGVkX3cgPSAoKHdpZHRoICsgKDEgPDwgcykgLSAxKSkgPj4gczsKKyAgICBpZiAoc2hpZnRlZF93ICYmIG1heF9zdGVwID4gSU5UX01BWCAvIHNoaWZ0ZWRfdykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBsaW5lc2l6ZSA9IG1heF9zdGVwICogc2hpZnRlZF93OworCisgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JJVFNUUkVBTSkKKyAgICAgICAgbGluZXNpemUgPSAobGluZXNpemUgKyA3KSA+PiAzOworICAgIHJldHVybiBsaW5lc2l6ZTsKK30KKworaW50IGF2X2ltYWdlX2dldF9saW5lc2l6ZShlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHdpZHRoLCBpbnQgcGxhbmUpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBpbnQgbWF4X3N0ZXAgICAgIFs0XTsgICAgICAgLyogbWF4IHBpeGVsIHN0ZXAgZm9yIGVhY2ggcGxhbmUgKi8KKyAgICBpbnQgbWF4X3N0ZXBfY29tcFs0XTsgICAgICAgLyogdGhlIGNvbXBvbmVudCBmb3IgZWFjaCBwbGFuZSB3aGljaCBoYXMgdGhlIG1heCBwaXhlbCBzdGVwICovCisKKyAgICBpZiAoKHVuc2lnbmVkKXBpeF9mbXQgPj0gQVZfUElYX0ZNVF9OQiB8fCBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgYXZfaW1hZ2VfZmlsbF9tYXhfcGl4c3RlcHMobWF4X3N0ZXAsIG1heF9zdGVwX2NvbXAsIGRlc2MpOworICAgIHJldHVybiBpbWFnZV9nZXRfbGluZXNpemUod2lkdGgsIHBsYW5lLCBtYXhfc3RlcFtwbGFuZV0sIG1heF9zdGVwX2NvbXBbcGxhbmVdLCBkZXNjKTsKK30KKworaW50IGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKGludCBsaW5lc2l6ZXNbNF0sIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgpCit7CisgICAgaW50IGksIHJldDsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIGludCBtYXhfc3RlcCAgICAgWzRdOyAgICAgICAvKiBtYXggcGl4ZWwgc3RlcCBmb3IgZWFjaCBwbGFuZSAqLworICAgIGludCBtYXhfc3RlcF9jb21wWzRdOyAgICAgICAvKiB0aGUgY29tcG9uZW50IGZvciBlYWNoIHBsYW5lIHdoaWNoIGhhcyB0aGUgbWF4IHBpeGVsIHN0ZXAgKi8KKworICAgIG1lbXNldChsaW5lc2l6ZXMsIDAsIDQqc2l6ZW9mKGxpbmVzaXplc1swXSkpOworCisgICAgaWYgKCFkZXNjIHx8IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBhdl9pbWFnZV9maWxsX21heF9waXhzdGVwcyhtYXhfc3RlcCwgbWF4X3N0ZXBfY29tcCwgZGVzYyk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpZiAoKHJldCA9IGltYWdlX2dldF9saW5lc2l6ZSh3aWR0aCwgaSwgbWF4X3N0ZXBbaV0sIG1heF9zdGVwX2NvbXBbaV0sIGRlc2MpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBsaW5lc2l6ZXNbaV0gPSByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9pbWFnZV9maWxsX3BvaW50ZXJzKHVpbnQ4X3QgKmRhdGFbNF0sIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyLCBjb25zdCBpbnQgbGluZXNpemVzWzRdKQoreworICAgIGludCBpLCB0b3RhbF9zaXplLCBzaXplWzRdID0geyAwIH0sIGhhc19wbGFuZVs0XSA9IHsgMCB9OworCisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBtZW1zZXQoZGF0YSAgICAgLCAwLCBzaXplb2YoZGF0YVswXSkqNCk7CisKKyAgICBpZiAoIWRlc2MgfHwgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGRhdGFbMF0gPSBwdHI7CisgICAgaWYgKGxpbmVzaXplc1swXSA+IChJTlRfTUFYIC0gMTAyNCkgLyBoZWlnaHQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgc2l6ZVswXSA9IGxpbmVzaXplc1swXSAqIGhlaWdodDsKKworICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwKKyAgICAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKSB7CisgICAgICAgIHNpemVbMF0gPSAoc2l6ZVswXSArIDMpICYgfjM7CisgICAgICAgIGRhdGFbMV0gPSBwdHIgKyBzaXplWzBdOyAvKiBwYWxldHRlIGlzIHN0b3JlZCBoZXJlIGFzIDI1NiAzMiBiaXRzIHdvcmRzICovCisgICAgICAgIHJldHVybiBzaXplWzBdICsgMjU2ICogNDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBoYXNfcGxhbmVbZGVzYy0+Y29tcFtpXS5wbGFuZV0gPSAxOworCisgICAgdG90YWxfc2l6ZSA9IHNpemVbMF07CisgICAgZm9yIChpID0gMTsgaSA8IDQgJiYgaGFzX3BsYW5lW2ldOyBpKyspIHsKKyAgICAgICAgaW50IGgsIHMgPSAoaSA9PSAxIHx8IGkgPT0gMikgPyBkZXNjLT5sb2cyX2Nocm9tYV9oIDogMDsKKyAgICAgICAgZGF0YVtpXSA9IGRhdGFbaS0xXSArIHNpemVbaS0xXTsKKyAgICAgICAgaCA9IChoZWlnaHQgKyAoMSA8PCBzKSAtIDEpID4+IHM7CisgICAgICAgIGlmIChsaW5lc2l6ZXNbaV0gPiBJTlRfTUFYIC8gaCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIHNpemVbaV0gPSBoICogbGluZXNpemVzW2ldOworICAgICAgICBpZiAodG90YWxfc2l6ZSA+IElOVF9NQVggLSBzaXplW2ldKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgdG90YWxfc2l6ZSArPSBzaXplW2ldOworICAgIH0KKworICAgIHJldHVybiB0b3RhbF9zaXplOworfQorCitpbnQgYXZwcml2X3NldF9zeXN0ZW1hdGljX3BhbDIodWludDMyX3QgcGFsWzI1Nl0sIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGludCByLCBnLCBiOworCisgICAgICAgIHN3aXRjaCAocGl4X2ZtdCkgeworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCODoKKyAgICAgICAgICAgIHIgPSAoaT4+NSAgICApKjM2OworICAgICAgICAgICAgZyA9ICgoaT4+MikmNykqMzY7CisgICAgICAgICAgICBiID0gKGkmMyAgICAgKSo4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSODoKKyAgICAgICAgICAgIGIgPSAoaT4+NiAgICApKjg1OworICAgICAgICAgICAgZyA9ICgoaT4+MykmNykqMzY7CisgICAgICAgICAgICByID0gKGkmNyAgICAgKSozNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNF9CWVRFOgorICAgICAgICAgICAgciA9IChpPj4zICAgICkqMjU1OworICAgICAgICAgICAgZyA9ICgoaT4+MSkmMykqODU7CisgICAgICAgICAgICBiID0gKGkmMSAgICAgKSoyNTU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjRfQllURToKKyAgICAgICAgICAgIGIgPSAoaT4+MyAgICApKjI1NTsKKyAgICAgICAgICAgIGcgPSAoKGk+PjEpJjMpKjg1OworICAgICAgICAgICAgciA9IChpJjEgICAgICkqMjU1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICAgICAgICAgIHIgPSBiID0gZyA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgcGFsW2ldID0gYiArIChnIDw8IDgpICsgKHIgPDwgMTYpICsgKDB4RkZVIDw8IDI0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X2ltYWdlX2FsbG9jKHVpbnQ4X3QgKnBvaW50ZXJzWzRdLCBpbnQgbGluZXNpemVzWzRdLAorICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCBhbGlnbikKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIGludCBpLCByZXQ7CisgICAgdWludDhfdCAqYnVmOworCisgICAgaWYgKCFkZXNjKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKHcsIGgsIDAsIE5VTEwpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhsaW5lc2l6ZXMsIHBpeF9mbXQsIGFsaWduPjcgPyBGRkFMSUdOKHcsIDgpIDogdykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGxpbmVzaXplc1tpXSA9IEZGQUxJR04obGluZXNpemVzW2ldLCBhbGlnbik7CisKKyAgICBpZiAoKHJldCA9IGF2X2ltYWdlX2ZpbGxfcG9pbnRlcnMocG9pbnRlcnMsIHBpeF9mbXQsIGgsIE5VTEwsIGxpbmVzaXplcykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBidWYgPSBhdl9tYWxsb2MocmV0ICsgYWxpZ24pOworICAgIGlmICghYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9wb2ludGVycyhwb2ludGVycywgcGl4X2ZtdCwgaCwgYnVmLCBsaW5lc2l6ZXMpKSA8IDApIHsKKyAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCkKKyAgICAgICAgYXZwcml2X3NldF9zeXN0ZW1hdGljX3BhbDIoKHVpbnQzMl90Kilwb2ludGVyc1sxXSwgcGl4X2ZtdCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCit0eXBlZGVmIHN0cnVjdCBJbWdVdGlscyB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50ICAgbG9nX29mZnNldDsKKyAgICB2b2lkICpsb2dfY3R4OworfSBJbWdVdGlsczsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaW1ndXRpbHNfY2xhc3MgPSB7ICJJTUdVVElMUyIsIGF2X2RlZmF1bHRfaXRlbV9uYW1lLCBOVUxMLCBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsIG9mZnNldG9mKEltZ1V0aWxzLCBsb2dfb2Zmc2V0KSwgb2Zmc2V0b2YoSW1nVXRpbHMsIGxvZ19jdHgpIH07CisKK2ludCBhdl9pbWFnZV9jaGVja19zaXplKHVuc2lnbmVkIGludCB3LCB1bnNpZ25lZCBpbnQgaCwgaW50IGxvZ19vZmZzZXQsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgSW1nVXRpbHMgaW1ndXRpbHMgPSB7ICZpbWd1dGlsc19jbGFzcywgbG9nX29mZnNldCwgbG9nX2N0eCB9OworCisgICAgaWYgKChpbnQpdz4wICYmIChpbnQpaD4wICYmICh3KzEyOCkqKHVpbnQ2NF90KShoKzEyOCkgPCBJTlRfTUFYLzgpCisgICAgICAgIHJldHVybiAwOworCisgICAgYXZfbG9nKCZpbWd1dGlscywgQVZfTE9HX0VSUk9SLCAiUGljdHVyZSBzaXplICV1eCV1IGlzIGludmFsaWRcbiIsIHcsIGgpOworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKK2ludCBhdl9pbWFnZV9jaGVja19zYXIodW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoLCBBVlJhdGlvbmFsIHNhcikKK3sKKyAgICBpbnQ2NF90IHNjYWxlZF9kaW07CisKKyAgICBpZiAoIXNhci5kZW4pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoIXNhci5udW0gfHwgc2FyLm51bSA9PSBzYXIuZGVuKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzYXIubnVtIDwgc2FyLmRlbikKKyAgICAgICAgc2NhbGVkX2RpbSA9IGF2X3Jlc2NhbGVfcm5kKHcsIHNhci5udW0sIHNhci5kZW4sIEFWX1JPVU5EX1pFUk8pOworICAgIGVsc2UKKyAgICAgICAgc2NhbGVkX2RpbSA9IGF2X3Jlc2NhbGVfcm5kKGgsIHNhci5kZW4sIHNhci5udW0sIEFWX1JPVU5EX1pFUk8pOworCisgICAgaWYgKHNjYWxlZF9kaW0gPiAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKK3ZvaWQgYXZfaW1hZ2VfY29weV9wbGFuZSh1aW50OF90ICAgICAgICpkc3QsIGludCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRld2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaWYgKCFkc3QgfHwgIXNyYykKKyAgICAgICAgcmV0dXJuOworICAgIGF2X2Fzc2VydDAoYWJzKHNyY19saW5lc2l6ZSkgPj0gYnl0ZXdpZHRoKTsKKyAgICBhdl9hc3NlcnQwKGFicyhkc3RfbGluZXNpemUpID49IGJ5dGV3aWR0aCk7CisgICAgZm9yICg7aGVpZ2h0ID4gMDsgaGVpZ2h0LS0pIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBieXRld2lkdGgpOworICAgICAgICBkc3QgKz0gZHN0X2xpbmVzaXplOworICAgICAgICBzcmMgKz0gc3JjX2xpbmVzaXplOworICAgIH0KK30KKwordm9pZCBhdl9pbWFnZV9jb3B5KHVpbnQ4X3QgKmRzdF9kYXRhWzRdLCBpbnQgZHN0X2xpbmVzaXplc1s0XSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfZGF0YVs0XSwgY29uc3QgaW50IHNyY19saW5lc2l6ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworCisgICAgaWYgKCFkZXNjIHx8IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwKKyAgICAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKSB7CisgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoZHN0X2RhdGFbMF0sIGRzdF9saW5lc2l6ZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2RhdGFbMF0sIHNyY19saW5lc2l6ZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIC8qIGNvcHkgdGhlIHBhbGV0dGUgKi8KKyAgICAgICAgbWVtY3B5KGRzdF9kYXRhWzFdLCBzcmNfZGF0YVsxXSwgNCoyNTYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpLCBwbGFuZXNfbmIgPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5uYl9jb21wb25lbnRzOyBpKyspCisgICAgICAgICAgICBwbGFuZXNfbmIgPSBGRk1BWChwbGFuZXNfbmIsIGRlc2MtPmNvbXBbaV0ucGxhbmUgKyAxKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzX25iOyBpKyspIHsKKyAgICAgICAgICAgIGludCBoID0gaGVpZ2h0OworICAgICAgICAgICAgaW50IGJ3aWR0aCA9IGF2X2ltYWdlX2dldF9saW5lc2l6ZShwaXhfZm10LCB3aWR0aCwgaSk7CisgICAgICAgICAgICBpZiAoYndpZHRoIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJhdl9pbWFnZV9nZXRfbGluZXNpemUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSAxIHx8IGkgPT0gMikgeworICAgICAgICAgICAgICAgIGggPSBGRl9DRUlMX1JTSElGVChoZWlnaHQsIGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShkc3RfZGF0YVtpXSwgZHN0X2xpbmVzaXplc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2RhdGFbaV0sIHNyY19saW5lc2l6ZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3aWR0aCwgaCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBhdl9pbWFnZV9maWxsX2FycmF5cyh1aW50OF90ICpkc3RfZGF0YVs0XSwgaW50IGRzdF9saW5lc2l6ZVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGFsaWduKQoreworICAgIGludCByZXQsIGk7CisKKyAgICBpZiAoKHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUod2lkdGgsIGhlaWdodCwgMCwgTlVMTCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMoZHN0X2xpbmVzaXplLCBwaXhfZm10LCB3aWR0aCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGRzdF9saW5lc2l6ZVtpXSA9IEZGQUxJR04oZHN0X2xpbmVzaXplW2ldLCBhbGlnbik7CisKKyAgICByZXR1cm4gYXZfaW1hZ2VfZmlsbF9wb2ludGVycyhkc3RfZGF0YSwgcGl4X2ZtdCwgaGVpZ2h0LCAodWludDhfdCAqKXNyYywgZHN0X2xpbmVzaXplKTsKK30KKworaW50IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYWxpZ24pCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICB1aW50OF90ICpkYXRhWzRdOworICAgIGludCBsaW5lc2l6ZVs0XTsKKworICAgIGlmICghZGVzYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZSh3aWR0aCwgaGVpZ2h0LCAwLCBOVUxMKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCkKKyAgICAgICAgLy8gZG8gbm90IGluY2x1ZGUgcGFsZXR0ZSBmb3IgdGhlc2UgcHNldWRvLXBhbGV0dGVkIGZvcm1hdHMKKyAgICAgICAgcmV0dXJuIHdpZHRoICogaGVpZ2h0OworICAgIHJldHVybiBhdl9pbWFnZV9maWxsX2FycmF5cyhkYXRhLCBsaW5lc2l6ZSwgTlVMTCwgcGl4X2ZtdCwgd2lkdGgsIGhlaWdodCwgYWxpZ24pOworfQorCitpbnQgYXZfaW1hZ2VfY29weV90b19idWZmZXIodWludDhfdCAqZHN0LCBpbnQgZHN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IHNyY19kYXRhWzRdLCBjb25zdCBpbnQgc3JjX2xpbmVzaXplWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBhbGlnbikKK3sKKyAgICBpbnQgaSwgaiwgbmJfcGxhbmVzID0gMCwgbGluZXNpemVbNF07CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBpbnQgc2l6ZSA9IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShwaXhfZm10LCB3aWR0aCwgaGVpZ2h0LCBhbGlnbik7CisKKyAgICBpZiAoc2l6ZSA+IGRzdF9zaXplIHx8IHNpemUgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgZm9yIChpID0gMDsgaSA8IGRlc2MtPm5iX2NvbXBvbmVudHM7IGkrKykKKyAgICAgICAgbmJfcGxhbmVzID0gRkZNQVgoZGVzYy0+Y29tcFtpXS5wbGFuZSwgbmJfcGxhbmVzKTsKKyAgICBuYl9wbGFuZXMrKzsKKworICAgIGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKGxpbmVzaXplLCBwaXhfZm10LCB3aWR0aCk7CisgICAgZm9yIChpID0gMDsgaSA8IG5iX3BsYW5lczsgaSsrKSB7CisgICAgICAgIGludCBoLCBzaGlmdCA9IChpID09IDEgfHwgaSA9PSAyKSA/IGRlc2MtPmxvZzJfY2hyb21hX2ggOiAwOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSBzcmNfZGF0YVtpXTsKKyAgICAgICAgaCA9IChoZWlnaHQgKyAoMSA8PCBzaGlmdCkgLSAxKSA+PiBzaGlmdDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGxpbmVzaXplW2ldKTsKKyAgICAgICAgICAgIGRzdCArPSBGRkFMSUdOKGxpbmVzaXplW2ldLCBhbGlnbik7CisgICAgICAgICAgICBzcmMgKz0gc3JjX2xpbmVzaXplW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCkgeworICAgICAgICB1aW50MzJfdCAqZDMyID0gKHVpbnQzMl90ICopKCgoc2l6ZV90KWRzdCArIDMpICYgfjMpOworICAgICAgICBmb3IgKGkgPSAwOyBpPDI1NjsgaSsrKQorICAgICAgICAgICAgQVZfV0wzMihkMzIgKyBpLCBBVl9STjMyKHNyY19kYXRhWzFdICsgNCppKSk7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2ltZ3V0aWxzLmggYi9mZm1wZWcvbGliYXZ1dGlsL2ltZ3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjMjQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvaW1ndXRpbHMuaApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9JTUdVVElMU19ICisjZGVmaW5lIEFWVVRJTF9JTUdVVElMU19ICisKKy8qKgorICogQGZpbGUKKyAqIG1pc2MgaW1hZ2UgdXRpbGl0aWVzCisgKgorICogQGFkZHRvZ3JvdXAgbGF2dV9waWN0dXJlCisgKiBAeworICovCisKKyNpbmNsdWRlICJhdnV0aWwuaCIKKyNpbmNsdWRlICJwaXhkZXNjLmgiCisjaW5jbHVkZSAicmF0aW9uYWwuaCIKKworLyoqCisgKiBDb21wdXRlIHRoZSBtYXggcGl4ZWwgc3RlcCBmb3IgZWFjaCBwbGFuZSBvZiBhbiBpbWFnZSB3aXRoIGEKKyAqIGZvcm1hdCBkZXNjcmliZWQgYnkgcGl4ZGVzYy4KKyAqCisgKiBUaGUgcGl4ZWwgc3RlcCBpcyB0aGUgZGlzdGFuY2UgaW4gYnl0ZXMgYmV0d2VlbiB0aGUgZmlyc3QgYnl0ZSBvZgorICogdGhlIGdyb3VwIG9mIGJ5dGVzIHdoaWNoIGRlc2NyaWJlIGEgcGl4ZWwgY29tcG9uZW50IGFuZCB0aGUgZmlyc3QKKyAqIGJ5dGUgb2YgdGhlIHN1Y2Nlc3NpdmUgZ3JvdXAgaW4gdGhlIHNhbWUgcGxhbmUgZm9yIHRoZSBzYW1lCisgKiBjb21wb25lbnQuCisgKgorICogQHBhcmFtIG1heF9waXhzdGVwcyBhbiBhcnJheSB3aGljaCBpcyBmaWxsZWQgd2l0aCB0aGUgbWF4IHBpeGVsIHN0ZXAKKyAqIGZvciBlYWNoIHBsYW5lLiBTaW5jZSBhIHBsYW5lIG1heSBjb250YWluIGRpZmZlcmVudCBwaXhlbAorICogY29tcG9uZW50cywgdGhlIGNvbXB1dGVkIG1heF9waXhzdGVwc1twbGFuZV0gaXMgcmVsYXRpdmUgdG8gdGhlCisgKiBjb21wb25lbnQgaW4gdGhlIHBsYW5lIHdpdGggdGhlIG1heCBwaXhlbCBzdGVwLgorICogQHBhcmFtIG1heF9waXhzdGVwX2NvbXBzIGFuIGFycmF5IHdoaWNoIGlzIGZpbGxlZCB3aXRoIHRoZSBjb21wb25lbnQKKyAqIGZvciBlYWNoIHBsYW5lIHdoaWNoIGhhcyB0aGUgbWF4IHBpeGVsIHN0ZXAuIE1heSBiZSBOVUxMLgorICovCit2b2lkIGF2X2ltYWdlX2ZpbGxfbWF4X3BpeHN0ZXBzKGludCBtYXhfcGl4c3RlcHNbNF0sIGludCBtYXhfcGl4c3RlcF9jb21wc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhkZXNjKTsKKworLyoqCisgKiBDb21wdXRlIHRoZSBzaXplIG9mIGFuIGltYWdlIGxpbmUgd2l0aCBmb3JtYXQgcGl4X2ZtdCBhbmQgd2lkdGgKKyAqIHdpZHRoIGZvciB0aGUgcGxhbmUgcGxhbmUuCisgKgorICogQHJldHVybiB0aGUgY29tcHV0ZWQgc2l6ZSBpbiBieXRlcworICovCitpbnQgYXZfaW1hZ2VfZ2V0X2xpbmVzaXplKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgsIGludCBwbGFuZSk7CisKKy8qKgorICogRmlsbCBwbGFuZSBsaW5lc2l6ZXMgZm9yIGFuIGltYWdlIHdpdGggcGl4ZWwgZm9ybWF0IHBpeF9mbXQgYW5kCisgKiB3aWR0aCB3aWR0aC4KKyAqCisgKiBAcGFyYW0gbGluZXNpemVzIGFycmF5IHRvIGJlIGZpbGxlZCB3aXRoIHRoZSBsaW5lc2l6ZSBmb3IgZWFjaCBwbGFuZQorICogQHJldHVybiA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZQorICovCitpbnQgYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMoaW50IGxpbmVzaXplc1s0XSwgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCB3aWR0aCk7CisKKy8qKgorICogRmlsbCBwbGFuZSBkYXRhIHBvaW50ZXJzIGZvciBhbiBpbWFnZSB3aXRoIHBpeGVsIGZvcm1hdCBwaXhfZm10IGFuZAorICogaGVpZ2h0IGhlaWdodC4KKyAqCisgKiBAcGFyYW0gZGF0YSBwb2ludGVycyBhcnJheSB0byBiZSBmaWxsZWQgd2l0aCB0aGUgcG9pbnRlciBmb3IgZWFjaCBpbWFnZSBwbGFuZQorICogQHBhcmFtIHB0ciB0aGUgcG9pbnRlciB0byBhIGJ1ZmZlciB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIGltYWdlCisgKiBAcGFyYW0gbGluZXNpemVzIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBsaW5lc2l6ZSBmb3IgZWFjaAorICogcGxhbmUsIHNob3VsZCBiZSBmaWxsZWQgYnkgYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMoKQorICogQHJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIGltYWdlIGJ1ZmZlciwgYSBuZWdhdGl2ZQorICogZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGF2X2ltYWdlX2ZpbGxfcG9pbnRlcnModWludDhfdCAqZGF0YVs0XSwgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwdHIsIGNvbnN0IGludCBsaW5lc2l6ZXNbNF0pOworCisvKioKKyAqIEFsbG9jYXRlIGFuIGltYWdlIHdpdGggc2l6ZSB3IGFuZCBoIGFuZCBwaXhlbCBmb3JtYXQgcGl4X2ZtdCwgYW5kCisgKiBmaWxsIHBvaW50ZXJzIGFuZCBsaW5lc2l6ZXMgYWNjb3JkaW5nbHkuCisgKiBUaGUgYWxsb2NhdGVkIGltYWdlIGJ1ZmZlciBoYXMgdG8gYmUgZnJlZWQgYnkgdXNpbmcKKyAqIGF2X2ZyZWVwKCZwb2ludGVyc1swXSkuCisgKgorICogQHBhcmFtIGFsaWduIHRoZSB2YWx1ZSB0byB1c2UgZm9yIGJ1ZmZlciBzaXplIGFsaWdubWVudAorICogQHJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIGltYWdlIGJ1ZmZlciwgYSBuZWdhdGl2ZQorICogZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGF2X2ltYWdlX2FsbG9jKHVpbnQ4X3QgKnBvaW50ZXJzWzRdLCBpbnQgbGluZXNpemVzWzRdLAorICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCBhbGlnbik7CisKKy8qKgorICogQ29weSBpbWFnZSBwbGFuZSBmcm9tIHNyYyB0byBkc3QuCisgKiBUaGF0IGlzLCBjb3B5ICJoZWlnaHQiIG51bWJlciBvZiBsaW5lcyBvZiAiYnl0ZXdpZHRoIiBieXRlcyBlYWNoLgorICogVGhlIGZpcnN0IGJ5dGUgb2YgZWFjaCBzdWNjZXNzaXZlIGxpbmUgaXMgc2VwYXJhdGVkIGJ5ICpfbGluZXNpemUKKyAqIGJ5dGVzLgorICoKKyAqIGJ5dGV3aWR0aCBtdXN0IGJlIGNvbnRhaW5lZCBieSBib3RoIGFic29sdXRlIHZhbHVlcyBvZiBkc3RfbGluZXNpemUKKyAqIGFuZCBzcmNfbGluZXNpemUsIG90aGVyd2lzZSB0aGUgZnVuY3Rpb24gYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICoKKyAqIEBwYXJhbSBkc3RfbGluZXNpemUgbGluZXNpemUgZm9yIHRoZSBpbWFnZSBwbGFuZSBpbiBkc3QKKyAqIEBwYXJhbSBzcmNfbGluZXNpemUgbGluZXNpemUgZm9yIHRoZSBpbWFnZSBwbGFuZSBpbiBzcmMKKyAqLwordm9pZCBhdl9pbWFnZV9jb3B5X3BsYW5lKHVpbnQ4X3QgICAgICAgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGV3aWR0aCwgaW50IGhlaWdodCk7CisKKy8qKgorICogQ29weSBpbWFnZSBpbiBzcmNfZGF0YSB0byBkc3RfZGF0YS4KKyAqCisgKiBAcGFyYW0gZHN0X2xpbmVzaXplcyBsaW5lc2l6ZXMgZm9yIHRoZSBpbWFnZSBpbiBkc3RfZGF0YQorICogQHBhcmFtIHNyY19saW5lc2l6ZXMgbGluZXNpemVzIGZvciB0aGUgaW1hZ2UgaW4gc3JjX2RhdGEKKyAqLwordm9pZCBhdl9pbWFnZV9jb3B5KHVpbnQ4X3QgKmRzdF9kYXRhWzRdLCBpbnQgZHN0X2xpbmVzaXplc1s0XSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfZGF0YVs0XSwgY29uc3QgaW50IHNyY19saW5lc2l6ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8qKgorICogU2V0dXAgdGhlIGRhdGEgcG9pbnRlcnMgYW5kIGxpbmVzaXplcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGltYWdlCisgKiBwYXJhbWV0ZXJzIGFuZCB0aGUgcHJvdmlkZWQgYXJyYXkuCisgKgorICogVGhlIGZpZWxkcyBvZiB0aGUgZ2l2ZW4gaW1hZ2UgYXJlIGZpbGxlZCBpbiBieSB1c2luZyB0aGUgc3JjCisgKiBhZGRyZXNzIHdoaWNoIHBvaW50cyB0byB0aGUgaW1hZ2UgZGF0YSBidWZmZXIuIERlcGVuZGluZyBvbiB0aGUKKyAqIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQsIG9uZSBvciBtdWx0aXBsZSBpbWFnZSBkYXRhIHBvaW50ZXJzIGFuZAorICogbGluZSBzaXplcyB3aWxsIGJlIHNldC4gIElmIGEgcGxhbmFyIGZvcm1hdCBpcyBzcGVjaWZpZWQsIHNldmVyYWwKKyAqIHBvaW50ZXJzIHdpbGwgYmUgc2V0IHBvaW50aW5nIHRvIHRoZSBkaWZmZXJlbnQgcGljdHVyZSBwbGFuZXMgYW5kCisgKiB0aGUgbGluZSBzaXplcyBvZiB0aGUgZGlmZmVyZW50IHBsYW5lcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUKKyAqIGxpbmVzX3NpemVzIGFycmF5LiBDYWxsIHdpdGggIXNyYyB0byBnZXQgdGhlIHJlcXVpcmVkCisgKiBzaXplIGZvciB0aGUgc3JjIGJ1ZmZlci4KKyAqCisgKiBUbyBhbGxvY2F0ZSB0aGUgYnVmZmVyIGFuZCBmaWxsIGluIHRoZSBkc3RfZGF0YSBhbmQgZHN0X2xpbmVzaXplIGluCisgKiBvbmUgY2FsbCwgdXNlIGF2X2ltYWdlX2FsbG9jKCkuCisgKgorICogQHBhcmFtIGRzdF9kYXRhICAgICAgZGF0YSBwb2ludGVycyB0byBiZSBmaWxsZWQgaW4KKyAqIEBwYXJhbSBkc3RfbGluZXNpemVzIGxpbmVzaXplcyBmb3IgdGhlIGltYWdlIGluIGRzdF9kYXRhIHRvIGJlIGZpbGxlZCBpbgorICogQHBhcmFtIHNyYyAgICAgICAgICAgYnVmZmVyIHdoaWNoIHdpbGwgY29udGFpbiBvciBjb250YWlucyB0aGUgYWN0dWFsIGltYWdlIGRhdGEsIGNhbiBiZSBOVUxMCisgKiBAcGFyYW0gcGl4X2ZtdCAgICAgICB0aGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSBpbWFnZQorICogQHBhcmFtIHdpZHRoICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMKKyAqIEBwYXJhbSBoZWlnaHQgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGluIHBpeGVscworICogQHBhcmFtIGFsaWduICAgICAgICAgdGhlIHZhbHVlIHVzZWQgaW4gc3JjIGZvciBsaW5lc2l6ZSBhbGlnbm1lbnQKKyAqIEByZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMgcmVxdWlyZWQgZm9yIHNyYywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKiBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGF2X2ltYWdlX2ZpbGxfYXJyYXlzKHVpbnQ4X3QgKmRzdF9kYXRhWzRdLCBpbnQgZHN0X2xpbmVzaXplWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYWxpZ24pOworCisvKioKKyAqIFJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYW1vdW50IG9mIGRhdGEgcmVxdWlyZWQgdG8gc3RvcmUgYW4KKyAqIGltYWdlIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtW2luXSBhbGlnbiB0aGUgYXNzdW1lZCBsaW5lc2l6ZSBhbGlnbm1lbnQKKyAqLworaW50IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYWxpZ24pOworCisvKioKKyAqIENvcHkgaW1hZ2UgZGF0YSBmcm9tIGFuIGltYWdlIGludG8gYSBidWZmZXIuCisgKgorICogYXZfaW1hZ2VfZ2V0X2J1ZmZlcl9zaXplKCkgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgcmVxdWlyZWQgc2l6ZQorICogZm9yIHRoZSBidWZmZXIgdG8gZmlsbC4KKyAqCisgKiBAcGFyYW0gZHN0ICAgICAgICAgICBhIGJ1ZmZlciBpbnRvIHdoaWNoIHBpY3R1cmUgZGF0YSB3aWxsIGJlIGNvcGllZAorICogQHBhcmFtIGRzdF9zaXplICAgICAgdGhlIHNpemUgaW4gYnl0ZXMgb2YgZHN0CisgKiBAcGFyYW0gc3JjX2RhdGEgICAgICBwb2ludGVycyBjb250YWluaW5nIHRoZSBzb3VyY2UgaW1hZ2UgZGF0YQorICogQHBhcmFtIHNyY19saW5lc2l6ZXMgbGluZXNpemVzIGZvciB0aGUgaW1hZ2UgaW4gc3JjX2RhdGEKKyAqIEBwYXJhbSBwaXhfZm10ICAgICAgIHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlIHNvdXJjZSBpbWFnZQorICogQHBhcmFtIHdpZHRoICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBzb3VyY2UgaW1hZ2UgaW4gcGl4ZWxzCisgKiBAcGFyYW0gaGVpZ2h0ICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgaW1hZ2UgaW4gcGl4ZWxzCisgKiBAcGFyYW0gYWxpZ24gICAgICAgICB0aGUgYXNzdW1lZCBsaW5lc2l6ZSBhbGlnbm1lbnQgZm9yIGRzdAorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gZHN0LCBvciBhIG5lZ2F0aXZlIHZhbHVlCisgKiAoZXJyb3IgY29kZSkgb24gZXJyb3IKKyAqLworaW50IGF2X2ltYWdlX2NvcHlfdG9fYnVmZmVyKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCBzcmNfZGF0YVs0XSwgY29uc3QgaW50IHNyY19saW5lc2l6ZVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYWxpZ24pOworCisvKioKKyAqIENoZWNrIGlmIHRoZSBnaXZlbiBkaW1lbnNpb24gb2YgYW4gaW1hZ2UgaXMgdmFsaWQsIG1lYW5pbmcgdGhhdCBhbGwKKyAqIGJ5dGVzIG9mIHRoZSBpbWFnZSBjYW4gYmUgYWRkcmVzc2VkIHdpdGggYSBzaWduZWQgaW50LgorICoKKyAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcGljdHVyZQorICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcGljdHVyZQorICogQHBhcmFtIGxvZ19vZmZzZXQgdGhlIG9mZnNldCB0byBzdW0gdG8gdGhlIGxvZyBsZXZlbCBmb3IgbG9nZ2luZyB3aXRoIGxvZ19jdHgKKyAqIEBwYXJhbSBsb2dfY3R4IHRoZSBwYXJlbnQgbG9nZ2luZyBjb250ZXh0LCBpdCBtYXkgYmUgTlVMTAorICogQHJldHVybiA+PSAwIGlmIHZhbGlkLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK2ludCBhdl9pbWFnZV9jaGVja19zaXplKHVuc2lnbmVkIGludCB3LCB1bnNpZ25lZCBpbnQgaCwgaW50IGxvZ19vZmZzZXQsIHZvaWQgKmxvZ19jdHgpOworCisvKioKKyAqIENoZWNrIGlmIHRoZSBnaXZlbiBzYW1wbGUgYXNwZWN0IHJhdGlvIG9mIGFuIGltYWdlIGlzIHZhbGlkLgorICoKKyAqIEl0IGlzIGNvbnNpZGVyZWQgaW52YWxpZCBpZiB0aGUgZGVub21pbmF0b3IgaXMgMCBvciBpZiBhcHBseWluZyB0aGUgcmF0aW8KKyAqIHRvIHRoZSBpbWFnZSBzaXplIHdvdWxkIG1ha2UgdGhlIHNtYWxsZXIgZGltZW5zaW9uIGxlc3MgdGhhbiAxLiBJZiB0aGUKKyAqIHNhciBudW1lcmF0b3IgaXMgMCwgaXQgaXMgY29uc2lkZXJlZCB1bmtub3duIGFuZCB3aWxsIHJldHVybiBhcyB2YWxpZC4KKyAqCisgKiBAcGFyYW0gdyB3aWR0aCBvZiB0aGUgaW1hZ2UKKyAqIEBwYXJhbSBoIGhlaWdodCBvZiB0aGUgaW1hZ2UKKyAqIEBwYXJhbSBzYXIgc2FtcGxlIGFzcGVjdCByYXRpbyBvZiB0aGUgaW1hZ2UKKyAqIEByZXR1cm4gMCBpZiB2YWxpZCwgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb3RoZXJ3aXNlCisgKi8KK2ludCBhdl9pbWFnZV9jaGVja19zYXIodW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoLCBBVlJhdGlvbmFsIHNhcik7CisKKy8qKgorICogQH0KKyAqLworCisKKyNlbmRpZiAvKiBBVlVUSUxfSU1HVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9pbnRlZ2VyLmMgYi9mZm1wZWcvbGliYXZ1dGlsL2ludGVnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmNkZTBkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9pbnRlZ2VyLmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBhcmJpdHJhcnkgcHJlY2lzaW9uIGludGVnZXJzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogYXJiaXRyYXJ5IHByZWNpc2lvbiBpbnRlZ2VycworICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJpbnRlZ2VyLmgiCisjaW5jbHVkZSAiYXZhc3NlcnQuaCIKKworQVZJbnRlZ2VyIGF2X2FkZF9pKEFWSW50ZWdlciBhLCBBVkludGVnZXIgYil7CisgICAgaW50IGksIGNhcnJ5PTA7CisKKyAgICBmb3IoaT0wOyBpPEFWX0lOVEVHRVJfU0laRTsgaSsrKXsKKyAgICAgICAgY2Fycnk9IChjYXJyeT4+MTYpICsgYS52W2ldICsgYi52W2ldOworICAgICAgICBhLnZbaV09IGNhcnJ5OworICAgIH0KKyAgICByZXR1cm4gYTsKK30KKworQVZJbnRlZ2VyIGF2X3N1Yl9pKEFWSW50ZWdlciBhLCBBVkludGVnZXIgYil7CisgICAgaW50IGksIGNhcnJ5PTA7CisKKyAgICBmb3IoaT0wOyBpPEFWX0lOVEVHRVJfU0laRTsgaSsrKXsKKyAgICAgICAgY2Fycnk9IChjYXJyeT4+MTYpICsgYS52W2ldIC0gYi52W2ldOworICAgICAgICBhLnZbaV09IGNhcnJ5OworICAgIH0KKyAgICByZXR1cm4gYTsKK30KKworaW50IGF2X2xvZzJfaShBVkludGVnZXIgYSl7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT1BVl9JTlRFR0VSX1NJWkUtMTsgaT49MDsgaS0tKXsKKyAgICAgICAgaWYoYS52W2ldKQorICAgICAgICAgICAgcmV0dXJuIGF2X2xvZzJfMTZiaXQoYS52W2ldKSArIDE2Kmk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworQVZJbnRlZ2VyIGF2X211bF9pKEFWSW50ZWdlciBhLCBBVkludGVnZXIgYil7CisgICAgQVZJbnRlZ2VyIG91dDsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgbmE9IChhdl9sb2cyX2koYSkrMTYpID4+IDQ7CisgICAgaW50IG5iPSAoYXZfbG9nMl9pKGIpKzE2KSA+PiA0OworCisgICAgbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKKworICAgIGZvcihpPTA7IGk8bmE7IGkrKyl7CisgICAgICAgIHVuc2lnbmVkIGludCBjYXJyeT0wOworCisgICAgICAgIGlmKGEudltpXSkKKyAgICAgICAgICAgIGZvcihqPWk7IGo8QVZfSU5URUdFUl9TSVpFICYmIGotaTw9bmI7IGorKyl7CisgICAgICAgICAgICAgICAgY2Fycnk9IChjYXJyeT4+MTYpICsgb3V0LnZbal0gKyBhLnZbaV0qYi52W2otaV07CisgICAgICAgICAgICAgICAgb3V0LnZbal09IGNhcnJ5OworICAgICAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvdXQ7Cit9CisKK2ludCBhdl9jbXBfaShBVkludGVnZXIgYSwgQVZJbnRlZ2VyIGIpeworICAgIGludCBpOworICAgIGludCB2PSAoaW50MTZfdClhLnZbQVZfSU5URUdFUl9TSVpFLTFdIC0gKGludDE2X3QpYi52W0FWX0lOVEVHRVJfU0laRS0xXTsKKyAgICBpZih2KSByZXR1cm4gKHY+PjE2KXwxOworCisgICAgZm9yKGk9QVZfSU5URUdFUl9TSVpFLTI7IGk+PTA7IGktLSl7CisgICAgICAgIGludCB2PSBhLnZbaV0gLSBiLnZbaV07CisgICAgICAgIGlmKHYpIHJldHVybiAodj4+MTYpfDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitBVkludGVnZXIgYXZfc2hyX2koQVZJbnRlZ2VyIGEsIGludCBzKXsKKyAgICBBVkludGVnZXIgb3V0OworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTxBVl9JTlRFR0VSX1NJWkU7IGkrKyl7CisgICAgICAgIHVuc2lnbmVkIGludCBpbmRleD0gaSArIChzPj40KTsKKyAgICAgICAgdW5zaWduZWQgaW50IHY9MDsKKyAgICAgICAgaWYoaW5kZXgrMTxBVl9JTlRFR0VSX1NJWkUpIHYgPSBhLnZbaW5kZXgrMV08PDE2OworICAgICAgICBpZihpbmRleCAgPEFWX0lOVEVHRVJfU0laRSkgdis9IGEudltpbmRleCAgXTsKKyAgICAgICAgb3V0LnZbaV09IHYgPj4gKHMmMTUpOworICAgIH0KKyAgICByZXR1cm4gb3V0OworfQorCitBVkludGVnZXIgYXZfbW9kX2koQVZJbnRlZ2VyICpxdW90LCBBVkludGVnZXIgYSwgQVZJbnRlZ2VyIGIpeworICAgIGludCBpPSBhdl9sb2cyX2koYSkgLSBhdl9sb2cyX2koYik7CisgICAgQVZJbnRlZ2VyIHF1b3RfdGVtcDsKKyAgICBpZighcXVvdCkgcXVvdCA9ICZxdW90X3RlbXA7CisKKyAgICBhdl9hc3NlcnQyKChpbnQxNl90KWEudltBVl9JTlRFR0VSX1NJWkUtMV0gPj0gMCAmJiAoaW50MTZfdCliLnZbQVZfSU5URUdFUl9TSVpFLTFdID49IDApOworICAgIGF2X2Fzc2VydDIoYXZfbG9nMl9pKGIpPj0wKTsKKworICAgIGlmKGkgPiAwKQorICAgICAgICBiPSBhdl9zaHJfaShiLCAtaSk7CisKKyAgICBtZW1zZXQocXVvdCwgMCwgc2l6ZW9mKEFWSW50ZWdlcikpOworCisgICAgd2hpbGUoaS0tID49IDApeworICAgICAgICAqcXVvdD0gYXZfc2hyX2koKnF1b3QsIC0xKTsKKyAgICAgICAgaWYoYXZfY21wX2koYSwgYikgPj0gMCl7CisgICAgICAgICAgICBhPSBhdl9zdWJfaShhLCBiKTsKKyAgICAgICAgICAgIHF1b3QtPnZbMF0gKz0gMTsKKyAgICAgICAgfQorICAgICAgICBiPSBhdl9zaHJfaShiLCAxKTsKKyAgICB9CisgICAgcmV0dXJuIGE7Cit9CisKK0FWSW50ZWdlciBhdl9kaXZfaShBVkludGVnZXIgYSwgQVZJbnRlZ2VyIGIpeworICAgIEFWSW50ZWdlciBxdW90OworICAgIGF2X21vZF9pKCZxdW90LCBhLCBiKTsKKyAgICByZXR1cm4gcXVvdDsKK30KKworQVZJbnRlZ2VyIGF2X2ludDJpKGludDY0X3QgYSl7CisgICAgQVZJbnRlZ2VyIG91dDsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8QVZfSU5URUdFUl9TSVpFOyBpKyspeworICAgICAgICBvdXQudltpXT0gYTsKKyAgICAgICAgYT4+PTE2OworICAgIH0KKyAgICByZXR1cm4gb3V0OworfQorCitpbnQ2NF90IGF2X2kyaW50KEFWSW50ZWdlciBhKXsKKyAgICBpbnQgaTsKKyAgICBpbnQ2NF90IG91dD0oaW50OF90KWEudltBVl9JTlRFR0VSX1NJWkUtMV07CisKKyAgICBmb3IoaT0gQVZfSU5URUdFUl9TSVpFLTI7IGk+PTA7IGktLSl7CisgICAgICAgIG91dCA9IChvdXQ8PDE2KSArIGEudltpXTsKKyAgICB9CisgICAgcmV0dXJuIG91dDsKK30KKworI2lmZGVmIFRFU1QKKworY29uc3QgdWludDhfdCBmZl9sb2cyX3RhYlsyNTZdPXsKKyAgICAgICAgMCwwLDEsMSwyLDIsMiwyLDMsMywzLDMsMywzLDMsMyw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAorICAgICAgICA1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsCisgICAgICAgIDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKKyAgICAgICAgNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAorICAgICAgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCisgICAgICAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKyAgICAgICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorICAgICAgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcKK307CisKK2ludCBtYWluKHZvaWQpeworICAgIGludDY0X3QgYSxiOworCisgICAgZm9yKGE9NzsgYTwyNTYqMjU2KjI1NjsgYSs9MTMyMTUpeworICAgICAgICBmb3IoYj0zOyBiPDI1NioyNTYqMjU2OyBiKz0yNzExOCl7CisgICAgICAgICAgICBBVkludGVnZXIgYWk9IGF2X2ludDJpKGEpOworICAgICAgICAgICAgQVZJbnRlZ2VyIGJpPSBhdl9pbnQyaShiKTsKKworICAgICAgICAgICAgYXZfYXNzZXJ0MChhdl9pMmludChhaSkgPT0gYSk7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGF2X2kyaW50KGJpKSA9PSBiKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfaTJpbnQoYXZfYWRkX2koYWksYmkpKSA9PSBhK2IpOworICAgICAgICAgICAgYXZfYXNzZXJ0MChhdl9pMmludChhdl9zdWJfaShhaSxiaSkpID09IGEtYik7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGF2X2kyaW50KGF2X211bF9pKGFpLGJpKSkgPT0gYSpiKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfaTJpbnQoYXZfc2hyX2koYWksIDkpKSA9PSBhPj45KTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfaTJpbnQoYXZfc2hyX2koYWksLTkpKSA9PSBhPDw5KTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfaTJpbnQoYXZfc2hyX2koYWksIDE3KSkgPT0gYT4+MTcpOworICAgICAgICAgICAgYXZfYXNzZXJ0MChhdl9pMmludChhdl9zaHJfaShhaSwtMTcpKSA9PSBhPDwxNyk7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGF2X2xvZzJfaShhaSkgPT0gYXZfbG9nMihhKSk7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGF2X2kyaW50KGF2X2Rpdl9pKGFpLGJpKSkgPT0gYS9iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9pbnRlZ2VyLmggYi9mZm1wZWcvbGliYXZ1dGlsL2ludGVnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWY3MzNjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9pbnRlZ2VyLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIGFyYml0cmFyeSBwcmVjaXNpb24gaW50ZWdlcnMKKyAqIENvcHlyaWdodCAoYykgMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBhcmJpdHJhcnkgcHJlY2lzaW9uIGludGVnZXJzCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2lmbmRlZiBBVlVUSUxfSU5URUdFUl9ICisjZGVmaW5lIEFWVVRJTF9JTlRFR0VSX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImNvbW1vbi5oIgorCisjZGVmaW5lIEFWX0lOVEVHRVJfU0laRSA4CisKK3R5cGVkZWYgc3RydWN0IEFWSW50ZWdlcnsKKyAgICB1aW50MTZfdCB2W0FWX0lOVEVHRVJfU0laRV07Cit9IEFWSW50ZWdlcjsKKworQVZJbnRlZ2VyIGF2X2FkZF9pKEFWSW50ZWdlciBhLCBBVkludGVnZXIgYikgYXZfY29uc3Q7CitBVkludGVnZXIgYXZfc3ViX2koQVZJbnRlZ2VyIGEsIEFWSW50ZWdlciBiKSBhdl9jb25zdDsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJvdW5kZWQtZG93biB2YWx1ZSBvZiB0aGUgYmFzZSAyIGxvZ2FyaXRobSBvZiB0aGUgZ2l2ZW4KKyAqIEFWSW50ZWdlci4gVGhpcyBpcyBzaW1wbHkgdGhlIGluZGV4IG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdAorICogd2hpY2ggaXMgMSwgb3IgMCBpZiBhbGwgYml0cyBhcmUgMC4KKyAqLworaW50IGF2X2xvZzJfaShBVkludGVnZXIgYSkgYXZfY29uc3Q7CitBVkludGVnZXIgYXZfbXVsX2koQVZJbnRlZ2VyIGEsIEFWSW50ZWdlciBiKSBhdl9jb25zdDsKKworLyoqCisgKiBSZXR1cm4gMCBpZiBhPT1iLCAxIGlmIGE+YiBhbmQgLTEgaWYgYTxiLgorICovCitpbnQgYXZfY21wX2koQVZJbnRlZ2VyIGEsIEFWSW50ZWdlciBiKSBhdl9jb25zdDsKKworLyoqCisgKiBiaXR3aXNlIHNoaWZ0CisgKiBAcGFyYW0gcyB0aGUgbnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSBzaGlmdGVkIHJpZ2h0LAorICAgICAgICAgICAgbWF5IGJlIG5lZ2F0aXZlIGZvciBzaGlmdGluZyBsZWZ0CisgKi8KK0FWSW50ZWdlciBhdl9zaHJfaShBVkludGVnZXIgYSwgaW50IHMpIGF2X2NvbnN0OworCisvKioKKyAqIFJldHVybiBhICUgYi4KKyAqIEBwYXJhbSBxdW90IGEvYiB3aWxsIGJlIHN0b3JlZCBoZXJlLgorICovCitBVkludGVnZXIgYXZfbW9kX2koQVZJbnRlZ2VyICpxdW90LCBBVkludGVnZXIgYSwgQVZJbnRlZ2VyIGIpOworCisvKioKKyAqIFJldHVybiBhL2IuCisgKi8KK0FWSW50ZWdlciBhdl9kaXZfaShBVkludGVnZXIgYSwgQVZJbnRlZ2VyIGIpIGF2X2NvbnN0OworCisvKioKKyAqIENvbnZlcnQgdGhlIGdpdmVuIGludDY0X3QgdG8gYW4gQVZJbnRlZ2VyLgorICovCitBVkludGVnZXIgYXZfaW50MmkoaW50NjRfdCBhKSBhdl9jb25zdDsKKworLyoqCisgKiBDb252ZXJ0IHRoZSBnaXZlbiBBVkludGVnZXIgdG8gYW4gaW50NjRfdC4KKyAqIElmIHRoZSBBVkludGVnZXIgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIGFuIGludDY0X3QsCisgKiB0aGVuIG9ubHkgdGhlIGxlYXN0IHNpZ25pZmljYW50IDY0IGJpdHMgd2lsbCBiZSB1c2VkLgorICovCitpbnQ2NF90IGF2X2kyaW50KEFWSW50ZWdlciBhKSBhdl9jb25zdDsKKworI2VuZGlmIC8qIEFWVVRJTF9JTlRFR0VSX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvaW50ZXJuYWwuaCBiL2ZmbXBlZy9saWJhdnV0aWwvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2FmNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGNvbW1vbiBpbnRlcm5hbCBBUEkgaGVhZGVyCisgKi8KKworI2lmbmRlZiBBVlVUSUxfSU5URVJOQUxfSAorI2RlZmluZSBBVlVUSUxfSU5URVJOQUxfSAorCisjaWYgIWRlZmluZWQoREVCVUcpICYmICFkZWZpbmVkKE5ERUJVRykKKyMgICAgZGVmaW5lIE5ERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJkaWN0LmgiCisjaW5jbHVkZSAicGl4Zm10LmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjaWYgQVJDSF9YODYKKyMgICBpbmNsdWRlICJ4ODYvZW1tcy5oIgorI2VuZGlmCisKKyNpZm5kZWYgZW1tc19jCisjICAgZGVmaW5lIGVtbXNfYygpCisjZW5kaWYKKworI2lmbmRlZiBhdHRyaWJ1dGVfYWxpZ25fYXJnCisjaWYgQVJDSF9YODZfMzIgJiYgQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoNCwyKQorIyAgICBkZWZpbmUgYXR0cmlidXRlX2FsaWduX2FyZyBfX2F0dHJpYnV0ZV9fKChmb3JjZV9hbGlnbl9hcmdfcG9pbnRlcikpCisjZWxzZQorIyAgICBkZWZpbmUgYXR0cmlidXRlX2FsaWduX2FyZworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIENPTkZJR19TSEFSRUQKKyMgICAgZGVmaW5lIGF2X2V4cG9ydCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNlbHNlCisjICAgIGRlZmluZSBhdl9leHBvcnQKKyNlbmRpZgorCisjaWYgSEFWRV9QUkFHTUFfREVQUkVDQVRFRAorIyAgICBpZiBkZWZpbmVkKF9fSUNMKSB8fCBkZWZpbmVkIChfX0lOVEVMX0NPTVBJTEVSKQorIyAgICAgICAgZGVmaW5lIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MgX19wcmFnbWEod2FybmluZyhwdXNoKSkgX19wcmFnbWEod2FybmluZyhkaXNhYmxlOjE0NzgpKQorIyAgICAgICAgZGVmaW5lIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUyAgX19wcmFnbWEod2FybmluZyhwb3ApKQorIyAgICBlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjICAgICAgICBkZWZpbmUgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUyBfX3ByYWdtYSh3YXJuaW5nKHB1c2gpKSBfX3ByYWdtYSh3YXJuaW5nKGRpc2FibGU6NDk5NikpCisjICAgICAgICBkZWZpbmUgRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTICBfX3ByYWdtYSh3YXJuaW5nKHBvcCkpCisjICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTIF9QcmFnbWEoIkdDQyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zXCIiKQorIyAgICAgICAgZGVmaW5lIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUyAgX1ByYWdtYSgiR0NDIGRpYWdub3N0aWMgd2FybmluZyBcIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnNcIiIpCisjICAgIGVuZGlmCisjZWxzZQorIyAgICBkZWZpbmUgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworIyAgICBkZWZpbmUgRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKworCisjZGVmaW5lIEZGX01FTU9SWV9QT0lTT04gMHgyYQorCisjZGVmaW5lIE1BS0VfQUNDRVNTT1JTKHN0ciwgbmFtZSwgdHlwZSwgZmllbGQpIFwKKyAgICB0eXBlIGF2XyMjbmFtZSMjX2dldF8jI2ZpZWxkKGNvbnN0IHN0ciAqcykgeyByZXR1cm4gcy0+ZmllbGQ7IH0gXAorICAgIHZvaWQgYXZfIyNuYW1lIyNfc2V0XyMjZmllbGQoc3RyICpzLCB0eXBlIHYpIHsgcy0+ZmllbGQgPSB2OyB9CisKKy8vIFNvbWUgYnJva2VuIHByZXByb2Nlc3NvcnMgbmVlZCBhIHNlY29uZCBleHBhbnNpb24KKy8vIHRvIGJlIGZvcmNlZCB0byB0b2tlbml6ZSBfX1ZBX0FSR1NfXworI2RlZmluZSBFMSh4KSB4CisKKy8qIENoZWNrIGlmIHRoZSBoYXJkIGNvZGVkIG9mZnNldCBvZiBhIHN0cnVjdCBtZW1iZXIgc3RpbGwgbWF0Y2hlcyByZWFsaXR5LgorICogSW5kdWNlIGEgY29tcGlsYXRpb24gZmFpbHVyZSBpZiBub3QuCisgKi8KKyNkZWZpbmUgQVZfQ0hFQ0tfT0ZGU0VUKHMsIG0sIG8pIHN0cnVjdCBjaGVja18jI28geyAgICBcCisgICAgICAgIGludCB4XyMjb1tvZmZzZXRvZihzLCBtKSA9PSBvPyAxOiAtMV07ICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBMT0NBTF9BTElHTkVEX0EoYSwgdCwgdiwgcywgbywgLi4uKSAgICAgICAgICAgICBcCisgICAgdWludDhfdCBsYV8jI3Zbc2l6ZW9mKHQgcyBvKSArIChhKV07ICAgICAgICAgICAgICAgIFwKKyAgICB0ICgqdikgbyA9ICh2b2lkICopRkZBTElHTigodWludHB0cl90KWxhXyMjdiwgYSkKKworI2RlZmluZSBMT0NBTF9BTElHTkVEX0QoYSwgdCwgdiwgcywgbywgLi4uKSAgICAgICAgICAgICBcCisgICAgREVDTEFSRV9BTElHTkVEKGEsIHQsIGxhXyMjdikgcyBvOyAgICAgICAgICAgICAgICAgIFwKKyAgICB0ICgqdikgbyA9IGxhXyMjdgorCisjZGVmaW5lIExPQ0FMX0FMSUdORUQoYSwgdCwgdiwgLi4uKSBFMShMT0NBTF9BTElHTkVEX0EoYSwgdCwgdiwgX19WQV9BUkdTX18sLCkpCisKKyNpZiBIQVZFX0xPQ0FMX0FMSUdORURfOAorIyAgIGRlZmluZSBMT0NBTF9BTElHTkVEXzgodCwgdiwgLi4uKSBFMShMT0NBTF9BTElHTkVEX0QoOCwgdCwgdiwgX19WQV9BUkdTX18sLCkpCisjZWxzZQorIyAgIGRlZmluZSBMT0NBTF9BTElHTkVEXzgodCwgdiwgLi4uKSBMT0NBTF9BTElHTkVEKDgsIHQsIHYsIF9fVkFfQVJHU19fKQorI2VuZGlmCisKKyNpZiBIQVZFX0xPQ0FMX0FMSUdORURfMTYKKyMgICBkZWZpbmUgTE9DQUxfQUxJR05FRF8xNih0LCB2LCAuLi4pIEUxKExPQ0FMX0FMSUdORURfRCgxNiwgdCwgdiwgX19WQV9BUkdTX18sLCkpCisjZWxzZQorIyAgIGRlZmluZSBMT0NBTF9BTElHTkVEXzE2KHQsIHYsIC4uLikgTE9DQUxfQUxJR05FRCgxNiwgdCwgdiwgX19WQV9BUkdTX18pCisjZW5kaWYKKworI2lmIEhBVkVfTE9DQUxfQUxJR05FRF8zMgorIyAgIGRlZmluZSBMT0NBTF9BTElHTkVEXzMyKHQsIHYsIC4uLikgRTEoTE9DQUxfQUxJR05FRF9EKDMyLCB0LCB2LCBfX1ZBX0FSR1NfXywsKSkKKyNlbHNlCisjICAgZGVmaW5lIExPQ0FMX0FMSUdORURfMzIodCwgdiwgLi4uKSBMT0NBTF9BTElHTkVEKDMyLCB0LCB2LCBfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisjZGVmaW5lIEZGX0FMTE9DX09SX0dPVE8oY3R4LCBwLCBzaXplLCBsYWJlbClcCit7XAorICAgIHAgPSBhdl9tYWxsb2Moc2l6ZSk7XAorICAgIGlmICghKHApICYmIChzaXplKSAhPSAwKSB7XAorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5LlxuIik7XAorICAgICAgICBnb3RvIGxhYmVsO1wKKyAgICB9XAorfQorCisjZGVmaW5lIEZGX0FMTE9DWl9PUl9HT1RPKGN0eCwgcCwgc2l6ZSwgbGFiZWwpXAore1wKKyAgICBwID0gYXZfbWFsbG9jeihzaXplKTtcCisgICAgaWYgKCEocCkgJiYgKHNpemUpICE9IDApIHtcCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkuXG4iKTtcCisgICAgICAgIGdvdG8gbGFiZWw7XAorICAgIH1cCit9CisKKyNkZWZpbmUgRkZfQUxMT0NfQVJSQVlfT1JfR09UTyhjdHgsIHAsIG5lbGVtLCBlbHNpemUsIGxhYmVsKVwKK3tcCisgICAgcCA9IGF2X21hbGxvY19hcnJheShuZWxlbSwgZWxzaXplKTtcCisgICAgaWYgKCFwKSB7XAorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5LlxuIik7XAorICAgICAgICBnb3RvIGxhYmVsO1wKKyAgICB9XAorfQorCisjZGVmaW5lIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGN0eCwgcCwgbmVsZW0sIGVsc2l6ZSwgbGFiZWwpXAore1wKKyAgICBwID0gYXZfbWFsbG9jel9hcnJheShuZWxlbSwgZWxzaXplKTtcCisgICAgaWYgKCFwKSB7XAorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5LlxuIik7XAorICAgICAgICBnb3RvIGxhYmVsO1wKKyAgICB9XAorfQorCisjaW5jbHVkZSAibGlibS5oIgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNwcmFnbWEgY29tbWVudChsaW5rZXIsICIvaW5jbHVkZToiRVhURVJOX1BSRUZJWCJhdnByaXZfc3RydG9kIikKKyNwcmFnbWEgY29tbWVudChsaW5rZXIsICIvaW5jbHVkZToiRVhURVJOX1BSRUZJWCJhdnByaXZfc25wcmludGYiKQorI2VuZGlmCisKKy8qKgorICogUmV0dXJuIE5VTEwgaWYgQ09ORklHX1NNQUxMIGlzIHRydWUsIG90aGVyd2lzZSB0aGUgYXJndW1lbnQKKyAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiBVc2VkIHRvIGRpc2FibGUgdGhlIGRlZmluaXRpb24gb2Ygc3RyaW5ncworICogKGZvciBleGFtcGxlIEFWQ29kZWMgbG9uZ19uYW1lcykuCisgKi8KKyNpZiBDT05GSUdfU01BTEwKKyMgICBkZWZpbmUgTlVMTF9JRl9DT05GSUdfU01BTEwoeCkgTlVMTAorI2Vsc2UKKyMgICBkZWZpbmUgTlVMTF9JRl9DT05GSUdfU01BTEwoeCkgeAorI2VuZGlmCisKKy8qKgorICogRGVmaW5lIGEgZnVuY3Rpb24gd2l0aCBvbmx5IHRoZSBub24tZGVmYXVsdCB2ZXJzaW9uIHNwZWNpZmllZC4KKyAqCisgKiBPbiBzeXN0ZW1zIHdpdGggRUxGIHNoYXJlZCBsaWJyYXJpZXMsIGFsbCBzeW1ib2xzIGV4cG9ydGVkIGZyb20KKyAqIEZGbXBlZyBsaWJyYXJpZXMgYXJlIHRhZ2dlZCB3aXRoIHRoZSBuYW1lIGFuZCBtYWpvciB2ZXJzaW9uIG9mIHRoZQorICogbGlicmFyeSB0byB3aGljaCB0aGV5IGJlbG9uZy4gIElmIGEgZnVuY3Rpb24gaXMgbW92ZWQgZnJvbSBvbmUKKyAqIGxpYnJhcnkgdG8gYW5vdGhlciwgYSB3cmFwcGVyIG11c3QgYmUgcmV0YWluZWQgaW4gdGhlIG9yaWdpbmFsCisgKiBsb2NhdGlvbiB0byBwcmVzZXJ2ZSBiaW5hcnkgY29tcGF0aWJpbGl0eS4KKyAqCisgKiBGdW5jdGlvbnMgZGVmaW5lZCB3aXRoIHRoaXMgbWFjcm8gd2lsbCBuZXZlciBiZSB1c2VkIHRvIHJlc29sdmUKKyAqIHN5bWJvbHMgYnkgdGhlIGJ1aWxkLXRpbWUgbGlua2VyLgorICoKKyAqIEBwYXJhbSB0eXBlIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uCisgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIGZ1bmN0aW9uCisgKiBAcGFyYW0gYXJncyBhcmd1bWVudCBsaXN0IG9mIGZ1bmN0aW9uCisgKiBAcGFyYW0gdmVyICB2ZXJzaW9uIHRhZyB0byBhc3NpZ24gZnVuY3Rpb24KKyAqLworI2lmIEhBVkVfU1lNVkVSX0FTTV9MQUJFTAorIyAgIGRlZmluZSBGRl9TWU1WRVIodHlwZSwgbmFtZSwgYXJncywgdmVyKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlIGZmXyMjbmFtZSBhcmdzIF9fYXNtX18gKEVYVEVSTl9QUkVGSVggI25hbWUgIkAiIHZlcik7ICBcCisgICAgdHlwZSBmZl8jI25hbWUgYXJncworI2VsaWYgSEFWRV9TWU1WRVJfR05VX0FTTQorIyAgIGRlZmluZSBGRl9TWU1WRVIodHlwZSwgbmFtZSwgYXJncywgdmVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gKCIuc3ltdmVyIGZmXyIgI25hbWUgIiwiIEVYVEVSTl9QUkVGSVggI25hbWUgIkAiIHZlcik7ICAgICAgXAorICAgIHR5cGUgZmZfIyNuYW1lIGFyZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgZmZfIyNuYW1lIGFyZ3MKKyNlbmRpZgorCisvKioKKyAqIFJldHVybiBOVUxMIGlmIGEgdGhyZWFkaW5nIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGVuYWJsZWQuCisgKiBVc2VkIHRvIGRpc2FibGUgdGhyZWFkaW5nIGZ1bmN0aW9ucyBpbiBBVkNvZGVjIGRlZmluaXRpb25zCisgKiB3aGVuIG5vdCBuZWVkZWQuCisgKi8KKyNpZiBIQVZFX1RIUkVBRFMKKyMgICBkZWZpbmUgT05MWV9JRl9USFJFQURTX0VOQUJMRUQoeCkgeAorI2Vsc2UKKyMgICBkZWZpbmUgT05MWV9JRl9USFJFQURTX0VOQUJMRUQoeCkgTlVMTAorI2VuZGlmCisKKy8qKgorICogTG9nIGEgZ2VuZXJpYyB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgYSBtaXNzaW5nIGZlYXR1cmUuCisgKgorICogQHBhcmFtW2luXSBhdmMgYSBwb2ludGVyIHRvIGFuIGFyYml0cmFyeSBzdHJ1Y3Qgb2Ygd2hpY2ggdGhlIGZpcnN0CisgKiAgICAgICAgICAgICAgICBmaWVsZCBpcyBhIHBvaW50ZXIgdG8gYW4gQVZDbGFzcyBzdHJ1Y3QKKyAqIEBwYXJhbVtpbl0gbXNnIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBtaXNzaW5nIGZlYXR1cmUKKyAqLwordm9pZCBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZSh2b2lkICphdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZywgLi4uKSBhdl9wcmludGZfZm9ybWF0KDIsIDMpOworCisvKioKKyAqIExvZyBhIGdlbmVyaWMgd2FybmluZyBtZXNzYWdlIGFib3V0IGEgbWlzc2luZyBmZWF0dXJlLgorICogQWRkaXRpb25hbGx5IHJlcXVlc3QgdGhhdCBhIHNhbXBsZSBzaG93Y2FzaW5nIHRoZSBmZWF0dXJlIGJlIHVwbG9hZGVkLgorICoKKyAqIEBwYXJhbVtpbl0gYXZjIGEgcG9pbnRlciB0byBhbiBhcmJpdHJhcnkgc3RydWN0IG9mIHdoaWNoIHRoZSBmaXJzdCBmaWVsZCBpcworICogICAgICAgICAgICAgICAgYSBwb2ludGVyIHRvIGFuIEFWQ2xhc3Mgc3RydWN0CisgKiBAcGFyYW1baW5dIG1zZyBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgbWlzc2luZyBmZWF0dXJlCisgKi8KK3ZvaWQgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHZvaWQgKmF2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZywgLi4uKSBhdl9wcmludGZfZm9ybWF0KDIsIDMpOworCisjaWYgSEFWRV9MSUJDX01TVkNSVAorI2RlZmluZSBhdnByaXZfb3BlbiBmZl9vcGVuCisjZGVmaW5lIFBUUkRJRkZfU1BFQ0lGSUVSICJJZCIKKyNkZWZpbmUgU0laRV9TUEVDSUZJRVIgIkl1IgorI2Vsc2UKKyNkZWZpbmUgUFRSRElGRl9TUEVDSUZJRVIgInRkIgorI2RlZmluZSBTSVpFX1NQRUNJRklFUiAienUiCisjZW5kaWYKKworLyoqCisgKiBBIHdyYXBwZXIgZm9yIG9wZW4oKSBzZXR0aW5nIE9fQ0xPRVhFQy4KKyAqLworaW50IGF2cHJpdl9vcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIC4uLik7CisKK2ludCBhdnByaXZfc2V0X3N5c3RlbWF0aWNfcGFsMih1aW50MzJfdCBwYWxbMjU2XSwgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpOworCisjaWYgRkZfQVBJX0dFVF9DSEFOTkVMX0xBWU9VVF9DT01QQVQKK3VpbnQ2NF90IGZmX2dldF9jaGFubmVsX2xheW91dChjb25zdCBjaGFyICpuYW1lLCBpbnQgY29tcGF0KTsKKyNlbmRpZgorCisjZW5kaWYgLyogQVZVVElMX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvaW50ZmxvYXQuaCBiL2ZmbXBlZy9saWJhdnV0aWwvaW50ZmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTNkN2VjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9pbnRmbG9hdC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTWFucyBSdWxsZ2FyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9JTlRGTE9BVF9ICisjZGVmaW5lIEFWVVRJTF9JTlRGTE9BVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisKK3VuaW9uIGF2X2ludGZsb2F0MzIgeworICAgIHVpbnQzMl90IGk7CisgICAgZmxvYXQgICAgZjsKK307CisKK3VuaW9uIGF2X2ludGZsb2F0NjQgeworICAgIHVpbnQ2NF90IGk7CisgICAgZG91YmxlICAgZjsKK307CisKKy8qKgorICogUmVpbnRlcnByZXQgYSAzMi1iaXQgaW50ZWdlciBhcyBhIGZsb2F0LgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBmbG9hdCBhdl9pbnQyZmxvYXQodWludDMyX3QgaSkKK3sKKyAgICB1bmlvbiBhdl9pbnRmbG9hdDMyIHY7CisgICAgdi5pID0gaTsKKyAgICByZXR1cm4gdi5mOworfQorCisvKioKKyAqIFJlaW50ZXJwcmV0IGEgZmxvYXQgYXMgYSAzMi1iaXQgaW50ZWdlci4KKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3QgYXZfZmxvYXQyaW50KGZsb2F0IGYpCit7CisgICAgdW5pb24gYXZfaW50ZmxvYXQzMiB2OworICAgIHYuZiA9IGY7CisgICAgcmV0dXJuIHYuaTsKK30KKworLyoqCisgKiBSZWludGVycHJldCBhIDY0LWJpdCBpbnRlZ2VyIGFzIGEgZG91YmxlLgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBkb3VibGUgYXZfaW50MmRvdWJsZSh1aW50NjRfdCBpKQoreworICAgIHVuaW9uIGF2X2ludGZsb2F0NjQgdjsKKyAgICB2LmkgPSBpOworICAgIHJldHVybiB2LmY7Cit9CisKKy8qKgorICogUmVpbnRlcnByZXQgYSBkb3VibGUgYXMgYSA2NC1iaXQgaW50ZWdlci4KKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDY0X3QgYXZfZG91YmxlMmludChkb3VibGUgZikKK3sKKyAgICB1bmlvbiBhdl9pbnRmbG9hdDY0IHY7CisgICAgdi5mID0gZjsKKyAgICByZXR1cm4gdi5pOworfQorCisjZW5kaWYgLyogQVZVVElMX0lOVEZMT0FUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvaW50bWF0aC5jIGIvZmZtcGVnL2xpYmF2dXRpbC9pbnRtYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3MjVjNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvaW50bWF0aC5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImludG1hdGguaCIKKworLyogdW5kZWYgdGhlc2UgdG8gZ2V0IHRoZSBmdW5jdGlvbiBwcm90b3R5cGVzIGZyb20gY29tbW9uLmggKi8KKyN1bmRlZiBhdl9sb2cyCisjdW5kZWYgYXZfbG9nMl8xNmJpdAorI2luY2x1ZGUgImNvbW1vbi5oIgorCitpbnQgYXZfbG9nMih1bnNpZ25lZCB2KQoreworICAgIHJldHVybiBmZl9sb2cyKHYpOworfQorCitpbnQgYXZfbG9nMl8xNmJpdCh1bnNpZ25lZCB2KQoreworICAgIHJldHVybiBmZl9sb2cyXzE2Yml0KHYpOworfQorCitpbnQgYXZfY3R6KGludCB2KQoreworICAgIHJldHVybiBmZl9jdHoodik7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2ludG1hdGguaCBiL2ZmbXBlZy9saWJhdnV0aWwvaW50bWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOGM3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2ludG1hdGguaApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfSU5UTUFUSF9ICisjZGVmaW5lIEFWVVRJTF9JTlRNQVRIX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorCisjaWYgQVJDSF9BUk0KKyMgICBpbmNsdWRlICJhcm0vaW50bWF0aC5oIgorI2VuZGlmCisKKy8qKgorICogQGFkZHRvZ3JvdXAgbGF2dV9pbnRlcm5hbAorICogQHsKKyAqLworCisjaWYgSEFWRV9GQVNUX0NMWgorI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsNCkKKyNpZm5kZWYgZmZfbG9nMgorIyAgIGRlZmluZSBmZl9sb2cyKHgpICgzMSAtIF9fYnVpbHRpbl9jbHooKHgpfDEpKQorIyAgIGlmbmRlZiBmZl9sb2cyXzE2Yml0CisjICAgICAgZGVmaW5lIGZmX2xvZzJfMTZiaXQgYXZfbG9nMgorIyAgIGVuZGlmCisjZW5kaWYgLyogZmZfbG9nMiAqLworI2VsaWYgZGVmaW5lZCggX19JTlRFTF9DT01QSUxFUiApCisjaWZuZGVmIGZmX2xvZzIKKyMgICBkZWZpbmUgZmZfbG9nMih4KSAoX2JpdF9zY2FuX3JldmVyc2UoeHwxKSkKKyMgICBpZm5kZWYgZmZfbG9nMl8xNmJpdAorIyAgICAgIGRlZmluZSBmZl9sb2cyXzE2Yml0IGF2X2xvZzIKKyMgICBlbmRpZgorI2VuZGlmIC8qIGZmX2xvZzIgKi8KKyNlbmRpZgorI2VuZGlmIC8qIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsNCkgKi8KKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfbG9nMl90YWJbMjU2XTsKKworI2lmbmRlZiBmZl9sb2cyCisjZGVmaW5lIGZmX2xvZzIgZmZfbG9nMl9jCisjaWYgIWRlZmluZWQoIF9NU0NfVkVSICkKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IGludCBmZl9sb2cyX2ModW5zaWduZWQgaW50IHYpCit7CisgICAgaW50IG4gPSAwOworICAgIGlmICh2ICYgMHhmZmZmMDAwMCkgeworICAgICAgICB2ID4+PSAxNjsKKyAgICAgICAgbiArPSAxNjsKKyAgICB9CisgICAgaWYgKHYgJiAweGZmMDApIHsKKyAgICAgICAgdiA+Pj0gODsKKyAgICAgICAgbiArPSA4OworICAgIH0KKyAgICBuICs9IGZmX2xvZzJfdGFiW3ZdOworCisgICAgcmV0dXJuIG47Cit9CisjZWxzZQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IGZmX2xvZzJfYyh1bnNpZ25lZCBpbnQgdikKK3sKKyAgICB1bnNpZ25lZCBsb25nIG47CisgICAgX0JpdFNjYW5SZXZlcnNlKCZuLCB2fDEpOworICAgIHJldHVybiBuOworfQorI2RlZmluZSBmZl9sb2cyXzE2Yml0IGF2X2xvZzIKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgZmZfbG9nMl8xNmJpdAorI2RlZmluZSBmZl9sb2cyXzE2Yml0IGZmX2xvZzJfMTZiaXRfYworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IGZmX2xvZzJfMTZiaXRfYyh1bnNpZ25lZCBpbnQgdikKK3sKKyAgICBpbnQgbiA9IDA7CisgICAgaWYgKHYgJiAweGZmMDApIHsKKyAgICAgICAgdiA+Pj0gODsKKyAgICAgICAgbiArPSA4OworICAgIH0KKyAgICBuICs9IGZmX2xvZzJfdGFiW3ZdOworCisgICAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworI2RlZmluZSBhdl9sb2cyICAgICAgIGZmX2xvZzIKKyNkZWZpbmUgYXZfbG9nMl8xNmJpdCBmZl9sb2cyXzE2Yml0CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIGxhdnVfbWF0aAorICogQHsKKyAqLworCisjaWYgSEFWRV9GQVNUX0NMWgorI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsNCkKKyNpZm5kZWYgZmZfY3R6CisjZGVmaW5lIGZmX2N0eih2KSBfX2J1aWx0aW5fY3R6KHYpCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoIF9fSU5URUxfQ09NUElMRVIgKQorI2lmbmRlZiBmZl9jdHoKKyNkZWZpbmUgZmZfY3R6KHYpIF9iaXRfc2Nhbl9mb3J3YXJkKHYpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgZmZfY3R6CisjZGVmaW5lIGZmX2N0eiBmZl9jdHpfYworI2lmICFkZWZpbmVkKCBfTVNDX1ZFUiApCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCBpbnQgZmZfY3R6X2MoaW50IHYpCit7CisgICAgaW50IGM7CisKKyAgICBpZiAodiAmIDB4MSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjID0gMTsKKyAgICBpZiAoISh2ICYgMHhmZmZmKSkgeworICAgICAgICB2ID4+PSAxNjsKKyAgICAgICAgYyArPSAxNjsKKyAgICB9CisgICAgaWYgKCEodiAmIDB4ZmYpKSB7CisgICAgICAgIHYgPj49IDg7CisgICAgICAgIGMgKz0gODsKKyAgICB9CisgICAgaWYgKCEodiAmIDB4ZikpIHsKKyAgICAgICAgdiA+Pj0gNDsKKyAgICAgICAgYyArPSA0OworICAgIH0KKyAgICBpZiAoISh2ICYgMHgzKSkgeworICAgICAgICB2ID4+PSAyOworICAgICAgICBjICs9IDI7CisgICAgfQorICAgIGMgLT0gdiAmIDB4MTsKKworICAgIHJldHVybiBjOworfQorI2Vsc2UKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IGludCBmZl9jdHpfYyggaW50IHYgKQoreworICAgIHVuc2lnbmVkIGxvbmcgYzsKKyAgICBfQml0U2NhbkZvcndhcmQoJmMsIHYpOworICAgIHJldHVybiBjOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqCisgKiBUcmFpbGluZyB6ZXJvIGJpdCBjb3VudC4KKyAqCisgKiBAcGFyYW0gdiAgaW5wdXQgdmFsdWUuIElmIHYgaXMgMCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCisgKiBAcmV0dXJuICAgdGhlIG51bWJlciBvZiB0cmFpbGluZyAwLWJpdHMKKyAqLworaW50IGF2X2N0eihpbnQgdik7CisKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIEFWVVRJTF9JTlRNQVRIX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvaW50cmVhZHdyaXRlLmggYi9mZm1wZWcvbGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZmJlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oCkBAIC0wLDAgKzEsNjI5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0lOVFJFQURXUklURV9ICisjZGVmaW5lIEFWVVRJTF9JTlRSRUFEV1JJVEVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2Y29uZmlnLmgiCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImJzd2FwLmgiCisKK3R5cGVkZWYgdW5pb24geworICAgIHVpbnQ2NF90IHU2NDsKKyAgICB1aW50MzJfdCB1MzJbMl07CisgICAgdWludDE2X3QgdTE2WzRdOworICAgIHVpbnQ4X3QgIHU4IFs4XTsKKyAgICBkb3VibGUgICBmNjQ7CisgICAgZmxvYXQgICAgZjMyWzJdOworfSBhdl9hbGlhcyBhdl9hbGlhczY0OworCit0eXBlZGVmIHVuaW9uIHsKKyAgICB1aW50MzJfdCB1MzI7CisgICAgdWludDE2X3QgdTE2WzJdOworICAgIHVpbnQ4X3QgIHU4IFs0XTsKKyAgICBmbG9hdCAgICBmMzI7Cit9IGF2X2FsaWFzIGF2X2FsaWFzMzI7CisKK3R5cGVkZWYgdW5pb24geworICAgIHVpbnQxNl90IHUxNjsKKyAgICB1aW50OF90ICB1OCBbMl07Cit9IGF2X2FsaWFzIGF2X2FsaWFzMTY7CisKKy8qCisgKiBBcmNoLXNwZWNpZmljIGhlYWRlcnMgY2FuIHByb3ZpZGUgYW55IGNvbWJpbmF0aW9uIG9mCisgKiBBVl9bUlddW0JMTl0oMTZ8MjR8MzJ8NDh8NjQpIGFuZCBBVl8oQ09QWXxTV0FQfFpFUk8pKDY0fDEyOCkgbWFjcm9zLgorICogUHJlcHJvY2Vzc29yIHN5bWJvbHMgbXVzdCBiZSBkZWZpbmVkLCBldmVuIGlmIHRoZXNlIGFyZSBpbXBsZW1lbnRlZAorICogYXMgaW5saW5lIGZ1bmN0aW9ucy4KKyAqCisgKiBSL1cgbWVhbnMgcmVhZC93cml0ZSwgQi9ML04gbWVhbnMgYmlnL2xpdHRsZS9uYXRpdmUgZW5kaWFubmVzcy4KKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHJlcXVpcmUgYWxpZ25lZCBhY2Nlc3MsIGNvbXBhcmVkIHRvIHRoZWlyCisgKiB1bmFsaWduZWQgdmFyaWFudHM6IEFWXyhDT1BZfFNXQVB8WkVSTykoNjR8MTI4KSwgQVZfW1JXXU5bOC02NF1BLgorICogSW5jb3JyZWN0IHVzYWdlIG1heSByYW5nZSBmcm9tIGFieXNtYWwgcGVyZm9ybWFuY2UgdG8gY3Jhc2gKKyAqIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCisgKgorICogVGhlIHVuYWxpZ25lZCB2YXJpYW50cyBhcmUgQVZfW1JXXVtCTE5dWzgtNjRdIGFuZCBBVl9DT1BZKlUuCisgKi8KKworI2lmZGVmIEhBVkVfQVZfQ09ORklHX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgICBBUkNIX0FSTQorIyAgIGluY2x1ZGUgImFybS9pbnRyZWFkd3JpdGUuaCIKKyNlbGlmIEFSQ0hfQVZSMzIKKyMgICBpbmNsdWRlICJhdnIzMi9pbnRyZWFkd3JpdGUuaCIKKyNlbGlmIEFSQ0hfTUlQUworIyAgIGluY2x1ZGUgIm1pcHMvaW50cmVhZHdyaXRlLmgiCisjZWxpZiBBUkNIX1BQQworIyAgIGluY2x1ZGUgInBwYy9pbnRyZWFkd3JpdGUuaCIKKyNlbGlmIEFSQ0hfVE9NSQorIyAgIGluY2x1ZGUgInRvbWkvaW50cmVhZHdyaXRlLmgiCisjZWxpZiBBUkNIX1g4NgorIyAgIGluY2x1ZGUgIng4Ni9pbnRyZWFkd3JpdGUuaCIKKyNlbmRpZgorCisjZW5kaWYgLyogSEFWRV9BVl9DT05GSUdfSCAqLworCisvKgorICogTWFwIEFWX1JOWFggPC0+IEFWX1JbQkxdWFggZm9yIGFsbCB2YXJpYW50cyBwcm92aWRlZCBieSBwZXItYXJjaCBoZWFkZXJzLgorICovCisKKyNpZiBBVl9IQVZFX0JJR0VORElBTgorCisjICAgaWYgICAgZGVmaW5lZChBVl9STjE2KSAmJiAhZGVmaW5lZChBVl9SQjE2KQorIyAgICAgICBkZWZpbmUgQVZfUkIxNihwKSBBVl9STjE2KHApCisjICAgZWxpZiAhZGVmaW5lZChBVl9STjE2KSAmJiAgZGVmaW5lZChBVl9SQjE2KQorIyAgICAgICBkZWZpbmUgQVZfUk4xNihwKSBBVl9SQjE2KHApCisjICAgZW5kaWYKKworIyAgIGlmICAgIGRlZmluZWQoQVZfV04xNikgJiYgIWRlZmluZWQoQVZfV0IxNikKKyMgICAgICAgZGVmaW5lIEFWX1dCMTYocCwgdikgQVZfV04xNihwLCB2KQorIyAgIGVsaWYgIWRlZmluZWQoQVZfV04xNikgJiYgIGRlZmluZWQoQVZfV0IxNikKKyMgICAgICAgZGVmaW5lIEFWX1dOMTYocCwgdikgQVZfV0IxNihwLCB2KQorIyAgIGVuZGlmCisKKyMgICBpZiAgICBkZWZpbmVkKEFWX1JOMjQpICYmICFkZWZpbmVkKEFWX1JCMjQpCisjICAgICAgIGRlZmluZSBBVl9SQjI0KHApIEFWX1JOMjQocCkKKyMgICBlbGlmICFkZWZpbmVkKEFWX1JOMjQpICYmICBkZWZpbmVkKEFWX1JCMjQpCisjICAgICAgIGRlZmluZSBBVl9STjI0KHApIEFWX1JCMjQocCkKKyMgICBlbmRpZgorCisjICAgaWYgICAgZGVmaW5lZChBVl9XTjI0KSAmJiAhZGVmaW5lZChBVl9XQjI0KQorIyAgICAgICBkZWZpbmUgQVZfV0IyNChwLCB2KSBBVl9XTjI0KHAsIHYpCisjICAgZWxpZiAhZGVmaW5lZChBVl9XTjI0KSAmJiAgZGVmaW5lZChBVl9XQjI0KQorIyAgICAgICBkZWZpbmUgQVZfV04yNChwLCB2KSBBVl9XQjI0KHAsIHYpCisjICAgZW5kaWYKKworIyAgIGlmICAgIGRlZmluZWQoQVZfUk4zMikgJiYgIWRlZmluZWQoQVZfUkIzMikKKyMgICAgICAgZGVmaW5lIEFWX1JCMzIocCkgQVZfUk4zMihwKQorIyAgIGVsaWYgIWRlZmluZWQoQVZfUk4zMikgJiYgIGRlZmluZWQoQVZfUkIzMikKKyMgICAgICAgZGVmaW5lIEFWX1JOMzIocCkgQVZfUkIzMihwKQorIyAgIGVuZGlmCisKKyMgICBpZiAgICBkZWZpbmVkKEFWX1dOMzIpICYmICFkZWZpbmVkKEFWX1dCMzIpCisjICAgICAgIGRlZmluZSBBVl9XQjMyKHAsIHYpIEFWX1dOMzIocCwgdikKKyMgICBlbGlmICFkZWZpbmVkKEFWX1dOMzIpICYmICBkZWZpbmVkKEFWX1dCMzIpCisjICAgICAgIGRlZmluZSBBVl9XTjMyKHAsIHYpIEFWX1dCMzIocCwgdikKKyMgICBlbmRpZgorCisjICAgaWYgICAgZGVmaW5lZChBVl9STjQ4KSAmJiAhZGVmaW5lZChBVl9SQjQ4KQorIyAgICAgICBkZWZpbmUgQVZfUkI0OChwKSBBVl9STjQ4KHApCisjICAgZWxpZiAhZGVmaW5lZChBVl9STjQ4KSAmJiAgZGVmaW5lZChBVl9SQjQ4KQorIyAgICAgICBkZWZpbmUgQVZfUk40OChwKSBBVl9SQjQ4KHApCisjICAgZW5kaWYKKworIyAgIGlmICAgIGRlZmluZWQoQVZfV040OCkgJiYgIWRlZmluZWQoQVZfV0I0OCkKKyMgICAgICAgZGVmaW5lIEFWX1dCNDgocCwgdikgQVZfV040OChwLCB2KQorIyAgIGVsaWYgIWRlZmluZWQoQVZfV040OCkgJiYgIGRlZmluZWQoQVZfV0I0OCkKKyMgICAgICAgZGVmaW5lIEFWX1dONDgocCwgdikgQVZfV0I0OChwLCB2KQorIyAgIGVuZGlmCisKKyMgICBpZiAgICBkZWZpbmVkKEFWX1JONjQpICYmICFkZWZpbmVkKEFWX1JCNjQpCisjICAgICAgIGRlZmluZSBBVl9SQjY0KHApIEFWX1JONjQocCkKKyMgICBlbGlmICFkZWZpbmVkKEFWX1JONjQpICYmICBkZWZpbmVkKEFWX1JCNjQpCisjICAgICAgIGRlZmluZSBBVl9STjY0KHApIEFWX1JCNjQocCkKKyMgICBlbmRpZgorCisjICAgaWYgICAgZGVmaW5lZChBVl9XTjY0KSAmJiAhZGVmaW5lZChBVl9XQjY0KQorIyAgICAgICBkZWZpbmUgQVZfV0I2NChwLCB2KSBBVl9XTjY0KHAsIHYpCisjICAgZWxpZiAhZGVmaW5lZChBVl9XTjY0KSAmJiAgZGVmaW5lZChBVl9XQjY0KQorIyAgICAgICBkZWZpbmUgQVZfV042NChwLCB2KSBBVl9XQjY0KHAsIHYpCisjICAgZW5kaWYKKworI2Vsc2UgLyogQVZfSEFWRV9CSUdFTkRJQU4gKi8KKworIyAgIGlmICAgIGRlZmluZWQoQVZfUk4xNikgJiYgIWRlZmluZWQoQVZfUkwxNikKKyMgICAgICAgZGVmaW5lIEFWX1JMMTYocCkgQVZfUk4xNihwKQorIyAgIGVsaWYgIWRlZmluZWQoQVZfUk4xNikgJiYgIGRlZmluZWQoQVZfUkwxNikKKyMgICAgICAgZGVmaW5lIEFWX1JOMTYocCkgQVZfUkwxNihwKQorIyAgIGVuZGlmCisKKyMgICBpZiAgICBkZWZpbmVkKEFWX1dOMTYpICYmICFkZWZpbmVkKEFWX1dMMTYpCisjICAgICAgIGRlZmluZSBBVl9XTDE2KHAsIHYpIEFWX1dOMTYocCwgdikKKyMgICBlbGlmICFkZWZpbmVkKEFWX1dOMTYpICYmICBkZWZpbmVkKEFWX1dMMTYpCisjICAgICAgIGRlZmluZSBBVl9XTjE2KHAsIHYpIEFWX1dMMTYocCwgdikKKyMgICBlbmRpZgorCisjICAgaWYgICAgZGVmaW5lZChBVl9STjI0KSAmJiAhZGVmaW5lZChBVl9STDI0KQorIyAgICAgICBkZWZpbmUgQVZfUkwyNChwKSBBVl9STjI0KHApCisjICAgZWxpZiAhZGVmaW5lZChBVl9STjI0KSAmJiAgZGVmaW5lZChBVl9STDI0KQorIyAgICAgICBkZWZpbmUgQVZfUk4yNChwKSBBVl9STDI0KHApCisjICAgZW5kaWYKKworIyAgIGlmICAgIGRlZmluZWQoQVZfV04yNCkgJiYgIWRlZmluZWQoQVZfV0wyNCkKKyMgICAgICAgZGVmaW5lIEFWX1dMMjQocCwgdikgQVZfV04yNChwLCB2KQorIyAgIGVsaWYgIWRlZmluZWQoQVZfV04yNCkgJiYgIGRlZmluZWQoQVZfV0wyNCkKKyMgICAgICAgZGVmaW5lIEFWX1dOMjQocCwgdikgQVZfV0wyNChwLCB2KQorIyAgIGVuZGlmCisKKyMgICBpZiAgICBkZWZpbmVkKEFWX1JOMzIpICYmICFkZWZpbmVkKEFWX1JMMzIpCisjICAgICAgIGRlZmluZSBBVl9STDMyKHApIEFWX1JOMzIocCkKKyMgICBlbGlmICFkZWZpbmVkKEFWX1JOMzIpICYmICBkZWZpbmVkKEFWX1JMMzIpCisjICAgICAgIGRlZmluZSBBVl9STjMyKHApIEFWX1JMMzIocCkKKyMgICBlbmRpZgorCisjICAgaWYgICAgZGVmaW5lZChBVl9XTjMyKSAmJiAhZGVmaW5lZChBVl9XTDMyKQorIyAgICAgICBkZWZpbmUgQVZfV0wzMihwLCB2KSBBVl9XTjMyKHAsIHYpCisjICAgZWxpZiAhZGVmaW5lZChBVl9XTjMyKSAmJiAgZGVmaW5lZChBVl9XTDMyKQorIyAgICAgICBkZWZpbmUgQVZfV04zMihwLCB2KSBBVl9XTDMyKHAsIHYpCisjICAgZW5kaWYKKworIyAgIGlmICAgIGRlZmluZWQoQVZfUk40OCkgJiYgIWRlZmluZWQoQVZfUkw0OCkKKyMgICAgICAgZGVmaW5lIEFWX1JMNDgocCkgQVZfUk40OChwKQorIyAgIGVsaWYgIWRlZmluZWQoQVZfUk40OCkgJiYgIGRlZmluZWQoQVZfUkw0OCkKKyMgICAgICAgZGVmaW5lIEFWX1JONDgocCkgQVZfUkw0OChwKQorIyAgIGVuZGlmCisKKyMgICBpZiAgICBkZWZpbmVkKEFWX1dONDgpICYmICFkZWZpbmVkKEFWX1dMNDgpCisjICAgICAgIGRlZmluZSBBVl9XTDQ4KHAsIHYpIEFWX1dONDgocCwgdikKKyMgICBlbGlmICFkZWZpbmVkKEFWX1dONDgpICYmICBkZWZpbmVkKEFWX1dMNDgpCisjICAgICAgIGRlZmluZSBBVl9XTjQ4KHAsIHYpIEFWX1dMNDgocCwgdikKKyMgICBlbmRpZgorCisjICAgaWYgICAgZGVmaW5lZChBVl9STjY0KSAmJiAhZGVmaW5lZChBVl9STDY0KQorIyAgICAgICBkZWZpbmUgQVZfUkw2NChwKSBBVl9STjY0KHApCisjICAgZWxpZiAhZGVmaW5lZChBVl9STjY0KSAmJiAgZGVmaW5lZChBVl9STDY0KQorIyAgICAgICBkZWZpbmUgQVZfUk42NChwKSBBVl9STDY0KHApCisjICAgZW5kaWYKKworIyAgIGlmICAgIGRlZmluZWQoQVZfV042NCkgJiYgIWRlZmluZWQoQVZfV0w2NCkKKyMgICAgICAgZGVmaW5lIEFWX1dMNjQocCwgdikgQVZfV042NChwLCB2KQorIyAgIGVsaWYgIWRlZmluZWQoQVZfV042NCkgJiYgIGRlZmluZWQoQVZfV0w2NCkKKyMgICAgICAgZGVmaW5lIEFWX1dONjQocCwgdikgQVZfV0w2NChwLCB2KQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiAhQVZfSEFWRV9CSUdFTkRJQU4gKi8KKworLyoKKyAqIERlZmluZSBBVl9bUlddTiBoZWxwZXIgbWFjcm9zIHRvIHNpbXBsaWZ5IGRlZmluaXRpb25zIG5vdCBwcm92aWRlZAorICogYnkgcGVyLWFyY2ggaGVhZGVycy4KKyAqLworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19USV9DT01QSUxFUl9WRVJTSU9OX18pCisKK3VuaW9uIHVuYWxpZ25lZF82NCB7IHVpbnQ2NF90IGw7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXZfYWxpYXM7Cit1bmlvbiB1bmFsaWduZWRfMzIgeyB1aW50MzJfdCBsOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF2X2FsaWFzOwordW5pb24gdW5hbGlnbmVkXzE2IHsgdWludDE2X3QgbDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdl9hbGlhczsKKworIyAgIGRlZmluZSBBVl9STihzLCBwKSAoKChjb25zdCB1bmlvbiB1bmFsaWduZWRfIyNzICopIChwKSktPmwpCisjICAgZGVmaW5lIEFWX1dOKHMsIHAsIHYpICgoKCh1bmlvbiB1bmFsaWduZWRfIyNzICopIChwKSktPmwpID0gKHYpKQorCisjZWxpZiBkZWZpbmVkKF9fREVDQykKKworIyAgIGRlZmluZSBBVl9STihzLCBwKSAoKigoY29uc3QgX191bmFsaWduZWQgdWludCMjcyMjX3QqKShwKSkpCisjICAgZGVmaW5lIEFWX1dOKHMsIHAsIHYpICgqKChfX3VuYWxpZ25lZCB1aW50IyNzIyNfdCopKHApKSA9ICh2KSkKKworI2VsaWYgQVZfSEFWRV9GQVNUX1VOQUxJR05FRAorCisjICAgZGVmaW5lIEFWX1JOKHMsIHApICgoKGNvbnN0IGF2X2FsaWFzIyNzKikocCkpLT51IyNzKQorIyAgIGRlZmluZSBBVl9XTihzLCBwLCB2KSAoKChhdl9hbGlhcyMjcyopKHApKS0+dSMjcyA9ICh2KSkKKworI2Vsc2UKKworI2lmbmRlZiBBVl9SQjE2CisjICAgZGVmaW5lIEFWX1JCMTYoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMF0gPDwgOCkgfCAgICAgICAgICBcCisgICAgICAoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMV0pCisjZW5kaWYKKyNpZm5kZWYgQVZfV0IxNgorIyAgIGRlZmluZSBBVl9XQjE2KHAsIGRhcmcpIGRvIHsgICAgICAgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBkID0gKGRhcmcpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMV0gPSAoZCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMF0gPSAoZCk+Pjg7ICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaWZuZGVmIEFWX1JMMTYKKyMgICBkZWZpbmUgQVZfUkwxNih4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCgoY29uc3QgdWludDhfdCopKHgpKVsxXSA8PCA4KSB8ICAgICAgICAgIFwKKyAgICAgICgoY29uc3QgdWludDhfdCopKHgpKVswXSkKKyNlbmRpZgorI2lmbmRlZiBBVl9XTDE2CisjICAgZGVmaW5lIEFWX1dMMTYocCwgZGFyZykgZG8geyAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGQgPSAoZGFyZyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVswXSA9IChkKTsgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVsxXSA9IChkKT4+ODsgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfUkIzMgorIyAgIGRlZmluZSBBVl9SQjMyKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgodWludDMyX3QpKChjb25zdCB1aW50OF90KikoeCkpWzBdIDw8IDI0KSB8ICAgIFwKKyAgICAgICAgICAgICAgICgoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMV0gPDwgMTYpIHwgICAgXAorICAgICAgICAgICAgICAgKCgoY29uc3QgdWludDhfdCopKHgpKVsyXSA8PCAgOCkgfCAgICBcCisgICAgICAgICAgICAgICAgKChjb25zdCB1aW50OF90KikoeCkpWzNdKQorI2VuZGlmCisjaWZuZGVmIEFWX1dCMzIKKyMgICBkZWZpbmUgQVZfV0IzMihwLCBkYXJnKSBkbyB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdW5zaWduZWQgZCA9IChkYXJnKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzNdID0gKGQpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzJdID0gKGQpPj44OyAgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzFdID0gKGQpPj4xNjsgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzBdID0gKGQpPj4yNDsgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisjZW5kaWYKKworI2lmbmRlZiBBVl9STDMyCisjICAgZGVmaW5lIEFWX1JMMzIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCh1aW50MzJfdCkoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbM10gPDwgMjQpIHwgICAgXAorICAgICAgICAgICAgICAgKCgoY29uc3QgdWludDhfdCopKHgpKVsyXSA8PCAxNikgfCAgICBcCisgICAgICAgICAgICAgICAoKChjb25zdCB1aW50OF90KikoeCkpWzFdIDw8ICA4KSB8ICAgIFwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMF0pCisjZW5kaWYKKyNpZm5kZWYgQVZfV0wzMgorIyAgIGRlZmluZSBBVl9XTDMyKHAsIGRhcmcpIGRvIHsgICAgICAgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBkID0gKGRhcmcpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMF0gPSAoZCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMV0gPSAoZCk+Pjg7ICAgICAgICAgICAgXAorICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMl0gPSAoZCk+PjE2OyAgICAgICAgICAgXAorICAgICAgICAoKHVpbnQ4X3QqKShwKSlbM10gPSAoZCk+PjI0OyAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaWZuZGVmIEFWX1JCNjQKKyMgICBkZWZpbmUgQVZfUkI2NCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKHVpbnQ2NF90KSgoY29uc3QgdWludDhfdCopKHgpKVswXSA8PCA1NikgfCAgICAgICBcCisgICAgICgodWludDY0X3QpKChjb25zdCB1aW50OF90KikoeCkpWzFdIDw8IDQ4KSB8ICAgICAgIFwKKyAgICAgKCh1aW50NjRfdCkoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMl0gPDwgNDApIHwgICAgICAgXAorICAgICAoKHVpbnQ2NF90KSgoY29uc3QgdWludDhfdCopKHgpKVszXSA8PCAzMikgfCAgICAgICBcCisgICAgICgodWludDY0X3QpKChjb25zdCB1aW50OF90KikoeCkpWzRdIDw8IDI0KSB8ICAgICAgIFwKKyAgICAgKCh1aW50NjRfdCkoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbNV0gPDwgMTYpIHwgICAgICAgXAorICAgICAoKHVpbnQ2NF90KSgoY29uc3QgdWludDhfdCopKHgpKVs2XSA8PCAgOCkgfCAgICAgICBcCisgICAgICAodWludDY0X3QpKChjb25zdCB1aW50OF90KikoeCkpWzddKQorI2VuZGlmCisjaWZuZGVmIEFWX1dCNjQKKyMgICBkZWZpbmUgQVZfV0I2NChwLCBkYXJnKSBkbyB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDY0X3QgZCA9IChkYXJnKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzddID0gKGQpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzZdID0gKGQpPj44OyAgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzVdID0gKGQpPj4xNjsgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzRdID0gKGQpPj4yNDsgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzNdID0gKGQpPj4zMjsgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzJdID0gKGQpPj40MDsgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzFdID0gKGQpPj40ODsgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50OF90KikocCkpWzBdID0gKGQpPj41NjsgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisjZW5kaWYKKworI2lmbmRlZiBBVl9STDY0CisjICAgZGVmaW5lIEFWX1JMNjQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCh1aW50NjRfdCkoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbN10gPDwgNTYpIHwgICAgICAgXAorICAgICAoKHVpbnQ2NF90KSgoY29uc3QgdWludDhfdCopKHgpKVs2XSA8PCA0OCkgfCAgICAgICBcCisgICAgICgodWludDY0X3QpKChjb25zdCB1aW50OF90KikoeCkpWzVdIDw8IDQwKSB8ICAgICAgIFwKKyAgICAgKCh1aW50NjRfdCkoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbNF0gPDwgMzIpIHwgICAgICAgXAorICAgICAoKHVpbnQ2NF90KSgoY29uc3QgdWludDhfdCopKHgpKVszXSA8PCAyNCkgfCAgICAgICBcCisgICAgICgodWludDY0X3QpKChjb25zdCB1aW50OF90KikoeCkpWzJdIDw8IDE2KSB8ICAgICAgIFwKKyAgICAgKCh1aW50NjRfdCkoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMV0gPDwgIDgpIHwgICAgICAgXAorICAgICAgKHVpbnQ2NF90KSgoY29uc3QgdWludDhfdCopKHgpKVswXSkKKyNlbmRpZgorI2lmbmRlZiBBVl9XTDY0CisjICAgZGVmaW5lIEFWX1dMNjQocCwgZGFyZykgZG8geyAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQ2NF90IGQgPSAoZGFyZyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVswXSA9IChkKTsgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVsxXSA9IChkKT4+ODsgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVsyXSA9IChkKT4+MTY7ICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVszXSA9IChkKT4+MjQ7ICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVs0XSA9IChkKT4+MzI7ICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVs1XSA9IChkKT4+NDA7ICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVs2XSA9IChkKT4+NDg7ICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVs3XSA9IChkKT4+NTY7ICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZiBBVl9IQVZFX0JJR0VORElBTgorIyAgIGRlZmluZSBBVl9STihzLCBwKSAgICBBVl9SQiMjcyhwKQorIyAgIGRlZmluZSBBVl9XTihzLCBwLCB2KSBBVl9XQiMjcyhwLCB2KQorI2Vsc2UKKyMgICBkZWZpbmUgQVZfUk4ocywgcCkgICAgQVZfUkwjI3MocCkKKyMgICBkZWZpbmUgQVZfV04ocywgcCwgdikgQVZfV0wjI3MocCwgdikKKyNlbmRpZgorCisjZW5kaWYgLyogSEFWRV9GQVNUX1VOQUxJR05FRCAqLworCisjaWZuZGVmIEFWX1JOMTYKKyMgICBkZWZpbmUgQVZfUk4xNihwKSBBVl9STigxNiwgcCkKKyNlbmRpZgorCisjaWZuZGVmIEFWX1JOMzIKKyMgICBkZWZpbmUgQVZfUk4zMihwKSBBVl9STigzMiwgcCkKKyNlbmRpZgorCisjaWZuZGVmIEFWX1JONjQKKyMgICBkZWZpbmUgQVZfUk42NChwKSBBVl9STig2NCwgcCkKKyNlbmRpZgorCisjaWZuZGVmIEFWX1dOMTYKKyMgICBkZWZpbmUgQVZfV04xNihwLCB2KSBBVl9XTigxNiwgcCwgdikKKyNlbmRpZgorCisjaWZuZGVmIEFWX1dOMzIKKyMgICBkZWZpbmUgQVZfV04zMihwLCB2KSBBVl9XTigzMiwgcCwgdikKKyNlbmRpZgorCisjaWZuZGVmIEFWX1dONjQKKyMgICBkZWZpbmUgQVZfV042NChwLCB2KSBBVl9XTig2NCwgcCwgdikKKyNlbmRpZgorCisjaWYgQVZfSEFWRV9CSUdFTkRJQU4KKyMgICBkZWZpbmUgQVZfUkIocywgcCkgICAgQVZfUk4jI3MocCkKKyMgICBkZWZpbmUgQVZfV0IocywgcCwgdikgQVZfV04jI3MocCwgdikKKyMgICBkZWZpbmUgQVZfUkwocywgcCkgICAgYXZfYnN3YXAjI3MoQVZfUk4jI3MocCkpCisjICAgZGVmaW5lIEFWX1dMKHMsIHAsIHYpIEFWX1dOIyNzKHAsIGF2X2Jzd2FwIyNzKHYpKQorI2Vsc2UKKyMgICBkZWZpbmUgQVZfUkIocywgcCkgICAgYXZfYnN3YXAjI3MoQVZfUk4jI3MocCkpCisjICAgZGVmaW5lIEFWX1dCKHMsIHAsIHYpIEFWX1dOIyNzKHAsIGF2X2Jzd2FwIyNzKHYpKQorIyAgIGRlZmluZSBBVl9STChzLCBwKSAgICBBVl9STiMjcyhwKQorIyAgIGRlZmluZSBBVl9XTChzLCBwLCB2KSBBVl9XTiMjcyhwLCB2KQorI2VuZGlmCisKKyNkZWZpbmUgQVZfUkI4KHgpICAgICAoKChjb25zdCB1aW50OF90KikoeCkpWzBdKQorI2RlZmluZSBBVl9XQjgocCwgZCkgIGRvIHsgKCh1aW50OF90KikocCkpWzBdID0gKGQpOyB9IHdoaWxlKDApCisKKyNkZWZpbmUgQVZfUkw4KHgpICAgICBBVl9SQjgoeCkKKyNkZWZpbmUgQVZfV0w4KHAsIGQpICBBVl9XQjgocCwgZCkKKworI2lmbmRlZiBBVl9SQjE2CisjICAgZGVmaW5lIEFWX1JCMTYocCkgICAgQVZfUkIoMTYsIHApCisjZW5kaWYKKyNpZm5kZWYgQVZfV0IxNgorIyAgIGRlZmluZSBBVl9XQjE2KHAsIHYpIEFWX1dCKDE2LCBwLCB2KQorI2VuZGlmCisKKyNpZm5kZWYgQVZfUkwxNgorIyAgIGRlZmluZSBBVl9STDE2KHApICAgIEFWX1JMKDE2LCBwKQorI2VuZGlmCisjaWZuZGVmIEFWX1dMMTYKKyMgICBkZWZpbmUgQVZfV0wxNihwLCB2KSBBVl9XTCgxNiwgcCwgdikKKyNlbmRpZgorCisjaWZuZGVmIEFWX1JCMzIKKyMgICBkZWZpbmUgQVZfUkIzMihwKSAgICBBVl9SQigzMiwgcCkKKyNlbmRpZgorI2lmbmRlZiBBVl9XQjMyCisjICAgZGVmaW5lIEFWX1dCMzIocCwgdikgQVZfV0IoMzIsIHAsIHYpCisjZW5kaWYKKworI2lmbmRlZiBBVl9STDMyCisjICAgZGVmaW5lIEFWX1JMMzIocCkgICAgQVZfUkwoMzIsIHApCisjZW5kaWYKKyNpZm5kZWYgQVZfV0wzMgorIyAgIGRlZmluZSBBVl9XTDMyKHAsIHYpIEFWX1dMKDMyLCBwLCB2KQorI2VuZGlmCisKKyNpZm5kZWYgQVZfUkI2NAorIyAgIGRlZmluZSBBVl9SQjY0KHApICAgIEFWX1JCKDY0LCBwKQorI2VuZGlmCisjaWZuZGVmIEFWX1dCNjQKKyMgICBkZWZpbmUgQVZfV0I2NChwLCB2KSBBVl9XQig2NCwgcCwgdikKKyNlbmRpZgorCisjaWZuZGVmIEFWX1JMNjQKKyMgICBkZWZpbmUgQVZfUkw2NChwKSAgICBBVl9STCg2NCwgcCkKKyNlbmRpZgorI2lmbmRlZiBBVl9XTDY0CisjICAgZGVmaW5lIEFWX1dMNjQocCwgdikgQVZfV0woNjQsIHAsIHYpCisjZW5kaWYKKworI2lmbmRlZiBBVl9SQjI0CisjICAgZGVmaW5lIEFWX1JCMjQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMF0gPDwgMTYpIHwgICAgICAgICBcCisgICAgICgoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMV0gPDwgIDgpIHwgICAgICAgICBcCisgICAgICAoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMl0pCisjZW5kaWYKKyNpZm5kZWYgQVZfV0IyNAorIyAgIGRlZmluZSBBVl9XQjI0KHAsIGQpIGRvIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMl0gPSAoZCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMV0gPSAoZCk+Pjg7ICAgICAgICAgICAgXAorICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMF0gPSAoZCk+PjE2OyAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaWZuZGVmIEFWX1JMMjQKKyMgICBkZWZpbmUgQVZfUkwyNCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCgoY29uc3QgdWludDhfdCopKHgpKVsyXSA8PCAxNikgfCAgICAgICAgIFwKKyAgICAgKCgoY29uc3QgdWludDhfdCopKHgpKVsxXSA8PCAgOCkgfCAgICAgICAgIFwKKyAgICAgICgoY29uc3QgdWludDhfdCopKHgpKVswXSkKKyNlbmRpZgorI2lmbmRlZiBBVl9XTDI0CisjICAgZGVmaW5lIEFWX1dMMjQocCwgZCkgZG8geyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVswXSA9IChkKTsgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVsxXSA9IChkKT4+ODsgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVsyXSA9IChkKT4+MTY7ICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfUkI0OAorIyAgIGRlZmluZSBBVl9SQjQ4KHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCh1aW50NjRfdCkoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMF0gPDwgNDApIHwgICAgICAgICBcCisgICAgICgodWludDY0X3QpKChjb25zdCB1aW50OF90KikoeCkpWzFdIDw8IDMyKSB8ICAgICAgICAgXAorICAgICAoKHVpbnQ2NF90KSgoY29uc3QgdWludDhfdCopKHgpKVsyXSA8PCAyNCkgfCAgICAgICAgIFwKKyAgICAgKCh1aW50NjRfdCkoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbM10gPDwgMTYpIHwgICAgICAgICBcCisgICAgICgodWludDY0X3QpKChjb25zdCB1aW50OF90KikoeCkpWzRdIDw8ICA4KSB8ICAgICAgICAgXAorICAgICAgKHVpbnQ2NF90KSgoY29uc3QgdWludDhfdCopKHgpKVs1XSkKKyNlbmRpZgorI2lmbmRlZiBBVl9XQjQ4CisjICAgZGVmaW5lIEFWX1dCNDgocCwgZGFyZykgZG8geyAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQ2NF90IGQgPSAoZGFyZyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVs1XSA9IChkKTsgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVs0XSA9IChkKT4+ODsgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVszXSA9IChkKT4+MTY7ICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVsyXSA9IChkKT4+MjQ7ICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVsxXSA9IChkKT4+MzI7ICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVswXSA9IChkKT4+NDA7ICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfUkw0OAorIyAgIGRlZmluZSBBVl9STDQ4KHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCh1aW50NjRfdCkoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbNV0gPDwgNDApIHwgICAgICAgICBcCisgICAgICgodWludDY0X3QpKChjb25zdCB1aW50OF90KikoeCkpWzRdIDw8IDMyKSB8ICAgICAgICAgXAorICAgICAoKHVpbnQ2NF90KSgoY29uc3QgdWludDhfdCopKHgpKVszXSA8PCAyNCkgfCAgICAgICAgIFwKKyAgICAgKCh1aW50NjRfdCkoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMl0gPDwgMTYpIHwgICAgICAgICBcCisgICAgICgodWludDY0X3QpKChjb25zdCB1aW50OF90KikoeCkpWzFdIDw8ICA4KSB8ICAgICAgICAgXAorICAgICAgKHVpbnQ2NF90KSgoY29uc3QgdWludDhfdCopKHgpKVswXSkKKyNlbmRpZgorI2lmbmRlZiBBVl9XTDQ4CisjICAgZGVmaW5lIEFWX1dMNDgocCwgZGFyZykgZG8geyAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQ2NF90IGQgPSAoZGFyZyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVswXSA9IChkKTsgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVsxXSA9IChkKT4+ODsgICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVsyXSA9IChkKT4+MTY7ICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVszXSA9IChkKT4+MjQ7ICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVs0XSA9IChkKT4+MzI7ICAgICAgICAgICBcCisgICAgICAgICgodWludDhfdCopKHApKVs1XSA9IChkKT4+NDA7ICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorI2VuZGlmCisKKy8qCisgKiBUaGUgQVZfW1JXXU5BIG1hY3JvcyBhY2Nlc3MgbmF0dXJhbGx5IGFsaWduZWQgZGF0YQorICogaW4gYSB0eXBlLXNhZmUgd2F5LgorICovCisKKyNkZWZpbmUgQVZfUk5BKHMsIHApICAgICgoKGNvbnN0IGF2X2FsaWFzIyNzKikocCkpLT51IyNzKQorI2RlZmluZSBBVl9XTkEocywgcCwgdikgKCgoYXZfYWxpYXMjI3MqKShwKSktPnUjI3MgPSAodikpCisKKyNpZm5kZWYgQVZfUk4xNkEKKyMgICBkZWZpbmUgQVZfUk4xNkEocCkgQVZfUk5BKDE2LCBwKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfUk4zMkEKKyMgICBkZWZpbmUgQVZfUk4zMkEocCkgQVZfUk5BKDMyLCBwKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfUk42NEEKKyMgICBkZWZpbmUgQVZfUk42NEEocCkgQVZfUk5BKDY0LCBwKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfV04xNkEKKyMgICBkZWZpbmUgQVZfV04xNkEocCwgdikgQVZfV05BKDE2LCBwLCB2KQorI2VuZGlmCisKKyNpZm5kZWYgQVZfV04zMkEKKyMgICBkZWZpbmUgQVZfV04zMkEocCwgdikgQVZfV05BKDMyLCBwLCB2KQorI2VuZGlmCisKKyNpZm5kZWYgQVZfV042NEEKKyMgICBkZWZpbmUgQVZfV042NEEocCwgdikgQVZfV05BKDY0LCBwLCB2KQorI2VuZGlmCisKKy8qCisgKiBUaGUgQVZfQ09QWXh4VSBtYWNyb3MgYXJlIHN1aXRhYmxlIGZvciBjb3B5aW5nIGRhdGEgdG8vZnJvbSB1bmFsaWduZWQKKyAqIG1lbW9yeSBsb2NhdGlvbnMuCisgKi8KKworI2RlZmluZSBBVl9DT1BZVShuLCBkLCBzKSBBVl9XTiMjbihkLCBBVl9STiMjbihzKSk7CisKKyNpZm5kZWYgQVZfQ09QWTE2VQorIyAgIGRlZmluZSBBVl9DT1BZMTZVKGQsIHMpIEFWX0NPUFlVKDE2LCBkLCBzKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfQ09QWTMyVQorIyAgIGRlZmluZSBBVl9DT1BZMzJVKGQsIHMpIEFWX0NPUFlVKDMyLCBkLCBzKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfQ09QWTY0VQorIyAgIGRlZmluZSBBVl9DT1BZNjRVKGQsIHMpIEFWX0NPUFlVKDY0LCBkLCBzKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfQ09QWTEyOFUKKyMgICBkZWZpbmUgQVZfQ09QWTEyOFUoZCwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBVl9DT1BZNjRVKGQsIHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVZfQ09QWTY0VSgoY2hhciAqKShkKSArIDgsIChjb25zdCBjaGFyICopKHMpICsgOCk7ICAgICBcCisgICAgfSB3aGlsZSgwKQorI2VuZGlmCisKKy8qIFBhcmFtZXRlcnMgZm9yIEFWX0NPUFkqLCBBVl9TV0FQKiwgQVZfWkVSTyogbXVzdCBiZQorICogbmF0dXJhbGx5IGFsaWduZWQuIFRoZXkgbWF5IGJlIGltcGxlbWVudGVkIHVzaW5nIE1NWCwKKyAqIHNvIGVtbXNfYygpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBhbnkgZmxvYXQgY29kZQorICogYWZ0ZXJ3YXJkcy4KKyAqLworCisjZGVmaW5lIEFWX0NPUFkobiwgZCwgcykgXAorICAgICgoKGF2X2FsaWFzIyNuKikoZCkpLT51IyNuID0gKChjb25zdCBhdl9hbGlhcyMjbiopKHMpKS0+dSMjbikKKworI2lmbmRlZiBBVl9DT1BZMTYKKyMgICBkZWZpbmUgQVZfQ09QWTE2KGQsIHMpIEFWX0NPUFkoMTYsIGQsIHMpCisjZW5kaWYKKworI2lmbmRlZiBBVl9DT1BZMzIKKyMgICBkZWZpbmUgQVZfQ09QWTMyKGQsIHMpIEFWX0NPUFkoMzIsIGQsIHMpCisjZW5kaWYKKworI2lmbmRlZiBBVl9DT1BZNjQKKyMgICBkZWZpbmUgQVZfQ09QWTY0KGQsIHMpIEFWX0NPUFkoNjQsIGQsIHMpCisjZW5kaWYKKworI2lmbmRlZiBBVl9DT1BZMTI4CisjICAgZGVmaW5lIEFWX0NPUFkxMjgoZCwgcykgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBVl9DT1BZNjQoZCwgcyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFWX0NPUFk2NCgoY2hhciopKGQpKzgsIChjaGFyKikocykrOCk7IFwKKyAgICB9IHdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSBBVl9TV0FQKG4sIGEsIGIpIEZGU1dBUChhdl9hbGlhcyMjbiwgKihhdl9hbGlhcyMjbiopKGEpLCAqKGF2X2FsaWFzIyNuKikoYikpCisKKyNpZm5kZWYgQVZfU1dBUDY0CisjICAgZGVmaW5lIEFWX1NXQVA2NChhLCBiKSBBVl9TV0FQKDY0LCBhLCBiKQorI2VuZGlmCisKKyNkZWZpbmUgQVZfWkVSTyhuLCBkKSAoKChhdl9hbGlhcyMjbiopKGQpKS0+dSMjbiA9IDApCisKKyNpZm5kZWYgQVZfWkVSTzE2CisjICAgZGVmaW5lIEFWX1pFUk8xNihkKSBBVl9aRVJPKDE2LCBkKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfWkVSTzMyCisjICAgZGVmaW5lIEFWX1pFUk8zMihkKSBBVl9aRVJPKDMyLCBkKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfWkVSTzY0CisjICAgZGVmaW5lIEFWX1pFUk82NChkKSBBVl9aRVJPKDY0LCBkKQorI2VuZGlmCisKKyNpZm5kZWYgQVZfWkVSTzEyOAorIyAgIGRlZmluZSBBVl9aRVJPMTI4KGQpICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBVl9aRVJPNjQoZCk7ICAgICAgICAgICAgXAorICAgICAgICBBVl9aRVJPNjQoKGNoYXIqKShkKSs4KTsgXAorICAgIH0gd2hpbGUoMCkKKyNlbmRpZgorCisjZW5kaWYgLyogQVZVVElMX0lOVFJFQURXUklURV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2xmZy5jIGIvZmZtcGVnL2xpYmF2dXRpbC9sZmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmEyZjFmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9sZmcuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIExhZ2dlZCBGaWJvbmFjY2kgUFJORworICogQ29weXJpZ2h0IChjKSAyMDA4IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImxmZy5oIgorI2luY2x1ZGUgIm1kNS5oIgorI2luY2x1ZGUgImludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF0dHJpYnV0ZXMuaCIKKworYXZfY29sZCB2b2lkIGF2X2xmZ19pbml0KEFWTEZHICpjLCB1bnNpZ25lZCBpbnQgc2VlZCkKK3sKKyAgICB1aW50OF90IHRtcFsxNl0gPSB7IDAgfTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDg7IGkgPCA2NDsgaSArPSA0KSB7CisgICAgICAgIEFWX1dMMzIodG1wLCBzZWVkKTsKKyAgICAgICAgdG1wWzRdID0gaTsKKyAgICAgICAgYXZfbWQ1X3N1bSh0bXAsIHRtcCwgMTYpOworICAgICAgICBjLT5zdGF0ZVtpICAgIF0gPSBBVl9STDMyKHRtcCk7CisgICAgICAgIGMtPnN0YXRlW2kgKyAxXSA9IEFWX1JMMzIodG1wICsgNCk7CisgICAgICAgIGMtPnN0YXRlW2kgKyAyXSA9IEFWX1JMMzIodG1wICsgOCk7CisgICAgICAgIGMtPnN0YXRlW2kgKyAzXSA9IEFWX1JMMzIodG1wICsgMTIpOworICAgIH0KKyAgICBjLT5pbmRleCA9IDA7Cit9CisKK3ZvaWQgYXZfYm1nX2dldChBVkxGRyAqbGZnLCBkb3VibGUgb3V0WzJdKQoreworICAgIGRvdWJsZSB4MSwgeDIsIHc7CisKKyAgICBkbyB7CisgICAgICAgIHgxID0gMi4wIC8gVUlOVF9NQVggKiBhdl9sZmdfZ2V0KGxmZykgLSAxLjA7CisgICAgICAgIHgyID0gMi4wIC8gVUlOVF9NQVggKiBhdl9sZmdfZ2V0KGxmZykgLSAxLjA7CisgICAgICAgIHcgID0geDEgKiB4MSArIHgyICogeDI7CisgICAgfSB3aGlsZSAodyA+PSAxLjApOworCisgICAgdyA9IHNxcnQoKC0yLjAgKiBsb2codykpIC8gdyk7CisgICAgb3V0WzBdID0geDEgKiB3OworICAgIG91dFsxXSA9IHgyICogdzsKK30KKworI2lmZGVmIFRFU1QKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludCB4ID0gMDsKKyAgICBpbnQgaSwgajsKKyAgICBBVkxGRyBzdGF0ZTsKKworICAgIGF2X2xmZ19pbml0KCZzdGF0ZSwgMHhkZWFkYmVlZik7CisgICAgZm9yIChqID0gMDsgaiA8IDEwMDAwOyBqKyspIHsKKyAgICAgICAgU1RBUlRfVElNRVIKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDYyNDsgaSsrKSB7CisgICAgICAgICAgICAvL2F2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlWFxuIiwgYXZfbGZnX2dldCgmc3RhdGUpKTsKKyAgICAgICAgICAgIHggKz0gYXZfbGZnX2dldCgmc3RhdGUpOworICAgICAgICB9CisgICAgICAgIFNUT1BfVElNRVIoIjYyNCBjYWxscyBvZiBhdl9sZmdfZ2V0Iik7CisgICAgfQorICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJmaW5hbCB2YWx1ZTolWFxuIiwgeCk7CisKKyAgICAvKiBCTUcgdXNhZ2UgZXhhbXBsZSAqLworICAgIHsKKyAgICAgICAgZG91YmxlIG1lYW4gICA9IDEwMDA7CisgICAgICAgIGRvdWJsZSBzdGRkZXYgPSA1MzsKKworICAgICAgICBhdl9sZmdfaW5pdCgmc3RhdGUsIDQyKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSArPSAyKSB7CisgICAgICAgICAgICBkb3VibGUgYm1nX291dFsyXTsKKyAgICAgICAgICAgIGF2X2JtZ19nZXQoJnN0YXRlLCBibWdfb3V0KTsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiJWZcbiVmXG4iLAorICAgICAgICAgICAgICAgICAgIGJtZ19vdXRbMF0gKiBzdGRkZXYgKyBtZWFuLAorICAgICAgICAgICAgICAgICAgIGJtZ19vdXRbMV0gKiBzdGRkZXYgKyBtZWFuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2xmZy5oIGIvZmZtcGVnL2xpYmF2dXRpbC9sZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzkwNTYyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9sZmcuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogTGFnZ2VkIEZpYm9uYWNjaSBQUk5HCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9MRkdfSAorI2RlZmluZSBBVlVUSUxfTEZHX0gKKwordHlwZWRlZiBzdHJ1Y3QgQVZMRkcgeworICAgIHVuc2lnbmVkIGludCBzdGF0ZVs2NF07CisgICAgaW50IGluZGV4OworfSBBVkxGRzsKKwordm9pZCBhdl9sZmdfaW5pdChBVkxGRyAqYywgdW5zaWduZWQgaW50IHNlZWQpOworCisvKioKKyAqIEdldCB0aGUgbmV4dCByYW5kb20gdW5zaWduZWQgMzItYml0IG51bWJlciB1c2luZyBhbiBBTEZHLgorICoKKyAqIFBsZWFzZSBhbHNvIGNvbnNpZGVyIGEgc2ltcGxlIExDRyBsaWtlIHN0YXRlPSBzdGF0ZSoxNjY0NTI1KzEwMTM5MDQyMjMsCisgKiBpdCBtYXkgYmUgZ29vZCBlbm91Z2ggYW5kIGZhc3RlciBmb3IgeW91ciBzcGVjaWZpYyB1c2UgY2FzZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXZfbGZnX2dldChBVkxGRyAqYyl7CisgICAgYy0+c3RhdGVbYy0+aW5kZXggJiA2M10gPSBjLT5zdGF0ZVsoYy0+aW5kZXgtMjQpICYgNjNdICsgYy0+c3RhdGVbKGMtPmluZGV4LTU1KSAmIDYzXTsKKyAgICByZXR1cm4gYy0+c3RhdGVbYy0+aW5kZXgrKyAmIDYzXTsKK30KKworLyoqCisgKiBHZXQgdGhlIG5leHQgcmFuZG9tIHVuc2lnbmVkIDMyLWJpdCBudW1iZXIgdXNpbmcgYSBNTEZHLgorICoKKyAqIFBsZWFzZSBhbHNvIGNvbnNpZGVyIGF2X2xmZ19nZXQoKSBhYm92ZSwgaXQgaXMgZmFzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdl9tbGZnX2dldChBVkxGRyAqYyl7CisgICAgdW5zaWduZWQgaW50IGE9IGMtPnN0YXRlWyhjLT5pbmRleC01NSkgJiA2M107CisgICAgdW5zaWduZWQgaW50IGI9IGMtPnN0YXRlWyhjLT5pbmRleC0yNCkgJiA2M107CisgICAgcmV0dXJuIGMtPnN0YXRlW2MtPmluZGV4KysgJiA2M10gPSAyKmEqYithK2I7Cit9CisKKy8qKgorICogR2V0IHRoZSBuZXh0IHR3byBudW1iZXJzIGdlbmVyYXRlZCBieSBhIEJveC1NdWxsZXIgR2F1c3NpYW4KKyAqIGdlbmVyYXRvciB1c2luZyB0aGUgcmFuZG9tIG51bWJlcnMgaXNzdWVkIGJ5IGxmZy4KKyAqCisgKiBAcGFyYW0gb3V0IGFycmF5IHdoZXJlIHRoZSB0d28gZ2VuZXJhdGVkIG51bWJlcnMgYXJlIHBsYWNlZAorICovCit2b2lkIGF2X2JtZ19nZXQoQVZMRkcgKmxmZywgZG91YmxlIG91dFsyXSk7CisKKyNlbmRpZiAvKiBBVlVUSUxfTEZHX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvbGliYXZ1dGlsLnYgYi9mZm1wZWcvbGliYXZ1dGlsL2xpYmF2dXRpbC52Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZjA0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2xpYmF2dXRpbC52CkBAIC0wLDAgKzEsNCBAQAorTElCQVZVVElMXyRNQUpPUiB7CisgICAgICAgIGdsb2JhbDogYXYqOworICAgICAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2xpYm0uaCBiL2ZmbXBlZy9saWJhdnV0aWwvbGlibS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMTdiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2xpYm0uaApAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSZXBsYWNlbWVudHMgZm9yIGZyZXF1ZW50bHkgbWlzc2luZyBsaWJtIGZ1bmN0aW9ucworICovCisKKyNpZm5kZWYgQVZVVElMX0xJQk1fSAorI2RlZmluZSBBVlVUSUxfTElCTV9ICisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImludGZsb2F0LmgiCisKKyNpZiBIQVZFX01JUFNGUFUgJiYgSEFWRV9JTkxJTkVfQVNNCisjaW5jbHVkZSAibGliYXZ1dGlsL21pcHMvbGlibV9taXBzLmgiCisjZW5kaWYgLyogSEFWRV9NSVBTRlBVICYmIEhBVkVfSU5MSU5FX0FTTSovCisKKyNpZiAhSEFWRV9BVEFORgorI3VuZGVmIGF0YW5mCisjZGVmaW5lIGF0YW5mKHgpICgoZmxvYXQpYXRhbih4KSkKKyNlbmRpZgorCisjaWYgIUhBVkVfQVRBTjJGCisjdW5kZWYgYXRhbjJmCisjZGVmaW5lIGF0YW4yZih5LCB4KSAoKGZsb2F0KWF0YW4yKHksIHgpKQorI2VuZGlmCisKKyNpZiAhSEFWRV9QT1dGCisjdW5kZWYgcG93ZgorI2RlZmluZSBwb3dmKHgsIHkpICgoZmxvYXQpcG93KHgsIHkpKQorI2VuZGlmCisKKyNpZiAhSEFWRV9DQlJUCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBkb3VibGUgY2JydChkb3VibGUgeCkKK3sKKyAgICByZXR1cm4geCA8IDAgPyAtcG93KC14LCAxLjAgLyAzLjApIDogcG93KHgsIDEuMCAvIDMuMCk7Cit9CisjZW5kaWYKKworI2lmICFIQVZFX0NCUlRGCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBmbG9hdCBjYnJ0ZihmbG9hdCB4KQoreworICAgIHJldHVybiB4IDwgMCA/IC1wb3dmKC14LCAxLjAgLyAzLjApIDogcG93Zih4LCAxLjAgLyAzLjApOworfQorI2VuZGlmCisKKyNpZiAhSEFWRV9DT1NGCisjdW5kZWYgY29zZgorI2RlZmluZSBjb3NmKHgpICgoZmxvYXQpY29zKHgpKQorI2VuZGlmCisKKyNpZiAhSEFWRV9FWFBGCisjdW5kZWYgZXhwZgorI2RlZmluZSBleHBmKHgpICgoZmxvYXQpZXhwKHgpKQorI2VuZGlmCisKKyNpZiAhSEFWRV9FWFAyCisjdW5kZWYgZXhwMgorI2RlZmluZSBleHAyKHgpIGV4cCgoeCkgKiAwLjY5MzE0NzE4MDU1OTk0NSkKKyNlbmRpZiAvKiBIQVZFX0VYUDIgKi8KKworI2lmICFIQVZFX0VYUDJGCisjdW5kZWYgZXhwMmYKKyNkZWZpbmUgZXhwMmYoeCkgKChmbG9hdClleHAyKHgpKQorI2VuZGlmIC8qIEhBVkVfRVhQMkYgKi8KKworI2lmICFIQVZFX0lTSU5GCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCBpbnQgaXNpbmYoZmxvYXQgeCkKK3sKKyAgICB1aW50MzJfdCB2ID0gYXZfZmxvYXQyaW50KHgpOworICAgIGlmICgodiAmIDB4N2Y4MDAwMDApICE9IDB4N2Y4MDAwMDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAhKHYgJiAweDAwN2ZmZmZmKTsKK30KKyNlbmRpZiAvKiBIQVZFX0lTSU5GICovCisKKyNpZiAhSEFWRV9JU05BTgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IGlzbmFuKGZsb2F0IHgpCit7CisgICAgdWludDMyX3QgdiA9IGF2X2Zsb2F0MmludCh4KTsKKyAgICBpZiAoKHYgJiAweDdmODAwMDAwKSAhPSAweDdmODAwMDAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gdiAmIDB4MDA3ZmZmZmY7Cit9CisjZW5kaWYgLyogSEFWRV9JU05BTiAqLworCisjaWYgIUhBVkVfTERFWFBGCisjdW5kZWYgbGRleHBmCisjZGVmaW5lIGxkZXhwZih4LCBleHApICgoZmxvYXQpbGRleHAoeCwgZXhwKSkKKyNlbmRpZgorCisjaWYgIUhBVkVfTExSSU5UCisjdW5kZWYgbGxyaW50CisjZGVmaW5lIGxscmludCh4KSAoKGxvbmcgbG9uZylyaW50KHgpKQorI2VuZGlmIC8qIEhBVkVfTExSSU5UICovCisKKyNpZiAhSEFWRV9MTFJJTlRGCisjdW5kZWYgbGxyaW50ZgorI2RlZmluZSBsbHJpbnRmKHgpICgobG9uZyBsb25nKXJpbnQoeCkpCisjZW5kaWYgLyogSEFWRV9MTFJJTlQgKi8KKworI2lmICFIQVZFX0xPRzIKKyN1bmRlZiBsb2cyCisjZGVmaW5lIGxvZzIoeCkgKGxvZyh4KSAqIDEuNDQyNjk1MDQwODg4OTYzNDA3MzYpCisjZW5kaWYgLyogSEFWRV9MT0cyICovCisKKyNpZiAhSEFWRV9MT0cyRgorI3VuZGVmIGxvZzJmCisjZGVmaW5lIGxvZzJmKHgpICgoZmxvYXQpbG9nMih4KSkKKyNlbmRpZiAvKiBIQVZFX0xPRzJGICovCisKKyNpZiAhSEFWRV9MT0cxMEYKKyN1bmRlZiBsb2cxMGYKKyNkZWZpbmUgbG9nMTBmKHgpICgoZmxvYXQpbG9nMTAoeCkpCisjZW5kaWYKKworI2lmICFIQVZFX1NJTkYKKyN1bmRlZiBzaW5mCisjZGVmaW5lIHNpbmYoeCkgKChmbG9hdClzaW4oeCkpCisjZW5kaWYKKworI2lmICFIQVZFX1JJTlQKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHJpbnQoZG91YmxlIHgpCit7CisgICAgcmV0dXJuIHggPj0gMCA/IGZsb29yKHggKyAwLjUpIDogY2VpbCh4IC0gMC41KTsKK30KKyNlbmRpZiAvKiBIQVZFX1JJTlQgKi8KKworI2lmICFIQVZFX0xSSU5UCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCBsb25nIGludCBscmludChkb3VibGUgeCkKK3sKKyAgICByZXR1cm4gcmludCh4KTsKK30KKyNlbmRpZiAvKiBIQVZFX0xSSU5UICovCisKKyNpZiAhSEFWRV9MUklOVEYKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IGxvbmcgaW50IGxyaW50ZihmbG9hdCB4KQoreworICAgIHJldHVybiAoaW50KShyaW50KHgpKTsKK30KKyNlbmRpZiAvKiBIQVZFX0xSSU5URiAqLworCisjaWYgIUhBVkVfUk9VTkQKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IGRvdWJsZSByb3VuZChkb3VibGUgeCkKK3sKKyAgICByZXR1cm4gKHggPiAwKSA/IGZsb29yKHggKyAwLjUpIDogY2VpbCh4IC0gMC41KTsKK30KKyNlbmRpZiAvKiBIQVZFX1JPVU5EICovCisKKyNpZiAhSEFWRV9ST1VOREYKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IGZsb2F0IHJvdW5kZihmbG9hdCB4KQoreworICAgIHJldHVybiAoeCA+IDApID8gZmxvb3IoeCArIDAuNSkgOiBjZWlsKHggLSAwLjUpOworfQorI2VuZGlmIC8qIEhBVkVfUk9VTkRGICovCisKKyNpZiAhSEFWRV9UUlVOQworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgZG91YmxlIHRydW5jKGRvdWJsZSB4KQoreworICAgIHJldHVybiAoeCA+IDApID8gZmxvb3IoeCkgOiBjZWlsKHgpOworfQorI2VuZGlmIC8qIEhBVkVfVFJVTkMgKi8KKworI2lmICFIQVZFX1RSVU5DRgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgZmxvYXQgdHJ1bmNmKGZsb2F0IHgpCit7CisgICAgcmV0dXJuICh4ID4gMCkgPyBmbG9vcih4KSA6IGNlaWwoeCk7Cit9CisjZW5kaWYgLyogSEFWRV9UUlVOQ0YgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9MSUJNX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvbGxzLmMgYi9mZm1wZWcvbGliYXZ1dGlsL2xscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzA0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2xscy5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogbGluZWFyIGxlYXN0IHNxdWFyZXMgbW9kZWwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbGluZWFyIGxlYXN0IHNxdWFyZXMgbW9kZWwKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJsbHMuaCIKKworc3RhdGljIHZvaWQgdXBkYXRlX2xscyhMTFNNb2RlbCAqbSwgY29uc3QgZG91YmxlICp2YXIpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IG0tPmluZGVwX2NvdW50OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gaTsgaiA8PSBtLT5pbmRlcF9jb3VudDsgaisrKSB7CisgICAgICAgICAgICBtLT5jb3ZhcmlhbmNlW2ldW2pdICs9IHZhcltpXSAqIHZhcltqXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBhdnByaXZfc29sdmVfbGxzKExMU01vZGVsICptLCBkb3VibGUgdGhyZXNob2xkLCB1bnNpZ25lZCBzaG9ydCBtaW5fb3JkZXIpCit7CisgICAgaW50IGksIGosIGs7CisgICAgZG91YmxlICgqZmFjdG9yKVtNQVhfVkFSU19BTElHTl0gPSAodm9pZCAqKSAmbS0+Y292YXJpYW5jZVsxXVswXTsKKyAgICBkb3VibGUgKCpjb3ZhcikgW01BWF9WQVJTX0FMSUdOXSA9ICh2b2lkICopICZtLT5jb3ZhcmlhbmNlWzFdWzFdOworICAgIGRvdWJsZSAqY292YXJfeSAgICAgICAgICAgICAgICA9IG0tPmNvdmFyaWFuY2VbMF07CisgICAgaW50IGNvdW50ICAgICAgICAgICAgICAgICAgICAgID0gbS0+aW5kZXBfY291bnQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSBpOyBqIDwgY291bnQ7IGorKykgeworICAgICAgICAgICAgZG91YmxlIHN1bSA9IGNvdmFyW2ldW2pdOworCisgICAgICAgICAgICBmb3IgKGsgPSBpIC0gMTsgayA+PSAwOyBrLS0pCisgICAgICAgICAgICAgICAgc3VtIC09IGZhY3RvcltpXVtrXSAqIGZhY3RvcltqXVtrXTsKKworICAgICAgICAgICAgaWYgKGkgPT0gaikgeworICAgICAgICAgICAgICAgIGlmIChzdW0gPCB0aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgIHN1bSA9IDEuMDsKKyAgICAgICAgICAgICAgICBmYWN0b3JbaV1baV0gPSBzcXJ0KHN1bSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhY3RvcltqXVtpXSA9IHN1bSAvIGZhY3RvcltpXVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBzdW0gPSBjb3Zhcl95W2kgKyAxXTsKKworICAgICAgICBmb3IgKGsgPSBpIC0gMTsgayA+PSAwOyBrLS0pCisgICAgICAgICAgICBzdW0gLT0gZmFjdG9yW2ldW2tdICogbS0+Y29lZmZbMF1ba107CisKKyAgICAgICAgbS0+Y29lZmZbMF1baV0gPSBzdW0gLyBmYWN0b3JbaV1baV07CisgICAgfQorCisgICAgZm9yIChqID0gY291bnQgLSAxOyBqID49IG1pbl9vcmRlcjsgai0tKSB7CisgICAgICAgIGZvciAoaSA9IGo7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBkb3VibGUgc3VtID0gbS0+Y29lZmZbMF1baV07CisKKyAgICAgICAgICAgIGZvciAoayA9IGkgKyAxOyBrIDw9IGo7IGsrKykKKyAgICAgICAgICAgICAgICBzdW0gLT0gZmFjdG9yW2tdW2ldICogbS0+Y29lZmZbal1ba107CisKKyAgICAgICAgICAgIG0tPmNvZWZmW2pdW2ldID0gc3VtIC8gZmFjdG9yW2ldW2ldOworICAgICAgICB9CisKKyAgICAgICAgbS0+dmFyaWFuY2Vbal0gPSBjb3Zhcl95WzBdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gajsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgc3VtID0gbS0+Y29lZmZbal1baV0gKiBjb3ZhcltpXVtpXSAtIDIgKiBjb3Zhcl95W2kgKyAxXTsKKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGk7IGsrKykKKyAgICAgICAgICAgICAgICBzdW0gKz0gMiAqIG0tPmNvZWZmW2pdW2tdICogY292YXJba11baV07CisKKyAgICAgICAgICAgIG0tPnZhcmlhbmNlW2pdICs9IG0tPmNvZWZmW2pdW2ldICogc3VtOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgZG91YmxlIGV2YWx1YXRlX2xscyhMTFNNb2RlbCAqbSwgY29uc3QgZG91YmxlICpwYXJhbSwgaW50IG9yZGVyKQoreworICAgIGludCBpOworICAgIGRvdWJsZSBvdXQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8PSBvcmRlcjsgaSsrKQorICAgICAgICBvdXQgKz0gcGFyYW1baV0gKiBtLT5jb2VmZltvcmRlcl1baV07CisKKyAgICByZXR1cm4gb3V0OworfQorCithdl9jb2xkIHZvaWQgYXZwcml2X2luaXRfbGxzKExMU01vZGVsICptLCBpbnQgaW5kZXBfY291bnQpCit7CisgICAgbWVtc2V0KG0sIDAsIHNpemVvZihMTFNNb2RlbCkpOworICAgIG0tPmluZGVwX2NvdW50ID0gaW5kZXBfY291bnQ7CisgICAgbS0+dXBkYXRlX2xscyA9IHVwZGF0ZV9sbHM7CisgICAgbS0+ZXZhbHVhdGVfbGxzID0gZXZhbHVhdGVfbGxzOworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfaW5pdF9sbHNfeDg2KG0pOworfQorCisjaWZkZWYgVEVTVAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJsZmcuaCIKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBMTFNNb2RlbCBtOworICAgIGludCBpLCBvcmRlcjsKKyAgICBBVkxGRyBsZmc7CisKKyAgICBhdl9sZmdfaW5pdCgmbGZnLCAxKTsKKyAgICBhdnByaXZfaW5pdF9sbHMoJm0sIDMpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAgIExPQ0FMX0FMSUdORUQoMzIsIGRvdWJsZSwgdmFyLCBbNF0pOworICAgICAgICBkb3VibGUgZXZhbDsKKworICAgICAgICB2YXJbMF0gPSAoYXZfbGZnX2dldCgmbGZnKSAvIChkb3VibGUpIFVJTlRfTUFYIC0gMC41KSAqIDI7CisgICAgICAgIHZhclsxXSA9IHZhclswXSArIGF2X2xmZ19nZXQoJmxmZykgLyAoZG91YmxlKSBVSU5UX01BWCAtIDAuNTsKKyAgICAgICAgdmFyWzJdID0gdmFyWzFdICsgYXZfbGZnX2dldCgmbGZnKSAvIChkb3VibGUpIFVJTlRfTUFYIC0gMC41OworICAgICAgICB2YXJbM10gPSB2YXJbMl0gKyBhdl9sZmdfZ2V0KCZsZmcpIC8gKGRvdWJsZSkgVUlOVF9NQVggLSAwLjU7CisgICAgICAgIG0udXBkYXRlX2xscygmbSwgdmFyKTsKKyAgICAgICAgYXZwcml2X3NvbHZlX2xscygmbSwgMC4wMDEsIDApOworICAgICAgICBmb3IgKG9yZGVyID0gMDsgb3JkZXIgPCAzOyBvcmRlcisrKSB7CisgICAgICAgICAgICBldmFsID0gbS5ldmFsdWF0ZV9sbHMoJm0sIHZhciArIDEsIG9yZGVyKTsKKyAgICAgICAgICAgIHByaW50ZigicmVhbDolOWYgb3JkZXI6JWQgcHJlZDolOWYgdmFyOiVmIGNvZWZmczolZiAlOWYgJTlmXG4iLAorICAgICAgICAgICAgICAgICAgIHZhclswXSwgb3JkZXIsIGV2YWwsIHNxcnQobS52YXJpYW5jZVtvcmRlcl0gLyAoaSArIDEpKSwKKyAgICAgICAgICAgICAgICAgICBtLmNvZWZmW29yZGVyXVswXSwgbS5jb2VmZltvcmRlcl1bMV0sCisgICAgICAgICAgICAgICAgICAgbS5jb2VmZltvcmRlcl1bMl0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvbGxzLmggYi9mZm1wZWcvbGliYXZ1dGlsL2xscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MzViNWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2xscy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBsaW5lYXIgbGVhc3Qgc3F1YXJlcyBtb2RlbAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9MTFNfSAorI2RlZmluZSBBVlVUSUxfTExTX0gKKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2RlZmluZSBNQVhfVkFSUyAzMgorI2RlZmluZSBNQVhfVkFSU19BTElHTiBGRkFMSUdOKE1BWF9WQVJTKzEsNCkKKworLy9GSVhNRSBhdm9pZCBkaXJlY3QgYWNjZXNzIHRvIExMU01vZGVsIGZyb20gb3V0c2lkZQorCisvKioKKyAqIExpbmVhciBsZWFzdCBzcXVhcmVzIG1vZGVsLgorICovCit0eXBlZGVmIHN0cnVjdCBMTFNNb2RlbCB7CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBkb3VibGUsIGNvdmFyaWFuY2VbTUFYX1ZBUlNfQUxJR05dW01BWF9WQVJTX0FMSUdOXSk7CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBkb3VibGUsIGNvZWZmW01BWF9WQVJTXVtNQVhfVkFSU10pOworICAgIGRvdWJsZSB2YXJpYW5jZVtNQVhfVkFSU107CisgICAgaW50IGluZGVwX2NvdW50OworICAgIC8qKgorICAgICAqIFRha2UgdGhlIG91dGVyLXByb2R1Y3Qgb2YgdmFyW10gd2l0aCBpdHNlbGYsIGFuZCBhZGQgdG8gdGhlIGNvdmFyaWFuY2UgbWF0cml4LgorICAgICAqIEBwYXJhbSBtIHRoaXMgY29udGV4dAorICAgICAqIEBwYXJhbSB2YXIgdHJhaW5pbmcgc2FtcGxlcywgc3RhcnRpbmcgd2l0aCB0aGUgdmFsdWUgdG8gYmUgcHJlZGljdGVkCisgICAgICogICAgICAgICAgICAzMi1ieXRlIGFsaWduZWQsIGFuZCBhbnkgcGFkZGluZyBlbGVtZW50cyBtdXN0IGJlIGluaXRpYWxpemVkCisgICAgICogICAgICAgICAgICAoaS5lIG5vdCBkZW5vcm1hbC9uYW4pLgorICAgICAqLworICAgIHZvaWQgKCp1cGRhdGVfbGxzKShzdHJ1Y3QgTExTTW9kZWwgKm0sIGNvbnN0IGRvdWJsZSAqdmFyKTsKKyAgICAvKioKKyAgICAgKiBJbm5lciBwcm9kdWN0IG9mIHZhcltdIGFuZCB0aGUgTFBDIGNvZWZzLgorICAgICAqIEBwYXJhbSBtIHRoaXMgY29udGV4dAorICAgICAqIEBwYXJhbSB2YXIgdHJhaW5pbmcgc2FtcGxlcywgZXhjbHVkaW5nIHRoZSB2YWx1ZSB0byBiZSBwcmVkaWN0ZWQuIHVuYWxpZ25lZC4KKyAgICAgKiBAcGFyYW0gb3JkZXIgbHBjIG9yZGVyCisgICAgICovCisgICAgZG91YmxlICgqZXZhbHVhdGVfbGxzKShzdHJ1Y3QgTExTTW9kZWwgKm0sIGNvbnN0IGRvdWJsZSAqdmFyLCBpbnQgb3JkZXIpOworfSBMTFNNb2RlbDsKKwordm9pZCBhdnByaXZfaW5pdF9sbHMoTExTTW9kZWwgKm0sIGludCBpbmRlcF9jb3VudCk7Cit2b2lkIGZmX2luaXRfbGxzX3g4NihMTFNNb2RlbCAqbSk7Cit2b2lkIGF2cHJpdl9zb2x2ZV9sbHMoTExTTW9kZWwgKm0sIGRvdWJsZSB0aHJlc2hvbGQsIHVuc2lnbmVkIHNob3J0IG1pbl9vcmRlcik7CisKKyNlbmRpZiAvKiBBVlVUSUxfTExTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvbG9nLmMgYi9mZm1wZWcvbGliYXZ1dGlsL2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTEzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2xvZy5jCkBAIC0wLDAgKzEsNDQxIEBACisvKgorICogbG9nIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hlbCBCYXJkaWF1eAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBsb2dnaW5nIGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfSU9fSAorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJhdnV0aWwuaCIKKyNpbmNsdWRlICJicHJpbnQuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvZy5oIgorCisjaWYgSEFWRV9QVEhSRUFEUworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworI2VuZGlmCisKKyNkZWZpbmUgTElORV9TWiAxMDI0CisKK3N0YXRpYyBpbnQgYXZfbG9nX2xldmVsID0gQVZfTE9HX0lORk87CitzdGF0aWMgaW50IGZsYWdzOworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fTUlOR1czMkNFX18pICYmIEhBVkVfU0VUQ09OU09MRVRFWFRBVFRSSUJVVEUKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CitzdGF0aWMgY29uc3QgdWludDhfdCBjb2xvclsxNiArIEFWX0NMQVNTX0NBVEVHT1JZX05CXSA9IHsKKyAgICBbQVZfTE9HX1BBTklDICAvOF0gPSAxMiwKKyAgICBbQVZfTE9HX0ZBVEFMICAvOF0gPSAxMiwKKyAgICBbQVZfTE9HX0VSUk9SICAvOF0gPSAxMiwKKyAgICBbQVZfTE9HX1dBUk5JTkcvOF0gPSAxNCwKKyAgICBbQVZfTE9HX0lORk8gICAvOF0gPSAgNywKKyAgICBbQVZfTE9HX1ZFUkJPU0UvOF0gPSAxMCwKKyAgICBbQVZfTE9HX0RFQlVHICAvOF0gPSAxMCwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfTkEgICAgICAgICAgICAgIF0gPSAgNywKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfSU5QVVQgICAgICAgICAgIF0gPSAxMywKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfT1VUUFVUICAgICAgICAgIF0gPSAgNSwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfTVVYRVIgICAgICAgICAgIF0gPSAxMywKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfREVNVVhFUiAgICAgICAgIF0gPSAgNSwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfRU5DT0RFUiAgICAgICAgIF0gPSAxMSwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfREVDT0RFUiAgICAgICAgIF0gPSAgMywKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfRklMVEVSICAgICAgICAgIF0gPSAxMCwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfQklUU1RSRUFNX0ZJTFRFUl0gPSAgOSwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfU1dTQ0FMRVIgICAgICAgIF0gPSAgNywKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfU1dSRVNBTVBMRVIgICAgIF0gPSAgNywKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX09VVFBVVCBdID0gMTMsCisgICAgWzE2K0FWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19JTlBVVCAgXSA9IDUsCisgICAgWzE2K0FWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9BVURJT19PVVRQVVQgXSA9IDEzLAorICAgIFsxNitBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfQVVESU9fSU5QVVQgIF0gPSA1LAorICAgIFsxNitBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfT1VUUFVUICAgICAgIF0gPSAxMywKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX0lOUFVUICAgICAgICBdID0gNSwKK307CisKK3N0YXRpYyBpbnQxNl90IGJhY2tncm91bmQsIGF0dHJfb3JpZzsKK3N0YXRpYyBIQU5ETEUgY29uOworI2Vsc2UKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGNvbG9yWzE2ICsgQVZfQ0xBU1NfQ0FURUdPUllfTkJdID0geworICAgIFtBVl9MT0dfUEFOSUMgIC84XSA9ICA1MiA8PCAxNiB8IDE5NiA8PCA4IHwgMHg0MSwKKyAgICBbQVZfTE9HX0ZBVEFMICAvOF0gPSAyMDggPDwgIDggfCAweDQxLAorICAgIFtBVl9MT0dfRVJST1IgIC84XSA9IDE5NiA8PCAgOCB8IDB4MTEsCisgICAgW0FWX0xPR19XQVJOSU5HLzhdID0gMjI2IDw8ICA4IHwgMHgwMywKKyAgICBbQVZfTE9HX0lORk8gICAvOF0gPSAyNTMgPDwgIDggfCAweDA5LAorICAgIFtBVl9MT0dfVkVSQk9TRS84XSA9ICA0MCA8PCAgOCB8IDB4MDIsCisgICAgW0FWX0xPR19ERUJVRyAgLzhdID0gIDM0IDw8ICA4IHwgMHgwMiwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfTkEgICAgICAgICAgICAgIF0gPSAyNTAgPDwgOCB8IDB4MDksCisgICAgWzE2K0FWX0NMQVNTX0NBVEVHT1JZX0lOUFVUICAgICAgICAgICBdID0gMjE5IDw8IDggfCAweDE1LAorICAgIFsxNitBVl9DTEFTU19DQVRFR09SWV9PVVRQVVQgICAgICAgICAgXSA9IDIwMSA8PCA4IHwgMHgwNSwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfTVVYRVIgICAgICAgICAgIF0gPSAyMTMgPDwgOCB8IDB4MTUsCisgICAgWzE2K0FWX0NMQVNTX0NBVEVHT1JZX0RFTVVYRVIgICAgICAgICBdID0gMjA3IDw8IDggfCAweDA1LAorICAgIFsxNitBVl9DTEFTU19DQVRFR09SWV9FTkNPREVSICAgICAgICAgXSA9ICA1MSA8PCA4IHwgMHgxNiwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfREVDT0RFUiAgICAgICAgIF0gPSAgMzkgPDwgOCB8IDB4MDYsCisgICAgWzE2K0FWX0NMQVNTX0NBVEVHT1JZX0ZJTFRFUiAgICAgICAgICBdID0gMTU1IDw8IDggfCAweDEyLAorICAgIFsxNitBVl9DTEFTU19DQVRFR09SWV9CSVRTVFJFQU1fRklMVEVSXSA9IDE5MiA8PCA4IHwgMHgxNCwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfU1dTQ0FMRVIgICAgICAgIF0gPSAxNTMgPDwgOCB8IDB4MTQsCisgICAgWzE2K0FWX0NMQVNTX0NBVEVHT1JZX1NXUkVTQU1QTEVSICAgICBdID0gMTQ3IDw8IDggfCAweDE0LAorICAgIFsxNitBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfVklERU9fT1VUUFVUIF0gPSAyMTMgPDwgOCB8IDB4MTUsCisgICAgWzE2K0FWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19JTlBVVCAgXSA9IDIwNyA8PCA4IHwgMHgwNSwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX0FVRElPX09VVFBVVCBdID0gMjEzIDw8IDggfCAweDE1LAorICAgIFsxNitBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfQVVESU9fSU5QVVQgIF0gPSAyMDcgPDwgOCB8IDB4MDUsCisgICAgWzE2K0FWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9PVVRQVVQgICAgICAgXSA9IDIxMyA8PCA4IHwgMHgxNSwKKyAgICBbMTYrQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX0lOUFVUICAgICAgICBdID0gMjA3IDw8IDggfCAweDA1LAorfTsKKworI2VuZGlmCitzdGF0aWMgaW50IHVzZV9jb2xvciA9IC0xOworCitzdGF0aWMgdm9pZCBjaGVja19jb2xvcl90ZXJtaW5hbCh2b2lkKQoreworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX01JTkdXMzJDRV9fKSAmJiBIQVZFX1NFVENPTlNPTEVURVhUQVRUUklCVVRFCisgICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gY29uX2luZm87CisgICAgY29uID0gR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpOworICAgIHVzZV9jb2xvciA9IChjb24gIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmICFnZXRlbnYoIk5PX0NPTE9SIikgJiYKKyAgICAgICAgICAgICAgICAhZ2V0ZW52KCJBVl9MT0dfRk9SQ0VfTk9DT0xPUiIpOworICAgIGlmICh1c2VfY29sb3IpIHsKKyAgICAgICAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oY29uLCAmY29uX2luZm8pOworICAgICAgICBhdHRyX29yaWcgID0gY29uX2luZm8ud0F0dHJpYnV0ZXM7CisgICAgICAgIGJhY2tncm91bmQgPSBhdHRyX29yaWcgJiAweEYwOworICAgIH0KKyNlbGlmIEhBVkVfSVNBVFRZCisgICAgY2hhciAqdGVybSA9IGdldGVudigiVEVSTSIpOworICAgIHVzZV9jb2xvciA9ICFnZXRlbnYoIk5PX0NPTE9SIikgJiYgIWdldGVudigiQVZfTE9HX0ZPUkNFX05PQ09MT1IiKSAmJgorICAgICAgICAgICAgICAgIChnZXRlbnYoIlRFUk0iKSAmJiBpc2F0dHkoMikgfHwgZ2V0ZW52KCJBVl9MT0dfRk9SQ0VfQ09MT1IiKSk7CisgICAgaWYgKCAgIGdldGVudigiQVZfTE9HX0ZPUkNFXzI1NkNPTE9SIikKKyAgICAgICAgfHwgKHRlcm0gJiYgc3Ryc3RyKHRlcm0sICIyNTZjb2xvciIpKSkKKyAgICAgICAgdXNlX2NvbG9yICo9IDI1NjsKKyNlbHNlCisgICAgdXNlX2NvbG9yID0gZ2V0ZW52KCJBVl9MT0dfRk9SQ0VfQ09MT1IiKSAmJiAhZ2V0ZW52KCJOT19DT0xPUiIpICYmCisgICAgICAgICAgICAgICAhZ2V0ZW52KCJBVl9MT0dfRk9SQ0VfTk9DT0xPUiIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGNvbG9yZWRfZnB1dHMoaW50IGxldmVsLCBpbnQgdGludCwgY29uc3QgY2hhciAqc3RyKQoreworICAgIGludCBsb2NhbF91c2VfY29sb3I7CisgICAgaWYgKCEqc3RyKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAodXNlX2NvbG9yIDwgMCkKKyAgICAgICAgY2hlY2tfY29sb3JfdGVybWluYWwoKTsKKworICAgIGlmIChsZXZlbCA9PSBBVl9MT0dfSU5GTy84KSBsb2NhbF91c2VfY29sb3IgPSAwOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF91c2VfY29sb3IgPSB1c2VfY29sb3I7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19NSU5HVzMyQ0VfXykgJiYgSEFWRV9TRVRDT05TT0xFVEVYVEFUVFJJQlVURQorICAgIGlmIChsb2NhbF91c2VfY29sb3IpCisgICAgICAgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKGNvbiwgYmFja2dyb3VuZCB8IGNvbG9yW2xldmVsXSk7CisgICAgZnB1dHMoc3RyLCBzdGRlcnIpOworICAgIGlmIChsb2NhbF91c2VfY29sb3IpCisgICAgICAgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKGNvbiwgYXR0cl9vcmlnKTsKKyNlbHNlCisgICAgaWYgKGxvY2FsX3VzZV9jb2xvciA9PSAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJcMDMzWyVkOzMlZG0lc1wwMzNbMG0iLAorICAgICAgICAgICAgICAgIChjb2xvcltsZXZlbF0gPj4gNCkgJiAxNSwKKyAgICAgICAgICAgICAgICBjb2xvcltsZXZlbF0gJiAxNSwKKyAgICAgICAgICAgICAgICBzdHIpOworICAgIH0gZWxzZSBpZiAodGludCAmJiB1c2VfY29sb3IgPT0gMjU2KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJcMDMzWzQ4OzU7JWRtXDAzM1szODs1OyVkbSVzXDAzM1swbSIsCisgICAgICAgICAgICAgICAgKGNvbG9yW2xldmVsXSA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgICAgIHRpbnQsCisgICAgICAgICAgICAgICAgc3RyKTsKKyAgICB9IGVsc2UgaWYgKGxvY2FsX3VzZV9jb2xvciA9PSAyNTYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIlwwMzNbNDg7NTslZG1cMDMzWzM4OzU7JWRtJXNcMDMzWzBtIiwKKyAgICAgICAgICAgICAgICAoY29sb3JbbGV2ZWxdID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgKGNvbG9yW2xldmVsXSA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgc3RyKTsKKyAgICB9IGVsc2UKKyAgICAgICAgZnB1dHMoc3RyLCBzdGRlcnIpOworI2VuZGlmCisKK30KKworY29uc3QgY2hhciAqYXZfZGVmYXVsdF9pdGVtX25hbWUodm9pZCAqcHRyKQoreworICAgIHJldHVybiAoKihBVkNsYXNzICoqKSBwdHIpLT5jbGFzc19uYW1lOworfQorCitBVkNsYXNzQ2F0ZWdvcnkgYXZfZGVmYXVsdF9nZXRfY2F0ZWdvcnkodm9pZCAqcHRyKQoreworICAgIHJldHVybiAoKihBVkNsYXNzICoqKSBwdHIpLT5jYXRlZ29yeTsKK30KKworc3RhdGljIHZvaWQgc2FuaXRpemUodWludDhfdCAqbGluZSl7CisgICAgd2hpbGUoKmxpbmUpeworICAgICAgICBpZigqbGluZSA8IDB4MDggfHwgKCpsaW5lID4gMHgwRCAmJiAqbGluZSA8IDB4MjApKQorICAgICAgICAgICAgKmxpbmU9Jz8nOworICAgICAgICBsaW5lKys7CisgICAgfQorfQorCitzdGF0aWMgaW50IGdldF9jYXRlZ29yeSh2b2lkICpwdHIpeworICAgIEFWQ2xhc3MgKmF2YyA9ICooQVZDbGFzcyAqKikgcHRyOworICAgIGlmKCAgICAhYXZjCisgICAgICAgIHx8IChhdmMtPnZlcnNpb24mMHhGRik8MTAwCisgICAgICAgIHx8ICBhdmMtPnZlcnNpb24gPCAoNTEgPDwgMTYgfCA1OSA8PCA4KQorICAgICAgICB8fCAgYXZjLT5jYXRlZ29yeSA+PSBBVl9DTEFTU19DQVRFR09SWV9OQikgcmV0dXJuIEFWX0NMQVNTX0NBVEVHT1JZX05BICsgMTY7CisKKyAgICBpZihhdmMtPmdldF9jYXRlZ29yeSkKKyAgICAgICAgcmV0dXJuIGF2Yy0+Z2V0X2NhdGVnb3J5KHB0cikgKyAxNjsKKworICAgIHJldHVybiBhdmMtPmNhdGVnb3J5ICsgMTY7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfbGV2ZWxfc3RyKGludCBsZXZlbCkKK3sKKyAgICBzd2l0Y2ggKGxldmVsKSB7CisgICAgY2FzZSBBVl9MT0dfUVVJRVQ6CisgICAgICAgIHJldHVybiAicXVpZXQiOworICAgIGNhc2UgQVZfTE9HX0RFQlVHOgorICAgICAgICByZXR1cm4gImRlYnVnIjsKKyAgICBjYXNlIEFWX0xPR19WRVJCT1NFOgorICAgICAgICByZXR1cm4gInZlcmJvc2UiOworICAgIGNhc2UgQVZfTE9HX0lORk86CisgICAgICAgIHJldHVybiAiaW5mbyI7CisgICAgY2FzZSBBVl9MT0dfV0FSTklORzoKKyAgICAgICAgcmV0dXJuICJ3YXJuaW5nIjsKKyAgICBjYXNlIEFWX0xPR19FUlJPUjoKKyAgICAgICAgcmV0dXJuICJlcnJvciI7CisgICAgY2FzZSBBVl9MT0dfRkFUQUw6CisgICAgICAgIHJldHVybiAiZmF0YWwiOworICAgIGNhc2UgQVZfTE9HX1BBTklDOgorICAgICAgICByZXR1cm4gInBhbmljIjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIiI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmb3JtYXRfbGluZSh2b2lkICphdmNsLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWQlByaW50IHBhcnRbNF0sIGludCAqcHJpbnRfcHJlZml4LCBpbnQgdHlwZVsyXSkKK3sKKyAgICBBVkNsYXNzKiBhdmMgPSBhdmNsID8gKihBVkNsYXNzICoqKSBhdmNsIDogTlVMTDsKKyAgICBhdl9icHJpbnRfaW5pdChwYXJ0KzAsIDAsIDEpOworICAgIGF2X2JwcmludF9pbml0KHBhcnQrMSwgMCwgMSk7CisgICAgYXZfYnByaW50X2luaXQocGFydCsyLCAwLCAxKTsKKyAgICBhdl9icHJpbnRfaW5pdChwYXJ0KzMsIDAsIDY1NTM2KTsKKworICAgIGlmKHR5cGUpIHR5cGVbMF0gPSB0eXBlWzFdID0gQVZfQ0xBU1NfQ0FURUdPUllfTkEgKyAxNjsKKyAgICBpZiAoKnByaW50X3ByZWZpeCAmJiBhdmMpIHsKKyAgICAgICAgaWYgKGF2Yy0+cGFyZW50X2xvZ19jb250ZXh0X29mZnNldCkgeworICAgICAgICAgICAgQVZDbGFzcyoqIHBhcmVudCA9ICooQVZDbGFzcyAqKiopICgoKHVpbnQ4X3QgKikgYXZjbCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmMtPnBhcmVudF9sb2dfY29udGV4dF9vZmZzZXQpOworICAgICAgICAgICAgaWYgKHBhcmVudCAmJiAqcGFyZW50KSB7CisgICAgICAgICAgICAgICAgYXZfYnByaW50ZihwYXJ0KzAsICJbJXMgQCAlcF0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKnBhcmVudCktPml0ZW1fbmFtZShwYXJlbnQpLCBwYXJlbnQpOworICAgICAgICAgICAgICAgIGlmKHR5cGUpIHR5cGVbMF0gPSBnZXRfY2F0ZWdvcnkocGFyZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9icHJpbnRmKHBhcnQrMSwgIlslcyBAICVwXSAiLAorICAgICAgICAgICAgICAgICBhdmMtPml0ZW1fbmFtZShhdmNsKSwgYXZjbCk7CisgICAgICAgIGlmKHR5cGUpIHR5cGVbMV0gPSBnZXRfY2F0ZWdvcnkoYXZjbCk7CisKKyAgICAgICAgaWYgKGZsYWdzICYgQVZfTE9HX1BSSU5UX0xFVkVMKQorICAgICAgICAgICAgYXZfYnByaW50ZihwYXJ0KzIsICJbJXNdICIsIGdldF9sZXZlbF9zdHIobGV2ZWwpKTsKKyAgICB9CisKKyAgICBhdl92YnByaW50ZihwYXJ0KzMsIGZtdCwgdmwpOworCisgICAgaWYoKnBhcnRbMF0uc3RyIHx8ICpwYXJ0WzFdLnN0ciB8fCAqcGFydFsyXS5zdHIgfHwgKnBhcnRbM10uc3RyKSB7CisgICAgICAgIGNoYXIgbGFzdGMgPSBwYXJ0WzNdLmxlbiAmJiBwYXJ0WzNdLmxlbiA8PSBwYXJ0WzNdLnNpemUgPyBwYXJ0WzNdLnN0cltwYXJ0WzNdLmxlbiAtIDFdIDogMDsKKyAgICAgICAgKnByaW50X3ByZWZpeCA9IGxhc3RjID09ICdcbicgfHwgbGFzdGMgPT0gJ1xyJzsKKyAgICB9Cit9CisKK3ZvaWQgYXZfbG9nX2Zvcm1hdF9saW5lKHZvaWQgKnB0ciwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmwsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpsaW5lLCBpbnQgbGluZV9zaXplLCBpbnQgKnByaW50X3ByZWZpeCkKK3sKKyAgICBBVkJQcmludCBwYXJ0WzRdOworICAgIGZvcm1hdF9saW5lKHB0ciwgbGV2ZWwsIGZtdCwgdmwsIHBhcnQsIHByaW50X3ByZWZpeCwgTlVMTCk7CisgICAgc25wcmludGYobGluZSwgbGluZV9zaXplLCAiJXMlcyVzJXMiLCBwYXJ0WzBdLnN0ciwgcGFydFsxXS5zdHIsIHBhcnRbMl0uc3RyLCBwYXJ0WzNdLnN0cik7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKHBhcnQrMywgTlVMTCk7Cit9CisKK3ZvaWQgYXZfbG9nX2RlZmF1bHRfY2FsbGJhY2sodm9pZCogcHRyLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCB2bCkKK3sKKyAgICBzdGF0aWMgaW50IHByaW50X3ByZWZpeCA9IDE7CisgICAgc3RhdGljIGludCBjb3VudDsKKyAgICBzdGF0aWMgY2hhciBwcmV2W0xJTkVfU1pdOworICAgIEFWQlByaW50IHBhcnRbNF07CisgICAgY2hhciBsaW5lW0xJTkVfU1pdOworICAgIHN0YXRpYyBpbnQgaXNfYXR0eTsKKyAgICBpbnQgdHlwZVsyXTsKKyAgICB1bnNpZ25lZCB0aW50ID0gMDsKKworICAgIGlmIChsZXZlbCA+PSAwKSB7CisgICAgICAgIHRpbnQgPSBsZXZlbCAmIDB4ZmYwMDsKKyAgICAgICAgbGV2ZWwgJj0gMHhmZjsKKyAgICB9CisKKyAgICBpZiAobGV2ZWwgPiBhdl9sb2dfbGV2ZWwpCisgICAgICAgIHJldHVybjsKKyNpZiBIQVZFX1BUSFJFQURTCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CisjZW5kaWYKKworICAgIGZvcm1hdF9saW5lKHB0ciwgbGV2ZWwsIGZtdCwgdmwsIHBhcnQsICZwcmludF9wcmVmaXgsIHR5cGUpOworICAgIHNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwgIiVzJXMlcyVzIiwgcGFydFswXS5zdHIsIHBhcnRbMV0uc3RyLCBwYXJ0WzJdLnN0ciwgcGFydFszXS5zdHIpOworCisjaWYgSEFWRV9JU0FUVFkKKyAgICBpZiAoIWlzX2F0dHkpCisgICAgICAgIGlzX2F0dHkgPSBpc2F0dHkoMikgPyAxIDogLTE7CisjZW5kaWYKKworICAgIGlmIChwcmludF9wcmVmaXggJiYgKGZsYWdzICYgQVZfTE9HX1NLSVBfUkVQRUFURUQpICYmICFzdHJjbXAobGluZSwgcHJldikgJiYKKyAgICAgICAgKmxpbmUgJiYgbGluZVtzdHJsZW4obGluZSkgLSAxXSAhPSAnXHInKXsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgaWYgKGlzX2F0dHkgPT0gMSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgIExhc3QgbWVzc2FnZSByZXBlYXRlZCAlZCB0aW1lc1xyIiwgY291bnQpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICBMYXN0IG1lc3NhZ2UgcmVwZWF0ZWQgJWQgdGltZXNcbiIsIGNvdW50KTsKKyAgICAgICAgY291bnQgPSAwOworICAgIH0KKyAgICBzdHJjcHkocHJldiwgbGluZSk7CisgICAgc2FuaXRpemUocGFydFswXS5zdHIpOworICAgIGNvbG9yZWRfZnB1dHModHlwZVswXSwgMCwgcGFydFswXS5zdHIpOworICAgIHNhbml0aXplKHBhcnRbMV0uc3RyKTsKKyAgICBjb2xvcmVkX2ZwdXRzKHR5cGVbMV0sIDAsIHBhcnRbMV0uc3RyKTsKKyAgICBzYW5pdGl6ZShwYXJ0WzJdLnN0cik7CisgICAgY29sb3JlZF9mcHV0cyhhdl9jbGlwKGxldmVsID4+IDMsIDAsIDYpLCB0aW50ID4+IDgsIHBhcnRbMl0uc3RyKTsKKyAgICBzYW5pdGl6ZShwYXJ0WzNdLnN0cik7CisgICAgY29sb3JlZF9mcHV0cyhhdl9jbGlwKGxldmVsID4+IDMsIDAsIDYpLCB0aW50ID4+IDgsIHBhcnRbM10uc3RyKTsKK2VuZDoKKyAgICBhdl9icHJpbnRfZmluYWxpemUocGFydCszLCBOVUxMKTsKKyNpZiBIQVZFX1BUSFJFQURTCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCAoKmF2X2xvZ19jYWxsYmFjaykodm9pZCosIGludCwgY29uc3QgY2hhciosIHZhX2xpc3QpID0KKyAgICBhdl9sb2dfZGVmYXVsdF9jYWxsYmFjazsKKwordm9pZCBhdl9sb2codm9pZCogYXZjbCwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBBVkNsYXNzKiBhdmMgPSBhdmNsID8gKihBVkNsYXNzICoqKSBhdmNsIDogTlVMTDsKKyAgICB2YV9saXN0IHZsOworICAgIHZhX3N0YXJ0KHZsLCBmbXQpOworICAgIGlmIChhdmMgJiYgYXZjLT52ZXJzaW9uID49ICg1MCA8PCAxNiB8IDE1IDw8IDggfCAyKSAmJgorICAgICAgICBhdmMtPmxvZ19sZXZlbF9vZmZzZXRfb2Zmc2V0ICYmIGxldmVsID49IEFWX0xPR19GQVRBTCkKKyAgICAgICAgbGV2ZWwgKz0gKihpbnQgKikgKCgodWludDhfdCAqKSBhdmNsKSArIGF2Yy0+bG9nX2xldmVsX29mZnNldF9vZmZzZXQpOworICAgIGF2X3Zsb2coYXZjbCwgbGV2ZWwsIGZtdCwgdmwpOworICAgIHZhX2VuZCh2bCk7Cit9CisKK3ZvaWQgYXZfdmxvZyh2b2lkKiBhdmNsLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2bCkKK3sKKyAgICB2b2lkICgqbG9nX2NhbGxiYWNrKSh2b2lkKiwgaW50LCBjb25zdCBjaGFyKiwgdmFfbGlzdCkgPSBhdl9sb2dfY2FsbGJhY2s7CisgICAgaWYgKGxvZ19jYWxsYmFjaykKKyAgICAgICAgbG9nX2NhbGxiYWNrKGF2Y2wsIGxldmVsLCBmbXQsIHZsKTsKK30KKworaW50IGF2X2xvZ19nZXRfbGV2ZWwodm9pZCkKK3sKKyAgICByZXR1cm4gYXZfbG9nX2xldmVsOworfQorCit2b2lkIGF2X2xvZ19zZXRfbGV2ZWwoaW50IGxldmVsKQoreworICAgIGF2X2xvZ19sZXZlbCA9IGxldmVsOworfQorCit2b2lkIGF2X2xvZ19zZXRfZmxhZ3MoaW50IGFyZykKK3sKKyAgICBmbGFncyA9IGFyZzsKK30KKworaW50IGF2X2xvZ19nZXRfZmxhZ3Modm9pZCkKK3sKKyAgICByZXR1cm4gZmxhZ3M7Cit9CisKK3ZvaWQgYXZfbG9nX3NldF9jYWxsYmFjayh2b2lkICgqY2FsbGJhY2spKHZvaWQqLCBpbnQsIGNvbnN0IGNoYXIqLCB2YV9saXN0KSkKK3sKKyAgICBhdl9sb2dfY2FsbGJhY2sgPSBjYWxsYmFjazsKK30KKworc3RhdGljIHZvaWQgbWlzc2luZ19mZWF0dXJlX3NhbXBsZShpbnQgc2FtcGxlLCB2b2lkICphdmMsIGNvbnN0IGNoYXIgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmd1bWVudF9saXN0KQoreworICAgIGF2X3Zsb2coYXZjLCBBVl9MT0dfV0FSTklORywgbXNnLCBhcmd1bWVudF9saXN0KTsKKyAgICBhdl9sb2coYXZjLCBBVl9MT0dfV0FSTklORywgIiBpcyBub3QgaW1wbGVtZW50ZWQuIFVwZGF0ZSB5b3VyIEZGbXBlZyAiCisgICAgICAgICAgICJ2ZXJzaW9uIHRvIHRoZSBuZXdlc3Qgb25lIGZyb20gR2l0LiBJZiB0aGUgcHJvYmxlbSBzdGlsbCAiCisgICAgICAgICAgICJvY2N1cnMsIGl0IG1lYW5zIHRoYXQgeW91ciBmaWxlIGhhcyBhIGZlYXR1cmUgd2hpY2ggaGFzIG5vdCAiCisgICAgICAgICAgICJiZWVuIGltcGxlbWVudGVkLlxuIik7CisgICAgaWYgKHNhbXBsZSkKKyAgICAgICAgYXZfbG9nKGF2YywgQVZfTE9HX1dBUk5JTkcsICJJZiB5b3Ugd2FudCB0byBoZWxwLCB1cGxvYWQgYSBzYW1wbGUgIgorICAgICAgICAgICAgICAgIm9mIHRoaXMgZmlsZSB0byBmdHA6Ly91cGxvYWQuZmZtcGVnLm9yZy9pbmNvbWluZy8gIgorICAgICAgICAgICAgICAgImFuZCBjb250YWN0IHRoZSBmZm1wZWctZGV2ZWwgbWFpbGluZyBsaXN0LiAoZmZtcGVnLWRldmVsQGZmbXBlZy5vcmcpXG4iKTsKK30KKwordm9pZCBhdnByaXZfcmVxdWVzdF9zYW1wbGUodm9pZCAqYXZjLCBjb25zdCBjaGFyICptc2csIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3VtZW50X2xpc3Q7CisKKyAgICB2YV9zdGFydChhcmd1bWVudF9saXN0LCBtc2cpOworICAgIG1pc3NpbmdfZmVhdHVyZV9zYW1wbGUoMSwgYXZjLCBtc2csIGFyZ3VtZW50X2xpc3QpOworICAgIHZhX2VuZChhcmd1bWVudF9saXN0KTsKK30KKwordm9pZCBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZSh2b2lkICphdmMsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworICAgIHZhX2xpc3QgYXJndW1lbnRfbGlzdDsKKworICAgIHZhX3N0YXJ0KGFyZ3VtZW50X2xpc3QsIG1zZyk7CisgICAgbWlzc2luZ19mZWF0dXJlX3NhbXBsZSgwLCBhdmMsIG1zZywgYXJndW1lbnRfbGlzdCk7CisgICAgdmFfZW5kKGFyZ3VtZW50X2xpc3QpOworfQorCisjaWZkZWYgVEVTVAorLy8gTENPVl9FWENMX1NUQVJUCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgaTsKKyAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7CisgICAgZm9yICh1c2VfY29sb3I9MDsgdXNlX2NvbG9yPD0yNTY7IHVzZV9jb2xvciA9IDI1NSp1c2VfY29sb3IrMSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAidXNlX2NvbG9yOiAlZFxuIiwgdXNlX2NvbG9yKTsKKyAgICAgICAgZm9yIChpID0gQVZfTE9HX0RFQlVHOyBpPj1BVl9MT0dfUVVJRVQ7IGktPTgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBpLCAiICVkIiwgaSk7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJlICIpOworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIGkgKyAyNTYqMTIzLCAiQyVkIiwgaSk7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJlIik7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19QQU5JQywgIlxuIik7CisgICAgfQorICAgIHJldHVybiAwOworfQorLy8gTENPVl9FWENMX1NUT1AKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9sb2cuaCBiL2ZmbXBlZy9saWJhdnV0aWwvbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmZjA5YgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvbG9nLmgKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfTE9HX0gKKyNkZWZpbmUgQVZVVElMX0xPR19ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJhdnV0aWwuaCIKKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisKK3R5cGVkZWYgZW51bSB7CisgICAgQVZfQ0xBU1NfQ0FURUdPUllfTkEgPSAwLAorICAgIEFWX0NMQVNTX0NBVEVHT1JZX0lOUFVULAorICAgIEFWX0NMQVNTX0NBVEVHT1JZX09VVFBVVCwKKyAgICBBVl9DTEFTU19DQVRFR09SWV9NVVhFUiwKKyAgICBBVl9DTEFTU19DQVRFR09SWV9ERU1VWEVSLAorICAgIEFWX0NMQVNTX0NBVEVHT1JZX0VOQ09ERVIsCisgICAgQVZfQ0xBU1NfQ0FURUdPUllfREVDT0RFUiwKKyAgICBBVl9DTEFTU19DQVRFR09SWV9GSUxURVIsCisgICAgQVZfQ0xBU1NfQ0FURUdPUllfQklUU1RSRUFNX0ZJTFRFUiwKKyAgICBBVl9DTEFTU19DQVRFR09SWV9TV1NDQUxFUiwKKyAgICBBVl9DTEFTU19DQVRFR09SWV9TV1JFU0FNUExFUiwKKyAgICBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfVklERU9fT1VUUFVUID0gNDAsCisgICAgQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX0lOUFVULAorICAgIEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9BVURJT19PVVRQVVQsCisgICAgQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX0FVRElPX0lOUFVULAorICAgIEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9PVVRQVVQsCisgICAgQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX0lOUFVULAorICAgIEFWX0NMQVNTX0NBVEVHT1JZX05CLCAvLy88IG5vdCBwYXJ0IG9mIEFCSS9BUEkKK31BVkNsYXNzQ2F0ZWdvcnk7CisKKyNkZWZpbmUgQVZfSVNfSU5QVVRfREVWSUNFKGNhdGVnb3J5KSBcCisgICAgKCgoY2F0ZWdvcnkpID09IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19JTlBVVCkgfHwgXAorICAgICAoKGNhdGVnb3J5KSA9PSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfQVVESU9fSU5QVVQpIHx8IFwKKyAgICAgKChjYXRlZ29yeSkgPT0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX0lOUFVUKSkKKworI2RlZmluZSBBVl9JU19PVVRQVVRfREVWSUNFKGNhdGVnb3J5KSBcCisgICAgKCgoY2F0ZWdvcnkpID09IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19PVVRQVVQpIHx8IFwKKyAgICAgKChjYXRlZ29yeSkgPT0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX0FVRElPX09VVFBVVCkgfHwgXAorICAgICAoKGNhdGVnb3J5KSA9PSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfT1VUUFVUKSkKKworc3RydWN0IEFWT3B0aW9uUmFuZ2VzOworCisvKioKKyAqIERlc2NyaWJlIHRoZSBjbGFzcyBvZiBhbiBBVkNsYXNzIGNvbnRleHQgc3RydWN0dXJlLiBUaGF0IGlzIGFuCisgKiBhcmJpdHJhcnkgc3RydWN0IG9mIHdoaWNoIHRoZSBmaXJzdCBmaWVsZCBpcyBhIHBvaW50ZXIgdG8gYW4KKyAqIEFWQ2xhc3Mgc3RydWN0IChlLmcuIEFWQ29kZWNDb250ZXh0LCBBVkZvcm1hdENvbnRleHQgZXRjLikuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWQ2xhc3MgeworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjbGFzczsgdXN1YWxseSBpdCBpcyB0aGUgc2FtZSBuYW1lIGFzIHRoZQorICAgICAqIGNvbnRleHQgc3RydWN0dXJlIHR5cGUgdG8gd2hpY2ggdGhlIEFWQ2xhc3MgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyKiBjbGFzc19uYW1lOworCisgICAgLyoqCisgICAgICogQSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyB0aGUgbmFtZSBvZiBhIGNvbnRleHQKKyAgICAgKiBpbnN0YW5jZSBjdHggYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFzcy4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyKiAoKml0ZW1fbmFtZSkodm9pZCogY3R4KTsKKworICAgIC8qKgorICAgICAqIGEgcG9pbnRlciB0byB0aGUgZmlyc3Qgb3B0aW9uIHNwZWNpZmllZCBpbiB0aGUgY2xhc3MgaWYgYW55IG9yIE5VTEwKKyAgICAgKgorICAgICAqIEBzZWUgYXZfc2V0X2RlZmF1bHRfb3B0aW9ucygpCisgICAgICovCisgICAgY29uc3Qgc3RydWN0IEFWT3B0aW9uICpvcHRpb247CisKKyAgICAvKioKKyAgICAgKiBMSUJBVlVUSUxfVkVSU0lPTiB3aXRoIHdoaWNoIHRoaXMgc3RydWN0dXJlIHdhcyBjcmVhdGVkLgorICAgICAqIFRoaXMgaXMgdXNlZCB0byBhbGxvdyBmaWVsZHMgdG8gYmUgYWRkZWQgd2l0aG91dCByZXF1aXJpbmcgbWFqb3IKKyAgICAgKiB2ZXJzaW9uIGJ1bXBzIGV2ZXJ5d2hlcmUuCisgICAgICovCisKKyAgICBpbnQgdmVyc2lvbjsKKworICAgIC8qKgorICAgICAqIE9mZnNldCBpbiB0aGUgc3RydWN0dXJlIHdoZXJlIGxvZ19sZXZlbF9vZmZzZXQgaXMgc3RvcmVkLgorICAgICAqIDAgbWVhbnMgdGhlcmUgaXMgbm8gc3VjaCB2YXJpYWJsZQorICAgICAqLworICAgIGludCBsb2dfbGV2ZWxfb2Zmc2V0X29mZnNldDsKKworICAgIC8qKgorICAgICAqIE9mZnNldCBpbiB0aGUgc3RydWN0dXJlIHdoZXJlIGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGNvbnRleHQgZm9yCisgICAgICogbG9nZ2luZyBpcyBzdG9yZWQuIEZvciBleGFtcGxlIGEgZGVjb2RlciBjb3VsZCBwYXNzIGl0cyBBVkNvZGVjQ29udGV4dAorICAgICAqIHRvIGV2YWwgYXMgc3VjaCBhIHBhcmVudCBjb250ZXh0LCB3aGljaCBhbiBhdl9sb2coKSBpbXBsZW1lbnRhdGlvbgorICAgICAqIGNvdWxkIHRoZW4gbGV2ZXJhZ2UgdG8gZGlzcGxheSB0aGUgcGFyZW50IGNvbnRleHQuCisgICAgICogVGhlIG9mZnNldCBjYW4gYmUgTlVMTC4KKyAgICAgKi8KKyAgICBpbnQgcGFyZW50X2xvZ19jb250ZXh0X29mZnNldDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBuZXh0IEFWT3B0aW9ucy1lbmFibGVkIGNoaWxkIG9yIE5VTEwKKyAgICAgKi8KKyAgICB2b2lkKiAoKmNoaWxkX25leHQpKHZvaWQgKm9iaiwgdm9pZCAqcHJldik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gQVZDbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBuZXh0IHBvdGVudGlhbAorICAgICAqIEFWT3B0aW9ucy1lbmFibGVkIGNoaWxkLgorICAgICAqCisgICAgICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjaGlsZF9uZXh0IGFuZCB0aGlzIGlzIHRoYXQKKyAgICAgKiBjaGlsZF9uZXh0IGl0ZXJhdGVzIG92ZXIgX2FscmVhZHkgZXhpc3RpbmdfIG9iamVjdHMsIHdoaWxlCisgICAgICogY2hpbGRfY2xhc3NfbmV4dCBpdGVyYXRlcyBvdmVyIF9hbGwgcG9zc2libGVfIGNoaWxkcmVuLgorICAgICAqLworICAgIGNvbnN0IHN0cnVjdCBBVkNsYXNzKiAoKmNoaWxkX2NsYXNzX25leHQpKGNvbnN0IHN0cnVjdCBBVkNsYXNzICpwcmV2KTsKKworICAgIC8qKgorICAgICAqIENhdGVnb3J5IHVzZWQgZm9yIHZpc3VhbGl6YXRpb24gKGxpa2UgY29sb3IpCisgICAgICogVGhpcyBpcyBvbmx5IHNldCBpZiB0aGUgY2F0ZWdvcnkgaXMgZXF1YWwgZm9yIGFsbCBvYmplY3RzIHVzaW5nIHRoaXMgY2xhc3MuCisgICAgICogYXZhaWxhYmxlIHNpbmNlIHZlcnNpb24gKDUxIDw8IDE2IHwgNTYgPDwgOCB8IDEwMCkKKyAgICAgKi8KKyAgICBBVkNsYXNzQ2F0ZWdvcnkgY2F0ZWdvcnk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayB0byByZXR1cm4gdGhlIGNhdGVnb3J5LgorICAgICAqIGF2YWlsYWJsZSBzaW5jZSB2ZXJzaW9uICg1MSA8PCAxNiB8IDU5IDw8IDggfCAxMDApCisgICAgICovCisgICAgQVZDbGFzc0NhdGVnb3J5ICgqZ2V0X2NhdGVnb3J5KSh2b2lkKiBjdHgpOworCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgdG8gcmV0dXJuIHRoZSBzdXBwb3J0ZWQvYWxsb3dlZCByYW5nZXMuCisgICAgICogYXZhaWxhYmxlIHNpbmNlIHZlcnNpb24gKDUyLjEyKQorICAgICAqLworICAgIGludCAoKnF1ZXJ5X3Jhbmdlcykoc3RydWN0IEFWT3B0aW9uUmFuZ2VzICoqLCB2b2lkICpvYmosIGNvbnN0IGNoYXIgKmtleSwgaW50IGZsYWdzKTsKK30gQVZDbGFzczsKKworLyoqCisgKiBAYWRkdG9ncm91cCBsYXZ1X2xvZworICoKKyAqIEB7CisgKgorICogQGRlZmdyb3VwIGxhdnVfbG9nX2NvbnN0YW50cyBMb2dnaW5nIENvbnN0YW50cworICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBQcmludCBubyBvdXRwdXQuCisgKi8KKyNkZWZpbmUgQVZfTE9HX1FVSUVUICAgIC04CisKKy8qKgorICogU29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nIGFuZCB3ZSB3aWxsIGNyYXNoIG5vdy4KKyAqLworI2RlZmluZSBBVl9MT0dfUEFOSUMgICAgIDAKKworLyoqCisgKiBTb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgcmVjb3ZlcnkgaXMgbm90IHBvc3NpYmxlLgorICogRm9yIGV4YW1wbGUsIG5vIGhlYWRlciB3YXMgZm91bmQgZm9yIGEgZm9ybWF0IHdoaWNoIGRlcGVuZHMKKyAqIG9uIGhlYWRlcnMgb3IgYW4gaWxsZWdhbCBjb21iaW5hdGlvbiBvZiBwYXJhbWV0ZXJzIGlzIHVzZWQuCisgKi8KKyNkZWZpbmUgQVZfTE9HX0ZBVEFMICAgICA4CisKKy8qKgorICogU29tZXRoaW5nIHdlbnQgd3JvbmcgYW5kIGNhbm5vdCBsb3NzbGVzc2x5IGJlIHJlY292ZXJlZC4KKyAqIEhvd2V2ZXIsIG5vdCBhbGwgZnV0dXJlIGRhdGEgaXMgYWZmZWN0ZWQuCisgKi8KKyNkZWZpbmUgQVZfTE9HX0VSUk9SICAgIDE2CisKKy8qKgorICogU29tZXRoaW5nIHNvbWVob3cgZG9lcyBub3QgbG9vayBjb3JyZWN0LiBUaGlzIG1heSBvciBtYXkgbm90CisgKiBsZWFkIHRvIHByb2JsZW1zLiBBbiBleGFtcGxlIHdvdWxkIGJlIHRoZSB1c2Ugb2YgJy12c3RyaWN0IC0yJy4KKyAqLworI2RlZmluZSBBVl9MT0dfV0FSTklORyAgMjQKKworLyoqCisgKiBTdGFuZGFyZCBpbmZvcm1hdGlvbi4KKyAqLworI2RlZmluZSBBVl9MT0dfSU5GTyAgICAgMzIKKworLyoqCisgKiBEZXRhaWxlZCBpbmZvcm1hdGlvbi4KKyAqLworI2RlZmluZSBBVl9MT0dfVkVSQk9TRSAgNDAKKworLyoqCisgKiBTdHVmZiB3aGljaCBpcyBvbmx5IHVzZWZ1bCBmb3IgbGliYXYqIGRldmVsb3BlcnMuCisgKi8KKyNkZWZpbmUgQVZfTE9HX0RFQlVHICAgIDQ4CisKKyNkZWZpbmUgQVZfTE9HX01BWF9PRkZTRVQgKEFWX0xPR19ERUJVRyAtIEFWX0xPR19RVUlFVCkKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogU2V0cyBhZGRpdGlvbmFsIGNvbG9ycyBmb3IgZXh0ZW5kZWQgZGVidWdnaW5nIHNlc3Npb25zLgorICogQGNvZGUKKyAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVR3xBVl9MT0dfQygxMzQpLCAiTWVzc2FnZSBpbiBwdXJwbGVcbiIpOworICAgQGVuZGNvZGUKKyAqIFJlcXVpcmVzIDI1NmNvbG9yIHRlcm1pbmFsIHN1cHBvcnQuIFVzZXMgb3V0c2lkZSBkZWJ1Z2dpbmcgaXMgbm90CisgKiByZWNvbW1lbmRlZC4KKyAqLworI2RlZmluZSBBVl9MT0dfQyh4KSAoeCA8PCA4KQorCisvKioKKyAqIFNlbmQgdGhlIHNwZWNpZmllZCBtZXNzYWdlIHRvIHRoZSBsb2cgaWYgdGhlIGxldmVsIGlzIGxlc3MgdGhhbiBvciBlcXVhbAorICogdG8gdGhlIGN1cnJlbnQgYXZfbG9nX2xldmVsLiBCeSBkZWZhdWx0LCBhbGwgbG9nZ2luZyBtZXNzYWdlcyBhcmUgc2VudCB0bworICogc3RkZXJyLiBUaGlzIGJlaGF2aW9yIGNhbiBiZSBhbHRlcmVkIGJ5IHNldHRpbmcgYSBkaWZmZXJlbnQgbG9nZ2luZyBjYWxsYmFjaworICogZnVuY3Rpb24uCisgKiBAc2VlIGF2X2xvZ19zZXRfY2FsbGJhY2sKKyAqCisgKiBAcGFyYW0gYXZjbCBBIHBvaW50ZXIgdG8gYW4gYXJiaXRyYXJ5IHN0cnVjdCBvZiB3aGljaCB0aGUgZmlyc3QgZmllbGQgaXMgYQorICogICAgICAgIHBvaW50ZXIgdG8gYW4gQVZDbGFzcyBzdHJ1Y3QuCisgKiBAcGFyYW0gbGV2ZWwgVGhlIGltcG9ydGFuY2UgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgZXhwcmVzc2VkIHVzaW5nIGEgQHJlZgorICogICAgICAgIGxhdnVfbG9nX2NvbnN0YW50cyAiTG9nZ2luZyBDb25zdGFudCIuCisgKiBAcGFyYW0gZm10IFRoZSBmb3JtYXQgc3RyaW5nIChwcmludGYtY29tcGF0aWJsZSkgdGhhdCBzcGVjaWZpZXMgaG93CisgKiAgICAgICAgc3Vic2VxdWVudCBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBvdXRwdXQuCisgKi8KK3ZvaWQgYXZfbG9nKHZvaWQgKmF2Y2wsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pIGF2X3ByaW50Zl9mb3JtYXQoMywgNCk7CisKKworLyoqCisgKiBTZW5kIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSB0byB0aGUgbG9nIGlmIHRoZSBsZXZlbCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwKKyAqIHRvIHRoZSBjdXJyZW50IGF2X2xvZ19sZXZlbC4gQnkgZGVmYXVsdCwgYWxsIGxvZ2dpbmcgbWVzc2FnZXMgYXJlIHNlbnQgdG8KKyAqIHN0ZGVyci4gVGhpcyBiZWhhdmlvciBjYW4gYmUgYWx0ZXJlZCBieSBzZXR0aW5nIGEgZGlmZmVyZW50IGxvZ2dpbmcgY2FsbGJhY2sKKyAqIGZ1bmN0aW9uLgorICogQHNlZSBhdl9sb2dfc2V0X2NhbGxiYWNrCisgKgorICogQHBhcmFtIGF2Y2wgQSBwb2ludGVyIHRvIGFuIGFyYml0cmFyeSBzdHJ1Y3Qgb2Ygd2hpY2ggdGhlIGZpcnN0IGZpZWxkIGlzIGEKKyAqICAgICAgICBwb2ludGVyIHRvIGFuIEFWQ2xhc3Mgc3RydWN0LgorICogQHBhcmFtIGxldmVsIFRoZSBpbXBvcnRhbmNlIGxldmVsIG9mIHRoZSBtZXNzYWdlIGV4cHJlc3NlZCB1c2luZyBhIEByZWYKKyAqICAgICAgICBsYXZ1X2xvZ19jb25zdGFudHMgIkxvZ2dpbmcgQ29uc3RhbnQiLgorICogQHBhcmFtIGZtdCBUaGUgZm9ybWF0IHN0cmluZyAocHJpbnRmLWNvbXBhdGlibGUpIHRoYXQgc3BlY2lmaWVzIGhvdworICogICAgICAgIHN1YnNlcXVlbnQgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gb3V0cHV0LgorICogQHBhcmFtIHZsIFRoZSBhcmd1bWVudHMgcmVmZXJlbmNlZCBieSB0aGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZCBhdl92bG9nKHZvaWQgKmF2Y2wsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZsKTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgbG9nIGxldmVsCisgKgorICogQHNlZSBsYXZ1X2xvZ19jb25zdGFudHMKKyAqCisgKiBAcmV0dXJuIEN1cnJlbnQgbG9nIGxldmVsCisgKi8KK2ludCBhdl9sb2dfZ2V0X2xldmVsKHZvaWQpOworCisvKioKKyAqIFNldCB0aGUgbG9nIGxldmVsCisgKgorICogQHNlZSBsYXZ1X2xvZ19jb25zdGFudHMKKyAqCisgKiBAcGFyYW0gbGV2ZWwgTG9nZ2luZyBsZXZlbAorICovCit2b2lkIGF2X2xvZ19zZXRfbGV2ZWwoaW50IGxldmVsKTsKKworLyoqCisgKiBTZXQgdGhlIGxvZ2dpbmcgY2FsbGJhY2sKKyAqCisgKiBAbm90ZSBUaGUgY2FsbGJhY2sgbXVzdCBiZSB0aHJlYWQgc2FmZSwgZXZlbiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgdXNlCisgKiAgICAgICB0aHJlYWRzIGl0c2VsZiBhcyBzb21lIGNvZGVjcyBhcmUgbXVsdGl0aHJlYWRlZC4KKyAqCisgKiBAc2VlIGF2X2xvZ19kZWZhdWx0X2NhbGxiYWNrCisgKgorICogQHBhcmFtIGNhbGxiYWNrIEEgbG9nZ2luZyBmdW5jdGlvbiB3aXRoIGEgY29tcGF0aWJsZSBzaWduYXR1cmUuCisgKi8KK3ZvaWQgYXZfbG9nX3NldF9jYWxsYmFjayh2b2lkICgqY2FsbGJhY2spKHZvaWQqLCBpbnQsIGNvbnN0IGNoYXIqLCB2YV9saXN0KSk7CisKKy8qKgorICogRGVmYXVsdCBsb2dnaW5nIGNhbGxiYWNrCisgKgorICogSXQgcHJpbnRzIHRoZSBtZXNzYWdlIHRvIHN0ZGVyciwgb3B0aW9uYWxseSBjb2xvcml6aW5nIGl0LgorICoKKyAqIEBwYXJhbSBhdmNsIEEgcG9pbnRlciB0byBhbiBhcmJpdHJhcnkgc3RydWN0IG9mIHdoaWNoIHRoZSBmaXJzdCBmaWVsZCBpcyBhCisgKiAgICAgICAgcG9pbnRlciB0byBhbiBBVkNsYXNzIHN0cnVjdC4KKyAqIEBwYXJhbSBsZXZlbCBUaGUgaW1wb3J0YW5jZSBsZXZlbCBvZiB0aGUgbWVzc2FnZSBleHByZXNzZWQgdXNpbmcgYSBAcmVmCisgKiAgICAgICAgbGF2dV9sb2dfY29uc3RhbnRzICJMb2dnaW5nIENvbnN0YW50Ii4KKyAqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdCBzdHJpbmcgKHByaW50Zi1jb21wYXRpYmxlKSB0aGF0IHNwZWNpZmllcyBob3cKKyAqICAgICAgICBzdWJzZXF1ZW50IGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIG91dHB1dC4KKyAqIEBwYXJhbSB2bCBUaGUgYXJndW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcuCisgKi8KK3ZvaWQgYXZfbG9nX2RlZmF1bHRfY2FsbGJhY2sodm9pZCAqYXZjbCwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgdmwpOworCisvKioKKyAqIFJldHVybiB0aGUgY29udGV4dCBuYW1lCisgKgorICogQHBhcmFtICBjdHggVGhlIEFWQ2xhc3MgY29udGV4dAorICoKKyAqIEByZXR1cm4gVGhlIEFWQ2xhc3MgY2xhc3NfbmFtZQorICovCitjb25zdCBjaGFyKiBhdl9kZWZhdWx0X2l0ZW1fbmFtZSh2b2lkKiBjdHgpOworQVZDbGFzc0NhdGVnb3J5IGF2X2RlZmF1bHRfZ2V0X2NhdGVnb3J5KHZvaWQgKnB0cik7CisKKy8qKgorICogRm9ybWF0IGEgbGluZSBvZiBsb2cgdGhlIHNhbWUgd2F5IGFzIHRoZSBkZWZhdWx0IGNhbGxiYWNrLgorICogQHBhcmFtIGxpbmUgICAgICAgICAgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGZvcm1hdGVkIGxpbmUKKyAqIEBwYXJhbSBsaW5lX3NpemUgICAgIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogQHBhcmFtIHByaW50X3ByZWZpeCAgdXNlZCB0byBzdG9yZSB3aGV0aGVyIHRoZSBwcmVmaXggbXVzdCBiZSBwcmludGVkOworICogICAgICAgICAgICAgICAgICAgICAgbXVzdCBwb2ludCB0byBhIHBlcnNpc3RlbnQgaW50ZWdlciBpbml0aWFsbHkgc2V0IHRvIDEKKyAqLwordm9pZCBhdl9sb2dfZm9ybWF0X2xpbmUodm9pZCAqcHRyLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmxpbmUsIGludCBsaW5lX3NpemUsIGludCAqcHJpbnRfcHJlZml4KTsKKworLyoqCisgKiBhdl9kbG9nIG1hY3JvcworICogVXNlZnVsIHRvIHByaW50IGRlYnVnIG1lc3NhZ2VzIHRoYXQgc2hvdWxkbid0IGdldCBjb21waWxlZCBpbiBub3JtYWxseS4KKyAqLworCisjaWZkZWYgREVCVUcKKyMgICAgZGVmaW5lIGF2X2Rsb2cocGN0eCwgLi4uKSBhdl9sb2cocGN0eCwgQVZfTE9HX0RFQlVHLCBfX1ZBX0FSR1NfXykKKyNlbHNlCisjICAgIGRlZmluZSBhdl9kbG9nKHBjdHgsIC4uLikgZG8geyBpZiAoMCkgYXZfbG9nKHBjdHgsIEFWX0xPR19ERUJVRywgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qKgorICogU2tpcCByZXBlYXRlZCBtZXNzYWdlcywgdGhpcyByZXF1aXJlcyB0aGUgdXNlciBhcHAgdG8gdXNlIGF2X2xvZygpIGluc3RlYWQgb2YKKyAqIChmKXByaW50ZiBhcyB0aGUgMiB3b3VsZCBvdGhlcndpc2UgaW50ZXJmZXJlIGFuZCBsZWFkIHRvCisgKiAiTGFzdCBtZXNzYWdlIHJlcGVhdGVkIHggdGltZXMiIG1lc3NhZ2VzIGJlbG93IChmKXByaW50ZiBtZXNzYWdlcyB3aXRoIHNvbWUKKyAqIGJhZCBsdWNrLgorICogQWxzbyB0byByZWNlaXZlIHRoZSBsYXN0LCAibGFzdCByZXBlYXRlZCIgbGluZSBpZiBhbnksIHRoZSB1c2VyIGFwcCBtdXN0CisgKiBjYWxsIGF2X2xvZyhOVUxMLCBBVl9MT0dfUVVJRVQsICIlcyIsICIiKTsgYXQgdGhlIGVuZAorICovCisjZGVmaW5lIEFWX0xPR19TS0lQX1JFUEVBVEVEIDEKKworLyoqCisgKiBJbmNsdWRlIHRoZSBsb2cgc2V2ZXJpdHkgaW4gbWVzc2FnZXMgb3JpZ2luYXRpbmcgZnJvbSBjb2RlY3MuCisgKgorICogUmVzdWx0cyBpbiBtZXNzYWdlcyBzdWNoIGFzOgorICogW3Jhd3ZpZGVvIEAgMHhERUFEQkVFRl0gW2Vycm9yXSBlbmNvZGUgZGlkIG5vdCBwcm9kdWNlIHZhbGlkIHB0cworICovCisjZGVmaW5lIEFWX0xPR19QUklOVF9MRVZFTCAyCisKK3ZvaWQgYXZfbG9nX3NldF9mbGFncyhpbnQgYXJnKTsKK2ludCBhdl9sb2dfZ2V0X2ZsYWdzKHZvaWQpOworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9MT0dfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9sb2cyX3RhYi5jIGIvZmZtcGVnL2xpYmF2dXRpbC9sb2cyX3RhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYmYwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2xvZzJfdGFiLmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDEyIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworY29uc3QgdWludDhfdCBmZl9sb2cyX3RhYlsyNTZdPXsKKyAgICAgICAgMCwwLDEsMSwyLDIsMiwyLDMsMywzLDMsMywzLDMsMyw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAorICAgICAgICA1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsCisgICAgICAgIDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKKyAgICAgICAgNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAorICAgICAgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCisgICAgICAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKyAgICAgICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorICAgICAgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL2x6by5jIGIvZmZtcGVnL2xpYmF2dXRpbC9sem8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ExMGVjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9sem8uYwpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIExaTyAxeCBkZWNvbXByZXNzaW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUmVpbWFyIERvZWZmaW5nZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZ1dGlsLmgiCisjaW5jbHVkZSAiYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJpbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsem8uaCIKKworLy8vIERlZmluZSBpZiB3ZSBtYXkgd3JpdGUgdXAgdG8gMTIgYnl0ZXMgYmV5b25kIHRoZSBvdXRwdXQgYnVmZmVyLgorI2RlZmluZSBPVVRCVUZfUEFEREVEIDEKKy8vLyBEZWZpbmUgaWYgd2UgbWF5IHJlYWQgdXAgdG8gOCBieXRlcyBiZXlvbmQgdGhlIGlucHV0IGJ1ZmZlci4KKyNkZWZpbmUgSU5CVUZfUEFEREVEIDEKKwordHlwZWRlZiBzdHJ1Y3QgTFpPQ29udGV4dCB7CisgICAgY29uc3QgdWludDhfdCAqaW4sICppbl9lbmQ7CisgICAgdWludDhfdCAqb3V0X3N0YXJ0LCAqb3V0LCAqb3V0X2VuZDsKKyAgICBpbnQgZXJyb3I7Cit9IExaT0NvbnRleHQ7CisKKy8qKgorICogQGJyaWVmIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGlucHV0IGJ1ZmZlciwgYXZvaWRpbmcgYW4gb3ZlcnJ1bi4KKyAqIEByZXR1cm4gYnl0ZSByZWFkCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9ieXRlKExaT0NvbnRleHQgKmMpCit7CisgICAgaWYgKGMtPmluIDwgYy0+aW5fZW5kKQorICAgICAgICByZXR1cm4gKmMtPmluKys7CisgICAgYy0+ZXJyb3IgfD0gQVZfTFpPX0lOUFVUX0RFUExFVEVEOworICAgIHJldHVybiAxOworfQorCisjaWZkZWYgSU5CVUZfUEFEREVECisjZGVmaW5lIEdFVEIoYykgKCooYykuaW4rKykKKyNlbHNlCisjZGVmaW5lIEdFVEIoYykgZ2V0X2J5dGUoJihjKSkKKyNlbmRpZgorCisvKioKKyAqIEBicmllZiBEZWNvZGVzIGEgbGVuZ3RoIHZhbHVlIGluIHRoZSBjb2RpbmcgdXNlZCBieSBsem8uCisgKiBAcGFyYW0geCBwcmV2aW91cyBieXRlIHZhbHVlCisgKiBAcGFyYW0gbWFzayBiaXRzIHVzZWQgZnJvbSB4CisgKiBAcmV0dXJuIGRlY29kZWQgbGVuZ3RoIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9sZW4oTFpPQ29udGV4dCAqYywgaW50IHgsIGludCBtYXNrKQoreworICAgIGludCBjbnQgPSB4ICYgbWFzazsKKyAgICBpZiAoIWNudCkgeworICAgICAgICB3aGlsZSAoISh4ID0gZ2V0X2J5dGUoYykpKSB7CisgICAgICAgICAgICBpZiAoY250ID49IElOVF9NQVggLSAxMDAwKSB7CisgICAgICAgICAgICAgICAgYy0+ZXJyb3IgfD0gQVZfTFpPX0VSUk9SOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY250ICs9IDI1NTsKKyAgICAgICAgfQorICAgICAgICBjbnQgKz0gbWFzayArIHg7CisgICAgfQorICAgIHJldHVybiBjbnQ7Cit9CisKKy8qKgorICogQGJyaWVmIENvcGllcyBieXRlcyBmcm9tIGlucHV0IHRvIG91dHB1dCBidWZmZXIgd2l0aCBjaGVja2luZy4KKyAqIEBwYXJhbSBjbnQgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHksIG11c3QgYmUgPj0gMAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY29weShMWk9Db250ZXh0ICpjLCBpbnQgY250KQoreworICAgIHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IGMtPmluOworICAgIHJlZ2lzdGVyIHVpbnQ4X3QgKmRzdCAgICAgICA9IGMtPm91dDsKKyAgICBhdl9hc3NlcnQwKGNudCA+PSAwKTsKKyAgICBpZiAoY250ID4gYy0+aW5fZW5kIC0gc3JjKSB7CisgICAgICAgIGNudCAgICAgICA9IEZGTUFYKGMtPmluX2VuZCAtIHNyYywgMCk7CisgICAgICAgIGMtPmVycm9yIHw9IEFWX0xaT19JTlBVVF9ERVBMRVRFRDsKKyAgICB9CisgICAgaWYgKGNudCA+IGMtPm91dF9lbmQgLSBkc3QpIHsKKyAgICAgICAgY250ICAgICAgID0gRkZNQVgoYy0+b3V0X2VuZCAtIGRzdCwgMCk7CisgICAgICAgIGMtPmVycm9yIHw9IEFWX0xaT19PVVRQVVRfRlVMTDsKKyAgICB9CisjaWYgZGVmaW5lZChJTkJVRl9QQURERUQpICYmIGRlZmluZWQoT1VUQlVGX1BBRERFRCkKKyAgICBBVl9DT1BZMzJVKGRzdCwgc3JjKTsKKyAgICBzcmMgKz0gNDsKKyAgICBkc3QgKz0gNDsKKyAgICBjbnQgLT0gNDsKKyAgICBpZiAoY250ID4gMCkKKyNlbmRpZgorICAgIG1lbWNweShkc3QsIHNyYywgY250KTsKKyAgICBjLT5pbiAgPSBzcmMgKyBjbnQ7CisgICAgYy0+b3V0ID0gZHN0ICsgY250OworfQorCisvKioKKyAqIEBicmllZiBDb3BpZXMgcHJldmlvdXNseSBkZWNvZGVkIGJ5dGVzIHRvIGN1cnJlbnQgcG9zaXRpb24uCisgKiBAcGFyYW0gYmFjayBob3cgbWFueSBieXRlcyBiYWNrIHdlIHN0YXJ0LCBtdXN0IGJlID4gMAorICogQHBhcmFtIGNudCBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSwgbXVzdCBiZSA+IDAKKyAqCisgKiBjbnQgPiBiYWNrIGlzIHZhbGlkLCB0aGlzIHdpbGwgY29weSB0aGUgYnl0ZXMgd2UganVzdCBjb3BpZWQsCisgKiB0aHVzIGNyZWF0aW5nIGEgcmVwZWF0aW5nIHBhdHRlcm4gd2l0aCBhIHBlcmlvZCBsZW5ndGggb2YgYmFjay4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfYmFja3B0cihMWk9Db250ZXh0ICpjLCBpbnQgYmFjaywgaW50IGNudCkKK3sKKyAgICByZWdpc3RlciB1aW50OF90ICpkc3QgICAgICAgPSBjLT5vdXQ7CisgICAgYXZfYXNzZXJ0MChjbnQgPiAwKTsKKyAgICBpZiAoZHN0IC0gYy0+b3V0X3N0YXJ0IDwgYmFjaykgeworICAgICAgICBjLT5lcnJvciB8PSBBVl9MWk9fSU5WQUxJRF9CQUNLUFRSOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChjbnQgPiBjLT5vdXRfZW5kIC0gZHN0KSB7CisgICAgICAgIGNudCAgICAgICA9IEZGTUFYKGMtPm91dF9lbmQgLSBkc3QsIDApOworICAgICAgICBjLT5lcnJvciB8PSBBVl9MWk9fT1VUUFVUX0ZVTEw7CisgICAgfQorICAgIGF2X21lbWNweV9iYWNrcHRyKGRzdCwgYmFjaywgY250KTsKKyAgICBjLT5vdXQgPSBkc3QgKyBjbnQ7Cit9CisKK2ludCBhdl9sem8xeF9kZWNvZGUodm9pZCAqb3V0LCBpbnQgKm91dGxlbiwgY29uc3Qgdm9pZCAqaW4sIGludCAqaW5sZW4pCit7CisgICAgaW50IHN0YXRlID0gMDsKKyAgICBpbnQgeDsKKyAgICBMWk9Db250ZXh0IGM7CisgICAgaWYgKCpvdXRsZW4gPD0gMCB8fCAqaW5sZW4gPD0gMCkgeworICAgICAgICBpbnQgcmVzID0gMDsKKyAgICAgICAgaWYgKCpvdXRsZW4gPD0gMCkKKyAgICAgICAgICAgIHJlcyB8PSBBVl9MWk9fT1VUUFVUX0ZVTEw7CisgICAgICAgIGlmICgqaW5sZW4gPD0gMCkKKyAgICAgICAgICAgIHJlcyB8PSBBVl9MWk9fSU5QVVRfREVQTEVURUQ7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGMuaW4gICAgICA9IGluOworICAgIGMuaW5fZW5kICA9IChjb25zdCB1aW50OF90ICopaW4gKyAqaW5sZW47CisgICAgYy5vdXQgICAgID0gYy5vdXRfc3RhcnQgPSBvdXQ7CisgICAgYy5vdXRfZW5kID0gKHVpbnQ4X3QgKilvdXQgKyAqb3V0bGVuOworICAgIGMuZXJyb3IgICA9IDA7CisgICAgeCAgICAgICAgID0gR0VUQihjKTsKKyAgICBpZiAoeCA+IDE3KSB7CisgICAgICAgIGNvcHkoJmMsIHggLSAxNyk7CisgICAgICAgIHggPSBHRVRCKGMpOworICAgICAgICBpZiAoeCA8IDE2KQorICAgICAgICAgICAgYy5lcnJvciB8PSBBVl9MWk9fRVJST1I7CisgICAgfQorICAgIGlmIChjLmluID4gYy5pbl9lbmQpCisgICAgICAgIGMuZXJyb3IgfD0gQVZfTFpPX0lOUFVUX0RFUExFVEVEOworICAgIHdoaWxlICghYy5lcnJvcikgeworICAgICAgICBpbnQgY250LCBiYWNrOworICAgICAgICBpZiAoeCA+IDE1KSB7CisgICAgICAgICAgICBpZiAoeCA+IDYzKSB7CisgICAgICAgICAgICAgICAgY250ICA9ICh4ID4+IDUpIC0gMTsKKyAgICAgICAgICAgICAgICBiYWNrID0gKEdFVEIoYykgPDwgMykgKyAoKHggPj4gMikgJiA3KSArIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHggPiAzMSkgeworICAgICAgICAgICAgICAgIGNudCAgPSBnZXRfbGVuKCZjLCB4LCAzMSk7CisgICAgICAgICAgICAgICAgeCAgICA9IEdFVEIoYyk7CisgICAgICAgICAgICAgICAgYmFjayA9IChHRVRCKGMpIDw8IDYpICsgKHggPj4gMikgKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbnQgICA9IGdldF9sZW4oJmMsIHgsIDcpOworICAgICAgICAgICAgICAgIGJhY2sgID0gKDEgPDwgMTQpICsgKCh4ICYgOCkgPDwgMTEpOworICAgICAgICAgICAgICAgIHggICAgID0gR0VUQihjKTsKKyAgICAgICAgICAgICAgICBiYWNrICs9IChHRVRCKGMpIDw8IDYpICsgKHggPj4gMik7CisgICAgICAgICAgICAgICAgaWYgKGJhY2sgPT0gKDEgPDwgMTQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbnQgIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuZXJyb3IgfD0gQVZfTFpPX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlKSB7CisgICAgICAgICAgICBjbnQgPSBnZXRfbGVuKCZjLCB4LCAxNSk7CisgICAgICAgICAgICBjb3B5KCZjLCBjbnQgKyAzKTsKKyAgICAgICAgICAgIHggPSBHRVRCKGMpOworICAgICAgICAgICAgaWYgKHggPiAxNSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNudCAgPSAxOworICAgICAgICAgICAgYmFjayA9ICgxIDw8IDExKSArIChHRVRCKGMpIDw8IDIpICsgKHggPj4gMikgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY250ICA9IDA7CisgICAgICAgICAgICBiYWNrID0gKEdFVEIoYykgPDwgMikgKyAoeCA+PiAyKSArIDE7CisgICAgICAgIH0KKyAgICAgICAgY29weV9iYWNrcHRyKCZjLCBiYWNrLCBjbnQgKyAyKTsKKyAgICAgICAgc3RhdGUgPQorICAgICAgICBjbnQgICA9IHggJiAzOworICAgICAgICBjb3B5KCZjLCBjbnQpOworICAgICAgICB4ID0gR0VUQihjKTsKKyAgICB9CisgICAgKmlubGVuID0gYy5pbl9lbmQgLSBjLmluOworICAgIGlmIChjLmluID4gYy5pbl9lbmQpCisgICAgICAgICppbmxlbiA9IDA7CisgICAgKm91dGxlbiA9IGMub3V0X2VuZCAtIGMub3V0OworICAgIHJldHVybiBjLmVycm9yOworfQorCisjaWZkZWYgVEVTVAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bHpvL2x6bzF4Lmg+CisjaW5jbHVkZSAibG9nLmgiCisjZGVmaW5lIE1BWFNaICgxMCoxMDI0KjEwMjQpCisKKy8qIERlZmluZSBvbmUgb2YgdGhlc2UgdG8gMSBpZiB5b3Ugd2lzaCB0byBiZW5jaG1hcmsgbGlibHpvCisgKiBpbnN0ZWFkIG9mIG91ciBuYXRpdmUgaW1wbGVtZW50YXRpb24uICovCisjZGVmaW5lIEJFTkNITUFSS19MSUJMWk9fU0FGRSAgIDAKKyNkZWZpbmUgQkVOQ0hNQVJLX0xJQkxaT19VTlNBRkUgMAorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisgICAgRklMRSAqaW4gPSBmb3Blbihhcmd2WzFdLCAicmIiKTsKKyAgICBpbnQgY29tcF9sZXZlbCA9IGFyZ2MgPiAyID8gYXRvaShhcmd2WzJdKSA6IDA7CisgICAgdWludDhfdCAqb3JpZyA9IGF2X21hbGxvYyhNQVhTWiArIDE2KTsKKyAgICB1aW50OF90ICpjb21wID0gYXZfbWFsbG9jKDIqTUFYU1ogKyAxNik7CisgICAgdWludDhfdCAqZGVjb21wID0gYXZfbWFsbG9jKE1BWFNaICsgMTYpOworICAgIHNpemVfdCBzID0gZnJlYWQob3JpZywgMSwgTUFYU1osIGluKTsKKyAgICBsem9fdWludCBjbGVuID0gMDsKKyAgICBsb25nIHRtcFtMWk8xWF9NRU1fQ09NUFJFU1NdOworICAgIGludCBpbmxlbiwgb3V0bGVuOworICAgIGludCBpOworICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKKyAgICBpZiAoY29tcF9sZXZlbCA9PSAwKSB7CisgICAgICAgIGx6bzF4XzFfY29tcHJlc3Mob3JpZywgcywgY29tcCwgJmNsZW4sIHRtcCk7CisgICAgfSBlbHNlIGlmIChjb21wX2xldmVsID09IDExKSB7CisgICAgICAgIGx6bzF4XzFfMTFfY29tcHJlc3Mob3JpZywgcywgY29tcCwgJmNsZW4sIHRtcCk7CisgICAgfSBlbHNlIGlmIChjb21wX2xldmVsID09IDEyKSB7CisgICAgICAgIGx6bzF4XzFfMTJfY29tcHJlc3Mob3JpZywgcywgY29tcCwgJmNsZW4sIHRtcCk7CisgICAgfSBlbHNlIGlmIChjb21wX2xldmVsID09IDE1KSB7CisgICAgICAgIGx6bzF4XzFfMTVfY29tcHJlc3Mob3JpZywgcywgY29tcCwgJmNsZW4sIHRtcCk7CisgICAgfSBlbHNlCisgICAgICAgIGx6bzF4Xzk5OV9jb21wcmVzcyhvcmlnLCBzLCBjb21wLCAmY2xlbiwgdG1wKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzAwOyBpKyspIHsKK1NUQVJUX1RJTUVSCisgICAgICAgIGlubGVuID0gY2xlbjsgb3V0bGVuID0gTUFYU1o7CisjaWYgQkVOQ0hNQVJLX0xJQkxaT19TQUZFCisgICAgICAgIGlmIChsem8xeF9kZWNvbXByZXNzX3NhZmUoY29tcCwgaW5sZW4sIGRlY29tcCwgJm91dGxlbiwgTlVMTCkpCisjZWxpZiBCRU5DSE1BUktfTElCTFpPX1VOU0FGRQorICAgICAgICBpZiAobHpvMXhfZGVjb21wcmVzcyhjb21wLCBpbmxlbiwgZGVjb21wLCAmb3V0bGVuLCBOVUxMKSkKKyNlbHNlCisgICAgICAgIGlmIChhdl9sem8xeF9kZWNvZGUoZGVjb21wLCAmb3V0bGVuLCBjb21wLCAmaW5sZW4pKQorI2VuZGlmCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiZGVjb21wcmVzc2lvbiBlcnJvclxuIik7CitTVE9QX1RJTUVSKCJsem9kIikKKyAgICB9CisgICAgaWYgKG1lbWNtcChvcmlnLCBkZWNvbXAsIHMpKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiZGVjb21wcmVzc2lvbiBpbmNvcnJlY3RcbiIpOworICAgIGVsc2UKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImRlY29tcHJlc3Npb24gT0tcbiIpOworICAgIGZjbG9zZShpbik7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvbHpvLmggYi9mZm1wZWcvbGliYXZ1dGlsL2x6by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzQwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL2x6by5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMWk8gMXggZGVjb21wcmVzc2lvbgorICogY29weXJpZ2h0IChjKSAyMDA2IFJlaW1hciBEb2VmZmluZ2VyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0xaT19ICisjZGVmaW5lIEFWVVRJTF9MWk9fSAorCisvKioKKyAqIEBkZWZncm91cCBsYXZ1X2x6byBMWk8KKyAqIEBpbmdyb3VwIGxhdnVfY3J5cHRvCisgKgorICogQHsKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKiBAbmFtZSBFcnJvciBmbGFncyByZXR1cm5lZCBieSBhdl9sem8xeF9kZWNvZGUKKyAqIEB7ICovCisvLy8gZW5kIG9mIHRoZSBpbnB1dCBidWZmZXIgcmVhY2hlZCBiZWZvcmUgZGVjb2RpbmcgZmluaXNoZWQKKyNkZWZpbmUgQVZfTFpPX0lOUFVUX0RFUExFVEVEICAxCisvLy8gZGVjb2RlZCBkYXRhIGRpZCBub3QgZml0IGludG8gb3V0cHV0IGJ1ZmZlcgorI2RlZmluZSBBVl9MWk9fT1VUUFVUX0ZVTEwgICAgIDIKKy8vLyBhIHJlZmVyZW5jZSB0byBwcmV2aW91c2x5IGRlY29kZWQgZGF0YSB3YXMgd3JvbmcKKyNkZWZpbmUgQVZfTFpPX0lOVkFMSURfQkFDS1BUUiA0CisvLy8gYSBub24tc3BlY2lmaWMgZXJyb3IgaW4gdGhlIGNvbXByZXNzZWQgYml0c3RyZWFtCisjZGVmaW5lIEFWX0xaT19FUlJPUiAgICAgICAgICAgOAorLyoqIEB9ICovCisKKyNkZWZpbmUgQVZfTFpPX0lOUFVUX1BBRERJTkcgICA4CisjZGVmaW5lIEFWX0xaT19PVVRQVVRfUEFERElORyAxMgorCisvKioKKyAqIEBicmllZiBEZWNvZGVzIExaTyAxeCBjb21wcmVzc2VkIGRhdGEuCisgKiBAcGFyYW0gb3V0IG91dHB1dCBidWZmZXIKKyAqIEBwYXJhbSBvdXRsZW4gc2l6ZSBvZiBvdXRwdXQgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMgbGVmdCBhcmUgcmV0dXJuZWQgaGVyZQorICogQHBhcmFtIGluIGlucHV0IGJ1ZmZlcgorICogQHBhcmFtIGlubGVuIHNpemUgb2YgaW5wdXQgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMgbGVmdCBhcmUgcmV0dXJuZWQgaGVyZQorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBlcnJvciBmbGFncyBhYm92ZQorICoKKyAqIE1ha2Ugc3VyZSBhbGwgYnVmZmVycyBhcmUgYXBwcm9wcmlhdGVseSBwYWRkZWQsIGluIG11c3QgcHJvdmlkZQorICogQVZfTFpPX0lOUFVUX1BBRERJTkcsIG91dCBtdXN0IHByb3ZpZGUgQVZfTFpPX09VVFBVVF9QQURESU5HIGFkZGl0aW9uYWwgYnl0ZXMuCisgKi8KK2ludCBhdl9sem8xeF9kZWNvZGUodm9pZCAqb3V0LCBpbnQgKm91dGxlbiwgY29uc3Qgdm9pZCAqaW4sIGludCAqaW5sZW4pOworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9MWk9fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9tYWNyb3MuaCBiL2ZmbXBlZy9saWJhdnV0aWwvbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2NTMyMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvbWFjcm9zLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAaW5ncm91cCBsYXZ1CisgKiBVdGlsaXR5IFByZXByb2Nlc3NvciBtYWNyb3MKKyAqLworCisjaWZuZGVmIEFWVVRJTF9NQUNST1NfSAorI2RlZmluZSBBVlVUSUxfTUFDUk9TX0gKKworLyoqCisgKiBAYWRkdG9ncm91cCBwcmVwcm9jX21pc2MgUHJlcHJvY2Vzc29yIFN0cmluZyBNYWNyb3MKKyAqCisgKiBTdHJpbmcgbWFuaXB1bGF0aW9uIG1hY3JvcworICoKKyAqIEB7CisgKi8KKworI2RlZmluZSBBVl9TVFJJTkdJRlkocykgICAgICAgICBBVl9UT1NUUklORyhzKQorI2RlZmluZSBBVl9UT1NUUklORyhzKSAjcworCisjZGVmaW5lIEFWX0dMVUUoYSwgYikgYSAjIyBiCisjZGVmaW5lIEFWX0pPSU4oYSwgYikgQVZfR0xVRShhLCBiKQorCisvKioKKyAqIEB9CisgKi8KKworI2RlZmluZSBBVl9QUkFHTUEocykgX1ByYWdtYSgjcykKKworI2VuZGlmIC8qIEFWVVRJTF9NQUNST1NfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9tYXRoZW1hdGljcy5jIGIvZmZtcGVnL2xpYmF2dXRpbC9tYXRoZW1hdGljcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNmNmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL21hdGhlbWF0aWNzLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBtaXNjZWxsYW5lb3VzIG1hdGggcm91dGluZXMgYW5kIHRhYmxlcworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgIm1hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImF2YXNzZXJ0LmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjaWYgRkZfQVBJX0FWX1JFVkVSU0UKK2NvbnN0IHVpbnQ4X3QgYXZfcmV2ZXJzZVsyNTZdID0geworMHgwMCwweDgwLDB4NDAsMHhDMCwweDIwLDB4QTAsMHg2MCwweEUwLDB4MTAsMHg5MCwweDUwLDB4RDAsMHgzMCwweEIwLDB4NzAsMHhGMCwKKzB4MDgsMHg4OCwweDQ4LDB4QzgsMHgyOCwweEE4LDB4NjgsMHhFOCwweDE4LDB4OTgsMHg1OCwweEQ4LDB4MzgsMHhCOCwweDc4LDB4RjgsCisweDA0LDB4ODQsMHg0NCwweEM0LDB4MjQsMHhBNCwweDY0LDB4RTQsMHgxNCwweDk0LDB4NTQsMHhENCwweDM0LDB4QjQsMHg3NCwweEY0LAorMHgwQywweDhDLDB4NEMsMHhDQywweDJDLDB4QUMsMHg2QywweEVDLDB4MUMsMHg5QywweDVDLDB4REMsMHgzQywweEJDLDB4N0MsMHhGQywKKzB4MDIsMHg4MiwweDQyLDB4QzIsMHgyMiwweEEyLDB4NjIsMHhFMiwweDEyLDB4OTIsMHg1MiwweEQyLDB4MzIsMHhCMiwweDcyLDB4RjIsCisweDBBLDB4OEEsMHg0QSwweENBLDB4MkEsMHhBQSwweDZBLDB4RUEsMHgxQSwweDlBLDB4NUEsMHhEQSwweDNBLDB4QkEsMHg3QSwweEZBLAorMHgwNiwweDg2LDB4NDYsMHhDNiwweDI2LDB4QTYsMHg2NiwweEU2LDB4MTYsMHg5NiwweDU2LDB4RDYsMHgzNiwweEI2LDB4NzYsMHhGNiwKKzB4MEUsMHg4RSwweDRFLDB4Q0UsMHgyRSwweEFFLDB4NkUsMHhFRSwweDFFLDB4OUUsMHg1RSwweERFLDB4M0UsMHhCRSwweDdFLDB4RkUsCisweDAxLDB4ODEsMHg0MSwweEMxLDB4MjEsMHhBMSwweDYxLDB4RTEsMHgxMSwweDkxLDB4NTEsMHhEMSwweDMxLDB4QjEsMHg3MSwweEYxLAorMHgwOSwweDg5LDB4NDksMHhDOSwweDI5LDB4QTksMHg2OSwweEU5LDB4MTksMHg5OSwweDU5LDB4RDksMHgzOSwweEI5LDB4NzksMHhGOSwKKzB4MDUsMHg4NSwweDQ1LDB4QzUsMHgyNSwweEE1LDB4NjUsMHhFNSwweDE1LDB4OTUsMHg1NSwweEQ1LDB4MzUsMHhCNSwweDc1LDB4RjUsCisweDBELDB4OEQsMHg0RCwweENELDB4MkQsMHhBRCwweDZELDB4RUQsMHgxRCwweDlELDB4NUQsMHhERCwweDNELDB4QkQsMHg3RCwweEZELAorMHgwMywweDgzLDB4NDMsMHhDMywweDIzLDB4QTMsMHg2MywweEUzLDB4MTMsMHg5MywweDUzLDB4RDMsMHgzMywweEIzLDB4NzMsMHhGMywKKzB4MEIsMHg4QiwweDRCLDB4Q0IsMHgyQiwweEFCLDB4NkIsMHhFQiwweDFCLDB4OUIsMHg1QiwweERCLDB4M0IsMHhCQiwweDdCLDB4RkIsCisweDA3LDB4ODcsMHg0NywweEM3LDB4MjcsMHhBNywweDY3LDB4RTcsMHgxNywweDk3LDB4NTcsMHhENywweDM3LDB4QjcsMHg3NywweEY3LAorMHgwRiwweDhGLDB4NEYsMHhDRiwweDJGLDB4QUYsMHg2RiwweEVGLDB4MUYsMHg5RiwweDVGLDB4REYsMHgzRiwweEJGLDB4N0YsMHhGRiwKK307CisjZW5kaWYKKworaW50NjRfdCBhdl9nY2QoaW50NjRfdCBhLCBpbnQ2NF90IGIpCit7CisgICAgaWYgKGIpCisgICAgICAgIHJldHVybiBhdl9nY2QoYiwgYSAlIGIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGE7Cit9CisKK2ludDY0X3QgYXZfcmVzY2FsZV9ybmQoaW50NjRfdCBhLCBpbnQ2NF90IGIsIGludDY0X3QgYywgZW51bSBBVlJvdW5kaW5nIHJuZCkKK3sKKyAgICBpbnQ2NF90IHIgPSAwOworICAgIGF2X2Fzc2VydDIoYyA+IDApOworICAgIGF2X2Fzc2VydDIoYiA+PTApOworICAgIGF2X2Fzc2VydDIoKHVuc2lnbmVkKShybmQmfkFWX1JPVU5EX1BBU1NfTUlOTUFYKTw9NSAmJiAocm5kJn5BVl9ST1VORF9QQVNTX01JTk1BWCkhPTQpOworCisgICAgaWYgKGMgPD0gMCB8fCBiIDwgMCB8fCAhKCh1bnNpZ25lZCkocm5kJn5BVl9ST1VORF9QQVNTX01JTk1BWCk8PTUgJiYgKHJuZCZ+QVZfUk9VTkRfUEFTU19NSU5NQVgpIT00KSkKKyAgICAgICAgcmV0dXJuIElOVDY0X01JTjsKKworICAgIGlmIChybmQgJiBBVl9ST1VORF9QQVNTX01JTk1BWCkgeworICAgICAgICBpZiAoYSA9PSBJTlQ2NF9NSU4gfHwgYSA9PSBJTlQ2NF9NQVgpCisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgcm5kIC09IEFWX1JPVU5EX1BBU1NfTUlOTUFYOworICAgIH0KKworICAgIGlmIChhIDwgMCAmJiBhICE9IElOVDY0X01JTikKKyAgICAgICAgcmV0dXJuIC1hdl9yZXNjYWxlX3JuZCgtYSwgYiwgYywgcm5kIF4gKChybmQgPj4gMSkgJiAxKSk7CisKKyAgICBpZiAocm5kID09IEFWX1JPVU5EX05FQVJfSU5GKQorICAgICAgICByID0gYyAvIDI7CisgICAgZWxzZSBpZiAocm5kICYgMSkKKyAgICAgICAgciA9IGMgLSAxOworCisgICAgaWYgKGIgPD0gSU5UX01BWCAmJiBjIDw9IElOVF9NQVgpIHsKKyAgICAgICAgaWYgKGEgPD0gSU5UX01BWCkKKyAgICAgICAgICAgIHJldHVybiAoYSAqIGIgKyByKSAvIGM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBhIC8gYyAqIGIgKyAoYSAlIGMgKiBiICsgcikgLyBjOworICAgIH0gZWxzZSB7CisjaWYgMQorICAgICAgICB1aW50NjRfdCBhMCAgPSBhICYgMHhGRkZGRkZGRjsKKyAgICAgICAgdWludDY0X3QgYTEgID0gYSA+PiAzMjsKKyAgICAgICAgdWludDY0X3QgYjAgID0gYiAmIDB4RkZGRkZGRkY7CisgICAgICAgIHVpbnQ2NF90IGIxICA9IGIgPj4gMzI7CisgICAgICAgIHVpbnQ2NF90IHQxICA9IGEwICogYjEgKyBhMSAqIGIwOworICAgICAgICB1aW50NjRfdCB0MWEgPSB0MSA8PCAzMjsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgYTAgID0gYTAgKiBiMCArIHQxYTsKKyAgICAgICAgYTEgID0gYTEgKiBiMSArICh0MSA+PiAzMikgKyAoYTAgPCB0MWEpOworICAgICAgICBhMCArPSByOworICAgICAgICBhMSArPSBhMCA8IHI7CisKKyAgICAgICAgZm9yIChpID0gNjM7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBhMSArPSBhMSArICgoYTAgPj4gaSkgJiAxKTsKKyAgICAgICAgICAgIHQxICs9IHQxOworICAgICAgICAgICAgaWYgKGMgPD0gYTEpIHsKKyAgICAgICAgICAgICAgICBhMSAtPSBjOworICAgICAgICAgICAgICAgIHQxKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHQxOworICAgIH0KKyNlbHNlCisgICAgICAgIEFWSW50ZWdlciBhaTsKKyAgICAgICAgYWkgPSBhdl9tdWxfaShhdl9pbnQyaShhKSwgYXZfaW50MmkoYikpOworICAgICAgICBhaSA9IGF2X2FkZF9pKGFpLCBhdl9pbnQyaShyKSk7CisKKyAgICAgICAgcmV0dXJuIGF2X2kyaW50KGF2X2Rpdl9pKGFpLCBhdl9pbnQyaShjKSkpOworICAgIH0KKyNlbmRpZgorfQorCitpbnQ2NF90IGF2X3Jlc2NhbGUoaW50NjRfdCBhLCBpbnQ2NF90IGIsIGludDY0X3QgYykKK3sKKyAgICByZXR1cm4gYXZfcmVzY2FsZV9ybmQoYSwgYiwgYywgQVZfUk9VTkRfTkVBUl9JTkYpOworfQorCitpbnQ2NF90IGF2X3Jlc2NhbGVfcV9ybmQoaW50NjRfdCBhLCBBVlJhdGlvbmFsIGJxLCBBVlJhdGlvbmFsIGNxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZSb3VuZGluZyBybmQpCit7CisgICAgaW50NjRfdCBiID0gYnEubnVtICogKGludDY0X3QpY3EuZGVuOworICAgIGludDY0X3QgYyA9IGNxLm51bSAqIChpbnQ2NF90KWJxLmRlbjsKKyAgICByZXR1cm4gYXZfcmVzY2FsZV9ybmQoYSwgYiwgYywgcm5kKTsKK30KKworaW50NjRfdCBhdl9yZXNjYWxlX3EoaW50NjRfdCBhLCBBVlJhdGlvbmFsIGJxLCBBVlJhdGlvbmFsIGNxKQoreworICAgIHJldHVybiBhdl9yZXNjYWxlX3Ffcm5kKGEsIGJxLCBjcSwgQVZfUk9VTkRfTkVBUl9JTkYpOworfQorCitpbnQgYXZfY29tcGFyZV90cyhpbnQ2NF90IHRzX2EsIEFWUmF0aW9uYWwgdGJfYSwgaW50NjRfdCB0c19iLCBBVlJhdGlvbmFsIHRiX2IpCit7CisgICAgaW50NjRfdCBhID0gdGJfYS5udW0gKiAoaW50NjRfdCl0Yl9iLmRlbjsKKyAgICBpbnQ2NF90IGIgPSB0Yl9iLm51bSAqIChpbnQ2NF90KXRiX2EuZGVuOworICAgIGlmICgoRkZBQlModHNfYSl8YXxGRkFCUyh0c19iKXxiKSA8PSBJTlRfTUFYKQorICAgICAgICByZXR1cm4gKHRzX2EqYSA+IHRzX2IqYikgLSAodHNfYSphIDwgdHNfYipiKTsKKyAgICBpZiAoYXZfcmVzY2FsZV9ybmQodHNfYSwgYSwgYiwgQVZfUk9VTkRfRE9XTikgPCB0c19iKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGF2X3Jlc2NhbGVfcm5kKHRzX2IsIGIsIGEsIEFWX1JPVU5EX0RPV04pIDwgdHNfYSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludDY0X3QgYXZfY29tcGFyZV9tb2QodWludDY0X3QgYSwgdWludDY0X3QgYiwgdWludDY0X3QgbW9kKQoreworICAgIGludDY0X3QgYyA9IChhIC0gYikgJiAobW9kIC0gMSk7CisgICAgaWYgKGMgPiAobW9kID4+IDEpKQorICAgICAgICBjIC09IG1vZDsKKyAgICByZXR1cm4gYzsKK30KKworaW50NjRfdCBhdl9yZXNjYWxlX2RlbHRhKEFWUmF0aW9uYWwgaW5fdGIsIGludDY0X3QgaW5fdHMsICBBVlJhdGlvbmFsIGZzX3RiLCBpbnQgZHVyYXRpb24sIGludDY0X3QgKmxhc3QsIEFWUmF0aW9uYWwgb3V0X3RiKXsKKyAgICBpbnQ2NF90IGEsIGIsIHRoaXM7CisKKyAgICBhdl9hc3NlcnQwKGluX3RzICE9IEFWX05PUFRTX1ZBTFVFKTsKKyAgICBhdl9hc3NlcnQwKGR1cmF0aW9uID49IDApOworCisgICAgaWYgKCpsYXN0ID09IEFWX05PUFRTX1ZBTFVFIHx8ICFkdXJhdGlvbiB8fCBpbl90Yi5udW0qKGludDY0X3Qpb3V0X3RiLmRlbiA8PSBvdXRfdGIubnVtKihpbnQ2NF90KWluX3RiLmRlbikgeworc2ltcGxlX3JvdW5kOgorICAgICAgICAqbGFzdCA9IGF2X3Jlc2NhbGVfcShpbl90cywgaW5fdGIsIGZzX3RiKSArIGR1cmF0aW9uOworICAgICAgICByZXR1cm4gYXZfcmVzY2FsZV9xKGluX3RzLCBpbl90Yiwgb3V0X3RiKTsKKyAgICB9CisKKyAgICBhID0gIGF2X3Jlc2NhbGVfcV9ybmQoMippbl90cy0xLCBpbl90YiwgZnNfdGIsIEFWX1JPVU5EX0RPV04pICAgPj4xOworICAgIGIgPSAoYXZfcmVzY2FsZV9xX3JuZCgyKmluX3RzKzEsIGluX3RiLCBmc190YiwgQVZfUk9VTkRfVVAgICkrMSk+PjE7CisgICAgaWYgKCpsYXN0IDwgMiphIC0gYiB8fCAqbGFzdCA+IDIqYiAtIGEpCisgICAgICAgIGdvdG8gc2ltcGxlX3JvdW5kOworCisgICAgdGhpcyA9IGF2X2NsaXA2NCgqbGFzdCwgYSwgYik7CisgICAgKmxhc3QgPSB0aGlzICsgZHVyYXRpb247CisKKyAgICByZXR1cm4gYXZfcmVzY2FsZV9xKHRoaXMsIGZzX3RiLCBvdXRfdGIpOworfQorCitpbnQ2NF90IGF2X2FkZF9zdGFibGUoQVZSYXRpb25hbCB0c190YiwgaW50NjRfdCB0cywgQVZSYXRpb25hbCBpbmNfdGIsIGludDY0X3QgaW5jKQoreworICAgIGludDY0X3QgbSwgZDsKKworICAgIGlmIChpbmMgIT0gMSkKKyAgICAgICAgaW5jX3RiID0gYXZfbXVsX3EoaW5jX3RiLCAoQVZSYXRpb25hbCkge2luYywgMX0pOworCisgICAgbSA9IGluY190Yi5udW0gKiAoaW50NjRfdCl0c190Yi5kZW47CisgICAgZCA9IGluY190Yi5kZW4gKiAoaW50NjRfdCl0c190Yi5udW07CisKKyAgICBpZiAobSAlIGQgPT0gMCkKKyAgICAgICAgcmV0dXJuIHRzICsgbSAvIGQ7CisgICAgaWYgKG0gPCBkKQorICAgICAgICByZXR1cm4gdHM7CisKKyAgICB7CisgICAgICAgIGludDY0X3Qgb2xkID0gYXZfcmVzY2FsZV9xKHRzLCB0c190YiwgaW5jX3RiKTsKKyAgICAgICAgaW50NjRfdCBvbGRfdHMgPSBhdl9yZXNjYWxlX3Eob2xkLCBpbmNfdGIsIHRzX3RiKTsKKyAgICAgICAgcmV0dXJuIGF2X3Jlc2NhbGVfcShvbGQgKyAxLCBpbmNfdGIsIHRzX3RiKSArICh0cyAtIG9sZF90cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9tYXRoZW1hdGljcy5oIGIvZmZtcGVnL2xpYmF2dXRpbC9tYXRoZW1hdGljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTQ0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL21hdGhlbWF0aWNzLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDUtMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9NQVRIRU1BVElDU19ICisjZGVmaW5lIEFWVVRJTF9NQVRIRU1BVElDU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgInJhdGlvbmFsLmgiCisjaW5jbHVkZSAiaW50ZmxvYXQuaCIKKworI2lmbmRlZiBNX0UKKyNkZWZpbmUgTV9FICAgICAgICAgICAgMi43MTgyODE4Mjg0NTkwNDUyMzU0ICAgLyogZSAqLworI2VuZGlmCisjaWZuZGVmIE1fTE4yCisjZGVmaW5lIE1fTE4yICAgICAgICAgIDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDIgIC8qIGxvZ19lIDIgKi8KKyNlbmRpZgorI2lmbmRlZiBNX0xOMTAKKyNkZWZpbmUgTV9MTjEwICAgICAgICAgMi4zMDI1ODUwOTI5OTQwNDU2ODQwMiAgLyogbG9nX2UgMTAgKi8KKyNlbmRpZgorI2lmbmRlZiBNX0xPRzJfMTAKKyNkZWZpbmUgTV9MT0cyXzEwICAgICAgMy4zMjE5MjgwOTQ4ODczNjIzNDc4NyAgLyogbG9nXzIgMTAgKi8KKyNlbmRpZgorI2lmbmRlZiBNX1BISQorI2RlZmluZSBNX1BISSAgICAgICAgICAxLjYxODAzMzk4ODc0OTg5NDg0ODIwICAgLyogcGhpIC8gZ29sZGVuIHJhdGlvICovCisjZW5kaWYKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJICAgICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2ICAvKiBwaSAqLworI2VuZGlmCisjaWZuZGVmIE1fUElfMgorI2RlZmluZSBNX1BJXzIgICAgICAgICAxLjU3MDc5NjMyNjc5NDg5NjYxOTIzICAvKiBwaS8yICovCisjZW5kaWYKKyNpZm5kZWYgTV9TUVJUMV8yCisjZGVmaW5lIE1fU1FSVDFfMiAgICAgIDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAgIC8qIDEvc3FydCgyKSAqLworI2VuZGlmCisjaWZuZGVmIE1fU1FSVDIKKyNkZWZpbmUgTV9TUVJUMiAgICAgICAgMS40MTQyMTM1NjIzNzMwOTUwNDg4MCAgLyogc3FydCgyKSAqLworI2VuZGlmCisjaWZuZGVmIE5BTgorI2RlZmluZSBOQU4gICAgICAgICAgICBhdl9pbnQyZmxvYXQoMHg3ZmMwMDAwMCkKKyNlbmRpZgorI2lmbmRlZiBJTkZJTklUWQorI2RlZmluZSBJTkZJTklUWSAgICAgICBhdl9pbnQyZmxvYXQoMHg3ZjgwMDAwMCkKKyNlbmRpZgorCisvKioKKyAqIEBhZGR0b2dyb3VwIGxhdnVfbWF0aAorICogQHsKKyAqLworCisKK2VudW0gQVZSb3VuZGluZyB7CisgICAgQVZfUk9VTkRfWkVSTyAgICAgPSAwLCAvLy88IFJvdW5kIHRvd2FyZCB6ZXJvLgorICAgIEFWX1JPVU5EX0lORiAgICAgID0gMSwgLy8vPCBSb3VuZCBhd2F5IGZyb20gemVyby4KKyAgICBBVl9ST1VORF9ET1dOICAgICA9IDIsIC8vLzwgUm91bmQgdG93YXJkIC1pbmZpbml0eS4KKyAgICBBVl9ST1VORF9VUCAgICAgICA9IDMsIC8vLzwgUm91bmQgdG93YXJkICtpbmZpbml0eS4KKyAgICBBVl9ST1VORF9ORUFSX0lORiA9IDUsIC8vLzwgUm91bmQgdG8gbmVhcmVzdCBhbmQgaGFsZndheSBjYXNlcyBhd2F5IGZyb20gemVyby4KKyAgICBBVl9ST1VORF9QQVNTX01JTk1BWCA9IDgxOTIsIC8vLzwgRmxhZyB0byBwYXNzIElOVDY0X01JTi9NQVggdGhyb3VnaCBpbnN0ZWFkIG9mIHJlc2NhbGluZywgdGhpcyBhdm9pZHMgc3BlY2lhbCBjYXNlcyBmb3IgQVZfTk9QVFNfVkFMVUUKK307CisKKy8qKgorICogUmV0dXJuIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiBhIGFuZCBiLgorICogSWYgYm90aCBhIGFuZCBiIGFyZSAwIG9yIGVpdGhlciBvciBib3RoIGFyZSA8MCB0aGVuIGJlaGF2aW9yIGlzCisgKiB1bmRlZmluZWQuCisgKi8KK2ludDY0X3QgYXZfY29uc3QgYXZfZ2NkKGludDY0X3QgYSwgaW50NjRfdCBiKTsKKworLyoqCisgKiBSZXNjYWxlIGEgNjQtYml0IGludGVnZXIgd2l0aCByb3VuZGluZyB0byBuZWFyZXN0LgorICogQSBzaW1wbGUgYSpiL2MgaXNuJ3QgcG9zc2libGUgYXMgaXQgY2FuIG92ZXJmbG93LgorICovCitpbnQ2NF90IGF2X3Jlc2NhbGUoaW50NjRfdCBhLCBpbnQ2NF90IGIsIGludDY0X3QgYykgYXZfY29uc3Q7CisKKy8qKgorICogUmVzY2FsZSBhIDY0LWJpdCBpbnRlZ2VyIHdpdGggc3BlY2lmaWVkIHJvdW5kaW5nLgorICogQSBzaW1wbGUgYSpiL2MgaXNuJ3QgcG9zc2libGUgYXMgaXQgY2FuIG92ZXJmbG93LgorICoKKyAqIEByZXR1cm4gcmVzY2FsZWQgdmFsdWUgYSwgb3IgaWYgQVZfUk9VTkRfUEFTU19NSU5NQVggaXMgc2V0IGFuZCBhIGlzCisgKiAgICAgICAgIElOVDY0X01JTiBvciBJTlQ2NF9NQVggdGhlbiBhIGlzIHBhc3NlZCB0aHJvdWdoIHVuY2hhbmdlZC4KKyAqLworaW50NjRfdCBhdl9yZXNjYWxlX3JuZChpbnQ2NF90IGEsIGludDY0X3QgYiwgaW50NjRfdCBjLCBlbnVtIEFWUm91bmRpbmcpIGF2X2NvbnN0OworCisvKioKKyAqIFJlc2NhbGUgYSA2NC1iaXQgaW50ZWdlciBieSAyIHJhdGlvbmFsIG51bWJlcnMuCisgKi8KK2ludDY0X3QgYXZfcmVzY2FsZV9xKGludDY0X3QgYSwgQVZSYXRpb25hbCBicSwgQVZSYXRpb25hbCBjcSkgYXZfY29uc3Q7CisKKy8qKgorICogUmVzY2FsZSBhIDY0LWJpdCBpbnRlZ2VyIGJ5IDIgcmF0aW9uYWwgbnVtYmVycyB3aXRoIHNwZWNpZmllZCByb3VuZGluZy4KKyAqCisgKiBAcmV0dXJuIHJlc2NhbGVkIHZhbHVlIGEsIG9yIGlmIEFWX1JPVU5EX1BBU1NfTUlOTUFYIGlzIHNldCBhbmQgYSBpcworICogICAgICAgICBJTlQ2NF9NSU4gb3IgSU5UNjRfTUFYIHRoZW4gYSBpcyBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQuCisgKi8KK2ludDY0X3QgYXZfcmVzY2FsZV9xX3JuZChpbnQ2NF90IGEsIEFWUmF0aW9uYWwgYnEsIEFWUmF0aW9uYWwgY3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlJvdW5kaW5nKSBhdl9jb25zdDsKKworLyoqCisgKiBDb21wYXJlIDIgdGltZXN0YW1wcyBlYWNoIGluIGl0cyBvd24gdGltZWJhc2VzLgorICogVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gaXMgdW5kZWZpbmVkIGlmIG9uZSBvZiB0aGUgdGltZXN0YW1wcworICogaXMgb3V0c2lkZSB0aGUgaW50NjRfdCByYW5nZSB3aGVuIHJlcHJlc2VudGVkIGluIHRoZSBvdGhlcnMgdGltZWJhc2UuCisgKiBAcmV0dXJuIC0xIGlmIHRzX2EgaXMgYmVmb3JlIHRzX2IsIDEgaWYgdHNfYSBpcyBhZnRlciB0c19iIG9yIDAgaWYgdGhleSByZXByZXNlbnQgdGhlIHNhbWUgcG9zaXRpb24KKyAqLworaW50IGF2X2NvbXBhcmVfdHMoaW50NjRfdCB0c19hLCBBVlJhdGlvbmFsIHRiX2EsIGludDY0X3QgdHNfYiwgQVZSYXRpb25hbCB0Yl9iKTsKKworLyoqCisgKiBDb21wYXJlIDIgaW50ZWdlcnMgbW9kdWxvIG1vZC4KKyAqIFRoYXQgaXMgd2UgY29tcGFyZSBpbnRlZ2VycyBhIGFuZCBiIGZvciB3aGljaCBvbmx5IHRoZSBsZWFzdAorICogc2lnbmlmaWNhbnQgbG9nMihtb2QpIGJpdHMgYXJlIGtub3duLgorICoKKyAqIEBwYXJhbSBtb2QgbXVzdCBiZSBhIHBvd2VyIG9mIDIKKyAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiBhIGlzIHNtYWxsZXIgdGhhbiBiCisgKiAgICAgICAgIGEgcG9zaXRpdmUgdmFsdWUgaWYgYSBpcyBncmVhdGVyIHRoYW4gYgorICogICAgICAgICAwICAgICAgICAgICAgICAgIGlmIGEgZXF1YWxzICAgICAgICAgIGIKKyAqLworaW50NjRfdCBhdl9jb21wYXJlX21vZCh1aW50NjRfdCBhLCB1aW50NjRfdCBiLCB1aW50NjRfdCBtb2QpOworCisvKioKKyAqIFJlc2NhbGUgYSB0aW1lc3RhbXAgd2hpbGUgcHJlc2VydmluZyBrbm93biBkdXJhdGlvbnMuCisgKgorICogQHBhcmFtIGluX3RzIElucHV0IHRpbWVzdGFtcAorICogQHBhcmFtIGluX3RiIElucHV0IHRpbWViYXNlCisgKiBAcGFyYW0gZnNfdGIgRHVyYXRpb24gYW5kICpsYXN0IHRpbWViYXNlCisgKiBAcGFyYW0gZHVyYXRpb24gZHVyYXRpb24gdGlsbCB0aGUgbmV4dCBjYWxsCisgKiBAcGFyYW0gb3V0X3RiIE91dHB1dCB0aW1lYmFzZQorICovCitpbnQ2NF90IGF2X3Jlc2NhbGVfZGVsdGEoQVZSYXRpb25hbCBpbl90YiwgaW50NjRfdCBpbl90cywgIEFWUmF0aW9uYWwgZnNfdGIsIGludCBkdXJhdGlvbiwgaW50NjRfdCAqbGFzdCwgQVZSYXRpb25hbCBvdXRfdGIpOworCisvKioKKyAqIEFkZCBhIHZhbHVlIHRvIGEgdGltZXN0YW1wLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0aGF0IHdoZW4gdGhlIHNhbWUgdmFsdWUgaXMgcmVwZWF0bHkgYWRkZWQgdGhhdAorICogbm8gYWNjdW11bGF0aW9uIG9mIHJvdW5kaW5nIGVycm9ycyBvY2N1cnMuCisgKgorICogQHBhcmFtIHRzIElucHV0IHRpbWVzdGFtcAorICogQHBhcmFtIHRzX3RiIElucHV0IHRpbWVzdGFtcCB0aW1lYmFzZQorICogQHBhcmFtIGluYyB2YWx1ZSB0byBhZGQgdG8gdHMKKyAqIEBwYXJhbSBpbmNfdGIgaW5jIHRpbWViYXNlCisgKi8KK2ludDY0X3QgYXZfYWRkX3N0YWJsZShBVlJhdGlvbmFsIHRzX3RiLCBpbnQ2NF90IHRzLCBBVlJhdGlvbmFsIGluY190YiwgaW50NjRfdCBpbmMpOworCisKKyAgICAvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9NQVRIRU1BVElDU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL21kNS5jIGIvZmZtcGVnL2xpYmF2dXRpbC9tZDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzZiZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9tZDUuYwpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIChtaWNoYWVsbmlAZ214LmF0KQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgYnkgQ2hyaXN0b3BoZXIgUi4gSGVydGVsIChjcmhAdWJpcXgubW4ub3JnKQorICoKKyAqIFJlZmVyZW5jZXM6CisgKiAgSUVURiBSRkMgMTMyMTogVGhlIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0KKyAqICAgICAgIFJvbiBSaXZlc3QuIElFVEYsIEFwcmlsLCAxOTkyCisgKgorICogYmFzZWQgb24gaHR0cDovL3ViaXF4Lm9yZy9saWJjaWZzL3NvdXJjZS9BdXRoL01ENS5jCisgKiAgICAgICAgICBmcm9tIENocmlzdG9waGVyIFIuIEhlcnRlbCAoY3JoQHViaXF4Lm1uLm9yZykKKyAqIFNpbXBsaWZpZWQsIGNsZWFuZWQgYW5kIElNTyByZWR1bmRhbnQgY29tbWVudHMgcmVtb3ZlZCBieSBtaWNoYWVsLgorICoKKyAqIElmIHlvdSB1c2UgZ2NjLCB0aGVuIHZlcnNpb24gNC4xIG9yIGxhdGVyIGFuZCAtZm9taXQtZnJhbWUtcG9pbnRlciBpcworICogc3Ryb25nbHkgcmVjb21tZW5kZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJic3dhcC5oIgorI2luY2x1ZGUgImludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgIm1kNS5oIgorI2luY2x1ZGUgIm1lbS5oIgorCit0eXBlZGVmIHN0cnVjdCBBVk1ENXsKKyAgICB1aW50NjRfdCBsZW47CisgICAgdWludDhfdCAgYmxvY2tbNjRdOworICAgIHVpbnQzMl90IEFCQ0RbNF07Cit9IEFWTUQ1OworCitjb25zdCBpbnQgYXZfbWQ1X3NpemUgPSBzaXplb2YoQVZNRDUpOworCitzdHJ1Y3QgQVZNRDUgKmF2X21kNV9hbGxvYyh2b2lkKQoreworICAgIHJldHVybiBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3QgQVZNRDUpKTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgU1s0XVs0XSA9IHsKKyAgICB7IDcsIDEyLCAxNywgMjIgfSwgIC8qIHJvdW5kIDEgKi8KKyAgICB7IDUsICA5LCAxNCwgMjAgfSwgIC8qIHJvdW5kIDIgKi8KKyAgICB7IDQsIDExLCAxNiwgMjMgfSwgIC8qIHJvdW5kIDMgKi8KKyAgICB7IDYsIDEwLCAxNSwgMjEgfSAgIC8qIHJvdW5kIDQgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBUWzY0XSA9IHsgLy8gVFtpXT0gZmFicyhzaW4oaSsxKTw8MzIpCisgICAgMHhkNzZhYTQ3OCwgMHhlOGM3Yjc1NiwgMHgyNDIwNzBkYiwgMHhjMWJkY2VlZSwgICAvKiByb3VuZCAxICovCisgICAgMHhmNTdjMGZhZiwgMHg0Nzg3YzYyYSwgMHhhODMwNDYxMywgMHhmZDQ2OTUwMSwKKyAgICAweDY5ODA5OGQ4LCAweDhiNDRmN2FmLCAweGZmZmY1YmIxLCAweDg5NWNkN2JlLAorICAgIDB4NmI5MDExMjIsIDB4ZmQ5ODcxOTMsIDB4YTY3OTQzOGUsIDB4NDliNDA4MjEsCisKKyAgICAweGY2MWUyNTYyLCAweGMwNDBiMzQwLCAweDI2NWU1YTUxLCAweGU5YjZjN2FhLCAgIC8qIHJvdW5kIDIgKi8KKyAgICAweGQ2MmYxMDVkLCAweDAyNDQxNDUzLCAweGQ4YTFlNjgxLCAweGU3ZDNmYmM4LAorICAgIDB4MjFlMWNkZTYsIDB4YzMzNzA3ZDYsIDB4ZjRkNTBkODcsIDB4NDU1YTE0ZWQsCisgICAgMHhhOWUzZTkwNSwgMHhmY2VmYTNmOCwgMHg2NzZmMDJkOSwgMHg4ZDJhNGM4YSwKKworICAgIDB4ZmZmYTM5NDIsIDB4ODc3MWY2ODEsIDB4NmQ5ZDYxMjIsIDB4ZmRlNTM4MGMsICAgLyogcm91bmQgMyAqLworICAgIDB4YTRiZWVhNDQsIDB4NGJkZWNmYTksIDB4ZjZiYjRiNjAsIDB4YmViZmJjNzAsCisgICAgMHgyODliN2VjNiwgMHhlYWExMjdmYSwgMHhkNGVmMzA4NSwgMHgwNDg4MWQwNSwKKyAgICAweGQ5ZDRkMDM5LCAweGU2ZGI5OWU1LCAweDFmYTI3Y2Y4LCAweGM0YWM1NjY1LAorCisgICAgMHhmNDI5MjI0NCwgMHg0MzJhZmY5NywgMHhhYjk0MjNhNywgMHhmYzkzYTAzOSwgICAvKiByb3VuZCA0ICovCisgICAgMHg2NTViNTljMywgMHg4ZjBjY2M5MiwgMHhmZmVmZjQ3ZCwgMHg4NTg0NWRkMSwKKyAgICAweDZmYTg3ZTRmLCAweGZlMmNlNmUwLCAweGEzMDE0MzE0LCAweDRlMDgxMWExLAorICAgIDB4Zjc1MzdlODIsIDB4YmQzYWYyMzUsIDB4MmFkN2QyYmIsIDB4ZWI4NmQzOTEsCit9OworCisjZGVmaW5lIENPUkUoaSwgYSwgYiwgYywgZCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQgPSBTW2kgPj4gNF1baSAmIDNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgKz0gVFtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpIDwgMzIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoaSA8IDE2KSBhICs9IChkIF4gKGIgJiAoYyBeIGQpKSkgICsgWFsgICAgICAgaSAgJiAxNV07ICBcCisgICAgICAgICAgICBlbHNlICAgICAgICBhICs9ICgoZCAmIGIpIHwgKH5kICYgYykpICsgWFsoMSArIDUqaSkgJiAxNV07ICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoaSA8IDQ4KSBhICs9IChiIF4gYyBeIGQpICAgICAgICAgICsgWFsoNSArIDMqaSkgJiAxNV07ICBcCisgICAgICAgICAgICBlbHNlICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICAgICAgICsgWFsoICAgIDcqaSkgJiAxNV07ICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGEgPSBiICsgKGEgPDwgdCB8IGEgPj4gKDMyIC0gdCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgYm9keSh1aW50MzJfdCBBQkNEWzRdLCB1aW50MzJfdCAqc3JjLCBpbnQgbmJsb2NrcykKK3sKKyAgICBpbnQgaSBhdl91bnVzZWQ7CisgICAgaW50IG47CisgICAgdWludDMyX3QgYSwgYiwgYywgZCwgdCwgKlg7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbmJsb2NrczsgbisrKSB7CisgICAgICAgIGEgPSBBQkNEWzNdOworICAgICAgICBiID0gQUJDRFsyXTsKKyAgICAgICAgYyA9IEFCQ0RbMV07CisgICAgICAgIGQgPSBBQkNEWzBdOworCisgICAgICAgIFggPSBzcmMgKyBuICogMTY7CisKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIFhbaV0gPSBhdl9ic3dhcDMyKFhbaV0pOworI2VuZGlmCisKKyNpZiBDT05GSUdfU01BTEwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIENPUkUoaSwgYSwgYiwgYywgZCk7CisgICAgICAgICAgICB0ID0gZDsKKyAgICAgICAgICAgIGQgPSBjOworICAgICAgICAgICAgYyA9IGI7CisgICAgICAgICAgICBiID0gYTsKKyAgICAgICAgICAgIGEgPSB0OworICAgICAgICB9CisjZWxzZQorI2RlZmluZSBDT1JFMihpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDT1JFKCBpLCAgIGEsYixjLGQpOyBDT1JFKChpKzEpLGQsYSxiLGMpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDT1JFKChpKzIpLGMsZCxhLGIpOyBDT1JFKChpKzMpLGIsYyxkLGEpCisjZGVmaW5lIENPUkU0KGkpIENPUkUyKGkpOyBDT1JFMigoaSs0KSk7IENPUkUyKChpKzgpKTsgQ09SRTIoKGkrMTIpKQorICAgICAgICBDT1JFNCgwKTsgQ09SRTQoMTYpOyBDT1JFNCgzMik7IENPUkU0KDQ4KTsKKyNlbmRpZgorCisgICAgICAgIEFCQ0RbMF0gKz0gZDsKKyAgICAgICAgQUJDRFsxXSArPSBjOworICAgICAgICBBQkNEWzJdICs9IGI7CisgICAgICAgIEFCQ0RbM10gKz0gYTsKKyAgICB9Cit9CisKK3ZvaWQgYXZfbWQ1X2luaXQoQVZNRDUgKmN0eCkKK3sKKyAgICBjdHgtPmxlbiAgICAgPSAwOworCisgICAgY3R4LT5BQkNEWzBdID0gMHgxMDMyNTQ3NjsKKyAgICBjdHgtPkFCQ0RbMV0gPSAweDk4YmFkY2ZlOworICAgIGN0eC0+QUJDRFsyXSA9IDB4ZWZjZGFiODk7CisgICAgY3R4LT5BQkNEWzNdID0gMHg2NzQ1MjMwMTsKK30KKwordm9pZCBhdl9tZDVfdXBkYXRlKEFWTUQ1ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbikKK3sKKyAgICBjb25zdCB1aW50OF90ICplbmQ7CisgICAgaW50IGo7CisKKyAgICBqID0gY3R4LT5sZW4gJiA2MzsKKyAgICBjdHgtPmxlbiArPSBsZW47CisKKyAgICBpZiAoaikgeworICAgICAgICBpbnQgY250ID0gRkZNSU4obGVuLCA2NCAtIGopOworICAgICAgICBtZW1jcHkoY3R4LT5ibG9jayArIGosIHNyYywgY250KTsKKyAgICAgICAgc3JjICs9IGNudDsKKyAgICAgICAgbGVuIC09IGNudDsKKyAgICAgICAgaWYgKGogKyBjbnQgPCA2NCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgYm9keShjdHgtPkFCQ0QsICh1aW50MzJfdCAqKWN0eC0+YmxvY2ssIDEpOworICAgIH0KKworICAgIGVuZCA9IHNyYyArIChsZW4gJiB+NjMpOworICAgIGlmIChIQVZFX0JJR0VORElBTiB8fCAoIUhBVkVfRkFTVF9VTkFMSUdORUQgJiYgKChpbnRwdHJfdClzcmMgJiAzKSkpIHsKKyAgICAgICB3aGlsZSAoc3JjIDwgZW5kKSB7CisgICAgICAgICAgIG1lbWNweShjdHgtPmJsb2NrLCBzcmMsIDY0KTsKKyAgICAgICAgICAgYm9keShjdHgtPkFCQ0QsICh1aW50MzJfdCAqKSBjdHgtPmJsb2NrLCAxKTsKKyAgICAgICAgICAgc3JjICs9IDY0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IG5ibG9ja3MgPSBsZW4gLyA2NDsKKyAgICAgICAgYm9keShjdHgtPkFCQ0QsICh1aW50MzJfdCAqKXNyYywgbmJsb2Nrcyk7CisgICAgICAgIHNyYyA9IGVuZDsKKyAgICB9CisgICAgbGVuICY9IDYzOworICAgIGlmIChsZW4gPiAwKQorICAgICAgICBtZW1jcHkoY3R4LT5ibG9jaywgc3JjLCBsZW4pOworfQorCit2b2lkIGF2X21kNV9maW5hbChBVk1ENSAqY3R4LCB1aW50OF90ICpkc3QpCit7CisgICAgaW50IGk7CisgICAgdWludDY0X3QgZmluYWxjb3VudCA9IGF2X2xlMm5lNjQoY3R4LT5sZW4gPDwgMyk7CisKKyAgICBhdl9tZDVfdXBkYXRlKGN0eCwgIlwyMDAiLCAxKTsKKyAgICB3aGlsZSAoKGN0eC0+bGVuICYgNjMpICE9IDU2KQorICAgICAgICBhdl9tZDVfdXBkYXRlKGN0eCwgIiIsIDEpOworCisgICAgYXZfbWQ1X3VwZGF0ZShjdHgsICh1aW50OF90ICopJmZpbmFsY291bnQsIDgpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgQVZfV0wzMihkc3QgKyA0KmksIGN0eC0+QUJDRFszIC0gaV0pOworfQorCit2b2lkIGF2X21kNV9zdW0odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IGludCBsZW4pCit7CisgICAgQVZNRDUgY3R4OworCisgICAgYXZfbWQ1X2luaXQoJmN0eCk7CisgICAgYXZfbWQ1X3VwZGF0ZSgmY3R4LCBzcmMsIGxlbik7CisgICAgYXZfbWQ1X2ZpbmFsKCZjdHgsIGRzdCk7Cit9CisKKyNpZmRlZiBURVNUCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIHZvaWQgcHJpbnRfbWQ1KHVpbnQ4X3QgKm1kNSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgcHJpbnRmKCIlMDJ4IiwgbWQ1W2ldKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKK2ludCBtYWluKHZvaWQpeworICAgIHVpbnQ4X3QgbWQ1dmFsWzE2XTsKKyAgICBpbnQgaTsKKyAgICB2b2xhdGlsZSB1aW50OF90IGluWzEwMDBdOyAvLyB2b2xhdGlsZSB0byB3b3JrYXJvdW5kIGh0dHA6Ly9sbHZtLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDg0OQorICAgIC8vIEZJWE1FIHJlbW92ZSB2b2xhdGlsZSBvbmNlIGl0IGhhcyBiZWVuIGZpeGVkIGFuZCBhbGwgZmF0ZSBjbGllbnRzIGFyZSB1cGRhdGVkCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgICAgICBpbltpXSA9IGkgKiBpOworICAgIGF2X21kNV9zdW0obWQ1dmFsLCBpbiwgMTAwMCk7IHByaW50X21kNShtZDV2YWwpOworICAgIGF2X21kNV9zdW0obWQ1dmFsLCBpbiwgICA2Myk7IHByaW50X21kNShtZDV2YWwpOworICAgIGF2X21kNV9zdW0obWQ1dmFsLCBpbiwgICA2NCk7IHByaW50X21kNShtZDV2YWwpOworICAgIGF2X21kNV9zdW0obWQ1dmFsLCBpbiwgICA2NSk7IHByaW50X21kNShtZDV2YWwpOworICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisgICAgICAgIGluW2ldID0gaSAlIDEyNzsKKyAgICBhdl9tZDVfc3VtKG1kNXZhbCwgaW4sICA5OTkpOyBwcmludF9tZDUobWQ1dmFsKTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL21kNS5oIGIvZmZtcGVnL2xpYmF2dXRpbC9tZDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTcwMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9tZDUuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX01ENV9ICisjZGVmaW5lIEFWVVRJTF9NRDVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisvKioKKyAqIEBkZWZncm91cCBsYXZ1X21kNSBNRDUKKyAqIEBpbmdyb3VwIGxhdnVfY3J5cHRvCisgKiBAeworICovCisKK2V4dGVybiBjb25zdCBpbnQgYXZfbWQ1X3NpemU7CisKK3N0cnVjdCBBVk1ENTsKKworLyoqCisgKiBBbGxvY2F0ZSBhbiBBVk1ENSBjb250ZXh0LgorICovCitzdHJ1Y3QgQVZNRDUgKmF2X21kNV9hbGxvYyh2b2lkKTsKKworLyoqCisgKiBJbml0aWFsaXplIE1ENSBoYXNoaW5nLgorICoKKyAqIEBwYXJhbSBjdHggcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gY29udGV4dCAob2Ygc2l6ZSBhdl9tZDVfc2l6ZSkKKyAqLwordm9pZCBhdl9tZDVfaW5pdChzdHJ1Y3QgQVZNRDUgKmN0eCk7CisKKy8qKgorICogVXBkYXRlIGhhc2ggdmFsdWUuCisgKgorICogQHBhcmFtIGN0eCBoYXNoIGZ1bmN0aW9uIGNvbnRleHQKKyAqIEBwYXJhbSBzcmMgaW5wdXQgZGF0YSB0byB1cGRhdGUgaGFzaCB3aXRoCisgKiBAcGFyYW0gbGVuIGlucHV0IGRhdGEgbGVuZ3RoCisgKi8KK3ZvaWQgYXZfbWQ1X3VwZGF0ZShzdHJ1Y3QgQVZNRDUgKmN0eCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgbGVuKTsKKworLyoqCisgKiBGaW5pc2ggaGFzaGluZyBhbmQgb3V0cHV0IGRpZ2VzdCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gY3R4IGhhc2ggZnVuY3Rpb24gY29udGV4dAorICogQHBhcmFtIGRzdCBidWZmZXIgd2hlcmUgb3V0cHV0IGRpZ2VzdCB2YWx1ZSBpcyBzdG9yZWQKKyAqLwordm9pZCBhdl9tZDVfZmluYWwoc3RydWN0IEFWTUQ1ICpjdHgsIHVpbnQ4X3QgKmRzdCk7CisKKy8qKgorICogSGFzaCBhbiBhcnJheSBvZiBkYXRhLgorICoKKyAqIEBwYXJhbSBkc3QgVGhlIG91dHB1dCBidWZmZXIgdG8gd3JpdGUgdGhlIGRpZ2VzdCBpbnRvCisgKiBAcGFyYW0gc3JjIFRoZSBkYXRhIHRvIGhhc2gKKyAqIEBwYXJhbSBsZW4gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSwgaW4gYnl0ZXMKKyAqLwordm9pZCBhdl9tZDVfc3VtKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCBpbnQgbGVuKTsKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBVlVUSUxfTUQ1X0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvbWVtLmMgYi9mZm1wZWcvbGliYXZ1dGlsL21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTgyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL21lbS5jCkBAIC0wLDAgKzEsNTA2IEBACisvKgorICogZGVmYXVsdCBtZW1vcnkgYWxsb2NhdG9yIGZvciBsaWJhdnV0aWwKKyAqIENvcHlyaWdodCAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogZGVmYXVsdCBtZW1vcnkgYWxsb2NhdG9yIGZvciBsaWJhdnV0aWwKKyAqLworCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNjAwCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfTUFMTE9DX0gKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdnV0aWwuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkeW5hcnJheS5oIgorI2luY2x1ZGUgImludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgIm1lbS5oIgorCisjaWZkZWYgTUFMTE9DX1BSRUZJWAorCisjZGVmaW5lIG1hbGxvYyAgICAgICAgIEFWX0pPSU4oTUFMTE9DX1BSRUZJWCwgbWFsbG9jKQorI2RlZmluZSBtZW1hbGlnbiAgICAgICBBVl9KT0lOKE1BTExPQ19QUkVGSVgsIG1lbWFsaWduKQorI2RlZmluZSBwb3NpeF9tZW1hbGlnbiBBVl9KT0lOKE1BTExPQ19QUkVGSVgsIHBvc2l4X21lbWFsaWduKQorI2RlZmluZSByZWFsbG9jICAgICAgICBBVl9KT0lOKE1BTExPQ19QUkVGSVgsIHJlYWxsb2MpCisjZGVmaW5lIGZyZWUgICAgICAgICAgIEFWX0pPSU4oTUFMTE9DX1BSRUZJWCwgZnJlZSkKKwordm9pZCAqbWFsbG9jKHNpemVfdCBzaXplKTsKK3ZvaWQgKm1lbWFsaWduKHNpemVfdCBhbGlnbiwgc2l6ZV90IHNpemUpOworaW50ICAgcG9zaXhfbWVtYWxpZ24odm9pZCAqKnB0ciwgc2l6ZV90IGFsaWduLCBzaXplX3Qgc2l6ZSk7Cit2b2lkICpyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOwordm9pZCAgZnJlZSh2b2lkICpwdHIpOworCisjZW5kaWYgLyogTUFMTE9DX1BSRUZJWCAqLworCisjZGVmaW5lIEFMSUdOIChIQVZFX0FWWCA/IDMyIDogMTYpCisKKy8qIE5PVEU6IGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZXNlIGZ1bmN0aW9ucyB3aXRoIHlvdXIgb3duCisgKiBpbXBsZW1lbnRhdGlvbnMgKG5vdCByZWNvbW1lbmRlZCkgeW91IGhhdmUgdG8gbGluayBsaWJhdiogYXMKKyAqIGR5bmFtaWMgbGlicmFyaWVzIGFuZCByZW1vdmUgLVdsLC1Cc3ltYm9saWMgZnJvbSB0aGUgbGlua2VyIGZsYWdzLgorICogTm90ZSB0aGF0IHRoaXMgd2lsbCBjb3N0IHBlcmZvcm1hbmNlLiAqLworCitzdGF0aWMgc2l6ZV90IG1heF9hbGxvY19zaXplPSBJTlRfTUFYOworCit2b2lkIGF2X21heF9hbGxvYyhzaXplX3QgbWF4KXsKKyAgICBtYXhfYWxsb2Nfc2l6ZSA9IG1heDsKK30KKwordm9pZCAqYXZfbWFsbG9jKHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnB0ciA9IE5VTEw7CisjaWYgQ09ORklHX01FTUFMSUdOX0hBQ0sKKyAgICBsb25nIGRpZmY7CisjZW5kaWYKKworICAgIC8qIGxldCdzIGRpc2FsbG93IHBvc3NpYmx5IGFtYmlndW91cyBjYXNlcyAqLworICAgIGlmIChzaXplID4gKG1heF9hbGxvY19zaXplIC0gMzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworI2lmIENPTkZJR19NRU1BTElHTl9IQUNLCisgICAgcHRyID0gbWFsbG9jKHNpemUgKyBBTElHTik7CisgICAgaWYgKCFwdHIpCisgICAgICAgIHJldHVybiBwdHI7CisgICAgZGlmZiAgICAgICAgICAgICAgPSAoKH4obG9uZylwdHIpJihBTElHTiAtIDEpKSArIDE7CisgICAgcHRyICAgICAgICAgICAgICAgPSAoY2hhciAqKXB0ciArIGRpZmY7CisgICAgKChjaGFyICopcHRyKVstMV0gPSBkaWZmOworI2VsaWYgSEFWRV9QT1NJWF9NRU1BTElHTgorICAgIGlmIChzaXplKSAvL09TIFggb24gU0RLIDEwLjYgaGFzIGEgYnJva2VuIHBvc2l4X21lbWFsaWduIGltcGxlbWVudGF0aW9uCisgICAgaWYgKHBvc2l4X21lbWFsaWduKCZwdHIsIEFMSUdOLCBzaXplKSkKKyAgICAgICAgcHRyID0gTlVMTDsKKyNlbGlmIEhBVkVfQUxJR05FRF9NQUxMT0MKKyAgICBwdHIgPSBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgQUxJR04pOworI2VsaWYgSEFWRV9NRU1BTElHTgorI2lmbmRlZiBfX0RKR1BQX18KKyAgICBwdHIgPSBtZW1hbGlnbihBTElHTiwgc2l6ZSk7CisjZWxzZQorICAgIHB0ciA9IG1lbWFsaWduKHNpemUsIEFMSUdOKTsKKyNlbmRpZgorICAgIC8qIFdoeSA2ND8KKyAgICAgKiBJbmRlZWQsIHdlIHNob3VsZCBhbGlnbiBpdDoKKyAgICAgKiAgIG9uICA0IGZvciAzODYKKyAgICAgKiAgIG9uIDE2IGZvciA0ODYKKyAgICAgKiAgIG9uIDMyIGZvciA1ODYsIFBQcm8gLSBLNi1JSUkKKyAgICAgKiAgIG9uIDY0IGZvciBLNyAobWF5YmUgZm9yIFAzIHRvbykuCisgICAgICogQmVjYXVzZSBMMSBhbmQgTDIgY2FjaGVzIGFyZSBhbGlnbmVkIG9uIHRob3NlIHZhbHVlcy4KKyAgICAgKiBCdXQgSSBkb24ndCB3YW50IHRvIGNvZGUgc3VjaCBsb2dpYyBoZXJlIQorICAgICAqLworICAgIC8qIFdoeSAzMj8KKyAgICAgKiBGb3IgQVZYIEFTTS4gU1NFIC8gTkVPTiBuZWVkcyBvbmx5IDE2LgorICAgICAqIFdoeSBub3QgbGFyZ2VyPyBCZWNhdXNlIEkgZGlkIG5vdCBzZWUgYSBkaWZmZXJlbmNlIGluIGJlbmNobWFya3MgLi4uCisgICAgICovCisgICAgLyogYmVuY2htYXJrcyB3aXRoIFAzCisgICAgICogbWVtYWxpZ24oNjQpICsgMSAgICAgICAgICAzMDcxLCAzMDUxLCAzMDMyCisgICAgICogbWVtYWxpZ24oNjQpICsgMiAgICAgICAgICAzMDUxLCAzMDMyLCAzMDQxCisgICAgICogbWVtYWxpZ24oNjQpICsgNCAgICAgICAgICAyOTExLCAyODk2LCAyOTE1CisgICAgICogbWVtYWxpZ24oNjQpICsgOCAgICAgICAgICAyNTQ1LCAyNTU0LCAyNTUwCisgICAgICogbWVtYWxpZ24oNjQpICsgMTYgICAgICAgICAyNTQzLCAyNTcyLCAyNTYzCisgICAgICogbWVtYWxpZ24oNjQpICsgMzIgICAgICAgICAyNTQ2LCAyNTQ1LCAyNTcxCisgICAgICogbWVtYWxpZ24oNjQpICsgNjQgICAgICAgICAyNTcwLCAyNTMzLCAyNTU4CisgICAgICoKKyAgICAgKiBCVFcsIG1hbGxvYyBzZWVtcyB0byBkbyA4LWJ5dGUgYWxpZ25tZW50IGJ5IGRlZmF1bHQgaGVyZS4KKyAgICAgKi8KKyNlbHNlCisgICAgcHRyID0gbWFsbG9jKHNpemUpOworI2VuZGlmCisgICAgaWYoIXB0ciAmJiAhc2l6ZSkgeworICAgICAgICBzaXplID0gMTsKKyAgICAgICAgcHRyPSBhdl9tYWxsb2MoMSk7CisgICAgfQorI2lmIENPTkZJR19NRU1PUllfUE9JU09OSU5HCisgICAgaWYgKHB0cikKKyAgICAgICAgbWVtc2V0KHB0ciwgRkZfTUVNT1JZX1BPSVNPTiwgc2l6ZSk7CisjZW5kaWYKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkICphdl9yZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisjaWYgQ09ORklHX01FTUFMSUdOX0hBQ0sKKyAgICBpbnQgZGlmZjsKKyNlbmRpZgorCisgICAgLyogbGV0J3MgZGlzYWxsb3cgcG9zc2libHkgYW1iaWd1b3VzIGNhc2VzICovCisgICAgaWYgKHNpemUgPiAobWF4X2FsbG9jX3NpemUgLSAzMikpCisgICAgICAgIHJldHVybiBOVUxMOworCisjaWYgQ09ORklHX01FTUFMSUdOX0hBQ0sKKyAgICAvL0ZJWE1FIHRoaXMgaXNuJ3QgYWxpZ25lZCBjb3JyZWN0bHksIHRob3VnaCBpdCBwcm9iYWJseSBpc24ndCBuZWVkZWQKKyAgICBpZiAoIXB0cikKKyAgICAgICAgcmV0dXJuIGF2X21hbGxvYyhzaXplKTsKKyAgICBkaWZmID0gKChjaGFyICopcHRyKVstMV07CisgICAgYXZfYXNzZXJ0MChkaWZmPjAgJiYgZGlmZjw9QUxJR04pOworICAgIHB0ciA9IHJlYWxsb2MoKGNoYXIgKilwdHIgLSBkaWZmLCBzaXplICsgZGlmZik7CisgICAgaWYgKHB0cikKKyAgICAgICAgcHRyID0gKGNoYXIgKilwdHIgKyBkaWZmOworICAgIHJldHVybiBwdHI7CisjZWxpZiBIQVZFX0FMSUdORURfTUFMTE9DCisgICAgcmV0dXJuIF9hbGlnbmVkX3JlYWxsb2MocHRyLCBzaXplICsgIXNpemUsIEFMSUdOKTsKKyNlbHNlCisgICAgcmV0dXJuIHJlYWxsb2MocHRyLCBzaXplICsgIXNpemUpOworI2VuZGlmCit9CisKK3ZvaWQgKmF2X3JlYWxsb2NfZih2b2lkICpwdHIsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKK3sKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICB2b2lkICpyOworCisgICAgaWYgKGF2X3NpemVfbXVsdChlbHNpemUsIG5lbGVtLCAmc2l6ZSkpIHsKKyAgICAgICAgYXZfZnJlZShwdHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgciA9IGF2X3JlYWxsb2MocHRyLCBzaXplKTsKKyAgICBpZiAoIXIgJiYgc2l6ZSkKKyAgICAgICAgYXZfZnJlZShwdHIpOworICAgIHJldHVybiByOworfQorCitpbnQgYXZfcmVhbGxvY3Aodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB2b2lkICoqcHRycHRyID0gcHRyOworICAgIHZvaWQgKnJldDsKKworICAgIGlmICghc2l6ZSkgeworICAgICAgICBhdl9mcmVlcChwdHIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0ID0gYXZfcmVhbGxvYygqcHRycHRyLCBzaXplKTsKKworICAgIGlmICghcmV0KSB7CisgICAgICAgIGF2X2ZyZWVwKHB0cik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgKnB0cnB0ciA9IHJldDsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCAqYXZfcmVhbGxvY19hcnJheSh2b2lkICpwdHIsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpCit7CisgICAgaWYgKCFzaXplIHx8IG5tZW1iID49IElOVF9NQVggLyBzaXplKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gYXZfcmVhbGxvYyhwdHIsIG5tZW1iICogc2l6ZSk7Cit9CisKK2ludCBhdl9yZWFsbG9jcF9hcnJheSh2b2lkICpwdHIsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqKnB0cnB0ciA9IHB0cjsKKyAgICAqcHRycHRyID0gYXZfcmVhbGxvY19mKCpwdHJwdHIsIG5tZW1iLCBzaXplKTsKKyAgICBpZiAoISpwdHJwdHIgJiYgbm1lbWIgJiYgc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBhdl9mcmVlKHZvaWQgKnB0cikKK3sKKyNpZiBDT05GSUdfTUVNQUxJR05fSEFDSworICAgIGlmIChwdHIpIHsKKyAgICAgICAgaW50IHY9ICgoY2hhciAqKXB0cilbLTFdOworICAgICAgICBhdl9hc3NlcnQwKHY+MCAmJiB2PD1BTElHTik7CisgICAgICAgIGZyZWUoKGNoYXIgKilwdHIgLSB2KTsKKyAgICB9CisjZWxpZiBIQVZFX0FMSUdORURfTUFMTE9DCisgICAgX2FsaWduZWRfZnJlZShwdHIpOworI2Vsc2UKKyAgICBmcmVlKHB0cik7CisjZW5kaWYKK30KKwordm9pZCBhdl9mcmVlcCh2b2lkICphcmcpCit7CisgICAgdm9pZCAqKnB0ciA9ICh2b2lkICoqKWFyZzsKKyAgICBhdl9mcmVlKCpwdHIpOworICAgICpwdHIgPSBOVUxMOworfQorCit2b2lkICphdl9tYWxsb2N6KHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnB0ciA9IGF2X21hbGxvYyhzaXplKTsKKyAgICBpZiAocHRyKQorICAgICAgICBtZW1zZXQocHRyLCAwLCBzaXplKTsKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkICphdl9jYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA8PSAwIHx8IG5tZW1iID49IElOVF9NQVggLyBzaXplKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gYXZfbWFsbG9jeihubWVtYiAqIHNpemUpOworfQorCitjaGFyICphdl9zdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKyAgICBjaGFyICpwdHIgPSBOVUxMOworICAgIGlmIChzKSB7CisgICAgICAgIGludCBsZW4gPSBzdHJsZW4ocykgKyAxOworICAgICAgICBwdHIgPSBhdl9yZWFsbG9jKE5VTEwsIGxlbik7CisgICAgICAgIGlmIChwdHIpCisgICAgICAgICAgICBtZW1jcHkocHRyLCBzLCBsZW4pOworICAgIH0KKyAgICByZXR1cm4gcHRyOworfQorCitjaGFyICphdl9zdHJuZHVwKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pCit7CisgICAgY2hhciAqcmV0ID0gTlVMTCwgKmVuZDsKKworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBlbmQgPSBtZW1jaHIocywgMCwgbGVuKTsKKyAgICBpZiAoZW5kKQorICAgICAgICBsZW4gPSBlbmQgLSBzOworCisgICAgcmV0ID0gYXZfcmVhbGxvYyhOVUxMLCBsZW4gKyAxKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBtZW1jcHkocmV0LCBzLCBsZW4pOworICAgIHJldFtsZW5dID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkICphdl9tZW1kdXAoY29uc3Qgdm9pZCAqcCwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqcHRyID0gTlVMTDsKKyAgICBpZiAocCkgeworICAgICAgICBwdHIgPSBhdl9tYWxsb2Moc2l6ZSk7CisgICAgICAgIGlmIChwdHIpCisgICAgICAgICAgICBtZW1jcHkocHRyLCBwLCBzaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKK30KKworaW50IGF2X2R5bmFycmF5X2FkZF9ub2ZyZWUodm9pZCAqdGFiX3B0ciwgaW50ICpuYl9wdHIsIHZvaWQgKmVsZW0pCit7CisgICAgdm9pZCAqKnRhYiA9ICoodm9pZCAqKiopdGFiX3B0cjsKKworICAgIEFWX0RZTkFSUkFZX0FERChJTlRfTUFYLCBzaXplb2YoKnRhYiksIHRhYiwgKm5iX3B0ciwgeworICAgICAgICB0YWJbKm5iX3B0cl0gPSBlbGVtOworICAgICAgICAqKHZvaWQgKioqKXRhYl9wdHIgPSB0YWI7CisgICAgfSwgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0pOworICAgIHJldHVybiAwOworfQorCit2b2lkIGF2X2R5bmFycmF5X2FkZCh2b2lkICp0YWJfcHRyLCBpbnQgKm5iX3B0ciwgdm9pZCAqZWxlbSkKK3sKKyAgICB2b2lkICoqdGFiID0gKih2b2lkICoqKil0YWJfcHRyOworCisgICAgQVZfRFlOQVJSQVlfQUREKElOVF9NQVgsIHNpemVvZigqdGFiKSwgdGFiLCAqbmJfcHRyLCB7CisgICAgICAgIHRhYlsqbmJfcHRyXSA9IGVsZW07CisgICAgICAgICoodm9pZCAqKiopdGFiX3B0ciA9IHRhYjsKKyAgICB9LCB7CisgICAgICAgICpuYl9wdHIgPSAwOworICAgICAgICBhdl9mcmVlcCh0YWJfcHRyKTsKKyAgICB9KTsKK30KKwordm9pZCAqYXZfZHluYXJyYXkyX2FkZCh2b2lkICoqdGFiX3B0ciwgaW50ICpuYl9wdHIsIHNpemVfdCBlbGVtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVsZW1fZGF0YSkKK3sKKyAgICB1aW50OF90ICp0YWJfZWxlbV9kYXRhID0gTlVMTDsKKworICAgIEFWX0RZTkFSUkFZX0FERChJTlRfTUFYLCBlbGVtX3NpemUsICp0YWJfcHRyLCAqbmJfcHRyLCB7CisgICAgICAgIHRhYl9lbGVtX2RhdGEgPSAodWludDhfdCAqKSp0YWJfcHRyICsgKCpuYl9wdHIpICogZWxlbV9zaXplOworICAgICAgICBpZiAoZWxlbV9kYXRhKQorICAgICAgICAgICAgbWVtY3B5KHRhYl9lbGVtX2RhdGEsIGVsZW1fZGF0YSwgZWxlbV9zaXplKTsKKyAgICAgICAgZWxzZSBpZiAoQ09ORklHX01FTU9SWV9QT0lTT05JTkcpCisgICAgICAgICAgICBtZW1zZXQodGFiX2VsZW1fZGF0YSwgRkZfTUVNT1JZX1BPSVNPTiwgZWxlbV9zaXplKTsKKyAgICB9LCB7CisgICAgICAgIGF2X2ZyZWVwKHRhYl9wdHIpOworICAgICAgICAqbmJfcHRyID0gMDsKKyAgICB9KTsKKyAgICByZXR1cm4gdGFiX2VsZW1fZGF0YTsKK30KKworc3RhdGljIHZvaWQgZmlsbDE2KHVpbnQ4X3QgKmRzdCwgaW50IGxlbikKK3sKKyAgICB1aW50MzJfdCB2ID0gQVZfUk4xNihkc3QgLSAyKTsKKworICAgIHYgfD0gdiA8PCAxNjsKKworICAgIHdoaWxlIChsZW4gPj0gNCkgeworICAgICAgICBBVl9XTjMyKGRzdCwgdik7CisgICAgICAgIGRzdCArPSA0OworICAgICAgICBsZW4gLT0gNDsKKyAgICB9CisKKyAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICAgKmRzdCA9IGRzdFstMl07CisgICAgICAgIGRzdCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsbDI0KHVpbnQ4X3QgKmRzdCwgaW50IGxlbikKK3sKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIHVpbnQzMl90IHYgPSBBVl9SQjI0KGRzdCAtIDMpOworICAgIHVpbnQzMl90IGEgPSB2IDw8IDggIHwgdiA+PiAxNjsKKyAgICB1aW50MzJfdCBiID0gdiA8PCAxNiB8IHYgPj4gODsKKyAgICB1aW50MzJfdCBjID0gdiA8PCAyNCB8IHY7CisjZWxzZQorICAgIHVpbnQzMl90IHYgPSBBVl9STDI0KGRzdCAtIDMpOworICAgIHVpbnQzMl90IGEgPSB2ICAgICAgIHwgdiA8PCAyNDsKKyAgICB1aW50MzJfdCBiID0gdiA+PiA4ICB8IHYgPDwgMTY7CisgICAgdWludDMyX3QgYyA9IHYgPj4gMTYgfCB2IDw8IDg7CisjZW5kaWYKKworICAgIHdoaWxlIChsZW4gPj0gMTIpIHsKKyAgICAgICAgQVZfV04zMihkc3QsICAgICBhKTsKKyAgICAgICAgQVZfV04zMihkc3QgKyA0LCBiKTsKKyAgICAgICAgQVZfV04zMihkc3QgKyA4LCBjKTsKKyAgICAgICAgZHN0ICs9IDEyOworICAgICAgICBsZW4gLT0gMTI7CisgICAgfQorCisgICAgaWYgKGxlbiA+PSA0KSB7CisgICAgICAgIEFWX1dOMzIoZHN0LCBhKTsKKyAgICAgICAgZHN0ICs9IDQ7CisgICAgICAgIGxlbiAtPSA0OworICAgIH0KKworICAgIGlmIChsZW4gPj0gNCkgeworICAgICAgICBBVl9XTjMyKGRzdCwgYik7CisgICAgICAgIGRzdCArPSA0OworICAgICAgICBsZW4gLT0gNDsKKyAgICB9CisKKyAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICAgKmRzdCA9IGRzdFstM107CisgICAgICAgIGRzdCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsbDMyKHVpbnQ4X3QgKmRzdCwgaW50IGxlbikKK3sKKyAgICB1aW50MzJfdCB2ID0gQVZfUk4zMihkc3QgLSA0KTsKKworICAgIHdoaWxlIChsZW4gPj0gNCkgeworICAgICAgICBBVl9XTjMyKGRzdCwgdik7CisgICAgICAgIGRzdCArPSA0OworICAgICAgICBsZW4gLT0gNDsKKyAgICB9CisKKyAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICAgKmRzdCA9IGRzdFstNF07CisgICAgICAgIGRzdCsrOworICAgIH0KK30KKwordm9pZCBhdl9tZW1jcHlfYmFja3B0cih1aW50OF90ICpkc3QsIGludCBiYWNrLCBpbnQgY250KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9ICZkc3RbLWJhY2tdOworICAgIGlmICghYmFjaykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGJhY2sgPT0gMSkgeworICAgICAgICBtZW1zZXQoZHN0LCAqc3JjLCBjbnQpOworICAgIH0gZWxzZSBpZiAoYmFjayA9PSAyKSB7CisgICAgICAgIGZpbGwxNihkc3QsIGNudCk7CisgICAgfSBlbHNlIGlmIChiYWNrID09IDMpIHsKKyAgICAgICAgZmlsbDI0KGRzdCwgY250KTsKKyAgICB9IGVsc2UgaWYgKGJhY2sgPT0gNCkgeworICAgICAgICBmaWxsMzIoZHN0LCBjbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjbnQgPj0gMTYpIHsKKyAgICAgICAgICAgIGludCBibG9ja2xlbiA9IGJhY2s7CisgICAgICAgICAgICB3aGlsZSAoY250ID4gYmxvY2tsZW4pIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGJsb2NrbGVuKTsKKyAgICAgICAgICAgICAgICBkc3QgICAgICAgKz0gYmxvY2tsZW47CisgICAgICAgICAgICAgICAgY250ICAgICAgIC09IGJsb2NrbGVuOworICAgICAgICAgICAgICAgIGJsb2NrbGVuIDw8PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBjbnQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjbnQgPj0gOCkgeworICAgICAgICAgICAgQVZfQ09QWTMyVShkc3QsICAgICBzcmMpOworICAgICAgICAgICAgQVZfQ09QWTMyVShkc3QgKyA0LCBzcmMgKyA0KTsKKyAgICAgICAgICAgIHNyYyArPSA4OworICAgICAgICAgICAgZHN0ICs9IDg7CisgICAgICAgICAgICBjbnQgLT0gODsKKyAgICAgICAgfQorICAgICAgICBpZiAoY250ID49IDQpIHsKKyAgICAgICAgICAgIEFWX0NPUFkzMlUoZHN0LCBzcmMpOworICAgICAgICAgICAgc3JjICs9IDQ7CisgICAgICAgICAgICBkc3QgKz0gNDsKKyAgICAgICAgICAgIGNudCAtPSA0OworICAgICAgICB9CisgICAgICAgIGlmIChjbnQgPj0gMikgeworICAgICAgICAgICAgQVZfQ09QWTE2VShkc3QsIHNyYyk7CisgICAgICAgICAgICBzcmMgKz0gMjsKKyAgICAgICAgICAgIGRzdCArPSAyOworICAgICAgICAgICAgY250IC09IDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNudCkKKyAgICAgICAgICAgICpkc3QgPSAqc3JjOworICAgIH0KK30KKwordm9pZCAqYXZfZmFzdF9yZWFsbG9jKHZvaWQgKnB0ciwgdW5zaWduZWQgaW50ICpzaXplLCBzaXplX3QgbWluX3NpemUpCit7CisgICAgaWYgKG1pbl9zaXplIDwgKnNpemUpCisgICAgICAgIHJldHVybiBwdHI7CisKKyAgICBtaW5fc2l6ZSA9IEZGTUFYKDE3ICogbWluX3NpemUgLyAxNiArIDMyLCBtaW5fc2l6ZSk7CisKKyAgICBwdHIgPSBhdl9yZWFsbG9jKHB0ciwgbWluX3NpemUpOworICAgIC8qIHdlIGNvdWxkIHNldCB0aGlzIHRvIHRoZSB1bm1vZGlmaWVkIG1pbl9zaXplIGJ1dCB0aGlzIGlzIHNhZmVyCisgICAgICogaWYgdGhlIHVzZXIgbG9zdCB0aGUgcHRyIGFuZCB1c2VzIE5VTEwgbm93CisgICAgICovCisgICAgaWYgKCFwdHIpCisgICAgICAgIG1pbl9zaXplID0gMDsKKworICAgICpzaXplID0gbWluX3NpemU7CisKKyAgICByZXR1cm4gcHRyOworfQorCitzdGF0aWMgaW5saW5lIGludCBmZl9mYXN0X21hbGxvYyh2b2lkICpwdHIsIHVuc2lnbmVkIGludCAqc2l6ZSwgc2l6ZV90IG1pbl9zaXplLCBpbnQgemVyb19yZWFsbG9jKQoreworICAgIHZvaWQgKipwID0gcHRyOworICAgIGlmIChtaW5fc2l6ZSA8ICpzaXplKQorICAgICAgICByZXR1cm4gMDsKKyAgICBtaW5fc2l6ZSA9IEZGTUFYKDE3ICogbWluX3NpemUgLyAxNiArIDMyLCBtaW5fc2l6ZSk7CisgICAgYXZfZnJlZSgqcCk7CisgICAgKnAgPSB6ZXJvX3JlYWxsb2MgPyBhdl9tYWxsb2N6KG1pbl9zaXplKSA6IGF2X21hbGxvYyhtaW5fc2l6ZSk7CisgICAgaWYgKCEqcCkKKyAgICAgICAgbWluX3NpemUgPSAwOworICAgICpzaXplID0gbWluX3NpemU7CisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgYXZfZmFzdF9tYWxsb2Modm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgKnNpemUsIHNpemVfdCBtaW5fc2l6ZSkKK3sKKyAgICBmZl9mYXN0X21hbGxvYyhwdHIsIHNpemUsIG1pbl9zaXplLCAwKTsKK30KKwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9tZW0uaCBiL2ZmbXBlZy9saWJhdnV0aWwvbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExZTM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvbWVtLmgKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbWVtb3J5IGhhbmRsaW5nIGZ1bmN0aW9ucworICovCisKKyNpZm5kZWYgQVZVVElMX01FTV9ICisjZGVmaW5lIEFWVVRJTF9NRU1fSAorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJhdnV0aWwuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBsYXZ1X21lbQorICogQHsKKyAqLworCisKKyNpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmIF9fSU5URUxfQ09NUElMRVIgPCAxMTEwIHx8IGRlZmluZWQoX19TVU5QUk9fQykKKyAgICAjZGVmaW5lIERFQ0xBUkVfQUxJR05FRChuLHQsdikgICAgICB0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChuKSkpIHYKKyAgICAjZGVmaW5lIERFQ0xBUkVfQVNNX0NPTlNUKG4sdCx2KSAgICBjb25zdCB0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChuKSkpIHYKKyNlbGlmIGRlZmluZWQoX19USV9DT01QSUxFUl9WRVJTSU9OX18pCisgICAgI2RlZmluZSBERUNMQVJFX0FMSUdORUQobix0LHYpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVZfUFJBR01BKERBVEFfQUxJR04odixuKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0IF9fYXR0cmlidXRlX18oKGFsaWduZWQobikpKSB2CisgICAgI2RlZmluZSBERUNMQVJFX0FTTV9DT05TVChuLHQsdikgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVZfUFJBR01BKERBVEFfQUxJR04odixuKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgY29uc3QgdCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKG4pKSkgdgorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgICAjZGVmaW5lIERFQ0xBUkVfQUxJR05FRChuLHQsdikgICAgICB0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChuKSkpIHYKKyAgICAjZGVmaW5lIERFQ0xBUkVfQVNNX0NPTlNUKG4sdCx2KSAgICBzdGF0aWMgY29uc3QgdCBhdl91c2VkIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChuKSkpIHYKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgI2RlZmluZSBERUNMQVJFX0FMSUdORUQobix0LHYpICAgICAgX19kZWNsc3BlYyhhbGlnbihuKSkgdCB2CisgICAgI2RlZmluZSBERUNMQVJFX0FTTV9DT05TVChuLHQsdikgICAgX19kZWNsc3BlYyhhbGlnbihuKSkgc3RhdGljIGNvbnN0IHQgdgorI2Vsc2UKKyAgICAjZGVmaW5lIERFQ0xBUkVfQUxJR05FRChuLHQsdikgICAgICB0IHYKKyAgICAjZGVmaW5lIERFQ0xBUkVfQVNNX0NPTlNUKG4sdCx2KSAgICBzdGF0aWMgY29uc3QgdCB2CisjZW5kaWYKKworI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsMSkKKyAgICAjZGVmaW5lIGF2X21hbGxvY19hdHRyaWIgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpCisjZWxzZQorICAgICNkZWZpbmUgYXZfbWFsbG9jX2F0dHJpYgorI2VuZGlmCisKKyNpZiBBVl9HQ0NfVkVSU0lPTl9BVF9MRUFTVCg0LDMpCisgICAgI2RlZmluZSBhdl9hbGxvY19zaXplKC4uLikgX19hdHRyaWJ1dGVfXygoYWxsb2Nfc2l6ZShfX1ZBX0FSR1NfXykpKQorI2Vsc2UKKyAgICAjZGVmaW5lIGF2X2FsbG9jX3NpemUoLi4uKQorI2VuZGlmCisKKy8qKgorICogQWxsb2NhdGUgYSBibG9jayBvZiBzaXplIGJ5dGVzIHdpdGggYWxpZ25tZW50IHN1aXRhYmxlIGZvciBhbGwKKyAqIG1lbW9yeSBhY2Nlc3NlcyAoaW5jbHVkaW5nIHZlY3RvcnMgaWYgYXZhaWxhYmxlIG9uIHRoZSBDUFUpLgorICogQHBhcmFtIHNpemUgU2l6ZSBpbiBieXRlcyBmb3IgdGhlIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQuCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBibG9jaywgTlVMTCBpZiB0aGUgYmxvY2sgY2Fubm90CisgKiBiZSBhbGxvY2F0ZWQuCisgKiBAc2VlIGF2X21hbGxvY3ooKQorICovCit2b2lkICphdl9tYWxsb2Moc2l6ZV90IHNpemUpIGF2X21hbGxvY19hdHRyaWIgYXZfYWxsb2Nfc2l6ZSgxKTsKKworLyoqCisgKiBBbGxvY2F0ZSBhIGJsb2NrIG9mIHNpemUgKiBubWVtYiBieXRlcyB3aXRoIGF2X21hbGxvYygpLgorICogQHBhcmFtIG5tZW1iIE51bWJlciBvZiBlbGVtZW50cworICogQHBhcmFtIHNpemUgU2l6ZSBvZiB0aGUgc2luZ2xlIGVsZW1lbnQKKyAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGJsb2NrLCBOVUxMIGlmIHRoZSBibG9jayBjYW5ub3QKKyAqIGJlIGFsbG9jYXRlZC4KKyAqIEBzZWUgYXZfbWFsbG9jKCkKKyAqLworYXZfYWxsb2Nfc2l6ZSgxLCAyKSBzdGF0aWMgaW5saW5lIHZvaWQgKmF2X21hbGxvY19hcnJheShzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKQoreworICAgIGlmICghc2l6ZSB8fCBubWVtYiA+PSBJTlRfTUFYIC8gc2l6ZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGF2X21hbGxvYyhubWVtYiAqIHNpemUpOworfQorCisvKioKKyAqIEFsbG9jYXRlIG9yIHJlYWxsb2NhdGUgYSBibG9jayBvZiBtZW1vcnkuCisgKiBJZiBwdHIgaXMgTlVMTCBhbmQgc2l6ZSA+IDAsIGFsbG9jYXRlIGEgbmV3IGJsb2NrLiBJZgorICogc2l6ZSBpcyB6ZXJvLCBmcmVlIHRoZSBtZW1vcnkgYmxvY2sgcG9pbnRlZCB0byBieSBwdHIuCisgKiBAcGFyYW0gcHRyIFBvaW50ZXIgdG8gYSBtZW1vcnkgYmxvY2sgYWxyZWFkeSBhbGxvY2F0ZWQgd2l0aAorICogYXZfcmVhbGxvYygpIG9yIE5VTEwuCisgKiBAcGFyYW0gc2l6ZSBTaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgYmxvY2sgdG8gYmUgYWxsb2NhdGVkIG9yCisgKiByZWFsbG9jYXRlZC4KKyAqIEByZXR1cm4gUG9pbnRlciB0byBhIG5ld2x5LXJlYWxsb2NhdGVkIGJsb2NrIG9yIE5VTEwgaWYgdGhlIGJsb2NrCisgKiBjYW5ub3QgYmUgcmVhbGxvY2F0ZWQgb3IgdGhlIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZnJlZSB0aGUgbWVtb3J5IGJsb2NrLgorICogQHdhcm5pbmcgUG9pbnRlcnMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgYXZfbWFsbG9jKCkgZmFtaWx5IG9mIGZ1bmN0aW9ucyBtdXN0CisgKiAgICAgICAgICBub3QgYmUgcGFzc2VkIHRvIGF2X3JlYWxsb2MoKS4gVGhlIGZvcm1lciBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcKKyAqICAgICAgICAgIG1lbWFsaWduKCkgKG9yIG90aGVyIGZ1bmN0aW9ucyksIGFuZCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAorICogICAgICAgICAgcG9pbnRlcnMgZnJvbSBzdWNoIGZ1bmN0aW9ucyBjYW4gYmUgcGFzc2VkIHRvIHJlYWxsb2MoKSBhdCBhbGwuCisgKiAgICAgICAgICBUaGUgc2l0dWF0aW9uIGlzIHVuZGVmaW5lZCBhY2NvcmRpbmcgdG8gUE9TSVggYW5kIG1heSBjcmFzaCB3aXRoCisgKiAgICAgICAgICBzb21lIGxpYmMgaW1wbGVtZW50YXRpb25zLgorICogQHNlZSBhdl9mYXN0X3JlYWxsb2MoKQorICovCit2b2lkICphdl9yZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpIGF2X2FsbG9jX3NpemUoMik7CisKKy8qKgorICogQWxsb2NhdGUgb3IgcmVhbGxvY2F0ZSBhIGJsb2NrIG9mIG1lbW9yeS4KKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBhdl9yZWFsbG9jLCBleGNlcHQ6CisgKiAtIEl0IHRha2VzIHR3byBhcmd1bWVudHMgYW5kIGNoZWNrcyB0aGUgcmVzdWx0IG9mIHRoZSBtdWx0aXBsaWNhdGlvbiBmb3IKKyAqICAgaW50ZWdlciBvdmVyZmxvdy4KKyAqIC0gSXQgZnJlZXMgdGhlIGlucHV0IGJsb2NrIGluIGNhc2Ugb2YgZmFpbHVyZSwgdGh1cyBhdm9pZGluZyB0aGUgbWVtb3J5CisgKiAgIGxlYWsgd2l0aCB0aGUgY2xhc3NpYyAiYnVmID0gcmVhbGxvYyhidWYpOyBpZiAoIWJ1ZikgcmV0dXJuIC0xOyIuCisgKi8KK3ZvaWQgKmF2X3JlYWxsb2NfZih2b2lkICpwdHIsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSk7CisKKy8qKgorICogQWxsb2NhdGUgb3IgcmVhbGxvY2F0ZSBhIGJsb2NrIG9mIG1lbW9yeS4KKyAqIElmICpwdHIgaXMgTlVMTCBhbmQgc2l6ZSA+IDAsIGFsbG9jYXRlIGEgbmV3IGJsb2NrLiBJZgorICogc2l6ZSBpcyB6ZXJvLCBmcmVlIHRoZSBtZW1vcnkgYmxvY2sgcG9pbnRlZCB0byBieSBwdHIuCisgKiBAcGFyYW0gICBwdHIgUG9pbnRlciB0byBhIHBvaW50ZXIgdG8gYSBtZW1vcnkgYmxvY2sgYWxyZWFkeSBhbGxvY2F0ZWQKKyAqICAgICAgICAgIHdpdGggYXZfcmVhbGxvYygpLCBvciBwb2ludGVyIHRvIGEgcG9pbnRlciB0byBOVUxMLgorICogICAgICAgICAgVGhlIHBvaW50ZXIgaXMgdXBkYXRlZCBvbiBzdWNjZXNzLCBvciBmcmVlZCBvbiBmYWlsdXJlLgorICogQHBhcmFtICAgc2l6ZSBTaXplIGluIGJ5dGVzIGZvciB0aGUgbWVtb3J5IGJsb2NrIHRvIGJlIGFsbG9jYXRlZCBvcgorICogICAgICAgICAgcmVhbGxvY2F0ZWQKKyAqIEByZXR1cm4gIFplcm8gb24gc3VjY2VzcywgYW4gQVZFUlJPUiBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKiBAd2FybmluZyBQb2ludGVycyBvcmlnaW5hdGluZyBmcm9tIHRoZSBhdl9tYWxsb2MoKSBmYW1pbHkgb2YgZnVuY3Rpb25zIG11c3QKKyAqICAgICAgICAgIG5vdCBiZSBwYXNzZWQgdG8gYXZfcmVhbGxvY3AoKS4gVGhlIGZvcm1lciBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcKKyAqICAgICAgICAgIG1lbWFsaWduKCkgKG9yIG90aGVyIGZ1bmN0aW9ucyksIGFuZCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAorICogICAgICAgICAgcG9pbnRlcnMgZnJvbSBzdWNoIGZ1bmN0aW9ucyBjYW4gYmUgcGFzc2VkIHRvIHJlYWxsb2MoKSBhdCBhbGwuCisgKiAgICAgICAgICBUaGUgc2l0dWF0aW9uIGlzIHVuZGVmaW5lZCBhY2NvcmRpbmcgdG8gUE9TSVggYW5kIG1heSBjcmFzaCB3aXRoCisgKiAgICAgICAgICBzb21lIGxpYmMgaW1wbGVtZW50YXRpb25zLgorICovCitpbnQgYXZfcmVhbGxvY3Aodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKgorICogQWxsb2NhdGUgb3IgcmVhbGxvY2F0ZSBhbiBhcnJheS4KKyAqIElmIHB0ciBpcyBOVUxMIGFuZCBubWVtYiA+IDAsIGFsbG9jYXRlIGEgbmV3IGJsb2NrLiBJZgorICogbm1lbWIgaXMgemVybywgZnJlZSB0aGUgbWVtb3J5IGJsb2NrIHBvaW50ZWQgdG8gYnkgcHRyLgorICogQHBhcmFtIHB0ciBQb2ludGVyIHRvIGEgbWVtb3J5IGJsb2NrIGFscmVhZHkgYWxsb2NhdGVkIHdpdGgKKyAqIGF2X3JlYWxsb2MoKSBvciBOVUxMLgorICogQHBhcmFtIG5tZW1iIE51bWJlciBvZiBlbGVtZW50cworICogQHBhcmFtIHNpemUgU2l6ZSBvZiB0aGUgc2luZ2xlIGVsZW1lbnQKKyAqIEByZXR1cm4gUG9pbnRlciB0byBhIG5ld2x5LXJlYWxsb2NhdGVkIGJsb2NrIG9yIE5VTEwgaWYgdGhlIGJsb2NrCisgKiBjYW5ub3QgYmUgcmVhbGxvY2F0ZWQgb3IgdGhlIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZnJlZSB0aGUgbWVtb3J5IGJsb2NrLgorICogQHdhcm5pbmcgUG9pbnRlcnMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgYXZfbWFsbG9jKCkgZmFtaWx5IG9mIGZ1bmN0aW9ucyBtdXN0CisgKiAgICAgICAgICBub3QgYmUgcGFzc2VkIHRvIGF2X3JlYWxsb2MoKS4gVGhlIGZvcm1lciBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcKKyAqICAgICAgICAgIG1lbWFsaWduKCkgKG9yIG90aGVyIGZ1bmN0aW9ucyksIGFuZCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAorICogICAgICAgICAgcG9pbnRlcnMgZnJvbSBzdWNoIGZ1bmN0aW9ucyBjYW4gYmUgcGFzc2VkIHRvIHJlYWxsb2MoKSBhdCBhbGwuCisgKiAgICAgICAgICBUaGUgc2l0dWF0aW9uIGlzIHVuZGVmaW5lZCBhY2NvcmRpbmcgdG8gUE9TSVggYW5kIG1heSBjcmFzaCB3aXRoCisgKiAgICAgICAgICBzb21lIGxpYmMgaW1wbGVtZW50YXRpb25zLgorICovCithdl9hbGxvY19zaXplKDIsIDMpIHZvaWQgKmF2X3JlYWxsb2NfYXJyYXkodm9pZCAqcHRyLCBzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBBbGxvY2F0ZSBvciByZWFsbG9jYXRlIGFuIGFycmF5IHRocm91Z2ggYSBwb2ludGVyIHRvIGEgcG9pbnRlci4KKyAqIElmICpwdHIgaXMgTlVMTCBhbmQgbm1lbWIgPiAwLCBhbGxvY2F0ZSBhIG5ldyBibG9jay4gSWYKKyAqIG5tZW1iIGlzIHplcm8sIGZyZWUgdGhlIG1lbW9yeSBibG9jayBwb2ludGVkIHRvIGJ5IHB0ci4KKyAqIEBwYXJhbSBwdHIgUG9pbnRlciB0byBhIHBvaW50ZXIgdG8gYSBtZW1vcnkgYmxvY2sgYWxyZWFkeSBhbGxvY2F0ZWQKKyAqIHdpdGggYXZfcmVhbGxvYygpLCBvciBwb2ludGVyIHRvIGEgcG9pbnRlciB0byBOVUxMLgorICogVGhlIHBvaW50ZXIgaXMgdXBkYXRlZCBvbiBzdWNjZXNzLCBvciBmcmVlZCBvbiBmYWlsdXJlLgorICogQHBhcmFtIG5tZW1iIE51bWJlciBvZiBlbGVtZW50cworICogQHBhcmFtIHNpemUgU2l6ZSBvZiB0aGUgc2luZ2xlIGVsZW1lbnQKKyAqIEByZXR1cm4gWmVybyBvbiBzdWNjZXNzLCBhbiBBVkVSUk9SIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqIEB3YXJuaW5nIFBvaW50ZXJzIG9yaWdpbmF0aW5nIGZyb20gdGhlIGF2X21hbGxvYygpIGZhbWlseSBvZiBmdW5jdGlvbnMgbXVzdAorICogICAgICAgICAgbm90IGJlIHBhc3NlZCB0byBhdl9yZWFsbG9jKCkuIFRoZSBmb3JtZXIgY2FuIGJlIGltcGxlbWVudGVkIHVzaW5nCisgKiAgICAgICAgICBtZW1hbGlnbigpIChvciBvdGhlciBmdW5jdGlvbnMpLCBhbmQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQKKyAqICAgICAgICAgIHBvaW50ZXJzIGZyb20gc3VjaCBmdW5jdGlvbnMgY2FuIGJlIHBhc3NlZCB0byByZWFsbG9jKCkgYXQgYWxsLgorICogICAgICAgICAgVGhlIHNpdHVhdGlvbiBpcyB1bmRlZmluZWQgYWNjb3JkaW5nIHRvIFBPU0lYIGFuZCBtYXkgY3Jhc2ggd2l0aAorICogICAgICAgICAgc29tZSBsaWJjIGltcGxlbWVudGF0aW9ucy4KKyAqLworYXZfYWxsb2Nfc2l6ZSgyLCAzKSBpbnQgYXZfcmVhbGxvY3BfYXJyYXkodm9pZCAqcHRyLCBzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBGcmVlIGEgbWVtb3J5IGJsb2NrIHdoaWNoIGhhcyBiZWVuIGFsbG9jYXRlZCB3aXRoIGF2X21hbGxvYyh6KSgpIG9yCisgKiBhdl9yZWFsbG9jKCkuCisgKiBAcGFyYW0gcHRyIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBibG9jayB3aGljaCBzaG91bGQgYmUgZnJlZWQuCisgKiBAbm90ZSBwdHIgPSBOVUxMIGlzIGV4cGxpY2l0bHkgYWxsb3dlZC4KKyAqIEBub3RlIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSBhdl9mcmVlcCgpIGluc3RlYWQuCisgKiBAc2VlIGF2X2ZyZWVwKCkKKyAqLwordm9pZCBhdl9mcmVlKHZvaWQgKnB0cik7CisKKy8qKgorICogQWxsb2NhdGUgYSBibG9jayBvZiBzaXplIGJ5dGVzIHdpdGggYWxpZ25tZW50IHN1aXRhYmxlIGZvciBhbGwKKyAqIG1lbW9yeSBhY2Nlc3NlcyAoaW5jbHVkaW5nIHZlY3RvcnMgaWYgYXZhaWxhYmxlIG9uIHRoZSBDUFUpIGFuZAorICogemVybyBhbGwgdGhlIGJ5dGVzIG9mIHRoZSBibG9jay4KKyAqIEBwYXJhbSBzaXplIFNpemUgaW4gYnl0ZXMgZm9yIHRoZSBtZW1vcnkgYmxvY2sgdG8gYmUgYWxsb2NhdGVkLgorICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgYmxvY2ssIE5VTEwgaWYgaXQgY2Fubm90IGJlIGFsbG9jYXRlZC4KKyAqIEBzZWUgYXZfbWFsbG9jKCkKKyAqLwordm9pZCAqYXZfbWFsbG9jeihzaXplX3Qgc2l6ZSkgYXZfbWFsbG9jX2F0dHJpYiBhdl9hbGxvY19zaXplKDEpOworCisvKioKKyAqIEFsbG9jYXRlIGEgYmxvY2sgb2Ygbm1lbWIgKiBzaXplIGJ5dGVzIHdpdGggYWxpZ25tZW50IHN1aXRhYmxlIGZvciBhbGwKKyAqIG1lbW9yeSBhY2Nlc3NlcyAoaW5jbHVkaW5nIHZlY3RvcnMgaWYgYXZhaWxhYmxlIG9uIHRoZSBDUFUpIGFuZAorICogemVybyBhbGwgdGhlIGJ5dGVzIG9mIHRoZSBibG9jay4KKyAqIFRoZSBhbGxvY2F0aW9uIHdpbGwgZmFpbCBpZiBubWVtYiAqIHNpemUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgKiB0byBJTlRfTUFYLgorICogQHBhcmFtIG5tZW1iCisgKiBAcGFyYW0gc2l6ZQorICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgYmxvY2ssIE5VTEwgaWYgaXQgY2Fubm90IGJlIGFsbG9jYXRlZC4KKyAqLwordm9pZCAqYXZfY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpIGF2X21hbGxvY19hdHRyaWI7CisKKy8qKgorICogQWxsb2NhdGUgYSBibG9jayBvZiBzaXplICogbm1lbWIgYnl0ZXMgd2l0aCBhdl9tYWxsb2N6KCkuCisgKiBAcGFyYW0gbm1lbWIgTnVtYmVyIG9mIGVsZW1lbnRzCisgKiBAcGFyYW0gc2l6ZSBTaXplIG9mIHRoZSBzaW5nbGUgZWxlbWVudAorICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgYmxvY2ssIE5VTEwgaWYgdGhlIGJsb2NrIGNhbm5vdAorICogYmUgYWxsb2NhdGVkLgorICogQHNlZSBhdl9tYWxsb2N6KCkKKyAqIEBzZWUgYXZfbWFsbG9jX2FycmF5KCkKKyAqLworYXZfYWxsb2Nfc2l6ZSgxLCAyKSBzdGF0aWMgaW5saW5lIHZvaWQgKmF2X21hbGxvY3pfYXJyYXkoc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBpZiAoIXNpemUgfHwgbm1lbWIgPj0gSU5UX01BWCAvIHNpemUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBhdl9tYWxsb2N6KG5tZW1iICogc2l6ZSk7Cit9CisKKy8qKgorICogRHVwbGljYXRlIHRoZSBzdHJpbmcgcy4KKyAqIEBwYXJhbSBzIHN0cmluZyB0byBiZSBkdXBsaWNhdGVkCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gYSBuZXdseS1hbGxvY2F0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgYQorICogY29weSBvZiBzIG9yIE5VTEwgaWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgYWxsb2NhdGVkLgorICovCitjaGFyICphdl9zdHJkdXAoY29uc3QgY2hhciAqcykgYXZfbWFsbG9jX2F0dHJpYjsKKworLyoqCisgKiBEdXBsaWNhdGUgYSBzdWJzdHJpbmcgb2YgdGhlIHN0cmluZyBzLgorICogQHBhcmFtIHMgc3RyaW5nIHRvIGJlIGR1cGxpY2F0ZWQKKyAqIEBwYXJhbSBsZW4gdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIChub3QgY291bnRpbmcgdGhlCisgKiAgICAgICAgICAgIHRlcm1pbmF0aW5nIGJ5dGUpLgorICogQHJldHVybiBQb2ludGVyIHRvIGEgbmV3bHktYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW5nIGEKKyAqIGNvcHkgb2YgcyBvciBOVUxMIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlIGFsbG9jYXRlZC4KKyAqLworY2hhciAqYXZfc3RybmR1cChjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKSBhdl9tYWxsb2NfYXR0cmliOworCisvKioKKyAqIER1cGxpY2F0ZSB0aGUgYnVmZmVyIHAuCisgKiBAcGFyYW0gcCBidWZmZXIgdG8gYmUgZHVwbGljYXRlZAorICogQHJldHVybiBQb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluaW5nIGEKKyAqIGNvcHkgb2YgcCBvciBOVUxMIGlmIHRoZSBidWZmZXIgY2Fubm90IGJlIGFsbG9jYXRlZC4KKyAqLwordm9pZCAqYXZfbWVtZHVwKGNvbnN0IHZvaWQgKnAsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBGcmVlIGEgbWVtb3J5IGJsb2NrIHdoaWNoIGhhcyBiZWVuIGFsbG9jYXRlZCB3aXRoIGF2X21hbGxvYyh6KSgpIG9yCisgKiBhdl9yZWFsbG9jKCkgYW5kIHNldCB0aGUgcG9pbnRlciBwb2ludGluZyB0byBpdCB0byBOVUxMLgorICogQHBhcmFtIHB0ciBQb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgYmxvY2sgd2hpY2ggc2hvdWxkCisgKiBiZSBmcmVlZC4KKyAqIEBub3RlIHBhc3NpbmcgYSBwb2ludGVyIHRvIGEgTlVMTCBwb2ludGVyIGlzIHNhZmUgYW5kIGxlYWRzIHRvIG5vIGFjdGlvbi4KKyAqIEBzZWUgYXZfZnJlZSgpCisgKi8KK3ZvaWQgYXZfZnJlZXAodm9pZCAqcHRyKTsKKworLyoqCisgKiBBZGQgYW4gZWxlbWVudCB0byBhIGR5bmFtaWMgYXJyYXkuCisgKgorICogVGhlIGFycmF5IHRvIGdyb3cgaXMgc3VwcG9zZWQgdG8gYmUgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8KKyAqIHN0cnVjdHVyZXMsIGFuZCB0aGUgZWxlbWVudCB0byBhZGQgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYW4gYWxyZWFkeQorICogYWxsb2NhdGVkIHN0cnVjdHVyZS4KKyAqCisgKiBUaGUgYXJyYXkgaXMgcmVhbGxvY2F0ZWQgd2hlbiBpdHMgc2l6ZSByZWFjaGVzIHBvd2VycyBvZiAyLgorICogVGhlcmVmb3JlLCB0aGUgYW1vcnRpemVkIGNvc3Qgb2YgYWRkaW5nIGFuIGVsZW1lbnQgaXMgY29uc3RhbnQuCisgKgorICogSW4gY2FzZSBvZiBzdWNjZXNzLCB0aGUgcG9pbnRlciB0byB0aGUgYXJyYXkgaXMgdXBkYXRlZCBpbiBvcmRlciB0bworICogcG9pbnQgdG8gdGhlIG5ldyBncm93biBhcnJheSwgYW5kIHRoZSBudW1iZXIgcG9pbnRlZCB0byBieSBuYl9wdHIKKyAqIGlzIGluY3JlbWVudGVkLgorICogSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgYXJyYXkgaXMgZnJlZWQsICp0YWJfcHRyIGlzIHNldCB0byBOVUxMIGFuZAorICogKm5iX3B0ciBpcyBzZXQgdG8gMC4KKyAqCisgKiBAcGFyYW0gdGFiX3B0ciBwb2ludGVyIHRvIHRoZSBhcnJheSB0byBncm93CisgKiBAcGFyYW0gbmJfcHRyICBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5CisgKiBAcGFyYW0gZWxlbSAgICBlbGVtZW50IHRvIGFkZAorICogQHNlZSBhdl9keW5hcnJheV9hZGRfbm9mcmVlKCksIGF2X2R5bmFycmF5Ml9hZGQoKQorICovCit2b2lkIGF2X2R5bmFycmF5X2FkZCh2b2lkICp0YWJfcHRyLCBpbnQgKm5iX3B0ciwgdm9pZCAqZWxlbSk7CisKKy8qKgorICogQWRkIGFuIGVsZW1lbnQgdG8gYSBkeW5hbWljIGFycmF5LgorICoKKyAqIEZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGF2X2R5bmFycmF5X2FkZCgpLAorICogYnV0IGl0IGRvZXNuJ3QgZnJlZSBtZW1vcnkgb24gZmFpbHMuIEl0IHJldHVybnMgZXJyb3IgY29kZQorICogaW5zdGVhZCBhbmQgbGVhdmUgY3VycmVudCBidWZmZXIgdW50b3VjaGVkLgorICoKKyAqIEBwYXJhbSB0YWJfcHRyIHBvaW50ZXIgdG8gdGhlIGFycmF5IHRvIGdyb3cKKyAqIEBwYXJhbSBuYl9wdHIgIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKKyAqIEBwYXJhbSBlbGVtICAgIGVsZW1lbnQgdG8gYWRkCisgKiBAcmV0dXJuID49MCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvdGhlcndpc2UuCisgKiBAc2VlIGF2X2R5bmFycmF5X2FkZCgpLCBhdl9keW5hcnJheTJfYWRkKCkKKyAqLworaW50IGF2X2R5bmFycmF5X2FkZF9ub2ZyZWUodm9pZCAqdGFiX3B0ciwgaW50ICpuYl9wdHIsIHZvaWQgKmVsZW0pOworCisvKioKKyAqIEFkZCBhbiBlbGVtZW50IG9mIHNpemUgZWxlbV9zaXplIHRvIGEgZHluYW1pYyBhcnJheS4KKyAqCisgKiBUaGUgYXJyYXkgaXMgcmVhbGxvY2F0ZWQgd2hlbiBpdHMgbnVtYmVyIG9mIGVsZW1lbnRzIHJlYWNoZXMgcG93ZXJzIG9mIDIuCisgKiBUaGVyZWZvcmUsIHRoZSBhbW9ydGl6ZWQgY29zdCBvZiBhZGRpbmcgYW4gZWxlbWVudCBpcyBjb25zdGFudC4KKyAqCisgKiBJbiBjYXNlIG9mIHN1Y2Nlc3MsIHRoZSBwb2ludGVyIHRvIHRoZSBhcnJheSBpcyB1cGRhdGVkIGluIG9yZGVyIHRvCisgKiBwb2ludCB0byB0aGUgbmV3IGdyb3duIGFycmF5LCBhbmQgdGhlIG51bWJlciBwb2ludGVkIHRvIGJ5IG5iX3B0cgorICogaXMgaW5jcmVtZW50ZWQuCisgKiBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSBhcnJheSBpcyBmcmVlZCwgKnRhYl9wdHIgaXMgc2V0IHRvIE5VTEwgYW5kCisgKiAqbmJfcHRyIGlzIHNldCB0byAwLgorICoKKyAqIEBwYXJhbSB0YWJfcHRyICAgcG9pbnRlciB0byB0aGUgYXJyYXkgdG8gZ3JvdworICogQHBhcmFtIG5iX3B0ciAgICBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5CisgKiBAcGFyYW0gZWxlbV9zaXplIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheQorICogQHBhcmFtIGVsZW1fZGF0YSBwb2ludGVyIHRvIHRoZSBkYXRhIG9mIHRoZSBlbGVtZW50IHRvIGFkZC4gSWYgTlVMTCwgdGhlIHNwYWNlIG9mCisgKiAgICAgICAgICAgICAgICAgIHRoZSBuZXcgYWRkZWQgZWxlbWVudCBpcyBub3QgZmlsbGVkLgorICogQHJldHVybiAgICAgICAgICBwb2ludGVyIHRvIHRoZSBkYXRhIG9mIHRoZSBlbGVtZW50IHRvIGNvcHkgaW4gdGhlIG5ldyBhbGxvY2F0ZWQgc3BhY2UuCisgKiAgICAgICAgICAgICAgICAgIElmIE5VTEwsIHRoZSBuZXcgYWxsb2NhdGVkIHNwYWNlIGlzIGxlZnQgdW5pbml0aWFsaXplZC4iCisgKiBAc2VlIGF2X2R5bmFycmF5X2FkZCgpLCBhdl9keW5hcnJheV9hZGRfbm9mcmVlKCkKKyAqLwordm9pZCAqYXZfZHluYXJyYXkyX2FkZCh2b2lkICoqdGFiX3B0ciwgaW50ICpuYl9wdHIsIHNpemVfdCBlbGVtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVsZW1fZGF0YSk7CisKKy8qKgorICogTXVsdGlwbHkgdHdvIHNpemVfdCB2YWx1ZXMgY2hlY2tpbmcgZm9yIG92ZXJmbG93LgorICogQHJldHVybiAgMCBpZiBzdWNjZXNzLCBBVkVSUk9SKEVJTlZBTCkgaWYgb3ZlcmZsb3cuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF2X3NpemVfbXVsdChzaXplX3QgYSwgc2l6ZV90IGIsIHNpemVfdCAqcikKK3sKKyAgICBzaXplX3QgdCA9IGEgKiBiOworICAgIC8qIEhhY2sgaW5zcGlyZWQgZnJvbSBnbGliYzogb25seSB0cnkgdGhlIGRpdmlzaW9uIGlmIG5lbGVtIGFuZCBlbHNpemUKKyAgICAgKiBhcmUgYm90aCBncmVhdGVyIHRoYW4gc3FydChTSVpFX01BWCkuICovCisgICAgaWYgKChhIHwgYikgPj0gKChzaXplX3QpMSA8PCAoc2l6ZW9mKHNpemVfdCkgKiA0KSkgJiYgYSAmJiB0IC8gYSAhPSBiKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICpyID0gdDsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSB0aGF0IG1heSBtZSBhbGxvY2F0ZWQgaW4gb25lIGJsb2NrLgorICovCit2b2lkIGF2X21heF9hbGxvYyhzaXplX3QgbWF4KTsKKworLyoqCisgKiBkZWxpYmVyYXRlbHkgb3ZlcmxhcHBpbmcgbWVtY3B5IGltcGxlbWVudGF0aW9uCisgKiBAcGFyYW0gZHN0IGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHBhcmFtIGJhY2sgaG93IG1hbnkgYnl0ZXMgYmFjayB3ZSBzdGFydCAodGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgb3ZlcmxhcHBpbmcgd2luZG93KSwgbXVzdCBiZSA+IDAKKyAqIEBwYXJhbSBjbnQgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHksIG11c3QgYmUgPj0gMAorICoKKyAqIGNudCA+IGJhY2sgaXMgdmFsaWQsIHRoaXMgd2lsbCBjb3B5IHRoZSBieXRlcyB3ZSBqdXN0IGNvcGllZCwKKyAqIHRodXMgY3JlYXRpbmcgYSByZXBlYXRpbmcgcGF0dGVybiB3aXRoIGEgcGVyaW9kIGxlbmd0aCBvZiBiYWNrLgorICovCit2b2lkIGF2X21lbWNweV9iYWNrcHRyKHVpbnQ4X3QgKmRzdCwgaW50IGJhY2ssIGludCBjbnQpOworCisvKioKKyAqIFJlYWxsb2NhdGUgdGhlIGdpdmVuIGJsb2NrIGlmIGl0IGlzIG5vdCBsYXJnZSBlbm91Z2gsIG90aGVyd2lzZSBkbyBub3RoaW5nLgorICoKKyAqIEBzZWUgYXZfcmVhbGxvYworICovCit2b2lkICphdl9mYXN0X3JlYWxsb2Modm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgKnNpemUsIHNpemVfdCBtaW5fc2l6ZSk7CisKKy8qKgorICogQWxsb2NhdGUgYSBidWZmZXIsIHJldXNpbmcgdGhlIGdpdmVuIG9uZSBpZiBsYXJnZSBlbm91Z2guCisgKgorICogQ29udHJhcnkgdG8gYXZfZmFzdF9yZWFsbG9jIHRoZSBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBtaWdodCBub3QgYmUKKyAqIHByZXNlcnZlZCBhbmQgb24gZXJyb3IgdGhlIG9sZCBidWZmZXIgaXMgZnJlZWQsIHRodXMgbm8gc3BlY2lhbAorICogaGFuZGxpbmcgdG8gYXZvaWQgbWVtbGVha3MgaXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSBwdHIgcG9pbnRlciB0byBwb2ludGVyIHRvIGFscmVhZHkgYWxsb2NhdGVkIGJ1ZmZlciwgb3ZlcndyaXR0ZW4gd2l0aCBwb2ludGVyIHRvIG5ldyBidWZmZXIKKyAqIEBwYXJhbSBzaXplIHNpemUgb2YgdGhlIGJ1ZmZlciAqcHRyIHBvaW50cyB0bworICogQHBhcmFtIG1pbl9zaXplIG1pbmltdW0gc2l6ZSBvZiAqcHRyIGJ1ZmZlciBhZnRlciByZXR1cm5pbmcsICpwdHIgd2lsbCBiZSBOVUxMIGFuZAorICogICAgICAgICAgICAgICAgICpzaXplIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK3ZvaWQgYXZfZmFzdF9tYWxsb2Modm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgKnNpemUsIHNpemVfdCBtaW5fc2l6ZSk7CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZVVElMX01FTV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL21pcHMvTWFrZWZpbGUgYi9mZm1wZWcvbGliYXZ1dGlsL21pcHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmYTVhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvbWlwcy9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitPQkpTICs9IG1pcHMvZmxvYXRfZHNwX21pcHMubwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9taXBzL2Zsb2F0X2RzcF9taXBzLmMgYi9mZm1wZWcvbGliYXZ1dGlsL21pcHMvZmxvYXRfZHNwX21pcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQ1MmRjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9taXBzL2Zsb2F0X2RzcF9taXBzLmMKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIKKyAqICAgICAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4sIENhbGlmb3JuaWEuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE1JUFMgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3I6ICBCcmFuaW1pciBWYXNpYyAoYnZhc2ljQG1pcHMuY29tKQorICogQXV0aG9yOiAgWm9yYW4gTHVraWMgKHpvcmFubEBtaXBzLmNvbSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUmVmZXJlbmNlOiBsaWJhdnV0aWwvZmxvYXRfZHNwLmMKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNICYmIEhBVkVfTUlQU0ZQVQorc3RhdGljIHZvaWQgdmVjdG9yX2ZtdWxfbWlwcyhmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgaW50IGk7CisKKyAgICBpZiAobGVuICYgMykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICBkc3RbaV0gPSBzcmMwW2ldICogc3JjMVtpXTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCAqZCAgICAgPSAoZmxvYXQgKilkc3Q7CisgICAgICAgIGZsb2F0ICpkX2VuZCA9IGQgKyBsZW47CisgICAgICAgIGZsb2F0ICpzMCAgICA9IChmbG9hdCAqKXNyYzA7CisgICAgICAgIGZsb2F0ICpzMSAgICA9IChmbG9hdCAqKXNyYzE7CisKKyAgICAgICAgZmxvYXQgc3JjMF8wLCBzcmMwXzEsIHNyYzBfMiwgc3JjMF8zOworICAgICAgICBmbG9hdCBzcmMxXzAsIHNyYzFfMSwgc3JjMV8yLCBzcmMxXzM7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbc3JjMF8wXSwgIDAoJVtzMF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbc3JjMV8wXSwgIDAoJVtzMV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbc3JjMF8xXSwgIDQoJVtzMF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbc3JjMV8xXSwgIDQoJVtzMV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbc3JjMF8yXSwgIDgoJVtzMF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbc3JjMV8yXSwgIDgoJVtzMV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbc3JjMF8zXSwgIDEyKCVbczBdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICVbc3JjMV8zXSwgIDEyKCVbczFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICVbc3JjMF8wXSwgICVbc3JjMF8wXSwgICVbc3JjMV8wXSAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICVbc3JjMF8xXSwgICVbc3JjMF8xXSwgICVbc3JjMV8xXSAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICVbc3JjMF8yXSwgICVbc3JjMF8yXSwgICVbc3JjMV8yXSAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICVbc3JjMF8zXSwgICVbc3JjMF8zXSwgICVbc3JjMV8zXSAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbc3JjMF8wXSwgIDAoJVtkXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbc3JjMF8xXSwgIDQoJVtkXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbc3JjMF8yXSwgIDgoJVtkXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICVbc3JjMF8zXSwgIDEyKCVbZF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICVbczBdLCAgICAgICVbczBdLCAgICAgIDE2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICVbczFdLCAgICAgICVbczFdLCAgICAgIDE2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICVbZF0sICAgICAgICVbZF0sICAgICAgIDE2ICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYm5lICAgICVbZF0sICAgICAgICVbZF9lbmRdLCAgIDFiICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW3NyYzBfMF0iPSZmIihzcmMwXzApLCBbc3JjMF8xXSI9JmYiKHNyYzBfMSksCisgICAgICAgICAgICAgIFtzcmMwXzJdIj0mZiIoc3JjMF8yKSwgW3NyYzBfM10iPSZmIihzcmMwXzMpLAorICAgICAgICAgICAgICBbc3JjMV8wXSI9JmYiKHNyYzFfMCksIFtzcmMxXzFdIj0mZiIoc3JjMV8xKSwKKyAgICAgICAgICAgICAgW3NyYzFfMl0iPSZmIihzcmMxXzIpLCBbc3JjMV8zXSI9JmYiKHNyYzFfMyksCisgICAgICAgICAgICAgIFtkXSIrciIoZCksIFtzMF0iK3IiKHMwKSwgW3MxXSIrciIoczEpCisgICAgICAgICAgICA6IFtkX2VuZF0iciIoZF9lbmQpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2ZWN0b3JfZm11bF9zY2FsYXJfbWlwcyhmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCBtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIGZsb2F0IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICAgIGZsb2F0ICpsb2NhbF9zcmMgPSAoZmxvYXQqKXNyYzsKKyAgICBmbG9hdCAqZW5kID0gbG9jYWxfc3JjICsgbGVuOworCisgICAgLyogbG9vcCB1bnJvbGxlZCA0IHRpbWVzICovCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIi5zZXQgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIi5zZXQgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wMF0sICAgMCglW3NyY10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wMV0sICAgNCglW3NyY10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wMl0sICAgOCglW3NyY10pICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgJVt0ZW1wM10sICAgMTIoJVtzcmNdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgMTYgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVttdWxdICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVttdWxdICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVttdWxdICAgXG5cdCIKKyAgICAgICAgIm11bC5zICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVttdWxdICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgMTYgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wMF0sICAgLTE2KCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wMV0sICAgLTEyKCVbZHN0XSkgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgJVt0ZW1wMl0sICAgLTgoJVtkc3RdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICAgJVtzcmNdLCAgICAgJVtlbmRdLCAgICAgMWIgICAgICAgXG5cdCIKKyAgICAgICAgIiBzd2MxICAgJVt0ZW1wM10sICAgLTQoJVtkc3RdKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIi5zZXQgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFt0ZW1wMF0iPSZmIih0ZW1wMCksIFt0ZW1wMV0iPSZmIih0ZW1wMSksCisgICAgICAgICAgW3RlbXAyXSI9JmYiKHRlbXAyKSwgW3RlbXAzXSI9JmYiKHRlbXAzKSwKKyAgICAgICAgICBbZHN0XSIrciIoZHN0KSwgW3NyY10iK3IiKGxvY2FsX3NyYykKKyAgICAgICAgOiBbZW5kXSJyIihlbmQpLCBbbXVsXSJmIihtdWwpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorCitzdGF0aWMgdm9pZCB2ZWN0b3JfZm11bF93aW5kb3dfbWlwcyhmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwKKyAgICAgICAgY29uc3QgZmxvYXQgKnNyYzEsIGNvbnN0IGZsb2F0ICp3aW4sIGludCBsZW4pCit7CisgICAgaW50IGksIGo7CisgICAgLyoKKyAgICAgKiB2YXJpYWJsZXMgdXNlZCBpbiBpbmxpbmUgYXNzZW1ibGVyCisgICAgICovCisgICAgZmxvYXQgKiBkc3RfaSwgKiBkc3RfaiwgKiBkc3RfaTIsICogZHN0X2oyOworICAgIGZsb2F0IHRlbXAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworCisgICAgZHN0ICArPSBsZW47CisgICAgd2luICArPSBsZW47CisgICAgc3JjMCArPSBsZW47CisKKyAgICBmb3IgKGkgPSAtbGVuLCBqID0gbGVuIC0gMTsgaSA8IDA7IGkgKz0gOCwgaiAtPSA4KSB7CisKKyAgICAgICAgZHN0X2kgPSBkc3QgKyBpOworICAgICAgICBkc3RfaiA9IGRzdCArIGo7CisKKyAgICAgICAgZHN0X2kyID0gZHN0ICsgaSArIDQ7CisgICAgICAgIGRzdF9qMiA9IGRzdCArIGogLSA0OworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wXSwgICAlW3MxXSwgICAgICAgJVt3aV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wMV0sICAlW3MxXSwgICAgICAgJVt3al0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wMl0sICAlW3MxMV0sICAgICAgJVt3aTFdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wM10sICAlW3MxMV0sICAgICAgJVt3ajFdICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAibXN1Yi5zICAlW3RlbXBdLCAgICVbdGVtcF0sICAgICAlW3MwXSwgICVbd2pdICAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW3MwXSwgICVbd2ldICAgIFxuXHQiCisgICAgICAgICAgICAibXN1Yi5zICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAlW3MwMV0sICVbd2oxXSAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW3MwMV0sICVbd2kxXSAgIFxuXHQiCisKKyAgICAgICAgICAgICJzd2MxICAgICVbdGVtcF0sICAgMCglW2RzdF9pXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgLyogZHN0W2ldID0gczAqd2ogLSBzMSp3aTsgKi8KKyAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDFdLCAgMCglW2RzdF9qXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgLyogZHN0W2pdID0gczAqd2kgKyBzMSp3ajsgKi8KKyAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDJdLCAgNCglW2RzdF9pXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgLyogZHN0W2krMV0gPSBzMDEqd2oxIC0gczExKndpMTsgKi8KKyAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDNdLCAtNCglW2RzdF9qXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgLyogZHN0W2otMV0gPSBzMDEqd2kxICsgczExKndqMTsgKi8KKworICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wNF0sICAlW3MxMl0sICAgICAgJVt3aTJdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wNV0sICAlW3MxMl0sICAgICAgJVt3ajJdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wNl0sICAlW3MxM10sICAgICAgJVt3aTNdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgJVt0ZW1wN10sICAlW3MxM10sICAgICAgJVt3ajNdICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAibXN1Yi5zICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICAlW3MwMl0sICVbd2oyXSAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgICAlW3MwMl0sICVbd2kyXSAgIFxuXHQiCisgICAgICAgICAgICAibXN1Yi5zICAlW3RlbXA2XSwgICVbdGVtcDZdLCAgICAlW3MwM10sICVbd2ozXSAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICAlW3RlbXA3XSwgICVbdGVtcDddLCAgICAlW3MwM10sICVbd2kzXSAgIFxuXHQiCisKKyAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDRdLCAgOCglW2RzdF9pXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgLyogZHN0W2krMl0gPSBzMDIqd2oyIC0gczEyKndpMjsgKi8KKyAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDVdLCAtOCglW2RzdF9qXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgLyogZHN0W2otMl0gPSBzMDIqd2kyICsgczEyKndqMjsgKi8KKyAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDZdLCAgMTIoJVtkc3RfaV0pICAgICAgICAgICAgICAgICAgXG5cdCIgLyogZHN0W2krMl0gPSBzMDMqd2ozIC0gczEzKndpMzsgKi8KKyAgICAgICAgICAgICJzd2MxICAgICVbdGVtcDddLCAtMTIoJVtkc3Rfal0pICAgICAgICAgICAgICAgICAgXG5cdCIgLyogZHN0W2otM10gPSBzMDMqd2kzICsgczEzKndqMzsgKi8KKyAgICAgICAgICAgIDogW3RlbXBdIj0mZiIodGVtcCksICBbdGVtcDFdIj0mZiIodGVtcDEpLCBbdGVtcDJdIj0mZiIodGVtcDIpLAorICAgICAgICAgICAgICBbdGVtcDNdIj0mZiIodGVtcDMpLCBbdGVtcDRdIj0mZiIodGVtcDQpLCBbdGVtcDVdIj0mZiIodGVtcDUpLAorICAgICAgICAgICAgICBbdGVtcDZdIj0mZiIodGVtcDYpLCBbdGVtcDddIj0mZiIodGVtcDcpCisgICAgICAgICAgICA6IFtkc3Rfal0iciIoZHN0X2opLCAgICAgW2RzdF9pXSJyIiAoZHN0X2kpLAorICAgICAgICAgICAgICBbczBdICJmIihzcmMwW2ldKSwgICAgIFt3al0gImYiKHdpbltqXSksICAgICBbczFdICJmIihzcmMxW2pdKSwKKyAgICAgICAgICAgICAgW3dpXSAiZiIod2luW2ldKSwgICAgICBbczAxXSJmIihzcmMwW2kgKyAxXSksW3dqMV0iZiIod2luW2ogLSAxXSksCisgICAgICAgICAgICAgIFtzMTFdImYiKHNyYzFbaiAtIDFdKSwgW3dpMV0iZiIod2luW2kgKyAxXSksIFtzMDJdImYiKHNyYzBbaSArIDJdKSwKKyAgICAgICAgICAgICAgW3dqMl0iZiIod2luW2ogLSAyXSksICBbczEyXSJmIihzcmMxW2ogLSAyXSksW3dpMl0iZiIod2luW2kgKyAyXSksCisgICAgICAgICAgICAgIFtzMDNdImYiKHNyYzBbaSArIDNdKSwgW3dqM10iZiIod2luW2ogLSAzXSksIFtzMTNdImYiKHNyYzFbaiAtIDNdKSwKKyAgICAgICAgICAgICAgW3dpM10iZiIod2luW2kgKyAzXSkKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKKworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICJtdWwucyAgJVt0ZW1wXSwgICAlW3MxXSwgICAgICAgJVt3aV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAlW3RlbXAxXSwgICVbczFdLCAgICAgICAlW3dqXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICVbdGVtcDJdLCAgJVtzMTFdLCAgICAgICVbd2kxXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgJVt0ZW1wM10sICAlW3MxMV0sICAgICAgJVt3ajFdICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAibXN1Yi5zICVbdGVtcF0sICAgJVt0ZW1wXSwgICAgICVbczBdLCAgJVt3al0gICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgJVtzMF0sICAlW3dpXSAgICBcblx0IgorICAgICAgICAgICAgIm1zdWIucyAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAlW3MwMV0sICVbd2oxXSAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICVbczAxXSwgJVt3aTFdICAgXG5cdCIKKworICAgICAgICAgICAgInN3YzEgICAlW3RlbXBdLCAgIDAoJVtkc3RfaTJdKSAgICAgICAgICAgICAgICAgIFxuXHQiIC8qIGRzdFtpXSA9IHMwKndqIC0gczEqd2k7ICovCisgICAgICAgICAgICAic3djMSAgICVbdGVtcDFdLCAgMCglW2RzdF9qMl0pICAgICAgICAgICAgICAgICAgXG5cdCIgLyogZHN0W2pdID0gczAqd2kgKyBzMSp3ajsgKi8KKyAgICAgICAgICAgICJzd2MxICAgJVt0ZW1wMl0sICA0KCVbZHN0X2kyXSkgICAgICAgICAgICAgICAgICBcblx0IiAvKiBkc3RbaSsxXSA9IHMwMSp3ajEgLSBzMTEqd2kxOyAqLworICAgICAgICAgICAgInN3YzEgICAlW3RlbXAzXSwgLTQoJVtkc3RfajJdKSAgICAgICAgICAgICAgICAgIFxuXHQiIC8qIGRzdFtqLTFdID0gczAxKndpMSArIHMxMSp3ajE7ICovCisKKyAgICAgICAgICAgICJtdWwucyAgJVt0ZW1wNF0sICAlW3MxMl0sICAgICAgJVt3aTJdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAlW3RlbXA1XSwgICVbczEyXSwgICAgICAlW3dqMl0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICVbdGVtcDZdLCAgJVtzMTNdLCAgICAgICVbd2kzXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgJVt0ZW1wN10sICAlW3MxM10sICAgICAgJVt3ajNdICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAibXN1Yi5zICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAgICVbczAyXSwgJVt3ajJdICAgXG5cdCIKKyAgICAgICAgICAgICJtYWRkLnMgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICAgJVtzMDJdLCAlW3dpMl0gICBcblx0IgorICAgICAgICAgICAgIm1zdWIucyAlW3RlbXA2XSwgICVbdGVtcDZdLCAgICAlW3MwM10sICVbd2ozXSAgIFxuXHQiCisgICAgICAgICAgICAibWFkZC5zICVbdGVtcDddLCAgJVt0ZW1wN10sICAgICVbczAzXSwgJVt3aTNdICAgXG5cdCIKKworICAgICAgICAgICAgInN3YzEgICAlW3RlbXA0XSwgIDgoJVtkc3RfaTJdKSAgICAgICAgICAgICAgICAgIFxuXHQiIC8qIGRzdFtpKzJdID0gczAyKndqMiAtIHMxMip3aTI7ICovCisgICAgICAgICAgICAic3djMSAgICVbdGVtcDVdLCAtOCglW2RzdF9qMl0pICAgICAgICAgICAgICAgICAgXG5cdCIgLyogZHN0W2otMl0gPSBzMDIqd2kyICsgczEyKndqMjsgKi8KKyAgICAgICAgICAgICJzd2MxICAgJVt0ZW1wNl0sICAxMiglW2RzdF9pMl0pICAgICAgICAgICAgICAgICBcblx0IiAvKiBkc3RbaSsyXSA9IHMwMyp3ajMgLSBzMTMqd2kzOyAqLworICAgICAgICAgICAgInN3YzEgICAlW3RlbXA3XSwgLTEyKCVbZHN0X2oyXSkgICAgICAgICAgICAgICAgIFxuXHQiIC8qIGRzdFtqLTNdID0gczAzKndpMyArIHMxMyp3ajM7ICovCisgICAgICAgICAgICA6IFt0ZW1wXSI9JmYiKHRlbXApLAorICAgICAgICAgICAgICBbdGVtcDFdIj0mZiIodGVtcDEpLCBbdGVtcDJdIj0mZiIodGVtcDIpLCBbdGVtcDNdIj0mZiIodGVtcDMpLAorICAgICAgICAgICAgICBbdGVtcDRdIj0mZiIodGVtcDQpLCBbdGVtcDVdIj0mZiIodGVtcDUpLCBbdGVtcDZdIj0mZiIodGVtcDYpLAorICAgICAgICAgICAgICBbdGVtcDddICAiPSZmIiAodGVtcDcpCisgICAgICAgICAgICA6IFtkc3RfajJdInIiKGRzdF9qMiksICAgW2RzdF9pMl0iciIoZHN0X2kyKSwKKyAgICAgICAgICAgICAgW3MwXSAiZiIoc3JjMFtpICsgNF0pLCBbd2pdICJmIih3aW5baiAtIDRdKSwgW3MxXSAiZiIoc3JjMVtqIC0gNF0pLAorICAgICAgICAgICAgICBbd2ldICJmIih3aW5baSArIDRdKSwgIFtzMDFdImYiKHNyYzBbaSArIDVdKSxbd2oxXSJmIih3aW5baiAtIDVdKSwKKyAgICAgICAgICAgICAgW3MxMV0iZiIoc3JjMVtqIC0gNV0pLCBbd2kxXSJmIih3aW5baSArIDVdKSwgW3MwMl0iZiIoc3JjMFtpICsgNl0pLAorICAgICAgICAgICAgICBbd2oyXSJmIih3aW5baiAtIDZdKSwgIFtzMTJdImYiKHNyYzFbaiAtIDZdKSxbd2kyXSJmIih3aW5baSArIDZdKSwKKyAgICAgICAgICAgICAgW3MwM10iZiIoc3JjMFtpICsgN10pLCBbd2ozXSJmIih3aW5baiAtIDddKSwgW3MxM10iZiIoc3JjMVtqIC0gN10pLAorICAgICAgICAgICAgICBbd2kzXSJmIih3aW5baSArIDddKQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYnV0dGVyZmxpZXNfZmxvYXRfbWlwcyhmbG9hdCAqYXZfcmVzdHJpY3QgdjEsIGZsb2F0ICphdl9yZXN0cmljdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKK3sKKyAgICBmbG9hdCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgICAgZmxvYXQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICAgIGZsb2F0IHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTU7CisgICAgaW50IHBvbTsKKyAgICBwb20gPSAobGVuID4+IDIpLTE7CisKKyAgICAvKiBsb29wIHVucm9sbGVkIDQgdGltZXMgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDBdLCAgICAwKCVbdjFdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDFdLCAgICA0KCVbdjFdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDJdLCAgICA4KCVbdjFdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDNdLCAgICAxMiglW3YxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDRdLCAgICAwKCVbdjJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDVdLCAgICA0KCVbdjJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDZdLCAgICA4KCVbdjJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDddLCAgICAxMiglW3YyXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJlcSAgICAgICVbcG9tXSwgICAgICAkemVybywgICAgICAgMmYgICAgICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICVbdGVtcDhdLCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICVbdGVtcDldLCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICVbdGVtcDEwXSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0gICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICVbdGVtcDExXSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0gICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICVbdGVtcDEyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNl0gICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICVbdGVtcDEzXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNl0gICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICVbdGVtcDE0XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wN10gICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICVbdGVtcDE1XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wN10gICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbdjFdLCAgICAgICAlW3YxXSwgICAgICAgMTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbdjJdLCAgICAgICAlW3YyXSwgICAgICAgMTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbcG9tXSwgICAgICAlW3BvbV0sICAgICAgLTEgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDBdLCAgICAwKCVbdjFdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDFdLCAgICA0KCVbdjFdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDJdLCAgICA4KCVbdjFdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDNdLCAgICAxMiglW3YxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDRdLCAgICAwKCVbdjJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDVdLCAgICA0KCVbdjJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDZdLCAgICA4KCVbdjJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3YzEgICAgICVbdGVtcDddLCAgICAxMiglW3YyXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDldLCAgICAtMTYoJVt2MV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDhdLCAgICAtMTYoJVt2Ml0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDExXSwgICAtMTIoJVt2MV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDEwXSwgICAtMTIoJVt2Ml0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDEzXSwgICAtOCglW3YxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDEyXSwgICAtOCglW3YyXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDE1XSwgICAtNCglW3YxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDE0XSwgICAtNCglW3YyXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJndHogICAgICVbcG9tXSwgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICVbdGVtcDhdLCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICVbdGVtcDldLCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICVbdGVtcDEwXSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0gICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICVbdGVtcDExXSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0gICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICVbdGVtcDEyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNl0gICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICVbdGVtcDEzXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNl0gICAgXG5cdCIKKyAgICAgICAgInN1Yi5zICAgICVbdGVtcDE0XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wN10gICAgXG5cdCIKKyAgICAgICAgImFkZC5zICAgICVbdGVtcDE1XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wN10gICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDldLCAgICAwKCVbdjFdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDhdLCAgICAwKCVbdjJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDExXSwgICA0KCVbdjFdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDEwXSwgICA0KCVbdjJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDEzXSwgICA4KCVbdjFdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDEyXSwgICA4KCVbdjJdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDE1XSwgICAxMiglW3YxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3YzEgICAgICVbdGVtcDE0XSwgICAxMiglW3YyXSkgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFt2MV0iK3IiKHYxKSwgW3YyXSIrciIodjIpLCBbcG9tXSIrciIocG9tKSwgW3RlbXAwXSAiPSZmIiAodGVtcDApLAorICAgICAgICAgIFt0ZW1wMV0iPSZmIih0ZW1wMSksIFt0ZW1wMl0iPSZmIih0ZW1wMiksIFt0ZW1wM10iPSZmIih0ZW1wMyksCisgICAgICAgICAgW3RlbXA0XSI9JmYiKHRlbXA0KSwgW3RlbXA1XSI9JmYiKHRlbXA1KSwgW3RlbXA2XSI9JmYiKHRlbXA2KSwKKyAgICAgICAgICBbdGVtcDddIj0mZiIodGVtcDcpLCBbdGVtcDhdIj0mZiIodGVtcDgpLCBbdGVtcDldIj0mZiIodGVtcDkpLAorICAgICAgICAgIFt0ZW1wMTBdIj0mZiIodGVtcDEwKSwgW3RlbXAxMV0iPSZmIih0ZW1wMTEpLCBbdGVtcDEyXSI9JmYiKHRlbXAxMiksCisgICAgICAgICAgW3RlbXAxM10iPSZmIih0ZW1wMTMpLCBbdGVtcDE0XSI9JmYiKHRlbXAxNCksIFt0ZW1wMTVdIj0mZiIodGVtcDE1KQorICAgICAgICA6CisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorCitzdGF0aWMgdm9pZCB2ZWN0b3JfZm11bF9yZXZlcnNlX21pcHMoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxLCBpbnQgbGVuKXsKKyAgICBpbnQgaTsKKyAgICBmbG9hdCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgICAgc3JjMSArPSBsZW4tMTsKKworICAgIGZvcihpPTA7IGk8KGxlbj4+Mik7IGkrKykKKyAgICB7CisgICAgICAgIC8qIGxvb3AgdW5yb2xsZWQgNCB0aW1lcyAqLworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgImx3YzEgICAgICAlW3RlbXAwXSwgICAgIDAoJVtzcmMwXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICVbdGVtcDFdLCAgICAgMCglW3NyYzFdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgJVt0ZW1wMl0sICAgICA0KCVbc3JjMF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAlW3RlbXAzXSwgICAgIC00KCVbc3JjMV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICVbdGVtcDRdLCAgICAgOCglW3NyYzBdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsd2MxICAgICAgJVt0ZW1wNV0sICAgICAtOCglW3NyYzFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImx3YzEgICAgICAlW3RlbXA2XSwgICAgIDEyKCVbc3JjMF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibHdjMSAgICAgICVbdGVtcDddLCAgICAgLTEyKCVbc3JjMV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICAgJVt0ZW1wMF0sICAgICAlW3RlbXAxXSwgICAgICVbdGVtcDBdICAgICBcblx0IgorICAgICAgICAgICAgIm11bC5zICAgICAlW3RlbXAyXSwgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wMl0gICAgIFxuXHQiCisgICAgICAgICAgICAibXVsLnMgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXA0XSAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdWwucyAgICAgJVt0ZW1wNl0sICAgICAlW3RlbXA3XSwgICAgICVbdGVtcDZdICAgICBcblx0IgorICAgICAgICAgICAgImFkZGl1ICAgICAlW3NyYzBdLCAgICAgICVbc3JjMF0sICAgICAgMTYgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaXUgICAgICVbc3JjMV0sICAgICAgJVtzcmMxXSwgICAgICAtMTYgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpdSAgICAgJVtkc3RdLCAgICAgICAlW2RzdF0sICAgICAgIDE2ICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAlW3RlbXAwXSwgICAgIC0xNiglW2RzdF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAic3djMSAgICAgICVbdGVtcDJdLCAgICAgLTEyKCVbZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJzd2MxICAgICAgJVt0ZW1wNF0sICAgICAtOCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInN3YzEgICAgICAlW3RlbXA2XSwgICAgIC00KCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogW2RzdF0iK3IiKGRzdCksIFtzcmMwXSIrciIoc3JjMCksIFtzcmMxXSIrciIoc3JjMSksCisgICAgICAgICAgICAgIFt0ZW1wMF0iPSZmIih0ZW1wMCksIFt0ZW1wMV0iPSZmIih0ZW1wMSksW3RlbXAyXSI9JmYiKHRlbXAyKSwKKyAgICAgICAgICAgICAgW3RlbXAzXSI9JmYiKHRlbXAzKSwgW3RlbXA0XSI9JmYiKHRlbXA0KSwgW3RlbXA1XSI9JmYiKHRlbXA1KSwKKyAgICAgICAgICAgICAgW3RlbXA2XSI9JmYiKHRlbXA2KSwgW3RlbXA3XSI9JmYiKHRlbXA3KQorICAgICAgICAgICAgOgorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgIH0KK30KKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gJiYgSEFWRV9NSVBTRlBVICovCisKK3ZvaWQgZmZfZmxvYXRfZHNwX2luaXRfbWlwcyhBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCkgeworI2lmIEhBVkVfSU5MSU5FX0FTTSAmJiBIQVZFX01JUFNGUFUKKyAgICBmZHNwLT52ZWN0b3JfZm11bCA9IHZlY3Rvcl9mbXVsX21pcHM7CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyICA9IHZlY3Rvcl9mbXVsX3NjYWxhcl9taXBzOworICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyA9IHZlY3Rvcl9mbXVsX3dpbmRvd19taXBzOworICAgIGZkc3AtPmJ1dHRlcmZsaWVzX2Zsb2F0ID0gYnV0dGVyZmxpZXNfZmxvYXRfbWlwczsKKyAgICBmZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlID0gdmVjdG9yX2ZtdWxfcmV2ZXJzZV9taXBzOworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAmJiBIQVZFX01JUFNGUFUgKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvbWlwcy9pbnRyZWFkd3JpdGUuaCBiL2ZmbXBlZy9saWJhdnV0aWwvbWlwcy9pbnRyZWFkd3JpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmEwNDkxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9taXBzL2ludHJlYWR3cml0ZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFucyBSdWxsZ2FyZCA8bWFuc0BtYW5zci5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX01JUFNfSU5UUkVBRFdSSVRFX0gKKyNkZWZpbmUgQVZVVElMX01JUFNfSU5UUkVBRFdSSVRFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgQVJDSF9NSVBTNjQgJiYgSEFWRV9JTkxJTkVfQVNNCisKKyNkZWZpbmUgQVZfUk4zMiBBVl9STjMyCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50MzJfdCBBVl9STjMyKGNvbnN0IHZvaWQgKnApCit7CisgICAgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHUzMiB7IHVpbnQzMl90IHY7IH07CisgICAgY29uc3QgdWludDhfdCAqcSA9IHA7CisgICAgY29uc3Qgc3RydWN0IHUzMiAqcGwgPSAoY29uc3Qgc3RydWN0IHUzMiAqKShxICsgMyAqICFIQVZFX0JJR0VORElBTik7CisgICAgY29uc3Qgc3RydWN0IHUzMiAqcHIgPSAoY29uc3Qgc3RydWN0IHUzMiAqKShxICsgMyAqICBIQVZFX0JJR0VORElBTik7CisgICAgdWludDMyX3QgdjsKKyAgICBfX2FzbV9fICgibHdsICUwLCAlMSAgXG5cdCIKKyAgICAgICAgICAgICAibHdyICUwLCAlMiAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9JnIiKHYpCisgICAgICAgICAgICAgOiAibSIoKnBsKSwgIm0iKCpwcikpOworICAgIHJldHVybiB2OworfQorCisjZW5kaWYgLyogQVJDSF9NSVBTNjQgJiYgSEFWRV9JTkxJTkVfQVNNICovCisKKyNlbmRpZiAvKiBBVlVUSUxfTUlQU19JTlRSRUFEV1JJVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9taXBzL2xpYm1fbWlwcy5oIGIvZmZtcGVnL2xpYmF2dXRpbC9taXBzL2xpYm1fbWlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTNiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL21pcHMvbGlibV9taXBzLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMgorICogICAgICBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiwgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuLCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTUlQUyBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogIE5lZGVsamtvIEJhYmljIChuYmFiaWNAbWlwcy5jb20pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1JUFMgb3B0aW1pemF0aW9uIGZvciBzb21lIGxpYm0gZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZiBBVlVUSUxfTElCTV9NSVBTX0gKKyNkZWZpbmUgQVZVVElMX0xJQk1fTUlQU19ICisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IGxvbmcgaW50IGxyaW50Zl9taXBzKGZsb2F0IHgpCit7CisgICAgcmVnaXN0ZXIgaW50IHJldF9pbnQ7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImN2dC53LnMgICAgJVt4XSwgICAgICAgJVt4XSAgICBcblx0IgorICAgICAgICAibWZjMSAgICAgICAlW3JldF9pbnRdLCAlW3hdICAgIFxuXHQiCisKKyAgICAgICAgOlt4XSIrZiIoeCksIFtyZXRfaW50XSI9ciIocmV0X2ludCkKKyAgICApOworICAgIHJldHVybiByZXRfaW50OworfQorCisjdW5kZWYgbHJpbnRmCisjZGVmaW5lIGxyaW50Zih4KSAgIGxyaW50Zl9taXBzKHgpCisKKyNkZWZpbmUgSEFWRV9MUklOVEYgMQorI2VuZGlmIC8qIEFWVVRJTF9MSUJNX01JUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9tb3Rpb25fdmVjdG9yLmggYi9mZm1wZWcvbGliYXZ1dGlsL21vdGlvbl92ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGNmYjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9tb3Rpb25fdmVjdG9yLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9NT1RJT05fVkVDVE9SX0gKKyNkZWZpbmUgQVZVVElMX01PVElPTl9WRUNUT1JfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IEFWTW90aW9uVmVjdG9yIHsKKyAgICAvKioKKyAgICAgKiBXaGVyZSB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGNvbWVzIGZyb207IG5lZ2F0aXZlIHZhbHVlIHdoZW4gaXQgY29tZXMKKyAgICAgKiBmcm9tIHRoZSBwYXN0LCBwb3NpdGl2ZSB2YWx1ZSB3aGVuIGl0IGNvbWVzIGZyb20gdGhlIGZ1dHVyZS4KKyAgICAgKiBYWFg6IHNldCBleGFjdCByZWxhdGl2ZSByZWYgZnJhbWUgcmVmZXJlbmNlIGluc3RlYWQgb2YgYSArLy0gMSAiZGlyZWN0aW9uIi4KKyAgICAgKi8KKyAgICBpbnQzMl90IHNvdXJjZTsKKyAgICAvKioKKyAgICAgKiBXaWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBibG9jay4KKyAgICAgKi8KKyAgICB1aW50OF90IHcsIGg7CisgICAgLyoqCisgICAgICogQWJzb2x1dGUgc291cmNlIHBvc2l0aW9uLiBDYW4gYmUgb3V0c2lkZSB0aGUgZnJhbWUgYXJlYS4KKyAgICAgKi8KKyAgICBpbnQxNl90IHNyY194LCBzcmNfeTsKKyAgICAvKioKKyAgICAgKiBBYnNvbHV0ZSBkZXN0aW5hdGlvbiBwb3NpdGlvbi4gQ2FuIGJlIG91dHNpZGUgdGhlIGZyYW1lIGFyZWEuCisgICAgICovCisgICAgaW50MTZfdCBkc3RfeCwgZHN0X3k7CisgICAgLyoqCisgICAgICogRXh0cmEgZmxhZyBpbmZvcm1hdGlvbi4KKyAgICAgKiBDdXJyZW50bHkgdW51c2VkLgorICAgICAqLworICAgIHVpbnQ2NF90IGZsYWdzOworfSBBVk1vdGlvblZlY3RvcjsKKworI2VuZGlmIC8qIEFWVVRJTF9NT1RJT05fVkVDVE9SX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvbXVybXVyMy5jIGIvZmZtcGVnL2xpYmF2dXRpbC9tdXJtdXIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxZmE2YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvbXVybXVyMy5jCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAiaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibXVybXVyMy5oIgorCit0eXBlZGVmIHN0cnVjdCBBVk11ck11cjMgeworICAgIHVpbnQ2NF90IGgxLCBoMjsKKyAgICB1aW50OF90IHN0YXRlWzE2XTsKKyAgICBpbnQgc3RhdGVfcG9zOworICAgIHVpbnQ2NF90IGxlbjsKK30gQVZNdXJNdXIzOworCitBVk11ck11cjMgKmF2X211cm11cjNfYWxsb2Modm9pZCkKK3sKKyAgICByZXR1cm4gYXZfbWFsbG9jeihzaXplb2YoQVZNdXJNdXIzKSk7Cit9CisKK3ZvaWQgYXZfbXVybXVyM19pbml0X3NlZWRlZChBVk11ck11cjMgKmMsIHVpbnQ2NF90IHNlZWQpCit7CisgICAgbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOworICAgIGMtPmgxID0gYy0+aDIgPSBzZWVkOworfQorCit2b2lkIGF2X211cm11cjNfaW5pdChBVk11ck11cjMgKmMpCit7CisgICAgLy8gYXJiaXRyYXJ5IHJhbmRvbSBudW1iZXIgYXMgc2VlZAorICAgIGF2X211cm11cjNfaW5pdF9zZWVkZWQoYywgMHg3MjVhY2M1NWRhZGRjYTU1KTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGMxID0gVUlOVDY0X0MoMHg4N2MzN2I5MTExNDI1M2Q1KTsKK3N0YXRpYyBjb25zdCB1aW50NjRfdCBjMiA9IFVJTlQ2NF9DKDB4NGNmNWFkNDMyNzQ1OTM3Zik7CisKKyNkZWZpbmUgUk9UKGEsIGIpICgoYSA8PCBiKSB8IChhID4+ICg2NCAtIGIpKSkKKworc3RhdGljIHVpbnQ2NF90IGlubGluZSBnZXRfazEoY29uc3QgdWludDhfdCAqc3JjKQoreworICAgIHVpbnQ2NF90IGsgPSBBVl9STDY0KHNyYyk7CisgICAgayAqPSBjMTsKKyAgICBrID0gUk9UKGssIDMxKTsKKyAgICBrICo9IGMyOworICAgIHJldHVybiBrOworfQorCitzdGF0aWMgdWludDY0X3QgaW5saW5lIGdldF9rMihjb25zdCB1aW50OF90ICpzcmMpCit7CisgICAgdWludDY0X3QgayA9IEFWX1JMNjQoc3JjICsgOCk7CisgICAgayAqPSBjMjsKKyAgICBrID0gUk9UKGssIDMzKTsKKyAgICBrICo9IGMxOworICAgIHJldHVybiBrOworfQorCitzdGF0aWMgdWludDY0X3QgaW5saW5lIHVwZGF0ZV9oMSh1aW50NjRfdCBrLCB1aW50NjRfdCBoMSwgdWludDY0X3QgaDIpCit7CisgICAgayBePSBoMTsKKyAgICBrID0gUk9UKGssIDI3KTsKKyAgICBrICs9IGgyOworICAgIGsgKj0gNTsKKyAgICBrICs9IDB4NTJkY2U3Mjk7CisgICAgcmV0dXJuIGs7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBpbmxpbmUgdXBkYXRlX2gyKHVpbnQ2NF90IGssIHVpbnQ2NF90IGgxLCB1aW50NjRfdCBoMikKK3sKKyAgICBrIF49IGgyOworICAgIGsgPSBST1QoaywgMzEpOworICAgIGsgKz0gaDE7CisgICAgayAqPSA1OworICAgIGsgKz0gMHgzODQ5NWFiNTsKKyAgICByZXR1cm4gazsKK30KKwordm9pZCBhdl9tdXJtdXIzX3VwZGF0ZShBVk11ck11cjMgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbikKK3sKKyAgICBjb25zdCB1aW50OF90ICplbmQ7CisgICAgdWludDY0X3QgaDEgPSBjLT5oMSwgaDIgPSBjLT5oMjsKKyAgICB1aW50NjRfdCBrMSwgazI7CisgICAgaWYgKGxlbiA8PSAwKSByZXR1cm47CisgICAgYy0+bGVuICs9IGxlbjsKKyAgICBpZiAoYy0+c3RhdGVfcG9zID4gMCkgeworICAgICAgICB3aGlsZSAoYy0+c3RhdGVfcG9zIDwgMTYpIHsKKyAgICAgICAgICAgIGMtPnN0YXRlW2MtPnN0YXRlX3BvcysrXSA9ICpzcmMrKzsKKyAgICAgICAgICAgIGlmICgtLWxlbiA8PSAwKSByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYy0+c3RhdGVfcG9zID0gMDsKKyAgICAgICAgazEgPSBnZXRfazEoYy0+c3RhdGUpOworICAgICAgICBrMiA9IGdldF9rMihjLT5zdGF0ZSk7CisgICAgICAgIGgxID0gdXBkYXRlX2gxKGsxLCBoMSwgaDIpOworICAgICAgICBoMiA9IHVwZGF0ZV9oMihrMiwgaDEsIGgyKTsKKyAgICB9CisKKyAgICBlbmQgPSBzcmMgKyAobGVuICYgfjE1KTsKKyAgICB3aGlsZSAoc3JjIDwgZW5kKSB7CisgICAgICAgIC8vIFRoZXNlIGNvdWxkIGJlIGRvbmUgc2VxdWVudGlhbGx5IGluc3RlYWQKKyAgICAgICAgLy8gb2YgaW50ZXJsZWF2ZWQsIGJ1dCBsaWtlIHRoaXMgaXMgb3ZlciAxMCUgZmFzdGVyCisgICAgICAgIGsxID0gZ2V0X2sxKHNyYyk7CisgICAgICAgIGsyID0gZ2V0X2syKHNyYyk7CisgICAgICAgIGgxID0gdXBkYXRlX2gxKGsxLCBoMSwgaDIpOworICAgICAgICBoMiA9IHVwZGF0ZV9oMihrMiwgaDEsIGgyKTsKKyAgICAgICAgc3JjICs9IDE2OworICAgIH0KKyAgICBjLT5oMSA9IGgxOworICAgIGMtPmgyID0gaDI7CisKKyAgICBsZW4gJj0gMTU7CisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgbWVtY3B5KGMtPnN0YXRlLCBzcmMsIGxlbik7CisgICAgICAgIGMtPnN0YXRlX3BvcyA9IGxlbjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZm1peCh1aW50NjRfdCBrKQoreworICAgIGsgXj0gayA+PiAzMzsKKyAgICBrICo9IFVJTlQ2NF9DKDB4ZmY1MWFmZDdlZDU1OGNjZCk7CisgICAgayBePSBrID4+IDMzOworICAgIGsgKj0gVUlOVDY0X0MoMHhjNGNlYjlmZTFhODVlYzUzKTsKKyAgICBrIF49IGsgPj4gMzM7CisgICAgcmV0dXJuIGs7Cit9CisKK3ZvaWQgYXZfbXVybXVyM19maW5hbChBVk11ck11cjMgKmMsIHVpbnQ4X3QgZHN0WzE2XSkKK3sKKyAgICB1aW50NjRfdCBoMSA9IGMtPmgxLCBoMiA9IGMtPmgyOworICAgIG1lbXNldChjLT5zdGF0ZSArIGMtPnN0YXRlX3BvcywgMCwgc2l6ZW9mKGMtPnN0YXRlKSAtIGMtPnN0YXRlX3Bvcyk7CisgICAgaDEgXj0gZ2V0X2sxKGMtPnN0YXRlKSBeIGMtPmxlbjsKKyAgICBoMiBePSBnZXRfazIoYy0+c3RhdGUpIF4gYy0+bGVuOworICAgIGgxICs9IGgyOworICAgIGgyICs9IGgxOworICAgIGgxID0gZm1peChoMSk7CisgICAgaDIgPSBmbWl4KGgyKTsKKyAgICBoMSArPSBoMjsKKyAgICBoMiArPSBoMTsKKyAgICBBVl9XTDY0KGRzdCwgaDEpOworICAgIEFWX1dMNjQoZHN0ICsgOCwgaDIpOworfQorCisjaWZkZWYgVEVTVAoraW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90IGhhc2hfcmVzdWx0WzE2XSA9IHswfTsKKyAgICBBVk11ck11cjMgKmN0eCA9IGF2X211cm11cjNfYWxsb2MoKTsKKyNpZiAxCisgICAgdWludDhfdCBpblsyNTZdID0gezB9OworICAgIHVpbnQ4X3QgKmhhc2hlcyA9IGF2X21hbGxvY3ooMjU2ICogMTYpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICB7CisgICAgICAgIGluW2ldID0gaTsKKyAgICAgICAgYXZfbXVybXVyM19pbml0X3NlZWRlZChjdHgsIDI1NiAtIGkpOworICAgICAgICAvLyBOb3RlOiB0aGlzIGFjdHVhbGx5IHRlc3RzIGhhc2hpbmcgMCBieXRlcworICAgICAgICBhdl9tdXJtdXIzX3VwZGF0ZShjdHgsIGluLCBpKTsKKyAgICAgICAgYXZfbXVybXVyM19maW5hbChjdHgsIGhhc2hlcyArIDE2ICogaSk7CisgICAgfQorICAgIGF2X211cm11cjNfaW5pdF9zZWVkZWQoY3R4LCAwKTsKKyAgICBhdl9tdXJtdXIzX3VwZGF0ZShjdHgsIGhhc2hlcywgMjU2ICogMTYpOworICAgIGF2X211cm11cjNfZmluYWwoY3R4LCBoYXNoX3Jlc3VsdCk7CisgICAgYXZfZnJlZShoYXNoZXMpOworICAgIGF2X2ZyZWVwKCZjdHgpOworICAgIHByaW50ZigicmVzdWx0OiAweCUiUFJJeDY0IiAweCUiUFJJeDY0IlxuIiwgQVZfUkw2NChoYXNoX3Jlc3VsdCksIEFWX1JMNjQoaGFzaF9yZXN1bHQgKyA4KSk7CisgICAgLy8gb2ZmaWNpYWwgcmVmZXJlbmNlIHZhbHVlIGlzIDMyIGJpdAorICAgIHJldHVybiBBVl9STDMyKGhhc2hfcmVzdWx0KSAhPSAweDYzODRiYTY5OworI2Vsc2UKKyAgICB1aW50OF90ICppbiA9IGF2X21hbGxvY3ooNTEyKjEwMjQpOworICAgIGF2X211cm11cjNfaW5pdChjdHgpOworICAgIGZvciAoaSA9IDA7IGkgPCA0MCoxMDI0OyBpKyspCisgICAgICAgIGF2X211cm11cjNfdXBkYXRlKGN0eCwgaW4sIDUxMioxMDI0KTsKKyAgICBhdl9tdXJtdXIzX2ZpbmFsKGN0eCwgaGFzaF9yZXN1bHQpOworICAgIGF2X2ZyZWUoaW4pOworICAgIHJldHVybiBoYXNoX3Jlc3VsdFswXTsKKyNlbmRpZgorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL211cm11cjMuaCBiL2ZmbXBlZy9saWJhdnV0aWwvbXVybXVyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOWVkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL211cm11cjMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX01VUk1VUjNfSAorI2RlZmluZSBBVlVUSUxfTVVSTVVSM19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RydWN0IEFWTXVyTXVyMyAqYXZfbXVybXVyM19hbGxvYyh2b2lkKTsKK3ZvaWQgYXZfbXVybXVyM19pbml0X3NlZWRlZChzdHJ1Y3QgQVZNdXJNdXIzICpjLCB1aW50NjRfdCBzZWVkKTsKK3ZvaWQgYXZfbXVybXVyM19pbml0KHN0cnVjdCBBVk11ck11cjMgKmMpOwordm9pZCBhdl9tdXJtdXIzX3VwZGF0ZShzdHJ1Y3QgQVZNdXJNdXIzICpjLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4pOwordm9pZCBhdl9tdXJtdXIzX2ZpbmFsKHN0cnVjdCBBVk11ck11cjMgKmMsIHVpbnQ4X3QgZHN0WzE2XSk7CisKKyNlbmRpZiAvKiBBVlVUSUxfTVVSTVVSM19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL29sZF9waXhfZm10cy5oIGIvZmZtcGVnL2xpYmF2dXRpbC9vbGRfcGl4X2ZtdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFlZDdjCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9vbGRfcGl4X2ZtdHMuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNi0yMDEyIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX09MRF9QSVhfRk1UU19ICisjZGVmaW5lIEFWVVRJTF9PTERfUElYX0ZNVFNfSAorCisvKgorICogVGhpcyBoZWFkZXIgZXhpc3RzIHRvIHByZXZlbnQgbmV3IHBpeGVsIGZvcm1hdHMgZnJvbSBiZWluZyBhY2NpZGVudGFsbHkgYWRkZWQKKyAqIHRvIHRoZSBkZXByZWNhdGVkIGxpc3QuCisgKiBEbyBub3QgaW5jbHVkZSBpdCBkaXJlY3RseS4gSXQgd2lsbCBiZSByZW1vdmVkIG9uIG5leHQgbWFqb3IgYnVtcAorICoKKyAqIERvIG5vdCBhZGQgbmV3IGl0ZW1zIHRvIHRoaXMgbGlzdC4gVXNlIHRoZSBBVlBpeGVsRm9ybWF0IGVudW0gaW5zdGVhZC4KKyAqLworICAgIFBJWF9GTVRfTk9ORSA9IEFWX1BJWF9GTVRfTk9ORSwKKyAgICBQSVhfRk1UX1lVVjQyMFAsICAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAxMmJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZIHNhbXBsZXMpCisgICAgUElYX0ZNVF9ZVVlWNDIyLCAgIC8vLzwgcGFja2VkIFlVViA0OjI6MiwgMTZicHAsIFkwIENiIFkxIENyCisgICAgUElYX0ZNVF9SR0IyNCwgICAgIC8vLzwgcGFja2VkIFJHQiA4Ojg6OCwgMjRicHAsIFJHQlJHQi4uLgorICAgIFBJWF9GTVRfQkdSMjQsICAgICAvLy88IHBhY2tlZCBSR0IgODo4OjgsIDI0YnBwLCBCR1JCR1IuLi4KKyAgICBQSVhfRk1UX1lVVjQyMlAsICAgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLCAxNmJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpCisgICAgUElYX0ZNVF9ZVVY0NDRQLCAgIC8vLzwgcGxhbmFyIFlVViA0OjQ6NCwgMjRicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKQorICAgIFBJWF9GTVRfWVVWNDEwUCwgICAvLy88IHBsYW5hciBZVVYgNDoxOjAsICA5YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgNHg0IFkgc2FtcGxlcykKKyAgICBQSVhfRk1UX1lVVjQxMVAsICAgLy8vPCBwbGFuYXIgWVVWIDQ6MToxLCAxMmJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDR4MSBZIHNhbXBsZXMpCisgICAgUElYX0ZNVF9HUkFZOCwgICAgIC8vLzwgICAgICAgIFkgICAgICAgICwgIDhicHAKKyAgICBQSVhfRk1UX01PTk9XSElURSwgLy8vPCAgICAgICAgWSAgICAgICAgLCAgMWJwcCwgMCBpcyB3aGl0ZSwgMSBpcyBibGFjaywgaW4gZWFjaCBieXRlIHBpeGVscyBhcmUgb3JkZXJlZCBmcm9tIHRoZSBtc2IgdG8gdGhlIGxzYgorICAgIFBJWF9GTVRfTU9OT0JMQUNLLCAvLy88ICAgICAgICBZICAgICAgICAsICAxYnBwLCAwIGlzIGJsYWNrLCAxIGlzIHdoaXRlLCBpbiBlYWNoIGJ5dGUgcGl4ZWxzIGFyZSBvcmRlcmVkIGZyb20gdGhlIG1zYiB0byB0aGUgbHNiCisgICAgUElYX0ZNVF9QQUw4LCAgICAgIC8vLzwgOCBiaXQgd2l0aCBQSVhfRk1UX1JHQjMyIHBhbGV0dGUKKyAgICBQSVhfRk1UX1lVVko0MjBQLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAxMmJwcCwgZnVsbCBzY2FsZSAoSlBFRyksIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgUElYX0ZNVF9ZVVY0MjBQIGFuZCBzZXR0aW5nIGNvbG9yX3JhbmdlCisgICAgUElYX0ZNVF9ZVVZKNDIyUCwgIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwgMTZicHAsIGZ1bGwgc2NhbGUgKEpQRUcpLCBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFBJWF9GTVRfWVVWNDIyUCBhbmQgc2V0dGluZyBjb2xvcl9yYW5nZQorICAgIFBJWF9GTVRfWVVWSjQ0NFAsICAvLy88IHBsYW5hciBZVVYgNDo0OjQsIDI0YnBwLCBmdWxsIHNjYWxlIChKUEVHKSwgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBQSVhfRk1UX1lVVjQ0NFAgYW5kIHNldHRpbmcgY29sb3JfcmFuZ2UKKyNpZiBGRl9BUElfWFZNQworICAgIFBJWF9GTVRfWFZNQ19NUEVHMl9NQywvLy88IFhWaWRlbyBNb3Rpb24gQWNjZWxlcmF0aW9uIHZpYSBjb21tb24gcGFja2V0IHBhc3NpbmcKKyAgICBQSVhfRk1UX1hWTUNfTVBFRzJfSURDVCwKKyNlbmRpZiAvKiBGRl9BUElfWFZNQyAqLworICAgIFBJWF9GTVRfVVlWWTQyMiwgICAvLy88IHBhY2tlZCBZVVYgNDoyOjIsIDE2YnBwLCBDYiBZMCBDciBZMQorICAgIFBJWF9GTVRfVVlZVllZNDExLCAvLy88IHBhY2tlZCBZVVYgNDoxOjEsIDEyYnBwLCBDYiBZMCBZMSBDciBZMiBZMworICAgIFBJWF9GTVRfQkdSOCwgICAgICAvLy88IHBhY2tlZCBSR0IgMzozOjIsICA4YnBwLCAobXNiKTJCIDNHIDNSKGxzYikKKyAgICBQSVhfRk1UX0JHUjQsICAgICAgLy8vPCBwYWNrZWQgUkdCIDE6MjoxIGJpdHN0cmVhbSwgIDRicHAsIChtc2IpMUIgMkcgMVIobHNiKSwgYSBieXRlIGNvbnRhaW5zIHR3byBwaXhlbHMsIHRoZSBmaXJzdCBwaXhlbCBpbiB0aGUgYnl0ZSBpcyB0aGUgb25lIGNvbXBvc2VkIGJ5IHRoZSA0IG1zYiBiaXRzCisgICAgUElYX0ZNVF9CR1I0X0JZVEUsIC8vLzwgcGFja2VkIFJHQiAxOjI6MSwgIDhicHAsIChtc2IpMUIgMkcgMVIobHNiKQorICAgIFBJWF9GTVRfUkdCOCwgICAgICAvLy88IHBhY2tlZCBSR0IgMzozOjIsICA4YnBwLCAobXNiKTJSIDNHIDNCKGxzYikKKyAgICBQSVhfRk1UX1JHQjQsICAgICAgLy8vPCBwYWNrZWQgUkdCIDE6MjoxIGJpdHN0cmVhbSwgIDRicHAsIChtc2IpMVIgMkcgMUIobHNiKSwgYSBieXRlIGNvbnRhaW5zIHR3byBwaXhlbHMsIHRoZSBmaXJzdCBwaXhlbCBpbiB0aGUgYnl0ZSBpcyB0aGUgb25lIGNvbXBvc2VkIGJ5IHRoZSA0IG1zYiBiaXRzCisgICAgUElYX0ZNVF9SR0I0X0JZVEUsIC8vLzwgcGFja2VkIFJHQiAxOjI6MSwgIDhicHAsIChtc2IpMVIgMkcgMUIobHNiKQorICAgIFBJWF9GTVRfTlYxMiwgICAgICAvLy88IHBsYW5hciBZVVYgNDoyOjAsIDEyYnBwLCAxIHBsYW5lIGZvciBZIGFuZCAxIHBsYW5lIGZvciB0aGUgVVYgY29tcG9uZW50cywgd2hpY2ggYXJlIGludGVybGVhdmVkIChmaXJzdCBieXRlIFUgYW5kIHRoZSBmb2xsb3dpbmcgYnl0ZSBWKQorICAgIFBJWF9GTVRfTlYyMSwgICAgICAvLy88IGFzIGFib3ZlLCBidXQgVSBhbmQgViBieXRlcyBhcmUgc3dhcHBlZAorCisgICAgUElYX0ZNVF9BUkdCLCAgICAgIC8vLzwgcGFja2VkIEFSR0IgODo4Ojg6OCwgMzJicHAsIEFSR0JBUkdCLi4uCisgICAgUElYX0ZNVF9SR0JBLCAgICAgIC8vLzwgcGFja2VkIFJHQkEgODo4Ojg6OCwgMzJicHAsIFJHQkFSR0JBLi4uCisgICAgUElYX0ZNVF9BQkdSLCAgICAgIC8vLzwgcGFja2VkIEFCR1IgODo4Ojg6OCwgMzJicHAsIEFCR1JBQkdSLi4uCisgICAgUElYX0ZNVF9CR1JBLCAgICAgIC8vLzwgcGFja2VkIEJHUkEgODo4Ojg6OCwgMzJicHAsIEJHUkFCR1JBLi4uCisKKyAgICBQSVhfRk1UX0dSQVkxNkJFLCAgLy8vPCAgICAgICAgWSAgICAgICAgLCAxNmJwcCwgYmlnLWVuZGlhbgorICAgIFBJWF9GTVRfR1JBWTE2TEUsICAvLy88ICAgICAgICBZICAgICAgICAsIDE2YnBwLCBsaXR0bGUtZW5kaWFuCisgICAgUElYX0ZNVF9ZVVY0NDBQLCAgIC8vLzwgcGxhbmFyIFlVViA0OjQ6MCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgyIFkgc2FtcGxlcykKKyAgICBQSVhfRk1UX1lVVko0NDBQLCAgLy8vPCBwbGFuYXIgWVVWIDQ6NDowIGZ1bGwgc2NhbGUgKEpQRUcpLCBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFBJWF9GTVRfWVVWNDQwUCBhbmQgc2V0dGluZyBjb2xvcl9yYW5nZQorICAgIFBJWF9GTVRfWVVWQTQyMFAsICAvLy88IHBsYW5hciBZVVYgNDoyOjAsIDIwYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgJiBBIHNhbXBsZXMpCisjaWYgRkZfQVBJX1ZEUEFVCisgICAgUElYX0ZNVF9WRFBBVV9IMjY0LC8vLzwgSC4yNjQgSFcgZGVjb2Rpbmcgd2l0aCBWRFBBVSwgZGF0YVswXSBjb250YWlucyBhIHZkcGF1X3JlbmRlcl9zdGF0ZSBzdHJ1Y3Qgd2hpY2ggY29udGFpbnMgdGhlIGJpdHN0cmVhbSBvZiB0aGUgc2xpY2VzIGFzIHdlbGwgYXMgdmFyaW91cyBmaWVsZHMgZXh0cmFjdGVkIGZyb20gaGVhZGVycworICAgIFBJWF9GTVRfVkRQQVVfTVBFRzEsLy8vPCBNUEVHLTEgSFcgZGVjb2Rpbmcgd2l0aCBWRFBBVSwgZGF0YVswXSBjb250YWlucyBhIHZkcGF1X3JlbmRlcl9zdGF0ZSBzdHJ1Y3Qgd2hpY2ggY29udGFpbnMgdGhlIGJpdHN0cmVhbSBvZiB0aGUgc2xpY2VzIGFzIHdlbGwgYXMgdmFyaW91cyBmaWVsZHMgZXh0cmFjdGVkIGZyb20gaGVhZGVycworICAgIFBJWF9GTVRfVkRQQVVfTVBFRzIsLy8vPCBNUEVHLTIgSFcgZGVjb2Rpbmcgd2l0aCBWRFBBVSwgZGF0YVswXSBjb250YWlucyBhIHZkcGF1X3JlbmRlcl9zdGF0ZSBzdHJ1Y3Qgd2hpY2ggY29udGFpbnMgdGhlIGJpdHN0cmVhbSBvZiB0aGUgc2xpY2VzIGFzIHdlbGwgYXMgdmFyaW91cyBmaWVsZHMgZXh0cmFjdGVkIGZyb20gaGVhZGVycworICAgIFBJWF9GTVRfVkRQQVVfV01WMywvLy88IFdNVjMgSFcgZGVjb2Rpbmcgd2l0aCBWRFBBVSwgZGF0YVswXSBjb250YWlucyBhIHZkcGF1X3JlbmRlcl9zdGF0ZSBzdHJ1Y3Qgd2hpY2ggY29udGFpbnMgdGhlIGJpdHN0cmVhbSBvZiB0aGUgc2xpY2VzIGFzIHdlbGwgYXMgdmFyaW91cyBmaWVsZHMgZXh0cmFjdGVkIGZyb20gaGVhZGVycworICAgIFBJWF9GTVRfVkRQQVVfVkMxLCAvLy88IFZDLTEgSFcgZGVjb2Rpbmcgd2l0aCBWRFBBVSwgZGF0YVswXSBjb250YWlucyBhIHZkcGF1X3JlbmRlcl9zdGF0ZSBzdHJ1Y3Qgd2hpY2ggY29udGFpbnMgdGhlIGJpdHN0cmVhbSBvZiB0aGUgc2xpY2VzIGFzIHdlbGwgYXMgdmFyaW91cyBmaWVsZHMgZXh0cmFjdGVkIGZyb20gaGVhZGVycworI2VuZGlmCisgICAgUElYX0ZNVF9SR0I0OEJFLCAgIC8vLzwgcGFja2VkIFJHQiAxNjoxNjoxNiwgNDhicHAsIDE2UiwgMTZHLCAxNkIsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBiaWctZW5kaWFuCisgICAgUElYX0ZNVF9SR0I0OExFLCAgIC8vLzwgcGFja2VkIFJHQiAxNjoxNjoxNiwgNDhicHAsIDE2UiwgMTZHLCAxNkIsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuCisKKyAgICBQSVhfRk1UX1JHQjU2NUJFLCAgLy8vPCBwYWNrZWQgUkdCIDU6Njo1LCAxNmJwcCwgKG1zYikgICA1UiA2RyA1Qihsc2IpLCBiaWctZW5kaWFuCisgICAgUElYX0ZNVF9SR0I1NjVMRSwgIC8vLzwgcGFja2VkIFJHQiA1OjY6NSwgMTZicHAsIChtc2IpICAgNVIgNkcgNUIobHNiKSwgbGl0dGxlLWVuZGlhbgorICAgIFBJWF9GTVRfUkdCNTU1QkUsICAvLy88IHBhY2tlZCBSR0IgNTo1OjUsIDE2YnBwLCAobXNiKTFBIDVSIDVHIDVCKGxzYiksIGJpZy1lbmRpYW4sIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvIDAKKyAgICBQSVhfRk1UX1JHQjU1NUxFLCAgLy8vPCBwYWNrZWQgUkdCIDU6NTo1LCAxNmJwcCwgKG1zYikxQSA1UiA1RyA1Qihsc2IpLCBsaXR0bGUtZW5kaWFuLCBtb3N0IHNpZ25pZmljYW50IGJpdCB0byAwCisKKyAgICBQSVhfRk1UX0JHUjU2NUJFLCAgLy8vPCBwYWNrZWQgQkdSIDU6Njo1LCAxNmJwcCwgKG1zYikgICA1QiA2RyA1Uihsc2IpLCBiaWctZW5kaWFuCisgICAgUElYX0ZNVF9CR1I1NjVMRSwgIC8vLzwgcGFja2VkIEJHUiA1OjY6NSwgMTZicHAsIChtc2IpICAgNUIgNkcgNVIobHNiKSwgbGl0dGxlLWVuZGlhbgorICAgIFBJWF9GTVRfQkdSNTU1QkUsICAvLy88IHBhY2tlZCBCR1IgNTo1OjUsIDE2YnBwLCAobXNiKTFBIDVCIDVHIDVSKGxzYiksIGJpZy1lbmRpYW4sIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvIDEKKyAgICBQSVhfRk1UX0JHUjU1NUxFLCAgLy8vPCBwYWNrZWQgQkdSIDU6NTo1LCAxNmJwcCwgKG1zYikxQSA1QiA1RyA1Uihsc2IpLCBsaXR0bGUtZW5kaWFuLCBtb3N0IHNpZ25pZmljYW50IGJpdCB0byAxCisKKyAgICBQSVhfRk1UX1ZBQVBJX01PQ08sIC8vLzwgSFcgYWNjZWxlcmF0aW9uIHRocm91Z2ggVkEgQVBJIGF0IG1vdGlvbiBjb21wZW5zYXRpb24gZW50cnktcG9pbnQsIFBpY3R1cmUuZGF0YVszXSBjb250YWlucyBhIHZhYXBpX3JlbmRlcl9zdGF0ZSBzdHJ1Y3Qgd2hpY2ggY29udGFpbnMgbWFjcm9ibG9ja3MgYXMgd2VsbCBhcyB2YXJpb3VzIGZpZWxkcyBleHRyYWN0ZWQgZnJvbSBoZWFkZXJzCisgICAgUElYX0ZNVF9WQUFQSV9JRENULCAvLy88IEhXIGFjY2VsZXJhdGlvbiB0aHJvdWdoIFZBIEFQSSBhdCBJRENUIGVudHJ5LXBvaW50LCBQaWN0dXJlLmRhdGFbM10gY29udGFpbnMgYSB2YWFwaV9yZW5kZXJfc3RhdGUgc3RydWN0IHdoaWNoIGNvbnRhaW5zIGZpZWxkcyBleHRyYWN0ZWQgZnJvbSBoZWFkZXJzCisgICAgUElYX0ZNVF9WQUFQSV9WTEQsICAvLy88IEhXIGRlY29kaW5nIHRocm91Z2ggVkEgQVBJLCBQaWN0dXJlLmRhdGFbM10gY29udGFpbnMgYSB2YWFwaV9yZW5kZXJfc3RhdGUgc3RydWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBiaXRzdHJlYW0gb2YgdGhlIHNsaWNlcyBhcyB3ZWxsIGFzIHZhcmlvdXMgZmllbGRzIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMKKworICAgIFBJWF9GTVRfWVVWNDIwUDE2TEUsICAvLy88IHBsYW5hciBZVVYgNDoyOjAsIDI0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBQSVhfRk1UX1lVVjQyMFAxNkJFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAyNGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgUElYX0ZNVF9ZVVY0MjJQMTZMRSwgIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwgMzJicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIFBJWF9GTVRfWVVWNDIyUDE2QkUsICAvLy88IHBsYW5hciBZVVYgNDoyOjIsIDMyYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBQSVhfRk1UX1lVVjQ0NFAxNkxFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LCA0OGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgUElYX0ZNVF9ZVVY0NDRQMTZCRSwgIC8vLzwgcGxhbmFyIFlVViA0OjQ6NCwgNDhicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorI2lmIEZGX0FQSV9WRFBBVQorICAgIFBJWF9GTVRfVkRQQVVfTVBFRzQsICAvLy88IE1QRUc0IEhXIGRlY29kaW5nIHdpdGggVkRQQVUsIGRhdGFbMF0gY29udGFpbnMgYSB2ZHBhdV9yZW5kZXJfc3RhdGUgc3RydWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBiaXRzdHJlYW0gb2YgdGhlIHNsaWNlcyBhcyB3ZWxsIGFzIHZhcmlvdXMgZmllbGRzIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMKKyNlbmRpZgorICAgIFBJWF9GTVRfRFhWQTJfVkxELCAgICAvLy88IEhXIGRlY29kaW5nIHRocm91Z2ggRFhWQTIsIFBpY3R1cmUuZGF0YVszXSBjb250YWlucyBhIExQRElSRUNUM0RTVVJGQUNFOSBwb2ludGVyCisKKyAgICBQSVhfRk1UX1JHQjQ0NExFLCAgLy8vPCBwYWNrZWQgUkdCIDQ6NDo0LCAxNmJwcCwgKG1zYik0QSA0UiA0RyA0Qihsc2IpLCBsaXR0bGUtZW5kaWFuLCBtb3N0IHNpZ25pZmljYW50IGJpdHMgdG8gMAorICAgIFBJWF9GTVRfUkdCNDQ0QkUsICAvLy88IHBhY2tlZCBSR0IgNDo0OjQsIDE2YnBwLCAobXNiKTRBIDRSIDRHIDRCKGxzYiksIGJpZy1lbmRpYW4sIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyB0byAwCisgICAgUElYX0ZNVF9CR1I0NDRMRSwgIC8vLzwgcGFja2VkIEJHUiA0OjQ6NCwgMTZicHAsIChtc2IpNEEgNEIgNEcgNFIobHNiKSwgbGl0dGxlLWVuZGlhbiwgbW9zdCBzaWduaWZpY2FudCBiaXRzIHRvIDEKKyAgICBQSVhfRk1UX0JHUjQ0NEJFLCAgLy8vPCBwYWNrZWQgQkdSIDQ6NDo0LCAxNmJwcCwgKG1zYik0QSA0QiA0RyA0Uihsc2IpLCBiaWctZW5kaWFuLCBtb3N0IHNpZ25pZmljYW50IGJpdHMgdG8gMQorICAgIFBJWF9GTVRfR1JBWThBLCAgICAvLy88IDhiaXQgZ3JheSwgOGJpdCBhbHBoYQorICAgIFBJWF9GTVRfQkdSNDhCRSwgICAvLy88IHBhY2tlZCBSR0IgMTY6MTY6MTYsIDQ4YnBwLCAxNkIsIDE2RywgMTZSLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgYmlnLWVuZGlhbgorICAgIFBJWF9GTVRfQkdSNDhMRSwgICAvLy88IHBhY2tlZCBSR0IgMTY6MTY6MTYsIDQ4YnBwLCAxNkIsIDE2RywgMTZSLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbgorCisgICAgLy90aGUgZm9sbG93aW5nIDEwIGZvcm1hdHMgaGF2ZSB0aGUgZGlzYWR2YW50YWdlIG9mIG5lZWRpbmcgMSBmb3JtYXQgZm9yIGVhY2ggYml0IGRlcHRoLCB0aHVzCisgICAgLy9JZiB5b3Ugd2FudCB0byBzdXBwb3J0IG11bHRpcGxlIGJpdCBkZXB0aHMsIHRoZW4gdXNpbmcgUElYX0ZNVF9ZVVY0MjBQMTYqIHdpdGggdGhlIGJwcCBzdG9yZWQgc2VwYXJhdGVseQorICAgIC8vaXMgYmV0dGVyCisgICAgUElYX0ZNVF9ZVVY0MjBQOUJFLCAvLy88IHBsYW5hciBZVVYgNDoyOjAsIDEzLjVicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIFBJWF9GTVRfWVVWNDIwUDlMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAxMy41YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBQSVhfRk1UX1lVVjQyMFAxMEJFLC8vLzwgcGxhbmFyIFlVViA0OjI6MCwgMTVicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIFBJWF9GTVRfWVVWNDIwUDEwTEUsLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAxNWJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgUElYX0ZNVF9ZVVY0MjJQMTBCRSwvLy88IHBsYW5hciBZVVYgNDoyOjIsIDIwYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBQSVhfRk1UX1lVVjQyMlAxMExFLC8vLzwgcGxhbmFyIFlVViA0OjI6MiwgMjBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIFBJWF9GTVRfWVVWNDQ0UDlCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LCAyN2JwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgUElYX0ZNVF9ZVVY0NDRQOUxFLCAvLy88IHBsYW5hciBZVVYgNDo0OjQsIDI3YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBQSVhfRk1UX1lVVjQ0NFAxMEJFLC8vLzwgcGxhbmFyIFlVViA0OjQ6NCwgMzBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIFBJWF9GTVRfWVVWNDQ0UDEwTEUsLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LCAzMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgUElYX0ZNVF9ZVVY0MjJQOUJFLCAvLy88IHBsYW5hciBZVVYgNDoyOjIsIDE4YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBQSVhfRk1UX1lVVjQyMlA5TEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwgMThicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIFBJWF9GTVRfVkRBX1ZMRCwgICAgLy8vPCBoYXJkd2FyZSBkZWNvZGluZyB0aHJvdWdoIFZEQQorCisjaWZkZWYgQVZfUElYX0ZNVF9BQklfR0lUX01BU1RFUgorICAgIFBJWF9GTVRfUkdCQTY0QkUsICAvLy88IHBhY2tlZCBSR0JBIDE2OjE2OjE2OjE2LCA2NGJwcCwgMTZSLCAxNkcsIDE2QiwgMTZBLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CL0EgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBiaWctZW5kaWFuCisgICAgUElYX0ZNVF9SR0JBNjRMRSwgIC8vLzwgcGFja2VkIFJHQkEgMTY6MTY6MTY6MTYsIDY0YnBwLCAxNlIsIDE2RywgMTZCLCAxNkEsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IvQSBjb21wb25lbnQgaXMgc3RvcmVkIGFzIGxpdHRsZS1lbmRpYW4KKyAgICBQSVhfRk1UX0JHUkE2NEJFLCAgLy8vPCBwYWNrZWQgUkdCQSAxNjoxNjoxNjoxNiwgNjRicHAsIDE2QiwgMTZHLCAxNlIsIDE2QSwgdGhlIDItYnl0ZSB2YWx1ZSBmb3IgZWFjaCBSL0cvQi9BIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgYmlnLWVuZGlhbgorICAgIFBJWF9GTVRfQkdSQTY0TEUsICAvLy88IHBhY2tlZCBSR0JBIDE2OjE2OjE2OjE2LCA2NGJwcCwgMTZCLCAxNkcsIDE2UiwgMTZBLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CL0EgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuCisjZW5kaWYKKyAgICBQSVhfRk1UX0dCUlAsICAgICAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0IDI0YnBwCisgICAgUElYX0ZNVF9HQlJQOUJFLCAgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCAyN2JwcCwgYmlnIGVuZGlhbgorICAgIFBJWF9GTVRfR0JSUDlMRSwgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgMjdicHAsIGxpdHRsZSBlbmRpYW4KKyAgICBQSVhfRk1UX0dCUlAxMEJFLCAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0IDMwYnBwLCBiaWcgZW5kaWFuCisgICAgUElYX0ZNVF9HQlJQMTBMRSwgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCAzMGJwcCwgbGl0dGxlIGVuZGlhbgorICAgIFBJWF9GTVRfR0JSUDE2QkUsICAvLy88IHBsYW5hciBHQlIgNDo0OjQgNDhicHAsIGJpZyBlbmRpYW4KKyAgICBQSVhfRk1UX0dCUlAxNkxFLCAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0IDQ4YnBwLCBsaXR0bGUgZW5kaWFuCisKKyNpZm5kZWYgQVZfUElYX0ZNVF9BQklfR0lUX01BU1RFUgorICAgIFBJWF9GTVRfUkdCQTY0QkU9MHgxMjMsICAvLy88IHBhY2tlZCBSR0JBIDE2OjE2OjE2OjE2LCA2NGJwcCwgMTZSLCAxNkcsIDE2QiwgMTZBLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CL0EgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBiaWctZW5kaWFuCisgICAgUElYX0ZNVF9SR0JBNjRMRSwgIC8vLzwgcGFja2VkIFJHQkEgMTY6MTY6MTY6MTYsIDY0YnBwLCAxNlIsIDE2RywgMTZCLCAxNkEsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IvQSBjb21wb25lbnQgaXMgc3RvcmVkIGFzIGxpdHRsZS1lbmRpYW4KKyAgICBQSVhfRk1UX0JHUkE2NEJFLCAgLy8vPCBwYWNrZWQgUkdCQSAxNjoxNjoxNjoxNiwgNjRicHAsIDE2QiwgMTZHLCAxNlIsIDE2QSwgdGhlIDItYnl0ZSB2YWx1ZSBmb3IgZWFjaCBSL0cvQi9BIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgYmlnLWVuZGlhbgorICAgIFBJWF9GTVRfQkdSQTY0TEUsICAvLy88IHBhY2tlZCBSR0JBIDE2OjE2OjE2OjE2LCA2NGJwcCwgMTZCLCAxNkcsIDE2UiwgMTZBLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CL0EgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuCisjZW5kaWYKKyAgICBQSVhfRk1UXzBSR0I9MHgxMjMrNCwgICAgICAvLy88IHBhY2tlZCBSR0IgODo4OjgsIDMyYnBwLCAwUkdCMFJHQi4uLgorICAgIFBJWF9GTVRfUkdCMCwgICAgICAvLy88IHBhY2tlZCBSR0IgODo4OjgsIDMyYnBwLCBSR0IwUkdCMC4uLgorICAgIFBJWF9GTVRfMEJHUiwgICAgICAvLy88IHBhY2tlZCBCR1IgODo4OjgsIDMyYnBwLCAwQkdSMEJHUi4uLgorICAgIFBJWF9GTVRfQkdSMCwgICAgICAvLy88IHBhY2tlZCBCR1IgODo4OjgsIDMyYnBwLCBCR1IwQkdSMC4uLgorICAgIFBJWF9GTVRfWVVWQTQ0NFAsICAvLy88IHBsYW5hciBZVVYgNDo0OjQgMzJicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSAmIEEgc2FtcGxlcykKKyAgICBQSVhfRk1UX1lVVkE0MjJQLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyIDI0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgJiBBIHNhbXBsZXMpCisKKyAgICBQSVhfRk1UX1lVVjQyMFAxMkJFLCAvLy88IHBsYW5hciBZVVYgNDoyOjAsMThicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIFBJWF9GTVRfWVVWNDIwUDEyTEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MCwxOGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgUElYX0ZNVF9ZVVY0MjBQMTRCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLDIxYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBQSVhfRk1UX1lVVjQyMFAxNExFLCAvLy88IHBsYW5hciBZVVYgNDoyOjAsMjFicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIFBJWF9GTVRfWVVWNDIyUDEyQkUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwyNGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgUElYX0ZNVF9ZVVY0MjJQMTJMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLDI0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBQSVhfRk1UX1lVVjQyMlAxNEJFLCAvLy88IHBsYW5hciBZVVYgNDoyOjIsMjhicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIFBJWF9GTVRfWVVWNDIyUDE0TEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwyOGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgUElYX0ZNVF9ZVVY0NDRQMTJCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LDM2YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBQSVhfRk1UX1lVVjQ0NFAxMkxFLCAvLy88IHBsYW5hciBZVVYgNDo0OjQsMzZicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIFBJWF9GTVRfWVVWNDQ0UDE0QkUsIC8vLzwgcGxhbmFyIFlVViA0OjQ6NCw0MmJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgUElYX0ZNVF9ZVVY0NDRQMTRMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LDQyYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBQSVhfRk1UX0dCUlAxMkJFLCAgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgMzZicHAsIGJpZyBlbmRpYW4KKyAgICBQSVhfRk1UX0dCUlAxMkxFLCAgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgMzZicHAsIGxpdHRsZSBlbmRpYW4KKyAgICBQSVhfRk1UX0dCUlAxNEJFLCAgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgNDJicHAsIGJpZyBlbmRpYW4KKyAgICBQSVhfRk1UX0dCUlAxNExFLCAgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgNDJicHAsIGxpdHRsZSBlbmRpYW4KKworICAgIFBJWF9GTVRfTkIsICAgICAgICAvLy88IG51bWJlciBvZiBwaXhlbCBmb3JtYXRzLCBETyBOT1QgVVNFIFRISVMgaWYgeW91IHdhbnQgdG8gbGluayB3aXRoIHNoYXJlZCBsaWJhdiogYmVjYXVzZSB0aGUgbnVtYmVyIG9mIGZvcm1hdHMgbWlnaHQgZGlmZmVyIGJldHdlZW4gdmVyc2lvbnMKKyNlbmRpZiAvKiBBVlVUSUxfT0xEX1BJWF9GTVRTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvb3BlbmNsLmMgYi9mZm1wZWcvbGliYXZ1dGlsL29wZW5jbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Y2I2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL29wZW5jbC5jCkBAIC0wLDAgKzEsODE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFBlbmcgIEdhbyAgICAgPHBlbmdAbXVsdGljb3Jld2FyZWluYy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgTGkgICAgQ2FvICAgICA8bGlAbXVsdGljb3Jld2FyZWluYy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgV2VpICAgR2FvICAgICA8d2VpZ2FvQG11bHRpY29yZXdhcmVpbmMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIExlbm55IFdhbmcgICAgPGx3YW5naHBjQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgIm9wZW5jbC5oIgorI2luY2x1ZGUgImF2c3RyaW5nLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJvcHQuaCIKKworI2lmIEhBVkVfVEhSRUFEUworI2lmIEhBVkVfUFRIUkVBRFMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZWxpZiBIQVZFX1czMlRIUkVBRFMKKyNpbmNsdWRlICJjb21wYXQvdzMycHRocmVhZHMuaCIKKyNlbGlmIEhBVkVfT1MyVEhSRUFEUworI2luY2x1ZGUgImNvbXBhdC9vczJ0aHJlYWRzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJhdG9taWMuaCIKKworc3RhdGljIHZvbGF0aWxlIHB0aHJlYWRfbXV0ZXhfdCAqYXRvbWljX29wZW5jbF9sb2NrID0gTlVMTDsKKyNkZWZpbmUgTE9DS19PUEVOQ0wgcHRocmVhZF9tdXRleF9sb2NrKGF0b21pY19vcGVuY2xfbG9jaykKKyNkZWZpbmUgVU5MT0NLX09QRU5DTCBwdGhyZWFkX211dGV4X3VubG9jayhhdG9taWNfb3BlbmNsX2xvY2spCisjZWxzZQorI2RlZmluZSBMT0NLX09QRU5DTAorI2RlZmluZSBVTkxPQ0tfT1BFTkNMCisjZW5kaWYKKworI2RlZmluZSBNQVhfS0VSTkVMX0NPREVfTlVNIDIwMAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGlzX2NvbXBpbGVkOworICAgIGNvbnN0IGNoYXIgKmtlcm5lbF9zdHJpbmc7Cit9IEtlcm5lbENvZGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgbG9nX29mZnNldDsKKyAgICB2b2lkICpsb2dfY3R4OworICAgIGludCBpbml0X2NvdW50OworICAgIGludCBvcHRfaW5pdF9mbGFnOworICAgICAvKioKKyAgICAgKiBpZiBzZXQgdG8gMSwgdGhlIE9wZW5DTCBlbnZpcm9ubWVudCB3YXMgY3JlYXRlZCBieSB0aGUgdXNlciBhbmQKKyAgICAgKiBwYXNzZWQgYXMgQVZPcGVuQ0xFeHRlcm5hbEVudiB3aGVuIGluaXRpbmcgLDA6Y3JlYXRlZCBieSBvcGVuY2wgd3JhcHBlci4KKyAgICAgKi8KKyAgICBpbnQgaXNfdXNlcl9jcmVhdGVkOworICAgIGludCBwbGF0Zm9ybV9pZHg7CisgICAgaW50IGRldmljZV9pZHg7CisgICAgY2xfcGxhdGZvcm1faWQgcGxhdGZvcm1faWQ7CisgICAgY2xfZGV2aWNlX3R5cGUgZGV2aWNlX3R5cGU7CisgICAgY2xfY29udGV4dCBjb250ZXh0OworICAgIGNsX2RldmljZV9pZCBkZXZpY2VfaWQ7CisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlOworICAgIGludCBrZXJuZWxfY29kZV9jb3VudDsKKyAgICBLZXJuZWxDb2RlIGtlcm5lbF9jb2RlW01BWF9LRVJORUxfQ09ERV9OVU1dOworICAgIEFWT3BlbkNMRGV2aWNlTGlzdCBkZXZpY2VfbGlzdDsKK30gT3BlbmNsQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoT3BlbmNsQ29udGV4dCwgeCkKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wZW5jbF9vcHRpb25zW10gPSB7CisgICAgIHsgInBsYXRmb3JtX2lkeCIsICAgICAgICAic2V0IHBsYXRmb3JtIGluZGV4IHZhbHVlIiwgIE9GRlNFVChwbGF0Zm9ybV9pZHgpLCAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND0tMX0sIC0xLCBJTlRfTUFYfSwKKyAgICAgeyAiZGV2aWNlX2lkeCIsICAgICAgICAgICJzZXQgZGV2aWNlIGluZGV4IHZhbHVlIiwgICAgT0ZGU0VUKGRldmljZV9pZHgpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PS0xfSwgLTEsIElOVF9NQVh9LAorICAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgb3BlbmNsdXRpbHNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgICAgICAgICAgICAgICAgPSAiT1BFTkNMVVRJTFMiLAorICAgIC5vcHRpb24gICAgICAgICAgICAgICAgICAgID0gb3BlbmNsX29wdGlvbnMsCisgICAgLml0ZW1fbmFtZSAgICAgICAgICAgICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAudmVyc2lvbiAgICAgICAgICAgICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAubG9nX2xldmVsX29mZnNldF9vZmZzZXQgICA9IG9mZnNldG9mKE9wZW5jbENvbnRleHQsIGxvZ19vZmZzZXQpLAorICAgIC5wYXJlbnRfbG9nX2NvbnRleHRfb2Zmc2V0ID0gb2Zmc2V0b2YoT3BlbmNsQ29udGV4dCwgbG9nX2N0eCksCit9OworCitzdGF0aWMgT3BlbmNsQ29udGV4dCBvcGVuY2xfY3R4ID0geyZvcGVuY2x1dGlsc19jbGFzc307CisKK3N0YXRpYyBjb25zdCBjbF9kZXZpY2VfdHlwZSBkZXZpY2VfdHlwZVtdID0ge0NMX0RFVklDRV9UWVBFX0dQVSwgQ0xfREVWSUNFX1RZUEVfQ1BVfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBlcnJfY29kZTsKKyAgICBjb25zdCBjaGFyICplcnJfc3RyOworfSBPcGVuY2xFcnJvck1zZzsKKworc3RhdGljIGNvbnN0IE9wZW5jbEVycm9yTXNnIG9wZW5jbF9lcnJfbXNnW10gPSB7CisgICAge0NMX0RFVklDRV9OT1RfRk9VTkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJERVZJQ0UgTk9UIEZPVU5EIn0sCisgICAge0NMX0RFVklDRV9OT1RfQVZBSUxBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICJERVZJQ0UgTk9UIEFWQUlMQUJMRSJ9LAorICAgIHtDTF9DT01QSUxFUl9OT1RfQVZBSUxBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgICAiQ09NUElMRVIgTk9UIEFWQUlMQUJMRSJ9LAorICAgIHtDTF9NRU1fT0JKRUNUX0FMTE9DQVRJT05fRkFJTFVSRSwgICAgICAgICAgICAgICAgICAiTUVNIE9CSkVDVCBBTExPQ0FUSU9OIEZBSUxVUkUifSwKKyAgICB7Q0xfT1VUX09GX1JFU09VUkNFUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9VVCBPRiBSRVNPVVJDRVMifSwKKyAgICB7Q0xfT1VUX09GX0hPU1RfTUVNT1JZLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9VVCBPRiBIT1NUIE1FTU9SWSJ9LAorICAgIHtDTF9QUk9GSUxJTkdfSU5GT19OT1RfQVZBSUxBQkxFLCAgICAgICAgICAgICAgICAgICAiUFJPRklMSU5HIElORk8gTk9UIEFWQUlMQUJMRSJ9LAorICAgIHtDTF9NRU1fQ09QWV9PVkVSTEFQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUVNIENPUFkgT1ZFUkxBUCJ9LAorICAgIHtDTF9JTUFHRV9GT1JNQVRfTUlTTUFUQ0gsICAgICAgICAgICAgICAgICAgICAgICAgICAiSU1BR0UgRk9STUFUIE1JU01BVENIIn0sCisgICAge0NMX0lNQUdFX0ZPUk1BVF9OT1RfU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICJJTUFHRSBGT1JNQVQgTk9UX1NVUFBPUlRFRCJ9LAorICAgIHtDTF9CVUlMRF9QUk9HUkFNX0ZBSUxVUkUsICAgICAgICAgICAgICAgICAgICAgICAgICAiQlVJTEQgUFJPR1JBTSBGQUlMVVJFIn0sCisgICAge0NMX01BUF9GQUlMVVJFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNQVAgRkFJTFVSRSJ9LAorICAgIHtDTF9NSVNBTElHTkVEX1NVQl9CVUZGRVJfT0ZGU0VULCAgICAgICAgICAgICAgICAgICAiTUlTQUxJR05FRCBTVUIgQlVGRkVSIE9GRlNFVCJ9LAorICAgIHtDTF9FWEVDX1NUQVRVU19FUlJPUl9GT1JfRVZFTlRTX0lOX1dBSVRfTElTVCwgICAgICAiRVhFQyBTVEFUVVMgRVJST1IgRk9SIEVWRU5UUyBJTiBXQUlUIExJU1QifSwKKyAgICB7Q0xfQ09NUElMRV9QUk9HUkFNX0ZBSUxVUkUsICAgICAgICAgICAgICAgICAgICAgICAgIkNPTVBJTEUgUFJPR1JBTSBGQUlMVVJFIn0sCisgICAge0NMX0xJTktFUl9OT1RfQVZBSUxBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICJMSU5LRVIgTk9UIEFWQUlMQUJMRSJ9LAorICAgIHtDTF9MSU5LX1BST0dSQU1fRkFJTFVSRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAiTElOSyBQUk9HUkFNIEZBSUxVUkUifSwKKyAgICB7Q0xfREVWSUNFX1BBUlRJVElPTl9GQUlMRUQsICAgICAgICAgICAgICAgICAgICAgICAgIkRFVklDRSBQQVJUSVRJT04gRkFJTEVEIn0sCisgICAge0NMX0tFUk5FTF9BUkdfSU5GT19OT1RfQVZBSUxBQkxFLCAgICAgICAgICAgICAgICAgICJLRVJORUwgQVJHIElORk8gTk9UIEFWQUlMQUJMRSJ9LAorICAgIHtDTF9JTlZBTElEX1ZBTFVFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBWQUxVRSJ9LAorICAgIHtDTF9JTlZBTElEX0RFVklDRV9UWVBFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBERVZJQ0UgVFlQRSJ9LAorICAgIHtDTF9JTlZBTElEX1BMQVRGT1JNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBQTEFURk9STSJ9LAorICAgIHtDTF9JTlZBTElEX0RFVklDRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBERVZJQ0UifSwKKyAgICB7Q0xfSU5WQUxJRF9DT05URVhULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgQ09OVEVYVCJ9LAorICAgIHtDTF9JTlZBTElEX1FVRVVFX1BST1BFUlRJRVMsICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBRVUVVRSBQUk9QRVJUSUVTIn0sCisgICAge0NMX0lOVkFMSURfQ09NTUFORF9RVUVVRSwgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIENPTU1BTkQgUVVFVUUifSwKKyAgICB7Q0xfSU5WQUxJRF9IT1NUX1BUUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgSE9TVCBQVFIifSwKKyAgICB7Q0xfSU5WQUxJRF9NRU1fT0JKRUNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgTUVNIE9CSkVDVCJ9LAorICAgIHtDTF9JTlZBTElEX0lNQUdFX0ZPUk1BVF9ERVNDUklQVE9SLCAgICAgICAgICAgICAgICAiSU5WQUxJRCBJTUFHRSBGT1JNQVQgREVTQ1JJUFRPUiJ9LAorICAgIHtDTF9JTlZBTElEX0lNQUdFX1NJWkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBJTUFHRSBTSVpFIn0sCisgICAge0NMX0lOVkFMSURfU0FNUExFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIFNBTVBMRVIifSwKKyAgICB7Q0xfSU5WQUxJRF9CSU5BUlksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgQklOQVJZIn0sCisgICAge0NMX0lOVkFMSURfQlVJTERfT1BUSU9OUywgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIEJVSUxEIE9QVElPTlMifSwKKyAgICB7Q0xfSU5WQUxJRF9QUk9HUkFNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgUFJPR1JBTSJ9LAorICAgIHtDTF9JTlZBTElEX1BST0dSQU1fRVhFQ1VUQUJMRSwgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBQUk9HUkFNIEVYRUNVVEFCTEUifSwKKyAgICB7Q0xfSU5WQUxJRF9LRVJORUxfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgS0VSTkVMIE5BTUUifSwKKyAgICB7Q0xfSU5WQUxJRF9LRVJORUxfREVGSU5JVElPTiwgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgS0VSTkVMIERFRklOSVRJT04ifSwKKyAgICB7Q0xfSU5WQUxJRF9LRVJORUwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgS0VSTkVMIn0sCisgICAge0NMX0lOVkFMSURfQVJHX0lOREVYLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIEFSRyBJTkRFWCJ9LAorICAgIHtDTF9JTlZBTElEX0FSR19WQUxVRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBBUkcgVkFMVUUifSwKKyAgICB7Q0xfSU5WQUxJRF9BUkdfU0laRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgQVJHX1NJWkUifSwKKyAgICB7Q0xfSU5WQUxJRF9LRVJORUxfQVJHUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgS0VSTkVMIEFSR1MifSwKKyAgICB7Q0xfSU5WQUxJRF9XT1JLX0RJTUVOU0lPTiwgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgV09SSyBESU1FTlNJT04ifSwKKyAgICB7Q0xfSU5WQUxJRF9XT1JLX0dST1VQX1NJWkUsICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgV09SSyBHUk9VUCBTSVpFIn0sCisgICAge0NMX0lOVkFMSURfV09SS19JVEVNX1NJWkUsICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIFdPUksgSVRFTSBTSVpFIn0sCisgICAge0NMX0lOVkFMSURfR0xPQkFMX09GRlNFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIEdMT0JBTCBPRkZTRVQifSwKKyAgICB7Q0xfSU5WQUxJRF9FVkVOVF9XQUlUX0xJU1QsICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgRVZFTlQgV0FJVCBMSVNUIn0sCisgICAge0NMX0lOVkFMSURfRVZFTlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIEVWRU5UIn0sCisgICAge0NMX0lOVkFMSURfT1BFUkFUSU9OLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIE9QRVJBVElPTiJ9LAorICAgIHtDTF9JTlZBTElEX0dMX09CSkVDVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBHTCBPQkpFQ1QifSwKKyAgICB7Q0xfSU5WQUxJRF9CVUZGRVJfU0laRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgQlVGRkVSIFNJWkUifSwKKyAgICB7Q0xfSU5WQUxJRF9NSVBfTEVWRUwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgTUlQIExFVkVMIn0sCisgICAge0NMX0lOVkFMSURfR0xPQkFMX1dPUktfU0laRSwgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIEdMT0JBTCBXT1JLIFNJWkUifSwKKyAgICB7Q0xfSU5WQUxJRF9QUk9QRVJUWSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgUFJPUEVSVFkifSwKKyAgICB7Q0xfSU5WQUxJRF9JTUFHRV9ERVNDUklQVE9SLCAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgSU1BR0UgREVTQ1JJUFRPUiJ9LAorICAgIHtDTF9JTlZBTElEX0NPTVBJTEVSX09QVElPTlMsICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBDT01QSUxFUiBPUFRJT05TIn0sCisgICAge0NMX0lOVkFMSURfTElOS0VSX09QVElPTlMsICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIExJTktFUiBPUFRJT05TIn0sCisgICAge0NMX0lOVkFMSURfREVWSUNFX1BBUlRJVElPTl9DT1VOVCwgICAgICAgICAgICAgICAgICJJTlZBTElEIERFVklDRSBQQVJUSVRJT04gQ09VTlQifSwKK307CisKK2NvbnN0IGNoYXIgKmF2X29wZW5jbF9lcnJzdHIoY2xfaW50IHN0YXR1cykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMob3BlbmNsX2Vycl9tc2cpOyBpKyspIHsKKyAgICAgICAgaWYgKG9wZW5jbF9lcnJfbXNnW2ldLmVycl9jb2RlID09IHN0YXR1cykKKyAgICAgICAgICAgIHJldHVybiBvcGVuY2xfZXJyX21zZ1tpXS5lcnJfc3RyOworICAgIH0KKyAgICByZXR1cm4gInVua25vd24gZXJyb3IiOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2RldmljZV9saXN0KEFWT3BlbkNMRGV2aWNlTGlzdCAqZGV2aWNlX2xpc3QpCit7CisgICAgaW50IGksIGo7CisgICAgaWYgKCFkZXZpY2VfbGlzdCkKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAoaSA9IDA7IGkgPCBkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbnVtOyBpKyspIHsKKyAgICAgICAgaWYgKCFkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPmRldmljZV9udW07IGorKykgeworICAgICAgICAgICAgYXZfZnJlZXAoJihkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXS0+ZGV2aWNlX25vZGVbal0pKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPmRldmljZV9ub2RlKTsKKyAgICAgICAgYXZfZnJlZXAoJmRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlKTsKKyAgICBkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbnVtID0gMDsKK30KKworc3RhdGljIGludCBnZXRfZGV2aWNlX2xpc3QoQVZPcGVuQ0xEZXZpY2VMaXN0ICpkZXZpY2VfbGlzdCkKK3sKKyAgICBjbF9pbnQgc3RhdHVzOworICAgIGludCBpLCBqLCBrLCBkZXZpY2VfbnVtLCB0b3RhbF9kZXZpY2VzX251bSwgcmV0ID0gMDsKKyAgICBpbnQgKmRldmljZXNfbnVtOworICAgIGNsX3BsYXRmb3JtX2lkICpwbGF0Zm9ybV9pZHMgPSBOVUxMOworICAgIGNsX2RldmljZV9pZCAqZGV2aWNlX2lkcyA9IE5VTEw7CisgICAgQVZPcGVuQ0xEZXZpY2VOb2RlICpkZXZpY2Vfbm9kZSA9IE5VTEw7CisgICAgc3RhdHVzID0gY2xHZXRQbGF0Zm9ybUlEcygwLCBOVUxMLCAmZGV2aWNlX2xpc3QtPnBsYXRmb3JtX251bSk7CisgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgT3BlbkNMIHBsYXRmb3JtIGlkczogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyAgICBwbGF0Zm9ybV9pZHMgPSBhdl9tYWxsb2N6X2FycmF5KGRldmljZV9saXN0LT5wbGF0Zm9ybV9udW0sIHNpemVvZihjbF9wbGF0Zm9ybV9pZCkpOworICAgIGlmICghcGxhdGZvcm1faWRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0YXR1cyA9IGNsR2V0UGxhdGZvcm1JRHMoZGV2aWNlX2xpc3QtPnBsYXRmb3JtX251bSwgcGxhdGZvcm1faWRzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgT3BlbkNMIHBsYXRmb3JtIGlkczogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZSA9IGF2X21hbGxvY3pfYXJyYXkoZGV2aWNlX2xpc3QtPnBsYXRmb3JtX251bSwgc2l6ZW9mKEFWT3BlbkNMUGxhdGZvcm1Ob2RlICopKTsKKyAgICBpZiAoIWRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGRldmljZXNfbnVtID0gYXZfbWFsbG9jeihzaXplb2YoaW50KSAqIEZGX0FSUkFZX0VMRU1TKGRldmljZV90eXBlKSk7CisgICAgaWYgKCFkZXZpY2VzX251bSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX251bTsgaSsrKSB7CisgICAgICAgIGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldID0gYXZfbWFsbG9jeihzaXplb2YoQVZPcGVuQ0xQbGF0Zm9ybU5vZGUpKTsKKyAgICAgICAgaWYgKCFkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPnBsYXRmb3JtX2lkID0gcGxhdGZvcm1faWRzW2ldOworICAgICAgICBzdGF0dXMgPSBjbEdldFBsYXRmb3JtSW5mbyhwbGF0Zm9ybV9pZHNbaV0sIENMX1BMQVRGT1JNX1ZFTkRPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5wbGF0Zm9ybV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPnBsYXRmb3JtX25hbWUsIE5VTEwpOworICAgICAgICB0b3RhbF9kZXZpY2VzX251bSA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBGRl9BUlJBWV9FTEVNUyhkZXZpY2VfdHlwZSk7IGorKykgeworICAgICAgICAgICAgc3RhdHVzID0gY2xHZXREZXZpY2VJRHMoZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPnBsYXRmb3JtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3R5cGVbal0sIDAsIE5VTEwsICZkZXZpY2VzX251bVtqXSk7CisgICAgICAgICAgICB0b3RhbF9kZXZpY2VzX251bSArPSBkZXZpY2VzX251bVtqXTsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXS0+ZGV2aWNlX25vZGUgPSBhdl9tYWxsb2N6X2FycmF5KHRvdGFsX2RldmljZXNfbnVtLCBzaXplb2YoQVZPcGVuQ0xEZXZpY2VOb2RlICopKTsKKyAgICAgICAgaWYgKCFkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXS0+ZGV2aWNlX25vZGUpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBGRl9BUlJBWV9FTEVNUyhkZXZpY2VfdHlwZSk7IGorKykgeworICAgICAgICAgICAgaWYgKGRldmljZXNfbnVtW2pdKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlX2lkcyA9IGF2X21hbGxvY3pfYXJyYXkoZGV2aWNlc19udW1bal0sIHNpemVvZihjbF9kZXZpY2VfaWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9pZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY2xHZXREZXZpY2VJRHMoZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPnBsYXRmb3JtX2lkLCBkZXZpY2VfdHlwZVtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzX251bVtqXSwgZGV2aWNlX2lkcywgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgZGV2aWNlIElEOiAlczpcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZkZXZpY2VfaWRzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBkZXZpY2VzX251bVtqXTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZV9udW0gPSBkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXS0+ZGV2aWNlX251bTsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPmRldmljZV9ub2RlW2RldmljZV9udW1dID0gYXZfbWFsbG9jeihzaXplb2YoQVZPcGVuQ0xEZXZpY2VOb2RlKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPmRldmljZV9ub2RlW2RldmljZV9udW1dKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfbm9kZSA9IGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5kZXZpY2Vfbm9kZVtkZXZpY2VfbnVtXTsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25vZGUtPmRldmljZV9pZCA9IGRldmljZV9pZHNba107CisgICAgICAgICAgICAgICAgICAgIGRldmljZV9ub2RlLT5kZXZpY2VfdHlwZSA9IGRldmljZV90eXBlW2pdOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjbEdldERldmljZUluZm8oZGV2aWNlX25vZGUtPmRldmljZV9pZCwgQ0xfREVWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGV2aWNlX25vZGUtPmRldmljZV9uYW1lKSwgZGV2aWNlX25vZGUtPmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgZGV2aWNlIG5hbWU6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPmRldmljZV9udW0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmRldmljZV9pZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorZW5kOgorICAgIGF2X2ZyZWVwKCZwbGF0Zm9ybV9pZHMpOworICAgIGF2X2ZyZWVwKCZkZXZpY2VzX251bSk7CisgICAgYXZfZnJlZXAoJmRldmljZV9pZHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBmcmVlX2RldmljZV9saXN0KGRldmljZV9saXN0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZfb3BlbmNsX2dldF9kZXZpY2VfbGlzdChBVk9wZW5DTERldmljZUxpc3QgKipkZXZpY2VfbGlzdCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICAqZGV2aWNlX2xpc3QgPSBhdl9tYWxsb2N6KHNpemVvZihBVk9wZW5DTERldmljZUxpc3QpKTsKKyAgICBpZiAoISgqZGV2aWNlX2xpc3QpKSB7CisgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIG9wZW5jbCBkZXZpY2UgbGlzdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHJldCA9IGdldF9kZXZpY2VfbGlzdCgqZGV2aWNlX2xpc3QpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGdldCBkZXZpY2UgbGlzdCBmcm9tIGVudmlyb25tZW50XG4iKTsKKyAgICAgICAgZnJlZV9kZXZpY2VfbGlzdCgqZGV2aWNlX2xpc3QpOworICAgICAgICBhdl9mcmVlcChkZXZpY2VfbGlzdCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXZfb3BlbmNsX2ZyZWVfZGV2aWNlX2xpc3QoQVZPcGVuQ0xEZXZpY2VMaXN0ICoqZGV2aWNlX2xpc3QpCit7CisgICAgZnJlZV9kZXZpY2VfbGlzdCgqZGV2aWNlX2xpc3QpOworICAgIGF2X2ZyZWVwKGRldmljZV9saXN0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW5pdF9vcGVuY2xfbXR4KHZvaWQpCit7CisjaWYgSEFWRV9USFJFQURTCisgICAgaWYgKCFhdG9taWNfb3BlbmNsX2xvY2spIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgcHRocmVhZF9tdXRleF90ICp0bXAgPSBhdl9tYWxsb2Moc2l6ZW9mKHB0aHJlYWRfbXV0ZXhfdCkpOworICAgICAgICBpZiAoIXRtcCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGlmICgoZXJyID0gcHRocmVhZF9tdXRleF9pbml0KHRtcCwgTlVMTCkpKSB7CisgICAgICAgICAgICBhdl9mcmVlKHRtcCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihlcnIpOworICAgICAgICB9CisgICAgICAgIGlmIChhdnByaXZfYXRvbWljX3B0cl9jYXMoJmF0b21pY19vcGVuY2xfbG9jaywgTlVMTCwgdG1wKSkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KHRtcCk7CisgICAgICAgICAgICBhdl9mcmVlKHRtcCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X29wZW5jbF9zZXRfb3B0aW9uKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreworICAgIGludCByZXQgPSBpbml0X29wZW5jbF9tdHgoICk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgTE9DS19PUEVOQ0w7CisgICAgaWYgKCFvcGVuY2xfY3R4Lm9wdF9pbml0X2ZsYWcpIHsKKyAgICAgICAgYXZfb3B0X3NldF9kZWZhdWx0cygmb3BlbmNsX2N0eCk7CisgICAgICAgIG9wZW5jbF9jdHgub3B0X2luaXRfZmxhZyA9IDE7CisgICAgfQorICAgIHJldCA9IGF2X29wdF9zZXQoJm9wZW5jbF9jdHgsIGtleSwgdmFsLCAwKTsKKyAgICBVTkxPQ0tfT1BFTkNMOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBhdl9vcGVuY2xfZ2V0X29wdGlvbihjb25zdCBjaGFyICprZXksIHVpbnQ4X3QgKipvdXRfdmFsKQoreworICAgIGludCByZXQgPSAwOworICAgIExPQ0tfT1BFTkNMOworICAgIHJldCA9IGF2X29wdF9nZXQoJm9wZW5jbF9jdHgsIGtleSwgMCwgb3V0X3ZhbCk7CisgICAgVU5MT0NLX09QRU5DTDsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGF2X29wZW5jbF9mcmVlX29wdGlvbih2b2lkKQoreworICAgIC8qRklYTUU6IGZyZWUgb3BlbmNsdXRpbHMgY29udGV4dCovCisgICAgTE9DS19PUEVOQ0w7CisgICAgYXZfb3B0X2ZyZWUoJm9wZW5jbF9jdHgpOworICAgIFVOTE9DS19PUEVOQ0w7Cit9CisKK0FWT3BlbkNMRXh0ZXJuYWxFbnYgKmF2X29wZW5jbF9hbGxvY19leHRlcm5hbF9lbnYodm9pZCkKK3sKKyAgICBBVk9wZW5DTEV4dGVybmFsRW52ICpleHQgPSBhdl9tYWxsb2N6KHNpemVvZihBVk9wZW5DTEV4dGVybmFsRW52KSk7CisgICAgaWYgKCFleHQpIHsKKyAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ291bGQgbm90IG1hbGxvYyBleHRlcm5hbCBvcGVuY2wgZW52aXJvbm1lbnQgZGF0YSBzcGFjZVxuIik7CisgICAgfQorICAgIHJldHVybiBleHQ7Cit9CisKK3ZvaWQgYXZfb3BlbmNsX2ZyZWVfZXh0ZXJuYWxfZW52KEFWT3BlbkNMRXh0ZXJuYWxFbnYgKipleHRfb3BlbmNsX2VudikKK3sKKyAgICBhdl9mcmVlcChleHRfb3BlbmNsX2Vudik7Cit9CisKK2ludCBhdl9vcGVuY2xfcmVnaXN0ZXJfa2VybmVsX2NvZGUoY29uc3QgY2hhciAqa2VybmVsX2NvZGUpCit7CisgICAgaW50IGksIHJldCA9IGluaXRfb3BlbmNsX210eCggKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBMT0NLX09QRU5DTDsKKyAgICBpZiAob3BlbmNsX2N0eC5rZXJuZWxfY29kZV9jb3VudCA+PSBNQVhfS0VSTkVMX0NPREVfTlVNKSB7CisgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZWdpc3RlciBrZXJuZWwgY29kZSwgbWF4aW11bSBudW1iZXIgb2YgcmVnaXN0ZXJlZCBrZXJuZWwgY29kZSAlZCBhbHJlYWR5IHJlYWNoZWRcbiIsCisgICAgICAgICAgICAgICBNQVhfS0VSTkVMX0NPREVfTlVNKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG9wZW5jbF9jdHgua2VybmVsX2NvZGVfY291bnQ7IGkrKykgeworICAgICAgICBpZiAob3BlbmNsX2N0eC5rZXJuZWxfY29kZVtpXS5rZXJuZWxfc3RyaW5nID09IGtlcm5lbF9jb2RlKSB7CisgICAgICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19XQVJOSU5HLCAiU2FtZSBrZXJuZWwgY29kZSBoYXMgYmVlbiByZWdpc3RlcmVkXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorICAgIG9wZW5jbF9jdHgua2VybmVsX2NvZGVbb3BlbmNsX2N0eC5rZXJuZWxfY29kZV9jb3VudF0ua2VybmVsX3N0cmluZyA9IGtlcm5lbF9jb2RlOworICAgIG9wZW5jbF9jdHgua2VybmVsX2NvZGVbb3BlbmNsX2N0eC5rZXJuZWxfY29kZV9jb3VudF0uaXNfY29tcGlsZWQgPSAwOworICAgIG9wZW5jbF9jdHgua2VybmVsX2NvZGVfY291bnQrKzsKK2VuZDoKKyAgICBVTkxPQ0tfT1BFTkNMOworICAgIHJldHVybiByZXQ7Cit9CisKK2NsX3Byb2dyYW0gYXZfb3BlbmNsX2NvbXBpbGUoY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lLCBjb25zdCBjaGFyICpidWlsZF9vcHRzKQoreworICAgIGludCBpOworICAgIGNsX2ludCBzdGF0dXM7CisgICAgaW50IGtlcm5lbF9jb2RlX2lkeCA9IDA7CisgICAgY29uc3QgY2hhciAqa2VybmVsX3NvdXJjZTsKKyAgICBzaXplX3Qga2VybmVsX2NvZGVfbGVuOworICAgIGNoYXIqIHB0ciA9IE5VTEw7CisgICAgY2xfcHJvZ3JhbSBwcm9ncmFtID0gTlVMTDsKKworICAgIExPQ0tfT1BFTkNMOworICAgIGZvciAoaSA9IDA7IGkgPCBvcGVuY2xfY3R4Lmtlcm5lbF9jb2RlX2NvdW50OyBpKyspIHsKKyAgICAgICAgLy8gaWRlbnRpZnkgYSBwcm9ncmFtIHVzaW5nIGEgdW5pcXVlIG5hbWUgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlCisgICAgICAgIHB0ciA9IGF2X3N0cmlzdHIob3BlbmNsX2N0eC5rZXJuZWxfY29kZVtpXS5rZXJuZWxfc3RyaW5nLCBwcm9ncmFtX25hbWUpOworICAgICAgICBpZiAocHRyICYmICFvcGVuY2xfY3R4Lmtlcm5lbF9jb2RlW2ldLmlzX2NvbXBpbGVkKSB7CisgICAgICAgICAgICBrZXJuZWxfc291cmNlID0gb3BlbmNsX2N0eC5rZXJuZWxfY29kZVtpXS5rZXJuZWxfc3RyaW5nOworICAgICAgICAgICAga2VybmVsX2NvZGVfbGVuID0gc3RybGVuKG9wZW5jbF9jdHgua2VybmVsX2NvZGVbaV0ua2VybmVsX3N0cmluZyk7CisgICAgICAgICAgICBrZXJuZWxfY29kZV9pZHggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFrZXJuZWxfc291cmNlKSB7CisgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIE9wZW5DTCBrZXJuZWwgc291cmNlICclcydcbiIsIHByb2dyYW1fbmFtZSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8qIGNyZWF0ZSBhIENMIHByb2dyYW0gZnJvbSBrZXJuZWwgc291cmNlICovCisgICAgcHJvZ3JhbSA9IGNsQ3JlYXRlUHJvZ3JhbVdpdGhTb3VyY2Uob3BlbmNsX2N0eC5jb250ZXh0LCAxLCAma2VybmVsX3NvdXJjZSwgJmtlcm5lbF9jb2RlX2xlbiwgJnN0YXR1cyk7CisgICAgaWYoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBPcGVuQ0wgcHJvZ3JhbSAnJXMnOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOworICAgICAgICBwcm9ncmFtID0gTlVMTDsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIHN0YXR1cyA9IGNsQnVpbGRQcm9ncmFtKHByb2dyYW0sIDEsICYob3BlbmNsX2N0eC5kZXZpY2VfaWQpLCBidWlsZF9vcHRzLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ29tcGlsYXRpb24gZmFpbGVkIHdpdGggT3BlbkNMIHByb2dyYW06ICVzXG4iLCBwcm9ncmFtX25hbWUpOworICAgICAgICBwcm9ncmFtID0gTlVMTDsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgb3BlbmNsX2N0eC5rZXJuZWxfY29kZVtrZXJuZWxfY29kZV9pZHhdLmlzX2NvbXBpbGVkID0gMTsKK2VuZDoKKyAgICBVTkxPQ0tfT1BFTkNMOworICAgIHJldHVybiBwcm9ncmFtOworfQorCitjbF9jb21tYW5kX3F1ZXVlIGF2X29wZW5jbF9nZXRfY29tbWFuZF9xdWV1ZSh2b2lkKQoreworICAgIHJldHVybiBvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWU7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9vcGVuY2xfZW52KE9wZW5jbENvbnRleHQgKm9wZW5jbF9jdHgsIEFWT3BlbkNMRXh0ZXJuYWxFbnYgKmV4dF9vcGVuY2xfZW52KQoreworICAgIGNsX2ludCBzdGF0dXM7CisgICAgY2xfY29udGV4dF9wcm9wZXJ0aWVzIGNwc1szXTsKKyAgICBpbnQgaSwgcmV0ID0gMDsKKyAgICBBVk9wZW5DTERldmljZU5vZGUgKmRldmljZV9ub2RlID0gTlVMTDsKKworICAgIGlmIChleHRfb3BlbmNsX2VudikgeworICAgICAgICBpZiAob3BlbmNsX2N0eC0+aXNfdXNlcl9jcmVhdGVkKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG9wZW5jbF9jdHgtPnBsYXRmb3JtX2lkICAgICA9IGV4dF9vcGVuY2xfZW52LT5wbGF0Zm9ybV9pZDsKKyAgICAgICAgb3BlbmNsX2N0eC0+aXNfdXNlcl9jcmVhdGVkID0gMTsKKyAgICAgICAgb3BlbmNsX2N0eC0+Y29tbWFuZF9xdWV1ZSAgID0gZXh0X29wZW5jbF9lbnYtPmNvbW1hbmRfcXVldWU7CisgICAgICAgIG9wZW5jbF9jdHgtPmNvbnRleHQgICAgICAgICA9IGV4dF9vcGVuY2xfZW52LT5jb250ZXh0OworICAgICAgICBvcGVuY2xfY3R4LT5kZXZpY2VfaWQgICAgICAgPSBleHRfb3BlbmNsX2Vudi0+ZGV2aWNlX2lkOworICAgICAgICBvcGVuY2xfY3R4LT5kZXZpY2VfdHlwZSAgICAgPSBleHRfb3BlbmNsX2Vudi0+ZGV2aWNlX3R5cGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFvcGVuY2xfY3R4LT5pc191c2VyX2NyZWF0ZWQpIHsKKyAgICAgICAgICAgIGlmICghb3BlbmNsX2N0eC0+ZGV2aWNlX2xpc3QucGxhdGZvcm1fbnVtKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZ2V0X2RldmljZV9saXN0KCZvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3BlbmNsX2N0eC0+cGxhdGZvcm1faWR4ID49IDApIHsKKyAgICAgICAgICAgICAgICBpZiAob3BlbmNsX2N0eC0+ZGV2aWNlX2xpc3QucGxhdGZvcm1fbnVtIDwgb3BlbmNsX2N0eC0+cGxhdGZvcm1faWR4ICsgMSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cob3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLCAiVXNlciBzZXQgcGxhdGZvcm0gaW5kZXggbm90IGV4aXN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdC5wbGF0Zm9ybV9ub2RlW29wZW5jbF9jdHgtPnBsYXRmb3JtX2lkeF0tPmRldmljZV9udW0pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwgIk5vIGRldmljZXMgaW4gdXNlciBzcGVjaWZpYyBwbGF0Zm9ybSB3aXRoIGluZGV4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmNsX2N0eC0+cGxhdGZvcm1faWR4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3BlbmNsX2N0eC0+cGxhdGZvcm1faWQgPSBvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdC5wbGF0Zm9ybV9ub2RlW29wZW5jbF9jdHgtPnBsYXRmb3JtX2lkeF0tPnBsYXRmb3JtX2lkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBnZXQgYSB1c2FibGUgcGxhdGZvcm0gYnkgZGVmYXVsdCovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9wZW5jbF9jdHgtPmRldmljZV9saXN0LnBsYXRmb3JtX251bTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdC5wbGF0Zm9ybV9ub2RlW2ldLT5kZXZpY2VfbnVtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGVuY2xfY3R4LT5wbGF0Zm9ybV9pZCA9IG9wZW5jbF9jdHgtPmRldmljZV9saXN0LnBsYXRmb3JtX25vZGVbaV0tPnBsYXRmb3JtX2lkOworICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmNsX2N0eC0+cGxhdGZvcm1faWR4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFvcGVuY2xfY3R4LT5wbGF0Zm9ybV9pZCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZ2V0IE9wZW5DTCBwbGF0Zm9ybXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZ2V0IGEgdXNhYmxlIGRldmljZSovCisgICAgICAgICAgICBpZiAob3BlbmNsX2N0eC0+ZGV2aWNlX2lkeCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG9wZW5jbF9jdHgtPmRldmljZV9saXN0LnBsYXRmb3JtX25vZGVbb3BlbmNsX2N0eC0+cGxhdGZvcm1faWR4XS0+ZGV2aWNlX251bSA8IG9wZW5jbF9jdHgtPmRldmljZV9pZHggKyAxKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBPcGVuQ0wgZGV2aWNlIGlkeCAlZCBpbiB0aGUgdXNlciBzZXQgcGxhdGZvcm1cbiIsIG9wZW5jbF9jdHgtPnBsYXRmb3JtX2lkeCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcGVuY2xfY3R4LT5kZXZpY2VfaWR4ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGV2aWNlX25vZGUgPSBvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdC5wbGF0Zm9ybV9ub2RlW29wZW5jbF9jdHgtPnBsYXRmb3JtX2lkeF0tPmRldmljZV9ub2RlW29wZW5jbF9jdHgtPmRldmljZV9pZHhdOworICAgICAgICAgICAgb3BlbmNsX2N0eC0+ZGV2aWNlX2lkID0gZGV2aWNlX25vZGUtPmRldmljZV9pZDsKKyAgICAgICAgICAgIG9wZW5jbF9jdHgtPmRldmljZV90eXBlID0gZGV2aWNlX25vZGUtPmRldmljZV90eXBlOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXNlIGF2YWlsYWJsZSBwbGF0Zm9ybS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXZfbG9nKG9wZW5jbF9jdHgsIEFWX0xPR19WRVJCT1NFLCAiUGxhdGZvcm0gTmFtZTogJXMsIERldmljZSBOYW1lOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdC5wbGF0Zm9ybV9ub2RlW29wZW5jbF9jdHgtPnBsYXRmb3JtX2lkeF0tPnBsYXRmb3JtX25hbWUsCisgICAgICAgICAgICAgICAgICAgZGV2aWNlX25vZGUtPmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgIGNwc1swXSA9IENMX0NPTlRFWFRfUExBVEZPUk07CisgICAgICAgICAgICBjcHNbMV0gPSAoY2xfY29udGV4dF9wcm9wZXJ0aWVzKW9wZW5jbF9jdHgtPnBsYXRmb3JtX2lkOworICAgICAgICAgICAgY3BzWzJdID0gMDsKKworICAgICAgICAgICAgb3BlbmNsX2N0eC0+Y29udGV4dCA9IGNsQ3JlYXRlQ29udGV4dEZyb21UeXBlKGNwcywgb3BlbmNsX2N0eC0+ZGV2aWNlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cob3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBPcGVuQ0wgY29udGV4dCBmcm9tIGRldmljZSB0eXBlOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wZW5jbF9jdHgtPmNvbW1hbmRfcXVldWUgPSBjbENyZWF0ZUNvbW1hbmRRdWV1ZShvcGVuY2xfY3R4LT5jb250ZXh0LCBvcGVuY2xfY3R4LT5kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cob3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBPcGVuQ0wgY29tbWFuZCBxdWV1ZTogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2X29wZW5jbF9pbml0KEFWT3BlbkNMRXh0ZXJuYWxFbnYgKmV4dF9vcGVuY2xfZW52KQoreworICAgIGludCByZXQgPSBpbml0X29wZW5jbF9tdHgoICk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgTE9DS19PUEVOQ0w7CisgICAgaWYgKCFvcGVuY2xfY3R4LmluaXRfY291bnQpIHsKKyAgICAgICAgaWYgKCFvcGVuY2xfY3R4Lm9wdF9pbml0X2ZsYWcpIHsKKyAgICAgICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHMoJm9wZW5jbF9jdHgpOworICAgICAgICAgICAgb3BlbmNsX2N0eC5vcHRfaW5pdF9mbGFnID0gMTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBpbml0X29wZW5jbF9lbnYoJm9wZW5jbF9jdHgsIGV4dF9vcGVuY2xfZW52KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgaWYgKG9wZW5jbF9jdHgua2VybmVsX2NvZGVfY291bnQgPD0gMCkgeworICAgICAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIk5vIGtlcm5lbCBjb2RlIGlzIHJlZ2lzdGVyZWQsIGNvbXBpbGUga2VybmVsIGZpbGUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorICAgIG9wZW5jbF9jdHguaW5pdF9jb3VudCsrOworZW5kOgorICAgIFVOTE9DS19PUEVOQ0w7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBhdl9vcGVuY2xfdW5pbml0KHZvaWQpCit7CisgICAgY2xfaW50IHN0YXR1czsKKyAgICBMT0NLX09QRU5DTDsKKyAgICBvcGVuY2xfY3R4LmluaXRfY291bnQtLTsKKyAgICBpZiAob3BlbmNsX2N0eC5pc191c2VyX2NyZWF0ZWQpCisgICAgICAgIGdvdG8gZW5kOworICAgIGlmIChvcGVuY2xfY3R4LmluaXRfY291bnQgPiAwKQorICAgICAgICBnb3RvIGVuZDsKKyAgICBpZiAob3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlKSB7CisgICAgICAgIHN0YXR1cyA9IGNsUmVsZWFzZUNvbW1hbmRRdWV1ZShvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUpOworICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVsZWFzZSBPcGVuQ0wgY29tbWFuZCBxdWV1ZTogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICAgICAgb3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG9wZW5jbF9jdHguY29udGV4dCkgeworICAgICAgICBzdGF0dXMgPSBjbFJlbGVhc2VDb250ZXh0KG9wZW5jbF9jdHguY29udGV4dCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZWxlYXNlIE9wZW5DTCBjb250ZXh0OiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgICBvcGVuY2xfY3R4LmNvbnRleHQgPSBOVUxMOworICAgIH0KKyAgICBmcmVlX2RldmljZV9saXN0KCZvcGVuY2xfY3R4LmRldmljZV9saXN0KTsKK2VuZDoKKyAgICBpZiAob3BlbmNsX2N0eC5pbml0X2NvdW50IDw9IDApCisgICAgICAgIGF2X29wdF9mcmVlKCZvcGVuY2xfY3R4KTsgLy9GSVhNRTogZnJlZSBvcGVuY2x1dGlscyBjb250ZXh0CisgICAgVU5MT0NLX09QRU5DTDsKK30KKworaW50IGF2X29wZW5jbF9idWZmZXJfY3JlYXRlKGNsX21lbSAqY2xfYnVmLCBzaXplX3QgY2xfYnVmX3NpemUsIGludCBmbGFncywgdm9pZCAqaG9zdF9wdHIpCit7CisgICAgY2xfaW50IHN0YXR1czsKKyAgICAqY2xfYnVmID0gY2xDcmVhdGVCdWZmZXIob3BlbmNsX2N0eC5jb250ZXh0LCBmbGFncywgY2xfYnVmX3NpemUsIGhvc3RfcHRyLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIE9wZW5DTCBidWZmZXI6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXZfb3BlbmNsX2J1ZmZlcl9yZWxlYXNlKGNsX21lbSAqY2xfYnVmKQoreworICAgIGNsX2ludCBzdGF0dXMgPSAwOworICAgIGlmICghY2xfYnVmKQorICAgICAgICByZXR1cm47CisgICAgc3RhdHVzID0gY2xSZWxlYXNlTWVtT2JqZWN0KCpjbF9idWYpOworICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVsZWFzZSBPcGVuQ0wgYnVmZmVyOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKKyAgICB9CisgICAgbWVtc2V0KGNsX2J1ZiwgMCwgc2l6ZW9mKCpjbF9idWYpKTsKK30KKworaW50IGF2X29wZW5jbF9idWZmZXJfd3JpdGUoY2xfbWVtIGRzdF9jbF9idWYsIHVpbnQ4X3QgKnNyY19idWYsIHNpemVfdCBidWZfc2l6ZSkKK3sKKyAgICBjbF9pbnQgc3RhdHVzOworICAgIHZvaWQgKm1hcHBlZCA9IGNsRW5xdWV1ZU1hcEJ1ZmZlcihvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUsIGRzdF9jbF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX1RSVUUsIENMX01BUF9XUklURSwgMCwgc2l6ZW9mKHVpbnQ4X3QpICogYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwsICZzdGF0dXMpOworCisgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBtYXAgT3BlbkNMIGJ1ZmZlcjogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyAgICBtZW1jcHkobWFwcGVkLCBzcmNfYnVmLCBidWZfc2l6ZSk7CisKKyAgICBzdGF0dXMgPSBjbEVucXVldWVVbm1hcE1lbU9iamVjdChvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUsIGRzdF9jbF9idWYsIG1hcHBlZCwgMCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB1bm1hcCBPcGVuQ0wgYnVmZmVyOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgYXZfb3BlbmNsX2J1ZmZlcl9yZWFkKHVpbnQ4X3QgKmRzdF9idWYsIGNsX21lbSBzcmNfY2xfYnVmLCBzaXplX3QgYnVmX3NpemUpCit7CisgICAgY2xfaW50IHN0YXR1czsKKyAgICB2b2lkICptYXBwZWQgPSBjbEVucXVldWVNYXBCdWZmZXIob3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlLCBzcmNfY2xfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9UUlVFLCBDTF9NQVBfUkVBRCwgMCwgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwsICZzdGF0dXMpOworCisgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBtYXAgT3BlbkNMIGJ1ZmZlcjogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyAgICBtZW1jcHkoZHN0X2J1ZiwgbWFwcGVkLCBidWZfc2l6ZSk7CisKKyAgICBzdGF0dXMgPSBjbEVucXVldWVVbm1hcE1lbU9iamVjdChvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUsIHNyY19jbF9idWYsIG1hcHBlZCwgMCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB1bm1hcCBPcGVuQ0wgYnVmZmVyOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgYXZfb3BlbmNsX2J1ZmZlcl93cml0ZV9pbWFnZShjbF9tZW0gZHN0X2NsX2J1Ziwgc2l6ZV90IGNsX2J1ZmZlcl9zaXplLCBpbnQgZHN0X2NsX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipzcmNfZGF0YSwgaW50ICpwbGFuZV9zaXplLCBpbnQgcGxhbmVfbnVtKQoreworICAgIGludCBpLCBidWZmZXJfc2l6ZSA9IDA7CisgICAgdWludDhfdCAqdGVtcDsKKyAgICBjbF9pbnQgc3RhdHVzOworICAgIHZvaWQgKm1hcHBlZDsKKyAgICBpZiAoKHVuc2lnbmVkIGludClwbGFuZV9udW0gPiA4KSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGZvciAoaSA9IDA7aSA8IHBsYW5lX251bTtpKyspIHsKKyAgICAgICAgYnVmZmVyX3NpemUgKz0gcGxhbmVfc2l6ZVtpXTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlcl9zaXplID4gY2xfYnVmZmVyX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIGltYWdlIHRvIE9wZW5DTCBidWZmZXI6IGJ1ZmZlciB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBtYXBwZWQgPSBjbEVucXVldWVNYXBCdWZmZXIob3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlLCBkc3RfY2xfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9UUlVFLCBDTF9NQVBfV1JJVEUsIDAsIGJ1ZmZlcl9zaXplICsgZHN0X2NsX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCwgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBtYXAgT3BlbkNMIGJ1ZmZlcjogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyAgICB0ZW1wID0gbWFwcGVkOworICAgIHRlbXAgKz0gZHN0X2NsX29mZnNldDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVfbnVtOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KHRlbXAsIHNyY19kYXRhW2ldLCBwbGFuZV9zaXplW2ldKTsKKyAgICAgICAgdGVtcCArPSBwbGFuZV9zaXplW2ldOworICAgIH0KKyAgICBzdGF0dXMgPSBjbEVucXVldWVVbm1hcE1lbU9iamVjdChvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUsIGRzdF9jbF9idWYsIG1hcHBlZCwgMCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB1bm1hcCBPcGVuQ0wgYnVmZmVyOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgYXZfb3BlbmNsX2J1ZmZlcl9yZWFkX2ltYWdlKHVpbnQ4X3QgKipkc3RfZGF0YSwgaW50ICpwbGFuZV9zaXplLCBpbnQgcGxhbmVfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW0gc3JjX2NsX2J1Ziwgc2l6ZV90IGNsX2J1ZmZlcl9zaXplKQoreworICAgIGludCBpLGJ1ZmZlcl9zaXplID0gMCxyZXQgPSAwOworICAgIHVpbnQ4X3QgKnRlbXA7CisgICAgdm9pZCAqbWFwcGVkOworICAgIGNsX2ludCBzdGF0dXM7CisgICAgaWYgKCh1bnNpZ25lZCBpbnQpcGxhbmVfbnVtID4gOCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVfbnVtOyBpKyspIHsKKyAgICAgICAgYnVmZmVyX3NpemUgKz0gcGxhbmVfc2l6ZVtpXTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlcl9zaXplID4gY2xfYnVmZmVyX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIGltYWdlIHRvIENQVSBidWZmZXI6IE9wZW5DTCBidWZmZXIgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgbWFwcGVkID0gY2xFbnF1ZXVlTWFwQnVmZmVyKG9wZW5jbF9jdHguY29tbWFuZF9xdWV1ZSwgc3JjX2NsX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfVFJVRSwgQ0xfTUFQX1JFQUQsIDAsIGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMLCAmc3RhdHVzKTsKKworICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDb3VsZCBub3QgbWFwIE9wZW5DTCBidWZmZXI6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisgICAgdGVtcCA9IG1hcHBlZDsKKyAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lX251bTsgaSsrKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0X2RhdGFbaV0sIHRlbXAsIHBsYW5lX3NpemVbaV0pOworICAgICAgICAgICAgdGVtcCArPSBwbGFuZV9zaXplW2ldOworICAgICAgICB9CisgICAgfQorICAgIHN0YXR1cyA9IGNsRW5xdWV1ZVVubWFwTWVtT2JqZWN0KG9wZW5jbF9jdHguY29tbWFuZF9xdWV1ZSwgc3JjX2NsX2J1ZiwgbWFwcGVkLCAwLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ291bGQgbm90IHVubWFwIE9wZW5DTCBidWZmZXI6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludDY0X3QgYXZfb3BlbmNsX2JlbmNobWFyayhBVk9wZW5DTERldmljZU5vZGUgKmRldmljZV9ub2RlLCBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICgqYmVuY2htYXJrKShBVk9wZW5DTEV4dGVybmFsRW52ICpleHRfb3BlbmNsX2VudikpCit7CisgICAgaW50NjRfdCByZXQgPSAwOworICAgIGNsX2ludCBzdGF0dXM7CisgICAgY2xfY29udGV4dF9wcm9wZXJ0aWVzIGNwc1szXTsKKyAgICBBVk9wZW5DTEV4dGVybmFsRW52ICpleHRfb3BlbmNsX2VudiA9IE5VTEw7CisKKyAgICBleHRfb3BlbmNsX2VudiA9IGF2X29wZW5jbF9hbGxvY19leHRlcm5hbF9lbnYoKTsKKyAgICBleHRfb3BlbmNsX2Vudi0+ZGV2aWNlX2lkID0gZGV2aWNlX25vZGUtPmRldmljZV9pZDsKKyAgICBleHRfb3BlbmNsX2Vudi0+ZGV2aWNlX3R5cGUgPSBkZXZpY2Vfbm9kZS0+ZGV2aWNlX3R5cGU7CisgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlBlcmZvcm1pbmcgdGVzdCBvbiBPcGVuQ0wgZGV2aWNlICVzXG4iLAorICAgICAgICAgICBkZXZpY2Vfbm9kZS0+ZGV2aWNlX25hbWUpOworCisgICAgY3BzWzBdID0gQ0xfQ09OVEVYVF9QTEFURk9STTsKKyAgICBjcHNbMV0gPSAoY2xfY29udGV4dF9wcm9wZXJ0aWVzKXBsYXRmb3JtOworICAgIGNwc1syXSA9IDA7CisgICAgZXh0X29wZW5jbF9lbnYtPmNvbnRleHQgPSBjbENyZWF0ZUNvbnRleHRGcm9tVHlwZShjcHMsIGV4dF9vcGVuY2xfZW52LT5kZXZpY2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUyB8fCAhZXh0X29wZW5jbF9lbnYtPmNvbnRleHQpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGV4dF9vcGVuY2xfZW52LT5jb21tYW5kX3F1ZXVlID0gY2xDcmVhdGVDb21tYW5kUXVldWUoZXh0X29wZW5jbF9lbnYtPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfb3BlbmNsX2Vudi0+ZGV2aWNlX2lkLCAwLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MgfHwgIWV4dF9vcGVuY2xfZW52LT5jb21tYW5kX3F1ZXVlKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICByZXQgPSBiZW5jaG1hcmsoZXh0X29wZW5jbF9lbnYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwgIkJlbmNobWFyayBmYWlsZWQgd2l0aCBPcGVuQ0wgZGV2aWNlICVzXG4iLAorICAgICAgICAgICAgICAgZGV2aWNlX25vZGUtPmRldmljZV9uYW1lKTsKK2VuZDoKKyAgICBpZiAoZXh0X29wZW5jbF9lbnYtPmNvbW1hbmRfcXVldWUpCisgICAgICAgIGNsUmVsZWFzZUNvbW1hbmRRdWV1ZShleHRfb3BlbmNsX2Vudi0+Y29tbWFuZF9xdWV1ZSk7CisgICAgaWYgKGV4dF9vcGVuY2xfZW52LT5jb250ZXh0KQorICAgICAgICBjbFJlbGVhc2VDb250ZXh0KGV4dF9vcGVuY2xfZW52LT5jb250ZXh0KTsKKyAgICBhdl9vcGVuY2xfZnJlZV9leHRlcm5hbF9lbnYoJmV4dF9vcGVuY2xfZW52KTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9vcGVuY2wuaCBiL2ZmbXBlZy9saWJhdnV0aWwvb3BlbmNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1NWNiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvb3BlbmNsLmgKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgUGVuZyAgR2FvICAgICA8cGVuZ0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBMaSAgICBDYW8gICAgIDxsaUBtdWx0aWNvcmV3YXJlaW5jLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBXZWkgICBHYW8gICAgIDx3ZWlnYW9AbXVsdGljb3Jld2FyZWluYy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgTGVubnkgV2FuZyAgICA8bHdhbmdocGNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBPcGVuQ0wgd3JhcHBlcgorICoKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGNvbnNpZGVyZWQgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpdHMgQVBJIGFuZCBBQkkgbWF5CisgKiBjaGFuZ2Ugd2l0aG91dCBwcmlvciBub3RpY2UuCisgKi8KKworI2lmbmRlZiBMSUJBVlVUSUxfT1BFTkNMX0gKKyNkZWZpbmUgTElCQVZVVElMX09QRU5DTF9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBIQVZFX0NMX0NMX0gKKyNpbmNsdWRlIDxDTC9jbC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxPcGVuQ0wvY2wuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImRpY3QuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC92ZXJzaW9uLmgiCisKKyNkZWZpbmUgQVZfT1BFTkNMX0tFUk5FTCggLi4uICkjIF9fVkFfQVJHU19fCisKKyNkZWZpbmUgQVZfT1BFTkNMX01BWF9LRVJORUxfTkFNRV9TSVpFIDE1MAorCisjZGVmaW5lIEFWX09QRU5DTF9NQVhfREVWSUNFX05BTUVfU0laRSAxMDAKKworI2RlZmluZSBBVl9PUEVOQ0xfTUFYX1BMQVRGT1JNX05BTUVfU0laRSAxMDAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBkZXZpY2VfdHlwZTsKKyAgICBjaGFyIGRldmljZV9uYW1lW0FWX09QRU5DTF9NQVhfREVWSUNFX05BTUVfU0laRV07CisgICAgY2xfZGV2aWNlX2lkIGRldmljZV9pZDsKK30gQVZPcGVuQ0xEZXZpY2VOb2RlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2xfcGxhdGZvcm1faWQgcGxhdGZvcm1faWQ7CisgICAgY2hhciBwbGF0Zm9ybV9uYW1lW0FWX09QRU5DTF9NQVhfUExBVEZPUk1fTkFNRV9TSVpFXTsKKyAgICBpbnQgZGV2aWNlX251bTsKKyAgICBBVk9wZW5DTERldmljZU5vZGUgKipkZXZpY2Vfbm9kZTsKK30gQVZPcGVuQ0xQbGF0Zm9ybU5vZGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgcGxhdGZvcm1fbnVtOworICAgIEFWT3BlbkNMUGxhdGZvcm1Ob2RlICoqcGxhdGZvcm1fbm9kZTsKK30gQVZPcGVuQ0xEZXZpY2VMaXN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2xfcGxhdGZvcm1faWQgcGxhdGZvcm1faWQ7CisgICAgY2xfZGV2aWNlX3R5cGUgZGV2aWNlX3R5cGU7CisgICAgY2xfY29udGV4dCBjb250ZXh0OworICAgIGNsX2RldmljZV9pZCAgZGV2aWNlX2lkOworICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZTsKKyAgICBjaGFyICpwbGF0Zm9ybV9uYW1lOworfSBBVk9wZW5DTEV4dGVybmFsRW52OworCisvKioKKyAqIEdldCBPcGVuQ0wgZGV2aWNlIGxpc3QuCisgKgorICogSXQgbXVzdCBiZSBmcmVlZCB3aXRoIGF2X29wZW5jbF9mcmVlX2RldmljZV9saXN0KCkuCisgKgorICogQHBhcmFtIGRldmljZV9saXN0IHBvaW50ZXIgdG8gT3BlbkNMIGVudmlyb25tZW50IGRldmljZSBsaXN0LAorICogICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSByZWxlYXNlZCBieSBhdl9vcGVuY2xfZnJlZV9kZXZpY2VfbGlzdCgpCisgKgorICogQHJldHVybiAgPj0wIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGF2X29wZW5jbF9nZXRfZGV2aWNlX2xpc3QoQVZPcGVuQ0xEZXZpY2VMaXN0ICoqZGV2aWNlX2xpc3QpOworCisvKioKKyAgKiBGcmVlIE9wZW5DTCBkZXZpY2UgbGlzdC4KKyAgKgorICAqIEBwYXJhbSBkZXZpY2VfbGlzdCBwb2ludGVyIHRvIE9wZW5DTCBlbnZpcm9ubWVudCBkZXZpY2UgbGlzdAorICAqICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGJ5IGF2X29wZW5jbF9nZXRfZGV2aWNlX2xpc3QoKQorICAqLwordm9pZCBhdl9vcGVuY2xfZnJlZV9kZXZpY2VfbGlzdChBVk9wZW5DTERldmljZUxpc3QgKipkZXZpY2VfbGlzdCk7CisKKy8qKgorICogU2V0IG9wdGlvbiBpbiB0aGUgZ2xvYmFsIE9wZW5DTCBjb250ZXh0LgorICoKKyAqIFRoaXMgb3B0aW9ucyBhZmZlY3QgdGhlIG9wZXJhdGlvbiBwZXJmb3JtZWQgYnkgdGhlIG5leHQKKyAqIGF2X29wZW5jbF9pbml0KCkgb3BlcmF0aW9uLgorICoKKyAqIFRoZSBjdXJyZW50bHkgYWNjZXB0ZWQgb3B0aW9ucyBhcmU6CisgKiAtIHBsYXRmb3JtOiBzZXQgaW5kZXggb2YgcGxhdGZvcm0gaW4gZGV2aWNlIGxpc3QKKyAqIC0gZGV2aWNlOiBzZXQgaW5kZXggb2YgZGV2aWNlIGluIGRldmljZSBsaXN0CisgKgorICogU2VlIHJlZmVyZW5jZSAiT3BlbkNMIFNwZWNpZmljYXRpb24gVmVyc2lvbjogMS4yIGNoYXB0ZXIgNS42LjQiLgorICoKKyAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgICAgIG9wdGlvbiBrZXkKKyAqIEBwYXJhbSB2YWwgICAgICAgICAgICAgICAgIG9wdGlvbiB2YWx1ZQorICogQHJldHVybiA+PTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICogQHNlZSBhdl9vcGVuY2xfZ2V0X29wdGlvbigpCisgKi8KK2ludCBhdl9vcGVuY2xfc2V0X29wdGlvbihjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCk7CisKKy8qKgorICogR2V0IG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSBnbG9iYWwgT3BlbkNMIGNvbnRleHQuCisgKgorICogQHBhcmFtIGtleSAgICAgICAgb3B0aW9uIGtleQorICogQHBhcmFtIG91dF92YWwgIHBvaW50ZXIgdG8gbG9jYXRpb24gd2hlcmUgb3B0aW9uIHZhbHVlIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4sIG11c3QgYmUgZnJlZWQgd2l0aCBhdl9mcmVlcCgpCisgKiBAcmV0dXJuICA+PTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICogQHNlZSBhdl9vcGVuY2xfc2V0X29wdGlvbigpCisgKi8KK2ludCBhdl9vcGVuY2xfZ2V0X29wdGlvbihjb25zdCBjaGFyICprZXksIHVpbnQ4X3QgKipvdXRfdmFsKTsKKworLyoqCisgKiBGcmVlIG9wdGlvbiB2YWx1ZXMgb2YgdGhlIGdsb2JhbCBPcGVuQ0wgY29udGV4dC4KKyAqCisgKi8KK3ZvaWQgYXZfb3BlbmNsX2ZyZWVfb3B0aW9uKHZvaWQpOworCisvKioKKyAqIEFsbG9jYXRlIE9wZW5DTCBleHRlcm5hbCBlbnZpcm9ubWVudC4KKyAqCisgKiBJdCBtdXN0IGJlIGZyZWVkIHdpdGggYXZfb3BlbmNsX2ZyZWVfZXh0ZXJuYWxfZW52KCkuCisgKgorICogQHJldHVybiBwb2ludGVyIHRvIGFsbG9jYXRlZCBPcGVuQ0wgZXh0ZXJuYWwgZW52aXJvbm1lbnQKKyAqLworQVZPcGVuQ0xFeHRlcm5hbEVudiAqYXZfb3BlbmNsX2FsbG9jX2V4dGVybmFsX2Vudih2b2lkKTsKKworLyoqCisgKiBGcmVlIE9wZW5DTCBleHRlcm5hbCBlbnZpcm9ubWVudC4KKyAqCisgKiBAcGFyYW0gZXh0X29wZW5jbF9lbnYgcG9pbnRlciB0byBPcGVuQ0wgZXh0ZXJuYWwgZW52aXJvbm1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGJ5IGF2X29wZW5jbF9hbGxvY19leHRlcm5hbF9lbnYoKQorICovCit2b2lkIGF2X29wZW5jbF9mcmVlX2V4dGVybmFsX2VudihBVk9wZW5DTEV4dGVybmFsRW52ICoqZXh0X29wZW5jbF9lbnYpOworCisvKioKKyAqIEdldCBPcGVuQ0wgZXJyb3Igc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdGF0dXMgICAgT3BlbkNMIGVycm9yIGNvZGUKKyAqIEByZXR1cm4gT3BlbkNMIGVycm9yIHN0cmluZworICovCitjb25zdCBjaGFyICphdl9vcGVuY2xfZXJyc3RyKGNsX2ludCBzdGF0dXMpOworCisvKioKKyAqIFJlZ2lzdGVyIGtlcm5lbCBjb2RlLgorICoKKyAqICBUaGUgcmVnaXN0ZXJlZCBrZXJuZWwgY29kZSBpcyBzdG9yZWQgaW4gYSBnbG9iYWwgY29udGV4dCwgYW5kIGNvbXBpbGVkCisgKiAgaW4gdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgd2hlbiBhdl9vcGVuY2xfaW5pdCgpIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0ga2VybmVsX2NvZGUgICAga2VybmVsIGNvZGUgdG8gYmUgY29tcGlsZWQgaW4gdGhlIE9wZW5DTCBydW50aW1lIGVudmlyb25tZW50CisgKiBAcmV0dXJuICA+PTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgYXZfb3BlbmNsX3JlZ2lzdGVyX2tlcm5lbF9jb2RlKGNvbnN0IGNoYXIgKmtlcm5lbF9jb2RlKTsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBydW4gdGltZSBPcGVuQ0wgZW52aXJvbm1lbnQKKyAqCisgKiBAcGFyYW0gZXh0X29wZW5jbF9lbnYgZXh0ZXJuYWwgT3BlbkNMIGVudmlyb25tZW50LCBjcmVhdGVkIGJ5IGFuCisgKiAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gcHJvZ3JhbSwgaWdub3JlZCBpZiBzZXQgdG8gTlVMTAorICogQHJldHVybiA+PTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgYXZfb3BlbmNsX2luaXQoQVZPcGVuQ0xFeHRlcm5hbEVudiAqZXh0X29wZW5jbF9lbnYpOworCisvKioKKyAqIGNvbXBpbGUgc3BlY2lmaWMgT3BlbkNMIGtlcm5lbCBzb3VyY2UKKyAqCisgKiBAcGFyYW0gcHJvZ3JhbV9uYW1lICBwb2ludGVyIHRvIGEgcHJvZ3JhbSBuYW1lIHVzZWQgZm9yIGlkZW50aWZpY2F0aW9uCisgKiBAcGFyYW0gYnVpbGRfb3B0cyAgICBwb2ludGVyIHRvIGEgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBwcmVwcm9jZXNzb3IKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIG9wdGlvbnMgdG8gYmUgdXNlZCBmb3IgYnVpbGRpbmcgdGhlIHByb2dyYW0KKyAqIEByZXR1cm4gYSBjbF9wcm9ncmFtIG9iamVjdAorICovCitjbF9wcm9ncmFtIGF2X29wZW5jbF9jb21waWxlKGNvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSwgY29uc3QgY2hhciogYnVpbGRfb3B0cyk7CisKKy8qKgorICogZ2V0IE9wZW5DTCBjb21tYW5kIHF1ZXVlCisgKgorICogQHJldHVybiBhIGNsX2NvbW1hbmRfcXVldWUgb2JqZWN0CisgKi8KK2NsX2NvbW1hbmRfcXVldWUgYXZfb3BlbmNsX2dldF9jb21tYW5kX3F1ZXVlKHZvaWQpOworCisvKioKKyAqIENyZWF0ZSBPcGVuQ0wgYnVmZmVyLgorICoKKyAqIFRoZSBidWZmZXIgaXMgdXNlZCB0byBzYXZlIHRoZSBkYXRhIHVzZWQgb3IgY3JlYXRlZCBieSBhbiBPcGVuQ0wKKyAqIGtlcm5lbC4KKyAqIFRoZSBjcmVhdGVkIGJ1ZmZlciBtdXN0IGJlIHJlbGVhc2VkIHdpdGggYXZfb3BlbmNsX2J1ZmZlcl9yZWxlYXNlKCkuCisgKgorICogU2VlIGNsQ3JlYXRlQnVmZmVyKCkgZnVuY3Rpb24gcmVmZXJlbmNlIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0CisgKiB0aGUgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gY2xfYnVmICAgICAgIHBvaW50ZXIgdG8gT3BlbkNMIGJ1ZmZlcgorICogQHBhcmFtIGNsX2J1Zl9zaXplICBzaXplIGluIGJ5dGVzIG9mIHRoZSBPcGVuQ0wgYnVmZmVyIHRvIGNyZWF0ZQorICogQHBhcmFtIGZsYWdzICAgICAgICBmbGFncyB1c2VkIHRvIGNvbnRyb2wgYnVmZmVyIGF0dHJpYnV0ZXMKKyAqIEBwYXJhbSBob3N0X3B0ciAgICAgaG9zdCBwb2ludGVyIG9mIHRoZSBPcGVuQ0wgYnVmZmVyCisgKiBAcmV0dXJuID49MCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCBhdl9vcGVuY2xfYnVmZmVyX2NyZWF0ZShjbF9tZW0gKmNsX2J1Ziwgc2l6ZV90IGNsX2J1Zl9zaXplLCBpbnQgZmxhZ3MsIHZvaWQgKmhvc3RfcHRyKTsKKworLyoqCisgKiBXcml0ZSBPcGVuQ0wgYnVmZmVyIHdpdGggZGF0YSBmcm9tIHNyY19idWYuCisgKgorICogQHBhcmFtIGRzdF9jbF9idWYgICAgICAgIHBvaW50ZXIgdG8gT3BlbkNMIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHBhcmFtIHNyY19idWYgICAgICAgICAgIHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorICogQHBhcmFtIGJ1Zl9zaXplICAgICAgICAgIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVycworICogQHJldHVybiA+PTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgYXZfb3BlbmNsX2J1ZmZlcl93cml0ZShjbF9tZW0gZHN0X2NsX2J1ZiwgdWludDhfdCAqc3JjX2J1Ziwgc2l6ZV90IGJ1Zl9zaXplKTsKKworLyoqCisgKiBSZWFkIGRhdGEgZnJvbSBPcGVuQ0wgYnVmZmVyIHRvIG1lbW9yeSBidWZmZXIuCisgKgorICogQHBhcmFtIGRzdF9idWYgICAgICAgICAgIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyIChDUFUgbWVtb3J5KQorICogQHBhcmFtIHNyY19jbF9idWYgICAgICAgIHBvaW50ZXIgdG8gc291cmNlIE9wZW5DTCBidWZmZXIKKyAqIEBwYXJhbSBidWZfc2l6ZSAgICAgICAgICBzaXplIGluIGJ5dGVzIG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMKKyAqIEByZXR1cm4gPj0wIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGF2X29wZW5jbF9idWZmZXJfcmVhZCh1aW50OF90ICpkc3RfYnVmLCBjbF9tZW0gc3JjX2NsX2J1Ziwgc2l6ZV90IGJ1Zl9zaXplKTsKKworLyoqCisgKiBXcml0ZSBpbWFnZSBkYXRhIGZyb20gbWVtb3J5IHRvIE9wZW5DTCBidWZmZXIuCisgKgorICogVGhlIHNvdXJjZSBtdXN0IGJlIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGltYWdlIHBsYW5lIGJ1ZmZlcnMuCisgKgorICogQHBhcmFtIGRzdF9jbF9idWYgICAgICAgICBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIE9wZW5DTCBidWZmZXIKKyAqIEBwYXJhbSBkc3RfY2xfYnVmX3NpemUgICAgc2l6ZSBpbiBieXRlcyBvZiBPcGVuQ0wgYnVmZmVyCisgKiBAcGFyYW0gZHN0X2NsX2J1Zl9vZmZzZXQgIHRoZSBvZmZzZXQgb2YgdGhlIE9wZW5DTCBidWZmZXIgc3RhcnQgcG9zaXRpb24KKyAqIEBwYXJhbSBzcmNfZGF0YSAgICAgICAgICAgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc291cmNlIHBsYW5lIGJ1ZmZlcnMKKyAqIEBwYXJhbSBzcmNfcGxhbmVfc2l6ZXMgICAgYXJyYXkgb2Ygc2l6ZXMgaW4gYnl0ZXMgb2YgdGhlIHNvdXJjZSBwbGFuZSBidWZmZXJzCisgKiBAcGFyYW0gc3JjX3BsYW5lX251bSAgICAgIG51bWJlciBvZiBzb3VyY2UgaW1hZ2UgcGxhbmVzCisgKiBAcmV0dXJuID49MCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCBhdl9vcGVuY2xfYnVmZmVyX3dyaXRlX2ltYWdlKGNsX21lbSBkc3RfY2xfYnVmLCBzaXplX3QgY2xfYnVmZmVyX3NpemUsIGludCBkc3RfY2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnNyY19kYXRhLCBpbnQgKnBsYW5lX3NpemUsIGludCBwbGFuZV9udW0pOworCisvKioKKyAqIFJlYWQgaW1hZ2UgZGF0YSBmcm9tIE9wZW5DTCBidWZmZXIuCisgKgorICogQHBhcmFtIGRzdF9kYXRhICAgICAgICAgICBhcnJheSBvZiBwb2ludGVycyB0byBkZXN0aW5hdGlvbiBwbGFuZSBidWZmZXJzCisgKiBAcGFyYW0gZHN0X3BsYW5lX3NpemVzICAgIGFycmF5IG9mIHBvaW50ZXJzIHRvIGRlc3RpbmF0aW9uIHBsYW5lIGJ1ZmZlcnMKKyAqIEBwYXJhbSBkc3RfcGxhbmVfbnVtICAgICAgbnVtYmVyIG9mIGRlc3RpbmF0aW9uIGltYWdlIHBsYW5lcworICogQHBhcmFtIHNyY19jbF9idWYgICAgICAgICBwb2ludGVyIHRvIHNvdXJjZSBPcGVuQ0wgYnVmZmVyCisgKiBAcGFyYW0gc3JjX2NsX2J1Zl9zaXplICAgIHNpemUgaW4gYnl0ZXMgb2YgT3BlbkNMIGJ1ZmZlcgorICogQHJldHVybiA+PTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgYXZfb3BlbmNsX2J1ZmZlcl9yZWFkX2ltYWdlKHVpbnQ4X3QgKipkc3RfZGF0YSwgaW50ICpwbGFuZV9zaXplLCBpbnQgcGxhbmVfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW0gc3JjX2NsX2J1Ziwgc2l6ZV90IGNsX2J1ZmZlcl9zaXplKTsKKworLyoqCisgKiBSZWxlYXNlIE9wZW5DTCBidWZmZXIuCisgKgorICogQHBhcmFtIGNsX2J1ZiBwb2ludGVyIHRvIE9wZW5DTCBidWZmZXIgdG8gcmVsZWFzZSwgd2hpY2ggd2FzCisgKiAgICAgICAgICAgICAgIHByZXZpb3VzbHkgZmlsbGVkIHdpdGggYXZfb3BlbmNsX2J1ZmZlcl9jcmVhdGUoKQorICovCit2b2lkIGF2X29wZW5jbF9idWZmZXJfcmVsZWFzZShjbF9tZW0gKmNsX2J1Zik7CisKKy8qKgorICogUmVsZWFzZSBPcGVuQ0wgZW52aXJvbm1lbnQuCisgKgorICogVGhlIE9wZW5DTCBlbnZpcm9ubWVudCBpcyBlZmZlY3RpdmVseSByZWxlYXNlZCBvbmx5IGlmIGFsbCB0aGUgY3JlYXRlZAorICoga2VybmVscyBoYWQgYmVlbiByZWxlYXNlZCB3aXRoIGF2X29wZW5jbF9yZWxlYXNlX2tlcm5lbCgpLgorICovCit2b2lkIGF2X29wZW5jbF91bmluaXQodm9pZCk7CisKKy8qKgorICogQmVuY2htYXJrIGFuIE9wZW5DTCBkZXZpY2Ugd2l0aCBhIHVzZXIgZGVmaW5lZCBjYWxsYmFjayBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdXAgYW4gZXh0ZXJuYWwgT3BlbkNMIGVudmlyb25tZW50IGluY2x1ZGluZyBjb250ZXh0IGFuZCBjb21tYW5kIHF1ZXVlIG9uCisgKiB0aGUgZGV2aWNlIHRoZW4gdGVhcnMgaXQgZG93biBpbiB0aGUgZW5kLiAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBwZXJmb3JtCisgKiB0aGUgcmVzdCBvZiB0aGUgd29yay4KKyAqCisgKiBAcGFyYW0gZGV2aWNlICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgT3BlbkNMIGRldmljZSB0byBiZSB1c2VkCisgKiBAcGFyYW0gcGxhdGZvcm0gICAgICAgICAgY2xfcGxhdGZvcm1faWQgaGFuZGxlIHRvIHdoaWNoIHRoZSBkZXZpY2UgYmVsb25ncyB0bworICogQHBhcmFtIGJlbmNobWFyayAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIGJlbmNobWFyaywgcmV0dXJuIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqIEByZXR1cm4gdGhlIHNjb3JlIHBhc3NlZCBmcm9tIHRoZSBjYWxsYmFjayBmdW5jdGlvbiwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2UKKyAqIG9mIGZhaWx1cmUKKyAqLworaW50NjRfdCBhdl9vcGVuY2xfYmVuY2htYXJrKEFWT3BlbkNMRGV2aWNlTm9kZSAqZGV2aWNlLCBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICgqYmVuY2htYXJrKShBVk9wZW5DTEV4dGVybmFsRW52ICpleHRfb3BlbmNsX2VudikpOworCisjZW5kaWYgLyogTElCQVZVVElMX09QRU5DTF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL29wZW5jbF9pbnRlcm5hbC5jIGIvZmZtcGVnL2xpYmF2dXRpbC9vcGVuY2xfaW50ZXJuYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGI0MTkzCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9vcGVuY2xfaW50ZXJuYWwuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFBlbmcgR2FvIDxwZW5nQG11bHRpY29yZXdhcmVpbmMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEyIExpICAgQ2FvIDxsaUBtdWx0aWNvcmV3YXJlaW5jLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBXZWkgIEdhbyA8d2VpZ2FvQG11bHRpY29yZXdhcmVpbmMuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAib3BlbmNsX2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorCitpbnQgYXZwcml2X29wZW5jbF9zZXRfcGFyYW1ldGVyKEZGT3BlbmNsUGFyYW0gKm9wZW5jbF9wYXJhbSwgLi4uKQoreworICAgIGludCByZXQgPSAwOworICAgIHZhX2xpc3QgYXJnX3B0cjsKKyAgICB2b2lkICpwYXJhbTsKKyAgICBzaXplX3QgcGFyYW1fc2l6ZTsKKyAgICBjbF9pbnQgc3RhdHVzOworICAgIGlmICghb3BlbmNsX3BhcmFtLT5rZXJuZWwpIHsKKyAgICAgICAgYXZfbG9nKG9wZW5jbF9wYXJhbS0+Y3R4LCBBVl9MT0dfRVJST1IsICJPcGVuQ0wga2VybmVsIG11c3QgYmUgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgdmFfc3RhcnQoYXJnX3B0ciwgb3BlbmNsX3BhcmFtKTsKKyAgICBkbyB7CisgICAgICAgIHBhcmFtID0gdmFfYXJnKGFyZ19wdHIsIHZvaWQgKik7CisgICAgICAgIGlmICghcGFyYW0pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcGFyYW1fc2l6ZSA9IHZhX2FyZyhhcmdfcHRyLCBzaXplX3QpOworICAgICAgICBpZiAoIXBhcmFtX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhvcGVuY2xfcGFyYW0tPmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFyYW1ldGVyIHNpemUgbXVzdCBub3QgYmUgMFxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBjbFNldEtlcm5lbEFyZyhvcGVuY2xfcGFyYW0tPmtlcm5lbCwgb3BlbmNsX3BhcmFtLT5wYXJhbV9udW0sIHBhcmFtX3NpemUsIHBhcmFtKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2cob3BlbmNsX3BhcmFtLT5jdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBzZXQga2VybmVsIGFyZ3VtZW50OiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBvcGVuY2xfcGFyYW0tPnBhcmFtX251bSsrOworICAgIH0gd2hpbGUgKHBhcmFtICYmIHBhcmFtX3NpemUpOworZW5kOgorICAgIHZhX2VuZChhcmdfcHRyKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9vcGVuY2xfaW50ZXJuYWwuaCBiL2ZmbXBlZy9saWJhdnV0aWwvb3BlbmNsX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjZDkzMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvb3BlbmNsX2ludGVybmFsLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBQZW5nIEdhbyA8cGVuZ0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBMaSAgIENhbyA8bGlAbXVsdGljb3Jld2FyZWluYy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgV2VpICBHYW8gPHdlaWdhb0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgIm9wZW5jbC5oIgorCisjZGVmaW5lIEZGX09QRU5DTF9QQVJBTV9JTkZPKGEpICgodm9pZCopKCYoYSkpKSwgKHNpemVvZihhKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNsX2tlcm5lbCBrZXJuZWw7CisgICAgaW50IHBhcmFtX251bTsKKyAgICB2b2lkICpjdHg7Cit9IEZGT3BlbmNsUGFyYW07CisKK2ludCBhdnByaXZfb3BlbmNsX3NldF9wYXJhbWV0ZXIoRkZPcGVuY2xQYXJhbSAqb3BlbmNsX3BhcmFtLCAuLi4pOwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9vcHQuYyBiL2ZmbXBlZy9saWJhdnV0aWwvb3B0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3M2JkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvb3B0LmMKQEAgLTAsMCArMSwyMTUyIEBACisvKgorICogQVZPcHRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQVZPcHRpb25zCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2luY2x1ZGUgImF2dXRpbC5oIgorI2luY2x1ZGUgImF2c3RyaW5nLmgiCisjaW5jbHVkZSAiY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJvcHQuaCIKKyNpbmNsdWRlICJldmFsLmgiCisjaW5jbHVkZSAiZGljdC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInBhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJwaXhkZXNjLmgiCisjaW5jbHVkZSAibWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJzYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJicHJpbnQuaCIKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpZiBGRl9BUElfT0xEX0FWT1BUSU9OUworY29uc3QgQVZPcHRpb24gKmF2X25leHRfb3B0aW9uKEZGX0NPTlNUX0FWVVRJTDU1IHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKmxhc3QpCit7CisgICAgcmV0dXJuIGF2X29wdF9uZXh0KG9iaiwgbGFzdCk7Cit9CisjZW5kaWYKKworY29uc3QgQVZPcHRpb24gKmF2X29wdF9uZXh0KEZGX0NPTlNUX0FWVVRJTDU1IHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKmxhc3QpCit7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNsYXNzID0gKihjb25zdCBBVkNsYXNzKiopb2JqOworICAgIGlmICghbGFzdCAmJiBjbGFzcyAmJiBjbGFzcy0+b3B0aW9uICYmIGNsYXNzLT5vcHRpb25bMF0ubmFtZSkKKyAgICAgICAgcmV0dXJuIGNsYXNzLT5vcHRpb247CisgICAgaWYgKGxhc3QgJiYgbGFzdFsxXS5uYW1lKQorICAgICAgICByZXR1cm4gKytsYXN0OworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHJlYWRfbnVtYmVyKGNvbnN0IEFWT3B0aW9uICpvLCBjb25zdCB2b2lkICpkc3QsIGRvdWJsZSAqbnVtLCBpbnQgKmRlbiwgaW50NjRfdCAqaW50bnVtKQoreworICAgIHN3aXRjaCAoby0+dHlwZSkgeworICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxBR1M6ICAgICAqaW50bnVtID0gKih1bnNpZ25lZCBpbnQqKWRzdDtyZXR1cm4gMDsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1BJWEVMX0ZNVDoKKyAgICBjYXNlIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ6ICAgICAgICppbnRudW0gPSAqKGludCAgICAgICAgICopZHN0O3JldHVybiAwOworICAgIGNhc2UgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9EVVJBVElPTjoKKyAgICBjYXNlIEFWX09QVF9UWVBFX0lOVDY0OiAgICAgKmludG51bSA9ICooaW50NjRfdCAgICAgKilkc3Q7cmV0dXJuIDA7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9GTE9BVDogICAgICpudW0gICAgPSAqKGZsb2F0ICAgICAgICopZHN0O3JldHVybiAwOworICAgIGNhc2UgQVZfT1BUX1RZUEVfRE9VQkxFOiAgICAqbnVtICAgID0gKihkb3VibGUgICAgICAqKWRzdDtyZXR1cm4gMDsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1JBVElPTkFMOiAgKmludG51bSA9ICgoQVZSYXRpb25hbCopZHN0KS0+bnVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVuICAgID0gKChBVlJhdGlvbmFsKilkc3QpLT5kZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgQVZfT1BUX1RZUEVfQ09OU1Q6ICAgICAqbnVtICAgID0gby0+ZGVmYXVsdF92YWwuZGJsOyByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKworc3RhdGljIGludCB3cml0ZV9udW1iZXIodm9pZCAqb2JqLCBjb25zdCBBVk9wdGlvbiAqbywgdm9pZCAqZHN0LCBkb3VibGUgbnVtLCBpbnQgZGVuLCBpbnQ2NF90IGludG51bSkKK3sKKyAgICBpZiAoby0+dHlwZSAhPSBBVl9PUFRfVFlQRV9GTEFHUyAmJgorICAgICAgICAoby0+bWF4ICogZGVuIDwgbnVtICogaW50bnVtIHx8IG8tPm1pbiAqIGRlbiA+IG51bSAqIGludG51bSkpIHsKKyAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLCAiVmFsdWUgJWYgZm9yIHBhcmFtZXRlciAnJXMnIG91dCBvZiByYW5nZSBbJWcgLSAlZ11cbiIsCisgICAgICAgICAgICAgICBudW0qaW50bnVtL2Rlbiwgby0+bmFtZSwgby0+bWluLCBvLT5tYXgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFUkFOR0UpOworICAgIH0KKyAgICBpZiAoby0+dHlwZSA9PSBBVl9PUFRfVFlQRV9GTEFHUykgeworICAgICAgICBkb3VibGUgZCA9IG51bSppbnRudW0vZGVuOworICAgICAgICBpZiAoZCA8IC0xLjUgfHwgZCA+IDB4RkZGRkZGRkYrMC41IHx8IChsbHJpbnQoZCoyNTYpICYgMjU1KSkgeworICAgICAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJWYWx1ZSAlZiBmb3IgcGFyYW1ldGVyICclcycgaXMgbm90IGEgdmFsaWQgc2V0IG9mIDMyYml0IGludGVnZXIgZmxhZ3NcbiIsCisgICAgICAgICAgICAgICAgICAgbnVtKmludG51bS9kZW4sIG8tPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRVJBTkdFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoby0+dHlwZSkgeworICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxBR1M6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9QSVhFTF9GTVQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9TQU1QTEVfRk1UOgorICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UOiAgICooaW50ICAgICAgICopZHN0PSBsbHJpbnQobnVtL2RlbikqaW50bnVtOyBicmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0RVUkFUSU9OOgorICAgIGNhc2UgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDogKihpbnQ2NF90ICAgKilkc3Q9IGxscmludChudW0vZGVuKSppbnRudW07IGJyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxPQVQ6ICooZmxvYXQgICAgICopZHN0PSBudW0qaW50bnVtL2RlbjsgICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0RPVUJMRToqKGRvdWJsZSAgICAqKWRzdD0gbnVtKmludG51bS9kZW47ICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9SQVRJT05BTDoKKyAgICAgICAgaWYgKChpbnQpbnVtID09IG51bSkgKihBVlJhdGlvbmFsKilkc3Q9IChBVlJhdGlvbmFsKXtudW0qaW50bnVtLCBkZW59OworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAqKEFWUmF0aW9uYWwqKWRzdD0gYXZfZDJxKG51bSppbnRudW0vZGVuLCAxPDwyNCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhleGNoYXIyaW50KGNoYXIgYykgeworICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgcmV0dXJuIGMgLSAnMCc7CisgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSByZXR1cm4gYyAtICdhJyArIDEwOworICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykgcmV0dXJuIGMgLSAnQScgKyAxMDsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3N0cmluZ19iaW5hcnkodm9pZCAqb2JqLCBjb25zdCBBVk9wdGlvbiAqbywgY29uc3QgY2hhciAqdmFsLCB1aW50OF90ICoqZHN0KQoreworICAgIGludCAqbGVuZHN0ID0gKGludCAqKShkc3QgKyAxKTsKKyAgICB1aW50OF90ICpiaW4sICpwdHI7CisgICAgaW50IGxlbjsKKworICAgIGF2X2ZyZWVwKGRzdCk7CisgICAgKmxlbmRzdCA9IDA7CisKKyAgICBpZiAoIXZhbCB8fCAhKGxlbiA9IHN0cmxlbih2YWwpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAobGVuICYgMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBsZW4gLz0gMjsKKworICAgIHB0ciA9IGJpbiA9IGF2X21hbGxvYyhsZW4pOworICAgIHdoaWxlICgqdmFsKSB7CisgICAgICAgIGludCBhID0gaGV4Y2hhcjJpbnQoKnZhbCsrKTsKKyAgICAgICAgaW50IGIgPSBoZXhjaGFyMmludCgqdmFsKyspOworICAgICAgICBpZiAoYSA8IDAgfHwgYiA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWUoYmluKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgKnB0cisrID0gKGEgPDwgNCkgfCBiOworICAgIH0KKyAgICAqZHN0ID0gYmluOworICAgICpsZW5kc3QgPSBsZW47CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfc3RyaW5nKHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKm8sIGNvbnN0IGNoYXIgKnZhbCwgdWludDhfdCAqKmRzdCkKK3sKKyAgICBhdl9mcmVlcChkc3QpOworICAgICpkc3QgPSBhdl9zdHJkdXAodmFsKTsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBERUZBVUxUX05VTVZBTChvcHQpICgob3B0LT50eXBlID09IEFWX09QVF9UWVBFX0lOVDY0IHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdC0+dHlwZSA9PSBBVl9PUFRfVFlQRV9DT05TVCB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQtPnR5cGUgPT0gQVZfT1BUX1RZUEVfRkxBR1MgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0LT50eXBlID09IEFWX09QVF9UWVBFX0lOVCkgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdC0+ZGVmYXVsdF92YWwuaTY0IDogb3B0LT5kZWZhdWx0X3ZhbC5kYmwpCisKK3N0YXRpYyBpbnQgc2V0X3N0cmluZ19udW1iZXIodm9pZCAqb2JqLCB2b2lkICp0YXJnZXRfb2JqLCBjb25zdCBBVk9wdGlvbiAqbywgY29uc3QgY2hhciAqdmFsLCB2b2lkICpkc3QpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IG51bSwgZGVuOworICAgIGNoYXIgYzsKKworICAgIGlmIChzc2NhbmYodmFsLCAiJWQlKjFbOi9dJWQlYyIsICZudW0sICZkZW4sICZjKSA9PSAyKSB7CisgICAgICAgIGlmICgocmV0ID0gd3JpdGVfbnVtYmVyKG9iaiwgbywgZHN0LCAxLCBkZW4sIG51bSkpID49IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSAwOworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBjaGFyIGJ1ZlsyNTZdOworICAgICAgICBpbnQgY21kID0gMDsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICAgIGludDY0X3QgaW50bnVtID0gMTsKKworICAgICAgICBpZiAoby0+dHlwZSA9PSBBVl9PUFRfVFlQRV9GTEFHUykgeworICAgICAgICAgICAgaWYgKCp2YWwgPT0gJysnIHx8ICp2YWwgPT0gJy0nKQorICAgICAgICAgICAgICAgIGNtZCA9ICoodmFsKyspOworICAgICAgICAgICAgZm9yICg7IGkgPCBzaXplb2YoYnVmKSAtIDEgJiYgdmFsW2ldICYmIHZhbFtpXSAhPSAnKycgJiYgdmFsW2ldICE9ICctJzsgaSsrKQorICAgICAgICAgICAgICAgIGJ1ZltpXSA9IHZhbFtpXTsKKyAgICAgICAgICAgIGJ1ZltpXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBBVk9wdGlvbiAqb19uYW1lZCA9IGF2X29wdF9maW5kKHRhcmdldF9vYmosIGkgPyBidWYgOiB2YWwsIG8tPnVuaXQsIDAsIDApOworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIGludCBjaSA9IDA7CisgICAgICAgICAgICBkb3VibGUgY29uc3RfdmFsdWVzWzY0XTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdF9uYW1lc1s2NF07CisgICAgICAgICAgICBpZiAob19uYW1lZCAmJiBvX25hbWVkLT50eXBlID09IEFWX09QVF9UWVBFX0NPTlNUKQorICAgICAgICAgICAgICAgIGQgPSBERUZBVUxUX05VTVZBTChvX25hbWVkKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChvLT51bml0KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAob19uYW1lZCA9IE5VTEw7IG9fbmFtZWQgPSBhdl9vcHRfbmV4dCh0YXJnZXRfb2JqLCBvX25hbWVkKTsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob19uYW1lZC0+dHlwZSA9PSBBVl9PUFRfVFlQRV9DT05TVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9fbmFtZWQtPnVuaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG9fbmFtZWQtPnVuaXQsIG8tPnVuaXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNpICsgNiA+PSBGRl9BUlJBWV9FTEVNUyhjb25zdF92YWx1ZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhvYmosIEFWX0xPR19FUlJPUiwgImNvbnN0X3ZhbHVlcyBhcnJheSB0b28gc21hbGwgZm9yICVzXG4iLCBvLT51bml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9uYW1lcyBbY2kgIF0gPSBvX25hbWVkLT5uYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3ZhbHVlc1tjaSsrXSA9IERFRkFVTFRfTlVNVkFMKG9fbmFtZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnN0X25hbWVzIFtjaSAgXSA9ICJkZWZhdWx0IjsKKyAgICAgICAgICAgICAgICBjb25zdF92YWx1ZXNbY2krK10gPSBERUZBVUxUX05VTVZBTChvKTsKKyAgICAgICAgICAgICAgICBjb25zdF9uYW1lcyBbY2kgIF0gPSAibWF4IjsKKyAgICAgICAgICAgICAgICBjb25zdF92YWx1ZXNbY2krK10gPSBvLT5tYXg7CisgICAgICAgICAgICAgICAgY29uc3RfbmFtZXMgW2NpICBdID0gIm1pbiI7CisgICAgICAgICAgICAgICAgY29uc3RfdmFsdWVzW2NpKytdID0gby0+bWluOworICAgICAgICAgICAgICAgIGNvbnN0X25hbWVzIFtjaSAgXSA9ICJub25lIjsKKyAgICAgICAgICAgICAgICBjb25zdF92YWx1ZXNbY2krK10gPSAwOworICAgICAgICAgICAgICAgIGNvbnN0X25hbWVzIFtjaSAgXSA9ICJhbGwiOworICAgICAgICAgICAgICAgIGNvbnN0X3ZhbHVlc1tjaSsrXSA9IH4wOworICAgICAgICAgICAgICAgIGNvbnN0X25hbWVzIFtjaV0gPSBOVUxMOworICAgICAgICAgICAgICAgIGNvbnN0X3ZhbHVlc1tjaV0gPSAwOworCisgICAgICAgICAgICAgICAgcmVzID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmZCwgaSA/IGJ1ZiA6IHZhbCwgY29uc3RfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3ZhbHVlcywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgb2JqKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cob2JqLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcGFyc2Ugb3B0aW9uIHZhbHVlIFwiJXNcIlxuIiwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG8tPnR5cGUgPT0gQVZfT1BUX1RZUEVfRkxBR1MpIHsKKyAgICAgICAgICAgIHJlYWRfbnVtYmVyKG8sIGRzdCwgTlVMTCwgTlVMTCwgJmludG51bSk7CisgICAgICAgICAgICBpZiAgICAgIChjbWQgPT0gJysnKSBkID0gaW50bnVtIHwgKGludDY0X3QpZDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNtZCA9PSAnLScpIGQgPSBpbnRudW0gJn4oaW50NjRfdClkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSB3cml0ZV9udW1iZXIob2JqLCBvLCBkc3QsIGQsIDEsIDEpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB2YWwgKz0gaTsKKyAgICAgICAgaWYgKCFpIHx8ICEqdmFsKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3N0cmluZ19pbWFnZV9zaXplKHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKm8sIGNvbnN0IGNoYXIgKnZhbCwgaW50ICpkc3QpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICghdmFsIHx8ICFzdHJjbXAodmFsLCAibm9uZSIpKSB7CisgICAgICAgIGRzdFswXSA9CisgICAgICAgIGRzdFsxXSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXQgPSBhdl9wYXJzZV92aWRlb19zaXplKGRzdCwgZHN0ICsgMSwgdmFsKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHBhcnNlIG9wdGlvbiB2YWx1ZSBcIiVzXCIgYXMgaW1hZ2Ugc2l6ZVxuIiwgdmFsKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNldF9zdHJpbmdfdmlkZW9fcmF0ZSh2b2lkICpvYmosIGNvbnN0IEFWT3B0aW9uICpvLCBjb25zdCBjaGFyICp2YWwsIEFWUmF0aW9uYWwgKmRzdCkKK3sKKyAgICBpbnQgcmV0OworICAgIGlmICghdmFsKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBhdl9wYXJzZV92aWRlb19yYXRlKGRzdCwgdmFsKTsKKyAgICB9CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGF2X2xvZyhvYmosIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBwYXJzZSBvcHRpb24gdmFsdWUgXCIlc1wiIGFzIHZpZGVvIHJhdGVcbiIsIHZhbCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZXRfc3RyaW5nX2NvbG9yKHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKm8sIGNvbnN0IGNoYXIgKnZhbCwgdWludDhfdCAqZHN0KQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoIXZhbCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBhdl9wYXJzZV9jb2xvcihkc3QsIHZhbCwgLTEsIG9iaik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHBhcnNlIG9wdGlvbiB2YWx1ZSBcIiVzXCIgYXMgY29sb3JcbiIsIHZhbCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9zdHJpbmdfZm10KHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKm8sIGNvbnN0IGNoYXIgKnZhbCwgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm10X25iLCBpbnQgKCgqZ2V0X2ZtdCkoY29uc3QgY2hhciAqKSksIGNvbnN0IGNoYXIgKmRlc2MpCit7CisgICAgaW50IGZtdCwgbWluLCBtYXg7CisKKyAgICBpZiAoIXZhbCB8fCAhc3RyY21wKHZhbCwgIm5vbmUiKSkgeworICAgICAgICBmbXQgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbXQgPSBnZXRfZm10KHZhbCk7CisgICAgICAgIGlmIChmbXQgPT0gLTEpIHsKKyAgICAgICAgICAgIGNoYXIgKnRhaWw7CisgICAgICAgICAgICBmbXQgPSBzdHJ0b2wodmFsLCAmdGFpbCwgMCk7CisgICAgICAgICAgICBpZiAoKnRhaWwgfHwgKHVuc2lnbmVkKWZtdCA+PSBmbXRfbmIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cob2JqLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcGFyc2Ugb3B0aW9uIHZhbHVlIFwiJXNcIiBhcyAlc1xuIiwgdmFsLCBkZXNjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbWluID0gRkZNQVgoby0+bWluLCAtMSk7CisgICAgbWF4ID0gRkZNSU4oby0+bWF4LCBmbXRfbmItMSk7CisKKyAgICAvLyBoYWNrIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZmbXBlZworICAgIGlmKG1pbiA9PSAwICYmIG1heCA9PSAwKSB7CisgICAgICAgIG1pbiA9IC0xOworICAgICAgICBtYXggPSBmbXRfbmItMTsKKyAgICB9CisKKyAgICBpZiAoZm10IDwgbWluIHx8IGZtdCA+IG1heCkgeworICAgICAgICBhdl9sb2cob2JqLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVmFsdWUgJWQgZm9yIHBhcmFtZXRlciAnJXMnIG91dCBvZiAlcyBmb3JtYXQgcmFuZ2UgWyVkIC0gJWRdXG4iLAorICAgICAgICAgICAgICAgZm10LCBvLT5uYW1lLCBkZXNjLCBtaW4sIG1heCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVSQU5HRSk7CisgICAgfQorCisgICAgKihpbnQgKilkc3QgPSBmbXQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3N0cmluZ19waXhlbF9mbXQodm9pZCAqb2JqLCBjb25zdCBBVk9wdGlvbiAqbywgY29uc3QgY2hhciAqdmFsLCB1aW50OF90ICpkc3QpCit7CisgICAgcmV0dXJuIHNldF9zdHJpbmdfZm10KG9iaiwgbywgdmFsLCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTkIsIGF2X2dldF9waXhfZm10LCAicGl4ZWwgZm9ybWF0Iik7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3N0cmluZ19zYW1wbGVfZm10KHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKm8sIGNvbnN0IGNoYXIgKnZhbCwgdWludDhfdCAqZHN0KQoreworICAgIHJldHVybiBzZXRfc3RyaW5nX2ZtdChvYmosIG8sIHZhbCwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05CLCBhdl9nZXRfc2FtcGxlX2ZtdCwgInNhbXBsZSBmb3JtYXQiKTsKK30KKworI2lmIEZGX0FQSV9PTERfQVZPUFRJT05TCitpbnQgYXZfc2V0X3N0cmluZzModm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwsIGludCBhbGxvYywgY29uc3QgQVZPcHRpb24gKipvX291dCkKK3sKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kKG9iaiwgbmFtZSwgTlVMTCwgMCwgMCk7CisgICAgaWYgKG9fb3V0KQorICAgICAgICAqb19vdXQgPSBvOworICAgIHJldHVybiBhdl9vcHRfc2V0KG9iaiwgbmFtZSwgdmFsLCAwKTsKK30KKyNlbmRpZgorCitpbnQgYXZfb3B0X3NldCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCwgaW50IHNlYXJjaF9mbGFncykKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB2b2lkICpkc3QsICp0YXJnZXRfb2JqOworICAgIGNvbnN0IEFWT3B0aW9uICpvID0gYXZfb3B0X2ZpbmQyKG9iaiwgbmFtZSwgTlVMTCwgMCwgc2VhcmNoX2ZsYWdzLCAmdGFyZ2V0X29iaik7CisgICAgaWYgKCFvIHx8ICF0YXJnZXRfb2JqKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworICAgIGlmICghdmFsICYmIChvLT50eXBlICE9IEFWX09QVF9UWVBFX1NUUklORyAmJgorICAgICAgICAgICAgICAgICBvLT50eXBlICE9IEFWX09QVF9UWVBFX1BJWEVMX0ZNVCAmJiBvLT50eXBlICE9IEFWX09QVF9UWVBFX1NBTVBMRV9GTVQgJiYKKyAgICAgICAgICAgICAgICAgby0+dHlwZSAhPSBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFICYmIG8tPnR5cGUgIT0gQVZfT1BUX1RZUEVfVklERU9fUkFURSAmJgorICAgICAgICAgICAgICAgICBvLT50eXBlICE9IEFWX09QVF9UWVBFX0RVUkFUSU9OICYmIG8tPnR5cGUgIT0gQVZfT1BUX1RZUEVfQ09MT1IgJiYKKyAgICAgICAgICAgICAgICAgby0+dHlwZSAhPSBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoby0+ZmxhZ3MgJiBBVl9PUFRfRkxBR19SRUFET05MWSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGRzdCA9ICgodWludDhfdCopdGFyZ2V0X29iaikgKyBvLT5vZmZzZXQ7CisgICAgc3dpdGNoIChvLT50eXBlKSB7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9TVFJJTkc6ICAgcmV0dXJuIHNldF9zdHJpbmcob2JqLCBvLCB2YWwsIGRzdCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9CSU5BUlk6ICAgcmV0dXJuIHNldF9zdHJpbmdfYmluYXJ5KG9iaiwgbywgdmFsLCBkc3QpOworICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxBR1M6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIEFWX09QVF9UWVBFX0ZMT0FUOgorICAgIGNhc2UgQVZfT1BUX1RZUEVfRE9VQkxFOgorICAgIGNhc2UgQVZfT1BUX1RZUEVfUkFUSU9OQUw6IHJldHVybiBzZXRfc3RyaW5nX251bWJlcihvYmosIHRhcmdldF9vYmosIG8sIHZhbCwgZHN0KTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0lNQUdFX1NJWkU6IHJldHVybiBzZXRfc3RyaW5nX2ltYWdlX3NpemUob2JqLCBvLCB2YWwsIGRzdCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9WSURFT19SQVRFOiByZXR1cm4gc2V0X3N0cmluZ192aWRlb19yYXRlKG9iaiwgbywgdmFsLCBkc3QpOworICAgIGNhc2UgQVZfT1BUX1RZUEVfUElYRUxfRk1UOiAgcmV0dXJuIHNldF9zdHJpbmdfcGl4ZWxfZm10KG9iaiwgbywgdmFsLCBkc3QpOworICAgIGNhc2UgQVZfT1BUX1RZUEVfU0FNUExFX0ZNVDogcmV0dXJuIHNldF9zdHJpbmdfc2FtcGxlX2ZtdChvYmosIG8sIHZhbCwgZHN0KTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0RVUkFUSU9OOgorICAgICAgICBpZiAoIXZhbCkgeworICAgICAgICAgICAgKihpbnQ2NF90ICopZHN0ID0gMDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9wYXJzZV90aW1lKGRzdCwgdmFsLCAxKSkgPCAwKQorICAgICAgICAgICAgICAgIGF2X2xvZyhvYmosIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBwYXJzZSBvcHRpb24gdmFsdWUgXCIlc1wiIGFzIGR1cmF0aW9uXG4iLCB2YWwpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0NPTE9SOiAgICAgIHJldHVybiBzZXRfc3RyaW5nX2NvbG9yKG9iaiwgbywgdmFsLCBkc3QpOworICAgIGNhc2UgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQ6CisgICAgICAgIGlmICghdmFsIHx8ICFzdHJjbXAodmFsLCAibm9uZSIpKSB7CisgICAgICAgICAgICAqKGludDY0X3QgKilkc3QgPSAwOworICAgICAgICB9IGVsc2UgeworI2lmIEZGX0FQSV9HRVRfQ0hBTk5FTF9MQVlPVVRfQ09NUEFUCisgICAgICAgICAgICBpbnQ2NF90IGNsID0gZmZfZ2V0X2NoYW5uZWxfbGF5b3V0KHZhbCwgMCk7CisjZWxzZQorICAgICAgICAgICAgaW50NjRfdCBjbCA9IGF2X2dldF9jaGFubmVsX2xheW91dCh2YWwpOworI2VuZGlmCisgICAgICAgICAgICBpZiAoIWNsKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHBhcnNlIG9wdGlvbiB2YWx1ZSBcIiVzXCIgYXMgY2hhbm5lbCBsYXlvdXRcbiIsIHZhbCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQ2NF90ICopZHN0ID0gY2w7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGF2X2xvZyhvYmosIEFWX0xPR19FUlJPUiwgIkludmFsaWQgb3B0aW9uIHR5cGUuXG4iKTsKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCisjZGVmaW5lIE9QVF9FVkFMX05VTUJFUihuYW1lLCBvcHR0eXBlLCB2YXJ0eXBlKVwKKyAgICBpbnQgYXZfb3B0X2V2YWxfICMjIG5hbWUodm9pZCAqb2JqLCBjb25zdCBBVk9wdGlvbiAqbywgY29uc3QgY2hhciAqdmFsLCB2YXJ0eXBlICpuYW1lICMjIF9vdXQpXAorICAgIHtcCisgICAgICAgIGlmICghbyB8fCBvLT50eXBlICE9IG9wdHR5cGUgfHwgby0+ZmxhZ3MgJiBBVl9PUFRfRkxBR19SRUFET05MWSlcCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpO1wKKyAgICAgICAgcmV0dXJuIHNldF9zdHJpbmdfbnVtYmVyKG9iaiwgb2JqLCBvLCB2YWwsIG5hbWUgIyMgX291dCk7XAorICAgIH0KKworT1BUX0VWQUxfTlVNQkVSKGZsYWdzLCAgQVZfT1BUX1RZUEVfRkxBR1MsICAgIGludCkKK09QVF9FVkFMX05VTUJFUihpbnQsICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICBpbnQpCitPUFRfRVZBTF9OVU1CRVIoaW50NjQsICBBVl9PUFRfVFlQRV9JTlQ2NCwgICAgaW50NjRfdCkKK09QVF9FVkFMX05VTUJFUihmbG9hdCwgIEFWX09QVF9UWVBFX0ZMT0FULCAgICBmbG9hdCkKK09QVF9FVkFMX05VTUJFUihkb3VibGUsIEFWX09QVF9UWVBFX0RPVUJMRSwgICBkb3VibGUpCitPUFRfRVZBTF9OVU1CRVIocSwgICAgICBBVl9PUFRfVFlQRV9SQVRJT05BTCwgQVZSYXRpb25hbCkKKworc3RhdGljIGludCBzZXRfbnVtYmVyKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgZG91YmxlIG51bSwgaW50IGRlbiwgaW50NjRfdCBpbnRudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlYXJjaF9mbGFncykKK3sKKyAgICB2b2lkICpkc3QsICp0YXJnZXRfb2JqOworICAgIGNvbnN0IEFWT3B0aW9uICpvID0gYXZfb3B0X2ZpbmQyKG9iaiwgbmFtZSwgTlVMTCwgMCwgc2VhcmNoX2ZsYWdzLCAmdGFyZ2V0X29iaik7CisKKyAgICBpZiAoIW8gfHwgIXRhcmdldF9vYmopCisgICAgICAgIHJldHVybiBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7CisKKyAgICBpZiAoby0+ZmxhZ3MgJiBBVl9PUFRfRkxBR19SRUFET05MWSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGRzdCA9ICgodWludDhfdCopdGFyZ2V0X29iaikgKyBvLT5vZmZzZXQ7CisgICAgcmV0dXJuIHdyaXRlX251bWJlcihvYmosIG8sIGRzdCwgbnVtLCBkZW4sIGludG51bSk7Cit9CisKKyNpZiBGRl9BUElfT0xEX0FWT1BUSU9OUworY29uc3QgQVZPcHRpb24gKmF2X3NldF9kb3VibGUodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgbikKK3sKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kKG9iaiwgbmFtZSwgTlVMTCwgMCwgMCk7CisgICAgaWYgKHNldF9udW1iZXIob2JqLCBuYW1lLCBuLCAxLCAxLCAwKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBvOworfQorCitjb25zdCBBVk9wdGlvbiAqYXZfc2V0X3Eodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBBVlJhdGlvbmFsIG4pCit7CisgICAgY29uc3QgQVZPcHRpb24gKm8gPSBhdl9vcHRfZmluZChvYmosIG5hbWUsIE5VTEwsIDAsIDApOworICAgIGlmIChzZXRfbnVtYmVyKG9iaiwgbmFtZSwgbi5udW0sIG4uZGVuLCAxLCAwKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBvOworfQorCitjb25zdCBBVk9wdGlvbiAqYXZfc2V0X2ludCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgbikKK3sKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kKG9iaiwgbmFtZSwgTlVMTCwgMCwgMCk7CisgICAgaWYgKHNldF9udW1iZXIob2JqLCBuYW1lLCAxLCAxLCBuLCAwKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBvOworfQorI2VuZGlmCisKK2ludCBhdl9vcHRfc2V0X2ludCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgdmFsLCBpbnQgc2VhcmNoX2ZsYWdzKQoreworICAgIHJldHVybiBzZXRfbnVtYmVyKG9iaiwgbmFtZSwgMSwgMSwgdmFsLCBzZWFyY2hfZmxhZ3MpOworfQorCitpbnQgYXZfb3B0X3NldF9kb3VibGUodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgdmFsLCBpbnQgc2VhcmNoX2ZsYWdzKQoreworICAgIHJldHVybiBzZXRfbnVtYmVyKG9iaiwgbmFtZSwgdmFsLCAxLCAxLCBzZWFyY2hfZmxhZ3MpOworfQorCitpbnQgYXZfb3B0X3NldF9xKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgQVZSYXRpb25hbCB2YWwsIGludCBzZWFyY2hfZmxhZ3MpCit7CisgICAgcmV0dXJuIHNldF9udW1iZXIob2JqLCBuYW1lLCB2YWwubnVtLCB2YWwuZGVuLCAxLCBzZWFyY2hfZmxhZ3MpOworfQorCitpbnQgYXZfb3B0X3NldF9iaW4odm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB1aW50OF90ICp2YWwsIGludCBsZW4sIGludCBzZWFyY2hfZmxhZ3MpCit7CisgICAgdm9pZCAqdGFyZ2V0X29iajsKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kMihvYmosIG5hbWUsIE5VTEwsIDAsIHNlYXJjaF9mbGFncywgJnRhcmdldF9vYmopOworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICB1aW50OF90ICoqZHN0OworICAgIGludCAqbGVuZHN0OworCisgICAgaWYgKCFvIHx8ICF0YXJnZXRfb2JqKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworCisgICAgaWYgKG8tPnR5cGUgIT0gQVZfT1BUX1RZUEVfQklOQVJZIHx8IG8tPmZsYWdzICYgQVZfT1BUX0ZMQUdfUkVBRE9OTFkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBwdHIgPSBsZW4gPyBhdl9tYWxsb2MobGVuKSA6IE5VTEw7CisgICAgaWYgKGxlbiAmJiAhcHRyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZHN0ID0gKHVpbnQ4X3QgKiopKCgodWludDhfdCAqKXRhcmdldF9vYmopICsgby0+b2Zmc2V0KTsKKyAgICBsZW5kc3QgPSAoaW50ICopKGRzdCArIDEpOworCisgICAgYXZfZnJlZSgqZHN0KTsKKyAgICAqZHN0ID0gcHRyOworICAgICpsZW5kc3QgPSBsZW47CisgICAgaWYgKGxlbikKKyAgICAgICAgbWVtY3B5KHB0ciwgdmFsLCBsZW4pOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9vcHRfc2V0X2ltYWdlX3NpemUodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgdywgaW50IGgsIGludCBzZWFyY2hfZmxhZ3MpCit7CisgICAgdm9pZCAqdGFyZ2V0X29iajsKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kMihvYmosIG5hbWUsIE5VTEwsIDAsIHNlYXJjaF9mbGFncywgJnRhcmdldF9vYmopOworCisgICAgaWYgKCFvIHx8ICF0YXJnZXRfb2JqKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworICAgIGlmIChvLT50eXBlICE9IEFWX09QVF9UWVBFX0lNQUdFX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoZSB2YWx1ZSBzZXQgYnkgb3B0aW9uICclcycgaXMgbm90IGFuIGltYWdlIHNpemUuXG4iLCBvLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKHc8MCB8fCBoPDApIHsKKyAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkludmFsaWQgbmVnYXRpdmUgc2l6ZSB2YWx1ZSAlZHglZCBmb3Igc2l6ZSAnJXMnXG4iLCB3LCBoLCBvLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgKihpbnQgKikoKCh1aW50OF90ICopdGFyZ2V0X29iaikgICAgICAgICAgICAgKyBvLT5vZmZzZXQpID0gdzsKKyAgICAqKGludCAqKSgoKHVpbnQ4X3QgKil0YXJnZXRfb2JqK3NpemVvZihpbnQpKSArIG8tPm9mZnNldCkgPSBoOworICAgIHJldHVybiAwOworfQorCitpbnQgYXZfb3B0X3NldF92aWRlb19yYXRlKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgQVZSYXRpb25hbCB2YWwsIGludCBzZWFyY2hfZmxhZ3MpCit7CisgICAgdm9pZCAqdGFyZ2V0X29iajsKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kMihvYmosIG5hbWUsIE5VTEwsIDAsIHNlYXJjaF9mbGFncywgJnRhcmdldF9vYmopOworCisgICAgaWYgKCFvIHx8ICF0YXJnZXRfb2JqKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworICAgIGlmIChvLT50eXBlICE9IEFWX09QVF9UWVBFX1ZJREVPX1JBVEUpIHsKKyAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoZSB2YWx1ZSBzZXQgYnkgb3B0aW9uICclcycgaXMgbm90IGEgdmlkZW8gcmF0ZS5cbiIsIG8tPm5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAodmFsLm51bSA8PSAwIHx8IHZhbC5kZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICByZXR1cm4gc2V0X251bWJlcihvYmosIG5hbWUsIHZhbC5udW0sIHZhbC5kZW4sIDEsIHNlYXJjaF9mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2Zvcm1hdCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbXQsIGludCBzZWFyY2hfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVk9wdGlvblR5cGUgdHlwZSwgY29uc3QgY2hhciAqZGVzYywgaW50IG5iX2ZtdHMpCit7CisgICAgdm9pZCAqdGFyZ2V0X29iajsKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kMihvYmosIG5hbWUsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoX2ZsYWdzLCAmdGFyZ2V0X29iaik7CisgICAgaW50IG1pbiwgbWF4OworCisgICAgaWYgKCFvIHx8ICF0YXJnZXRfb2JqKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworICAgIGlmIChvLT50eXBlICE9IHR5cGUpIHsKKyAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoZSB2YWx1ZSBzZXQgYnkgb3B0aW9uICclcycgaXMgbm90IGEgJXMgZm9ybWF0IiwgbmFtZSwgZGVzYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgbWluID0gRkZNQVgoby0+bWluLCAtMSk7CisgICAgbWF4ID0gRkZNSU4oby0+bWF4LCBuYl9mbXRzLTEpOworCisgICAgaWYgKGZtdCA8IG1pbiB8fCBmbXQgPiBtYXgpIHsKKyAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlZhbHVlICVkIGZvciBwYXJhbWV0ZXIgJyVzJyBvdXQgb2YgJXMgZm9ybWF0IHJhbmdlIFslZCAtICVkXVxuIiwKKyAgICAgICAgICAgICAgIGZtdCwgbmFtZSwgZGVzYywgbWluLCBtYXgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFUkFOR0UpOworICAgIH0KKyAgICAqKGludCAqKSgoKHVpbnQ4X3QgKil0YXJnZXRfb2JqKSArIG8tPm9mZnNldCkgPSBmbXQ7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9vcHRfc2V0X3BpeGVsX2ZtdCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gQVZQaXhlbEZvcm1hdCBmbXQsIGludCBzZWFyY2hfZmxhZ3MpCit7CisgICAgcmV0dXJuIHNldF9mb3JtYXQob2JqLCBuYW1lLCBmbXQsIHNlYXJjaF9mbGFncywgQVZfT1BUX1RZUEVfUElYRUxfRk1ULCAicGl4ZWwiLCBBVl9QSVhfRk1UX05CKTsKK30KKworaW50IGF2X29wdF9zZXRfc2FtcGxlX2ZtdCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gQVZTYW1wbGVGb3JtYXQgZm10LCBpbnQgc2VhcmNoX2ZsYWdzKQoreworICAgIHJldHVybiBzZXRfZm9ybWF0KG9iaiwgbmFtZSwgZm10LCBzZWFyY2hfZmxhZ3MsIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQsICJzYW1wbGUiLCBBVl9TQU1QTEVfRk1UX05CKTsKK30KKworaW50IGF2X29wdF9zZXRfY2hhbm5lbF9sYXlvdXQodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90IGNsLCBpbnQgc2VhcmNoX2ZsYWdzKQoreworICAgIHZvaWQgKnRhcmdldF9vYmo7CisgICAgY29uc3QgQVZPcHRpb24gKm8gPSBhdl9vcHRfZmluZDIob2JqLCBuYW1lLCBOVUxMLCAwLCBzZWFyY2hfZmxhZ3MsICZ0YXJnZXRfb2JqKTsKKworICAgIGlmICghbyB8fCAhdGFyZ2V0X29iaikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfT1BUSU9OX05PVF9GT1VORDsKKyAgICBpZiAoby0+dHlwZSAhPSBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVCkgeworICAgICAgICBhdl9sb2cob2JqLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVGhlIHZhbHVlIHNldCBieSBvcHRpb24gJyVzJyBpcyBub3QgYSBjaGFubmVsIGxheW91dC5cbiIsIG8tPm5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICAqKGludDY0X3QgKikoKCh1aW50OF90ICopdGFyZ2V0X29iaikgKyBvLT5vZmZzZXQpID0gY2w7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBGRl9BUElfT0xEX0FWT1BUSU9OUworLyoqCisgKgorICogQHBhcmFtIGJ1ZiBhIGJ1ZmZlciB3aGljaCBpcyB1c2VkIGZvciByZXR1cm5pbmcgbm9uIHN0cmluZyB2YWx1ZXMgYXMgc3RyaW5ncywgY2FuIGJlIE5VTEwKKyAqIEBwYXJhbSBidWZfbGVuIGFsbG9jYXRlZCBsZW5ndGggaW4gYnl0ZXMgb2YgYnVmCisgKi8KK2NvbnN0IGNoYXIgKmF2X2dldF9zdHJpbmcodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBVk9wdGlvbiAqKm9fb3V0LCBjaGFyICpidWYsIGludCBidWZfbGVuKQoreworICAgIGNvbnN0IEFWT3B0aW9uICpvID0gYXZfb3B0X2ZpbmQob2JqLCBuYW1lLCBOVUxMLCAwLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKTsKKyAgICB2b2lkICpkc3Q7CisgICAgdWludDhfdCAqYmluOworICAgIGludCBsZW4sIGk7CisgICAgaWYgKCFvKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoby0+dHlwZSAhPSBBVl9PUFRfVFlQRV9TVFJJTkcgJiYgKCFidWYgfHwgIWJ1Zl9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGRzdD0gKCh1aW50OF90KilvYmopICsgby0+b2Zmc2V0OworICAgIGlmIChvX291dCkgKm9fb3V0PSBvOworCisgICAgc3dpdGNoIChvLT50eXBlKSB7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9GTEFHUzogICAgIHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgIjB4JTA4WCIsKihpbnQgICAgKilkc3QpO2JyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UOiAgICAgICBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICIlZCIgLCAqKGludCAgICAqKWRzdCk7YnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDogICAgIHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgIiUiUFJJZDY0LCAqKGludDY0X3QqKWRzdCk7YnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9GTE9BVDogICAgIHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgIiVmIiAsICooZmxvYXQgICopZHN0KTticmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0RPVUJMRTogICAgc25wcmludGYoYnVmLCBidWZfbGVuLCAiJWYiICwgKihkb3VibGUgKilkc3QpO2JyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfUkFUSU9OQUw6ICBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICIlZC8lZCIsICgoQVZSYXRpb25hbCopZHN0KS0+bnVtLCAoKEFWUmF0aW9uYWwqKWRzdCktPmRlbik7YnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9DT05TVDogICAgIHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgIiVmIiAsIG8tPmRlZmF1bHRfdmFsLmRibCk7YnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9TVFJJTkc6ICAgIHJldHVybiAqKHZvaWQqKilkc3Q7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9CSU5BUlk6CisgICAgICAgIGxlbiA9ICooaW50KikoKCh1aW50OF90ICopZHN0KSArIHNpemVvZih1aW50OF90ICopKTsKKyAgICAgICAgaWYgKGxlbiA+PSAoYnVmX2xlbiArIDEpLzIpIHJldHVybiBOVUxMOworICAgICAgICBiaW4gPSAqKHVpbnQ4X3QqKilkc3Q7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgc25wcmludGYoYnVmICsgaSoyLCAzLCAiJTAyWCIsIGJpbltpXSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorI2VuZGlmCisKK2ludCBhdl9vcHRfc2V0X2RpY3RfdmFsKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgQVZEaWN0aW9uYXJ5ICp2YWwsIGludCBzZWFyY2hfZmxhZ3MpCit7CisgICAgdm9pZCAqdGFyZ2V0X29iajsKKyAgICBBVkRpY3Rpb25hcnkgKipkc3Q7CisgICAgY29uc3QgQVZPcHRpb24gKm8gPSBhdl9vcHRfZmluZDIob2JqLCBuYW1lLCBOVUxMLCAwLCBzZWFyY2hfZmxhZ3MsICZ0YXJnZXRfb2JqKTsKKworICAgIGlmICghbyB8fCAhdGFyZ2V0X29iaikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfT1BUSU9OX05PVF9GT1VORDsKKyAgICBpZiAoby0+ZmxhZ3MgJiBBVl9PUFRfRkxBR19SRUFET05MWSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGRzdCA9IChBVkRpY3Rpb25hcnkgKiopKCgodWludDhfdCAqKXRhcmdldF9vYmopICsgby0+b2Zmc2V0KTsKKyAgICBhdl9kaWN0X2ZyZWUoZHN0KTsKKyAgICBhdl9kaWN0X2NvcHkoZHN0LCB2YWwsIDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9vcHRfZ2V0KHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncywgdWludDhfdCAqKm91dF92YWwpCit7CisgICAgdm9pZCAqZHN0LCAqdGFyZ2V0X29iajsKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kMihvYmosIG5hbWUsIE5VTEwsIDAsIHNlYXJjaF9mbGFncywgJnRhcmdldF9vYmopOworICAgIHVpbnQ4X3QgKmJpbiwgYnVmWzEyOF07CisgICAgaW50IGxlbiwgaSwgcmV0OworICAgIGludDY0X3QgaTY0OworCisgICAgaWYgKCFvIHx8ICF0YXJnZXRfb2JqIHx8IChvLT5vZmZzZXQ8PTAgJiYgby0+dHlwZSAhPSBBVl9PUFRfVFlQRV9DT05TVCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7CisKKyAgICBkc3QgPSAodWludDhfdCopdGFyZ2V0X29iaiArIG8tPm9mZnNldDsKKworICAgIGJ1ZlswXSA9IDA7CisgICAgc3dpdGNoIChvLT50eXBlKSB7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9GTEFHUzogICAgIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIweCUwOFgiLCAgKihpbnQgICAgKilkc3QpO2JyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UOiAgICAgICByZXQgPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiICwgICAgICooaW50ICAgICopZHN0KTticmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0lOVDY0OiAgICAgcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUiUFJJZDY0LCAqKGludDY0X3QqKWRzdCk7YnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9GTE9BVDogICAgIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZiIgLCAgICAgKihmbG9hdCAgKilkc3QpO2JyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfRE9VQkxFOiAgICByZXQgPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWYiICwgICAgICooZG91YmxlICopZHN0KTticmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1ZJREVPX1JBVEU6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9SQVRJT05BTDogIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZC8lZCIsICAgKChBVlJhdGlvbmFsKilkc3QpLT5udW0sICgoQVZSYXRpb25hbCopZHN0KS0+ZGVuKTticmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0NPTlNUOiAgICAgcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVmIiAsICAgICBvLT5kZWZhdWx0X3ZhbC5kYmwpO2JyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfU1RSSU5HOgorICAgICAgICBpZiAoKih1aW50OF90KiopZHN0KQorICAgICAgICAgICAgKm91dF92YWwgPSBhdl9zdHJkdXAoKih1aW50OF90KiopZHN0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKm91dF92YWwgPSBhdl9zdHJkdXAoIiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0JJTkFSWToKKyAgICAgICAgbGVuID0gKihpbnQqKSgoKHVpbnQ4X3QgKilkc3QpICsgc2l6ZW9mKHVpbnQ4X3QgKikpOworICAgICAgICBpZiAoKHVpbnQ2NF90KWxlbioyICsgMSA+IElOVF9NQVgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBpZiAoISgqb3V0X3ZhbCA9IGF2X21hbGxvYyhsZW4qMiArIDEpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGlmICghbGVuKSB7CisgICAgICAgICAgICAqb3V0X3ZhbFswXSA9ICdcMCc7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBiaW4gPSAqKHVpbnQ4X3QqKilkc3Q7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgIHNucHJpbnRmKCpvdXRfdmFsICsgaSoyLCAzLCAiJTAyWCIsIGJpbltpXSk7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgQVZfT1BUX1RZUEVfSU1BR0VfU0laRToKKyAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkeCVkIiwgKChpbnQgKilkc3QpWzBdLCAoKGludCAqKWRzdClbMV0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1BJWEVMX0ZNVDoKKyAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgKGNoYXIgKilhdl94X2lmX251bGwoYXZfZ2V0X3BpeF9mbXRfbmFtZSgqKGVudW0gQVZQaXhlbEZvcm1hdCAqKWRzdCksICJub25lIikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQ6CisgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyIsIChjaGFyICopYXZfeF9pZl9udWxsKGF2X2dldF9zYW1wbGVfZm10X25hbWUoKihlbnVtIEFWU2FtcGxlRm9ybWF0ICopZHN0KSwgIm5vbmUiKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfRFVSQVRJT046CisgICAgICAgIGk2NCA9ICooaW50NjRfdCAqKWRzdDsKKyAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUiUFJJaTY0IjolMDJkOiUwMmQuJTA2ZCIsCisgICAgICAgICAgICAgICAgICAgICAgIGk2NCAvIDM2MDAwMDAwMDAsIChpbnQpKChpNjQgLyA2MDAwMDAwMCkgJSA2MCksCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChpNjQgLyAxMDAwMDAwKSAlIDYwKSwgKGludCkoaTY0ICUgMTAwMDAwMCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0NPTE9SOgorICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiMHglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKHVpbnQ4X3QgKilkc3QpWzBdLCAoaW50KSgodWludDhfdCAqKWRzdClbMV0sCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCh1aW50OF90ICopZHN0KVsyXSwgKGludCkoKHVpbnQ4X3QgKilkc3QpWzNdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVDoKKyAgICAgICAgaTY0ID0gKihpbnQ2NF90ICopZHN0OworICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiMHglIlBSSXg2NCwgaTY0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAocmV0ID49IHNpemVvZihidWYpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICpvdXRfdmFsID0gYXZfc3RyZHVwKGJ1Zik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X251bWJlcih2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFWT3B0aW9uICoqb19vdXQsIGRvdWJsZSAqbnVtLCBpbnQgKmRlbiwgaW50NjRfdCAqaW50bnVtLAorICAgICAgICAgICAgICAgICAgICAgIGludCBzZWFyY2hfZmxhZ3MpCit7CisgICAgdm9pZCAqZHN0LCAqdGFyZ2V0X29iajsKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kMihvYmosIG5hbWUsIE5VTEwsIDAsIHNlYXJjaF9mbGFncywgJnRhcmdldF9vYmopOworICAgIGlmICghbyB8fCAhdGFyZ2V0X29iaikKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIGRzdCA9ICgodWludDhfdCopdGFyZ2V0X29iaikgKyBvLT5vZmZzZXQ7CisKKyAgICBpZiAob19vdXQpICpvX291dD0gbzsKKworICAgIHJldHVybiByZWFkX251bWJlcihvLCBkc3QsIG51bSwgZGVuLCBpbnRudW0pOworCitlcnJvcjoKKyAgICAqZGVuPSppbnRudW09MDsKKyAgICByZXR1cm4gLTE7Cit9CisKKyNpZiBGRl9BUElfT0xEX0FWT1BUSU9OUworZG91YmxlIGF2X2dldF9kb3VibGUodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBVk9wdGlvbiAqKm9fb3V0KQoreworICAgIGludDY0X3QgaW50bnVtPTE7CisgICAgZG91YmxlIG51bT0xOworICAgIGludCBkZW49MTsKKworICAgIGlmIChnZXRfbnVtYmVyKG9iaiwgbmFtZSwgb19vdXQsICZudW0sICZkZW4sICZpbnRudW0sIDApIDwgMCkKKyAgICAgICAgcmV0dXJuIE5BTjsKKyAgICByZXR1cm4gbnVtKmludG51bS9kZW47Cit9CisKK0FWUmF0aW9uYWwgYXZfZ2V0X3Eodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBVk9wdGlvbiAqKm9fb3V0KQoreworICAgIGludDY0X3QgaW50bnVtPTE7CisgICAgZG91YmxlIG51bT0xOworICAgIGludCBkZW49MTsKKworICAgIGlmIChnZXRfbnVtYmVyKG9iaiwgbmFtZSwgb19vdXQsICZudW0sICZkZW4sICZpbnRudW0sIDApIDwgMCkKKyAgICAgICAgcmV0dXJuIChBVlJhdGlvbmFsKXswLCAwfTsKKyAgICBpZiAobnVtID09IDEuMCAmJiAoaW50KWludG51bSA9PSBpbnRudW0pCisgICAgICAgIHJldHVybiAoQVZSYXRpb25hbCl7aW50bnVtLCBkZW59OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGF2X2QycShudW0qaW50bnVtL2RlbiwgMTw8MjQpOworfQorCitpbnQ2NF90IGF2X2dldF9pbnQodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBVk9wdGlvbiAqKm9fb3V0KQoreworICAgIGludDY0X3QgaW50bnVtPTE7CisgICAgZG91YmxlIG51bT0xOworICAgIGludCBkZW49MTsKKworICAgIGlmIChnZXRfbnVtYmVyKG9iaiwgbmFtZSwgb19vdXQsICZudW0sICZkZW4sICZpbnRudW0sIDApIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBudW0qaW50bnVtL2RlbjsKK30KKyNlbmRpZgorCitpbnQgYXZfb3B0X2dldF9pbnQodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc2VhcmNoX2ZsYWdzLCBpbnQ2NF90ICpvdXRfdmFsKQoreworICAgIGludDY0X3QgaW50bnVtID0gMTsKKyAgICBkb3VibGUgICAgIG51bSA9IDE7CisgICAgaW50ICAgcmV0LCBkZW4gPSAxOworCisgICAgaWYgKChyZXQgPSBnZXRfbnVtYmVyKG9iaiwgbmFtZSwgTlVMTCwgJm51bSwgJmRlbiwgJmludG51bSwgc2VhcmNoX2ZsYWdzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgICpvdXRfdmFsID0gbnVtKmludG51bS9kZW47CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9vcHRfZ2V0X2RvdWJsZSh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2hfZmxhZ3MsIGRvdWJsZSAqb3V0X3ZhbCkKK3sKKyAgICBpbnQ2NF90IGludG51bSA9IDE7CisgICAgZG91YmxlICAgICBudW0gPSAxOworICAgIGludCAgIHJldCwgZGVuID0gMTsKKworICAgIGlmICgocmV0ID0gZ2V0X251bWJlcihvYmosIG5hbWUsIE5VTEwsICZudW0sICZkZW4sICZpbnRudW0sIHNlYXJjaF9mbGFncykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAqb3V0X3ZhbCA9IG51bSppbnRudW0vZGVuOworICAgIHJldHVybiAwOworfQorCitpbnQgYXZfb3B0X2dldF9xKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncywgQVZSYXRpb25hbCAqb3V0X3ZhbCkKK3sKKyAgICBpbnQ2NF90IGludG51bSA9IDE7CisgICAgZG91YmxlICAgICBudW0gPSAxOworICAgIGludCAgIHJldCwgZGVuID0gMTsKKworICAgIGlmICgocmV0ID0gZ2V0X251bWJlcihvYmosIG5hbWUsIE5VTEwsICZudW0sICZkZW4sICZpbnRudW0sIHNlYXJjaF9mbGFncykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChudW0gPT0gMS4wICYmIChpbnQpaW50bnVtID09IGludG51bSkKKyAgICAgICAgKm91dF92YWwgPSAoQVZSYXRpb25hbCl7aW50bnVtLCBkZW59OworICAgIGVsc2UKKyAgICAgICAgKm91dF92YWwgPSBhdl9kMnEobnVtKmludG51bS9kZW4sIDE8PDI0KTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X29wdF9nZXRfaW1hZ2Vfc2l6ZSh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2hfZmxhZ3MsIGludCAqd19vdXQsIGludCAqaF9vdXQpCit7CisgICAgdm9pZCAqZHN0LCAqdGFyZ2V0X29iajsKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kMihvYmosIG5hbWUsIE5VTEwsIDAsIHNlYXJjaF9mbGFncywgJnRhcmdldF9vYmopOworICAgIGlmICghbyB8fCAhdGFyZ2V0X29iaikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfT1BUSU9OX05PVF9GT1VORDsKKyAgICBpZiAoby0+dHlwZSAhPSBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhvYmosIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUaGUgdmFsdWUgZm9yIG9wdGlvbiAnJXMnIGlzIG5vdCBhbiBpbWFnZSBzaXplLlxuIiwgbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZHN0ID0gKCh1aW50OF90Kil0YXJnZXRfb2JqKSArIG8tPm9mZnNldDsKKyAgICBpZiAod19vdXQpICp3X291dCA9ICooaW50ICopZHN0OworICAgIGlmIChoX291dCkgKmhfb3V0ID0gKigoaW50ICopZHN0KzEpOworICAgIHJldHVybiAwOworfQorCitpbnQgYXZfb3B0X2dldF92aWRlb19yYXRlKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncywgQVZSYXRpb25hbCAqb3V0X3ZhbCkKK3sKKyAgICBpbnQ2NF90IGludG51bSA9IDE7CisgICAgZG91YmxlICAgICBudW0gPSAxOworICAgIGludCAgIHJldCwgZGVuID0gMTsKKworICAgIGlmICgocmV0ID0gZ2V0X251bWJlcihvYmosIG5hbWUsIE5VTEwsICZudW0sICZkZW4sICZpbnRudW0sIHNlYXJjaF9mbGFncykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChudW0gPT0gMS4wICYmIChpbnQpaW50bnVtID09IGludG51bSkKKyAgICAgICAgKm91dF92YWwgPSAoQVZSYXRpb25hbCl7aW50bnVtLCBkZW59OworICAgIGVsc2UKKyAgICAgICAgKm91dF92YWwgPSBhdl9kMnEobnVtKmludG51bS9kZW4sIDE8PDI0KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfZm9ybWF0KHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncywgaW50ICpvdXRfZm10LAorICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZPcHRpb25UeXBlIHR5cGUsIGNvbnN0IGNoYXIgKmRlc2MpCit7CisgICAgdm9pZCAqZHN0LCAqdGFyZ2V0X29iajsKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kMihvYmosIG5hbWUsIE5VTEwsIDAsIHNlYXJjaF9mbGFncywgJnRhcmdldF9vYmopOworICAgIGlmICghbyB8fCAhdGFyZ2V0X29iaikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfT1BUSU9OX05PVF9GT1VORDsKKyAgICBpZiAoby0+dHlwZSAhPSB0eXBlKSB7CisgICAgICAgIGF2X2xvZyhvYmosIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUaGUgdmFsdWUgZm9yIG9wdGlvbiAnJXMnIGlzIG5vdCBhICVzIGZvcm1hdC5cbiIsIGRlc2MsIG5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGRzdCA9ICgodWludDhfdCopdGFyZ2V0X29iaikgKyBvLT5vZmZzZXQ7CisgICAgKm91dF9mbXQgPSAqKGludCAqKWRzdDsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X29wdF9nZXRfcGl4ZWxfZm10KHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncywgZW51bSBBVlBpeGVsRm9ybWF0ICpvdXRfZm10KQoreworICAgIHJldHVybiBnZXRfZm9ybWF0KG9iaiwgbmFtZSwgc2VhcmNoX2ZsYWdzLCBvdXRfZm10LCBBVl9PUFRfVFlQRV9QSVhFTF9GTVQsICJwaXhlbCIpOworfQorCitpbnQgYXZfb3B0X2dldF9zYW1wbGVfZm10KHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncywgZW51bSBBVlNhbXBsZUZvcm1hdCAqb3V0X2ZtdCkKK3sKKyAgICByZXR1cm4gZ2V0X2Zvcm1hdChvYmosIG5hbWUsIHNlYXJjaF9mbGFncywgb3V0X2ZtdCwgQVZfT1BUX1RZUEVfU0FNUExFX0ZNVCwgInNhbXBsZSIpOworfQorCitpbnQgYXZfb3B0X2dldF9jaGFubmVsX2xheW91dCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2hfZmxhZ3MsIGludDY0X3QgKmNsKQoreworICAgIHZvaWQgKmRzdCwgKnRhcmdldF9vYmo7CisgICAgY29uc3QgQVZPcHRpb24gKm8gPSBhdl9vcHRfZmluZDIob2JqLCBuYW1lLCBOVUxMLCAwLCBzZWFyY2hfZmxhZ3MsICZ0YXJnZXRfb2JqKTsKKyAgICBpZiAoIW8gfHwgIXRhcmdldF9vYmopCisgICAgICAgIHJldHVybiBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7CisgICAgaWYgKG8tPnR5cGUgIT0gQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQpIHsKKyAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoZSB2YWx1ZSBmb3Igb3B0aW9uICclcycgaXMgbm90IGEgY2hhbm5lbCBsYXlvdXQuXG4iLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBkc3QgPSAoKHVpbnQ4X3QqKXRhcmdldF9vYmopICsgby0+b2Zmc2V0OworICAgICpjbCA9ICooaW50NjRfdCAqKWRzdDsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X29wdF9nZXRfZGljdF92YWwodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc2VhcmNoX2ZsYWdzLCBBVkRpY3Rpb25hcnkgKipvdXRfdmFsKQoreworICAgIHZvaWQgKnRhcmdldF9vYmo7CisgICAgQVZEaWN0aW9uYXJ5ICpzcmM7CisgICAgY29uc3QgQVZPcHRpb24gKm8gPSBhdl9vcHRfZmluZDIob2JqLCBuYW1lLCBOVUxMLCAwLCBzZWFyY2hfZmxhZ3MsICZ0YXJnZXRfb2JqKTsKKworICAgIGlmICghbyB8fCAhdGFyZ2V0X29iaikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfT1BUSU9OX05PVF9GT1VORDsKKyAgICBpZiAoby0+dHlwZSAhPSBBVl9PUFRfVFlQRV9ESUNUKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgc3JjID0gKihBVkRpY3Rpb25hcnkgKiopKCgodWludDhfdCAqKXRhcmdldF9vYmopICsgby0+b2Zmc2V0KTsKKyAgICBhdl9kaWN0X2NvcHkob3V0X3ZhbCwgc3JjLCAwKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgYXZfb3B0X2ZsYWdfaXNfc2V0KHZvaWQgKm9iaiwgY29uc3QgY2hhciAqZmllbGRfbmFtZSwgY29uc3QgY2hhciAqZmxhZ19uYW1lKQoreworICAgIGNvbnN0IEFWT3B0aW9uICpmaWVsZCA9IGF2X29wdF9maW5kKG9iaiwgZmllbGRfbmFtZSwgTlVMTCwgMCwgMCk7CisgICAgY29uc3QgQVZPcHRpb24gKmZsYWcgID0gYXZfb3B0X2ZpbmQob2JqLCBmbGFnX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPyBmaWVsZC0+dW5pdCA6IE5VTEwsIDAsIDApOworICAgIGludDY0X3QgcmVzOworCisgICAgaWYgKCFmaWVsZCB8fCAhZmxhZyB8fCBmbGFnLT50eXBlICE9IEFWX09QVF9UWVBFX0NPTlNUIHx8CisgICAgICAgIGF2X29wdF9nZXRfaW50KG9iaiwgZmllbGRfbmFtZSwgMCwgJnJlcykgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcmVzICYgZmxhZy0+ZGVmYXVsdF92YWwuaTY0OworfQorCitzdGF0aWMgdm9pZCBsb2dfdmFsdWUodm9pZCAqYXZfbG9nX29iaiwgaW50IGxldmVsLCBkb3VibGUgZCkKK3sKKyAgICBpZiAgICAgIChkID09IElOVF9NQVgpIHsKKyAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIGxldmVsLCAiSU5UX01BWCIpOworICAgIH0gZWxzZSBpZiAoZCA9PSBJTlRfTUlOKSB7CisgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBsZXZlbCwgIklOVF9NSU4iKTsKKyAgICB9IGVsc2UgaWYgKGQgPT0gVUlOVDMyX01BWCkgeworICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgbGV2ZWwsICJVSU5UMzJfTUFYIik7CisgICAgfSBlbHNlIGlmIChkID09IChkb3VibGUpSU5UNjRfTUFYKSB7CisgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBsZXZlbCwgIkk2NF9NQVgiKTsKKyAgICB9IGVsc2UgaWYgKGQgPT0gSU5UNjRfTUlOKSB7CisgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBsZXZlbCwgIkk2NF9NSU4iKTsKKyAgICB9IGVsc2UgaWYgKGQgPT0gRkxUX01BWCkgeworICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgbGV2ZWwsICJGTFRfTUFYIik7CisgICAgfSBlbHNlIGlmIChkID09IEZMVF9NSU4pIHsKKyAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIGxldmVsLCAiRkxUX01JTiIpOworICAgIH0gZWxzZSBpZiAoZCA9PSAtRkxUX01BWCkgeworICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgbGV2ZWwsICItRkxUX01BWCIpOworICAgIH0gZWxzZSBpZiAoZCA9PSAtRkxUX01JTikgeworICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgbGV2ZWwsICItRkxUX01JTiIpOworICAgIH0gZWxzZSBpZiAoZCA9PSBEQkxfTUFYKSB7CisgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBsZXZlbCwgIkRCTF9NQVgiKTsKKyAgICB9IGVsc2UgaWYgKGQgPT0gREJMX01JTikgeworICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgbGV2ZWwsICJEQkxfTUlOIik7CisgICAgfSBlbHNlIGlmIChkID09IC1EQkxfTUFYKSB7CisgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBsZXZlbCwgIi1EQkxfTUFYIik7CisgICAgfSBlbHNlIGlmIChkID09IC1EQkxfTUlOKSB7CisgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBsZXZlbCwgIi1EQkxfTUlOIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIGxldmVsLCAiJWciLCBkKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9wdF9saXN0KHZvaWQgKm9iaiwgdm9pZCAqYXZfbG9nX29iaiwgY29uc3QgY2hhciAqdW5pdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCByZXFfZmxhZ3MsIGludCByZWpfZmxhZ3MpCit7CisgICAgY29uc3QgQVZPcHRpb24gKm9wdD1OVUxMOworICAgIEFWT3B0aW9uUmFuZ2VzICpyOworICAgIGludCBpOworCisgICAgd2hpbGUgKChvcHQgPSBhdl9vcHRfbmV4dChvYmosIG9wdCkpKSB7CisgICAgICAgIGlmICghKG9wdC0+ZmxhZ3MgJiByZXFfZmxhZ3MpIHx8IChvcHQtPmZsYWdzICYgcmVqX2ZsYWdzKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIERvbid0IHByaW50IENPTlNUJ3Mgb24gbGV2ZWwgb25lLgorICAgICAgICAgKiBEb24ndCBwcmludCBhbnl0aGluZyBidXQgQ09OU1QncyBvbiBsZXZlbCB0d28uCisgICAgICAgICAqIE9ubHkgcHJpbnQgaXRlbXMgZnJvbSB0aGUgcmVxdWVzdGVkIHVuaXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoIXVuaXQgJiYgb3B0LT50eXBlPT1BVl9PUFRfVFlQRV9DT05TVCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBlbHNlIGlmICh1bml0ICYmIG9wdC0+dHlwZSE9QVZfT1BUX1RZUEVfQ09OU1QpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZWxzZSBpZiAodW5pdCAmJiBvcHQtPnR5cGU9PUFWX09QVF9UWVBFX0NPTlNUICYmIHN0cmNtcCh1bml0LCBvcHQtPnVuaXQpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGVsc2UgaWYgKHVuaXQgJiYgb3B0LT50eXBlID09IEFWX09QVF9UWVBFX0NPTlNUKQorICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiICAgICAlLTE1cyAiLCBvcHQtPm5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIgICVzJS0xN3MgIiwKKyAgICAgICAgICAgICAgICAgICAob3B0LT5mbGFncyAmIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSkgPyAiIiA6ICItIiwKKyAgICAgICAgICAgICAgICAgICBvcHQtPm5hbWUpOworCisgICAgICAgIHN3aXRjaCAob3B0LT50eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0ZMQUdTOgorICAgICAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiUtMTJzICIsICI8ZmxhZ3M+Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIlLTEycyAiLCAiPGludD4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJS0xMnMgIiwgIjxpbnQ2ND4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiUtMTJzICIsICI8ZG91YmxlPiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIlLTEycyAiLCAiPGZsb2F0PiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJS0xMnMgIiwgIjxzdHJpbmc+Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX1JBVElPTkFMOgorICAgICAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiUtMTJzICIsICI8cmF0aW9uYWw+Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0JJTkFSWToKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIlLTEycyAiLCAiPGJpbmFyeT4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfSU1BR0VfU0laRToKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIlLTEycyAiLCAiPGltYWdlX3NpemU+Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX1ZJREVPX1JBVEU6CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJS0xMnMgIiwgIjx2aWRlb19yYXRlPiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9QSVhFTF9GTVQ6CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJS0xMnMgIiwgIjxwaXhfZm10PiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9TQU1QTEVfRk1UOgorICAgICAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiUtMTJzICIsICI8c2FtcGxlX2ZtdD4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfRFVSQVRJT046CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJS0xMnMgIiwgIjxkdXJhdGlvbj4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfQ09MT1I6CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJS0xMnMgIiwgIjxjb2xvcj4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQ6CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJS0xMnMgIiwgIjxjaGFubmVsX2xheW91dD4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfQ09OU1Q6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiUtMTJzICIsICIiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIlYyIsIChvcHQtPmZsYWdzICYgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0pID8gJ0UnIDogJy4nKTsKKyAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJWMiLCAob3B0LT5mbGFncyAmIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNKSA/ICdEJyA6ICcuJyk7CisgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiVjIiwgKG9wdC0+ZmxhZ3MgJiBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0pPyAnRicgOiAnLicpOworICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIlYyIsIChvcHQtPmZsYWdzICYgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gICApID8gJ1YnIDogJy4nKTsKKyAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJWMiLCAob3B0LT5mbGFncyAmIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNICAgKSA/ICdBJyA6ICcuJyk7CisgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiVjIiwgKG9wdC0+ZmxhZ3MgJiBBVl9PUFRfRkxBR19TVUJUSVRMRV9QQVJBTSkgPyAnUycgOiAnLicpOworICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIlYyIsIChvcHQtPmZsYWdzICYgQVZfT1BUX0ZMQUdfRVhQT1JUKSAgICAgICAgID8gJ1gnIDogJy4nKTsKKyAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJWMiLCAob3B0LT5mbGFncyAmIEFWX09QVF9GTEFHX1JFQURPTkxZKSAgICAgICA/ICdSJyA6ICcuJyk7CisKKyAgICAgICAgaWYgKG9wdC0+aGVscCkKKyAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiAlcyIsIG9wdC0+aGVscCk7CisKKyAgICAgICAgaWYgKGF2X29wdF9xdWVyeV9yYW5nZXMoJnIsIG9iaiwgb3B0LT5uYW1lLCBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKSA+PSAwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wdC0+dHlwZSkgeworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ6CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0lOVDY0OgorICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9ET1VCTEU6CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0ZMT0FUOgorICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9SQVRJT05BTDoKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgci0+bmJfcmFuZ2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiIChmcm9tICIpOworICAgICAgICAgICAgICAgICAgICBsb2dfdmFsdWUoYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sIHItPnJhbmdlW2ldLT52YWx1ZV9taW4pOworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIgdG8gIik7CisgICAgICAgICAgICAgICAgICAgIGxvZ192YWx1ZShhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgci0+cmFuZ2VbaV0tPnZhbHVlX21heCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIikiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9vcHRfZnJlZXBfcmFuZ2VzKCZyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvcHQtPnR5cGUgIT0gQVZfT1BUX1RZUEVfQ09OU1QgICYmCisgICAgICAgICAgICBvcHQtPnR5cGUgIT0gQVZfT1BUX1RZUEVfQklOQVJZICYmCisgICAgICAgICAgICAgICAgISgob3B0LT50eXBlID09IEFWX09QVF9UWVBFX0NPTE9SICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICBvcHQtPnR5cGUgPT0gQVZfT1BUX1RZUEVfSU1BR0VfU0laRSB8fAorICAgICAgICAgICAgICAgICAgIG9wdC0+dHlwZSA9PSBBVl9PUFRfVFlQRV9TVFJJTkcgICAgIHx8CisgICAgICAgICAgICAgICAgICAgb3B0LT50eXBlID09IEFWX09QVF9UWVBFX1ZJREVPX1JBVEUpICYmCisgICAgICAgICAgICAgICAgICAhb3B0LT5kZWZhdWx0X3ZhbC5zdHIpKSB7CisgICAgICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIgKGRlZmF1bHQgIik7CisgICAgICAgICAgICBzd2l0Y2ggKG9wdC0+dHlwZSkgeworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9GTEFHUzoKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIlIlBSSVg2NCwgb3B0LT5kZWZhdWx0X3ZhbC5pNjQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9EVVJBVElPTjoKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UOgorICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgICAgICBsb2dfdmFsdWUoYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sIG9wdC0+ZGVmYXVsdF92YWwuaTY0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfRE9VQkxFOgorICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBsb2dfdmFsdWUoYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sIG9wdC0+ZGVmYXVsdF92YWwuZGJsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfUkFUSU9OQUw6IHsKKyAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHEgPSBhdl9kMnEob3B0LT5kZWZhdWx0X3ZhbC5kYmwsIElOVF9NQVgpOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiVkLyVkIiwgcS5udW0sIHEuZGVuKTsgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9QSVhFTF9GTVQ6CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJXMiLCAoY2hhciAqKWF2X3hfaWZfbnVsbChhdl9nZXRfcGl4X2ZtdF9uYW1lKG9wdC0+ZGVmYXVsdF92YWwuaTY0KSwgIm5vbmUiKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQ6CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJXMiLCAoY2hhciAqKWF2X3hfaWZfbnVsbChhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKG9wdC0+ZGVmYXVsdF92YWwuaTY0KSwgIm5vbmUiKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0NPTE9SOgorICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFOgorICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9TVFJJTkc6CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX1ZJREVPX1JBVEU6CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiXCIlc1wiIiwgb3B0LT5kZWZhdWx0X3ZhbC5zdHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVDoKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIweCUiUFJJeDY0LCBvcHQtPmRlZmF1bHRfdmFsLmk2NCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIpIik7CisgICAgICAgIH0KKworICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICJcbiIpOworICAgICAgICBpZiAob3B0LT51bml0ICYmIG9wdC0+dHlwZSAhPSBBVl9PUFRfVFlQRV9DT05TVCkgeworICAgICAgICAgICAgb3B0X2xpc3Qob2JqLCBhdl9sb2dfb2JqLCBvcHQtPnVuaXQsIHJlcV9mbGFncywgcmVqX2ZsYWdzKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGF2X29wdF9zaG93Mih2b2lkICpvYmosIHZvaWQgKmF2X2xvZ19vYmosIGludCByZXFfZmxhZ3MsIGludCByZWpfZmxhZ3MpCit7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiVzIEFWT3B0aW9uczpcbiIsICgqKEFWQ2xhc3MqKilvYmopLT5jbGFzc19uYW1lKTsKKworICAgIG9wdF9saXN0KG9iaiwgYXZfbG9nX29iaiwgTlVMTCwgcmVxX2ZsYWdzLCByZWpfZmxhZ3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXZfb3B0X3NldF9kZWZhdWx0cyh2b2lkICpzKQoreworI2lmIEZGX0FQSV9PTERfQVZPUFRJT05TCisgICAgYXZfb3B0X3NldF9kZWZhdWx0czIocywgMCwgMCk7Cit9CisKK3ZvaWQgYXZfb3B0X3NldF9kZWZhdWx0czIodm9pZCAqcywgaW50IG1hc2ssIGludCBmbGFncykKK3sKKyNlbmRpZgorICAgIGNvbnN0IEFWT3B0aW9uICpvcHQgPSBOVUxMOworICAgIHdoaWxlICgob3B0ID0gYXZfb3B0X25leHQocywgb3B0KSkpIHsKKyAgICAgICAgdm9pZCAqZHN0ID0gKCh1aW50OF90KilzKSArIG9wdC0+b2Zmc2V0OworI2lmIEZGX0FQSV9PTERfQVZPUFRJT05TCisgICAgICAgIGlmICgob3B0LT5mbGFncyAmIG1hc2spICE9IGZsYWdzKQorICAgICAgICAgICAgY29udGludWU7CisjZW5kaWYKKworICAgICAgICBpZiAob3B0LT5mbGFncyAmIEFWX09QVF9GTEFHX1JFQURPTkxZKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgc3dpdGNoIChvcHQtPnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfQ09OU1Q6CisgICAgICAgICAgICAgICAgLyogTm90aGluZyB0byBiZSBkb25lIGhlcmUgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9GTEFHUzoKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UOgorICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfRFVSQVRJT046CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VUOgorICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzLCBvcHQsIGRzdCwgMSwgMSwgb3B0LT5kZWZhdWx0X3ZhbC5pNjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxPQVQ6IHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsOworICAgICAgICAgICAgICAgIHZhbCA9IG9wdC0+ZGVmYXVsdF92YWwuZGJsOworICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzLCBvcHQsIGRzdCwgdmFsLCAxLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9SQVRJT05BTDogeworICAgICAgICAgICAgICAgIEFWUmF0aW9uYWwgdmFsOworICAgICAgICAgICAgICAgIHZhbCA9IGF2X2QycShvcHQtPmRlZmF1bHRfdmFsLmRibCwgSU5UX01BWCk7CisgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHMsIG9wdCwgZHN0LCAxLCB2YWwuZGVuLCB2YWwubnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9DT0xPUjoKKyAgICAgICAgICAgICAgICBzZXRfc3RyaW5nX2NvbG9yKHMsIG9wdCwgb3B0LT5kZWZhdWx0X3ZhbC5zdHIsIGRzdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX1NUUklORzoKKyAgICAgICAgICAgICAgICBzZXRfc3RyaW5nKHMsIG9wdCwgb3B0LT5kZWZhdWx0X3ZhbC5zdHIsIGRzdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0lNQUdFX1NJWkU6CisgICAgICAgICAgICAgICAgc2V0X3N0cmluZ19pbWFnZV9zaXplKHMsIG9wdCwgb3B0LT5kZWZhdWx0X3ZhbC5zdHIsIGRzdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX1ZJREVPX1JBVEU6CisgICAgICAgICAgICAgICAgc2V0X3N0cmluZ192aWRlb19yYXRlKHMsIG9wdCwgb3B0LT5kZWZhdWx0X3ZhbC5zdHIsIGRzdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX1BJWEVMX0ZNVDoKKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIocywgb3B0LCBkc3QsIDEsIDEsIG9wdC0+ZGVmYXVsdF92YWwuaTY0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfU0FNUExFX0ZNVDoKKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIocywgb3B0LCBkc3QsIDEsIDEsIG9wdC0+ZGVmYXVsdF92YWwuaTY0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfQklOQVJZOgorICAgICAgICAgICAgICAgIHNldF9zdHJpbmdfYmluYXJ5KHMsIG9wdCwgb3B0LT5kZWZhdWx0X3ZhbC5zdHIsIGRzdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0RJQ1Q6CisgICAgICAgICAgICAgICAgLyogQ2Fubm90IHNldCBkZWZhdWx0cyBmb3IgdGhlc2UgdHlwZXMgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiQVZPcHRpb24gdHlwZSAlZCBvZiBvcHRpb24gJXMgbm90IGltcGxlbWVudGVkIHlldFxuIiwgb3B0LT50eXBlLCBvcHQtPm5hbWUpOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIFN0b3JlIHRoZSB2YWx1ZSBpbiB0aGUgZmllbGQgaW4gY3R4IHRoYXQgaXMgbmFtZWQgbGlrZSBrZXkuCisgKiBjdHggbXVzdCBiZSBhbiBBVkNsYXNzIGNvbnRleHQsIHN0b3JpbmcgaXMgZG9uZSB1c2luZyBBVk9wdGlvbnMuCisgKgorICogQHBhcmFtIGJ1ZiB0aGUgc3RyaW5nIHRvIHBhcnNlLCBidWYgd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50IGF0IHRoZQorICogc2VwYXJhdG9yIGp1c3QgYWZ0ZXIgdGhlIHBhcnNlZCBrZXkvdmFsdWUgcGFpcgorICogQHBhcmFtIGtleV92YWxfc2VwIGEgMC10ZXJtaW5hdGVkIGxpc3Qgb2YgY2hhcmFjdGVycyB1c2VkIHRvCisgKiBzZXBhcmF0ZSBrZXkgZnJvbSB2YWx1ZQorICogQHBhcmFtIHBhaXJzX3NlcCBhIDAtdGVybWluYXRlZCBsaXN0IG9mIGNoYXJhY3RlcnMgdXNlZCB0byBzZXBhcmF0ZQorICogdHdvIHBhaXJzIGZyb20gZWFjaCBvdGhlcgorICogQHJldHVybiAwIGlmIHRoZSBrZXkvdmFsdWUgcGFpciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcGFyc2VkIGFuZAorICogc2V0LCBvciBhIG5lZ2F0aXZlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4gQVZFUlJPUiBjb2RlIGluIGNhc2UKKyAqIG9mIGVycm9yOgorICogQVZFUlJPUihFSU5WQUwpIGlmIHRoZSBrZXkvdmFsdWUgcGFpciBjYW5ub3QgYmUgcGFyc2VkLAorICogdGhlIGVycm9yIGNvZGUgaXNzdWVkIGJ5IGF2X29wdF9zZXQoKSBpZiB0aGUga2V5L3ZhbHVlIHBhaXIKKyAqIGNhbm5vdCBiZSBzZXQKKyAqLworc3RhdGljIGludCBwYXJzZV9rZXlfdmFsdWVfcGFpcih2b2lkICpjdHgsIGNvbnN0IGNoYXIgKipidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleV92YWxfc2VwLCBjb25zdCBjaGFyICpwYWlyc19zZXApCit7CisgICAgY2hhciAqa2V5ID0gYXZfZ2V0X3Rva2VuKGJ1Ziwga2V5X3ZhbF9zZXApOworICAgIGNoYXIgKnZhbDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFrZXkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoKmtleSAmJiBzdHJzcG4oKmJ1Ziwga2V5X3ZhbF9zZXApKSB7CisgICAgICAgICgqYnVmKSsrOworICAgICAgICB2YWwgPSBhdl9nZXRfdG9rZW4oYnVmLCBwYWlyc19zZXApOworICAgICAgICBpZiAoIXZhbCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJmtleSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBrZXkgb3Igbm8ga2V5L3ZhbHVlIHNlcGFyYXRvciBmb3VuZCBhZnRlciBrZXkgJyVzJ1xuIiwga2V5KTsKKyAgICAgICAgYXZfZnJlZShrZXkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlNldHRpbmcgZW50cnkgd2l0aCBrZXkgJyVzJyB0byB2YWx1ZSAnJXMnXG4iLCBrZXksIHZhbCk7CisKKyAgICByZXQgPSBhdl9vcHRfc2V0KGN0eCwga2V5LCB2YWwsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pOworICAgIGlmIChyZXQgPT0gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJLZXkgJyVzJyBub3QgZm91bmQuXG4iLCBrZXkpOworCisgICAgYXZfZnJlZShrZXkpOworICAgIGF2X2ZyZWUodmFsKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZfc2V0X29wdGlvbnNfc3RyaW5nKHZvaWQgKmN0eCwgY29uc3QgY2hhciAqb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5X3ZhbF9zZXAsIGNvbnN0IGNoYXIgKnBhaXJzX3NlcCkKK3sKKyAgICBpbnQgcmV0LCBjb3VudCA9IDA7CisKKyAgICBpZiAoIW9wdHMpCisgICAgICAgIHJldHVybiAwOworCisgICAgd2hpbGUgKCpvcHRzKSB7CisgICAgICAgIGlmICgocmV0ID0gcGFyc2Vfa2V5X3ZhbHVlX3BhaXIoY3R4LCAmb3B0cywga2V5X3ZhbF9zZXAsIHBhaXJzX3NlcCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGNvdW50Kys7CisKKyAgICAgICAgaWYgKCpvcHRzKQorICAgICAgICAgICAgb3B0cysrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBXSElURVNQQUNFUyAiIFxuXHQiCisKK3N0YXRpYyBpbnQgaXNfa2V5X2NoYXIoY2hhciBjKQoreworICAgIHJldHVybiAodW5zaWduZWQpKChjIHwgMzIpIC0gJ2EnKSA8IDI2IHx8CisgICAgICAgICAgICh1bnNpZ25lZCkoYyAtICcwJykgPCAxMCB8fAorICAgICAgICAgICBjID09ICctJyB8fCBjID09ICdfJyB8fCBjID09ICcvJyB8fCBjID09ICcuJzsKK30KKworLyoqCisgKiBSZWFkIGEga2V5IGZyb20gYSBzdHJpbmcuCisgKgorICogVGhlIGtleSBjb25zaXN0cyBvZiBpc19rZXlfY2hhciBjaGFyYWN0ZXJzIGFuZCBtdXN0IGJlIHRlcm1pbmF0ZWQgYnkgYQorICogY2hhcmFjdGVyIGZyb20gdGhlIGRlbGltIHN0cmluZzsgc3BhY2VzIGFyZSBpZ25vcmVkLgorICoKKyAqIEByZXR1cm4gIDAgZm9yIHN1Y2Nlc3MgKGV2ZW4gd2l0aCBlbGxpcHNpcyksIDwwIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2tleShjb25zdCBjaGFyICoqcm9wdHMsIGNvbnN0IGNoYXIgKmRlbGltLCBjaGFyICoqcmtleSkKK3sKKyAgICBjb25zdCBjaGFyICpvcHRzID0gKnJvcHRzOworICAgIGNvbnN0IGNoYXIgKmtleV9zdGFydCwgKmtleV9lbmQ7CisKKyAgICBrZXlfc3RhcnQgPSBvcHRzICs9IHN0cnNwbihvcHRzLCBXSElURVNQQUNFUyk7CisgICAgd2hpbGUgKGlzX2tleV9jaGFyKCpvcHRzKSkKKyAgICAgICAgb3B0cysrOworICAgIGtleV9lbmQgPSBvcHRzOworICAgIG9wdHMgKz0gc3Ryc3BuKG9wdHMsIFdISVRFU1BBQ0VTKTsKKyAgICBpZiAoISpvcHRzIHx8ICFzdHJjaHIoZGVsaW0sICpvcHRzKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBvcHRzKys7CisgICAgaWYgKCEoKnJrZXkgPSBhdl9tYWxsb2Moa2V5X2VuZCAtIGtleV9zdGFydCArIDEpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtZW1jcHkoKnJrZXksIGtleV9zdGFydCwga2V5X2VuZCAtIGtleV9zdGFydCk7CisgICAgKCpya2V5KVtrZXlfZW5kIC0ga2V5X3N0YXJ0XSA9IDA7CisgICAgKnJvcHRzID0gb3B0czsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X29wdF9nZXRfa2V5X3ZhbHVlKGNvbnN0IGNoYXIgKipyb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlfdmFsX3NlcCwgY29uc3QgY2hhciAqcGFpcnNfc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipya2V5LCBjaGFyICoqcnZhbCkKK3sKKyAgICBpbnQgcmV0OworICAgIGNoYXIgKmtleSA9IE5VTEwsICp2YWw7CisgICAgY29uc3QgY2hhciAqb3B0cyA9ICpyb3B0czsKKworICAgIGlmICgocmV0ID0gZ2V0X2tleSgmb3B0cywga2V5X3ZhbF9zZXAsICZrZXkpKSA8IDAgJiYKKyAgICAgICAgIShmbGFncyAmIEFWX09QVF9GTEFHX0lNUExJQ0lUX0tFWSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKCEodmFsID0gYXZfZ2V0X3Rva2VuKCZvcHRzLCBwYWlyc19zZXApKSkgeworICAgICAgICBhdl9mcmVlKGtleSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgICpyb3B0cyA9IG9wdHM7CisgICAgKnJrZXkgID0ga2V5OworICAgICpydmFsICA9IHZhbDsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X29wdF9zZXRfZnJvbV9zdHJpbmcodm9pZCAqY3R4LCBjb25zdCBjaGFyICpvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgKnNob3J0aGFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleV92YWxfc2VwLCBjb25zdCBjaGFyICpwYWlyc19zZXApCit7CisgICAgaW50IHJldCwgY291bnQgPSAwOworICAgIGNvbnN0IGNoYXIgKmR1bW15X3Nob3J0aGFuZCA9IE5VTEw7CisgICAgY2hhciAqYXZfdW5pbml0KHBhcnNlZF9rZXkpLCAqYXZfdW5pbml0KHZhbHVlKTsKKyAgICBjb25zdCBjaGFyICprZXk7CisKKyAgICBpZiAoIW9wdHMpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghc2hvcnRoYW5kKQorICAgICAgICBzaG9ydGhhbmQgPSAmZHVtbXlfc2hvcnRoYW5kOworCisgICAgd2hpbGUgKCpvcHRzKSB7CisgICAgICAgIHJldCA9IGF2X29wdF9nZXRfa2V5X3ZhbHVlKCZvcHRzLCBrZXlfdmFsX3NlcCwgcGFpcnNfc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2hvcnRoYW5kID8gQVZfT1BUX0ZMQUdfSU1QTElDSVRfS0VZIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNlZF9rZXksICZ2YWx1ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1IoRUlOVkFMKSkKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJObyBvcHRpb24gbmFtZSBuZWFyICclcydcbiIsIG9wdHMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBwYXJzZSAnJXMnOiAlc1xuIiwgb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpvcHRzKQorICAgICAgICAgICAgb3B0cysrOworICAgICAgICBpZiAocGFyc2VkX2tleSkgeworICAgICAgICAgICAga2V5ID0gcGFyc2VkX2tleTsKKyAgICAgICAgICAgIHdoaWxlICgqc2hvcnRoYW5kKSAvKiBkaXNjYXJkIGFsbCByZW1haW5pbmcgc2hvcnRoYW5kICovCisgICAgICAgICAgICAgICAgc2hvcnRoYW5kKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBrZXkgPSAqKHNob3J0aGFuZCsrKTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlNldHRpbmcgJyVzJyB0byB2YWx1ZSAnJXMnXG4iLCBrZXksIHZhbHVlKTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0KGN0eCwga2V5LCB2YWx1ZSwgMCkpIDwgMCkgeworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3B0aW9uICclcycgbm90IGZvdW5kXG4iLCBrZXkpOworICAgICAgICAgICAgYXZfZnJlZSh2YWx1ZSk7CisgICAgICAgICAgICBhdl9mcmVlKHBhcnNlZF9rZXkpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyZWUodmFsdWUpOworICAgICAgICBhdl9mcmVlKHBhcnNlZF9rZXkpOworICAgICAgICBjb3VudCsrOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKK3ZvaWQgYXZfb3B0X2ZyZWUodm9pZCAqb2JqKQoreworICAgIGNvbnN0IEFWT3B0aW9uICpvID0gTlVMTDsKKyAgICB3aGlsZSAoKG8gPSBhdl9vcHRfbmV4dChvYmosIG8pKSkgeworICAgICAgICBzd2l0Y2ggKG8tPnR5cGUpIHsKKyAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfQklOQVJZOgorICAgICAgICAgICAgYXZfZnJlZXAoKHVpbnQ4X3QgKilvYmogKyBvLT5vZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9ESUNUOgorICAgICAgICAgICAgYXZfZGljdF9mcmVlKChBVkRpY3Rpb25hcnkgKiopKCgodWludDhfdCAqKW9iaikgKyBvLT5vZmZzZXQpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGF2X29wdF9zZXRfZGljdDIodm9pZCAqb2JqLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zLCBpbnQgc2VhcmNoX2ZsYWdzKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICBBVkRpY3Rpb25hcnkgICAgKnRtcCA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIW9wdGlvbnMpCisgICAgICAgIHJldHVybiAwOworCisgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQoKm9wdGlvbnMsICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICByZXQgPSBhdl9vcHRfc2V0KG9iaiwgdC0+a2V5LCB0LT52YWx1ZSwgc2VhcmNoX2ZsYWdzKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQpCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmdG1wLCB0LT5rZXksIHQtPnZhbHVlLCAwKTsKKyAgICAgICAgZWxzZSBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igc2V0dGluZyBvcHRpb24gJXMgdG8gdmFsdWUgJXMuXG4iLCB0LT5rZXksIHQtPnZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldCA9IDA7CisgICAgfQorICAgIGF2X2RpY3RfZnJlZShvcHRpb25zKTsKKyAgICAqb3B0aW9ucyA9IHRtcDsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZfb3B0X3NldF9kaWN0KHZvaWQgKm9iaiwgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykKK3sKKyAgICByZXR1cm4gYXZfb3B0X3NldF9kaWN0MihvYmosIG9wdGlvbnMsIDApOworfQorCitjb25zdCBBVk9wdGlvbiAqYXZfb3B0X2ZpbmQodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRfZmxhZ3MsIGludCBzZWFyY2hfZmxhZ3MpCit7CisgICAgcmV0dXJuIGF2X29wdF9maW5kMihvYmosIG5hbWUsIHVuaXQsIG9wdF9mbGFncywgc2VhcmNoX2ZsYWdzLCBOVUxMKTsKK30KKworY29uc3QgQVZPcHRpb24gKmF2X29wdF9maW5kMih2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRfZmxhZ3MsIGludCBzZWFyY2hfZmxhZ3MsIHZvaWQgKip0YXJnZXRfb2JqKQoreworICAgIGNvbnN0IEFWQ2xhc3MgICpjOworICAgIGNvbnN0IEFWT3B0aW9uICpvID0gTlVMTDsKKworICAgIGlmKCFvYmopCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYz0gKihBVkNsYXNzKiopb2JqOworCisgICAgaWYgKCFjKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChzZWFyY2hfZmxhZ3MgJiBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKSB7CisgICAgICAgIGlmIChzZWFyY2hfZmxhZ3MgJiBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKSB7CisgICAgICAgICAgICBjb25zdCBBVkNsYXNzICpjaGlsZCA9IE5VTEw7CisgICAgICAgICAgICB3aGlsZSAoY2hpbGQgPSBhdl9vcHRfY2hpbGRfY2xhc3NfbmV4dChjLCBjaGlsZCkpCisgICAgICAgICAgICAgICAgaWYgKG8gPSBhdl9vcHRfZmluZDIoJmNoaWxkLCBuYW1lLCB1bml0LCBvcHRfZmxhZ3MsIHNlYXJjaF9mbGFncywgTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9pZCAqY2hpbGQgPSBOVUxMOworICAgICAgICAgICAgd2hpbGUgKGNoaWxkID0gYXZfb3B0X2NoaWxkX25leHQob2JqLCBjaGlsZCkpCisgICAgICAgICAgICAgICAgaWYgKG8gPSBhdl9vcHRfZmluZDIoY2hpbGQsIG5hbWUsIHVuaXQsIG9wdF9mbGFncywgc2VhcmNoX2ZsYWdzLCB0YXJnZXRfb2JqKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAobyA9IGF2X29wdF9uZXh0KG9iaiwgbykpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoby0+bmFtZSwgbmFtZSkgJiYgKG8tPmZsYWdzICYgb3B0X2ZsYWdzKSA9PSBvcHRfZmxhZ3MgJiYKKyAgICAgICAgICAgICgoIXVuaXQgJiYgby0+dHlwZSAhPSBBVl9PUFRfVFlQRV9DT05TVCkgfHwKKyAgICAgICAgICAgICAodW5pdCAgJiYgby0+dHlwZSA9PSBBVl9PUFRfVFlQRV9DT05TVCAmJiBvLT51bml0ICYmICFzdHJjbXAoby0+dW5pdCwgdW5pdCkpKSkgeworICAgICAgICAgICAgaWYgKHRhcmdldF9vYmopIHsKKyAgICAgICAgICAgICAgICBpZiAoIShzZWFyY2hfZmxhZ3MgJiBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKSkKKyAgICAgICAgICAgICAgICAgICAgKnRhcmdldF9vYmogPSBvYmo7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqdGFyZ2V0X29iaiA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCAqYXZfb3B0X2NoaWxkX25leHQodm9pZCAqb2JqLCB2b2lkICpwcmV2KQoreworICAgIGNvbnN0IEFWQ2xhc3MgKmMgPSAqKEFWQ2xhc3MqKilvYmo7CisgICAgaWYgKGMtPmNoaWxkX25leHQpCisgICAgICAgIHJldHVybiBjLT5jaGlsZF9uZXh0KG9iaiwgcHJldik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IEFWQ2xhc3MgKmF2X29wdF9jaGlsZF9jbGFzc19uZXh0KGNvbnN0IEFWQ2xhc3MgKnBhcmVudCwgY29uc3QgQVZDbGFzcyAqcHJldikKK3sKKyAgICBpZiAocGFyZW50LT5jaGlsZF9jbGFzc19uZXh0KQorICAgICAgICByZXR1cm4gcGFyZW50LT5jaGlsZF9jbGFzc19uZXh0KHByZXYpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkICphdl9vcHRfcHRyKGNvbnN0IEFWQ2xhc3MgKmNsYXNzLCB2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgY29uc3QgQVZPcHRpb24gKm9wdD0gYXZfb3B0X2ZpbmQyKCZjbGFzcywgbmFtZSwgTlVMTCwgMCwgQVZfT1BUX1NFQVJDSF9GQUtFX09CSiwgTlVMTCk7CisgICAgaWYoIW9wdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICh1aW50OF90KilvYmogKyBvcHQtPm9mZnNldDsKK30KKworc3RhdGljIGludCBvcHRfc2l6ZShlbnVtIEFWT3B0aW9uVHlwZSB0eXBlKQoreworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9GTEFHUzogICAgIHJldHVybiBzaXplb2YoaW50KTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0RVUkFUSU9OOgorICAgIGNhc2UgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDogICAgIHJldHVybiBzaXplb2YoaW50NjRfdCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9ET1VCTEU6ICAgIHJldHVybiBzaXplb2YoZG91YmxlKTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0ZMT0FUOiAgICAgcmV0dXJuIHNpemVvZihmbG9hdCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9TVFJJTkc6ICAgIHJldHVybiBzaXplb2YodWludDhfdCopOworICAgIGNhc2UgQVZfT1BUX1RZUEVfVklERU9fUkFURToKKyAgICBjYXNlIEFWX09QVF9UWVBFX1JBVElPTkFMOiAgcmV0dXJuIHNpemVvZihBVlJhdGlvbmFsKTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0JJTkFSWTogICAgcmV0dXJuIHNpemVvZih1aW50OF90KikgKyBzaXplb2YoaW50KTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0lNQUdFX1NJWkU6cmV0dXJuIHNpemVvZihpbnRbMl0pOworICAgIGNhc2UgQVZfT1BUX1RZUEVfUElYRUxfRk1UOiByZXR1cm4gc2l6ZW9mKGVudW0gQVZQaXhlbEZvcm1hdCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9TQU1QTEVfRk1UOnJldHVybiBzaXplb2YoZW51bSBBVlNhbXBsZUZvcm1hdCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9DT0xPUjogICAgIHJldHVybiA0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X29wdF9jb3B5KHZvaWQgKmRzdCwgRkZfQ09OU1RfQVZVVElMNTUgdm9pZCAqc3JjKQoreworICAgIGNvbnN0IEFWT3B0aW9uICpvID0gTlVMTDsKKyAgICBjb25zdCBBVkNsYXNzICpjOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKCFzcmMpCisgICAgICAgIHJldHVybiAwOworCisgICAgYyA9ICooQVZDbGFzcyoqKXNyYzsKKyAgICBpZiAoKihBVkNsYXNzKiopZHN0ICYmIGMgIT0gKihBVkNsYXNzKiopZHN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgd2hpbGUgKChvID0gYXZfb3B0X25leHQoc3JjLCBvKSkpIHsKKyAgICAgICAgdm9pZCAqZmllbGRfZHN0ID0gKCh1aW50OF90Kilkc3QpICsgby0+b2Zmc2V0OworICAgICAgICB2b2lkICpmaWVsZF9zcmMgPSAoKHVpbnQ4X3QqKXNyYykgKyBvLT5vZmZzZXQ7CisgICAgICAgIHVpbnQ4X3QgKipmaWVsZF9kc3Q4ID0gKHVpbnQ4X3QqKilmaWVsZF9kc3Q7CisgICAgICAgIHVpbnQ4X3QgKipmaWVsZF9zcmM4ID0gKHVpbnQ4X3QqKilmaWVsZF9zcmM7CisKKyAgICAgICAgaWYgKG8tPnR5cGUgPT0gQVZfT1BUX1RZUEVfU1RSSU5HKSB7CisgICAgICAgICAgICBpZiAoKmZpZWxkX2RzdDggIT0gKmZpZWxkX3NyYzgpCisgICAgICAgICAgICAgICAgYXZfZnJlZXAoZmllbGRfZHN0OCk7CisgICAgICAgICAgICAqZmllbGRfZHN0OCA9IGF2X3N0cmR1cCgqZmllbGRfc3JjOCk7CisgICAgICAgICAgICBpZiAoKmZpZWxkX3NyYzggJiYgISpmaWVsZF9kc3Q4KQorICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfSBlbHNlIGlmIChvLT50eXBlID09IEFWX09QVF9UWVBFX0JJTkFSWSkgeworICAgICAgICAgICAgaW50IGxlbiA9ICooaW50KikoZmllbGRfc3JjOCArIDEpOworICAgICAgICAgICAgaWYgKCpmaWVsZF9kc3Q4ICE9ICpmaWVsZF9zcmM4KQorICAgICAgICAgICAgICAgIGF2X2ZyZWVwKGZpZWxkX2RzdDgpOworICAgICAgICAgICAgKmZpZWxkX2RzdDggPSBhdl9tZW1kdXAoKmZpZWxkX3NyYzgsIGxlbik7CisgICAgICAgICAgICBpZiAobGVuICYmICEqZmllbGRfZHN0OCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQqKShmaWVsZF9kc3Q4ICsgMSkgPSBsZW47CisgICAgICAgIH0gZWxzZSBpZiAoby0+dHlwZSA9PSBBVl9PUFRfVFlQRV9DT05TVCkgeworICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9IGVsc2UgaWYgKG8tPnR5cGUgPT0gQVZfT1BUX1RZUEVfRElDVCkgeworICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqc2RpY3QgPSAoQVZEaWN0aW9uYXJ5ICoqKSBmaWVsZF9zcmM7CisgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKipkZGljdCA9IChBVkRpY3Rpb25hcnkgKiopIGZpZWxkX2RzdDsKKyAgICAgICAgICAgIGlmICgqc2RpY3QgIT0gKmRkaWN0KQorICAgICAgICAgICAgICAgIGF2X2RpY3RfZnJlZShkZGljdCk7CisgICAgICAgICAgICAqZGRpY3QgPSBOVUxMOworICAgICAgICAgICAgYXZfZGljdF9jb3B5KGRkaWN0LCAqc2RpY3QsIDApOworICAgICAgICAgICAgaWYgKGF2X2RpY3RfY291bnQoKnNkaWN0KSAhPSBhdl9kaWN0X2NvdW50KCpkZGljdCkpCisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KGZpZWxkX2RzdCwgZmllbGRfc3JjLCBvcHRfc2l6ZShvLT50eXBlKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2X29wdF9xdWVyeV9yYW5nZXMoQVZPcHRpb25SYW5nZXMgKipyYW5nZXNfYXJnLCB2b2lkICpvYmosIGNvbnN0IGNoYXIgKmtleSwgaW50IGZsYWdzKQoreworICAgIGludCByZXQ7CisgICAgY29uc3QgQVZDbGFzcyAqYyA9ICooQVZDbGFzcyoqKW9iajsKKyAgICBpbnQgKCpjYWxsYmFjaykoQVZPcHRpb25SYW5nZXMgKiosIHZvaWQgKm9iaiwgY29uc3QgY2hhciAqa2V5LCBpbnQgZmxhZ3MpID0gTlVMTDsKKworICAgIGlmIChjLT52ZXJzaW9uID4gKDUyIDw8IDE2IHwgMTEgPDwgOCkpCisgICAgICAgIGNhbGxiYWNrID0gYy0+cXVlcnlfcmFuZ2VzOworCisgICAgaWYgKCFjYWxsYmFjaykKKyAgICAgICAgY2FsbGJhY2sgPSBhdl9vcHRfcXVlcnlfcmFuZ2VzX2RlZmF1bHQ7CisKKyAgICByZXQgPSBjYWxsYmFjayhyYW5nZXNfYXJnLCBvYmosIGtleSwgZmxhZ3MpOworICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICBpZiAoIShmbGFncyAmIEFWX09QVF9NVUxUSV9DT01QT05FTlRfUkFOR0UpKQorICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgKCpyYW5nZXNfYXJnKS0+bmJfY29tcG9uZW50cyA9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2X29wdF9xdWVyeV9yYW5nZXNfZGVmYXVsdChBVk9wdGlvblJhbmdlcyAqKnJhbmdlc19hcmcsIHZvaWQgKm9iaiwgY29uc3QgY2hhciAqa2V5LCBpbnQgZmxhZ3MpCit7CisgICAgQVZPcHRpb25SYW5nZXMgKnJhbmdlcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpyYW5nZXMpKTsKKyAgICBBVk9wdGlvblJhbmdlICoqcmFuZ2VfYXJyYXkgPSBhdl9tYWxsb2N6KHNpemVvZih2b2lkKikpOworICAgIEFWT3B0aW9uUmFuZ2UgKnJhbmdlID0gYXZfbWFsbG9jeihzaXplb2YoKnJhbmdlKSk7CisgICAgY29uc3QgQVZPcHRpb24gKmZpZWxkID0gYXZfb3B0X2ZpbmQob2JqLCBrZXksIE5VTEwsIDAsIGZsYWdzKTsKKyAgICBpbnQgcmV0OworCisgICAgKnJhbmdlc19hcmcgPSBOVUxMOworCisgICAgaWYgKCFyYW5nZXMgfHwgIXJhbmdlIHx8ICFyYW5nZV9hcnJheSB8fCAhZmllbGQpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmFuZ2VzLT5yYW5nZSA9IHJhbmdlX2FycmF5OworICAgIHJhbmdlcy0+cmFuZ2VbMF0gPSByYW5nZTsKKyAgICByYW5nZXMtPm5iX3JhbmdlcyA9IDE7CisgICAgcmFuZ2VzLT5uYl9jb21wb25lbnRzID0gMTsKKyAgICByYW5nZS0+aXNfcmFuZ2UgPSAxOworICAgIHJhbmdlLT52YWx1ZV9taW4gPSBmaWVsZC0+bWluOworICAgIHJhbmdlLT52YWx1ZV9tYXggPSBmaWVsZC0+bWF4OworCisgICAgc3dpdGNoIChmaWVsZC0+dHlwZSkgeworICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UOgorICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UNjQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9QSVhFTF9GTVQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9TQU1QTEVfRk1UOgorICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxPQVQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9ET1VCTEU6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9EVVJBVElPTjoKKyAgICBjYXNlIEFWX09QVF9UWVBFX0NPTE9SOgorICAgIGNhc2UgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfU1RSSU5HOgorICAgICAgICByYW5nZS0+Y29tcG9uZW50X21pbiA9IDA7CisgICAgICAgIHJhbmdlLT5jb21wb25lbnRfbWF4ID0gMHgxMEZGRkY7IC8vIG1heCB1bmljb2RlIHZhbHVlCisgICAgICAgIHJhbmdlLT52YWx1ZV9taW4gPSAtMTsKKyAgICAgICAgcmFuZ2UtPnZhbHVlX21heCA9IElOVF9NQVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfUkFUSU9OQUw6CisgICAgICAgIHJhbmdlLT5jb21wb25lbnRfbWluID0gSU5UX01JTjsKKyAgICAgICAgcmFuZ2UtPmNvbXBvbmVudF9tYXggPSBJTlRfTUFYOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0lNQUdFX1NJWkU6CisgICAgICAgIHJhbmdlLT5jb21wb25lbnRfbWluID0gMDsKKyAgICAgICAgcmFuZ2UtPmNvbXBvbmVudF9tYXggPSBJTlRfTUFYLzEyOC84OworICAgICAgICByYW5nZS0+dmFsdWVfbWluID0gMDsKKyAgICAgICAgcmFuZ2UtPnZhbHVlX21heCA9IElOVF9NQVgvODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9WSURFT19SQVRFOgorICAgICAgICByYW5nZS0+Y29tcG9uZW50X21pbiA9IDE7CisgICAgICAgIHJhbmdlLT5jb21wb25lbnRfbWF4ID0gSU5UX01BWDsKKyAgICAgICAgcmFuZ2UtPnZhbHVlX21pbiA9IDE7CisgICAgICAgIHJhbmdlLT52YWx1ZV9tYXggPSBJTlRfTUFYOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAqcmFuZ2VzX2FyZyA9IHJhbmdlczsKKyAgICByZXR1cm4gMTsKK2ZhaWw6CisgICAgYXZfZnJlZShyYW5nZXMpOworICAgIGF2X2ZyZWUocmFuZ2UpOworICAgIGF2X2ZyZWUocmFuZ2VfYXJyYXkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXZfb3B0X2ZyZWVwX3JhbmdlcyhBVk9wdGlvblJhbmdlcyAqKnJhbmdlc3ApCit7CisgICAgaW50IGk7CisgICAgQVZPcHRpb25SYW5nZXMgKnJhbmdlcyA9ICpyYW5nZXNwOworCisgICAgaWYgKCFyYW5nZXMpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZXMtPm5iX3JhbmdlcyAqIHJhbmdlcy0+bmJfY29tcG9uZW50czsgaSsrKSB7CisgICAgICAgIEFWT3B0aW9uUmFuZ2UgKnJhbmdlID0gcmFuZ2VzLT5yYW5nZVtpXTsKKyAgICAgICAgaWYgKHJhbmdlKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcmFuZ2UtPnN0cik7CisgICAgICAgICAgICBhdl9mcmVlcCgmcmFuZ2VzLT5yYW5nZVtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZXAoJnJhbmdlcy0+cmFuZ2UpOworICAgIGF2X2ZyZWVwKHJhbmdlc3ApOworfQorCitpbnQgYXZfb3B0X2lzX3NldF90b19kZWZhdWx0KHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKm8pCit7CisgICAgaW50NjRfdCBpNjQ7CisgICAgZG91YmxlIGQsIGQyOworICAgIGZsb2F0IGY7CisgICAgQVZSYXRpb25hbCBxOworICAgIGludCByZXQsIHcsIGg7CisgICAgY2hhciAqc3RyOworICAgIHZvaWQgKmRzdDsKKworICAgIGlmICghbyB8fCAhb2JqKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgZHN0ID0gKCh1aW50OF90KilvYmopICsgby0+b2Zmc2V0OworCisgICAgc3dpdGNoIChvLT50eXBlKSB7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9DT05TVDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9GTEFHUzoKKyAgICBjYXNlIEFWX09QVF9UWVBFX1BJWEVMX0ZNVDoKKyAgICBjYXNlIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVDoKKyAgICBjYXNlIEFWX09QVF9UWVBFX0RVUkFUSU9OOgorICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UNjQ6CisgICAgICAgIHJlYWRfbnVtYmVyKG8sIGRzdCwgTlVMTCwgTlVMTCwgJmk2NCk7CisgICAgICAgIHJldHVybiBvLT5kZWZhdWx0X3ZhbC5pNjQgPT0gaTY0OworICAgIGNhc2UgQVZfT1BUX1RZUEVfU1RSSU5HOgorICAgICAgICBzdHIgPSAqKGNoYXIgKiopZHN0OworICAgICAgICBpZiAoc3RyID09IG8tPmRlZmF1bHRfdmFsLnN0cikgLy8yIE5VTExzCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgaWYgKCFzdHIgfHwgIW8tPmRlZmF1bHRfdmFsLnN0cikgLy8xIE5VTEwKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gIXN0cmNtcChzdHIsIG8tPmRlZmF1bHRfdmFsLnN0cik7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9ET1VCTEU6CisgICAgICAgIHJlYWRfbnVtYmVyKG8sIGRzdCwgJmQsIE5VTEwsIE5VTEwpOworICAgICAgICByZXR1cm4gby0+ZGVmYXVsdF92YWwuZGJsID09IGQ7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9GTE9BVDoKKyAgICAgICAgcmVhZF9udW1iZXIobywgZHN0LCAmZCwgTlVMTCwgTlVMTCk7CisgICAgICAgIGYgPSBvLT5kZWZhdWx0X3ZhbC5kYmw7CisgICAgICAgIGQyID0gZjsKKyAgICAgICAgcmV0dXJuIGQyID09IGQ7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9SQVRJT05BTDoKKyAgICAgICAgcSA9IGF2X2QycShvLT5kZWZhdWx0X3ZhbC5kYmwsIElOVF9NQVgpOworICAgICAgICByZXR1cm4gIWF2X2NtcF9xKCooQVZSYXRpb25hbCopZHN0LCBxKTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0JJTkFSWTogeworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCAqZGF0YTsKKyAgICAgICAgICAgIGludCBzaXplOworICAgICAgICB9IHRtcCA9IHswfTsKKyAgICAgICAgaW50IG9wdF9zaXplID0gKihpbnQgKikoKHZvaWQgKiopZHN0ICsgMSk7CisgICAgICAgIHZvaWQgKm9wdF9wdHIgPSAqKHZvaWQgKiopZHN0OworICAgICAgICBpZiAoIW9wdF9wdHIgJiYgKCFvLT5kZWZhdWx0X3ZhbC5zdHIgfHwgIXN0cmxlbihvLT5kZWZhdWx0X3ZhbC5zdHIpKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBpZiAob3B0X3B0ciAmJiBvLT5kZWZhdWx0X3ZhbC5zdHIgJiYgIXN0cmxlbihvLT5kZWZhdWx0X3ZhbC5zdHIpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChvcHRfc2l6ZSAhPSBzdHJsZW4oby0+ZGVmYXVsdF92YWwuc3RyKSAvIDIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0ID0gc2V0X3N0cmluZ19iaW5hcnkoTlVMTCwgTlVMTCwgby0+ZGVmYXVsdF92YWwuc3RyLCAmdG1wLmRhdGEpOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgIHJldCA9ICFtZW1jbXAob3B0X3B0ciwgdG1wLmRhdGEsIHRtcC5zaXplKTsKKyAgICAgICAgYXZfZnJlZSh0bXAuZGF0YSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGNhc2UgQVZfT1BUX1RZUEVfRElDVDoKKyAgICAgICAgLyogQmluYXJ5IGFuZCBkaWN0IGhhdmUgbm90IGRlZmF1bHQgc3VwcG9ydCB5ZXQuIEFueSBwb2ludGVyIGlzIG5vdCBkZWZhdWx0LiAqLworICAgICAgICByZXR1cm4gISEoKih2b2lkICoqKWRzdCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFOgorICAgICAgICBpZiAoIW8tPmRlZmF1bHRfdmFsLnN0ciB8fCAhc3RyY21wKG8tPmRlZmF1bHRfdmFsLnN0ciwgIm5vbmUiKSkKKyAgICAgICAgICAgIHcgPSBoID0gMDsKKyAgICAgICAgZWxzZSBpZiAoKHJldCA9IGF2X3BhcnNlX3ZpZGVvX3NpemUoJncsICZoLCBvLT5kZWZhdWx0X3ZhbC5zdHIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXR1cm4gKHcgPT0gKihpbnQgKilkc3QpICYmIChoID09ICooKGludCAqKWRzdCsxKSk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9WSURFT19SQVRFOgorICAgICAgICBxID0gKEFWUmF0aW9uYWwpezAsIDB9OworICAgICAgICBpZiAoby0+ZGVmYXVsdF92YWwuc3RyKQorICAgICAgICAgICAgYXZfcGFyc2VfdmlkZW9fcmF0ZSgmcSwgby0+ZGVmYXVsdF92YWwuc3RyKTsKKyAgICAgICAgcmV0dXJuICFhdl9jbXBfcSgqKEFWUmF0aW9uYWwqKWRzdCwgcSk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9DT0xPUjogeworICAgICAgICB1aW50OF90IGNvbG9yWzRdID0gezAsIDAsIDAsIDB9OworICAgICAgICBpZiAoby0+ZGVmYXVsdF92YWwuc3RyKQorICAgICAgICAgICAgYXZfcGFyc2VfY29sb3IoY29sb3IsIG8tPmRlZmF1bHRfdmFsLnN0ciwgLTEsIE5VTEwpOworICAgICAgICByZXR1cm4gIW1lbWNtcChjb2xvciwgZHN0LCBzaXplb2YoY29sb3IpKTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX1dBUk5JTkcsICJOb3Qgc3VwcG9ydGVkIG9wdGlvbiB0eXBlOiAlZCwgb3B0aW9uIG5hbWU6ICVzXG4iLCBvLT50eXBlLCBvLT5uYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKK30KKworaW50IGF2X29wdF9pc19zZXRfdG9fZGVmYXVsdF9ieV9uYW1lKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncykKK3sKKyAgICBjb25zdCBBVk9wdGlvbiAqbzsKKyAgICB2b2lkICp0YXJnZXQ7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgbyA9IGF2X29wdF9maW5kMihvYmosIG5hbWUsIE5VTEwsIDAsIHNlYXJjaF9mbGFncywgJnRhcmdldCk7CisgICAgaWYgKCFvKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworICAgIHJldHVybiBhdl9vcHRfaXNfc2V0X3RvX2RlZmF1bHQodGFyZ2V0LCBvKTsKK30KKworaW50IGF2X29wdF9zZXJpYWxpemUodm9pZCAqb2JqLCBpbnQgb3B0X2ZsYWdzLCBpbnQgZmxhZ3MsIGNoYXIgKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGtleV92YWxfc2VwLCBjb25zdCBjaGFyIHBhaXJzX3NlcCkKK3sKKyAgICBjb25zdCBBVk9wdGlvbiAqbyA9IE5VTEw7CisgICAgdWludDhfdCAqYnVmOworICAgIEFWQlByaW50IGJwcmludDsKKyAgICBpbnQgcmV0LCBjbnQgPSAwOworICAgIGNvbnN0IGNoYXIgc3BlY2lhbF9jaGFyc1tdID0ge3BhaXJzX3NlcCwga2V5X3ZhbF9zZXAsICdcMCd9OworCisgICAgaWYgKHBhaXJzX3NlcCA9PSAnXDAnIHx8IGtleV92YWxfc2VwID09ICdcMCcgfHwgcGFpcnNfc2VwID09IGtleV92YWxfc2VwIHx8CisgICAgICAgIHBhaXJzX3NlcCA9PSAnXFwnIHx8IGtleV92YWxfc2VwID09ICdcXCcpIHsKKyAgICAgICAgYXZfbG9nKG9iaiwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzZXBhcmF0b3IocykgZm91bmQuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKCFvYmogfHwgIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICpidWZmZXIgPSBOVUxMOworICAgIGF2X2JwcmludF9pbml0KCZicHJpbnQsIDY0LCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworCisgICAgd2hpbGUgKG8gPSBhdl9vcHRfbmV4dChvYmosIG8pKSB7CisgICAgICAgIGlmIChvLT50eXBlID09IEFWX09QVF9UWVBFX0NPTlNUKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgoZmxhZ3MgJiBBVl9PUFRfU0VSSUFMSVpFX09QVF9GTEFHU19FWEFDVCkgJiYgby0+ZmxhZ3MgIT0gb3B0X2ZsYWdzKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGVsc2UgaWYgKCgoby0+ZmxhZ3MgJiBvcHRfZmxhZ3MpICE9IG9wdF9mbGFncykpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGZsYWdzICYgQVZfT1BUX1NFUklBTElaRV9TS0lQX0RFRkFVTFRTICYmIGF2X29wdF9pc19zZXRfdG9fZGVmYXVsdChvYmosIG8pID4gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoKHJldCA9IGF2X29wdF9nZXQob2JqLCBvLT5uYW1lLCAwLCAmYnVmKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJwcmludCwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgIGlmIChjbnQrKykKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRfYXBwZW5kX2RhdGEoJmJwcmludCwgJnBhaXJzX3NlcCwgMSk7CisgICAgICAgICAgICBhdl9icHJpbnRfZXNjYXBlKCZicHJpbnQsIG8tPm5hbWUsIHNwZWNpYWxfY2hhcnMsIEFWX0VTQ0FQRV9NT0RFX0JBQ0tTTEFTSCwgMCk7CisgICAgICAgICAgICBhdl9icHJpbnRfYXBwZW5kX2RhdGEoJmJwcmludCwgJmtleV92YWxfc2VwLCAxKTsKKyAgICAgICAgICAgIGF2X2JwcmludF9lc2NhcGUoJmJwcmludCwgYnVmLCBzcGVjaWFsX2NoYXJzLCBBVl9FU0NBUEVfTU9ERV9CQUNLU0xBU0gsIDApOworICAgICAgICAgICAgYXZfZnJlZXAoJmJ1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZicHJpbnQsIGJ1ZmZlcik7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBURVNUCisKK3R5cGVkZWYgc3RydWN0IFRlc3RDb250ZXh0Cit7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IG51bTsKKyAgICBpbnQgdG9nZ2xlOworICAgIGNoYXIgKnN0cmluZzsKKyAgICBpbnQgZmxhZ3M7CisgICAgQVZSYXRpb25hbCByYXRpb25hbDsKKyAgICBBVlJhdGlvbmFsIHZpZGVvX3JhdGU7CisgICAgaW50IHcsIGg7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10OworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgdWludDhfdCBjb2xvcls0XTsKKyAgICBpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OworICAgIHZvaWQgKmJpbmFyeTsKKyAgICBpbnQgYmluYXJ5X3NpemU7CisgICAgdm9pZCAqYmluYXJ5MTsKKyAgICBpbnQgYmluYXJ5X3NpemUxOworICAgIHZvaWQgKmJpbmFyeTI7CisgICAgaW50IGJpbmFyeV9zaXplMjsKKyAgICBpbnQ2NF90IG51bTY0OworICAgIGZsb2F0IGZsdDsKKyAgICBkb3VibGUgZGJsOworICAgIGNoYXIgKmVzY2FwZTsKK30gVGVzdENvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFRlc3RDb250ZXh0LCB4KQorCisjZGVmaW5lIFRFU1RfRkxBR19DT09MIDAxCisjZGVmaW5lIFRFU1RfRkxBR19MQU1FIDAyCisjZGVmaW5lIFRFU1RfRkxBR19NVSAgIDA0CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiB0ZXN0X29wdGlvbnNbXT0geworeyJudW0iLCAgICAgICJzZXQgbnVtIiwgICAgICAgIE9GRlNFVChudW0pLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7Lmk2NCA9IDB9LCAgICAgICAwLCAgICAgICAgMTAwICAgICAgICAgICAgICAgICB9LAoreyJ0b2dnbGUiLCAgICJzZXQgdG9nZ2xlIiwgICAgIE9GRlNFVCh0b2dnbGUpLCAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7Lmk2NCA9IDF9LCAgICAgICAwLCAgICAgICAgMSAgICAgICAgICAgICAgICAgICB9LAoreyJyYXRpb25hbCIsICJzZXQgcmF0aW9uYWwiLCAgIE9GRlNFVChyYXRpb25hbCksIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7LmRibCA9IDF9LCAgICAgICAwLCAgICAgICAgMTAgICAgICAgICAgICAgICAgICB9LAoreyJzdHJpbmciLCAgICJzZXQgc3RyaW5nIiwgICAgIE9GRlNFVChzdHJpbmcpLCAgIEFWX09QVF9UWVBFX1NUUklORywgICB7LnN0ciA9ICJkZWZhdWx0In0sIENIQVJfTUlOLCBDSEFSX01BWCAgICAgICAgICB9LAoreyJlc2NhcGUiLCAgICJzZXQgZXNjYXBlIHN0ciIsIE9GRlNFVChlc2NhcGUpLCAgIEFWX09QVF9UWVBFX1NUUklORywgICB7LnN0ciA9ICJcXD0sIn0sIENIQVJfTUlOLCBDSEFSX01BWCAgICAgICAgICAgICB9LAoreyJmbGFncyIsICAgICJzZXQgZmxhZ3MiLCAgICAgIE9GRlNFVChmbGFncyksICAgIEFWX09QVF9UWVBFX0ZMQUdTLCAgICB7Lmk2NCA9IDF9LCAgICAgICAwLCAgICAgICAgSU5UX01BWCwgMCwgImZsYWdzIiB9LAoreyJjb29sIiwgICAgICJzZXQgY29vbCBmbGFnICIsIDAsICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgICB7Lmk2NCA9IFRFU1RfRkxBR19DT09MfSwgSU5UX01JTiwgIElOVF9NQVgsIDAsICJmbGFncyIgfSwKK3sibGFtZSIsICAgICAic2V0IGxhbWUgZmxhZyAiLCAwLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICAgey5pNjQgPSBURVNUX0ZMQUdfTEFNRX0sIElOVF9NSU4sICBJTlRfTUFYLCAwLCAiZmxhZ3MiIH0sCit7Im11IiwgICAgICAgInNldCBtdSBmbGFnICIsICAgMCwgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICAgIHsuaTY0ID0gVEVTVF9GTEFHX01VfSwgICBJTlRfTUlOLCAgSU5UX01BWCwgMCwgImZsYWdzIiB9LAoreyJzaXplIiwgICAgICJzZXQgc2l6ZSIsICAgICAgIE9GRlNFVCh3KSwgICAgICAgIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsey5zdHI9IjIwMHgzMDAifSwgICAgICAgICAgICAgMCwgICAgICAgIDAgICAgICAgICAgICAgICAgICAgfSwKK3sicGl4X2ZtdCIsICAic2V0IHBpeGZtdCIsICAgICBPRkZTRVQocGl4X2ZtdCksICBBVl9PUFRfVFlQRV9QSVhFTF9GTVQsIHsuaTY0ID0gQVZfUElYX0ZNVF8wQkdSfSwgLTEsIElOVF9NQVh9LAoreyJzYW1wbGVfZm10IiwgInNldCBzYW1wbGVmbXQiLCBPRkZTRVQoc2FtcGxlX2ZtdCksIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQsIHsuaTY0ID0gQVZfU0FNUExFX0ZNVF9TMTZ9LCAtMSwgSU5UX01BWH0sCit7InZpZGVvX3JhdGUiLCAic2V0IHZpZGVvcmF0ZSIsIE9GRlNFVCh2aWRlb19yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgIHsuc3RyID0gIjI1In0sIDAsICAgICAwICAgICAgICAgICAgICAgICAgIH0sCit7ImR1cmF0aW9uIiwgInNldCBkdXJhdGlvbiIsICAgT0ZGU0VUKGR1cmF0aW9uKSwgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gMTAwMH0sIDAsIElOVDY0X01BWH0sCit7ImNvbG9yIiwgInNldCBjb2xvciIsICAgT0ZGU0VUKGNvbG9yKSwgQVZfT1BUX1RZUEVfQ09MT1IsIHsuc3RyID0gInBpbmsifSwgMCwgMH0sCit7ImNsIiwgInNldCBjaGFubmVsIGxheW91dCIsIE9GRlNFVChjaGFubmVsX2xheW91dCksIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VULCB7Lmk2NCA9IEFWX0NIX0xBWU9VVF9IRVhBR09OQUx9LCAwLCBJTlQ2NF9NQVh9LAoreyJiaW4iLCAic2V0IGJpbmFyeSB2YWx1ZSIsICAgIE9GRlNFVChiaW5hcnkpLCAgIEFWX09QVF9UWVBFX0JJTkFSWSwgICB7LnN0cj0iNjI2OTZlMDAifSwgMCwgICAgICAgIDAgfSwKK3siYmluMSIsICJzZXQgYmluYXJ5IHZhbHVlIiwgICBPRkZTRVQoYmluYXJ5MSksICBBVl9PUFRfVFlQRV9CSU5BUlksICAgey5zdHI9TlVMTH0sICAgICAgIDAsICAgICAgICAwIH0sCit7ImJpbjIiLCAic2V0IGJpbmFyeSB2YWx1ZSIsICAgT0ZGU0VUKGJpbmFyeTIpLCAgQVZfT1BUX1RZUEVfQklOQVJZLCAgIHsuc3RyPSIifSwgICAgICAgICAwLCAgICAgICAgMCB9LAoreyJudW02NCIsICAgICJzZXQgbnVtIDY0Yml0IiwgIE9GRlNFVChudW02NCksICAgIEFWX09QVF9UWVBFX0lOVDY0LCAgICB7Lmk2NCA9IDF9LCAgICAgICAgMCwgICAgICAgIDEwMCB9LAoreyJmbHQiLCAgICAgICJzZXQgZmxvYXQiLCAgICAgIE9GRlNFVChmbHQpLCAgICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgICB7LmRibCA9IDEuMC8zfSwgICAgMCwgICAgICAgIDEwMCB9LAoreyJkYmwiLCAgICAgICJzZXQgZG91YmxlIiwgICAgIE9GRlNFVChkYmwpLCAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgICB7LmRibCA9IDEuMC8zfSwgICAgMCwgICAgICAgIDEwMCB9LAore05VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnRlc3RfZ2V0X25hbWUodm9pZCAqY3R4KQoreworICAgIHJldHVybiAidGVzdCI7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHRlc3RfY2xhc3MgPSB7CisgICAgIlRlc3RDb250ZXh0IiwKKyAgICB0ZXN0X2dldF9uYW1lLAorICAgIHRlc3Rfb3B0aW9ucworfTsKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIHByaW50ZigiVGVzdGluZyBkZWZhdWx0IHZhbHVlc1xuIik7CisgICAgeworICAgICAgICBUZXN0Q29udGV4dCB0ZXN0X2N0eCA9IHsgMCB9OworICAgICAgICB0ZXN0X2N0eC5jbGFzcyA9ICZ0ZXN0X2NsYXNzOworICAgICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKCZ0ZXN0X2N0eCk7CisKKyAgICAgICAgcHJpbnRmKCJudW09JWRcbiIsIHRlc3RfY3R4Lm51bSk7CisgICAgICAgIHByaW50ZigidG9nZ2xlPSVkXG4iLCB0ZXN0X2N0eC50b2dnbGUpOworICAgICAgICBwcmludGYoInN0cmluZz0lc1xuIiwgdGVzdF9jdHguc3RyaW5nKTsKKyAgICAgICAgcHJpbnRmKCJlc2NhcGU9JXNcbiIsIHRlc3RfY3R4LmVzY2FwZSk7CisgICAgICAgIHByaW50ZigiZmxhZ3M9JWRcbiIsIHRlc3RfY3R4LmZsYWdzKTsKKyAgICAgICAgcHJpbnRmKCJyYXRpb25hbD0lZC8lZFxuIiwgdGVzdF9jdHgucmF0aW9uYWwubnVtLCB0ZXN0X2N0eC5yYXRpb25hbC5kZW4pOworICAgICAgICBwcmludGYoInZpZGVvX3JhdGU9JWQvJWRcbiIsIHRlc3RfY3R4LnZpZGVvX3JhdGUubnVtLCB0ZXN0X2N0eC52aWRlb19yYXRlLmRlbik7CisgICAgICAgIHByaW50Zigid2lkdGg9JWQgaGVpZ2h0PSVkXG4iLCB0ZXN0X2N0eC53LCB0ZXN0X2N0eC5oKTsKKyAgICAgICAgcHJpbnRmKCJwaXhfZm10PSVzXG4iLCBhdl9nZXRfcGl4X2ZtdF9uYW1lKHRlc3RfY3R4LnBpeF9mbXQpKTsKKyAgICAgICAgcHJpbnRmKCJzYW1wbGVfZm10PSVzXG4iLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKHRlc3RfY3R4LnNhbXBsZV9mbXQpKTsKKyAgICAgICAgcHJpbnRmKCJkdXJhdGlvbj0lIlBSSWQ2NCJcbiIsIHRlc3RfY3R4LmR1cmF0aW9uKTsKKyAgICAgICAgcHJpbnRmKCJjb2xvcj0lZCAlZCAlZCAlZFxuIiwgdGVzdF9jdHguY29sb3JbMF0sIHRlc3RfY3R4LmNvbG9yWzFdLCB0ZXN0X2N0eC5jb2xvclsyXSwgdGVzdF9jdHguY29sb3JbM10pOworICAgICAgICBwcmludGYoImNoYW5uZWxfbGF5b3V0PSUiUFJJZDY0Ij0lIlBSSWQ2NCJcbiIsIHRlc3RfY3R4LmNoYW5uZWxfbGF5b3V0LCAoaW50NjRfdClBVl9DSF9MQVlPVVRfSEVYQUdPTkFMKTsKKyAgICAgICAgaWYgKHRlc3RfY3R4LmJpbmFyeSkKKyAgICAgICAgICAgIHByaW50ZigiYmluYXJ5PSV4ICV4ICV4ICV4XG4iLCAoKHVpbnQ4X3QqKXRlc3RfY3R4LmJpbmFyeSlbMF0sICgodWludDhfdCopdGVzdF9jdHguYmluYXJ5KVsxXSwgKCh1aW50OF90Kil0ZXN0X2N0eC5iaW5hcnkpWzJdLCAoKHVpbnQ4X3QqKXRlc3RfY3R4LmJpbmFyeSlbM10pOworICAgICAgICBwcmludGYoImJpbmFyeV9zaXplPSVkXG4iLCB0ZXN0X2N0eC5iaW5hcnlfc2l6ZSk7CisgICAgICAgIHByaW50ZigibnVtNjQ9JSJQUklkNjQiXG4iLCB0ZXN0X2N0eC5udW02NCk7CisgICAgICAgIHByaW50ZigiZmx0PSUuNmZcbiIsIHRlc3RfY3R4LmZsdCk7CisgICAgICAgIHByaW50ZigiZGJsPSUuNmZcbiIsIHRlc3RfY3R4LmRibCk7CisgICAgICAgIGF2X29wdF9mcmVlKCZ0ZXN0X2N0eCk7CisgICAgfQorCisgICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfb3B0X2lzX3NldF90b19kZWZhdWx0KClcbiIpOworICAgIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgVGVzdENvbnRleHQgdGVzdF9jdHggPSB7IDAgfTsKKyAgICAgICAgY29uc3QgQVZPcHRpb24gKm8gPSBOVUxMOworICAgICAgICB0ZXN0X2N0eC5jbGFzcyA9ICZ0ZXN0X2NsYXNzOworCisgICAgICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX1FVSUVUKTsKKworICAgICAgICB3aGlsZSAobyA9IGF2X29wdF9uZXh0KCZ0ZXN0X2N0eCwgbykpIHsKKyAgICAgICAgICAgIHJldCA9IGF2X29wdF9pc19zZXRfdG9fZGVmYXVsdF9ieV9uYW1lKCZ0ZXN0X2N0eCwgby0+bmFtZSwgMCk7CisgICAgICAgICAgICBwcmludGYoIm5hbWU6JTEwcyBkZWZhdWx0OiVkIGVycm9yOiVzXG4iLCBvLT5uYW1lLCAhIXJldCwgcmV0IDwgMCA/IGF2X2VycjJzdHIocmV0KSA6ICIiKTsKKyAgICAgICAgfQorICAgICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKCZ0ZXN0X2N0eCk7CisgICAgICAgIHdoaWxlIChvID0gYXZfb3B0X25leHQoJnRlc3RfY3R4LCBvKSkgeworICAgICAgICAgICAgcmV0ID0gYXZfb3B0X2lzX3NldF90b19kZWZhdWx0X2J5X25hbWUoJnRlc3RfY3R4LCBvLT5uYW1lLCAwKTsKKyAgICAgICAgICAgIHByaW50ZigibmFtZTolMTBzIGRlZmF1bHQ6JWQgZXJyb3I6JXNcbiIsIG8tPm5hbWUsICEhcmV0LCByZXQgPCAwID8gYXZfZXJyMnN0cihyZXQpIDogIiIpOworICAgICAgICB9CisgICAgICAgIGF2X29wdF9mcmVlKCZ0ZXN0X2N0eCk7CisgICAgfQorCisgICAgcHJpbnRmKCJcblRlc3QgYXZfb3B0X3NlcmlhbGl6ZSgpXG4iKTsKKyAgICB7CisgICAgICAgIFRlc3RDb250ZXh0IHRlc3RfY3R4ID0geyAwIH07CisgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgdGVzdF9jdHguY2xhc3MgPSAmdGVzdF9jbGFzczsKKworICAgICAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19RVUlFVCk7CisKKyAgICAgICAgYXZfb3B0X3NldF9kZWZhdWx0cygmdGVzdF9jdHgpOworICAgICAgICBpZiAoYXZfb3B0X3NlcmlhbGl6ZSgmdGVzdF9jdHgsIDAsIDAsICZidWYsICc9JywgJywnKSA+PSAwKSB7CisgICAgICAgICAgICBwcmludGYoIiVzXG4iLCBidWYpOworICAgICAgICAgICAgYXZfb3B0X2ZyZWUoJnRlc3RfY3R4KTsKKyAgICAgICAgICAgIG1lbXNldCgmdGVzdF9jdHgsIDAsIHNpemVvZih0ZXN0X2N0eCkpOworICAgICAgICAgICAgdGVzdF9jdHguY2xhc3MgPSAmdGVzdF9jbGFzczsKKyAgICAgICAgICAgIGF2X3NldF9vcHRpb25zX3N0cmluZygmdGVzdF9jdHgsIGJ1ZiwgIj0iLCAiLCIpOworICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICAgICAgaWYgKGF2X29wdF9zZXJpYWxpemUoJnRlc3RfY3R4LCAwLCAwLCAmYnVmLCAnPScsICcsJykgPj0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIGJ1Zik7CisgICAgICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2X29wdF9mcmVlKCZ0ZXN0X2N0eCk7CisgICAgfQorCisgICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfc2V0X29wdGlvbnNfc3RyaW5nKClcbiIpOworICAgIHsKKyAgICAgICAgVGVzdENvbnRleHQgdGVzdF9jdHggPSB7IDAgfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvcHRpb25zW10gPSB7CisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICI6IiwKKyAgICAgICAgICAgICI9IiwKKyAgICAgICAgICAgICJmb289OiIsCisgICAgICAgICAgICAiOj1mb28iLAorICAgICAgICAgICAgIj1mb28iLAorICAgICAgICAgICAgImZvbz0iLAorICAgICAgICAgICAgImZvbyIsCisgICAgICAgICAgICAiZm9vPXZhbCIsCisgICAgICAgICAgICAiZm9vPT12YWwiLAorICAgICAgICAgICAgInRvZ2dsZT06IiwKKyAgICAgICAgICAgICJzdHJpbmc9OiIsCisgICAgICAgICAgICAidG9nZ2xlPTEgOiBmb28iLAorICAgICAgICAgICAgInRvZ2dsZT0xMDAiLAorICAgICAgICAgICAgInRvZ2dsZT09MSIsCisgICAgICAgICAgICAiZmxhZ3M9K211LWxhbWUgOiBudW09NDI6IHRvZ2dsZT0wIiwKKyAgICAgICAgICAgICJudW09NDIgOiBzdHJpbmc9YmxhaGJsYWgiLAorICAgICAgICAgICAgInJhdGlvbmFsPTAgOiByYXRpb25hbD0xLzIgOiByYXRpb25hbD0xLy0xIiwKKyAgICAgICAgICAgICJyYXRpb25hbD0tMS8wIiwKKyAgICAgICAgICAgICJzaXplPTEwMjR4NzY4IiwKKyAgICAgICAgICAgICJzaXplPXBhbCIsCisgICAgICAgICAgICAic2l6ZT1ib2d1cyIsCisgICAgICAgICAgICAicGl4X2ZtdD15dXY0MjBwIiwKKyAgICAgICAgICAgICJwaXhfZm10PTIiLAorICAgICAgICAgICAgInBpeF9mbXQ9Ym9ndXMiLAorICAgICAgICAgICAgInNhbXBsZV9mbXQ9czE2IiwKKyAgICAgICAgICAgICJzYW1wbGVfZm10PTIiLAorICAgICAgICAgICAgInNhbXBsZV9mbXQ9Ym9ndXMiLAorICAgICAgICAgICAgInZpZGVvX3JhdGU9cGFsIiwKKyAgICAgICAgICAgICJ2aWRlb19yYXRlPTI1IiwKKyAgICAgICAgICAgICJ2aWRlb19yYXRlPTMwMDAwLzEwMDEiLAorICAgICAgICAgICAgInZpZGVvX3JhdGU9MzAvMS4wMDEiLAorICAgICAgICAgICAgInZpZGVvX3JhdGU9Ym9ndXMiLAorICAgICAgICAgICAgImR1cmF0aW9uPWJvZ3VzIiwKKyAgICAgICAgICAgICJkdXJhdGlvbj0xMjMuNDUiLAorICAgICAgICAgICAgImR1cmF0aW9uPTFcXDoyM1xcOjQ1LjY3IiwKKyAgICAgICAgICAgICJjb2xvcj1ibHVlIiwKKyAgICAgICAgICAgICJjb2xvcj0weDIyMzMwMCIsCisgICAgICAgICAgICAiY29sb3I9MHg0MkZGMDdBQSIsCisgICAgICAgICAgICAiY2w9c3RlcmVvK2Rvd25taXgiLAorICAgICAgICAgICAgImNsPWZvbyIsCisgICAgICAgICAgICAiYmluPWJvZ3VzcyIsCisgICAgICAgICAgICAiYmluPTExMSIsCisgICAgICAgICAgICAiYmluPWZmZmYiLAorICAgICAgICAgICAgIm51bTY0PWJvZ3VzIiwKKyAgICAgICAgICAgICJudW02ND00NCIsCisgICAgICAgICAgICAibnVtNjQ9NDQuNCIsCisgICAgICAgICAgICAibnVtNjQ9LTEiLAorICAgICAgICAgICAgIm51bTY0PTEwMSIsCisgICAgICAgICAgICAiZmx0PWJvZ3VzIiwKKyAgICAgICAgICAgICJmbHQ9MiIsCisgICAgICAgICAgICAiZmx0PTIuMiIsCisgICAgICAgICAgICAiZmx0PS0xIiwKKyAgICAgICAgICAgICJmbHQ9MTAxIiwKKyAgICAgICAgICAgICJkYmw9Ym9ndXMiLAorICAgICAgICAgICAgImRibD0yIiwKKyAgICAgICAgICAgICJkYmw9Mi4yIiwKKyAgICAgICAgICAgICJkYmw9LTEiLAorICAgICAgICAgICAgImRibD0xMDEiLAorICAgICAgICB9OworCisgICAgICAgIHRlc3RfY3R4LmNsYXNzID0gJnRlc3RfY2xhc3M7CisgICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHMoJnRlc3RfY3R4KTsKKworICAgICAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19RVUlFVCk7CisKKyAgICAgICAgZm9yIChpPTA7IGkgPCBGRl9BUlJBWV9FTEVNUyhvcHRpb25zKTsgaSsrKSB7CisgICAgICAgICAgICBhdl9sb2coJnRlc3RfY3R4LCBBVl9MT0dfREVCVUcsICJTZXR0aW5nIG9wdGlvbnMgc3RyaW5nICclcydcbiIsIG9wdGlvbnNbaV0pOworICAgICAgICAgICAgaWYgKGF2X3NldF9vcHRpb25zX3N0cmluZygmdGVzdF9jdHgsIG9wdGlvbnNbaV0sICI9IiwgIjoiKSA8IDApCisgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvciAnJXMnXG4iLCBvcHRpb25zW2ldKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIk9LICAgICclcydcbiIsIG9wdGlvbnNbaV0pOworICAgICAgICB9CisgICAgICAgIGF2X29wdF9mcmVlKCZ0ZXN0X2N0eCk7CisgICAgfQorCisgICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfb3B0X3NldF9mcm9tX3N0cmluZygpXG4iKTsKKyAgICB7CisgICAgICAgIFRlc3RDb250ZXh0IHRlc3RfY3R4ID0geyAwIH07CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3B0aW9uc1tdID0geworICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiNSIsCisgICAgICAgICAgICAiNTpoZWxsbyIsCisgICAgICAgICAgICAiNTpoZWxsbzpzaXplPXBhbCIsCisgICAgICAgICAgICAiNTpzaXplPXBhbDpoZWxsbyIsCisgICAgICAgICAgICAiOiIsCisgICAgICAgICAgICAiPSIsCisgICAgICAgICAgICAiIDUgOiBoZWxsbyA6IHNpemUgPSBwYWwgIiwKKyAgICAgICAgICAgICJhX3ZlcnlfbG9uZ19vcHRpb25fbmFtZV90aGF0X3dpbGxfbmVlZF90b19iZV9lbGxpcHNpemVkX2Fyb3VuZF9oZXJlPTQyIgorICAgICAgICB9OworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNob3J0aGFuZFtdID0geyAibnVtIiwgInN0cmluZyIsIE5VTEwgfTsKKworICAgICAgICB0ZXN0X2N0eC5jbGFzcyA9ICZ0ZXN0X2NsYXNzOworICAgICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKCZ0ZXN0X2N0eCk7CisKKyAgICAgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfUVVJRVQpOworCisgICAgICAgIGZvciAoaT0wOyBpIDwgRkZfQVJSQVlfRUxFTVMob3B0aW9ucyk7IGkrKykgeworICAgICAgICAgICAgYXZfbG9nKCZ0ZXN0X2N0eCwgQVZfTE9HX0RFQlVHLCAiU2V0dGluZyBvcHRpb25zIHN0cmluZyAnJXMnXG4iLCBvcHRpb25zW2ldKTsKKyAgICAgICAgICAgIGlmIChhdl9vcHRfc2V0X2Zyb21fc3RyaW5nKCZ0ZXN0X2N0eCwgb3B0aW9uc1tpXSwgc2hvcnRoYW5kLCAiPSIsICI6IikgPCAwKQorICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3IgJyVzJ1xuIiwgb3B0aW9uc1tpXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJPSyAgICAnJXMnXG4iLCBvcHRpb25zW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhdl9vcHRfZnJlZSgmdGVzdF9jdHgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvb3B0LmggYi9mZm1wZWcvbGliYXZ1dGlsL29wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzhhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL29wdC5oCkBAIC0wLDAgKzEsOTAxIEBACisvKgorICogQVZPcHRpb25zCisgKiBjb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfT1BUX0gKKyNkZWZpbmUgQVZVVElMX09QVF9ICisKKy8qKgorICogQGZpbGUKKyAqIEFWT3B0aW9ucworICovCisKKyNpbmNsdWRlICJyYXRpb25hbC5oIgorI2luY2x1ZGUgImF2dXRpbC5oIgorI2luY2x1ZGUgImRpY3QuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJwaXhmbXQuaCIKKyNpbmNsdWRlICJzYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKy8qKgorICogQGRlZmdyb3VwIGF2b3B0aW9ucyBBVk9wdGlvbnMKKyAqIEBpbmdyb3VwIGxhdnVfZGF0YQorICogQHsKKyAqIEFWT3B0aW9ucyBwcm92aWRlIGEgZ2VuZXJpYyBzeXN0ZW0gdG8gZGVjbGFyZSBvcHRpb25zIG9uIGFyYml0cmFyeSBzdHJ1Y3RzCisgKiAoIm9iamVjdHMiKS4gQW4gb3B0aW9uIGNhbiBoYXZlIGEgaGVscCB0ZXh0LCBhIHR5cGUgYW5kIGEgcmFuZ2Ugb2YgcG9zc2libGUKKyAqIHZhbHVlcy4gT3B0aW9ucyBtYXkgdGhlbiBiZSBlbnVtZXJhdGVkLCByZWFkIGFuZCB3cml0dGVuIHRvLgorICoKKyAqIEBzZWN0aW9uIGF2b3B0aW9uc19pbXBsZW1lbnQgSW1wbGVtZW50aW5nIEFWT3B0aW9ucworICogVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBob3cgdG8gYWRkIEFWT3B0aW9ucyBjYXBhYmlsaXRpZXMgdG8gYSBzdHJ1Y3QuCisgKgorICogQWxsIEFWT3B0aW9ucy1yZWxhdGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhbiBBVkNsYXNzLiBUaGVyZWZvcmUKKyAqIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIHN0cnVjdCBzaG91bGQgYmUgYSBwb2ludGVyIHRvIGFuIEFWQ2xhc3MgZGVzY3JpYmluZyBpdC4KKyAqIFRoZSBvcHRpb24gZmllbGQgb2YgdGhlIEFWQ2xhc3MgbXVzdCBiZSBzZXQgdG8gYSBOVUxMLXRlcm1pbmF0ZWQgc3RhdGljIGFycmF5CisgKiBvZiBBVk9wdGlvbnMuIEVhY2ggQVZPcHRpb24gbXVzdCBoYXZlIGEgbm9uLWVtcHR5IG5hbWUsIGEgdHlwZSwgYSBkZWZhdWx0CisgKiB2YWx1ZSBhbmQgZm9yIG51bWJlci10eXBlIEFWT3B0aW9ucyBhbHNvIGEgcmFuZ2Ugb2YgYWxsb3dlZCB2YWx1ZXMuIEl0IG11c3QKKyAqIGFsc28gZGVjbGFyZSBhbiBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0cnVjdCwgd2hlcmUgdGhlIGZpZWxkCisgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBBVk9wdGlvbiBpcyBsb2NhdGVkLiBPdGhlciBmaWVsZHMgaW4gdGhlIEFWT3B0aW9uIHN0cnVjdAorICogc2hvdWxkIGFsc28gYmUgc2V0IHdoZW4gYXBwbGljYWJsZSwgYnV0IGFyZSBub3QgcmVxdWlyZWQuCisgKgorICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGFuIEFWT3B0aW9ucy1lbmFibGVkIHN0cnVjdDoKKyAqIEBjb2RlCisgKiB0eXBlZGVmIHN0cnVjdCB0ZXN0X3N0cnVjdCB7CisgKiAgICAgQVZDbGFzcyAqY2xhc3M7CisgKiAgICAgaW50ICAgICAgaW50X29wdDsKKyAqICAgICBjaGFyICAgICpzdHJfb3B0OworICogICAgIHVpbnQ4X3QgKmJpbl9vcHQ7CisgKiAgICAgaW50ICAgICAgYmluX2xlbjsKKyAqIH0gdGVzdF9zdHJ1Y3Q7CisgKgorICogc3RhdGljIGNvbnN0IEFWT3B0aW9uIHRlc3Rfb3B0aW9uc1tdID0geworICogICB7ICJ0ZXN0X2ludCIsICJUaGlzIGlzIGEgdGVzdCBvcHRpb24gb2YgaW50IHR5cGUuIiwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3QsIGludF9vcHQpLAorICogICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgSU5UX01JTiwgSU5UX01BWCB9LAorICogICB7ICJ0ZXN0X3N0ciIsICJUaGlzIGlzIGEgdGVzdCBvcHRpb24gb2Ygc3RyaW5nIHR5cGUuIiwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3QsIHN0cl9vcHQpLAorICogICAgIEFWX09QVF9UWVBFX1NUUklORyB9LAorICogICB7ICJ0ZXN0X2JpbiIsICJUaGlzIGlzIGEgdGVzdCBvcHRpb24gb2YgYmluYXJ5IHR5cGUuIiwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3QsIGJpbl9vcHQpLAorICogICAgIEFWX09QVF9UWVBFX0JJTkFSWSB9LAorICogICB7IE5VTEwgfSwKKyAqIH07CisgKgorICogc3RhdGljIGNvbnN0IEFWQ2xhc3MgdGVzdF9jbGFzcyA9IHsKKyAqICAgICAuY2xhc3NfbmFtZSA9ICJ0ZXN0IGNsYXNzIiwKKyAqICAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICogICAgIC5vcHRpb24gICAgID0gdGVzdF9vcHRpb25zLAorICogICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICogfTsKKyAqIEBlbmRjb2RlCisgKgorICogTmV4dCwgd2hlbiBhbGxvY2F0aW5nIHlvdXIgc3RydWN0LCB5b3UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgQVZDbGFzcyBwb2ludGVyCisgKiBpcyBzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUuIFRoZW4sIGF2X29wdF9zZXRfZGVmYXVsdHMoKSBjYW4gYmUgY2FsbGVkIHRvCisgKiBpbml0aWFsaXplIGRlZmF1bHRzLiBBZnRlciB0aGF0IHRoZSBzdHJ1Y3QgaXMgcmVhZHkgdG8gYmUgdXNlZCB3aXRoIHRoZQorICogQVZPcHRpb25zIEFQSS4KKyAqCisgKiBXaGVuIGNsZWFuaW5nIHVwLCB5b3UgbWF5IHVzZSB0aGUgYXZfb3B0X2ZyZWUoKSBmdW5jdGlvbiB0byBhdXRvbWF0aWNhbGx5CisgKiBmcmVlIGFsbCB0aGUgYWxsb2NhdGVkIHN0cmluZyBhbmQgYmluYXJ5IG9wdGlvbnMuCisgKgorICogQ29udGludWluZyB3aXRoIHRoZSBhYm92ZSBleGFtcGxlOgorICoKKyAqIEBjb2RlCisgKiB0ZXN0X3N0cnVjdCAqYWxsb2NfdGVzdF9zdHJ1Y3Qodm9pZCkKKyAqIHsKKyAqICAgICB0ZXN0X3N0cnVjdCAqcmV0ID0gYXZfbWFsbG9jKHNpemVvZigqcmV0KSk7CisgKiAgICAgcmV0LT5jbGFzcyA9ICZ0ZXN0X2NsYXNzOworICogICAgIGF2X29wdF9zZXRfZGVmYXVsdHMocmV0KTsKKyAqICAgICByZXR1cm4gcmV0OworICogfQorICogdm9pZCBmcmVlX3Rlc3Rfc3RydWN0KHRlc3Rfc3RydWN0ICoqZm9vKQorICogeworICogICAgIGF2X29wdF9mcmVlKCpmb28pOworICogICAgIGF2X2ZyZWVwKGZvbyk7CisgKiB9CisgKiBAZW5kY29kZQorICoKKyAqIEBzdWJzZWN0aW9uIGF2b3B0aW9uc19pbXBsZW1lbnRfbmVzdGluZyBOZXN0aW5nCisgKiAgICAgIEl0IG1heSBoYXBwZW4gdGhhdCBhbiBBVk9wdGlvbnMtZW5hYmxlZCBzdHJ1Y3QgY29udGFpbnMgYW5vdGhlcgorICogICAgICBBVk9wdGlvbnMtZW5hYmxlZCBzdHJ1Y3QgYXMgYSBtZW1iZXIgKGUuZy4gQVZDb2RlY0NvbnRleHQgaW4KKyAqICAgICAgbGliYXZjb2RlYyBleHBvcnRzIGdlbmVyaWMgb3B0aW9ucywgd2hpbGUgaXRzIHByaXZfZGF0YSBmaWVsZCBleHBvcnRzCisgKiAgICAgIGNvZGVjLXNwZWNpZmljIG9wdGlvbnMpLiBJbiBzdWNoIGEgY2FzZSwgaXQgaXMgcG9zc2libGUgdG8gc2V0IHVwIHRoZQorICogICAgICBwYXJlbnQgc3RydWN0IHRvIGV4cG9ydCBhIGNoaWxkJ3Mgb3B0aW9ucy4gVG8gZG8gdGhhdCwgc2ltcGx5CisgKiAgICAgIGltcGxlbWVudCBBVkNsYXNzLmNoaWxkX25leHQoKSBhbmQgQVZDbGFzcy5jaGlsZF9jbGFzc19uZXh0KCkgaW4gdGhlCisgKiAgICAgIHBhcmVudCBzdHJ1Y3QncyBBVkNsYXNzLgorICogICAgICBBc3N1bWluZyB0aGF0IHRoZSB0ZXN0X3N0cnVjdCBmcm9tIGFib3ZlIG5vdyBhbHNvIGNvbnRhaW5zIGEKKyAqICAgICAgY2hpbGRfc3RydWN0IGZpZWxkOgorICoKKyAqICAgICAgQGNvZGUKKyAqICAgICAgdHlwZWRlZiBzdHJ1Y3QgY2hpbGRfc3RydWN0IHsKKyAqICAgICAgICAgIEFWQ2xhc3MgKmNsYXNzOworICogICAgICAgICAgaW50IGZsYWdzX29wdDsKKyAqICAgICAgfSBjaGlsZF9zdHJ1Y3Q7CisgKiAgICAgIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBjaGlsZF9vcHRzW10gPSB7CisgKiAgICAgICAgICB7ICJ0ZXN0X2ZsYWdzIiwgIlRoaXMgaXMgYSB0ZXN0IG9wdGlvbiBvZiBmbGFncyB0eXBlLiIsCisgKiAgICAgICAgICAgIG9mZnNldG9mKGNoaWxkX3N0cnVjdCwgZmxhZ3Nfb3B0KSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsgLmk2NCA9IDAgfSwgSU5UX01JTiwgSU5UX01BWCB9LAorICogICAgICAgICAgeyBOVUxMIH0sCisgKiAgICAgIH07CisgKiAgICAgIHN0YXRpYyBjb25zdCBBVkNsYXNzIGNoaWxkX2NsYXNzID0geworICogICAgICAgICAgLmNsYXNzX25hbWUgPSAiY2hpbGQgY2xhc3MiLAorICogICAgICAgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAqICAgICAgICAgIC5vcHRpb24gICAgID0gY2hpbGRfb3B0cywKKyAqICAgICAgICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICogICAgICB9OworICoKKyAqICAgICAgdm9pZCAqY2hpbGRfbmV4dCh2b2lkICpvYmosIHZvaWQgKnByZXYpCisgKiAgICAgIHsKKyAqICAgICAgICAgIHRlc3Rfc3RydWN0ICp0ID0gb2JqOworICogICAgICAgICAgaWYgKCFwcmV2ICYmIHQtPmNoaWxkX3N0cnVjdCkKKyAqICAgICAgICAgICAgICByZXR1cm4gdC0+Y2hpbGRfc3RydWN0OworICogICAgICAgICAgcmV0dXJuIE5VTEwKKyAqICAgICAgfQorICogICAgICBjb25zdCBBVkNsYXNzIGNoaWxkX2NsYXNzX25leHQoY29uc3QgQVZDbGFzcyAqcHJldikKKyAqICAgICAgeworICogICAgICAgICAgcmV0dXJuIHByZXYgPyBOVUxMIDogJmNoaWxkX2NsYXNzOworICogICAgICB9CisgKiAgICAgIEBlbmRjb2RlCisgKiAgICAgIFB1dHRpbmcgY2hpbGRfbmV4dCgpIGFuZCBjaGlsZF9jbGFzc19uZXh0KCkgYXMgZGVmaW5lZCBhYm92ZSBpbnRvCisgKiAgICAgIHRlc3RfY2xhc3Mgd2lsbCBub3cgbWFrZSBjaGlsZF9zdHJ1Y3QncyBvcHRpb25zIGFjY2Vzc2libGUgdGhyb3VnaAorICogICAgICB0ZXN0X3N0cnVjdCAoYWdhaW4sIHByb3BlciBzZXR1cCBhcyBkZXNjcmliZWQgYWJvdmUgbmVlZHMgdG8gYmUgZG9uZSBvbgorICogICAgICBjaGlsZF9zdHJ1Y3QgcmlnaHQgYWZ0ZXIgaXQgaXMgY3JlYXRlZCkuCisgKgorICogICAgICBGcm9tIHRoZSBhYm92ZSBleGFtcGxlIGl0IG1pZ2h0IG5vdCBiZSBjbGVhciB3aHkgYm90aCBjaGlsZF9uZXh0KCkKKyAqICAgICAgYW5kIGNoaWxkX2NsYXNzX25leHQoKSBhcmUgbmVlZGVkLiBUaGUgZGlzdGluY3Rpb24gaXMgdGhhdCBjaGlsZF9uZXh0KCkKKyAqICAgICAgaXRlcmF0ZXMgb3ZlciBhY3R1YWxseSBleGlzdGluZyBvYmplY3RzLCB3aGlsZSBjaGlsZF9jbGFzc19uZXh0KCkKKyAqICAgICAgaXRlcmF0ZXMgb3ZlciBhbGwgcG9zc2libGUgY2hpbGQgY2xhc3Nlcy4gRS5nLiBpZiBhbiBBVkNvZGVjQ29udGV4dAorICogICAgICB3YXMgaW5pdGlhbGl6ZWQgdG8gdXNlIGEgY29kZWMgd2hpY2ggaGFzIHByaXZhdGUgb3B0aW9ucywgdGhlbiBpdHMKKyAqICAgICAgY2hpbGRfbmV4dCgpIHdpbGwgcmV0dXJuIEFWQ29kZWNDb250ZXh0LnByaXZfZGF0YSBhbmQgZmluaXNoCisgKiAgICAgIGl0ZXJhdGluZy4gT1RPSCBjaGlsZF9jbGFzc19uZXh0KCkgb24gQVZDb2RlY0NvbnRleHQuYXZfY2xhc3Mgd2lsbAorICogICAgICBpdGVyYXRlIG92ZXIgYWxsIGF2YWlsYWJsZSBjb2RlY3Mgd2l0aCBwcml2YXRlIG9wdGlvbnMuCisgKgorICogQHN1YnNlY3Rpb24gYXZvcHRpb25zX2ltcGxlbWVudF9uYW1lZF9jb25zdGFudHMgTmFtZWQgY29uc3RhbnRzCisgKiAgICAgIEl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBuYW1lZCBjb25zdGFudHMgZm9yIG9wdGlvbnMuIFNpbXBseSBzZXQgdGhlIHVuaXQKKyAqICAgICAgZmllbGQgb2YgdGhlIG9wdGlvbiB0aGUgY29uc3RhbnRzIHNob3VsZCBhcHBseSB0byBhIHN0cmluZyBhbmQKKyAqICAgICAgY3JlYXRlIHRoZSBjb25zdGFudHMgdGhlbXNlbHZlcyBhcyBvcHRpb25zIG9mIHR5cGUgQVZfT1BUX1RZUEVfQ09OU1QKKyAqICAgICAgd2l0aCB0aGVpciB1bml0IGZpZWxkIHNldCB0byB0aGUgc2FtZSBzdHJpbmcuCisgKiAgICAgIFRoZWlyIGRlZmF1bHRfdmFsIGZpZWxkIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQKKyAqICAgICAgY29uc3RhbnQuCisgKiAgICAgIEZvciBleGFtcGxlLCB0byBhZGQgc29tZSBuYW1lZCBjb25zdGFudHMgZm9yIHRoZSB0ZXN0X2ZsYWdzIG9wdGlvbgorICogICAgICBhYm92ZSwgcHV0IHRoZSBmb2xsb3dpbmcgaW50byB0aGUgY2hpbGRfb3B0cyBhcnJheToKKyAqICAgICAgQGNvZGUKKyAqICAgICAgeyAidGVzdF9mbGFncyIsICJUaGlzIGlzIGEgdGVzdCBvcHRpb24gb2YgZmxhZ3MgdHlwZS4iLAorICogICAgICAgIG9mZnNldG9mKGNoaWxkX3N0cnVjdCwgZmxhZ3Nfb3B0KSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsgLmk2NCA9IDAgfSwgSU5UX01JTiwgSU5UX01BWCwgInRlc3RfdW5pdCIgfSwKKyAqICAgICAgeyAiZmxhZzEiLCAiVGhpcyBpcyBhIGZsYWcgd2l0aCB2YWx1ZSAxNiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAxNiB9LCAwLCAwLCAidGVzdF91bml0IiB9LAorICogICAgICBAZW5kY29kZQorICoKKyAqIEBzZWN0aW9uIGF2b3B0aW9uc191c2UgVXNpbmcgQVZPcHRpb25zCisgKiBUaGlzIHNlY3Rpb24gZGVhbHMgd2l0aCBhY2Nlc3Npbmcgb3B0aW9ucyBpbiBhbiBBVk9wdGlvbnMtZW5hYmxlZCBzdHJ1Y3QuCisgKiBTdWNoIHN0cnVjdHMgaW4gRkZtcGVnIGFyZSBlLmcuIEFWQ29kZWNDb250ZXh0IGluIGxpYmF2Y29kZWMgb3IKKyAqIEFWRm9ybWF0Q29udGV4dCBpbiBsaWJhdmZvcm1hdC4KKyAqCisgKiBAc3Vic2VjdGlvbiBhdm9wdGlvbnNfdXNlX2V4YW1pbmUgRXhhbWluaW5nIEFWT3B0aW9ucworICogVGhlIGJhc2ljIGZ1bmN0aW9ucyBmb3IgZXhhbWluaW5nIG9wdGlvbnMgYXJlIGF2X29wdF9uZXh0KCksIHdoaWNoIGl0ZXJhdGVzCisgKiBvdmVyIGFsbCBvcHRpb25zIGRlZmluZWQgZm9yIG9uZSBvYmplY3QsIGFuZCBhdl9vcHRfZmluZCgpLCB3aGljaCBzZWFyY2hlcworICogZm9yIGFuIG9wdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICoKKyAqIFRoZSBzaXR1YXRpb24gaXMgbW9yZSBjb21wbGljYXRlZCB3aXRoIG5lc3RpbmcuIEFuIEFWT3B0aW9ucy1lbmFibGVkIHN0cnVjdAorICogbWF5IGhhdmUgQVZPcHRpb25zLWVuYWJsZWQgY2hpbGRyZW4uIFBhc3NpbmcgdGhlIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4gZmxhZworICogdG8gYXZfb3B0X2ZpbmQoKSB3aWxsIG1ha2UgdGhlIGZ1bmN0aW9uIHNlYXJjaCBjaGlsZHJlbiByZWN1cnNpdmVseS4KKyAqCisgKiBGb3IgZW51bWVyYXRpbmcgdGhlcmUgYXJlIGJhc2ljYWxseSB0d28gY2FzZXMuIFRoZSBmaXJzdCBpcyB3aGVuIHlvdSB3YW50IHRvCisgKiBnZXQgYWxsIG9wdGlvbnMgdGhhdCBtYXkgcG90ZW50aWFsbHkgZXhpc3Qgb24gdGhlIHN0cnVjdCBhbmQgaXRzIGNoaWxkcmVuCisgKiAoZS5nLiAgd2hlbiBjb25zdHJ1Y3RpbmcgZG9jdW1lbnRhdGlvbikuIEluIHRoYXQgY2FzZSB5b3Ugc2hvdWxkIGNhbGwKKyAqIGF2X29wdF9jaGlsZF9jbGFzc19uZXh0KCkgcmVjdXJzaXZlbHkgb24gdGhlIHBhcmVudCBzdHJ1Y3QncyBBVkNsYXNzLiAgVGhlCisgKiBzZWNvbmQgY2FzZSBpcyB3aGVuIHlvdSBoYXZlIGFuIGFscmVhZHkgaW5pdGlhbGl6ZWQgc3RydWN0IHdpdGggYWxsIGl0cworICogY2hpbGRyZW4gYW5kIHlvdSB3YW50IHRvIGdldCBhbGwgb3B0aW9ucyB0aGF0IGNhbiBiZSBhY3R1YWxseSB3cml0dGVuIG9yIHJlYWQKKyAqIGZyb20gaXQuIEluIHRoYXQgY2FzZSB5b3Ugc2hvdWxkIGNhbGwgYXZfb3B0X2NoaWxkX25leHQoKSByZWN1cnNpdmVseSAoYW5kCisgKiBhdl9vcHRfbmV4dCgpIG9uIGVhY2ggcmVzdWx0KS4KKyAqCisgKiBAc3Vic2VjdGlvbiBhdm9wdGlvbnNfdXNlX2dldF9zZXQgUmVhZGluZyBhbmQgd3JpdGluZyBBVk9wdGlvbnMKKyAqIFdoZW4gc2V0dGluZyBvcHRpb25zLCB5b3Ugb2Z0ZW4gaGF2ZSBhIHN0cmluZyByZWFkIGRpcmVjdGx5IGZyb20gdGhlCisgKiB1c2VyLiBJbiBzdWNoIGEgY2FzZSwgc2ltcGx5IHBhc3NpbmcgaXQgdG8gYXZfb3B0X3NldCgpIGlzIGVub3VnaC4gRm9yCisgKiBub24tc3RyaW5nIHR5cGUgb3B0aW9ucywgYXZfb3B0X3NldCgpIHdpbGwgcGFyc2UgdGhlIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlCisgKiBvcHRpb24gdHlwZS4KKyAqCisgKiBTaW1pbGFybHkgYXZfb3B0X2dldCgpIHdpbGwgcmVhZCBhbnkgb3B0aW9uIHR5cGUgYW5kIGNvbnZlcnQgaXQgdG8gYSBzdHJpbmcKKyAqIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQuIERvIG5vdCBmb3JnZXQgdGhhdCB0aGUgc3RyaW5nIGlzIGFsbG9jYXRlZCwgc28geW91CisgKiBoYXZlIHRvIGZyZWUgaXQgd2l0aCBhdl9mcmVlKCkuCisgKgorICogSW4gc29tZSBjYXNlcyBpdCBtYXkgYmUgbW9yZSBjb252ZW5pZW50IHRvIHB1dCBhbGwgb3B0aW9ucyBpbnRvIGFuCisgKiBBVkRpY3Rpb25hcnkgYW5kIGNhbGwgYXZfb3B0X3NldF9kaWN0KCkgb24gaXQuIEEgc3BlY2lmaWMgY2FzZSBvZiB0aGlzCisgKiBhcmUgdGhlIGZvcm1hdC9jb2RlYyBvcGVuIGZ1bmN0aW9ucyBpbiBsYXZmL2xhdmMgd2hpY2ggdGFrZSBhIGRpY3Rpb25hcnkKKyAqIGZpbGxlZCB3aXRoIG9wdGlvbiBhcyBhIHBhcmFtZXRlci4gVGhpcyBhbGxvd3MgdG8gc2V0IHNvbWUgb3B0aW9ucworICogdGhhdCBjYW5ub3QgYmUgc2V0IG90aGVyd2lzZSwgc2luY2UgZS5nLiB0aGUgaW5wdXQgZmlsZSBmb3JtYXQgaXMgbm90IGtub3duCisgKiBiZWZvcmUgdGhlIGZpbGUgaXMgYWN0dWFsbHkgb3BlbmVkLgorICovCisKK2VudW0gQVZPcHRpb25UeXBleworICAgIEFWX09QVF9UWVBFX0ZMQUdTLAorICAgIEFWX09QVF9UWVBFX0lOVCwKKyAgICBBVl9PUFRfVFlQRV9JTlQ2NCwKKyAgICBBVl9PUFRfVFlQRV9ET1VCTEUsCisgICAgQVZfT1BUX1RZUEVfRkxPQVQsCisgICAgQVZfT1BUX1RZUEVfU1RSSU5HLAorICAgIEFWX09QVF9UWVBFX1JBVElPTkFMLAorICAgIEFWX09QVF9UWVBFX0JJTkFSWSwgIC8vLzwgb2Zmc2V0IG11c3QgcG9pbnQgdG8gYSBwb2ludGVyIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIGludCBmb3IgdGhlIGxlbmd0aAorICAgIEFWX09QVF9UWVBFX0RJQ1QsCisgICAgQVZfT1BUX1RZUEVfQ09OU1QgPSAxMjgsCisgICAgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSA9IE1LQkVUQUcoJ1MnLCdJJywnWicsJ0UnKSwgLy8vPCBvZmZzZXQgbXVzdCBwb2ludCB0byB0d28gY29uc2VjdXRpdmUgaW50ZWdlcnMKKyAgICBBVl9PUFRfVFlQRV9QSVhFTF9GTVQgID0gTUtCRVRBRygnUCcsJ0YnLCdNJywnVCcpLAorICAgIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQgPSBNS0JFVEFHKCdTJywnRicsJ00nLCdUJyksCisgICAgQVZfT1BUX1RZUEVfVklERU9fUkFURSA9IE1LQkVUQUcoJ1YnLCdSJywnQScsJ1QnKSwgLy8vPCBvZmZzZXQgbXVzdCBwb2ludCB0byBBVlJhdGlvbmFsCisgICAgQVZfT1BUX1RZUEVfRFVSQVRJT04gICA9IE1LQkVUQUcoJ0QnLCdVJywnUicsJyAnKSwKKyAgICBBVl9PUFRfVFlQRV9DT0xPUiAgICAgID0gTUtCRVRBRygnQycsJ08nLCdMJywnUicpLAorICAgIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VUID0gTUtCRVRBRygnQycsJ0gnLCdMJywnQScpLAorI2lmIEZGX0FQSV9PTERfQVZPUFRJT05TCisgICAgRkZfT1BUX1RZUEVfRkxBR1MgPSAwLAorICAgIEZGX09QVF9UWVBFX0lOVCwKKyAgICBGRl9PUFRfVFlQRV9JTlQ2NCwKKyAgICBGRl9PUFRfVFlQRV9ET1VCTEUsCisgICAgRkZfT1BUX1RZUEVfRkxPQVQsCisgICAgRkZfT1BUX1RZUEVfU1RSSU5HLAorICAgIEZGX09QVF9UWVBFX1JBVElPTkFMLAorICAgIEZGX09QVF9UWVBFX0JJTkFSWSwgIC8vLzwgb2Zmc2V0IG11c3QgcG9pbnQgdG8gYSBwb2ludGVyIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIGludCBmb3IgdGhlIGxlbmd0aAorICAgIEZGX09QVF9UWVBFX0NPTlNUPTEyOCwKKyNlbmRpZgorfTsKKworLyoqCisgKiBBVk9wdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCBBVk9wdGlvbiB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgIC8qKgorICAgICAqIHNob3J0IEVuZ2xpc2ggaGVscCB0ZXh0CisgICAgICogQHRvZG8gV2hhdCBhYm91dCBvdGhlciBsYW5ndWFnZXM/CisgICAgICovCisgICAgY29uc3QgY2hhciAqaGVscDsKKworICAgIC8qKgorICAgICAqIFRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGNvbnRleHQgc3RydWN0dXJlIHdoZXJlIHRoZSBvcHRpb24KKyAgICAgKiB2YWx1ZSBpcyBzdG9yZWQuIEl0IHNob3VsZCBiZSAwIGZvciBuYW1lZCBjb25zdGFudHMuCisgICAgICovCisgICAgaW50IG9mZnNldDsKKyAgICBlbnVtIEFWT3B0aW9uVHlwZSB0eXBlOworCisgICAgLyoqCisgICAgICogdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHNjYWxhciBvcHRpb25zCisgICAgICovCisgICAgdW5pb24geworICAgICAgICBpbnQ2NF90IGk2NDsKKyAgICAgICAgZG91YmxlIGRibDsKKyAgICAgICAgY29uc3QgY2hhciAqc3RyOworICAgICAgICAvKiBUT0RPIHRob3NlIGFyZSB1bnVzZWQgbm93ICovCisgICAgICAgIEFWUmF0aW9uYWwgcTsKKyAgICB9IGRlZmF1bHRfdmFsOworICAgIGRvdWJsZSBtaW47ICAgICAgICAgICAgICAgICAvLy88IG1pbmltdW0gdmFsaWQgdmFsdWUgZm9yIHRoZSBvcHRpb24KKyAgICBkb3VibGUgbWF4OyAgICAgICAgICAgICAgICAgLy8vPCBtYXhpbXVtIHZhbGlkIHZhbHVlIGZvciB0aGUgb3B0aW9uCisKKyAgICBpbnQgZmxhZ3M7CisjZGVmaW5lIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNICAxICAgLy8vPCBhIGdlbmVyaWMgcGFyYW1ldGVyIHdoaWNoIGNhbiBiZSBzZXQgYnkgdGhlIHVzZXIgZm9yIG11eGluZyBvciBlbmNvZGluZworI2RlZmluZSBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSAgMiAgIC8vLzwgYSBnZW5lcmljIHBhcmFtZXRlciB3aGljaCBjYW4gYmUgc2V0IGJ5IHRoZSB1c2VyIGZvciBkZW11eGluZyBvciBkZWNvZGluZworI2lmIEZGX0FQSV9PUFRfVFlQRV9NRVRBREFUQQorI2RlZmluZSBBVl9PUFRfRkxBR19NRVRBREFUQSAgICAgICAgNCAgIC8vLzwgc29tZSBkYXRhIGV4dHJhY3RlZCBvciBpbnNlcnRlZCBpbnRvIHRoZSBmaWxlIGxpa2UgdGl0bGUsIGNvbW1lbnQsIC4uLgorI2VuZGlmCisjZGVmaW5lIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNICAgICA4CisjZGVmaW5lIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNICAgICAxNgorI2RlZmluZSBBVl9PUFRfRkxBR19TVUJUSVRMRV9QQVJBTSAgMzIKKy8qKgorICogVGhlIG9wdGlvbiBpcyBpbnRlZGVkIGZvciBleHBvcnRpbmcgdmFsdWVzIHRvIHRoZSBjYWxsZXIuCisgKi8KKyNkZWZpbmUgQVZfT1BUX0ZMQUdfRVhQT1JUICAgICAgICAgIDY0CisvKioKKyAqIFRoZSBvcHRpb24gbWF5IG5vdCBiZSBzZXQgdGhyb3VnaCB0aGUgQVZPcHRpb25zIEFQSSwgb25seSByZWFkLgorICogVGhpcyBmbGFnIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBBVl9PUFRfRkxBR19FWFBPUlQgaXMgYWxzbyBzZXQuCisgKi8KKyNkZWZpbmUgQVZfT1BUX0ZMQUdfUkVBRE9OTFkgICAgICAgIDEyOAorI2RlZmluZSBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0gKDE8PDE2KSAvLy88IGEgZ2VuZXJpYyBwYXJhbWV0ZXIgd2hpY2ggY2FuIGJlIHNldCBieSB0aGUgdXNlciBmb3IgZmlsdGVyaW5nCisvL0ZJWE1FIHRoaW5rIGFib3V0IGVuYy1hdWRpbywgLi4uIHN0eWxlIGZsYWdzCisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9naWNhbCB1bml0IHRvIHdoaWNoIHRoZSBvcHRpb24gYmVsb25ncy4gTm9uLWNvbnN0YW50CisgICAgICogb3B0aW9ucyBhbmQgY29ycmVzcG9uZGluZyBuYW1lZCBjb25zdGFudHMgc2hhcmUgdGhlIHNhbWUKKyAgICAgKiB1bml0LiBNYXkgYmUgTlVMTC4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICp1bml0OworfSBBVk9wdGlvbjsKKworLyoqCisgKiBBIHNpbmdsZSBhbGxvd2VkIHJhbmdlIG9mIHZhbHVlcywgb3IgYSBzaW5nbGUgYWxsb3dlZCB2YWx1ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZPcHRpb25SYW5nZSB7CisgICAgY29uc3QgY2hhciAqc3RyOworICAgIC8qKgorICAgICAqIFZhbHVlIHJhbmdlLgorICAgICAqIEZvciBzdHJpbmcgcmFuZ2VzIHRoaXMgcmVwcmVzZW50cyB0aGUgbWluL21heCBsZW5ndGguCisgICAgICogRm9yIGRpbWVuc2lvbnMgdGhpcyByZXByZXNlbnRzIHRoZSBtaW4vbWF4IHBpeGVsIGNvdW50IG9yIHdpZHRoL2hlaWdodCBpbiBtdWx0aS1jb21wb25lbnQgY2FzZS4KKyAgICAgKi8KKyAgICBkb3VibGUgdmFsdWVfbWluLCB2YWx1ZV9tYXg7CisgICAgLyoqCisgICAgICogVmFsdWUncyBjb21wb25lbnQgcmFuZ2UuCisgICAgICogRm9yIHN0cmluZyB0aGlzIHJlcHJlc2VudHMgdGhlIHVuaWNvZGUgcmFuZ2UgZm9yIGNoYXJzLCAwLTEyNyBsaW1pdHMgdG8gQVNDSUkuCisgICAgICovCisgICAgZG91YmxlIGNvbXBvbmVudF9taW4sIGNvbXBvbmVudF9tYXg7CisgICAgLyoqCisgICAgICogUmFuZ2UgZmxhZy4KKyAgICAgKiBJZiBzZXQgdG8gMSB0aGUgc3RydWN0IGVuY29kZXMgYSByYW5nZSwgaWYgc2V0IHRvIDAgYSBzaW5nbGUgdmFsdWUuCisgICAgICovCisgICAgaW50IGlzX3JhbmdlOworfSBBVk9wdGlvblJhbmdlOworCisvKioKKyAqIExpc3Qgb2YgQVZPcHRpb25SYW5nZSBzdHJ1Y3RzLgorICovCit0eXBlZGVmIHN0cnVjdCBBVk9wdGlvblJhbmdlcyB7CisgICAgLyoqCisgICAgICogQXJyYXkgb2Ygb3B0aW9uIHJhbmdlcy4KKyAgICAgKgorICAgICAqIE1vc3Qgb2Ygb3B0aW9uIHR5cGVzIHVzZSBqdXN0IG9uZSBjb21wb25lbnQuCisgICAgICogRm9sbG93aW5nIGRlc2NyaWJlcyBtdWx0aS1jb21wb25lbnQgb3B0aW9uIHR5cGVzOgorICAgICAqCisgICAgICogQVZfT1BUX1RZUEVfSU1BR0VfU0laRToKKyAgICAgKiBjb21wb25lbnQgaW5kZXggMDogcmFuZ2Ugb2YgcGl4ZWwgY291bnQgKHdpZHRoICogaGVpZ2h0KS4KKyAgICAgKiBjb21wb25lbnQgaW5kZXggMTogcmFuZ2Ugb2Ygd2lkdGguCisgICAgICogY29tcG9uZW50IGluZGV4IDI6IHJhbmdlIG9mIGhlaWdodC4KKyAgICAgKgorICAgICAqIEBub3RlIFRvIG9idGFpbiBtdWx0aS1jb21wb25lbnQgdmVyc2lvbiBvZiB0aGlzIHN0cnVjdHVyZSwgdXNlciBtdXN0CisgICAgICogICAgICAgcHJvdmlkZSBBVl9PUFRfTVVMVElfQ09NUE9ORU5UX1JBTkdFIHRvIGF2X29wdF9xdWVyeV9yYW5nZXMgb3IKKyAgICAgKiAgICAgICBhdl9vcHRfcXVlcnlfcmFuZ2VzX2RlZmF1bHQgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBNdWx0aS1jb21wb25lbnQgcmFuZ2UgY2FuIGJlIHJlYWQgYXMgaW4gZm9sbG93aW5nIGV4YW1wbGU6CisgICAgICoKKyAgICAgKiBAY29kZQorICAgICAqIGludCByYW5nZV9pbmRleCwgY29tcG9uZW50X2luZGV4OworICAgICAqIEFWT3B0aW9uUmFuZ2VzICpyYW5nZXM7CisgICAgICogQVZPcHRpb25SYW5nZSAqcmFuZ2VbM107IC8vbWF5IHJlcXVpcmUgbW9yZSB0aGFuIDMgaW4gdGhlIGZ1dHVyZS4KKyAgICAgKiBhdl9vcHRfcXVlcnlfcmFuZ2VzKCZyYW5nZXMsIG9iaiwga2V5LCBBVl9PUFRfTVVMVElfQ09NUE9ORU5UX1JBTkdFKTsKKyAgICAgKiBmb3IgKHJhbmdlX2luZGV4ID0gMDsgcmFuZ2VfaW5kZXggPCByYW5nZXMtPm5iX3JhbmdlczsgcmFuZ2VfaW5kZXgrKykgeworICAgICAqICAgICBmb3IgKGNvbXBvbmVudF9pbmRleCA9IDA7IGNvbXBvbmVudF9pbmRleCA8IHJhbmdlcy0+bmJfY29tcG9uZW50czsgY29tcG9uZW50X2luZGV4KyspCisgICAgICogICAgICAgICByYW5nZVtjb21wb25lbnRfaW5kZXhdID0gcmFuZ2VzLT5yYW5nZVtyYW5nZXMtPm5iX3JhbmdlcyAqIGNvbXBvbmVudF9pbmRleCArIHJhbmdlX2luZGV4XTsKKyAgICAgKiAgICAgLy9kbyBzb21ldGhpbmcgd2l0aCByYW5nZSBoZXJlLgorICAgICAqIH0KKyAgICAgKiBhdl9vcHRfZnJlZXBfcmFuZ2VzKCZyYW5nZXMpOworICAgICAqIEBlbmRjb2RlCisgICAgICovCisgICAgQVZPcHRpb25SYW5nZSAqKnJhbmdlOworICAgIC8qKgorICAgICAqIE51bWJlciBvZiByYW5nZXMgcGVyIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBpbnQgbmJfcmFuZ2VzOworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBjb21wb25lbnRlcy4KKyAgICAgKi8KKyAgICBpbnQgbmJfY29tcG9uZW50czsKK30gQVZPcHRpb25SYW5nZXM7CisKKworI2lmIEZGX0FQSV9PTERfQVZPUFRJT05TCisvKioKKyAqIFNldCB0aGUgZmllbGQgb2Ygb2JqIHdpdGggdGhlIGdpdmVuIG5hbWUgdG8gdmFsdWUuCisgKgorICogQHBhcmFtW2luXSBvYmogQSBzdHJ1Y3Qgd2hvc2UgZmlyc3QgZWxlbWVudCBpcyBhIHBvaW50ZXIgdG8gYW4KKyAqIEFWQ2xhc3MuCisgKiBAcGFyYW1baW5dIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIHNldAorICogQHBhcmFtW2luXSB2YWwgVGhlIHZhbHVlIHRvIHNldC4gSWYgdGhlIGZpZWxkIGlzIG5vdCBvZiBhIHN0cmluZworICogdHlwZSwgdGhlbiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIHBhcnNlZC4KKyAqIFNJIHBvc3RmaXhlcyBhbmQgc29tZSBuYW1lZCBzY2FsYXJzIGFyZSBzdXBwb3J0ZWQuCisgKiBJZiB0aGUgZmllbGQgaXMgb2YgYSBudW1lcmljIHR5cGUsIGl0IGhhcyB0byBiZSBhIG51bWVyaWMgb3IgbmFtZWQKKyAqIHNjYWxhci4gQmVoYXZpb3Igd2l0aCBtb3JlIHRoYW4gb25lIHNjYWxhciBhbmQgKy0gaW5maXggb3BlcmF0b3JzCisgKiBpcyB1bmRlZmluZWQuCisgKiBJZiB0aGUgZmllbGQgaXMgb2YgYSBmbGFncyB0eXBlLCBpdCBoYXMgdG8gYmUgYSBzZXF1ZW5jZSBvZiBudW1lcmljCisgKiBzY2FsYXJzIG9yIG5hbWVkIGZsYWdzIHNlcGFyYXRlZCBieSAnKycgb3IgJy0nLiBQcmVmaXhpbmcgYSBmbGFnCisgKiB3aXRoICcrJyBjYXVzZXMgaXQgdG8gYmUgc2V0IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvdGhlciBmbGFnczsKKyAqIHNpbWlsYXJseSwgJy0nIHVuc2V0cyBhIGZsYWcuCisgKiBAcGFyYW1bb3V0XSBvX291dCBpZiBub24tTlVMTCBwdXQgaGVyZSBhIHBvaW50ZXIgdG8gdGhlIEFWT3B0aW9uCisgKiBmb3VuZAorICogQHBhcmFtIGFsbG9jIHRoaXMgcGFyYW1ldGVyIGlzIGN1cnJlbnRseSBpZ25vcmVkCisgKiBAcmV0dXJuIDAgaWYgdGhlIHZhbHVlIGhhcyBiZWVuIHNldCwgb3IgYW4gQVZFUlJPUiBjb2RlIGluIGNhc2Ugb2YKKyAqIGVycm9yOgorICogQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EIGlmIG5vIG1hdGNoaW5nIG9wdGlvbiBleGlzdHMKKyAqIEFWRVJST1IoRVJBTkdFKSBpZiB0aGUgdmFsdWUgaXMgb3V0IG9mIHJhbmdlCisgKiBBVkVSUk9SKEVJTlZBTCkgaWYgdGhlIHZhbHVlIGlzIG5vdCB2YWxpZAorICogQGRlcHJlY2F0ZWQgdXNlIGF2X29wdF9zZXQoKQorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAoraW50IGF2X3NldF9zdHJpbmczKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsLCBpbnQgYWxsb2MsIGNvbnN0IEFWT3B0aW9uICoqb19vdXQpOworCithdHRyaWJ1dGVfZGVwcmVjYXRlZCBjb25zdCBBVk9wdGlvbiAqYXZfc2V0X2RvdWJsZSh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGRvdWJsZSBuKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkIGNvbnN0IEFWT3B0aW9uICphdl9zZXRfcSh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEFWUmF0aW9uYWwgbik7CithdHRyaWJ1dGVfZGVwcmVjYXRlZCBjb25zdCBBVk9wdGlvbiAqYXZfc2V0X2ludCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3Qgbik7CisKK2RvdWJsZSBhdl9nZXRfZG91YmxlKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgQVZPcHRpb24gKipvX291dCk7CitBVlJhdGlvbmFsIGF2X2dldF9xKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgQVZPcHRpb24gKipvX291dCk7CitpbnQ2NF90IGF2X2dldF9pbnQodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBVk9wdGlvbiAqKm9fb3V0KTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkIGNvbnN0IGNoYXIgKmF2X2dldF9zdHJpbmcodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBVk9wdGlvbiAqKm9fb3V0LCBjaGFyICpidWYsIGludCBidWZfbGVuKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkIGNvbnN0IEFWT3B0aW9uICphdl9uZXh0X29wdGlvbihGRl9DT05TVF9BVlVUSUw1NSB2b2lkICpvYmosIGNvbnN0IEFWT3B0aW9uICpsYXN0KTsKKyNlbmRpZgorCisvKioKKyAqIFNob3cgdGhlIG9iaiBvcHRpb25zLgorICoKKyAqIEBwYXJhbSByZXFfZmxhZ3MgcmVxdWVzdGVkIGZsYWdzIGZvciB0aGUgb3B0aW9ucyB0byBzaG93LiBTaG93IG9ubHkgdGhlCisgKiBvcHRpb25zIGZvciB3aGljaCBpdCBpcyBvcHQtPmZsYWdzICYgcmVxX2ZsYWdzLgorICogQHBhcmFtIHJlal9mbGFncyByZWplY3RlZCBmbGFncyBmb3IgdGhlIG9wdGlvbnMgdG8gc2hvdy4gU2hvdyBvbmx5IHRoZQorICogb3B0aW9ucyBmb3Igd2hpY2ggaXQgaXMgIShvcHQtPmZsYWdzICYgcmVxX2ZsYWdzKS4KKyAqIEBwYXJhbSBhdl9sb2dfb2JqIGxvZyBjb250ZXh0IHRvIHVzZSBmb3Igc2hvd2luZyB0aGUgb3B0aW9ucworICovCitpbnQgYXZfb3B0X3Nob3cyKHZvaWQgKm9iaiwgdm9pZCAqYXZfbG9nX29iaiwgaW50IHJlcV9mbGFncywgaW50IHJlal9mbGFncyk7CisKKy8qKgorICogU2V0IHRoZSB2YWx1ZXMgb2YgYWxsIEFWT3B0aW9uIGZpZWxkcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gcyBhbiBBVk9wdGlvbi1lbmFibGVkIHN0cnVjdCAoaXRzIGZpcnN0IG1lbWJlciBtdXN0IGJlIGEgcG9pbnRlciB0byBBVkNsYXNzKQorICovCit2b2lkIGF2X29wdF9zZXRfZGVmYXVsdHModm9pZCAqcyk7CisKKyNpZiBGRl9BUElfT0xEX0FWT1BUSU9OUworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK3ZvaWQgYXZfb3B0X3NldF9kZWZhdWx0czIodm9pZCAqcywgaW50IG1hc2ssIGludCBmbGFncyk7CisjZW5kaWYKKworLyoqCisgKiBQYXJzZSB0aGUga2V5L3ZhbHVlIHBhaXJzIGxpc3QgaW4gb3B0cy4gRm9yIGVhY2gga2V5L3ZhbHVlIHBhaXIKKyAqIGZvdW5kLCBzdG9yZXMgdGhlIHZhbHVlIGluIHRoZSBmaWVsZCBpbiBjdHggdGhhdCBpcyBuYW1lZCBsaWtlIHRoZQorICoga2V5LiBjdHggbXVzdCBiZSBhbiBBVkNsYXNzIGNvbnRleHQsIHN0b3JpbmcgaXMgZG9uZSB1c2luZworICogQVZPcHRpb25zLgorICoKKyAqIEBwYXJhbSBvcHRzIG9wdGlvbnMgc3RyaW5nIHRvIHBhcnNlLCBtYXkgYmUgTlVMTAorICogQHBhcmFtIGtleV92YWxfc2VwIGEgMC10ZXJtaW5hdGVkIGxpc3Qgb2YgY2hhcmFjdGVycyB1c2VkIHRvCisgKiBzZXBhcmF0ZSBrZXkgZnJvbSB2YWx1ZQorICogQHBhcmFtIHBhaXJzX3NlcCBhIDAtdGVybWluYXRlZCBsaXN0IG9mIGNoYXJhY3RlcnMgdXNlZCB0byBzZXBhcmF0ZQorICogdHdvIHBhaXJzIGZyb20gZWFjaCBvdGhlcgorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBzZXQga2V5L3ZhbHVlIHBhaXJzLCBvciBhIG5lZ2F0aXZlCisgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIEFWRVJST1IgY29kZSBpbiBjYXNlIG9mIGVycm9yOgorICogQVZFUlJPUihFSU5WQUwpIGlmIG9wdHMgY2Fubm90IGJlIHBhcnNlZCwKKyAqIHRoZSBlcnJvciBjb2RlIGlzc3VlZCBieSBhdl9vcHRfc2V0KCkgaWYgYSBrZXkvdmFsdWUgcGFpcgorICogY2Fubm90IGJlIHNldAorICovCitpbnQgYXZfc2V0X29wdGlvbnNfc3RyaW5nKHZvaWQgKmN0eCwgY29uc3QgY2hhciAqb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5X3ZhbF9zZXAsIGNvbnN0IGNoYXIgKnBhaXJzX3NlcCk7CisKKy8qKgorICogUGFyc2UgdGhlIGtleS12YWx1ZSBwYWlycyBsaXN0IGluIG9wdHMuIEZvciBlYWNoIGtleT12YWx1ZSBwYWlyIGZvdW5kLAorICogc2V0IHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBvcHRpb24gaW4gY3R4LgorICoKKyAqIEBwYXJhbSBjdHggICAgICAgICAgdGhlIEFWQ2xhc3Mgb2JqZWN0IHRvIHNldCBvcHRpb25zIG9uCisgKiBAcGFyYW0gb3B0cyAgICAgICAgIHRoZSBvcHRpb25zIHN0cmluZywga2V5LXZhbHVlIHBhaXJzIHNlcGFyYXRlZCBieSBhCisgKiAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcgorICogQHBhcmFtIHNob3J0aGFuZCAgICBhIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZiBvcHRpb25zIG5hbWVzIGZvciBzaG9ydGhhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgbm90YXRpb246IGlmIHRoZSBmaXJzdCBmaWVsZCBpbiBvcHRzIGhhcyBubyBrZXkgcGFydCwKKyAqICAgICAgICAgICAgICAgICAgICAgdGhlIGtleSBpcyB0YWtlbiBmcm9tIHRoZSBmaXJzdCBlbGVtZW50IG9mIHNob3J0aGFuZDsKKyAqICAgICAgICAgICAgICAgICAgICAgdGhlbiBhZ2FpbiBmb3IgdGhlIHNlY29uZCwgZXRjLiwgdW50aWwgZWl0aGVyIG9wdHMgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQsIHNob3J0aGFuZCBpcyBmaW5pc2hlZCBvciBhIG5hbWVkIG9wdGlvbiBpcworICogICAgICAgICAgICAgICAgICAgICBmb3VuZDsgYWZ0ZXIgdGhhdCwgYWxsIG9wdGlvbnMgbXVzdCBiZSBuYW1lZAorICogQHBhcmFtIGtleV92YWxfc2VwICBhIDAtdGVybWluYXRlZCBsaXN0IG9mIGNoYXJhY3RlcnMgdXNlZCB0byBzZXBhcmF0ZQorICogICAgICAgICAgICAgICAgICAgICBrZXkgZnJvbSB2YWx1ZSwgZm9yIGV4YW1wbGUgJz0nCisgKiBAcGFyYW0gcGFpcnNfc2VwICAgIGEgMC10ZXJtaW5hdGVkIGxpc3Qgb2YgY2hhcmFjdGVycyB1c2VkIHRvIHNlcGFyYXRlCisgKiAgICAgICAgICAgICAgICAgICAgIHR3byBwYWlycyBmcm9tIGVhY2ggb3RoZXIsIGZvciBleGFtcGxlICc6JyBvciAnLCcKKyAqIEByZXR1cm4gIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IHNldCBrZXk9dmFsdWUgcGFpcnMsIG9yIGEgbmVnYXRpdmUKKyAqICAgICAgICAgIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4gQVZFUlJPUiBjb2RlIGluIGNhc2Ugb2YgZXJyb3I6CisgKiAgICAgICAgICBBVkVSUk9SKEVJTlZBTCkgaWYgb3B0cyBjYW5ub3QgYmUgcGFyc2VkLAorICogICAgICAgICAgdGhlIGVycm9yIGNvZGUgaXNzdWVkIGJ5IGF2X3NldF9zdHJpbmczKCkgaWYgYSBrZXkvdmFsdWUgcGFpcgorICogICAgICAgICAgY2Fubm90IGJlIHNldAorICoKKyAqIE9wdGlvbnMgbmFtZXMgbXVzdCB1c2Ugb25seSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6IGEteiBBLVogMC05IC0gLiAvIF8KKyAqIFNlcGFyYXRvcnMgbXVzdCB1c2UgY2hhcmFjdGVycyBkaXN0aW5jdCBmcm9tIG9wdGlvbiBuYW1lcyBhbmQgZnJvbSBlYWNoCisgKiBvdGhlci4KKyAqLworaW50IGF2X29wdF9zZXRfZnJvbV9zdHJpbmcodm9pZCAqY3R4LCBjb25zdCBjaGFyICpvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgKnNob3J0aGFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleV92YWxfc2VwLCBjb25zdCBjaGFyICpwYWlyc19zZXApOworLyoqCisgKiBGcmVlIGFsbCBhbGxvY2F0ZWQgb2JqZWN0cyBpbiBvYmouCisgKi8KK3ZvaWQgYXZfb3B0X2ZyZWUodm9pZCAqb2JqKTsKKworLyoqCisgKiBDaGVjayB3aGV0aGVyIGEgcGFydGljdWxhciBmbGFnIGlzIHNldCBpbiBhIGZsYWdzIGZpZWxkLgorICoKKyAqIEBwYXJhbSBmaWVsZF9uYW1lIHRoZSBuYW1lIG9mIHRoZSBmbGFnIGZpZWxkIG9wdGlvbgorICogQHBhcmFtIGZsYWdfbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmxhZyB0byBjaGVjaworICogQHJldHVybiBub24temVybyBpZiB0aGUgZmxhZyBpcyBzZXQsIHplcm8gaWYgdGhlIGZsYWcgaXNuJ3Qgc2V0LAorICogICAgICAgICBpc24ndCBvZiB0aGUgcmlnaHQgdHlwZSwgb3IgdGhlIGZsYWdzIGZpZWxkIGRvZXNuJ3QgZXhpc3QuCisgKi8KK2ludCBhdl9vcHRfZmxhZ19pc19zZXQodm9pZCAqb2JqLCBjb25zdCBjaGFyICpmaWVsZF9uYW1lLCBjb25zdCBjaGFyICpmbGFnX25hbWUpOworCisvKioKKyAqIFNldCBhbGwgdGhlIG9wdGlvbnMgZnJvbSBhIGdpdmVuIGRpY3Rpb25hcnkgb24gYW4gb2JqZWN0LgorICoKKyAqIEBwYXJhbSBvYmogYSBzdHJ1Y3Qgd2hvc2UgZmlyc3QgZWxlbWVudCBpcyBhIHBvaW50ZXIgdG8gQVZDbGFzcworICogQHBhcmFtIG9wdGlvbnMgb3B0aW9ucyB0byBwcm9jZXNzLiBUaGlzIGRpY3Rpb25hcnkgd2lsbCBiZSBmcmVlZCBhbmQgcmVwbGFjZWQKKyAqICAgICAgICAgICAgICAgIGJ5IGEgbmV3IG9uZSBjb250YWluaW5nIGFsbCBvcHRpb25zIG5vdCBmb3VuZCBpbiBvYmouCisgKiAgICAgICAgICAgICAgICBPZiBjb3Vyc2UgdGhpcyBuZXcgZGljdGlvbmFyeSBuZWVkcyB0byBiZSBmcmVlZCBieSBjYWxsZXIKKyAqICAgICAgICAgICAgICAgIHdpdGggYXZfZGljdF9mcmVlKCkuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBpZiBzb21lIG9wdGlvbiB3YXMgZm91bmQgaW4gb2JqLAorICogICAgICAgICBidXQgY291bGQgbm90IGJlIHNldC4KKyAqCisgKiBAc2VlIGF2X2RpY3RfY29weSgpCisgKi8KK2ludCBhdl9vcHRfc2V0X2RpY3Qodm9pZCAqb2JqLCBzdHJ1Y3QgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucyk7CisKKworLyoqCisgKiBTZXQgYWxsIHRoZSBvcHRpb25zIGZyb20gYSBnaXZlbiBkaWN0aW9uYXJ5IG9uIGFuIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gb2JqIGEgc3RydWN0IHdob3NlIGZpcnN0IGVsZW1lbnQgaXMgYSBwb2ludGVyIHRvIEFWQ2xhc3MKKyAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbnMgdG8gcHJvY2Vzcy4gVGhpcyBkaWN0aW9uYXJ5IHdpbGwgYmUgZnJlZWQgYW5kIHJlcGxhY2VkCisgKiAgICAgICAgICAgICAgICBieSBhIG5ldyBvbmUgY29udGFpbmluZyBhbGwgb3B0aW9ucyBub3QgZm91bmQgaW4gb2JqLgorICogICAgICAgICAgICAgICAgT2YgY291cnNlIHRoaXMgbmV3IGRpY3Rpb25hcnkgbmVlZHMgdG8gYmUgZnJlZWQgYnkgY2FsbGVyCisgKiAgICAgICAgICAgICAgICB3aXRoIGF2X2RpY3RfZnJlZSgpLgorICogQHBhcmFtIHNlYXJjaF9mbGFncyBBIGNvbWJpbmF0aW9uIG9mIEFWX09QVF9TRUFSQ0hfKi4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGlmIHNvbWUgb3B0aW9uIHdhcyBmb3VuZCBpbiBvYmosCisgKiAgICAgICAgIGJ1dCBjb3VsZCBub3QgYmUgc2V0LgorICoKKyAqIEBzZWUgYXZfZGljdF9jb3B5KCkKKyAqLworaW50IGF2X29wdF9zZXRfZGljdDIodm9pZCAqb2JqLCBzdHJ1Y3QgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucywgaW50IHNlYXJjaF9mbGFncyk7CisKKy8qKgorICogRXh0cmFjdCBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gcm9wdHMgICAgICAgIHBvaW50ZXIgdG8gdGhlIG9wdGlvbnMgc3RyaW5nLCB3aWxsIGJlIHVwZGF0ZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgcG9pbnQgdG8gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAob25lIG9mIHRoZSBwYWlyc19zZXAKKyAqICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIGZpbmFsIE5VTCkKKyAqIEBwYXJhbSBrZXlfdmFsX3NlcCAgYSAwLXRlcm1pbmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXJzIHVzZWQgdG8gc2VwYXJhdGUKKyAqICAgICAgICAgICAgICAgICAgICAga2V5IGZyb20gdmFsdWUsIGZvciBleGFtcGxlICc9JworICogQHBhcmFtIHBhaXJzX3NlcCAgICBhIDAtdGVybWluYXRlZCBsaXN0IG9mIGNoYXJhY3RlcnMgdXNlZCB0byBzZXBhcmF0ZQorICogICAgICAgICAgICAgICAgICAgICB0d28gcGFpcnMgZnJvbSBlYWNoIG90aGVyLCBmb3IgZXhhbXBsZSAnOicgb3IgJywnCisgKiBAcGFyYW0gZmxhZ3MgICAgICAgIGZsYWdzOyBzZWUgdGhlIEFWX09QVF9GTEFHXyogdmFsdWVzIGJlbG93CisgKiBAcGFyYW0gcmtleSAgICAgICAgIHBhcnNlZCBrZXk7IG11c3QgYmUgZnJlZWQgdXNpbmcgYXZfZnJlZSgpCisgKiBAcGFyYW0gcnZhbCAgICAgICAgIHBhcnNlZCB2YWx1ZTsgbXVzdCBiZSBmcmVlZCB1c2luZyBhdl9mcmVlKCkKKyAqCisgKiBAcmV0dXJuICA+PTAgZm9yIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbgorICogICAgICAgICAgQVZFUlJPUiBjb2RlIGluIGNhc2Ugb2YgZXJyb3I7IGluIHBhcnRpY3VsYXI6CisgKiAgICAgICAgICBBVkVSUk9SKEVJTlZBTCkgaWYgbm8ga2V5IGlzIHByZXNlbnQKKyAqCisgKi8KK2ludCBhdl9vcHRfZ2V0X2tleV92YWx1ZShjb25zdCBjaGFyICoqcm9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5X3ZhbF9zZXAsIGNvbnN0IGNoYXIgKnBhaXJzX3NlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqcmtleSwgY2hhciAqKnJ2YWwpOworCitlbnVtIHsKKworICAgIC8qKgorICAgICAqIEFjY2VwdCB0byBwYXJzZSBhIHZhbHVlIHdpdGhvdXQgYSBrZXk7IHRoZSBrZXkgd2lsbCB0aGVuIGJlIHJldHVybmVkCisgICAgICogYXMgTlVMTC4KKyAgICAgKi8KKyAgICBBVl9PUFRfRkxBR19JTVBMSUNJVF9LRVkgPSAxLAorfTsKKworLyoqCisgKiBAZGVmZ3JvdXAgb3B0X2V2YWxfZnVuY3MgRXZhbHVhdGluZyBvcHRpb24gc3RyaW5ncworICogQHsKKyAqIFRoaXMgZ3JvdXAgb2YgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIHRvIGV2YWx1YXRlIG9wdGlvbiBzdHJpbmdzCisgKiBhbmQgZ2V0IG51bWJlcnMgb3V0IG9mIHRoZW0uIFRoZXkgZG8gdGhlIHNhbWUgdGhpbmcgYXMgYXZfb3B0X3NldCgpLAorICogZXhjZXB0IHRoZSByZXN1bHQgaXMgd3JpdHRlbiBpbnRvIHRoZSBjYWxsZXItc3VwcGxpZWQgcG9pbnRlci4KKyAqCisgKiBAcGFyYW0gb2JqIGEgc3RydWN0IHdob3NlIGZpcnN0IGVsZW1lbnQgaXMgYSBwb2ludGVyIHRvIEFWQ2xhc3MuCisgKiBAcGFyYW0gbyBhbiBvcHRpb24gZm9yIHdoaWNoIHRoZSBzdHJpbmcgaXMgdG8gYmUgZXZhbHVhdGVkLgorICogQHBhcmFtIHZhbCBzdHJpbmcgdG8gYmUgZXZhbHVhdGVkLgorICogQHBhcmFtICpfb3V0IHZhbHVlIG9mIHRoZSBzdHJpbmcgd2lsbCBiZSB3cml0dGVuIGhlcmUuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2ludCBhdl9vcHRfZXZhbF9mbGFncyAodm9pZCAqb2JqLCBjb25zdCBBVk9wdGlvbiAqbywgY29uc3QgY2hhciAqdmFsLCBpbnQgICAgICAgICpmbGFnc19vdXQpOworaW50IGF2X29wdF9ldmFsX2ludCAgICh2b2lkICpvYmosIGNvbnN0IEFWT3B0aW9uICpvLCBjb25zdCBjaGFyICp2YWwsIGludCAgICAgICAgKmludF9vdXQpOworaW50IGF2X29wdF9ldmFsX2ludDY0ICh2b2lkICpvYmosIGNvbnN0IEFWT3B0aW9uICpvLCBjb25zdCBjaGFyICp2YWwsIGludDY0X3QgICAgKmludDY0X291dCk7CitpbnQgYXZfb3B0X2V2YWxfZmxvYXQgKHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKm8sIGNvbnN0IGNoYXIgKnZhbCwgZmxvYXQgICAgICAqZmxvYXRfb3V0KTsKK2ludCBhdl9vcHRfZXZhbF9kb3VibGUodm9pZCAqb2JqLCBjb25zdCBBVk9wdGlvbiAqbywgY29uc3QgY2hhciAqdmFsLCBkb3VibGUgICAgICpkb3VibGVfb3V0KTsKK2ludCBhdl9vcHRfZXZhbF9xICAgICAodm9pZCAqb2JqLCBjb25zdCBBVk9wdGlvbiAqbywgY29uc3QgY2hhciAqdmFsLCBBVlJhdGlvbmFsICpxX291dCk7CisvKioKKyAqIEB9CisgKi8KKworI2RlZmluZSBBVl9PUFRfU0VBUkNIX0NISUxEUkVOICAgMHgwMDAxIC8qKjwgU2VhcmNoIGluIHBvc3NpYmxlIGNoaWxkcmVuIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gb2JqZWN0IGZpcnN0LiAqLworLyoqCisgKiAgVGhlIG9iaiBwYXNzZWQgdG8gYXZfb3B0X2ZpbmQoKSBpcyBmYWtlIC0tIG9ubHkgYSBkb3VibGUgcG9pbnRlciB0byBBVkNsYXNzCisgKiAgaW5zdGVhZCBvZiBhIHJlcXVpcmVkIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgY29udGFpbmluZyBBVkNsYXNzLiBUaGlzIGlzCisgKiAgdXNlZnVsIGZvciBzZWFyY2hpbmcgZm9yIG9wdGlvbnMgd2l0aG91dCBuZWVkaW5nIHRvIGFsbG9jYXRlIHRoZSBjb3JyZXNwb25kaW5nCisgKiAgb2JqZWN0LgorICovCisjZGVmaW5lIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkogICAweDAwMDIKKworLyoqCisgKiAgQWxsb3dzIGF2X29wdF9xdWVyeV9yYW5nZXMgYW5kIGF2X29wdF9xdWVyeV9yYW5nZXNfZGVmYXVsdCB0byByZXR1cm4gbW9yZSB0aGFuCisgKiAgb25lIGNvbXBvbmVudCBmb3IgY2VydGFpbiBvcHRpb24gdHlwZXMuCisgKiAgQHNlZSBBVk9wdGlvblJhbmdlcyBmb3IgZGV0YWlscy4KKyAqLworI2RlZmluZSBBVl9PUFRfTVVMVElfQ09NUE9ORU5UX1JBTkdFIDB4MTAwMAorCisvKioKKyAqIExvb2sgZm9yIGFuIG9wdGlvbiBpbiBhbiBvYmplY3QuIENvbnNpZGVyIG9ubHkgb3B0aW9ucyB3aGljaAorICogaGF2ZSBhbGwgdGhlIHNwZWNpZmllZCBmbGFncyBzZXQuCisgKgorICogQHBhcmFtW2luXSBvYmogQSBwb2ludGVyIHRvIGEgc3RydWN0IHdob3NlIGZpcnN0IGVsZW1lbnQgaXMgYQorICogICAgICAgICAgICAgICAgcG9pbnRlciB0byBhbiBBVkNsYXNzLgorICogICAgICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSBhIGRvdWJsZSBwb2ludGVyIHRvIGFuIEFWQ2xhc3MsIGlmCisgKiAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKIHNlYXJjaCBmbGFnIGlzIHNldC4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uIHRvIGxvb2sgZm9yLgorICogQHBhcmFtW2luXSB1bml0IFdoZW4gc2VhcmNoaW5nIGZvciBuYW1lZCBjb25zdGFudHMsIG5hbWUgb2YgdGhlIHVuaXQKKyAqICAgICAgICAgICAgICAgICBpdCBiZWxvbmdzIHRvLgorICogQHBhcmFtIG9wdF9mbGFncyBGaW5kIG9ubHkgb3B0aW9ucyB3aXRoIGFsbCB0aGUgc3BlY2lmaWVkIGZsYWdzIHNldCAoQVZfT1BUX0ZMQUcpLgorICogQHBhcmFtIHNlYXJjaF9mbGFncyBBIGNvbWJpbmF0aW9uIG9mIEFWX09QVF9TRUFSQ0hfKi4KKyAqCisgKiBAcmV0dXJuIEEgcG9pbnRlciB0byB0aGUgb3B0aW9uIGZvdW5kLCBvciBOVUxMIGlmIG5vIG9wdGlvbgorICogICAgICAgICB3YXMgZm91bmQuCisgKgorICogQG5vdGUgT3B0aW9ucyBmb3VuZCB3aXRoIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4gZmxhZyBtYXkgbm90IGJlIHNldHRhYmxlCisgKiBkaXJlY3RseSB3aXRoIGF2X29wdF9zZXQoKS4gVXNlIHNwZWNpYWwgY2FsbHMgd2hpY2ggdGFrZSBhbiBvcHRpb25zCisgKiBBVkRpY3Rpb25hcnkgKGUuZy4gYXZmb3JtYXRfb3Blbl9pbnB1dCgpKSB0byBzZXQgb3B0aW9ucyBmb3VuZCB3aXRoIHRoaXMKKyAqIGZsYWcuCisgKi8KK2NvbnN0IEFWT3B0aW9uICphdl9vcHRfZmluZCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wdF9mbGFncywgaW50IHNlYXJjaF9mbGFncyk7CisKKy8qKgorICogTG9vayBmb3IgYW4gb3B0aW9uIGluIGFuIG9iamVjdC4gQ29uc2lkZXIgb25seSBvcHRpb25zIHdoaWNoCisgKiBoYXZlIGFsbCB0aGUgc3BlY2lmaWVkIGZsYWdzIHNldC4KKyAqCisgKiBAcGFyYW1baW5dIG9iaiBBIHBvaW50ZXIgdG8gYSBzdHJ1Y3Qgd2hvc2UgZmlyc3QgZWxlbWVudCBpcyBhCisgKiAgICAgICAgICAgICAgICBwb2ludGVyIHRvIGFuIEFWQ2xhc3MuCisgKiAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZWx5IGEgZG91YmxlIHBvaW50ZXIgdG8gYW4gQVZDbGFzcywgaWYKKyAqICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkogc2VhcmNoIGZsYWcgaXMgc2V0LgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBvcHRpb24gdG8gbG9vayBmb3IuCisgKiBAcGFyYW1baW5dIHVuaXQgV2hlbiBzZWFyY2hpbmcgZm9yIG5hbWVkIGNvbnN0YW50cywgbmFtZSBvZiB0aGUgdW5pdAorICogICAgICAgICAgICAgICAgIGl0IGJlbG9uZ3MgdG8uCisgKiBAcGFyYW0gb3B0X2ZsYWdzIEZpbmQgb25seSBvcHRpb25zIHdpdGggYWxsIHRoZSBzcGVjaWZpZWQgZmxhZ3Mgc2V0IChBVl9PUFRfRkxBRykuCisgKiBAcGFyYW0gc2VhcmNoX2ZsYWdzIEEgY29tYmluYXRpb24gb2YgQVZfT1BUX1NFQVJDSF8qLgorICogQHBhcmFtW291dF0gdGFyZ2V0X29iaiBpZiBub24tTlVMTCwgYW4gb2JqZWN0IHRvIHdoaWNoIHRoZSBvcHRpb24gYmVsb25ncyB3aWxsIGJlCisgKiB3cml0dGVuIGhlcmUuIEl0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSBvYmogaWYgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiBpcyBwcmVzZW50CisgKiBpbiBzZWFyY2hfZmxhZ3MuIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgaWYgc2VhcmNoX2ZsYWdzIGNvbnRhaW4KKyAqIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkouCisgKgorICogQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIG9wdGlvbiBmb3VuZCwgb3IgTlVMTCBpZiBubyBvcHRpb24KKyAqICAgICAgICAgd2FzIGZvdW5kLgorICovCitjb25zdCBBVk9wdGlvbiAqYXZfb3B0X2ZpbmQyKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wdF9mbGFncywgaW50IHNlYXJjaF9mbGFncywgdm9pZCAqKnRhcmdldF9vYmopOworCisvKioKKyAqIEl0ZXJhdGUgb3ZlciBhbGwgQVZPcHRpb25zIGJlbG9uZ2luZyB0byBvYmouCisgKgorICogQHBhcmFtIG9iaiBhbiBBVk9wdGlvbnMtZW5hYmxlZCBzdHJ1Y3Qgb3IgYSBkb3VibGUgcG9pbnRlciB0byBhbgorICogICAgICAgICAgICBBVkNsYXNzIGRlc2NyaWJpbmcgaXQuCisgKiBAcGFyYW0gcHJldiByZXN1bHQgb2YgdGhlIHByZXZpb3VzIGNhbGwgdG8gYXZfb3B0X25leHQoKSBvbiB0aGlzIG9iamVjdAorICogICAgICAgICAgICAgb3IgTlVMTAorICogQHJldHVybiBuZXh0IEFWT3B0aW9uIG9yIE5VTEwKKyAqLworY29uc3QgQVZPcHRpb24gKmF2X29wdF9uZXh0KEZGX0NPTlNUX0FWVVRJTDU1IHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKnByZXYpOworCisvKioKKyAqIEl0ZXJhdGUgb3ZlciBBVk9wdGlvbnMtZW5hYmxlZCBjaGlsZHJlbiBvZiBvYmouCisgKgorICogQHBhcmFtIHByZXYgcmVzdWx0IG9mIGEgcHJldmlvdXMgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIG9yIE5VTEwKKyAqIEByZXR1cm4gbmV4dCBBVk9wdGlvbnMtZW5hYmxlZCBjaGlsZCBvciBOVUxMCisgKi8KK3ZvaWQgKmF2X29wdF9jaGlsZF9uZXh0KHZvaWQgKm9iaiwgdm9pZCAqcHJldik7CisKKy8qKgorICogSXRlcmF0ZSBvdmVyIHBvdGVudGlhbCBBVk9wdGlvbnMtZW5hYmxlZCBjaGlsZHJlbiBvZiBwYXJlbnQuCisgKgorICogQHBhcmFtIHByZXYgcmVzdWx0IG9mIGEgcHJldmlvdXMgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIG9yIE5VTEwKKyAqIEByZXR1cm4gQVZDbGFzcyBjb3JyZXNwb25kaW5nIHRvIG5leHQgcG90ZW50aWFsIGNoaWxkIG9yIE5VTEwKKyAqLworY29uc3QgQVZDbGFzcyAqYXZfb3B0X2NoaWxkX2NsYXNzX25leHQoY29uc3QgQVZDbGFzcyAqcGFyZW50LCBjb25zdCBBVkNsYXNzICpwcmV2KTsKKworLyoqCisgKiBAZGVmZ3JvdXAgb3B0X3NldF9mdW5jcyBPcHRpb24gc2V0dGluZyBmdW5jdGlvbnMKKyAqIEB7CisgKiBUaG9zZSBmdW5jdGlvbnMgc2V0IHRoZSBmaWVsZCBvZiBvYmogd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0byB2YWx1ZS4KKyAqCisgKiBAcGFyYW1baW5dIG9iaiBBIHN0cnVjdCB3aG9zZSBmaXJzdCBlbGVtZW50IGlzIGEgcG9pbnRlciB0byBhbiBBVkNsYXNzLgorICogQHBhcmFtW2luXSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBzZXQKKyAqIEBwYXJhbVtpbl0gdmFsIFRoZSB2YWx1ZSB0byBzZXQuIEluIGNhc2Ugb2YgYXZfb3B0X3NldCgpIGlmIHRoZSBmaWVsZCBpcyBub3QKKyAqIG9mIGEgc3RyaW5nIHR5cGUsIHRoZW4gdGhlIGdpdmVuIHN0cmluZyBpcyBwYXJzZWQuCisgKiBTSSBwb3N0Zml4ZXMgYW5kIHNvbWUgbmFtZWQgc2NhbGFycyBhcmUgc3VwcG9ydGVkLgorICogSWYgdGhlIGZpZWxkIGlzIG9mIGEgbnVtZXJpYyB0eXBlLCBpdCBoYXMgdG8gYmUgYSBudW1lcmljIG9yIG5hbWVkCisgKiBzY2FsYXIuIEJlaGF2aW9yIHdpdGggbW9yZSB0aGFuIG9uZSBzY2FsYXIgYW5kICstIGluZml4IG9wZXJhdG9ycworICogaXMgdW5kZWZpbmVkLgorICogSWYgdGhlIGZpZWxkIGlzIG9mIGEgZmxhZ3MgdHlwZSwgaXQgaGFzIHRvIGJlIGEgc2VxdWVuY2Ugb2YgbnVtZXJpYworICogc2NhbGFycyBvciBuYW1lZCBmbGFncyBzZXBhcmF0ZWQgYnkgJysnIG9yICctJy4gUHJlZml4aW5nIGEgZmxhZworICogd2l0aCAnKycgY2F1c2VzIGl0IHRvIGJlIHNldCB3aXRob3V0IGFmZmVjdGluZyB0aGUgb3RoZXIgZmxhZ3M7CisgKiBzaW1pbGFybHksICctJyB1bnNldHMgYSBmbGFnLgorICogQHBhcmFtIHNlYXJjaF9mbGFncyBmbGFncyBwYXNzZWQgdG8gYXZfb3B0X2ZpbmQyLiBJLmUuIGlmIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4KKyAqIGlzIHBhc3NlZCBoZXJlLCB0aGVuIHRoZSBvcHRpb24gbWF5IGJlIHNldCBvbiBhIGNoaWxkIG9mIG9iai4KKyAqCisgKiBAcmV0dXJuIDAgaWYgdGhlIHZhbHVlIGhhcyBiZWVuIHNldCwgb3IgYW4gQVZFUlJPUiBjb2RlIGluIGNhc2Ugb2YKKyAqIGVycm9yOgorICogQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EIGlmIG5vIG1hdGNoaW5nIG9wdGlvbiBleGlzdHMKKyAqIEFWRVJST1IoRVJBTkdFKSBpZiB0aGUgdmFsdWUgaXMgb3V0IG9mIHJhbmdlCisgKiBBVkVSUk9SKEVJTlZBTCkgaWYgdGhlIHZhbHVlIGlzIG5vdCB2YWxpZAorICovCitpbnQgYXZfb3B0X3NldCAgICAgICAgICh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCwgaW50IHNlYXJjaF9mbGFncyk7CitpbnQgYXZfb3B0X3NldF9pbnQgICAgICh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgICAgIHZhbCwgaW50IHNlYXJjaF9mbGFncyk7CitpbnQgYXZfb3B0X3NldF9kb3VibGUgICh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGRvdWJsZSAgICAgIHZhbCwgaW50IHNlYXJjaF9mbGFncyk7CitpbnQgYXZfb3B0X3NldF9xICAgICAgICh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEFWUmF0aW9uYWwgIHZhbCwgaW50IHNlYXJjaF9mbGFncyk7CitpbnQgYXZfb3B0X3NldF9iaW4gICAgICh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHVpbnQ4X3QgKnZhbCwgaW50IHNpemUsIGludCBzZWFyY2hfZmxhZ3MpOworaW50IGF2X29wdF9zZXRfaW1hZ2Vfc2l6ZSh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCB3LCBpbnQgaCwgaW50IHNlYXJjaF9mbGFncyk7CitpbnQgYXZfb3B0X3NldF9waXhlbF9mbXQgKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgZW51bSBBVlBpeGVsRm9ybWF0IGZtdCwgaW50IHNlYXJjaF9mbGFncyk7CitpbnQgYXZfb3B0X3NldF9zYW1wbGVfZm10KHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgZW51bSBBVlNhbXBsZUZvcm1hdCBmbXQsIGludCBzZWFyY2hfZmxhZ3MpOworaW50IGF2X29wdF9zZXRfdmlkZW9fcmF0ZSh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEFWUmF0aW9uYWwgdmFsLCBpbnQgc2VhcmNoX2ZsYWdzKTsKK2ludCBhdl9vcHRfc2V0X2NoYW5uZWxfbGF5b3V0KHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50NjRfdCBjaF9sYXlvdXQsIGludCBzZWFyY2hfZmxhZ3MpOworLyoqCisgKiBAbm90ZSBBbnkgb2xkIGRpY3Rpb25hcnkgcHJlc2VudCBpcyBkaXNjYXJkZWQgYW5kIHJlcGxhY2VkIHdpdGggYSBjb3B5IG9mIHRoZSBuZXcgb25lLiBUaGUKKyAqIGNhbGxlciBzdGlsbCBvd25zIHZhbCBpcyBhbmQgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgaXQuCisgKi8KK2ludCBhdl9vcHRfc2V0X2RpY3RfdmFsKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgQVZEaWN0aW9uYXJ5ICp2YWwsIGludCBzZWFyY2hfZmxhZ3MpOworCisvKioKKyAqIFNldCBhIGJpbmFyeSBvcHRpb24gdG8gYW4gaW50ZWdlciBsaXN0LgorICoKKyAqIEBwYXJhbSBvYmogICAgQVZDbGFzcyBvYmplY3QgdG8gc2V0IG9wdGlvbnMgb24KKyAqIEBwYXJhbSBuYW1lICAgbmFtZSBvZiB0aGUgYmluYXJ5IG9wdGlvbgorICogQHBhcmFtIHZhbCAgICBwb2ludGVyIHRvIGFuIGludGVnZXIgbGlzdCAobXVzdCBoYXZlIHRoZSBjb3JyZWN0IHR5cGUgd2l0aAorICogICAgICAgICAgICAgICByZWdhcmQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0KQorICogQHBhcmFtIHRlcm0gICBsaXN0IHRlcm1pbmF0b3IgKHVzdWFsbHkgMCBvciAtMSkKKyAqIEBwYXJhbSBmbGFncyAgc2VhcmNoIGZsYWdzCisgKi8KKyNkZWZpbmUgYXZfb3B0X3NldF9pbnRfbGlzdChvYmosIG5hbWUsIHZhbCwgdGVybSwgZmxhZ3MpIFwKKyAgICAoYXZfaW50X2xpc3RfbGVuZ3RoKHZhbCwgdGVybSkgPiBJTlRfTUFYIC8gc2l6ZW9mKCoodmFsKSkgPyBcCisgICAgIEFWRVJST1IoRUlOVkFMKSA6IFwKKyAgICAgYXZfb3B0X3NldF9iaW4ob2JqLCBuYW1lLCAoY29uc3QgdWludDhfdCAqKSh2YWwpLCBcCisgICAgICAgICAgICAgICAgICAgIGF2X2ludF9saXN0X2xlbmd0aCh2YWwsIHRlcm0pICogc2l6ZW9mKCoodmFsKSksIGZsYWdzKSkKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIG9wdF9nZXRfZnVuY3MgT3B0aW9uIGdldHRpbmcgZnVuY3Rpb25zCisgKiBAeworICogVGhvc2UgZnVuY3Rpb25zIGdldCBhIHZhbHVlIG9mIHRoZSBvcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBmcm9tIGFuIG9iamVjdC4KKyAqCisgKiBAcGFyYW1baW5dIG9iaiBhIHN0cnVjdCB3aG9zZSBmaXJzdCBlbGVtZW50IGlzIGEgcG9pbnRlciB0byBhbiBBVkNsYXNzLgorICogQHBhcmFtW2luXSBuYW1lIG5hbWUgb2YgdGhlIG9wdGlvbiB0byBnZXQuCisgKiBAcGFyYW1baW5dIHNlYXJjaF9mbGFncyBmbGFncyBwYXNzZWQgdG8gYXZfb3B0X2ZpbmQyLiBJLmUuIGlmIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4KKyAqIGlzIHBhc3NlZCBoZXJlLCB0aGVuIHRoZSBvcHRpb24gbWF5IGJlIGZvdW5kIGluIGEgY2hpbGQgb2Ygb2JqLgorICogQHBhcmFtW291dF0gb3V0X3ZhbCB2YWx1ZSBvZiB0aGUgb3B0aW9uIHdpbGwgYmUgd3JpdHRlbiBoZXJlCisgKiBAcmV0dXJuID49MCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KKy8qKgorICogQG5vdGUgdGhlIHJldHVybmVkIHN0cmluZyB3aWxsIGJlIGF2X21hbGxvYygpZWQgYW5kIG11c3QgYmUgYXZfZnJlZSgpZWQgYnkgdGhlIGNhbGxlcgorICovCitpbnQgYXZfb3B0X2dldCAgICAgICAgICh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2hfZmxhZ3MsIHVpbnQ4X3QgICAqKm91dF92YWwpOworaW50IGF2X29wdF9nZXRfaW50ICAgICAodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc2VhcmNoX2ZsYWdzLCBpbnQ2NF90ICAgICpvdXRfdmFsKTsKK2ludCBhdl9vcHRfZ2V0X2RvdWJsZSAgKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncywgZG91YmxlICAgICAqb3V0X3ZhbCk7CitpbnQgYXZfb3B0X2dldF9xICAgICAgICh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2hfZmxhZ3MsIEFWUmF0aW9uYWwgKm91dF92YWwpOworaW50IGF2X29wdF9nZXRfaW1hZ2Vfc2l6ZSh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2hfZmxhZ3MsIGludCAqd19vdXQsIGludCAqaF9vdXQpOworaW50IGF2X29wdF9nZXRfcGl4ZWxfZm10ICh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2hfZmxhZ3MsIGVudW0gQVZQaXhlbEZvcm1hdCAqb3V0X2ZtdCk7CitpbnQgYXZfb3B0X2dldF9zYW1wbGVfZm10KHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncywgZW51bSBBVlNhbXBsZUZvcm1hdCAqb3V0X2ZtdCk7CitpbnQgYXZfb3B0X2dldF92aWRlb19yYXRlKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncywgQVZSYXRpb25hbCAqb3V0X3ZhbCk7CitpbnQgYXZfb3B0X2dldF9jaGFubmVsX2xheW91dCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2hfZmxhZ3MsIGludDY0X3QgKmNoX2xheW91dCk7CisvKioKKyAqIEBwYXJhbVtvdXRdIG91dF92YWwgVGhlIHJldHVybmVkIGRpY3Rpb25hcnkgaXMgYSBjb3B5IG9mIHRoZSBhY3R1YWwgdmFsdWUgYW5kIG11c3QKKyAqIGJlIGZyZWVkIHdpdGggYXZfZGljdF9mcmVlKCkgYnkgdGhlIGNhbGxlcgorICovCitpbnQgYXZfb3B0X2dldF9kaWN0X3ZhbCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2hfZmxhZ3MsIEFWRGljdGlvbmFyeSAqKm91dF92YWwpOworLyoqCisgKiBAfQorICovCisvKioKKyAqIEdldHMgYSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgZmllbGQgaW4gYSBzdHJ1Y3QuCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBhY2Nlc3NpbmcgYSBzdHJ1Y3QgZXZlbiB3aGVuIGl0cyBmaWVsZHMgYXJlIG1vdmVkIG9yCisgKiByZW5hbWVkIHNpbmNlIHRoZSBhcHBsaWNhdGlvbiBtYWtpbmcgdGhlIGFjY2VzcyBoYXMgYmVlbiBjb21waWxlZCwKKyAqCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpZWxkLCBpdCBjYW4gYmUgY2FzdCB0byB0aGUgY29ycmVjdCB0eXBlIGFuZCByZWFkCisgKiAgICAgICAgICBvciB3cml0dGVuIHRvLgorICovCit2b2lkICphdl9vcHRfcHRyKGNvbnN0IEFWQ2xhc3MgKmF2Y2xhc3MsIHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogRnJlZSBhbiBBVk9wdGlvblJhbmdlcyBzdHJ1Y3QgYW5kIHNldCBpdCB0byBOVUxMLgorICovCit2b2lkIGF2X29wdF9mcmVlcF9yYW5nZXMoQVZPcHRpb25SYW5nZXMgKipyYW5nZXMpOworCisvKioKKyAqIEdldCBhIGxpc3Qgb2YgYWxsb3dlZCByYW5nZXMgZm9yIHRoZSBnaXZlbiBvcHRpb24uCisgKgorICogVGhlIHJldHVybmVkIGxpc3QgbWF5IGRlcGVuZCBvbiBvdGhlciBmaWVsZHMgaW4gb2JqIGxpa2UgZm9yIGV4YW1wbGUgcHJvZmlsZS4KKyAqCisgKiBAcGFyYW0gZmxhZ3MgaXMgYSBiaXRtYXNrIG9mIGZsYWdzLCB1bmRlZmluZWQgZmxhZ3Mgc2hvdWxkIG5vdCBiZSBzZXQgYW5kIHNob3VsZCBiZSBpZ25vcmVkCisgKiAgICAgICAgICAgICAgQVZfT1BUX1NFQVJDSF9GQUtFX09CSiBpbmRpY2F0ZXMgdGhhdCB0aGUgb2JqIGlzIGEgZG91YmxlIHBvaW50ZXIgdG8gYSBBVkNsYXNzIGluc3RlYWQgb2YgYSBmdWxsIGluc3RhbmNlCisgKiAgICAgICAgICAgICAgQVZfT1BUX01VTFRJX0NPTVBPTkVOVF9SQU5HRSBpbmRpY2F0ZXMgdGhhdCBmdW5jdGlvbiBtYXkgcmV0dXJuIG1vcmUgdGhhbiBvbmUgY29tcG9uZW50LCBAc2VlIEFWT3B0aW9uUmFuZ2VzCisgKgorICogVGhlIHJlc3VsdCBtdXN0IGJlIGZyZWVkIHdpdGggYXZfb3B0X2ZyZWVwX3Jhbmdlcy4KKyAqCisgKiBAcmV0dXJuIG51bWJlciBvZiBjb21wb250ZW50cyByZXR1cm5lZCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycnJvIGNvZGUgb3RoZXJ3aXNlCisgKi8KK2ludCBhdl9vcHRfcXVlcnlfcmFuZ2VzKEFWT3B0aW9uUmFuZ2VzICoqLCB2b2lkICpvYmosIGNvbnN0IGNoYXIgKmtleSwgaW50IGZsYWdzKTsKKworLyoqCisgKiBDb3B5IG9wdGlvbnMgZnJvbSBzcmMgb2JqZWN0IGludG8gZGVzdCBvYmplY3QuCisgKgorICogT3B0aW9ucyB0aGF0IHJlcXVpcmUgbWVtb3J5IGFsbG9jYXRpb24gKGUuZy4gc3RyaW5nIG9yIGJpbmFyeSkgYXJlIG1hbGxvYydlZCBpbiBkZXN0IG9iamVjdC4KKyAqIE9yaWdpbmFsIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHN1Y2ggb3B0aW9ucyBpcyBmcmVlZCB1bmxlc3MgYm90aCBzcmMgYW5kIGRlc3Qgb3B0aW9ucyBwb2ludHMgdG8gdGhlIHNhbWUgbWVtb3J5LgorICoKKyAqIEBwYXJhbSBkZXN0IE9iamVjdCB0byBjb3B5IGZyb20KKyAqIEBwYXJhbSBzcmMgIE9iamVjdCB0byBjb3B5IGludG8KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBlcnJvcgorICovCitpbnQgYXZfb3B0X2NvcHkodm9pZCAqZGVzdCwgRkZfQ09OU1RfQVZVVElMNTUgdm9pZCAqc3JjKTsKKworLyoqCisgKiBHZXQgYSBkZWZhdWx0IGxpc3Qgb2YgYWxsb3dlZCByYW5nZXMgZm9yIHRoZSBnaXZlbiBvcHRpb24uCisgKgorICogVGhpcyBsaXN0IGlzIGNvbnN0cnVjdGVkIHdpdGhvdXQgdXNpbmcgdGhlIEFWQ2xhc3MucXVlcnlfcmFuZ2VzKCkgY2FsbGJhY2sKKyAqIGFuZCBjYW4gYmUgdXNlZCBhcyBmYWxsYmFjayBmcm9tIHdpdGhpbiB0aGUgY2FsbGJhY2suCisgKgorICogQHBhcmFtIGZsYWdzIGlzIGEgYml0bWFzayBvZiBmbGFncywgdW5kZWZpbmVkIGZsYWdzIHNob3VsZCBub3QgYmUgc2V0IGFuZCBzaG91bGQgYmUgaWdub3JlZAorICogICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkogaW5kaWNhdGVzIHRoYXQgdGhlIG9iaiBpcyBhIGRvdWJsZSBwb2ludGVyIHRvIGEgQVZDbGFzcyBpbnN0ZWFkIG9mIGEgZnVsbCBpbnN0YW5jZQorICogICAgICAgICAgICAgIEFWX09QVF9NVUxUSV9DT01QT05FTlRfUkFOR0UgaW5kaWNhdGVzIHRoYXQgZnVuY3Rpb24gbWF5IHJldHVybiBtb3JlIHRoYW4gb25lIGNvbXBvbmVudCwgQHNlZSBBVk9wdGlvblJhbmdlcworICoKKyAqIFRoZSByZXN1bHQgbXVzdCBiZSBmcmVlZCB3aXRoIGF2X29wdF9mcmVlX3Jhbmdlcy4KKyAqCisgKiBAcmV0dXJuIG51bWJlciBvZiBjb21wb250ZW50cyByZXR1cm5lZCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycnJvIGNvZGUgb3RoZXJ3aXNlCisgKi8KK2ludCBhdl9vcHRfcXVlcnlfcmFuZ2VzX2RlZmF1bHQoQVZPcHRpb25SYW5nZXMgKiosIHZvaWQgKm9iaiwgY29uc3QgY2hhciAqa2V5LCBpbnQgZmxhZ3MpOworCisvKioKKyAqIENoZWNrIGlmIGdpdmVuIG9wdGlvbiBpcyBzZXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCisgKgorICogT3B0aW9ucyBvIG11c3QgYmVsb25nIHRvIHRoZSBvYmouIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIHRvIGNoZWNrIGNoaWxkJ3Mgb3B0aW9ucyBzdGF0ZS4KKyAqIEBzZWUgYXZfb3B0X2lzX3NldF90b19kZWZhdWx0X2J5X25hbWUoKS4KKyAqCisgKiBAcGFyYW0gb2JqICBBVkNsYXNzIG9iamVjdCB0byBjaGVjayBvcHRpb24gb24KKyAqIEBwYXJhbSBvICAgIG9wdGlvbiB0byBiZSBjaGVja2VkCisgKiBAcmV0dXJuICAgICA+MCB3aGVuIG9wdGlvbiBpcyBzZXQgdG8gaXRzIGRlZmF1bHQsCisgKiAgICAgICAgICAgICAgMCB3aGVuIG9wdGlvbiBpcyBub3Qgc2V0IGl0cyBkZWZhdWx0LAorICogICAgICAgICAgICAgPDAgb24gZXJyb3IKKyAqLworaW50IGF2X29wdF9pc19zZXRfdG9fZGVmYXVsdCh2b2lkICpvYmosIGNvbnN0IEFWT3B0aW9uICpvKTsKKworLyoqCisgKiBDaGVjayBpZiBnaXZlbiBvcHRpb24gaXMgc2V0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLgorICoKKyAqIEBwYXJhbSBvYmogICAgICAgICAgQVZDbGFzcyBvYmplY3QgdG8gY2hlY2sgb3B0aW9uIG9uCisgKiBAcGFyYW0gbmFtZSAgICAgICAgIG9wdGlvbiBuYW1lCisgKiBAcGFyYW0gc2VhcmNoX2ZsYWdzIGNvbWJpbmF0aW9uIG9mIEFWX09QVF9TRUFSQ0hfKgorICogQHJldHVybiAgICAgICAgICAgICA+MCB3aGVuIG9wdGlvbiBpcyBzZXQgdG8gaXRzIGRlZmF1bHQsCisgKiAgICAgICAgICAgICAgICAgICAgIDAgd2hlbiBvcHRpb24gaXMgbm90IHNldCBpdHMgZGVmYXVsdCwKKyAqICAgICAgICAgICAgICAgICAgICAgPDAgb24gZXJyb3IKKyAqLworaW50IGF2X29wdF9pc19zZXRfdG9fZGVmYXVsdF9ieV9uYW1lKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncyk7CisKKworI2RlZmluZSBBVl9PUFRfU0VSSUFMSVpFX1NLSVBfREVGQVVMVFMgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vLzwgU2VyaWFsaXplIG9wdGlvbnMgdGhhdCBhcmUgbm90IHNldCB0byBkZWZhdWx0IHZhbHVlcyBvbmx5LgorI2RlZmluZSBBVl9PUFRfU0VSSUFMSVpFX09QVF9GTEFHU19FWEFDVCAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8vLzwgU2VyaWFsaXplIG9wdGlvbnMgdGhhdCBleGFjdGx5IG1hdGNoIG9wdF9mbGFncyBvbmx5LgorCisvKioKKyAqIFNlcmlhbGl6ZSBvYmplY3QncyBvcHRpb25zLgorICoKKyAqIENyZWF0ZSBhIHN0cmluZyBjb250YWluaW5nIG9iamVjdCdzIHNlcmlhbGl6ZWQgb3B0aW9ucy4KKyAqIFN1Y2ggc3RyaW5nIG1heSBiZSBwYXNzZWQgYmFjayB0byBhdl9vcHRfc2V0X2Zyb21fc3RyaW5nKCkgaW4gb3JkZXIgdG8gcmVzdG9yZSBvcHRpb24gdmFsdWVzLgorICogQSBrZXkvdmFsdWUgb3IgcGFpcnMgc2VwYXJhdG9yIG9jY3VycmluZyBpbiB0aGUgc2VyaWFsaXplZCB2YWx1ZSBvcgorICogbmFtZSBzdHJpbmcgYXJlIGVzY2FwZWQgdGhyb3VnaCB0aGUgYXZfZXNjYXBlKCkgZnVuY3Rpb24uCisgKgorICogQHBhcmFtW2luXSAgb2JqICAgICAgICAgICBBVkNsYXNzIG9iamVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbVtpbl0gIG9wdF9mbGFncyAgICAgc2VyaWFsaXplIG9wdGlvbnMgd2l0aCBhbGwgdGhlIHNwZWNpZmllZCBmbGFncyBzZXQgKEFWX09QVF9GTEFHKQorICogQHBhcmFtW2luXSAgZmxhZ3MgICAgICAgICBjb21iaW5hdGlvbiBvZiBBVl9PUFRfU0VSSUFMSVpFXyogZmxhZ3MKKyAqIEBwYXJhbVtvdXRdIGJ1ZmZlciAgICAgICAgUG9pbnRlciB0byBidWZmZXIgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCB3aXRoIHN0cmluZyBjb250YWluZyBzZXJpYWxpemVkIG9wdGlvbnMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgd2hlbiBpcyBubyBsb25nZXIgbmVlZGVkLgorICogQHBhcmFtW2luXSAga2V5X3ZhbF9zZXAgICBjaGFyYWN0ZXIgdXNlZCB0byBzZXBhcmF0ZSBrZXkgZnJvbSB2YWx1ZQorICogQHBhcmFtW2luXSAgcGFpcnNfc2VwICAgICBjaGFyYWN0ZXIgdXNlZCB0byBzZXBhcmF0ZSB0d28gcGFpcnMgZnJvbSBlYWNoIG90aGVyCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgID49IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZXJyb3IKKyAqIEB3YXJuaW5nIFNlcGFyYXRvcnMgY2Fubm90IGJlIG5laXRoZXIgJ1xcJyBub3IgJ1wwJy4gVGhleSBhbHNvIGNhbm5vdCBiZSB0aGUgc2FtZS4KKyAqLworaW50IGF2X29wdF9zZXJpYWxpemUodm9pZCAqb2JqLCBpbnQgb3B0X2ZsYWdzLCBpbnQgZmxhZ3MsIGNoYXIgKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGtleV92YWxfc2VwLCBjb25zdCBjaGFyIHBhaXJzX3NlcCk7CisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9PUFRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9wYXJzZXV0aWxzLmMgYi9mZm1wZWcvbGliYXZ1dGlsL3BhcnNldXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzA4Njk5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9wYXJzZXV0aWxzLmMKQEAgLTAsMCArMSw4OTMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbWlzYyBwYXJzaW5nIHV0aWxpdGllcworICovCisKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJhdnN0cmluZy5oIgorI2luY2x1ZGUgImF2dXRpbC5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImV2YWwuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJyYW5kb21fc2VlZC5oIgorI2luY2x1ZGUgInRpbWVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwYXJzZXV0aWxzLmgiCisKKyNpZmRlZiBURVNUCisKKyNkZWZpbmUgYXZfZ2V0X3JhbmRvbV9zZWVkIGF2X2dldF9yYW5kb21fc2VlZF9kZXRlcm1pbmlzdGljCitzdGF0aWMgdWludDMyX3QgYXZfZ2V0X3JhbmRvbV9zZWVkX2RldGVybWluaXN0aWModm9pZCk7CisKKyNkZWZpbmUgdGltZSh0KSAxMzMxOTcyMDUzCisKKyNlbmRpZgorCitpbnQgYXZfcGFyc2VfcmF0aW8oQVZSYXRpb25hbCAqcSwgY29uc3QgY2hhciAqc3RyLCBpbnQgbWF4LAorICAgICAgICAgICAgICAgICAgIGludCBsb2dfb2Zmc2V0LCB2b2lkICpsb2dfY3R4KQoreworICAgIGNoYXIgYzsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHNzY2FuZihzdHIsICIlZDolZCVjIiwgJnEtPm51bSwgJnEtPmRlbiwgJmMpICE9IDIpIHsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICAgIHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJmQsIHN0ciwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGxvZ19vZmZzZXQsIGxvZ19jdHgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICpxID0gYXZfZDJxKGQsIG1heCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfcmVkdWNlKCZxLT5udW0sICZxLT5kZW4sIHEtPm51bSwgcS0+ZGVuLCBtYXgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqYWJicjsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKK30gVmlkZW9TaXplQWJicjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmFiYnI7CisgICAgQVZSYXRpb25hbCByYXRlOworfSBWaWRlb1JhdGVBYmJyOworCitzdGF0aWMgY29uc3QgVmlkZW9TaXplQWJiciB2aWRlb19zaXplX2FiYnJzW10gPSB7CisgICAgeyAibnRzYyIsICAgICAgNzIwLCA0ODAgfSwKKyAgICB7ICJwYWwiLCAgICAgICA3MjAsIDU3NiB9LAorICAgIHsgInFudHNjIiwgICAgIDM1MiwgMjQwIH0sIC8qIFZDRCBjb21wbGlhbnQgTlRTQyAqLworICAgIHsgInFwYWwiLCAgICAgIDM1MiwgMjg4IH0sIC8qIFZDRCBjb21wbGlhbnQgUEFMICovCisgICAgeyAic250c2MiLCAgICAgNjQwLCA0ODAgfSwgLyogc3F1YXJlIHBpeGVsIE5UU0MgKi8KKyAgICB7ICJzcGFsIiwgICAgICA3NjgsIDU3NiB9LCAvKiBzcXVhcmUgcGl4ZWwgUEFMICovCisgICAgeyAiZmlsbSIsICAgICAgMzUyLCAyNDAgfSwKKyAgICB7ICJudHNjLWZpbG0iLCAzNTIsIDI0MCB9LAorICAgIHsgInNxY2lmIiwgICAgIDEyOCwgIDk2IH0sCisgICAgeyAicWNpZiIsICAgICAgMTc2LCAxNDQgfSwKKyAgICB7ICJjaWYiLCAgICAgICAzNTIsIDI4OCB9LAorICAgIHsgIjRjaWYiLCAgICAgIDcwNCwgNTc2IH0sCisgICAgeyAiMTZjaWYiLCAgICAxNDA4LDExNTIgfSwKKyAgICB7ICJxcXZnYSIsICAgICAxNjAsIDEyMCB9LAorICAgIHsgInF2Z2EiLCAgICAgIDMyMCwgMjQwIH0sCisgICAgeyAidmdhIiwgICAgICAgNjQwLCA0ODAgfSwKKyAgICB7ICJzdmdhIiwgICAgICA4MDAsIDYwMCB9LAorICAgIHsgInhnYSIsICAgICAgMTAyNCwgNzY4IH0sCisgICAgeyAidXhnYSIsICAgICAxNjAwLDEyMDAgfSwKKyAgICB7ICJxeGdhIiwgICAgIDIwNDgsMTUzNiB9LAorICAgIHsgInN4Z2EiLCAgICAgMTI4MCwxMDI0IH0sCisgICAgeyAicXN4Z2EiLCAgICAyNTYwLDIwNDggfSwKKyAgICB7ICJoc3hnYSIsICAgIDUxMjAsNDA5NiB9LAorICAgIHsgInd2Z2EiLCAgICAgIDg1MiwgNDgwIH0sCisgICAgeyAid3hnYSIsICAgICAxMzY2LCA3NjggfSwKKyAgICB7ICJ3c3hnYSIsICAgIDE2MDAsMTAyNCB9LAorICAgIHsgInd1eGdhIiwgICAgMTkyMCwxMjAwIH0sCisgICAgeyAid294Z2EiLCAgICAyNTYwLDE2MDAgfSwKKyAgICB7ICJ3cXN4Z2EiLCAgIDMyMDAsMjA0OCB9LAorICAgIHsgIndxdXhnYSIsICAgMzg0MCwyNDAwIH0sCisgICAgeyAid2hzeGdhIiwgICA2NDAwLDQwOTYgfSwKKyAgICB7ICJ3aHV4Z2EiLCAgIDc2ODAsNDgwMCB9LAorICAgIHsgImNnYSIsICAgICAgIDMyMCwgMjAwIH0sCisgICAgeyAiZWdhIiwgICAgICAgNjQwLCAzNTAgfSwKKyAgICB7ICJoZDQ4MCIsICAgICA4NTIsIDQ4MCB9LAorICAgIHsgImhkNzIwIiwgICAgMTI4MCwgNzIwIH0sCisgICAgeyAiaGQxMDgwIiwgICAxOTIwLDEwODAgfSwKKyAgICB7ICIyayIsICAgICAgIDIwNDgsMTA4MCB9LCAvKiBEaWdpdGFsIENpbmVtYSBTeXN0ZW0gU3BlY2lmaWNhdGlvbiAqLworICAgIHsgIjJrZmxhdCIsICAgMTk5OCwxMDgwIH0sCisgICAgeyAiMmtzY29wZSIsICAyMDQ4LCA4NTggfSwKKyAgICB7ICI0ayIsICAgICAgIDQwOTYsMjE2MCB9LCAvKiBEaWdpdGFsIENpbmVtYSBTeXN0ZW0gU3BlY2lmaWNhdGlvbiAqLworICAgIHsgIjRrZmxhdCIsICAgMzk5NiwyMTYwIH0sCisgICAgeyAiNGtzY29wZSIsICA0MDk2LDE3MTYgfSwKKyAgICB7ICJuaGQiLCAgICAgICA2NDAsMzYwICB9LAorICAgIHsgImhxdmdhIiwgICAgIDI0MCwxNjAgIH0sCisgICAgeyAid3F2Z2EiLCAgICAgNDAwLDI0MCAgfSwKKyAgICB7ICJmd3F2Z2EiLCAgICA0MzIsMjQwICB9LAorICAgIHsgImh2Z2EiLCAgICAgIDQ4MCwzMjAgIH0sCisgICAgeyAicWhkIiwgICAgICAgOTYwLDU0MCAgfSwKK307CisKK3N0YXRpYyBjb25zdCBWaWRlb1JhdGVBYmJyIHZpZGVvX3JhdGVfYWJicnNbXT0geworICAgIHsgIm50c2MiLCAgICAgIHsgMzAwMDAsIDEwMDEgfSB9LAorICAgIHsgInBhbCIsICAgICAgIHsgICAgMjUsICAgIDEgfSB9LAorICAgIHsgInFudHNjIiwgICAgIHsgMzAwMDAsIDEwMDEgfSB9LCAvKiBWQ0QgY29tcGxpYW50IE5UU0MgKi8KKyAgICB7ICJxcGFsIiwgICAgICB7ICAgIDI1LCAgICAxIH0gfSwgLyogVkNEIGNvbXBsaWFudCBQQUwgKi8KKyAgICB7ICJzbnRzYyIsICAgICB7IDMwMDAwLCAxMDAxIH0gfSwgLyogc3F1YXJlIHBpeGVsIE5UU0MgKi8KKyAgICB7ICJzcGFsIiwgICAgICB7ICAgIDI1LCAgICAxIH0gfSwgLyogc3F1YXJlIHBpeGVsIFBBTCAqLworICAgIHsgImZpbG0iLCAgICAgIHsgICAgMjQsICAgIDEgfSB9LAorICAgIHsgIm50c2MtZmlsbSIsIHsgMjQwMDAsIDEwMDEgfSB9LAorfTsKKworaW50IGF2X3BhcnNlX3ZpZGVvX3NpemUoaW50ICp3aWR0aF9wdHIsIGludCAqaGVpZ2h0X3B0ciwgY29uc3QgY2hhciAqc3RyKQoreworICAgIGludCBpOworICAgIGludCBuID0gRkZfQVJSQVlfRUxFTVModmlkZW9fc2l6ZV9hYmJycyk7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcCh2aWRlb19zaXplX2FiYnJzW2ldLmFiYnIsIHN0cikpIHsKKyAgICAgICAgICAgIHdpZHRoICA9IHZpZGVvX3NpemVfYWJicnNbaV0ud2lkdGg7CisgICAgICAgICAgICBoZWlnaHQgPSB2aWRlb19zaXplX2FiYnJzW2ldLmhlaWdodDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IG4pIHsKKyAgICAgICAgd2lkdGggPSBzdHJ0b2woc3RyLCAodm9pZCopJnAsIDEwKTsKKyAgICAgICAgaWYgKCpwKQorICAgICAgICAgICAgcCsrOworICAgICAgICBoZWlnaHQgPSBzdHJ0b2wocCwgKHZvaWQqKSZwLCAxMCk7CisKKyAgICAgICAgLyogdHJhaWxpbmcgZXh0cmFuZW91cyBkYXRhIGRldGVjdGVkLCBsaWtlIGluIDEyM3gzNDVmb29iYXIgKi8KKyAgICAgICAgaWYgKCpwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgKndpZHRoX3B0ciAgPSB3aWR0aDsKKyAgICAqaGVpZ2h0X3B0ciA9IGhlaWdodDsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X3BhcnNlX3ZpZGVvX3JhdGUoQVZSYXRpb25hbCAqcmF0ZSwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGludCBpLCByZXQ7CisgICAgaW50IG4gPSBGRl9BUlJBWV9FTEVNUyh2aWRlb19yYXRlX2FiYnJzKTsKKworICAgIC8qIEZpcnN0LCB3ZSBjaGVjayBvdXIgYWJicmV2aWF0aW9uIHRhYmxlICovCisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgaWYgKCFzdHJjbXAodmlkZW9fcmF0ZV9hYmJyc1tpXS5hYmJyLCBhcmcpKSB7CisgICAgICAgICAgICAqcmF0ZSA9IHZpZGVvX3JhdGVfYWJicnNbaV0ucmF0ZTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAvKiBUaGVuLCB3ZSB0cnkgdG8gcGFyc2UgaXQgYXMgZnJhY3Rpb24gKi8KKyAgICBpZiAoKHJldCA9IGF2X3BhcnNlX3JhdGlvX3F1aWV0KHJhdGUsIGFyZywgMTAwMTAwMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAocmF0ZS0+bnVtIDw9IDAgfHwgcmF0ZS0+ZGVuIDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgIC8vLzwgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoZSBjb2xvcgorICAgIHVpbnQ4X3QgICAgIHJnYl9jb2xvclszXTsgICAgLy8vPCBSR0IgdmFsdWVzIGZvciB0aGUgY29sb3IKK30gQ29sb3JFbnRyeTsKKworc3RhdGljIGNvbnN0IENvbG9yRW50cnkgY29sb3JfdGFibGVbXSA9IHsKKyAgICB7ICJBbGljZUJsdWUiLCAgICAgICAgICAgIHsgMHhGMCwgMHhGOCwgMHhGRiB9IH0sCisgICAgeyAiQW50aXF1ZVdoaXRlIiwgICAgICAgICB7IDB4RkEsIDB4RUIsIDB4RDcgfSB9LAorICAgIHsgIkFxdWEiLCAgICAgICAgICAgICAgICAgeyAweDAwLCAweEZGLCAweEZGIH0gfSwKKyAgICB7ICJBcXVhbWFyaW5lIiwgICAgICAgICAgIHsgMHg3RiwgMHhGRiwgMHhENCB9IH0sCisgICAgeyAiQXp1cmUiLCAgICAgICAgICAgICAgICB7IDB4RjAsIDB4RkYsIDB4RkYgfSB9LAorICAgIHsgIkJlaWdlIiwgICAgICAgICAgICAgICAgeyAweEY1LCAweEY1LCAweERDIH0gfSwKKyAgICB7ICJCaXNxdWUiLCAgICAgICAgICAgICAgIHsgMHhGRiwgMHhFNCwgMHhDNCB9IH0sCisgICAgeyAiQmxhY2siLCAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorICAgIHsgIkJsYW5jaGVkQWxtb25kIiwgICAgICAgeyAweEZGLCAweEVCLCAweENEIH0gfSwKKyAgICB7ICJCbHVlIiwgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCwgMHhGRiB9IH0sCisgICAgeyAiQmx1ZVZpb2xldCIsICAgICAgICAgICB7IDB4OEEsIDB4MkIsIDB4RTIgfSB9LAorICAgIHsgIkJyb3duIiwgICAgICAgICAgICAgICAgeyAweEE1LCAweDJBLCAweDJBIH0gfSwKKyAgICB7ICJCdXJseVdvb2QiLCAgICAgICAgICAgIHsgMHhERSwgMHhCOCwgMHg4NyB9IH0sCisgICAgeyAiQ2FkZXRCbHVlIiwgICAgICAgICAgICB7IDB4NUYsIDB4OUUsIDB4QTAgfSB9LAorICAgIHsgIkNoYXJ0cmV1c2UiLCAgICAgICAgICAgeyAweDdGLCAweEZGLCAweDAwIH0gfSwKKyAgICB7ICJDaG9jb2xhdGUiLCAgICAgICAgICAgIHsgMHhEMiwgMHg2OSwgMHgxRSB9IH0sCisgICAgeyAiQ29yYWwiLCAgICAgICAgICAgICAgICB7IDB4RkYsIDB4N0YsIDB4NTAgfSB9LAorICAgIHsgIkNvcm5mbG93ZXJCbHVlIiwgICAgICAgeyAweDY0LCAweDk1LCAweEVEIH0gfSwKKyAgICB7ICJDb3Juc2lsayIsICAgICAgICAgICAgIHsgMHhGRiwgMHhGOCwgMHhEQyB9IH0sCisgICAgeyAiQ3JpbXNvbiIsICAgICAgICAgICAgICB7IDB4REMsIDB4MTQsIDB4M0MgfSB9LAorICAgIHsgIkN5YW4iLCAgICAgICAgICAgICAgICAgeyAweDAwLCAweEZGLCAweEZGIH0gfSwKKyAgICB7ICJEYXJrQmx1ZSIsICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCwgMHg4QiB9IH0sCisgICAgeyAiRGFya0N5YW4iLCAgICAgICAgICAgICB7IDB4MDAsIDB4OEIsIDB4OEIgfSB9LAorICAgIHsgIkRhcmtHb2xkZW5Sb2QiLCAgICAgICAgeyAweEI4LCAweDg2LCAweDBCIH0gfSwKKyAgICB7ICJEYXJrR3JheSIsICAgICAgICAgICAgIHsgMHhBOSwgMHhBOSwgMHhBOSB9IH0sCisgICAgeyAiRGFya0dyZWVuIiwgICAgICAgICAgICB7IDB4MDAsIDB4NjQsIDB4MDAgfSB9LAorICAgIHsgIkRhcmtLaGFraSIsICAgICAgICAgICAgeyAweEJELCAweEI3LCAweDZCIH0gfSwKKyAgICB7ICJEYXJrTWFnZW50YSIsICAgICAgICAgIHsgMHg4QiwgMHgwMCwgMHg4QiB9IH0sCisgICAgeyAiRGFya09saXZlR3JlZW4iLCAgICAgICB7IDB4NTUsIDB4NkIsIDB4MkYgfSB9LAorICAgIHsgIkRhcmtvcmFuZ2UiLCAgICAgICAgICAgeyAweEZGLCAweDhDLCAweDAwIH0gfSwKKyAgICB7ICJEYXJrT3JjaGlkIiwgICAgICAgICAgIHsgMHg5OSwgMHgzMiwgMHhDQyB9IH0sCisgICAgeyAiRGFya1JlZCIsICAgICAgICAgICAgICB7IDB4OEIsIDB4MDAsIDB4MDAgfSB9LAorICAgIHsgIkRhcmtTYWxtb24iLCAgICAgICAgICAgeyAweEU5LCAweDk2LCAweDdBIH0gfSwKKyAgICB7ICJEYXJrU2VhR3JlZW4iLCAgICAgICAgIHsgMHg4RiwgMHhCQywgMHg4RiB9IH0sCisgICAgeyAiRGFya1NsYXRlQmx1ZSIsICAgICAgICB7IDB4NDgsIDB4M0QsIDB4OEIgfSB9LAorICAgIHsgIkRhcmtTbGF0ZUdyYXkiLCAgICAgICAgeyAweDJGLCAweDRGLCAweDRGIH0gfSwKKyAgICB7ICJEYXJrVHVycXVvaXNlIiwgICAgICAgIHsgMHgwMCwgMHhDRSwgMHhEMSB9IH0sCisgICAgeyAiRGFya1Zpb2xldCIsICAgICAgICAgICB7IDB4OTQsIDB4MDAsIDB4RDMgfSB9LAorICAgIHsgIkRlZXBQaW5rIiwgICAgICAgICAgICAgeyAweEZGLCAweDE0LCAweDkzIH0gfSwKKyAgICB7ICJEZWVwU2t5Qmx1ZSIsICAgICAgICAgIHsgMHgwMCwgMHhCRiwgMHhGRiB9IH0sCisgICAgeyAiRGltR3JheSIsICAgICAgICAgICAgICB7IDB4NjksIDB4NjksIDB4NjkgfSB9LAorICAgIHsgIkRvZGdlckJsdWUiLCAgICAgICAgICAgeyAweDFFLCAweDkwLCAweEZGIH0gfSwKKyAgICB7ICJGaXJlQnJpY2siLCAgICAgICAgICAgIHsgMHhCMiwgMHgyMiwgMHgyMiB9IH0sCisgICAgeyAiRmxvcmFsV2hpdGUiLCAgICAgICAgICB7IDB4RkYsIDB4RkEsIDB4RjAgfSB9LAorICAgIHsgIkZvcmVzdEdyZWVuIiwgICAgICAgICAgeyAweDIyLCAweDhCLCAweDIyIH0gfSwKKyAgICB7ICJGdWNoc2lhIiwgICAgICAgICAgICAgIHsgMHhGRiwgMHgwMCwgMHhGRiB9IH0sCisgICAgeyAiR2FpbnNib3JvIiwgICAgICAgICAgICB7IDB4REMsIDB4REMsIDB4REMgfSB9LAorICAgIHsgIkdob3N0V2hpdGUiLCAgICAgICAgICAgeyAweEY4LCAweEY4LCAweEZGIH0gfSwKKyAgICB7ICJHb2xkIiwgICAgICAgICAgICAgICAgIHsgMHhGRiwgMHhENywgMHgwMCB9IH0sCisgICAgeyAiR29sZGVuUm9kIiwgICAgICAgICAgICB7IDB4REEsIDB4QTUsIDB4MjAgfSB9LAorICAgIHsgIkdyYXkiLCAgICAgICAgICAgICAgICAgeyAweDgwLCAweDgwLCAweDgwIH0gfSwKKyAgICB7ICJHcmVlbiIsICAgICAgICAgICAgICAgIHsgMHgwMCwgMHg4MCwgMHgwMCB9IH0sCisgICAgeyAiR3JlZW5ZZWxsb3ciLCAgICAgICAgICB7IDB4QUQsIDB4RkYsIDB4MkYgfSB9LAorICAgIHsgIkhvbmV5RGV3IiwgICAgICAgICAgICAgeyAweEYwLCAweEZGLCAweEYwIH0gfSwKKyAgICB7ICJIb3RQaW5rIiwgICAgICAgICAgICAgIHsgMHhGRiwgMHg2OSwgMHhCNCB9IH0sCisgICAgeyAiSW5kaWFuUmVkIiwgICAgICAgICAgICB7IDB4Q0QsIDB4NUMsIDB4NUMgfSB9LAorICAgIHsgIkluZGlnbyIsICAgICAgICAgICAgICAgeyAweDRCLCAweDAwLCAweDgyIH0gfSwKKyAgICB7ICJJdm9yeSIsICAgICAgICAgICAgICAgIHsgMHhGRiwgMHhGRiwgMHhGMCB9IH0sCisgICAgeyAiS2hha2kiLCAgICAgICAgICAgICAgICB7IDB4RjAsIDB4RTYsIDB4OEMgfSB9LAorICAgIHsgIkxhdmVuZGVyIiwgICAgICAgICAgICAgeyAweEU2LCAweEU2LCAweEZBIH0gfSwKKyAgICB7ICJMYXZlbmRlckJsdXNoIiwgICAgICAgIHsgMHhGRiwgMHhGMCwgMHhGNSB9IH0sCisgICAgeyAiTGF3bkdyZWVuIiwgICAgICAgICAgICB7IDB4N0MsIDB4RkMsIDB4MDAgfSB9LAorICAgIHsgIkxlbW9uQ2hpZmZvbiIsICAgICAgICAgeyAweEZGLCAweEZBLCAweENEIH0gfSwKKyAgICB7ICJMaWdodEJsdWUiLCAgICAgICAgICAgIHsgMHhBRCwgMHhEOCwgMHhFNiB9IH0sCisgICAgeyAiTGlnaHRDb3JhbCIsICAgICAgICAgICB7IDB4RjAsIDB4ODAsIDB4ODAgfSB9LAorICAgIHsgIkxpZ2h0Q3lhbiIsICAgICAgICAgICAgeyAweEUwLCAweEZGLCAweEZGIH0gfSwKKyAgICB7ICJMaWdodEdvbGRlblJvZFllbGxvdyIsIHsgMHhGQSwgMHhGQSwgMHhEMiB9IH0sCisgICAgeyAiTGlnaHRHcmVlbiIsICAgICAgICAgICB7IDB4OTAsIDB4RUUsIDB4OTAgfSB9LAorICAgIHsgIkxpZ2h0R3JleSIsICAgICAgICAgICAgeyAweEQzLCAweEQzLCAweEQzIH0gfSwKKyAgICB7ICJMaWdodFBpbmsiLCAgICAgICAgICAgIHsgMHhGRiwgMHhCNiwgMHhDMSB9IH0sCisgICAgeyAiTGlnaHRTYWxtb24iLCAgICAgICAgICB7IDB4RkYsIDB4QTAsIDB4N0EgfSB9LAorICAgIHsgIkxpZ2h0U2VhR3JlZW4iLCAgICAgICAgeyAweDIwLCAweEIyLCAweEFBIH0gfSwKKyAgICB7ICJMaWdodFNreUJsdWUiLCAgICAgICAgIHsgMHg4NywgMHhDRSwgMHhGQSB9IH0sCisgICAgeyAiTGlnaHRTbGF0ZUdyYXkiLCAgICAgICB7IDB4NzcsIDB4ODgsIDB4OTkgfSB9LAorICAgIHsgIkxpZ2h0U3RlZWxCbHVlIiwgICAgICAgeyAweEIwLCAweEM0LCAweERFIH0gfSwKKyAgICB7ICJMaWdodFllbGxvdyIsICAgICAgICAgIHsgMHhGRiwgMHhGRiwgMHhFMCB9IH0sCisgICAgeyAiTGltZSIsICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4RkYsIDB4MDAgfSB9LAorICAgIHsgIkxpbWVHcmVlbiIsICAgICAgICAgICAgeyAweDMyLCAweENELCAweDMyIH0gfSwKKyAgICB7ICJMaW5lbiIsICAgICAgICAgICAgICAgIHsgMHhGQSwgMHhGMCwgMHhFNiB9IH0sCisgICAgeyAiTWFnZW50YSIsICAgICAgICAgICAgICB7IDB4RkYsIDB4MDAsIDB4RkYgfSB9LAorICAgIHsgIk1hcm9vbiIsICAgICAgICAgICAgICAgeyAweDgwLCAweDAwLCAweDAwIH0gfSwKKyAgICB7ICJNZWRpdW1BcXVhTWFyaW5lIiwgICAgIHsgMHg2NiwgMHhDRCwgMHhBQSB9IH0sCisgICAgeyAiTWVkaXVtQmx1ZSIsICAgICAgICAgICB7IDB4MDAsIDB4MDAsIDB4Q0QgfSB9LAorICAgIHsgIk1lZGl1bU9yY2hpZCIsICAgICAgICAgeyAweEJBLCAweDU1LCAweEQzIH0gfSwKKyAgICB7ICJNZWRpdW1QdXJwbGUiLCAgICAgICAgIHsgMHg5MywgMHg3MCwgMHhEOCB9IH0sCisgICAgeyAiTWVkaXVtU2VhR3JlZW4iLCAgICAgICB7IDB4M0MsIDB4QjMsIDB4NzEgfSB9LAorICAgIHsgIk1lZGl1bVNsYXRlQmx1ZSIsICAgICAgeyAweDdCLCAweDY4LCAweEVFIH0gfSwKKyAgICB7ICJNZWRpdW1TcHJpbmdHcmVlbiIsICAgIHsgMHgwMCwgMHhGQSwgMHg5QSB9IH0sCisgICAgeyAiTWVkaXVtVHVycXVvaXNlIiwgICAgICB7IDB4NDgsIDB4RDEsIDB4Q0MgfSB9LAorICAgIHsgIk1lZGl1bVZpb2xldFJlZCIsICAgICAgeyAweEM3LCAweDE1LCAweDg1IH0gfSwKKyAgICB7ICJNaWRuaWdodEJsdWUiLCAgICAgICAgIHsgMHgxOSwgMHgxOSwgMHg3MCB9IH0sCisgICAgeyAiTWludENyZWFtIiwgICAgICAgICAgICB7IDB4RjUsIDB4RkYsIDB4RkEgfSB9LAorICAgIHsgIk1pc3R5Um9zZSIsICAgICAgICAgICAgeyAweEZGLCAweEU0LCAweEUxIH0gfSwKKyAgICB7ICJNb2NjYXNpbiIsICAgICAgICAgICAgIHsgMHhGRiwgMHhFNCwgMHhCNSB9IH0sCisgICAgeyAiTmF2YWpvV2hpdGUiLCAgICAgICAgICB7IDB4RkYsIDB4REUsIDB4QUQgfSB9LAorICAgIHsgIk5hdnkiLCAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwLCAweDgwIH0gfSwKKyAgICB7ICJPbGRMYWNlIiwgICAgICAgICAgICAgIHsgMHhGRCwgMHhGNSwgMHhFNiB9IH0sCisgICAgeyAiT2xpdmUiLCAgICAgICAgICAgICAgICB7IDB4ODAsIDB4ODAsIDB4MDAgfSB9LAorICAgIHsgIk9saXZlRHJhYiIsICAgICAgICAgICAgeyAweDZCLCAweDhFLCAweDIzIH0gfSwKKyAgICB7ICJPcmFuZ2UiLCAgICAgICAgICAgICAgIHsgMHhGRiwgMHhBNSwgMHgwMCB9IH0sCisgICAgeyAiT3JhbmdlUmVkIiwgICAgICAgICAgICB7IDB4RkYsIDB4NDUsIDB4MDAgfSB9LAorICAgIHsgIk9yY2hpZCIsICAgICAgICAgICAgICAgeyAweERBLCAweDcwLCAweEQ2IH0gfSwKKyAgICB7ICJQYWxlR29sZGVuUm9kIiwgICAgICAgIHsgMHhFRSwgMHhFOCwgMHhBQSB9IH0sCisgICAgeyAiUGFsZUdyZWVuIiwgICAgICAgICAgICB7IDB4OTgsIDB4RkIsIDB4OTggfSB9LAorICAgIHsgIlBhbGVUdXJxdW9pc2UiLCAgICAgICAgeyAweEFGLCAweEVFLCAweEVFIH0gfSwKKyAgICB7ICJQYWxlVmlvbGV0UmVkIiwgICAgICAgIHsgMHhEOCwgMHg3MCwgMHg5MyB9IH0sCisgICAgeyAiUGFwYXlhV2hpcCIsICAgICAgICAgICB7IDB4RkYsIDB4RUYsIDB4RDUgfSB9LAorICAgIHsgIlBlYWNoUHVmZiIsICAgICAgICAgICAgeyAweEZGLCAweERBLCAweEI5IH0gfSwKKyAgICB7ICJQZXJ1IiwgICAgICAgICAgICAgICAgIHsgMHhDRCwgMHg4NSwgMHgzRiB9IH0sCisgICAgeyAiUGluayIsICAgICAgICAgICAgICAgICB7IDB4RkYsIDB4QzAsIDB4Q0IgfSB9LAorICAgIHsgIlBsdW0iLCAgICAgICAgICAgICAgICAgeyAweERELCAweEEwLCAweEREIH0gfSwKKyAgICB7ICJQb3dkZXJCbHVlIiwgICAgICAgICAgIHsgMHhCMCwgMHhFMCwgMHhFNiB9IH0sCisgICAgeyAiUHVycGxlIiwgICAgICAgICAgICAgICB7IDB4ODAsIDB4MDAsIDB4ODAgfSB9LAorICAgIHsgIlJlZCIsICAgICAgICAgICAgICAgICAgeyAweEZGLCAweDAwLCAweDAwIH0gfSwKKyAgICB7ICJSb3N5QnJvd24iLCAgICAgICAgICAgIHsgMHhCQywgMHg4RiwgMHg4RiB9IH0sCisgICAgeyAiUm95YWxCbHVlIiwgICAgICAgICAgICB7IDB4NDEsIDB4NjksIDB4RTEgfSB9LAorICAgIHsgIlNhZGRsZUJyb3duIiwgICAgICAgICAgeyAweDhCLCAweDQ1LCAweDEzIH0gfSwKKyAgICB7ICJTYWxtb24iLCAgICAgICAgICAgICAgIHsgMHhGQSwgMHg4MCwgMHg3MiB9IH0sCisgICAgeyAiU2FuZHlCcm93biIsICAgICAgICAgICB7IDB4RjQsIDB4QTQsIDB4NjAgfSB9LAorICAgIHsgIlNlYUdyZWVuIiwgICAgICAgICAgICAgeyAweDJFLCAweDhCLCAweDU3IH0gfSwKKyAgICB7ICJTZWFTaGVsbCIsICAgICAgICAgICAgIHsgMHhGRiwgMHhGNSwgMHhFRSB9IH0sCisgICAgeyAiU2llbm5hIiwgICAgICAgICAgICAgICB7IDB4QTAsIDB4NTIsIDB4MkQgfSB9LAorICAgIHsgIlNpbHZlciIsICAgICAgICAgICAgICAgeyAweEMwLCAweEMwLCAweEMwIH0gfSwKKyAgICB7ICJTa3lCbHVlIiwgICAgICAgICAgICAgIHsgMHg4NywgMHhDRSwgMHhFQiB9IH0sCisgICAgeyAiU2xhdGVCbHVlIiwgICAgICAgICAgICB7IDB4NkEsIDB4NUEsIDB4Q0QgfSB9LAorICAgIHsgIlNsYXRlR3JheSIsICAgICAgICAgICAgeyAweDcwLCAweDgwLCAweDkwIH0gfSwKKyAgICB7ICJTbm93IiwgICAgICAgICAgICAgICAgIHsgMHhGRiwgMHhGQSwgMHhGQSB9IH0sCisgICAgeyAiU3ByaW5nR3JlZW4iLCAgICAgICAgICB7IDB4MDAsIDB4RkYsIDB4N0YgfSB9LAorICAgIHsgIlN0ZWVsQmx1ZSIsICAgICAgICAgICAgeyAweDQ2LCAweDgyLCAweEI0IH0gfSwKKyAgICB7ICJUYW4iLCAgICAgICAgICAgICAgICAgIHsgMHhEMiwgMHhCNCwgMHg4QyB9IH0sCisgICAgeyAiVGVhbCIsICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4ODAsIDB4ODAgfSB9LAorICAgIHsgIlRoaXN0bGUiLCAgICAgICAgICAgICAgeyAweEQ4LCAweEJGLCAweEQ4IH0gfSwKKyAgICB7ICJUb21hdG8iLCAgICAgICAgICAgICAgIHsgMHhGRiwgMHg2MywgMHg0NyB9IH0sCisgICAgeyAiVHVycXVvaXNlIiwgICAgICAgICAgICB7IDB4NDAsIDB4RTAsIDB4RDAgfSB9LAorICAgIHsgIlZpb2xldCIsICAgICAgICAgICAgICAgeyAweEVFLCAweDgyLCAweEVFIH0gfSwKKyAgICB7ICJXaGVhdCIsICAgICAgICAgICAgICAgIHsgMHhGNSwgMHhERSwgMHhCMyB9IH0sCisgICAgeyAiV2hpdGUiLCAgICAgICAgICAgICAgICB7IDB4RkYsIDB4RkYsIDB4RkYgfSB9LAorICAgIHsgIldoaXRlU21va2UiLCAgICAgICAgICAgeyAweEY1LCAweEY1LCAweEY1IH0gfSwKKyAgICB7ICJZZWxsb3ciLCAgICAgICAgICAgICAgIHsgMHhGRiwgMHhGRiwgMHgwMCB9IH0sCisgICAgeyAiWWVsbG93R3JlZW4iLCAgICAgICAgICB7IDB4OUEsIDB4Q0QsIDB4MzIgfSB9LAorfTsKKworc3RhdGljIGludCBjb2xvcl90YWJsZV9jb21wYXJlKGNvbnN0IHZvaWQgKmxocywgY29uc3Qgdm9pZCAqcmhzKQoreworICAgIHJldHVybiBhdl9zdHJjYXNlY21wKGxocywgKChjb25zdCBDb2xvckVudHJ5ICopcmhzKS0+bmFtZSk7Cit9CisKKyNkZWZpbmUgQUxQSEFfU0VQICdAJworCitpbnQgYXZfcGFyc2VfY29sb3IodWludDhfdCAqcmdiYV9jb2xvciwgY29uc3QgY2hhciAqY29sb3Jfc3RyaW5nLCBpbnQgc2xlbiwKKyAgICAgICAgICAgICAgICAgICB2b2lkICpsb2dfY3R4KQoreworICAgIGNoYXIgKnRhaWwsIGNvbG9yX3N0cmluZzJbMTI4XTsKKyAgICBjb25zdCBDb2xvckVudHJ5ICplbnRyeTsKKyAgICBpbnQgbGVuLCBoZXhfb2Zmc2V0ID0gMDsKKworICAgIGlmIChjb2xvcl9zdHJpbmdbMF0gPT0gJyMnKSB7CisgICAgICAgIGhleF9vZmZzZXQgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoY29sb3Jfc3RyaW5nLCAiMHgiLCAyKSkKKyAgICAgICAgaGV4X29mZnNldCA9IDI7CisKKyAgICBpZiAoc2xlbiA8IDApCisgICAgICAgIHNsZW4gPSBzdHJsZW4oY29sb3Jfc3RyaW5nKTsKKyAgICBhdl9zdHJsY3B5KGNvbG9yX3N0cmluZzIsIGNvbG9yX3N0cmluZyArIGhleF9vZmZzZXQsCisgICAgICAgICAgICAgICBGRk1JTihzbGVuLWhleF9vZmZzZXQrMSwgc2l6ZW9mKGNvbG9yX3N0cmluZzIpKSk7CisgICAgaWYgKCh0YWlsID0gc3RyY2hyKGNvbG9yX3N0cmluZzIsIEFMUEhBX1NFUCkpKQorICAgICAgICAqdGFpbCsrID0gMDsKKyAgICBsZW4gPSBzdHJsZW4oY29sb3Jfc3RyaW5nMik7CisgICAgcmdiYV9jb2xvclszXSA9IDI1NTsKKworICAgIGlmICghYXZfc3RyY2FzZWNtcChjb2xvcl9zdHJpbmcyLCAicmFuZG9tIikgfHwgIWF2X3N0cmNhc2VjbXAoY29sb3Jfc3RyaW5nMiwgImJpa2VzaGVkIikpIHsKKyAgICAgICAgaW50IHJnYmEgPSBhdl9nZXRfcmFuZG9tX3NlZWQoKTsKKyAgICAgICAgcmdiYV9jb2xvclswXSA9IHJnYmEgPj4gMjQ7CisgICAgICAgIHJnYmFfY29sb3JbMV0gPSByZ2JhID4+IDE2OworICAgICAgICByZ2JhX2NvbG9yWzJdID0gcmdiYSA+PiA4OworICAgICAgICByZ2JhX2NvbG9yWzNdID0gcmdiYTsKKyAgICB9IGVsc2UgaWYgKGhleF9vZmZzZXQgfHwKKyAgICAgICAgICAgICAgIHN0cnNwbihjb2xvcl9zdHJpbmcyLCAiMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZiIpID09IGxlbikgeworICAgICAgICBjaGFyICp0YWlsOworICAgICAgICB1bnNpZ25lZCBpbnQgcmdiYSA9IHN0cnRvdWwoY29sb3Jfc3RyaW5nMiwgJnRhaWwsIDE2KTsKKworICAgICAgICBpZiAoKnRhaWwgfHwgKGxlbiAhPSA2ICYmIGxlbiAhPSA4KSkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgMHhSUkdHQkJbQUFdIGNvbG9yIHN0cmluZzogJyVzJ1xuIiwgY29sb3Jfc3RyaW5nMik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPT0gOCkgeworICAgICAgICAgICAgcmdiYV9jb2xvclszXSA9IHJnYmE7CisgICAgICAgICAgICByZ2JhID4+PSA4OworICAgICAgICB9CisgICAgICAgIHJnYmFfY29sb3JbMF0gPSByZ2JhID4+IDE2OworICAgICAgICByZ2JhX2NvbG9yWzFdID0gcmdiYSA+PiA4OworICAgICAgICByZ2JhX2NvbG9yWzJdID0gcmdiYTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnRyeSA9IGJzZWFyY2goY29sb3Jfc3RyaW5nMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMoY29sb3JfdGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENvbG9yRW50cnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfdGFibGVfY29tcGFyZSk7CisgICAgICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgZmluZCBjb2xvciAnJXMnXG4iLCBjb2xvcl9zdHJpbmcyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHJnYmFfY29sb3IsIGVudHJ5LT5yZ2JfY29sb3IsIDMpOworICAgIH0KKworICAgIGlmICh0YWlsKSB7CisgICAgICAgIGRvdWJsZSBhbHBoYTsKKyAgICAgICAgY29uc3QgY2hhciAqYWxwaGFfc3RyaW5nID0gdGFpbDsKKyAgICAgICAgaWYgKCFzdHJuY21wKGFscGhhX3N0cmluZywgIjB4IiwgMikpIHsKKyAgICAgICAgICAgIGFscGhhID0gc3RydG91bChhbHBoYV9zdHJpbmcsICZ0YWlsLCAxNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb3VibGUgbm9ybV9hbHBoYSA9IHN0cnRvZChhbHBoYV9zdHJpbmcsICZ0YWlsKTsKKyAgICAgICAgICAgIGlmIChub3JtX2FscGhhIDwgMC4wIHx8IG5vcm1fYWxwaGEgPiAxLjApCisgICAgICAgICAgICAgICAgYWxwaGEgPSAyNTY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWxwaGEgPSAyNTUgKiBub3JtX2FscGhhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhaWwgPT0gYWxwaGFfc3RyaW5nIHx8ICp0YWlsIHx8IGFscGhhID4gMjU1IHx8IGFscGhhIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYWxwaGEgdmFsdWUgc3BlY2lmaWVyICclcycgaW4gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICBhbHBoYV9zdHJpbmcsIGNvbG9yX3N0cmluZyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIHJnYmFfY29sb3JbM10gPSBhbHBoYTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgY2hhciAqYXZfZ2V0X2tub3duX2NvbG9yX25hbWUoaW50IGNvbG9yX2lkeCwgY29uc3QgdWludDhfdCAqKnJnYnApCit7CisgICAgY29uc3QgQ29sb3JFbnRyeSAqY29sb3I7CisKKyAgICBpZiAoKHVuc2lnbmVkKWNvbG9yX2lkeCA+PSBGRl9BUlJBWV9FTEVNUyhjb2xvcl90YWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY29sb3IgPSAmY29sb3JfdGFibGVbY29sb3JfaWR4XTsKKyAgICBpZiAocmdicCkKKyAgICAgICAgKnJnYnAgPSBjb2xvci0+cmdiX2NvbG9yOworCisgICAgcmV0dXJuIGNvbG9yLT5uYW1lOworfQorCisvKiBnZXQgYSBwb3NpdGl2ZSBudW1iZXIgYmV0d2VlbiBuX21pbiBhbmQgbl9tYXgsIGZvciBhIG1heGltdW0gbGVuZ3RoCisgICBvZiBsZW5fbWF4LiBSZXR1cm4gLTEgaWYgZXJyb3IuICovCitzdGF0aWMgaW50IGRhdGVfZ2V0X251bShjb25zdCBjaGFyICoqcHAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbl9taW4sIGludCBuX21heCwgaW50IGxlbl9tYXgpCit7CisgICAgaW50IGksIHZhbCwgYzsKKyAgICBjb25zdCBjaGFyICpwOworCisgICAgcCA9ICpwcDsKKyAgICB2YWwgPSAwOworICAgIGZvcihpID0gMDsgaSA8IGxlbl9tYXg7IGkrKykgeworICAgICAgICBjID0gKnA7CisgICAgICAgIGlmICghYXZfaXNkaWdpdChjKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB2YWwgPSAodmFsICogMTApICsgYyAtICcwJzsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICAvKiBubyBudW1iZXIgcmVhZCA/ICovCisgICAgaWYgKHAgPT0gKnBwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHZhbCA8IG5fbWluIHx8IHZhbCA+IG5fbWF4KQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnBwID0gcDsKKyAgICByZXR1cm4gdmFsOworfQorCitjaGFyICphdl9zbWFsbF9zdHJwdGltZShjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICpmbXQsIHN0cnVjdCB0bSAqZHQpCit7CisgICAgaW50IGMsIHZhbDsKKworICAgIGZvcig7OykgeworICAgICAgICAvKiBjb25zdW1lIHRpbWUgc3RyaW5nIHVudGlsIGEgbm9uIHdoaXRlc3BhY2UgY2hhciBpcyBmb3VuZCAqLworICAgICAgICB3aGlsZSAoYXZfaXNzcGFjZSgqZm10KSkgeworICAgICAgICAgICAgd2hpbGUgKGF2X2lzc3BhY2UoKnApKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGZtdCsrOworICAgICAgICB9CisgICAgICAgIGMgPSAqZm10Kys7CisgICAgICAgIGlmIChjID09ICdcMCcpIHsKKyAgICAgICAgICAgIHJldHVybiAoY2hhciAqKXA7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnJScpIHsKKyAgICAgICAgICAgIGMgPSAqZm10Kys7CisgICAgICAgICAgICBzd2l0Y2goYykgeworICAgICAgICAgICAgY2FzZSAnSCc6CisgICAgICAgICAgICBjYXNlICdKJzoKKyAgICAgICAgICAgICAgICB2YWwgPSBkYXRlX2dldF9udW0oJnAsIDAsIGMgPT0gJ0gnID8gMjMgOiBJTlRfTUFYLCAyKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsID09IC0xKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICBkdC0+dG1faG91ciA9IHZhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgICAgIHZhbCA9IGRhdGVfZ2V0X251bSgmcCwgMCwgNTksIDIpOworICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGR0LT50bV9taW4gPSB2YWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICB2YWwgPSBkYXRlX2dldF9udW0oJnAsIDAsIDU5LCAyKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsID09IC0xKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICBkdC0+dG1fc2VjID0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnWSc6CisgICAgICAgICAgICAgICAgdmFsID0gZGF0ZV9nZXRfbnVtKCZwLCAwLCA5OTk5LCA0KTsKKyAgICAgICAgICAgICAgICBpZiAodmFsID09IC0xKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICBkdC0+dG1feWVhciA9IHZhbCAtIDE5MDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICB2YWwgPSBkYXRlX2dldF9udW0oJnAsIDEsIDEyLCAyKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsID09IC0xKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICBkdC0+dG1fbW9uID0gdmFsIC0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICAgIHZhbCA9IGRhdGVfZ2V0X251bSgmcCwgMSwgMzEsIDIpOworICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGR0LT50bV9tZGF5ID0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnJSc6CisgICAgICAgICAgICAgICAgZ290byBtYXRjaDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hdGNoOgorICAgICAgICAgICAgaWYgKGMgIT0gKnApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RpbWVfdCBhdl90aW1lZ20oc3RydWN0IHRtICp0bSkKK3sKKyAgICB0aW1lX3QgdDsKKworICAgIGludCB5ID0gdG0tPnRtX3llYXIgKyAxOTAwLCBtID0gdG0tPnRtX21vbiArIDEsIGQgPSB0bS0+dG1fbWRheTsKKworICAgIGlmIChtIDwgMykgeworICAgICAgICBtICs9IDEyOworICAgICAgICB5LS07CisgICAgfQorCisgICAgdCA9IDg2NDAwTEwgKgorICAgICAgICAoZCArICgxNTMgKiBtIC0gNDU3KSAvIDUgKyAzNjUgKiB5ICsgeSAvIDQgLSB5IC8gMTAwICsgeSAvIDQwMCAtIDcxOTQ2OSk7CisKKyAgICB0ICs9IDM2MDAgKiB0bS0+dG1faG91ciArIDYwICogdG0tPnRtX21pbiArIHRtLT50bV9zZWM7CisKKyAgICByZXR1cm4gdDsKK30KKworaW50IGF2X3BhcnNlX3RpbWUoaW50NjRfdCAqdGltZXZhbCwgY29uc3QgY2hhciAqdGltZXN0ciwgaW50IGR1cmF0aW9uKQoreworICAgIGNvbnN0IGNoYXIgKnAsICpxOworICAgIGludDY0X3QgdDsKKyAgICB0aW1lX3Qgbm93OworICAgIHN0cnVjdCB0bSBkdCA9IHsgMCB9LCB0bWJ1ZjsKKyAgICBpbnQgdG9kYXkgPSAwLCBuZWdhdGl2ZSA9IDAsIG1pY3Jvc2Vjb25kcyA9IDA7CisgICAgaW50IGk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXRlX2ZtdFtdID0geworICAgICAgICAiJVktJW0tJWQiLAorICAgICAgICAiJVklbSVkIiwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGltZV9mbXRbXSA9IHsKKyAgICAgICAgIiVIOiVNOiVTIiwKKyAgICAgICAgIiVIJU0lUyIsCisgICAgfTsKKworICAgIHAgPSB0aW1lc3RyOworICAgIHEgPSBOVUxMOworICAgICp0aW1ldmFsID0gSU5UNjRfTUlOOworICAgIGlmICghZHVyYXRpb24pIHsKKyAgICAgICAgbm93ID0gdGltZSgwKTsKKworICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAodGltZXN0ciwgIm5vdyIpKSB7CisgICAgICAgICAgICAqdGltZXZhbCA9IChpbnQ2NF90KSBub3cgKiAxMDAwMDAwOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBwYXJzZSB0aGUgeWVhci1tb250aC1kYXkgcGFydCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZGF0ZV9mbXQpOyBpKyspIHsKKyAgICAgICAgICAgIHEgPSBhdl9zbWFsbF9zdHJwdGltZShwLCBkYXRlX2ZtdFtpXSwgJmR0KTsKKyAgICAgICAgICAgIGlmIChxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgdGhlIHllYXItbW9udGgtZGF5IHBhcnQgaXMgbWlzc2luZywgdGhlbiB0YWtlIHRoZQorICAgICAgICAgKiBjdXJyZW50IHllYXItbW9udGgtZGF5IHRpbWUgKi8KKyAgICAgICAgaWYgKCFxKSB7CisgICAgICAgICAgICB0b2RheSA9IDE7CisgICAgICAgICAgICBxID0gcDsKKyAgICAgICAgfQorICAgICAgICBwID0gcTsKKworICAgICAgICBpZiAoKnAgPT0gJ1QnIHx8ICpwID09ICd0JyB8fCAqcCA9PSAnICcpCisgICAgICAgICAgICBwKys7CisKKyAgICAgICAgLyogcGFyc2UgdGhlIGhvdXItbWludXRlLXNlY29uZCBwYXJ0ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyh0aW1lX2ZtdCk7IGkrKykgeworICAgICAgICAgICAgcSA9IGF2X3NtYWxsX3N0cnB0aW1lKHAsIHRpbWVfZm10W2ldLCAmZHQpOworICAgICAgICAgICAgaWYgKHEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBwYXJzZSB0aW1lc3RyIGFzIGEgZHVyYXRpb24gKi8KKyAgICAgICAgaWYgKHBbMF0gPT0gJy0nKSB7CisgICAgICAgICAgICBuZWdhdGl2ZSA9IDE7CisgICAgICAgICAgICArK3A7CisgICAgICAgIH0KKyAgICAgICAgLyogcGFyc2UgdGltZXN0ciBhcyBISDpNTTpTUyAqLworICAgICAgICBxID0gYXZfc21hbGxfc3RycHRpbWUocCwgIiVKOiVNOiVTIiwgJmR0KTsKKyAgICAgICAgaWYgKCFxKSB7CisgICAgICAgICAgICAvKiBwYXJzZSB0aW1lc3RyIGFzIE1NOlNTICovCisgICAgICAgICAgICBxID0gYXZfc21hbGxfc3RycHRpbWUocCwgIiVNOiVTIiwgJmR0KTsKKyAgICAgICAgICAgIGR0LnRtX2hvdXIgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICghcSkgeworICAgICAgICAgICAgY2hhciAqbzsKKyAgICAgICAgICAgIC8qIHBhcnNlIHRpbWVzdHIgYXMgUysgKi8KKyAgICAgICAgICAgIGR0LnRtX3NlYyA9IHN0cnRvbChwLCAmbywgMTApOworICAgICAgICAgICAgaWYgKG8gPT0gcCkgLyogdGhlIHBhcnNpbmcgZGlkbid0IHN1Y2NlZWQgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZHQudG1fbWluID0gMDsKKyAgICAgICAgICAgIGR0LnRtX2hvdXIgPSAwOworICAgICAgICAgICAgcSA9IG87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBOb3cgd2UgaGF2ZSBhbGwgdGhlIGZpZWxkcyB0aGF0IHdlIGNhbiBnZXQgKi8KKyAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAvKiBwYXJzZSB0aGUgLm0uLi4gcGFydCAqLworICAgIGlmICgqcSA9PSAnLicpIHsKKyAgICAgICAgaW50IG47CisgICAgICAgIHErKzsKKyAgICAgICAgZm9yIChuID0gMTAwMDAwOyBuID49IDE7IG4gLz0gMTAsIHErKykgeworICAgICAgICAgICAgaWYgKCFhdl9pc2RpZ2l0KCpxKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG1pY3Jvc2Vjb25kcyArPSBuICogKCpxIC0gJzAnKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoYXZfaXNkaWdpdCgqcSkpCisgICAgICAgICAgICBxKys7CisgICAgfQorCisgICAgaWYgKGR1cmF0aW9uKSB7CisgICAgICAgIHQgPSBkdC50bV9ob3VyICogMzYwMCArIGR0LnRtX21pbiAqIDYwICsgZHQudG1fc2VjOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpc191dGMgPSAqcSA9PSAnWicgfHwgKnEgPT0gJ3onOworICAgICAgICBxICs9IGlzX3V0YzsKKyAgICAgICAgaWYgKHRvZGF5KSB7IC8qIGZpbGwgaW4gdG9kYXkncyBkYXRlICovCisgICAgICAgICAgICBzdHJ1Y3QgdG0gZHQyID0gaXNfdXRjID8gKmdtdGltZV9yKCZub3csICZ0bWJ1ZikgOiAqbG9jYWx0aW1lX3IoJm5vdywgJnRtYnVmKTsKKyAgICAgICAgICAgIGR0Mi50bV9ob3VyID0gZHQudG1faG91cjsKKyAgICAgICAgICAgIGR0Mi50bV9taW4gID0gZHQudG1fbWluOworICAgICAgICAgICAgZHQyLnRtX3NlYyAgPSBkdC50bV9zZWM7CisgICAgICAgICAgICBkdCA9IGR0MjsKKyAgICAgICAgfQorICAgICAgICB0ID0gaXNfdXRjID8gYXZfdGltZWdtKCZkdCkgOiBta3RpbWUoJmR0KTsKKyAgICB9CisKKyAgICAvKiBDaGVjayB0aGF0IHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KKyAgICBpZiAoKnEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICB0ICo9IDEwMDAwMDA7CisgICAgdCArPSBtaWNyb3NlY29uZHM7CisgICAgKnRpbWV2YWwgPSBuZWdhdGl2ZSA/IC10IDogdDsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X2ZpbmRfaW5mb190YWcoY2hhciAqYXJnLCBpbnQgYXJnX3NpemUsIGNvbnN0IGNoYXIgKnRhZzEsIGNvbnN0IGNoYXIgKmluZm8pCit7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyIHRhZ1sxMjhdLCAqcTsKKworICAgIHAgPSBpbmZvOworICAgIGlmICgqcCA9PSAnPycpCisgICAgICAgIHArKzsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgcSA9IHRhZzsKKyAgICAgICAgd2hpbGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJz0nICYmICpwICE9ICcmJykgeworICAgICAgICAgICAgaWYgKChxIC0gdGFnKSA8IHNpemVvZih0YWcpIC0gMSkKKyAgICAgICAgICAgICAgICAqcSsrID0gKnA7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgKnEgPSAnXDAnOworICAgICAgICBxID0gYXJnOworICAgICAgICBpZiAoKnAgPT0gJz0nKSB7CisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB3aGlsZSAoKnAgIT0gJyYnICYmICpwICE9ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHEgLSBhcmcpIDwgYXJnX3NpemUgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnKycpCisgICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gJyAnOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gKnA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqcSA9ICdcMCc7CisgICAgICAgIGlmICghc3RyY21wKHRhZywgdGFnMSkpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgaWYgKCpwICE9ICcmJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwKys7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWZkZWYgVEVTVAorCitzdGF0aWMgdWludDMyX3QgcmFuZG9tdiA9IE1LVEFHKCdMJywnQScsJ1YnLCdVJyk7CisKK3N0YXRpYyB1aW50MzJfdCBhdl9nZXRfcmFuZG9tX3NlZWRfZGV0ZXJtaW5pc3RpYyh2b2lkKQoreworICAgIHJldHVybiByYW5kb212ID0gcmFuZG9tdiAqIDE2NjQ1MjUgKyAxMDEzOTA0MjIzOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIHByaW50ZigiVGVzdGluZyBhdl9wYXJzZV92aWRlb19yYXRlKClcbiIpOworICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByYXRlc1tdID0geworICAgICAgICAgICAgIi1pbmYiLAorICAgICAgICAgICAgImluZiIsCisgICAgICAgICAgICAibmFuIiwKKyAgICAgICAgICAgICIxMjMvMCIsCisgICAgICAgICAgICAiLTEyMyAvIDAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiLyIsCisgICAgICAgICAgICAiIDEyMyAgLyAgMzIxIiwKKyAgICAgICAgICAgICJmb28vZm9vIiwKKyAgICAgICAgICAgICJmb28vMSIsCisgICAgICAgICAgICAiMS9mb28iLAorICAgICAgICAgICAgIjAvMCIsCisgICAgICAgICAgICAiLzAiLAorICAgICAgICAgICAgIjEvIiwKKyAgICAgICAgICAgICIxIiwKKyAgICAgICAgICAgICIwIiwKKyAgICAgICAgICAgICItMTIzLzEyMyIsCisgICAgICAgICAgICAiLWZvbyIsCisgICAgICAgICAgICAiMTIzLjIzIiwKKyAgICAgICAgICAgICIuMjMiLAorICAgICAgICAgICAgIi0uMjMiLAorICAgICAgICAgICAgIi0wLjIzNCIsCisgICAgICAgICAgICAiLTAuMDAwMDAwMSIsCisgICAgICAgICAgICAiICAyMTMzMi4yMzI0ICAgIiwKKyAgICAgICAgICAgICIgLTIxMzMyLjIzMjQgICAiLAorICAgICAgICB9OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhyYXRlcyk7IGkrKykgeworICAgICAgICAgICAgaW50IHJldDsKKyAgICAgICAgICAgIEFWUmF0aW9uYWwgcSA9IHsgMCwgMCB9OworICAgICAgICAgICAgcmV0ID0gYXZfcGFyc2VfdmlkZW9fcmF0ZSgmcSwgcmF0ZXNbaV0pOworICAgICAgICAgICAgcHJpbnRmKCInJXMnIC0+ICVkLyVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHJhdGVzW2ldLCBxLm51bSwgcS5kZW4sIHJldCA/ICJFUlJPUiIgOiAiT0siKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaW50ZigiXG5UZXN0aW5nIGF2X3BhcnNlX2NvbG9yKClcbiIpOworICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHVpbnQ4X3QgcmdiYVs0XTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbG9yX25hbWVzW10gPSB7CisgICAgICAgICAgICAiYmlrZXNoZWQiLAorICAgICAgICAgICAgIlJhTmRPbSIsCisgICAgICAgICAgICAiZm9vIiwKKyAgICAgICAgICAgICJyZWQiLAorICAgICAgICAgICAgIlJlZCAiLAorICAgICAgICAgICAgIlJFRCIsCisgICAgICAgICAgICAiVmlvbGV0IiwKKyAgICAgICAgICAgICJZZWxsb3ciLAorICAgICAgICAgICAgIlJlZCIsCisgICAgICAgICAgICAiMHgwMDAwMDAiLAorICAgICAgICAgICAgIjB4MDAwMDAwMCIsCisgICAgICAgICAgICAiMHhmZjAwMDAwMCIsCisgICAgICAgICAgICAiMHgzZTM0ZmYiLAorICAgICAgICAgICAgIjB4M2UzNGZmYWEiLAorICAgICAgICAgICAgIjB4ZmZYWGVlIiwKKyAgICAgICAgICAgICIweGZvb2JhciIsCisgICAgICAgICAgICAiMHhmZmZmZWVlZWVlZWUiLAorICAgICAgICAgICAgIiNmZjAwMDAiLAorICAgICAgICAgICAgIiNmZlhYMDAiLAorICAgICAgICAgICAgImZmMDAwMCIsCisgICAgICAgICAgICAiZmZYWDAwIiwKKyAgICAgICAgICAgICJyZWRAZm9vIiwKKyAgICAgICAgICAgICJyYW5kb21AMTAiLAorICAgICAgICAgICAgIjB4ZmYwMDAwQDEuMCIsCisgICAgICAgICAgICAicmVkQCIsCisgICAgICAgICAgICAicmVkQDB4ZmZmIiwKKyAgICAgICAgICAgICJyZWRAMHhmIiwKKyAgICAgICAgICAgICJyZWRAMiIsCisgICAgICAgICAgICAicmVkQDAuMSIsCisgICAgICAgICAgICAicmVkQC0xIiwKKyAgICAgICAgICAgICJyZWRAMC41IiwKKyAgICAgICAgICAgICJyZWRAMS4wIiwKKyAgICAgICAgICAgICJyZWRAMjU2IiwKKyAgICAgICAgICAgICJyZWRAMTBmb28iLAorICAgICAgICAgICAgInJlZEAtMS4wIiwKKyAgICAgICAgICAgICJyZWRALTAuMCIsCisgICAgICAgIH07CisKKyAgICAgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOworCisgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgRkZfQVJSQVlfRUxFTVMoY29sb3JfbmFtZXMpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhdl9wYXJzZV9jb2xvcihyZ2JhLCBjb2xvcl9uYW1lc1tpXSwgLTEsIE5VTEwpID49IDApCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAtPiBSKCVkKSBHKCVkKSBCKCVkKSBBKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfbmFtZXNbaV0sIHJnYmFbMF0sIHJnYmFbMV0sIHJnYmFbMl0sIHJnYmFbM10pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiJXMgLT4gZXJyb3JcbiIsIGNvbG9yX25hbWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaW50ZigiXG5UZXN0aW5nIGF2X3NtYWxsX3N0cnB0aW1lKClcbiIpOworICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHN0cnVjdCB0bSB0bSA9IHsgMCB9OworICAgICAgICBzdHJ1Y3QgZm10X3RpbWVzcGVjX2VudHJ5IHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgKnRpbWVzcGVjOworICAgICAgICB9IGZtdF90aW1lc3BlY19lbnRyaWVzW10gPSB7CisgICAgICAgICAgICB7ICIlWS0lbS0lZCIsICAgICAgICAgICAgICAgICAgICAiMjAxMi0xMi0yMSIgfSwKKyAgICAgICAgICAgIHsgIiVZIC0gJW0gLSAlZCIsICAgICAgICAgICAgICAgICIyMDEyLTEyLTIxIiB9LAorICAgICAgICAgICAgeyAiJVktJW0tJWQgJUg6JU06JVMiLCAgICAgICAgICAgIjIwMTItMTItMjEgMjA6MTI6MjEiIH0sCisgICAgICAgICAgICB7ICIgICVZIC0gJW0gLSAlZCAlSCA6ICVNIDogJVMiLCAiICAgMjAxMiAtIDEyIC0gIDIxICAgMjAgOiAxMiA6IDIxIiB9LAorICAgICAgICB9OworCisgICAgICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKKyAgICAgICAgZm9yIChpID0gMDsgIGkgPCBGRl9BUlJBWV9FTEVNUyhmbXRfdGltZXNwZWNfZW50cmllcyk7IGkrKykgeworICAgICAgICAgICAgY2hhciAqcDsKKyAgICAgICAgICAgIHN0cnVjdCBmbXRfdGltZXNwZWNfZW50cnkgKmUgPSAmZm10X3RpbWVzcGVjX2VudHJpZXNbaV07CisgICAgICAgICAgICBwcmludGYoImZtdDonJXMnIHNwZWM6JyVzJyAtPiAiLCBlLT5mbXQsIGUtPnRpbWVzcGVjKTsKKyAgICAgICAgICAgIHAgPSBhdl9zbWFsbF9zdHJwdGltZShlLT50aW1lc3BlYywgZS0+Zm10LCAmdG0pOworICAgICAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiUwNGQtJTAyZC0lMmQgJTAyZDolMDJkOiUwMmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIDE5MDArdG0udG1feWVhciwgdG0udG1fbW9uKzEsIHRtLnRtX21kYXksCisgICAgICAgICAgICAgICAgICAgICAgIHRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvclxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcmludGYoIlxuVGVzdGluZyBhdl9wYXJzZV90aW1lKClcbiIpOworICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludDY0X3QgdHY7CisgICAgICAgIHRpbWVfdCB0dmk7CisgICAgICAgIHN0cnVjdCB0bSAqdG07CisgICAgICAgIHN0YXRpYyBjaGFyIHR6c3RyW10gPSAiVFo9Q0VULTEiOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRpbWVfc3RyaW5nW10gPSB7CisgICAgICAgICAgICAibm93IiwKKyAgICAgICAgICAgICIxMjozNTo0NiIsCisgICAgICAgICAgICAiMjAwMC0xMi0yMCAwOjAyOjQ3LjV6IiwKKyAgICAgICAgICAgICIyMDAwLTEyLTIwVDAxMDI0Ny42IiwKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkdXJhdGlvbl9zdHJpbmdbXSA9IHsKKyAgICAgICAgICAgICIyOjM0OjU2Ljc5IiwKKyAgICAgICAgICAgICItMToyMzo0NS42NyIsCisgICAgICAgICAgICAiNDIuMTcyOSIsCisgICAgICAgICAgICAiLTE3MjkuNDIiLAorICAgICAgICAgICAgIjEyOjM0IiwKKyAgICAgICAgfTsKKworICAgICAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7CisgICAgICAgIHB1dGVudih0enN0cik7CisgICAgICAgIHByaW50ZigiKG5vdyBpcyAyMDEyLTAzLTE3IDA5OjE0OjEzICswMTAwLCBsb2NhbCB0aW1lIGlzIFVUQysxKVxuIik7CisgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgRkZfQVJSQVlfRUxFTVModGltZV9zdHJpbmcpOyBpKyspIHsKKyAgICAgICAgICAgIHByaW50ZigiJS0yNHMgLT4gIiwgdGltZV9zdHJpbmdbaV0pOworICAgICAgICAgICAgaWYgKGF2X3BhcnNlX3RpbWUoJnR2LCB0aW1lX3N0cmluZ1tpXSwgMCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImVycm9yXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHZpID0gdHYgLyAxMDAwMDAwOworICAgICAgICAgICAgICAgIHRtID0gZ210aW1lKCZ0dmkpOworICAgICAgICAgICAgICAgIHByaW50ZigiJTE0IlBSSWk2NCIuJTA2ZCA9ICUwNGQtJTAyZC0lMDJkVCUwMmQ6JTAyZDolMDJkWlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHYgLyAxMDAwMDAwLCAoaW50KSh0diAlIDEwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24gKyAxLCB0bS0+dG1fbWRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgRkZfQVJSQVlfRUxFTVMoZHVyYXRpb25fc3RyaW5nKTsgaSsrKSB7CisgICAgICAgICAgICBwcmludGYoIiUtMjRzIC0+ICIsIGR1cmF0aW9uX3N0cmluZ1tpXSk7CisgICAgICAgICAgICBpZiAoYXZfcGFyc2VfdGltZSgmdHYsIGR1cmF0aW9uX3N0cmluZ1tpXSwgMSkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImVycm9yXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlKzIxIlBSSWk2NCJcbiIsIHR2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9wYXJzZXV0aWxzLmggYi9mZm1wZWcvbGliYXZ1dGlsL3BhcnNldXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODBmMGRlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9wYXJzZXV0aWxzLmgKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfUEFSU0VVVElMU19ICisjZGVmaW5lIEFWVVRJTF9QQVJTRVVUSUxTX0gKKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgInJhdGlvbmFsLmgiCisKKy8qKgorICogQGZpbGUKKyAqIG1pc2MgcGFyc2luZyB1dGlsaXRpZXMKKyAqLworCisvKioKKyAqIFBhcnNlIHN0ciBhbmQgc3RvcmUgdGhlIHBhcnNlZCByYXRpbyBpbiBxLgorICoKKyAqIE5vdGUgdGhhdCBhIHJhdGlvIHdpdGggaW5maW5pdGUgKDEvMCkgb3IgbmVnYXRpdmUgdmFsdWUgaXMKKyAqIGNvbnNpZGVyZWQgdmFsaWQsIHNvIHlvdSBzaG91bGQgY2hlY2sgb24gdGhlIHJldHVybmVkIHZhbHVlIGlmIHlvdQorICogd2FudCB0byBleGNsdWRlIHRob3NlIHZhbHVlcy4KKyAqCisgKiBUaGUgdW5kZWZpbmVkIHZhbHVlIGNhbiBiZSBleHByZXNzZWQgdXNpbmcgdGhlICIwOjAiIHN0cmluZy4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBxIHBvaW50ZXIgdG8gdGhlIEFWUmF0aW9uYWwgd2hpY2ggd2lsbCBjb250YWluIHRoZSByYXRpbworICogQHBhcmFtW2luXSBzdHIgdGhlIHN0cmluZyB0byBwYXJzZTogaXQgaGFzIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBmb3JtYXQKKyAqIG51bTpkZW4sIGEgZmxvYXQgbnVtYmVyIG9yIGFuIGV4cHJlc3Npb24KKyAqIEBwYXJhbVtpbl0gbWF4IHRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvcgorICogQHBhcmFtW2luXSBsb2dfb2Zmc2V0IGxvZyBsZXZlbCBvZmZzZXQgd2hpY2ggaXMgYXBwbGllZCB0byB0aGUgbG9nCisgKiBsZXZlbCBvZiBsb2dfY3R4CisgKiBAcGFyYW1baW5dIGxvZ19jdHggcGFyZW50IGxvZ2dpbmcgY29udGV4dAorICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAqLworaW50IGF2X3BhcnNlX3JhdGlvKEFWUmF0aW9uYWwgKnEsIGNvbnN0IGNoYXIgKnN0ciwgaW50IG1heCwKKyAgICAgICAgICAgICAgICAgICBpbnQgbG9nX29mZnNldCwgdm9pZCAqbG9nX2N0eCk7CisKKyNkZWZpbmUgYXZfcGFyc2VfcmF0aW9fcXVpZXQocmF0ZSwgc3RyLCBtYXgpIFwKKyAgICBhdl9wYXJzZV9yYXRpbyhyYXRlLCBzdHIsIG1heCwgQVZfTE9HX01BWF9PRkZTRVQsIE5VTEwpCisKKy8qKgorICogUGFyc2Ugc3RyIGFuZCBwdXQgaW4gd2lkdGhfcHRyIGFuZCBoZWlnaHRfcHRyIHRoZSBkZXRlY3RlZCB2YWx1ZXMuCisgKgorICogQHBhcmFtW2luLG91dF0gd2lkdGhfcHRyIHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgZGV0ZWN0ZWQKKyAqIHdpZHRoIHZhbHVlCisgKiBAcGFyYW1baW4sb3V0XSBoZWlnaHRfcHRyIHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgZGV0ZWN0ZWQKKyAqIGhlaWdodCB2YWx1ZQorICogQHBhcmFtW2luXSBzdHIgdGhlIHN0cmluZyB0byBwYXJzZTogaXQgaGFzIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBmb3JtYXQKKyAqIHdpZHRoIHggaGVpZ2h0IG9yIGEgdmFsaWQgdmlkZW8gc2l6ZSBhYmJyZXZpYXRpb24uCisgKiBAcmV0dXJuID49IDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZQorICovCitpbnQgYXZfcGFyc2VfdmlkZW9fc2l6ZShpbnQgKndpZHRoX3B0ciwgaW50ICpoZWlnaHRfcHRyLCBjb25zdCBjaGFyICpzdHIpOworCisvKioKKyAqIFBhcnNlIHN0ciBhbmQgc3RvcmUgdGhlIGRldGVjdGVkIHZhbHVlcyBpbiAqcmF0ZS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSByYXRlIHBvaW50ZXIgdG8gdGhlIEFWUmF0aW9uYWwgd2hpY2ggd2lsbCBjb250YWluIHRoZSBkZXRlY3RlZAorICogZnJhbWUgcmF0ZQorICogQHBhcmFtW2luXSBzdHIgdGhlIHN0cmluZyB0byBwYXJzZTogaXQgaGFzIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBmb3JtYXQKKyAqIHJhdGVfbnVtIC8gcmF0ZV9kZW4sIGEgZmxvYXQgbnVtYmVyIG9yIGEgdmFsaWQgdmlkZW8gcmF0ZSBhYmJyZXZpYXRpb24KKyAqIEByZXR1cm4gPj0gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK2ludCBhdl9wYXJzZV92aWRlb19yYXRlKEFWUmF0aW9uYWwgKnJhdGUsIGNvbnN0IGNoYXIgKnN0cik7CisKKy8qKgorICogUHV0IHRoZSBSR0JBIHZhbHVlcyB0aGF0IGNvcnJlc3BvbmQgdG8gY29sb3Jfc3RyaW5nIGluIHJnYmFfY29sb3IuCisgKgorICogQHBhcmFtIGNvbG9yX3N0cmluZyBhIHN0cmluZyBzcGVjaWZ5aW5nIGEgY29sb3IuIEl0IGNhbiBiZSB0aGUgbmFtZSBvZgorICogYSBjb2xvciAoY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaCkgb3IgYSBbMHh8I11SUkdHQkJbQUFdIHNlcXVlbmNlLAorICogcG9zc2libHkgZm9sbG93ZWQgYnkgIkAiIGFuZCBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGFscGhhCisgKiBjb21wb25lbnQuCisgKiBUaGUgYWxwaGEgY29tcG9uZW50IG1heSBiZSBhIHN0cmluZyBjb21wb3NlZCBieSAiMHgiIGZvbGxvd2VkIGJ5IGFuCisgKiBoZXhhZGVjaW1hbCBudW1iZXIgb3IgYSBkZWNpbWFsIG51bWJlciBiZXR3ZWVuIDAuMCBhbmQgMS4wLCB3aGljaAorICogcmVwcmVzZW50cyB0aGUgb3BhY2l0eSB2YWx1ZSAoMHgwMC8wLjAgbWVhbnMgY29tcGxldGVseSB0cmFuc3BhcmVudCwKKyAqIDB4ZmYvMS4wIGNvbXBsZXRlbHkgb3BhcXVlKS4KKyAqIElmIHRoZSBhbHBoYSBjb21wb25lbnQgaXMgbm90IHNwZWNpZmllZCB0aGVuIDB4ZmYgaXMgYXNzdW1lZC4KKyAqIFRoZSBzdHJpbmcgInJhbmRvbSIgd2lsbCByZXN1bHQgaW4gYSByYW5kb20gY29sb3IuCisgKiBAcGFyYW0gc2xlbiBsZW5ndGggb2YgdGhlIGluaXRpYWwgcGFydCBvZiBjb2xvcl9zdHJpbmcgY29udGFpbmluZyB0aGUKKyAqIGNvbG9yLiBJdCBjYW4gYmUgc2V0IHRvIC0xIGlmIGNvbG9yX3N0cmluZyBpcyBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcKKyAqIGNvbnRhaW5pbmcgbm90aGluZyBlbHNlIHRoYW4gdGhlIGNvbG9yLgorICogQHJldHVybiA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mCisgKiBmYWlsdXJlIChmb3IgZXhhbXBsZSBpZiBjb2xvcl9zdHJpbmcgY2Fubm90IGJlIHBhcnNlZCkuCisgKi8KK2ludCBhdl9wYXJzZV9jb2xvcih1aW50OF90ICpyZ2JhX2NvbG9yLCBjb25zdCBjaGFyICpjb2xvcl9zdHJpbmcsIGludCBzbGVuLAorICAgICAgICAgICAgICAgICAgIHZvaWQgKmxvZ19jdHgpOworCisvKioKKyAqIEdldCB0aGUgbmFtZSBvZiBhIGNvbG9yIGZyb20gdGhlIGludGVybmFsIHRhYmxlIG9mIGhhcmQtY29kZWQgbmFtZWQKKyAqIGNvbG9ycy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGVudW1lcmF0ZSB0aGUgY29sb3IgbmFtZXMgcmVjb2duaXplZCBieQorICogYXZfcGFyc2VfY29sb3IoKS4KKyAqCisgKiBAcGFyYW0gY29sb3JfaWR4IGluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgY29sb3IsIHN0YXJ0aW5nIGZyb20gMAorICogQHBhcmFtIHJnYnAgICAgICBpZiBub3QgTlVMTCwgd2lsbCBwb2ludCB0byBhIDMtZWxlbWVudHMgYXJyYXkgd2l0aCB0aGUgY29sb3IgdmFsdWUgaW4gUkdCCisgKiBAcmV0dXJuIHRoZSBjb2xvciBuYW1lIHN0cmluZyBvciBOVUxMIGlmIGNvbG9yX2lkeCBpcyBub3QgaW4gdGhlIGFycmF5CisgKi8KK2NvbnN0IGNoYXIgKmF2X2dldF9rbm93bl9jb2xvcl9uYW1lKGludCBjb2xvcl9pZHgsIGNvbnN0IHVpbnQ4X3QgKipyZ2IpOworCisvKioKKyAqIFBhcnNlIHRpbWVzdHIgYW5kIHJldHVybiBpbiAqdGltZSBhIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mCisgKiBtaWNyb3NlY29uZHMuCisgKgorICogQHBhcmFtIHRpbWV2YWwgcHV0cyBoZXJlIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIGNvcnJlc3BvbmRpbmcKKyAqIHRvIHRoZSBzdHJpbmcgaW4gdGltZXN0ci4gSWYgdGhlIHN0cmluZyByZXByZXNlbnRzIGEgZHVyYXRpb24sIGl0CisgKiBpcyB0aGUgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBjb250YWluZWQgaW4gdGhlIHRpbWUgaW50ZXJ2YWwuICBJZgorICogdGhlIHN0cmluZyBpcyBhIGRhdGUsIGlzIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHNpbmNlIDFzdCBvZgorICogSmFudWFyeSwgMTk3MCB1cCB0byB0aGUgdGltZSBvZiB0aGUgcGFyc2VkIGRhdGUuICBJZiB0aW1lc3RyIGNhbm5vdAorICogYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgc2V0ICp0aW1lIHRvIElOVDY0X01JTi4KKworICogQHBhcmFtIHRpbWVzdHIgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZGF0ZSBvciBhIGR1cmF0aW9uLgorICogLSBJZiBhIGRhdGUgdGhlIHN5bnRheCBpczoKKyAqIEBjb2RlCisgKiBbe1lZWVktTU0tRER8WVlZWU1NRER9W1R8dHwgXV17e0hIOk1NOlNTWy5tLi4uXV1dfXx7SEhNTVNTWy5tLi4uXV1dfX1bWl0KKyAqIG5vdworICogQGVuZGNvZGUKKyAqIElmIHRoZSB2YWx1ZSBpcyAibm93IiBpdCB0YWtlcyB0aGUgY3VycmVudCB0aW1lLgorICogVGltZSBpcyBsb2NhbCB0aW1lIHVubGVzcyBaIGlzIGFwcGVuZGVkLCBpbiB3aGljaCBjYXNlIGl0IGlzCisgKiBpbnRlcnByZXRlZCBhcyBVVEMuCisgKiBJZiB0aGUgeWVhci1tb250aC1kYXkgcGFydCBpcyBub3Qgc3BlY2lmaWVkIGl0IHRha2VzIHRoZSBjdXJyZW50CisgKiB5ZWFyLW1vbnRoLWRheS4KKyAqIC0gSWYgYSBkdXJhdGlvbiB0aGUgc3ludGF4IGlzOgorICogQGNvZGUKKyAqIFstXVtISDpdTU06U1NbLm0uLi5dCisgKiBbLV1TK1subS4uLl0KKyAqIEBlbmRjb2RlCisgKiBAcGFyYW0gZHVyYXRpb24gZmxhZyB3aGljaCB0ZWxscyBob3cgdG8gaW50ZXJwcmV0IHRpbWVzdHIsIGlmIG5vdAorICogemVybyB0aW1lc3RyIGlzIGludGVycHJldGVkIGFzIGEgZHVyYXRpb24sIG90aGVyd2lzZSBhcyBhIGRhdGUKKyAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbgorICogQVZFUlJPUiBjb2RlIG90aGVyd2lzZQorICovCitpbnQgYXZfcGFyc2VfdGltZShpbnQ2NF90ICp0aW1ldmFsLCBjb25zdCBjaGFyICp0aW1lc3RyLCBpbnQgZHVyYXRpb24pOworCisvKioKKyAqIFBhcnNlIHRoZSBpbnB1dCBzdHJpbmcgcCBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBzdHJpbmcgZm10IGFuZAorICogc3RvcmUgaXRzIHJlc3VsdHMgaW4gdGhlIHN0cnVjdHVyZSBkdC4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSBhIHN1YnNldCBvZiB0aGUgZm9ybWF0cyBzdXBwb3J0ZWQKKyAqIGJ5IHRoZSBzdGFuZGFyZCBzdHJwdGltZSgpLgorICoKKyAqIEluIHBhcnRpY3VsYXIgaXQgYWN0dWFsbHkgc3VwcG9ydHMgdGhlIHBhcmFtZXRlcnM6CisgKiAtICVIOiB0aGUgaG91ciBhcyBhIGRlY2ltYWwgbnVtYmVyLCB1c2luZyBhIDI0LWhvdXIgY2xvY2ssIGluIHRoZQorICogcmFuZ2UgJzAwJyB0aHJvdWdoICcyMycKKyAqIC0gJUo6IGhvdXJzIGFzIGEgZGVjaW1hbCBudW1iZXIsIGluIHRoZSByYW5nZSAnMCcgdGhyb3VnaCBJTlRfTUFYCisgKiAtICVNOiB0aGUgbWludXRlIGFzIGEgZGVjaW1hbCBudW1iZXIsIHVzaW5nIGEgMjQtaG91ciBjbG9jaywgaW4gdGhlCisgKiByYW5nZSAnMDAnIHRocm91Z2ggJzU5JworICogLSAlUzogdGhlIHNlY29uZCBhcyBhIGRlY2ltYWwgbnVtYmVyLCB1c2luZyBhIDI0LWhvdXIgY2xvY2ssIGluIHRoZQorICogcmFuZ2UgJzAwJyB0aHJvdWdoICc1OScKKyAqIC0gJVk6IHRoZSB5ZWFyIGFzIGEgZGVjaW1hbCBudW1iZXIsIHVzaW5nIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIKKyAqIC0gJW06IHRoZSBtb250aCBhcyBhIGRlY2ltYWwgbnVtYmVyLCBpbiB0aGUgcmFuZ2UgJzEnIHRocm91Z2ggJzEyJworICogLSAlZDogdGhlIGRheSBvZiB0aGUgbW9udGggYXMgYSBkZWNpbWFsIG51bWJlciwgaW4gdGhlIHJhbmdlICcxJworICogdGhyb3VnaCAnMzEnCisgKiAtICUlOiBhIGxpdGVyYWwgJyUnCisgKgorICogQHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBub3QgcHJvY2Vzc2VkIGluIHRoaXMKKyAqIGZ1bmN0aW9uIGNhbGwsIG9yIE5VTEwgaW4gY2FzZSB0aGUgZnVuY3Rpb24gZmFpbHMgdG8gbWF0Y2ggYWxsIG9mCisgKiB0aGUgZm10IHN0cmluZyBhbmQgdGhlcmVmb3JlIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK2NoYXIgKmF2X3NtYWxsX3N0cnB0aW1lKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKmZtdCwgc3RydWN0IHRtICpkdCk7CisKKy8qKgorICogQXR0ZW1wdCB0byBmaW5kIGEgc3BlY2lmaWMgdGFnIGluIGEgVVJMLgorICoKKyAqIHN5bnRheDogJz90YWcxPXZhbDEmdGFnMj12YWwyLi4uJy4gTGl0dGxlIFVSTCBkZWNvZGluZyBpcyBkb25lLgorICogUmV0dXJuIDEgaWYgZm91bmQuCisgKi8KK2ludCBhdl9maW5kX2luZm9fdGFnKGNoYXIgKmFyZywgaW50IGFyZ19zaXplLCBjb25zdCBjaGFyICp0YWcxLCBjb25zdCBjaGFyICppbmZvKTsKKworLyoqCisgKiBDb252ZXJ0IHRoZSBkZWNvbXBvc2VkIFVUQyB0aW1lIGluIHRtIHRvIGEgdGltZV90IHZhbHVlLgorICovCit0aW1lX3QgYXZfdGltZWdtKHN0cnVjdCB0bSAqdG0pOworCisjZW5kaWYgLyogQVZVVElMX1BBUlNFVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9wY2EuYyBiL2ZmbXBlZy9saWJhdnV0aWwvcGNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhZTM1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvcGNhLmMKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBwcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzIChQQ0EpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogcHJpbmNpcGFsIGNvbXBvbmVudCBhbmFseXNpcyAoUENBKQorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwY2EuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUENBeworICAgIGludCBjb3VudDsKKyAgICBpbnQgbjsKKyAgICBkb3VibGUgKmNvdmFyaWFuY2U7CisgICAgZG91YmxlICptZWFuOworICAgIGRvdWJsZSAqejsKK31QQ0E7CisKK1BDQSAqZmZfcGNhX2luaXQoaW50IG4peworICAgIFBDQSAqcGNhOworICAgIGlmKG48PTApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcGNhPSBhdl9tYWxsb2N6KHNpemVvZigqcGNhKSk7CisgICAgcGNhLT5uPSBuOworICAgIHBjYS0+eiA9IGF2X21hbGxvY19hcnJheShuLCBzaXplb2YoKnBjYS0+eikpOworICAgIHBjYS0+Y291bnQ9MDsKKyAgICBwY2EtPmNvdmFyaWFuY2U9IGF2X2NhbGxvYyhuKm4sIHNpemVvZihkb3VibGUpKTsKKyAgICBwY2EtPm1lYW49IGF2X2NhbGxvYyhuLCBzaXplb2YoZG91YmxlKSk7CisKKyAgICByZXR1cm4gcGNhOworfQorCit2b2lkIGZmX3BjYV9mcmVlKFBDQSAqcGNhKXsKKyAgICBhdl9mcmVlcCgmcGNhLT5jb3ZhcmlhbmNlKTsKKyAgICBhdl9mcmVlcCgmcGNhLT5tZWFuKTsKKyAgICBhdl9mcmVlcCgmcGNhLT56KTsKKyAgICBhdl9mcmVlKHBjYSk7Cit9CisKK3ZvaWQgZmZfcGNhX2FkZChQQ0EgKnBjYSwgY29uc3QgZG91YmxlICp2KXsKKyAgICBpbnQgaSwgajsKKyAgICBjb25zdCBpbnQgbj0gcGNhLT5uOworCisgICAgZm9yKGk9MDsgaTxuOyBpKyspeworICAgICAgICBwY2EtPm1lYW5baV0gKz0gdltpXTsKKyAgICAgICAgZm9yKGo9aTsgajxuOyBqKyspCisgICAgICAgICAgICBwY2EtPmNvdmFyaWFuY2VbaiArIGkqbl0gKz0gdltpXSp2W2pdOworICAgIH0KKyAgICBwY2EtPmNvdW50Kys7Cit9CisKK2ludCBmZl9wY2EoUENBICpwY2EsIGRvdWJsZSAqZWlnZW52ZWN0b3IsIGRvdWJsZSAqZWlnZW52YWx1ZSl7CisgICAgaW50IGksIGosIHBhc3M7CisgICAgaW50IGs9MDsKKyAgICBjb25zdCBpbnQgbj0gcGNhLT5uOworICAgIGRvdWJsZSAqeiA9IHBjYS0+ejsKKworICAgIG1lbXNldChlaWdlbnZlY3RvciwgMCwgc2l6ZW9mKGRvdWJsZSkqbipuKTsKKworICAgIGZvcihqPTA7IGo8bjsgaisrKXsKKyAgICAgICAgcGNhLT5tZWFuW2pdIC89IHBjYS0+Y291bnQ7CisgICAgICAgIGVpZ2VudmVjdG9yW2ogKyBqKm5dID0gMS4wOworICAgICAgICBmb3IoaT0wOyBpPD1qOyBpKyspeworICAgICAgICAgICAgcGNhLT5jb3ZhcmlhbmNlW2ogKyBpKm5dIC89IHBjYS0+Y291bnQ7CisgICAgICAgICAgICBwY2EtPmNvdmFyaWFuY2VbaiArIGkqbl0gLT0gcGNhLT5tZWFuW2ldICogcGNhLT5tZWFuW2pdOworICAgICAgICAgICAgcGNhLT5jb3ZhcmlhbmNlW2kgKyBqKm5dID0gcGNhLT5jb3ZhcmlhbmNlW2ogKyBpKm5dOworICAgICAgICB9CisgICAgICAgIGVpZ2VudmFsdWVbal09IHBjYS0+Y292YXJpYW5jZVtqICsgaipuXTsKKyAgICAgICAgeltqXT0gMDsKKyAgICB9CisKKyAgICBmb3IocGFzcz0wOyBwYXNzIDwgNTA7IHBhc3MrKyl7CisgICAgICAgIGRvdWJsZSBzdW09MDsKKworICAgICAgICBmb3IoaT0wOyBpPG47IGkrKykKKyAgICAgICAgICAgIGZvcihqPWkrMTsgajxuOyBqKyspCisgICAgICAgICAgICAgICAgc3VtICs9IGZhYnMocGNhLT5jb3ZhcmlhbmNlW2ogKyBpKm5dKTsKKworICAgICAgICBpZihzdW0gPT0gMCl7CisgICAgICAgICAgICBmb3IoaT0wOyBpPG47IGkrKyl7CisgICAgICAgICAgICAgICAgZG91YmxlIG1heHZhbHVlPSAtMTsKKyAgICAgICAgICAgICAgICBmb3Ioaj1pOyBqPG47IGorKyl7CisgICAgICAgICAgICAgICAgICAgIGlmKGVpZ2VudmFsdWVbal0gPiBtYXh2YWx1ZSl7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXh2YWx1ZT0gZWlnZW52YWx1ZVtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGs9IGo7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWlnZW52YWx1ZVtrXT0gZWlnZW52YWx1ZVtpXTsKKyAgICAgICAgICAgICAgICBlaWdlbnZhbHVlW2ldPSBtYXh2YWx1ZTsKKyAgICAgICAgICAgICAgICBmb3Ioaj0wOyBqPG47IGorKyl7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0bXA9IGVpZ2VudmVjdG9yW2sgKyBqKm5dOworICAgICAgICAgICAgICAgICAgICBlaWdlbnZlY3RvcltrICsgaipuXT0gZWlnZW52ZWN0b3JbaSArIGoqbl07CisgICAgICAgICAgICAgICAgICAgIGVpZ2VudmVjdG9yW2kgKyBqKm5dPSB0bXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhc3M7CisgICAgICAgIH0KKworICAgICAgICBmb3IoaT0wOyBpPG47IGkrKyl7CisgICAgICAgICAgICBmb3Ioaj1pKzE7IGo8bjsgaisrKXsKKyAgICAgICAgICAgICAgICBkb3VibGUgY292YXI9IHBjYS0+Y292YXJpYW5jZVtqICsgaSpuXTsKKyAgICAgICAgICAgICAgICBkb3VibGUgdCxjLHMsdGF1LHRoZXRhLCBoOworCisgICAgICAgICAgICAgICAgaWYocGFzcyA8IDMgJiYgZmFicyhjb3ZhcikgPCBzdW0gLyAoNSpuKm4pKSAvL0ZJWE1FIHdoeSBwYXNzIDwgMworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZihmYWJzKGNvdmFyKSA9PSAwLjApIC8vRklYTUUgc2hvdWxkIG5vdCBiZSBuZWVkZWQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYocGFzcyA+PTMgJiYgZmFicygoZWlnZW52YWx1ZVtqXSt6W2pdKS9jb3ZhcikgPiAoMUxMPDwzMikgJiYgZmFicygoZWlnZW52YWx1ZVtpXSt6W2ldKS9jb3ZhcikgPiAoMUxMPDwzMikpeworICAgICAgICAgICAgICAgICAgICBwY2EtPmNvdmFyaWFuY2VbaiArIGkqbl09MC4wOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoPSAoZWlnZW52YWx1ZVtqXSt6W2pdKSAtIChlaWdlbnZhbHVlW2ldK3pbaV0pOworICAgICAgICAgICAgICAgIHRoZXRhPTAuNSpoL2NvdmFyOworICAgICAgICAgICAgICAgIHQ9MS4wLyhmYWJzKHRoZXRhKStzcXJ0KDEuMCt0aGV0YSp0aGV0YSkpOworICAgICAgICAgICAgICAgIGlmKHRoZXRhIDwgMC4wKSB0ID0gLXQ7CisKKyAgICAgICAgICAgICAgICBjPTEuMC9zcXJ0KDErdCp0KTsKKyAgICAgICAgICAgICAgICBzPXQqYzsKKyAgICAgICAgICAgICAgICB0YXU9cy8oMS4wK2MpOworICAgICAgICAgICAgICAgIHpbaV0gLT0gdCpjb3ZhcjsKKyAgICAgICAgICAgICAgICB6W2pdICs9IHQqY292YXI7CisKKyNkZWZpbmUgUk9UQVRFKGEsaSxqLGssbCkge1wKKyAgICBkb3VibGUgZz1hW2ogKyBpKm5dO1wKKyAgICBkb3VibGUgaD1hW2wgKyBrKm5dO1wKKyAgICBhW2ogKyBpKm5dPWctcyooaCtnKnRhdSk7XAorICAgIGFbbCArIGsqbl09aCtzKihnLWgqdGF1KTsgfQorICAgICAgICAgICAgICAgIGZvcihrPTA7IGs8bjsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGshPWkgJiYgayE9ail7CisgICAgICAgICAgICAgICAgICAgICAgICBST1RBVEUocGNhLT5jb3ZhcmlhbmNlLEZGTUlOKGssaSksRkZNQVgoayxpKSxGRk1JTihrLGopLEZGTUFYKGssaikpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUk9UQVRFKGVpZ2VudmVjdG9yLGssaSxrLGopCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBjYS0+Y292YXJpYW5jZVtqICsgaSpuXT0wLjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpPTA7IGk8bjsgaSsrKSB7CisgICAgICAgICAgICBlaWdlbnZhbHVlW2ldICs9IHpbaV07CisgICAgICAgICAgICB6W2ldPTAuMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworI2lmZGVmIFRFU1QKKworI3VuZGVmIHByaW50ZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibGZnLmgiCisKK2ludCBtYWluKHZvaWQpeworICAgIFBDQSAqcGNhOworICAgIGludCBpLCBqLCBrOworI2RlZmluZSBMRU4gOAorICAgIGRvdWJsZSBlaWdlbnZlY3RvcltMRU4qTEVOXTsKKyAgICBkb3VibGUgZWlnZW52YWx1ZVtMRU5dOworICAgIEFWTEZHIHBybmc7CisKKyAgICBhdl9sZmdfaW5pdCgmcHJuZywgMSk7CisKKyAgICBwY2E9IGZmX3BjYV9pbml0KExFTik7CisKKyAgICBmb3IoaT0wOyBpPDkwMDAwMDA7IGkrKyl7CisgICAgICAgIGRvdWJsZSB2WzIqTEVOKzEwMF07CisgICAgICAgIGRvdWJsZSBzdW09MDsKKyAgICAgICAgaW50IHBvcyA9IGF2X2xmZ19nZXQoJnBybmcpICUgTEVOOworICAgICAgICBpbnQgdjIgID0gYXZfbGZnX2dldCgmcHJuZykgJSAxMDEgLSA1MDsKKyAgICAgICAgdlswXSAgICA9IGF2X2xmZ19nZXQoJnBybmcpICUgMTAxIC0gNTA7CisgICAgICAgIGZvcihqPTE7IGo8ODsgaisrKXsKKyAgICAgICAgICAgIGlmKGo8PXBvcykgdltqXT0gdlswXTsKKyAgICAgICAgICAgIGVsc2UgICAgICAgdltqXT0gdjI7CisgICAgICAgICAgICBzdW0gKz0gdltqXTsKKyAgICAgICAgfQorLyogICAgICAgIGZvcihqPTA7IGo8TEVOOyBqKyspeworICAgICAgICAgICAgdltqXSAtPSB2W3Bvc107CisgICAgICAgIH0qLworLy8gICAgICAgIHN1bSArPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDEwOworLyogICAgICAgIGZvcihqPTA7IGo8TEVOOyBqKyspeworICAgICAgICAgICAgdltqXSAtPSBzdW0vTEVOOworICAgICAgICB9Ki8KKy8vICAgICAgICBsYnQxKHYrMTAwLHYrMTAwLExFTik7CisgICAgICAgIGZmX3BjYV9hZGQocGNhLCB2KTsKKyAgICB9CisKKworICAgIGZmX3BjYShwY2EsIGVpZ2VudmVjdG9yLCBlaWdlbnZhbHVlKTsKKyAgICBmb3IoaT0wOyBpPExFTjsgaSsrKXsKKyAgICAgICAgcGNhLT5jb3VudD0gMTsKKyAgICAgICAgcGNhLT5tZWFuW2ldPSAwOworCisvLyAgICAgICAgKDAuNV58eHwpXjIgPSAwLjVeMnx4fCA9IDAuMjVefHh8CisKKworLy8gICAgICAgIHBjYS5jb3ZhcmlhbmNlW2kgKyBpKkxFTl09IHBvdygwLjUsIGZhYnMKKyAgICAgICAgZm9yKGo9aTsgajxMRU47IGorKyl7CisgICAgICAgICAgICBwcmludGYoIiVmICIsIHBjYS0+Y292YXJpYW5jZVtpICsgaipMRU5dKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorCisgICAgZm9yKGk9MDsgaTxMRU47IGkrKyl7CisgICAgICAgIGRvdWJsZSB2W0xFTl07CisgICAgICAgIGRvdWJsZSBlcnJvcj0wOworICAgICAgICBtZW1zZXQodiwgMCwgc2l6ZW9mKHYpKTsKKyAgICAgICAgZm9yKGo9MDsgajxMRU47IGorKyl7CisgICAgICAgICAgICBmb3Ioaz0wOyBrPExFTjsgaysrKXsKKyAgICAgICAgICAgICAgICB2W2pdICs9IHBjYS0+Y292YXJpYW5jZVtGRk1JTihrLGopICsgRkZNQVgoayxqKSpMRU5dICogZWlnZW52ZWN0b3JbaSArIGsqTEVOXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZbal0gLz0gZWlnZW52YWx1ZVtpXTsKKyAgICAgICAgICAgIGVycm9yICs9IGZhYnModltqXSAtIGVpZ2VudmVjdG9yW2kgKyBqKkxFTl0pOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiJWYgIiwgZXJyb3IpOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisKKyAgICBmb3IoaT0wOyBpPExFTjsgaSsrKXsKKyAgICAgICAgZm9yKGo9MDsgajxMRU47IGorKyl7CisgICAgICAgICAgICBwcmludGYoIiU5LjZmICIsIGVpZ2VudmVjdG9yW2kgKyBqKkxFTl0pOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiICAlOS4xZiAlZlxuIiwgZWlnZW52YWx1ZVtpXSwgZWlnZW52YWx1ZVtpXS9laWdlbnZhbHVlWzBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9wY2EuaCBiL2ZmbXBlZy9saWJhdnV0aWwvcGNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyYmIyZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvcGNhLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIHByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMgKFBDQSkKKyAqIENvcHlyaWdodCAoYykgMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBwcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzIChQQ0EpCisgKi8KKworI2lmbmRlZiBBVlVUSUxfUENBX0gKKyNkZWZpbmUgQVZVVElMX1BDQV9ICisKK3N0cnVjdCBQQ0EgKmZmX3BjYV9pbml0KGludCBuKTsKK3ZvaWQgZmZfcGNhX2ZyZWUoc3RydWN0IFBDQSAqcGNhKTsKK3ZvaWQgZmZfcGNhX2FkZChzdHJ1Y3QgUENBICpwY2EsIGNvbnN0IGRvdWJsZSAqdik7CitpbnQgZmZfcGNhKHN0cnVjdCBQQ0EgKnBjYSwgZG91YmxlICplaWdlbnZlY3RvciwgZG91YmxlICplaWdlbnZhbHVlKTsKKworI2VuZGlmIC8qIEFWVVRJTF9QQ0FfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9waXhkZXNjLmMgYi9mZm1wZWcvbGliYXZ1dGlsL3BpeGRlc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDhkMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9waXhkZXNjLmMKQEAgLTAsMCArMSwyMzkyIEBACisvKgorICogcGl4ZWwgZm9ybWF0IGRlc2NyaXB0b3IKKyAqIENvcHlyaWdodCAoYykgMjAwOSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwaXhmbXQuaCIKKyNpbmNsdWRlICJwaXhkZXNjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKK3ZvaWQgYXZfcmVhZF9pbWFnZV9saW5lKHVpbnQxNl90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhWzRdLCBjb25zdCBpbnQgbGluZXNpemVbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCBjLCBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFkX3BhbF9jb21wb25lbnQpCit7CisgICAgQVZDb21wb25lbnREZXNjcmlwdG9yIGNvbXAgPSBkZXNjLT5jb21wW2NdOworICAgIGludCBwbGFuZSA9IGNvbXAucGxhbmU7CisgICAgaW50IGRlcHRoID0gY29tcC5kZXB0aF9taW51czEgKyAxOworICAgIGludCBtYXNrICA9ICgxIDw8IGRlcHRoKSAtIDE7CisgICAgaW50IHNoaWZ0ID0gY29tcC5zaGlmdDsKKyAgICBpbnQgc3RlcCAgPSBjb21wLnN0ZXBfbWludXMxICsgMTsKKyAgICBpbnQgZmxhZ3MgPSBkZXNjLT5mbGFnczsKKworICAgIGlmIChmbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CSVRTVFJFQU0pIHsKKyAgICAgICAgaW50IHNraXAgPSB4ICogc3RlcCArIGNvbXAub2Zmc2V0X3BsdXMxIC0gMTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcCA9IGRhdGFbcGxhbmVdICsgeSAqIGxpbmVzaXplW3BsYW5lXSArIChza2lwID4+IDMpOworICAgICAgICBpbnQgc2hpZnQgPSA4IC0gZGVwdGggLSAoc2tpcCAmIDcpOworCisgICAgICAgIHdoaWxlICh3LS0pIHsKKyAgICAgICAgICAgIGludCB2YWwgPSAoKnAgPj4gc2hpZnQpICYgbWFzazsKKyAgICAgICAgICAgIGlmIChyZWFkX3BhbF9jb21wb25lbnQpCisgICAgICAgICAgICAgICAgdmFsID0gZGF0YVsxXVs0KnZhbCArIGNdOworICAgICAgICAgICAgc2hpZnQgLT0gc3RlcDsKKyAgICAgICAgICAgIHAgLT0gc2hpZnQgPj4gMzsKKyAgICAgICAgICAgIHNoaWZ0ICY9IDc7CisgICAgICAgICAgICAqZHN0KysgPSB2YWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50OF90ICpwID0gZGF0YVtwbGFuZV0gKyB5ICogbGluZXNpemVbcGxhbmVdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHggKiBzdGVwICsgY29tcC5vZmZzZXRfcGx1czEgLSAxOworICAgICAgICBpbnQgaXNfOGJpdCA9IHNoaWZ0ICsgZGVwdGggPD0gODsKKworICAgICAgICBpZiAoaXNfOGJpdCkKKyAgICAgICAgICAgIHAgKz0gISEoZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQkUpOworCisgICAgICAgIHdoaWxlICh3LS0pIHsKKyAgICAgICAgICAgIGludCB2YWwgPSBpc184Yml0ID8gKnAgOgorICAgICAgICAgICAgICAgIGZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFID8gQVZfUkIxNihwKSA6IEFWX1JMMTYocCk7CisgICAgICAgICAgICB2YWwgPSAodmFsID4+IHNoaWZ0KSAmIG1hc2s7CisgICAgICAgICAgICBpZiAocmVhZF9wYWxfY29tcG9uZW50KQorICAgICAgICAgICAgICAgIHZhbCA9IGRhdGFbMV1bNCAqIHZhbCArIGNdOworICAgICAgICAgICAgcCArPSBzdGVwOworICAgICAgICAgICAgKmRzdCsrID0gdmFsOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGF2X3dyaXRlX2ltYWdlX2xpbmUoY29uc3QgdWludDE2X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhWzRdLCBjb25zdCBpbnQgbGluZXNpemVbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IGMsIGludCB3KQoreworICAgIEFWQ29tcG9uZW50RGVzY3JpcHRvciBjb21wID0gZGVzYy0+Y29tcFtjXTsKKyAgICBpbnQgcGxhbmUgPSBjb21wLnBsYW5lOworICAgIGludCBkZXB0aCA9IGNvbXAuZGVwdGhfbWludXMxICsgMTsKKyAgICBpbnQgc3RlcCAgPSBjb21wLnN0ZXBfbWludXMxICsgMTsKKyAgICBpbnQgZmxhZ3MgPSBkZXNjLT5mbGFnczsKKworICAgIGlmIChmbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CSVRTVFJFQU0pIHsKKyAgICAgICAgaW50IHNraXAgPSB4ICogc3RlcCArIGNvbXAub2Zmc2V0X3BsdXMxIC0gMTsKKyAgICAgICAgdWludDhfdCAqcCA9IGRhdGFbcGxhbmVdICsgeSAqIGxpbmVzaXplW3BsYW5lXSArIChza2lwID4+IDMpOworICAgICAgICBpbnQgc2hpZnQgPSA4IC0gZGVwdGggLSAoc2tpcCAmIDcpOworCisgICAgICAgIHdoaWxlICh3LS0pIHsKKyAgICAgICAgICAgICpwIHw9ICpzcmMrKyA8PCBzaGlmdDsKKyAgICAgICAgICAgIHNoaWZ0IC09IHN0ZXA7CisgICAgICAgICAgICBwIC09IHNoaWZ0ID4+IDM7CisgICAgICAgICAgICBzaGlmdCAmPSA3OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHNoaWZ0ID0gY29tcC5zaGlmdDsKKyAgICAgICAgdWludDhfdCAqcCA9IGRhdGFbcGxhbmVdICsgeSAqIGxpbmVzaXplW3BsYW5lXSArCisgICAgICAgICAgICAgICAgICAgICB4ICogc3RlcCArIGNvbXAub2Zmc2V0X3BsdXMxIC0gMTsKKworICAgICAgICBpZiAoc2hpZnQgKyBkZXB0aCA8PSA4KSB7CisgICAgICAgICAgICBwICs9ICEhKGZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKTsKKyAgICAgICAgICAgIHdoaWxlICh3LS0pIHsKKyAgICAgICAgICAgICAgICAqcCB8PSAoKnNyYysrIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICBwICs9IHN0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAody0tKSB7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHZhbCA9IEFWX1JCMTYocCkgfCAoKnNyYysrIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgQVZfV0IxNihwLCB2YWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHZhbCA9IEFWX1JMMTYocCkgfCAoKnNyYysrIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgQVZfV0wxNihwLCB2YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwICs9IHN0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZiAhRkZfQVBJX1BJWF9GTVRfREVTQworc3RhdGljCisjZW5kaWYKK2NvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciBhdl9waXhfZm10X2Rlc2NyaXB0b3JzW0FWX1BJWF9GTVRfTkJdID0geworICAgIFtBVl9QSVhfRk1UX1lVVjQyMFBdID0geworICAgICAgICAubmFtZSA9ICJ5dXY0MjBwIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVlWNDIyXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV5djQyMiIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDAsIDMsIDIsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMCwgMywgNCwgMCwgNyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVZZVTQyMl0gPSB7CisgICAgICAgIC5uYW1lID0gInl2eXU0MjIiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgNyB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAwLCAzLCAyLCAwLCA3IH0sICAgICAgICAvKiBWICovCisgICAgICAgICAgICB7IDAsIDMsIDQsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgfSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1JHQjI0XSA9IHsKKyAgICAgICAgLm5hbWUgPSAicmdiMjQiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMiwgMSwgMCwgNyB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAyLCAyLCAwLCA3IH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDIsIDMsIDAsIDcgfSwgICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JHUjI0XSA9IHsKKyAgICAgICAgLm5hbWUgPSAiYmdyMjQiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMiwgMywgMCwgNyB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAyLCAyLCAwLCA3IH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDIsIDEsIDAsIDcgfSwgICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQyMlBdID0geworICAgICAgICAubmFtZSA9ICJ5dXY0MjJwIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0NDRQXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDQ0cCIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDEwUF0gPSB7CisgICAgICAgIC5uYW1lID0gInl1djQxMHAiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMiwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAyLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQxMVBdID0geworICAgICAgICAubmFtZSA9ICJ5dXY0MTFwIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDIsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVZKNDExUF0gPSB7CisgICAgICAgIC5uYW1lID0gInl1dmo0MTFwIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDIsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9HUkFZOF0gPSB7CisgICAgICAgIC5uYW1lID0gImdyYXkiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogWSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMLAorICAgICAgICAuYWxpYXMgPSAiZ3JheTgseTgiLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfTU9OT1dISVRFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAibW9ub3ciLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMCwgMSwgMCwgMCB9LCAgICAgICAgLyogWSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQklUU1RSRUFNLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfTU9OT0JMQUNLXSA9IHsKKyAgICAgICAgLm5hbWUgPSAibW9ub2IiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMCwgMSwgNywgMCB9LCAgICAgICAgLyogWSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQklUU1RSRUFNLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfUEFMOF0gPSB7CisgICAgICAgIC5uYW1lID0gInBhbDgiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMCwgMSwgMCwgNyB9LAorICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUEFMLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWSjQyMFBdID0geworICAgICAgICAubmFtZSA9ICJ5dXZqNDIwcCIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWSjQyMlBdID0geworICAgICAgICAubmFtZSA9ICJ5dXZqNDIycCIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWSjQ0NFBdID0geworICAgICAgICAubmFtZSA9ICJ5dXZqNDQ0cCIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisjaWYgRkZfQVBJX1hWTUMKKyAgICBbQVZfUElYX0ZNVF9YVk1DX01QRUcyX01DXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieHZtY21jIiwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9YVk1DX01QRUcyX0lEQ1RdID0geworICAgICAgICAubmFtZSA9ICJ4dm1jaWRjdCIsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCisjZW5kaWYgLyogRkZfQVBJX1hWTUMgKi8KKyNpZiAhRkZfQVBJX1hWTUMKKyAgICBbQVZfUElYX0ZNVF9YVk1DXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieHZtYyIsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCisjZW5kaWYgLyogIUZGX0FQSV9YVk1DICovCisgICAgW0FWX1BJWF9GTVRfVVlWWTQyMl0gPSB7CisgICAgICAgIC5uYW1lID0gInV5dnk0MjIiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMiwgMCwgNyB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAwLCAzLCAxLCAwLCA3IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDAsIDMsIDMsIDAsIDcgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1VZWVZZWTQxMV0gPSB7CisgICAgICAgIC5uYW1lID0gInV5eXZ5eTQxMSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAyLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAzLCAyLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDAsIDUsIDEsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMCwgNSwgNCwgMCwgNyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSOF0gPSB7CisgICAgICAgIC5uYW1lID0gImJncjgiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMCwgMSwgMCwgMiB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAwLCAxLCAzLCAyIH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDAsIDEsIDYsIDEgfSwgICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9CR1I0XSA9IHsKKyAgICAgICAgLm5hbWUgPSAiYmdyNCIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAzLCA0LCAwLCAwIH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDMsIDIsIDAsIDEgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMCwgMywgMSwgMCwgMCB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQklUU1RSRUFNIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JHUjRfQllURV0gPSB7CisgICAgICAgIC5uYW1lID0gImJncjRfYnl0ZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAwLCAxLCAwLCAwIH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDAsIDEsIDEsIDEgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMCwgMCwgMSwgMywgMCB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1JHQjhdID0geworICAgICAgICAubmFtZSA9ICJyZ2I4IiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDAsIDEsIDYsIDEgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMCwgMSwgMywgMiB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCAwLCAxLCAwLCAyIH0sICAgICAgICAvKiBCICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IgfCBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNF0gPSB7CisgICAgICAgIC5uYW1lID0gInJnYjQiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMywgMSwgMCwgMCB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAzLCAyLCAwLCAxIH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDMsIDQsIDAsIDAgfSwgICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JJVFNUUkVBTSB8IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9SR0I0X0JZVEVdID0geworICAgICAgICAubmFtZSA9ICJyZ2I0X2J5dGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMCwgMSwgMywgMCB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAwLCAxLCAxLCAxIH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDAsIDEsIDAsIDAgfSwgICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9OVjEyXSA9IHsKKyAgICAgICAgLm5hbWUgPSAibnYxMiIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMiwgMCwgNyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfTlYyMV0gPSB7CisgICAgICAgIC5uYW1lID0gIm52MjEiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAxLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAyLCAwLCA3IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDcgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0FSR0JdID0geworICAgICAgICAubmFtZSA9ICJhcmdiIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDMsIDIsIDAsIDcgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMywgMywgMCwgNyB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCAzLCA0LCAwLCA3IH0sICAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDAsIDMsIDEsIDAsIDcgfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1JHQkFdID0geworICAgICAgICAubmFtZSA9ICJyZ2JhIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDMsIDEsIDAsIDcgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMywgMiwgMCwgNyB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCAzLCAzLCAwLCA3IH0sICAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDAsIDMsIDQsIDAsIDcgfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0FCR1JdID0geworICAgICAgICAubmFtZSA9ICJhYmdyIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDMsIDQsIDAsIDcgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMywgMywgMCwgNyB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCAzLCAyLCAwLCA3IH0sICAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDAsIDMsIDEsIDAsIDcgfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JHUkFdID0geworICAgICAgICAubmFtZSA9ICJiZ3JhIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDMsIDMsIDAsIDcgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMywgMiwgMCwgNyB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCAzLCAxLCAwLCA3IH0sICAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDAsIDMsIDQsIDAsIDcgfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UXzBSR0JdID0geworICAgICAgICAubmFtZSA9ICIwcmdiIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHM9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93PSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaD0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDMsIDIsIDAsIDcgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMywgMywgMCwgNyB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCAzLCA0LCAwLCA3IH0sICAgICAgICAvKiBCICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9SR0IwXSA9IHsKKyAgICAgICAgLm5hbWUgPSAicmdiMCIsCisgICAgICAgIC5uYl9jb21wb25lbnRzPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdz0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2g9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAzLCAxLCAwLCA3IH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDMsIDIsIDAsIDcgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMCwgMywgMywgMCwgNyB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfMEJHUl0gPSB7CisgICAgICAgIC5uYW1lID0gIjBiZ3IiLAorICAgICAgICAubmJfY29tcG9uZW50cz0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3c9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMywgNCwgMCwgNyB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAzLCAzLCAwLCA3IH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDMsIDIsIDAsIDcgfSwgICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JHUjBdID0geworICAgICAgICAubmFtZSA9ICJiZ3IwIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHM9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93PSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaD0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDMsIDMsIDAsIDcgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMywgMiwgMCwgNyB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCAzLCAxLCAwLCA3IH0sICAgICAgICAvKiBCICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9HUkFZMTZCRV0gPSB7CisgICAgICAgIC5uYW1lID0gImdyYXkxNmJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDE1IH0sICAgICAgIC8qIFkgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFLAorICAgICAgICAuYWxpYXMgPSAieTE2YmUiLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfR1JBWTE2TEVdID0geworICAgICAgICAubmFtZSA9ICJncmF5MTZsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCAxNSB9LCAgICAgICAvKiBZICovCisgICAgICAgIH0sCisgICAgICAgIC5hbGlhcyA9ICJ5MTZsZSIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0NDBQXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDQwcCIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWSjQ0MFBdID0geworICAgICAgICAubmFtZSA9ICJ5dXZqNDQwcCIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMFBdID0geworICAgICAgICAubmFtZSA9ICJ5dXZhNDIwcCIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gNCwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogViAqLworICAgICAgICAgICAgeyAzLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVZBNDIyUF0gPSB7CisgICAgICAgIC5uYW1lID0gInl1dmE0MjJwIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBWICovCisgICAgICAgICAgICB7IDMsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVkE0NDRQXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2YTQ0NHAiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDQsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgICAgIHsgMywgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMFA5QkVdID0geworICAgICAgICAubmFtZSA9ICJ5dXZhNDIwcDliZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gNCwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogViAqLworICAgICAgICAgICAgeyAzLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVZBNDIwUDlMRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1dmE0MjBwOWxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBWICovCisgICAgICAgICAgICB7IDMsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVkE0MjJQOUJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2YTQyMnA5YmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDQsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgICAgIHsgMywgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMlA5TEVdID0geworICAgICAgICAubmFtZSA9ICJ5dXZhNDIycDlsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gNCwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogViAqLworICAgICAgICAgICAgeyAzLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVZBNDQ0UDlCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1dmE0NDRwOWJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBWICovCisgICAgICAgICAgICB7IDMsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVkE0NDRQOUxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2YTQ0NHA5bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDQsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgICAgIHsgMywgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMFAxMEJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2YTQyMHAxMGJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBWICovCisgICAgICAgICAgICB7IDMsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVkE0MjBQMTBMRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1dmE0MjBwMTBsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gNCwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogViAqLworICAgICAgICAgICAgeyAzLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVZBNDIyUDEwQkVdID0geworICAgICAgICAubmFtZSA9ICJ5dXZhNDIycDEwYmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDQsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgICAgIHsgMywgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMlAxMExFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2YTQyMnAxMGxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBWICovCisgICAgICAgICAgICB7IDMsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVkE0NDRQMTBCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1dmE0NDRwMTBiZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gNCwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogViAqLworICAgICAgICAgICAgeyAzLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwTEVdID0geworICAgICAgICAubmFtZSA9ICJ5dXZhNDQ0cDEwbGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDQsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgICAgIHsgMywgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMFAxNkJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2YTQyMHAxNmJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBWICovCisgICAgICAgICAgICB7IDMsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVZBNDIwUDE2TEVdID0geworICAgICAgICAubmFtZSA9ICJ5dXZhNDIwcDE2bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDQsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAxLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgICAgIHsgMywgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVkE0MjJQMTZCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1dmE0MjJwMTZiZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gNCwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCAxNSB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCAxNSB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCAxNSB9LCAgICAgICAgLyogViAqLworICAgICAgICAgICAgeyAzLCAxLCAxLCAwLCAxNSB9LCAgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMlAxNkxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2YTQyMnAxNmxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBWICovCisgICAgICAgICAgICB7IDMsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2QkVdID0geworICAgICAgICAubmFtZSA9ICJ5dXZhNDQ0cDE2YmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDQsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgICAgIHsgMywgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVkE0NDRQMTZMRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1dmE0NDRwMTZsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gNCwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCAxNSB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCAxNSB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCAxNSB9LCAgICAgICAgLyogViAqLworICAgICAgICAgICAgeyAzLCAxLCAxLCAwLCAxNSB9LCAgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisjaWYgRkZfQVBJX1ZEUEFVCisgICAgW0FWX1BJWF9GTVRfVkRQQVVfSDI2NF0gPSB7CisgICAgICAgIC5uYW1lID0gInZkcGF1X2gyNjQiLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9WRFBBVV9NUEVHMV0gPSB7CisgICAgICAgIC5uYW1lID0gInZkcGF1X21wZWcxIiwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfVkRQQVVfTVBFRzJdID0geworICAgICAgICAubmFtZSA9ICJ2ZHBhdV9tcGVnMiIsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAxLAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1ZEUEFVX1dNVjNdID0geworICAgICAgICAubmFtZSA9ICJ2ZHBhdV93bXYzIiwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfVkRQQVVfVkMxXSA9IHsKKyAgICAgICAgLm5hbWUgPSAidmRwYXVfdmMxIiwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfVkRQQVVfTVBFRzRdID0geworICAgICAgICAubmFtZSA9ICJ2ZHBhdV9tcGVnNCIsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAxLAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCwKKyAgICB9LAorI2VuZGlmCisgICAgW0FWX1BJWF9GTVRfUkdCNDhCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInJnYjQ4YmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgNSwgMSwgMCwgMTUgfSwgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCA1LCAzLCAwLCAxNSB9LCAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDUsIDUsIDAsIDE1IH0sICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19CRSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1JHQjQ4TEVdID0geworICAgICAgICAubmFtZSA9ICJyZ2I0OGxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDUsIDEsIDAsIDE1IH0sICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgNSwgMywgMCwgMTUgfSwgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCA1LCA1LCAwLCAxNSB9LCAgICAgICAvKiBCICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9SR0JBNjRCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInJnYmE2NGJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDcsIDEsIDAsIDE1IH0sICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgNywgMywgMCwgMTUgfSwgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCA3LCA1LCAwLCAxNSB9LCAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDAsIDcsIDcsIDAsIDE1IH0sICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1JHQkE2NExFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAicmdiYTY0bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDQsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgNywgMSwgMCwgMTUgfSwgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCA3LCAzLCAwLCAxNSB9LCAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDcsIDUsIDAsIDE1IH0sICAgICAgIC8qIEIgKi8KKyAgICAgICAgICAgIHsgMCwgNywgNywgMCwgMTUgfSwgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNTY1QkVdID0geworICAgICAgICAubmFtZSA9ICJyZ2I1NjViZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAwLCAzLCA0IH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDEsIDEsIDUsIDUgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgNCB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNTY1TEVdID0geworICAgICAgICAubmFtZSA9ICJyZ2I1NjVsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAyLCAzLCA0IH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDEsIDEsIDUsIDUgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgNCB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNTU1QkVdID0geworICAgICAgICAubmFtZSA9ICJyZ2I1NTViZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAwLCAyLCA0IH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDEsIDEsIDUsIDQgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgNCB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNTU1TEVdID0geworICAgICAgICAubmFtZSA9ICJyZ2I1NTVsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAyLCAyLCA0IH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDEsIDEsIDUsIDQgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgNCB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNDQ0QkVdID0geworICAgICAgICAubmFtZSA9ICJyZ2I0NDRiZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAwLCAwLCAzIH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDEsIDEsIDQsIDMgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMyB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNDQ0TEVdID0geworICAgICAgICAubmFtZSA9ICJyZ2I0NDRsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAyLCAwLCAzIH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDEsIDEsIDQsIDMgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMyB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNDhCRV0gPSB7CisgICAgICAgIC5uYW1lID0gImJncjQ4YmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgNSwgNSwgMCwgMTUgfSwgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCA1LCAzLCAwLCAxNSB9LCAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDUsIDEsIDAsIDE1IH0sICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JHUjQ4TEVdID0geworICAgICAgICAubmFtZSA9ICJiZ3I0OGxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDUsIDUsIDAsIDE1IH0sICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgNSwgMywgMCwgMTUgfSwgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCA1LCAxLCAwLCAxNSB9LCAgICAgICAvKiBCICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9CR1JBNjRCRV0gPSB7CisgICAgICAgIC5uYW1lID0gImJncmE2NGJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDcsIDUsIDAsIDE1IH0sICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgNywgMywgMCwgMTUgfSwgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCA3LCAxLCAwLCAxNSB9LCAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDAsIDcsIDcsIDAsIDE1IH0sICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JHUkE2NExFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiYmdyYTY0bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDQsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgNywgNSwgMCwgMTUgfSwgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCA3LCAzLCAwLCAxNSB9LCAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDcsIDEsIDAsIDE1IH0sICAgICAgIC8qIEIgKi8KKyAgICAgICAgICAgIHsgMCwgNywgNywgMCwgMTUgfSwgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNTY1QkVdID0geworICAgICAgICAubmFtZSA9ICJiZ3I1NjViZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA0IH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDEsIDEsIDUsIDUgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMCwgMywgNCB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNTY1TEVdID0geworICAgICAgICAubmFtZSA9ICJiZ3I1NjVsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA0IH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDEsIDEsIDUsIDUgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMiwgMywgNCB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNTU1QkVdID0geworICAgICAgICAubmFtZSA9ICJiZ3I1NTViZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA0IH0sICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgNSwgNCB9LCAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDEsIDAsIDIsIDQgfSwgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JHUjU1NUxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiYmdyNTU1bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgNCB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAxLCAxLCA1LCA0IH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDAsIDEsIDIsIDIsIDQgfSwgICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JHUjQ0NEJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiYmdyNDQ0YmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMyB9LCAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDEsIDEsIDQsIDMgfSwgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCAxLCAwLCAwLCAzIH0sICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9CR1I0NDRMRV0gPSB7CisgICAgICAgIC5uYW1lID0gImJncjQ0NGxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDMgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgNCwgMyB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAwLCAxLCAyLCAwLCAzIH0sICAgICAgICAvKiBCICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9WQUFQSV9NT0NPXSA9IHsKKyAgICAgICAgLm5hbWUgPSAidmFhcGlfbW9jbyIsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAxLAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1ZBQVBJX0lEQ1RdID0geworICAgICAgICAubmFtZSA9ICJ2YWFwaV9pZGN0IiwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfVkFBUElfVkxEXSA9IHsKKyAgICAgICAgLm5hbWUgPSAidmFhcGlfdmxkIiwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUDlMRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1djQyMHA5bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAxLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQyMFA5QkVdID0geworICAgICAgICAubmFtZSA9ICJ5dXY0MjBwOWJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1djQyMHAxMGxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0MjBQMTBCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1djQyMHAxMGJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0MjBQMTJMRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1djQyMHAxMmxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDExIH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDExIH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDExIH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0MjBQMTJCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1djQyMHAxMmJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDExIH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDExIH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDExIH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0MjBQMTRMRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1djQyMHAxNGxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDEzIH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDEzIH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDEzIH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0MjBQMTRCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1djQyMHAxNGJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDEzIH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDEzIH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDEzIH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0MjBQMTZMRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1djQyMHAxNmxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0MjBQMTZCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1djQyMHAxNmJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDE1IH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0MjJQOUxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDIycDlsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUDlCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInl1djQyMnA5YmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQyMlAxMExFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDIycDEwbGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQyMlAxMEJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDIycDEwYmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQyMlAxMkxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDIycDEybGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTEgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgMTEgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTEgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQyMlAxMkJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDIycDEyYmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTEgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgMTEgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTEgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQyMlAxNExFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDIycDE0bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTMgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgMTMgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTMgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQyMlAxNEJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDIycDE0YmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTMgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgMTMgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTMgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQyMlAxNkxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDIycDE2bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQyMlAxNkJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDIycDE2YmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQ0NFAxNkxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDQ0cDE2bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQ0NFAxNkJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDQ0cDE2YmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTUgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQ0NFAxMExFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDQ0cDEwbGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQ0NFAxMEJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDQ0cDEwYmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lVVjQ0NFA5TEVdID0geworICAgICAgICAubmFtZSA9ICJ5dXY0NDRwOWxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZVVY0NDRQOUJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieXV2NDQ0cDliZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDEyTEVdID0geworICAgICAgICAubmFtZSA9ICJ5dXY0NDRwMTJsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCAxMSB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCAxMSB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCAxMSB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDEyQkVdID0geworICAgICAgICAubmFtZSA9ICJ5dXY0NDRwMTJiZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCAxMSB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCAxMSB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCAxMSB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDE0TEVdID0geworICAgICAgICAubmFtZSA9ICJ5dXY0NDRwMTRsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCAxMyB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCAxMyB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCAxMyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDE0QkVdID0geworICAgICAgICAubmFtZSA9ICJ5dXY0NDRwMTRiZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCAxMyB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCAxMyB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCAxMyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfRFhWQTJfVkxEXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiZHh2YTJfdmxkIiwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfVkRBX1ZMRF0gPSB7CisgICAgICAgIC5uYW1lID0gInZkYV92bGQiLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9ZQThdID0geworICAgICAgICAubmFtZSA9ICJ5YTgiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDIsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDAsIDEsIDIsIDAsIDcgfSwgICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgICAgICAuYWxpYXMgPSAiZ3JheThhIiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lBMTZMRV0gPSB7CisgICAgICAgIC5uYW1lID0gInlhMTZsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMiwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDMsIDEsIDAsIDE1IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDAsIDMsIDMsIDAsIDE1IH0sICAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1lBMTZCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInlhMTZiZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMiwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDMsIDEsIDAsIDE1IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDAsIDMsIDMsIDAsIDE1IH0sICAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0dCUlBdID0geworICAgICAgICAubmFtZSA9ICJnYnJwIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDIsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAxLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBCICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDlMRV0gPSB7CisgICAgICAgIC5uYW1lID0gImdicnA5bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9HQlJQOUJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiZ2JycDliZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCA4IH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDggfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgOCB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0dCUlAxMExFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiZ2JycDEwbGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9HQlJQMTBCRV0gPSB7CisgICAgICAgIC5uYW1lID0gImdicnAxMGJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCA5IH0sICAgICAgICAvKiBCICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDEyTEVdID0geworICAgICAgICAubmFtZSA9ICJnYnJwMTJsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCAxMSB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCAxMSB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCAxMSB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0dCUlAxMkJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiZ2JycDEyYmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTEgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTEgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMSwgMCwgMTEgfSwgICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9HQlJQMTRMRV0gPSB7CisgICAgICAgIC5uYW1lID0gImdicnAxNGxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDEzIH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDEzIH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDEzIH0sICAgICAgICAvKiBCICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDE0QkVdID0geworICAgICAgICAubmFtZSA9ICJnYnJwMTRiZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAyLCAxLCAxLCAwLCAxMyB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCAxMyB9LCAgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCAxMyB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0dCUlAxNkxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiZ2JycDE2bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTUgfSwgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCAxNSB9LCAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDE1IH0sICAgICAgIC8qIEIgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9HQlJQMTZCRV0gPSB7CisgICAgICAgIC5uYW1lID0gImdicnAxNmJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDE1IH0sICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTUgfSwgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCAxNSB9LCAgICAgICAvKiBCICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSQVBdID0geworICAgICAgICAubmFtZSA9ICJnYnJhcCIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gNCwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAyLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDAsIDEsIDAsIDcgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMSwgMCwgMSwgMCwgNyB9LCAgICAgICAgLyogQiAqLworICAgICAgICAgICAgeyAzLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSQVAxNkxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiZ2JyYXAxNmxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDIsIDEsIDEsIDAsIDE1IH0sICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgMTUgfSwgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAxLCAxLCAxLCAwLCAxNSB9LCAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDMsIDEsIDEsIDAsIDE1IH0sICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19SR0IgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9HQlJBUDE2QkVdID0geworICAgICAgICAubmFtZSA9ICJnYnJhcDE2YmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDQsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMiwgMSwgMSwgMCwgMTUgfSwgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAxLCAxLCAwLCAxNSB9LCAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDE1IH0sICAgICAgIC8qIEIgKi8KKyAgICAgICAgICAgIHsgMywgMSwgMSwgMCwgMTUgfSwgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1ZEUEFVXSA9IHsKKyAgICAgICAgLm5hbWUgPSAidmRwYXUiLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9YWVoxMkxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAieHl6MTJsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCA1LCAxLCA0LCAxMSB9LCAgICAgICAvKiBYICovCisgICAgICAgICAgICB7IDAsIDUsIDMsIDQsIDExIH0sICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMCwgNSwgNSwgNCwgMTEgfSwgICAgICAgLyogWiAqLworICAgICAgfSwKKyAgICAgIC8qLmZsYWdzID0gLS0gbm90IHVzZWQqLworICAgIH0sCisgICAgW0FWX1BJWF9GTVRfWFlaMTJCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInh5ejEyYmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgNSwgMSwgNCwgMTEgfSwgICAgICAgLyogWCAqLworICAgICAgICAgICAgeyAwLCA1LCAzLCA0LCAxMSB9LCAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDAsIDUsIDUsIDQsIDExIH0sICAgICAgIC8qIFogKi8KKyAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUsCisgICAgfSwKKworI2RlZmluZSBCQVlFUjhfREVTQ19DT01NT04gXAorICAgICAgICAubmJfY29tcG9uZW50cz0gMywgXAorICAgICAgICAubG9nMl9jaHJvbWFfdz0gMCwgXAorICAgICAgICAubG9nMl9jaHJvbWFfaD0gMCwgXAorICAgICAgICAuY29tcCA9IHsgICAgICAgICAgXAorICAgICAgICAgICAgezAsMCwwLDAsMX0sICAgXAorICAgICAgICAgICAgezAsMCwwLDAsM30sICAgXAorICAgICAgICAgICAgezAsMCwwLDAsMX0sICAgXAorICAgICAgICB9LCAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIEJBWUVSMTZfREVTQ19DT01NT04gXAorICAgICAgICAubmJfY29tcG9uZW50cz0gMywgXAorICAgICAgICAubG9nMl9jaHJvbWFfdz0gMCwgXAorICAgICAgICAubG9nMl9jaHJvbWFfaD0gMCwgXAorICAgICAgICAuY29tcCA9IHsgICAgICAgICAgXAorICAgICAgICAgICAgezAsMSwwLDAsIDN9LCAgXAorICAgICAgICAgICAgezAsMSwwLDAsIDd9LCAgXAorICAgICAgICAgICAgezAsMSwwLDAsIDN9LCAgXAorICAgICAgICB9LCAgICAgICAgICAgICAgICAgXAorCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfQkdHUjhdID0geworICAgICAgICAubmFtZSA9ICJiYXllcl9iZ2dyOCIsCisgICAgICAgIEJBWUVSOF9ERVNDX0NPTU1PTgorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfQkdHUjE2TEVdID0geworICAgICAgICAubmFtZSA9ICJiYXllcl9iZ2dyMTZsZSIsCisgICAgICAgIEJBWUVSMTZfREVTQ19DT01NT04KKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JBWUVSX0JHR1IxNkJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiYmF5ZXJfYmdncjE2YmUiLAorICAgICAgICBCQVlFUjE2X0RFU0NfQ09NTU9OCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9CQVlFUl9SR0dCOF0gPSB7CisgICAgICAgIC5uYW1lID0gImJheWVyX3JnZ2I4IiwKKyAgICAgICAgQkFZRVI4X0RFU0NfQ09NTU9OCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9CQVlFUl9SR0dCMTZMRV0gPSB7CisgICAgICAgIC5uYW1lID0gImJheWVyX3JnZ2IxNmxlIiwKKyAgICAgICAgQkFZRVIxNl9ERVNDX0NPTU1PTgorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfUkdHQjE2QkVdID0geworICAgICAgICAubmFtZSA9ICJiYXllcl9yZ2diMTZiZSIsCisgICAgICAgIEJBWUVSMTZfREVTQ19DT01NT04KKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JBWUVSX0dCUkc4XSA9IHsKKyAgICAgICAgLm5hbWUgPSAiYmF5ZXJfZ2JyZzgiLAorICAgICAgICBCQVlFUjhfREVTQ19DT01NT04KKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JBWUVSX0dCUkcxNkxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiYmF5ZXJfZ2JyZzE2bGUiLAorICAgICAgICBCQVlFUjE2X0RFU0NfQ09NTU9OCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9CQVlFUl9HQlJHMTZCRV0gPSB7CisgICAgICAgIC5uYW1lID0gImJheWVyX2dicmcxNmJlIiwKKyAgICAgICAgQkFZRVIxNl9ERVNDX0NPTU1PTgorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfR1JCRzhdID0geworICAgICAgICAubmFtZSA9ICJiYXllcl9ncmJnOCIsCisgICAgICAgIEJBWUVSOF9ERVNDX0NPTU1PTgorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfR1JCRzE2TEVdID0geworICAgICAgICAubmFtZSA9ICJiYXllcl9ncmJnMTZsZSIsCisgICAgICAgIEJBWUVSMTZfREVTQ19DT01NT04KKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0JBWUVSX0dSQkcxNkJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiYmF5ZXJfZ3JiZzE2YmUiLAorICAgICAgICBCQVlFUjE2X0RFU0NfQ09NTU9OCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9OVjE2XSA9IHsKKyAgICAgICAgLm5hbWUgPSAibnYxNiIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAwLCAxLCAwLCA3IH0sICAgICAgICAvKiBZICovCisgICAgICAgICAgICB7IDEsIDEsIDEsIDAsIDcgfSwgICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMSwgMSwgMiwgMCwgNyB9LCAgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfTlYyMExFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAibnYyMGxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDEsIDEsIDAsIDkgfSwgICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgMywgMSwgMCwgOSB9LCAgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAxLCAzLCAzLCAwLCA5IH0sICAgICAgICAvKiBWICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9OVjIwQkVdID0geworICAgICAgICAubmFtZSA9ICJudjIwYmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMSwgMSwgMCwgOSB9LCAgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCAzLCAxLCAwLCA5IH0sICAgICAgICAvKiBVICovCisgICAgICAgICAgICB7IDEsIDMsIDMsIDAsIDkgfSwgICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19CRSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1ZEQV0gPSB7CisgICAgICAgIC5uYW1lID0gInZkYSIsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29sb3JfcmFuZ2VfbmFtZXNbQVZDT0xfUkFOR0VfTkJdID0geworICAgICJ1bmtub3duIiwgInR2IiwgInBjIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb2xvcl9wcmltYXJpZXNfbmFtZXNbQVZDT0xfUFJJX05CXSA9IHsKKyAgICAicmVzZXJ2ZWQiLCAiYnQ3MDkiLCAidW5rbm93biIsICJyZXNlcnZlZCIsICJidDQ3MG0iLAorICAgICJidDQ3MGJnIiwgInNtcHRlMTcwbSIsICJzbXB0ZTI0MG0iLCAiZmlsbSIsICJidDIwMjAiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbG9yX3RyYW5zZmVyX25hbWVzW0FWQ09MX1RSQ19OQl0gPSB7CisgICAgInJlc2VydmVkIiwgImJ0NzA5IiwgInVua25vd24iLCAicmVzZXJ2ZWQiLCAiYnQ0NzBtIiwKKyAgICAiYnQ0NzBiZyIsICJzbXB0ZTE3MG0iLCAic21wdGUyNDBtIiwgImxpbmVhciIsICJsb2cxMDAiLAorICAgICJsb2czMTYiLCAiaWVjNjE5NjYtMi00IiwgImJ0MTM2MWUiLCAiaWVjNjE5NjYtMi0xIiwKKyAgICAiYnQyMDIwLTEwIiwgImJ0MjAyMC0yMCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29sb3Jfc3BhY2VfbmFtZXNbQVZDT0xfU1BDX05CXSA9IHsKKyAgICAiZ2JyIiwgImJ0NzA5IiwgInVua25vd24iLCAicmVzZXJ2ZWQiLCAiZmNjIiwKKyAgICAiYnQ0NzBiZyIsICJzbXB0ZTE3MG0iLCAic21wdGUyNDBtIiwgInljZ2NvIiwKKyAgICAiYnQyMDIwbmMiLCAiYnQyMDIwYyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY2hyb21hX2xvY2F0aW9uX25hbWVzW0FWQ0hST01BX0xPQ19OQl0gPSB7CisgICAgInVuc3BlY2lmaWVkIiwgImxlZnQiLCAiY2VudGVyIiwgInRvcGxlZnQiLAorICAgICJ0b3AiLCAiYm90dG9tbGVmdCIsICJib3R0b20iLAorfTsKKworRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworc3RhdGljIGVudW0gQVZQaXhlbEZvcm1hdCBnZXRfcGl4X2ZtdF9pbnRlcm5hbChjb25zdCBjaGFyICpuYW1lKQoreworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworCisgICAgZm9yIChwaXhfZm10ID0gMDsgcGl4X2ZtdCA8IEFWX1BJWF9GTVRfTkI7IHBpeF9mbXQrKykKKyAgICAgICAgaWYgKGF2X3BpeF9mbXRfZGVzY3JpcHRvcnNbcGl4X2ZtdF0ubmFtZSAmJgorICAgICAgICAgICAgKCFzdHJjbXAoYXZfcGl4X2ZtdF9kZXNjcmlwdG9yc1twaXhfZm10XS5uYW1lLCBuYW1lKSB8fAorICAgICAgICAgICAgIGF2X21hdGNoX25hbWUobmFtZSwgYXZfcGl4X2ZtdF9kZXNjcmlwdG9yc1twaXhfZm10XS5hbGlhcykpKQorICAgICAgICAgICAgcmV0dXJuIHBpeF9mbXQ7CisKKyAgICByZXR1cm4gQVZfUElYX0ZNVF9OT05FOworfQorCitjb25zdCBjaGFyICphdl9nZXRfcGl4X2ZtdF9uYW1lKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQoreworICAgIHJldHVybiAodW5zaWduZWQpcGl4X2ZtdCA8IEFWX1BJWF9GTVRfTkIgPworICAgICAgICBhdl9waXhfZm10X2Rlc2NyaXB0b3JzW3BpeF9mbXRdLm5hbWUgOiBOVUxMOworfQorCisjaWYgSEFWRV9CSUdFTkRJQU4KKyMgICBkZWZpbmUgWF9ORShiZSwgbGUpIGJlCisjZWxzZQorIyAgIGRlZmluZSBYX05FKGJlLCBsZSkgbGUKKyNlbmRpZgorCitlbnVtIEFWUGl4ZWxGb3JtYXQgYXZfZ2V0X3BpeF9mbXQoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKKworICAgIGlmICghc3RyY21wKG5hbWUsICJyZ2IzMiIpKQorICAgICAgICBuYW1lID0gWF9ORSgiYXJnYiIsICJiZ3JhIik7CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYmdyMzIiKSkKKyAgICAgICAgbmFtZSA9IFhfTkUoImFiZ3IiLCAicmdiYSIpOworCisgICAgcGl4X2ZtdCA9IGdldF9waXhfZm10X2ludGVybmFsKG5hbWUpOworICAgIGlmIChwaXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICBjaGFyIG5hbWUyWzMyXTsKKworICAgICAgICBzbnByaW50ZihuYW1lMiwgc2l6ZW9mKG5hbWUyKSwgIiVzJXMiLCBuYW1lLCBYX05FKCJiZSIsICJsZSIpKTsKKyAgICAgICAgcGl4X2ZtdCA9IGdldF9waXhfZm10X2ludGVybmFsKG5hbWUyKTsKKyAgICB9CisgICAgcmV0dXJuIHBpeF9mbXQ7Cit9CisKK2ludCBhdl9nZXRfYml0c19wZXJfcGl4ZWwoY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhkZXNjKQoreworICAgIGludCBjLCBiaXRzID0gMDsKKyAgICBpbnQgbG9nMl9waXhlbHMgPSBwaXhkZXNjLT5sb2cyX2Nocm9tYV93ICsgcGl4ZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIGZvciAoYyA9IDA7IGMgPCBwaXhkZXNjLT5uYl9jb21wb25lbnRzOyBjKyspIHsKKyAgICAgICAgaW50IHMgPSBjID09IDEgfHwgYyA9PSAyID8gMCA6IGxvZzJfcGl4ZWxzOworICAgICAgICBiaXRzICs9IChwaXhkZXNjLT5jb21wW2NdLmRlcHRoX21pbnVzMSArIDEpIDw8IHM7CisgICAgfQorCisgICAgcmV0dXJuIGJpdHMgPj4gbG9nMl9waXhlbHM7Cit9CisKK2ludCBhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4ZGVzYykKK3sKKyAgICBpbnQgYywgYml0cyA9IDA7CisgICAgaW50IGxvZzJfcGl4ZWxzID0gcGl4ZGVzYy0+bG9nMl9jaHJvbWFfdyArIHBpeGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgaW50IHN0ZXBzWzRdID0gezB9OworCisgICAgZm9yIChjID0gMDsgYyA8IHBpeGRlc2MtPm5iX2NvbXBvbmVudHM7IGMrKykgeworICAgICAgICBjb25zdCBBVkNvbXBvbmVudERlc2NyaXB0b3IgKmNvbXAgPSAmcGl4ZGVzYy0+Y29tcFtjXTsKKyAgICAgICAgaW50IHMgPSBjID09IDEgfHwgYyA9PSAyID8gMCA6IGxvZzJfcGl4ZWxzOworICAgICAgICBzdGVwc1tjb21wLT5wbGFuZV0gPSAoY29tcC0+c3RlcF9taW51czEgKyAxKSA8PCBzOworICAgIH0KKyAgICBmb3IgKGMgPSAwOyBjIDwgNDsgYysrKQorICAgICAgICBiaXRzICs9IHN0ZXBzW2NdOworCisgICAgaWYoIShwaXhkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CSVRTVFJFQU0pKQorICAgICAgICBiaXRzICo9IDg7CisKKyAgICByZXR1cm4gYml0cyA+PiBsb2cyX3BpeGVsczsKK30KKworY2hhciAqYXZfZ2V0X3BpeF9mbXRfc3RyaW5nKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQoreworICAgIC8qIHByaW50IGhlYWRlciAqLworICAgIGlmIChwaXhfZm10IDwgMCkgeworICAgICAgIHNucHJpbnRmIChidWYsIGJ1Zl9zaXplLCAibmFtZSIgIiBuYl9jb21wb25lbnRzIiAiIG5iX2JpdHMiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeGRlc2MgPSAmYXZfcGl4X2ZtdF9kZXNjcmlwdG9yc1twaXhfZm10XTsKKyAgICAgICAgc25wcmludGYoYnVmLCBidWZfc2l6ZSwgIiUtMTFzICU3ZCAlMTBkIiwgcGl4ZGVzYy0+bmFtZSwKKyAgICAgICAgICAgICAgICAgcGl4ZGVzYy0+bmJfY29tcG9uZW50cywgYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKHBpeGRlc2MpKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmOworfQorCitjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmF2X3BpeF9mbXRfZGVzY19nZXQoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgaWYgKHBpeF9mbXQgPCAwIHx8IHBpeF9mbXQgPj0gQVZfUElYX0ZNVF9OQikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICZhdl9waXhfZm10X2Rlc2NyaXB0b3JzW3BpeF9mbXRdOworfQorCitjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmF2X3BpeF9mbXRfZGVzY19uZXh0KGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcHJldikKK3sKKyAgICBpZiAoIXByZXYpCisgICAgICAgIHJldHVybiAmYXZfcGl4X2ZtdF9kZXNjcmlwdG9yc1swXTsKKyAgICB3aGlsZSAocHJldiAtIGF2X3BpeF9mbXRfZGVzY3JpcHRvcnMgPCBGRl9BUlJBWV9FTEVNUyhhdl9waXhfZm10X2Rlc2NyaXB0b3JzKSAtIDEpIHsKKyAgICAgICAgcHJldisrOworICAgICAgICBpZiAocHJldi0+bmFtZSkKKyAgICAgICAgICAgIHJldHVybiBwcmV2OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworZW51bSBBVlBpeGVsRm9ybWF0IGF2X3BpeF9mbXRfZGVzY19nZXRfaWQoY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjKQoreworICAgIGlmIChkZXNjIDwgYXZfcGl4X2ZtdF9kZXNjcmlwdG9ycyB8fAorICAgICAgICBkZXNjID49IGF2X3BpeF9mbXRfZGVzY3JpcHRvcnMgKyBGRl9BUlJBWV9FTEVNUyhhdl9waXhfZm10X2Rlc2NyaXB0b3JzKSkKKyAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfTk9ORTsKKworICAgIHJldHVybiBkZXNjIC0gYXZfcGl4X2ZtdF9kZXNjcmlwdG9yczsKK30KK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCitpbnQgYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpoX3NoaWZ0LCBpbnQgKnZfc2hpZnQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBpZiAoIWRlc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgKmhfc2hpZnQgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgICp2X3NoaWZ0ID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIHJldHVybiAwOworfQorCitpbnQgYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBpbnQgaSwgcGxhbmVzWzRdID0geyAwIH0sIHJldCA9IDA7CisKKyAgICBpZiAoIWRlc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVzYy0+bmJfY29tcG9uZW50czsgaSsrKQorICAgICAgICBwbGFuZXNbZGVzYy0+Y29tcFtpXS5wbGFuZV0gPSAxOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhwbGFuZXMpOyBpKyspCisgICAgICAgIHJldCArPSBwbGFuZXNbaV07CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBmZl9jaGVja19waXhmbXRfZGVzY3JpcHRvcnModm9pZCl7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGk9MDsgaTxGRl9BUlJBWV9FTEVNUyhhdl9waXhfZm10X2Rlc2NyaXB0b3JzKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZCA9ICZhdl9waXhfZm10X2Rlc2NyaXB0b3JzW2ldOworICAgICAgICB1aW50OF90IGZpbGxbNF1bOCs2KzNdID0ge3swfX07CisgICAgICAgIHVpbnQ4X3QgKmRhdGFbNF0gPSB7ZmlsbFswXSwgZmlsbFsxXSwgZmlsbFsyXSwgZmlsbFszXX07CisgICAgICAgIGludCBsaW5lc2l6ZVs0XSA9IHswLDAsMCwwfTsKKyAgICAgICAgdWludDE2X3QgdG1wWzJdOworCisgICAgICAgIGlmICghZC0+bmFtZSAmJiAhZC0+bmJfY29tcG9uZW50cyAmJiAhZC0+bG9nMl9jaHJvbWFfdyAmJiAhZC0+bG9nMl9jaHJvbWFfaCAmJiAhZC0+ZmxhZ3MpCisgICAgICAgICAgICBjb250aW51ZTsKKy8vICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIkNoZWNraW5nOiAlc1xuIiwgZC0+bmFtZSk7CisgICAgICAgIGF2X2Fzc2VydDAoZC0+bG9nMl9jaHJvbWFfdyA8PSAzKTsKKyAgICAgICAgYXZfYXNzZXJ0MChkLT5sb2cyX2Nocm9tYV9oIDw9IDMpOworICAgICAgICBhdl9hc3NlcnQwKGQtPm5iX2NvbXBvbmVudHMgPD0gNCk7CisgICAgICAgIGF2X2Fzc2VydDAoZC0+bmFtZSAmJiBkLT5uYW1lWzBdKTsKKyAgICAgICAgYXZfYXNzZXJ0MCgoZC0+bmJfY29tcG9uZW50cz09NCB8fCBkLT5uYl9jb21wb25lbnRzPT0yKSA9PSAhIShkLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSkpOworICAgICAgICBhdl9hc3NlcnQyKGF2X2dldF9waXhfZm10KGQtPm5hbWUpID09IGkpOworCisgICAgICAgIGZvciAoaj0wOyBqPEZGX0FSUkFZX0VMRU1TKGQtPmNvbXApOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IEFWQ29tcG9uZW50RGVzY3JpcHRvciAqYyA9ICZkLT5jb21wW2pdOworICAgICAgICAgICAgaWYoaj49ZC0+bmJfY29tcG9uZW50cykgeworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoIWMtPnBsYW5lICYmICFjLT5zdGVwX21pbnVzMSAmJiAhYy0+b2Zmc2V0X3BsdXMxICYmICFjLT5zaGlmdCAmJiAhYy0+ZGVwdGhfbWludXMxKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CSVRTVFJFQU0pIHsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKGMtPnN0ZXBfbWludXMxID49IGMtPmRlcHRoX21pbnVzMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoOCooYy0+c3RlcF9taW51czErMSkgPj0gYy0+ZGVwdGhfbWludXMxKzEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzdHJuY21wKGQtPm5hbWUsICJiYXllcl8iLCA2KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGF2X3JlYWRfaW1hZ2VfbGluZSh0bXAsICh2b2lkKilkYXRhLCBsaW5lc2l6ZSwgZCwgMCwgMCwgaiwgMiwgMCk7CisgICAgICAgICAgICBhdl9hc3NlcnQwKHRtcFswXSA9PSAwICYmIHRtcFsxXSA9PSAwKTsKKyAgICAgICAgICAgIHRtcFswXSA9IHRtcFsxXSA9ICgxPDwoYy0+ZGVwdGhfbWludXMxICsgMSkpIC0gMTsKKyAgICAgICAgICAgIGF2X3dyaXRlX2ltYWdlX2xpbmUodG1wLCBkYXRhLCBsaW5lc2l6ZSwgZCwgMCwgMCwgaiwgMik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworZW51bSBBVlBpeGVsRm9ybWF0IGF2X3BpeF9mbXRfc3dhcF9lbmRpYW5uZXNzKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4X2ZtdCk7CisgICAgY2hhciBuYW1lWzE2XTsKKyAgICBpbnQgaTsKKworICAgIGlmICghZGVzYyB8fCBzdHJsZW4oZGVzYy0+bmFtZSkgPCAyKQorICAgICAgICByZXR1cm4gQVZfUElYX0ZNVF9OT05FOworICAgIGF2X3N0cmxjcHkobmFtZSwgZGVzYy0+bmFtZSwgc2l6ZW9mKG5hbWUpKTsKKyAgICBpID0gc3RybGVuKG5hbWUpIC0gMjsKKyAgICBpZiAoc3RyY21wKG5hbWUgKyBpLCAiYmUiKSAmJiBzdHJjbXAobmFtZSArIGksICJsZSIpKQorICAgICAgICByZXR1cm4gQVZfUElYX0ZNVF9OT05FOworCisgICAgbmFtZVtpXSBePSAnYicgXiAnbCc7CisKKyAgICByZXR1cm4gZ2V0X3BpeF9mbXRfaW50ZXJuYWwobmFtZSk7Cit9CisKKyNkZWZpbmUgRkZfQ09MT1JfTkEgICAgICAtMQorI2RlZmluZSBGRl9DT0xPUl9SR0IgICAgICAwIC8qKjwgUkdCIGNvbG9yIHNwYWNlICovCisjZGVmaW5lIEZGX0NPTE9SX0dSQVkgICAgIDEgLyoqPCBncmF5IGNvbG9yIHNwYWNlICovCisjZGVmaW5lIEZGX0NPTE9SX1lVViAgICAgIDIgLyoqPCBZVVYgY29sb3Igc3BhY2UuIDE2IDw9IFkgPD0gMjM1LCAxNiA8PSBVLCBWIDw9IDI0MCAqLworI2RlZmluZSBGRl9DT0xPUl9ZVVZfSlBFRyAzIC8qKjwgWVVWIGNvbG9yIHNwYWNlLiAwIDw9IFkgPD0gMjU1LCAwIDw9IFUsIFYgPD0gMjU1ICovCisKKyNkZWZpbmUgcGl4ZGVzY19oYXNfYWxwaGEocGl4ZGVzYykgXAorICAgICgocGl4ZGVzYyktPm5iX2NvbXBvbmVudHMgPT0gMiB8fCAocGl4ZGVzYyktPm5iX2NvbXBvbmVudHMgPT0gNCB8fCAocGl4ZGVzYyktPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCkKKworCitzdGF0aWMgaW50IGdldF9jb2xvcl90eXBlKGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYykgeworICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwpCisgICAgICAgIHJldHVybiBGRl9DT0xPUl9SR0I7CisKKyAgICBpZihkZXNjLT5uYl9jb21wb25lbnRzID09IDEgfHwgZGVzYy0+bmJfY29tcG9uZW50cyA9PSAyKQorICAgICAgICByZXR1cm4gRkZfQ09MT1JfR1JBWTsKKworICAgIGlmKGRlc2MtPm5hbWUgJiYgIXN0cm5jbXAoZGVzYy0+bmFtZSwgInl1dmoiLCA0KSkKKyAgICAgICAgcmV0dXJuIEZGX0NPTE9SX1lVVl9KUEVHOworCisgICAgaWYoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUkdCKQorICAgICAgICByZXR1cm4gIEZGX0NPTE9SX1JHQjsKKworICAgIGlmKGRlc2MtPm5iX2NvbXBvbmVudHMgPT0gMCkKKyAgICAgICAgcmV0dXJuIEZGX0NPTE9SX05BOworCisgICAgcmV0dXJuIEZGX0NPTE9SX1lVVjsKK30KKworc3RhdGljIGludCBnZXRfcGl4X2ZtdF9kZXB0aChpbnQgKm1pbiwgaW50ICptYXgsIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4X2ZtdCk7CisgICAgaW50IGk7CisKKyAgICBpZiAoIWRlc2MgfHwgIWRlc2MtPm5iX2NvbXBvbmVudHMpIHsKKyAgICAgICAgKm1pbiA9ICptYXggPSAwOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgICptaW4gPSBJTlRfTUFYLCAqbWF4ID0gLUlOVF9NQVg7CisgICAgZm9yIChpID0gMDsgaSA8IGRlc2MtPm5iX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICAqbWluID0gRkZNSU4oZGVzYy0+Y29tcFtpXS5kZXB0aF9taW51czErMSwgKm1pbik7CisgICAgICAgICptYXggPSBGRk1BWChkZXNjLT5jb21wW2ldLmRlcHRoX21pbnVzMSsxLCAqbWF4KTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BpeF9mbXRfc2NvcmUoZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY19waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmxvc3NwLCB1bnNpZ25lZCBjb25zaWRlcikKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnNyY19kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzcmNfcGl4X2ZtdCk7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkc3RfZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZHN0X3BpeF9mbXQpOworICAgIGludCBzcmNfY29sb3IsIGRzdF9jb2xvcjsKKyAgICBpbnQgc3JjX21pbl9kZXB0aCwgc3JjX21heF9kZXB0aCwgZHN0X21pbl9kZXB0aCwgZHN0X21heF9kZXB0aDsKKyAgICBpbnQgcmV0LCBsb3NzLCBpLCBuYl9jb21wb25lbnRzOworICAgIGludCBzY29yZSA9IElOVF9NQVggLSAxOworCisgICAgaWYgKGRzdF9waXhfZm10ID49IEFWX1BJWF9GTVRfTkIgfHwgZHN0X3BpeF9mbXQgPD0gQVZfUElYX0ZNVF9OT05FKQorICAgICAgICByZXR1cm4gfjA7CisKKyAgICAvKiBjb21wdXRlIGxvc3MgKi8KKyAgICAqbG9zc3AgPSBsb3NzID0gMDsKKworICAgIGlmIChkc3RfcGl4X2ZtdCA9PSBzcmNfcGl4X2ZtdCkKKyAgICAgICAgcmV0dXJuIElOVF9NQVg7CisKKyAgICBpZiAoKHJldCA9IGdldF9waXhfZm10X2RlcHRoKCZzcmNfbWluX2RlcHRoLCAmc3JjX21heF9kZXB0aCwgc3JjX3BpeF9mbXQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBnZXRfcGl4X2ZtdF9kZXB0aCgmZHN0X21pbl9kZXB0aCwgJmRzdF9tYXhfZGVwdGgsIGRzdF9waXhfZm10KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc3JjX2NvbG9yID0gZ2V0X2NvbG9yX3R5cGUoc3JjX2Rlc2MpOworICAgIGRzdF9jb2xvciA9IGdldF9jb2xvcl90eXBlKGRzdF9kZXNjKTsKKyAgICBpZiAoZHN0X3BpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KQorICAgICAgICBuYl9jb21wb25lbnRzID0gRkZNSU4oc3JjX2Rlc2MtPm5iX2NvbXBvbmVudHMsIDQpOworICAgIGVsc2UKKyAgICAgICAgbmJfY29tcG9uZW50cyA9IEZGTUlOKHNyY19kZXNjLT5uYl9jb21wb25lbnRzLCBkc3RfZGVzYy0+bmJfY29tcG9uZW50cyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfY29tcG9uZW50czsgaSsrKSB7CisgICAgICAgIGludCBkZXB0aF9taW51czEgPSAoZHN0X3BpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSA/IDcvbmJfY29tcG9uZW50cyA6IGRzdF9kZXNjLT5jb21wW2ldLmRlcHRoX21pbnVzMTsKKyAgICAgICAgaWYgKHNyY19kZXNjLT5jb21wW2ldLmRlcHRoX21pbnVzMSA+IGRlcHRoX21pbnVzMSAmJiAoY29uc2lkZXIgJiBGRl9MT1NTX0RFUFRIKSkgeworICAgICAgICAgICAgbG9zcyB8PSBGRl9MT1NTX0RFUFRIOworICAgICAgICAgICAgc2NvcmUgLT0gNjU1MzYgPj4gZGVwdGhfbWludXMxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbnNpZGVyICYgRkZfTE9TU19SRVNPTFVUSU9OKSB7CisgICAgICAgIGlmIChkc3RfZGVzYy0+bG9nMl9jaHJvbWFfdyA+IHNyY19kZXNjLT5sb2cyX2Nocm9tYV93KSB7CisgICAgICAgICAgICBsb3NzIHw9IEZGX0xPU1NfUkVTT0xVVElPTjsKKyAgICAgICAgICAgIHNjb3JlIC09IDI1NiA8PCBkc3RfZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHN0X2Rlc2MtPmxvZzJfY2hyb21hX2ggPiBzcmNfZGVzYy0+bG9nMl9jaHJvbWFfaCkgeworICAgICAgICAgICAgbG9zcyB8PSBGRl9MT1NTX1JFU09MVVRJT047CisgICAgICAgICAgICBzY29yZSAtPSAyNTYgPDwgZHN0X2Rlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgICAgIH0KKyAgICAgICAgLy8gZG9uJ3QgZmF2b3IgNDIyIG92ZXIgNDIwIGlmIGRvd25zYW1wbGluZyBpcyBuZWVkZWQsIGJlY2F1c2UgNDIwIGhhcyBtdWNoIGJldHRlciBzdXBwb3J0IG9uIHRoZSBkZWNvZGVyIHNpZGUKKyAgICAgICAgaWYgKGRzdF9kZXNjLT5sb2cyX2Nocm9tYV93ID09IDEgJiYgc3JjX2Rlc2MtPmxvZzJfY2hyb21hX3cgPT0gMCAmJgorICAgICAgICAgICAgZHN0X2Rlc2MtPmxvZzJfY2hyb21hX2ggPT0gMSAmJiBzcmNfZGVzYy0+bG9nMl9jaHJvbWFfaCA9PSAwICkgeworICAgICAgICAgICAgc2NvcmUgKz0gNTEyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoY29uc2lkZXIgJiBGRl9MT1NTX0NPTE9SU1BBQ0UpCisgICAgc3dpdGNoKGRzdF9jb2xvcikgeworICAgIGNhc2UgRkZfQ09MT1JfUkdCOgorICAgICAgICBpZiAoc3JjX2NvbG9yICE9IEZGX0NPTE9SX1JHQiAmJgorICAgICAgICAgICAgc3JjX2NvbG9yICE9IEZGX0NPTE9SX0dSQVkpCisgICAgICAgICAgICBsb3NzIHw9IEZGX0xPU1NfQ09MT1JTUEFDRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9DT0xPUl9HUkFZOgorICAgICAgICBpZiAoc3JjX2NvbG9yICE9IEZGX0NPTE9SX0dSQVkpCisgICAgICAgICAgICBsb3NzIHw9IEZGX0xPU1NfQ09MT1JTUEFDRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9DT0xPUl9ZVVY6CisgICAgICAgIGlmIChzcmNfY29sb3IgIT0gRkZfQ09MT1JfWVVWKQorICAgICAgICAgICAgbG9zcyB8PSBGRl9MT1NTX0NPTE9SU1BBQ0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfQ09MT1JfWVVWX0pQRUc6CisgICAgICAgIGlmIChzcmNfY29sb3IgIT0gRkZfQ09MT1JfWVVWX0pQRUcgJiYKKyAgICAgICAgICAgIHNyY19jb2xvciAhPSBGRl9DT0xPUl9ZVVYgJiYKKyAgICAgICAgICAgIHNyY19jb2xvciAhPSBGRl9DT0xPUl9HUkFZKQorICAgICAgICAgICAgbG9zcyB8PSBGRl9MT1NTX0NPTE9SU1BBQ0U7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIGZhaWwgc2FmZSB0ZXN0ICovCisgICAgICAgIGlmIChzcmNfY29sb3IgIT0gZHN0X2NvbG9yKQorICAgICAgICAgICAgbG9zcyB8PSBGRl9MT1NTX0NPTE9SU1BBQ0U7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZihsb3NzICYgRkZfTE9TU19DT0xPUlNQQUNFKQorICAgICAgICBzY29yZSAtPSAobmJfY29tcG9uZW50cyAqIDY1NTM2KSA+PiBGRk1JTihkc3RfZGVzYy0+Y29tcFswXS5kZXB0aF9taW51czEsIHNyY19kZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSk7CisKKyAgICBpZiAoZHN0X2NvbG9yID09IEZGX0NPTE9SX0dSQVkgJiYKKyAgICAgICAgc3JjX2NvbG9yICE9IEZGX0NPTE9SX0dSQVkgJiYgKGNvbnNpZGVyICYgRkZfTE9TU19DSFJPTUEpKSB7CisgICAgICAgIGxvc3MgfD0gRkZfTE9TU19DSFJPTUE7CisgICAgICAgIHNjb3JlIC09IDIgKiA2NTUzNjsKKyAgICB9CisgICAgaWYgKCFwaXhkZXNjX2hhc19hbHBoYShkc3RfZGVzYykgJiYgKHBpeGRlc2NfaGFzX2FscGhhKHNyY19kZXNjKSAmJiAoY29uc2lkZXIgJiBGRl9MT1NTX0FMUEhBKSkpIHsKKyAgICAgICAgbG9zcyB8PSBGRl9MT1NTX0FMUEhBOworICAgICAgICBzY29yZSAtPSA2NTUzNjsKKyAgICB9CisgICAgaWYgKGRzdF9waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCAmJiAoY29uc2lkZXIgJiBGRl9MT1NTX0NPTE9SUVVBTlQpICYmCisgICAgICAgIChzcmNfcGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1BBTDggJiYgKHNyY19jb2xvciAhPSBGRl9DT0xPUl9HUkFZIHx8IChwaXhkZXNjX2hhc19hbHBoYShzcmNfZGVzYykgJiYgKGNvbnNpZGVyICYgRkZfTE9TU19BTFBIQSkpKSkpIHsKKyAgICAgICAgbG9zcyB8PSBGRl9MT1NTX0NPTE9SUVVBTlQ7CisgICAgICAgIHNjb3JlIC09IDY1NTM2OworICAgIH0KKworICAgICpsb3NzcCA9IGxvc3M7CisgICAgcmV0dXJuIHNjb3JlOworfQorCitpbnQgYXZfZ2V0X3BpeF9mbXRfbG9zcyhlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0X3BpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY19waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfYWxwaGEpCit7CisgICAgaW50IGxvc3M7CisgICAgaW50IHJldCA9IGdldF9waXhfZm10X3Njb3JlKGRzdF9waXhfZm10LCBzcmNfcGl4X2ZtdCwgJmxvc3MsIGhhc19hbHBoYSA/IH4wIDogfkZGX0xPU1NfQUxQSEEpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBsb3NzOworfQorCitlbnVtIEFWUGl4ZWxGb3JtYXQgYXZfZmluZF9iZXN0X3BpeF9mbXRfb2ZfMihlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0X3BpeF9mbXQxLCBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0X3BpeF9mbXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY19waXhfZm10LCBpbnQgaGFzX2FscGhhLCBpbnQgKmxvc3NfcHRyKQoreworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RfcGl4X2ZtdDsKKyAgICBpbnQgbG9zczEsIGxvc3MyLCBsb3NzX21hc2s7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjMSA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZHN0X3BpeF9mbXQxKTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MyID0gYXZfcGl4X2ZtdF9kZXNjX2dldChkc3RfcGl4X2ZtdDIpOworICAgIGludCBzY29yZTEsIHNjb3JlMjsKKworICAgIGxvc3NfbWFzaz0gbG9zc19wdHI/fipsb3NzX3B0cjp+MDsgLyogdXNlIGxvc3MgbWFzayBpZiBwcm92aWRlZCAqLworICAgIGlmKCFoYXNfYWxwaGEpCisgICAgICAgIGxvc3NfbWFzayAmPSB+RkZfTE9TU19BTFBIQTsKKworICAgIHNjb3JlMSA9IGdldF9waXhfZm10X3Njb3JlKGRzdF9waXhfZm10MSwgc3JjX3BpeF9mbXQsICZsb3NzMSwgbG9zc19tYXNrKTsKKyAgICBzY29yZTIgPSBnZXRfcGl4X2ZtdF9zY29yZShkc3RfcGl4X2ZtdDIsIHNyY19waXhfZm10LCAmbG9zczIsIGxvc3NfbWFzayk7CisKKyAgICBpZiAoc2NvcmUxID09IHNjb3JlMikgeworICAgICAgICBpZihhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGRlc2MyKSAhPSBhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGRlc2MxKSkgeworICAgICAgICAgICAgZHN0X3BpeF9mbXQgPSBhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGRlc2MyKSA8IGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoZGVzYzEpID8gZHN0X3BpeF9mbXQyIDogZHN0X3BpeF9mbXQxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0X3BpeF9mbXQgPSBkZXNjMi0+bmJfY29tcG9uZW50cyA8IGRlc2MxLT5uYl9jb21wb25lbnRzID8gZHN0X3BpeF9mbXQyIDogZHN0X3BpeF9mbXQxOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0X3BpeF9mbXQgPSBzY29yZTEgPCBzY29yZTIgPyBkc3RfcGl4X2ZtdDIgOiBkc3RfcGl4X2ZtdDE7CisgICAgfQorCisgICAgaWYgKGxvc3NfcHRyKQorICAgICAgICAqbG9zc19wdHIgPSBhdl9nZXRfcGl4X2ZtdF9sb3NzKGRzdF9waXhfZm10LCBzcmNfcGl4X2ZtdCwgaGFzX2FscGhhKTsKKyAgICByZXR1cm4gZHN0X3BpeF9mbXQ7Cit9CisKK2NvbnN0IGNoYXIgKmF2X2NvbG9yX3JhbmdlX25hbWUoZW51bSBBVkNvbG9yUmFuZ2UgcmFuZ2UpCit7CisgICAgcmV0dXJuICh1bnNpZ25lZCkgcmFuZ2UgPCBBVkNPTF9SQU5HRV9OQiA/CisgICAgICAgIGNvbG9yX3JhbmdlX25hbWVzW3JhbmdlXSA6IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKmF2X2NvbG9yX3ByaW1hcmllc19uYW1lKGVudW0gQVZDb2xvclByaW1hcmllcyBwcmltYXJpZXMpCit7CisgICAgcmV0dXJuICh1bnNpZ25lZCkgcHJpbWFyaWVzIDwgQVZDT0xfUFJJX05CID8KKyAgICAgICAgY29sb3JfcHJpbWFyaWVzX25hbWVzW3ByaW1hcmllc10gOiBOVUxMOworfQorCitjb25zdCBjaGFyICphdl9jb2xvcl90cmFuc2Zlcl9uYW1lKGVudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgdHJhbnNmZXIpCit7CisgICAgcmV0dXJuICh1bnNpZ25lZCkgdHJhbnNmZXIgPCBBVkNPTF9UUkNfTkIgPworICAgICAgICBjb2xvcl90cmFuc2Zlcl9uYW1lc1t0cmFuc2Zlcl0gOiBOVUxMOworfQorCitjb25zdCBjaGFyICphdl9jb2xvcl9zcGFjZV9uYW1lKGVudW0gQVZDb2xvclNwYWNlIHNwYWNlKQoreworICAgIHJldHVybiAodW5zaWduZWQpIHNwYWNlIDwgQVZDT0xfU1BDX05CID8KKyAgICAgICAgY29sb3Jfc3BhY2VfbmFtZXNbc3BhY2VdIDogTlVMTDsKK30KKworY29uc3QgY2hhciAqYXZfY2hyb21hX2xvY2F0aW9uX25hbWUoZW51bSBBVkNocm9tYUxvY2F0aW9uIGxvY2F0aW9uKQoreworICAgIHJldHVybiAodW5zaWduZWQpIGxvY2F0aW9uIDwgQVZDSFJPTUFfTE9DX05CID8KKyAgICAgICAgY2hyb21hX2xvY2F0aW9uX25hbWVzW2xvY2F0aW9uXSA6IE5VTEw7Cit9CisKKyNpZmRlZiBURVNUCisKK2ludCBtYWluKHZvaWQpeworICAgIGludCBpOworICAgIGludCBlcnI9MDsKKyAgICBpbnQgc2tpcCA9IDA7CisKKyAgICBmb3IgKGk9MDsgaTxBVl9QSVhfRk1UX05CKjI7IGkrKykgeworICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGkpOworICAgICAgICBpZighZGVzYyB8fCAhZGVzYy0+bmFtZSkgeworICAgICAgICAgICAgc2tpcCArKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChza2lwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlM2QgdW51c2VkIHBpeGVsIGZvcm1hdCB2YWx1ZXNcbiIsIHNraXApOworICAgICAgICAgICAgc2tpcCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAicGl4IGZtdCAlcyBhdmdfYnBwOiVkIGNvbG9ydHlwZTolZFxuIiwgZGVzYy0+bmFtZSwgYXZfZ2V0X3BhZGRlZF9iaXRzX3Blcl9waXhlbChkZXNjKSwgZ2V0X2NvbG9yX3R5cGUoZGVzYykpOworICAgICAgICBpZiAoKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEpKSAhPSAoZGVzYy0+bmJfY29tcG9uZW50cyAhPSAyICYmIGRlc2MtPm5iX2NvbXBvbmVudHMgIT0gNCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJBbHBoYSBmbGFnIG1pc21hdGNoXG4iKTsKKyAgICAgICAgICAgIGVyciA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvcGl4ZGVzYy5oIGIvZmZtcGVnL2xpYmF2dXRpbC9waXhkZXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzNzZiMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvcGl4ZGVzYy5oCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogcGl4ZWwgZm9ybWF0IGRlc2NyaXB0b3IKKyAqIENvcHlyaWdodCAoYykgMjAwOSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9QSVhERVNDX0gKKyNkZWZpbmUgQVZVVElMX1BJWERFU0NfSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImF0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJwaXhmbXQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQVZDb21wb25lbnREZXNjcmlwdG9yIHsKKyAgICAvKioKKyAgICAgKiBXaGljaCBvZiB0aGUgNCBwbGFuZXMgY29udGFpbnMgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB1aW50MTZfdCBwbGFuZSAgICAgICAgOiAyOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gMiBob3Jpem9udGFsbHkgY29uc2VjdXRpdmUgcGl4ZWxzIG1pbnVzIDEuCisgICAgICogRWxlbWVudHMgYXJlIGJpdHMgZm9yIGJpdHN0cmVhbSBmb3JtYXRzLCBieXRlcyBvdGhlcndpc2UuCisgICAgICovCisgICAgdWludDE2X3Qgc3RlcF9taW51czEgIDogMzsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBlbGVtZW50cyBiZWZvcmUgdGhlIGNvbXBvbmVudCBvZiB0aGUgZmlyc3QgcGl4ZWwgcGx1cyAxLgorICAgICAqIEVsZW1lbnRzIGFyZSBiaXRzIGZvciBiaXRzdHJlYW0gZm9ybWF0cywgYnl0ZXMgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHVpbnQxNl90IG9mZnNldF9wbHVzMSA6IDM7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyB0aGF0IG11c3QgYmUgc2hpZnRlZCBhd2F5CisgICAgICogdG8gZ2V0IHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICB1aW50MTZfdCBzaGlmdCAgICAgICAgOiAzOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvbXBvbmVudCBtaW51cyAxLgorICAgICAqLworICAgIHVpbnQxNl90IGRlcHRoX21pbnVzMSA6IDQ7Cit9IEFWQ29tcG9uZW50RGVzY3JpcHRvcjsKKworLyoqCisgKiBEZXNjcmlwdG9yIHRoYXQgdW5hbWJpZ3VvdXNseSBkZXNjcmliZXMgaG93IHRoZSBiaXRzIG9mIGEgcGl4ZWwgYXJlCisgKiBzdG9yZWQgaW4gdGhlIHVwIHRvIDQgZGF0YSBwbGFuZXMgb2YgYW4gaW1hZ2UuIEl0IGFsc28gc3RvcmVzIHRoZQorICogc3Vic2FtcGxpbmcgZmFjdG9ycyBhbmQgbnVtYmVyIG9mIGNvbXBvbmVudHMuCisgKgorICogQG5vdGUgVGhpcyBpcyBzZXBhcmF0ZSBvZiB0aGUgY29sb3JzcGFjZSAoUkdCLCBZQ2JDciwgWVBiUHIsIEpQRUctc3R5bGUgWVVWCisgKiAgICAgICBhbmQgYWxsIHRoZSBZVVYgdmFyaWFudHMpIEFWUGl4Rm10RGVzY3JpcHRvciBqdXN0IHN0b3JlcyBob3cgdmFsdWVzCisgKiAgICAgICBhcmUgc3RvcmVkIG5vdCB3aGF0IHRoZXNlIHZhbHVlcyByZXByZXNlbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWUGl4Rm10RGVzY3JpcHRvciB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICB1aW50OF90IG5iX2NvbXBvbmVudHM7ICAvLy88IFRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBlYWNoIHBpeGVsIGhhcywgKDEtNCkKKworICAgIC8qKgorICAgICAqIEFtb3VudCB0byBzaGlmdCB0aGUgbHVtYSB3aWR0aCByaWdodCB0byBmaW5kIHRoZSBjaHJvbWEgd2lkdGguCisgICAgICogRm9yIFlWMTIgdGhpcyBpcyAxIGZvciBleGFtcGxlLgorICAgICAqIGNocm9tYV93aWR0aCA9IC0oKC1sdW1hX3dpZHRoKSA+PiBsb2cyX2Nocm9tYV93KQorICAgICAqIFRoZSBub3RlIGFib3ZlIGlzIG5lZWRlZCB0byBlbnN1cmUgcm91bmRpbmcgdXAuCisgICAgICogVGhpcyB2YWx1ZSBvbmx5IHJlZmVycyB0byB0aGUgY2hyb21hIGNvbXBvbmVudHMuCisgICAgICovCisgICAgdWludDhfdCBsb2cyX2Nocm9tYV93OyAgLy8vPCBjaHJvbWFfd2lkdGggPSAtKCgtbHVtYV93aWR0aCApPj5sb2cyX2Nocm9tYV93KQorCisgICAgLyoqCisgICAgICogQW1vdW50IHRvIHNoaWZ0IHRoZSBsdW1hIGhlaWdodCByaWdodCB0byBmaW5kIHRoZSBjaHJvbWEgaGVpZ2h0LgorICAgICAqIEZvciBZVjEyIHRoaXMgaXMgMSBmb3IgZXhhbXBsZS4KKyAgICAgKiBjaHJvbWFfaGVpZ2h0PSAtKCgtbHVtYV9oZWlnaHQpID4+IGxvZzJfY2hyb21hX2gpCisgICAgICogVGhlIG5vdGUgYWJvdmUgaXMgbmVlZGVkIHRvIGVuc3VyZSByb3VuZGluZyB1cC4KKyAgICAgKiBUaGlzIHZhbHVlIG9ubHkgcmVmZXJzIHRvIHRoZSBjaHJvbWEgY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICB1aW50OF90IGxvZzJfY2hyb21hX2g7CisgICAgdWludDhfdCBmbGFnczsKKworICAgIC8qKgorICAgICAqIFBhcmFtZXRlcnMgdGhhdCBkZXNjcmliZSBob3cgcGl4ZWxzIGFyZSBwYWNrZWQuCisgICAgICogSWYgdGhlIGZvcm1hdCBoYXMgMiBvciA0IGNvbXBvbmVudHMsIHRoZW4gYWxwaGEgaXMgbGFzdC4KKyAgICAgKiBJZiB0aGUgZm9ybWF0IGhhcyAxIG9yIDIgY29tcG9uZW50cywgdGhlbiBsdW1hIGlzIDAuCisgICAgICogSWYgdGhlIGZvcm1hdCBoYXMgMyBvciA0IGNvbXBvbmVudHMsCisgICAgICogaWYgdGhlIFJHQiBmbGFnIGlzIHNldCB0aGVuIDAgaXMgcmVkLCAxIGlzIGdyZWVuIGFuZCAyIGlzIGJsdWU7CisgICAgICogb3RoZXJ3aXNlIDAgaXMgbHVtYSwgMSBpcyBjaHJvbWEtVSBhbmQgMiBpcyBjaHJvbWEtVi4KKyAgICAgKi8KKyAgICBBVkNvbXBvbmVudERlc2NyaXB0b3IgY29tcFs0XTsKKworICAgIC8qKgorICAgICAqIEFsdGVybmF0aXZlIGNvbW1hLXNlcGFyYXRlZCBuYW1lcy4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICphbGlhczsKK30gQVZQaXhGbXREZXNjcmlwdG9yOworCisvKioKKyAqIFBpeGVsIGZvcm1hdCBpcyBiaWctZW5kaWFuLgorICovCisjZGVmaW5lIEFWX1BJWF9GTVRfRkxBR19CRSAgICAgICAgICAgKDEgPDwgMCkKKy8qKgorICogUGl4ZWwgZm9ybWF0IGhhcyBhIHBhbGV0dGUgaW4gZGF0YVsxXSwgdmFsdWVzIGFyZSBpbmRleGVzIGluIHRoaXMgcGFsZXR0ZS4KKyAqLworI2RlZmluZSBBVl9QSVhfRk1UX0ZMQUdfUEFMICAgICAgICAgICgxIDw8IDEpCisvKioKKyAqIEFsbCB2YWx1ZXMgb2YgYSBjb21wb25lbnQgYXJlIGJpdC13aXNlIHBhY2tlZCBlbmQgdG8gZW5kLgorICovCisjZGVmaW5lIEFWX1BJWF9GTVRfRkxBR19CSVRTVFJFQU0gICAgKDEgPDwgMikKKy8qKgorICogUGl4ZWwgZm9ybWF0IGlzIGFuIEhXIGFjY2VsZXJhdGVkIGZvcm1hdC4KKyAqLworI2RlZmluZSBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCAgICAgICgxIDw8IDMpCisvKioKKyAqIEF0IGxlYXN0IG9uZSBwaXhlbCBjb21wb25lbnQgaXMgbm90IGluIHRoZSBmaXJzdCBkYXRhIHBsYW5lLgorICovCisjZGVmaW5lIEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgICAgICAgKDEgPDwgNCkKKy8qKgorICogVGhlIHBpeGVsIGZvcm1hdCBjb250YWlucyBSR0ItbGlrZSBkYXRhIChhcyBvcHBvc2VkIHRvIFlVVi9ncmF5c2NhbGUpLgorICovCisjZGVmaW5lIEFWX1BJWF9GTVRfRkxBR19SR0IgICAgICAgICAgKDEgPDwgNSkKKy8qKgorICogVGhlIHBpeGVsIGZvcm1hdCBpcyAicHNldWRvLXBhbGV0dGVkIi4gVGhpcyBtZWFucyB0aGF0IEZGbXBlZyB0cmVhdHMgaXQgYXMKKyAqIHBhbGV0dGVkIGludGVybmFsbHksIGJ1dCB0aGUgcGFsZXR0ZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGRlY29kZXIgYW5kIGlzIG5vdAorICogc3RvcmVkIGluIHRoZSBmaWxlLgorICovCisjZGVmaW5lIEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwgICAgKDEgPDwgNikKKy8qKgorICogVGhlIHBpeGVsIGZvcm1hdCBoYXMgYW4gYWxwaGEgY2hhbm5lbC4KKyAqLworI2RlZmluZSBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEgICAgICAgICgxIDw8IDcpCisKKyNpZiBGRl9BUElfUElYX0ZNVAorLyoqCisgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIEFWX1BJWF9GTVRfRkxBR18qIGZsYWdzCisgKi8KKyNkZWZpbmUgUElYX0ZNVF9CRSAgICAgICAgQVZfUElYX0ZNVF9GTEFHX0JFCisjZGVmaW5lIFBJWF9GTVRfUEFMICAgICAgIEFWX1BJWF9GTVRfRkxBR19QQUwKKyNkZWZpbmUgUElYX0ZNVF9CSVRTVFJFQU0gQVZfUElYX0ZNVF9GTEFHX0JJVFNUUkVBTQorI2RlZmluZSBQSVhfRk1UX0hXQUNDRUwgICBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTAorI2RlZmluZSBQSVhfRk1UX1BMQU5BUiAgICBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSCisjZGVmaW5lIFBJWF9GTVRfUkdCICAgICAgIEFWX1BJWF9GTVRfRkxBR19SR0IKKyNkZWZpbmUgUElYX0ZNVF9QU0VVRE9QQUwgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTAorI2RlZmluZSBQSVhfRk1UX0FMUEhBICAgICBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEKKyNlbmRpZgorCisjaWYgRkZfQVBJX1BJWF9GTVRfREVTQworLyoqCisgKiBUaGUgYXJyYXkgb2YgYWxsIHRoZSBwaXhlbCBmb3JtYXQgZGVzY3JpcHRvcnMuCisgKi8KK2V4dGVybiBhdHRyaWJ1dGVfZGVwcmVjYXRlZCBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgYXZfcGl4X2ZtdF9kZXNjcmlwdG9yc1tdOworI2VuZGlmCisKKy8qKgorICogUmVhZCBhIGxpbmUgZnJvbSBhbiBpbWFnZSwgYW5kIHdyaXRlIHRoZSB2YWx1ZXMgb2YgdGhlCisgKiBwaXhlbCBmb3JtYXQgY29tcG9uZW50IGMgdG8gZHN0LgorICoKKyAqIEBwYXJhbSBkYXRhIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBwb2ludGVycyB0byB0aGUgcGxhbmVzIG9mIHRoZSBpbWFnZQorICogQHBhcmFtIGxpbmVzaXplIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBsaW5lc2l6ZXMgb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gZGVzYyB0aGUgcGl4ZWwgZm9ybWF0IGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZQorICogQHBhcmFtIHggdGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gcmVhZAorICogQHBhcmFtIHkgdGhlIHZlcnRpY2FsIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBpeGVsIHRvIHJlYWQKKyAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgbGluZSB0byByZWFkLCB0aGF0IGlzIHRoZSBudW1iZXIgb2YKKyAqIHZhbHVlcyB0byB3cml0ZSB0byBkc3QKKyAqIEBwYXJhbSByZWFkX3BhbF9jb21wb25lbnQgaWYgbm90IHplcm8gYW5kIHRoZSBmb3JtYXQgaXMgYSBwYWxldHRlZAorICogZm9ybWF0IHdyaXRlcyB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhbGV0dGUKKyAqIGNvbXBvbmVudCBjIGluIGRhdGFbMV0gdG8gZHN0LCByYXRoZXIgdGhhbiB0aGUgcGFsZXR0ZSBpbmRleGVzIGluCisgKiBkYXRhWzBdLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIHRoZSBmb3JtYXQgaXMgbm90IHBhbGV0dGVkLgorICovCit2b2lkIGF2X3JlYWRfaW1hZ2VfbGluZSh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50OF90ICpkYXRhWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxpbmVzaXplWzRdLCBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCBjLCBpbnQgdywgaW50IHJlYWRfcGFsX2NvbXBvbmVudCk7CisKKy8qKgorICogV3JpdGUgdGhlIHZhbHVlcyBmcm9tIHNyYyB0byB0aGUgcGl4ZWwgZm9ybWF0IGNvbXBvbmVudCBjIG9mIGFuCisgKiBpbWFnZSBsaW5lLgorICoKKyAqIEBwYXJhbSBzcmMgYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIHRvIHdyaXRlCisgKiBAcGFyYW0gZGF0YSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgcG9pbnRlcnMgdG8gdGhlIHBsYW5lcyBvZiB0aGUKKyAqIGltYWdlIHRvIHdyaXRlIGludG8uIEl0IGlzIHN1cHBvc2VkIHRvIGJlIHplcm9lZC4KKyAqIEBwYXJhbSBsaW5lc2l6ZSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgbGluZXNpemVzIG9mIHRoZSBpbWFnZQorICogQHBhcmFtIGRlc2MgdGhlIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UKKyAqIEBwYXJhbSB4IHRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBpeGVsIHRvIHdyaXRlCisgKiBAcGFyYW0geSB0aGUgdmVydGljYWwgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gd3JpdGUKKyAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgbGluZSB0byB3cml0ZSwgdGhhdCBpcyB0aGUgbnVtYmVyIG9mCisgKiB2YWx1ZXMgdG8gd3JpdGUgdG8gdGhlIGltYWdlIGxpbmUKKyAqLwordm9pZCBhdl93cml0ZV9pbWFnZV9saW5lKGNvbnN0IHVpbnQxNl90ICpzcmMsIHVpbnQ4X3QgKmRhdGFbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxpbmVzaXplWzRdLCBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgYywgaW50IHcpOworCisvKioKKyAqIFJldHVybiB0aGUgcGl4ZWwgZm9ybWF0IGNvcnJlc3BvbmRpbmcgdG8gbmFtZS4KKyAqCisgKiBJZiB0aGVyZSBpcyBubyBwaXhlbCBmb3JtYXQgd2l0aCBuYW1lIG5hbWUsIHRoZW4gbG9va3MgZm9yIGEKKyAqIHBpeGVsIGZvcm1hdCB3aXRoIHRoZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hdGl2ZSBlbmRpYW4KKyAqIGZvcm1hdCBvZiBuYW1lLgorICogRm9yIGV4YW1wbGUgaW4gYSBsaXR0bGUtZW5kaWFuIHN5c3RlbSwgZmlyc3QgbG9va3MgZm9yICJncmF5MTYiLAorICogdGhlbiBmb3IgImdyYXkxNmxlIi4KKyAqCisgKiBGaW5hbGx5IGlmIG5vIHBpeGVsIGZvcm1hdCBoYXMgYmVlbiBmb3VuZCwgcmV0dXJucyBBVl9QSVhfRk1UX05PTkUuCisgKi8KK2VudW0gQVZQaXhlbEZvcm1hdCBhdl9nZXRfcGl4X2ZtdChjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgZm9yIGEgcGl4ZWwgZm9ybWF0LCBOVUxMIGluIGNhc2UgcGl4X2ZtdCBpcworICogdW5rbm93bi4KKyAqCisgKiBAc2VlIGF2X2dldF9waXhfZm10KCksIGF2X2dldF9waXhfZm10X3N0cmluZygpCisgKi8KK2NvbnN0IGNoYXIgKmF2X2dldF9waXhfZm10X25hbWUoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpOworCisvKioKKyAqIFByaW50IGluIGJ1ZiB0aGUgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBpeGVsIGZvcm1hdCB3aXRoCisgKiBudW1iZXIgcGl4X2ZtdCwgb3IgYSBoZWFkZXIgaWYgcGl4X2ZtdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBAcGFyYW0gYnVmIHRoZSBidWZmZXIgd2hlcmUgdG8gd3JpdGUgdGhlIHN0cmluZworICogQHBhcmFtIGJ1Zl9zaXplIHRoZSBzaXplIG9mIGJ1ZgorICogQHBhcmFtIHBpeF9mbXQgdGhlIG51bWJlciBvZiB0aGUgcGl4ZWwgZm9ybWF0IHRvIHByaW50IHRoZQorICogY29ycmVzcG9uZGluZyBpbmZvIHN0cmluZywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSB0byBwcmludCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgaGVhZGVyLgorICovCitjaGFyICphdl9nZXRfcGl4X2ZtdF9zdHJpbmcoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpOworCisvKioKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIHVzZWQgYnkgdGhlIHBpeGVsIGZvcm1hdAorICogZGVzY3JpYmVkIGJ5IHBpeGRlc2MuIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyCisgKiBvZiBiaXRzIHBlciBzYW1wbGUuCisgKgorICogVGhlIHJldHVybmVkIG51bWJlciBvZiBiaXRzIHJlZmVycyB0byB0aGUgbnVtYmVyIG9mIGJpdHMgYWN0dWFsbHkKKyAqIHVzZWQgZm9yIHN0b3JpbmcgdGhlIHBpeGVsIGluZm9ybWF0aW9uLCB0aGF0IGlzIHBhZGRpbmcgYml0cyBhcmUKKyAqIG5vdCBjb3VudGVkLgorICovCitpbnQgYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4ZGVzYyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgZm9yIHRoZSBwaXhlbCBmb3JtYXQKKyAqIGRlc2NyaWJlZCBieSBwaXhkZXNjLCBpbmNsdWRpbmcgYW55IHBhZGRpbmcgb3IgdW51c2VkIGJpdHMuCisgKi8KK2ludCBhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4ZGVzYyk7CisKKy8qKgorICogQHJldHVybiBhIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9yIGZvciBwcm92aWRlZCBwaXhlbCBmb3JtYXQgb3IgTlVMTCBpZgorICogdGhpcyBwaXhlbCBmb3JtYXQgaXMgdW5rbm93bi4KKyAqLworY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICphdl9waXhfZm10X2Rlc2NfZ2V0KGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KTsKKworLyoqCisgKiBJdGVyYXRlIG92ZXIgYWxsIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9ycyBrbm93biB0byBsaWJhdnV0aWwuCisgKgorICogQHBhcmFtIHByZXYgcHJldmlvdXMgZGVzY3JpcHRvci4gTlVMTCB0byBnZXQgdGhlIGZpcnN0IGRlc2NyaXB0b3IuCisgKgorICogQHJldHVybiBuZXh0IGRlc2NyaXB0b3Igb3IgTlVMTCBhZnRlciB0aGUgbGFzdCBkZXNjcmlwdG9yCisgKi8KK2NvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqYXZfcGl4X2ZtdF9kZXNjX25leHQoY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwcmV2KTsKKworLyoqCisgKiBAcmV0dXJuIGFuIEFWUGl4ZWxGb3JtYXQgaWQgZGVzY3JpYmVkIGJ5IGRlc2MsIG9yIEFWX1BJWF9GTVRfTk9ORSBpZiBkZXNjCisgKiBpcyBub3QgYSB2YWxpZCBwb2ludGVyIHRvIGEgcGl4ZWwgZm9ybWF0IGRlc2NyaXB0b3IuCisgKi8KK2VudW0gQVZQaXhlbEZvcm1hdCBhdl9waXhfZm10X2Rlc2NfZ2V0X2lkKGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyk7CisKKy8qKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byBhY2Nlc3MgbG9nMl9jaHJvbWFfdyBsb2cyX2Nocm9tYV9oIGZyb20KKyAqIHRoZSBwaXhlbCBmb3JtYXQgQVZQaXhGbXREZXNjcmlwdG9yLgorICoKKyAqIFNlZSBhdl9nZXRfY2hyb21hX3N1Yl9zYW1wbGUoKSBmb3IgYSBmdW5jdGlvbiB0aGF0IGFzc2VydHMgYQorICogdmFsaWQgcGl4ZWwgZm9ybWF0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yIGNvZGUuCisgKiBJdHMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlIHVubGVzcworICogeW91IGRvIGNoZWNrIHRoZSByZXR1cm4gY29kZSEKKyAqCisgKiBAcGFyYW1baW5dICBwaXhfZm10IHRoZSBwaXhlbCBmb3JtYXQKKyAqIEBwYXJhbVtvdXRdIGhfc2hpZnQgc3RvcmUgbG9nMl9jaHJvbWFfdworICogQHBhcmFtW291dF0gdl9zaGlmdCBzdG9yZSBsb2cyX2Nocm9tYV9oCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIEFWRVJST1IoRU5PU1lTKSBvbiBpbnZhbGlkIG9yIHVua25vd24gcGl4ZWwgZm9ybWF0CisgKi8KK2ludCBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmhfc2hpZnQsIGludCAqdl9zaGlmdCk7CisKKy8qKgorICogQHJldHVybiBudW1iZXIgb2YgcGxhbmVzIGluIHBpeF9mbXQsIGEgbmVnYXRpdmUgQVZFUlJPUiBpZiBwaXhfZm10IGlzIG5vdCBhCisgKiB2YWxpZCBwaXhlbCBmb3JtYXQuCisgKi8KK2ludCBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCk7CisKK3ZvaWQgZmZfY2hlY2tfcGl4Zm10X2Rlc2NyaXB0b3JzKHZvaWQpOworCisvKioKKyAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gc3dhcCB0aGUgZW5kaWFubmVzcyBvZiBhIHBpeGVsIGZvcm1hdC4KKyAqCisgKiBAcGFyYW1baW5dICBwaXhfZm10IHRoZSBwaXhlbCBmb3JtYXQKKyAqCisgKiBAcmV0dXJuIHBpeGVsIGZvcm1hdCB3aXRoIHN3YXBwZWQgZW5kaWFubmVzcyBpZiBpdCBleGlzdHMsCisgKiBvdGhlcndpc2UgQVZfUElYX0ZNVF9OT05FCisgKi8KK2VudW0gQVZQaXhlbEZvcm1hdCBhdl9waXhfZm10X3N3YXBfZW5kaWFubmVzcyhlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCk7CisKKyNkZWZpbmUgRkZfTE9TU19SRVNPTFVUSU9OICAweDAwMDEgLyoqPCBsb3NzIGR1ZSB0byByZXNvbHV0aW9uIGNoYW5nZSAqLworI2RlZmluZSBGRl9MT1NTX0RFUFRIICAgICAgIDB4MDAwMiAvKio8IGxvc3MgZHVlIHRvIGNvbG9yIGRlcHRoIGNoYW5nZSAqLworI2RlZmluZSBGRl9MT1NTX0NPTE9SU1BBQ0UgIDB4MDAwNCAvKio8IGxvc3MgZHVlIHRvIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgRkZfTE9TU19BTFBIQSAgICAgICAweDAwMDggLyoqPCBsb3NzIG9mIGFscGhhIGJpdHMgKi8KKyNkZWZpbmUgRkZfTE9TU19DT0xPUlFVQU5UICAweDAwMTAgLyoqPCBsb3NzIGR1ZSB0byBjb2xvciBxdWFudGl6YXRpb24gKi8KKyNkZWZpbmUgRkZfTE9TU19DSFJPTUEgICAgICAweDAwMjAgLyoqPCBsb3NzIG9mIGNocm9tYSAoZS5nLiBSR0IgdG8gZ3JheSBjb252ZXJzaW9uKSAqLworCisvKioKKyAqIENvbXB1dGUgd2hhdCBraW5kIG9mIGxvc3NlcyB3aWxsIG9jY3VyIHdoZW4gY29udmVydGluZyBmcm9tIG9uZSBzcGVjaWZpYworICogcGl4ZWwgZm9ybWF0IHRvIGFub3RoZXIuCisgKiBXaGVuIGNvbnZlcnRpbmcgZnJvbSBvbmUgcGl4ZWwgZm9ybWF0IHRvIGFub3RoZXIsIGluZm9ybWF0aW9uIGxvc3MgbWF5IG9jY3VyLgorICogRm9yIGV4YW1wbGUsIHdoZW4gY29udmVydGluZyBmcm9tIFJHQjI0IHRvIEdSQVksIHRoZSBjb2xvciBpbmZvcm1hdGlvbiB3aWxsCisgKiBiZSBsb3N0LiBTaW1pbGFybHksIG90aGVyIGxvc3NlcyBvY2N1ciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBzb21lIGZvcm1hdHMgdG8KKyAqIG90aGVyIGZvcm1hdHMuIFRoZXNlIGxvc3NlcyBjYW4gaW52b2x2ZSBsb3NzIG9mIGNocm9tYSwgYnV0IGFsc28gbG9zcyBvZgorICogcmVzb2x1dGlvbiwgbG9zcyBvZiBjb2xvciBkZXB0aCwgbG9zcyBkdWUgdG8gdGhlIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24sIGxvc3MKKyAqIG9mIHRoZSBhbHBoYSBiaXRzIG9yIGxvc3MgZHVlIHRvIGNvbG9yIHF1YW50aXphdGlvbi4KKyAqIGF2X2dldF9maXhfZm10X2xvc3MoKSBpbmZvcm1zIHlvdSBhYm91dCB0aGUgdmFyaW91cyB0eXBlcyBvZiBsb3NzZXMKKyAqIHdoaWNoIHdpbGwgb2NjdXIgd2hlbiBjb252ZXJ0aW5nIGZyb20gb25lIHBpeGVsIGZvcm1hdCB0byBhbm90aGVyLgorICoKKyAqIEBwYXJhbVtpbl0gZHN0X3BpeF9mbXQgZGVzdGluYXRpb24gcGl4ZWwgZm9ybWF0CisgKiBAcGFyYW1baW5dIHNyY19waXhfZm10IHNvdXJjZSBwaXhlbCBmb3JtYXQKKyAqIEBwYXJhbVtpbl0gaGFzX2FscGhhIFdoZXRoZXIgdGhlIHNvdXJjZSBwaXhlbCBmb3JtYXQgYWxwaGEgY2hhbm5lbCBpcyB1c2VkLgorICogQHJldHVybiBDb21iaW5hdGlvbiBvZiBmbGFncyBpbmZvcm1pbmcgeW91IHdoYXQga2luZCBvZiBsb3NzZXMgd2lsbCBvY2N1cgorICogKG1heGltdW0gbG9zcyBmb3IgYW4gaW52YWxpZCBkc3RfcGl4X2ZtdCkuCisgKi8KK2ludCBhdl9nZXRfcGl4X2ZtdF9sb3NzKGVudW0gQVZQaXhlbEZvcm1hdCBkc3RfcGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNfcGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfYWxwaGEpOworCisvKioKKyAqIENvbXB1dGUgd2hhdCBraW5kIG9mIGxvc3NlcyB3aWxsIG9jY3VyIHdoZW4gY29udmVydGluZyBmcm9tIG9uZSBzcGVjaWZpYworICogcGl4ZWwgZm9ybWF0IHRvIGFub3RoZXIuCisgKiBXaGVuIGNvbnZlcnRpbmcgZnJvbSBvbmUgcGl4ZWwgZm9ybWF0IHRvIGFub3RoZXIsIGluZm9ybWF0aW9uIGxvc3MgbWF5IG9jY3VyLgorICogRm9yIGV4YW1wbGUsIHdoZW4gY29udmVydGluZyBmcm9tIFJHQjI0IHRvIEdSQVksIHRoZSBjb2xvciBpbmZvcm1hdGlvbiB3aWxsCisgKiBiZSBsb3N0LiBTaW1pbGFybHksIG90aGVyIGxvc3NlcyBvY2N1ciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBzb21lIGZvcm1hdHMgdG8KKyAqIG90aGVyIGZvcm1hdHMuIFRoZXNlIGxvc3NlcyBjYW4gaW52b2x2ZSBsb3NzIG9mIGNocm9tYSwgYnV0IGFsc28gbG9zcyBvZgorICogcmVzb2x1dGlvbiwgbG9zcyBvZiBjb2xvciBkZXB0aCwgbG9zcyBkdWUgdG8gdGhlIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24sIGxvc3MKKyAqIG9mIHRoZSBhbHBoYSBiaXRzIG9yIGxvc3MgZHVlIHRvIGNvbG9yIHF1YW50aXphdGlvbi4KKyAqIGF2X2dldF9maXhfZm10X2xvc3MoKSBpbmZvcm1zIHlvdSBhYm91dCB0aGUgdmFyaW91cyB0eXBlcyBvZiBsb3NzZXMKKyAqIHdoaWNoIHdpbGwgb2NjdXIgd2hlbiBjb252ZXJ0aW5nIGZyb20gb25lIHBpeGVsIGZvcm1hdCB0byBhbm90aGVyLgorICoKKyAqIEBwYXJhbVtpbl0gZHN0X3BpeF9mbXQgZGVzdGluYXRpb24gcGl4ZWwgZm9ybWF0CisgKiBAcGFyYW1baW5dIHNyY19waXhfZm10IHNvdXJjZSBwaXhlbCBmb3JtYXQKKyAqIEBwYXJhbVtpbl0gaGFzX2FscGhhIFdoZXRoZXIgdGhlIHNvdXJjZSBwaXhlbCBmb3JtYXQgYWxwaGEgY2hhbm5lbCBpcyB1c2VkLgorICogQHJldHVybiBDb21iaW5hdGlvbiBvZiBmbGFncyBpbmZvcm1pbmcgeW91IHdoYXQga2luZCBvZiBsb3NzZXMgd2lsbCBvY2N1cgorICogKG1heGltdW0gbG9zcyBmb3IgYW4gaW52YWxpZCBkc3RfcGl4X2ZtdCkuCisgKi8KK2VudW0gQVZQaXhlbEZvcm1hdCBhdl9maW5kX2Jlc3RfcGl4X2ZtdF9vZl8yKGVudW0gQVZQaXhlbEZvcm1hdCBkc3RfcGl4X2ZtdDEsIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RfcGl4X2ZtdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjX3BpeF9mbXQsIGludCBoYXNfYWxwaGEsIGludCAqbG9zc19wdHIpOworCisvKioKKyAqIEByZXR1cm4gdGhlIG5hbWUgZm9yIHByb3ZpZGVkIGNvbG9yIHJhbmdlIG9yIE5VTEwgaWYgdW5rbm93bi4KKyAqLworY29uc3QgY2hhciAqYXZfY29sb3JfcmFuZ2VfbmFtZShlbnVtIEFWQ29sb3JSYW5nZSByYW5nZSk7CisKKy8qKgorICogQHJldHVybiB0aGUgbmFtZSBmb3IgcHJvdmlkZWQgY29sb3IgcHJpbWFyaWVzIG9yIE5VTEwgaWYgdW5rbm93bi4KKyAqLworY29uc3QgY2hhciAqYXZfY29sb3JfcHJpbWFyaWVzX25hbWUoZW51bSBBVkNvbG9yUHJpbWFyaWVzIHByaW1hcmllcyk7CisKKy8qKgorICogQHJldHVybiB0aGUgbmFtZSBmb3IgcHJvdmlkZWQgY29sb3IgdHJhbnNmZXIgb3IgTlVMTCBpZiB1bmtub3duLgorICovCitjb25zdCBjaGFyICphdl9jb2xvcl90cmFuc2Zlcl9uYW1lKGVudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgdHJhbnNmZXIpOworCisvKioKKyAqIEByZXR1cm4gdGhlIG5hbWUgZm9yIHByb3ZpZGVkIGNvbG9yIHNwYWNlIG9yIE5VTEwgaWYgdW5rbm93bi4KKyAqLworY29uc3QgY2hhciAqYXZfY29sb3Jfc3BhY2VfbmFtZShlbnVtIEFWQ29sb3JTcGFjZSBzcGFjZSk7CisKKy8qKgorICogQHJldHVybiB0aGUgbmFtZSBmb3IgcHJvdmlkZWQgY2hyb21hIGxvY2F0aW9uIG9yIE5VTEwgaWYgdW5rbm93bi4KKyAqLworY29uc3QgY2hhciAqYXZfY2hyb21hX2xvY2F0aW9uX25hbWUoZW51bSBBVkNocm9tYUxvY2F0aW9uIGxvY2F0aW9uKTsKKworI2VuZGlmIC8qIEFWVVRJTF9QSVhERVNDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvcGl4ZWx1dGlscy5jIGIvZmZtcGVnL2xpYmF2dXRpbC9waXhlbHV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwNDAyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvcGl4ZWx1dGlscy5jCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwaXhlbHV0aWxzLmgiCisKKyNpZiBDT05GSUdfUElYRUxVVElMUworCisjaW5jbHVkZSAieDg2L3BpeGVsdXRpbHMuaCIKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHNhZF93eGgoY29uc3QgdWludDhfdCAqc3JjMSwgcHRyZGlmZl90IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgeCwgeSwgc3VtID0gMDsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKyAgICAgICAgICAgIHN1bSArPSBhYnMoc3JjMVt4XSAtIHNyYzJbeF0pOworICAgICAgICBzcmMxICs9IHN0cmlkZTE7CisgICAgICAgIHNyYzIgKz0gc3RyaWRlMjsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKK30KKworI2RlZmluZSBERUNMQVJFX0JMT0NLX0ZVTkNUSU9OUyhzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCBibG9ja19zYWRfIyNzaXplIyN4IyNzaXplIyNfYyhjb25zdCB1aW50OF90ICpzcmMxLCBwdHJkaWZmX3Qgc3RyaWRlMSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlMikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzYWRfd3hoKHNyYzEsIHN0cmlkZTEsIHNyYzIsIHN0cmlkZTIsIHNpemUsIHNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitERUNMQVJFX0JMT0NLX0ZVTkNUSU9OUygyKQorREVDTEFSRV9CTE9DS19GVU5DVElPTlMoNCkKK0RFQ0xBUkVfQkxPQ0tfRlVOQ1RJT05TKDgpCitERUNMQVJFX0JMT0NLX0ZVTkNUSU9OUygxNikKKworc3RhdGljIGNvbnN0IGF2X3BpeGVsdXRpbHNfc2FkX2ZuIHNhZF9jW10gPSB7CisgICAgYmxvY2tfc2FkXzJ4Ml9jLAorICAgIGJsb2NrX3NhZF80eDRfYywKKyAgICBibG9ja19zYWRfOHg4X2MsCisgICAgYmxvY2tfc2FkXzE2eDE2X2MsCit9OworCisjZW5kaWYgLyogQ09ORklHX1BJWEVMVVRJTFMgKi8KKworYXZfcGl4ZWx1dGlsc19zYWRfZm4gYXZfcGl4ZWx1dGlsc19nZXRfc2FkX2ZuKGludCB3X2JpdHMsIGludCBoX2JpdHMsIGludCBhbGlnbmVkLCB2b2lkICpsb2dfY3R4KQoreworI2lmICFDT05GSUdfUElYRUxVVElMUworICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJwaXhlbHV0aWxzIHN1cHBvcnQgaXMgcmVxdWlyZWQgIgorICAgICAgICAgICAiYnV0IGxpYmF2dXRpbCBpcyBub3QgY29tcGlsZWQgd2l0aCBpdFxuIik7CisgICAgcmV0dXJuIE5VTEw7CisjZWxzZQorICAgIGF2X3BpeGVsdXRpbHNfc2FkX2ZuIHNhZFtGRl9BUlJBWV9FTEVNUyhzYWRfYyldOworCisgICAgbWVtY3B5KHNhZCwgc2FkX2MsIHNpemVvZihzYWQpKTsKKworICAgIGlmICh3X2JpdHMgPCAxIHx8IHdfYml0cyA+IEZGX0FSUkFZX0VMRU1TKHNhZCkgfHwKKyAgICAgICAgaF9iaXRzIDwgMSB8fCBoX2JpdHMgPiBGRl9BUlJBWV9FTEVNUyhzYWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAod19iaXRzICE9IGhfYml0cykgLy8gb25seSBzcXVhcmVkIHNhZCBmb3Igbm93CisgICAgICAgIHJldHVybiBOVUxMOworCisjaWYgQVJDSF9YODYKKyAgICBmZl9waXhlbHV0aWxzX3NhZF9pbml0X3g4NihzYWQsIGFsaWduZWQpOworI2VuZGlmCisKKyAgICByZXR1cm4gc2FkW3dfYml0cyAtIDFdOworI2VuZGlmCit9CisKKyNpZmRlZiBURVNUCisjZGVmaW5lIFcxIDMyMAorI2RlZmluZSBIMSAyNDAKKyNkZWZpbmUgVzIgNjQwCisjZGVmaW5lIEgyIDQ4MAorCitzdGF0aWMgaW50IHJ1bl9zaW5nbGVfdGVzdChjb25zdCBjaGFyICp0ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYmxvY2sxLCBwdHJkaWZmX3Qgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJsb2NrMiwgcHRyZGlmZl90IHN0cmlkZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxpZ24sIGludCBuKQoreworICAgIGludCBvdXQsIHJlZjsKKyAgICBhdl9waXhlbHV0aWxzX3NhZF9mbiBmX3JlZiA9IHNhZF9jW24gLSAxXTsKKyAgICBhdl9waXhlbHV0aWxzX3NhZF9mbiBmX291dCA9IGF2X3BpeGVsdXRpbHNfZ2V0X3NhZF9mbihuLCBuLCBhbGlnbiwgTlVMTCk7CisKKyAgICBzd2l0Y2ggKGFsaWduKSB7CisgICAgY2FzZSAwOiBibG9jazErKzsgYmxvY2syKys7IGJyZWFrOworICAgIGNhc2UgMTogICAgICAgICAgIGJsb2NrMisrOyBicmVhazsKKyAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgb3V0ID0gZl9vdXQoYmxvY2sxLCBzdHJpZGUxLCBibG9jazIsIHN0cmlkZTIpOworICAgIHJlZiA9IGZfcmVmKGJsb2NrMSwgc3RyaWRlMSwgYmxvY2syLCBzdHJpZGUyKTsKKyAgICBwcmludGYoIlslc10gWyVjJWNdIFNBRCBbJXNdICVkeCVkPSVkIHJlZj0lZFxuIiwKKyAgICAgICAgICAgb3V0ID09IHJlZiA/ICJPSyIgOiAiRkFJTCIsCisgICAgICAgICAgIGFsaWduID8gJ0EnIDogJ1UnLCBhbGlnbiA9PSAyID8gJ0EnIDogJ1UnLAorICAgICAgICAgICB0ZXN0LCAxPDxuLCAxPDxuLCBvdXQsIHJlZik7CisgICAgcmV0dXJuIG91dCAhPSByZWY7Cit9CisKK3N0YXRpYyBpbnQgcnVuX3Rlc3QoY29uc3QgY2hhciAqdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYjEsIGNvbnN0IHVpbnQ4X3QgKmIyKQoreworICAgIGludCBpLCBhLCByZXQgPSAwOworCisgICAgZm9yIChhID0gMDsgYSA8IDM7IGErKykgeworICAgICAgICBjb25zdCB1aW50OF90ICpibG9jazEgPSBiMTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqYmxvY2syID0gYjI7CisKKyAgICAgICAgc3dpdGNoIChhKSB7CisgICAgICAgIGNhc2UgMDogYmxvY2sxKys7IGJsb2NrMisrOyBicmVhazsKKyAgICAgICAgY2FzZSAxOiAgICAgICAgICAgYmxvY2syKys7IGJyZWFrOworICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBGRl9BUlJBWV9FTEVNUyhzYWRfYyk7IGkrKykgeworICAgICAgICAgICAgaW50IHIgPSBydW5fc2luZ2xlX3Rlc3QodGVzdCwgYjEsIFcxLCBiMiwgVzIsIGEsIGkpOworICAgICAgICAgICAgaWYgKHIpCisgICAgICAgICAgICAgICAgcmV0ID0gcjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludCBpLCBhbGlnbiwgcmV0OworICAgIHVpbnQ4X3QgKmJ1ZjEgPSBhdl9tYWxsb2MoVzEqSDEpOworICAgIHVpbnQ4X3QgKmJ1ZjIgPSBhdl9tYWxsb2MoVzIqSDIpOworICAgIHVpbnQzMl90IHN0YXRlID0gMDsKKworICAgIGlmICghYnVmMSB8fCAhYnVmMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsdXJlXG4iKTsKKyAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisjZGVmaW5lIFJBTkRPTV9JTklUKGJ1Ziwgc2l6ZSkgZG8geyAgICAgICAgICAgICBcCisgICAgaW50IGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChrID0gMDsgayA8IHNpemU7IGsrKykgeyAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRlID0gc3RhdGUgKiAxNjY0NTI1ICsgMTAxMzkwNDIyMzsgICBcCisgICAgICAgIGJ1ZltrXSA9IHN0YXRlPj4yNDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgLyogTm9ybWFsIHRlc3Qgd2l0aCBkaWZmZXJlbnQgc3RyaWRlcyAqLworICAgIFJBTkRPTV9JTklUKGJ1ZjEsIFcxKkgxKTsKKyAgICBSQU5ET01fSU5JVChidWYyLCBXMipIMik7CisgICAgcmV0ID0gcnVuX3Rlc3QoInJhbmRvbSIsIGJ1ZjEsIGJ1ZjIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIC8qIENoZWNrIGZvciBtYXhpbXVtIFNBRCAqLworICAgIG1lbXNldChidWYxLCAweGZmLCBXMSpIMSk7CisgICAgbWVtc2V0KGJ1ZjIsIDB4MDAsIFcyKkgyKTsKKyAgICByZXQgPSBydW5fdGVzdCgibWF4IiwgYnVmMSwgYnVmMik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgLyogQ2hlY2sgZm9yIG1pbmltdW0gU0FEICovCisgICAgbWVtc2V0KGJ1ZjEsIDB4OTAsIFcxKkgxKTsKKyAgICBtZW1zZXQoYnVmMiwgMHg5MCwgVzIqSDIpOworICAgIHJldCA9IHJ1bl90ZXN0KCJtaW4iLCBidWYxLCBidWYyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICAvKiBFeGFjdCBidWZmZXIgc2l6ZXMsIHRvIGNoZWNrIGZvciBvdmVycmVhZHMgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDw9IDQ7IGkrKykgeworICAgICAgICBmb3IgKGFsaWduID0gMDsgYWxpZ24gPCAzOyBhbGlnbisrKSB7CisgICAgICAgICAgICBpbnQgc2l6ZTEsIHNpemUyOworCisgICAgICAgICAgICBhdl9mcmVlcCgmYnVmMSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmYnVmMik7CisKKyAgICAgICAgICAgIHNpemUxID0gc2l6ZTIgPSAxIDw8IChpIDw8IDEpOworCisgICAgICAgICAgICBzd2l0Y2ggKGFsaWduKSB7CisgICAgICAgICAgICBjYXNlIDA6IHNpemUxKys7IHNpemUyKys7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICBzaXplMisrOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZjEgPSBhdl9tYWxsb2Moc2l6ZTEpOworICAgICAgICAgICAgYnVmMiA9IGF2X21hbGxvYyhzaXplMik7CisgICAgICAgICAgICBpZiAoIWJ1ZjEgfHwgIWJ1ZjIpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUkFORE9NX0lOSVQoYnVmMSwgc2l6ZTEpOworICAgICAgICAgICAgUkFORE9NX0lOSVQoYnVmMiwgc2l6ZTIpOworICAgICAgICAgICAgcmV0ID0gcnVuX3NpbmdsZV90ZXN0KCJzbWFsbCIsIGJ1ZjEsIDE8PGksIGJ1ZjIsIDE8PGksIGFsaWduLCBpKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorCitlbmQ6CisgICAgYXZfZnJlZShidWYxKTsKKyAgICBhdl9mcmVlKGJ1ZjIpOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9waXhlbHV0aWxzLmggYi9mZm1wZWcvbGliYXZ1dGlsL3BpeGVsdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGRiYzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9waXhlbHV0aWxzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9QSVhFTFVUSUxTX0gKKyNkZWZpbmUgQVZVVElMX1BJWEVMVVRJTFNfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qKgorICogU3VtIG9mIGFicyhzcmMxW3hdIC0gc3JjMlt4XSkKKyAqLwordHlwZWRlZiBpbnQgKCphdl9waXhlbHV0aWxzX3NhZF9mbikoY29uc3QgdWludDhfdCAqc3JjMSwgcHRyZGlmZl90IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlMik7CisKKy8qKgorICogR2V0IGEgcG90ZW50aWFsbHkgb3B0aW1pemVkIHBvaW50ZXIgdG8gYSBTdW0tb2YtYWJzb2x1dGUtZGlmZmVyZW5jZXMKKyAqIGZ1bmN0aW9uIChzZWUgdGhlIGF2X3BpeGVsdXRpbHNfc2FkX2ZuIHByb3RvdHlwZSkuCisgKgorICogQHBhcmFtIHdfYml0cyAgMTw8d19iaXRzIGlzIHRoZSByZXF1ZXN0ZWQgd2lkdGggb2YgdGhlIGJsb2NrIHNpemUKKyAqIEBwYXJhbSBoX2JpdHMgIDE8PGhfYml0cyBpcyB0aGUgcmVxdWVzdGVkIGhlaWdodCBvZiB0aGUgYmxvY2sgc2l6ZQorICogQHBhcmFtIGFsaWduZWQgSWYgc2V0IHRvIDIsIHRoZSByZXR1cm5lZCBzYWQgZnVuY3Rpb24gd2lsbCBhc3N1bWUgc3JjMSBhbmQKKyAqICAgICAgICAgICAgICAgIHNyYzIgYWRkcmVzc2VzIGFyZSBhbGlnbmVkIG9uIHRoZSBibG9jayBzaXplLgorICogICAgICAgICAgICAgICAgSWYgc2V0IHRvIDEsIHRoZSByZXR1cm5lZCBzYWQgZnVuY3Rpb24gd2lsbCBhc3N1bWUgc3JjMSBpcworICogICAgICAgICAgICAgICAgYWxpZ25lZCBvbiB0aGUgYmxvY2sgc2l6ZS4KKyAqICAgICAgICAgICAgICAgIElmIHNldCB0byAwLCB0aGUgcmV0dXJuZWQgc2FkIGZ1bmN0aW9uIGFzc3VtZSBubyBwYXJ0aWN1bGFyCisgKiAgICAgICAgICAgICAgICBhbGlnbm1lbnQuCisgKiBAcGFyYW0gbG9nX2N0eCBjb250ZXh0IHVzZWQgZm9yIGxvZ2dpbmcsIGNhbiBiZSBOVUxMCisgKgorICogQHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIFNBRCBmdW5jdGlvbiBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IgKGJlY2F1c2Ugb2YKKyAqICAgICAgICAgaW52YWxpZCBwYXJhbWV0ZXJzKQorICovCithdl9waXhlbHV0aWxzX3NhZF9mbiBhdl9waXhlbHV0aWxzX2dldF9zYWRfZm4oaW50IHdfYml0cywgaW50IGhfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxpZ25lZCwgdm9pZCAqbG9nX2N0eCk7CisKKyNlbmRpZiAvKiBBVlVUSUxfUElYRUxVVElMU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3BpeGZtdC5oIGIvZmZtcGVnL2xpYmF2dXRpbC9waXhmbXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTZhMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9waXhmbXQuaApAQCAtMCwwICsxLDUyMSBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9QSVhGTVRfSAorI2RlZmluZSBBVlVUSUxfUElYRk1UX0gKKworLyoqCisgKiBAZmlsZQorICogcGl4ZWwgZm9ybWF0IGRlZmluaXRpb25zCisgKgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZjb25maWcuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNkZWZpbmUgQVZQQUxFVFRFX1NJWkUgMTAyNAorI2RlZmluZSBBVlBBTEVUVEVfQ09VTlQgMjU2CisKKy8qKgorICogUGl4ZWwgZm9ybWF0LgorICoKKyAqIEBub3RlCisgKiBBVl9QSVhfRk1UX1JHQjMyIGlzIGhhbmRsZWQgaW4gYW4gZW5kaWFuLXNwZWNpZmljIG1hbm5lci4gQW4gUkdCQQorICogY29sb3IgaXMgcHV0IHRvZ2V0aGVyIGFzOgorICogIChBIDw8IDI0KSB8IChSIDw8IDE2KSB8IChHIDw8IDgpIHwgQgorICogVGhpcyBpcyBzdG9yZWQgYXMgQkdSQSBvbiBsaXR0bGUtZW5kaWFuIENQVSBhcmNoaXRlY3R1cmVzIGFuZCBBUkdCIG9uCisgKiBiaWctZW5kaWFuIENQVXMuCisgKgorICogQHBhcgorICogV2hlbiB0aGUgcGl4ZWwgZm9ybWF0IGlzIHBhbGV0dGl6ZWQgUkdCIChBVl9QSVhfRk1UX1BBTDgpLCB0aGUgcGFsZXR0aXplZAorICogaW1hZ2UgZGF0YSBpcyBzdG9yZWQgaW4gQVZGcmFtZS5kYXRhWzBdLiBUaGUgcGFsZXR0ZSBpcyB0cmFuc3BvcnRlZCBpbgorICogQVZGcmFtZS5kYXRhWzFdLCBpcyAxMDI0IGJ5dGVzIGxvbmcgKDI1NiA0LWJ5dGUgZW50cmllcykgYW5kIGlzCisgKiBmb3JtYXR0ZWQgdGhlIHNhbWUgYXMgaW4gQVZfUElYX0ZNVF9SR0IzMiBkZXNjcmliZWQgYWJvdmUgKGkuZS4sIGl0IGlzCisgKiBhbHNvIGVuZGlhbi1zcGVjaWZpYykuIE5vdGUgYWxzbyB0aGF0IHRoZSBpbmRpdmlkdWFsIFJHQiBwYWxldHRlCisgKiBjb21wb25lbnRzIHN0b3JlZCBpbiBBVkZyYW1lLmRhdGFbMV0gc2hvdWxkIGJlIGluIHRoZSByYW5nZSAwLi4yNTUuCisgKiBUaGlzIGlzIGltcG9ydGFudCBhcyBtYW55IGN1c3RvbSBQQUw4IHZpZGVvIGNvZGVjcyB0aGF0IHdlcmUgZGVzaWduZWQKKyAqIHRvIHJ1biBvbiB0aGUgSUJNIFZHQSBncmFwaGljcyBhZGFwdGVyIHVzZSA2LWJpdCBwYWxldHRlIGNvbXBvbmVudHMuCisgKgorICogQHBhcgorICogRm9yIGFsbCB0aGUgOGJpdCBwZXIgcGl4ZWwgZm9ybWF0cywgYW4gUkdCMzIgcGFsZXR0ZSBpcyBpbiBkYXRhWzFdIGxpa2UKKyAqIGZvciBwYWw4LiBUaGlzIHBhbGV0dGUgaXMgZmlsbGVkIGluIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGZ1bmN0aW9uCisgKiBhbGxvY2F0aW5nIHRoZSBwaWN0dXJlLgorICoKKyAqIEBub3RlCisgKiBNYWtlIHN1cmUgdGhhdCBhbGwgbmV3bHkgYWRkZWQgYmlnLWVuZGlhbiBmb3JtYXRzIGhhdmUgKHBpeF9mbXQgJiAxKSA9PSAxCisgKiBhbmQgdGhhdCBhbGwgbmV3bHkgYWRkZWQgbGl0dGxlLWVuZGlhbiBmb3JtYXRzIGhhdmUgKHBpeF9mbXQgJiAxKSA9PSAwLgorICogVGhpcyBhbGxvd3Mgc2ltcGxlciBkZXRlY3Rpb24gb2YgYmlnIHZzIGxpdHRsZS1lbmRpYW4uCisgKi8KK2VudW0gQVZQaXhlbEZvcm1hdCB7CisgICAgQVZfUElYX0ZNVF9OT05FID0gLTEsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgIC8vLzwgcGxhbmFyIFlVViA0OjI6MCwgMTJicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSBzYW1wbGVzKQorICAgIEFWX1BJWF9GTVRfWVVZVjQyMiwgICAvLy88IHBhY2tlZCBZVVYgNDoyOjIsIDE2YnBwLCBZMCBDYiBZMSBDcgorICAgIEFWX1BJWF9GTVRfUkdCMjQsICAgICAvLy88IHBhY2tlZCBSR0IgODo4OjgsIDI0YnBwLCBSR0JSR0IuLi4KKyAgICBBVl9QSVhfRk1UX0JHUjI0LCAgICAgLy8vPCBwYWNrZWQgUkdCIDg6ODo4LCAyNGJwcCwgQkdSQkdSLi4uCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLCAgIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwgMTZicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKQorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgICAvLy88IHBsYW5hciBZVVYgNDo0OjQsIDI0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcykKKyAgICBBVl9QSVhfRk1UX1lVVjQxMFAsICAgLy8vPCBwbGFuYXIgWVVWIDQ6MTowLCAgOWJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDR4NCBZIHNhbXBsZXMpCisgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLCAgIC8vLzwgcGxhbmFyIFlVViA0OjE6MSwgMTJicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciA0eDEgWSBzYW1wbGVzKQorICAgIEFWX1BJWF9GTVRfR1JBWTgsICAgICAvLy88ICAgICAgICBZICAgICAgICAsICA4YnBwCisgICAgQVZfUElYX0ZNVF9NT05PV0hJVEUsIC8vLzwgICAgICAgIFkgICAgICAgICwgIDFicHAsIDAgaXMgd2hpdGUsIDEgaXMgYmxhY2ssIGluIGVhY2ggYnl0ZSBwaXhlbHMgYXJlIG9yZGVyZWQgZnJvbSB0aGUgbXNiIHRvIHRoZSBsc2IKKyAgICBBVl9QSVhfRk1UX01PTk9CTEFDSywgLy8vPCAgICAgICAgWSAgICAgICAgLCAgMWJwcCwgMCBpcyBibGFjaywgMSBpcyB3aGl0ZSwgaW4gZWFjaCBieXRlIHBpeGVscyBhcmUgb3JkZXJlZCBmcm9tIHRoZSBtc2IgdG8gdGhlIGxzYgorICAgIEFWX1BJWF9GTVRfUEFMOCwgICAgICAvLy88IDggYml0IHdpdGggUElYX0ZNVF9SR0IzMiBwYWxldHRlCisgICAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgIC8vLzwgcGxhbmFyIFlVViA0OjI6MCwgMTJicHAsIGZ1bGwgc2NhbGUgKEpQRUcpLCBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFBJWF9GTVRfWVVWNDIwUCBhbmQgc2V0dGluZyBjb2xvcl9yYW5nZQorICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsICAvLy88IHBsYW5hciBZVVYgNDoyOjIsIDE2YnBwLCBmdWxsIHNjYWxlIChKUEVHKSwgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBQSVhfRk1UX1lVVjQyMlAgYW5kIHNldHRpbmcgY29sb3JfcmFuZ2UKKyAgICBBVl9QSVhfRk1UX1lVVko0NDRQLCAgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LCAyNGJwcCwgZnVsbCBzY2FsZSAoSlBFRyksIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgUElYX0ZNVF9ZVVY0NDRQIGFuZCBzZXR0aW5nIGNvbG9yX3JhbmdlCisjaWYgRkZfQVBJX1hWTUMKKyAgICBBVl9QSVhfRk1UX1hWTUNfTVBFRzJfTUMsLy8vPCBYVmlkZW8gTW90aW9uIEFjY2VsZXJhdGlvbiB2aWEgY29tbW9uIHBhY2tldCBwYXNzaW5nCisgICAgQVZfUElYX0ZNVF9YVk1DX01QRUcyX0lEQ1QsCisjZGVmaW5lIEFWX1BJWF9GTVRfWFZNQyBBVl9QSVhfRk1UX1hWTUNfTVBFRzJfSURDVAorI2VuZGlmIC8qIEZGX0FQSV9YVk1DICovCisgICAgQVZfUElYX0ZNVF9VWVZZNDIyLCAgIC8vLzwgcGFja2VkIFlVViA0OjI6MiwgMTZicHAsIENiIFkwIENyIFkxCisgICAgQVZfUElYX0ZNVF9VWVlWWVk0MTEsIC8vLzwgcGFja2VkIFlVViA0OjE6MSwgMTJicHAsIENiIFkwIFkxIENyIFkyIFkzCisgICAgQVZfUElYX0ZNVF9CR1I4LCAgICAgIC8vLzwgcGFja2VkIFJHQiAzOjM6MiwgIDhicHAsIChtc2IpMkIgM0cgM1IobHNiKQorICAgIEFWX1BJWF9GTVRfQkdSNCwgICAgICAvLy88IHBhY2tlZCBSR0IgMToyOjEgYml0c3RyZWFtLCAgNGJwcCwgKG1zYikxQiAyRyAxUihsc2IpLCBhIGJ5dGUgY29udGFpbnMgdHdvIHBpeGVscywgdGhlIGZpcnN0IHBpeGVsIGluIHRoZSBieXRlIGlzIHRoZSBvbmUgY29tcG9zZWQgYnkgdGhlIDQgbXNiIGJpdHMKKyAgICBBVl9QSVhfRk1UX0JHUjRfQllURSwgLy8vPCBwYWNrZWQgUkdCIDE6MjoxLCAgOGJwcCwgKG1zYikxQiAyRyAxUihsc2IpCisgICAgQVZfUElYX0ZNVF9SR0I4LCAgICAgIC8vLzwgcGFja2VkIFJHQiAzOjM6MiwgIDhicHAsIChtc2IpMlIgM0cgM0IobHNiKQorICAgIEFWX1BJWF9GTVRfUkdCNCwgICAgICAvLy88IHBhY2tlZCBSR0IgMToyOjEgYml0c3RyZWFtLCAgNGJwcCwgKG1zYikxUiAyRyAxQihsc2IpLCBhIGJ5dGUgY29udGFpbnMgdHdvIHBpeGVscywgdGhlIGZpcnN0IHBpeGVsIGluIHRoZSBieXRlIGlzIHRoZSBvbmUgY29tcG9zZWQgYnkgdGhlIDQgbXNiIGJpdHMKKyAgICBBVl9QSVhfRk1UX1JHQjRfQllURSwgLy8vPCBwYWNrZWQgUkdCIDE6MjoxLCAgOGJwcCwgKG1zYikxUiAyRyAxQihsc2IpCisgICAgQVZfUElYX0ZNVF9OVjEyLCAgICAgIC8vLzwgcGxhbmFyIFlVViA0OjI6MCwgMTJicHAsIDEgcGxhbmUgZm9yIFkgYW5kIDEgcGxhbmUgZm9yIHRoZSBVViBjb21wb25lbnRzLCB3aGljaCBhcmUgaW50ZXJsZWF2ZWQgKGZpcnN0IGJ5dGUgVSBhbmQgdGhlIGZvbGxvd2luZyBieXRlIFYpCisgICAgQVZfUElYX0ZNVF9OVjIxLCAgICAgIC8vLzwgYXMgYWJvdmUsIGJ1dCBVIGFuZCBWIGJ5dGVzIGFyZSBzd2FwcGVkCisKKyAgICBBVl9QSVhfRk1UX0FSR0IsICAgICAgLy8vPCBwYWNrZWQgQVJHQiA4Ojg6ODo4LCAzMmJwcCwgQVJHQkFSR0IuLi4KKyAgICBBVl9QSVhfRk1UX1JHQkEsICAgICAgLy8vPCBwYWNrZWQgUkdCQSA4Ojg6ODo4LCAzMmJwcCwgUkdCQVJHQkEuLi4KKyAgICBBVl9QSVhfRk1UX0FCR1IsICAgICAgLy8vPCBwYWNrZWQgQUJHUiA4Ojg6ODo4LCAzMmJwcCwgQUJHUkFCR1IuLi4KKyAgICBBVl9QSVhfRk1UX0JHUkEsICAgICAgLy8vPCBwYWNrZWQgQkdSQSA4Ojg6ODo4LCAzMmJwcCwgQkdSQUJHUkEuLi4KKworICAgIEFWX1BJWF9GTVRfR1JBWTE2QkUsICAvLy88ICAgICAgICBZICAgICAgICAsIDE2YnBwLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9HUkFZMTZMRSwgIC8vLzwgICAgICAgIFkgICAgICAgICwgMTZicHAsIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsICAgLy8vPCBwbGFuYXIgWVVWIDQ6NDowICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDIgWSBzYW1wbGVzKQorICAgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsICAvLy88IHBsYW5hciBZVVYgNDo0OjAgZnVsbCBzY2FsZSAoSlBFRyksIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgUElYX0ZNVF9ZVVY0NDBQIGFuZCBzZXR0aW5nIGNvbG9yX3JhbmdlCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgIC8vLzwgcGxhbmFyIFlVViA0OjI6MCwgMjBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSAmIEEgc2FtcGxlcykKKyNpZiBGRl9BUElfVkRQQVUKKyAgICBBVl9QSVhfRk1UX1ZEUEFVX0gyNjQsLy8vPCBILjI2NCBIVyBkZWNvZGluZyB3aXRoIFZEUEFVLCBkYXRhWzBdIGNvbnRhaW5zIGEgdmRwYXVfcmVuZGVyX3N0YXRlIHN0cnVjdCB3aGljaCBjb250YWlucyB0aGUgYml0c3RyZWFtIG9mIHRoZSBzbGljZXMgYXMgd2VsbCBhcyB2YXJpb3VzIGZpZWxkcyBleHRyYWN0ZWQgZnJvbSBoZWFkZXJzCisgICAgQVZfUElYX0ZNVF9WRFBBVV9NUEVHMSwvLy88IE1QRUctMSBIVyBkZWNvZGluZyB3aXRoIFZEUEFVLCBkYXRhWzBdIGNvbnRhaW5zIGEgdmRwYXVfcmVuZGVyX3N0YXRlIHN0cnVjdCB3aGljaCBjb250YWlucyB0aGUgYml0c3RyZWFtIG9mIHRoZSBzbGljZXMgYXMgd2VsbCBhcyB2YXJpb3VzIGZpZWxkcyBleHRyYWN0ZWQgZnJvbSBoZWFkZXJzCisgICAgQVZfUElYX0ZNVF9WRFBBVV9NUEVHMiwvLy88IE1QRUctMiBIVyBkZWNvZGluZyB3aXRoIFZEUEFVLCBkYXRhWzBdIGNvbnRhaW5zIGEgdmRwYXVfcmVuZGVyX3N0YXRlIHN0cnVjdCB3aGljaCBjb250YWlucyB0aGUgYml0c3RyZWFtIG9mIHRoZSBzbGljZXMgYXMgd2VsbCBhcyB2YXJpb3VzIGZpZWxkcyBleHRyYWN0ZWQgZnJvbSBoZWFkZXJzCisgICAgQVZfUElYX0ZNVF9WRFBBVV9XTVYzLC8vLzwgV01WMyBIVyBkZWNvZGluZyB3aXRoIFZEUEFVLCBkYXRhWzBdIGNvbnRhaW5zIGEgdmRwYXVfcmVuZGVyX3N0YXRlIHN0cnVjdCB3aGljaCBjb250YWlucyB0aGUgYml0c3RyZWFtIG9mIHRoZSBzbGljZXMgYXMgd2VsbCBhcyB2YXJpb3VzIGZpZWxkcyBleHRyYWN0ZWQgZnJvbSBoZWFkZXJzCisgICAgQVZfUElYX0ZNVF9WRFBBVV9WQzEsIC8vLzwgVkMtMSBIVyBkZWNvZGluZyB3aXRoIFZEUEFVLCBkYXRhWzBdIGNvbnRhaW5zIGEgdmRwYXVfcmVuZGVyX3N0YXRlIHN0cnVjdCB3aGljaCBjb250YWlucyB0aGUgYml0c3RyZWFtIG9mIHRoZSBzbGljZXMgYXMgd2VsbCBhcyB2YXJpb3VzIGZpZWxkcyBleHRyYWN0ZWQgZnJvbSBoZWFkZXJzCisjZW5kaWYKKyAgICBBVl9QSVhfRk1UX1JHQjQ4QkUsICAgLy8vPCBwYWNrZWQgUkdCIDE2OjE2OjE2LCA0OGJwcCwgMTZSLCAxNkcsIDE2QiwgdGhlIDItYnl0ZSB2YWx1ZSBmb3IgZWFjaCBSL0cvQiBjb21wb25lbnQgaXMgc3RvcmVkIGFzIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1JHQjQ4TEUsICAgLy8vPCBwYWNrZWQgUkdCIDE2OjE2OjE2LCA0OGJwcCwgMTZSLCAxNkcsIDE2QiwgdGhlIDItYnl0ZSB2YWx1ZSBmb3IgZWFjaCBSL0cvQiBjb21wb25lbnQgaXMgc3RvcmVkIGFzIGxpdHRsZS1lbmRpYW4KKworICAgIEFWX1BJWF9GTVRfUkdCNTY1QkUsICAvLy88IHBhY2tlZCBSR0IgNTo2OjUsIDE2YnBwLCAobXNiKSAgIDVSIDZHIDVCKGxzYiksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1JHQjU2NUxFLCAgLy8vPCBwYWNrZWQgUkdCIDU6Njo1LCAxNmJwcCwgKG1zYikgICA1UiA2RyA1Qihsc2IpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9SR0I1NTVCRSwgIC8vLzwgcGFja2VkIFJHQiA1OjU6NSwgMTZicHAsIChtc2IpMUEgNVIgNUcgNUIobHNiKSwgYmlnLWVuZGlhbiwgbW9zdCBzaWduaWZpY2FudCBiaXQgdG8gMAorICAgIEFWX1BJWF9GTVRfUkdCNTU1TEUsICAvLy88IHBhY2tlZCBSR0IgNTo1OjUsIDE2YnBwLCAobXNiKTFBIDVSIDVHIDVCKGxzYiksIGxpdHRsZS1lbmRpYW4sIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvIDAKKworICAgIEFWX1BJWF9GTVRfQkdSNTY1QkUsICAvLy88IHBhY2tlZCBCR1IgNTo2OjUsIDE2YnBwLCAobXNiKSAgIDVCIDZHIDVSKGxzYiksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0JHUjU2NUxFLCAgLy8vPCBwYWNrZWQgQkdSIDU6Njo1LCAxNmJwcCwgKG1zYikgICA1QiA2RyA1Uihsc2IpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9CR1I1NTVCRSwgIC8vLzwgcGFja2VkIEJHUiA1OjU6NSwgMTZicHAsIChtc2IpMUEgNUIgNUcgNVIobHNiKSwgYmlnLWVuZGlhbiwgbW9zdCBzaWduaWZpY2FudCBiaXQgdG8gMQorICAgIEFWX1BJWF9GTVRfQkdSNTU1TEUsICAvLy88IHBhY2tlZCBCR1IgNTo1OjUsIDE2YnBwLCAobXNiKTFBIDVCIDVHIDVSKGxzYiksIGxpdHRsZS1lbmRpYW4sIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvIDEKKworICAgIEFWX1BJWF9GTVRfVkFBUElfTU9DTywgLy8vPCBIVyBhY2NlbGVyYXRpb24gdGhyb3VnaCBWQSBBUEkgYXQgbW90aW9uIGNvbXBlbnNhdGlvbiBlbnRyeS1wb2ludCwgUGljdHVyZS5kYXRhWzNdIGNvbnRhaW5zIGEgdmFhcGlfcmVuZGVyX3N0YXRlIHN0cnVjdCB3aGljaCBjb250YWlucyBtYWNyb2Jsb2NrcyBhcyB3ZWxsIGFzIHZhcmlvdXMgZmllbGRzIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMKKyAgICBBVl9QSVhfRk1UX1ZBQVBJX0lEQ1QsIC8vLzwgSFcgYWNjZWxlcmF0aW9uIHRocm91Z2ggVkEgQVBJIGF0IElEQ1QgZW50cnktcG9pbnQsIFBpY3R1cmUuZGF0YVszXSBjb250YWlucyBhIHZhYXBpX3JlbmRlcl9zdGF0ZSBzdHJ1Y3Qgd2hpY2ggY29udGFpbnMgZmllbGRzIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMKKyAgICBBVl9QSVhfRk1UX1ZBQVBJX1ZMRCwgIC8vLzwgSFcgZGVjb2RpbmcgdGhyb3VnaCBWQSBBUEksIFBpY3R1cmUuZGF0YVszXSBjb250YWlucyBhIHZhYXBpX3JlbmRlcl9zdGF0ZSBzdHJ1Y3Qgd2hpY2ggY29udGFpbnMgdGhlIGJpdHN0cmVhbSBvZiB0aGUgc2xpY2VzIGFzIHdlbGwgYXMgdmFyaW91cyBmaWVsZHMgZXh0cmFjdGVkIGZyb20gaGVhZGVycworCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTZMRSwgIC8vLzwgcGxhbmFyIFlVViA0OjI6MCwgMjRicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2QkUsICAvLy88IHBsYW5hciBZVVYgNDoyOjAsIDI0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQyMlAxNkxFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLCAzMmJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTZCRSwgIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwgMzJicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE2TEUsICAvLy88IHBsYW5hciBZVVYgNDo0OjQsIDQ4YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNkJFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LCA0OGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisjaWYgRkZfQVBJX1ZEUEFVCisgICAgQVZfUElYX0ZNVF9WRFBBVV9NUEVHNCwgIC8vLzwgTVBFRzQgSFcgZGVjb2Rpbmcgd2l0aCBWRFBBVSwgZGF0YVswXSBjb250YWlucyBhIHZkcGF1X3JlbmRlcl9zdGF0ZSBzdHJ1Y3Qgd2hpY2ggY29udGFpbnMgdGhlIGJpdHN0cmVhbSBvZiB0aGUgc2xpY2VzIGFzIHdlbGwgYXMgdmFyaW91cyBmaWVsZHMgZXh0cmFjdGVkIGZyb20gaGVhZGVycworI2VuZGlmCisgICAgQVZfUElYX0ZNVF9EWFZBMl9WTEQsICAgIC8vLzwgSFcgZGVjb2RpbmcgdGhyb3VnaCBEWFZBMiwgUGljdHVyZS5kYXRhWzNdIGNvbnRhaW5zIGEgTFBESVJFQ1QzRFNVUkZBQ0U5IHBvaW50ZXIKKworICAgIEFWX1BJWF9GTVRfUkdCNDQ0TEUsICAvLy88IHBhY2tlZCBSR0IgNDo0OjQsIDE2YnBwLCAobXNiKTRBIDRSIDRHIDRCKGxzYiksIGxpdHRsZS1lbmRpYW4sIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyB0byAwCisgICAgQVZfUElYX0ZNVF9SR0I0NDRCRSwgIC8vLzwgcGFja2VkIFJHQiA0OjQ6NCwgMTZicHAsIChtc2IpNEEgNFIgNEcgNEIobHNiKSwgYmlnLWVuZGlhbiwgbW9zdCBzaWduaWZpY2FudCBiaXRzIHRvIDAKKyAgICBBVl9QSVhfRk1UX0JHUjQ0NExFLCAgLy8vPCBwYWNrZWQgQkdSIDQ6NDo0LCAxNmJwcCwgKG1zYik0QSA0QiA0RyA0Uihsc2IpLCBsaXR0bGUtZW5kaWFuLCBtb3N0IHNpZ25pZmljYW50IGJpdHMgdG8gMQorICAgIEFWX1BJWF9GTVRfQkdSNDQ0QkUsICAvLy88IHBhY2tlZCBCR1IgNDo0OjQsIDE2YnBwLCAobXNiKTRBIDRCIDRHIDRSKGxzYiksIGJpZy1lbmRpYW4sIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyB0byAxCisgICAgQVZfUElYX0ZNVF9ZQTgsICAgICAgIC8vLzwgOGJpdCBncmF5LCA4Yml0IGFscGhhCisKKyAgICBBVl9QSVhfRk1UX1k0MDBBID0gQVZfUElYX0ZNVF9ZQTgsIC8vLzwgYWxpYXMgZm9yIEFWX1BJWF9GTVRfWUE4CisgICAgQVZfUElYX0ZNVF9HUkFZOEE9IEFWX1BJWF9GTVRfWUE4LCAvLy88IGFsaWFzIGZvciBBVl9QSVhfRk1UX1lBOAorCisgICAgQVZfUElYX0ZNVF9CR1I0OEJFLCAgIC8vLzwgcGFja2VkIFJHQiAxNjoxNjoxNiwgNDhicHAsIDE2QiwgMTZHLCAxNlIsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9CR1I0OExFLCAgIC8vLzwgcGFja2VkIFJHQiAxNjoxNjoxNiwgNDhicHAsIDE2QiwgMTZHLCAxNlIsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuCisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9sbG93aW5nIDEyIGZvcm1hdHMgaGF2ZSB0aGUgZGlzYWR2YW50YWdlIG9mIG5lZWRpbmcgMSBmb3JtYXQgZm9yIGVhY2ggYml0IGRlcHRoLgorICAgICAqIE5vdGljZSB0aGF0IGVhY2ggOS8xMCBiaXRzIHNhbXBsZSBpcyBzdG9yZWQgaW4gMTYgYml0cyB3aXRoIGV4dHJhIHBhZGRpbmcuCisgICAgICogSWYgeW91IHdhbnQgdG8gc3VwcG9ydCBtdWx0aXBsZSBiaXQgZGVwdGhzLCB0aGVuIHVzaW5nIEFWX1BJWF9GTVRfWVVWNDIwUDE2KiB3aXRoIHRoZSBicHAgc3RvcmVkIHNlcGFyYXRlbHkgaXMgYmV0dGVyLgorICAgICAqLworICAgIEFWX1BJWF9GTVRfWVVWNDIwUDlCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAxMy41YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQyMFA5TEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MCwgMTMuNWJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTBCRSwvLy88IHBsYW5hciBZVVYgNDoyOjAsIDE1YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMExFLC8vLzwgcGxhbmFyIFlVViA0OjI6MCwgMTVicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEwQkUsLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLCAyMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTBMRSwvLy88IHBsYW5hciBZVVYgNDoyOjIsIDIwYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5QkUsIC8vLzwgcGxhbmFyIFlVViA0OjQ6NCwgMjdicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDlMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LCAyN2JwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTBCRSwvLy88IHBsYW5hciBZVVYgNDo0OjQsIDMwYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMExFLC8vLzwgcGxhbmFyIFlVViA0OjQ6NCwgMzBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDlCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLCAxOGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQOUxFLCAvLy88IHBsYW5hciBZVVYgNDoyOjIsIDE4YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1ZEQV9WTEQsICAgIC8vLzwgaGFyZHdhcmUgZGVjb2RpbmcgdGhyb3VnaCBWREEKKworI2lmZGVmIEFWX1BJWF9GTVRfQUJJX0dJVF9NQVNURVIKKyAgICBBVl9QSVhfRk1UX1JHQkE2NEJFLCAgLy8vPCBwYWNrZWQgUkdCQSAxNjoxNjoxNjoxNiwgNjRicHAsIDE2UiwgMTZHLCAxNkIsIDE2QSwgdGhlIDItYnl0ZSB2YWx1ZSBmb3IgZWFjaCBSL0cvQi9BIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfUkdCQTY0TEUsICAvLy88IHBhY2tlZCBSR0JBIDE2OjE2OjE2OjE2LCA2NGJwcCwgMTZSLCAxNkcsIDE2QiwgMTZBLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CL0EgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9CR1JBNjRCRSwgIC8vLzwgcGFja2VkIFJHQkEgMTY6MTY6MTY6MTYsIDY0YnBwLCAxNkIsIDE2RywgMTZSLCAxNkEsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IvQSBjb21wb25lbnQgaXMgc3RvcmVkIGFzIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0JHUkE2NExFLCAgLy8vPCBwYWNrZWQgUkdCQSAxNjoxNjoxNjoxNiwgNjRicHAsIDE2QiwgMTZHLCAxNlIsIDE2QSwgdGhlIDItYnl0ZSB2YWx1ZSBmb3IgZWFjaCBSL0cvQi9BIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbgorI2VuZGlmCisgICAgQVZfUElYX0ZNVF9HQlJQLCAgICAgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCAyNGJwcAorICAgIEFWX1BJWF9GTVRfR0JSUDlCRSwgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgMjdicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUlA5TEUsICAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0IDI3YnBwLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9HQlJQMTBCRSwgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCAzMGJwcCwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR0JSUDEwTEUsICAvLy88IHBsYW5hciBHQlIgNDo0OjQgMzBicHAsIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUlAxNkJFLCAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0IDQ4YnBwLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9HQlJQMTZMRSwgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCA0OGJwcCwgbGl0dGxlLWVuZGlhbgorCisgICAgLyoqCisgICAgICogZHVwbGljYXRlZCBwaXhlbCBmb3JtYXRzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbGliYXYuCisgICAgICogRkZtcGVnIHN1cHBvcnRzIHRoZXNlIGZvcm1hdHMgc2luY2UgTWF5IDggMjAxMiBhbmQgSmFuIDI4IDIwMTIgKGNvbW1pdHMgZjljYTFhYzcgYW5kIDE0M2E1YzU1KQorICAgICAqIExpYmF2IGFkZGVkIHRoZW0gT2N0IDEyIDIwMTIgd2l0aCBpbmNvbXBhdGlibGUgdmFsdWVzIChjb21taXQgNmQ1NjAwZTg1KQorICAgICAqLworICAgIEFWX1BJWF9GTVRfWVVWQTQyMlBfTElCQVYsICAvLy88IHBsYW5hciBZVVYgNDoyOjIgMjRicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSAmIEEgc2FtcGxlcykKKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQX0xJQkFWLCAgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0IDMyYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgJiBBIHNhbXBsZXMpCisKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjBQOUJFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowIDIyLjVicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSAmIEEgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVkE0MjBQOUxFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowIDIyLjVicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSAmIEEgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVkE0MjJQOUJFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyIDI3YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgJiBBIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUDlMRSwgIC8vLzwgcGxhbmFyIFlVViA0OjI6MiAyN2JwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZICYgQSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFA5QkUsICAvLy88IHBsYW5hciBZVVYgNDo0OjQgMzZicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSAmIEEgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQOUxFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0IDM2YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgJiBBIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwQkUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MCAyNWJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZICYgQSBzYW1wbGVzLCBiaWctZW5kaWFuKQorICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxMExFLCAvLy88IHBsYW5hciBZVVYgNDoyOjAgMjVicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSAmIEEgc2FtcGxlcywgbGl0dGxlLWVuZGlhbikKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjJQMTBCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyIDMwYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgJiBBIHNhbXBsZXMsIGJpZy1lbmRpYW4pCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwTEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiAzMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZICYgQSBzYW1wbGVzLCBsaXR0bGUtZW5kaWFuKQorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMEJFLCAvLy88IHBsYW5hciBZVVYgNDo0OjQgNDBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSAmIEEgc2FtcGxlcywgYmlnLWVuZGlhbikKKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQMTBMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0IDQwYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgJiBBIHNhbXBsZXMsIGxpdHRsZS1lbmRpYW4pCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2QkUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MCA0MGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZICYgQSBzYW1wbGVzLCBiaWctZW5kaWFuKQorICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxNkxFLCAvLy88IHBsYW5hciBZVVYgNDoyOjAgNDBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSAmIEEgc2FtcGxlcywgbGl0dGxlLWVuZGlhbikKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjJQMTZCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyIDQ4YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgJiBBIHNhbXBsZXMsIGJpZy1lbmRpYW4pCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2TEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiA0OGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZICYgQSBzYW1wbGVzLCBsaXR0bGUtZW5kaWFuKQorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNkJFLCAvLy88IHBsYW5hciBZVVYgNDo0OjQgNjRicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSAmIEEgc2FtcGxlcywgYmlnLWVuZGlhbikKKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQMTZMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0IDY0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgJiBBIHNhbXBsZXMsIGxpdHRsZS1lbmRpYW4pCisKKyAgICBBVl9QSVhfRk1UX1ZEUEFVLCAgICAgLy8vPCBIVyBhY2NlbGVyYXRpb24gdGhyb3VnaCBWRFBBVSwgUGljdHVyZS5kYXRhWzNdIGNvbnRhaW5zIGEgVmRwVmlkZW9TdXJmYWNlCisKKyAgICBBVl9QSVhfRk1UX1hZWjEyTEUsICAgICAgLy8vPCBwYWNrZWQgWFlaIDQ6NDo0LCAzNiBicHAsIChtc2IpIDEyWCwgMTJZLCAxMlogKGxzYiksIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggWC9ZL1ogaXMgc3RvcmVkIGFzIGxpdHRsZS1lbmRpYW4sIHRoZSA0IGxvd2VyIGJpdHMgYXJlIHNldCB0byAwCisgICAgQVZfUElYX0ZNVF9YWVoxMkJFLCAgICAgIC8vLzwgcGFja2VkIFhZWiA0OjQ6NCwgMzYgYnBwLCAobXNiKSAxMlgsIDEyWSwgMTJaIChsc2IpLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFgvWS9aIGlzIHN0b3JlZCBhcyBiaWctZW5kaWFuLCB0aGUgNCBsb3dlciBiaXRzIGFyZSBzZXQgdG8gMAorICAgIEFWX1BJWF9GTVRfTlYxNiwgICAgICAgICAvLy88IGludGVybGVhdmVkIGNocm9tYSBZVVYgNDoyOjIsIDE2YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcykKKyAgICBBVl9QSVhfRk1UX05WMjBMRSwgICAgICAgLy8vPCBpbnRlcmxlYXZlZCBjaHJvbWEgWVVWIDQ6MjoyLCAyMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9OVjIwQkUsICAgICAgIC8vLzwgaW50ZXJsZWF2ZWQgY2hyb21hIFlVViA0OjI6MiwgMjBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorCisgICAgLyoqCisgICAgICogZHVwbGljYXRlZCBwaXhlbCBmb3JtYXRzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbGliYXYuCisgICAgICogRkZtcGVnIHN1cHBvcnRzIHRoZXNlIGZvcm1hdHMgc2luY2UgU2F0IFNlcCAyNCAwNjowMTo0NSAyMDExICswMjAwIChjb21taXRzIDk1NjlhM2M5ZjQxMzg3YThjN2QxY2U5N2Q4NjkzNTIwNDc3YTY2YzMpCisgICAgICogYWxzbyBzZWUgRnJpIE5vdiAyNSAwMTozODoyMSAyMDExICswMTAwIDkyYWZiNDMxNjIxYzc5MTU1ZmNiNzE3MWQyNmYxMzdlYjFiZWUwMjgKKyAgICAgKiBMaWJhdiBhZGRlZCB0aGVtIFN1biBNYXIgMTYgMjM6MDU6NDcgMjAxNCArMDEwMCB3aXRoIGluY29tcGF0aWJsZSB2YWx1ZXMgKGNvbW1pdCAxNDgxZDI0YzNhMGFiZjgxZTFkN2E1MTQ1NDdiZDUzMDUyMzJiZTMwKQorICAgICAqLworICAgIEFWX1BJWF9GTVRfUkdCQTY0QkVfTElCQVYsICAgICAvLy88IHBhY2tlZCBSR0JBIDE2OjE2OjE2OjE2LCA2NGJwcCwgMTZSLCAxNkcsIDE2QiwgMTZBLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CL0EgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9SR0JBNjRMRV9MSUJBViwgICAgIC8vLzwgcGFja2VkIFJHQkEgMTY6MTY6MTY6MTYsIDY0YnBwLCAxNlIsIDE2RywgMTZCLCAxNkEsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IvQSBjb21wb25lbnQgaXMgc3RvcmVkIGFzIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0JHUkE2NEJFX0xJQkFWLCAgICAgLy8vPCBwYWNrZWQgUkdCQSAxNjoxNjoxNjoxNiwgNjRicHAsIDE2QiwgMTZHLCAxNlIsIDE2QSwgdGhlIDItYnl0ZSB2YWx1ZSBmb3IgZWFjaCBSL0cvQi9BIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfQkdSQTY0TEVfTElCQVYsICAgICAvLy88IHBhY2tlZCBSR0JBIDE2OjE2OjE2OjE2LCA2NGJwcCwgMTZCLCAxNkcsIDE2UiwgMTZBLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CL0EgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuCisKKyAgICBBVl9QSVhfRk1UX1lWWVU0MjIsICAgLy8vPCBwYWNrZWQgWVVWIDQ6MjoyLCAxNmJwcCwgWTAgQ3IgWTEgQ2IKKworICAgIEFWX1BJWF9GTVRfVkRBLCAgICAgICAgICAvLy88IEhXIGFjY2VsZXJhdGlvbiB0aHJvdWdoIFZEQSwgZGF0YVszXSBjb250YWlucyBhIENWUGl4ZWxCdWZmZXJSZWYKKworICAgIEFWX1BJWF9GTVRfWUExNkJFLCAgICAgICAvLy88IDE2Yml0IGdyYXksIDE2Yml0IGFscGhhIChiaWctZW5kaWFuKQorICAgIEFWX1BJWF9GTVRfWUExNkxFLCAgICAgICAvLy88IDE2Yml0IGdyYXksIDE2Yml0IGFscGhhIChsaXR0bGUtZW5kaWFuKQorCisKKyNpZm5kZWYgQVZfUElYX0ZNVF9BQklfR0lUX01BU1RFUgorICAgIEFWX1BJWF9GTVRfUkdCQTY0QkU9MHgxMjMsICAvLy88IHBhY2tlZCBSR0JBIDE2OjE2OjE2OjE2LCA2NGJwcCwgMTZSLCAxNkcsIDE2QiwgMTZBLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CL0EgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9SR0JBNjRMRSwgIC8vLzwgcGFja2VkIFJHQkEgMTY6MTY6MTY6MTYsIDY0YnBwLCAxNlIsIDE2RywgMTZCLCAxNkEsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IvQSBjb21wb25lbnQgaXMgc3RvcmVkIGFzIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0JHUkE2NEJFLCAgLy8vPCBwYWNrZWQgUkdCQSAxNjoxNjoxNjoxNiwgNjRicHAsIDE2QiwgMTZHLCAxNlIsIDE2QSwgdGhlIDItYnl0ZSB2YWx1ZSBmb3IgZWFjaCBSL0cvQi9BIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfQkdSQTY0TEUsICAvLy88IHBhY2tlZCBSR0JBIDE2OjE2OjE2OjE2LCA2NGJwcCwgMTZCLCAxNkcsIDE2UiwgMTZBLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CL0EgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuCisjZW5kaWYKKyAgICBBVl9QSVhfRk1UXzBSR0I9MHgxMjMrNCwgICAgICAvLy88IHBhY2tlZCBSR0IgODo4OjgsIDMyYnBwLCAwUkdCMFJHQi4uLgorICAgIEFWX1BJWF9GTVRfUkdCMCwgICAgICAvLy88IHBhY2tlZCBSR0IgODo4OjgsIDMyYnBwLCBSR0IwUkdCMC4uLgorICAgIEFWX1BJWF9GTVRfMEJHUiwgICAgICAvLy88IHBhY2tlZCBCR1IgODo4OjgsIDMyYnBwLCAwQkdSMEJHUi4uLgorICAgIEFWX1BJWF9GTVRfQkdSMCwgICAgICAvLy88IHBhY2tlZCBCR1IgODo4OjgsIDMyYnBwLCBCR1IwQkdSMC4uLgorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsICAvLy88IHBsYW5hciBZVVYgNDo0OjQgMzJicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSAmIEEgc2FtcGxlcykKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjJQLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyIDI0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgJiBBIHNhbXBsZXMpCisKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMkJFLCAvLy88IHBsYW5hciBZVVYgNDoyOjAsMThicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEyTEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MCwxOGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTRCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLDIxYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNExFLCAvLy88IHBsYW5hciBZVVYgNDoyOjAsMjFicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEyQkUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwyNGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTJMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLDI0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQyMlAxNEJFLCAvLy88IHBsYW5hciBZVVYgNDoyOjIsMjhicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDE0TEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwyOGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTJCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LDM2YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMkxFLCAvLy88IHBsYW5hciBZVVYgNDo0OjQsMzZicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE0QkUsIC8vLzwgcGxhbmFyIFlVViA0OjQ6NCw0MmJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTRMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LDQyYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUlAxMkJFLCAgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgMzZicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUlAxMkxFLCAgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgMzZicHAsIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUlAxNEJFLCAgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgNDJicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUlAxNExFLCAgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgNDJicHAsIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUkFQLCAgICAgICAvLy88IHBsYW5hciBHQlJBIDQ6NDo0OjQgMzJicHAKKyAgICBBVl9QSVhfRk1UX0dCUkFQMTZCRSwgICAvLy88IHBsYW5hciBHQlJBIDQ6NDo0OjQgNjRicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUkFQMTZMRSwgICAvLy88IHBsYW5hciBHQlJBIDQ6NDo0OjQgNjRicHAsIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVko0MTFQLCAgICAvLy88IHBsYW5hciBZVVYgNDoxOjEsIDEyYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgNHgxIFkgc2FtcGxlcykgZnVsbCBzY2FsZSAoSlBFRyksIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgUElYX0ZNVF9ZVVY0MTFQIGFuZCBzZXR0aW5nIGNvbG9yX3JhbmdlCisKKyAgICBBVl9QSVhfRk1UX0JBWUVSX0JHR1I4LCAgICAvLy88IGJheWVyLCBCR0JHLi4ob2RkIGxpbmUpLCBHUkdSLi4oZXZlbiBsaW5lKSwgOC1iaXQgc2FtcGxlcyAqLworICAgIEFWX1BJWF9GTVRfQkFZRVJfUkdHQjgsICAgIC8vLzwgYmF5ZXIsIFJHUkcuLihvZGQgbGluZSksIEdCR0IuLihldmVuIGxpbmUpLCA4LWJpdCBzYW1wbGVzICovCisgICAgQVZfUElYX0ZNVF9CQVlFUl9HQlJHOCwgICAgLy8vPCBiYXllciwgR0JHQi4uKG9kZCBsaW5lKSwgUkdSRy4uKGV2ZW4gbGluZSksIDgtYml0IHNhbXBsZXMgKi8KKyAgICBBVl9QSVhfRk1UX0JBWUVSX0dSQkc4LCAgICAvLy88IGJheWVyLCBHUkdSLi4ob2RkIGxpbmUpLCBCR0JHLi4oZXZlbiBsaW5lKSwgOC1iaXQgc2FtcGxlcyAqLworICAgIEFWX1BJWF9GTVRfQkFZRVJfQkdHUjE2TEUsIC8vLzwgYmF5ZXIsIEJHQkcuLihvZGQgbGluZSksIEdSR1IuLihldmVuIGxpbmUpLCAxNi1iaXQgc2FtcGxlcywgbGl0dGxlLWVuZGlhbiAqLworICAgIEFWX1BJWF9GTVRfQkFZRVJfQkdHUjE2QkUsIC8vLzwgYmF5ZXIsIEJHQkcuLihvZGQgbGluZSksIEdSR1IuLihldmVuIGxpbmUpLCAxNi1iaXQgc2FtcGxlcywgYmlnLWVuZGlhbiAqLworICAgIEFWX1BJWF9GTVRfQkFZRVJfUkdHQjE2TEUsIC8vLzwgYmF5ZXIsIFJHUkcuLihvZGQgbGluZSksIEdCR0IuLihldmVuIGxpbmUpLCAxNi1iaXQgc2FtcGxlcywgbGl0dGxlLWVuZGlhbiAqLworICAgIEFWX1BJWF9GTVRfQkFZRVJfUkdHQjE2QkUsIC8vLzwgYmF5ZXIsIFJHUkcuLihvZGQgbGluZSksIEdCR0IuLihldmVuIGxpbmUpLCAxNi1iaXQgc2FtcGxlcywgYmlnLWVuZGlhbiAqLworICAgIEFWX1BJWF9GTVRfQkFZRVJfR0JSRzE2TEUsIC8vLzwgYmF5ZXIsIEdCR0IuLihvZGQgbGluZSksIFJHUkcuLihldmVuIGxpbmUpLCAxNi1iaXQgc2FtcGxlcywgbGl0dGxlLWVuZGlhbiAqLworICAgIEFWX1BJWF9GTVRfQkFZRVJfR0JSRzE2QkUsIC8vLzwgYmF5ZXIsIEdCR0IuLihvZGQgbGluZSksIFJHUkcuLihldmVuIGxpbmUpLCAxNi1iaXQgc2FtcGxlcywgYmlnLWVuZGlhbiAqLworICAgIEFWX1BJWF9GTVRfQkFZRVJfR1JCRzE2TEUsIC8vLzwgYmF5ZXIsIEdSR1IuLihvZGQgbGluZSksIEJHQkcuLihldmVuIGxpbmUpLCAxNi1iaXQgc2FtcGxlcywgbGl0dGxlLWVuZGlhbiAqLworICAgIEFWX1BJWF9GTVRfQkFZRVJfR1JCRzE2QkUsIC8vLzwgYmF5ZXIsIEdSR1IuLihvZGQgbGluZSksIEJHQkcuLihldmVuIGxpbmUpLCAxNi1iaXQgc2FtcGxlcywgYmlnLWVuZGlhbiAqLworI2lmICFGRl9BUElfWFZNQworICAgIEFWX1BJWF9GTVRfWFZNQywvLy88IFhWaWRlbyBNb3Rpb24gQWNjZWxlcmF0aW9uIHZpYSBjb21tb24gcGFja2V0IHBhc3NpbmcKKyNlbmRpZiAvKiAhRkZfQVBJX1hWTUMgKi8KKworICAgIEFWX1BJWF9GTVRfTkIsICAgICAgICAvLy88IG51bWJlciBvZiBwaXhlbCBmb3JtYXRzLCBETyBOT1QgVVNFIFRISVMgaWYgeW91IHdhbnQgdG8gbGluayB3aXRoIHNoYXJlZCBsaWJhdiogYmVjYXVzZSB0aGUgbnVtYmVyIG9mIGZvcm1hdHMgbWlnaHQgZGlmZmVyIGJldHdlZW4gdmVyc2lvbnMKKworI2lmIEZGX0FQSV9QSVhfRk1UCisjaW5jbHVkZSAib2xkX3BpeF9mbXRzLmgiCisjZW5kaWYKK307CisKKyNpZiBBVl9IQVZFX0lOQ09NUEFUSUJMRV9MSUJBVl9BQkkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVZBNDIyUCBBVl9QSVhfRk1UX1lVVkE0MjJQX0xJQkFWCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWQTQ0NFAgQVZfUElYX0ZNVF9ZVVZBNDQ0UF9MSUJBVgorI2RlZmluZSBBVl9QSVhfRk1UX1JHQkE2NEJFIEFWX1BJWF9GTVRfUkdCQTY0QkVfTElCQVYKKyNkZWZpbmUgQVZfUElYX0ZNVF9SR0JBNjRMRSBBVl9QSVhfRk1UX1JHQkE2NExFX0xJQkFWCisjZGVmaW5lIEFWX1BJWF9GTVRfQkdSQTY0QkUgQVZfUElYX0ZNVF9CR1JBNjRCRV9MSUJBVgorI2RlZmluZSBBVl9QSVhfRk1UX0JHUkE2NExFIEFWX1BJWF9GTVRfQkdSQTY0TEVfTElCQVYKKyNlbmRpZgorCisKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZNDAwQSBBVl9QSVhfRk1UX0dSQVk4QQorI2RlZmluZSBBVl9QSVhfRk1UX0dCUjI0UCBBVl9QSVhfRk1UX0dCUlAKKworI2lmIEFWX0hBVkVfQklHRU5ESUFOCisjICAgZGVmaW5lIEFWX1BJWF9GTVRfTkUoYmUsIGxlKSBBVl9QSVhfRk1UXyMjYmUKKyNlbHNlCisjICAgZGVmaW5lIEFWX1BJWF9GTVRfTkUoYmUsIGxlKSBBVl9QSVhfRk1UXyMjbGUKKyNlbmRpZgorCisjZGVmaW5lIEFWX1BJWF9GTVRfUkdCMzIgICBBVl9QSVhfRk1UX05FKEFSR0IsIEJHUkEpCisjZGVmaW5lIEFWX1BJWF9GTVRfUkdCMzJfMSBBVl9QSVhfRk1UX05FKFJHQkEsIEFCR1IpCisjZGVmaW5lIEFWX1BJWF9GTVRfQkdSMzIgICBBVl9QSVhfRk1UX05FKEFCR1IsIFJHQkEpCisjZGVmaW5lIEFWX1BJWF9GTVRfQkdSMzJfMSBBVl9QSVhfRk1UX05FKEJHUkEsIEFSR0IpCisjZGVmaW5lIEFWX1BJWF9GTVRfMFJHQjMyICBBVl9QSVhfRk1UX05FKDBSR0IsIEJHUjApCisjZGVmaW5lIEFWX1BJWF9GTVRfMEJHUjMyICBBVl9QSVhfRk1UX05FKDBCR1IsIFJHQjApCisKKyNkZWZpbmUgQVZfUElYX0ZNVF9HUkFZMTYgQVZfUElYX0ZNVF9ORShHUkFZMTZCRSwgR1JBWTE2TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWUExNiAgIEFWX1BJWF9GTVRfTkUoWUExNkJFLCAgIFlBMTZMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9SR0I0OCAgQVZfUElYX0ZNVF9ORShSR0I0OEJFLCAgUkdCNDhMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9SR0I1NjUgQVZfUElYX0ZNVF9ORShSR0I1NjVCRSwgUkdCNTY1TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfUkdCNTU1IEFWX1BJWF9GTVRfTkUoUkdCNTU1QkUsIFJHQjU1NUxFKQorI2RlZmluZSBBVl9QSVhfRk1UX1JHQjQ0NCBBVl9QSVhfRk1UX05FKFJHQjQ0NEJFLCBSR0I0NDRMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9SR0JBNjQgQVZfUElYX0ZNVF9ORShSR0JBNjRCRSwgUkdCQTY0TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfQkdSNDggIEFWX1BJWF9GTVRfTkUoQkdSNDhCRSwgIEJHUjQ4TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfQkdSNTY1IEFWX1BJWF9GTVRfTkUoQkdSNTY1QkUsIEJHUjU2NUxFKQorI2RlZmluZSBBVl9QSVhfRk1UX0JHUjU1NSBBVl9QSVhfRk1UX05FKEJHUjU1NUJFLCBCR1I1NTVMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9CR1I0NDQgQVZfUElYX0ZNVF9ORShCR1I0NDRCRSwgQkdSNDQ0TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfQkdSQTY0IEFWX1BJWF9GTVRfTkUoQkdSQTY0QkUsIEJHUkE2NExFKQorCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWNDIwUDkgIEFWX1BJWF9GTVRfTkUoWVVWNDIwUDlCRSAsIFlVVjQyMFA5TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWNDIyUDkgIEFWX1BJWF9GTVRfTkUoWVVWNDIyUDlCRSAsIFlVVjQyMlA5TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWNDQ0UDkgIEFWX1BJWF9GTVRfTkUoWVVWNDQ0UDlCRSAsIFlVVjQ0NFA5TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWNDIwUDEwIEFWX1BJWF9GTVRfTkUoWVVWNDIwUDEwQkUsIFlVVjQyMFAxMExFKQorI2RlZmluZSBBVl9QSVhfRk1UX1lVVjQyMlAxMCBBVl9QSVhfRk1UX05FKFlVVjQyMlAxMEJFLCBZVVY0MjJQMTBMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVY0NDRQMTAgQVZfUElYX0ZNVF9ORShZVVY0NDRQMTBCRSwgWVVWNDQ0UDEwTEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWNDIwUDEyIEFWX1BJWF9GTVRfTkUoWVVWNDIwUDEyQkUsIFlVVjQyMFAxMkxFKQorI2RlZmluZSBBVl9QSVhfRk1UX1lVVjQyMlAxMiBBVl9QSVhfRk1UX05FKFlVVjQyMlAxMkJFLCBZVVY0MjJQMTJMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVY0NDRQMTIgQVZfUElYX0ZNVF9ORShZVVY0NDRQMTJCRSwgWVVWNDQ0UDEyTEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWNDIwUDE0IEFWX1BJWF9GTVRfTkUoWVVWNDIwUDE0QkUsIFlVVjQyMFAxNExFKQorI2RlZmluZSBBVl9QSVhfRk1UX1lVVjQyMlAxNCBBVl9QSVhfRk1UX05FKFlVVjQyMlAxNEJFLCBZVVY0MjJQMTRMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVY0NDRQMTQgQVZfUElYX0ZNVF9ORShZVVY0NDRQMTRCRSwgWVVWNDQ0UDE0TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWNDIwUDE2IEFWX1BJWF9GTVRfTkUoWVVWNDIwUDE2QkUsIFlVVjQyMFAxNkxFKQorI2RlZmluZSBBVl9QSVhfRk1UX1lVVjQyMlAxNiBBVl9QSVhfRk1UX05FKFlVVjQyMlAxNkJFLCBZVVY0MjJQMTZMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVY0NDRQMTYgQVZfUElYX0ZNVF9ORShZVVY0NDRQMTZCRSwgWVVWNDQ0UDE2TEUpCisKKyNkZWZpbmUgQVZfUElYX0ZNVF9HQlJQOSAgICAgQVZfUElYX0ZNVF9ORShHQlJQOUJFICwgICAgR0JSUDlMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9HQlJQMTAgICAgQVZfUElYX0ZNVF9ORShHQlJQMTBCRSwgICAgR0JSUDEwTEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfR0JSUDEyICAgIEFWX1BJWF9GTVRfTkUoR0JSUDEyQkUsICAgIEdCUlAxMkxFKQorI2RlZmluZSBBVl9QSVhfRk1UX0dCUlAxNCAgICBBVl9QSVhfRk1UX05FKEdCUlAxNEJFLCAgICBHQlJQMTRMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9HQlJQMTYgICAgQVZfUElYX0ZNVF9ORShHQlJQMTZCRSwgICAgR0JSUDE2TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfR0JSQVAxNiAgIEFWX1BJWF9GTVRfTkUoR0JSQVAxNkJFLCAgIEdCUkFQMTZMRSkKKworI2RlZmluZSBBVl9QSVhfRk1UX0JBWUVSX0JHR1IxNiBBVl9QSVhfRk1UX05FKEJBWUVSX0JHR1IxNkJFLCAgICBCQVlFUl9CR0dSMTZMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9CQVlFUl9SR0dCMTYgQVZfUElYX0ZNVF9ORShCQVlFUl9SR0dCMTZCRSwgICAgQkFZRVJfUkdHQjE2TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfQkFZRVJfR0JSRzE2IEFWX1BJWF9GTVRfTkUoQkFZRVJfR0JSRzE2QkUsICAgIEJBWUVSX0dCUkcxNkxFKQorI2RlZmluZSBBVl9QSVhfRk1UX0JBWUVSX0dSQkcxNiBBVl9QSVhfRk1UX05FKEJBWUVSX0dSQkcxNkJFLCAgICBCQVlFUl9HUkJHMTZMRSkKKworCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWQTQyMFA5ICBBVl9QSVhfRk1UX05FKFlVVkE0MjBQOUJFICwgWVVWQTQyMFA5TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWQTQyMlA5ICBBVl9QSVhfRk1UX05FKFlVVkE0MjJQOUJFICwgWVVWQTQyMlA5TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWQTQ0NFA5ICBBVl9QSVhfRk1UX05FKFlVVkE0NDRQOUJFICwgWVVWQTQ0NFA5TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCBBVl9QSVhfRk1UX05FKFlVVkE0MjBQMTBCRSwgWVVWQTQyMFAxMExFKQorI2RlZmluZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTAgQVZfUElYX0ZNVF9ORShZVVZBNDIyUDEwQkUsIFlVVkE0MjJQMTBMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwIEFWX1BJWF9GTVRfTkUoWVVWQTQ0NFAxMEJFLCBZVVZBNDQ0UDEwTEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWQTQyMFAxNiBBVl9QSVhfRk1UX05FKFlVVkE0MjBQMTZCRSwgWVVWQTQyMFAxNkxFKQorI2RlZmluZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTYgQVZfUElYX0ZNVF9ORShZVVZBNDIyUDE2QkUsIFlVVkE0MjJQMTZMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2IEFWX1BJWF9GTVRfTkUoWVVWQTQ0NFAxNkJFLCBZVVZBNDQ0UDE2TEUpCisKKyNkZWZpbmUgQVZfUElYX0ZNVF9YWVoxMiAgICAgIEFWX1BJWF9GTVRfTkUoWFlaMTJCRSwgWFlaMTJMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9OVjIwICAgICAgIEFWX1BJWF9GTVRfTkUoTlYyMEJFLCAgTlYyMExFKQorCisKKyNpZiBGRl9BUElfUElYX0ZNVAorI2RlZmluZSBQaXhlbEZvcm1hdCBBVlBpeGVsRm9ybWF0CisKKyNkZWZpbmUgUElYX0ZNVF9ZNDAwQSBBVl9QSVhfRk1UX1k0MDBBCisjZGVmaW5lIFBJWF9GTVRfR0JSMjRQIEFWX1BJWF9GTVRfR0JSMjRQCisKKyNkZWZpbmUgUElYX0ZNVF9ORShiZSwgbGUpIEFWX1BJWF9GTVRfTkUoYmUsIGxlKQorCisjZGVmaW5lIFBJWF9GTVRfUkdCMzIgICBBVl9QSVhfRk1UX1JHQjMyCisjZGVmaW5lIFBJWF9GTVRfUkdCMzJfMSBBVl9QSVhfRk1UX1JHQjMyXzEKKyNkZWZpbmUgUElYX0ZNVF9CR1IzMiAgIEFWX1BJWF9GTVRfQkdSMzIKKyNkZWZpbmUgUElYX0ZNVF9CR1IzMl8xIEFWX1BJWF9GTVRfQkdSMzJfMQorI2RlZmluZSBQSVhfRk1UXzBSR0IzMiAgQVZfUElYX0ZNVF8wUkdCMzIKKyNkZWZpbmUgUElYX0ZNVF8wQkdSMzIgIEFWX1BJWF9GTVRfMEJHUjMyCisKKyNkZWZpbmUgUElYX0ZNVF9HUkFZMTYgQVZfUElYX0ZNVF9HUkFZMTYKKyNkZWZpbmUgUElYX0ZNVF9SR0I0OCAgQVZfUElYX0ZNVF9SR0I0OAorI2RlZmluZSBQSVhfRk1UX1JHQjU2NSBBVl9QSVhfRk1UX1JHQjU2NQorI2RlZmluZSBQSVhfRk1UX1JHQjU1NSBBVl9QSVhfRk1UX1JHQjU1NQorI2RlZmluZSBQSVhfRk1UX1JHQjQ0NCBBVl9QSVhfRk1UX1JHQjQ0NAorI2RlZmluZSBQSVhfRk1UX0JHUjQ4ICBBVl9QSVhfRk1UX0JHUjQ4CisjZGVmaW5lIFBJWF9GTVRfQkdSNTY1IEFWX1BJWF9GTVRfQkdSNTY1CisjZGVmaW5lIFBJWF9GTVRfQkdSNTU1IEFWX1BJWF9GTVRfQkdSNTU1CisjZGVmaW5lIFBJWF9GTVRfQkdSNDQ0IEFWX1BJWF9GTVRfQkdSNDQ0CisKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0MjBQOSAgQVZfUElYX0ZNVF9ZVVY0MjBQOQorI2RlZmluZSBQSVhfRk1UX1lVVjQyMlA5ICBBVl9QSVhfRk1UX1lVVjQyMlA5CisjZGVmaW5lIFBJWF9GTVRfWVVWNDQ0UDkgIEFWX1BJWF9GTVRfWVVWNDQ0UDkKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0MjBQMTAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0MjJQMTAgQVZfUElYX0ZNVF9ZVVY0MjJQMTAKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0NDRQMTAgQVZfUElYX0ZNVF9ZVVY0NDRQMTAKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0MjBQMTIgQVZfUElYX0ZNVF9ZVVY0MjBQMTIKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0MjJQMTIgQVZfUElYX0ZNVF9ZVVY0MjJQMTIKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0NDRQMTIgQVZfUElYX0ZNVF9ZVVY0NDRQMTIKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0MjBQMTQgQVZfUElYX0ZNVF9ZVVY0MjBQMTQKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0MjJQMTQgQVZfUElYX0ZNVF9ZVVY0MjJQMTQKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0NDRQMTQgQVZfUElYX0ZNVF9ZVVY0NDRQMTQKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0MjBQMTYgQVZfUElYX0ZNVF9ZVVY0MjBQMTYKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0MjJQMTYgQVZfUElYX0ZNVF9ZVVY0MjJQMTYKKyNkZWZpbmUgUElYX0ZNVF9ZVVY0NDRQMTYgQVZfUElYX0ZNVF9ZVVY0NDRQMTYKKworI2RlZmluZSBQSVhfRk1UX1JHQkE2NCBBVl9QSVhfRk1UX1JHQkE2NAorI2RlZmluZSBQSVhfRk1UX0JHUkE2NCBBVl9QSVhfRk1UX0JHUkE2NAorI2RlZmluZSBQSVhfRk1UX0dCUlA5ICBBVl9QSVhfRk1UX0dCUlA5CisjZGVmaW5lIFBJWF9GTVRfR0JSUDEwIEFWX1BJWF9GTVRfR0JSUDEwCisjZGVmaW5lIFBJWF9GTVRfR0JSUDEyIEFWX1BJWF9GTVRfR0JSUDEyCisjZGVmaW5lIFBJWF9GTVRfR0JSUDE0IEFWX1BJWF9GTVRfR0JSUDE0CisjZGVmaW5lIFBJWF9GTVRfR0JSUDE2IEFWX1BJWF9GTVRfR0JSUDE2CisjZW5kaWYKKworLyoqCisgICogQ2hyb21hdGljaXR5IGNvb3JkaW5hdGVzIG9mIHRoZSBzb3VyY2UgcHJpbWFyaWVzLgorICAqLworZW51bSBBVkNvbG9yUHJpbWFyaWVzIHsKKyAgICBBVkNPTF9QUklfUkVTRVJWRUQwICAgPSAwLAorICAgIEFWQ09MX1BSSV9CVDcwOSAgICAgICA9IDEsIC8vLzwgYWxzbyBJVFUtUiBCVDEzNjEgLyBJRUMgNjE5NjYtMi00IC8gU01QVEUgUlAxNzcgQW5uZXggQgorICAgIEFWQ09MX1BSSV9VTlNQRUNJRklFRCA9IDIsCisgICAgQVZDT0xfUFJJX1JFU0VSVkVEICAgID0gMywKKyAgICBBVkNPTF9QUklfQlQ0NzBNICAgICAgPSA0LCAvLy88IGFsc28gRkNDIFRpdGxlIDQ3IENvZGUgb2YgRmVkZXJhbCBSZWd1bGF0aW9ucyA3My42ODIgKGEpKDIwKQorCisgICAgQVZDT0xfUFJJX0JUNDcwQkcgICAgID0gNSwgLy8vPCBhbHNvIElUVS1SIEJUNjAxLTYgNjI1IC8gSVRVLVIgQlQxMzU4IDYyNSAvIElUVS1SIEJUMTcwMCA2MjUgUEFMICYgU0VDQU0KKyAgICBBVkNPTF9QUklfU01QVEUxNzBNICAgPSA2LCAvLy88IGFsc28gSVRVLVIgQlQ2MDEtNiA1MjUgLyBJVFUtUiBCVDEzNTggNTI1IC8gSVRVLVIgQlQxNzAwIE5UU0MKKyAgICBBVkNPTF9QUklfU01QVEUyNDBNICAgPSA3LCAvLy88IGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gYWJvdmUKKyAgICBBVkNPTF9QUklfRklMTSAgICAgICAgPSA4LCAvLy88IGNvbG91ciBmaWx0ZXJzIHVzaW5nIElsbHVtaW5hbnQgQworICAgIEFWQ09MX1BSSV9CVDIwMjAgICAgICA9IDksIC8vLzwgSVRVLVIgQlQyMDIwCisgICAgQVZDT0xfUFJJX05CLCAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKK307CisKKy8qKgorICogQ29sb3IgVHJhbnNmZXIgQ2hhcmFjdGVyaXN0aWMuCisgKi8KK2VudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgeworICAgIEFWQ09MX1RSQ19SRVNFUlZFRDAgICAgPSAwLAorICAgIEFWQ09MX1RSQ19CVDcwOSAgICAgICAgPSAxLCAgLy8vPCBhbHNvIElUVS1SIEJUMTM2MQorICAgIEFWQ09MX1RSQ19VTlNQRUNJRklFRCAgPSAyLAorICAgIEFWQ09MX1RSQ19SRVNFUlZFRCAgICAgPSAzLAorICAgIEFWQ09MX1RSQ19HQU1NQTIyICAgICAgPSA0LCAgLy8vPCBhbHNvIElUVS1SIEJUNDcwTSAvIElUVS1SIEJUMTcwMCA2MjUgUEFMICYgU0VDQU0KKyAgICBBVkNPTF9UUkNfR0FNTUEyOCAgICAgID0gNSwgIC8vLzwgYWxzbyBJVFUtUiBCVDQ3MEJHCisgICAgQVZDT0xfVFJDX1NNUFRFMTcwTSAgICA9IDYsICAvLy88IGFsc28gSVRVLVIgQlQ2MDEtNiA1MjUgb3IgNjI1IC8gSVRVLVIgQlQxMzU4IDUyNSBvciA2MjUgLyBJVFUtUiBCVDE3MDAgTlRTQworICAgIEFWQ09MX1RSQ19TTVBURTI0ME0gICAgPSA3LAorICAgIEFWQ09MX1RSQ19MSU5FQVIgICAgICAgPSA4LCAgLy8vPCAiTGluZWFyIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcyIKKyAgICBBVkNPTF9UUkNfTE9HICAgICAgICAgID0gOSwgIC8vLzwgIkxvZ2FyaXRobWljIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljICgxMDA6MSByYW5nZSkiCisgICAgQVZDT0xfVFJDX0xPR19TUVJUICAgICA9IDEwLCAvLy88ICJMb2dhcml0aG1pYyB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpYyAoMTAwICogU3FydCgxMCkgOiAxIHJhbmdlKSIKKyAgICBBVkNPTF9UUkNfSUVDNjE5NjZfMl80ID0gMTEsIC8vLzwgSUVDIDYxOTY2LTItNAorICAgIEFWQ09MX1RSQ19CVDEzNjFfRUNHICAgPSAxMiwgLy8vPCBJVFUtUiBCVDEzNjEgRXh0ZW5kZWQgQ29sb3VyIEdhbXV0CisgICAgQVZDT0xfVFJDX0lFQzYxOTY2XzJfMSA9IDEzLCAvLy88IElFQyA2MTk2Ni0yLTEgKHNSR0Igb3Igc1lDQykKKyAgICBBVkNPTF9UUkNfQlQyMDIwXzEwICAgID0gMTQsIC8vLzwgSVRVLVIgQlQyMDIwIGZvciAxMCBiaXQgc3lzdGVtCisgICAgQVZDT0xfVFJDX0JUMjAyMF8xMiAgICA9IDE1LCAvLy88IElUVS1SIEJUMjAyMCBmb3IgMTIgYml0IHN5c3RlbQorICAgIEFWQ09MX1RSQ19OQiwgICAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKK307CisKKy8qKgorICogWVVWIGNvbG9yc3BhY2UgdHlwZS4KKyAqLworZW51bSBBVkNvbG9yU3BhY2UgeworICAgIEFWQ09MX1NQQ19SR0IgICAgICAgICA9IDAsICAvLy88IG9yZGVyIG9mIGNvZWZmaWNpZW50cyBpcyBhY3R1YWxseSBHQlIsIGFsc28gSUVDIDYxOTY2LTItMSAoc1JHQikKKyAgICBBVkNPTF9TUENfQlQ3MDkgICAgICAgPSAxLCAgLy8vPCBhbHNvIElUVS1SIEJUMTM2MSAvIElFQyA2MTk2Ni0yLTQgeHZZQ0M3MDkgLyBTTVBURSBSUDE3NyBBbm5leCBCCisgICAgQVZDT0xfU1BDX1VOU1BFQ0lGSUVEID0gMiwKKyAgICBBVkNPTF9TUENfUkVTRVJWRUQgICAgPSAzLAorICAgIEFWQ09MX1NQQ19GQ0MgICAgICAgICA9IDQsICAvLy88IEZDQyBUaXRsZSA0NyBDb2RlIG9mIEZlZGVyYWwgUmVndWxhdGlvbnMgNzMuNjgyIChhKSgyMCkKKyAgICBBVkNPTF9TUENfQlQ0NzBCRyAgICAgPSA1LCAgLy8vPCBhbHNvIElUVS1SIEJUNjAxLTYgNjI1IC8gSVRVLVIgQlQxMzU4IDYyNSAvIElUVS1SIEJUMTcwMCA2MjUgUEFMICYgU0VDQU0gLyBJRUMgNjE5NjYtMi00IHh2WUNDNjAxCisgICAgQVZDT0xfU1BDX1NNUFRFMTcwTSAgID0gNiwgIC8vLzwgYWxzbyBJVFUtUiBCVDYwMS02IDUyNSAvIElUVS1SIEJUMTM1OCA1MjUgLyBJVFUtUiBCVDE3MDAgTlRTQyAvIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gYWJvdmUKKyAgICBBVkNPTF9TUENfU01QVEUyNDBNICAgPSA3LAorICAgIEFWQ09MX1NQQ19ZQ09DRyAgICAgICA9IDgsICAvLy88IFVzZWQgYnkgRGlyYWMgLyBWQy0yIGFuZCBILjI2NCBGUmV4dCwgc2VlIElUVS1UIFNHMTYKKyAgICBBVkNPTF9TUENfQlQyMDIwX05DTCAgPSA5LCAgLy8vPCBJVFUtUiBCVDIwMjAgbm9uLWNvbnN0YW50IGx1bWluYW5jZSBzeXN0ZW0KKyAgICBBVkNPTF9TUENfQlQyMDIwX0NMICAgPSAxMCwgLy8vPCBJVFUtUiBCVDIwMjAgY29uc3RhbnQgbHVtaW5hbmNlIHN5c3RlbQorICAgIEFWQ09MX1NQQ19OQiwgICAgICAgICAgICAgICAvLy88IE5vdCBwYXJ0IG9mIEFCSQorfTsKKyNkZWZpbmUgQVZDT0xfU1BDX1lDR0NPIEFWQ09MX1NQQ19ZQ09DRworCisKKy8qKgorICogTVBFRyB2cyBKUEVHIFlVViByYW5nZS4KKyAqLworZW51bSBBVkNvbG9yUmFuZ2UgeworICAgIEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEID0gMCwKKyAgICBBVkNPTF9SQU5HRV9NUEVHICAgICAgICA9IDEsIC8vLzwgdGhlIG5vcm1hbCAyMTkqMl4obi04KSAiTVBFRyIgWVVWIHJhbmdlcworICAgIEFWQ09MX1JBTkdFX0pQRUcgICAgICAgID0gMiwgLy8vPCB0aGUgbm9ybWFsICAgICAyXm4tMSAgICJKUEVHIiBZVVYgcmFuZ2VzCisgICAgQVZDT0xfUkFOR0VfTkIsICAgICAgICAgICAgICAvLy88IE5vdCBwYXJ0IG9mIEFCSQorfTsKKworLyoqCisgKiBMb2NhdGlvbiBvZiBjaHJvbWEgc2FtcGxlcy4KKyAqCisgKiAgWCAgIFggICAgICAzIDQgWCAgICAgIFggYXJlIGx1bWEgc2FtcGxlcywKKyAqICAgICAgICAgICAgIDEgMiAgICAgICAgMS02IGFyZSBwb3NzaWJsZSBjaHJvbWEgcG9zaXRpb25zCisgKiAgWCAgIFggICAgICA1IDYgWCAgICAgIDAgaXMgdW5kZWZpbmVkL3Vua25vd24gcG9zaXRpb24KKyAqLworZW51bSBBVkNocm9tYUxvY2F0aW9uIHsKKyAgICBBVkNIUk9NQV9MT0NfVU5TUEVDSUZJRUQgPSAwLAorICAgIEFWQ0hST01BX0xPQ19MRUZUICAgICAgICA9IDEsIC8vLzwgbXBlZzIvNCwgaDI2NCBkZWZhdWx0CisgICAgQVZDSFJPTUFfTE9DX0NFTlRFUiAgICAgID0gMiwgLy8vPCBtcGVnMSwganBlZywgaDI2MworICAgIEFWQ0hST01BX0xPQ19UT1BMRUZUICAgICA9IDMsIC8vLzwgRFYKKyAgICBBVkNIUk9NQV9MT0NfVE9QICAgICAgICAgPSA0LAorICAgIEFWQ0hST01BX0xPQ19CT1RUT01MRUZUICA9IDUsCisgICAgQVZDSFJPTUFfTE9DX0JPVFRPTSAgICAgID0gNiwKKyAgICBBVkNIUk9NQV9MT0NfTkIsICAgICAgICAgICAgICAvLy88IE5vdCBwYXJ0IG9mIEFCSQorfTsKKworI2VuZGlmIC8qIEFWVVRJTF9QSVhGTVRfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9wcGMvTWFrZWZpbGUgYi9mZm1wZWcvbGliYXZ1dGlsL3BwYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQ4ZDZkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9wcGMvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACitPQkpTICs9IHBwYy9jcHUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBwYy9mbG9hdF9kc3BfaW5pdC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK0FMVElWRUMtT0JKUyArPSBwcGMvZmxvYXRfZHNwX2FsdGl2ZWMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvcHBjL2NwdS5jIGIvZmZtcGVnL2xpYmF2dXRpbC9wcGMvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxZTNmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvcHBjL2NwdS5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmZGVmIF9fQVBQTEVfXworI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKyNlbGlmIGRlZmluZWQoX19PcGVuQlNEX18pCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2luY2x1ZGUgPG1hY2hpbmUvY3B1Lmg+CisjZWxpZiBkZWZpbmVkKF9fQU1JR0FPUzRfXykKKyNpbmNsdWRlIDxleGVjL2V4ZWMuaD4KKyNpbmNsdWRlIDxpbnRlcmZhY2VzL2V4ZWMuaD4KKyNpbmNsdWRlIDxwcm90by9leGVjLmg+CisjZW5kaWYgLyogX19BUFBMRV9fICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gTUFZIHJlbHkgb24gc2lnbmFsKCkgb3IgZm9yaygpIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSBBbHRpVmVjCisgKiBpcyBwcmVzZW50LgorICovCitpbnQgZmZfZ2V0X2NwdV9mbGFnc19wcGModm9pZCkKK3sKKyNpZiBIQVZFX0FMVElWRUMKKyNpZmRlZiBfX0FNSUdBT1M0X18KKyAgICBVTE9ORyByZXN1bHQgPSAwOworICAgIGV4dGVybiBzdHJ1Y3QgRXhlY0lGYWNlICpJRXhlYzsKKworICAgIElFeGVjLT5HZXRDUFVJbmZvVGFncyhHQ0lUX1ZlY3RvclVuaXQsICZyZXN1bHQsIFRBR19ET05FKTsKKyAgICBpZiAocmVzdWx0ID09IFZFQ1RPUlRZUEVfQUxUSVZFQykKKyAgICAgICAgcmV0dXJuIEFWX0NQVV9GTEFHX0FMVElWRUM7CisgICAgcmV0dXJuIDA7CisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykKKyNpZmRlZiBfX09wZW5CU0RfXworICAgIGludCBzZWxzWzJdID0ge0NUTF9NQUNIREVQLCBDUFVfQUxUSVZFQ307CisjZWxzZQorICAgIGludCBzZWxzWzJdID0ge0NUTF9IVywgSFdfVkVDVE9SVU5JVH07CisjZW5kaWYKKyAgICBpbnQgaGFzX3Z1ID0gMDsKKyAgICBzaXplX3QgbGVuID0gc2l6ZW9mKGhhc192dSk7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IHN5c2N0bChzZWxzLCAyLCAmaGFzX3Z1LCAmbGVuLCBOVUxMLCAwKTsKKworICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgcmV0dXJuIGhhc192dSA/IEFWX0NQVV9GTEFHX0FMVElWRUMgOiAwOworICAgIHJldHVybiAwOworI2VsaWYgQ09ORklHX1JVTlRJTUVfQ1BVREVURUNUICYmIGRlZmluZWQoX19saW51eF9fKSAmJiAhQVJDSF9QUEM2NAorICAgIGludCBwcm9jX3ZlcjsKKyAgICAvLyBTdXBwb3J0IG9mIG1mc3ByIFBWUiBlbXVsYXRpb24gYWRkZWQgaW4gTGludXggMi42LjE3LgorICAgIF9fYXNtX18gdm9sYXRpbGUoIm1mc3ByICUwLCAyODciIDogIj1yIiAocHJvY192ZXIpKTsKKyAgICBwcm9jX3ZlciA+Pj0gMTY7CisgICAgaWYgKHByb2NfdmVyICAmIDB4ODAwMCB8fAorICAgICAgICBwcm9jX3ZlciA9PSAweDAwMGMgfHwKKyAgICAgICAgcHJvY192ZXIgPT0gMHgwMDM5IHx8IHByb2NfdmVyID09IDB4MDAzYyB8fAorICAgICAgICBwcm9jX3ZlciA9PSAweDAwNDQgfHwgcHJvY192ZXIgPT0gMHgwMDQ1IHx8CisgICAgICAgIHByb2NfdmVyID09IDB4MDA3MCkKKyAgICAgICAgcmV0dXJuIEFWX0NQVV9GTEFHX0FMVElWRUM7CisgICAgcmV0dXJuIDA7CisjZWxzZQorICAgIC8vIFNpbmNlIHdlIHdlcmUgY29tcGlsZWQgZm9yIEFsdGlWZWMsIGp1c3QgYXNzdW1lIHdlIGhhdmUgaXQKKyAgICAvLyB1bnRpbCBzb21lb25lIGNvbWVzIHVwIHdpdGggYSBwcm9wZXIgd2F5IChub3QgaW52b2x2aW5nIHNpZ25hbCBoYWNrcykuCisgICAgcmV0dXJuIEFWX0NQVV9GTEFHX0FMVElWRUM7CisjZW5kaWYgLyogX19BTUlHQU9TNF9fICovCisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3BwYy9jcHUuaCBiL2ZmbXBlZy9saWJhdnV0aWwvcHBjL2NwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjEyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3BwYy9jcHUuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX1BQQ19DUFVfSAorI2RlZmluZSBBVlVUSUxfUFBDX0NQVV9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdV9pbnRlcm5hbC5oIgorCisjZGVmaW5lIFBQQ19BTFRJVkVDKGZsYWdzKSBDUFVFWFQoZmxhZ3MsIEFMVElWRUMpCisKKyNlbmRpZiAvKiBBVlVUSUxfUFBDX0NQVV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3BwYy9mbG9hdF9kc3BfYWx0aXZlYy5jIGIvZmZtcGVnL2xpYmF2dXRpbC9wcGMvZmxvYXRfZHNwX2FsdGl2ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWFmOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9wcGMvZmxvYXRfZHNwX2FsdGl2ZWMuYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBMdWNhIEJhcmJhdG8gPGx1X3plcm9AZ2VudG9vLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInV0aWxfYWx0aXZlYy5oIgorI2luY2x1ZGUgImZsb2F0X2RzcF9hbHRpdmVjLmgiCisKK3ZvaWQgZmZfdmVjdG9yX2ZtdWxfYWx0aXZlYyhmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICB2ZWN0b3IgZmxvYXQgZDAsIGQxLCBzLCB6ZXJvID0gKHZlY3RvciBmbG9hdCl2ZWNfc3BsYXRfdTMyKDApOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSA3OyBpICs9IDgpIHsKKyAgICAgICAgZDAgPSB2ZWNfbGQoIDAsIHNyYzAgKyBpKTsKKyAgICAgICAgcyAgPSB2ZWNfbGQoIDAsIHNyYzEgKyBpKTsKKyAgICAgICAgZDEgPSB2ZWNfbGQoMTYsIHNyYzAgKyBpKTsKKyAgICAgICAgZDAgPSB2ZWNfbWFkZChkMCwgcywgemVybyk7CisgICAgICAgIGQxID0gdmVjX21hZGQoZDEsIHZlY19sZCgxNiwgc3JjMSArIGkpLCB6ZXJvKTsKKyAgICAgICAgdmVjX3N0KGQwLCAgMCwgZHN0ICsgaSk7CisgICAgICAgIHZlY19zdChkMSwgMTYsIGRzdCArIGkpOworICAgIH0KK30KKwordm9pZCBmZl92ZWN0b3JfZm11bF93aW5kb3dfYWx0aXZlYyhmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzEsIGNvbnN0IGZsb2F0ICp3aW4sIGludCBsZW4pCit7CisgICAgdmVjdG9yIGZsb2F0IHplcm8sIHQwLCB0MSwgczAsIHMxLCB3aSwgd2o7CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcmV2ZXJzZSA9IHZjcHJtKDMsIDIsIDEsIDApOworICAgIGludCBpLCBqOworCisgICAgZHN0ICArPSBsZW47CisgICAgd2luICArPSBsZW47CisgICAgc3JjMCArPSBsZW47CisKKyAgICB6ZXJvID0gKHZlY3RvciBmbG9hdCl2ZWNfc3BsYXRfdTMyKDApOworCisgICAgZm9yIChpID0gLWxlbiAqIDQsIGogPSBsZW4gKiA0IC0gMTY7IGkgPCAwOyBpICs9IDE2LCBqIC09IDE2KSB7CisgICAgICAgIHMwID0gdmVjX2xkKGksIHNyYzApOworICAgICAgICBzMSA9IHZlY19sZChqLCBzcmMxKTsKKyAgICAgICAgd2kgPSB2ZWNfbGQoaSwgd2luKTsKKyAgICAgICAgd2ogPSB2ZWNfbGQoaiwgd2luKTsKKworICAgICAgICBzMSA9IHZlY19wZXJtKHMxLCBzMSwgcmV2ZXJzZSk7CisgICAgICAgIHdqID0gdmVjX3Blcm0od2osIHdqLCByZXZlcnNlKTsKKworICAgICAgICB0MCA9IHZlY19tYWRkKHMwLCB3aiwgemVybyk7CisgICAgICAgIHQwID0gdmVjX25tc3ViKHMxLCB3aSwgdDApOworICAgICAgICB0MSA9IHZlY19tYWRkKHMwLCB3aSwgemVybyk7CisgICAgICAgIHQxID0gdmVjX21hZGQoczEsIHdqLCB0MSk7CisgICAgICAgIHQxID0gdmVjX3Blcm0odDEsIHQxLCByZXZlcnNlKTsKKworICAgICAgICB2ZWNfc3QodDAsIGksIGRzdCk7CisgICAgICAgIHZlY19zdCh0MSwgaiwgZHN0KTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfdmVjdG9yX2ZtdWxfYWRkX2FsdGl2ZWMoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMxLCBjb25zdCBmbG9hdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICB2ZWN0b3IgZmxvYXQgZCwgc3MwLCBzczEsIHNzMiwgdDAsIHQxLCBlZGdlczsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSAzOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSB2ZWNfbGQoMCwgZHN0ICsgaSk7CisgICAgICAgIHQxID0gdmVjX2xkKDE1LCBkc3QgKyBpKTsKKyAgICAgICAgc3MwID0gdmVjX2xkKDAsIHNyYzAgKyBpKTsKKyAgICAgICAgc3MxID0gdmVjX2xkKDAsIHNyYzEgKyBpKTsKKyAgICAgICAgc3MyID0gdmVjX2xkKDAsIHNyYzIgKyBpKTsKKyAgICAgICAgZWRnZXMgPSB2ZWNfcGVybSh0MSwgdDAsIHZjcHJtKDAsIDEsIDIsIDMpKTsKKyAgICAgICAgZCA9IHZlY19tYWRkKHNzMCwgc3MxLCBzczIpOworICAgICAgICB0MSA9IHZlY19wZXJtKGQsIGVkZ2VzLCB2Y3BybShzMCxzMSxzMixzMykpOworICAgICAgICB0MCA9IHZlY19wZXJtKGVkZ2VzLCBkLCB2Y3BybShzMCxzMSxzMixzMykpOworICAgICAgICB2ZWNfc3QodDEsIDE1LCBkc3QgKyBpKTsKKyAgICAgICAgdmVjX3N0KHQwLCAwLCBkc3QgKyBpKTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfdmVjdG9yX2ZtdWxfcmV2ZXJzZV9hbHRpdmVjKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzEsIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgdmVjdG9yIGZsb2F0IGQsIHMwLCBzMSwgaDAsIGwwLAorICAgICAgICAgICAgICAgIHMyLCBzMywgemVybyA9ICh2ZWN0b3IgZmxvYXQpIHZlY19zcGxhdF91MzIoMCk7CisKKyAgICBzcmMxICs9IGxlbi00OworICAgIGZvcihpID0gMDsgaSA8IGxlbiAtIDc7IGkgKz0gOCkgeworICAgICAgICBzMSA9IHZlY19sZCgwLCBzcmMxIC0gaSk7ICAgICAgICAgICAgICAvLyBbYSxiLGMsZF0KKyAgICAgICAgczAgPSB2ZWNfbGQoMCwgc3JjMCArIGkpOworICAgICAgICBsMCA9IHZlY19tZXJnZWwoczEsIHMxKTsgICAgICAgICAgICAgICAvLyBbYyxjLGQsZF0KKyAgICAgICAgczMgPSB2ZWNfbGQoLTE2LCBzcmMxIC0gaSk7CisgICAgICAgIGgwID0gdmVjX21lcmdlaChzMSwgczEpOyAgICAgICAgICAgICAgIC8vIFthLGEsYixiXQorICAgICAgICBzMiA9IHZlY19sZCgxNiwgc3JjMCArIGkpOworICAgICAgICBzMSA9IHZlY19tZXJnZWgodmVjX21lcmdlbChsMCwgaDApLCAgICAvLyBbZCxiLGQsYl0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZlY19tZXJnZWgobDAsIGgwKSk7ICAgLy8gW2MsYSxjLGFdCisgICAgICAgIC8vIFtkLGMsYixhXQorICAgICAgICBsMCA9IHZlY19tZXJnZWwoczMsIHMzKTsKKyAgICAgICAgZCA9IHZlY19tYWRkKHMwLCBzMSwgemVybyk7CisgICAgICAgIGgwID0gdmVjX21lcmdlaChzMywgczMpOworICAgICAgICB2ZWNfc3QoZCwgMCwgZHN0ICsgaSk7CisgICAgICAgIHMzID0gdmVjX21lcmdlaCh2ZWNfbWVyZ2VsKGwwLCBoMCksCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWNfbWVyZ2VoKGwwLCBoMCkpOworICAgICAgICBkID0gdmVjX21hZGQoczIsIHMzLCB6ZXJvKTsKKyAgICAgICAgdmVjX3N0KGQsIDE2LCBkc3QgKyBpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3BwYy9mbG9hdF9kc3BfYWx0aXZlYy5oIGIvZmZtcGVnL2xpYmF2dXRpbC9wcGMvZmxvYXRfZHNwX2FsdGl2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWQ1MzBhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9wcGMvZmxvYXRfZHNwX2FsdGl2ZWMuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEx1Y2EgQmFyYmF0byA8bHVfemVyb0BnZW50b28ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9QUENfRkxPQVRfRFNQX0FMVElWRUNfSAorI2RlZmluZSBBVlVUSUxfUFBDX0ZMT0FUX0RTUF9BTFRJVkVDX0gKKwordm9pZCBmZl92ZWN0b3JfZm11bF9hbHRpdmVjKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMxLCBpbnQgbGVuKTsKKwordm9pZCBmZl92ZWN0b3JfZm11bF93aW5kb3dfYWx0aXZlYyhmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzEsIGNvbnN0IGZsb2F0ICp3aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCit2b2lkIGZmX3ZlY3Rvcl9mbXVsX2FkZF9hbHRpdmVjKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMSwgY29uc3QgZmxvYXQgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCit2b2lkIGZmX3ZlY3Rvcl9mbXVsX3JldmVyc2VfYWx0aXZlYyhmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMxLCBpbnQgbGVuKTsKKworI2VuZGlmIC8qIEFWVVRJTF9QUENfRkxPQVRfRFNQX0FMVElWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9wcGMvZmxvYXRfZHNwX2luaXQuYyBiL2ZmbXBlZy9saWJhdnV0aWwvcHBjL2Zsb2F0X2RzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkMjA3MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvcHBjL2Zsb2F0X2RzcF9pbml0LmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBMdWNhIEJhcmJhdG8gPGx1X3plcm9AZ2VudG9vLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgorI2luY2x1ZGUgImZsb2F0X2RzcF9hbHRpdmVjLmgiCisKK2F2X2NvbGQgdm9pZCBmZl9mbG9hdF9kc3BfaW5pdF9wcGMoQVZGbG9hdERTUENvbnRleHQgKmZkc3AsIGludCBiaXRfZXhhY3QpCit7CisgICAgaWYgKCFQUENfQUxUSVZFQyhhdl9nZXRfY3B1X2ZsYWdzKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBmZHNwLT52ZWN0b3JfZm11bCA9IGZmX3ZlY3Rvcl9mbXVsX2FsdGl2ZWM7CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfYWRkID0gZmZfdmVjdG9yX2ZtdWxfYWRkX2FsdGl2ZWM7CisgICAgZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZSA9IGZmX3ZlY3Rvcl9mbXVsX3JldmVyc2VfYWx0aXZlYzsKKworICAgIGlmICghYml0X2V4YWN0KSB7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyA9IGZmX3ZlY3Rvcl9mbXVsX3dpbmRvd19hbHRpdmVjOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvcHBjL2ludHJlYWR3cml0ZS5oIGIvZmZtcGVnL2xpYmF2dXRpbC9wcGMvaW50cmVhZHdyaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjMzQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvcHBjL2ludHJlYWR3cml0ZS5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9QUENfSU5UUkVBRFdSSVRFX0gKKyNkZWZpbmUgQVZVVElMX1BQQ19JTlRSRUFEV1JJVEVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisKKy8qCisgKiAtTzAgd291bGQgY29tcGlsZSB0aGUgcGFja2VkIHN0cnVjdCB2ZXJzaW9uLCB3aGljaCBpcyB1c2VkIGJ5CisgKiBkZWZhdWx0LCBpbiBhbiBvdmVybHkgdmVyYm9zZSBmYXNoaW9uLCBzbyB3ZSBvdmVycmlkZSBpdCBoZXJlLgorICovCisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgQVZfUkI2NChwKSAoKihjb25zdCB1aW50NjRfdCAqKShwKSkKKyNkZWZpbmUgQVZfV0I2NChwLCB2KSAoKih1aW50NjRfdCAqKShwKSA9ICh2KSkKKworI2Vsc2UKKyNkZWZpbmUgQVZfUkw2NChwKSAoKihjb25zdCB1aW50NjRfdCAqKShwKSkKKyNkZWZpbmUgQVZfV0w2NChwLCB2KSAoKih1aW50NjRfdCAqKShwKSA9ICh2KSkKKworI2VuZGlmCisKKyNpZiBIQVZFX1hGT1JNX0FTTQorCisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgQVZfUkwxNiBhdl9yZWFkX2Jzd2FwMTYKKyNkZWZpbmUgQVZfV0wxNiBhdl93cml0ZV9ic3dhcDE2CisjZGVmaW5lIEFWX1JMMzIgYXZfcmVhZF9ic3dhcDMyCisjZGVmaW5lIEFWX1dMMzIgYXZfd3JpdGVfYnN3YXAzMgorI2RlZmluZSBBVl9STDY0IGF2X3JlYWRfYnN3YXA2NAorI2RlZmluZSBBVl9XTDY0IGF2X3dyaXRlX2Jzd2FwNjQKKworI2Vsc2UKKyNkZWZpbmUgQVZfUkIxNiBhdl9yZWFkX2Jzd2FwMTYKKyNkZWZpbmUgQVZfV0IxNiBhdl93cml0ZV9ic3dhcDE2CisjZGVmaW5lIEFWX1JCMzIgYXZfcmVhZF9ic3dhcDMyCisjZGVmaW5lIEFWX1dCMzIgYXZfd3JpdGVfYnN3YXAzMgorI2RlZmluZSBBVl9SQjY0IGF2X3JlYWRfYnN3YXA2NAorI2RlZmluZSBBVl9XQjY0IGF2X3dyaXRlX2Jzd2FwNjQKKworI2VuZGlmCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQxNl90IGF2X3JlYWRfYnN3YXAxNihjb25zdCB2b2lkICpwKQoreworICAgIHVpbnQxNl90IHY7CisgICAgX19hc21fXyAoImxoYnJ4ICAgJTAsICV5MSIgOiAiPXIiKHYpIDogIloiKCooY29uc3QgdWludDE2X3QqKXApKTsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBhdl93cml0ZV9ic3dhcDE2KHZvaWQgKnAsIHVpbnQxNl90IHYpCit7CisgICAgX19hc21fXyAoInN0aGJyeCAgJTEsICV5MCIgOiAiPVoiKCoodWludDE2X3QqKXApIDogInIiKHYpKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3QgYXZfcmVhZF9ic3dhcDMyKGNvbnN0IHZvaWQgKnApCit7CisgICAgdWludDMyX3QgdjsKKyAgICBfX2FzbV9fICgibHdicnggICAlMCwgJXkxIiA6ICI9ciIodikgOiAiWiIoKihjb25zdCB1aW50MzJfdCopcCkpOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGF2X3dyaXRlX2Jzd2FwMzIodm9pZCAqcCwgdWludDMyX3QgdikKK3sKKyAgICBfX2FzbV9fICgic3R3YnJ4ICAlMSwgJXkwIiA6ICI9WiIoKih1aW50MzJfdCopcCkgOiAiciIodikpOworfQorCisjaWYgSEFWRV9MREJSWAorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50NjRfdCBhdl9yZWFkX2Jzd2FwNjQoY29uc3Qgdm9pZCAqcCkKK3sKKyAgICB1aW50NjRfdCB2OworICAgIF9fYXNtX18gKCJsZGJyeCAgICUwLCAleTEiIDogIj1yIih2KSA6ICJaIigqKGNvbnN0IHVpbnQ2NF90KilwKSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgYXZfd3JpdGVfYnN3YXA2NCh2b2lkICpwLCB1aW50NjRfdCB2KQoreworICAgIF9fYXNtX18gKCJzdGRicnggICUxLCAleTAiIDogIj1aIigqKHVpbnQ2NF90KilwKSA6ICJyIih2KSk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQ2NF90IGF2X3JlYWRfYnN3YXA2NChjb25zdCB2b2lkICpwKQoreworICAgIHVuaW9uIHsgdWludDY0X3QgdjsgdWludDMyX3QgaGxbMl07IH0gdjsKKyAgICBfX2FzbV9fICgibHdicnggICAlMCwgJXkyICBcblx0IgorICAgICAgICAgICAgICJsd2JyeCAgICUxLCAleTMgIFxuXHQiCisgICAgICAgICAgICAgOiAiPSZyIih2LmhsWzFdKSwgIj1yIih2LmhsWzBdKQorICAgICAgICAgICAgIDogIloiKCooY29uc3QgdWludDMyX3QqKXApLCAiWiIoKigoY29uc3QgdWludDMyX3QqKXArMSkpKTsKKyAgICByZXR1cm4gdi52OworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGF2X3dyaXRlX2Jzd2FwNjQodm9pZCAqcCwgdWludDY0X3QgdikKK3sKKyAgICB1bmlvbiB7IHVpbnQ2NF90IHY7IHVpbnQzMl90IGhsWzJdOyB9IHZ2ID0geyB2IH07CisgICAgX19hc21fXyAoInN0d2JyeCAgJTIsICV5MCAgXG5cdCIKKyAgICAgICAgICAgICAic3R3YnJ4ICAlMywgJXkxICBcblx0IgorICAgICAgICAgICAgIDogIj1aIigqKHVpbnQzMl90KilwKSwgIj1aIigqKCh1aW50MzJfdCopcCsxKSkKKyAgICAgICAgICAgICA6ICJyIih2di5obFsxXSksICJyIih2di5obFswXSkpOworfQorCisjZW5kaWYgLyogSEFWRV9MREJSWCAqLworCisjZW5kaWYgLyogSEFWRV9YRk9STV9BU00gKi8KKworI2VuZGlmIC8qIEFWVVRJTF9QUENfSU5UUkVBRFdSSVRFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvcHBjL3RpbWVyLmggYi9mZm1wZWcvbGliYXZ1dGlsL3BwYy90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOGU2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3BwYy90aW1lci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgTHVjYSBCYXJiYXRvIDxsdV96ZXJvQGdlbnRvby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX1BQQ19USU1FUl9ICisjZGVmaW5lIEFWVVRJTF9QUENfVElNRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2RlZmluZSBBVl9SRUFEX1RJTUUgcmVhZF90aW1lCisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgcmVhZF90aW1lKHZvaWQpCit7CisgICAgdWludDMyX3QgdGJ1LCB0YmwsIHRlbXA7CisKKyAgICAgLyogZnJvbSBzZWN0aW9uIDIuMi4xIG9mIHRoZSAzMi1iaXQgUG93ZXJQQyBQRU0gKi8KKyAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICJtZnRidSAgJTJcbiIKKyAgICAgICAgICJtZnRiICAgJTBcbiIKKyAgICAgICAgICJtZnRidSAgJTFcbiIKKyAgICAgICAgICJjbXB3ICAgJTIsJTFcbiIKKyAgICAgICAgICJibmUgICAgJC0weDEwXG4iCisgICAgIDogIj1yIih0YmwpLCAiPXIiKHRidSksICI9ciIodGVtcCkKKyAgICAgOgorICAgICA6ICJjYyIpOworCisgICAgIHJldHVybiAoKCh1aW50NjRfdCl0YnUpPDwzMikgfCAodWludDY0X3QpdGJsOworfQorCisjZW5kaWYgLyogQVZVVElMX1BQQ19USU1FUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmggYi9mZm1wZWcvbGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkODk1NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEd1aWxsYXVtZSBQb2lyaWVyIDxncG9pcmllckBtcGxheWVyaHEuaHU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX1BQQ19UWVBFU19BTFRJVkVDX0gKKyNkZWZpbmUgQVZVVElMX1BQQ19UWVBFU19BTFRJVkVDX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWZWN0b3IgdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSB2ZWNfdTggIHZlY3RvciB1bnNpZ25lZCBjaGFyCisjZGVmaW5lIHZlY19zOCAgdmVjdG9yIHNpZ25lZCBjaGFyCisjZGVmaW5lIHZlY191MTYgdmVjdG9yIHVuc2lnbmVkIHNob3J0CisjZGVmaW5lIHZlY19zMTYgdmVjdG9yIHNpZ25lZCBzaG9ydAorI2RlZmluZSB2ZWNfdTMyIHZlY3RvciB1bnNpZ25lZCBpbnQKKyNkZWZpbmUgdmVjX3MzMiB2ZWN0b3Igc2lnbmVkIGludAorI2RlZmluZSB2ZWNfZiAgIHZlY3RvciBmbG9hdAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE51bGwgdmVjdG9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9BRF9aRVJPIGNvbnN0IHZlY191OCB6ZXJvdiA9IHZlY19zcGxhdF91OCggMCApCisKKyNkZWZpbmUgemVyb191OHYgICh2ZWNfdTgpICB6ZXJvdgorI2RlZmluZSB6ZXJvX3M4diAgKHZlY19zOCkgIHplcm92CisjZGVmaW5lIHplcm9fdTE2diAodmVjX3UxNikgemVyb3YKKyNkZWZpbmUgemVyb19zMTZ2ICh2ZWNfczE2KSB6ZXJvdgorI2RlZmluZSB6ZXJvX3UzMnYgKHZlY191MzIpIHplcm92CisjZGVmaW5lIHplcm9fczMydiAodmVjX3MzMikgemVyb3YKKworI2VuZGlmIC8qIEFWVVRJTF9QUENfVFlQRVNfQUxUSVZFQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCBiL2ZmbXBlZy9saWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTRlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDb250YWlucyBtaXNjIHV0aWxpdHkgbWFjcm9zIGFuZCBpbmxpbmUgZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZiBBVlVUSUxfUFBDX1VUSUxfQUxUSVZFQ19ICisjZGVmaW5lIEFWVVRJTF9QUENfVVRJTF9BTFRJVkVDX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX0FMVElWRUNfSAorI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidHlwZXNfYWx0aXZlYy5oIgorCisjaWYgSEFWRV9BTFRJVkVDCisKKy8vIHVzZWQgdG8gYnVpbGQgcmVnaXN0ZXJzIHBlcm11dGF0aW9uIHZlY3RvcnMgKHZjcHJtKQorLy8gdGhlICdzJyBhcmUgZm9yIHdvcmRzIGluIHRoZSBfc19lY29uZCB2ZWN0b3IKKyNkZWZpbmUgV09SRF8wIDB4MDAsMHgwMSwweDAyLDB4MDMKKyNkZWZpbmUgV09SRF8xIDB4MDQsMHgwNSwweDA2LDB4MDcKKyNkZWZpbmUgV09SRF8yIDB4MDgsMHgwOSwweDBhLDB4MGIKKyNkZWZpbmUgV09SRF8zIDB4MGMsMHgwZCwweDBlLDB4MGYKKyNkZWZpbmUgV09SRF9zMCAweDEwLDB4MTEsMHgxMiwweDEzCisjZGVmaW5lIFdPUkRfczEgMHgxNCwweDE1LDB4MTYsMHgxNworI2RlZmluZSBXT1JEX3MyIDB4MTgsMHgxOSwweDFhLDB4MWIKKyNkZWZpbmUgV09SRF9zMyAweDFjLDB4MWQsMHgxZSwweDFmCisjZGVmaW5lIHZjcHJtKGEsYixjLGQpIChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhcil7V09SRF8gIyMgYSwgV09SRF8gIyMgYiwgV09SRF8gIyMgYywgV09SRF8gIyMgZH0KKworI2RlZmluZSBTV1BfVzJTMCAweDAyLDB4MDMsMHgwMCwweDAxCisjZGVmaW5lIFNXUF9XMlMxIDB4MDYsMHgwNywweDA0LDB4MDUKKyNkZWZpbmUgU1dQX1cyUzIgMHgwYSwweDBiLDB4MDgsMHgwOQorI2RlZmluZSBTV1BfVzJTMyAweDBlLDB4MGYsMHgwYywweDBkCisjZGVmaW5lIFNXUF9XMlNzMCAweDEyLDB4MTMsMHgxMCwweDExCisjZGVmaW5lIFNXUF9XMlNzMSAweDE2LDB4MTcsMHgxNCwweDE1CisjZGVmaW5lIFNXUF9XMlNzMiAweDFhLDB4MWIsMHgxOCwweDE5CisjZGVmaW5lIFNXUF9XMlNzMyAweDFlLDB4MWYsMHgxYywweDFkCisjZGVmaW5lIHZjc3dhcGkycyhhLGIsYyxkKSAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIpe1NXUF9XMlMgIyMgYSwgU1dQX1cyUyAjIyBiLCBTV1BfVzJTICMjIGMsIFNXUF9XMlMgIyMgZH0KKworI2RlZmluZSB2Y3N3YXBjKCkgXAorICAoY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIpezB4MGYsMHgwZSwweDBkLDB4MGMsMHgwYiwweDBhLDB4MDksMHgwOCwweDA3LDB4MDYsMHgwNSwweDA0LDB4MDMsMHgwMiwweDAxLDB4MDB9CisKKworLy8gVHJhbnNwb3NlIDh4OCBtYXRyaXggb2YgMTYtYml0IGVsZW1lbnRzIChpbi1wbGFjZSkKKyNkZWZpbmUgVFJBTlNQT1NFOChhLGIsYyxkLGUsZixnLGgpIFwKK2RvIHsgXAorICAgIHZlY3RvciBzaWduZWQgc2hvcnQgQTEsIEIxLCBDMSwgRDEsIEUxLCBGMSwgRzEsIEgxOyBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBBMiwgQjIsIEMyLCBEMiwgRTIsIEYyLCBHMiwgSDI7IFwKKyBcCisgICAgQTEgPSB2ZWNfbWVyZ2VoIChhLCBlKTsgXAorICAgIEIxID0gdmVjX21lcmdlbCAoYSwgZSk7IFwKKyAgICBDMSA9IHZlY19tZXJnZWggKGIsIGYpOyBcCisgICAgRDEgPSB2ZWNfbWVyZ2VsIChiLCBmKTsgXAorICAgIEUxID0gdmVjX21lcmdlaCAoYywgZyk7IFwKKyAgICBGMSA9IHZlY19tZXJnZWwgKGMsIGcpOyBcCisgICAgRzEgPSB2ZWNfbWVyZ2VoIChkLCBoKTsgXAorICAgIEgxID0gdmVjX21lcmdlbCAoZCwgaCk7IFwKKyBcCisgICAgQTIgPSB2ZWNfbWVyZ2VoIChBMSwgRTEpOyBcCisgICAgQjIgPSB2ZWNfbWVyZ2VsIChBMSwgRTEpOyBcCisgICAgQzIgPSB2ZWNfbWVyZ2VoIChCMSwgRjEpOyBcCisgICAgRDIgPSB2ZWNfbWVyZ2VsIChCMSwgRjEpOyBcCisgICAgRTIgPSB2ZWNfbWVyZ2VoIChDMSwgRzEpOyBcCisgICAgRjIgPSB2ZWNfbWVyZ2VsIChDMSwgRzEpOyBcCisgICAgRzIgPSB2ZWNfbWVyZ2VoIChEMSwgSDEpOyBcCisgICAgSDIgPSB2ZWNfbWVyZ2VsIChEMSwgSDEpOyBcCisgXAorICAgIGEgPSB2ZWNfbWVyZ2VoIChBMiwgRTIpOyBcCisgICAgYiA9IHZlY19tZXJnZWwgKEEyLCBFMik7IFwKKyAgICBjID0gdmVjX21lcmdlaCAoQjIsIEYyKTsgXAorICAgIGQgPSB2ZWNfbWVyZ2VsIChCMiwgRjIpOyBcCisgICAgZSA9IHZlY19tZXJnZWggKEMyLCBHMik7IFwKKyAgICBmID0gdmVjX21lcmdlbCAoQzIsIEcyKTsgXAorICAgIGcgPSB2ZWNfbWVyZ2VoIChEMiwgSDIpOyBcCisgICAgaCA9IHZlY19tZXJnZWwgKEQyLCBIMik7IFwKK30gd2hpbGUgKDApCisKKworI2lmIEhBVkVfQklHRU5ESUFOCisjZGVmaW5lIFZFQ19MRChvZmZzZXQsYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfcGVybSh2ZWNfbGQob2Zmc2V0LCBiKSwgdmVjX2xkKChvZmZzZXQpKzE1LCBiKSwgdmVjX2x2c2wob2Zmc2V0LCBiKSkKKyNlbHNlCisjZGVmaW5lIFZFQ19MRChvZmZzZXQsYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfdnN4X2xkKG9mZnNldCwgYikKKyNlbmRpZgorCisvKiogQGJyaWVmIGxvYWRzIHVuYWxpZ25lZCB2ZWN0b3IgQGEgKnNyYyB3aXRoIG9mZnNldCBAYSBvZmZzZXQKKyAgICBhbmQgcmV0dXJucyBpdCAqLworI2lmIEhBVkVfQklHRU5ESUFOCitzdGF0aWMgaW5saW5lIHZlY3RvciB1bnNpZ25lZCBjaGFyIHVuYWxpZ25lZF9sb2FkKGludCBvZmZzZXQsIGNvbnN0IHVpbnQ4X3QgKnNyYykKK3sKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciBmaXJzdCA9IHZlY19sZChvZmZzZXQsIHNyYyk7CisgICAgcmVnaXN0ZXIgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc2Vjb25kID0gdmVjX2xkKG9mZnNldCsxNSwgc3JjKTsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciBtYXNrID0gdmVjX2x2c2wob2Zmc2V0LCBzcmMpOworICAgIHJldHVybiB2ZWNfcGVybShmaXJzdCwgc2Vjb25kLCBtYXNrKTsKK30KK3N0YXRpYyBpbmxpbmUgdmVjX3U4IGxvYWRfd2l0aF9wZXJtX3ZlYyhpbnQgb2Zmc2V0LCBjb25zdCB1aW50OF90ICpzcmMsIHZlY191OCBwZXJtX3ZlYykKK3sKKyAgICB2ZWNfdTggYSA9IHZlY19sZChvZmZzZXQsIHNyYyk7CisgICAgdmVjX3U4IGIgPSB2ZWNfbGQob2Zmc2V0KzE1LCBzcmMpOworICAgIHJldHVybiB2ZWNfcGVybShhLCBiLCBwZXJtX3ZlYyk7Cit9CisjZWxzZQorI2RlZmluZSB1bmFsaWduZWRfbG9hZChhLGIpIFZFQ19MRChhLGIpCisjZGVmaW5lIGxvYWRfd2l0aF9wZXJtX3ZlYyhhLGIsYykgVkVDX0xEKGEsYikKKyNlbmRpZgorCisKKy8qKgorICogbG9hZHMgdmVjdG9yIGtub3duIG1pc2FsaWdubWVudAorICogQHBhcmFtIHBlcm1fdmVjIHRoZSBhbGlnbiBwZXJtdXRlIHZlY3RvciB0byBjb21iaW5lIHRoZSB0d28gbG9hZHMgZnJvbSBsdnNsCisgKi8KKworI2RlZmluZSB2ZWNfdW5hbGlnbmVkX2xvYWQoYikgIFZFQ19MRCgwLCBiKQorCisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgVkVDX01FUkdFSChhLCBiKSB2ZWNfbWVyZ2VoKGEsIGIpCisjZGVmaW5lIFZFQ19NRVJHRUwoYSwgYikgdmVjX21lcmdlbChhLCBiKQorI2Vsc2UKKyNkZWZpbmUgVkVDX01FUkdFSChhLCBiKSB2ZWNfbWVyZ2VoKGIsIGEpCisjZGVmaW5lIFZFQ19NRVJHRUwoYSwgYikgdmVjX21lcmdlbChiLCBhKQorI2VuZGlmCisKKyNpZiBIQVZFX0JJR0VORElBTgorI2RlZmluZSBWRUNfU1QoYSxiLGMpIHZlY19zdChhLGIsYykKKyNlbHNlCisjZGVmaW5lIFZFQ19TVChhLGIsYykgdmVjX3ZzeF9zdChhLGIsYykKKyNlbmRpZgorCisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgVkVDX1NQTEFUMTYoYSxiKSB2ZWNfc3BsYXQoKHZlY19zMTYpKGEpLCBiKQorI2Vsc2UKKyNkZWZpbmUgVkVDX1NQTEFUMTYoYSxiKSB2ZWNfc3BsYXQoKHZlY19zMTYpKHZlY19wZXJtKGEsIGEsIHZjc3dhcGkycygwLDEsMiwzKSkpLCBiKQorI2VuZGlmCisKKyNpZiBIQVZFX0JJR0VORElBTgorI2RlZmluZSBWRUNfU0xEMTYoYSxiLGMpIHZlY19zbGQoYSwgYiwgYykKKyNlbHNlCisjZGVmaW5lIFZFQ19TTEQxNihhLGIsYykgdmVjX3NsZChiLCBhLCBjKQorI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9QUENfVVRJTF9BTFRJVkVDX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvcXNvcnQuaCBiL2ZmbXBlZy9saWJhdnV0aWwvcXNvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGVkY2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9xc29ydC5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDEyIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKworCisvKioKKyAqIFF1aWNrc29ydAorICogVGhpcyBzb3J0IGlzIGZhc3QsIGFuZCBmdWxseSBpbnBsYWNlIGJ1dCBub3Qgc3RhYmxlIGFuZCBpdCBpcyBwb3NzaWJsZQorICogdG8gY29uc3RydWN0IGlucHV0IHRoYXQgcmVxdWlyZXMgTyhuXjIpIHRpbWUgYnV0IHRoaXMgaXMgdmVyeSB1bmxpa2VseSB0bworICogaGFwcGVuIHdpdGggbm9uIGNvbnN0cnVjdGVkIGlucHV0LgorICovCisjZGVmaW5lIEFWX1FTT1JUKHAsIG51bSwgdHlwZSwgY21wKSB7XAorICAgIHZvaWQgKnN0YWNrWzY0XVsyXTtcCisgICAgaW50IHNwPSAxO1wKKyAgICBzdGFja1swXVswXSA9IHA7XAorICAgIHN0YWNrWzBdWzFdID0gKHApKyhudW0pLTE7XAorICAgIHdoaWxlKHNwKXtcCisgICAgICAgIHR5cGUgKnN0YXJ0PSBzdGFja1stLXNwXVswXTtcCisgICAgICAgIHR5cGUgKmVuZCAgPSBzdGFja1sgIHNwXVsxXTtcCisgICAgICAgIHdoaWxlKHN0YXJ0IDwgZW5kKXtcCisgICAgICAgICAgICBpZihzdGFydCA8IGVuZC0xKSB7XAorICAgICAgICAgICAgICAgIGludCBjaGVja3NvcnQ9MDtcCisgICAgICAgICAgICAgICAgdHlwZSAqcmlnaHQgPSBlbmQtMjtcCisgICAgICAgICAgICAgICAgdHlwZSAqbGVmdCAgPSBzdGFydCsxO1wKKyAgICAgICAgICAgICAgICB0eXBlICptaWQgPSBzdGFydCArICgoZW5kLXN0YXJ0KT4+MSk7XAorICAgICAgICAgICAgICAgIGlmKGNtcChzdGFydCwgZW5kKSA+IDApIHtcCisgICAgICAgICAgICAgICAgICAgIGlmKGNtcCggIGVuZCwgbWlkKSA+IDApIEZGU1dBUCh0eXBlLCAqc3RhcnQsICptaWQpO1wKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgRkZTV0FQKHR5cGUsICpzdGFydCwgKmVuZCk7XAorICAgICAgICAgICAgICAgIH1lbHNle1wKKyAgICAgICAgICAgICAgICAgICAgaWYoY21wKHN0YXJ0LCBtaWQpID4gMCkgRkZTV0FQKHR5cGUsICpzdGFydCwgKm1pZCk7XAorICAgICAgICAgICAgICAgICAgICBlbHNlIGNoZWNrc29ydD0gMTtcCisgICAgICAgICAgICAgICAgfVwKKyAgICAgICAgICAgICAgICBpZihjbXAobWlkLCBlbmQpID4gMCl7IFwKKyAgICAgICAgICAgICAgICAgICAgRkZTV0FQKHR5cGUsICptaWQsICplbmQpO1wKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzb3J0PTA7XAorICAgICAgICAgICAgICAgIH1cCisgICAgICAgICAgICAgICAgaWYoc3RhcnQgPT0gZW5kLTIpIGJyZWFrO1wKKyAgICAgICAgICAgICAgICBGRlNXQVAodHlwZSwgZW5kWy0xXSwgKm1pZCk7XAorICAgICAgICAgICAgICAgIHdoaWxlKGxlZnQgPD0gcmlnaHQpe1wKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUobGVmdDw9cmlnaHQgJiYgY21wKGxlZnQsIGVuZC0xKSA8IDApXAorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCsrO1wKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUobGVmdDw9cmlnaHQgJiYgY21wKHJpZ2h0LCBlbmQtMSkgPiAwKVwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LS07XAorICAgICAgICAgICAgICAgICAgICBpZihsZWZ0IDw9IHJpZ2h0KXtcCisgICAgICAgICAgICAgICAgICAgICAgICBGRlNXQVAodHlwZSwgKmxlZnQsICpyaWdodCk7XAorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCsrO1wKKyAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LS07XAorICAgICAgICAgICAgICAgICAgICB9XAorICAgICAgICAgICAgICAgIH1cCisgICAgICAgICAgICAgICAgRkZTV0FQKHR5cGUsIGVuZFstMV0sICpsZWZ0KTtcCisgICAgICAgICAgICAgICAgaWYoY2hlY2tzb3J0ICYmIChtaWQgPT0gbGVmdC0xIHx8IG1pZCA9PSBsZWZ0KSl7XAorICAgICAgICAgICAgICAgICAgICBtaWQ9IHN0YXJ0O1wKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUobWlkPGVuZCAmJiBjbXAobWlkLCBtaWQrMSkgPD0gMClcCisgICAgICAgICAgICAgICAgICAgICAgICBtaWQrKztcCisgICAgICAgICAgICAgICAgICAgIGlmKG1pZD09ZW5kKVwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1wKKyAgICAgICAgICAgICAgICB9XAorICAgICAgICAgICAgICAgIGlmKGVuZC1sZWZ0IDwgbGVmdC1zdGFydCl7XAorICAgICAgICAgICAgICAgICAgICBzdGFja1tzcCAgXVswXT0gc3RhcnQ7XAorICAgICAgICAgICAgICAgICAgICBzdGFja1tzcCsrXVsxXT0gcmlnaHQ7XAorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGxlZnQrMTtcCisgICAgICAgICAgICAgICAgfWVsc2V7XAorICAgICAgICAgICAgICAgICAgICBzdGFja1tzcCAgXVswXT0gbGVmdCsxO1wKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tbc3ArK11bMV09IGVuZDtcCisgICAgICAgICAgICAgICAgICAgIGVuZCA9IHJpZ2h0O1wKKyAgICAgICAgICAgICAgICB9XAorICAgICAgICAgICAgfWVsc2V7XAorICAgICAgICAgICAgICAgIGlmKGNtcChzdGFydCwgZW5kKSA+IDApXAorICAgICAgICAgICAgICAgICAgICBGRlNXQVAodHlwZSwgKnN0YXJ0LCAqZW5kKTtcCisgICAgICAgICAgICAgICAgYnJlYWs7XAorICAgICAgICAgICAgfVwKKyAgICAgICAgfVwKKyAgICB9XAorfQorCisvKioKKyAqIE1lcmdlIHNvcnQsIHRoaXMgc29ydCByZXF1aXJlcyBhIHRlbXBvcmFyeSBidWZmZXIgYW5kIGlzIHN0YWJsZSwgaXRzIHdvcnN0CisgKiBjYXNlIHRpbWUgaXMgTyhuIGxvZyBuKQorICogQHBhcmFtIHAgICAgIG11c3QgYmUgYSBsdmFsdWUgcG9pbnRlciwgdGhpcyBmdW5jdGlvbiBtYXkgZXhjaGFuZ2UgaXQgd2l0aCB0bXAKKyAqIEBwYXJhbSB0bXAgICBtdXN0IGJlIGEgbHZhbHVlIHBvaW50ZXIsIHRoaXMgZnVuY3Rpb24gbWF5IGV4Y2hhbmdlIGl0IHdpdGggcAorICovCisjZGVmaW5lIEFWX01TT1JUKHAsIHRtcCwgbnVtLCB0eXBlLCBjbXApIHtcCisgICAgdW5zaWduZWQgaSwgaiwgc3RlcDtcCisgICAgZm9yKHN0ZXA9MTsgc3RlcDwobnVtKTsgc3RlcCs9c3RlcCl7XAorICAgICAgICBmb3IoaT0wOyBpPChudW0pOyBpKz0yKnN0ZXApe1wKKyAgICAgICAgICAgIHVuc2lnbmVkIGFbMl0gPSB7aSwgaStzdGVwfTtcCisgICAgICAgICAgICB1bnNpZ25lZCBlbmQgPSBGRk1JTihpKzIqc3RlcCwgKG51bSkpO1wKKyAgICAgICAgICAgIGZvcihqPWk7IGFbMF08aStzdGVwICYmIGFbMV08ZW5kOyBqKyspe1wKKyAgICAgICAgICAgICAgICBpbnQgaWR4PSBjbXAocCthWzBdLCBwK2FbMV0pID4gMDtcCisgICAgICAgICAgICAgICAgdG1wW2pdID0gcFsgYVtpZHhdKysgXTtcCisgICAgICAgICAgICB9XAorICAgICAgICAgICAgaWYoYVswXT49aStzdGVwKSBhWzBdID0gYVsxXTtcCisgICAgICAgICAgICBmb3IoOyBqPGVuZDsgaisrKXtcCisgICAgICAgICAgICAgICAgdG1wW2pdID0gcFsgYVswXSsrIF07XAorICAgICAgICAgICAgfVwKKyAgICAgICAgfVwKKyAgICAgICAgRkZTV0FQKHR5cGUqLCBwLCB0bXApO1wKKyAgICB9XAorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9yYW5kb21fc2VlZC5jIGIvZmZtcGVnL2xpYmF2dXRpbC9yYW5kb21fc2VlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYThjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3JhbmRvbV9zZWVkLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZS5jb3VkdXJpZXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZiBIQVZFX0lPX0gKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisjaWYgSEFWRV9DUllQVEdFTlJBTkRPTQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5jcnlwdC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImF2YXNzZXJ0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorI2luY2x1ZGUgInJhbmRvbV9zZWVkLmgiCisjaW5jbHVkZSAic2hhLmgiCisKKyNpZm5kZWYgVEVTVAorI2RlZmluZSBURVNUIDAKKyNlbmRpZgorCitzdGF0aWMgaW50IHJlYWRfcmFuZG9tKHVpbnQzMl90ICpkc3QsIGNvbnN0IGNoYXIgKmZpbGUpCit7CisjaWYgSEFWRV9VTklTVERfSAorICAgIGludCBmZCA9IGF2cHJpdl9vcGVuKGZpbGUsIE9fUkRPTkxZKTsKKyAgICBpbnQgZXJyID0gLTE7CisKKyAgICBpZiAoZmQgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlcnIgPSByZWFkKGZkLCBkc3QsIHNpemVvZigqZHN0KSk7CisgICAgY2xvc2UoZmQpOworCisgICAgcmV0dXJuIGVycjsKKyNlbHNlCisgICAgcmV0dXJuIC0xOworI2VuZGlmCit9CisKK3N0YXRpYyB1aW50MzJfdCBnZXRfZ2VuZXJpY19zZWVkKHZvaWQpCit7CisgICAgdWludDhfdCB0bXBbMTIwXTsKKyAgICBzdHJ1Y3QgQVZTSEEgKnNoYSA9ICh2b2lkKil0bXA7CisgICAgY2xvY2tfdCBsYXN0X3QgID0gMDsKKyAgICBzdGF0aWMgdWludDY0X3QgaSA9IDA7CisgICAgc3RhdGljIHVpbnQzMl90IGJ1ZmZlcls1MTJdID0geyAwIH07CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMjBdOworICAgIHVpbnQ2NF90IGxhc3RfaSA9IGk7CisKKyAgICBhdl9hc3NlcnQwKHNpemVvZih0bXApID49IGF2X3NoYV9zaXplKTsKKworICAgIGlmKFRFU1QpeworICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgIGxhc3RfaSA9IGkgPSAwOworICAgIH1lbHNleworI2lmZGVmIEFWX1JFQURfVElNRQorICAgICAgICBidWZmZXJbMTNdIF49IEFWX1JFQURfVElNRSgpOworICAgICAgICBidWZmZXJbNDFdIF49IEFWX1JFQURfVElNRSgpPj4zMjsKKyNlbmRpZgorICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgY2xvY2tfdCB0ID0gY2xvY2soKTsKKworICAgICAgICBpZiAobGFzdF90ID09IHQpIHsKKyAgICAgICAgICAgIGJ1ZmZlcltpICYgNTExXSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZmVyWysraSAmIDUxMV0gKz0gKHQgLSBsYXN0X3QpICUgMzI5NDYzODUyMVU7CisgICAgICAgICAgICBpZiAobGFzdF9pICYmIGkgLSBsYXN0X2kgPiA0IHx8IGkgLSBsYXN0X2kgPiA2NCB8fCBURVNUICYmIGkgLSBsYXN0X2kgPiA4KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGxhc3RfdCA9IHQ7CisgICAgfQorCisgICAgaWYoVEVTVCkKKyAgICAgICAgYnVmZmVyWzBdID0gYnVmZmVyWzFdID0gMDsKKworICAgIGF2X3NoYV9pbml0KHNoYSwgMTYwKTsKKyAgICBhdl9zaGFfdXBkYXRlKHNoYSwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICBhdl9zaGFfZmluYWwoc2hhLCBkaWdlc3QpOworICAgIHJldHVybiBBVl9SQjMyKGRpZ2VzdCkgKyBBVl9SQjMyKGRpZ2VzdCArIDE2KTsKK30KKwordWludDMyX3QgYXZfZ2V0X3JhbmRvbV9zZWVkKHZvaWQpCit7CisgICAgdWludDMyX3Qgc2VlZDsKKworI2lmIEhBVkVfQ1JZUFRHRU5SQU5ET00KKyAgICBIQ1JZUFRQUk9WIHByb3ZpZGVyOworICAgIGlmIChDcnlwdEFjcXVpcmVDb250ZXh0KCZwcm92aWRlciwgTlVMTCwgTlVMTCwgUFJPVl9SU0FfRlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVF9WRVJJRllDT05URVhUIHwgQ1JZUFRfU0lMRU5UKSkgeworICAgICAgICBCT09MIHJldCA9IENyeXB0R2VuUmFuZG9tKHByb3ZpZGVyLCBzaXplb2Yoc2VlZCksIChQQllURSkgJnNlZWQpOworICAgICAgICBDcnlwdFJlbGVhc2VDb250ZXh0KHByb3ZpZGVyLCAwKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiBzZWVkOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHJlYWRfcmFuZG9tKCZzZWVkLCAiL2Rldi91cmFuZG9tIikgPT0gc2l6ZW9mKHNlZWQpKQorICAgICAgICByZXR1cm4gc2VlZDsKKyAgICBpZiAocmVhZF9yYW5kb20oJnNlZWQsICIvZGV2L3JhbmRvbSIpICA9PSBzaXplb2Yoc2VlZCkpCisgICAgICAgIHJldHVybiBzZWVkOworICAgIHJldHVybiBnZXRfZ2VuZXJpY19zZWVkKCk7Cit9CisKKyNpZiBURVNUCisjdW5kZWYgcHJpbnRmCisjZGVmaW5lIE4gMjU2CisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgaSwgaiwgcmV0cnk7CisgICAgdWludDMyX3Qgc2VlZHNbTl07CisKKyAgICBmb3IgKHJldHJ5PTA7IHJldHJ5PDM7IHJldHJ5KyspeworICAgICAgICBmb3IgKGk9MDsgaTxOOyBpKyspeworICAgICAgICAgICAgc2VlZHNbaV0gPSBhdl9nZXRfcmFuZG9tX3NlZWQoKTsKKyAgICAgICAgICAgIGZvciAoaj0wOyBqPGk7IGorKykKKyAgICAgICAgICAgICAgICBpZiAoc2VlZHNbal0gPT0gc2VlZHNbaV0pCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJzZWVkcyBPS1xuIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgICByZXRyeTo7CisgICAgfQorICAgIHByaW50ZigiRkFJTCBhdCAlZCB3aXRoICVYXG4iLCBqLCBzZWVkc1tqXSk7CisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvcmFuZG9tX3NlZWQuaCBiL2ZmbXBlZy9saWJhdnV0aWwvcmFuZG9tX3NlZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDYyYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9yYW5kb21fc2VlZC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZS5jb3VkdXJpZXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9SQU5ET01fU0VFRF9ICisjZGVmaW5lIEFWVVRJTF9SQU5ET01fU0VFRF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKy8qKgorICogQGFkZHRvZ3JvdXAgbGF2dV9jcnlwdG8KKyAqIEB7CisgKi8KKworLyoqCisgKiBHZXQgYSBzZWVkIHRvIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHJhbmRvbSBmdW5jdGlvbnMuCisgKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHByb3ZpZGUgYSBnb29kIHNlZWQgYXQgYSBiZXN0IGVmZm9ydCBiYXNlcy4KKyAqIEl0cyBwb3NzaWJsZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgaWYgbW9yZSBiaXRzIGFyZSBuZWVkZWQuCisgKiBJdCBjYW4gYmUgcXVpdGUgc2xvdywgd2hpY2ggaXMgd2h5IGl0IHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgc2VlZCBmb3IgYSBmYXN0ZXIKKyAqIFBSTkcuIFRoZSBxdWFsaXR5IG9mIHRoZSBzZWVkIGRlcGVuZHMgb24gdGhlIHBsYXRmb3JtLgorICovCit1aW50MzJfdCBhdl9nZXRfcmFuZG9tX3NlZWQodm9pZCk7CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZVVElMX1JBTkRPTV9TRUVEX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvcmF0aW9uYWwuYyBiL2ZmbXBlZy9saWJhdnV0aWwvcmF0aW9uYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWE4ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9yYXRpb25hbC5jCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogcmF0aW9uYWwgbnVtYmVycworICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHJhdGlvbmFsIG51bWJlcnMKKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaW5jbHVkZSAiYXZhc3NlcnQuaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgIm1hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAicmF0aW9uYWwuaCIKKworaW50IGF2X3JlZHVjZShpbnQgKmRzdF9udW0sIGludCAqZHN0X2RlbiwKKyAgICAgICAgICAgICAgaW50NjRfdCBudW0sIGludDY0X3QgZGVuLCBpbnQ2NF90IG1heCkKK3sKKyAgICBBVlJhdGlvbmFsIGEwID0geyAwLCAxIH0sIGExID0geyAxLCAwIH07CisgICAgaW50IHNpZ24gPSAobnVtIDwgMCkgXiAoZGVuIDwgMCk7CisgICAgaW50NjRfdCBnY2QgPSBhdl9nY2QoRkZBQlMobnVtKSwgRkZBQlMoZGVuKSk7CisKKyAgICBpZiAoZ2NkKSB7CisgICAgICAgIG51bSA9IEZGQUJTKG51bSkgLyBnY2Q7CisgICAgICAgIGRlbiA9IEZGQUJTKGRlbikgLyBnY2Q7CisgICAgfQorICAgIGlmIChudW0gPD0gbWF4ICYmIGRlbiA8PSBtYXgpIHsKKyAgICAgICAgYTEgPSAoQVZSYXRpb25hbCkgeyBudW0sIGRlbiB9OworICAgICAgICBkZW4gPSAwOworICAgIH0KKworICAgIHdoaWxlIChkZW4pIHsKKyAgICAgICAgdWludDY0X3QgeCAgICAgICAgPSBudW0gLyBkZW47CisgICAgICAgIGludDY0X3QgbmV4dF9kZW4gID0gbnVtIC0gZGVuICogeDsKKyAgICAgICAgaW50NjRfdCBhMm4gICAgICAgPSB4ICogYTEubnVtICsgYTAubnVtOworICAgICAgICBpbnQ2NF90IGEyZCAgICAgICA9IHggKiBhMS5kZW4gKyBhMC5kZW47CisKKyAgICAgICAgaWYgKGEybiA+IG1heCB8fCBhMmQgPiBtYXgpIHsKKyAgICAgICAgICAgIGlmIChhMS5udW0pIHggPSAgICAgICAgICAobWF4IC0gYTAubnVtKSAvIGExLm51bTsKKyAgICAgICAgICAgIGlmIChhMS5kZW4pIHggPSBGRk1JTih4LCAobWF4IC0gYTAuZGVuKSAvIGExLmRlbik7CisKKyAgICAgICAgICAgIGlmIChkZW4gKiAoMiAqIHggKiBhMS5kZW4gKyBhMC5kZW4pID4gbnVtICogYTEuZGVuKQorICAgICAgICAgICAgICAgIGExID0gKEFWUmF0aW9uYWwpIHsgeCAqIGExLm51bSArIGEwLm51bSwgeCAqIGExLmRlbiArIGEwLmRlbiB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhMCAgPSBhMTsKKyAgICAgICAgYTEgID0gKEFWUmF0aW9uYWwpIHsgYTJuLCBhMmQgfTsKKyAgICAgICAgbnVtID0gZGVuOworICAgICAgICBkZW4gPSBuZXh0X2RlbjsKKyAgICB9CisgICAgYXZfYXNzZXJ0Mihhdl9nY2QoYTEubnVtLCBhMS5kZW4pIDw9IDFVKTsKKworICAgICpkc3RfbnVtID0gc2lnbiA/IC1hMS5udW0gOiBhMS5udW07CisgICAgKmRzdF9kZW4gPSBhMS5kZW47CisKKyAgICByZXR1cm4gZGVuID09IDA7Cit9CisKK0FWUmF0aW9uYWwgYXZfbXVsX3EoQVZSYXRpb25hbCBiLCBBVlJhdGlvbmFsIGMpCit7CisgICAgYXZfcmVkdWNlKCZiLm51bSwgJmIuZGVuLAorICAgICAgICAgICAgICAgYi5udW0gKiAoaW50NjRfdCkgYy5udW0sCisgICAgICAgICAgICAgICBiLmRlbiAqIChpbnQ2NF90KSBjLmRlbiwgSU5UX01BWCk7CisgICAgcmV0dXJuIGI7Cit9CisKK0FWUmF0aW9uYWwgYXZfZGl2X3EoQVZSYXRpb25hbCBiLCBBVlJhdGlvbmFsIGMpCit7CisgICAgcmV0dXJuIGF2X211bF9xKGIsIChBVlJhdGlvbmFsKSB7IGMuZGVuLCBjLm51bSB9KTsKK30KKworQVZSYXRpb25hbCBhdl9hZGRfcShBVlJhdGlvbmFsIGIsIEFWUmF0aW9uYWwgYykgeworICAgIGF2X3JlZHVjZSgmYi5udW0sICZiLmRlbiwKKyAgICAgICAgICAgICAgIGIubnVtICogKGludDY0X3QpIGMuZGVuICsKKyAgICAgICAgICAgICAgIGMubnVtICogKGludDY0X3QpIGIuZGVuLAorICAgICAgICAgICAgICAgYi5kZW4gKiAoaW50NjRfdCkgYy5kZW4sIElOVF9NQVgpOworICAgIHJldHVybiBiOworfQorCitBVlJhdGlvbmFsIGF2X3N1Yl9xKEFWUmF0aW9uYWwgYiwgQVZSYXRpb25hbCBjKQoreworICAgIHJldHVybiBhdl9hZGRfcShiLCAoQVZSYXRpb25hbCkgeyAtYy5udW0sIGMuZGVuIH0pOworfQorCitBVlJhdGlvbmFsIGF2X2QycShkb3VibGUgZCwgaW50IG1heCkKK3sKKyAgICBBVlJhdGlvbmFsIGE7CisjZGVmaW5lIExPRzIgIDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NTY4MDc1NTAwMTM0MzYwMjUKKyAgICBpbnQgZXhwb25lbnQ7CisgICAgaW50NjRfdCBkZW47CisgICAgaWYgKGlzbmFuKGQpKQorICAgICAgICByZXR1cm4gKEFWUmF0aW9uYWwpIHsgMCwwIH07CisgICAgaWYgKGZhYnMoZCkgPiBJTlRfTUFYICsgM0xMKQorICAgICAgICByZXR1cm4gKEFWUmF0aW9uYWwpIHsgZCA8IDAgPyAtMSA6IDEsIDAgfTsKKyAgICBleHBvbmVudCA9IEZGTUFYKCAoaW50KShsb2coZmFicyhkKSArIDFlLTIwKS9MT0cyKSwgMCk7CisgICAgZGVuID0gMUxMIDw8ICg2MSAtIGV4cG9uZW50KTsKKyAgICAvLyAoaW50NjRfdClyaW50KCkgYW5kIGxscmludCgpIGRvIG5vdCB3b3JrIHdpdGggZ2NjIG9uIGlhNjQgYW5kIHNwYXJjNjQKKyAgICBhdl9yZWR1Y2UoJmEubnVtLCAmYS5kZW4sIGZsb29yKGQgKiBkZW4gKyAwLjUpLCBkZW4sIG1heCk7CisgICAgaWYgKCghYS5udW0gfHwgIWEuZGVuKSAmJiBkICYmIG1heD4wICYmIG1heDxJTlRfTUFYKQorICAgICAgICBhdl9yZWR1Y2UoJmEubnVtLCAmYS5kZW4sIGZsb29yKGQgKiBkZW4gKyAwLjUpLCBkZW4sIElOVF9NQVgpOworCisgICAgcmV0dXJuIGE7Cit9CisKK2ludCBhdl9uZWFyZXJfcShBVlJhdGlvbmFsIHEsIEFWUmF0aW9uYWwgcTEsIEFWUmF0aW9uYWwgcTIpCit7CisgICAgLyogbi9kIGlzIHEsIGEvYiBpcyB0aGUgbWVkaWFuIGJldHdlZW4gcTEgYW5kIHEyICovCisgICAgaW50NjRfdCBhID0gcTEubnVtICogKGludDY0X3QpcTIuZGVuICsgcTIubnVtICogKGludDY0X3QpcTEuZGVuOworICAgIGludDY0X3QgYiA9IDIgKiAoaW50NjRfdClxMS5kZW4gKiBxMi5kZW47CisKKyAgICAvKiBybmRfdXAoYSpkL2IpID4gbiA9PiBhKmQvYiA+IG4gKi8KKyAgICBpbnQ2NF90IHhfdXAgPSBhdl9yZXNjYWxlX3JuZChhLCBxLmRlbiwgYiwgQVZfUk9VTkRfVVApOworCisgICAgLyogcm5kX2Rvd24oYSpkL2IpIDwgbiA9PiBhKmQvYiA8IG4gKi8KKyAgICBpbnQ2NF90IHhfZG93biA9IGF2X3Jlc2NhbGVfcm5kKGEsIHEuZGVuLCBiLCBBVl9ST1VORF9ET1dOKTsKKworICAgIHJldHVybiAoKHhfdXAgPiBxLm51bSkgLSAoeF9kb3duIDwgcS5udW0pKSAqIGF2X2NtcF9xKHEyLCBxMSk7Cit9CisKK2ludCBhdl9maW5kX25lYXJlc3RfcV9pZHgoQVZSYXRpb25hbCBxLCBjb25zdCBBVlJhdGlvbmFsKiBxX2xpc3QpCit7CisgICAgaW50IGksIG5lYXJlc3RfcV9pZHggPSAwOworICAgIGZvciAoaSA9IDA7IHFfbGlzdFtpXS5kZW47IGkrKykKKyAgICAgICAgaWYgKGF2X25lYXJlcl9xKHEsIHFfbGlzdFtpXSwgcV9saXN0W25lYXJlc3RfcV9pZHhdKSA+IDApCisgICAgICAgICAgICBuZWFyZXN0X3FfaWR4ID0gaTsKKworICAgIHJldHVybiBuZWFyZXN0X3FfaWR4OworfQorCisjaWZkZWYgVEVTVAoraW50IG1haW4odm9pZCkKK3sKKyAgICBBVlJhdGlvbmFsIGEsYixyOworICAgIGZvciAoYS5udW0gPSAtMjsgYS5udW0gPD0gMjsgYS5udW0rKykgeworICAgICAgICBmb3IgKGEuZGVuID0gLTI7IGEuZGVuIDw9IDI7IGEuZGVuKyspIHsKKyAgICAgICAgICAgIGZvciAoYi5udW0gPSAtMjsgYi5udW0gPD0gMjsgYi5udW0rKykgeworICAgICAgICAgICAgICAgIGZvciAoYi5kZW4gPSAtMjsgYi5kZW4gPD0gMjsgYi5kZW4rKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgYyA9IGF2X2NtcF9xKGEsYik7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkID0gYXZfcTJkKGEpID09IGF2X3EyZChiKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IChhdl9xMmQoYSkgLSBhdl9xMmQoYikpOworICAgICAgICAgICAgICAgICAgICBpZiAoZCA+IDApICAgICAgIGQgPSAxOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkIDwgMCkgIGQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZCAhPSBkKSBkID0gSU5UX01JTjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZC8lZCAlZC8lZCwgJWQgJWZcbiIsIGEubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZGVuLCBiLm51bSwgYi5kZW4sIGMsZCk7CisgICAgICAgICAgICAgICAgICAgIHIgPSBhdl9zdWJfcShhdl9hZGRfcShiLGEpLCBiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoYi5kZW4gJiYgKHIubnVtKmEuZGVuICE9IGEubnVtKnIuZGVuIHx8ICFyLm51bSAhPSAhYS5udW0gfHwgIXIuZGVuICE9ICFhLmRlbikpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQvJWQgIiwgci5udW0sIHIuZGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGEubnVtID0gMTsgYS5udW0gPD0gMTA7IGEubnVtKyspIHsKKyAgICAgICAgZm9yIChhLmRlbiA9IDE7IGEuZGVuIDw9IDEwOyBhLmRlbisrKSB7CisgICAgICAgICAgICBpZiAoYXZfZ2NkKGEubnVtLCBhLmRlbikgPiAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZm9yIChiLm51bSA9IDE7IGIubnVtIDw9IDEwOyBiLm51bSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChiLmRlbiA9IDE7IGIuZGVuIDw9IDEwOyBiLmRlbisrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2X2djZChiLm51bSwgYi5kZW4pID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoYXZfY21wX3EoYiwgYSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IDEwIDsgc3RhcnQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjYz0gc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaTwxMDA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGFjdCA9IHN0YXJ0ICsgYXZfcmVzY2FsZV9xKGkrMSwgYiwgYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjID0gYXZfYWRkX3N0YWJsZShhLCBhY2MsIGIsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGRkFCUyhhY2MgLSBleGFjdCkgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZC8lZCAlZC8lZCwgJWQgJWRcbiIsIGEubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5kZW4sIGIubnVtLCBiLmRlbiwgYWNjLCBleGFjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9yYXRpb25hbC5oIGIvZmZtcGVnL2xpYmF2dXRpbC9yYXRpb25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Mzk3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3JhdGlvbmFsLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiByYXRpb25hbCBudW1iZXJzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogcmF0aW9uYWwgbnVtYmVycworICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpZm5kZWYgQVZVVElMX1JBVElPTkFMX0gKKyNkZWZpbmUgQVZVVElMX1JBVElPTkFMX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgImF0dHJpYnV0ZXMuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBsYXZ1X21hdGgKKyAqIEB7CisgKi8KKworLyoqCisgKiByYXRpb25hbCBudW1iZXIgbnVtZXJhdG9yL2Rlbm9taW5hdG9yCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWUmF0aW9uYWx7CisgICAgaW50IG51bTsgLy8vPCBudW1lcmF0b3IKKyAgICBpbnQgZGVuOyAvLy88IGRlbm9taW5hdG9yCit9IEFWUmF0aW9uYWw7CisKKy8qKgorICogQ3JlYXRlIGEgcmF0aW9uYWwuCisgKiBVc2VmdWwgZm9yIGNvbXBpbGVycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGNvbXBvdW5kIGxpdGVyYWxzLgorICogQG5vdGUgIFRoZSByZXR1cm4gdmFsdWUgaXMgbm90IHJlZHVjZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgQVZSYXRpb25hbCBhdl9tYWtlX3EoaW50IG51bSwgaW50IGRlbikKK3sKKyAgICBBVlJhdGlvbmFsIHIgPSB7IG51bSwgZGVuIH07CisgICAgcmV0dXJuIHI7Cit9CisKKy8qKgorICogQ29tcGFyZSB0d28gcmF0aW9uYWxzLgorICogQHBhcmFtIGEgZmlyc3QgcmF0aW9uYWwKKyAqIEBwYXJhbSBiIHNlY29uZCByYXRpb25hbAorICogQHJldHVybiAwIGlmIGE9PWIsIDEgaWYgYT5iLCAtMSBpZiBhPGIsIGFuZCBJTlRfTUlOIGlmIG9uZSBvZiB0aGUKKyAqIHZhbHVlcyBpcyBvZiB0aGUgZm9ybSAwLzAKKyAqLworc3RhdGljIGlubGluZSBpbnQgYXZfY21wX3EoQVZSYXRpb25hbCBhLCBBVlJhdGlvbmFsIGIpeworICAgIGNvbnN0IGludDY0X3QgdG1wPSBhLm51bSAqIChpbnQ2NF90KWIuZGVuIC0gYi5udW0gKiAoaW50NjRfdClhLmRlbjsKKworICAgIGlmKHRtcCkgcmV0dXJuIChpbnQpKCh0bXAgXiBhLmRlbiBeIGIuZGVuKT4+NjMpfDE7CisgICAgZWxzZSBpZihiLmRlbiAmJiBhLmRlbikgcmV0dXJuIDA7CisgICAgZWxzZSBpZihhLm51bSAmJiBiLm51bSkgcmV0dXJuIChhLm51bT4+MzEpIC0gKGIubnVtPj4zMSk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVF9NSU47Cit9CisKKy8qKgorICogQ29udmVydCByYXRpb25hbCB0byBkb3VibGUuCisgKiBAcGFyYW0gYSByYXRpb25hbCB0byBjb252ZXJ0CisgKiBAcmV0dXJuIChkb3VibGUpIGEKKyAqLworc3RhdGljIGlubGluZSBkb3VibGUgYXZfcTJkKEFWUmF0aW9uYWwgYSl7CisgICAgcmV0dXJuIGEubnVtIC8gKGRvdWJsZSkgYS5kZW47Cit9CisKKy8qKgorICogUmVkdWNlIGEgZnJhY3Rpb24uCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZnJhbWVyYXRlIGNhbGN1bGF0aW9ucy4KKyAqIEBwYXJhbSBkc3RfbnVtIGRlc3RpbmF0aW9uIG51bWVyYXRvcgorICogQHBhcmFtIGRzdF9kZW4gZGVzdGluYXRpb24gZGVub21pbmF0b3IKKyAqIEBwYXJhbSBudW0gc291cmNlIG51bWVyYXRvcgorICogQHBhcmFtIGRlbiBzb3VyY2UgZGVub21pbmF0b3IKKyAqIEBwYXJhbSBtYXggdGhlIG1heGltdW0gYWxsb3dlZCBmb3IgZHN0X251bSAmIGRzdF9kZW4KKyAqIEByZXR1cm4gMSBpZiBleGFjdCwgMCBvdGhlcndpc2UKKyAqLworaW50IGF2X3JlZHVjZShpbnQgKmRzdF9udW0sIGludCAqZHN0X2RlbiwgaW50NjRfdCBudW0sIGludDY0X3QgZGVuLCBpbnQ2NF90IG1heCk7CisKKy8qKgorICogTXVsdGlwbHkgdHdvIHJhdGlvbmFscy4KKyAqIEBwYXJhbSBiIGZpcnN0IHJhdGlvbmFsCisgKiBAcGFyYW0gYyBzZWNvbmQgcmF0aW9uYWwKKyAqIEByZXR1cm4gYipjCisgKi8KK0FWUmF0aW9uYWwgYXZfbXVsX3EoQVZSYXRpb25hbCBiLCBBVlJhdGlvbmFsIGMpIGF2X2NvbnN0OworCisvKioKKyAqIERpdmlkZSBvbmUgcmF0aW9uYWwgYnkgYW5vdGhlci4KKyAqIEBwYXJhbSBiIGZpcnN0IHJhdGlvbmFsCisgKiBAcGFyYW0gYyBzZWNvbmQgcmF0aW9uYWwKKyAqIEByZXR1cm4gYi9jCisgKi8KK0FWUmF0aW9uYWwgYXZfZGl2X3EoQVZSYXRpb25hbCBiLCBBVlJhdGlvbmFsIGMpIGF2X2NvbnN0OworCisvKioKKyAqIEFkZCB0d28gcmF0aW9uYWxzLgorICogQHBhcmFtIGIgZmlyc3QgcmF0aW9uYWwKKyAqIEBwYXJhbSBjIHNlY29uZCByYXRpb25hbAorICogQHJldHVybiBiK2MKKyAqLworQVZSYXRpb25hbCBhdl9hZGRfcShBVlJhdGlvbmFsIGIsIEFWUmF0aW9uYWwgYykgYXZfY29uc3Q7CisKKy8qKgorICogU3VidHJhY3Qgb25lIHJhdGlvbmFsIGZyb20gYW5vdGhlci4KKyAqIEBwYXJhbSBiIGZpcnN0IHJhdGlvbmFsCisgKiBAcGFyYW0gYyBzZWNvbmQgcmF0aW9uYWwKKyAqIEByZXR1cm4gYi1jCisgKi8KK0FWUmF0aW9uYWwgYXZfc3ViX3EoQVZSYXRpb25hbCBiLCBBVlJhdGlvbmFsIGMpIGF2X2NvbnN0OworCisvKioKKyAqIEludmVydCBhIHJhdGlvbmFsLgorICogQHBhcmFtIHEgdmFsdWUKKyAqIEByZXR1cm4gMSAvIHEKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgQVZSYXRpb25hbCBhdl9pbnZfcShBVlJhdGlvbmFsIHEpCit7CisgICAgQVZSYXRpb25hbCByID0geyBxLmRlbiwgcS5udW0gfTsKKyAgICByZXR1cm4gcjsKK30KKworLyoqCisgKiBDb252ZXJ0IGEgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gYSByYXRpb25hbC4KKyAqIGluZiBpcyBleHByZXNzZWQgYXMgezEsMH0gb3Igey0xLDB9IGRlcGVuZGluZyBvbiB0aGUgc2lnbi4KKyAqCisgKiBAcGFyYW0gZCBkb3VibGUgdG8gY29udmVydAorICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSBhbGxvd2VkIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IKKyAqIEByZXR1cm4gKEFWUmF0aW9uYWwpIGQKKyAqLworQVZSYXRpb25hbCBhdl9kMnEoZG91YmxlIGQsIGludCBtYXgpIGF2X2NvbnN0OworCisvKioKKyAqIEByZXR1cm4gMSBpZiBxMSBpcyBuZWFyZXIgdG8gcSB0aGFuIHEyLCAtMSBpZiBxMiBpcyBuZWFyZXIKKyAqIHRoYW4gcTEsIDAgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGRpc3RhbmNlLgorICovCitpbnQgYXZfbmVhcmVyX3EoQVZSYXRpb25hbCBxLCBBVlJhdGlvbmFsIHExLCBBVlJhdGlvbmFsIHEyKTsKKworLyoqCisgKiBGaW5kIHRoZSBuZWFyZXN0IHZhbHVlIGluIHFfbGlzdCB0byBxLgorICogQHBhcmFtIHFfbGlzdCBhbiBhcnJheSBvZiByYXRpb25hbHMgdGVybWluYXRlZCBieSB7MCwgMH0KKyAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBuZWFyZXN0IHZhbHVlIGZvdW5kIGluIHRoZSBhcnJheQorICovCitpbnQgYXZfZmluZF9uZWFyZXN0X3FfaWR4KEFWUmF0aW9uYWwgcSwgY29uc3QgQVZSYXRpb25hbCogcV9saXN0KTsKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBVlVUSUxfUkFUSU9OQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9yYzQuYyBiL2ZmbXBlZy9saWJhdnV0aWwvcmM0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1MmJhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvcmM0LmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIFJDNCBlbmNyeXB0aW9uL2RlY3J5cHRpb24vcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgUmVpbWFyIERvZWZmaW5nZXIKKyAqCisgKiBsb29zZWx5IGJhc2VkIG9uIExpYlRvbUNyeXB0IGJ5IFRvbSBTdCBEZW5pcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImF2dXRpbC5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInJjNC5oIgorCit0eXBlZGVmIHN0cnVjdCBBVlJDNCBBVlJDNDsKKworaW50IGF2X3JjNF9pbml0KEFWUkM0ICpyLCBjb25zdCB1aW50OF90ICprZXksIGludCBrZXlfYml0cywgaW50IGRlY3J5cHQpIHsKKyAgICBpbnQgaSwgajsKKyAgICB1aW50OF90IHk7CisgICAgdWludDhfdCAqc3RhdGUgPSByLT5zdGF0ZTsKKyAgICBpbnQga2V5bGVuID0ga2V5X2JpdHMgPj4gMzsKKyAgICBpZiAoa2V5X2JpdHMgJiA3KQorICAgICAgICByZXR1cm4gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBzdGF0ZVtpXSA9IGk7CisgICAgeSA9IDA7CisgICAgLy8gaiBpcyBpICUga2V5bGVuCisgICAgZm9yIChqID0gMCwgaSA9IDA7IGkgPCAyNTY7IGkrKywgaisrKSB7CisgICAgICAgIGlmIChqID09IGtleWxlbikgaiA9IDA7CisgICAgICAgIHkgKz0gc3RhdGVbaV0gKyBrZXlbal07CisgICAgICAgIEZGU1dBUCh1aW50OF90LCBzdGF0ZVtpXSwgc3RhdGVbeV0pOworICAgIH0KKyAgICByLT54ID0gMTsKKyAgICByLT55ID0gc3RhdGVbMV07CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXZfcmM0X2NyeXB0KEFWUkM0ICpyLCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvdW50LCB1aW50OF90ICppdiwgaW50IGRlY3J5cHQpIHsKKyAgICB1aW50OF90IHggPSByLT54LCB5ID0gci0+eTsKKyAgICB1aW50OF90ICpzdGF0ZSA9IHItPnN0YXRlOworICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICB1aW50OF90IHN1bSA9IHN0YXRlW3hdICsgc3RhdGVbeV07CisgICAgICAgIEZGU1dBUCh1aW50OF90LCBzdGF0ZVt4XSwgc3RhdGVbeV0pOworICAgICAgICAqZHN0KysgPSBzcmMgPyAqc3JjKysgXiBzdGF0ZVtzdW1dIDogc3RhdGVbc3VtXTsKKyAgICAgICAgeCsrOworICAgICAgICB5ICs9IHN0YXRlW3hdOworICAgIH0KKyAgICByLT54ID0geDsgci0+eSA9IHk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3JjNC5oIGIvZmZtcGVnL2xpYmF2dXRpbC9yYzQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzYyZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9yYzQuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogUkM0IGVuY3J5cHRpb24vZGVjcnlwdGlvbi9wc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfUkM0X0gKKyNkZWZpbmUgQVZVVElMX1JDNF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RydWN0IEFWUkM0IHsKKyAgICB1aW50OF90IHN0YXRlWzI1Nl07CisgICAgaW50IHgsIHk7Cit9OworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyBhbiBBVlJDNCBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBrZXlfYml0cyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOAorICogQHBhcmFtIGRlY3J5cHQgMCBmb3IgZW5jcnlwdGlvbiwgMSBmb3IgZGVjcnlwdGlvbiwgY3VycmVudGx5IGhhcyBubyBlZmZlY3QKKyAqLworaW50IGF2X3JjNF9pbml0KHN0cnVjdCBBVlJDNCAqZCwgY29uc3QgdWludDhfdCAqa2V5LCBpbnQga2V5X2JpdHMsIGludCBkZWNyeXB0KTsKKworLyoqCisgKiBAYnJpZWYgRW5jcnlwdHMgLyBkZWNyeXB0cyB1c2luZyB0aGUgUkM0IGFsZ29yaXRobS4KKyAqCisgKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGJ5dGVzCisgKiBAcGFyYW0gZHN0IGRlc3RpbmF0aW9uIGFycmF5LCBjYW4gYmUgZXF1YWwgdG8gc3JjCisgKiBAcGFyYW0gc3JjIHNvdXJjZSBhcnJheSwgY2FuIGJlIGVxdWFsIHRvIGRzdCwgbWF5IGJlIE5VTEwKKyAqIEBwYXJhbSBpdiBub3QgKHlldCkgdXNlZCBmb3IgUkM0LCBzaG91bGQgYmUgTlVMTAorICogQHBhcmFtIGRlY3J5cHQgMCBmb3IgZW5jcnlwdGlvbiwgMSBmb3IgZGVjcnlwdGlvbiwgbm90ICh5ZXQpIHVzZWQKKyAqLwordm9pZCBhdl9yYzRfY3J5cHQoc3RydWN0IEFWUkM0ICpkLCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvdW50LCB1aW50OF90ICppdiwgaW50IGRlY3J5cHQpOworCisjZW5kaWYgLyogQVZVVElMX1JDNF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3JlcGxheWdhaW4uaCBiL2ZmbXBlZy9saWJhdnV0aWwvcmVwbGF5Z2Fpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMDNlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3JlcGxheWdhaW4uaApAQCAtMCwwICsxLDUxIEBACisvKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9SRVBMQVlHQUlOX0gKKyNkZWZpbmUgQVZVVElMX1JFUExBWUdBSU5fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKgorICogUmVwbGF5R2FpbiBpbmZvcm1hdGlvbiAoc2VlCisgKiBodHRwOi8vd2lraS5oeWRyb2dlbmF1ZGlvLm9yZy9pbmRleC5waHA/dGl0bGU9UmVwbGF5R2Fpbl8xLjBfc3BlY2lmaWNhdGlvbikuCisgKiBUaGUgc2l6ZSBvZiB0aGlzIHN0cnVjdCBpcyBhIHBhcnQgb2YgdGhlIHB1YmxpYyBBQkkuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWUmVwbGF5R2FpbiB7CisgICAgLyoqCisgICAgICogVHJhY2sgcmVwbGF5IGdhaW4gaW4gbWljcm9iZWxzIChkaXZpZGUgYnkgMTAwMDAwIHRvIGdldCB0aGUgdmFsdWUgaW4gZEIpLgorICAgICAqIFNob3VsZCBiZSBzZXQgdG8gSU5UMzJfTUlOIHdoZW4gdW5rbm93bi4KKyAgICAgKi8KKyAgICBpbnQzMl90IHRyYWNrX2dhaW47CisgICAgLyoqCisgICAgICogUGVhayB0cmFjayBhbXBsaXR1ZGUsIHdpdGggMTAwMDAwIHJlcHJlc2VudGluZyBmdWxsIHNjYWxlIChidXQgdmFsdWVzCisgICAgICogbWF5IG92ZXJmbG93KS4gMCB3aGVuIHVua25vd24uCisgICAgICovCisgICAgdWludDMyX3QgdHJhY2tfcGVhazsKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHRyYWNrX2dhaW4sIGJ1dCBmb3IgdGhlIHdob2xlIGFsYnVtLgorICAgICAqLworICAgIGludDMyX3QgYWxidW1fZ2FpbjsKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHRyYWNrX3BlYWssIGJ1dCBmb3IgdGhlIHdob2xlIGFsYnVtLAorICAgICAqLworICAgIHVpbnQzMl90IGFsYnVtX3BlYWs7Cit9IEFWUmVwbGF5R2FpbjsKKworI2VuZGlmIC8qIEFWVVRJTF9SRVBMQVlHQUlOX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvcmlwZW1kLmMgYi9mZm1wZWcvbGliYXZ1dGlsL3JpcGVtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWIyNGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3JpcGVtZC5jCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSmFtZXMgQWxtZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImF2dXRpbC5oIgorI2luY2x1ZGUgImJzd2FwLmgiCisjaW5jbHVkZSAiaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAicmlwZW1kLmgiCisjaW5jbHVkZSAibWVtLmgiCisKKy8qKiBoYXNoIGNvbnRleHQgKi8KK3R5cGVkZWYgc3RydWN0IEFWUklQRU1EIHsKKyAgICB1aW50OF90ICBkaWdlc3RfbGVuOyAgLy8vPCBkaWdlc3QgbGVuZ3RoIGluIDMyLWJpdCB3b3JkcworICAgIHVpbnQ2NF90IGNvdW50OyAgICAgICAvLy88IG51bWJlciBvZiBieXRlcyBpbiBidWZmZXIKKyAgICB1aW50OF90ICBidWZmZXJbNjRdOyAgLy8vPCA1MTItYml0IGJ1ZmZlciBvZiBpbnB1dCB2YWx1ZXMgdXNlZCBpbiBoYXNoIHVwZGF0aW5nCisgICAgdWludDMyX3Qgc3RhdGVbMTBdOyAgIC8vLzwgY3VycmVudCBoYXNoIHZhbHVlCisgICAgdWludDhfdCAgZXh0OyAgICAgICAgIC8vLzwgZXh0ZW5zaW9uICgwIGZvciAxMjggYW5kIDE2MCwgMSBmb3IgMjU2IGFuZCAzMjApCisgICAgLyoqIGZ1bmN0aW9uIHVzZWQgdG8gdXBkYXRlIGhhc2ggZm9yIDUxMi1iaXQgaW5wdXQgYmxvY2sgKi8KKyAgICB2b2lkICAgICAoKnRyYW5zZm9ybSkodWludDMyX3QgKnN0YXRlLCBjb25zdCB1aW50OF90IGJ1ZmZlcls2NF0sIGludCBleHQpOworfSBBVlJJUEVNRDsKKworY29uc3QgaW50IGF2X3JpcGVtZF9zaXplID0gc2l6ZW9mKEFWUklQRU1EKTsKKworc3RydWN0IEFWUklQRU1EICphdl9yaXBlbWRfYWxsb2Modm9pZCkKK3sKKyAgICByZXR1cm4gYXZfbWFsbG9jeihzaXplb2Yoc3RydWN0IEFWUklQRU1EKSk7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBLQVs0XSA9IHsKKyAgICAweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjLCAweGE5NTNmZDRlCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgS0JbNF0gPSB7CisgICAgMHg1MGEyOGJlNiwgMHg1YzRkZDEyNCwgMHg2ZDcwM2VmMywgMHg3YTZkNzZlOQorfTsKKworc3RhdGljIGNvbnN0IGludCBST1RBWzgwXSA9IHsKKyAgICAxMSwgMTQsIDE1LCAxMiwgIDUsICA4LCAgNyAsIDksIDExLCAxMywgMTQsIDE1LCAgNiwgIDcsICA5LCAgOCwKKyAgICAgNyAsIDYsICA4LCAxMywgMTEsICA5LCAgNywgMTUsICA3LCAxMiwgMTUsICA5LCAxMSwgIDcsIDEzLCAxMiwKKyAgICAxMSwgMTMsICA2LCAgNywgMTQsICA5LCAxMywgMTUsIDE0LCAgOCwgMTMsICA2LCAgNSwgMTIsICA3LCAgNSwKKyAgICAxMSwgMTIsIDE0LCAxNSwgMTQsIDE1LCAgOSwgIDgsICA5LCAxNCwgIDUsICA2LCAgOCwgIDYsICA1LCAxMiwKKyAgICAgOSwgMTUsICA1LCAxMSwgIDYsICA4LCAxMywgMTIsICA1LCAxMiwgMTMsIDE0LCAxMSwgIDgsICA1LCAgNgorfTsKKworc3RhdGljIGNvbnN0IGludCBST1RCWzgwXSA9IHsKKyAgICAgOCwgIDksICA5LCAxMSwgMTMsIDE1LCAxNSwgIDUsICA3LCAgNywgIDgsIDExLCAxNCwgMTQsIDEyLCAgNiwKKyAgICAgOSwgMTMsIDE1LCAgNywgMTIsICA4LCAgOSwgMTEsICA3LCAgNywgMTIsICA3LCAgNiwgMTUsIDEzLCAxMSwKKyAgICAgOSwgIDcsIDE1LCAxMSwgIDgsICA2LCAgNiwgMTQsIDEyLCAxMywgIDUsIDE0LCAxMywgMTMsICA3LCAgNSwKKyAgICAxNSwgIDUsICA4LCAxMSwgMTQsIDE0LCAgNiwgMTQsICA2LCAgOSwgMTIsICA5LCAxMiwgIDUsIDE1LCAgOCwKKyAgICAgOCwgIDUsIDEyLCAgOSwgMTIsICA1LCAxNCwgIDYsICA4LCAxMywgIDYsICA1LCAxNSwgMTMsIDExLCAxMQorfTsKKworc3RhdGljIGNvbnN0IGludCBXQVs4MF0gPSB7CisgICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAgIDcsICA0LCAxMywgIDEsIDEwLCAgNiwgMTUsICAzLCAxMiwgIDAsICA5LCAgNSwgIDIsIDE0LCAxMSwgIDgsCisgICAgIDMsIDEwLCAxNCwgIDQsICA5LCAxNSwgIDgsICAxLCAgMiwgIDcsICAwLCAgNiwgMTMsIDExLCAgNSwgMTIsCisgICAgIDEsICA5LCAxMSwgMTAsICAwLCAgOCwgMTIsICA0LCAxMywgIDMsICA3LCAxNSwgMTQsICA1LCAgNiwgIDIsCisgICAgIDQsICAwLCAgNSwgIDksICA3LCAxMiwgIDIsIDEwLCAxNCwgIDEsICAzLCAgOCwgMTEsICA2LCAxNSwgMTMKK307CisKK3N0YXRpYyBjb25zdCBpbnQgV0JbODBdID0geworICAgICA1LCAxNCwgIDcsICAwLCAgOSwgIDIsIDExLCAgNCwgMTMsICA2LCAxNSwgIDgsICAxLCAxMCwgIDMsIDEyLAorICAgICA2LCAxMSwgIDMsICA3LCAgMCwgMTMsICA1LCAxMCwgMTQsIDE1LCAgOCwgMTIsICA0LCAgOSwgIDEsICAyLAorICAgIDE1LCAgNSwgIDEsICAzLCAgNywgMTQsICA2LCAgOSwgMTEsICA4LCAxMiwgIDIsIDEwLCAgMCwgIDQsIDEzLAorICAgICA4LCAgNiwgIDQsICAxLCAgMywgMTEsIDE1LCAgMCwgIDUsIDEyLCAgMiwgMTMsICA5LCAgNywgMTAsIDE0LAorICAgIDEyLCAxNSwgMTAsICA0LCAgMSwgIDUsICA4LCAgNywgIDYsICAyLCAxMywgMTQsICAwLCAgMywgIDksIDExCit9OworCisjZGVmaW5lIHJvbCh2YWx1ZSwgYml0cykgKCh2YWx1ZSA8PCBiaXRzKSB8ICh2YWx1ZSA+PiAoMzIgLSBiaXRzKSkpCisKKyNkZWZpbmUgU1dBUChhLGIpIGlmIChleHQpIHsgdCA9IGE7IGEgPSBiOyBiID0gdDsgfQorCisjZGVmaW5lIFJPVU5EMTI4XzBfVE9fMTUoYSxiLGMsZCxlLGYsZyxoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYSA9IHJvbChhICsgKCggIGIgXiBjICBeIGQpICAgICAgKyBibG9ja1tXQVtuXV0pLCAgICAgICAgIFJPVEFbbl0pOyBcCisgICAgZSA9IHJvbChlICsgKCgoKGYgXiBnKSAmIGgpIF4gZykgKyBibG9ja1tXQltuXV0gKyBLQlswXSksIFJPVEJbbl0pOyBcCisgICAgbisrCisKKyNkZWZpbmUgUk9VTkQxMjhfMTZfVE9fMzEoYSxiLGMsZCxlLGYsZyxoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhID0gcm9sKGEgKyAoKCgoYyBeIGQpICYgYikgXiBkKSArIGJsb2NrW1dBW25dXSArIEtBWzBdKSwgUk9UQVtuXSk7IFwKKyAgICBlID0gcm9sKGUgKyAoKCh+ZyB8IGYpIF4gaCkgICAgICArIGJsb2NrW1dCW25dXSArIEtCWzFdKSwgUk9UQltuXSk7IFwKKyAgICBuKysKKworI2RlZmluZSBST1VORDEyOF8zMl9UT180NyhhLGIsYyxkLGUsZixnLGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGEgPSByb2woYSArICgoKH5jIHwgYikgXiBkKSAgICAgICsgYmxvY2tbV0Fbbl1dICsgS0FbMV0pLCBST1RBW25dKTsgXAorICAgIGUgPSByb2woZSArICgoKChnIF4gaCkgJiBmKSBeIGgpICsgYmxvY2tbV0Jbbl1dICsgS0JbMl0pLCBST1RCW25dKTsgXAorICAgIG4rKworCisjZGVmaW5lIFJPVU5EMTI4XzQ4X1RPXzYzKGEsYixjLGQsZSxmLGcsaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYSA9IHJvbChhICsgKCgoKGIgXiBjKSAmIGQpIF4gYykgKyBibG9ja1tXQVtuXV0gKyBLQVsyXSksIFJPVEFbbl0pOyBcCisgICAgZSA9IHJvbChlICsgKCggIGYgXiBnICBeIGgpICAgICAgKyBibG9ja1tXQltuXV0pLCAgICAgICAgIFJPVEJbbl0pOyBcCisgICAgbisrCisKK3N0YXRpYyB2b2lkIHJpcGVtZDEyOF90cmFuc2Zvcm0odWludDMyX3QgKnN0YXRlLCBjb25zdCB1aW50OF90IGJ1ZmZlcls2NF0sIGludCBleHQpCit7CisgICAgdWludDMyX3QgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgdDsKKyAgICB1aW50MzJfdCBibG9ja1sxNl07CisgICAgaW50IG47CisKKyAgICBpZiAoZXh0KSB7CisgICAgICAgIGEgPSBzdGF0ZVswXTsgYiA9IHN0YXRlWzFdOyBjID0gc3RhdGVbMl07IGQgPSBzdGF0ZVszXTsKKyAgICAgICAgZSA9IHN0YXRlWzRdOyBmID0gc3RhdGVbNV07IGcgPSBzdGF0ZVs2XTsgaCA9IHN0YXRlWzddOworICAgIH0gZWxzZSB7CisgICAgICAgIGEgPSBlID0gc3RhdGVbMF07CisgICAgICAgIGIgPSBmID0gc3RhdGVbMV07CisgICAgICAgIGMgPSBnID0gc3RhdGVbMl07CisgICAgICAgIGQgPSBoID0gc3RhdGVbM107CisgICAgfQorCisgICAgZm9yIChuID0gMDsgbiA8IDE2OyBuKyspCisgICAgICAgIGJsb2NrW25dID0gQVZfUkwzMihidWZmZXIgKyA0ICogbik7CisgICAgbiA9IDA7CisKKyNpZiBDT05GSUdfU01BTEwKKyAgICBmb3IgKDsgbiA8IDE2OykgeworICAgICAgICBST1VORDEyOF8wX1RPXzE1KGEsYixjLGQsZSxmLGcsaCk7CisgICAgICAgIHQgPSBkOyBkID0gYzsgYyA9IGI7IGIgPSBhOyBhID0gdDsKKyAgICAgICAgdCA9IGg7IGggPSBnOyBnID0gZjsgZiA9IGU7IGUgPSB0OworICAgIH0KKyAgICBTV0FQKGEsZSkKKworICAgIGZvciAoOyBuIDwgMzI7KSB7CisgICAgICAgIFJPVU5EMTI4XzE2X1RPXzMxKGEsYixjLGQsZSxmLGcsaCk7CisgICAgICAgIHQgPSBkOyBkID0gYzsgYyA9IGI7IGIgPSBhOyBhID0gdDsKKyAgICAgICAgdCA9IGg7IGggPSBnOyBnID0gZjsgZiA9IGU7IGUgPSB0OworICAgIH0KKyAgICBTV0FQKGIsZikKKworICAgIGZvciAoOyBuIDwgNDg7KSB7CisgICAgICAgIFJPVU5EMTI4XzMyX1RPXzQ3KGEsYixjLGQsZSxmLGcsaCk7CisgICAgICAgIHQgPSBkOyBkID0gYzsgYyA9IGI7IGIgPSBhOyBhID0gdDsKKyAgICAgICAgdCA9IGg7IGggPSBnOyBnID0gZjsgZiA9IGU7IGUgPSB0OworICAgIH0KKyAgICBTV0FQKGMsZykKKworICAgIGZvciAoOyBuIDwgNjQ7KSB7CisgICAgICAgIFJPVU5EMTI4XzQ4X1RPXzYzKGEsYixjLGQsZSxmLGcsaCk7CisgICAgICAgIHQgPSBkOyBkID0gYzsgYyA9IGI7IGIgPSBhOyBhID0gdDsKKyAgICAgICAgdCA9IGg7IGggPSBnOyBnID0gZjsgZiA9IGU7IGUgPSB0OworICAgIH0KKyAgICBTV0FQKGQsaCkKKyNlbHNlCisKKyNkZWZpbmUgUjEyOF8wICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBST1VORDEyOF8wX1RPXzE1KGEsYixjLGQsZSxmLGcsaCk7IFwKKyAgICBST1VORDEyOF8wX1RPXzE1KGQsYSxiLGMsaCxlLGYsZyk7IFwKKyAgICBST1VORDEyOF8wX1RPXzE1KGMsZCxhLGIsZyxoLGUsZik7IFwKKyAgICBST1VORDEyOF8wX1RPXzE1KGIsYyxkLGEsZixnLGgsZSkKKworICAgIFIxMjhfMDsgUjEyOF8wOyBSMTI4XzA7IFIxMjhfMDsKKyAgICBTV0FQKGEsZSkKKworI2RlZmluZSBSMTI4XzE2ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBST1VORDEyOF8xNl9UT18zMShhLGIsYyxkLGUsZixnLGgpOyBcCisgICAgUk9VTkQxMjhfMTZfVE9fMzEoZCxhLGIsYyxoLGUsZixnKTsgXAorICAgIFJPVU5EMTI4XzE2X1RPXzMxKGMsZCxhLGIsZyxoLGUsZik7IFwKKyAgICBST1VORDEyOF8xNl9UT18zMShiLGMsZCxhLGYsZyxoLGUpCisKKyAgICBSMTI4XzE2OyBSMTI4XzE2OyBSMTI4XzE2OyBSMTI4XzE2OworICAgIFNXQVAoYixmKQorCisjZGVmaW5lIFIxMjhfMzIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJPVU5EMTI4XzMyX1RPXzQ3KGEsYixjLGQsZSxmLGcsaCk7IFwKKyAgICBST1VORDEyOF8zMl9UT180NyhkLGEsYixjLGgsZSxmLGcpOyBcCisgICAgUk9VTkQxMjhfMzJfVE9fNDcoYyxkLGEsYixnLGgsZSxmKTsgXAorICAgIFJPVU5EMTI4XzMyX1RPXzQ3KGIsYyxkLGEsZixnLGgsZSkKKworICAgIFIxMjhfMzI7IFIxMjhfMzI7IFIxMjhfMzI7IFIxMjhfMzI7CisgICAgU1dBUChjLGcpCisKKyNkZWZpbmUgUjEyOF80OCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUk9VTkQxMjhfNDhfVE9fNjMoYSxiLGMsZCxlLGYsZyxoKTsgXAorICAgIFJPVU5EMTI4XzQ4X1RPXzYzKGQsYSxiLGMsaCxlLGYsZyk7IFwKKyAgICBST1VORDEyOF80OF9UT182MyhjLGQsYSxiLGcsaCxlLGYpOyBcCisgICAgUk9VTkQxMjhfNDhfVE9fNjMoYixjLGQsYSxmLGcsaCxlKQorCisgICAgUjEyOF80ODsgUjEyOF80ODsgUjEyOF80ODsgUjEyOF80ODsKKyAgICBTV0FQKGQsaCkKKyNlbmRpZgorCisgICAgaWYgKGV4dCkgeworICAgICAgICBzdGF0ZVswXSArPSBhOyBzdGF0ZVsxXSArPSBiOyBzdGF0ZVsyXSArPSBjOyBzdGF0ZVszXSArPSBkOworICAgICAgICBzdGF0ZVs0XSArPSBlOyBzdGF0ZVs1XSArPSBmOyBzdGF0ZVs2XSArPSBnOyBzdGF0ZVs3XSArPSBoOworICAgIH0gZWxzZSB7CisgICAgICAgIGggKz0gYyArIHN0YXRlWzFdOworICAgICAgICBzdGF0ZVsxXSA9IHN0YXRlWzJdICsgZCArIGU7CisgICAgICAgIHN0YXRlWzJdID0gc3RhdGVbM10gKyBhICsgZjsKKyAgICAgICAgc3RhdGVbM10gPSBzdGF0ZVswXSArIGIgKyBnOworICAgICAgICBzdGF0ZVswXSA9IGg7CisgICAgfQorfQorCisjZGVmaW5lIFJPVEFURSh4LHkpIFwKKyAgICB4ID0gcm9sKHgsIDEwKTsgXAorICAgIHkgPSByb2woeSwgMTApOyBcCisgICAgbisrCisKKyNkZWZpbmUgUk9VTkQxNjBfMF9UT18xNShhLGIsYyxkLGUsZixnLGgsaSxqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYSA9IHJvbChhICsgKCggIGIgXiBjICBeIGQpICAgICAgKyBibG9ja1tXQVtuXV0pLCAgICAgICAgIFJPVEFbbl0pICsgZTsgXAorICAgIGYgPSByb2woZiArICgoKH5pIHwgaCkgXiBnKSAgICAgICsgYmxvY2tbV0Jbbl1dICsgS0JbMF0pLCBST1RCW25dKSArIGo7IFwKKyAgICBST1RBVEUoYyxoKQorCisjZGVmaW5lIFJPVU5EMTYwXzE2X1RPXzMxKGEsYixjLGQsZSxmLGcsaCxpLGopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGEgPSByb2woYSArICgoKChjIF4gZCkgJiBiKSBeIGQpICsgYmxvY2tbV0Fbbl1dICsgS0FbMF0pLCBST1RBW25dKSArIGU7IFwKKyAgICBmID0gcm9sKGYgKyAoKCgoZyBeIGgpICYgaSkgXiBoKSArIGJsb2NrW1dCW25dXSArIEtCWzFdKSwgUk9UQltuXSkgKyBqOyBcCisgICAgUk9UQVRFKGMsaCkKKworI2RlZmluZSBST1VORDE2MF8zMl9UT180NyhhLGIsYyxkLGUsZixnLGgsaSxqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhID0gcm9sKGEgKyAoKCh+YyB8IGIpIF4gZCkgICAgICArIGJsb2NrW1dBW25dXSArIEtBWzFdKSwgUk9UQVtuXSkgKyBlOyBcCisgICAgZiA9IHJvbChmICsgKCgofmggfCBnKSBeIGkpICAgICAgKyBibG9ja1tXQltuXV0gKyBLQlsyXSksIFJPVEJbbl0pICsgajsgXAorICAgIFJPVEFURShjLGgpCisKKyNkZWZpbmUgUk9VTkQxNjBfNDhfVE9fNjMoYSxiLGMsZCxlLGYsZyxoLGksaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYSA9IHJvbChhICsgKCgoKGIgXiBjKSAmIGQpIF4gYykgKyBibG9ja1tXQVtuXV0gKyBLQVsyXSksIFJPVEFbbl0pICsgZTsgXAorICAgIGYgPSByb2woZiArICgoKChoIF4gaSkgJiBnKSBeIGkpICsgYmxvY2tbV0Jbbl1dICsgS0JbM10pLCBST1RCW25dKSArIGo7IFwKKyAgICBST1RBVEUoYyxoKQorCisjZGVmaW5lIFJPVU5EMTYwXzY0X1RPXzc5KGEsYixjLGQsZSxmLGcsaCxpLGopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGEgPSByb2woYSArICgoKH5kIHwgYykgXiBiKSAgICAgICsgYmxvY2tbV0Fbbl1dICsgS0FbM10pLCBST1RBW25dKSArIGU7IFwKKyAgICBmID0gcm9sKGYgKyAoKCAgZyBeIGggIF4gaSkgICAgICArIGJsb2NrW1dCW25dXSksICAgICAgICAgUk9UQltuXSkgKyBqOyBcCisgICAgUk9UQVRFKGMsaCkKKworc3RhdGljIHZvaWQgcmlwZW1kMTYwX3RyYW5zZm9ybSh1aW50MzJfdCAqc3RhdGUsIGNvbnN0IHVpbnQ4X3QgYnVmZmVyWzY0XSwgaW50IGV4dCkKK3sKKyAgICB1aW50MzJfdCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCB0OworICAgIHVpbnQzMl90IGJsb2NrWzE2XTsKKyAgICBpbnQgbjsKKworICAgIGlmIChleHQpIHsKKyAgICAgICAgYSA9IHN0YXRlWzBdOyBiID0gc3RhdGVbMV07IGMgPSBzdGF0ZVsyXTsgZCA9IHN0YXRlWzNdOyBlID0gc3RhdGVbNF07CisgICAgICAgIGYgPSBzdGF0ZVs1XTsgZyA9IHN0YXRlWzZdOyBoID0gc3RhdGVbN107IGkgPSBzdGF0ZVs4XTsgaiA9IHN0YXRlWzldOworICAgIH0gZWxzZSB7CisgICAgICAgIGEgPSBmID0gc3RhdGVbMF07CisgICAgICAgIGIgPSBnID0gc3RhdGVbMV07CisgICAgICAgIGMgPSBoID0gc3RhdGVbMl07CisgICAgICAgIGQgPSBpID0gc3RhdGVbM107CisgICAgICAgIGUgPSBqID0gc3RhdGVbNF07CisgICAgfQorCisgICAgZm9yIChuID0gMDsgbiA8IDE2OyBuKyspCisgICAgICAgIGJsb2NrW25dID0gQVZfUkwzMihidWZmZXIgKyA0ICogbik7CisgICAgbiA9IDA7CisKKyNpZiBDT05GSUdfU01BTEwKKyAgICBmb3IgKDsgbiA8IDE2OykgeworICAgICAgICBST1VORDE2MF8wX1RPXzE1KGEsYixjLGQsZSxmLGcsaCxpLGopOworICAgICAgICB0ID0gZTsgZSA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IGE7IGEgPSB0OworICAgICAgICB0ID0gajsgaiA9IGk7IGkgPSBoOyBoID0gZzsgZyA9IGY7IGYgPSB0OworICAgIH0KKyAgICBTV0FQKGIsZykKKworICAgIGZvciAoOyBuIDwgMzI7KSB7CisgICAgICAgIFJPVU5EMTYwXzE2X1RPXzMxKGEsYixjLGQsZSxmLGcsaCxpLGopOworICAgICAgICB0ID0gZTsgZSA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IGE7IGEgPSB0OworICAgICAgICB0ID0gajsgaiA9IGk7IGkgPSBoOyBoID0gZzsgZyA9IGY7IGYgPSB0OworICAgIH0KKyAgICBTV0FQKGQsaSkKKworICAgIGZvciAoOyBuIDwgNDg7KSB7CisgICAgICAgIFJPVU5EMTYwXzMyX1RPXzQ3KGEsYixjLGQsZSxmLGcsaCxpLGopOworICAgICAgICB0ID0gZTsgZSA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IGE7IGEgPSB0OworICAgICAgICB0ID0gajsgaiA9IGk7IGkgPSBoOyBoID0gZzsgZyA9IGY7IGYgPSB0OworICAgIH0KKyAgICBTV0FQKGEsZikKKworICAgIGZvciAoOyBuIDwgNjQ7KSB7CisgICAgICAgIFJPVU5EMTYwXzQ4X1RPXzYzKGEsYixjLGQsZSxmLGcsaCxpLGopOworICAgICAgICB0ID0gZTsgZSA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IGE7IGEgPSB0OworICAgICAgICB0ID0gajsgaiA9IGk7IGkgPSBoOyBoID0gZzsgZyA9IGY7IGYgPSB0OworICAgIH0KKyAgICBTV0FQKGMsaCkKKworICAgIGZvciAoOyBuIDwgODA7KSB7CisgICAgICAgIFJPVU5EMTYwXzY0X1RPXzc5KGEsYixjLGQsZSxmLGcsaCxpLGopOworICAgICAgICB0ID0gZTsgZSA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IGE7IGEgPSB0OworICAgICAgICB0ID0gajsgaiA9IGk7IGkgPSBoOyBoID0gZzsgZyA9IGY7IGYgPSB0OworICAgIH0KKyAgICBTV0FQKGUsaikKKyNlbHNlCisKKyNkZWZpbmUgUjE2MF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUk9VTkQxNjBfMF9UT18xNShhLGIsYyxkLGUsZixnLGgsaSxqKTsgXAorICAgIFJPVU5EMTYwXzBfVE9fMTUoZSxhLGIsYyxkLGosZixnLGgsaSk7IFwKKyAgICBST1VORDE2MF8wX1RPXzE1KGQsZSxhLGIsYyxpLGosZixnLGgpOyBcCisgICAgUk9VTkQxNjBfMF9UT18xNShjLGQsZSxhLGIsaCxpLGosZixnKTsgXAorICAgIFJPVU5EMTYwXzBfVE9fMTUoYixjLGQsZSxhLGcsaCxpLGosZikKKworICAgIFIxNjBfMDsgUjE2MF8wOyBSMTYwXzA7CisgICAgUk9VTkQxNjBfMF9UT18xNShhLGIsYyxkLGUsZixnLGgsaSxqKTsKKyAgICBTV0FQKGEsZikKKworI2RlZmluZSBSMTYwXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUk9VTkQxNjBfMTZfVE9fMzEoZSxhLGIsYyxkLGosZixnLGgsaSk7IFwKKyAgICBST1VORDE2MF8xNl9UT18zMShkLGUsYSxiLGMsaSxqLGYsZyxoKTsgXAorICAgIFJPVU5EMTYwXzE2X1RPXzMxKGMsZCxlLGEsYixoLGksaixmLGcpOyBcCisgICAgUk9VTkQxNjBfMTZfVE9fMzEoYixjLGQsZSxhLGcsaCxpLGosZik7IFwKKyAgICBST1VORDE2MF8xNl9UT18zMShhLGIsYyxkLGUsZixnLGgsaSxqKQorCisgICAgUjE2MF8xNjsgUjE2MF8xNjsgUjE2MF8xNjsKKyAgICBST1VORDE2MF8xNl9UT18zMShlLGEsYixjLGQsaixmLGcsaCxpKTsKKyAgICBTV0FQKGIsZykKKworI2RlZmluZSBSMTYwXzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUk9VTkQxNjBfMzJfVE9fNDcoZCxlLGEsYixjLGksaixmLGcsaCk7IFwKKyAgICBST1VORDE2MF8zMl9UT180NyhjLGQsZSxhLGIsaCxpLGosZixnKTsgXAorICAgIFJPVU5EMTYwXzMyX1RPXzQ3KGIsYyxkLGUsYSxnLGgsaSxqLGYpOyBcCisgICAgUk9VTkQxNjBfMzJfVE9fNDcoYSxiLGMsZCxlLGYsZyxoLGksaik7IFwKKyAgICBST1VORDE2MF8zMl9UT180NyhlLGEsYixjLGQsaixmLGcsaCxpKQorCisgICAgUjE2MF8zMjsgUjE2MF8zMjsgUjE2MF8zMjsKKyAgICBST1VORDE2MF8zMl9UT180NyhkLGUsYSxiLGMsaSxqLGYsZyxoKTsKKyAgICBTV0FQKGMsaCkKKworI2RlZmluZSBSMTYwXzQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUk9VTkQxNjBfNDhfVE9fNjMoYyxkLGUsYSxiLGgsaSxqLGYsZyk7IFwKKyAgICBST1VORDE2MF80OF9UT182MyhiLGMsZCxlLGEsZyxoLGksaixmKTsgXAorICAgIFJPVU5EMTYwXzQ4X1RPXzYzKGEsYixjLGQsZSxmLGcsaCxpLGopOyBcCisgICAgUk9VTkQxNjBfNDhfVE9fNjMoZSxhLGIsYyxkLGosZixnLGgsaSk7IFwKKyAgICBST1VORDE2MF80OF9UT182MyhkLGUsYSxiLGMsaSxqLGYsZyxoKQorCisgICAgUjE2MF80ODsgUjE2MF80ODsgUjE2MF80ODsKKyAgICBST1VORDE2MF80OF9UT182MyhjLGQsZSxhLGIsaCxpLGosZixnKTsKKyAgICBTV0FQKGQsaSkKKworI2RlZmluZSBSMTYwXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUk9VTkQxNjBfNjRfVE9fNzkoYixjLGQsZSxhLGcsaCxpLGosZik7IFwKKyAgICBST1VORDE2MF82NF9UT183OShhLGIsYyxkLGUsZixnLGgsaSxqKTsgXAorICAgIFJPVU5EMTYwXzY0X1RPXzc5KGUsYSxiLGMsZCxqLGYsZyxoLGkpOyBcCisgICAgUk9VTkQxNjBfNjRfVE9fNzkoZCxlLGEsYixjLGksaixmLGcsaCk7IFwKKyAgICBST1VORDE2MF82NF9UT183OShjLGQsZSxhLGIsaCxpLGosZixnKQorCisgICAgUjE2MF82NDsgUjE2MF82NDsgUjE2MF82NDsKKyAgICBST1VORDE2MF82NF9UT183OShiLGMsZCxlLGEsZyxoLGksaixmKTsKKyAgICBTV0FQKGUsaikKKyNlbmRpZgorCisgICAgaWYgKGV4dCkgeworICAgICAgICBzdGF0ZVswXSArPSBhOyBzdGF0ZVsxXSArPSBiOyBzdGF0ZVsyXSArPSBjOyBzdGF0ZVszXSArPSBkOyBzdGF0ZVs0XSArPSBlOworICAgICAgICBzdGF0ZVs1XSArPSBmOyBzdGF0ZVs2XSArPSBnOyBzdGF0ZVs3XSArPSBoOyBzdGF0ZVs4XSArPSBpOyBzdGF0ZVs5XSArPSBqOworICAgIH0gZWxzZSB7CisgICAgICAgIGkgKz0gYyArIHN0YXRlWzFdOworICAgICAgICBzdGF0ZVsxXSA9IHN0YXRlWzJdICsgZCArIGo7CisgICAgICAgIHN0YXRlWzJdID0gc3RhdGVbM10gKyBlICsgZjsKKyAgICAgICAgc3RhdGVbM10gPSBzdGF0ZVs0XSArIGEgKyBnOworICAgICAgICBzdGF0ZVs0XSA9IHN0YXRlWzBdICsgYiArIGg7CisgICAgICAgIHN0YXRlWzBdID0gaTsKKyAgICB9Cit9CisKK2F2X2NvbGQgaW50IGF2X3JpcGVtZF9pbml0KEFWUklQRU1EICpjdHgsIGludCBiaXRzKQoreworICAgIGN0eC0+ZGlnZXN0X2xlbiA9IGJpdHMgPj4gNTsKKyAgICBzd2l0Y2ggKGJpdHMpIHsKKyAgICBjYXNlIDEyODogLy8gUklQRU1ELTEyOAorICAgICAgICBjdHgtPnN0YXRlWzBdID0gMHg2NzQ1MjMwMTsKKyAgICAgICAgY3R4LT5zdGF0ZVsxXSA9IDB4RUZDREFCODk7CisgICAgICAgIGN0eC0+c3RhdGVbMl0gPSAweDk4QkFEQ0ZFOworICAgICAgICBjdHgtPnN0YXRlWzNdID0gMHgxMDMyNTQ3NjsKKyAgICAgICAgY3R4LT50cmFuc2Zvcm0gPSByaXBlbWQxMjhfdHJhbnNmb3JtOworICAgICAgICBjdHgtPmV4dCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTYwOiAvLyBSSVBFTUQtMTYwCisgICAgICAgIGN0eC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOworICAgICAgICBjdHgtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKyAgICAgICAgY3R4LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7CisgICAgICAgIGN0eC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OworICAgICAgICBjdHgtPnN0YXRlWzRdID0gMHhDM0QyRTFGMDsKKyAgICAgICAgY3R4LT50cmFuc2Zvcm0gPSByaXBlbWQxNjBfdHJhbnNmb3JtOworICAgICAgICBjdHgtPmV4dCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjU2OiAvLyBSSVBFTUQtMjU2CisgICAgICAgIGN0eC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOworICAgICAgICBjdHgtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKyAgICAgICAgY3R4LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7CisgICAgICAgIGN0eC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OworICAgICAgICBjdHgtPnN0YXRlWzRdID0gMHg3NjU0MzIxMDsKKyAgICAgICAgY3R4LT5zdGF0ZVs1XSA9IDB4RkVEQ0JBOTg7CisgICAgICAgIGN0eC0+c3RhdGVbNl0gPSAweDg5QUJDREVGOworICAgICAgICBjdHgtPnN0YXRlWzddID0gMHgwMTIzNDU2NzsKKyAgICAgICAgY3R4LT50cmFuc2Zvcm0gPSByaXBlbWQxMjhfdHJhbnNmb3JtOworICAgICAgICBjdHgtPmV4dCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzIwOiAvLyBSSVBFTUQtMzIwCisgICAgICAgIGN0eC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOworICAgICAgICBjdHgtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKyAgICAgICAgY3R4LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7CisgICAgICAgIGN0eC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OworICAgICAgICBjdHgtPnN0YXRlWzRdID0gMHhDM0QyRTFGMDsKKyAgICAgICAgY3R4LT5zdGF0ZVs1XSA9IDB4NzY1NDMyMTA7CisgICAgICAgIGN0eC0+c3RhdGVbNl0gPSAweEZFRENCQTk4OworICAgICAgICBjdHgtPnN0YXRlWzddID0gMHg4OUFCQ0RFRjsKKyAgICAgICAgY3R4LT5zdGF0ZVs4XSA9IDB4MDEyMzQ1Njc7CisgICAgICAgIGN0eC0+c3RhdGVbOV0gPSAweDNDMkQxRTBGOworICAgICAgICBjdHgtPnRyYW5zZm9ybSA9IHJpcGVtZDE2MF90cmFuc2Zvcm07CisgICAgICAgIGN0eC0+ZXh0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjdHgtPmNvdW50ID0gMDsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBhdl9yaXBlbWRfdXBkYXRlKEFWUklQRU1EKiBjdHgsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgICBqID0gY3R4LT5jb3VudCAmIDYzOworICAgIGN0eC0+Y291bnQgKz0gbGVuOworI2lmIENPTkZJR19TTUFMTAorICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBjdHgtPmJ1ZmZlcltqKytdID0gZGF0YVtpXTsKKyAgICAgICAgaWYgKDY0ID09IGopIHsKKyAgICAgICAgICAgIGN0eC0+dHJhbnNmb3JtKGN0eC0+c3RhdGUsIGN0eC0+YnVmZmVyLCBjdHgtPmV4dCk7CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgaWYgKChqICsgbGVuKSA+IDYzKSB7CisgICAgICAgIG1lbWNweSgmY3R4LT5idWZmZXJbal0sIGRhdGEsIChpID0gNjQgLSBqKSk7CisgICAgICAgIGN0eC0+dHJhbnNmb3JtKGN0eC0+c3RhdGUsIGN0eC0+YnVmZmVyLCBjdHgtPmV4dCk7CisgICAgICAgIGZvciAoOyBpICsgNjMgPCBsZW47IGkgKz0gNjQpCisgICAgICAgICAgICBjdHgtPnRyYW5zZm9ybShjdHgtPnN0YXRlLCAmZGF0YVtpXSwgY3R4LT5leHQpOworICAgICAgICBqID0gMDsKKyAgICB9IGVsc2UKKyAgICAgICAgaSA9IDA7CisgICAgbWVtY3B5KCZjdHgtPmJ1ZmZlcltqXSwgJmRhdGFbaV0sIGxlbiAtIGkpOworI2VuZGlmCit9CisKK3ZvaWQgYXZfcmlwZW1kX2ZpbmFsKEFWUklQRU1EKiBjdHgsIHVpbnQ4X3QgKmRpZ2VzdCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50NjRfdCBmaW5hbGNvdW50ID0gYXZfbGUybmU2NChjdHgtPmNvdW50IDw8IDMpOworCisgICAgYXZfcmlwZW1kX3VwZGF0ZShjdHgsICJcMjAwIiwgMSk7CisgICAgd2hpbGUgKChjdHgtPmNvdW50ICYgNjMpICE9IDU2KQorICAgICAgICBhdl9yaXBlbWRfdXBkYXRlKGN0eCwgIiIsIDEpOworICAgIGF2X3JpcGVtZF91cGRhdGUoY3R4LCAodWludDhfdCAqKSZmaW5hbGNvdW50LCA4KTsgLyogU2hvdWxkIGNhdXNlIGEgdHJhbnNmb3JtKCkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5kaWdlc3RfbGVuOyBpKyspCisgICAgICAgIEFWX1dMMzIoZGlnZXN0ICsgaSo0LCBjdHgtPnN0YXRlW2ldKTsKK30KKworI2lmZGVmIFRFU1QKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludCBpLCBqLCBrOworICAgIEFWUklQRU1EIGN0eDsKKyAgICB1bnNpZ25lZCBjaGFyIGRpZ2VzdFs0MF07CisgICAgc3RhdGljIGNvbnN0IGludCBsZW5ndGhzWzRdID0geyAxMjgsIDE2MCwgMjU2LCAzMjAgfTsKKworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgcHJpbnRmKCJUZXN0aW5nIFJJUEVNRC0lZFxuIiwgbGVuZ3Roc1tqXSk7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCAzOyBrKyspIHsKKyAgICAgICAgICAgIGF2X3JpcGVtZF9pbml0KCZjdHgsIGxlbmd0aHNbal0pOworICAgICAgICAgICAgaWYgKGsgPT0gMCkKKyAgICAgICAgICAgICAgICBhdl9yaXBlbWRfdXBkYXRlKCZjdHgsICJhYmMiLCAzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGsgPT0gMSkKKyAgICAgICAgICAgICAgICBhdl9yaXBlbWRfdXBkYXRlKCZjdHgsICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsIDU2KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMCoxMDAwOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGF2X3JpcGVtZF91cGRhdGUoJmN0eCwgImEiLCAxKTsKKyAgICAgICAgICAgIGF2X3JpcGVtZF9maW5hbCgmY3R4LCBkaWdlc3QpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aHNbal0gPj4gMzsgaSsrKQorICAgICAgICAgICAgICAgIHByaW50ZigiJTAyWCIsIGRpZ2VzdFtpXSk7CisgICAgICAgICAgICBwdXRjaGFyKCdcbicpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoaikgeyAvL3Rlc3QgdmVjdG9ycyAoZnJvbSBJU086SUVDIDEwMTE4LTMgKDIwMDQpIGFuZCBodHRwOi8vaG9tZXMuZXNhdC5rdWxldXZlbi5iZS9+Ym9zc2VsYWUvcmlwZW1kMTYwLmh0bWwpCisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHByaW50ZigiYzE0YTEyMTkgOWM2NmU0YmEgODQ2MzZiMGYgNjkxNDRjNzdcbiIKKyAgICAgICAgICAgICAgICAgICAiYTFhYTA2ODkgZDBmYWZhMmQgZGMyMmU4OGIgNDkxMzNhMDZcbiIKKyAgICAgICAgICAgICAgICAgICAiNGE3ZjU3MjMgZjk1NGViYTEgMjE2YzlkOGYgNjMyMDQzMWZcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHByaW50ZigiOGViMjA4ZjcgZTA1ZDk4N2EgOWIwNDRhOGUgOThjNmIwODcgZjE1YTBiZmNcbiIKKyAgICAgICAgICAgICAgICAgICAiMTJhMDUzMzggNGE5YzBjODggZTQwNWEwNmMgMjdkY2Y0OWEgZGE2MmViMmJcbiIKKyAgICAgICAgICAgICAgICAgICAiNTI3ODMyNDMgYzE2OTdiZGIgZTE2ZDM3ZjkgN2Y2OGYwODMgMjVkYzE1MjhcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHByaW50ZigiYWZiZDZlMjIgOGI5ZDhjYmIgY2VmNWNhMmQgMDNlNmRiYTEgMGFjMGJjN2QgY2JlNDY4MGUgMWU0MmQyZTkgNzU0NTliNjVcbiIKKyAgICAgICAgICAgICAgICAgICAiMzg0MzA0NTUgODNhYWM2YzggYzhkOTEyODUgNzNlN2E5ODAgOWFmYjJhMGYgMzRjY2MzNmUgYTllNzJmMTYgZjYzNjhlM2ZcbiIKKyAgICAgICAgICAgICAgICAgICAiYWM5NTM3NDQgZTEwZTMxNTEgNGMxNTBkNGQgOGQ3YjY3NzMgNDJlMzMzOTkgNzg4Mjk2ZTQgM2FlNDg1MGMgZTRmOTc5NzhcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHByaW50ZigiZGU0YzAxYjMgMDU0Zjg5MzAgYTc5ZDA5YWUgNzM4ZTkyMzAgMWU1YTE3MDggNWJlZmZkYzEgYjhkMTE2NzEgM2U3NGY4MmYgYTk0MmQ2NGMgZGJjNDY4MmRcbiIKKyAgICAgICAgICAgICAgICAgICAiZDAzNGE3OTUgMGNmNzIyMDIgMWJhNGI4NGQgZjc2OWE1ZGUgMjA2MGUyNTkgZGY0YzliYjQgYTQyNjhjMGUgOTM1YmJjNzQgNzBhOTY5YzkgZDA3MmExYWNcbiIKKyAgICAgICAgICAgICAgICAgICAiYmRlZTM3ZjQgMzcxZTIwNjQgNmI4YjBkODYgMmRkYTE2MjkgMmFlMzZmNDAgOTY1ZThjODUgMDllNjNkMWQgYmRkZWNjNTAgM2UyYjYzZWIgOTI0NWJiNjZcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9yaXBlbWQuaCBiL2ZmbXBlZy9saWJhdnV0aWwvcmlwZW1kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwYzhiYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvcmlwZW1kLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChDKSAyMDEzIEphbWVzIEFsbWVyIDxqYW1yaWFsQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfUklQRU1EX0gKKyNkZWZpbmUgQVZVVElMX1JJUEVNRF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImF0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKy8qKgorICogQGRlZmdyb3VwIGxhdnVfcmlwZW1kIFJJUEVNRAorICogQGluZ3JvdXAgbGF2dV9jcnlwdG8KKyAqIEB7CisgKi8KKworZXh0ZXJuIGNvbnN0IGludCBhdl9yaXBlbWRfc2l6ZTsKKworc3RydWN0IEFWUklQRU1EOworCisvKioKKyAqIEFsbG9jYXRlIGFuIEFWUklQRU1EIGNvbnRleHQuCisgKi8KK3N0cnVjdCBBVlJJUEVNRCAqYXZfcmlwZW1kX2FsbG9jKHZvaWQpOworCisvKioKKyAqIEluaXRpYWxpemUgUklQRU1EIGhhc2hpbmcuCisgKgorICogQHBhcmFtIGNvbnRleHQgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gY29udGV4dCAob2Ygc2l6ZSBhdl9yaXBlbWRfc2l6ZSkKKyAqIEBwYXJhbSBiaXRzICAgIG51bWJlciBvZiBiaXRzIGluIGRpZ2VzdCAoMTI4LCAxNjAsIDI1NiBvciAzMjAgYml0cykKKyAqIEByZXR1cm4gICAgICAgIHplcm8gaWYgaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkLCAtMSBvdGhlcndpc2UKKyAqLworaW50IGF2X3JpcGVtZF9pbml0KHN0cnVjdCBBVlJJUEVNRCogY29udGV4dCwgaW50IGJpdHMpOworCisvKioKKyAqIFVwZGF0ZSBoYXNoIHZhbHVlLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IGhhc2ggZnVuY3Rpb24gY29udGV4dAorICogQHBhcmFtIGRhdGEgICAgaW5wdXQgZGF0YSB0byB1cGRhdGUgaGFzaCB3aXRoCisgKiBAcGFyYW0gbGVuICAgICBpbnB1dCBkYXRhIGxlbmd0aAorICovCit2b2lkIGF2X3JpcGVtZF91cGRhdGUoc3RydWN0IEFWUklQRU1EKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKTsKKworLyoqCisgKiBGaW5pc2ggaGFzaGluZyBhbmQgb3V0cHV0IGRpZ2VzdCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gY29udGV4dCBoYXNoIGZ1bmN0aW9uIGNvbnRleHQKKyAqIEBwYXJhbSBkaWdlc3QgIGJ1ZmZlciB3aGVyZSBvdXRwdXQgZGlnZXN0IHZhbHVlIGlzIHN0b3JlZAorICovCit2b2lkIGF2X3JpcGVtZF9maW5hbChzdHJ1Y3QgQVZSSVBFTUQqIGNvbnRleHQsIHVpbnQ4X3QgKmRpZ2VzdCk7CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZVVElMX1JJUEVNRF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3NhbXBsZWZtdC5jIGIvZmZtcGVnL2xpYmF2dXRpbC9zYW1wbGVmbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjA1YjVlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9zYW1wbGVmbXQuYwpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAic2FtcGxlZm10LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit0eXBlZGVmIHN0cnVjdCBTYW1wbGVGbXRJbmZvIHsKKyAgICBjaGFyIG5hbWVbOF07CisgICAgaW50IGJpdHM7CisgICAgaW50IHBsYW5hcjsKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGFsdGZvcm07IC8vLzwgcGxhbmFyPC0+cGFja2VkIGFsdGVybmF0aXZlIGZvcm0KK30gU2FtcGxlRm10SW5mbzsKKworLyoqIHRoaXMgdGFibGUgZ2l2ZXMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmb3JtYXRzICovCitzdGF0aWMgY29uc3QgU2FtcGxlRm10SW5mbyBzYW1wbGVfZm10X2luZm9bQVZfU0FNUExFX0ZNVF9OQl0gPSB7CisgICAgW0FWX1NBTVBMRV9GTVRfVThdICAgPSB7IC5uYW1lID0gICAidTgiLCAuYml0cyA9ICA4LCAucGxhbmFyID0gMCwgLmFsdGZvcm0gPSBBVl9TQU1QTEVfRk1UX1U4UCAgfSwKKyAgICBbQVZfU0FNUExFX0ZNVF9TMTZdICA9IHsgLm5hbWUgPSAgInMxNiIsIC5iaXRzID0gMTYsIC5wbGFuYXIgPSAwLCAuYWx0Zm9ybSA9IEFWX1NBTVBMRV9GTVRfUzE2UCB9LAorICAgIFtBVl9TQU1QTEVfRk1UX1MzMl0gID0geyAubmFtZSA9ICAiczMyIiwgLmJpdHMgPSAzMiwgLnBsYW5hciA9IDAsIC5hbHRmb3JtID0gQVZfU0FNUExFX0ZNVF9TMzJQIH0sCisgICAgW0FWX1NBTVBMRV9GTVRfRkxUXSAgPSB7IC5uYW1lID0gICJmbHQiLCAuYml0cyA9IDMyLCAucGxhbmFyID0gMCwgLmFsdGZvcm0gPSBBVl9TQU1QTEVfRk1UX0ZMVFAgfSwKKyAgICBbQVZfU0FNUExFX0ZNVF9EQkxdICA9IHsgLm5hbWUgPSAgImRibCIsIC5iaXRzID0gNjQsIC5wbGFuYXIgPSAwLCAuYWx0Zm9ybSA9IEFWX1NBTVBMRV9GTVRfREJMUCB9LAorICAgIFtBVl9TQU1QTEVfRk1UX1U4UF0gID0geyAubmFtZSA9ICAidThwIiwgLmJpdHMgPSAgOCwgLnBsYW5hciA9IDEsIC5hbHRmb3JtID0gQVZfU0FNUExFX0ZNVF9VOCAgIH0sCisgICAgW0FWX1NBTVBMRV9GTVRfUzE2UF0gPSB7IC5uYW1lID0gInMxNnAiLCAuYml0cyA9IDE2LCAucGxhbmFyID0gMSwgLmFsdGZvcm0gPSBBVl9TQU1QTEVfRk1UX1MxNiAgfSwKKyAgICBbQVZfU0FNUExFX0ZNVF9TMzJQXSA9IHsgLm5hbWUgPSAiczMycCIsIC5iaXRzID0gMzIsIC5wbGFuYXIgPSAxLCAuYWx0Zm9ybSA9IEFWX1NBTVBMRV9GTVRfUzMyICB9LAorICAgIFtBVl9TQU1QTEVfRk1UX0ZMVFBdID0geyAubmFtZSA9ICJmbHRwIiwgLmJpdHMgPSAzMiwgLnBsYW5hciA9IDEsIC5hbHRmb3JtID0gQVZfU0FNUExFX0ZNVF9GTFQgIH0sCisgICAgW0FWX1NBTVBMRV9GTVRfREJMUF0gPSB7IC5uYW1lID0gImRibHAiLCAuYml0cyA9IDY0LCAucGxhbmFyID0gMSwgLmFsdGZvcm0gPSBBVl9TQU1QTEVfRk1UX0RCTCAgfSwKK307CisKK2NvbnN0IGNoYXIgKmF2X2dldF9zYW1wbGVfZm10X25hbWUoZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10KQoreworICAgIGlmIChzYW1wbGVfZm10IDwgMCB8fCBzYW1wbGVfZm10ID49IEFWX1NBTVBMRV9GTVRfTkIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBzYW1wbGVfZm10X2luZm9bc2FtcGxlX2ZtdF0ubmFtZTsKK30KKworZW51bSBBVlNhbXBsZUZvcm1hdCBhdl9nZXRfc2FtcGxlX2ZtdChjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEFWX1NBTVBMRV9GTVRfTkI7IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAoc2FtcGxlX2ZtdF9pbmZvW2ldLm5hbWUsIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgcmV0dXJuIEFWX1NBTVBMRV9GTVRfTk9ORTsKK30KKworZW51bSBBVlNhbXBsZUZvcm1hdCBhdl9nZXRfYWx0X3NhbXBsZV9mbXQoZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LCBpbnQgcGxhbmFyKQoreworICAgIGlmIChzYW1wbGVfZm10IDwgMCB8fCBzYW1wbGVfZm10ID49IEFWX1NBTVBMRV9GTVRfTkIpCisgICAgICAgIHJldHVybiBBVl9TQU1QTEVfRk1UX05PTkU7CisgICAgaWYgKHNhbXBsZV9mbXRfaW5mb1tzYW1wbGVfZm10XS5wbGFuYXIgPT0gcGxhbmFyKQorICAgICAgICByZXR1cm4gc2FtcGxlX2ZtdDsKKyAgICByZXR1cm4gc2FtcGxlX2ZtdF9pbmZvW3NhbXBsZV9mbXRdLmFsdGZvcm07Cit9CisKK2VudW0gQVZTYW1wbGVGb3JtYXQgYXZfZ2V0X3BhY2tlZF9zYW1wbGVfZm10KGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCkKK3sKKyAgICBpZiAoc2FtcGxlX2ZtdCA8IDAgfHwgc2FtcGxlX2ZtdCA+PSBBVl9TQU1QTEVfRk1UX05CKQorICAgICAgICByZXR1cm4gQVZfU0FNUExFX0ZNVF9OT05FOworICAgIGlmIChzYW1wbGVfZm10X2luZm9bc2FtcGxlX2ZtdF0ucGxhbmFyKQorICAgICAgICByZXR1cm4gc2FtcGxlX2ZtdF9pbmZvW3NhbXBsZV9mbXRdLmFsdGZvcm07CisgICAgcmV0dXJuIHNhbXBsZV9mbXQ7Cit9CisKK2VudW0gQVZTYW1wbGVGb3JtYXQgYXZfZ2V0X3BsYW5hcl9zYW1wbGVfZm10KGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCkKK3sKKyAgICBpZiAoc2FtcGxlX2ZtdCA8IDAgfHwgc2FtcGxlX2ZtdCA+PSBBVl9TQU1QTEVfRk1UX05CKQorICAgICAgICByZXR1cm4gQVZfU0FNUExFX0ZNVF9OT05FOworICAgIGlmIChzYW1wbGVfZm10X2luZm9bc2FtcGxlX2ZtdF0ucGxhbmFyKQorICAgICAgICByZXR1cm4gc2FtcGxlX2ZtdDsKKyAgICByZXR1cm4gc2FtcGxlX2ZtdF9pbmZvW3NhbXBsZV9mbXRdLmFsdGZvcm07Cit9CisKK2NoYXIgKmF2X2dldF9zYW1wbGVfZm10X3N0cmluZyAoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCkKK3sKKyAgICAvKiBwcmludCBoZWFkZXIgKi8KKyAgICBpZiAoc2FtcGxlX2ZtdCA8IDApCisgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmX3NpemUsICJuYW1lICAiICIgZGVwdGgiKTsKKyAgICBlbHNlIGlmIChzYW1wbGVfZm10IDwgQVZfU0FNUExFX0ZNVF9OQikgeworICAgICAgICBTYW1wbGVGbXRJbmZvIGluZm8gPSBzYW1wbGVfZm10X2luZm9bc2FtcGxlX2ZtdF07CisgICAgICAgIHNucHJpbnRmIChidWYsIGJ1Zl9zaXplLCAiJS02cyIgIiAgICUyZCAiLCBpbmZvLm5hbWUsIGluZm8uYml0cyk7CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZjsKK30KKworaW50IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCkKK3sKKyAgICAgcmV0dXJuIHNhbXBsZV9mbXQgPCAwIHx8IHNhbXBsZV9mbXQgPj0gQVZfU0FNUExFX0ZNVF9OQiA/CisgICAgICAgIDAgOiBzYW1wbGVfZm10X2luZm9bc2FtcGxlX2ZtdF0uYml0cyA+PiAzOworfQorCitpbnQgYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10KQoreworICAgICBpZiAoc2FtcGxlX2ZtdCA8IDAgfHwgc2FtcGxlX2ZtdCA+PSBBVl9TQU1QTEVfRk1UX05CKQorICAgICAgICAgcmV0dXJuIDA7CisgICAgIHJldHVybiBzYW1wbGVfZm10X2luZm9bc2FtcGxlX2ZtdF0ucGxhbmFyOworfQorCitpbnQgYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoaW50ICpsaW5lc2l6ZSwgaW50IG5iX2NoYW5uZWxzLCBpbnQgbmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQsIGludCBhbGlnbikKK3sKKyAgICBpbnQgbGluZV9zaXplOworICAgIGludCBzYW1wbGVfc2l6ZSA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKHNhbXBsZV9mbXQpOworICAgIGludCBwbGFuYXIgICAgICA9IGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKHNhbXBsZV9mbXQpOworCisgICAgLyogdmFsaWRhdGUgcGFyYW1ldGVyIHJhbmdlcyAqLworICAgIGlmICghc2FtcGxlX3NpemUgfHwgbmJfc2FtcGxlcyA8PSAwIHx8IG5iX2NoYW5uZWxzIDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAvKiBhdXRvLXNlbGVjdCBhbGlnbm1lbnQgaWYgbm90IHNwZWNpZmllZCAqLworICAgIGlmICghYWxpZ24pIHsKKyAgICAgICAgaWYgKG5iX3NhbXBsZXMgPiBJTlRfTUFYIC0gMzEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBhbGlnbiA9IDE7CisgICAgICAgIG5iX3NhbXBsZXMgPSBGRkFMSUdOKG5iX3NhbXBsZXMsIDMyKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLworICAgIGlmIChuYl9jaGFubmVscyA+IElOVF9NQVggLyBhbGlnbiB8fAorICAgICAgICAoaW50NjRfdCluYl9jaGFubmVscyAqIG5iX3NhbXBsZXMgPiAoSU5UX01BWCAtIChhbGlnbiAqIG5iX2NoYW5uZWxzKSkgLyBzYW1wbGVfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGxpbmVfc2l6ZSA9IHBsYW5hciA/IEZGQUxJR04obmJfc2FtcGxlcyAqIHNhbXBsZV9zaXplLCAgICAgICAgICAgICAgIGFsaWduKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgRkZBTElHTihuYl9zYW1wbGVzICogc2FtcGxlX3NpemUgKiBuYl9jaGFubmVscywgYWxpZ24pOworICAgIGlmIChsaW5lc2l6ZSkKKyAgICAgICAgKmxpbmVzaXplID0gbGluZV9zaXplOworCisgICAgcmV0dXJuIHBsYW5hciA/IGxpbmVfc2l6ZSAqIG5iX2NoYW5uZWxzIDogbGluZV9zaXplOworfQorCitpbnQgYXZfc2FtcGxlc19maWxsX2FycmF5cyh1aW50OF90ICoqYXVkaW9fZGF0YSwgaW50ICpsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IG5iX2NoYW5uZWxzLCBpbnQgbmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwgaW50IGFsaWduKQoreworICAgIGludCBjaCwgcGxhbmFyLCBidWZfc2l6ZSwgbGluZV9zaXplOworCisgICAgcGxhbmFyICAgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihzYW1wbGVfZm10KTsKKyAgICBidWZfc2l6ZSA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKCZsaW5lX3NpemUsIG5iX2NoYW5uZWxzLCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2ZtdCwgYWxpZ24pOworICAgIGlmIChidWZfc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKworICAgIGF1ZGlvX2RhdGFbMF0gPSAodWludDhfdCAqKWJ1ZjsKKyAgICBmb3IgKGNoID0gMTsgcGxhbmFyICYmIGNoIDwgbmJfY2hhbm5lbHM7IGNoKyspCisgICAgICAgIGF1ZGlvX2RhdGFbY2hdID0gYXVkaW9fZGF0YVtjaC0xXSArIGxpbmVfc2l6ZTsKKworICAgIGlmIChsaW5lc2l6ZSkKKyAgICAgICAgKmxpbmVzaXplID0gbGluZV9zaXplOworCisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCitpbnQgYXZfc2FtcGxlc19hbGxvYyh1aW50OF90ICoqYXVkaW9fZGF0YSwgaW50ICpsaW5lc2l6ZSwgaW50IG5iX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwgaW50IGFsaWduKQoreworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICBpbnQgc2l6ZSA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKE5VTEwsIG5iX2NoYW5uZWxzLCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2ZtdCwgYWxpZ24pOworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIHNpemU7CisKKyAgICBidWYgPSBhdl9tYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFidWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzaXplID0gYXZfc2FtcGxlc19maWxsX2FycmF5cyhhdWRpb19kYXRhLCBsaW5lc2l6ZSwgYnVmLCBuYl9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzLCBzYW1wbGVfZm10LCBhbGlnbik7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIGF2X2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgYXZfc2FtcGxlc19zZXRfc2lsZW5jZShhdWRpb19kYXRhLCAwLCBuYl9zYW1wbGVzLCBuYl9jaGFubmVscywgc2FtcGxlX2ZtdCk7CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworaW50IGF2X3NhbXBsZXNfYWxsb2NfYXJyYXlfYW5kX3NhbXBsZXModWludDhfdCAqKiphdWRpb19kYXRhLCBpbnQgKmxpbmVzaXplLCBpbnQgbmJfY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LCBpbnQgYWxpZ24pCit7CisgICAgaW50IHJldCwgbmJfcGxhbmVzID0gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoc2FtcGxlX2ZtdCkgPyBuYl9jaGFubmVscyA6IDE7CisKKyAgICAqYXVkaW9fZGF0YSA9IGF2X2NhbGxvYyhuYl9wbGFuZXMsIHNpemVvZigqKmF1ZGlvX2RhdGEpKTsKKyAgICBpZiAoISphdWRpb19kYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldCA9IGF2X3NhbXBsZXNfYWxsb2MoKmF1ZGlvX2RhdGEsIGxpbmVzaXplLCBuYl9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX3NhbXBsZXMsIHNhbXBsZV9mbXQsIGFsaWduKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgYXZfZnJlZXAoYXVkaW9fZGF0YSk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2X3NhbXBsZXNfY29weSh1aW50OF90ICoqZHN0LCB1aW50OF90ICogY29uc3QgKnNyYywgaW50IGRzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGludCBzcmNfb2Zmc2V0LCBpbnQgbmJfc2FtcGxlcywgaW50IG5iX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQpCit7CisgICAgaW50IHBsYW5hciAgICAgID0gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoc2FtcGxlX2ZtdCk7CisgICAgaW50IHBsYW5lcyAgICAgID0gcGxhbmFyID8gbmJfY2hhbm5lbHMgOiAxOworICAgIGludCBibG9ja19hbGlnbiA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKHNhbXBsZV9mbXQpICogKHBsYW5hciA/IDEgOiBuYl9jaGFubmVscyk7CisgICAgaW50IGRhdGFfc2l6ZSAgID0gbmJfc2FtcGxlcyAqIGJsb2NrX2FsaWduOworICAgIGludCBpOworCisgICAgZHN0X29mZnNldCAqPSBibG9ja19hbGlnbjsKKyAgICBzcmNfb2Zmc2V0ICo9IGJsb2NrX2FsaWduOworCisgICAgaWYoKGRzdFswXSA8IHNyY1swXSA/IHNyY1swXSAtIGRzdFswXSA6IGRzdFswXSAtIHNyY1swXSkgPj0gZGF0YV9zaXplKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwbGFuZXM7IGkrKykKKyAgICAgICAgICAgIG1lbWNweShkc3RbaV0gKyBkc3Rfb2Zmc2V0LCBzcmNbaV0gKyBzcmNfb2Zmc2V0LCBkYXRhX3NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwbGFuZXM7IGkrKykKKyAgICAgICAgICAgIG1lbW1vdmUoZHN0W2ldICsgZHN0X29mZnNldCwgc3JjW2ldICsgc3JjX29mZnNldCwgZGF0YV9zaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X3NhbXBsZXNfc2V0X3NpbGVuY2UodWludDhfdCAqKmF1ZGlvX2RhdGEsIGludCBvZmZzZXQsIGludCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX2NoYW5uZWxzLCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQpCit7CisgICAgaW50IHBsYW5hciAgICAgID0gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoc2FtcGxlX2ZtdCk7CisgICAgaW50IHBsYW5lcyAgICAgID0gcGxhbmFyID8gbmJfY2hhbm5lbHMgOiAxOworICAgIGludCBibG9ja19hbGlnbiA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKHNhbXBsZV9mbXQpICogKHBsYW5hciA/IDEgOiBuYl9jaGFubmVscyk7CisgICAgaW50IGRhdGFfc2l6ZSAgID0gbmJfc2FtcGxlcyAqIGJsb2NrX2FsaWduOworICAgIGludCBmaWxsX2NoYXIgICA9IChzYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfVTggfHwKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9VOFApID8gMHg4MCA6IDB4MDA7CisgICAgaW50IGk7CisKKyAgICBvZmZzZXQgKj0gYmxvY2tfYWxpZ247CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspCisgICAgICAgIG1lbXNldChhdWRpb19kYXRhW2ldICsgb2Zmc2V0LCBmaWxsX2NoYXIsIGRhdGFfc2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvc2FtcGxlZm10LmggYi9mZm1wZWcvbGliYXZ1dGlsL3NhbXBsZWZtdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOGEwMzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3NhbXBsZWZtdC5oCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX1NBTVBMRUZNVF9ICisjZGVmaW5lIEFWVVRJTF9TQU1QTEVGTVRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdnV0aWwuaCIKKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisKKy8qKgorICogQGFkZHRvZ3JvdXAgbGF2dV9hdWRpbworICogQHsKKyAqCisgKiBAZGVmZ3JvdXAgbGF2dV9zYW1wZm10cyBBdWRpbyBzYW1wbGUgZm9ybWF0cworICoKKyAqIEF1ZGlvIHNhbXBsZSBmb3JtYXQgZW51bWVyYXRpb24gYW5kIHJlbGF0ZWQgY29udmVuaWVuY2UgZnVuY3Rpb25zLgorICogQHsKKyAqCisgKi8KKworLyoqCisgKiBBdWRpbyBzYW1wbGUgZm9ybWF0cworICoKKyAqIC0gVGhlIGRhdGEgZGVzY3JpYmVkIGJ5IHRoZSBzYW1wbGUgZm9ybWF0IGlzIGFsd2F5cyBpbiBuYXRpdmUtZW5kaWFuIG9yZGVyLgorICogICBTYW1wbGUgdmFsdWVzIGNhbiBiZSBleHByZXNzZWQgYnkgbmF0aXZlIEMgdHlwZXMsIGhlbmNlIHRoZSBsYWNrIG9mIGEgc2lnbmVkCisgKiAgIDI0LWJpdCBzYW1wbGUgZm9ybWF0IGV2ZW4gdGhvdWdoIGl0IGlzIGEgY29tbW9uIHJhdyBhdWRpbyBkYXRhIGZvcm1hdC4KKyAqCisgKiAtIFRoZSBmbG9hdGluZy1wb2ludCBmb3JtYXRzIGFyZSBiYXNlZCBvbiBmdWxsIHZvbHVtZSBiZWluZyBpbiB0aGUgcmFuZ2UKKyAqICAgWy0xLjAsIDEuMF0uIEFueSB2YWx1ZXMgb3V0c2lkZSB0aGlzIHJhbmdlIGFyZSBiZXlvbmQgZnVsbCB2b2x1bWUgbGV2ZWwuCisgKgorICogLSBUaGUgZGF0YSBsYXlvdXQgYXMgdXNlZCBpbiBhdl9zYW1wbGVzX2ZpbGxfYXJyYXlzKCkgYW5kIGVsc2V3aGVyZSBpbiBGRm1wZWcKKyAqICAgKHN1Y2ggYXMgQVZGcmFtZSBpbiBsaWJhdmNvZGVjKSBpcyBhcyBmb2xsb3dzOgorICoKKyAqIEBwYXIKKyAqIEZvciBwbGFuYXIgc2FtcGxlIGZvcm1hdHMsIGVhY2ggYXVkaW8gY2hhbm5lbCBpcyBpbiBhIHNlcGFyYXRlIGRhdGEgcGxhbmUsCisgKiBhbmQgbGluZXNpemUgaXMgdGhlIGJ1ZmZlciBzaXplLCBpbiBieXRlcywgZm9yIGEgc2luZ2xlIHBsYW5lLiBBbGwgZGF0YQorICogcGxhbmVzIG11c3QgYmUgdGhlIHNhbWUgc2l6ZS4gRm9yIHBhY2tlZCBzYW1wbGUgZm9ybWF0cywgb25seSB0aGUgZmlyc3QgZGF0YQorICogcGxhbmUgaXMgdXNlZCwgYW5kIHNhbXBsZXMgZm9yIGVhY2ggY2hhbm5lbCBhcmUgaW50ZXJsZWF2ZWQuIEluIHRoaXMgY2FzZSwKKyAqIGxpbmVzaXplIGlzIHRoZSBidWZmZXIgc2l6ZSwgaW4gYnl0ZXMsIGZvciB0aGUgMSBwbGFuZS4KKyAqCisgKi8KK2VudW0gQVZTYW1wbGVGb3JtYXQgeworICAgIEFWX1NBTVBMRV9GTVRfTk9ORSA9IC0xLAorICAgIEFWX1NBTVBMRV9GTVRfVTgsICAgICAgICAgIC8vLzwgdW5zaWduZWQgOCBiaXRzCisgICAgQVZfU0FNUExFX0ZNVF9TMTYsICAgICAgICAgLy8vPCBzaWduZWQgMTYgYml0cworICAgIEFWX1NBTVBMRV9GTVRfUzMyLCAgICAgICAgIC8vLzwgc2lnbmVkIDMyIGJpdHMKKyAgICBBVl9TQU1QTEVfRk1UX0ZMVCwgICAgICAgICAvLy88IGZsb2F0CisgICAgQVZfU0FNUExFX0ZNVF9EQkwsICAgICAgICAgLy8vPCBkb3VibGUKKworICAgIEFWX1NBTVBMRV9GTVRfVThQLCAgICAgICAgIC8vLzwgdW5zaWduZWQgOCBiaXRzLCBwbGFuYXIKKyAgICBBVl9TQU1QTEVfRk1UX1MxNlAsICAgICAgICAvLy88IHNpZ25lZCAxNiBiaXRzLCBwbGFuYXIKKyAgICBBVl9TQU1QTEVfRk1UX1MzMlAsICAgICAgICAvLy88IHNpZ25lZCAzMiBiaXRzLCBwbGFuYXIKKyAgICBBVl9TQU1QTEVfRk1UX0ZMVFAsICAgICAgICAvLy88IGZsb2F0LCBwbGFuYXIKKyAgICBBVl9TQU1QTEVfRk1UX0RCTFAsICAgICAgICAvLy88IGRvdWJsZSwgcGxhbmFyCisKKyAgICBBVl9TQU1QTEVfRk1UX05CICAgICAgICAgICAvLy88IE51bWJlciBvZiBzYW1wbGUgZm9ybWF0cy4gRE8gTk9UIFVTRSBpZiBsaW5raW5nIGR5bmFtaWNhbGx5Cit9OworCisvKioKKyAqIFJldHVybiB0aGUgbmFtZSBvZiBzYW1wbGVfZm10LCBvciBOVUxMIGlmIHNhbXBsZV9mbXQgaXMgbm90CisgKiByZWNvZ25pemVkLgorICovCitjb25zdCBjaGFyICphdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCk7CisKKy8qKgorICogUmV0dXJuIGEgc2FtcGxlIGZvcm1hdCBjb3JyZXNwb25kaW5nIHRvIG5hbWUsIG9yIEFWX1NBTVBMRV9GTVRfTk9ORQorICogb24gZXJyb3IuCisgKi8KK2VudW0gQVZTYW1wbGVGb3JtYXQgYXZfZ2V0X3NhbXBsZV9mbXQoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogUmV0dXJuIHRoZSBwbGFuYXI8LT5wYWNrZWQgYWx0ZXJuYXRpdmUgZm9ybSBvZiB0aGUgZ2l2ZW4gc2FtcGxlIGZvcm1hdCwgb3IKKyAqIEFWX1NBTVBMRV9GTVRfTk9ORSBvbiBlcnJvci4gSWYgdGhlIHBhc3NlZCBzYW1wbGVfZm10IGlzIGFscmVhZHkgaW4gdGhlCisgKiByZXF1ZXN0ZWQgcGxhbmFyL3BhY2tlZCBmb3JtYXQsIHRoZSBmb3JtYXQgcmV0dXJuZWQgaXMgdGhlIHNhbWUgYXMgdGhlCisgKiBpbnB1dC4KKyAqLworZW51bSBBVlNhbXBsZUZvcm1hdCBhdl9nZXRfYWx0X3NhbXBsZV9mbXQoZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LCBpbnQgcGxhbmFyKTsKKworLyoqCisgKiBHZXQgdGhlIHBhY2tlZCBhbHRlcm5hdGl2ZSBmb3JtIG9mIHRoZSBnaXZlbiBzYW1wbGUgZm9ybWF0LgorICoKKyAqIElmIHRoZSBwYXNzZWQgc2FtcGxlX2ZtdCBpcyBhbHJlYWR5IGluIHBhY2tlZCBmb3JtYXQsIHRoZSBmb3JtYXQgcmV0dXJuZWQgaXMKKyAqIHRoZSBzYW1lIGFzIHRoZSBpbnB1dC4KKyAqCisgKiBAcmV0dXJuICB0aGUgcGFja2VkIGFsdGVybmF0aXZlIGZvcm0gb2YgdGhlIGdpdmVuIHNhbXBsZSBmb3JtYXQgb3IKKyAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSBvbiBlcnJvci4KKyAqLworZW51bSBBVlNhbXBsZUZvcm1hdCBhdl9nZXRfcGFja2VkX3NhbXBsZV9mbXQoZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10KTsKKworLyoqCisgKiBHZXQgdGhlIHBsYW5hciBhbHRlcm5hdGl2ZSBmb3JtIG9mIHRoZSBnaXZlbiBzYW1wbGUgZm9ybWF0LgorICoKKyAqIElmIHRoZSBwYXNzZWQgc2FtcGxlX2ZtdCBpcyBhbHJlYWR5IGluIHBsYW5hciBmb3JtYXQsIHRoZSBmb3JtYXQgcmV0dXJuZWQgaXMKKyAqIHRoZSBzYW1lIGFzIHRoZSBpbnB1dC4KKyAqCisgKiBAcmV0dXJuICB0aGUgcGxhbmFyIGFsdGVybmF0aXZlIGZvcm0gb2YgdGhlIGdpdmVuIHNhbXBsZSBmb3JtYXQgb3IKKyAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSBvbiBlcnJvci4KKyAqLworZW51bSBBVlNhbXBsZUZvcm1hdCBhdl9nZXRfcGxhbmFyX3NhbXBsZV9mbXQoZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10KTsKKworLyoqCisgKiBHZW5lcmF0ZSBhIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzYW1wbGUgZm9ybWF0IHdpdGgKKyAqIHNhbXBsZV9mbXQsIG9yIGEgaGVhZGVyIGlmIHNhbXBsZV9mbXQgaXMgbmVnYXRpdmUuCisgKgorICogQHBhcmFtIGJ1ZiB0aGUgYnVmZmVyIHdoZXJlIHRvIHdyaXRlIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBidWZfc2l6ZSB0aGUgc2l6ZSBvZiBidWYKKyAqIEBwYXJhbSBzYW1wbGVfZm10IHRoZSBudW1iZXIgb2YgdGhlIHNhbXBsZSBmb3JtYXQgdG8gcHJpbnQgdGhlCisgKiBjb3JyZXNwb25kaW5nIGluZm8gc3RyaW5nLCBvciBhIG5lZ2F0aXZlIHZhbHVlIHRvIHByaW50IHRoZQorICogY29ycmVzcG9uZGluZyBoZWFkZXIuCisgKiBAcmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBmaWxsZWQgYnVmZmVyIG9yIE5VTEwgaWYgc2FtcGxlX2ZtdCBpcworICogdW5rbm93biBvciBpbiBjYXNlIG9mIG90aGVyIGVycm9ycworICovCitjaGFyICphdl9nZXRfc2FtcGxlX2ZtdF9zdHJpbmcoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCk7CisKKy8qKgorICogUmV0dXJuIG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlLgorICoKKyAqIEBwYXJhbSBzYW1wbGVfZm10IHRoZSBzYW1wbGUgZm9ybWF0CisgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlIG9yIHplcm8gaWYgdW5rbm93biBmb3IgdGhlIGdpdmVuCisgKiBzYW1wbGUgZm9ybWF0CisgKi8KK2ludCBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQpOworCisvKioKKyAqIENoZWNrIGlmIHRoZSBzYW1wbGUgZm9ybWF0IGlzIHBsYW5hci4KKyAqCisgKiBAcGFyYW0gc2FtcGxlX2ZtdCB0aGUgc2FtcGxlIGZvcm1hdCB0byBpbnNwZWN0CisgKiBAcmV0dXJuIDEgaWYgdGhlIHNhbXBsZSBmb3JtYXQgaXMgcGxhbmFyLCAwIGlmIGl0IGlzIGludGVybGVhdmVkCisgKi8KK2ludCBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQpOworCisvKioKKyAqIEdldCB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUgZm9yIHRoZSBnaXZlbiBhdWRpbyBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbVtvdXRdIGxpbmVzaXplIGNhbGN1bGF0ZWQgbGluZXNpemUsIG1heSBiZSBOVUxMCisgKiBAcGFyYW0gbmJfY2hhbm5lbHMgICB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgKiBAcGFyYW0gbmJfc2FtcGxlcyAgICB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaW4gYSBzaW5nbGUgY2hhbm5lbAorICogQHBhcmFtIHNhbXBsZV9mbXQgICAgdGhlIHNhbXBsZSBmb3JtYXQKKyAqIEBwYXJhbSBhbGlnbiAgICAgICAgIGJ1ZmZlciBzaXplIGFsaWdubWVudCAoMCA9IGRlZmF1bHQsIDEgPSBubyBhbGlnbm1lbnQpCisgKiBAcmV0dXJuICAgICAgICAgICAgICByZXF1aXJlZCBidWZmZXIgc2l6ZSwgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZShpbnQgKmxpbmVzaXplLCBpbnQgbmJfY2hhbm5lbHMsIGludCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwgaW50IGFsaWduKTsKKworLyoqCisgKiBAfQorICoKKyAqIEBkZWZncm91cCBsYXZ1X3NhbXBtYW5pcCBTYW1wbGVzIG1hbmlwdWxhdGlvbgorICoKKyAqIEZ1bmN0aW9ucyB0aGF0IG1hbmlwdWxhdGUgYXVkaW8gc2FtcGxlcworICogQHsKKyAqLworCisvKioKKyAqIEZpbGwgcGxhbmUgZGF0YSBwb2ludGVycyBhbmQgbGluZXNpemUgZm9yIHNhbXBsZXMgd2l0aCBzYW1wbGUKKyAqIGZvcm1hdCBzYW1wbGVfZm10LgorICoKKyAqIFRoZSBhdWRpb19kYXRhIGFycmF5IGlzIGZpbGxlZCB3aXRoIHRoZSBwb2ludGVycyB0byB0aGUgc2FtcGxlcyBkYXRhIHBsYW5lczoKKyAqIGZvciBwbGFuYXIsIHNldCB0aGUgc3RhcnQgcG9pbnQgb2YgZWFjaCBjaGFubmVsJ3MgZGF0YSB3aXRoaW4gdGhlIGJ1ZmZlciwKKyAqIGZvciBwYWNrZWQsIHNldCB0aGUgc3RhcnQgcG9pbnQgb2YgdGhlIGVudGlyZSBidWZmZXIgb25seS4KKyAqCisgKiBUaGUgdmFsdWUgcG9pbnRlZCB0byBieSBsaW5lc2l6ZSBpcyBzZXQgdG8gdGhlIGFsaWduZWQgc2l6ZSBvZiBlYWNoCisgKiBjaGFubmVsJ3MgZGF0YSBidWZmZXIgZm9yIHBsYW5hciBsYXlvdXQsIG9yIHRvIHRoZSBhbGlnbmVkIHNpemUgb2YgdGhlCisgKiBidWZmZXIgZm9yIGFsbCBjaGFubmVscyBmb3IgcGFja2VkIGxheW91dC4KKyAqCisgKiBUaGUgYnVmZmVyIGluIGJ1ZiBtdXN0IGJlIGJpZyBlbm91Z2ggdG8gY29udGFpbiBhbGwgdGhlIHNhbXBsZXMKKyAqICh1c2UgYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoKSB0byBjb21wdXRlIGl0cyBtaW5pbXVtIHNpemUpLAorICogb3RoZXJ3aXNlIHRoZSBhdWRpb19kYXRhIHBvaW50ZXJzIHdpbGwgcG9pbnQgdG8gaW52YWxpZCBkYXRhLgorICoKKyAqIEBzZWUgZW51bSBBVlNhbXBsZUZvcm1hdAorICogVGhlIGRvY3VtZW50YXRpb24gZm9yIEFWU2FtcGxlRm9ybWF0IGRlc2NyaWJlcyB0aGUgZGF0YSBsYXlvdXQuCisgKgorICogQHBhcmFtW291dF0gYXVkaW9fZGF0YSAgYXJyYXkgdG8gYmUgZmlsbGVkIHdpdGggdGhlIHBvaW50ZXIgZm9yIGVhY2ggY2hhbm5lbAorICogQHBhcmFtW291dF0gbGluZXNpemUgICAgY2FsY3VsYXRlZCBsaW5lc2l6ZSwgbWF5IGJlIE5VTEwKKyAqIEBwYXJhbSBidWYgICAgICAgICAgICAgIHRoZSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNhbXBsZXMKKyAqIEBwYXJhbSBuYl9jaGFubmVscyAgICAgIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBwYXJhbSBuYl9zYW1wbGVzICAgICAgIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiBhIHNpbmdsZSBjaGFubmVsCisgKiBAcGFyYW0gc2FtcGxlX2ZtdCAgICAgICB0aGUgc2FtcGxlIGZvcm1hdAorICogQHBhcmFtIGFsaWduICAgICAgICAgICAgYnVmZmVyIHNpemUgYWxpZ25tZW50ICgwID0gZGVmYXVsdCwgMSA9IG5vIGFsaWdubWVudCkKKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgID49MCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKiBAdG9kbyByZXR1cm4gbWluaW11bSBzaXplIGluIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyIGluIGNhc2UKKyAqIG9mIHN1Y2Nlc3MgYXQgdGhlIG5leHQgYnVtcAorICovCitpbnQgYXZfc2FtcGxlc19maWxsX2FycmF5cyh1aW50OF90ICoqYXVkaW9fZGF0YSwgaW50ICpsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9jaGFubmVscywgaW50IG5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQsIGludCBhbGlnbik7CisKKy8qKgorICogQWxsb2NhdGUgYSBzYW1wbGVzIGJ1ZmZlciBmb3IgbmJfc2FtcGxlcyBzYW1wbGVzLCBhbmQgZmlsbCBkYXRhIHBvaW50ZXJzIGFuZAorICogbGluZXNpemUgYWNjb3JkaW5nbHkuCisgKiBUaGUgYWxsb2NhdGVkIHNhbXBsZXMgYnVmZmVyIGNhbiBiZSBmcmVlZCBieSB1c2luZyBhdl9mcmVlcCgmYXVkaW9fZGF0YVswXSkKKyAqIEFsbG9jYXRlZCBkYXRhIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gc2lsZW5jZS4KKyAqCisgKiBAc2VlIGVudW0gQVZTYW1wbGVGb3JtYXQKKyAqIFRoZSBkb2N1bWVudGF0aW9uIGZvciBBVlNhbXBsZUZvcm1hdCBkZXNjcmliZXMgdGhlIGRhdGEgbGF5b3V0LgorICoKKyAqIEBwYXJhbVtvdXRdIGF1ZGlvX2RhdGEgIGFycmF5IHRvIGJlIGZpbGxlZCB3aXRoIHRoZSBwb2ludGVyIGZvciBlYWNoIGNoYW5uZWwKKyAqIEBwYXJhbVtvdXRdIGxpbmVzaXplICAgIGFsaWduZWQgc2l6ZSBmb3IgYXVkaW8gYnVmZmVyKHMpLCBtYXkgYmUgTlVMTAorICogQHBhcmFtIG5iX2NoYW5uZWxzICAgICAgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzCisgKiBAcGFyYW0gbmJfc2FtcGxlcyAgICAgICBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbAorICogQHBhcmFtIGFsaWduICAgICAgICAgICAgYnVmZmVyIHNpemUgYWxpZ25tZW50ICgwID0gZGVmYXVsdCwgMSA9IG5vIGFsaWdubWVudCkKKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgID49MCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKiBAdG9kbyByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIgaW4gY2FzZSBvZiBzdWNjZXNzIGF0IHRoZSBuZXh0IGJ1bXAKKyAqIEBzZWUgYXZfc2FtcGxlc19maWxsX2FycmF5cygpCisgKiBAc2VlIGF2X3NhbXBsZXNfYWxsb2NfYXJyYXlfYW5kX3NhbXBsZXMoKQorICovCitpbnQgYXZfc2FtcGxlc19hbGxvYyh1aW50OF90ICoqYXVkaW9fZGF0YSwgaW50ICpsaW5lc2l6ZSwgaW50IG5iX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwgaW50IGFsaWduKTsKKworLyoqCisgKiBBbGxvY2F0ZSBhIGRhdGEgcG9pbnRlcnMgYXJyYXksIHNhbXBsZXMgYnVmZmVyIGZvciBuYl9zYW1wbGVzCisgKiBzYW1wbGVzLCBhbmQgZmlsbCBkYXRhIHBvaW50ZXJzIGFuZCBsaW5lc2l6ZSBhY2NvcmRpbmdseS4KKyAqCisgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGF2X3NhbXBsZXNfYWxsb2MoKSwgYnV0IGFsc28gYWxsb2NhdGVzIHRoZSBkYXRhCisgKiBwb2ludGVycyBhcnJheS4KKyAqCisgKiBAc2VlIGF2X3NhbXBsZXNfYWxsb2MoKQorICovCitpbnQgYXZfc2FtcGxlc19hbGxvY19hcnJheV9hbmRfc2FtcGxlcyh1aW50OF90ICoqKmF1ZGlvX2RhdGEsIGludCAqbGluZXNpemUsIGludCBuYl9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQsIGludCBhbGlnbik7CisKKy8qKgorICogQ29weSBzYW1wbGVzIGZyb20gc3JjIHRvIGRzdC4KKyAqCisgKiBAcGFyYW0gZHN0IGRlc3RpbmF0aW9uIGFycmF5IG9mIHBvaW50ZXJzIHRvIGRhdGEgcGxhbmVzCisgKiBAcGFyYW0gc3JjIHNvdXJjZSBhcnJheSBvZiBwb2ludGVycyB0byBkYXRhIHBsYW5lcworICogQHBhcmFtIGRzdF9vZmZzZXQgb2Zmc2V0IGluIHNhbXBsZXMgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvIGRzdAorICogQHBhcmFtIHNyY19vZmZzZXQgb2Zmc2V0IGluIHNhbXBsZXMgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkIGZyb20gc3JjCisgKiBAcGFyYW0gbmJfc2FtcGxlcyBudW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBjb3BpZWQKKyAqIEBwYXJhbSBuYl9jaGFubmVscyBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMKKyAqIEBwYXJhbSBzYW1wbGVfZm10IGF1ZGlvIHNhbXBsZSBmb3JtYXQKKyAqLworaW50IGF2X3NhbXBsZXNfY29weSh1aW50OF90ICoqZHN0LCB1aW50OF90ICogY29uc3QgKnNyYywgaW50IGRzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGludCBzcmNfb2Zmc2V0LCBpbnQgbmJfc2FtcGxlcywgaW50IG5iX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQpOworCisvKioKKyAqIEZpbGwgYW4gYXVkaW8gYnVmZmVyIHdpdGggc2lsZW5jZS4KKyAqCisgKiBAcGFyYW0gYXVkaW9fZGF0YSAgYXJyYXkgb2YgcG9pbnRlcnMgdG8gZGF0YSBwbGFuZXMKKyAqIEBwYXJhbSBvZmZzZXQgICAgICBvZmZzZXQgaW4gc2FtcGxlcyBhdCB3aGljaCB0byBzdGFydCBmaWxsaW5nCisgKiBAcGFyYW0gbmJfc2FtcGxlcyAgbnVtYmVyIG9mIHNhbXBsZXMgdG8gZmlsbAorICogQHBhcmFtIG5iX2NoYW5uZWxzIG51bWJlciBvZiBhdWRpbyBjaGFubmVscworICogQHBhcmFtIHNhbXBsZV9mbXQgIGF1ZGlvIHNhbXBsZSBmb3JtYXQKKyAqLworaW50IGF2X3NhbXBsZXNfc2V0X3NpbGVuY2UodWludDhfdCAqKmF1ZGlvX2RhdGEsIGludCBvZmZzZXQsIGludCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX2NoYW5uZWxzLCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQpOworCisvKioKKyAqIEB9CisgKiBAfQorICovCisjZW5kaWYgLyogQVZVVElMX1NBTVBMRUZNVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3NoNC9ic3dhcC5oIGIvZmZtcGVnL2xpYmF2dXRpbC9zaDQvYnN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGRkMjdmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9zaDQvYnN3YXAuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGJ5dGUgc3dhcHBpbmcgcm91dGluZXMKKyAqLworCisjaWZuZGVmIEFWVVRJTF9TSDRfQlNXQVBfSAorI2RlZmluZSBBVlVUSUxfU0g0X0JTV0FQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisKKyNkZWZpbmUgYXZfYnN3YXAxNiBhdl9ic3dhcDE2CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCB1aW50MTZfdCBhdl9ic3dhcDE2KHVpbnQxNl90IHgpCit7CisgICAgX19hc21fXygic3dhcC5iICUwLCUwIiA6ICIrciIoeCkpOworICAgIHJldHVybiB4OworfQorCisjZGVmaW5lIGF2X2Jzd2FwMzIgYXZfYnN3YXAzMgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgdWludDMyX3QgYXZfYnN3YXAzMih1aW50MzJfdCB4KQoreworICAgIF9fYXNtX18oInN3YXAuYiAlMCwlMFxuIgorICAgICAgICAgICAgInN3YXAudyAlMCwlMFxuIgorICAgICAgICAgICAgInN3YXAuYiAlMCwlMFxuIgorICAgICAgICAgICAgOiAiK3IiKHgpKTsKKyAgICByZXR1cm4geDsKK30KKworI2VuZGlmIC8qIEFWVVRJTF9TSDRfQlNXQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9zaGEuYyBiL2ZmbXBlZy9saWJhdnV0aWwvc2hhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmOTQyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvc2hhLmMKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBLb25zdGFudGluIFNoaXNoa292CisgKiBiYXNlZCBvbiBwdWJsaWMgZG9tYWluIFNIQS0xIGNvZGUgYnkgU3RldmUgUmVpZCA8c3RldmVAZWRtd2ViLmNvbT4KKyAqIGFuZCBvbiBCU0QtbGljZW5zZWQgU0hBLTIgY29kZSBieSBBYXJvbiBELiBHaWZmb3JkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJhdnV0aWwuaCIKKyNpbmNsdWRlICJic3dhcC5oIgorI2luY2x1ZGUgInNoYS5oIgorI2luY2x1ZGUgImludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgIm1lbS5oIgorCisvKiogaGFzaCBjb250ZXh0ICovCit0eXBlZGVmIHN0cnVjdCBBVlNIQSB7CisgICAgdWludDhfdCAgZGlnZXN0X2xlbjsgIC8vLzwgZGlnZXN0IGxlbmd0aCBpbiAzMi1iaXQgd29yZHMKKyAgICB1aW50NjRfdCBjb3VudDsgICAgICAgLy8vPCBudW1iZXIgb2YgYnl0ZXMgaW4gYnVmZmVyCisgICAgdWludDhfdCAgYnVmZmVyWzY0XTsgIC8vLzwgNTEyLWJpdCBidWZmZXIgb2YgaW5wdXQgdmFsdWVzIHVzZWQgaW4gaGFzaCB1cGRhdGluZworICAgIHVpbnQzMl90IHN0YXRlWzhdOyAgICAvLy88IGN1cnJlbnQgaGFzaCB2YWx1ZQorICAgIC8qKiBmdW5jdGlvbiB1c2VkIHRvIHVwZGF0ZSBoYXNoIGZvciA1MTItYml0IGlucHV0IGJsb2NrICovCisgICAgdm9pZCAgICAgKCp0cmFuc2Zvcm0pKHVpbnQzMl90ICpzdGF0ZSwgY29uc3QgdWludDhfdCBidWZmZXJbNjRdKTsKK30gQVZTSEE7CisKK2NvbnN0IGludCBhdl9zaGFfc2l6ZSA9IHNpemVvZihBVlNIQSk7CisKK3N0cnVjdCBBVlNIQSAqYXZfc2hhX2FsbG9jKHZvaWQpCit7CisgICAgcmV0dXJuIGF2X21hbGxvY3ooc2l6ZW9mKHN0cnVjdCBBVlNIQSkpOworfQorCisjZGVmaW5lIHJvbCh2YWx1ZSwgYml0cykgKCgodmFsdWUpIDw8IChiaXRzKSkgfCAoKHZhbHVlKSA+PiAoMzIgLSAoYml0cykpKSkKKworLyogKFIwK1IxKSwgUjIsIFIzLCBSNCBhcmUgdGhlIGRpZmZlcmVudCBvcGVyYXRpb25zIHVzZWQgaW4gU0hBMSAqLworI2RlZmluZSBibGswKGkpIChibG9ja1tpXSA9IEFWX1JCMzIoYnVmZmVyICsgNCAqIChpKSkpCisjZGVmaW5lIGJsayhpKSAgKGJsb2NrW2ldID0gcm9sKGJsb2NrW2ktM10gXiBibG9ja1tpLThdIF4gYmxvY2tbaS0xNF0gXiBibG9ja1tpLTE2XSwgMSkpCisKKyNkZWZpbmUgUjAodix3LHgseSx6LGkpIHogKz0gKCh3Jih4XnkpKV55KSAgICAgKyBibGswKGkpICsgMHg1QTgyNzk5OSArIHJvbCh2LCA1KTsgdyA9IHJvbCh3LCAzMCk7CisjZGVmaW5lIFIxKHYsdyx4LHkseixpKSB6ICs9ICgodyYoeF55KSleeSkgICAgICsgYmxrIChpKSArIDB4NUE4Mjc5OTkgKyByb2wodiwgNSk7IHcgPSByb2wodywgMzApOworI2RlZmluZSBSMih2LHcseCx5LHosaSkgeiArPSAoIHdeeCAgICAgXnkpICAgICArIGJsayAoaSkgKyAweDZFRDlFQkExICsgcm9sKHYsIDUpOyB3ID0gcm9sKHcsIDMwKTsKKyNkZWZpbmUgUjModix3LHgseSx6LGkpIHogKz0gKCgod3x4KSZ5KXwodyZ4KSkgKyBibGsgKGkpICsgMHg4RjFCQkNEQyArIHJvbCh2LCA1KTsgdyA9IHJvbCh3LCAzMCk7CisjZGVmaW5lIFI0KHYsdyx4LHkseixpKSB6ICs9ICggd154ICAgICBeeSkgICAgICsgYmxrIChpKSArIDB4Q0E2MkMxRDYgKyByb2wodiwgNSk7IHcgPSByb2wodywgMzApOworCisvKiBIYXNoIGEgc2luZ2xlIDUxMi1iaXQgYmxvY2suIFRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIGFsZ29yaXRobS4gKi8KKworc3RhdGljIHZvaWQgc2hhMV90cmFuc2Zvcm0odWludDMyX3Qgc3RhdGVbNV0sIGNvbnN0IHVpbnQ4X3QgYnVmZmVyWzY0XSkKK3sKKyAgICB1aW50MzJfdCBibG9ja1s4MF07CisgICAgdW5zaWduZWQgaW50IGksIGEsIGIsIGMsIGQsIGU7CisKKyAgICBhID0gc3RhdGVbMF07CisgICAgYiA9IHN0YXRlWzFdOworICAgIGMgPSBzdGF0ZVsyXTsKKyAgICBkID0gc3RhdGVbM107CisgICAgZSA9IHN0YXRlWzRdOworI2lmIENPTkZJR19TTUFMTAorICAgIGZvciAoaSA9IDA7IGkgPCA4MDsgaSsrKSB7CisgICAgICAgIGludCB0OworICAgICAgICBpZiAoaSA8IDE2KQorICAgICAgICAgICAgdCA9IEFWX1JCMzIoYnVmZmVyICsgNCAqIGkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ID0gcm9sKGJsb2NrW2ktM10gXiBibG9ja1tpLThdIF4gYmxvY2tbaS0xNF0gXiBibG9ja1tpLTE2XSwgMSk7CisgICAgICAgIGJsb2NrW2ldID0gdDsKKyAgICAgICAgdCArPSBlICsgcm9sKGEsIDUpOworICAgICAgICBpZiAoaSA8IDQwKSB7CisgICAgICAgICAgICBpZiAoaSA8IDIwKQorICAgICAgICAgICAgICAgIHQgKz0gKChiJihjXmQpKV5kKSAgICAgKyAweDVBODI3OTk5OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHQgKz0gKCBiXmMgICAgIF5kKSAgICAgKyAweDZFRDlFQkExOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGkgPCA2MCkKKyAgICAgICAgICAgICAgICB0ICs9ICgoKGJ8YykmZCl8KGImYykpICsgMHg4RjFCQkNEQzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0ICs9ICggYl5jICAgICBeZCkgICAgICsgMHhDQTYyQzFENjsKKyAgICAgICAgfQorICAgICAgICBlID0gZDsKKyAgICAgICAgZCA9IGM7CisgICAgICAgIGMgPSByb2woYiwgMzApOworICAgICAgICBiID0gYTsKKyAgICAgICAgYSA9IHQ7CisgICAgfQorI2Vsc2UKKworI2RlZmluZSBSMV8wIFwKKyAgICBSMChhLCBiLCBjLCBkLCBlLCAwICsgaSk7IFwKKyAgICBSMChlLCBhLCBiLCBjLCBkLCAxICsgaSk7IFwKKyAgICBSMChkLCBlLCBhLCBiLCBjLCAyICsgaSk7IFwKKyAgICBSMChjLCBkLCBlLCBhLCBiLCAzICsgaSk7IFwKKyAgICBSMChiLCBjLCBkLCBlLCBhLCA0ICsgaSk7IFwKKyAgICBpICs9IDUKKworICAgIGkgPSAwOworICAgIFIxXzA7IFIxXzA7IFIxXzA7CisgICAgUjAoYSwgYiwgYywgZCwgZSwgMTUpOworICAgIFIxKGUsIGEsIGIsIGMsIGQsIDE2KTsKKyAgICBSMShkLCBlLCBhLCBiLCBjLCAxNyk7CisgICAgUjEoYywgZCwgZSwgYSwgYiwgMTgpOworICAgIFIxKGIsIGMsIGQsIGUsIGEsIDE5KTsKKworI2RlZmluZSBSMV8yMCBcCisgICAgUjIoYSwgYiwgYywgZCwgZSwgMCArIGkpOyBcCisgICAgUjIoZSwgYSwgYiwgYywgZCwgMSArIGkpOyBcCisgICAgUjIoZCwgZSwgYSwgYiwgYywgMiArIGkpOyBcCisgICAgUjIoYywgZCwgZSwgYSwgYiwgMyArIGkpOyBcCisgICAgUjIoYiwgYywgZCwgZSwgYSwgNCArIGkpOyBcCisgICAgaSArPSA1CisKKyAgICBpID0gMjA7CisgICAgUjFfMjA7IFIxXzIwOyBSMV8yMDsgUjFfMjA7CisKKyNkZWZpbmUgUjFfNDAgXAorICAgIFIzKGEsIGIsIGMsIGQsIGUsIDAgKyBpKTsgXAorICAgIFIzKGUsIGEsIGIsIGMsIGQsIDEgKyBpKTsgXAorICAgIFIzKGQsIGUsIGEsIGIsIGMsIDIgKyBpKTsgXAorICAgIFIzKGMsIGQsIGUsIGEsIGIsIDMgKyBpKTsgXAorICAgIFIzKGIsIGMsIGQsIGUsIGEsIDQgKyBpKTsgXAorICAgIGkgKz0gNQorCisgICAgUjFfNDA7IFIxXzQwOyBSMV80MDsgUjFfNDA7CisKKyNkZWZpbmUgUjFfNjAgXAorICAgIFI0KGEsIGIsIGMsIGQsIGUsIDAgKyBpKTsgXAorICAgIFI0KGUsIGEsIGIsIGMsIGQsIDEgKyBpKTsgXAorICAgIFI0KGQsIGUsIGEsIGIsIGMsIDIgKyBpKTsgXAorICAgIFI0KGMsIGQsIGUsIGEsIGIsIDMgKyBpKTsgXAorICAgIFI0KGIsIGMsIGQsIGUsIGEsIDQgKyBpKTsgXAorICAgIGkgKz0gNQorCisgICAgUjFfNjA7IFIxXzYwOyBSMV82MDsgUjFfNjA7CisjZW5kaWYKKyAgICBzdGF0ZVswXSArPSBhOworICAgIHN0YXRlWzFdICs9IGI7CisgICAgc3RhdGVbMl0gKz0gYzsKKyAgICBzdGF0ZVszXSArPSBkOworICAgIHN0YXRlWzRdICs9IGU7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBLMjU2WzY0XSA9IHsKKyAgICAweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LAorICAgIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsCisgICAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywKKyAgICAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LAorICAgIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsCisgICAgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSwKKyAgICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LAorICAgIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsCisgICAgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMywKKyAgICAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LAorICAgIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsCisgICAgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCwKKyAgICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LAorICAgIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsCisgICAgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwKKyAgICAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyCit9OworCisKKyNkZWZpbmUgQ2goeCx5LHopICAgKCgoeCkgJiAoKHkpIF4gKHopKSkgXiAoeikpCisjZGVmaW5lIE1haih6LHkseCkgICgoKCh4KSB8ICh5KSkgJiAoeikpIHwgKCh4KSAmICh5KSkpCisKKyNkZWZpbmUgU2lnbWEwXzI1Nih4KSAgIChyb2woKHgpLCAzMCkgXiByb2woKHgpLCAxOSkgXiByb2woKHgpLCAxMCkpCisjZGVmaW5lIFNpZ21hMV8yNTYoeCkgICAocm9sKCh4KSwgMjYpIF4gcm9sKCh4KSwgMjEpIF4gcm9sKCh4KSwgIDcpKQorI2RlZmluZSBzaWdtYTBfMjU2KHgpICAgKHJvbCgoeCksIDI1KSBeIHJvbCgoeCksIDE0KSBeICgoeCkgPj4gMykpCisjZGVmaW5lIHNpZ21hMV8yNTYoeCkgICAocm9sKCh4KSwgMTUpIF4gcm9sKCh4KSwgMTMpIF4gKCh4KSA+PiAxMCkpCisKKyN1bmRlZiBibGsKKyNkZWZpbmUgYmxrKGkpICAoYmxvY2tbaV0gPSBibG9ja1tpIC0gMTZdICsgc2lnbWEwXzI1NihibG9ja1tpIC0gMTVdKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdtYTFfMjU2KGJsb2NrW2kgLSAyXSkgKyBibG9ja1tpIC0gN10pCisKKyNkZWZpbmUgUk9VTkQyNTYoYSxiLGMsZCxlLGYsZyxoKSAgIFwKKyAgICBUMSArPSAoaCkgKyBTaWdtYTFfMjU2KGUpICsgQ2goKGUpLCAoZiksIChnKSkgKyBLMjU2W2ldOyBcCisgICAgKGQpICs9IFQxOyBcCisgICAgKGgpID0gVDEgKyBTaWdtYTBfMjU2KGEpICsgTWFqKChhKSwgKGIpLCAoYykpOyBcCisgICAgaSsrCisKKyNkZWZpbmUgUk9VTkQyNTZfMF9UT18xNShhLGIsYyxkLGUsZixnLGgpICAgXAorICAgIFQxID0gYmxrMChpKTsgXAorICAgIFJPVU5EMjU2KGEsYixjLGQsZSxmLGcsaCkKKworI2RlZmluZSBST1VORDI1Nl8xNl9UT182MyhhLGIsYyxkLGUsZixnLGgpICAgXAorICAgIFQxID0gYmxrKGkpOyBcCisgICAgUk9VTkQyNTYoYSxiLGMsZCxlLGYsZyxoKQorCitzdGF0aWMgdm9pZCBzaGEyNTZfdHJhbnNmb3JtKHVpbnQzMl90ICpzdGF0ZSwgY29uc3QgdWludDhfdCBidWZmZXJbNjRdKQoreworICAgIHVuc2lnbmVkIGludCBpLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoOworICAgIHVpbnQzMl90IGJsb2NrWzY0XTsKKyAgICB1aW50MzJfdCBUMTsKKworICAgIGEgPSBzdGF0ZVswXTsKKyAgICBiID0gc3RhdGVbMV07CisgICAgYyA9IHN0YXRlWzJdOworICAgIGQgPSBzdGF0ZVszXTsKKyAgICBlID0gc3RhdGVbNF07CisgICAgZiA9IHN0YXRlWzVdOworICAgIGcgPSBzdGF0ZVs2XTsKKyAgICBoID0gc3RhdGVbN107CisjaWYgQ09ORklHX1NNQUxMCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgVDI7CisgICAgICAgIGlmIChpIDwgMTYpCisgICAgICAgICAgICBUMSA9IGJsazAoaSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFQxID0gYmxrKGkpOworICAgICAgICBUMSArPSBoICsgU2lnbWExXzI1NihlKSArIENoKGUsIGYsIGcpICsgSzI1NltpXTsKKyAgICAgICAgVDIgPSBTaWdtYTBfMjU2KGEpICsgTWFqKGEsIGIsIGMpOworICAgICAgICBoID0gZzsKKyAgICAgICAgZyA9IGY7CisgICAgICAgIGYgPSBlOworICAgICAgICBlID0gZCArIFQxOworICAgICAgICBkID0gYzsKKyAgICAgICAgYyA9IGI7CisgICAgICAgIGIgPSBhOworICAgICAgICBhID0gVDEgKyBUMjsKKyAgICB9CisjZWxzZQorCisgICAgaSA9IDA7CisjZGVmaW5lIFIyNTZfMCBcCisgICAgUk9VTkQyNTZfMF9UT18xNShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKTsgXAorICAgIFJPVU5EMjU2XzBfVE9fMTUoaCwgYSwgYiwgYywgZCwgZSwgZiwgZyk7IFwKKyAgICBST1VORDI1Nl8wX1RPXzE1KGcsIGgsIGEsIGIsIGMsIGQsIGUsIGYpOyBcCisgICAgUk9VTkQyNTZfMF9UT18xNShmLCBnLCBoLCBhLCBiLCBjLCBkLCBlKTsgXAorICAgIFJPVU5EMjU2XzBfVE9fMTUoZSwgZiwgZywgaCwgYSwgYiwgYywgZCk7IFwKKyAgICBST1VORDI1Nl8wX1RPXzE1KGQsIGUsIGYsIGcsIGgsIGEsIGIsIGMpOyBcCisgICAgUk9VTkQyNTZfMF9UT18xNShjLCBkLCBlLCBmLCBnLCBoLCBhLCBiKTsgXAorICAgIFJPVU5EMjU2XzBfVE9fMTUoYiwgYywgZCwgZSwgZiwgZywgaCwgYSkKKworICAgIFIyNTZfMDsgUjI1Nl8wOworCisjZGVmaW5lIFIyNTZfMTYgXAorICAgIFJPVU5EMjU2XzE2X1RPXzYzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpOyBcCisgICAgUk9VTkQyNTZfMTZfVE9fNjMoaCwgYSwgYiwgYywgZCwgZSwgZiwgZyk7IFwKKyAgICBST1VORDI1Nl8xNl9UT182MyhnLCBoLCBhLCBiLCBjLCBkLCBlLCBmKTsgXAorICAgIFJPVU5EMjU2XzE2X1RPXzYzKGYsIGcsIGgsIGEsIGIsIGMsIGQsIGUpOyBcCisgICAgUk9VTkQyNTZfMTZfVE9fNjMoZSwgZiwgZywgaCwgYSwgYiwgYywgZCk7IFwKKyAgICBST1VORDI1Nl8xNl9UT182MyhkLCBlLCBmLCBnLCBoLCBhLCBiLCBjKTsgXAorICAgIFJPVU5EMjU2XzE2X1RPXzYzKGMsIGQsIGUsIGYsIGcsIGgsIGEsIGIpOyBcCisgICAgUk9VTkQyNTZfMTZfVE9fNjMoYiwgYywgZCwgZSwgZiwgZywgaCwgYSkKKworICAgIFIyNTZfMTY7IFIyNTZfMTY7IFIyNTZfMTY7CisgICAgUjI1Nl8xNjsgUjI1Nl8xNjsgUjI1Nl8xNjsKKyNlbmRpZgorICAgIHN0YXRlWzBdICs9IGE7CisgICAgc3RhdGVbMV0gKz0gYjsKKyAgICBzdGF0ZVsyXSArPSBjOworICAgIHN0YXRlWzNdICs9IGQ7CisgICAgc3RhdGVbNF0gKz0gZTsKKyAgICBzdGF0ZVs1XSArPSBmOworICAgIHN0YXRlWzZdICs9IGc7CisgICAgc3RhdGVbN10gKz0gaDsKK30KKworCithdl9jb2xkIGludCBhdl9zaGFfaW5pdChBVlNIQSAqY3R4LCBpbnQgYml0cykKK3sKKyAgICBjdHgtPmRpZ2VzdF9sZW4gPSBiaXRzID4+IDU7CisgICAgc3dpdGNoIChiaXRzKSB7CisgICAgY2FzZSAxNjA6IC8vIFNIQS0xCisgICAgICAgIGN0eC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOworICAgICAgICBjdHgtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKyAgICAgICAgY3R4LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7CisgICAgICAgIGN0eC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OworICAgICAgICBjdHgtPnN0YXRlWzRdID0gMHhDM0QyRTFGMDsKKyAgICAgICAgY3R4LT50cmFuc2Zvcm0gPSBzaGExX3RyYW5zZm9ybTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjQ6IC8vIFNIQS0yMjQKKyAgICAgICAgY3R4LT5zdGF0ZVswXSA9IDB4QzEwNTlFRDg7CisgICAgICAgIGN0eC0+c3RhdGVbMV0gPSAweDM2N0NENTA3OworICAgICAgICBjdHgtPnN0YXRlWzJdID0gMHgzMDcwREQxNzsKKyAgICAgICAgY3R4LT5zdGF0ZVszXSA9IDB4RjcwRTU5Mzk7CisgICAgICAgIGN0eC0+c3RhdGVbNF0gPSAweEZGQzAwQjMxOworICAgICAgICBjdHgtPnN0YXRlWzVdID0gMHg2ODU4MTUxMTsKKyAgICAgICAgY3R4LT5zdGF0ZVs2XSA9IDB4NjRGOThGQTc7CisgICAgICAgIGN0eC0+c3RhdGVbN10gPSAweEJFRkE0RkE0OworICAgICAgICBjdHgtPnRyYW5zZm9ybSA9IHNoYTI1Nl90cmFuc2Zvcm07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjU2OiAvLyBTSEEtMjU2CisgICAgICAgIGN0eC0+c3RhdGVbMF0gPSAweDZBMDlFNjY3OworICAgICAgICBjdHgtPnN0YXRlWzFdID0gMHhCQjY3QUU4NTsKKyAgICAgICAgY3R4LT5zdGF0ZVsyXSA9IDB4M0M2RUYzNzI7CisgICAgICAgIGN0eC0+c3RhdGVbM10gPSAweEE1NEZGNTNBOworICAgICAgICBjdHgtPnN0YXRlWzRdID0gMHg1MTBFNTI3RjsKKyAgICAgICAgY3R4LT5zdGF0ZVs1XSA9IDB4OUIwNTY4OEM7CisgICAgICAgIGN0eC0+c3RhdGVbNl0gPSAweDFGODNEOUFCOworICAgICAgICBjdHgtPnN0YXRlWzddID0gMHg1QkUwQ0QxOTsKKyAgICAgICAgY3R4LT50cmFuc2Zvcm0gPSBzaGEyNTZfdHJhbnNmb3JtOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGN0eC0+Y291bnQgPSAwOworICAgIHJldHVybiAwOworfQorCit2b2lkIGF2X3NoYV91cGRhdGUoQVZTSEEqIGN0eCwgY29uc3QgdWludDhfdCogZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKworICAgIGogPSBjdHgtPmNvdW50ICYgNjM7CisgICAgY3R4LT5jb3VudCArPSBsZW47CisjaWYgQ09ORklHX1NNQUxMCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGN0eC0+YnVmZmVyW2orK10gPSBkYXRhW2ldOworICAgICAgICBpZiAoNjQgPT0gaikgeworICAgICAgICAgICAgY3R4LT50cmFuc2Zvcm0oY3R4LT5zdGF0ZSwgY3R4LT5idWZmZXIpOworICAgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIGlmICgoaiArIGxlbikgPiA2MykgeworICAgICAgICBtZW1jcHkoJmN0eC0+YnVmZmVyW2pdLCBkYXRhLCAoaSA9IDY0IC0gaikpOworICAgICAgICBjdHgtPnRyYW5zZm9ybShjdHgtPnN0YXRlLCBjdHgtPmJ1ZmZlcik7CisgICAgICAgIGZvciAoOyBpICsgNjMgPCBsZW47IGkgKz0gNjQpCisgICAgICAgICAgICBjdHgtPnRyYW5zZm9ybShjdHgtPnN0YXRlLCAmZGF0YVtpXSk7CisgICAgICAgIGogPSAwOworICAgIH0gZWxzZQorICAgICAgICBpID0gMDsKKyAgICBtZW1jcHkoJmN0eC0+YnVmZmVyW2pdLCAmZGF0YVtpXSwgbGVuIC0gaSk7CisjZW5kaWYKK30KKwordm9pZCBhdl9zaGFfZmluYWwoQVZTSEEqIGN0eCwgdWludDhfdCAqZGlnZXN0KQoreworICAgIGludCBpOworICAgIHVpbnQ2NF90IGZpbmFsY291bnQgPSBhdl9iZTJuZTY0KGN0eC0+Y291bnQgPDwgMyk7CisKKyAgICBhdl9zaGFfdXBkYXRlKGN0eCwgIlwyMDAiLCAxKTsKKyAgICB3aGlsZSAoKGN0eC0+Y291bnQgJiA2MykgIT0gNTYpCisgICAgICAgIGF2X3NoYV91cGRhdGUoY3R4LCAiIiwgMSk7CisgICAgYXZfc2hhX3VwZGF0ZShjdHgsICh1aW50OF90ICopJmZpbmFsY291bnQsIDgpOyAvKiBTaG91bGQgY2F1c2UgYSB0cmFuc2Zvcm0oKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPmRpZ2VzdF9sZW47IGkrKykKKyAgICAgICAgQVZfV0IzMihkaWdlc3QgKyBpKjQsIGN0eC0+c3RhdGVbaV0pOworfQorCisjaWZkZWYgVEVTVAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGksIGosIGs7CisgICAgQVZTSEEgY3R4OworICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzMyXTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGxlbmd0aHNbM10gPSB7IDE2MCwgMjI0LCAyNTYgfTsKKworICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgcHJpbnRmKCJUZXN0aW5nIFNIQS0lZFxuIiwgbGVuZ3Roc1tqXSk7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCAzOyBrKyspIHsKKyAgICAgICAgICAgIGF2X3NoYV9pbml0KCZjdHgsIGxlbmd0aHNbal0pOworICAgICAgICAgICAgaWYgKGsgPT0gMCkKKyAgICAgICAgICAgICAgICBhdl9zaGFfdXBkYXRlKCZjdHgsICJhYmMiLCAzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGsgPT0gMSkKKyAgICAgICAgICAgICAgICBhdl9zaGFfdXBkYXRlKCZjdHgsICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsIDU2KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMCoxMDAwOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGF2X3NoYV91cGRhdGUoJmN0eCwgImEiLCAxKTsKKyAgICAgICAgICAgIGF2X3NoYV9maW5hbCgmY3R4LCBkaWdlc3QpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aHNbal0gPj4gMzsgaSsrKQorICAgICAgICAgICAgICAgIHByaW50ZigiJTAyWCIsIGRpZ2VzdFtpXSk7CisgICAgICAgICAgICBwdXRjaGFyKCdcbicpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoaikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvL3Rlc3QgdmVjdG9ycyAoZnJvbSBGSVBTIFBVQiAxODAtMSkKKyAgICAgICAgICAgIHByaW50ZigiQTk5OTNFMzYgNDcwNjgxNkEgQkEzRTI1NzEgNzg1MEMyNkMgOUNEMEQ4OURcbiIKKyAgICAgICAgICAgICAgICAgICAiODQ5ODNFNDQgMUMzQkQyNkUgQkFBRTRBQTEgRjk1MTI5RTUgRTU0NjcwRjFcbiIKKyAgICAgICAgICAgICAgICAgICAiMzRBQTk3M0MgRDRDNERBQTQgRjYxRUVCMkIgREJBRDI3MzEgNjUzNDAxNkZcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIC8vdGVzdCB2ZWN0b3JzIChmcm9tIEZJUFMgUFVCIDE4MC0yIEFwcGVuZGl4IEEpCisgICAgICAgICAgICBwcmludGYoIjIzMDk3ZDIyIDM0MDVkODIyIDg2NDJhNDc3IGJkYTI1NWIzIDJhYWRiY2U0IGJkYTBiM2Y3IGUzNmM5ZGE3XG4iCisgICAgICAgICAgICAgICAgICAgIjc1Mzg4YjE2IDUxMjc3NmNjIDVkYmE1ZGExIGZkODkwMTUwIGIwYzY0NTVjIGI0ZjU4YjE5IDUyNTIyNTI1XG4iCisgICAgICAgICAgICAgICAgICAgIjIwNzk0NjU1IDk4MGM5MWQ4IGJiYjRjMWVhIDk3NjE4YTRiIGYwM2Y0MjU4IDE5NDhiMmVlIDRlZTdhZDY3XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAvL3Rlc3QgdmVjdG9ycyAoZnJvbSBGSVBTIFBVQiAxODAtMikKKyAgICAgICAgICAgIHByaW50ZigiYmE3ODE2YmYgOGYwMWNmZWEgNDE0MTQwZGUgNWRhZTIyMjMgYjAwMzYxYTMgOTYxNzdhOWMgYjQxMGZmNjEgZjIwMDE1YWRcbiIKKyAgICAgICAgICAgICAgICAgICAiMjQ4ZDZhNjEgZDIwNjM4YjggZTVjMDI2OTMgMGMzZTYwMzkgYTMzY2U0NTkgNjRmZjIxNjcgZjZlY2VkZDQgMTlkYjA2YzFcbiIKKyAgICAgICAgICAgICAgICAgICAiY2RjNzZlNWMgOTkxNGZiOTIgODFhMWM3ZTIgODRkNzNlNjcgZjE4MDlhNDggYTQ5NzIwMGUgMDQ2ZDM5Y2MgYzcxMTJjZDBcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC9zaGEuaCBiL2ZmbXBlZy9saWJhdnV0aWwvc2hhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0Mzc3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvc2hhLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9TSEFfSAorI2RlZmluZSBBVlVUSUxfU0hBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2dV9zaGEgU0hBCisgKiBAaW5ncm91cCBsYXZ1X2NyeXB0bworICogQHsKKyAqLworCitleHRlcm4gY29uc3QgaW50IGF2X3NoYV9zaXplOworCitzdHJ1Y3QgQVZTSEE7CisKKy8qKgorICogQWxsb2NhdGUgYW4gQVZTSEEgY29udGV4dC4KKyAqLworc3RydWN0IEFWU0hBICphdl9zaGFfYWxsb2Modm9pZCk7CisKKy8qKgorICogSW5pdGlhbGl6ZSBTSEEtMSBvciBTSEEtMiBoYXNoaW5nLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIGNvbnRleHQgKG9mIHNpemUgYXZfc2hhX3NpemUpCisgKiBAcGFyYW0gYml0cyAgICBudW1iZXIgb2YgYml0cyBpbiBkaWdlc3QgKFNIQS0xIC0gMTYwIGJpdHMsIFNIQS0yIDIyNCBvciAyNTYgYml0cykKKyAqIEByZXR1cm4gICAgICAgIHplcm8gaWYgaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkLCAtMSBvdGhlcndpc2UKKyAqLworaW50IGF2X3NoYV9pbml0KHN0cnVjdCBBVlNIQSogY29udGV4dCwgaW50IGJpdHMpOworCisvKioKKyAqIFVwZGF0ZSBoYXNoIHZhbHVlLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IGhhc2ggZnVuY3Rpb24gY29udGV4dAorICogQHBhcmFtIGRhdGEgICAgaW5wdXQgZGF0YSB0byB1cGRhdGUgaGFzaCB3aXRoCisgKiBAcGFyYW0gbGVuICAgICBpbnB1dCBkYXRhIGxlbmd0aAorICovCit2b2lkIGF2X3NoYV91cGRhdGUoc3RydWN0IEFWU0hBKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKTsKKworLyoqCisgKiBGaW5pc2ggaGFzaGluZyBhbmQgb3V0cHV0IGRpZ2VzdCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gY29udGV4dCBoYXNoIGZ1bmN0aW9uIGNvbnRleHQKKyAqIEBwYXJhbSBkaWdlc3QgIGJ1ZmZlciB3aGVyZSBvdXRwdXQgZGlnZXN0IHZhbHVlIGlzIHN0b3JlZAorICovCit2b2lkIGF2X3NoYV9maW5hbChzdHJ1Y3QgQVZTSEEqIGNvbnRleHQsIHVpbnQ4X3QgKmRpZ2VzdCk7CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQVZVVElMX1NIQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3NoYTUxMi5jIGIvZmZtcGVnL2xpYmF2dXRpbC9zaGE1MTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmE4NjRmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9zaGE1MTIuYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChDKSAyMDA5IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqIENvcHlyaWdodCAoQykgMjAxMyBKYW1lcyBBbG1lcgorICogYmFzZWQgb24gQlNELWxpY2Vuc2VkIFNIQS0yIGNvZGUgYnkgQWFyb24gRC4gR2lmZm9yZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiYXZ1dGlsLmgiCisjaW5jbHVkZSAiYnN3YXAuaCIKKyNpbmNsdWRlICJzaGE1MTIuaCIKKyNpbmNsdWRlICJpbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJtZW0uaCIKKworLyoqIGhhc2ggY29udGV4dCAqLwordHlwZWRlZiBzdHJ1Y3QgQVZTSEE1MTIgeworICAgIHVpbnQ4X3QgIGRpZ2VzdF9sZW47ICAvLy88IGRpZ2VzdCBsZW5ndGggaW4gNjQtYml0IHdvcmRzCisgICAgdWludDY0X3QgY291bnQ7ICAgICAgIC8vLzwgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlcgorICAgIHVpbnQ4X3QgIGJ1ZmZlclsxMjhdOyAvLy88IDEwMjQtYml0IGJ1ZmZlciBvZiBpbnB1dCB2YWx1ZXMgdXNlZCBpbiBoYXNoIHVwZGF0aW5nCisgICAgdWludDY0X3Qgc3RhdGVbOF07ICAgIC8vLzwgY3VycmVudCBoYXNoIHZhbHVlCit9IEFWU0hBNTEyOworCitjb25zdCBpbnQgYXZfc2hhNTEyX3NpemUgPSBzaXplb2YoQVZTSEE1MTIpOworCitzdHJ1Y3QgQVZTSEE1MTIgKmF2X3NoYTUxMl9hbGxvYyh2b2lkKQoreworICAgIHJldHVybiBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3QgQVZTSEE1MTIpKTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ2NF90IEs1MTJbODBdID0geworICAgIFVJTlQ2NF9DKDB4NDI4YTJmOThkNzI4YWUyMiksICBVSU5UNjRfQygweDcxMzc0NDkxMjNlZjY1Y2QpLAorICAgIFVJTlQ2NF9DKDB4YjVjMGZiY2ZlYzRkM2IyZiksICBVSU5UNjRfQygweGU5YjVkYmE1ODE4OWRiYmMpLAorICAgIFVJTlQ2NF9DKDB4Mzk1NmMyNWJmMzQ4YjUzOCksICBVSU5UNjRfQygweDU5ZjExMWYxYjYwNWQwMTkpLAorICAgIFVJTlQ2NF9DKDB4OTIzZjgyYTRhZjE5NGY5YiksICBVSU5UNjRfQygweGFiMWM1ZWQ1ZGE2ZDgxMTgpLAorICAgIFVJTlQ2NF9DKDB4ZDgwN2FhOThhMzAzMDI0MiksICBVSU5UNjRfQygweDEyODM1YjAxNDU3MDZmYmUpLAorICAgIFVJTlQ2NF9DKDB4MjQzMTg1YmU0ZWU0YjI4YyksICBVSU5UNjRfQygweDU1MGM3ZGMzZDVmZmI0ZTIpLAorICAgIFVJTlQ2NF9DKDB4NzJiZTVkNzRmMjdiODk2ZiksICBVSU5UNjRfQygweDgwZGViMWZlM2IxNjk2YjEpLAorICAgIFVJTlQ2NF9DKDB4OWJkYzA2YTcyNWM3MTIzNSksICBVSU5UNjRfQygweGMxOWJmMTc0Y2Y2OTI2OTQpLAorICAgIFVJTlQ2NF9DKDB4ZTQ5YjY5YzE5ZWYxNGFkMiksICBVSU5UNjRfQygweGVmYmU0Nzg2Mzg0ZjI1ZTMpLAorICAgIFVJTlQ2NF9DKDB4MGZjMTlkYzY4YjhjZDViNSksICBVSU5UNjRfQygweDI0MGNhMWNjNzdhYzljNjUpLAorICAgIFVJTlQ2NF9DKDB4MmRlOTJjNmY1OTJiMDI3NSksICBVSU5UNjRfQygweDRhNzQ4NGFhNmVhNmU0ODMpLAorICAgIFVJTlQ2NF9DKDB4NWNiMGE5ZGNiZDQxZmJkNCksICBVSU5UNjRfQygweDc2Zjk4OGRhODMxMTUzYjUpLAorICAgIFVJTlQ2NF9DKDB4OTgzZTUxNTJlZTY2ZGZhYiksICBVSU5UNjRfQygweGE4MzFjNjZkMmRiNDMyMTApLAorICAgIFVJTlQ2NF9DKDB4YjAwMzI3Yzg5OGZiMjEzZiksICBVSU5UNjRfQygweGJmNTk3ZmM3YmVlZjBlZTQpLAorICAgIFVJTlQ2NF9DKDB4YzZlMDBiZjMzZGE4OGZjMiksICBVSU5UNjRfQygweGQ1YTc5MTQ3OTMwYWE3MjUpLAorICAgIFVJTlQ2NF9DKDB4MDZjYTYzNTFlMDAzODI2ZiksICBVSU5UNjRfQygweDE0MjkyOTY3MGEwZTZlNzApLAorICAgIFVJTlQ2NF9DKDB4MjdiNzBhODU0NmQyMmZmYyksICBVSU5UNjRfQygweDJlMWIyMTM4NWMyNmM5MjYpLAorICAgIFVJTlQ2NF9DKDB4NGQyYzZkZmM1YWM0MmFlZCksICBVSU5UNjRfQygweDUzMzgwZDEzOWQ5NWIzZGYpLAorICAgIFVJTlQ2NF9DKDB4NjUwYTczNTQ4YmFmNjNkZSksICBVSU5UNjRfQygweDc2NmEwYWJiM2M3N2IyYTgpLAorICAgIFVJTlQ2NF9DKDB4ODFjMmM5MmU0N2VkYWVlNiksICBVSU5UNjRfQygweDkyNzIyYzg1MTQ4MjM1M2IpLAorICAgIFVJTlQ2NF9DKDB4YTJiZmU4YTE0Y2YxMDM2NCksICBVSU5UNjRfQygweGE4MWE2NjRiYmM0MjMwMDEpLAorICAgIFVJTlQ2NF9DKDB4YzI0YjhiNzBkMGY4OTc5MSksICBVSU5UNjRfQygweGM3NmM1MWEzMDY1NGJlMzApLAorICAgIFVJTlQ2NF9DKDB4ZDE5MmU4MTlkNmVmNTIxOCksICBVSU5UNjRfQygweGQ2OTkwNjI0NTU2NWE5MTApLAorICAgIFVJTlQ2NF9DKDB4ZjQwZTM1ODU1NzcxMjAyYSksICBVSU5UNjRfQygweDEwNmFhMDcwMzJiYmQxYjgpLAorICAgIFVJTlQ2NF9DKDB4MTlhNGMxMTZiOGQyZDBjOCksICBVSU5UNjRfQygweDFlMzc2YzA4NTE0MWFiNTMpLAorICAgIFVJTlQ2NF9DKDB4Mjc0ODc3NGNkZjhlZWI5OSksICBVSU5UNjRfQygweDM0YjBiY2I1ZTE5YjQ4YTgpLAorICAgIFVJTlQ2NF9DKDB4MzkxYzBjYjNjNWM5NWE2MyksICBVSU5UNjRfQygweDRlZDhhYTRhZTM0MThhY2IpLAorICAgIFVJTlQ2NF9DKDB4NWI5Y2NhNGY3NzYzZTM3MyksICBVSU5UNjRfQygweDY4MmU2ZmYzZDZiMmI4YTMpLAorICAgIFVJTlQ2NF9DKDB4NzQ4ZjgyZWU1ZGVmYjJmYyksICBVSU5UNjRfQygweDc4YTU2MzZmNDMxNzJmNjApLAorICAgIFVJTlQ2NF9DKDB4ODRjODc4MTRhMWYwYWI3MiksICBVSU5UNjRfQygweDhjYzcwMjA4MWE2NDM5ZWMpLAorICAgIFVJTlQ2NF9DKDB4OTBiZWZmZmEyMzYzMWUyOCksICBVSU5UNjRfQygweGE0NTA2Y2ViZGU4MmJkZTkpLAorICAgIFVJTlQ2NF9DKDB4YmVmOWEzZjdiMmM2NzkxNSksICBVSU5UNjRfQygweGM2NzE3OGYyZTM3MjUzMmIpLAorICAgIFVJTlQ2NF9DKDB4Y2EyNzNlY2VlYTI2NjE5YyksICBVSU5UNjRfQygweGQxODZiOGM3MjFjMGMyMDcpLAorICAgIFVJTlQ2NF9DKDB4ZWFkYTdkZDZjZGUwZWIxZSksICBVSU5UNjRfQygweGY1N2Q0ZjdmZWU2ZWQxNzgpLAorICAgIFVJTlQ2NF9DKDB4MDZmMDY3YWE3MjE3NmZiYSksICBVSU5UNjRfQygweDBhNjM3ZGM1YTJjODk4YTYpLAorICAgIFVJTlQ2NF9DKDB4MTEzZjk4MDRiZWY5MGRhZSksICBVSU5UNjRfQygweDFiNzEwYjM1MTMxYzQ3MWIpLAorICAgIFVJTlQ2NF9DKDB4MjhkYjc3ZjUyMzA0N2Q4NCksICBVSU5UNjRfQygweDMyY2FhYjdiNDBjNzI0OTMpLAorICAgIFVJTlQ2NF9DKDB4M2M5ZWJlMGExNWM5YmViYyksICBVSU5UNjRfQygweDQzMWQ2N2M0OWMxMDBkNGMpLAorICAgIFVJTlQ2NF9DKDB4NGNjNWQ0YmVjYjNlNDJiNiksICBVSU5UNjRfQygweDU5N2YyOTljZmM2NTdlMmEpLAorICAgIFVJTlQ2NF9DKDB4NWZjYjZmYWIzYWQ2ZmFlYyksICBVSU5UNjRfQygweDZjNDQxOThjNGE0NzU4MTcpLAorfTsKKworI2RlZmluZSByb3IodmFsdWUsIGJpdHMpICgoKHZhbHVlKSA+PiAoYml0cykpIHwgKCh2YWx1ZSkgPDwgKDY0IC0gKGJpdHMpKSkpCisKKyNkZWZpbmUgQ2goeCx5LHopICAgKCgoeCkgJiAoKHkpIF4gKHopKSkgXiAoeikpCisjZGVmaW5lIE1haih6LHkseCkgICgoKCh4KSB8ICh5KSkgJiAoeikpIHwgKCh4KSAmICh5KSkpCisKKyNkZWZpbmUgU2lnbWEwXzUxMih4KSAgIChyb3IoKHgpLCAyOCkgXiByb3IoKHgpLCAzNCkgXiByb3IoKHgpLCAzOSkpCisjZGVmaW5lIFNpZ21hMV81MTIoeCkgICAocm9yKCh4KSwgMTQpIF4gcm9yKCh4KSwgMTgpIF4gcm9yKCh4KSwgNDEpKQorI2RlZmluZSBzaWdtYTBfNTEyKHgpICAgKHJvcigoeCksICAxKSBeIHJvcigoeCksICA4KSBeICgoeCkgPj4gNykpCisjZGVmaW5lIHNpZ21hMV81MTIoeCkgICAocm9yKCh4KSwgMTkpIF4gcm9yKCh4KSwgNjEpIF4gKCh4KSA+PiA2KSkKKworI2RlZmluZSBibGswKGkpIChibG9ja1tpXSA9IEFWX1JCNjQoYnVmZmVyICsgOCAqIChpKSkpCisjZGVmaW5lIGJsayhpKSAgKGJsb2NrW2ldID0gYmxvY2tbaSAtIDE2XSArIHNpZ21hMF81MTIoYmxvY2tbaSAtIDE1XSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbWExXzUxMihibG9ja1tpIC0gMl0pICsgYmxvY2tbaSAtIDddKQorCisjZGVmaW5lIFJPVU5ENTEyKGEsYixjLGQsZSxmLGcsaCkgICBcCisgICAgVDEgKz0gKGgpICsgU2lnbWExXzUxMihlKSArIENoKChlKSwgKGYpLCAoZykpICsgSzUxMltpXTsgXAorICAgIChkKSArPSBUMTsgXAorICAgIChoKSA9IFQxICsgU2lnbWEwXzUxMihhKSArIE1haigoYSksIChiKSwgKGMpKTsgXAorICAgIGkrKworCisjZGVmaW5lIFJPVU5ENTEyXzBfVE9fMTUoYSxiLGMsZCxlLGYsZyxoKSAgIFwKKyAgICBUMSA9IGJsazAoaSk7IFwKKyAgICBST1VORDUxMihhLGIsYyxkLGUsZixnLGgpCisKKyNkZWZpbmUgUk9VTkQ1MTJfMTZfVE9fODAoYSxiLGMsZCxlLGYsZyxoKSAgIFwKKyAgICBUMSA9IGJsayhpKTsgXAorICAgIFJPVU5ENTEyKGEsYixjLGQsZSxmLGcsaCkKKworc3RhdGljIHZvaWQgc2hhNTEyX3RyYW5zZm9ybSh1aW50NjRfdCAqc3RhdGUsIGNvbnN0IHVpbnQ4X3QgYnVmZmVyWzEyOF0pCit7CisgICAgdWludDY0X3QgYSwgYiwgYywgZCwgZSwgZiwgZywgaDsKKyAgICB1aW50NjRfdCBibG9ja1s4MF07CisgICAgdWludDY0X3QgVDE7CisgICAgaW50IGk7CisKKyAgICBhID0gc3RhdGVbMF07CisgICAgYiA9IHN0YXRlWzFdOworICAgIGMgPSBzdGF0ZVsyXTsKKyAgICBkID0gc3RhdGVbM107CisgICAgZSA9IHN0YXRlWzRdOworICAgIGYgPSBzdGF0ZVs1XTsKKyAgICBnID0gc3RhdGVbNl07CisgICAgaCA9IHN0YXRlWzddOworI2lmIENPTkZJR19TTUFMTAorICAgIGZvciAoaSA9IDA7IGkgPCA4MDsgaSsrKSB7CisgICAgICAgIHVpbnQ2NF90IFQyOworICAgICAgICBpZiAoaSA8IDE2KQorICAgICAgICAgICAgVDEgPSBibGswKGkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBUMSA9IGJsayhpKTsKKyAgICAgICAgVDEgKz0gaCArIFNpZ21hMV81MTIoZSkgKyBDaChlLCBmLCBnKSArIEs1MTJbaV07CisgICAgICAgIFQyID0gU2lnbWEwXzUxMihhKSArIE1haihhLCBiLCBjKTsKKyAgICAgICAgaCA9IGc7CisgICAgICAgIGcgPSBmOworICAgICAgICBmID0gZTsKKyAgICAgICAgZSA9IGQgKyBUMTsKKyAgICAgICAgZCA9IGM7CisgICAgICAgIGMgPSBiOworICAgICAgICBiID0gYTsKKyAgICAgICAgYSA9IFQxICsgVDI7CisgICAgfQorI2Vsc2UKKworI2RlZmluZSBSNTEyXzAgXAorICAgIFJPVU5ENTEyXzBfVE9fMTUoYSwgYiwgYywgZCwgZSwgZiwgZywgaCk7IFwKKyAgICBST1VORDUxMl8wX1RPXzE1KGgsIGEsIGIsIGMsIGQsIGUsIGYsIGcpOyBcCisgICAgUk9VTkQ1MTJfMF9UT18xNShnLCBoLCBhLCBiLCBjLCBkLCBlLCBmKTsgXAorICAgIFJPVU5ENTEyXzBfVE9fMTUoZiwgZywgaCwgYSwgYiwgYywgZCwgZSk7IFwKKyAgICBST1VORDUxMl8wX1RPXzE1KGUsIGYsIGcsIGgsIGEsIGIsIGMsIGQpOyBcCisgICAgUk9VTkQ1MTJfMF9UT18xNShkLCBlLCBmLCBnLCBoLCBhLCBiLCBjKTsgXAorICAgIFJPVU5ENTEyXzBfVE9fMTUoYywgZCwgZSwgZiwgZywgaCwgYSwgYik7IFwKKyAgICBST1VORDUxMl8wX1RPXzE1KGIsIGMsIGQsIGUsIGYsIGcsIGgsIGEpCisKKyAgICBpID0gMDsKKyAgICBSNTEyXzA7IFI1MTJfMDsKKworI2RlZmluZSBSNTEyXzE2IFwKKyAgICBST1VORDUxMl8xNl9UT184MChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKTsgXAorICAgIFJPVU5ENTEyXzE2X1RPXzgwKGgsIGEsIGIsIGMsIGQsIGUsIGYsIGcpOyBcCisgICAgUk9VTkQ1MTJfMTZfVE9fODAoZywgaCwgYSwgYiwgYywgZCwgZSwgZik7IFwKKyAgICBST1VORDUxMl8xNl9UT184MChmLCBnLCBoLCBhLCBiLCBjLCBkLCBlKTsgXAorICAgIFJPVU5ENTEyXzE2X1RPXzgwKGUsIGYsIGcsIGgsIGEsIGIsIGMsIGQpOyBcCisgICAgUk9VTkQ1MTJfMTZfVE9fODAoZCwgZSwgZiwgZywgaCwgYSwgYiwgYyk7IFwKKyAgICBST1VORDUxMl8xNl9UT184MChjLCBkLCBlLCBmLCBnLCBoLCBhLCBiKTsgXAorICAgIFJPVU5ENTEyXzE2X1RPXzgwKGIsIGMsIGQsIGUsIGYsIGcsIGgsIGEpCisKKyAgICBSNTEyXzE2OyBSNTEyXzE2OyBSNTEyXzE2OyBSNTEyXzE2OworICAgIFI1MTJfMTY7IFI1MTJfMTY7IFI1MTJfMTY7IFI1MTJfMTY7CisjZW5kaWYKKyAgICBzdGF0ZVswXSArPSBhOworICAgIHN0YXRlWzFdICs9IGI7CisgICAgc3RhdGVbMl0gKz0gYzsKKyAgICBzdGF0ZVszXSArPSBkOworICAgIHN0YXRlWzRdICs9IGU7CisgICAgc3RhdGVbNV0gKz0gZjsKKyAgICBzdGF0ZVs2XSArPSBnOworICAgIHN0YXRlWzddICs9IGg7Cit9CisKKworYXZfY29sZCBpbnQgYXZfc2hhNTEyX2luaXQoQVZTSEE1MTIgKmN0eCwgaW50IGJpdHMpCit7CisgICAgY3R4LT5kaWdlc3RfbGVuID0gYml0cyA+PiA2OworICAgIHN3aXRjaCAoYml0cykgeworICAgIGNhc2UgMjI0OiAvLyBTSEEtNTEyLzIyNAorICAgICAgICBjdHgtPnN0YXRlWzBdID0gVUlOVDY0X0MoMHg4QzNEMzdDODE5NTQ0REEyKTsKKyAgICAgICAgY3R4LT5zdGF0ZVsxXSA9IFVJTlQ2NF9DKDB4NzNFMTk5NjY4OURDRDRENik7CisgICAgICAgIGN0eC0+c3RhdGVbMl0gPSBVSU5UNjRfQygweDFERkFCN0FFMzJGRjlDODIpOworICAgICAgICBjdHgtPnN0YXRlWzNdID0gVUlOVDY0X0MoMHg2NzlERDUxNDU4MkY5RkNGKTsKKyAgICAgICAgY3R4LT5zdGF0ZVs0XSA9IFVJTlQ2NF9DKDB4MEY2RDJCNjk3QkQ0NERBOCk7CisgICAgICAgIGN0eC0+c3RhdGVbNV0gPSBVSU5UNjRfQygweDc3RTM2RjczMDRDNDg5NDIpOworICAgICAgICBjdHgtPnN0YXRlWzZdID0gVUlOVDY0X0MoMHgzRjlEODVBODZBMUQzNkM4KTsKKyAgICAgICAgY3R4LT5zdGF0ZVs3XSA9IFVJTlQ2NF9DKDB4MTExMkU2QUQ5MUQ2OTJBMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjU2OiAvLyBTSEEtNTEyLzI1NgorICAgICAgICBjdHgtPnN0YXRlWzBdID0gVUlOVDY0X0MoMHgyMjMxMjE5NEZDMkJGNzJDKTsKKyAgICAgICAgY3R4LT5zdGF0ZVsxXSA9IFVJTlQ2NF9DKDB4OUY1NTVGQTNDODRDNjRDMik7CisgICAgICAgIGN0eC0+c3RhdGVbMl0gPSBVSU5UNjRfQygweDIzOTNCODZCNkY1M0IxNTEpOworICAgICAgICBjdHgtPnN0YXRlWzNdID0gVUlOVDY0X0MoMHg5NjM4NzcxOTU5NDBFQUJEKTsKKyAgICAgICAgY3R4LT5zdGF0ZVs0XSA9IFVJTlQ2NF9DKDB4OTYyODNFRTJBODhFRkZFMyk7CisgICAgICAgIGN0eC0+c3RhdGVbNV0gPSBVSU5UNjRfQygweEJFNUUxRTI1NTM4NjM5OTIpOworICAgICAgICBjdHgtPnN0YXRlWzZdID0gVUlOVDY0X0MoMHgyQjAxOTlGQzJDODVCOEFBKTsKKyAgICAgICAgY3R4LT5zdGF0ZVs3XSA9IFVJTlQ2NF9DKDB4MEVCNzJEREM4MUM1MkNBMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzg0OiAvLyBTSEEtMzg0CisgICAgICAgIGN0eC0+c3RhdGVbMF0gPSBVSU5UNjRfQygweENCQkI5RDVEQzEwNTlFRDgpOworICAgICAgICBjdHgtPnN0YXRlWzFdID0gVUlOVDY0X0MoMHg2MjlBMjkyQTM2N0NENTA3KTsKKyAgICAgICAgY3R4LT5zdGF0ZVsyXSA9IFVJTlQ2NF9DKDB4OTE1OTAxNUEzMDcwREQxNyk7CisgICAgICAgIGN0eC0+c3RhdGVbM10gPSBVSU5UNjRfQygweDE1MkZFQ0Q4RjcwRTU5MzkpOworICAgICAgICBjdHgtPnN0YXRlWzRdID0gVUlOVDY0X0MoMHg2NzMzMjY2N0ZGQzAwQjMxKTsKKyAgICAgICAgY3R4LT5zdGF0ZVs1XSA9IFVJTlQ2NF9DKDB4OEVCNDRBODc2ODU4MTUxMSk7CisgICAgICAgIGN0eC0+c3RhdGVbNl0gPSBVSU5UNjRfQygweERCMEMyRTBENjRGOThGQTcpOworICAgICAgICBjdHgtPnN0YXRlWzddID0gVUlOVDY0X0MoMHg0N0I1NDgxREJFRkE0RkE0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MTI6IC8vIFNIQS01MTIKKyAgICAgICAgY3R4LT5zdGF0ZVswXSA9IFVJTlQ2NF9DKDB4NkEwOUU2NjdGM0JDQzkwOCk7CisgICAgICAgIGN0eC0+c3RhdGVbMV0gPSBVSU5UNjRfQygweEJCNjdBRTg1ODRDQUE3M0IpOworICAgICAgICBjdHgtPnN0YXRlWzJdID0gVUlOVDY0X0MoMHgzQzZFRjM3MkZFOTRGODJCKTsKKyAgICAgICAgY3R4LT5zdGF0ZVszXSA9IFVJTlQ2NF9DKDB4QTU0RkY1M0E1RjFEMzZGMSk7CisgICAgICAgIGN0eC0+c3RhdGVbNF0gPSBVSU5UNjRfQygweDUxMEU1MjdGQURFNjgyRDEpOworICAgICAgICBjdHgtPnN0YXRlWzVdID0gVUlOVDY0X0MoMHg5QjA1Njg4QzJCM0U2QzFGKTsKKyAgICAgICAgY3R4LT5zdGF0ZVs2XSA9IFVJTlQ2NF9DKDB4MUY4M0Q5QUJGQjQxQkQ2Qik7CisgICAgICAgIGN0eC0+c3RhdGVbN10gPSBVSU5UNjRfQygweDVCRTBDRDE5MTM3RTIxNzkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGN0eC0+Y291bnQgPSAwOworICAgIHJldHVybiAwOworfQorCit2b2lkIGF2X3NoYTUxMl91cGRhdGUoQVZTSEE1MTIqIGN0eCwgY29uc3QgdWludDhfdCogZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKworICAgIGogPSBjdHgtPmNvdW50ICYgMTI3OworICAgIGN0eC0+Y291bnQgKz0gbGVuOworI2lmIENPTkZJR19TTUFMTAorICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBjdHgtPmJ1ZmZlcltqKytdID0gZGF0YVtpXTsKKyAgICAgICAgaWYgKDEyOCA9PSBqKSB7CisgICAgICAgICAgICBzaGE1MTJfdHJhbnNmb3JtKGN0eC0+c3RhdGUsIGN0eC0+YnVmZmVyKTsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBpZiAoKGogKyBsZW4pID4gMTI3KSB7CisgICAgICAgIG1lbWNweSgmY3R4LT5idWZmZXJbal0sIGRhdGEsIChpID0gMTI4IC0gaikpOworICAgICAgICBzaGE1MTJfdHJhbnNmb3JtKGN0eC0+c3RhdGUsIGN0eC0+YnVmZmVyKTsKKyAgICAgICAgZm9yICg7IGkgKyAxMjcgPCBsZW47IGkgKz0gMTI4KQorICAgICAgICAgICAgc2hhNTEyX3RyYW5zZm9ybShjdHgtPnN0YXRlLCAmZGF0YVtpXSk7CisgICAgICAgIGogPSAwOworICAgIH0gZWxzZQorICAgICAgICBpID0gMDsKKyAgICBtZW1jcHkoJmN0eC0+YnVmZmVyW2pdLCAmZGF0YVtpXSwgbGVuIC0gaSk7CisjZW5kaWYKK30KKwordm9pZCBhdl9zaGE1MTJfZmluYWwoQVZTSEE1MTIqIGN0eCwgdWludDhfdCAqZGlnZXN0KQoreworICAgIHVpbnQ2NF90IGkgPSAwOworICAgIHVpbnQ2NF90IGZpbmFsY291bnQgPSBhdl9iZTJuZTY0KGN0eC0+Y291bnQgPDwgMyk7CisKKyAgICBhdl9zaGE1MTJfdXBkYXRlKGN0eCwgIlwyMDAiLCAxKTsKKyAgICB3aGlsZSAoKGN0eC0+Y291bnQgJiAxMjcpICE9IDExMikKKyAgICAgICAgYXZfc2hhNTEyX3VwZGF0ZShjdHgsICIiLCAxKTsKKyAgICBhdl9zaGE1MTJfdXBkYXRlKGN0eCwgKHVpbnQ4X3QgKikmaSwgOCk7CisgICAgYXZfc2hhNTEyX3VwZGF0ZShjdHgsICh1aW50OF90ICopJmZpbmFsY291bnQsIDgpOyAvKiBTaG91bGQgY2F1c2UgYSB0cmFuc2Zvcm0oKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPmRpZ2VzdF9sZW47IGkrKykKKyAgICAgICAgQVZfV0I2NChkaWdlc3QgKyBpKjgsIGN0eC0+c3RhdGVbaV0pOworICAgIGlmIChjdHgtPmRpZ2VzdF9sZW4gJiAxKSAvKiBTSEE1MTIvMjI0IGlzIDI4IGJ5dGVzLCBhbmQgaXMgbm90IGRpdmlzaWJsZSBieSA4LiAqLworICAgICAgICBBVl9XQjMyKGRpZ2VzdCArIGkqOCwgY3R4LT5zdGF0ZVtpXSA+PiAzMik7Cit9CisKKyNpZmRlZiBURVNUCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgaSwgaiwgazsKKyAgICBBVlNIQTUxMiBjdHg7CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbNjRdOworICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuZ3Roc1s0XSA9IHsgMjI0LCAyNTYsIDM4NCwgNTEyIH07CisKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIGlmIChqIDwgMikgcHJpbnRmKCJUZXN0aW5nIFNIQS01MTIvJWRcbiIsIGxlbmd0aHNbal0pOworICAgICAgICBlbHNlICAgICAgIHByaW50ZigiVGVzdGluZyBTSEEtJWRcbiIsIGxlbmd0aHNbal0pOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKSB7CisgICAgICAgICAgICBhdl9zaGE1MTJfaW5pdCgmY3R4LCBsZW5ndGhzW2pdKTsKKyAgICAgICAgICAgIGlmIChrID09IDApCisgICAgICAgICAgICAgICAgYXZfc2hhNTEyX3VwZGF0ZSgmY3R4LCAiYWJjIiwgMyk7CisgICAgICAgICAgICBlbHNlIGlmIChrID09IDEpCisgICAgICAgICAgICAgICAgYXZfc2hhNTEyX3VwZGF0ZSgmY3R4LCAiYWJjZGVmZ2hiY2RlZmdoaWNkZWZnaGlqZGVmZ2hpamtlZmdoaWprbGZnaGlqa2xtZ2hpamtsbW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlqa2xtbm9pamtsbW5vcGprbG1ub3Bxa2xtbm9wcXJsbW5vcHFyc21ub3BxcnN0bm9wcXJzdHUiLCAxMTIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwKjEwMDA7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYXZfc2hhNTEyX3VwZGF0ZSgmY3R4LCAiYSIsIDEpOworICAgICAgICAgICAgYXZfc2hhNTEyX2ZpbmFsKCZjdHgsIGRpZ2VzdCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3Roc1tqXSA+PiAzOyBpKyspCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlMDJYIiwgZGlnZXN0W2ldKTsKKyAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChqKSB7IC8vdGVzdCB2ZWN0b3JzIChmcm9tIEZJUFMgUFVCIDE4MC00IEFwZW5kaXggQSkKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcHJpbnRmKCI0NjM0MjcwZiA3MDdiNmE1NCBkYWFlNzUzMCA0NjA4NDJlMiAwZTM3ZWQyNiA1Y2VlZTlhNCAzZTg5MjRhYVxuIgorICAgICAgICAgICAgICAgICAgICIyM2ZlYzViYiA5NGQ2MGIyMyAzMDgxOTI2NCAwYjBjNDUzMyAzNWQ2NjQ3MyA0ZmU0MGU3MiA2ODY3NGFmOVxuIgorICAgICAgICAgICAgICAgICAgICIzN2FiMzMxZCA3NmYwZDM2ZCBlNDIyYmQwZSBkZWIyMmEyOCBhY2NkNDg3YiA3YTg0NTNhZSA5NjVkZDI4N1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcHJpbnRmKCI1MzA0OGUyNiA4MTk0MWVmOSA5YjJlMjliNyA2YjRjN2RhYiBlNGMyZDBjNiAzNGZjNmQ0NiBlMGUyZjEzMSAwN2U3YWYyM1xuIgorICAgICAgICAgICAgICAgICAgICIzOTI4ZTE4NCBmYjg2OTBmOCA0MGRhMzk4OCAxMjFkMzFiZSA2NWNiOWQzZSBmODNlZTYxNCA2ZmVhYzg2MSBlMTliNTYzYVxuIgorICAgICAgICAgICAgICAgICAgICI5YTU5YTA1MiA5MzAxODdhOSA3MDM4Y2FlNiA5MmYzMDcwOCBhYTY0OTE5MiAzZWY1MTk0MyA5NGRjNjhkNSA2Yzc0ZmIyMVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcHJpbnRmKCJjYjAwNzUzZiA0NWEzNWU4YiBiNWEwM2Q2OSA5YWM2NTAwNyAyNzJjMzJhYiAwZWRlZDE2MyAiCisgICAgICAgICAgICAgICAgICAgIjFhOGI2MDVhIDQzZmY1YmVkIDgwODYwNzJiIGExZTdjYzIzIDU4YmFlY2ExIDM0YzgyNWE3XG4iCisgICAgICAgICAgICAgICAgICAgIjA5MzMwYzMzIGY3MTE0N2U4IDNkMTkyZmM3IDgyY2QxYjQ3IDUzMTExYjE3IDNiM2IwNWQyICIKKyAgICAgICAgICAgICAgICAgICAiMmZhMDgwODYgZTNiMGY3MTIgZmNjN2M3MWEgNTU3ZTJkYjkgNjZjM2U5ZmEgOTE3NDYwMzlcbiIKKyAgICAgICAgICAgICAgICAgICAiOWQwZTE4MDkgNzE2NDc0Y2IgMDg2ZTgzNGUgMzEwYTRhMWMgZWQxNDllOWMgMDBmMjQ4NTIgIgorICAgICAgICAgICAgICAgICAgICI3OTcyY2VjNSA3MDRjMmE1YiAwN2I4YjNkYyAzOGVjYzRlYiBhZTk3ZGRkOCA3ZjNkODk4NVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcHJpbnRmKCJkZGFmMzVhMSA5MzYxN2FiYSBjYzQxNzM0OSBhZTIwNDEzMSAxMmU2ZmE0ZSA4OWE5N2VhMiAwYTllZWVlNiA0YjU1ZDM5YSAiCisgICAgICAgICAgICAgICAgICAgIjIxOTI5OTJhIDI3NGZjMWE4IDM2YmEzYzIzIGEzZmVlYmJkIDQ1NGQ0NDIzIDY0M2NlODBlIDJhOWFjOTRmIGE1NGNhNDlmXG4iCisgICAgICAgICAgICAgICAgICAgIjhlOTU5Yjc1IGRhZTMxM2RhIDhjZjRmNzI4IDE0ZmMxNDNmIDhmNzc3OWM2IGViOWY3ZmExIDcyOTlhZWFkIGI2ODg5MDE4ICIKKyAgICAgICAgICAgICAgICAgICAiNTAxZDI4OWUgNDkwMGY3ZTQgMzMxYjk5ZGUgYzRiNTQzM2EgYzdkMzI5ZWUgYjZkZDI2NTQgNWU5NmU1NWIgODc0YmU5MDlcbiIKKyAgICAgICAgICAgICAgICAgICAiZTcxODQ4M2QgMGNlNzY5NjQgNGUyZTQyYzcgYmMxNWI0NjMgOGUxZjk4YjEgM2IyMDQ0MjggNTYzMmE4MDMgYWZhOTczZWIgIgorICAgICAgICAgICAgICAgICAgICJkZTBmZjI0NCA4NzdlYTYwYSA0Y2IwNDMyYyBlNTc3YzMxYiBlYjAwOWM1YyAyYzQ5YWEyZSA0ZWFkYjIxNyBhZDhjYzA5YlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3NoYTUxMi5oIGIvZmZtcGVnL2xpYmF2dXRpbC9zaGE1MTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjA4NzAxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC9zaGE1MTIuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSmFtZXMgQWxtZXIgPGphbXJpYWxAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9TSEE1MTJfSAorI2RlZmluZSBBVlVUSUxfU0hBNTEyX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2dV9zaGE1MTIgU0hBNTEyCisgKiBAaW5ncm91cCBsYXZ1X2NyeXB0bworICogQHsKKyAqLworCitleHRlcm4gY29uc3QgaW50IGF2X3NoYTUxMl9zaXplOworCitzdHJ1Y3QgQVZTSEE1MTI7CisKKy8qKgorICogQWxsb2NhdGUgYW4gQVZTSEE1MTIgY29udGV4dC4KKyAqLworc3RydWN0IEFWU0hBNTEyICphdl9zaGE1MTJfYWxsb2Modm9pZCk7CisKKy8qKgorICogSW5pdGlhbGl6ZSBTSEEtMiA1MTIgaGFzaGluZy4KKyAqCisgKiBAcGFyYW0gY29udGV4dCBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBjb250ZXh0IChvZiBzaXplIGF2X3NoYTUxMl9zaXplKQorICogQHBhcmFtIGJpdHMgICAgbnVtYmVyIG9mIGJpdHMgaW4gZGlnZXN0ICgyMjQsIDI1NiwgMzg0IG9yIDUxMiBiaXRzKQorICogQHJldHVybiAgICAgICAgemVybyBpZiBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQsIC0xIG90aGVyd2lzZQorICovCitpbnQgYXZfc2hhNTEyX2luaXQoc3RydWN0IEFWU0hBNTEyKiBjb250ZXh0LCBpbnQgYml0cyk7CisKKy8qKgorICogVXBkYXRlIGhhc2ggdmFsdWUuCisgKgorICogQHBhcmFtIGNvbnRleHQgaGFzaCBmdW5jdGlvbiBjb250ZXh0CisgKiBAcGFyYW0gZGF0YSAgICBpbnB1dCBkYXRhIHRvIHVwZGF0ZSBoYXNoIHdpdGgKKyAqIEBwYXJhbSBsZW4gICAgIGlucHV0IGRhdGEgbGVuZ3RoCisgKi8KK3ZvaWQgYXZfc2hhNTEyX3VwZGF0ZShzdHJ1Y3QgQVZTSEE1MTIqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHVuc2lnbmVkIGludCBsZW4pOworCisvKioKKyAqIEZpbmlzaCBoYXNoaW5nIGFuZCBvdXRwdXQgZGlnZXN0IHZhbHVlLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IGhhc2ggZnVuY3Rpb24gY29udGV4dAorICogQHBhcmFtIGRpZ2VzdCAgYnVmZmVyIHdoZXJlIG91dHB1dCBkaWdlc3QgdmFsdWUgaXMgc3RvcmVkCisgKi8KK3ZvaWQgYXZfc2hhNTEyX2ZpbmFsKHN0cnVjdCBBVlNIQTUxMiogY29udGV4dCwgdWludDhfdCAqZGlnZXN0KTsKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBVlVUSUxfU0hBNTEyX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvc29mdGZsb2F0LmMgYi9mZm1wZWcvbGliYXZ1dGlsL3NvZnRmbG9hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOWNmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3NvZnRmbG9hdC5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzb2Z0ZmxvYXQuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJsb2cuaCIKKworI3VuZGVmIHByaW50ZgorCitpbnQgbWFpbih2b2lkKXsKKyAgICBTb2Z0RmxvYXQgb25lPSBhdl9pbnQyc2YoMSwgMCk7CisgICAgU29mdEZsb2F0IHNmMSwgc2YyOworICAgIGRvdWJsZSBkMSwgZDI7CisgICAgaW50IGksIGo7CisgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOworCisgICAgZDE9IDE7CisgICAgZm9yKGk9IDA7IGk8MTA7IGkrKyl7CisgICAgICAgIGQxPSAxLyhkMSsxKTsKKyAgICB9CisgICAgcHJpbnRmKCJ0ZXN0MSBkb3VibGU9JWRcbiIsIChpbnQpKGQxICogKDE8PDI0KSkpOworCisgICAgc2YxPSBvbmU7CisgICAgZm9yKGk9IDA7IGk8MTA7IGkrKyl7CisgICAgICAgIHNmMT0gYXZfZGl2X3NmKG9uZSwgYXZfbm9ybWFsaXplX3NmKGF2X2FkZF9zZihvbmUsIHNmMSkpKTsKKyAgICB9CisgICAgcHJpbnRmKCJ0ZXN0MSBzZiAgICA9JWRcbiIsIGF2X3NmMmludChzZjEsIDI0KSk7CisKKworICAgIGZvcihpPSAwOyBpPDEwMDsgaSsrKXsKKyAgICAgICAgU1RBUlRfVElNRVIKKyAgICAgICAgZDE9IGk7CisgICAgICAgIGQyPSBpLzEwMC4wOworICAgICAgICBmb3Ioaj0gMDsgajwxMDAwOyBqKyspeworICAgICAgICAgICAgZDE9IChkMSsxKSpkMjsKKyAgICAgICAgfQorICAgICAgICBTVE9QX1RJTUVSKCJmbG9hdCBhZGQgbXVsIikKKyAgICB9CisgICAgcHJpbnRmKCJ0ZXN0MiBkb3VibGU9JWRcbiIsIChpbnQpKGQxICogKDE8PDI0KSkpOworCisgICAgZm9yKGk9IDA7IGk8MTAwOyBpKyspeworICAgICAgICBTVEFSVF9USU1FUgorICAgICAgICBzZjE9IGF2X2ludDJzZihpLCAwKTsKKyAgICAgICAgc2YyPSBhdl9kaXZfc2YoYXZfaW50MnNmKGksIDIpLCBhdl9pbnQyc2YoMjAwLCAzKSk7CisgICAgICAgIGZvcihqPSAwOyBqPDEwMDA7IGorKyl7CisgICAgICAgICAgICBzZjE9IGF2X211bF9zZihhdl9hZGRfc2Yoc2YxLCBvbmUpLHNmMik7CisgICAgICAgIH0KKyAgICAgICAgU1RPUF9USU1FUigic29mdGZsb2F0IGFkZCBtdWwiKQorICAgIH0KKyAgICBwcmludGYoInRlc3QyIHNmICAgID0lZCAoJWQgJWQpXG4iLCBhdl9zZjJpbnQoc2YxLCAyNCksIHNmMS5leHAsIHNmMS5tYW50KTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvc29mdGZsb2F0LmggYi9mZm1wZWcvbGliYXZ1dGlsL3NvZnRmbG9hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NDdlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3NvZnRmbG9hdC5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX1NPRlRGTE9BVF9ICisjZGVmaW5lIEFWVVRJTF9TT0ZURkxPQVRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNpbmNsdWRlICJhdmFzc2VydC5oIgorCisjZGVmaW5lIE1JTl9FWFAgLTEyNgorI2RlZmluZSBNQVhfRVhQICAxMjYKKyNkZWZpbmUgT05FX0JJVFMgMjkKKwordHlwZWRlZiBzdHJ1Y3QgU29mdEZsb2F0eworICAgIGludDMyX3QgIGV4cDsKKyAgICBpbnQzMl90IG1hbnQ7Cit9U29mdEZsb2F0OworCitzdGF0aWMgYXZfY29uc3QgU29mdEZsb2F0IGF2X25vcm1hbGl6ZV9zZihTb2Z0RmxvYXQgYSl7CisgICAgaWYoYS5tYW50KXsKKyNpZiAxCisgICAgICAgIHdoaWxlKChhLm1hbnQgKyAweDIwMDAwMDAwVSk8MHg0MDAwMDAwMFUpeworICAgICAgICAgICAgYS5tYW50ICs9IGEubWFudDsKKyAgICAgICAgICAgIGEuZXhwICAtPSAxOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpbnQgcz1PTkVfQklUUyArIDEgLSBhdl9sb2cyKGEubWFudCBeIChhLm1hbnQ8PDEpKTsKKyAgICAgICAgYS5leHAgICAtPSBzOworICAgICAgICBhLm1hbnQgPDw9IHM7CisjZW5kaWYKKyAgICAgICAgaWYoYS5leHAgPCBNSU5fRVhQKXsKKyAgICAgICAgICAgIGEuZXhwID0gTUlOX0VYUDsKKyAgICAgICAgICAgIGEubWFudD0gMDsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBhLmV4cD0gTUlOX0VYUDsKKyAgICB9CisgICAgcmV0dXJuIGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYXZfY29uc3QgU29mdEZsb2F0IGF2X25vcm1hbGl6ZTFfc2YoU29mdEZsb2F0IGEpeworI2lmIDEKKyAgICBpZigoaW50MzJfdCkoYS5tYW50ICsgMHg0MDAwMDAwMFUpIDwgMCl7CisgICAgICAgIGEuZXhwKys7CisgICAgICAgIGEubWFudD4+PTE7CisgICAgfQorICAgIGF2X2Fzc2VydDIoYS5tYW50IDwgMHg0MDAwMDAwMCAmJiBhLm1hbnQgPiAtMHg0MDAwMDAwMCk7CisgICAgcmV0dXJuIGE7CisjZWxpZiAxCisgICAgaW50IHQ9IGEubWFudCArIDB4NDAwMDAwMDAgPCAwOworICAgIHJldHVybiAoU29mdEZsb2F0KXthLmV4cCt0LCBhLm1hbnQ+PnR9OworI2Vsc2UKKyAgICBpbnQgdD0gKGEubWFudCArIDB4NDAwMDAwMDBVKT4+MzE7CisgICAgcmV0dXJuIChTb2Z0RmxvYXQpe2EuZXhwK3QsIGEubWFudD4+dH07CisjZW5kaWYKK30KKworLyoqCisgKiBAcmV0dXJuIFdpbGwgbm90IGJlIG1vcmUgZGVub3JtYWxpemVkIHRoYW4gYStiLiBTbyBpZiBlaXRoZXIgaW5wdXQgaXMKKyAqICAgICAgICAgbm9ybWFsaXplZCwgdGhlbiB0aGUgb3V0cHV0IHdpbGwgbm90IGJlIHdvcnNlIHRoZW4gdGhlIG90aGVyIGlucHV0LgorICogICAgICAgICBJZiBib3RoIGFyZSBub3JtYWxpemVkLCB0aGVuIHRoZSBvdXRwdXQgd2lsbCBiZSBub3JtYWxpemVkLgorICovCitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IFNvZnRGbG9hdCBhdl9tdWxfc2YoU29mdEZsb2F0IGEsIFNvZnRGbG9hdCBiKXsKKyAgICBhLmV4cCArPSBiLmV4cDsKKyAgICBhdl9hc3NlcnQyKChpbnQzMl90KSgoYS5tYW50ICogKGludDY0X3QpYi5tYW50KSA+PiBPTkVfQklUUykgPT0gKGEubWFudCAqIChpbnQ2NF90KWIubWFudCkgPj4gT05FX0JJVFMpOworICAgIGEubWFudCA9IChhLm1hbnQgKiAoaW50NjRfdCliLm1hbnQpID4+IE9ORV9CSVRTOworICAgIHJldHVybiBhdl9ub3JtYWxpemUxX3NmKGEpOworfQorCisvKioKKyAqIGIgaGFzIHRvIGJlIG5vcm1hbGl6ZWQgYW5kIG5vdCB6ZXJvLgorICogQHJldHVybiBXaWxsIG5vdCBiZSBtb3JlIGRlbm9ybWFsaXplZCB0aGFuIGEuCisgKi8KK3N0YXRpYyBhdl9jb25zdCBTb2Z0RmxvYXQgYXZfZGl2X3NmKFNvZnRGbG9hdCBhLCBTb2Z0RmxvYXQgYil7CisgICAgYS5leHAgLT0gYi5leHArMTsKKyAgICBhLm1hbnQgPSAoKGludDY0X3QpYS5tYW50PDwoT05FX0JJVFMrMSkpIC8gYi5tYW50OworICAgIHJldHVybiBhdl9ub3JtYWxpemUxX3NmKGEpOworfQorCitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IGludCBhdl9jbXBfc2YoU29mdEZsb2F0IGEsIFNvZnRGbG9hdCBiKXsKKyAgICBpbnQgdD0gYS5leHAgLSBiLmV4cDsKKyAgICBpZih0PDApIHJldHVybiAoYS5tYW50ID4+ICgtdCkpIC0gIGIubWFudCAgICAgIDsKKyAgICBlbHNlICAgIHJldHVybiAgYS5tYW50ICAgICAgICAgIC0gKGIubWFudCA+PiB0KTsKK30KKworc3RhdGljIGlubGluZSBhdl9jb25zdCBTb2Z0RmxvYXQgYXZfYWRkX3NmKFNvZnRGbG9hdCBhLCBTb2Z0RmxvYXQgYil7CisgICAgaW50IHQ9IGEuZXhwIC0gYi5leHA7CisgICAgaWYgICAgICAodCA8LTMxKSByZXR1cm4gYjsKKyAgICBlbHNlIGlmICh0IDwgIDApIHJldHVybiBhdl9ub3JtYWxpemUxX3NmKChTb2Z0RmxvYXQpe2IuZXhwLCBiLm1hbnQgKyAoYS5tYW50ID4+ICgtdCkpfSk7CisgICAgZWxzZSBpZiAodCA8IDMyKSByZXR1cm4gYXZfbm9ybWFsaXplMV9zZigoU29mdEZsb2F0KXthLmV4cCwgYS5tYW50ICsgKGIubWFudCA+PiAgIHQgKX0pOworICAgIGVsc2UgICAgICAgICAgICAgcmV0dXJuIGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYXZfY29uc3QgU29mdEZsb2F0IGF2X3N1Yl9zZihTb2Z0RmxvYXQgYSwgU29mdEZsb2F0IGIpeworICAgIHJldHVybiBhdl9hZGRfc2YoYSwgKFNvZnRGbG9hdCl7Yi5leHAsIC1iLm1hbnR9KTsKK30KKworLy9GSVhNRSBzcXJ0LCBsb2csIGV4cCwgcG93LCBzaW4sIGNvcworCitzdGF0aWMgaW5saW5lIGF2X2NvbnN0IFNvZnRGbG9hdCBhdl9pbnQyc2YoaW50IHYsIGludCBmcmFjX2JpdHMpeworICAgIHJldHVybiBhdl9ub3JtYWxpemVfc2YoKFNvZnRGbG9hdCl7T05FX0JJVFMtZnJhY19iaXRzLCB2fSk7Cit9CisKKy8qKgorICogUm91bmRpbmcgaXMgdG8gLWluZi4KKyAqLworc3RhdGljIGlubGluZSBhdl9jb25zdCBpbnQgYXZfc2YyaW50KFNvZnRGbG9hdCB2LCBpbnQgZnJhY19iaXRzKXsKKyAgICB2LmV4cCArPSBmcmFjX2JpdHMgLSBPTkVfQklUUzsKKyAgICBpZih2LmV4cCA+PSAwKSByZXR1cm4gdi5tYW50IDw8ICB2LmV4cCA7CisgICAgZWxzZSAgICAgICAgICAgcmV0dXJuIHYubWFudCA+Pigtdi5leHApOworfQorCisjZW5kaWYgLyogQVZVVElMX1NPRlRGTE9BVF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3N0ZXJlbzNkLmMgYi9mZm1wZWcvbGliYXZ1dGlsL3N0ZXJlbzNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBjZDkyOAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvc3RlcmVvM2QuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFZpdHRvcmlvIEdpb3ZhcmEgPHZpdHRvcmlvLmdpb3ZhcmFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJzdGVyZW8zZC5oIgorCitBVlN0ZXJlbzNEICphdl9zdGVyZW8zZF9hbGxvYyh2b2lkKQoreworICAgIHJldHVybiBhdl9tYWxsb2N6KHNpemVvZihBVlN0ZXJlbzNEKSk7Cit9CisKK0FWU3RlcmVvM0QgKmF2X3N0ZXJlbzNkX2NyZWF0ZV9zaWRlX2RhdGEoQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGcmFtZVNpZGVEYXRhICpzaWRlX2RhdGEgPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9GUkFNRV9EQVRBX1NURVJFTzNELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQVZTdGVyZW8zRCkpOworICAgIGlmICghc2lkZV9kYXRhKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1lbXNldChzaWRlX2RhdGEtPmRhdGEsIDAsIHNpemVvZihBVlN0ZXJlbzNEKSk7CisKKyAgICByZXR1cm4gKEFWU3RlcmVvM0QgKilzaWRlX2RhdGEtPmRhdGE7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3N0ZXJlbzNkLmggYi9mZm1wZWcvbGliYXZ1dGlsL3N0ZXJlbzNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzNWRjOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvc3RlcmVvM2QuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBWaXR0b3JpbyBHaW92YXJhIDx2aXR0b3Jpby5naW92YXJhQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfU1RFUkVPM0RfSAorI2RlZmluZSBBVlVUSUxfU1RFUkVPM0RfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJmcmFtZS5oIgorCisvKioKKyAqIExpc3Qgb2YgcG9zc2libGUgM0QgVHlwZXMKKyAqLworZW51bSBBVlN0ZXJlbzNEVHlwZSB7CisgICAgLyoqCisgICAgICogVmlkZW8gaXMgbm90IHN0ZXJlb3Njb3BpYyAoYW5kIG1ldGFkYXRhIGhhcyB0byBiZSB0aGVyZSkuCisgICAgICovCisgICAgQVZfU1RFUkVPM0RfMkQsCisKKyAgICAvKioKKyAgICAgKiBWaWV3cyBhcmUgbmV4dCB0byBlYWNoIG90aGVyLgorICAgICAqCisgICAgICogICAgTExMTFJSUlIKKyAgICAgKiAgICBMTExMUlJSUgorICAgICAqICAgIExMTExSUlJSCisgICAgICogICAgLi4uCisgICAgICovCisgICAgQVZfU1RFUkVPM0RfU0lERUJZU0lERSwKKworICAgIC8qKgorICAgICAqIFZpZXdzIGFyZSBvbiB0b3Agb2YgZWFjaCBvdGhlci4KKyAgICAgKgorICAgICAqICAgIExMTExMTExMCisgICAgICogICAgTExMTExMTEwKKyAgICAgKiAgICBSUlJSUlJSUgorICAgICAqICAgIFJSUlJSUlJSCisgICAgICovCisgICAgQVZfU1RFUkVPM0RfVE9QQk9UVE9NLAorCisgICAgLyoqCisgICAgICogVmlld3MgYXJlIGFsdGVybmF0ZWQgdGVtcG9yYWxseS4KKyAgICAgKgorICAgICAqICAgICBmcmFtZTAgICBmcmFtZTEgICBmcmFtZTIgICAuLi4KKyAgICAgKiAgICBMTExMTExMTCBSUlJSUlJSUiBMTExMTExMTAorICAgICAqICAgIExMTExMTExMIFJSUlJSUlJSIExMTExMTExMCisgICAgICogICAgTExMTExMTEwgUlJSUlJSUlIgTExMTExMTEwKKyAgICAgKiAgICAuLi4gICAgICAuLi4gICAgICAuLi4KKyAgICAgKi8KKyAgICBBVl9TVEVSRU8zRF9GUkFNRVNFUVVFTkNFLAorCisgICAgLyoqCisgICAgICogVmlld3MgYXJlIHBhY2tlZCBpbiBhIGNoZWNrZXJib2FyZC1saWtlIHN0cnVjdHVyZSBwZXIgcGl4ZWwuCisgICAgICoKKyAgICAgKiAgICBMUkxSTFJMUgorICAgICAqICAgIFJMUkxSTFJMCisgICAgICogICAgTFJMUkxSTFIKKyAgICAgKiAgICAuLi4KKyAgICAgKi8KKyAgICBBVl9TVEVSRU8zRF9DSEVDS0VSQk9BUkQsCisKKyAgICAvKioKKyAgICAgKiBWaWV3cyBhcmUgbmV4dCB0byBlYWNoIG90aGVyLCBidXQgd2hlbiB1cHNjYWxpbmcKKyAgICAgKiBhcHBseSBhIGNoZWNrZXJib2FyZCBwYXR0ZXJuLgorICAgICAqCisgICAgICogICAgIExMTExSUlJSICAgICAgICAgIEwgTCBMIEwgICAgUiBSIFIgUgorICAgICAqICAgICBMTExMUlJSUiAgICA9PiAgICAgTCBMIEwgTCAgUiBSIFIgUgorICAgICAqICAgICBMTExMUlJSUiAgICAgICAgICBMIEwgTCBMICAgIFIgUiBSIFIKKyAgICAgKiAgICAgTExMTFJSUlIgICAgICAgICAgIEwgTCBMIEwgIFIgUiBSIFIKKyAgICAgKi8KKyAgICBBVl9TVEVSRU8zRF9TSURFQllTSURFX1FVSU5DVU5YLAorCisgICAgLyoqCisgICAgICogVmlld3MgYXJlIHBhY2tlZCBwZXIgbGluZSwgYXMgaWYgaW50ZXJsYWNlZC4KKyAgICAgKgorICAgICAqICAgIExMTExMTExMCisgICAgICogICAgUlJSUlJSUlIKKyAgICAgKiAgICBMTExMTExMTAorICAgICAqICAgIC4uLgorICAgICAqLworICAgIEFWX1NURVJFTzNEX0xJTkVTLAorCisgICAgLyoqCisgICAgICogVmlld3MgYXJlIHBhY2tlZCBwZXIgY29sdW1uLgorICAgICAqCisgICAgICogICAgTFJMUkxSTFIKKyAgICAgKiAgICBMUkxSTFJMUgorICAgICAqICAgIExSTFJMUkxSCisgICAgICogICAgLi4uCisgICAgICovCisgICAgQVZfU1RFUkVPM0RfQ09MVU1OUywKK307CisKKworLyoqCisgKiBJbnZlcnRlZCB2aWV3cywgUmlnaHQvQm90dG9tIHJlcHJlc2VudHMgdGhlIGxlZnQgdmlldy4KKyAqLworI2RlZmluZSBBVl9TVEVSRU8zRF9GTEFHX0lOVkVSVCAgICAgKDEgPDwgMCkKKworLyoqCisgKiBTdGVyZW8gM0QgdHlwZTogdGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGhvdyB0d28gdmlkZW9zIGFyZSBwYWNrZWQKKyAqIHdpdGhpbiBhIHNpbmdsZSB2aWRlbyBzdXJmYWNlLCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYXMgbmVlZGVkLgorICoKKyAqIEBub3RlIFRoZSBzdHJ1Y3QgbXVzdCBiZSBhbGxvY2F0ZWQgd2l0aCBhdl9zdGVyZW8zZF9hbGxvYygpIGFuZAorICogICAgICAgaXRzIHNpemUgaXMgbm90IGEgcGFydCBvZiB0aGUgcHVibGljIEFCSS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZTdGVyZW8zRCB7CisgICAgLyoqCisgICAgICogSG93IHZpZXdzIGFyZSBwYWNrZWQgd2l0aGluIHRoZSB2aWRlby4KKyAgICAgKi8KKyAgICBlbnVtIEFWU3RlcmVvM0RUeXBlIHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcmFtZSBwYWNraW5nLgorICAgICAqLworICAgIGludCBmbGFnczsKK30gQVZTdGVyZW8zRDsKKworLyoqCisgKiBBbGxvY2F0ZSBhbiBBVlN0ZXJlbzNEIHN0cnVjdHVyZSBhbmQgc2V0IGl0cyBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuCisgKiBUaGUgcmVzdWx0aW5nIHN0cnVjdCBjYW4gYmUgZnJlZWQgdXNpbmcgYXZfZnJlZXAoKS4KKyAqCisgKiBAcmV0dXJuIEFuIEFWU3RlcmVvM0QgZmlsbGVkIHdpdGggZGVmYXVsdCB2YWx1ZXMgb3IgTlVMTCBvbiBmYWlsdXJlLgorICovCitBVlN0ZXJlbzNEICphdl9zdGVyZW8zZF9hbGxvYyh2b2lkKTsKKworLyoqCisgKiBBbGxvY2F0ZSBhIGNvbXBsZXRlIEFWRnJhbWVTaWRlRGF0YSBhbmQgYWRkIGl0IHRvIHRoZSBmcmFtZS4KKyAqCisgKiBAcGFyYW0gZnJhbWUgVGhlIGZyYW1lIHdoaWNoIHNpZGUgZGF0YSBpcyBhZGRlZCB0by4KKyAqCisgKiBAcmV0dXJuIFRoZSBBVlN0ZXJlbzNEIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgYnkgY2FsbGVyLgorICovCitBVlN0ZXJlbzNEICphdl9zdGVyZW8zZF9jcmVhdGVfc2lkZV9kYXRhKEFWRnJhbWUgKmZyYW1lKTsKKworI2VuZGlmIC8qIEFWVVRJTF9TVEVSRU8zRF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3RocmVhZC5oIGIvZmZtcGVnL2xpYmF2dXRpbC90aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdiNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC90aHJlYWQuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8vIFRoaXMgaGVhZGVyIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gc2ltcGxpZnkgY29kZSB3aGVyZQorLy8gdGhyZWFkaW5nIGlzIG9wdGlvbmFsLCBub3QgYXMgYSBnZW5lcmljIHRocmVhZGluZyBhYnN0cmFjdGlvbi4KKworI2lmbmRlZiBBVlVUSUxfVEhSRUFEX0gKKyNkZWZpbmUgQVZVVElMX1RIUkVBRF9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEhBVkVfUFRIUkVBRFMgfHwgSEFWRV9XMzJUSFJFQURTIHx8IEhBVkVfT1MyVEhSRUFEUworCisjZGVmaW5lIFVTRV9BVE9NSUNTIDAKKworI2lmIEhBVkVfUFRIUkVBRFMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZWxpZiBIQVZFX09TMlRIUkVBRFMKKyNpbmNsdWRlICJjb21wYXQvb3MydGhyZWFkcy5oIgorI2Vsc2UKKyNpbmNsdWRlICJjb21wYXQvdzMycHRocmVhZHMuaCIKKyNlbmRpZgorCisjZGVmaW5lIEFWTXV0ZXggcHRocmVhZF9tdXRleF90CisKKyNkZWZpbmUgZmZfbXV0ZXhfaW5pdCAgICBwdGhyZWFkX211dGV4X2luaXQKKyNkZWZpbmUgZmZfbXV0ZXhfbG9jayAgICBwdGhyZWFkX211dGV4X2xvY2sKKyNkZWZpbmUgZmZfbXV0ZXhfdW5sb2NrICBwdGhyZWFkX211dGV4X3VubG9jaworI2RlZmluZSBmZl9tdXRleF9kZXN0cm95IHB0aHJlYWRfbXV0ZXhfZGVzdHJveQorCisjZWxzZQorCisjZGVmaW5lIFVTRV9BVE9NSUNTIDEKKworI2RlZmluZSBBVk11dGV4IGNoYXIKKworI2RlZmluZSBmZl9tdXRleF9pbml0KG11dGV4LCBhdHRyKSAoMCkKKyNkZWZpbmUgZmZfbXV0ZXhfbG9jayhtdXRleCkgKDApCisjZGVmaW5lIGZmX211dGV4X3VubG9jayhtdXRleCkgKDApCisjZGVmaW5lIGZmX211dGV4X2Rlc3Ryb3kobXV0ZXgpICgwKQorCisjZW5kaWYKKworI2VuZGlmIC8qIEFWVVRJTF9USFJFQURfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC90aHJlYWRtZXNzYWdlLmMgYi9mZm1wZWcvbGliYXZ1dGlsL3RocmVhZG1lc3NhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ZjYmUyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC90aHJlYWRtZXNzYWdlLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImZpZm8uaCIKKyNpbmNsdWRlICJ0aHJlYWRtZXNzYWdlLmgiCisjaWYgSEFWRV9USFJFQURTCisjaWYgSEFWRV9QVEhSRUFEUworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbGlmIEhBVkVfVzMyVEhSRUFEUworI2luY2x1ZGUgImNvbXBhdC93MzJwdGhyZWFkcy5oIgorI2VsaWYgSEFWRV9PUzJUSFJFQURTCisjaW5jbHVkZSAiY29tcGF0L29zMnRocmVhZHMuaCIKKyNlbHNlCisjZXJyb3IgIlVua25vd24gdGhyZWFkcyBpbXBsZW1lbnRhdGlvbiIKKyNlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBBVlRocmVhZE1lc3NhZ2VRdWV1ZSB7CisjaWYgSEFWRV9USFJFQURTCisgICAgQVZGaWZvQnVmZmVyICpmaWZvOworICAgIHB0aHJlYWRfbXV0ZXhfdCBsb2NrOworICAgIHB0aHJlYWRfY29uZF90IGNvbmQ7CisgICAgaW50IGVycl9zZW5kOworICAgIGludCBlcnJfcmVjdjsKKyAgICB1bnNpZ25lZCBlbHNpemU7CisjZWxzZQorICAgIGludCBkdW1teTsKKyNlbmRpZgorfTsKKworaW50IGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX2FsbG9jKEFWVGhyZWFkTWVzc2FnZVF1ZXVlICoqbXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZWxzaXplKQoreworI2lmIEhBVkVfVEhSRUFEUworICAgIEFWVGhyZWFkTWVzc2FnZVF1ZXVlICpybXE7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAobmVsZW0gPiBJTlRfTUFYIC8gZWxzaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGlmICghKHJtcSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpybXEpKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaWYgKChyZXQgPSBwdGhyZWFkX211dGV4X2luaXQoJnJtcS0+bG9jaywgTlVMTCkpKSB7CisgICAgICAgIGF2X2ZyZWUocm1xKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IocmV0KTsKKyAgICB9CisgICAgaWYgKChyZXQgPSBwdGhyZWFkX2NvbmRfaW5pdCgmcm1xLT5jb25kLCBOVUxMKSkpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZybXEtPmxvY2spOworICAgICAgICBhdl9mcmVlKHJtcSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKHJldCk7CisgICAgfQorICAgIGlmICghKHJtcS0+ZmlmbyA9IGF2X2ZpZm9fYWxsb2MoZWxzaXplICogbmVsZW0pKSkgeworICAgICAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcm1xLT5jb25kKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZybXEtPmxvY2spOworICAgICAgICBhdl9mcmVlKHJtcSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKHJldCk7CisgICAgfQorICAgIHJtcS0+ZWxzaXplID0gZWxzaXplOworICAgICptcSA9IHJtcTsKKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgKm1xID0gTlVMTDsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworI2VuZGlmIC8qIEhBVkVfVEhSRUFEUyAqLworfQorCit2b2lkIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX2ZyZWUoQVZUaHJlYWRNZXNzYWdlUXVldWUgKiptcSkKK3sKKyNpZiBIQVZFX1RIUkVBRFMKKyAgICBpZiAoKm1xKSB7CisgICAgICAgIGF2X2ZpZm9fZnJlZXAoJigqbXEpLT5maWZvKTsKKyAgICAgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJigqbXEpLT5jb25kKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCYoKm1xKS0+bG9jayk7CisgICAgICAgIGF2X2ZyZWVwKG1xKTsKKyAgICB9CisjZW5kaWYKK30KKworI2lmIEhBVkVfVEhSRUFEUworCitzdGF0aWMgaW50IGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NlbmRfbG9ja2VkKEFWVGhyZWFkTWVzc2FnZVF1ZXVlICptcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgICB3aGlsZSAoIW1xLT5lcnJfc2VuZCAmJiBhdl9maWZvX3NwYWNlKG1xLT5maWZvKSA8IG1xLT5lbHNpemUpIHsKKyAgICAgICAgaWYgKChmbGFncyAmIEFWX1RIUkVBRF9NRVNTQUdFX05PTkJMT0NLKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZtcS0+Y29uZCwgJm1xLT5sb2NrKTsKKyAgICB9CisgICAgaWYgKG1xLT5lcnJfc2VuZCkKKyAgICAgICAgcmV0dXJuIG1xLT5lcnJfc2VuZDsKKyAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUobXEtPmZpZm8sIG1zZywgbXEtPmVsc2l6ZSwgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmbXEtPmNvbmQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3JlY3ZfbG9ja2VkKEFWVGhyZWFkTWVzc2FnZVF1ZXVlICptcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgICB3aGlsZSAoIW1xLT5lcnJfcmVjdiAmJiBhdl9maWZvX3NpemUobXEtPmZpZm8pIDwgbXEtPmVsc2l6ZSkgeworICAgICAgICBpZiAoKGZsYWdzICYgQVZfVEhSRUFEX01FU1NBR0VfTk9OQkxPQ0spKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJm1xLT5jb25kLCAmbXEtPmxvY2spOworICAgIH0KKyAgICBpZiAoYXZfZmlmb19zaXplKG1xLT5maWZvKSA8IG1xLT5lbHNpemUpCisgICAgICAgIHJldHVybiBtcS0+ZXJyX3JlY3Y7CisgICAgYXZfZmlmb19nZW5lcmljX3JlYWQobXEtPmZpZm8sIG1zZywgbXEtPmVsc2l6ZSwgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmbXEtPmNvbmQpOworICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogSEFWRV9USFJFQURTICovCisKK2ludCBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9zZW5kKEFWVGhyZWFkTWVzc2FnZVF1ZXVlICptcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKQoreworI2lmIEhBVkVfVEhSRUFEUworICAgIGludCByZXQ7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1xLT5sb2NrKTsKKyAgICByZXQgPSBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9zZW5kX2xvY2tlZChtcSwgbXNnLCBmbGFncyk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1xLT5sb2NrKTsKKyAgICByZXR1cm4gcmV0OworI2Vsc2UKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworI2VuZGlmIC8qIEhBVkVfVEhSRUFEUyAqLworfQorCitpbnQgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfcmVjdihBVlRocmVhZE1lc3NhZ2VRdWV1ZSAqbXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyNpZiBIQVZFX1RIUkVBRFMKKyAgICBpbnQgcmV0OworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtcS0+bG9jayk7CisgICAgcmV0ID0gYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfcmVjdl9sb2NrZWQobXEsIG1zZywgZmxhZ3MpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtcS0+bG9jayk7CisgICAgcmV0dXJuIHJldDsKKyNlbHNlCisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyNlbmRpZiAvKiBIQVZFX1RIUkVBRFMgKi8KK30KKwordm9pZCBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9zZXRfZXJyX3NlbmQoQVZUaHJlYWRNZXNzYWdlUXVldWUgKm1xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycikKK3sKKyNpZiBIQVZFX1RIUkVBRFMKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1xLT5sb2NrKTsKKyAgICBtcS0+ZXJyX3NlbmQgPSBlcnI7CisgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmbXEtPmNvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtcS0+bG9jayk7CisjZW5kaWYgLyogSEFWRV9USFJFQURTICovCit9CisKK3ZvaWQgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfc2V0X2Vycl9yZWN2KEFWVGhyZWFkTWVzc2FnZVF1ZXVlICptcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnIpCit7CisjaWYgSEFWRV9USFJFQURTCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtcS0+bG9jayk7CisgICAgbXEtPmVycl9yZWN2ID0gZXJyOworICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJm1xLT5jb25kKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXEtPmxvY2spOworI2VuZGlmIC8qIEhBVkVfVEhSRUFEUyAqLworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC90aHJlYWRtZXNzYWdlLmggYi9mZm1wZWcvbGliYXZ1dGlsL3RocmVhZG1lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODQ4MWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC90aHJlYWRtZXNzYWdlLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9USFJFQURNRVNTQUdFX0gKKyNkZWZpbmUgQVZVVElMX1RIUkVBRE1FU1NBR0VfSAorCit0eXBlZGVmIHN0cnVjdCBBVlRocmVhZE1lc3NhZ2VRdWV1ZSBBVlRocmVhZE1lc3NhZ2VRdWV1ZTsKKwordHlwZWRlZiBlbnVtIEFWVGhyZWFkTWVzc2FnZUZsYWdzIHsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gbm9uLWJsb2NraW5nIG9wZXJhdGlvbi4KKyAgICAgKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBzZW5kIGFuZCByZWN2IG9wZXJhdGlvbnMgYXJlIG5vbi1ibG9ja2luZyBhbmQKKyAgICAgKiByZXR1cm4gQVZFUlJPUihFQUdBSU4pIGltbWVkaWF0ZWx5IGlmIHRoZXkgY2FuIG5vdCBwcm9jZWVkLgorICAgICAqLworICAgIEFWX1RIUkVBRF9NRVNTQUdFX05PTkJMT0NLID0gMSwKKworfSBBVlRocmVhZE1lc3NhZ2VGbGFnczsKKworLyoqCisgKiBBbGxvY2F0ZSBhIG5ldyBtZXNzYWdlIHF1ZXVlLgorICoKKyAqIEBwYXJhbSBtcSAgICAgIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgcXVldWUKKyAqIEBwYXJhbSBuZWxlbSAgIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBxdWV1ZQorICogQHBhcmFtIGVsc2l6ZSAgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHF1ZXVlCisgKiBAcmV0dXJuICA+PTAgZm9yIHN1Y2Nlc3M7IDwwIGZvciBlcnJvciwgaW4gcGFydGljdWxhciBBVkVSUk9SKEVOT1NZUykgaWYKKyAqICAgICAgICAgIGxhdnUgd2FzIGJ1aWx0IHdpdGhvdXQgdGhyZWFkIHN1cHBvcnQKKyAqLworaW50IGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX2FsbG9jKEFWVGhyZWFkTWVzc2FnZVF1ZXVlICoqbXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZWxzaXplKTsKKworLyoqCisgKiBGcmVlIGEgbWVzc2FnZSBxdWV1ZS4KKyAqCisgKiBUaGUgbWVzc2FnZSBxdWV1ZSBtdXN0IG5vIGxvbmdlciBiZSBpbiB1c2UgYnkgYW5vdGhlciB0aHJlYWQuCisgKi8KK3ZvaWQgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfZnJlZShBVlRocmVhZE1lc3NhZ2VRdWV1ZSAqKm1xKTsKKworLyoqCisgKiBTZW5kIGEgbWVzc2FnZSBvbiB0aGUgcXVldWUuCisgKi8KK2ludCBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9zZW5kKEFWVGhyZWFkTWVzc2FnZVF1ZXVlICptcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKTsKKworLyoqCisgKiBSZWNlaXZlIGEgbWVzc2FnZSBmcm9tIHRoZSBxdWV1ZS4KKyAqLworaW50IGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3JlY3YoQVZUaHJlYWRNZXNzYWdlUXVldWUgKm1xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmxhZ3MpOworCisvKioKKyAqIFNldCB0aGUgc2VuZGluZyBlcnJvciBjb2RlLgorICoKKyAqIElmIHRoZSBlcnJvciBjb2RlIGlzIHNldCB0byBub24temVybywgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfcmVjdigpIHdpbGwKKyAqIHJldHVybiBpdCBpbW1lZGlhdGVseSB3aGVuIHRoZXJlIGFyZSBubyBsb25nZXIgYXZhaWxhYmxlIG1lc3NhZ2VzLgorICogQ29udmVudGlvbmFsIHZhbHVlcywgc3VjaCBhcyBBVkVSUk9SX0VPRiBvciBBVkVSUk9SKEVBR0FJTiksIGNhbiBiZSB1c2VkCisgKiB0byBjYXVzZSB0aGUgcmVjZWl2aW5nIHRocmVhZCB0byBzdG9wIG9yIHN1c3BlbmQgaXRzIG9wZXJhdGlvbi4KKyAqLwordm9pZCBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9zZXRfZXJyX3NlbmQoQVZUaHJlYWRNZXNzYWdlUXVldWUgKm1xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycik7CisKKy8qKgorICogU2V0IHRoZSByZWNlaXZpbmcgZXJyb3IgY29kZS4KKyAqCisgKiBJZiB0aGUgZXJyb3IgY29kZSBpcyBzZXQgdG8gbm9uLXplcm8sIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NlbmQoKSB3aWxsCisgKiByZXR1cm4gaXQgaW1tZWRpYXRlbHkuIENvbnZlbnRpb25hbCB2YWx1ZXMsIHN1Y2ggYXMgQVZFUlJPUl9FT0Ygb3IKKyAqIEFWRVJST1IoRUFHQUlOKSwgY2FuIGJlIHVzZWQgdG8gY2F1c2UgdGhlIHNlbmRpbmcgdGhyZWFkIHRvIHN0b3Agb3IKKyAqIHN1c3BlbmQgaXRzIG9wZXJhdGlvbi4KKyAqLwordm9pZCBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9zZXRfZXJyX3JlY3YoQVZUaHJlYWRNZXNzYWdlUXVldWUgKm1xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycik7CisKKyNlbmRpZiAvKiBBVlVUSUxfVEhSRUFETUVTU0FHRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3RpbWUuYyBiL2ZmbXBlZy9saWJhdnV0aWwvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYWVlMDIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3RpbWUuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX0dFVFRJTUVPRkRBWQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZiBIQVZFX1dJTkRPV1NfSAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidGltZS5oIgorI2luY2x1ZGUgImVycm9yLmgiCisKK2ludDY0X3QgYXZfZ2V0dGltZSh2b2lkKQoreworI2lmIEhBVkVfR0VUVElNRU9GREFZCisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgICAgcmV0dXJuIChpbnQ2NF90KXR2LnR2X3NlYyAqIDEwMDAwMDAgKyB0di50dl91c2VjOworI2VsaWYgSEFWRV9HRVRTWVNURU1USU1FQVNGSUxFVElNRQorICAgIEZJTEVUSU1FIGZ0OworICAgIGludDY0X3QgdDsKKyAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmZnQpOworICAgIHQgPSAoaW50NjRfdClmdC5kd0hpZ2hEYXRlVGltZSA8PCAzMiB8IGZ0LmR3TG93RGF0ZVRpbWU7CisgICAgcmV0dXJuIHQgLyAxMCAtIDExNjQ0NDczNjAwMDAwMDAwOyAvKiBKYW4gMSwgMTYwMSAqLworI2Vsc2UKKyAgICByZXR1cm4gLTE7CisjZW5kaWYKK30KKworaW50NjRfdCBhdl9nZXR0aW1lX3JlbGF0aXZlKHZvaWQpCit7CisjaWYgSEFWRV9DTE9DS19HRVRUSU1FICYmIGRlZmluZWQoQ0xPQ0tfTU9OT1RPTklDKQorICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKyAgICByZXR1cm4gKGludDY0X3QpdHMudHZfc2VjICogMTAwMDAwMCArIHRzLnR2X25zZWMgLyAxMDAwOworI2Vsc2UKKyAgICByZXR1cm4gYXZfZ2V0dGltZSgpICsgNDIgKiA2MCAqIDYwICogSU5UNjRfQygxMDAwMDAwKTsKKyNlbmRpZgorfQorCitpbnQgYXZfZ2V0dGltZV9yZWxhdGl2ZV9pc19tb25vdG9uaWModm9pZCkKK3sKKyNpZiBIQVZFX0NMT0NLX0dFVFRJTUUgJiYgZGVmaW5lZChDTE9DS19NT05PVE9OSUMpCisgICAgcmV0dXJuIDE7CisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK2ludCBhdl91c2xlZXAodW5zaWduZWQgdXNlYykKK3sKKyNpZiBIQVZFX05BTk9TTEVFUAorICAgIHN0cnVjdCB0aW1lc3BlYyB0cyA9IHsgdXNlYyAvIDEwMDAwMDAsIHVzZWMgJSAxMDAwMDAwICogMTAwMCB9OworICAgIHdoaWxlIChuYW5vc2xlZXAoJnRzLCAmdHMpIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgcmV0dXJuIDA7CisjZWxpZiBIQVZFX1VTTEVFUAorICAgIHJldHVybiB1c2xlZXAodXNlYyk7CisjZWxpZiBIQVZFX1NMRUVQCisgICAgU2xlZXAodXNlYyAvIDEwMDApOworICAgIHJldHVybiAwOworI2Vsc2UKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3RpbWUuaCBiL2ZmbXBlZy9saWJhdnV0aWwvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMTY5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3RpbWUuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX1RJTUVfSAorI2RlZmluZSBBVlVUSUxfVElNRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWNyb3NlY29uZHMuCisgKi8KK2ludDY0X3QgYXZfZ2V0dGltZSh2b2lkKTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWNyb3NlY29uZHMgc2luY2Ugc29tZSB1bnNwZWNpZmllZCBzdGFydGluZyBwb2ludC4KKyAqIE9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgaXQsIHRoZSB0aW1lIGNvbWVzIGZyb20gYSBtb25vdG9uaWMgY2xvY2sKKyAqIFRoaXMgcHJvcGVydHkgbWFrZXMgdGhpcyB0aW1lIHNvdXJjZSBpZGVhbCBmb3IgbWVhc3VyaW5nIHJlbGF0aXZlIHRpbWUuCisgKiBUaGUgcmV0dXJuZWQgdmFsdWVzIG1heSBub3QgYmUgbW9ub3RvbmljIG9uIHBsYXRmb3JtcyB3aGVyZSBhIG1vbm90b25pYworICogY2xvY2sgaXMgbm90IGF2YWlsYWJsZS4KKyAqLworaW50NjRfdCBhdl9nZXR0aW1lX3JlbGF0aXZlKHZvaWQpOworCisvKioKKyAqIEluZGljYXRlcyB3aXRoIGEgYm9vbGVhbiByZXN1bHQgaWYgdGhlIGF2X2dldHRpbWVfcmVsYXRpdmUoKSB0aW1lIHNvdXJjZQorICogaXMgbW9ub3RvbmljLgorICovCitpbnQgYXZfZ2V0dGltZV9yZWxhdGl2ZV9pc19tb25vdG9uaWModm9pZCk7CisKKy8qKgorICogU2xlZXAgZm9yIGEgcGVyaW9kIG9mIHRpbWUuICBBbHRob3VnaCB0aGUgZHVyYXRpb24gaXMgZXhwcmVzc2VkIGluCisgKiBtaWNyb3NlY29uZHMsIHRoZSBhY3R1YWwgZGVsYXkgbWF5IGJlIHJvdW5kZWQgdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUKKyAqIHN5c3RlbSB0aW1lci4KKyAqCisgKiBAcGFyYW0gIHVzZWMgTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyB0byBzbGVlcC4KKyAqIEByZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIChuZWdhdGl2ZSkgZXJyb3IgY29kZS4KKyAqLworaW50IGF2X3VzbGVlcCh1bnNpZ25lZCB1c2VjKTsKKworI2VuZGlmIC8qIEFWVVRJTF9USU1FX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvdGltZV9pbnRlcm5hbC5oIGIvZmZtcGVnL2xpYmF2dXRpbC90aW1lX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyYTc1YQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvdGltZV9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfVElNRV9JTlRFUk5BTF9ICisjZGVmaW5lIEFWVVRJTF9USU1FX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmICFIQVZFX0dNVElNRV9SICYmICFkZWZpbmVkKGdtdGltZV9yKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgdG0gKmdtdGltZV9yKGNvbnN0IHRpbWVfdCogY2xvY2ssIHN0cnVjdCB0bSAqcmVzdWx0KQoreworICAgIHN0cnVjdCB0bSAqcHRyID0gZ210aW1lKGNsb2NrKTsKKyAgICBpZiAoIXB0cikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgKnJlc3VsdCA9ICpwdHI7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisjaWYgIUhBVkVfTE9DQUxUSU1FX1IgJiYgIWRlZmluZWQobG9jYWx0aW1lX3IpCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0bSAqbG9jYWx0aW1lX3IoY29uc3QgdGltZV90KiBjbG9jaywgc3RydWN0IHRtICpyZXN1bHQpCit7CisgICAgc3RydWN0IHRtICpwdHIgPSBsb2NhbHRpbWUoY2xvY2spOworICAgIGlmICghcHRyKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAqcmVzdWx0ID0gKnB0cjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBVlVUSUxfVElNRV9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3RpbWVjb2RlLmMgYi9mZm1wZWcvbGliYXZ1dGlsL3RpbWVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmZDA0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvdGltZWNvZGUuYwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTbWFydGpvZyBTLkEuUywgQmFwdGlzdGUgQ291ZHVyaWVyIDxiYXB0aXN0ZS5jb3VkdXJpZXJAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIgU21hcnRqb2cgUy5BLlMsIENsw6ltZW50IELFk3NjaCA8Y2xlbWVudC5ib2VzY2hAc21hcnRqb2cuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBUaW1lY29kZSBoZWxwZXJzCisgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NNUFRFX3RpbWVfY29kZQorICogQHNlZSBodHRwOi8vd3d3LmRyb3BmcmFtZXRpbWVjb2RlLm9yZworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInRpbWVjb2RlLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKworaW50IGF2X3RpbWVjb2RlX2FkanVzdF9udHNjX2ZyYW1lbnVtMihpbnQgZnJhbWVudW0sIGludCBmcHMpCit7CisgICAgLyogb25seSB3b3JrcyBmb3IgTlRTQyAyOS45NyBhbmQgNTkuOTQgKi8KKyAgICBpbnQgZHJvcF9mcmFtZXMgPSAwOworICAgIGludCBkLCBtLCBmcmFtZXNfcGVyXzEwbWluczsKKworICAgIGlmIChmcHMgPT0gMzApIHsKKyAgICAgICAgZHJvcF9mcmFtZXMgPSAyOworICAgICAgICBmcmFtZXNfcGVyXzEwbWlucyA9IDE3OTgyOworICAgIH0gZWxzZSBpZiAoZnBzID09IDYwKSB7CisgICAgICAgIGRyb3BfZnJhbWVzID0gNDsKKyAgICAgICAgZnJhbWVzX3Blcl8xMG1pbnMgPSAzNTk2NDsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIGZyYW1lbnVtOworCisgICAgZCA9IGZyYW1lbnVtIC8gZnJhbWVzX3Blcl8xMG1pbnM7CisgICAgbSA9IGZyYW1lbnVtICUgZnJhbWVzX3Blcl8xMG1pbnM7CisKKyAgICByZXR1cm4gZnJhbWVudW0gKyA5ICogZHJvcF9mcmFtZXMgKiBkICsgZHJvcF9mcmFtZXMgKiAoKG0gLSBkcm9wX2ZyYW1lcykgLyAoZnJhbWVzX3Blcl8xMG1pbnMgLyAxMCkpOworfQorCit1aW50MzJfdCBhdl90aW1lY29kZV9nZXRfc21wdGVfZnJvbV9mcmFtZW51bShjb25zdCBBVlRpbWVjb2RlICp0YywgaW50IGZyYW1lbnVtKQoreworICAgIHVuc2lnbmVkIGZwcyA9IHRjLT5mcHM7CisgICAgaW50IGRyb3AgPSAhISh0Yy0+ZmxhZ3MgJiBBVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRSk7CisgICAgaW50IGhoLCBtbSwgc3MsIGZmOworCisgICAgZnJhbWVudW0gKz0gdGMtPnN0YXJ0OworICAgIGlmIChkcm9wKQorICAgICAgICBmcmFtZW51bSA9IGF2X3RpbWVjb2RlX2FkanVzdF9udHNjX2ZyYW1lbnVtMihmcmFtZW51bSwgdGMtPmZwcyk7CisgICAgZmYgPSBmcmFtZW51bSAlIGZwczsKKyAgICBzcyA9IGZyYW1lbnVtIC8gZnBzICAgICAgJSA2MDsKKyAgICBtbSA9IGZyYW1lbnVtIC8gKGZwcyo2MCkgJSA2MDsKKyAgICBoaCA9IGZyYW1lbnVtIC8gKGZwcyozNjAwKSAlIDI0OworICAgIHJldHVybiAwICAgICAgICAgPDwgMzEgfCAvLyBjb2xvciBmcmFtZSBmbGFnICgwOiB1bnN5bmMgbW9kZSwgMTogc3luYyBtb2RlKQorICAgICAgICAgICBkcm9wICAgICAgPDwgMzAgfCAvLyBkcm9wICBmcmFtZSBmbGFnICgwOiBub24gZHJvcCwgICAgMTogZHJvcCkKKyAgICAgICAgICAgKGZmIC8gMTApIDw8IDI4IHwgLy8gdGVucyAgb2YgZnJhbWVzCisgICAgICAgICAgIChmZiAlIDEwKSA8PCAyNCB8IC8vIHVuaXRzIG9mIGZyYW1lcworICAgICAgICAgICAwICAgICAgICAgPDwgMjMgfCAvLyBQQyAoTlRTQykgb3IgQkdGMCAoUEFMKQorICAgICAgICAgICAoc3MgLyAxMCkgPDwgMjAgfCAvLyB0ZW5zICBvZiBzZWNvbmRzCisgICAgICAgICAgIChzcyAlIDEwKSA8PCAxNiB8IC8vIHVuaXRzIG9mIHNlY29uZHMKKyAgICAgICAgICAgMCAgICAgICAgIDw8IDE1IHwgLy8gQkdGMCAoTlRTQykgb3IgQkdGMiAoUEFMKQorICAgICAgICAgICAobW0gLyAxMCkgPDwgMTIgfCAvLyB0ZW5zICBvZiBtaW51dGVzCisgICAgICAgICAgIChtbSAlIDEwKSA8PCAgOCB8IC8vIHVuaXRzIG9mIG1pbnV0ZXMKKyAgICAgICAgICAgMCAgICAgICAgIDw8ICA3IHwgLy8gQkdGMiAoTlRTQykgb3IgUEMgKFBBTCkKKyAgICAgICAgICAgMCAgICAgICAgIDw8ICA2IHwgLy8gQkdGMQorICAgICAgICAgICAoaGggLyAxMCkgPDwgIDQgfCAvLyB0ZW5zICBvZiBob3VycworICAgICAgICAgICAoaGggJSAxMCk7ICAgICAgICAvLyB1bml0cyBvZiBob3VycworfQorCitjaGFyICphdl90aW1lY29kZV9tYWtlX3N0cmluZyhjb25zdCBBVlRpbWVjb2RlICp0YywgY2hhciAqYnVmLCBpbnQgZnJhbWVudW0pCit7CisgICAgaW50IGZwcyA9IHRjLT5mcHM7CisgICAgaW50IGRyb3AgPSB0Yy0+ZmxhZ3MgJiBBVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRTsKKyAgICBpbnQgaGgsIG1tLCBzcywgZmYsIG5lZyA9IDA7CisKKyAgICBmcmFtZW51bSArPSB0Yy0+c3RhcnQ7CisgICAgaWYgKGRyb3ApCisgICAgICAgIGZyYW1lbnVtID0gYXZfdGltZWNvZGVfYWRqdXN0X250c2NfZnJhbWVudW0yKGZyYW1lbnVtLCBmcHMpOworICAgIGlmIChmcmFtZW51bSA8IDApIHsKKyAgICAgICAgZnJhbWVudW0gPSAtZnJhbWVudW07CisgICAgICAgIG5lZyA9IHRjLT5mbGFncyAmIEFWX1RJTUVDT0RFX0ZMQUdfQUxMT1dORUdBVElWRTsKKyAgICB9CisgICAgZmYgPSBmcmFtZW51bSAlIGZwczsKKyAgICBzcyA9IGZyYW1lbnVtIC8gZnBzICAgICAgICAlIDYwOworICAgIG1tID0gZnJhbWVudW0gLyAoZnBzKjYwKSAgICUgNjA7CisgICAgaGggPSBmcmFtZW51bSAvIChmcHMqMzYwMCk7CisgICAgaWYgKHRjLT5mbGFncyAmIEFWX1RJTUVDT0RFX0ZMQUdfMjRIT1VSU01BWCkKKyAgICAgICAgaGggPSBoaCAlIDI0OworICAgIHNucHJpbnRmKGJ1ZiwgQVZfVElNRUNPREVfU1RSX1NJWkUsICIlcyUwMmQ6JTAyZDolMDJkJWMlMDJkIiwKKyAgICAgICAgICAgICBuZWcgPyAiLSIgOiAiIiwKKyAgICAgICAgICAgICBoaCwgbW0sIHNzLCBkcm9wID8gJzsnIDogJzonLCBmZik7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHVuc2lnbmVkIGJjZDJ1aW50KHVpbnQ4X3QgYmNkKQoreworICAgdW5zaWduZWQgbG93ICA9IGJjZCAmIDB4ZjsKKyAgIHVuc2lnbmVkIGhpZ2ggPSBiY2QgPj4gNDsKKyAgIGlmIChsb3cgPiA5IHx8IGhpZ2ggPiA5KQorICAgICAgIHJldHVybiAwOworICAgcmV0dXJuIGxvdyArIDEwKmhpZ2g7Cit9CisKK2NoYXIgKmF2X3RpbWVjb2RlX21ha2Vfc21wdGVfdGNfc3RyaW5nKGNoYXIgKmJ1ZiwgdWludDMyX3QgdGNzbXB0ZSwgaW50IHByZXZlbnRfZGYpCit7CisgICAgdW5zaWduZWQgaGggICA9IGJjZDJ1aW50KHRjc21wdGUgICAgICYgMHgzZik7ICAgIC8vIDYtYml0IGhvdXJzCisgICAgdW5zaWduZWQgbW0gICA9IGJjZDJ1aW50KHRjc21wdGU+PjggICYgMHg3Zik7ICAgIC8vIDctYml0IG1pbnV0ZXMKKyAgICB1bnNpZ25lZCBzcyAgID0gYmNkMnVpbnQodGNzbXB0ZT4+MTYgJiAweDdmKTsgICAgLy8gNy1iaXQgc2Vjb25kcworICAgIHVuc2lnbmVkIGZmICAgPSBiY2QydWludCh0Y3NtcHRlPj4yNCAmIDB4M2YpOyAgICAvLyA2LWJpdCBmcmFtZXMKKyAgICB1bnNpZ25lZCBkcm9wID0gdGNzbXB0ZSAmIDE8PDMwICYmICFwcmV2ZW50X2RmOyAgLy8gMS1iaXQgZHJvcCBpZiBub3QgYXJiaXRyYXJ5IGJpdAorICAgIHNucHJpbnRmKGJ1ZiwgQVZfVElNRUNPREVfU1RSX1NJWkUsICIlMDJ1OiUwMnU6JTAydSVjJTAydSIsCisgICAgICAgICAgICAgaGgsIG1tLCBzcywgZHJvcCA/ICc7JyA6ICc6JywgZmYpOworICAgIHJldHVybiBidWY7Cit9CisKK2NoYXIgKmF2X3RpbWVjb2RlX21ha2VfbXBlZ190Y19zdHJpbmcoY2hhciAqYnVmLCB1aW50MzJfdCB0YzI1Yml0KQoreworICAgIHNucHJpbnRmKGJ1ZiwgQVZfVElNRUNPREVfU1RSX1NJWkUsICIlMDJ1OiUwMnU6JTAydSVjJTAydSIsCisgICAgICAgICAgICAgdGMyNWJpdD4+MTkgJiAweDFmLCAgICAgICAgICAgICAgLy8gNS1iaXQgaG91cnMKKyAgICAgICAgICAgICB0YzI1Yml0Pj4xMyAmIDB4M2YsICAgICAgICAgICAgICAvLyA2LWJpdCBtaW51dGVzCisgICAgICAgICAgICAgdGMyNWJpdD4+NiAgJiAweDNmLCAgICAgICAgICAgICAgLy8gNi1iaXQgc2Vjb25kcworICAgICAgICAgICAgIHRjMjViaXQgICAgICYgMTw8MjQgPyAnOycgOiAnOicsIC8vIDEtYml0IGRyb3AgZmxhZworICAgICAgICAgICAgIHRjMjViaXQgICAgICYgMHgzZik7ICAgICAgICAgICAgIC8vIDYtYml0IGZyYW1lcworICAgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZnBzKGludCBmcHMpCit7CisgICAgaW50IGk7CisgICAgc3RhdGljIGNvbnN0IGludCBzdXBwb3J0ZWRfZnBzW10gPSB7MjQsIDI1LCAzMCwgNDgsIDUwLCA2MH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoc3VwcG9ydGVkX2Zwcyk7IGkrKykKKyAgICAgICAgaWYgKGZwcyA9PSBzdXBwb3J0ZWRfZnBzW2ldKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGNoZWNrX3RpbWVjb2RlKHZvaWQgKmxvZ19jdHgsIEFWVGltZWNvZGUgKnRjKQoreworICAgIGlmICh0Yy0+ZnBzIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIlRpbWVjb2RlIGZyYW1lIHJhdGUgbXVzdCBiZSBzcGVjaWZpZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoKHRjLT5mbGFncyAmIEFWX1RJTUVDT0RFX0ZMQUdfRFJPUEZSQU1FKSAmJiB0Yy0+ZnBzICE9IDMwICYmIHRjLT5mcHMgIT0gNjApIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkRyb3AgZnJhbWUgaXMgb25seSBhbGxvd2VkIHdpdGggMzAwMDAvMTAwMSBvciA2MDAwMC8xMDAxIEZQU1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmIChjaGVja19mcHModGMtPmZwcykgPCAwKSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJUaW1lY29kZSBmcmFtZSByYXRlICVkLyVkIG5vdCBzdXBwb3J0ZWRcbiIsCisgICAgICAgICAgICAgICB0Yy0+cmF0ZS5udW0sIHRjLT5yYXRlLmRlbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnBzX2Zyb21fZnJhbWVfcmF0ZShBVlJhdGlvbmFsIHJhdGUpCit7CisgICAgaWYgKCFyYXRlLmRlbiB8fCAhcmF0ZS5udW0pCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gKHJhdGUubnVtICsgcmF0ZS5kZW4vMikgLyByYXRlLmRlbjsKK30KKworaW50IGF2X3RpbWVjb2RlX2NoZWNrX2ZyYW1lX3JhdGUoQVZSYXRpb25hbCByYXRlKQoreworICAgIHJldHVybiBjaGVja19mcHMoZnBzX2Zyb21fZnJhbWVfcmF0ZShyYXRlKSk7Cit9CisKK2ludCBhdl90aW1lY29kZV9pbml0KEFWVGltZWNvZGUgKnRjLCBBVlJhdGlvbmFsIHJhdGUsIGludCBmbGFncywgaW50IGZyYW1lX3N0YXJ0LCB2b2lkICpsb2dfY3R4KQoreworICAgIG1lbXNldCh0YywgMCwgc2l6ZW9mKCp0YykpOworICAgIHRjLT5zdGFydCA9IGZyYW1lX3N0YXJ0OworICAgIHRjLT5mbGFncyA9IGZsYWdzOworICAgIHRjLT5yYXRlICA9IHJhdGU7CisgICAgdGMtPmZwcyAgID0gZnBzX2Zyb21fZnJhbWVfcmF0ZShyYXRlKTsKKyAgICByZXR1cm4gY2hlY2tfdGltZWNvZGUobG9nX2N0eCwgdGMpOworfQorCitpbnQgYXZfdGltZWNvZGVfaW5pdF9mcm9tX3N0cmluZyhBVlRpbWVjb2RlICp0YywgQVZSYXRpb25hbCByYXRlLCBjb25zdCBjaGFyICpzdHIsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgY2hhciBjOworICAgIGludCBoaCwgbW0sIHNzLCBmZiwgcmV0OworCisgICAgaWYgKHNzY2FuZihzdHIsICIlZDolZDolZCVjJWQiLCAmaGgsICZtbSwgJnNzLCAmYywgJmZmKSAhPSA1KSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcGFyc2UgdGltZWNvZGUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5bnRheDogaGg6bW06c3NbOjsuXWZmXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgbWVtc2V0KHRjLCAwLCBzaXplb2YoKnRjKSk7CisgICAgdGMtPmZsYWdzID0gYyAhPSAnOicgPyBBVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRSA6IDA7IC8vIGRyb3AgaWYgJzsnLCAnLicsIC4uLgorICAgIHRjLT5yYXRlICA9IHJhdGU7CisgICAgdGMtPmZwcyAgID0gZnBzX2Zyb21fZnJhbWVfcmF0ZShyYXRlKTsKKworICAgIHJldCA9IGNoZWNrX3RpbWVjb2RlKGxvZ19jdHgsIHRjKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHRjLT5zdGFydCA9IChoaCozNjAwICsgbW0qNjAgKyBzcykgKiB0Yy0+ZnBzICsgZmY7CisgICAgaWYgKHRjLT5mbGFncyAmIEFWX1RJTUVDT0RFX0ZMQUdfRFJPUEZSQU1FKSB7IC8qIGFkanVzdCBmcmFtZSBudW1iZXIgKi8KKyAgICAgICAgaW50IHRtaW5zID0gNjAqaGggKyBtbTsKKyAgICAgICAgdGMtPnN0YXJ0IC09IDIgKiAodG1pbnMgLSB0bWlucy8xMCk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC90aW1lY29kZS5oIGIvZmZtcGVnL2xpYmF2dXRpbC90aW1lY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTM5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3RpbWVjb2RlLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU21hcnRqb2cgUy5BLlMsIEJhcHRpc3RlIENvdWR1cmllciA8YmFwdGlzdGUuY291ZHVyaWVyQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyIFNtYXJ0am9nIFMuQS5TLCBDbMOpbWVudCBCxZNzY2ggPGNsZW1lbnQuYm9lc2NoQHNtYXJ0am9nLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVGltZWNvZGUgaGVscGVycyBoZWFkZXIKKyAqLworCisjaWZuZGVmIEFWVVRJTF9USU1FQ09ERV9ICisjZGVmaW5lIEFWVVRJTF9USU1FQ09ERV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJyYXRpb25hbC5oIgorCisjZGVmaW5lIEFWX1RJTUVDT0RFX1NUUl9TSVpFIDE2CisKK2VudW0gQVZUaW1lY29kZUZsYWcgeworICAgIEFWX1RJTUVDT0RFX0ZMQUdfRFJPUEZSQU1FICAgICAgPSAxPDwwLCAvLy88IHRpbWVjb2RlIGlzIGRyb3AgZnJhbWUKKyAgICBBVl9USU1FQ09ERV9GTEFHXzI0SE9VUlNNQVggICAgID0gMTw8MSwgLy8vPCB0aW1lY29kZSB3cmFwcyBhZnRlciAyNCBob3VycworICAgIEFWX1RJTUVDT0RFX0ZMQUdfQUxMT1dORUdBVElWRSAgPSAxPDwyLCAvLy88IG5lZ2F0aXZlIHRpbWUgdmFsdWVzIGFyZSBhbGxvd2VkCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHN0YXJ0OyAgICAgICAgICAvLy88IHRpbWVjb2RlIGZyYW1lIHN0YXJ0IChmaXJzdCBiYXNlIGZyYW1lIG51bWJlcikKKyAgICB1aW50MzJfdCBmbGFnczsgICAgIC8vLzwgZmxhZ3Mgc3VjaCBhcyBkcm9wIGZyYW1lLCArMjQgaG91cnMgc3VwcG9ydCwgLi4uCisgICAgQVZSYXRpb25hbCByYXRlOyAgICAvLy88IGZyYW1lIHJhdGUgaW4gcmF0aW9uYWwgZm9ybQorICAgIHVuc2lnbmVkIGZwczsgICAgICAgLy8vPCBmcmFtZSBwZXIgc2Vjb25kOyBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmF0ZSBmaWVsZAorfSBBVlRpbWVjb2RlOworCisvKioKKyAqIEFkanVzdCBmcmFtZSBudW1iZXIgZm9yIE5UU0MgZHJvcCBmcmFtZSB0aW1lIGNvZGUuCisgKgorICogQHBhcmFtIGZyYW1lbnVtIGZyYW1lIG51bWJlciB0byBhZGp1c3QKKyAqIEBwYXJhbSBmcHMgICAgICBmcmFtZSBwZXIgc2Vjb25kLCAzMCBvciA2MAorICogQHJldHVybiAgICAgICAgIGFkanVzdGVkIGZyYW1lIG51bWJlcgorICogQHdhcm5pbmcgICAgICAgIGFkanVzdG1lbnQgaXMgb25seSB2YWxpZCBpbiBOVFNDIDI5Ljk3IGFuZCA1OS45NAorICovCitpbnQgYXZfdGltZWNvZGVfYWRqdXN0X250c2NfZnJhbWVudW0yKGludCBmcmFtZW51bSwgaW50IGZwcyk7CisKKy8qKgorICogQ29udmVydCBmcmFtZSBudW1iZXIgdG8gU01QVEUgMTJNIGJpbmFyeSByZXByZXNlbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdGMgICAgICAgdGltZWNvZGUgZGF0YSBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQKKyAqIEBwYXJhbSBmcmFtZW51bSBmcmFtZSBudW1iZXIKKyAqIEByZXR1cm4gICAgICAgICB0aGUgU01QVEUgYmluYXJ5IHJlcHJlc2VudGF0aW9uCisgKgorICogQG5vdGUgRnJhbWUgbnVtYmVyIGFkanVzdG1lbnQgaXMgYXV0b21hdGljYWxseSBkb25lIGluIGNhc2Ugb2YgZHJvcCB0aW1lY29kZSwKKyAqICAgICAgIHlvdSBkbyBOT1QgaGF2ZSB0byBjYWxsIGF2X3RpbWVjb2RlX2FkanVzdF9udHNjX2ZyYW1lbnVtMigpLgorICogQG5vdGUgVGhlIGZyYW1lIG51bWJlciBpcyByZWxhdGl2ZSB0byB0Yy0+c3RhcnQuCisgKiBAbm90ZSBDb2xvciBmcmFtZSAoQ0YpLCBiaW5hcnkgZ3JvdXAgZmxhZ3MgKEJHRikgYW5kIGJpcGhhc2UgbWFyayBwb2xhcml0eQorICogICAgICAgY29ycmVjdGlvbiAoUEMpIGJpdHMgYXJlIHNldCB0byB6ZXJvLgorICovCit1aW50MzJfdCBhdl90aW1lY29kZV9nZXRfc21wdGVfZnJvbV9mcmFtZW51bShjb25zdCBBVlRpbWVjb2RlICp0YywgaW50IGZyYW1lbnVtKTsKKworLyoqCisgKiBMb2FkIHRpbWVjb2RlIHN0cmluZyBpbiBidWYuCisgKgorICogQHBhcmFtIGJ1ZiAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlciwgbXVzdCBiZSBhdCBsZWFzdCBBVl9USU1FQ09ERV9TVFJfU0laRSBsb25nCisgKiBAcGFyYW0gdGMgICAgICAgdGltZWNvZGUgZGF0YSBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQKKyAqIEBwYXJhbSBmcmFtZW51bSBmcmFtZSBudW1iZXIKKyAqIEByZXR1cm4gICAgICAgICB0aGUgYnVmIHBhcmFtZXRlcgorICoKKyAqIEBub3RlIFRpbWVjb2RlIHJlcHJlc2VudGF0aW9uIGNhbiBiZSBhIG5lZ2F0aXZlIHRpbWVjb2RlIGFuZCBoYXZlIG1vcmUgdGhhbgorICogICAgICAgMjQgaG91cnMsIGJ1dCB3aWxsIG9ubHkgYmUgaG9ub3JlZCBpZiB0aGUgZmxhZ3MgYXJlIGNvcnJlY3RseSBzZXQuCisgKiBAbm90ZSBUaGUgZnJhbWUgbnVtYmVyIGlzIHJlbGF0aXZlIHRvIHRjLT5zdGFydC4KKyAqLworY2hhciAqYXZfdGltZWNvZGVfbWFrZV9zdHJpbmcoY29uc3QgQVZUaW1lY29kZSAqdGMsIGNoYXIgKmJ1ZiwgaW50IGZyYW1lbnVtKTsKKworLyoqCisgKiBHZXQgdGhlIHRpbWVjb2RlIHN0cmluZyBmcm9tIHRoZSBTTVBURSB0aW1lY29kZSBmb3JtYXQuCisgKgorICogQHBhcmFtIGJ1ZiAgICAgICAgZGVzdGluYXRpb24gYnVmZmVyLCBtdXN0IGJlIGF0IGxlYXN0IEFWX1RJTUVDT0RFX1NUUl9TSVpFIGxvbmcKKyAqIEBwYXJhbSB0Y3NtcHRlICAgIHRoZSAzMi1iaXQgU01QVEUgdGltZWNvZGUKKyAqIEBwYXJhbSBwcmV2ZW50X2RmIHByZXZlbnQgdGhlIHVzZSBvZiBhIGRyb3AgZmxhZyB3aGVuIGl0IGlzIGtub3duIHRoZSBERiBiaXQKKyAqICAgICAgICAgICAgICAgICAgIGlzIGFyYml0cmFyeQorICogQHJldHVybiAgICAgICAgICAgdGhlIGJ1ZiBwYXJhbWV0ZXIKKyAqLworY2hhciAqYXZfdGltZWNvZGVfbWFrZV9zbXB0ZV90Y19zdHJpbmcoY2hhciAqYnVmLCB1aW50MzJfdCB0Y3NtcHRlLCBpbnQgcHJldmVudF9kZik7CisKKy8qKgorICogR2V0IHRoZSB0aW1lY29kZSBzdHJpbmcgZnJvbSB0aGUgMjUtYml0IHRpbWVjb2RlIGZvcm1hdCAoTVBFRyBHT1AgZm9ybWF0KS4KKyAqCisgKiBAcGFyYW0gYnVmICAgICBkZXN0aW5hdGlvbiBidWZmZXIsIG11c3QgYmUgYXQgbGVhc3QgQVZfVElNRUNPREVfU1RSX1NJWkUgbG9uZworICogQHBhcmFtIHRjMjViaXQgdGhlIDI1LWJpdHMgdGltZWNvZGUKKyAqIEByZXR1cm4gICAgICAgIHRoZSBidWYgcGFyYW1ldGVyCisgKi8KK2NoYXIgKmF2X3RpbWVjb2RlX21ha2VfbXBlZ190Y19zdHJpbmcoY2hhciAqYnVmLCB1aW50MzJfdCB0YzI1Yml0KTsKKworLyoqCisgKiBJbml0IGEgdGltZWNvZGUgc3RydWN0IHdpdGggdGhlIHBhc3NlZCBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSBsb2dfY3R4ICAgICBhIHBvaW50ZXIgdG8gYW4gYXJiaXRyYXJ5IHN0cnVjdCBvZiB3aGljaCB0aGUgZmlyc3QgZmllbGQKKyAqICAgICAgICAgICAgICAgICAgICBpcyBhIHBvaW50ZXIgdG8gYW4gQVZDbGFzcyBzdHJ1Y3QgKHVzZWQgZm9yIGF2X2xvZykKKyAqIEBwYXJhbSB0YyAgICAgICAgICBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBBVlRpbWVjb2RlCisgKiBAcGFyYW0gcmF0ZSAgICAgICAgZnJhbWUgcmF0ZSBpbiByYXRpb25hbCBmb3JtCisgKiBAcGFyYW0gZmxhZ3MgICAgICAgbWlzY2VsbGFuZW91cyBmbGFncyBzdWNoIGFzIGRyb3AgZnJhbWUsICsyNCBob3VycywgLi4uCisgKiAgICAgICAgICAgICAgICAgICAgKHNlZSBBVlRpbWVjb2RlRmxhZykKKyAqIEBwYXJhbSBmcmFtZV9zdGFydCB0aGUgZmlyc3QgZnJhbWUgbnVtYmVyCisgKiBAcmV0dXJuICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBBVkVSUk9SIG90aGVyd2lzZQorICovCitpbnQgYXZfdGltZWNvZGVfaW5pdChBVlRpbWVjb2RlICp0YywgQVZSYXRpb25hbCByYXRlLCBpbnQgZmxhZ3MsIGludCBmcmFtZV9zdGFydCwgdm9pZCAqbG9nX2N0eCk7CisKKy8qKgorICogUGFyc2UgdGltZWNvZGUgcmVwcmVzZW50YXRpb24gKGhoOm1tOnNzWzo7Ll1mZikuCisgKgorICogQHBhcmFtIGxvZ19jdHggYSBwb2ludGVyIHRvIGFuIGFyYml0cmFyeSBzdHJ1Y3Qgb2Ygd2hpY2ggdGhlIGZpcnN0IGZpZWxkIGlzIGEKKyAqICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gQVZDbGFzcyBzdHJ1Y3QgKHVzZWQgZm9yIGF2X2xvZykuCisgKiBAcGFyYW0gdGMgICAgICBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBBVlRpbWVjb2RlCisgKiBAcGFyYW0gcmF0ZSAgICBmcmFtZSByYXRlIGluIHJhdGlvbmFsIGZvcm0KKyAqIEBwYXJhbSBzdHIgICAgIHRpbWVjb2RlIHN0cmluZyB3aGljaCB3aWxsIGRldGVybWluZSB0aGUgZnJhbWUgc3RhcnQKKyAqIEByZXR1cm4gICAgICAgIDAgb24gc3VjY2VzcywgQVZFUlJPUiBvdGhlcndpc2UKKyAqLworaW50IGF2X3RpbWVjb2RlX2luaXRfZnJvbV9zdHJpbmcoQVZUaW1lY29kZSAqdGMsIEFWUmF0aW9uYWwgcmF0ZSwgY29uc3QgY2hhciAqc3RyLCB2b2lkICpsb2dfY3R4KTsKKworLyoqCisgKiBDaGVjayBpZiB0aGUgdGltZWNvZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBnaXZlbiBmcmFtZSByYXRlCisgKgorICogQHJldHVybiAwIGlmIHN1cHBvcnRlZCwgPDAgb3RoZXJ3aXNlCisgKi8KK2ludCBhdl90aW1lY29kZV9jaGVja19mcmFtZV9yYXRlKEFWUmF0aW9uYWwgcmF0ZSk7CisKKyNlbmRpZiAvKiBBVlVUSUxfVElNRUNPREVfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC90aW1lci5oIGIvZmZtcGVnL2xpYmF2dXRpbC90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTNjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3RpbWVyLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBoaWdoIHByZWNpc2lvbiB0aW1lciwgdXNlZnVsIHRvIHByb2ZpbGUgY29kZQorICovCisKKyNpZm5kZWYgQVZVVElMX1RJTUVSX0gKKyNkZWZpbmUgQVZVVElMX1RJTUVSX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEhBVkVfTUFDSF9NQUNIX1RJTUVfSAorI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxvZy5oIgorCisjaWYgICBBUkNIX0FSTQorIyAgIGluY2x1ZGUgImFybS90aW1lci5oIgorI2VsaWYgQVJDSF9QUEMKKyMgICBpbmNsdWRlICJwcGMvdGltZXIuaCIKKyNlbGlmIEFSQ0hfWDg2CisjICAgaW5jbHVkZSAieDg2L3RpbWVyLmgiCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEFWX1JFQURfVElNRSkKKyMgICBpZiBIQVZFX0dFVEhSVElNRQorIyAgICAgICBkZWZpbmUgQVZfUkVBRF9USU1FIGdldGhydGltZQorIyAgIGVsaWYgSEFWRV9NQUNIX0FCU09MVVRFX1RJTUUKKyMgICAgICAgZGVmaW5lIEFWX1JFQURfVElNRSBtYWNoX2Fic29sdXRlX3RpbWUKKyMgICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkZfVElNRVJfVU5JVFMKKyMgICBkZWZpbmUgRkZfVElNRVJfVU5JVFMgIlVOSVRTIgorI2VuZGlmCisKKyNpZmRlZiBBVl9SRUFEX1RJTUUKKyNkZWZpbmUgU1RBUlRfVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0c3RhcnQgPSBBVl9SRUFEX1RJTUUoKTsgICAgICAgICAgIFwKKworI2RlZmluZSBTVE9QX1RJTUVSKGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVuZCA9IEFWX1JFQURfVElNRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgdWludDY0X3QgdHN1bSAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyBpbnQgdGNvdW50ICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdGljIGludCB0c2tpcF9jb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAodGNvdW50IDwgMiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW5kIC0gdHN0YXJ0IDwgOCAqIHRzdW0gLyB0Y291bnQgfHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbmQgLSB0c3RhcnQgPCAyMDAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHN1bSs9IHRlbmQgLSB0c3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0Y291bnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHNraXBfY291bnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoKHRjb3VudCArIHRza2lwX2NvdW50KSAmICh0Y291bnQgKyB0c2tpcF9jb3VudCAtIDEpKSA9PSAwKSB7IFwKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICIlIlBSSXU2NCIgIiBGRl9USU1FUl9VTklUUyAiIGluICVzLCAlZCBydW5zLCAlZCBza2lwc1xuIiwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIHRzdW0gKiAxMCAvIHRjb3VudCwgaWQsIHRjb3VudCwgdHNraXBfY291bnQpOyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBTVEFSVF9USU1FUgorI2RlZmluZSBTVE9QX1RJTUVSKGlkKSB7IH0KKyNlbmRpZgorCisjZW5kaWYgLyogQVZVVElMX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvdGltZXN0YW1wLmggYi9mZm1wZWcvbGliYXZ1dGlsL3RpbWVzdGFtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMTBhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3RpbWVzdGFtcC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogdGltZXN0YW1wIHV0aWxzLCBtb3N0bHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcvbG9nZ2luZyBwdXJwb3NlcworICovCisKKyNpZm5kZWYgQVZVVElMX1RJTUVTVEFNUF9ICisjZGVmaW5lIEFWVVRJTF9USU1FU1RBTVBfSAorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChfX1NURENfRk9STUFUX01BQ1JPUykgJiYgIWRlZmluZWQoUFJJZDY0KQorI2Vycm9yIG1pc3NpbmcgLURfX1NURENfRk9STUFUX01BQ1JPUyAvICNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKKyNlbmRpZgorCisjZGVmaW5lIEFWX1RTX01BWF9TVFJJTkdfU0laRSAzMgorCisvKioKKyAqIEZpbGwgdGhlIHByb3ZpZGVkIGJ1ZmZlciB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB0aW1lc3RhbXAKKyAqIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIEBwYXJhbSBidWYgYSBidWZmZXIgd2l0aCBzaXplIGluIGJ5dGVzIG9mIGF0IGxlYXN0IEFWX1RTX01BWF9TVFJJTkdfU0laRQorICogQHBhcmFtIHRzIHRoZSB0aW1lc3RhbXAgdG8gcmVwcmVzZW50CisgKiBAcmV0dXJuIHRoZSBidWZmZXIgaW4gaW5wdXQKKyAqLworc3RhdGljIGlubGluZSBjaGFyICphdl90c19tYWtlX3N0cmluZyhjaGFyICpidWYsIGludDY0X3QgdHMpCit7CisgICAgaWYgKHRzID09IEFWX05PUFRTX1ZBTFVFKSBzbnByaW50ZihidWYsIEFWX1RTX01BWF9TVFJJTkdfU0laRSwgIk5PUFRTIik7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIEFWX1RTX01BWF9TVFJJTkdfU0laRSwgIiUiUFJJZDY0LCB0cyk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworLyoqCisgKiBDb252ZW5pZW5jZSBtYWNybywgdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgdXNlZCBvbmx5IGRpcmVjdGx5IGluCisgKiBmdW5jdGlvbiBhcmd1bWVudHMgYnV0IG5ldmVyIHN0YW5kLWFsb25lLgorICovCisjZGVmaW5lIGF2X3RzMnN0cih0cykgYXZfdHNfbWFrZV9zdHJpbmcoKGNoYXJbQVZfVFNfTUFYX1NUUklOR19TSVpFXSl7MH0sIHRzKQorCisvKioKKyAqIEZpbGwgdGhlIHByb3ZpZGVkIGJ1ZmZlciB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB0aW1lc3RhbXAgdGltZQorICogcmVwcmVzZW50YXRpb24uCisgKgorICogQHBhcmFtIGJ1ZiBhIGJ1ZmZlciB3aXRoIHNpemUgaW4gYnl0ZXMgb2YgYXQgbGVhc3QgQVZfVFNfTUFYX1NUUklOR19TSVpFCisgKiBAcGFyYW0gdHMgdGhlIHRpbWVzdGFtcCB0byByZXByZXNlbnQKKyAqIEBwYXJhbSB0YiB0aGUgdGltZWJhc2Ugb2YgdGhlIHRpbWVzdGFtcAorICogQHJldHVybiB0aGUgYnVmZmVyIGluIGlucHV0CisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqYXZfdHNfbWFrZV90aW1lX3N0cmluZyhjaGFyICpidWYsIGludDY0X3QgdHMsIEFWUmF0aW9uYWwgKnRiKQoreworICAgIGlmICh0cyA9PSBBVl9OT1BUU19WQUxVRSkgc25wcmludGYoYnVmLCBBVl9UU19NQVhfU1RSSU5HX1NJWkUsICJOT1BUUyIpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBBVl9UU19NQVhfU1RSSU5HX1NJWkUsICIlLjZnIiwgYXZfcTJkKCp0YikgKiB0cyk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworLyoqCisgKiBDb252ZW5pZW5jZSBtYWNybywgdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgdXNlZCBvbmx5IGRpcmVjdGx5IGluCisgKiBmdW5jdGlvbiBhcmd1bWVudHMgYnV0IG5ldmVyIHN0YW5kLWFsb25lLgorICovCisjZGVmaW5lIGF2X3RzMnRpbWVzdHIodHMsIHRiKSBhdl90c19tYWtlX3RpbWVfc3RyaW5nKChjaGFyW0FWX1RTX01BWF9TVFJJTkdfU0laRV0pezB9LCB0cywgdGIpCisKKyNlbmRpZiAvKiBBVlVUSUxfVElNRVNUQU1QX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvdG9taS9pbnRyZWFkd3JpdGUuaCBiL2ZmbXBlZy9saWJhdnV0aWwvdG9taS9pbnRyZWFkd3JpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGVjNDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC90b21pL2ludHJlYWR3cml0ZS5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9UT01JX0lOVFJFQURXUklURV9ICisjZGVmaW5lIEFWVVRJTF9UT01JX0lOVFJFQURXUklURV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisKKyNkZWZpbmUgQVZfUkIxNiBBVl9SQjE2CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50MTZfdCBBVl9SQjE2KGNvbnN0IHZvaWQgKnApCit7CisgICAgdWludDE2X3QgdjsKKyAgICBfX2FzbV9fICgibG9hZGFjYywgICAoJTErKSBcblx0IgorICAgICAgICAgICAgICJyb2w4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInN0b3JlYWNjLCAgJTAgICAgXG5cdCIKKyAgICAgICAgICAgICAibG9hZGFjYywgICAoJTErKSBcblx0IgorICAgICAgICAgICAgICJhZGQsICAgICAgICUwICAgIFxuXHQiCisgICAgICAgICAgICAgOiAiPXIiKHYpLCAiK2EiKHApKTsKKyAgICByZXR1cm4gdjsKK30KKworI2RlZmluZSBBVl9XQjE2IEFWX1dCMTYKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgQVZfV0IxNih2b2lkICpwLCB1aW50MTZfdCB2KQoreworICAgIF9fYXNtX18gdm9sYXRpbGUgKCJsb2FkYWNjLCAgICUxICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgImxzcjggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAic3RvcmVhY2MsICAoJTArKSBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICJsb2FkYWNjLCAgICUxICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgInN0b3JlYWNjLCAgKCUwKykgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICA6ICIrJmEiKHApIDogInIiKHYpKTsKK30KKworI2RlZmluZSBBVl9STDE2IEFWX1JMMTYKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQxNl90IEFWX1JMMTYoY29uc3Qgdm9pZCAqcCkKK3sKKyAgICB1aW50MTZfdCB2OworICAgIF9fYXNtX18gKCJsb2FkYWNjLCAgICglMSspIFxuXHQiCisgICAgICAgICAgICAgInN0b3JlYWNjLCAgJTAgICAgXG5cdCIKKyAgICAgICAgICAgICAibG9hZGFjYywgICAoJTErKSBcblx0IgorICAgICAgICAgICAgICJyb2w4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImFkZCwgICAgICAgJTAgICAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9ciIodiksICIrYSIocCkpOworICAgIHJldHVybiB2OworfQorCisjZGVmaW5lIEFWX1dMMTYgQVZfV0wxNgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBBVl9XTDE2KHZvaWQgKnAsIHVpbnQxNl90IHYpCit7CisgICAgX19hc21fXyB2b2xhdGlsZSAoImxvYWRhY2MsICAgJTEgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAic3RvcmVhY2MsICAoJTArKSBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICJsc3I4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgInN0b3JlYWNjLCAgKCUwKykgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICA6ICIrJmEiKHApIDogInIiKHYpKTsKK30KKworI2RlZmluZSBBVl9SQjMyIEFWX1JCMzIKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQzMl90IEFWX1JCMzIoY29uc3Qgdm9pZCAqcCkKK3sKKyAgICB1aW50MzJfdCB2OworICAgIF9fYXNtX18gKCJsb2FkYWNjLCAgICglMSspIFxuXHQiCisgICAgICAgICAgICAgInJvbDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAicm9sOCAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJyb2w4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInN0b3JlYWNjLCAgJTAgICAgXG5cdCIKKyAgICAgICAgICAgICAibG9hZGFjYywgICAoJTErKSBcblx0IgorICAgICAgICAgICAgICJyb2w4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInJvbDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAiYWRkLCAgICAgICAlMCAgICBcblx0IgorICAgICAgICAgICAgICJsb2FkYWNjLCAgICglMSspIFxuXHQiCisgICAgICAgICAgICAgInJvbDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAiYWRkLCAgICAgICAlMCAgICBcblx0IgorICAgICAgICAgICAgICJsb2FkYWNjLCAgICglMSspIFxuXHQiCisgICAgICAgICAgICAgImFkZCwgICAgICAgJTAgICAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9ciIodiksICIrYSIocCkpOworICAgIHJldHVybiB2OworfQorCisjZGVmaW5lIEFWX1dCMzIgQVZfV0IzMgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBBVl9XQjMyKHZvaWQgKnAsIHVpbnQzMl90IHYpCit7CisgICAgX19hc21fXyB2b2xhdGlsZSAoImxvYWRhY2MsICAgIzQgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAiYWRkLCAgICAgICAlMCAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICJsb2FkYWNjLCAgICUxICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgInN0b3JlYWNjLCAgKC0lMCkgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAibHNyOCAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICJzdG9yZWFjYywgICgtJTApIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgImxzcjggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAic3RvcmVhY2MsICAoLSUwKSBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICJsc3I4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgInN0b3JlYWNjLCAgKC0lMCkgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICA6ICIrJmEiKHApIDogInIiKHYpKTsKK30KKworI2RlZmluZSBBVl9STDMyIEFWX1JMMzIKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQzMl90IEFWX1JMMzIoY29uc3Qgdm9pZCAqcCkKK3sKKyAgICB1aW50MzJfdCB2OworICAgIF9fYXNtX18gKCJsb2FkYWNjLCAgICglMSspIFxuXHQiCisgICAgICAgICAgICAgInN0b3JlYWNjLCAgJTAgICAgXG5cdCIKKyAgICAgICAgICAgICAibG9hZGFjYywgICAoJTErKSBcblx0IgorICAgICAgICAgICAgICJyb2w4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImFkZCwgICAgICAgJTAgICAgXG5cdCIKKyAgICAgICAgICAgICAibG9hZGFjYywgICAoJTErKSBcblx0IgorICAgICAgICAgICAgICJyb2w4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgInJvbDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAiYWRkLCAgICAgICAlMCAgICBcblx0IgorICAgICAgICAgICAgICJsb2FkYWNjLCAgICglMSspIFxuXHQiCisgICAgICAgICAgICAgInJvbDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAicm9sOCAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJyb2w4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgImFkZCwgICAgICAgJTAgICAgXG5cdCIKKyAgICAgICAgICAgICA6ICI9ciIodiksICIrYSIocCkpOworICAgIHJldHVybiB2OworfQorCisjZGVmaW5lIEFWX1dMMzIgQVZfV0wzMgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBBVl9XTDMyKHZvaWQgKnAsIHVpbnQzMl90IHYpCit7CisgICAgX19hc21fXyB2b2xhdGlsZSAoImxvYWRhY2MsICAgJTEgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAic3RvcmVhY2MsICAoJTArKSBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICJsc3I4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgInN0b3JlYWNjLCAgKCUwKykgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAibHNyOCAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICJzdG9yZWFjYywgICglMCspIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgImxzcjggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAic3RvcmVhY2MsICAoJTArKSBcblx0IgorICAgICAgICAgICAgICAgICAgICAgIDogIismYSIocCkgOiAiciIodikpOworfQorCisjZW5kaWYgLyogQVZVVElMX1RPTUlfSU5UUkVBRFdSSVRFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvdHJlZS5jIGIvZmZtcGVnL2xpYmF2dXRpbC90cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiNjdlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvdHJlZS5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgInRyZWUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQVZUcmVlTm9kZSB7CisgICAgc3RydWN0IEFWVHJlZU5vZGUgKmNoaWxkWzJdOworICAgIHZvaWQgKmVsZW07CisgICAgaW50IHN0YXRlOworfSBBVlRyZWVOb2RlOworCitjb25zdCBpbnQgYXZfdHJlZV9ub2RlX3NpemUgPSBzaXplb2YoQVZUcmVlTm9kZSk7CisKK3N0cnVjdCBBVlRyZWVOb2RlICphdl90cmVlX25vZGVfYWxsb2Modm9pZCkKK3sKKyAgICByZXR1cm4gYXZfbWFsbG9jeihzaXplb2Yoc3RydWN0IEFWVHJlZU5vZGUpKTsKK30KKwordm9pZCAqYXZfdHJlZV9maW5kKGNvbnN0IEFWVHJlZU5vZGUgKnQsIHZvaWQgKmtleSwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCpjbXApKHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqYiksIHZvaWQgKm5leHRbMl0pCit7CisgICAgaWYgKHQpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHYgPSBjbXAoa2V5LCB0LT5lbGVtKTsKKyAgICAgICAgaWYgKHYpIHsKKyAgICAgICAgICAgIGlmIChuZXh0KQorICAgICAgICAgICAgICAgIG5leHRbdiA+PiAzMV0gPSB0LT5lbGVtOworICAgICAgICAgICAgcmV0dXJuIGF2X3RyZWVfZmluZCh0LT5jaGlsZFsodiA+PiAzMSkgXiAxXSwga2V5LCBjbXAsIG5leHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG5leHQpIHsKKyAgICAgICAgICAgICAgICBhdl90cmVlX2ZpbmQodC0+Y2hpbGRbMF0sIGtleSwgY21wLCBuZXh0KTsKKyAgICAgICAgICAgICAgICBhdl90cmVlX2ZpbmQodC0+Y2hpbGRbMV0sIGtleSwgY21wLCBuZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0LT5lbGVtOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkICphdl90cmVlX2luc2VydChBVlRyZWVOb2RlICoqdHAsIHZvaWQgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgIGludCAoKmNtcCkodm9pZCAqa2V5LCBjb25zdCB2b2lkICpiKSwgQVZUcmVlTm9kZSAqKm5leHQpCit7CisgICAgQVZUcmVlTm9kZSAqdCA9ICp0cDsKKyAgICBpZiAodCkgeworICAgICAgICB1bnNpZ25lZCBpbnQgdiA9IGNtcCh0LT5lbGVtLCBrZXkpOworICAgICAgICB2b2lkICpyZXQ7CisgICAgICAgIGlmICghdikgeworICAgICAgICAgICAgaWYgKCpuZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiB0LT5lbGVtOworICAgICAgICAgICAgZWxzZSBpZiAodC0+Y2hpbGRbMF0gfHwgdC0+Y2hpbGRbMV0pIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9ICF0LT5jaGlsZFswXTsKKyAgICAgICAgICAgICAgICB2b2lkICpuZXh0X2VsZW1bMl07CisgICAgICAgICAgICAgICAgYXZfdHJlZV9maW5kKHQtPmNoaWxkW2ldLCBrZXksIGNtcCwgbmV4dF9lbGVtKTsKKyAgICAgICAgICAgICAgICBrZXkgPSB0LT5lbGVtID0gbmV4dF9lbGVtW2ldOworICAgICAgICAgICAgICAgIHYgICA9IC1pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqbmV4dCA9IHQ7CisgICAgICAgICAgICAgICAgKnRwICAgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldCA9IGF2X3RyZWVfaW5zZXJ0KCZ0LT5jaGlsZFt2ID4+IDMxXSwga2V5LCBjbXAsIG5leHQpOworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgaW50IGkgICAgICAgICAgICAgID0gKHYgPj4gMzEpIF4gISEqbmV4dDsKKyAgICAgICAgICAgIEFWVHJlZU5vZGUgKipjaGlsZCA9ICZ0LT5jaGlsZFtpXTsKKyAgICAgICAgICAgIHQtPnN0YXRlICs9IDIgKiBpIC0gMTsKKworICAgICAgICAgICAgaWYgKCEodC0+c3RhdGUgJiAxKSkgeworICAgICAgICAgICAgICAgIGlmICh0LT5zdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgZXF1aXZhbGVudCB0bworICAgICAgICAgICAgICAgICAgICAgKiBpZiAoKCpjaGlsZCktPnN0YXRlICogMiA9PSAtdC0+c3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAqICAgICByb3RhdGUoY2hpbGQsIGkgXiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICogcm90YXRlKHRwLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICogd2l0aCByb3RhdGUoKToKKyAgICAgICAgICAgICAgICAgICAgICogc3RhdGljIHZvaWQgcm90YXRlKEFWVHJlZU5vZGUgKip0cCwgaW50IGkpCisgICAgICAgICAgICAgICAgICAgICAqIHsKKyAgICAgICAgICAgICAgICAgICAgICogICAgIEFWVHJlZU5vZGUgKnQ9ICp0cDsKKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICogICAgICp0cCA9IHQtPmNoaWxkW2ldOworICAgICAgICAgICAgICAgICAgICAgKiAgICAgdC0+Y2hpbGRbaV0gPSB0LT5jaGlsZFtpXS0+Y2hpbGRbaSBeIDFdOworICAgICAgICAgICAgICAgICAgICAgKiAgICAgKCp0cCktPmNoaWxkW2kgXiAxXSA9IHQ7CisgICAgICAgICAgICAgICAgICAgICAqICAgICBpID0gNCAqIHQtPnN0YXRlICsgMiAqICgqdHApLT5zdGF0ZSArIDEyOworICAgICAgICAgICAgICAgICAgICAgKiAgICAgdC0+c3RhdGUgICAgID0gKCgweDYxNDU4NiA+PiBpKSAmIDMpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICogICAgICgqdHApLT5zdGF0ZSA9ICgoMHg0MDBFRUEgPj4gaSkgJiAzKSAtIDEgKworICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgKCgqdHApLT5zdGF0ZSA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICogfQorICAgICAgICAgICAgICAgICAgICAgKiBidXQgc3VjaCBhIHJvdGF0ZSBmdW5jdGlvbiBpcyBib3RoIGJpZ2dlciBhbmQgc2xvd2VyCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKCpjaGlsZCktPnN0YXRlICogMiA9PSAtdC0+c3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICp0cCAgICAgICAgICAgICAgICAgICAgPSAoKmNoaWxkKS0+Y2hpbGRbaSBeIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgKCpjaGlsZCktPmNoaWxkW2kgXiAxXSA9ICgqdHApLT5jaGlsZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqdHApLT5jaGlsZFtpXSAgICAgICAgPSAqY2hpbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAqY2hpbGQgICAgICAgICAgICAgICAgID0gKCp0cCktPmNoaWxkW2kgXiAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqdHApLT5jaGlsZFtpIF4gMV0gICAgPSB0OworCisgICAgICAgICAgICAgICAgICAgICAgICAoKnRwKS0+Y2hpbGRbMF0tPnN0YXRlID0gLSgoKnRwKS0+c3RhdGUgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqdHApLT5jaGlsZFsxXS0+c3RhdGUgPSAoKnRwKS0+c3RhdGUgPCAwOworICAgICAgICAgICAgICAgICAgICAgICAgKCp0cCktPnN0YXRlICAgICAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqdHAgICAgICAgICAgICAgICAgID0gKmNoaWxkOworICAgICAgICAgICAgICAgICAgICAgICAgKmNoaWxkICAgICAgICAgICAgICA9ICgqY2hpbGQpLT5jaGlsZFtpIF4gMV07CisgICAgICAgICAgICAgICAgICAgICAgICAoKnRwKS0+Y2hpbGRbaSBeIDFdID0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKnRwKS0+c3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+c3RhdGUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnN0YXRlID4+PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgKCp0cCktPnN0YXRlID0gLXQtPnN0YXRlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEoKnRwKS0+c3RhdGUgXiAhISpuZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICAqdHAgICA9ICpuZXh0OworICAgICAgICAqbmV4dCA9IE5VTEw7CisgICAgICAgIGlmICgqdHApIHsKKyAgICAgICAgICAgICgqdHApLT5lbGVtID0ga2V5OworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9Cit9CisKK3ZvaWQgYXZfdHJlZV9kZXN0cm95KEFWVHJlZU5vZGUgKnQpCit7CisgICAgaWYgKHQpIHsKKyAgICAgICAgYXZfdHJlZV9kZXN0cm95KHQtPmNoaWxkWzBdKTsKKyAgICAgICAgYXZfdHJlZV9kZXN0cm95KHQtPmNoaWxkWzFdKTsKKyAgICAgICAgYXZfZnJlZSh0KTsKKyAgICB9Cit9CisKK3ZvaWQgYXZfdHJlZV9lbnVtZXJhdGUoQVZUcmVlTm9kZSAqdCwgdm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpjbXApKHZvaWQgKm9wYXF1ZSwgdm9pZCAqZWxlbSksCisgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmVudSkodm9pZCAqb3BhcXVlLCB2b2lkICplbGVtKSkKK3sKKyAgICBpZiAodCkgeworICAgICAgICBpbnQgdiA9IGNtcCA/IGNtcChvcGFxdWUsIHQtPmVsZW0pIDogMDsKKyAgICAgICAgaWYgKHYgPj0gMCkKKyAgICAgICAgICAgIGF2X3RyZWVfZW51bWVyYXRlKHQtPmNoaWxkWzBdLCBvcGFxdWUsIGNtcCwgZW51KTsKKyAgICAgICAgaWYgKHYgPT0gMCkKKyAgICAgICAgICAgIGVudShvcGFxdWUsIHQtPmVsZW0pOworICAgICAgICBpZiAodiA8PSAwKQorICAgICAgICAgICAgYXZfdHJlZV9lbnVtZXJhdGUodC0+Y2hpbGRbMV0sIG9wYXF1ZSwgY21wLCBlbnUpOworICAgIH0KK30KKworI2lmZGVmIFRFU1QKKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImxmZy5oIgorCitzdGF0aWMgaW50IGNoZWNrKEFWVHJlZU5vZGUgKnQpCit7CisgICAgaWYgKHQpIHsKKyAgICAgICAgaW50IGxlZnQgID0gY2hlY2sodC0+Y2hpbGRbMF0pOworICAgICAgICBpbnQgcmlnaHQgPSBjaGVjayh0LT5jaGlsZFsxXSk7CisKKyAgICAgICAgaWYgKGxlZnQgPiA5OTkgfHwgcmlnaHQgPiA5OTkpCisgICAgICAgICAgICByZXR1cm4gMTAwMDsKKyAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCAhPSB0LT5zdGF0ZSkKKyAgICAgICAgICAgIHJldHVybiAxMDAwOworICAgICAgICBpZiAodC0+c3RhdGUgPiAxIHx8IHQtPnN0YXRlIDwgLTEpCisgICAgICAgICAgICByZXR1cm4gMTAwMDsKKyAgICAgICAgcmV0dXJuIEZGTUFYKGxlZnQsIHJpZ2h0KSArIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludChBVlRyZWVOb2RlICp0LCBpbnQgZGVwdGgpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGRlcHRoICogNDsgaSsrKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiICIpOworICAgIGlmICh0KSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJOb2RlICVwICUyZCAlcFxuIiwgdCwgdC0+c3RhdGUsIHQtPmVsZW0pOworICAgICAgICBwcmludCh0LT5jaGlsZFswXSwgZGVwdGggKyAxKTsKKyAgICAgICAgcHJpbnQodC0+Y2hpbGRbMV0sIGRlcHRoICsgMSk7CisgICAgfSBlbHNlCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJOVUxMXG4iKTsKK30KKworc3RhdGljIGludCBjbXAodm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICByZXR1cm4gKHVpbnQ4X3QgKikgYSAtIChjb25zdCB1aW50OF90ICopIGI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgaTsKKyAgICB2b2lkICprOworICAgIEFWVHJlZU5vZGUgKnJvb3QgPSBOVUxMLCAqbm9kZSA9IE5VTEw7CisgICAgQVZMRkcgcHJuZzsKKyAgICBpbnQgbG9nX2xldmVsID0gYXJnYyA8PSAxID8gQVZfTE9HX0lORk8gOiBhdG9pKGFyZ3ZbMV0pOworCisgICAgYXZfbG9nX3NldF9sZXZlbChsb2dfbGV2ZWwpOworCisgICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKyAgICAgICAgaW50cHRyX3QgaiA9IGF2X2xmZ19nZXQoJnBybmcpICUgODYyOTQ7CisKKyAgICAgICAgaWYgKGNoZWNrKHJvb3QpID4gOTk5KSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRkFUQUwgZXJyb3IgJWRcbiIsIGkpOworICAgICAgICAgICAgcHJpbnQocm9vdCwgMCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiaW5zZXJ0aW5nICU0ZFxuIiwgKGludClqKTsKKworICAgICAgICBpZiAoIW5vZGUpCisgICAgICAgICAgICBub2RlID0gYXZfdHJlZV9ub2RlX2FsbG9jKCk7CisgICAgICAgIGlmICghbm9kZSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGF2X3RyZWVfaW5zZXJ0KCZyb290LCAodm9pZCAqKShqICsgMSksIGNtcCwgJm5vZGUpOworCisgICAgICAgIGogPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDg2Mjk0OworICAgICAgICB7CisgICAgICAgICAgICBBVlRyZWVOb2RlICpub2RlMiA9IE5VTEw7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAicmVtb3ZpbmcgJTRkXG4iLCAoaW50KWopOworICAgICAgICAgICAgYXZfdHJlZV9pbnNlcnQoJnJvb3QsICh2b2lkICopKGogKyAxKSwgY21wLCAmbm9kZTIpOworICAgICAgICAgICAgayA9IGF2X3RyZWVfZmluZChyb290LCAodm9pZCAqKShqICsgMSksIGNtcCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoaykKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAicmVtb3ZhbCBmYWlsdXJlICVkXG4iLCBpKTsKKyAgICAgICAgICAgIGF2X2ZyZWUobm9kZTIpOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWUobm9kZSk7CisKKyAgICBhdl90cmVlX2Rlc3Ryb3kocm9vdCk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC90cmVlLmggYi9mZm1wZWcvbGliYXZ1dGlsL3RyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTRmYTkxCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC90cmVlLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQSB0cmVlIGNvbnRhaW5lci4KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaWZuZGVmIEFWVVRJTF9UUkVFX0gKKyNkZWZpbmUgQVZVVElMX1RSRUVfSAorCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBsYXZ1X3RyZWUgQVZUcmVlCisgKiBAaW5ncm91cCBsYXZ1X2RhdGEKKyAqCisgKiBMb3ctY29tcGxleGl0eSB0cmVlIGNvbnRhaW5lcgorICoKKyAqIEluc2VydGlvbiwgcmVtb3ZhbCwgZmluZGluZyBlcXVhbCwgbGFyZ2VzdCB3aGljaCBpcyBzbWFsbGVyIHRoYW4gYW5kCisgKiBzbWFsbGVzdCB3aGljaCBpcyBsYXJnZXIgdGhhbiwgYWxsIGhhdmUgTyhsb2cgbikgd29yc3QtY2FzZSBjb21wbGV4aXR5LgorICogQHsKKyAqLworCisKK3N0cnVjdCBBVlRyZWVOb2RlOworZXh0ZXJuIGNvbnN0IGludCBhdl90cmVlX25vZGVfc2l6ZTsKKworLyoqCisgKiBBbGxvY2F0ZSBhbiBBVlRyZWVOb2RlLgorICovCitzdHJ1Y3QgQVZUcmVlTm9kZSAqYXZfdHJlZV9ub2RlX2FsbG9jKHZvaWQpOworCisvKioKKyAqIEZpbmQgYW4gZWxlbWVudC4KKyAqIEBwYXJhbSByb290IGEgcG9pbnRlciB0byB0aGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlCisgKiBAcGFyYW0gbmV4dCBJZiBuZXh0IGlzIG5vdCBOVUxMLCB0aGVuIG5leHRbMF0gd2lsbCBjb250YWluIHRoZSBwcmV2aW91cworICogICAgICAgICAgICAgZWxlbWVudCBhbmQgbmV4dFsxXSB0aGUgbmV4dCBlbGVtZW50LiBJZiBlaXRoZXIgZG9lcyBub3QgZXhpc3QsCisgKiAgICAgICAgICAgICB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIG5leHQgaXMgdW5jaGFuZ2VkLgorICogQHJldHVybiBBbiBlbGVtZW50IHdpdGggY21wKGtleSwgZWxlbSkgPT0gMCBvciBOVUxMIGlmIG5vIHN1Y2ggZWxlbWVudAorICogICAgICAgICBleGlzdHMgaW4gdGhlIHRyZWUuCisgKi8KK3ZvaWQgKmF2X3RyZWVfZmluZChjb25zdCBzdHJ1Y3QgQVZUcmVlTm9kZSAqcm9vdCwgdm9pZCAqa2V5LAorICAgICAgICAgICAgICAgICAgIGludCAoKmNtcCkodm9pZCAqa2V5LCBjb25zdCB2b2lkICpiKSwgdm9pZCAqbmV4dFsyXSk7CisKKy8qKgorICogSW5zZXJ0IG9yIHJlbW92ZSBhbiBlbGVtZW50LgorICoKKyAqIElmICpuZXh0IGlzIE5VTEwsIHRoZW4gdGhlIHN1cHBsaWVkIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkIGlmIGl0IGV4aXN0cy4KKyAqIElmICpuZXh0IGlzIG5vbi1OVUxMLCB0aGVuIHRoZSBzdXBwbGllZCBlbGVtZW50IHdpbGwgYmUgaW5zZXJ0ZWQsIHVubGVzcworICogaXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRyZWUuCisgKgorICogQHBhcmFtIHJvb3RwIEEgcG9pbnRlciB0byBhIHBvaW50ZXIgdG8gdGhlIHJvb3Qgbm9kZSBvZiB0aGUgdHJlZTsgbm90ZSB0aGF0CisgKiAgICAgICAgICAgICAgdGhlIHJvb3Qgbm9kZSBjYW4gY2hhbmdlIGR1cmluZyBpbnNlcnRpb25zLCB0aGlzIGlzIHJlcXVpcmVkCisgKiAgICAgICAgICAgICAgdG8ga2VlcCB0aGUgdHJlZSBiYWxhbmNlZC4KKyAqIEBwYXJhbSBrZXkgIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnQga2V5IHRvIGluc2VydCBpbiB0aGUgdHJlZQorICogQHBhcmFtIG5leHQgVXNlZCB0byBhbGxvY2F0ZSBhbmQgZnJlZSBBVlRyZWVOb2Rlcy4gRm9yIGluc2VydGlvbiB0aGUgdXNlcgorICogICAgICAgICAgICAgbXVzdCBzZXQgaXQgdG8gYW4gYWxsb2NhdGVkIGFuZCB6ZXJvZWQgb2JqZWN0IG9mIGF0IGxlYXN0CisgKiAgICAgICAgICAgICBhdl90cmVlX25vZGVfc2l6ZSBieXRlcyBzaXplLiBhdl90cmVlX2luc2VydCgpIHdpbGwgc2V0IGl0IHRvCisgKiAgICAgICAgICAgICBOVUxMIGlmIGl0IGhhcyBiZWVuIGNvbnN1bWVkLgorICogICAgICAgICAgICAgRm9yIGRlbGV0aW5nIGVsZW1lbnRzICpuZXh0IGlzIHNldCB0byBOVUxMIGJ5IHRoZSB1c2VyIGFuZAorICogICAgICAgICAgICAgYXZfdHJlZV9pbnNlcnQoKSB3aWxsIHNldCBpdCB0byB0aGUgQVZUcmVlTm9kZSB3aGljaCB3YXMKKyAqICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSByZW1vdmVkIGVsZW1lbnQuCisgKiAgICAgICAgICAgICBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIGZsYXQgYXJyYXlzLCB3aGljaCBoYXZlCisgKiAgICAgICAgICAgICBsb3dlciBvdmVyaGVhZCBjb21wYXJlZCB0byBtYW55IG1hbGxvY2VkIGVsZW1lbnRzLgorICogICAgICAgICAgICAgWW91IG1pZ2h0IHdhbnQgdG8gZGVmaW5lIGEgZnVuY3Rpb24gbGlrZToKKyAqICAgICAgICAgICAgIEBjb2RlCisgKiAgICAgICAgICAgICB2b2lkICp0cmVlX2luc2VydChzdHJ1Y3QgQVZUcmVlTm9kZSAqKnJvb3RwLCB2b2lkICprZXksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpjbXApKHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqYiksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlRyZWVOb2RlICoqbmV4dCkKKyAqICAgICAgICAgICAgIHsKKyAqICAgICAgICAgICAgICAgICBpZiAoISpuZXh0KQorICogICAgICAgICAgICAgICAgICAgICAqbmV4dCA9IGF2X21hbGxvY3ooYXZfdHJlZV9ub2RlX3NpemUpOworICogICAgICAgICAgICAgICAgIHJldHVybiBhdl90cmVlX2luc2VydChyb290cCwga2V5LCBjbXAsIG5leHQpOworICogICAgICAgICAgICAgfQorICogICAgICAgICAgICAgdm9pZCAqdHJlZV9yZW1vdmUoc3RydWN0IEFWVHJlZU5vZGUgKipyb290cCwgdm9pZCAqa2V5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY21wKSh2b2lkICprZXksIGNvbnN0IHZvaWQgKmIsIEFWVHJlZU5vZGUgKipuZXh0KSkKKyAqICAgICAgICAgICAgIHsKKyAqICAgICAgICAgICAgICAgICBhdl9mcmVlcChuZXh0KTsKKyAqICAgICAgICAgICAgICAgICByZXR1cm4gYXZfdHJlZV9pbnNlcnQocm9vdHAsIGtleSwgY21wLCBuZXh0KTsKKyAqICAgICAgICAgICAgIH0KKyAqICAgICAgICAgICAgIEBlbmRjb2RlCisgKiBAcGFyYW0gY21wIGNvbXBhcmUgZnVuY3Rpb24gdXNlZCB0byBjb21wYXJlIGVsZW1lbnRzIGluIHRoZSB0cmVlCisgKiBAcmV0dXJuIElmIG5vIGluc2VydGlvbiBoYXBwZW5lZCwgdGhlIGZvdW5kIGVsZW1lbnQ7IGlmIGFuIGluc2VydGlvbiBvcgorICogICAgICAgICByZW1vdmFsIGhhcHBlbmVkLCB0aGVuIGVpdGhlciBrZXkgb3IgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICogICAgICAgICBXaGljaCBvbmUgaXQgaXMgZGVwZW5kcyBvbiB0aGUgdHJlZSBzdGF0ZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uLiBZb3UKKyAqICAgICAgICAgc2hvdWxkIG1ha2Ugbm8gYXNzdW1wdGlvbnMgdGhhdCBpdCdzIG9uZSBvciB0aGUgb3RoZXIgaW4gdGhlIGNvZGUuCisgKi8KK3ZvaWQgKmF2X3RyZWVfaW5zZXJ0KHN0cnVjdCBBVlRyZWVOb2RlICoqcm9vdHAsIHZvaWQgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgIGludCAoKmNtcCkodm9pZCAqa2V5LCBjb25zdCB2b2lkICpiKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBBVlRyZWVOb2RlICoqbmV4dCk7CisKK3ZvaWQgYXZfdHJlZV9kZXN0cm95KHN0cnVjdCBBVlRyZWVOb2RlICp0KTsKKworLyoqCisgKiBBcHBseSBlbnUob3BhcXVlLCAmZWxlbSkgdG8gYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgdHJlZSBpbiBhIGdpdmVuIHJhbmdlLgorICoKKyAqIEBwYXJhbSBjbXAgYSBjb21wYXJpc29uIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyA8IDAgZm9yIGEgZWxlbWVudCBiZWxvdyB0aGUKKyAqICAgICAgICAgICAgcmFuZ2UsID4gMCBmb3IgYSBlbGVtZW50IGFib3ZlIHRoZSByYW5nZSBhbmQgPT0gMCBmb3IgYQorICogICAgICAgICAgICBlbGVtZW50IGluc2lkZSB0aGUgcmFuZ2UKKyAqCisgKiBAbm90ZSBUaGUgY21wIGZ1bmN0aW9uIHNob3VsZCB1c2UgdGhlIHNhbWUgb3JkZXJpbmcgdXNlZCB0byBjb25zdHJ1Y3QgdGhlCisgKiAgICAgICB0cmVlLgorICovCit2b2lkIGF2X3RyZWVfZW51bWVyYXRlKHN0cnVjdCBBVlRyZWVOb2RlICp0LCB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNtcCkodm9pZCAqb3BhcXVlLCB2b2lkICplbGVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZW51KSh2b2lkICpvcGFxdWUsIHZvaWQgKmVsZW0pKTsKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBVlVUSUxfVFJFRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3V0ZjguYyBiL2ZmbXBlZy9saWJhdnV0aWwvdXRmOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NDdhNTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3V0ZjguYwpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmZGVmIFRFU1QKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpbGUuaCIKKworc3RhdGljIHZvaWQgcHJpbnRfc2VxdWVuY2UoY29uc3QgY2hhciAqcCwgaW50IGwsIGludCBpbmRlbnQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykKKyAgICAgICAgcHJpbnRmKCIlMDJYIiwgKHVpbnQ4X3QpcFtpXSk7CisgICAgcHJpbnRmKCIlKnMiLCBpbmRlbnQtbCoyLCAiIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgcmV0OworICAgIGNoYXIgKmZpbGVuYW1lID0gYXJndlsxXTsKKyAgICB1aW50OF90ICpmaWxlX2J1ZjsKKyAgICBzaXplX3QgZmlsZV9idWZfc2l6ZTsKKyAgICB1aW50MzJfdCBjb2RlOworICAgIGNvbnN0IHVpbnQ4X3QgKnAsICplbmRwOworCisgICAgcmV0ID0gYXZfZmlsZV9tYXAoZmlsZW5hbWUsICZmaWxlX2J1ZiwgJmZpbGVfYnVmX3NpemUsIDAsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHAgPSBmaWxlX2J1ZjsKKyAgICBlbmRwID0gZmlsZV9idWYgKyBmaWxlX2J1Zl9zaXplOworICAgIHdoaWxlIChwIDwgZW5kcCkgeworICAgICAgICBpbnQgbCwgcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcDAgPSBwOworICAgICAgICBjb2RlID0gVUlOVDMyX01BWDsKKyAgICAgICAgciA9IGF2X3V0ZjhfZGVjb2RlKCZjb2RlLCAmcCwgZW5kcCwgMCk7CisgICAgICAgIGwgPSAoaW50KShwLXAwKTsKKyAgICAgICAgcHJpbnRfc2VxdWVuY2UocDAsIGwsIDIwKTsKKyAgICAgICAgaWYgKGNvZGUgIT0gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgcHJpbnRmKCIlLTEwZCAweCUtMTBYICUtNWQgIiwgY29kZSwgY29kZSwgbCk7CisgICAgICAgICAgICBpZiAociA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCpwMCA9PSAnXG4nKSBwcmludGYoIlxcblxuIik7CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICBwcmludGYgKCIlLipzXG4iLCBsLCBwMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiaW52YWxpZCBjb2RlIHJhbmdlXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiaW52YWxpZCBzZXF1ZW5jZVxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9maWxlX3VubWFwKGZpbGVfYnVmLCBmaWxlX2J1Zl9zaXplKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC91dGlscy5jIGIvZmZtcGVnL2xpYmF2dXRpbC91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZmQzYjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3V0aWxzLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImF2dXRpbC5oIgorI2luY2x1ZGUgImF2YXNzZXJ0LmgiCisjaW5jbHVkZSAic2FtcGxlZm10LmgiCisjaW5jbHVkZSAicGl4ZGVzYy5oIgorCisvKioKKyAqIEBmaWxlCisgKiB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zCisgKi8KKwordW5zaWduZWQgYXZ1dGlsX3ZlcnNpb24odm9pZCkKK3sKKyAgICBzdGF0aWMgaW50IGNoZWNrc19kb25lOworICAgIGlmIChjaGVja3NfZG9uZSkKKyAgICAgICAgcmV0dXJuIExJQkFWVVRJTF9WRVJTSU9OX0lOVDsKKworICAgIGF2X2Fzc2VydDAoQVZfUElYX0ZNVF9WREFfVkxEID09IDgxKTsgLy9jaGVjayBpZiB0aGUgcGl4IGZtdCBlbnVtIGhhcyBub3QgaGFkIGFueXRoaW5nIGluc2VydGVkIG9yIHJlbW92ZWQgYnkgbWlzdGFrZQorICAgIGF2X2Fzc2VydDAoQVZfU0FNUExFX0ZNVF9EQkxQID09IDkpOworICAgIGF2X2Fzc2VydDAoQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQgPT0gNCk7CisgICAgYXZfYXNzZXJ0MChBVl9QSUNUVVJFX1RZUEVfQkkgPT0gNyk7CisgICAgYXZfYXNzZXJ0MChMSUJBVlVUSUxfVkVSU0lPTl9NSUNSTyA+PSAxMDApOworICAgIGF2X2Fzc2VydDAoSEFWRV9NTVgyID09IEhBVkVfTU1YRVhUKTsKKworICAgIGF2X2Fzc2VydDAoKChzaXplX3QpLTEpID4gMCk7IC8vIEMgZ3VhcmFudGVlcyB0aGlzIGJ1dCBpZiBmYWxzZSBvbiBhIHBsYXRmb3JtIHdlIGNhcmUgYWJvdXQgcmV2ZXJ0IGF0IGxlYXN0IGIyODRlMWZmZTM0M2Q2Njk3ZmI5NTBkMWVlNTE3YmFmZGE4YTk4NDQKKworICAgIGlmIChhdl9zYXRfZGFkZDMyKDEsIDIpICE9IDUpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkxpYmF2dXRpbCBoYXMgYmVlbiBidWlsZCB3aXRoIGEgYnJva2VuIGJpbnV0aWxzLCBwbGVhc2UgdXBncmFkZSBiaW51dGlscyBhbmQgcmVidWlsZFxuIik7CisgICAgICAgIGFib3J0KCk7CisgICAgfQorCisgICAgaWYgKGxscmludCgxTEw8PDYwKSAhPSAxTEw8PDYwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJMaWJhdnV0aWwgaGFzIGJlZW4gbGlua2VkIHRvIGEgYnJva2VuIGxscmludCgpXG4iKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKEFTU0VSVF9MRVZFTCkgJiYgQVNTRVJUX0xFVkVMID4gMAorICAgIGZmX2NoZWNrX3BpeGZtdF9kZXNjcmlwdG9ycygpOworI2VuZGlmCisgICAgY2hlY2tzX2RvbmUgPSAxOworICAgIHJldHVybiBMSUJBVlVUSUxfVkVSU0lPTl9JTlQ7Cit9CisKK2NvbnN0IGNoYXIgKmF2dXRpbF9jb25maWd1cmF0aW9uKHZvaWQpCit7CisgICAgcmV0dXJuIEZGTVBFR19DT05GSUdVUkFUSU9OOworfQorCitjb25zdCBjaGFyICphdnV0aWxfbGljZW5zZSh2b2lkKQoreworI2RlZmluZSBMSUNFTlNFX1BSRUZJWCAibGliYXZ1dGlsIGxpY2Vuc2U6ICIKKyAgICByZXR1cm4gTElDRU5TRV9QUkVGSVggRkZNUEVHX0xJQ0VOU0UgKyBzaXplb2YoTElDRU5TRV9QUkVGSVgpIC0gMTsKK30KKworY29uc3QgY2hhciAqYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKGVudW0gQVZNZWRpYVR5cGUgbWVkaWFfdHlwZSkKK3sKKyAgICBzd2l0Y2ggKG1lZGlhX3R5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzogICAgICByZXR1cm4gInZpZGVvIjsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzogICAgICByZXR1cm4gImF1ZGlvIjsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOiAgICAgICByZXR1cm4gImRhdGEiOworICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOiAgIHJldHVybiAic3VidGl0bGUiOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ6IHJldHVybiAiYXR0YWNobWVudCI7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitjaGFyIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihlbnVtIEFWUGljdHVyZVR5cGUgcGljdF90eXBlKQoreworICAgIHN3aXRjaCAocGljdF90eXBlKSB7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfSTogIHJldHVybiAnSSc7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfUDogIHJldHVybiAnUCc7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfQjogIHJldHVybiAnQic7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfUzogIHJldHVybiAnUyc7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfU0k6IHJldHVybiAnaSc7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfU1A6IHJldHVybiAncCc7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfQkk6IHJldHVybiAnYic7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgIHJldHVybiAnPyc7CisgICAgfQorfQorCit1bnNpZ25lZCBhdl9pbnRfbGlzdF9sZW5ndGhfZm9yX3NpemUodW5zaWduZWQgZWxzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmxpc3QsIHVpbnQ2NF90IHRlcm0pCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIGlmICghbGlzdCkKKyAgICAgICAgcmV0dXJuIDA7CisjZGVmaW5lIExJU1RfTEVOR1RIKHR5cGUpIFwKKyAgICB7IHR5cGUgdCA9IHRlcm0sICpsID0gKHR5cGUgKilsaXN0OyBmb3IgKGkgPSAwOyBsW2ldICE9IHQ7IGkrKyk7IH0KKyAgICBzd2l0Y2ggKGVsc2l6ZSkgeworICAgIGNhc2UgMTogTElTVF9MRU5HVEgodWludDhfdCk7ICBicmVhazsKKyAgICBjYXNlIDI6IExJU1RfTEVOR1RIKHVpbnQxNl90KTsgYnJlYWs7CisgICAgY2FzZSA0OiBMSVNUX0xFTkdUSCh1aW50MzJfdCk7IGJyZWFrOworICAgIGNhc2UgODogTElTVF9MRU5HVEgodWludDY0X3QpOyBicmVhazsKKyAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKCEidmFsaWQgZWxlbWVudCBzaXplIik7CisgICAgfQorICAgIHJldHVybiBpOworfQorCitBVlJhdGlvbmFsIGF2X2dldF90aW1lX2Jhc2VfcSh2b2lkKQoreworICAgIHJldHVybiAoQVZSYXRpb25hbCl7MSwgQVZfVElNRV9CQVNFfTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvdmVyc2lvbi5oIGIvZmZtcGVnL2xpYmF2dXRpbC92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5ZTk0MwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwvdmVyc2lvbi5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9WRVJTSU9OX0gKKyNkZWZpbmUgQVZVVElMX1ZFUlNJT05fSAorCisjaW5jbHVkZSAibWFjcm9zLmgiCisKKy8qKgorICogQGFkZHRvZ3JvdXAgdmVyc2lvbl91dGlscworICoKKyAqIFVzZWZ1bCB0byBjaGVjayBhbmQgbWF0Y2ggbGlicmFyeSB2ZXJzaW9uIGluIG9yZGVyIHRvIG1haW50YWluCisgKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICoKKyAqIEB7CisgKi8KKworI2RlZmluZSBBVl9WRVJTSU9OX0lOVChhLCBiLCBjKSAoYTw8MTYgfCBiPDw4IHwgYykKKyNkZWZpbmUgQVZfVkVSU0lPTl9ET1QoYSwgYiwgYykgYSAjIy4jIyBiICMjLiMjIGMKKyNkZWZpbmUgQVZfVkVSU0lPTihhLCBiLCBjKSBBVl9WRVJTSU9OX0RPVChhLCBiLCBjKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbGF2dQorICogTGliYXZ1dGlsIHZlcnNpb24gbWFjcm9zCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2dV92ZXIgVmVyc2lvbiBhbmQgQnVpbGQgZGlhZ25vc3RpY3MKKyAqCisgKiBNYWNyb3MgYW5kIGZ1bmN0aW9uIHVzZWZ1bCB0byBjaGVjayBhdCBjb21waWxldGltZSBhbmQgYXQgcnVudGltZQorICogd2hpY2ggdmVyc2lvbiBvZiBsaWJhdnV0aWwgaXMgaW4gdXNlLgorICoKKyAqIEB7CisgKi8KKworI2RlZmluZSBMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiAgNTQKKyNkZWZpbmUgTElCQVZVVElMX1ZFUlNJT05fTUlOT1IgIDE1CisjZGVmaW5lIExJQkFWVVRJTF9WRVJTSU9OX01JQ1JPIDEwMAorCisjZGVmaW5lIExJQkFWVVRJTF9WRVJTSU9OX0lOVCAgIEFWX1ZFUlNJT05fSU5UKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWVVRJTF9WRVJTSU9OX01JTk9SLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWVVRJTF9WRVJTSU9OX01JQ1JPKQorI2RlZmluZSBMSUJBVlVUSUxfVkVSU0lPTiAgICAgICBBVl9WRVJTSU9OKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWVVRJTF9WRVJTSU9OX01JTk9SLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkFWVVRJTF9WRVJTSU9OX01JQ1JPKQorI2RlZmluZSBMSUJBVlVUSUxfQlVJTEQgICAgICAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQKKworI2RlZmluZSBMSUJBVlVUSUxfSURFTlQgICAgICAgICAiTGF2dSIgQVZfU1RSSU5HSUZZKExJQkFWVVRJTF9WRVJTSU9OKQorCisvKioKKyAqIEB9CisgKgorICogQGRlZmdyb3VwIGRlcHJfZ3VhcmRzIERlcHJlY2F0aW9uIGd1YXJkcworICogRkZfQVBJXyogZGVmaW5lcyBtYXkgYmUgcGxhY2VkIGJlbG93IHRvIGluZGljYXRlIHB1YmxpYyBBUEkgdGhhdCB3aWxsIGJlCisgKiBkcm9wcGVkIGF0IGEgZnV0dXJlIHZlcnNpb24gYnVtcC4gVGhlIGRlZmluZXMgdGhlbXNlbHZlcyBhcmUgbm90IHBhcnQgb2YKKyAqIHRoZSBwdWJsaWMgQVBJIGFuZCBtYXkgY2hhbmdlLCBicmVhayBvciBkaXNhcHBlYXIgYXQgYW55IHRpbWUuCisgKgorICogQHsKKyAqLworCisjaWZuZGVmIEZGX0FQSV9PTERfQVZPUFRJT05TCisjZGVmaW5lIEZGX0FQSV9PTERfQVZPUFRJT05TICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTUpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX1BJWF9GTVQKKyNkZWZpbmUgRkZfQVBJX1BJWF9GTVQgICAgICAgICAgICAgICAgICAoTElCQVZVVElMX1ZFUlNJT05fTUFKT1IgPCA1NSkKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfQ09OVEVYVF9TSVpFCisjZGVmaW5lIEZGX0FQSV9DT05URVhUX1NJWkUgICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTUpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX1BJWF9GTVRfREVTQworI2RlZmluZSBGRl9BUElfUElYX0ZNVF9ERVNDICAgICAgICAgICAgIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU1KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9BVl9SRVZFUlNFCisjZGVmaW5lIEZGX0FQSV9BVl9SRVZFUlNFICAgICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTUpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0FVRElPQ09OVkVSVAorI2RlZmluZSBGRl9BUElfQVVESU9DT05WRVJUICAgICAgICAgICAgIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU1KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9DUFVfRkxBR19NTVgyCisjZGVmaW5lIEZGX0FQSV9DUFVfRkxBR19NTVgyICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTUpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0xMU19QUklWQVRFCisjZGVmaW5lIEZGX0FQSV9MTFNfUFJJVkFURSAgICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTUpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0FWRlJBTUVfTEFWQworI2RlZmluZSBGRl9BUElfQVZGUkFNRV9MQVZDICAgICAgICAgICAgIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU1KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9WRFBBVQorI2RlZmluZSBGRl9BUElfVkRQQVUgICAgICAgICAgICAgICAgICAgIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU1KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9HRVRfQ0hBTk5FTF9MQVlPVVRfQ09NUEFUCisjZGVmaW5lIEZGX0FQSV9HRVRfQ0hBTk5FTF9MQVlPVVRfQ09NUEFUIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU1KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9YVk1DCisjZGVmaW5lIEZGX0FQSV9YVk1DICAgICAgICAgICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTUpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX09QVF9UWVBFX01FVEFEQVRBCisjZGVmaW5lIEZGX0FQSV9PUFRfVFlQRV9NRVRBREFUQSAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTUpCisjZW5kaWYKKworI2lmbmRlZiBGRl9DT05TVF9BVlVUSUw1NQorI2lmIExJQkFWVVRJTF9WRVJTSU9OX01BSk9SID49IDU1CisjZGVmaW5lIEZGX0NPTlNUX0FWVVRJTDU1IGNvbnN0CisjZWxzZQorI2RlZmluZSBGRl9DT05TVF9BVlVUSUw1NQorI2VuZGlmCisjZW5kaWYKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBVlVUSUxfVkVSU0lPTl9IICovCisKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwvd2NoYXJfZmlsZW5hbWUuaCBiL2ZmbXBlZy9saWJhdnV0aWwvd2NoYXJfZmlsZW5hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTUzYzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC93Y2hhcl9maWxlbmFtZS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfV0NIQVJfRklMRU5BTUVfSAorI2RlZmluZSBBVlVUSUxfV0NIQVJfRklMRU5BTUVfSAorCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fTUlOR1czMkNFX18pCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgIm1lbS5oIgorCitzdGF0aWMgaW5saW5lIGludCB1dGY4dG93Y2hhcihjb25zdCBjaGFyICpmaWxlbmFtZV91dGY4LCB3Y2hhcl90ICoqZmlsZW5hbWVfdykKK3sKKyAgICBpbnQgbnVtX2NoYXJzOworICAgIG51bV9jaGFycyA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgTUJfRVJSX0lOVkFMSURfQ0hBUlMsIGZpbGVuYW1lX3V0ZjgsIC0xLCBOVUxMLCAwKTsKKyAgICBpZiAobnVtX2NoYXJzIDw9IDApIHsKKyAgICAgICAgKmZpbGVuYW1lX3cgPSBOVUxMOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKmZpbGVuYW1lX3cgPSAod2NoYXJfdCAqKWF2X21hbGxvY3pfYXJyYXkobnVtX2NoYXJzLCBzaXplb2Yod2NoYXJfdCkpOworICAgIGlmICghKmZpbGVuYW1lX3cpIHsKKyAgICAgICAgZXJybm8gPSBFTk9NRU07CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAwLCBmaWxlbmFtZV91dGY4LCAtMSwgKmZpbGVuYW1lX3csIG51bV9jaGFycyk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFWVVRJTF9XQ0hBUl9GSUxFTkFNRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9NYWtlZmlsZSBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkM2JkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACitPQkpTICs9IHg4Ni9jcHUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHg4Ni9mbG9hdF9kc3BfaW5pdC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHg4Ni9sbHNfaW5pdC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK09CSlMtJChDT05GSUdfUElYRUxVVElMUykgKz0geDg2L3BpeGVsdXRpbHNfaW5pdC5vICAgICAgICAgICAgICAgICAgICAgIFwKKworWUFTTS1PQkpTICs9IHg4Ni9jcHVpZC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIHg4Ni9lbW1zLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIHg4Ni9mbG9hdF9kc3AubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIHg4Ni9sbHMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitZQVNNLU9CSlMtJChDT05GSUdfUElYRUxVVElMUykgKz0geDg2L3BpeGVsdXRpbHMubyAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9hc20uaCBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNmFkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9hc20uaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9YODZfQVNNX0gKKyNkZWZpbmUgQVZVVElMX1g4Nl9BU01fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisKK3R5cGVkZWYgc3RydWN0IHhtbV9yZWcgeyB1aW50NjRfdCBhLCBiOyB9IHhtbV9yZWc7Cit0eXBlZGVmIHN0cnVjdCB5bW1fcmVnIHsgdWludDY0X3QgYSwgYiwgYywgZDsgfSB5bW1fcmVnOworCisjaWYgQVJDSF9YODZfNjQKKyMgICAgZGVmaW5lIE9QU0laRSAicSIKKyMgICAgZGVmaW5lIFJFR19hICJyYXgiCisjICAgIGRlZmluZSBSRUdfYiAicmJ4IgorIyAgICBkZWZpbmUgUkVHX2MgInJjeCIKKyMgICAgZGVmaW5lIFJFR19kICJyZHgiCisjICAgIGRlZmluZSBSRUdfRCAicmRpIgorIyAgICBkZWZpbmUgUkVHX1MgInJzaSIKKyMgICAgZGVmaW5lIFBUUl9TSVpFICI4IgordHlwZWRlZiBpbnQ2NF90IHg4Nl9yZWc7CisKKyMgICAgZGVmaW5lIFJFR19TUCAicnNwIgorIyAgICBkZWZpbmUgUkVHX0JQICJyYnAiCisjICAgIGRlZmluZSBSRUdCUCAgIHJicAorIyAgICBkZWZpbmUgUkVHYSAgICByYXgKKyMgICAgZGVmaW5lIFJFR2IgICAgcmJ4CisjICAgIGRlZmluZSBSRUdjICAgIHJjeAorIyAgICBkZWZpbmUgUkVHZCAgICByZHgKKyMgICAgZGVmaW5lIFJFR1NQICAgcnNwCisKKyNlbGlmIEFSQ0hfWDg2XzMyCisKKyMgICAgZGVmaW5lIE9QU0laRSAibCIKKyMgICAgZGVmaW5lIFJFR19hICJlYXgiCisjICAgIGRlZmluZSBSRUdfYiAiZWJ4IgorIyAgICBkZWZpbmUgUkVHX2MgImVjeCIKKyMgICAgZGVmaW5lIFJFR19kICJlZHgiCisjICAgIGRlZmluZSBSRUdfRCAiZWRpIgorIyAgICBkZWZpbmUgUkVHX1MgImVzaSIKKyMgICAgZGVmaW5lIFBUUl9TSVpFICI0IgordHlwZWRlZiBpbnQzMl90IHg4Nl9yZWc7CisKKyMgICAgZGVmaW5lIFJFR19TUCAiZXNwIgorIyAgICBkZWZpbmUgUkVHX0JQICJlYnAiCisjICAgIGRlZmluZSBSRUdCUCAgIGVicAorIyAgICBkZWZpbmUgUkVHYSAgICBlYXgKKyMgICAgZGVmaW5lIFJFR2IgICAgZWJ4CisjICAgIGRlZmluZSBSRUdjICAgIGVjeAorIyAgICBkZWZpbmUgUkVHZCAgICBlZHgKKyMgICAgZGVmaW5lIFJFR1NQICAgZXNwCisjZWxzZQordHlwZWRlZiBpbnQgeDg2X3JlZzsKKyNlbmRpZgorCisjZGVmaW5lIEhBVkVfN1JFR1MgKEFSQ0hfWDg2XzY0IHx8IChIQVZFX0VCWF9BVkFJTEFCTEUgJiYgSEFWRV9FQlBfQVZBSUxBQkxFKSkKKyNkZWZpbmUgSEFWRV82UkVHUyAoQVJDSF9YODZfNjQgfHwgKEhBVkVfRUJYX0FWQUlMQUJMRSB8fCBIQVZFX0VCUF9BVkFJTEFCTEUpKQorCisjaWYgQVJDSF9YODZfNjQgJiYgZGVmaW5lZChQSUMpCisjICAgIGRlZmluZSBCUk9LRU5fUkVMT0NBVElPTlMgMQorI2VuZGlmCisKKy8qCisgKiBJZiBnY2MgaXMgbm90IHNldCB0byBzdXBwb3J0IHNzZSAoLW1zc2UpIGl0IHdpbGwgbm90IGFjY2VwdCB4bW0gcmVnaXN0ZXJzCisgKiBpbiB0aGUgY2xvYmJlciBsaXN0IGZvciBpbmxpbmUgYXNtLiBYTU1fQ0xPQkJFUlMgdGFrZXMgYSBsaXN0IG9mIHhtbQorICogcmVnaXN0ZXJzIHRvIGJlIG1hcmtlZCBhcyBjbG9iYmVyZWQgYW5kIGV2YWx1YXRlcyB0byBub3RoaW5nIGlmIHRoZXkgYXJlCisgKiBub3Qgc3VwcG9ydGVkLCBvciB0byB0aGUgbGlzdCBpdHNlbGYgaWYgdGhleSBhcmUgc3VwcG9ydGVkLiBTaW5jZSBhIGNsb2JiZXIKKyAqIGxpc3QgbWF5IG5vdCBiZSBlbXB0eSwgWE1NX0NMT0JCRVJTX09OTFkgc2hvdWxkIGJlIHVzZWQgaWYgdGhlIHhtbQorICogcmVnaXN0ZXJzIGFyZSB0aGUgb25seSBpbiB0aGUgY2xvYmJlciBsaXN0LgorICogRm9yIGV4YW1wbGUgYSBsaXN0IHdpdGggImVheCIgYW5kICJ4bW0wIiBhcyBjbG9iYmVycyBzaG91bGQgYmVjb21lOgorICogOiBYTU1fQ0xPQkJFUlMoInhtbTAiLCkgImVheCIKKyAqIGFuZCBhIGxpc3Qgd2l0aCBvbmx5ICJ4bW0wIiBzaG91bGQgYmVjb21lOgorICogWE1NX0NMT0JCRVJTX09OTFkoInhtbTAiKQorICovCisjaWYgSEFWRV9YTU1fQ0xPQkJFUlMKKyMgICAgZGVmaW5lIFhNTV9DTE9CQkVSUyguLi4pICAgICAgICBfX1ZBX0FSR1NfXworIyAgICBkZWZpbmUgWE1NX0NMT0JCRVJTX09OTFkoLi4uKSA6IF9fVkFfQVJHU19fCisjZWxzZQorIyAgICBkZWZpbmUgWE1NX0NMT0JCRVJTKC4uLikKKyMgICAgZGVmaW5lIFhNTV9DTE9CQkVSU19PTkxZKC4uLikKKyNlbmRpZgorCisvKiBVc2UgdG8gZXhwb3J0IGxhYmVscyBmcm9tIGFzbS4gKi8KKyNkZWZpbmUgTEFCRUxfTUFOR0xFKGEpIEVYVEVSTl9QUkVGSVggI2EKKworLy8gVXNlIHJpcC1yZWxhdGl2ZSBhZGRyZXNzaW5nIGlmIGNvbXBpbGluZyBQSUMgY29kZSBvbiB4ODYtNjQuCisjaWYgQVJDSF9YODZfNjQgJiYgZGVmaW5lZChQSUMpCisjICAgIGRlZmluZSBMT0NBTF9NQU5HTEUoYSkgI2EgIiglJXJpcCkiCisjZWxzZQorIyAgICBkZWZpbmUgTE9DQUxfTUFOR0xFKGEpICNhCisjZW5kaWYKKworI2lmIEhBVkVfSU5MSU5FX0FTTV9ESVJFQ1RfU1lNQk9MX1JFRlMKKyMgICBkZWZpbmUgTUFOR0xFKGEpIEVYVEVSTl9QUkVGSVggTE9DQUxfTUFOR0xFKGEpCisjICAgZGVmaW5lIE5BTUVEX0NPTlNUUkFJTlRTX0FERCguLi4pCisjICAgZGVmaW5lIE5BTUVEX0NPTlNUUkFJTlRTKC4uLikKKyMgICBkZWZpbmUgTkFNRURfQ09OU1RSQUlOVFNfQVJSQVlfQUREKC4uLikKKyMgICBkZWZpbmUgTkFNRURfQ09OU1RSQUlOVFNfQVJSQVkoLi4uKQorI2Vsc2UKKyAgICAvKiBXaGVuIGRpcmVjdCBzeW1ib2wgcmVmZXJlbmNlcyBhcmUgdXNlZCBpbiBjb2RlIHBhc3NlZCB0byBhIGNvbXBpbGVyIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGVtCisgICAgICogIHRoZW4gdGhlc2UgcmVmZXJlbmNlcyBuZWVkIHRvIGJlIGNvbnZlcnRlZCB0byBuYW1lZCBhc20gY29uc3RyYWludHMgaW5zdGVhZC4KKyAgICAgKiBJbnN0ZWFkIG9mIHJldHVybmluZyBhIGRpcmVjdCBzeW1ib2wgTUFOR0xFIG5vdyByZXR1cm5zIGEgbmFtZWQgY29uc3RyYWludCBmb3IgdGhhdCBzcGVjaWZpYyBzeW1ib2wuCisgICAgICogSW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayB0aGVyZSBtdXN0IGFsc28gYmUgYSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBhc20taW50ZXJmYWNlLiBUbyBhZGQgdGhpcworICAgICAqICBlbnRyeSB1c2UgdGhlIG1hY3JvIE5BTUVEX0NPTlNUUkFJTlRTKCkgYW5kIHBhc3MgaW4gYSBsaXN0IG9mIGVhY2ggc3ltYm9sIHJlZmVyZW5jZSB1c2VkIGluIHRoZQorICAgICAqICBjb3JyZXNwb25kaW5nIGJsb2NrIG9mIGNvZGUuIChlLmcuIE5BTUVEX0NPTlNUUkFJTlRTKHZhcjEsdmFyMix2YXIzKSB3aGVyZSB2YXIxIGlzIHRoZSBmaXJzdCBzeW1ib2wgZXRjLiApLgorICAgICAqIElmIHRoZXJlIGFyZSBhbHJlYWR5IGV4aXN0aW5nIGNvbnN0cmFpbnRzIHRoZW4gdXNlIE5BTUVEX0NPTlNUUkFJTlRTX0FERCB0byBhZGQgdG8gdGhlIGV4aXN0aW5nIGNvbnN0cmFpbnQgbGlzdC4KKyAgICAgKi8KKyMgICBkZWZpbmUgTUFOR0xFKGEpICIlWyIjYSJdIgorICAgIC8vIEludGVsL01TVkMgZG9lcyBub3QgY29ycmVjdGx5IGV4cGFuZCB2YS1hcmdzIHNvIHdlIG5lZWQgYSByYXRoZXIgdWdseSBoYWNrIGluIG9yZGVyIHRvIGdldCBpdCB0byB3b3JrCisjICAgZGVmaW5lIEZFXzAoUCxYKSBQKFgpCisjICAgZGVmaW5lIEZFXzEoUCxYLFgxKSBQKFgpLCBGRV8wKFAsWDEpCisjICAgZGVmaW5lIEZFXzIoUCxYLFgxLFgyKSBQKFgpLCBGRV8xKFAsWDEsWDIpCisjICAgZGVmaW5lIEZFXzMoUCxYLFgxLFgyLFgzKSBQKFgpLCBGRV8yKFAsWDEsWDIsWDMpCisjICAgZGVmaW5lIEZFXzQoUCxYLFgxLFgyLFgzLFg0KSBQKFgpLCBGRV8zKFAsWDEsWDIsWDMsWDQpCisjICAgZGVmaW5lIEZFXzUoUCxYLFgxLFgyLFgzLFg0LFg1KSBQKFgpLCBGRV80KFAsWDEsWDIsWDMsWDQsWDUpCisjICAgZGVmaW5lIEZFXzYoUCxYLFgxLFgyLFgzLFg0LFg1LFg2KSBQKFgpLCBGRV81KFAsWDEsWDIsWDMsWDQsWDUsWDYpCisjICAgZGVmaW5lIEZFXzcoUCxYLFgxLFgyLFgzLFg0LFg1LFg2LFg3KSBQKFgpLCBGRV82KFAsWDEsWDIsWDMsWDQsWDUsWDYsWDcpCisjICAgZGVmaW5lIEZFXzgoUCxYLFgxLFgyLFgzLFg0LFg1LFg2LFg3LFg4KSBQKFgpLCBGRV83KFAsWDEsWDIsWDMsWDQsWDUsWDYsWDcsWDgpCisjICAgZGVmaW5lIEZFXzkoUCxYLFgxLFgyLFgzLFg0LFg1LFg2LFg3LFg4LFg5KSBQKFgpLCBGRV84KFAsWDEsWDIsWDMsWDQsWDUsWDYsWDcsWDgsWDkpCisjICAgZGVmaW5lIEdFVF9GRV9JTVBMKF8wLF8xLF8yLF8zLF80LF81LF82LF83LF84LF85LE5BTUUsLi4uKSBOQU1FCisjICAgZGVmaW5lIEdFVF9GRShBKSBHRVRfRkVfSU1QTCBBCisjICAgZGVmaW5lIEdFVF9GRV9HTFVFKHgsIHkpIHggeQorIyAgIGRlZmluZSBGT1JfRUFDSF9WQShQLC4uLikgR0VUX0ZFX0dMVUUoR0VUX0ZFKChfX1ZBX0FSR1NfXyxGRV85LEZFXzgsRkVfNyxGRV82LEZFXzUsRkVfNCxGRV8zLEZFXzIsRkVfMSxGRV8wKSksIChQLF9fVkFfQVJHU19fKSkKKyMgICBkZWZpbmUgTkFNRV9DT05TVFJBSU5UKHgpIFt4XSAibSIoeCkKKyAgICAvLyBQYXJhbWV0ZXJzIGFyZSBhIGxpc3Qgb2YgZWFjaCBzeW1ib2wgcmVmZXJlbmNlIHJlcXVpcmVkCisjICAgZGVmaW5lIE5BTUVEX0NPTlNUUkFJTlRTX0FERCguLi4pICwgRk9SX0VBQ0hfVkEoTkFNRV9DT05TVFJBSU5ULF9fVkFfQVJHU19fKQorICAgIC8vIFNhbWUgYnV0IHdpdGhvdXQgY29tbWEgZm9yIHdoZW4gdGhlcmUgYXJlIG5vIHByZXZpb3VzbHkgZGVmaW5lZCBjb25zdHJhaW50cworIyAgIGRlZmluZSBOQU1FRF9DT05TVFJBSU5UUyguLi4pIEZPUl9FQUNIX1ZBKE5BTUVfQ09OU1RSQUlOVCxfX1ZBX0FSR1NfXykKKyAgICAvLyBTYW1lIGFzIGFib3ZlIE5BTUVEX0NPTlNUUkFJTlRTIGV4Y2VwdCB1c2VkIGZvciBwYXNzaW5nIGFycmF5cy9wb2ludGVycyBpbnN0ZWFkIG9mIG5vcm1hbCB2YXJpYWJsZXMKKyMgICBkZWZpbmUgTkFNRV9DT05TVFJBSU5UX0FSUkFZKHgpIFt4XSAibSIoKngpCisjICAgZGVmaW5lIE5BTUVEX0NPTlNUUkFJTlRTX0FSUkFZX0FERCguLi4pICwgRk9SX0VBQ0hfVkEoTkFNRV9DT05TVFJBSU5UX0FSUkFZLF9fVkFfQVJHU19fKQorIyAgIGRlZmluZSBOQU1FRF9DT05TVFJBSU5UU19BUlJBWSguLi4pIEZPUl9FQUNIX1ZBKE5BTUVfQ09OU1RSQUlOVF9BUlJBWSxfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisjZW5kaWYgLyogQVZVVElMX1g4Nl9BU01fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC94ODYvYnN3YXAuaCBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L2Jzd2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlMmE2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L2Jzd2FwLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBieXRlIHN3YXBwaW5nIHJvdXRpbmVzCisgKi8KKworI2lmbmRlZiBBVlVUSUxfWDg2X0JTV0FQX0gKKyNkZWZpbmUgQVZVVElMX1g4Nl9CU1dBUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKKyNpZiAhQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoNCwxKQorI2RlZmluZSBhdl9ic3dhcDE2IGF2X2Jzd2FwMTYKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IHVuc2lnbmVkIGF2X2Jzd2FwMTYodW5zaWduZWQgeCkKK3sKKyAgICBfX2FzbV9fKCJyb3J3ICQ4LCAldzAiIDogIityIih4KSk7CisgICAgcmV0dXJuIHg7Cit9CisjZW5kaWYgLyogIUFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDQsMSkgKi8KKworI2lmICFBVl9HQ0NfVkVSU0lPTl9BVF9MRUFTVCg0LDUpCisjZGVmaW5lIGF2X2Jzd2FwMzIgYXZfYnN3YXAzMgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgdWludDMyX3QgYXZfYnN3YXAzMih1aW50MzJfdCB4KQoreworICAgIF9fYXNtX18oImJzd2FwICAgJTAiIDogIityIiAoeCkpOworICAgIHJldHVybiB4OworfQorCisjaWYgQVJDSF9YODZfNjQKKyNkZWZpbmUgYXZfYnN3YXA2NCBhdl9ic3dhcDY0CitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGF2X2NvbnN0IGF2X2Jzd2FwNjQodWludDY0X3QgeCkKK3sKKyAgICBfX2FzbV9fKCJic3dhcCAgJTAiOiAiPXIiICh4KSA6ICIwIiAoeCkpOworICAgIHJldHVybiB4OworfQorI2VuZGlmCisjZW5kaWYgLyogIUFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDQsNSkgKi8KKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworI2VuZGlmIC8qIEFWVVRJTF9YODZfQlNXQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC94ODYvY3B1LmMgYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjYyZTkyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC94ODYvY3B1LmMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDUFUgZGV0ZWN0aW9uIGNvZGUsIGV4dHJhY3RlZCBmcm9tIG1teC5oCisgKiAoYykxOTk3LTk5IGJ5IEguIERpZXR6IGFuZCBSLiBGaXNoZXIKKyAqIENvbnZlcnRlZCB0byBDIGFuZCBpbXByb3ZlZCBieSBGYWJyaWNlIEJlbGxhcmQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdV9pbnRlcm5hbC5oIgorCisjaWYgSEFWRV9ZQVNNCisKKyNkZWZpbmUgY3B1aWQoaW5kZXgsIGVheCwgZWJ4LCBlY3gsIGVkeCkgICAgICAgIFwKKyAgICBmZl9jcHVfY3B1aWQoaW5kZXgsICZlYXgsICZlYngsICZlY3gsICZlZHgpCisKKyNkZWZpbmUgeGdldGJ2KGluZGV4LCBlYXgsIGVkeCkgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9jcHVfeGdldGJ2KGluZGV4LCAmZWF4LCAmZWR4KQorCisjZWxpZiBIQVZFX0lOTElORV9BU00KKworLyogZWJ4IHNhdmluZyBpcyBuZWNlc3NhcnkgZm9yIFBJQy4gZ2NjIHNlZW1zIHVuYWJsZSB0byBzZWUgaXQgYWxvbmUgKi8KKyNkZWZpbmUgY3B1aWQoaW5kZXgsIGVheCwgZWJ4LCBlY3gsIGVkeCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92ICAgICUlIlJFR19iIiwgJSUiUkVHX1MiIFxuXHQiICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImNwdWlkICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJ4Y2hnICAgJSUiUkVHX2IiLCAlJSJSRUdfUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICI9YSIgKGVheCksICI9UyIgKGVieCksICI9YyIgKGVjeCksICI9ZCIgKGVkeCkgICAgICAgIFwKKyAgICAgICAgOiAiMCIgKGluZGV4KSwgIjIiKDApKQorCisjZGVmaW5lIHhnZXRidihpbmRleCwgZWF4LCBlZHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gKCIuYnl0ZSAweDBmLCAweDAxLCAweGQwIiA6ICI9YSIoZWF4KSwgIj1kIihlZHgpIDogImMiIChpbmRleCkpCisKKyNkZWZpbmUgZ2V0X2VmbGFncyh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgicHVzaGZsICAgICBcbiIgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAicG9wICAgICUwICBcbiIgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIoeCkpCisKKyNkZWZpbmUgc2V0X2VmbGFncyh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgicHVzaCAgICAlMCBcbiIgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAicG9wZmwgICAgICBcbiIgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICA6OiAiciIoeCkpCisKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworI2lmIEFSQ0hfWDg2XzY0CisKKyNkZWZpbmUgY3B1aWRfdGVzdCgpIDEKKworI2VsaWYgSEFWRV9ZQVNNCisKKyNkZWZpbmUgY3B1aWRfdGVzdCBmZl9jcHVfY3B1aWRfdGVzdAorCisjZWxpZiBIQVZFX0lOTElORV9BU00KKworc3RhdGljIGludCBjcHVpZF90ZXN0KHZvaWQpCit7CisgICAgeDg2X3JlZyBhLCBjOworCisgICAgLyogQ2hlY2sgaWYgQ1BVSUQgaXMgc3VwcG9ydGVkIGJ5IGF0dGVtcHRpbmcgdG8gdG9nZ2xlIHRoZSBJRCBiaXQgaW4KKyAgICAgKiB0aGUgRUZMQUdTIHJlZ2lzdGVyLiAqLworICAgIGdldF9lZmxhZ3MoYSk7CisgICAgc2V0X2VmbGFncyhhIF4gMHgyMDAwMDApOworICAgIGdldF9lZmxhZ3MoYyk7CisKKyAgICByZXR1cm4gYSAhPSBjOworfQorI2VuZGlmCisKKy8qIEZ1bmN0aW9uIHRvIHRlc3QgaWYgbXVsdGltZWRpYSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZC4uLiAgKi8KK2ludCBmZl9nZXRfY3B1X2ZsYWdzX3g4Nih2b2lkKQoreworICAgIGludCBydmFsID0gMDsKKworI2lmZGVmIGNwdWlkCisKKyAgICBpbnQgZWF4LCBlYngsIGVjeCwgZWR4OworICAgIGludCBtYXhfc3RkX2xldmVsLCBtYXhfZXh0X2xldmVsLCBzdGRfY2FwcyA9IDAsIGV4dF9jYXBzID0gMDsKKyAgICBpbnQgZmFtaWx5ID0gMCwgbW9kZWwgPSAwOworICAgIHVuaW9uIHsgaW50IGlbM107IGNoYXIgY1sxMl07IH0gdmVuZG9yOworCisgICAgaWYgKCFjcHVpZF90ZXN0KCkpCisgICAgICAgIHJldHVybiAwOyAvKiBDUFVJRCBub3Qgc3VwcG9ydGVkICovCisKKyAgICBjcHVpZCgwLCBtYXhfc3RkX2xldmVsLCB2ZW5kb3IuaVswXSwgdmVuZG9yLmlbMl0sIHZlbmRvci5pWzFdKTsKKworICAgIGlmIChtYXhfc3RkX2xldmVsID49IDEpIHsKKyAgICAgICAgY3B1aWQoMSwgZWF4LCBlYngsIGVjeCwgc3RkX2NhcHMpOworICAgICAgICBmYW1pbHkgPSAoKGVheCA+PiA4KSAmIDB4ZikgKyAoKGVheCA+PiAyMCkgJiAweGZmKTsKKyAgICAgICAgbW9kZWwgID0gKChlYXggPj4gNCkgJiAweGYpICsgKChlYXggPj4gMTIpICYgMHhmMCk7CisgICAgICAgIGlmIChzdGRfY2FwcyAmICgxIDw8IDE1KSkKKyAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfQ01PVjsKKyAgICAgICAgaWYgKHN0ZF9jYXBzICYgKDEgPDwgMjMpKQorICAgICAgICAgICAgcnZhbCB8PSBBVl9DUFVfRkxBR19NTVg7CisgICAgICAgIGlmIChzdGRfY2FwcyAmICgxIDw8IDI1KSkKKyAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfTU1YRVhUOworI2lmIEhBVkVfU1NFCisgICAgICAgIGlmIChzdGRfY2FwcyAmICgxIDw8IDI1KSkKKyAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfU1NFOworICAgICAgICBpZiAoc3RkX2NhcHMgJiAoMSA8PCAyNikpCisgICAgICAgICAgICBydmFsIHw9IEFWX0NQVV9GTEFHX1NTRTI7CisgICAgICAgIGlmIChlY3ggJiAxKQorICAgICAgICAgICAgcnZhbCB8PSBBVl9DUFVfRkxBR19TU0UzOworICAgICAgICBpZiAoZWN4ICYgMHgwMDAwMDIwMCApCisgICAgICAgICAgICBydmFsIHw9IEFWX0NQVV9GTEFHX1NTU0UzOworICAgICAgICBpZiAoZWN4ICYgMHgwMDA4MDAwMCApCisgICAgICAgICAgICBydmFsIHw9IEFWX0NQVV9GTEFHX1NTRTQ7CisgICAgICAgIGlmIChlY3ggJiAweDAwMTAwMDAwICkKKyAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfU1NFNDI7CisjaWYgSEFWRV9BVlgKKyAgICAgICAgLyogQ2hlY2sgT1hTQVZFIGFuZCBBVlggYml0cyAqLworICAgICAgICBpZiAoKGVjeCAmIDB4MTgwMDAwMDApID09IDB4MTgwMDAwMDApIHsKKyAgICAgICAgICAgIC8qIENoZWNrIGZvciBPUyBzdXBwb3J0ICovCisgICAgICAgICAgICB4Z2V0YnYoMCwgZWF4LCBlZHgpOworICAgICAgICAgICAgaWYgKChlYXggJiAweDYpID09IDB4NikgeworICAgICAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfQVZYOworICAgICAgICAgICAgICAgIGlmIChlY3ggJiAweDAwMDAxMDAwKQorICAgICAgICAgICAgICAgICAgICBydmFsIHw9IEFWX0NQVV9GTEFHX0ZNQTM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBIQVZFX0FWWCAqLworI2VuZGlmIC8qIEhBVkVfU1NFICovCisgICAgfQorICAgIGlmIChtYXhfc3RkX2xldmVsID49IDcpIHsKKyAgICAgICAgY3B1aWQoNywgZWF4LCBlYngsIGVjeCwgZWR4KTsKKyNpZiBIQVZFX0FWWDIKKyAgICAgICAgaWYgKChydmFsICYgQVZfQ1BVX0ZMQUdfQVZYKSAmJiAoZWJ4ICYgMHgwMDAwMDAyMCkpCisgICAgICAgICAgICBydmFsIHw9IEFWX0NQVV9GTEFHX0FWWDI7CisjZW5kaWYgLyogSEFWRV9BVlgyICovCisgICAgICAgIC8qIEJNSTEvMiBkb24ndCBuZWVkIE9TIHN1cHBvcnQgKi8KKyAgICAgICAgaWYgKGVieCAmIDB4MDAwMDAwMDgpIHsKKyAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfQk1JMTsKKyAgICAgICAgICAgIGlmIChlYnggJiAweDAwMDAwMTAwKQorICAgICAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfQk1JMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNwdWlkKDB4ODAwMDAwMDAsIG1heF9leHRfbGV2ZWwsIGVieCwgZWN4LCBlZHgpOworCisgICAgaWYgKG1heF9leHRfbGV2ZWwgPj0gMHg4MDAwMDAwMSkgeworICAgICAgICBjcHVpZCgweDgwMDAwMDAxLCBlYXgsIGVieCwgZWN4LCBleHRfY2Fwcyk7CisgICAgICAgIGlmIChleHRfY2FwcyAmICgxVSA8PCAzMSkpCisgICAgICAgICAgICBydmFsIHw9IEFWX0NQVV9GTEFHXzNETk9XOworICAgICAgICBpZiAoZXh0X2NhcHMgJiAoMSA8PCAzMCkpCisgICAgICAgICAgICBydmFsIHw9IEFWX0NQVV9GTEFHXzNETk9XRVhUOworICAgICAgICBpZiAoZXh0X2NhcHMgJiAoMSA8PCAyMykpCisgICAgICAgICAgICBydmFsIHw9IEFWX0NQVV9GTEFHX01NWDsKKyAgICAgICAgaWYgKGV4dF9jYXBzICYgKDEgPDwgMjIpKQorICAgICAgICAgICAgcnZhbCB8PSBBVl9DUFVfRkxBR19NTVhFWFQ7CisKKyAgICAgICAgLyogQWxsb3cgZm9yIHNlbGVjdGl2ZWx5IGRpc2FibGluZyBTU0UyIGZ1bmN0aW9ucyBvbiBBTUQgcHJvY2Vzc29ycworICAgICAgICAgICB3aXRoIFNTRTIgc3VwcG9ydCBidXQgbm90IFNTRTRhLiBUaGlzIGluY2x1ZGVzIEF0aGxvbjY0LCBzb21lCisgICAgICAgICAgIE9wdGVyb24sIGFuZCBzb21lIFNlbXByb24gcHJvY2Vzc29ycy4gTU1YLCBTU0UsIG9yIDNETm93ISBhcmUgZmFzdGVyCisgICAgICAgICAgIHRoYW4gU1NFMiBvZnRlbiBlbm91Z2ggdG8gdXRpbGl6ZSB0aGlzIHNwZWNpYWwtY2FzZSBmbGFnLgorICAgICAgICAgICBBVl9DUFVfRkxBR19TU0UyIGFuZCBBVl9DUFVfRkxBR19TU0UyU0xPVyBhcmUgYm90aCBzZXQgaW4gdGhpcyBjYXNlCisgICAgICAgICAgIHNvIHRoYXQgU1NFMiBpcyB1c2VkIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkIGJ5IGNoZWNraW5nCisgICAgICAgICAgIEFWX0NQVV9GTEFHX1NTRTJTTE9XLiAqLworICAgICAgICBpZiAoIXN0cm5jbXAodmVuZG9yLmMsICJBdXRoZW50aWNBTUQiLCAxMikgJiYKKyAgICAgICAgICAgIHJ2YWwgJiBBVl9DUFVfRkxBR19TU0UyICYmICEoZWN4ICYgMHgwMDAwMDA0MCkpIHsKKyAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfU1NFMlNMT1c7CisgICAgICAgIH0KKworICAgICAgICAvKiBYT1AgYW5kIEZNQTQgdXNlIHRoZSBBVlggaW5zdHJ1Y3Rpb24gY29kaW5nIHNjaGVtZSwgc28gdGhleSBjYW4ndCBiZQorICAgICAgICAgKiB1c2VkIHVubGVzcyB0aGUgT1MgaGFzIEFWWCBzdXBwb3J0LiAqLworICAgICAgICBpZiAocnZhbCAmIEFWX0NQVV9GTEFHX0FWWCkgeworICAgICAgICAgICAgaWYgKGVjeCAmIDB4MDAwMDA4MDApCisgICAgICAgICAgICAgICAgcnZhbCB8PSBBVl9DUFVfRkxBR19YT1A7CisgICAgICAgICAgICBpZiAoZWN4ICYgMHgwMDAxMDAwMCkKKyAgICAgICAgICAgICAgICBydmFsIHw9IEFWX0NQVV9GTEFHX0ZNQTQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXN0cm5jbXAodmVuZG9yLmMsICJHZW51aW5lSW50ZWwiLCAxMikpIHsKKyAgICAgICAgaWYgKGZhbWlseSA9PSA2ICYmIChtb2RlbCA9PSA5IHx8IG1vZGVsID09IDEzIHx8IG1vZGVsID09IDE0KSkgeworICAgICAgICAgICAgLyogNi85IChwZW50aXVtLW0gImJhbmlhcyIpLCA2LzEzIChwZW50aXVtLW0gImRvdGhhbiIpLCBhbmQKKyAgICAgICAgICAgICAqIDYvMTQgKGNvcmUxICJ5b25haCIpIHRoZW9yZXRpY2FsbHkgc3VwcG9ydCBzc2UyLCBidXQgaXQncworICAgICAgICAgICAgICogdXN1YWxseSBzbG93ZXIgdGhhbiBtbXgsIHNvIGxldCdzIGp1c3QgcHJldGVuZCB0aGV5IGRvbid0LgorICAgICAgICAgICAgICogQVZfQ1BVX0ZMQUdfU1NFMiBpcyBkaXNhYmxlZCBhbmQgQVZfQ1BVX0ZMQUdfU1NFMlNMT1cgaXMKKyAgICAgICAgICAgICAqIGVuYWJsZWQgc28gdGhhdCBTU0UyIGlzIG5vdCB1c2VkIHVubGVzcyBleHBsaWNpdGx5IGVuYWJsZWQKKyAgICAgICAgICAgICAqIGJ5IGNoZWNraW5nIEFWX0NQVV9GTEFHX1NTRTJTTE9XLiBUaGUgc2FtZSBzaXR1YXRpb24KKyAgICAgICAgICAgICAqIGFwcGxpZXMgZm9yIEFWX0NQVV9GTEFHX1NTRTMgYW5kIEFWX0NQVV9GTEFHX1NTRTNTTE9XLiAqLworICAgICAgICAgICAgaWYgKHJ2YWwgJiBBVl9DUFVfRkxBR19TU0UyKQorICAgICAgICAgICAgICAgIHJ2YWwgXj0gQVZfQ1BVX0ZMQUdfU1NFMlNMT1cgfCBBVl9DUFVfRkxBR19TU0UyOworICAgICAgICAgICAgaWYgKHJ2YWwgJiBBVl9DUFVfRkxBR19TU0UzKQorICAgICAgICAgICAgICAgIHJ2YWwgXj0gQVZfQ1BVX0ZMQUdfU1NFM1NMT1cgfCBBVl9DUFVfRkxBR19TU0UzOworICAgICAgICB9CisgICAgICAgIC8qIFRoZSBBdG9tIHByb2Nlc3NvciBoYXMgU1NTRTMgc3VwcG9ydCwgd2hpY2ggaXMgdXNlZnVsIGluIG1hbnkgY2FzZXMsCisgICAgICAgICAqIGJ1dCBzb21ldGltZXMgdGhlIFNTU0UzIHZlcnNpb24gaXMgc2xvd2VyIHRoYW4gdGhlIFNTRTIgZXF1aXZhbGVudAorICAgICAgICAgKiBvbiB0aGUgQXRvbSwgYnV0IGlzIGdlbmVyYWxseSBmYXN0ZXIgb24gb3RoZXIgcHJvY2Vzc29ycyBzdXBwb3J0aW5nCisgICAgICAgICAqIFNTU0UzLiBUaGlzIGZsYWcgYWxsb3dzIGZvciBzZWxlY3RpdmVseSBkaXNhYmxpbmcgY2VydGFpbiBTU1NFMworICAgICAgICAgKiBmdW5jdGlvbnMgb24gdGhlIEF0b20uICovCisgICAgICAgIGlmIChmYW1pbHkgPT0gNiAmJiBtb2RlbCA9PSAyOCkKKyAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfQVRPTTsKKyAgICB9CisKKyNlbmRpZiAvKiBjcHVpZCAqLworCisgICAgcmV0dXJuIHJ2YWw7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9jcHUuaCBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L2NwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjRiMWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9jcHUuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX1g4Nl9DUFVfSAorI2RlZmluZSBBVlVUSUxfWDg2X0NQVV9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdV9pbnRlcm5hbC5oIgorCisjZGVmaW5lIEFWX0NQVV9GTEFHX0FNRDNETk9XICAgIEFWX0NQVV9GTEFHXzNETk9XCisjZGVmaW5lIEFWX0NQVV9GTEFHX0FNRDNETk9XRVhUIEFWX0NQVV9GTEFHXzNETk9XRVhUCisKKyNkZWZpbmUgWDg2X0FNRDNETk9XKGZsYWdzKSAgICAgICAgIENQVUVYVChmbGFncywgQU1EM0ROT1cpCisjZGVmaW5lIFg4Nl9BTUQzRE5PV0VYVChmbGFncykgICAgICBDUFVFWFQoZmxhZ3MsIEFNRDNETk9XRVhUKQorI2RlZmluZSBYODZfTU1YKGZsYWdzKSAgICAgICAgICAgICAgQ1BVRVhUKGZsYWdzLCBNTVgpCisjZGVmaW5lIFg4Nl9NTVhFWFQoZmxhZ3MpICAgICAgICAgICBDUFVFWFQoZmxhZ3MsIE1NWEVYVCkKKyNkZWZpbmUgWDg2X1NTRShmbGFncykgICAgICAgICAgICAgIENQVUVYVChmbGFncywgU1NFKQorI2RlZmluZSBYODZfU1NFMihmbGFncykgICAgICAgICAgICAgQ1BVRVhUKGZsYWdzLCBTU0UyKQorI2RlZmluZSBYODZfU1NFMyhmbGFncykgICAgICAgICAgICAgQ1BVRVhUKGZsYWdzLCBTU0UzKQorI2RlZmluZSBYODZfU1NTRTMoZmxhZ3MpICAgICAgICAgICAgQ1BVRVhUKGZsYWdzLCBTU1NFMykKKyNkZWZpbmUgWDg2X1NTRTQoZmxhZ3MpICAgICAgICAgICAgIENQVUVYVChmbGFncywgU1NFNCkKKyNkZWZpbmUgWDg2X1NTRTQyKGZsYWdzKSAgICAgICAgICAgIENQVUVYVChmbGFncywgU1NFNDIpCisjZGVmaW5lIFg4Nl9BVlgoZmxhZ3MpICAgICAgICAgICAgICBDUFVFWFQoZmxhZ3MsIEFWWCkKKyNkZWZpbmUgWDg2X1hPUChmbGFncykgICAgICAgICAgICAgIENQVUVYVChmbGFncywgWE9QKQorI2RlZmluZSBYODZfRk1BMyhmbGFncykgICAgICAgICAgICAgQ1BVRVhUKGZsYWdzLCBGTUEzKQorI2RlZmluZSBYODZfRk1BNChmbGFncykgICAgICAgICAgICAgQ1BVRVhUKGZsYWdzLCBGTUE0KQorI2RlZmluZSBYODZfQVZYMihmbGFncykgICAgICAgICAgICAgQ1BVRVhUKGZsYWdzLCBBVlgyKQorCisjZGVmaW5lIEVYVEVSTkFMX0FNRDNETk9XKGZsYWdzKSAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfRVhURVJOQUwsIEFNRDNETk9XKQorI2RlZmluZSBFWFRFUk5BTF9BTUQzRE5PV0VYVChmbGFncykgQ1BVRVhUX1NVRkZJWChmbGFncywgX0VYVEVSTkFMLCBBTUQzRE5PV0VYVCkKKyNkZWZpbmUgRVhURVJOQUxfTU1YKGZsYWdzKSAgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9FWFRFUk5BTCwgTU1YKQorI2RlZmluZSBFWFRFUk5BTF9NTVhFWFQoZmxhZ3MpICAgICAgQ1BVRVhUX1NVRkZJWChmbGFncywgX0VYVEVSTkFMLCBNTVhFWFQpCisjZGVmaW5lIEVYVEVSTkFMX1NTRShmbGFncykgICAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfRVhURVJOQUwsIFNTRSkKKyNkZWZpbmUgRVhURVJOQUxfU1NFMihmbGFncykgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9FWFRFUk5BTCwgU1NFMikKKyNkZWZpbmUgRVhURVJOQUxfU1NFMyhmbGFncykgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9FWFRFUk5BTCwgU1NFMykKKyNkZWZpbmUgRVhURVJOQUxfU1NTRTMoZmxhZ3MpICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9FWFRFUk5BTCwgU1NTRTMpCisjZGVmaW5lIEVYVEVSTkFMX1NTRTQoZmxhZ3MpICAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfRVhURVJOQUwsIFNTRTQpCisjZGVmaW5lIEVYVEVSTkFMX1NTRTQyKGZsYWdzKSAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfRVhURVJOQUwsIFNTRTQyKQorI2RlZmluZSBFWFRFUk5BTF9BVlgoZmxhZ3MpICAgICAgICAgQ1BVRVhUX1NVRkZJWChmbGFncywgX0VYVEVSTkFMLCBBVlgpCisjZGVmaW5lIEVYVEVSTkFMX1hPUChmbGFncykgICAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfRVhURVJOQUwsIFhPUCkKKyNkZWZpbmUgRVhURVJOQUxfRk1BMyhmbGFncykgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9FWFRFUk5BTCwgRk1BMykKKyNkZWZpbmUgRVhURVJOQUxfRk1BNChmbGFncykgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9FWFRFUk5BTCwgRk1BNCkKKyNkZWZpbmUgRVhURVJOQUxfQVZYMihmbGFncykgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9FWFRFUk5BTCwgQVZYMikKKworI2RlZmluZSBJTkxJTkVfQU1EM0ROT1coZmxhZ3MpICAgICAgQ1BVRVhUX1NVRkZJWChmbGFncywgX0lOTElORSwgQU1EM0ROT1cpCisjZGVmaW5lIElOTElORV9BTUQzRE5PV0VYVChmbGFncykgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfSU5MSU5FLCBBTUQzRE5PV0VYVCkKKyNkZWZpbmUgSU5MSU5FX01NWChmbGFncykgICAgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9JTkxJTkUsIE1NWCkKKyNkZWZpbmUgSU5MSU5FX01NWEVYVChmbGFncykgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9JTkxJTkUsIE1NWEVYVCkKKyNkZWZpbmUgSU5MSU5FX1NTRShmbGFncykgICAgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9JTkxJTkUsIFNTRSkKKyNkZWZpbmUgSU5MSU5FX1NTRTIoZmxhZ3MpICAgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9JTkxJTkUsIFNTRTIpCisjZGVmaW5lIElOTElORV9TU0UzKGZsYWdzKSAgICAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfSU5MSU5FLCBTU0UzKQorI2RlZmluZSBJTkxJTkVfU1NTRTMoZmxhZ3MpICAgICAgICAgQ1BVRVhUX1NVRkZJWChmbGFncywgX0lOTElORSwgU1NTRTMpCisjZGVmaW5lIElOTElORV9TU0U0KGZsYWdzKSAgICAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfSU5MSU5FLCBTU0U0KQorI2RlZmluZSBJTkxJTkVfU1NFNDIoZmxhZ3MpICAgICAgICAgQ1BVRVhUX1NVRkZJWChmbGFncywgX0lOTElORSwgU1NFNDIpCisjZGVmaW5lIElOTElORV9BVlgoZmxhZ3MpICAgICAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfSU5MSU5FLCBBVlgpCisjZGVmaW5lIElOTElORV9YT1AoZmxhZ3MpICAgICAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfSU5MSU5FLCBYT1ApCisjZGVmaW5lIElOTElORV9GTUEzKGZsYWdzKSAgICAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfSU5MSU5FLCBGTUEzKQorI2RlZmluZSBJTkxJTkVfRk1BNChmbGFncykgICAgICAgICAgQ1BVRVhUX1NVRkZJWChmbGFncywgX0lOTElORSwgRk1BNCkKKyNkZWZpbmUgSU5MSU5FX0FWWDIoZmxhZ3MpICAgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9JTkxJTkUsIEFWWDIpCisKK3ZvaWQgZmZfY3B1X2NwdWlkKGludCBpbmRleCwgaW50ICplYXgsIGludCAqZWJ4LCBpbnQgKmVjeCwgaW50ICplZHgpOwordm9pZCBmZl9jcHVfeGdldGJ2KGludCBvcCwgaW50ICplYXgsIGludCAqZWR4KTsKK2ludCAgZmZfY3B1X2NwdWlkX3Rlc3Qodm9pZCk7CisKKyNlbmRpZiAvKiBBVlVUSUxfWDg2X0NQVV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9jcHVpZC5hc20gYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9jcHVpZC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmNzg2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L2NwdWlkLmFzbQpAQCAtMCwwICsxLDkxIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIENvcHlyaWdodCAoQykgMjAwNS0yMDEwIHgyNjQgcHJvamVjdAorOyoKKzsqIEF1dGhvcnM6IExvcmVuIE1lcnJpdHQgPGxvcmVubUB1Lndhc2hpbmd0b24uZWR1PgorOyogICAgICAgICAgRmlvbmEgR2xhc2VyIDxmaW9uYUB4MjY0LmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJ4ODZ1dGlsLmFzbSIKKworU0VDVElPTiAudGV4dAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9jcHVfY3B1aWQoaW50IGluZGV4LCBpbnQgKmVheCwgaW50ICplYngsIGludCAqZWN4LCBpbnQgKmVkeCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2dsb2JhbCBjcHVfY3B1aWQsIDUsNworICAgIHB1c2ggcmJ4CisgICAgcHVzaCAgcjQKKyAgICBwdXNoICByMworICAgIHB1c2ggIHIyCisgICAgcHVzaCAgcjEKKyAgICBtb3YgIGVheCwgcjBkCisgICAgeG9yICBlY3gsIGVjeAorICAgIGNwdWlkCisgICAgcG9wICAgcjQKKyAgICBtb3YgW3I0XSwgZWF4CisgICAgcG9wICAgcjQKKyAgICBtb3YgW3I0XSwgZWJ4CisgICAgcG9wICAgcjQKKyAgICBtb3YgW3I0XSwgZWN4CisgICAgcG9wICAgcjQKKyAgICBtb3YgW3I0XSwgZWR4CisgICAgcG9wICByYngKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfY3B1X3hnZXRidihpbnQgb3AsIGludCAqZWF4LCBpbnQgKmVkeCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2dsb2JhbCBjcHVfeGdldGJ2LCAzLDcKKyAgICBwdXNoICByMgorICAgIHB1c2ggIHIxCisgICAgbW92ICBlY3gsIHIwZAorICAgIHhnZXRidgorICAgIHBvcCAgIHI0CisgICAgbW92IFtyNF0sIGVheAorICAgIHBvcCAgIHI0CisgICAgbW92IFtyNF0sIGVkeAorICAgIFJFVAorCislaWYgQVJDSF9YODZfNjQgPT0gMAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBmZl9jcHVfY3B1aWRfdGVzdCh2b2lkKQorOyByZXR1cm4gMCBpZiB1bnN1cHBvcnRlZAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjZ2xvYmFsIGNwdV9jcHVpZF90ZXN0CisgICAgcHVzaGZkCisgICAgcHVzaCAgICBlYngKKyAgICBwdXNoICAgIGVicAorICAgIHB1c2ggICAgZXNpCisgICAgcHVzaCAgICBlZGkKKyAgICBwdXNoZmQKKyAgICBwb3AgICAgIGVheAorICAgIG1vdiAgICAgZWJ4LCBlYXgKKyAgICB4b3IgICAgIGVheCwgMHgyMDAwMDAKKyAgICBwdXNoICAgIGVheAorICAgIHBvcGZkCisgICAgcHVzaGZkCisgICAgcG9wICAgICBlYXgKKyAgICB4b3IgICAgIGVheCwgZWJ4CisgICAgcG9wICAgICBlZGkKKyAgICBwb3AgICAgIGVzaQorICAgIHBvcCAgICAgZWJwCisgICAgcG9wICAgICBlYngKKyAgICBwb3BmZAorICAgIHJldAorJWVuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9lbW1zLmFzbSBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L2VtbXMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYWQzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9lbW1zLmFzbQpAQCAtMCwwICsxLDMwIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIENvcHlyaWdodCAoQykgMjAxMyBNYXJ0aW4gU3RvcnNqbworOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgIng4NnV0aWwuYXNtIgorCitTRUNUSU9OIC50ZXh0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGF2cHJpdl9lbW1zX3lhc20odm9pZCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY3Zpc2libGUgZW1tc195YXNtLCAwLCAwCisgICAgZW1tcworICAgIFJFVApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC94ODYvZW1tcy5oIGIvZmZtcGVnL2xpYmF2dXRpbC94ODYvZW1tcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MjliNmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9lbW1zLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9YODZfRU1NU19ICisjZGVmaW5lIEFWVVRJTF9YODZfRU1NU19ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKwordm9pZCBhdnByaXZfZW1tc195YXNtKHZvaWQpOworCisjaWYgSEFWRV9NTVhfSU5MSU5FCisjICAgZGVmaW5lIGVtbXNfYyBlbW1zX2MKKy8qKgorICogRW1wdHkgbW14IHN0YXRlLgorICogdGhpcyBtdXN0IGJlIGNhbGxlZCBiZXR3ZWVuIGFueSBkc3AgZnVuY3Rpb24gYW5kIGZsb2F0L2RvdWJsZSBjb2RlLgorICogZm9yIGV4YW1wbGUgc2luKCk7IGRzcC0+aWRjdF9wdXQoKTsgZW1tc19jKCk7IGNvcygpCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZW1tc19jKHZvaWQpCit7CisgICAgaWYoYXZfZ2V0X2NwdV9mbGFncygpICYgQVZfQ1BVX0ZMQUdfTU1YKQorICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgiZW1tcyIgOjo6ICJtZW1vcnkiKTsKK30KKyNlbGlmIEhBVkVfTU1YICYmIEhBVkVfTU1fRU1QVFkKKyMgICBpbmNsdWRlIDxtbWludHJpbi5oPgorIyAgIGRlZmluZSBlbW1zX2MgX21tX2VtcHR5CisjZWxpZiBIQVZFX01NWF9FWFRFUk5BTAorIyAgIGRlZmluZSBlbW1zX2MgYXZwcml2X2VtbXNfeWFzbQorI2VuZGlmIC8qIEhBVkVfTU1YX0lOTElORSAqLworCisjZW5kaWYgLyogQVZVVElMX1g4Nl9FTU1TX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwveDg2L2Zsb2F0X2RzcC5hc20gYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9mbG9hdF9kc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjM2QyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9mbG9hdF9kc3AuYXNtCkBAIC0wLDAgKzEsMzgxIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIHg4Ni1vcHRpbWl6ZWQgRmxvYXQgRFNQIGZ1bmN0aW9ucworOyoKKzsqIENvcHlyaWdodCAyMDA2IExvcmVuIE1lcnJpdHQKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJ4ODZ1dGlsLmFzbSIKKworU0VDVElPTiAudGV4dAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCB2ZWN0b3JfZm11bChmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEsIGludCBsZW4pCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBWRUNUT1JfRk1VTCAwCitjZ2xvYmFsIHZlY3Rvcl9mbXVsLCA0LDQsMiwgZHN0LCBzcmMwLCBzcmMxLCBsZW4KKyAgICBsZWEgICAgICAgbGVucSwgW2xlbmQqNCAtIDY0XQorQUxJR04gMTYKKy5sb29wOgorJWFzc2lnbiBhIDAKKyVyZXAgMzIvbW1zaXplCisgICAgbW92YSAgICAgIG0wLCAgIFtzcmMwcSArIGxlbnEgKyAoYSswKSptbXNpemVdCisgICAgbW92YSAgICAgIG0xLCAgIFtzcmMwcSArIGxlbnEgKyAoYSsxKSptbXNpemVdCisgICAgbXVscHMgICAgIG0wLCBtMCwgW3NyYzFxICsgbGVucSArIChhKzApKm1tc2l6ZV0KKyAgICBtdWxwcyAgICAgbTEsIG0xLCBbc3JjMXEgKyBsZW5xICsgKGErMSkqbW1zaXplXQorICAgIG1vdmEgICAgICBbZHN0cSArIGxlbnEgKyAoYSswKSptbXNpemVdLCBtMAorICAgIG1vdmEgICAgICBbZHN0cSArIGxlbnEgKyAoYSsxKSptbXNpemVdLCBtMQorJWFzc2lnbiBhIGErMgorJWVuZHJlcAorCisgICAgc3ViICAgICAgIGxlbnEsIDY0CisgICAgamdlICAgICAgIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZQorVkVDVE9SX0ZNVUwKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4CitWRUNUT1JfRk1VTAorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl92ZWN0b3JfZm1hY19zY2FsYXIoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgZmxvYXQgbXVsLCBpbnQgbGVuKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislbWFjcm8gVkVDVE9SX0ZNQUNfU0NBTEFSIDAKKyVpZiBVTklYNjQKK2NnbG9iYWwgdmVjdG9yX2ZtYWNfc2NhbGFyLCAzLDMsNSwgZHN0LCBzcmMsIGxlbgorJWVsc2UKK2NnbG9iYWwgdmVjdG9yX2ZtYWNfc2NhbGFyLCA0LDQsNSwgZHN0LCBzcmMsIG11bCwgbGVuCislZW5kaWYKKyVpZiBBUkNIX1g4Nl8zMgorICAgIFZCUk9BRENBU1RTUyBtMCwgbXVsbQorJWVsc2UKKyVpZiBXSU42NAorICAgIFNXQVAgMCwgMgorJWVuZGlmCisgICAgc2h1ZnBzICAgICAgeG0wLCB4bTAsIDAKKyVpZiBjcHVmbGFnKGF2eCkKKyAgICB2aW5zZXJ0ZjEyOCAgbTAsIG0wLCB4bTAsIDEKKyVlbmRpZgorJWVuZGlmCisgICAgbGVhICAgIGxlbnEsIFtsZW5kKjQtNjRdCisubG9vcDoKKyVpZiBjcHVmbGFnKGZtYTMpCisgICAgbW92YSAgICAgbTEsICAgICBbZHN0cStsZW5xXQorICAgIG1vdmEgICAgIG0yLCAgICAgW2RzdHErbGVucSsxKm1tc2l6ZV0KKyAgICBmbWFkZHBzICBtMSwgbTAsIFtzcmNxK2xlbnFdLCBtMQorICAgIGZtYWRkcHMgIG0yLCBtMCwgW3NyY3ErbGVucSsxKm1tc2l6ZV0sIG0yCislZWxzZSA7IGNwdWZsYWcKKyAgICBtdWxwcyAgICBtMSwgbTAsIFtzcmNxK2xlbnFdCisgICAgbXVscHMgICAgbTIsIG0wLCBbc3JjcStsZW5xKzEqbW1zaXplXQorJWlmIG1tc2l6ZSA8IDMyCisgICAgbXVscHMgICAgbTMsIG0wLCBbc3JjcStsZW5xKzIqbW1zaXplXQorICAgIG11bHBzICAgIG00LCBtMCwgW3NyY3ErbGVucSszKm1tc2l6ZV0KKyVlbmRpZiA7IG1tc2l6ZQorICAgIGFkZHBzICAgIG0xLCBtMSwgW2RzdHErbGVucV0KKyAgICBhZGRwcyAgICBtMiwgbTIsIFtkc3RxK2xlbnErMSptbXNpemVdCislaWYgbW1zaXplIDwgMzIKKyAgICBhZGRwcyAgICBtMywgbTMsIFtkc3RxK2xlbnErMiptbXNpemVdCisgICAgYWRkcHMgICAgbTQsIG00LCBbZHN0cStsZW5xKzMqbW1zaXplXQorJWVuZGlmIDsgbW1zaXplCislZW5kaWYgOyBjcHVmbGFnCisgICAgbW92YSAgW2RzdHErbGVucV0sIG0xCisgICAgbW92YSAgW2RzdHErbGVucSsxKm1tc2l6ZV0sIG0yCislaWYgbW1zaXplIDwgMzIKKyAgICBtb3ZhICBbZHN0cStsZW5xKzIqbW1zaXplXSwgbTMKKyAgICBtb3ZhICBbZHN0cStsZW5xKzMqbW1zaXplXSwgbTQKKyVlbmRpZiA7IG1tc2l6ZQorICAgIHN1YiAgICBsZW5xLCA2NAorICAgIGpnZSAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UKK1ZFQ1RPUl9GTUFDX1NDQUxBUgorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1lNTSBhdngKK1ZFQ1RPUl9GTUFDX1NDQUxBUgorJWVuZGlmCislaWYgSEFWRV9GTUEzX0VYVEVSTkFMCitJTklUX1lNTSBmbWEzCitWRUNUT1JfRk1BQ19TQ0FMQVIKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfdmVjdG9yX2ZtdWxfc2NhbGFyKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGZsb2F0IG11bCwgaW50IGxlbikKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIFZFQ1RPUl9GTVVMX1NDQUxBUiAwCislaWYgVU5JWDY0CitjZ2xvYmFsIHZlY3Rvcl9mbXVsX3NjYWxhciwgMywzLDIsIGRzdCwgc3JjLCBsZW4KKyVlbHNlCitjZ2xvYmFsIHZlY3Rvcl9mbXVsX3NjYWxhciwgNCw0LDMsIGRzdCwgc3JjLCBtdWwsIGxlbgorJWVuZGlmCislaWYgQVJDSF9YODZfMzIKKyAgICBtb3ZzcyAgICBtMCwgbXVsbQorJWVsaWYgV0lONjQKKyAgICBTV0FQIDAsIDIKKyVlbmRpZgorICAgIHNodWZwcyAgIG0wLCBtMCwgMAorICAgIGxlYSAgICBsZW5xLCBbbGVuZCo0LW1tc2l6ZV0KKy5sb29wOgorICAgIG1vdmEgICAgIG0xLCBbc3JjcStsZW5xXQorICAgIG11bHBzICAgIG0xLCBtMAorICAgIG1vdmEgIFtkc3RxK2xlbnFdLCBtMQorICAgIHN1YiAgICBsZW5xLCBtbXNpemUKKyAgICBqZ2UgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlCitWRUNUT1JfRk1VTF9TQ0FMQVIKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ZlY3Rvcl9kbXVsX3NjYWxhcihkb3VibGUgKmRzdCwgY29uc3QgZG91YmxlICpzcmMsIGRvdWJsZSBtdWwsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBWRUNUT1JfRE1VTF9TQ0FMQVIgMAorJWlmIEFSQ0hfWDg2XzMyCitjZ2xvYmFsIHZlY3Rvcl9kbXVsX3NjYWxhciwgMyw0LDMsIGRzdCwgc3JjLCBtdWwsIGxlbiwgbGVuYWRkcgorICAgIG1vdiAgICAgICAgICBsZW5xLCBsZW5hZGRybQorJWVsaWYgVU5JWDY0CitjZ2xvYmFsIHZlY3Rvcl9kbXVsX3NjYWxhciwgMywzLDMsIGRzdCwgc3JjLCBsZW4KKyVlbHNlCitjZ2xvYmFsIHZlY3Rvcl9kbXVsX3NjYWxhciwgNCw0LDMsIGRzdCwgc3JjLCBtdWwsIGxlbgorJWVuZGlmCislaWYgQVJDSF9YODZfMzIKKyAgICBWQlJPQURDQVNUU0QgICBtMCwgbXVsbQorJWVsc2UKKyVpZiBXSU42NAorICAgIFNXQVAgMCwgMgorJWVuZGlmCisgICAgbW92bGhwcyAgICAgICB4bTAsIHhtMAorJWlmIGNwdWZsYWcoYXZ4KQorICAgIHZpbnNlcnRmMTI4ICAgeW0wLCB5bTAsIHhtMCwgMQorJWVuZGlmCislZW5kaWYKKyAgICBsZWEgICAgICAgICAgbGVucSwgW2xlbmQqOC0yKm1tc2l6ZV0KKy5sb29wOgorICAgIG11bHBkICAgICAgICAgIG0xLCBtMCwgW3NyY3ErbGVucSAgICAgICBdCisgICAgbXVscGQgICAgICAgICAgbTIsIG0wLCBbc3JjcStsZW5xK21tc2l6ZV0KKyAgICBtb3ZhICAgW2RzdHErbGVucSAgICAgICBdLCBtMQorICAgIG1vdmEgICBbZHN0cStsZW5xK21tc2l6ZV0sIG0yCisgICAgc3ViICAgICAgICAgIGxlbnEsIDIqbW1zaXplCisgICAgamdlIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK1ZFQ1RPUl9ETVVMX1NDQUxBUgorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1lNTSBhdngKK1ZFQ1RPUl9ETVVMX1NDQUxBUgorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2ZWN0b3JfZm11bF93aW5kb3coZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsCis7ICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMSwgY29uc3QgZmxvYXQgKndpbiwgaW50IGxlbik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBWRUNUT1JfRk1VTF9XSU5ET1cgMAorY2dsb2JhbCB2ZWN0b3JfZm11bF93aW5kb3csIDUsIDYsIDYsIGRzdCwgc3JjMCwgc3JjMSwgd2luLCBsZW4sIGxlbjEKKyAgICBzaGwgICAgIGxlbmQsIDIKKyAgICBsZWEgICAgbGVuMXEsIFtsZW5xIC0gbW1zaXplXQorICAgIGFkZCAgICBzcmMwcSwgbGVucQorICAgIGFkZCAgICAgZHN0cSwgbGVucQorICAgIGFkZCAgICAgd2lucSwgbGVucQorICAgIG5lZyAgICAgbGVucQorLmxvb3AKKyAgICBtb3ZhICAgICAgbTAsIFt3aW5xICArIGxlbnFdCisgICAgbW92YSAgICAgIG00LCBbc3JjMHEgKyBsZW5xXQorJWlmIGNwdWZsYWcoc3NlKQorICAgIG1vdmEgICAgICBtMSwgW3dpbnEgICsgbGVuMXFdCisgICAgbW92YSAgICAgIG01LCBbc3JjMXEgKyBsZW4xcV0KKyAgICBzaHVmcHMgICAgbTEsIG0xLCAweDFiCisgICAgc2h1ZnBzICAgIG01LCBtNSwgMHgxYgorICAgIG1vdmEgICAgICBtMiwgbTAKKyAgICBtb3ZhICAgICAgbTMsIG0xCisgICAgbXVscHMgICAgIG0yLCBtNAorICAgIG11bHBzICAgICBtMywgbTUKKyAgICBtdWxwcyAgICAgbTEsIG00CisgICAgbXVscHMgICAgIG0wLCBtNQorICAgIGFkZHBzICAgICBtMiwgbTMKKyAgICBzdWJwcyAgICAgbTEsIG0wCisgICAgc2h1ZnBzICAgIG0yLCBtMiwgMHgxYgorJWVsc2UKKyAgICBwc3dhcGQgICAgbTEsIFt3aW5xICArIGxlbjFxXQorICAgIHBzd2FwZCAgICBtNSwgW3NyYzFxICsgbGVuMXFdCisgICAgbW92YSAgICAgIG0yLCBtMAorICAgIG1vdmEgICAgICBtMywgbTEKKyAgICBwZm11bCAgICAgbTIsIG00CisgICAgcGZtdWwgICAgIG0zLCBtNQorICAgIHBmbXVsICAgICBtMSwgbTQKKyAgICBwZm11bCAgICAgbTAsIG01CisgICAgcGZhZGQgICAgIG0yLCBtMworICAgIHBmc3ViICAgICBtMSwgbTAKKyAgICBwc3dhcGQgICAgbTIsIG0yCislZW5kaWYKKyAgICBtb3ZhICAgICAgW2RzdHEgKyBsZW5xXSwgbTEKKyAgICBtb3ZhICAgICAgW2RzdHEgKyBsZW4xcV0sIG0yCisgICAgc3ViICAgICAgIGxlbjFxLCBtbXNpemUKKyAgICBhZGQgICAgICAgbGVucSwgIG1tc2l6ZQorICAgIGpsIC5sb29wCislaWYgbW1zaXplID09IDgKKyAgICBmZW1tcworJWVuZGlmCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfTU1YIDNkbm93ZXh0CitWRUNUT1JfRk1VTF9XSU5ET1cKK0lOSVRfWE1NIHNzZQorVkVDVE9SX0ZNVUxfV0lORE9XCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2ZWN0b3JfZm11bF9hZGQoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxLAorOyAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzIsIGludCBsZW4pCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBWRUNUT1JfRk1VTF9BREQgMAorY2dsb2JhbCB2ZWN0b3JfZm11bF9hZGQsIDUsNSw0LCBkc3QsIHNyYzAsIHNyYzEsIHNyYzIsIGxlbgorICAgIGxlYSAgICAgICBsZW5xLCBbbGVuZCo0IC0gMiptbXNpemVdCitBTElHTiAxNgorLmxvb3A6CisgICAgbW92YSAgICBtMCwgICBbc3JjMHEgKyBsZW5xXQorICAgIG1vdmEgICAgbTEsICAgW3NyYzBxICsgbGVucSArIG1tc2l6ZV0KKyVpZiBjcHVmbGFnKGZtYTMpCisgICAgbW92YSAgICBtMiwgICAgIFtzcmMycSArIGxlbnFdCisgICAgbW92YSAgICBtMywgICAgIFtzcmMycSArIGxlbnEgKyBtbXNpemVdCisgICAgZm1hZGRwcyBtMCwgbTAsIFtzcmMxcSArIGxlbnFdLCBtMgorICAgIGZtYWRkcHMgbTEsIG0xLCBbc3JjMXEgKyBsZW5xICsgbW1zaXplXSwgbTMKKyVlbHNlCisgICAgbXVscHMgICBtMCwgbTAsIFtzcmMxcSArIGxlbnFdCisgICAgbXVscHMgICBtMSwgbTEsIFtzcmMxcSArIGxlbnEgKyBtbXNpemVdCisgICAgYWRkcHMgICBtMCwgbTAsIFtzcmMycSArIGxlbnFdCisgICAgYWRkcHMgICBtMSwgbTEsIFtzcmMycSArIGxlbnEgKyBtbXNpemVdCislZW5kaWYKKyAgICBtb3ZhICAgIFtkc3RxICsgbGVucV0sIG0wCisgICAgbW92YSAgICBbZHN0cSArIGxlbnEgKyBtbXNpemVdLCBtMQorCisgICAgc3ViICAgICBsZW5xLCAgIDIqbW1zaXplCisgICAgamdlICAgICAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UKK1ZFQ1RPUl9GTVVMX0FERAorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1lNTSBhdngKK1ZFQ1RPUl9GTVVMX0FERAorJWVuZGlmCislaWYgSEFWRV9GTUEzX0VYVEVSTkFMCitJTklUX1lNTSBmbWEzCitWRUNUT1JfRk1VTF9BREQKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCB2ZWN0b3JfZm11bF9yZXZlcnNlKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBWRUNUT1JfRk1VTF9SRVZFUlNFIDAKK2NnbG9iYWwgdmVjdG9yX2ZtdWxfcmV2ZXJzZSwgNCw0LDIsIGRzdCwgc3JjMCwgc3JjMSwgbGVuCisgICAgbGVhICAgICAgIGxlbnEsIFtsZW5kKjQgLSAyKm1tc2l6ZV0KK0FMSUdOIDE2CisubG9vcDoKKyVpZiBjcHVmbGFnKGF2eCkKKyAgICB2bW92YXBzICAgICB4bW0wLCBbc3JjMXEgKyAxNl0KKyAgICB2aW5zZXJ0ZjEyOCBtMCwgbTAsIFtzcmMxcV0sIDEKKyAgICB2c2h1ZnBzICAgICBtMCwgbTAsIG0wLCBxMDEyMworICAgIHZtb3ZhcHMgICAgIHhtbTEsIFtzcmMxcSArIG1tc2l6ZSArIDE2XQorICAgIHZpbnNlcnRmMTI4IG0xLCBtMSwgW3NyYzFxICsgbW1zaXplXSwgMQorICAgIHZzaHVmcHMgICAgIG0xLCBtMSwgbTEsIHEwMTIzCislZWxzZQorICAgIG1vdmEgICAgbTAsIFtzcmMxcV0KKyAgICBtb3ZhICAgIG0xLCBbc3JjMXEgKyBtbXNpemVdCisgICAgc2h1ZnBzICBtMCwgbTAsIHEwMTIzCisgICAgc2h1ZnBzICBtMSwgbTEsIHEwMTIzCislZW5kaWYKKyAgICBtdWxwcyAgIG0wLCBtMCwgW3NyYzBxICsgbGVucSArIG1tc2l6ZV0KKyAgICBtdWxwcyAgIG0xLCBtMSwgW3NyYzBxICsgbGVucV0KKyAgICBtb3ZhICAgIFtkc3RxICsgbGVucSArIG1tc2l6ZV0sIG0wCisgICAgbW92YSAgICBbZHN0cSArIGxlbnFdLCBtMQorICAgIGFkZCAgICAgc3JjMXEsIDIqbW1zaXplCisgICAgc3ViICAgICBsZW5xLCAgMiptbXNpemUKKyAgICBqZ2UgICAgIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZQorVkVDVE9SX0ZNVUxfUkVWRVJTRQorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1lNTSBhdngKK1ZFQ1RPUl9GTVVMX1JFVkVSU0UKKyVlbmRpZgorCis7IGZsb2F0IHNjYWxhcnByb2R1Y3RfZmxvYXRfc3NlKGNvbnN0IGZsb2F0ICp2MSwgY29uc3QgZmxvYXQgKnYyLCBpbnQgbGVuKQorSU5JVF9YTU0gc3NlCitjZ2xvYmFsIHNjYWxhcnByb2R1Y3RfZmxvYXQsIDMsMywyLCB2MSwgdjIsIG9mZnNldAorICAgIG5lZyAgIG9mZnNldHEKKyAgICBzaGwgICBvZmZzZXRxLCAyCisgICAgc3ViICAgICAgIHYxcSwgb2Zmc2V0cQorICAgIHN1YiAgICAgICB2MnEsIG9mZnNldHEKKyAgICB4b3JwcyAgICB4bW0wLCB4bW0wCisubG9vcDoKKyAgICBtb3ZhcHMgICB4bW0xLCBbdjFxK29mZnNldHFdCisgICAgbXVscHMgICAgeG1tMSwgW3YycStvZmZzZXRxXQorICAgIGFkZHBzICAgIHhtbTAsIHhtbTEKKyAgICBhZGQgICBvZmZzZXRxLCAxNgorICAgIGpzIC5sb29wCisgICAgbW92aGxwcyAgeG1tMSwgeG1tMAorICAgIGFkZHBzICAgIHhtbTAsIHhtbTEKKyAgICBtb3ZzcyAgICB4bW0xLCB4bW0wCisgICAgc2h1ZnBzICAgeG1tMCwgeG1tMCwgMQorICAgIGFkZHNzICAgIHhtbTAsIHhtbTEKKyVpZiBBUkNIX1g4Nl82NCA9PSAwCisgICAgbW92c3MgICAgIHIwbSwgIHhtbTAKKyAgICBmbGQgZHdvcmQgcjBtCislZW5kaWYKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfYnV0dGVyZmxpZXNfZmxvYXQoZmxvYXQgKnNyYzAsIGZsb2F0ICpzcmMxLCBpbnQgbGVuKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSU5JVF9YTU0gc3NlCitjZ2xvYmFsIGJ1dHRlcmZsaWVzX2Zsb2F0LCAzLDMsMywgc3JjMCwgc3JjMSwgbGVuCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgbGVucSwgbGVuZAorJWVuZGlmCisgICAgdGVzdCAgICAgIGxlbnEsIGxlbnEKKyAgICBqeiAuZW5kCisgICAgc2hsICAgICAgIGxlbnEsIDIKKyAgICBhZGQgICAgICBzcmMwcSwgbGVucQorICAgIGFkZCAgICAgIHNyYzFxLCBsZW5xCisgICAgbmVnICAgICAgIGxlbnEKKy5sb29wOgorICAgIG1vdmEgICAgICAgIG0wLCBbc3JjMHEgKyBsZW5xXQorICAgIG1vdmEgICAgICAgIG0xLCBbc3JjMXEgKyBsZW5xXQorICAgIHN1YnBzICAgICAgIG0yLCBtMCwgbTEKKyAgICBhZGRwcyAgICAgICBtMCwgbTAsIG0xCisgICAgbW92YSAgICAgICAgW3NyYzFxICsgbGVucV0sIG0yCisgICAgbW92YSAgICAgICAgW3NyYzBxICsgbGVucV0sIG0wCisgICAgYWRkICAgICAgIGxlbnEsIG1tc2l6ZQorICAgIGpsIC5sb29wCisuZW5kOgorICAgIFJFUF9SRVQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwveDg2L2Zsb2F0X2RzcF9pbml0LmMgYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9mbG9hdF9kc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YjNhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9mbG9hdF9kc3BfaW5pdC5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImFzbS5oIgorCit2b2lkIGZmX3ZlY3Rvcl9mbXVsX3NzZShmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKK3ZvaWQgZmZfdmVjdG9yX2ZtdWxfYXZ4KGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCit2b2lkIGZmX3ZlY3Rvcl9mbWFjX3NjYWxhcl9zc2UoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgZmxvYXQgbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOwordm9pZCBmZl92ZWN0b3JfZm1hY19zY2FsYXJfYXZ4KGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGZsb2F0IG11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKK3ZvaWQgZmZfdmVjdG9yX2ZtYWNfc2NhbGFyX2ZtYTMoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgZmxvYXQgbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKwordm9pZCBmZl92ZWN0b3JfZm11bF9zY2FsYXJfc3NlKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGZsb2F0IG11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKwordm9pZCBmZl92ZWN0b3JfZG11bF9zY2FsYXJfc3NlMihkb3VibGUgKmRzdCwgY29uc3QgZG91YmxlICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtdWwsIGludCBsZW4pOwordm9pZCBmZl92ZWN0b3JfZG11bF9zY2FsYXJfYXZ4KGRvdWJsZSAqZHN0LCBjb25zdCBkb3VibGUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbXVsLCBpbnQgbGVuKTsKKwordm9pZCBmZl92ZWN0b3JfZm11bF93aW5kb3dfM2Rub3dleHQoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMSwgY29uc3QgZmxvYXQgKndpbiwgaW50IGxlbik7Cit2b2lkIGZmX3ZlY3Rvcl9mbXVsX3dpbmRvd19zc2UoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzEsIGNvbnN0IGZsb2F0ICp3aW4sIGludCBsZW4pOworCit2b2lkIGZmX3ZlY3Rvcl9mbXVsX2FkZF9zc2UoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMyLCBpbnQgbGVuKTsKK3ZvaWQgZmZfdmVjdG9yX2ZtdWxfYWRkX2F2eChmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzIsIGludCBsZW4pOwordm9pZCBmZl92ZWN0b3JfZm11bF9hZGRfZm1hMyhmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMyLCBpbnQgbGVuKTsKKwordm9pZCBmZl92ZWN0b3JfZm11bF9yZXZlcnNlX3NzZShmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzEsIGludCBsZW4pOwordm9pZCBmZl92ZWN0b3JfZm11bF9yZXZlcnNlX2F2eChmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzEsIGludCBsZW4pOworCitmbG9hdCBmZl9zY2FsYXJwcm9kdWN0X2Zsb2F0X3NzZShjb25zdCBmbG9hdCAqdjEsIGNvbnN0IGZsb2F0ICp2MiwgaW50IG9yZGVyKTsKKwordm9pZCBmZl9idXR0ZXJmbGllc19mbG9hdF9zc2UoZmxvYXQgKnNyYzAsIGZsb2F0ICpzcmMxLCBpbnQgbGVuKTsKKworYXZfY29sZCB2b2lkIGZmX2Zsb2F0X2RzcF9pbml0X3g4NihBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX0FNRDNETk9XRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93ID0gZmZfdmVjdG9yX2ZtdWxfd2luZG93XzNkbm93ZXh0OworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfU1NFKGNwdV9mbGFncykpIHsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWwgPSBmZl92ZWN0b3JfZm11bF9zc2U7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbWFjX3NjYWxhciA9IGZmX3ZlY3Rvcl9mbWFjX3NjYWxhcl9zc2U7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3NjYWxhciA9IGZmX3ZlY3Rvcl9mbXVsX3NjYWxhcl9zc2U7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyA9IGZmX3ZlY3Rvcl9mbXVsX3dpbmRvd19zc2U7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX2FkZCAgICA9IGZmX3ZlY3Rvcl9mbXVsX2FkZF9zc2U7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2UgPSBmZl92ZWN0b3JfZm11bF9yZXZlcnNlX3NzZTsKKyAgICAgICAgZmRzcC0+c2NhbGFycHJvZHVjdF9mbG9hdCA9IGZmX3NjYWxhcnByb2R1Y3RfZmxvYXRfc3NlOworICAgICAgICBmZHNwLT5idXR0ZXJmbGllc19mbG9hdCAgID0gZmZfYnV0dGVyZmxpZXNfZmxvYXRfc3NlOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9kbXVsX3NjYWxhciA9IGZmX3ZlY3Rvcl9kbXVsX3NjYWxhcl9zc2UyOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWwgPSBmZl92ZWN0b3JfZm11bF9hdng7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbWFjX3NjYWxhciA9IGZmX3ZlY3Rvcl9mbWFjX3NjYWxhcl9hdng7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9kbXVsX3NjYWxhciA9IGZmX3ZlY3Rvcl9kbXVsX3NjYWxhcl9hdng7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX2FkZCAgICA9IGZmX3ZlY3Rvcl9mbXVsX2FkZF9hdng7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2UgPSBmZl92ZWN0b3JfZm11bF9yZXZlcnNlX2F2eDsKKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX0ZNQTMoY3B1X2ZsYWdzKSkgeworICAgICAgICBmZHNwLT52ZWN0b3JfZm1hY19zY2FsYXIgPSBmZl92ZWN0b3JfZm1hY19zY2FsYXJfZm1hMzsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfYWRkICAgID0gZmZfdmVjdG9yX2ZtdWxfYWRkX2ZtYTM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC94ODYvaW50cmVhZHdyaXRlLmggYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9pbnRyZWFkd3JpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDYxZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC94ODYvaW50cmVhZHdyaXRlLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBbGV4YW5kZXIgU3RyYW5nZSA8YXN0cmFuZ2VAaXRoaW5rc3cuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9YODZfSU5UUkVBRFdSSVRFX0gKKyNkZWZpbmUgQVZVVElMX1g4Nl9JTlRSRUFEV1JJVEVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKworI2lmIEhBVkVfTU1YCisKKyNpZiAhSEFWRV9GQVNUXzY0QklUICYmIGRlZmluZWQoX19NTVhfXykKKworI2RlZmluZSBBVl9DT1BZNjQgQVZfQ09QWTY0CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEFWX0NPUFk2NCh2b2lkICpkLCBjb25zdCB2b2lkICpzKQoreworICAgIF9fYXNtX18oIm1vdnEgICAlMSwgJSVtbTAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICUlbW0wLCAlMCAgXG5cdCIKKyAgICAgICAgICAgIDogIj1tIigqKHVpbnQ2NF90KilkKQorICAgICAgICAgICAgOiAibSIgKCooY29uc3QgdWludDY0X3QqKXMpCisgICAgICAgICAgICA6ICJtbTAiKTsKK30KKworI2RlZmluZSBBVl9TV0FQNjQgQVZfU1dBUDY0CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEFWX1NXQVA2NCh2b2lkICphLCB2b2lkICpiKQoreworICAgIF9fYXNtX18oIm1vdnEgICAlMSwgJSVtbTAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICUwLCAlJW1tMSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgJSVtbTAsICUwICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAlJW1tMSwgJTEgIFxuXHQiCisgICAgICAgICAgICA6ICIrbSIoKih1aW50NjRfdCopYSksICIrbSIoKih1aW50NjRfdCopYikKKyAgICAgICAgICAgIDo6Im1tMCIsICJtbTEiKTsKK30KKworI2RlZmluZSBBVl9aRVJPNjQgQVZfWkVSTzY0CitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEFWX1pFUk82NCh2b2lkICpkKQoreworICAgIF9fYXNtX18oInB4b3IgJSVtbTAsICUlbW0wICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTAsICUwICAgICBcblx0IgorICAgICAgICAgICAgOiAiPW0iKCoodWludDY0X3QqKWQpCisgICAgICAgICAgICA6OiAibW0wIik7Cit9CisKKyNlbmRpZiAvKiAhSEFWRV9GQVNUXzY0QklUICYmIGRlZmluZWQoX19NTVhfXykgKi8KKworI2lmZGVmIF9fU1NFX18KKworI2RlZmluZSBBVl9DT1BZMTI4IEFWX0NPUFkxMjgKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgQVZfQ09QWTEyOCh2b2lkICpkLCBjb25zdCB2b2lkICpzKQoreworICAgIHN0cnVjdCB2IHt1aW50NjRfdCB2WzJdO307CisKKyAgICBfX2FzbV9fKCJtb3ZhcHMgICAlMSwgJSV4bW0wICBcblx0IgorICAgICAgICAgICAgIm1vdmFwcyAgICUleG1tMCwgJTAgIFxuXHQiCisgICAgICAgICAgICA6ICI9bSIoKihzdHJ1Y3QgdiopZCkKKyAgICAgICAgICAgIDogIm0iICgqKGNvbnN0IHN0cnVjdCB2KilzKQorICAgICAgICAgICAgOiAieG1tMCIpOworfQorCisjZW5kaWYgLyogX19TU0VfXyAqLworCisjaWZkZWYgX19TU0UyX18KKworI2RlZmluZSBBVl9aRVJPMTI4IEFWX1pFUk8xMjgKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgQVZfWkVSTzEyOCh2b2lkICpkKQoreworICAgIHN0cnVjdCB2IHt1aW50NjRfdCB2WzJdO307CisKKyAgICBfX2FzbV9fKCJweG9yICUleG1tMCwgJSV4bW0wICBcblx0IgorICAgICAgICAgICAgIm1vdmRxYSAgICUleG1tMCwgJTAgIFxuXHQiCisgICAgICAgICAgICA6ICI9bSIoKihzdHJ1Y3QgdiopZCkKKyAgICAgICAgICAgIDo6ICJ4bW0wIik7Cit9CisKKyNlbmRpZiAvKiBfX1NTRTJfXyAqLworCisjZW5kaWYgLyogSEFWRV9NTVggKi8KKworI2VuZGlmIC8qIEFWVVRJTF9YODZfSU5UUkVBRFdSSVRFX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwveDg2L2xscy5hc20gYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9sbHMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OWJlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9sbHMuYXNtCkBAIC0wLDAgKzEsMjM1IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBsaW5lYXIgbGVhc3Qgc3F1YXJlcyBtb2RlbAorOyoKKzsqIENvcHlyaWdodCAoYykgMjAxMyBMb3JlbiBNZXJyaXR0Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAieDg2dXRpbC5hc20iCisKK1NFQ1RJT04gLnRleHQKKworJWRlZmluZSBNQVhfVkFSUyAzMgorJWRlZmluZSBNQVhfVkFSU19BTElHTiAoTUFYX1ZBUlMrNCkKKyVkZWZpbmUgQ09WQVJfU1RSSURFIE1BWF9WQVJTX0FMSUdOKjgKKyVkZWZpbmUgQ09WQVIoeCx5KSBbY292YXJxICsgKHgpKjggKyAoeSkqQ09WQVJfU1RSSURFXQorCitzdHJ1YyBMTFNNb2RlbAorICAgIC5jb3ZhcmlhbmNlOiAgcmVzcSBNQVhfVkFSU19BTElHTipNQVhfVkFSU19BTElHTgorICAgIC5jb2VmZjogICAgICAgcmVzcSBNQVhfVkFSUypNQVhfVkFSUworICAgIC52YXJpYW5jZTogICAgcmVzcSBNQVhfVkFSUworICAgIC5pbmRlcF9jb3VudDogcmVzZCAxCitlbmRzdHJ1YworCislbWFjcm8gQUREUERfTUVNIDIKKyVpZiBjcHVmbGFnKGF2eCkKKyAgICB2YWRkcGQgJTIsICUyLCAlMQorJWVsc2UKKyAgICBhZGRwZCAgJTIsICUxCislZW5kaWYKKyAgICBtb3ZhICAgJTEsICUyCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorJWRlZmluZSBtb3ZkcWEgbW92YXBzCitjZ2xvYmFsIHVwZGF0ZV9sbHMsIDIsNSw4LCBjdHgsIHZhciwgaSwgaiwgY292YXIyCisgICAgJWRlZmluZSBjb3ZhcnEgY3R4cQorICAgIG1vdiAgICAgaWQsIFtjdHhxICsgTExTTW9kZWwuaW5kZXBfY291bnRdCisgICAgbGVhICAgdmFycSwgW3ZhcnEgKyBpcSo4XQorICAgIG5lZyAgICAgaXEKKyAgICBtb3YgY292YXIycSwgY292YXJxCisubG9vcGk6CisgICAgOyBDb21wdXRlIGFsbCAzIHBhaXJ3aXNlIHByb2R1Y3RzIG9mIGEgMngyIGJsb2NrIHRoYXQgbGllcyBvbiB0aGUgZGlhZ29uYWwKKyAgICBtb3ZhICAgIG0xLCBbdmFycSArIGlxKjhdCisgICAgbW92YSAgICBtMywgW3ZhcnEgKyBpcSo4ICsgMTZdCisgICAgcHNodWZkICBtNCwgbTEsIHExMDEwCisgICAgcHNodWZkICBtNSwgbTEsIHEzMjMyCisgICAgcHNodWZkICBtNiwgbTMsIHExMDEwCisgICAgcHNodWZkICBtNywgbTMsIHEzMjMyCisgICAgbXVscGQgICBtMCwgbTEsIG00CisgICAgbXVscGQgICBtMSwgbTEsIG01CisgICAgbGVhIGNvdmFycSwgW2NvdmFyMnEgKyAxNl0KKyAgICBBRERQRF9NRU0gQ09WQVIoLTIsMCksIG0wCisgICAgQUREUERfTUVNIENPVkFSKC0yLDEpLCBtMQorICAgIGxlYSAgICAganEsIFtpcSArIDJdCisgICAgY21wICAgICBqZCwgLTIKKyAgICBqZyAuc2tpcDR4NAorLmxvb3A0eDQ6CisgICAgOyBDb21wdXRlIGFsbCAxNiBwYWlyd2lzZSBwcm9kdWN0cyBvZiBhIDR4NCBibG9jaworICAgIG11bHBkICAgbTAsIG00LCBtMworICAgIG11bHBkICAgbTEsIG01LCBtMworICAgIG11bHBkICAgbTIsIG02LCBtMworICAgIG11bHBkICAgbTMsIG0zLCBtNworICAgIEFERFBEX01FTSBDT1ZBUigwLDApLCBtMAorICAgIEFERFBEX01FTSBDT1ZBUigwLDEpLCBtMQorICAgIEFERFBEX01FTSBDT1ZBUigwLDIpLCBtMgorICAgIEFERFBEX01FTSBDT1ZBUigwLDMpLCBtMworICAgIG1vdmEgICAgbTMsIFt2YXJxICsganEqOCArIDE2XQorICAgIG11bHBkICAgbTAsIG00LCBtMworICAgIG11bHBkICAgbTEsIG01LCBtMworICAgIG11bHBkICAgbTIsIG02LCBtMworICAgIG11bHBkICAgbTMsIG0zLCBtNworICAgIEFERFBEX01FTSBDT1ZBUigyLDApLCBtMAorICAgIEFERFBEX01FTSBDT1ZBUigyLDEpLCBtMQorICAgIEFERFBEX01FTSBDT1ZBUigyLDIpLCBtMgorICAgIEFERFBEX01FTSBDT1ZBUigyLDMpLCBtMworICAgIG1vdmEgICAgbTMsIFt2YXJxICsganEqOCArIDMyXQorICAgIGFkZCBjb3ZhcnEsIDMyCisgICAgYWRkICAgICBqcSwgNAorICAgIGNtcCAgICAgamQsIC0yCisgICAgamxlIC5sb29wNHg0Cisuc2tpcDR4NDoKKyAgICB0ZXN0ICAgIGpkLCBqZAorICAgIGpnIC5za2lwMng0CisgICAgbXVscGQgICBtNCwgbTMKKyAgICBtdWxwZCAgIG01LCBtMworICAgIG11bHBkICAgbTYsIG0zCisgICAgbXVscGQgICBtNywgbTMKKyAgICBBRERQRF9NRU0gQ09WQVIoMCwwKSwgbTQKKyAgICBBRERQRF9NRU0gQ09WQVIoMCwxKSwgbTUKKyAgICBBRERQRF9NRU0gQ09WQVIoMCwyKSwgbTYKKyAgICBBRERQRF9NRU0gQ09WQVIoMCwzKSwgbTcKKy5za2lwMng0OgorICAgIGFkZCAgICAgaXEsIDQKKyAgICBhZGQgY292YXIycSwgNCpDT1ZBUl9TVFJJREUrMzIKKyAgICBjbXAgICAgIGlkLCAtMgorICAgIGpsZSAubG9vcGkKKyAgICB0ZXN0ICAgIGlkLCBpZAorICAgIGpnIC5yZXQKKyAgICBtb3YgICAgIGpxLCBpcQorICAgICVkZWZpbmUgY292YXJxIGNvdmFyMnEKKy5sb29wMngxOgorICAgIG1vdnNkICAgbTAsIFt2YXJxICsgaXEqOF0KKyAgICBtb3ZsaHBzIG0wLCBtMAorICAgIG11bHBkICAgbTAsIFt2YXJxICsganEqOF0KKyAgICBBRERQRF9NRU0gQ09WQVIoMCwwKSwgbTAKKyAgICBpbmMgICAgIGlxCisgICAgYWRkIGNvdmFycSwgQ09WQVJfU1RSSURFCisgICAgdGVzdCAgICBpZCwgaWQKKyAgICBqbGUgLmxvb3AyeDEKKy5yZXQ6CisgICAgUkVQX1JFVAorCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWU1NIGF2eAorY2dsb2JhbCB1cGRhdGVfbGxzLCAzLDYsOCwgY3R4LCB2YXIsIGNvdW50LCBpLCBqLCBjb3VudDIKKyAgICAlZGVmaW5lIGNvdmFycSBjdHhxCisgICAgbW92ICBjb3VudGQsIFtjdHhxICsgTExTTW9kZWwuaW5kZXBfY291bnRdCisgICAgbGVhIGNvdW50MmQsIFtjb3VudHEtMl0KKyAgICB4b3IgICAgIGlkLCBpZAorLmxvb3BpOgorICAgIDsgQ29tcHV0ZSBhbGwgMTAgcGFpcndpc2UgcHJvZHVjdHMgb2YgYSA0eDQgYmxvY2sgdGhhdCBsaWVzIG9uIHRoZSBkaWFnb25hbAorICAgIG1vdmEgICAgeW1tMSwgW3ZhcnEgKyBpcSo4XQorICAgIHZicm9hZGNhc3RzZCB5bW00LCBbdmFycSArIGlxKjhdCisgICAgdmJyb2FkY2FzdHNkIHltbTUsIFt2YXJxICsgaXEqOCArIDhdCisgICAgdmJyb2FkY2FzdHNkIHltbTYsIFt2YXJxICsgaXEqOCArIDE2XQorICAgIHZicm9hZGNhc3RzZCB5bW03LCBbdmFycSArIGlxKjggKyAyNF0KKyAgICB2ZXh0cmFjdGYxMjggeG1tMywgeW1tMSwgMQorICAgIHZtdWxwZCAgeW1tMCwgeW1tMSwgeW1tNAorICAgIHZtdWxwZCAgeW1tMSwgeW1tMSwgeW1tNQorICAgIHZtdWxwZCAgeG1tMiwgeG1tMywgeG1tNgorICAgIHZtdWxwZCAgeG1tMywgeG1tMywgeG1tNworICAgIEFERFBEX01FTSBDT1ZBUihpcSAgLDApLCB5bW0wCisgICAgQUREUERfTUVNIENPVkFSKGlxICAsMSksIHltbTEKKyAgICBBRERQRF9NRU0gQ09WQVIoaXErMiwyKSwgeG1tMgorICAgIEFERFBEX01FTSBDT1ZBUihpcSsyLDMpLCB4bW0zCisgICAgbGVhICAgICBqZCwgW2lxICsgNF0KKyAgICBjbXAgICAgIGpkLCBjb3VudDJkCisgICAgamcgLnNraXA0eDQKKy5sb29wNHg0OgorICAgIDsgQ29tcHV0ZSBhbGwgMTYgcGFpcndpc2UgcHJvZHVjdHMgb2YgYSA0eDQgYmxvY2sKKyAgICBtb3ZhICAgIHltbTMsIFt2YXJxICsganEqOF0KKyAgICB2bXVscGQgIHltbTAsIHltbTMsIHltbTQKKyAgICB2bXVscGQgIHltbTEsIHltbTMsIHltbTUKKyAgICB2bXVscGQgIHltbTIsIHltbTMsIHltbTYKKyAgICB2bXVscGQgIHltbTMsIHltbTMsIHltbTcKKyAgICBBRERQRF9NRU0gQ09WQVIoanEsMCksIHltbTAKKyAgICBBRERQRF9NRU0gQ09WQVIoanEsMSksIHltbTEKKyAgICBBRERQRF9NRU0gQ09WQVIoanEsMiksIHltbTIKKyAgICBBRERQRF9NRU0gQ09WQVIoanEsMyksIHltbTMKKyAgICBhZGQgICAgIGpkLCA0CisgICAgY21wICAgICBqZCwgY291bnQyZAorICAgIGpsZSAubG9vcDR4NAorLnNraXA0eDQ6CisgICAgY21wICAgICBqZCwgY291bnRkCisgICAgamcgLnNraXAyeDQKKyAgICBtb3ZhICAgIHhtbTMsIFt2YXJxICsganEqOF0KKyAgICB2bXVscGQgIHhtbTAsIHhtbTMsIHhtbTQKKyAgICB2bXVscGQgIHhtbTEsIHhtbTMsIHhtbTUKKyAgICB2bXVscGQgIHhtbTIsIHhtbTMsIHhtbTYKKyAgICB2bXVscGQgIHhtbTMsIHhtbTMsIHhtbTcKKyAgICBBRERQRF9NRU0gQ09WQVIoanEsMCksIHhtbTAKKyAgICBBRERQRF9NRU0gQ09WQVIoanEsMSksIHhtbTEKKyAgICBBRERQRF9NRU0gQ09WQVIoanEsMiksIHhtbTIKKyAgICBBRERQRF9NRU0gQ09WQVIoanEsMyksIHhtbTMKKy5za2lwMng0OgorICAgIGFkZCAgICAgaWQsIDQKKyAgICBhZGQgY292YXJxLCA0KkNPVkFSX1NUUklERQorICAgIGNtcCAgICAgaWQsIGNvdW50MmQKKyAgICBqbGUgLmxvb3BpCisgICAgY21wICAgICBpZCwgY291bnRkCisgICAgamcgLnJldAorICAgIG1vdiAgICAgamQsIGlkCisubG9vcDJ4MToKKyAgICB2bW92ZGR1cCB4bW0wLCBbdmFycSArIGlxKjhdCisgICAgdm11bHBkICAgeG1tMCwgW3ZhcnEgKyBqcSo4XQorICAgIEFERFBEX01FTSBDT1ZBUihqcSwwKSwgeG1tMAorICAgIGluYyAgICAgaWQKKyAgICBhZGQgY292YXJxLCBDT1ZBUl9TVFJJREUKKyAgICBjbXAgICAgIGlkLCBjb3VudGQKKyAgICBqbGUgLmxvb3AyeDEKKy5yZXQ6CisgICAgUkVQX1JFVAorJWVuZGlmCisKK0lOSVRfWE1NIHNzZTIKK2NnbG9iYWwgZXZhbHVhdGVfbGxzLCAzLDQsMiwgY3R4LCB2YXIsIG9yZGVyLCBpCisgICAgOyBUaGlzIGZ1bmN0aW9uIGlzIG9mdGVuIGNhbGxlZCBvbiB0aGUgc2FtZSBidWZmZXIgYXMgdXBkYXRlX2xscywgYnV0IHdpdGgKKyAgICA7IGFuIG9mZnNldC4gVGhleSBjYW4ndCBib3RoIGJlIGFsaWduZWQuCisgICAgOyBMb2FkIGhhbHZlcyByYXRoZXIgdGhhbiBtb3Z1IHRvIGF2b2lkIHN0b3JlLWZvcndhcmRpbmcgc3RhbGxzLCBzaW5jZSB0aGUKKyAgICA7IGlucHV0IHdhcyBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBwcmlvciB0byB0aGlzIGZ1bmN0aW9uIHVzaW5nIHNjYWxhciBtYXRoLgorICAgICVkZWZpbmUgY29lZnNxIGN0eHEKKyAgICBtb3YgICAgIGlkLCBvcmRlcmQKKyAgICBpbXVsICAgIG9yZGVyZCwgTUFYX1ZBUlMKKyAgICBsZWEgICAgIGNvZWZzcSwgW2N0eHEgKyBMTFNNb2RlbC5jb2VmZiArIG9yZGVycSo4XQorICAgIG1vdnNkICAgbTAsIFt2YXJxXQorICAgIG1vdmhwZCAgbTAsIFt2YXJxICsgOF0KKyAgICBtdWxwZCAgIG0wLCBbY29lZnNxXQorICAgIGxlYSBjb2Vmc3EsIFtjb2Vmc3EgKyBpcSo4XQorICAgIGxlYSAgIHZhcnEsIFt2YXJxICsgaXEqOF0KKyAgICBuZWcgICAgIGlxCisgICAgYWRkICAgICBpcSwgMgorLmxvb3A6CisgICAgbW92c2QgICBtMSwgW3ZhcnEgKyBpcSo4XQorICAgIG1vdmhwZCAgbTEsIFt2YXJxICsgaXEqOCArIDhdCisgICAgbXVscGQgICBtMSwgW2NvZWZzcSArIGlxKjhdCisgICAgYWRkcGQgICBtMCwgbTEKKyAgICBhZGQgICAgIGlxLCAyCisgICAgamwgLmxvb3AKKyAgICBqZyAuc2tpcDEKKyAgICBtb3ZzZCAgIG0xLCBbdmFycSArIGlxKjhdCisgICAgbXVsc2QgICBtMSwgW2NvZWZzcSArIGlxKjhdCisgICAgYWRkcGQgICBtMCwgbTEKKy5za2lwMToKKyAgICBtb3ZobHBzIG0xLCBtMAorICAgIGFkZHNkICAgbTAsIG0xCislaWYgQVJDSF9YODZfMzIKKyAgICBtb3ZzZCAgcjBtLCBtMAorICAgIGZsZCAgIHF3b3JkIHIwbQorJWVuZGlmCisgICAgUkVUCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9sbHNfaW5pdC5jIGIvZmZtcGVnL2xpYmF2dXRpbC94ODYvbGxzX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTMxOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC94ODYvbGxzX2luaXQuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogbGluZWFyIGxlYXN0IHNxdWFyZXMgbW9kZWwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTG9yZW4gTWVycml0dAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2xscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisKK3ZvaWQgZmZfdXBkYXRlX2xsc19zc2UyKExMU01vZGVsICptLCBjb25zdCBkb3VibGUgKnZhcik7Cit2b2lkIGZmX3VwZGF0ZV9sbHNfYXZ4KExMU01vZGVsICptLCBjb25zdCBkb3VibGUgKnZhcik7Citkb3VibGUgZmZfZXZhbHVhdGVfbGxzX3NzZTIoTExTTW9kZWwgKm0sIGNvbnN0IGRvdWJsZSAqdmFyLCBpbnQgb3JkZXIpOworCithdl9jb2xkIHZvaWQgZmZfaW5pdF9sbHNfeDg2KExMU01vZGVsICptKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICBtLT51cGRhdGVfbGxzID0gZmZfdXBkYXRlX2xsc19zc2UyOworICAgICAgICBpZiAobS0+aW5kZXBfY291bnQgPj0gNCkKKyAgICAgICAgICAgIG0tPmV2YWx1YXRlX2xscyA9IGZmX2V2YWx1YXRlX2xsc19zc2UyOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKKyAgICAgICAgbS0+dXBkYXRlX2xscyA9IGZmX3VwZGF0ZV9sbHNfYXZ4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwveDg2L3BpeGVsdXRpbHMuYXNtIGIvZmZtcGVnL2xpYmF2dXRpbC94ODYvcGl4ZWx1dGlscy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyMmYyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L3BpeGVsdXRpbHMuYXNtCkBAIC0wLDAgKzEsMTY1IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBQaXhlbCB1dGlsaXRpZXMgU0lNRAorOyoKKzsqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Cis7KiBDb3B5cmlnaHQgKEMpIDIwMTQgQ2zDqW1lbnQgQsWTc2NoIDx1IHBraCBtZT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJ4ODZ1dGlsLmFzbSIKKworU0VDVElPTl9URVhUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBmZl9waXhlbHV0aWxzX3NhZF84eDhfbW14KGNvbnN0IHVpbnQ4X3QgKnNyYzEsIHB0cmRpZmZfdCBzdHJpZGUxLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlMik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSU5JVF9NTVggbW14CitjZ2xvYmFsIHBpeGVsdXRpbHNfc2FkXzh4OCwgNCw0LDAsIHNyYzEsIHN0cmlkZTEsIHNyYzIsIHN0cmlkZTIKKyAgICBweG9yICAgICAgICBtNywgbTcKKyAgICBweG9yICAgICAgICBtNiwgbTYKKyVyZXAgNAorICAgIG1vdmEgICAgICAgIG0wLCBbc3JjMXFdCisgICAgbW92YSAgICAgICAgbTIsIFtzcmMxcSArIHN0cmlkZTFxXQorICAgIG1vdmEgICAgICAgIG0xLCBbc3JjMnFdCisgICAgbW92YSAgICAgICAgbTMsIFtzcmMycSArIHN0cmlkZTJxXQorICAgIHBzdWJ1c2IgICAgIG00LCBtMCwgbTEKKyAgICBwc3VidXNiICAgICBtNSwgbTIsIG0zCisgICAgcHN1YnVzYiAgICAgbTEsIG0wCisgICAgcHN1YnVzYiAgICAgbTMsIG0yCisgICAgcG9yICAgICAgICAgbTEsIG00CisgICAgcG9yICAgICAgICAgbTMsIG01CisgICAgcHVucGNrbGJ3ICAgbTAsIG0xLCBtNworICAgIHB1bnBja2xidyAgIG0yLCBtMywgbTcKKyAgICBwdW5wY2toYncgICBtMSwgbTcKKyAgICBwdW5wY2toYncgICBtMywgbTcKKyAgICBwYWRkdyAgICAgICBtMCwgbTEKKyAgICBwYWRkdyAgICAgICBtMiwgbTMKKyAgICBwYWRkdyAgICAgICBtMCwgbTIKKyAgICBwYWRkdyAgICAgICBtNiwgbTAKKyAgICBsZWEgICAgICAgICBzcmMxcSwgW3NyYzFxICsgMipzdHJpZGUxcV0KKyAgICBsZWEgICAgICAgICBzcmMycSwgW3NyYzJxICsgMipzdHJpZGUycV0KKyVlbmRyZXAKKyAgICBwc3JscSAgICAgICBtMCwgbTYsIDMyCisgICAgcGFkZHcgICAgICAgbTYsIG0wCisgICAgcHNybHEgICAgICAgbTAsIG02LCAxNgorICAgIHBhZGR3ICAgICAgIG02LCBtMAorICAgIG1vdmQgICAgICAgIGVheCwgbTYKKyAgICBtb3Z6eCAgICAgICBlYXgsIGF4CisgICAgUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBmZl9waXhlbHV0aWxzX3NhZF84eDhfbW14ZXh0KGNvbnN0IHVpbnQ4X3QgKnNyYzEsIHB0cmRpZmZfdCBzdHJpZGUxLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlMik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIHBpeGVsdXRpbHNfc2FkXzh4OCwgNCw0LDAsIHNyYzEsIHN0cmlkZTEsIHNyYzIsIHN0cmlkZTIKKyAgICBweG9yICAgICAgICBtMiwgbTIKKyVyZXAgNAorICAgIG1vdmEgICAgICAgIG0wLCBbc3JjMXFdCisgICAgbW92YSAgICAgICAgbTEsIFtzcmMxcSArIHN0cmlkZTFxXQorICAgIHBzYWRidyAgICAgIG0wLCBbc3JjMnFdCisgICAgcHNhZGJ3ICAgICAgbTEsIFtzcmMycSArIHN0cmlkZTJxXQorICAgIHBhZGR3ICAgICAgIG0yLCBtMAorICAgIHBhZGR3ICAgICAgIG0yLCBtMQorICAgIGxlYSAgICAgICAgIHNyYzFxLCBbc3JjMXEgKyAyKnN0cmlkZTFxXQorICAgIGxlYSAgICAgICAgIHNyYzJxLCBbc3JjMnEgKyAyKnN0cmlkZTJxXQorJWVuZHJlcAorICAgIG1vdmQgICAgICAgIGVheCwgbTIKKyAgICBSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgaW50IGZmX3BpeGVsdXRpbHNfc2FkXzE2eDE2X21teGV4dChjb25zdCB1aW50OF90ICpzcmMxLCBwdHJkaWZmX3Qgc3RyaWRlMSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlMik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIHBpeGVsdXRpbHNfc2FkXzE2eDE2LCA0LDQsMCwgc3JjMSwgc3RyaWRlMSwgc3JjMiwgc3RyaWRlMgorICAgIHB4b3IgICAgICAgIG0yLCBtMgorJXJlcCAxNgorICAgIG1vdmEgICAgICAgIG0wLCBbc3JjMXFdCisgICAgbW92YSAgICAgICAgbTEsIFtzcmMxcSArIDhdCisgICAgcHNhZGJ3ICAgICAgbTAsIFtzcmMycV0KKyAgICBwc2FkYncgICAgICBtMSwgW3NyYzJxICsgOF0KKyAgICBwYWRkdyAgICAgICBtMiwgbTAKKyAgICBwYWRkdyAgICAgICBtMiwgbTEKKyAgICBhZGQgICAgICAgICBzcmMxcSwgc3RyaWRlMXEKKyAgICBhZGQgICAgICAgICBzcmMycSwgc3RyaWRlMnEKKyVlbmRyZXAKKyAgICBtb3ZkICAgICAgICBlYXgsIG0yCisgICAgUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBmZl9waXhlbHV0aWxzX3NhZF8xNngxNl9zc2UoY29uc3QgdWludDhfdCAqc3JjMSwgcHRyZGlmZl90IHN0cmlkZTEsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgcHRyZGlmZl90IHN0cmlkZTIpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lOSVRfWE1NIHNzZTIKK2NnbG9iYWwgcGl4ZWx1dGlsc19zYWRfMTZ4MTYsIDQsNCw1LCBzcmMxLCBzdHJpZGUxLCBzcmMyLCBzdHJpZGUyCisgICAgbW92dSAgICAgICAgbTQsIFtzcmMxcV0KKyAgICBtb3Z1ICAgICAgICBtMiwgW3NyYzJxXQorICAgIG1vdnUgICAgICAgIG0xLCBbc3JjMXEgKyBzdHJpZGUxcV0KKyAgICBtb3Z1ICAgICAgICBtMywgW3NyYzJxICsgc3RyaWRlMnFdCisgICAgcHNhZGJ3ICAgICAgbTQsIG0yCisgICAgcHNhZGJ3ICAgICAgbTEsIG0zCisgICAgcGFkZHcgICAgICAgbTQsIG0xCislcmVwIDcKKyAgICBsZWEgICAgICAgICBzcmMxcSwgW3NyYzFxICsgMipzdHJpZGUxcV0KKyAgICBsZWEgICAgICAgICBzcmMycSwgW3NyYzJxICsgMipzdHJpZGUycV0KKyAgICBtb3Z1ICAgICAgICBtMCwgW3NyYzFxXQorICAgIG1vdnUgICAgICAgIG0yLCBbc3JjMnFdCisgICAgbW92dSAgICAgICAgbTEsIFtzcmMxcSArIHN0cmlkZTFxXQorICAgIG1vdnUgICAgICAgIG0zLCBbc3JjMnEgKyBzdHJpZGUycV0KKyAgICBwc2FkYncgICAgICBtMCwgbTIKKyAgICBwc2FkYncgICAgICBtMSwgbTMKKyAgICBwYWRkdyAgICAgICBtNCwgbTAKKyAgICBwYWRkdyAgICAgICBtNCwgbTEKKyVlbmRyZXAKKyAgICBtb3ZobHBzICAgICBtMCwgbTQKKyAgICBwYWRkdyAgICAgICBtNCwgbTAKKyAgICBtb3ZkICAgICAgICBlYXgsIG00CisgICAgUkVUCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IGludCBmZl9waXhlbHV0aWxzX3NhZF9bYXVdXzE2eDE2X3NzZShjb25zdCB1aW50OF90ICpzcmMxLCBwdHJkaWZmX3Qgc3RyaWRlMSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBzdHJpZGUyKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gU0FEX1hNTV8xNngxNiAxCitJTklUX1hNTSBzc2UyCitjZ2xvYmFsIHBpeGVsdXRpbHNfc2FkXyUxXzE2eDE2LCA0LDQsMywgc3JjMSwgc3RyaWRlMSwgc3JjMiwgc3RyaWRlMgorICAgIG1vdiUxICAgICAgIG0yLCBbc3JjMnFdCisgICAgcHNhZGJ3ICAgICAgbTIsIFtzcmMxcV0KKyAgICBtb3YlMSAgICAgICBtMSwgW3NyYzJxICsgc3RyaWRlMnFdCisgICAgcHNhZGJ3ICAgICAgbTEsIFtzcmMxcSArIHN0cmlkZTFxXQorICAgIHBhZGR3ICAgICAgIG0yLCBtMQorJXJlcCA3CisgICAgbGVhICAgICAgICAgc3JjMXEsIFtzcmMxcSArIDIqc3RyaWRlMXFdCisgICAgbGVhICAgICAgICAgc3JjMnEsIFtzcmMycSArIDIqc3RyaWRlMnFdCisgICAgbW92JTEgICAgICAgbTAsIFtzcmMycV0KKyAgICBwc2FkYncgICAgICBtMCwgW3NyYzFxXQorICAgIG1vdiUxICAgICAgIG0xLCBbc3JjMnEgKyBzdHJpZGUycV0KKyAgICBwc2FkYncgICAgICBtMSwgW3NyYzFxICsgc3RyaWRlMXFdCisgICAgcGFkZHcgICAgICAgbTIsIG0wCisgICAgcGFkZHcgICAgICAgbTIsIG0xCislZW5kcmVwCisgICAgbW92aGxwcyAgICAgbTAsIG0yCisgICAgcGFkZHcgICAgICAgbTIsIG0wCisgICAgbW92ZCAgICAgICAgZWF4LCBtMgorICAgIFJFVAorJWVuZG1hY3JvCisKK1NBRF9YTU1fMTZ4MTYgYQorU0FEX1hNTV8xNngxNiB1CmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9waXhlbHV0aWxzLmggYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni9waXhlbHV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2Y2Y0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L3BpeGVsdXRpbHMuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX1g4Nl9QSVhFTFVUSUxTX0gKKyNkZWZpbmUgQVZVVElMX1g4Nl9QSVhFTFVUSUxTX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9waXhlbHV0aWxzLmgiCisKK3ZvaWQgZmZfcGl4ZWx1dGlsc19zYWRfaW5pdF94ODYoYXZfcGl4ZWx1dGlsc19zYWRfZm4gKnNhZCwgaW50IGFsaWduZWQpOworCisjZW5kaWYgLyogQVZVVElMX1g4Nl9QSVhFTFVUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwveDg2L3BpeGVsdXRpbHNfaW5pdC5jIGIvZmZtcGVnL2xpYmF2dXRpbC94ODYvcGl4ZWx1dGlsc19pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwMDUxMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L3BpeGVsdXRpbHNfaW5pdC5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAicGl4ZWx1dGlscy5oIgorI2luY2x1ZGUgImNwdS5oIgorCitpbnQgZmZfcGl4ZWx1dGlsc19zYWRfOHg4X21teChjb25zdCB1aW50OF90ICpzcmMxLCBwdHJkaWZmX3Qgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBzdHJpZGUyKTsKK2ludCBmZl9waXhlbHV0aWxzX3NhZF84eDhfbW14ZXh0KGNvbnN0IHVpbnQ4X3QgKnNyYzEsIHB0cmRpZmZfdCBzdHJpZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgcHRyZGlmZl90IHN0cmlkZTIpOworCitpbnQgZmZfcGl4ZWx1dGlsc19zYWRfMTZ4MTZfbW14ZXh0KGNvbnN0IHVpbnQ4X3QgKnNyYzEsIHB0cmRpZmZfdCBzdHJpZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlMik7CitpbnQgZmZfcGl4ZWx1dGlsc19zYWRfMTZ4MTZfc3NlMihjb25zdCB1aW50OF90ICpzcmMxLCBwdHJkaWZmX3Qgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBzdHJpZGUyKTsKK2ludCBmZl9waXhlbHV0aWxzX3NhZF9hXzE2eDE2X3NzZTIoY29uc3QgdWludDhfdCAqc3JjMSwgcHRyZGlmZl90IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBzdHJpZGUyKTsKK2ludCBmZl9waXhlbHV0aWxzX3NhZF91XzE2eDE2X3NzZTIoY29uc3QgdWludDhfdCAqc3JjMSwgcHRyZGlmZl90IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBzdHJpZGUyKTsKKwordm9pZCBmZl9waXhlbHV0aWxzX3NhZF9pbml0X3g4Nihhdl9waXhlbHV0aWxzX3NhZF9mbiAqc2FkLCBpbnQgYWxpZ25lZCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIHNhZFsyXSA9IGZmX3BpeGVsdXRpbHNfc2FkXzh4OF9tbXg7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIHNhZFsyXSA9IGZmX3BpeGVsdXRpbHNfc2FkXzh4OF9tbXhleHQ7CisgICAgICAgIHNhZFszXSA9IGZmX3BpeGVsdXRpbHNfc2FkXzE2eDE2X21teGV4dDsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIHN3aXRjaCAoYWxpZ25lZCkgeworICAgICAgICBjYXNlIDA6IHNhZFszXSA9IGZmX3BpeGVsdXRpbHNfc2FkXzE2eDE2X3NzZTI7ICAgYnJlYWs7IC8vIHNyYzEgdW5hbGlnbmVkLCBzcmMyIHVuYWxpZ25lZAorICAgICAgICBjYXNlIDE6IHNhZFszXSA9IGZmX3BpeGVsdXRpbHNfc2FkX3VfMTZ4MTZfc3NlMjsgYnJlYWs7IC8vIHNyYzEgICBhbGlnbmVkLCBzcmMyIHVuYWxpZ25lZAorICAgICAgICBjYXNlIDI6IHNhZFszXSA9IGZmX3BpeGVsdXRpbHNfc2FkX2FfMTZ4MTZfc3NlMjsgYnJlYWs7IC8vIHNyYzEgICBhbGlnbmVkLCBzcmMyICAgYWxpZ25lZAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC94ODYvdGltZXIuaCBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyNGI1MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L3RpbWVyLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9YODZfVElNRVJfSAorI2RlZmluZSBBVlVUSUxfWDg2X1RJTUVSX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKKyNkZWZpbmUgRkZfVElNRVJfVU5JVFMgImRlY2ljeWNsZXMiCisjZGVmaW5lIEFWX1JFQURfVElNRSByZWFkX3RpbWUKKworc3RhdGljIGlubGluZSB1aW50NjRfdCByZWFkX3RpbWUodm9pZCkKK3sKKyAgICB1aW50MzJfdCBhLCBkOworICAgIF9fYXNtX18gdm9sYXRpbGUoInJkdHNjIiA6ICI9YSIgKGEpLCAiPWQiIChkKSk7CisgICAgcmV0dXJuICgodWludDY0X3QpZCA8PCAzMikgKyBhOworfQorCisjZWxpZiBIQVZFX1JEVFNDCisKKyNpbmNsdWRlIDxpbnRyaW4uaD4KKyNkZWZpbmUgQVZfUkVBRF9USU1FIF9fcmR0c2MKKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCisjZW5kaWYgLyogQVZVVElMX1g4Nl9USU1FUl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3g4Ni93NjR4bW10ZXN0LmggYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni93NjR4bW10ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmNDk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L3c2NHhtbXRlc3QuaApAQCAtMCwwICsxLDczIEBACisvKgorICogY2hlY2sgWE1NIHJlZ2lzdGVycyBmb3IgY2xvYmJlcnMgb24gV2luNjQKKyAqIENvcHlyaWdodCAoYykgMjAwOCBSYW1pcm8gUG9sbGEgPHJhbWlyby5wb2xsYUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisKKyNkZWZpbmUgc3RvcmV4bW1yZWdzKG1lbSkgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSggICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92dXBzICUleG1tNiAsIDB4MDAoJTApXG5cdCIgIFwKKyAgICAgICAgIm1vdnVwcyAlJXhtbTcgLCAweDEwKCUwKVxuXHQiICBcCisgICAgICAgICJtb3Z1cHMgJSV4bW04ICwgMHgyMCglMClcblx0IiAgXAorICAgICAgICAibW92dXBzICUleG1tOSAsIDB4MzAoJTApXG5cdCIgIFwKKyAgICAgICAgIm1vdnVwcyAlJXhtbTEwLCAweDQwKCUwKVxuXHQiICBcCisgICAgICAgICJtb3Z1cHMgJSV4bW0xMSwgMHg1MCglMClcblx0IiAgXAorICAgICAgICAibW92dXBzICUleG1tMTIsIDB4NjAoJTApXG5cdCIgIFwKKyAgICAgICAgIm1vdnVwcyAlJXhtbTEzLCAweDcwKCUwKVxuXHQiICBcCisgICAgICAgICJtb3Z1cHMgJSV4bW0xNCwgMHg4MCglMClcblx0IiAgXAorICAgICAgICAibW92dXBzICUleG1tMTUsIDB4OTAoJTApXG5cdCIgIFwKKyAgICAgICAgOjogInIiKG1lbSkgOiAibWVtb3J5IikKKworI2RlZmluZSB0ZXN0eG1tY2xvYmJlcnMoZnVuYywgY3R4LCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB4bW1bMl1bMTBdWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0b3JleG1tcmVncyh4bW1bMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXQgPSBfX3JlYWxfICMjIGZ1bmMoY3R4LCBfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RvcmV4bW1yZWdzKHhtbVsxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChtZW1jbXAoeG1tWzBdLCB4bW1bMV0sIHNpemVvZih4bW1bMF0pKSkgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIlhNTSBSRUdTIENMT0JCRVJFRCBJTiAlcyFcbiIsICNmdW5jKTsgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpICsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoeG1tWzBdW2ldWzBdICE9IHhtbVsxXVtpXVswXSB8fCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHhtbVswXVtpXVsxXSAhPSB4bW1bMV1baV1bMV0pIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICJ4bW0lLTJkID0gJTAxNiJQUkl4NjQiJTAxNiJQUkl4NjQiXG4iLCAgXAorICAgICAgICAgICAgICAgICAgICAgICA2ICsgaSwgYXZfYnN3YXA2NCh4bW1bMF1baV1bMF0pLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfYnN3YXA2NCh4bW1bMF1baV1bMV0pKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgIC0+ICUwMTYiUFJJeDY0IiUwMTYiUFJJeDY0IlxuIiwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfYnN3YXA2NCh4bW1bMV1baV1bMF0pLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIGF2X2Jzd2FwNjQoeG1tWzFdW2ldWzFdKSk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYWJvcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiByZXQKKworI2RlZmluZSB3cmFwKGZ1bmMpICAgICAgXAoraW50IF9fcmVhbF8gIyMgZnVuYzsgICAgXAoraW50IF9fd3JhcF8gIyMgZnVuYzsgICAgXAoraW50IF9fd3JhcF8gIyMgZnVuYwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC94ODYveDg2aW5jLmFzbSBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L3g4NmluYy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExMzA2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L3g4NmluYy5hc20KQEAgLTAsMCArMSwxNDY4IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIHg4NmluYy5hc206IHgyNjRhc20gYWJzdHJhY3Rpb24gbGF5ZXIKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgeDI2NCBwcm9qZWN0Cis7KgorOyogQXV0aG9yczogTG9yZW4gTWVycml0dCA8bG9yZW5tQHUud2FzaGluZ3Rvbi5lZHU+Cis7KiAgICAgICAgICBBbnRvbiBNaXRyb2Zhbm92IDxCdWdNYXN0ZXJAbmFyb2QucnU+Cis7KiAgICAgICAgICBGaW9uYSBHbGFzZXIgPGZpb25hQHgyNjQuY29tPgorOyogICAgICAgICAgSGVucmlrIEdyYW1uZXIgPGhlbnJpa0BncmFtbmVyLmNvbT4KKzsqCis7KiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKzsqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKzsqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCis7KgorOyogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCis7KiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCis7KiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorOyogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworOyogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCis7KiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorOyogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCis7IFRoaXMgaXMgYSBoZWFkZXIgZmlsZSBmb3IgdGhlIHgyNjRBU00gYXNzZW1ibHkgbGFuZ3VhZ2UsIHdoaWNoIHVzZXMKKzsgTkFTTS9ZQVNNIHN5bnRheCBjb21iaW5lZCB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIG1hY3JvcyB0byBwcm92aWRlIGVhc3kKKzsgYWJzdHJhY3Rpb24gYmV0d2VlbiBkaWZmZXJlbnQgY2FsbGluZyBjb252ZW50aW9ucyAoeDg2XzMyLCB3aW42NCwgbGludXg2NCkuCis7IEl0IGFsc28gaGFzIHZhcmlvdXMgb3RoZXIgdXNlZnVsIGZlYXR1cmVzIHRvIHNpbXBsaWZ5IHdyaXRpbmcgdGhlIGtpbmQgb2YKKzsgRFNQIGZ1bmN0aW9ucyB0aGF0IGFyZSBtb3N0IG9mdGVuIHVzZWQgaW4geDI2NC4KKworOyBVbmxpa2UgdGhlIHJlc3Qgb2YgeDI2NCwgdGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbiBJU0MgbGljZW5zZSwgYXMgaXQKKzsgaGFzIHNpZ25pZmljYW50IHVzZWZ1bG5lc3Mgb3V0c2lkZSBvZiB4MjY0IGFuZCB3ZSB3YW50IGl0IHRvIGJlIGF2YWlsYWJsZQorOyB0byB0aGUgbGFyZ2VzdCBhdWRpZW5jZSBwb3NzaWJsZS4gIE9mIGNvdXJzZSwgaWYgeW91IG1vZGlmeSBpdCBmb3IgeW91ciBvd24KKzsgcHVycG9zZXMgdG8gYWRkIGEgbmV3IGZlYXR1cmUsIHdlIHN0cm9uZ2x5IGVuY291cmFnZSBjb250cmlidXRpbmcgYSBwYXRjaAorOyBhcyB0aGlzIGZlYXR1cmUgbWlnaHQgYmUgdXNlZnVsIGZvciBvdGhlcnMgYXMgd2VsbC4gIFNlbmQgcGF0Y2hlcyBvciBpZGVhcworOyB0byB4MjY0LWRldmVsQHZpZGVvbGFuLm9yZyAuCisKKyVpZm5kZWYgcHJpdmF0ZV9wcmVmaXgKKyAgICAlZGVmaW5lIHByaXZhdGVfcHJlZml4IHgyNjQKKyVlbmRpZgorCislaWZuZGVmIHB1YmxpY19wcmVmaXgKKyAgICAlZGVmaW5lIHB1YmxpY19wcmVmaXggcHJpdmF0ZV9wcmVmaXgKKyVlbmRpZgorCislZGVmaW5lIFdJTjY0ICAwCislZGVmaW5lIFVOSVg2NCAwCislaWYgQVJDSF9YODZfNjQKKyAgICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKKyAgICAgICAgJWRlZmluZSBXSU42NCAgMQorICAgICVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHdpbjY0CisgICAgICAgICVkZWZpbmUgV0lONjQgIDEKKyAgICAlZWxpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx4NjQKKyAgICAgICAgJWRlZmluZSBXSU42NCAgMQorICAgICVlbHNlCisgICAgICAgICVkZWZpbmUgVU5JWDY0IDEKKyAgICAlZW5kaWYKKyVlbmRpZgorCislaWZkZWYgUFJFRklYCisgICAgJWRlZmluZSBtYW5nbGUoeCkgXyAlKyB4CislZWxzZQorICAgICVkZWZpbmUgbWFuZ2xlKHgpIHgKKyVlbmRpZgorCis7IGFvdXQgZG9lcyBub3Qgc3VwcG9ydCBhbGlnbj0KKzsgTk9URTogVGhpcyBzZWN0aW9uIGlzIG91dCBvZiBzeW5jIHdpdGggeDI2NCwgaW4gb3JkZXIgdG8KKzsga2VlcCBzdXBwb3J0aW5nIE9TLzIuCislbWFjcm8gU0VDVElPTl9ST0RBVEEgMC0xIDE2CisgICAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGFvdXQKKyAgICAgICAgc2VjdGlvbiAudGV4dAorICAgICVlbHNlCisgICAgICAgIFNFQ1RJT04gLnJvZGF0YSBhbGlnbj0lMQorICAgICVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBTRUNUSU9OX1RFWFQgMC0xIDE2CisgICAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGFvdXQKKyAgICAgICAgU0VDVElPTiAudGV4dAorICAgICVlbHNlCisgICAgICAgIFNFQ1RJT04gLnRleHQgYWxpZ249JTEKKyAgICAlZW5kaWYKKyVlbmRtYWNybworCislaWYgV0lONjQKKyAgICAlZGVmaW5lIFBJQworJWVsaWYgQVJDSF9YODZfNjQgPT0gMAorOyB4ODZfMzIgZG9lc24ndCByZXF1aXJlIFBJQy4KKzsgU29tZSBkaXN0cm9zIHByZWZlciBzaGFyZWQgb2JqZWN0cyB0byBiZSBQSUMsIGJ1dCBub3RoaW5nIGJyZWFrcyBpZgorOyB0aGUgY29kZSBjb250YWlucyBhIGZldyB0ZXh0cmVscywgc28gd2UnbGwgc2tpcCB0aGF0IGNvbXBsZXhpdHkuCisgICAgJXVuZGVmIFBJQworJWVuZGlmCislaWZkZWYgUElDCisgICAgZGVmYXVsdCByZWwKKyVlbmRpZgorCislbWFjcm8gQ1BVTk9QIDEKKyAgICAlaWYgSEFWRV9DUFVOT1AKKyAgICAgICAgQ1BVICUxCisgICAgJWVuZGlmCislZW5kbWFjcm8KKworOyBNYWNyb3MgdG8gZWxpbWluYXRlIG1vc3QgY29kZSBkdXBsaWNhdGlvbiBiZXR3ZWVuIHg4Nl8zMiBhbmQgeDg2XzY0OgorOyBDdXJyZW50bHkgdGhpcyB3b3JrcyBvbmx5IGZvciBsZWFmIGZ1bmN0aW9ucyB3aGljaCBsb2FkIGFsbCB0aGVpciBhcmd1bWVudHMKKzsgaW50byByZWdpc3RlcnMgYXQgdGhlIHN0YXJ0LCBhbmQgbWFrZSBubyBvdGhlciB1c2Ugb2YgdGhlIHN0YWNrLiBMdWNraWx5IHRoYXQKKzsgY292ZXJzIG1vc3Qgb2YgeDI2NCdzIGFzbS4KKworOyBQUk9MT0dVRToKKzsgJTEgPSBudW1iZXIgb2YgYXJndW1lbnRzLiBsb2FkcyB0aGVtIGZyb20gc3RhY2sgaWYgbmVlZGVkLgorOyAlMiA9IG51bWJlciBvZiByZWdpc3RlcnMgdXNlZC4gcHVzaGVzIGNhbGxlZS1zYXZlZCByZWdzIGlmIG5lZWRlZC4KKzsgJTMgPSBudW1iZXIgb2YgeG1tIHJlZ2lzdGVycyB1c2VkLiBwdXNoZXMgY2FsbGVlLXNhdmVkIHhtbSByZWdzIGlmIG5lZWRlZC4KKzsgJTQgPSAob3B0aW9uYWwpIHN0YWNrIHNpemUgdG8gYmUgYWxsb2NhdGVkLiBJZiBub3QgYWxpZ25lZCAoeDg2LTMyIElDQyAxMC54LAorOyAgICAgIE1TVkMgb3IgWU1NKSwgdGhlIHN0YWNrIHdpbGwgYmUgbWFudWFsbHkgYWxpZ25lZCAodG8gMTYgb3IgMzIgYnl0ZXMpLAorOyAgICAgIGFuZCBhbiBleHRyYSByZWdpc3RlciB3aWxsIGJlIGFsbG9jYXRlZCB0byBob2xkIHRoZSBvcmlnaW5hbCBzdGFjaworOyAgICAgIHBvaW50ZXIgKHRvIG5vdCBpbnZhbGlkYXRlIHIwbSBldGMuKS4gVG8gcHJldmVudCB0aGUgdXNlIG9mIGFuIGV4dHJhCis7ICAgICAgcmVnaXN0ZXIgYXMgc3RhY2sgcG9pbnRlciwgcmVxdWVzdCBhIG5lZ2F0aXZlIHN0YWNrIHNpemUuCis7ICU0Ky8lNSsgPSBsaXN0IG9mIG5hbWVzIHRvIGRlZmluZSB0byByZWdpc3RlcnMKKzsgUFJPTE9HVUUgY2FuIGFsc28gYmUgaW52b2tlZCBieSBhZGRpbmcgdGhlIHNhbWUgb3B0aW9ucyB0byBjZ2xvYmFsCisKKzsgZS5nLgorOyBjZ2xvYmFsIGZvbywgMiwzLDAsIGRzdCwgc3JjLCB0bXAKKzsgZGVjbGFyZXMgYSBmdW5jdGlvbiAoZm9vKSwgdGFraW5nIHR3byBhcmdzIChkc3QgYW5kIHNyYykgYW5kIG9uZSBsb2NhbCB2YXJpYWJsZSAodG1wKQorCis7IFRPRE8gU29tZSBmdW5jdGlvbnMgY2FuIHVzZSBzb21lIGFyZ3MgZGlyZWN0bHkgZnJvbSB0aGUgc3RhY2suIElmIHRoZXkncmUgdGhlCis7IGxhc3QgYXJncyB0aGVuIHlvdSBjYW4ganVzdCBub3QgZGVjbGFyZSB0aGVtLCBidXQgaWYgdGhleSdyZSBpbiB0aGUgbWlkZGxlCis7IHdlIG5lZWQgbW9yZSBmbGV4aWJsZSBtYWNyby4KKworOyBSRVQ6Cis7IFBvcHMgYW55dGhpbmcgdGhhdCB3YXMgcHVzaGVkIGJ5IFBST0xPR1VFLCBhbmQgcmV0dXJucy4KKworOyBSRVBfUkVUOgorOyBVc2UgdGhpcyBpbnN0ZWFkIG9mIFJFVCBpZiBpdCdzIGEgYnJhbmNoIHRhcmdldC4KKworOyByZWdpc3RlcnM6Cis7IHJOIGFuZCByTnEgYXJlIHRoZSBuYXRpdmUtc2l6ZSByZWdpc3RlciBob2xkaW5nIGZ1bmN0aW9uIGFyZ3VtZW50IE4KKzsgck5kLCByTncsIHJOYiBhcmUgZHdvcmQsIHdvcmQsIGFuZCBieXRlIHNpemUKKzsgck5oIGlzIHRoZSBoaWdoIDggYml0cyBvZiB0aGUgd29yZCBzaXplCis7IHJObSBpcyB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgYXJnIE4gKGEgcmVnaXN0ZXIgb3Igb24gdGhlIHN0YWNrKSwgZHdvcmQKKzsgck5tcCBpcyBuYXRpdmUgc2l6ZQorCislbWFjcm8gREVDTEFSRV9SRUcgMi0zCisgICAgJWRlZmluZSByJTFxICUyCisgICAgJWRlZmluZSByJTFkICUyZAorICAgICVkZWZpbmUgciUxdyAlMncKKyAgICAlZGVmaW5lIHIlMWIgJTJiCisgICAgJWRlZmluZSByJTFoICUyaAorICAgICVkZWZpbmUgJTJxICUyCisgICAgJWlmICUwID09IDIKKyAgICAgICAgJWRlZmluZSByJTFtICAlMmQKKyAgICAgICAgJWRlZmluZSByJTFtcCAlMgorICAgICVlbGlmIEFSQ0hfWDg2XzY0IDsgbWVtb3J5CisgICAgICAgICVkZWZpbmUgciUxbSBbcnN0ayArIHN0YWNrX29mZnNldCArICUzXQorICAgICAgICAlZGVmaW5lIHIlMW1wIHF3b3JkIHIgJSsgJTEgJSsgbQorICAgICVlbHNlCisgICAgICAgICVkZWZpbmUgciUxbSBbcnN0ayArIHN0YWNrX29mZnNldCArICUzXQorICAgICAgICAlZGVmaW5lIHIlMW1wIGR3b3JkIHIgJSsgJTEgJSsgbQorICAgICVlbmRpZgorICAgICVkZWZpbmUgciUxICAlMgorJWVuZG1hY3JvCisKKyVtYWNybyBERUNMQVJFX1JFR19TSVpFIDMKKyAgICAlZGVmaW5lIHIlMXEgciUxCisgICAgJWRlZmluZSBlJTFxIHIlMQorICAgICVkZWZpbmUgciUxZCBlJTEKKyAgICAlZGVmaW5lIGUlMWQgZSUxCisgICAgJWRlZmluZSByJTF3ICUxCisgICAgJWRlZmluZSBlJTF3ICUxCisgICAgJWRlZmluZSByJTFoICUzCisgICAgJWRlZmluZSBlJTFoICUzCisgICAgJWRlZmluZSByJTFiICUyCisgICAgJWRlZmluZSBlJTFiICUyCislaWYgQVJDSF9YODZfNjQgPT0gMAorICAgICVkZWZpbmUgciUxICBlJTEKKyVlbmRpZgorJWVuZG1hY3JvCisKK0RFQ0xBUkVfUkVHX1NJWkUgYXgsIGFsLCBhaAorREVDTEFSRV9SRUdfU0laRSBieCwgYmwsIGJoCitERUNMQVJFX1JFR19TSVpFIGN4LCBjbCwgY2gKK0RFQ0xBUkVfUkVHX1NJWkUgZHgsIGRsLCBkaAorREVDTEFSRV9SRUdfU0laRSBzaSwgc2lsLCBudWxsCitERUNMQVJFX1JFR19TSVpFIGRpLCBkaWwsIG51bGwKK0RFQ0xBUkVfUkVHX1NJWkUgYnAsIGJwbCwgbnVsbAorCis7IHQjIGRlZmluZXMgZm9yIHdoZW4gcGVyLWFyY2ggcmVnaXN0ZXIgYWxsb2NhdGlvbiBpcyBtb3JlIGNvbXBsZXggdGhhbiBqdXN0IGZ1bmN0aW9uIGFyZ3VtZW50cworCislbWFjcm8gREVDTEFSRV9SRUdfVE1QIDEtKgorICAgICVhc3NpZ24gJSVpIDAKKyAgICAlcmVwICUwCisgICAgICAgIENBVF9YREVGSU5FIHQsICUlaSwgciUxCisgICAgICAgICVhc3NpZ24gJSVpICUlaSsxCisgICAgICAgICVyb3RhdGUgMQorICAgICVlbmRyZXAKKyVlbmRtYWNybworCislbWFjcm8gREVDTEFSRV9SRUdfVE1QX1NJWkUgMC0qCisgICAgJXJlcCAlMAorICAgICAgICAlZGVmaW5lIHQlMXEgdCUxICUrIHEKKyAgICAgICAgJWRlZmluZSB0JTFkIHQlMSAlKyBkCisgICAgICAgICVkZWZpbmUgdCUxdyB0JTEgJSsgdworICAgICAgICAlZGVmaW5lIHQlMWggdCUxICUrIGgKKyAgICAgICAgJWRlZmluZSB0JTFiIHQlMSAlKyBiCisgICAgICAgICVyb3RhdGUgMQorICAgICVlbmRyZXAKKyVlbmRtYWNybworCitERUNMQVJFX1JFR19UTVBfU0laRSAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0CisKKyVpZiBBUkNIX1g4Nl82NAorICAgICVkZWZpbmUgZ3Byc2l6ZSA4CislZWxzZQorICAgICVkZWZpbmUgZ3Byc2l6ZSA0CislZW5kaWYKKworJW1hY3JvIFBVU0ggMQorICAgIHB1c2ggJTEKKyAgICAlaWZpZG4gcnN0aywgcnNwCisgICAgICAgICVhc3NpZ24gc3RhY2tfb2Zmc2V0IHN0YWNrX29mZnNldCtncHJzaXplCisgICAgJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFBPUCAxCisgICAgcG9wICUxCisgICAgJWlmaWRuIHJzdGssIHJzcAorICAgICAgICAlYXNzaWduIHN0YWNrX29mZnNldCBzdGFja19vZmZzZXQtZ3Byc2l6ZQorICAgICVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBQVVNIX0lGX1VTRUQgMS0qCisgICAgJXJlcCAlMAorICAgICAgICAlaWYgJTEgPCByZWdzX3VzZWQKKyAgICAgICAgICAgIFBVU0ggciUxCisgICAgICAgICVlbmRpZgorICAgICAgICAlcm90YXRlIDEKKyAgICAlZW5kcmVwCislZW5kbWFjcm8KKworJW1hY3JvIFBPUF9JRl9VU0VEIDEtKgorICAgICVyZXAgJTAKKyAgICAgICAgJWlmICUxIDwgcmVnc191c2VkCisgICAgICAgICAgICBwb3AgciUxCisgICAgICAgICVlbmRpZgorICAgICAgICAlcm90YXRlIDEKKyAgICAlZW5kcmVwCislZW5kbWFjcm8KKworJW1hY3JvIExPQURfSUZfVVNFRCAxLSoKKyAgICAlcmVwICUwCisgICAgICAgICVpZiAlMSA8IG51bV9hcmdzCisgICAgICAgICAgICBtb3YgciUxLCByICUrICUxICUrIG1wCisgICAgICAgICVlbmRpZgorICAgICAgICAlcm90YXRlIDEKKyAgICAlZW5kcmVwCislZW5kbWFjcm8KKworJW1hY3JvIFNVQiAyCisgICAgc3ViICUxLCAlMgorICAgICVpZmlkbiAlMSwgcnN0aworICAgICAgICAlYXNzaWduIHN0YWNrX29mZnNldCBzdGFja19vZmZzZXQrKCUyKQorICAgICVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBBREQgMgorICAgIGFkZCAlMSwgJTIKKyAgICAlaWZpZG4gJTEsIHJzdGsKKyAgICAgICAgJWFzc2lnbiBzdGFja19vZmZzZXQgc3RhY2tfb2Zmc2V0LSglMikKKyAgICAlZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gbW92aWZuaWRuIDIKKyAgICAlaWZuaWRuICUxLCAlMgorICAgICAgICBtb3YgJTEsICUyCisgICAgJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIG1vdnN4ZGlmbmlkbiAyCisgICAgJWlmbmlkbiAlMSwgJTIKKyAgICAgICAgbW92c3hkICUxLCAlMgorICAgICVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBBU1NFUlQgMQorICAgICVpZiAoJTEpID09IDAKKyAgICAgICAgJWVycm9yIGFzc2VydCBmYWlsZWQKKyAgICAlZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gREVGSU5FX0FSR1MgMC0qCisgICAgJWlmZGVmIG5fYXJnX25hbWVzCisgICAgICAgICVhc3NpZ24gJSVpIDAKKyAgICAgICAgJXJlcCBuX2FyZ19uYW1lcworICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgcQorICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgZAorICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgdworICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgaAorICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgYgorICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgbQorICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgbXAKKyAgICAgICAgICAgIENBVF9VTkRFRiBhcmdfbmFtZSwgJSVpCisgICAgICAgICAgICAlYXNzaWduICUlaSAlJWkrMQorICAgICAgICAlZW5kcmVwCisgICAgJWVuZGlmCisKKyAgICAleGRlZmluZSAlJXN0YWNrX29mZnNldCBzdGFja19vZmZzZXQKKyAgICAldW5kZWYgc3RhY2tfb2Zmc2V0IDsgc28gdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiBzdGFja19vZmZzZXQgZG9lc24ndCBnZXQgYmFrZWQgaW4gYnkgeGRlZmluZQorICAgICVhc3NpZ24gJSVpIDAKKyAgICAlcmVwICUwCisgICAgICAgICV4ZGVmaW5lICUxcSByICUrICUlaSAlKyBxCisgICAgICAgICV4ZGVmaW5lICUxZCByICUrICUlaSAlKyBkCisgICAgICAgICV4ZGVmaW5lICUxdyByICUrICUlaSAlKyB3CisgICAgICAgICV4ZGVmaW5lICUxaCByICUrICUlaSAlKyBoCisgICAgICAgICV4ZGVmaW5lICUxYiByICUrICUlaSAlKyBiCisgICAgICAgICV4ZGVmaW5lICUxbSByICUrICUlaSAlKyBtCisgICAgICAgICV4ZGVmaW5lICUxbXAgciAlKyAlJWkgJSsgbXAKKyAgICAgICAgQ0FUX1hERUZJTkUgYXJnX25hbWUsICUlaSwgJTEKKyAgICAgICAgJWFzc2lnbiAlJWkgJSVpKzEKKyAgICAgICAgJXJvdGF0ZSAxCisgICAgJWVuZHJlcAorICAgICV4ZGVmaW5lIHN0YWNrX29mZnNldCAlJXN0YWNrX29mZnNldAorICAgICVhc3NpZ24gbl9hcmdfbmFtZXMgJTAKKyVlbmRtYWNybworCislbWFjcm8gQUxMT0NfU1RBQ0sgMS0yIDAgOyBzdGFja19zaXplLCBuX3htbV9yZWdzIChmb3Igd2luNjQgb25seSkKKyAgICAlaWZudW0gJTEKKyAgICAgICAgJWlmICUxICE9IDAKKyAgICAgICAgICAgICVhc3NpZ24gJSVzdGFja19hbGlnbm1lbnQgKChtbXNpemUgKyAxNSkgJiB+MTUpCisgICAgICAgICAgICAlYXNzaWduIHN0YWNrX3NpemUgJTEKKyAgICAgICAgICAgICVpZiBzdGFja19zaXplIDwgMAorICAgICAgICAgICAgICAgICVhc3NpZ24gc3RhY2tfc2l6ZSAtc3RhY2tfc2l6ZQorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICAlYXNzaWduIHN0YWNrX3NpemVfcGFkZGVkIHN0YWNrX3NpemUKKyAgICAgICAgICAgICVpZiBXSU42NAorICAgICAgICAgICAgICAgICVhc3NpZ24gc3RhY2tfc2l6ZV9wYWRkZWQgc3RhY2tfc2l6ZV9wYWRkZWQgKyAzMiA7IHJlc2VydmUgMzIgYnl0ZXMgZm9yIHNoYWRvdyBzcGFjZQorICAgICAgICAgICAgICAgICVpZiBtbXNpemUgIT0gOAorICAgICAgICAgICAgICAgICAgICAlYXNzaWduIHhtbV9yZWdzX3VzZWQgJTIKKyAgICAgICAgICAgICAgICAgICAgJWlmIHhtbV9yZWdzX3VzZWQgPiA4CisgICAgICAgICAgICAgICAgICAgICAgICAlYXNzaWduIHN0YWNrX3NpemVfcGFkZGVkIHN0YWNrX3NpemVfcGFkZGVkICsgKHhtbV9yZWdzX3VzZWQtOCkqMTYKKyAgICAgICAgICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgICVpZiBtbXNpemUgPD0gMTYgJiYgSEFWRV9BTElHTkVEX1NUQUNLCisgICAgICAgICAgICAgICAgJWFzc2lnbiBzdGFja19zaXplX3BhZGRlZCBzdGFja19zaXplX3BhZGRlZCArICUlc3RhY2tfYWxpZ25tZW50IC0gZ3Byc2l6ZSAtIChzdGFja19vZmZzZXQgJiAoJSVzdGFja19hbGlnbm1lbnQgLSAxKSkKKyAgICAgICAgICAgICAgICBTVUIgcnNwLCBzdGFja19zaXplX3BhZGRlZAorICAgICAgICAgICAgJWVsc2UKKyAgICAgICAgICAgICAgICAlYXNzaWduICUlcmVnX251bSAocmVnc191c2VkIC0gMSkKKyAgICAgICAgICAgICAgICAleGRlZmluZSByc3RrIHIgJSsgJSVyZWdfbnVtCisgICAgICAgICAgICAgICAgOyBhbGlnbiBzdGFjaywgYW5kIHNhdmUgb3JpZ2luYWwgc3RhY2sgbG9jYXRpb24gZGlyZWN0bHkgYWJvdmUKKyAgICAgICAgICAgICAgICA7IGl0LCBpLmUuIGluIFtyc3Arc3RhY2tfc2l6ZV9wYWRkZWRdLCBzbyB3ZSBjYW4gcmVzdG9yZSB0aGUKKyAgICAgICAgICAgICAgICA7IHN0YWNrIGluIGEgc2luZ2xlIGluc3RydWN0aW9uIChpLmUuIG1vdiByc3AsIHJzdGsgb3IgbW92CisgICAgICAgICAgICAgICAgOyByc3AsIFtyc3Arc3RhY2tfc2l6ZV9wYWRkZWRdKQorICAgICAgICAgICAgICAgIG1vdiAgcnN0aywgcnNwCisgICAgICAgICAgICAgICAgJWlmICUxIDwgMCA7IG5lZWQgdG8gc3RvcmUgcnNwIG9uIHN0YWNrCisgICAgICAgICAgICAgICAgICAgIHN1YiAgcnNwLCBncHJzaXplK3N0YWNrX3NpemVfcGFkZGVkCisgICAgICAgICAgICAgICAgICAgIGFuZCAgcnNwLCB+KCUlc3RhY2tfYWxpZ25tZW50LTEpCisgICAgICAgICAgICAgICAgICAgICV4ZGVmaW5lIHJzdGttIFtyc3Arc3RhY2tfc2l6ZV9wYWRkZWRdCisgICAgICAgICAgICAgICAgICAgIG1vdiByc3RrbSwgcnN0aworICAgICAgICAgICAgICAgICVlbHNlIDsgY2FuIGtlZXAgcnNwIGluIHJzdGsgZHVyaW5nIHdob2xlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgIHN1YiAgcnNwLCBzdGFja19zaXplX3BhZGRlZAorICAgICAgICAgICAgICAgICAgICBhbmQgIHJzcCwgfiglJXN0YWNrX2FsaWdubWVudC0xKQorICAgICAgICAgICAgICAgICAgICAleGRlZmluZSByc3RrbSByc3RrCisgICAgICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgIFdJTjY0X1BVU0hfWE1NCisgICAgICAgICVlbmRpZgorICAgICVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBTRVRVUF9TVEFDS19QT0lOVEVSIDEKKyAgICAlaWZudW0gJTEKKyAgICAgICAgJWlmICUxICE9IDAgJiYgKEhBVkVfQUxJR05FRF9TVEFDSyA9PSAwIHx8IG1tc2l6ZSA9PSAzMikKKyAgICAgICAgICAgICVpZiAlMSA+IDAKKyAgICAgICAgICAgICAgICAlYXNzaWduIHJlZ3NfdXNlZCAocmVnc191c2VkICsgMSkKKyAgICAgICAgICAgICVlbGlmIEFSQ0hfWDg2XzY0ICYmIHJlZ3NfdXNlZCA9PSBudW1fYXJncyAmJiBudW1fYXJncyA8PSA0ICsgVU5JWDY0ICogMgorICAgICAgICAgICAgICAgICV3YXJuaW5nICJTdGFjayBwb2ludGVyIHdpbGwgb3ZlcndyaXRlIHJlZ2lzdGVyIGFyZ3VtZW50IgorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICVlbmRpZgorICAgICVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBERUZJTkVfQVJHU19JTlRFUk5BTCAzKworICAgICVpZm51bSAlMgorICAgICAgICBERUZJTkVfQVJHUyAlMworICAgICVlbGlmICUxID09IDQKKyAgICAgICAgREVGSU5FX0FSR1MgJTIKKyAgICAlZWxpZiAlMSA+IDQKKyAgICAgICAgREVGSU5FX0FSR1MgJTIsICUzCisgICAgJWVuZGlmCislZW5kbWFjcm8KKworJWlmIFdJTjY0IDsgV2luZG93cyB4NjQgOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworREVDTEFSRV9SRUcgMCwgIHJjeAorREVDTEFSRV9SRUcgMSwgIHJkeAorREVDTEFSRV9SRUcgMiwgIFI4CitERUNMQVJFX1JFRyAzLCAgUjkKK0RFQ0xBUkVfUkVHIDQsICBSMTAsIDQwCitERUNMQVJFX1JFRyA1LCAgUjExLCA0OAorREVDTEFSRV9SRUcgNiwgIHJheCwgNTYKK0RFQ0xBUkVfUkVHIDcsICByZGksIDY0CitERUNMQVJFX1JFRyA4LCAgcnNpLCA3MgorREVDTEFSRV9SRUcgOSwgIHJieCwgODAKK0RFQ0xBUkVfUkVHIDEwLCByYnAsIDg4CitERUNMQVJFX1JFRyAxMSwgUjEyLCA5NgorREVDTEFSRV9SRUcgMTIsIFIxMywgMTA0CitERUNMQVJFX1JFRyAxMywgUjE0LCAxMTIKK0RFQ0xBUkVfUkVHIDE0LCBSMTUsIDEyMAorCislbWFjcm8gUFJPTE9HVUUgMi01KyAwIDsgI2FyZ3MsICNyZWdzLCAjeG1tX3JlZ3MsIFtzdGFja19zaXplLF0gYXJnX25hbWVzLi4uCisgICAgJWFzc2lnbiBudW1fYXJncyAlMQorICAgICVhc3NpZ24gcmVnc191c2VkICUyCisgICAgQVNTRVJUIHJlZ3NfdXNlZCA+PSBudW1fYXJncworICAgIFNFVFVQX1NUQUNLX1BPSU5URVIgJTQKKyAgICBBU1NFUlQgcmVnc191c2VkIDw9IDE1CisgICAgUFVTSF9JRl9VU0VEIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNAorICAgIEFMTE9DX1NUQUNLICU0LCAlMworICAgICVpZiBtbXNpemUgIT0gOCAmJiBzdGFja19zaXplID09IDAKKyAgICAgICAgV0lONjRfU1BJTExfWE1NICUzCisgICAgJWVuZGlmCisgICAgTE9BRF9JRl9VU0VEIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNAorICAgIERFRklORV9BUkdTX0lOVEVSTkFMICUwLCAlNCwgJTUKKyVlbmRtYWNybworCislbWFjcm8gV0lONjRfUFVTSF9YTU0gMAorICAgIDsgVXNlIHRoZSBzaGFkb3cgc3BhY2UgdG8gc3RvcmUgWE1NNiBhbmQgWE1NNywgdGhlIHJlc3QgbmVlZHMgc3RhY2sgc3BhY2UgYWxsb2NhdGVkLgorICAgICVpZiB4bW1fcmVnc191c2VkID4gNgorICAgICAgICBtb3ZhcHMgW3JzdGsgKyBzdGFja19vZmZzZXQgKyAgOF0sIHhtbTYKKyAgICAlZW5kaWYKKyAgICAlaWYgeG1tX3JlZ3NfdXNlZCA+IDcKKyAgICAgICAgbW92YXBzIFtyc3RrICsgc3RhY2tfb2Zmc2V0ICsgMjRdLCB4bW03CisgICAgJWVuZGlmCisgICAgJWlmIHhtbV9yZWdzX3VzZWQgPiA4CisgICAgICAgICVhc3NpZ24gJSVpIDgKKyAgICAgICAgJXJlcCB4bW1fcmVnc191c2VkLTgKKyAgICAgICAgICAgIG1vdmFwcyBbcnNwICsgKCUlaS04KSoxNiArIHN0YWNrX3NpemUgKyAzMl0sIHhtbSAlKyAlJWkKKyAgICAgICAgICAgICVhc3NpZ24gJSVpICUlaSsxCisgICAgICAgICVlbmRyZXAKKyAgICAlZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gV0lONjRfU1BJTExfWE1NIDEKKyAgICAlYXNzaWduIHhtbV9yZWdzX3VzZWQgJTEKKyAgICBBU1NFUlQgeG1tX3JlZ3NfdXNlZCA8PSAxNgorICAgICVpZiB4bW1fcmVnc191c2VkID4gOAorICAgICAgICAlYXNzaWduIHN0YWNrX3NpemVfcGFkZGVkICh4bW1fcmVnc191c2VkLTgpKjE2ICsgKH5zdGFja19vZmZzZXQmOCkgKyAzMgorICAgICAgICBTVUIgcnNwLCBzdGFja19zaXplX3BhZGRlZAorICAgICVlbmRpZgorICAgIFdJTjY0X1BVU0hfWE1NCislZW5kbWFjcm8KKworJW1hY3JvIFdJTjY0X1JFU1RPUkVfWE1NX0lOVEVSTkFMIDEKKyAgICAlYXNzaWduICUlcGFkX3NpemUgMAorICAgICVpZiB4bW1fcmVnc191c2VkID4gOAorICAgICAgICAlYXNzaWduICUlaSB4bW1fcmVnc191c2VkCisgICAgICAgICVyZXAgeG1tX3JlZ3NfdXNlZC04CisgICAgICAgICAgICAlYXNzaWduICUlaSAlJWktMQorICAgICAgICAgICAgbW92YXBzIHhtbSAlKyAlJWksIFslMSArICglJWktOCkqMTYgKyBzdGFja19zaXplICsgMzJdCisgICAgICAgICVlbmRyZXAKKyAgICAlZW5kaWYKKyAgICAlaWYgc3RhY2tfc2l6ZV9wYWRkZWQgPiAwCisgICAgICAgICVpZiBzdGFja19zaXplID4gMCAmJiAobW1zaXplID09IDMyIHx8IEhBVkVfQUxJR05FRF9TVEFDSyA9PSAwKQorICAgICAgICAgICAgbW92IHJzcCwgcnN0a20KKyAgICAgICAgJWVsc2UKKyAgICAgICAgICAgIGFkZCAlMSwgc3RhY2tfc2l6ZV9wYWRkZWQKKyAgICAgICAgICAgICVhc3NpZ24gJSVwYWRfc2l6ZSBzdGFja19zaXplX3BhZGRlZAorICAgICAgICAlZW5kaWYKKyAgICAlZW5kaWYKKyAgICAlaWYgeG1tX3JlZ3NfdXNlZCA+IDcKKyAgICAgICAgbW92YXBzIHhtbTcsIFslMSArIHN0YWNrX29mZnNldCAtICUlcGFkX3NpemUgKyAyNF0KKyAgICAlZW5kaWYKKyAgICAlaWYgeG1tX3JlZ3NfdXNlZCA+IDYKKyAgICAgICAgbW92YXBzIHhtbTYsIFslMSArIHN0YWNrX29mZnNldCAtICUlcGFkX3NpemUgKyAgOF0KKyAgICAlZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gV0lONjRfUkVTVE9SRV9YTU0gMQorICAgIFdJTjY0X1JFU1RPUkVfWE1NX0lOVEVSTkFMICUxCisgICAgJWFzc2lnbiBzdGFja19vZmZzZXQgKHN0YWNrX29mZnNldC1zdGFja19zaXplX3BhZGRlZCkKKyAgICAlYXNzaWduIHhtbV9yZWdzX3VzZWQgMAorJWVuZG1hY3JvCisKKyVkZWZpbmUgaGFzX2VwaWxvZ3VlIHJlZ3NfdXNlZCA+IDcgfHwgeG1tX3JlZ3NfdXNlZCA+IDYgfHwgbW1zaXplID09IDMyIHx8IHN0YWNrX3NpemUgPiAwCisKKyVtYWNybyBSRVQgMAorICAgIFdJTjY0X1JFU1RPUkVfWE1NX0lOVEVSTkFMIHJzcAorICAgIFBPUF9JRl9VU0VEIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwgNworJWlmIG1tc2l6ZSA9PSAzMgorICAgIHZ6ZXJvdXBwZXIKKyVlbmRpZgorICAgIEFVVE9fUkVQX1JFVAorJWVuZG1hY3JvCisKKyVlbGlmIEFSQ0hfWDg2XzY0IDsgKm5peCB4NjQgOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitERUNMQVJFX1JFRyAwLCAgcmRpCitERUNMQVJFX1JFRyAxLCAgcnNpCitERUNMQVJFX1JFRyAyLCAgcmR4CitERUNMQVJFX1JFRyAzLCAgcmN4CitERUNMQVJFX1JFRyA0LCAgUjgKK0RFQ0xBUkVfUkVHIDUsICBSOQorREVDTEFSRV9SRUcgNiwgIHJheCwgOAorREVDTEFSRV9SRUcgNywgIFIxMCwgMTYKK0RFQ0xBUkVfUkVHIDgsICBSMTEsIDI0CitERUNMQVJFX1JFRyA5LCAgcmJ4LCAzMgorREVDTEFSRV9SRUcgMTAsIHJicCwgNDAKK0RFQ0xBUkVfUkVHIDExLCBSMTIsIDQ4CitERUNMQVJFX1JFRyAxMiwgUjEzLCA1NgorREVDTEFSRV9SRUcgMTMsIFIxNCwgNjQKK0RFQ0xBUkVfUkVHIDE0LCBSMTUsIDcyCisKKyVtYWNybyBQUk9MT0dVRSAyLTUrIDsgI2FyZ3MsICNyZWdzLCAjeG1tX3JlZ3MsIFtzdGFja19zaXplLF0gYXJnX25hbWVzLi4uCisgICAgJWFzc2lnbiBudW1fYXJncyAlMQorICAgICVhc3NpZ24gcmVnc191c2VkICUyCisgICAgQVNTRVJUIHJlZ3NfdXNlZCA+PSBudW1fYXJncworICAgIFNFVFVQX1NUQUNLX1BPSU5URVIgJTQKKyAgICBBU1NFUlQgcmVnc191c2VkIDw9IDE1CisgICAgUFVTSF9JRl9VU0VEIDksIDEwLCAxMSwgMTIsIDEzLCAxNAorICAgIEFMTE9DX1NUQUNLICU0CisgICAgTE9BRF9JRl9VU0VEIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNAorICAgIERFRklORV9BUkdTX0lOVEVSTkFMICUwLCAlNCwgJTUKKyVlbmRtYWNybworCislZGVmaW5lIGhhc19lcGlsb2d1ZSByZWdzX3VzZWQgPiA5IHx8IG1tc2l6ZSA9PSAzMiB8fCBzdGFja19zaXplID4gMAorCislbWFjcm8gUkVUIDAKKyVpZiBzdGFja19zaXplX3BhZGRlZCA+IDAKKyVpZiBtbXNpemUgPT0gMzIgfHwgSEFWRV9BTElHTkVEX1NUQUNLID09IDAKKyAgICBtb3YgcnNwLCByc3RrbQorJWVsc2UKKyAgICBhZGQgcnNwLCBzdGFja19zaXplX3BhZGRlZAorJWVuZGlmCislZW5kaWYKKyAgICBQT1BfSUZfVVNFRCAxNCwgMTMsIDEyLCAxMSwgMTAsIDkKKyVpZiBtbXNpemUgPT0gMzIKKyAgICB2emVyb3VwcGVyCislZW5kaWYKKyAgICBBVVRPX1JFUF9SRVQKKyVlbmRtYWNybworCislZWxzZSA7IFg4Nl8zMiA7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworREVDTEFSRV9SRUcgMCwgZWF4LCA0CitERUNMQVJFX1JFRyAxLCBlY3gsIDgKK0RFQ0xBUkVfUkVHIDIsIGVkeCwgMTIKK0RFQ0xBUkVfUkVHIDMsIGVieCwgMTYKK0RFQ0xBUkVfUkVHIDQsIGVzaSwgMjAKK0RFQ0xBUkVfUkVHIDUsIGVkaSwgMjQKK0RFQ0xBUkVfUkVHIDYsIGVicCwgMjgKKyVkZWZpbmUgcnNwIGVzcAorCislbWFjcm8gREVDTEFSRV9BUkcgMS0qCisgICAgJXJlcCAlMAorICAgICAgICAlZGVmaW5lIHIlMW0gW3JzdGsgKyBzdGFja19vZmZzZXQgKyA0KiUxICsgNF0KKyAgICAgICAgJWRlZmluZSByJTFtcCBkd29yZCByJTFtCisgICAgICAgICVyb3RhdGUgMQorICAgICVlbmRyZXAKKyVlbmRtYWNybworCitERUNMQVJFX0FSRyA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKKworJW1hY3JvIFBST0xPR1VFIDItNSsgOyAjYXJncywgI3JlZ3MsICN4bW1fcmVncywgW3N0YWNrX3NpemUsXSBhcmdfbmFtZXMuLi4KKyAgICAlYXNzaWduIG51bV9hcmdzICUxCisgICAgJWFzc2lnbiByZWdzX3VzZWQgJTIKKyAgICBBU1NFUlQgcmVnc191c2VkID49IG51bV9hcmdzCisgICAgJWlmIG51bV9hcmdzID4gNworICAgICAgICAlYXNzaWduIG51bV9hcmdzIDcKKyAgICAlZW5kaWYKKyAgICAlaWYgcmVnc191c2VkID4gNworICAgICAgICAlYXNzaWduIHJlZ3NfdXNlZCA3CisgICAgJWVuZGlmCisgICAgU0VUVVBfU1RBQ0tfUE9JTlRFUiAlNAorICAgIEFTU0VSVCByZWdzX3VzZWQgPD0gNworICAgIFBVU0hfSUZfVVNFRCAzLCA0LCA1LCA2CisgICAgQUxMT0NfU1RBQ0sgJTQKKyAgICBMT0FEX0lGX1VTRUQgMCwgMSwgMiwgMywgNCwgNSwgNgorICAgIERFRklORV9BUkdTX0lOVEVSTkFMICUwLCAlNCwgJTUKKyVlbmRtYWNybworCislZGVmaW5lIGhhc19lcGlsb2d1ZSByZWdzX3VzZWQgPiAzIHx8IG1tc2l6ZSA9PSAzMiB8fCBzdGFja19zaXplID4gMAorCislbWFjcm8gUkVUIDAKKyVpZiBzdGFja19zaXplX3BhZGRlZCA+IDAKKyVpZiBtbXNpemUgPT0gMzIgfHwgSEFWRV9BTElHTkVEX1NUQUNLID09IDAKKyAgICBtb3YgcnNwLCByc3RrbQorJWVsc2UKKyAgICBhZGQgcnNwLCBzdGFja19zaXplX3BhZGRlZAorJWVuZGlmCislZW5kaWYKKyAgICBQT1BfSUZfVVNFRCA2LCA1LCA0LCAzCislaWYgbW1zaXplID09IDMyCisgICAgdnplcm91cHBlcgorJWVuZGlmCisgICAgQVVUT19SRVBfUkVUCislZW5kbWFjcm8KKworJWVuZGlmIDs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyVpZiBXSU42NCA9PSAwCislbWFjcm8gV0lONjRfU1BJTExfWE1NIDEKKyVlbmRtYWNybworJW1hY3JvIFdJTjY0X1JFU1RPUkVfWE1NIDEKKyVlbmRtYWNybworJW1hY3JvIFdJTjY0X1BVU0hfWE1NIDAKKyVlbmRtYWNybworJWVuZGlmCisKKzsgT24gQU1EIGNwdXMgPD1LMTAsIGFuIG9yZGluYXJ5IHJldCBpcyBzbG93IGlmIGl0IGltbWVkaWF0ZWx5IGZvbGxvd3MgZWl0aGVyCis7IGEgYnJhbmNoIG9yIGEgYnJhbmNoIHRhcmdldC4gU28gc3dpdGNoIHRvIGEgMi1ieXRlIGZvcm0gb2YgcmV0IGluIHRoYXQgY2FzZS4KKzsgV2UgY2FuIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ICJmb2xsb3dzIGEgYnJhbmNoIiwgYnV0IG5vdCBhIGJyYW5jaCB0YXJnZXQuCis7IChTU1NFMyBpcyBhIHN1ZmZpY2llbnQgY29uZGl0aW9uIHRvIGtub3cgdGhhdCB5b3VyIGNwdSBkb2Vzbid0IGhhdmUgdGhpcyBwcm9ibGVtLikKKyVtYWNybyBSRVBfUkVUIDAKKyAgICAlaWYgaGFzX2VwaWxvZ3VlCisgICAgICAgIFJFVAorICAgICVlbHNlCisgICAgICAgIHJlcCByZXQKKyAgICAlZW5kaWYKKyVlbmRtYWNybworCislZGVmaW5lIGxhc3RfYnJhbmNoX2FkciAkJAorJW1hY3JvIEFVVE9fUkVQX1JFVCAwCisgICAgJWlmbmRlZiBjcHVmbGFncworICAgICAgICB0aW1lcyAoKGxhc3RfYnJhbmNoX2Fkci0kKT4+MzEpKzEgcmVwIDsgdGltZXMgMSBpZmYgJCAhPSBsYXN0X2JyYW5jaF9hZHIuCisgICAgJWVsaWYgbm90Y3B1ZmxhZyhzc3NlMykKKyAgICAgICAgdGltZXMgKChsYXN0X2JyYW5jaF9hZHItJCk+PjMxKSsxIHJlcAorICAgICVlbmRpZgorICAgIHJldAorJWVuZG1hY3JvCisKKyVtYWNybyBCUkFOQ0hfSU5TVFIgMC0qCisgICAgJXJlcCAlMAorICAgICAgICAlbWFjcm8gJTEgMS0yICUxCisgICAgICAgICAgICAlMiAlMQorICAgICAgICAgICAgJSVicmFuY2hfaW5zdHI6CisgICAgICAgICAgICAleGRlZmluZSBsYXN0X2JyYW5jaF9hZHIgJSVicmFuY2hfaW5zdHIKKyAgICAgICAgJWVuZG1hY3JvCisgICAgICAgICVyb3RhdGUgMQorICAgICVlbmRyZXAKKyVlbmRtYWNybworCitCUkFOQ0hfSU5TVFIganosIGplLCBqbnosIGpuZSwgamwsIGpsZSwgam5sLCBqbmxlLCBqZywgamdlLCBqbmcsIGpuZ2UsIGphLCBqYWUsIGpuYSwgam5hZSwgamIsIGpiZSwgam5iLCBqbmJlLCBqYywgam5jLCBqcywgam5zLCBqbywgam5vLCBqcCwgam5wCisKKyVtYWNybyBUQUlMX0NBTEwgMiA7IGNhbGxlZSwgaXNfbm9uYWRqYWNlbnQKKyAgICAlaWYgaGFzX2VwaWxvZ3VlCisgICAgICAgIGNhbGwgJTEKKyAgICAgICAgUkVUCisgICAgJWVsaWYgJTIKKyAgICAgICAgam1wICUxCisgICAgJWVuZGlmCislZW5kbWFjcm8KKworOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7IGFyY2gtaW5kZXBlbmRlbnQgcGFydAorOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyVhc3NpZ24gZnVuY3Rpb25fYWxpZ24gMTYKKworOyBCZWdpbiBhIGZ1bmN0aW9uLgorOyBBcHBsaWVzIGFueSBzeW1ib2wgbWFuZ2xpbmcgbmVlZGVkIGZvciBDIGxpbmthZ2UsIGFuZCBzZXRzIHVwIGEgZGVmaW5lIHN1Y2ggdGhhdAorOyBzdWJzZXF1ZW50IHVzZXMgb2YgdGhlIGZ1bmN0aW9uIG5hbWUgYXV0b21hdGljYWxseSByZWZlciB0byB0aGUgbWFuZ2xlZCB2ZXJzaW9uLgorOyBBcHBlbmRzIGNwdWZsYWdzIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGlmIGNwdWZsYWdzIGhhcyBiZWVuIHNwZWNpZmllZC4KKzsgVGhlICIiIGVtcHR5IGRlZmF1bHQgcGFyYW1ldGVyIGlzIGEgd29ya2Fyb3VuZCBmb3IgbmFzbSwgd2hpY2ggZmFpbHMgaWYgU1VGRklYCis7IGlzIGVtcHR5IGFuZCB3ZSBjYWxsIGNnbG9iYWxfaW50ZXJuYWwgd2l0aCBqdXN0ICUxICUrIFNVRkZJWCAod2l0aG91dCAlMikuCislbWFjcm8gY2dsb2JhbCAxLTIrICIiIDsgbmFtZSwgW1BST0xPR1VFIGFyZ3NdCisgICAgY2dsb2JhbF9pbnRlcm5hbCAxLCAlMSAlKyBTVUZGSVgsICUyCislZW5kbWFjcm8KKyVtYWNybyBjdmlzaWJsZSAxLTIrICIiIDsgbmFtZSwgW1BST0xPR1VFIGFyZ3NdCisgICAgY2dsb2JhbF9pbnRlcm5hbCAwLCAlMSAlKyBTVUZGSVgsICUyCislZW5kbWFjcm8KKyVtYWNybyBjZ2xvYmFsX2ludGVybmFsIDItMysKKyAgICAlaWYgJTEKKyAgICAgICAgJXhkZWZpbmUgJSVGVU5DVElPTl9QUkVGSVggcHJpdmF0ZV9wcmVmaXgKKyAgICAgICAgJXhkZWZpbmUgJSVWSVNJQklMSVRZIGhpZGRlbgorICAgICVlbHNlCisgICAgICAgICV4ZGVmaW5lICUlRlVOQ1RJT05fUFJFRklYIHB1YmxpY19wcmVmaXgKKyAgICAgICAgJXhkZWZpbmUgJSVWSVNJQklMSVRZCisgICAgJWVuZGlmCisgICAgJWlmbmRlZiBjZ2xvYmFsZWRfJTIKKyAgICAgICAgJXhkZWZpbmUgJTIgbWFuZ2xlKCUlRlVOQ1RJT05fUFJFRklYICUrIF8gJSsgJTIpCisgICAgICAgICV4ZGVmaW5lICUyLnNraXBfcHJvbG9ndWUgJTIgJSsgLnNraXBfcHJvbG9ndWUKKyAgICAgICAgQ0FUX1hERUZJTkUgY2dsb2JhbGVkXywgJTIsIDEKKyAgICAlZW5kaWYKKyAgICAleGRlZmluZSBjdXJyZW50X2Z1bmN0aW9uICUyCisgICAgJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZgorICAgICAgICBnbG9iYWwgJTI6ZnVuY3Rpb24gJSVWSVNJQklMSVRZCisgICAgJWVsc2UKKyAgICAgICAgZ2xvYmFsICUyCisgICAgJWVuZGlmCisgICAgYWxpZ24gZnVuY3Rpb25fYWxpZ24KKyAgICAlMjoKKyAgICBSRVNFVF9NTV9QRVJNVVRBVElPTiAgICAgICAgOyBuZWVkZWQgZm9yIHg4Ni02NCwgYWxzbyBtYWtlcyBkaXNhc3NlbWJseSBzb21ld2hhdCBuaWNlcgorICAgICV4ZGVmaW5lIHJzdGsgcnNwICAgICAgICAgICA7IGNvcHkgb2YgdGhlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIsIHVzZWQgd2hlbiBncmVhdGVyIGFsaWdubWVudCB0aGFuIHRoZSBrbm93biBzdGFjayBhbGlnbm1lbnQgaXMgcmVxdWlyZWQKKyAgICAlYXNzaWduIHN0YWNrX29mZnNldCAwICAgICAgOyBzdGFjayBwb2ludGVyIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgcmV0dXJuIGFkZHJlc3MKKyAgICAlYXNzaWduIHN0YWNrX3NpemUgMCAgICAgICAgOyBhbW91bnQgb2Ygc3RhY2sgc3BhY2UgdGhhdCBjYW4gYmUgZnJlZWx5IHVzZWQgaW5zaWRlIGEgZnVuY3Rpb24KKyAgICAlYXNzaWduIHN0YWNrX3NpemVfcGFkZGVkIDAgOyB0b3RhbCBhbW91bnQgb2YgYWxsb2NhdGVkIHN0YWNrIHNwYWNlLCBpbmNsdWRpbmcgc3BhY2UgZm9yIGNhbGxlZS1zYXZlZCB4bW0gcmVnaXN0ZXJzIG9uIFdJTjY0IGFuZCBhbGlnbm1lbnQgcGFkZGluZworICAgICVhc3NpZ24geG1tX3JlZ3NfdXNlZCAwICAgICA7IG51bWJlciBvZiBYTU0gcmVnaXN0ZXJzIHJlcXVlc3RlZCwgdXNlZCBmb3IgZGVhbGluZyB3aXRoIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgb24gV0lONjQKKyAgICAlaWZuaWRuICUzLCAiIgorICAgICAgICBQUk9MT0dVRSAlMworICAgICVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBjZXh0ZXJuIDEKKyAgICAleGRlZmluZSAlMSBtYW5nbGUocHJpdmF0ZV9wcmVmaXggJSsgXyAlKyAlMSkKKyAgICBDQVRfWERFRklORSBjZ2xvYmFsZWRfLCAlMSwgMQorICAgIGV4dGVybiAlMQorJWVuZG1hY3JvCisKKzsgbGlrZSBjZXh0ZXJuLCBidXQgd2l0aG91dCB0aGUgcHJlZml4CislbWFjcm8gY2V4dGVybl9uYWtlZCAxCisgICAgJXhkZWZpbmUgJTEgbWFuZ2xlKCUxKQorICAgIENBVF9YREVGSU5FIGNnbG9iYWxlZF8sICUxLCAxCisgICAgZXh0ZXJuICUxCislZW5kbWFjcm8KKworJW1hY3JvIGNvbnN0IDEtMisKKyAgICAleGRlZmluZSAlMSBtYW5nbGUocHJpdmF0ZV9wcmVmaXggJSsgXyAlKyAlMSkKKyAgICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18sZWxmCisgICAgICAgIGdsb2JhbCAlMTpkYXRhIGhpZGRlbgorICAgICVlbHNlCisgICAgICAgIGdsb2JhbCAlMQorICAgICVlbmRpZgorICAgICUxOiAlMgorJWVuZG1hY3JvCisKKzsgVGhpcyBpcyBuZWVkZWQgZm9yIEVMRiwgb3RoZXJ3aXNlIHRoZSBHTlUgbGlua2VyIGFzc3VtZXMgdGhlIHN0YWNrIGlzCis7IGV4ZWN1dGFibGUgYnkgZGVmYXVsdC4KKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGYKK1NFQ1RJT04gLm5vdGUuR05VLXN0YWNrIG5vYWxsb2Mgbm9leGVjIG5vd3JpdGUgcHJvZ2JpdHMKKyVlbmRpZgorCis7IGNwdWZsYWdzCisKKyVhc3NpZ24gY3B1ZmxhZ3NfbW14ICAgICAgKDE8PDApCislYXNzaWduIGNwdWZsYWdzX21teDIgICAgICgxPDwxKSB8IGNwdWZsYWdzX21teAorJWFzc2lnbiBjcHVmbGFnc18zZG5vdyAgICAoMTw8MikgfCBjcHVmbGFnc19tbXgKKyVhc3NpZ24gY3B1ZmxhZ3NfM2Rub3dleHQgKDE8PDMpIHwgY3B1ZmxhZ3NfM2Rub3cKKyVhc3NpZ24gY3B1ZmxhZ3Nfc3NlICAgICAgKDE8PDQpIHwgY3B1ZmxhZ3NfbW14MgorJWFzc2lnbiBjcHVmbGFnc19zc2UyICAgICAoMTw8NSkgfCBjcHVmbGFnc19zc2UKKyVhc3NpZ24gY3B1ZmxhZ3Nfc3NlMnNsb3cgKDE8PDYpIHwgY3B1ZmxhZ3Nfc3NlMgorJWFzc2lnbiBjcHVmbGFnc19zc2UzICAgICAoMTw8NykgfCBjcHVmbGFnc19zc2UyCislYXNzaWduIGNwdWZsYWdzX3Nzc2UzICAgICgxPDw4KSB8IGNwdWZsYWdzX3NzZTMKKyVhc3NpZ24gY3B1ZmxhZ3Nfc3NlNCAgICAgKDE8PDkpIHwgY3B1ZmxhZ3Nfc3NzZTMKKyVhc3NpZ24gY3B1ZmxhZ3Nfc3NlNDIgICAgKDE8PDEwKXwgY3B1ZmxhZ3Nfc3NlNAorJWFzc2lnbiBjcHVmbGFnc19hdnggICAgICAoMTw8MTEpfCBjcHVmbGFnc19zc2U0MgorJWFzc2lnbiBjcHVmbGFnc194b3AgICAgICAoMTw8MTIpfCBjcHVmbGFnc19hdngKKyVhc3NpZ24gY3B1ZmxhZ3NfZm1hNCAgICAgKDE8PDEzKXwgY3B1ZmxhZ3NfYXZ4CislYXNzaWduIGNwdWZsYWdzX2F2eDIgICAgICgxPDwxNCl8IGNwdWZsYWdzX2F2eAorJWFzc2lnbiBjcHVmbGFnc19mbWEzICAgICAoMTw8MTUpfCBjcHVmbGFnc19hdngKKworJWFzc2lnbiBjcHVmbGFnc19jYWNoZTMyICAoMTw8MTYpCislYXNzaWduIGNwdWZsYWdzX2NhY2hlNjQgICgxPDwxNykKKyVhc3NpZ24gY3B1ZmxhZ3Nfc2xvd2N0eiAgKDE8PDE4KQorJWFzc2lnbiBjcHVmbGFnc19semNudCAgICAoMTw8MTkpCislYXNzaWduIGNwdWZsYWdzX2FsaWduZWQgICgxPDwyMCkgOyBub3QgYSBjcHUgZmVhdHVyZSwgYnV0IGEgZnVuY3Rpb24gdmFyaWFudAorJWFzc2lnbiBjcHVmbGFnc19hdG9tICAgICAoMTw8MjEpCislYXNzaWduIGNwdWZsYWdzX2JtaTEgICAgICgxPDwyMil8Y3B1ZmxhZ3NfbHpjbnQKKyVhc3NpZ24gY3B1ZmxhZ3NfYm1pMiAgICAgKDE8PDIzKXxjcHVmbGFnc19ibWkxCisKKyVkZWZpbmUgICAgY3B1ZmxhZyh4KSAoKGNwdWZsYWdzICYgKGNwdWZsYWdzXyAlKyB4KSkgPT0gKGNwdWZsYWdzXyAlKyB4KSkKKyVkZWZpbmUgbm90Y3B1ZmxhZyh4KSAoKGNwdWZsYWdzICYgKGNwdWZsYWdzXyAlKyB4KSkgIT0gKGNwdWZsYWdzXyAlKyB4KSkKKworOyBUYWtlcyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGNwdWZsYWdzIGZyb20gdGhlIGFib3ZlIGxpc3QuCis7IEFsbCBzdWJzZXF1ZW50IGZ1bmN0aW9ucyAodXAgdG8gdGhlIG5leHQgSU5JVF9DUFVGTEFHUykgaXMgYnVpbHQgZm9yIHRoZSBzcGVjaWZpZWQgY3B1LgorOyBZb3Ugc2hvdWxkbid0IG5lZWQgdG8gaW52b2tlIHRoaXMgbWFjcm8gZGlyZWN0bHksIGl0J3MgYSBzdWJyb3V0aW5lIGZvciBJTklUX01NWCAmY28uCislbWFjcm8gSU5JVF9DUFVGTEFHUyAwLSoKKyAgICAleGRlZmluZSBTVUZGSVgKKyAgICAldW5kZWYgY3B1bmFtZQorICAgICVhc3NpZ24gY3B1ZmxhZ3MgMAorCisgICAgJWlmICUwID49IDEKKyAgICAgICAgJXJlcCAlMAorICAgICAgICAgICAgJWlmZGVmIGNwdW5hbWUKKyAgICAgICAgICAgICAgICAleGRlZmluZSBjcHVuYW1lIGNwdW5hbWUgJSsgXyUxCisgICAgICAgICAgICAlZWxzZQorICAgICAgICAgICAgICAgICV4ZGVmaW5lIGNwdW5hbWUgJTEKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgJWFzc2lnbiBjcHVmbGFncyBjcHVmbGFncyB8IGNwdWZsYWdzXyUxCisgICAgICAgICAgICAlcm90YXRlIDEKKyAgICAgICAgJWVuZHJlcAorICAgICAgICAleGRlZmluZSBTVUZGSVggXyAlKyBjcHVuYW1lCisKKyAgICAgICAgJWlmIGNwdWZsYWcoYXZ4KQorICAgICAgICAgICAgJWFzc2lnbiBhdnhfZW5hYmxlZCAxCisgICAgICAgICVlbmRpZgorICAgICAgICAlaWYgKG1tc2l6ZSA9PSAxNiAmJiBub3RjcHVmbGFnKHNzZTIpKSB8fCAobW1zaXplID09IDMyICYmIG5vdGNwdWZsYWcoYXZ4MikpCisgICAgICAgICAgICAlZGVmaW5lIG1vdmEgbW92YXBzCisgICAgICAgICAgICAlZGVmaW5lIG1vdnUgbW92dXBzCisgICAgICAgICAgICAlZGVmaW5lIG1vdm50YSBtb3ZudHBzCisgICAgICAgICVlbmRpZgorICAgICAgICAlaWYgY3B1ZmxhZyhhbGlnbmVkKQorICAgICAgICAgICAgJWRlZmluZSBtb3Z1IG1vdmEKKyAgICAgICAgJWVsaWYgY3B1ZmxhZyhzc2UzKSAmJiBub3RjcHVmbGFnKHNzc2UzKQorICAgICAgICAgICAgJWRlZmluZSBtb3Z1IGxkZHF1CisgICAgICAgICVlbmRpZgorICAgICVlbmRpZgorCisgICAgJWlmIGNwdWZsYWcoc3NlMikKKyAgICAgICAgQ1BVTk9QIGFtZG5vcAorICAgICVlbHNlCisgICAgICAgIENQVU5PUCBiYXNpY25vcAorICAgICVlbmRpZgorJWVuZG1hY3JvCisKKzsgTWVyZ2UgbW14IGFuZCBzc2UqCis7IG0jIGlzIGEgc2ltZCByZWdpc3RlciBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHNpemUKKzsgeG0jIGlzIHRoZSBjb3JyZXNwb25kaW5nIHhtbSByZWdpc3RlciBpZiBtbXNpemUgPj0gMTYsIG90aGVyd2lzZSB0aGUgc2FtZSBhcyBtIworOyB5bSMgaXMgdGhlIGNvcnJlc3BvbmRpbmcgeW1tIHJlZ2lzdGVyIGlmIG1tc2l6ZSA+PSAzMiwgb3RoZXJ3aXNlIHRoZSBzYW1lIGFzIG0jCis7IChBbGwgMyByZW1haW4gaW4gc3luYyB0aHJvdWdoIFNXQVAuKQorCislbWFjcm8gQ0FUX1hERUZJTkUgMworICAgICV4ZGVmaW5lICUxJTIgJTMKKyVlbmRtYWNybworCislbWFjcm8gQ0FUX1VOREVGIDIKKyAgICAldW5kZWYgJTElMgorJWVuZG1hY3JvCisKKyVtYWNybyBJTklUX01NWCAwLTErCisgICAgJWFzc2lnbiBhdnhfZW5hYmxlZCAwCisgICAgJWRlZmluZSBSRVNFVF9NTV9QRVJNVVRBVElPTiBJTklUX01NWCAlMQorICAgICVkZWZpbmUgbW1zaXplIDgKKyAgICAlZGVmaW5lIG51bV9tbXJlZ3MgOAorICAgICVkZWZpbmUgbW92YSBtb3ZxCisgICAgJWRlZmluZSBtb3Z1IG1vdnEKKyAgICAlZGVmaW5lIG1vdmggbW92ZAorICAgICVkZWZpbmUgbW92bnRhIG1vdm50cQorICAgICVhc3NpZ24gJSVpIDAKKyAgICAlcmVwIDgKKyAgICBDQVRfWERFRklORSBtLCAlJWksIG1tICUrICUlaQorICAgIENBVF9YREVGSU5FIG5ubW0sICUlaSwgJSVpCisgICAgJWFzc2lnbiAlJWkgJSVpKzEKKyAgICAlZW5kcmVwCisgICAgJXJlcCA4CisgICAgQ0FUX1VOREVGIG0sICUlaQorICAgIENBVF9VTkRFRiBubm1tLCAlJWkKKyAgICAlYXNzaWduICUlaSAlJWkrMQorICAgICVlbmRyZXAKKyAgICBJTklUX0NQVUZMQUdTICUxCislZW5kbWFjcm8KKworJW1hY3JvIElOSVRfWE1NIDAtMSsKKyAgICAlYXNzaWduIGF2eF9lbmFibGVkIDAKKyAgICAlZGVmaW5lIFJFU0VUX01NX1BFUk1VVEFUSU9OIElOSVRfWE1NICUxCisgICAgJWRlZmluZSBtbXNpemUgMTYKKyAgICAlZGVmaW5lIG51bV9tbXJlZ3MgOAorICAgICVpZiBBUkNIX1g4Nl82NAorICAgICVkZWZpbmUgbnVtX21tcmVncyAxNgorICAgICVlbmRpZgorICAgICVkZWZpbmUgbW92YSBtb3ZkcWEKKyAgICAlZGVmaW5lIG1vdnUgbW92ZHF1CisgICAgJWRlZmluZSBtb3ZoIG1vdnEKKyAgICAlZGVmaW5lIG1vdm50YSBtb3ZudGRxCisgICAgJWFzc2lnbiAlJWkgMAorICAgICVyZXAgbnVtX21tcmVncworICAgIENBVF9YREVGSU5FIG0sICUlaSwgeG1tICUrICUlaQorICAgIENBVF9YREVGSU5FIG5ueG1tLCAlJWksICUlaQorICAgICVhc3NpZ24gJSVpICUlaSsxCisgICAgJWVuZHJlcAorICAgIElOSVRfQ1BVRkxBR1MgJTEKKyVlbmRtYWNybworCis7IEZJWE1FOiBJTklUX0FWWCBjYW4gYmUgcmVwbGFjZWQgYnkgSU5JVF9YTU0gYXZ4CislbWFjcm8gSU5JVF9BVlggMAorICAgIElOSVRfWE1NCisgICAgJWFzc2lnbiBhdnhfZW5hYmxlZCAxCisgICAgJWRlZmluZSBQQUxJR05SIFBBTElHTlJfU1NTRTMKKyAgICAlZGVmaW5lIFJFU0VUX01NX1BFUk1VVEFUSU9OIElOSVRfQVZYCislZW5kbWFjcm8KKworJW1hY3JvIElOSVRfWU1NIDAtMSsKKyAgICAlYXNzaWduIGF2eF9lbmFibGVkIDEKKyAgICAlZGVmaW5lIFJFU0VUX01NX1BFUk1VVEFUSU9OIElOSVRfWU1NICUxCisgICAgJWRlZmluZSBtbXNpemUgMzIKKyAgICAlZGVmaW5lIG51bV9tbXJlZ3MgOAorICAgICVpZiBBUkNIX1g4Nl82NAorICAgICVkZWZpbmUgbnVtX21tcmVncyAxNgorICAgICVlbmRpZgorICAgICVkZWZpbmUgbW92YSBtb3ZkcWEKKyAgICAlZGVmaW5lIG1vdnUgbW92ZHF1CisgICAgJXVuZGVmIG1vdmgKKyAgICAlZGVmaW5lIG1vdm50YSBtb3ZudGRxCisgICAgJWFzc2lnbiAlJWkgMAorICAgICVyZXAgbnVtX21tcmVncworICAgIENBVF9YREVGSU5FIG0sICUlaSwgeW1tICUrICUlaQorICAgIENBVF9YREVGSU5FIG55bW0sICUlaSwgJSVpCisgICAgJWFzc2lnbiAlJWkgJSVpKzEKKyAgICAlZW5kcmVwCisgICAgSU5JVF9DUFVGTEFHUyAlMQorJWVuZG1hY3JvCisKK0lOSVRfWE1NCisKKyVtYWNybyBERUNMQVJFX01NQ0FTVCAxCisgICAgJWRlZmluZSAgbW1tbSUxICAgbW0lMQorICAgICVkZWZpbmUgIG1teG1tJTEgIG1tJTEKKyAgICAlZGVmaW5lICBtbXltbSUxICBtbSUxCisgICAgJWRlZmluZSB4bW1tbSUxICAgbW0lMQorICAgICVkZWZpbmUgeG1teG1tJTEgeG1tJTEKKyAgICAlZGVmaW5lIHhtbXltbSUxIHhtbSUxCisgICAgJWRlZmluZSB5bW1tbSUxICAgbW0lMQorICAgICVkZWZpbmUgeW1teG1tJTEgeG1tJTEKKyAgICAlZGVmaW5lIHltbXltbSUxIHltbSUxCisgICAgJWRlZmluZSB4bSUxIHhtbSAlKyBtJTEKKyAgICAlZGVmaW5lIHltJTEgeW1tICUrIG0lMQorJWVuZG1hY3JvCisKKyVhc3NpZ24gaSAwCislcmVwIDE2CisgICAgREVDTEFSRV9NTUNBU1QgaQorJWFzc2lnbiBpIGkrMQorJWVuZHJlcAorCis7IEkgb2Z0ZW4gd2FudCB0byB1c2UgbWFjcm9zIHRoYXQgcGVybXV0ZSB0aGVpciBhcmd1bWVudHMuIGUuZy4gdGhlcmUncyBubworOyBlZmZpY2llbnQgd2F5IHRvIGltcGxlbWVudCBidXR0ZXJmbHkgb3IgdHJhbnNwb3NlIG9yIGRjdCB3aXRob3V0IHN3YXBwaW5nIHNvbWUKKzsgYXJndW1lbnRzLgorOworOyBJIHdvdWxkIGxpa2UgdG8gbm90IGhhdmUgdG8gbWFudWFsbHkga2VlcCB0cmFjayBvZiB0aGUgcGVybXV0YXRpb25zOgorOyBJZiBJIGluc2VydCBhIHBlcm11dGF0aW9uIGluIHRoZSBtaWRkbGUgb2YgYSBmdW5jdGlvbiwgaXQgc2hvdWxkIGF1dG9tYXRpY2FsbHkKKzsgY2hhbmdlIGV2ZXJ5dGhpbmcgdGhhdCBmb2xsb3dzLiBGb3IgbW9yZSBjb21wbGV4IG1hY3JvcyBJIG1heSBhbHNvIGhhdmUgbXVsdGlwbGUKKzsgaW1wbGVtZW50YXRpb25zLCBlLmcuIHRoZSBTU0UyIGFuZCBTU1NFMyB2ZXJzaW9ucyBtYXkgaGF2ZSBkaWZmZXJlbnQgcGVybXV0YXRpb25zLgorOworOyBIZW5jZSB0aGVzZSBtYWNyb3MuIEluc2VydCBhIFBFUk1VVEUgb3Igc29tZSBTV0FQcyBhdCB0aGUgZW5kIG9mIGEgbWFjcm8gdGhhdAorOyBwZXJtdXRlcyBpdHMgYXJndW1lbnRzLiBJdCdzIGVxdWl2YWxlbnQgdG8gZXhjaGFuZ2luZyB0aGUgY29udGVudHMgb2YgdGhlCis7IHJlZ2lzdGVycywgZXhjZXB0IHRoYXQgdGhpcyB3YXkgeW91IGV4Y2hhbmdlIHRoZSByZWdpc3RlciBuYW1lcyBpbnN0ZWFkLCBzbyBpdAorOyBkb2Vzbid0IGNvc3QgYW55IGN5Y2xlcy4KKworJW1hY3JvIFBFUk1VVEUgMi0qIDsgdGFrZXMgYSBsaXN0IG9mIHBhaXJzIHRvIHN3YXAKKyVyZXAgJTAvMgorICAgICV4ZGVmaW5lICUldG1wJTIgbSUyCisgICAgJXJvdGF0ZSAyCislZW5kcmVwCislcmVwICUwLzIKKyAgICAleGRlZmluZSBtJTEgJSV0bXAlMgorICAgIENBVF9YREVGSU5FIG5uLCBtJTEsICUxCisgICAgJXJvdGF0ZSAyCislZW5kcmVwCislZW5kbWFjcm8KKworJW1hY3JvIFNXQVAgMisgOyBzd2FwcyBhIHNpbmdsZSBjaGFpbiAoc29tZXRpbWVzIG1vcmUgY29uY2lzZSB0aGFuIHBhaXJzKQorJWlmbnVtICUxIDsgU1dBUCAwLCAxLCAuLi4KKyAgICBTV0FQX0lOVEVSTkFMX05VTSAlMSwgJTIKKyVlbHNlIDsgU1dBUCBtMCwgbTEsIC4uLgorICAgIFNXQVBfSU5URVJOQUxfTkFNRSAlMSwgJTIKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBTV0FQX0lOVEVSTkFMX05VTSAyLSoKKyAgICAlcmVwICUwLTEKKyAgICAgICAgJXhkZWZpbmUgJSV0bXAgbSUxCisgICAgICAgICV4ZGVmaW5lIG0lMSBtJTIKKyAgICAgICAgJXhkZWZpbmUgbSUyICUldG1wCisgICAgICAgIENBVF9YREVGSU5FIG5uLCBtJTEsICUxCisgICAgICAgIENBVF9YREVGSU5FIG5uLCBtJTIsICUyCisgICAgJXJvdGF0ZSAxCisgICAgJWVuZHJlcAorJWVuZG1hY3JvCisKKyVtYWNybyBTV0FQX0lOVEVSTkFMX05BTUUgMi0qCisgICAgJXhkZWZpbmUgJSVhcmdzIG5uICUrICUxCisgICAgJXJlcCAlMC0xCisgICAgICAgICV4ZGVmaW5lICUlYXJncyAlJWFyZ3MsIG5uICUrICUyCisgICAgJXJvdGF0ZSAxCisgICAgJWVuZHJlcAorICAgIFNXQVBfSU5URVJOQUxfTlVNICUlYXJncworJWVuZG1hY3JvCisKKzsgSWYgU0FWRV9NTV9QRVJNVVRBVElPTiBpcyBwbGFjZWQgYXQgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uLCB0aGVuIGFueSBsYXRlcgorOyBjYWxscyB0byB0aGF0IGZ1bmN0aW9uIHdpbGwgYXV0b21hdGljYWxseSBsb2FkIHRoZSBwZXJtdXRhdGlvbiwgc28gdmFsdWVzIGNhbgorOyBiZSByZXR1cm5lZCBpbiBtbXJlZ3MuCislbWFjcm8gU0FWRV9NTV9QRVJNVVRBVElPTiAwLTEKKyAgICAlaWYgJTAKKyAgICAgICAgJXhkZWZpbmUgJSVmICUxX20KKyAgICAlZWxzZQorICAgICAgICAleGRlZmluZSAlJWYgY3VycmVudF9mdW5jdGlvbiAlKyBfbQorICAgICVlbmRpZgorICAgICVhc3NpZ24gJSVpIDAKKyAgICAlcmVwIG51bV9tbXJlZ3MKKyAgICAgICAgQ0FUX1hERUZJTkUgJSVmLCAlJWksIG0gJSsgJSVpCisgICAgJWFzc2lnbiAlJWkgJSVpKzEKKyAgICAlZW5kcmVwCislZW5kbWFjcm8KKworJW1hY3JvIExPQURfTU1fUEVSTVVUQVRJT04gMSA7IG5hbWUgdG8gbG9hZCBmcm9tCisgICAgJWlmZGVmICUxX20wCisgICAgICAgICVhc3NpZ24gJSVpIDAKKyAgICAgICAgJXJlcCBudW1fbW1yZWdzCisgICAgICAgICAgICBDQVRfWERFRklORSBtLCAlJWksICUxX20gJSsgJSVpCisgICAgICAgICAgICBDQVRfWERFRklORSBubiwgbSAlKyAlJWksICUlaQorICAgICAgICAlYXNzaWduICUlaSAlJWkrMQorICAgICAgICAlZW5kcmVwCisgICAgJWVuZGlmCislZW5kbWFjcm8KKworOyBBcHBlbmQgY3B1ZmxhZ3MgdG8gdGhlIGNhbGxlZSdzIG5hbWUgaWZmIHRoZSBhcHBlbmRlZCBuYW1lIGlzIGtub3duIGFuZCB0aGUgcGxhaW4gbmFtZSBpc24ndAorJW1hY3JvIGNhbGwgMQorICAgIGNhbGxfaW50ZXJuYWwgJTEgJSsgU1VGRklYLCAlMQorJWVuZG1hY3JvCislbWFjcm8gY2FsbF9pbnRlcm5hbCAyCisgICAgJXhkZWZpbmUgJSVpICUyCisgICAgJWlmbmRlZiBjZ2xvYmFsZWRfJTIKKyAgICAgICAgJWlmZGVmIGNnbG9iYWxlZF8lMQorICAgICAgICAgICAgJXhkZWZpbmUgJSVpICUxCisgICAgICAgICVlbmRpZgorICAgICVlbmRpZgorICAgIGNhbGwgJSVpCisgICAgTE9BRF9NTV9QRVJNVVRBVElPTiAlJWkKKyVlbmRtYWNybworCis7IFN1YnN0aXR1dGlvbnMgdGhhdCByZWR1Y2UgaW5zdHJ1Y3Rpb24gc2l6ZSBidXQgYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50CislbWFjcm8gYWRkIDIKKyAgICAlaWZudW0gJTIKKyAgICAgICAgJWlmICUyPT0xMjgKKyAgICAgICAgICAgIHN1YiAlMSwgLTEyOAorICAgICAgICAlZWxzZQorICAgICAgICAgICAgYWRkICUxLCAlMgorICAgICAgICAlZW5kaWYKKyAgICAlZWxzZQorICAgICAgICBhZGQgJTEsICUyCisgICAgJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIHN1YiAyCisgICAgJWlmbnVtICUyCisgICAgICAgICVpZiAlMj09MTI4CisgICAgICAgICAgICBhZGQgJTEsIC0xMjgKKyAgICAgICAgJWVsc2UKKyAgICAgICAgICAgIHN1YiAlMSwgJTIKKyAgICAgICAgJWVuZGlmCisgICAgJWVsc2UKKyAgICAgICAgc3ViICUxLCAlMgorICAgICVlbmRpZgorJWVuZG1hY3JvCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyBBVlggYWJzdHJhY3Rpb24gbGF5ZXIKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCislYXNzaWduIGkgMAorJXJlcCAxNgorICAgICVpZiBpIDwgOAorICAgICAgICBDQVRfWERFRklORSBzaXplb2ZtbSwgaSwgOAorICAgICVlbmRpZgorICAgIENBVF9YREVGSU5FIHNpemVvZnhtbSwgaSwgMTYKKyAgICBDQVRfWERFRklORSBzaXplb2Z5bW0sIGksIDMyCislYXNzaWduIGkgaSsxCislZW5kcmVwCisldW5kZWYgaQorCislbWFjcm8gQ0hFQ0tfQVZYX0lOU1RSX0VNVSAzLSoKKyAgICAleGRlZmluZSAlJW9wY29kZSAlMQorICAgICV4ZGVmaW5lICUlZHN0ICUyCisgICAgJXJlcCAlMC0yCisgICAgICAgICVpZmlkbiAlJWRzdCwgJTMKKyAgICAgICAgICAgICVlcnJvciBub24tYXZ4IGVtdWxhdGlvbiBvZiBgYCUlb3Bjb2RlJycgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAlZW5kaWYKKyAgICAgICAgJXJvdGF0ZSAxCisgICAgJWVuZHJlcAorJWVuZG1hY3JvCisKKzslMSA9PSBpbnN0cnVjdGlvbgorOyUyID09IDEgaWYgZmxvYXQsIDAgaWYgaW50Cis7JTMgPT0gMSBpZiBub24tZGVzdHJ1Y3RpdmUgb3IgNC1vcGVyYW5kICh4bW0sIHhtbSwgeG1tLCBpbW0pLCAwIG90aGVyd2lzZQorOyU0ID09IDEgaWYgY29tbXV0YXRpdmUgKGkuZS4gZG9lc24ndCBtYXR0ZXIgd2hpY2ggc3JjIGFyZyBpcyB3aGljaCksIDAgaWYgbm90Cis7JTUrOiBvcGVyYW5kcworJW1hY3JvIFJVTl9BVlhfSU5TVFIgNS04KworICAgICVpZm51bSBzaXplb2YlNgorICAgICAgICAlYXNzaWduIF9fc2l6ZW9mcmVnIHNpemVvZiU2CisgICAgJWVsaWZudW0gc2l6ZW9mJTUKKyAgICAgICAgJWFzc2lnbiBfX3NpemVvZnJlZyBzaXplb2YlNQorICAgICVlbHNlCisgICAgICAgICVhc3NpZ24gX19zaXplb2ZyZWcgbW1zaXplCisgICAgJWVuZGlmCisgICAgJWFzc2lnbiBfX2VtdWxhdGVfYXZ4IDAKKyAgICAlaWYgYXZ4X2VuYWJsZWQgJiYgX19zaXplb2ZyZWcgPj0gMTYKKyAgICAgICAgJXhkZWZpbmUgX19pbnN0ciB2JTEKKyAgICAlZWxzZQorICAgICAgICAleGRlZmluZSBfX2luc3RyICUxCisgICAgICAgICVpZiAlMCA+PSA3KyUzCisgICAgICAgICAgICAlYXNzaWduIF9fZW11bGF0ZV9hdnggMQorICAgICAgICAlZW5kaWYKKyAgICAlZW5kaWYKKworICAgICVpZiBfX2VtdWxhdGVfYXZ4CisgICAgICAgICV4ZGVmaW5lIF9fc3JjMSAlNgorICAgICAgICAleGRlZmluZSBfX3NyYzIgJTcKKyAgICAgICAgJWlmbmlkbiAlNSwgJTYKKyAgICAgICAgICAgICVpZiAlMCA+PSA4CisgICAgICAgICAgICAgICAgQ0hFQ0tfQVZYX0lOU1RSX0VNVSB7JTEgJTUsICU2LCAlNywgJTh9LCAlNSwgJTcsICU4CisgICAgICAgICAgICAlZWxzZQorICAgICAgICAgICAgICAgIENIRUNLX0FWWF9JTlNUUl9FTVUgeyUxICU1LCAlNiwgJTd9LCAlNSwgJTcKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgJWlmICU0ICYmICUzID09IDAKKyAgICAgICAgICAgICAgICAlaWZuaWQgJTcKKyAgICAgICAgICAgICAgICAgICAgOyAzLW9wZXJhbmQgQVZYIGluc3RydWN0aW9ucyB3aXRoIGEgbWVtb3J5IGFyZyBjYW4gb25seSBoYXZlIGl0IGluIHNyYzIsCisgICAgICAgICAgICAgICAgICAgIDsgd2hlcmVhcyBTU0UgZW11bGF0aW9uIHByZWZlcnMgdG8gaGF2ZSBpdCBpbiBzcmMxIChpLmUuIHRoZSBtb3YpLgorICAgICAgICAgICAgICAgICAgICA7IFNvLCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgY29tbXV0YXRpdmUgd2l0aCBhIG1lbW9yeSBhcmcsIHN3YXAgdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgJXhkZWZpbmUgX19zcmMxICU3CisgICAgICAgICAgICAgICAgICAgICV4ZGVmaW5lIF9fc3JjMiAlNgorICAgICAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICAlaWYgX19zaXplb2ZyZWcgPT0gOAorICAgICAgICAgICAgICAgIE1PVlEgJTUsIF9fc3JjMQorICAgICAgICAgICAgJWVsaWYgJTIKKyAgICAgICAgICAgICAgICBNT1ZBUFMgJTUsIF9fc3JjMQorICAgICAgICAgICAgJWVsc2UKKyAgICAgICAgICAgICAgICBNT1ZEUUEgJTUsIF9fc3JjMQorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICVlbmRpZgorICAgICAgICAlaWYgJTAgPj0gOAorICAgICAgICAgICAgJTEgJTUsIF9fc3JjMiwgJTgKKyAgICAgICAgJWVsc2UKKyAgICAgICAgICAgICUxICU1LCBfX3NyYzIKKyAgICAgICAgJWVuZGlmCisgICAgJWVsaWYgJTAgPj0gOAorICAgICAgICBfX2luc3RyICU1LCAlNiwgJTcsICU4CisgICAgJWVsaWYgJTAgPT0gNworICAgICAgICBfX2luc3RyICU1LCAlNiwgJTcKKyAgICAlZWxpZiAlMCA9PSA2CisgICAgICAgIF9faW5zdHIgJTUsICU2CisgICAgJWVsc2UKKyAgICAgICAgX19pbnN0ciAlNQorICAgICVlbmRpZgorJWVuZG1hY3JvCisKKzslMSA9PSBpbnN0cnVjdGlvbgorOyUyID09IDEgaWYgZmxvYXQsIDAgaWYgaW50Cis7JTMgPT0gMSBpZiBub24tZGVzdHJ1Y3RpdmUgb3IgNC1vcGVyYW5kICh4bW0sIHhtbSwgeG1tLCBpbW0pLCAwIG90aGVyd2lzZQorOyU0ID09IDEgaWYgY29tbXV0YXRpdmUgKGkuZS4gZG9lc24ndCBtYXR0ZXIgd2hpY2ggc3JjIGFyZyBpcyB3aGljaCksIDAgaWYgbm90CislbWFjcm8gQVZYX0lOU1RSIDEtNCAwLCAxLCAwCisgICAgJW1hY3JvICUxIDEtOSBmbm9yZCwgZm5vcmQsIGZub3JkLCBmbm9yZCwgJTEsICUyLCAlMywgJTQKKyAgICAgICAgJWlmaWRuICUyLCBmbm9yZAorICAgICAgICAgICAgUlVOX0FWWF9JTlNUUiAlNiwgJTcsICU4LCAlOSwgJTEKKyAgICAgICAgJWVsaWZpZG4gJTMsIGZub3JkCisgICAgICAgICAgICBSVU5fQVZYX0lOU1RSICU2LCAlNywgJTgsICU5LCAlMSwgJTIKKyAgICAgICAgJWVsaWZpZG4gJTQsIGZub3JkCisgICAgICAgICAgICBSVU5fQVZYX0lOU1RSICU2LCAlNywgJTgsICU5LCAlMSwgJTIsICUzCisgICAgICAgICVlbGlmaWRuICU1LCBmbm9yZAorICAgICAgICAgICAgUlVOX0FWWF9JTlNUUiAlNiwgJTcsICU4LCAlOSwgJTEsICUyLCAlMywgJTQKKyAgICAgICAgJWVsc2UKKyAgICAgICAgICAgIFJVTl9BVlhfSU5TVFIgJTYsICU3LCAlOCwgJTksICUxLCAlMiwgJTMsICU0LCAlNQorICAgICAgICAlZW5kaWYKKyAgICAlZW5kbWFjcm8KKyVlbmRtYWNybworCis7IEluc3RydWN0aW9ucyB3aXRoIGJvdGggVkVYIGFuZCBub24tVkVYIGVuY29kaW5ncworOyBOb24tZGVzdHJ1Y3RpdmUgaW5zdHJ1Y3Rpb25zIGFyZSB3cml0dGVuIHdpdGhvdXQgcGFyYW1ldGVycworQVZYX0lOU1RSIGFkZHBkLCAxLCAwLCAxCitBVlhfSU5TVFIgYWRkcHMsIDEsIDAsIDEKK0FWWF9JTlNUUiBhZGRzZCwgMSwgMCwgMQorQVZYX0lOU1RSIGFkZHNzLCAxLCAwLCAxCitBVlhfSU5TVFIgYWRkc3VicGQsIDEsIDAsIDAKK0FWWF9JTlNUUiBhZGRzdWJwcywgMSwgMCwgMAorQVZYX0lOU1RSIGFlc2RlYywgMCwgMCwgMAorQVZYX0lOU1RSIGFlc2RlY2xhc3QsIDAsIDAsIDAKK0FWWF9JTlNUUiBhZXNlbmMsIDAsIDAsIDAKK0FWWF9JTlNUUiBhZXNlbmNsYXN0LCAwLCAwLCAwCitBVlhfSU5TVFIgYWVzaW1jCitBVlhfSU5TVFIgYWVza2V5Z2VuYXNzaXN0CitBVlhfSU5TVFIgYW5kbnBkLCAxLCAwLCAwCitBVlhfSU5TVFIgYW5kbnBzLCAxLCAwLCAwCitBVlhfSU5TVFIgYW5kcGQsIDEsIDAsIDEKK0FWWF9JTlNUUiBhbmRwcywgMSwgMCwgMQorQVZYX0lOU1RSIGJsZW5kcGQsIDEsIDAsIDAKK0FWWF9JTlNUUiBibGVuZHBzLCAxLCAwLCAwCitBVlhfSU5TVFIgYmxlbmR2cGQsIDEsIDAsIDAKK0FWWF9JTlNUUiBibGVuZHZwcywgMSwgMCwgMAorQVZYX0lOU1RSIGNtcHBkLCAxLCAxLCAwCitBVlhfSU5TVFIgY21wcHMsIDEsIDEsIDAKK0FWWF9JTlNUUiBjbXBzZCwgMSwgMSwgMAorQVZYX0lOU1RSIGNtcHNzLCAxLCAxLCAwCitBVlhfSU5TVFIgY29taXNkCitBVlhfSU5TVFIgY29taXNzCitBVlhfSU5TVFIgY3Z0ZHEycGQKK0FWWF9JTlNUUiBjdnRkcTJwcworQVZYX0lOU1RSIGN2dHBkMmRxCitBVlhfSU5TVFIgY3Z0cGQycHMKK0FWWF9JTlNUUiBjdnRwczJkcQorQVZYX0lOU1RSIGN2dHBzMnBkCitBVlhfSU5TVFIgY3Z0c2Qyc2kKK0FWWF9JTlNUUiBjdnRzZDJzcworQVZYX0lOU1RSIGN2dHNpMnNkCitBVlhfSU5TVFIgY3Z0c2kyc3MKK0FWWF9JTlNUUiBjdnRzczJzZAorQVZYX0lOU1RSIGN2dHNzMnNpCitBVlhfSU5TVFIgY3Z0dHBkMmRxCitBVlhfSU5TVFIgY3Z0dHBzMmRxCitBVlhfSU5TVFIgY3Z0dHNkMnNpCitBVlhfSU5TVFIgY3Z0dHNzMnNpCitBVlhfSU5TVFIgZGl2cGQsIDEsIDAsIDAKK0FWWF9JTlNUUiBkaXZwcywgMSwgMCwgMAorQVZYX0lOU1RSIGRpdnNkLCAxLCAwLCAwCitBVlhfSU5TVFIgZGl2c3MsIDEsIDAsIDAKK0FWWF9JTlNUUiBkcHBkLCAxLCAxLCAwCitBVlhfSU5TVFIgZHBwcywgMSwgMSwgMAorQVZYX0lOU1RSIGV4dHJhY3RwcworQVZYX0lOU1RSIGhhZGRwZCwgMSwgMCwgMAorQVZYX0lOU1RSIGhhZGRwcywgMSwgMCwgMAorQVZYX0lOU1RSIGhzdWJwZCwgMSwgMCwgMAorQVZYX0lOU1RSIGhzdWJwcywgMSwgMCwgMAorQVZYX0lOU1RSIGluc2VydHBzLCAxLCAxLCAwCitBVlhfSU5TVFIgbGRkcXUKK0FWWF9JTlNUUiBsZG14Y3NyCitBVlhfSU5TVFIgbWFza21vdmRxdQorQVZYX0lOU1RSIG1heHBkLCAxLCAwLCAxCitBVlhfSU5TVFIgbWF4cHMsIDEsIDAsIDEKK0FWWF9JTlNUUiBtYXhzZCwgMSwgMCwgMQorQVZYX0lOU1RSIG1heHNzLCAxLCAwLCAxCitBVlhfSU5TVFIgbWlucGQsIDEsIDAsIDEKK0FWWF9JTlNUUiBtaW5wcywgMSwgMCwgMQorQVZYX0lOU1RSIG1pbnNkLCAxLCAwLCAxCitBVlhfSU5TVFIgbWluc3MsIDEsIDAsIDEKK0FWWF9JTlNUUiBtb3ZhcGQKK0FWWF9JTlNUUiBtb3ZhcHMKK0FWWF9JTlNUUiBtb3ZkCitBVlhfSU5TVFIgbW92ZGR1cAorQVZYX0lOU1RSIG1vdmRxYQorQVZYX0lOU1RSIG1vdmRxdQorQVZYX0lOU1RSIG1vdmhscHMsIDEsIDAsIDAKK0FWWF9JTlNUUiBtb3ZocGQsIDEsIDAsIDAKK0FWWF9JTlNUUiBtb3ZocHMsIDEsIDAsIDAKK0FWWF9JTlNUUiBtb3ZsaHBzLCAxLCAwLCAwCitBVlhfSU5TVFIgbW92bHBkLCAxLCAwLCAwCitBVlhfSU5TVFIgbW92bHBzLCAxLCAwLCAwCitBVlhfSU5TVFIgbW92bXNrcGQKK0FWWF9JTlNUUiBtb3Ztc2twcworQVZYX0lOU1RSIG1vdm50ZHEKK0FWWF9JTlNUUiBtb3ZudGRxYQorQVZYX0lOU1RSIG1vdm50cGQKK0FWWF9JTlNUUiBtb3ZudHBzCitBVlhfSU5TVFIgbW92cQorQVZYX0lOU1RSIG1vdnNkLCAxLCAwLCAwCitBVlhfSU5TVFIgbW92c2hkdXAKK0FWWF9JTlNUUiBtb3ZzbGR1cAorQVZYX0lOU1RSIG1vdnNzLCAxLCAwLCAwCitBVlhfSU5TVFIgbW92dXBkCitBVlhfSU5TVFIgbW92dXBzCitBVlhfSU5TVFIgbXBzYWRidywgMCwgMSwgMAorQVZYX0lOU1RSIG11bHBkLCAxLCAwLCAxCitBVlhfSU5TVFIgbXVscHMsIDEsIDAsIDEKK0FWWF9JTlNUUiBtdWxzZCwgMSwgMCwgMQorQVZYX0lOU1RSIG11bHNzLCAxLCAwLCAxCitBVlhfSU5TVFIgb3JwZCwgMSwgMCwgMQorQVZYX0lOU1RSIG9ycHMsIDEsIDAsIDEKK0FWWF9JTlNUUiBwYWJzYgorQVZYX0lOU1RSIHBhYnNkCitBVlhfSU5TVFIgcGFic3cKK0FWWF9JTlNUUiBwYWNrc3N3YiwgMCwgMCwgMAorQVZYX0lOU1RSIHBhY2tzc2R3LCAwLCAwLCAwCitBVlhfSU5TVFIgcGFja3Vzd2IsIDAsIDAsIDAKK0FWWF9JTlNUUiBwYWNrdXNkdywgMCwgMCwgMAorQVZYX0lOU1RSIHBhZGRiLCAwLCAwLCAxCitBVlhfSU5TVFIgcGFkZHcsIDAsIDAsIDEKK0FWWF9JTlNUUiBwYWRkZCwgMCwgMCwgMQorQVZYX0lOU1RSIHBhZGRxLCAwLCAwLCAxCitBVlhfSU5TVFIgcGFkZHNiLCAwLCAwLCAxCitBVlhfSU5TVFIgcGFkZHN3LCAwLCAwLCAxCitBVlhfSU5TVFIgcGFkZHVzYiwgMCwgMCwgMQorQVZYX0lOU1RSIHBhZGR1c3csIDAsIDAsIDEKK0FWWF9JTlNUUiBwYWxpZ25yLCAwLCAxLCAwCitBVlhfSU5TVFIgcGFuZCwgMCwgMCwgMQorQVZYX0lOU1RSIHBhbmRuLCAwLCAwLCAwCitBVlhfSU5TVFIgcGF2Z2IsIDAsIDAsIDEKK0FWWF9JTlNUUiBwYXZndywgMCwgMCwgMQorQVZYX0lOU1RSIHBibGVuZHZiLCAwLCAwLCAwCitBVlhfSU5TVFIgcGJsZW5kdywgMCwgMSwgMAorQVZYX0lOU1RSIHBjbG11bHFkcSwgMCwgMSwgMAorQVZYX0lOU1RSIHBjbXBlc3RyaQorQVZYX0lOU1RSIHBjbXBlc3RybQorQVZYX0lOU1RSIHBjbXBpc3RyaQorQVZYX0lOU1RSIHBjbXBpc3RybQorQVZYX0lOU1RSIHBjbXBlcWIsIDAsIDAsIDEKK0FWWF9JTlNUUiBwY21wZXF3LCAwLCAwLCAxCitBVlhfSU5TVFIgcGNtcGVxZCwgMCwgMCwgMQorQVZYX0lOU1RSIHBjbXBlcXEsIDAsIDAsIDEKK0FWWF9JTlNUUiBwY21wZ3RiLCAwLCAwLCAwCitBVlhfSU5TVFIgcGNtcGd0dywgMCwgMCwgMAorQVZYX0lOU1RSIHBjbXBndGQsIDAsIDAsIDAKK0FWWF9JTlNUUiBwY21wZ3RxLCAwLCAwLCAwCitBVlhfSU5TVFIgcGV4dHJiCitBVlhfSU5TVFIgcGV4dHJkCitBVlhfSU5TVFIgcGV4dHJxCitBVlhfSU5TVFIgcGV4dHJ3CitBVlhfSU5TVFIgcGhhZGR3LCAwLCAwLCAwCitBVlhfSU5TVFIgcGhhZGRkLCAwLCAwLCAwCitBVlhfSU5TVFIgcGhhZGRzdywgMCwgMCwgMAorQVZYX0lOU1RSIHBobWlucG9zdXcKK0FWWF9JTlNUUiBwaHN1YncsIDAsIDAsIDAKK0FWWF9JTlNUUiBwaHN1YmQsIDAsIDAsIDAKK0FWWF9JTlNUUiBwaHN1YnN3LCAwLCAwLCAwCitBVlhfSU5TVFIgcGluc3JiLCAwLCAxLCAwCitBVlhfSU5TVFIgcGluc3JkLCAwLCAxLCAwCitBVlhfSU5TVFIgcGluc3JxLCAwLCAxLCAwCitBVlhfSU5TVFIgcGluc3J3LCAwLCAxLCAwCitBVlhfSU5TVFIgcG1hZGR3ZCwgMCwgMCwgMQorQVZYX0lOU1RSIHBtYWRkdWJzdywgMCwgMCwgMAorQVZYX0lOU1RSIHBtYXhzYiwgMCwgMCwgMQorQVZYX0lOU1RSIHBtYXhzdywgMCwgMCwgMQorQVZYX0lOU1RSIHBtYXhzZCwgMCwgMCwgMQorQVZYX0lOU1RSIHBtYXh1YiwgMCwgMCwgMQorQVZYX0lOU1RSIHBtYXh1dywgMCwgMCwgMQorQVZYX0lOU1RSIHBtYXh1ZCwgMCwgMCwgMQorQVZYX0lOU1RSIHBtaW5zYiwgMCwgMCwgMQorQVZYX0lOU1RSIHBtaW5zdywgMCwgMCwgMQorQVZYX0lOU1RSIHBtaW5zZCwgMCwgMCwgMQorQVZYX0lOU1RSIHBtaW51YiwgMCwgMCwgMQorQVZYX0lOU1RSIHBtaW51dywgMCwgMCwgMQorQVZYX0lOU1RSIHBtaW51ZCwgMCwgMCwgMQorQVZYX0lOU1RSIHBtb3Ztc2tiCitBVlhfSU5TVFIgcG1vdnN4YncKK0FWWF9JTlNUUiBwbW92c3hiZAorQVZYX0lOU1RSIHBtb3ZzeGJxCitBVlhfSU5TVFIgcG1vdnN4d2QKK0FWWF9JTlNUUiBwbW92c3h3cQorQVZYX0lOU1RSIHBtb3ZzeGRxCitBVlhfSU5TVFIgcG1vdnp4YncKK0FWWF9JTlNUUiBwbW92enhiZAorQVZYX0lOU1RSIHBtb3Z6eGJxCitBVlhfSU5TVFIgcG1vdnp4d2QKK0FWWF9JTlNUUiBwbW92enh3cQorQVZYX0lOU1RSIHBtb3Z6eGRxCitBVlhfSU5TVFIgcG11bGRxLCAwLCAwLCAxCitBVlhfSU5TVFIgcG11bGhyc3csIDAsIDAsIDEKK0FWWF9JTlNUUiBwbXVsaHV3LCAwLCAwLCAxCitBVlhfSU5TVFIgcG11bGh3LCAwLCAwLCAxCitBVlhfSU5TVFIgcG11bGx3LCAwLCAwLCAxCitBVlhfSU5TVFIgcG11bGxkLCAwLCAwLCAxCitBVlhfSU5TVFIgcG11bHVkcSwgMCwgMCwgMQorQVZYX0lOU1RSIHBvciwgMCwgMCwgMQorQVZYX0lOU1RSIHBzYWRidywgMCwgMCwgMQorQVZYX0lOU1RSIHBzaHVmYiwgMCwgMCwgMAorQVZYX0lOU1RSIHBzaHVmZAorQVZYX0lOU1RSIHBzaHVmaHcKK0FWWF9JTlNUUiBwc2h1Zmx3CitBVlhfSU5TVFIgcHNpZ25iLCAwLCAwLCAwCitBVlhfSU5TVFIgcHNpZ253LCAwLCAwLCAwCitBVlhfSU5TVFIgcHNpZ25kLCAwLCAwLCAwCitBVlhfSU5TVFIgcHNsbHcsIDAsIDAsIDAKK0FWWF9JTlNUUiBwc2xsZCwgMCwgMCwgMAorQVZYX0lOU1RSIHBzbGxxLCAwLCAwLCAwCitBVlhfSU5TVFIgcHNsbGRxLCAwLCAwLCAwCitBVlhfSU5TVFIgcHNyYXcsIDAsIDAsIDAKK0FWWF9JTlNUUiBwc3JhZCwgMCwgMCwgMAorQVZYX0lOU1RSIHBzcmx3LCAwLCAwLCAwCitBVlhfSU5TVFIgcHNybGQsIDAsIDAsIDAKK0FWWF9JTlNUUiBwc3JscSwgMCwgMCwgMAorQVZYX0lOU1RSIHBzcmxkcSwgMCwgMCwgMAorQVZYX0lOU1RSIHBzdWJiLCAwLCAwLCAwCitBVlhfSU5TVFIgcHN1YncsIDAsIDAsIDAKK0FWWF9JTlNUUiBwc3ViZCwgMCwgMCwgMAorQVZYX0lOU1RSIHBzdWJxLCAwLCAwLCAwCitBVlhfSU5TVFIgcHN1YnNiLCAwLCAwLCAwCitBVlhfSU5TVFIgcHN1YnN3LCAwLCAwLCAwCitBVlhfSU5TVFIgcHN1YnVzYiwgMCwgMCwgMAorQVZYX0lOU1RSIHBzdWJ1c3csIDAsIDAsIDAKK0FWWF9JTlNUUiBwdGVzdAorQVZYX0lOU1RSIHB1bnBja2hidywgMCwgMCwgMAorQVZYX0lOU1RSIHB1bnBja2h3ZCwgMCwgMCwgMAorQVZYX0lOU1RSIHB1bnBja2hkcSwgMCwgMCwgMAorQVZYX0lOU1RSIHB1bnBja2hxZHEsIDAsIDAsIDAKK0FWWF9JTlNUUiBwdW5wY2tsYncsIDAsIDAsIDAKK0FWWF9JTlNUUiBwdW5wY2tsd2QsIDAsIDAsIDAKK0FWWF9JTlNUUiBwdW5wY2tsZHEsIDAsIDAsIDAKK0FWWF9JTlNUUiBwdW5wY2tscWRxLCAwLCAwLCAwCitBVlhfSU5TVFIgcHhvciwgMCwgMCwgMQorQVZYX0lOU1RSIHJjcHBzLCAxLCAwLCAwCitBVlhfSU5TVFIgcmNwc3MsIDEsIDAsIDAKK0FWWF9JTlNUUiByb3VuZHBkCitBVlhfSU5TVFIgcm91bmRwcworQVZYX0lOU1RSIHJvdW5kc2QKK0FWWF9JTlNUUiByb3VuZHNzCitBVlhfSU5TVFIgcnNxcnRwcywgMSwgMCwgMAorQVZYX0lOU1RSIHJzcXJ0c3MsIDEsIDAsIDAKK0FWWF9JTlNUUiBzaHVmcGQsIDEsIDEsIDAKK0FWWF9JTlNUUiBzaHVmcHMsIDEsIDEsIDAKK0FWWF9JTlNUUiBzcXJ0cGQsIDEsIDAsIDAKK0FWWF9JTlNUUiBzcXJ0cHMsIDEsIDAsIDAKK0FWWF9JTlNUUiBzcXJ0c2QsIDEsIDAsIDAKK0FWWF9JTlNUUiBzcXJ0c3MsIDEsIDAsIDAKK0FWWF9JTlNUUiBzdG14Y3NyCitBVlhfSU5TVFIgc3VicGQsIDEsIDAsIDAKK0FWWF9JTlNUUiBzdWJwcywgMSwgMCwgMAorQVZYX0lOU1RSIHN1YnNkLCAxLCAwLCAwCitBVlhfSU5TVFIgc3Vic3MsIDEsIDAsIDAKK0FWWF9JTlNUUiB1Y29taXNkCitBVlhfSU5TVFIgdWNvbWlzcworQVZYX0lOU1RSIHVucGNraHBkLCAxLCAwLCAwCitBVlhfSU5TVFIgdW5wY2tocHMsIDEsIDAsIDAKK0FWWF9JTlNUUiB1bnBja2xwZCwgMSwgMCwgMAorQVZYX0lOU1RSIHVucGNrbHBzLCAxLCAwLCAwCitBVlhfSU5TVFIgeG9ycGQsIDEsIDAsIDEKK0FWWF9JTlNUUiB4b3JwcywgMSwgMCwgMQorCis7IDNETm93IGluc3RydWN0aW9ucywgZm9yIHNoYXJpbmcgY29kZSBiZXR3ZWVuIEFWWCwgU1NFIGFuZCAzRE4KK0FWWF9JTlNUUiBwZmFkZCwgMSwgMCwgMQorQVZYX0lOU1RSIHBmc3ViLCAxLCAwLCAwCitBVlhfSU5TVFIgcGZtdWwsIDEsIDAsIDEKKworOyBiYXNlLTQgY29uc3RhbnRzIGZvciBzaHVmZmxlcworJWFzc2lnbiBpIDAKKyVyZXAgMjU2CisgICAgJWFzc2lnbiBqICgoaT4+NikmMykqMTAwMCArICgoaT4+NCkmMykqMTAwICsgKChpPj4yKSYzKSoxMCArIChpJjMpCisgICAgJWlmIGogPCAxMAorICAgICAgICBDQVRfWERFRklORSBxMDAwLCBqLCBpCisgICAgJWVsaWYgaiA8IDEwMAorICAgICAgICBDQVRfWERFRklORSBxMDAsIGosIGkKKyAgICAlZWxpZiBqIDwgMTAwMAorICAgICAgICBDQVRfWERFRklORSBxMCwgaiwgaQorICAgICVlbHNlCisgICAgICAgIENBVF9YREVGSU5FIHEsIGosIGkKKyAgICAlZW5kaWYKKyVhc3NpZ24gaSBpKzEKKyVlbmRyZXAKKyV1bmRlZiBpCisldW5kZWYgagorCis7IHR6Y250IGlzIGVxdWl2YWxlbnQgdG8gInJlcCBic2YiIGFuZCBpcyBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoIGJzZi4KKzsgVGhpcyBsZXRzIHVzIHVzZSB0emNudCB3aXRob3V0IGJ1bXBpbmcgdGhlIHlhc20gdmVyc2lvbiByZXF1aXJlbWVudCB5ZXQuCislZGVmaW5lIHR6Y250IHJlcCBic2YKKworOyBjb252ZXJ0IEZNQTQgdG8gRk1BMyBpZiBwb3NzaWJsZQorJW1hY3JvIEZNQTRfSU5TVFIgNAorICAgICVtYWNybyAlMSA0LTggJTEsICUyLCAlMywgJTQKKyAgICAgICAgJWlmIGNwdWZsYWcoZm1hNCkKKyAgICAgICAgICAgIHYlNSAlMSwgJTIsICUzLCAlNAorICAgICAgICAlZWxpZmlkbiAlMSwgJTIKKyAgICAgICAgICAgIHYlNiAlMSwgJTQsICUzIDsgJTEgPSAlMSAqICUzICsgJTQKKyAgICAgICAgJWVsaWZpZG4gJTEsICUzCisgICAgICAgICAgICB2JTcgJTEsICUyLCAlNCA7ICUxID0gJTIgKiAlMSArICU0CisgICAgICAgICVlbGlmaWRuICUxLCAlNAorICAgICAgICAgICAgdiU4ICUxLCAlMiwgJTMgOyAlMSA9ICUyICogJTMgKyAlMQorICAgICAgICAlZWxzZQorICAgICAgICAgICAgJWVycm9yIGZtYTMgZW11bGF0aW9uIG9mIGBgJTUgJTEsICUyLCAlMywgJTQnJyBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICVlbmRpZgorICAgICVlbmRtYWNybworJWVuZG1hY3JvCisKK0ZNQTRfSU5TVFIgZm1hZGRwZCwgZm1hZGQxMzJwZCwgZm1hZGQyMTNwZCwgZm1hZGQyMzFwZAorRk1BNF9JTlNUUiBmbWFkZHBzLCBmbWFkZDEzMnBzLCBmbWFkZDIxM3BzLCBmbWFkZDIzMXBzCitGTUE0X0lOU1RSIGZtYWRkc2QsIGZtYWRkMTMyc2QsIGZtYWRkMjEzc2QsIGZtYWRkMjMxc2QKK0ZNQTRfSU5TVFIgZm1hZGRzcywgZm1hZGQxMzJzcywgZm1hZGQyMTNzcywgZm1hZGQyMzFzcworCitGTUE0X0lOU1RSIGZtYWRkc3VicGQsIGZtYWRkc3ViMTMycGQsIGZtYWRkc3ViMjEzcGQsIGZtYWRkc3ViMjMxcGQKK0ZNQTRfSU5TVFIgZm1hZGRzdWJwcywgZm1hZGRzdWIxMzJwcywgZm1hZGRzdWIyMTNwcywgZm1hZGRzdWIyMzFwcworRk1BNF9JTlNUUiBmbXN1YmFkZHBkLCBmbXN1YmFkZDEzMnBkLCBmbXN1YmFkZDIxM3BkLCBmbXN1YmFkZDIzMXBkCitGTUE0X0lOU1RSIGZtc3ViYWRkcHMsIGZtc3ViYWRkMTMycHMsIGZtc3ViYWRkMjEzcHMsIGZtc3ViYWRkMjMxcHMKKworRk1BNF9JTlNUUiBmbXN1YnBkLCBmbXN1YjEzMnBkLCBmbXN1YjIxM3BkLCBmbXN1YjIzMXBkCitGTUE0X0lOU1RSIGZtc3VicHMsIGZtc3ViMTMycHMsIGZtc3ViMjEzcHMsIGZtc3ViMjMxcHMKK0ZNQTRfSU5TVFIgZm1zdWJzZCwgZm1zdWIxMzJzZCwgZm1zdWIyMTNzZCwgZm1zdWIyMzFzZAorRk1BNF9JTlNUUiBmbXN1YnNzLCBmbXN1YjEzMnNzLCBmbXN1YjIxM3NzLCBmbXN1YjIzMXNzCisKK0ZNQTRfSU5TVFIgZm5tYWRkcGQsIGZubWFkZDEzMnBkLCBmbm1hZGQyMTNwZCwgZm5tYWRkMjMxcGQKK0ZNQTRfSU5TVFIgZm5tYWRkcHMsIGZubWFkZDEzMnBzLCBmbm1hZGQyMTNwcywgZm5tYWRkMjMxcHMKK0ZNQTRfSU5TVFIgZm5tYWRkc2QsIGZubWFkZDEzMnNkLCBmbm1hZGQyMTNzZCwgZm5tYWRkMjMxc2QKK0ZNQTRfSU5TVFIgZm5tYWRkc3MsIGZubWFkZDEzMnNzLCBmbm1hZGQyMTNzcywgZm5tYWRkMjMxc3MKKworRk1BNF9JTlNUUiBmbm1zdWJwZCwgZm5tc3ViMTMycGQsIGZubXN1YjIxM3BkLCBmbm1zdWIyMzFwZAorRk1BNF9JTlNUUiBmbm1zdWJwcywgZm5tc3ViMTMycHMsIGZubXN1YjIxM3BzLCBmbm1zdWIyMzFwcworRk1BNF9JTlNUUiBmbm1zdWJzZCwgZm5tc3ViMTMyc2QsIGZubXN1YjIxM3NkLCBmbm1zdWIyMzFzZAorRk1BNF9JTlNUUiBmbm1zdWJzcywgZm5tc3ViMTMyc3MsIGZubXN1YjIxM3NzLCBmbm1zdWIyMzFzcworCis7IHdvcmthcm91bmQ6IHZwYnJvYWRjYXN0cSBpcyBicm9rZW4gaW4geDg2XzMyIGR1ZSB0byBhIHlhc20gYnVnCislaWYgQVJDSF9YODZfNjQgPT0gMAorJW1hY3JvIHZwYnJvYWRjYXN0cSAyCislaWYgc2l6ZW9mJTEgPT0gMTYKKyAgICBtb3ZkZHVwICUxLCAlMgorJWVsc2UKKyAgICB2YnJvYWRjYXN0c2QgJTEsICUyCislZW5kaWYKKyVlbmRtYWNybworJWVuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSBiL2ZmbXBlZy9saWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMDJmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbQpAQCAtMCwwICsxLDc3NyBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiB4ODZ1dGlsLmFzbQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCB4MjY0IHByb2plY3QKKzsqCis7KiBBdXRob3JzOiBMb3JlbiBNZXJyaXR0IDxsb3Jlbm1AdS53YXNoaW5ndG9uLmVkdT4KKzsqICAgICAgICAgIEhvbGdlciBMdWJpdHogPGhvbGdlckBsdWJpdHoub3JnPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWRlZmluZSBwcml2YXRlX3ByZWZpeCBmZgorJWRlZmluZSBwdWJsaWNfcHJlZml4ICBhdnByaXYKKyVkZWZpbmUgY3B1ZmxhZ3NfbW14ZXh0IGNwdWZsYWdzX21teDIKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2aW5jLmFzbSIKKworJW1hY3JvIFNCVVRURVJGTFkgNAorJWlmIGF2eF9lbmFibGVkID09IDAKKyAgICBtb3ZhICAgICAgbSU0LCBtJTIKKyAgICBwdW5wY2tsJTEgbSUyLCBtJTMKKyAgICBwdW5wY2toJTEgbSU0LCBtJTMKKyVlbHNlCisgICAgcHVucGNraCUxIG0lNCwgbSUyLCBtJTMKKyAgICBwdW5wY2tsJTEgbSUyLCBtJTMKKyVlbmRpZgorICAgIFNXQVAgJTMsICU0CislZW5kbWFjcm8KKworJW1hY3JvIFNCVVRURVJGTFkyIDQKKyAgICBwdW5wY2tsJTEgbSU0LCBtJTIsIG0lMworICAgIHB1bnBja2glMSBtJTIsIG0lMiwgbSUzCisgICAgU1dBUCAlMiwgJTQsICUzCislZW5kbWFjcm8KKworJW1hY3JvIFNCVVRURVJGTFlQUyAzCisgICAgdW5wY2tscHMgbSUzLCBtJTEsIG0lMgorICAgIHVucGNraHBzIG0lMSwgbSUxLCBtJTIKKyAgICBTV0FQICUxLCAlMywgJTIKKyVlbmRtYWNybworCislbWFjcm8gVFJBTlNQT1NFNHg0QiA1CisgICAgU0JVVFRFUkZMWSBidywgJTEsICUyLCAlNQorICAgIFNCVVRURVJGTFkgYncsICUzLCAlNCwgJTUKKyAgICBTQlVUVEVSRkxZIHdkLCAlMSwgJTMsICU1CisgICAgU0JVVFRFUkZMWSB3ZCwgJTIsICU0LCAlNQorICAgIFNXQVAgJTIsICUzCislZW5kbWFjcm8KKworJW1hY3JvIFRSQU5TUE9TRTR4NFcgNQorICAgIFNCVVRURVJGTFkgd2QsICUxLCAlMiwgJTUKKyAgICBTQlVUVEVSRkxZIHdkLCAlMywgJTQsICU1CisgICAgU0JVVFRFUkZMWSBkcSwgJTEsICUzLCAlNQorICAgIFNCVVRURVJGTFkgZHEsICUyLCAlNCwgJTUKKyAgICBTV0FQICUyLCAlMworJWVuZG1hY3JvCisKKyVtYWNybyBUUkFOU1BPU0UyeDR4NEIgNQorICAgIFNCVVRURVJGTFkgYncsICAlMSwgJTIsICU1CisgICAgU0JVVFRFUkZMWSBidywgICUzLCAlNCwgJTUKKyAgICBTQlVUVEVSRkxZIHdkLCAgJTEsICUzLCAlNQorICAgIFNCVVRURVJGTFkgd2QsICAlMiwgJTQsICU1CisgICAgU0JVVFRFUkZMWSBkcSwgICUxLCAlMiwgJTUKKyAgICBTQlVUVEVSRkxZIGRxLCAgJTMsICU0LCAlNQorJWVuZG1hY3JvCisKKyVtYWNybyBUUkFOU1BPU0UyeDR4NFcgNQorICAgIFNCVVRURVJGTFkgd2QsICAlMSwgJTIsICU1CisgICAgU0JVVFRFUkZMWSB3ZCwgICUzLCAlNCwgJTUKKyAgICBTQlVUVEVSRkxZIGRxLCAgJTEsICUzLCAlNQorICAgIFNCVVRURVJGTFkgZHEsICAlMiwgJTQsICU1CisgICAgU0JVVFRFUkZMWSBxZHEsICUxLCAlMiwgJTUKKyAgICBTQlVUVEVSRkxZIHFkcSwgJTMsICU0LCAlNQorJWVuZG1hY3JvCisKKyVtYWNybyBUUkFOU1BPU0U0eDREIDUKKyAgICBTQlVUVEVSRkxZIGRxLCAgJTEsICUyLCAlNQorICAgIFNCVVRURVJGTFkgZHEsICAlMywgJTQsICU1CisgICAgU0JVVFRFUkZMWSBxZHEsICUxLCAlMywgJTUKKyAgICBTQlVUVEVSRkxZIHFkcSwgJTIsICU0LCAlNQorICAgIFNXQVAgJTIsICUzCislZW5kbWFjcm8KKworOyBpZGVudGljYWwgYmVoYXZpb3IgdG8gVFJBTlNQT1NFNHg0RCwgYnV0IHVzaW5nIFNTRTEgZmxvYXQgb3BzCislbWFjcm8gVFJBTlNQT1NFNHg0UFMgNQorICAgIFNCVVRURVJGTFlQUyAlMSwgJTIsICU1CisgICAgU0JVVFRFUkZMWVBTICUzLCAlNCwgJTUKKyAgICBtb3ZsaHBzIG0lNSwgbSUxLCBtJTMKKyAgICBtb3ZobHBzIG0lMywgbSUxCisgICAgU1dBUCAlNSwgJTEKKyAgICBtb3ZsaHBzIG0lNSwgbSUyLCBtJTQKKyAgICBtb3ZobHBzIG0lNCwgbSUyCisgICAgU1dBUCAlNSwgJTIsICUzCislZW5kbWFjcm8KKworJW1hY3JvIFRSQU5TUE9TRTh4OFcgOS0xMQorJWlmIEFSQ0hfWDg2XzY0CisgICAgU0JVVFRFUkZMWSB3ZCwgICUxLCAlMiwgJTkKKyAgICBTQlVUVEVSRkxZIHdkLCAgJTMsICU0LCAlOQorICAgIFNCVVRURVJGTFkgd2QsICAlNSwgJTYsICU5CisgICAgU0JVVFRFUkZMWSB3ZCwgICU3LCAlOCwgJTkKKyAgICBTQlVUVEVSRkxZIGRxLCAgJTEsICUzLCAlOQorICAgIFNCVVRURVJGTFkgZHEsICAlMiwgJTQsICU5CisgICAgU0JVVFRFUkZMWSBkcSwgICU1LCAlNywgJTkKKyAgICBTQlVUVEVSRkxZIGRxLCAgJTYsICU4LCAlOQorICAgIFNCVVRURVJGTFkgcWRxLCAlMSwgJTUsICU5CisgICAgU0JVVFRFUkZMWSBxZHEsICUyLCAlNiwgJTkKKyAgICBTQlVUVEVSRkxZIHFkcSwgJTMsICU3LCAlOQorICAgIFNCVVRURVJGTFkgcWRxLCAlNCwgJTgsICU5CisgICAgU1dBUCAlMiwgJTUKKyAgICBTV0FQICU0LCAlNworJWVsc2UKKzsgaW46ICBtMC4ubTcsIHVubGVzcyAlMTEgaW4gd2hpY2ggY2FzZSBtNiBpcyBpbiAlOQorOyBvdXQ6IG0wLi5tNywgdW5sZXNzICUxMSBpbiB3aGljaCBjYXNlIG00IGlzIGluICUxMAorOyBzcGlsbHMgaW50byAlOSBhbmQgJTEwCislaWYgJTA8MTEKKyAgICBtb3ZkcWEgJTksIG0lNworJWVuZGlmCisgICAgU0JVVFRFUkZMWSB3ZCwgICUxLCAlMiwgJTcKKyAgICBtb3ZkcWEgJTEwLCBtJTIKKyAgICBtb3ZkcWEgbSU3LCAlOQorICAgIFNCVVRURVJGTFkgd2QsICAlMywgJTQsICUyCisgICAgU0JVVFRFUkZMWSB3ZCwgICU1LCAlNiwgJTIKKyAgICBTQlVUVEVSRkxZIHdkLCAgJTcsICU4LCAlMgorICAgIFNCVVRURVJGTFkgZHEsICAlMSwgJTMsICUyCisgICAgbW92ZHFhICU5LCBtJTMKKyAgICBtb3ZkcWEgbSUyLCAlMTAKKyAgICBTQlVUVEVSRkxZIGRxLCAgJTIsICU0LCAlMworICAgIFNCVVRURVJGTFkgZHEsICAlNSwgJTcsICUzCisgICAgU0JVVFRFUkZMWSBkcSwgICU2LCAlOCwgJTMKKyAgICBTQlVUVEVSRkxZIHFkcSwgJTEsICU1LCAlMworICAgIFNCVVRURVJGTFkgcWRxLCAlMiwgJTYsICUzCisgICAgbW92ZHFhICUxMCwgbSUyCisgICAgbW92ZHFhIG0lMywgJTkKKyAgICBTQlVUVEVSRkxZIHFkcSwgJTMsICU3LCAlMgorICAgIFNCVVRURVJGTFkgcWRxLCAlNCwgJTgsICUyCisgICAgU1dBUCAlMiwgJTUKKyAgICBTV0FQICU0LCAlNworJWlmICUwPDExCisgICAgbW92ZHFhIG0lNSwgJTEwCislZW5kaWYKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgUEFCU1cgbWFjcm8gYXNzdW1lcyAlMSAhPSAlMiwgd2hpbGUgQUJTMS8yIG1hY3JvcyB3b3JrIGluLXBsYWNlCislbWFjcm8gUEFCU1cgMgorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgcGFic3cgICAgICAlMSwgJTIKKyVlbGlmIGNwdWZsYWcobW14ZXh0KQorICAgIHB4b3IgICAgJTEsICUxCisgICAgcHN1YncgICAlMSwgJTIKKyAgICBwbWF4c3cgICUxLCAlMgorJWVsc2UKKyAgICBweG9yICAgICAgICUxLCAlMQorICAgIHBjbXBndHcgICAgJTEsICUyCisgICAgcHhvciAgICAgICAlMiwgJTEKKyAgICBwc3VidyAgICAgICUyLCAlMQorICAgIFNXQVAgICAgICAgJTEsICUyCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gUFNJR05XX01NWCAyCisgICAgcHhvciAgICAgICAlMSwgJTIKKyAgICBwc3VidyAgICAgICUxLCAlMgorJWVuZG1hY3JvCisKKyVtYWNybyBQU0lHTldfU1NTRTMgMgorICAgIHBzaWdudyAgICAgJTEsICUyCislZW5kbWFjcm8KKworJW1hY3JvIEFCUzEgMgorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgcGFic3cgICAlMSwgJTEKKyVlbGlmIGNwdWZsYWcobW14ZXh0KSA7IGEsIHRtcAorICAgIHB4b3IgICAgJTIsICUyCisgICAgcHN1YncgICAlMiwgJTEKKyAgICBwbWF4c3cgICUxLCAlMgorJWVsc2UgOyBhLCB0bXAKKyAgICBweG9yICAgICAgICUyLCAlMgorICAgIHBjbXBndHcgICAgJTIsICUxCisgICAgcHhvciAgICAgICAlMSwgJTIKKyAgICBwc3VidyAgICAgICUxLCAlMgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEFCUzIgNAorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgcGFic3cgICAlMSwgJTEKKyAgICBwYWJzdyAgICUyLCAlMgorJWVsaWYgY3B1ZmxhZyhtbXhleHQpIDsgYSwgYiwgdG1wMCwgdG1wMQorICAgIHB4b3IgICAgJTMsICUzCisgICAgcHhvciAgICAlNCwgJTQKKyAgICBwc3VidyAgICUzLCAlMQorICAgIHBzdWJ3ICAgJTQsICUyCisgICAgcG1heHN3ICAlMSwgJTMKKyAgICBwbWF4c3cgICUyLCAlNAorJWVsc2UgOyBhLCBiLCB0bXAwLCB0bXAxCisgICAgcHhvciAgICAgICAlMywgJTMKKyAgICBweG9yICAgICAgICU0LCAlNAorICAgIHBjbXBndHcgICAgJTMsICUxCisgICAgcGNtcGd0dyAgICAlNCwgJTIKKyAgICBweG9yICAgICAgICUxLCAlMworICAgIHB4b3IgICAgICAgJTIsICU0CisgICAgcHN1YncgICAgICAlMSwgJTMKKyAgICBwc3VidyAgICAgICUyLCAlNAorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEFCU0IgMiA7IHNvdXJjZSBtbXJlZywgdGVtcCBtbXJlZyAodW51c2VkIGZvciBzc3NlMykKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHBhYnNiICAgJTEsICUxCislZWxzZQorICAgIHB4b3IgICAgJTIsICUyCisgICAgcHN1YmIgICAlMiwgJTEKKyAgICBwbWludWIgICUxLCAlMgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIEFCU0IyIDQgOyBzcmMxLCBzcmMyLCB0bXAxLCB0bXAyICh0bXAxLzIgdW51c2VkIGZvciBTU1NFMykKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHBhYnNiICAgJTEsICUxCisgICAgcGFic2IgICAlMiwgJTIKKyVlbHNlCisgICAgcHhvciAgICAlMywgJTMKKyAgICBweG9yICAgICU0LCAlNAorICAgIHBzdWJiICAgJTMsICUxCisgICAgcHN1YmIgICAlNCwgJTIKKyAgICBwbWludWIgICUxLCAlMworICAgIHBtaW51YiAgJTIsICU0CislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gQUJTRDJfTU1YIDQKKyAgICBweG9yICAgICUzLCAlMworICAgIHB4b3IgICAgJTQsICU0CisgICAgcGNtcGd0ZCAlMywgJTEKKyAgICBwY21wZ3RkICU0LCAlMgorICAgIHB4b3IgICAgJTEsICUzCisgICAgcHhvciAgICAlMiwgJTQKKyAgICBwc3ViZCAgICUxLCAlMworICAgIHBzdWJkICAgJTIsICU0CislZW5kbWFjcm8KKworJW1hY3JvIEFCUzQgNgorICAgIEFCUzIgJTEsICUyLCAlNSwgJTYKKyAgICBBQlMyICUzLCAlNCwgJTUsICU2CislZW5kbWFjcm8KKworJW1hY3JvIFNQTEFUQl9MT0FEIDMKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIG1vdmQgICAgICAlMSwgWyUyLTNdCisgICAgcHNodWZiICAgICUxLCAlMworJWVsc2UKKyAgICBtb3ZkICAgICAgJTEsIFslMi0zXSA7dG8gYXZvaWQgY3Jvc3NpbmcgYSBjYWNoZWxpbmUKKyAgICBwdW5wY2tsYncgJTEsICUxCisgICAgU1BMQVRXICAgICUxLCAlMSwgMworJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFNQTEFUQl9SRUcgMworJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92ZCAgICAgICUxLCAlMmQKKyAgICBwc2h1ZmIgICAgJTEsICUzCislZWxzZQorICAgIG1vdmQgICAgICAlMSwgJTJkCisgICAgcHVucGNrbGJ3ICUxLCAlMQorICAgIFNQTEFUVyAgICAlMSwgJTEsIDAKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBIQURERCAyIDsgc3VtIGp1bmsKKyVpZiBzaXplb2YlMSA9PSAzMgorJWRlZmluZSAlMiB4bW0lMgorICAgIHZleHRyYWN0aTEyOCAlMiwgJTEsIDEKKyVkZWZpbmUgJTEgeG1tJTEKKyAgICBwYWRkZCAgICUxLCAlMgorJWVuZGlmCislaWYgbW1zaXplID49IDE2CislaWYgY3B1ZmxhZyh4b3ApICYmIHNpemVvZiUxID09IDE2CisgICAgdnBoYWRkZHEgJTEsICUxCislZW5kaWYKKyAgICBtb3ZobHBzICUyLCAlMQorICAgIHBhZGRkICAgJTEsICUyCislZW5kaWYKKyVpZiBub3RjcHVmbGFnKHhvcCkgfHwgc2l6ZW9mJTEgIT0gMTYKKyVpZiBjcHVmbGFnKG1teGV4dCkKKyAgICBQU0hVRkxXICUyLCAlMSwgcTAwMzIKKyVlbHNlIDsgbW14CisgICAgbW92YSAgICAlMiwgJTEKKyAgICBwc3JscSAgICUyLCAzMgorJWVuZGlmCisgICAgcGFkZGQgICAlMSwgJTIKKyVlbmRpZgorJXVuZGVmICUxCisldW5kZWYgJTIKKyVlbmRtYWNybworCislbWFjcm8gSEFERFcgMiA7IHJlZywgdG1wCislaWYgY3B1ZmxhZyh4b3ApICYmIHNpemVvZiUxID09IDE2CisgICAgdnBoYWRkd3EgICUxLCAlMQorICAgIG1vdmhscHMgICAlMiwgJTEKKyAgICBwYWRkZCAgICAgJTEsICUyCislZWxzZQorICAgIHBtYWRkd2QgJTEsIFtwd18xXQorICAgIEhBREREICAgJTEsICUyCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gUEFMSUdOUiA0LTUKKyVpZiBjcHVmbGFnKHNzc2UzKQorJWlmICUwPT01CisgICAgcGFsaWduciAlMSwgJTIsICUzLCAlNAorJWVsc2UKKyAgICBwYWxpZ25yICUxLCAlMiwgJTMKKyVlbmRpZgorJWVsaWYgY3B1ZmxhZyhtbXgpIDsgW2RzdCxdIHNyYzEsIHNyYzIsIGltbSwgdG1wCisgICAgJWRlZmluZSAlJWRzdCAlMQorJWlmICUwPT01CislaWZuaWRuICUxLCAlMgorICAgIG1vdmEgICAgJSVkc3QsICUyCislZW5kaWYKKyAgICAlcm90YXRlIDEKKyVlbmRpZgorJWlmbmlkbiAlNCwgJTIKKyAgICBtb3ZhICAgICU0LCAlMgorJWVuZGlmCislaWYgbW1zaXplPT04CisgICAgcHNsbHEgICAlJWRzdCwgKDgtJTMpKjgKKyAgICBwc3JscSAgICU0LCAlMyo4CislZWxzZQorICAgIHBzbGxkcSAgJSVkc3QsIDE2LSUzCisgICAgcHNybGRxICAlNCwgJTMKKyVlbmRpZgorICAgIHBvciAgICAgJSVkc3QsICU0CislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gUEFWR0IgMi00CislaWYgY3B1ZmxhZyhtbXhleHQpCisgICAgcGF2Z2IgICAlMSwgJTIKKyVlbGlmIGNwdWZsYWcoM2Rub3cpCisgICAgcGF2Z3VzYiAlMSwgJTIKKyVlbGlmIGNwdWZsYWcobW14KQorICAgIG1vdnUgICAlMywgJTIKKyAgICBwb3IgICAgJTMsICUxCisgICAgcHhvciAgICUxLCAlMgorICAgIHBhbmQgICAlMSwgJTQKKyAgICBwc3JscSAgJTEsIDEKKyAgICBwc3ViYiAgJTMsICUxCisgICAgU1dBUCAgICUxLCAlMworJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFBTSFVGTFcgMSsKKyAgICAlaWYgbW1zaXplID09IDgKKyAgICAgICAgcHNodWZ3ICUxCisgICAgJWVsc2UKKyAgICAgICAgcHNodWZsdyAlMQorICAgICVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBQU1dBUEQgMgorJWlmIGNwdWZsYWcobW14ZXh0KQorICAgIHBzaHVmdyAgICAlMSwgJTIsIHExMDMyCislZWxpZiBjcHVmbGFnKDNkbm93ZXh0KQorICAgIHBzd2FwZCAgICAlMSwgJTIKKyVlbGlmIGNwdWZsYWcoM2Rub3cpCisgICAgbW92cSAgICAgICUxLCAlMgorICAgIHBzcmxxICAgICAlMSwgMzIKKyAgICBwdW5wY2tsZHEgJTEsICUyCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gREVJTlRCIDUgOyBtYXNrLCByZWcxLCBtYXNrLCByZWcyLCBvcHRpb25hbCBzcmMgdG8gZmlsbCBtYXNrcyBmcm9tCislaWZudW0gJTUKKyAgICBwYW5kICAgbSUzLCBtJTUsIG0lNCA7IHNyYyAuLiB5NiAuLiB5NAorICAgIHBhbmQgICBtJTEsIG0lNSwgbSUyIDsgZHN0IC4uIHk2IC4uIHk0CislZWxzZQorICAgIG1vdmEgICBtJTEsICU1CisgICAgcGFuZCAgIG0lMywgbSUxLCBtJTQgOyBzcmMgLi4geTYgLi4geTQKKyAgICBwYW5kICAgbSUxLCBtJTEsIG0lMiA7IGRzdCAuLiB5NiAuLiB5NAorJWVuZGlmCisgICAgcHNybHcgIG0lMiwgOCAgICAgICAgOyBkc3QgLi4geTcgLi4geTUKKyAgICBwc3JsdyAgbSU0LCA4ICAgICAgICA7IHNyYyAuLiB5NyAuLiB5NQorJWVuZG1hY3JvCisKKyVtYWNybyBTVU1TVUJfQkEgMy00CislaWYgJTA9PTMKKyAgICBwYWRkJTEgIG0lMiwgbSUzCisgICAgcGFkZCUxICBtJTMsIG0lMworICAgIHBzdWIlMSAgbSUzLCBtJTIKKyVlbHNlCislaWYgYXZ4X2VuYWJsZWQgPT0gMAorICAgIG1vdmEgICAgbSU0LCBtJTIKKyAgICBwYWRkJTEgIG0lMiwgbSUzCisgICAgcHN1YiUxICBtJTMsIG0lNAorJWVsc2UKKyAgICBwYWRkJTEgIG0lNCwgbSUyLCBtJTMKKyAgICBwc3ViJTEgIG0lMywgbSUyCisgICAgU1dBUCAgICAlMiwgJTQKKyVlbmRpZgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFNVTVNVQl9CQURDIDUtNgorJWlmICUwPT02CisgICAgU1VNU1VCX0JBICUxLCAlMiwgJTMsICU2CisgICAgU1VNU1VCX0JBICUxLCAlNCwgJTUsICU2CislZWxzZQorICAgIHBhZGQlMSAgbSUyLCBtJTMKKyAgICBwYWRkJTEgIG0lNCwgbSU1CisgICAgcGFkZCUxICBtJTMsIG0lMworICAgIHBhZGQlMSAgbSU1LCBtJTUKKyAgICBwc3ViJTEgIG0lMywgbSUyCisgICAgcHN1YiUxICBtJTUsIG0lNAorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFNVTVNVQjJfQUIgNAorJWlmbnVtICUzCisgICAgcHN1YiUxICBtJTQsIG0lMiwgbSUzCisgICAgcHN1YiUxICBtJTQsIG0lMworICAgIHBhZGQlMSAgbSUyLCBtJTIKKyAgICBwYWRkJTEgIG0lMiwgbSUzCislZWxzZQorICAgIG1vdmEgICAgbSU0LCBtJTIKKyAgICBwYWRkJTEgIG0lMiwgbSUyCisgICAgcGFkZCUxICBtJTIsICUzCisgICAgcHN1YiUxICBtJTQsICUzCisgICAgcHN1YiUxICBtJTQsICUzCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gU1VNU1VCMl9CQSA0CislaWYgYXZ4X2VuYWJsZWQgPT0gMAorICAgIG1vdmEgICAgbSU0LCBtJTIKKyAgICBwYWRkJTEgIG0lMiwgbSUzCisgICAgcGFkZCUxICBtJTIsIG0lMworICAgIHBzdWIlMSAgbSUzLCBtJTQKKyAgICBwc3ViJTEgIG0lMywgbSU0CislZWxzZQorICAgIHBhZGQlMSAgbSU0LCBtJTIsIG0lMworICAgIHBhZGQlMSAgbSU0LCBtJTMKKyAgICBwc3ViJTEgIG0lMywgbSUyCisgICAgcHN1YiUxICBtJTMsIG0lMgorICAgIFNXQVAgICAgICUyLCAgJTQKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBTVU1TVUJEMl9BQiA1CislaWZudW0gJTQKKyAgICBwc3JhJTEgIG0lNSwgbSUyLCAxICA7ICUzOiAlMz4+MQorICAgIHBzcmElMSAgbSU0LCBtJTMsIDEgIDsgJTI6ICUyPj4xCisgICAgcGFkZCUxICBtJTQsIG0lMiAgICAgOyAlMzogJTM+PjErJTIKKyAgICBwc3ViJTEgIG0lNSwgbSUzICAgICA7ICUyOiAlMj4+MS0lMworICAgIFNXQVAgICAgICUyLCAlNQorICAgIFNXQVAgICAgICUzLCAlNAorJWVsc2UKKyAgICBtb3ZhICAgICU1LCBtJTIKKyAgICBtb3ZhICAgICU0LCBtJTMKKyAgICBwc3JhJTEgIG0lMywgMSAgOyAlMzogJTM+PjEKKyAgICBwc3JhJTEgIG0lMiwgMSAgOyAlMjogJTI+PjEKKyAgICBwYWRkJTEgIG0lMywgJTUgOyAlMzogJTM+PjErJTIKKyAgICBwc3ViJTEgIG0lMiwgJTQgOyAlMjogJTI+PjEtJTMKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBEQ1Q0XzFEIDUKKyVpZm51bSAlNQorICAgIFNVTVNVQl9CQURDIHcsICU0LCAlMSwgJTMsICUyLCAlNQorICAgIFNVTVNVQl9CQSAgIHcsICUzLCAlNCwgJTUKKyAgICBTVU1TVUIyX0FCICB3LCAlMSwgJTIsICU1CisgICAgU1dBUCAlMSwgJTMsICU0LCAlNSwgJTIKKyVlbHNlCisgICAgU1VNU1VCX0JBREMgdywgJTQsICUxLCAlMywgJTIKKyAgICBTVU1TVUJfQkEgICB3LCAlMywgJTQKKyAgICBtb3ZhICAgICBbJTVdLCBtJTIKKyAgICBTVU1TVUIyX0FCICB3LCAlMSwgWyU1XSwgJTIKKyAgICBTV0FQICUxLCAlMywgJTQsICUyCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gSURDVDRfMUQgNi03CislaWZudW0gJTYKKyAgICBTVU1TVUJEMl9BQiAlMSwgJTMsICU1LCAlNywgJTYKKyAgICA7ICUzOiAlMz4+MS0lNSAlNTogJTMrJTU+PjEKKyAgICBTVU1TVUJfQkEgICAlMSwgJTQsICUyLCAlNworICAgIDsgJTQ6ICUyKyU0ICUyOiAlMi0lNAorICAgIFNVTVNVQl9CQURDICUxLCAlNSwgJTQsICUzLCAlMiwgJTcKKyAgICA7ICU1OiAlMislNCArICglMyslNT4+MSkKKyAgICA7ICU0OiAlMislNCAtICglMyslNT4+MSkKKyAgICA7ICUzOiAlMi0lNCArICglMz4+MS0lNSkKKyAgICA7ICUyOiAlMi0lNCAtICglMz4+MS0lNSkKKyVlbHNlCislaWZpZG4gJTEsIHcKKyAgICBTVU1TVUJEMl9BQiAlMSwgJTMsICU1LCBbJTZdLCBbJTYrMTZdCislZWxzZQorICAgIFNVTVNVQkQyX0FCICUxLCAlMywgJTUsIFslNl0sIFslNiszMl0KKyVlbmRpZgorICAgIFNVTVNVQl9CQSAgICUxLCAlNCwgJTIKKyAgICBTVU1TVUJfQkFEQyAlMSwgJTUsICU0LCAlMywgJTIKKyVlbmRpZgorICAgIFNXQVAgJTIsICU1LCAlNAorICAgIDsgJTI6ICUyKyU0ICsgKCUzKyU1Pj4xKSByb3cwCisgICAgOyAlMzogJTItJTQgKyAoJTM+PjEtJTUpIHJvdzEKKyAgICA7ICU0OiAlMi0lNCAtICglMz4+MS0lNSkgcm93MgorICAgIDsgJTU6ICUyKyU0IC0gKCUzKyU1Pj4xKSByb3czCislZW5kbWFjcm8KKworCislbWFjcm8gTE9BRF9ESUZGIDUKKyVpZmlkbiAlMywgbm9uZQorICAgIG1vdmggICAgICAgJTEsICU0CisgICAgbW92aCAgICAgICAlMiwgJTUKKyAgICBwdW5wY2tsYncgICUxLCAlMgorICAgIHB1bnBja2xidyAgJTIsICUyCisgICAgcHN1YncgICAgICAlMSwgJTIKKyVlbHNlCisgICAgbW92aCAgICAgICAlMSwgJTQKKyAgICBwdW5wY2tsYncgICUxLCAlMworICAgIG1vdmggICAgICAgJTIsICU1CisgICAgcHVucGNrbGJ3ICAlMiwgJTMKKyAgICBwc3VidyAgICAgICUxLCAlMgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFNUT1JFX0RDVCA2CisgICAgbW92cSAgIFslNSslNisgMF0sIG0lMQorICAgIG1vdnEgICBbJTUrJTYrIDhdLCBtJTIKKyAgICBtb3ZxICAgWyU1KyU2KzE2XSwgbSUzCisgICAgbW92cSAgIFslNSslNisyNF0sIG0lNAorICAgIG1vdmhwcyBbJTUrJTYrMzJdLCBtJTEKKyAgICBtb3ZocHMgWyU1KyU2KzQwXSwgbSUyCisgICAgbW92aHBzIFslNSslNis0OF0sIG0lMworICAgIG1vdmhwcyBbJTUrJTYrNTZdLCBtJTQKKyVlbmRtYWNybworCislbWFjcm8gTE9BRF9ESUZGXzh4NFAgNy0xMCByMCxyMiwwIDsgNHggZGVzdCwgMnggdGVtcCwgMnggcG9pbnRlciwgaW5jcmVtZW50PworICAgIExPQURfRElGRiBtJTEsIG0lNSwgbSU3LCBbJThdLCAgICAgIFslOV0KKyAgICBMT0FEX0RJRkYgbSUyLCBtJTYsIG0lNywgWyU4K3IxXSwgICBbJTkrcjNdCisgICAgTE9BRF9ESUZGIG0lMywgbSU1LCBtJTcsIFslOCsyKnIxXSwgWyU5KzIqcjNdCisgICAgTE9BRF9ESUZGIG0lNCwgbSU2LCBtJTcsIFslOCtyNF0sICAgWyU5K3I1XQorJWlmICUxMAorICAgIGxlYSAlOCwgWyU4KzQqcjFdCisgICAgbGVhICU5LCBbJTkrNCpyM10KKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBESUZGeDIgNi03CisgICAgbW92aCAgICAgICAlMywgJTUKKyAgICBwdW5wY2tsYncgICUzLCAlNAorICAgIHBzcmF3ICAgICAgJTEsIDYKKyAgICBwYWRkc3cgICAgICUxLCAlMworICAgIG1vdmggICAgICAgJTMsICU2CisgICAgcHVucGNrbGJ3ICAlMywgJTQKKyAgICBwc3JhdyAgICAgICUyLCA2CisgICAgcGFkZHN3ICAgICAlMiwgJTMKKyAgICBwYWNrdXN3YiAgICUyLCAlMQorJWVuZG1hY3JvCisKKyVtYWNybyBTVE9SRV9ESUZGIDQKKyAgICBtb3ZoICAgICAgICUyLCAlNAorICAgIHB1bnBja2xidyAgJTIsICUzCisgICAgcHNyYXcgICAgICAlMSwgNgorICAgIHBhZGRzdyAgICAgJTEsICUyCisgICAgcGFja3Vzd2IgICAlMSwgJTEKKyAgICBtb3ZoICAgICAgICU0LCAlMQorJWVuZG1hY3JvCisKKyVtYWNybyBTVE9SRV9ESUZGeDIgOCA7IGFkZDEsIGFkZDIsIHJlZzEsIHJlZzIsIHplcm8sIHNoaWZ0LCBzb3VyY2UsIHN0cmlkZQorICAgIG1vdmggICAgICAgJTMsIFslN10KKyAgICBtb3ZoICAgICAgICU0LCBbJTcrJThdCisgICAgcHNyYXcgICAgICAlMSwgJTYKKyAgICBwc3JhdyAgICAgICUyLCAlNgorICAgIHB1bnBja2xidyAgJTMsICU1CisgICAgcHVucGNrbGJ3ICAlNCwgJTUKKyAgICBwYWRkdyAgICAgICUzLCAlMQorICAgIHBhZGR3ICAgICAgJTQsICUyCisgICAgcGFja3Vzd2IgICAlMywgJTUKKyAgICBwYWNrdXN3YiAgICU0LCAlNQorICAgIG1vdmggICAgIFslN10sICUzCisgICAgbW92aCAgWyU3KyU4XSwgJTQKKyVlbmRtYWNybworCislbWFjcm8gUE1JTlVCIDMgOyBkc3QsIHNyYywgaWdub3JlZAorJWlmIGNwdWZsYWcobW14ZXh0KQorICAgIHBtaW51YiAgICUxLCAlMgorJWVsc2UgOyBkc3QsIHNyYywgdG1wCisgICAgbW92YSAgICAgJTMsICUxCisgICAgcHN1YnVzYiAgJTMsICUyCisgICAgcHN1YmIgICAgJTEsICUzCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gU1BMQVRXIDItMyAwCislaWYgY3B1ZmxhZyhhdngyKSAmJiAlMyA9PSAwCisgICAgdnBicm9hZGNhc3R3ICUxLCAlMgorJWVsaWYgbW1zaXplID09IDE2CisgICAgcHNodWZsdyAgICAlMSwgJTIsICglMykqMHg1NQorICAgIHB1bnBja2xxZHEgJTEsICUxCislZWxpZiBjcHVmbGFnKG1teGV4dCkKKyAgICBwc2h1ZncgICAgICUxLCAlMiwgKCUzKSoweDU1CislZWxzZQorICAgICVpZm5pZG4gJTEsICUyCisgICAgICAgIG1vdmEgICAgICAgJTEsICUyCisgICAgJWVuZGlmCisgICAgJWlmICUzICYgMgorICAgICAgICBwdW5wY2tod2QgICUxLCAlMQorICAgICVlbHNlCisgICAgICAgIHB1bnBja2x3ZCAgJTEsICUxCisgICAgJWVuZGlmCisgICAgJWlmICUzICYgMQorICAgICAgICBwdW5wY2tod2QgICUxLCAlMQorICAgICVlbHNlCisgICAgICAgIHB1bnBja2x3ZCAgJTEsICUxCisgICAgJWVuZGlmCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gU1BMQVREIDEKKyVpZiBtbXNpemUgPT0gOAorICAgIHB1bnBja2xkcSAgJTEsICUxCislZWxpZiBjcHVmbGFnKHNzZTIpCisgICAgcHNodWZkICAlMSwgJTEsIDAKKyVlbGlmIGNwdWZsYWcoc3NlKQorICAgIHNodWZwcyAgJTEsICUxLCAwCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gQ0xJUFVCIDMgOyhkc3QsIG1pbiwgbWF4KQorICAgIHBtYXh1YiAlMSwgJTIKKyAgICBwbWludWIgJTEsICUzCislZW5kbWFjcm8KKworJW1hY3JvIENMSVBXIDMgOyhkc3QsIG1pbiwgbWF4KQorICAgIHBtYXhzdyAlMSwgJTIKKyAgICBwbWluc3cgJTEsICUzCislZW5kbWFjcm8KKworJW1hY3JvIFBNSU5TRF9NTVggMyA7IGRzdCwgc3JjLCB0bXAKKyAgICBtb3ZhICAgICAgJTMsICUyCisgICAgcGNtcGd0ZCAgICUzLCAlMQorICAgIHB4b3IgICAgICAlMSwgJTIKKyAgICBwYW5kICAgICAgJTEsICUzCisgICAgcHhvciAgICAgICUxLCAlMgorJWVuZG1hY3JvCisKKyVtYWNybyBQTUFYU0RfTU1YIDMgOyBkc3QsIHNyYywgdG1wCisgICAgbW92YSAgICAgICUzLCAlMQorICAgIHBjbXBndGQgICAlMywgJTIKKyAgICBwYW5kICAgICAgJTEsICUzCisgICAgcGFuZG4gICAgICUzLCAlMgorICAgIHBvciAgICAgICAlMSwgJTMKKyVlbmRtYWNybworCislbWFjcm8gQ0xJUERfTU1YIDMtNCA7IHNyYy9kc3QsIG1pbiwgbWF4LCB0bXAKKyAgICBQTUlOU0RfTU1YICUxLCAlMywgJTQKKyAgICBQTUFYU0RfTU1YICUxLCAlMiwgJTQKKyVlbmRtYWNybworCislbWFjcm8gQ0xJUERfU1NFMiAzLTQgOyBzcmMvZHN0LCBtaW4gKGZsb2F0KSwgbWF4IChmbG9hdCksIHVudXNlZAorICAgIGN2dGRxMnBzICAlMSwgJTEKKyAgICBtaW5wcyAgICAgJTEsICUzCisgICAgbWF4cHMgICAgICUxLCAlMgorICAgIGN2dHBzMmRxICAlMSwgJTEKKyVlbmRtYWNybworCislbWFjcm8gQ0xJUERfU1NFNDEgMy00IDsgIHNyYy9kc3QsIG1pbiwgbWF4LCB1bnVzZWQKKyAgICBwbWluc2QgICUxLCAlMworICAgIHBtYXhzZCAgJTEsICUyCislZW5kbWFjcm8KKworJW1hY3JvIFZCUk9BRENBU1RTUyAyIDsgZHN0IHhtbS95bW0sIHNyYyBtMzIKKyVpZiBjcHVmbGFnKGF2eCkKKyAgICB2YnJvYWRjYXN0c3MgJTEsICUyCislZWxzZSA7IHNzZQorICAgIG1vdnNzICAgICAgICAlMSwgJTIKKyAgICBzaHVmcHMgICAgICAgJTEsICUxLCAwCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gVkJST0FEQ0FTVFNEIDIgOyBkc3QgeG1tL3ltbSwgc3JjIG02NAorJWlmIGNwdWZsYWcoYXZ4KSAmJiBtbXNpemUgPT0gMzIKKyAgICB2YnJvYWRjYXN0c2QgJTEsICUyCislZWxpZiBjcHVmbGFnKHNzZTMpCisgICAgbW92ZGR1cCAgICAgICUxLCAlMgorJWVsc2UgOyBzc2UyCisgICAgbW92c2QgICAgICAgICUxLCAlMgorICAgIG1vdmxocHMgICAgICAlMSwgJTEKKyVlbmRpZgorJWVuZG1hY3JvCisKKyVtYWNybyBTSFVGRkxFX01BU0tfVyA4CisgICAgJXJlcCA4CisgICAgICAgICVpZiAlMT49MHg4MAorICAgICAgICAgICAgZGIgJTEsICUxCisgICAgICAgICVlbHNlCisgICAgICAgICAgICBkYiAlMSoyCisgICAgICAgICAgICBkYiAlMSoyKzEKKyAgICAgICAgJWVuZGlmCisgICAgICAgICVyb3RhdGUgMQorICAgICVlbmRyZXAKKyVlbmRtYWNybworCislbWFjcm8gUE1PVlNYV0QgMjsgZHN0LCBzcmMKKyVpZiBjcHVmbGFnKHNzZTQpCisgICAgcG1vdnN4d2QgICAgICUxLCAlMgorJWVsc2UKKyAgICAlaWZuaWRuICUxLCAlMgorICAgIG1vdmEgICAgICAgICAlMSwgJTIKKyAgICAlZW5kaWYKKyAgICBwdW5wY2tsd2QgICAgJTEsICUxCisgICAgcHNyYWQgICAgICAgICUxLCAxNgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFBNQV9FTVUgNAorICAgICVtYWNybyAlMSA1LTggJTIsICUzLCAlNAorICAgICAgICAlaWYgY3B1ZmxhZyh4b3ApCisgICAgICAgICAgICB2JTYgJTEsICUyLCAlMywgJTQKKyAgICAgICAgJWVsaWZpZG4gJTEsICU0CisgICAgICAgICAgICAlNyAlNSwgJTIsICUzCisgICAgICAgICAgICAlOCAlMSwgJTQsICU1CisgICAgICAgICVlbHNlCisgICAgICAgICAgICAlNyAlMSwgJTIsICUzCisgICAgICAgICAgICAlOCAlMSwgJTQKKyAgICAgICAgJWVuZGlmCisgICAgJWVuZG1hY3JvCislZW5kbWFjcm8KKworUE1BX0VNVSAgUE1BQ1NXVywgIHBtYWNzd3csICBwbXVsbHcsIHBhZGR3CitQTUFfRU1VICBQTUFDU0RELCAgcG1hY3NkZCwgIHBtdWxsZCwgcGFkZGQgOyBzc2U0IGVtdWxhdGlvbgorUE1BX0VNVSBQTUFDU0RRTCwgcG1hY3NkcWwsICBwbXVsZHEsIHBhZGRxIDsgc3NlNCBlbXVsYXRpb24KK1BNQV9FTVUgUE1BRENTV0QsIHBtYWRjc3dkLCBwbWFkZHdkLCBwYWRkZAorCis7IFdyYXBwZXIgZm9yIG5vbi1GTUEgdmVyc2lvbiBvZiBmbWFkZHBzCislbWFjcm8gRk1VTEFERF9QUyA1CisgICAgJWlmIGNwdWZsYWcoZm1hMykgfHwgY3B1ZmxhZyhmbWE0KQorICAgICAgICBmbWFkZHBzICUxLCAlMiwgJTMsICU0CisgICAgJWVsaWZpZG4gJTEsICU0CisgICAgICAgIG11bHBzICAgJTUsICUyLCAlMworICAgICAgICBhZGRwcyAgICUxLCAlNCwgJTUKKyAgICAlZWxzZQorICAgICAgICBtdWxwcyAgICUxLCAlMiwgJTMKKyAgICAgICAgYWRkcHMgICAlMSwgJTQKKyAgICAlZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gTFNISUZUIDIKKyVpZiBtbXNpemUgPiA4CisgICAgcHNsbGRxICAlMSwgJTIKKyVlbHNlCisgICAgcHNsbHEgICAlMSwgOCooJTIpCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gUlNISUZUIDIKKyVpZiBtbXNpemUgPiA4CisgICAgcHNybGRxICAlMSwgJTIKKyVlbHNlCisgICAgcHNybHEgICAlMSwgOCooJTIpCislZW5kaWYKKyVlbmRtYWNybwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYmF2dXRpbC94ODZfY3B1LmggYi9mZm1wZWcvbGliYXZ1dGlsL3g4Nl9jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWMxYzc3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYmF2dXRpbC94ODZfY3B1LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3hnYV9mb250X2RhdGEuYyBiL2ZmbXBlZy9saWJhdnV0aWwveGdhX2ZvbnRfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZWQzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3hnYV9mb250X2RhdGEuYwpAQCAtMCwwICsxLDQxNyBAQAorLyoKKyAqIENHQS9FR0EvVkdBIFJPTSBmb250IGRhdGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ0dBL0VHQS9WR0EgUk9NIGZvbnQgZGF0YQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJ4Z2FfZm9udF9kYXRhLmgiCisKK2NvbnN0IHVpbnQ4X3QgYXZwcml2X2NnYV9mb250WzIwNDhdID0geworIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2UsIDB4ODEsIDB4YTUsIDB4ODEsIDB4YmQsIDB4OTksIDB4ODEsIDB4N2UsCisgMHg3ZSwgMHhmZiwgMHhkYiwgMHhmZiwgMHhjMywgMHhlNywgMHhmZiwgMHg3ZSwgMHg2YywgMHhmZSwgMHhmZSwgMHhmZSwgMHg3YywgMHgzOCwgMHgxMCwgMHgwMCwKKyAweDEwLCAweDM4LCAweDdjLCAweGZlLCAweDdjLCAweDM4LCAweDEwLCAweDAwLCAweDM4LCAweDdjLCAweDM4LCAweGZlLCAweGZlLCAweDdjLCAweDM4LCAweDdjLAorIDB4MTAsIDB4MTAsIDB4MzgsIDB4N2MsIDB4ZmUsIDB4N2MsIDB4MzgsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MTgsIDB4M2MsIDB4M2MsIDB4MTgsIDB4MDAsIDB4MDAsCisgMHhmZiwgMHhmZiwgMHhlNywgMHhjMywgMHhjMywgMHhlNywgMHhmZiwgMHhmZiwgMHgwMCwgMHgzYywgMHg2NiwgMHg0MiwgMHg0MiwgMHg2NiwgMHgzYywgMHgwMCwKKyAweGZmLCAweGMzLCAweDk5LCAweGJkLCAweGJkLCAweDk5LCAweGMzLCAweGZmLCAweDBmLCAweDA3LCAweDBmLCAweDdkLCAweGNjLCAweGNjLCAweGNjLCAweDc4LAorIDB4M2MsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M2MsIDB4MTgsIDB4N2UsIDB4MTgsIDB4M2YsIDB4MzMsIDB4M2YsIDB4MzAsIDB4MzAsIDB4NzAsIDB4ZjAsIDB4ZTAsCisgMHg3ZiwgMHg2MywgMHg3ZiwgMHg2MywgMHg2MywgMHg2NywgMHhlNiwgMHhjMCwgMHg5OSwgMHg1YSwgMHgzYywgMHhlNywgMHhlNywgMHgzYywgMHg1YSwgMHg5OSwKKyAweDgwLCAweGUwLCAweGY4LCAweGZlLCAweGY4LCAweGUwLCAweDgwLCAweDAwLCAweDAyLCAweDBlLCAweDNlLCAweGZlLCAweDNlLCAweDBlLCAweDAyLCAweDAwLAorIDB4MTgsIDB4M2MsIDB4N2UsIDB4MTgsIDB4MTgsIDB4N2UsIDB4M2MsIDB4MTgsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4MDAsIDB4NjYsIDB4MDAsCisgMHg3ZiwgMHhkYiwgMHhkYiwgMHg3YiwgMHgxYiwgMHgxYiwgMHgxYiwgMHgwMCwgMHgzZSwgMHg2MywgMHgzOCwgMHg2YywgMHg2YywgMHgzOCwgMHhjYywgMHg3OCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDdlLCAweDdlLCAweDdlLCAweDAwLCAweDE4LCAweDNjLCAweDdlLCAweDE4LCAweDdlLCAweDNjLCAweDE4LCAweGZmLAorIDB4MTgsIDB4M2MsIDB4N2UsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4N2UsIDB4M2MsIDB4MTgsIDB4MDAsCisgMHgwMCwgMHgxOCwgMHgwYywgMHhmZSwgMHgwYywgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHg2MCwgMHhmZSwgMHg2MCwgMHgzMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweGMwLCAweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDI0LCAweDY2LCAweGZmLCAweDY2LCAweDI0LCAweDAwLCAweDAwLAorIDB4MDAsIDB4MTgsIDB4M2MsIDB4N2UsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4N2UsIDB4M2MsIDB4MTgsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHg3OCwgMHg3OCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgzMCwgMHgwMCwKKyAweDZjLCAweDZjLCAweDZjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDZjLCAweDZjLCAweGZlLCAweDZjLCAweGZlLCAweDZjLCAweDZjLCAweDAwLAorIDB4MzAsIDB4N2MsIDB4YzAsIDB4NzgsIDB4MGMsIDB4ZjgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4YzYsIDB4Y2MsIDB4MTgsIDB4MzAsIDB4NjYsIDB4YzYsIDB4MDAsCisgMHgzOCwgMHg2YywgMHgzOCwgMHg3NiwgMHhkYywgMHhjYywgMHg3NiwgMHgwMCwgMHg2MCwgMHg2MCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDE4LCAweDMwLCAweDYwLCAweDYwLCAweDYwLCAweDMwLCAweDE4LCAweDAwLCAweDYwLCAweDMwLCAweDE4LCAweDE4LCAweDE4LCAweDMwLCAweDYwLCAweDAwLAorIDB4MDAsIDB4NjYsIDB4M2MsIDB4ZmYsIDB4M2MsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MzAsIDB4ZmMsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgzMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDA2LCAweDBjLCAweDE4LCAweDMwLCAweDYwLCAweGMwLCAweDgwLCAweDAwLAorIDB4N2MsIDB4YzYsIDB4Y2UsIDB4ZGUsIDB4ZjYsIDB4ZTYsIDB4N2MsIDB4MDAsIDB4MzAsIDB4NzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4ZmMsIDB4MDAsCisgMHg3OCwgMHhjYywgMHgwYywgMHgzOCwgMHg2MCwgMHhjYywgMHhmYywgMHgwMCwgMHg3OCwgMHhjYywgMHgwYywgMHgzOCwgMHgwYywgMHhjYywgMHg3OCwgMHgwMCwKKyAweDFjLCAweDNjLCAweDZjLCAweGNjLCAweGZlLCAweDBjLCAweDFlLCAweDAwLCAweGZjLCAweGMwLCAweGY4LCAweDBjLCAweDBjLCAweGNjLCAweDc4LCAweDAwLAorIDB4MzgsIDB4NjAsIDB4YzAsIDB4ZjgsIDB4Y2MsIDB4Y2MsIDB4NzgsIDB4MDAsIDB4ZmMsIDB4Y2MsIDB4MGMsIDB4MTgsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MDAsCisgMHg3OCwgMHhjYywgMHhjYywgMHg3OCwgMHhjYywgMHhjYywgMHg3OCwgMHgwMCwgMHg3OCwgMHhjYywgMHhjYywgMHg3YywgMHgwYywgMHgxOCwgMHg3MCwgMHgwMCwKKyAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDYwLAorIDB4MTgsIDB4MzAsIDB4NjAsIDB4YzAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDAsCisgMHg2MCwgMHgzMCwgMHgxOCwgMHgwYywgMHgxOCwgMHgzMCwgMHg2MCwgMHgwMCwgMHg3OCwgMHhjYywgMHgwYywgMHgxOCwgMHgzMCwgMHgwMCwgMHgzMCwgMHgwMCwKKyAweDdjLCAweGM2LCAweGRlLCAweGRlLCAweGRlLCAweGMwLCAweDc4LCAweDAwLCAweDMwLCAweDc4LCAweGNjLCAweGNjLCAweGZjLCAweGNjLCAweGNjLCAweDAwLAorIDB4ZmMsIDB4NjYsIDB4NjYsIDB4N2MsIDB4NjYsIDB4NjYsIDB4ZmMsIDB4MDAsIDB4M2MsIDB4NjYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4NjYsIDB4M2MsIDB4MDAsCisgMHhmOCwgMHg2YywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2YywgMHhmOCwgMHgwMCwgMHhmZSwgMHg2MiwgMHg2OCwgMHg3OCwgMHg2OCwgMHg2MiwgMHhmZSwgMHgwMCwKKyAweGZlLCAweDYyLCAweDY4LCAweDc4LCAweDY4LCAweDYwLCAweGYwLCAweDAwLCAweDNjLCAweDY2LCAweGMwLCAweGMwLCAweGNlLCAweDY2LCAweDNlLCAweDAwLAorIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4ZmMsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4NzgsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4NzgsIDB4MDAsCisgMHgxZSwgMHgwYywgMHgwYywgMHgwYywgMHhjYywgMHhjYywgMHg3OCwgMHgwMCwgMHhlNiwgMHg2NiwgMHg2YywgMHg3OCwgMHg2YywgMHg2NiwgMHhlNiwgMHgwMCwKKyAweGYwLCAweDYwLCAweDYwLCAweDYwLCAweDYyLCAweDY2LCAweGZlLCAweDAwLCAweGM2LCAweGVlLCAweGZlLCAweGZlLCAweGQ2LCAweGM2LCAweGM2LCAweDAwLAorIDB4YzYsIDB4ZTYsIDB4ZjYsIDB4ZGUsIDB4Y2UsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4YzYsIDB4NmMsIDB4MzgsIDB4MDAsCisgMHhmYywgMHg2NiwgMHg2NiwgMHg3YywgMHg2MCwgMHg2MCwgMHhmMCwgMHgwMCwgMHg3OCwgMHhjYywgMHhjYywgMHhjYywgMHhkYywgMHg3OCwgMHgxYywgMHgwMCwKKyAweGZjLCAweDY2LCAweDY2LCAweDdjLCAweDZjLCAweDY2LCAweGU2LCAweDAwLCAweDc4LCAweGNjLCAweGUwLCAweDcwLCAweDFjLCAweGNjLCAweDc4LCAweDAwLAorIDB4ZmMsIDB4YjQsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4NzgsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4ZmMsIDB4MDAsCisgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHg3OCwgMHgzMCwgMHgwMCwgMHhjNiwgMHhjNiwgMHhjNiwgMHhkNiwgMHhmZSwgMHhlZSwgMHhjNiwgMHgwMCwKKyAweGM2LCAweGM2LCAweDZjLCAweDM4LCAweDM4LCAweDZjLCAweGM2LCAweDAwLCAweGNjLCAweGNjLCAweGNjLCAweDc4LCAweDMwLCAweDMwLCAweDc4LCAweDAwLAorIDB4ZmUsIDB4YzYsIDB4OGMsIDB4MTgsIDB4MzIsIDB4NjYsIDB4ZmUsIDB4MDAsIDB4NzgsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NzgsIDB4MDAsCisgMHhjMCwgMHg2MCwgMHgzMCwgMHgxOCwgMHgwYywgMHgwNiwgMHgwMiwgMHgwMCwgMHg3OCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHg3OCwgMHgwMCwKKyAweDEwLCAweDM4LCAweDZjLCAweGM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLAorIDB4MzAsIDB4MzAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzgsIDB4MGMsIDB4N2MsIDB4Y2MsIDB4NzYsIDB4MDAsCisgMHhlMCwgMHg2MCwgMHg2MCwgMHg3YywgMHg2NiwgMHg2NiwgMHhkYywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3OCwgMHhjYywgMHhjMCwgMHhjYywgMHg3OCwgMHgwMCwKKyAweDFjLCAweDBjLCAweDBjLCAweDdjLCAweGNjLCAweGNjLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDc4LCAweGNjLCAweGZjLCAweGMwLCAweDc4LCAweDAwLAorIDB4MzgsIDB4NmMsIDB4NjAsIDB4ZjAsIDB4NjAsIDB4NjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzYsIDB4Y2MsIDB4Y2MsIDB4N2MsIDB4MGMsIDB4ZjgsCisgMHhlMCwgMHg2MCwgMHg2YywgMHg3NiwgMHg2NiwgMHg2NiwgMHhlNiwgMHgwMCwgMHgzMCwgMHgwMCwgMHg3MCwgMHgzMCwgMHgzMCwgMHgzMCwgMHg3OCwgMHgwMCwKKyAweDBjLCAweDAwLCAweDBjLCAweDBjLCAweDBjLCAweGNjLCAweGNjLCAweDc4LCAweGUwLCAweDYwLCAweDY2LCAweDZjLCAweDc4LCAweDZjLCAweGU2LCAweDAwLAorIDB4NzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4ZmUsIDB4ZmUsIDB4ZDYsIDB4YzYsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHhmOCwgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3OCwgMHhjYywgMHhjYywgMHhjYywgMHg3OCwgMHgwMCwKKyAweDAwLCAweDAwLCAweGRjLCAweDY2LCAweDY2LCAweDdjLCAweDYwLCAweGYwLCAweDAwLCAweDAwLCAweDc2LCAweGNjLCAweGNjLCAweDdjLCAweDBjLCAweDFlLAorIDB4MDAsIDB4MDAsIDB4ZGMsIDB4NzYsIDB4NjYsIDB4NjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzAsIDB4NzgsIDB4MGMsIDB4ZjgsIDB4MDAsCisgMHgxMCwgMHgzMCwgMHg3YywgMHgzMCwgMHgzMCwgMHgzNCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHg3NiwgMHgwMCwKKyAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweGNjLCAweDc4LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGM2LCAweGQ2LCAweGZlLCAweGZlLCAweDZjLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4YzYsIDB4NmMsIDB4MzgsIDB4NmMsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4N2MsIDB4MGMsIDB4ZjgsCisgMHgwMCwgMHgwMCwgMHhmYywgMHg5OCwgMHgzMCwgMHg2NCwgMHhmYywgMHgwMCwgMHgxYywgMHgzMCwgMHgzMCwgMHhlMCwgMHgzMCwgMHgzMCwgMHgxYywgMHgwMCwKKyAweDE4LCAweDE4LCAweDE4LCAweDAwLCAweDE4LCAweDE4LCAweDE4LCAweDAwLCAweGUwLCAweDMwLCAweDMwLCAweDFjLCAweDMwLCAweDMwLCAweGUwLCAweDAwLAorIDB4NzYsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4ZmUsIDB4MDAsCisgMHg3OCwgMHhjYywgMHhjMCwgMHhjYywgMHg3OCwgMHgxOCwgMHgwYywgMHg3OCwgMHgwMCwgMHhjYywgMHgwMCwgMHhjYywgMHhjYywgMHhjYywgMHg3ZSwgMHgwMCwKKyAweDFjLCAweDAwLCAweDc4LCAweGNjLCAweGZjLCAweGMwLCAweDc4LCAweDAwLCAweDdlLCAweGMzLCAweDNjLCAweDA2LCAweDNlLCAweDY2LCAweDNmLCAweDAwLAorIDB4Y2MsIDB4MDAsIDB4NzgsIDB4MGMsIDB4N2MsIDB4Y2MsIDB4N2UsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4NzgsIDB4MGMsIDB4N2MsIDB4Y2MsIDB4N2UsIDB4MDAsCisgMHgzMCwgMHgzMCwgMHg3OCwgMHgwYywgMHg3YywgMHhjYywgMHg3ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3OCwgMHhjMCwgMHhjMCwgMHg3OCwgMHgwYywgMHgzOCwKKyAweDdlLCAweGMzLCAweDNjLCAweDY2LCAweDdlLCAweDYwLCAweDNjLCAweDAwLCAweGNjLCAweDAwLCAweDc4LCAweGNjLCAweGZjLCAweGMwLCAweDc4LCAweDAwLAorIDB4ZTAsIDB4MDAsIDB4NzgsIDB4Y2MsIDB4ZmMsIDB4YzAsIDB4NzgsIDB4MDAsIDB4Y2MsIDB4MDAsIDB4NzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4NzgsIDB4MDAsCisgMHg3YywgMHhjNiwgMHgzOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgzYywgMHgwMCwgMHhlMCwgMHgwMCwgMHg3MCwgMHgzMCwgMHgzMCwgMHgzMCwgMHg3OCwgMHgwMCwKKyAweGM2LCAweDM4LCAweDZjLCAweGM2LCAweGZlLCAweGM2LCAweGM2LCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDc4LCAweGNjLCAweGZjLCAweGNjLCAweDAwLAorIDB4MWMsIDB4MDAsIDB4ZmMsIDB4NjAsIDB4NzgsIDB4NjAsIDB4ZmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsIDB4MGMsIDB4N2YsIDB4Y2MsIDB4N2YsIDB4MDAsCisgMHgzZSwgMHg2YywgMHhjYywgMHhmZSwgMHhjYywgMHhjYywgMHhjZSwgMHgwMCwgMHg3OCwgMHhjYywgMHgwMCwgMHg3OCwgMHhjYywgMHhjYywgMHg3OCwgMHgwMCwKKyAweDAwLCAweGNjLCAweDAwLCAweDc4LCAweGNjLCAweGNjLCAweDc4LCAweDAwLCAweDAwLCAweGUwLCAweDAwLCAweDc4LCAweGNjLCAweGNjLCAweDc4LCAweDAwLAorIDB4NzgsIDB4Y2MsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4N2UsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4N2UsIDB4MDAsCisgMHgwMCwgMHhjYywgMHgwMCwgMHhjYywgMHhjYywgMHg3YywgMHgwYywgMHhmOCwgMHhjMywgMHgxOCwgMHgzYywgMHg2NiwgMHg2NiwgMHgzYywgMHgxOCwgMHgwMCwKKyAweGNjLCAweDAwLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweDc4LCAweDAwLCAweDE4LCAweDE4LCAweDdlLCAweGMwLCAweGMwLCAweDdlLCAweDE4LCAweDE4LAorIDB4MzgsIDB4NmMsIDB4NjQsIDB4ZjAsIDB4NjAsIDB4ZTYsIDB4ZmMsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4NzgsIDB4ZmMsIDB4MzAsIDB4ZmMsIDB4MzAsIDB4MzAsCisgMHhmOCwgMHhjYywgMHhjYywgMHhmYSwgMHhjNiwgMHhjZiwgMHhjNiwgMHhjNywgMHgwZSwgMHgxYiwgMHgxOCwgMHgzYywgMHgxOCwgMHgxOCwgMHhkOCwgMHg3MCwKKyAweDFjLCAweDAwLCAweDc4LCAweDBjLCAweDdjLCAweGNjLCAweDdlLCAweDAwLCAweDM4LCAweDAwLCAweDcwLCAweDMwLCAweDMwLCAweDMwLCAweDc4LCAweDAwLAorIDB4MDAsIDB4MWMsIDB4MDAsIDB4NzgsIDB4Y2MsIDB4Y2MsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4N2UsIDB4MDAsCisgMHgwMCwgMHhmOCwgMHgwMCwgMHhmOCwgMHhjYywgMHhjYywgMHhjYywgMHgwMCwgMHhmYywgMHgwMCwgMHhjYywgMHhlYywgMHhmYywgMHhkYywgMHhjYywgMHgwMCwKKyAweDNjLCAweDZjLCAweDZjLCAweDNlLCAweDAwLCAweDdlLCAweDAwLCAweDAwLCAweDM4LCAweDZjLCAweDZjLCAweDM4LCAweDAwLCAweDdjLCAweDAwLCAweDAwLAorIDB4MzAsIDB4MDAsIDB4MzAsIDB4NjAsIDB4YzAsIDB4Y2MsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHhjMywgMHhjNiwgMHhjYywgMHhkZSwgMHgzMywgMHg2NiwgMHhjYywgMHgwZiwKKyAweGMzLCAweGM2LCAweGNjLCAweGRiLCAweDM3LCAweDZmLCAweGNmLCAweDAzLCAweDE4LCAweDE4LCAweDAwLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDAwLAorIDB4MDAsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4NjYsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4NjYsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4MDAsIDB4MDAsCisgMHgyMiwgMHg4OCwgMHgyMiwgMHg4OCwgMHgyMiwgMHg4OCwgMHgyMiwgMHg4OCwgMHg1NSwgMHhhYSwgMHg1NSwgMHhhYSwgMHg1NSwgMHhhYSwgMHg1NSwgMHhhYSwKKyAweGRiLCAweDc3LCAweGRiLCAweGVlLCAweGRiLCAweDc3LCAweGRiLCAweGVlLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZjgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZjgsIDB4MTgsIDB4ZjgsIDB4MTgsIDB4MTgsIDB4MTgsCisgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHhmNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZSwgMHgzNiwgMHgzNiwgMHgzNiwKKyAweDAwLCAweDAwLCAweGY4LCAweDE4LCAweGY4LCAweDE4LCAweDE4LCAweDE4LCAweDM2LCAweDM2LCAweGY2LCAweDA2LCAweGY2LCAweDM2LCAweDM2LCAweDM2LAorIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4MDYsIDB4ZjYsIDB4MzYsIDB4MzYsIDB4MzYsCisgMHgzNiwgMHgzNiwgMHhmNiwgMHgwNiwgMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDE4LCAweDE4LCAweGY4LCAweDE4LCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY4LCAweDE4LCAweDE4LCAweDE4LAorIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxZiwgMHgxOCwgMHgxOCwgMHgxOCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweGZmLCAweDE4LCAweDE4LCAweDE4LAorIDB4MTgsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzcsIDB4MzYsIDB4MzYsIDB4MzYsCisgMHgzNiwgMHgzNiwgMHgzNywgMHgzMCwgMHgzZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzZiwgMHgzMCwgMHgzNywgMHgzNiwgMHgzNiwgMHgzNiwKKyAweDM2LCAweDM2LCAweGY3LCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweGY3LCAweDM2LCAweDM2LCAweDM2LAorIDB4MzYsIDB4MzYsIDB4MzcsIDB4MzAsIDB4MzcsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgzNiwgMHgzNiwgMHhmNywgMHgwMCwgMHhmNywgMHgzNiwgMHgzNiwgMHgzNiwgMHgxOCwgMHgxOCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDE4LCAweDE4LCAweDE4LAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4M2YsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgxOCwgMHgxOCwgMHgxZiwgMHgxOCwgMHgxZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxZiwgMHgxOCwgMHgxZiwgMHgxOCwgMHgxOCwgMHgxOCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDNmLCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweGZmLCAweDM2LCAweDM2LCAweDM2LAorIDB4MTgsIDB4MTgsIDB4ZmYsIDB4MTgsIDB4ZmYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxZiwgMHgxOCwgMHgxOCwgMHgxOCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHg3NiwgMHhkYywgMHhjOCwgMHhkYywgMHg3NiwgMHgwMCwgMHgwMCwgMHg3OCwgMHhjYywgMHhmOCwgMHhjYywgMHhmOCwgMHhjMCwgMHhjMCwKKyAweDAwLCAweGZjLCAweGNjLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweGZlLCAweDZjLCAweDZjLCAweDZjLCAweDZjLCAweDZjLCAweDAwLAorIDB4ZmMsIDB4Y2MsIDB4NjAsIDB4MzAsIDB4NjAsIDB4Y2MsIDB4ZmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2UsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4NzAsIDB4MDAsCisgMHgwMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg3YywgMHg2MCwgMHhjMCwgMHgwMCwgMHg3NiwgMHhkYywgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgwMCwKKyAweGZjLCAweDMwLCAweDc4LCAweGNjLCAweGNjLCAweDc4LCAweDMwLCAweGZjLCAweDM4LCAweDZjLCAweGM2LCAweGZlLCAweGM2LCAweDZjLCAweDM4LCAweDAwLAorIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4NmMsIDB4NmMsIDB4ZWUsIDB4MDAsIDB4MWMsIDB4MzAsIDB4MTgsIDB4N2MsIDB4Y2MsIDB4Y2MsIDB4NzgsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHg3ZSwgMHhkYiwgMHhkYiwgMHg3ZSwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwYywgMHg3ZSwgMHhkYiwgMHhkYiwgMHg3ZSwgMHg2MCwgMHhjMCwKKyAweDM4LCAweDYwLCAweGMwLCAweGY4LCAweGMwLCAweDYwLCAweDM4LCAweDAwLCAweDc4LCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweDAwLAorIDB4MDAsIDB4ZmMsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MzAsIDB4ZmMsIDB4MzAsIDB4MzAsIDB4MDAsIDB4ZmMsIDB4MDAsCisgMHg2MCwgMHgzMCwgMHgxOCwgMHgzMCwgMHg2MCwgMHgwMCwgMHhmYywgMHgwMCwgMHgxOCwgMHgzMCwgMHg2MCwgMHgzMCwgMHgxOCwgMHgwMCwgMHhmYywgMHgwMCwKKyAweDBlLCAweDFiLCAweDFiLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweGQ4LCAweGQ4LCAweDcwLAorIDB4MzAsIDB4MzAsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4NzYsIDB4ZGMsIDB4MDAsIDB4NzYsIDB4ZGMsIDB4MDAsIDB4MDAsCisgMHgzOCwgMHg2YywgMHg2YywgMHgzOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDBjLCAweDBjLCAweDBjLCAweGVjLCAweDZjLCAweDNjLCAweDFjLAorIDB4NzgsIDB4NmMsIDB4NmMsIDB4NmMsIDB4NmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MTgsIDB4MzAsIDB4NjAsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKK307CisKK2NvbnN0IHVpbnQ4X3QgYXZwcml2X3ZnYTE2X2ZvbnRbNDA5Nl0gPSB7CisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDdlLCAweDgxLCAweGE1LCAweDgxLCAweDgxLCAweGJkLCAweDk5LCAweDgxLCAweDgxLCAweDdlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4N2UsIDB4ZmYsIDB4ZGIsIDB4ZmYsIDB4ZmYsIDB4YzMsIDB4ZTcsIDB4ZmYsIDB4ZmYsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2YywgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHg3YywgMHgzOCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDM4LCAweDdjLCAweGZlLCAweDdjLCAweDM4LCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4M2MsIDB4M2MsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgzYywgMHg3ZSwgMHhmZiwgMHhmZiwgMHg3ZSwgMHgxOCwgMHgxOCwgMHgzYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDNjLCAweDNjLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZTcsIDB4YzMsIDB4YzMsIDB4ZTcsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzYywgMHg2NiwgMHg0MiwgMHg0MiwgMHg2NiwgMHgzYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGMzLCAweDk5LCAweGJkLCAweGJkLCAweDk5LCAweGMzLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorIDB4MDAsIDB4MDAsIDB4MWUsIDB4MGUsIDB4MWEsIDB4MzIsIDB4NzgsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgzYywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHgzYywgMHgxOCwgMHg3ZSwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDNmLCAweDMzLCAweDNmLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDcwLCAweGYwLCAweGUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4N2YsIDB4NjMsIDB4N2YsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjcsIDB4ZTcsIDB4ZTYsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHhkYiwgMHgzYywgMHhlNywgMHgzYywgMHhkYiwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDgwLCAweGMwLCAweGUwLCAweGYwLCAweGY4LCAweGZlLCAweGY4LCAweGYwLCAweGUwLCAweGMwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDIsIDB4MDYsIDB4MGUsIDB4MWUsIDB4M2UsIDB4ZmUsIDB4M2UsIDB4MWUsIDB4MGUsIDB4MDYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgxOCwgMHgzYywgMHg3ZSwgMHgxOCwgMHgxOCwgMHgxOCwgMHg3ZSwgMHgzYywgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4N2YsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4N2IsIDB4MWIsIDB4MWIsIDB4MWIsIDB4MWIsIDB4MWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHg3YywgMHhjNiwgMHg2MCwgMHgzOCwgMHg2YywgMHhjNiwgMHhjNiwgMHg2YywgMHgzOCwgMHgwYywgMHhjNiwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MTgsIDB4M2MsIDB4N2UsIDB4MTgsIDB4MTgsIDB4MTgsIDB4N2UsIDB4M2MsIDB4MTgsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgxOCwgMHgzYywgMHg3ZSwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDdlLCAweDNjLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MGMsIDB4ZmUsIDB4MGMsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHg2MCwgMHhmZSwgMHg2MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweGMwLCAweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4NjYsIDB4ZmYsIDB4NjYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgzOCwgMHgzOCwgMHg3YywgMHg3YywgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZlLCAweGZlLCAweDdjLCAweDdjLCAweDM4LCAweDM4LCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgxOCwgMHgzYywgMHgzYywgMHgzYywgMHgxOCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4NmMsIDB4NmMsIDB4ZmUsIDB4NmMsIDB4NmMsIDB4NmMsIDB4ZmUsIDB4NmMsIDB4NmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgxOCwgMHgxOCwgMHg3YywgMHhjNiwgMHhjMiwgMHhjMCwgMHg3YywgMHgwNiwgMHgwNiwgMHg4NiwgMHhjNiwgMHg3YywgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweGM2LCAweDBjLCAweDE4LCAweDMwLCAweDYwLCAweGM2LCAweDg2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MzgsIDB4NmMsIDB4NmMsIDB4MzgsIDB4NzYsIDB4ZGMsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDBjLCAweDE4LCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDE4LCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MzAsIDB4MTgsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MTgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NiwgMHgzYywgMHhmZiwgMHgzYywgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDdlLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4YzAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgzYywgMHg2NiwgMHhjMywgMHhjMywgMHhkYiwgMHhkYiwgMHhjMywgMHhjMywgMHg2NiwgMHgzYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDE4LCAweDM4LCAweDc4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDdlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4YzAsIDB4YzYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHg3YywgMHhjNiwgMHgwNiwgMHgwNiwgMHgzYywgMHgwNiwgMHgwNiwgMHgwNiwgMHhjNiwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDBjLCAweDFjLCAweDNjLCAweDZjLCAweGNjLCAweGZlLCAweDBjLCAweDBjLCAweDBjLCAweDFlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4ZmUsIDB4YzAsIDB4YzAsIDB4YzAsIDB4ZmMsIDB4MDYsIDB4MDYsIDB4MDYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgzOCwgMHg2MCwgMHhjMCwgMHhjMCwgMHhmYywgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweGZlLCAweGM2LCAweDA2LCAweDA2LCAweDBjLCAweDE4LCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHg3YywgMHhjNiwgMHhjNiwgMHhjNiwgMHg3ZSwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwYywgMHg3OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwYywgMHgxOCwgMHgzMCwgMHg2MCwgMHgzMCwgMHgxOCwgMHgwYywgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDdlLCAweDAwLCAweDAwLCAweDdlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MGMsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHg3YywgMHhjNiwgMHhjNiwgMHgwYywgMHgxOCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDdjLCAweGM2LCAweGM2LCAweGRlLCAweGRlLCAweGRlLCAweGRjLCAweGMwLCAweDdjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MTAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4ZmUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHhmYywgMHg2NiwgMHg2NiwgMHg2NiwgMHg3YywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHhmYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDNjLCAweDY2LCAweGMyLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMyLCAweDY2LCAweDNjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4ZjgsIDB4NmMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NmMsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHhmZSwgMHg2NiwgMHg2MiwgMHg2OCwgMHg3OCwgMHg2OCwgMHg2MCwgMHg2MiwgMHg2NiwgMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweGZlLCAweDY2LCAweDYyLCAweDY4LCAweDc4LCAweDY4LCAweDYwLCAweDYwLCAweDYwLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4M2MsIDB4NjYsIDB4YzIsIDB4YzAsIDB4YzAsIDB4ZGUsIDB4YzYsIDB4YzYsIDB4NjYsIDB4M2EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhmZSwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDNjLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDNjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MWUsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHhlNiwgMHg2NiwgMHg2NiwgMHg2YywgMHg3OCwgMHg3OCwgMHg2YywgMHg2NiwgMHg2NiwgMHhlNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweGYwLCAweDYwLCAweDYwLCAweDYwLCAweDYwLCAweDYwLCAweDYwLCAweDYyLCAweDY2LCAweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4YzMsIDB4ZTcsIDB4ZmYsIDB4ZmYsIDB4ZGIsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHhjNiwgMHhlNiwgMHhmNiwgMHhmZSwgMHhkZSwgMHhjZSwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDdjLCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweDdjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4ZmMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4N2MsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHg3YywgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhkNiwgMHhkZSwgMHg3YywgMHgwYywgMHgwZSwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweGZjLCAweDY2LCAweDY2LCAweDY2LCAweDdjLCAweDZjLCAweDY2LCAweDY2LCAweDY2LCAweGU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4NjAsIDB4MzgsIDB4MGMsIDB4MDYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHhmZiwgMHhkYiwgMHg5OSwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgzYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweDdjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4NjYsIDB4M2MsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHhjMywgMHhjMywgMHhjMywgMHhjMywgMHhjMywgMHhkYiwgMHhkYiwgMHhmZiwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweGMzLCAweGMzLCAweDY2LCAweDNjLCAweDE4LCAweDE4LCAweDNjLCAweDY2LCAweGMzLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4YzMsIDB4YzMsIDB4YzMsIDB4NjYsIDB4M2MsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHhmZiwgMHhjMywgMHg4NiwgMHgwYywgMHgxOCwgMHgzMCwgMHg2MCwgMHhjMSwgMHhjMywgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDNjLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDNjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4YzAsIDB4ZTAsIDB4NzAsIDB4MzgsIDB4MWMsIDB4MGUsIDB4MDYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgzYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgzYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDEwLCAweDM4LCAweDZjLCAweGM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsCisgMHgzMCwgMHgzMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc4LCAweDBjLCAweDdjLCAweGNjLCAweGNjLCAweGNjLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4ZTAsIDB4NjAsIDB4NjAsIDB4NzgsIDB4NmMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3YywgMHhjNiwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjNiwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDFjLCAweDBjLCAweDBjLCAweDNjLCAweDZjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4ZmUsIDB4YzAsIDB4YzAsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgzOCwgMHg2YywgMHg2NCwgMHg2MCwgMHhmMCwgMHg2MCwgMHg2MCwgMHg2MCwgMHg2MCwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc2LCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweDdjLCAweDBjLCAweGNjLCAweDc4LCAweDAwLAorIDB4MDAsIDB4MDAsIDB4ZTAsIDB4NjAsIDB4NjAsIDB4NmMsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4ZTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgzOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgzYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDA2LCAweDA2LCAweDAwLCAweDBlLCAweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDY2LCAweDY2LCAweDNjLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4ZTAsIDB4NjAsIDB4NjAsIDB4NjYsIDB4NmMsIDB4NzgsIDB4NzgsIDB4NmMsIDB4NjYsIDB4ZTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgzOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgzYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGU2LCAweGZmLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3YywgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDdjLCAweDYwLCAweDYwLCAweGYwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzYsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4N2MsIDB4MGMsIDB4MGMsIDB4MWUsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYywgMHg3NiwgMHg2NiwgMHg2MCwgMHg2MCwgMHg2MCwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDdjLCAweGM2LCAweDYwLCAweDM4LCAweDBjLCAweGM2LCAweDdjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MTAsIDB4MzAsIDB4MzAsIDB4ZmMsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzYsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweGMzLCAweGMzLCAweGMzLCAweDY2LCAweDNjLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzMsIDB4YzMsIDB4YzMsIDB4ZGIsIDB4ZGIsIDB4ZmYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHg2NiwgMHgzYywgMHgxOCwgMHgzYywgMHg2NiwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweDdlLCAweDA2LCAweDBjLCAweGY4LCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4Y2MsIDB4MTgsIDB4MzAsIDB4NjAsIDB4YzYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwZSwgMHgxOCwgMHgxOCwgMHgxOCwgMHg3MCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDAwLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4NzAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MGUsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHg3NiwgMHhkYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDM4LCAweDZjLCAweGM2LCAweGM2LCAweGM2LCAweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4M2MsIDB4NjYsIDB4YzIsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzIsIDB4NjYsIDB4M2MsIDB4MGMsIDB4MDYsIDB4N2MsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDBjLCAweDE4LCAweDMwLCAweDAwLCAweDdjLCAweGM2LCAweGZlLCAweGMwLCAweGMwLCAweGM2LCAweDdjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MTAsIDB4MzgsIDB4NmMsIDB4MDAsIDB4NzgsIDB4MGMsIDB4N2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHg3OCwgMHgwYywgMHg3YywgMHhjYywgMHhjYywgMHhjYywgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDYwLCAweDMwLCAweDE4LCAweDAwLCAweDc4LCAweDBjLCAweDdjLCAweGNjLCAweGNjLCAweGNjLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MzgsIDB4NmMsIDB4MzgsIDB4MDAsIDB4NzgsIDB4MGMsIDB4N2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzYywgMHg2NiwgMHg2MCwgMHg2MCwgMHg2NiwgMHgzYywgMHgwYywgMHgwNiwgMHgzYywgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDEwLCAweDM4LCAweDZjLCAweDAwLCAweDdjLCAweGM2LCAweGZlLCAweGMwLCAweGMwLCAweGM2LCAweDdjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4YzYsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4ZmUsIDB4YzAsIDB4YzAsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHg2MCwgMHgzMCwgMHgxOCwgMHgwMCwgMHg3YywgMHhjNiwgMHhmZSwgMHhjMCwgMHhjMCwgMHhjNiwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDM4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDNjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MTgsIDB4M2MsIDB4NjYsIDB4MDAsIDB4MzgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHg2MCwgMHgzMCwgMHgxOCwgMHgwMCwgMHgzOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgzYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweGM2LCAweDAwLCAweDEwLCAweDM4LCAweDZjLCAweGM2LCAweGM2LCAweGZlLCAweGM2LCAweGM2LCAweGM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MzgsIDB4NmMsIDB4MzgsIDB4MDAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4ZmUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgxOCwgMHgzMCwgMHg2MCwgMHgwMCwgMHhmZSwgMHg2NiwgMHg2MCwgMHg3YywgMHg2MCwgMHg2MCwgMHg2NiwgMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDZlLCAweDNiLCAweDFiLCAweDdlLCAweGQ4LCAweGRjLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4M2UsIDB4NmMsIDB4Y2MsIDB4Y2MsIDB4ZmUsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgxMCwgMHgzOCwgMHg2YywgMHgwMCwgMHg3YywgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweGM2LCAweDAwLCAweDAwLCAweDdjLCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweDdjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgzMCwgMHg3OCwgMHhjYywgMHgwMCwgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDYwLCAweDMwLCAweDE4LCAweDAwLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4YzYsIDB4MDAsIDB4MDAsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2UsIDB4MDYsIDB4MGMsIDB4NzgsIDB4MDAsCisgMHgwMCwgMHhjNiwgMHgwMCwgMHg3YywgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweGM2LCAweDAwLCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweDdjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MTgsIDB4MTgsIDB4N2UsIDB4YzMsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzMsIDB4N2UsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgzOCwgMHg2YywgMHg2NCwgMHg2MCwgMHhmMCwgMHg2MCwgMHg2MCwgMHg2MCwgMHg2MCwgMHhlNiwgMHhmYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweGMzLCAweDY2LCAweDNjLCAweDE4LCAweGZmLCAweDE4LCAweGZmLCAweDE4LCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4ZmMsIDB4NjYsIDB4NjYsIDB4N2MsIDB4NjIsIDB4NjYsIDB4NmYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4ZjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwZSwgMHgxYiwgMHgxOCwgMHgxOCwgMHgxOCwgMHg3ZSwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHhkOCwgMHg3MCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDE4LCAweDMwLCAweDYwLCAweDAwLCAweDc4LCAweDBjLCAweDdjLCAweGNjLCAweGNjLCAweGNjLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MGMsIDB4MTgsIDB4MzAsIDB4MDAsIDB4MzgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgxOCwgMHgzMCwgMHg2MCwgMHgwMCwgMHg3YywgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDE4LCAweDMwLCAweDYwLCAweDAwLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4NzYsIDB4ZGMsIDB4MDAsIDB4ZGMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHg3NiwgMHhkYywgMHgwMCwgMHhjNiwgMHhlNiwgMHhmNiwgMHhmZSwgMHhkZSwgMHhjZSwgMHhjNiwgMHhjNiwgMHhjNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDNjLCAweDZjLCAweDZjLCAweDNlLCAweDAwLCAweDdlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MzgsIDB4NmMsIDB4NmMsIDB4MzgsIDB4MDAsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgzMCwgMHgzMCwgMHg2MCwgMHhjMCwgMHhjNiwgMHhjNiwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZlLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHhjMCwgMHhjMCwgMHhjMiwgMHhjNiwgMHhjYywgMHgxOCwgMHgzMCwgMHg2MCwgMHhjZSwgMHg5YiwgMHgwNiwgMHgwYywgMHgxZiwgMHgwMCwgMHgwMCwKKyAweDAwLCAweGMwLCAweGMwLCAweGMyLCAweGM2LCAweGNjLCAweDE4LCAweDMwLCAweDY2LCAweGNlLCAweDk2LCAweDNlLCAweDA2LCAweDA2LCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzNiwgMHg2YywgMHhkOCwgMHg2YywgMHgzNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGQ4LCAweDZjLCAweDM2LCAweDZjLCAweGQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsCisgMHg1NSwgMHhhYSwgMHg1NSwgMHhhYSwgMHg1NSwgMHhhYSwgMHg1NSwgMHhhYSwgMHg1NSwgMHhhYSwgMHg1NSwgMHhhYSwgMHg1NSwgMHhhYSwgMHg1NSwgMHhhYSwKKyAweGRkLCAweDc3LCAweGRkLCAweDc3LCAweGRkLCAweDc3LCAweGRkLCAweDc3LCAweGRkLCAweDc3LCAweGRkLCAweDc3LCAweGRkLCAweDc3LCAweGRkLCAweDc3LAorIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHhmOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKyAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweGY4LCAweDE4LCAweGY4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZjYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZSwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY4LCAweDE4LCAweGY4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZjYsIDB4MDYsIDB4ZjYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsCisgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZlLCAweDA2LCAweGY2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LAorIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZjYsIDB4MDYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweGY4LCAweDE4LCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxZiwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZmYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxZiwgMHgxOCwgMHgxZiwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKyAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM3LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LAorIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzcsIDB4MzAsIDB4M2YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzZiwgMHgzMCwgMHgzNywgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwKKyAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweGY3LCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZjcsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsCisgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNywgMHgzMCwgMHgzNywgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZjcsIDB4MDAsIDB4ZjcsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsCisgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwKKyAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDNmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxZiwgMHgxOCwgMHgxZiwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDNmLCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM2LAorIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZmYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsCisgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHhmZiwgMHgxOCwgMHhmZiwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKyAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwKKyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzYsIDB4ZGMsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZGMsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHg3OCwgMHhjYywgMHhjYywgMHhjYywgMHhkOCwgMHhjYywgMHhjNiwgMHhjNiwgMHhjNiwgMHhjYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweGZlLCAweGM2LCAweGM2LCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4NmMsIDB4NmMsIDB4NmMsIDB4NmMsIDB4NmMsIDB4NmMsIDB4NmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZSwgMHhjNiwgMHg2MCwgMHgzMCwgMHgxOCwgMHgzMCwgMHg2MCwgMHhjNiwgMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDdlLCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4N2MsIDB4NjAsIDB4NjAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NiwgMHhkYywgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDdlLCAweDE4LCAweDNjLCAweDY2LCAweDY2LCAweDY2LCAweDNjLCAweDE4LCAweDdlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4ZmUsIDB4YzYsIDB4YzYsIDB4NmMsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgzOCwgMHg2YywgMHhjNiwgMHhjNiwgMHhjNiwgMHg2YywgMHg2YywgMHg2YywgMHg2YywgMHhlZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDFlLCAweDMwLCAweDE4LCAweDBjLCAweDNlLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDNjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2UsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwNiwgMHg3ZSwgMHhkYiwgMHhkYiwgMHhmMywgMHg3ZSwgMHg2MCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDFjLCAweDMwLCAweDYwLCAweDYwLCAweDdjLCAweDYwLCAweDYwLCAweDYwLCAweDMwLCAweDFjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDdlLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MTgsIDB4MGMsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4MDAsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgxOCwgMHgzMCwgMHg2MCwgMHgzMCwgMHgxOCwgMHgwYywgMHgwMCwgMHg3ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDBlLCAweDFiLCAweDFiLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHg3ZSwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc2LCAweGRjLCAweDAwLCAweDc2LCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MzgsIDB4NmMsIDB4NmMsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MGYsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4ZWMsIDB4NmMsIDB4NmMsIDB4M2MsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHhkOCwgMHg2YywgMHg2YywgMHg2YywgMHg2YywgMHg2YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDcwLCAweGQ4LCAweDMwLCAweDYwLCAweGM4LCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwveGdhX2ZvbnRfZGF0YS5oIGIvZmZtcGVnL2xpYmF2dXRpbC94Z2FfZm9udF9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0MGY1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwveGdhX2ZvbnRfZGF0YS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDR0EvRUdBL1ZHQSBST00gZm9udCBkYXRhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENHQS9FR0EvVkdBIFJPTSBmb250IGRhdGEKKyAqLworCisjaWZuZGVmIEFWVVRJTF9YR0FfRk9OVF9EQVRBX0gKKyNkZWZpbmUgQVZVVElMX1hHQV9GT05UX0RBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCB1aW50OF90IGF2cHJpdl9jZ2FfZm9udFsyMDQ4XTsKK2V4dGVybiBhdl9leHBvcnQgY29uc3QgdWludDhfdCBhdnByaXZfdmdhMTZfZm9udFs0MDk2XTsKKworI2VuZGlmIC8qIEFWVVRJTF9YR0FfRk9OVF9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJhdnV0aWwveHRlYS5jIGIvZmZtcGVnL2xpYmF2dXRpbC94dGVhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1MGNiYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJhdnV0aWwveHRlYS5jCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQSAzMi1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFhURUEgYWxnb3JpdGhtCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgU2FtdWVsIFBpdG9pc2V0CisgKgorICogbG9vc2VseSBiYXNlZCBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgRGF2aWQgV2hlZWxlciBhbmQgUm9nZXIgTmVlZGhhbQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgWFRFQSAzMi1iaXQgaW1wbGVtZW50YXRpb24KKyAqIEBhdXRob3IgU2FtdWVsIFBpdG9pc2V0CisgKiBAaW5ncm91cCBsYXZ1X3h0ZWEKKyAqLworCisjaW5jbHVkZSAiYXZ1dGlsLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAieHRlYS5oIgorCit2b2lkIGF2X3h0ZWFfaW5pdChBVlhURUEgKmN0eCwgY29uc3QgdWludDhfdCBrZXlbMTZdKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgY3R4LT5rZXlbaV0gPSBBVl9SQjMyKGtleSArIChpIDw8IDIpKTsKK30KKworc3RhdGljIHZvaWQgeHRlYV9jcnlwdF9lY2IoQVZYVEVBICpjdHgsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHQsIHVpbnQ4X3QgKml2KQoreworICAgIHVpbnQzMl90IHYwLCB2MTsKKyNpZiAhQ09ORklHX1NNQUxMCisgICAgdWludDMyX3QgazAgPSBjdHgtPmtleVswXTsKKyAgICB1aW50MzJfdCBrMSA9IGN0eC0+a2V5WzFdOworICAgIHVpbnQzMl90IGsyID0gY3R4LT5rZXlbMl07CisgICAgdWludDMyX3QgazMgPSBjdHgtPmtleVszXTsKKyNlbmRpZgorCisgICAgdjAgPSBBVl9SQjMyKHNyYyk7CisgICAgdjEgPSBBVl9SQjMyKHNyYyArIDQpOworCisgICAgaWYgKGRlY3J5cHQpIHsKKyNpZiBDT05GSUdfU01BTEwKKyAgICAgICAgaW50IGk7CisgICAgICAgIHVpbnQzMl90IGRlbHRhID0gMHg5RTM3NzlCOVUsIHN1bSA9IGRlbHRhICogMzI7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgICAgICAgIHYxIC09ICgoKHYwIDw8IDQpIF4gKHYwID4+IDUpKSArIHYwKSBeIChzdW0gKyBjdHgtPmtleVsoc3VtID4+IDExKSAmIDNdKTsKKyAgICAgICAgICAgIHN1bSAtPSBkZWx0YTsKKyAgICAgICAgICAgIHYwIC09ICgoKHYxIDw8IDQpIF4gKHYxID4+IDUpKSArIHYxKSBeIChzdW0gKyBjdHgtPmtleVtzdW0gJiAzXSk7CisgICAgICAgIH0KKyNlbHNlCisjZGVmaW5lIERTVEVQKFNVTSwgSzAsIEsxKSBcCisgICAgICAgICAgICB2MSAtPSAoKCh2MCA8PCA0KSBeICh2MCA+PiA1KSkgKyB2MCkgXiAoU1VNICsgSzApOyBcCisgICAgICAgICAgICB2MCAtPSAoKCh2MSA8PCA0KSBeICh2MSA+PiA1KSkgKyB2MSkgXiAoU1VNIC0gMHg5RTM3NzlCOVUgKyBLMSkKKworICAgICAgICBEU1RFUCgweEM2RUYzNzIwVSwgazIsIGszKTsKKyAgICAgICAgRFNURVAoMHgyOEI3QkQ2N1UsIGszLCBrMik7CisgICAgICAgIERTVEVQKDB4OEE4MDQzQUVVLCBrMCwgazEpOworICAgICAgICBEU1RFUCgweEVDNDhDOUY1VSwgazEsIGswKTsKKyAgICAgICAgRFNURVAoMHg0RTExNTAzQ1UsIGsyLCBrMyk7CisgICAgICAgIERTVEVQKDB4QUZEOUQ2ODNVLCBrMiwgazIpOworICAgICAgICBEU1RFUCgweDExQTI1Q0NBVSwgazMsIGsxKTsKKyAgICAgICAgRFNURVAoMHg3MzZBRTMxMVUsIGswLCBrMCk7CisgICAgICAgIERTVEVQKDB4RDUzMzY5NThVLCBrMSwgazMpOworICAgICAgICBEU1RFUCgweDM2RkJFRjlGVSwgazEsIGsyKTsKKyAgICAgICAgRFNURVAoMHg5OEM0NzVFNlUsIGsyLCBrMSk7CisgICAgICAgIERTVEVQKDB4RkE4Q0ZDMkRVLCBrMywgazApOworICAgICAgICBEU1RFUCgweDVDNTU4Mjc0VSwgazAsIGszKTsKKyAgICAgICAgRFNURVAoMHhCRTFFMDhCQlUsIGsxLCBrMik7CisgICAgICAgIERTVEVQKDB4MUZFNjhGMDJVLCBrMSwgazEpOworICAgICAgICBEU1RFUCgweDgxQUYxNTQ5VSwgazIsIGswKTsKKyAgICAgICAgRFNURVAoMHhFMzc3OUI5MFUsIGszLCBrMyk7CisgICAgICAgIERTVEVQKDB4NDU0MDIxRDdVLCBrMCwgazIpOworICAgICAgICBEU1RFUCgweEE3MDhBODFFVSwgazEsIGsxKTsKKyAgICAgICAgRFNURVAoMHgwOEQxMkU2NVUsIGsxLCBrMCk7CisgICAgICAgIERTVEVQKDB4NkE5OUI0QUNVLCBrMiwgazMpOworICAgICAgICBEU1RFUCgweENDNjIzQUYzVSwgazMsIGsyKTsKKyAgICAgICAgRFNURVAoMHgyRTJBQzEzQVUsIGswLCBrMSk7CisgICAgICAgIERTVEVQKDB4OEZGMzQ3ODFVLCBrMCwgazApOworICAgICAgICBEU1RFUCgweEYxQkJDREM4VSwgazEsIGszKTsKKyAgICAgICAgRFNURVAoMHg1Mzg0NTQwRlUsIGsyLCBrMik7CisgICAgICAgIERTVEVQKDB4QjU0Q0RBNTZVLCBrMywgazEpOworICAgICAgICBEU1RFUCgweDE3MTU2MDlEVSwgazAsIGswKTsKKyAgICAgICAgRFNURVAoMHg3OERERTZFNFUsIGswLCBrMyk7CisgICAgICAgIERTVEVQKDB4REFBNjZEMkJVLCBrMSwgazIpOworICAgICAgICBEU1RFUCgweDNDNkVGMzcyVSwgazIsIGsxKTsKKyAgICAgICAgRFNURVAoMHg5RTM3NzlCOVUsIGszLCBrMCk7CisjZW5kaWYKKyAgICAgICAgaWYgKGl2KSB7CisgICAgICAgICAgICB2MCBePSBBVl9SQjMyKGl2KTsKKyAgICAgICAgICAgIHYxIF49IEFWX1JCMzIoaXYgKyA0KTsKKyAgICAgICAgICAgIG1lbWNweShpdiwgc3JjLCA4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisjaWYgQ09ORklHX1NNQUxMCisgICAgICAgIGludCBpOworICAgICAgICB1aW50MzJfdCBzdW0gPSAwLCBkZWx0YSA9IDB4OUUzNzc5QjlVOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgICAgICB2MCArPSAoKCh2MSA8PCA0KSBeICh2MSA+PiA1KSkgKyB2MSkgXiAoc3VtICsgY3R4LT5rZXlbc3VtICYgM10pOworICAgICAgICAgICAgc3VtICs9IGRlbHRhOworICAgICAgICAgICAgdjEgKz0gKCgodjAgPDwgNCkgXiAodjAgPj4gNSkpICsgdjApIF4gKHN1bSArIGN0eC0+a2V5WyhzdW0gPj4gMTEpICYgM10pOworICAgICAgICB9CisjZWxzZQorI2RlZmluZSBFU1RFUChTVU0sIEswLCBLMSkgXAorICAgICAgICAgICAgdjAgKz0gKCgodjEgPDwgNCkgXiAodjEgPj4gNSkpICsgdjEpIF4gKFNVTSArIEswKTtcCisgICAgICAgICAgICB2MSArPSAoKCh2MCA8PCA0KSBeICh2MCA+PiA1KSkgKyB2MCkgXiAoU1VNICsgMHg5RTM3NzlCOVUgKyBLMSkKKyAgICAgICAgRVNURVAoMHgwMDAwMDAwMFUsIGswLCBrMyk7CisgICAgICAgIEVTVEVQKDB4OUUzNzc5QjlVLCBrMSwgazIpOworICAgICAgICBFU1RFUCgweDNDNkVGMzcyVSwgazIsIGsxKTsKKyAgICAgICAgRVNURVAoMHhEQUE2NkQyQlUsIGszLCBrMCk7CisgICAgICAgIEVTVEVQKDB4NzhEREU2RTRVLCBrMCwgazApOworICAgICAgICBFU1RFUCgweDE3MTU2MDlEVSwgazEsIGszKTsKKyAgICAgICAgRVNURVAoMHhCNTRDREE1NlUsIGsyLCBrMik7CisgICAgICAgIEVTVEVQKDB4NTM4NDU0MEZVLCBrMywgazEpOworICAgICAgICBFU1RFUCgweEYxQkJDREM4VSwgazAsIGswKTsKKyAgICAgICAgRVNURVAoMHg4RkYzNDc4MVUsIGsxLCBrMCk7CisgICAgICAgIEVTVEVQKDB4MkUyQUMxM0FVLCBrMiwgazMpOworICAgICAgICBFU1RFUCgweENDNjIzQUYzVSwgazMsIGsyKTsKKyAgICAgICAgRVNURVAoMHg2QTk5QjRBQ1UsIGswLCBrMSk7CisgICAgICAgIEVTVEVQKDB4MDhEMTJFNjVVLCBrMSwgazEpOworICAgICAgICBFU1RFUCgweEE3MDhBODFFVSwgazIsIGswKTsKKyAgICAgICAgRVNURVAoMHg0NTQwMjFEN1UsIGszLCBrMyk7CisgICAgICAgIEVTVEVQKDB4RTM3NzlCOTBVLCBrMCwgazIpOworICAgICAgICBFU1RFUCgweDgxQUYxNTQ5VSwgazEsIGsxKTsKKyAgICAgICAgRVNURVAoMHgxRkU2OEYwMlUsIGsyLCBrMSk7CisgICAgICAgIEVTVEVQKDB4QkUxRTA4QkJVLCBrMywgazApOworICAgICAgICBFU1RFUCgweDVDNTU4Mjc0VSwgazAsIGszKTsKKyAgICAgICAgRVNURVAoMHhGQThDRkMyRFUsIGsxLCBrMik7CisgICAgICAgIEVTVEVQKDB4OThDNDc1RTZVLCBrMiwgazEpOworICAgICAgICBFU1RFUCgweDM2RkJFRjlGVSwgazMsIGsxKTsKKyAgICAgICAgRVNURVAoMHhENTMzNjk1OFUsIGswLCBrMCk7CisgICAgICAgIEVTVEVQKDB4NzM2QUUzMTFVLCBrMSwgazMpOworICAgICAgICBFU1RFUCgweDExQTI1Q0NBVSwgazIsIGsyKTsKKyAgICAgICAgRVNURVAoMHhBRkQ5RDY4M1UsIGszLCBrMik7CisgICAgICAgIEVTVEVQKDB4NEUxMTUwM0NVLCBrMCwgazEpOworICAgICAgICBFU1RFUCgweEVDNDhDOUY1VSwgazEsIGswKTsKKyAgICAgICAgRVNURVAoMHg4QTgwNDNBRVUsIGsyLCBrMyk7CisgICAgICAgIEVTVEVQKDB4MjhCN0JENjdVLCBrMywgazIpOworI2VuZGlmCisgICAgfQorCisgICAgQVZfV0IzMihkc3QsIHYwKTsKKyAgICBBVl9XQjMyKGRzdCArIDQsIHYxKTsKK30KKwordm9pZCBhdl94dGVhX2NyeXB0KEFWWFRFQSAqY3R4LCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKml2LCBpbnQgZGVjcnlwdCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChkZWNyeXB0KSB7CisgICAgICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgICAgICB4dGVhX2NyeXB0X2VjYihjdHgsIGRzdCwgc3JjLCBkZWNyeXB0LCBpdik7CisKKyAgICAgICAgICAgIHNyYyAgICs9IDg7CisgICAgICAgICAgICBkc3QgICArPSA4OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICAgIGlmIChpdikgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IHNyY1tpXSBeIGl2W2ldOworICAgICAgICAgICAgICAgIHh0ZWFfY3J5cHRfZWNiKGN0eCwgZHN0LCBkc3QsIGRlY3J5cHQsIE5VTEwpOworICAgICAgICAgICAgICAgIG1lbWNweShpdiwgZHN0LCA4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgeHRlYV9jcnlwdF9lY2IoY3R4LCBkc3QsIHNyYywgZGVjcnlwdCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgICArPSA4OworICAgICAgICAgICAgZHN0ICAgKz0gODsKKyAgICAgICAgfQorICAgIH0KK30KKworI2lmZGVmIFRFU1QKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIFhURUFfTlVNX1RFU1RTIDYKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgeHRlYV90ZXN0X2tleVtYVEVBX05VTV9URVNUU11bMTZdID0geworICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYgfSwKKyAgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmIH0sCisgICAgeyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiB9LAorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB4dGVhX3Rlc3RfcHRbWFRFQV9OVU1fVEVTVFNdWzhdID0geworICAgIHsgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCB9LAorICAgIHsgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSB9LAorICAgIHsgMHg1YSwgMHg1YiwgMHg2ZSwgMHgyNywgMHg4OSwgMHg0OCwgMHhkNywgMHg3ZiB9LAorICAgIHsgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCB9LAorICAgIHsgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSB9LAorICAgIHsgMHg3MCwgMHhlMSwgMHgyMiwgMHg1ZCwgMHg2ZSwgMHg0ZSwgMHg3NiwgMHg1NSB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB4dGVhX3Rlc3RfY3RbWFRFQV9OVU1fVEVTVFNdWzhdID0geworICAgIHsgMHg0OSwgMHg3ZCwgMHhmMywgMHhkMCwgMHg3MiwgMHg2MSwgMHgyYywgMHhiNSB9LAorICAgIHsgMHhlNywgMHg4ZiwgMHgyZCwgMHgxMywgMHg3NCwgMHg0MywgMHg0MSwgMHhkOCB9LAorICAgIHsgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSB9LAorICAgIHsgMHhhMCwgMHgzOSwgMHgwNSwgMHg4OSwgMHhmOCwgMHhiOCwgMHhlZiwgMHhhNSB9LAorICAgIHsgMHhlZCwgMHgyMywgMHgzNywgMHg1YSwgMHg4MiwgMHgxYSwgMHg4YywgMHgyZCB9LAorICAgIHsgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSwgMHg0MSB9Cit9OworCitzdGF0aWMgdm9pZCB0ZXN0X3h0ZWEoQVZYVEVBICpjdHgsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlZiwgaW50IGxlbiwgdWludDhfdCAqaXYsIGludCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGVzdCkKK3sKKyAgICBhdl94dGVhX2NyeXB0KGN0eCwgZHN0LCBzcmMsIGxlbiwgaXYsIGRpcik7CisgICAgaWYgKG1lbWNtcChkc3QsIHJlZiwgOCpsZW4pKSB7CisgICAgICAgIGludCBpOworICAgICAgICBwcmludGYoIiVzIGZhaWxlZFxuZ290ICAgICAgIiwgdGVzdCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4KmxlbjsgaSsrKQorICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGRzdFtpXSk7CisgICAgICAgIHByaW50ZigiXG5leHBlY3RlZCAiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDgqbGVuOyBpKyspCisgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgcmVmW2ldKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBBVlhURUEgY3R4OworICAgIHVpbnQ4X3QgYnVmWzhdLCBpdls4XTsKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBzcmNbMzJdID0gIkhlbGxvV29ybGRIZWxsb1dvcmxkSGVsbG9Xb3JsZCI7CisgICAgdWludDhfdCBjdFszMl07CisgICAgdWludDhfdCBwbFszMl07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgWFRFQV9OVU1fVEVTVFM7IGkrKykgeworICAgICAgICBhdl94dGVhX2luaXQoJmN0eCwgeHRlYV90ZXN0X2tleVtpXSk7CisKKyAgICAgICAgdGVzdF94dGVhKCZjdHgsIGJ1ZiwgeHRlYV90ZXN0X3B0W2ldLCB4dGVhX3Rlc3RfY3RbaV0sIDEsIE5VTEwsIDAsICJlbmNyeXB0aW9uIik7CisgICAgICAgIHRlc3RfeHRlYSgmY3R4LCBidWYsIHh0ZWFfdGVzdF9jdFtpXSwgeHRlYV90ZXN0X3B0W2ldLCAxLCBOVUxMLCAxLCAiZGVjcnlwdGlvbiIpOworCisgICAgICAgIC8qIGVuY3J5cHQgKi8KKyAgICAgICAgbWVtY3B5KGl2LCAiSEFMTE8xMjMiLCA4KTsKKyAgICAgICAgYXZfeHRlYV9jcnlwdCgmY3R4LCBjdCwgc3JjLCA0LCBpdiwgMCk7CisKKyAgICAgICAgLyogZGVjcnlwdCBpbnRvIHBsICovCisgICAgICAgIG1lbWNweShpdiwgIkhBTExPMTIzIiwgOCk7CisgICAgICAgIHRlc3RfeHRlYSgmY3R4LCBwbCwgY3QsIHNyYywgNCwgaXYsIDEsICJDQkMgZGVjcnlwdGlvbiIpOworCisgICAgICAgIG1lbWNweShpdiwgIkhBTExPMTIzIiwgOCk7CisgICAgICAgIHRlc3RfeHRlYSgmY3R4LCBjdCwgY3QsIHNyYywgNCwgaXYsIDEsICJDQkMgaW5wbGFjZSBkZWNyeXB0aW9uIik7CisgICAgfQorCisgICAgcHJpbnRmKCJUZXN0IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBzdWNjZXNzLlxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGliYXZ1dGlsL3h0ZWEuaCBiL2ZmbXBlZy9saWJhdnV0aWwveHRlYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMWU3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGliYXZ1dGlsL3h0ZWEuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQSAzMi1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFhURUEgYWxnb3JpdGhtCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgU2FtdWVsIFBpdG9pc2V0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX1hURUFfSAorI2RlZmluZSBBVlVUSUxfWFRFQV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIFB1YmxpYyBoZWFkZXIgZm9yIGxpYmF2dXRpbCBYVEVBIGFsZ29yaXRobQorICogQGRlZmdyb3VwIGxhdnVfeHRlYSBYVEVBCisgKiBAaW5ncm91cCBsYXZ1X2NyeXB0bworICogQHsKKyAqLworCit0eXBlZGVmIHN0cnVjdCBBVlhURUEgeworICAgIHVpbnQzMl90IGtleVsxNl07Cit9IEFWWFRFQTsKKworLyoqCisgKiBJbml0aWFsaXplIGFuIEFWWFRFQSBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBjdHggYW4gQVZYVEVBIGNvbnRleHQKKyAqIEBwYXJhbSBrZXkgYSBrZXkgb2YgMTYgYnl0ZXMgdXNlZCBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgKi8KK3ZvaWQgYXZfeHRlYV9pbml0KHN0cnVjdCBBVlhURUEgKmN0eCwgY29uc3QgdWludDhfdCBrZXlbMTZdKTsKKworLyoqCisgKiBFbmNyeXB0IG9yIGRlY3J5cHQgYSBidWZmZXIgdXNpbmcgYSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGNvbnRleHQuCisgKgorICogQHBhcmFtIGN0eCBhbiBBVlhURUEgY29udGV4dAorICogQHBhcmFtIGRzdCBkZXN0aW5hdGlvbiBhcnJheSwgY2FuIGJlIGVxdWFsIHRvIHNyYworICogQHBhcmFtIHNyYyBzb3VyY2UgYXJyYXksIGNhbiBiZSBlcXVhbCB0byBkc3QKKyAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2YgOCBieXRlIGJsb2NrcworICogQHBhcmFtIGl2IGluaXRpYWxpemF0aW9uIHZlY3RvciBmb3IgQ0JDIG1vZGUsIGlmIE5VTEwgdGhlbiBFQ0Igd2lsbCBiZSB1c2VkCisgKiBAcGFyYW0gZGVjcnlwdCAwIGZvciBlbmNyeXB0aW9uLCAxIGZvciBkZWNyeXB0aW9uCisgKi8KK3ZvaWQgYXZfeHRlYV9jcnlwdChzdHJ1Y3QgQVZYVEVBICpjdHgsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdWludDhfdCAqaXYsIGludCBkZWNyeXB0KTsKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBVlVUSUxfWFRFQV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlicG9zdHByb2MvTWFrZWZpbGUgYi9mZm1wZWcvbGlicG9zdHByb2MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliYjRiZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJwb3N0cHJvYy9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACitpbmNsdWRlICQoU1VCRElSKS4uL2NvbmZpZy5tYWsKKworTkFNRSA9IHBvc3Rwcm9jCitGRkxJQlMgPSBhdnV0aWwKKworSEVBREVSUyA9IHBvc3Rwcm9jZXNzLmggICAgICAgIFwKKyAgICAgICAgICB2ZXJzaW9uLmggICAgICAgICAgICBcCisKK09CSlMgPSBwb3N0cHJvY2Vzcy5vCisKKyMgV2luZG93cyByZXNvdXJjZSBmaWxlCitTTElCT0JKUy0kKEhBVkVfR05VX1dJTkRSRVMpICs9IHBvc3Rwcm9jcmVzLm8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJwb3N0cHJvYy9saWJwb3N0cHJvYy52IGIvZmZtcGVnL2xpYnBvc3Rwcm9jL2xpYnBvc3Rwcm9jLnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1ZDc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJwb3N0cHJvYy9saWJwb3N0cHJvYy52CkBAIC0wLDAgKzEsNCBAQAorTElCUE9TVFBST0NfJE1BSk9SIHsKKyAgICAgICAgZ2xvYmFsOiBwb3N0cHJvY18qOyBwcF8qOworICAgICAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlicG9zdHByb2MvcG9zdHByb2Nlc3MuYyBiL2ZmbXBlZy9saWJwb3N0cHJvYy9wb3N0cHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZmIzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlicG9zdHByb2MvcG9zdHByb2Nlc3MuYwpAQCAtMCwwICsxLDEwNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIChtaWNoYWVsbmlAZ214LmF0KQorICoKKyAqIEFsdGlWZWMgb3B0aW1pemF0aW9ucyAoQykgMjAwNCBSb21haW4gRG9sYmVhdSA8cm9tYWluQGRvbGJlYXUub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogcG9zdHByb2Nlc3NpbmcuCisgKi8KKworLyoKKyAgICAgICAgICAgICAgICAgICAgICAgIEMgICAgICAgTU1YICAgICBNTVgyICAgIDNETm93ICAgQWx0aVZlYworaXNWZXJ0REMgICAgICAgICAgICAgICAgRWMgICAgICBFYyAgICAgICAgICAgICAgICAgICAgICBFYworaXNWZXJ0TWluTWF4T2sgICAgICAgICAgRWMgICAgICBFYyAgICAgICAgICAgICAgICAgICAgICBFYworZG9WZXJ0TG93UGFzcyAgICAgICAgICAgRSAgICAgICAgICAgICAgIGUgICAgICAgZSAgICAgICBFYworZG9WZXJ0RGVmRmlsdGVyICAgICAgICAgRWMgICAgICBFYyAgICAgIGUgICAgICAgZSAgICAgICBFYworaXNIb3JpekRDICAgICAgICAgICAgICAgRWMgICAgICBFYyAgICAgICAgICAgICAgICAgICAgICBFYworaXNIb3Jpek1pbk1heE9rICAgICAgICAgYSAgICAgICBFICAgICAgICAgICAgICAgICAgICAgICBFYworZG9Ib3Jpekxvd1Bhc3MgICAgICAgICAgRSAgICAgICAgICAgICAgIGUgICAgICAgZSAgICAgICBFYworZG9Ib3JpekRlZkZpbHRlciAgICAgICAgRWMgICAgICBFYyAgICAgIGUgICAgICAgZSAgICAgICBFYworZG9fYV9kZWJsb2NrICAgICAgICAgICAgRWMgICAgICBFICAgICAgIEVjICAgICAgRQorZGVSaW5nICAgICAgICAgICAgICAgICAgRSAgICAgICAgICAgICAgIGUgICAgICAgZSogICAgICBFY3AKK1ZlcnRpY2FsIFJLQWxnbzEgICAgICAgIEUgICAgICAgICAgICAgICBhICAgICAgIGEKK0hvcml6b250YWwgUktBbGdvMSAgICAgICAgICAgICAgICAgICAgICBhICAgICAgIGEKK1ZlcnRpY2FsIFgxIyAgICAgICAgICAgIGEgICAgICAgICAgICAgICBFICAgICAgIEUKK0hvcml6b250YWwgWDEjICAgICAgICAgIGEgICAgICAgICAgICAgICBFICAgICAgIEUKK0xpbklwb2xEZWludGVybGFjZSAgICAgIGUgICAgICAgICAgICAgICBFICAgICAgIEUqCitDdWJpY0lwb2xEZWludGVybGFjZSAgICBhICAgICAgICAgICAgICAgZSAgICAgICBlKgorTGluQmxlbmREZWludGVybGFjZSAgICAgZSAgICAgICAgICAgICAgIEUgICAgICAgRSoKK01lZGlhbkRlaW50ZXJsYWNlIyAgICAgIEUgICAgICAgRWMgICAgICBFYworVGVtcERlTm9pc2VyIyAgICAgICAgICAgRSAgICAgICAgICAgICAgIGUgICAgICAgZSAgICAgICBFYworCisqIEkgZG8gbm90IGhhdmUgYSAzRE5vdyEgQ1BVIC0+IGl0IGlzIHVudGVzdGVkLCBidXQgbm8gb25lIHNhaWQgaXQgZG9lcyBub3Qgd29yayBzbyBpdCBzZWVtcyB0byB3b3JrCisjIG1vcmUgb3IgbGVzcyBzZWxmaW52ZW50ZWQgZmlsdGVycyBzbyB0aGUgZXhhY3RuZXNzIGlzIG5vdCB0b28gbWVhbmluZ2Z1bAorRSA9IEV4YWN0IGltcGxlbWVudGF0aW9uCitlID0gYWxtb3N0IGV4YWN0IGltcGxlbWVudGF0aW9uIChzbGlnaHRseSBkaWZmZXJlbnQgcm91bmRpbmcsLi4uKQorYSA9IGFsdGVybmF0aXZlIC8gYXBwcm94aW1hdGUgaW1wbAorYyA9IGNoZWNrZWQgYWdhaW5zdCB0aGUgb3RoZXIgaW1wbGVtZW50YXRpb25zICgtdm8gbWQ1KQorcCA9IHBhcnRpYWxseSBvcHRpbWl6ZWQsIHN0aWxsIHNvbWUgd29yayB0byBkbworKi8KKworLyoKK1RPRE86CityZWR1Y2UgdGhlIHRpbWUgd2FzdGVkIG9uIHRoZSBtZW0gdHJhbnNmZXIKK3Vucm9sbCBzdHVmZiBpZiBpbnN0cnVjdGlvbnMgZGVwZW5kIHRvbyBtdWNoIG9uIHRoZSBwcmlvciBvbmUKK21vdmUgWVNjYWxlIHRoaW5nIHRvIHRoZSBlbmQgaW5zdGVhZCBvZiBmaXhpbmcgUVAKK3dyaXRlIGEgZmFzdGVyIGFuZCBoaWdoZXIgcXVhbGl0eSBkZWJsb2NraW5nIGZpbHRlciA6KQorbWFrZSB0aGUgbWFpbmxvb3AgbW9yZSBmbGV4aWJsZSAodmFyaWFibGUgbnVtYmVyIG9mIGJsb2NrcyBhdCBvbmNlCisgICAgICAgICh0aGUgaWYvZWxzZSBzdHVmZiBwZXIgYmxvY2sgaXMgc2xvd2luZyB0aGluZ3MgZG93bikKK2NvbXBhcmUgdGhlIHF1YWxpdHkgJiBzcGVlZCBvZiBhbGwgZmlsdGVycworc3BsaXQgdGhpcyBodWdlIGZpbGUKK29wdGltaXplIGMgdmVyc2lvbnMKK3RyeSB0byB1bnJvbGwgaW5uZXIgZm9yKHg9MCAuLi4gbG9vcCB0byBhdm9pZCB0aGVzZSBkYW1uIGlmKHggLi4uIGNoZWNrcworLi4uCisqLworCisvL0NoYW5nZWxvZzogdXNlIGdpdCBsb2cKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisvLyN1bmRlZiBIQVZFX01NWEVYVF9JTkxJTkUKKy8vI2RlZmluZSBIQVZFX0FNRDNETk9XX0lOTElORQorLy8jdW5kZWYgSEFWRV9NTVhfSU5MSU5FCisvLyN1bmRlZiBBUkNIX1g4NgorLy8jZGVmaW5lIERFQlVHX0JSSUdIVE5FU1MKKyNpbmNsdWRlICJwb3N0cHJvY2Vzcy5oIgorI2luY2x1ZGUgInBvc3Rwcm9jZXNzX2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisKK3Vuc2lnbmVkIHBvc3Rwcm9jX3ZlcnNpb24odm9pZCkKK3sKKyAgICBhdl9hc3NlcnQwKExJQlBPU1RQUk9DX1ZFUlNJT05fTUlDUk8gPj0gMTAwKTsKKyAgICByZXR1cm4gTElCUE9TVFBST0NfVkVSU0lPTl9JTlQ7Cit9CisKK2NvbnN0IGNoYXIgKnBvc3Rwcm9jX2NvbmZpZ3VyYXRpb24odm9pZCkKK3sKKyAgICByZXR1cm4gRkZNUEVHX0NPTkZJR1VSQVRJT047Cit9CisKK2NvbnN0IGNoYXIgKnBvc3Rwcm9jX2xpY2Vuc2Uodm9pZCkKK3sKKyNkZWZpbmUgTElDRU5TRV9QUkVGSVggImxpYnBvc3Rwcm9jIGxpY2Vuc2U6ICIKKyAgICByZXR1cm4gTElDRU5TRV9QUkVGSVggRkZNUEVHX0xJQ0VOU0UgKyBzaXplb2YoTElDRU5TRV9QUkVGSVgpIC0gMTsKK30KKworI2lmIEhBVkVfQUxUSVZFQ19ICisjaW5jbHVkZSA8YWx0aXZlYy5oPgorI2VuZGlmCisKKyNkZWZpbmUgR0VUX01PREVfQlVGRkVSX1NJWkUgNTAwCisjZGVmaW5lIE9QVElPTlNfQVJSQVlfU0laRSAxMAorI2RlZmluZSBCTE9DS19TSVpFIDgKKyNkZWZpbmUgVEVNUF9TVFJJREUgOAorLy8jZGVmaW5lIE5VTV9CTE9DS1NfQVRfT05DRSAxNiAvL25vdCB1c2VkIHlldAorCisjaWYgQVJDSF9YODYgJiYgSEFWRV9JTkxJTkVfQVNNCitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgdzA1KT0gMHgwMDA1MDAwNTAwMDUwMDA1TEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgdzA0KT0gMHgwMDA0MDAwNDAwMDQwMDA0TEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgdzIwKT0gMHgwMDIwMDAyMDAwMjAwMDIwTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgYjAwKT0gMHgwMDAwMDAwMDAwMDAwMDAwTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgYjAxKT0gMHgwMTAxMDEwMTAxMDEwMTAxTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgYjAyKT0gMHgwMjAyMDIwMjAyMDIwMjAyTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgYjA4KT0gMHgwODA4MDgwODA4MDgwODA4TEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgYjgwKT0gMHg4MDgwODA4MDgwODA4MDgwTEw7CisjZW5kaWYKKworREVDTEFSRV9BU01fQ09OU1QoOCwgaW50LCBkZXJpbmdUaHJlc2hvbGQpPSAyMDsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IFBQRmlsdGVyIGZpbHRlcnNbXT0KK3sKKyAgICB7ImhiIiwgImhkZWJsb2NrIiwgICAgICAgICAgICAgIDEsIDEsIDMsIEhfREVCTE9DS30sCisgICAgeyJ2YiIsICJ2ZGVibG9jayIsICAgICAgICAgICAgICAxLCAyLCA0LCBWX0RFQkxPQ0t9LAorLyogIHsiaHIiLCAicmtoZGVibG9jayIsICAgICAgICAgICAgMSwgMSwgMywgSF9SSzFfRklMVEVSfSwKKyAgICB7InZyIiwgInJrdmRlYmxvY2siLCAgICAgICAgICAgIDEsIDIsIDQsIFZfUksxX0ZJTFRFUn0sKi8KKyAgICB7ImgxIiwgIngxaGRlYmxvY2siLCAgICAgICAgICAgIDEsIDEsIDMsIEhfWDFfRklMVEVSfSwKKyAgICB7InYxIiwgIngxdmRlYmxvY2siLCAgICAgICAgICAgIDEsIDIsIDQsIFZfWDFfRklMVEVSfSwKKyAgICB7ImhhIiwgImFoZGVibG9jayIsICAgICAgICAgICAgIDEsIDEsIDMsIEhfQV9ERUJMT0NLfSwKKyAgICB7InZhIiwgImF2ZGVibG9jayIsICAgICAgICAgICAgIDEsIDIsIDQsIFZfQV9ERUJMT0NLfSwKKyAgICB7ImRyIiwgImRlcmluZyIsICAgICAgICAgICAgICAgIDEsIDUsIDYsIERFUklOR30sCisgICAgeyJhbCIsICJhdXRvbGV2ZWxzIiwgICAgICAgICAgICAwLCAxLCAyLCBMRVZFTF9GSVh9LAorICAgIHsibGIiLCAibGluYmxlbmRkZWludCIsICAgICAgICAgMSwgMSwgNCwgTElORUFSX0JMRU5EX0RFSU5UX0ZJTFRFUn0sCisgICAgeyJsaSIsICJsaW5pcG9sZGVpbnQiLCAgICAgICAgICAxLCAxLCA0LCBMSU5FQVJfSVBPTF9ERUlOVF9GSUxURVJ9LAorICAgIHsiY2kiLCAiY3ViaWNpcG9sZGVpbnQiLCAgICAgICAgMSwgMSwgNCwgQ1VCSUNfSVBPTF9ERUlOVF9GSUxURVJ9LAorICAgIHsibWQiLCAibWVkaWFuZGVpbnQiLCAgICAgICAgICAgMSwgMSwgNCwgTUVESUFOX0RFSU5UX0ZJTFRFUn0sCisgICAgeyJmZCIsICJmZm1wZWdkZWludCIsICAgICAgICAgICAxLCAxLCA0LCBGRk1QRUdfREVJTlRfRklMVEVSfSwKKyAgICB7Imw1IiwgImxvd3Bhc3M1IiwgICAgICAgICAgICAgIDEsIDEsIDQsIExPV1BBU1M1X0RFSU5UX0ZJTFRFUn0sCisgICAgeyJ0biIsICJ0bXBub2lzZSIsICAgICAgICAgICAgICAxLCA3LCA4LCBURU1QX05PSVNFX0ZJTFRFUn0sCisgICAgeyJmcSIsICJmb3JjZXF1YW50IiwgICAgICAgICAgICAxLCAwLCAwLCBGT1JDRV9RVUFOVH0sCisgICAgeyJiZSIsICJiaXRleGFjdCIsICAgICAgICAgICAgICAxLCAwLCAwLCBCSVRFWEFDVH0sCisgICAgeyJ2aSIsICJ2aXN1YWxpemUiLCAgICAgICAgICAgICAxLCAwLCAwLCBWSVNVQUxJWkV9LAorICAgIHtOVUxMLCBOVUxMLDAsMCwwLDB9IC8vRW5kIE1hcmtlcgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByZXBsYWNlVGFibGVbXT0KK3sKKyAgICAiZGVmYXVsdCIsICAgICAgImhiOmEsdmI6YSxkcjphIiwKKyAgICAiZGUiLCAgICAgICAgICAgImhiOmEsdmI6YSxkcjphIiwKKyAgICAiZmFzdCIsICAgICAgICAgImgxOmEsdjE6YSxkcjphIiwKKyAgICAiZmEiLCAgICAgICAgICAgImgxOmEsdjE6YSxkcjphIiwKKyAgICAiYWMiLCAgICAgICAgICAgImhhOmE6MTI4OjcsdmE6YSxkcjphIiwKKyAgICBOVUxMIC8vRW5kIE1hcmtlcgorfTsKKworCisjaWYgQVJDSF9YODYgJiYgSEFWRV9JTkxJTkVfQVNNCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlZmV0Y2hudGEoY29uc3Qgdm9pZCAqcCkKK3sKKyAgICBfX2FzbV9fIHZvbGF0aWxlKCAgICJwcmVmZXRjaG50YSAoJTApXG5cdCIKKyAgICAgICAgOiA6ICJyIiAocCkKKyAgICApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlZmV0Y2h0MChjb25zdCB2b2lkICpwKQoreworICAgIF9fYXNtX18gdm9sYXRpbGUoICAgInByZWZldGNodDAgKCUwKVxuXHQiCisgICAgICAgIDogOiAiciIgKHApCisgICAgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNodDEoY29uc3Qgdm9pZCAqcCkKK3sKKyAgICBfX2FzbV9fIHZvbGF0aWxlKCAgICJwcmVmZXRjaHQxICglMClcblx0IgorICAgICAgICA6IDogInIiIChwKQorICAgICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVmZXRjaHQyKGNvbnN0IHZvaWQgKnApCit7CisgICAgX19hc21fXyB2b2xhdGlsZSggICAicHJlZmV0Y2h0MiAoJTApXG5cdCIKKyAgICAgICAgOiA6ICJyIiAocCkKKyAgICApOworfQorI2VuZGlmCisKKy8qIFRoZSBob3Jpem9udGFsIGZ1bmN0aW9ucyBleGlzdCBvbmx5IGluIEMgYmVjYXVzZSB0aGUgTU1YCisgKiBjb2RlIGlzIGZhc3RlciB3aXRoIHZlcnRpY2FsIGZpbHRlcnMgYW5kIHRyYW5zcG9zaW5nLiAqLworCisvKioKKyAqIENoZWNrIGlmIHRoZSBnaXZlbiA4eDggQmxvY2sgaXMgbW9zdGx5ICJmbGF0IgorICovCitzdGF0aWMgaW5saW5lIGludCBpc0hvcml6RENfQyhjb25zdCB1aW50OF90IHNyY1tdLCBpbnQgc3RyaWRlLCBjb25zdCBQUENvbnRleHQgKmMpCit7CisgICAgaW50IG51bUVxPSAwOworICAgIGludCB5OworICAgIGNvbnN0IGludCBkY09mZnNldD0gKChjLT5ub25CUVAqYy0+cHBNb2RlLmJhc2VEY0RpZmYpPj44KSArIDE7CisgICAgY29uc3QgaW50IGRjVGhyZXNob2xkPSBkY09mZnNldCoyICsgMTsKKworICAgIGZvcih5PTA7IHk8QkxPQ0tfU0laRTsgeSsrKXsKKyAgICAgICAgbnVtRXEgKz0gKCh1bnNpZ25lZCkoc3JjWzBdIC0gc3JjWzFdICsgZGNPZmZzZXQpKSA8IGRjVGhyZXNob2xkOworICAgICAgICBudW1FcSArPSAoKHVuc2lnbmVkKShzcmNbMV0gLSBzcmNbMl0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1syXSAtIHNyY1szXSArIGRjT2Zmc2V0KSkgPCBkY1RocmVzaG9sZDsKKyAgICAgICAgbnVtRXEgKz0gKCh1bnNpZ25lZCkoc3JjWzNdIC0gc3JjWzRdICsgZGNPZmZzZXQpKSA8IGRjVGhyZXNob2xkOworICAgICAgICBudW1FcSArPSAoKHVuc2lnbmVkKShzcmNbNF0gLSBzcmNbNV0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1s1XSAtIHNyY1s2XSArIGRjT2Zmc2V0KSkgPCBkY1RocmVzaG9sZDsKKyAgICAgICAgbnVtRXEgKz0gKCh1bnNpZ25lZCkoc3JjWzZdIC0gc3JjWzddICsgZGNPZmZzZXQpKSA8IGRjVGhyZXNob2xkOworICAgICAgICBzcmMrPSBzdHJpZGU7CisgICAgfQorICAgIHJldHVybiBudW1FcSA+IGMtPnBwTW9kZS5mbGF0bmVzc1RocmVzaG9sZDsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgbWlkZGxlIDh4OCBCbG9jayBpbiB0aGUgZ2l2ZW4gOHgxNiBibG9jayBpcyBmbGF0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzVmVydERDX0MoY29uc3QgdWludDhfdCBzcmNbXSwgaW50IHN0cmlkZSwgY29uc3QgUFBDb250ZXh0ICpjKQoreworICAgIGludCBudW1FcT0gMDsKKyAgICBpbnQgeTsKKyAgICBjb25zdCBpbnQgZGNPZmZzZXQ9ICgoYy0+bm9uQlFQKmMtPnBwTW9kZS5iYXNlRGNEaWZmKT4+OCkgKyAxOworICAgIGNvbnN0IGludCBkY1RocmVzaG9sZD0gZGNPZmZzZXQqMiArIDE7CisKKyAgICBzcmMrPSBzdHJpZGUqNDsgLy8gc3JjIHBvaW50cyB0byBiZWdpbiBvZiB0aGUgOHg4IEJsb2NrCisgICAgZm9yKHk9MDsgeTxCTE9DS19TSVpFLTE7IHkrKyl7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1swXSAtIHNyY1swK3N0cmlkZV0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1sxXSAtIHNyY1sxK3N0cmlkZV0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1syXSAtIHNyY1syK3N0cmlkZV0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1szXSAtIHNyY1szK3N0cmlkZV0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1s0XSAtIHNyY1s0K3N0cmlkZV0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1s1XSAtIHNyY1s1K3N0cmlkZV0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1s2XSAtIHNyY1s2K3N0cmlkZV0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1s3XSAtIHNyY1s3K3N0cmlkZV0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIHNyYys9IHN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIG51bUVxID4gYy0+cHBNb2RlLmZsYXRuZXNzVGhyZXNob2xkOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc0hvcml6TWluTWF4T2tfQyhjb25zdCB1aW50OF90IHNyY1tdLCBpbnQgc3RyaWRlLCBpbnQgUVApCit7CisgICAgaW50IGk7CisgICAgZm9yKGk9MDsgaTwyOyBpKyspeworICAgICAgICBpZigodW5zaWduZWQpKHNyY1swXSAtIHNyY1s1XSArIDIqUVApID4gNCpRUCkgcmV0dXJuIDA7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIGlmKCh1bnNpZ25lZCkoc3JjWzJdIC0gc3JjWzddICsgMipRUCkgPiA0KlFQKSByZXR1cm4gMDsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgaWYoKHVuc2lnbmVkKShzcmNbNF0gLSBzcmNbMV0gKyAyKlFQKSA+IDQqUVApIHJldHVybiAwOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBpZigodW5zaWduZWQpKHNyY1s2XSAtIHNyY1szXSArIDIqUVApID4gNCpRUCkgcmV0dXJuIDA7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc1ZlcnRNaW5NYXhPa19DKGNvbnN0IHVpbnQ4X3Qgc3JjW10sIGludCBzdHJpZGUsIGludCBRUCkKK3sKKyAgICBpbnQgeDsKKyAgICBzcmMrPSBzdHJpZGUqNDsKKyAgICBmb3IoeD0wOyB4PEJMT0NLX1NJWkU7IHgrPTQpeworICAgICAgICBpZigodW5zaWduZWQpKHNyY1sgIHggKyAwKnN0cmlkZV0gLSBzcmNbICB4ICsgNSpzdHJpZGVdICsgMipRUCkgPiA0KlFQKSByZXR1cm4gMDsKKyAgICAgICAgaWYoKHVuc2lnbmVkKShzcmNbMSt4ICsgMipzdHJpZGVdIC0gc3JjWzEreCArIDcqc3RyaWRlXSArIDIqUVApID4gNCpRUCkgcmV0dXJuIDA7CisgICAgICAgIGlmKCh1bnNpZ25lZCkoc3JjWzIreCArIDQqc3RyaWRlXSAtIHNyY1syK3ggKyAxKnN0cmlkZV0gKyAyKlFQKSA+IDQqUVApIHJldHVybiAwOworICAgICAgICBpZigodW5zaWduZWQpKHNyY1szK3ggKyA2KnN0cmlkZV0gLSBzcmNbMyt4ICsgMypzdHJpZGVdICsgMipRUCkgPiA0KlFQKSByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhvcml6Q2xhc3NpZnlfQyhjb25zdCB1aW50OF90IHNyY1tdLCBpbnQgc3RyaWRlLCBjb25zdCBQUENvbnRleHQgKmMpCit7CisgICAgaWYoIGlzSG9yaXpEQ19DKHNyYywgc3RyaWRlLCBjKSApeworICAgICAgICByZXR1cm4gaXNIb3Jpek1pbk1heE9rX0Moc3JjLCBzdHJpZGUsIGMtPlFQKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCB2ZXJ0Q2xhc3NpZnlfQyhjb25zdCB1aW50OF90IHNyY1tdLCBpbnQgc3RyaWRlLCBjb25zdCBQUENvbnRleHQgKmMpCit7CisgICAgaWYoIGlzVmVydERDX0Moc3JjLCBzdHJpZGUsIGMpICl7CisgICAgICAgIHJldHVybiBpc1ZlcnRNaW5NYXhPa19DKHNyYywgc3RyaWRlLCBjLT5RUCk7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiAyOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRvSG9yaXpEZWZGaWx0ZXJfQyh1aW50OF90IGRzdFtdLCBpbnQgc3RyaWRlLCBjb25zdCBQUENvbnRleHQgKmMpCit7CisgICAgaW50IHk7CisgICAgZm9yKHk9MDsgeTxCTE9DS19TSVpFOyB5KyspeworICAgICAgICBjb25zdCBpbnQgbWlkZGxlRW5lcmd5PSA1Kihkc3RbNF0gLSBkc3RbM10pICsgMiooZHN0WzJdIC0gZHN0WzVdKTsKKworICAgICAgICBpZihGRkFCUyhtaWRkbGVFbmVyZ3kpIDwgOCpjLT5RUCl7CisgICAgICAgICAgICBjb25zdCBpbnQgcT0oZHN0WzNdIC0gZHN0WzRdKS8yOworICAgICAgICAgICAgY29uc3QgaW50IGxlZnRFbmVyZ3k9ICA1Kihkc3RbMl0gLSBkc3RbMV0pICsgMiooZHN0WzBdIC0gZHN0WzNdKTsKKyAgICAgICAgICAgIGNvbnN0IGludCByaWdodEVuZXJneT0gNSooZHN0WzZdIC0gZHN0WzVdKSArIDIqKGRzdFs0XSAtIGRzdFs3XSk7CisKKyAgICAgICAgICAgIGludCBkPSBGRkFCUyhtaWRkbGVFbmVyZ3kpIC0gRkZNSU4oIEZGQUJTKGxlZnRFbmVyZ3kpLCBGRkFCUyhyaWdodEVuZXJneSkgKTsKKyAgICAgICAgICAgIGQ9IEZGTUFYKGQsIDApOworCisgICAgICAgICAgICBkPSAoNSpkICsgMzIpID4+IDY7CisgICAgICAgICAgICBkKj0gRkZTSUdOKC1taWRkbGVFbmVyZ3kpOworCisgICAgICAgICAgICBpZihxPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZCA9IEZGTUFYKGQsIDApOworICAgICAgICAgICAgICAgIGQgPSBGRk1JTihkLCBxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gRkZNSU4oZCwgMCk7CisgICAgICAgICAgICAgICAgZCA9IEZGTUFYKGQsIHEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbM10tPSBkOworICAgICAgICAgICAgZHN0WzRdKz0gZDsKKyAgICAgICAgfQorICAgICAgICBkc3QrPSBzdHJpZGU7CisgICAgfQorfQorCisvKioKKyAqIERvIGEgaG9yaXpvbnRhbCBsb3cgcGFzcyBmaWx0ZXIgb24gdGhlIDEweDggYmxvY2sgKGRzdCBwb2ludHMgdG8gbWlkZGxlIDh4OCBCbG9jaykKKyAqIHVzaW5nIHRoZSA5LVRhcCBGaWx0ZXIgKDEsMSwyLDIsNCwyLDIsMSwxKS8xNiAoQyB2ZXJzaW9uKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZG9Ib3Jpekxvd1Bhc3NfQyh1aW50OF90IGRzdFtdLCBpbnQgc3RyaWRlLCBjb25zdCBQUENvbnRleHQgKmMpCit7CisgICAgaW50IHk7CisgICAgZm9yKHk9MDsgeTxCTE9DS19TSVpFOyB5KyspeworICAgICAgICBjb25zdCBpbnQgZmlyc3Q9IEZGQUJTKGRzdFstMV0gLSBkc3RbMF0pIDwgYy0+UVAgPyBkc3RbLTFdIDogZHN0WzBdOworICAgICAgICBjb25zdCBpbnQgbGFzdD0gRkZBQlMoZHN0WzhdIC0gZHN0WzddKSA8IGMtPlFQID8gZHN0WzhdIDogZHN0WzddOworCisgICAgICAgIGludCBzdW1zWzEwXTsKKyAgICAgICAgc3Vtc1swXSA9IDQqZmlyc3QgKyBkc3RbMF0gKyBkc3RbMV0gKyBkc3RbMl0gKyA0OworICAgICAgICBzdW1zWzFdID0gc3Vtc1swXSAtIGZpcnN0ICArIGRzdFszXTsKKyAgICAgICAgc3Vtc1syXSA9IHN1bXNbMV0gLSBmaXJzdCAgKyBkc3RbNF07CisgICAgICAgIHN1bXNbM10gPSBzdW1zWzJdIC0gZmlyc3QgICsgZHN0WzVdOworICAgICAgICBzdW1zWzRdID0gc3Vtc1szXSAtIGZpcnN0ICArIGRzdFs2XTsKKyAgICAgICAgc3Vtc1s1XSA9IHN1bXNbNF0gLSBkc3RbMF0gKyBkc3RbN107CisgICAgICAgIHN1bXNbNl0gPSBzdW1zWzVdIC0gZHN0WzFdICsgbGFzdDsKKyAgICAgICAgc3Vtc1s3XSA9IHN1bXNbNl0gLSBkc3RbMl0gKyBsYXN0OworICAgICAgICBzdW1zWzhdID0gc3Vtc1s3XSAtIGRzdFszXSArIGxhc3Q7CisgICAgICAgIHN1bXNbOV0gPSBzdW1zWzhdIC0gZHN0WzRdICsgbGFzdDsKKworICAgICAgICBkc3RbMF09IChzdW1zWzBdICsgc3Vtc1syXSArIDIqZHN0WzBdKT4+NDsKKyAgICAgICAgZHN0WzFdPSAoc3Vtc1sxXSArIHN1bXNbM10gKyAyKmRzdFsxXSk+PjQ7CisgICAgICAgIGRzdFsyXT0gKHN1bXNbMl0gKyBzdW1zWzRdICsgMipkc3RbMl0pPj40OworICAgICAgICBkc3RbM109IChzdW1zWzNdICsgc3Vtc1s1XSArIDIqZHN0WzNdKT4+NDsKKyAgICAgICAgZHN0WzRdPSAoc3Vtc1s0XSArIHN1bXNbNl0gKyAyKmRzdFs0XSk+PjQ7CisgICAgICAgIGRzdFs1XT0gKHN1bXNbNV0gKyBzdW1zWzddICsgMipkc3RbNV0pPj40OworICAgICAgICBkc3RbNl09IChzdW1zWzZdICsgc3Vtc1s4XSArIDIqZHN0WzZdKT4+NDsKKyAgICAgICAgZHN0WzddPSAoc3Vtc1s3XSArIHN1bXNbOV0gKyAyKmRzdFs3XSk+PjQ7CisKKyAgICAgICAgZHN0Kz0gc3RyaWRlOworICAgIH0KK30KKworLyoqCisgKiBFeHBlcmltZW50YWwgRmlsdGVyIDEgKEhvcml6b250YWwpCisgKiB3aWxsIG5vdCBkYW1hZ2UgbGluZWFyIGdyYWRpZW50cworICogRmxhdCBibG9ja3Mgc2hvdWxkIGxvb2sgbGlrZSB0aGV5IHdlcmUgcGFzc2VkIHRocm91Z2ggdGhlICgxLDEsMiwyLDQsMiwyLDEsMSkgOS1UYXAgZmlsdGVyCisgKiBjYW4gb25seSBzbW9vdGggYmxvY2tzIGF0IHRoZSBleHBlY3RlZCBsb2NhdGlvbnMgKGl0IGNhbm5vdCBzbW9vdGggdGhlbSBpZiB0aGV5IGRpZCBtb3ZlKQorICogTU1YMiB2ZXJzaW9uIGRvZXMgY29ycmVjdCBjbGlwcGluZyBDIHZlcnNpb24gZG9lcyBub3QKKyAqIG5vdCBpZGVudGljYWwgd2l0aCB0aGUgdmVydGljYWwgb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBob3JpelgxRmlsdGVyKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IFFQKQoreworICAgIGludCB5OworICAgIHN0YXRpYyB1aW50NjRfdCBsdXRbMjU2XTsKKyAgICBpZighbHV0WzI1NV0pCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKGk9MDsgaTwyNTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHY9IGkgPCAxMjggPyAyKmkgOiAyKihpLTI1Nik7CisvKgorLy9TaW11bGF0ZSAxMTIyNDIyMTEgOS1UYXAgZmlsdGVyCisgICAgICAgICAgICB1aW50NjRfdCBhPSAodi8xNikgICYgMHhGRjsKKyAgICAgICAgICAgIHVpbnQ2NF90IGI9ICh2LzgpICAgJiAweEZGOworICAgICAgICAgICAgdWludDY0X3QgYz0gKHYvNCkgICAmIDB4RkY7CisgICAgICAgICAgICB1aW50NjRfdCBkPSAoMyp2LzgpICYgMHhGRjsKKyovCisvL1NpbXVsYXRlIHBpZWNld2lzZSBsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgICAgICAgICAgdWludDY0X3QgYT0gKHYvMTYpICAgJiAweEZGOworICAgICAgICAgICAgdWludDY0X3QgYj0gKHYqMy8xNikgJiAweEZGOworICAgICAgICAgICAgdWludDY0X3QgYz0gKHYqNS8xNikgJiAweEZGOworICAgICAgICAgICAgdWludDY0X3QgZD0gKDcqdi8xNikgJiAweEZGOworICAgICAgICAgICAgdWludDY0X3QgQT0gKDB4MTAwIC0gYSkmMHhGRjsKKyAgICAgICAgICAgIHVpbnQ2NF90IEI9ICgweDEwMCAtIGIpJjB4RkY7CisgICAgICAgICAgICB1aW50NjRfdCBDPSAoMHgxMDAgLSBjKSYweEZGOworICAgICAgICAgICAgdWludDY0X3QgRD0gKDB4MTAwIC0gYykmMHhGRjsKKworICAgICAgICAgICAgbHV0W2ldICAgPSAoYTw8NTYpIHwgKGI8PDQ4KSB8IChjPDw0MCkgfCAoZDw8MzIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKEQ8PDI0KSB8IChDPDwxNikgfCAoQjw8OCkgIHwgKEEpOworICAgICAgICAgICAgLy9sdXRbaV0gPSAodjw8MzIpIHwgKHY8PDI0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcih5PTA7IHk8QkxPQ0tfU0laRTsgeSsrKXsKKyAgICAgICAgaW50IGE9IHNyY1sxXSAtIHNyY1syXTsKKyAgICAgICAgaW50IGI9IHNyY1szXSAtIHNyY1s0XTsKKyAgICAgICAgaW50IGM9IHNyY1s1XSAtIHNyY1s2XTsKKworICAgICAgICBpbnQgZD0gRkZNQVgoRkZBQlMoYikgLSAoRkZBQlMoYSkgKyBGRkFCUyhjKSkvMiwgMCk7CisKKyAgICAgICAgaWYoZCA8IFFQKXsKKyAgICAgICAgICAgIGludCB2ID0gZCAqIEZGU0lHTigtYik7CisKKyAgICAgICAgICAgIHNyY1sxXSArPXYvODsKKyAgICAgICAgICAgIHNyY1syXSArPXYvNDsKKyAgICAgICAgICAgIHNyY1szXSArPTMqdi84OworICAgICAgICAgICAgc3JjWzRdIC09Myp2Lzg7CisgICAgICAgICAgICBzcmNbNV0gLT12LzQ7CisgICAgICAgICAgICBzcmNbNl0gLT12Lzg7CisgICAgICAgIH0KKyAgICAgICAgc3JjKz1zdHJpZGU7CisgICAgfQorfQorCisvKioKKyAqIGFjY3VyYXRlIGRlYmxvY2sgZmlsdGVyCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZG9fYV9kZWJsb2NrX0ModWludDhfdCAqc3JjLCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgY29uc3QgUFBDb250ZXh0ICpjLCBpbnQgbW9kZSkKK3sKKyAgICBpbnQgeTsKKyAgICBjb25zdCBpbnQgUVA9IGMtPlFQOworICAgIGNvbnN0IGludCBkY09mZnNldD0gKChjLT5ub25CUVAqYy0+cHBNb2RlLmJhc2VEY0RpZmYpPj44KSArIDE7CisgICAgY29uc3QgaW50IGRjVGhyZXNob2xkPSBkY09mZnNldCoyICsgMTsKKy8vU1RBUlRfVElNRVIKKyAgICBzcmMrPSBzdGVwKjQ7IC8vIHNyYyBwb2ludHMgdG8gYmVnaW4gb2YgdGhlIDh4OCBCbG9jaworICAgIGZvcih5PTA7IHk8ODsgeSsrKXsKKyAgICAgICAgaW50IG51bUVxPSAwOworCisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1stMSpzdGVwXSAtIHNyY1swKnN0ZXBdICsgZGNPZmZzZXQpKSA8IGRjVGhyZXNob2xkOworICAgICAgICBudW1FcSArPSAoKHVuc2lnbmVkKShzcmNbIDAqc3RlcF0gLSBzcmNbMSpzdGVwXSArIGRjT2Zmc2V0KSkgPCBkY1RocmVzaG9sZDsKKyAgICAgICAgbnVtRXEgKz0gKCh1bnNpZ25lZCkoc3JjWyAxKnN0ZXBdIC0gc3JjWzIqc3RlcF0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1sgMipzdGVwXSAtIHNyY1szKnN0ZXBdICsgZGNPZmZzZXQpKSA8IGRjVGhyZXNob2xkOworICAgICAgICBudW1FcSArPSAoKHVuc2lnbmVkKShzcmNbIDMqc3RlcF0gLSBzcmNbNCpzdGVwXSArIGRjT2Zmc2V0KSkgPCBkY1RocmVzaG9sZDsKKyAgICAgICAgbnVtRXEgKz0gKCh1bnNpZ25lZCkoc3JjWyA0KnN0ZXBdIC0gc3JjWzUqc3RlcF0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIG51bUVxICs9ICgodW5zaWduZWQpKHNyY1sgNSpzdGVwXSAtIHNyY1s2KnN0ZXBdICsgZGNPZmZzZXQpKSA8IGRjVGhyZXNob2xkOworICAgICAgICBudW1FcSArPSAoKHVuc2lnbmVkKShzcmNbIDYqc3RlcF0gLSBzcmNbNypzdGVwXSArIGRjT2Zmc2V0KSkgPCBkY1RocmVzaG9sZDsKKyAgICAgICAgbnVtRXEgKz0gKCh1bnNpZ25lZCkoc3JjWyA3KnN0ZXBdIC0gc3JjWzgqc3RlcF0gKyBkY09mZnNldCkpIDwgZGNUaHJlc2hvbGQ7CisgICAgICAgIGlmKG51bUVxID4gYy0+cHBNb2RlLmZsYXRuZXNzVGhyZXNob2xkKXsKKyAgICAgICAgICAgIGludCBtaW4sIG1heCwgeDsKKworICAgICAgICAgICAgaWYoc3JjWzBdID4gc3JjW3N0ZXBdKXsKKyAgICAgICAgICAgICAgICBtYXg9IHNyY1swXTsKKyAgICAgICAgICAgICAgICBtaW49IHNyY1tzdGVwXTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIG1heD0gc3JjW3N0ZXBdOworICAgICAgICAgICAgICAgIG1pbj0gc3JjWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKHg9MjsgeDw4OyB4Kz0yKXsKKyAgICAgICAgICAgICAgICBpZihzcmNbeCpzdGVwXSA+IHNyY1soeCsxKSpzdGVwXSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihzcmNbeCAgICAqc3RlcF0gPiBtYXgpIG1heD0gc3JjWyB4ICAgKnN0ZXBdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3JjWyh4KzEpKnN0ZXBdIDwgbWluKSBtaW49IHNyY1soeCsxKSpzdGVwXTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyY1soeCsxKSpzdGVwXSA+IG1heCkgbWF4PSBzcmNbKHgrMSkqc3RlcF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZihzcmNbIHggICAqc3RlcF0gPCBtaW4pIG1pbj0gc3JjWyB4ICAgKnN0ZXBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG1heC1taW4gPCAyKlFQKXsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZmlyc3Q9IEZGQUJTKHNyY1stMSpzdGVwXSAtIHNyY1swXSkgPCBRUCA/IHNyY1stMSpzdGVwXSA6IHNyY1swXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGFzdD0gRkZBQlMoc3JjWzgqc3RlcF0gLSBzcmNbNypzdGVwXSkgPCBRUCA/IHNyY1s4KnN0ZXBdIDogc3JjWzcqc3RlcF07CisKKyAgICAgICAgICAgICAgICBpbnQgc3Vtc1sxMF07CisgICAgICAgICAgICAgICAgc3Vtc1swXSA9IDQqZmlyc3QgKyBzcmNbMCpzdGVwXSArIHNyY1sxKnN0ZXBdICsgc3JjWzIqc3RlcF0gKyA0OworICAgICAgICAgICAgICAgIHN1bXNbMV0gPSBzdW1zWzBdIC0gZmlyc3QgICAgICAgKyBzcmNbMypzdGVwXTsKKyAgICAgICAgICAgICAgICBzdW1zWzJdID0gc3Vtc1sxXSAtIGZpcnN0ICAgICAgICsgc3JjWzQqc3RlcF07CisgICAgICAgICAgICAgICAgc3Vtc1szXSA9IHN1bXNbMl0gLSBmaXJzdCAgICAgICArIHNyY1s1KnN0ZXBdOworICAgICAgICAgICAgICAgIHN1bXNbNF0gPSBzdW1zWzNdIC0gZmlyc3QgICAgICAgKyBzcmNbNipzdGVwXTsKKyAgICAgICAgICAgICAgICBzdW1zWzVdID0gc3Vtc1s0XSAtIHNyY1swKnN0ZXBdICsgc3JjWzcqc3RlcF07CisgICAgICAgICAgICAgICAgc3Vtc1s2XSA9IHN1bXNbNV0gLSBzcmNbMSpzdGVwXSArIGxhc3Q7CisgICAgICAgICAgICAgICAgc3Vtc1s3XSA9IHN1bXNbNl0gLSBzcmNbMipzdGVwXSArIGxhc3Q7CisgICAgICAgICAgICAgICAgc3Vtc1s4XSA9IHN1bXNbN10gLSBzcmNbMypzdGVwXSArIGxhc3Q7CisgICAgICAgICAgICAgICAgc3Vtc1s5XSA9IHN1bXNbOF0gLSBzcmNbNCpzdGVwXSArIGxhc3Q7CisKKyAgICAgICAgICAgICAgICBpZiAobW9kZSAmIFZJU1VBTElaRSkgeworICAgICAgICAgICAgICAgICAgICBzcmNbMCpzdGVwXSA9CisgICAgICAgICAgICAgICAgICAgIHNyY1sxKnN0ZXBdID0KKyAgICAgICAgICAgICAgICAgICAgc3JjWzIqc3RlcF0gPQorICAgICAgICAgICAgICAgICAgICBzcmNbMypzdGVwXSA9CisgICAgICAgICAgICAgICAgICAgIHNyY1s0KnN0ZXBdID0KKyAgICAgICAgICAgICAgICAgICAgc3JjWzUqc3RlcF0gPQorICAgICAgICAgICAgICAgICAgICBzcmNbNipzdGVwXSA9CisgICAgICAgICAgICAgICAgICAgIHNyY1s3KnN0ZXBdID0gMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcmNbMCpzdGVwXT0gKHN1bXNbMF0gKyBzdW1zWzJdICsgMipzcmNbMCpzdGVwXSk+PjQ7CisgICAgICAgICAgICAgICAgc3JjWzEqc3RlcF09IChzdW1zWzFdICsgc3Vtc1szXSArIDIqc3JjWzEqc3RlcF0pPj40OworICAgICAgICAgICAgICAgIHNyY1syKnN0ZXBdPSAoc3Vtc1syXSArIHN1bXNbNF0gKyAyKnNyY1syKnN0ZXBdKT4+NDsKKyAgICAgICAgICAgICAgICBzcmNbMypzdGVwXT0gKHN1bXNbM10gKyBzdW1zWzVdICsgMipzcmNbMypzdGVwXSk+PjQ7CisgICAgICAgICAgICAgICAgc3JjWzQqc3RlcF09IChzdW1zWzRdICsgc3Vtc1s2XSArIDIqc3JjWzQqc3RlcF0pPj40OworICAgICAgICAgICAgICAgIHNyY1s1KnN0ZXBdPSAoc3Vtc1s1XSArIHN1bXNbN10gKyAyKnNyY1s1KnN0ZXBdKT4+NDsKKyAgICAgICAgICAgICAgICBzcmNbNipzdGVwXT0gKHN1bXNbNl0gKyBzdW1zWzhdICsgMipzcmNbNipzdGVwXSk+PjQ7CisgICAgICAgICAgICAgICAgc3JjWzcqc3RlcF09IChzdW1zWzddICsgc3Vtc1s5XSArIDIqc3JjWzcqc3RlcF0pPj40OworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGNvbnN0IGludCBtaWRkbGVFbmVyZ3k9IDUqKHNyY1s0KnN0ZXBdIC0gc3JjWzMqc3RlcF0pICsgMiooc3JjWzIqc3RlcF0gLSBzcmNbNSpzdGVwXSk7CisKKyAgICAgICAgICAgIGlmKEZGQUJTKG1pZGRsZUVuZXJneSkgPCA4KlFQKXsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcT0oc3JjWzMqc3RlcF0gLSBzcmNbNCpzdGVwXSkvMjsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGVmdEVuZXJneT0gIDUqKHNyY1syKnN0ZXBdIC0gc3JjWzEqc3RlcF0pICsgMiooc3JjWzAqc3RlcF0gLSBzcmNbMypzdGVwXSk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHJpZ2h0RW5lcmd5PSA1KihzcmNbNipzdGVwXSAtIHNyY1s1KnN0ZXBdKSArIDIqKHNyY1s0KnN0ZXBdIC0gc3JjWzcqc3RlcF0pOworCisgICAgICAgICAgICAgICAgaW50IGQ9IEZGQUJTKG1pZGRsZUVuZXJneSkgLSBGRk1JTiggRkZBQlMobGVmdEVuZXJneSksIEZGQUJTKHJpZ2h0RW5lcmd5KSApOworICAgICAgICAgICAgICAgIGQ9IEZGTUFYKGQsIDApOworCisgICAgICAgICAgICAgICAgZD0gKDUqZCArIDMyKSA+PiA2OworICAgICAgICAgICAgICAgIGQqPSBGRlNJR04oLW1pZGRsZUVuZXJneSk7CisKKyAgICAgICAgICAgICAgICBpZihxPjApeworICAgICAgICAgICAgICAgICAgICBkID0gRkZNQVgoZCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGQgPSBGRk1JTihkLCBxKTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgZCA9IEZGTUlOKGQsIDApOworICAgICAgICAgICAgICAgICAgICBkID0gRkZNQVgoZCwgcSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKChtb2RlICYgVklTVUFMSVpFKSAmJiBkKSB7CisgICAgICAgICAgICAgICAgICAgIGQ9IChkIDwgMCkgPyAzMiA6IC0zMjsKKyAgICAgICAgICAgICAgICAgICAgc3JjWzMqc3RlcF09IGF2X2NsaXBfdWludDgoc3JjWzMqc3RlcF0gLSBkKTsKKyAgICAgICAgICAgICAgICAgICAgc3JjWzQqc3RlcF09IGF2X2NsaXBfdWludDgoc3JjWzQqc3RlcF0gKyBkKTsKKyAgICAgICAgICAgICAgICAgICAgZCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3JjWzMqc3RlcF0tPSBkOworICAgICAgICAgICAgICAgIHNyY1s0KnN0ZXBdKz0gZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorLyppZihzdGVwPT0xNil7CisgICAgU1RPUF9USU1FUigic3RlcDE2IikKK31lbHNleworICAgIFNUT1BfVElNRVIoInN0ZXBYIikKK30qLworfQorCisvL05vdGU6IHdlIGhhdmUgQywgTU1YLCBNTVgyLCAzRE5PVyB2ZXJzaW9uIHRoZXJlIGlzIG5vIDNETk9XK01NWDIgb25lCisvL1BsYWluIEMgdmVyc2lvbnMKKy8vd2UgYWx3YXlzIGNvbXBpbGUgQyBmb3IgdGVzdGluZyB3aGljaCBuZWVkcyBiaXRleGFjdG5lc3MKKyNkZWZpbmUgVEVNUExBVEVfUFBfQyAxCisjaW5jbHVkZSAicG9zdHByb2Nlc3NfdGVtcGxhdGUuYyIKKworI2lmIEhBVkVfQUxUSVZFQworIyAgIGRlZmluZSBURU1QTEFURV9QUF9BTFRJVkVDIDEKKyMgICBpbmNsdWRlICJwb3N0cHJvY2Vzc19hbHRpdmVjX3RlbXBsYXRlLmMiCisjICAgaW5jbHVkZSAicG9zdHByb2Nlc3NfdGVtcGxhdGUuYyIKKyNlbmRpZgorCisjaWYgQVJDSF9YODYgJiYgSEFWRV9JTkxJTkVfQVNNCisjICAgIGlmIENPTkZJR19SVU5USU1FX0NQVURFVEVDVAorIyAgICAgICAgZGVmaW5lIFRFTVBMQVRFX1BQX01NWCAxCisjICAgICAgICBpbmNsdWRlICJwb3N0cHJvY2Vzc190ZW1wbGF0ZS5jIgorIyAgICAgICAgZGVmaW5lIFRFTVBMQVRFX1BQX01NWEVYVCAxCisjICAgICAgICBpbmNsdWRlICJwb3N0cHJvY2Vzc190ZW1wbGF0ZS5jIgorIyAgICAgICAgZGVmaW5lIFRFTVBMQVRFX1BQXzNETk9XIDEKKyMgICAgICAgIGluY2x1ZGUgInBvc3Rwcm9jZXNzX3RlbXBsYXRlLmMiCisjICAgICAgICBkZWZpbmUgVEVNUExBVEVfUFBfU1NFMiAxCisjICAgICAgICBpbmNsdWRlICJwb3N0cHJvY2Vzc190ZW1wbGF0ZS5jIgorIyAgICBlbHNlCisjICAgICAgICBpZiBIQVZFX1NTRTJfSU5MSU5FCisjICAgICAgICAgICAgZGVmaW5lIFRFTVBMQVRFX1BQX1NTRTIgMQorIyAgICAgICAgICAgIGluY2x1ZGUgInBvc3Rwcm9jZXNzX3RlbXBsYXRlLmMiCisjICAgICAgICBlbGlmIEhBVkVfTU1YRVhUX0lOTElORQorIyAgICAgICAgICAgIGRlZmluZSBURU1QTEFURV9QUF9NTVhFWFQgMQorIyAgICAgICAgICAgIGluY2x1ZGUgInBvc3Rwcm9jZXNzX3RlbXBsYXRlLmMiCisjICAgICAgICBlbGlmIEhBVkVfQU1EM0ROT1dfSU5MSU5FCisjICAgICAgICAgICAgZGVmaW5lIFRFTVBMQVRFX1BQXzNETk9XIDEKKyMgICAgICAgICAgICBpbmNsdWRlICJwb3N0cHJvY2Vzc190ZW1wbGF0ZS5jIgorIyAgICAgICAgZWxpZiBIQVZFX01NWF9JTkxJTkUKKyMgICAgICAgICAgICBkZWZpbmUgVEVNUExBVEVfUFBfTU1YIDEKKyMgICAgICAgICAgICBpbmNsdWRlICJwb3N0cHJvY2Vzc190ZW1wbGF0ZS5jIgorIyAgICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKCpwcF9mbikoY29uc3QgdWludDhfdCBzcmNbXSwgaW50IHNyY1N0cmlkZSwgdWludDhfdCBkc3RbXSwgaW50IGRzdFN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFQX1NUT1JFX1QgUVBzW10sIGludCBRUFN0cmlkZSwgaW50IGlzQ29sb3IsIFBQQ29udGV4dCAqYzIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcG9zdFByb2Nlc3MoY29uc3QgdWludDhfdCBzcmNbXSwgaW50IHNyY1N0cmlkZSwgdWludDhfdCBkc3RbXSwgaW50IGRzdFN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICBjb25zdCBRUF9TVE9SRV9UIFFQc1tdLCBpbnQgUVBTdHJpZGUsIGludCBpc0NvbG9yLCBwcF9tb2RlICp2bSwgcHBfY29udGV4dCAqdmMpCit7CisgICAgcHBfZm4gcHAgPSBwb3N0UHJvY2Vzc19DOworICAgIFBQQ29udGV4dCAqYz0gKFBQQ29udGV4dCAqKXZjOworICAgIFBQTW9kZSAqcHBNb2RlPSAoUFBNb2RlICopdm07CisgICAgYy0+cHBNb2RlPSAqcHBNb2RlOyAvL0ZJWE1FCisKKyAgICBpZiAoIShwcE1vZGUtPmx1bU1vZGUgJiBCSVRFWEFDVCkpIHsKKyNpZiBDT05GSUdfUlVOVElNRV9DUFVERVRFQ1QKKyNpZiBBUkNIX1g4NiAmJiBIQVZFX0lOTElORV9BU00KKyAgICAgICAgLy8gb3JkZXJlZCBwZXIgc3BlZWQgZmFzdGVzdCBmaXJzdAorICAgICAgICBpZiAgICAgIChjLT5jcHVDYXBzICYgQVZfQ1BVX0ZMQUdfU1NFMikgICAgIHBwID0gcG9zdFByb2Nlc3NfU1NFMjsKKyAgICAgICAgZWxzZSBpZiAoYy0+Y3B1Q2FwcyAmIEFWX0NQVV9GTEFHX01NWEVYVCkgICBwcCA9IHBvc3RQcm9jZXNzX01NWDI7CisgICAgICAgIGVsc2UgaWYgKGMtPmNwdUNhcHMgJiBBVl9DUFVfRkxBR18zRE5PVykgICAgcHAgPSBwb3N0UHJvY2Vzc18zRE5vdzsKKyAgICAgICAgZWxzZSBpZiAoYy0+Y3B1Q2FwcyAmIEFWX0NQVV9GTEFHX01NWCkgICAgICBwcCA9IHBvc3RQcm9jZXNzX01NWDsKKyNlbGlmIEhBVkVfQUxUSVZFQworICAgICAgICBpZiAgICAgIChjLT5jcHVDYXBzICYgQVZfQ1BVX0ZMQUdfQUxUSVZFQykgIHBwID0gcG9zdFByb2Nlc3NfYWx0aXZlYzsKKyNlbmRpZgorI2Vsc2UgLyogQ09ORklHX1JVTlRJTUVfQ1BVREVURUNUICovCisjaWYgICAgIEhBVkVfU1NFMl9JTkxJTkUKKyAgICAgICAgcHAgPSBwb3N0UHJvY2Vzc19TU0UyOworI2VsaWYgICBIQVZFX01NWEVYVF9JTkxJTkUKKyAgICAgICAgcHAgPSBwb3N0UHJvY2Vzc19NTVgyOworI2VsaWYgSEFWRV9BTUQzRE5PV19JTkxJTkUKKyAgICAgICAgcHAgPSBwb3N0UHJvY2Vzc18zRE5vdzsKKyNlbGlmIEhBVkVfTU1YX0lOTElORQorICAgICAgICBwcCA9IHBvc3RQcm9jZXNzX01NWDsKKyNlbGlmIEhBVkVfQUxUSVZFQworICAgICAgICBwcCA9IHBvc3RQcm9jZXNzX2FsdGl2ZWM7CisjZW5kaWYKKyNlbmRpZiAvKiAhQ09ORklHX1JVTlRJTUVfQ1BVREVURUNUICovCisgICAgfQorCisgICAgcHAoc3JjLCBzcmNTdHJpZGUsIGRzdCwgZHN0U3RyaWRlLCB3aWR0aCwgaGVpZ2h0LCBRUHMsIFFQU3RyaWRlLCBpc0NvbG9yLCBjKTsKK30KKworLyogLXBwIENvbW1hbmQgbGluZSBIZWxwCisqLworY29uc3QgY2hhciBwcF9oZWxwW10gPQorIkF2YWlsYWJsZSBwb3N0cHJvY2Vzc2luZyBmaWx0ZXJzOlxuIgorIkZpbHRlcnMgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zXG4iCisic2hvcnQgIGxvbmcgbmFtZSAgICAgICBzaG9ydCAgIGxvbmcgb3B0aW9uICAgICBEZXNjcmlwdGlvblxuIgorIiogICAgICAqICAgICAgICAgICAgICAgYSAgICAgICBhdXRvcSAgICAgICAgICAgQ1BVIHBvd2VyIGRlcGVuZGVudCBlbmFibGVyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBjICAgICAgIGNocm9tICAgICAgICAgICBjaHJvbWluYW5jZSBmaWx0ZXJpbmcgZW5hYmxlZFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgeSAgICAgICBub2Nocm9tICAgICAgICAgY2hyb21pbmFuY2UgZmlsdGVyaW5nIGRpc2FibGVkXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBuICAgICAgIG5vbHVtYSAgICAgICAgICBsdW1hIGZpbHRlcmluZyBkaXNhYmxlZFxuIgorImhiICAgICBoZGVibG9jayAgICAgICAgKDIgdGhyZXNob2xkKSAgICAgICAgICAgaG9yaXpvbnRhbCBkZWJsb2NraW5nIGZpbHRlclxuIgorIiAgICAgICAxLiBkaWZmZXJlbmNlIGZhY3RvcjogZGVmYXVsdD0zMiwgaGlnaGVyIC0+IG1vcmUgZGVibG9ja2luZ1xuIgorIiAgICAgICAyLiBmbGF0bmVzcyB0aHJlc2hvbGQ6IGRlZmF1bHQ9MzksIGxvd2VyIC0+IG1vcmUgZGVibG9ja2luZ1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGggJiB2IGRlYmxvY2tpbmcgZmlsdGVycyBzaGFyZSB0aGVzZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgc28geW91IGNhbid0IHNldCBkaWZmZXJlbnQgdGhyZXNob2xkcyBmb3IgaCAvIHZcbiIKKyJ2YiAgICAgdmRlYmxvY2sgICAgICAgICgyIHRocmVzaG9sZCkgICAgICAgICAgIHZlcnRpY2FsIGRlYmxvY2tpbmcgZmlsdGVyXG4iCisiaGEgICAgIGhhZGVibG9jayAgICAgICAoMiB0aHJlc2hvbGQpICAgICAgICAgICBob3Jpem9udGFsIGRlYmxvY2tpbmcgZmlsdGVyXG4iCisidmEgICAgIHZhZGVibG9jayAgICAgICAoMiB0aHJlc2hvbGQpICAgICAgICAgICB2ZXJ0aWNhbCBkZWJsb2NraW5nIGZpbHRlclxuIgorImgxICAgICB4MWhkZWJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIGggZGVibG9jayBmaWx0ZXIgMVxuIgorInYxICAgICB4MXZkZWJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIHYgZGVibG9jayBmaWx0ZXIgMVxuIgorImRyICAgICBkZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyaW5naW5nIGZpbHRlclxuIgorImFsICAgICBhdXRvbGV2ZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljIGJyaWdodG5lc3MgLyBjb250cmFzdFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgZiAgICAgICAgZnVsbHlyYW5nZSAgICAgc3RyZXRjaCBsdW1pbmFuY2UgdG8gKDAuLjI1NSlcbiIKKyJsYiAgICAgbGluYmxlbmRkZWludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVhciBibGVuZCBkZWludGVybGFjZXJcbiIKKyJsaSAgICAgbGluaXBvbGRlaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVhciBpbnRlcnBvbGF0aW5nIGRlaW50ZXJsYWNlXG4iCisiY2kgICAgIGN1YmljaXBvbGRlaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBjdWJpYyBpbnRlcnBvbGF0aW5nIGRlaW50ZXJsYWNlclxuIgorIm1kICAgICBtZWRpYW5kZWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuIGRlaW50ZXJsYWNlclxuIgorImZkICAgICBmZm1wZWdkZWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZtcGVnIGRlaW50ZXJsYWNlclxuIgorImw1ICAgICBsb3dwYXNzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklSIGxvd3Bhc3MgZGVpbnRlcmxhY2VyXG4iCisiZGUgICAgIGRlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYjphLHZiOmEsZHI6YVxuIgorImZhICAgICBmYXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDE6YSx2MTphLGRyOmFcbiIKKyJhYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhOmE6MTI4OjcsdmE6YSxkcjphXG4iCisidG4gICAgIHRtcG5vaXNlICAgICAgICAoMyB0aHJlc2hvbGQpICAgICAgICAgICB0ZW1wb3JhbCBub2lzZSByZWR1Y2VyXG4iCisiICAgICAgICAgICAgICAgICAgICAgMS4gPD0gMi4gPD0gMy4gICAgICAgICAgICBsYXJnZXIgLT4gc3Ryb25nZXIgZmlsdGVyaW5nXG4iCisiZnEgICAgIGZvcmNlUXVhbnQgICAgICA8cXVhbnRpemVyPiAgICAgICAgICAgICBmb3JjZSBxdWFudGl6ZXJcbiIKKyJVc2FnZTpcbiIKKyI8ZmlsdGVyTmFtZT5bOjxvcHRpb24+Wzo8b3B0aW9uPi4uLl1dW1ssfC9dWy1dPGZpbHRlck5hbWU+Wzo8b3B0aW9uPi4uLl1dLi4uXG4iCisibG9uZyBmb3JtIGV4YW1wbGU6XG4iCisidmRlYmxvY2s6YXV0b3EvaGRlYmxvY2s6YXV0b3EvbGluYmxlbmRkZWludCAgICBkZWZhdWx0LC12ZGVibG9ja1xuIgorInNob3J0IGZvcm0gZXhhbXBsZTpcbiIKKyJ2YjphL2hiOmEvbGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlLC12YlxuIgorIm1vcmUgZXhhbXBsZXM6XG4iCisidG46NjQ6MTI4OjI1NlxuIgorIlxuIgorOworCitwcF9tb2RlICpwcF9nZXRfbW9kZV9ieV9uYW1lX2FuZF9xdWFsaXR5KGNvbnN0IGNoYXIgKm5hbWUsIGludCBxdWFsaXR5KQoreworICAgIGNoYXIgdGVtcFtHRVRfTU9ERV9CVUZGRVJfU0laRV07CisgICAgY2hhciAqcD0gdGVtcDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBmaWx0ZXJEZWxpbWl0ZXJzW10gPSAiLC8iOworICAgIHN0YXRpYyBjb25zdCBjaGFyIG9wdGlvbkRlbGltaXRlcnNbXSA9ICI6fCI7CisgICAgc3RydWN0IFBQTW9kZSAqcHBNb2RlOworICAgIGNoYXIgKmZpbHRlclRva2VuOworCisgICAgaWYgKCFuYW1lKSAgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAicHA6IE1pc3NpbmcgYXJndW1lbnRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiaGVscCIpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnA7CisgICAgICAgIGZvciAocCA9IHBwX2hlbHA7IHN0cmNocihwLCAnXG4nKTsgcCA9IHN0cmNocihwLCAnXG4nKSArIDEpIHsKKyAgICAgICAgICAgIGF2X3N0cmxjcHkodGVtcCwgcCwgRkZNSU4oc2l6ZW9mKHRlbXApLCBzdHJjaHIocCwgJ1xuJykgLSBwICsgMikpOworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJXMiLCB0ZW1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwcE1vZGU9IGF2X21hbGxvYyhzaXplb2YoUFBNb2RlKSk7CisKKyAgICBwcE1vZGUtPmx1bU1vZGU9IDA7CisgICAgcHBNb2RlLT5jaHJvbU1vZGU9IDA7CisgICAgcHBNb2RlLT5tYXhUbXBOb2lzZVswXT0gNzAwOworICAgIHBwTW9kZS0+bWF4VG1wTm9pc2VbMV09IDE1MDA7CisgICAgcHBNb2RlLT5tYXhUbXBOb2lzZVsyXT0gMzAwMDsKKyAgICBwcE1vZGUtPm1heEFsbG93ZWRZPSAyMzQ7CisgICAgcHBNb2RlLT5taW5BbGxvd2VkWT0gMTY7CisgICAgcHBNb2RlLT5iYXNlRGNEaWZmPSAyNTYvODsKKyAgICBwcE1vZGUtPmZsYXRuZXNzVGhyZXNob2xkPSA1Ni0xNi0xOworICAgIHBwTW9kZS0+bWF4Q2xpcHBlZFRocmVzaG9sZD0gMC4wMTsKKyAgICBwcE1vZGUtPmVycm9yPTA7CisKKyAgICBtZW1zZXQodGVtcCwgMCwgR0VUX01PREVfQlVGRkVSX1NJWkUpOworICAgIGF2X3N0cmxjcHkodGVtcCwgbmFtZSwgR0VUX01PREVfQlVGRkVSX1NJWkUgLSAxKTsKKworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJwcDogJXNcbiIsIG5hbWUpOworCisgICAgZm9yKDs7KXsKKyAgICAgICAgY29uc3QgY2hhciAqZmlsdGVyTmFtZTsKKyAgICAgICAgaW50IHE9IDEwMDAwMDA7IC8vUFBfUVVBTElUWV9NQVg7CisgICAgICAgIGludCBjaHJvbT0tMTsKKyAgICAgICAgaW50IGx1bWE9LTE7CisgICAgICAgIGNvbnN0IGNoYXIgKm9wdGlvbjsKKyAgICAgICAgY29uc3QgY2hhciAqb3B0aW9uc1tPUFRJT05TX0FSUkFZX1NJWkVdOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGZpbHRlck5hbWVPaz0wOworICAgICAgICBpbnQgbnVtT2ZVbmtub3duT3B0aW9ucz0wOworICAgICAgICBpbnQgZW5hYmxlPTE7IC8vZG9lcyB0aGUgdXNlciB3YW50IHVzIHRvIGVuYWJsZWQgb3IgZGlzYWJsZWQgdGhlIGZpbHRlcgorICAgICAgICBjaGFyICp0b2tzdGF0ZTsKKworICAgICAgICBmaWx0ZXJUb2tlbj0gYXZfc3RydG9rKHAsIGZpbHRlckRlbGltaXRlcnMsICZ0b2tzdGF0ZSk7CisgICAgICAgIGlmKCFmaWx0ZXJUb2tlbikgYnJlYWs7CisgICAgICAgIHArPSBzdHJsZW4oZmlsdGVyVG9rZW4pICsgMTsgLy8gcCBwb2ludHMgdG8gbmV4dCBmaWx0ZXJUb2tlbgorICAgICAgICBmaWx0ZXJOYW1lPSBhdl9zdHJ0b2soZmlsdGVyVG9rZW4sIG9wdGlvbkRlbGltaXRlcnMsICZ0b2tzdGF0ZSk7CisgICAgICAgIGlmICghZmlsdGVyTmFtZSkgeworICAgICAgICAgICAgcHBNb2RlLT5lcnJvcisrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgInBwOiAlczo6JXNcbiIsIGZpbHRlclRva2VuLCBmaWx0ZXJOYW1lKTsKKworICAgICAgICBpZigqZmlsdGVyTmFtZSA9PSAnLScpeworICAgICAgICAgICAgZW5hYmxlPTA7CisgICAgICAgICAgICBmaWx0ZXJOYW1lKys7CisgICAgICAgIH0KKworICAgICAgICBmb3IoOzspeyAvL2ZvciBhbGwgb3B0aW9ucworICAgICAgICAgICAgb3B0aW9uPSBhdl9zdHJ0b2soTlVMTCwgb3B0aW9uRGVsaW1pdGVycywgJnRva3N0YXRlKTsKKyAgICAgICAgICAgIGlmKCFvcHRpb24pIGJyZWFrOworCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAicHA6IG9wdGlvbjogJXNcbiIsIG9wdGlvbik7CisgICAgICAgICAgICBpZighc3RyY21wKCJhdXRvcSIsIG9wdGlvbikgfHwgIXN0cmNtcCgiYSIsIG9wdGlvbikpIHE9IHF1YWxpdHk7CisgICAgICAgICAgICBlbHNlIGlmKCFzdHJjbXAoIm5vY2hyb20iLCBvcHRpb24pIHx8ICFzdHJjbXAoInkiLCBvcHRpb24pKSBjaHJvbT0wOworICAgICAgICAgICAgZWxzZSBpZighc3RyY21wKCJjaHJvbSIsIG9wdGlvbikgfHwgIXN0cmNtcCgiYyIsIG9wdGlvbikpIGNocm9tPTE7CisgICAgICAgICAgICBlbHNlIGlmKCFzdHJjbXAoIm5vbHVtYSIsIG9wdGlvbikgfHwgIXN0cmNtcCgibiIsIG9wdGlvbikpIGx1bWE9MDsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgb3B0aW9uc1tudW1PZlVua25vd25PcHRpb25zXSA9IG9wdGlvbjsKKyAgICAgICAgICAgICAgICBudW1PZlVua25vd25PcHRpb25zKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihudW1PZlVua25vd25PcHRpb25zID49IE9QVElPTlNfQVJSQVlfU0laRS0xKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBvcHRpb25zW251bU9mVW5rbm93bk9wdGlvbnNdID0gTlVMTDsKKworICAgICAgICAvKiByZXBsYWNlIHN0dWZmIGZyb20gdGhlIHJlcGxhY2UgVGFibGUgKi8KKyAgICAgICAgZm9yKGk9MDsgcmVwbGFjZVRhYmxlWzIqaV07IGkrKyl7CisgICAgICAgICAgICBpZighc3RyY21wKHJlcGxhY2VUYWJsZVsyKmldLCBmaWx0ZXJOYW1lKSl7CisgICAgICAgICAgICAgICAgaW50IG5ld2xlbj0gc3RybGVuKHJlcGxhY2VUYWJsZVsyKmkgKyAxXSk7CisgICAgICAgICAgICAgICAgaW50IHBsZW47CisgICAgICAgICAgICAgICAgaW50IHNwYWNlTGVmdDsKKworICAgICAgICAgICAgICAgIHAtLSwgKnA9JywnOworCisgICAgICAgICAgICAgICAgcGxlbj0gc3RybGVuKHApOworICAgICAgICAgICAgICAgIHNwYWNlTGVmdD0gcCAtIHRlbXAgKyBwbGVuOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTGVmdCArIG5ld2xlbiAgPj0gR0VUX01PREVfQlVGRkVSX1NJWkUgLSAxKXsKKyAgICAgICAgICAgICAgICAgICAgcHBNb2RlLT5lcnJvcisrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtbW92ZShwICsgbmV3bGVuLCBwLCBwbGVuKzEpOworICAgICAgICAgICAgICAgIG1lbWNweShwLCByZXBsYWNlVGFibGVbMippICsgMV0sIG5ld2xlbik7CisgICAgICAgICAgICAgICAgZmlsdGVyTmFtZU9rPTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoaT0wOyBmaWx0ZXJzW2ldLnNob3J0TmFtZTsgaSsrKXsKKyAgICAgICAgICAgIGlmKCAgICFzdHJjbXAoZmlsdGVyc1tpXS5sb25nTmFtZSwgZmlsdGVyTmFtZSkKKyAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoZmlsdGVyc1tpXS5zaG9ydE5hbWUsIGZpbHRlck5hbWUpKXsKKyAgICAgICAgICAgICAgICBwcE1vZGUtPmx1bU1vZGUgJj0gfmZpbHRlcnNbaV0ubWFzazsKKyAgICAgICAgICAgICAgICBwcE1vZGUtPmNocm9tTW9kZSAmPSB+ZmlsdGVyc1tpXS5tYXNrOworCisgICAgICAgICAgICAgICAgZmlsdGVyTmFtZU9rPTE7CisgICAgICAgICAgICAgICAgaWYoIWVuYWJsZSkgYnJlYWs7IC8vIHVzZXIgd2FudHMgdG8gZGlzYWJsZSBpdAorCisgICAgICAgICAgICAgICAgaWYocSA+PSBmaWx0ZXJzW2ldLm1pbkx1bVF1YWxpdHkgJiYgbHVtYSkKKyAgICAgICAgICAgICAgICAgICAgcHBNb2RlLT5sdW1Nb2RlfD0gZmlsdGVyc1tpXS5tYXNrOworICAgICAgICAgICAgICAgIGlmKGNocm9tPT0xIHx8IChjaHJvbT09LTEgJiYgZmlsdGVyc1tpXS5jaHJvbURlZmF1bHQpKQorICAgICAgICAgICAgICAgICAgICBpZihxID49IGZpbHRlcnNbaV0ubWluQ2hyb21RdWFsaXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwTW9kZS0+Y2hyb21Nb2RlfD0gZmlsdGVyc1tpXS5tYXNrOworCisgICAgICAgICAgICAgICAgaWYoZmlsdGVyc1tpXS5tYXNrID09IExFVkVMX0ZJWCl7CisgICAgICAgICAgICAgICAgICAgIGludCBvOworICAgICAgICAgICAgICAgICAgICBwcE1vZGUtPm1pbkFsbG93ZWRZPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgcHBNb2RlLT5tYXhBbGxvd2VkWT0gMjM0OworICAgICAgICAgICAgICAgICAgICBmb3Iobz0wOyBvcHRpb25zW29dOyBvKyspeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICAhc3RyY21wKG9wdGlvbnNbb10sImZ1bGx5cmFuZ2UiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwhc3RyY21wKG9wdGlvbnNbb10sImYiKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBNb2RlLT5taW5BbGxvd2VkWT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcE1vZGUtPm1heEFsbG93ZWRZPSAyNTU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtT2ZVbmtub3duT3B0aW9ucy0tOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoZmlsdGVyc1tpXS5tYXNrID09IFRFTVBfTk9JU0VfRklMVEVSKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG87CisgICAgICAgICAgICAgICAgICAgIGludCBudW1PZk5vaXNlcz0wOworCisgICAgICAgICAgICAgICAgICAgIGZvcihvPTA7IG9wdGlvbnNbb107IG8rKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp0YWlsOworICAgICAgICAgICAgICAgICAgICAgICAgcHBNb2RlLT5tYXhUbXBOb2lzZVtudW1PZk5vaXNlc109CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydG9sKG9wdGlvbnNbb10sICZ0YWlsLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRhaWwhPW9wdGlvbnNbb10peworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU9mTm9pc2VzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtT2ZVbmtub3duT3B0aW9ucy0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG51bU9mTm9pc2VzID49IDMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoZmlsdGVyc1tpXS5tYXNrID09IFZfREVCTE9DSyAgIHx8IGZpbHRlcnNbaV0ubWFzayA9PSBIX0RFQkxPQ0sKKyAgICAgICAgICAgICAgICAgICAgIHx8IGZpbHRlcnNbaV0ubWFzayA9PSBWX0FfREVCTE9DSyB8fCBmaWx0ZXJzW2ldLm1hc2sgPT0gSF9BX0RFQkxPQ0speworICAgICAgICAgICAgICAgICAgICBpbnQgbzsKKworICAgICAgICAgICAgICAgICAgICBmb3Iobz0wOyBvcHRpb25zW29dICYmIG88MjsgbysrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnRhaWw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsPSBzdHJ0b2wob3B0aW9uc1tvXSwgJnRhaWwsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYodGFpbD09b3B0aW9uc1tvXSkgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bU9mVW5rbm93bk9wdGlvbnMtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG89PTApIHBwTW9kZS0+YmFzZURjRGlmZj0gdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBwcE1vZGUtPmZsYXRuZXNzVGhyZXNob2xkPSB2YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihmaWx0ZXJzW2ldLm1hc2sgPT0gRk9SQ0VfUVVBTlQpeworICAgICAgICAgICAgICAgICAgICBpbnQgbzsKKyAgICAgICAgICAgICAgICAgICAgcHBNb2RlLT5mb3JjZWRRdWFudD0gMTU7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKG89MDsgb3B0aW9uc1tvXSAmJiBvPDE7IG8rKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp0YWlsOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbD0gc3RydG9sKG9wdGlvbnNbb10sICZ0YWlsLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRhaWw9PW9wdGlvbnNbb10pIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBudW1PZlVua25vd25PcHRpb25zLS07CisgICAgICAgICAgICAgICAgICAgICAgICBwcE1vZGUtPmZvcmNlZFF1YW50PSB2YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoIWZpbHRlck5hbWVPaykgcHBNb2RlLT5lcnJvcisrOworICAgICAgICBwcE1vZGUtPmVycm9yICs9IG51bU9mVW5rbm93bk9wdGlvbnM7CisgICAgfQorCisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgInBwOiBsdW1Nb2RlPSVYLCBjaHJvbU1vZGU9JVhcbiIsIHBwTW9kZS0+bHVtTW9kZSwgcHBNb2RlLT5jaHJvbU1vZGUpOworICAgIGlmKHBwTW9kZS0+ZXJyb3IpeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgZXJyb3JzIGluIHBvc3Rwcm9jZXNzIHN0cmluZyBcIiVzXCJcbiIsIHBwTW9kZS0+ZXJyb3IsIG5hbWUpOworICAgICAgICBhdl9mcmVlKHBwTW9kZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcHBNb2RlOworfQorCit2b2lkIHBwX2ZyZWVfbW9kZShwcF9tb2RlICptb2RlKXsKKyAgICBhdl9mcmVlKG1vZGUpOworfQorCitzdGF0aWMgdm9pZCByZWFsbG9jQWxpZ24odm9pZCAqKnAsIGludCBzaXplKXsKKyAgICBhdl9mcmVlKCpwKTsKKyAgICAqcD0gYXZfbWFsbG9jeihzaXplKTsKK30KKworc3RhdGljIHZvaWQgcmVhbGxvY0J1ZmZlcnMoUFBDb250ZXh0ICpjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIGludCBxcFN0cmlkZSl7CisgICAgaW50IG1iV2lkdGggPSAod2lkdGgrMTUpPj40OworICAgIGludCBtYkhlaWdodD0gKGhlaWdodCsxNSk+PjQ7CisgICAgaW50IGk7CisKKyAgICBjLT5zdHJpZGU9IHN0cmlkZTsKKyAgICBjLT5xcFN0cmlkZT0gcXBTdHJpZGU7CisKKyAgICByZWFsbG9jQWxpZ24oKHZvaWQgKiopJmMtPnRlbXBEc3QsIHN0cmlkZSoyNCszMik7CisgICAgcmVhbGxvY0FsaWduKCh2b2lkICoqKSZjLT50ZW1wU3JjLCBzdHJpZGUqMjQpOworICAgIHJlYWxsb2NBbGlnbigodm9pZCAqKikmYy0+dGVtcEJsb2NrcywgMioxNio4KTsKKyAgICByZWFsbG9jQWxpZ24oKHZvaWQgKiopJmMtPnlIaXN0b2dyYW0sIDI1NipzaXplb2YodWludDY0X3QpKTsKKyAgICBmb3IoaT0wOyBpPDI1NjsgaSsrKQorICAgICAgICAgICAgYy0+eUhpc3RvZ3JhbVtpXT0gd2lkdGgqaGVpZ2h0LzY0KjE1LzI1NjsKKworICAgIGZvcihpPTA7IGk8MzsgaSsrKXsKKyAgICAgICAgLy9Ob3RlOiBUaGUgKzE3KjEwMjQgaXMganVzdCB0aGVyZSBzbyBJIGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHIvdyBvdmVyIHRoZSBlbmQuCisgICAgICAgIHJlYWxsb2NBbGlnbigodm9pZCAqKikmYy0+dGVtcEJsdXJyZWRbaV0sIHN0cmlkZSptYkhlaWdodCoxNiArIDE3KjEwMjQpOworICAgICAgICByZWFsbG9jQWxpZ24oKHZvaWQgKiopJmMtPnRlbXBCbHVycmVkUGFzdFtpXSwgMjU2KigoaGVpZ2h0KzcpJih+NykpLzIgKyAxNyoxMDI0KTsvL0ZJWE1FIHNpemUKKyAgICB9CisKKyAgICByZWFsbG9jQWxpZ24oKHZvaWQgKiopJmMtPmRlaW50VGVtcCwgMip3aWR0aCszMik7CisgICAgcmVhbGxvY0FsaWduKCh2b2lkICoqKSZjLT5ub25CUVBUYWJsZSwgcXBTdHJpZGUqbWJIZWlnaHQqc2l6ZW9mKFFQX1NUT1JFX1QpKTsKKyAgICByZWFsbG9jQWxpZ24oKHZvaWQgKiopJmMtPnN0ZFFQVGFibGUsIHFwU3RyaWRlKm1iSGVpZ2h0KnNpemVvZihRUF9TVE9SRV9UKSk7CisgICAgcmVhbGxvY0FsaWduKCh2b2lkICoqKSZjLT5mb3JjZWRRUFRhYmxlLCBtYldpZHRoKnNpemVvZihRUF9TVE9SRV9UKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29udGV4dF90b19uYW1lKHZvaWQgKiBwdHIpIHsKKyAgICByZXR1cm4gInBvc3Rwcm9jIjsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYXZfY29kZWNfY29udGV4dF9jbGFzcyA9IHsgIlBvc3Rwcm9jIiwgY29udGV4dF90b19uYW1lLCBOVUxMIH07CisKK3BwX2NvbnRleHQgKnBwX2dldF9jb250ZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGNwdUNhcHMpeworICAgIFBQQ29udGV4dCAqYz0gYXZfbWFsbG9jKHNpemVvZihQUENvbnRleHQpKTsKKyAgICBpbnQgc3RyaWRlPSBGRkFMSUdOKHdpZHRoLCAxNik7ICAvL2Fzc3VtZWQgLyB3aWxsIHJlYWxsb2MgaWYgbmVlZGVkCisgICAgaW50IHFwU3RyaWRlPSAod2lkdGgrMTUpLzE2ICsgMjsgLy9hc3N1bWVkIC8gd2lsbCByZWFsbG9jIGlmIG5lZWRlZAorCisgICAgbWVtc2V0KGMsIDAsIHNpemVvZihQUENvbnRleHQpKTsKKyAgICBjLT5hdl9jbGFzcyA9ICZhdl9jb2RlY19jb250ZXh0X2NsYXNzOworICAgIGlmKGNwdUNhcHMmUFBfRk9STUFUKXsKKyAgICAgICAgYy0+aENocm9tYVN1YlNhbXBsZT0gY3B1Q2FwcyYweDM7CisgICAgICAgIGMtPnZDaHJvbWFTdWJTYW1wbGU9IChjcHVDYXBzPj40KSYweDM7CisgICAgfWVsc2V7CisgICAgICAgIGMtPmhDaHJvbWFTdWJTYW1wbGU9IDE7CisgICAgICAgIGMtPnZDaHJvbWFTdWJTYW1wbGU9IDE7CisgICAgfQorICAgIGlmIChjcHVDYXBzICYgUFBfQ1BVX0NBUFNfQVVUTykgeworICAgICAgICBjLT5jcHVDYXBzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgIH0gZWxzZSB7CisgICAgICAgIGMtPmNwdUNhcHMgPSAwOworICAgICAgICBpZiAoY3B1Q2FwcyAmIFBQX0NQVV9DQVBTX01NWCkgICAgICBjLT5jcHVDYXBzIHw9IEFWX0NQVV9GTEFHX01NWDsKKyAgICAgICAgaWYgKGNwdUNhcHMgJiBQUF9DUFVfQ0FQU19NTVgyKSAgICAgYy0+Y3B1Q2FwcyB8PSBBVl9DUFVfRkxBR19NTVhFWFQ7CisgICAgICAgIGlmIChjcHVDYXBzICYgUFBfQ1BVX0NBUFNfM0ROT1cpICAgIGMtPmNwdUNhcHMgfD0gQVZfQ1BVX0ZMQUdfM0ROT1c7CisgICAgICAgIGlmIChjcHVDYXBzICYgUFBfQ1BVX0NBUFNfQUxUSVZFQykgIGMtPmNwdUNhcHMgfD0gQVZfQ1BVX0ZMQUdfQUxUSVZFQzsKKyAgICB9CisKKyAgICByZWFsbG9jQnVmZmVycyhjLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHFwU3RyaWRlKTsKKworICAgIGMtPmZyYW1lTnVtPS0xOworCisgICAgcmV0dXJuIGM7Cit9CisKK3ZvaWQgcHBfZnJlZV9jb250ZXh0KHZvaWQgKnZjKXsKKyAgICBQUENvbnRleHQgKmMgPSAoUFBDb250ZXh0Kil2YzsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8RkZfQVJSQVlfRUxFTVMoYy0+dGVtcEJsdXJyZWQpOyBpKyspCisgICAgICAgIGF2X2ZyZWUoYy0+dGVtcEJsdXJyZWRbaV0pOworICAgIGZvcihpPTA7IGk8RkZfQVJSQVlfRUxFTVMoYy0+dGVtcEJsdXJyZWRQYXN0KTsgaSsrKQorICAgICAgICBhdl9mcmVlKGMtPnRlbXBCbHVycmVkUGFzdFtpXSk7CisKKyAgICBhdl9mcmVlKGMtPnRlbXBCbG9ja3MpOworICAgIGF2X2ZyZWUoYy0+eUhpc3RvZ3JhbSk7CisgICAgYXZfZnJlZShjLT50ZW1wRHN0KTsKKyAgICBhdl9mcmVlKGMtPnRlbXBTcmMpOworICAgIGF2X2ZyZWUoYy0+ZGVpbnRUZW1wKTsKKyAgICBhdl9mcmVlKGMtPnN0ZFFQVGFibGUpOworICAgIGF2X2ZyZWUoYy0+bm9uQlFQVGFibGUpOworICAgIGF2X2ZyZWUoYy0+Zm9yY2VkUVBUYWJsZSk7CisKKyAgICBtZW1zZXQoYywgMCwgc2l6ZW9mKFBQQ29udGV4dCkpOworCisgICAgYXZfZnJlZShjKTsKK30KKwordm9pZCAgcHBfcG9zdHByb2Nlc3MoY29uc3QgdWludDhfdCAqIHNyY1szXSwgY29uc3QgaW50IHNyY1N0cmlkZVszXSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKiBkc3RbM10sIGNvbnN0IGludCBkc3RTdHJpZGVbM10sCisgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBRUF9TVE9SRV9UICpRUF9zdG9yZSwgIGludCBRUFN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIHBwX21vZGUgKnZtLCAgdm9pZCAqdmMsIGludCBwaWN0X3R5cGUpCit7CisgICAgaW50IG1iV2lkdGggPSAod2lkdGgrMTUpPj40OworICAgIGludCBtYkhlaWdodD0gKGhlaWdodCsxNSk+PjQ7CisgICAgUFBNb2RlICptb2RlID0gdm07CisgICAgUFBDb250ZXh0ICpjID0gdmM7CisgICAgaW50IG1pblN0cmlkZT0gRkZNQVgoRkZBQlMoc3JjU3RyaWRlWzBdKSwgRkZBQlMoZHN0U3RyaWRlWzBdKSk7CisgICAgaW50IGFic1FQU3RyaWRlID0gRkZBQlMoUVBTdHJpZGUpOworCisgICAgLy8gYy0+c3RyaWRlIGFuZCBjLT5RUFN0cmlkZSBhcmUgYWx3YXlzIHBvc2l0aXZlCisgICAgaWYoYy0+c3RyaWRlIDwgbWluU3RyaWRlIHx8IGMtPnFwU3RyaWRlIDwgYWJzUVBTdHJpZGUpCisgICAgICAgIHJlYWxsb2NCdWZmZXJzKGMsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIEZGTUFYKG1pblN0cmlkZSwgYy0+c3RyaWRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRkZNQVgoYy0+cXBTdHJpZGUsIGFic1FQU3RyaWRlKSk7CisKKyAgICBpZighUVBfc3RvcmUgfHwgKG1vZGUtPmx1bU1vZGUgJiBGT1JDRV9RVUFOVCkpeworICAgICAgICBpbnQgaTsKKyAgICAgICAgUVBfc3RvcmU9IGMtPmZvcmNlZFFQVGFibGU7CisgICAgICAgIGFic1FQU3RyaWRlID0gUVBTdHJpZGUgPSAwOworICAgICAgICBpZihtb2RlLT5sdW1Nb2RlICYgRk9SQ0VfUVVBTlQpCisgICAgICAgICAgICBmb3IoaT0wOyBpPG1iV2lkdGg7IGkrKykgYy0+Zm9yY2VkUVBUYWJsZVtpXT0gbW9kZS0+Zm9yY2VkUXVhbnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvcihpPTA7IGk8bWJXaWR0aDsgaSsrKSBjLT5mb3JjZWRRUFRhYmxlW2ldPSAxOworICAgIH0KKworICAgIGlmKHBpY3RfdHlwZSAmIFBQX1BJQ1RfVFlQRV9RUDIpeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY29uc3QgaW50IGNvdW50PSBGRk1BWChtYkhlaWdodCAqIGFic1FQU3RyaWRlLCBtYldpZHRoKTsKKyAgICAgICAgZm9yKGk9MDsgaTwoY291bnQ+PjIpOyBpKyspeworICAgICAgICAgICAgKCh1aW50MzJfdCopYy0+c3RkUVBUYWJsZSlbaV0gPSAoKChjb25zdCB1aW50MzJfdCopUVBfc3RvcmUpW2ldPj4xKSAmIDB4N0Y3RjdGN0Y7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGk8PD0yOyBpPGNvdW50OyBpKyspeworICAgICAgICAgICAgYy0+c3RkUVBUYWJsZVtpXSA9IFFQX3N0b3JlW2ldPj4xOworICAgICAgICB9CisgICAgICAgIFFQX3N0b3JlPSBjLT5zdGRRUFRhYmxlOworICAgICAgICBRUFN0cmlkZT0gYWJzUVBTdHJpZGU7CisgICAgfQorCisgICAgaWYoMCl7CisgICAgICAgIGludCB4LHk7CisgICAgICAgIGZvcih5PTA7IHk8bWJIZWlnaHQ7IHkrKyl7CisgICAgICAgICAgICBmb3IoeD0wOyB4PG1iV2lkdGg7IHgrKyl7CisgICAgICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19JTkZPLCAiJTJkICIsIFFQX3N0b3JlW3ggKyB5KlFQU3RyaWRlXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX0lORk8sICJcbiIpOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfSU5GTywgIlxuIik7CisgICAgfQorCisgICAgaWYoKHBpY3RfdHlwZSY3KSE9Myl7CisgICAgICAgIGlmIChRUFN0cmlkZSA+PSAwKXsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgY29uc3QgaW50IGNvdW50PSBGRk1BWChtYkhlaWdodCAqIFFQU3RyaWRlLCBtYldpZHRoKTsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8KGNvdW50Pj4yKTsgaSsrKXsKKyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KiljLT5ub25CUVBUYWJsZSlbaV0gPSAoKGNvbnN0IHVpbnQzMl90KilRUF9zdG9yZSlbaV0gJiAweDNGM0YzRjNGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKGk8PD0yOyBpPGNvdW50OyBpKyspeworICAgICAgICAgICAgICAgIGMtPm5vbkJRUFRhYmxlW2ldID0gUVBfc3RvcmVbaV0gJiAweDNGOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGksajsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8bWJIZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZvcihqPTA7IGo8YWJzUVBTdHJpZGU7IGorKykgeworICAgICAgICAgICAgICAgICAgICBjLT5ub25CUVBUYWJsZVtpKmFic1FQU3RyaWRlK2pdID0gUVBfc3RvcmVbaSpRUFN0cmlkZStqXSAmIDB4M0Y7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXZfbG9nKGMsIEFWX0xPR19ERUJVRywgInVzaW5nIG5wcCBmaWx0ZXJzIDB4JVgvMHglWFxuIiwKKyAgICAgICAgICAgbW9kZS0+bHVtTW9kZSwgbW9kZS0+Y2hyb21Nb2RlKTsKKworICAgIHBvc3RQcm9jZXNzKHNyY1swXSwgc3JjU3RyaWRlWzBdLCBkc3RbMF0sIGRzdFN0cmlkZVswXSwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBRUF9zdG9yZSwgUVBTdHJpZGUsIDAsIG1vZGUsIGMpOworCisgICAgaWYgKCEoc3JjWzFdICYmIHNyY1syXSAmJiBkc3RbMV0gJiYgZHN0WzJdKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgd2lkdGggID0gKHdpZHRoICk+PmMtPmhDaHJvbWFTdWJTYW1wbGU7CisgICAgaGVpZ2h0ID0gKGhlaWdodCk+PmMtPnZDaHJvbWFTdWJTYW1wbGU7CisKKyAgICBpZihtb2RlLT5jaHJvbU1vZGUpeworICAgICAgICBwb3N0UHJvY2VzcyhzcmNbMV0sIHNyY1N0cmlkZVsxXSwgZHN0WzFdLCBkc3RTdHJpZGVbMV0sCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIFFQX3N0b3JlLCBRUFN0cmlkZSwgMSwgbW9kZSwgYyk7CisgICAgICAgIHBvc3RQcm9jZXNzKHNyY1syXSwgc3JjU3RyaWRlWzJdLCBkc3RbMl0sIGRzdFN0cmlkZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgUVBfc3RvcmUsIFFQU3RyaWRlLCAyLCBtb2RlLCBjKTsKKyAgICB9CisgICAgZWxzZSBpZihzcmNTdHJpZGVbMV0gPT0gZHN0U3RyaWRlWzFdICYmIHNyY1N0cmlkZVsyXSA9PSBkc3RTdHJpZGVbMl0peworICAgICAgICBsaW5lY3B5KGRzdFsxXSwgc3JjWzFdLCBoZWlnaHQsIHNyY1N0cmlkZVsxXSk7CisgICAgICAgIGxpbmVjcHkoZHN0WzJdLCBzcmNbMl0sIGhlaWdodCwgc3JjU3RyaWRlWzJdKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgaW50IHk7CisgICAgICAgIGZvcih5PTA7IHk8aGVpZ2h0OyB5KyspeworICAgICAgICAgICAgbWVtY3B5KCYoZHN0WzFdW3kqZHN0U3RyaWRlWzFdXSksICYoc3JjWzFdW3kqc3JjU3RyaWRlWzFdXSksIHdpZHRoKTsKKyAgICAgICAgICAgIG1lbWNweSgmKGRzdFsyXVt5KmRzdFN0cmlkZVsyXV0pLCAmKHNyY1syXVt5KnNyY1N0cmlkZVsyXV0pLCB3aWR0aCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlicG9zdHByb2MvcG9zdHByb2Nlc3MuaCBiL2ZmbXBlZy9saWJwb3N0cHJvYy9wb3N0cHJvY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMGVkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlicG9zdHByb2MvcG9zdHByb2Nlc3MuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgKG1pY2hhZWxuaUBnbXguYXQpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIFBPU1RQUk9DX1BPU1RQUk9DRVNTX0gKKyNkZWZpbmUgUE9TVFBST0NfUE9TVFBST0NFU1NfSAorCisvKioKKyAqIEBmaWxlCisgKiBAaW5ncm91cCBscHAKKyAqIGV4dGVybmFsIEFQSSBoZWFkZXIKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBscHAgTGlicG9zdHByb2MKKyAqIEB7CisgKi8KKworI2luY2x1ZGUgImxpYnBvc3Rwcm9jL3ZlcnNpb24uaCIKKworLyoqCisgKiBSZXR1cm4gdGhlIExJQlBPU1RQUk9DX1ZFUlNJT05fSU5UIGNvbnN0YW50LgorICovCit1bnNpZ25lZCBwb3N0cHJvY192ZXJzaW9uKHZvaWQpOworCisvKioKKyAqIFJldHVybiB0aGUgbGlicG9zdHByb2MgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uLgorICovCitjb25zdCBjaGFyICpwb3N0cHJvY19jb25maWd1cmF0aW9uKHZvaWQpOworCisvKioKKyAqIFJldHVybiB0aGUgbGlicG9zdHByb2MgbGljZW5zZS4KKyAqLworY29uc3QgY2hhciAqcG9zdHByb2NfbGljZW5zZSh2b2lkKTsKKworI2RlZmluZSBQUF9RVUFMSVRZX01BWCA2CisKKyNkZWZpbmUgUVBfU1RPUkVfVCBpbnQ4X3QKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK3R5cGVkZWYgdm9pZCBwcF9jb250ZXh0OwordHlwZWRlZiB2b2lkIHBwX21vZGU7CisKKyNpZiBMSUJQT1NUUFJPQ19WRVJTSU9OX0lOVCA8ICg1Mjw8MTYpCit0eXBlZGVmIHBwX2NvbnRleHQgcHBfY29udGV4dF90OwordHlwZWRlZiBwcF9tb2RlIHBwX21vZGVfdDsKK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBwcF9oZWxwOyAvLy88IGEgc2ltcGxlIGhlbHAgdGV4dAorI2Vsc2UKK2V4dGVybiBjb25zdCBjaGFyIHBwX2hlbHBbXTsgLy8vPCBhIHNpbXBsZSBoZWxwIHRleHQKKyNlbmRpZgorCit2b2lkICBwcF9wb3N0cHJvY2Vzcyhjb25zdCB1aW50OF90ICogc3JjWzNdLCBjb25zdCBpbnQgc3JjU3RyaWRlWzNdLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqIGRzdFszXSwgY29uc3QgaW50IGRzdFN0cmlkZVszXSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBob3Jpem9udGFsU2l6ZSwgaW50IHZlcnRpY2FsU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFQX1NUT1JFX1QgKlFQX3N0b3JlLCAgaW50IFFQX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIHBwX21vZGUgKm1vZGUsIHBwX2NvbnRleHQgKnBwQ29udGV4dCwgaW50IHBpY3RfdHlwZSk7CisKKworLyoqCisgKiBSZXR1cm4gYSBwcF9tb2RlIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKgorICogQHBhcmFtIG5hbWUgICAgdGhlIHN0cmluZyBhZnRlciAiLXBwIiBvbiB0aGUgY29tbWFuZCBsaW5lCisgKiBAcGFyYW0gcXVhbGl0eSBhIG51bWJlciBmcm9tIDAgdG8gUFBfUVVBTElUWV9NQVgKKyAqLworcHBfbW9kZSAqcHBfZ2V0X21vZGVfYnlfbmFtZV9hbmRfcXVhbGl0eShjb25zdCBjaGFyICpuYW1lLCBpbnQgcXVhbGl0eSk7Cit2b2lkIHBwX2ZyZWVfbW9kZShwcF9tb2RlICptb2RlKTsKKworcHBfY29udGV4dCAqcHBfZ2V0X2NvbnRleHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZmxhZ3MpOwordm9pZCBwcF9mcmVlX2NvbnRleHQocHBfY29udGV4dCAqcHBDb250ZXh0KTsKKworI2RlZmluZSBQUF9DUFVfQ0FQU19NTVggICAweDgwMDAwMDAwCisjZGVmaW5lIFBQX0NQVV9DQVBTX01NWDIgIDB4MjAwMDAwMDAKKyNkZWZpbmUgUFBfQ1BVX0NBUFNfM0ROT1cgMHg0MDAwMDAwMAorI2RlZmluZSBQUF9DUFVfQ0FQU19BTFRJVkVDIDB4MTAwMDAwMDAKKyNkZWZpbmUgUFBfQ1BVX0NBUFNfQVVUTyAgMHgwMDA4MDAwMAorCisjZGVmaW5lIFBQX0ZPUk1BVCAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUFBfRk9STUFUXzQyMCAgICAoMHgwMDAwMDAxMXxQUF9GT1JNQVQpCisjZGVmaW5lIFBQX0ZPUk1BVF80MjIgICAgKDB4MDAwMDAwMDF8UFBfRk9STUFUKQorI2RlZmluZSBQUF9GT1JNQVRfNDExICAgICgweDAwMDAwMDAyfFBQX0ZPUk1BVCkKKyNkZWZpbmUgUFBfRk9STUFUXzQ0NCAgICAoMHgwMDAwMDAwMHxQUF9GT1JNQVQpCisjZGVmaW5lIFBQX0ZPUk1BVF80NDAgICAgKDB4MDAwMDAwMTB8UFBfRk9STUFUKQorCisjZGVmaW5lIFBQX1BJQ1RfVFlQRV9RUDIgIDB4MDAwMDAwMTAgLy8vPCBNUEVHMiBzdHlsZSBRU2NhbGUKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBQT1NUUFJPQ19QT1NUUFJPQ0VTU19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlicG9zdHByb2MvcG9zdHByb2Nlc3NfYWx0aXZlY190ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzX2FsdGl2ZWNfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTZlYmUyCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzX2FsdGl2ZWNfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDEyMTAgQEAKKy8qCisgKiBBbHRpVmVjIG9wdGltaXphdGlvbnMgKEMpIDIwMDQgUm9tYWluIERvbGJlYXUgPHJvbWFpbkBkb2xiZWF1Lm9yZz4KKyAqCisgKiBiYXNlZCBvbiBjb2RlIGJ5IENvcHlyaWdodCAoQykgMjAwMS0yMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgKG1pY2hhZWxuaUBnbXguYXQpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorCisjZGVmaW5lIEFMVElWRUNfVFJBTlNQT1NFXzh4OF9TSE9SVChzcmNfYSxzcmNfYixzcmNfYyxzcmNfZCxzcmNfZSxzcmNfZixzcmNfZyxzcmNfaCkgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX3R5cGVvZl9fKHNyY19hKSB0ZW1wQTEsIHRlbXBCMSwgdGVtcEMxLCB0ZW1wRDE7ICAgICAgICAgXAorICAgICAgICBfX3R5cGVvZl9fKHNyY19hKSB0ZW1wRTEsIHRlbXBGMSwgdGVtcEcxLCB0ZW1wSDE7ICAgICAgICAgXAorICAgICAgICBfX3R5cGVvZl9fKHNyY19hKSB0ZW1wQTIsIHRlbXBCMiwgdGVtcEMyLCB0ZW1wRDI7ICAgICAgICAgXAorICAgICAgICBfX3R5cGVvZl9fKHNyY19hKSB0ZW1wRTIsIHRlbXBGMiwgdGVtcEcyLCB0ZW1wSDI7ICAgICAgICAgXAorICAgICAgICB0ZW1wQTEgPSB2ZWNfbWVyZ2VoIChzcmNfYSwgc3JjX2UpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wQjEgPSB2ZWNfbWVyZ2VsIChzcmNfYSwgc3JjX2UpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wQzEgPSB2ZWNfbWVyZ2VoIChzcmNfYiwgc3JjX2YpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wRDEgPSB2ZWNfbWVyZ2VsIChzcmNfYiwgc3JjX2YpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wRTEgPSB2ZWNfbWVyZ2VoIChzcmNfYywgc3JjX2cpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wRjEgPSB2ZWNfbWVyZ2VsIChzcmNfYywgc3JjX2cpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wRzEgPSB2ZWNfbWVyZ2VoIChzcmNfZCwgc3JjX2gpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wSDEgPSB2ZWNfbWVyZ2VsIChzcmNfZCwgc3JjX2gpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wQTIgPSB2ZWNfbWVyZ2VoICh0ZW1wQTEsIHRlbXBFMSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wQjIgPSB2ZWNfbWVyZ2VsICh0ZW1wQTEsIHRlbXBFMSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wQzIgPSB2ZWNfbWVyZ2VoICh0ZW1wQjEsIHRlbXBGMSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wRDIgPSB2ZWNfbWVyZ2VsICh0ZW1wQjEsIHRlbXBGMSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wRTIgPSB2ZWNfbWVyZ2VoICh0ZW1wQzEsIHRlbXBHMSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wRjIgPSB2ZWNfbWVyZ2VsICh0ZW1wQzEsIHRlbXBHMSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wRzIgPSB2ZWNfbWVyZ2VoICh0ZW1wRDEsIHRlbXBIMSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wSDIgPSB2ZWNfbWVyZ2VsICh0ZW1wRDEsIHRlbXBIMSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmNfYSA9IHZlY19tZXJnZWggKHRlbXBBMiwgdGVtcEUyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmNfYiA9IHZlY19tZXJnZWwgKHRlbXBBMiwgdGVtcEUyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmNfYyA9IHZlY19tZXJnZWggKHRlbXBCMiwgdGVtcEYyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmNfZCA9IHZlY19tZXJnZWwgKHRlbXBCMiwgdGVtcEYyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmNfZSA9IHZlY19tZXJnZWggKHRlbXBDMiwgdGVtcEcyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmNfZiA9IHZlY19tZXJnZWwgKHRlbXBDMiwgdGVtcEcyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmNfZyA9IHZlY19tZXJnZWggKHRlbXBEMiwgdGVtcEgyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmNfaCA9IHZlY19tZXJnZWwgKHRlbXBEMiwgdGVtcEgyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKworc3RhdGljIGlubGluZSBpbnQgdmVydENsYXNzaWZ5X2FsdGl2ZWModWludDhfdCBzcmNbXSwgaW50IHN0cmlkZSwgUFBDb250ZXh0ICpjKSB7CisgICAgLyoKKyAgICB0aGlzIGNvZGUgbWFrZXMgbm8gYXNzdW1wdGlvbiBvbiBzcmMgb3Igc3RyaWRlLgorICAgIE9uZSBjb3VsZCByZW1vdmUgdGhlIHJlY29tcHV0YXRpb24gb2YgdGhlIHBlcm0KKyAgICB2ZWN0b3IgYnkgYXNzdW1pbmcgKHN0cmlkZSAlIDE2KSA9PSAwLCB1bmZvcnR1bmF0ZWx5CisgICAgdGhpcyBpcyBub3QgYWx3YXlzIHRydWUuCisgICAgKi8KKyAgICBzaG9ydCBkYXRhXzAgPSAoKGMtPm5vbkJRUCpjLT5wcE1vZGUuYmFzZURjRGlmZik+PjgpICsgMTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBkYXRhKVs4XSA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfMCAqIDIgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgYy0+UVAgKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgYy0+UVAgKiA0CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgaW50IG51bUVxOworICAgIHVpbnQ4X3QgKnNyYzIgPSBzcmM7CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCB2X2RjT2Zmc2V0OworICAgIHZlY3RvciBzaWduZWQgc2hvcnQgdjJRUDsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjRRUDsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdl9kY1RocmVzaG9sZDsKKyAgICBjb25zdCBpbnQgcHJvcGVyU3RyaWRlID0gKHN0cmlkZSAlIDE2KTsKKyAgICBjb25zdCBpbnQgc3JjQWxpZ24gPSAoKHVuc2lnbmVkIGxvbmcpc3JjMiAlIDE2KTsKKyAgICBjb25zdCBpbnQgdHdvX3ZlY3RvcnMgPSAoKHNyY0FsaWduID4gOCkgfHwgcHJvcGVyU3RyaWRlKSA/IDEgOiAwOworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgaW50IHplcm8gPSB2ZWNfc3BsYXRfczMyKDApOworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgbWFzayA9IHZlY19zcGxhdF9zMTYoMSk7CisgICAgdmVjdG9yIHNpZ25lZCBpbnQgdl9udW1FcSA9IHZlY19zcGxhdF9zMzIoMCk7CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCB2X2RhdGEgPSB2ZWNfbGQoMCwgZGF0YSk7CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCB2X3NyY0FzczAsIHZfc3JjQXNzMSwgdl9zcmNBc3MyLCB2X3NyY0FzczMsCisgICAgICAgICAgICAgICAgICAgICAgICB2X3NyY0FzczQsIHZfc3JjQXNzNSwgdl9zcmNBc3M2LCB2X3NyY0Fzczc7CisvL0ZJWE1FIGF2b2lkIHRoaXMgbWVzcyBpZiBwb3NzaWJsZQorICAgIHJlZ2lzdGVyIGludCBqMCA9IDAsCisgICAgICAgICAgICAgICAgIGoxID0gc3RyaWRlLAorICAgICAgICAgICAgICAgICBqMiA9IDIgKiBzdHJpZGUsCisgICAgICAgICAgICAgICAgIGozID0gMyAqIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgajQgPSA0ICogc3RyaWRlLAorICAgICAgICAgICAgICAgICBqNSA9IDUgKiBzdHJpZGUsCisgICAgICAgICAgICAgICAgIGo2ID0gNiAqIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgajcgPSA3ICogc3RyaWRlOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfc3JjQTAsIHZfc3JjQTEsIHZfc3JjQTIsIHZfc3JjQTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdl9zcmNBNCwgdl9zcmNBNSwgdl9zcmNBNiwgdl9zcmNBNzsKKworICAgIHZfZGNPZmZzZXQgPSB2ZWNfc3BsYXQodl9kYXRhLCAwKTsKKyAgICB2X2RjVGhyZXNob2xkID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2ZWNfc3BsYXQodl9kYXRhLCAxKTsKKyAgICB2MlFQID0gdmVjX3NwbGF0KHZfZGF0YSwgMik7CisgICAgdjRRUCA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX3NwbGF0KHZfZGF0YSwgMyk7CisKKyAgICBzcmMyICs9IHN0cmlkZSAqIDQ7CisKKyNkZWZpbmUgTE9BRF9MSU5FKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtIyNpID0gdmVjX2x2c2woaiMjaSwgc3JjMik7ICAgICAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3NyY0EyIyNpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3NyY0ExIyNpID0gdmVjX2xkKGojI2ksIHNyYzIpOyAgICAgICAgICAgICAgIFwKKyAgICBpZiAodHdvX3ZlY3RvcnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdl9zcmNBMiMjaSA9IHZlY19sZChqIyNpICsgMTYsIHNyYzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2X3NyY0EjI2kgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3Blcm0odl9zcmNBMSMjaSwgdl9zcmNBMiMjaSwgcGVybSMjaSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2X3NyY0FzcyMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpdmVjX21lcmdlaCgodmVjdG9yIHNpZ25lZCBjaGFyKXplcm8sICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBjaGFyKXZfc3JjQSMjaSk7IH0KKworI2RlZmluZSBMT0FEX0xJTkVfQUxJR05FRChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZfc3JjQSMjaSA9IHZlY19sZChqIyNpLCBzcmMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZfc3JjQXNzIyNpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydCl2ZWNfbWVyZ2VoKCh2ZWN0b3Igc2lnbmVkIGNoYXIpemVybywgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGNoYXIpdl9zcmNBIyNpKQorCisgICAgLyogU3BlY2lhbC1jYXNpbmcgdGhlIGFsaWduZWQgY2FzZSBpcyB3b3J0aHdoaWxlLCBhcyBhbGwgY2FsbHMgZnJvbQorICAgICAqIHRoZSAodHJhbnNwb3NlZCkgaG9yaXpvbnRhYmxlIGRlYmxvY2tzIHdpbGwgYmUgYWxpZ25lZCwgaW4gYWRkaXRpb24KKyAgICAgKiB0byB0aGUgbmF0dXJhbGx5IGFsaWduZWQgdmVydGljYWwgZGVibG9ja3MuICovCisgICAgaWYgKHByb3BlclN0cmlkZSAmJiBzcmNBbGlnbikgeworICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCgwKTsKKyAgICAgICAgTE9BRF9MSU5FX0FMSUdORUQoMSk7CisgICAgICAgIExPQURfTElORV9BTElHTkVEKDIpOworICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCgzKTsKKyAgICAgICAgTE9BRF9MSU5FX0FMSUdORUQoNCk7CisgICAgICAgIExPQURfTElORV9BTElHTkVEKDUpOworICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCg2KTsKKyAgICAgICAgTE9BRF9MSU5FX0FMSUdORUQoNyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9BRF9MSU5FKDApOworICAgICAgICBMT0FEX0xJTkUoMSk7CisgICAgICAgIExPQURfTElORSgyKTsKKyAgICAgICAgTE9BRF9MSU5FKDMpOworICAgICAgICBMT0FEX0xJTkUoNCk7CisgICAgICAgIExPQURfTElORSg1KTsKKyAgICAgICAgTE9BRF9MSU5FKDYpOworICAgICAgICBMT0FEX0xJTkUoNyk7CisgICAgfQorI3VuZGVmIExPQURfTElORQorI3VuZGVmIExPQURfTElORV9BTElHTkVECisKKyNkZWZpbmUgSVRFUihpLCBqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZfZGlmZiMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3N1Yih2X3NyY0FzcyMjaSwgdl9zcmNBc3MjI2opOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZfc3VtIyNpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX2FkZCh2X2RpZmYjI2ksIHZfZGNPZmZzZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZfY29tcCMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpdmVjX2NtcGx0KCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdl9zdW0jI2ksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfZGNUaHJlc2hvbGQpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZfcGFydCMjaSA9IHZlY19hbmQobWFzaywgdl9jb21wIyNpKTsKKworICAgIHsKKyAgICAgICAgSVRFUigwLCAxKQorICAgICAgICBJVEVSKDEsIDIpCisgICAgICAgIElURVIoMiwgMykKKyAgICAgICAgSVRFUigzLCA0KQorICAgICAgICBJVEVSKDQsIDUpCisgICAgICAgIElURVIoNSwgNikKKyAgICAgICAgSVRFUig2LCA3KQorCisgICAgICAgIHZfbnVtRXEgPSB2ZWNfc3VtNHModl9wYXJ0MCwgdl9udW1FcSk7CisgICAgICAgIHZfbnVtRXEgPSB2ZWNfc3VtNHModl9wYXJ0MSwgdl9udW1FcSk7CisgICAgICAgIHZfbnVtRXEgPSB2ZWNfc3VtNHModl9wYXJ0Miwgdl9udW1FcSk7CisgICAgICAgIHZfbnVtRXEgPSB2ZWNfc3VtNHModl9wYXJ0Mywgdl9udW1FcSk7CisgICAgICAgIHZfbnVtRXEgPSB2ZWNfc3VtNHModl9wYXJ0NCwgdl9udW1FcSk7CisgICAgICAgIHZfbnVtRXEgPSB2ZWNfc3VtNHModl9wYXJ0NSwgdl9udW1FcSk7CisgICAgICAgIHZfbnVtRXEgPSB2ZWNfc3VtNHModl9wYXJ0Niwgdl9udW1FcSk7CisgICAgfQorCisjdW5kZWYgSVRFUgorCisgICAgdl9udW1FcSA9IHZlY19zdW1zKHZfbnVtRXEsIHplcm8pOworCisgICAgdl9udW1FcSA9IHZlY19zcGxhdCh2X251bUVxLCAzKTsKKyAgICB2ZWNfc3RlKHZfbnVtRXEsIDAsICZudW1FcSk7CisKKyAgICBpZiAobnVtRXEgPiBjLT5wcE1vZGUuZmxhdG5lc3NUaHJlc2hvbGQpeworICAgICAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBtbW9QMSA9IChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhcikKKyAgICAgICAgICAgIHsweDFmLCAweDFmLCAweDFmLCAweDFmLCAweDFmLCAweDFmLCAweDFmLCAweDFmLAorICAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MTIsIDB4MTMsIDB4MDgsIDB4MDksIDB4MUEsIDB4MUJ9OworICAgICAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBtbW9QMiA9IChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhcikKKyAgICAgICAgICAgIHsweDA0LCAweDA1LCAweDE2LCAweDE3LCAweDBDLCAweDBELCAweDFFLCAweDFGLAorICAgICAgICAgICAgIDB4MWYsIDB4MWYsIDB4MWYsIDB4MWYsIDB4MWYsIDB4MWYsIDB4MWYsIDB4MWZ9OworICAgICAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBtbW9QID0gKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKQorICAgICAgICAgICAgdmVjX2x2c2woOCwgKHVuc2lnbmVkIGNoYXIqKTApOworCisgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgbW1vTDEgPSB2ZWNfcGVybSh2X3NyY0FzczAsIHZfc3JjQXNzMiwgbW1vUDEpOworICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IG1tb0wyID0gdmVjX3Blcm0odl9zcmNBc3M0LCB2X3NyY0FzczYsIG1tb1AyKTsKKyAgICAgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBtbW9MID0gdmVjX3Blcm0obW1vTDEsIG1tb0wyLCBtbW9QKTsKKyAgICAgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBtbW9SMSA9IHZlY19wZXJtKHZfc3JjQXNzNSwgdl9zcmNBc3M3LCBtbW9QMSk7CisgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgbW1vUjIgPSB2ZWNfcGVybSh2X3NyY0FzczEsIHZfc3JjQXNzMywgbW1vUDIpOworICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IG1tb1IgPSB2ZWNfcGVybShtbW9SMSwgbW1vUjIsIG1tb1ApOworICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IG1tb0RpZmYgPSB2ZWNfc3ViKG1tb0wsIG1tb1IpOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgbW1vU3VtID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2ZWNfYWRkKG1tb0RpZmYsIHYyUVApOworCisgICAgICAgIGlmICh2ZWNfYW55X2d0KG1tb1N1bSwgdjRRUCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb1ZlcnRMb3dQYXNzX2FsdGl2ZWModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBQUENvbnRleHQgKmMpIHsKKyAgICAvKgorICAgIHRoaXMgY29kZSBtYWtlcyBubyBhc3N1bXB0aW9uIG9uIHNyYyBvciBzdHJpZGUuCisgICAgT25lIGNvdWxkIHJlbW92ZSB0aGUgcmVjb21wdXRhdGlvbiBvZiB0aGUgcGVybQorICAgIHZlY3RvciBieSBhc3N1bWluZyAoc3RyaWRlICUgMTYpID09IDAsIHVuZm9ydHVuYXRlbHkKKyAgICB0aGlzIGlzIG5vdCBhbHdheXMgdHJ1ZS4gUXVpdGUgYSBsb3Qgb2YgbG9hZC9zdG9yZXMKKyAgICBjYW4gYmUgcmVtb3ZlZCBieSBhc3N1bWluZyBwcm9wZXIgYWxpZ25tZW50IG9mCisgICAgc3JjICYgc3RyaWRlIDotKAorICAgICovCisgICAgdWludDhfdCAqc3JjMiA9IHNyYzsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCB6ZXJvID0gdmVjX3NwbGF0X3MzMigwKTsKKyAgICBjb25zdCBpbnQgcHJvcGVyU3RyaWRlID0gKHN0cmlkZSAlIDE2KTsKKyAgICBjb25zdCBpbnQgc3JjQWxpZ24gPSAoKHVuc2lnbmVkIGxvbmcpc3JjMiAlIDE2KTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBxcClbOF0gPSB7Yy0+UVB9OworICAgIHZlY3RvciBzaWduZWQgc2hvcnQgdnFwID0gdmVjX2xkKDAsIHFwKTsKKyAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IHZiMCwgdmIxLCB2YjIsIHZiMywgdmI0LCB2YjUsIHZiNiwgdmI3LCB2YjgsIHZiOTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YkEwLCBhdl91bmluaXQodmJBMSksIGF2X3VuaW5pdCh2YkEyKSwgYXZfdW5pbml0KHZiQTMpLCBhdl91bmluaXQodmJBNCksIGF2X3VuaW5pdCh2YkE1KSwgYXZfdW5pbml0KHZiQTYpLCBhdl91bmluaXQodmJBNyksIGF2X3VuaW5pdCh2YkE4KSwgdmJBOTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YkIwLCBhdl91bmluaXQodmJCMSksIGF2X3VuaW5pdCh2YkIyKSwgYXZfdW5pbml0KHZiQjMpLCBhdl91bmluaXQodmJCNCksIGF2X3VuaW5pdCh2YkI1KSwgYXZfdW5pbml0KHZiQjYpLCBhdl91bmluaXQodmJCNyksIGF2X3VuaW5pdCh2YkI4KSwgdmJCOTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YlQwLCB2YlQxLCB2YlQyLCB2YlQzLCB2YlQ0LCB2YlQ1LCB2YlQ2LCB2YlQ3LCB2YlQ4LCB2YlQ5OworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm1sMCwgcGVybWwxLCBwZXJtbDIsIHBlcm1sMywgcGVybWw0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1sNSwgcGVybWw2LCBwZXJtbDcsIHBlcm1sOCwgcGVybWw5OworICAgIHJlZ2lzdGVyIGludCBqMCA9IDAsCisgICAgICAgICAgICAgICAgIGoxID0gc3RyaWRlLAorICAgICAgICAgICAgICAgICBqMiA9IDIgKiBzdHJpZGUsCisgICAgICAgICAgICAgICAgIGozID0gMyAqIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgajQgPSA0ICogc3RyaWRlLAorICAgICAgICAgICAgICAgICBqNSA9IDUgKiBzdHJpZGUsCisgICAgICAgICAgICAgICAgIGo2ID0gNiAqIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgajcgPSA3ICogc3RyaWRlLAorICAgICAgICAgICAgICAgICBqOCA9IDggKiBzdHJpZGUsCisgICAgICAgICAgICAgICAgIGo5ID0gOSAqIHN0cmlkZTsKKworICAgIHZxcCA9IHZlY19zcGxhdCh2cXAsIDApOworCisgICAgc3JjMiArPSBzdHJpZGUqMzsKKworI2RlZmluZSBMT0FEX0xJTkUoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBlcm1sIyNpID0gdmVjX2x2c2woaSAqIHN0cmlkZSwgc3JjMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZiQSMjaSA9IHZlY19sZChpICogc3RyaWRlLCBzcmMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZiQiMjaSA9IHZlY19sZChpICogc3RyaWRlICsgMTYsIHNyYzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZiVCMjaSA9IHZlY19wZXJtKHZiQSMjaSwgdmJCIyNpLCBwZXJtbCMjaSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZiIyNpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydCl2ZWNfbWVyZ2VoKCh2ZWN0b3IgdW5zaWduZWQgY2hhcil6ZXJvLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2YlQjI2kpCisKKyNkZWZpbmUgTE9BRF9MSU5FX0FMSUdORUQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2YlQjI2kgPSB2ZWNfbGQoaiMjaSwgc3JjMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2YiMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpdmVjX21lcmdlaCgodmVjdG9yIHNpZ25lZCBjaGFyKXplcm8sICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBjaGFyKXZiVCMjaSkKKworICAgICAgLyogU3BlY2lhbC1jYXNpbmcgdGhlIGFsaWduZWQgY2FzZSBpcyB3b3J0aHdoaWxlLCBhcyBhbGwgY2FsbHMgZnJvbQorICAgICAgICogdGhlICh0cmFuc3Bvc2VkKSBob3Jpem9udGFibGUgZGVibG9ja3Mgd2lsbCBiZSBhbGlnbmVkLCBpbiBhZGRpdGlvbgorICAgICAgICogdG8gdGhlIG5hdHVyYWxseSBhbGlnbmVkIHZlcnRpY2FsIGRlYmxvY2tzLiAqLworICAgIGlmIChwcm9wZXJTdHJpZGUgJiYgc3JjQWxpZ24pIHsKKyAgICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCgwKTsKKyAgICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCgxKTsKKyAgICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCgyKTsKKyAgICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCgzKTsKKyAgICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCg0KTsKKyAgICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCg1KTsKKyAgICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCg2KTsKKyAgICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCg3KTsKKyAgICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCg4KTsKKyAgICAgICAgICBMT0FEX0xJTkVfQUxJR05FRCg5KTsKKyAgICB9IGVsc2UgeworICAgICAgICAgIExPQURfTElORSgwKTsKKyAgICAgICAgICBMT0FEX0xJTkUoMSk7CisgICAgICAgICAgTE9BRF9MSU5FKDIpOworICAgICAgICAgIExPQURfTElORSgzKTsKKyAgICAgICAgICBMT0FEX0xJTkUoNCk7CisgICAgICAgICAgTE9BRF9MSU5FKDUpOworICAgICAgICAgIExPQURfTElORSg2KTsKKyAgICAgICAgICBMT0FEX0xJTkUoNyk7CisgICAgICAgICAgTE9BRF9MSU5FKDgpOworICAgICAgICAgIExPQURfTElORSg5KTsKKyAgICB9CisjdW5kZWYgTE9BRF9MSU5FCisjdW5kZWYgTE9BRF9MSU5FX0FMSUdORUQKKyAgICB7CisgICAgICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2XzIgPSB2ZWNfc3BsYXRfdTE2KDIpOworICAgICAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdl80ID0gdmVjX3NwbGF0X3UxNig0KTsKKworICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZfZGlmZjAxID0gdmVjX3N1Yih2YjAsIHZiMSk7CisgICAgICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2X2NtcDAxID0KKyAgICAgICAgICAgIChjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQpIHZlY19jbXBsdCh2ZWNfYWJzKHZfZGlmZjAxKSwgdnFwKTsKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB2X2ZpcnN0ID0gdmVjX3NlbCh2YjEsIHZiMCwgdl9jbXAwMSk7CisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl9kaWZmODkgPSB2ZWNfc3ViKHZiOCwgdmI5KTsKKyAgICAgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZfY21wODkgPQorICAgICAgICAgICAgKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCkgdmVjX2NtcGx0KHZlY19hYnModl9kaWZmODkpLCB2cXApOworICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZfbGFzdCA9IHZlY19zZWwodmI4LCB2YjksIHZfY21wODkpOworCisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdGVtcDAxID0gdmVjX21sYWRkKHZfZmlyc3QsICh2ZWN0b3Igc2lnbmVkIHNob3J0KXZfNCwgdmIxKTsKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB0ZW1wMDIgPSB2ZWNfYWRkKHZiMiwgdmIzKTsKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB0ZW1wMDMgPSB2ZWNfYWRkKHRlbXAwMSwgKHZlY3RvciBzaWduZWQgc2hvcnQpdl80KTsKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB2X3N1bXNCMCA9IHZlY19hZGQodGVtcDAyLCB0ZW1wMDMpOworCisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdGVtcDExID0gdmVjX3N1Yih2X3N1bXNCMCwgdl9maXJzdCk7CisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl9zdW1zQjEgPSB2ZWNfYWRkKHRlbXAxMSwgdmI0KTsKKworICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHRlbXAyMSA9IHZlY19zdWIodl9zdW1zQjEsIHZfZmlyc3QpOworICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZfc3Vtc0IyID0gdmVjX2FkZCh0ZW1wMjEsIHZiNSk7CisKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB0ZW1wMzEgPSB2ZWNfc3ViKHZfc3Vtc0IyLCB2X2ZpcnN0KTsKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB2X3N1bXNCMyA9IHZlY19hZGQodGVtcDMxLCB2YjYpOworCisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdGVtcDQxID0gdmVjX3N1Yih2X3N1bXNCMywgdl9maXJzdCk7CisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl9zdW1zQjQgPSB2ZWNfYWRkKHRlbXA0MSwgdmI3KTsKKworICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHRlbXA1MSA9IHZlY19zdWIodl9zdW1zQjQsIHZiMSk7CisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl9zdW1zQjUgPSB2ZWNfYWRkKHRlbXA1MSwgdmI4KTsKKworICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHRlbXA2MSA9IHZlY19zdWIodl9zdW1zQjUsIHZiMik7CisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl9zdW1zQjYgPSB2ZWNfYWRkKHRlbXA2MSwgdl9sYXN0KTsKKworICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHRlbXA3MSA9IHZlY19zdWIodl9zdW1zQjYsIHZiMyk7CisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl9zdW1zQjcgPSB2ZWNfYWRkKHRlbXA3MSwgdl9sYXN0KTsKKworICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHRlbXA4MSA9IHZlY19zdWIodl9zdW1zQjcsIHZiNCk7CisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl9zdW1zQjggPSB2ZWNfYWRkKHRlbXA4MSwgdl9sYXN0KTsKKworICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHRlbXA5MSA9IHZlY19zdWIodl9zdW1zQjgsIHZiNSk7CisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl9zdW1zQjkgPSB2ZWNfYWRkKHRlbXA5MSwgdl9sYXN0KTsKKworICAgICNkZWZpbmUgQ09NUFVURV9WUihpLCBqLCBrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB0ZW1wczEjI2kgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2ZWNfYWRkKHZfc3Vtc0IjI2ksIHZfc3Vtc0IjI2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHRlbXBzMiMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZlY19tbGFkZCh2YiMjaiwgKHZlY3RvciBzaWduZWQgc2hvcnQpdl8yLCB0ZW1wczEjI2kpOyAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgIHZyIyNqID0gdmVjX3NyYSh0ZW1wczIjI2ksIHZfNCkKKworICAgICAgICBDT01QVVRFX1ZSKDAsIDEsIDIpOworICAgICAgICBDT01QVVRFX1ZSKDEsIDIsIDMpOworICAgICAgICBDT01QVVRFX1ZSKDIsIDMsIDQpOworICAgICAgICBDT01QVVRFX1ZSKDMsIDQsIDUpOworICAgICAgICBDT01QVVRFX1ZSKDQsIDUsIDYpOworICAgICAgICBDT01QVVRFX1ZSKDUsIDYsIDcpOworICAgICAgICBDT01QVVRFX1ZSKDYsIDcsIDgpOworICAgICAgICBDT01QVVRFX1ZSKDcsIDgsIDkpOworCisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgY2hhciBuZWcxID0gdmVjX3NwbGF0X3M4KC0xKTsKKyAgICAgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybUhIID0gKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKXsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgsIDB4MTksIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUZ9OworCisjZGVmaW5lIFBBQ0tfQU5EX1NUT1JFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm1zIyNpID0gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX2x2c3IoaSAqIHN0cmlkZSwgc3JjMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmYjI2kgPSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ZWNfcGFja3N1KHZyIyNpLCAodmVjdG9yIHNpZ25lZCBzaG9ydCl6ZXJvKTsgICAgICAgICAgIFwKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZyMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZlY19wZXJtKHZmIyNpLCB2YlQjI2ksIHBlcm1ISCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIG1hc2sjI2kgPSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBjaGFyKXplcm8sICh2ZWN0b3IgdW5zaWduZWQgY2hhciluZWcxLCBwZXJtcyMjaSk7IFwKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZzIjI2kgPSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZlY19wZXJtKHZnIyNpLCB2ZyMjaSwgcGVybXMjI2kpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHN2QSMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3NlbCh2YkEjI2ksIHZnMiMjaSwgbWFzayMjaSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc3ZCIyNpID0gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ZWNfc2VsKHZnMiMjaSwgdmJCIyNpLCBtYXNrIyNpKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfc3Qoc3ZBIyNpLCBpICogc3RyaWRlLCBzcmMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjX3N0KHN2QiMjaSwgaSAqIHN0cmlkZSArIDE2LCBzcmMyKTt9CisKKyNkZWZpbmUgUEFDS19BTkRfU1RPUkVfQUxJR05FRChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmYjI2kgPSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ZWNfcGFja3N1KHZyIyNpLCAodmVjdG9yIHNpZ25lZCBzaG9ydCl6ZXJvKTsgICAgICAgICAgIFwKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZyMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZlY19wZXJtKHZmIyNpLCB2YlQjI2ksIHBlcm1ISCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY19zdCh2ZyMjaSwgaSAqIHN0cmlkZSwgc3JjMik7fQorCisgICAgICAgIC8qIFNwZWNpYWwtY2FzaW5nIHRoZSBhbGlnbmVkIGNhc2UgaXMgd29ydGh3aGlsZSwgYXMgYWxsIGNhbGxzIGZyb20KKyAgICAgICAgICogdGhlICh0cmFuc3Bvc2VkKSBob3Jpem9udGFibGUgZGVibG9ja3Mgd2lsbCBiZSBhbGlnbmVkLCBpbiBhZGRpdGlvbgorICAgICAgICAgKiB0byB0aGUgbmF0dXJhbGx5IGFsaWduZWQgdmVydGljYWwgZGVibG9ja3MuICovCisgICAgICAgIGlmIChwcm9wZXJTdHJpZGUgJiYgc3JjQWxpZ24pIHsKKyAgICAgICAgICAgIFBBQ0tfQU5EX1NUT1JFX0FMSUdORUQoMSkKKyAgICAgICAgICAgIFBBQ0tfQU5EX1NUT1JFX0FMSUdORUQoMikKKyAgICAgICAgICAgIFBBQ0tfQU5EX1NUT1JFX0FMSUdORUQoMykKKyAgICAgICAgICAgIFBBQ0tfQU5EX1NUT1JFX0FMSUdORUQoNCkKKyAgICAgICAgICAgIFBBQ0tfQU5EX1NUT1JFX0FMSUdORUQoNSkKKyAgICAgICAgICAgIFBBQ0tfQU5EX1NUT1JFX0FMSUdORUQoNikKKyAgICAgICAgICAgIFBBQ0tfQU5EX1NUT1JFX0FMSUdORUQoNykKKyAgICAgICAgICAgIFBBQ0tfQU5EX1NUT1JFX0FMSUdORUQoOCkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBBQ0tfQU5EX1NUT1JFKDEpCisgICAgICAgICAgICBQQUNLX0FORF9TVE9SRSgyKQorICAgICAgICAgICAgUEFDS19BTkRfU1RPUkUoMykKKyAgICAgICAgICAgIFBBQ0tfQU5EX1NUT1JFKDQpCisgICAgICAgICAgICBQQUNLX0FORF9TVE9SRSg1KQorICAgICAgICAgICAgUEFDS19BTkRfU1RPUkUoNikKKyAgICAgICAgICAgIFBBQ0tfQU5EX1NUT1JFKDcpCisgICAgICAgICAgICBQQUNLX0FORF9TVE9SRSg4KQorICAgICAgICB9CisgICAgI3VuZGVmIFBBQ0tfQU5EX1NUT1JFCisgICAgI3VuZGVmIFBBQ0tfQU5EX1NUT1JFX0FMSUdORUQKKyAgICB9Cit9CisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgZG9WZXJ0RGVmRmlsdGVyX2FsdGl2ZWModWludDhfdCBzcmNbXSwgaW50IHN0cmlkZSwgUFBDb250ZXh0ICpjKSB7CisgICAgLyoKKyAgICB0aGlzIGNvZGUgbWFrZXMgbm8gYXNzdW1wdGlvbiBvbiBzcmMgb3Igc3RyaWRlLgorICAgIE9uZSBjb3VsZCByZW1vdmUgdGhlIHJlY29tcHV0YXRpb24gb2YgdGhlIHBlcm0KKyAgICB2ZWN0b3IgYnkgYXNzdW1pbmcgKHN0cmlkZSAlIDE2KSA9PSAwLCB1bmZvcnR1bmF0ZWx5CisgICAgdGhpcyBpcyBub3QgYWx3YXlzIHRydWUuIFF1aXRlIGEgbG90IG9mIGxvYWQvc3RvcmVzCisgICAgY2FuIGJlIHJlbW92ZWQgYnkgYXNzdW1pbmcgcHJvcGVyIGFsaWdubWVudCBvZgorICAgIHNyYyAmIHN0cmlkZSA6LSgKKyAgICAqLworICAgIHVpbnQ4X3QgKnNyYzIgPSBzcmMgKyBzdHJpZGUqMzsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCB6ZXJvID0gdmVjX3NwbGF0X3MzMigwKTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNob3J0LCBxcClbOF0gPSB7OCpjLT5RUH07CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCB2cXAgPSB2ZWNfc3BsYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KXZlY19sZCgwLCBxcCksIDApOworCisjZGVmaW5lIExPQURfTElORShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybSMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZlY19sdnNsKGkgKiBzdHJpZGUsIHNyYzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmJBIyNpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZlY19sZChpICogc3RyaWRlLCBzcmMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmJCIyNpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZlY19sZChpICogc3RyaWRlICsgMTYsIHNyYzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmJUIyNpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZlY19wZXJtKHZiQSMjaSwgdmJCIyNpLCBwZXJtIyNpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB2YiMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KXZlY19tZXJnZWgoKHZlY3RvciB1bnNpZ25lZCBjaGFyKXplcm8sICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZiVCMjaSkKKworICAgICBMT0FEX0xJTkUoMSk7CisgICAgIExPQURfTElORSgyKTsKKyAgICAgTE9BRF9MSU5FKDMpOworICAgICBMT0FEX0xJTkUoNCk7CisgICAgIExPQURfTElORSg1KTsKKyAgICAgTE9BRF9MSU5FKDYpOworICAgICBMT0FEX0xJTkUoNyk7CisgICAgIExPQURfTElORSg4KTsKKyN1bmRlZiBMT0FEX0xJTkUKKworICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZfMSA9IHZlY19zcGxhdF9zMTYoMSk7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl8yID0gdmVjX3NwbGF0X3MxNigyKTsKKyAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB2XzUgPSB2ZWNfc3BsYXRfczE2KDUpOworICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZfMzIgPSB2ZWNfc2wodl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2XzUpOworICAgICAvKiBtaWRkbGUgZW5lcmd5ICovCisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgbDNtaW51c2w2ID0gdmVjX3N1Yih2YjMsIHZiNik7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgbDVtaW51c2w0ID0gdmVjX3N1Yih2YjUsIHZiNCk7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdHdvdGltZXNfbDNtaW51c2w2ID0gdmVjX21sYWRkKHZfMiwgbDNtaW51c2w2LCAodmVjdG9yIHNpZ25lZCBzaG9ydCl6ZXJvKTsKKyAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCBtRSA9IHZlY19tbGFkZCh2XzUsIGw1bWludXNsNCwgdHdvdGltZXNfbDNtaW51c2w2KTsKKyAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCBhYnNtRSA9IHZlY19hYnMobUUpOworICAgICAvKiBsZWZ0ICYgcmlnaHQgZW5lcmd5ICovCisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgbDFtaW51c2w0ID0gdmVjX3N1Yih2YjEsIHZiNCk7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgbDNtaW51c2wyID0gdmVjX3N1Yih2YjMsIHZiMik7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgbDVtaW51c2w4ID0gdmVjX3N1Yih2YjUsIHZiOCk7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgbDdtaW51c2w2ID0gdmVjX3N1Yih2YjcsIHZiNik7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdHdvdGltZXNfbDFtaW51c2w0ID0gdmVjX21sYWRkKHZfMiwgbDFtaW51c2w0LCAodmVjdG9yIHNpZ25lZCBzaG9ydCl6ZXJvKTsKKyAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB0d290aW1lc19sNW1pbnVzbDggPSB2ZWNfbWxhZGQodl8yLCBsNW1pbnVzbDgsICh2ZWN0b3Igc2lnbmVkIHNob3J0KXplcm8pOworICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IGxFID0gdmVjX21sYWRkKHZfNSwgbDNtaW51c2wyLCB0d290aW1lc19sMW1pbnVzbDQpOworICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHJFID0gdmVjX21sYWRkKHZfNSwgbDdtaW51c2w2LCB0d290aW1lc19sNW1pbnVzbDgpOworICAgICAvKiBkICovCisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgZGRpZmYgPSB2ZWNfc3ViKGFic21FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNfbWluKHZlY19hYnMobEUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY19hYnMockUpKSk7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgZGRpZmZjbGFtcCA9IHZlY19tYXgoZGRpZmYsICh2ZWN0b3Igc2lnbmVkIHNob3J0KXplcm8pOworICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IGR0aW1lczY0ID0gdmVjX21sYWRkKHZfNSwgZGRpZmZjbGFtcCwgdl8zMik7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgZCA9IHZlY19zcmEoZHRpbWVzNjQsIHZlY19zcGxhdF91MTYoNikpOworICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IG1pbnVzZCA9IHZlY19zdWIoKHZlY3RvciBzaWduZWQgc2hvcnQpemVybywgZCk7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgZmluYWxkID0gdmVjX3NlbChtaW51c2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjX2NtcGd0KHZlY19zdWIoKHZlY3RvciBzaWduZWQgc2hvcnQpemVybywgbUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KXplcm8pKTsKKyAgICAgLyogcSAqLworICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHF0aW1lczIgPSB2ZWNfc3ViKHZiNCwgdmI1KTsKKyAgICAgLyogZm9yIGEgc2hpZnQgcmlnaHQgdG8gYmVoYXZlIGxpa2UgLzIsIHdlIG5lZWQgdG8gYWRkIG9uZQorICAgICAgICB0byBhbGwgbmVnYXRpdmUgaW50ZWdlciAqLworICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHJvdW5kZG93biA9IHZlY19zZWwoKHZlY3RvciBzaWduZWQgc2hvcnQpemVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY19jbXBsdChxdGltZXMyLCAodmVjdG9yIHNpZ25lZCBzaG9ydCl6ZXJvKSk7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgcSA9IHZlY19zcmEodmVjX2FkZChxdGltZXMyLCByb3VuZGRvd24pLCB2ZWNfc3BsYXRfdTE2KDEpKTsKKyAgICAgLyogY2xhbXAgKi8KKyAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCBkY2xhbXBfUDEgPSB2ZWNfbWF4KCh2ZWN0b3Igc2lnbmVkIHNob3J0KXplcm8sIGZpbmFsZCk7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgZGNsYW1wX1AgPSB2ZWNfbWluKGRjbGFtcF9QMSwgcSk7CisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgZGNsYW1wX04xID0gdmVjX21pbigodmVjdG9yIHNpZ25lZCBzaG9ydCl6ZXJvLCBmaW5hbGQpOworICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IGRjbGFtcF9OID0gdmVjX21heChkY2xhbXBfTjEsIHEpOworCisgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgZGNsYW1wZWRmaW5hbCA9IHZlY19zZWwoZGNsYW1wX04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNsYW1wX1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjX2NtcGd0KHEsICh2ZWN0b3Igc2lnbmVkIHNob3J0KXplcm8pKTsKKyAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCBkb3Jub3RkID0gdmVjX3NlbCgodmVjdG9yIHNpZ25lZCBzaG9ydCl6ZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjbGFtcGVkZmluYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjX2NtcGx0KGFic21FLCB2cXApKTsKKyAgICAgLyogYWRkL3N1YnRyYWN0IHRvIGw0IGFuZCBsNSAqLworICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZiNG1pbnVzZCA9IHZlY19zdWIodmI0LCBkb3Jub3RkKTsKKyAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB2YjVwbHVzZCAgPSB2ZWNfYWRkKHZiNSwgZG9ybm90ZCk7CisgICAgIC8qIGZpbmFsbHksIHN0b3JlcyAqLworICAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBzdDQgPSB2ZWNfcGFja3N1KHZiNG1pbnVzZCwgKHZlY3RvciBzaWduZWQgc2hvcnQpemVybyk7CisgICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHN0NSA9IHZlY19wYWNrc3UodmI1cGx1c2QsICAodmVjdG9yIHNpZ25lZCBzaG9ydCl6ZXJvKTsKKworICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGNoYXIgbmVnMSA9IHZlY19zcGxhdF9zOCgtMSk7CisgICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm1ISCA9IChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhcil7MHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFLCAweDFGfTsKKworI2RlZmluZSBTVE9SRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybXMjI2kgPSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICB2ZWNfbHZzcihpICogc3RyaWRlLCBzcmMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZyMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIHZlY19wZXJtKHN0IyNpLCB2YlQjI2ksIHBlcm1ISCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIG1hc2sjI2kgPSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBjaGFyKXplcm8sICh2ZWN0b3IgdW5zaWduZWQgY2hhciluZWcxLCBwZXJtcyMjaSk7IFwKKyAgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmcyIyNpID0gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICB2ZWNfcGVybSh2ZyMjaSwgdmcjI2ksIHBlcm1zIyNpKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBzdkEjI2kgPSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIHZlY19zZWwodmJBIyNpLCB2ZzIjI2ksIG1hc2sjI2kpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHN2QiMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgdmVjX3NlbCh2ZzIjI2ksIHZiQiMjaSwgbWFzayMjaSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgdmVjX3N0KHN2QSMjaSwgaSAqIHN0cmlkZSwgc3JjMik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHZlY19zdChzdkIjI2ksIGkgKiBzdHJpZGUgKyAxNiwgc3JjMik7fQorCisgICAgIFNUT1JFKDQpCisgICAgIFNUT1JFKDUpCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXJpbmdfYWx0aXZlYyh1aW50OF90IHNyY1tdLCBpbnQgc3RyaWRlLCBQUENvbnRleHQgKmMpIHsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCB2c2ludDMyXzggPSB2ZWNfc3BsYXRfczMyKDgpOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdnVpbnQzMl80ID0gdmVjX3NwbGF0X3UzMig0KTsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGNoYXIgbmVnMSA9IHZlY19zcGxhdF9zOCgtMSk7CisKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtQTEgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpCisgICAgICAgIHsweDAwLCAweDAxLCAweDAyLCAweDEwLCAweDExLCAweDEyLCAweDFGLCAweDFGLAorICAgICAgICAgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRn07CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybUEyID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKQorICAgICAgICB7MHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgxMCwgMHgxMSwKKyAgICAgICAgIDB4MTIsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUZ9OworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm1BMWluYyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikKKyAgICAgICAgezB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtQTJpbmMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpCisgICAgICAgIHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLAorICAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWFnaWMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpCisgICAgICAgIHsweDAxLCAweDAyLCAweDAxLCAweDAyLCAweDA0LCAweDAyLCAweDAxLCAweDAyLAorICAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgZXh0cmFjdFBlcm0gPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpCisgICAgICAgIHsweDEwLCAweDEwLCAweDEwLCAweDAxLCAweDEwLCAweDEwLCAweDEwLCAweDAxLAorICAgICAgICAgMHgxMCwgMHgxMCwgMHgxMCwgMHgwMSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgwMX07CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgZXh0cmFjdFBlcm1JbmMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpCisgICAgICAgIHsweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX07CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgaWRlbnRpdHkgPSB2ZWNfbHZzbCgwLCh1bnNpZ25lZCBjaGFyICopMCk7CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVuUmlnaHQgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpCisgICAgICAgIHsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgZWlnaHRMZWZ0ID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKQorICAgICAgICB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDh9OworCisgICAgLyoKKyAgICB0aGlzIGNvZGUgbWFrZXMgbm8gYXNzdW1wdGlvbiBvbiBzcmMgb3Igc3RyaWRlLgorICAgIE9uZSBjb3VsZCByZW1vdmUgdGhlIHJlY29tcHV0YXRpb24gb2YgdGhlIHBlcm0KKyAgICB2ZWN0b3IgYnkgYXNzdW1pbmcgKHN0cmlkZSAlIDE2KSA9PSAwLCB1bmZvcnR1bmF0ZWx5CisgICAgdGhpcyBpcyBub3QgYWx3YXlzIHRydWUuIFF1aXRlIGEgbG90IG9mIGxvYWQvc3RvcmVzCisgICAgY2FuIGJlIHJlbW92ZWQgYnkgYXNzdW1pbmcgcHJvcGVyIGFsaWdubWVudCBvZgorICAgIHNyYyAmIHN0cmlkZSA6LSgKKyAgICAqLworICAgIHVpbnQ4X3QgKnNyY0NvcHkgPSBzcmM7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBkdClbMTZdID0geyBkZXJpbmdUaHJlc2hvbGQgfTsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCB6ZXJvID0gdmVjX3NwbGF0X3MzMigwKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X2R0ID0gdmVjX3NwbGF0KHZlY19sZCgwLCBkdCksIDApOworCisjZGVmaW5lIExPQURfTElORShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm0jI2kgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX2x2c2woaSAqIHN0cmlkZSwgc3JjQ29weSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc0EjI2kgPSB2ZWNfbGQoaSAqIHN0cmlkZSwgc3JjQ29weSk7ICAgICAgICAgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNCIyNpID0gdmVjX2xkKGkgKiBzdHJpZGUgKyAxNiwgc3JjQ29weSk7ICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBzcmMjI2kgPSB2ZWNfcGVybShzQSMjaSwgc0IjI2ksIHBlcm0jI2kpCisKKyAgICBMT0FEX0xJTkUoMCk7CisgICAgTE9BRF9MSU5FKDEpOworICAgIExPQURfTElORSgyKTsKKyAgICBMT0FEX0xJTkUoMyk7CisgICAgTE9BRF9MSU5FKDQpOworICAgIExPQURfTElORSg1KTsKKyAgICBMT0FEX0xJTkUoNik7CisgICAgTE9BRF9MSU5FKDcpOworICAgIExPQURfTElORSg4KTsKKyAgICBMT0FEX0xJTkUoOSk7CisjdW5kZWYgTE9BRF9MSU5FCisKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X2F2ZzsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNpZ25lZCBpbnQsIFMpWzhdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50LCB0UVAyKVs0XSA9IHsgYy0+UVAvMiArIDEgfTsKKyAgICB2ZWN0b3Igc2lnbmVkIGludCB2UVAyID0gdmVjX2xkKDAsIHRRUDIpOworICAgIHZRUDIgPSB2ZWNfc3BsYXQodlFQMiwgMCk7CisKKyAgICB7CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdHJ1bmNfcGVybSA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikKKyAgICAgICAgezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsCisgICAgICAgICAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4fTsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB0cnVuY19zcmMxMiA9IHZlY19wZXJtKHNyYzEsIHNyYzIsIHRydW5jX3Blcm0pOworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHRydW5jX3NyYzM0ID0gdmVjX3Blcm0oc3JjMywgc3JjNCwgdHJ1bmNfcGVybSk7CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdHJ1bmNfc3JjNTYgPSB2ZWNfcGVybShzcmM1LCBzcmM2LCB0cnVuY19wZXJtKTsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB0cnVuY19zcmM3OCA9IHZlY19wZXJtKHNyYzcsIHNyYzgsIHRydW5jX3Blcm0pOworCisjZGVmaW5lIEVYVFJBQ1Qob3ApIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc18xICAgPSB2ZWNfIyNvcCh0cnVuY19zcmMxMiwgdHJ1bmNfc3JjMzQpOyBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc18yICAgPSB2ZWNfIyNvcCh0cnVuY19zcmM1NiwgdHJ1bmNfc3JjNzgpOyBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc182ICAgPSB2ZWNfIyNvcChzXzEsIHNfMik7ICAgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc184aCAgPSB2ZWNfbWVyZ2VoKHNfNiwgc182KTsgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc184bCAgPSB2ZWNfbWVyZ2VsKHNfNiwgc182KTsgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc185ICAgPSB2ZWNfIyNvcChzXzhoLCBzXzhsKTsgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc185aCAgPSB2ZWNfbWVyZ2VoKHNfOSwgc185KTsgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc185bCAgPSB2ZWNfbWVyZ2VsKHNfOSwgc185KTsgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc18xMCAgPSB2ZWNfIyNvcChzXzloLCBzXzlsKTsgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc18xMGggPSB2ZWNfbWVyZ2VoKHNfMTAsIHNfMTApOyBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc18xMGwgPSB2ZWNfbWVyZ2VsKHNfMTAsIHNfMTApOyBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc18xMSAgPSB2ZWNfIyNvcChzXzEwaCwgc18xMGwpOyBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc18xMWggPSB2ZWNfbWVyZ2VoKHNfMTEsIHNfMTEpOyBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc18xMWwgPSB2ZWNfbWVyZ2VsKHNfMTEsIHNfMTEpOyBcCisgICAgdl8jI29wID0gdmVjXyMjb3Aoc18xMWgsIHNfMTFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl9taW47CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl9tYXg7CisgICAgRVhUUkFDVChtaW4pOworICAgIEVYVFJBQ1QobWF4KTsKKyN1bmRlZiBFWFRSQUNUCisKKyAgICBpZiAodmVjX2FsbF9sdCh2ZWNfc3ViKHZfbWF4LCB2X21pbiksIHZfZHQpKQorICAgICAgICByZXR1cm47CisKKyAgICB2X2F2ZyA9IHZlY19hdmcodl9taW4sIHZfbWF4KTsKKyAgICB9CisKKyAgICB7CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0IG1hc2sxID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODB9OworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCBtYXNrMiA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDEwMCwgMHgwMjAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwfTsKKworICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdnVpbnQzMl8xNiA9IHZlY19zbCh2ZWNfc3BsYXRfdTMyKDEpLCB2ZWNfc3BsYXRfdTMyKDQpKTsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aW50MzJfMSA9IHZlY19zcGxhdF91MzIoMSk7CisKKyAgICB2ZWN0b3Igc2lnbmVkIGludCBzdW1BMjsKKyAgICB2ZWN0b3Igc2lnbmVkIGludCBzdW1CMjsKKyAgICB2ZWN0b3Igc2lnbmVkIGludCBzdW0wLCBzdW0xLCBzdW0yLCBzdW0zLCBzdW00OworICAgIHZlY3RvciBzaWduZWQgaW50IHN1bTUsIHN1bTYsIHN1bTcsIHN1bTgsIHN1bTk7CisKKyNkZWZpbmUgQ09NUEFSRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgY21wID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfY21wZ3Qoc3JjIyNpLCB2X2F2Zyk7ICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0IGNtcEhpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX21lcmdlaChjbXAsIGNtcCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0IGNtcExpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX21lcmdlbChjbXAsIGNtcCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCBjbXBIZiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KXZlY19hbmQoY21wSGksIG1hc2sxKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCBjbXBMZiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KXZlY19hbmQoY21wTGksIG1hc2syKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgc3VtcCA9IHZlY19zdW00cyhjbXBIZiwgemVybyk7ICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgc3VtcSA9IHZlY19zdW00cyhjbXBMZiwgc3VtcCk7ICAgICAgICAgIFwKKyAgICAgICAgc3VtIyNpICA9IHZlY19zdW1zKHN1bXEsIHplcm8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgQ09NUEFSRSgwKTsKKyAgICBDT01QQVJFKDEpOworICAgIENPTVBBUkUoMik7CisgICAgQ09NUEFSRSgzKTsKKyAgICBDT01QQVJFKDQpOworICAgIENPTVBBUkUoNSk7CisgICAgQ09NUEFSRSg2KTsKKyAgICBDT01QQVJFKDcpOworICAgIENPTVBBUkUoOCk7CisgICAgQ09NUEFSRSg5KTsKKyN1bmRlZiBDT01QQVJFCisKKyAgICB7CisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgc3VtcDAyID0gdmVjX21lcmdlbChzdW0wLCBzdW0yKTsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCBzdW1wMTMgPSB2ZWNfbWVyZ2VsKHN1bTEsIHN1bTMpOworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgaW50IHN1bUEgPSB2ZWNfbWVyZ2VsKHN1bXAwMiwgc3VtcDEzKTsKKworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgaW50IHN1bXA0NiA9IHZlY19tZXJnZWwoc3VtNCwgc3VtNik7CisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgc3VtcDU3ID0gdmVjX21lcmdlbChzdW01LCBzdW03KTsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCBzdW1CID0gdmVjX21lcmdlbChzdW1wNDYsIHN1bXA1Nyk7CisKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCBzdW1wOEEgPSB2ZWNfbWVyZ2VsKHN1bTgsIHplcm8pOworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgaW50IHN1bXA5QiA9IHZlY19tZXJnZWwoc3VtOSwgemVybyk7CisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgc3VtQyA9IHZlY19tZXJnZWwoc3VtcDhBLCBzdW1wOUIpOworCisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgdEEgPSB2ZWNfc2wodmVjX25vcih6ZXJvLCBzdW1BKSwgdnVpbnQzMl8xNik7CisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgdEIgPSB2ZWNfc2wodmVjX25vcih6ZXJvLCBzdW1CKSwgdnVpbnQzMl8xNik7CisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgdEMgPSB2ZWNfc2wodmVjX25vcih6ZXJvLCBzdW1DKSwgdnVpbnQzMl8xNik7CisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgdDJBID0gdmVjX29yKHN1bUEsIHRBKTsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCB0MkIgPSB2ZWNfb3Ioc3VtQiwgdEIpOworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgaW50IHQyQyA9IHZlY19vcihzdW1DLCB0Qyk7CisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgdDNBID0gdmVjX2FuZCh2ZWNfc3JhKHQyQSwgdnVpbnQzMl8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY19zbCh0MkEsIHZ1aW50MzJfMSkpOworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgaW50IHQzQiA9IHZlY19hbmQodmVjX3NyYSh0MkIsIHZ1aW50MzJfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNfc2wodDJCLCB2dWludDMyXzEpKTsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCB0M0MgPSB2ZWNfYW5kKHZlY19zcmEodDJDLCB2dWludDMyXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjX3NsKHQyQywgdnVpbnQzMl8xKSk7CisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgeUEgPSB2ZWNfYW5kKHQyQSwgdDNBKTsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCB5QiA9IHZlY19hbmQodDJCLCB0M0IpOworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgaW50IHlDID0gdmVjX2FuZCh0MkMsIHQzQyk7CisKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBzdHJhbmdlcGVybTEgPSB2ZWNfbHZzbCg0LCAodW5zaWduZWQgY2hhciopMCk7CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc3RyYW5nZXBlcm0yID0gdmVjX2x2c2woOCwgKHVuc2lnbmVkIGNoYXIqKTApOworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgaW50IHN1bUFkNCA9IHZlY19wZXJtKHlBLCB5Qiwgc3RyYW5nZXBlcm0xKTsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCBzdW1BZDggPSB2ZWNfcGVybSh5QSwgeUIsIHN0cmFuZ2VwZXJtMik7CisgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgc3VtQmQ0ID0gdmVjX3Blcm0oeUIsIHlDLCBzdHJhbmdlcGVybTEpOworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgaW50IHN1bUJkOCA9IHZlY19wZXJtKHlCLCB5Qywgc3RyYW5nZXBlcm0yKTsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCBzdW1BcCA9IHZlY19hbmQoeUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY19hbmQoc3VtQWQ0LHN1bUFkOCkpOworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgaW50IHN1bUJwID0gdmVjX2FuZCh5QiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjX2FuZChzdW1CZDQsc3VtQmQ4KSk7CisgICAgc3VtQTIgPSB2ZWNfb3Ioc3VtQXAsCisgICAgICAgICAgICAgICAgICAgdmVjX3NyYShzdW1BcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ1aW50MzJfMTYpKTsKKyAgICBzdW1CMiAgPSB2ZWNfb3Ioc3VtQnAsCisgICAgICAgICAgICAgICAgICAgIHZlY19zcmEoc3VtQnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnVpbnQzMl8xNikpOworICAgIH0KKyAgICB2ZWNfc3Qoc3VtQTIsIDAsIFMpOworICAgIHZlY19zdChzdW1CMiwgMTYsIFMpOworICAgIH0KKworICAgIC8qIEknbSBub3Qgc3VyZSB0aGUgZm9sbG93aW5nIGlzIGFjdHVhbGx5IGZhc3RlcgorICAgICAgIHRoYW4gc3RyYWlnaHQsIHVudmVjdG9yaXplZCBDIGNvZGUgOi0oICovCisKKyNkZWZpbmUgRl9JTklUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVuUmlnaHRNID0gdGVuUmlnaHQ7ICAgICAgICAgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm1BMU0gPSBwZXJtQTE7ICAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtQTJNID0gcGVybUEyOyAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgZXh0cmFjdFBlcm1NID0gZXh0cmFjdFBlcm0KKworI2RlZmluZSBGMihpLCBqLCBrLCBsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChTW2ldICYgKDEgPDwgKGwrMSkpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBhX0EgPSB2ZWNfcGVybShzcmMjI2ksIHNyYyMjaiwgcGVybUExTSk7IFwKKyAgICAgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgYV9CID0gdmVjX3Blcm0oYV9BLCBzcmMjI2ssIHBlcm1BMk0pOyBcCisgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgaW50IGFfc3VtcCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBpbnQpdmVjX21zdW0oYV9CLCBtYWdpYywgKHZlY3RvciB1bnNpZ25lZCBpbnQpemVybyk7XAorICAgICAgICB2ZWN0b3Igc2lnbmVkIGludCBGID0gdmVjX3NyKHZlY19zdW1zKGFfc3VtcCwgdnNpbnQzMl84KSwgdnVpbnQzMl80KTsgXAorICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCBwID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgaW50KXZlY19wZXJtKHNyYyMjaiwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXplcm8sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0UGVybU0pOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgc3VtICA9IHZlY19hZGQocCwgdlFQMik7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgZGlmZiA9IHZlY19zdWIocCwgdlFQMik7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjdG9yIHNpZ25lZCBpbnQgbmV3cG07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbmV3cG0yLCBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRiA9IHZlY19zcGxhdChGLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHZlY19hbGxfbHQoc3VtLCBGKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld3BtID0gc3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSBpZiAodmVjX2FsbF9ndChkaWZmLCBGKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld3BtID0gZGlmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSBuZXdwbSA9IEY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3cG0yID0gdmVjX3NwbGF0KCh2ZWN0b3IgdW5zaWduZWQgY2hhciluZXdwbSwgMTUpOyAgICAgICAgICAgIFwKKyAgICAgICAgbWFzayA9IHZlY19hZGQoaWRlbnRpdHksIHRlblJpZ2h0TSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjIyNqID0gdmVjX3Blcm0oc3JjIyNqLCBuZXdwbTIsIG1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwZXJtQTFNID0gdmVjX2FkZChwZXJtQTFNLCBwZXJtQTFpbmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwZXJtQTJNID0gdmVjX2FkZChwZXJtQTJNLCBwZXJtQTJpbmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW5SaWdodE0gPSB2ZWNfc3JvKHRlblJpZ2h0TSwgZWlnaHRMZWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBleHRyYWN0UGVybU0gPSB2ZWNfYWRkKGV4dHJhY3RQZXJtTSwgZXh0cmFjdFBlcm1JbmMpCisKKyNkZWZpbmUgSVRFUihpLCBqLCBrKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGX0lOSVQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGMihpLCBqLCBrLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGMihpLCBqLCBrLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGMihpLCBqLCBrLCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGMihpLCBqLCBrLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGMihpLCBqLCBrLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGMihpLCBqLCBrLCA1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGMihpLCBqLCBrLCA2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGMihpLCBqLCBrLCA3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyAgICBJVEVSKDAsIDEsIDIpOworICAgIElURVIoMSwgMiwgMyk7CisgICAgSVRFUigyLCAzLCA0KTsKKyAgICBJVEVSKDMsIDQsIDUpOworICAgIElURVIoNCwgNSwgNik7CisgICAgSVRFUig1LCA2LCA3KTsKKyAgICBJVEVSKDYsIDcsIDgpOworICAgIElURVIoNywgOCwgOSk7CisKKyNkZWZpbmUgU1RPUkVfTElORShpKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm1TVCA9ICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZlY19sdnNyKGkgKiBzdHJpZGUsIHNyY0NvcHkpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBtYXNrU1QgPSAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ZWNfcGVybSgodmVjdG9yIHVuc2lnbmVkIGNoYXIpemVybywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhciluZWcxLCBwZXJtU1QpOyAgIFwKKyAgICBzcmMjI2kgPSB2ZWNfcGVybShzcmMjI2kgLHNyYyMjaSwgcGVybVNUKTsgICAgICAgICAgXAorICAgIHNBIyNpPSB2ZWNfc2VsKHNBIyNpLCBzcmMjI2ksIG1hc2tTVCk7ICAgICAgICAgICAgICBcCisgICAgc0IjI2k9IHZlY19zZWwoc3JjIyNpLCBzQiMjaSwgbWFza1NUKTsgICAgICAgICAgICAgIFwKKyAgICB2ZWNfc3Qoc0EjI2ksIGkgKiBzdHJpZGUsIHNyY0NvcHkpOyAgICAgICAgICAgICAgICAgXAorICAgIHZlY19zdChzQiMjaSwgaSAqIHN0cmlkZSArIDE2LCBzcmNDb3B5KTsgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgU1RPUkVfTElORSgxKTsKKyAgICBTVE9SRV9MSU5FKDIpOworICAgIFNUT1JFX0xJTkUoMyk7CisgICAgU1RPUkVfTElORSg0KTsKKyAgICBTVE9SRV9MSU5FKDUpOworICAgIFNUT1JFX0xJTkUoNik7CisgICAgU1RPUkVfTElORSg3KTsKKyAgICBTVE9SRV9MSU5FKDgpOworCisjdW5kZWYgU1RPUkVfTElORQorI3VuZGVmIElURVIKKyN1bmRlZiBGMgorfQorCisjZGVmaW5lIGRvSG9yaXpMb3dQYXNzX2FsdGl2ZWMoYS4uLikgZG9Ib3Jpekxvd1Bhc3NfQyhhKQorI2RlZmluZSBkb0hvcml6RGVmRmlsdGVyX2FsdGl2ZWMoYS4uLikgZG9Ib3JpekRlZkZpbHRlcl9DKGEpCisjZGVmaW5lIGRvX2FfZGVibG9ja19hbHRpdmVjKGEuLi4pIGRvX2FfZGVibG9ja19DKGEpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZW1wTm9pc2VSZWR1Y2VyX2FsdGl2ZWModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp0ZW1wQmx1cnJlZCwgdWludDMyX3QgKnRlbXBCbHVycmVkUGFzdCwgaW50ICptYXhOb2lzZSkKK3sKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGNoYXIgbmVnMSA9IHZlY19zcGxhdF9zOCgtMSk7CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybUhIID0gKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyKXsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOCwgMHgxOSwgMHgxQSwgMHgxQiwgMHgxQywgMHgxRCwgMHgxRSwgMHgxRn07CisKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCB6ZXJvID0gdmVjX3NwbGF0X3MzMigwKTsKKyAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZzaW50MTZfMSA9IHZlY19zcGxhdF9zMTYoMSk7CisgICAgdmVjdG9yIHNpZ25lZCBpbnQgdl9kcCA9IHplcm87CisgICAgdmVjdG9yIHNpZ25lZCBpbnQgdl9zeXNkcCA9IHplcm87CisgICAgaW50IGQsIHN5c2QsIGk7CisKKyNkZWZpbmUgTE9BRF9MSU5FKHNyYywgaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWdpc3RlciBpbnQgaiMjc3JjIyNpID0gaSAqIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtIyNzcmMjI2kgPSB2ZWNfbHZzbChqIyNzcmMjI2ksIHNyYyk7ICAgICAgIFwKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2XyMjc3JjIyNBMSMjaSA9IHZlY19sZChqIyNzcmMjI2ksIHNyYyk7IFwKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2XyMjc3JjIyNBMiMjaSA9IHZlY19sZChqIyNzcmMjI2kgKyAxNiwgc3JjKTsgXAorICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfIyNzcmMjI0EjI2kgPSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ZWNfcGVybSh2XyMjc3JjIyNBMSMjaSwgdl8jI3NyYyMjQTIjI2ksIHBlcm0jI3NyYyMjaSk7ICAgICAgICAgXAorICAgIHZlY3RvciBzaWduZWQgc2hvcnQgdl8jI3NyYyMjQXNzIyNpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydCl2ZWNfbWVyZ2VoKCh2ZWN0b3Igc2lnbmVkIGNoYXIpemVybywgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGNoYXIpdl8jI3NyYyMjQSMjaSkKKworICAgIExPQURfTElORShzcmMsIDApOworICAgIExPQURfTElORShzcmMsIDEpOworICAgIExPQURfTElORShzcmMsIDIpOworICAgIExPQURfTElORShzcmMsIDMpOworICAgIExPQURfTElORShzcmMsIDQpOworICAgIExPQURfTElORShzcmMsIDUpOworICAgIExPQURfTElORShzcmMsIDYpOworICAgIExPQURfTElORShzcmMsIDcpOworCisgICAgTE9BRF9MSU5FKHRlbXBCbHVycmVkLCAwKTsKKyAgICBMT0FEX0xJTkUodGVtcEJsdXJyZWQsIDEpOworICAgIExPQURfTElORSh0ZW1wQmx1cnJlZCwgMik7CisgICAgTE9BRF9MSU5FKHRlbXBCbHVycmVkLCAzKTsKKyAgICBMT0FEX0xJTkUodGVtcEJsdXJyZWQsIDQpOworICAgIExPQURfTElORSh0ZW1wQmx1cnJlZCwgNSk7CisgICAgTE9BRF9MSU5FKHRlbXBCbHVycmVkLCA2KTsKKyAgICBMT0FEX0xJTkUodGVtcEJsdXJyZWQsIDcpOworI3VuZGVmIExPQURfTElORQorCisjZGVmaW5lIEFDQ1VNVUxBVEVfRElGRlMoaSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IHZfZCA9IHZlY19zdWIodl90ZW1wQmx1cnJlZEFzcyMjaSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfc3JjQXNzIyNpKTsgICAgICAgICBcCisgICAgICAgIHZfZHAgPSB2ZWNfbXN1bXModl9kLCB2X2QsIHZfZHApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2X3N5c2RwID0gdmVjX21zdW1zKHZfZCwgdnNpbnQxNl8xLCB2X3N5c2RwKTsgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgQUNDVU1VTEFURV9ESUZGUygwKTsKKyAgICBBQ0NVTVVMQVRFX0RJRkZTKDEpOworICAgIEFDQ1VNVUxBVEVfRElGRlMoMik7CisgICAgQUNDVU1VTEFURV9ESUZGUygzKTsKKyAgICBBQ0NVTVVMQVRFX0RJRkZTKDQpOworICAgIEFDQ1VNVUxBVEVfRElGRlMoNSk7CisgICAgQUNDVU1VTEFURV9ESUZGUyg2KTsKKyAgICBBQ0NVTVVMQVRFX0RJRkZTKDcpOworI3VuZGVmIEFDQ1VNVUxBVEVfRElGRlMKKworICAgIHRlbXBCbHVycmVkUGFzdFsxMjddPSBtYXhOb2lzZVswXTsKKyAgICB0ZW1wQmx1cnJlZFBhc3RbMTI4XT0gbWF4Tm9pc2VbMV07CisgICAgdGVtcEJsdXJyZWRQYXN0WzEyOV09IG1heE5vaXNlWzJdOworCisgICAgdl9kcCA9IHZlY19zdW1zKHZfZHAsIHplcm8pOworICAgIHZfc3lzZHAgPSB2ZWNfc3Vtcyh2X3N5c2RwLCB6ZXJvKTsKKworICAgIHZfZHAgPSB2ZWNfc3BsYXQodl9kcCwgMyk7CisgICAgdl9zeXNkcCA9IHZlY19zcGxhdCh2X3N5c2RwLCAzKTsKKworICAgIHZlY19zdGUodl9kcCwgMCwgJmQpOworICAgIHZlY19zdGUodl9zeXNkcCwgMCwgJnN5c2QpOworCisgICAgaSA9IGQ7CisgICAgZCA9ICg0KmQKKyAgICAgICAgICsoKih0ZW1wQmx1cnJlZFBhc3QtMjU2KSkKKyAgICAgICAgICsoKih0ZW1wQmx1cnJlZFBhc3QtMSkpKyAoKih0ZW1wQmx1cnJlZFBhc3QrMSkpCisgICAgICAgICArKCoodGVtcEJsdXJyZWRQYXN0KzI1NikpCisgICAgICAgICArNCk+PjM7CisKKyAgICAqdGVtcEJsdXJyZWRQYXN0PWk7CisKKyAgICBpZiAoZCA+IG1heE5vaXNlWzFdKSB7CisgICAgICAgIGlmIChkIDwgbWF4Tm9pc2VbMl0pIHsKKyNkZWZpbmUgT1AoaSkgdl90ZW1wQmx1cnJlZEFzcyMjaSA9IHZlY19hdmcodl90ZW1wQmx1cnJlZEFzcyMjaSwgdl9zcmNBc3MjI2kpOworCisgICAgICAgICAgICBPUCgwKTsKKyAgICAgICAgICAgIE9QKDEpOworICAgICAgICAgICAgT1AoMik7CisgICAgICAgICAgICBPUCgzKTsKKyAgICAgICAgICAgIE9QKDQpOworICAgICAgICAgICAgT1AoNSk7CisgICAgICAgICAgICBPUCg2KTsKKyAgICAgICAgICAgIE9QKDcpOworI3VuZGVmIE9QCisgICAgICAgIH0gZWxzZSB7CisjZGVmaW5lIE9QKGkpIHZfdGVtcEJsdXJyZWRBc3MjI2kgPSB2X3NyY0FzcyMjaTsKKworICAgICAgICAgICAgT1AoMCk7CisgICAgICAgICAgICBPUCgxKTsKKyAgICAgICAgICAgIE9QKDIpOworICAgICAgICAgICAgT1AoMyk7CisgICAgICAgICAgICBPUCg0KTsKKyAgICAgICAgICAgIE9QKDUpOworICAgICAgICAgICAgT1AoNik7CisgICAgICAgICAgICBPUCg3KTsKKyN1bmRlZiBPUAorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGQgPCBtYXhOb2lzZVswXSkgeworICAgICAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB2c2ludDE2XzcgPSB2ZWNfc3BsYXRfczE2KDcpOworICAgICAgICAgICAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCB2c2ludDE2XzQgPSB2ZWNfc3BsYXRfczE2KDQpOworICAgICAgICAgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZ1aW50MTZfMyA9IHZlY19zcGxhdF91MTYoMyk7CisKKyNkZWZpbmUgT1AoaSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl90ZW1wID0gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB2ZWNfbWxhZGQodl90ZW1wQmx1cnJlZEFzcyMjaSwgdnNpbnQxNl83LCB2X3NyY0FzcyMjaSk7IFwKKyAgICAgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl90ZW1wMiA9IHZlY19hZGQodl90ZW1wLCB2c2ludDE2XzQpOyBcCisgICAgICAgICAgICB2X3RlbXBCbHVycmVkQXNzIyNpID0gdmVjX3NyKHZfdGVtcDIsIHZ1aW50MTZfMyk7ICAgICAgICAgICBcCisgICAgICAgIH0gd2hpbGUgKDApCisKKyAgICAgICAgICAgIE9QKDApOworICAgICAgICAgICAgT1AoMSk7CisgICAgICAgICAgICBPUCgyKTsKKyAgICAgICAgICAgIE9QKDMpOworICAgICAgICAgICAgT1AoNCk7CisgICAgICAgICAgICBPUCg1KTsKKyAgICAgICAgICAgIE9QKDYpOworICAgICAgICAgICAgT1AoNyk7CisjdW5kZWYgT1AKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdnNpbnQxNl8zID0gdmVjX3NwbGF0X3MxNigzKTsKKyAgICAgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdnNpbnQxNl8yID0gdmVjX3NwbGF0X3MxNigyKTsKKworI2RlZmluZSBPUChpKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgdl90ZW1wID0gICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdmVjX21sYWRkKHZfdGVtcEJsdXJyZWRBc3MjI2ksIHZzaW50MTZfMywgdl9zcmNBc3MjI2kpOyBcCisgICAgICAgICAgICBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0IHZfdGVtcDIgPSB2ZWNfYWRkKHZfdGVtcCwgdnNpbnQxNl8yKTsgXAorICAgICAgICAgICAgdl90ZW1wQmx1cnJlZEFzcyMjaSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHZlY19zcih2X3RlbXAyLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZzaW50MTZfMik7ICAgICAgXAorICAgICAgICB9IHdoaWxlICgwKQorCisgICAgICAgICAgICBPUCgwKTsKKyAgICAgICAgICAgIE9QKDEpOworICAgICAgICAgICAgT1AoMik7CisgICAgICAgICAgICBPUCgzKTsKKyAgICAgICAgICAgIE9QKDQpOworICAgICAgICAgICAgT1AoNSk7CisgICAgICAgICAgICBPUCg2KTsKKyAgICAgICAgICAgIE9QKDcpOworI3VuZGVmIE9QCisgICAgICAgIH0KKyAgICB9CisKKyNkZWZpbmUgUEFDS19BTkRfU1RPUkUoc3JjLCBpKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybXMgPSB2ZWNfbHZzcihpICogc3RyaWRlLCBzcmMpOyAgICAgICAgXAorICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZmID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3BhY2tzdSh2X3RlbXBCbHVycmVkQXNzIyMxLCAodmVjdG9yIHNpZ25lZCBzaG9ydCl6ZXJvKTsgICAgIFwKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZyA9IHZlY19wZXJtKHZmLCB2XyMjc3JjIyNBIyNpLCBwZXJtSEgpOyBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWFzayA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ZWNfcGVybSgodmVjdG9yIHVuc2lnbmVkIGNoYXIpemVybywgKHZlY3RvciB1bnNpZ25lZCBjaGFyKW5lZzEsIHBlcm1zKTsgXAorICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZnMiA9IHZlY19wZXJtKHZnLCB2ZywgcGVybXMpOyAgICAgICAgICAgIFwKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBzdkEgPSB2ZWNfc2VsKHZfIyNzcmMjI0ExIyNpLCB2ZzIsIG1hc2spOyBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc3ZCID0gdmVjX3NlbCh2ZzIsIHZfIyNzcmMjI0EyIyNpLCBtYXNrKTsgXAorICAgIHZlY19zdChzdkEsIGkgKiBzdHJpZGUsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfc3Qoc3ZCLCBpICogc3RyaWRlICsgMTYsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgUEFDS19BTkRfU1RPUkUoc3JjLCAwKTsKKyAgICBQQUNLX0FORF9TVE9SRShzcmMsIDEpOworICAgIFBBQ0tfQU5EX1NUT1JFKHNyYywgMik7CisgICAgUEFDS19BTkRfU1RPUkUoc3JjLCAzKTsKKyAgICBQQUNLX0FORF9TVE9SRShzcmMsIDQpOworICAgIFBBQ0tfQU5EX1NUT1JFKHNyYywgNSk7CisgICAgUEFDS19BTkRfU1RPUkUoc3JjLCA2KTsKKyAgICBQQUNLX0FORF9TVE9SRShzcmMsIDcpOworICAgIFBBQ0tfQU5EX1NUT1JFKHRlbXBCbHVycmVkLCAwKTsKKyAgICBQQUNLX0FORF9TVE9SRSh0ZW1wQmx1cnJlZCwgMSk7CisgICAgUEFDS19BTkRfU1RPUkUodGVtcEJsdXJyZWQsIDIpOworICAgIFBBQ0tfQU5EX1NUT1JFKHRlbXBCbHVycmVkLCAzKTsKKyAgICBQQUNLX0FORF9TVE9SRSh0ZW1wQmx1cnJlZCwgNCk7CisgICAgUEFDS19BTkRfU1RPUkUodGVtcEJsdXJyZWQsIDUpOworICAgIFBBQ0tfQU5EX1NUT1JFKHRlbXBCbHVycmVkLCA2KTsKKyAgICBQQUNLX0FORF9TVE9SRSh0ZW1wQmx1cnJlZCwgNyk7CisjdW5kZWYgUEFDS19BTkRfU1RPUkUKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9zZV8xNng4X2NoYXJfdG9QYWNrZWRBbGlnbl9hbHRpdmVjKHVuc2lnbmVkIGNoYXIqIGRzdCwgdW5zaWduZWQgY2hhciogc3JjLCBpbnQgc3RyaWRlKSB7CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgemVybyA9IHZlY19zcGxhdF91OCgwKTsKKworI2RlZmluZSBMT0FEX0RPVUJMRV9MSU5FKGksIGopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm0xIyNpID0gdmVjX2x2c2woaSAqIHN0cmlkZSwgc3JjKTsgICAgICAgICAgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm0yIyNpID0gdmVjX2x2c2woaiAqIHN0cmlkZSwgc3JjKTsgICAgICAgICAgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyY0EjI2kgPSB2ZWNfbGQoaSAqIHN0cmlkZSwgc3JjKTsgICAgICAgICAgICAgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyY0IjI2kgPSB2ZWNfbGQoaSAqIHN0cmlkZSArIDE2LCBzcmMpOyAgICAgICAgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyY0MjI2kgPSB2ZWNfbGQoaiAqIHN0cmlkZSwgc3JjKTsgICAgICAgICAgICAgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyY0QjI2kgPSB2ZWNfbGQoaiAqIHN0cmlkZSsgMTYsIHNyYyk7ICAgICAgICAgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyYyMjaSA9IHZlY19wZXJtKHNyY0EjI2ksIHNyY0IjI2ksIHBlcm0xIyNpKTsgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyYyMjaiA9IHZlY19wZXJtKHNyY0MjI2ksIHNyY0QjI2ksIHBlcm0yIyNpKQorCisgICAgTE9BRF9ET1VCTEVfTElORSgwLCAxKTsKKyAgICBMT0FEX0RPVUJMRV9MSU5FKDIsIDMpOworICAgIExPQURfRE9VQkxFX0xJTkUoNCwgNSk7CisgICAgTE9BRF9ET1VCTEVfTElORSg2LCA3KTsKKyN1bmRlZiBMT0FEX0RPVUJMRV9MSU5FCisKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wQSA9IHZlY19tZXJnZWgoc3JjMCwgemVybyk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcEIgPSB2ZWNfbWVyZ2VsKHNyYzAsIHplcm8pOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXBDID0gdmVjX21lcmdlaChzcmMxLCB6ZXJvKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wRCA9IHZlY19tZXJnZWwoc3JjMSwgemVybyk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcEUgPSB2ZWNfbWVyZ2VoKHNyYzIsIHplcm8pOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXBGID0gdmVjX21lcmdlbChzcmMyLCB6ZXJvKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wRyA9IHZlY19tZXJnZWgoc3JjMywgemVybyk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcEggPSB2ZWNfbWVyZ2VsKHNyYzMsIHplcm8pOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXBJID0gdmVjX21lcmdlaChzcmM0LCB6ZXJvKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wSiA9IHZlY19tZXJnZWwoc3JjNCwgemVybyk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcEsgPSB2ZWNfbWVyZ2VoKHNyYzUsIHplcm8pOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXBMID0gdmVjX21lcmdlbChzcmM1LCB6ZXJvKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wTSA9IHZlY19tZXJnZWgoc3JjNiwgemVybyk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcE4gPSB2ZWNfbWVyZ2VsKHNyYzYsIHplcm8pOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXBPID0gdmVjX21lcmdlaChzcmM3LCB6ZXJvKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wUCA9IHZlY19tZXJnZWwoc3JjNywgemVybyk7CisKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wMCAgPSB2ZWNfbWVyZ2VoKHRlbXBBLCB0ZW1wSSk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDEgID0gdmVjX21lcmdlbCh0ZW1wQSwgdGVtcEkpOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXAyICA9IHZlY19tZXJnZWgodGVtcEIsIHRlbXBKKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wMyAgPSB2ZWNfbWVyZ2VsKHRlbXBCLCB0ZW1wSik7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDQgID0gdmVjX21lcmdlaCh0ZW1wQywgdGVtcEspOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXA1ICA9IHZlY19tZXJnZWwodGVtcEMsIHRlbXBLKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wNiAgPSB2ZWNfbWVyZ2VoKHRlbXBELCB0ZW1wTCk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDcgID0gdmVjX21lcmdlbCh0ZW1wRCwgdGVtcEwpOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXA4ICA9IHZlY19tZXJnZWgodGVtcEUsIHRlbXBNKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wOSAgPSB2ZWNfbWVyZ2VsKHRlbXBFLCB0ZW1wTSk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDEwID0gdmVjX21lcmdlaCh0ZW1wRiwgdGVtcE4pOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXAxMSA9IHZlY19tZXJnZWwodGVtcEYsIHRlbXBOKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wMTIgPSB2ZWNfbWVyZ2VoKHRlbXBHLCB0ZW1wTyk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDEzID0gdmVjX21lcmdlbCh0ZW1wRywgdGVtcE8pOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXAxNCA9IHZlY19tZXJnZWgodGVtcEgsIHRlbXBQKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wMTUgPSB2ZWNfbWVyZ2VsKHRlbXBILCB0ZW1wUCk7CisKKyAgICB0ZW1wQSA9IHZlY19tZXJnZWgodGVtcDAsIHRlbXA4KTsKKyAgICB0ZW1wQiA9IHZlY19tZXJnZWwodGVtcDAsIHRlbXA4KTsKKyAgICB0ZW1wQyA9IHZlY19tZXJnZWgodGVtcDEsIHRlbXA5KTsKKyAgICB0ZW1wRCA9IHZlY19tZXJnZWwodGVtcDEsIHRlbXA5KTsKKyAgICB0ZW1wRSA9IHZlY19tZXJnZWgodGVtcDIsIHRlbXAxMCk7CisgICAgdGVtcEYgPSB2ZWNfbWVyZ2VsKHRlbXAyLCB0ZW1wMTApOworICAgIHRlbXBHID0gdmVjX21lcmdlaCh0ZW1wMywgdGVtcDExKTsKKyAgICB0ZW1wSCA9IHZlY19tZXJnZWwodGVtcDMsIHRlbXAxMSk7CisgICAgdGVtcEkgPSB2ZWNfbWVyZ2VoKHRlbXA0LCB0ZW1wMTIpOworICAgIHRlbXBKID0gdmVjX21lcmdlbCh0ZW1wNCwgdGVtcDEyKTsKKyAgICB0ZW1wSyA9IHZlY19tZXJnZWgodGVtcDUsIHRlbXAxMyk7CisgICAgdGVtcEwgPSB2ZWNfbWVyZ2VsKHRlbXA1LCB0ZW1wMTMpOworICAgIHRlbXBNID0gdmVjX21lcmdlaCh0ZW1wNiwgdGVtcDE0KTsKKyAgICB0ZW1wTiA9IHZlY19tZXJnZWwodGVtcDYsIHRlbXAxNCk7CisgICAgdGVtcE8gPSB2ZWNfbWVyZ2VoKHRlbXA3LCB0ZW1wMTUpOworICAgIHRlbXBQID0gdmVjX21lcmdlbCh0ZW1wNywgdGVtcDE1KTsKKworICAgIHRlbXAwICA9IHZlY19tZXJnZWgodGVtcEEsIHRlbXBJKTsKKyAgICB0ZW1wMSAgPSB2ZWNfbWVyZ2VsKHRlbXBBLCB0ZW1wSSk7CisgICAgdGVtcDIgID0gdmVjX21lcmdlaCh0ZW1wQiwgdGVtcEopOworICAgIHRlbXAzICA9IHZlY19tZXJnZWwodGVtcEIsIHRlbXBKKTsKKyAgICB0ZW1wNCAgPSB2ZWNfbWVyZ2VoKHRlbXBDLCB0ZW1wSyk7CisgICAgdGVtcDUgID0gdmVjX21lcmdlbCh0ZW1wQywgdGVtcEspOworICAgIHRlbXA2ICA9IHZlY19tZXJnZWgodGVtcEQsIHRlbXBMKTsKKyAgICB0ZW1wNyAgPSB2ZWNfbWVyZ2VsKHRlbXBELCB0ZW1wTCk7CisgICAgdGVtcDggID0gdmVjX21lcmdlaCh0ZW1wRSwgdGVtcE0pOworICAgIHRlbXA5ICA9IHZlY19tZXJnZWwodGVtcEUsIHRlbXBNKTsKKyAgICB0ZW1wMTAgPSB2ZWNfbWVyZ2VoKHRlbXBGLCB0ZW1wTik7CisgICAgdGVtcDExID0gdmVjX21lcmdlbCh0ZW1wRiwgdGVtcE4pOworICAgIHRlbXAxMiA9IHZlY19tZXJnZWgodGVtcEcsIHRlbXBPKTsKKyAgICB0ZW1wMTMgPSB2ZWNfbWVyZ2VsKHRlbXBHLCB0ZW1wTyk7CisgICAgdGVtcDE0ID0gdmVjX21lcmdlaCh0ZW1wSCwgdGVtcFApOworICAgIHRlbXAxNSA9IHZlY19tZXJnZWwodGVtcEgsIHRlbXBQKTsKKworICAgIHZlY19zdCh0ZW1wMCwgICAgMCwgZHN0KTsKKyAgICB2ZWNfc3QodGVtcDEsICAgMTYsIGRzdCk7CisgICAgdmVjX3N0KHRlbXAyLCAgIDMyLCBkc3QpOworICAgIHZlY19zdCh0ZW1wMywgICA0OCwgZHN0KTsKKyAgICB2ZWNfc3QodGVtcDQsICAgNjQsIGRzdCk7CisgICAgdmVjX3N0KHRlbXA1LCAgIDgwLCBkc3QpOworICAgIHZlY19zdCh0ZW1wNiwgICA5NiwgZHN0KTsKKyAgICB2ZWNfc3QodGVtcDcsICAxMTIsIGRzdCk7CisgICAgdmVjX3N0KHRlbXA4LCAgMTI4LCBkc3QpOworICAgIHZlY19zdCh0ZW1wOSwgIDE0NCwgZHN0KTsKKyAgICB2ZWNfc3QodGVtcDEwLCAxNjAsIGRzdCk7CisgICAgdmVjX3N0KHRlbXAxMSwgMTc2LCBkc3QpOworICAgIHZlY19zdCh0ZW1wMTIsIDE5MiwgZHN0KTsKKyAgICB2ZWNfc3QodGVtcDEzLCAyMDgsIGRzdCk7CisgICAgdmVjX3N0KHRlbXAxNCwgMjI0LCBkc3QpOworICAgIHZlY19zdCh0ZW1wMTUsIDI0MCwgZHN0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9zZV84eDE2X2NoYXJfZnJvbVBhY2tlZEFsaWduX2FsdGl2ZWModW5zaWduZWQgY2hhciogZHN0LCB1bnNpZ25lZCBjaGFyKiBzcmMsIGludCBzdHJpZGUpIHsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB6ZXJvID0gdmVjX3NwbGF0X3U4KDApOworICAgIGNvbnN0IHZlY3RvciBzaWduZWQgICBjaGFyIG5lZzEgPSB2ZWNfc3BsYXRfczgoLTEpOworCisjZGVmaW5lIExPQURfRE9VQkxFX0xJTkUoaSwgaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyYyMjaSA9IHZlY19sZChpICogMTYsIHNyYyk7ICAgICAgICAgICAgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyYyMjaiA9IHZlY19sZChqICogMTYsIHNyYykKKworICAgIExPQURfRE9VQkxFX0xJTkUoMCwgMSk7CisgICAgTE9BRF9ET1VCTEVfTElORSgyLCAzKTsKKyAgICBMT0FEX0RPVUJMRV9MSU5FKDQsIDUpOworICAgIExPQURfRE9VQkxFX0xJTkUoNiwgNyk7CisgICAgTE9BRF9ET1VCTEVfTElORSg4LCA5KTsKKyAgICBMT0FEX0RPVUJMRV9MSU5FKDEwLCAxMSk7CisgICAgTE9BRF9ET1VCTEVfTElORSgxMiwgMTMpOworICAgIExPQURfRE9VQkxFX0xJTkUoMTQsIDE1KTsKKyN1bmRlZiBMT0FEX0RPVUJMRV9MSU5FCisKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wQSA9IHZlY19tZXJnZWgoc3JjMCwgc3JjOCk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcEI7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcEMgPSB2ZWNfbWVyZ2VoKHNyYzEsIHNyYzkpOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXBEOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXBFID0gdmVjX21lcmdlaChzcmMyLCBzcmMxMCk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcEcgPSB2ZWNfbWVyZ2VoKHNyYzMsIHNyYzExKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wSSA9IHZlY19tZXJnZWgoc3JjNCwgc3JjMTIpOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXBKOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXBLID0gdmVjX21lcmdlaChzcmM1LCBzcmMxMyk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcEw7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcE0gPSB2ZWNfbWVyZ2VoKHNyYzYsIHNyYzE0KTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB0ZW1wTyA9IHZlY19tZXJnZWgoc3JjNywgc3JjMTUpOworCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDAgPSB2ZWNfbWVyZ2VoKHRlbXBBLCB0ZW1wSSk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDEgPSB2ZWNfbWVyZ2VsKHRlbXBBLCB0ZW1wSSk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDI7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDM7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDQgPSB2ZWNfbWVyZ2VoKHRlbXBDLCB0ZW1wSyk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDUgPSB2ZWNfbWVyZ2VsKHRlbXBDLCB0ZW1wSyk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDY7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDc7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDggPSB2ZWNfbWVyZ2VoKHRlbXBFLCB0ZW1wTSk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDkgPSB2ZWNfbWVyZ2VsKHRlbXBFLCB0ZW1wTSk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdGVtcDEyID0gdmVjX21lcmdlaCh0ZW1wRywgdGVtcE8pOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHRlbXAxMyA9IHZlY19tZXJnZWwodGVtcEcsIHRlbXBPKTsKKworICAgIHRlbXBBID0gdmVjX21lcmdlaCh0ZW1wMCwgdGVtcDgpOworICAgIHRlbXBCID0gdmVjX21lcmdlbCh0ZW1wMCwgdGVtcDgpOworICAgIHRlbXBDID0gdmVjX21lcmdlaCh0ZW1wMSwgdGVtcDkpOworICAgIHRlbXBEID0gdmVjX21lcmdlbCh0ZW1wMSwgdGVtcDkpOworICAgIHRlbXBJID0gdmVjX21lcmdlaCh0ZW1wNCwgdGVtcDEyKTsKKyAgICB0ZW1wSiA9IHZlY19tZXJnZWwodGVtcDQsIHRlbXAxMik7CisgICAgdGVtcEsgPSB2ZWNfbWVyZ2VoKHRlbXA1LCB0ZW1wMTMpOworICAgIHRlbXBMID0gdmVjX21lcmdlbCh0ZW1wNSwgdGVtcDEzKTsKKworICAgIHRlbXAwID0gdmVjX21lcmdlaCh0ZW1wQSwgdGVtcEkpOworICAgIHRlbXAxID0gdmVjX21lcmdlbCh0ZW1wQSwgdGVtcEkpOworICAgIHRlbXAyID0gdmVjX21lcmdlaCh0ZW1wQiwgdGVtcEopOworICAgIHRlbXAzID0gdmVjX21lcmdlbCh0ZW1wQiwgdGVtcEopOworICAgIHRlbXA0ID0gdmVjX21lcmdlaCh0ZW1wQywgdGVtcEspOworICAgIHRlbXA1ID0gdmVjX21lcmdlbCh0ZW1wQywgdGVtcEspOworICAgIHRlbXA2ID0gdmVjX21lcmdlaCh0ZW1wRCwgdGVtcEwpOworICAgIHRlbXA3ID0gdmVjX21lcmdlbCh0ZW1wRCwgdGVtcEwpOworCisKKyNkZWZpbmUgU1RPUkVfRE9VQkxFX0xJTkUoaSwgaikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBkc3RBaSA9IHZlY19sZChpICogc3RyaWRlLCBkc3QpOyAgICAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBkc3RCaSA9IHZlY19sZChpICogc3RyaWRlICsgMTYsIGRzdCk7ICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBkc3RBaiA9IHZlY19sZChqICogc3RyaWRlLCBkc3QpOyAgICAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBkc3RCaiA9IHZlY19sZChqICogc3RyaWRlKyAxNiwgZHN0KTsgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBhbGlnbmkgPSB2ZWNfbHZzcihpICogc3RyaWRlLCBkc3QpOyAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBhbGlnbmogPSB2ZWNfbHZzcihqICogc3RyaWRlLCBkc3QpOyAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtYXNraSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3Blcm0oemVybywgKHZlY3RvciB1bnNpZ25lZCBjaGFyKW5lZzEsIGFsaWduaSk7ICAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtYXNraiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3Blcm0oemVybywgKHZlY3RvciB1bnNpZ25lZCBjaGFyKW5lZzEsIGFsaWduaik7ICAgICAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBkc3RSaSA9IHZlY19wZXJtKHRlbXAjI2ksIHRlbXAjI2ksIGFsaWduaSk7ICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBkc3RSaiA9IHZlY19wZXJtKHRlbXAjI2osIHRlbXAjI2osIGFsaWduaik7ICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBkc3RBRmkgPSB2ZWNfc2VsKGRzdEFpLCBkc3RSaSwgbWFza2kpOyAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBkc3RCRmkgPSB2ZWNfc2VsKGRzdFJpLCBkc3RCaSwgbWFza2kpOyAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBkc3RBRmogPSB2ZWNfc2VsKGRzdEFqLCBkc3RSaiwgbWFza2opOyAgICAgICAgIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBkc3RCRmogPSB2ZWNfc2VsKGRzdFJqLCBkc3RCaiwgbWFza2opOyAgICAgICAgIFwKKyAgICB2ZWNfc3QoZHN0QUZpLCBpICogc3RyaWRlLCBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfc3QoZHN0QkZpLCBpICogc3RyaWRlICsgMTYsIGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfc3QoZHN0QUZqLCBqICogc3RyaWRlLCBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfc3QoZHN0QkZqLCBqICogc3RyaWRlICsgMTYsIGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyAgICBTVE9SRV9ET1VCTEVfTElORSgwLDEpOworICAgIFNUT1JFX0RPVUJMRV9MSU5FKDIsMyk7CisgICAgU1RPUkVfRE9VQkxFX0xJTkUoNCw1KTsKKyAgICBTVE9SRV9ET1VCTEVfTElORSg2LDcpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzX2ludGVybmFsLmggYi9mZm1wZWcvbGlicG9zdHByb2MvcG9zdHByb2Nlc3NfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWJkOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzX2ludGVybmFsLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBNaWNoYWVsIE5pZWRlcm1heWVyIChtaWNoYWVsbmlAZ214LmF0KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogaW50ZXJuYWwgQVBJIGhlYWRlci4KKyAqLworCisjaWZuZGVmIFBPU1RQUk9DX1BPU1RQUk9DRVNTX0lOVEVSTkFMX0gKKyNkZWZpbmUgUE9TVFBST0NfUE9TVFBST0NFU1NfSU5URVJOQUxfSAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRtYXRoLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgInBvc3Rwcm9jZXNzLmgiCisKKyNkZWZpbmUgVl9ERUJMT0NLICAgICAgIDB4MDEKKyNkZWZpbmUgSF9ERUJMT0NLICAgICAgIDB4MDIKKyNkZWZpbmUgREVSSU5HICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTEVWRUxfRklYICAgICAgIDB4MDggLy8vPCBCcmlnaHRuZXNzICYgQ29udHJhc3QKKworI2RlZmluZSBMVU1fVl9ERUJMT0NLICAgVl9ERUJMT0NLICAgICAgICAgICAgICAgLy8gICAxCisjZGVmaW5lIExVTV9IX0RFQkxPQ0sgICBIX0RFQkxPQ0sgICAgICAgICAgICAgICAvLyAgIDIKKyNkZWZpbmUgQ0hST01fVl9ERUJMT0NLIChWX0RFQkxPQ0s8PDQpICAgICAgICAgIC8vICAxNgorI2RlZmluZSBDSFJPTV9IX0RFQkxPQ0sgKEhfREVCTE9DSzw8NCkgICAgICAgICAgLy8gIDMyCisjZGVmaW5lIExVTV9ERVJJTkcgICAgICBERVJJTkcgICAgICAgICAgICAgICAgICAvLyAgIDQKKyNkZWZpbmUgQ0hST01fREVSSU5HICAgIChERVJJTkc8PDQpICAgICAgICAgICAgIC8vICA2NAorI2RlZmluZSBMVU1fTEVWRUxfRklYICAgTEVWRUxfRklYICAgICAgICAgICAgICAgLy8gICA4CisjZGVmaW5lIENIUk9NX0xFVkVMX0ZJWCAoTEVWRUxfRklYPDw0KSAgICAgICAgICAvLyAxMjggKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCisKKy8vIEV4cGVyaW1lbnRhbCB2ZXJ0aWNhbCBmaWx0ZXJzCisjZGVmaW5lIFZfWDFfRklMVEVSICAgICAweDAyMDAgICAgICAgICAgICAgICAgICAvLyA1MTIKKyNkZWZpbmUgVl9BX0RFQkxPQ0sgICAgIDB4MDQwMAorCisvLyBFeHBlcmltZW50YWwgaG9yaXpvbnRhbCBmaWx0ZXJzCisjZGVmaW5lIEhfWDFfRklMVEVSICAgICAweDIwMDAgICAgICAgICAgICAgICAgICAvLyA4MTkyCisjZGVmaW5lIEhfQV9ERUJMT0NLICAgICAweDQwMDAKKworLy8vIHNlbGVjdCBiZXR3ZWVuIGZ1bGwgeSByYW5nZSAoMjU1LTApIG9yIHN0YW5kYXJkIG9uZSAoMjM0LTE2KQorI2RlZmluZSBGVUxMX1lfUkFOR0UgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgLy8gMzI3NjgKKworLy9EZWludGVybGFjaW5nIEZpbHRlcnMKKyNkZWZpbmUgTElORUFSX0lQT0xfREVJTlRfRklMVEVSICAgICAgICAweDEwMDAwIC8vIDY1NTM2CisjZGVmaW5lIExJTkVBUl9CTEVORF9ERUlOVF9GSUxURVIgICAgICAgMHgyMDAwMCAvLyAxMzEwNzIKKyNkZWZpbmUgQ1VCSUNfQkxFTkRfREVJTlRfRklMVEVSICAgICAgICAweDgwMDAgIC8vIChub3QgaW1wbGVtZW50ZWQgeWV0KQorI2RlZmluZSBDVUJJQ19JUE9MX0RFSU5UX0ZJTFRFUiAgICAgICAgIDB4NDAwMDAgLy8gMjYyMTQ0CisjZGVmaW5lIE1FRElBTl9ERUlOVF9GSUxURVIgICAgICAgICAgICAgMHg4MDAwMCAvLyA1MjQyODgKKyNkZWZpbmUgRkZNUEVHX0RFSU5UX0ZJTFRFUiAgICAgICAgICAgICAweDQwMDAwMAorI2RlZmluZSBMT1dQQVNTNV9ERUlOVF9GSUxURVIgICAgICAgICAgIDB4ODAwMDAwCisKKyNkZWZpbmUgVEVNUF9OT0lTRV9GSUxURVIgICAgICAgICAgICAgICAweDEwMDAwMAorI2RlZmluZSBGT1JDRV9RVUFOVCAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwCisjZGVmaW5lIEJJVEVYQUNUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwCisjZGVmaW5lIFZJU1VBTElaRSAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwCisKKy8vdXNlIGlmIHlvdSB3YW50IGEgZmFzdGVyIHBvc3Rwcm9jZXNzaW5nIGNvZGUKKy8vY2Fubm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBjaHJvbWEgJiBsdW1hIGZpbHRlcnMgKGJvdGggb24gb3IgYm90aCBvZmYpCisvL29idmlvdXNseSB0aGUgLXBwIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lIGhhcyBubyBlZmZlY3QgZXhjZXB0IHR1cm5pbmcgdGhlIGhlcmUgc2VsZWN0ZWQKKy8vZmlsdGVycyBvbgorLy8jZGVmaW5lIENPTVBJTEVfVElNRV9NT0RFIDB4NzcKKworLyoqCisgKiBQb3N0cHJvY2Vzc2luZyBmaWx0ZXIuCisgKi8KK3N0cnVjdCBQUEZpbHRlcnsKKyAgICBjb25zdCBjaGFyICpzaG9ydE5hbWU7CisgICAgY29uc3QgY2hhciAqbG9uZ05hbWU7CisgICAgaW50IGNocm9tRGVmYXVsdDsgICAgICAgLy8vPCBpcyBjaHJvbWluYW5jZSBmaWx0ZXJpbmcgb24gYnkgZGVmYXVsdCBpZiB0aGlzIGZpbHRlciBpcyBtYW51YWxseSBhY3RpdmF0ZWQKKyAgICBpbnQgbWluTHVtUXVhbGl0eTsgICAgICAvLy88IG1pbmltdW0gcXVhbGl0eSB0byB0dXJuIGx1bWluYW5jZSBmaWx0ZXJpbmcgb24KKyAgICBpbnQgbWluQ2hyb21RdWFsaXR5OyAgICAvLy88IG1pbmltdW0gcXVhbGl0eSB0byB0dXJuIGNocm9taW5hbmNlIGZpbHRlcmluZyBvbgorICAgIGludCBtYXNrOyAgICAgICAgICAgICAgIC8vLzwgQml0bWFzayB0byB0dXJuIHRoaXMgZmlsdGVyIG9uCit9OworCisvKioKKyAqIFBvc3Rwcm9jZXNzaW5nIG1vZGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IFBQTW9kZXsKKyAgICBpbnQgbHVtTW9kZTsgICAgICAgICAgICAgICAgICAgIC8vLzwgYWN0aXZhdGVzIGZpbHRlcnMgZm9yIGx1bWluYW5jZQorICAgIGludCBjaHJvbU1vZGU7ICAgICAgICAgICAgICAgICAgLy8vPCBhY3RpdmF0ZXMgZmlsdGVycyBmb3IgY2hyb21pbmFuY2UKKyAgICBpbnQgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbm9uIHplcm8gb24gZXJyb3IKKworICAgIGludCBtaW5BbGxvd2VkWTsgICAgICAgICAgICAgICAgLy8vPCBmb3IgYnJpZ2h0bmVzcyBjb3JyZWN0aW9uCisgICAgaW50IG1heEFsbG93ZWRZOyAgICAgICAgICAgICAgICAvLy88IGZvciBicmlnaHRuZXNzIGNvcnJlY3Rpb24KKyAgICBmbG9hdCBtYXhDbGlwcGVkVGhyZXNob2xkOyAgICAgIC8vLzwgYW1vdW50IG9mICJibGFjayIgeW91IGFyZSB3aWxsaW5nIHRvIGxvc2UgdG8gZ2V0IGEgYnJpZ2h0bmVzcy1jb3JyZWN0ZWQgcGljdHVyZQorCisgICAgaW50IG1heFRtcE5vaXNlWzNdOyAgICAgICAgICAgICAvLy88IGZvciBUZW1wb3JhbCBOb2lzZSBSZWR1Y2luZyBmaWx0ZXIgKE1heGltYWwgc3VtIG9mIGFicyBkaWZmZXJlbmNlcykKKworICAgIGludCBiYXNlRGNEaWZmOworICAgIGludCBmbGF0bmVzc1RocmVzaG9sZDsKKworICAgIGludCBmb3JjZWRRdWFudDsgICAgICAgICAgICAgICAgLy8vPCBxdWFudGl6ZXIgaWYgRk9SQ0VfUVVBTlQgaXMgdXNlZAorfSBQUE1vZGU7CisKKy8qKgorICogcG9zdHByb2Nlc3MgY29udGV4dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgUFBDb250ZXh0eworICAgIC8qKgorICAgICAqIGluZm8gb24gc3RydWN0IGZvciBhdl9sb2cKKyAgICAgKi8KKyAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKKworICAgIHVpbnQ4X3QgKnRlbXBCbG9ja3M7IC8vLzx1c2VkIGZvciB0aGUgaG9yaXpvbnRhbCBjb2RlCisKKyAgICAvKioKKyAgICAgKiBsdW1hIGhpc3RvZ3JhbS4KKyAgICAgKiB3ZSBuZWVkIDY0Yml0IGhlcmUgb3RoZXJ3aXNlIHdlJ2xsIGdvaW5nIHRvIGhhdmUgYSBwcm9ibGVtCisgICAgICogYWZ0ZXIgd2F0Y2hpbmcgYSBibGFjayBwaWN0dXJlIGZvciA1IGhvdXJzCisgICAgICovCisgICAgdWludDY0X3QgKnlIaXN0b2dyYW07CisKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIHBhY2tlZFlPZmZzZXQpOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50NjRfdCwgcGFja2VkWVNjYWxlKTsKKworICAgIC8qKiBUZW1wb3JhbCBub2lzZSByZWR1Y2luZyBidWZmZXJzICovCisgICAgdWludDhfdCAqdGVtcEJsdXJyZWRbM107CisgICAgaW50MzJfdCAqdGVtcEJsdXJyZWRQYXN0WzNdOworCisgICAgLyoqIFRlbXBvcmFyeSBidWZmZXJzIGZvciBoYW5kbGluZyB0aGUgbGFzdCByb3cocykgKi8KKyAgICB1aW50OF90ICp0ZW1wRHN0OworICAgIHVpbnQ4X3QgKnRlbXBTcmM7CisKKyAgICB1aW50OF90ICpkZWludFRlbXA7CisKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIHBRUGIpOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50NjRfdCwgcFFQYjIpOworCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCBtbXhEY09mZnNldClbNjRdOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50NjRfdCwgbW14RGNUaHJlc2hvbGQpWzY0XTsKKworICAgIFFQX1NUT1JFX1QgKnN0ZFFQVGFibGU7ICAgICAgIC8vLzwgdXNlZCB0byBmaXggTVBFRzIgc3R5bGUgcXNjYWxlCisgICAgUVBfU1RPUkVfVCAqbm9uQlFQVGFibGU7CisgICAgUVBfU1RPUkVfVCAqZm9yY2VkUVBUYWJsZTsKKworICAgIGludCBRUDsKKyAgICBpbnQgbm9uQlFQOworCisgICAgaW50IGZyYW1lTnVtOworCisgICAgaW50IGNwdUNhcHM7CisKKyAgICBpbnQgcXBTdHJpZGU7IC8vLzxzaXplIG9mIHFwIGJ1ZmZlcnMgKG5lZWRlZCB0byByZWFsbG9jIHRoZW0gaWYgbmVlZGVkKQorICAgIGludCBzdHJpZGU7ICAgLy8vPHNpemUgb2Ygc29tZSBidWZmZXJzIChuZWVkZWQgdG8gcmVhbGxvYyB0aGVtIGlmIG5lZWRlZCkKKworICAgIGludCBoQ2hyb21hU3ViU2FtcGxlOworICAgIGludCB2Q2hyb21hU3ViU2FtcGxlOworCisgICAgUFBNb2RlIHBwTW9kZTsKK30gUFBDb250ZXh0OworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaW5lY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgaW50IGxpbmVzLCBpbnQgc3RyaWRlKSB7CisgICAgaWYgKHN0cmlkZSA+IDApIHsKKyAgICAgICAgbWVtY3B5KGRlc3QsIHNyYywgbGluZXMqc3RyaWRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKWRlc3QrKGxpbmVzLTEpKnN0cmlkZSwgKGNvbnN0IHVpbnQ4X3QqKXNyYysobGluZXMtMSkqc3RyaWRlLCAtbGluZXMqc3RyaWRlKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBQT1NUUFJPQ19QT1NUUFJPQ0VTU19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlicG9zdHByb2MvcG9zdHByb2Nlc3NfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJwb3N0cHJvYy9wb3N0cHJvY2Vzc190ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MjJmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlicG9zdHByb2MvcG9zdHByb2Nlc3NfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDM3MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBNaWNoYWVsIE5pZWRlcm1heWVyIChtaWNoYWVsbmlAZ214LmF0KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogbW14L21teDIvM2Rub3cgcG9zdHByb2Nlc3MgY29kZS4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKworLyogQSBzaW5nbGUgVEVNUExBVEVfUFBfKiBzaG91bGQgYmUgZGVmaW5lZCAodG8gMSkgd2hlbiB0aGlzIHRlbXBsYXRlIGlzCisgKiBpbmNsdWRlZC4gVGhlIGZvbGxvd2luZyBtYWNyb3Mgd2lsbCBkZWZpbmUgaXRzIGRlcGVuZGVuY2llcyB0byAxIGFzIHdlbGwKKyAqIChsaWtlIE1NWDIgZGVwZW5kaW5nIG9uIE1NWCksIGFuZCB3aWxsIGRlZmluZSB0byAwIGFsbCB0aGUgb3RoZXJzLiBFdmVyeQorICogVEVNUExBVEVfUFBfKiBuZWVkIHRvIGJlIHVuZGVmIGF0IHRoZSBlbmQuICovCisKKyNpZmRlZiBURU1QTEFURV9QUF9DCisjICAgZGVmaW5lIFJFTkFNRShhKSBhICMjIF9DCisjZWxzZQorIyAgIGRlZmluZSBURU1QTEFURV9QUF9DIDAKKyNlbmRpZgorCisjaWZkZWYgVEVNUExBVEVfUFBfQUxUSVZFQworIyAgIGRlZmluZSBSRU5BTUUoYSkgYSAjIyBfYWx0aXZlYworI2Vsc2UKKyMgICBkZWZpbmUgVEVNUExBVEVfUFBfQUxUSVZFQyAwCisjZW5kaWYKKworI2lmZGVmIFRFTVBMQVRFX1BQX01NWAorIyAgIGRlZmluZSBSRU5BTUUoYSkgYSAjIyBfTU1YCisjZWxzZQorIyAgIGRlZmluZSBURU1QTEFURV9QUF9NTVggMAorI2VuZGlmCisKKyNpZmRlZiBURU1QTEFURV9QUF9NTVhFWFQKKyMgICB1bmRlZiAgVEVNUExBVEVfUFBfTU1YCisjICAgZGVmaW5lIFRFTVBMQVRFX1BQX01NWCAxCisjICAgZGVmaW5lIFJFTkFNRShhKSBhICMjIF9NTVgyCisjZWxzZQorIyAgIGRlZmluZSBURU1QTEFURV9QUF9NTVhFWFQgMAorI2VuZGlmCisKKyNpZmRlZiBURU1QTEFURV9QUF8zRE5PVworIyAgIHVuZGVmICBURU1QTEFURV9QUF9NTVgKKyMgICBkZWZpbmUgVEVNUExBVEVfUFBfTU1YIDEKKyMgICBkZWZpbmUgUkVOQU1FKGEpIGEgIyMgXzNETm93CisjZWxzZQorIyAgIGRlZmluZSBURU1QTEFURV9QUF8zRE5PVyAwCisjZW5kaWYKKworI2lmZGVmIFRFTVBMQVRFX1BQX1NTRTIKKyMgICB1bmRlZiAgVEVNUExBVEVfUFBfTU1YCisjICAgZGVmaW5lIFRFTVBMQVRFX1BQX01NWCAxCisjICAgdW5kZWYgIFRFTVBMQVRFX1BQX01NWEVYVAorIyAgIGRlZmluZSBURU1QTEFURV9QUF9NTVhFWFQgMQorIyAgIGRlZmluZSBSRU5BTUUoYSkgYSAjIyBfU1NFMgorI2Vsc2UKKyMgICBkZWZpbmUgVEVNUExBVEVfUFBfU1NFMiAwCisjZW5kaWYKKworI3VuZGVmIFJFQUxfUEFWR0IKKyN1bmRlZiBQQVZHQgorI3VuZGVmIFBNSU5VQgorI3VuZGVmIFBNQVhVQgorCisjaWYgICBURU1QTEFURV9QUF9NTVhFWFQKKyNkZWZpbmUgUkVBTF9QQVZHQihhLGIpICJwYXZnYiAiICNhICIsICIgI2IgIiBcblx0IgorI2VsaWYgVEVNUExBVEVfUFBfM0ROT1cKKyNkZWZpbmUgUkVBTF9QQVZHQihhLGIpICJwYXZndXNiICIgI2EgIiwgIiAjYiAiIFxuXHQiCisjZW5kaWYKKyNkZWZpbmUgUEFWR0IoYSxiKSAgUkVBTF9QQVZHQihhLGIpCisKKyNpZiAgIFRFTVBMQVRFX1BQX01NWEVYVAorI2RlZmluZSBQTUlOVUIoYSxiLHQpICJwbWludWIgIiAjYSAiLCAiICNiICIgXG5cdCIKKyNlbGlmIFRFTVBMQVRFX1BQX01NWAorI2RlZmluZSBQTUlOVUIoYixhLHQpIFwKKyAgICAibW92cSAiICNhICIsICIgI3QgIiBcblx0IlwKKyAgICAicHN1YnVzYiAiICNiICIsICIgI3QgIiBcblx0IlwKKyAgICAicHN1YmIgIiAjdCAiLCAiICNhICIgXG5cdCIKKyNlbmRpZgorCisjaWYgICBURU1QTEFURV9QUF9NTVhFWFQKKyNkZWZpbmUgUE1BWFVCKGEsYikgInBtYXh1YiAiICNhICIsICIgI2IgIiBcblx0IgorI2VsaWYgVEVNUExBVEVfUFBfTU1YCisjZGVmaW5lIFBNQVhVQihhLGIpIFwKKyAgICAicHN1YnVzYiAiICNhICIsICIgI2IgIiBcblx0IlwKKyAgICAicGFkZGIgIiAjYSAiLCAiICNiICIgXG5cdCIKKyNlbmRpZgorCisvL0ZJWE1FPyB8MjU1LTB8ID0gMSAoc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0gLi4uKQorI2lmIFRFTVBMQVRFX1BQX01NWAorLyoqCisgKiBDaGVjayBpZiB0aGUgbWlkZGxlIDh4OCBCbG9jayBpbiB0aGUgZ2l2ZW4gOHgxNiBibG9jayBpcyBmbGF0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IFJFTkFNRSh2ZXJ0Q2xhc3NpZnkpKGNvbnN0IHVpbnQ4X3Qgc3JjW10sIGludCBzdHJpZGUsIFBQQ29udGV4dCAqYyl7CisgICAgaW50IG51bUVxPSAwLCBkY09rOworICAgIHNyYys9IHN0cmlkZSo0OyAvLyBzcmMgcG9pbnRzIHRvIGJlZ2luIG9mIHRoZSA4eDggQmxvY2sKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92cSAlMCwgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJTEsICUlbW02ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogOiAibSIgKGMtPm1teERjT2Zmc2V0W2MtPm5vbkJRUF0pLCAgIm0iIChjLT5tbXhEY1RocmVzaG9sZFtjLT5ub25CUVBdKQorICAgICAgICApOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAoJTIsICUzKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisvLyAgICAgIDAgICAgICAgMSAgICAgICAyICAgICAgIDMgICAgICAgNCAgICAgICA1ICAgICAgIDYgICAgICAgNyAgICAgICA4ICAgICAgIDkKKy8vICAgICAgJTEgICAgICBlYXggICAgIGVheCslMiAgZWF4KzIlMiAlMSs0JTIgIGVjeCAgICAgZWN4KyUyICBlY3grMiUyICUxKzglMiAgZWN4KzQlMgorCisgICAgICAgICJtb3ZxICglMiksICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQTUFYVUIoJSVtbTEsICUlbW00KQorICAgICAgICBQTUlOVUIoJSVtbTEsICUlbW0zLCAlJW1tNSkKKyAgICAgICAgInBzdWJiICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIG1tMCA9IGRpZmZlcmVuY2UKKyAgICAgICAgInBhZGRiICUlbW03LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIsJTMpLCAlJW1tMiAgICAgICAgICAgICBcblx0IgorICAgICAgICBQTUFYVUIoJSVtbTIsICUlbW00KQorICAgICAgICBQTUlOVUIoJSVtbTIsICUlbW0zLCAlJW1tNSkKKyAgICAgICAgInBzdWJiICUlbW0yLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tNywgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTMsIDIpLCAlJW1tMSAgICAgICAgIFxuXHQiCisgICAgICAgIFBNQVhVQiglJW1tMSwgJSVtbTQpCisgICAgICAgIFBNSU5VQiglJW1tMSwgJSVtbTMsICUlbW01KQorICAgICAgICAicHN1YmIgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibGVhICglJSJSRUdfYSIsICUzLCA0KSwgJSUiUkVHX2EiICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAoJTIsICUzLCA0KSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUE1BWFVCKCUlbW0yLCAlJW1tNCkKKyAgICAgICAgUE1JTlVCKCUlbW0yLCAlJW1tMywgJSVtbTUpCisgICAgICAgICJwc3ViYiAlJW1tMiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndGIgJSVtbTYsICUlbW0xICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQTUFYVUIoJSVtbTEsICUlbW00KQorICAgICAgICBQTUlOVUIoJSVtbTEsICUlbW0zLCAlJW1tNSkKKyAgICAgICAgInBzdWJiICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tNywgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTMpLCAlJW1tMiAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBNQVhVQiglJW1tMiwgJSVtbTQpCisgICAgICAgIFBNSU5VQiglJW1tMiwgJSVtbTMsICUlbW01KQorICAgICAgICAicHN1YmIgJSVtbTIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW03LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMywgMiksICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgUE1BWFVCKCUlbW0xLCAlJW1tNCkKKyAgICAgICAgUE1JTlVCKCUlbW0xLCAlJW1tMywgJSVtbTUpCisgICAgICAgICJwc3ViYiAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndGIgJSVtbTYsICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAlJW1tMywgJSVtbTQgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNpZiBURU1QTEFURV9QUF9NTVhFWFQKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2FkYncgJSVtbTcsICUlbW0wICAgICAgICAgICAgICAgICAgICBcblx0IgorI2Vsc2UKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsdyAkOCwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JscSAkMTYsICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JscSAkMzIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbmRpZgorICAgICAgICAibW92cSAlNCwgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gUVAsLi4uLCBRUAorICAgICAgICAicGFkZHVzYiAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMlFQIC4uLiAyUVAKKyAgICAgICAgInBzdWJ1c2IgJSVtbTcsICUlbW00ICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIERpZmYgPD0gMlFQIC0+IDAKKyAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0wLCAlMCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tNCwgJTEgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6ICI9ciIgKG51bUVxKSwgIj1yIiAoZGNPaykKKyAgICAgICAgOiAiciIgKHNyYyksICJyIiAoKHg4Nl9yZWcpc3RyaWRlKSwgIm0iIChjLT5wUVBiKQorICAgICAgICA6ICIlIlJFR19hCisgICAgICAgICk7CisKKyAgICBudW1FcT0gKC1udW1FcSkgJjB4RkY7CisgICAgaWYobnVtRXEgPiBjLT5wcE1vZGUuZmxhdG5lc3NUaHJlc2hvbGQpeworICAgICAgICBpZihkY09rKSByZXR1cm4gMDsKKyAgICAgICAgZWxzZSAgICAgcmV0dXJuIDE7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiAyOworICAgIH0KK30KKyNlbmRpZiAvL1RFTVBMQVRFX1BQX01NWAorCisvKioKKyAqIERvIGEgdmVydGljYWwgbG93IHBhc3MgZmlsdGVyIG9uIHRoZSA4eDE2IGJsb2NrIChvbmx5IHdyaXRlIHRvIHRoZSA4eDggYmxvY2sgaW4gdGhlIG1pZGRsZSkKKyAqIHVzaW5nIHRoZSA5LVRhcCBGaWx0ZXIgKDEsMSwyLDIsNCwyLDIsMSwxKS8xNgorICovCisjaWYgIVRFTVBMQVRFX1BQX0FMVElWRUMKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUoZG9WZXJ0TG93UGFzcykodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBQUENvbnRleHQgKmMpCit7CisjaWYgVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCisgICAgc3JjKz0gc3RyaWRlKjM7CisgICAgX19hc21fXyB2b2xhdGlsZSggICAgICAgIC8vIm1vdnYgJTAgJTEgJTJcblx0IgorICAgICAgICAibW92cSAlMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIFFQLC4uLiwgUVAKKyAgICAgICAgInB4b3IgJSVtbTQsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglMCwgJTEpLCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNSwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTYsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICUlbW02LCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBvciAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEFCUyBEaWZmIG9mIGxpbmVzCisgICAgICAgICJwc3VidXNiICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBkaWZmIDw9IFFQIC0+IDAKKyAgICAgICAgInBjbXBlcWIgJSVtbTQsICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGRpZmYgPD0gUVAgLT4gRkYKKworICAgICAgICAicGFuZCAlJW1tMiwgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmRuICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgJSVtbTIsICUlbW02ICAgICAgICAgICAgICAgICAgICAgICBcblx0Ii8vIEZpcnN0IExpbmUgdG8gRmlsdGVyCisKKyAgICAgICAgIm1vdnEgKCUwLCAlMSwgOCksICUlbW01ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUwLCAlMSwgNCksICUlIlJFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglMCwgJTEsIDgpLCAlJSJSRUdfYyIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YiAlMSwgJSUiUkVHX2MiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJTEsICUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAlMCBwb2ludHMgdG8gbGluZSAxIG5vdCAwCisgICAgICAgICJtb3ZxICglMCwgJTEsIDgpLCAlJW1tNyAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNSwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICUlbW03LCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBvciAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEFCUyBEaWZmIG9mIGxpbmVzCisgICAgICAgICJwc3VidXNiICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBkaWZmIDw9IFFQIC0+IDAKKyAgICAgICAgInBjbXBlcWIgJSVtbTQsICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGRpZmYgPD0gUVAgLT4gRkYKKworICAgICAgICAicGFuZCAlJW1tMiwgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmRuICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgJSVtbTIsICUlbW03ICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBGaXJzdCBMaW5lIHRvIEZpbHRlcgorCisKKyAgICAgICAgLy8gICAgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDgKKyAgICAgICAgLy8gICAgICAlMCAgICAgICUwKyUxICAgJTArMiUxICBlYXggICAgICUwKzQlMSAgZWF4KzIlMSBlY3ggICAgIGVheCs0JTEKKyAgICAgICAgLy8gNiA0IDIgMiAxIDEKKyAgICAgICAgLy8gNiA0IDQgMgorICAgICAgICAvLyA2IDggMgorCisgICAgICAgICJtb3ZxICglMCwgJTEpLCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAgMQorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gIDEKKyAgICAgICAgUEFWR0IoJSVtbTYsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMSAxICAgICAgICAvMgorICAgICAgICBQQVZHQiglJW1tNiwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8zIDEgICAgICAgIC80CisKKyAgICAgICAgIm1vdnEgKCUwLCAlMSwgNCksICUlbW0yICAgICAgICAgICAgICAgIFxuXHQiIC8vICAgICAxCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAgICAgMQorICAgICAgICBQQVZHQigoJSVSRUdhKSwgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgMTEgICAgICAgIC8yCisgICAgICAgIFBBVkdCKCglMCwgJTEsIDIpLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAvLyAgIDIxMSAgICAgICAgLzQKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vICAgMjExICAgICAgICAvNAorICAgICAgICAibW92cSAoJTApLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMQorICAgICAgICBQQVZHQiglJW1tNCwgJSVtbTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCAyMTEgICAgICAgIC84CisgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzY0MjIxMSAgICAgICAgLzE2CisgICAgICAgICJtb3ZxICUlbW0zLCAoJTApICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBYCisgICAgICAgIC8vIG1tMT0yIG1tMj0zKDIxMSkgbW00PTEgbW01PTUgbW02PTAgbW03PTkKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vICAxCisgICAgICAgIFBBVkdCKCUlbW02LCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzEgMSAgICAgICAgLzIKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDEKKyAgICAgICAgUEFWR0IoKCUwLCUxLDIpLCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMSAgICAgICAgLzIKKyAgICAgICAgUEFWR0IoKCUlUkVHYSwlMSwyKSwgJSVtbTUpICAgICAgICAgICAgICAgICAgIC8vICAgICAxMSAgICAgICAgLzIKKyAgICAgICAgUEFWR0IoKCUlUkVHYSksICUlbW01KSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIDIxMSAvNAorICAgICAgICBQQVZHQiglJW1tNSwgJSVtbTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiAyMjExIC84CisgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzQyNDIyMTEgLzE2CisgICAgICAgICJtb3ZxICUlbW0zLCAoJTAsJTEpICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAgWAorICAgICAgICAvLyBtbTE9MiBtbTI9MygyMTEpIG1tND0xIG1tNT00KDIxMSkgbW02PTAgbW03PTkKKyAgICAgICAgUEFWR0IoJSVtbTQsICUlbW02KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8xMSAgICAgICAgLzIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19jIiksICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiIC8vICAgICAgIDEKKyAgICAgICAgUEFWR0IoKCUlUkVHYSwgJTEsIDIpLCAlJW1tMCkgICAgICAgICAgICAgICAgIC8vICAgICAgMTEvMgorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gICAgICAxMS8yCisgICAgICAgIFBBVkdCKCUlbW0xLCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMiAgIDExLzQKKyAgICAgICAgUEFWR0IoJSVtbTYsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMjIyICAgMTEvOAorICAgICAgICBQQVZHQiglJW1tMiwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8yMjI0MjIxMS8xNgorICAgICAgICAibW92cSAoJTAsICUxLCAyKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIgLy8gICAxCisgICAgICAgICJtb3ZxICUlbW0wLCAoJTAsICUxLCAyKSAgICAgICAgICAgICAgICBcblx0IiAvLyAgIFgKKyAgICAgICAgLy8gbW0xPTIgbW0yPTMgbW0zPTYoMTEpIG1tND0xIG1tNT00KDIxMSkgbW02PTAoMTEpIG1tNz05CisgICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxLCA0KSwgJSVtbTAgICAgICAgICBcblx0IiAvLyAgICAgICAgMQorICAgICAgICBQQVZHQigoJSVSRUdjKSwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgMTEgICAgICAgIC8yCisgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tNikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzExICAgICAxMSAgICAgICAgLzQKKyAgICAgICAgUEFWR0IoJSVtbTEsICUlbW00KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExICAgICAgICAgICAgICAgIC8yCisgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMTEgICAgICAgICAgICAgICAgLzIKKyAgICAgICAgUEFWR0IoJSVtbTEsICUlbW02KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMTEyMiAgIDExICAgICAgICAvOAorICAgICAgICBQQVZHQiglJW1tNSwgJSVtbTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8xMTIyNDIyMTEgICAgICAgIC8xNgorICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTUgICAgICAgICAgICAgICAgXG5cdCIgLy8gICAgMQorICAgICAgICAibW92cSAlJW1tNiwgKCUlIlJFR19hIikgICAgICAgICAgICAgICAgXG5cdCIgLy8gICAgWAorICAgICAgICAvLyBtbTA9NygxMSkgbW0xPTIoMTEpIG1tMj0zIG1tMz02KDExKSBtbTQ9MSgxMSkgbW01PTQgbW03PTkKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJW1tNiAgICAgICAgIFxuXHQiIC8vICAgICAgICAxCisgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tNikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgMTEgICAgICAgIC8yCisgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tNikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMSAgICAgMTEgICAgICAgIC80CisgICAgICAgIFBBVkdCKCUlbW0zLCAlJW1tNikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMSAgIDIyMTEgICAgICAgIC84CisgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIDExICAgICAgICAgICAgICAgIC8yCisgICAgICAgICJtb3ZxICglMCwgJTEsIDQpLCAlJW1tNCAgICAgICAgICAgICAgICBcblx0IiAvLyAgICAgMQorICAgICAgICBQQVZHQiglJW1tNCwgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAxMTIgICAgICAgICAgICAgICAgLzQKKyAgICAgICAgUEFWR0IoJSVtbTIsICUlbW02KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExMjI0MjIxMSAgICAgICAgLzE2CisgICAgICAgICJtb3ZxICUlbW02LCAoJTAsICUxLCA0KSAgICAgICAgICAgICAgICBcblx0IiAvLyAgICAgWAorICAgICAgICAvLyBtbTA9NygxMSkgbW0xPTIoMTEpIG1tMj0zKDExMikgbW0zPTYoMTEpIG1tND01IG1tNT00IG1tNz05CisgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMTEgICAgIDIgICAgICAgIC80CisgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAxMSAgICAgICAgICAgICAgICAvMgorICAgICAgICBQQVZHQiglJW1tNSwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgMTEgMTEgICAgICAgIC80CisgICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxLCAyKSwgJSVtbTYgICAgICAgICBcblx0IiAvLyAgICAgIDEKKyAgICAgICAgUEFWR0IoJSVtbTYsICUlbW0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxMSAgNCAgMiAgICAgICAgLzgKKyAgICAgICAgUEFWR0IoJSVtbTAsICUlbW0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxMTIyNDIyMiAgICAgICAgLzE2CisgICAgICAgICJtb3ZxICUlbW0xLCAoJSUiUkVHX2EiLCAlMSwgMikgICAgICAgICBcblx0IiAvLyAgICAgIFgKKyAgICAgICAgLy8gbW0yPTMoMTEyKSBtbTM9NigxMSkgbW00PTUgbW01PTQoMTEpIG1tNj02IG1tNz05CisgICAgICAgIFBBVkdCKCglJVJFR2MpLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIDExMiA0ICAgICAgICAvOAorICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgNCksICUlbW0wICAgICAgICAgXG5cdCIgLy8gICAgICAgIDEKKyAgICAgICAgUEFWR0IoJSVtbTAsICUlbW02KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgMSAxICAgICAgICAvMgorICAgICAgICBQQVZHQiglJW1tNywgJSVtbTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAxIDEyICAgICAgICAvNAorICAgICAgICBQQVZHQiglJW1tMiwgJSVtbTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAxMTIyNDI0ICAgICAgICAvNAorICAgICAgICAibW92cSAlJW1tNiwgKCUlIlJFR19jIikgICAgICAgICAgICAgICAgXG5cdCIgLy8gICAgICAgWAorICAgICAgICAvLyBtbTA9OCBtbTM9NigxMSkgbW00PTUgbW01PTQoMTEpIG1tNz05CisgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAxMSAgIDIgICAgICAgIC80CisgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAxMSAgIDYgICAgICAgIC84CisKKyAgICAgICAgUEFWR0IoJSVtbTMsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgMTEyICAgICAgICAvNAorICAgICAgICBQQVZHQiglJW1tMCwgJSVtbTUpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgMTEyMjQ2ICAgICAgICAvMTYKKyAgICAgICAgIm1vdnEgJSVtbTUsICglJSJSRUdfYSIsICUxLCA0KSAgICAgICAgIFxuXHQiIC8vICAgICAgICBYCisgICAgICAgICJzdWIgJTEsICUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIDoKKyAgICAgICAgOiAiciIgKHNyYyksICJyIiAoKHg4Nl9yZWcpc3RyaWRlKSwgIm0iIChjLT5wUVBiKQorICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfYworICAgICk7CisjZWxzZSAvL1RFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVworICAgIGNvbnN0IGludCBsMT0gc3RyaWRlOworICAgIGNvbnN0IGludCBsMj0gc3RyaWRlICsgbDE7CisgICAgY29uc3QgaW50IGwzPSBzdHJpZGUgKyBsMjsKKyAgICBjb25zdCBpbnQgbDQ9IHN0cmlkZSArIGwzOworICAgIGNvbnN0IGludCBsNT0gc3RyaWRlICsgbDQ7CisgICAgY29uc3QgaW50IGw2PSBzdHJpZGUgKyBsNTsKKyAgICBjb25zdCBpbnQgbDc9IHN0cmlkZSArIGw2OworICAgIGNvbnN0IGludCBsOD0gc3RyaWRlICsgbDc7CisgICAgY29uc3QgaW50IGw5PSBzdHJpZGUgKyBsODsKKyAgICBpbnQgeDsKKyAgICBzcmMrPSBzdHJpZGUqMzsKKyAgICBmb3IoeD0wOyB4PEJMT0NLX1NJWkU7IHgrKyl7CisgICAgICAgIGNvbnN0IGludCBmaXJzdD0gRkZBQlMoc3JjWzBdIC0gc3JjW2wxXSkgPCBjLT5RUCA/IHNyY1swXSA6IHNyY1tsMV07CisgICAgICAgIGNvbnN0IGludCBsYXN0PSBGRkFCUyhzcmNbbDhdIC0gc3JjW2w5XSkgPCBjLT5RUCA/IHNyY1tsOV0gOiBzcmNbbDhdOworCisgICAgICAgIGludCBzdW1zWzEwXTsKKyAgICAgICAgc3Vtc1swXSA9IDQqZmlyc3QgKyBzcmNbbDFdICsgc3JjW2wyXSArIHNyY1tsM10gKyA0OworICAgICAgICBzdW1zWzFdID0gc3Vtc1swXSAtIGZpcnN0ICArIHNyY1tsNF07CisgICAgICAgIHN1bXNbMl0gPSBzdW1zWzFdIC0gZmlyc3QgICsgc3JjW2w1XTsKKyAgICAgICAgc3Vtc1szXSA9IHN1bXNbMl0gLSBmaXJzdCAgKyBzcmNbbDZdOworICAgICAgICBzdW1zWzRdID0gc3Vtc1szXSAtIGZpcnN0ICArIHNyY1tsN107CisgICAgICAgIHN1bXNbNV0gPSBzdW1zWzRdIC0gc3JjW2wxXSArIHNyY1tsOF07CisgICAgICAgIHN1bXNbNl0gPSBzdW1zWzVdIC0gc3JjW2wyXSArIGxhc3Q7CisgICAgICAgIHN1bXNbN10gPSBzdW1zWzZdIC0gc3JjW2wzXSArIGxhc3Q7CisgICAgICAgIHN1bXNbOF0gPSBzdW1zWzddIC0gc3JjW2w0XSArIGxhc3Q7CisgICAgICAgIHN1bXNbOV0gPSBzdW1zWzhdIC0gc3JjW2w1XSArIGxhc3Q7CisKKyAgICAgICAgc3JjW2wxXT0gKHN1bXNbMF0gKyBzdW1zWzJdICsgMipzcmNbbDFdKT4+NDsKKyAgICAgICAgc3JjW2wyXT0gKHN1bXNbMV0gKyBzdW1zWzNdICsgMipzcmNbbDJdKT4+NDsKKyAgICAgICAgc3JjW2wzXT0gKHN1bXNbMl0gKyBzdW1zWzRdICsgMipzcmNbbDNdKT4+NDsKKyAgICAgICAgc3JjW2w0XT0gKHN1bXNbM10gKyBzdW1zWzVdICsgMipzcmNbbDRdKT4+NDsKKyAgICAgICAgc3JjW2w1XT0gKHN1bXNbNF0gKyBzdW1zWzZdICsgMipzcmNbbDVdKT4+NDsKKyAgICAgICAgc3JjW2w2XT0gKHN1bXNbNV0gKyBzdW1zWzddICsgMipzcmNbbDZdKT4+NDsKKyAgICAgICAgc3JjW2w3XT0gKHN1bXNbNl0gKyBzdW1zWzhdICsgMipzcmNbbDddKT4+NDsKKyAgICAgICAgc3JjW2w4XT0gKHN1bXNbN10gKyBzdW1zWzldICsgMipzcmNbbDhdKT4+NDsKKworICAgICAgICBzcmMrKzsKKyAgICB9CisjZW5kaWYgLy9URU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cKK30KKyNlbmRpZiAvL1RFTVBMQVRFX1BQX0FMVElWRUMKKworLyoqCisgKiBFeHBlcmltZW50YWwgRmlsdGVyIDEKKyAqIHdpbGwgbm90IGRhbWFnZSBsaW5lYXIgZ3JhZGllbnRzCisgKiBGbGF0IGJsb2NrcyBzaG91bGQgbG9vayBsaWtlIHRoZXkgd2VyZSBwYXNzZWQgdGhyb3VnaCB0aGUgKDEsMSwyLDIsNCwyLDIsMSwxKSA5LVRhcCBmaWx0ZXIKKyAqIGNhbiBvbmx5IHNtb290aCBibG9ja3MgYXQgdGhlIGV4cGVjdGVkIGxvY2F0aW9ucyAoaXQgY2Fubm90IHNtb290aCB0aGVtIGlmIHRoZXkgZGlkIG1vdmUpCisgKiBNTVgyIHZlcnNpb24gZG9lcyBjb3JyZWN0IGNsaXBwaW5nIEMgdmVyc2lvbiBkb2VzIG5vdAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHZlcnRYMUZpbHRlcikodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBQUENvbnRleHQgKmNvKQoreworI2lmIFRFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVworICAgIHNyYys9IHN0cmlkZSozOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDAKKyAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJSJSRUdfYyIgICAgICBcblx0IgorLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcgICAgICAgOCAgICAgICA5CisvLyAgICAgICUwICAgICAgZWF4ICAgICBlYXgrJTEgIGVheCsyJTEgJTArNCUxICBlY3ggICAgIGVjeCslMSAgZWN4KzIlMSAlMCs4JTEgIGVjeCs0JTEKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMCAgICAgICAgIFxuXHQiIC8vIGxpbmUgMworICAgICAgICAibW92cSAoJTAsICUxLCA0KSwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIgLy8gbGluZSA0CisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBsaW5lIDQKKyAgICAgICAgInBzdWJ1c2IgJSVtbTAsICUlbW0xICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG9yICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfGwyIC0gbDN8CisgICAgICAgICJtb3ZxICglJSJSRUdfYyIpLCAlJW1tMyAgICAgICAgICAgICAgICBcblx0IiAvLyBsaW5lIDUKKyAgICAgICAgIm1vdnEgKCUlIlJFR19jIiwgJTEpLCAlJW1tNCAgICAgICAgICAgIFxuXHQiIC8vIGxpbmUgNgorICAgICAgICAibW92cSAlJW1tMywgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbGluZSA1CisgICAgICAgICJwc3VidXNiICUlbW00LCAlJW1tMyAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAlJW1tNSwgJSVtbTQgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBvciAlJW1tNCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHxsNSAtIGw2fAorICAgICAgICBQQVZHQiglJW1tMywgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHxsMiAtIGwzfCArIHxsNSAtIGw2fCkvMgorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbGluZSA0CisgICAgICAgICJwc3VidXNiICUlbW01LCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcWIgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIChsNCAtIGw1KSA8PSAwID8gLTEgOiAwCisgICAgICAgICJwc3VidXNiICUlbW0xLCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG9yICUlbW01LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfGw0IC0gbDV8CisgICAgICAgICJwc3VidXNiICUlbW0wLCAlJW1tNCAgICAgICAgICAgICAgICAgICBcblx0IiAvL2QgPSBNQVgoMCwgfGw0LWw1fCAtICh8bDItbDN8ICsgfGw1LWw2fCkvMikKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGQKKyAgICAgICAgIm1vdnEgJTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNiICUlbW0wLCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAlJW1tMCwgJSVtbTQgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcWIgJSVtbTcsICUlbW00ICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGQgPD0gUVAgPyAtMSA6IDAKKyAgICAgICAgInBzdWJ1c2IgIk1BTkdMRShiMDEpIiwgJSVtbTMgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYW5kICUlbW00LCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBkIDw9IFFQID8gZCA6IDAKKworICAgICAgICBQQVZHQiglJW1tNywgJSVtbTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZC8yCisgICAgICAgICJtb3ZxICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBkLzIKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0zKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGQvNAorICAgICAgICBQQVZHQiglJW1tMSwgJSVtbTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMypkLzgKKworICAgICAgICAibW92cSAoJTAsICUxLCA0KSwgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbGluZSA0CisgICAgICAgICJweG9yICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyhsNCAtIGw1KSA8PSAwID8gLWw0LTEgOiBsNAorICAgICAgICAicHN1YnVzYiAlJW1tMywgJSVtbTAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAoJTAsICUxLCA0KSAgICAgICAgICAgICAgICBcblx0IiAvLyBsaW5lIDQKKworICAgICAgICAibW92cSAoJSUiUkVHX2MiKSwgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbGluZSA1CisgICAgICAgICJweG9yICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyhsNCAtIGw1KSA8PSAwID8gLWw1LTEgOiBsNQorICAgICAgICAicGFkZHVzYiAlJW1tMywgJSVtbTAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAoJSUiUkVHX2MiKSAgICAgICAgICAgICAgICBcblx0IiAvLyBsaW5lIDUKKworICAgICAgICBQQVZHQiglJW1tNywgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZC80CisKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMCAgICAgICAgIFxuXHQiIC8vIGxpbmUgMworICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8obDQgLSBsNSkgPD0gMCA/IC1sNC0xIDogbDQKKyAgICAgICAgInBzdWJ1c2IgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJweG9yICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgKCUlIlJFR19hIiwgJTEsIDIpICAgICAgICAgXG5cdCIgLy8gbGluZSAzCisKKyAgICAgICAgIm1vdnEgKCUlIlJFR19jIiwgJTEpLCAlJW1tMCAgICAgICAgICAgIFxuXHQiIC8vIGxpbmUgNgorICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8obDQgLSBsNSkgPD0gMCA/IC1sNS0xIDogbDUKKyAgICAgICAgInBhZGR1c2IgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJweG9yICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgKCUlIlJFR19jIiwgJTEpICAgICAgICAgICAgXG5cdCIgLy8gbGluZSA2CisKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGQvOAorCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxKSwgJSVtbTAgICAgICAgICAgICBcblx0IiAvLyBsaW5lIDIKKyAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vKGw0IC0gbDUpIDw9IDAgPyAtbDItMSA6IGwyCisgICAgICAgICJwc3VidXNiICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICglJSJSRUdfYSIsICUxKSAgICAgICAgICAgIFxuXHQiIC8vIGxpbmUgMgorCisgICAgICAgICJtb3ZxICglJSJSRUdfYyIsICUxLCAyKSwgJSVtbTAgICAgICAgICBcblx0IiAvLyBsaW5lIDcKKyAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vKGw0IC0gbDUpIDw9IDAgPyAtbDctMSA6IGw3CisgICAgICAgICJwYWRkdXNiICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICglJSJSRUdfYyIsICUxLCAyKSAgICAgICAgIFxuXHQiIC8vIGxpbmUgNworCisgICAgICAgIDoKKyAgICAgICAgOiAiciIgKHNyYyksICJyIiAoKHg4Nl9yZWcpc3RyaWRlKSwgIm0iIChjby0+cFFQYikKKyAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoYjAxKQorICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfYworICAgICk7CisjZWxzZSAvL1RFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVworCisgICAgY29uc3QgaW50IGwxPSBzdHJpZGU7CisgICAgY29uc3QgaW50IGwyPSBzdHJpZGUgKyBsMTsKKyAgICBjb25zdCBpbnQgbDM9IHN0cmlkZSArIGwyOworICAgIGNvbnN0IGludCBsND0gc3RyaWRlICsgbDM7CisgICAgY29uc3QgaW50IGw1PSBzdHJpZGUgKyBsNDsKKyAgICBjb25zdCBpbnQgbDY9IHN0cmlkZSArIGw1OworICAgIGNvbnN0IGludCBsNz0gc3RyaWRlICsgbDY7CisvLyAgICBjb25zdCBpbnQgbDg9IHN0cmlkZSArIGw3OworLy8gICAgY29uc3QgaW50IGw5PSBzdHJpZGUgKyBsODsKKyAgICBpbnQgeDsKKworICAgIHNyYys9IHN0cmlkZSozOworICAgIGZvcih4PTA7IHg8QkxPQ0tfU0laRTsgeCsrKXsKKyAgICAgICAgaW50IGE9IHNyY1tsM10gLSBzcmNbbDRdOworICAgICAgICBpbnQgYj0gc3JjW2w0XSAtIHNyY1tsNV07CisgICAgICAgIGludCBjPSBzcmNbbDVdIC0gc3JjW2w2XTsKKworICAgICAgICBpbnQgZD0gRkZBQlMoYikgLSAoKEZGQUJTKGEpICsgRkZBQlMoYykpPj4xKTsKKyAgICAgICAgZD0gRkZNQVgoZCwgMCk7CisKKyAgICAgICAgaWYoZCA8IGNvLT5RUCoyKXsKKyAgICAgICAgICAgIGludCB2ID0gZCAqIEZGU0lHTigtYik7CisKKyAgICAgICAgICAgIHNyY1tsMl0gKz12Pj4zOworICAgICAgICAgICAgc3JjW2wzXSArPXY+PjI7CisgICAgICAgICAgICBzcmNbbDRdICs9KDMqdik+PjM7CisgICAgICAgICAgICBzcmNbbDVdIC09KDMqdik+PjM7CisgICAgICAgICAgICBzcmNbbDZdIC09dj4+MjsKKyAgICAgICAgICAgIHNyY1tsN10gLT12Pj4zOworICAgICAgICB9CisgICAgICAgIHNyYysrOworICAgIH0KKyNlbmRpZiAvL1RFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVworfQorCisjaWYgIVRFTVBMQVRFX1BQX0FMVElWRUMKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUoZG9WZXJ0RGVmRmlsdGVyKSh1aW50OF90IHNyY1tdLCBpbnQgc3RyaWRlLCBQUENvbnRleHQgKmMpCit7CisjaWYgVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCisvKgorICAgIHVpbnQ4X3QgdG1wWzE2XTsKKyAgICBjb25zdCBpbnQgbDE9IHN0cmlkZTsKKyAgICBjb25zdCBpbnQgbDI9IHN0cmlkZSArIGwxOworICAgIGNvbnN0IGludCBsMz0gc3RyaWRlICsgbDI7CisgICAgY29uc3QgaW50IGw0PSAoaW50KXRtcCAtIChpbnQpc3JjIC0gc3RyaWRlKjM7CisgICAgY29uc3QgaW50IGw1PSAoaW50KXRtcCAtIChpbnQpc3JjIC0gc3RyaWRlKjMgKyA4OworICAgIGNvbnN0IGludCBsNj0gc3RyaWRlKjMgKyBsMzsKKyAgICBjb25zdCBpbnQgbDc9IHN0cmlkZSArIGw2OworICAgIGNvbnN0IGludCBsOD0gc3RyaWRlICsgbDc7CisKKyAgICBtZW1jcHkodG1wLCBzcmMrc3RyaWRlKjcsIDgpOworICAgIG1lbWNweSh0bXArOCwgc3JjK3N0cmlkZSo4LCA4KTsKKyovCisgICAgc3JjKz0gc3RyaWRlKjQ7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKworI2lmIDAgLy9zbGlnaHRseSBtb3JlIGFjY3VyYXRlIGFuZCBzbGlnaHRseSBzbG93ZXIKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDAKKyAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJSJSRUdfYyIgICAgICBcblx0IgorLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcKKy8vICAgICAgJTAgICAgICAlMCslMSAgICUwKzIlMSAgZWF4KzIlMSAlMCs0JTEgIGVheCs0JTEgZWN4KyUxICBlY3grMiUxCisvLyAgICAgICUwICAgICAgZWF4ICAgICBlYXgrJTEgIGVheCsyJTEgJTArNCUxICBlY3ggICAgIGVjeCslMSAgZWN4KzIlMQorCisKKyAgICAgICAgIm1vdnEgKCUwLCAlMSwgMiksICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiIC8vIGwyCisgICAgICAgICJtb3ZxICglMCksICUlbW0xICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBsMAorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbDIKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH5sMi8yCisgICAgICAgIFBBVkdCKCUlbW0xLCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGwyICsgMmwwKS80CisgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KDVsMiArIDJsMCkvOAorCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IiAvLyBsMQorICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgMiksICUlbW0zICAgICAgICAgXG5cdCIgLy8gbDMKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGwxCisgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+bDEvMgorICAgICAgICBQQVZHQiglJW1tMywgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfihsMSArIDJsMykvNAorICAgICAgICBQQVZHQiglJW1tNCwgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfig1bDEgKyAybDMpLzgKKworICAgICAgICAibW92cSAlJW1tMCwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfig1bDIgKyAybDApLzgKKyAgICAgICAgInBzdWJ1c2IgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICUlbW00LCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG9yICUlbW0wLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfnwybDAgLSA1bDEgKyA1bDIgLSAybDN8LzgKKy8vIG1tMT0gfGxlbmVyZ3l8LCBtbTI9IGwyLCBtbTM9IGwzLCBtbTc9MAorCisgICAgICAgICJtb3ZxICglMCwgJTEsIDQpLCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IiAvLyBsNAorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbDQKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH5sNC8yCisgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGw0ICsgMmwyKS80CisgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KDVsNCArIDJsMikvOAorCisgICAgICAgICJtb3ZxICglJSJSRUdfYyIpLCAlJW1tMiAgICAgICAgICAgICAgICBcblx0IiAvLyBsNQorICAgICAgICAibW92cSAlJW1tMywgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbDMKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0zKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH5sMy8yCisgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGwzICsgMmw1KS80CisgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KDVsMyArIDJsNSkvOAorCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB+KDVsNCArIDJsMikvOAorICAgICAgICAicHN1YnVzYiAlJW1tMywgJSVtbTAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgJSVtbTYsICUlbW0zICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgJSVtbTAsICUlbW0zICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB+fDJsMiAtIDVsMyArIDVsNCAtIDJsNXwvOAorICAgICAgICAicGNtcGVxYiAlJW1tNywgJSVtbTAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gU0lHTigybDIgLSA1bDMgKyA1bDQgLSAybDUpCisvLyBtbTA9IFNJR04obWVuZXJneSksIG1tMT0gfGxlbmVyZ3l8LCBtbTI9IGw1LCBtbTM9IHxtZW5lcmd5fCwgbW00PWw0LCBtbTU9IGwzLCBtbTc9MAorCisgICAgICAgICJtb3ZxICglJSJSRUdfYyIsICUxKSwgJSVtbTYgICAgICAgICAgICBcblx0IiAvLyBsNgorICAgICAgICAibW92cSAlJW1tNiwgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbDYKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW02KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH5sNi8yCisgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tNikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGw2ICsgMmw0KS80CisgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tNikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KDVsNiArIDJsNCkvOAorCisgICAgICAgICJtb3ZxICglJSJSRUdfYyIsICUxLCAyKSwgJSVtbTUgICAgICAgICBcblx0IiAvLyBsNworICAgICAgICAibW92cSAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbDUKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0yKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH5sNS8yCisgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGw1ICsgMmw3KS80CisgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KDVsNSArIDJsNykvOAorCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB+KDVsNiArIDJsNCkvOAorICAgICAgICAicHN1YnVzYiAlJW1tMiwgJSVtbTYgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgJSVtbTQsICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgJSVtbTYsICUlbW0yICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB+fDJsNCAtIDVsNSArIDVsNiAtIDJsN3wvOAorLy8gbW0wPSBTSUdOKG1lbmVyZ3kpLCBtbTE9IHxsZW5lcmd5fC84LCBtbTI9IHxyZW5lcmd5fC84LCBtbTM9IHxtZW5lcmd5fC84LCBtbTc9MAorCisKKyAgICAgICAgUE1JTlVCKCUlbW0yLCAlJW1tMSwgJSVtbTQpICAgICAgICAgICAgICAgICAgIC8vIE1JTih8bGVuZXJneXwsfHJlbmVyZ3l8KS84CisgICAgICAgICJtb3ZxICUyLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBRUCAvL0ZJWE1FIFFQKzEgPworICAgICAgICAicGFkZHVzYiAiTUFOR0xFKGIwMSkiLCAlJW1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndGIgJSVtbTMsICUlbW00ICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHxtZW5lcmd5fC84IDwgUVAKKyAgICAgICAgInBzdWJ1c2IgJSVtbTEsICUlbW0zICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGQ9fG1lbmVyZ3l8LzgtTUlOKHxsZW5lcmd5fCx8cmVuZXJneXwpLzgKKyAgICAgICAgInBhbmQgJSVtbTQsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisvLyAgICAgICAgInBzdWJ1c2IgIk1BTkdMRShiMDEpIiwgJSVtbTMgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tMykKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0zKQorICAgICAgICAicGFkZHVzYiAlJW1tMSwgJSVtbTMgICAgICAgICAgICAgICAgICAgXG5cdCIKKy8vICAgICAgICAicGFkZHVzYiAiTUFOR0xFKGIwMSkiLCAlJW1tMyAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgMiksICUlbW02ICAgICAgICAgXG5cdCIgLy9sMworICAgICAgICAibW92cSAoJTAsICUxLCA0KSwgJSVtbTUgICAgICAgICAgICAgICAgXG5cdCIgLy9sNAorICAgICAgICAibW92cSAoJTAsICUxLCA0KSwgJSVtbTQgICAgICAgICAgICAgICAgXG5cdCIgLy9sNAorICAgICAgICAicHN1YnVzYiAlJW1tNiwgJSVtbTUgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgJSVtbTQsICUlbW02ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgJSVtbTYsICUlbW01ICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8bDMtbDR8CisgICAgICAgICJwY21wZXFiICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBTSUdOKGwzLWw0KQorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmQgJSVtbTAsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBNSU5VQiglJW1tNSwgJSVtbTMsICUlbW0wKQorCisgICAgICAgICJwc3VidXNiICJNQU5HTEUoYjAxKSIsICUlbW0zICAgICAgICAgICBcblx0IgorICAgICAgICBQQVZHQiglJW1tNywgJSVtbTMpCisKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMCAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglMCwgJTEsIDQpLCAlJW1tMiAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViYiAlJW1tMywgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTMsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJweG9yICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgKCUlIlJFR19hIiwgJTEsIDIpICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICglMCwgJTEsIDQpICAgICAgICAgICAgICAgIFxuXHQiCisjZW5kaWYgLy8wCisKKyAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFiICUlbW02LCAlJW1tNiAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAtMQorLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcKKy8vICAgICAgJTAgICAgICAlMCslMSAgICUwKzIlMSAgZWF4KzIlMSAlMCs0JTEgIGVheCs0JTEgZWN4KyUxICBlY3grMiUxCisvLyAgICAgICUwICAgICAgZWF4ICAgICBlYXgrJTEgIGVheCsyJTEgJTArNCUxICBlY3ggICAgIGVjeCslMSAgZWN4KzIlMQorCisKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMSAgICAgICAgIFxuXHQiIC8vIGwzCisgICAgICAgICJtb3ZxICglMCwgJTEsIDQpLCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IiAvLyBsNAorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gLWwzLTEKKyAgICAgICAgUEFWR0IoJSVtbTEsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC1xKzEyOCA9IChsNC1sMysyNTYpLzIKKy8vIG1tMT0tbDMtMSwgbW0wPTEyOC1xCisKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJW1tMiAgICAgICAgIFxuXHQiIC8vIGw1CisgICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxKSwgJSVtbTMgICAgICAgICAgICBcblx0IiAvLyBsMgorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gLWw1LTEKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW01ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIC1sNS0xCisgICAgICAgICJtb3ZxICJNQU5HTEUoYjgwKSIsICUlbW00ICAgICAgICAgICAgICBcblx0IiAvLyAxMjgKKyAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMSwgNCksICUlIlJFR19jIiAgICAgIFxuXHQiCisgICAgICAgIFBBVkdCKCUlbW0zLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAobDItbDUrMjU2KS8yCisgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGw0LWwzKS80ICsgMTI4CisgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGwyLWw1KS80ICsobDQtbDMpLzggKyAxMjgKKyAgICAgICAgUEFWR0IoJSVtbTAsICUlbW00KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH4obDItbDUpLzggKzUobDQtbDMpLzE2ICsgMTI4CisvLyBtbTE9LWwzLTEsIG1tMD0xMjgtcSwgbW0zPWwyLCBtbTQ9bWVuZXJneS8xNiArIDEyOCwgbW01PSAtbDUtMQorCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIpLCAlJW1tMiAgICAgICAgICAgICAgICBcblx0IiAvLyBsMQorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gLWwxLTEKKyAgICAgICAgUEFWR0IoJSVtbTMsICUlbW0yKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChsMi1sMSsyNTYpLzIKKyAgICAgICAgUEFWR0IoKCUwKSwgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChsMC1sMysyNTYpLzIKKyAgICAgICAgIm1vdnEgIk1BTkdMRShiODApIiwgJSVtbTMgICAgICAgICAgICAgIFxuXHQiIC8vIDEyOAorICAgICAgICBQQVZHQiglJW1tMiwgJSVtbTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfihsMi1sMSkvNCArIDEyOAorICAgICAgICBQQVZHQiglJW1tMSwgJSVtbTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfihsMC1sMykvNCArKGwyLWwxKS84ICsgMTI4CisgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGwwLWwzKS84ICs1KGwyLWwxKS8xNiArIDEyOAorLy8gbW0wPTEyOC1xLCBtbTM9bGVuZXJneS8xNiArIDEyOCwgbW00PSBtZW5lcmd5LzE2ICsgMTI4LCBtbTU9IC1sNS0xCisKKyAgICAgICAgUEFWR0IoKCUlUkVHYywgJTEpLCAlJW1tNSkgICAgICAgICAgICAgICAgICAgIC8vIChsNi1sNSsyNTYpLzIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19jIiwgJTEsIDIpLCAlJW1tMSAgICAgICAgIFxuXHQiIC8vIGw3CisgICAgICAgICJweG9yICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAtbDctMQorICAgICAgICBQQVZHQigoJTAsICUxLCA0KSwgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgLy8gKGw0LWw3KzI1NikvMgorICAgICAgICAibW92cSAiTUFOR0xFKGI4MCkiLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIgLy8gMTI4CisgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGw2LWw1KS80ICsgMTI4CisgICAgICAgIFBBVkdCKCUlbW0xLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGw0LWw3KS80ICsobDYtbDUpLzggKyAxMjgKKyAgICAgICAgUEFWR0IoJSVtbTUsICUlbW0yKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH4obDQtbDcpLzggKzUobDYtbDUpLzE2ICsgMTI4CisvLyBtbTA9MTI4LXEsIG1tMj1yZW5lcmd5LzE2ICsgMTI4LCBtbTM9bGVuZXJneS8xNiArIDEyOCwgbW00PSBtZW5lcmd5LzE2ICsgMTI4CisKKyAgICAgICAgIm1vdnEgIk1BTkdMRShiMDApIiwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiIC8vIDAKKyAgICAgICAgIm1vdnEgIk1BTkdMRShiMDApIiwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8vIDAKKyAgICAgICAgInBzdWJiICUlbW0yLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDEyOCAtIHJlbmVyZ3kvMTYKKyAgICAgICAgInBzdWJiICUlbW0zLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDEyOCAtIGxlbmVyZ3kvMTYKKyAgICAgICAgUE1BWFVCKCUlbW0xLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEyOCArIHxyZW5lcmd5LzE2fAorICAgICAgICBQTUFYVUIoJSVtbTUsICUlbW0zKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTI4ICsgfGxlbmVyZ3kvMTZ8CisgICAgICAgIFBNSU5VQiglJW1tMiwgJSVtbTMsICUlbW0xKSAgICAgICAgICAgICAgICAgICAvLyAxMjggKyBNSU4ofGxlbmVyZ3l8LHxyZW5lcmd5fCkvMTYKKworLy8gbW0wPTEyOC1xLCBtbTM9MTI4ICsgTUlOKHxsZW5lcmd5fCx8cmVuZXJneXwpLzE2LCBtbTQ9IG1lbmVyZ3kvMTYgKyAxMjgKKworICAgICAgICAibW92cSAiTUFOR0xFKGIwMCkiLCAlJW1tNyAgICAgICAgICAgICAgXG5cdCIgLy8gMAorICAgICAgICAibW92cSAlMiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gUVAKKyAgICAgICAgUEFWR0IoJSVtbTYsICUlbW0yKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEyOCArIFFQLzIKKyAgICAgICAgInBzdWJiICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3RiICUlbW03LCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBTSUdOKG1lbmVyZ3kpCisgICAgICAgICJweG9yICUlbW0xLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmIgJSVtbTEsICUlbW00ICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMTI4ICsgfG1lbmVyZ3l8LzE2CisgICAgICAgICJwY21wZ3RiICUlbW00LCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8bWVuZXJneXwvMTYgPCBRUC8yCisgICAgICAgICJwc3VidXNiICUlbW0zLCAlJW1tNCAgICAgICAgICAgICAgICAgICBcblx0IiAvL2Q9fG1lbmVyZ3l8LzE2IC0gTUlOKHxsZW5lcmd5fCx8cmVuZXJneXwpLzE2CisvLyBtbTA9MTI4LXEsIG1tMT0gU0lHTihtZW5lcmd5KSwgbW0yPSB8bWVuZXJneXwvMTYgPCBRUC8yLCBtbTQ9IGQvMTYKKworICAgICAgICAibW92cSAlJW1tNCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gZAorICAgICAgICAicHN1YnVzYiAiTUFOR0xFKGIwMSkiLCAlJW1tNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW00KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGQvMzIKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW00KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChkICsgMzIpLzY0CisgICAgICAgICJwYWRkYiAlJW1tMywgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyA1ZC82NAorICAgICAgICAicGFuZCAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAiTUFOR0xFKGI4MCkiLCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIgLy8gMTI4CisgICAgICAgICJwc3ViYiAlJW1tMCwgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBxCisgICAgICAgICJwYWRkc2IgJSVtbTYsICUlbW01ICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBmaXggYmFkIHJvdW5kaW5nCisgICAgICAgICJwY21wZ3RiICUlbW01LCAlJW1tNyAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBTSUdOKHEpCisgICAgICAgICJweG9yICUlbW03LCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIFBNSU5VQiglJW1tNSwgJSVtbTQsICUlbW0zKSAgICAgICAgICAgICAgICAgICAvLyBNSU4ofHF8LCA1ZC82NCkKKyAgICAgICAgInB4b3IgJSVtbTEsICUlbW03ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIFNJR04oZCpxKQorCisgICAgICAgICJwYW5kICUlbW03LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgMiksICUlbW0wICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUwLCAlMSwgNCksICUlbW0yICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJweG9yICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW00LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViYiAlJW1tNCwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAoJSUiUkVHX2EiLCAlMSwgMikgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgKCUwLCAlMSwgNCkgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6CisgICAgICAgIDogInIiIChzcmMpLCAiciIgKCh4ODZfcmVnKXN0cmlkZSksICJtIiAoYy0+cFFQYikKKyAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoYjgwLGIwMCxiMDEpCisgICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19jCisgICAgKTsKKworLyoKKyAgICB7CisgICAgaW50IHg7CisgICAgc3JjLT0gc3RyaWRlOworICAgIGZvcih4PTA7IHg8QkxPQ0tfU0laRTsgeCsrKXsKKyAgICAgICAgY29uc3QgaW50IG1pZGRsZUVuZXJneT0gNSooc3JjW2w1XSAtIHNyY1tsNF0pICsgMiooc3JjW2wzXSAtIHNyY1tsNl0pOworICAgICAgICBpZihGRkFCUyhtaWRkbGVFbmVyZ3kpPCA4KlFQKXsKKyAgICAgICAgICAgIGNvbnN0IGludCBxPShzcmNbbDRdIC0gc3JjW2w1XSkvMjsKKyAgICAgICAgICAgIGNvbnN0IGludCBsZWZ0RW5lcmd5PSAgNSooc3JjW2wzXSAtIHNyY1tsMl0pICsgMiooc3JjW2wxXSAtIHNyY1tsNF0pOworICAgICAgICAgICAgY29uc3QgaW50IHJpZ2h0RW5lcmd5PSA1KihzcmNbbDddIC0gc3JjW2w2XSkgKyAyKihzcmNbbDVdIC0gc3JjW2w4XSk7CisKKyAgICAgICAgICAgIGludCBkPSBGRkFCUyhtaWRkbGVFbmVyZ3kpIC0gRkZNSU4oIEZGQUJTKGxlZnRFbmVyZ3kpLCBGRkFCUyhyaWdodEVuZXJneSkgKTsKKyAgICAgICAgICAgIGQ9IEZGTUFYKGQsIDApOworCisgICAgICAgICAgICBkPSAoNSpkICsgMzIpID4+IDY7CisgICAgICAgICAgICBkKj0gRkZTSUdOKC1taWRkbGVFbmVyZ3kpOworCisgICAgICAgICAgICBpZihxPjApeworICAgICAgICAgICAgICAgIGQ9IGQ8MCA/IDAgOiBkOworICAgICAgICAgICAgICAgIGQ9IGQ+cSA/IHEgOiBkOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgZD0gZD4wID8gMCA6IGQ7CisgICAgICAgICAgICAgICAgZD0gZDxxID8gcSA6IGQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNyY1tsNF0tPSBkOworICAgICAgICAgICAgc3JjW2w1XSs9IGQ7CisgICAgICAgIH0KKyAgICAgICAgc3JjKys7CisgICAgfQorICAgIHNyYy09ODsKKyAgICBmb3IoeD0wOyB4PDg7IHgrKyl7CisgICAgICAgIGludCB5OworICAgICAgICBmb3IoeT00OyB5PDY7IHkrKyl7CisgICAgICAgICAgICBpbnQgZD0gc3JjW3greSpzdHJpZGVdIC0gdG1wW3grKHktNCkqOF07CisgICAgICAgICAgICBpbnQgYWQ9IEZGQUJTKGQpOworICAgICAgICAgICAgc3RhdGljIGludCBtYXg9MDsKKyAgICAgICAgICAgIHN0YXRpYyBpbnQgc3VtPTA7CisgICAgICAgICAgICBzdGF0aWMgaW50IG51bT0wOworICAgICAgICAgICAgc3RhdGljIGludCBiaWFzPTA7CisKKyAgICAgICAgICAgIGlmKG1heDxhZCkgbWF4PWFkOworICAgICAgICAgICAgc3VtKz0gYWQ+MyA/IDEgOiAwOworICAgICAgICAgICAgaWYoYWQ+Myl7CisgICAgICAgICAgICAgICAgc3JjWzBdID0gc3JjWzddID0gc3JjW3N0cmlkZSo3XSA9IHNyY1soc3RyaWRlKzEpKjddPTI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHk9PTQpIGJpYXMrPWQ7CisgICAgICAgICAgICBudW0rKzsKKyAgICAgICAgICAgIGlmKG51bSUxMDAwMDAwID09IDApeworICAgICAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfSU5GTywgIiAlZCAlZCAlZCAlZFxuIiwgbnVtLCBzdW0sIG1heCwgYmlhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisqLworI2VsaWYgVEVNUExBVEVfUFBfTU1YCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCB0bXApWzRdOyAvLyBtYWtlIHNwYWNlIGZvciA0IDgtYnl0ZSB2YXJzCisgICAgc3JjKz0gc3RyaWRlKjQ7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisvLyAgICAgIDAgICAgICAgMSAgICAgICAyICAgICAgIDMgICAgICAgNCAgICAgICA1ICAgICAgIDYgICAgICAgNworLy8gICAgICAlMCAgICAgICUwKyUxICAgJTArMiUxICBlYXgrMiUxICUwKzQlMSAgZWF4KzQlMSBlZHgrJTEgIGVkeCsyJTEKKy8vICAgICAgJTAgICAgICBlYXggICAgIGVheCslMSAgZWF4KzIlMSAlMCs0JTEgIGVkeCAgICAgZWR4KyUxICBlZHgrMiUxCisKKyAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMCAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbG93IHBhcnQgb2YgbGluZSAwCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICBcblx0IiAvLyBoaWdoIHBhcnQgb2YgbGluZSAwCisKKyAgICAgICAgIm1vdnEgKCUwLCAlMSksICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUwLCAlMSwgMiksICUlIlJFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTIgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGxvdyBwYXJ0IG9mIGxpbmUgMQorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMyAgICAgICAgICAgICAgICAgXG5cdCIgLy8gaGlnaCBwYXJ0IG9mIGxpbmUgMQorCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIpLCAlJW1tNCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTQgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGxvdyBwYXJ0IG9mIGxpbmUgMgorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tNSAgICAgICAgICAgICAgICAgXG5cdCIgLy8gaGlnaCBwYXJ0IG9mIGxpbmUgMgorCisgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDAKKyAgICAgICAgInBhZGR3ICUlbW0xLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMAorICAgICAgICAicHN1YncgJSVtbTQsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEgLSBMMgorICAgICAgICAicHN1YncgJSVtbTUsICUlbW0zICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gSDEgLSBIMgorICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkwwIC0gTDEgKyBMMgorICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkgwIC0gSDEgKyBIMgorCisgICAgICAgICJwc2xsdyAkMiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyA0TDEgLSA0TDIKKyAgICAgICAgInBzbGx3ICQyLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDRIMSAtIDRIMgorICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkwwIC0gNUwxICsgNUwyCisgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDAgLSA1SDEgKyA1SDIKKworICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSksICUlbW0yICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMworICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMyAgICAgICAgICAgICAgICAgXG5cdCIgLy8gSDMKKworICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkwwIC0gNUwxICsgNUwyIC0gTDMKKyAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMCAtIDVIMSArIDVIMiAtIEgzCisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDAgLSA1TDEgKyA1TDIgLSAyTDMKKyAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMCAtIDVIMSArIDVIMiAtIDJIMworICAgICAgICAibW92cSAlJW1tMCwgKCUzKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkwwIC0gNUwxICsgNUwyIC0gMkwzCisgICAgICAgICJtb3ZxICUlbW0xLCA4KCUzKSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDAgLSA1SDEgKyA1SDIgLSAySDMKKworICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgMiksICUlbW0wICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0wICAgICAgICAgICAgICAgICBcblx0IiAvLyBMNAorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMSAgICAgICAgICAgICAgICAgXG5cdCIgLy8gSDQKKworICAgICAgICAicHN1YncgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDMgLSBMNAorICAgICAgICAicHN1YncgJSVtbTEsICUlbW0zICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gSDMgLSBINAorICAgICAgICAibW92cSAlJW1tMiwgMTYoJTMpICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDMgLSBMNAorICAgICAgICAibW92cSAlJW1tMywgMjQoJTMpICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gSDMgLSBINAorICAgICAgICAicGFkZHcgJSVtbTQsICUlbW00ICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkwyCisgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDIKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMMiAtIEwzICsgTDQKKyAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMiAtIEgzICsgSDQKKworICAgICAgICAibGVhICglJSJSRUdfYSIsICUxKSwgJTAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzbGx3ICQyLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDRMMyAtIDRMNAorICAgICAgICAicHNsbHcgJDIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gNEgzIC0gNEg0CisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDIgLSA1TDMgKyA1TDQKKyAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMiAtIDVIMyArIDVINAorLy81MCBvcGNvZGVzIHNvIGZhcgorICAgICAgICAibW92cSAoJTAsICUxLCAyKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IiAvLyBMNQorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMyAgICAgICAgICAgICAgICAgXG5cdCIgLy8gSDUKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMMiAtIDVMMyArIDVMNCAtIEw1CisgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDIgLSA1SDMgKyA1SDQgLSBINQorICAgICAgICAicHN1YncgJSVtbTIsICUlbW00ICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkwyIC0gNUwzICsgNUw0IC0gMkw1CisgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDIgLSA1SDMgKyA1SDQgLSAySDUKKworICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgNCksICUlbW02ICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw2CisgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMNSAtIEw2CisgICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxLCA0KSwgJSVtbTYgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgXG5cdCIgLy8gSDYKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMyAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEg1IC0gSDYKKworICAgICAgICAicGFkZHcgJSVtbTAsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkw0CisgICAgICAgICJwYWRkdyAlJW1tMSwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDQKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMNCAtIEw1ICsgTDYKKyAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJINCAtIEg1ICsgSDYKKworICAgICAgICAicHNsbHcgJDIsICUlbW0yICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gNEw1IC0gNEw2CisgICAgICAgICJwc2xsdyAkMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyA0SDUgLSA0SDYKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMNCAtIDVMNSArIDVMNgorICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkg0IC0gNUg1ICsgNUg2CisKKyAgICAgICAgIm1vdnEgKCUwLCAlMSwgNCksICUlbW0yICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDcKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEg3CisKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMNworICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0zICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkg3CisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDQgLSA1TDUgKyA1TDYgLSAyTDcKKyAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJINCAtIDVINSArIDVINiAtIDJINworCisgICAgICAgICJtb3ZxICglMyksICUlbW0yICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDAgLSA1TDEgKyA1TDIgLSAyTDMKKyAgICAgICAgIm1vdnEgOCglMyksICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMCAtIDVIMSArIDVIMiAtIDJIMworCisjaWYgVEVNUExBVEVfUFBfTU1YRVhUCisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICJwc3VidyAlJW1tMCwgJSVtbTYgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1heHN3ICUlbW02LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfDJMNCAtIDVMNSArIDVMNiAtIDJMN3wKKyAgICAgICAgIm1vdnEgJSVtbTcsICUlbW02ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDAKKyAgICAgICAgInBzdWJ3ICUlbW0xLCAlJW1tNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWF4c3cgJSVtbTYsICUlbW0xICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8Mkg0IC0gNUg1ICsgNUg2IC0gMkg3fAorICAgICAgICAibW92cSAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMAorICAgICAgICAicHN1YncgJSVtbTIsICUlbW02ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtYXhzdyAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHwyTDAgLSA1TDEgKyA1TDIgLSAyTDN8CisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTYgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1heHN3ICUlbW02LCAlJW1tMyAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfDJIMCAtIDVIMSArIDVIMiAtIDJIM3wKKyNlbHNlCisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICJwY21wZ3R3ICUlbW0wLCAlJW1tNiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHwyTDQgLSA1TDUgKyA1TDYgLSAyTDd8CisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICJwY21wZ3R3ICUlbW0xLCAlJW1tNiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHwySDQgLSA1SDUgKyA1SDYgLSAySDd8CisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICJwY21wZ3R3ICUlbW0yLCAlJW1tNiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHwyTDAgLSA1TDEgKyA1TDIgLSAyTDN8CisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICJwY21wZ3R3ICUlbW0zLCAlJW1tNiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tNiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMyAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHwySDAgLSA1SDEgKyA1SDIgLSAySDN8CisjZW5kaWYKKworI2lmIFRFTVBMQVRFX1BQX01NWEVYVAorICAgICAgICAicG1pbnN3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtaW5zdyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZWxzZQorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c3cgJSVtbTIsICUlbW02ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMSwgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c3cgJSVtbTMsICUlbW02ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmCisKKyAgICAgICAgIm1vdmQgJTIsICUlbW0yICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIFFQCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICJwY21wZ3R3ICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBzaWduKDJMMiAtIDVMMyArIDVMNCAtIDJMNSkKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8MkwyIC0gNUwzICsgNUw0IC0gMkw1fAorICAgICAgICAicGNtcGd0dyAlJW1tNSwgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gc2lnbigySDIgLSA1SDMgKyA1SDQgLSAySDUpCisgICAgICAgICJweG9yICUlbW03LCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YncgJSVtbTcsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfDJIMiAtIDVIMyArIDVINCAtIDJINXwKKy8vIDEwMCBvcGNvZGVzCisgICAgICAgICJwc2xsdyAkMywgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyA4UVAKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDhRUAorICAgICAgICAicGNtcGd0dyAlJW1tNCwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndHcgJSVtbTUsICUlbW0zICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYW5kICUlbW0yLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFuZCAlJW1tMywgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworCisgICAgICAgICJwc3VidXN3ICUlbW0wLCAlJW1tNCAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBoZAorICAgICAgICAicHN1YnVzdyAlJW1tMSwgJSVtbTUgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbGQKKworCisgICAgICAgICJtb3ZxICJNQU5HTEUodzA1KSIsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvLyA1CisgICAgICAgICJwbXVsbHcgJSVtbTIsICUlbW00ICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGx3ICUlbW0yLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgIk1BTkdMRSh3MjApIiwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8vIDMyCisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTIsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmx3ICQ2LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsdyAkNiwgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxIDE2KCUzKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMyAtIEw0CisgICAgICAgICJtb3ZxIDI0KCUzKSwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBIMyAtIEg0CisKKyAgICAgICAgInB4b3IgJSVtbTIsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJweG9yICUlbW0zLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwY21wZ3R3ICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBzaWduIChMMy1MNCkKKyAgICAgICAgInBjbXBndHcgJSVtbTEsICUlbW0zICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHNpZ24gKEgzLUg0KQorICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8TDMtTDR8CisgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8SDMtSDR8CisgICAgICAgICJwc3JsdyAkMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8TDMgLSBMNHwvMgorICAgICAgICAicHNybHcgJDEsICUlbW0xICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfEgzIC0gSDR8LzIKKworICAgICAgICAicHhvciAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYW5kICUlbW0yLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFuZCAlJW1tMywgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2lmIFRFTVBMQVRFX1BQX01NWEVYVAorICAgICAgICAicG1pbnN3ICUlbW0wLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtaW5zdyAlJW1tMSwgJSVtbTUgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZWxzZQorICAgICAgICAibW92cSAlJW1tNCwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c3cgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c3cgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmCisgICAgICAgICJweG9yICUlbW02LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tNywgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAlJW1tNywgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3Nzd2IgJSVtbTUsICUlbW00ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAgICUlbW00LCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgKCUwKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUwLCAlMSksICUlbW0wICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViYiAlJW1tNCwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgKCUwLCAlMSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6ICIrciIgKHNyYykKKyAgICAgICAgOiAiciIgKCh4ODZfcmVnKXN0cmlkZSksICJtIiAoYy0+cFFQYiksICJyIih0bXApCisgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKHcwNSx3MjApCisgICAgICAgIDogIiUiUkVHX2EKKyAgICApOworI2Vsc2UgLy9URU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cKKyAgICBjb25zdCBpbnQgbDE9IHN0cmlkZTsKKyAgICBjb25zdCBpbnQgbDI9IHN0cmlkZSArIGwxOworICAgIGNvbnN0IGludCBsMz0gc3RyaWRlICsgbDI7CisgICAgY29uc3QgaW50IGw0PSBzdHJpZGUgKyBsMzsKKyAgICBjb25zdCBpbnQgbDU9IHN0cmlkZSArIGw0OworICAgIGNvbnN0IGludCBsNj0gc3RyaWRlICsgbDU7CisgICAgY29uc3QgaW50IGw3PSBzdHJpZGUgKyBsNjsKKyAgICBjb25zdCBpbnQgbDg9IHN0cmlkZSArIGw3OworLy8gICAgY29uc3QgaW50IGw5PSBzdHJpZGUgKyBsODsKKyAgICBpbnQgeDsKKyAgICBzcmMrPSBzdHJpZGUqMzsKKyAgICBmb3IoeD0wOyB4PEJMT0NLX1NJWkU7IHgrKyl7CisgICAgICAgIGNvbnN0IGludCBtaWRkbGVFbmVyZ3k9IDUqKHNyY1tsNV0gLSBzcmNbbDRdKSArIDIqKHNyY1tsM10gLSBzcmNbbDZdKTsKKyAgICAgICAgaWYoRkZBQlMobWlkZGxlRW5lcmd5KSA8IDgqYy0+UVApeworICAgICAgICAgICAgY29uc3QgaW50IHE9KHNyY1tsNF0gLSBzcmNbbDVdKS8yOworICAgICAgICAgICAgY29uc3QgaW50IGxlZnRFbmVyZ3k9ICA1KihzcmNbbDNdIC0gc3JjW2wyXSkgKyAyKihzcmNbbDFdIC0gc3JjW2w0XSk7CisgICAgICAgICAgICBjb25zdCBpbnQgcmlnaHRFbmVyZ3k9IDUqKHNyY1tsN10gLSBzcmNbbDZdKSArIDIqKHNyY1tsNV0gLSBzcmNbbDhdKTsKKworICAgICAgICAgICAgaW50IGQ9IEZGQUJTKG1pZGRsZUVuZXJneSkgLSBGRk1JTiggRkZBQlMobGVmdEVuZXJneSksIEZGQUJTKHJpZ2h0RW5lcmd5KSApOworICAgICAgICAgICAgZD0gRkZNQVgoZCwgMCk7CisKKyAgICAgICAgICAgIGQ9ICg1KmQgKyAzMikgPj4gNjsKKyAgICAgICAgICAgIGQqPSBGRlNJR04oLW1pZGRsZUVuZXJneSk7CisKKyAgICAgICAgICAgIGlmKHE+MCl7CisgICAgICAgICAgICAgICAgZCA9IEZGTUFYKGQsIDApOworICAgICAgICAgICAgICAgIGQgPSBGRk1JTihkLCBxKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGQgPSBGRk1JTihkLCAwKTsKKyAgICAgICAgICAgICAgICBkID0gRkZNQVgoZCwgcSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNyY1tsNF0tPSBkOworICAgICAgICAgICAgc3JjW2w1XSs9IGQ7CisgICAgICAgIH0KKyAgICAgICAgc3JjKys7CisgICAgfQorI2VuZGlmIC8vVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCit9CisjZW5kaWYgLy9URU1QTEFURV9QUF9BTFRJVkVDCisKKyNpZiAhVEVNUExBVEVfUFBfQUxUSVZFQworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRShkZXJpbmcpKHVpbnQ4X3Qgc3JjW10sIGludCBzdHJpZGUsIFBQQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFXzdSRUdTICYmIChURU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cpCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCB0bXApWzNdOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJweG9yICUlbW02LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGVxYiAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTYsICUlbW0wICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHcgJDEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICUlbW03LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXN3YiAlJW1tMCwgJSVtbTAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgJTMgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibGVhICglMCwgJTEpLCAlJSJSRUdfYSIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMSwgNCksICUlIlJFR19kIiAgICAgIFxuXHQiCisKKy8vICAgICAgICAwICAgICAgICAxICAgICAgICAyICAgICAgICAzICAgICAgICA0ICAgICAgICA1ICAgICAgICA2ICAgICAgICA3ICAgICAgICA4ICAgICAgICA5CisvLyAgICAgICAgJTAgICAgICAgIGVheCAgICAgICAgZWF4KyUxICAgICAgICBlYXgrMiUxICAgICAgICAlMCs0JTEgICAgICAgIGVkeCAgICAgICAgZWR4KyUxICAgICAgICBlZHgrMiUxICAgICAgICAlMCs4JTEgICAgICAgIGVkeCs0JTEKKworI3VuZGVmIFJFQUxfRklORF9NSU5fTUFYCisjdW5kZWYgRklORF9NSU5fTUFYCisjaWYgVEVNUExBVEVfUFBfTU1YRVhUCisjZGVmaW5lIFJFQUxfRklORF9NSU5fTUFYKGFkZHIpXAorICAgICAgICAibW92cSAiICNhZGRyICIsICUlbW0wICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwbWludWIgJSVtbTAsICUlbW03ICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtYXh1YiAlJW1tMCwgJSVtbTYgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZWxzZQorI2RlZmluZSBSRUFMX0ZJTkRfTUlOX01BWChhZGRyKVwKKyAgICAgICAgIm1vdnEgIiAjYWRkciAiLCAlJW1tMCAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tNywgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3VidXNiICUlbW0wLCAlJW1tNiAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGRiICUlbW0wLCAlJW1tNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YnVzYiAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3ViYiAlJW1tMSwgJSVtbTcgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmCisjZGVmaW5lIEZJTkRfTUlOX01BWChhZGRyKSAgUkVBTF9GSU5EX01JTl9NQVgoYWRkcikKKworRklORF9NSU5fTUFYKCglJVJFR2EpKQorRklORF9NSU5fTUFYKCglJVJFR2EsICUxKSkKK0ZJTkRfTUlOX01BWCgoJSVSRUdhLCAlMSwgMikpCitGSU5EX01JTl9NQVgoKCUwLCAlMSwgNCkpCitGSU5EX01JTl9NQVgoKCUlUkVHZCkpCitGSU5EX01JTl9NQVgoKCUlUkVHZCwgJTEpKQorRklORF9NSU5fTUFYKCglJVJFR2QsICUxLCAyKSkKK0ZJTkRfTUlOX01BWCgoJTAsICUxLCA4KSkKKworICAgICAgICAibW92cSAlJW1tNywgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxxICQ4LCAlJW1tNyAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjaWYgVEVNUExBVEVfUFBfTU1YRVhUCisgICAgICAgICJwbWludWIgJSVtbTQsICUlbW03ICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBtaW4gb2YgcGl4ZWxzCisgICAgICAgICJwc2h1ZncgJDB4RjksICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1pbnViICUlbW00LCAlJW1tNyAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbWluIG9mIHBpeGVscworICAgICAgICAicHNodWZ3ICQweEZFLCAlJW1tNywgJSVtbTQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtaW51YiAlJW1tNCwgJSVtbTcgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZWxzZQorICAgICAgICAibW92cSAlJW1tNywgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgJSVtbTQsICUlbW0xICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViYiAlJW1tMSwgJSVtbTcgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNywgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxxICQxNiwgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAlJW1tNCwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJiICUlbW0xLCAlJW1tNyAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDMyLCAlJW1tNyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICUlbW00LCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmIgJSVtbTEsICUlbW03ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbmRpZgorCisKKyAgICAgICAgIm1vdnEgJSVtbTYsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JscSAkOCwgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2lmIFRFTVBMQVRFX1BQX01NWEVYVAorICAgICAgICAicG1heHViICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbWF4IG9mIHBpeGVscworICAgICAgICAicHNodWZ3ICQweEY5LCAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtYXh1YiAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZncgJDB4RkUsICUlbW02LCAlJW1tNCAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1heHViICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbHNlCisgICAgICAgICJwc3VidXNiICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTQsICUlbW02ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTYsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JscSAkMTYsICUlbW02ICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDMyLCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgJSVtbTQsICUlbW02ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBtYXgKKyAgICAgICAgInBzdWJiICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIG1heCAtIG1pbgorICAgICAgICAicHVzaCAlNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW02LCAlazQgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiY21wYiAiTUFOR0xFKGRlcmluZ1RocmVzaG9sZCkiLCAlYjQgICAgXG5cdCIKKyAgICAgICAgInBvcCAlNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiIGpiIDFmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUEFWR0IoJSVtbTAsICUlbW03KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGE9KG1heCArIG1pbikvMgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tNywgKCU0KSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAoJTApLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEwCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMTAKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwxMAorICAgICAgICAicHNsbHEgJDgsICUlbW0xICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxxICQ4LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkIC00KCUwKSwgJSVtbTMgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCA4KCUwKSwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxxICQyNCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2xscSAkNTYsICUlbW00ICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG9yICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDAwCisgICAgICAgICJwb3IgJSVtbTQsICUlbW0yICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMjAKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwwMAorICAgICAgICBQQVZHQiglJW1tMiwgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKEwyMCArIEwwMCkvMgorICAgICAgICBQQVZHQiglJW1tMCwgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKEwyMCArIEwwMCArIDJMMTApLzQKKyAgICAgICAgInBzdWJ1c2IgJSVtbTcsICUlbW0wICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAlJW1tNywgJSVtbTMgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcWIgIk1BTkdMRShiMDApIiwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8vIEwxMCA+IGEgPyAwIDogLTEKKyAgICAgICAgInBjbXBlcWIgIk1BTkdMRShiMDApIiwgJSVtbTIgICAgICAgICAgIFxuXHQiIC8vIEwyMCA+IGEgPyAwIDogLTEKKyAgICAgICAgInBjbXBlcWIgIk1BTkdMRShiMDApIiwgJSVtbTMgICAgICAgICAgIFxuXHQiIC8vIEwwMCA+IGEgPyAwIDogLTEKKyAgICAgICAgInBhZGRiICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tMywgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIpLCAlJW1tMiAgICAgICAgICAgICAgICBcblx0IiAvLyBMMTEKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwxMQorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDExCisgICAgICAgICJwc2xscSAkOCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDgsICUlbW00ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgLTQoJSUiUkVHX2EiKSwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkIDgoJSUiUkVHX2EiKSwgJSVtbTYgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDI0LCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzbGxxICQ1NiwgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgJSVtbTUsICUlbW0zICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMDEKKyAgICAgICAgInBvciAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwyMQorICAgICAgICAibW92cSAlJW1tMywgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDAxCisgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoTDIxICsgTDAxKS8yCisgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoTDIxICsgTDAxICsgMkwxMSkvNAorICAgICAgICAicHN1YnVzYiAlJW1tNywgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgJSVtbTcsICUlbW00ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICUlbW03LCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGVxYiAiTUFOR0xFKGIwMCkiLCAlJW1tMiAgICAgICAgICAgXG5cdCIgLy8gTDExID4gYSA/IDAgOiAtMQorICAgICAgICAicGNtcGVxYiAiTUFOR0xFKGIwMCkiLCAlJW1tNCAgICAgICAgICAgXG5cdCIgLy8gTDIxID4gYSA/IDAgOiAtMQorICAgICAgICAicGNtcGVxYiAiTUFOR0xFKGIwMCkiLCAlJW1tNSAgICAgICAgICAgXG5cdCIgLy8gTDAxID4gYSA/IDAgOiAtMQorICAgICAgICAicGFkZGIgJSVtbTQsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW01LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisvLyAwLCAyLCAzLCAxCisjZGVmaW5lIFJFQUxfREVSSU5HX0NPUkUoZHN0LHNyYyxwcHN4LHBzeCxzeCxwcGx4LHBseCxseCx0MCx0MSkgXAorICAgICAgICAibW92cSAiICNzcmMgIiwgIiAjc3ggIiAgICAgICAgICAgICAgICAgXG5cdCIgLyogc3JjWzBdICovXAorICAgICAgICAibW92cSAiICNzeCAiLCAiICNseCAiICAgICAgICAgICAgICAgICAgXG5cdCIgLyogc3JjWzBdICovXAorICAgICAgICAibW92cSAiICNzeCAiLCAiICN0MCAiICAgICAgICAgICAgICAgICAgXG5cdCIgLyogc3JjWzBdICovXAorICAgICAgICAicHNsbHEgJDgsICIgI2x4ICIgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JscSAkOCwgIiAjdDAgIiAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmQgLTQiICNzcmMgIiwgIiAjdDEgIiAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHNybHEgJDI0LCAiICN0MSAiICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwb3IgIiAjdDEgIiwgIiAjbHggIiAgICAgICAgICAgICAgICAgICBcblx0IiAvKiBzcmNbLTFdICovXAorICAgICAgICAibW92ZCA4IiAjc3JjICIsICIgI3QxICIgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc2xscSAkNTYsICIgI3QxICIgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBvciAiICN0MSAiLCAiICN0MCAiICAgICAgICAgICAgICAgICAgIFxuXHQiIC8qIHNyY1srMV0gKi9cCisgICAgICAgICJtb3ZxICIgI2x4ICIsICIgI3QxICIgICAgICAgICAgICAgICAgICBcblx0IiAvKiBzcmNbLTFdICovXAorICAgICAgICBQQVZHQih0MCwgbHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKHNyY1stMV0gKyBzcmNbKzFdKS8yICovXAorICAgICAgICBQQVZHQihzeCwgbHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKHNyY1stMV0gKyAyc3JjWzBdICsgc3JjWysxXSkvNCAqL1wKKyAgICAgICAgUEFWR0IobHgsIHBwbHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgIiAjbHggIiwgOCglNCkgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAoJTQpLCAiICNseCAiICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3VidXNiICIgI2x4ICIsICIgI3QxICIgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ1c2IgIiAjbHggIiwgIiAjdDAgIiAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YnVzYiAiICNseCAiLCAiICNzeCAiICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICJNQU5HTEUoYjAwKSIsICIgI2x4ICIgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBjbXBlcWIgIiAjbHggIiwgIiAjdDEgIiAgICAgICAgICAgICAgIFxuXHQiIC8qIHNyY1stMV0gPiBhID8gMCA6IC0xKi9cCisgICAgICAgICJwY21wZXFiICIgI2x4ICIsICIgI3QwICIgICAgICAgICAgICAgICBcblx0IiAvKiBzcmNbKzFdID4gYSA/IDAgOiAtMSovXAorICAgICAgICAicGNtcGVxYiAiICNseCAiLCAiICNzeCAiICAgICAgICAgICAgICAgXG5cdCIgLyogc3JjWzBdICA+IGEgPyAwIDogLTEqL1wKKyAgICAgICAgInBhZGRiICIgI3QxICIsICIgI3QwICIgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZGIgIiAjdDAgIiwgIiAjc3ggIiAgICAgICAgICAgICAgICAgXG5cdCJcCitcCisgICAgICAgIFBBVkdCKHBseCwgcHBseCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWx0ZXJlZCAqL1wKKyAgICAgICAgIm1vdnEgIiAjZHN0ICIsICIgI3QwICIgICAgICAgICAgICAgICAgIFxuXHQiIC8qIGRzdCAqL1wKKyAgICAgICAgIm1vdnEgIiAjdDAgIiwgIiAjdDEgIiAgICAgICAgICAgICAgICAgIFxuXHQiIC8qIGRzdCAqL1wKKyAgICAgICAgInBzdWJ1c2IgJTMsICIgI3QwICIgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHVzYiAlMywgIiAjdDEgIiAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgIFBNQVhVQih0MCwgcHBseClcCisgICAgICAgIFBNSU5VQih0MSwgcHBseCwgdDApXAorICAgICAgICAicGFkZGIgIiAjc3ggIiwgIiAjcHBzeCAiICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWRkYiAiICNwc3ggIiwgIiAjcHBzeCAiICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIiNwYWRkYiAiTUFOR0xFKGIwMikiLCAiICNwcHN4ICIgICAgICAgIFxuXHQiXAorICAgICAgICAicGFuZCAiTUFOR0xFKGIwOCkiLCAiICNwcHN4ICIgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwY21wZXFiICIgI2x4ICIsICIgI3Bwc3ggIiAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhbmQgIiAjcHBzeCAiLCAiICNwcGx4ICIgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFuZG4gIiAjZHN0ICIsICIgI3Bwc3ggIiAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwb3IgIiAjcHBseCAiLCAiICNwcHN4ICIgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjcHBzeCAiLCAiICNkc3QgIiAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSA4KCU0KSwgIiAjbHggIiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBERVJJTkdfQ09SRShkc3Qsc3JjLHBwc3gscHN4LHN4LHBwbHgscGx4LGx4LHQwLHQxKSBcCisgICBSRUFMX0RFUklOR19DT1JFKGRzdCxzcmMscHBzeCxwc3gsc3gscHBseCxwbHgsbHgsdDAsdDEpCisvKgorMDAwMDAwMAorMTExMTExMQorCisxMTExMTEwCisxMTExMTAxCisxMTExMTAwCisxMTExMDExCisxMTExMDEwCisxMTExMDAxCisKKzExMTEwMDAKKzExMTAxMTEKKworKi8KKy8vREVSSU5HX0NPUkUoZHN0ICAgICAgICAgICxzcmMgICAgICAgICAgICAscHBzeCAscHN4ICAsc3ggICAscHBseCAscGx4ICAsbHggICAsdDAgICAsdDEpCitERVJJTkdfQ09SRSgoJSVSRUdhKSAgICAgICAsKCUlUkVHYSwgJTEpICAgLCUlbW0wLCUlbW0yLCUlbW00LCUlbW0xLCUlbW0zLCUlbW01LCUlbW02LCUlbW03KQorREVSSU5HX0NPUkUoKCUlUkVHYSwgJTEpICAgLCglJVJFR2EsICUxLCAyKSwlJW1tMiwlJW1tNCwlJW1tMCwlJW1tMywlJW1tNSwlJW1tMSwlJW1tNiwlJW1tNykKK0RFUklOR19DT1JFKCglJVJFR2EsICUxLCAyKSwoJTAsICUxLCA0KSAgICAsJSVtbTQsJSVtbTAsJSVtbTIsJSVtbTUsJSVtbTEsJSVtbTMsJSVtbTYsJSVtbTcpCitERVJJTkdfQ09SRSgoJTAsICUxLCA0KSAgICAsKCUlUkVHZCkgICAgICAgLCUlbW0wLCUlbW0yLCUlbW00LCUlbW0xLCUlbW0zLCUlbW01LCUlbW02LCUlbW03KQorREVSSU5HX0NPUkUoKCUlUkVHZCkgICAgICAgLCglJVJFR2QsICUxKSAgICwlJW1tMiwlJW1tNCwlJW1tMCwlJW1tMywlJW1tNSwlJW1tMSwlJW1tNiwlJW1tNykKK0RFUklOR19DT1JFKCglJVJFR2QsICUxKSAgICwoJSVSRUdkLCAlMSwgMiksJSVtbTQsJSVtbTAsJSVtbTIsJSVtbTUsJSVtbTEsJSVtbTMsJSVtbTYsJSVtbTcpCitERVJJTkdfQ09SRSgoJSVSRUdkLCAlMSwgMiksKCUwLCAlMSwgOCkgICAgLCUlbW0wLCUlbW0yLCUlbW00LCUlbW0xLCUlbW0zLCUlbW01LCUlbW02LCUlbW03KQorREVSSU5HX0NPUkUoKCUwLCAlMSwgOCkgICAgLCglJVJFR2QsICUxLCA0KSwlJW1tMiwlJW1tNCwlJW1tMCwlJW1tMywlJW1tNSwlJW1tMSwlJW1tNiwlJW1tNykKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IDogInIiIChzcmMpLCAiciIgKCh4ODZfcmVnKXN0cmlkZSksICJtIiAoYy0+cFFQYiksICJtIihjLT5wUVBiMiksICJxIih0bXApCisgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGRlcmluZ1RocmVzaG9sZCxiMDAsYjAyLGIwOCkKKyAgICAgICAgOiAiJSJSRUdfYSwgIiUiUkVHX2QsICIlIlJFR19TUAorICAgICk7CisjZWxzZSAvLyBIQVZFXzdSRUdTICYmIChURU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cpCisgICAgaW50IHk7CisgICAgaW50IG1pbj0yNTU7CisgICAgaW50IG1heD0wOworICAgIGludCBhdmc7CisgICAgdWludDhfdCAqcDsKKyAgICBpbnQgc1sxMF07CisgICAgY29uc3QgaW50IFFQMj0gYy0+UVAvMiArIDE7CisKKyAgICBzcmMgLS07CisgICAgZm9yKHk9MTsgeTw5OyB5KyspeworICAgICAgICBpbnQgeDsKKyAgICAgICAgcD0gc3JjICsgc3RyaWRlKnk7CisgICAgICAgIGZvcih4PTE7IHg8OTsgeCsrKXsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGlmKCpwID4gbWF4KSBtYXg9ICpwOworICAgICAgICAgICAgaWYoKnAgPCBtaW4pIG1pbj0gKnA7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZnPSAobWluICsgbWF4ICsgMSk+PjE7CisKKyAgICBpZihtYXggLSBtaW4gPGRlcmluZ1RocmVzaG9sZCkgcmV0dXJuOworCisgICAgZm9yKHk9MDsgeTwxMDsgeSsrKXsKKyAgICAgICAgaW50IHQgPSAwOworCisgICAgICAgIGlmKHNyY1tzdHJpZGUqeSArIDBdID4gYXZnKSB0Kz0gMTsKKyAgICAgICAgaWYoc3JjW3N0cmlkZSp5ICsgMV0gPiBhdmcpIHQrPSAyOworICAgICAgICBpZihzcmNbc3RyaWRlKnkgKyAyXSA+IGF2ZykgdCs9IDQ7CisgICAgICAgIGlmKHNyY1tzdHJpZGUqeSArIDNdID4gYXZnKSB0Kz0gODsKKyAgICAgICAgaWYoc3JjW3N0cmlkZSp5ICsgNF0gPiBhdmcpIHQrPSAxNjsKKyAgICAgICAgaWYoc3JjW3N0cmlkZSp5ICsgNV0gPiBhdmcpIHQrPSAzMjsKKyAgICAgICAgaWYoc3JjW3N0cmlkZSp5ICsgNl0gPiBhdmcpIHQrPSA2NDsKKyAgICAgICAgaWYoc3JjW3N0cmlkZSp5ICsgN10gPiBhdmcpIHQrPSAxMjg7CisgICAgICAgIGlmKHNyY1tzdHJpZGUqeSArIDhdID4gYXZnKSB0Kz0gMjU2OworICAgICAgICBpZihzcmNbc3RyaWRlKnkgKyA5XSA+IGF2ZykgdCs9IDUxMjsKKworICAgICAgICB0IHw9ICh+dCk8PDE2OworICAgICAgICB0ICY9ICh0PDwxKSAmICh0Pj4xKTsKKyAgICAgICAgc1t5XSA9IHQ7CisgICAgfQorCisgICAgZm9yKHk9MTsgeTw5OyB5KyspeworICAgICAgICBpbnQgdCA9IHNbeS0xXSAmIHNbeV0gJiBzW3krMV07CisgICAgICAgIHR8PSB0Pj4xNjsKKyAgICAgICAgc1t5LTFdPSB0OworICAgIH0KKworICAgIGZvcih5PTE7IHk8OTsgeSsrKXsKKyAgICAgICAgaW50IHg7CisgICAgICAgIGludCB0ID0gc1t5LTFdOworCisgICAgICAgIHA9IHNyYyArIHN0cmlkZSp5OworICAgICAgICBmb3IoeD0xOyB4PDk7IHgrKyl7CisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBpZih0ICYgKDE8PHgpKXsKKyAgICAgICAgICAgICAgICBpbnQgZj0gKCoocC1zdHJpZGUtMSkpICsgMiooKihwLXN0cmlkZSkpICsgKCoocC1zdHJpZGUrMSkpCisgICAgICAgICAgICAgICAgICAgICAgKzIqKCoocCAgICAgLTEpKSArIDQqKCpwICAgICAgICAgKSArIDIqKCoocCAgICAgKzEpKQorICAgICAgICAgICAgICAgICAgICAgICsoKihwK3N0cmlkZS0xKSkgKyAyKigqKHArc3RyaWRlKSkgKyAoKihwK3N0cmlkZSsxKSk7CisgICAgICAgICAgICAgICAgZj0gKGYgKyA4KT4+NDsKKworI2lmZGVmIERFQlVHX0RFUklOR19USFJFU0hPTEQKKyAgICAgICAgICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgiZW1tc1xuXHQiOik7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljIGxvbmcgbG9uZyBudW1QaXhlbHM9MDsKKyAgICAgICAgICAgICAgICAgICAgaWYoeCE9MSAmJiB4IT04ICYmIHkhPTEgJiYgeSE9OCkgbnVtUGl4ZWxzKys7CisvLyAgICAgICAgICAgICAgICAgICAgaWYoKG1heC1taW4pPDIwIHx8IChtYXgtbWluKSpRUDwyMDApCisvLyAgICAgICAgICAgICAgICAgICAgaWYoKG1heC1taW4pKlFQIDwgNTAwKQorLy8gICAgICAgICAgICAgICAgICAgIGlmKG1heC1taW48UVAvMikKKyAgICAgICAgICAgICAgICAgICAgaWYobWF4LW1pbiA8IDIwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgbnVtU2tpcHBlZD0wOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBlcnJvclN1bT0wOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCB3b3JzdFFQPTA7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IHdvcnN0UmFuZ2U9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgd29yc3REaWZmPTA7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlmZj0gKGYgLSAqcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWJzRGlmZj0gRkZBQlMoZGlmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3I9IGRpZmYqZGlmZjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoeD09MSB8fCB4PT04IHx8IHk9PTEgfHwgeT09OCkgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVNraXBwZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFic0RpZmYgPiB3b3JzdERpZmYpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0RGlmZj0gYWJzRGlmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdFFQPSBRUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdFJhbmdlPSBtYXgtbWluOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdW0rPSBlcnJvcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoMTAyNExMKjEwMjRMTCoxMDI0TEwgJSBudW1Ta2lwcGVkID09IDApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfSU5GTywgInN1bTolMS4zZiwgc2tpcDolZCwgd1FQOiVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3UmFuZ2U6JWQsIHdEaWZmOiVkLCByZWxTa2lwOiUxLjNmXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpZXJyb3JTdW0vbnVtU2tpcHBlZCwgbnVtU2tpcHBlZCwgd29yc3RRUCwgd29yc3RSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3REaWZmLCAoZmxvYXQpbnVtU2tpcHBlZC9udW1QaXhlbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZiAgICAgKCpwICsgUVAyIDwgZikgKnA9ICpwICsgUVAyOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCpwIC0gUVAyID4gZikgKnA9ICpwIC0gUVAyOworICAgICAgICAgICAgICAgICAgICBlbHNlICpwPWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgREVCVUdfREVSSU5HX1RIUkVTSE9MRAorICAgIGlmKG1heC1taW4gPCAyMCl7CisgICAgICAgIGZvcih5PTE7IHk8OTsgeSsrKXsKKyAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgaW50IHQgPSAwOworICAgICAgICAgICAgcD0gc3JjICsgc3RyaWRlKnk7CisgICAgICAgICAgICBmb3IoeD0xOyB4PDk7IHgrKyl7CisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgICpwID0gRkZNSU4oKnAgKyAyMCwgMjU1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorLy8gICAgICAgIHNyY1swXSA9IHNyY1s3XT1zcmNbc3RyaWRlKjddPXNyY1tzdHJpZGUqNyArIDddPTI1NTsKKyAgICB9CisjZW5kaWYKKyNlbmRpZiAvL1RFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVworfQorI2VuZGlmIC8vVEVNUExBVEVfUFBfQUxUSVZFQworCisvKioKKyAqIERlaW50ZXJsYWNlIHRoZSBnaXZlbiBibG9jayBieSBsaW5lYXJseSBpbnRlcnBvbGF0aW5nIGV2ZXJ5IHNlY29uZCBsaW5lLgorICogd2lsbCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IDh4OCBibG9jayBhbmQgY2FuIHJlYWQgJiB3cml0ZSBmcm9tIGxpbmUgNC0xNQorICogbGluZXMgMC0zIGhhdmUgYmVlbiBwYXNzZWQgdGhyb3VnaCB0aGUgZGVibG9jayAvIGRlcmluZyBmaWx0ZXJzIGFscmVhZHksIGJ1dCBjYW4gYmUgcmVhZCwgdG9vLgorICogbGluZXMgNC0xMiB3aWxsIGJlIHJlYWQgaW50byB0aGUgZGVibG9ja2luZyBmaWx0ZXIgYW5kIHNob3VsZCBiZSBkZWludGVybGFjZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRShkZUludGVybGFjZUludGVycG9sYXRlTGluZWFyKSh1aW50OF90IHNyY1tdLCBpbnQgc3RyaWRlKQoreworI2lmIFRFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVworICAgIHNyYys9IDQqc3RyaWRlOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJsZWEgKCUwLCAlMSksICUlIlJFR19hIiAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJSRUdfYSIsICUxLCA0KSwgJSUiUkVHX2MiICAgICAgXG5cdCIKKy8vICAgICAgMCAgICAgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDggICAgICAgOQorLy8gICAgICAlMCAgICAgIGVheCAgICAgZWF4KyUxICBlYXgrMiUxICUwKzQlMSAgZWN4ICAgICBlY3grJTEgIGVjeCsyJTEgJTArOCUxICBlY3grNCUxCisKKyAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxKSwgJSVtbTEgICAgICAgICAgICBcblx0IgorICAgICAgICBQQVZHQiglJW1tMSwgJSVtbTApCisgICAgICAgICJtb3ZxICUlbW0wLCAoJSUiUkVHX2EiKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJTAsICUxLCA0KSwgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUEFWR0IoJSVtbTAsICUlbW0xKQorICAgICAgICAibW92cSAlJW1tMSwgKCUlIlJFR19hIiwgJTEsIDIpICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19jIiwgJTEpLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBBVkdCKCUlbW0xLCAlJW1tMCkKKyAgICAgICAgIm1vdnEgJSVtbTAsICglJSJSRUdfYyIpICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglMCwgJTEsIDgpLCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQQVZHQiglJW1tMCwgJSVtbTEpCisgICAgICAgICJtb3ZxICUlbW0xLCAoJSUiUkVHX2MiLCAlMSwgMikgICAgICAgICBcblx0IgorCisgICAgICAgIDogOiAiciIgKHNyYyksICJyIiAoKHg4Nl9yZWcpc3RyaWRlKQorICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfYworICAgICk7CisjZWxzZQorICAgIGludCBhLCBiLCB4OworICAgIHNyYys9IDQqc3RyaWRlOworCisgICAgZm9yKHg9MDsgeDwyOyB4KyspeworICAgICAgICBhPSAqKHVpbnQzMl90Kikmc3JjW3N0cmlkZSowXTsKKyAgICAgICAgYj0gKih1aW50MzJfdCopJnNyY1tzdHJpZGUqMl07CisgICAgICAgICoodWludDMyX3QqKSZzcmNbc3RyaWRlKjFdPSAoYXxiKSAtICgoKGFeYikmMHhGRUZFRkVGRVVMKT4+MSk7CisgICAgICAgIGE9ICoodWludDMyX3QqKSZzcmNbc3RyaWRlKjRdOworICAgICAgICAqKHVpbnQzMl90Kikmc3JjW3N0cmlkZSozXT0gKGF8YikgLSAoKChhXmIpJjB4RkVGRUZFRkVVTCk+PjEpOworICAgICAgICBiPSAqKHVpbnQzMl90Kikmc3JjW3N0cmlkZSo2XTsKKyAgICAgICAgKih1aW50MzJfdCopJnNyY1tzdHJpZGUqNV09IChhfGIpIC0gKCgoYV5iKSYweEZFRkVGRUZFVUwpPj4xKTsKKyAgICAgICAgYT0gKih1aW50MzJfdCopJnNyY1tzdHJpZGUqOF07CisgICAgICAgICoodWludDMyX3QqKSZzcmNbc3RyaWRlKjddPSAoYXxiKSAtICgoKGFeYikmMHhGRUZFRkVGRVVMKT4+MSk7CisgICAgICAgIHNyYyArPSA0OworICAgIH0KKyNlbmRpZgorfQorCisvKioKKyAqIERlaW50ZXJsYWNlIHRoZSBnaXZlbiBibG9jayBieSBjdWJpYyBpbnRlcnBvbGF0aW5nIGV2ZXJ5IHNlY29uZCBsaW5lLgorICogd2lsbCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IDh4OCBibG9jayBhbmQgY2FuIHJlYWQgJiB3cml0ZSBmcm9tIGxpbmUgNC0xNQorICogbGluZXMgMC0zIGhhdmUgYmVlbiBwYXNzZWQgdGhyb3VnaCB0aGUgZGVibG9jayAvIGRlcmluZyBmaWx0ZXJzIGFscmVhZHksIGJ1dCBjYW4gYmUgcmVhZCwgdG9vLgorICogbGluZXMgNC0xMiB3aWxsIGJlIHJlYWQgaW50byB0aGUgZGVibG9ja2luZyBmaWx0ZXIgYW5kIHNob3VsZCBiZSBkZWludGVybGFjZWQKKyAqIHRoaXMgZmlsdGVyIHdpbGwgcmVhZCBsaW5lcyAzLTE1IGFuZCB3cml0ZSA3LTEzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUoZGVJbnRlcmxhY2VJbnRlcnBvbGF0ZUN1YmljKSh1aW50OF90IHNyY1tdLCBpbnQgc3RyaWRlKQoreworI2lmIFRFTVBMQVRFX1BQX1NTRTIgfHwgVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCisgICAgc3JjKz0gc3RyaWRlKjM7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJSJSRUdfZCIgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJSRUdfZCIsICUxLCA0KSwgJSUiUkVHX2MiICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAlMSwgJSUiUkVHX2MiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjaWYgVEVNUExBVEVfUFBfU1NFMgorICAgICAgICAicHhvciAlJXhtbTcsICUleG1tNyAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNkZWZpbmUgUkVBTF9ERUlOVF9DVUJJQyhhLGIsYyxkLGUpXAorICAgICAgICAibW92cSAiICNhICIsICUleG1tMCAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI2IgIiwgJSV4bW0xICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjZCAiLCAlJXhtbTIgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAiICNlICIsICUleG1tMyAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYXZnYiAlJXhtbTIsICUleG1tMSAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhdmdiICUleG1tMywgJSV4bW0wICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHVucGNrbGJ3ICUleG1tNywgJSV4bW0wICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSV4bW03LCAlJXhtbTEgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUleG1tMSwgJSV4bW0wICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYXcgJDMsICUleG1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3VidyAlJXhtbTAsICUleG1tMSAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2t1c3diICUleG1tMSwgJSV4bW0xICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92bHBzICUleG1tMSwgIiAjYyAiICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbHNlIC8vVEVNUExBVEVfUFBfU1NFMgorICAgICAgICAicHhvciAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKy8vICAgICAgMCAgICAgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDggICAgICAgOSAgICAgICAxMAorLy8gICAgICAlMCAgICAgIGVheCAgICAgZWF4KyUxICBlYXgrMiUxICUwKzQlMSAgZWR4ICAgICBlZHgrJTEgIGVkeCsyJTEgJTArOCUxICBlZHgrNCUxIGVjeAorCisjZGVmaW5lIFJFQUxfREVJTlRfQ1VCSUMoYSxiLGMsZCxlKVwKKyAgICAgICAgIm1vdnEgIiAjYSAiLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAiICNiICIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI2QgIiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjZSAiLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICBQQVZHQiglJW1tMiwgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoYitkKSAvMiAqL1wKKyAgICAgICAgUEFWR0IoJSVtbTMsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGErZSkgLzIgKi9cCisgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTEgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMyAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3VidyAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIC8qIEwoYStlIC0gKGIrZCkpLzIgKi9cCisgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIC8qIEgoYStlIC0gKGIrZCkpLzIgKi9cCisgICAgICAgICJwc3JhdyAkMywgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIC8qIEwoYStlIC0gKGIrZCkpLzE2ICovXAorICAgICAgICAicHNyYXcgJDMsICUlbW0yICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAvKiBIKGErZSAtIChiK2QpKS8xNiAqL1wKKyAgICAgICAgInBzdWJ3ICUlbW0wLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgLyogTCg5YiArIDlkIC0gYSAtIGUpLzE2ICovXAorICAgICAgICAicHN1YncgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAvKiBIKDliICsgOWQgLSBhIC0gZSkvMTYgKi9cCisgICAgICAgICJwYWNrdXN3YiAlJW1tMywgJSVtbTEgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTEsICIgI2MgIiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZW5kaWYgLy9URU1QTEFURV9QUF9TU0UyCisjZGVmaW5lIERFSU5UX0NVQklDKGEsYixjLGQsZSkgIFJFQUxfREVJTlRfQ1VCSUMoYSxiLGMsZCxlKQorCitERUlOVF9DVUJJQygoJTApICAgICAgICAsICglJVJFR2EsICUxKSwgKCUlUkVHYSwgJTEsIDIpLCAoJTAsICUxLCA0KSAsICglJVJFR2QsICUxKSkKK0RFSU5UX0NVQklDKCglJVJFR2EsICUxKSwgKCUwLCAlMSwgNCkgLCAoJSVSRUdkKSAgICAgICAsICglJVJFR2QsICUxKSwgKCUwLCAlMSwgOCkpCitERUlOVF9DVUJJQygoJTAsICUxLCA0KSAsICglJVJFR2QsICUxKSwgKCUlUkVHZCwgJTEsIDIpLCAoJTAsICUxLCA4KSAsICglJVJFR2MpKQorREVJTlRfQ1VCSUMoKCUlUkVHZCwgJTEpLCAoJTAsICUxLCA4KSAsICglJVJFR2QsICUxLCA0KSwgKCUlUkVHYykgICAgLCAoJSVSRUdjLCAlMSwgMikpCisKKyAgICAgICAgOiA6ICJyIiAoc3JjKSwgInIiICgoeDg2X3JlZylzdHJpZGUpCisgICAgICAgIDoKKyNpZiBURU1QTEFURV9QUF9TU0UyCisgICAgICAgIFhNTV9DTE9CQkVSUygiJXhtbTAiLCAiJXhtbTEiLCAiJXhtbTIiLCAiJXhtbTMiLCAiJXhtbTciLCkKKyNlbmRpZgorICAgICAgICAiJSJSRUdfYSwgIiUiUkVHX2QsICIlIlJFR19jCisgICAgKTsKKyN1bmRlZiBSRUFMX0RFSU5UX0NVQklDCisjZWxzZSAvL1RFTVBMQVRFX1BQX1NTRTIgfHwgVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCisgICAgaW50IHg7CisgICAgc3JjKz0gc3RyaWRlKjM7CisgICAgZm9yKHg9MDsgeDw4OyB4KyspeworICAgICAgICBzcmNbc3RyaWRlKjNdID0gYXZfY2xpcF91aW50OCgoLXNyY1swXSAgICAgICAgKyA5KnNyY1tzdHJpZGUqMl0gKyA5KnNyY1tzdHJpZGUqNF0gLSBzcmNbc3RyaWRlKjZdKT4+NCk7CisgICAgICAgIHNyY1tzdHJpZGUqNV0gPSBhdl9jbGlwX3VpbnQ4KCgtc3JjW3N0cmlkZSoyXSArIDkqc3JjW3N0cmlkZSo0XSArIDkqc3JjW3N0cmlkZSo2XSAtIHNyY1tzdHJpZGUqOF0pPj40KTsKKyAgICAgICAgc3JjW3N0cmlkZSo3XSA9IGF2X2NsaXBfdWludDgoKC1zcmNbc3RyaWRlKjRdICsgOSpzcmNbc3RyaWRlKjZdICsgOSpzcmNbc3RyaWRlKjhdIC0gc3JjW3N0cmlkZSoxMF0pPj40KTsKKyAgICAgICAgc3JjW3N0cmlkZSo5XSA9IGF2X2NsaXBfdWludDgoKC1zcmNbc3RyaWRlKjZdICsgOSpzcmNbc3RyaWRlKjhdICsgOSpzcmNbc3RyaWRlKjEwXSAtIHNyY1tzdHJpZGUqMTJdKT4+NCk7CisgICAgICAgIHNyYysrOworICAgIH0KKyNlbmRpZiAvL1RFTVBMQVRFX1BQX1NTRTIgfHwgVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCit9CisKKy8qKgorICogRGVpbnRlcmxhY2UgdGhlIGdpdmVuIGJsb2NrIGJ5IGZpbHRlcmluZyBldmVyeSBzZWNvbmQgbGluZSB3aXRoIGEgKC0xIDQgMiA0IC0xKSBmaWx0ZXIuCisgKiB3aWxsIGJlIGNhbGxlZCBmb3IgZXZlcnkgOHg4IGJsb2NrIGFuZCBjYW4gcmVhZCAmIHdyaXRlIGZyb20gbGluZSA0LTE1CisgKiBsaW5lcyAwLTMgaGF2ZSBiZWVuIHBhc3NlZCB0aHJvdWdoIHRoZSBkZWJsb2NrIC8gZGVyaW5nIGZpbHRlcnMgYWxyZWFkeSwgYnV0IGNhbiBiZSByZWFkLCB0b28uCisgKiBsaW5lcyA0LTEyIHdpbGwgYmUgcmVhZCBpbnRvIHRoZSBkZWJsb2NraW5nIGZpbHRlciBhbmQgc2hvdWxkIGJlIGRlaW50ZXJsYWNlZAorICogdGhpcyBmaWx0ZXIgd2lsbCByZWFkIGxpbmVzIDQtMTMgYW5kIHdyaXRlIDUtMTEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRShkZUludGVybGFjZUZGKSh1aW50OF90IHNyY1tdLCBpbnQgc3RyaWRlLCB1aW50OF90ICp0bXApCit7CisjaWYgVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCisgICAgc3JjKz0gc3RyaWRlKjQ7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJSJSRUdfZCIgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUyKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisvLyAgICAgIDAgICAgICAgMSAgICAgICAyICAgICAgIDMgICAgICAgNCAgICAgICA1ICAgICAgIDYgICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAKKy8vICAgICAgJTAgICAgICBlYXggICAgIGVheCslMSAgZWF4KzIlMSAlMCs0JTEgIGVkeCAgICAgZWR4KyUxICBlZHgrMiUxICUwKzglMSAgZWR4KzQlMSBlY3gKKworI2RlZmluZSBSRUFMX0RFSU5UX0ZGKGEsYixjLGQpXAorICAgICAgICAibW92cSAiICNhICIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI2IgIiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjYyAiLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAiICNkICIsICUlbW00ICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgIFBBVkdCKCUlbW0zLCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUEFWR0IoJSVtbTQsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0wICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tMSwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTQgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHNsbHcgJDIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc2xsdyAkMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW0wLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YncgJSVtbTMsICUlbW00ICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW01ICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgJSVtbTUsICUlbW00ICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhdyAkMiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmF3ICQyLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3Vzd2IgJSVtbTQsICUlbW0xICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0xLCAiICNiICIgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKworI2RlZmluZSBERUlOVF9GRihhLGIsYyxkKSAgUkVBTF9ERUlOVF9GRihhLGIsYyxkKQorCitERUlOVF9GRigoJTApICAgICAgICAsICglJVJFR2EpICAgICAgICwgKCUlUkVHYSwgJTEpLCAoJSVSRUdhLCAlMSwgMikpCitERUlOVF9GRigoJSVSRUdhLCAlMSksICglJVJFR2EsICUxLCAyKSwgKCUwLCAlMSwgNCkgLCAoJSVSRUdkKSAgICAgICApCitERUlOVF9GRigoJTAsICUxLCA0KSAsICglJVJFR2QpICAgICAgICwgKCUlUkVHZCwgJTEpLCAoJSVSRUdkLCAlMSwgMikpCitERUlOVF9GRigoJSVSRUdkLCAlMSksICglJVJFR2QsICUxLCAyKSwgKCUwLCAlMSwgOCkgLCAoJSVSRUdkLCAlMSwgNCkpCisKKyAgICAgICAgIm1vdnEgJSVtbTAsICglMikgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogOiAiciIgKHNyYyksICJyIiAoKHg4Nl9yZWcpc3RyaWRlKSwgInIiKHRtcCkKKyAgICAgICAgOiAiJSJSRUdfYSwgIiUiUkVHX2QKKyAgICApOworI2Vsc2UgLy9URU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cKKyAgICBpbnQgeDsKKyAgICBzcmMrPSBzdHJpZGUqNDsKKyAgICBmb3IoeD0wOyB4PDg7IHgrKyl7CisgICAgICAgIGludCB0MT0gdG1wW3hdOworICAgICAgICBpbnQgdDI9IHNyY1tzdHJpZGUqMV07CisKKyAgICAgICAgc3JjW3N0cmlkZSoxXT0gYXZfY2xpcF91aW50OCgoLXQxICsgNCpzcmNbc3RyaWRlKjBdICsgMip0MiArIDQqc3JjW3N0cmlkZSoyXSAtIHNyY1tzdHJpZGUqM10gKyA0KT4+Myk7CisgICAgICAgIHQxPSBzcmNbc3RyaWRlKjRdOworICAgICAgICBzcmNbc3RyaWRlKjNdPSBhdl9jbGlwX3VpbnQ4KCgtdDIgKyA0KnNyY1tzdHJpZGUqMl0gKyAyKnQxICsgNCpzcmNbc3RyaWRlKjRdIC0gc3JjW3N0cmlkZSo1XSArIDQpPj4zKTsKKyAgICAgICAgdDI9IHNyY1tzdHJpZGUqNl07CisgICAgICAgIHNyY1tzdHJpZGUqNV09IGF2X2NsaXBfdWludDgoKC10MSArIDQqc3JjW3N0cmlkZSo0XSArIDIqdDIgKyA0KnNyY1tzdHJpZGUqNl0gLSBzcmNbc3RyaWRlKjddICsgNCk+PjMpOworICAgICAgICB0MT0gc3JjW3N0cmlkZSo4XTsKKyAgICAgICAgc3JjW3N0cmlkZSo3XT0gYXZfY2xpcF91aW50OCgoLXQyICsgNCpzcmNbc3RyaWRlKjZdICsgMip0MSArIDQqc3JjW3N0cmlkZSo4XSAtIHNyY1tzdHJpZGUqOV0gKyA0KT4+Myk7CisgICAgICAgIHRtcFt4XT0gdDE7CisKKyAgICAgICAgc3JjKys7CisgICAgfQorI2VuZGlmIC8vVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCit9CisKKy8qKgorICogRGVpbnRlcmxhY2UgdGhlIGdpdmVuIGJsb2NrIGJ5IGZpbHRlcmluZyBldmVyeSBsaW5lIHdpdGggYSAoLTEgMiA2IDIgLTEpIGZpbHRlci4KKyAqIHdpbGwgYmUgY2FsbGVkIGZvciBldmVyeSA4eDggYmxvY2sgYW5kIGNhbiByZWFkICYgd3JpdGUgZnJvbSBsaW5lIDQtMTUKKyAqIGxpbmVzIDAtMyBoYXZlIGJlZW4gcGFzc2VkIHRocm91Z2ggdGhlIGRlYmxvY2sgLyBkZXJpbmcgZmlsdGVycyBhbHJlYWR5LCBidXQgY2FuIGJlIHJlYWQsIHRvby4KKyAqIGxpbmVzIDQtMTIgd2lsbCBiZSByZWFkIGludG8gdGhlIGRlYmxvY2tpbmcgZmlsdGVyIGFuZCBzaG91bGQgYmUgZGVpbnRlcmxhY2VkCisgKiB0aGlzIGZpbHRlciB3aWxsIHJlYWQgbGluZXMgNC0xMyBhbmQgd3JpdGUgNC0xMQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKGRlSW50ZXJsYWNlTDUpKHVpbnQ4X3Qgc3JjW10sIGludCBzdHJpZGUsIHVpbnQ4X3QgKnRtcCwgdWludDhfdCAqdG1wMikKK3sKKyNpZiAoVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XKSAmJiBIQVZFXzZSRUdTCisgICAgc3JjKz0gc3RyaWRlKjQ7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJSJSRUdfZCIgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUyKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglMyksICUlbW0xICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcgICAgICAgOCAgICAgICA5ICAgICAgIDEwCisvLyAgICAgICUwICAgICAgZWF4ICAgICBlYXgrJTEgIGVheCsyJTEgJTArNCUxICBlZHggICAgIGVkeCslMSAgZWR4KzIlMSAlMCs4JTEgIGVkeCs0JTEgZWN4CisKKyNkZWZpbmUgUkVBTF9ERUlOVF9MNSh0MSx0MixhLGIsYylcCisgICAgICAgICJtb3ZxICIgI2EgIiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjYiAiLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAiICNjICIsICUlbW00ICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgIFBBVkdCKHQyLCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUEFWR0IodDEsICUlbW00KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0yLCAiICN0MSAiICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTIgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tNSAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW01LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNSAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0zLCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTMgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTMgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICUlbW02LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWRkdyAlJW1tNiwgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTQsICUlbW02ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNCAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW02ICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW00LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YncgJSVtbTYsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhdyAkMiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmF3ICQyLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFja3Vzd2IgJSVtbTUsICUlbW0yICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0yLCAiICNhICIgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKworI2RlZmluZSBERUlOVF9MNSh0MSx0MixhLGIsYykgIFJFQUxfREVJTlRfTDUodDEsdDIsYSxiLGMpCisKK0RFSU5UX0w1KCUlbW0wLCAlJW1tMSwgKCUwKSAgICAgICAgICAgLCAoJSVSRUdhKSAgICAgICAsICglJVJFR2EsICUxKSAgICkKK0RFSU5UX0w1KCUlbW0xLCAlJW1tMCwgKCUlUkVHYSkgICAgICAgLCAoJSVSRUdhLCAlMSkgICAsICglJVJFR2EsICUxLCAyKSkKK0RFSU5UX0w1KCUlbW0wLCAlJW1tMSwgKCUlUkVHYSwgJTEpICAgLCAoJSVSRUdhLCAlMSwgMiksICglMCwgJTEsIDQpICAgKQorREVJTlRfTDUoJSVtbTEsICUlbW0wLCAoJSVSRUdhLCAlMSwgMiksICglMCwgJTEsIDQpICAgICwgKCUlUkVHZCkgICAgICAgKQorREVJTlRfTDUoJSVtbTAsICUlbW0xLCAoJTAsICUxLCA0KSAgICAsICglJVJFR2QpICAgICAgICwgKCUlUkVHZCwgJTEpICAgKQorREVJTlRfTDUoJSVtbTEsICUlbW0wLCAoJSVSRUdkKSAgICAgICAsICglJVJFR2QsICUxKSAgICwgKCUlUkVHZCwgJTEsIDIpKQorREVJTlRfTDUoJSVtbTAsICUlbW0xLCAoJSVSRUdkLCAlMSkgICAsICglJVJFR2QsICUxLCAyKSwgKCUwLCAlMSwgOCkgICApCitERUlOVF9MNSglJW1tMSwgJSVtbTAsICglJVJFR2QsICUxLCAyKSwgKCUwLCAlMSwgOCkgICAgLCAoJSVSRUdkLCAlMSwgNCkpCisKKyAgICAgICAgIm1vdnEgJSVtbTAsICglMikgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0xLCAoJTMpICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IDogInIiIChzcmMpLCAiciIgKCh4ODZfcmVnKXN0cmlkZSksICJyIih0bXApLCAiciIodG1wMikKKyAgICAgICAgOiAiJSJSRUdfYSwgIiUiUkVHX2QKKyAgICApOworI2Vsc2UgLy8oVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XKSAmJiBIQVZFXzZSRUdTCisgICAgaW50IHg7CisgICAgc3JjKz0gc3RyaWRlKjQ7CisgICAgZm9yKHg9MDsgeDw4OyB4KyspeworICAgICAgICBpbnQgdDE9IHRtcFt4XTsKKyAgICAgICAgaW50IHQyPSB0bXAyW3hdOworICAgICAgICBpbnQgdDM9IHNyY1swXTsKKworICAgICAgICBzcmNbc3RyaWRlKjBdPSBhdl9jbGlwX3VpbnQ4KCgtKHQxICsgc3JjW3N0cmlkZSoyXSkgKyAyKih0MiArIHNyY1tzdHJpZGUqMV0pICsgNip0MyArIDQpPj4zKTsKKyAgICAgICAgdDE9IHNyY1tzdHJpZGUqMV07CisgICAgICAgIHNyY1tzdHJpZGUqMV09IGF2X2NsaXBfdWludDgoKC0odDIgKyBzcmNbc3RyaWRlKjNdKSArIDIqKHQzICsgc3JjW3N0cmlkZSoyXSkgKyA2KnQxICsgNCk+PjMpOworICAgICAgICB0Mj0gc3JjW3N0cmlkZSoyXTsKKyAgICAgICAgc3JjW3N0cmlkZSoyXT0gYXZfY2xpcF91aW50OCgoLSh0MyArIHNyY1tzdHJpZGUqNF0pICsgMioodDEgKyBzcmNbc3RyaWRlKjNdKSArIDYqdDIgKyA0KT4+Myk7CisgICAgICAgIHQzPSBzcmNbc3RyaWRlKjNdOworICAgICAgICBzcmNbc3RyaWRlKjNdPSBhdl9jbGlwX3VpbnQ4KCgtKHQxICsgc3JjW3N0cmlkZSo1XSkgKyAyKih0MiArIHNyY1tzdHJpZGUqNF0pICsgNip0MyArIDQpPj4zKTsKKyAgICAgICAgdDE9IHNyY1tzdHJpZGUqNF07CisgICAgICAgIHNyY1tzdHJpZGUqNF09IGF2X2NsaXBfdWludDgoKC0odDIgKyBzcmNbc3RyaWRlKjZdKSArIDIqKHQzICsgc3JjW3N0cmlkZSo1XSkgKyA2KnQxICsgNCk+PjMpOworICAgICAgICB0Mj0gc3JjW3N0cmlkZSo1XTsKKyAgICAgICAgc3JjW3N0cmlkZSo1XT0gYXZfY2xpcF91aW50OCgoLSh0MyArIHNyY1tzdHJpZGUqN10pICsgMioodDEgKyBzcmNbc3RyaWRlKjZdKSArIDYqdDIgKyA0KT4+Myk7CisgICAgICAgIHQzPSBzcmNbc3RyaWRlKjZdOworICAgICAgICBzcmNbc3RyaWRlKjZdPSBhdl9jbGlwX3VpbnQ4KCgtKHQxICsgc3JjW3N0cmlkZSo4XSkgKyAyKih0MiArIHNyY1tzdHJpZGUqN10pICsgNip0MyArIDQpPj4zKTsKKyAgICAgICAgdDE9IHNyY1tzdHJpZGUqN107CisgICAgICAgIHNyY1tzdHJpZGUqN109IGF2X2NsaXBfdWludDgoKC0odDIgKyBzcmNbc3RyaWRlKjldKSArIDIqKHQzICsgc3JjW3N0cmlkZSo4XSkgKyA2KnQxICsgNCk+PjMpOworCisgICAgICAgIHRtcFt4XT0gdDM7CisgICAgICAgIHRtcDJbeF09IHQxOworCisgICAgICAgIHNyYysrOworICAgIH0KKyNlbmRpZiAvLyhURU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cpICYmIEhBVkVfNlJFR1MKK30KKworLyoqCisgKiBEZWludGVybGFjZSB0aGUgZ2l2ZW4gYmxvY2sgYnkgZmlsdGVyaW5nIGFsbCBsaW5lcyB3aXRoIGEgKDEgMiAxKSBmaWx0ZXIuCisgKiB3aWxsIGJlIGNhbGxlZCBmb3IgZXZlcnkgOHg4IGJsb2NrIGFuZCBjYW4gcmVhZCAmIHdyaXRlIGZyb20gbGluZSA0LTE1CisgKiBsaW5lcyAwLTMgaGF2ZSBiZWVuIHBhc3NlZCB0aHJvdWdoIHRoZSBkZWJsb2NrIC8gZGVyaW5nIGZpbHRlcnMgYWxyZWFkeSwgYnV0IGNhbiBiZSByZWFkLCB0b28uCisgKiBsaW5lcyA0LTEyIHdpbGwgYmUgcmVhZCBpbnRvIHRoZSBkZWJsb2NraW5nIGZpbHRlciBhbmQgc2hvdWxkIGJlIGRlaW50ZXJsYWNlZAorICogdGhpcyBmaWx0ZXIgd2lsbCByZWFkIGxpbmVzIDQtMTMgYW5kIHdyaXRlIDQtMTEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRShkZUludGVybGFjZUJsZW5kTGluZWFyKSh1aW50OF90IHNyY1tdLCBpbnQgc3RyaWRlLCB1aW50OF90ICp0bXApCit7CisjaWYgVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCisgICAgc3JjKz0gNCpzdHJpZGU7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJSJSRUdfZCIgICAgICBcblx0IgorLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcgICAgICAgOCAgICAgICA5CisvLyAgICAgICUwICAgICAgZWF4ICAgICBlYXgrJTEgIGVheCsyJTEgJTArNCUxICBlZHggICAgIGVkeCslMSAgZWR4KzIlMSAlMCs4JTEgIGVkeCs0JTEKKworICAgICAgICAibW92cSAoJTIpLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDAKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiksICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwyCisgICAgICAgIFBBVkdCKCUlbW0xLCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMMCtMMgorICAgICAgICAibW92cSAoJTApLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEKKyAgICAgICAgUEFWR0IoJSVtbTIsICUlbW0wKQorICAgICAgICAibW92cSAlJW1tMCwgKCUwKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEpLCAlJW1tMCAgICAgICAgICAgIFxuXHQiIC8vIEwzCisgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMMStMMworICAgICAgICBQQVZHQiglJW1tMSwgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMkwyICsgTDEgKyBMMworICAgICAgICAibW92cSAlJW1tMiwgKCUlIlJFR19hIikgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMiAgICAgICAgIFxuXHQiIC8vIEw0CisgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMMitMNAorICAgICAgICBQQVZHQiglJW1tMCwgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMkwzICsgTDIgKyBMNAorICAgICAgICAibW92cSAlJW1tMSwgKCUlIlJFR19hIiwgJTEpICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUwLCAlMSwgNCksICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw1CisgICAgICAgIFBBVkdCKCUlbW0xLCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMMytMNQorICAgICAgICBQQVZHQiglJW1tMiwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMkw0ICsgTDMgKyBMNQorICAgICAgICAibW92cSAlJW1tMCwgKCUlIlJFR19hIiwgJTEsIDIpICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19kIiksICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw2CisgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMNCtMNgorICAgICAgICBQQVZHQiglJW1tMSwgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMkw1ICsgTDQgKyBMNgorICAgICAgICAibW92cSAlJW1tMiwgKCUwLCAlMSwgNCkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19kIiwgJTEpLCAlJW1tMiAgICAgICAgICAgIFxuXHQiIC8vIEw3CisgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMNStMNworICAgICAgICBQQVZHQiglJW1tMCwgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMkw2ICsgTDUgKyBMNworICAgICAgICAibW92cSAlJW1tMSwgKCUlIlJFR19kIikgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19kIiwgJTEsIDIpLCAlJW1tMSAgICAgICAgIFxuXHQiIC8vIEw4CisgICAgICAgIFBBVkdCKCUlbW0xLCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMNitMOAorICAgICAgICBQQVZHQiglJW1tMiwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMkw3ICsgTDYgKyBMOAorICAgICAgICAibW92cSAlJW1tMCwgKCUlIlJFR19kIiwgJTEpICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUwLCAlMSwgOCksICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw5CisgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMNytMOQorICAgICAgICBQQVZHQiglJW1tMSwgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMkw4ICsgTDcgKyBMOQorICAgICAgICAibW92cSAlJW1tMiwgKCUlIlJFR19kIiwgJTEsIDIpICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTEsICglMikgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiA6ICJyIiAoc3JjKSwgInIiICgoeDg2X3JlZylzdHJpZGUpLCAiciIgKHRtcCkKKyAgICAgICAgOiAiJSJSRUdfYSwgIiUiUkVHX2QKKyAgICApOworI2Vsc2UgLy9URU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cKKyAgICBpbnQgYSwgYiwgYywgeDsKKyAgICBzcmMrPSA0KnN0cmlkZTsKKworICAgIGZvcih4PTA7IHg8MjsgeCsrKXsKKyAgICAgICAgYT0gKih1aW50MzJfdCopJnRtcFtzdHJpZGUqMF07CisgICAgICAgIGI9ICoodWludDMyX3QqKSZzcmNbc3RyaWRlKjBdOworICAgICAgICBjPSAqKHVpbnQzMl90Kikmc3JjW3N0cmlkZSoxXTsKKyAgICAgICAgYT0gKGEmYykgKyAoKChhXmMpJjB4RkVGRUZFRkVVTCk+PjEpOworICAgICAgICAqKHVpbnQzMl90Kikmc3JjW3N0cmlkZSowXT0gKGF8YikgLSAoKChhXmIpJjB4RkVGRUZFRkVVTCk+PjEpOworCisgICAgICAgIGE9ICoodWludDMyX3QqKSZzcmNbc3RyaWRlKjJdOworICAgICAgICBiPSAoYSZiKSArICgoKGFeYikmMHhGRUZFRkVGRVVMKT4+MSk7CisgICAgICAgICoodWludDMyX3QqKSZzcmNbc3RyaWRlKjFdPSAoY3xiKSAtICgoKGNeYikmMHhGRUZFRkVGRVVMKT4+MSk7CisKKyAgICAgICAgYj0gKih1aW50MzJfdCopJnNyY1tzdHJpZGUqM107CisgICAgICAgIGM9IChiJmMpICsgKCgoYl5jKSYweEZFRkVGRUZFVUwpPj4xKTsKKyAgICAgICAgKih1aW50MzJfdCopJnNyY1tzdHJpZGUqMl09IChjfGEpIC0gKCgoY15hKSYweEZFRkVGRUZFVUwpPj4xKTsKKworICAgICAgICBjPSAqKHVpbnQzMl90Kikmc3JjW3N0cmlkZSo0XTsKKyAgICAgICAgYT0gKGEmYykgKyAoKChhXmMpJjB4RkVGRUZFRkVVTCk+PjEpOworICAgICAgICAqKHVpbnQzMl90Kikmc3JjW3N0cmlkZSozXT0gKGF8YikgLSAoKChhXmIpJjB4RkVGRUZFRkVVTCk+PjEpOworCisgICAgICAgIGE9ICoodWludDMyX3QqKSZzcmNbc3RyaWRlKjVdOworICAgICAgICBiPSAoYSZiKSArICgoKGFeYikmMHhGRUZFRkVGRVVMKT4+MSk7CisgICAgICAgICoodWludDMyX3QqKSZzcmNbc3RyaWRlKjRdPSAoY3xiKSAtICgoKGNeYikmMHhGRUZFRkVGRVVMKT4+MSk7CisKKyAgICAgICAgYj0gKih1aW50MzJfdCopJnNyY1tzdHJpZGUqNl07CisgICAgICAgIGM9IChiJmMpICsgKCgoYl5jKSYweEZFRkVGRUZFVUwpPj4xKTsKKyAgICAgICAgKih1aW50MzJfdCopJnNyY1tzdHJpZGUqNV09IChjfGEpIC0gKCgoY15hKSYweEZFRkVGRUZFVUwpPj4xKTsKKworICAgICAgICBjPSAqKHVpbnQzMl90Kikmc3JjW3N0cmlkZSo3XTsKKyAgICAgICAgYT0gKGEmYykgKyAoKChhXmMpJjB4RkVGRUZFRkVVTCk+PjEpOworICAgICAgICAqKHVpbnQzMl90Kikmc3JjW3N0cmlkZSo2XT0gKGF8YikgLSAoKChhXmIpJjB4RkVGRUZFRkVVTCk+PjEpOworCisgICAgICAgIGE9ICoodWludDMyX3QqKSZzcmNbc3RyaWRlKjhdOworICAgICAgICBiPSAoYSZiKSArICgoKGFeYikmMHhGRUZFRkVGRVVMKT4+MSk7CisgICAgICAgICoodWludDMyX3QqKSZzcmNbc3RyaWRlKjddPSAoY3xiKSAtICgoKGNeYikmMHhGRUZFRkVGRVVMKT4+MSk7CisKKyAgICAgICAgKih1aW50MzJfdCopJnRtcFtzdHJpZGUqMF09IGM7CisgICAgICAgIHNyYyArPSA0OworICAgICAgICB0bXAgKz0gNDsKKyAgICB9CisjZW5kaWYgLy9URU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cKK30KKworLyoqCisgKiBEZWludGVybGFjZSB0aGUgZ2l2ZW4gYmxvY2sgYnkgYXBwbHlpbmcgYSBtZWRpYW4gZmlsdGVyIHRvIGV2ZXJ5IHNlY29uZCBsaW5lLgorICogd2lsbCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IDh4OCBibG9jayBhbmQgY2FuIHJlYWQgJiB3cml0ZSBmcm9tIGxpbmUgNC0xNSwKKyAqIGxpbmVzIDAtMyBoYXZlIGJlZW4gcGFzc2VkIHRocm91Z2ggdGhlIGRlYmxvY2sgLyBkZXJpbmcgZmlsdGVycyBhbHJlYWR5LCBidXQgY2FuIGJlIHJlYWQsIHRvby4KKyAqIGxpbmVzIDQtMTIgd2lsbCBiZSByZWFkIGludG8gdGhlIGRlYmxvY2tpbmcgZmlsdGVyIGFuZCBzaG91bGQgYmUgZGVpbnRlcmxhY2VkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUoZGVJbnRlcmxhY2VNZWRpYW4pKHVpbnQ4X3Qgc3JjW10sIGludCBzdHJpZGUpCit7CisjaWYgVEVNUExBVEVfUFBfTU1YCisgICAgc3JjKz0gNCpzdHJpZGU7CisjaWYgVEVNUExBVEVfUFBfTU1YRVhUCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJSJSRUdfZCIgICAgICBcblx0IgorLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcgICAgICAgOCAgICAgICA5CisvLyAgICAgICUwICAgICAgZWF4ICAgICBlYXgrJTEgIGVheCsyJTEgJTArNCUxICBlZHggICAgIGVkeCslMSAgZWR4KzIlMSAlMCs4JTEgIGVkeCs0JTEKKworICAgICAgICAibW92cSAoJTApLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEpLCAlJW1tMiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtYXh1YiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWludWIgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1heHViICUlbW0yLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtaW51YiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAoJSUiUkVHX2EiKSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICglMCwgJTEsIDQpLCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgMiksICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWF4dWIgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1pbnViICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtYXh1YiAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWludWIgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgKCUlIlJFR19hIiwgJTEsIDIpICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAoJSUiUkVHX2QiKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19kIiwgJTEpLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1heHViICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtaW51YiAlJW1tMywgJSVtbTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWF4dWIgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1pbnViICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICglJSJSRUdfZCIpICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgKCUlIlJFR19kIiwgJTEsIDIpLCAlJW1tMiAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglMCwgJTEsIDgpLCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtYXh1YiAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWludWIgJSVtbTMsICUlbW0wICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1heHViICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtaW51YiAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0yLCAoJSUiUkVHX2QiLCAlMSwgMikgICAgICAgICBcblx0IgorCisKKyAgICAgICAgOiA6ICJyIiAoc3JjKSwgInIiICgoeDg2X3JlZylzdHJpZGUpCisgICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19kCisgICAgKTsKKworI2Vsc2UgLy8gTU1YIHdpdGhvdXQgTU1YMgorICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJsZWEgKCUwLCAlMSksICUlIlJFR19hIiAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJSRUdfYSIsICUxLCA0KSwgJSUiUkVHX2QiICAgICAgXG5cdCIKKy8vICAgICAgMCAgICAgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDggICAgICAgOQorLy8gICAgICAlMCAgICAgIGVheCAgICAgZWF4KyUxICBlYXgrMiUxICUwKzQlMSAgZWR4ICAgICBlZHgrJTEgIGVkeCsyJTEgJTArOCUxICBlZHgrNCUxCisgICAgICAgICJweG9yICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIFJFQUxfTUVESUFOKGEsYixjKVwKKyAgICAgICAgIm1vdnEgIiAjYSAiLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAiICNiICIsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI2MgIiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tMSwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ1c2IgJSVtbTEsICUlbW0zICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YnVzYiAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3VidXNiICUlbW0wLCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBjbXBlcWIgJSVtbTcsICUlbW0zICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGNtcGVxYiAlJW1tNywgJSVtbTQgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwY21wZXFiICUlbW03LCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTMsICUlbW02ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHhvciAlJW1tNCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJweG9yICUlbW01LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW01ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicG9yICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwb3IgJSVtbTQsICUlbW0yICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBvciAlJW1tNSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFuZCAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYW5kICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsICIgI2IgIiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZGVmaW5lIE1FRElBTihhLGIsYykgIFJFQUxfTUVESUFOKGEsYixjKQorCitNRURJQU4oKCUwKSAgICAgICAgLCAoJSVSRUdhKSAgICAgICAsICglJVJFR2EsICUxKSkKK01FRElBTigoJSVSRUdhLCAlMSksICglJVJFR2EsICUxLCAyKSwgKCUwLCAlMSwgNCkpCitNRURJQU4oKCUwLCAlMSwgNCkgLCAoJSVSRUdkKSAgICAgICAsICglJVJFR2QsICUxKSkKK01FRElBTigoJSVSRUdkLCAlMSksICglJVJFR2QsICUxLCAyKSwgKCUwLCAlMSwgOCkpCisKKyAgICAgICAgOiA6ICJyIiAoc3JjKSwgInIiICgoeDg2X3JlZylzdHJpZGUpCisgICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19kCisgICAgKTsKKyNlbmRpZiAvL1RFTVBMQVRFX1BQX01NWEVYVAorI2Vsc2UgLy9URU1QTEFURV9QUF9NTVgKKyAgICBpbnQgeCwgeTsKKyAgICBzcmMrPSA0KnN0cmlkZTsKKyAgICAvLyBGSVhNRSAtIHRoZXJlIHNob3VsZCBiZSBhIHdheSB0byBkbyBhIGZldyBjb2x1bW5zIGluIHBhcmFsbGVsIGxpa2Ugdy9tbXgKKyAgICBmb3IoeD0wOyB4PDg7IHgrKyl7CisgICAgICAgIHVpbnQ4X3QgKmNvbHNyYyA9IHNyYzsKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKXsKKyAgICAgICAgICAgIGludCBhLCBiLCBjLCBkLCBlLCBmOworICAgICAgICAgICAgYSA9IGNvbHNyY1swICAgICAgIF07CisgICAgICAgICAgICBiID0gY29sc3JjW3N0cmlkZSAgXTsKKyAgICAgICAgICAgIGMgPSBjb2xzcmNbc3RyaWRlKjJdOworICAgICAgICAgICAgZCA9IChhLWIpPj4zMTsKKyAgICAgICAgICAgIGUgPSAoYi1jKT4+MzE7CisgICAgICAgICAgICBmID0gKGMtYSk+PjMxOworICAgICAgICAgICAgY29sc3JjW3N0cmlkZSAgXSA9IChhfChkXmYpKSAmIChifChkXmUpKSAmIChjfChlXmYpKTsKKyAgICAgICAgICAgIGNvbHNyYyArPSBzdHJpZGUqMjsKKyAgICAgICAgfQorICAgICAgICBzcmMrKzsKKyAgICB9CisjZW5kaWYgLy9URU1QTEFURV9QUF9NTVgKK30KKworI2lmIFRFTVBMQVRFX1BQX01NWAorLyoqCisgKiBUcmFuc3Bvc2UgYW5kIHNoaWZ0IHRoZSBnaXZlbiA4eDggQmxvY2sgaW50byBkc3QxIGFuZCBkc3QyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHRyYW5zcG9zZTEpKHVpbnQ4X3QgKmRzdDEsIHVpbnQ4X3QgKmRzdDIsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY1N0cmlkZSkKK3sKKyAgICBfX2FzbV9fKAorICAgICAgICAibGVhICglMCwgJTEpLCAlJSJSRUdfYSIgICAgICAgICAgICAgICAgXG5cdCIKKy8vICAgICAgMCAgICAgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDggICAgICAgOQorLy8gICAgICAlMCAgICAgIGVheCAgICAgZWF4KyUxICBlYXgrMiUxICUwKzQlMSAgZWR4ICAgICBlZHgrJTEgIGVkeCsyJTEgJTArOCUxICBlZHgrNCUxCisgICAgICAgICJtb3ZxICglMCksICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAxMjM0NTY3OAorICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIgLy8gYWJjZGVmZ2gKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDEyMzQ1Njc4CisgICAgICAgICJwdW5wY2tsYncgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICBcblx0IiAvLyAxYTJiM2M0ZAorICAgICAgICAicHVucGNraGJ3ICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgXG5cdCIgLy8gNWU2ZjdnOGgKKworICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSksICUlbW0xICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMyAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tMywgJSVtbTQgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICUlbW0xLCAlJW1tMyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgJSVtbTQsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICUlbW00LCAlJW1tMSAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92ZCAlJW1tMCwgMTI4KCUyKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxxICQzMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0wLCAxNDQoJTIpICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tMywgMTYwKCUyKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxxICQzMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0zLCAxNzYoJTIpICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tMywgNDgoJTMpICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTIsIDE5MiglMikgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0yLCA2NCglMykgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDMyLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTIsIDgwKCUzKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0xLCA5NiglMykgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDMyLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTEsIDExMiglMykgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMSwgNCksICUlIlJFR19hIiAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgKCUwLCAlMSwgNCksICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiIC8vIDEyMzQ1Njc4CisgICAgICAgICJtb3ZxICglJSJSRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IiAvLyBhYmNkZWZnaAorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMTIzNDU2NzgKKyAgICAgICAgInB1bnBja2xidyAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDFhMmIzYzRkCisgICAgICAgICJwdW5wY2toYncgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IiAvLyA1ZTZmN2c4aAorCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxKSwgJSVtbTEgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgMiksICUlbW0zICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW0zLCAlJW1tNCAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tMCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgJSVtbTEsICUlbW0zICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tNCwgJSVtbTIgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgJSVtbTQsICUlbW0xICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZkICUlbW0wLCAxMzIoJTIpICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDMyLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTAsIDE0OCglMikgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0zLCAxNjQoJTIpICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDMyLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTMsIDE4MCglMikgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0zLCA1MiglMykgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tMiwgMTk2KCUyKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTIsIDY4KCUzKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JscSAkMzIsICUlbW0yICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tMiwgODQoJTMpICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTEsIDEwMCglMykgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JscSAkMzIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tMSwgMTE2KCUzKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworCisgICAgICAgIDo6ICJyIiAoc3JjKSwgInIiICgoeDg2X3JlZylzcmNTdHJpZGUpLCAiciIgKGRzdDEpLCAiciIgKGRzdDIpCisgICAgICAgIDogIiUiUkVHX2EKKyAgICApOworfQorCisvKioKKyAqIFRyYW5zcG9zZSB0aGUgZ2l2ZW4gOHg4IGJsb2NrLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHRyYW5zcG9zZTIpKHVpbnQ4X3QgKmRzdCwgaW50IGRzdFN0cmlkZSwgY29uc3QgdWludDhfdCAqc3JjKQoreworICAgIF9fYXNtX18oCisgICAgICAgICJsZWEgKCUwLCAlMSksICUlIlJFR19hIiAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJSRUdfYSIsJTEsNCksICUlIlJFR19kIiAgICAgICAgXG5cdCIKKy8vICAgICAgMCAgICAgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDggICAgICAgOQorLy8gICAgICAlMCAgICAgIGVheCAgICAgZWF4KyUxICBlYXgrMiUxICUwKzQlMSAgZWR4ICAgICBlZHgrJTEgIGVkeCsyJTEgJTArOCUxICBlZHgrNCUxCisgICAgICAgICJtb3ZxICglMiksICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAxMjM0NTY3OAorICAgICAgICAibW92cSAxNiglMiksICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gYWJjZGVmZ2gKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDEyMzQ1Njc4CisgICAgICAgICJwdW5wY2tsYncgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICBcblx0IiAvLyAxYTJiM2M0ZAorICAgICAgICAicHVucGNraGJ3ICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgXG5cdCIgLy8gNWU2ZjdnOGgKKworICAgICAgICAibW92cSAzMiglMiksICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgNDgoJTIpLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hidyAlJW1tMywgJSVtbTQgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICUlbW0xLCAlJW1tMyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgJSVtbTQsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICUlbW00LCAlJW1tMSAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92ZCAlJW1tMCwgKCUwKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxxICQzMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0wLCAoJSUiUkVHX2EiKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tMywgKCUlIlJFR19hIiwgJTEpICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxxICQzMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0zLCAoJSUiUkVHX2EiLCAlMSwgMikgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tMiwgKCUwLCAlMSwgNCkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxxICQzMiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0yLCAoJSUiUkVHX2QiKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tMSwgKCUlIlJFR19kIiwgJTEpICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxxICQzMiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0xLCAoJSUiUkVHX2QiLCAlMSwgMikgICAgICAgICBcblx0IgorCisKKyAgICAgICAgIm1vdnEgNjQoJTIpLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDEyMzQ1Njc4CisgICAgICAgICJtb3ZxIDgwKCUyKSwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBhYmNkZWZnaAorICAgICAgICAibW92cSAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMTIzNDU2NzgKKyAgICAgICAgInB1bnBja2xidyAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDFhMmIzYzRkCisgICAgICAgICJwdW5wY2toYncgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IiAvLyA1ZTZmN2c4aAorCisgICAgICAgICJtb3ZxIDk2KCUyKSwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAxMTIoJTIpLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJ3ICUlbW0zLCAlJW1tNCAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAlJW1tMCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgJSVtbTEsICUlbW0zICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tNCwgJSVtbTIgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgJSVtbTQsICUlbW0xICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZkICUlbW0wLCA0KCUwKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDMyLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTAsIDQoJSUiUkVHX2EiKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0zLCA0KCUlIlJFR19hIiwgJTEpICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDMyLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTMsIDQoJSUiUkVHX2EiLCAlMSwgMikgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0yLCA0KCUwLCAlMSwgNCkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDMyLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTIsIDQoJSUiUkVHX2QiKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0xLCA0KCUlIlJFR19kIiwgJTEpICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybHEgJDMyLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTEsIDQoJSUiUkVHX2QiLCAlMSwgMikgICAgICAgIFxuXHQiCisKKyAgICAgICAgOjogInIiIChkc3QpLCAiciIgKCh4ODZfcmVnKWRzdFN0cmlkZSksICJyIiAoc3JjKQorICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfZAorICAgICk7Cit9CisjZW5kaWYgLy9URU1QTEFURV9QUF9NTVgKKy8vc3RhdGljIGxvbmcgdGVzdD0wOworCisjaWYgIVRFTVBMQVRFX1BQX0FMVElWRUMKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUodGVtcE5vaXNlUmVkdWNlcikodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdGVtcEJsdXJyZWQsIHVpbnQzMl90ICp0ZW1wQmx1cnJlZFBhc3QsIGNvbnN0IGludCAqbWF4Tm9pc2UpCit7CisgICAgLy8gdG8gc2F2ZSBhIHJlZ2lzdGVyIChGSVhNRSBkbyB0aGlzIG91dHNpZGUgb2YgdGhlIGxvb3BzKQorICAgIHRlbXBCbHVycmVkUGFzdFsxMjddPSBtYXhOb2lzZVswXTsKKyAgICB0ZW1wQmx1cnJlZFBhc3RbMTI4XT0gbWF4Tm9pc2VbMV07CisgICAgdGVtcEJsdXJyZWRQYXN0WzEyOV09IG1heE5vaXNlWzJdOworCisjZGVmaW5lIEZBU1RfTDJfRElGRgorLy8jZGVmaW5lIEwxX0RJRkYgLy91IHNob3VsZCBjaGFuZ2UgdGhlIHRocmVzaG9sZHMgdG9vIGlmIHUgdHJ5IHRoYXQgb25lCisjaWYgKFRFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVykgJiYgSEFWRV82UkVHUworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJsZWEgKCUyLCAlMiwgMiksICUlIlJFR19hIiAgICAgICAgICAgICBcblx0IiAvLyAzKnN0cmlkZQorICAgICAgICAibGVhICglMiwgJTIsIDQpLCAlJSJSRUdfZCIgICAgICAgICAgICAgXG5cdCIgLy8gNSpzdHJpZGUKKyAgICAgICAgImxlYSAoJSUiUkVHX2QiLCAlMiwgMiksICUlIlJFR19jIiAgICAgIFxuXHQiIC8vIDcqc3RyaWRlCisvLyAgICAgIDAgICAgICAgMSAgICAgICAyICAgICAgIDMgICAgICAgNCAgICAgICA1ICAgICAgIDYgICAgICAgNyAgICAgICA4ICAgICAgIDkKKy8vICAgICAgJXggICAgICAleCslMiAgICV4KzIlMiAgJXgrZWF4ICAleCs0JTIgICV4K2VkeCAgJXgrMmVheCAleCtlY3ggICV4KzglMgorLy9GSVhNRSByZW9yZGVyPworI2lmZGVmIEwxX0RJRkYgLy9uZWVkcyBtbXgyCisgICAgICAgICJtb3ZxICglMCksICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMAorICAgICAgICAicHNhZGJ3ICglMSksICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfEwwLVIwfAorICAgICAgICAibW92cSAoJTAsICUyKSwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEKKyAgICAgICAgInBzYWRidyAoJTEsICUyKSwgJSVtbTEgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHxMMS1SMXwKKyAgICAgICAgIm1vdnEgKCUwLCAlMiwgMiksICUlbW0yICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwyCisgICAgICAgICJwc2FkYncgKCUxLCAlMiwgMiksICUlbW0yICAgICAgICAgICAgICBcblx0IiAvLyB8TDItUjJ8CisgICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2EiKSwgJSVtbTMgICAgICAgICAgICBcblx0IiAvLyBMMworICAgICAgICAicHNhZGJ3ICglMSwgJSUiUkVHX2EiKSwgJSVtbTMgICAgICAgICAgXG5cdCIgLy8gfEwzLVIzfAorCisgICAgICAgICJtb3ZxICglMCwgJTIsIDQpLCAlJW1tNCAgICAgICAgICAgICAgICBcblx0IiAvLyBMNAorICAgICAgICAicGFkZHcgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzYWRidyAoJTEsICUyLCA0KSwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8vIHxMNC1SNHwKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfZCIpLCAlJW1tNSAgICAgICAgICAgIFxuXHQiIC8vIEw1CisgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNhZGJ3ICglMSwgJSUiUkVHX2QiKSwgJSVtbTUgICAgICAgICAgXG5cdCIgLy8gfEw1LVI1fAorICAgICAgICAibW92cSAoJTAsICUlIlJFR19hIiwgMiksICUlbW02ICAgICAgICAgXG5cdCIgLy8gTDYKKyAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2FkYncgKCUxLCAlJSJSRUdfYSIsIDIpLCAlJW1tNiAgICAgICBcblx0IiAvLyB8TDYtUjZ8CisgICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2MiKSwgJSVtbTcgICAgICAgICAgICBcblx0IiAvLyBMNworICAgICAgICAicGFkZHcgJSVtbTQsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzYWRidyAoJTEsICUlIlJFR19jIiksICUlbW03ICAgICAgICAgIFxuXHQiIC8vIHxMNy1SN3wKKyAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHcgJSVtbTYsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbHNlIC8vTDFfRElGRgorI2lmIGRlZmluZWQgKEZBU1RfTDJfRElGRikKKyAgICAgICAgInBjbXBlcWIgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICJNQU5HTEUoYjgwKSIsICUlbW02ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tMCwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNkZWZpbmUgUkVBTF9MMl9ESUZGX0NPUkUoYSwgYilcCisgICAgICAgICJtb3ZxICIgI2EgIiwgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjYiAiLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHhvciAlJW1tNywgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tNSlcCisgICAgICAgICJwYWRkYiAlJW1tNiwgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHNsbHcgJDgsICUlbW01ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwbWFkZHdkICUlbW01LCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZGQgJSVtbTIsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JsZCAkMTQsICUlbW01ICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGRkICUlbW01LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNlbHNlIC8vZGVmaW5lZCAoRkFTVF9MMl9ESUZGKQorICAgICAgICAicHhvciAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTAsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZGVmaW5lIFJFQUxfTDJfRElGRl9DT1JFKGEsIGIpXAorICAgICAgICAibW92cSAiICNhICIsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI2IgIiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW01ICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTEgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0zICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwbWFkZHdkICUlbW01LCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW0xICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZGQgJSVtbTEsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWRkZCAlJW1tNSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZW5kaWYgLy9kZWZpbmVkIChGQVNUX0wyX0RJRkYpCisKKyNkZWZpbmUgTDJfRElGRl9DT1JFKGEsIGIpICBSRUFMX0wyX0RJRkZfQ09SRShhLCBiKQorCitMMl9ESUZGX0NPUkUoKCUwKSAgICAgICAgICAsICglMSkpCitMMl9ESUZGX0NPUkUoKCUwLCAlMikgICAgICAsICglMSwgJTIpKQorTDJfRElGRl9DT1JFKCglMCwgJTIsIDIpICAgLCAoJTEsICUyLCAyKSkKK0wyX0RJRkZfQ09SRSgoJTAsICUlUkVHYSkgICwgKCUxLCAlJVJFR2EpKQorTDJfRElGRl9DT1JFKCglMCwgJTIsIDQpICAgLCAoJTEsICUyLCA0KSkKK0wyX0RJRkZfQ09SRSgoJTAsICUlUkVHZCkgICwgKCUxLCAlJVJFR2QpKQorTDJfRElGRl9DT1JFKCglMCwgJSVSRUdhLDIpLCAoJTEsICUlUkVHYSwyKSkKK0wyX0RJRkZfQ09SRSgoJTAsICUlUkVHYykgICwgKCUxLCAlJVJFR2MpKQorCisjZW5kaWYgLy9MMV9ESUZGCisKKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JscSAkMzIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGQgJSVtbTAsICUlbW00ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTQsICUlZWN4ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaGxsICQyLCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICUzLCAlJSJSRUdfZCIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGwgLTQoJSUiUkVHX2QiKSwgJSVlY3ggICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRsIDQoJSUiUkVHX2QiKSwgJSVlY3ggICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkbCAtMTAyNCglJSJSRUdfZCIpLCAlJWVjeCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGwgJDQsICUlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRsIDEwMjQoJSUiUkVHX2QiKSwgJSVlY3ggICAgICAgICAgICBcblx0IgorICAgICAgICAic2hybCAkMywgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmwgJSVlY3gsICglJSJSRUdfZCIpICAgICAgICAgICAgICAgIFxuXHQiCisKKy8vICAgICAgICAibW92ICUzLCAlJSJSRUdfYyIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKy8vICAgICAgICAibW92ICUlIlJFR19jIiwgdGVzdCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKy8vICAgICAgICAiam1wIDRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImNtcGwgNTEyKCUlIlJFR19kIiksICUlZWN4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIgamIgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiY21wbCA1MTYoJSUiUkVHX2QiKSwgJSVlY3ggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIiBqYiAxZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMiwgMiksICUlIlJFR19kIiAgICAgIFxuXHQiIC8vIDUqc3RyaWRlCisgICAgICAgICJsZWEgKCUlIlJFR19kIiwgJTIsIDIpLCAlJSJSRUdfYyIgICAgICBcblx0IiAvLyA3KnN0cmlkZQorICAgICAgICAibW92cSAoJTApLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDAKKyAgICAgICAgIm1vdnEgKCUwLCAlMiksICUlbW0xICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwxCisgICAgICAgICJtb3ZxICglMCwgJTIsIDIpLCAlJW1tMiAgICAgICAgICAgICAgICBcblx0IiAvLyBMMgorICAgICAgICAibW92cSAoJTAsICUlIlJFR19hIiksICUlbW0zICAgICAgICAgICAgXG5cdCIgLy8gTDMKKyAgICAgICAgIm1vdnEgKCUwLCAlMiwgNCksICUlbW00ICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw0CisgICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2QiKSwgJSVtbTUgICAgICAgICAgICBcblx0IiAvLyBMNQorICAgICAgICAibW92cSAoJTAsICUlIlJFR19hIiwgMiksICUlbW02ICAgICAgICAgXG5cdCIgLy8gTDYKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYyIpLCAlJW1tNyAgICAgICAgICAgIFxuXHQiIC8vIEw3CisgICAgICAgICJtb3ZxICUlbW0wLCAoJTEpICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMAorICAgICAgICAibW92cSAlJW1tMSwgKCUxLCAlMikgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEKKyAgICAgICAgIm1vdnEgJSVtbTIsICglMSwgJTIsIDIpICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwyCisgICAgICAgICJtb3ZxICUlbW0zLCAoJTEsICUlIlJFR19hIikgICAgICAgICAgICBcblx0IiAvLyBMMworICAgICAgICAibW92cSAlJW1tNCwgKCUxLCAlMiwgNCkgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDQKKyAgICAgICAgIm1vdnEgJSVtbTUsICglMSwgJSUiUkVHX2QiKSAgICAgICAgICAgIFxuXHQiIC8vIEw1CisgICAgICAgICJtb3ZxICUlbW02LCAoJTEsICUlIlJFR19hIiwgMikgICAgICAgICBcblx0IiAvLyBMNgorICAgICAgICAibW92cSAlJW1tNywgKCUxLCAlJSJSRUdfYyIpICAgICAgICAgICAgXG5cdCIgLy8gTDcKKyAgICAgICAgImptcCA0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTIsIDIpLCAlJSJSRUdfZCIgICAgICBcblx0IiAvLyA1KnN0cmlkZQorICAgICAgICAibGVhICglJSJSRUdfZCIsICUyLCAyKSwgJSUiUkVHX2MiICAgICAgXG5cdCIgLy8gNypzdHJpZGUKKyAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwwCisgICAgICAgIFBBVkdCKCglMSksICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMMAorICAgICAgICAibW92cSAoJTAsICUyKSwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEKKyAgICAgICAgUEFWR0IoKCUxLCAlMiksICUlbW0xKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEwxCisgICAgICAgICJtb3ZxICglMCwgJTIsIDIpLCAlJW1tMiAgICAgICAgICAgICAgICBcblx0IiAvLyBMMgorICAgICAgICBQQVZHQigoJTEsICUyLCAyKSwgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgLy8gTDIKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIpLCAlJW1tMyAgICAgICAgICAgIFxuXHQiIC8vIEwzCisgICAgICAgIFBBVkdCKCglMSwgJSVSRUdhKSwgJSVtbTMpICAgICAgICAgICAgICAgICAgICAvLyBMMworICAgICAgICAibW92cSAoJTAsICUyLCA0KSwgJSVtbTQgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDQKKyAgICAgICAgUEFWR0IoKCUxLCAlMiwgNCksICUlbW00KSAgICAgICAgICAgICAgICAgICAgIC8vIEw0CisgICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2QiKSwgJSVtbTUgICAgICAgICAgICBcblx0IiAvLyBMNQorICAgICAgICBQQVZHQigoJTEsICUlUkVHZCksICUlbW01KSAgICAgICAgICAgICAgICAgICAgLy8gTDUKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIsIDIpLCAlJW1tNiAgICAgICAgIFxuXHQiIC8vIEw2CisgICAgICAgIFBBVkdCKCglMSwgJSVSRUdhLCAyKSwgJSVtbTYpICAgICAgICAgICAgICAgICAvLyBMNgorICAgICAgICAibW92cSAoJTAsICUlIlJFR19jIiksICUlbW03ICAgICAgICAgICAgXG5cdCIgLy8gTDcKKyAgICAgICAgUEFWR0IoKCUxLCAlJVJFR2MpLCAlJW1tNykgICAgICAgICAgICAgICAgICAgIC8vIEw3CisgICAgICAgICJtb3ZxICUlbW0wLCAoJTEpICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBSMAorICAgICAgICAibW92cSAlJW1tMSwgKCUxLCAlMikgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjEKKyAgICAgICAgIm1vdnEgJSVtbTIsICglMSwgJTIsIDIpICAgICAgICAgICAgICAgIFxuXHQiIC8vIFIyCisgICAgICAgICJtb3ZxICUlbW0zLCAoJTEsICUlIlJFR19hIikgICAgICAgICAgICBcblx0IiAvLyBSMworICAgICAgICAibW92cSAlJW1tNCwgKCUxLCAlMiwgNCkgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjQKKyAgICAgICAgIm1vdnEgJSVtbTUsICglMSwgJSUiUkVHX2QiKSAgICAgICAgICAgIFxuXHQiIC8vIFI1CisgICAgICAgICJtb3ZxICUlbW02LCAoJTEsICUlIlJFR19hIiwgMikgICAgICAgICBcblx0IiAvLyBSNgorICAgICAgICAibW92cSAlJW1tNywgKCUxLCAlJSJSRUdfYyIpICAgICAgICAgICAgXG5cdCIgLy8gUjcKKyAgICAgICAgIm1vdnEgJSVtbTAsICglMCkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwwCisgICAgICAgICJtb3ZxICUlbW0xLCAoJTAsICUyKSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMQorICAgICAgICAibW92cSAlJW1tMiwgKCUwLCAlMiwgMikgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDIKKyAgICAgICAgIm1vdnEgJSVtbTMsICglMCwgJSUiUkVHX2EiKSAgICAgICAgICAgIFxuXHQiIC8vIEwzCisgICAgICAgICJtb3ZxICUlbW00LCAoJTAsICUyLCA0KSAgICAgICAgICAgICAgICBcblx0IiAvLyBMNAorICAgICAgICAibW92cSAlJW1tNSwgKCUwLCAlJSJSRUdfZCIpICAgICAgICAgICAgXG5cdCIgLy8gTDUKKyAgICAgICAgIm1vdnEgJSVtbTYsICglMCwgJSUiUkVHX2EiLCAyKSAgICAgICAgIFxuXHQiIC8vIEw2CisgICAgICAgICJtb3ZxICUlbW03LCAoJTAsICUlIlJFR19jIikgICAgICAgICAgICBcblx0IiAvLyBMNworICAgICAgICAiam1wIDRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImNtcGwgNTA4KCUlIlJFR19kIiksICUlZWN4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIgamIgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTIsIDIpLCAlJSJSRUdfZCIgICAgICBcblx0IiAvLyA1KnN0cmlkZQorICAgICAgICAibGVhICglJSJSRUdfZCIsICUyLCAyKSwgJSUiUkVHX2MiICAgICAgXG5cdCIgLy8gNypzdHJpZGUKKyAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwwCisgICAgICAgICJtb3ZxICglMCwgJTIpLCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMQorICAgICAgICAibW92cSAoJTAsICUyLCAyKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDIKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIpLCAlJW1tMyAgICAgICAgICAgIFxuXHQiIC8vIEwzCisgICAgICAgICJtb3ZxICglMSksICUlbW00ICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBSMAorICAgICAgICAibW92cSAoJTEsICUyKSwgJSVtbTUgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjEKKyAgICAgICAgIm1vdnEgKCUxLCAlMiwgMiksICUlbW02ICAgICAgICAgICAgICAgIFxuXHQiIC8vIFIyCisgICAgICAgICJtb3ZxICglMSwgJSUiUkVHX2EiKSwgJSVtbTcgICAgICAgICAgICBcblx0IiAvLyBSMworICAgICAgICBQQVZHQiglJW1tNCwgJSVtbTApCisgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tMSkKKyAgICAgICAgUEFWR0IoJSVtbTYsICUlbW0yKQorICAgICAgICBQQVZHQiglJW1tNywgJSVtbTMpCisgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tMCkKKyAgICAgICAgUEFWR0IoJSVtbTUsICUlbW0xKQorICAgICAgICBQQVZHQiglJW1tNiwgJSVtbTIpCisgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tMykKKyAgICAgICAgIm1vdnEgJSVtbTAsICglMSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIFIwCisgICAgICAgICJtb3ZxICUlbW0xLCAoJTEsICUyKSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBSMQorICAgICAgICAibW92cSAlJW1tMiwgKCUxLCAlMiwgMikgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjIKKyAgICAgICAgIm1vdnEgJSVtbTMsICglMSwgJSUiUkVHX2EiKSAgICAgICAgICAgIFxuXHQiIC8vIFIzCisgICAgICAgICJtb3ZxICUlbW0wLCAoJTApICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMAorICAgICAgICAibW92cSAlJW1tMSwgKCUwLCAlMikgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEKKyAgICAgICAgIm1vdnEgJSVtbTIsICglMCwgJTIsIDIpICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwyCisgICAgICAgICJtb3ZxICUlbW0zLCAoJTAsICUlIlJFR19hIikgICAgICAgICAgICBcblx0IiAvLyBMMworCisgICAgICAgICJtb3ZxICglMCwgJTIsIDQpLCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IiAvLyBMNAorICAgICAgICAibW92cSAoJTAsICUlIlJFR19kIiksICUlbW0xICAgICAgICAgICAgXG5cdCIgLy8gTDUKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIsIDIpLCAlJW1tMiAgICAgICAgIFxuXHQiIC8vIEw2CisgICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2MiKSwgJSVtbTMgICAgICAgICAgICBcblx0IiAvLyBMNworICAgICAgICAibW92cSAoJTEsICUyLCA0KSwgJSVtbTQgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjQKKyAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfZCIpLCAlJW1tNSAgICAgICAgICAgIFxuXHQiIC8vIFI1CisgICAgICAgICJtb3ZxICglMSwgJSUiUkVHX2EiLCAyKSwgJSVtbTYgICAgICAgICBcblx0IiAvLyBSNgorICAgICAgICAibW92cSAoJTEsICUlIlJFR19jIiksICUlbW03ICAgICAgICAgICAgXG5cdCIgLy8gUjcKKyAgICAgICAgUEFWR0IoJSVtbTQsICUlbW0wKQorICAgICAgICBQQVZHQiglJW1tNSwgJSVtbTEpCisgICAgICAgIFBBVkdCKCUlbW02LCAlJW1tMikKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0zKQorICAgICAgICBQQVZHQiglJW1tNCwgJSVtbTApCisgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tMSkKKyAgICAgICAgUEFWR0IoJSVtbTYsICUlbW0yKQorICAgICAgICBQQVZHQiglJW1tNywgJSVtbTMpCisgICAgICAgICJtb3ZxICUlbW0wLCAoJTEsICUyLCA0KSAgICAgICAgICAgICAgICBcblx0IiAvLyBSNAorICAgICAgICAibW92cSAlJW1tMSwgKCUxLCAlJSJSRUdfZCIpICAgICAgICAgICAgXG5cdCIgLy8gUjUKKyAgICAgICAgIm1vdnEgJSVtbTIsICglMSwgJSUiUkVHX2EiLCAyKSAgICAgICAgIFxuXHQiIC8vIFI2CisgICAgICAgICJtb3ZxICUlbW0zLCAoJTEsICUlIlJFR19jIikgICAgICAgICAgICBcblx0IiAvLyBSNworICAgICAgICAibW92cSAlJW1tMCwgKCUwLCAlMiwgNCkgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDQKKyAgICAgICAgIm1vdnEgJSVtbTEsICglMCwgJSUiUkVHX2QiKSAgICAgICAgICAgIFxuXHQiIC8vIEw1CisgICAgICAgICJtb3ZxICUlbW0yLCAoJTAsICUlIlJFR19hIiwgMikgICAgICAgICBcblx0IiAvLyBMNgorICAgICAgICAibW92cSAlJW1tMywgKCUwLCAlJSJSRUdfYyIpICAgICAgICAgICAgXG5cdCIgLy8gTDcKKyAgICAgICAgImptcCA0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTIsIDIpLCAlJSJSRUdfZCIgICAgICBcblx0IiAvLyA1KnN0cmlkZQorICAgICAgICAibGVhICglJSJSRUdfZCIsICUyLCAyKSwgJSUiUkVHX2MiICAgICAgXG5cdCIgLy8gNypzdHJpZGUKKyAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwwCisgICAgICAgICJtb3ZxICglMCwgJTIpLCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMQorICAgICAgICAibW92cSAoJTAsICUyLCAyKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDIKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIpLCAlJW1tMyAgICAgICAgICAgIFxuXHQiIC8vIEwzCisgICAgICAgICJtb3ZxICglMSksICUlbW00ICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBSMAorICAgICAgICAibW92cSAoJTEsICUyKSwgJSVtbTUgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjEKKyAgICAgICAgIm1vdnEgKCUxLCAlMiwgMiksICUlbW02ICAgICAgICAgICAgICAgIFxuXHQiIC8vIFIyCisgICAgICAgICJtb3ZxICglMSwgJSUiUkVHX2EiKSwgJSVtbTcgICAgICAgICAgICBcblx0IiAvLyBSMworICAgICAgICBQQVZHQiglJW1tNCwgJSVtbTApCisgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tMSkKKyAgICAgICAgUEFWR0IoJSVtbTYsICUlbW0yKQorICAgICAgICBQQVZHQiglJW1tNywgJSVtbTMpCisgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tMCkKKyAgICAgICAgUEFWR0IoJSVtbTUsICUlbW0xKQorICAgICAgICBQQVZHQiglJW1tNiwgJSVtbTIpCisgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tMykKKyAgICAgICAgUEFWR0IoJSVtbTQsICUlbW0wKQorICAgICAgICBQQVZHQiglJW1tNSwgJSVtbTEpCisgICAgICAgIFBBVkdCKCUlbW02LCAlJW1tMikKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0zKQorICAgICAgICAibW92cSAlJW1tMCwgKCUxKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjAKKyAgICAgICAgIm1vdnEgJSVtbTEsICglMSwgJTIpICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIFIxCisgICAgICAgICJtb3ZxICUlbW0yLCAoJTEsICUyLCAyKSAgICAgICAgICAgICAgICBcblx0IiAvLyBSMgorICAgICAgICAibW92cSAlJW1tMywgKCUxLCAlJSJSRUdfYSIpICAgICAgICAgICAgXG5cdCIgLy8gUjMKKyAgICAgICAgIm1vdnEgJSVtbTAsICglMCkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwwCisgICAgICAgICJtb3ZxICUlbW0xLCAoJTAsICUyKSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMQorICAgICAgICAibW92cSAlJW1tMiwgKCUwLCAlMiwgMikgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDIKKyAgICAgICAgIm1vdnEgJSVtbTMsICglMCwgJSUiUkVHX2EiKSAgICAgICAgICAgIFxuXHQiIC8vIEwzCisKKyAgICAgICAgIm1vdnEgKCUwLCAlMiwgNCksICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw0CisgICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2QiKSwgJSVtbTEgICAgICAgICAgICBcblx0IiAvLyBMNQorICAgICAgICAibW92cSAoJTAsICUlIlJFR19hIiwgMiksICUlbW0yICAgICAgICAgXG5cdCIgLy8gTDYKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYyIpLCAlJW1tMyAgICAgICAgICAgIFxuXHQiIC8vIEw3CisgICAgICAgICJtb3ZxICglMSwgJTIsIDQpLCAlJW1tNCAgICAgICAgICAgICAgICBcblx0IiAvLyBSNAorICAgICAgICAibW92cSAoJTEsICUlIlJFR19kIiksICUlbW01ICAgICAgICAgICAgXG5cdCIgLy8gUjUKKyAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIsIDIpLCAlJW1tNiAgICAgICAgIFxuXHQiIC8vIFI2CisgICAgICAgICJtb3ZxICglMSwgJSUiUkVHX2MiKSwgJSVtbTcgICAgICAgICAgICBcblx0IiAvLyBSNworICAgICAgICBQQVZHQiglJW1tNCwgJSVtbTApCisgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tMSkKKyAgICAgICAgUEFWR0IoJSVtbTYsICUlbW0yKQorICAgICAgICBQQVZHQiglJW1tNywgJSVtbTMpCisgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tMCkKKyAgICAgICAgUEFWR0IoJSVtbTUsICUlbW0xKQorICAgICAgICBQQVZHQiglJW1tNiwgJSVtbTIpCisgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tMykKKyAgICAgICAgUEFWR0IoJSVtbTQsICUlbW0wKQorICAgICAgICBQQVZHQiglJW1tNSwgJSVtbTEpCisgICAgICAgIFBBVkdCKCUlbW02LCAlJW1tMikKKyAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0zKQorICAgICAgICAibW92cSAlJW1tMCwgKCUxLCAlMiwgNCkgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjQKKyAgICAgICAgIm1vdnEgJSVtbTEsICglMSwgJSUiUkVHX2QiKSAgICAgICAgICAgIFxuXHQiIC8vIFI1CisgICAgICAgICJtb3ZxICUlbW0yLCAoJTEsICUlIlJFR19hIiwgMikgICAgICAgICBcblx0IiAvLyBSNgorICAgICAgICAibW92cSAlJW1tMywgKCUxLCAlJSJSRUdfYyIpICAgICAgICAgICAgXG5cdCIgLy8gUjcKKyAgICAgICAgIm1vdnEgJSVtbTAsICglMCwgJTIsIDQpICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw0CisgICAgICAgICJtb3ZxICUlbW0xLCAoJTAsICUlIlJFR19kIikgICAgICAgICAgICBcblx0IiAvLyBMNQorICAgICAgICAibW92cSAlJW1tMiwgKCUwLCAlJSJSRUdfYSIsIDIpICAgICAgICAgXG5cdCIgLy8gTDYKKyAgICAgICAgIm1vdnEgJSVtbTMsICglMCwgJSUiUkVHX2MiKSAgICAgICAgICAgIFxuXHQiIC8vIEw3CisKKyAgICAgICAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOjogInIiIChzcmMpLCAiciIgKHRlbXBCbHVycmVkKSwgInIiKCh4ODZfcmVnKXN0cmlkZSksICJtIiAodGVtcEJsdXJyZWRQYXN0KQorICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChiODApCisgICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19kLCAiJSJSRUdfYywgIm1lbW9yeSIKKyAgICApOworI2Vsc2UgLy8oVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XKSAmJiBIQVZFXzZSRUdTCit7CisgICAgaW50IHk7CisgICAgaW50IGQ9MDsKKy8vICAgIGludCBzeXNkPTA7CisgICAgaW50IGk7CisKKyAgICBmb3IoeT0wOyB5PDg7IHkrKyl7CisgICAgICAgIGludCB4OworICAgICAgICBmb3IoeD0wOyB4PDg7IHgrKyl7CisgICAgICAgICAgICBpbnQgcmVmPSB0ZW1wQmx1cnJlZFsgeCArIHkqc3RyaWRlIF07CisgICAgICAgICAgICBpbnQgY3VyPSBzcmNbIHggKyB5KnN0cmlkZSBdOworICAgICAgICAgICAgaW50IGQxPXJlZiAtIGN1cjsKKy8vICAgICAgICAgICAgaWYoeD09MCB8fCB4PT03KSBkMSs9IGQxPj4xOworLy8gICAgICAgICAgICBpZih5PT0wIHx8IHk9PTcpIGQxKz0gZDE+PjE7CisvLyAgICAgICAgICAgIGQrPSBGRkFCUyhkMSk7CisgICAgICAgICAgICBkKz0gZDEqZDE7CisvLyAgICAgICAgICAgIHN5c2QrPSBkMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpPWQ7CisgICAgZD0gICgKKyAgICAgICAgNCpkCisgICAgICAgICsoKih0ZW1wQmx1cnJlZFBhc3QtMjU2KSkKKyAgICAgICAgKygqKHRlbXBCbHVycmVkUGFzdC0xKSkrICgqKHRlbXBCbHVycmVkUGFzdCsxKSkKKyAgICAgICAgKygqKHRlbXBCbHVycmVkUGFzdCsyNTYpKQorICAgICAgICArNCk+PjM7CisgICAgKnRlbXBCbHVycmVkUGFzdD1pOworLy8gICAgKCgqdGVtcEJsdXJyZWRQYXN0KSozICsgZCArIDIpPj4yOworCisvKgorU3dpdGNoIGJldHdlZW4KKyAxICAwICAwICAwICAwICAwICAwICAoMCkKKzY0IDMyIDE2ICA4ICA0ICAyICAxICAoMSkKKzY0IDQ4IDM2IDI3IDIwIDE1IDExICgzMykgKGFwcHJveCkKKzY0IDU2IDQ5IDQzIDM3IDMzIDI5ICgyMDApIChhcHByb3gpCisqLworICAgIGlmKGQgPiBtYXhOb2lzZVsxXSl7CisgICAgICAgIGlmKGQgPCBtYXhOb2lzZVsyXSl7CisgICAgICAgICAgICBmb3IoeT0wOyB5PDg7IHkrKyl7CisgICAgICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDw4OyB4KyspeworICAgICAgICAgICAgICAgICAgICBpbnQgcmVmPSB0ZW1wQmx1cnJlZFsgeCArIHkqc3RyaWRlIF07CisgICAgICAgICAgICAgICAgICAgIGludCBjdXI9IHNyY1sgeCArIHkqc3RyaWRlIF07CisgICAgICAgICAgICAgICAgICAgIHRlbXBCbHVycmVkWyB4ICsgeSpzdHJpZGUgXT0KKyAgICAgICAgICAgICAgICAgICAgc3JjWyB4ICsgeSpzdHJpZGUgXT0KKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWYgKyBjdXIgKyAxKT4+MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZm9yKHk9MDsgeTw4OyB5KyspeworICAgICAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8ODsgeCsrKXsKKyAgICAgICAgICAgICAgICAgICAgdGVtcEJsdXJyZWRbIHggKyB5KnN0cmlkZSBdPSBzcmNbIHggKyB5KnN0cmlkZSBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBpZihkIDwgbWF4Tm9pc2VbMF0peworICAgICAgICAgICAgZm9yKHk9MDsgeTw4OyB5KyspeworICAgICAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8ODsgeCsrKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlZj0gdGVtcEJsdXJyZWRbIHggKyB5KnN0cmlkZSBdOworICAgICAgICAgICAgICAgICAgICBpbnQgY3VyPSBzcmNbIHggKyB5KnN0cmlkZSBdOworICAgICAgICAgICAgICAgICAgICB0ZW1wQmx1cnJlZFsgeCArIHkqc3RyaWRlIF09CisgICAgICAgICAgICAgICAgICAgIHNyY1sgeCArIHkqc3RyaWRlIF09CisgICAgICAgICAgICAgICAgICAgICAgICAocmVmKjcgKyBjdXIgKyA0KT4+MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZm9yKHk9MDsgeTw4OyB5KyspeworICAgICAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8ODsgeCsrKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlZj0gdGVtcEJsdXJyZWRbIHggKyB5KnN0cmlkZSBdOworICAgICAgICAgICAgICAgICAgICBpbnQgY3VyPSBzcmNbIHggKyB5KnN0cmlkZSBdOworICAgICAgICAgICAgICAgICAgICB0ZW1wQmx1cnJlZFsgeCArIHkqc3RyaWRlIF09CisgICAgICAgICAgICAgICAgICAgIHNyY1sgeCArIHkqc3RyaWRlIF09CisgICAgICAgICAgICAgICAgICAgICAgICAocmVmKjMgKyBjdXIgKyAyKT4+MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLy8oVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XKSAmJiBIQVZFXzZSRUdTCit9CisjZW5kaWYgLy9URU1QTEFURV9QUF9BTFRJVkVDCisKKyNpZiBURU1QTEFURV9QUF9NTVgKKy8qKgorICogYWNjdXJhdGUgZGVibG9jayBmaWx0ZXIKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBSRU5BTUUoZG9fYV9kZWJsb2NrKSh1aW50OF90ICpzcmMsIGludCBzdGVwLCBpbnQgc3RyaWRlLCBjb25zdCBQUENvbnRleHQgKmMsIGludCBtb2RlKXsKKyAgICBpbnQ2NF90IGRjX21hc2ssIGVxX21hc2ssIGJvdGhfbWFza3M7CisgICAgaW50NjRfdCBzdW1zWzEwKjgqMl07CisgICAgc3JjKz0gc3RlcCozOyAvLyBzcmMgcG9pbnRzIHRvIGJlZ2luIG9mIHRoZSA4eDggQmxvY2sKKyAgICAvL3sgU1RBUlRfVElNRVIKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92cSAlMCwgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJTEsICUlbW02ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogOiAibSIgKGMtPm1teERjT2Zmc2V0W2MtPm5vbkJRUF0pLCAgIm0iIChjLT5tbXhEY1RocmVzaG9sZFtjLT5ub25CUVBdKQorICAgICAgICApOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAoJTIsICUzKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisvLyAgICAgIDAgICAgICAgMSAgICAgICAyICAgICAgIDMgICAgICAgNCAgICAgICA1ICAgICAgIDYgICAgICAgNyAgICAgICA4ICAgICAgIDkKKy8vICAgICAgJTEgICAgICBlYXggICAgIGVheCslMiAgZWF4KzIlMiAlMSs0JTIgIGVjeCAgICAgZWN4KyUyICBlY3grMiUyICUxKzglMiAgZWN4KzQlMgorCisgICAgICAgICJtb3ZxICglMiksICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmIgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbW0wID0gZGlmZmVyZW5jZQorICAgICAgICAicGFkZGIgJSVtbTcsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndGIgJSVtbTYsICUlbW0wICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwlMyksICUlbW0yICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBNQVhVQiglJW1tMiwgJSVtbTQpCisgICAgICAgIFBNSU5VQiglJW1tMiwgJSVtbTMsICUlbW01KQorICAgICAgICAicHN1YmIgJSVtbTIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW03LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMywgMiksICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgUE1BWFVCKCUlbW0xLCAlJW1tNCkKKyAgICAgICAgUE1JTlVCKCUlbW0xLCAlJW1tMywgJSVtbTUpCisgICAgICAgICJwc3ViYiAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndGIgJSVtbTYsICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTMsIDQpLCAlJSJSRUdfYSIgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICglMiwgJTMsIDQpLCAlJW1tMiAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQTUFYVUIoJSVtbTIsICUlbW00KQorICAgICAgICBQTUlOVUIoJSVtbTIsICUlbW0zLCAlJW1tNSkKKyAgICAgICAgInBzdWJiICUlbW0yLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tNywgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiksICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBNQVhVQiglJW1tMSwgJSVtbTQpCisgICAgICAgIFBNSU5VQiglJW1tMSwgJSVtbTMsICUlbW01KQorICAgICAgICAicHN1YmIgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMyksICUlbW0yICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUE1BWFVCKCUlbW0yLCAlJW1tNCkKKyAgICAgICAgUE1JTlVCKCUlbW0yLCAlJW1tMywgJSVtbTUpCisgICAgICAgICJwc3ViYiAlJW1tMiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndGIgJSVtbTYsICUlbW0xICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUzLCAyKSwgJSVtbTEgICAgICAgICBcblx0IgorICAgICAgICBQTUFYVUIoJSVtbTEsICUlbW00KQorICAgICAgICBQTUlOVUIoJSVtbTEsICUlbW0zLCAlJW1tNSkKKyAgICAgICAgInBzdWJiICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tNywgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgKCUyLCAlMywgOCksICUlbW0yICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBNQVhVQiglJW1tMiwgJSVtbTQpCisgICAgICAgIFBNSU5VQiglJW1tMiwgJSVtbTMsICUlbW01KQorICAgICAgICAicHN1YmIgJSVtbTIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW03LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMywgNCksICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJiICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAlJW1tNywgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICUlbW0zLCAlJW1tNCAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJweG9yICUlbW02LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlNCwgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gUVAsLi4uLCBRUAorICAgICAgICAicGFkZHVzYiAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMlFQIC4uLiAyUVAKKyAgICAgICAgInBzdWJ1c2IgJSVtbTQsICUlbW03ICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIERpZmYgPj0yUVAgLT4gMAorICAgICAgICAicGNtcGVxYiAlJW1tNiwgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gRGlmZiA8IDJRUCAtPiAwCisgICAgICAgICJwY21wZXFiICUlbW02LCAlJW1tNyAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBEaWZmIDwgMlFQIC0+IDAKKyAgICAgICAgIm1vdnEgJSVtbTcsICUxICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgJTUsICUlbW03ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViYiAlJW1tMCwgJSVtbTYgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGd0YiAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTYsICUwICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgOiAiPW0iIChlcV9tYXNrKSwgIj1tIiAoZGNfbWFzaykKKyAgICAgICAgOiAiciIgKHNyYyksICJyIiAoKHg4Nl9yZWcpc3RlcCksICJtIiAoYy0+cFFQYiksICJtIihjLT5wcE1vZGUuZmxhdG5lc3NUaHJlc2hvbGQpCisgICAgICAgIDogIiUiUkVHX2EKKyAgICApOworCisgICAgYm90aF9tYXNrcyA9IGRjX21hc2sgJiBlcV9tYXNrOworCisgICAgaWYoYm90aF9tYXNrcyl7CisgICAgICAgIHg4Nl9yZWcgb2Zmc2V0PSAtOCpzdGVwOworICAgICAgICBpbnQ2NF90ICp0ZW1wX3N1bXM9IHN1bXM7CisKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJtb3ZxICUyLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgLy8gUVAsLi4uLCBRUAorICAgICAgICAgICAgInB4b3IgJSVtbTQsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJtb3ZxICglMCksICUlbW02ICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgKCUwLCAlMSksICUlbW01ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tNSwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJ1c2IgJSVtbTYsICUlbW01ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YnVzYiAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgJSVtbTUsICUlbW0yICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBBQlMgRGlmZiBvZiBsaW5lcworICAgICAgICAgICAgInBzdWJ1c2IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGRpZmYgPj0gUVAgLT4gMAorICAgICAgICAgICAgInBjbXBlcWIgJSVtbTQsICUlbW0wICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGRpZmYgPj0gUVAgLT4gRkYKKworICAgICAgICAgICAgInB4b3IgJSVtbTYsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJweG9yICUlbW0xLCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgLy8gMDpRUCAgNjpGaXJzdAorCisgICAgICAgICAgICAibW92cSAoJTAsICUxLCA4KSwgJSVtbTUgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgJTEsICUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAlMCBwb2ludHMgdG8gbGluZSAxIG5vdCAwCisgICAgICAgICAgICAibW92cSAoJTAsICUxLCA4KSwgJSVtbTcgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUlbW01LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YnVzYiAlJW1tNywgJSVtbTUgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3VidXNiICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBvciAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEFCUyBEaWZmIG9mIGxpbmVzCisgICAgICAgICAgICAibW92cSAlMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIFFQLC4uLiwgUVAKKyAgICAgICAgICAgICJwc3VidXNiICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBkaWZmID49IFFQIC0+IDAKKyAgICAgICAgICAgICJwY21wZXFiICUlbW00LCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBkaWZmID49IFFQIC0+IEZGCisKKyAgICAgICAgICAgICJweG9yICUlbW03LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgJSVtbTAsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHhvciAlJW1tMSwgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgIm1vdnEgJSVtbTYsICUlbW01ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJ3ICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTQsICUlbW01ICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgLy8gNDowIDUvNjpGaXJzdCA3Okxhc3QKKworICAgICAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsdyAkMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGx3ICQyLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHcgIk1BTkdMRSh3MDQpIiwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAiTUFOR0xFKHcwNCkiLCAlJW1tMSAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIE5FWFRcCisgICAgICAgICAgICAibW92cSAoJTApLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAibW92cSAoJTApLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAiYWRkICUxLCAlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW00LCAlJW1tMiAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAicHVucGNraGJ3ICUlbW00LCAlJW1tMyAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAicGFkZHcgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBQUkVWXAorICAgICAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgImFkZCAlMSwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgInB1bnBja2xidyAlJW1tNCwgJSVtbTIgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgInB1bnBja2hidyAlJW1tNCwgJSVtbTMgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKworICAgICAgICAgICAgTkVYVCAvLzAKKyAgICAgICAgICAgIE5FWFQgLy8xCisgICAgICAgICAgICBORVhUIC8vMgorICAgICAgICAgICAgIm1vdnEgJSVtbTAsICglMykgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMSwgOCglMykgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgTkVYVCAvLzMKKyAgICAgICAgICAgICJwc3VidyAlJW1tNSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMCwgMTYoJTMpICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUlbW0xLCAyNCglMykgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICBORVhUIC8vNAorICAgICAgICAgICAgInBzdWJ3ICUlbW01LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YncgJSVtbTYsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUlbW0wLCAzMiglMykgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTEsIDQwKCUzKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIE5FWFQgLy81CisgICAgICAgICAgICAicHN1YncgJSVtbTUsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTAsIDQ4KCUzKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMSwgNTYoJTMpICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgTkVYVCAvLzYKKyAgICAgICAgICAgICJwc3VidyAlJW1tNSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMCwgNjQoJTMpICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUlbW0xLCA3MiglMykgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAibW92cSAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTQsICUlbW03ICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIE5FWFQgLy83CisgICAgICAgICAgICAibW92ICU0LCAlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgJTEsICUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFJFViAvLzAKKyAgICAgICAgICAgICJtb3ZxICUlbW0wLCA4MCglMykgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTEsIDg4KCUzKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIFBSRVYgLy8xCisgICAgICAgICAgICAicGFkZHcgJSVtbTYsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTAsIDk2KCUzKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMSwgMTA0KCUzKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgUFJFViAvLzIKKyAgICAgICAgICAgICJwYWRkdyAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR3ICUlbW03LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMCwgMTEyKCUzKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUlbW0xLCAxMjAoJTMpICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICBQUkVWIC8vMworICAgICAgICAgICAgInBhZGR3ICUlbW02LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHcgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUlbW0wLCAxMjgoJTMpICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTEsIDEzNiglMykgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIFBSRVYgLy80CisgICAgICAgICAgICAicGFkZHcgJSVtbTYsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTAsIDE0NCglMykgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMSwgMTUyKCUzKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgIm1vdiAlNCwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vRklYTUUKKworICAgICAgICAgICAgOiAiKyZyIihzcmMpCisgICAgICAgICAgICA6ICJyIiAoKHg4Nl9yZWcpc3RlcCksICJtIiAoYy0+cFFQYiksICJyIihzdW1zKSwgImciKHNyYykKKyAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKHcwNCkKKyAgICAgICAgKTsKKworICAgICAgICBzcmMrPSBzdGVwOyAvLyBzcmMgcG9pbnRzIHRvIGJlZ2luIG9mIHRoZSA4eDggQmxvY2sKKworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgIm1vdnEgJTQsICUlbW02ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGNtcGVxYiAlJW1tNSwgJSVtbTUgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJweG9yICUlbW02LCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgKCUxKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSA4KCUxKSwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAzMiglMSksICUlbW0wICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR3IDQwKCUxKSwgJSVtbTEgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAoJTAsICUzKSwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTIsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0zICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHcgJDQsICUlbW0wICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsdyAkNCwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c3diICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICUlbW01LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBvciAlJW1tNCwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMCwgKCUwLCAlMykgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgJDE2LCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZCAlMiwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiIGpzIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOiAiK3IiKG9mZnNldCksICIrciIodGVtcF9zdW1zKQorICAgICAgICAgICAgOiAiciIgKCh4ODZfcmVnKXN0ZXApLCAiciIoc3JjIC0gb2Zmc2V0KSwgIm0iKGJvdGhfbWFza3MpCisgICAgICAgICk7CisgICAgfWVsc2UKKyAgICAgICAgc3JjKz0gc3RlcDsgLy8gc3JjIHBvaW50cyB0byBiZWdpbiBvZiB0aGUgOHg4IEJsb2NrCisKKyAgICBpZihlcV9tYXNrICE9IC0xTEwpeworICAgICAgICB1aW50OF90ICp0ZW1wX3NyYz0gc3JjOworICAgICAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIHRtcClbNF07IC8vIG1ha2Ugc3BhY2UgZm9yIDQgOC1ieXRlIHZhcnMKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJweG9yICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICAgICBcblx0IgorLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcgICAgICAgOCAgICAgICA5CisvLyAgICAgICUwICAgICAgZWF4ICAgICBlYXgrJTEgIGVheCsyJTEgJTArNCUxICBlY3ggICAgIGVjeCslMSAgZWN4KzIlMSAlMSs4JTEgIGVjeCs0JTEKKworICAgICAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0wICAgICAgICAgICAgICAgICBcblx0IiAvLyBsb3cgcGFydCBvZiBsaW5lIDAKKyAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICBcblx0IiAvLyBoaWdoIHBhcnQgb2YgbGluZSAwCisKKyAgICAgICAgICAgICJtb3ZxICglMCwgJTEpLCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImxlYSAoJTAsICUxLCAyKSwgJSUiUkVHX2EiICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IiAvLyBsb3cgcGFydCBvZiBsaW5lIDEKKyAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0zICAgICAgICAgICAgICAgICBcblx0IiAvLyBoaWdoIHBhcnQgb2YgbGluZSAxCisKKyAgICAgICAgICAgICJtb3ZxICglJSJSRUdfYSIpLCAlJW1tNCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTQsICUlbW01ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNCAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbG93IHBhcnQgb2YgbGluZSAyCisgICAgICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tNSAgICAgICAgICAgICAgICAgXG5cdCIgLy8gaGlnaCBwYXJ0IG9mIGxpbmUgMgorCisgICAgICAgICAgICAicGFkZHcgJSVtbTAsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkwwCisgICAgICAgICAgICAicGFkZHcgJSVtbTEsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkgwCisgICAgICAgICAgICAicHN1YncgJSVtbTQsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEgLSBMMgorICAgICAgICAgICAgInBzdWJ3ICUlbW01LCAlJW1tMyAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEgxIC0gSDIKKyAgICAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDAgLSBMMSArIEwyCisgICAgICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkgwIC0gSDEgKyBIMgorCisgICAgICAgICAgICAicHNsbHcgJDIsICUlbW0yICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gNEwxIC0gNEwyCisgICAgICAgICAgICAicHNsbHcgJDIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gNEgxIC0gNEgyCisgICAgICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkwwIC0gNUwxICsgNUwyCisgICAgICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkgwIC0gNUgxICsgNUgyCisKKyAgICAgICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxKSwgJSVtbTIgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDMKKyAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0zICAgICAgICAgICAgICAgICBcblx0IiAvLyBIMworCisgICAgICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkwwIC0gNUwxICsgNUwyIC0gTDMKKyAgICAgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDAgLSA1SDEgKyA1SDIgLSBIMworICAgICAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMMCAtIDVMMSArIDVMMiAtIDJMMworICAgICAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMCAtIDVIMSArIDVIMiAtIDJIMworICAgICAgICAgICAgIm1vdnEgJSVtbTAsICglNCkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMMCAtIDVMMSArIDVMMiAtIDJMMworICAgICAgICAgICAgIm1vdnEgJSVtbTEsIDgoJTQpICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMCAtIDVIMSArIDVIMiAtIDJIMworCisgICAgICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgMiksICUlbW0wICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw0CisgICAgICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMSAgICAgICAgICAgICAgICAgXG5cdCIgLy8gSDQKKworICAgICAgICAgICAgInBzdWJ3ICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwzIC0gTDQKKyAgICAgICAgICAgICJwc3VidyAlJW1tMSwgJSVtbTMgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBIMyAtIEg0CisgICAgICAgICAgICAibW92cSAlJW1tMiwgMTYoJTQpICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDMgLSBMNAorICAgICAgICAgICAgIm1vdnEgJSVtbTMsIDI0KCU0KSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEgzIC0gSDQKKyAgICAgICAgICAgICJwYWRkdyAlJW1tNCwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDIKKyAgICAgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDIKKyAgICAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDIgLSBMMyArIEw0CisgICAgICAgICAgICAicHN1YncgJSVtbTMsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkgyIC0gSDMgKyBINAorCisgICAgICAgICAgICAibGVhICglJSJSRUdfYSIsICUxKSwgJTAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsdyAkMiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyA0TDMgLSA0TDQKKyAgICAgICAgICAgICJwc2xsdyAkMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyA0SDMgLSA0SDQKKyAgICAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDIgLSA1TDMgKyA1TDQKKyAgICAgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDIgLSA1SDMgKyA1SDQKKy8vNTAgb3Bjb2RlcyBzbyBmYXIKKyAgICAgICAgICAgICJtb3ZxICglMCwgJTEsIDIpLCAlJW1tMiAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDUKKyAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0zICAgICAgICAgICAgICAgICBcblx0IiAvLyBINQorICAgICAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMMiAtIDVMMyArIDVMNCAtIEw1CisgICAgICAgICAgICAicHN1YncgJSVtbTMsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkgyIC0gNUgzICsgNUg0IC0gSDUKKyAgICAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDIgLSA1TDMgKyA1TDQgLSAyTDUKKyAgICAgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDIgLSA1SDMgKyA1SDQgLSAySDUKKworICAgICAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJW1tNiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDYKKyAgICAgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMNSAtIEw2CisgICAgICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgNCksICUlbW02ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW02ICAgICAgICAgICAgICAgICBcblx0IiAvLyBINgorICAgICAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMyAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEg1IC0gSDYKKworICAgICAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMNAorICAgICAgICAgICAgInBhZGR3ICUlbW0xLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJINAorICAgICAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMNCAtIEw1ICsgTDYKKyAgICAgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDQgLSBINSArIEg2CisKKyAgICAgICAgICAgICJwc2xsdyAkMiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyA0TDUgLSA0TDYKKyAgICAgICAgICAgICJwc2xsdyAkMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyA0SDUgLSA0SDYKKyAgICAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDQgLSA1TDUgKyA1TDYKKyAgICAgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDQgLSA1SDUgKyA1SDYKKworICAgICAgICAgICAgIm1vdnEgKCUwLCAlMSwgNCksICUlbW0yICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IiAvLyBMNworICAgICAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEg3CisKKyAgICAgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDcKKyAgICAgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTMgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDcKKyAgICAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDQgLSA1TDUgKyA1TDYgLSAyTDcKKyAgICAgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAySDQgLSA1SDUgKyA1SDYgLSAySDcKKworICAgICAgICAgICAgIm1vdnEgKCU0KSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMMCAtIDVMMSArIDVMMiAtIDJMMworICAgICAgICAgICAgIm1vdnEgOCglNCksICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMCAtIDVIMSArIDVIMiAtIDJIMworCisjaWYgVEVNUExBVEVfUFBfTU1YRVhUCisgICAgICAgICAgICAibW92cSAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMAorICAgICAgICAgICAgInBzdWJ3ICUlbW0wLCAlJW1tNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG1heHN3ICUlbW02LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfDJMNCAtIDVMNSArIDVMNiAtIDJMN3wKKyAgICAgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICAgICAicHN1YncgJSVtbTEsICUlbW02ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbWF4c3cgJSVtbTYsICUlbW0xICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8Mkg0IC0gNUg1ICsgNUg2IC0gMkg3fAorICAgICAgICAgICAgIm1vdnEgJSVtbTcsICUlbW02ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDAKKyAgICAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTYgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtYXhzdyAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHwyTDAgLSA1TDEgKyA1TDIgLSAyTDN8CisgICAgICAgICAgICAibW92cSAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMAorICAgICAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG1heHN3ICUlbW02LCAlJW1tMyAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfDJIMCAtIDVIMSArIDVIMiAtIDJIM3wKKyNlbHNlCisgICAgICAgICAgICAibW92cSAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMAorICAgICAgICAgICAgInBjbXBndHcgJSVtbTAsICUlbW02ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHhvciAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8Mkw0IC0gNUw1ICsgNUw2IC0gMkw3fAorICAgICAgICAgICAgIm1vdnEgJSVtbTcsICUlbW02ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDAKKyAgICAgICAgICAgICJwY21wZ3R3ICUlbW0xLCAlJW1tNiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB4b3IgJSVtbTYsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YncgJSVtbTYsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfDJINCAtIDVINSArIDVINiAtIDJIN3wKKyAgICAgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICAgICAicGNtcGd0dyAlJW1tMiwgJSVtbTYgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJweG9yICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHwyTDAgLSA1TDEgKyA1TDIgLSAyTDN8CisgICAgICAgICAgICAibW92cSAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMAorICAgICAgICAgICAgInBjbXBndHcgJSVtbTMsICUlbW02ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHhvciAlJW1tNiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8MkgwIC0gNUgxICsgNUgyIC0gMkgzfAorI2VuZGlmCisKKyNpZiBURU1QTEFURV9QUF9NTVhFWFQKKyAgICAgICAgICAgICJwbWluc3cgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtaW5zdyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZWxzZQorICAgICAgICAgICAgIm1vdnEgJSVtbTAsICUlbW02ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YnVzdyAlJW1tMiwgJSVtbTYgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTEsICUlbW02ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YnVzdyAlJW1tMywgJSVtbTYgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmCisKKyAgICAgICAgICAgICJtb3ZkICUyLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBRUAorICAgICAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTIgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCisgICAgICAgICAgICAicGNtcGd0dyAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gc2lnbigyTDIgLSA1TDMgKyA1TDQgLSAyTDUpCisgICAgICAgICAgICAicHhvciAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8MkwyIC0gNUwzICsgNUw0IC0gMkw1fAorICAgICAgICAgICAgInBjbXBndHcgJSVtbTUsICUlbW03ICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHNpZ24oMkgyIC0gNUgzICsgNUg0IC0gMkg1KQorICAgICAgICAgICAgInB4b3IgJSVtbTcsICUlbW01ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YncgJSVtbTcsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfDJIMiAtIDVIMyArIDVINCAtIDJINXwKKy8vIDEwMCBvcGNvZGVzCisgICAgICAgICAgICAicHNsbHcgJDMsICUlbW0yICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gOFFQCisgICAgICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gOFFQCisgICAgICAgICAgICAicGNtcGd0dyAlJW1tNCwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwY21wZ3R3ICUlbW01LCAlJW1tMyAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgJSVtbTIsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAlJW1tMywgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworCisgICAgICAgICAgICAicHN1YnVzdyAlJW1tMCwgJSVtbTQgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gaGQKKyAgICAgICAgICAgICJwc3VidXN3ICUlbW0xLCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBsZAorCisKKyAgICAgICAgICAgICJtb3ZxICJNQU5HTEUodzA1KSIsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvLyA1CisgICAgICAgICAgICAicG11bGx3ICUlbW0yLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbHcgJSVtbTIsICUlbW01ICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgIk1BTkdMRSh3MjApIiwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8vIDMyCisgICAgICAgICAgICAicGFkZHcgJSVtbTIsICUlbW00ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTUgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICQ2LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHcgJDYsICUlbW01ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgIm1vdnEgMTYoJTQpLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwzIC0gTDQKKyAgICAgICAgICAgICJtb3ZxIDI0KCU0KSwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBIMyAtIEg0CisKKyAgICAgICAgICAgICJweG9yICUlbW0yLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB4b3IgJSVtbTMsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJwY21wZ3R3ICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBzaWduIChMMy1MNCkKKyAgICAgICAgICAgICJwY21wZ3R3ICUlbW0xLCAlJW1tMyAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBzaWduIChIMy1INCkKKyAgICAgICAgICAgICJweG9yICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB4b3IgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfEwzLUw0fAorICAgICAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHxIMy1INHwKKyAgICAgICAgICAgICJwc3JsdyAkMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8TDMgLSBMNHwvMgorICAgICAgICAgICAgInBzcmx3ICQxLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIHxIMyAtIEg0fC8yCisKKyAgICAgICAgICAgICJweG9yICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB4b3IgJSVtbTcsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICUlbW0zLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjaWYgVEVNUExBVEVfUFBfTU1YRVhUCisgICAgICAgICAgICAicG1pbnN3ICUlbW0wLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbWluc3cgJSVtbTEsICUlbW01ICAgICAgICAgICAgICAgICAgICBcblx0IgorI2Vsc2UKKyAgICAgICAgICAgICJtb3ZxICUlbW00LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJ1c3cgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YncgJSVtbTIsICUlbW00ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUlbW01LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJ1c3cgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YncgJSVtbTIsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbmRpZgorICAgICAgICAgICAgInB4b3IgJSVtbTYsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHhvciAlJW1tNywgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJ3ICUlbW03LCAlJW1tNSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Nzd2IgJSVtbTUsICUlbW00ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICUzLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmRuICUlbW00LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAoJTApLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkYiAgICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTAsICglMCkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAoJTAsICUxKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViYiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgJSVtbTAsICglMCwgJTEpICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDogIityIiAodGVtcF9zcmMpCisgICAgICAgICAgICA6ICJyIiAoKHg4Nl9yZWcpc3RlcCksICJtIiAoYy0+cFFQYiksICJtIihlcV9tYXNrKSwgInIiKHRtcCkKKyAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKHcwNSx3MjApCisgICAgICAgICAgICA6ICIlIlJFR19hCisgICAgICAgICk7CisgICAgfQorLyppZihzdGVwPT0xNil7CisgICAgU1RPUF9USU1FUigic3RlcDE2IikKK31lbHNleworICAgIFNUT1BfVElNRVIoInN0ZXBYIikKK30KKyAgICB9ICovCit9CisjZW5kaWYgLy9URU1QTEFURV9QUF9NTVgKKworc3RhdGljIHZvaWQgUkVOQU1FKHBvc3RQcm9jZXNzKShjb25zdCB1aW50OF90IHNyY1tdLCBpbnQgc3JjU3RyaWRlLCB1aW50OF90IGRzdFtdLCBpbnQgZHN0U3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFQX1NUT1JFX1QgUVBzW10sIGludCBRUFN0cmlkZSwgaW50IGlzQ29sb3IsIFBQQ29udGV4dCAqYyk7CisKKy8qKgorICogQ29weSBhIGJsb2NrIGZyb20gc3JjIHRvIGRzdCBhbmQgZml4ZXMgdGhlIGJsYWNrbGV2ZWwuCisgKiBsZXZlbEZpeCA9PSAwIC0+IGRvIG5vdCB0b3VjaCB0aGUgYnJpZ2h0bmVzcyAmIGNvbnRyYXN0CisgKi8KKyN1bmRlZiBSRUFMX1NDQUxFRF9DUFkKKyN1bmRlZiBTQ0FMRURfQ1BZCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUoYmxvY2tDb3B5KSh1aW50OF90IGRzdFtdLCBpbnQgZHN0U3RyaWRlLCBjb25zdCB1aW50OF90IHNyY1tdLCBpbnQgc3JjU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbEZpeCwgaW50NjRfdCAqcGFja2VkT2Zmc2V0QW5kU2NhbGUpCit7CisjaWYgIVRFTVBMQVRFX1BQX01NWCB8fCAhSEFWRV82UkVHUworICAgIGludCBpOworI2VuZGlmCisgICAgaWYobGV2ZWxGaXgpeworI2lmIFRFTVBMQVRFX1BQX01NWCAmJiBIQVZFXzZSRUdTCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdnEgKCUlIlJFR19hIiksICUlbW0yICAgICAgICBcblx0IiAvLyBwYWNrZWRZT2Zmc2V0CisgICAgICAgICJtb3ZxIDgoJSUiUkVHX2EiKSwgJSVtbTMgICAgICAgXG5cdCIgLy8gcGFja2VkWVNjYWxlCisgICAgICAgICJsZWEgKCUyLCU0KSwgJSUiUkVHX2EiICAgICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJTMsJTUpLCAlJSJSRUdfZCIgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAlJW1tNCwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiCisjaWYgVEVNUExBVEVfUFBfTU1YRVhUCisjZGVmaW5lIFJFQUxfU0NBTEVEX0NQWShzcmMxLCBzcmMyLCBkc3QxLCBkc3QyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tMCAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tNSAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjc3JjMiAiLCAlJW1tMSAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjc3JjMiAiLCAlJW1tNiAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2hidyAlJW1tNSwgJSVtbTUgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tMSwgJSVtbTEgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2hidyAlJW1tNiwgJSVtbTYgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxodXcgJSVtbTMsICUlbW0wICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxodXcgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxodXcgJSVtbTMsICUlbW0xICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxodXcgJSVtbTMsICUlbW02ICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNSAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tMSAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNiAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2t1c3diICUlbW01LCAlJW1tMCAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2t1c3diICUlbW02LCAlJW1tMSAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsICIgI2RzdDEgIiAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTEsICIgI2RzdDIgIiAgICAgICAgICBcblx0IlwKKworI2Vsc2UgLy9URU1QTEFURV9QUF9NTVhFWFQKKyNkZWZpbmUgUkVBTF9TQ0FMRURfQ1BZKHNyYzEsIHNyYzIsIGRzdDEsIGRzdDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tMCAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tNSAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tNCwgJSVtbTAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2hidyAlJW1tNCwgJSVtbTUgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNSAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjc3JjMiAiLCAlJW1tMSAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzbGx3ICQ2LCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzbGx3ICQ2LCAlJW1tNSAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxodyAlJW1tMywgJSVtbTAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgIiAjc3JjMiAiLCAlJW1tNiAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxodyAlJW1tMywgJSVtbTUgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2xidyAlJW1tNCwgJSVtbTEgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2hidyAlJW1tNCwgJSVtbTYgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tMSAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNiAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzbGx3ICQ2LCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzbGx3ICQ2LCAlJW1tNiAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxodyAlJW1tMywgJSVtbTEgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxodyAlJW1tMywgJSVtbTYgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2t1c3diICUlbW01LCAlJW1tMCAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2t1c3diICUlbW02LCAlJW1tMSAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTAsICIgI2RzdDEgIiAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnEgJSVtbTEsICIgI2RzdDIgIiAgICAgICAgICBcblx0IlwKKworI2VuZGlmIC8vVEVNUExBVEVfUFBfTU1YRVhUCisjZGVmaW5lIFNDQUxFRF9DUFkoc3JjMSwgc3JjMiwgZHN0MSwgZHN0MilcCisgICBSRUFMX1NDQUxFRF9DUFkoc3JjMSwgc3JjMiwgZHN0MSwgZHN0MikKKworU0NBTEVEX0NQWSgoJTIpICAgICAgICwgKCUyLCAlNCkgICAgICAsICglMykgICAgICAgLCAoJTMsICU1KSkKK1NDQUxFRF9DUFkoKCUyLCAlNCwgMiksICglJVJFR2EsICU0LCAyKSwgKCUzLCAlNSwgMiksICglJVJFR2QsICU1LCAyKSkKK1NDQUxFRF9DUFkoKCUyLCAlNCwgNCksICglJVJFR2EsICU0LCA0KSwgKCUzLCAlNSwgNCksICglJVJFR2QsICU1LCA0KSkKKyAgICAgICAgImxlYSAoJSUiUkVHX2EiLCU0LDQpLCAlJSJSRUdfYSIgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIlJFR19kIiwlNSw0KSwgJSUiUkVHX2QiICAgICAgICBcblx0IgorU0NBTEVEX0NQWSgoJSVSRUdhLCAlNCksICglJVJFR2EsICU0LCAyKSwgKCUlUkVHZCwgJTUpLCAoJSVSRUdkLCAlNSwgMikpCisKKworICAgICAgICA6ICI9JmEiIChwYWNrZWRPZmZzZXRBbmRTY2FsZSkKKyAgICAgICAgOiAiMCIgKHBhY2tlZE9mZnNldEFuZFNjYWxlKSwKKyAgICAgICAgInIiKHNyYyksCisgICAgICAgICJyIihkc3QpLAorICAgICAgICAiciIgKCh4ODZfcmVnKXNyY1N0cmlkZSksCisgICAgICAgICJyIiAoKHg4Nl9yZWcpZHN0U3RyaWRlKQorICAgICAgICA6ICIlIlJFR19kCisgICAgKTsKKyNlbHNlIC8vVEVNUExBVEVfUFBfTU1YICYmIEhBVkVfNlJFR1MKKyAgICBmb3IoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgbWVtY3B5KCAmKGRzdFtkc3RTdHJpZGUqaV0pLAorICAgICAgICAgICAgICAgICYoc3JjW3NyY1N0cmlkZSppXSksIEJMT0NLX1NJWkUpOworI2VuZGlmIC8vVEVNUExBVEVfUFBfTU1YICYmIEhBVkVfNlJFR1MKKyAgICB9ZWxzZXsKKyNpZiBURU1QTEFURV9QUF9NTVggJiYgSEFWRV82UkVHUworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJsZWEgKCUwLCUyKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglMSwlMyksICUlIlJFR19kIiAgICAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBSRUFMX1NJTVBMRV9DUFkoc3JjMSwgc3JjMiwgZHN0MSwgZHN0MikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICIgI3NyYzIgIiwgJSVtbTEgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0wLCAiICNkc3QxICIgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICUlbW0xLCAiICNkc3QyICIgICAgICAgICAgXG5cdCJcCisKKyNkZWZpbmUgU0lNUExFX0NQWShzcmMxLCBzcmMyLCBkc3QxLCBkc3QyKVwKKyAgIFJFQUxfU0lNUExFX0NQWShzcmMxLCBzcmMyLCBkc3QxLCBkc3QyKQorCitTSU1QTEVfQ1BZKCglMCkgICAgICAgLCAoJTAsICUyKSAgICAgICAsICglMSkgICAgICAgLCAoJTEsICUzKSkKK1NJTVBMRV9DUFkoKCUwLCAlMiwgMiksICglJVJFR2EsICUyLCAyKSwgKCUxLCAlMywgMiksICglJVJFR2QsICUzLCAyKSkKK1NJTVBMRV9DUFkoKCUwLCAlMiwgNCksICglJVJFR2EsICUyLCA0KSwgKCUxLCAlMywgNCksICglJVJFR2QsICUzLCA0KSkKKyAgICAgICAgImxlYSAoJSUiUkVHX2EiLCUyLDQpLCAlJSJSRUdfYSIgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIlJFR19kIiwlMyw0KSwgJSUiUkVHX2QiICAgICAgICBcblx0IgorU0lNUExFX0NQWSgoJSVSRUdhLCAlMiksICglJVJFR2EsICUyLCAyKSwgKCUlUkVHZCwgJTMpLCAoJSVSRUdkLCAlMywgMikpCisKKyAgICAgICAgOiA6ICJyIiAoc3JjKSwKKyAgICAgICAgInIiIChkc3QpLAorICAgICAgICAiciIgKCh4ODZfcmVnKXNyY1N0cmlkZSksCisgICAgICAgICJyIiAoKHg4Nl9yZWcpZHN0U3RyaWRlKQorICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfZAorICAgICk7CisjZWxzZSAvL1RFTVBMQVRFX1BQX01NWCAmJiBIQVZFXzZSRUdTCisgICAgZm9yKGk9MDsgaTw4OyBpKyspCisgICAgICAgIG1lbWNweSggJihkc3RbZHN0U3RyaWRlKmldKSwKKyAgICAgICAgICAgICAgICAmKHNyY1tzcmNTdHJpZGUqaV0pLCBCTE9DS19TSVpFKTsKKyNlbmRpZiAvL1RFTVBMQVRFX1BQX01NWCAmJiBIQVZFXzZSRUdTCisgICAgfQorfQorCisvKioKKyAqIER1cGxpY2F0ZSB0aGUgZ2l2ZW4gOCBzcmMgcGl4ZWxzID8gdGltZXMgdXB3YXJkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUoZHVwbGljYXRlKSh1aW50OF90IHNyY1tdLCBpbnQgc3RyaWRlKQoreworI2lmIFRFTVBMQVRFX1BQX01NWAorICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZxICglMCksICUlbW0wICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICglMCwgJTEsIDQpICAgICAgICBcblx0IgorICAgICAgICAiYWRkICUxLCAlMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAoJTApICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICglMCwgJTEpICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgKCUwLCAlMSwgMikgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAoJTAsICUxLCA0KSAgICAgICAgXG5cdCIKKyAgICAgICAgOiAiK3IiIChzcmMpCisgICAgICAgIDogInIiICgoeDg2X3JlZyktc3RyaWRlKQorICAgICk7CisjZWxzZQorICAgIGludCBpOworICAgIHVpbnQ4X3QgKnA9c3JjOworICAgIGZvcihpPTA7IGk8NTsgaSsrKXsKKyAgICAgICAgcC09IHN0cmlkZTsKKyAgICAgICAgbWVtY3B5KHAsIHNyYywgOCk7CisgICAgfQorI2VuZGlmCit9CisKKy8qKgorICogRmlsdGVyIGFycmF5IG9mIGJ5dGVzIChZIG9yIFUgb3IgViB2YWx1ZXMpCisgKi8KK3N0YXRpYyB2b2lkIFJFTkFNRShwb3N0UHJvY2VzcykoY29uc3QgdWludDhfdCBzcmNbXSwgaW50IHNyY1N0cmlkZSwgdWludDhfdCBkc3RbXSwgaW50IGRzdFN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRUF9TVE9SRV9UIFFQc1tdLCBpbnQgUVBTdHJpZGUsIGludCBpc0NvbG9yLCBQUENvbnRleHQgKmMyKQoreworICAgIERFQ0xBUkVfQUxJR05FRCg4LCBQUENvbnRleHQsIGMpPSAqYzI7IC8vY29weSB0byBzdGFjayBmb3IgZmFzdGVyIGFjY2VzcworICAgIGludCB4LHk7CisjaWZkZWYgVEVNUExBVEVfUFBfVElNRV9NT0RFCisgICAgY29uc3QgaW50IG1vZGU9IFRFTVBMQVRFX1BQX1RJTUVfTU9ERTsKKyNlbHNlCisgICAgY29uc3QgaW50IG1vZGU9IGlzQ29sb3IgPyBjLnBwTW9kZS5jaHJvbU1vZGUgOiBjLnBwTW9kZS5sdW1Nb2RlOworI2VuZGlmCisgICAgaW50IGJsYWNrPTAsIHdoaXRlPTI1NTsgLy8gYmxhY2tlc3QgYmxhY2sgYW5kIHdoaXRlc3Qgd2hpdGUgaW4gdGhlIHBpY3R1cmUKKyAgICBpbnQgUVBDb3JyZWN0dXJlPSAyNTYqMjU2OworCisgICAgaW50IGNvcHlBaGVhZDsKKyNpZiBURU1QTEFURV9QUF9NTVgKKyAgICBpbnQgaTsKKyNlbmRpZgorCisgICAgY29uc3QgaW50IHFwSFNoaWZ0PSBpc0NvbG9yID8gNC1jLmhDaHJvbWFTdWJTYW1wbGUgOiA0OworICAgIGNvbnN0IGludCBxcFZTaGlmdD0gaXNDb2xvciA/IDQtYy52Q2hyb21hU3ViU2FtcGxlIDogNDsKKworICAgIC8vRklYTUUgcmVtb3ZlCisgICAgdWludDY0X3QgKiBjb25zdCB5SGlzdG9ncmFtPSBjLnlIaXN0b2dyYW07CisgICAgdWludDhfdCAqIGNvbnN0IHRlbXBTcmM9IHNyY1N0cmlkZSA+IDAgPyBjLnRlbXBTcmMgOiBjLnRlbXBTcmMgLSAyMypzcmNTdHJpZGU7CisgICAgdWludDhfdCAqIGNvbnN0IHRlbXBEc3Q9IChkc3RTdHJpZGUgPiAwID8gYy50ZW1wRHN0IDogYy50ZW1wRHN0IC0gMjMqZHN0U3RyaWRlKSArIDMyOworICAgIC8vY29uc3QgaW50IG1iV2lkdGg9IGlzQ29sb3IgPyAod2lkdGgrNyk+PjMgOiAod2lkdGgrMTUpPj40OworCisgICAgaWYgKG1vZGUgJiBWSVNVQUxJWkUpeworICAgICAgICBpZighKG1vZGUgJiAoVl9BX0RFQkxPQ0sgfCBIX0FfREVCTE9DSykpIHx8IFRFTVBMQVRFX1BQX01NWCkgeworICAgICAgICAgICAgYXZfbG9nKGMyLCBBVl9MT0dfV0FSTklORywgIlZpc3VhbGl6YXRpb24gaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHdpdGggdGhlIGFjY3VyYXRlIGRlYmxvY2sgZmlsdGVyIHdpdGhvdXQgU0lNRFxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiBURU1QTEFURV9QUF9NTVgKKyAgICBmb3IoaT0wOyBpPDU3OyBpKyspeworICAgICAgICBpbnQgb2Zmc2V0PSAoKGkqYy5wcE1vZGUuYmFzZURjRGlmZik+PjgpICsgMTsKKyAgICAgICAgaW50IHRocmVzaG9sZD0gb2Zmc2V0KjIgKyAxOworICAgICAgICBjLm1teERjT2Zmc2V0W2ldPSAweDdGIC0gb2Zmc2V0OworICAgICAgICBjLm1teERjVGhyZXNob2xkW2ldPSAweDdGIC0gdGhyZXNob2xkOworICAgICAgICBjLm1teERjT2Zmc2V0W2ldKj0gMHgwMTAxMDEwMTAxMDEwMTAxTEw7CisgICAgICAgIGMubW14RGNUaHJlc2hvbGRbaV0qPSAweDAxMDEwMTAxMDEwMTAxMDFMTDsKKyAgICB9CisjZW5kaWYKKworICAgIGlmKG1vZGUgJiBDVUJJQ19JUE9MX0RFSU5UX0ZJTFRFUikgY29weUFoZWFkPTE2OworICAgIGVsc2UgaWYoICAgKG1vZGUgJiBMSU5FQVJfQkxFTkRfREVJTlRfRklMVEVSKQorICAgICAgICAgICAgfHwgKG1vZGUgJiBGRk1QRUdfREVJTlRfRklMVEVSKQorICAgICAgICAgICAgfHwgKG1vZGUgJiBMT1dQQVNTNV9ERUlOVF9GSUxURVIpKSBjb3B5QWhlYWQ9MTQ7CisgICAgZWxzZSBpZiggICAobW9kZSAmIFZfREVCTE9DSykKKyAgICAgICAgICAgIHx8IChtb2RlICYgTElORUFSX0lQT0xfREVJTlRfRklMVEVSKQorICAgICAgICAgICAgfHwgKG1vZGUgJiBNRURJQU5fREVJTlRfRklMVEVSKQorICAgICAgICAgICAgfHwgKG1vZGUgJiBWX0FfREVCTE9DSykpIGNvcHlBaGVhZD0xMzsKKyAgICBlbHNlIGlmKG1vZGUgJiBWX1gxX0ZJTFRFUikgY29weUFoZWFkPTExOworLy8gICAgZWxzZSBpZihtb2RlICYgVl9SSzFfRklMVEVSKSBjb3B5QWhlYWQ9MTA7CisgICAgZWxzZSBpZihtb2RlICYgREVSSU5HKSBjb3B5QWhlYWQ9OTsKKyAgICBlbHNlIGNvcHlBaGVhZD04OworCisgICAgY29weUFoZWFkLT0gODsKKworICAgIGlmKCFpc0NvbG9yKXsKKyAgICAgICAgdWludDY0X3Qgc3VtPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgdWludDY0X3QgbWF4Q2xpcHBlZDsKKyAgICAgICAgdWludDY0X3QgY2xpcHBlZDsKKyAgICAgICAgZG91YmxlIHNjYWxlOworCisgICAgICAgIGMuZnJhbWVOdW0rKzsKKyAgICAgICAgLy8gZmlyc3QgZnJhbWUgaXMgZnNja2VkIHNvIHdlIGlnbm9yZSBpdAorICAgICAgICBpZihjLmZyYW1lTnVtID09IDEpIHlIaXN0b2dyYW1bMF09IHdpZHRoKih1aW50NjRfdCloZWlnaHQvNjQqMTUvMjU2OworCisgICAgICAgIGZvcihpPTA7IGk8MjU2OyBpKyspeworICAgICAgICAgICAgc3VtKz0geUhpc3RvZ3JhbVtpXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFdlIGFsd2F5cyBnZXQgYSBjb21wbGV0ZWx5IGJsYWNrIHBpY3R1cmUgZmlyc3QuICovCisgICAgICAgIG1heENsaXBwZWQ9ICh1aW50NjRfdCkoc3VtICogYy5wcE1vZGUubWF4Q2xpcHBlZFRocmVzaG9sZCk7CisKKyAgICAgICAgY2xpcHBlZD0gc3VtOworICAgICAgICBmb3IoYmxhY2s9MjU1OyBibGFjaz4wOyBibGFjay0tKXsKKyAgICAgICAgICAgIGlmKGNsaXBwZWQgPCBtYXhDbGlwcGVkKSBicmVhazsKKyAgICAgICAgICAgIGNsaXBwZWQtPSB5SGlzdG9ncmFtW2JsYWNrXTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaXBwZWQ9IHN1bTsKKyAgICAgICAgZm9yKHdoaXRlPTA7IHdoaXRlPDI1Njsgd2hpdGUrKyl7CisgICAgICAgICAgICBpZihjbGlwcGVkIDwgbWF4Q2xpcHBlZCkgYnJlYWs7CisgICAgICAgICAgICBjbGlwcGVkLT0geUhpc3RvZ3JhbVt3aGl0ZV07CisgICAgICAgIH0KKworICAgICAgICBzY2FsZT0gKGRvdWJsZSkoYy5wcE1vZGUubWF4QWxsb3dlZFkgLSBjLnBwTW9kZS5taW5BbGxvd2VkWSkgLyAoZG91YmxlKSh3aGl0ZS1ibGFjayk7CisKKyNpZiBURU1QTEFURV9QUF9NTVhFWFQKKyAgICAgICAgYy5wYWNrZWRZU2NhbGU9ICh1aW50MTZfdCkoc2NhbGUqMjU2LjAgKyAwLjUpOworICAgICAgICBjLnBhY2tlZFlPZmZzZXQ9ICgoKGJsYWNrKmMucGFja2VkWVNjYWxlKT4+OCkgLSBjLnBwTW9kZS5taW5BbGxvd2VkWSkgJiAweEZGRkY7CisjZWxzZQorICAgICAgICBjLnBhY2tlZFlTY2FsZT0gKHVpbnQxNl90KShzY2FsZSoxMDI0LjAgKyAwLjUpOworICAgICAgICBjLnBhY2tlZFlPZmZzZXQ9IChibGFjayAtIGMucHBNb2RlLm1pbkFsbG93ZWRZKSAmIDB4RkZGRjsKKyNlbmRpZgorCisgICAgICAgIGMucGFja2VkWU9mZnNldHw9IGMucGFja2VkWU9mZnNldDw8MzI7CisgICAgICAgIGMucGFja2VkWU9mZnNldHw9IGMucGFja2VkWU9mZnNldDw8MTY7CisKKyAgICAgICAgYy5wYWNrZWRZU2NhbGV8PSBjLnBhY2tlZFlTY2FsZTw8MzI7CisgICAgICAgIGMucGFja2VkWVNjYWxlfD0gYy5wYWNrZWRZU2NhbGU8PDE2OworCisgICAgICAgIGlmKG1vZGUgJiBMRVZFTF9GSVgpICAgICAgICBRUENvcnJlY3R1cmU9IChpbnQpKHNjYWxlKjI1NioyNTYgKyAwLjUpOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgUVBDb3JyZWN0dXJlPSAyNTYqMjU2OworICAgIH1lbHNleworICAgICAgICBjLnBhY2tlZFlTY2FsZT0gMHgwMTAwMDEwMDAxMDAwMTAwTEw7CisgICAgICAgIGMucGFja2VkWU9mZnNldD0gMDsKKyAgICAgICAgUVBDb3JyZWN0dXJlPSAyNTYqMjU2OworICAgIH0KKworICAgIC8qIGNvcHkgJiBkZWludGVybGFjZSBmaXJzdCByb3cgb2YgYmxvY2tzICovCisgICAgeT0tQkxPQ0tfU0laRTsKKyAgICB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY0Jsb2NrPSAmKHNyY1t5KnNyY1N0cmlkZV0pOworICAgICAgICB1aW50OF90ICpkc3RCbG9jaz0gdGVtcERzdCArIGRzdFN0cmlkZTsKKworICAgICAgICAvLyBGcm9tIHRoaXMgcG9pbnQgb24gaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHdlIGNhbiByZWFkIGFuZCB3cml0ZSAxNiBsaW5lcyBkb3dud2FyZAorICAgICAgICAvLyBmaW5pc2ggMSBibG9jayBiZWZvcmUgdGhlIG5leHQgb3RoZXJ3aXNlIHdlIG1pZ2h0IGhhdmUgYSBwcm9ibGVtCisgICAgICAgIC8vIHdpdGggdGhlIEwxIENhY2hlIG9mIHRoZSBQNCAuLi4gb3Igb25seSBhIGZldyBibG9ja3MgYXQgYSB0aW1lIG9yIHNvbWV0aGluZworICAgICAgICBmb3IoeD0wOyB4PHdpZHRoOyB4Kz1CTE9DS19TSVpFKXsKKworI2lmIFRFTVBMQVRFX1BQX01NWEVYVCAmJiBIQVZFXzZSRUdTCisvKgorICAgICAgICAgICAgcHJlZmV0Y2hudGEoc3JjQmxvY2sgKyAoKCh4Pj4yKSY2KSArIDUpKnNyY1N0cmlkZSArIDMyKTsKKyAgICAgICAgICAgIHByZWZldGNobnRhKHNyY0Jsb2NrICsgKCgoeD4+MikmNikgKyA2KSpzcmNTdHJpZGUgKyAzMik7CisgICAgICAgICAgICBwcmVmZXRjaHQwKGRzdEJsb2NrICsgKCgoeD4+MikmNikgKyA1KSpkc3RTdHJpZGUgKyAzMik7CisgICAgICAgICAgICBwcmVmZXRjaHQwKGRzdEJsb2NrICsgKCgoeD4+MikmNikgKyA2KSpkc3RTdHJpZGUgKyAzMik7CisqLworCisgICAgICAgICAgICBfX2FzbV9fKAorICAgICAgICAgICAgICAgICJtb3YgJTQsICUlIlJFR19hIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAic2hyICQyLCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFuZCAkNiwgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQgJTUsICUlIlJFR19hIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ICUlIlJFR19hIiwgJSUiUkVHX2QiICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImltdWwgJTEsICUlIlJFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJpbXVsICUzLCAlJSJSRUdfZCIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHJlZmV0Y2hudGEgMzIoJSUiUkVHX2EiLCAlMCkgIFxuXHQiCisgICAgICAgICAgICAgICAgInByZWZldGNodDAgMzIoJSUiUkVHX2QiLCAlMikgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQgJTEsICUlIlJFR19hIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkICUzLCAlJSJSRUdfZCIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInByZWZldGNobnRhIDMyKCUlIlJFR19hIiwgJTApICBcblx0IgorICAgICAgICAgICAgICAgICJwcmVmZXRjaHQwIDMyKCUlIlJFR19kIiwgJTIpICAgXG5cdCIKKyAgICAgICAgICAgICAgICA6OiAiciIgKHNyY0Jsb2NrKSwgInIiICgoeDg2X3JlZylzcmNTdHJpZGUpLCAiciIgKGRzdEJsb2NrKSwgInIiICgoeDg2X3JlZylkc3RTdHJpZGUpLAorICAgICAgICAgICAgICAgICJnIiAoKHg4Nl9yZWcpeCksICJnIiAoKHg4Nl9yZWcpY29weUFoZWFkKQorICAgICAgICAgICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19kCisgICAgICAgICAgICApOworCisjZWxpZiBURU1QTEFURV9QUF8zRE5PVworLy9GSVhNRSBjaGVjayBpZiB0aGlzIGlzIGZhc3RlciBvbiBhbiAzZG5vdyBjaGlwIG9yIGlmIGl0IGlzIGZhc3RlciB3aXRob3V0IHRoZSBwcmVmZXRjaCBvciAuLi4KKy8qICAgICAgICAgIHByZWZldGNoKHNyY0Jsb2NrICsgKCgoeD4+MykmMykgKyA1KSpzcmNTdHJpZGUgKyAzMik7CisgICAgICAgICAgICBwcmVmZXRjaChzcmNCbG9jayArICgoKHg+PjMpJjMpICsgOSkqc3JjU3RyaWRlICsgMzIpOworICAgICAgICAgICAgcHJlZmV0Y2h3KGRzdEJsb2NrICsgKCgoeD4+MykmMykgKyA1KSpkc3RTdHJpZGUgKyAzMik7CisgICAgICAgICAgICBwcmVmZXRjaHcoZHN0QmxvY2sgKyAoKCh4Pj4zKSYzKSArIDkpKmRzdFN0cmlkZSArIDMyKTsKKyovCisjZW5kaWYKKworICAgICAgICAgICAgUkVOQU1FKGJsb2NrQ29weSkoZHN0QmxvY2sgKyBkc3RTdHJpZGUqOCwgZHN0U3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQmxvY2sgKyBzcmNTdHJpZGUqOCwgc3JjU3RyaWRlLCBtb2RlICYgTEVWRUxfRklYLCAmYy5wYWNrZWRZT2Zmc2V0KTsKKworICAgICAgICAgICAgUkVOQU1FKGR1cGxpY2F0ZSkoZHN0QmxvY2sgKyBkc3RTdHJpZGUqOCwgZHN0U3RyaWRlKTsKKworICAgICAgICAgICAgaWYobW9kZSAmIExJTkVBUl9JUE9MX0RFSU5UX0ZJTFRFUikKKyAgICAgICAgICAgICAgICBSRU5BTUUoZGVJbnRlcmxhY2VJbnRlcnBvbGF0ZUxpbmVhcikoZHN0QmxvY2ssIGRzdFN0cmlkZSk7CisgICAgICAgICAgICBlbHNlIGlmKG1vZGUgJiBMSU5FQVJfQkxFTkRfREVJTlRfRklMVEVSKQorICAgICAgICAgICAgICAgIFJFTkFNRShkZUludGVybGFjZUJsZW5kTGluZWFyKShkc3RCbG9jaywgZHN0U3RyaWRlLCBjLmRlaW50VGVtcCArIHgpOworICAgICAgICAgICAgZWxzZSBpZihtb2RlICYgTUVESUFOX0RFSU5UX0ZJTFRFUikKKyAgICAgICAgICAgICAgICBSRU5BTUUoZGVJbnRlcmxhY2VNZWRpYW4pKGRzdEJsb2NrLCBkc3RTdHJpZGUpOworICAgICAgICAgICAgZWxzZSBpZihtb2RlICYgQ1VCSUNfSVBPTF9ERUlOVF9GSUxURVIpCisgICAgICAgICAgICAgICAgUkVOQU1FKGRlSW50ZXJsYWNlSW50ZXJwb2xhdGVDdWJpYykoZHN0QmxvY2ssIGRzdFN0cmlkZSk7CisgICAgICAgICAgICBlbHNlIGlmKG1vZGUgJiBGRk1QRUdfREVJTlRfRklMVEVSKQorICAgICAgICAgICAgICAgIFJFTkFNRShkZUludGVybGFjZUZGKShkc3RCbG9jaywgZHN0U3RyaWRlLCBjLmRlaW50VGVtcCArIHgpOworICAgICAgICAgICAgZWxzZSBpZihtb2RlICYgTE9XUEFTUzVfREVJTlRfRklMVEVSKQorICAgICAgICAgICAgICAgIFJFTkFNRShkZUludGVybGFjZUw1KShkc3RCbG9jaywgZHN0U3RyaWRlLCBjLmRlaW50VGVtcCArIHgsIGMuZGVpbnRUZW1wICsgd2lkdGggKyB4KTsKKy8qICAgICAgICAgIGVsc2UgaWYobW9kZSAmIENVQklDX0JMRU5EX0RFSU5UX0ZJTFRFUikKKyAgICAgICAgICAgICAgICBSRU5BTUUoZGVJbnRlcmxhY2VCbGVuZEN1YmljKShkc3RCbG9jaywgZHN0U3RyaWRlKTsKKyovCisgICAgICAgICAgICBkc3RCbG9jays9ODsKKyAgICAgICAgICAgIHNyY0Jsb2NrKz04OworICAgICAgICB9CisgICAgICAgIGlmKHdpZHRoPT1GRkFCUyhkc3RTdHJpZGUpKQorICAgICAgICAgICAgbGluZWNweShkc3QsIHRlbXBEc3QgKyA5KmRzdFN0cmlkZSwgY29weUFoZWFkLCBkc3RTdHJpZGUpOworICAgICAgICBlbHNleworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IoaT0wOyBpPGNvcHlBaGVhZDsgaSsrKXsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0ICsgaSpkc3RTdHJpZGUsIHRlbXBEc3QgKyAoOStpKSpkc3RTdHJpZGUsIHdpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcih5PTA7IHk8aGVpZ2h0OyB5Kz1CTE9DS19TSVpFKXsKKyAgICAgICAgLy8xJSBzcGVlZHVwIGlmIHRoZXNlIGFyZSBoZXJlIGluc3RlYWQgb2YgdGhlIGlubmVyIGxvb3AKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjQmxvY2s9ICYoc3JjW3kqc3JjU3RyaWRlXSk7CisgICAgICAgIHVpbnQ4X3QgKmRzdEJsb2NrPSAmKGRzdFt5KmRzdFN0cmlkZV0pOworI2lmIFRFTVBMQVRFX1BQX01NWAorICAgICAgICB1aW50OF90ICp0ZW1wQmxvY2sxPSBjLnRlbXBCbG9ja3M7CisgICAgICAgIHVpbnQ4X3QgKnRlbXBCbG9jazI9IGMudGVtcEJsb2NrcyArIDg7CisjZW5kaWYKKyAgICAgICAgY29uc3QgaW50OF90ICpRUHB0cj0gJlFQc1soeT4+cXBWU2hpZnQpKlFQU3RyaWRlXTsKKyAgICAgICAgaW50OF90ICpub25CUVBwdHI9ICZjLm5vbkJRUFRhYmxlWyh5Pj5xcFZTaGlmdCkqRkZBQlMoUVBTdHJpZGUpXTsKKyAgICAgICAgaW50IFFQPTA7CisgICAgICAgIC8qIGNhbiB3ZSBtZXNzIHdpdGggYSA4eDE2IGJsb2NrIGZyb20gc3JjQmxvY2svZHN0QmxvY2sgZG93bndhcmRzIGFuZCAxIGxpbmUgdXB3YXJkcworICAgICAgICAgICBpZiBub3QgdGhhbiB1c2UgYSB0ZW1wb3JhcnkgYnVmZmVyICovCisgICAgICAgIGlmKHkrMTUgPj0gaGVpZ2h0KXsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgLyogY29weSBmcm9tIGxpbmUgKGNvcHlBaGVhZCkgdG8gKGNvcHlBaGVhZCs3KSBvZiBzcmMsIHRoZXNlIHdpbGwgYmUgY29waWVkIHdpdGgKKyAgICAgICAgICAgICAgIGJsb2NrY29weSB0byBkc3QgbGF0ZXIgKi8KKyAgICAgICAgICAgIGxpbmVjcHkodGVtcFNyYyArIHNyY1N0cmlkZSpjb3B5QWhlYWQsIHNyY0Jsb2NrICsgc3JjU3RyaWRlKmNvcHlBaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgRkZNQVgoaGVpZ2h0LXktY29weUFoZWFkLCAwKSwgc3JjU3RyaWRlKTsKKworICAgICAgICAgICAgLyogZHVwbGljYXRlIGxhc3QgbGluZSBvZiBzcmMgdG8gZmlsbCB0aGUgdm9pZCB1cCB0byBsaW5lIChjb3B5QWhlYWQrNykgKi8KKyAgICAgICAgICAgIGZvcihpPUZGTUFYKGhlaWdodC15LCA4KTsgaTxjb3B5QWhlYWQrODsgaSsrKQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkodGVtcFNyYyArIHNyY1N0cmlkZSppLCBzcmMgKyBzcmNTdHJpZGUqKGhlaWdodC0xKSwgRkZBQlMoc3JjU3RyaWRlKSk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgdXAgdG8gKGNvcHlBaGVhZCsxKSBsaW5lcyBvZiBkc3QgKGxpbmUgLTEgdG8gKGNvcHlBaGVhZC0xKSkqLworICAgICAgICAgICAgbGluZWNweSh0ZW1wRHN0LCBkc3RCbG9jayAtIGRzdFN0cmlkZSwgRkZNSU4oaGVpZ2h0LXkrMSwgY29weUFoZWFkKzEpLCBkc3RTdHJpZGUpOworCisgICAgICAgICAgICAvKiBkdXBsaWNhdGUgbGFzdCBsaW5lIG9mIGRzdCB0byBmaWxsIHRoZSB2b2lkIHVwIHRvIGxpbmUgKGNvcHlBaGVhZCkgKi8KKyAgICAgICAgICAgIGZvcihpPWhlaWdodC15KzE7IGk8PWNvcHlBaGVhZDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkodGVtcERzdCArIGRzdFN0cmlkZSppLCBkc3QgKyBkc3RTdHJpZGUqKGhlaWdodC0xKSwgRkZBQlMoZHN0U3RyaWRlKSk7CisKKyAgICAgICAgICAgIGRzdEJsb2NrPSB0ZW1wRHN0ICsgZHN0U3RyaWRlOworICAgICAgICAgICAgc3JjQmxvY2s9IHRlbXBTcmM7CisgICAgICAgIH0KKworICAgICAgICAvLyBGcm9tIHRoaXMgcG9pbnQgb24gaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHdlIGNhbiByZWFkIGFuZCB3cml0ZSAxNiBsaW5lcyBkb3dud2FyZAorICAgICAgICAvLyBmaW5pc2ggMSBibG9jayBiZWZvcmUgdGhlIG5leHQgb3RoZXJ3aXNlIHdlIG1pZ2h0IGhhdmUgYSBwcm9ibGVtCisgICAgICAgIC8vIHdpdGggdGhlIEwxIENhY2hlIG9mIHRoZSBQNCAuLi4gb3Igb25seSBhIGZldyBibG9ja3MgYXQgYSB0aW1lIG9yIHNvbWV0aGluZworICAgICAgICBmb3IoeD0wOyB4PHdpZHRoOyB4Kz1CTE9DS19TSVpFKXsKKyAgICAgICAgICAgIGNvbnN0IGludCBzdHJpZGU9IGRzdFN0cmlkZTsKKyNpZiBURU1QTEFURV9QUF9NTVgKKyAgICAgICAgICAgIHVpbnQ4X3QgKnRtcFhjaGc7CisjZW5kaWYKKyAgICAgICAgICAgIGlmKGlzQ29sb3IpeworICAgICAgICAgICAgICAgIFFQPSBRUHB0clt4Pj5xcEhTaGlmdF07CisgICAgICAgICAgICAgICAgYy5ub25CUVA9IG5vbkJRUHB0clt4Pj5xcEhTaGlmdF07CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBRUD0gUVBwdHJbeD4+NF07CisgICAgICAgICAgICAgICAgUVA9IChRUCogUVBDb3JyZWN0dXJlICsgMjU2KjEyOCk+PjE2OworICAgICAgICAgICAgICAgIGMubm9uQlFQPSBub25CUVBwdHJbeD4+NF07CisgICAgICAgICAgICAgICAgYy5ub25CUVA9IChjLm5vbkJRUCogUVBDb3JyZWN0dXJlICsgMjU2KjEyOCk+PjE2OworICAgICAgICAgICAgICAgIHlIaXN0b2dyYW1bIHNyY0Jsb2NrW3NyY1N0cmlkZSoxMiArIDRdIF0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMuUVA9IFFQOworI2lmIFRFTVBMQVRFX1BQX01NWAorICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibW92ZCAlMSwgJSVtbTcgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWNrdXN3YiAlJW1tNywgJSVtbTcgIFxuXHQiIC8vIDAsIDAsIDAsIFFQLCAwLCAwLCAwLCBRUAorICAgICAgICAgICAgICAgICJwYWNrdXN3YiAlJW1tNywgJSVtbTcgIFxuXHQiIC8vIDAsUVAsIDAsIFFQLCAwLFFQLCAwLCBRUAorICAgICAgICAgICAgICAgICJwYWNrdXN3YiAlJW1tNywgJSVtbTcgIFxuXHQiIC8vIFFQLC4uLiwgUVAKKyAgICAgICAgICAgICAgICAibW92cSAlJW1tNywgJTAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIDogIj1tIiAoYy5wUVBiKQorICAgICAgICAgICAgICAgIDogInIiIChRUCkKKyAgICAgICAgICAgICk7CisjZW5kaWYKKworCisjaWYgVEVNUExBVEVfUFBfTU1YRVhUICYmIEhBVkVfNlJFR1MKKy8qCisgICAgICAgICAgICBwcmVmZXRjaG50YShzcmNCbG9jayArICgoKHg+PjIpJjYpICsgNSkqc3JjU3RyaWRlICsgMzIpOworICAgICAgICAgICAgcHJlZmV0Y2hudGEoc3JjQmxvY2sgKyAoKCh4Pj4yKSY2KSArIDYpKnNyY1N0cmlkZSArIDMyKTsKKyAgICAgICAgICAgIHByZWZldGNodDAoZHN0QmxvY2sgKyAoKCh4Pj4yKSY2KSArIDUpKmRzdFN0cmlkZSArIDMyKTsKKyAgICAgICAgICAgIHByZWZldGNodDAoZHN0QmxvY2sgKyAoKCh4Pj4yKSY2KSArIDYpKmRzdFN0cmlkZSArIDMyKTsKKyovCisKKyAgICAgICAgICAgIF9fYXNtX18oCisgICAgICAgICAgICAgICAgIm1vdiAlNCwgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJzaHIgJDIsICUlIlJFR19hIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYW5kICQ2LCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZCAlNSwgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3YgJSUiUkVHX2EiLCAlJSJSRUdfZCIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiaW11bCAlMSwgJSUiUkVHX2EiICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImltdWwgJTMsICUlIlJFR19kIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwcmVmZXRjaG50YSAzMiglJSJSRUdfYSIsICUwKSAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHJlZmV0Y2h0MCAzMiglJSJSRUdfZCIsICUyKSAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZCAlMSwgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJhZGQgJTMsICUlIlJFR19kIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHJlZmV0Y2hudGEgMzIoJSUiUkVHX2EiLCAlMCkgIFxuXHQiCisgICAgICAgICAgICAgICAgInByZWZldGNodDAgMzIoJSUiUkVHX2QiLCAlMikgICBcblx0IgorICAgICAgICAgICAgICAgIDo6ICJyIiAoc3JjQmxvY2spLCAiciIgKCh4ODZfcmVnKXNyY1N0cmlkZSksICJyIiAoZHN0QmxvY2spLCAiciIgKCh4ODZfcmVnKWRzdFN0cmlkZSksCisgICAgICAgICAgICAgICAgImciICgoeDg2X3JlZyl4KSwgImciICgoeDg2X3JlZyljb3B5QWhlYWQpCisgICAgICAgICAgICAgICAgOiAiJSJSRUdfYSwgIiUiUkVHX2QKKyAgICAgICAgICAgICk7CisKKyNlbGlmIFRFTVBMQVRFX1BQXzNETk9XCisvL0ZJWE1FIGNoZWNrIGlmIHRoaXMgaXMgZmFzdGVyIG9uIGFuIDNkbm93IGNoaXAgb3IgaWYgaXQgaXMgZmFzdGVyIHdpdGhvdXQgdGhlIHByZWZldGNoIG9yIC4uLgorLyogICAgICAgICAgcHJlZmV0Y2goc3JjQmxvY2sgKyAoKCh4Pj4zKSYzKSArIDUpKnNyY1N0cmlkZSArIDMyKTsKKyAgICAgICAgICAgIHByZWZldGNoKHNyY0Jsb2NrICsgKCgoeD4+MykmMykgKyA5KSpzcmNTdHJpZGUgKyAzMik7CisgICAgICAgICAgICBwcmVmZXRjaHcoZHN0QmxvY2sgKyAoKCh4Pj4zKSYzKSArIDUpKmRzdFN0cmlkZSArIDMyKTsKKyAgICAgICAgICAgIHByZWZldGNodyhkc3RCbG9jayArICgoKHg+PjMpJjMpICsgOSkqZHN0U3RyaWRlICsgMzIpOworKi8KKyNlbmRpZgorCisgICAgICAgICAgICBSRU5BTUUoYmxvY2tDb3B5KShkc3RCbG9jayArIGRzdFN0cmlkZSpjb3B5QWhlYWQsIGRzdFN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0Jsb2NrICsgc3JjU3RyaWRlKmNvcHlBaGVhZCwgc3JjU3RyaWRlLCBtb2RlICYgTEVWRUxfRklYLCAmYy5wYWNrZWRZT2Zmc2V0KTsKKworICAgICAgICAgICAgaWYobW9kZSAmIExJTkVBUl9JUE9MX0RFSU5UX0ZJTFRFUikKKyAgICAgICAgICAgICAgICBSRU5BTUUoZGVJbnRlcmxhY2VJbnRlcnBvbGF0ZUxpbmVhcikoZHN0QmxvY2ssIGRzdFN0cmlkZSk7CisgICAgICAgICAgICBlbHNlIGlmKG1vZGUgJiBMSU5FQVJfQkxFTkRfREVJTlRfRklMVEVSKQorICAgICAgICAgICAgICAgIFJFTkFNRShkZUludGVybGFjZUJsZW5kTGluZWFyKShkc3RCbG9jaywgZHN0U3RyaWRlLCBjLmRlaW50VGVtcCArIHgpOworICAgICAgICAgICAgZWxzZSBpZihtb2RlICYgTUVESUFOX0RFSU5UX0ZJTFRFUikKKyAgICAgICAgICAgICAgICBSRU5BTUUoZGVJbnRlcmxhY2VNZWRpYW4pKGRzdEJsb2NrLCBkc3RTdHJpZGUpOworICAgICAgICAgICAgZWxzZSBpZihtb2RlICYgQ1VCSUNfSVBPTF9ERUlOVF9GSUxURVIpCisgICAgICAgICAgICAgICAgUkVOQU1FKGRlSW50ZXJsYWNlSW50ZXJwb2xhdGVDdWJpYykoZHN0QmxvY2ssIGRzdFN0cmlkZSk7CisgICAgICAgICAgICBlbHNlIGlmKG1vZGUgJiBGRk1QRUdfREVJTlRfRklMVEVSKQorICAgICAgICAgICAgICAgIFJFTkFNRShkZUludGVybGFjZUZGKShkc3RCbG9jaywgZHN0U3RyaWRlLCBjLmRlaW50VGVtcCArIHgpOworICAgICAgICAgICAgZWxzZSBpZihtb2RlICYgTE9XUEFTUzVfREVJTlRfRklMVEVSKQorICAgICAgICAgICAgICAgIFJFTkFNRShkZUludGVybGFjZUw1KShkc3RCbG9jaywgZHN0U3RyaWRlLCBjLmRlaW50VGVtcCArIHgsIGMuZGVpbnRUZW1wICsgd2lkdGggKyB4KTsKKy8qICAgICAgICAgIGVsc2UgaWYobW9kZSAmIENVQklDX0JMRU5EX0RFSU5UX0ZJTFRFUikKKyAgICAgICAgICAgICAgICBSRU5BTUUoZGVJbnRlcmxhY2VCbGVuZEN1YmljKShkc3RCbG9jaywgZHN0U3RyaWRlKTsKKyovCisKKyAgICAgICAgICAgIC8qIG9ubHkgZGVibG9jayBpZiB3ZSBoYXZlIDIgYmxvY2tzICovCisgICAgICAgICAgICBpZih5ICsgOCA8IGhlaWdodCl7CisgICAgICAgICAgICAgICAgaWYobW9kZSAmIFZfWDFfRklMVEVSKQorICAgICAgICAgICAgICAgICAgICBSRU5BTUUodmVydFgxRmlsdGVyKShkc3RCbG9jaywgc3RyaWRlLCAmYyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZihtb2RlICYgVl9ERUJMT0NLKXsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHQ9IFJFTkFNRSh2ZXJ0Q2xhc3NpZnkpKGRzdEJsb2NrLCBzdHJpZGUsICZjKTsKKworICAgICAgICAgICAgICAgICAgICBpZih0PT0xKQorICAgICAgICAgICAgICAgICAgICAgICAgUkVOQU1FKGRvVmVydExvd1Bhc3MpKGRzdEJsb2NrLCBzdHJpZGUsICZjKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih0PT0yKQorICAgICAgICAgICAgICAgICAgICAgICAgUkVOQU1FKGRvVmVydERlZkZpbHRlcikoZHN0QmxvY2ssIHN0cmlkZSwgJmMpOworICAgICAgICAgICAgICAgIH1lbHNlIGlmKG1vZGUgJiBWX0FfREVCTE9DSyl7CisgICAgICAgICAgICAgICAgICAgIFJFTkFNRShkb19hX2RlYmxvY2spKGRzdEJsb2NrLCBzdHJpZGUsIDEsICZjLCBtb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNpZiBURU1QTEFURV9QUF9NTVgKKyAgICAgICAgICAgIFJFTkFNRSh0cmFuc3Bvc2UxKSh0ZW1wQmxvY2sxLCB0ZW1wQmxvY2syLCBkc3RCbG9jaywgZHN0U3RyaWRlKTsKKyNlbmRpZgorICAgICAgICAgICAgLyogY2hlY2sgaWYgd2UgaGF2ZSBhIHByZXZpb3VzIGJsb2NrIHRvIGRlYmxvY2sgaXQgd2l0aCBkc3RCbG9jayAqLworICAgICAgICAgICAgaWYoeCAtIDggPj0gMCl7CisjaWYgVEVNUExBVEVfUFBfTU1YCisgICAgICAgICAgICAgICAgaWYobW9kZSAmIEhfWDFfRklMVEVSKQorICAgICAgICAgICAgICAgICAgICAgICAgUkVOQU1FKHZlcnRYMUZpbHRlcikodGVtcEJsb2NrMSwgMTYsICZjKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKG1vZGUgJiBIX0RFQkxPQ0speworLy9TVEFSVF9USU1FUgorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdD0gUkVOQU1FKHZlcnRDbGFzc2lmeSkodGVtcEJsb2NrMSwgMTYsICZjKTsKKy8vU1RPUF9USU1FUigiZGMgJiBtaW5tYXgiKQorICAgICAgICAgICAgICAgICAgICBpZih0PT0xKQorICAgICAgICAgICAgICAgICAgICAgICAgUkVOQU1FKGRvVmVydExvd1Bhc3MpKHRlbXBCbG9jazEsIDE2LCAmYyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYodD09MikKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFTkFNRShkb1ZlcnREZWZGaWx0ZXIpKHRlbXBCbG9jazEsIDE2LCAmYyk7CisgICAgICAgICAgICAgICAgfWVsc2UgaWYobW9kZSAmIEhfQV9ERUJMT0NLKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFTkFNRShkb19hX2RlYmxvY2spKHRlbXBCbG9jazEsIDE2LCAxLCAmYywgbW9kZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUkVOQU1FKHRyYW5zcG9zZTIpKGRzdEJsb2NrLTQsIGRzdFN0cmlkZSwgdGVtcEJsb2NrMSArIDQqMTYpOworCisjZWxzZQorICAgICAgICAgICAgICAgIGlmKG1vZGUgJiBIX1gxX0ZJTFRFUikKKyAgICAgICAgICAgICAgICAgICAgaG9yaXpYMUZpbHRlcihkc3RCbG9jay00LCBzdHJpZGUsIFFQKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKG1vZGUgJiBIX0RFQkxPQ0speworI2lmIFRFTVBMQVRFX1BQX0FMVElWRUMKKyAgICAgICAgICAgICAgICAgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1bnNpZ25lZCBjaGFyLCB0ZW1wQmxvY2spWzI3Ml07CisgICAgICAgICAgICAgICAgICAgIGludCB0OworICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2VfMTZ4OF9jaGFyX3RvUGFja2VkQWxpZ25fYWx0aXZlYyh0ZW1wQmxvY2ssIGRzdEJsb2NrIC0gKDQgKyAxKSwgc3RyaWRlKTsKKworICAgICAgICAgICAgICAgICAgICB0ID0gdmVydENsYXNzaWZ5X2FsdGl2ZWModGVtcEJsb2NrLTQ4LCAxNiwgJmMpOworICAgICAgICAgICAgICAgICAgICBpZih0PT0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb1ZlcnRMb3dQYXNzX2FsdGl2ZWModGVtcEJsb2NrLTQ4LCAxNiwgJmMpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3NlXzh4MTZfY2hhcl9mcm9tUGFja2VkQWxpZ25fYWx0aXZlYyhkc3RCbG9jayAtICg0ICsgMSksIHRlbXBCbG9jaywgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHQ9PTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvVmVydERlZkZpbHRlcl9hbHRpdmVjKHRlbXBCbG9jay00OCwgMTYsICZjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZV84eDE2X2NoYXJfZnJvbVBhY2tlZEFsaWduX2FsdGl2ZWMoZHN0QmxvY2sgLSAoNCArIDEpLCB0ZW1wQmxvY2ssIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0PSBSRU5BTUUoaG9yaXpDbGFzc2lmeSkoZHN0QmxvY2stNCwgc3RyaWRlLCAmYyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYodD09MSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFTkFNRShkb0hvcml6TG93UGFzcykoZHN0QmxvY2stNCwgc3RyaWRlLCAmYyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYodD09MikKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFTkFNRShkb0hvcml6RGVmRmlsdGVyKShkc3RCbG9jay00LCBzdHJpZGUsICZjKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH1lbHNlIGlmKG1vZGUgJiBIX0FfREVCTE9DSyl7CisgICAgICAgICAgICAgICAgICAgIFJFTkFNRShkb19hX2RlYmxvY2spKGRzdEJsb2NrLTgsIDEsIHN0cmlkZSwgJmMsIG1vZGUpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvL1RFTVBMQVRFX1BQX01NWAorICAgICAgICAgICAgICAgIGlmKG1vZGUgJiBERVJJTkcpeworICAgICAgICAgICAgICAgIC8vRklYTUUgZmlsdGVyIGZpcnN0IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgaWYoeT4wKSBSRU5BTUUoZGVyaW5nKShkc3RCbG9jayAtIHN0cmlkZSAtIDgsIHN0cmlkZSwgJmMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKG1vZGUgJiBURU1QX05PSVNFX0ZJTFRFUikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJFTkFNRSh0ZW1wTm9pc2VSZWR1Y2VyKShkc3RCbG9jay04LCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy50ZW1wQmx1cnJlZFtpc0NvbG9yXSArIHkqZHN0U3RyaWRlICsgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnRlbXBCbHVycmVkUGFzdFtpc0NvbG9yXSArICh5Pj4zKSoyNTYgKyAoeD4+MykgKyAyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5wcE1vZGUubWF4VG1wTm9pc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0QmxvY2srPTg7CisgICAgICAgICAgICBzcmNCbG9jays9ODsKKworI2lmIFRFTVBMQVRFX1BQX01NWAorICAgICAgICAgICAgdG1wWGNoZz0gdGVtcEJsb2NrMTsKKyAgICAgICAgICAgIHRlbXBCbG9jazE9IHRlbXBCbG9jazI7CisgICAgICAgICAgICB0ZW1wQmxvY2syID0gdG1wWGNoZzsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYobW9kZSAmIERFUklORyl7CisgICAgICAgICAgICBpZih5ID4gMCkgUkVOQU1FKGRlcmluZykoZHN0QmxvY2sgLSBkc3RTdHJpZGUgLSA4LCBkc3RTdHJpZGUsICZjKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKChtb2RlICYgVEVNUF9OT0lTRV9GSUxURVIpKXsKKyAgICAgICAgICAgIFJFTkFNRSh0ZW1wTm9pc2VSZWR1Y2VyKShkc3RCbG9jay04LCBkc3RTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGMudGVtcEJsdXJyZWRbaXNDb2xvcl0gKyB5KmRzdFN0cmlkZSArIHgsCisgICAgICAgICAgICAgICAgICAgIGMudGVtcEJsdXJyZWRQYXN0W2lzQ29sb3JdICsgKHk+PjMpKjI1NiArICh4Pj4zKSArIDI1NiwKKyAgICAgICAgICAgICAgICAgICAgYy5wcE1vZGUubWF4VG1wTm9pc2UpOworICAgICAgICB9CisKKyAgICAgICAgLyogZGlkIHdlIHVzZSBhIHRtcCBidWZmZXIgZm9yIHRoZSBsYXN0IGxpbmVzKi8KKyAgICAgICAgaWYoeSsxNSA+PSBoZWlnaHQpeworICAgICAgICAgICAgdWludDhfdCAqZHN0QmxvY2s9ICYoZHN0W3kqZHN0U3RyaWRlXSk7CisgICAgICAgICAgICBpZih3aWR0aD09RkZBQlMoZHN0U3RyaWRlKSkKKyAgICAgICAgICAgICAgICBsaW5lY3B5KGRzdEJsb2NrLCB0ZW1wRHN0ICsgZHN0U3RyaWRlLCBoZWlnaHQteSwgZHN0U3RyaWRlKTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxoZWlnaHQteTsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdEJsb2NrICsgaSpkc3RTdHJpZGUsIHRlbXBEc3QgKyAoaSsxKSpkc3RTdHJpZGUsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKy8qCisgICAgICAgIGZvcih4PTA7IHg8d2lkdGg7IHgrPTMyKXsKKyAgICAgICAgICAgIHZvbGF0aWxlIGludCBpOworICAgICAgICAgICAgaSs9ICAgZHN0QmxvY2tbeCArIDcqZHN0U3RyaWRlXSArIGRzdEJsb2NrW3ggKyA4KmRzdFN0cmlkZV0KKyAgICAgICAgICAgICAgICArIGRzdEJsb2NrW3ggKyA5KmRzdFN0cmlkZV0gKyBkc3RCbG9ja1t4ICsxMCpkc3RTdHJpZGVdCisgICAgICAgICAgICAgICAgKyBkc3RCbG9ja1t4ICsxMSpkc3RTdHJpZGVdICsgZHN0QmxvY2tbeCArMTIqZHN0U3RyaWRlXTsKKyAgICAgICAgICAgICAgICArIGRzdEJsb2NrW3ggKzEzKmRzdFN0cmlkZV0KKyAgICAgICAgICAgICAgICArIGRzdEJsb2NrW3ggKzE0KmRzdFN0cmlkZV0gKyBkc3RCbG9ja1t4ICsxNSpkc3RTdHJpZGVdOworICAgICAgICB9Ki8KKyAgICB9CisjaWYgICBURU1QTEFURV9QUF8zRE5PVworICAgIF9fYXNtX18gdm9sYXRpbGUoImZlbW1zIik7CisjZWxpZiBURU1QTEFURV9QUF9NTVgKKyAgICBfX2FzbV9fIHZvbGF0aWxlKCJlbW1zIik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0JSSUdIVE5FU1MKKyAgICBpZighaXNDb2xvcil7CisgICAgICAgIGludCBtYXg9MTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPTA7IGk8MjU2OyBpKyspCisgICAgICAgICAgICBpZih5SGlzdG9ncmFtW2ldID4gbWF4KSBtYXg9eUhpc3RvZ3JhbVtpXTsKKworICAgICAgICBmb3IoaT0xOyBpPDI1NjsgaSsrKXsKKyAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgaW50IHN0YXJ0PXlIaXN0b2dyYW1baS0xXS8obWF4LzI1NisxKTsKKyAgICAgICAgICAgIGludCBlbmQ9eUhpc3RvZ3JhbVtpXS8obWF4LzI1NisxKTsKKyAgICAgICAgICAgIGludCBpbmM9IGVuZCA+IHN0YXJ0ID8gMSA6IC0xOworICAgICAgICAgICAgZm9yKHg9c3RhcnQ7IHghPWVuZCtpbmM7IHgrPWluYykKKyAgICAgICAgICAgICAgICBkc3RbIGkqZHN0U3RyaWRlICsgeF0rPTEyODsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihpPTA7IGk8MTAwOyBpKz0yKXsKKyAgICAgICAgICAgIGRzdFsgKHdoaXRlKSpkc3RTdHJpZGUgKyBpXSs9MTI4OworICAgICAgICAgICAgZHN0WyAoYmxhY2spKmRzdFN0cmlkZSArIGldKz0xMjg7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgICpjMj0gYzsgLy9jb3B5IGxvY2FsIGNvbnRleHQgYmFjaworCit9CisKKyN1bmRlZiBSRU5BTUUKKyN1bmRlZiBURU1QTEFURV9QUF9DCisjdW5kZWYgVEVNUExBVEVfUFBfQUxUSVZFQworI3VuZGVmIFRFTVBMQVRFX1BQX01NWAorI3VuZGVmIFRFTVBMQVRFX1BQX01NWEVYVAorI3VuZGVmIFRFTVBMQVRFX1BQXzNETk9XCisjdW5kZWYgVEVNUExBVEVfUFBfU1NFMgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnBvc3Rwcm9jL3Bvc3Rwcm9jcmVzLnJjIGIvZmZtcGVnL2xpYnBvc3Rwcm9jL3Bvc3Rwcm9jcmVzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MTA0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlicG9zdHByb2MvcG9zdHByb2NyZXMucmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIFdpbmRvd3MgcmVzb3VyY2UgZmlsZSBmb3IgbGlicG9zdHByb2MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSmFtZXMgQWxtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaWFuY2hlbmcgIlRpbW90aHkiIEd1CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAibGlicG9zdHByb2MvdmVyc2lvbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworMSBWRVJTSU9OSU5GTworRklMRVZFUlNJT04gICAgIExJQlBPU1RQUk9DX1ZFUlNJT05fTUFKT1IsIExJQlBPU1RQUk9DX1ZFUlNJT05fTUlOT1IsIExJQlBPU1RQUk9DX1ZFUlNJT05fTUlDUk8sIDAKK1BST0RVQ1RWRVJTSU9OICBMSUJQT1NUUFJPQ19WRVJTSU9OX01BSk9SLCBMSUJQT1NUUFJPQ19WRVJTSU9OX01JTk9SLCBMSUJQT1NUUFJPQ19WRVJTSU9OX01JQ1JPLCAwCitGSUxFRkxBR1NNQVNLICAgVlNfRkZJX0ZJTEVGTEFHU01BU0sKK0ZJTEVPUyAgICAgICAgICBWT1NfTlRfV0lORE9XUzMyCitGSUxFVFlQRSAgICAgICAgVkZUX0RMTAoreworICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICB7CisgICAgICAgIEJMT0NLICIwNDA5MDRCMCIKKyAgICAgICAgeworICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgICAgICAiRkZtcGVnIFByb2plY3QiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgICJGRm1wZWcgcG9zdHByb2Nlc3NpbmcgbGlicmFyeSIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICAgICAgQVZfU1RSSU5HSUZZKExJQlBPU1RQUk9DX1ZFUlNJT04pCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgICAgICJsaWJwb3N0cHJvYyIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICAgIkNvcHlyaWdodCAoQykgMjAwMC0iIEFWX1NUUklOR0lGWShDT05GSUdfVEhJU19ZRUFSKSAiIEZGbXBlZyBQcm9qZWN0IgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAicG9zdHByb2MiIEJVSUxEU1VGICItIiBBVl9TVFJJTkdJRlkoTElCUE9TVFBST0NfVkVSU0lPTl9NQUpPUikgU0xJQlNVRgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgICAgICAiRkZtcGVnIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgICBGRk1QRUdfVkVSU0lPTgorICAgICAgICB9CisgICAgfQorCisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIHsKKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwNDA5LCAweDA0QjAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlicG9zdHByb2MvdmVyc2lvbi5oIGIvZmZtcGVnL2xpYnBvc3Rwcm9jL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWMyNDY2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnBvc3Rwcm9jL3ZlcnNpb24uaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogVmVyc2lvbiBtYWNyb3MuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgUE9TVFBST0NfUE9TVFBST0NFU1NfVkVSU0lPTl9ICisjZGVmaW5lIFBPU1RQUk9DX1BPU1RQUk9DRVNTX1ZFUlNJT05fSAorCisvKioKKyAqIEBmaWxlCisgKiBMaWJwb3N0cHJvYyB2ZXJzaW9uIG1hY3JvcworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisKKyNkZWZpbmUgTElCUE9TVFBST0NfVkVSU0lPTl9NQUpPUiAgNTMKKyNkZWZpbmUgTElCUE9TVFBST0NfVkVSU0lPTl9NSU5PUiAgIDMKKyNkZWZpbmUgTElCUE9TVFBST0NfVkVSU0lPTl9NSUNSTyAxMDAKKworI2RlZmluZSBMSUJQT1NUUFJPQ19WRVJTSU9OX0lOVCBBVl9WRVJTSU9OX0lOVChMSUJQT1NUUFJPQ19WRVJTSU9OX01BSk9SLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlBPU1RQUk9DX1ZFUlNJT05fTUlOT1IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCUE9TVFBST0NfVkVSU0lPTl9NSUNSTykKKyNkZWZpbmUgTElCUE9TVFBST0NfVkVSU0lPTiAgICAgQVZfVkVSU0lPTihMSUJQT1NUUFJPQ19WRVJTSU9OX01BSk9SLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCUE9TVFBST0NfVkVSU0lPTl9NSU5PUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlBPU1RQUk9DX1ZFUlNJT05fTUlDUk8pCisjZGVmaW5lIExJQlBPU1RQUk9DX0JVSUxEICAgICAgIExJQlBPU1RQUk9DX1ZFUlNJT05fSU5UCisKKyNkZWZpbmUgTElCUE9TVFBST0NfSURFTlQgICAgICAgInBvc3Rwcm9jIiBBVl9TVFJJTkdJRlkoTElCUE9TVFBST0NfVkVSU0lPTikKKworI2VuZGlmIC8qIFBPU1RQUk9DX1BPU1RQUk9DRVNTX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnJhcnkubWFrIGIvZmZtcGVnL2xpYnJhcnkubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZTU1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlicmFyeS5tYWsKQEAgLTAsMCArMSwxMTEgQEAKK2luY2x1ZGUgJChTUkNfUEFUSCkvY29tbW9uLm1haworCitMSUJWRVJTSU9OIDo9ICQobGliJChOQU1FKV9WRVJTSU9OKQorTElCTUFKT1IgICA6PSAkKGxpYiQoTkFNRSlfVkVSU0lPTl9NQUpPUikKK0xJQk1JTk9SICAgOj0gJChsaWIkKE5BTUUpX1ZFUlNJT05fTUlOT1IpCitJTkNJTlNURElSIDo9ICQoSU5DRElSKS9saWIkKE5BTUUpCisKK0lOU1RIRUFERVJTIDo9ICQoSU5TVEhFQURFUlMpICQoSEVBREVSUzolPSQoU1VCRElSKSUpCisKK2FsbC0kKENPTkZJR19TVEFUSUMpOiAkKFNVQkRJUikkKExJQk5BTUUpCithbGwtJChDT05GSUdfU0hBUkVEKTogJChTVUJESVIpJChTTElCTkFNRSkKKworJChTVUJESVIpJS10ZXN0Lm86ICQoU1VCRElSKSUtdGVzdC5jCisJJChDT01QSUxFX0MpCisKKyQoU1VCRElSKSUtdGVzdC5vOiAkKFNVQkRJUiklLmMKKwkkKENPTVBJTEVfQykKKworJChTVUJESVIpJS10ZXN0Lmk6ICQoU1VCRElSKSUtdGVzdC5jCisJJChDQykgJChDQ0ZMQUdTKSAkKENDX0UpICQ8CisKKyQoU1VCRElSKSUtdGVzdC5pOiAkKFNVQkRJUiklLmMKKwkkKENDKSAkKENDRkxBR1MpICQoQ0NfRSkgJDwKKworJChTVUJESVIpeDg2LyUubzogJChTVUJESVIpeDg2LyUuYXNtCisJJChERVBZQVNNKSAkKFlBU01GTEFHUykgLUkgJCg8RCkvIC1NIC1vICRAICQ8ID4gJChAOi5vPS5kKQorCSQoWUFTTSkgJChZQVNNRkxBR1MpIC1JICQoPEQpLyAtbyAkQCAkPAorCS0kKGlmICQoQVNNU1RSSVBGTEFHUyksICQoU1RSSVApICQoQVNNU1RSSVBGTEFHUykgJEApCisKK0xJQk9CSlMgOj0gJChPQkpTKSAkKFNVQkRJUiklLmgubyAkKFRFU1RPQkpTKQorJChMSUJPQkpTKSAkKExJQk9CSlM6Lm89LnMpICQoTElCT0JKUzoubz0uaSk6ICAgQ1BQRkxBR1MgKz0gLURIQVZFX0FWX0NPTkZJR19ICiskKFRFU1RPQkpTKSAkKFRFU1RPQkpTOi5vPS5pKTogQ1BQRkxBR1MgKz0gLURURVNUCisKKyQoU1VCRElSKSQoTElCTkFNRSk6ICQoT0JKUykKKwkkKFJNKSAkQAorCSQoQVIpICQoQVJGTEFHUykgJChBUl9PKSAkXgorCSQoUkFOTElCKSAkQAorCitpbnN0YWxsLWhlYWRlcnM6IGluc3RhbGwtbGliJChOQU1FKS1oZWFkZXJzIGluc3RhbGwtbGliJChOQU1FKS1wa2djb25maWcKKworaW5zdGFsbC1saWJzLSQoQ09ORklHX1NUQVRJQyk6IGluc3RhbGwtbGliJChOQU1FKS1zdGF0aWMKK2luc3RhbGwtbGlicy0kKENPTkZJR19TSEFSRUQpOiBpbnN0YWxsLWxpYiQoTkFNRSktc2hhcmVkCisKK2RlZmluZSBSVUxFUworJChUT09MUyk6ICAgICBUSElTTElCID0gJChGVUxMTkFNRTolPSQoTERfTElCKSkKKyQoVEVTVFBST0dTKTogVEhJU0xJQiA9ICQoU1VCRElSKSQoTElCTkFNRSkKKworJChURVNUUFJPR1MpICQoVE9PTFMpOiAlJChFWEVTVUYpOiAlLm8gJChFWEVPQkpTKQorCSQkKExEKSAkKExERkxBR1MpICQoTERFWEVGTEFHUykgJCQoTERfTykgJCQoZmlsdGVyICUubywkJF4pICQkKFRISVNMSUIpICQoRkZFWFRSQUxJQlMpICQkKEVMSUJTKQorCiskKFNVQkRJUikkKFNMSUJOQU1FKTogJChTVUJESVIpJChTTElCTkFNRV9XSVRIX01BSk9SKQorCSQoUSljZCAuLyQoU1VCRElSKSAmJiAkKExOX1MpICQoU0xJQk5BTUVfV0lUSF9NQUpPUikgJChTTElCTkFNRSkKKworJChTVUJESVIpJChTTElCTkFNRV9XSVRIX01BSk9SKTogJChPQkpTKSAkKFNMSUJPQkpTKSAkKFNVQkRJUilsaWIkKE5BTUUpLnZlcgorCSQoU0xJQl9DUkVBVEVfREVGX0NNRCkKKwkkJChMRCkgJChTSEZMQUdTKSAkKExERkxBR1MpICQkKExEX08pICQkKGZpbHRlciAlLm8sJCReKSAkKEZGRVhUUkFMSUJTKQorCSQoU0xJQl9FWFRSQV9DTUQpCisKK2lmZGVmIFNVQkRJUgorJChTVUJESVIpJChTTElCTkFNRV9XSVRIX01BSk9SKTogJChERVBfTElCUykKK2VuZGlmCisKK2NsZWFuOjoKKwkkKFJNKSAkKGFkZHByZWZpeCAkKFNVQkRJUiksKi10ZXN0JChFWEVTVUYpICQoQ0xFQU5GSUxFUykgJChDTEVBTlNVRkZJWEVTKSAkKExJQlNVRkZJWEVTKSkgXAorCSAgICAkKENMRUFOU1VGRklYRVM6JT0kKFNVQkRJUikkKEFSQ0gpLyUpCisKK2Rpc3RjbGVhbjo6IGNsZWFuCisJJChSTSkgJChESVNUQ0xFQU5TVUZGSVhFUzolPSQoU1VCRElSKSUpICQoRElTVENMRUFOU1VGRklYRVM6JT0kKFNVQkRJUikkKEFSQ0gpLyUpCisKK2luc3RhbGwtbGliJChOQU1FKS1zaGFyZWQ6ICQoU1VCRElSKSQoU0xJQk5BTUUpCisJJChRKW1rZGlyIC1wICIkKFNITElCRElSKSIKKwkkJChJTlNUQUxMKSAtbSA3NTUgJCQ8ICIkKFNITElCRElSKS8kKFNMSUJfSU5TVEFMTF9OQU1FKSIKKwkkJChTVFJJUCkgIiQoU0hMSUJESVIpLyQoU0xJQl9JTlNUQUxMX05BTUUpIgorCSQoUSkkKGZvcmVhY2ggRiwkKFNMSUJfSU5TVEFMTF9MSU5LUyksKGNkICIkKFNITElCRElSKSIgJiYgJChMTl9TKSAkKFNMSUJfSU5TVEFMTF9OQU1FKSAkKEYpKTspCisJJChpZiAkKFNMSUJfSU5TVEFMTF9FWFRSQV9TSExJQiksJCQoSU5TVEFMTCkgLW0gNjQ0ICQoU0xJQl9JTlNUQUxMX0VYVFJBX1NITElCOiU9JChTVUJESVIpJSkgIiQoU0hMSUJESVIpIikKKwkkKGlmICQoU0xJQl9JTlNUQUxMX0VYVFJBX0xJQiksJChRKW1rZGlyIC1wICIkKExJQkRJUikiKQorCSQoaWYgJChTTElCX0lOU1RBTExfRVhUUkFfTElCKSwkJChJTlNUQUxMKSAtbSA2NDQgJChTTElCX0lOU1RBTExfRVhUUkFfTElCOiU9JChTVUJESVIpJSkgIiQoTElCRElSKSIpCisKK2luc3RhbGwtbGliJChOQU1FKS1zdGF0aWM6ICQoU1VCRElSKSQoTElCTkFNRSkKKwkkKFEpbWtkaXIgLXAgIiQoTElCRElSKSIKKwkkJChJTlNUQUxMKSAtbSA2NDQgJCQ8ICIkKExJQkRJUikiCisJJChMSUJfSU5TVEFMTF9FWFRSQV9DTUQpCisKK2luc3RhbGwtbGliJChOQU1FKS1oZWFkZXJzOiAkKGFkZHByZWZpeCAkKFNVQkRJUiksJChIRUFERVJTKSAkKEJVSUxUX0hFQURFUlMpKQorCSQoUSlta2RpciAtcCAiJChJTkNJTlNURElSKSIKKwkkJChJTlNUQUxMKSAtbSA2NDQgJCReICIkKElOQ0lOU1RESVIpIgorCitpbnN0YWxsLWxpYiQoTkFNRSktcGtnY29uZmlnOiAkKFNVQkRJUilsaWIkKEZVTExOQU1FKS5wYworCSQoUSlta2RpciAtcCAiJChMSUJESVIpL3BrZ2NvbmZpZyIKKwkkJChJTlNUQUxMKSAtbSA2NDQgJCReICIkKExJQkRJUikvcGtnY29uZmlnIgorCit1bmluc3RhbGwtbGliczo6CisJLSQoUk0pICIkKFNITElCRElSKS8kKFNMSUJOQU1FX1dJVEhfTUFKT1IpIiBcCisJICAgICAgICIkKFNITElCRElSKS8kKFNMSUJOQU1FKSIgICAgICAgICAgICBcCisJICAgICAgICIkKFNITElCRElSKS8kKFNMSUJOQU1FX1dJVEhfVkVSU0lPTikiCisJLSQoUk0pICAkKFNMSUJfSU5TVEFMTF9FWFRSQV9TSExJQjolPSIkKFNITElCRElSKS8lIikKKwktJChSTSkgICQoU0xJQl9JTlNUQUxMX0VYVFJBX0xJQjolPSIkKExJQkRJUikvJSIpCisJLSQoUk0pICIkKExJQkRJUikvJChMSUJOQU1FKSIKKwordW5pbnN0YWxsLWhlYWRlcnM6OgorCSQoUk0pICQoYWRkcHJlZml4ICIkKElOQ0lOU1RESVIpLyIsJChIRUFERVJTKSAkKEJVSUxUX0hFQURFUlMpKQorCSQoUk0pICIkKExJQkRJUikvcGtnY29uZmlnL2xpYiQoRlVMTE5BTUUpLnBjIgorCS1ybWRpciAiJChJTkNJTlNURElSKSIKK2VuZGVmCisKKyQoZXZhbCAkKFJVTEVTKSkKKworJChUT09MUyk6ICAgICAkKERFUF9MSUJTKSAkKFNVQkRJUikkKCQoQ09ORklHX1NIQVJFRDp5ZXM9UylMSUJOQU1FKQorJChURVNUUFJPR1MpOiAkKERFUF9MSUJTKSAkKFNVQkRJUikkKExJQk5BTUUpCisKK3Rlc3Rwcm9nczogJChURVNUUFJPR1MpCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9NYWtlZmlsZSBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMGVlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9NYWtlZmlsZQpAQCAtMCwwICsxLDI0IEBACitpbmNsdWRlICQoU1VCRElSKS4uL2NvbmZpZy5tYWsKKworTkFNRSA9IHN3cmVzYW1wbGUKK0ZGTElCUyA9IGF2dXRpbAorCitIRUFERVJTID0gc3dyZXNhbXBsZS5oICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdmVyc2lvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK09CSlMgPSBhdWRpb2NvbnZlcnQubyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBkaXRoZXIubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBvcHRpb25zLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZW1hdHJpeC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXNhbXBsZS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXNhbXBsZV9kc3AubyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd3Jlc2FtcGxlLm8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd3Jlc2FtcGxlX2ZyYW1lLm8gICAgICAgICAgICAgICAgICAgIFwKKworT0JKUy0kKENPTkZJR19MSUJTT1hSKSArPSBzb3hyX3Jlc2FtcGxlLm8KK09CSlMtJChDT05GSUdfU0hBUkVEKSAgKz0gbG9nMl90YWIubworCisjIFdpbmRvd3MgcmVzb3VyY2UgZmlsZQorU0xJQk9CSlMtJChIQVZFX0dOVV9XSU5EUkVTKSArPSBzd3Jlc2FtcGxlcmVzLm8KKworVEVTVFBST0dTID0gc3dyZXNhbXBsZQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3cmVzYW1wbGUvYWFyY2g2NC9NYWtlZmlsZSBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2FhcmNoNjQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwZWQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2FhcmNoNjQvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACitPQkpTICAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSBhYXJjaDY0L2F1ZGlvX2NvbnZlcnRfaW5pdC5vCisKK09CSlMtJChDT05GSUdfTkVPTl9DTE9CQkVSX1RFU1QpICs9IGFhcmNoNjQvbmVvbnRlc3QubworCitORU9OLU9CSlMgICAgICAgICAgICAgICAgICAgICAgICArPSBhYXJjaDY0L2F1ZGlvX2NvbnZlcnRfbmVvbi5vCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9hYXJjaDY0L2F1ZGlvX2NvbnZlcnRfaW5pdC5jIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvYWFyY2g2NC9hdWRpb19jb252ZXJ0X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGUyNGFkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvYWFyY2g2NC9hdWRpb19jb252ZXJ0X2luaXQuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGlic3dyZXNhbXBsZS4KKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIGxpYnN3cmVzYW1wbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAibGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlX2ludGVybmFsLmgiCisjaW5jbHVkZSAibGlic3dyZXNhbXBsZS9hdWRpb2NvbnZlcnQuaCIKKwordm9pZCBzd3JpX29sZGFwaV9jb252X2ZsdF90b19zMTZfbmVvbihpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGludCBsZW4pOwordm9pZCBzd3JpX29sZGFwaV9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uKGludDE2X3QgKmRzdCwgZmxvYXQgKmNvbnN0ICpzcmMsIGludCBsZW4sIGludCBjaGFubmVscyk7Cit2b2lkIHN3cmlfb2xkYXBpX2NvbnZfZmx0cF90b19zMTZfbmNoX25lb24oaW50MTZfdCAqZHN0LCBmbG9hdCAqY29uc3QgKnNyYywgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKKworc3RhdGljIHZvaWQgY29udl9mbHRfdG9fczE2X25lb24odWludDhfdCAqKmRzdCwgY29uc3QgdWludDhfdCAqKnNyYywgaW50IGxlbil7CisgICAgc3dyaV9vbGRhcGlfY29udl9mbHRfdG9fczE2X25lb24oKGludDE2X3QqKSpkc3QsIChjb25zdCBmbG9hdCopKnNyYywgbGVuKTsKK30KKworc3RhdGljIHZvaWQgY29udl9mbHRwX3RvX3MxNl8yY2hfbmVvbih1aW50OF90ICoqZHN0LCBjb25zdCB1aW50OF90ICoqc3JjLCBpbnQgbGVuKXsKKyAgICBzd3JpX29sZGFwaV9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uKChpbnQxNl90KikqZHN0LCAoZmxvYXQgKmNvbnN0KilzcmMsIGxlbiwgMik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZfZmx0cF90b19zMTZfbmNoX25lb24odWludDhfdCAqKmRzdCwgY29uc3QgdWludDhfdCAqKnNyYywgaW50IGxlbil7CisgICAgaW50IGNoYW5uZWxzOworICAgIGZvcihjaGFubmVscz0zOyBjaGFubmVsczxTV1JfQ0hfTUFYICYmIHNyY1tjaGFubmVsc107IGNoYW5uZWxzKyspCisgICAgICAgIDsKKyAgICBzd3JpX29sZGFwaV9jb252X2ZsdHBfdG9fczE2X25jaF9uZW9uKChpbnQxNl90KikqZHN0LCAoZmxvYXQgKmNvbnN0KilzcmMsIGxlbiwgY2hhbm5lbHMpOworfQorCithdl9jb2xkIHZvaWQgc3dyaV9hdWRpb19jb252ZXJ0X2luaXRfYWFyY2g2NChzdHJ1Y3QgQXVkaW9Db252ZXJ0ICphYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW5fZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBhYy0+c2ltZF9mPSBOVUxMOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlmKG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTYgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUIHx8IG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVFApCisgICAgICAgICAgICBhYy0+c2ltZF9mID0gY29udl9mbHRfdG9fczE2X25lb247CisgICAgICAgIGlmKG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTYgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUUCAmJiBjaGFubmVscyA9PSAyKQorICAgICAgICAgICAgYWMtPnNpbWRfZiA9IGNvbnZfZmx0cF90b19zMTZfMmNoX25lb247CisgICAgICAgIGlmKG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTYgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUUCAmJiBjaGFubmVscyA+ICAyKQorICAgICAgICAgICAgYWMtPnNpbWRfZiA9IGNvbnZfZmx0cF90b19zMTZfbmNoX25lb247CisgICAgICAgIGlmKGFjLT5zaW1kX2YpCisgICAgICAgICAgICBhYy0+aW5fc2ltZF9hbGlnbl9tYXNrID0gYWMtPm91dF9zaW1kX2FsaWduX21hc2sgPSAxNTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9hYXJjaDY0L2F1ZGlvX2NvbnZlcnRfbmVvbi5TIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvYWFyY2g2NC9hdWRpb19jb252ZXJ0X25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZlZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvYWFyY2g2NC9hdWRpb19jb252ZXJ0X25lb24uUwpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxNCBKYW5uZSBHcnVuYXUgPGphbm5lLWxpYmF2QGphbm5hdS5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9hc20uUyIKKworZnVuY3Rpb24gc3dyaV9vbGRhcGlfY29udl9mbHRfdG9fczE2X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YnMgICAgICAgICAgICB4MiwgIHgyLCAgIzgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40c30sIFt4MV0sICAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY0LjRzLCAgdjAuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40c30sIFt4MV0sICAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY1LjRzLCAgdjEuNHMsICAjMzEKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDNmCisgICAgICAgIGFuZHMgICAgICAgICAgICB4MTIsIHgyLCAgI34xNQorICAgICAgICBiLmVxICAgICAgICAgICAgMmYKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHgxMiwgeDEyLCAjMTYKKyAgICAgICAgc3Fyc2hybiAgICAgICAgIHY0LjRoLCAgdjQuNHMsICAjMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi40c30sIFt4MV0sICAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY2LjRzLCAgdjIuNHMsICAjMzEKKyAgICAgICAgc3Fyc2hybjIgICAgICAgIHY0LjhoLCAgdjUuNHMsICAjMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My40c30sIFt4MV0sICAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY3LjRzLCAgdjMuNHMsICAjMzEKKyAgICAgICAgc3Fyc2hybiAgICAgICAgIHY2LjRoLCAgdjYuNHMsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC44aH0sIFt4MF0sICAjMTYKKyAgICAgICAgc3Fyc2hybjIgICAgICAgIHY2LjhoLCAgdjcuNHMsICAjMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40c30sIFt4MV0sICAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY0LjRzLCAgdjAuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40c30sIFt4MV0sICAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY1LjRzLCAgdjEuNHMsICAjMzEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ni44aH0sIFt4MF0sICAjMTYKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIGFuZHMgICAgICAgICAgICB4MiwgIHgyLCAgIzE1CisgICAgICAgIGIuZXEgICAgICAgICAgICAzZgorMjogICAgICBsZDEgICAgICAgICAgICAge3YyLjRzfSwgW3gxXSwgICMxNgorICAgICAgICBzcXJzaHJuICAgICAgICAgdjQuNGgsICB2NC40cywgICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjYuNHMsICB2Mi40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjRzfSwgW3gxXSwgICMxNgorICAgICAgICBzcXJzaHJuMiAgICAgICAgdjQuOGgsICB2NS40cywgICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjcuNHMsICB2My40cywgICMzMQorICAgICAgICBzcXJzaHJuICAgICAgICAgdjYuNGgsICB2Ni40cywgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjhofSwgW3gwXSwgICMxNgorICAgICAgICBzcXJzaHJuMiAgICAgICAgdjYuOGgsICB2Ny40cywgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y2LjhofSwgW3gwXQorICAgICAgICByZXQKKzM6ICAgICAgc3Fyc2hybiAgICAgICAgIHY0LjRoLCAgdjQuNHMsICAjMTYKKyAgICAgICAgc3Fyc2hybjIgICAgICAgIHY0LjhoLCAgdjUuNHMsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC44aH0sIFt4MF0KKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIHN3cmlfb2xkYXBpX2NvbnZfZmx0cF90b19zMTZfMmNoX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkcCAgICAgICAgICAgICB4NCwgIHg1LCAgW3gxXQorICAgICAgICBzdWJzICAgICAgICAgICAgeDIsICB4MiwgICM4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHN9LCAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NC40cywgIHYwLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNHN9LCAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NS40cywgIHYxLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNHN9LCAgW3g1XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Ni40cywgIHYyLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuNHN9LCAgW3g1XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Ny40cywgIHYzLjRzLCAgIzMxCisgICAgICAgIGIuZXEgICAgICAgICAgICAzZgorICAgICAgICBhbmRzICAgICAgICAgICAgeDEyLCB4MiwgICN+MTUKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDJmCisxOiAgICAgIHN1YnMgICAgICAgICAgICB4MTIsIHgxMiwgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjRzfSwgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MjAuNHMsIHYxNi40cywgIzMxCisgICAgICAgIHNyaSAgICAgICAgICAgICB2Ni40cywgIHY0LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE3LjRzfSwgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MjEuNHMsIHYxNy40cywgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE4LjRzfSwgW3g1XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MjIuNHMsIHYxOC40cywgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE5LjRzfSwgW3g1XSwgIzE2CisgICAgICAgIHNyaSAgICAgICAgICAgICB2Ny40cywgIHY1LjRzLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djYuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MjMuNHMsIHYxOS40cywgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIHNyaSAgICAgICAgICAgICB2MjIuNHMsIHYyMC40cywgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHN9LCAgW3g0XSwgIzE2CisgICAgICAgIHNyaSAgICAgICAgICAgICB2MjMuNHMsIHYyMS40cywgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLjRzfSwgW3gwXSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NC40cywgIHYwLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNHN9LCAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NS40cywgIHYxLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNHN9LCAgW3g1XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Ni40cywgIHYyLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuNHN9LCAgW3g1XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Ny40cywgIHYzLjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLjRzfSwgW3gwXSwgIzE2CisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICBhbmRzICAgICAgICAgICAgeDIsICB4MiwgICMxNQorICAgICAgICBiLmVxICAgICAgICAgICAgM2YKKzI6ICAgICAgc3JpICAgICAgICAgICAgIHY2LjRzLCAgdjQuNHMsICAjMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40c30sICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYwLjRzLCAgdjAuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40c30sICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYxLjRzLCAgdjEuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi40c30sICBbeDVdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYyLjRzLCAgdjIuNHMsICAjMzEKKyAgICAgICAgc3JpICAgICAgICAgICAgIHY3LjRzLCAgdjUuNHMsICAjMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My40c30sICBbeDVdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYzLjRzLCAgdjMuNHMsICAjMzEKKyAgICAgICAgc3JpICAgICAgICAgICAgIHYyLjRzLCAgdjAuNHMsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ni40cyx2Ny40c30sICBbeDBdLCAjMzIKKyAgICAgICAgc3JpICAgICAgICAgICAgIHYzLjRzLCAgdjEuNHMsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi40cyx2My40c30sICBbeDBdLCAjMzIKKyAgICAgICAgcmV0CiszOiAgICAgIHNyaSAgICAgICAgICAgICB2Ni40cywgIHY0LjRzLCAgIzE2CisgICAgICAgIHNyaSAgICAgICAgICAgICB2Ny40cywgIHY1LjRzLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djYuNHMsdjcuNHN9LCAgW3gwXQorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gc3dyaV9vbGRhcGlfY29udl9mbHRwX3RvX3MxNl9uY2hfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgY21wICAgICAgICAgICAgIHczLCAgIzIKKyAgICAgICAgYi5lcSAgICAgICAgICAgIFgoc3dyaV9vbGRhcGlfY29udl9mbHRwX3RvX3MxNl8yY2hfbmVvbikKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFmCisgICAgICAgIGxkciAgICAgICAgICAgICB4MSwgIFt4MV0KKyAgICAgICAgYiAgICAgICAgICAgICAgIFgoc3dyaV9vbGRhcGlfY29udl9mbHRfdG9fczE2X25lb24pCisxOgorICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjNAorICAgICAgICBsc2wgICAgICAgICAgICAgeDEyLCB4MywgICMxCisgICAgICAgIGIubHQgICAgICAgICAgICA0ZgorCis1OiAgICAgIC8vIDQgY2hhbm5lbHMKKyAgICAgICAgbGRwICAgICAgICAgICAgIHg0LCB4NSwgW3gxXSwgIzE2CisgICAgICAgIGxkcCAgICAgICAgICAgICB4NiwgeDcsIFt4MV0sICMxNgorICAgICAgICBtb3YgICAgICAgICAgICAgdzksICB3MgorICAgICAgICBtb3YgICAgICAgICAgICAgeDgsICB4MAorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjQuNHMsICB2NC40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjRzfSwgICAgICAgIFt4NV0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjUuNHMsICB2NS40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjRzfSwgICAgICAgIFt4Nl0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjYuNHMsIHY2LjRzLCAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny40c30sICAgICAgICBbeDddLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY3LjRzLCB2Ny40cywgIzMxCis2OgorICAgICAgICBzdWJzICAgICAgICAgICAgdzksICB3OSwgICM4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MC40cywgIHYwLjRzLCAgIzMxCisgICAgICAgIHNyaSAgICAgICAgICAgICB2NS40cywgIHY0LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNHN9LCAgICAgICAgW3g1XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MS40cywgIHYxLjRzLCAgIzMxCisgICAgICAgIHNyaSAgICAgICAgICAgICB2Ny40cywgIHY2LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNHN9LCAgICAgICAgW3g2XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Mi40cywgIHYyLjRzLCAgIzMxCisgICAgICAgIHppcDEgICAgICAgICAgICB2MTYuNHMsIHY1LjRzLCAgdjcuNHMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My40c30sICAgICAgICBbeDddLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYzLjRzLCAgdjMuNHMsICAjMzEKKyAgICAgICAgemlwMiAgICAgICAgICAgIHYxNy40cywgdjUuNHMsICB2Ny40cworICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi5kfVswXSwgICAgIFt4OF0sIHgxMgorICAgICAgICBzcmkgICAgICAgICAgICAgdjEuNHMsICB2MC40cywgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi5kfVsxXSwgICAgIFt4OF0sIHgxMgorICAgICAgICBzcmkgICAgICAgICAgICAgdjMuNHMsICB2Mi40cywgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNy5kfVswXSwgICAgIFt4OF0sIHgxMgorICAgICAgICB6aXAxICAgICAgICAgICAgdjE4LjRzLCB2MS40cywgIHYzLjRzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE3LmR9WzFdLCAgICAgW3g4XSwgeDEyCisgICAgICAgIHppcDIgICAgICAgICAgICB2MTkuNHMsIHYxLjRzLCAgdjMuNHMKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDdmCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NC40cywgIHY0LjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE4LmR9WzBdLCAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuNHN9LCAgICAgICAgW3g1XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NS40cywgIHY1LjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE4LmR9WzFdLCAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuNHN9LCAgICBbeDZdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY2LjRzLCB2Ni40cywgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE5LmR9WzBdLCAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuNHN9LCAgICBbeDddLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY3LjRzLCB2Ny40cywgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE5LmR9WzFdLCAgICAgW3g4XSwgeDEyCisgICAgICAgIGIgICAgICAgICAgICAgICA2YgorNzoKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguZH1bMF0sICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguZH1bMV0sICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuZH1bMF0sICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuZH1bMV0sICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHczLCAgdzMsICAjNAorICAgICAgICBiLmVxICAgICAgICAgICAgZW5kCisgICAgICAgIGNtcCAgICAgICAgICAgICB3MywgICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzgKKyAgICAgICAgYi5nZSAgICAgICAgICAgIDViCisKKzQ6ICAgICAgLy8gMiBjaGFubmVscworICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjMgorICAgICAgICBiLmx0ICAgICAgICAgICAgNGYKKyAgICAgICAgbGRwICAgICAgICAgICAgIHg0LCAgeDUsICBbeDFdLCAjMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHc5LCAgdzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDAKKyAgICAgICAgdHN0ICAgICAgICAgICAgIHc5LCAgIzgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY0LjRzLCAgdjQuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS40c30sICAgICAgICBbeDVdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY1LjRzLCAgdjUuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY2LjRzLCAgdjYuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny40c30sICAgICAgICBbeDVdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY3LjRzLCAgdjcuNHMsICAjMzEKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDZmCisgICAgICAgIHN1YnMgICAgICAgICAgICB3OSwgIHc5LCAgIzgKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDdmCisgICAgICAgIHNyaSAgICAgICAgICAgICB2NS40cywgIHY0LjRzLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2NC40cywgIHY0LjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bMF0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHNyaSAgICAgICAgICAgICB2Ny40cywgIHY2LjRzLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bMV0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Ni40cywgIHY2LjRzLCAjMzEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVsyXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVszXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVswXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVsxXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS40c30sICAgICAgICBbeDVdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY1LjRzLCAgdjUuNHMsICAjMzEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVsyXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVszXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny40c30sICAgICAgICBbeDVdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHY3LjRzLCAgdjcuNHMsICAjMzEKKzY6CisgICAgICAgIHN1YnMgICAgICAgICAgICB3OSwgIHc5LCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIHNyaSAgICAgICAgICAgICB2NS40cywgIHY0LjRzLCAgIzE2CisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MC40cywgIHYwLjRzLCAgIzMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNHN9LCAgICAgICAgW3g1XSwgIzE2CisgICAgICAgIHNyaSAgICAgICAgICAgICB2Ny40cywgIHY2LjRzLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bMF0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bMV0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGZjdnR6cyAgICAgICAgICB2MS40cywgIHYxLjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bMl0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuc31bM10sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNHN9LCAgICAgICAgW3g0XSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuc31bMF0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGZjdnR6cyAgICAgICAgICB2Mi40cywgIHYyLjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuc31bMV0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuNHN9LCAgICAgICAgW3g1XSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuc31bMl0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGZjdnR6cyAgICAgICAgICB2My40cywgIHYzLjRzLCAgIzMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuc31bM10sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHNyaSAgICAgICAgICAgICB2MS40cywgIHYwLjRzLCAgIzE2CisgICAgICAgIHNyaSAgICAgICAgICAgICB2My40cywgIHYyLjRzLCAgIzE2CisgICAgICAgIGIuZXEgICAgICAgICAgICA2ZgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLnN9WzBdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjQuNHMsICB2NC40cywgICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLnN9WzFdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjRzfSwgICAgICAgIFt4NV0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLnN9WzJdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjUuNHMsICB2NS40cywgICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLnN9WzNdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLnN9WzBdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjYuNHMsICB2Ni40cywgICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLnN9WzFdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y3LjRzfSwgICAgICAgIFt4NV0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLnN9WzJdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjcuNHMsICB2Ny40cywgICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLnN9WzNdLCAgICAgIFt4OF0sIHgxMgorICAgICAgICBiLmd0ICAgICAgICAgICAgNmIKKzY6CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bMF0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bMV0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bMl0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bM10sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuc31bMF0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuc31bMV0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuc31bMl0sICAgICAgW3g4XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuc31bM10sICAgICAgW3g4XSwgeDEyCisgICAgICAgIGIgICAgICAgICAgICAgICA4ZgorNzoKKyAgICAgICAgc3JpICAgICAgICAgICAgIHY1LjRzLCAgdjQuNHMsICAjMTYKKyAgICAgICAgc3JpICAgICAgICAgICAgIHY3LjRzLCAgdjYuNHMsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVswXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVsxXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVsyXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5zfVszXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVswXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVsxXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVsyXSwgICAgICBbeDhdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ny5zfVszXSwgICAgICBbeDhdLCB4MTIKKzg6CisgICAgICAgIHN1YnMgICAgICAgICAgICB3MywgIHczLCAgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjNAorICAgICAgICBiLmVxICAgICAgICAgICAgZW5kCisKKzQ6ICAgICAgLy8gMSBjaGFubmVsCisgICAgICAgIGxkciAgICAgICAgICAgICB4NCwgIFt4MV0KKyAgICAgICAgdHN0ICAgICAgICAgICAgIHcyLCAgIzgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHc5LCAgdzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgeDAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYwLjRzLCAgdjAuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYxLjRzLCAgdjEuNHMsICAjMzEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDhmCis2OgorICAgICAgICBzdWJzICAgICAgICAgICAgdzksICB3OSwgICMxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjIuNHMsICB2Mi40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjMuNHMsICB2My40cywgICMzMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLmh9WzFdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLmh9WzNdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLmh9WzVdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLmh9WzddLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLmh9WzFdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLmh9WzNdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLmh9WzVdLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLmh9WzddLCAgICAgIFt4NV0sIHgxMgorICAgICAgICBiLmVxICAgICAgICAgICAgN2YKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYwLjRzLCAgdjAuNHMsICAjMzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40c30sICAgICAgICBbeDRdLCAjMTYKKyAgICAgICAgZmN2dHpzICAgICAgICAgIHYxLjRzLCAgdjEuNHMsICAjMzEKKzc6CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuaH1bMV0sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuaH1bM10sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuaH1bNV0sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuaH1bN10sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuaH1bMV0sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuaH1bM10sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuaH1bNV0sICAgICAgW3g1XSwgeDEyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuaH1bN10sICAgICAgW3g1XSwgeDEyCisgICAgICAgIGIuZ3QgICAgICAgICAgICA2YgorICAgICAgICByZXQKKzg6CisgICAgICAgIHN1YnMgICAgICAgICAgICB3OSwgIHc5LCAgIzgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5ofVsxXSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5ofVszXSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5ofVs1XSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5ofVs3XSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5ofVsxXSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5ofVszXSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5ofVs1XSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5ofVs3XSwgICAgICBbeDVdLCB4MTIKKyAgICAgICAgYi5lcSAgICAgICAgICAgIGVuZAorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjAuNHMsICB2MC40cywgICMzMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjRzfSwgICAgICAgIFt4NF0sICMxNgorICAgICAgICBmY3Z0enMgICAgICAgICAgdjEuNHMsICB2MS40cywgICMzMQorICAgICAgICBiICAgICAgICAgICAgICAgNmIKK2VuZDoKKyAgICAgICAgcmV0CitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9hYXJjaDY0L25lb250ZXN0LmMgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9hYXJjaDY0L25lb250ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjNzFiZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2FhcmNoNjQvbmVvbnRlc3QuYwpAQCAtMCwwICsxLDI5IEBACisvKgorICogY2hlY2sgTkVPTiByZWdpc3RlcnMgZm9yIGNsb2JiZXJzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L25lb250ZXN0LmgiCisKK3dyYXAoc3dyX2NvbnZlcnQoc3RydWN0IFN3ckNvbnRleHQgKnMsIHVpbnQ4X3QgKipvdXQsIGludCBvdXRfY291bnQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKippbiAsIGludCBpbl9jb3VudCkpCit7CisgICAgdGVzdG5lb25jbG9iYmVycyhzd3JfY29udmVydCwgcywgb3V0LCBvdXRfY291bnQsIGluLCBpbl9jb3VudCk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9hcm0vTWFrZWZpbGUgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9hcm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmM2Y2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2FybS9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK09CSlMgICAgICArPSBhcm0vYXVkaW9fY29udmVydF9pbml0Lm8KKworT0JKUy0kKENPTkZJR19ORU9OX0NMT0JCRVJfVEVTVCkgKz0gYXJtL25lb250ZXN0Lm8KKworTkVPTi1PQkpTICs9IGFybS9hdWRpb19jb252ZXJ0X25lb24ubwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3cmVzYW1wbGUvYXJtL2F1ZGlvX2NvbnZlcnRfaW5pdC5jIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvYXJtL2F1ZGlvX2NvbnZlcnRfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOWU2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9hcm0vYXVkaW9fY29udmVydF9pbml0LmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYnN3cmVzYW1wbGUuCisgKgorICogbGlic3dyZXNhbXBsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogbGlic3dyZXNhbXBsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBsaWJzd3Jlc2FtcGxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAibGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlX2ludGVybmFsLmgiCisjaW5jbHVkZSAibGlic3dyZXNhbXBsZS9hdWRpb2NvbnZlcnQuaCIKKwordm9pZCBzd3JpX29sZGFwaV9jb252X2ZsdF90b19zMTZfbmVvbihpbnQxNl90ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGludCBsZW4pOwordm9pZCBzd3JpX29sZGFwaV9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uKGludDE2X3QgKmRzdCwgZmxvYXQgKmNvbnN0ICpzcmMsIGludCBsZW4sIGludCBjaGFubmVscyk7Cit2b2lkIHN3cmlfb2xkYXBpX2NvbnZfZmx0cF90b19zMTZfbmNoX25lb24oaW50MTZfdCAqZHN0LCBmbG9hdCAqY29uc3QgKnNyYywgaW50IGxlbiwgaW50IGNoYW5uZWxzKTsKKworc3RhdGljIHZvaWQgY29udl9mbHRfdG9fczE2X25lb24odWludDhfdCAqKmRzdCwgY29uc3QgdWludDhfdCAqKnNyYywgaW50IGxlbil7CisgICAgc3dyaV9vbGRhcGlfY29udl9mbHRfdG9fczE2X25lb24oKGludDE2X3QqKSpkc3QsIChjb25zdCBmbG9hdCopKnNyYywgbGVuKTsKK30KKworc3RhdGljIHZvaWQgY29udl9mbHRwX3RvX3MxNl8yY2hfbmVvbih1aW50OF90ICoqZHN0LCBjb25zdCB1aW50OF90ICoqc3JjLCBpbnQgbGVuKXsKKyAgICBzd3JpX29sZGFwaV9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uKChpbnQxNl90KikqZHN0LCAoZmxvYXQgKmNvbnN0KilzcmMsIGxlbiwgMik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZfZmx0cF90b19zMTZfbmNoX25lb24odWludDhfdCAqKmRzdCwgY29uc3QgdWludDhfdCAqKnNyYywgaW50IGxlbil7CisgICAgaW50IGNoYW5uZWxzOworICAgIGZvcihjaGFubmVscz0zOyBjaGFubmVsczxTV1JfQ0hfTUFYICYmIHNyY1tjaGFubmVsc107IGNoYW5uZWxzKyspCisgICAgICAgIDsKKyAgICBzd3JpX29sZGFwaV9jb252X2ZsdHBfdG9fczE2X25jaF9uZW9uKChpbnQxNl90KikqZHN0LCAoZmxvYXQgKmNvbnN0KilzcmMsIGxlbiwgY2hhbm5lbHMpOworfQorCithdl9jb2xkIHZvaWQgc3dyaV9hdWRpb19jb252ZXJ0X2luaXRfYXJtKHN0cnVjdCBBdWRpb0NvbnZlcnQgKmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBpbl9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGFjLT5zaW1kX2Y9IE5VTEw7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpIHsKKyAgICAgICAgaWYob3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNiAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFQgfHwgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUUCkKKyAgICAgICAgICAgIGFjLT5zaW1kX2YgPSBjb252X2ZsdF90b19zMTZfbmVvbjsKKyAgICAgICAgaWYob3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNiAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQICYmIGNoYW5uZWxzID09IDIpCisgICAgICAgICAgICBhYy0+c2ltZF9mID0gY29udl9mbHRwX3RvX3MxNl8yY2hfbmVvbjsKKyAgICAgICAgaWYob3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNiAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQICYmIGNoYW5uZWxzID4gIDIpCisgICAgICAgICAgICBhYy0+c2ltZF9mID0gY29udl9mbHRwX3RvX3MxNl9uY2hfbmVvbjsKKyAgICAgICAgaWYoYWMtPnNpbWRfZikKKyAgICAgICAgICAgIGFjLT5pbl9zaW1kX2FsaWduX21hc2sgPSBhYy0+b3V0X3NpbWRfYWxpZ25fbWFzayA9IDE1OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2FybS9hdWRpb19jb252ZXJ0X25lb24uUyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2FybS9hdWRpb19jb252ZXJ0X25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjg4MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvYXJtL2F1ZGlvX2NvbnZlcnRfbmVvbi5TCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYnN3cmVzYW1wbGUuCisgKgorICogbGlic3dyZXNhbXBsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogbGlic3dyZXNhbXBsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBsaWJzd3Jlc2FtcGxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKK2Z1bmN0aW9uIHN3cmlfb2xkYXBpX2NvbnZfZmx0X3RvX3MxNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWJzICAgICAgICAgICAgcjIsICByMiwgICM4CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTgsICBxMCwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE5LCAgcTEsICAjMzEKKyAgICAgICAgYmVxICAgICAgICAgICAgIDNmCisgICAgICAgIGJpY3MgICAgICAgICAgICByMTIsIHIyLCAgIzE1CisgICAgICAgIGJlcSAgICAgICAgICAgICAyZgorMTogICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxNgorICAgICAgICB2cXJzaHJuLnMzMiAgICAgZDQsICBxOCwgICMxNgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEwLCAgcTAsICAjMzEKKyAgICAgICAgdnFyc2hybi5zMzIgICAgIGQ1LCAgcTksICAjMTYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMSwgIHExLCAgIzMxCisgICAgICAgIHZxcnNocm4uczMyICAgICBkNiwgIHEwLCAgIzE2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTJ9LCAgICAgW3IwLDoxMjhdIQorICAgICAgICB2cXJzaHJuLnMzMiAgICAgZDcsICBxMSwgICMxNgorICAgICAgICB2bGQxLjMyICAgICAgICAge3E4fSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTgsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOX0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHE5LCAgIzMxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTN9LCAgICAgW3IwLDoxMjhdIQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgYW5kcyAgICAgICAgICAgIHIyLCAgcjIsICAjMTUKKyAgICAgICAgYmVxICAgICAgICAgICAgIDNmCisyOiAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2cXJzaHJuLnMzMiAgICAgZDQsICBxOCwgICMxNgorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTAsICBxMCwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdnFyc2hybi5zMzIgICAgIGQ1LCAgcTksICAjMTYKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExLCAgcTEsICAjMzEKKyAgICAgICAgdnFyc2hybi5zMzIgICAgIGQ2LCAgcTAsICAjMTYKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMn0sICAgICBbcjAsOjEyOF0hCisgICAgICAgIHZxcnNocm4uczMyICAgICBkNywgIHExLCAgIzE2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTN9LCAgICAgW3IwLDoxMjhdIQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKKzM6ICAgICAgdnFyc2hybi5zMzIgICAgIGQ0LCAgcTgsICAjMTYKKyAgICAgICAgdnFyc2hybi5zMzIgICAgIGQ1LCAgcTksICAjMTYKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMn0sICAgICBbcjAsOjEyOF0hCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBzd3JpX29sZGFwaV9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZG0gICAgICAgICAgICAgcjEsICB7cjEsIHIzfQorICAgICAgICBzdWJzICAgICAgICAgICAgcjIsICByMiwgICM4CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTgsICBxMCwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE5LCAgcTEsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTB9LCAgICBbcjMsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTAsIHExMCwgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTExfSwgICAgW3IzLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTExLCBxMTEsICMzMQorICAgICAgICBiZXEgICAgICAgICAgICAgM2YKKyAgICAgICAgYmljcyAgICAgICAgICAgIHIxMiwgcjIsICAjMTUKKyAgICAgICAgYmVxICAgICAgICAgICAgIDJmCisxOiAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTAsICBxMCwgICMzMQorICAgICAgICB2c3JpLjMyICAgICAgICAgcTEwLCBxOCwgICMxNgorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyMSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExLCAgcTEsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTJ9LCAgICBbcjMsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTIsIHExMiwgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEzfSwgICAgW3IzLDoxMjhdIQorICAgICAgICB2c3JpLjMyICAgICAgICAgcTExLCBxOSwgICMxNgorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExMH0sICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMywgcTEzLCAjMzEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTF9LCAgICBbcjAsOjEyOF0hCisgICAgICAgIHZzcmkuMzIgICAgICAgICBxMTIsIHEwLCAgIzE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTh9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2c3JpLjMyICAgICAgICAgcTEzLCBxMSwgICMxNgorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExMn0sICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTgsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOX0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHE5LCAgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEwfSwgICAgW3IzLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEwLCBxMTAsICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExMX0sICAgIFtyMyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMSwgcTExLCAjMzEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTN9LCAgICBbcjAsOjEyOF0hCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBhbmRzICAgICAgICAgICAgcjIsICByMiwgICMxNQorICAgICAgICBiZXEgICAgICAgICAgICAgM2YKKzI6ICAgICAgdnNyaS4zMiAgICAgICAgIHExMCwgcTgsICAjMTYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMH0sICAgICBbcjEsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMCwgIHEwLCAgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTF9LCAgICAgW3IxLDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEsICBxMSwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExMn0sICAgIFtyMyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMiwgcTEyLCAjMzEKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHExMSwgcTksICAjMTYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTN9LCAgICBbcjMsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTMsIHExMywgIzMxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEwfSwgICAgW3IwLDoxMjhdIQorICAgICAgICB2c3JpLjMyICAgICAgICAgcTEyLCBxMCwgICMxNgorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExMX0sICAgIFtyMCw6MTI4XSEKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHExMywgcTEsICAjMTYKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTItcTEzfSxbcjAsOjEyOF0hCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorMzogICAgICB2c3JpLjMyICAgICAgICAgcTEwLCBxOCwgICMxNgorICAgICAgICB2c3JpLjMyICAgICAgICAgcTExLCBxOSwgICMxNgorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExMC1xMTF9LFtyMCw6MTI4XSEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIHN3cmlfb2xkYXBpX2NvbnZfZmx0cF90b19zMTZfbmNoX25lb24sIGV4cG9ydD0xCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMyCisgICAgICAgIGl0dCAgICAgICAgICAgICBsdAorICAgICAgICBsZHJsdCAgICAgICAgICAgcjEsICBbcjFdCisgICAgICAgIGJsdCAgICAgICAgICAgICBYKHN3cmlfb2xkYXBpX2NvbnZfZmx0X3RvX3MxNl9uZW9uKQorICAgICAgICBiZXEgICAgICAgICAgICAgWChzd3JpX29sZGFwaV9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uKQorCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjgsIGxyfQorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjNAorICAgICAgICBsc2wgICAgICAgICAgICAgcjEyLCByMywgICMxCisgICAgICAgIGJsdCAgICAgICAgICAgICA0ZgorCisgICAgICAgIEAgNCBjaGFubmVscworNTogICAgICBsZG0gICAgICAgICAgICAgcjEhLCB7cjQtcjd9CisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHIyCisgICAgICAgIG1vdiAgICAgICAgICAgICByOCwgIHIwCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTh9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTgsICBxOCwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3E5fSwgICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE5LCAgcTksICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTB9LCAgICBbcjYsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTAsIHExMCwgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTExfSwgICAgW3I3LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTExLCBxMTEsICMzMQorNjogICAgICBzdWJzICAgICAgICAgICAgbHIsICBsciwgICM4CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTAsICBxMCwgICMzMQorICAgICAgICB2c3JpLjMyICAgICAgICAgcTksICBxOCwgICMxNgorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExLCAgcTEsICAjMzEKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIHExMSwgcTEwLCAjMTYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMn0sICAgICBbcjYsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMiwgIHEyLCAgIzMxCisgICAgICAgIHZ6aXAuMzIgICAgICAgICBkMTgsIGQyMgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EzfSwgICAgIFtyNyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEzLCAgcTMsICAjMzEKKyAgICAgICAgdnppcC4zMiAgICAgICAgIGQxOSwgZDIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE4fSwgICAgW3I4XSwgcjEyCisgICAgICAgIHZzcmkuMzIgICAgICAgICBxMSwgIHEwLCAgIzE2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIyfSwgICAgW3I4XSwgcjEyCisgICAgICAgIHZzcmkuMzIgICAgICAgICBxMywgIHEyLCAgIzE2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE5fSwgICAgW3I4XSwgcjEyCisgICAgICAgIHZ6aXAuMzIgICAgICAgICBkMiwgIGQ2CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIzfSwgICAgW3I4XSwgcjEyCisgICAgICAgIHZ6aXAuMzIgICAgICAgICBkMywgIGQ3CisgICAgICAgIGJlcSAgICAgICAgICAgICA3ZgorICAgICAgICB2bGQxLjMyICAgICAgICAge3E4fSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTgsICAjMzEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMn0sICAgICBbcjhdLCByMTIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOX0sICAgICBbcjUsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHE5LCAgIzMxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDZ9LCAgICAgW3I4XSwgcjEyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEwfSwgICAgW3I2LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEwLCBxMTAsICMzMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzfSwgICAgIFtyOF0sIHIxMgorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExMX0sICAgIFtyNyw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMSwgcTExLCAjMzEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkN30sICAgICBbcjhdLCByMTIKKyAgICAgICAgYiAgICAgICAgICAgICAgIDZiCis3OiAgICAgIHZzdDEuMTYgICAgICAgICB7ZDJ9LCAgICAgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDZ9LCAgICAgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDN9LCAgICAgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDd9LCAgICAgW3I4XSwgcjEyCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzQKKyAgICAgICAgaXQgICAgICAgICAgICAgIGVxCisgICAgICAgIHBvcGVxICAgICAgICAgICB7cjQtcjgsIHBjfQorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIGJnZSAgICAgICAgICAgICA1YgorCisgICAgICAgIEAgMiBjaGFubmVscworNDogICAgICBjbXAgICAgICAgICAgICAgcjMsICAjMgorICAgICAgICBibHQgICAgICAgICAgICAgNGYKKyAgICAgICAgbGRtICAgICAgICAgICAgIHIxISwge3I0LXI1fQorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjgsICByMAorICAgICAgICB0c3QgICAgICAgICAgICAgbHIsICAjOAorICAgICAgICB2bGQxLjMyICAgICAgICAge3E4fSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE4LCAgcTgsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOX0sICAgICBbcjUsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxOSwgIHE5LCAgIzMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTEwfSwgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTEwLCBxMTAsICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExMX0sICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExMSwgcTExLCAjMzEKKyAgICAgICAgYmVxICAgICAgICAgICAgIDZmCisgICAgICAgIHN1YnMgICAgICAgICAgICBsciwgIGxyLCAgIzgKKyAgICAgICAgYmVxICAgICAgICAgICAgIDdmCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMTgsIGQxNiwgIzE2CisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMTksIGQxNywgIzE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTh9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTgsICBxOCwgICMzMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOFswXX0sIFtyOF0sIHIxMgorICAgICAgICB2c3JpLjMyICAgICAgICAgZDIyLCBkMjAsICMxNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOFsxXX0sIFtyOF0sIHIxMgorICAgICAgICB2c3JpLjMyICAgICAgICAgZDIzLCBkMjEsICMxNgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOVswXX0sIFtyOF0sIHIxMgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QxOVsxXX0sIFtyOF0sIHIxMgorICAgICAgICB2bGQxLjMyICAgICAgICAge3E5fSwgICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE5LCAgcTksICAjMzEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMF19LCBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMV19LCBbcjhdLCByMTIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTB9LCAgICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTAsIHExMCwgIzMxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzBdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzFdfSwgW3I4XSwgcjEyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTExfSwgICAgW3I1LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTExLCBxMTEsICMzMQorNjogICAgICBzdWJzICAgICAgICAgICAgbHIsICBsciwgICMxNgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEwLCAgcTAsICAjMzEKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQxOCwgZDE2LCAjMTYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjUsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMSwgIHExLCAgIzMxCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMTksIGQxNywgIzE2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTJ9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTIsICBxMiwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3EzfSwgICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEzLCAgcTMsICAjMzEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMThbMF19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQyMiwgZDIwLCAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMThbMV19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQyMywgZDIxLCAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTlbMF19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQyLCAgZDAsICAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMTlbMV19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQzLCAgZDEsICAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMF19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQ2LCAgZDQsICAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMV19LCBbcjhdLCByMTIKKyAgICAgICAgdnNyaS4zMiAgICAgICAgIGQ3LCAgZDUsICAjMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMF19LCBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMV19LCBbcjhdLCByMTIKKyAgICAgICAgYmVxICAgICAgICAgICAgIDZmCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTh9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTgsICBxOCwgICMzMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSwgIFtyOF0sIHIxMgorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzFdfSwgIFtyOF0sIHIxMgorICAgICAgICB2bGQxLjMyICAgICAgICAge3E5fSwgICAgIFtyNSw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHE5LCAgcTksICAjMzEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1sxXX0sICBbcjhdLCByMTIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMTB9LCAgICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMTAsIHExMCwgIzMxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDZbMF19LCAgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDZbMV19LCAgW3I4XSwgcjEyCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTExfSwgICAgW3I1LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTExLCBxMTEsICMzMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q3WzBdfSwgIFtyOF0sIHIxMgorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q3WzFdfSwgIFtyOF0sIHIxMgorICAgICAgICBiZ3QgICAgICAgICAgICAgNmIKKzY6ICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlsxXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1sxXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNlswXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNlsxXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkN1swXX0sICBbcjhdLCByMTIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkN1sxXX0sICBbcjhdLCByMTIKKyAgICAgICAgYiAgICAgICAgICAgICAgIDhmCis3OiAgICAgIHZzcmkuMzIgICAgICAgICBkMTgsIGQxNiwgIzE2CisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMTksIGQxNywgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE4WzBdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMjIsIGQyMCwgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE4WzFdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzcmkuMzIgICAgICAgICBkMjMsIGQyMSwgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE5WzBdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDE5WzFdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyWzBdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyWzFdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzBdfSwgW3I4XSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzFdfSwgW3I4XSwgcjEyCis4OiAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjNAorICAgICAgICBpdCAgICAgICAgICAgICAgZXEKKyAgICAgICAgcG9wZXEgICAgICAgICAgIHtyNC1yOCwgcGN9CisKKyAgICAgICAgQCAxIGNoYW5uZWwKKzQ6ICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3IxXQorICAgICAgICB0c3QgICAgICAgICAgICAgcjIsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICByMAorICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEwLCAgcTAsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMX0sICAgICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMSwgIHExLCAgIzMxCisgICAgICAgIGJuZSAgICAgICAgICAgICA4ZgorNjogICAgICBzdWJzICAgICAgICAgICAgbHIsICBsciwgICMxNgorICAgICAgICB2bGQxLjMyICAgICAgICAge3EyfSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHEyLCAgcTIsICAjMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxM30sICAgICBbcjQsOjEyOF0hCisgICAgICAgIHZjdnQuczMyLmYzMiAgICBxMywgIHEzLCAgIzMxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDBbMV19LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwWzNdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMVsxXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDFbM119LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyWzFdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMlszXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDNbMV19LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzWzNdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgYmVxICAgICAgICAgICAgIDdmCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTAsICBxMCwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExLCAgcTEsICAjMzEKKzc6ICAgICAgdnN0MS4xNiAgICAgICAgIHtkNFsxXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDRbM119LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q1WzFdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkNVszXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDZbMV19LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q2WzNdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkN1sxXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDdbM119LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICBiZ3QgICAgICAgICAgICAgNmIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOCwgcGN9Cis4OiAgICAgIHN1YnMgICAgICAgICAgICBsciwgIGxyLCAgIzgKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMFsxXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDBbM119LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxWzFdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMVszXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDJbMV19LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyWzNdfSwgIFtyNSw6MTZdLCByMTIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkM1sxXX0sICBbcjUsOjE2XSwgcjEyCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDNbM119LCAgW3I1LDoxNl0sIHIxMgorICAgICAgICBpdCAgICAgICAgICAgICAgZXEKKyAgICAgICAgcG9wZXEgICAgICAgICAgIHtyNC1yOCwgcGN9CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3I0LDoxMjhdIQorICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTAsICBxMCwgICMzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge3ExfSwgICAgIFtyNCw6MTI4XSEKKyAgICAgICAgdmN2dC5zMzIuZjMyICAgIHExLCAgcTEsICAjMzEKKyAgICAgICAgYiAgICAgICAgICAgICAgIDZiCitlbmRmdW5jCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9hcm0vbmVvbnRlc3QuYyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2FybS9uZW9udGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmJiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9hcm0vbmVvbnRlc3QuYwpAQCAtMCwwICsxLDI5IEBACisvKgorICogY2hlY2sgTkVPTiByZWdpc3RlcnMgZm9yIGNsb2JiZXJzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vbmVvbnRlc3QuaCIKKword3JhcChzd3JfY29udmVydChzdHJ1Y3QgU3dyQ29udGV4dCAqcywgdWludDhfdCAqKm91dCwgaW50IG91dF9jb3VudCwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKmluICwgaW50IGluX2NvdW50KSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKHN3cl9jb252ZXJ0LCBzLCBvdXQsIG91dF9jb3VudCwgaW4sIGluX2NvdW50KTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2F1ZGlvY29udmVydC5jIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvYXVkaW9jb252ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiMGJmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2F1ZGlvY29udmVydC5jCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogYXVkaW8gY29udmVyc2lvbgorICogQ29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGF1ZGlvIGNvbnZlcnNpb24KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAiYXVkaW9jb252ZXJ0LmgiCisKKworI2RlZmluZSBDT05WX0ZVTkNfTkFNRShkc3RfZm10LCBzcmNfZm10KSBjb252XyAjIyBzcmNfZm10ICMjIF90b18gIyMgZHN0X2ZtdAorCisvL0ZJWE1FIHJvdW5kaW5nID8KKyNkZWZpbmUgQ09OVl9GVU5DKG9mbXQsIG90eXBlLCBpZm10LCBleHByKVwKK3N0YXRpYyB2b2lkIENPTlZfRlVOQ19OQU1FKG9mbXQsIGlmbXQpKHVpbnQ4X3QgKnBvLCBjb25zdCB1aW50OF90ICpwaSwgaW50IGlzLCBpbnQgb3MsIHVpbnQ4X3QgKmVuZClcCit7XAorICAgIHVpbnQ4X3QgKmVuZDIgPSBlbmQgLSAzKm9zO1wKKyAgICB3aGlsZShwbyA8IGVuZDIpe1wKKyAgICAgICAgKihvdHlwZSopcG8gPSBleHByOyBwaSArPSBpczsgcG8gKz0gb3M7XAorICAgICAgICAqKG90eXBlKilwbyA9IGV4cHI7IHBpICs9IGlzOyBwbyArPSBvcztcCisgICAgICAgICoob3R5cGUqKXBvID0gZXhwcjsgcGkgKz0gaXM7IHBvICs9IG9zO1wKKyAgICAgICAgKihvdHlwZSopcG8gPSBleHByOyBwaSArPSBpczsgcG8gKz0gb3M7XAorICAgIH1cCisgICAgd2hpbGUocG8gPCBlbmQpe1wKKyAgICAgICAgKihvdHlwZSopcG8gPSBleHByOyBwaSArPSBpczsgcG8gKz0gb3M7XAorICAgIH1cCit9CisKKy8vRklYTUUgcHV0IHRoaW5ncyBiZWxvdyB1bmRlciBpZmRlZnMgc28gd2UgZG8gbm90IHdhc3RlIHNwYWNlIGZvciBjYXNlcyBubyBjb2RlYyB3aWxsIG5lZWQKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1U4ICwgdWludDhfdCwgQVZfU0FNUExFX0ZNVF9VOCAsICAqKGNvbnN0IHVpbnQ4X3QqKXBpKQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX1U4ICwgKCooY29uc3QgdWludDhfdCopcGkgLSAweDgwVSk8PDgpCitDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsIEFWX1NBTVBMRV9GTVRfVTggLCAoKihjb25zdCB1aW50OF90KilwaSAtIDB4ODBVKTw8MjQpCitDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9GTFQsIGZsb2F0ICAsIEFWX1NBTVBMRV9GTVRfVTggLCAoKihjb25zdCB1aW50OF90KilwaSAtIDB4ODApKigxLjBmLyAoMTw8NykpKQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUgLCBBVl9TQU1QTEVfRk1UX1U4ICwgKCooY29uc3QgdWludDhfdCopcGkgLSAweDgwKSooMS4wIC8gKDE8PDcpKSkKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1U4ICwgdWludDhfdCwgQVZfU0FNUExFX0ZNVF9TMTYsICgqKGNvbnN0IGludDE2X3QqKXBpPj44KSArIDB4ODApCitDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsIEFWX1NBTVBMRV9GTVRfUzE2LCAgKihjb25zdCBpbnQxNl90KilwaSkKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgQVZfU0FNUExFX0ZNVF9TMTYsICAqKGNvbnN0IGludDE2X3QqKXBpPDwxNikKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQgICwgQVZfU0FNUExFX0ZNVF9TMTYsICAqKGNvbnN0IGludDE2X3QqKXBpKigxLjBmLyAoMTw8MTUpKSkKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX0RCTCwgZG91YmxlICwgQVZfU0FNUExFX0ZNVF9TMTYsICAqKGNvbnN0IGludDE2X3QqKXBpKigxLjAgLyAoMTw8MTUpKSkKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1U4ICwgdWludDhfdCwgQVZfU0FNUExFX0ZNVF9TMzIsICgqKGNvbnN0IGludDMyX3QqKXBpPj4yNCkgKyAweDgwKQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX1MzMiwgICooY29uc3QgaW50MzJfdCopcGk+PjE2KQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzMyLCBpbnQzMl90LCBBVl9TQU1QTEVfRk1UX1MzMiwgICooY29uc3QgaW50MzJfdCopcGkpCitDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9GTFQsIGZsb2F0ICAsIEFWX1NBTVBMRV9GTVRfUzMyLCAgKihjb25zdCBpbnQzMl90KilwaSooMS4wZi8gKDFVPDwzMSkpKQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUgLCBBVl9TQU1QTEVfRk1UX1MzMiwgICooY29uc3QgaW50MzJfdCopcGkqKDEuMCAvICgxVTw8MzEpKSkKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1U4ICwgdWludDhfdCwgQVZfU0FNUExFX0ZNVF9GTFQsIGF2X2NsaXBfdWludDgoICBscmludGYoKihjb25zdCBmbG9hdCopcGkgKiAoMTw8NykpICsgMHg4MCkpCitDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsIEFWX1NBTVBMRV9GTVRfRkxULCBhdl9jbGlwX2ludDE2KCAgbHJpbnRmKCooY29uc3QgZmxvYXQqKXBpICogKDE8PDE1KSkpKQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzMyLCBpbnQzMl90LCBBVl9TQU1QTEVfRk1UX0ZMVCwgYXZfY2xpcGxfaW50MzIobGxyaW50ZigqKGNvbnN0IGZsb2F0KilwaSAqICgxVTw8MzEpKSkpCitDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9GTFQsIGZsb2F0ICAsIEFWX1NBTVBMRV9GTVRfRkxULCAqKGNvbnN0IGZsb2F0KilwaSkKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX0RCTCwgZG91YmxlICwgQVZfU0FNUExFX0ZNVF9GTFQsICooY29uc3QgZmxvYXQqKXBpKQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfVTggLCB1aW50OF90LCBBVl9TQU1QTEVfRk1UX0RCTCwgYXZfY2xpcF91aW50OCggIGxyaW50KCooY29uc3QgZG91YmxlKilwaSAqICgxPDw3KSkgKyAweDgwKSkKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1MxNiwgaW50MTZfdCwgQVZfU0FNUExFX0ZNVF9EQkwsIGF2X2NsaXBfaW50MTYoICBscmludCgqKGNvbnN0IGRvdWJsZSopcGkgKiAoMTw8MTUpKSkpCitDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsIEFWX1NBTVBMRV9GTVRfREJMLCBhdl9jbGlwbF9pbnQzMihsbHJpbnQoKihjb25zdCBkb3VibGUqKXBpICogKDFVPDwzMSkpKSkKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQgICwgQVZfU0FNUExFX0ZNVF9EQkwsICooY29uc3QgZG91YmxlKilwaSkKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX0RCTCwgZG91YmxlICwgQVZfU0FNUExFX0ZNVF9EQkwsICooY29uc3QgZG91YmxlKilwaSkKKworI2RlZmluZSBGTVRfUEFJUl9GVU5DKG91dCwgaW4pIFsob3V0KSArIEFWX1NBTVBMRV9GTVRfTkIqKGluKV0gPSBDT05WX0ZVTkNfTkFNRShvdXQsIGluKQorCitzdGF0aWMgY29udl9mdW5jX3R5cGUgKiBjb25zdCBmbXRfcGFpcl90b19jb252X2Z1bmN0aW9uc1tBVl9TQU1QTEVfRk1UX05CKkFWX1NBTVBMRV9GTVRfTkJdID0geworICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9VOCAsIEFWX1NBTVBMRV9GTVRfVTggKSwKKyAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX1U4ICksCisgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX1MzMiwgQVZfU0FNUExFX0ZNVF9VOCApLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9GTFQsIEFWX1NBTVBMRV9GTVRfVTggKSwKKyAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfREJMLCBBVl9TQU1QTEVfRk1UX1U4ICksCisgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX1U4ICwgQVZfU0FNUExFX0ZNVF9TMTYpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfUzE2KSwKKyAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfUzMyLCBBVl9TQU1QTEVfRk1UX1MxNiksCisgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9TMTYpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9EQkwsIEFWX1NBTVBMRV9GTVRfUzE2KSwKKyAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfVTggLCBBVl9TQU1QTEVfRk1UX1MzMiksCisgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9TMzIpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMzIsIEFWX1NBTVBMRV9GTVRfUzMyKSwKKyAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX1MzMiksCisgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX0RCTCwgQVZfU0FNUExFX0ZNVF9TMzIpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9VOCAsIEFWX1NBTVBMRV9GTVRfRkxUKSwKKyAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX0ZMVCksCisgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX1MzMiwgQVZfU0FNUExFX0ZNVF9GTFQpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9GTFQsIEFWX1NBTVBMRV9GTVRfRkxUKSwKKyAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfREJMLCBBVl9TQU1QTEVfRk1UX0ZMVCksCisgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX1U4ICwgQVZfU0FNUExFX0ZNVF9EQkwpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfREJMKSwKKyAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfUzMyLCBBVl9TQU1QTEVfRk1UX0RCTCksCisgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9EQkwpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9EQkwsIEFWX1NBTVBMRV9GTVRfREJMKSwKK307CisKK3N0YXRpYyB2b2lkIGNweTEodWludDhfdCAqKmRzdCwgY29uc3QgdWludDhfdCAqKnNyYywgaW50IGxlbil7CisgICAgbWVtY3B5KCpkc3QsICpzcmMsIGxlbik7Cit9CitzdGF0aWMgdm9pZCBjcHkyKHVpbnQ4X3QgKipkc3QsIGNvbnN0IHVpbnQ4X3QgKipzcmMsIGludCBsZW4peworICAgIG1lbWNweSgqZHN0LCAqc3JjLCAyKmxlbik7Cit9CitzdGF0aWMgdm9pZCBjcHk0KHVpbnQ4X3QgKipkc3QsIGNvbnN0IHVpbnQ4X3QgKipzcmMsIGludCBsZW4peworICAgIG1lbWNweSgqZHN0LCAqc3JjLCA0Kmxlbik7Cit9CitzdGF0aWMgdm9pZCBjcHk4KHVpbnQ4X3QgKipkc3QsIGNvbnN0IHVpbnQ4X3QgKipzcmMsIGludCBsZW4peworICAgIG1lbWNweSgqZHN0LCAqc3JjLCA4Kmxlbik7Cit9CisKK0F1ZGlvQ29udmVydCAqc3dyaV9hdWRpb19jb252ZXJ0X2FsbG9jKGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW5fZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBjb25zdCBpbnQgKmNoX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBBdWRpb0NvbnZlcnQgKmN0eDsKKyAgICBjb252X2Z1bmNfdHlwZSAqZiA9IGZtdF9wYWlyX3RvX2NvbnZfZnVuY3Rpb25zW2F2X2dldF9wYWNrZWRfc2FtcGxlX2ZtdChvdXRfZm10KSArIEFWX1NBTVBMRV9GTVRfTkIqYXZfZ2V0X3BhY2tlZF9zYW1wbGVfZm10KGluX2ZtdCldOworCisgICAgaWYgKCFmKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjdHggPSBhdl9tYWxsb2N6KHNpemVvZigqY3R4KSk7CisgICAgaWYgKCFjdHgpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoY2hhbm5lbHMgPT0gMSl7CisgICAgICAgICBpbl9mbXQgPSBhdl9nZXRfcGxhbmFyX3NhbXBsZV9mbXQoIGluX2ZtdCk7CisgICAgICAgIG91dF9mbXQgPSBhdl9nZXRfcGxhbmFyX3NhbXBsZV9mbXQob3V0X2ZtdCk7CisgICAgfQorCisgICAgY3R4LT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIGN0eC0+Y29udl9mICAgPSBmOworICAgIGN0eC0+Y2hfbWFwICAgPSBjaF9tYXA7CisgICAgaWYgKGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1U4IHx8IGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1U4UCkKKyAgICAgICAgbWVtc2V0KGN0eC0+c2lsZW5jZSwgMHg4MCwgc2l6ZW9mKGN0eC0+c2lsZW5jZSkpOworCisgICAgaWYob3V0X2ZtdCA9PSBpbl9mbXQgJiYgIWNoX21hcCkgeworICAgICAgICBzd2l0Y2goYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoaW5fZm10KSl7CisgICAgICAgICAgICBjYXNlIDE6Y3R4LT5zaW1kX2YgPSBjcHkxOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjpjdHgtPnNpbWRfZiA9IGNweTI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OmN0eC0+c2ltZF9mID0gY3B5NDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6Y3R4LT5zaW1kX2YgPSBjcHk4OyBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKEhBVkVfWUFTTSAmJiBIQVZFX01NWCkgc3dyaV9hdWRpb19jb252ZXJ0X2luaXRfeDg2KGN0eCwgb3V0X2ZtdCwgaW5fZm10LCBjaGFubmVscyk7CisgICAgaWYoQVJDSF9BUk0pICAgICAgICAgICAgICBzd3JpX2F1ZGlvX2NvbnZlcnRfaW5pdF9hcm0oY3R4LCBvdXRfZm10LCBpbl9mbXQsIGNoYW5uZWxzKTsKKyAgICBpZihBUkNIX0FBUkNINjQpICAgICAgICAgIHN3cmlfYXVkaW9fY29udmVydF9pbml0X2FhcmNoNjQoY3R4LCBvdXRfZm10LCBpbl9mbXQsIGNoYW5uZWxzKTsKKworICAgIHJldHVybiBjdHg7Cit9CisKK3ZvaWQgc3dyaV9hdWRpb19jb252ZXJ0X2ZyZWUoQXVkaW9Db252ZXJ0ICoqY3R4KQoreworICAgIGF2X2ZyZWVwKGN0eCk7Cit9CisKK2ludCBzd3JpX2F1ZGlvX2NvbnZlcnQoQXVkaW9Db252ZXJ0ICpjdHgsIEF1ZGlvRGF0YSAqb3V0LCBBdWRpb0RhdGEgKmluLCBpbnQgbGVuKQoreworICAgIGludCBjaDsKKyAgICBpbnQgb2ZmPTA7CisgICAgY29uc3QgaW50IG9zPSAob3V0LT5wbGFuYXIgPyAxIDpvdXQtPmNoX2NvdW50KSAqb3V0LT5icHM7CisgICAgdW5zaWduZWQgbWlzYWxpZ25lZCA9IDA7CisKKyAgICBhdl9hc3NlcnQwKGN0eC0+Y2hhbm5lbHMgPT0gb3V0LT5jaF9jb3VudCk7CisKKyAgICBpZiAoY3R4LT5pbl9zaW1kX2FsaWduX21hc2spIHsKKyAgICAgICAgaW50IHBsYW5lcyA9IGluLT5wbGFuYXIgPyBpbi0+Y2hfY291bnQgOiAxOworICAgICAgICB1bnNpZ25lZCBtID0gMDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcGxhbmVzOyBjaCsrKQorICAgICAgICAgICAgbSB8PSAoaW50cHRyX3QpaW4tPmNoW2NoXTsKKyAgICAgICAgbWlzYWxpZ25lZCB8PSBtICYgY3R4LT5pbl9zaW1kX2FsaWduX21hc2s7CisgICAgfQorICAgIGlmIChjdHgtPm91dF9zaW1kX2FsaWduX21hc2spIHsKKyAgICAgICAgaW50IHBsYW5lcyA9IG91dC0+cGxhbmFyID8gb3V0LT5jaF9jb3VudCA6IDE7CisgICAgICAgIHVuc2lnbmVkIG0gPSAwOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBwbGFuZXM7IGNoKyspCisgICAgICAgICAgICBtIHw9IChpbnRwdHJfdClvdXQtPmNoW2NoXTsKKyAgICAgICAgbWlzYWxpZ25lZCB8PSBtICYgY3R4LT5vdXRfc2ltZF9hbGlnbl9tYXNrOworICAgIH0KKworICAgIC8vRklYTUUgb3B0aW1pemUgY29tbW9uIGNhc2VzCisKKyAgICBpZihjdHgtPnNpbWRfZiAmJiAhY3R4LT5jaF9tYXAgJiYgIW1pc2FsaWduZWQpeworICAgICAgICBvZmYgPSBsZW4mfjE1OworICAgICAgICBhdl9hc3NlcnQxKG9mZj49MCk7CisgICAgICAgIGF2X2Fzc2VydDEob2ZmPD1sZW4pOworICAgICAgICBhdl9hc3NlcnQyKGN0eC0+Y2hhbm5lbHMgPT0gU1dSX0NIX01BWCB8fCAhaW4tPmNoW2N0eC0+Y2hhbm5lbHNdKTsKKyAgICAgICAgaWYob2ZmPjApeworICAgICAgICAgICAgaWYob3V0LT5wbGFuYXIgPT0gaW4tPnBsYW5hcil7CisgICAgICAgICAgICAgICAgaW50IHBsYW5lcyA9IG91dC0+cGxhbmFyID8gb3V0LT5jaF9jb3VudCA6IDE7CisgICAgICAgICAgICAgICAgZm9yKGNoPTA7IGNoPHBsYW5lczsgY2grKyl7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+c2ltZF9mKG91dC0+Y2grY2gsIChjb25zdCB1aW50OF90ICoqKWluLT5jaCtjaCwgb2ZmICogKG91dC0+cGxhbmFyID8gMSA6b3V0LT5jaF9jb3VudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGN0eC0+c2ltZF9mKG91dC0+Y2gsIChjb25zdCB1aW50OF90ICoqKWluLT5jaCwgb2ZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihvZmYgPT0gbGVuKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yKGNoPTA7IGNoPGN0eC0+Y2hhbm5lbHM7IGNoKyspeworICAgICAgICBjb25zdCBpbnQgaWNoPSBjdHgtPmNoX21hcCA/IGN0eC0+Y2hfbWFwW2NoXSA6IGNoOworICAgICAgICBjb25zdCBpbnQgaXM9IGljaCA8IDAgPyAwIDogKGluLT5wbGFuYXIgPyAxIDogaW4tPmNoX2NvdW50KSAqIGluLT5icHM7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpPSBpY2ggPCAwID8gY3R4LT5zaWxlbmNlIDogaW4tPmNoW2ljaF07CisgICAgICAgIHVpbnQ4X3QgICAgICAgKnBvPSBvdXQtPmNoW2NoXTsKKyAgICAgICAgdWludDhfdCAqZW5kPSBwbyArIG9zKmxlbjsKKyAgICAgICAgaWYoIXBvKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGN0eC0+Y29udl9mKHBvK29mZipvcywgcGkrb2ZmKmlzLCBpcywgb3MsIGVuZCk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3cmVzYW1wbGUvYXVkaW9jb252ZXJ0LmggYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9hdWRpb2NvbnZlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTk4M2RmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvYXVkaW9jb252ZXJ0LmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIGF1ZGlvIGNvbnZlcnNpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDA4IFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBTV1JfQVVESU9DT05WRVJUX0gKKyNkZWZpbmUgU1dSX0FVRElPQ09OVkVSVF9ICisKKy8qKgorICogQGZpbGUKKyAqIEF1ZGlvIGZvcm1hdCBjb252ZXJzaW9uIHJvdXRpbmVzCisgKi8KKworCisjaW5jbHVkZSAic3dyZXNhbXBsZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKworCit0eXBlZGVmIHZvaWQgKGNvbnZfZnVuY190eXBlKSh1aW50OF90ICpwbywgY29uc3QgdWludDhfdCAqcGksIGludCBpcywgaW50IG9zLCB1aW50OF90ICplbmQpOwordHlwZWRlZiB2b2lkIChzaW1kX2Z1bmNfdHlwZSkodWludDhfdCAqKmRzdCwgY29uc3QgdWludDhfdCAqKnNyYywgaW50IGxlbik7CisKK3R5cGVkZWYgc3RydWN0IEF1ZGlvQ29udmVydCB7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCAgaW5fc2ltZF9hbGlnbl9tYXNrOworICAgIGludCBvdXRfc2ltZF9hbGlnbl9tYXNrOworICAgIGNvbnZfZnVuY190eXBlICpjb252X2Y7CisgICAgc2ltZF9mdW5jX3R5cGUgKnNpbWRfZjsKKyAgICBjb25zdCBpbnQgKmNoX21hcDsKKyAgICB1aW50OF90IHNpbGVuY2VbOF07IC8vLzwgc2lsZW5jZSBpbnB1dCBzYW1wbGUKK31BdWRpb0NvbnZlcnQ7CisKKy8qKgorICogQ3JlYXRlIGFuIGF1ZGlvIHNhbXBsZSBmb3JtYXQgY29udmVydGVyIGNvbnRleHQKKyAqIEBwYXJhbSBvdXRfZm10IE91dHB1dCBzYW1wbGUgZm9ybWF0CisgKiBAcGFyYW0gaW5fZm10IElucHV0IHNhbXBsZSBmb3JtYXQKKyAqIEBwYXJhbSBjaGFubmVscyBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBwYXJhbSBmbGFncyBTZWUgQVZfQ1BVX0ZMQUdfeHgKKyAqIEBwYXJhbSBjaF9tYXAgbGlzdCBvZiB0aGUgY2hhbm5lbHMgaWQgdG8gcGljayBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLCBOVUxMCisgKiAgICAgICAgICAgICAgIGlmIGFsbCBjaGFubmVscyBtdXN0IGJlIHNlbGVjdGVkCisgKiBAcmV0dXJuIE5VTEwgb24gZXJyb3IKKyAqLworQXVkaW9Db252ZXJ0ICpzd3JpX2F1ZGlvX2NvbnZlcnRfYWxsb2MoZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBpbl9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGNvbnN0IGludCAqY2hfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKworLyoqCisgKiBGcmVlIGF1ZGlvIHNhbXBsZSBmb3JtYXQgY29udmVydGVyIGNvbnRleHQuCisgKiBhbmQgc2V0IHRoZSBwb2ludGVyIHRvIE5VTEwKKyAqLwordm9pZCBzd3JpX2F1ZGlvX2NvbnZlcnRfZnJlZShBdWRpb0NvbnZlcnQgKipjdHgpOworCisvKioKKyAqIENvbnZlcnQgYmV0d2VlbiBhdWRpbyBzYW1wbGUgZm9ybWF0cworICogQHBhcmFtW2luXSBvdXQgYXJyYXkgb2Ygb3V0cHV0IGJ1ZmZlcnMgZm9yIGVhY2ggY2hhbm5lbC4gc2V0IHRvIE5VTEwgdG8gaWdub3JlIHByb2Nlc3Npbmcgb2YgdGhlIGdpdmVuIGNoYW5uZWwuCisgKiBAcGFyYW1baW5dIGluIGFycmF5IG9mIGlucHV0IGJ1ZmZlcnMgZm9yIGVhY2ggY2hhbm5lbAorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgYXVkaW8gZnJhbWUgc2l6ZSAobWVhc3VyZWQgaW4gc2FtcGxlcykKKyAqLworaW50IHN3cmlfYXVkaW9fY29udmVydChBdWRpb0NvbnZlcnQgKmN0eCwgQXVkaW9EYXRhICpvdXQsIEF1ZGlvRGF0YSAqaW4sIGludCBsZW4pOworCisjZW5kaWYgLyogQVVESU9DT05WRVJUX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2RpdGhlci5jIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvZGl0aGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiNTkyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2RpdGhlci5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgTWljaGFlbCBOaWVkZXJtYXllciAobWljaGFlbG5pQGdteC5hdCkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaWJzd3Jlc2FtcGxlCisgKgorICogbGlic3dyZXNhbXBsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogbGlic3dyZXNhbXBsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBsaWJzd3Jlc2FtcGxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgInN3cmVzYW1wbGVfaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm5vaXNlX3NoYXBpbmdfZGF0YS5jIgorCit2b2lkIHN3cmlfZ2V0X2RpdGhlcihTd3JDb250ZXh0ICpzLCB2b2lkICpkc3QsIGludCBsZW4sIHVuc2lnbmVkIHNlZWQsIGVudW0gQVZTYW1wbGVGb3JtYXQgbm9pc2VfZm10KSB7CisgICAgZG91YmxlIHNjYWxlID0gcy0+ZGl0aGVyLm5vaXNlX3NjYWxlOworI2RlZmluZSBUTVBfRVhUUkEgMgorICAgIGRvdWJsZSAqdG1wID0gYXZfbWFsbG9jX2FycmF5KGxlbiArIFRNUF9FWFRSQSwgc2l6ZW9mKGRvdWJsZSkpOworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTxsZW4gKyBUTVBfRVhUUkE7IGkrKyl7CisgICAgICAgIGRvdWJsZSB2OworICAgICAgICBzZWVkID0gc2VlZCogMTY2NDUyNSArIDEwMTM5MDQyMjM7CisKKyAgICAgICAgc3dpdGNoKHMtPmRpdGhlci5tZXRob2QpeworICAgICAgICAgICAgY2FzZSBTV1JfRElUSEVSX1JFQ1RBTkdVTEFSOiB2PSAoKGRvdWJsZSlzZWVkKSAvIFVJTlRfTUFYIC0gMC41OyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChzLT5kaXRoZXIubWV0aG9kIDwgU1dSX0RJVEhFUl9OQik7CisgICAgICAgICAgICAgICAgdiA9ICgoZG91YmxlKXNlZWQpIC8gVUlOVF9NQVg7CisgICAgICAgICAgICAgICAgc2VlZCA9IHNlZWQqMTY2NDUyNSArIDEwMTM5MDQyMjM7CisgICAgICAgICAgICAgICAgdi09ICgoZG91YmxlKXNlZWQpIC8gVUlOVF9NQVg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdG1wW2ldID0gdjsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPGxlbjsgaSsrKXsKKyAgICAgICAgZG91YmxlIHY7CisKKyAgICAgICAgc3dpdGNoKHMtPmRpdGhlci5tZXRob2QpeworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKHMtPmRpdGhlci5tZXRob2QgPCBTV1JfRElUSEVSX05CKTsKKyAgICAgICAgICAgICAgICB2ID0gdG1wW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTV1JfRElUSEVSX1RSSUFOR1VMQVJfSElHSFBBU1MgOgorICAgICAgICAgICAgICAgIHYgPSAoLSB0bXBbaV0gKyAyKnRtcFtpKzFdIC0gdG1wW2krMl0pIC8gc3FydCg2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHYqPSBzY2FsZTsKKworICAgICAgICBzd2l0Y2gobm9pc2VfZm10KXsKKyAgICAgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOiAoKGludDE2X3QqKWRzdClbaV0gPSB2OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzJQOiAoKGludDMyX3QqKWRzdClbaV0gPSB2OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFRQOiAoKGZsb2F0ICAqKWRzdClbaV0gPSB2OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQOiAoKGRvdWJsZSAqKWRzdClbaV0gPSB2OyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGF2X2Fzc2VydDAoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9mcmVlKHRtcCk7Cit9CisKK2ludCBzd3JpX2RpdGhlcl9pbml0KFN3ckNvbnRleHQgKnMsIGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X2ZtdCwgZW51bSBBVlNhbXBsZUZvcm1hdCBpbl9mbXQpCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIHNjYWxlID0gMDsKKworICAgIGlmIChzLT5kaXRoZXIubWV0aG9kID4gU1dSX0RJVEhFUl9UUklBTkdVTEFSX0hJR0hQQVNTICYmIHMtPmRpdGhlci5tZXRob2QgPD0gU1dSX0RJVEhFUl9OUykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIG91dF9mbXQgPSBhdl9nZXRfcGFja2VkX3NhbXBsZV9mbXQob3V0X2ZtdCk7CisgICAgaW5fZm10ICA9IGF2X2dldF9wYWNrZWRfc2FtcGxlX2ZtdCggaW5fZm10KTsKKworICAgIGlmKGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCB8fCBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9EQkwpeworICAgICAgICBpZihvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyKSBzY2FsZSA9IDEuMC8oMUw8PDMxKTsKKyAgICAgICAgaWYob3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNikgc2NhbGUgPSAxLjAvKDFMPDwxNSk7CisgICAgICAgIGlmKG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9VOCApIHNjYWxlID0gMS4wLygxTDw8IDcpOworICAgIH0KKyAgICBpZihpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIgJiYgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMiAmJiAocy0+ZGl0aGVyLm91dHB1dF9zYW1wbGVfYml0cyYzMSkpIHNjYWxlID0gMTsKKyAgICBpZihpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIgJiYgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNikgc2NhbGUgPSAxTDw8MTY7CisgICAgaWYoaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyICYmIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9VOCApIHNjYWxlID0gMUw8PDI0OworICAgIGlmKGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNiAmJiBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfVTggKSBzY2FsZSA9IDFMPDw4OworCisgICAgc2NhbGUgKj0gcy0+ZGl0aGVyLnNjYWxlOworCisgICAgaWYgKG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIgJiYgcy0+ZGl0aGVyLm91dHB1dF9zYW1wbGVfYml0cykKKyAgICAgICAgc2NhbGUgKj0gMTw8KDMyLXMtPmRpdGhlci5vdXRwdXRfc2FtcGxlX2JpdHMpOworCisgICAgcy0+ZGl0aGVyLm5zX3BvcyA9IDA7CisgICAgcy0+ZGl0aGVyLm5vaXNlX3NjYWxlPSAgIHNjYWxlOworICAgIHMtPmRpdGhlci5uc19zY2FsZSAgID0gICBzY2FsZTsKKyAgICBzLT5kaXRoZXIubnNfc2NhbGVfMSA9IHNjYWxlID8gMS9zY2FsZSA6IDA7CisgICAgbWVtc2V0KHMtPmRpdGhlci5uc19lcnJvcnMsIDAsIHNpemVvZihzLT5kaXRoZXIubnNfZXJyb3JzKSk7CisgICAgZm9yIChpPTA7IGZpbHRlcnNbaV0uY29lZnM7IGkrKykgeworICAgICAgICBjb25zdCBmaWx0ZXJfdCAqZiA9ICZmaWx0ZXJzW2ldOworICAgICAgICBpZiAoZmFicyhzLT5vdXRfc2FtcGxlX3JhdGUgLSBmLT5yYXRlKSAvIGYtPnJhdGUgPD0gLjA1ICYmIGYtPm5hbWUgPT0gcy0+ZGl0aGVyLm1ldGhvZCkgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBzLT5kaXRoZXIubnNfdGFwcyA9IGYtPmxlbjsKKyAgICAgICAgICAgIGZvciAoaj0wOyBqPGYtPmxlbjsgaisrKQorICAgICAgICAgICAgICAgIHMtPmRpdGhlci5uc19jb2VmZnNbal0gPSBmLT5jb2Vmc1tqXTsKKyAgICAgICAgICAgIHMtPmRpdGhlci5uc19zY2FsZV8xICo9IDEgLSBleHAoZi0+Z2Fpbl9jQiAqIE1fTE4xMCAqIDAuMDA1KSAqIDIgLyAoMTw8KDgqYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUob3V0X2ZtdCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghZmlsdGVyc1tpXS5jb2VmcyAmJiBzLT5kaXRoZXIubWV0aG9kID4gU1dSX0RJVEhFUl9OUykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJSZXF1ZXN0ZWQgbm9pc2Ugc2hhcGluZyBkaXRoZXIgbm90IGF2YWlsYWJsZSBhdCB0aGlzIHNhbXBsaW5nIHJhdGUsIHVzaW5nIHRyaWFuZ3VsYXIgaHAgZGl0aGVyXG4iKTsKKyAgICAgICAgcy0+ZGl0aGVyLm1ldGhvZCA9IFNXUl9ESVRIRVJfVFJJQU5HVUxBUl9ISUdIUEFTUzsKKyAgICB9CisKKyAgICBhdl9hc3NlcnQwKCFzLT5wcmVvdXQuY291bnQpOworICAgIHMtPmRpdGhlci5ub2lzZSA9IHMtPnByZW91dDsKKyAgICBzLT5kaXRoZXIudGVtcCAgPSBzLT5wcmVvdXQ7CisgICAgaWYgKHMtPmRpdGhlci5tZXRob2QgPiBTV1JfRElUSEVSX05TKSB7CisgICAgICAgIHMtPmRpdGhlci5ub2lzZS5icHMgPSA0OworICAgICAgICBzLT5kaXRoZXIubm9pc2UuZm10ID0gQVZfU0FNUExFX0ZNVF9GTFRQOworICAgICAgICBzLT5kaXRoZXIubm9pc2Vfc2NhbGUgPSAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFRFTVBMQVRFX0RJVEhFUl9TMTYKKyNpbmNsdWRlICJkaXRoZXJfdGVtcGxhdGUuYyIKKyN1bmRlZiBURU1QTEFURV9ESVRIRVJfUzE2CisKKyNkZWZpbmUgVEVNUExBVEVfRElUSEVSX1MzMgorI2luY2x1ZGUgImRpdGhlcl90ZW1wbGF0ZS5jIgorI3VuZGVmIFRFTVBMQVRFX0RJVEhFUl9TMzIKKworI2RlZmluZSBURU1QTEFURV9ESVRIRVJfRkxUCisjaW5jbHVkZSAiZGl0aGVyX3RlbXBsYXRlLmMiCisjdW5kZWYgVEVNUExBVEVfRElUSEVSX0ZMVAorCisjZGVmaW5lIFRFTVBMQVRFX0RJVEhFUl9EQkwKKyNpbmNsdWRlICJkaXRoZXJfdGVtcGxhdGUuYyIKKyN1bmRlZiBURU1QTEFURV9ESVRIRVJfREJMCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9kaXRoZXJfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2RpdGhlcl90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjczMTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9kaXRoZXJfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDY3IEBACisKKyNpZiBkZWZpbmVkKFRFTVBMQVRFX0RJVEhFUl9EQkwpCisjICAgIGRlZmluZSBSRU5BTUUoTikgTiAjIyBfZG91YmxlCisjICAgIGRlZmluZSBERUxFTSAgZG91YmxlCisjICAgIGRlZmluZSBDTElQKHYpCisKKyNlbGlmIGRlZmluZWQoVEVNUExBVEVfRElUSEVSX0ZMVCkKKyMgICAgZGVmaW5lIFJFTkFNRShOKSBOICMjIF9mbG9hdAorIyAgICBkZWZpbmUgREVMRU0gIGZsb2F0CisjICAgIGRlZmluZSBDTElQKHYpCisKKyNlbGlmIGRlZmluZWQoVEVNUExBVEVfRElUSEVSX1MzMikKKyMgICAgZGVmaW5lIFJFTkFNRShOKSBOICMjIF9pbnQzMgorIyAgICBkZWZpbmUgREVMRU0gIGludDMyX3QKKyMgICAgZGVmaW5lIENMSVAodikgdiA9IEZGTUFYKEZGTUlOKHYsIElOVDMyX01BWCksIElOVDMyX01JTikKKworI2VsaWYgZGVmaW5lZChURU1QTEFURV9ESVRIRVJfUzE2KQorIyAgICBkZWZpbmUgUkVOQU1FKE4pIE4gIyMgX2ludDE2CisjICAgIGRlZmluZSBERUxFTSAgaW50MTZfdAorIyAgICBkZWZpbmUgQ0xJUCh2KSB2ID0gRkZNQVgoRkZNSU4odiwgSU5UMTZfTUFYKSwgSU5UMTZfTUlOKQorCisjZWxzZQorRVJST1IKKyNlbmRpZgorCit2b2lkIFJFTkFNRShzd3JpX25vaXNlX3NoYXBpbmcpKFN3ckNvbnRleHQgKnMsIEF1ZGlvRGF0YSAqZHN0cywgY29uc3QgQXVkaW9EYXRhICpzcmNzLCBjb25zdCBBdWRpb0RhdGEgKm5vaXNlcywgaW50IGNvdW50KXsKKyAgICBpbnQgcG9zID0gcy0+ZGl0aGVyLm5zX3BvczsKKyAgICBpbnQgaSwgaiwgY2g7CisgICAgaW50IHRhcHMgID0gcy0+ZGl0aGVyLm5zX3RhcHM7CisgICAgZmxvYXQgUyAgID0gcy0+ZGl0aGVyLm5zX3NjYWxlOworICAgIGZsb2F0IFNfMSA9IHMtPmRpdGhlci5uc19zY2FsZV8xOworCisgICAgYXZfYXNzZXJ0MigodGFwcyYzKSAhPSAyKTsKKyAgICBhdl9hc3NlcnQyKCh0YXBzJjMpICE9IDMgfHwgcy0+ZGl0aGVyLm5zX2NvZWZmc1t0YXBzXSA9PSAwKTsKKworICAgIGZvciAoY2g9MDsgY2g8c3Jjcy0+Y2hfY291bnQ7IGNoKyspIHsKKyAgICAgICAgY29uc3QgZmxvYXQgKm5vaXNlID0gKChjb25zdCBmbG9hdCAqKW5vaXNlcy0+Y2hbY2hdKSArIHMtPmRpdGhlci5ub2lzZV9wb3M7CisgICAgICAgIGNvbnN0IERFTEVNICpzcmMgPSAoY29uc3QgREVMRU0qKXNyY3MtPmNoW2NoXTsKKyAgICAgICAgREVMRU0gKmRzdCA9IChERUxFTSopZHN0cy0+Y2hbY2hdOworICAgICAgICBmbG9hdCAqbnNfZXJyb3JzID0gcy0+ZGl0aGVyLm5zX2Vycm9yc1tjaF07CisgICAgICAgIGNvbnN0IGZsb2F0ICpuc19jb2VmZnMgPSBzLT5kaXRoZXIubnNfY29lZmZzOworICAgICAgICBwb3MgID0gcy0+ZGl0aGVyLm5zX3BvczsKKyAgICAgICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIGQxLCBkID0gc3JjW2ldKlNfMTsKKyAgICAgICAgICAgIGZvcihqPTA7IGo8dGFwcy0yOyBqKz00KSB7CisgICAgICAgICAgICAgICAgZCAtPSBuc19jb2VmZnNbaiAgICBdICogbnNfZXJyb3JzW3BvcyArIGogICAgXQorICAgICAgICAgICAgICAgICAgICArbnNfY29lZmZzW2ogKyAxXSAqIG5zX2Vycm9yc1twb3MgKyBqICsgMV0KKyAgICAgICAgICAgICAgICAgICAgK25zX2NvZWZmc1tqICsgMl0gKiBuc19lcnJvcnNbcG9zICsgaiArIDJdCisgICAgICAgICAgICAgICAgICAgICtuc19jb2VmZnNbaiArIDNdICogbnNfZXJyb3JzW3BvcyArIGogKyAzXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGogPCB0YXBzKQorICAgICAgICAgICAgICAgIGQgLT0gbnNfY29lZmZzW2pdICogbnNfZXJyb3JzW3BvcyArIGpdOworICAgICAgICAgICAgcG9zID0gcG9zID8gcG9zIC0gMSA6IHRhcHMgLSAxOworICAgICAgICAgICAgZDEgPSByaW50KGQgKyBub2lzZVtpXSk7CisgICAgICAgICAgICBuc19lcnJvcnNbcG9zICsgdGFwc10gPSBuc19lcnJvcnNbcG9zXSA9IGQxIC0gZDsKKyAgICAgICAgICAgIGQxICo9IFM7CisgICAgICAgICAgICBDTElQKGQxKTsKKyAgICAgICAgICAgIGRzdFtpXSA9IGQxOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+ZGl0aGVyLm5zX3BvcyA9IHBvczsKK30KKworI3VuZGVmIFJFTkFNRQorI3VuZGVmIERFTEVNCisjdW5kZWYgQ0xJUApkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3cmVzYW1wbGUvbGlic3dyZXNhbXBsZS52IGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvbGlic3dyZXNhbXBsZS52Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNWVmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9saWJzd3Jlc2FtcGxlLnYKQEAgLTAsMCArMSw0IEBACitMSUJTV1JFU0FNUExFXyRNQUpPUiB7CisgICAgICAgIGdsb2JhbDogc3dyXyo7IHN3cmVzYW1wbGVfKjsKKyAgICAgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3cmVzYW1wbGUvbG9nMl90YWIuYyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2xvZzJfdGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhMWRmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL2xvZzJfdGFiLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cyX3RhYi5jIgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3cmVzYW1wbGUvbm9pc2Vfc2hhcGluZ19kYXRhLmMgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9ub2lzZV9zaGFwaW5nX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UwZjJlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvbm9pc2Vfc2hhcGluZ19kYXRhLmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qIEVmZmVjdDogZGl0aGVyL25vaXNlLXNoYXBlICAgQ29weXJpZ2h0IChjKSAyMDA4LTkgcm9ic0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlcgorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50ICByYXRlOworICBlbnVtIHtmaXIsIGlpcn0gdHlwZTsKKyAgc2l6ZV90IGxlbjsKKyAgaW50IGdhaW5fY0I7IC8qIENob3NlbiBzbyBjbGlwcyBhcmUgZmV3IGlmIGFueSwgYnV0IG5vdCBndWFyYW50ZWVkIG5vbmUuICovCisgIGRvdWJsZSBjb25zdCAqIGNvZWZzOworICBlbnVtIFN3ckRpdGhlclR5cGUgbmFtZTsKK30gZmlsdGVyX3Q7CisKK3N0YXRpYyBkb3VibGUgY29uc3QgbGlwNDRbXSA9IHsyLjAzMywgLTIuMTY1LCAxLjk1OSwgLTEuNTkwLCAuNjE0OX07CitzdGF0aWMgZG91YmxlIGNvbnN0IGZ3ZTQ0W10gPSB7CisgIDIuNDEyLCAtMy4zNzAsIDMuOTM3LCAtNC4xNzQsIDMuMzUzLCAtMi4yMDUsIDEuMjgxLCAtLjU2OSwgLjA4NDd9Oworc3RhdGljIGRvdWJsZSBjb25zdCBtZXc0NFtdID0geworICAxLjY2MiwgLTEuMjYzLCAuNDgyNywgLS4yOTEzLCAuMTI2OCwgLS4xMTI0LCAuMDMyNTIsIC0uMDEyNjUsIC0uMDM1MjR9Oworc3RhdGljIGRvdWJsZSBjb25zdCBpZXc0NFtdID0geworICAyLjg0NywgLTQuNjg1LCA2LjIxNCwgLTcuMTg0LCA2LjYzOSwgLTUuMDMyLCAzLjI2MywgLTEuNjMyLCAuNDE5MX07CitzdGF0aWMgZG91YmxlIGNvbnN0IGdlczQ0W10gPSB7CisgIDIuMjA2MSwgLS40NzA2LCAtLjI1MzQsIC0uNjIxNCwgMS4wNTg3LCAuMDY3NiwgLS42MDU0LCAtLjI3Mzh9Oworc3RhdGljIGRvdWJsZSBjb25zdCBnZXM0OFtdID0geworICAyLjIzNzQsIC0uNzMzOSwgLS4xMjUxLCAtLjYwMzMsIC45MDMsIC4wMTE2LCAtLjU4NTMsIC0uMjU3MX07CisKK3N0YXRpYyBkb3VibGUgY29uc3Qgc2hpNDhbXSA9IHsKKyAgMi44NzIwNzI5MzUxMDQzNzAxMTcyLCAgLTUuMDQxMzIzMTg0OTY3MDQxMDE1NiwgICA2LjI0NDI5OTQxMTc3MzY4MTY0MDYsCisgIC01Ljg0ODM5ODY4NTQ1NTMyMjI2NTYsIDMuNzA2NzU0MjA3NjExMDgzOTg0NCwgIC0xLjA0OTUxMTkwOTQ4NDg2MzI4MTIsCisgIC0xLjE4MzAyMzY5MTE3NzM2ODE2NDEsICAgMi4xMTI2NzkyNDMwODc3Njg1NTQ3LCAtMS45MDk0NTMxNTM2MTAyMjk0OTIyLAorICAwLjk5OTEzMDg0NTA2OTg4NTI1MzkxLCAtMC4xNzA5MDgwNjM2NTAxMzEyMjU1OSwgLTAuMzI2MTU2MDIwMTY0NDg5NzQ2MDksCisgIDAuMzkxMjc2NDQ4OTY1MDcyNjMxODQsIC0wLjI2ODc2NDYxNTA1ODg5ODkyNTc4LCAgMC4wOTc2NzYxMDU3OTcyOTA4MDIwMDIsCisgIC0wLjAyMzQ3Mzg0NTc5NDc5Njk0MzY2NSwKK307CitzdGF0aWMgZG91YmxlIGNvbnN0IHNoaTQ0W10gPSB7CisgIDIuNjc3MzE5NzY1MDkwOTQyMzgyOCwgIC00LjgzMDg5MjU2Mjg2NjIxMDkzNzUsICAgNi41NzAxMTAzMjEwNDQ5MjE4NzUsCisgIC03LjQ1NzIwMTQ4MDg2NTQ3ODUxNTYsIDYuNzI2MzI3NDE5MjgxMDA1ODU5NCwgIC00Ljg0ODE2NTAzNTI0NzgwMjczNDQsCisgIDIuMDQxMjA4OTgyNDY3NjUxMzY3MiwgICAwLjcwMDYzNTkxMDAzNDE3OTY4NzUsIC0yLjk1Mzc1NjU3MDgxNjA0MDAzOTEsCisgIDQuMDgwMDM4NTQ3NTE1ODY5MTQwNiwgIC00LjE4NDUyMTY3NTEwOTg2MzI4MTIsICAgMy4zMzExODEyODc3NjU1MDI5Mjk3LAorICAtMi4xMTc5OTI2Mzk1NDE2MjU5NzY2LCAgIDAuODc5MzAyOTc4NTE1NjI1LCAgICAgIC0wLjAzMTc1OTE0NjYwMDk2MTY4NTE4MSwKKyAgLTAuNDIzODI3ODg2NTgxNDIwODk4NDQsIDAuNDc4ODIxMDM5MTk5ODI5MTAxNTYsIC0wLjM1NDkwODEzODUxMzU2NTA2MzQ4LAorICAwLjE3NDk2ODM5MTY1Njg3NTYxMDM1LCAtMC4wNjA5MDgxNjg1NTQzMDYwMzAyNzMsCit9Oworc3RhdGljIGRvdWJsZSBjb25zdCBzaGkzOFtdID0geworICAxLjYzMzU5OTI4MTMxMTAzNTE1NjIsICAtMi4yNjE1NDkyMzQzOTAyNTg3ODkxLCAgIDIuNDA3NzAyOTIyODIxMDQ0OTIxOSwKKyAgLTIuNjM0MTcxNzI0MzE5NDU4MDA3OCwgMi4xNDQwMzYyOTMwMjk3ODUxNTYyLCAgLTEuODE1MzI1ODU2MjA4ODAxMjY5NSwKKyAgMS4wODE2MjI0ODEzNDYxMzAzNzExLCAgLTAuNzAzMDI2NTMzMTI2ODMxMDU0NjksIDAuMTU5OTE5OTMyNDg0NjI2NzcwMDIsCisgIDAuMDQxNTQ5NTE4NzA0NDE0MzY3Njc2LCAtMC4yOTQxNjU3NjAyNzg3MDE3ODIyMywgIDAuMjUxODMxNjgwNTM2MjcwMTQxNiwKKyAgLTAuMjc3NjY0NzgwNjE2NzYwMjUzOTEsICAwLjE1Nzg1NDAzNTQ5NjcxMTczMDk2LCAtMC4xMDE2NTg5NDAzMTUyNDY1ODIwMywKKyAgMC4wMTY4MzM4OTIwOTIxMDg3MjY1MDEsCit9Oworc3RhdGljIGRvdWJsZSBjb25zdCBzaGkzMltdID0KK3sgLyogZG1ha2VyIDMyMDAwOiBiZXN0bWF4PTQuOTk2NTkgKGludmVydGVkKSAqLworMC44MjExODU1MjkyMzIwMjUxNSwKKy0xLjAwNjM2OTIzMzEzMTQwODcsCiswLjYyMzQxOTY0MjQ0ODQyNTI5LAorLTEuMDQ0NzE4NzQyMzcwNjA1NSwKKzAuNjQ1MzI1MTI0MjYzNzYzNDMsCistMC44NzYxNTEzMjMzMTg0ODE0NSwKKzAuNTIyMTk3NTQ0NTc0NzM3NTUsCistMC42NzQzNDI2MzIyOTM3MDExNywKKzAuNDQ5NTQzMTc4MDgxNTEyNDUsCistMC41MjU1NzQ5ODIxNjYyOTAyOCwKKzAuMzQ1NjcyOTk0ODUyMDY2MDQsCistMC4zOTYxODIwMzA0MzkzNzY4MywKKzAuMjY3OTE3NjAzMjU0MzE4MjQsCistMC4yODkzNjA5NzAyNTg3MTI3NywKKzAuMTg4Mzc2NTMxMDA0OTA1NywKKy0wLjE5MDk3MzA4ODE0NTI1NjA0LAorMC4xMDQzMTM1OTcwODMwOTE3NCwKKy0wLjEwNjMzODQ0ODgyMjQ5ODMyLAorMC4wNDY4MzIyMTg3NjYyMTI0NjMsCistMC4wMzk2NTMzMTI0MTQ4ODQ1NjcsCit9Oworc3RhdGljIGRvdWJsZSBjb25zdCBzaGkyMltdID0KK3sgLyogZG1ha2VyIDIyMDUwOiBiZXN0bWF4PTUuNzc3NjIgKGludmVydGVkKSAqLworMC4wNTY1ODEwNTM4ODI4MzcyOTYsCistMC41Njk1NjkwNTEyNjU3MTY1NSwKKy0wLjQwNzI3NzM0NTY1NzM0ODYzLAorLTAuMzM4NzAyODg3Mjk2Njc2NjQsCistMC4yOTgxMDU1Mzc4OTEzODc5NCwKKy0wLjE5MDM5MTYxNTAzMzE0OTcyLAorLTAuMTY1MTAwMjE2ODY1NTM5NTUsCistMC4xMzQ2ODE1OTczNTIwMjc4OSwKKy0wLjA5NjYzMzc2OTU3MTc4MTE1OCwKKy0wLjA4MTA0OTEyOTM2Njg3NDY5NSwKKy0wLjA2NDk1MzA1ODk1ODA1MzU4OSwKKy0wLjA1NDQ1OTA5MTI3NTkzMDQwNSwKKy0wLjA0MzM3ODcwNzAyMTQ3NDgzOCwKKy0wLjAzNjYwMDE0MjcxNzM2MTQ1LAorLTAuMDI2MjU2OTY1NDczMjk0MjU4LAorLTAuMDE4Nzg2MjA2ODQxNDY4ODExLAorLTAuMDEzMzg3NzI1Njg4NTE3MDk0LAorLTAuMDA5MDk4MzIzMDYyMDYyMjYzNSwKKy0wLjAwMjY1ODU5MDkwNzIzMDk3MzIsCistMC4wMDA0MjA4MzMwMDY1MDExOTc4MSwKK307CitzdGF0aWMgZG91YmxlIGNvbnN0IHNoaTE2W10gPQoreyAvKiBkbWFrZXIgMTYwMDA6IGJlc3RtYXg9NS45NzEyOCAoaW52ZXJ0ZWQpICovCistMC4zNzI1MTEzMjcyNjY2OTMxMiwKKy0wLjgxNDIzNTc0Njg2MDUwNDE1LAorLTAuNTUwMTA5NTY1MjU4MDI2MTIsCistMC40NzQwNTc2NzQ0MDc5NTg5OCwKKy0wLjMyNjI0NzA2NjI1OTM4NDE2LAorLTAuMzE2MTc2NjUyOTA4MzI1MiwKKy0wLjIyODYzNjcyNjczNzAyMjQsCistMC4yMjkxNjYwNzU1ODcyNzI2NCwKKy0wLjE5NTY1NjE2NTQ4MDYxMzcxLAorLTAuMTgxNjAxMDQ3NTE1ODY5MTQsCistMC4xNTQyMzE1MTg1MDcwMDM3OCwKKy0wLjE0MTA0NDgxMDQxNDMxNDI3LAorLTAuMTE4NDQyNzY2MzY4Mzg5MTMsCistMC4wOTc1ODMwOTI3NDkxMTg4MDUsCistMC4wNzY0OTM1OTg1MjA3NTU3NjgsCistMC4wNjgxMDY5MTk1MjcwNTM4MzMsCistMC4wNDE4ODE2NTQ0MTE1NTQzMzcsCistMC4wMzY5MjI0MjUwMzE2NjE5ODcsCistMC4wMTkzNjQwNDAzNDQ5NTM1MzcsCistMC4wMTQ5OTQzNjc5NTcxMTUxNzMsCit9Oworc3RhdGljIGRvdWJsZSBjb25zdCBzaGkxMVtdID0KK3sgLyogZG1ha2VyIDExMDI1OiBiZXN0bWF4PTUuOTQwNiAoaW52ZXJ0ZWQpICovCistMC45MjY0MjI4MzQzOTYzNjIzLAorLTAuOTg2OTU5ODc0NjI5OTc0MzcsCistMC42MzExNTYzMjUzNDAyNzEsCistMC41MTk2NjkzNTM5NjE5NDQ1OCwKKy0wLjM5NzM4ODcyNjQ3Mjg1NDYxLAorLTAuMzU2NzkzMDE2MTk1Mjk3MjQsCistMC4yOTcyMDcyNjYwOTIzMDA0MiwKKy0wLjI2MzEwNDc2NjYwNzI4NDU1LAorLTAuMjE3MTkzNTU4ODEyMTQxNDIsCistMC4xODU2MTgxNDcyNTM5OTAxNywKKy0wLjE1NDA0ODQ3MjY0Mjg5ODU2LAorLTAuMTI2ODc0NzE1MDg5Nzk3OTcsCistMC4xMDMzOTc0NTg3OTE3MzI3OSwKKy0wLjA4MzY4ODYzMTY1Mzc4NTcwNiwKKy0wLjA1ODc1NjgyNDU4MjgxNTE3LAorLTAuMDQ2ODkzNjcxMTU0OTc1ODkxLAorLTAuMDI3OTUwOTM2OTI4MzkxNDU3LAorLTAuMDIwNzQwNjA5NjE2MDQxMTgzLAorLTAuMDA5MzY2NDUyNjkzOTM5MjA5LAorLTAuMDA2MDI2MDE2MDgyNjE0NjYwMywKK307CitzdGF0aWMgZG91YmxlIGNvbnN0IHNoaTA4W10gPQoreyAvKiBkbWFrZXIgODAwMDogYmVzdG1heD01LjU2MjM0IChpbnZlcnRlZCkgKi8KKy0xLjIwMjg2MzMzNTYwOTQzNiwKKy0wLjk0MTAzMDk3OTE1NjQ5NDE0LAorLTAuNjc4Nzg1NTYyNTE1MjU4NzksCistMC41NzY1MDAxNzczODM0MjI4NSwKKy0wLjUwMDA0NDc2MzA4ODIyNjMyLAorLTAuNDQzNDkzNDU1NjQ4NDIyMjQsCistMC4zNzgzMzc2ODEyOTM0ODc1NSwKKy0wLjM0MDI4NzIzODM1OTQ1MTI5LAorLTAuMjk0MTMwODkxNTYxNTA4MTgsCistMC4yNDk5NDk1NzQ0NzA1MjAwMiwKKy0wLjIxNzE1NjAwNzg4NTkzMjkyLAorLTAuMTg3OTIxMTIxNzE2NDk5MzMsCistMC4xNTI2ODMxMjM5NDYxODk4OCwKKy0wLjEyMTM1NTQyOTI5MTcyNTE2LAorLTAuMDk5NjEwNjI2Njk3NTQwMjgzLAorLTAuMDc1MjczNjEwNjUxNDkzMDczLAorLTAuMDQ4Nzg3NDk2OTg0MDA0OTc0LAorLTAuMDQyNTg2MzE5MTQ4NTQwNDk3LAorLTAuMDI4OTkxMjkxMjk5NDYyMzE4LAorLTAuMDExODY5MTI1MDY4MTg3NzE0LAorfTsKK3N0YXRpYyBkb3VibGUgY29uc3Qgc2hsNDhbXSA9IHsKKyAgMi4zOTI1Nzc0MDk3NDQyNjI2OTUzLCAgLTMuNDM1MDI5NzQ1MTAxOTI4NzEwOSwgICAzLjE4NTM3MDkyMjA4ODYyMzA0NjksCisgIC0xLjgxMTcyNzE2NjE3NTg0MjI4NTIsIC0wLjIwMTI0NzcwNzAwOTMxNTQ5MDcyLCAgMS40NzU5OTA3NzIyNDczMTQ0NTMxLAorICAtMS43MjEwOTA0MzU5ODE3NTA0ODgzLCAgIDAuOTc3NDY3MDAwNDg0NDY2NTUyNzMsIC0wLjEzNzkwMTM4MDY1ODE0OTcxOTI0LAorICAtMC4zODE4NTkwMzQyOTk4NTA0NjM4NywgIDAuMjc0MjEyNDE5OTg2NzI0ODUzNTIsICAwLjA2NjU4NDIxNDU2ODEzODEyMjU1OSwKKyAgLTAuMzUyMjMzMDIyNDUxNDAwNzU2ODQsICAwLjM3NjcyMzQzODUwMTM1ODAzMjIzLCAtMC4yMzk2NDI3NjkwOTgyODE4NjAzNSwKKyAgMC4wNjg2NzQ4MjUxMzE4OTMxNTc5NTksCit9Oworc3RhdGljIGRvdWJsZSBjb25zdCBzaGw0NFtdID0geworICAyLjA4MzM5MTY2NjQxMjM1MzUxNTYsICAtMy4wNDE4NDUwODMyMzY2OTQzMzU5LCAgIDMuMjA0Nzg5ODc2OTM3ODY2MjEwOSwKKyAgLTIuNzU3MTkyNjExNjk0MzM1OTM3NSwgMS40OTc4NjMwNTQyNzU1MTI2OTUzLCAgLTAuMzQyNzU5NDYwMjEwODAwMTcwOSwKKyAgLTAuNzE3MzM3NDg5MTI4MTEyNzkyOTcsICAxLjA3MzcwNTc5MjQyNzA2Mjk4ODMsIC0xLjAyMjU4MTU3NzMwMTAyNTM5MDYsCisgIDAuNTY2NDk5OTQ4NTAxNTg2OTE0MDYsIC0wLjIwOTY4NjkyMDA0NjgwNjMzNTQ1LCAtMC4wNjUzNzg1MzE4MTM2MjE1MjA5OTYsCisgIDAuMTAzMjI0MzgxODA0NDY2MjQ3NTYsIC0wLjA2NzQ0MjAyMjI2NDAwMzc1MzY2MiwgLTAuMDA0OTUxOTczNDQ1NzEzNTIwMDUsCisgIDAsCit9Oworc3RhdGljIGRvdWJsZSBjb25zdCBzaGg0NFtdID0geworICAgMy4wMjU5MTg5NjA1NzEyODkwNjI1LCAtNi4wMjY4NzE2ODEyMTMzNzg5MDYyLCAgIDkuMTk1MDAzNTA5NTIxNDg0Mzc1LAorICAgLTExLjgyNDkyOTIzNzM2NTcyMjY1NiwgMTIuNzY3MTQyMjk1ODM3NDAyMzQ0LCAtMTEuOTE3OTQ2ODE1NDkwNzIyNjU2LAorICAgOS4xNzM5MTY4MTY3MTE0MjU3ODEyLCAgLTUuMzcxMjMyMDMyNzc1ODc4OTA2MiwgMS4xMzkzNjI0NTQ0MTQzNjc2NzU4LAorICAgMi40NDg0Nzc5ODM0NzQ3MzE0NDUzLCAgLTQuOTcxOTgzOTA5NjA2OTMzNTkzOCwgICA2LjAzOTIwMDMwNTkzODcyMDcwMzEsCisgICAtNS45MzU5NTIxODY1ODQ0NzI2NTYyLCAgNC45MDMyNzgzNTA4MzAwNzgxMjUsICAgLTMuNTUyNzQ0Mzg4NTgwMzIyMjY1NiwKKyAgIDIuMTkwOTY5NzA1NTgxNjY1MDM5MSwgLTEuMTY3MjM4OTUwNzI5MzcwMTE3MiwgIDAuNDkwMzkxNDMzMjM4OTgzMTU0MywKKyAgIC0wLjE2NTE5NzkwODg3ODMyNjQxNjAyLCAgMC4wMjMyMTc4NTg3NDY2NDc4MzQ3NzgsCit9OworCitzdGF0aWMgY29uc3QgZmlsdGVyX3QgZmlsdGVyc1tdID0geworICB7NDQxMDAsIGZpciwgIDUsIDIxMCwgbGlwNDQsICAgICAgICAgIFNXUl9ESVRIRVJfTlNfTElQU0hJVFp9LAorICB7NDYwMDAsIGZpciwgIDksIDI3NiwgZndlNDQsICAgICAgICAgIFNXUl9ESVRIRVJfTlNfRl9XRUlHSFRFRH0sCisgIHs0NjAwMCwgZmlyLCAgOSwgMTYwLCBtZXc0NCwgICAgICAgICAgU1dSX0RJVEhFUl9OU19NT0RJRklFRF9FX1dFSUdIVEVEfSwKKyAgezQ2MDAwLCBmaXIsICA5LCAzMjEsIGlldzQ0LCAgICAgICAgICBTV1JfRElUSEVSX05TX0lNUFJPVkVEX0VfV0VJR0hURUR9LAorLy8gICB7NDgwMDAsIGlpciwgIDQsIDIyMCwgZ2VzNDgsIFNXUl9ESVRIRVJfTlNfR0VTRU1BTk59LAorLy8gICB7NDQxMDAsIGlpciwgIDQsIDIzMCwgZ2VzNDQsIFNXUl9ESVRIRVJfTlNfR0VTRU1BTk59LAorICB7NDgwMDAsIGZpciwgMTYsIDMwMSwgc2hpNDgsICAgICAgICAgIFNXUl9ESVRIRVJfTlNfU0hJQkFUQX0sCisgIHs0NDEwMCwgZmlyLCAyMCwgMzMzLCBzaGk0NCwgICAgICAgICAgU1dSX0RJVEhFUl9OU19TSElCQVRBfSwKKyAgezM3ODAwLCBmaXIsIDE2LCAyNDAsIHNoaTM4LCAgICAgICAgICBTV1JfRElUSEVSX05TX1NISUJBVEF9LAorICB7MzIwMDAsIGZpciwgMjAsIDI0MC8qVEJEKi8sIHNoaTMyLCAgIFNXUl9ESVRIRVJfTlNfU0hJQkFUQX0sCisgIHsyMjA1MCwgZmlyLCAyMCwgMjQwLypUQkQqLywgc2hpMjIsICAgU1dSX0RJVEhFUl9OU19TSElCQVRBfSwKKyAgezE2MDAwLCBmaXIsIDIwLCAyNDAvKlRCRCovLCBzaGkxNiwgICBTV1JfRElUSEVSX05TX1NISUJBVEF9LAorICB7MTEwMjUsIGZpciwgMjAsIDI0MC8qVEJEKi8sIHNoaTExLCAgIFNXUl9ESVRIRVJfTlNfU0hJQkFUQX0sCisgIHsgODAwMCwgZmlyLCAyMCwgMjQwLypUQkQqLywgc2hpMDgsICAgU1dSX0RJVEhFUl9OU19TSElCQVRBfSwKKyAgezQ4MDAwLCBmaXIsIDE2LCAyNTAsIHNobDQ4LCAgICAgICAgICBTV1JfRElUSEVSX05TX0xPV19TSElCQVRBfSwKKyAgezQ0MTAwLCBmaXIsIDE1LCAyNTAsIHNobDQ0LCAgICAgICAgICBTV1JfRElUSEVSX05TX0xPV19TSElCQVRBfSwKKyAgezQ0MTAwLCBmaXIsIDIwLCAzODMsIHNoaDQ0LCAgICAgICAgICBTV1JfRElUSEVSX05TX0hJR0hfU0hJQkFUQX0sCisgIHsgICAgMCwgZmlyLCAgMCwgICAwLCAgTlVMTCwgICAgICAgICAgU1dSX0RJVEhFUl9OT05FfSwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9vcHRpb25zLmMgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9vcHRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjZGIxZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL29wdGlvbnMuYwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIE1pY2hhZWwgTmllZGVybWF5ZXIgKG1pY2hhZWxuaUBnbXguYXQpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGlic3dyZXNhbXBsZQorICoKKyAqIGxpYnN3cmVzYW1wbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIGxpYnN3cmVzYW1wbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggbGlic3dyZXNhbXBsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAic3dyZXNhbXBsZV9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2RlZmluZSAgQzMwREIgIE1fU1FSVDIKKyNkZWZpbmUgIEMxNURCICAxLjE4OTIwNzExNQorI2RlZmluZSBDX18wREIgIDEuMAorI2RlZmluZSBDXzE1REIgIDAuODQwODk2NDE1CisjZGVmaW5lIENfMzBEQiAgTV9TUVJUMV8yCisjZGVmaW5lIENfNDVEQiAgMC41OTQ2MDM1NTgKKyNkZWZpbmUgQ182MERCICAwLjUKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU3dyQ29udGV4dCx4KQorI2RlZmluZSBQQVJBTSBBVl9PUFRfRkxBR19BVURJT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdPXsKK3siaWNoIiAgICAgICAgICAgICAgICAgICwgInNldCBpbnB1dCBjaGFubmVsIGNvdW50IiAgICAgLCBPRkZTRVQoIGluLmNoX2NvdW50ICAgKSwgQVZfT1BUX1RZUEVfSU5UICAsIHsuaTY0PTAgICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCBTV1JfQ0hfTUFYLCBQQVJBTX0sCit7ImluX2NoYW5uZWxfY291bnQiICAgICAsICJzZXQgaW5wdXQgY2hhbm5lbCBjb3VudCIgICAgICwgT0ZGU0VUKCBpbi5jaF9jb3VudCAgICksIEFWX09QVF9UWVBFX0lOVCAgLCB7Lmk2ND0wICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgU1dSX0NIX01BWCwgUEFSQU19LAoreyJvY2giICAgICAgICAgICAgICAgICAgLCAic2V0IG91dHB1dCBjaGFubmVsIGNvdW50IiAgICAsIE9GRlNFVChvdXQuY2hfY291bnQgICApLCBBVl9PUFRfVFlQRV9JTlQgICwgey5pNjQ9MCAgICAgICAgICAgICAgICAgICAgIH0sIDAgICAgICAsIFNXUl9DSF9NQVgsIFBBUkFNfSwKK3sib3V0X2NoYW5uZWxfY291bnQiICAgICwgInNldCBvdXRwdXQgY2hhbm5lbCBjb3VudCIgICAgLCBPRkZTRVQob3V0LmNoX2NvdW50ICAgKSwgQVZfT1BUX1RZUEVfSU5UICAsIHsuaTY0PTAgICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCBTV1JfQ0hfTUFYLCBQQVJBTX0sCit7InVjaCIgICAgICAgICAgICAgICAgICAsICJzZXQgdXNlZCBjaGFubmVsIGNvdW50IiAgICAgICwgT0ZGU0VUKHVzZWRfY2hfY291bnQgICksIEFWX09QVF9UWVBFX0lOVCAgLCB7Lmk2ND0wICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgU1dSX0NIX01BWCwgUEFSQU19LAoreyJ1c2VkX2NoYW5uZWxfY291bnQiICAgLCAic2V0IHVzZWQgY2hhbm5lbCBjb3VudCIgICAgICAsIE9GRlNFVCh1c2VkX2NoX2NvdW50ICApLCBBVl9PUFRfVFlQRV9JTlQgICwgey5pNjQ9MCAgICAgICAgICAgICAgICAgICAgIH0sIDAgICAgICAsIFNXUl9DSF9NQVgsIFBBUkFNfSwKK3siaXNyIiAgICAgICAgICAgICAgICAgICwgInNldCBpbnB1dCBzYW1wbGUgcmF0ZSIgICAgICAgLCBPRkZTRVQoIGluX3NhbXBsZV9yYXRlKSwgQVZfT1BUX1RZUEVfSU5UICAsIHsuaTY0PTAgICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCBJTlRfTUFYICAgLCBQQVJBTX0sCit7ImluX3NhbXBsZV9yYXRlIiAgICAgICAsICJzZXQgaW5wdXQgc2FtcGxlIHJhdGUiICAgICAgICwgT0ZGU0VUKCBpbl9zYW1wbGVfcmF0ZSksIEFWX09QVF9UWVBFX0lOVCAgLCB7Lmk2ND0wICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgSU5UX01BWCAgICwgUEFSQU19LAoreyJvc3IiICAgICAgICAgICAgICAgICAgLCAic2V0IG91dHB1dCBzYW1wbGUgcmF0ZSIgICAgICAsIE9GRlNFVChvdXRfc2FtcGxlX3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQgICwgey5pNjQ9MCAgICAgICAgICAgICAgICAgICAgIH0sIDAgICAgICAsIElOVF9NQVggICAsIFBBUkFNfSwKK3sib3V0X3NhbXBsZV9yYXRlIiAgICAgICwgInNldCBvdXRwdXQgc2FtcGxlIHJhdGUiICAgICAgLCBPRkZTRVQob3V0X3NhbXBsZV9yYXRlKSwgQVZfT1BUX1RZUEVfSU5UICAsIHsuaTY0PTAgICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCBJTlRfTUFYICAgLCBQQVJBTX0sCit7ImlzZiIgICAgICAgICAgICAgICAgICAsICJzZXQgaW5wdXQgc2FtcGxlIGZvcm1hdCIgICAgICwgT0ZGU0VUKCBpbl9zYW1wbGVfZm10ICksIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQgLCB7Lmk2ND1BVl9TQU1QTEVfRk1UX05PTkV9LCAtMSAgICwgSU5UX01BWCwgUEFSQU19LAoreyJpbl9zYW1wbGVfZm10IiAgICAgICAgLCAic2V0IGlucHV0IHNhbXBsZSBmb3JtYXQiICAgICAsIE9GRlNFVCggaW5fc2FtcGxlX2ZtdCApLCBBVl9PUFRfVFlQRV9TQU1QTEVfRk1UICwgey5pNjQ9QVZfU0FNUExFX0ZNVF9OT05FfSwgLTEgICAsIElOVF9NQVgsIFBBUkFNfSwKK3sib3NmIiAgICAgICAgICAgICAgICAgICwgInNldCBvdXRwdXQgc2FtcGxlIGZvcm1hdCIgICAgLCBPRkZTRVQob3V0X3NhbXBsZV9mbXQgKSwgQVZfT1BUX1RZUEVfU0FNUExFX0ZNVCAsIHsuaTY0PUFWX1NBTVBMRV9GTVRfTk9ORX0sIC0xICAgLCBJTlRfTUFYLCBQQVJBTX0sCit7Im91dF9zYW1wbGVfZm10IiAgICAgICAsICJzZXQgb3V0cHV0IHNhbXBsZSBmb3JtYXQiICAgICwgT0ZGU0VUKG91dF9zYW1wbGVfZm10ICksIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQgLCB7Lmk2ND1BVl9TQU1QTEVfRk1UX05PTkV9LCAtMSAgICwgSU5UX01BWCwgUEFSQU19LAoreyJ0c2YiICAgICAgICAgICAgICAgICAgLCAic2V0IGludGVybmFsIHNhbXBsZSBmb3JtYXQiICAsIE9GRlNFVChpbnRfc2FtcGxlX2ZtdCApLCBBVl9PUFRfVFlQRV9TQU1QTEVfRk1UICwgey5pNjQ9QVZfU0FNUExFX0ZNVF9OT05FfSwgLTEgICAsIElOVF9NQVgsIFBBUkFNfSwKK3siaW50ZXJuYWxfc2FtcGxlX2ZtdCIgICwgInNldCBpbnRlcm5hbCBzYW1wbGUgZm9ybWF0IiAgLCBPRkZTRVQoaW50X3NhbXBsZV9mbXQgKSwgQVZfT1BUX1RZUEVfU0FNUExFX0ZNVCAsIHsuaTY0PUFWX1NBTVBMRV9GTVRfTk9ORX0sIC0xICAgLCBJTlRfTUFYLCBQQVJBTX0sCit7ImljbCIgICAgICAgICAgICAgICAgICAsICJzZXQgaW5wdXQgY2hhbm5lbCBsYXlvdXQiICAgICwgT0ZGU0VUKCBpbl9jaF9sYXlvdXQgICksIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VULCB7Lmk2ND0wICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgSU5UNjRfTUFYICwgUEFSQU0sICJjaGFubmVsX2xheW91dCJ9LAoreyJpbl9jaGFubmVsX2xheW91dCIgICAgLCAic2V0IGlucHV0IGNoYW5uZWwgbGF5b3V0IiAgICAsIE9GRlNFVCggaW5fY2hfbGF5b3V0ICApLCBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVCwgey5pNjQ9MCAgICAgICAgICAgICAgICAgICAgIH0sIDAgICAgICAsIElOVDY0X01BWCAsIFBBUkFNLCAiY2hhbm5lbF9sYXlvdXQifSwKK3sib2NsIiAgICAgICAgICAgICAgICAgICwgInNldCBvdXRwdXQgY2hhbm5lbCBsYXlvdXQiICAgLCBPRkZTRVQob3V0X2NoX2xheW91dCAgKSwgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQsIHsuaTY0PTAgICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCBJTlQ2NF9NQVggLCBQQVJBTSwgImNoYW5uZWxfbGF5b3V0In0sCit7Im91dF9jaGFubmVsX2xheW91dCIgICAsICJzZXQgb3V0cHV0IGNoYW5uZWwgbGF5b3V0IiAgICwgT0ZGU0VUKG91dF9jaF9sYXlvdXQgICksIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VULCB7Lmk2ND0wICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgSU5UNjRfTUFYICwgUEFSQU0sICJjaGFubmVsX2xheW91dCJ9LAoreyJjbGV2IiAgICAgICAgICAgICAgICAgLCAic2V0IGNlbnRlciBtaXggbGV2ZWwiICAgICAgICAsIE9GRlNFVChjbGV2ICAgICAgICAgICApLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9Q18zMERCICAgICAgICAgICAgICAgIH0sIC0zMiAgICAsIDMyICAgICAgICAsIFBBUkFNfSwKK3siY2VudGVyX21peF9sZXZlbCIgICAgICwgInNldCBjZW50ZXIgbWl4IGxldmVsIiAgICAgICAgLCBPRkZTRVQoY2xldiAgICAgICAgICAgKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPUNfMzBEQiAgICAgICAgICAgICAgICB9LCAtMzIgICAgLCAzMiAgICAgICAgLCBQQVJBTX0sCit7InNsZXYiICAgICAgICAgICAgICAgICAsICJzZXQgc3Vycm91bmQgbWl4IGxldmVsIiAgICAgICwgT0ZGU0VUKHNsZXYgICAgICAgICAgICksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD1DXzMwREIgICAgICAgICAgICAgICAgfSwgLTMyICAgICwgMzIgICAgICAgICwgUEFSQU19LAoreyJzdXJyb3VuZF9taXhfbGV2ZWwiICAgLCAic2V0IHN1cnJvdW5kIG1peCBMZXZlbCIgICAgICAsIE9GRlNFVChzbGV2ICAgICAgICAgICApLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9Q18zMERCICAgICAgICAgICAgICAgIH0sIC0zMiAgICAsIDMyICAgICAgICAsIFBBUkFNfSwKK3sibGZlX21peF9sZXZlbCIgICAgICAgICwgInNldCBMRkUgbWl4IGxldmVsIiAgICAgICAgICAgLCBPRkZTRVQobGZlX21peF9sZXZlbCAgKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAgICAgICAgICAgICAgICAgICAgICB9LCAtMzIgICAgLCAzMiAgICAgICAgLCBQQVJBTX0sCit7InJtdm9sIiAgICAgICAgICAgICAgICAsICJzZXQgcmVtYXRyaXggdm9sdW1lIiAgICAgICAgICwgT0ZGU0VUKHJlbWF0cml4X3ZvbHVtZSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xLjAgICAgICAgICAgICAgICAgICAgfSwgLTEwMDAgICwgMTAwMCAgICAgICwgUEFSQU19LAoreyJyZW1hdHJpeF92b2x1bWUiICAgICAgLCAic2V0IHJlbWF0cml4IHZvbHVtZSIgICAgICAgICAsIE9GRlNFVChyZW1hdHJpeF92b2x1bWUpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MS4wICAgICAgICAgICAgICAgICAgIH0sIC0xMDAwICAsIDEwMDAgICAgICAsIFBBUkFNfSwKK3sicmVtYXRyaXhfbWF4dmFsIiAgICAgICwgInNldCByZW1hdHJpeCBtYXh2YWwiICAgICAgICAgLCBPRkZTRVQocmVtYXRyaXhfbWF4dmFsKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuMCAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCAxMDAwICAgICAgLCBQQVJBTX0sCisKK3siZmxhZ3MiICAgICAgICAgICAgICAgICwgInNldCBmbGFncyIgICAgICAgICAgICAgICAgICAgLCBPRkZTRVQoZmxhZ3MgICAgICAgICAgKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0PTAgICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCBVSU5UX01BWCAgLCBQQVJBTSwgImZsYWdzIn0sCit7InN3cl9mbGFncyIgICAgICAgICAgICAsICJzZXQgZmxhZ3MiICAgICAgICAgICAgICAgICAgICwgT0ZGU0VUKGZsYWdzICAgICAgICAgICksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2ND0wICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgVUlOVF9NQVggICwgUEFSQU0sICJmbGFncyJ9LAoreyJyZXMiICAgICAgICAgICAgICAgICAgLCAiZm9yY2UgcmVzYW1wbGluZyIgICAgICAgICAgICAsIDAgICAgICAgICAgICAgICAgICAgICAgLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U1dSX0ZMQUdfUkVTQU1QTEUgICAgIH0sIElOVF9NSU4sIElOVF9NQVggICAsIFBBUkFNLCAiZmxhZ3MifSwKKworeyJkaXRoZXJfc2NhbGUiICAgICAgICAgLCAic2V0IGRpdGhlciBzY2FsZSIgICAgICAgICAgICAsIE9GRlNFVChkaXRoZXIuc2NhbGUgICApLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MSAgICAgICAgICAgICAgICAgICAgIH0sIDAgICAgICAsIElOVF9NQVggICAsIFBBUkFNfSwKKworeyJkaXRoZXJfbWV0aG9kIiAgICAgICAgLCAic2V0IGRpdGhlciBtZXRob2QiICAgICAgICAgICAsIE9GRlNFVChkaXRoZXIubWV0aG9kICApLCBBVl9PUFRfVFlQRV9JTlQgICwgey5pNjQ9MCAgICAgICAgICAgICAgICAgICAgIH0sIDAgICAgICAsIFNXUl9ESVRIRVJfTkItMSwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCit7InJlY3Rhbmd1bGFyIiAgICAgICAgICAsICJzZWxlY3QgcmVjdGFuZ3VsYXIgZGl0aGVyIiAgICwgMCAgICAgICAgICAgICAgICAgICAgICAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TV1JfRElUSEVSX1JFQ1RBTkdVTEFSfSwgSU5UX01JTiwgSU5UX01BWCAgICwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCit7InRyaWFuZ3VsYXIiICAgICAgICAgICAsICJzZWxlY3QgdHJpYW5ndWxhciBkaXRoZXIiICAgICwgMCAgICAgICAgICAgICAgICAgICAgICAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TV1JfRElUSEVSX1RSSUFOR1VMQVIgfSwgSU5UX01JTiwgSU5UX01BWCAgICwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCit7InRyaWFuZ3VsYXJfaHAiICAgICAgICAsICJzZWxlY3QgdHJpYW5ndWxhciBkaXRoZXIgd2l0aCBoaWdoIHBhc3MiICwgMCAgICAgICAgICAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TV1JfRElUSEVSX1RSSUFOR1VMQVJfSElHSFBBU1MgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCit7ImxpcHNoaXR6IiAgICAgICAgICAgICAsICJzZWxlY3QgbGlwc2hpdHogbm9pc2Ugc2hhcGluZyBkaXRoZXIiICwgMCAgICAgICAgICAgICAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TV1JfRElUSEVSX05TX0xJUFNISVRafSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCit7InNoaWJhdGEiICAgICAgICAgICAgICAsICJzZWxlY3Qgc2hpYmF0YSBub2lzZSBzaGFwaW5nIGRpdGhlciIgLCAwICAgICAgICAgICAgICAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TV1JfRElUSEVSX05TX1NISUJBVEEgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCit7Imxvd19zaGliYXRhIiAgICAgICAgICAsICJzZWxlY3QgbG93IHNoaWJhdGEgbm9pc2Ugc2hhcGluZyBkaXRoZXIiICwgMCAgICAgICAgICAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TV1JfRElUSEVSX05TX0xPV19TSElCQVRBIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAiZGl0aGVyX21ldGhvZCJ9LAoreyJoaWdoX3NoaWJhdGEiICAgICAgICAgLCAic2VsZWN0IGhpZ2ggc2hpYmF0YSBub2lzZSBzaGFwaW5nIGRpdGhlciIgLCAwICAgICAgICAgLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U1dSX0RJVEhFUl9OU19ISUdIX1NISUJBVEEgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCit7ImZfd2VpZ2h0ZWQiICAgICAgICAgICAsICJzZWxlY3QgZi13ZWlnaHRlZCBub2lzZSBzaGFwaW5nIGRpdGhlciIgLCAwICAgICAgICAgICAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TV1JfRElUSEVSX05TX0ZfV0VJR0hURUQgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCit7Im1vZGlmaWVkX2Vfd2VpZ2h0ZWQiICAsICJzZWxlY3QgbW9kaWZpZWQtZS13ZWlnaHRlZCBub2lzZSBzaGFwaW5nIGRpdGhlciIgLCAwICAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TV1JfRElUSEVSX05TX01PRElGSUVEX0VfV0VJR0hURUQgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCit7ImltcHJvdmVkX2Vfd2VpZ2h0ZWQiICAsICJzZWxlY3QgaW1wcm92ZWQtZS13ZWlnaHRlZCBub2lzZSBzaGFwaW5nIGRpdGhlciIgLCAwICAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TV1JfRElUSEVSX05TX0lNUFJPVkVEX0VfV0VJR0hURUQgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJkaXRoZXJfbWV0aG9kIn0sCisKK3siZmlsdGVyX3NpemUiICAgICAgICAgICwgInNldCBzd3IgcmVzYW1wbGluZyBmaWx0ZXIgc2l6ZSIsIE9GRlNFVChmaWx0ZXJfc2l6ZSkgICwgQVZfT1BUX1RZUEVfSU5UICAsIHsuaTY0PTMyICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCBJTlRfTUFYICAgLCBQQVJBTSB9LAoreyJwaGFzZV9zaGlmdCIgICAgICAgICAgLCAic2V0IHN3ciByZXNhbXBsaW5nIHBoYXNlIHNoaWZ0IiwgT0ZGU0VUKHBoYXNlX3NoaWZ0KSAgLCBBVl9PUFRfVFlQRV9JTlQgICwgey5pNjQ9MTAgICAgICAgICAgICAgICAgICAgIH0sIDAgICAgICAsIDI0ICAgICAgICAsIFBBUkFNIH0sCit7ImxpbmVhcl9pbnRlcnAiICAgICAgICAsICJlbmFibGUgbGluZWFyIGludGVycG9sYXRpb24iICwgT0ZGU0VUKGxpbmVhcl9pbnRlcnApICAsIEFWX09QVF9UWVBFX0lOVCAgLCB7Lmk2ND0wICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgMSAgICAgICAgICwgUEFSQU0gfSwKK3siY3V0b2ZmIiAgICAgICAgICAgICAgICwgInNldCBjdXRvZmYgZnJlcXVlbmN5IHJhdGlvIiAgLCBPRkZTRVQoY3V0b2ZmKSAgICAgICAgICwgQVZfT1BUX1RZUEVfRE9VQkxFLHsuZGJsPTAuICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCAxICAgICAgICAgLCBQQVJBTSB9LAorCisvKiBkdXBsaWNhdGUgb3B0aW9uIGluIG9yZGVyIHRvIHdvcmsgd2l0aCBhdmNvbnYgKi8KK3sicmVzYW1wbGVfY3V0b2ZmIiAgICAgICwgInNldCBjdXRvZmYgZnJlcXVlbmN5IHJhdGlvIiAgLCBPRkZTRVQoY3V0b2ZmKSAgICAgICAgICwgQVZfT1BUX1RZUEVfRE9VQkxFLHsuZGJsPTAuICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCAxICAgICAgICAgLCBQQVJBTSB9LAorCit7InJlc2FtcGxlciIgICAgICAgICAgICAsICJzZXQgcmVzYW1wbGluZyBFbmdpbmUiICAgICAgICwgT0ZGU0VUKGVuZ2luZSkgICAgICAgICAsIEFWX09QVF9UWVBFX0lOVCAgLCB7Lmk2ND0wICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgU1dSX0VOR0lORV9OQi0xLCBQQVJBTSwgInJlc2FtcGxlciJ9LAoreyJzd3IiICAgICAgICAgICAgICAgICAgLCAic2VsZWN0IFNXIFJlc2FtcGxlciIgICAgICAgICAsIDAgICAgICAgICAgICAgICAgICAgICAgLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U1dSX0VOR0lORV9TV1IgICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVggICAsIFBBUkFNLCAicmVzYW1wbGVyIn0sCit7InNveHIiICAgICAgICAgICAgICAgICAsICJzZWxlY3QgU29YIFJlc2FtcGxlciIgICAgICAgICwgMCAgICAgICAgICAgICAgICAgICAgICAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TV1JfRU5HSU5FX1NPWFIgICAgICAgfSwgSU5UX01JTiwgSU5UX01BWCAgICwgUEFSQU0sICJyZXNhbXBsZXIifSwKK3sicHJlY2lzaW9uIiAgICAgICAgICAgICwgInNldCBzb3hyIHJlc2FtcGxpbmcgcHJlY2lzaW9uIChpbiBiaXRzKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBPRkZTRVQocHJlY2lzaW9uKSAgICAgICwgQVZfT1BUX1RZUEVfRE9VQkxFLHsuZGJsPTIwLjAgICAgICAgICAgICAgICAgICB9LCAxNS4wICAgLCAzMy4wICAgICAgLCBQQVJBTSB9LAoreyJjaGVieSIgICAgICAgICAgICAgICAgLCAiZW5hYmxlIHNveHIgQ2hlYnlzaGV2IHBhc3NiYW5kICYgaGlnaGVyLXByZWNpc2lvbiBpcnJhdGlvbmFsIHJhdGlvIGFwcHJveGltYXRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgT0ZGU0VUKGNoZWJ5KSAgICAgICAgICAsIEFWX09QVF9UWVBFX0lOVCAgLCB7Lmk2ND0wICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgMSAgICAgICAgICwgUEFSQU0gfSwKK3sibWluX2NvbXAiICAgICAgICAgICAgICwgInNldCBtaW5pbXVtIGRpZmZlcmVuY2UgYmV0d2VlbiB0aW1lc3RhbXBzIGFuZCBhdWRpbyBkYXRhIChpbiBzZWNvbmRzKSBiZWxvdyB3aGljaCBubyB0aW1lc3RhbXAgY29tcGVuc2F0aW9uIG9mIGVpdGhlciBraW5kIGlzIGFwcGxpZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgT0ZGU0VUKG1pbl9jb21wZW5zYXRpb24pLEFWX09QVF9UWVBFX0ZMT0FUICx7LmRibD1GTFRfTUFYICAgICAgICAgICAgICAgfSwgMCAgICAgICwgRkxUX01BWCAgICwgUEFSQU0gfSwKK3sibWluX2hhcmRfY29tcCIgICAgICAgICwgInNldCBtaW5pbXVtIGRpZmZlcmVuY2UgYmV0d2VlbiB0aW1lc3RhbXBzIGFuZCBhdWRpbyBkYXRhIChpbiBzZWNvbmRzKSB0byB0cmlnZ2VyIHBhZGRpbmcvdHJpbW1pbmcgdGhlIGRhdGEuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIE9GRlNFVChtaW5faGFyZF9jb21wZW5zYXRpb24pLEFWX09QVF9UWVBFX0ZMT0FUICx7LmRibD0wLjEgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgSU5UX01BWCAgICwgUEFSQU0gfSwKK3siY29tcF9kdXJhdGlvbiIgICAgICAgICwgInNldCBkdXJhdGlvbiAoaW4gc2Vjb25kcykgb3ZlciB3aGljaCBkYXRhIGlzIHN0cmV0Y2hlZC9zcXVlZXplZCB0byBtYWtlIGl0IG1hdGNoIHRoZSB0aW1lc3RhbXBzLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBPRkZTRVQoc29mdF9jb21wZW5zYXRpb25fZHVyYXRpb24pLEFWX09QVF9UWVBFX0ZMT0FUICx7LmRibD0xICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgSU5UX01BWCAgICwgUEFSQU0gfSwKK3sibWF4X3NvZnRfY29tcCIgICAgICAgICwgInNldCBtYXhpbXVtIGZhY3RvciBieSB3aGljaCBkYXRhIGlzIHN0cmV0Y2hlZC9zcXVlZXplZCB0byBtYWtlIGl0IG1hdGNoIHRoZSB0aW1lc3RhbXBzLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBPRkZTRVQobWF4X3NvZnRfY29tcGVuc2F0aW9uKSxBVl9PUFRfVFlQRV9GTE9BVCAsey5kYmw9MCAgICAgICAgICAgICAgICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVggICAsIFBBUkFNIH0sCit7ImFzeW5jIiAgICAgICAgICAgICAgICAsICJzaW1wbGlmaWVkIDEgcGFyYW1ldGVyIGF1ZGlvIHRpbWVzdGFtcCBtYXRjaGluZywgMChkaXNhYmxlZCksIDEoZmlsbGluZyBhbmQgdHJpbW1pbmcpLCA+MShtYXhpbXVtIHN0cmV0Y2gvc3F1ZWV6ZSBpbiBzYW1wbGVzIHBlciBzZWNvbmQpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIE9GRlNFVChhc3luYykgICAgICAgICAgLCBBVl9PUFRfVFlQRV9GTE9BVCAsey5kYmw9MCAgICAgICAgICAgICAgICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVggICAsIFBBUkFNIH0sCit7ImZpcnN0X3B0cyIgICAgICAgICAgICAsICJBc3N1bWUgdGhlIGZpcnN0IHB0cyBzaG91bGQgYmUgdGhpcyB2YWx1ZSAoaW4gc2FtcGxlcykuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIE9GRlNFVChmaXJzdHB0c19pbl9zYW1wbGVzKSwgQVZfT1BUX1RZUEVfSU5UNjQgLHsuaTY0PUFWX05PUFRTX1ZBTFVFICAgIH0sIElOVDY0X01JTixJTlQ2NF9NQVgsIFBBUkFNIH0sCisKK3sgIm1hdHJpeF9lbmNvZGluZyIgICAgICwgInNldCBtYXRyaXhlZCBzdGVyZW8gZW5jb2RpbmciICwgT0ZGU0VUKG1hdHJpeF9lbmNvZGluZyksIEFWX09QVF9UWVBFX0lOVCAgICx7Lmk2NCA9IEFWX01BVFJJWF9FTkNPRElOR19OT05FfSwgQVZfTUFUUklYX0VOQ09ESU5HX05PTkUsICAgICBBVl9NQVRSSVhfRU5DT0RJTkdfTkItMSwgUEFSQU0sICJtYXRyaXhfZW5jb2RpbmciIH0sCisgICAgeyAibm9uZSIsICAic2VsZWN0IG5vbmUiLCAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9NQVRSSVhfRU5DT0RJTkdfTk9ORSAgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJtYXRyaXhfZW5jb2RpbmciIH0sCisgICAgeyAiZG9sYnkiLCAic2VsZWN0IERvbGJ5IiwgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9NQVRSSVhfRU5DT0RJTkdfRE9MQlkgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJtYXRyaXhfZW5jb2RpbmciIH0sCisgICAgeyAiZHBsaWkiLCAic2VsZWN0IERvbGJ5IFBybyBMb2dpYyBJSSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9NQVRSSVhfRU5DT0RJTkdfRFBMSUkgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJtYXRyaXhfZW5jb2RpbmciIH0sCisKK3sgImZpbHRlcl90eXBlIiAgICAgICAgICwgInNlbGVjdCBzd3IgZmlsdGVyIHR5cGUiICAgICAgLCBPRkZTRVQoZmlsdGVyX3R5cGUpICAgICwgQVZfT1BUX1RZUEVfSU5UICAsIHsgLmk2NCA9IFNXUl9GSUxURVJfVFlQRV9LQUlTRVIgfSwgU1dSX0ZJTFRFUl9UWVBFX0NVQklDLCBTV1JfRklMVEVSX1RZUEVfS0FJU0VSLCBQQVJBTSwgImZpbHRlcl90eXBlIiB9LAorICAgIHsgImN1YmljIiAgICAgICAgICAgLCAic2VsZWN0IGN1YmljIiAgICAgICAgICAgICAgICAsIDAgICAgICAgICAgICAgICAgICAgICAgLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gU1dSX0ZJTFRFUl9UWVBFX0NVQklDICAgICAgICAgICAgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJmaWx0ZXJfdHlwZSIgfSwKKyAgICB7ICJibGFja21hbl9udXR0YWxsIiwgInNlbGVjdCBCbGFja21hbiBOdXR0YWxsIFdpbmRvd2VkIFNpbmMiLCAwICAgICAgICAgICAgICwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFNXUl9GSUxURVJfVFlQRV9CTEFDS01BTl9OVVRUQUxMIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAiZmlsdGVyX3R5cGUiIH0sCisgICAgeyAia2Fpc2VyIiAgICAgICAgICAsICJzZWxlY3QgS2Fpc2VyIFdpbmRvd2VkIFNpbmMiICwgMCAgICAgICAgICAgICAgICAgICAgICAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBTV1JfRklMVEVSX1RZUEVfS0FJU0VSICAgICAgICAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBQQVJBTSwgImZpbHRlcl90eXBlIiB9LAorCit7ICJrYWlzZXJfYmV0YSIgICAgICAgICAsICJzZXQgc3dyIEthaXNlciBXaW5kb3cgQmV0YSIgICwgT0ZGU0VUKGthaXNlcl9iZXRhKSAgICAsIEFWX09QVF9UWVBFX0lOVCAgLCB7Lmk2ND05ICAgICAgICAgICAgICAgICAgICAgfSwgMiAgICAgICwgMTYgICAgICAgICwgUEFSQU0gfSwKKworeyAib3V0cHV0X3NhbXBsZV9iaXRzIiAgLCAic2V0IHN3ciBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZSBiaXRzIiwgT0ZGU0VUKGRpdGhlci5vdXRwdXRfc2FtcGxlX2JpdHMpLCBBVl9PUFRfVFlQRV9JTlQgICwgey5pNjQ9MCAgIH0sIDAgICAgICAsIDY0ICAgICAgICAsIFBBUkFNIH0sCit7MH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb250ZXh0X3RvX25hbWUodm9pZCogcHRyKSB7CisgICAgcmV0dXJuICJTV1IiOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBhdl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgICAgICAgICAgICA9ICJTV1Jlc2FtcGxlciIsCisgICAgLml0ZW1fbmFtZSAgICAgICAgICAgICAgICAgPSBjb250ZXh0X3RvX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgICAgICAgICAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICAgICAgICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5sb2dfbGV2ZWxfb2Zmc2V0X29mZnNldCAgID0gT0ZGU0VUKGxvZ19sZXZlbF9vZmZzZXQpLAorICAgIC5wYXJlbnRfbG9nX2NvbnRleHRfb2Zmc2V0ID0gT0ZGU0VUKGxvZ19jdHgpLAorICAgIC5jYXRlZ29yeSAgICAgICAgICAgICAgICAgID0gQVZfQ0xBU1NfQ0FURUdPUllfU1dSRVNBTVBMRVIsCit9OworCitjb25zdCBBVkNsYXNzICpzd3JfZ2V0X2NsYXNzKHZvaWQpCit7CisgICAgcmV0dXJuICZhdl9jbGFzczsKK30KKworYXZfY29sZCBzdHJ1Y3QgU3dyQ29udGV4dCAqc3dyX2FsbG9jKHZvaWQpeworICAgIFN3ckNvbnRleHQgKnM9IGF2X21hbGxvY3ooc2l6ZW9mKFN3ckNvbnRleHQpKTsKKyAgICBpZihzKXsKKyAgICAgICAgcy0+YXZfY2xhc3M9ICZhdl9jbGFzczsKKyAgICAgICAgYXZfb3B0X3NldF9kZWZhdWx0cyhzKTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9yZW1hdHJpeC5jIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvcmVtYXRyaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTUyYTJmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvcmVtYXRyaXguYwpAQCAtMCwwICsxLDUwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIE1pY2hhZWwgTmllZGVybWF5ZXIgKG1pY2hhZWxuaUBnbXguYXQpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGlic3dyZXNhbXBsZQorICoKKyAqIGxpYnN3cmVzYW1wbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIGxpYnN3cmVzYW1wbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggbGlic3dyZXNhbXBsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJzd3Jlc2FtcGxlX2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisKKyNkZWZpbmUgVEVNUExBVEVfUkVNQVRSSVhfRkxUCisjaW5jbHVkZSAicmVtYXRyaXhfdGVtcGxhdGUuYyIKKyN1bmRlZiBURU1QTEFURV9SRU1BVFJJWF9GTFQKKworI2RlZmluZSBURU1QTEFURV9SRU1BVFJJWF9EQkwKKyNpbmNsdWRlICJyZW1hdHJpeF90ZW1wbGF0ZS5jIgorI3VuZGVmIFRFTVBMQVRFX1JFTUFUUklYX0RCTAorCisjZGVmaW5lIFRFTVBMQVRFX1JFTUFUUklYX1MxNgorI2luY2x1ZGUgInJlbWF0cml4X3RlbXBsYXRlLmMiCisjdW5kZWYgVEVNUExBVEVfUkVNQVRSSVhfUzE2CisKKyNkZWZpbmUgVEVNUExBVEVfUkVNQVRSSVhfUzMyCisjaW5jbHVkZSAicmVtYXRyaXhfdGVtcGxhdGUuYyIKKyN1bmRlZiBURU1QTEFURV9SRU1BVFJJWF9TMzIKKworI2RlZmluZSBGUk9OVF9MRUZUICAgICAgICAgICAgIDAKKyNkZWZpbmUgRlJPTlRfUklHSFQgICAgICAgICAgICAxCisjZGVmaW5lIEZST05UX0NFTlRFUiAgICAgICAgICAgMgorI2RlZmluZSBMT1dfRlJFUVVFTkNZICAgICAgICAgIDMKKyNkZWZpbmUgQkFDS19MRUZUICAgICAgICAgICAgICA0CisjZGVmaW5lIEJBQ0tfUklHSFQgICAgICAgICAgICAgNQorI2RlZmluZSBGUk9OVF9MRUZUX09GX0NFTlRFUiAgIDYKKyNkZWZpbmUgRlJPTlRfUklHSFRfT0ZfQ0VOVEVSICA3CisjZGVmaW5lIEJBQ0tfQ0VOVEVSICAgICAgICAgICAgOAorI2RlZmluZSBTSURFX0xFRlQgICAgICAgICAgICAgIDkKKyNkZWZpbmUgU0lERV9SSUdIVCAgICAgICAgICAgICAxMAorI2RlZmluZSBUT1BfQ0VOVEVSICAgICAgICAgICAgIDExCisjZGVmaW5lIFRPUF9GUk9OVF9MRUZUICAgICAgICAgMTIKKyNkZWZpbmUgVE9QX0ZST05UX0NFTlRFUiAgICAgICAxMworI2RlZmluZSBUT1BfRlJPTlRfUklHSFQgICAgICAgIDE0CisjZGVmaW5lIFRPUF9CQUNLX0xFRlQgICAgICAgICAgMTUKKyNkZWZpbmUgVE9QX0JBQ0tfQ0VOVEVSICAgICAgICAxNgorI2RlZmluZSBUT1BfQkFDS19SSUdIVCAgICAgICAgIDE3CisjZGVmaW5lIE5VTV9OQU1FRF9DSEFOTkVMUyAgICAgMTgKKworaW50IHN3cl9zZXRfbWF0cml4KHN0cnVjdCBTd3JDb250ZXh0ICpzLCBjb25zdCBkb3VibGUgKm1hdHJpeCwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgbmJfaW4sIG5iX291dCwgaW4sIG91dDsKKworICAgIGlmICghcyB8fCBzLT5pbl9jb252ZXJ0KSAvLyBzIG5lZWRzIHRvIGJlIGFsbG9jYXRlZCBidXQgbm90IGluaXRpYWxpemVkCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgbWVtc2V0KHMtPm1hdHJpeCwgMCwgc2l6ZW9mKHMtPm1hdHJpeCkpOworICAgIG5iX2luICA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzLT5pbl9jaF9sYXlvdXQpOworICAgIG5iX291dCA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzLT5vdXRfY2hfbGF5b3V0KTsKKyAgICBmb3IgKG91dCA9IDA7IG91dCA8IG5iX291dDsgb3V0KyspIHsKKyAgICAgICAgZm9yIChpbiA9IDA7IGluIDwgbmJfaW47IGluKyspCisgICAgICAgICAgICBzLT5tYXRyaXhbb3V0XVtpbl0gPSBtYXRyaXhbaW5dOworICAgICAgICBtYXRyaXggKz0gc3RyaWRlOworICAgIH0KKyAgICBzLT5yZW1hdHJpeF9jdXN0b20gPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV2ZW4oaW50NjRfdCBsYXlvdXQpeworICAgIGlmKCFsYXlvdXQpIHJldHVybiAxOworICAgIGlmKGxheW91dCYobGF5b3V0LTEpKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbGVhbl9sYXlvdXQoU3dyQ29udGV4dCAqcywgaW50NjRfdCBsYXlvdXQpeworICAgIGlmKGxheW91dCAmJiBsYXlvdXQgIT0gQVZfQ0hfRlJPTlRfQ0VOVEVSICYmICEobGF5b3V0JihsYXlvdXQtMSkpKSB7CisgICAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgLTEsIGxheW91dCk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgIlRyZWF0aW5nICVzIGFzIG1vbm9cbiIsIGJ1Zik7CisgICAgICAgIHJldHVybiBBVl9DSF9GUk9OVF9DRU5URVI7CisgICAgfQorCisgICAgcmV0dXJuIGxheW91dDsKK30KKworc3RhdGljIGludCBzYW5lX2xheW91dChpbnQ2NF90IGxheW91dCl7CisgICAgaWYoIShsYXlvdXQgJiBBVl9DSF9MQVlPVVRfU1VSUk9VTkQpKSAvLyBhdCBsZWFzdCAxIGZyb250IHNwZWFrZXIKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYoIWV2ZW4obGF5b3V0ICYgKEFWX0NIX0ZST05UX0xFRlQgfCBBVl9DSF9GUk9OVF9SSUdIVCkpKSAvLyBubyBhc3ltZXRyaWMgZnJvbnQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYoIWV2ZW4obGF5b3V0ICYgKEFWX0NIX1NJREVfTEVGVCB8IEFWX0NIX1NJREVfUklHSFQpKSkgICAvLyBubyBhc3ltZXRyaWMgc2lkZQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZighZXZlbihsYXlvdXQgJiAoQVZfQ0hfQkFDS19MRUZUIHwgQVZfQ0hfQkFDS19SSUdIVCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZighZXZlbihsYXlvdXQgJiAoQVZfQ0hfRlJPTlRfTEVGVF9PRl9DRU5URVIgfCBBVl9DSF9GUk9OVF9SSUdIVF9PRl9DRU5URVIpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYoYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGxheW91dCkgPj0gU1dSX0NIX01BWCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMTsKK30KKworYXZfY29sZCBzdGF0aWMgaW50IGF1dG9fbWF0cml4KFN3ckNvbnRleHQgKnMpCit7CisgICAgaW50IGksIGosIG91dF9pOworICAgIGRvdWJsZSBtYXRyaXhbTlVNX05BTUVEX0NIQU5ORUxTXVtOVU1fTkFNRURfQ0hBTk5FTFNdPXt7MH19OworICAgIGludDY0X3QgdW5hY2NvdW50ZWQsIGluX2NoX2xheW91dCwgb3V0X2NoX2xheW91dDsKKyAgICBkb3VibGUgbWF4Y29lZj0wOworICAgIGNoYXIgYnVmWzEyOF07CisgICAgY29uc3QgaW50IG1hdHJpeF9lbmNvZGluZyA9IHMtPm1hdHJpeF9lbmNvZGluZzsKKyAgICBmbG9hdCBtYXh2YWw7CisKKyAgICBpbl9jaF9sYXlvdXQgPSBjbGVhbl9sYXlvdXQocywgcy0+aW5fY2hfbGF5b3V0KTsKKyAgICBvdXRfY2hfbGF5b3V0ID0gY2xlYW5fbGF5b3V0KHMsIHMtPm91dF9jaF9sYXlvdXQpOworCisgICAgaWYoICAgb3V0X2NoX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfU1RFUkVPX0RPV05NSVgKKyAgICAgICAmJiAoaW5fY2hfbGF5b3V0ICYgQVZfQ0hfTEFZT1VUX1NURVJFT19ET1dOTUlYKSA9PSAwCisgICAgKQorICAgICAgICBvdXRfY2hfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKworICAgIGlmKCAgICBpbl9jaF9sYXlvdXQgPT0gQVZfQ0hfTEFZT1VUX1NURVJFT19ET1dOTUlYCisgICAgICAgJiYgKG91dF9jaF9sYXlvdXQgJiBBVl9DSF9MQVlPVVRfU1RFUkVPX0RPV05NSVgpID09IDAKKyAgICApCisgICAgICAgIGluX2NoX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisKKyAgICBpZighc2FuZV9sYXlvdXQoaW5fY2hfbGF5b3V0KSl7CisgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgLTEsIHMtPmluX2NoX2xheW91dCk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnB1dCBjaGFubmVsIGxheW91dCAnJXMnIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGJ1Zik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYoIXNhbmVfbGF5b3V0KG91dF9jaF9sYXlvdXQpKXsKKyAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhidWYsIHNpemVvZihidWYpLCAtMSwgcy0+b3V0X2NoX2xheW91dCk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPdXRwdXQgY2hhbm5lbCBsYXlvdXQgJyVzJyBpcyBub3Qgc3VwcG9ydGVkXG4iLCBidWYpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG1lbXNldChzLT5tYXRyaXgsIDAsIHNpemVvZihzLT5tYXRyaXgpKTsKKyAgICBmb3IoaT0wOyBpPEZGX0FSUkFZX0VMRU1TKG1hdHJpeCk7IGkrKyl7CisgICAgICAgIGlmKGluX2NoX2xheW91dCAmIG91dF9jaF9sYXlvdXQgJiAoMVVMTDw8aSkpCisgICAgICAgICAgICBtYXRyaXhbaV1baV09IDEuMDsKKyAgICB9CisKKyAgICB1bmFjY291bnRlZD0gaW5fY2hfbGF5b3V0ICYgfm91dF9jaF9sYXlvdXQ7CisKKy8vRklYTUUgaW1wbGVtZW50IGRvbGJ5IHN1cnJvdW5kCisvL0ZJWE1FIGltcGxlbWVudCBmdWxsIGFjMworCisKKyAgICBpZih1bmFjY291bnRlZCAmIEFWX0NIX0ZST05UX0NFTlRFUil7CisgICAgICAgIGlmKChvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfTEFZT1VUX1NURVJFTykgPT0gQVZfQ0hfTEFZT1VUX1NURVJFTyl7CisgICAgICAgICAgICBpZihpbl9jaF9sYXlvdXQgJiBBVl9DSF9MQVlPVVRfU1RFUkVPKSB7CisgICAgICAgICAgICAgICAgbWF0cml4WyBGUk9OVF9MRUZUXVtGUk9OVF9DRU5URVJdKz0gcy0+Y2xldjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0ZST05UX0NFTlRFUl0rPSBzLT5jbGV2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXRyaXhbIEZST05UX0xFRlRdW0ZST05UX0NFTlRFUl0rPSBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtGUk9OVF9DRU5URVJdKz0gTV9TUVJUMV8yOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZQorICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICB9CisgICAgaWYodW5hY2NvdW50ZWQgJiBBVl9DSF9MQVlPVVRfU1RFUkVPKXsKKyAgICAgICAgaWYob3V0X2NoX2xheW91dCAmIEFWX0NIX0ZST05UX0NFTlRFUil7CisgICAgICAgICAgICBtYXRyaXhbRlJPTlRfQ0VOVEVSXVsgRlJPTlRfTEVGVF0rPSBNX1NRUlQxXzI7CisgICAgICAgICAgICBtYXRyaXhbRlJPTlRfQ0VOVEVSXVtGUk9OVF9SSUdIVF0rPSBNX1NRUlQxXzI7CisgICAgICAgICAgICBpZihpbl9jaF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9DRU5URVIpCisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0NFTlRFUl1bIEZST05UX0NFTlRFUl0gPSBzLT5jbGV2KnNxcnQoMik7CisgICAgICAgIH1lbHNlCisgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIGlmKHVuYWNjb3VudGVkICYgQVZfQ0hfQkFDS19DRU5URVIpeworICAgICAgICBpZihvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfQkFDS19MRUZUKXsKKyAgICAgICAgICAgIG1hdHJpeFsgQkFDS19MRUZUXVtCQUNLX0NFTlRFUl0rPSBNX1NRUlQxXzI7CisgICAgICAgICAgICBtYXRyaXhbQkFDS19SSUdIVF1bQkFDS19DRU5URVJdKz0gTV9TUVJUMV8yOworICAgICAgICB9ZWxzZSBpZihvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfU0lERV9MRUZUKXsKKyAgICAgICAgICAgIG1hdHJpeFsgU0lERV9MRUZUXVtCQUNLX0NFTlRFUl0rPSBNX1NRUlQxXzI7CisgICAgICAgICAgICBtYXRyaXhbU0lERV9SSUdIVF1bQkFDS19DRU5URVJdKz0gTV9TUVJUMV8yOworICAgICAgICB9ZWxzZSBpZihvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfTEVGVCl7CisgICAgICAgICAgICBpZiAobWF0cml4X2VuY29kaW5nID09IEFWX01BVFJJWF9FTkNPRElOR19ET0xCWSB8fAorICAgICAgICAgICAgICAgIG1hdHJpeF9lbmNvZGluZyA9PSBBVl9NQVRSSVhfRU5DT0RJTkdfRFBMSUkpIHsKKyAgICAgICAgICAgICAgICBpZiAodW5hY2NvdW50ZWQgJiAoQVZfQ0hfQkFDS19MRUZUIHwgQVZfQ0hfU0lERV9MRUZUKSkgeworICAgICAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW0JBQ0tfQ0VOVEVSXSAtPSBzLT5zbGV2ICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0JBQ0tfQ0VOVEVSXSArPSBzLT5zbGV2ICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19DRU5URVJdIC09IHMtPnNsZXY7CisgICAgICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19DRU5URVJdICs9IHMtPnNsZXY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXRyaXhbIEZST05UX0xFRlRdW0JBQ0tfQ0VOVEVSXSs9IHMtPnNsZXYqTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19DRU5URVJdKz0gcy0+c2xldipNX1NRUlQxXzI7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNlIGlmKG91dF9jaF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9DRU5URVIpeworICAgICAgICAgICAgbWF0cml4WyBGUk9OVF9DRU5URVJdW0JBQ0tfQ0VOVEVSXSs9IHMtPnNsZXYqTV9TUVJUMV8yOworICAgICAgICB9ZWxzZQorICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICB9CisgICAgaWYodW5hY2NvdW50ZWQgJiBBVl9DSF9CQUNLX0xFRlQpeworICAgICAgICBpZihvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfQkFDS19DRU5URVIpeworICAgICAgICAgICAgbWF0cml4W0JBQ0tfQ0VOVEVSXVsgQkFDS19MRUZUXSs9IE1fU1FSVDFfMjsKKyAgICAgICAgICAgIG1hdHJpeFtCQUNLX0NFTlRFUl1bQkFDS19SSUdIVF0rPSBNX1NRUlQxXzI7CisgICAgICAgIH1lbHNlIGlmKG91dF9jaF9sYXlvdXQgJiBBVl9DSF9TSURFX0xFRlQpeworICAgICAgICAgICAgaWYoaW5fY2hfbGF5b3V0ICYgQVZfQ0hfU0lERV9MRUZUKXsKKyAgICAgICAgICAgICAgICBtYXRyaXhbIFNJREVfTEVGVF1bIEJBQ0tfTEVGVF0rPSBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W1NJREVfUklHSFRdW0JBQ0tfUklHSFRdKz0gTV9TUVJUMV8yOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBtYXRyaXhbIFNJREVfTEVGVF1bIEJBQ0tfTEVGVF0rPSAxLjA7CisgICAgICAgICAgICBtYXRyaXhbU0lERV9SSUdIVF1bQkFDS19SSUdIVF0rPSAxLjA7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNlIGlmKG91dF9jaF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9MRUZUKXsKKyAgICAgICAgICAgIGlmIChtYXRyaXhfZW5jb2RpbmcgPT0gQVZfTUFUUklYX0VOQ09ESU5HX0RPTEJZKSB7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtCQUNLX0xFRlQgXSAtPSBzLT5zbGV2ICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19SSUdIVF0gLT0gcy0+c2xldiAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0JBQ0tfTEVGVCBdICs9IHMtPnNsZXYgKiBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX1JJR0hUXSArPSBzLT5zbGV2ICogTV9TUVJUMV8yOworICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRyaXhfZW5jb2RpbmcgPT0gQVZfTUFUUklYX0VOQ09ESU5HX0RQTElJKSB7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtCQUNLX0xFRlQgXSAtPSBzLT5zbGV2ICogU1FSVDNfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW0JBQ0tfUklHSFRdIC09IHMtPnNsZXYgKiBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX0xFRlQgXSArPSBzLT5zbGV2ICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19SSUdIVF0gKz0gcy0+c2xldiAqIFNRUlQzXzI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfTEVGVF1bIEJBQ0tfTEVGVF0gKz0gcy0+c2xldjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0JBQ0tfUklHSFRdICs9IHMtPnNsZXY7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNlIGlmKG91dF9jaF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9DRU5URVIpeworICAgICAgICAgICAgbWF0cml4WyBGUk9OVF9DRU5URVJdW0JBQ0tfTEVGVCBdKz0gcy0+c2xldipNX1NRUlQxXzI7CisgICAgICAgICAgICBtYXRyaXhbIEZST05UX0NFTlRFUl1bQkFDS19SSUdIVF0rPSBzLT5zbGV2Kk1fU1FSVDFfMjsKKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorCisgICAgaWYodW5hY2NvdW50ZWQgJiBBVl9DSF9TSURFX0xFRlQpeworICAgICAgICBpZihvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfQkFDS19MRUZUKXsKKyAgICAgICAgICAgIC8qIGlmIGJhY2sgY2hhbm5lbHMgZG8gbm90IGV4aXN0IGluIHRoZSBpbnB1dCwganVzdCBjb3B5IHNpZGUKKyAgICAgICAgICAgICAgIGNoYW5uZWxzIHRvIGJhY2sgY2hhbm5lbHMsIG90aGVyd2lzZSBtaXggc2lkZSBpbnRvIGJhY2sgKi8KKyAgICAgICAgICAgIGlmIChpbl9jaF9sYXlvdXQgJiBBVl9DSF9CQUNLX0xFRlQpIHsKKyAgICAgICAgICAgICAgICBtYXRyaXhbQkFDS19MRUZUIF1bU0lERV9MRUZUIF0gKz0gTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtCQUNLX1JJR0hUXVtTSURFX1JJR0hUXSArPSBNX1NRUlQxXzI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hdHJpeFtCQUNLX0xFRlQgXVtTSURFX0xFRlQgXSArPSAxLjA7CisgICAgICAgICAgICAgICAgbWF0cml4W0JBQ0tfUklHSFRdW1NJREVfUklHSFRdICs9IDEuMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2UgaWYob3V0X2NoX2xheW91dCAmIEFWX0NIX0JBQ0tfQ0VOVEVSKXsKKyAgICAgICAgICAgIG1hdHJpeFtCQUNLX0NFTlRFUl1bIFNJREVfTEVGVF0rPSBNX1NRUlQxXzI7CisgICAgICAgICAgICBtYXRyaXhbQkFDS19DRU5URVJdW1NJREVfUklHSFRdKz0gTV9TUVJUMV8yOworICAgICAgICB9ZWxzZSBpZihvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfTEVGVCl7CisgICAgICAgICAgICBpZiAobWF0cml4X2VuY29kaW5nID09IEFWX01BVFJJWF9FTkNPRElOR19ET0xCWSkgeworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bU0lERV9MRUZUIF0gLT0gcy0+c2xldiAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW1NJREVfUklHSFRdIC09IHMtPnNsZXYgKiBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtTSURFX0xFRlQgXSArPSBzLT5zbGV2ICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bU0lERV9SSUdIVF0gKz0gcy0+c2xldiAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0cml4X2VuY29kaW5nID09IEFWX01BVFJJWF9FTkNPRElOR19EUExJSSkgeworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bU0lERV9MRUZUIF0gLT0gcy0+c2xldiAqIFNRUlQzXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtTSURFX1JJR0hUXSAtPSBzLT5zbGV2ICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bU0lERV9MRUZUIF0gKz0gcy0+c2xldiAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW1NJREVfUklHSFRdICs9IHMtPnNsZXYgKiBTUVJUM18yOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXRyaXhbIEZST05UX0xFRlRdWyBTSURFX0xFRlRdICs9IHMtPnNsZXY7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtTSURFX1JJR0hUXSArPSBzLT5zbGV2OworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZSBpZihvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfQ0VOVEVSKXsKKyAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfQ0VOVEVSXVtTSURFX0xFRlQgXSs9IHMtPnNsZXYqTV9TUVJUMV8yOworICAgICAgICAgICAgbWF0cml4WyBGUk9OVF9DRU5URVJdW1NJREVfUklHSFRdKz0gcy0+c2xldipNX1NRUlQxXzI7CisgICAgICAgIH1lbHNlCisgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIGlmKHVuYWNjb3VudGVkICYgQVZfQ0hfRlJPTlRfTEVGVF9PRl9DRU5URVIpeworICAgICAgICBpZihvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfTEVGVCl7CisgICAgICAgICAgICBtYXRyaXhbIEZST05UX0xFRlRdWyBGUk9OVF9MRUZUX09GX0NFTlRFUl0rPSAxLjA7CisgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0ZST05UX1JJR0hUX09GX0NFTlRFUl0rPSAxLjA7CisgICAgICAgIH1lbHNlIGlmKG91dF9jaF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9DRU5URVIpeworICAgICAgICAgICAgbWF0cml4WyBGUk9OVF9DRU5URVJdWyBGUk9OVF9MRUZUX09GX0NFTlRFUl0rPSBNX1NRUlQxXzI7CisgICAgICAgICAgICBtYXRyaXhbIEZST05UX0NFTlRFUl1bRlJPTlRfUklHSFRfT0ZfQ0VOVEVSXSs9IE1fU1FSVDFfMjsKKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorICAgIC8qIG1peCBMRkUgaW50byBmcm9udCBsZWZ0L3JpZ2h0IG9yIGNlbnRlciAqLworICAgIGlmICh1bmFjY291bnRlZCAmIEFWX0NIX0xPV19GUkVRVUVOQ1kpIHsKKyAgICAgICAgaWYgKG91dF9jaF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9DRU5URVIpIHsKKyAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9DRU5URVJdW0xPV19GUkVRVUVOQ1ldICs9IHMtPmxmZV9taXhfbGV2ZWw7CisgICAgICAgIH0gZWxzZSBpZiAob3V0X2NoX2xheW91dCAmIEFWX0NIX0ZST05UX0xFRlQpIHsKKyAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bTE9XX0ZSRVFVRU5DWV0gKz0gcy0+bGZlX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bTE9XX0ZSRVFVRU5DWV0gKz0gcy0+bGZlX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIGZvcihvdXRfaT1pPTA7IGk8NjQ7IGkrKyl7CisgICAgICAgIGRvdWJsZSBzdW09MDsKKyAgICAgICAgaW50IGluX2k9MDsKKyAgICAgICAgaWYoKG91dF9jaF9sYXlvdXQgJiAoMVVMTDw8aSkpID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yKGo9MDsgajw2NDsgaisrKXsKKyAgICAgICAgICAgIGlmKChpbl9jaF9sYXlvdXQgJiAoMVVMTDw8aikpID09IDApCisgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChpIDwgRkZfQVJSQVlfRUxFTVMobWF0cml4KSAmJiBqIDwgRkZfQVJSQVlfRUxFTVMobWF0cml4WzBdKSkKKyAgICAgICAgICAgICAgICBzLT5tYXRyaXhbb3V0X2ldW2luX2ldPSBtYXRyaXhbaV1bal07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcy0+bWF0cml4W291dF9pXVtpbl9pXT0gaSA9PSBqICYmIChpbl9jaF9sYXlvdXQgJiBvdXRfY2hfbGF5b3V0ICYgKDFVTEw8PGkpKTsKKyAgICAgICAgICAgIHN1bSArPSBmYWJzKHMtPm1hdHJpeFtvdXRfaV1baW5faV0pOworICAgICAgICAgICAgaW5faSsrOworICAgICAgICB9CisgICAgICAgIG1heGNvZWY9IEZGTUFYKG1heGNvZWYsIHN1bSk7CisgICAgICAgIG91dF9pKys7CisgICAgfQorICAgIGlmKHMtPnJlbWF0cml4X3ZvbHVtZSAgPCAwKQorICAgICAgICBtYXhjb2VmID0gLXMtPnJlbWF0cml4X3ZvbHVtZTsKKworICAgIGlmIChzLT5yZW1hdHJpeF9tYXh2YWwgPiAwKSB7CisgICAgICAgIG1heHZhbCA9IHMtPnJlbWF0cml4X21heHZhbDsKKyAgICB9IGVsc2UgaWYgKCAgIGF2X2dldF9wYWNrZWRfc2FtcGxlX2ZtdChzLT5vdXRfc2FtcGxlX2ZtdCkgPCBBVl9TQU1QTEVfRk1UX0ZMVAorICAgICAgICAgICAgICAgfHwgYXZfZ2V0X3BhY2tlZF9zYW1wbGVfZm10KHMtPmludF9zYW1wbGVfZm10KSA8IEFWX1NBTVBMRV9GTVRfRkxUKSB7CisgICAgICAgIG1heHZhbCA9IDEuMDsKKyAgICB9IGVsc2UKKyAgICAgICAgbWF4dmFsID0gSU5UX01BWDsKKworICAgIGlmKG1heGNvZWYgPiBtYXh2YWwgfHwgcy0+cmVtYXRyaXhfdm9sdW1lICA8IDApeworICAgICAgICBtYXhjb2VmIC89IG1heHZhbDsKKyAgICAgICAgZm9yKGk9MDsgaTxTV1JfQ0hfTUFYOyBpKyspCisgICAgICAgICAgICBmb3Ioaj0wOyBqPFNXUl9DSF9NQVg7IGorKyl7CisgICAgICAgICAgICAgICAgcy0+bWF0cml4W2ldW2pdIC89IG1heGNvZWY7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgaWYocy0+cmVtYXRyaXhfdm9sdW1lID4gMCl7CisgICAgICAgIGZvcihpPTA7IGk8U1dSX0NIX01BWDsgaSsrKQorICAgICAgICAgICAgZm9yKGo9MDsgajxTV1JfQ0hfTUFYOyBqKyspeworICAgICAgICAgICAgICAgIHMtPm1hdHJpeFtpXVtqXSAqPSBzLT5yZW1hdHJpeF92b2x1bWU7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9MDsgaTxhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMob3V0X2NoX2xheW91dCk7IGkrKyl7CisgICAgICAgIGZvcihqPTA7IGo8YXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGluX2NoX2xheW91dCk7IGorKyl7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiJWYgIiwgcy0+bWF0cml4W2ldW2pdKTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgaW50IHN3cmlfcmVtYXRyaXhfaW5pdChTd3JDb250ZXh0ICpzKXsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgbmJfaW4gID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHMtPmluX2NoX2xheW91dCk7CisgICAgaW50IG5iX291dCA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzLT5vdXRfY2hfbGF5b3V0KTsKKworICAgIHMtPm1peF9hbnlfZiA9IE5VTEw7CisKKyAgICBpZiAoIXMtPnJlbWF0cml4X2N1c3RvbSkgeworICAgICAgICBpbnQgciA9IGF1dG9fbWF0cml4KHMpOworICAgICAgICBpZiAocikKKyAgICAgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBpZiAocy0+bWlkYnVmLmZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlApeworICAgICAgICBzLT5uYXRpdmVfbWF0cml4ID0gYXZfY2FsbG9jKG5iX2luICogbmJfb3V0LCBzaXplb2YoaW50KSk7CisgICAgICAgIHMtPm5hdGl2ZV9vbmUgICAgPSBhdl9tYWxsb2N6KHNpemVvZihpbnQpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX291dDsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5iX2luOyBqKyspCisgICAgICAgICAgICAgICAgKChpbnQqKXMtPm5hdGl2ZV9tYXRyaXgpW2kgKiBuYl9pbiArIGpdID0gbHJpbnRmKHMtPm1hdHJpeFtpXVtqXSAqIDMyNzY4KTsKKyAgICAgICAgKigoaW50KilzLT5uYXRpdmVfb25lKSA9IDMyNzY4OworICAgICAgICBzLT5taXhfMV8xX2YgPSAobWl4XzFfMV9mdW5jX3R5cGUqKWNvcHlfczE2OworICAgICAgICBzLT5taXhfMl8xX2YgPSAobWl4XzJfMV9mdW5jX3R5cGUqKXN1bTJfczE2OworICAgICAgICBzLT5taXhfYW55X2YgPSAobWl4X2FueV9mdW5jX3R5cGUqKWdldF9taXhfYW55X2Z1bmNfczE2KHMpOworICAgIH1lbHNlIGlmKHMtPm1pZGJ1Zi5mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQKXsKKyAgICAgICAgcy0+bmF0aXZlX21hdHJpeCA9IGF2X2NhbGxvYyhuYl9pbiAqIG5iX291dCwgc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIHMtPm5hdGl2ZV9vbmUgICAgPSBhdl9tYWxsb2N6KHNpemVvZihmbG9hdCkpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3V0OyBpKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmJfaW47IGorKykKKyAgICAgICAgICAgICAgICAoKGZsb2F0KilzLT5uYXRpdmVfbWF0cml4KVtpICogbmJfaW4gKyBqXSA9IHMtPm1hdHJpeFtpXVtqXTsKKyAgICAgICAgKigoZmxvYXQqKXMtPm5hdGl2ZV9vbmUpID0gMS4wOworICAgICAgICBzLT5taXhfMV8xX2YgPSAobWl4XzFfMV9mdW5jX3R5cGUqKWNvcHlfZmxvYXQ7CisgICAgICAgIHMtPm1peF8yXzFfZiA9IChtaXhfMl8xX2Z1bmNfdHlwZSopc3VtMl9mbG9hdDsKKyAgICAgICAgcy0+bWl4X2FueV9mID0gKG1peF9hbnlfZnVuY190eXBlKilnZXRfbWl4X2FueV9mdW5jX2Zsb2F0KHMpOworICAgIH1lbHNlIGlmKHMtPm1pZGJ1Zi5mbXQgPT0gQVZfU0FNUExFX0ZNVF9EQkxQKXsKKyAgICAgICAgcy0+bmF0aXZlX21hdHJpeCA9IGF2X2NhbGxvYyhuYl9pbiAqIG5iX291dCwgc2l6ZW9mKGRvdWJsZSkpOworICAgICAgICBzLT5uYXRpdmVfb25lICAgID0gYXZfbWFsbG9jeihzaXplb2YoZG91YmxlKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXQ7IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuYl9pbjsgaisrKQorICAgICAgICAgICAgICAgICgoZG91YmxlKilzLT5uYXRpdmVfbWF0cml4KVtpICogbmJfaW4gKyBqXSA9IHMtPm1hdHJpeFtpXVtqXTsKKyAgICAgICAgKigoZG91YmxlKilzLT5uYXRpdmVfb25lKSA9IDEuMDsKKyAgICAgICAgcy0+bWl4XzFfMV9mID0gKG1peF8xXzFfZnVuY190eXBlKiljb3B5X2RvdWJsZTsKKyAgICAgICAgcy0+bWl4XzJfMV9mID0gKG1peF8yXzFfZnVuY190eXBlKilzdW0yX2RvdWJsZTsKKyAgICAgICAgcy0+bWl4X2FueV9mID0gKG1peF9hbnlfZnVuY190eXBlKilnZXRfbWl4X2FueV9mdW5jX2RvdWJsZShzKTsKKyAgICB9ZWxzZSBpZihzLT5taWRidWYuZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUCl7CisgICAgICAgIC8vIE9ubHkgZm9yIGRpdGhlcmluZyBjdXJyZW50bHkKKy8vICAgICAgICAgcy0+bmF0aXZlX21hdHJpeCA9IGF2X2NhbGxvYyhuYl9pbiAqIG5iX291dCwgc2l6ZW9mKGRvdWJsZSkpOworICAgICAgICBzLT5uYXRpdmVfb25lICAgID0gYXZfbWFsbG9jeihzaXplb2YoaW50KSk7CisvLyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXQ7IGkrKykKKy8vICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuYl9pbjsgaisrKQorLy8gICAgICAgICAgICAgICAgICgoZG91YmxlKilzLT5uYXRpdmVfbWF0cml4KVtpICogbmJfaW4gKyBqXSA9IHMtPm1hdHJpeFtpXVtqXTsKKyAgICAgICAgKigoaW50KilzLT5uYXRpdmVfb25lKSA9IDMyNzY4OworICAgICAgICBzLT5taXhfMV8xX2YgPSAobWl4XzFfMV9mdW5jX3R5cGUqKWNvcHlfczMyOworICAgICAgICBzLT5taXhfMl8xX2YgPSAobWl4XzJfMV9mdW5jX3R5cGUqKXN1bTJfczMyOworICAgICAgICBzLT5taXhfYW55X2YgPSAobWl4X2FueV9mdW5jX3R5cGUqKWdldF9taXhfYW55X2Z1bmNfczMyKHMpOworICAgIH1lbHNlCisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgLy9GSVhNRSBxdWFudGl6ZSBmb3IgaW50ZWdlcmVzCisgICAgZm9yIChpID0gMDsgaSA8IFNXUl9DSF9NQVg7IGkrKykgeworICAgICAgICBpbnQgY2hfaW49MDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFNXUl9DSF9NQVg7IGorKykgeworICAgICAgICAgICAgcy0+bWF0cml4MzJbaV1bal09IGxyaW50ZihzLT5tYXRyaXhbaV1bal0gKiAzMjc2OCk7CisgICAgICAgICAgICBpZihzLT5tYXRyaXhbaV1bal0pCisgICAgICAgICAgICAgICAgcy0+bWF0cml4X2NoW2ldWysrY2hfaW5dPSBqOworICAgICAgICB9CisgICAgICAgIHMtPm1hdHJpeF9jaFtpXVswXT0gY2hfaW47CisgICAgfQorCisgICAgaWYoSEFWRV9ZQVNNICYmIEhBVkVfTU1YKSBzd3JpX3JlbWF0cml4X2luaXRfeDg2KHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgdm9pZCBzd3JpX3JlbWF0cml4X2ZyZWUoU3dyQ29udGV4dCAqcyl7CisgICAgYXZfZnJlZXAoJnMtPm5hdGl2ZV9tYXRyaXgpOworICAgIGF2X2ZyZWVwKCZzLT5uYXRpdmVfb25lKTsKKyAgICBhdl9mcmVlcCgmcy0+bmF0aXZlX3NpbWRfbWF0cml4KTsKKyAgICBhdl9mcmVlcCgmcy0+bmF0aXZlX3NpbWRfb25lKTsKK30KKworaW50IHN3cmlfcmVtYXRyaXgoU3dyQ29udGV4dCAqcywgQXVkaW9EYXRhICpvdXQsIEF1ZGlvRGF0YSAqaW4sIGludCBsZW4sIGludCBtdXN0Y29weSl7CisgICAgaW50IG91dF9pLCBpbl9pLCBpLCBqOworICAgIGludCBsZW4xID0gMDsKKyAgICBpbnQgb2ZmID0gMDsKKworICAgIGlmKHMtPm1peF9hbnlfZikgeworICAgICAgICBzLT5taXhfYW55X2Yob3V0LT5jaCwgKGNvbnN0IHVpbnQ4X3QgKiopaW4tPmNoLCBzLT5uYXRpdmVfbWF0cml4LCBsZW4pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZihzLT5taXhfMl8xX3NpbWQgfHwgcy0+bWl4XzFfMV9zaW1kKXsKKyAgICAgICAgbGVuMT0gbGVuJn4xNTsKKyAgICAgICAgb2ZmID0gbGVuMSAqIG91dC0+YnBzOworICAgIH0KKworICAgIGF2X2Fzc2VydDAoIXMtPm91dF9jaF9sYXlvdXQgfHwgb3V0LT5jaF9jb3VudCA9PSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+b3V0X2NoX2xheW91dCkpOworICAgIGF2X2Fzc2VydDAoIXMtPiBpbl9jaF9sYXlvdXQgfHwgaW4gLT5jaF9jb3VudCA9PSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+IGluX2NoX2xheW91dCkpOworCisgICAgZm9yKG91dF9pPTA7IG91dF9pPG91dC0+Y2hfY291bnQ7IG91dF9pKyspeworICAgICAgICBzd2l0Y2gocy0+bWF0cml4X2NoW291dF9pXVswXSl7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGlmKG11c3Rjb3B5KQorICAgICAgICAgICAgICAgIG1lbXNldChvdXQtPmNoW291dF9pXSwgMCwgbGVuICogYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUocy0+aW50X3NhbXBsZV9mbXQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBpbl9pPSBzLT5tYXRyaXhfY2hbb3V0X2ldWzFdOworICAgICAgICAgICAgaWYocy0+bWF0cml4W291dF9pXVtpbl9pXSE9MS4wKXsKKyAgICAgICAgICAgICAgICBpZihzLT5taXhfMV8xX3NpbWQgJiYgbGVuMSkKKyAgICAgICAgICAgICAgICAgICAgcy0+bWl4XzFfMV9zaW1kKG91dC0+Y2hbb3V0X2ldICAgICwgaW4tPmNoW2luX2ldICAgICwgcy0+bmF0aXZlX3NpbWRfbWF0cml4LCBpbi0+Y2hfY291bnQqb3V0X2kgKyBpbl9pLCBsZW4xKTsKKyAgICAgICAgICAgICAgICBpZihsZW4gIT0gbGVuMSkKKyAgICAgICAgICAgICAgICAgICAgcy0+bWl4XzFfMV9mICAgKG91dC0+Y2hbb3V0X2ldK29mZiwgaW4tPmNoW2luX2ldK29mZiwgcy0+bmF0aXZlX21hdHJpeCwgaW4tPmNoX2NvdW50Km91dF9pICsgaW5faSwgbGVuLWxlbjEpOworICAgICAgICAgICAgfWVsc2UgaWYobXVzdGNvcHkpeworICAgICAgICAgICAgICAgIG1lbWNweShvdXQtPmNoW291dF9pXSwgaW4tPmNoW2luX2ldLCBsZW4qb3V0LT5icHMpOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgb3V0LT5jaFtvdXRfaV09IGluLT5jaFtpbl9pXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgIGludCBpbl9pMSA9IHMtPm1hdHJpeF9jaFtvdXRfaV1bMV07CisgICAgICAgICAgICBpbnQgaW5faTIgPSBzLT5tYXRyaXhfY2hbb3V0X2ldWzJdOworICAgICAgICAgICAgaWYocy0+bWl4XzJfMV9zaW1kICYmIGxlbjEpCisgICAgICAgICAgICAgICAgcy0+bWl4XzJfMV9zaW1kKG91dC0+Y2hbb3V0X2ldICAgICwgaW4tPmNoW2luX2kxXSAgICAsIGluLT5jaFtpbl9pMl0gICAgLCBzLT5uYXRpdmVfc2ltZF9tYXRyaXgsIGluLT5jaF9jb3VudCpvdXRfaSArIGluX2kxLCBpbi0+Y2hfY291bnQqb3V0X2kgKyBpbl9pMiwgbGVuMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcy0+bWl4XzJfMV9mICAgKG91dC0+Y2hbb3V0X2ldICAgICwgaW4tPmNoW2luX2kxXSAgICAsIGluLT5jaFtpbl9pMl0gICAgLCBzLT5uYXRpdmVfbWF0cml4LCBpbi0+Y2hfY291bnQqb3V0X2kgKyBpbl9pMSwgaW4tPmNoX2NvdW50Km91dF9pICsgaW5faTIsIGxlbjEpOworICAgICAgICAgICAgaWYobGVuICE9IGxlbjEpCisgICAgICAgICAgICAgICAgcy0+bWl4XzJfMV9mICAgKG91dC0+Y2hbb3V0X2ldK29mZiwgaW4tPmNoW2luX2kxXStvZmYsIGluLT5jaFtpbl9pMl0rb2ZmLCBzLT5uYXRpdmVfbWF0cml4LCBpbi0+Y2hfY291bnQqb3V0X2kgKyBpbl9pMSwgaW4tPmNoX2NvdW50Km91dF9pICsgaW5faTIsIGxlbi1sZW4xKTsKKyAgICAgICAgICAgIGJyZWFrO30KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmKHMtPmludF9zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUUCl7CisgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxsZW47IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHY9MDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDsgajxzLT5tYXRyaXhfY2hbb3V0X2ldWzBdOyBqKyspeworICAgICAgICAgICAgICAgICAgICAgICAgaW5faT0gcy0+bWF0cml4X2NoW291dF9pXVsxK2pdOworICAgICAgICAgICAgICAgICAgICAgICAgdis9ICgoZmxvYXQqKWluLT5jaFtpbl9pXSlbaV0gKiBzLT5tYXRyaXhbb3V0X2ldW2luX2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgoZmxvYXQqKW91dC0+Y2hbb3V0X2ldKVtpXT0gdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihzLT5pbnRfc2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0RCTFApeworICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8bGVuOyBpKyspeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdj0wOworICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wOyBqPHMtPm1hdHJpeF9jaFtvdXRfaV1bMF07IGorKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbl9pPSBzLT5tYXRyaXhfY2hbb3V0X2ldWzEral07CisgICAgICAgICAgICAgICAgICAgICAgICB2Kz0gKChkb3VibGUqKWluLT5jaFtpbl9pXSlbaV0gKiBzLT5tYXRyaXhbb3V0X2ldW2luX2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKilvdXQtPmNoW291dF9pXSlbaV09IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxsZW47IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIGludCB2PTA7CisgICAgICAgICAgICAgICAgICAgIGZvcihqPTA7IGo8cy0+bWF0cml4X2NoW291dF9pXVswXTsgaisrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluX2k9IHMtPm1hdHJpeF9jaFtvdXRfaV1bMStqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYrPSAoKGludDE2X3QqKWluLT5jaFtpbl9pXSlbaV0gKiBzLT5tYXRyaXgzMltvdXRfaV1baW5faV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKChpbnQxNl90KilvdXQtPmNoW291dF9pXSlbaV09ICh2ICsgMTYzODQpPj4xNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9yZW1hdHJpeF90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvcmVtYXRyaXhfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWEzYjlhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvcmVtYXRyaXhfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIE1pY2hhZWwgTmllZGVybWF5ZXIgKG1pY2hhZWxuaUBnbXguYXQpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGlic3dyZXNhbXBsZQorICoKKyAqIGxpYnN3cmVzYW1wbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIGxpYnN3cmVzYW1wbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggbGlic3dyZXNhbXBsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZiBkZWZpbmVkKFRFTVBMQVRFX1JFTUFUUklYX0ZMVCkKKyMgICAgZGVmaW5lIFIoeCkgeAorIyAgICBkZWZpbmUgU0FNUExFIGZsb2F0CisjICAgIGRlZmluZSBDT0VGRiBmbG9hdAorIyAgICBkZWZpbmUgSU5URVIgZmxvYXQKKyMgICAgZGVmaW5lIFJFTkFNRSh4KSB4ICMjIF9mbG9hdAorI2VsaWYgZGVmaW5lZChURU1QTEFURV9SRU1BVFJJWF9EQkwpCisjICAgIGRlZmluZSBSKHgpIHgKKyMgICAgZGVmaW5lIFNBTVBMRSBkb3VibGUKKyMgICAgZGVmaW5lIENPRUZGIGRvdWJsZQorIyAgICBkZWZpbmUgSU5URVIgZG91YmxlCisjICAgIGRlZmluZSBSRU5BTUUoeCkgeCAjIyBfZG91YmxlCisjZWxpZiBkZWZpbmVkKFRFTVBMQVRFX1JFTUFUUklYX1MxNikKKyMgICAgZGVmaW5lIFIoeCkgKCgoeCkgKyAxNjM4NCk+PjE1KQorIyAgICBkZWZpbmUgU0FNUExFIGludDE2X3QKKyMgICAgZGVmaW5lIENPRUZGIGludAorIyAgICBkZWZpbmUgSU5URVIgaW50CisjICAgIGRlZmluZSBSRU5BTUUoeCkgeCAjIyBfczE2CisjZWxpZiBkZWZpbmVkKFRFTVBMQVRFX1JFTUFUUklYX1MzMikKKyMgICAgZGVmaW5lIFIoeCkgKCgoeCkgKyAxNjM4NCk+PjE1KQorIyAgICBkZWZpbmUgU0FNUExFIGludDMyX3QKKyMgICAgZGVmaW5lIENPRUZGIGludAorIyAgICBkZWZpbmUgSU5URVIgaW50NjRfdAorIyAgICBkZWZpbmUgUkVOQU1FKHgpIHggIyMgX3MzMgorI2VuZGlmCisKK3R5cGVkZWYgdm9pZCAoUkVOQU1FKG1peF9hbnlfZnVuY190eXBlKSkoU0FNUExFICoqb3V0LCBjb25zdCBTQU1QTEUgKippbjEsIENPRUZGICpjb2VmZnAsIGludGVnZXIgbGVuKTsKKworc3RhdGljIHZvaWQgUkVOQU1FKHN1bTIpKFNBTVBMRSAqb3V0LCBjb25zdCBTQU1QTEUgKmluMSwgY29uc3QgU0FNUExFICppbjIsIENPRUZGICpjb2VmZnAsIGludGVnZXIgaW5kZXgxLCBpbnRlZ2VyIGluZGV4MiwgaW50ZWdlciBsZW4peworICAgIGludCBpOworICAgIElOVEVSIGNvZWZmMSA9IGNvZWZmcFtpbmRleDFdOworICAgIElOVEVSIGNvZWZmMiA9IGNvZWZmcFtpbmRleDJdOworCisgICAgZm9yKGk9MDsgaTxsZW47IGkrKykKKyAgICAgICAgb3V0W2ldID0gUihjb2VmZjEqaW4xW2ldICsgY29lZmYyKmluMltpXSk7Cit9CisKK3N0YXRpYyB2b2lkIFJFTkFNRShjb3B5KShTQU1QTEUgKm91dCwgY29uc3QgU0FNUExFICppbiwgQ09FRkYgKmNvZWZmcCwgaW50ZWdlciBpbmRleCwgaW50ZWdlciBsZW4peworICAgIGludCBpOworICAgIElOVEVSIGNvZWZmID0gY29lZmZwW2luZGV4XTsKKyAgICBmb3IoaT0wOyBpPGxlbjsgaSsrKQorICAgICAgICBvdXRbaV0gPSBSKGNvZWZmKmluW2ldKTsKK30KKworc3RhdGljIHZvaWQgUkVOQU1FKG1peDZ0bzIpKFNBTVBMRSAqKm91dCwgY29uc3QgU0FNUExFICoqaW4sIENPRUZGICpjb2VmZnAsIGludGVnZXIgbGVuKXsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgSU5URVIgdCA9IGluWzJdW2ldKihJTlRFUiljb2VmZnBbMCo2KzJdICsgaW5bM11baV0qKElOVEVSKWNvZWZmcFswKjYrM107CisgICAgICAgIG91dFswXVtpXSA9IFIodCArIGluWzBdW2ldKihJTlRFUiljb2VmZnBbMCo2KzBdICsgaW5bNF1baV0qKElOVEVSKWNvZWZmcFswKjYrNF0pOworICAgICAgICBvdXRbMV1baV0gPSBSKHQgKyBpblsxXVtpXSooSU5URVIpY29lZmZwWzEqNisxXSArIGluWzVdW2ldKihJTlRFUiljb2VmZnBbMSo2KzVdKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFJFTkFNRShtaXg4dG8yKShTQU1QTEUgKipvdXQsIGNvbnN0IFNBTVBMRSAqKmluLCBDT0VGRiAqY29lZmZwLCBpbnRlZ2VyIGxlbil7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbjsgaSsrKSB7CisgICAgICAgIElOVEVSIHQgPSBpblsyXVtpXSooSU5URVIpY29lZmZwWzAqOCsyXSArIGluWzNdW2ldKihJTlRFUiljb2VmZnBbMCo4KzNdOworICAgICAgICBvdXRbMF1baV0gPSBSKHQgKyBpblswXVtpXSooSU5URVIpY29lZmZwWzAqOCswXSArIGluWzRdW2ldKihJTlRFUiljb2VmZnBbMCo4KzRdICsgaW5bNl1baV0qKElOVEVSKWNvZWZmcFswKjgrNl0pOworICAgICAgICBvdXRbMV1baV0gPSBSKHQgKyBpblsxXVtpXSooSU5URVIpY29lZmZwWzEqOCsxXSArIGluWzVdW2ldKihJTlRFUiljb2VmZnBbMSo4KzVdICsgaW5bN11baV0qKElOVEVSKWNvZWZmcFsxKjgrN10pOworICAgIH0KK30KKworc3RhdGljIFJFTkFNRShtaXhfYW55X2Z1bmNfdHlwZSkgKlJFTkFNRShnZXRfbWl4X2FueV9mdW5jKShTd3JDb250ZXh0ICpzKXsKKyAgICBpZiggICBzLT5vdXRfY2hfbGF5b3V0ID09IEFWX0NIX0xBWU9VVF9TVEVSRU8gJiYgKHMtPmluX2NoX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfNVBPSU5UMSB8fCBzLT5pbl9jaF9sYXlvdXQgPT0gQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSykKKyAgICAgICAmJiBzLT5tYXRyaXhbMF1bMl0gPT0gcy0+bWF0cml4WzFdWzJdICYmIHMtPm1hdHJpeFswXVszXSA9PSBzLT5tYXRyaXhbMV1bM10KKyAgICAgICAmJiAhcy0+bWF0cml4WzBdWzFdICYmICFzLT5tYXRyaXhbMF1bNV0gJiYgIXMtPm1hdHJpeFsxXVswXSAmJiAhcy0+bWF0cml4WzFdWzRdCisgICAgKQorICAgICAgICByZXR1cm4gUkVOQU1FKG1peDZ0bzIpOworCisgICAgaWYoICAgcy0+b3V0X2NoX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfU1RFUkVPICYmIHMtPmluX2NoX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfN1BPSU5UMQorICAgICAgICYmIHMtPm1hdHJpeFswXVsyXSA9PSBzLT5tYXRyaXhbMV1bMl0gJiYgcy0+bWF0cml4WzBdWzNdID09IHMtPm1hdHJpeFsxXVszXQorICAgICAgICYmICFzLT5tYXRyaXhbMF1bMV0gJiYgIXMtPm1hdHJpeFswXVs1XSAmJiAhcy0+bWF0cml4WzFdWzBdICYmICFzLT5tYXRyaXhbMV1bNF0KKyAgICAgICAmJiAhcy0+bWF0cml4WzBdWzddICYmICFzLT5tYXRyaXhbMV1bNl0KKyAgICApCisgICAgICAgIHJldHVybiBSRU5BTUUobWl4OHRvMik7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworI3VuZGVmIFIKKyN1bmRlZiBTQU1QTEUKKyN1bmRlZiBDT0VGRgorI3VuZGVmIElOVEVSCisjdW5kZWYgUkVOQU1FCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9yZXNhbXBsZS5jIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvcmVzYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGY2ZTIwCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvcmVzYW1wbGUuYwpAQCAtMCwwICsxLDQxNyBAQAorLyoKKyAqIGF1ZGlvIHJlc2FtcGxpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDEyIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGF1ZGlvIHJlc2FtcGxpbmcKKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAicmVzYW1wbGUuaCIKKworLyoqCisgKiAwdGggb3JkZXIgbW9kaWZpZWQgYmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICovCitzdGF0aWMgZG91YmxlIGJlc3NlbChkb3VibGUgeCl7CisgICAgZG91YmxlIHY9MTsKKyAgICBkb3VibGUgbGFzdHY9MDsKKyAgICBkb3VibGUgdD0xOworICAgIGludCBpOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgaW52WzEwMF09eworIDEuMC8oIDEqIDEpLCAxLjAvKCAyKiAyKSwgMS4wLyggMyogMyksIDEuMC8oIDQqIDQpLCAxLjAvKCA1KiA1KSwgMS4wLyggNiogNiksIDEuMC8oIDcqIDcpLCAxLjAvKCA4KiA4KSwgMS4wLyggOSogOSksIDEuMC8oMTAqMTApLAorIDEuMC8oMTEqMTEpLCAxLjAvKDEyKjEyKSwgMS4wLygxMyoxMyksIDEuMC8oMTQqMTQpLCAxLjAvKDE1KjE1KSwgMS4wLygxNioxNiksIDEuMC8oMTcqMTcpLCAxLjAvKDE4KjE4KSwgMS4wLygxOSoxOSksIDEuMC8oMjAqMjApLAorIDEuMC8oMjEqMjEpLCAxLjAvKDIyKjIyKSwgMS4wLygyMyoyMyksIDEuMC8oMjQqMjQpLCAxLjAvKDI1KjI1KSwgMS4wLygyNioyNiksIDEuMC8oMjcqMjcpLCAxLjAvKDI4KjI4KSwgMS4wLygyOSoyOSksIDEuMC8oMzAqMzApLAorIDEuMC8oMzEqMzEpLCAxLjAvKDMyKjMyKSwgMS4wLygzMyozMyksIDEuMC8oMzQqMzQpLCAxLjAvKDM1KjM1KSwgMS4wLygzNiozNiksIDEuMC8oMzcqMzcpLCAxLjAvKDM4KjM4KSwgMS4wLygzOSozOSksIDEuMC8oNDAqNDApLAorIDEuMC8oNDEqNDEpLCAxLjAvKDQyKjQyKSwgMS4wLyg0Myo0MyksIDEuMC8oNDQqNDQpLCAxLjAvKDQ1KjQ1KSwgMS4wLyg0Nio0NiksIDEuMC8oNDcqNDcpLCAxLjAvKDQ4KjQ4KSwgMS4wLyg0OSo0OSksIDEuMC8oNTAqNTApLAorIDEuMC8oNTEqNTEpLCAxLjAvKDUyKjUyKSwgMS4wLyg1Myo1MyksIDEuMC8oNTQqNTQpLCAxLjAvKDU1KjU1KSwgMS4wLyg1Nio1NiksIDEuMC8oNTcqNTcpLCAxLjAvKDU4KjU4KSwgMS4wLyg1OSo1OSksIDEuMC8oNjAqNjApLAorIDEuMC8oNjEqNjEpLCAxLjAvKDYyKjYyKSwgMS4wLyg2Myo2MyksIDEuMC8oNjQqNjQpLCAxLjAvKDY1KjY1KSwgMS4wLyg2Nio2NiksIDEuMC8oNjcqNjcpLCAxLjAvKDY4KjY4KSwgMS4wLyg2OSo2OSksIDEuMC8oNzAqNzApLAorIDEuMC8oNzEqNzEpLCAxLjAvKDcyKjcyKSwgMS4wLyg3Myo3MyksIDEuMC8oNzQqNzQpLCAxLjAvKDc1Kjc1KSwgMS4wLyg3Nio3NiksIDEuMC8oNzcqNzcpLCAxLjAvKDc4Kjc4KSwgMS4wLyg3OSo3OSksIDEuMC8oODAqODApLAorIDEuMC8oODEqODEpLCAxLjAvKDgyKjgyKSwgMS4wLyg4Myo4MyksIDEuMC8oODQqODQpLCAxLjAvKDg1Kjg1KSwgMS4wLyg4Nio4NiksIDEuMC8oODcqODcpLCAxLjAvKDg4Kjg4KSwgMS4wLyg4OSo4OSksIDEuMC8oOTAqOTApLAorIDEuMC8oOTEqOTEpLCAxLjAvKDkyKjkyKSwgMS4wLyg5Myo5MyksIDEuMC8oOTQqOTQpLCAxLjAvKDk1Kjk1KSwgMS4wLyg5Nio5NiksIDEuMC8oOTcqOTcpLCAxLjAvKDk4Kjk4KSwgMS4wLyg5OSo5OSksIDEuMC8oMTAwMDApCisgICAgfTsKKworICAgIHg9IHgqeC80OworICAgIGZvcihpPTA7IHYgIT0gbGFzdHY7IGkrKyl7CisgICAgICAgIGxhc3R2PXY7CisgICAgICAgIHQgKj0geCppbnZbaV07CisgICAgICAgIHYgKz0gdDsKKyAgICAgICAgYXZfYXNzZXJ0MihpPDk5KTsKKyAgICB9CisgICAgcmV0dXJuIHY7Cit9CisKKy8qKgorICogYnVpbGRzIGEgcG9seXBoYXNlIGZpbHRlcmJhbmsuCisgKiBAcGFyYW0gZmFjdG9yIHJlc2FtcGxpbmcgZmFjdG9yCisgKiBAcGFyYW0gc2NhbGUgd2FudGVkIHN1bSBvZiBjb2VmZmljaWVudHMgZm9yIGVhY2ggZmlsdGVyCisgKiBAcGFyYW0gZmlsdGVyX3R5cGUgIGZpbHRlciB0eXBlCisgKiBAcGFyYW0ga2Fpc2VyX2JldGEgIGthaXNlciB3aW5kb3cgYmV0YQorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgYnVpbGRfZmlsdGVyKFJlc2FtcGxlQ29udGV4dCAqYywgdm9pZCAqZmlsdGVyLCBkb3VibGUgZmFjdG9yLCBpbnQgdGFwX2NvdW50LCBpbnQgYWxsb2MsIGludCBwaGFzZV9jb3VudCwgaW50IHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbHRlcl90eXBlLCBpbnQga2Fpc2VyX2JldGEpeworICAgIGludCBwaCwgaTsKKyAgICBkb3VibGUgeCwgeSwgdzsKKyAgICBkb3VibGUgKnRhYiA9IGF2X21hbGxvY19hcnJheSh0YXBfY291bnQsICBzaXplb2YoKnRhYikpOworICAgIGNvbnN0IGludCBjZW50ZXI9ICh0YXBfY291bnQtMSkvMjsKKworICAgIGlmICghdGFiKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogaWYgdXBzYW1wbGluZywgb25seSBuZWVkIHRvIGludGVycG9sYXRlLCBubyBmaWx0ZXIgKi8KKyAgICBpZiAoZmFjdG9yID4gMS4wKQorICAgICAgICBmYWN0b3IgPSAxLjA7CisKKyAgICBmb3IocGg9MDtwaDxwaGFzZV9jb3VudDtwaCsrKSB7CisgICAgICAgIGRvdWJsZSBub3JtID0gMDsKKyAgICAgICAgZm9yKGk9MDtpPHRhcF9jb3VudDtpKyspIHsKKyAgICAgICAgICAgIHggPSBNX1BJICogKChkb3VibGUpKGkgLSBjZW50ZXIpIC0gKGRvdWJsZSlwaCAvIHBoYXNlX2NvdW50KSAqIGZhY3RvcjsKKyAgICAgICAgICAgIGlmICh4ID09IDApIHkgPSAxLjA7CisgICAgICAgICAgICBlbHNlICAgICAgICB5ID0gc2luKHgpIC8geDsKKyAgICAgICAgICAgIHN3aXRjaChmaWx0ZXJfdHlwZSl7CisgICAgICAgICAgICBjYXNlIFNXUl9GSUxURVJfVFlQRV9DVUJJQzp7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgZD0gLTAuNTsgLy9maXJzdCBvcmRlciBkZXJpdmF0aXZlID0gLTAuNQorICAgICAgICAgICAgICAgIHggPSBmYWJzKCgoZG91YmxlKShpIC0gY2VudGVyKSAtIChkb3VibGUpcGggLyBwaGFzZV9jb3VudCkgKiBmYWN0b3IpOworICAgICAgICAgICAgICAgIGlmKHg8MS4wKSB5PSAxIC0gMyp4KnggKyAyKngqeCp4ICsgZCooICAgICAgICAgICAgLXgqeCArIHgqeCp4KTsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgeT0gICAgICAgICAgICAgICAgICAgICAgIGQqKC00ICsgOCp4IC0gNSp4KnggKyB4KngqeCk7CisgICAgICAgICAgICAgICAgYnJlYWs7fQorICAgICAgICAgICAgY2FzZSBTV1JfRklMVEVSX1RZUEVfQkxBQ0tNQU5fTlVUVEFMTDoKKyAgICAgICAgICAgICAgICB3ID0gMi4wKnggLyAoZmFjdG9yKnRhcF9jb3VudCkgKyBNX1BJOworICAgICAgICAgICAgICAgIHkgKj0gMC4zNjM1ODE5IC0gMC40ODkxNzc1ICogY29zKHcpICsgMC4xMzY1OTk1ICogY29zKDIqdykgLSAwLjAxMDY0MTEgKiBjb3MoMyp3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1dSX0ZJTFRFUl9UWVBFX0tBSVNFUjoKKyAgICAgICAgICAgICAgICB3ID0gMi4wKnggLyAoZmFjdG9yKnRhcF9jb3VudCpNX1BJKTsKKyAgICAgICAgICAgICAgICB5ICo9IGJlc3NlbChrYWlzZXJfYmV0YSpzcXJ0KEZGTUFYKDEtdyp3LCAwKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0YWJbaV0gPSB5OworICAgICAgICAgICAgbm9ybSArPSB5OworICAgICAgICB9CisKKyAgICAgICAgLyogbm9ybWFsaXplIHNvIHRoYXQgYW4gdW5pZm9ybSBjb2xvciByZW1haW5zIHRoZSBzYW1lICovCisgICAgICAgIHN3aXRjaChjLT5mb3JtYXQpeworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2UDoKKyAgICAgICAgICAgIGZvcihpPTA7aTx0YXBfY291bnQ7aSsrKQorICAgICAgICAgICAgICAgICgoaW50MTZfdCopZmlsdGVyKVtwaCAqIGFsbG9jICsgaV0gPSBhdl9jbGlwKGxyaW50Zih0YWJbaV0gKiBzY2FsZSAvIG5vcm0pLCBJTlQxNl9NSU4sIElOVDE2X01BWCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMlA6CisgICAgICAgICAgICBmb3IoaT0wO2k8dGFwX2NvdW50O2krKykKKyAgICAgICAgICAgICAgICAoKGludDMyX3QqKWZpbHRlcilbcGggKiBhbGxvYyArIGldID0gYXZfY2xpcGxfaW50MzIobGxyaW50KHRhYltpXSAqIHNjYWxlIC8gbm9ybSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFRQOgorICAgICAgICAgICAgZm9yKGk9MDtpPHRhcF9jb3VudDtpKyspCisgICAgICAgICAgICAgICAgKChmbG9hdCopZmlsdGVyKVtwaCAqIGFsbG9jICsgaV0gPSB0YWJbaV0gKiBzY2FsZSAvIG5vcm07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTFA6CisgICAgICAgICAgICBmb3IoaT0wO2k8dGFwX2NvdW50O2krKykKKyAgICAgICAgICAgICAgICAoKGRvdWJsZSopZmlsdGVyKVtwaCAqIGFsbG9jICsgaV0gPSB0YWJbaV0gKiBzY2FsZSAvIG5vcm07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNpZiAwCisgICAgeworI2RlZmluZSBMRU4gMTAyNAorICAgICAgICBpbnQgaixrOworICAgICAgICBkb3VibGUgc2luZVtMRU4gKyB0YXBfY291bnRdOworICAgICAgICBkb3VibGUgZmlsdGVyZWRbTEVOXTsKKyAgICAgICAgZG91YmxlIG1heGZmPS0yLCBtaW5mZj0yLCBtYXhzZj0tMiwgbWluc2Y9MjsKKyAgICAgICAgZm9yKGk9MDsgaTxMRU47IGkrKyl7CisgICAgICAgICAgICBkb3VibGUgc3M9MCwgc2Y9MCwgZmY9MDsKKyAgICAgICAgICAgIGZvcihqPTA7IGo8TEVOK3RhcF9jb3VudDsgaisrKQorICAgICAgICAgICAgICAgIHNpbmVbal09IGNvcyhpKmoqTV9QSS9MRU4pOworICAgICAgICAgICAgZm9yKGo9MDsgajxMRU47IGorKyl7CisgICAgICAgICAgICAgICAgZG91YmxlIHN1bT0wOworICAgICAgICAgICAgICAgIHBoPTA7CisgICAgICAgICAgICAgICAgZm9yKGs9MDsgazx0YXBfY291bnQ7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IGZpbHRlcltwaCAqIHRhcF9jb3VudCArIGtdICogc2luZVtrK2pdOworICAgICAgICAgICAgICAgIGZpbHRlcmVkW2pdPSBzdW0gLyAoMTw8RklMVEVSX1NISUZUKTsKKyAgICAgICAgICAgICAgICBzcys9IHNpbmVbaiArIGNlbnRlcl0gKiBzaW5lW2ogKyBjZW50ZXJdOworICAgICAgICAgICAgICAgIGZmKz0gZmlsdGVyZWRbal0gKiBmaWx0ZXJlZFtqXTsKKyAgICAgICAgICAgICAgICBzZis9IHNpbmVbaiArIGNlbnRlcl0gKiBmaWx0ZXJlZFtqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzPSBzcXJ0KDIqc3MvTEVOKTsKKyAgICAgICAgICAgIGZmPSBzcXJ0KDIqZmYvTEVOKTsKKyAgICAgICAgICAgIHNmPSAyKnNmL0xFTjsKKyAgICAgICAgICAgIG1heGZmPSBGRk1BWChtYXhmZiwgZmYpOworICAgICAgICAgICAgbWluZmY9IEZGTUlOKG1pbmZmLCBmZik7CisgICAgICAgICAgICBtYXhzZj0gRkZNQVgobWF4c2YsIHNmKTsKKyAgICAgICAgICAgIG1pbnNmPSBGRk1JTihtaW5zZiwgc2YpOworICAgICAgICAgICAgaWYoaSUxMT09MCl7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImk6JTRkIHNzOiVmIGZmOiUxMy42ZS0lMTMuNmUgc2Y6JTEzLjZlLSUxMy42ZVxuIiwgaSwgc3MsIG1heGZmLCBtaW5mZiwgbWF4c2YsIG1pbnNmKTsKKyAgICAgICAgICAgICAgICBtaW5mZj1taW5zZj0gMjsKKyAgICAgICAgICAgICAgICBtYXhmZj1tYXhzZj0gLTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGF2X2ZyZWUodGFiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFJlc2FtcGxlQ29udGV4dCAqcmVzYW1wbGVfaW5pdChSZXNhbXBsZUNvbnRleHQgKmMsIGludCBvdXRfcmF0ZSwgaW50IGluX3JhdGUsIGludCBmaWx0ZXJfc2l6ZSwgaW50IHBoYXNlX3NoaWZ0LCBpbnQgbGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGN1dG9mZjAsIGVudW0gQVZTYW1wbGVGb3JtYXQgZm9ybWF0LCBlbnVtIFN3ckZpbHRlclR5cGUgZmlsdGVyX3R5cGUsIGludCBrYWlzZXJfYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24sIGludCBjaGVieSkKK3sKKyAgICBkb3VibGUgY3V0b2ZmID0gY3V0b2ZmMD8gY3V0b2ZmMCA6IDAuOTc7CisgICAgZG91YmxlIGZhY3Rvcj0gRkZNSU4ob3V0X3JhdGUgKiBjdXRvZmYgLyBpbl9yYXRlLCAxLjApOworICAgIGludCBwaGFzZV9jb3VudD0gMTw8cGhhc2Vfc2hpZnQ7CisKKyAgICBpZiAoIWMgfHwgYy0+cGhhc2Vfc2hpZnQgIT0gcGhhc2Vfc2hpZnQgfHwgYy0+bGluZWFyIT1saW5lYXIgfHwgYy0+ZmFjdG9yICE9IGZhY3RvcgorICAgICAgICAgICB8fCBjLT5maWx0ZXJfbGVuZ3RoICE9IEZGTUFYKChpbnQpY2VpbChmaWx0ZXJfc2l6ZS9mYWN0b3IpLCAxKSB8fCBjLT5mb3JtYXQgIT0gZm9ybWF0CisgICAgICAgICAgIHx8IGMtPmZpbHRlcl90eXBlICE9IGZpbHRlcl90eXBlIHx8IGMtPmthaXNlcl9iZXRhICE9IGthaXNlcl9iZXRhKSB7CisgICAgICAgIGMgPSBhdl9tYWxsb2N6KHNpemVvZigqYykpOworICAgICAgICBpZiAoIWMpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBjLT5mb3JtYXQ9IGZvcm1hdDsKKworICAgICAgICBjLT5mZWxlbV9zaXplPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShjLT5mb3JtYXQpOworCisgICAgICAgIHN3aXRjaChjLT5mb3JtYXQpeworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2UDoKKyAgICAgICAgICAgIGMtPmZpbHRlcl9zaGlmdCA9IDE1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzJQOgorICAgICAgICAgICAgYy0+ZmlsdGVyX3NoaWZ0ID0gMzA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVFA6CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQOgorICAgICAgICAgICAgYy0+ZmlsdGVyX3NoaWZ0ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXRcbiIpOworICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWx0ZXJfc2l6ZS9mYWN0b3IgPiBJTlQzMl9NQVgvMjU2KSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRmlsdGVyIGxlbmd0aCB0b28gbGFyZ2VcbiIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGMtPnBoYXNlX3NoaWZ0ICAgPSBwaGFzZV9zaGlmdDsKKyAgICAgICAgYy0+cGhhc2VfbWFzayAgICA9IHBoYXNlX2NvdW50IC0gMTsKKyAgICAgICAgYy0+bGluZWFyICAgICAgICA9IGxpbmVhcjsKKyAgICAgICAgYy0+ZmFjdG9yICAgICAgICA9IGZhY3RvcjsKKyAgICAgICAgYy0+ZmlsdGVyX2xlbmd0aCA9IEZGTUFYKChpbnQpY2VpbChmaWx0ZXJfc2l6ZS9mYWN0b3IpLCAxKTsKKyAgICAgICAgYy0+ZmlsdGVyX2FsbG9jICA9IEZGQUxJR04oYy0+ZmlsdGVyX2xlbmd0aCwgOCk7CisgICAgICAgIGMtPmZpbHRlcl9iYW5rICAgPSBhdl9jYWxsb2MoYy0+ZmlsdGVyX2FsbG9jLCAocGhhc2VfY291bnQrMSkqYy0+ZmVsZW1fc2l6ZSk7CisgICAgICAgIGMtPmZpbHRlcl90eXBlICAgPSBmaWx0ZXJfdHlwZTsKKyAgICAgICAgYy0+a2Fpc2VyX2JldGEgICA9IGthaXNlcl9iZXRhOworICAgICAgICBpZiAoIWMtPmZpbHRlcl9iYW5rKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGJ1aWxkX2ZpbHRlcihjLCAodm9pZCopYy0+ZmlsdGVyX2JhbmssIGZhY3RvciwgYy0+ZmlsdGVyX2xlbmd0aCwgYy0+ZmlsdGVyX2FsbG9jLCBwaGFzZV9jb3VudCwgMTw8Yy0+ZmlsdGVyX3NoaWZ0LCBmaWx0ZXJfdHlwZSwga2Fpc2VyX2JldGEpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgbWVtY3B5KGMtPmZpbHRlcl9iYW5rICsgKGMtPmZpbHRlcl9hbGxvYypwaGFzZV9jb3VudCsxKSpjLT5mZWxlbV9zaXplLCBjLT5maWx0ZXJfYmFuaywgKGMtPmZpbHRlcl9hbGxvYy0xKSpjLT5mZWxlbV9zaXplKTsKKyAgICAgICAgbWVtY3B5KGMtPmZpbHRlcl9iYW5rICsgKGMtPmZpbHRlcl9hbGxvYypwaGFzZV9jb3VudCAgKSpjLT5mZWxlbV9zaXplLCBjLT5maWx0ZXJfYmFuayArIChjLT5maWx0ZXJfYWxsb2MgLSAxKSpjLT5mZWxlbV9zaXplLCBjLT5mZWxlbV9zaXplKTsKKyAgICB9CisKKyAgICBjLT5jb21wZW5zYXRpb25fZGlzdGFuY2U9IDA7CisgICAgaWYoIWF2X3JlZHVjZSgmYy0+c3JjX2luY3IsICZjLT5kc3RfaW5jciwgb3V0X3JhdGUsIGluX3JhdGUgKiAoaW50NjRfdClwaGFzZV9jb3VudCwgSU5UMzJfTUFYLzIpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGMtPmlkZWFsX2RzdF9pbmNyID0gYy0+ZHN0X2luY3I7CisgICAgYy0+ZHN0X2luY3JfZGl2ICAgPSBjLT5kc3RfaW5jciAvIGMtPnNyY19pbmNyOworICAgIGMtPmRzdF9pbmNyX21vZCAgID0gYy0+ZHN0X2luY3IgJSBjLT5zcmNfaW5jcjsKKworICAgIGMtPmluZGV4PSAtcGhhc2VfY291bnQqKChjLT5maWx0ZXJfbGVuZ3RoLTEpLzIpOworICAgIGMtPmZyYWM9IDA7CisKKyAgICBzd3JpX3Jlc2FtcGxlX2RzcF9pbml0KGMpOworCisgICAgcmV0dXJuIGM7CitlcnJvcjoKKyAgICBhdl9mcmVlcCgmYy0+ZmlsdGVyX2JhbmspOworICAgIGF2X2ZyZWUoYyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2FtcGxlX2ZyZWUoUmVzYW1wbGVDb250ZXh0ICoqYyl7CisgICAgaWYoISpjKQorICAgICAgICByZXR1cm47CisgICAgYXZfZnJlZXAoJigqYyktPmZpbHRlcl9iYW5rKTsKKyAgICBhdl9mcmVlcChjKTsKK30KKworc3RhdGljIGludCBzZXRfY29tcGVuc2F0aW9uKFJlc2FtcGxlQ29udGV4dCAqYywgaW50IHNhbXBsZV9kZWx0YSwgaW50IGNvbXBlbnNhdGlvbl9kaXN0YW5jZSl7CisgICAgYy0+Y29tcGVuc2F0aW9uX2Rpc3RhbmNlPSBjb21wZW5zYXRpb25fZGlzdGFuY2U7CisgICAgaWYgKGNvbXBlbnNhdGlvbl9kaXN0YW5jZSkKKyAgICAgICAgYy0+ZHN0X2luY3IgPSBjLT5pZGVhbF9kc3RfaW5jciAtIGMtPmlkZWFsX2RzdF9pbmNyICogKGludDY0X3Qpc2FtcGxlX2RlbHRhIC8gY29tcGVuc2F0aW9uX2Rpc3RhbmNlOworICAgIGVsc2UKKyAgICAgICAgYy0+ZHN0X2luY3IgPSBjLT5pZGVhbF9kc3RfaW5jcjsKKworICAgIGMtPmRzdF9pbmNyX2RpdiAgID0gYy0+ZHN0X2luY3IgLyBjLT5zcmNfaW5jcjsKKyAgICBjLT5kc3RfaW5jcl9tb2QgICA9IGMtPmRzdF9pbmNyICUgYy0+c3JjX2luY3I7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd3JpX3Jlc2FtcGxlKFJlc2FtcGxlQ29udGV4dCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50ICpjb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3NpemUsIGludCBkc3Rfc2l6ZSwgaW50IHVwZGF0ZV9jdHgpCit7CisgICAgaWYgKGMtPmZpbHRlcl9sZW5ndGggPT0gMSAmJiBjLT5waGFzZV9zaGlmdCA9PSAwKSB7CisgICAgICAgIGludCBpbmRleD0gYy0+aW5kZXg7CisgICAgICAgIGludCBmcmFjPSBjLT5mcmFjOworICAgICAgICBpbnQ2NF90IGluZGV4Mj0gKDFMTDw8MzIpKmMtPmZyYWMvYy0+c3JjX2luY3IgKyAoMUxMPDwzMikqaW5kZXg7CisgICAgICAgIGludDY0X3QgaW5jcj0gKDFMTDw8MzIpICogYy0+ZHN0X2luY3IgLyBjLT5zcmNfaW5jcjsKKyAgICAgICAgaW50IG5ld19zaXplID0gKHNyY19zaXplICogKGludDY0X3QpYy0+c3JjX2luY3IgLSBmcmFjICsgYy0+ZHN0X2luY3IgLSAxKSAvIGMtPmRzdF9pbmNyOworCisgICAgICAgIGRzdF9zaXplPSBGRk1JTihkc3Rfc2l6ZSwgbmV3X3NpemUpOworICAgICAgICBjLT5kc3AucmVzYW1wbGVfb25lKGRzdCwgc3JjLCBkc3Rfc2l6ZSwgaW5kZXgyLCBpbmNyKTsKKworICAgICAgICBpbmRleCArPSBkc3Rfc2l6ZSAqIGMtPmRzdF9pbmNyX2RpdjsKKyAgICAgICAgaW5kZXggKz0gKGZyYWMgKyBkc3Rfc2l6ZSAqIChpbnQ2NF90KWMtPmRzdF9pbmNyX21vZCkgLyBjLT5zcmNfaW5jcjsKKyAgICAgICAgYXZfYXNzZXJ0MihpbmRleCA+PSAwKTsKKyAgICAgICAgKmNvbnN1bWVkPSBpbmRleDsKKyAgICAgICAgaWYgKHVwZGF0ZV9jdHgpIHsKKyAgICAgICAgICAgIGMtPmZyYWMgICA9IChmcmFjICsgZHN0X3NpemUgKiAoaW50NjRfdCljLT5kc3RfaW5jcl9tb2QpICUgYy0+c3JjX2luY3I7CisgICAgICAgICAgICBjLT5pbmRleCA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IGVuZF9pbmRleCA9ICgxTEwgKyBzcmNfc2l6ZSAtIGMtPmZpbHRlcl9sZW5ndGgpIDw8IGMtPnBoYXNlX3NoaWZ0OworICAgICAgICBpbnQ2NF90IGRlbHRhX2ZyYWMgPSAoZW5kX2luZGV4IC0gYy0+aW5kZXgpICogYy0+c3JjX2luY3IgLSBjLT5mcmFjOworICAgICAgICBpbnQgZGVsdGFfbiA9IChkZWx0YV9mcmFjICsgYy0+ZHN0X2luY3IgLSAxKSAvIGMtPmRzdF9pbmNyOworCisgICAgICAgIGRzdF9zaXplID0gRkZNSU4oZHN0X3NpemUsIGRlbHRhX24pOworICAgICAgICBpZiAoZHN0X3NpemUgPiAwKSB7CisgICAgICAgICAgICAqY29uc3VtZWQgPSBjLT5kc3AucmVzYW1wbGUoYywgZHN0LCBzcmMsIGRzdF9zaXplLCB1cGRhdGVfY3R4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpjb25zdW1lZCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZHN0X3NpemU7Cit9CisKK3N0YXRpYyBpbnQgbXVsdGlwbGVfcmVzYW1wbGUoUmVzYW1wbGVDb250ZXh0ICpjLCBBdWRpb0RhdGEgKmRzdCwgaW50IGRzdF9zaXplLCBBdWRpb0RhdGEgKnNyYywgaW50IHNyY19zaXplLCBpbnQgKmNvbnN1bWVkKXsKKyAgICBpbnQgaSwgcmV0PSAtMTsKKyAgICBpbnQgYXZfdW51c2VkIG1tX2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgIGludCBuZWVkX2VtbXMgPSBjLT5mb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQICYmIEFSQ0hfWDg2XzMyICYmCisgICAgICAgICAgICAgICAgICAgIChtbV9mbGFncyAmIChBVl9DUFVfRkxBR19NTVgyIHwgQVZfQ1BVX0ZMQUdfU1NFMikpID09IEFWX0NQVV9GTEFHX01NWDI7CisgICAgaW50NjRfdCBtYXhfc3JjX3NpemUgPSAoSU5UNjRfTUFYID4+IChjLT5waGFzZV9zaGlmdCsxKSkgLyBjLT5zcmNfaW5jcjsKKworICAgIGlmIChjLT5jb21wZW5zYXRpb25fZGlzdGFuY2UpCisgICAgICAgIGRzdF9zaXplID0gRkZNSU4oZHN0X3NpemUsIGMtPmNvbXBlbnNhdGlvbl9kaXN0YW5jZSk7CisgICAgc3JjX3NpemUgPSBGRk1JTihzcmNfc2l6ZSwgbWF4X3NyY19zaXplKTsKKworICAgIGZvcihpPTA7IGk8ZHN0LT5jaF9jb3VudDsgaSsrKXsKKyAgICAgICAgcmV0PSBzd3JpX3Jlc2FtcGxlKGMsIGRzdC0+Y2hbaV0sIHNyYy0+Y2hbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lZCwgc3JjX3NpemUsIGRzdF9zaXplLCBpKzE9PWRzdC0+Y2hfY291bnQpOworICAgIH0KKyAgICBpZihuZWVkX2VtbXMpCisgICAgICAgIGVtbXNfYygpOworCisgICAgaWYgKGMtPmNvbXBlbnNhdGlvbl9kaXN0YW5jZSkgeworICAgICAgICBjLT5jb21wZW5zYXRpb25fZGlzdGFuY2UgLT0gcmV0OworICAgICAgICBpZiAoIWMtPmNvbXBlbnNhdGlvbl9kaXN0YW5jZSkgeworICAgICAgICAgICAgYy0+ZHN0X2luY3IgICAgID0gYy0+aWRlYWxfZHN0X2luY3I7CisgICAgICAgICAgICBjLT5kc3RfaW5jcl9kaXYgPSBjLT5kc3RfaW5jciAvIGMtPnNyY19pbmNyOworICAgICAgICAgICAgYy0+ZHN0X2luY3JfbW9kID0gYy0+ZHN0X2luY3IgJSBjLT5zcmNfaW5jcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldF9kZWxheShzdHJ1Y3QgU3dyQ29udGV4dCAqcywgaW50NjRfdCBiYXNlKXsKKyAgICBSZXNhbXBsZUNvbnRleHQgKmMgPSBzLT5yZXNhbXBsZTsKKyAgICBpbnQ2NF90IG51bSA9IHMtPmluX2J1ZmZlcl9jb3VudCAtIChjLT5maWx0ZXJfbGVuZ3RoLTEpLzI7CisgICAgbnVtIDw8PSBjLT5waGFzZV9zaGlmdDsKKyAgICBudW0gLT0gYy0+aW5kZXg7CisgICAgbnVtICo9IGMtPnNyY19pbmNyOworICAgIG51bSAtPSBjLT5mcmFjOworICAgIHJldHVybiBhdl9yZXNjYWxlKG51bSwgYmFzZSwgcy0+aW5fc2FtcGxlX3JhdGUqKGludDY0X3QpYy0+c3JjX2luY3IgPDwgYy0+cGhhc2Vfc2hpZnQpOworfQorCitzdGF0aWMgaW50IHJlc2FtcGxlX2ZsdXNoKHN0cnVjdCBTd3JDb250ZXh0ICpzKSB7CisgICAgQXVkaW9EYXRhICphPSAmcy0+aW5fYnVmZmVyOworICAgIGludCBpLCBqLCByZXQ7CisgICAgaWYoKHJldCA9IHN3cmlfcmVhbGxvY19hdWRpbyhhLCBzLT5pbl9idWZmZXJfaW5kZXggKyAyKnMtPmluX2J1ZmZlcl9jb3VudCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBhdl9hc3NlcnQwKGEtPnBsYW5hcik7CisgICAgZm9yKGk9MDsgaTxhLT5jaF9jb3VudDsgaSsrKXsKKyAgICAgICAgZm9yKGo9MDsgajxzLT5pbl9idWZmZXJfY291bnQ7IGorKyl7CisgICAgICAgICAgICBtZW1jcHkoYS0+Y2hbaV0gKyAocy0+aW5fYnVmZmVyX2luZGV4K3MtPmluX2J1ZmZlcl9jb3VudCtqICApKmEtPmJwcywKKyAgICAgICAgICAgICAgICBhLT5jaFtpXSArIChzLT5pbl9idWZmZXJfaW5kZXgrcy0+aW5fYnVmZmVyX2NvdW50LWotMSkqYS0+YnBzLCBhLT5icHMpOworICAgICAgICB9CisgICAgfQorICAgIHMtPmluX2J1ZmZlcl9jb3VudCArPSAocy0+aW5fYnVmZmVyX2NvdW50KzEpLzI7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGluIGZhY3QgdGhlIHdob2xlIGhhbmRsZSBtdWx0aXBsZSByaWRpY3Vsb3VzbHkgc21hbGwgYnVmZmVycyBtaWdodCBuZWVkIG1vcmUgdGhpbmtpbmcuLi4KK3N0YXRpYyBpbnQgaW52ZXJ0X2luaXRpYWxfYnVmZmVyKFJlc2FtcGxlQ29udGV4dCAqYywgQXVkaW9EYXRhICpkc3QsIGNvbnN0IEF1ZGlvRGF0YSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluX2NvdW50LCBpbnQgKm91dF9pZHgsIGludCAqb3V0X3N6KQoreworICAgIGludCBuLCBjaCwgbnVtID0gRkZNSU4oaW5fY291bnQgKyAqb3V0X3N6LCBjLT5maWx0ZXJfbGVuZ3RoICsgMSksIHJlczsKKworICAgIGlmIChjLT5pbmRleCA+PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICgocmVzID0gc3dyaV9yZWFsbG9jX2F1ZGlvKGRzdCwgYy0+ZmlsdGVyX2xlbmd0aCAqIDIgKyAxKSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgLy8gY29weQorICAgIGZvciAobiA9ICpvdXRfc3o7IG4gPCBudW07IG4rKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzcmMtPmNoX2NvdW50OyBjaCsrKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0LT5jaFtjaF0gKyAoKGMtPmZpbHRlcl9sZW5ndGggKyBuKSAqIGMtPmZlbGVtX3NpemUpLAorICAgICAgICAgICAgICAgICAgIHNyYy0+Y2hbY2hdICsgKChuIC0gKm91dF9zeikgKiBjLT5mZWxlbV9zaXplKSwgYy0+ZmVsZW1fc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiBub3QgZW5vdWdoIGRhdGEgaXMgaW4sIHJldHVybiBhbmQgd2FpdCBmb3IgbW9yZQorICAgIGlmIChudW0gPCBjLT5maWx0ZXJfbGVuZ3RoICsgMSkgeworICAgICAgICAqb3V0X3N6ID0gbnVtOworICAgICAgICAqb3V0X2lkeCA9IGMtPmZpbHRlcl9sZW5ndGg7CisgICAgICAgIHJldHVybiBJTlRfTUFYOworICAgIH0KKworICAgIC8vIGVsc2UgaW52ZXJ0CisgICAgZm9yIChuID0gMTsgbiA8PSBjLT5maWx0ZXJfbGVuZ3RoOyBuKyspIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLT5jaF9jb3VudDsgY2grKykgeworICAgICAgICAgICAgbWVtY3B5KGRzdC0+Y2hbY2hdICsgKChjLT5maWx0ZXJfbGVuZ3RoIC0gbikgKiBjLT5mZWxlbV9zaXplKSwKKyAgICAgICAgICAgICAgICAgICBkc3QtPmNoW2NoXSArICgoYy0+ZmlsdGVyX2xlbmd0aCArIG4pICogYy0+ZmVsZW1fc2l6ZSksCisgICAgICAgICAgICAgICAgICAgYy0+ZmVsZW1fc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBudW0gLSAqb3V0X3N6OworICAgICpvdXRfaWR4ID0gYy0+ZmlsdGVyX2xlbmd0aCArIChjLT5pbmRleCA+PiBjLT5waGFzZV9zaGlmdCk7CisgICAgKm91dF9zeiA9IEZGTUFYKCpvdXRfc3ogKyBjLT5maWx0ZXJfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAxICsgYy0+ZmlsdGVyX2xlbmd0aCAqIDIpIC0gKm91dF9pZHg7CisgICAgYy0+aW5kZXggJj0gYy0+cGhhc2VfbWFzazsKKworICAgIHJldHVybiBGRk1BWChyZXMsIDApOworfQorCitzdHJ1Y3QgUmVzYW1wbGVyIGNvbnN0IHN3cmlfcmVzYW1wbGVyPXsKKyAgcmVzYW1wbGVfaW5pdCwKKyAgcmVzYW1wbGVfZnJlZSwKKyAgbXVsdGlwbGVfcmVzYW1wbGUsCisgIHJlc2FtcGxlX2ZsdXNoLAorICBzZXRfY29tcGVuc2F0aW9uLAorICBnZXRfZGVsYXksCisgIGludmVydF9pbml0aWFsX2J1ZmZlciwKK307CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9yZXNhbXBsZS5oIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvcmVzYW1wbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWE4OWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvcmVzYW1wbGUuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogYXVkaW8gcmVzYW1wbGluZworICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMTIgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBTV1JFU0FNUExFX1JFU0FNUExFX0gKKyNkZWZpbmUgU1dSRVNBTVBMRV9SRVNBTVBMRV9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorCisjaW5jbHVkZSAic3dyZXNhbXBsZV9pbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmF2X2NsYXNzOworICAgIHVpbnQ4X3QgKmZpbHRlcl9iYW5rOworICAgIGludCBmaWx0ZXJfbGVuZ3RoOworICAgIGludCBmaWx0ZXJfYWxsb2M7CisgICAgaW50IGlkZWFsX2RzdF9pbmNyOworICAgIGludCBkc3RfaW5jcjsKKyAgICBpbnQgZHN0X2luY3JfZGl2OworICAgIGludCBkc3RfaW5jcl9tb2Q7CisgICAgaW50IGluZGV4OworICAgIGludCBmcmFjOworICAgIGludCBzcmNfaW5jcjsKKyAgICBpbnQgY29tcGVuc2F0aW9uX2Rpc3RhbmNlOworICAgIGludCBwaGFzZV9zaGlmdDsKKyAgICBpbnQgcGhhc2VfbWFzazsKKyAgICBpbnQgbGluZWFyOworICAgIGVudW0gU3dyRmlsdGVyVHlwZSBmaWx0ZXJfdHlwZTsKKyAgICBpbnQga2Fpc2VyX2JldGE7CisgICAgZG91YmxlIGZhY3RvcjsKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGZvcm1hdDsKKyAgICBpbnQgZmVsZW1fc2l6ZTsKKyAgICBpbnQgZmlsdGVyX3NoaWZ0OworCisgICAgc3RydWN0IHsKKyAgICAgICAgdm9pZCAoKnJlc2FtcGxlX29uZSkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQ2NF90IGluZGV4LCBpbnQ2NF90IGluY3IpOworICAgICAgICBpbnQgKCpyZXNhbXBsZSkoc3RydWN0IFJlc2FtcGxlQ29udGV4dCAqYywgdm9pZCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjLCBpbnQgbiwgaW50IHVwZGF0ZV9jdHgpOworICAgIH0gZHNwOworfSBSZXNhbXBsZUNvbnRleHQ7CisKK3ZvaWQgc3dyaV9yZXNhbXBsZV9kc3BfaW5pdChSZXNhbXBsZUNvbnRleHQgKmMpOwordm9pZCBzd3JpX3Jlc2FtcGxlX2RzcF94ODZfaW5pdChSZXNhbXBsZUNvbnRleHQgKmMpOworCisjZW5kaWYgLyogU1dSRVNBTVBMRV9SRVNBTVBMRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9yZXNhbXBsZV9kc3AuYyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3Jlc2FtcGxlX2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTFiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9yZXNhbXBsZV9kc3AuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogYXVkaW8gcmVzYW1wbGluZworICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMTIgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogYXVkaW8gcmVzYW1wbGluZworICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlICJyZXNhbXBsZS5oIgorCisjZGVmaW5lIFRFTVBMQVRFX1JFU0FNUExFX1MxNgorI2luY2x1ZGUgInJlc2FtcGxlX3RlbXBsYXRlLmMiCisjdW5kZWYgVEVNUExBVEVfUkVTQU1QTEVfUzE2CisKKyNkZWZpbmUgVEVNUExBVEVfUkVTQU1QTEVfUzMyCisjaW5jbHVkZSAicmVzYW1wbGVfdGVtcGxhdGUuYyIKKyN1bmRlZiBURU1QTEFURV9SRVNBTVBMRV9TMzIKKworI2RlZmluZSBURU1QTEFURV9SRVNBTVBMRV9GTFQKKyNpbmNsdWRlICJyZXNhbXBsZV90ZW1wbGF0ZS5jIgorI3VuZGVmIFRFTVBMQVRFX1JFU0FNUExFX0ZMVAorCisjZGVmaW5lIFRFTVBMQVRFX1JFU0FNUExFX0RCTAorI2luY2x1ZGUgInJlc2FtcGxlX3RlbXBsYXRlLmMiCisjdW5kZWYgVEVNUExBVEVfUkVTQU1QTEVfREJMCisKK3ZvaWQgc3dyaV9yZXNhbXBsZV9kc3BfaW5pdChSZXNhbXBsZUNvbnRleHQgKmMpCit7CisgICAgc3dpdGNoKGMtPmZvcm1hdCl7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNlA6CisgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9vbmUgPSByZXNhbXBsZV9vbmVfaW50MTY7CisgICAgICAgIGMtPmRzcC5yZXNhbXBsZSAgICAgPSBjLT5saW5lYXIgPyByZXNhbXBsZV9saW5lYXJfaW50MTYgOiByZXNhbXBsZV9jb21tb25faW50MTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzJQOgorICAgICAgICBjLT5kc3AucmVzYW1wbGVfb25lID0gcmVzYW1wbGVfb25lX2ludDMyOworICAgICAgICBjLT5kc3AucmVzYW1wbGUgICAgID0gYy0+bGluZWFyID8gcmVzYW1wbGVfbGluZWFyX2ludDMyIDogcmVzYW1wbGVfY29tbW9uX2ludDMyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUUDoKKyAgICAgICAgYy0+ZHNwLnJlc2FtcGxlX29uZSA9IHJlc2FtcGxlX29uZV9mbG9hdDsKKyAgICAgICAgYy0+ZHNwLnJlc2FtcGxlICAgICA9IGMtPmxpbmVhciA/IHJlc2FtcGxlX2xpbmVhcl9mbG9hdCA6IHJlc2FtcGxlX2NvbW1vbl9mbG9hdDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTFA6CisgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9vbmUgPSByZXNhbXBsZV9vbmVfZG91YmxlOworICAgICAgICBjLT5kc3AucmVzYW1wbGUgICAgID0gYy0+bGluZWFyID8gcmVzYW1wbGVfbGluZWFyX2RvdWJsZSA6IHJlc2FtcGxlX2NvbW1vbl9kb3VibGU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChBUkNIX1g4Nikgc3dyaV9yZXNhbXBsZV9kc3BfeDg2X2luaXQoYyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9yZXNhbXBsZV90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvcmVzYW1wbGVfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjliMTljCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvcmVzYW1wbGVfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIGF1ZGlvIHJlc2FtcGxpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDEyIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGF1ZGlvIHJlc2FtcGxpbmcKKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjaWYgZGVmaW5lZChURU1QTEFURV9SRVNBTVBMRV9EQkwpCisKKyMgICAgZGVmaW5lIFJFTkFNRShOKSBOICMjIF9kb3VibGUKKyMgICAgZGVmaW5lIEZJTFRFUl9TSElGVCAwCisjICAgIGRlZmluZSBERUxFTSAgZG91YmxlCisjICAgIGRlZmluZSBGRUxFTSAgZG91YmxlCisjICAgIGRlZmluZSBGRUxFTTIgZG91YmxlCisjICAgIGRlZmluZSBPVVQoZCwgdikgZCA9IHYKKworI2VsaWYgICAgZGVmaW5lZChURU1QTEFURV9SRVNBTVBMRV9GTFQpCisKKyMgICAgZGVmaW5lIFJFTkFNRShOKSBOICMjIF9mbG9hdAorIyAgICBkZWZpbmUgRklMVEVSX1NISUZUIDAKKyMgICAgZGVmaW5lIERFTEVNICBmbG9hdAorIyAgICBkZWZpbmUgRkVMRU0gIGZsb2F0CisjICAgIGRlZmluZSBGRUxFTTIgZmxvYXQKKyMgICAgZGVmaW5lIE9VVChkLCB2KSBkID0gdgorCisjZWxpZiBkZWZpbmVkKFRFTVBMQVRFX1JFU0FNUExFX1MzMikKKworIyAgICBkZWZpbmUgUkVOQU1FKE4pIE4gIyMgX2ludDMyCisjICAgIGRlZmluZSBGSUxURVJfU0hJRlQgMzAKKyMgICAgZGVmaW5lIERFTEVNICBpbnQzMl90CisjICAgIGRlZmluZSBGRUxFTSAgaW50MzJfdAorIyAgICBkZWZpbmUgRkVMRU0yIGludDY0X3QKKyMgICAgZGVmaW5lIEZFTEVNX01BWCBJTlQzMl9NQVgKKyMgICAgZGVmaW5lIEZFTEVNX01JTiBJTlQzMl9NSU4KKyMgICAgZGVmaW5lIE9VVChkLCB2KSB2ID0gKHYgKyAoMTw8KEZJTFRFUl9TSElGVC0xKSkpPj5GSUxURVJfU0hJRlQ7XAorICAgICAgICAgICAgICAgICAgICAgIGQgPSAodWludDY0X3QpKHYgKyAweDgwMDAwMDAwKSA+IDB4RkZGRkZGRkYgPyAodj4+NjMpIF4gMHg3RkZGRkZGRiA6IHYKKworI2VsaWYgICAgZGVmaW5lZChURU1QTEFURV9SRVNBTVBMRV9TMTYpCisKKyMgICAgZGVmaW5lIFJFTkFNRShOKSBOICMjIF9pbnQxNgorIyAgICBkZWZpbmUgRklMVEVSX1NISUZUIDE1CisjICAgIGRlZmluZSBERUxFTSAgaW50MTZfdAorIyAgICBkZWZpbmUgRkVMRU0gIGludDE2X3QKKyMgICAgZGVmaW5lIEZFTEVNMiBpbnQzMl90CisjICAgIGRlZmluZSBGRUxFTUwgaW50NjRfdAorIyAgICBkZWZpbmUgRkVMRU1fTUFYIElOVDE2X01BWAorIyAgICBkZWZpbmUgRkVMRU1fTUlOIElOVDE2X01JTgorIyAgICBkZWZpbmUgT1VUKGQsIHYpIHYgPSAodiArICgxPDwoRklMVEVSX1NISUZULTEpKSk+PkZJTFRFUl9TSElGVDtcCisgICAgICAgICAgICAgICAgICAgICAgZCA9ICh1bnNpZ25lZCkodiArIDMyNzY4KSA+IDY1NTM1ID8gKHY+PjMxKSBeIDMyNzY3IDogdgorCisjZW5kaWYKKworc3RhdGljIHZvaWQgUkVOQU1FKHJlc2FtcGxlX29uZSkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zaXplLCBpbnQ2NF90IGluZGV4MiwgaW50NjRfdCBpbmNyKQoreworICAgIERFTEVNICpkc3QgPSBkZXN0OworICAgIGNvbnN0IERFTEVNICpzcmMgPSBzb3VyY2U7CisgICAgaW50IGRzdF9pbmRleDsKKworICAgIGZvciAoZHN0X2luZGV4ID0gMDsgZHN0X2luZGV4IDwgZHN0X3NpemU7IGRzdF9pbmRleCsrKSB7CisgICAgICAgIGRzdFtkc3RfaW5kZXhdID0gc3JjW2luZGV4MiA+PiAzMl07CisgICAgICAgIGluZGV4MiArPSBpbmNyOworICAgIH0KK30KKworc3RhdGljIGludCBSRU5BTUUocmVzYW1wbGVfY29tbW9uKShSZXNhbXBsZUNvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCB1cGRhdGVfY3R4KQoreworICAgIERFTEVNICpkc3QgPSBkZXN0OworICAgIGNvbnN0IERFTEVNICpzcmMgPSBzb3VyY2U7CisgICAgaW50IGRzdF9pbmRleDsKKyAgICBpbnQgaW5kZXg9IGMtPmluZGV4OworICAgIGludCBmcmFjPSBjLT5mcmFjOworICAgIGludCBzYW1wbGVfaW5kZXggPSBpbmRleCA+PiBjLT5waGFzZV9zaGlmdDsKKworICAgIGluZGV4ICY9IGMtPnBoYXNlX21hc2s7CisgICAgZm9yIChkc3RfaW5kZXggPSAwOyBkc3RfaW5kZXggPCBuOyBkc3RfaW5kZXgrKykgeworICAgICAgICBGRUxFTSAqZmlsdGVyID0gKChGRUxFTSAqKSBjLT5maWx0ZXJfYmFuaykgKyBjLT5maWx0ZXJfYWxsb2MgKiBpbmRleDsKKworICAgICAgICBGRUxFTTIgdmFsPTA7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+ZmlsdGVyX2xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB2YWwgKz0gc3JjW3NhbXBsZV9pbmRleCArIGldICogKEZFTEVNMilmaWx0ZXJbaV07CisgICAgICAgIH0KKyAgICAgICAgT1VUKGRzdFtkc3RfaW5kZXhdLCB2YWwpOworCisgICAgICAgIGZyYWMgICs9IGMtPmRzdF9pbmNyX21vZDsKKyAgICAgICAgaW5kZXggKz0gYy0+ZHN0X2luY3JfZGl2OworICAgICAgICBpZiAoZnJhYyA+PSBjLT5zcmNfaW5jcikgeworICAgICAgICAgICAgZnJhYyAtPSBjLT5zcmNfaW5jcjsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgc2FtcGxlX2luZGV4ICs9IGluZGV4ID4+IGMtPnBoYXNlX3NoaWZ0OworICAgICAgICBpbmRleCAmPSBjLT5waGFzZV9tYXNrOworICAgIH0KKworICAgIGlmKHVwZGF0ZV9jdHgpeworICAgICAgICBjLT5mcmFjPSBmcmFjOworICAgICAgICBjLT5pbmRleD0gaW5kZXg7CisgICAgfQorCisgICAgcmV0dXJuIHNhbXBsZV9pbmRleDsKK30KKworc3RhdGljIGludCBSRU5BTUUocmVzYW1wbGVfbGluZWFyKShSZXNhbXBsZUNvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCB1cGRhdGVfY3R4KQoreworICAgIERFTEVNICpkc3QgPSBkZXN0OworICAgIGNvbnN0IERFTEVNICpzcmMgPSBzb3VyY2U7CisgICAgaW50IGRzdF9pbmRleDsKKyAgICBpbnQgaW5kZXg9IGMtPmluZGV4OworICAgIGludCBmcmFjPSBjLT5mcmFjOworICAgIGludCBzYW1wbGVfaW5kZXggPSBpbmRleCA+PiBjLT5waGFzZV9zaGlmdDsKKyNpZiBGSUxURVJfU0hJRlQgPT0gMAorICAgIGRvdWJsZSBpbnZfc3JjX2luY3IgPSAxLjAgLyBjLT5zcmNfaW5jcjsKKyNlbmRpZgorCisgICAgaW5kZXggJj0gYy0+cGhhc2VfbWFzazsKKyAgICBmb3IgKGRzdF9pbmRleCA9IDA7IGRzdF9pbmRleCA8IG47IGRzdF9pbmRleCsrKSB7CisgICAgICAgIEZFTEVNICpmaWx0ZXIgPSAoKEZFTEVNICopIGMtPmZpbHRlcl9iYW5rKSArIGMtPmZpbHRlcl9hbGxvYyAqIGluZGV4OworICAgICAgICBGRUxFTTIgdmFsPTAsIHYyID0gMDsKKworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPmZpbHRlcl9sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdmFsICs9IHNyY1tzYW1wbGVfaW5kZXggKyBpXSAqIChGRUxFTTIpZmlsdGVyW2ldOworICAgICAgICAgICAgdjIgICs9IHNyY1tzYW1wbGVfaW5kZXggKyBpXSAqIChGRUxFTTIpZmlsdGVyW2kgKyBjLT5maWx0ZXJfYWxsb2NdOworICAgICAgICB9CisjaWZkZWYgRkVMRU1MCisgICAgICAgIHZhbCArPSAodjIgLSB2YWwpICogKEZFTEVNTCkgZnJhYyAvIGMtPnNyY19pbmNyOworI2Vsc2UKKyMgICAgaWYgRklMVEVSX1NISUZUID09IDAKKyAgICAgICAgdmFsICs9ICh2MiAtIHZhbCkgKiBpbnZfc3JjX2luY3IgKiBmcmFjOworIyAgICBlbHNlCisgICAgICAgIHZhbCArPSAodjIgLSB2YWwpIC8gYy0+c3JjX2luY3IgKiBmcmFjOworIyAgICBlbmRpZgorI2VuZGlmCisgICAgICAgIE9VVChkc3RbZHN0X2luZGV4XSwgdmFsKTsKKworICAgICAgICBmcmFjICs9IGMtPmRzdF9pbmNyX21vZDsKKyAgICAgICAgaW5kZXggKz0gYy0+ZHN0X2luY3JfZGl2OworICAgICAgICBpZiAoZnJhYyA+PSBjLT5zcmNfaW5jcikgeworICAgICAgICAgICAgZnJhYyAtPSBjLT5zcmNfaW5jcjsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgc2FtcGxlX2luZGV4ICs9IGluZGV4ID4+IGMtPnBoYXNlX3NoaWZ0OworICAgICAgICBpbmRleCAmPSBjLT5waGFzZV9tYXNrOworICAgIH0KKworICAgIGlmKHVwZGF0ZV9jdHgpeworICAgICAgICBjLT5mcmFjPSBmcmFjOworICAgICAgICBjLT5pbmRleD0gaW5kZXg7CisgICAgfQorCisgICAgcmV0dXJuIHNhbXBsZV9pbmRleDsKK30KKworI3VuZGVmIFJFTkFNRQorI3VuZGVmIEZJTFRFUl9TSElGVAorI3VuZGVmIERFTEVNCisjdW5kZWYgRkVMRU0KKyN1bmRlZiBGRUxFTTIKKyN1bmRlZiBGRUxFTUwKKyN1bmRlZiBGRUxFTV9NQVgKKyN1bmRlZiBGRUxFTV9NSU4KKyN1bmRlZiBPVVQKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3NveHJfcmVzYW1wbGUuYyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3NveHJfcmVzYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjQ0NTFkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvc294cl9yZXNhbXBsZS5jCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogYXVkaW8gcmVzYW1wbGluZyB3aXRoIHNveHIKKyAqIENvcHlyaWdodCAoYykgMjAxMiBSb2IgU3lrZXMgPHJvYnNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBhdWRpbyByZXNhbXBsaW5nIHdpdGggc294cgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAic3dyZXNhbXBsZV9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8c294ci5oPgorCitzdGF0aWMgc3RydWN0IFJlc2FtcGxlQ29udGV4dCAqY3JlYXRlKHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKmMsIGludCBvdXRfcmF0ZSwgaW50IGluX3JhdGUsIGludCBmaWx0ZXJfc2l6ZSwgaW50IHBoYXNlX3NoaWZ0LCBpbnQgbGluZWFyLAorICAgICAgICBkb3VibGUgY3V0b2ZmLCBlbnVtIEFWU2FtcGxlRm9ybWF0IGZvcm1hdCwgZW51bSBTd3JGaWx0ZXJUeXBlIGZpbHRlcl90eXBlLCBpbnQga2Fpc2VyX2JldGEsIGRvdWJsZSBwcmVjaXNpb24sIGludCBjaGVieSl7CisgICAgc294cl9lcnJvcl90IGVycm9yOworCisgICAgc294cl9kYXRhdHlwZV90IHR5cGUgPQorICAgICAgICBmb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQPyBTT1hSX0lOVDE2X1MgOgorICAgICAgICBmb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9TMTYgPyBTT1hSX0lOVDE2X0kgOgorICAgICAgICBmb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9TMzJQPyBTT1hSX0lOVDMyX1MgOgorICAgICAgICBmb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIgPyBTT1hSX0lOVDMyX0kgOgorICAgICAgICBmb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQPyBTT1hSX0ZMT0FUMzJfUyA6CisgICAgICAgIGZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCA/IFNPWFJfRkxPQVQzMl9JIDoKKyAgICAgICAgZm9ybWF0ID09IEFWX1NBTVBMRV9GTVRfREJMUD8gU09YUl9GTE9BVDY0X1MgOgorICAgICAgICBmb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9EQkwgPyBTT1hSX0ZMT0FUNjRfSSA6IChzb3hyX2RhdGF0eXBlX3QpLTE7CisKKyAgICBzb3hyX2lvX3NwZWNfdCBpb19zcGVjID0gc294cl9pb19zcGVjKHR5cGUsIHR5cGUpOworCisgICAgc294cl9xdWFsaXR5X3NwZWNfdCBxX3NwZWMgPSBzb3hyX3F1YWxpdHlfc3BlYygoaW50KSgocHJlY2lzaW9uLTIpLzQpLCAoU09YUl9ISV9QUkVDX0NMT0NLfFNPWFJfUk9MTE9GRl9OT05FKSohIWNoZWJ5KTsKKyAgICBxX3NwZWMucHJlY2lzaW9uID0gbGluZWFyPyAwIDogcHJlY2lzaW9uOworI2lmICFkZWZpbmVkIFNPWFJfVkVSU0lPTiAvKiBEZXByZWNhdGVkIEAgTWFyY2ggMjAxMzogKi8KKyAgICBxX3NwZWMuYndfcGMgPSBjdXRvZmY/IEZGTUFYKEZGTUlOKGN1dG9mZiwuOTk1KSwuOCkqMTAwIDogcV9zcGVjLmJ3X3BjOworI2Vsc2UKKyAgICBxX3NwZWMucGFzc2JhbmRfZW5kID0gY3V0b2ZmPyBGRk1BWChGRk1JTihjdXRvZmYsLjk5NSksLjgpIDogcV9zcGVjLnBhc3NiYW5kX2VuZDsKKyNlbmRpZgorCisgICAgc294cl9kZWxldGUoKHNveHJfdCljKTsKKyAgICBjID0gKHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKikKKyAgICAgICAgc294cl9jcmVhdGUoaW5fcmF0ZSwgb3V0X3JhdGUsIDAsICZlcnJvciwgJmlvX3NwZWMsICZxX3NwZWMsIDApOworICAgIGlmICghYykKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInNveHJfY3JlYXRlOiAlc1xuIiwgZXJyb3IpOworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95KHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKiAqYyl7CisgICAgc294cl9kZWxldGUoKHNveHJfdCkqYyk7CisgICAgKmMgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGZsdXNoKHN0cnVjdCBTd3JDb250ZXh0ICpzKXsKKyAgICBzb3hyX3Byb2Nlc3MoKHNveHJfdClzLT5yZXNhbXBsZSwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgMCwgTlVMTCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2VzcygKKyAgICAgICAgc3RydWN0IFJlc2FtcGxlQ29udGV4dCAqIGMsIEF1ZGlvRGF0YSAqZHN0LCBpbnQgZHN0X3NpemUsCisgICAgICAgIEF1ZGlvRGF0YSAqc3JjLCBpbnQgc3JjX3NpemUsIGludCAqY29uc3VtZWQpeworICAgIHNpemVfdCBpZG9uZSwgb2RvbmU7CisgICAgc294cl9lcnJvcl90IGVycm9yID0gc294cl9zZXRfZXJyb3IoKHNveHJfdCljLCBzb3hyX3NldF9udW1fY2hhbm5lbHMoKHNveHJfdCljLCBzcmMtPmNoX2NvdW50KSk7CisgICAgZXJyb3IgPSBzb3hyX3Byb2Nlc3MoKHNveHJfdCljLCBzcmMtPmNoLCAoc2l6ZV90KXNyY19zaXplLAorICAgICAgICAgICAgJmlkb25lLCBkc3QtPmNoLCAoc2l6ZV90KWRzdF9zaXplLCAmb2RvbmUpOworICAgICpjb25zdW1lZCA9IChpbnQpaWRvbmU7CisgICAgcmV0dXJuIGVycm9yPyAtMSA6IG9kb25lOworfQorCitzdGF0aWMgaW50NjRfdCBnZXRfZGVsYXkoc3RydWN0IFN3ckNvbnRleHQgKnMsIGludDY0X3QgYmFzZSl7CisgICAgZG91YmxlIGRlbGF5X3MgPSBzb3hyX2RlbGF5KChzb3hyX3Qpcy0+cmVzYW1wbGUpIC8gcy0+b3V0X3NhbXBsZV9yYXRlOworICAgIHJldHVybiAoaW50NjRfdCkoZGVsYXlfcyAqIGJhc2UgKyAuNSk7Cit9CisKK3N0YXRpYyBpbnQgaW52ZXJ0X2luaXRpYWxfYnVmZmVyKHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKmMsIEF1ZGlvRGF0YSAqZHN0LCBjb25zdCBBdWRpb0RhdGEgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl9jb3VudCwgaW50ICpvdXRfaWR4LCBpbnQgKm91dF9zeikKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RydWN0IFJlc2FtcGxlciBjb25zdCBzb3hyX3Jlc2FtcGxlcj17CisgICAgY3JlYXRlLCBkZXN0cm95LCBwcm9jZXNzLCBmbHVzaCwgTlVMTCAvKiBzZXRfY29tcGVuc2F0aW9uICovLCBnZXRfZGVsYXksCisgICAgaW52ZXJ0X2luaXRpYWxfYnVmZmVyLAorfTsKKwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS10ZXN0LmMgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE2MmNkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS10ZXN0LmMKQEAgLTAsMCArMSw0MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyIChtaWNoYWVsbmlAZ214LmF0KQorICogQ29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYnN3cmVzYW1wbGUKKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBsaWJzd3Jlc2FtcGxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAic3dyZXNhbXBsZS5oIgorCisjdW5kZWYgdGltZQorI2luY2x1ZGUgInRpbWUuaCIKKyN1bmRlZiBmcHJpbnRmCisKKyNkZWZpbmUgU0FNUExFUyAxMDAwCisKKyNkZWZpbmUgU1dSX0NIX01BWCAzMgorCisjZGVmaW5lIEFTU0VSVF9MRVZFTCAyCisKK3N0YXRpYyBkb3VibGUgZ2V0KHVpbnQ4X3QgKmFbXSwgaW50IGNoLCBpbnQgaW5kZXgsIGludCBjaF9jb3VudCwgZW51bSBBVlNhbXBsZUZvcm1hdCBmKXsKKyAgICBjb25zdCB1aW50OF90ICpwOworICAgIGlmKGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGYpKXsKKyAgICAgICAgZj0gYXZfZ2V0X2FsdF9zYW1wbGVfZm10KGYsIDApOworICAgICAgICBwPSBhW2NoXTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcD0gYVswXTsKKyAgICAgICAgaW5kZXg9IGNoICsgaW5kZXgqY2hfY291bnQ7CisgICAgfQorCisgICAgc3dpdGNoKGYpeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9VOCA6IHJldHVybiAoKGNvbnN0IHVpbnQ4X3QqKXApW2luZGV4XS8xMjcuMC0xLjA7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNjogcmV0dXJuICgoY29uc3QgaW50MTZfdCopcClbaW5kZXhdLzMyNzY3LjA7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMjogcmV0dXJuICgoY29uc3QgaW50MzJfdCopcClbaW5kZXhdLzIxNDc0ODM2NDcuMDsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUOiByZXR1cm4gKChjb25zdCBmbG9hdCAgKilwKVtpbmRleF07CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTDogcmV0dXJuICgoY29uc3QgZG91YmxlICopcClbaW5kZXhdOworICAgIGRlZmF1bHQ6IGF2X2Fzc2VydDAoMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCAgc2V0KHVpbnQ4X3QgKmFbXSwgaW50IGNoLCBpbnQgaW5kZXgsIGludCBjaF9jb3VudCwgZW51bSBBVlNhbXBsZUZvcm1hdCBmLCBkb3VibGUgdil7CisgICAgdWludDhfdCAqcDsKKyAgICBpZihhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihmKSl7CisgICAgICAgIGY9IGF2X2dldF9hbHRfc2FtcGxlX2ZtdChmLCAwKTsKKyAgICAgICAgcD0gYVtjaF07CisgICAgfWVsc2V7CisgICAgICAgIHA9IGFbMF07CisgICAgICAgIGluZGV4PSBjaCArIGluZGV4KmNoX2NvdW50OworICAgIH0KKyAgICBzd2l0Y2goZil7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1U4IDogKCh1aW50OF90KilwKVtpbmRleF09IGF2X2NsaXBfdWludDggKGxyaW50KCh2KzEuMCkqMTI3KSk7ICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2OiAoKGludDE2X3QqKXApW2luZGV4XT0gYXZfY2xpcF9pbnQxNiAobHJpbnQodiozMjc2NykpOyAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzI6ICgoaW50MzJfdCopcClbaW5kZXhdPSBhdl9jbGlwbF9pbnQzMihsbHJpbnQodioyMTQ3NDgzNjQ3KSk7ICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVDogKChmbG9hdCAgKilwKVtpbmRleF09IHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMOiAoKGRvdWJsZSAqKXApW2luZGV4XT0gdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IGF2X2Fzc2VydDIoMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzaGlmdCh1aW50OF90ICphW10sIGludCBpbmRleCwgaW50IGNoX2NvdW50LCBlbnVtIEFWU2FtcGxlRm9ybWF0IGYpeworICAgIGludCBjaDsKKworICAgIGlmKGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGYpKXsKKyAgICAgICAgZj0gYXZfZ2V0X2FsdF9zYW1wbGVfZm10KGYsIDApOworICAgICAgICBmb3IoY2g9IDA7IGNoPGNoX2NvdW50OyBjaCsrKQorICAgICAgICAgICAgYVtjaF0gKz0gaW5kZXgqYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoZik7CisgICAgfWVsc2V7CisgICAgICAgIGFbMF0gKz0gaW5kZXgqY2hfY291bnQqYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoZik7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBmb3JtYXRzW10gPSB7CisgICAgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgIEFWX1NBTVBMRV9GTVRfUzE2UCwKKyAgICBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICBBVl9TQU1QTEVfRk1UX1MzMlAsCisgICAgQVZfU0FNUExFX0ZNVF9TMzIsCisgICAgQVZfU0FNUExFX0ZNVF9VOFAsCisgICAgQVZfU0FNUExFX0ZNVF9VOCwKKyAgICBBVl9TQU1QTEVfRk1UX0RCTFAsCisgICAgQVZfU0FNUExFX0ZNVF9EQkwsCit9OworCitzdGF0aWMgY29uc3QgaW50IHJhdGVzW10gPSB7CisgICAgODAwMCwKKyAgICAxMTAyNSwKKyAgICAxNjAwMCwKKyAgICAyMjA1MCwKKyAgICAzMjAwMCwKKyAgICA0ODAwMCwKK307CisKK3VpbnQ2NF90IGxheW91dHNbXT17CisgICAgQVZfQ0hfTEFZT1VUX01PTk8gICAgICAgICAgICAgICAgICAgICwKKyAgICBBVl9DSF9MQVlPVVRfU1RFUkVPICAgICAgICAgICAgICAgICAgLAorICAgIEFWX0NIX0xBWU9VVF8yXzEgICAgICAgICAgICAgICAgICAgICAsCisgICAgQVZfQ0hfTEFZT1VUX1NVUlJPVU5EICAgICAgICAgICAgICAgICwKKyAgICBBVl9DSF9MQVlPVVRfNFBPSU5UMCAgICAgICAgICAgICAgICAgLAorICAgIEFWX0NIX0xBWU9VVF8yXzIgICAgICAgICAgICAgICAgICAgICAsCisgICAgQVZfQ0hfTEFZT1VUX1FVQUQgICAgICAgICAgICAgICAgICAgICwKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMCAgICAgICAgICAgICAgICAgLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxICAgICAgICAgICAgICAgICAsCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDBfQkFDSyAgICAgICAgICAgICwKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLICAgICAgICAgICAgLAorICAgIEFWX0NIX0xBWU9VVF83UE9JTlQwICAgICAgICAgICAgICAgICAsCisgICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDEgICAgICAgICAgICAgICAgICwKKyAgICBBVl9DSF9MQVlPVVRfN1BPSU5UMV9XSURFICAgICAgICAgICAgLAorfTsKKworc3RhdGljIHZvaWQgc2V0dXBfYXJyYXkodWludDhfdCAqb3V0W1NXUl9DSF9NQVhdLCB1aW50OF90ICppbiwgZW51bSBBVlNhbXBsZUZvcm1hdCBmb3JtYXQsIGludCBzYW1wbGVzKXsKKyAgICBpZihhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihmb3JtYXQpKXsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBwbGFuZV9zaXplPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQmMHhGRikqc2FtcGxlczsKKyAgICAgICAgZm9ybWF0Jj0weEZGOworICAgICAgICBmb3IoaT0wOyBpPFNXUl9DSF9NQVg7IGkrKyl7CisgICAgICAgICAgICBvdXRbaV09IGluICsgaSpwbGFuZV9zaXplOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIG91dFswXT0gaW47CisgICAgfQorfQorCitzdGF0aWMgaW50IGNtcChjb25zdCBpbnQgKmEsIGNvbnN0IGludCAqYil7CisgICAgcmV0dXJuICphIC0gKmI7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvZ2VuKHZvaWQgKmRhdGEsIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywgaW50IHNhbXBsZV9yYXRlLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgY2gsIGs7CisgICAgZG91YmxlIHYsIGYsIGEsIGFtcGE7CisgICAgZG91YmxlIHRhYmYxW1NXUl9DSF9NQVhdOworICAgIGRvdWJsZSB0YWJmMltTV1JfQ0hfTUFYXTsKKyAgICBkb3VibGUgdGFiYVtTV1JfQ0hfTUFYXTsKKyAgICB1bnNpZ25lZCBzdGF0aWMgcm5kOworCisjZGVmaW5lIFBVVF9TQU1QTEUgc2V0KGRhdGEsIGNoLCBrLCBjaGFubmVscywgc2FtcGxlX2ZtdCwgdik7CisjZGVmaW5lIHVpbnRfcmFuZCh4KSAoeCA9IHggKiAxNjY0NTI1ICsgMTAxMzkwNDIyMykKKyNkZWZpbmUgZGJsX3JhbmQoeCkgKHVpbnRfcmFuZCh4KSoyLjAgLyAoZG91YmxlKVVJTlRfTUFYIC0gMSkKKyAgICBrID0gMDsKKworICAgIC8qIDEgc2Vjb25kIG9mIHNpbmdsZSBmcmVxIHNpbnVzIGF0IDEwMDAgSHogKi8KKyAgICBhID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMSAqIHNhbXBsZV9yYXRlICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgeworICAgICAgICB2ID0gc2luKGEpICogMC4zMDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBQVVRfU0FNUExFCisgICAgICAgIGEgKz0gTV9QSSAqIDEwMDAuMCAqIDIuMCAvIHNhbXBsZV9yYXRlOworICAgIH0KKworICAgIC8qIDEgc2Vjb25kIG9mIHZhcnlpbmcgZnJlcXVlbmN5IGJldHdlZW4gMTAwIGFuZCAxMDAwMCBIeiAqLworICAgIGEgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAxICogc2FtcGxlX3JhdGUgJiYgayA8IG5iX3NhbXBsZXM7IGkrKywgaysrKSB7CisgICAgICAgIHYgPSBzaW4oYSkgKiAwLjMwOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIFBVVF9TQU1QTEUKKyAgICAgICAgZiAgPSAxMDAuMCArICgoKDEwMDAwLjAgLSAxMDAuMCkgKiBpKSAvIHNhbXBsZV9yYXRlKTsKKyAgICAgICAgYSArPSBNX1BJICogZiAqIDIuMCAvIHNhbXBsZV9yYXRlOworICAgIH0KKworICAgIC8qIDAuNSBzZWNvbmQgb2YgbG93IGFtcGxpdHVkZSB3aGl0ZSBub2lzZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVfcmF0ZSAvIDIgJiYgayA8IG5iX3NhbXBsZXM7IGkrKywgaysrKSB7CisgICAgICAgIHYgPSBkYmxfcmFuZChybmQpICogMC4zMDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBQVVRfU0FNUExFCisgICAgfQorCisgICAgLyogMC41IHNlY29uZCBvZiBoaWdoIGFtcGxpdHVkZSB3aGl0ZSBub2lzZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVfcmF0ZSAvIDIgJiYgayA8IG5iX3NhbXBsZXM7IGkrKywgaysrKSB7CisgICAgICAgIHYgPSBkYmxfcmFuZChybmQpOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIFBVVF9TQU1QTEUKKyAgICB9CisKKyAgICAvKiAxIHNlY29uZCBvZiB1bnJlbGF0ZWQgcmFtcHMgZm9yIGVhY2ggY2hhbm5lbCAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIHRhYmFbY2hdICA9IDA7CisgICAgICAgIHRhYmYxW2NoXSA9IDEwMCArIHVpbnRfcmFuZChybmQpICUgNTAwMDsKKyAgICAgICAgdGFiZjJbY2hdID0gMTAwICsgdWludF9yYW5kKHJuZCkgJSA1MDAwOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMSAqIHNhbXBsZV9yYXRlICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgdiA9IHNpbih0YWJhW2NoXSkgKiAwLjMwOworICAgICAgICAgICAgUFVUX1NBTVBMRQorICAgICAgICAgICAgZiA9IHRhYmYxW2NoXSArICgoKHRhYmYyW2NoXSAtIHRhYmYxW2NoXSkgKiBpKSAvIHNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIHRhYmFbY2hdICs9IE1fUEkgKiBmICogMi4wIC8gc2FtcGxlX3JhdGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAyIHNlY29uZHMgb2YgNTAwIEh6IHdpdGggdmFyeWluZyB2b2x1bWUgKi8KKyAgICBhICAgID0gMDsKKyAgICBhbXBhID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMiAqIHNhbXBsZV9yYXRlICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgZG91YmxlIGFtcCA9ICgxLjAgKyBzaW4oYW1wYSkpICogMC4xNTsKKyAgICAgICAgICAgIGlmIChjaCAmIDEpCisgICAgICAgICAgICAgICAgYW1wID0gMC4zMCAtIGFtcDsKKyAgICAgICAgICAgIHYgPSBzaW4oYSkgKiBhbXA7CisgICAgICAgICAgICBQVVRfU0FNUExFCisgICAgICAgICAgICBhICAgICs9IE1fUEkgKiA1MDAuMCAqIDIuMCAvIHNhbXBsZV9yYXRlOworICAgICAgICAgICAgYW1wYSArPSBNX1BJICogIDIuMCAvIHNhbXBsZV9yYXRlOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpeworICAgIGludCBpbl9zYW1wbGVfcmF0ZSwgb3V0X3NhbXBsZV9yYXRlLCBjaCAsaSwgZmx1c2hfY291bnQ7CisgICAgdWludDY0X3QgaW5fY2hfbGF5b3V0LCBvdXRfY2hfbGF5b3V0OworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW5fc2FtcGxlX2ZtdCwgb3V0X3NhbXBsZV9mbXQ7CisgICAgdWludDhfdCBhcnJheV9pbltTQU1QTEVTKjgqOF07CisgICAgdWludDhfdCBhcnJheV9taWRbU0FNUExFUyo4KjgqM107CisgICAgdWludDhfdCBhcnJheV9vdXRbU0FNUExFUyo4KjgrMTAwXTsKKyAgICB1aW50OF90ICphaW5bU1dSX0NIX01BWF07CisgICAgdWludDhfdCAqYW91dFtTV1JfQ0hfTUFYXTsKKyAgICB1aW50OF90ICphbWlkW1NXUl9DSF9NQVhdOworICAgIGludCBmbHVzaF9pPTA7CisgICAgaW50IG1vZGU7CisgICAgaW50IG51bV90ZXN0cyA9IDEwMDAwOworICAgIHVpbnQzMl90IHNlZWQgPSAwOworICAgIHVpbnQzMl90IHJhbmRfc2VlZCA9IDA7CisgICAgaW50IHJlbWFpbmluZ190ZXN0c1tGRl9BUlJBWV9FTEVNUyhyYXRlcykgKiBGRl9BUlJBWV9FTEVNUyhsYXlvdXRzKSAqIEZGX0FSUkFZX0VMRU1TKGZvcm1hdHMpICogRkZfQVJSQVlfRUxFTVMobGF5b3V0cykgKiBGRl9BUlJBWV9FTEVNUyhmb3JtYXRzKV07CisgICAgaW50IG1heF90ZXN0cyA9IEZGX0FSUkFZX0VMRU1TKHJlbWFpbmluZ190ZXN0cyk7CisgICAgaW50IHRlc3Q7CisgICAgaW50IHNwZWNpZmljX3Rlc3Q9IC0xOworCisgICAgc3RydWN0IFN3ckNvbnRleHQgKiBmb3J3X2N0eD0gTlVMTDsKKyAgICBzdHJ1Y3QgU3dyQ29udGV4dCAqYmFja3dfY3R4PSBOVUxMOworCisgICAgaWYgKGFyZ2MgPiAxKSB7CisgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbMV0sICItaCIpIHx8ICFzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJVc2FnZTogc3dyZXNhbXBsZS10ZXN0IFs8bnVtX3Rlc3RzPlsgPHRlc3Q+XV0gIFxuIgorICAgICAgICAgICAgICAgICAgICJudW1fdGVzdHMgICAgICAgICAgIERlZmF1bHQgaXMgJWRcbiIsIG51bV90ZXN0cyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBudW1fdGVzdHMgPSBzdHJ0b2woYXJndlsxXSwgTlVMTCwgMCk7CisgICAgICAgIGlmKG51bV90ZXN0cyA8IDApIHsKKyAgICAgICAgICAgIG51bV90ZXN0cyA9IC1udW1fdGVzdHM7CisgICAgICAgICAgICByYW5kX3NlZWQgPSB0aW1lKDApOworICAgICAgICB9CisgICAgICAgIGlmKG51bV90ZXN0czw9IDAgfHwgbnVtX3Rlc3RzPm1heF90ZXN0cykKKyAgICAgICAgICAgIG51bV90ZXN0cyA9IG1heF90ZXN0czsKKyAgICAgICAgaWYoYXJnYyA+IDIpIHsKKyAgICAgICAgICAgIHNwZWNpZmljX3Rlc3QgPSBzdHJ0b2woYXJndlsxXSwgTlVMTCwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPG1heF90ZXN0czsgaSsrKQorICAgICAgICByZW1haW5pbmdfdGVzdHNbaV0gPSBpOworCisgICAgZm9yKHRlc3Q9MDsgdGVzdDxudW1fdGVzdHM7IHRlc3QrKyl7CisgICAgICAgIHVuc2lnbmVkIHI7CisgICAgICAgIHVpbnRfcmFuZChzZWVkKTsKKyAgICAgICAgciA9IChzZWVkICogKHVpbnQ2NF90KShtYXhfdGVzdHMgLSB0ZXN0KSkgPj4zMjsKKyAgICAgICAgRkZTV0FQKGludCwgcmVtYWluaW5nX3Rlc3RzW3JdLCByZW1haW5pbmdfdGVzdHNbbWF4X3Rlc3RzIC0gdGVzdCAtIDFdKTsKKyAgICB9CisgICAgcXNvcnQocmVtYWluaW5nX3Rlc3RzICsgbWF4X3Rlc3RzIC0gbnVtX3Rlc3RzLCBudW1fdGVzdHMsIHNpemVvZihyZW1haW5pbmdfdGVzdHNbMF0pLCAodm9pZCopY21wKTsKKyAgICBpbl9zYW1wbGVfcmF0ZT0xNjAwMDsKKyAgICBmb3IodGVzdD0wOyB0ZXN0PG51bV90ZXN0czsgdGVzdCsrKXsKKyAgICAgICAgY2hhciAgaW5fbGF5b3V0X3N0cmluZ1syNTZdOworICAgICAgICBjaGFyIG91dF9sYXlvdXRfc3RyaW5nWzI1Nl07CisgICAgICAgIHVuc2lnbmVkIHZlY3Rvcj0gcmVtYWluaW5nX3Rlc3RzW21heF90ZXN0cyAtIHRlc3QgLSAxXTsKKyAgICAgICAgaW50IGluX2NoX2NvdW50OworICAgICAgICBpbnQgb3V0X2NvdW50LCBtaWRfY291bnQsIG91dF9jaF9jb3VudDsKKworICAgICAgICBpbl9jaF9sYXlvdXQgICAgPSBsYXlvdXRzW3ZlY3RvciAlIEZGX0FSUkFZX0VMRU1TKGxheW91dHMpXTsgdmVjdG9yIC89IEZGX0FSUkFZX0VMRU1TKGxheW91dHMpOworICAgICAgICBvdXRfY2hfbGF5b3V0ICAgPSBsYXlvdXRzW3ZlY3RvciAlIEZGX0FSUkFZX0VMRU1TKGxheW91dHMpXTsgdmVjdG9yIC89IEZGX0FSUkFZX0VMRU1TKGxheW91dHMpOworICAgICAgICBpbl9zYW1wbGVfZm10ICAgPSBmb3JtYXRzW3ZlY3RvciAlIEZGX0FSUkFZX0VMRU1TKGZvcm1hdHMpXTsgdmVjdG9yIC89IEZGX0FSUkFZX0VMRU1TKGZvcm1hdHMpOworICAgICAgICBvdXRfc2FtcGxlX2ZtdCAgPSBmb3JtYXRzW3ZlY3RvciAlIEZGX0FSUkFZX0VMRU1TKGZvcm1hdHMpXTsgdmVjdG9yIC89IEZGX0FSUkFZX0VMRU1TKGZvcm1hdHMpOworICAgICAgICBvdXRfc2FtcGxlX3JhdGUgPSByYXRlcyAgW3ZlY3RvciAlIEZGX0FSUkFZX0VMRU1TKHJhdGVzICApXTsgdmVjdG9yIC89IEZGX0FSUkFZX0VMRU1TKHJhdGVzKTsKKyAgICAgICAgYXZfYXNzZXJ0MCghdmVjdG9yKTsKKworICAgICAgICBpZihzcGVjaWZpY190ZXN0ID09IDApeworICAgICAgICAgICAgaWYob3V0X3NhbXBsZV9yYXRlICE9IGluX3NhbXBsZV9yYXRlIHx8IGluX2NoX2xheW91dCAhPSBvdXRfY2hfbGF5b3V0KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaW5fY2hfY291bnQ9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhpbl9jaF9sYXlvdXQpOworICAgICAgICBvdXRfY2hfY291bnQ9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhvdXRfY2hfbGF5b3V0KTsKKyAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyggaW5fbGF5b3V0X3N0cmluZywgc2l6ZW9mKCBpbl9sYXlvdXRfc3RyaW5nKSwgIGluX2NoX2NvdW50LCAgaW5fY2hfbGF5b3V0KTsKKyAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhvdXRfbGF5b3V0X3N0cmluZywgc2l6ZW9mKG91dF9sYXlvdXRfc3RyaW5nKSwgb3V0X2NoX2NvdW50LCBvdXRfY2hfbGF5b3V0KTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJURVNUOiAlcy0+JXMsIHJhdGU6JTVkLT4lNWQsIGZtdDolcy0+JXNcbiIsCisgICAgICAgICAgICAgICAgaW5fbGF5b3V0X3N0cmluZywgb3V0X2xheW91dF9zdHJpbmcsCisgICAgICAgICAgICAgICAgaW5fc2FtcGxlX3JhdGUsIG91dF9zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGluX3NhbXBsZV9mbXQpLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKG91dF9zYW1wbGVfZm10KSk7CisgICAgICAgIGZvcndfY3R4ICA9IHN3cl9hbGxvY19zZXRfb3B0cyhmb3J3X2N0eCwgb3V0X2NoX2xheW91dCwgb3V0X3NhbXBsZV9mbXQsICBvdXRfc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fY2hfbGF5b3V0LCAgaW5fc2FtcGxlX2ZtdCwgIGluX3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICBiYWNrd19jdHggPSBzd3JfYWxsb2Nfc2V0X29wdHMoYmFja3dfY3R4LCBpbl9jaF9sYXlvdXQsICBpbl9zYW1wbGVfZm10LCAgICAgICAgICAgICBpbl9zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfY2hfbGF5b3V0LCBvdXRfc2FtcGxlX2ZtdCwgb3V0X3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICBpZighZm9yd19jdHgpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGluaXQgZm9yd19jdHNcbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYoIWJhY2t3X2N0eCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gaW5pdCBiYWNrd19jdHhcbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYoc3dyX2luaXQoIGZvcndfY3R4KSA8IDApCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInN3cl9pbml0KC0+KSBmYWlsZWRcbiIpOworICAgICAgICBpZihzd3JfaW5pdChiYWNrd19jdHgpIDwgMCkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic3dyX2luaXQoPC0pIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgLy9GSVhNRSB0ZXN0IHBsYW5hcgorICAgICAgICBzZXR1cF9hcnJheShhaW4gLCBhcnJheV9pbiAsICBpbl9zYW1wbGVfZm10LCAgIFNBTVBMRVMpOworICAgICAgICBzZXR1cF9hcnJheShhbWlkLCBhcnJheV9taWQsIG91dF9zYW1wbGVfZm10LCAzKlNBTVBMRVMpOworICAgICAgICBzZXR1cF9hcnJheShhb3V0LCBhcnJheV9vdXQsICBpbl9zYW1wbGVfZm10ICAgICAgICAgICAsICAgU0FNUExFUyk7CisjaWYgMAorICAgICAgICBmb3IoY2g9MDsgY2g8aW5fY2hfY291bnQ7IGNoKyspeworICAgICAgICAgICAgZm9yKGk9MDsgaTxTQU1QTEVTOyBpKyspCisgICAgICAgICAgICAgICAgc2V0KGFpbiwgY2gsIGksIGluX2NoX2NvdW50LCBpbl9zYW1wbGVfZm10LCBzaW4oaSppKjMvU0FNUExFUykpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBhdWRpb2dlbihhaW4sIGluX3NhbXBsZV9mbXQsIGluX2NoX2NvdW50LCBTQU1QTEVTLzYrMSwgU0FNUExFUyk7CisjZW5kaWYKKyAgICAgICAgbW9kZSA9IHVpbnRfcmFuZChyYW5kX3NlZWQpICUgMzsKKyAgICAgICAgaWYobW9kZT09MCAvKnx8IG91dF9zYW1wbGVfcmF0ZSA9PSBpbl9zYW1wbGVfcmF0ZSovKSB7CisgICAgICAgICAgICBtaWRfY291bnQ9IHN3cl9jb252ZXJ0KGZvcndfY3R4LCBhbWlkLCAzKlNBTVBMRVMsIChjb25zdCB1aW50OF90ICoqKWFpbiwgU0FNUExFUyk7CisgICAgICAgIH0gZWxzZSBpZihtb2RlPT0xKXsKKyAgICAgICAgICAgIG1pZF9jb3VudD0gc3dyX2NvbnZlcnQoZm9yd19jdHgsIGFtaWQsICAgICAgICAgMCwgKGNvbnN0IHVpbnQ4X3QgKiopYWluLCBTQU1QTEVTKTsKKyAgICAgICAgICAgIG1pZF9jb3VudCs9c3dyX2NvbnZlcnQoZm9yd19jdHgsIGFtaWQsIDMqU0FNUExFUywgKGNvbnN0IHVpbnQ4X3QgKiopYWluLCAgICAgICAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCB0bXBfY291bnQ7CisgICAgICAgICAgICBtaWRfY291bnQ9IHN3cl9jb252ZXJ0KGZvcndfY3R4LCBhbWlkLCAgICAgICAgIDAsIChjb25zdCB1aW50OF90ICoqKWFpbiwgICAgICAgMSk7CisgICAgICAgICAgICBhdl9hc3NlcnQwKG1pZF9jb3VudD09MCk7CisgICAgICAgICAgICBzaGlmdChhaW4sICAxLCBpbl9jaF9jb3VudCwgaW5fc2FtcGxlX2ZtdCk7CisgICAgICAgICAgICBtaWRfY291bnQrPXN3cl9jb252ZXJ0KGZvcndfY3R4LCBhbWlkLCAzKlNBTVBMRVMsIChjb25zdCB1aW50OF90ICoqKWFpbiwgICAgICAgMCk7CisgICAgICAgICAgICBzaGlmdChhbWlkLCAgbWlkX2NvdW50LCBvdXRfY2hfY291bnQsIG91dF9zYW1wbGVfZm10KTsgdG1wX2NvdW50ID0gbWlkX2NvdW50OworICAgICAgICAgICAgbWlkX2NvdW50Kz1zd3JfY29udmVydChmb3J3X2N0eCwgYW1pZCwgICAgICAgICAyLCAoY29uc3QgdWludDhfdCAqKilhaW4sICAgICAgIDIpOworICAgICAgICAgICAgc2hpZnQoYW1pZCwgIG1pZF9jb3VudC10bXBfY291bnQsIG91dF9jaF9jb3VudCwgb3V0X3NhbXBsZV9mbXQpOyB0bXBfY291bnQgPSBtaWRfY291bnQ7CisgICAgICAgICAgICBzaGlmdChhaW4sICAyLCBpbl9jaF9jb3VudCwgaW5fc2FtcGxlX2ZtdCk7CisgICAgICAgICAgICBtaWRfY291bnQrPXN3cl9jb252ZXJ0KGZvcndfY3R4LCBhbWlkLCAgICAgICAgIDEsIChjb25zdCB1aW50OF90ICoqKWFpbiwgU0FNUExFUy0zKTsKKyAgICAgICAgICAgIHNoaWZ0KGFtaWQsICBtaWRfY291bnQtdG1wX2NvdW50LCBvdXRfY2hfY291bnQsIG91dF9zYW1wbGVfZm10KTsgdG1wX2NvdW50ID0gbWlkX2NvdW50OworICAgICAgICAgICAgc2hpZnQoYWluLCAtMywgaW5fY2hfY291bnQsIGluX3NhbXBsZV9mbXQpOworICAgICAgICAgICAgbWlkX2NvdW50Kz1zd3JfY29udmVydChmb3J3X2N0eCwgYW1pZCwgMypTQU1QTEVTLCAoY29uc3QgdWludDhfdCAqKilhaW4sICAgICAgIDApOworICAgICAgICAgICAgc2hpZnQoYW1pZCwgIC10bXBfY291bnQsIG91dF9jaF9jb3VudCwgb3V0X3NhbXBsZV9mbXQpOworICAgICAgICB9CisgICAgICAgIG91dF9jb3VudD0gc3dyX2NvbnZlcnQoYmFja3dfY3R4LGFvdXQsIFNBTVBMRVMsIChjb25zdCB1aW50OF90ICoqKWFtaWQsIG1pZF9jb3VudCk7CisKKyAgICAgICAgZm9yKGNoPTA7IGNoPGluX2NoX2NvdW50OyBjaCsrKXsKKyAgICAgICAgICAgIGRvdWJsZSBzc2UsIG1heGRpZmY9MDsKKyAgICAgICAgICAgIGRvdWJsZSBzdW1fYT0gMDsKKyAgICAgICAgICAgIGRvdWJsZSBzdW1fYj0gMDsKKyAgICAgICAgICAgIGRvdWJsZSBzdW1fYWE9IDA7CisgICAgICAgICAgICBkb3VibGUgc3VtX2JiPSAwOworICAgICAgICAgICAgZG91YmxlIHN1bV9hYj0gMDsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8b3V0X2NvdW50OyBpKyspeworICAgICAgICAgICAgICAgIGRvdWJsZSBhPSBnZXQoYWluICwgY2gsIGksIGluX2NoX2NvdW50LCBpbl9zYW1wbGVfZm10KTsKKyAgICAgICAgICAgICAgICBkb3VibGUgYj0gZ2V0KGFvdXQsIGNoLCBpLCBpbl9jaF9jb3VudCwgaW5fc2FtcGxlX2ZtdCk7CisgICAgICAgICAgICAgICAgc3VtX2EgKz0gYTsKKyAgICAgICAgICAgICAgICBzdW1fYiArPSBiOworICAgICAgICAgICAgICAgIHN1bV9hYSs9IGEqYTsKKyAgICAgICAgICAgICAgICBzdW1fYmIrPSBiKmI7CisgICAgICAgICAgICAgICAgc3VtX2FiKz0gYSpiOworICAgICAgICAgICAgICAgIG1heGRpZmY9IEZGTUFYKG1heGRpZmYsIEZGQUJTKGEtYikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3NlPSBzdW1fYWEgKyBzdW1fYmIgLSAyKnN1bV9hYjsKKyAgICAgICAgICAgIGlmKHNzZSA8IDAgJiYgc3NlID4gLTAuMDAwMDEpIHNzZT0wOyAvL2ZpeCByb3VuZGluZyBlcnJvcgorCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIltlOiVmIGM6JWYgbWF4OiVmXSBsZW46JTVkXG4iLCBvdXRfY291bnQgPyBzcXJ0KHNzZS9vdXRfY291bnQpIDogMCwgc3VtX2FiLyhzcXJ0KHN1bV9hYSpzdW1fYmIpKSwgbWF4ZGlmZiwgb3V0X2NvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGZsdXNoX2krKzsKKyAgICAgICAgZmx1c2hfaSU9MjE7CisgICAgICAgIGZsdXNoX2NvdW50ID0gc3dyX2NvbnZlcnQoYmFja3dfY3R4LGFvdXQsIGZsdXNoX2ksIDAsIDApOworICAgICAgICBzaGlmdChhb3V0LCAgZmx1c2hfaSwgaW5fY2hfY291bnQsIGluX3NhbXBsZV9mbXQpOworICAgICAgICBmbHVzaF9jb3VudCs9IHN3cl9jb252ZXJ0KGJhY2t3X2N0eCxhb3V0LCBTQU1QTEVTLWZsdXNoX2ksIDAsIDApOworICAgICAgICBzaGlmdChhb3V0LCAtZmx1c2hfaSwgaW5fY2hfY291bnQsIGluX3NhbXBsZV9mbXQpOworICAgICAgICBpZihmbHVzaF9jb3VudCl7CisgICAgICAgICAgICBmb3IoY2g9MDsgY2g8aW5fY2hfY291bnQ7IGNoKyspeworICAgICAgICAgICAgICAgIGRvdWJsZSBzc2UsIG1heGRpZmY9MDsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3VtX2E9IDA7CisgICAgICAgICAgICAgICAgZG91YmxlIHN1bV9iPSAwOworICAgICAgICAgICAgICAgIGRvdWJsZSBzdW1fYWE9IDA7CisgICAgICAgICAgICAgICAgZG91YmxlIHN1bV9iYj0gMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3VtX2FiPSAwOworICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8Zmx1c2hfY291bnQ7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhPSBnZXQoYWluICwgY2gsIGkrb3V0X2NvdW50LCBpbl9jaF9jb3VudCwgaW5fc2FtcGxlX2ZtdCk7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiPSBnZXQoYW91dCwgY2gsIGksIGluX2NoX2NvdW50LCBpbl9zYW1wbGVfZm10KTsKKyAgICAgICAgICAgICAgICAgICAgc3VtX2EgKz0gYTsKKyAgICAgICAgICAgICAgICAgICAgc3VtX2IgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgc3VtX2FhKz0gYSphOworICAgICAgICAgICAgICAgICAgICBzdW1fYmIrPSBiKmI7CisgICAgICAgICAgICAgICAgICAgIHN1bV9hYis9IGEqYjsKKyAgICAgICAgICAgICAgICAgICAgbWF4ZGlmZj0gRkZNQVgobWF4ZGlmZiwgRkZBQlMoYS1iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNzZT0gc3VtX2FhICsgc3VtX2JiIC0gMipzdW1fYWI7CisgICAgICAgICAgICAgICAgaWYoc3NlIDwgMCAmJiBzc2UgPiAtMC4wMDAwMSkgc3NlPTA7IC8vZml4IHJvdW5kaW5nIGVycm9yCisKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIltlOiVmIGM6JWYgbWF4OiVmXSBsZW46JTVkIEY6JTNkXG4iLCBzcXJ0KHNzZS9mbHVzaF9jb3VudCksIHN1bV9hYi8oc3FydChzdW1fYWEqc3VtX2JiKSksIG1heGRpZmYsIGZsdXNoX2NvdW50LCBmbHVzaF9pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS5jIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYmQ2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmMKQEAgLTAsMCArMSw4NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBNaWNoYWVsIE5pZWRlcm1heWVyIChtaWNoYWVsbmlAZ214LmF0KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYnN3cmVzYW1wbGUKKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIGxpYnN3cmVzYW1wbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgInN3cmVzYW1wbGVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdWRpb2NvbnZlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNkZWZpbmUgQUxJR04gMzIKKwordW5zaWduZWQgc3dyZXNhbXBsZV92ZXJzaW9uKHZvaWQpCit7CisgICAgYXZfYXNzZXJ0MChMSUJTV1JFU0FNUExFX1ZFUlNJT05fTUlDUk8gPj0gMTAwKTsKKyAgICByZXR1cm4gTElCU1dSRVNBTVBMRV9WRVJTSU9OX0lOVDsKK30KKworY29uc3QgY2hhciAqc3dyZXNhbXBsZV9jb25maWd1cmF0aW9uKHZvaWQpCit7CisgICAgcmV0dXJuIEZGTVBFR19DT05GSUdVUkFUSU9OOworfQorCitjb25zdCBjaGFyICpzd3Jlc2FtcGxlX2xpY2Vuc2Uodm9pZCkKK3sKKyNkZWZpbmUgTElDRU5TRV9QUkVGSVggImxpYnN3cmVzYW1wbGUgbGljZW5zZTogIgorICAgIHJldHVybiBMSUNFTlNFX1BSRUZJWCBGRk1QRUdfTElDRU5TRSArIHNpemVvZihMSUNFTlNFX1BSRUZJWCkgLSAxOworfQorCitpbnQgc3dyX3NldF9jaGFubmVsX21hcHBpbmcoc3RydWN0IFN3ckNvbnRleHQgKnMsIGNvbnN0IGludCAqY2hhbm5lbF9tYXApeworICAgIGlmKCFzIHx8IHMtPmluX2NvbnZlcnQpIC8vIHMgbmVlZHMgdG8gYmUgYWxsb2NhdGVkIGJ1dCBub3QgaW5pdGlhbGl6ZWQKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBzLT5jaGFubmVsX21hcCA9IGNoYW5uZWxfbWFwOworICAgIHJldHVybiAwOworfQorCitzdHJ1Y3QgU3dyQ29udGV4dCAqc3dyX2FsbG9jX3NldF9vcHRzKHN0cnVjdCBTd3JDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG91dF9jaF9sYXlvdXQsIGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X3NhbXBsZV9mbXQsIGludCBvdXRfc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgIGluX2NoX2xheW91dCwgZW51bSBBVlNhbXBsZUZvcm1hdCAgaW5fc2FtcGxlX2ZtdCwgaW50ICBpbl9zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZ19vZmZzZXQsIHZvaWQgKmxvZ19jdHgpeworICAgIGlmKCFzKSBzPSBzd3JfYWxsb2MoKTsKKyAgICBpZighcykgcmV0dXJuIE5VTEw7CisKKyAgICBzLT5sb2dfbGV2ZWxfb2Zmc2V0PSBsb2dfb2Zmc2V0OworICAgIHMtPmxvZ19jdHg9IGxvZ19jdHg7CisKKyAgICBpZiAoYXZfb3B0X3NldF9pbnQocywgIm9jbCIsIG91dF9jaF9sYXlvdXQsICAgMCkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoYXZfb3B0X3NldF9pbnQocywgIm9zZiIsIG91dF9zYW1wbGVfZm10LCAgMCkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoYXZfb3B0X3NldF9pbnQocywgIm9zciIsIG91dF9zYW1wbGVfcmF0ZSwgMCkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoYXZfb3B0X3NldF9pbnQocywgImljbCIsIGluX2NoX2xheW91dCwgICAgMCkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoYXZfb3B0X3NldF9pbnQocywgImlzZiIsIGluX3NhbXBsZV9mbXQsICAgMCkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoYXZfb3B0X3NldF9pbnQocywgImlzciIsIGluX3NhbXBsZV9yYXRlLCAgMCkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoYXZfb3B0X3NldF9pbnQocywgInRzZiIsIEFWX1NBTVBMRV9GTVRfTk9ORSwgICAwKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChhdl9vcHRfc2V0X2ludChzLCAiaWNoIiwgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHMtPiBpbl9jaF9sYXlvdXQpLCAwKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChhdl9vcHRfc2V0X2ludChzLCAib2NoIiwgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHMtPm91dF9jaF9sYXlvdXQpLCAwKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGF2X29wdF9zZXRfaW50KHMsICJ1Y2giLCAwLCAwKTsKKyAgICByZXR1cm4gczsKK2ZhaWw6CisgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQgb3B0aW9uXG4iKTsKKyAgICBzd3JfZnJlZSgmcyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hdWRpb2RhdGFfZm10KEF1ZGlvRGF0YSAqYSwgZW51bSBBVlNhbXBsZUZvcm1hdCBmbXQpeworICAgIGEtPmZtdCAgID0gZm10OworICAgIGEtPmJwcyAgID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoZm10KTsKKyAgICBhLT5wbGFuYXI9IGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGZtdCk7CisgICAgaWYgKGEtPmNoX2NvdW50ID09IDEpCisgICAgICAgIGEtPnBsYW5hciA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdGVtcChBdWRpb0RhdGEgKmEpeworICAgIGF2X2ZyZWUoYS0+ZGF0YSk7CisgICAgbWVtc2V0KGEsIDAsIHNpemVvZigqYSkpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9jb250ZXh0KFN3ckNvbnRleHQgKnMpeworICAgIHMtPmluX2J1ZmZlcl9pbmRleD0gMDsKKyAgICBzLT5pbl9idWZmZXJfY291bnQ9IDA7CisgICAgcy0+cmVzYW1wbGVfaW5fY29uc3RyYWludD0gMDsKKyAgICBtZW1zZXQocy0+aW4uY2gsIDAsIHNpemVvZihzLT5pbi5jaCkpOworICAgIG1lbXNldChzLT5vdXQuY2gsIDAsIHNpemVvZihzLT5vdXQuY2gpKTsKKyAgICBmcmVlX3RlbXAoJnMtPnBvc3Rpbik7CisgICAgZnJlZV90ZW1wKCZzLT5taWRidWYpOworICAgIGZyZWVfdGVtcCgmcy0+cHJlb3V0KTsKKyAgICBmcmVlX3RlbXAoJnMtPmluX2J1ZmZlcik7CisgICAgZnJlZV90ZW1wKCZzLT5zaWxlbmNlKTsKKyAgICBmcmVlX3RlbXAoJnMtPmRyb3BfdGVtcCk7CisgICAgZnJlZV90ZW1wKCZzLT5kaXRoZXIubm9pc2UpOworICAgIGZyZWVfdGVtcCgmcy0+ZGl0aGVyLnRlbXApOworICAgIHN3cmlfYXVkaW9fY29udmVydF9mcmVlKCZzLT4gaW5fY29udmVydCk7CisgICAgc3dyaV9hdWRpb19jb252ZXJ0X2ZyZWUoJnMtPm91dF9jb252ZXJ0KTsKKyAgICBzd3JpX2F1ZGlvX2NvbnZlcnRfZnJlZSgmcy0+ZnVsbF9jb252ZXJ0KTsKKyAgICBzd3JpX3JlbWF0cml4X2ZyZWUocyk7CisKKyAgICBzLT5mbHVzaGVkID0gMDsKK30KKworYXZfY29sZCB2b2lkIHN3cl9mcmVlKFN3ckNvbnRleHQgKipzcyl7CisgICAgU3dyQ29udGV4dCAqcz0gKnNzOworICAgIGlmKHMpeworICAgICAgICBjbGVhcl9jb250ZXh0KHMpOworICAgICAgICBpZiAocy0+cmVzYW1wbGVyKQorICAgICAgICAgICAgcy0+cmVzYW1wbGVyLT5mcmVlKCZzLT5yZXNhbXBsZSk7CisgICAgfQorCisgICAgYXZfZnJlZXAoc3MpOworfQorCithdl9jb2xkIHZvaWQgc3dyX2Nsb3NlKFN3ckNvbnRleHQgKnMpeworICAgIGNsZWFyX2NvbnRleHQocyk7Cit9CisKK2F2X2NvbGQgaW50IHN3cl9pbml0KHN0cnVjdCBTd3JDb250ZXh0ICpzKXsKKyAgICBpbnQgcmV0OworCisgICAgY2xlYXJfY29udGV4dChzKTsKKworICAgIGlmKHMtPiBpbl9zYW1wbGVfZm10ID49IEFWX1NBTVBMRV9GTVRfTkIpeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUmVxdWVzdGVkIGlucHV0IHNhbXBsZSBmb3JtYXQgJWQgaXMgaW52YWxpZFxuIiwgcy0+aW5fc2FtcGxlX2ZtdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmKHMtPm91dF9zYW1wbGVfZm10ID49IEFWX1NBTVBMRV9GTVRfTkIpeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUmVxdWVzdGVkIG91dHB1dCBzYW1wbGUgZm9ybWF0ICVkIGlzIGludmFsaWRcbiIsIHMtPm91dF9zYW1wbGVfZm10KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZihhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+IGluX2NoX2xheW91dCkgPiBTV1JfQ0hfTUFYKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIklucHV0IGNoYW5uZWwgbGF5b3V0IDB4JSJQUkl4NjQiIGlzIGludmFsaWQgb3IgdW5zdXBwb3J0ZWQuXG4iLCBzLT4gaW5fY2hfbGF5b3V0KTsKKyAgICAgICAgcy0+aW5fY2hfbGF5b3V0ID0gMDsKKyAgICB9CisKKyAgICBpZihhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+b3V0X2NoX2xheW91dCkgPiBTV1JfQ0hfTUFYKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIk91dHB1dCBjaGFubmVsIGxheW91dCAweCUiUFJJeDY0IiBpcyBpbnZhbGlkIG9yIHVuc3VwcG9ydGVkLlxuIiwgcy0+b3V0X2NoX2xheW91dCk7CisgICAgICAgIHMtPm91dF9jaF9sYXlvdXQgPSAwOworICAgIH0KKworICAgIHN3aXRjaChzLT5lbmdpbmUpeworI2lmIENPTkZJR19MSUJTT1hSCisgICAgICAgIGV4dGVybiBzdHJ1Y3QgUmVzYW1wbGVyIGNvbnN0IHNveHJfcmVzYW1wbGVyOworICAgICAgICBjYXNlIFNXUl9FTkdJTkVfU09YUjogcy0+cmVzYW1wbGVyID0gJnNveHJfcmVzYW1wbGVyOyBicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIFNXUl9FTkdJTkVfU1dSIDogcy0+cmVzYW1wbGVyID0gJnN3cmlfcmVzYW1wbGVyOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJSZXF1ZXN0ZWQgcmVzYW1wbGluZyBlbmdpbmUgaXMgdW5hdmFpbGFibGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZighcy0+dXNlZF9jaF9jb3VudCkKKyAgICAgICAgcy0+dXNlZF9jaF9jb3VudD0gcy0+aW4uY2hfY291bnQ7CisKKyAgICBpZihzLT51c2VkX2NoX2NvdW50ICYmIHMtPiBpbl9jaF9sYXlvdXQgJiYgcy0+dXNlZF9jaF9jb3VudCAhPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+IGluX2NoX2xheW91dCkpeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJJbnB1dCBjaGFubmVsIGxheW91dCBoYXMgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGNoYW5uZWxzIHRoYW4gdGhlIG51bWJlciBvZiB1c2VkIGNoYW5uZWxzLCBpZ25vcmluZyBsYXlvdXRcbiIpOworICAgICAgICBzLT4gaW5fY2hfbGF5b3V0PSAwOworICAgIH0KKworICAgIGlmKCFzLT4gaW5fY2hfbGF5b3V0KQorICAgICAgICBzLT4gaW5fY2hfbGF5b3V0PSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChzLT51c2VkX2NoX2NvdW50KTsKKyAgICBpZighcy0+b3V0X2NoX2xheW91dCkKKyAgICAgICAgcy0+b3V0X2NoX2xheW91dD0gYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQocy0+b3V0LmNoX2NvdW50KTsKKworICAgIHMtPnJlbWF0cml4PSBzLT5vdXRfY2hfbGF5b3V0ICAhPXMtPmluX2NoX2xheW91dCB8fCBzLT5yZW1hdHJpeF92b2x1bWUhPTEuMCB8fAorICAgICAgICAgICAgICAgICBzLT5yZW1hdHJpeF9jdXN0b207CisKKyAgICBpZihzLT5pbnRfc2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX05PTkUpeworICAgICAgICBpZihhdl9nZXRfcGxhbmFyX3NhbXBsZV9mbXQocy0+aW5fc2FtcGxlX2ZtdCkgPD0gQVZfU0FNUExFX0ZNVF9TMTZQKXsKKyAgICAgICAgICAgIHMtPmludF9zYW1wbGVfZm10PSBBVl9TQU1QTEVfRk1UX1MxNlA7CisgICAgICAgIH1lbHNlIGlmKCAgIGF2X2dldF9wbGFuYXJfc2FtcGxlX2ZtdChzLT4gaW5fc2FtcGxlX2ZtdCkgPT0gQVZfU0FNUExFX0ZNVF9TMzJQCisgICAgICAgICAgICAgICAgICYmIGF2X2dldF9wbGFuYXJfc2FtcGxlX2ZtdChzLT5vdXRfc2FtcGxlX2ZtdCkgPT0gQVZfU0FNUExFX0ZNVF9TMzJQCisgICAgICAgICAgICAgICAgICYmICFzLT5yZW1hdHJpeAorICAgICAgICAgICAgICAgICAmJiBzLT5lbmdpbmUgIT0gU1dSX0VOR0lORV9TT1hSKXsKKyAgICAgICAgICAgIHMtPmludF9zYW1wbGVfZm10PSBBVl9TQU1QTEVfRk1UX1MzMlA7CisgICAgICAgIH1lbHNlIGlmKGF2X2dldF9wbGFuYXJfc2FtcGxlX2ZtdChzLT5pbl9zYW1wbGVfZm10KSA8PSBBVl9TQU1QTEVfRk1UX0ZMVFApeworICAgICAgICAgICAgcy0+aW50X3NhbXBsZV9mbXQ9IEFWX1NBTVBMRV9GTVRfRkxUUDsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiVXNpbmcgZG91YmxlIHByZWNpc2lvbiBtb2RlXG4iKTsKKyAgICAgICAgICAgIHMtPmludF9zYW1wbGVfZm10PSBBVl9TQU1QTEVfRk1UX0RCTFA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggICBzLT5pbnRfc2FtcGxlX2ZtdCAhPSBBVl9TQU1QTEVfRk1UX1MxNlAKKyAgICAgICAgJiZzLT5pbnRfc2FtcGxlX2ZtdCAhPSBBVl9TQU1QTEVfRk1UX1MzMlAKKyAgICAgICAgJiZzLT5pbnRfc2FtcGxlX2ZtdCAhPSBBVl9TQU1QTEVfRk1UX0ZMVFAKKyAgICAgICAgJiZzLT5pbnRfc2FtcGxlX2ZtdCAhPSBBVl9TQU1QTEVfRk1UX0RCTFApeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUmVxdWVzdGVkIHNhbXBsZSBmb3JtYXQgJXMgaXMgbm90IHN1cHBvcnRlZCBpbnRlcm5hbGx5LCBTMTYvUzMyL0ZMVC9EQkwgaXMgc3VwcG9ydGVkXG4iLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKHMtPmludF9zYW1wbGVfZm10KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgc2V0X2F1ZGlvZGF0YV9mbXQoJnMtPiBpbiwgcy0+IGluX3NhbXBsZV9mbXQpOworICAgIHNldF9hdWRpb2RhdGFfZm10KCZzLT5vdXQsIHMtPm91dF9zYW1wbGVfZm10KTsKKworICAgIGlmIChzLT5maXJzdHB0c19pbl9zYW1wbGVzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGlmICghcy0+YXN5bmMgJiYgcy0+bWluX2NvbXBlbnNhdGlvbiA+PSBGTFRfTUFYLzIpCisgICAgICAgICAgICBzLT5hc3luYyA9IDE7CisgICAgICAgIHMtPmZpcnN0cHRzID0KKyAgICAgICAgcy0+b3V0cHRzICAgPSBzLT5maXJzdHB0c19pbl9zYW1wbGVzICogcy0+b3V0X3NhbXBsZV9yYXRlOworICAgIH0gZWxzZQorICAgICAgICBzLT5maXJzdHB0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgaWYgKHMtPmFzeW5jKSB7CisgICAgICAgIGlmIChzLT5taW5fY29tcGVuc2F0aW9uID49IEZMVF9NQVgvMikKKyAgICAgICAgICAgIHMtPm1pbl9jb21wZW5zYXRpb24gPSAwLjAwMTsKKyAgICAgICAgaWYgKHMtPmFzeW5jID4gMS4wMDAxKSB7CisgICAgICAgICAgICBzLT5tYXhfc29mdF9jb21wZW5zYXRpb24gPSBzLT5hc3luYyAvIChkb3VibGUpIHMtPmluX3NhbXBsZV9yYXRlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPm91dF9zYW1wbGVfcmF0ZSE9cy0+aW5fc2FtcGxlX3JhdGUgfHwgKHMtPmZsYWdzICYgU1dSX0ZMQUdfUkVTQU1QTEUpKXsKKyAgICAgICAgcy0+cmVzYW1wbGUgPSBzLT5yZXNhbXBsZXItPmluaXQocy0+cmVzYW1wbGUsIHMtPm91dF9zYW1wbGVfcmF0ZSwgcy0+aW5fc2FtcGxlX3JhdGUsIHMtPmZpbHRlcl9zaXplLCBzLT5waGFzZV9zaGlmdCwgcy0+bGluZWFyX2ludGVycCwgcy0+Y3V0b2ZmLCBzLT5pbnRfc2FtcGxlX2ZtdCwgcy0+ZmlsdGVyX3R5cGUsIHMtPmthaXNlcl9iZXRhLCBzLT5wcmVjaXNpb24sIHMtPmNoZWJ5KTsKKyAgICB9ZWxzZQorICAgICAgICBzLT5yZXNhbXBsZXItPmZyZWUoJnMtPnJlc2FtcGxlKTsKKyAgICBpZiggICAgcy0+aW50X3NhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9TMTZQCisgICAgICAgICYmIHMtPmludF9zYW1wbGVfZm10ICE9IEFWX1NBTVBMRV9GTVRfUzMyUAorICAgICAgICAmJiBzLT5pbnRfc2FtcGxlX2ZtdCAhPSBBVl9TQU1QTEVfRk1UX0ZMVFAKKyAgICAgICAgJiYgcy0+aW50X3NhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9EQkxQCisgICAgICAgICYmIHMtPnJlc2FtcGxlKXsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlJlc2FtcGxpbmcgb25seSBzdXBwb3J0ZWQgd2l0aCBpbnRlcm5hbCBzMTYvczMyL2ZsdC9kYmxcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisjZGVmaW5lIFJTQyAxIC8vRklYTUUgZmluZXR1bmUKKyAgICBpZighcy0+IGluLmNoX2NvdW50KQorICAgICAgICBzLT4gaW4uY2hfY291bnQ9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzLT4gaW5fY2hfbGF5b3V0KTsKKyAgICBpZighcy0+dXNlZF9jaF9jb3VudCkKKyAgICAgICAgcy0+dXNlZF9jaF9jb3VudD0gcy0+aW4uY2hfY291bnQ7CisgICAgaWYoIXMtPm91dC5jaF9jb3VudCkKKyAgICAgICAgcy0+b3V0LmNoX2NvdW50PSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+b3V0X2NoX2xheW91dCk7CisKKyAgICBpZighcy0+IGluLmNoX2NvdW50KXsKKyAgICAgICAgYXZfYXNzZXJ0MCghcy0+aW5fY2hfbGF5b3V0KTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIklucHV0IGNoYW5uZWwgY291bnQgYW5kIGxheW91dCBhcmUgdW5zZXRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCghcy0+b3V0X2NoX2xheW91dCB8fCAhcy0+aW5fY2hfbGF5b3V0KSAmJiBzLT51c2VkX2NoX2NvdW50ICE9IHMtPm91dC5jaF9jb3VudCAmJiAhcy0+cmVtYXRyaXhfY3VzdG9tKSB7CisgICAgICAgIGNoYXIgbDFbMTAyNF0sIGwyWzEwMjRdOworICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGwxLCBzaXplb2YobDEpLCBzLT4gaW4uY2hfY291bnQsIHMtPiBpbl9jaF9sYXlvdXQpOworICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGwyLCBzaXplb2YobDIpLCBzLT5vdXQuY2hfY291bnQsIHMtPm91dF9jaF9sYXlvdXQpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUmVtYXRyaXggaXMgbmVlZGVkIGJldHdlZW4gJXMgYW5kICVzICIKKyAgICAgICAgICAgICAgICJidXQgdGhlcmUgaXMgbm90IGVub3VnaCBpbmZvcm1hdGlvbiB0byBkbyBpdFxuIiwgbDEsIGwyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworYXZfYXNzZXJ0MChzLT51c2VkX2NoX2NvdW50KTsKK2F2X2Fzc2VydDAocy0+b3V0LmNoX2NvdW50KTsKKyAgICBzLT5yZXNhbXBsZV9maXJzdD0gUlNDKnMtPm91dC5jaF9jb3VudC9zLT5pbi5jaF9jb3VudCAtIFJTQyA8IHMtPm91dF9zYW1wbGVfcmF0ZS8oZmxvYXQpcy0+IGluX3NhbXBsZV9yYXRlIC0gMS4wOworCisgICAgcy0+aW5fYnVmZmVyPSBzLT5pbjsKKyAgICBzLT5zaWxlbmNlICA9IHMtPmluOworICAgIHMtPmRyb3BfdGVtcD0gcy0+b3V0OworCisgICAgaWYoIXMtPnJlc2FtcGxlICYmICFzLT5yZW1hdHJpeCAmJiAhcy0+Y2hhbm5lbF9tYXAgJiYgIXMtPmRpdGhlci5tZXRob2QpeworICAgICAgICBzLT5mdWxsX2NvbnZlcnQgPSBzd3JpX2F1ZGlvX2NvbnZlcnRfYWxsb2Mocy0+b3V0X3NhbXBsZV9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT4gaW5fc2FtcGxlX2ZtdCwgcy0+IGluLmNoX2NvdW50LCBOVUxMLCAwKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcy0+aW5fY29udmVydCA9IHN3cmlfYXVkaW9fY29udmVydF9hbGxvYyhzLT5pbnRfc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPiBpbl9zYW1wbGVfZm10LCBzLT51c2VkX2NoX2NvdW50LCBzLT5jaGFubmVsX21hcCwgMCk7CisgICAgcy0+b3V0X2NvbnZlcnQ9IHN3cmlfYXVkaW9fY29udmVydF9hbGxvYyhzLT5vdXRfc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmludF9zYW1wbGVfZm10LCBzLT5vdXQuY2hfY291bnQsIE5VTEwsIDApOworCisgICAgaWYgKCFzLT5pbl9jb252ZXJ0IHx8ICFzLT5vdXRfY29udmVydCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPnBvc3Rpbj0gcy0+aW47CisgICAgcy0+cHJlb3V0PSBzLT5vdXQ7CisgICAgcy0+bWlkYnVmPSBzLT5pbjsKKworICAgIGlmKHMtPmNoYW5uZWxfbWFwKXsKKyAgICAgICAgcy0+cG9zdGluLmNoX2NvdW50PQorICAgICAgICBzLT5taWRidWYuY2hfY291bnQ9IHMtPnVzZWRfY2hfY291bnQ7CisgICAgICAgIGlmKHMtPnJlc2FtcGxlKQorICAgICAgICAgICAgcy0+aW5fYnVmZmVyLmNoX2NvdW50PSBzLT51c2VkX2NoX2NvdW50OworICAgIH0KKyAgICBpZighcy0+cmVzYW1wbGVfZmlyc3QpeworICAgICAgICBzLT5taWRidWYuY2hfY291bnQ9IHMtPm91dC5jaF9jb3VudDsKKyAgICAgICAgaWYocy0+cmVzYW1wbGUpCisgICAgICAgICAgICBzLT5pbl9idWZmZXIuY2hfY291bnQgPSBzLT5vdXQuY2hfY291bnQ7CisgICAgfQorCisgICAgc2V0X2F1ZGlvZGF0YV9mbXQoJnMtPnBvc3Rpbiwgcy0+aW50X3NhbXBsZV9mbXQpOworICAgIHNldF9hdWRpb2RhdGFfZm10KCZzLT5taWRidWYsIHMtPmludF9zYW1wbGVfZm10KTsKKyAgICBzZXRfYXVkaW9kYXRhX2ZtdCgmcy0+cHJlb3V0LCBzLT5pbnRfc2FtcGxlX2ZtdCk7CisKKyAgICBpZihzLT5yZXNhbXBsZSl7CisgICAgICAgIHNldF9hdWRpb2RhdGFfZm10KCZzLT5pbl9idWZmZXIsIHMtPmludF9zYW1wbGVfZm10KTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHN3cmlfZGl0aGVyX2luaXQocywgcy0+b3V0X3NhbXBsZV9mbXQsIHMtPmludF9zYW1wbGVfZm10KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYocy0+cmVtYXRyaXggfHwgcy0+ZGl0aGVyLm1ldGhvZCkKKyAgICAgICAgcmV0dXJuIHN3cmlfcmVtYXRyaXhfaW5pdChzKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgc3dyaV9yZWFsbG9jX2F1ZGlvKEF1ZGlvRGF0YSAqYSwgaW50IGNvdW50KXsKKyAgICBpbnQgaSwgY291bnRiOworICAgIEF1ZGlvRGF0YSBvbGQ7CisKKyAgICBpZihjb3VudCA8IDAgfHwgY291bnQgPiBJTlRfTUFYLzIvYS0+YnBzL2EtPmNoX2NvdW50KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYoYS0+Y291bnQgPj0gY291bnQpCisgICAgICAgIHJldHVybiAwOworCisgICAgY291bnQqPTI7CisKKyAgICBjb3VudGI9IEZGQUxJR04oY291bnQqYS0+YnBzLCBBTElHTik7CisgICAgb2xkPSAqYTsKKworICAgIGF2X2Fzc2VydDAoYS0+YnBzKTsKKyAgICBhdl9hc3NlcnQwKGEtPmNoX2NvdW50KTsKKworICAgIGEtPmRhdGE9IGF2X21hbGxvY3ooY291bnRiKmEtPmNoX2NvdW50KTsKKyAgICBpZighYS0+ZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IoaT0wOyBpPGEtPmNoX2NvdW50OyBpKyspeworICAgICAgICBhLT5jaFtpXT0gYS0+ZGF0YSArIGkqKGEtPnBsYW5hciA/IGNvdW50YiA6IGEtPmJwcyk7CisgICAgICAgIGlmKGEtPnBsYW5hcikgbWVtY3B5KGEtPmNoW2ldLCBvbGQuY2hbaV0sIGEtPmNvdW50KmEtPmJwcyk7CisgICAgfQorICAgIGlmKCFhLT5wbGFuYXIpIG1lbWNweShhLT5jaFswXSwgb2xkLmNoWzBdLCBhLT5jb3VudCphLT5jaF9jb3VudCphLT5icHMpOworICAgIGF2X2ZyZWVwKCZvbGQuZGF0YSk7CisgICAgYS0+Y291bnQ9IGNvdW50OworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHkoQXVkaW9EYXRhICpvdXQsIEF1ZGlvRGF0YSAqaW4sCisgICAgICAgICAgICAgICAgIGludCBjb3VudCl7CisgICAgYXZfYXNzZXJ0MChvdXQtPnBsYW5hciA9PSBpbi0+cGxhbmFyKTsKKyAgICBhdl9hc3NlcnQwKG91dC0+YnBzID09IGluLT5icHMpOworICAgIGF2X2Fzc2VydDAob3V0LT5jaF9jb3VudCA9PSBpbi0+Y2hfY291bnQpOworICAgIGlmKG91dC0+cGxhbmFyKXsKKyAgICAgICAgaW50IGNoOworICAgICAgICBmb3IoY2g9MDsgY2g8b3V0LT5jaF9jb3VudDsgY2grKykKKyAgICAgICAgICAgIG1lbWNweShvdXQtPmNoW2NoXSwgaW4tPmNoW2NoXSwgY291bnQqb3V0LT5icHMpOworICAgIH1lbHNlCisgICAgICAgIG1lbWNweShvdXQtPmNoWzBdLCBpbi0+Y2hbMF0sIGNvdW50Km91dC0+Y2hfY291bnQqb3V0LT5icHMpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2F1ZGlvZGF0YShBdWRpb0RhdGEgKm91dCwgdWludDhfdCAqaW5fYXJnIFtTV1JfQ0hfTUFYXSl7CisgICAgaW50IGk7CisgICAgaWYoIWluX2FyZyl7CisgICAgICAgIG1lbXNldChvdXQtPmNoLCAwLCBzaXplb2Yob3V0LT5jaCkpOworICAgIH1lbHNlIGlmKG91dC0+cGxhbmFyKXsKKyAgICAgICAgZm9yKGk9MDsgaTxvdXQtPmNoX2NvdW50OyBpKyspCisgICAgICAgICAgICBvdXQtPmNoW2ldPSBpbl9hcmdbaV07CisgICAgfWVsc2V7CisgICAgICAgIGZvcihpPTA7IGk8b3V0LT5jaF9jb3VudDsgaSsrKQorICAgICAgICAgICAgb3V0LT5jaFtpXT0gaW5fYXJnWzBdICsgaSpvdXQtPmJwczsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJldmVyc2VmaWxsX2F1ZGlvZGF0YShBdWRpb0RhdGEgKm91dCwgdWludDhfdCAqaW5fYXJnIFtTV1JfQ0hfTUFYXSl7CisgICAgaW50IGk7CisgICAgaWYob3V0LT5wbGFuYXIpeworICAgICAgICBmb3IoaT0wOyBpPG91dC0+Y2hfY291bnQ7IGkrKykKKyAgICAgICAgICAgIGluX2FyZ1tpXT0gb3V0LT5jaFtpXTsKKyAgICB9ZWxzZXsKKyAgICAgICAgaW5fYXJnWzBdPSBvdXQtPmNoWzBdOworICAgIH0KK30KKworLyoqCisgKgorICogb3V0IG1heSBiZSBlcXVhbCBpbi4KKyAqLworc3RhdGljIHZvaWQgYnVmX3NldChBdWRpb0RhdGEgKm91dCwgQXVkaW9EYXRhICppbiwgaW50IGNvdW50KXsKKyAgICBpbnQgY2g7CisgICAgaWYoaW4tPnBsYW5hcil7CisgICAgICAgIGZvcihjaD0wOyBjaDxvdXQtPmNoX2NvdW50OyBjaCsrKQorICAgICAgICAgICAgb3V0LT5jaFtjaF09IGluLT5jaFtjaF0gKyBjb3VudCpvdXQtPmJwczsKKyAgICB9ZWxzZXsKKyAgICAgICAgZm9yKGNoPW91dC0+Y2hfY291bnQtMTsgY2g+PTA7IGNoLS0pCisgICAgICAgICAgICBvdXQtPmNoW2NoXT0gaW4tPmNoWzBdICsgKGNoICsgY291bnQqb3V0LT5jaF9jb3VudCkgKiBvdXQtPmJwczsKKyAgICB9Cit9CisKKy8qKgorICoKKyAqIEByZXR1cm4gbnVtYmVyIG9mIHNhbXBsZXMgb3V0cHV0IHBlciBjaGFubmVsCisgKi8KK3N0YXRpYyBpbnQgcmVzYW1wbGUoU3dyQ29udGV4dCAqcywgQXVkaW9EYXRhICpvdXRfcGFyYW0sIGludCBvdXRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGF0YSAqIGluX3BhcmFtLCBpbnQgaW5fY291bnQpeworICAgIEF1ZGlvRGF0YSBpbiwgb3V0LCB0bXA7CisgICAgaW50IHJldF9zdW09MDsKKyAgICBpbnQgYm9yZGVyPTA7CisgICAgaW50IHBhZGxlc3MgPSBBUkNIX1g4NiAmJiBzLT5lbmdpbmUgPT0gU1dSX0VOR0lORV9TV1IgPyA3IDogMDsKKworICAgIGF2X2Fzc2VydDEocy0+aW5fYnVmZmVyLmNoX2NvdW50ID09IGluX3BhcmFtLT5jaF9jb3VudCk7CisgICAgYXZfYXNzZXJ0MShzLT5pbl9idWZmZXIucGxhbmFyICAgPT0gaW5fcGFyYW0tPnBsYW5hcik7CisgICAgYXZfYXNzZXJ0MShzLT5pbl9idWZmZXIuZm10ICAgICAgPT0gaW5fcGFyYW0tPmZtdCk7CisKKyAgICB0bXA9b3V0PSpvdXRfcGFyYW07CisgICAgaW4gPSAgKmluX3BhcmFtOworCisgICAgYm9yZGVyID0gcy0+cmVzYW1wbGVyLT5pbnZlcnRfaW5pdGlhbF9idWZmZXIocy0+cmVzYW1wbGUsICZzLT5pbl9idWZmZXIsCisgICAgICAgICAgICAgICAgICZpbiwgaW5fY291bnQsICZzLT5pbl9idWZmZXJfaW5kZXgsICZzLT5pbl9idWZmZXJfY291bnQpOworICAgIGlmIChib3JkZXIgPT0gSU5UX01BWCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKGJvcmRlciA8IDApIHsKKyAgICAgICAgcmV0dXJuIGJvcmRlcjsKKyAgICB9IGVsc2UgaWYgKGJvcmRlcikgeworICAgICAgICBidWZfc2V0KCZpbiwgJmluLCBib3JkZXIpOworICAgICAgICBpbl9jb3VudCAtPSBib3JkZXI7CisgICAgICAgIHMtPnJlc2FtcGxlX2luX2NvbnN0cmFpbnQgPSAwOworICAgIH0KKworICAgIGRveworICAgICAgICBpbnQgcmV0LCBzaXplLCBjb25zdW1lZDsKKyAgICAgICAgaWYoIXMtPnJlc2FtcGxlX2luX2NvbnN0cmFpbnQgJiYgcy0+aW5fYnVmZmVyX2NvdW50KXsKKyAgICAgICAgICAgIGJ1Zl9zZXQoJnRtcCwgJnMtPmluX2J1ZmZlciwgcy0+aW5fYnVmZmVyX2luZGV4KTsKKyAgICAgICAgICAgIHJldD0gcy0+cmVzYW1wbGVyLT5tdWx0aXBsZV9yZXNhbXBsZShzLT5yZXNhbXBsZSwgJm91dCwgb3V0X2NvdW50LCAmdG1wLCBzLT5pbl9idWZmZXJfY291bnQsICZjb25zdW1lZCk7CisgICAgICAgICAgICBvdXRfY291bnQgLT0gcmV0OworICAgICAgICAgICAgcmV0X3N1bSArPSByZXQ7CisgICAgICAgICAgICBidWZfc2V0KCZvdXQsICZvdXQsIHJldCk7CisgICAgICAgICAgICBzLT5pbl9idWZmZXJfY291bnQgLT0gY29uc3VtZWQ7CisgICAgICAgICAgICBzLT5pbl9idWZmZXJfaW5kZXggKz0gY29uc3VtZWQ7CisKKyAgICAgICAgICAgIGlmKCFpbl9jb3VudCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmKHMtPmluX2J1ZmZlcl9jb3VudCA8PSBib3JkZXIpeworICAgICAgICAgICAgICAgIGJ1Zl9zZXQoJmluLCAmaW4sIC1zLT5pbl9idWZmZXJfY291bnQpOworICAgICAgICAgICAgICAgIGluX2NvdW50ICs9IHMtPmluX2J1ZmZlcl9jb3VudDsKKyAgICAgICAgICAgICAgICBzLT5pbl9idWZmZXJfY291bnQ9MDsKKyAgICAgICAgICAgICAgICBzLT5pbl9idWZmZXJfaW5kZXg9MDsKKyAgICAgICAgICAgICAgICBib3JkZXIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoKHMtPmZsdXNoZWQgfHwgaW5fY291bnQgPiBwYWRsZXNzKSAmJiAhcy0+aW5fYnVmZmVyX2NvdW50KXsKKyAgICAgICAgICAgIHMtPmluX2J1ZmZlcl9pbmRleD0wOworICAgICAgICAgICAgcmV0PSBzLT5yZXNhbXBsZXItPm11bHRpcGxlX3Jlc2FtcGxlKHMtPnJlc2FtcGxlLCAmb3V0LCBvdXRfY291bnQsICZpbiwgRkZNQVgoaW5fY291bnQtcGFkbGVzcywgMCksICZjb25zdW1lZCk7CisgICAgICAgICAgICBvdXRfY291bnQgLT0gcmV0OworICAgICAgICAgICAgcmV0X3N1bSArPSByZXQ7CisgICAgICAgICAgICBidWZfc2V0KCZvdXQsICZvdXQsIHJldCk7CisgICAgICAgICAgICBpbl9jb3VudCAtPSBjb25zdW1lZDsKKyAgICAgICAgICAgIGJ1Zl9zZXQoJmluLCAmaW4sIGNvbnN1bWVkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vVE9ETyBpcyB0aGlzIGNoZWNrIHNhbmUgY29uc2lkZXJpbmcgdGhlIGFkdmFuY2VkIGNvcHkgYXZvaWRhbmNlIGJlbG93CisgICAgICAgIHNpemU9IHMtPmluX2J1ZmZlcl9pbmRleCArIHMtPmluX2J1ZmZlcl9jb3VudCArIGluX2NvdW50OworICAgICAgICBpZiggICBzaXplID4gcy0+aW5fYnVmZmVyLmNvdW50CisgICAgICAgICAgICYmIHMtPmluX2J1ZmZlcl9jb3VudCArIGluX2NvdW50IDw9IHMtPmluX2J1ZmZlcl9pbmRleCl7CisgICAgICAgICAgICBidWZfc2V0KCZ0bXAsICZzLT5pbl9idWZmZXIsIHMtPmluX2J1ZmZlcl9pbmRleCk7CisgICAgICAgICAgICBjb3B5KCZzLT5pbl9idWZmZXIsICZ0bXAsIHMtPmluX2J1ZmZlcl9jb3VudCk7CisgICAgICAgICAgICBzLT5pbl9idWZmZXJfaW5kZXg9MDsKKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIGlmKChyZXQ9c3dyaV9yZWFsbG9jX2F1ZGlvKCZzLT5pbl9idWZmZXIsIHNpemUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZihpbl9jb3VudCl7CisgICAgICAgICAgICBpbnQgY291bnQ9IGluX2NvdW50OworICAgICAgICAgICAgaWYocy0+aW5fYnVmZmVyX2NvdW50ICYmIHMtPmluX2J1ZmZlcl9jb3VudCsyIDwgY291bnQgJiYgb3V0X2NvdW50KSBjb3VudD0gcy0+aW5fYnVmZmVyX2NvdW50KzI7CisKKyAgICAgICAgICAgIGJ1Zl9zZXQoJnRtcCwgJnMtPmluX2J1ZmZlciwgcy0+aW5fYnVmZmVyX2luZGV4ICsgcy0+aW5fYnVmZmVyX2NvdW50KTsKKyAgICAgICAgICAgIGNvcHkoJnRtcCwgJmluLCAvKmluXyovY291bnQpOworICAgICAgICAgICAgcy0+aW5fYnVmZmVyX2NvdW50ICs9IGNvdW50OworICAgICAgICAgICAgaW5fY291bnQgLT0gY291bnQ7CisgICAgICAgICAgICBib3JkZXIgKz0gY291bnQ7CisgICAgICAgICAgICBidWZfc2V0KCZpbiwgJmluLCBjb3VudCk7CisgICAgICAgICAgICBzLT5yZXNhbXBsZV9pbl9jb25zdHJhaW50PSAwOworICAgICAgICAgICAgaWYocy0+aW5fYnVmZmVyX2NvdW50ICE9IGNvdW50IHx8IGluX2NvdW50KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHBhZGxlc3MpIHsKKyAgICAgICAgICAgICAgICBwYWRsZXNzID0gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9d2hpbGUoMSk7CisKKyAgICBzLT5yZXNhbXBsZV9pbl9jb25zdHJhaW50PSAhIW91dF9jb3VudDsKKworICAgIHJldHVybiByZXRfc3VtOworfQorCitzdGF0aWMgaW50IHN3cl9jb252ZXJ0X2ludGVybmFsKHN0cnVjdCBTd3JDb250ZXh0ICpzLCBBdWRpb0RhdGEgKm91dCwgaW50IG91dF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGF0YSAqaW4gLCBpbnQgIGluX2NvdW50KXsKKyAgICBBdWRpb0RhdGEgKnBvc3RpbiwgKm1pZGJ1ZiwgKnByZW91dDsKKyAgICBpbnQgcmV0LyosIGluX21heCovOworICAgIEF1ZGlvRGF0YSBwcmVvdXRfdG1wLCBtaWRidWZfdG1wOworCisgICAgaWYocy0+ZnVsbF9jb252ZXJ0KXsKKyAgICAgICAgYXZfYXNzZXJ0MCghcy0+cmVzYW1wbGUpOworICAgICAgICBzd3JpX2F1ZGlvX2NvbnZlcnQocy0+ZnVsbF9jb252ZXJ0LCBvdXQsIGluLCBpbl9jb3VudCk7CisgICAgICAgIHJldHVybiBvdXRfY291bnQ7CisgICAgfQorCisvLyAgICAgaW5fbWF4PSBvdXRfY291bnQqKGludDY0X3Qpcy0+aW5fc2FtcGxlX3JhdGUgLyBzLT5vdXRfc2FtcGxlX3JhdGUgKyByZXNhbXBsZV9maWx0ZXJfdGFwczsKKy8vICAgICBpbl9jb3VudD0gRkZNSU4oaW5fY291bnQsIGluX2luICsgMiAtIHMtPmhpc3RfYnVmZmVyX2NvdW50KTsKKworICAgIGlmKChyZXQ9c3dyaV9yZWFsbG9jX2F1ZGlvKCZzLT5wb3N0aW4sIGluX2NvdW50KSk8MCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZihzLT5yZXNhbXBsZV9maXJzdCl7CisgICAgICAgIGF2X2Fzc2VydDAocy0+bWlkYnVmLmNoX2NvdW50ID09IHMtPnVzZWRfY2hfY291bnQpOworICAgICAgICBpZigocmV0PXN3cmlfcmVhbGxvY19hdWRpbygmcy0+bWlkYnVmLCBvdXRfY291bnQpKTwwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9ZWxzZXsKKyAgICAgICAgYXZfYXNzZXJ0MChzLT5taWRidWYuY2hfY291bnQgPT0gIHMtPm91dC5jaF9jb3VudCk7CisgICAgICAgIGlmKChyZXQ9c3dyaV9yZWFsbG9jX2F1ZGlvKCZzLT5taWRidWYsICBpbl9jb3VudCkpPDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZigocmV0PXN3cmlfcmVhbGxvY19hdWRpbygmcy0+cHJlb3V0LCBvdXRfY291bnQpKTwwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcG9zdGluPSAmcy0+cG9zdGluOworCisgICAgbWlkYnVmX3RtcD0gcy0+bWlkYnVmOworICAgIG1pZGJ1Zj0gJm1pZGJ1Zl90bXA7CisgICAgcHJlb3V0X3RtcD0gcy0+cHJlb3V0OworICAgIHByZW91dD0gJnByZW91dF90bXA7CisKKyAgICBpZihzLT5pbnRfc2FtcGxlX2ZtdCA9PSBzLT4gaW5fc2FtcGxlX2ZtdCAmJiBzLT5pbi5wbGFuYXIgJiYgIXMtPmNoYW5uZWxfbWFwKQorICAgICAgICBwb3N0aW49IGluOworCisgICAgaWYocy0+cmVzYW1wbGVfZmlyc3QgPyAhcy0+cmVzYW1wbGUgOiAhcy0+cmVtYXRyaXgpCisgICAgICAgIG1pZGJ1Zj0gcG9zdGluOworCisgICAgaWYocy0+cmVzYW1wbGVfZmlyc3QgPyAhcy0+cmVtYXRyaXggOiAhcy0+cmVzYW1wbGUpCisgICAgICAgIHByZW91dD0gbWlkYnVmOworCisgICAgaWYocy0+aW50X3NhbXBsZV9mbXQgPT0gcy0+b3V0X3NhbXBsZV9mbXQgJiYgcy0+b3V0LnBsYW5hcgorICAgICAgICYmICEocy0+b3V0X3NhbXBsZV9mbXQ9PUFWX1NBTVBMRV9GTVRfUzMyUCAmJiAocy0+ZGl0aGVyLm91dHB1dF9zYW1wbGVfYml0cyYzMSkpKXsKKyAgICAgICAgaWYocHJlb3V0PT1pbil7CisgICAgICAgICAgICBvdXRfY291bnQ9IEZGTUlOKG91dF9jb3VudCwgaW5fY291bnQpOyAvL1RPRE8gY2hlY2sgYXQgdGhlIGVuZCBpZiB0aGlzIGlzIG5lZWRlZCBvciByZWR1bmRhbnQKKyAgICAgICAgICAgIGF2X2Fzc2VydDAocy0+aW4ucGxhbmFyKTsgLy93ZSBvbmx5IHN1cHBvcnQgcGxhbmFyIGludGVybmFsbHkgc28gaXQgaGFzIHRvIGJlLCB3ZSBzdXBwb3J0IGNvcHlpbmcgbm9uIHBsYW5hciB0aG91Z2gKKyAgICAgICAgICAgIGNvcHkob3V0LCBpbiwgb3V0X2NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBvdXRfY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihwcmVvdXQ9PXBvc3RpbikgcHJlb3V0PSBtaWRidWY9IHBvc3Rpbj0gb3V0OworICAgICAgICBlbHNlIGlmKHByZW91dD09bWlkYnVmKSBwcmVvdXQ9IG1pZGJ1Zj0gb3V0OworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICBwcmVvdXQ9IG91dDsKKyAgICB9CisKKyAgICBpZihpbiAhPSBwb3N0aW4peworICAgICAgICBzd3JpX2F1ZGlvX2NvbnZlcnQocy0+aW5fY29udmVydCwgcG9zdGluLCBpbiwgaW5fY291bnQpOworICAgIH0KKworICAgIGlmKHMtPnJlc2FtcGxlX2ZpcnN0KXsKKyAgICAgICAgaWYocG9zdGluICE9IG1pZGJ1ZikKKyAgICAgICAgICAgIG91dF9jb3VudD0gcmVzYW1wbGUocywgbWlkYnVmLCBvdXRfY291bnQsIHBvc3RpbiwgaW5fY291bnQpOworICAgICAgICBpZihtaWRidWYgIT0gcHJlb3V0KQorICAgICAgICAgICAgc3dyaV9yZW1hdHJpeChzLCBwcmVvdXQsIG1pZGJ1Ziwgb3V0X2NvdW50LCBwcmVvdXQ9PW91dCk7CisgICAgfWVsc2V7CisgICAgICAgIGlmKHBvc3RpbiAhPSBtaWRidWYpCisgICAgICAgICAgICBzd3JpX3JlbWF0cml4KHMsIG1pZGJ1ZiwgcG9zdGluLCBpbl9jb3VudCwgbWlkYnVmPT1vdXQpOworICAgICAgICBpZihtaWRidWYgIT0gcHJlb3V0KQorICAgICAgICAgICAgb3V0X2NvdW50PSByZXNhbXBsZShzLCBwcmVvdXQsIG91dF9jb3VudCwgbWlkYnVmLCBpbl9jb3VudCk7CisgICAgfQorCisgICAgaWYocHJlb3V0ICE9IG91dCAmJiBvdXRfY291bnQpeworICAgICAgICBBdWRpb0RhdGEgKmNvbnZfc3JjID0gcHJlb3V0OworICAgICAgICBpZihzLT5kaXRoZXIubWV0aG9kKXsKKyAgICAgICAgICAgIGludCBjaDsKKyAgICAgICAgICAgIGludCBkaXRoZXJfY291bnQ9IEZGTUFYKG91dF9jb3VudCwgMTw8MTYpOworCisgICAgICAgICAgICBpZiAocHJlb3V0ID09IGluKSB7CisgICAgICAgICAgICAgICAgY29udl9zcmMgPSAmcy0+ZGl0aGVyLnRlbXA7CisgICAgICAgICAgICAgICAgaWYoKHJldD1zd3JpX3JlYWxsb2NfYXVkaW8oJnMtPmRpdGhlci50ZW1wLCBkaXRoZXJfY291bnQpKTwwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZigocmV0PXN3cmlfcmVhbGxvY19hdWRpbygmcy0+ZGl0aGVyLm5vaXNlLCBkaXRoZXJfY291bnQpKTwwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZihyZXQpCisgICAgICAgICAgICAgICAgZm9yKGNoPTA7IGNoPHMtPmRpdGhlci5ub2lzZS5jaF9jb3VudDsgY2grKykKKyAgICAgICAgICAgICAgICAgICAgc3dyaV9nZXRfZGl0aGVyKHMsIHMtPmRpdGhlci5ub2lzZS5jaFtjaF0sIHMtPmRpdGhlci5ub2lzZS5jb3VudCwgMTIzNDU2Nzg5MTM1Nzk8PGNoLCBzLT5kaXRoZXIubm9pc2UuZm10KTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAocy0+ZGl0aGVyLm5vaXNlLmNoX2NvdW50ID09IHByZW91dC0+Y2hfY291bnQpOworCisgICAgICAgICAgICBpZihzLT5kaXRoZXIubm9pc2VfcG9zICsgb3V0X2NvdW50ID4gcy0+ZGl0aGVyLm5vaXNlLmNvdW50KQorICAgICAgICAgICAgICAgIHMtPmRpdGhlci5ub2lzZV9wb3MgPSAwOworCisgICAgICAgICAgICBpZiAocy0+ZGl0aGVyLm1ldGhvZCA8IFNXUl9ESVRIRVJfTlMpeworICAgICAgICAgICAgICAgIGlmIChzLT5taXhfMl8xX3NpbWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbjE9IG91dF9jb3VudCZ+MTU7CisgICAgICAgICAgICAgICAgICAgIGludCBvZmYgPSBsZW4xICogcHJlb3V0LT5icHM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYobGVuMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihjaD0wOyBjaDxwcmVvdXQtPmNoX2NvdW50OyBjaCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1peF8yXzFfc2ltZChjb252X3NyYy0+Y2hbY2hdLCBwcmVvdXQtPmNoW2NoXSwgcy0+ZGl0aGVyLm5vaXNlLmNoW2NoXSArIHMtPmRpdGhlci5ub2lzZS5icHMgKiBzLT5kaXRoZXIubm9pc2VfcG9zLCBzLT5uYXRpdmVfc2ltZF9vbmUsIDAsIDAsIGxlbjEpOworICAgICAgICAgICAgICAgICAgICBpZihvdXRfY291bnQgIT0gbGVuMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihjaD0wOyBjaDxwcmVvdXQtPmNoX2NvdW50OyBjaCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1peF8yXzFfZihjb252X3NyYy0+Y2hbY2hdICsgb2ZmLCBwcmVvdXQtPmNoW2NoXSArIG9mZiwgcy0+ZGl0aGVyLm5vaXNlLmNoW2NoXSArIHMtPmRpdGhlci5ub2lzZS5icHMgKiBzLT5kaXRoZXIubm9pc2VfcG9zICsgb2ZmICsgbGVuMSwgcy0+bmF0aXZlX29uZSwgMCwgMCwgb3V0X2NvdW50IC0gbGVuMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGNoPTA7IGNoPHByZW91dC0+Y2hfY291bnQ7IGNoKyspCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5taXhfMl8xX2YoY29udl9zcmMtPmNoW2NoXSwgcHJlb3V0LT5jaFtjaF0sIHMtPmRpdGhlci5ub2lzZS5jaFtjaF0gKyBzLT5kaXRoZXIubm9pc2UuYnBzICogcy0+ZGl0aGVyLm5vaXNlX3Bvcywgcy0+bmF0aXZlX29uZSwgMCwgMCwgb3V0X2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaChzLT5pbnRfc2FtcGxlX2ZtdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQIDpzd3JpX25vaXNlX3NoYXBpbmdfaW50MTYocywgY29udl9zcmMsIHByZW91dCwgJnMtPmRpdGhlci5ub2lzZSwgb3V0X2NvdW50KTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMlAgOnN3cmlfbm9pc2Vfc2hhcGluZ19pbnQzMihzLCBjb252X3NyYywgcHJlb3V0LCAmcy0+ZGl0aGVyLm5vaXNlLCBvdXRfY291bnQpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUUCA6c3dyaV9ub2lzZV9zaGFwaW5nX2Zsb2F0KHMsIGNvbnZfc3JjLCBwcmVvdXQsICZzLT5kaXRoZXIubm9pc2UsIG91dF9jb3VudCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQIDpzd3JpX25vaXNlX3NoYXBpbmdfZG91YmxlKHMsY29udl9zcmMsIHByZW91dCwgJnMtPmRpdGhlci5ub2lzZSwgb3V0X2NvdW50KTsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+ZGl0aGVyLm5vaXNlX3BvcyArPSBvdXRfY291bnQ7CisgICAgICAgIH0KKy8vRklYTUUgcGFja2VkIGRvZXNuJ3QgbmVlZCBtb3JlIHRoYW4gMSBjaGFuIGhlcmUhCisgICAgICAgIHN3cmlfYXVkaW9fY29udmVydChzLT5vdXRfY29udmVydCwgb3V0LCBjb252X3NyYywgb3V0X2NvdW50KTsKKyAgICB9CisgICAgcmV0dXJuIG91dF9jb3VudDsKK30KKworaW50IHN3cl9pc19pbml0aWFsaXplZChzdHJ1Y3QgU3dyQ29udGV4dCAqcykgeworICAgIHJldHVybiAhIXMtPmluX2J1ZmZlci5jaF9jb3VudDsKK30KKworaW50IHN3cl9jb252ZXJ0KHN0cnVjdCBTd3JDb250ZXh0ICpzLCB1aW50OF90ICpvdXRfYXJnW1NXUl9DSF9NQVhdLCBpbnQgb3V0X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbl9hcmcgW1NXUl9DSF9NQVhdLCBpbnQgIGluX2NvdW50KXsKKyAgICBBdWRpb0RhdGEgKiBpbj0gJnMtPmluOworICAgIEF1ZGlvRGF0YSAqb3V0PSAmcy0+b3V0OworCisgICAgaWYgKCFzd3JfaXNfaW5pdGlhbGl6ZWQocykpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvbnRleHQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICB3aGlsZShzLT5kcm9wX291dHB1dCA+IDApeworICAgICAgICBpbnQgcmV0OworICAgICAgICB1aW50OF90ICp0bXBfYXJnW1NXUl9DSF9NQVhdOworI2RlZmluZSBNQVhfRFJPUF9TVEVQIDE2Mzg0CisgICAgICAgIGlmKChyZXQ9c3dyaV9yZWFsbG9jX2F1ZGlvKCZzLT5kcm9wX3RlbXAsIEZGTUlOKHMtPmRyb3Bfb3V0cHV0LCBNQVhfRFJPUF9TVEVQKSkpPDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldmVyc2VmaWxsX2F1ZGlvZGF0YSgmcy0+ZHJvcF90ZW1wLCB0bXBfYXJnKTsKKyAgICAgICAgcy0+ZHJvcF9vdXRwdXQgKj0gLTE7IC8vRklYTUUgZmluZCBhIGxlc3MgaGFja2lzaCBzb2x1dGlvbgorICAgICAgICByZXQgPSBzd3JfY29udmVydChzLCB0bXBfYXJnLCBGRk1JTigtcy0+ZHJvcF9vdXRwdXQsIE1BWF9EUk9QX1NURVApLCBpbl9hcmcsIGluX2NvdW50KTsgLy9GSVhNRSBvcHRpbWl6ZSBidXQgdGhpcyBpcyBhcyBnb29kIGFzIG5ldmVyIGNhbGxlZCBzbyBtYXliZSBpdCBkb2Vzbid0IG1hdHRlcgorICAgICAgICBzLT5kcm9wX291dHB1dCAqPSAtMTsKKyAgICAgICAgaW5fY291bnQgPSAwOworICAgICAgICBpZihyZXQ+MCkgeworICAgICAgICAgICAgcy0+ZHJvcF9vdXRwdXQgLT0gcmV0OworICAgICAgICAgICAgaWYgKCFzLT5kcm9wX291dHB1dCAmJiAhb3V0X2FyZykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYXZfYXNzZXJ0MChzLT5kcm9wX291dHB1dCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmKCFpbl9hcmcpeworICAgICAgICBpZihzLT5yZXNhbXBsZSl7CisgICAgICAgICAgICBpZiAoIXMtPmZsdXNoZWQpCisgICAgICAgICAgICAgICAgcy0+cmVzYW1wbGVyLT5mbHVzaChzKTsKKyAgICAgICAgICAgIHMtPnJlc2FtcGxlX2luX2NvbnN0cmFpbnQgPSAwOworICAgICAgICAgICAgcy0+Zmx1c2hlZCA9IDE7CisgICAgICAgIH1lbHNlIGlmKCFzLT5pbl9idWZmZXJfY291bnQpeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9ZWxzZQorICAgICAgICBmaWxsX2F1ZGlvZGF0YShpbiAsICAodm9pZCopaW5fYXJnKTsKKworICAgIGZpbGxfYXVkaW9kYXRhKG91dCwgb3V0X2FyZyk7CisKKyAgICBpZihzLT5yZXNhbXBsZSl7CisgICAgICAgIGludCByZXQgPSBzd3JfY29udmVydF9pbnRlcm5hbChzLCBvdXQsIG91dF9jb3VudCwgaW4sIGluX2NvdW50KTsKKyAgICAgICAgaWYocmV0PjAgJiYgIXMtPmRyb3Bfb3V0cHV0KQorICAgICAgICAgICAgcy0+b3V0cHRzICs9IHJldCAqIChpbnQ2NF90KXMtPmluX3NhbXBsZV9yYXRlOworICAgICAgICByZXR1cm4gcmV0OworICAgIH1lbHNleworICAgICAgICBBdWRpb0RhdGEgdG1wPSAqaW47CisgICAgICAgIGludCByZXQyPTA7CisgICAgICAgIGludCByZXQsIHNpemU7CisgICAgICAgIHNpemUgPSBGRk1JTihvdXRfY291bnQsIHMtPmluX2J1ZmZlcl9jb3VudCk7CisgICAgICAgIGlmKHNpemUpeworICAgICAgICAgICAgYnVmX3NldCgmdG1wLCAmcy0+aW5fYnVmZmVyLCBzLT5pbl9idWZmZXJfaW5kZXgpOworICAgICAgICAgICAgcmV0PSBzd3JfY29udmVydF9pbnRlcm5hbChzLCBvdXQsIHNpemUsICZ0bXAsIHNpemUpOworICAgICAgICAgICAgaWYocmV0PDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHJldDI9IHJldDsKKyAgICAgICAgICAgIHMtPmluX2J1ZmZlcl9jb3VudCAtPSByZXQ7CisgICAgICAgICAgICBzLT5pbl9idWZmZXJfaW5kZXggKz0gcmV0OworICAgICAgICAgICAgYnVmX3NldChvdXQsIG91dCwgcmV0KTsKKyAgICAgICAgICAgIG91dF9jb3VudCAtPSByZXQ7CisgICAgICAgICAgICBpZighcy0+aW5fYnVmZmVyX2NvdW50KQorICAgICAgICAgICAgICAgIHMtPmluX2J1ZmZlcl9pbmRleCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZihpbl9jb3VudCl7CisgICAgICAgICAgICBzaXplPSBzLT5pbl9idWZmZXJfaW5kZXggKyBzLT5pbl9idWZmZXJfY291bnQgKyBpbl9jb3VudCAtIG91dF9jb3VudDsKKworICAgICAgICAgICAgaWYoaW5fY291bnQgPiBvdXRfY291bnQpIHsgLy9GSVhNRSBtb3ZlIGFmdGVyIHN3cl9jb252ZXJ0X2ludGVybmFsCisgICAgICAgICAgICAgICAgaWYoICAgc2l6ZSA+IHMtPmluX2J1ZmZlci5jb3VudAorICAgICAgICAgICAgICAgICYmIHMtPmluX2J1ZmZlcl9jb3VudCArIGluX2NvdW50IC0gb3V0X2NvdW50IDw9IHMtPmluX2J1ZmZlcl9pbmRleCl7CisgICAgICAgICAgICAgICAgICAgIGJ1Zl9zZXQoJnRtcCwgJnMtPmluX2J1ZmZlciwgcy0+aW5fYnVmZmVyX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgY29weSgmcy0+aW5fYnVmZmVyLCAmdG1wLCBzLT5pbl9idWZmZXJfY291bnQpOworICAgICAgICAgICAgICAgICAgICBzLT5pbl9idWZmZXJfaW5kZXg9MDsKKyAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICBpZigocmV0PXN3cmlfcmVhbGxvY19hdWRpbygmcy0+aW5fYnVmZmVyLCBzaXplKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYob3V0X2NvdW50KXsKKyAgICAgICAgICAgICAgICBzaXplID0gRkZNSU4oaW5fY291bnQsIG91dF9jb3VudCk7CisgICAgICAgICAgICAgICAgcmV0PSBzd3JfY29udmVydF9pbnRlcm5hbChzLCBvdXQsIHNpemUsIGluLCBzaXplKTsKKyAgICAgICAgICAgICAgICBpZihyZXQ8MCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBidWZfc2V0KGluLCBpbiwgcmV0KTsKKyAgICAgICAgICAgICAgICBpbl9jb3VudCAtPSByZXQ7CisgICAgICAgICAgICAgICAgcmV0MiArPSByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihpbl9jb3VudCl7CisgICAgICAgICAgICAgICAgYnVmX3NldCgmdG1wLCAmcy0+aW5fYnVmZmVyLCBzLT5pbl9idWZmZXJfaW5kZXggKyBzLT5pbl9idWZmZXJfY291bnQpOworICAgICAgICAgICAgICAgIGNvcHkoJnRtcCwgaW4sIGluX2NvdW50KTsKKyAgICAgICAgICAgICAgICBzLT5pbl9idWZmZXJfY291bnQgKz0gaW5fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYocmV0Mj4wICYmICFzLT5kcm9wX291dHB1dCkKKyAgICAgICAgICAgIHMtPm91dHB0cyArPSByZXQyICogKGludDY0X3Qpcy0+aW5fc2FtcGxlX3JhdGU7CisgICAgICAgIHJldHVybiByZXQyOworICAgIH0KK30KKworaW50IHN3cl9kcm9wX291dHB1dChzdHJ1Y3QgU3dyQ29udGV4dCAqcywgaW50IGNvdW50KXsKKyAgICBjb25zdCB1aW50OF90ICp0bXBfYXJnW1NXUl9DSF9NQVhdOworICAgIHMtPmRyb3Bfb3V0cHV0ICs9IGNvdW50OworCisgICAgaWYocy0+ZHJvcF9vdXRwdXQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJkaXNjYXJkaW5nICVkIGF1ZGlvIHNhbXBsZXNcbiIsIGNvdW50KTsKKyAgICByZXR1cm4gc3dyX2NvbnZlcnQocywgTlVMTCwgcy0+ZHJvcF9vdXRwdXQsIHRtcF9hcmcsIDApOworfQorCitpbnQgc3dyX2luamVjdF9zaWxlbmNlKHN0cnVjdCBTd3JDb250ZXh0ICpzLCBpbnQgY291bnQpeworICAgIGludCByZXQsIGk7CisgICAgdWludDhfdCAqdG1wX2FyZ1tTV1JfQ0hfTUFYXTsKKworICAgIGlmKGNvdW50IDw9IDApCisgICAgICAgIHJldHVybiAwOworCisjZGVmaW5lIE1BWF9TSUxFTkNFX1NURVAgMTYzODQKKyAgICB3aGlsZSAoY291bnQgPiBNQVhfU0lMRU5DRV9TVEVQKSB7CisgICAgICAgIGlmICgocmV0ID0gc3dyX2luamVjdF9zaWxlbmNlKHMsIE1BWF9TSUxFTkNFX1NURVApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBjb3VudCAtPSBNQVhfU0lMRU5DRV9TVEVQOworICAgIH0KKworICAgIGlmKChyZXQ9c3dyaV9yZWFsbG9jX2F1ZGlvKCZzLT5zaWxlbmNlLCBjb3VudCkpPDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZihzLT5zaWxlbmNlLnBsYW5hcikgZm9yKGk9MDsgaTxzLT5zaWxlbmNlLmNoX2NvdW50OyBpKyspIHsKKyAgICAgICAgbWVtc2V0KHMtPnNpbGVuY2UuY2hbaV0sIHMtPnNpbGVuY2UuYnBzPT0xID8gMHg4MCA6IDAsIGNvdW50KnMtPnNpbGVuY2UuYnBzKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbWVtc2V0KHMtPnNpbGVuY2UuY2hbMF0sIHMtPnNpbGVuY2UuYnBzPT0xID8gMHg4MCA6IDAsIGNvdW50KnMtPnNpbGVuY2UuYnBzKnMtPnNpbGVuY2UuY2hfY291bnQpOworCisgICAgcmV2ZXJzZWZpbGxfYXVkaW9kYXRhKCZzLT5zaWxlbmNlLCB0bXBfYXJnKTsKKyAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJhZGRpbmcgJWQgYXVkaW8gc2FtcGxlcyBvZiBzaWxlbmNlXG4iLCBjb3VudCk7CisgICAgcmV0ID0gc3dyX2NvbnZlcnQocywgTlVMTCwgMCwgKGNvbnN0IHVpbnQ4X3QqKil0bXBfYXJnLCBjb3VudCk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50NjRfdCBzd3JfZ2V0X2RlbGF5KHN0cnVjdCBTd3JDb250ZXh0ICpzLCBpbnQ2NF90IGJhc2UpeworICAgIGlmIChzLT5yZXNhbXBsZXIgJiYgcy0+cmVzYW1wbGUpeworICAgICAgICByZXR1cm4gcy0+cmVzYW1wbGVyLT5nZXRfZGVsYXkocywgYmFzZSk7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiAocy0+aW5fYnVmZmVyX2NvdW50KmJhc2UgKyAocy0+aW5fc2FtcGxlX3JhdGU+PjEpKS8gcy0+aW5fc2FtcGxlX3JhdGU7CisgICAgfQorfQorCitpbnQgc3dyX3NldF9jb21wZW5zYXRpb24oc3RydWN0IFN3ckNvbnRleHQgKnMsIGludCBzYW1wbGVfZGVsdGEsIGludCBjb21wZW5zYXRpb25fZGlzdGFuY2UpeworICAgIGludCByZXQ7CisKKyAgICBpZiAoIXMgfHwgY29tcGVuc2F0aW9uX2Rpc3RhbmNlIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBpZiAoIWNvbXBlbnNhdGlvbl9kaXN0YW5jZSAmJiBzYW1wbGVfZGVsdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKCFzLT5yZXNhbXBsZSkgeworICAgICAgICBzLT5mbGFncyB8PSBTV1JfRkxBR19SRVNBTVBMRTsKKyAgICAgICAgcmV0ID0gc3dyX2luaXQocyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKCFzLT5yZXNhbXBsZXItPnNldF9jb21wZW5zYXRpb24peworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH1lbHNleworICAgICAgICByZXR1cm4gcy0+cmVzYW1wbGVyLT5zZXRfY29tcGVuc2F0aW9uKHMtPnJlc2FtcGxlLCBzYW1wbGVfZGVsdGEsIGNvbXBlbnNhdGlvbl9kaXN0YW5jZSk7CisgICAgfQorfQorCitpbnQ2NF90IHN3cl9uZXh0X3B0cyhzdHJ1Y3QgU3dyQ29udGV4dCAqcywgaW50NjRfdCBwdHMpeworICAgIGlmKHB0cyA9PSBJTlQ2NF9NSU4pCisgICAgICAgIHJldHVybiBzLT5vdXRwdHM7CisKKyAgICBpZiAocy0+Zmlyc3RwdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHMtPm91dHB0cyA9IHMtPmZpcnN0cHRzID0gcHRzOworCisgICAgaWYocy0+bWluX2NvbXBlbnNhdGlvbiA+PSBGTFRfTUFYKSB7CisgICAgICAgIHJldHVybiAocy0+b3V0cHRzID0gcHRzIC0gc3dyX2dldF9kZWxheShzLCBzLT5pbl9zYW1wbGVfcmF0ZSAqIChpbnQ2NF90KXMtPm91dF9zYW1wbGVfcmF0ZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgZGVsdGEgPSBwdHMgLSBzd3JfZ2V0X2RlbGF5KHMsIHMtPmluX3NhbXBsZV9yYXRlICogKGludDY0X3Qpcy0+b3V0X3NhbXBsZV9yYXRlKSAtIHMtPm91dHB0cyArIHMtPmRyb3Bfb3V0cHV0KihpbnQ2NF90KXMtPmluX3NhbXBsZV9yYXRlOworICAgICAgICBkb3VibGUgZmRlbHRhID0gZGVsdGEgLyhkb3VibGUpKHMtPmluX3NhbXBsZV9yYXRlICogKGludDY0X3Qpcy0+b3V0X3NhbXBsZV9yYXRlKTsKKworICAgICAgICBpZihmYWJzKGZkZWx0YSkgPiBzLT5taW5fY29tcGVuc2F0aW9uKSB7CisgICAgICAgICAgICBpZihzLT5vdXRwdHMgPT0gcy0+Zmlyc3RwdHMgfHwgZmFicyhmZGVsdGEpID4gcy0+bWluX2hhcmRfY29tcGVuc2F0aW9uKXsKKyAgICAgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgICAgIGlmKGRlbHRhID4gMCkgcmV0ID0gc3dyX2luamVjdF9zaWxlbmNlKHMsICBkZWx0YSAvIHMtPm91dF9zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICByZXQgPSBzd3JfZHJvcF9vdXRwdXQgICAocywgLWRlbHRhIC8gcy0+IGluX3NhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBpZihyZXQ8MCl7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY29tcGVuc2F0ZSBmb3IgdGltZXN0YW1wIGRlbHRhIG9mICVmXG4iLCBmZGVsdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZihzLT5zb2Z0X2NvbXBlbnNhdGlvbl9kdXJhdGlvbiAmJiBzLT5tYXhfc29mdF9jb21wZW5zYXRpb24pIHsKKyAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb24gPSBzLT5vdXRfc2FtcGxlX3JhdGUgKiBzLT5zb2Z0X2NvbXBlbnNhdGlvbl9kdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBkb3VibGUgbWF4X3NvZnRfY29tcGVuc2F0aW9uID0gcy0+bWF4X3NvZnRfY29tcGVuc2F0aW9uIC8gKHMtPm1heF9zb2Z0X2NvbXBlbnNhdGlvbiA8IDAgPyAtcy0+aW5fc2FtcGxlX3JhdGUgOiAxKTsKKyAgICAgICAgICAgICAgICBpbnQgY29tcCA9IGF2X2NsaXBmKGZkZWx0YSwgLW1heF9zb2Z0X2NvbXBlbnNhdGlvbiwgbWF4X3NvZnRfY29tcGVuc2F0aW9uKSAqIGR1cmF0aW9uIDsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJjb21wZW5zYXRpbmcgYXVkaW8gdGltZXN0YW1wIGRyaWZ0OiVmIGNvbXBlbnNhdGlvbjolZCBpbjolZFxuIiwgZmRlbHRhLCBjb21wLCBkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgc3dyX3NldF9jb21wZW5zYXRpb24ocywgY29tcCwgZHVyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHMtPm91dHB0czsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmggYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2NTZhNgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUuaApAQCAtMCwwICsxLDUzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIE1pY2hhZWwgTmllZGVybWF5ZXIgKG1pY2hhZWxuaUBnbXguYXQpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGlic3dyZXNhbXBsZQorICoKKyAqIGxpYnN3cmVzYW1wbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIGxpYnN3cmVzYW1wbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggbGlic3dyZXNhbXBsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgU1dSRVNBTVBMRV9TV1JFU0FNUExFX0gKKyNkZWZpbmUgU1dSRVNBTVBMRV9TV1JFU0FNUExFX0gKKworLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbHN3cgorICogbGlic3dyZXNhbXBsZSBwdWJsaWMgaGVhZGVyCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbHN3ciBMaWJzd3Jlc2FtcGxlCisgKiBAeworICoKKyAqIExpYnN3cmVzYW1wbGUgKGxzd3IpIGlzIGEgbGlicmFyeSB0aGF0IGhhbmRsZXMgYXVkaW8gcmVzYW1wbGluZywgc2FtcGxlCisgKiBmb3JtYXQgY29udmVyc2lvbiBhbmQgbWl4aW5nLgorICoKKyAqIEludGVyYWN0aW9uIHdpdGggbHN3ciBpcyBkb25lIHRocm91Z2ggU3dyQ29udGV4dCwgd2hpY2ggaXMKKyAqIGFsbG9jYXRlZCB3aXRoIHN3cl9hbGxvYygpIG9yIHN3cl9hbGxvY19zZXRfb3B0cygpLiBJdCBpcyBvcGFxdWUsIHNvIGFsbCBwYXJhbWV0ZXJzCisgKiBtdXN0IGJlIHNldCB3aXRoIHRoZSBAcmVmIGF2b3B0aW9ucyBBUEkuCisgKgorICogVGhlIGZpcnN0IHRoaW5nIHlvdSB3aWxsIG5lZWQgdG8gZG8gaW4gb3JkZXIgdG8gdXNlIGxzd3IgaXMgdG8gYWxsb2NhdGUKKyAqIFN3ckNvbnRleHQuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCBzd3JfYWxsb2MoKSBvciBzd3JfYWxsb2Nfc2V0X29wdHMoKS4gSWYgeW91CisgKiBhcmUgdXNpbmcgdGhlIGZvcm1lciwgeW91IG11c3Qgc2V0IG9wdGlvbnMgdGhyb3VnaCB0aGUgQHJlZiBhdm9wdGlvbnMgQVBJLgorICogVGhlIGxhdHRlciBmdW5jdGlvbiBwcm92aWRlcyB0aGUgc2FtZSBmZWF0dXJlLCBidXQgaXQgYWxsb3dzIHlvdSB0byBzZXQgc29tZQorICogY29tbW9uIG9wdGlvbnMgaW4gdGhlIHNhbWUgc3RhdGVtZW50LgorICoKKyAqIEZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHNldHVwIGNvbnZlcnNpb24gZnJvbSBwbGFuYXIgZmxvYXQgc2FtcGxlCisgKiBmb3JtYXQgdG8gaW50ZXJsZWF2ZWQgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyLCBkb3duc2FtcGxpbmcgZnJvbSA0OGtIeiB0bworICogNDQuMWtIeiBhbmQgZG93bm1peGluZyBmcm9tIDUuMSBjaGFubmVscyB0byBzdGVyZW8gKHVzaW5nIHRoZSBkZWZhdWx0IG1peGluZworICogbWF0cml4KS4gVGhpcyBpcyB1c2luZyB0aGUgc3dyX2FsbG9jKCkgZnVuY3Rpb24uCisgKiBAY29kZQorICogU3dyQ29udGV4dCAqc3dyID0gc3dyX2FsbG9jKCk7CisgKiBhdl9vcHRfc2V0X2NoYW5uZWxfbGF5b3V0KHN3ciwgImluX2NoYW5uZWxfbGF5b3V0IiwgIEFWX0NIX0xBWU9VVF81UE9JTlQxLCAwKTsKKyAqIGF2X29wdF9zZXRfY2hhbm5lbF9sYXlvdXQoc3dyLCAib3V0X2NoYW5uZWxfbGF5b3V0IiwgQVZfQ0hfTEFZT1VUX1NURVJFTywgIDApOworICogYXZfb3B0X3NldF9pbnQoc3dyLCAiaW5fc2FtcGxlX3JhdGUiLCAgICAgNDgwMDAsICAgICAgICAgICAgICAgIDApOworICogYXZfb3B0X3NldF9pbnQoc3dyLCAib3V0X3NhbXBsZV9yYXRlIiwgICAgNDQxMDAsICAgICAgICAgICAgICAgIDApOworICogYXZfb3B0X3NldF9zYW1wbGVfZm10KHN3ciwgImluX3NhbXBsZV9mbXQiLCAgQVZfU0FNUExFX0ZNVF9GTFRQLCAwKTsKKyAqIGF2X29wdF9zZXRfc2FtcGxlX2ZtdChzd3IsICJvdXRfc2FtcGxlX2ZtdCIsIEFWX1NBTVBMRV9GTVRfUzE2LCAgMCk7CisgKiBAZW5kY29kZQorICoKKyAqIFRoZSBzYW1lIGpvYiBjYW4gYmUgZG9uZSB1c2luZyBzd3JfYWxsb2Nfc2V0X29wdHMoKSBhcyB3ZWxsOgorICogQGNvZGUKKyAqIFN3ckNvbnRleHQgKnN3ciA9IHN3cl9hbGxvY19zZXRfb3B0cyhOVUxMLCAgLy8gd2UncmUgYWxsb2NhdGluZyBhIG5ldyBjb250ZXh0CisgKiAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywgIC8vIG91dF9jaF9sYXlvdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwgICAgLy8gb3V0X3NhbXBsZV9mbXQKKyAqICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwgICAgICAgICAgICAgICAgLy8gb3V0X3NhbXBsZV9yYXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDEsIC8vIGluX2NoX2xheW91dAorICogICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxUUCwgICAvLyBpbl9zYW1wbGVfZm10CisgKiAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsICAgICAgICAgICAgICAgIC8vIGluX3NhbXBsZV9yYXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8vIGxvZ19vZmZzZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgICAgICAgLy8gbG9nX2N0eAorICogQGVuZGNvZGUKKyAqCisgKiBPbmNlIGFsbCB2YWx1ZXMgaGF2ZSBiZWVuIHNldCwgaXQgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIHN3cl9pbml0KCkuIElmCisgKiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIGNvbnZlcnNpb24gcGFyYW1ldGVycywgeW91IGNhbiBjaGFuZ2UgdGhlIHBhcmFtZXRlcnMKKyAqIHVzaW5nIEByZWYgQVZPcHRpb25zLCBhcyBkZXNjcmliZWQgYWJvdmUgaW4gdGhlIGZpcnN0IGV4YW1wbGU7IG9yIGJ5IHVzaW5nCisgKiBzd3JfYWxsb2Nfc2V0X29wdHMoKSwgYnV0IHdpdGggdGhlIGZpcnN0IGFyZ3VtZW50IHRoZSBhbGxvY2F0ZWQgY29udGV4dC4KKyAqIFlvdSBtdXN0IHRoZW4gY2FsbCBzd3JfaW5pdCgpIGFnYWluLgorICoKKyAqIFRoZSBjb252ZXJzaW9uIGl0c2VsZiBpcyBkb25lIGJ5IHJlcGVhdGVkbHkgY2FsbGluZyBzd3JfY29udmVydCgpLgorICogTm90ZSB0aGF0IHRoZSBzYW1wbGVzIG1heSBnZXQgYnVmZmVyZWQgaW4gc3dyIGlmIHlvdSBwcm92aWRlIGluc3VmZmljaWVudAorICogb3V0cHV0IHNwYWNlIG9yIGlmIHNhbXBsZSByYXRlIGNvbnZlcnNpb24gaXMgZG9uZSwgd2hpY2ggcmVxdWlyZXMgImZ1dHVyZSIKKyAqIHNhbXBsZXMuIFNhbXBsZXMgdGhhdCBkbyBub3QgcmVxdWlyZSBmdXR1cmUgaW5wdXQgY2FuIGJlIHJldHJpZXZlZCBhdCBhbnkKKyAqIHRpbWUgYnkgdXNpbmcgc3dyX2NvbnZlcnQoKSAoaW5fY291bnQgY2FuIGJlIHNldCB0byAwKS4KKyAqIEF0IHRoZSBlbmQgb2YgY29udmVyc2lvbiB0aGUgcmVzYW1wbGluZyBidWZmZXIgY2FuIGJlIGZsdXNoZWQgYnkgY2FsbGluZworICogc3dyX2NvbnZlcnQoKSB3aXRoIE5VTEwgaW4gYW5kIDAgaW5fY291bnQuCisgKgorICogVGhlIHNhbXBsZXMgdXNlZCBpbiB0aGUgY29udmVyc2lvbiBwcm9jZXNzIGNhbiBiZSBtYW5hZ2VkIHdpdGggdGhlIGxpYmF2dXRpbAorICogQHJlZiBsYXZ1X3NhbXBtYW5pcCAic2FtcGxlcyBtYW5pcHVsYXRpb24iIEFQSSwgaW5jbHVkaW5nIGF2X3NhbXBsZXNfYWxsb2MoKQorICogZnVuY3Rpb24gdXNlZCBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCisgKgorICogVGhlIGRlbGF5IGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCwgY2FuIGF0IGFueSB0aW1lIGJlIGZvdW5kIGJ5IHVzaW5nCisgKiBzd3JfZ2V0X2RlbGF5KCkuCisgKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGRlbW9uc3RyYXRlcyB0aGUgY29udmVyc2lvbiBsb29wIGFzc3VtaW5nIHRoZSBwYXJhbWV0ZXJzCisgKiBmcm9tIGFib3ZlIGFuZCBjYWxsZXItZGVmaW5lZCBmdW5jdGlvbnMgZ2V0X2lucHV0KCkgYW5kIGhhbmRsZV9vdXRwdXQoKToKKyAqIEBjb2RlCisgKiB1aW50OF90ICoqaW5wdXQ7CisgKiBpbnQgaW5fc2FtcGxlczsKKyAqCisgKiB3aGlsZSAoZ2V0X2lucHV0KCZpbnB1dCwgJmluX3NhbXBsZXMpKSB7CisgKiAgICAgdWludDhfdCAqb3V0cHV0OworICogICAgIGludCBvdXRfc2FtcGxlcyA9IGF2X3Jlc2NhbGVfcm5kKHN3cl9nZXRfZGVsYXkoc3dyLCA0ODAwMCkgKworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3NhbXBsZXMsIDQ0MTAwLCA0ODAwMCwgQVZfUk9VTkRfVVApOworICogICAgIGF2X3NhbXBsZXNfYWxsb2MoJm91dHB1dCwgTlVMTCwgMiwgb3V0X3NhbXBsZXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwgMCk7CisgKiAgICAgb3V0X3NhbXBsZXMgPSBzd3JfY29udmVydChzd3IsICZvdXRwdXQsIG91dF9zYW1wbGVzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBpbl9zYW1wbGVzKTsKKyAqICAgICBoYW5kbGVfb3V0cHV0KG91dHB1dCwgb3V0X3NhbXBsZXMpOworICogICAgIGF2X2ZyZWVwKCZvdXRwdXQpOworICogfQorICogQGVuZGNvZGUKKyAqCisgKiBXaGVuIHRoZSBjb252ZXJzaW9uIGlzIGZpbmlzaGVkLCB0aGUgY29udmVyc2lvbgorICogY29udGV4dCBhbmQgZXZlcnl0aGluZyBhc3NvY2lhdGVkIHdpdGggaXQgbXVzdCBiZSBmcmVlZCB3aXRoIHN3cl9mcmVlKCkuCisgKiBBIHN3cl9jbG9zZSgpIGZ1bmN0aW9uIGlzIGFsc28gYXZhaWxhYmxlLCBidXQgaXQgZXhpc3RzIG1haW5seSBmb3IKKyAqIGNvbXBhdGliaWxpdHkgd2l0aCBsaWJhdnJlc2FtcGxlLCBhbmQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIGNhbGxlZC4KKyAqCisgKiBUaGVyZSB3aWxsIGJlIG5vIG1lbW9yeSBsZWFrIGlmIHRoZSBkYXRhIGlzIG5vdCBjb21wbGV0ZWx5IGZsdXNoZWQgYmVmb3JlCisgKiBzd3JfZnJlZSgpLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisKKyNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL3ZlcnNpb24uaCIKKworI2lmIExJQlNXUkVTQU1QTEVfVkVSU0lPTl9NQUpPUiA8IDEKKyNkZWZpbmUgU1dSX0NIX01BWCAzMiAgIC8vLzwgTWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMKKyNlbmRpZgorCisvKioKKyAqIEBuYW1lIE9wdGlvbiBjb25zdGFudHMKKyAqIFRoZXNlIGNvbnN0YW50cyBhcmUgdXNlZCBmb3IgdGhlIEByZWYgYXZvcHRpb25zIGludGVyZmFjZSBmb3IgbHN3ci4KKyAqIEB7CisgKgorICovCisKKyNkZWZpbmUgU1dSX0ZMQUdfUkVTQU1QTEUgMSAvLy88IEZvcmNlIHJlc2FtcGxpbmcgZXZlbiBpZiBlcXVhbCBzYW1wbGUgcmF0ZQorLy9UT0RPIHVzZSBpbnQgcmVzYW1wbGUgPworLy9sb25nIHRlcm0gVE9ETyBjYW4gd2UgZW5hYmxlIHRoaXMgZHluYW1pY2FsbHk/CisKKy8qKiBEaXRoZXJpbmcgYWxnb3JpdGhtcyAqLworZW51bSBTd3JEaXRoZXJUeXBlIHsKKyAgICBTV1JfRElUSEVSX05PTkUgPSAwLAorICAgIFNXUl9ESVRIRVJfUkVDVEFOR1VMQVIsCisgICAgU1dSX0RJVEhFUl9UUklBTkdVTEFSLAorICAgIFNXUl9ESVRIRVJfVFJJQU5HVUxBUl9ISUdIUEFTUywKKworICAgIFNXUl9ESVRIRVJfTlMgPSA2NCwgICAgICAgICAvLy88IG5vdCBwYXJ0IG9mIEFQSS9BQkkKKyAgICBTV1JfRElUSEVSX05TX0xJUFNISVRaLAorICAgIFNXUl9ESVRIRVJfTlNfRl9XRUlHSFRFRCwKKyAgICBTV1JfRElUSEVSX05TX01PRElGSUVEX0VfV0VJR0hURUQsCisgICAgU1dSX0RJVEhFUl9OU19JTVBST1ZFRF9FX1dFSUdIVEVELAorICAgIFNXUl9ESVRIRVJfTlNfU0hJQkFUQSwKKyAgICBTV1JfRElUSEVSX05TX0xPV19TSElCQVRBLAorICAgIFNXUl9ESVRIRVJfTlNfSElHSF9TSElCQVRBLAorICAgIFNXUl9ESVRIRVJfTkIsICAgICAgICAgICAgICAvLy88IG5vdCBwYXJ0IG9mIEFQSS9BQkkKK307CisKKy8qKiBSZXNhbXBsaW5nIEVuZ2luZXMgKi8KK2VudW0gU3dyRW5naW5lIHsKKyAgICBTV1JfRU5HSU5FX1NXUiwgICAgICAgICAgICAgLyoqPCBTVyBSZXNhbXBsZXIgKi8KKyAgICBTV1JfRU5HSU5FX1NPWFIsICAgICAgICAgICAgLyoqPCBTb1ggUmVzYW1wbGVyICovCisgICAgU1dSX0VOR0lORV9OQiwgICAgICAgICAgICAgIC8vLzwgbm90IHBhcnQgb2YgQVBJL0FCSQorfTsKKworLyoqIFJlc2FtcGxpbmcgRmlsdGVyIFR5cGVzICovCitlbnVtIFN3ckZpbHRlclR5cGUgeworICAgIFNXUl9GSUxURVJfVFlQRV9DVUJJQywgICAgICAgICAgICAgIC8qKjwgQ3ViaWMgKi8KKyAgICBTV1JfRklMVEVSX1RZUEVfQkxBQ0tNQU5fTlVUVEFMTCwgICAvKio8IEJsYWNrbWFuIE51dHRhbGwgV2luZG93ZWQgU2luYyAqLworICAgIFNXUl9GSUxURVJfVFlQRV9LQUlTRVIsICAgICAgICAgICAgIC8qKjwgS2Fpc2VyIFdpbmRvd2VkIFNpbmMgKi8KK307CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIFRoZSBsaWJzd3Jlc2FtcGxlIGNvbnRleHQuIFVubGlrZSBsaWJhdmNvZGVjIGFuZCBsaWJhdmZvcm1hdCwgdGhpcyBzdHJ1Y3R1cmUKKyAqIGlzIG9wYXF1ZS4gVGhpcyBtZWFucyB0aGF0IGlmIHlvdSB3b3VsZCBsaWtlIHRvIHNldCBvcHRpb25zLCB5b3UgbXVzdCB1c2UKKyAqIHRoZSBAcmVmIGF2b3B0aW9ucyBBUEkgYW5kIGNhbm5vdCBkaXJlY3RseSBzZXQgdmFsdWVzIHRvIG1lbWJlcnMgb2YgdGhlCisgKiBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IFN3ckNvbnRleHQgU3dyQ29udGV4dDsKKworLyoqCisgKiBHZXQgdGhlIEFWQ2xhc3MgZm9yIFN3ckNvbnRleHQuIEl0IGNhbiBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgKKyAqIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkogZm9yIGV4YW1pbmluZyBvcHRpb25zLgorICoKKyAqIEBzZWUgYXZfb3B0X2ZpbmQoKS4KKyAqIEByZXR1cm4gdGhlIEFWQ2xhc3Mgb2YgU3dyQ29udGV4dAorICovCitjb25zdCBBVkNsYXNzICpzd3JfZ2V0X2NsYXNzKHZvaWQpOworCisvKioKKyAqIEBuYW1lIFN3ckNvbnRleHQgY29uc3RydWN0b3IgZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICogQWxsb2NhdGUgU3dyQ29udGV4dC4KKyAqCisgKiBJZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24geW91IHdpbGwgbmVlZCB0byBzZXQgdGhlIHBhcmFtZXRlcnMgKG1hbnVhbGx5IG9yCisgKiB3aXRoIHN3cl9hbGxvY19zZXRfb3B0cygpKSBiZWZvcmUgY2FsbGluZyBzd3JfaW5pdCgpLgorICoKKyAqIEBzZWUgc3dyX2FsbG9jX3NldF9vcHRzKCksIHN3cl9pbml0KCksIHN3cl9mcmVlKCkKKyAqIEByZXR1cm4gTlVMTCBvbiBlcnJvciwgYWxsb2NhdGVkIGNvbnRleHQgb3RoZXJ3aXNlCisgKi8KK3N0cnVjdCBTd3JDb250ZXh0ICpzd3JfYWxsb2Modm9pZCk7CisKKy8qKgorICogSW5pdGlhbGl6ZSBjb250ZXh0IGFmdGVyIHVzZXIgcGFyYW1ldGVycyBoYXZlIGJlZW4gc2V0LgorICogQG5vdGUgVGhlIGNvbnRleHQgbXVzdCBiZSBjb25maWd1cmVkIHVzaW5nIHRoZSBBVk9wdGlvbiBBUEkuCisgKgorICogQHNlZSBhdl9vcHRfc2V0X2ludCgpCisgKiBAc2VlIGF2X29wdF9zZXRfZGljdCgpCisgKgorICogQHBhcmFtW2luLG91dF0gICBzIFN3ciBjb250ZXh0IHRvIGluaXRpYWxpemUKKyAqIEByZXR1cm4gQVZFUlJPUiBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHN3cl9pbml0KHN0cnVjdCBTd3JDb250ZXh0ICpzKTsKKworLyoqCisgKiBDaGVjayB3aGV0aGVyIGFuIHN3ciBjb250ZXh0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9yIG5vdC4KKyAqCisgKiBAcGFyYW1baW5dICAgICAgIHMgU3dyIGNvbnRleHQgdG8gY2hlY2sKKyAqIEBzZWUgc3dyX2luaXQoKQorICogQHJldHVybiBwb3NpdGl2ZSBpZiBpdCBoYXMgYmVlbiBpbml0aWFsaXplZCwgMCBpZiBub3QgaW5pdGlhbGl6ZWQKKyAqLworaW50IHN3cl9pc19pbml0aWFsaXplZChzdHJ1Y3QgU3dyQ29udGV4dCAqcyk7CisKKy8qKgorICogQWxsb2NhdGUgU3dyQ29udGV4dCBpZiBuZWVkZWQgYW5kIHNldC9yZXNldCBjb21tb24gcGFyYW1ldGVycy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlcXVpcmUgcyB0byBiZSBhbGxvY2F0ZWQgd2l0aCBzd3JfYWxsb2MoKS4gT24gdGhlCisgKiBvdGhlciBoYW5kLCBzd3JfYWxsb2MoKSBjYW4gdXNlIHN3cl9hbGxvY19zZXRfb3B0cygpIHRvIHNldCB0aGUgcGFyYW1ldGVycworICogb24gdGhlIGFsbG9jYXRlZCBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBzICAgICAgICAgICAgICAgZXhpc3RpbmcgU3dyIGNvbnRleHQgaWYgYXZhaWxhYmxlLCBvciBOVUxMIGlmIG5vdAorICogQHBhcmFtIG91dF9jaF9sYXlvdXQgICBvdXRwdXQgY2hhbm5lbCBsYXlvdXQgKEFWX0NIX0xBWU9VVF8qKQorICogQHBhcmFtIG91dF9zYW1wbGVfZm10ICBvdXRwdXQgc2FtcGxlIGZvcm1hdCAoQVZfU0FNUExFX0ZNVF8qKS4KKyAqIEBwYXJhbSBvdXRfc2FtcGxlX3JhdGUgb3V0cHV0IHNhbXBsZSByYXRlIChmcmVxdWVuY3kgaW4gSHopCisgKiBAcGFyYW0gaW5fY2hfbGF5b3V0ICAgIGlucHV0IGNoYW5uZWwgbGF5b3V0IChBVl9DSF9MQVlPVVRfKikKKyAqIEBwYXJhbSBpbl9zYW1wbGVfZm10ICAgaW5wdXQgc2FtcGxlIGZvcm1hdCAoQVZfU0FNUExFX0ZNVF8qKS4KKyAqIEBwYXJhbSBpbl9zYW1wbGVfcmF0ZSAgaW5wdXQgc2FtcGxlIHJhdGUgKGZyZXF1ZW5jeSBpbiBIeikKKyAqIEBwYXJhbSBsb2dfb2Zmc2V0ICAgICAgbG9nZ2luZyBsZXZlbCBvZmZzZXQKKyAqIEBwYXJhbSBsb2dfY3R4ICAgICAgICAgcGFyZW50IGxvZ2dpbmcgY29udGV4dCwgY2FuIGJlIE5VTEwKKyAqCisgKiBAc2VlIHN3cl9pbml0KCksIHN3cl9mcmVlKCkKKyAqIEByZXR1cm4gTlVMTCBvbiBlcnJvciwgYWxsb2NhdGVkIGNvbnRleHQgb3RoZXJ3aXNlCisgKi8KK3N0cnVjdCBTd3JDb250ZXh0ICpzd3JfYWxsb2Nfc2V0X29wdHMoc3RydWN0IFN3ckNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb3V0X2NoX2xheW91dCwgZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfc2FtcGxlX2ZtdCwgaW50IG91dF9zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAgaW5fY2hfbGF5b3V0LCBlbnVtIEFWU2FtcGxlRm9ybWF0ICBpbl9zYW1wbGVfZm10LCBpbnQgIGluX3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nX29mZnNldCwgdm9pZCAqbG9nX2N0eCk7CisKKy8qKgorICogQH0KKyAqCisgKiBAbmFtZSBTd3JDb250ZXh0IGRlc3RydWN0b3IgZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICogRnJlZSB0aGUgZ2l2ZW4gU3dyQ29udGV4dCBhbmQgc2V0IHRoZSBwb2ludGVyIHRvIE5VTEwuCisgKgorICogQHBhcmFtW2luXSBzIGEgcG9pbnRlciB0byBhIHBvaW50ZXIgdG8gU3dyIGNvbnRleHQKKyAqLwordm9pZCBzd3JfZnJlZShzdHJ1Y3QgU3dyQ29udGV4dCAqKnMpOworCisvKioKKyAqIENsb3NlcyB0aGUgY29udGV4dCBzbyB0aGF0IHN3cl9pc19pbml0aWFsaXplZCgpIHJldHVybnMgMC4KKyAqCisgKiBUaGUgY29udGV4dCBjYW4gYmUgYnJvdWdodCBiYWNrIHRvIGxpZmUgYnkgcnVubmluZyBzd3JfaW5pdCgpLAorICogc3dyX2luaXQoKSBjYW4gYWxzbyBiZSB1c2VkIHdpdGhvdXQgc3dyX2Nsb3NlKCkuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSBwcm92aWRlZCBmb3Igc2ltcGxpZnlpbmcgdGhlIHVzZWNhc2UKKyAqIHdoZXJlIG9uZSB0cmllcyB0byBzdXBwb3J0IGxpYmF2cmVzYW1wbGUgYW5kIGxpYnN3cmVzYW1wbGUuCisgKgorICogQHBhcmFtW2luLG91dF0gcyBTd3IgY29udGV4dCB0byBiZSBjbG9zZWQKKyAqLwordm9pZCBzd3JfY2xvc2Uoc3RydWN0IFN3ckNvbnRleHQgKnMpOworCisvKioKKyAqIEB9CisgKgorICogQG5hbWUgQ29yZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQ29udmVydCBhdWRpby4KKyAqCisgKiBpbiBhbmQgaW5fY291bnQgY2FuIGJlIHNldCB0byAwIHRvIGZsdXNoIHRoZSBsYXN0IGZldyBzYW1wbGVzIG91dCBhdCB0aGUKKyAqIGVuZC4KKyAqCisgKiBJZiBtb3JlIGlucHV0IGlzIHByb3ZpZGVkIHRoYW4gb3V0cHV0IHNwYWNlIHRoZW4gdGhlIGlucHV0IHdpbGwgYmUgYnVmZmVyZWQuCisgKiBZb3UgY2FuIGF2b2lkIHRoaXMgYnVmZmVyaW5nIGJ5IHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSB0aGFuIGlucHV0LgorICogQ29udmVyc2lvbiB3aWxsIHJ1biBkaXJlY3RseSB3aXRob3V0IGNvcHlpbmcgd2hlbmV2ZXIgcG9zc2libGUuCisgKgorICogQHBhcmFtIHMgICAgICAgICBhbGxvY2F0ZWQgU3dyIGNvbnRleHQsIHdpdGggcGFyYW1ldGVycyBzZXQKKyAqIEBwYXJhbSBvdXQgICAgICAgb3V0cHV0IGJ1ZmZlcnMsIG9ubHkgdGhlIGZpcnN0IG9uZSBuZWVkIGJlIHNldCBpbiBjYXNlIG9mIHBhY2tlZCBhdWRpbworICogQHBhcmFtIG91dF9jb3VudCBhbW91bnQgb2Ygc3BhY2UgYXZhaWxhYmxlIGZvciBvdXRwdXQgaW4gc2FtcGxlcyBwZXIgY2hhbm5lbAorICogQHBhcmFtIGluICAgICAgICBpbnB1dCBidWZmZXJzLCBvbmx5IHRoZSBmaXJzdCBvbmUgbmVlZCB0byBiZSBzZXQgaW4gY2FzZSBvZiBwYWNrZWQgYXVkaW8KKyAqIEBwYXJhbSBpbl9jb3VudCAgbnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgYXZhaWxhYmxlIGluIG9uZSBjaGFubmVsCisgKgorICogQHJldHVybiBudW1iZXIgb2Ygc2FtcGxlcyBvdXRwdXQgcGVyIGNoYW5uZWwsIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yCisgKi8KK2ludCBzd3JfY29udmVydChzdHJ1Y3QgU3dyQ29udGV4dCAqcywgdWludDhfdCAqKm91dCwgaW50IG91dF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKmluICwgaW50IGluX2NvdW50KTsKKworLyoqCisgKiBDb252ZXJ0IHRoZSBuZXh0IHRpbWVzdGFtcCBmcm9tIGlucHV0IHRvIG91dHB1dAorICogdGltZXN0YW1wcyBhcmUgaW4gMS8oaW5fc2FtcGxlX3JhdGUgKiBvdXRfc2FtcGxlX3JhdGUpIHVuaXRzLgorICoKKyAqIEBub3RlIFRoZXJlIGFyZSAyIHNsaWdodGx5IGRpZmZlcmVudGx5IGJlaGF2aW5nIG1vZGVzLgorICogICAgICAgQGxpIFdoZW4gYXV0b21hdGljIHRpbWVzdGFtcCBjb21wZW5zYXRpb24gaXMgbm90IHVzZWQsIChtaW5fY29tcGVuc2F0aW9uID49IEZMVF9NQVgpCisgKiAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlIHRpbWVzdGFtcHMgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCB3aXRoIGRlbGF5cyBjb21wZW5zYXRlZAorICogICAgICAgQGxpIFdoZW4gYXV0b21hdGljIHRpbWVzdGFtcCBjb21wZW5zYXRpb24gaXMgdXNlZCwgKG1pbl9jb21wZW5zYXRpb24gPCBGTFRfTUFYKQorICogICAgICAgICAgICAgIGluIHRoaXMgY2FzZSB0aGUgb3V0cHV0IHRpbWVzdGFtcHMgd2lsbCBtYXRjaCBvdXRwdXQgc2FtcGxlIG51bWJlcnMuCisgKiAgICAgICAgICAgICAgU2VlIGZmbXBlZy1yZXNhbXBsZXIoMSkgZm9yIHRoZSB0d28gbW9kZXMgb2YgY29tcGVuc2F0aW9uLgorICoKKyAqIEBwYXJhbSBzW2luXSAgICAgaW5pdGlhbGl6ZWQgU3dyIGNvbnRleHQKKyAqIEBwYXJhbSBwdHNbaW5dICAgdGltZXN0YW1wIGZvciB0aGUgbmV4dCBpbnB1dCBzYW1wbGUsIElOVDY0X01JTiBpZiB1bmtub3duCisgKiBAc2VlIHN3cl9zZXRfY29tcGVuc2F0aW9uKCksIHN3cl9kcm9wX291dHB1dCgpLCBhbmQgc3dyX2luamVjdF9zaWxlbmNlKCkgYXJlCisgKiAgICAgIGZ1bmN0aW9uIHVzZWQgaW50ZXJuYWxseSBmb3IgdGltZXN0YW1wIGNvbXBlbnNhdGlvbi4KKyAqIEByZXR1cm4gdGhlIG91dHB1dCB0aW1lc3RhbXAgZm9yIHRoZSBuZXh0IG91dHB1dCBzYW1wbGUKKyAqLworaW50NjRfdCBzd3JfbmV4dF9wdHMoc3RydWN0IFN3ckNvbnRleHQgKnMsIGludDY0X3QgcHRzKTsKKworLyoqCisgKiBAfQorICoKKyAqIEBuYW1lIExvdy1sZXZlbCBvcHRpb24gc2V0dGluZyBmdW5jdGlvbnMKKyAqIFRoZXNlIGZ1bmN0b25zIHByb3ZpZGUgYSBtZWFucyB0byBzZXQgbG93LWxldmVsIG9wdGlvbnMgdGhhdCBpcyBub3QgcG9zc2libGUKKyAqIHdpdGggdGhlIEFWT3B0aW9uIEFQSS4KKyAqIEB7CisgKi8KKworLyoqCisgKiBBY3RpdmF0ZSByZXNhbXBsaW5nIGNvbXBlbnNhdGlvbiAoInNvZnQiIGNvbXBlbnNhdGlvbikuIFRoaXMgZnVuY3Rpb24gaXMKKyAqIGludGVybmFsbHkgY2FsbGVkIHdoZW4gbmVlZGVkIGluIHN3cl9uZXh0X3B0cygpLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHMgICAgICAgICAgICAgYWxsb2NhdGVkIFN3ciBjb250ZXh0LiBJZiBpdCBpcyBub3QgaW5pdGlhbGl6ZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFNXUl9GTEFHX1JFU0FNUExFIGlzIG5vdCBzZXQsIHN3cl9pbml0KCkgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIHdpdGggdGhlIGZsYWcgc2V0LgorICogQHBhcmFtW2luXSAgICAgc2FtcGxlX2RlbHRhICBkZWx0YSBpbiBQVFMgcGVyIHNhbXBsZQorICogQHBhcmFtW2luXSAgICAgY29tcGVuc2F0aW9uX2Rpc3RhbmNlIG51bWJlciBvZiBzYW1wbGVzIHRvIGNvbXBlbnNhdGUgZm9yCisgKiBAcmV0dXJuICAgID49IDAgb24gc3VjY2VzcywgQVZFUlJPUiBlcnJvciBjb2RlcyBpZjoKKyAqICAgICAgICAgICAgQGxpIEBjIHMgaXMgTlVMTCwKKyAqICAgICAgICAgICAgQGxpIEBjIGNvbXBlbnNhdGlvbl9kaXN0YW5jZSBpcyBsZXNzIHRoYW4gMCwKKyAqICAgICAgICAgICAgQGxpIEBjIGNvbXBlbnNhdGlvbl9kaXN0YW5jZSBpcyAwIGJ1dCBzYW1wbGVfZGVsdGEgaXMgbm90LAorICogICAgICAgICAgICBAbGkgY29tcGVuc2F0aW9uIHVuc3VwcG9ydGVkIGJ5IHJlc2FtcGxlciwgb3IKKyAqICAgICAgICAgICAgQGxpIHN3cl9pbml0KCkgZmFpbHMgd2hlbiBjYWxsZWQuCisgKi8KK2ludCBzd3Jfc2V0X2NvbXBlbnNhdGlvbihzdHJ1Y3QgU3dyQ29udGV4dCAqcywgaW50IHNhbXBsZV9kZWx0YSwgaW50IGNvbXBlbnNhdGlvbl9kaXN0YW5jZSk7CisKKy8qKgorICogU2V0IGEgY3VzdG9taXplZCBpbnB1dCBjaGFubmVsIG1hcHBpbmcuCisgKgorICogQHBhcmFtW2luLG91dF0gcyAgICAgICAgICAgYWxsb2NhdGVkIFN3ciBjb250ZXh0LCBub3QgeWV0IGluaXRpYWxpemVkCisgKiBAcGFyYW1baW5dICAgICBjaGFubmVsX21hcCBjdXN0b21pemVkIGlucHV0IGNoYW5uZWwgbWFwcGluZyAoYXJyYXkgb2YgY2hhbm5lbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlcywgLTEgZm9yIGEgbXV0ZWQgY2hhbm5lbCkKKyAqIEByZXR1cm4gPj0gMCBvbiBzdWNjZXNzLCBvciBBVkVSUk9SIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgc3dyX3NldF9jaGFubmVsX21hcHBpbmcoc3RydWN0IFN3ckNvbnRleHQgKnMsIGNvbnN0IGludCAqY2hhbm5lbF9tYXApOworCisvKioKKyAqIFNldCBhIGN1c3RvbWl6ZWQgcmVtaXggbWF0cml4LgorICoKKyAqIEBwYXJhbSBzICAgICAgIGFsbG9jYXRlZCBTd3IgY29udGV4dCwgbm90IHlldCBpbml0aWFsaXplZAorICogQHBhcmFtIG1hdHJpeCAgcmVtaXggY29lZmZpY2llbnRzOyBtYXRyaXhbaSArIHN0cmlkZSAqIG9dIGlzCisgKiAgICAgICAgICAgICAgICB0aGUgd2VpZ2h0IG9mIGlucHV0IGNoYW5uZWwgaSBpbiBvdXRwdXQgY2hhbm5lbCBvCisgKiBAcGFyYW0gc3RyaWRlICBvZmZzZXQgYmV0d2VlbiBsaW5lcyBvZiB0aGUgbWF0cml4CisgKiBAcmV0dXJuICA+PSAwIG9uIHN1Y2Nlc3MsIG9yIEFWRVJST1IgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK2ludCBzd3Jfc2V0X21hdHJpeChzdHJ1Y3QgU3dyQ29udGV4dCAqcywgY29uc3QgZG91YmxlICptYXRyaXgsIGludCBzdHJpZGUpOworCisvKioKKyAqIEB9CisgKgorICogQG5hbWUgU2FtcGxlIGhhbmRsaW5nIGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKioKKyAqIERyb3BzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24sIGFsb25nIHdpdGggc3dyX2luamVjdF9zaWxlbmNlKCksIGlzIGNhbGxlZCBieSBzd3JfbmV4dF9wdHMoKQorICogaWYgbmVlZGVkIGZvciAiaGFyZCIgY29tcGVuc2F0aW9uLgorICoKKyAqIEBwYXJhbSBzICAgICBhbGxvY2F0ZWQgU3dyIGNvbnRleHQKKyAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBkcm9wcGVkCisgKgorICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IHN3cl9kcm9wX291dHB1dChzdHJ1Y3QgU3dyQ29udGV4dCAqcywgaW50IGNvdW50KTsKKworLyoqCisgKiBJbmplY3RzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNpbGVuY2Ugc2FtcGxlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uLCBhbG9uZyB3aXRoIHN3cl9kcm9wX291dHB1dCgpLCBpcyBjYWxsZWQgYnkgc3dyX25leHRfcHRzKCkKKyAqIGlmIG5lZWRlZCBmb3IgImhhcmQiIGNvbXBlbnNhdGlvbi4KKyAqCisgKiBAcGFyYW0gcyAgICAgYWxsb2NhdGVkIFN3ciBjb250ZXh0CisgKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgZHJvcHBlZAorICoKKyAqIEByZXR1cm4gPj0gMCBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBzd3JfaW5qZWN0X3NpbGVuY2Uoc3RydWN0IFN3ckNvbnRleHQgKnMsIGludCBjb3VudCk7CisKKy8qKgorICogR2V0cyB0aGUgZGVsYXkgdGhlIG5leHQgaW5wdXQgc2FtcGxlIHdpbGwgZXhwZXJpZW5jZSByZWxhdGl2ZSB0byB0aGUgbmV4dCBvdXRwdXQgc2FtcGxlLgorICoKKyAqIFN3cmVzYW1wbGUgY2FuIGJ1ZmZlciBkYXRhIGlmIG1vcmUgaW5wdXQgaGFzIGJlZW4gcHJvdmlkZWQgdGhhbiBhdmFpbGFibGUKKyAqIG91dHB1dCBzcGFjZSwgYWxzbyBjb252ZXJ0aW5nIGJldHdlZW4gc2FtcGxlIHJhdGVzIG5lZWRzIGEgZGVsYXkuCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHN1bSBvZiBhbGwgc3VjaCBkZWxheXMuCisgKiBUaGUgZXhhY3QgZGVsYXkgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGludGVnZXIgdmFsdWUgaW4gZWl0aGVyIGlucHV0IG9yCisgKiBvdXRwdXQgc2FtcGxlIHJhdGUuIEVzcGVjaWFsbHkgd2hlbiBkb3duc2FtcGxpbmcgYnkgYSBsYXJnZSB2YWx1ZSwgdGhlCisgKiBvdXRwdXQgc2FtcGxlIHJhdGUgbWF5IGJlIGEgcG9vciBjaG9pY2UgdG8gcmVwcmVzZW50IHRoZSBkZWxheSwgc2ltaWxhcmx5CisgKiBmb3IgdXBzYW1wbGluZyBhbmQgdGhlIGlucHV0IHNhbXBsZSByYXRlLgorICoKKyAqIEBwYXJhbSBzICAgICBzd3IgY29udGV4dAorICogQHBhcmFtIGJhc2UgIHRpbWViYXNlIGluIHdoaWNoIHRoZSByZXR1cm5lZCBkZWxheSB3aWxsIGJlOgorICogICAgICAgICAgICAgIEBsaSBpZiBpdCdzIHNldCB0byAxIHRoZSByZXR1cm5lZCBkZWxheSBpcyBpbiBzZWNvbmRzCisgKiAgICAgICAgICAgICAgQGxpIGlmIGl0J3Mgc2V0IHRvIDEwMDAgdGhlIHJldHVybmVkIGRlbGF5IGlzIGluIG1pbGxpc2Vjb25kcworICogICAgICAgICAgICAgIEBsaSBpZiBpdCdzIHNldCB0byB0aGUgaW5wdXQgc2FtcGxlIHJhdGUgdGhlbiB0aGUgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICAgICAgZGVsYXkgaXMgaW4gaW5wdXQgc2FtcGxlcworICogICAgICAgICAgICAgIEBsaSBpZiBpdCdzIHNldCB0byB0aGUgb3V0cHV0IHNhbXBsZSByYXRlIHRoZW4gdGhlIHJldHVybmVkCisgKiAgICAgICAgICAgICAgICAgIGRlbGF5IGlzIGluIG91dHB1dCBzYW1wbGVzCisgKiAgICAgICAgICAgICAgQGxpIGlmIGl0J3MgdGhlIGxlYXN0IGNvbW1vbiBtdWx0aXBsZSBvZiBpbl9zYW1wbGVfcmF0ZSBhbmQKKyAqICAgICAgICAgICAgICAgICAgb3V0X3NhbXBsZV9yYXRlIHRoZW4gYW4gZXhhY3Qgcm91bmRpbmctZnJlZSBkZWxheSB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgIHJldHVybmVkCisgKiBAcmV0dXJucyAgICAgdGhlIGRlbGF5IGluIDEgLyBAYyBiYXNlIHVuaXRzLgorICovCitpbnQ2NF90IHN3cl9nZXRfZGVsYXkoc3RydWN0IFN3ckNvbnRleHQgKnMsIGludDY0X3QgYmFzZSk7CisKKy8qKgorICogQH0KKyAqCisgKiBAbmFtZSBDb25maWd1cmF0aW9uIGFjY2Vzc29ycworICogQHsKKyAqLworCisvKioKKyAqIFJldHVybiB0aGUgQHJlZiBMSUJTV1JFU0FNUExFX1ZFUlNJT05fSU5UIGNvbnN0YW50LgorICoKKyAqIFRoaXMgaXMgdXNlZnVsIHRvIGNoZWNrIGlmIHRoZSBidWlsZC10aW1lIGxpYnN3cmVzYW1wbGUgaGFzIHRoZSBzYW1lIHZlcnNpb24KKyAqIGFzIHRoZSBydW4tdGltZSBvbmUuCisgKgorICogQHJldHVybnMgICAgIHRoZSB1bnNpZ25lZCBpbnQtdHlwZWQgdmVyc2lvbgorICovCit1bnNpZ25lZCBzd3Jlc2FtcGxlX3ZlcnNpb24odm9pZCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBzd3IgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uLgorICoKKyAqIEByZXR1cm5zICAgICB0aGUgYnVpbGQtdGltZSBAYyAuL2NvbmZpZ3VyZSBmbGFncworICovCitjb25zdCBjaGFyICpzd3Jlc2FtcGxlX2NvbmZpZ3VyYXRpb24odm9pZCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBzd3IgbGljZW5zZS4KKyAqCisgKiBAcmV0dXJucyAgICAgdGhlIGxpY2Vuc2Ugb2YgbGlic3dyZXNhbXBsZSwgZGV0ZXJtaW5lZCBhdCBidWlsZC10aW1lCisgKi8KK2NvbnN0IGNoYXIgKnN3cmVzYW1wbGVfbGljZW5zZSh2b2lkKTsKKworLyoqCisgKiBAfQorICoKKyAqIEBuYW1lIEFWRnJhbWUgYmFzZWQgQVBJCisgKiBAeworICovCisKKy8qKgorICogQ29udmVydCB0aGUgc2FtcGxlcyBpbiB0aGUgaW5wdXQgQVZGcmFtZSBhbmQgd3JpdGUgdGhlbSB0byB0aGUgb3V0cHV0IEFWRnJhbWUuCisgKgorICogSW5wdXQgYW5kIG91dHB1dCBBVkZyYW1lcyBtdXN0IGhhdmUgY2hhbm5lbF9sYXlvdXQsIHNhbXBsZV9yYXRlIGFuZCBmb3JtYXQgc2V0LgorICoKKyAqIElmIHRoZSBvdXRwdXQgQVZGcmFtZSBkb2VzIG5vdCBoYXZlIHRoZSBkYXRhIHBvaW50ZXJzIGFsbG9jYXRlZCB0aGUgbmJfc2FtcGxlcworICogZmllbGQgd2lsbCBiZSBzZXQgdXNpbmcgYXZfZnJhbWVfZ2V0X2J1ZmZlcigpCisgKiBpcyBjYWxsZWQgdG8gYWxsb2NhdGUgdGhlIGZyYW1lLgorICoKKyAqIFRoZSBvdXRwdXQgQVZGcmFtZSBjYW4gYmUgTlVMTCBvciBoYXZlIGZld2VyIGFsbG9jYXRlZCBzYW1wbGVzIHRoYW4gcmVxdWlyZWQuCisgKiBJbiB0aGlzIGNhc2UsIGFueSByZW1haW5pbmcgc2FtcGxlcyBub3Qgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHdpbGwgYmUgYWRkZWQKKyAqIHRvIGFuIGludGVybmFsIEZJRk8gYnVmZmVyLCB0byBiZSByZXR1cm5lZCBhdCB0aGUgbmV4dCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24KKyAqIG9yIHRvIHN3cl9jb252ZXJ0KCkuCisgKgorICogSWYgY29udmVydGluZyBzYW1wbGUgcmF0ZSwgdGhlcmUgbWF5IGJlIGRhdGEgcmVtYWluaW5nIGluIHRoZSBpbnRlcm5hbAorICogcmVzYW1wbGluZyBkZWxheSBidWZmZXIuIHN3cl9nZXRfZGVsYXkoKSB0ZWxscyB0aGUgbnVtYmVyIG9mCisgKiByZW1haW5pbmcgc2FtcGxlcy4gVG8gZ2V0IHRoaXMgZGF0YSBhcyBvdXRwdXQsIGNhbGwgdGhpcyBmdW5jdGlvbiBvcgorICogc3dyX2NvbnZlcnQoKSB3aXRoIE5VTEwgaW5wdXQuCisgKgorICogSWYgdGhlIFN3ckNvbnRleHQgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBtYXRjaCB0aGUgb3V0cHV0IGFuZAorICogaW5wdXQgQVZGcmFtZSBzZXR0aW5ncyB0aGUgY29udmVyc2lvbiBkb2VzIG5vdCB0YWtlIHBsYWNlIGFuZCBkZXBlbmRpbmcgb24KKyAqIHdoaWNoIEFWRnJhbWUgaXMgbm90IG1hdGNoaW5nIEFWRVJST1JfT1VUUFVUX0NIQU5HRUQsIEFWRVJST1JfSU5QVVRfQ0hBTkdFRAorICogb3IgdGhlIHJlc3VsdCBvZiBhIGJpdHdpc2UtT1Igb2YgdGhlbSBpcyByZXR1cm5lZC4KKyAqCisgKiBAc2VlIHN3cl9kZWxheSgpCisgKiBAc2VlIHN3cl9jb252ZXJ0KCkKKyAqIEBzZWUgc3dyX2dldF9kZWxheSgpCisgKgorICogQHBhcmFtIHN3ciAgICAgICAgICAgICBhdWRpbyByZXNhbXBsZSBjb250ZXh0CisgKiBAcGFyYW0gb3V0cHV0ICAgICAgICAgIG91dHB1dCBBVkZyYW1lCisgKiBAcGFyYW0gaW5wdXQgICAgICAgICAgIGlucHV0IEFWRnJhbWUKKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBBVkVSUk9SIG9uIGZhaWx1cmUgb3Igbm9ubWF0Y2hpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KKyAqLworaW50IHN3cl9jb252ZXJ0X2ZyYW1lKFN3ckNvbnRleHQgKnN3ciwKKyAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXRwdXQsIGNvbnN0IEFWRnJhbWUgKmlucHV0KTsKKworLyoqCisgKiBDb25maWd1cmUgb3IgcmVjb25maWd1cmUgdGhlIFN3ckNvbnRleHQgdXNpbmcgdGhlIGluZm9ybWF0aW9uCisgKiBwcm92aWRlZCBieSB0aGUgQVZGcmFtZXMuCisgKgorICogVGhlIG9yaWdpbmFsIHJlc2FtcGxpbmcgY29udGV4dCBpcyByZXNldCBldmVuIG9uIGZhaWx1cmUuCisgKiBUaGUgZnVuY3Rpb24gY2FsbHMgc3dyX2Nsb3NlKCkgaW50ZXJuYWxseSBpZiB0aGUgY29udGV4dCBpcyBvcGVuLgorICoKKyAqIEBzZWUgc3dyX2Nsb3NlKCk7CisgKgorICogQHBhcmFtIHN3ciAgICAgICAgICAgICBhdWRpbyByZXNhbXBsZSBjb250ZXh0CisgKiBAcGFyYW0gb3V0cHV0ICAgICAgICAgIG91dHB1dCBBVkZyYW1lCisgKiBAcGFyYW0gaW5wdXQgICAgICAgICAgIGlucHV0IEFWRnJhbWUKKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBBVkVSUk9SIG9uIGZhaWx1cmUuCisgKi8KK2ludCBzd3JfY29uZmlnX2ZyYW1lKFN3ckNvbnRleHQgKnN3ciwgY29uc3QgQVZGcmFtZSAqb3V0LCBjb25zdCBBVkZyYW1lICppbik7CisKKy8qKgorICogQH0KKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIFNXUkVTQU1QTEVfU1dSRVNBTVBMRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlX2ZyYW1lLmMgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlX2ZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkM2VkNwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGVfZnJhbWUuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBMdWNhIEJhcmJhdG8gPGx1X3plcm9AZ2VudG9vLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAic3dyZXNhbXBsZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworaW50IHN3cl9jb25maWdfZnJhbWUoU3dyQ29udGV4dCAqcywgY29uc3QgQVZGcmFtZSAqb3V0LCBjb25zdCBBVkZyYW1lICppbikKK3sKKyAgICBzd3JfY2xvc2Uocyk7CisKKyAgICBpZiAoaW4pIHsKKyAgICAgICAgaWYgKGF2X29wdF9zZXRfaW50KHMsICJpY2wiLCBpbi0+Y2hhbm5lbF9sYXlvdXQsIDApIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgaWYgKGF2X29wdF9zZXRfaW50KHMsICJpc2YiLCBpbi0+Zm9ybWF0LCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGlmIChhdl9vcHRfc2V0X2ludChzLCAiaXNyIiwgaW4tPnNhbXBsZV9yYXRlLCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKG91dCkgeworICAgICAgICBpZiAoYXZfb3B0X3NldF9pbnQocywgIm9jbCIsIG91dC0+Y2hhbm5lbF9sYXlvdXQsIDApIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgaWYgKGF2X29wdF9zZXRfaW50KHMsICJvc2YiLCBvdXQtPmZvcm1hdCwgIDApIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgaWYgKGF2X29wdF9zZXRfaW50KHMsICJvc3IiLCBvdXQtPnNhbXBsZV9yYXRlLCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IG9wdGlvblxuIik7CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKworc3RhdGljIGludCBjb25maWdfY2hhbmdlZChTd3JDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpvdXQsIGNvbnN0IEFWRnJhbWUgKmluKQoreworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGluKSB7CisgICAgICAgIGlmIChzLT5pbl9jaF9sYXlvdXQgICAhPSBpbi0+Y2hhbm5lbF9sYXlvdXQgfHwKKyAgICAgICAgICAgIHMtPmluX3NhbXBsZV9yYXRlICE9IGluLT5zYW1wbGVfcmF0ZSB8fAorICAgICAgICAgICAgcy0+aW5fc2FtcGxlX2ZtdCAgIT0gaW4tPmZvcm1hdCkgeworICAgICAgICAgICAgcmV0IHw9IEFWRVJST1JfSU5QVVRfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXQpIHsKKyAgICAgICAgaWYgKHMtPm91dF9jaF9sYXlvdXQgICAhPSBvdXQtPmNoYW5uZWxfbGF5b3V0IHx8CisgICAgICAgICAgICBzLT5vdXRfc2FtcGxlX3JhdGUgIT0gb3V0LT5zYW1wbGVfcmF0ZSB8fAorICAgICAgICAgICAgcy0+b3V0X3NhbXBsZV9mbXQgICE9IG91dC0+Zm9ybWF0KSB7CisgICAgICAgICAgICByZXQgfD0gQVZFUlJPUl9PVVRQVVRfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNvbnZlcnRfZnJhbWUoU3dyQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqb3V0LCBjb25zdCBBVkZyYW1lICppbikKK3sKKyAgICBpbnQgcmV0OworICAgIHVpbnQ4X3QgKipvdXRfZGF0YSA9IE5VTEw7CisgICAgY29uc3QgdWludDhfdCAqKmluX2RhdGEgPSBOVUxMOworICAgIGludCBvdXRfbmJfc2FtcGxlcyA9IDAsIGluX25iX3NhbXBsZXMgPSAwOworCisgICAgaWYgKG91dCkgeworICAgICAgICBvdXRfZGF0YSAgICAgICA9IG91dC0+ZXh0ZW5kZWRfZGF0YTsKKyAgICAgICAgb3V0X25iX3NhbXBsZXMgPSBvdXQtPm5iX3NhbXBsZXM7CisgICAgfQorCisgICAgaWYgKGluKSB7CisgICAgICAgIGluX2RhdGEgICAgICAgPSAoY29uc3QgdWludDhfdCAqKilpbi0+ZXh0ZW5kZWRfZGF0YTsKKyAgICAgICAgaW5fbmJfc2FtcGxlcyA9IGluLT5uYl9zYW1wbGVzOworICAgIH0KKworICAgIHJldCA9IHN3cl9jb252ZXJ0KHMsIG91dF9kYXRhLCBvdXRfbmJfc2FtcGxlcywgaW5fZGF0YSwgaW5fbmJfc2FtcGxlcyk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAob3V0KQorICAgICAgICAgICAgb3V0LT5uYl9zYW1wbGVzID0gMDsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAob3V0KQorICAgICAgICBvdXQtPm5iX3NhbXBsZXMgPSByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXZhaWxhYmxlX3NhbXBsZXMoQVZGcmFtZSAqb3V0KQoreworICAgIGludCBieXRlc19wZXJfc2FtcGxlID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUob3V0LT5mb3JtYXQpOworICAgIGludCBzYW1wbGVzID0gb3V0LT5saW5lc2l6ZVswXSAvIGJ5dGVzX3Blcl9zYW1wbGU7CisKKyAgICBpZiAoYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIob3V0LT5mb3JtYXQpKSB7CisgICAgICAgIHJldHVybiBzYW1wbGVzOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBjaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhvdXQtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgcmV0dXJuIHNhbXBsZXMgLyBjaGFubmVsczsKKyAgICB9Cit9CisKK2ludCBzd3JfY29udmVydF9mcmFtZShTd3JDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKm91dCwgY29uc3QgQVZGcmFtZSAqaW4pCit7CisgICAgaW50IHJldCwgc2V0dXAgPSAwOworCisgICAgaWYgKCFzd3JfaXNfaW5pdGlhbGl6ZWQocykpIHsKKyAgICAgICAgaWYgKChyZXQgPSBzd3JfY29uZmlnX2ZyYW1lKHMsIG91dCwgaW4pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IHN3cl9pbml0KHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBzZXR1cCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcmV0dXJuIGFzIGlzIG9yIHJlY29uZmlndXJlIGZvciBpbnB1dCBjaGFuZ2VzPworICAgICAgICBpZiAoKHJldCA9IGNvbmZpZ19jaGFuZ2VkKHMsIG91dCwgaW4pKSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKG91dCkgeworICAgICAgICBpZiAoIW91dC0+bGluZXNpemVbMF0pIHsKKyAgICAgICAgICAgIG91dC0+bmJfc2FtcGxlcyA9ICAgc3dyX2dldF9kZWxheShzLCBzLT5vdXRfc2FtcGxlX3JhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluLT5uYl9zYW1wbGVzKihpbnQ2NF90KXMtPm91dF9zYW1wbGVfcmF0ZSAvIHMtPmluX3NhbXBsZV9yYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDM7CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX2dldF9idWZmZXIob3V0LCAwKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNldHVwKQorICAgICAgICAgICAgICAgICAgICBzd3JfY2xvc2Uocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghb3V0LT5uYl9zYW1wbGVzKQorICAgICAgICAgICAgICAgIG91dC0+bmJfc2FtcGxlcyA9IGF2YWlsYWJsZV9zYW1wbGVzKG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY29udmVydF9mcmFtZShzLCBvdXQsIGluKTsKK30KKwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZV9pbnRlcm5hbC5oIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZV9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjE4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlX2ludGVybmFsLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBNaWNoYWVsIE5pZWRlcm1heWVyIChtaWNoYWVsbmlAZ214LmF0KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYnN3cmVzYW1wbGUKKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIGxpYnN3cmVzYW1wbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIFNXUl9JTlRFUk5BTF9ICisjZGVmaW5lIFNXUl9JTlRFUk5BTF9ICisKKyNpbmNsdWRlICJzd3Jlc2FtcGxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNkZWZpbmUgU1dSX0NIX01BWCAzMgorCisjZGVmaW5lIFNRUlQzXzIgICAgICAxLjIyNDc0NDg3MTM5MTU4OTA0OTA5ICAvKiBzcXJ0KDMvMikgKi8KKworI2RlZmluZSBOU19UQVBTIDIwCisKKyNpZiBBUkNIX1g4Nl82NAordHlwZWRlZiBpbnQ2NF90IGludGVnZXI7CisjZWxzZQordHlwZWRlZiBpbnQgaW50ZWdlcjsKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKG1peF8xXzFfZnVuY190eXBlKSh2b2lkICpvdXQsIGNvbnN0IHZvaWQgKmluLCB2b2lkICpjb2VmZnAsIGludGVnZXIgaW5kZXgsIGludGVnZXIgbGVuKTsKK3R5cGVkZWYgdm9pZCAobWl4XzJfMV9mdW5jX3R5cGUpKHZvaWQgKm91dCwgY29uc3Qgdm9pZCAqaW4xLCBjb25zdCB2b2lkICppbjIsIHZvaWQgKmNvZWZmcCwgaW50ZWdlciBpbmRleDEsIGludGVnZXIgaW5kZXgyLCBpbnRlZ2VyIGxlbik7CisKK3R5cGVkZWYgdm9pZCAobWl4X2FueV9mdW5jX3R5cGUpKHVpbnQ4X3QgKipvdXQsIGNvbnN0IHVpbnQ4X3QgKippbjEsIHZvaWQgKmNvZWZmcCwgaW50ZWdlciBsZW4pOworCit0eXBlZGVmIHN0cnVjdCBBdWRpb0RhdGF7CisgICAgdWludDhfdCAqY2hbU1dSX0NIX01BWF07ICAgIC8vLzwgc2FtcGxlcyBidWZmZXIgcGVyIGNoYW5uZWwKKyAgICB1aW50OF90ICpkYXRhOyAgICAgICAgICAgICAgLy8vPCBzYW1wbGVzIGJ1ZmZlcgorICAgIGludCBjaF9jb3VudDsgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBjaGFubmVscworICAgIGludCBicHM7ICAgICAgICAgICAgICAgICAgICAvLy88IGJ5dGVzIHBlciBzYW1wbGUKKyAgICBpbnQgY291bnQ7ICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2Ygc2FtcGxlcworICAgIGludCBwbGFuYXI7ICAgICAgICAgICAgICAgICAvLy88IDEgaWYgcGxhbmFyIGF1ZGlvLCAwIG90aGVyd2lzZQorICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgZm10OyAgICAvLy88IHNhbXBsZSBmb3JtYXQKK30gQXVkaW9EYXRhOworCitzdHJ1Y3QgRGl0aGVyQ29udGV4dCB7CisgICAgZW51bSBTd3JEaXRoZXJUeXBlIG1ldGhvZDsKKyAgICBpbnQgbm9pc2VfcG9zOworICAgIGZsb2F0IHNjYWxlOworICAgIGZsb2F0IG5vaXNlX3NjYWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTm9pc2Ugc2NhbGUKKyAgICBpbnQgbnNfdGFwczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE5vaXNlIHNoYXBpbmcgZGl0aGVyIHRhcHMKKyAgICBmbG9hdCBuc19zY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE5vaXNlIHNoYXBpbmcgZGl0aGVyIHNjYWxlCisgICAgZmxvYXQgbnNfc2NhbGVfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBOb2lzZSBzaGFwaW5nIGRpdGhlciBzY2FsZV4tMQorICAgIGludCBuc19wb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTm9pc2Ugc2hhcGluZyBkaXRoZXIgcG9zaXRpb24KKyAgICBmbG9hdCBuc19jb2VmZnNbTlNfVEFQU107ICAgICAgICAgICAgICAgICAgICAgICAvLy88IE5vaXNlIHNoYXBpbmcgZmlsdGVyIGNvZWZmaWNpZW50cworICAgIGZsb2F0IG5zX2Vycm9yc1tTV1JfQ0hfTUFYXVsyKk5TX1RBUFNdOworICAgIEF1ZGlvRGF0YSBub2lzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbm9pc2UgdXNlZCBmb3IgZGl0aGVyaW5nCisgICAgQXVkaW9EYXRhIHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0ZW1wb3Jhcnkgc3RvcmFnZSB3aGVuIHdyaXRpbmcgaW50byB0aGUgaW5wdXQgYnVmZmVyIGlzbid0IHBvc3NpYmxlCisgICAgaW50IG91dHB1dF9zYW1wbGVfYml0czsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0aGUgbnVtYmVyIG9mIHVzZWQgb3V0cHV0IGJpdHMsIG5lZWRlZCB0byBzY2FsZSBkaXRoZXIgY29ycmVjdGx5Cit9OworCitzdHJ1Y3QgU3dyQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqYXZfY2xhc3M7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkNsYXNzIHVzZWQgZm9yIEFWT3B0aW9uIGFuZCBhdl9sb2coKQorICAgIGludCBsb2dfbGV2ZWxfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbG9nZ2luZyBsZXZlbCBvZmZzZXQKKyAgICB2b2lkICpsb2dfY3R4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHBhcmVudCBsb2dnaW5nIGNvbnRleHQKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0ICBpbl9zYW1wbGVfZm10OyAgICAgICAgICAgICAvLy88IGlucHV0IHNhbXBsZSBmb3JtYXQKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGludF9zYW1wbGVfZm10OyAgICAgICAgICAgICAvLy88IGludGVybmFsIHNhbXBsZSBmb3JtYXQgKEFWX1NBTVBMRV9GTVRfRkxUUCBvciBBVl9TQU1QTEVfRk1UX1MxNlApCisgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfc2FtcGxlX2ZtdDsgICAgICAgICAgICAgLy8vPCBvdXRwdXQgc2FtcGxlIGZvcm1hdAorICAgIGludDY0X3QgIGluX2NoX2xheW91dDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5wdXQgY2hhbm5lbCBsYXlvdXQKKyAgICBpbnQ2NF90IG91dF9jaF9sYXlvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG91dHB1dCBjaGFubmVsIGxheW91dAorICAgIGludCAgICAgIGluX3NhbXBsZV9yYXRlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5wdXQgc2FtcGxlIHJhdGUKKyAgICBpbnQgICAgIG91dF9zYW1wbGVfcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG91dHB1dCBzYW1wbGUgcmF0ZQorICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbWlzY2VsbGFuZW91cyBmbGFncyBzdWNoIGFzIFNXUl9GTEFHX1JFU0FNUExFCisgICAgZmxvYXQgc2xldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzdXJyb3VuZCBtaXhpbmcgbGV2ZWwKKyAgICBmbG9hdCBjbGV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNlbnRlciBtaXhpbmcgbGV2ZWwKKyAgICBmbG9hdCBsZmVfbWl4X2xldmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IExGRSBtaXhpbmcgbGV2ZWwKKyAgICBmbG9hdCByZW1hdHJpeF92b2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHJlbWF0cml4aW5nIHZvbHVtZSBjb2VmZmljaWVudAorICAgIGZsb2F0IHJlbWF0cml4X21heHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbWF4aW11bSB2YWx1ZSBmb3IgcmVtYXRyaXhpbmcgb3V0cHV0CisgICAgZW51bSBBVk1hdHJpeEVuY29kaW5nIG1hdHJpeF9lbmNvZGluZzsgICAgICAgICAgLyoqPCBtYXRyaXhlZCBzdGVyZW8gZW5jb2RpbmcgKi8KKyAgICBjb25zdCBpbnQgKmNoYW5uZWxfbWFwOyAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNoYW5uZWwgaW5kZXggKG9yIC0xIGlmIG11dGVkIGNoYW5uZWwpIG1hcAorICAgIGludCB1c2VkX2NoX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHVzZWQgaW5wdXQgY2hhbm5lbHMgKG1hcHBlZCBjaGFubmVsIGNvdW50IGlmIGNoYW5uZWxfbWFwLCBvdGhlcndpc2UgaW4uY2hfY291bnQpCisgICAgZW51bSBTd3JFbmdpbmUgZW5naW5lOworCisgICAgc3RydWN0IERpdGhlckNvbnRleHQgZGl0aGVyOworCisgICAgaW50IGZpbHRlcl9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBsZW5ndGggb2YgZWFjaCBGSVIgZmlsdGVyIGluIHRoZSByZXNhbXBsaW5nIGZpbHRlcmJhbmsgcmVsYXRpdmUgdG8gdGhlIGN1dG9mZiBmcmVxdWVuY3kgKi8KKyAgICBpbnQgcGhhc2Vfc2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGxvZzIgb2YgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSByZXNhbXBsaW5nIHBvbHlwaGFzZSBmaWx0ZXJiYW5rICovCisgICAgaW50IGxpbmVhcl9pbnRlcnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBpZiAxIHRoZW4gdGhlIHJlc2FtcGxpbmcgRklSIGZpbHRlciB3aWxsIGJlIGxpbmVhcmx5IGludGVycG9sYXRlZCAqLworICAgIGRvdWJsZSBjdXRvZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgcmVzYW1wbGluZyBjdXRvZmYgZnJlcXVlbmN5IChzd3I6IDZkQiBwb2ludDsgc294cjogMGRCIHBvaW50KS4gMS4wIGNvcnJlc3BvbmRzIHRvIGhhbGYgdGhlIG91dHB1dCBzYW1wbGUgcmF0ZSAqLworICAgIGVudW0gU3dyRmlsdGVyVHlwZSBmaWx0ZXJfdHlwZTsgICAgICAgICAgICAgICAgIC8qKjwgc3dyIHJlc2FtcGxpbmcgZmlsdGVyIHR5cGUgKi8KKyAgICBpbnQga2Fpc2VyX2JldGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHN3ciBiZXRhIHZhbHVlIGZvciBLYWlzZXIgd2luZG93IChvbmx5IGFwcGxpY2FibGUgaWYgZmlsdGVyX3R5cGUgPT0gQVZfRklMVEVSX1RZUEVfS0FJU0VSKSAqLworICAgIGRvdWJsZSBwcmVjaXNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc294ciByZXNhbXBsaW5nIHByZWNpc2lvbiAoaW4gYml0cykgKi8KKyAgICBpbnQgY2hlYnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHNveHI6IGlmIDEgdGhlbiBwYXNzYmFuZCByb2xsb2ZmIHdpbGwgYmUgbm9uZSAoQ2hlYnlzaGV2KSAmIGlycmF0aW9uYWwgcmF0aW8gYXBwcm94aW1hdGlvbiBwcmVjaXNpb24gd2lsbCBiZSBoaWdoZXIgKi8KKworICAgIGZsb2F0IG1pbl9jb21wZW5zYXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc3dyIG1pbmltdW0gYmVsb3cgd2hpY2ggbm8gY29tcGVuc2F0aW9uIHdpbGwgaGFwcGVuCisgICAgZmxvYXQgbWluX2hhcmRfY29tcGVuc2F0aW9uOyAgICAgICAgICAgICAgICAgICAgLy8vPCBzd3IgbWluaW11bSBiZWxvdyB3aGljaCBubyBzaWxlbmNlIGluamVjdCAvIHNhbXBsZSBkcm9wIHdpbGwgaGFwcGVuCisgICAgZmxvYXQgc29mdF9jb21wZW5zYXRpb25fZHVyYXRpb247ICAgICAgICAgICAgICAgLy8vPCBzd3IgZHVyYXRpb24gb3ZlciB3aGljaCBzb2Z0IGNvbXBlbnNhdGlvbiBpcyBhcHBsaWVkCisgICAgZmxvYXQgbWF4X3NvZnRfY29tcGVuc2F0aW9uOyAgICAgICAgICAgICAgICAgICAgLy8vPCBzd3IgbWF4aW11bSBzb2Z0IGNvbXBlbnNhdGlvbiBpbiBzZWNvbmRzIG92ZXIgc29mdF9jb21wZW5zYXRpb25fZHVyYXRpb24KKyAgICBmbG9hdCBhc3luYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHN3ciBzaW1wbGUgMSBwYXJhbWV0ZXIgYXN5bmMsIHNpbWlsYXIgdG8gZmZtcGVncyAtYXN5bmMKKyAgICBpbnQ2NF90IGZpcnN0cHRzX2luX3NhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAvLy88IHN3ciBmaXJzdCBwdHMgaW4gc2FtcGxlcworCisgICAgaW50IHJlc2FtcGxlX2ZpcnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCAxIGlmIHJlc2FtcGxpbmcgbXVzdCBjb21lIGZpcnN0LCAwIGlmIHJlbWF0cml4aW5nCisgICAgaW50IHJlbWF0cml4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmbGFnIHRvIGluZGljYXRlIGlmIHJlbWF0cml4aW5nIGlzIG5lZWRlZCAoYmFzaWNhbGx5IGlmIGlucHV0IGFuZCBvdXRwdXQgbGF5b3V0cyBtaXNtYXRjaCkKKyAgICBpbnQgcmVtYXRyaXhfY3VzdG9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBhIGN1c3RvbSBtYXRyaXggaGFzIGJlZW4gZGVmaW5lZAorCisgICAgQXVkaW9EYXRhIGluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbnB1dCBhdWRpbyBkYXRhCisgICAgQXVkaW9EYXRhIHBvc3RpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwb3N0LWlucHV0IGF1ZGlvIGRhdGE6IHVzZWQgZm9yIHJlbWF0cml4L3Jlc2FtcGxlCisgICAgQXVkaW9EYXRhIG1pZGJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbnRlcm1lZGlhdGUgYXVkaW8gZGF0YSAocG9zdGluL3ByZW91dCkKKyAgICBBdWRpb0RhdGEgcHJlb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHByZS1vdXRwdXQgYXVkaW8gZGF0YTogdXNlZCBmb3IgcmVtYXRyaXgvcmVzYW1wbGUKKyAgICBBdWRpb0RhdGEgb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNvbnZlcnRlZCBvdXRwdXQgYXVkaW8gZGF0YQorICAgIEF1ZGlvRGF0YSBpbl9idWZmZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2FjaGVkIGF1ZGlvIGRhdGEgKGNvbnZlcnQgYW5kIHJlc2FtcGxlIHB1cnBvc2UpCisgICAgQXVkaW9EYXRhIHNpbGVuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0ZW1wb3Jhcnkgd2l0aCBzaWxlbmNlCisgICAgQXVkaW9EYXRhIGRyb3BfdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0ZW1wb3JhcnkgdXNlZCB0byBkaXNjYXJkIG91dHB1dAorICAgIGludCBpbl9idWZmZXJfaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2FjaGVkIGJ1ZmZlciBwb3NpdGlvbgorICAgIGludCBpbl9idWZmZXJfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2FjaGVkIGJ1ZmZlciBsZW5ndGgKKyAgICBpbnQgcmVzYW1wbGVfaW5fY29uc3RyYWludDsgICAgICAgICAgICAgICAgICAgICAvLy88IDEgaWYgdGhlIGlucHV0IGVuZCB3YXMgcmVhY2ggYmVmb3JlIHRoZSBvdXRwdXQgZW5kLCAwIG90aGVyd2lzZQorICAgIGludCBmbHVzaGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMSBpZiBkYXRhIGlzIHRvIGJlIGZsdXNoZWQgYW5kIG5vIGZ1cnRoZXIgaW5wdXQgaXMgZXhwZWN0ZWQKKyAgICBpbnQ2NF90IG91dHB0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG91dHB1dCBQVFMKKyAgICBpbnQ2NF90IGZpcnN0cHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZpcnN0IFBUUworICAgIGludCBkcm9wX291dHB1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIHRvIGRyb3AKKworICAgIHN0cnVjdCBBdWRpb0NvbnZlcnQgKmluX2NvbnZlcnQ7ICAgICAgICAgICAgICAgIC8vLzwgaW5wdXQgY29udmVyc2lvbiBjb250ZXh0CisgICAgc3RydWN0IEF1ZGlvQ29udmVydCAqb3V0X2NvbnZlcnQ7ICAgICAgICAgICAgICAgLy8vPCBvdXRwdXQgY29udmVyc2lvbiBjb250ZXh0CisgICAgc3RydWN0IEF1ZGlvQ29udmVydCAqZnVsbF9jb252ZXJ0OyAgICAgICAgICAgICAgLy8vPCBmdWxsIGNvbnZlcnNpb24gY29udGV4dCAoc2luZ2xlIGNvbnZlcnNpb24gZm9yIGlucHV0IGFuZCBvdXRwdXQpCisgICAgc3RydWN0IFJlc2FtcGxlQ29udGV4dCAqcmVzYW1wbGU7ICAgICAgICAgICAgICAgLy8vPCByZXNhbXBsaW5nIGNvbnRleHQKKyAgICBzdHJ1Y3QgUmVzYW1wbGVyIGNvbnN0ICpyZXNhbXBsZXI7ICAgICAgICAgICAgICAvLy88IHJlc2FtcGxlciB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCisKKyAgICBmbG9hdCBtYXRyaXhbU1dSX0NIX01BWF1bU1dSX0NIX01BWF07ICAgICAgICAgICAvLy88IGZsb2F0aW5nIHBvaW50IHJlbWF0cml4aW5nIGNvZWZmaWNpZW50cworICAgIHVpbnQ4X3QgKm5hdGl2ZV9tYXRyaXg7CisgICAgdWludDhfdCAqbmF0aXZlX29uZTsKKyAgICB1aW50OF90ICpuYXRpdmVfc2ltZF9vbmU7CisgICAgdWludDhfdCAqbmF0aXZlX3NpbWRfbWF0cml4OworICAgIGludDMyX3QgbWF0cml4MzJbU1dSX0NIX01BWF1bU1dSX0NIX01BWF07ICAgICAgIC8vLzwgMTcuMTUgZml4ZWQgcG9pbnQgcmVtYXRyaXhpbmcgY29lZmZpY2llbnRzCisgICAgdWludDhfdCBtYXRyaXhfY2hbU1dSX0NIX01BWF1bU1dSX0NIX01BWCsxXTsgICAgLy8vPCBMaXN0cyBvZiBpbnB1dCBjaGFubmVscyBwZXIgb3V0cHV0IGNoYW5uZWwgdGhhdCBoYXZlIG5vbiB6ZXJvIHJlbWF0cml4aW5nIGNvZWZmaWNpZW50cworICAgIG1peF8xXzFfZnVuY190eXBlICptaXhfMV8xX2Y7CisgICAgbWl4XzFfMV9mdW5jX3R5cGUgKm1peF8xXzFfc2ltZDsKKworICAgIG1peF8yXzFfZnVuY190eXBlICptaXhfMl8xX2Y7CisgICAgbWl4XzJfMV9mdW5jX3R5cGUgKm1peF8yXzFfc2ltZDsKKworICAgIG1peF9hbnlfZnVuY190eXBlICptaXhfYW55X2Y7CisKKyAgICAvKiBUT0RPOiBjYWxsYmFja3MgZm9yIEFTTSBvcHRpbWl6YXRpb25zICovCit9OworCit0eXBlZGVmIHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKiAoKiByZXNhbXBsZV9pbml0X2Z1bmMpKHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKmMsIGludCBvdXRfcmF0ZSwgaW50IGluX3JhdGUsIGludCBmaWx0ZXJfc2l6ZSwgaW50IHBoYXNlX3NoaWZ0LCBpbnQgbGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGN1dG9mZiwgZW51bSBBVlNhbXBsZUZvcm1hdCBmb3JtYXQsIGVudW0gU3dyRmlsdGVyVHlwZSBmaWx0ZXJfdHlwZSwgaW50IGthaXNlcl9iZXRhLCBkb3VibGUgcHJlY2lzaW9uLCBpbnQgY2hlYnkpOwordHlwZWRlZiB2b2lkICAgICgqIHJlc2FtcGxlX2ZyZWVfZnVuYykoc3RydWN0IFJlc2FtcGxlQ29udGV4dCAqKmMpOwordHlwZWRlZiBpbnQgICAgICgqIG11bHRpcGxlX3Jlc2FtcGxlX2Z1bmMpKHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKmMsIEF1ZGlvRGF0YSAqZHN0LCBpbnQgZHN0X3NpemUsIEF1ZGlvRGF0YSAqc3JjLCBpbnQgc3JjX3NpemUsIGludCAqY29uc3VtZWQpOwordHlwZWRlZiBpbnQgICAgICgqIHJlc2FtcGxlX2ZsdXNoX2Z1bmMpKHN0cnVjdCBTd3JDb250ZXh0ICpjKTsKK3R5cGVkZWYgaW50ICAgICAoKiBzZXRfY29tcGVuc2F0aW9uX2Z1bmMpKHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKmMsIGludCBzYW1wbGVfZGVsdGEsIGludCBjb21wZW5zYXRpb25fZGlzdGFuY2UpOwordHlwZWRlZiBpbnQ2NF90ICgqIGdldF9kZWxheV9mdW5jKShzdHJ1Y3QgU3dyQ29udGV4dCAqcywgaW50NjRfdCBiYXNlKTsKK3R5cGVkZWYgaW50ICAgICAoKiBpbnZlcnRfaW5pdGlhbF9idWZmZXJfZnVuYykoc3RydWN0IFJlc2FtcGxlQ29udGV4dCAqYywgQXVkaW9EYXRhICpkc3QsIGNvbnN0IEF1ZGlvRGF0YSAqc3JjLCBpbnQgc3JjX3NpemUsIGludCAqZHN0X2lkeCwgaW50ICpkc3RfY291bnQpOworCitzdHJ1Y3QgUmVzYW1wbGVyIHsKKyAgcmVzYW1wbGVfaW5pdF9mdW5jICAgICAgICAgICAgaW5pdDsKKyAgcmVzYW1wbGVfZnJlZV9mdW5jICAgICAgICAgICAgZnJlZTsKKyAgbXVsdGlwbGVfcmVzYW1wbGVfZnVuYyAgICAgICAgbXVsdGlwbGVfcmVzYW1wbGU7CisgIHJlc2FtcGxlX2ZsdXNoX2Z1bmMgICAgICAgICAgIGZsdXNoOworICBzZXRfY29tcGVuc2F0aW9uX2Z1bmMgICAgICAgICBzZXRfY29tcGVuc2F0aW9uOworICBnZXRfZGVsYXlfZnVuYyAgICAgICAgICAgICAgICBnZXRfZGVsYXk7CisgIGludmVydF9pbml0aWFsX2J1ZmZlcl9mdW5jICAgIGludmVydF9pbml0aWFsX2J1ZmZlcjsKK307CisKK2V4dGVybiBzdHJ1Y3QgUmVzYW1wbGVyIGNvbnN0IHN3cmlfcmVzYW1wbGVyOworCitpbnQgc3dyaV9yZWFsbG9jX2F1ZGlvKEF1ZGlvRGF0YSAqYSwgaW50IGNvdW50KTsKKwordm9pZCBzd3JpX25vaXNlX3NoYXBpbmdfaW50MTYgKFN3ckNvbnRleHQgKnMsIEF1ZGlvRGF0YSAqZHN0cywgY29uc3QgQXVkaW9EYXRhICpzcmNzLCBjb25zdCBBdWRpb0RhdGEgKm5vaXNlcywgaW50IGNvdW50KTsKK3ZvaWQgc3dyaV9ub2lzZV9zaGFwaW5nX2ludDMyIChTd3JDb250ZXh0ICpzLCBBdWRpb0RhdGEgKmRzdHMsIGNvbnN0IEF1ZGlvRGF0YSAqc3JjcywgY29uc3QgQXVkaW9EYXRhICpub2lzZXMsIGludCBjb3VudCk7Cit2b2lkIHN3cmlfbm9pc2Vfc2hhcGluZ19mbG9hdCAoU3dyQ29udGV4dCAqcywgQXVkaW9EYXRhICpkc3RzLCBjb25zdCBBdWRpb0RhdGEgKnNyY3MsIGNvbnN0IEF1ZGlvRGF0YSAqbm9pc2VzLCBpbnQgY291bnQpOwordm9pZCBzd3JpX25vaXNlX3NoYXBpbmdfZG91YmxlKFN3ckNvbnRleHQgKnMsIEF1ZGlvRGF0YSAqZHN0cywgY29uc3QgQXVkaW9EYXRhICpzcmNzLCBjb25zdCBBdWRpb0RhdGEgKm5vaXNlcywgaW50IGNvdW50KTsKKworaW50IHN3cmlfcmVtYXRyaXhfaW5pdChTd3JDb250ZXh0ICpzKTsKK3ZvaWQgc3dyaV9yZW1hdHJpeF9mcmVlKFN3ckNvbnRleHQgKnMpOworaW50IHN3cmlfcmVtYXRyaXgoU3dyQ29udGV4dCAqcywgQXVkaW9EYXRhICpvdXQsIEF1ZGlvRGF0YSAqaW4sIGludCBsZW4sIGludCBtdXN0Y29weSk7Cit2b2lkIHN3cmlfcmVtYXRyaXhfaW5pdF94ODYoc3RydWN0IFN3ckNvbnRleHQgKnMpOworCit2b2lkIHN3cmlfZ2V0X2RpdGhlcihTd3JDb250ZXh0ICpzLCB2b2lkICpkc3QsIGludCBsZW4sIHVuc2lnbmVkIHNlZWQsIGVudW0gQVZTYW1wbGVGb3JtYXQgbm9pc2VfZm10KTsKK2ludCBzd3JpX2RpdGhlcl9pbml0KFN3ckNvbnRleHQgKnMsIGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X2ZtdCwgZW51bSBBVlNhbXBsZUZvcm1hdCBpbl9mbXQpOworCit2b2lkIHN3cmlfYXVkaW9fY29udmVydF9pbml0X2FhcmNoNjQoc3RydWN0IEF1ZGlvQ29udmVydCAqYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IG91dF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGluX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyk7Cit2b2lkIHN3cmlfYXVkaW9fY29udmVydF9pbml0X2FybShzdHJ1Y3QgQXVkaW9Db252ZXJ0ICphYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW5fZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKTsKK3ZvaWQgc3dyaV9hdWRpb19jb252ZXJ0X2luaXRfeDg2KHN0cnVjdCBBdWRpb0NvbnZlcnQgKmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBpbl9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOworI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlcmVzLnJjIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZXJlcy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzIwZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZXJlcy5yYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogV2luZG93cyByZXNvdXJjZSBmaWxlIGZvciBsaWJzd3Jlc2FtcGxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEphbWVzIEFsbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGlhbmNoZW5nICJUaW1vdGh5IiBHdQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgImxpYnN3cmVzYW1wbGUvdmVyc2lvbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworMSBWRVJTSU9OSU5GTworRklMRVZFUlNJT04gICAgIExJQlNXUkVTQU1QTEVfVkVSU0lPTl9NQUpPUiwgTElCU1dSRVNBTVBMRV9WRVJTSU9OX01JTk9SLCBMSUJTV1JFU0FNUExFX1ZFUlNJT05fTUlDUk8sIDAKK1BST0RVQ1RWRVJTSU9OICBMSUJTV1JFU0FNUExFX1ZFUlNJT05fTUFKT1IsIExJQlNXUkVTQU1QTEVfVkVSU0lPTl9NSU5PUiwgTElCU1dSRVNBTVBMRV9WRVJTSU9OX01JQ1JPLCAwCitGSUxFRkxBR1NNQVNLICAgVlNfRkZJX0ZJTEVGTEFHU01BU0sKK0ZJTEVPUyAgICAgICAgICBWT1NfTlRfV0lORE9XUzMyCitGSUxFVFlQRSAgICAgICAgVkZUX0RMTAoreworICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICB7CisgICAgICAgIEJMT0NLICIwNDA5MDRCMCIKKyAgICAgICAgeworICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgICAgICAiRkZtcGVnIFByb2plY3QiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgICJGRm1wZWcgYXVkaW8gcmVzYW1wbGluZyBsaWJyYXJ5IgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgICAgICBBVl9TVFJJTkdJRlkoTElCU1dSRVNBTVBMRV9WRVJTSU9OKQorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICAgICAibGlic3dyZXNhbXBsZSIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICAgIkNvcHlyaWdodCAoQykgMjAwMC0iIEFWX1NUUklOR0lGWShDT05GSUdfVEhJU19ZRUFSKSAiIEZGbXBlZyBQcm9qZWN0IgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAic3dyZXNhbXBsZSIgQlVJTERTVUYgIi0iIEFWX1NUUklOR0lGWShMSUJTV1JFU0FNUExFX1ZFUlNJT05fTUFKT1IpIFNMSUJTVUYKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICAgICAgIkZGbXBlZyIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICAgRkZNUEVHX1ZFUlNJT04KKyAgICAgICAgfQorICAgIH0KKworICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgICB7CisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4MDQwOSwgMHgwNEIwCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3cmVzYW1wbGUvdmVyc2lvbi5oIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzc2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS92ZXJzaW9uLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIFZlcnNpb24gbWFjcm9zLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYnN3cmVzYW1wbGUKKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIGxpYnN3cmVzYW1wbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIFNXUl9WRVJTSU9OX0gKKyNkZWZpbmUgU1dSX1ZFUlNJT05fSAorCisvKioKKyAqIEBmaWxlCisgKiBMaWJzd3Jlc2FtcGxlIHZlcnNpb24gbWFjcm9zCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKKworI2RlZmluZSBMSUJTV1JFU0FNUExFX1ZFUlNJT05fTUFKT1IgICAxCisjZGVmaW5lIExJQlNXUkVTQU1QTEVfVkVSU0lPTl9NSU5PUiAgIDEKKyNkZWZpbmUgTElCU1dSRVNBTVBMRV9WRVJTSU9OX01JQ1JPIDEwMAorCisjZGVmaW5lIExJQlNXUkVTQU1QTEVfVkVSU0lPTl9JTlQgIEFWX1ZFUlNJT05fSU5UKExJQlNXUkVTQU1QTEVfVkVSU0lPTl9NQUpPUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJTV1JFU0FNUExFX1ZFUlNJT05fTUlOT1IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCU1dSRVNBTVBMRV9WRVJTSU9OX01JQ1JPKQorI2RlZmluZSBMSUJTV1JFU0FNUExFX1ZFUlNJT04gICAgICBBVl9WRVJTSU9OKExJQlNXUkVTQU1QTEVfVkVSU0lPTl9NQUpPUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlNXUkVTQU1QTEVfVkVSU0lPTl9NSU5PUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlNXUkVTQU1QTEVfVkVSU0lPTl9NSUNSTykKKyNkZWZpbmUgTElCU1dSRVNBTVBMRV9CVUlMRCAgICAgICAgTElCU1dSRVNBTVBMRV9WRVJTSU9OX0lOVAorCisjZGVmaW5lIExJQlNXUkVTQU1QTEVfSURFTlQgICAgICAgICJTd1IiIEFWX1NUUklOR0lGWShMSUJTV1JFU0FNUExFX1ZFUlNJT04pCisKKyNlbmRpZiAvKiBTV1JfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvTWFrZWZpbGUgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0NGRmNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3g4Ni9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKK1lBU00tT0JKUyAgICAgICAgICAgICAgICAgICAgICAgKz0geDg2L2F1ZGlvX2NvbnZlcnQub1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3JlbWF0cml4Lm9cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9yZXNhbXBsZS5vXAorCitPQkpTICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IHg4Ni9hdWRpb19jb252ZXJ0X2luaXQub1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3JlbWF0cml4X2luaXQub1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3Jlc2FtcGxlX2luaXQub1wKKworT0JKUy0kKENPTkZJR19YTU1fQ0xPQkJFUl9URVNUKSArPSB4ODYvdzY0eG1tdGVzdC5vCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvYXVkaW9fY29udmVydC5hc20gYi9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvYXVkaW9fY29udmVydC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkM2E4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3g4Ni9hdWRpb19jb252ZXJ0LmFzbQpAQCAtMCwwICsxLDQ4MiBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogQ29weXJpZ2h0IChjKSAyMDEyIE1pY2hhZWwgTmllZGVybWF5ZXIKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQSAzMgorZmx0MnBtMzE6IHRpbWVzIDggZGQgNC42NTY2MTI5ZS0xMAorZmx0MnAzMSA6IHRpbWVzIDggZGQgMjE0NzQ4MzY0OC4wCitmbHQycDE1IDogdGltZXMgOCBkZCAzMjc2OC4wCisKK3dvcmRfdW5wYWNrX3NodWYgOiBkYiAgMCwgMSwgNCwgNSwgOCwgOSwxMiwxMywgMiwgMywgNiwgNywxMCwxMSwxNCwxNQorCitTRUNUSU9OIC50ZXh0CisKKworO3RvLCBmcm9tLCBhL3UsIGxvZzJfb3V0c2l6ZSwgbG9nX2ludHNpemUsIGNvbnN0CislbWFjcm8gUEFDS18yQ0ggNS03CitjZ2xvYmFsIHBhY2tfMmNoXyUyX3RvXyUxXyUzLCAzLCA0LCA2LCBkc3QsIHNyYywgbGVuLCBzcmMyCisgICAgbW92IHNyYzJxICAgLCBbc3JjcStncHJzaXplXQorICAgIG1vdiBzcmNxICAgICwgW3NyY3FdCisgICAgbW92IGRzdHEgICAgLCBbZHN0cV0KKyVpZmlkbiAlMywgYQorICAgIHRlc3QgZHN0cSwgbW1zaXplLTEKKyAgICAgICAgam5lIHBhY2tfMmNoXyUyX3RvXyUxX3VfaW50ICUrIFNVRkZJWAorICAgIHRlc3Qgc3JjcSwgbW1zaXplLTEKKyAgICAgICAgam5lIHBhY2tfMmNoXyUyX3RvXyUxX3VfaW50ICUrIFNVRkZJWAorICAgIHRlc3Qgc3JjMnEsIG1tc2l6ZS0xCisgICAgICAgIGpuZSBwYWNrXzJjaF8lMl90b18lMV91X2ludCAlKyBTVUZGSVgKKyVlbHNlCitwYWNrXzJjaF8lMl90b18lMV91X2ludCAlKyBTVUZGSVgKKyVlbmRpZgorICAgIGxlYSAgICAgc3JjcSAsIFtzcmNxICArICgxPDwlNSkqbGVucV0KKyAgICBsZWEgICAgIHNyYzJxLCBbc3JjMnEgKyAoMTw8JTUpKmxlbnFdCisgICAgbGVhICAgICBkc3RxICwgW2RzdHEgICsgKDI8PCU0KSpsZW5xXQorICAgIG5lZyAgICAgbGVucQorICAgICU3IG0wLG0xLG0yLG0zLG00LG01CisubmV4dDoKKyVpZiAlNCA+PSAlNQorICAgIG1vdiUzICAgICBtMCwgWyAgICAgICAgIHNyY3EgKygxPDwlNSkqbGVucV0KKyAgICBtb3ZhICAgICAgbTEsIG0wCisgICAgbW92JTMgICAgIG0yLCBbICAgICAgICAgc3JjMnErKDE8PCU1KSpsZW5xXQorJWlmICU1ID09IDEKKyAgICBwdW5wY2tsd2QgbTAsIG0yCisgICAgcHVucGNraHdkIG0xLCBtMgorJWVsc2UKKyAgICBwdW5wY2tsZHEgbTAsIG0yCisgICAgcHVucGNraGRxIG0xLCBtMgorJWVuZGlmCisgICAgJTYgbTAsbTEsbTIsbTMsbTQsbTUKKyVlbHNlCisgICAgbW92JTMgICAgIG0wLCBbICAgICAgICAgc3JjcSArKDE8PCU1KSpsZW5xXQorICAgIG1vdiUzICAgICBtMSwgW21tc2l6ZSArIHNyY3EgKygxPDwlNSkqbGVucV0KKyAgICBtb3YlMyAgICAgbTIsIFsgICAgICAgICBzcmMycSsoMTw8JTUpKmxlbnFdCisgICAgbW92JTMgICAgIG0zLCBbbW1zaXplICsgc3JjMnErKDE8PCU1KSpsZW5xXQorICAgICU2IG0wLG0xLG0yLG0zLG00LG01CisgICAgbW92YSAgICAgIG0yLCBtMAorICAgIHB1bnBja2x3ZCBtMCwgbTEKKyAgICBwdW5wY2tod2QgbTIsIG0xCisgICAgU1dBUCAxLDIKKyVlbmRpZgorICAgIG1vdiUzIFsgICAgICAgICAgIGRzdHErKDI8PCU0KSpsZW5xXSwgbTAKKyAgICBtb3YlMyBbICBtbXNpemUgKyBkc3RxKygyPDwlNCkqbGVucV0sIG0xCislaWYgJTQgPiAlNQorICAgIG1vdiUzIFsyKm1tc2l6ZSArIGRzdHErKDI8PCU0KSpsZW5xXSwgbTIKKyAgICBtb3YlMyBbMyptbXNpemUgKyBkc3RxKygyPDwlNCkqbGVucV0sIG0zCisgICAgYWRkIGxlbnEsIDQqbW1zaXplLygyPDwlNCkKKyVlbHNlCisgICAgYWRkIGxlbnEsIDIqbW1zaXplLygyPDwlNCkKKyVlbmRpZgorICAgICAgICBqbCAubmV4dAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCislbWFjcm8gVU5QQUNLXzJDSCA1LTcKK2NnbG9iYWwgdW5wYWNrXzJjaF8lMl90b18lMV8lMywgMywgNCwgNywgZHN0LCBzcmMsIGxlbiwgZHN0MgorICAgIG1vdiBkc3QycSAgICwgW2RzdHErZ3Byc2l6ZV0KKyAgICBtb3Ygc3JjcSAgICAsIFtzcmNxXQorICAgIG1vdiBkc3RxICAgICwgW2RzdHFdCislaWZpZG4gJTMsIGEKKyAgICB0ZXN0IGRzdHEsIG1tc2l6ZS0xCisgICAgICAgIGpuZSB1bnBhY2tfMmNoXyUyX3RvXyUxX3VfaW50ICUrIFNVRkZJWAorICAgIHRlc3Qgc3JjcSwgbW1zaXplLTEKKyAgICAgICAgam5lIHVucGFja18yY2hfJTJfdG9fJTFfdV9pbnQgJSsgU1VGRklYCisgICAgdGVzdCBkc3QycSwgbW1zaXplLTEKKyAgICAgICAgam5lIHVucGFja18yY2hfJTJfdG9fJTFfdV9pbnQgJSsgU1VGRklYCislZWxzZQordW5wYWNrXzJjaF8lMl90b18lMV91X2ludCAlKyBTVUZGSVgKKyVlbmRpZgorICAgIGxlYSAgICAgc3JjcSAsIFtzcmNxICArICgyPDwlNSkqbGVucV0KKyAgICBsZWEgICAgIGRzdHEgLCBbZHN0cSAgKyAoMTw8JTQpKmxlbnFdCisgICAgbGVhICAgICBkc3QycSwgW2RzdDJxICsgKDE8PCU0KSpsZW5xXQorICAgIG5lZyAgICAgbGVucQorICAgICU3IG0wLG0xLG0yLG0zLG00LG01CisgICAgbW92YSAgICAgIG02LCBbd29yZF91bnBhY2tfc2h1Zl0KKy5uZXh0OgorICAgIG1vdiUzICAgICBtMCwgWyAgICAgICAgICAgc3JjcSArKDI8PCU1KSpsZW5xXQorICAgIG1vdiUzICAgICBtMiwgWyAgbW1zaXplICsgc3JjcSArKDI8PCU1KSpsZW5xXQorJWlmICU1ID09IDEKKyVpZmlkbiBTVUZGSVgsIF9zc3NlMworICAgIHBzaHVmYiAgICBtMCwgbTYKKyAgICBtb3ZhICAgICAgbTEsIG0wCisgICAgcHNodWZiICAgIG0yLCBtNgorICAgIHB1bnBja2xxZHEgbTAsbTIKKyAgICBwdW5wY2tocWRxIG0xLG0yCislZWxzZQorICAgIG1vdmEgICAgICBtMSwgbTAKKyAgICBwdW5wY2tsd2QgbTAsbTIKKyAgICBwdW5wY2tod2QgbTEsbTIKKworICAgIG1vdmEgICAgICBtMiwgbTAKKyAgICBwdW5wY2tsd2QgbTAsbTEKKyAgICBwdW5wY2tod2QgbTIsbTEKKworICAgIG1vdmEgICAgICBtMSwgbTAKKyAgICBwdW5wY2tsd2QgbTAsbTIKKyAgICBwdW5wY2tod2QgbTEsbTIKKyVlbmRpZgorJWVsc2UKKyAgICBtb3ZhICAgICAgbTEsIG0wCisgICAgc2h1ZnBzICAgIG0wLCBtMiwgMTAwMDEwMDBiCisgICAgc2h1ZnBzICAgIG0xLCBtMiwgMTEwMTExMDFiCislZW5kaWYKKyVpZiAlNCA8ICU1CisgICAgbW92JTMgICAgIG0yLCBbMiptbXNpemUgKyBzcmNxICsoMjw8JTUpKmxlbnFdCisgICAgbW92YSAgICAgIG0zLCBtMgorICAgIG1vdiUzICAgICBtNCwgWzMqbW1zaXplICsgc3JjcSArKDI8PCU1KSpsZW5xXQorICAgIHNodWZwcyAgICBtMiwgbTQsIDEwMDAxMDAwYgorICAgIHNodWZwcyAgICBtMywgbTQsIDExMDExMTAxYgorICAgIFNXQVAgMSwyCislZW5kaWYKKyAgICAlNiBtMCxtMSxtMixtMyxtNCxtNQorICAgIG1vdiUzIFsgICAgICAgICAgIGRzdHErKDE8PCU0KSpsZW5xXSwgbTAKKyVpZiAlNCA+ICU1CisgICAgbW92JTMgWyAgICAgICAgICBkc3QycSsoMTw8JTQpKmxlbnFdLCBtMgorICAgIG1vdiUzIFsgbW1zaXplICsgIGRzdHErKDE8PCU0KSpsZW5xXSwgbTEKKyAgICBtb3YlMyBbIG1tc2l6ZSArIGRzdDJxKygxPDwlNCkqbGVucV0sIG0zCisgICAgYWRkIGxlbnEsIDIqbW1zaXplLygxPDwlNCkKKyVlbHNlCisgICAgbW92JTMgWyAgICAgICAgICBkc3QycSsoMTw8JTQpKmxlbnFdLCBtMQorICAgIGFkZCBsZW5xLCBtbXNpemUvKDE8PCU0KQorJWVuZGlmCisgICAgICAgIGpsIC5uZXh0CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKKyVtYWNybyBDT05WIDUtNworY2dsb2JhbCAlMl90b18lMV8lMywgMywgMywgNiwgZHN0LCBzcmMsIGxlbgorICAgIG1vdiBzcmNxICAgICwgW3NyY3FdCisgICAgbW92IGRzdHEgICAgLCBbZHN0cV0KKyVpZmlkbiAlMywgYQorICAgIHRlc3QgZHN0cSwgbW1zaXplLTEKKyAgICAgICAgam5lICUyX3RvXyUxX3VfaW50ICUrIFNVRkZJWAorICAgIHRlc3Qgc3JjcSwgbW1zaXplLTEKKyAgICAgICAgam5lICUyX3RvXyUxX3VfaW50ICUrIFNVRkZJWAorJWVsc2UKKyUyX3RvXyUxX3VfaW50ICUrIFNVRkZJWAorJWVuZGlmCisgICAgbGVhICAgICBzcmNxICwgW3NyY3EgICsgKDE8PCU1KSpsZW5xXQorICAgIGxlYSAgICAgZHN0cSAsIFtkc3RxICArICgxPDwlNCkqbGVucV0KKyAgICBuZWcgICAgIGxlbnEKKyAgICAlNyBtMCxtMSxtMixtMyxtNCxtNQorLm5leHQ6CisgICAgbW92JTMgICAgIG0wLCBbICAgICAgICAgICBzcmNxICsoMTw8JTUpKmxlbnFdCisgICAgbW92JTMgICAgIG0xLCBbICBtbXNpemUgKyBzcmNxICsoMTw8JTUpKmxlbnFdCislaWYgJTQgPCAlNQorICAgIG1vdiUzICAgICBtMiwgWzIqbW1zaXplICsgc3JjcSArKDE8PCU1KSpsZW5xXQorICAgIG1vdiUzICAgICBtMywgWzMqbW1zaXplICsgc3JjcSArKDE8PCU1KSpsZW5xXQorJWVuZGlmCisgICAgJTYgbTAsbTEsbTIsbTMsbTQsbTUKKyAgICBtb3YlMyBbICAgICAgICAgICBkc3RxKygxPDwlNCkqbGVucV0sIG0wCisgICAgbW92JTMgWyAgbW1zaXplICsgZHN0cSsoMTw8JTQpKmxlbnFdLCBtMQorJWlmICU0ID4gJTUKKyAgICBtb3YlMyBbMiptbXNpemUgKyBkc3RxKygxPDwlNCkqbGVucV0sIG0yCisgICAgbW92JTMgWzMqbW1zaXplICsgZHN0cSsoMTw8JTQpKmxlbnFdLCBtMworICAgIGFkZCBsZW5xLCA0Km1tc2l6ZS8oMTw8JTQpCislZWxzZQorICAgIGFkZCBsZW5xLCAyKm1tc2l6ZS8oMTw8JTQpCislZW5kaWYKKyAgICAgICAgamwgLm5leHQKKyVpZiBtbXNpemUgPT0gOAorICAgIGVtbXMKKyAgICBSRVQKKyVlbHNlCisgICAgUkVQX1JFVAorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFBBQ0tfNkNIIDUtNworY2dsb2JhbCBwYWNrXzZjaF8lMl90b18lMV8lMywgMiw4LDcsIGRzdCwgc3JjLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBsZW4KKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdiAgICAgbGVuZCwgcjJkCislZWxzZQorICAgICVkZWZpbmUgbGVuZCBkd29yZCByMm0KKyVlbmRpZgorICAgIG1vdiAgICBzcmMxcSwgW3NyY3ErMSpncHJzaXplXQorICAgIG1vdiAgICBzcmMycSwgW3NyY3ErMipncHJzaXplXQorICAgIG1vdiAgICBzcmMzcSwgW3NyY3ErMypncHJzaXplXQorICAgIG1vdiAgICBzcmM0cSwgW3NyY3ErNCpncHJzaXplXQorICAgIG1vdiAgICBzcmM1cSwgW3NyY3ErNSpncHJzaXplXQorICAgIG1vdiAgICAgc3JjcSwgW3NyY3FdCisgICAgbW92ICAgICBkc3RxLCBbZHN0cV0KKyVpZmlkbiAlMywgYQorICAgIHRlc3QgZHN0cSwgbW1zaXplLTEKKyAgICAgICAgam5lIHBhY2tfNmNoXyUyX3RvXyUxX3VfaW50ICUrIFNVRkZJWAorICAgIHRlc3Qgc3JjcSwgbW1zaXplLTEKKyAgICAgICAgam5lIHBhY2tfNmNoXyUyX3RvXyUxX3VfaW50ICUrIFNVRkZJWAorICAgIHRlc3Qgc3JjMnEsIG1tc2l6ZS0xCisgICAgICAgIGpuZSBwYWNrXzZjaF8lMl90b18lMV91X2ludCAlKyBTVUZGSVgKKyAgICB0ZXN0IHNyYzNxLCBtbXNpemUtMQorICAgICAgICBqbmUgcGFja182Y2hfJTJfdG9fJTFfdV9pbnQgJSsgU1VGRklYCisgICAgdGVzdCBzcmM0cSwgbW1zaXplLTEKKyAgICAgICAgam5lIHBhY2tfNmNoXyUyX3RvXyUxX3VfaW50ICUrIFNVRkZJWAorICAgIHRlc3Qgc3JjNXEsIG1tc2l6ZS0xCisgICAgICAgIGpuZSBwYWNrXzZjaF8lMl90b18lMV91X2ludCAlKyBTVUZGSVgKKyVlbHNlCitwYWNrXzZjaF8lMl90b18lMV91X2ludCAlKyBTVUZGSVgKKyVlbmRpZgorICAgIHN1YiAgICBzcmMxcSwgc3JjcQorICAgIHN1YiAgICBzcmMycSwgc3JjcQorICAgIHN1YiAgICBzcmMzcSwgc3JjcQorICAgIHN1YiAgICBzcmM0cSwgc3JjcQorICAgIHN1YiAgICBzcmM1cSwgc3JjcQorLmxvb3A6CisgICAgbW92JTMgICAgIG0wLCBbc3JjcSAgICAgIF0KKyAgICBtb3YlMyAgICAgbTEsIFtzcmNxK3NyYzFxXQorICAgIG1vdiUzICAgICBtMiwgW3NyY3Erc3JjMnFdCisgICAgbW92JTMgICAgIG0zLCBbc3JjcStzcmMzcV0KKyAgICBtb3YlMyAgICAgbTQsIFtzcmNxK3NyYzRxXQorICAgIG1vdiUzICAgICBtNSwgW3NyY3Erc3JjNXFdCisgICAgJTcgeCx4LHgseCxtNyx4CislaWYgY3B1ZmxhZyhzc2UpCisgICAgU0JVVFRFUkZMWVBTIDAsIDEsIDYKKyAgICBTQlVUVEVSRkxZUFMgMiwgMywgNgorICAgIFNCVVRURVJGTFlQUyA0LCA1LCA2CisKKyVpZiBjcHVmbGFnKGF2eCkKKyAgICBibGVuZHBzICAgbTYsIG00LCBtMCwgMTEwMGIKKyVlbHNlCisgICAgbW92YXBzICAgIG02LCBtNAorICAgIHNodWZwcyAgICBtNCwgbTAsIHEzMjEwCisgICAgU1dBUCA0LDYKKyVlbmRpZgorICAgIG1vdmxocHMgICBtMCwgbTIKKyAgICBtb3ZobHBzICAgbTQsIG0yCislaWYgY3B1ZmxhZyhhdngpCisgICAgYmxlbmRwcyAgIG0yLCBtNSwgbTEsIDExMDBiCislZWxzZQorICAgIG1vdmFwcyAgICBtMiwgbTUKKyAgICBzaHVmcHMgICAgbTUsIG0xLCBxMzIxMAorICAgIFNXQVAgMiw1CislZW5kaWYKKyAgICBtb3ZsaHBzICAgbTEsIG0zCisgICAgbW92aGxwcyAgIG01LCBtMworCisgICAgJTYgbTAsbTYseCx4LG03LG0zCisgICAgJTYgbTQsbTEseCx4LG03LG0zCisgICAgJTYgbTIsbTUseCx4LG03LG0zCisKKyAgICBtb3YgJSsgJTMgJSsgcHMgW2RzdHEgICBdLCBtMAorICAgIG1vdiAlKyAlMyAlKyBwcyBbZHN0cSsxNl0sIG02CisgICAgbW92ICUrICUzICUrIHBzIFtkc3RxKzMyXSwgbTQKKyAgICBtb3YgJSsgJTMgJSsgcHMgW2RzdHErNDhdLCBtMQorICAgIG1vdiAlKyAlMyAlKyBwcyBbZHN0cSs2NF0sIG0yCisgICAgbW92ICUrICUzICUrIHBzIFtkc3RxKzgwXSwgbTUKKyVlbHNlIDsgbW14CisgICAgU0JVVFRFUkZMWSBkcSwgMCwgMSwgNgorICAgIFNCVVRURVJGTFkgZHEsIDIsIDMsIDYKKyAgICBTQlVUVEVSRkxZIGRxLCA0LCA1LCA2CisKKyAgICBtb3ZxICAgW2RzdHEgICBdLCBtMAorICAgIG1vdnEgICBbZHN0cSsgOF0sIG0yCisgICAgbW92cSAgIFtkc3RxKzE2XSwgbTQKKyAgICBtb3ZxICAgW2RzdHErMjRdLCBtMQorICAgIG1vdnEgICBbZHN0cSszMl0sIG0zCisgICAgbW92cSAgIFtkc3RxKzQwXSwgbTUKKyVlbmRpZgorICAgIGFkZCAgICAgIHNyY3EsIG1tc2l6ZQorICAgIGFkZCAgICAgIGRzdHEsIG1tc2l6ZSo2CisgICAgc3ViICAgICAgbGVuZCwgbW1zaXplLzQKKyAgICBqZyAubG9vcAorJWlmIG1tc2l6ZSA9PSA4CisgICAgZW1tcworICAgIFJFVAorJWVsc2UKKyAgICBSRVBfUkVUCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gSU5UMTZfVE9fSU5UMzJfTiA2CisgICAgcHhvciAgICAgIG0yLCBtMgorICAgIHB4b3IgICAgICBtMywgbTMKKyAgICBwdW5wY2tsd2QgbTIsIG0xCisgICAgcHVucGNraHdkIG0zLCBtMQorICAgIFNXQVAgNCwwCisgICAgcHhvciAgICAgIG0wLCBtMAorICAgIHB4b3IgICAgICBtMSwgbTEKKyAgICBwdW5wY2tsd2QgbTAsIG00CisgICAgcHVucGNraHdkIG0xLCBtNAorJWVuZG1hY3JvCisKKyVtYWNybyBJTlQzMl9UT19JTlQxNl9OIDYKKyAgICBwc3JhZCAgICAgbTAsIDE2CisgICAgcHNyYWQgICAgIG0xLCAxNgorICAgIHBzcmFkICAgICBtMiwgMTYKKyAgICBwc3JhZCAgICAgbTMsIDE2CisgICAgcGFja3NzZHcgIG0wLCBtMQorICAgIHBhY2tzc2R3ICBtMiwgbTMKKyAgICBTV0FQIDEsMgorJWVuZG1hY3JvCisKKyVtYWNybyBJTlQzMl9UT19GTE9BVF9JTklUIDYKKyAgICBtb3ZhICAgICAgJTUsIFtmbHQycG0zMV0KKyVlbmRtYWNybworJW1hY3JvIElOVDMyX1RPX0ZMT0FUX04gNgorICAgIGN2dGRxMnBzICAlMSwgJTEKKyAgICBjdnRkcTJwcyAgJTIsICUyCisgICAgbXVscHMgJTEsICUxLCAlNQorICAgIG11bHBzICUyLCAlMiwgJTUKKyVlbmRtYWNybworCislbWFjcm8gRkxPQVRfVE9fSU5UMzJfSU5JVCA2CisgICAgbW92YSAgICAgICU1LCBbZmx0MnAzMV0KKyVlbmRtYWNybworJW1hY3JvIEZMT0FUX1RPX0lOVDMyX04gNgorICAgIG11bHBzICUxLCAlNQorICAgIG11bHBzICUyLCAlNQorICAgIGN2dHBzMmRxICAlNiwgJTEKKyAgICBjbXBwcyAlMSwgJTEsICU1LCA1CisgICAgcGFkZGQgJTEsICU2CisgICAgY3Z0cHMyZHEgICU2LCAlMgorICAgIGNtcHBzICUyLCAlMiwgJTUsIDUKKyAgICBwYWRkZCAlMiwgJTYKKyVlbmRtYWNybworCislbWFjcm8gSU5UMTZfVE9fRkxPQVRfSU5JVCA2CisgICAgbW92YSAgICAgIG01LCBbZmx0MnBtMzFdCislZW5kbWFjcm8KKyVtYWNybyBJTlQxNl9UT19GTE9BVF9OIDYKKyAgICBJTlQxNl9UT19JTlQzMl9OICUxLCUyLCUzLCU0LCU1LCU2CisgICAgY3Z0ZHEycHMgIG0wLCBtMAorICAgIGN2dGRxMnBzICBtMSwgbTEKKyAgICBjdnRkcTJwcyAgbTIsIG0yCisgICAgY3Z0ZHEycHMgIG0zLCBtMworICAgIG11bHBzIG0wLCBtMCwgbTUKKyAgICBtdWxwcyBtMSwgbTEsIG01CisgICAgbXVscHMgbTIsIG0yLCBtNQorICAgIG11bHBzIG0zLCBtMywgbTUKKyVlbmRtYWNybworCislbWFjcm8gRkxPQVRfVE9fSU5UMTZfSU5JVCA2CisgICAgbW92YSAgICAgIG01LCBbZmx0MnAxNV0KKyVlbmRtYWNybworJW1hY3JvIEZMT0FUX1RPX0lOVDE2X04gNgorICAgIG11bHBzIG0wLCBtNQorICAgIG11bHBzIG0xLCBtNQorICAgIG11bHBzIG0yLCBtNQorICAgIG11bHBzIG0zLCBtNQorICAgIGN2dHBzMmRxICBtMCwgbTAKKyAgICBjdnRwczJkcSAgbTEsIG0xCisgICAgcGFja3NzZHcgIG0wLCBtMQorICAgIGN2dHBzMmRxICBtMSwgbTIKKyAgICBjdnRwczJkcSAgbTMsIG0zCisgICAgcGFja3NzZHcgIG0xLCBtMworJWVuZG1hY3JvCisKKyVtYWNybyBOT1BfTiAwLTYKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK0NPTlYgaW50MzIsIGludDE2LCB1LCAyLCAxLCBJTlQxNl9UT19JTlQzMl9OLCBOT1BfTgorQ09OViBpbnQzMiwgaW50MTYsIGEsIDIsIDEsIElOVDE2X1RPX0lOVDMyX04sIE5PUF9OCitDT05WIGludDE2LCBpbnQzMiwgdSwgMSwgMiwgSU5UMzJfVE9fSU5UMTZfTiwgTk9QX04KK0NPTlYgaW50MTYsIGludDMyLCBhLCAxLCAyLCBJTlQzMl9UT19JTlQxNl9OLCBOT1BfTgorCitQQUNLXzZDSCBmbG9hdCwgZmxvYXQsIHUsIDIsIDIsIE5PUF9OLCBOT1BfTgorUEFDS182Q0ggZmxvYXQsIGZsb2F0LCBhLCAyLCAyLCBOT1BfTiwgTk9QX04KKworSU5JVF9YTU0gc3NlCitQQUNLXzZDSCBmbG9hdCwgZmxvYXQsIHUsIDIsIDIsIE5PUF9OLCBOT1BfTgorUEFDS182Q0ggZmxvYXQsIGZsb2F0LCBhLCAyLCAyLCBOT1BfTiwgTk9QX04KKworSU5JVF9YTU0gc3NlMgorQ09OViBpbnQzMiwgaW50MTYsIHUsIDIsIDEsIElOVDE2X1RPX0lOVDMyX04sIE5PUF9OCitDT05WIGludDMyLCBpbnQxNiwgYSwgMiwgMSwgSU5UMTZfVE9fSU5UMzJfTiwgTk9QX04KK0NPTlYgaW50MTYsIGludDMyLCB1LCAxLCAyLCBJTlQzMl9UT19JTlQxNl9OLCBOT1BfTgorQ09OViBpbnQxNiwgaW50MzIsIGEsIDEsIDIsIElOVDMyX1RPX0lOVDE2X04sIE5PUF9OCisKK1BBQ0tfMkNIIGludDE2LCBpbnQxNiwgdSwgMSwgMSwgTk9QX04sIE5PUF9OCitQQUNLXzJDSCBpbnQxNiwgaW50MTYsIGEsIDEsIDEsIE5PUF9OLCBOT1BfTgorUEFDS18yQ0ggaW50MzIsIGludDMyLCB1LCAyLCAyLCBOT1BfTiwgTk9QX04KK1BBQ0tfMkNIIGludDMyLCBpbnQzMiwgYSwgMiwgMiwgTk9QX04sIE5PUF9OCitQQUNLXzJDSCBpbnQzMiwgaW50MTYsIHUsIDIsIDEsIElOVDE2X1RPX0lOVDMyX04sIE5PUF9OCitQQUNLXzJDSCBpbnQzMiwgaW50MTYsIGEsIDIsIDEsIElOVDE2X1RPX0lOVDMyX04sIE5PUF9OCitQQUNLXzJDSCBpbnQxNiwgaW50MzIsIHUsIDEsIDIsIElOVDMyX1RPX0lOVDE2X04sIE5PUF9OCitQQUNLXzJDSCBpbnQxNiwgaW50MzIsIGEsIDEsIDIsIElOVDMyX1RPX0lOVDE2X04sIE5PUF9OCisKK1VOUEFDS18yQ0ggaW50MTYsIGludDE2LCB1LCAxLCAxLCBOT1BfTiwgTk9QX04KK1VOUEFDS18yQ0ggaW50MTYsIGludDE2LCBhLCAxLCAxLCBOT1BfTiwgTk9QX04KK1VOUEFDS18yQ0ggaW50MzIsIGludDMyLCB1LCAyLCAyLCBOT1BfTiwgTk9QX04KK1VOUEFDS18yQ0ggaW50MzIsIGludDMyLCBhLCAyLCAyLCBOT1BfTiwgTk9QX04KK1VOUEFDS18yQ0ggaW50MzIsIGludDE2LCB1LCAyLCAxLCBJTlQxNl9UT19JTlQzMl9OLCBOT1BfTgorVU5QQUNLXzJDSCBpbnQzMiwgaW50MTYsIGEsIDIsIDEsIElOVDE2X1RPX0lOVDMyX04sIE5PUF9OCitVTlBBQ0tfMkNIIGludDE2LCBpbnQzMiwgdSwgMSwgMiwgSU5UMzJfVE9fSU5UMTZfTiwgTk9QX04KK1VOUEFDS18yQ0ggaW50MTYsIGludDMyLCBhLCAxLCAyLCBJTlQzMl9UT19JTlQxNl9OLCBOT1BfTgorCitDT05WIGZsb2F0LCBpbnQzMiwgdSwgMiwgMiwgSU5UMzJfVE9fRkxPQVRfTiwgSU5UMzJfVE9fRkxPQVRfSU5JVAorQ09OViBmbG9hdCwgaW50MzIsIGEsIDIsIDIsIElOVDMyX1RPX0ZMT0FUX04sIElOVDMyX1RPX0ZMT0FUX0lOSVQKK0NPTlYgaW50MzIsIGZsb2F0LCB1LCAyLCAyLCBGTE9BVF9UT19JTlQzMl9OLCBGTE9BVF9UT19JTlQzMl9JTklUCitDT05WIGludDMyLCBmbG9hdCwgYSwgMiwgMiwgRkxPQVRfVE9fSU5UMzJfTiwgRkxPQVRfVE9fSU5UMzJfSU5JVAorQ09OViBmbG9hdCwgaW50MTYsIHUsIDIsIDEsIElOVDE2X1RPX0ZMT0FUX04sIElOVDE2X1RPX0ZMT0FUX0lOSVQKK0NPTlYgZmxvYXQsIGludDE2LCBhLCAyLCAxLCBJTlQxNl9UT19GTE9BVF9OLCBJTlQxNl9UT19GTE9BVF9JTklUCitDT05WIGludDE2LCBmbG9hdCwgdSwgMSwgMiwgRkxPQVRfVE9fSU5UMTZfTiwgRkxPQVRfVE9fSU5UMTZfSU5JVAorQ09OViBpbnQxNiwgZmxvYXQsIGEsIDEsIDIsIEZMT0FUX1RPX0lOVDE2X04sIEZMT0FUX1RPX0lOVDE2X0lOSVQKKworUEFDS18yQ0ggZmxvYXQsIGludDMyLCB1LCAyLCAyLCBJTlQzMl9UT19GTE9BVF9OLCBJTlQzMl9UT19GTE9BVF9JTklUCitQQUNLXzJDSCBmbG9hdCwgaW50MzIsIGEsIDIsIDIsIElOVDMyX1RPX0ZMT0FUX04sIElOVDMyX1RPX0ZMT0FUX0lOSVQKK1BBQ0tfMkNIIGludDMyLCBmbG9hdCwgdSwgMiwgMiwgRkxPQVRfVE9fSU5UMzJfTiwgRkxPQVRfVE9fSU5UMzJfSU5JVAorUEFDS18yQ0ggaW50MzIsIGZsb2F0LCBhLCAyLCAyLCBGTE9BVF9UT19JTlQzMl9OLCBGTE9BVF9UT19JTlQzMl9JTklUCitQQUNLXzJDSCBmbG9hdCwgaW50MTYsIHUsIDIsIDEsIElOVDE2X1RPX0ZMT0FUX04sIElOVDE2X1RPX0ZMT0FUX0lOSVQKK1BBQ0tfMkNIIGZsb2F0LCBpbnQxNiwgYSwgMiwgMSwgSU5UMTZfVE9fRkxPQVRfTiwgSU5UMTZfVE9fRkxPQVRfSU5JVAorUEFDS18yQ0ggaW50MTYsIGZsb2F0LCB1LCAxLCAyLCBGTE9BVF9UT19JTlQxNl9OLCBGTE9BVF9UT19JTlQxNl9JTklUCitQQUNLXzJDSCBpbnQxNiwgZmxvYXQsIGEsIDEsIDIsIEZMT0FUX1RPX0lOVDE2X04sIEZMT0FUX1RPX0lOVDE2X0lOSVQKKworVU5QQUNLXzJDSCBmbG9hdCwgaW50MzIsIHUsIDIsIDIsIElOVDMyX1RPX0ZMT0FUX04sIElOVDMyX1RPX0ZMT0FUX0lOSVQKK1VOUEFDS18yQ0ggZmxvYXQsIGludDMyLCBhLCAyLCAyLCBJTlQzMl9UT19GTE9BVF9OLCBJTlQzMl9UT19GTE9BVF9JTklUCitVTlBBQ0tfMkNIIGludDMyLCBmbG9hdCwgdSwgMiwgMiwgRkxPQVRfVE9fSU5UMzJfTiwgRkxPQVRfVE9fSU5UMzJfSU5JVAorVU5QQUNLXzJDSCBpbnQzMiwgZmxvYXQsIGEsIDIsIDIsIEZMT0FUX1RPX0lOVDMyX04sIEZMT0FUX1RPX0lOVDMyX0lOSVQKK1VOUEFDS18yQ0ggZmxvYXQsIGludDE2LCB1LCAyLCAxLCBJTlQxNl9UT19GTE9BVF9OLCBJTlQxNl9UT19GTE9BVF9JTklUCitVTlBBQ0tfMkNIIGZsb2F0LCBpbnQxNiwgYSwgMiwgMSwgSU5UMTZfVE9fRkxPQVRfTiwgSU5UMTZfVE9fRkxPQVRfSU5JVAorVU5QQUNLXzJDSCBpbnQxNiwgZmxvYXQsIHUsIDEsIDIsIEZMT0FUX1RPX0lOVDE2X04sIEZMT0FUX1RPX0lOVDE2X0lOSVQKK1VOUEFDS18yQ0ggaW50MTYsIGZsb2F0LCBhLCAxLCAyLCBGTE9BVF9UT19JTlQxNl9OLCBGTE9BVF9UT19JTlQxNl9JTklUCisKK1BBQ0tfNkNIIGZsb2F0LCBpbnQzMiwgdSwgMiwgMiwgSU5UMzJfVE9fRkxPQVRfTiwgSU5UMzJfVE9fRkxPQVRfSU5JVAorUEFDS182Q0ggZmxvYXQsIGludDMyLCBhLCAyLCAyLCBJTlQzMl9UT19GTE9BVF9OLCBJTlQzMl9UT19GTE9BVF9JTklUCitQQUNLXzZDSCBpbnQzMiwgZmxvYXQsIHUsIDIsIDIsIEZMT0FUX1RPX0lOVDMyX04sIEZMT0FUX1RPX0lOVDMyX0lOSVQKK1BBQ0tfNkNIIGludDMyLCBmbG9hdCwgYSwgMiwgMiwgRkxPQVRfVE9fSU5UMzJfTiwgRkxPQVRfVE9fSU5UMzJfSU5JVAorCitJTklUX1hNTSBzc3NlMworVU5QQUNLXzJDSCBpbnQxNiwgaW50MTYsIHUsIDEsIDEsIE5PUF9OLCBOT1BfTgorVU5QQUNLXzJDSCBpbnQxNiwgaW50MTYsIGEsIDEsIDEsIE5PUF9OLCBOT1BfTgorVU5QQUNLXzJDSCBpbnQzMiwgaW50MTYsIHUsIDIsIDEsIElOVDE2X1RPX0lOVDMyX04sIE5PUF9OCitVTlBBQ0tfMkNIIGludDMyLCBpbnQxNiwgYSwgMiwgMSwgSU5UMTZfVE9fSU5UMzJfTiwgTk9QX04KK1VOUEFDS18yQ0ggZmxvYXQsIGludDE2LCB1LCAyLCAxLCBJTlQxNl9UT19GTE9BVF9OLCBJTlQxNl9UT19GTE9BVF9JTklUCitVTlBBQ0tfMkNIIGZsb2F0LCBpbnQxNiwgYSwgMiwgMSwgSU5UMTZfVE9fRkxPQVRfTiwgSU5UMTZfVE9fRkxPQVRfSU5JVAorCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorUEFDS182Q0ggZmxvYXQsIGZsb2F0LCB1LCAyLCAyLCBOT1BfTiwgTk9QX04KK1BBQ0tfNkNIIGZsb2F0LCBmbG9hdCwgYSwgMiwgMiwgTk9QX04sIE5PUF9OCisKK1BBQ0tfNkNIIGZsb2F0LCBpbnQzMiwgdSwgMiwgMiwgSU5UMzJfVE9fRkxPQVRfTiwgSU5UMzJfVE9fRkxPQVRfSU5JVAorUEFDS182Q0ggZmxvYXQsIGludDMyLCBhLCAyLCAyLCBJTlQzMl9UT19GTE9BVF9OLCBJTlQzMl9UT19GTE9BVF9JTklUCitQQUNLXzZDSCBpbnQzMiwgZmxvYXQsIHUsIDIsIDIsIEZMT0FUX1RPX0lOVDMyX04sIEZMT0FUX1RPX0lOVDMyX0lOSVQKK1BBQ0tfNkNIIGludDMyLCBmbG9hdCwgYSwgMiwgMiwgRkxPQVRfVE9fSU5UMzJfTiwgRkxPQVRfVE9fSU5UMzJfSU5JVAorCitJTklUX1lNTSBhdngKK0NPTlYgZmxvYXQsIGludDMyLCB1LCAyLCAyLCBJTlQzMl9UT19GTE9BVF9OLCBJTlQzMl9UT19GTE9BVF9JTklUCitDT05WIGZsb2F0LCBpbnQzMiwgYSwgMiwgMiwgSU5UMzJfVE9fRkxPQVRfTiwgSU5UMzJfVE9fRkxPQVRfSU5JVAorJWVuZGlmCisKKyVpZiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK0NPTlYgaW50MzIsIGZsb2F0LCB1LCAyLCAyLCBGTE9BVF9UT19JTlQzMl9OLCBGTE9BVF9UT19JTlQzMl9JTklUCitDT05WIGludDMyLCBmbG9hdCwgYSwgMiwgMiwgRkxPQVRfVE9fSU5UMzJfTiwgRkxPQVRfVE9fSU5UMzJfSU5JVAorJWVuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvYXVkaW9fY29udmVydF9pbml0LmMgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvYXVkaW9fY29udmVydF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiZWQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3g4Ni9hdWRpb19jb252ZXJ0X2luaXQuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyIChtaWNoYWVsbmlAZ214LmF0KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYnN3cmVzYW1wbGUKKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIGxpYnN3cmVzYW1wbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL2F1ZGlvY29udmVydC5oIgorCisjZGVmaW5lIFBST1RPKHByZSwgaW4sIG91dCwgY2FwKSB2b2lkIGZmICMjIHByZSAjIyBpbiMjIF90b18gIyNvdXQjIyBfYV8gIyNjYXAodWludDhfdCAqKmRzdCwgY29uc3QgdWludDhfdCAqKnNyYywgaW50IGxlbik7CisjZGVmaW5lIFBST1RPMihwcmUsIG91dCwgY2FwKSBQUk9UTyhwcmUsIGludDE2LCBvdXQsIGNhcCkgUFJPVE8ocHJlLCBpbnQzMiwgb3V0LCBjYXApIFBST1RPKHByZSwgZmxvYXQsIG91dCwgY2FwKQorI2RlZmluZSBQUk9UTzMocHJlLCBjYXApIFBST1RPMihwcmUsIGludDE2LCBjYXApIFBST1RPMihwcmUsIGludDMyLCBjYXApIFBST1RPMihwcmUsIGZsb2F0LCBjYXApCisjZGVmaW5lIFBST1RPNChwcmUpIFBST1RPMyhwcmUsIG1teCkgUFJPVE8zKHByZSwgc3NlKSBQUk9UTzMocHJlLCBzc2UyKSBQUk9UTzMocHJlLCBzc3NlMykgUFJPVE8zKHByZSwgc3NlNCkgUFJPVE8zKHByZSwgYXZ4KSBQUk9UTzMocHJlLCBhdngyKQorUFJPVE80KF8pCitQUk9UTzQoX3BhY2tfMmNoXykKK1BST1RPNChfcGFja182Y2hfKQorUFJPVE80KF91bnBhY2tfMmNoXykKKworYXZfY29sZCB2b2lkIHN3cmlfYXVkaW9fY29udmVydF9pbml0X3g4NihzdHJ1Y3QgQXVkaW9Db252ZXJ0ICphYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW5fZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKXsKKyAgICBpbnQgbW1fZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBhYy0+c2ltZF9mPSBOVUxMOworCisvL0ZJWE1FIGFkZCBtZW1jcHkgY2FzZQorCisjZGVmaW5lIE1VTFRJX0NBUFNfRlVOQyhmbGFnLCBjYXApIFwKKyAgICBpZiAoRVhURVJOQUxfIyNmbGFnKG1tX2ZsYWdzKSkge1wKKyAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMiAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzE2IHx8IG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzJQICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlApXAorICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl9pbnQxNl90b19pbnQzMl9hXyAjIyBjYXA7XAorICAgICAgICBpZiggICBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfUzE2ICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIgfHwgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUClcCisgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX2ludDMyX3RvX2ludDE2X2FfICMjIGNhcDtcCisgICAgfQorCitNVUxUSV9DQVBTX0ZVTkMoTU1YLCBtbXgpCitNVUxUSV9DQVBTX0ZVTkMoU1NFMiwgc3NlMikKKworICAgIGlmKEVYVEVSTkFMX01NWChtbV9mbGFncykpIHsKKyAgICAgICAgaWYoY2hhbm5lbHMgPT0gNikgeworICAgICAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUUCB8fCBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMlApCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl9wYWNrXzZjaF9mbG9hdF90b19mbG9hdF9hX21teDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihFWFRFUk5BTF9TU0UobW1fZmxhZ3MpKSB7CisgICAgICAgIGlmKGNoYW5uZWxzID09IDYpIHsKKyAgICAgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFQgICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVFAgfHwgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMiAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzJQKQorICAgICAgICAgICAgICAgIGFjLT5zaW1kX2YgPSAgZmZfcGFja182Y2hfZmxvYXRfdG9fZmxvYXRfYV9zc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoRVhURVJOQUxfU1NFMihtbV9mbGFncykpIHsKKyAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyIHx8IG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMlApCisgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX2ludDMyX3RvX2Zsb2F0X2Ffc3NlMjsKKyAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzE2IHx8IG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlApCisgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX2ludDE2X3RvX2Zsb2F0X2Ffc3NlMjsKKyAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMiAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUIHx8IG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzJQICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVFApCisgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX2Zsb2F0X3RvX2ludDMyX2Ffc3NlMjsKKyAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNiAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUIHx8IG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVFApCisgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX2Zsb2F0X3RvX2ludDE2X2Ffc3NlMjsKKworICAgICAgICBpZihjaGFubmVscyA9PSAyKSB7CisgICAgICAgICAgICBpZiggICBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQIHx8IG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUCkKKyAgICAgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX3BhY2tfMmNoX2ludDMyX3RvX2ludDMyX2Ffc3NlMjsKKyAgICAgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTYgICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlApCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl9wYWNrXzJjaF9pbnQxNl90b19pbnQxNl9hX3NzZTI7CisgICAgICAgICAgICBpZiggICBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQKQorICAgICAgICAgICAgICAgIGFjLT5zaW1kX2YgPSAgZmZfcGFja18yY2hfaW50MTZfdG9faW50MzJfYV9zc2UyOworICAgICAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNiAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUCkKKyAgICAgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX3BhY2tfMmNoX2ludDMyX3RvX2ludDE2X2Ffc3NlMjsKKworICAgICAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVFAgICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCB8fCBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUCAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIpCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl91bnBhY2tfMmNoX2ludDMyX3RvX2ludDMyX2Ffc3NlMjsKKyAgICAgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTYpCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl91bnBhY2tfMmNoX2ludDE2X3RvX2ludDE2X2Ffc3NlMjsKKyAgICAgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzJQICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTYpCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl91bnBhY2tfMmNoX2ludDE2X3RvX2ludDMyX2Ffc3NlMjsKKyAgICAgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIpCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl91bnBhY2tfMmNoX2ludDMyX3RvX2ludDE2X2Ffc3NlMjsKKworICAgICAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUCkKKyAgICAgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX3BhY2tfMmNoX2ludDMyX3RvX2Zsb2F0X2Ffc3NlMjsKKyAgICAgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIgICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVFApCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl9wYWNrXzJjaF9mbG9hdF90b19pbnQzMl9hX3NzZTI7CisgICAgICAgICAgICBpZiggICBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQKQorICAgICAgICAgICAgICAgIGFjLT5zaW1kX2YgPSAgZmZfcGFja18yY2hfaW50MTZfdG9fZmxvYXRfYV9zc2UyOworICAgICAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNiAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUUCkKKyAgICAgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX3BhY2tfMmNoX2Zsb2F0X3RvX2ludDE2X2Ffc3NlMjsKKyAgICAgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIpCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl91bnBhY2tfMmNoX2ludDMyX3RvX2Zsb2F0X2Ffc3NlMjsKKyAgICAgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzJQICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFQpCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl91bnBhY2tfMmNoX2Zsb2F0X3RvX2ludDMyX2Ffc3NlMjsKKyAgICAgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTYpCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl91bnBhY2tfMmNoX2ludDE2X3RvX2Zsb2F0X2Ffc3NlMjsKKyAgICAgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFQpCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl91bnBhY2tfMmNoX2Zsb2F0X3RvX2ludDE2X2Ffc3NlMjsKKyAgICAgICAgfQorICAgICAgICBpZihjaGFubmVscyA9PSA2KSB7CisgICAgICAgICAgICBpZiggICBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzJQKQorICAgICAgICAgICAgICAgIGFjLT5zaW1kX2YgPSAgZmZfcGFja182Y2hfaW50MzJfdG9fZmxvYXRfYV9zc2UyOworICAgICAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMiAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUUCkKKyAgICAgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX3BhY2tfNmNoX2Zsb2F0X3RvX2ludDMyX2Ffc3NlMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihFWFRFUk5BTF9TU1NFMyhtbV9mbGFncykpIHsKKyAgICAgICAgaWYoY2hhbm5lbHMgPT0gMikgeworICAgICAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlAgICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNikKKyAgICAgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX3VucGFja18yY2hfaW50MTZfdG9faW50MTZfYV9zc3NlMzsKKyAgICAgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzJQICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTYpCisgICAgICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl91bnBhY2tfMmNoX2ludDE2X3RvX2ludDMyX2Ffc3NzZTM7CisgICAgICAgICAgICBpZiggICBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUUCAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzE2KQorICAgICAgICAgICAgICAgIGFjLT5zaW1kX2YgPSAgZmZfdW5wYWNrXzJjaF9pbnQxNl90b19mbG9hdF9hX3Nzc2UzOworICAgICAgICB9CisgICAgfQorICAgIGlmKEVYVEVSTkFMX0FWWChtbV9mbGFncykpIHsKKyAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyIHx8IG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMlApCisgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX2ludDMyX3RvX2Zsb2F0X2FfYXZ4OworICAgICAgICBpZihjaGFubmVscyA9PSA2KSB7CisgICAgICAgICAgICBpZiggICBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUICAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQIHx8IG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUCkKKyAgICAgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX3BhY2tfNmNoX2Zsb2F0X3RvX2Zsb2F0X2FfYXZ4OworICAgICAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUCkKKyAgICAgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX3BhY2tfNmNoX2ludDMyX3RvX2Zsb2F0X2FfYXZ4OworICAgICAgICAgICAgaWYoICAgb3V0X2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MzMiAgJiYgaW5fZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUUCkKKyAgICAgICAgICAgICAgICBhYy0+c2ltZF9mID0gIGZmX3BhY2tfNmNoX2Zsb2F0X3RvX2ludDMyX2FfYXZ4OworICAgICAgICB9CisgICAgfQorICAgIGlmKEVYVEVSTkFMX0FWWDIobW1fZmxhZ3MpKSB7CisgICAgICAgIGlmKCAgIG91dF9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIgICYmIGluX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCB8fCBvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUCAmJiBpbl9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQKQorICAgICAgICAgICAgYWMtPnNpbWRfZiA9ICBmZl9mbG9hdF90b19pbnQzMl9hX2F2eDI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3cmVzYW1wbGUveDg2L3JlbWF0cml4LmFzbSBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3g4Ni9yZW1hdHJpeC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhZTk1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3g4Ni9yZW1hdHJpeC5hc20KQEAgLTAsMCArMSwyNTAgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIENvcHlyaWdodCAoYykgMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworCitTRUNUSU9OX1JPREFUQSAzMgorZHcxOiB0aW1lcyA4ICBkZCAxCit3MSA6IHRpbWVzIDE2IGR3IDEKKworU0VDVElPTiAudGV4dAorCislbWFjcm8gTUlYMl9GTFQgMQorY2dsb2JhbCBtaXhfMl8xXyUxX2Zsb2F0LCA3LCA3LCA2LCBvdXQsIGluMSwgaW4yLCBjb2VmZnAsIGluZGV4MSwgaW5kZXgyLCBsZW4KKyVpZmlkbiAlMSwgYQorICAgIHRlc3QgaW4xcSwgbW1zaXplLTEKKyAgICAgICAgam5lIG1peF8yXzFfZmxvYXRfdV9pbnQgJSsgU1VGRklYCisgICAgdGVzdCBpbjJxLCBtbXNpemUtMQorICAgICAgICBqbmUgbWl4XzJfMV9mbG9hdF91X2ludCAlKyBTVUZGSVgKKyAgICB0ZXN0IG91dHEsIG1tc2l6ZS0xCisgICAgICAgIGpuZSBtaXhfMl8xX2Zsb2F0X3VfaW50ICUrIFNVRkZJWAorJWVsc2UKK21peF8yXzFfZmxvYXRfdV9pbnQgJSsgU1VGRklYCislZW5kaWYKKyAgICBWQlJPQURDQVNUU1MgbTQsIFtjb2VmZnBxICsgNCppbmRleDFxXQorICAgIFZCUk9BRENBU1RTUyBtNSwgW2NvZWZmcHEgKyA0KmluZGV4MnFdCisgICAgc2hsIGxlbmQgICAgLCAyCisgICAgYWRkIGluMXEgICAgLCBsZW5xCisgICAgYWRkIGluMnEgICAgLCBsZW5xCisgICAgYWRkIG91dHEgICAgLCBsZW5xCisgICAgbmVnIGxlbnEKKy5uZXh0OgorJWlmaWRuICUxLCBhCisgICAgbXVscHMgICAgICAgIG0wLCBtNCwgW2luMXEgKyBsZW5xICAgICAgICAgXQorICAgIG11bHBzICAgICAgICBtMSwgbTUsIFtpbjJxICsgbGVucSAgICAgICAgIF0KKyAgICBtdWxwcyAgICAgICAgbTIsIG00LCBbaW4xcSArIGxlbnEgKyBtbXNpemVdCisgICAgbXVscHMgICAgICAgIG0zLCBtNSwgW2luMnEgKyBsZW5xICsgbW1zaXplXQorJWVsc2UKKyAgICBtb3Z1ICAgICAgICAgbTAsIFtpbjFxICsgbGVucSAgICAgICAgIF0KKyAgICBtb3Z1ICAgICAgICAgbTEsIFtpbjJxICsgbGVucSAgICAgICAgIF0KKyAgICBtb3Z1ICAgICAgICAgbTIsIFtpbjFxICsgbGVucSArIG1tc2l6ZV0KKyAgICBtb3Z1ICAgICAgICAgbTMsIFtpbjJxICsgbGVucSArIG1tc2l6ZV0KKyAgICBtdWxwcyAgICAgICAgbTAsIG0wLCBtNAorICAgIG11bHBzICAgICAgICBtMSwgbTEsIG01CisgICAgbXVscHMgICAgICAgIG0yLCBtMiwgbTQKKyAgICBtdWxwcyAgICAgICAgbTMsIG0zLCBtNQorJWVuZGlmCisgICAgYWRkcHMgICAgICAgIG0wLCBtMCwgbTEKKyAgICBhZGRwcyAgICAgICAgbTIsIG0yLCBtMworICAgIG1vdiUxICBbb3V0cSArIGxlbnEgICAgICAgICBdLCBtMAorICAgIG1vdiUxICBbb3V0cSArIGxlbnEgKyBtbXNpemVdLCBtMgorICAgIGFkZCAgICAgICAgbGVucSwgbW1zaXplKjIKKyAgICAgICAgamwgLm5leHQKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworJW1hY3JvIE1JWDFfRkxUIDEKK2NnbG9iYWwgbWl4XzFfMV8lMV9mbG9hdCwgNSwgNSwgMywgb3V0LCBpbiwgY29lZmZwLCBpbmRleCwgbGVuCislaWZpZG4gJTEsIGEKKyAgICB0ZXN0IGlucSwgbW1zaXplLTEKKyAgICAgICAgam5lIG1peF8xXzFfZmxvYXRfdV9pbnQgJSsgU1VGRklYCisgICAgdGVzdCBvdXRxLCBtbXNpemUtMQorICAgICAgICBqbmUgbWl4XzFfMV9mbG9hdF91X2ludCAlKyBTVUZGSVgKKyVlbHNlCittaXhfMV8xX2Zsb2F0X3VfaW50ICUrIFNVRkZJWAorJWVuZGlmCisgICAgVkJST0FEQ0FTVFNTIG0yLCBbY29lZmZwcSArIDQqaW5kZXhxXQorICAgIHNobCBsZW5xICAgICwgMgorICAgIGFkZCBpbnEgICAgICwgbGVucQorICAgIGFkZCBvdXRxICAgICwgbGVucQorICAgIG5lZyBsZW5xCisubmV4dDoKKyVpZmlkbiAlMSwgYQorICAgIG11bHBzICAgICAgICBtMCwgbTIsIFtpbnEgKyBsZW5xICAgICAgICAgXQorICAgIG11bHBzICAgICAgICBtMSwgbTIsIFtpbnEgKyBsZW5xICsgbW1zaXplXQorJWVsc2UKKyAgICBtb3Z1ICAgICAgICAgbTAsIFtpbnEgKyBsZW5xICAgICAgICAgXQorICAgIG1vdnUgICAgICAgICBtMSwgW2lucSArIGxlbnEgKyBtbXNpemVdCisgICAgbXVscHMgICAgICAgIG0wLCBtMCwgbTIKKyAgICBtdWxwcyAgICAgICAgbTEsIG0xLCBtMgorJWVuZGlmCisgICAgbW92JTEgIFtvdXRxICsgbGVucSAgICAgICAgIF0sIG0wCisgICAgbW92JTEgIFtvdXRxICsgbGVucSArIG1tc2l6ZV0sIG0xCisgICAgYWRkICAgICAgICBsZW5xLCBtbXNpemUqMgorICAgICAgICBqbCAubmV4dAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCislbWFjcm8gTUlYMV9JTlQxNiAxCitjZ2xvYmFsIG1peF8xXzFfJTFfaW50MTYsIDUsIDUsIDYsIG91dCwgaW4sIGNvZWZmcCwgaW5kZXgsIGxlbgorJWlmaWRuICUxLCBhCisgICAgdGVzdCBpbnEsIG1tc2l6ZS0xCisgICAgICAgIGpuZSBtaXhfMV8xX2ludDE2X3VfaW50ICUrIFNVRkZJWAorICAgIHRlc3Qgb3V0cSwgbW1zaXplLTEKKyAgICAgICAgam5lIG1peF8xXzFfaW50MTZfdV9pbnQgJSsgU1VGRklYCislZWxzZQorbWl4XzFfMV9pbnQxNl91X2ludCAlKyBTVUZGSVgKKyVlbmRpZgorICAgIG1vdmQgICBtNCwgW2NvZWZmcHEgKyA0KmluZGV4cV0KKyAgICBTUExBVFcgbTUsIG00CisgICAgcHNsbHEgIG00LCAzMgorICAgIHBzcmxxICBtNCwgNDgKKyAgICBtb3ZhICAgbTAsIFt3MV0KKyAgICBwc2xsdyAgbTAsIG00CisgICAgcHNybHcgIG0wLCAxCisgICAgcHVucGNrbHdkIG01LCBtMAorICAgIGFkZCBsZW5xICAgICwgbGVucQorICAgIGFkZCBpbnEgICAgICwgbGVucQorICAgIGFkZCBvdXRxICAgICwgbGVucQorICAgIG5lZyBsZW5xCisubmV4dDoKKyAgICBtb3YlMSAgICAgICAgbTAsIFtpbnEgKyBsZW5xICAgICAgICAgXQorICAgIG1vdiUxICAgICAgICBtMiwgW2lucSArIGxlbnEgKyBtbXNpemVdCisgICAgbW92YSAgICAgICAgIG0xLCBtMAorICAgIG1vdmEgICAgICAgICBtMywgbTIKKyAgICBwdW5wY2tsd2QgICAgbTAsIFt3MV0KKyAgICBwdW5wY2tod2QgICAgbTEsIFt3MV0KKyAgICBwdW5wY2tsd2QgICAgbTIsIFt3MV0KKyAgICBwdW5wY2tod2QgICAgbTMsIFt3MV0KKyAgICBwbWFkZHdkICAgICAgbTAsIG01CisgICAgcG1hZGR3ZCAgICAgIG0xLCBtNQorICAgIHBtYWRkd2QgICAgICBtMiwgbTUKKyAgICBwbWFkZHdkICAgICAgbTMsIG01CisgICAgcHNyYWQgICAgICAgIG0wLCBtNAorICAgIHBzcmFkICAgICAgICBtMSwgbTQKKyAgICBwc3JhZCAgICAgICAgbTIsIG00CisgICAgcHNyYWQgICAgICAgIG0zLCBtNAorICAgIHBhY2tzc2R3ICAgICBtMCwgbTEKKyAgICBwYWNrc3NkdyAgICAgbTIsIG0zCisgICAgbW92JTEgIFtvdXRxICsgbGVucSAgICAgICAgIF0sIG0wCisgICAgbW92JTEgIFtvdXRxICsgbGVucSArIG1tc2l6ZV0sIG0yCisgICAgYWRkICAgICAgICBsZW5xLCBtbXNpemUqMgorICAgICAgICBqbCAubmV4dAorJWlmIG1tc2l6ZSA9PSA4CisgICAgZW1tcworICAgIFJFVAorJWVsc2UKKyAgICBSRVBfUkVUCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gTUlYMl9JTlQxNiAxCitjZ2xvYmFsIG1peF8yXzFfJTFfaW50MTYsIDcsIDcsIDgsIG91dCwgaW4xLCBpbjIsIGNvZWZmcCwgaW5kZXgxLCBpbmRleDIsIGxlbgorJWlmaWRuICUxLCBhCisgICAgdGVzdCBpbjFxLCBtbXNpemUtMQorICAgICAgICBqbmUgbWl4XzJfMV9pbnQxNl91X2ludCAlKyBTVUZGSVgKKyAgICB0ZXN0IGluMnEsIG1tc2l6ZS0xCisgICAgICAgIGpuZSBtaXhfMl8xX2ludDE2X3VfaW50ICUrIFNVRkZJWAorICAgIHRlc3Qgb3V0cSwgbW1zaXplLTEKKyAgICAgICAgam5lIG1peF8yXzFfaW50MTZfdV9pbnQgJSsgU1VGRklYCislZWxzZQorbWl4XzJfMV9pbnQxNl91X2ludCAlKyBTVUZGSVgKKyVlbmRpZgorICAgIG1vdmQgICBtNCwgW2NvZWZmcHEgKyA0KmluZGV4MXFdCisgICAgbW92ZCAgIG02LCBbY29lZmZwcSArIDQqaW5kZXgycV0KKyAgICBTUExBVFcgbTUsIG00CisgICAgU1BMQVRXIG02LCBtNgorICAgIHBzbGxxICBtNCwgMzIKKyAgICBwc3JscSAgbTQsIDQ4CisgICAgbW92YSAgIG03LCBbZHcxXQorICAgIHBzbGxkICBtNywgbTQKKyAgICBwc3JsZCAgbTcsIDEKKyAgICBwdW5wY2tsd2QgbTUsIG02CisgICAgYWRkIGxlbmQgICAgLCBsZW5kCisgICAgYWRkIGluMXEgICAgLCBsZW5xCisgICAgYWRkIGluMnEgICAgLCBsZW5xCisgICAgYWRkIG91dHEgICAgLCBsZW5xCisgICAgbmVnIGxlbnEKKy5uZXh0OgorICAgIG1vdiUxICAgICAgICBtMCwgW2luMXEgKyBsZW5xICAgICAgICAgXQorICAgIG1vdiUxICAgICAgICBtMiwgW2luMnEgKyBsZW5xICAgICAgICAgXQorICAgIG1vdmEgICAgICAgICBtMSwgbTAKKyAgICBwdW5wY2tsd2QgICAgbTAsIG0yCisgICAgcHVucGNraHdkICAgIG0xLCBtMgorCisgICAgbW92JTEgICAgICAgIG0yLCBbaW4xcSArIGxlbnEgKyBtbXNpemVdCisgICAgbW92JTEgICAgICAgIG02LCBbaW4ycSArIGxlbnEgKyBtbXNpemVdCisgICAgbW92YSAgICAgICAgIG0zLCBtMgorICAgIHB1bnBja2x3ZCAgICBtMiwgbTYKKyAgICBwdW5wY2tod2QgICAgbTMsIG02CisKKyAgICBwbWFkZHdkICAgICAgbTAsIG01CisgICAgcG1hZGR3ZCAgICAgIG0xLCBtNQorICAgIHBtYWRkd2QgICAgICBtMiwgbTUKKyAgICBwbWFkZHdkICAgICAgbTMsIG01CisgICAgcGFkZGQgICAgICAgIG0wLCBtNworICAgIHBhZGRkICAgICAgICBtMSwgbTcKKyAgICBwYWRkZCAgICAgICAgbTIsIG03CisgICAgcGFkZGQgICAgICAgIG0zLCBtNworICAgIHBzcmFkICAgICAgICBtMCwgbTQKKyAgICBwc3JhZCAgICAgICAgbTEsIG00CisgICAgcHNyYWQgICAgICAgIG0yLCBtNAorICAgIHBzcmFkICAgICAgICBtMywgbTQKKyAgICBwYWNrc3NkdyAgICAgbTAsIG0xCisgICAgcGFja3NzZHcgICAgIG0yLCBtMworICAgIG1vdiUxICBbb3V0cSArIGxlbnEgICAgICAgICBdLCBtMAorICAgIG1vdiUxICBbb3V0cSArIGxlbnEgKyBtbXNpemVdLCBtMgorICAgIGFkZCAgICAgICAgbGVucSwgbW1zaXplKjIKKyAgICAgICAgamwgLm5leHQKKyVpZiBtbXNpemUgPT0gOAorICAgIGVtbXMKKyAgICBSRVQKKyVlbHNlCisgICAgUkVQX1JFVAorJWVuZGlmCislZW5kbWFjcm8KKworCitJTklUX01NWCBtbXgKK01JWDFfSU5UMTYgdQorTUlYMV9JTlQxNiBhCitNSVgyX0lOVDE2IHUKK01JWDJfSU5UMTYgYQorCitJTklUX1hNTSBzc2UKK01JWDJfRkxUIHUKK01JWDJfRkxUIGEKK01JWDFfRkxUIHUKK01JWDFfRkxUIGEKKworSU5JVF9YTU0gc3NlMgorTUlYMV9JTlQxNiB1CitNSVgxX0lOVDE2IGEKK01JWDJfSU5UMTYgdQorTUlYMl9JTlQxNiBhCisKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4CitNSVgyX0ZMVCB1CitNSVgyX0ZMVCBhCitNSVgxX0ZMVCB1CitNSVgxX0ZMVCBhCislZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3g4Ni9yZW1hdHJpeF9pbml0LmMgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvcmVtYXRyaXhfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZWUyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvcmVtYXRyaXhfaW5pdC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgTWljaGFlbCBOaWVkZXJtYXllciAobWljaGFlbG5pQGdteC5hdCkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaWJzd3Jlc2FtcGxlCisgKgorICogbGlic3dyZXNhbXBsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogbGlic3dyZXNhbXBsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBsaWJzd3Jlc2FtcGxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlX2ludGVybmFsLmgiCisKKyNkZWZpbmUgRCh0eXBlLCBzaW1kKSBcCittaXhfMV8xX2Z1bmNfdHlwZSBmZl9taXhfMV8xX2FfIyMgdHlwZSAjIyBfICMjIHNpbWQ7XAorbWl4XzJfMV9mdW5jX3R5cGUgZmZfbWl4XzJfMV9hXyMjIHR5cGUgIyMgXyAjIyBzaW1kOworCitEKGZsb2F0LCBzc2UpCitEKGZsb2F0LCBhdngpCitEKGludDE2LCBtbXgpCitEKGludDE2LCBzc2UyKQorCithdl9jb2xkIHZvaWQgc3dyaV9yZW1hdHJpeF9pbml0X3g4NihzdHJ1Y3QgU3dyQ29udGV4dCAqcyl7CisjaWYgSEFWRV9ZQVNNCisgICAgaW50IG1tX2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgIGludCBuYl9pbiAgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+aW5fY2hfbGF5b3V0KTsKKyAgICBpbnQgbmJfb3V0ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHMtPm91dF9jaF9sYXlvdXQpOworICAgIGludCBudW0gICAgPSBuYl9pbiAqIG5iX291dDsKKyAgICBpbnQgaSxqOworCisgICAgcy0+bWl4XzFfMV9zaW1kID0gTlVMTDsKKyAgICBzLT5taXhfMl8xX3NpbWQgPSBOVUxMOworCisgICAgaWYgKHMtPm1pZGJ1Zi5mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQKXsKKyAgICAgICAgaWYoRVhURVJOQUxfTU1YKG1tX2ZsYWdzKSkgeworICAgICAgICAgICAgcy0+bWl4XzFfMV9zaW1kID0gZmZfbWl4XzFfMV9hX2ludDE2X21teDsKKyAgICAgICAgICAgIHMtPm1peF8yXzFfc2ltZCA9IGZmX21peF8yXzFfYV9pbnQxNl9tbXg7CisgICAgICAgIH0KKyAgICAgICAgaWYoRVhURVJOQUxfU1NFMihtbV9mbGFncykpIHsKKyAgICAgICAgICAgIHMtPm1peF8xXzFfc2ltZCA9IGZmX21peF8xXzFfYV9pbnQxNl9zc2UyOworICAgICAgICAgICAgcy0+bWl4XzJfMV9zaW1kID0gZmZfbWl4XzJfMV9hX2ludDE2X3NzZTI7CisgICAgICAgIH0KKyAgICAgICAgcy0+bmF0aXZlX3NpbWRfbWF0cml4ID0gYXZfbWFsbG9jeigyICogbnVtICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgcy0+bmF0aXZlX3NpbWRfb25lICAgID0gYXZfbWFsbG9jeigyICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgZm9yKGk9MDsgaTxuYl9vdXQ7IGkrKyl7CisgICAgICAgICAgICBpbnQgc2ggPSAwOworICAgICAgICAgICAgZm9yKGo9MDsgajxuYl9pbjsgaisrKQorICAgICAgICAgICAgICAgIHNoID0gRkZNQVgoc2gsIEZGQUJTKCgoaW50KilzLT5uYXRpdmVfbWF0cml4KVtpICogbmJfaW4gKyBqXSkpOworICAgICAgICAgICAgc2ggPSBGRk1BWChhdl9sb2cyKHNoKSAtIDE0LCAwKTsKKyAgICAgICAgICAgIGZvcihqPTA7IGo8bmJfaW47IGorKykgeworICAgICAgICAgICAgICAgICgoaW50MTZfdCopcy0+bmF0aXZlX3NpbWRfbWF0cml4KVsyKihpICogbmJfaW4gKyBqKSsxXSA9IDE1IC0gc2g7CisgICAgICAgICAgICAgICAgKChpbnQxNl90KilzLT5uYXRpdmVfc2ltZF9tYXRyaXgpWzIqKGkgKiBuYl9pbiArIGopXSA9CisgICAgICAgICAgICAgICAgICAgICgoKChpbnQqKXMtPm5hdGl2ZV9tYXRyaXgpW2kgKiBuYl9pbiArIGpdKSArICgxPDxzaD4+MSkpID4+IHNoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICgoaW50MTZfdCopcy0+bmF0aXZlX3NpbWRfb25lKVsxXSA9IDE0OworICAgICAgICAoKGludDE2X3QqKXMtPm5hdGl2ZV9zaW1kX29uZSlbMF0gPSAxNjM4NDsKKyAgICB9IGVsc2UgaWYocy0+bWlkYnVmLmZtdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVFApeworICAgICAgICBpZihFWFRFUk5BTF9TU0UobW1fZmxhZ3MpKSB7CisgICAgICAgICAgICBzLT5taXhfMV8xX3NpbWQgPSBmZl9taXhfMV8xX2FfZmxvYXRfc3NlOworICAgICAgICAgICAgcy0+bWl4XzJfMV9zaW1kID0gZmZfbWl4XzJfMV9hX2Zsb2F0X3NzZTsKKyAgICAgICAgfQorICAgICAgICBpZihFWFRFUk5BTF9BVlgobW1fZmxhZ3MpKSB7CisgICAgICAgICAgICBzLT5taXhfMV8xX3NpbWQgPSBmZl9taXhfMV8xX2FfZmxvYXRfYXZ4OworICAgICAgICAgICAgcy0+bWl4XzJfMV9zaW1kID0gZmZfbWl4XzJfMV9hX2Zsb2F0X2F2eDsKKyAgICAgICAgfQorICAgICAgICBzLT5uYXRpdmVfc2ltZF9tYXRyaXggPSBhdl9tYWxsb2N6KG51bSAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBtZW1jcHkocy0+bmF0aXZlX3NpbWRfbWF0cml4LCBzLT5uYXRpdmVfbWF0cml4LCBudW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgcy0+bmF0aXZlX3NpbWRfb25lID0gYXZfbWFsbG9jeihzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgbWVtY3B5KHMtPm5hdGl2ZV9zaW1kX29uZSwgcy0+bmF0aXZlX29uZSwgc2l6ZW9mKGZsb2F0KSk7CisgICAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvcmVzYW1wbGUuYXNtIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUveDg2L3Jlc2FtcGxlLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTdmZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3cmVzYW1wbGUveDg2L3Jlc2FtcGxlLmFzbQpAQCAtMCwwICsxLDYwMCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogQ29weXJpZ2h0IChjKSAyMDEyIE1pY2hhZWwgTmllZGVybWF5ZXIKKzsqIENvcHlyaWdodCAoYykgMjAxNCBKYW1lcyBBbG1lciA8amFtcmlhbCA8YXQ+IGdtYWlsLmNvbT4KKzsqIENvcHlyaWdodCAoYykgMjAxNCBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworJWlmIEFSQ0hfWDg2XzY0CislZGVmaW5lIHBvaW50ZXIgcmVzcQorJWVsc2UKKyVkZWZpbmUgcG9pbnRlciByZXNkCislZW5kaWYKKworc3RydWMgUmVzYW1wbGVDb250ZXh0CisgICAgLmF2X2NsYXNzOiAgICAgICAgICAgICAgcG9pbnRlciAxCisgICAgLmZpbHRlcl9iYW5rOiAgICAgICAgICAgcG9pbnRlciAxCisgICAgLmZpbHRlcl9sZW5ndGg6ICAgICAgICAgcmVzZCAxCisgICAgLmZpbHRlcl9hbGxvYzogICAgICAgICAgcmVzZCAxCisgICAgLmlkZWFsX2RzdF9pbmNyOiAgICAgICAgcmVzZCAxCisgICAgLmRzdF9pbmNyOiAgICAgICAgICAgICAgcmVzZCAxCisgICAgLmRzdF9pbmNyX2RpdjogICAgICAgICAgcmVzZCAxCisgICAgLmRzdF9pbmNyX21vZDogICAgICAgICAgcmVzZCAxCisgICAgLmluZGV4OiAgICAgICAgICAgICAgICAgcmVzZCAxCisgICAgLmZyYWM6ICAgICAgICAgICAgICAgICAgcmVzZCAxCisgICAgLnNyY19pbmNyOiAgICAgICAgICAgICAgcmVzZCAxCisgICAgLmNvbXBlbnNhdGlvbl9kaXN0YW5jZTogcmVzZCAxCisgICAgLnBoYXNlX3NoaWZ0OiAgICAgICAgICAgcmVzZCAxCisgICAgLnBoYXNlX21hc2s6ICAgICAgICAgICAgcmVzZCAxCisKKyAgICA7IHRoZXJlJ3MgYSBmZXcgbW9yZSBoZXJlIGJ1dCB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGZpcnN0IGZldworZW5kc3RydWMKKworU0VDVElPTl9ST0RBVEEKKworcGZfMTogICAgICBkZCAxLjAKK3BkYmxfMTogICAgZHEgMS4wCitwZF8weDQwMDA6IGRkIDB4NDAwMAorCitTRUNUSU9OIC50ZXh0CisKKyVtYWNybyBSRVNBTVBMRV9GTlMgMy01IDsgZm9ybWF0IFtmbG9hdCBvciBpbnQxNl0sIGJwcywgbG9nMl9icHMsIGZsb2F0IG9wIHN1ZmZpeCBbcyBvciBkXSwgMS4wIGNvbnN0YW50Cis7IGludCByZXNhbXBsZV9jb21tb25fJGZvcm1hdChSZXNhbXBsZUNvbnRleHQgKmN0eCwgJGZvcm1hdCAqZHN0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJGZvcm1hdCAqc3JjLCBpbnQgc2l6ZSwgaW50IHVwZGF0ZV9jdHgpCislaWYgQVJDSF9YODZfNjQgOyB1bml4NjQgYW5kIHdpbjY0CitjZ2xvYmFsIHJlc2FtcGxlX2NvbW1vbl8lMSwgMCwgMTUsIDIsIGN0eCwgZHN0LCBzcmMsIHBoYXNlX3NoaWZ0LCBpbmRleCwgZnJhYywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfaW5jcl9tb2QsIHNpemUsIG1pbl9maWx0ZXJfY291bnRfeDQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2ZpbHRlcl9sZW5feDQsIGRzdF9pbmNyX2Rpdiwgc3JjX2luY3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VfbWFzaywgZHN0X2VuZCwgZmlsdGVyX2JhbmsKKworICAgIDsgdXNlIHJlZC16b25lIGZvciB2YXJpYWJsZSBzdG9yYWdlCislZGVmaW5lIGN0eF9zdGFja3EgICAgICAgICAgICBbcnNwLTB4OF0KKyVkZWZpbmUgc3JjX3N0YWNrcSAgICAgICAgICAgIFtyc3AtMHgxMF0KKyVpZiBXSU42NAorJWRlZmluZSB1cGRhdGVfY29udGV4dF9zdGFja2QgcjRtCislZWxzZSA7IHVuaXg2NAorJWRlZmluZSB1cGRhdGVfY29udGV4dF9zdGFja2QgW3JzcC0weDE0XQorJWVuZGlmCisKKyAgICA7IGxvYWQgYXMgbWFueSB2YXJpYWJsZXMgaW4gcmVnaXN0ZXJzIGFzIHBvc3NpYmxlOyBmb3IgdGhlIHJlc3QsIHN0b3JlCisgICAgOyBvbiBzdGFjayBzbyB0aGF0IHdlIGhhdmUgJ2N0eCcgYXZhaWxhYmxlIGFzIG9uZSBleHRyYSByZWdpc3RlcgorICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVkLCByM2QKKyAgICBtb3YgICAgICAgICAgICAgICAgICBwaGFzZV9tYXNrZCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LnBoYXNlX21hc2tdCislaWYgVU5JWDY0CisgICAgbW92ICAgICAgICB1cGRhdGVfY29udGV4dF9zdGFja2QsIHI0ZAorJWVuZGlmCisgICAgbW92ICAgICAgICAgICAgICAgICAgICAgICBpbmRleGQsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5pbmRleF0KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICBmcmFjZCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LmZyYWNdCisgICAgbW92ICAgICAgICAgICAgICAgIGRzdF9pbmNyX21vZGQsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5kc3RfaW5jcl9tb2RdCisgICAgbW92ICAgICAgICAgICAgICAgICBmaWx0ZXJfYmFua3EsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5maWx0ZXJfYmFua10KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgIHNyY19pbmNyZCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LnNyY19pbmNyXQorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjdHhfc3RhY2txLCBjdHhxCisgICAgbW92ICAgICAgICAgICBtaW5fZmlsdGVyX2xlbl94NGQsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5maWx0ZXJfbGVuZ3RoXQorICAgIG1vdiAgICAgICAgICAgICAgICBkc3RfaW5jcl9kaXZkLCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZHN0X2luY3JfZGl2XQorICAgIHNobCAgICAgICAgICAgbWluX2ZpbHRlcl9sZW5feDRkLCAlMworICAgIGxlYSAgICAgICAgICAgICAgICAgICAgIGRzdF9lbmRxLCBbZHN0cStzaXplcSolMl0KKworJWlmIFVOSVg2NAorICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgZWN4LCBbY3R4cStSZXNhbXBsZUNvbnRleHQucGhhc2Vfc2hpZnRdCisgICAgbW92ICAgICAgICAgICAgICAgICAgICAgICAgICBlZGksIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5maWx0ZXJfYWxsb2NdCisKKyAgICBERUZJTkVfQVJHUyBmaWx0ZXJfYWxsb2MsIGRzdCwgc3JjLCBwaGFzZV9zaGlmdCwgaW5kZXgsIGZyYWMsIGRzdF9pbmNyX21vZCwgXAorICAgICAgICAgICAgICAgIGZpbHRlciwgbWluX2ZpbHRlcl9jb3VudF94NCwgbWluX2ZpbHRlcl9sZW5feDQsIGRzdF9pbmNyX2RpdiwgXAorICAgICAgICAgICAgICAgIHNyY19pbmNyLCBwaGFzZV9tYXNrLCBkc3RfZW5kLCBmaWx0ZXJfYmFuaworJWVsaWYgV0lONjQKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgIFI5ZCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LmZpbHRlcl9hbGxvY10KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgIGVjeCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LnBoYXNlX3NoaWZ0XQorCisgICAgREVGSU5FX0FSR1MgcGhhc2Vfc2hpZnQsIGRzdCwgc3JjLCBmaWx0ZXJfYWxsb2MsIGluZGV4LCBmcmFjLCBkc3RfaW5jcl9tb2QsIFwKKyAgICAgICAgICAgICAgICBmaWx0ZXIsIG1pbl9maWx0ZXJfY291bnRfeDQsIG1pbl9maWx0ZXJfbGVuX3g0LCBkc3RfaW5jcl9kaXYsIFwKKyAgICAgICAgICAgICAgICBzcmNfaW5jciwgcGhhc2VfbWFzaywgZHN0X2VuZCwgZmlsdGVyX2JhbmsKKyVlbmRpZgorCisgICAgbmVnICAgICAgICAgICBtaW5fZmlsdGVyX2xlbl94NHEKKyAgICBzdWIgICAgICAgICAgICAgICAgIGZpbHRlcl9iYW5rcSwgbWluX2ZpbHRlcl9sZW5feDRxCisgICAgc3ViICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3EsIG1pbl9maWx0ZXJfbGVuX3g0cQorICAgIG1vdiAgICAgICAgICAgICAgICAgICBzcmNfc3RhY2txLCBzcmNxCislZWxzZSA7IHg4Ni0zMgorY2dsb2JhbCByZXNhbXBsZV9jb21tb25fJTEsIDEsIDcsIDIsIGN0eCwgcGhhc2Vfc2hpZnQsIGRzdCwgZnJhYywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBtaW5fZmlsdGVyX2xlbmd0aF94NCwgZmlsdGVyX2JhbmsKKworICAgIDsgcHVzaCB0ZW1wIHZhcmlhYmxlcyB0byBzdGFjaworJWRlZmluZSBjdHhfc3RhY2txICAgICAgICAgICAgcjBtcAorJWRlZmluZSBzcmNfc3RhY2txICAgICAgICAgICAgcjJtcAorJWRlZmluZSB1cGRhdGVfY29udGV4dF9zdGFja2QgcjRtCisKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgZHN0cSwgcjFtcAorICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgIHIzLCByM21wCisgICAgbGVhICAgICAgICAgICAgICAgICAgICAgICAgICAgcjMsIFtkc3RxK3IzKiUyXQorICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd29yZCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZHN0X2luY3JfZGl2XQorICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd29yZCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZHN0X2luY3JfbW9kXQorICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd29yZCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZmlsdGVyX2FsbG9jXQorICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMworICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd29yZCBbY3R4cStSZXNhbXBsZUNvbnRleHQucGhhc2VfbWFza10KKyAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdvcmQgW2N0eHErUmVzYW1wbGVDb250ZXh0LnNyY19pbmNyXQorICAgIG1vdiAgICAgICAgbWluX2ZpbHRlcl9sZW5ndGhfeDRkLCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZmlsdGVyX2xlbmd0aF0KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LmluZGV4XQorICAgIHNobCAgICAgICAgbWluX2ZpbHRlcl9sZW5ndGhfeDRkLCAlMworICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgIGZyYWNkLCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZnJhY10KKyAgICBuZWcgICAgICAgIG1pbl9maWx0ZXJfbGVuZ3RoX3g0cQorICAgIG1vdiAgICAgICAgICAgICAgICAgZmlsdGVyX2JhbmtxLCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZmlsdGVyX2JhbmtdCisgICAgc3ViICAgICAgICAgICAgICAgICAgICAgICAgIHIybXAsIG1pbl9maWx0ZXJfbGVuZ3RoX3g0cQorICAgIHN1YiAgICAgICAgICAgICAgICAgZmlsdGVyX2JhbmtxLCBtaW5fZmlsdGVyX2xlbmd0aF94NHEKKyAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2ZpbHRlcl9sZW5ndGhfeDRxCisgICAgUFVTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9iYW5rcQorICAgIG1vdiAgICAgICAgICAgICAgICAgcGhhc2Vfc2hpZnRkLCBbY3R4cStSZXNhbXBsZUNvbnRleHQucGhhc2Vfc2hpZnRdCisKKyAgICBERUZJTkVfQVJHUyBzcmMsIHBoYXNlX3NoaWZ0LCBkc3QsIGZyYWMsIGluZGV4LCBtaW5fZmlsdGVyX2NvdW50X3g0LCBmaWx0ZXIKKworJWRlZmluZSBmaWx0ZXJfYmFua3EgICAgICAgICAgZHdvcmQgW3JzcCsweDBdCislZGVmaW5lIG1pbl9maWx0ZXJfbGVuZ3RoX3g0cSBkd29yZCBbcnNwKzB4NF0KKyVkZWZpbmUgc3JjX2luY3JkICAgICAgICAgICAgIGR3b3JkIFtyc3ArMHg4XQorJWRlZmluZSBwaGFzZV9tYXNrZCAgICAgICAgICAgZHdvcmQgW3JzcCsweGNdCislZGVmaW5lIGRzdF9lbmRxICAgICAgICAgICAgICBkd29yZCBbcnNwKzB4MTBdCislZGVmaW5lIGZpbHRlcl9hbGxvY2QgICAgICAgICBkd29yZCBbcnNwKzB4MTRdCislZGVmaW5lIGRzdF9pbmNyX21vZGQgICAgICAgICBkd29yZCBbcnNwKzB4MThdCislZGVmaW5lIGRzdF9pbmNyX2RpdmQgICAgICAgICBkd29yZCBbcnNwKzB4MWNdCisKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgc3JjcSwgcjJtcAorJWVuZGlmCisKKy5sb29wOgorICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJkLCBmaWx0ZXJfYWxsb2NkCisgICAgaW11bCAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmQsIGluZGV4ZAorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92ICAgICAgICAgbWluX2ZpbHRlcl9jb3VudF94NHEsIG1pbl9maWx0ZXJfbGVuX3g0cQorICAgIGxlYSAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJxLCBbZmlsdGVyX2JhbmtxK2ZpbHRlcnEqJTJdCislZWxzZSA7IHg4Ni0zMgorICAgIG1vdiAgICAgICAgIG1pbl9maWx0ZXJfY291bnRfeDRxLCBmaWx0ZXJfYmFua3EKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgICAgZmlsdGVycSwgW21pbl9maWx0ZXJfY291bnRfeDRxK2ZpbHRlcnEqJTJdCisgICAgbW92ICAgICAgICAgbWluX2ZpbHRlcl9jb3VudF94NHEsIG1pbl9maWx0ZXJfbGVuZ3RoX3g0cQorJWVuZGlmCislaWZpZG4gJTEsIGludDE2CisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgICAgICAgbTAsIFtwZF8weDQwMDBdCislZWxzZSA7IGZsb2F0L2RvdWJsZQorICAgIHhvcnBzICAgICAgICAgICAgICAgICAgICAgICAgIG0wLCBtMCwgbTAKKyVlbmRpZgorCisgICAgYWxpZ24gMTYKKy5pbm5lcl9sb29wOgorICAgIG1vdnUgICAgICAgICAgICAgICAgICAgICAgICAgIG0xLCBbc3JjcSttaW5fZmlsdGVyX2NvdW50X3g0cSoxXQorJWlmaWRuICUxLCBpbnQxNgorICAgIFBNQURDU1dEICAgICAgICAgICAgICAgICAgICAgIG0wLCBtMSwgW2ZpbHRlcnErbWluX2ZpbHRlcl9jb3VudF94NHEqMV0sIG0wLCBtMQorJWVsc2UgOyBmbG9hdC9kb3VibGUKKyVpZiBjcHVmbGFnKGZtYTQpIHx8IGNwdWZsYWcoZm1hMykKKyAgICBmbWFkZHAlNCAgICAgICAgICAgICAgICAgICAgICBtMCwgbTEsIFtmaWx0ZXJxK21pbl9maWx0ZXJfY291bnRfeDRxKjFdLCBtMAorJWVsc2UKKyAgICBtdWxwJTQgICAgICAgICAgICAgICAgICAgICAgICBtMSwgbTEsIFtmaWx0ZXJxK21pbl9maWx0ZXJfY291bnRfeDRxKjFdCisgICAgYWRkcCU0ICAgICAgICAgICAgICAgICAgICAgICAgbTAsIG0wLCBtMQorJWVuZGlmIDsgY3B1ZmxhZworJWVuZGlmCisgICAgYWRkICAgICAgICAgbWluX2ZpbHRlcl9jb3VudF94NHEsIG1tc2l6ZQorICAgIGpzIC5pbm5lcl9sb29wCisKKyVpZmlkbiAlMSwgaW50MTYKKyAgICBIQURERCAgICAgICAgICAgICAgICAgICAgICAgICBtMCwgbTEKKyAgICBwc3JhZCAgICAgICAgICAgICAgICAgICAgICAgICBtMCwgMTUKKyAgICBhZGQgICAgICAgICAgICAgICAgICAgICAgICBmcmFjZCwgZHN0X2luY3JfbW9kZAorICAgIHBhY2tzc2R3ICAgICAgICAgICAgICAgICAgICAgIG0wLCBtMAorICAgIGFkZCAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhkLCBkc3RfaW5jcl9kaXZkCisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgICBbZHN0cV0sIG0wCislZWxzZSA7IGZsb2F0L2RvdWJsZQorICAgIDsgaG9yaXpvbnRhbCBzdW0gJiBzdG9yZQorJWlmIG1tc2l6ZSA9PSAzMgorICAgIHZleHRyYWN0ZjEyOCAgICAgICAgICAgICAgICAgeG0xLCBtMCwgMHgxCisgICAgYWRkcHMgICAgICAgICAgICAgICAgICAgICAgICB4bTAsIHhtMQorJWVuZGlmCisgICAgbW92aGxwcyAgICAgICAgICAgICAgICAgICAgICB4bTEsIHhtMAorJWlmaWRuICUxLCBmbG9hdAorICAgIGFkZHBzICAgICAgICAgICAgICAgICAgICAgICAgeG0wLCB4bTEKKyAgICBzaHVmcHMgICAgICAgICAgICAgICAgICAgICAgIHhtMSwgeG0wLCB4bTAsIHEwMDAxCislZW5kaWYKKyAgICBhZGQgICAgICAgICAgICAgICAgICAgICAgICBmcmFjZCwgZHN0X2luY3JfbW9kZAorICAgIGFkZHAlNCAgICAgICAgICAgICAgICAgICAgICAgeG0wLCB4bTEKKyAgICBhZGQgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZCwgZHN0X2luY3JfZGl2ZAorICAgIG1vdnMlNCAgICAgICAgICAgICAgICAgICAgW2RzdHFdLCB4bTAKKyVlbmRpZgorICAgIGNtcCAgICAgICAgICAgICAgICAgICAgICAgIGZyYWNkLCBzcmNfaW5jcmQKKyAgICBqbCAuc2tpcAorICAgIHN1YiAgICAgICAgICAgICAgICAgICAgICAgIGZyYWNkLCBzcmNfaW5jcmQKKyAgICBpbmMgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZAorCislaWYgVU5JWDY0CisgICAgREVGSU5FX0FSR1MgZmlsdGVyX2FsbG9jLCBkc3QsIHNyYywgcGhhc2Vfc2hpZnQsIGluZGV4LCBmcmFjLCBkc3RfaW5jcl9tb2QsIFwKKyAgICAgICAgICAgICAgICBpbmRleF9pbmNyLCBtaW5fZmlsdGVyX2NvdW50X3g0LCBtaW5fZmlsdGVyX2xlbl94NCwgZHN0X2luY3JfZGl2LCBcCisgICAgICAgICAgICAgICAgc3JjX2luY3IsIHBoYXNlX21hc2ssIGRzdF9lbmQsIGZpbHRlcl9iYW5rCislZWxpZiBXSU42NAorICAgIERFRklORV9BUkdTIHBoYXNlX3NoaWZ0LCBkc3QsIHNyYywgZmlsdGVyX2FsbG9jLCBpbmRleCwgZnJhYywgZHN0X2luY3JfbW9kLCBcCisgICAgICAgICAgICAgICAgaW5kZXhfaW5jciwgbWluX2ZpbHRlcl9jb3VudF94NCwgbWluX2ZpbHRlcl9sZW5feDQsIGRzdF9pbmNyX2RpdiwgXAorICAgICAgICAgICAgICAgIHNyY19pbmNyLCBwaGFzZV9tYXNrLCBkc3RfZW5kLCBmaWx0ZXJfYmFuaworJWVsc2UgOyB4ODYtMzIKKyAgICBERUZJTkVfQVJHUyBzcmMsIHBoYXNlX3NoaWZ0LCBkc3QsIGZyYWMsIGluZGV4LCBpbmRleF9pbmNyCislZW5kaWYKKworLnNraXA6CisgICAgbW92ICAgICAgICAgICAgICAgICAgaW5kZXhfaW5jcmQsIGluZGV4ZAorICAgIGFkZCAgICAgICAgICAgICAgICAgICAgICAgICBkc3RxLCAlMgorICAgIGFuZCAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhkLCBwaGFzZV9tYXNrZAorICAgIHNhciAgICAgICAgICAgICAgICAgIGluZGV4X2luY3JkLCBwaGFzZV9zaGlmdGIKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgICAgICAgc3JjcSwgW3NyY3EraW5kZXhfaW5jcnEqJTJdCisgICAgY21wICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHEsIGRzdF9lbmRxCisgICAgam5lIC5sb29wCisKKyVpZiBBUkNIX1g4Nl82NAorICAgIERFRklORV9BUkdTIGN0eCwgZHN0LCBzcmMsIHBoYXNlX3NoaWZ0LCBpbmRleCwgZnJhYworJWVsc2UgOyB4ODYtMzIKKyAgICBERUZJTkVfQVJHUyBzcmMsIGN0eCwgdXBkYXRlX2NvbnRleHQsIGZyYWMsIGluZGV4CislZW5kaWYKKworICAgIGNtcCAgZHdvcmQgdXBkYXRlX2NvbnRleHRfc3RhY2tkLCAwCisgICAganogLnNraXBfc3RvcmUKKyAgICA7IHN0cmljdGx5IHNwZWFraW5nLCB0aGUgZnVuY3Rpb24gc2hvdWxkIGFsd2F5cyByZXR1cm4gdGhlIGNvbnN1bWVkCisgICAgOyBudW1iZXIgb2YgYnl0ZXM7IGhvd2V2ZXIsIHdlIG9ubHkgdXNlIHRoZSB2YWx1ZSBpZiB1cGRhdGVfY29udGV4dAorICAgIDsgaXMgdHJ1ZSwgc28gbGV0J3MganVzdCBsZWF2ZSBpdCB1bmluaXRpYWxpemVkIG90aGVyd2lzZQorICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICBjdHhxLCBjdHhfc3RhY2txCisgICAgbW92aWZuaWRuICAgICAgICAgICAgICAgICAgICByYXgsIHNyY3EKKyAgICBtb3YgW2N0eHErUmVzYW1wbGVDb250ZXh0LmZyYWMgXSwgZnJhY2QKKyAgICBzdWIgICAgICAgICAgICAgICAgICAgICAgICAgIHJheCwgc3JjX3N0YWNrcQorICAgIG1vdiBbY3R4cStSZXNhbXBsZUNvbnRleHQuaW5kZXhdLCBpbmRleGQKKyAgICBzaHIgICAgICAgICAgICAgICAgICAgICAgICAgIHJheCwgJTMKKworLnNraXBfc3RvcmU6CislaWYgQVJDSF9YODZfMzIKKyAgICBBREQgICAgICAgICAgICAgICAgICAgICAgICAgIHJzcCwgMHgyMAorJWVuZGlmCisgICAgUkVUCisKKzsgaW50IHJlc2FtcGxlX2xpbmVhcl8kZm9ybWF0KFJlc2FtcGxlQ29udGV4dCAqY3R4LCBmbG9hdCAqZHN0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYywgaW50IHNpemUsIGludCB1cGRhdGVfY3R4KQorJWlmIEFSQ0hfWDg2XzY0IDsgdW5peDY0IGFuZCB3aW42NAorJWlmIFVOSVg2NAorY2dsb2JhbCByZXNhbXBsZV9saW5lYXJfJTEsIDAsIDE1LCA1LCBjdHgsIGRzdCwgcGhhc2VfbWFzaywgcGhhc2Vfc2hpZnQsIGluZGV4LCBmcmFjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGRzdF9pbmNyX21vZCwgbWluX2ZpbHRlcl9jb3VudF94NCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZmlsdGVyX2xlbl94NCwgZHN0X2luY3JfZGl2LCBzcmNfaW5jciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdF9lbmQsIGZpbHRlcl9iYW5rCisKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgc3JjcSwgcjJtcAorJWVsc2UgOyB3aW42NAorY2dsb2JhbCByZXNhbXBsZV9saW5lYXJfJTEsIDAsIDE1LCA1LCBjdHgsIHBoYXNlX21hc2ssIHNyYywgcGhhc2Vfc2hpZnQsIGluZGV4LCBmcmFjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGRzdF9pbmNyX21vZCwgbWluX2ZpbHRlcl9jb3VudF94NCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZmlsdGVyX2xlbl94NCwgZHN0X2luY3JfZGl2LCBzcmNfaW5jciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9lbmQsIGZpbHRlcl9iYW5rCisKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgZHN0cSwgcjFtcAorJWVuZGlmCisKKyAgICA7IHVzZSByZWQtem9uZSBmb3IgdmFyaWFibGUgc3RvcmFnZQorJWRlZmluZSBjdHhfc3RhY2txICAgICAgICAgICAgW3JzcC0weDhdCislZGVmaW5lIHNyY19zdGFja3EgICAgICAgICAgICBbcnNwLTB4MTBdCislZGVmaW5lIHBoYXNlX21hc2tfc3RhY2tkICAgICBbcnNwLTB4MTRdCislaWYgV0lONjQKKyVkZWZpbmUgdXBkYXRlX2NvbnRleHRfc3RhY2tkIHI0bQorJWVsc2UgOyB1bml4NjQKKyVkZWZpbmUgdXBkYXRlX2NvbnRleHRfc3RhY2tkIFtyc3AtMHgxOF0KKyVlbmRpZgorCisgICAgOyBsb2FkIGFzIG1hbnkgdmFyaWFibGVzIGluIHJlZ2lzdGVycyBhcyBwb3NzaWJsZTsgZm9yIHRoZSByZXN0LCBzdG9yZQorICAgIDsgb24gc3RhY2sgc28gdGhhdCB3ZSBoYXZlICdjdHgnIGF2YWlsYWJsZSBhcyBvbmUgZXh0cmEgcmVnaXN0ZXIKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICBzaXplZCwgcjNkCisgICAgbW92ICAgICAgICAgICAgICAgICAgcGhhc2VfbWFza2QsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9tYXNrXQorJWlmIFVOSVg2NAorICAgIG1vdiAgICAgICAgdXBkYXRlX2NvbnRleHRfc3RhY2tkLCByNGQKKyVlbmRpZgorICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhkLCBbY3R4cStSZXNhbXBsZUNvbnRleHQuaW5kZXhdCisgICAgbW92ICAgICAgICAgICAgICAgICAgICAgICAgZnJhY2QsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5mcmFjXQorICAgIG1vdiAgICAgICAgICAgICAgICBkc3RfaW5jcl9tb2RkLCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZHN0X2luY3JfbW9kXQorICAgIG1vdiAgICAgICAgICAgICAgICAgZmlsdGVyX2JhbmtxLCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZmlsdGVyX2JhbmtdCisgICAgbW92ICAgICAgICAgICAgICAgICAgICBzcmNfaW5jcmQsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5zcmNfaW5jcl0KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY3R4X3N0YWNrcSwgY3R4cQorICAgIG1vdiAgICAgICAgICAgIHBoYXNlX21hc2tfc3RhY2tkLCBwaGFzZV9tYXNrZAorICAgIG1vdiAgICAgICAgICAgbWluX2ZpbHRlcl9sZW5feDRkLCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZmlsdGVyX2xlbmd0aF0KKyVpZmlkbiAlMSwgaW50MTYKKyAgICBtb3ZkICAgICAgICAgICAgICAgICAgICAgICAgICBtNCwgW3BkXzB4NDAwMF0KKyVlbHNlIDsgZmxvYXQvZG91YmxlCisgICAgY3Z0c2kycyU0ICAgICAgICAgICAgICAgICAgICB4bTAsIHNyY19pbmNyZAorICAgIG1vdnMlNCAgICAgICAgICAgICAgICAgICAgICAgeG00LCBbJTVdCisgICAgZGl2cyU0ICAgICAgICAgICAgICAgICAgICAgICB4bTQsIHhtMAorJWVuZGlmCisgICAgbW92ICAgICAgICAgICAgICAgIGRzdF9pbmNyX2RpdmQsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5kc3RfaW5jcl9kaXZdCisgICAgc2hsICAgICAgICAgICBtaW5fZmlsdGVyX2xlbl94NGQsICUzCisgICAgbGVhICAgICAgICAgICAgICAgICAgICAgZHN0X2VuZHEsIFtkc3RxK3NpemVxKiUyXQorCislaWYgVU5JWDY0CisgICAgbW92ICAgICAgICAgICAgICAgICAgICAgICAgICBlY3gsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9zaGlmdF0KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaSwgW2N0eHErUmVzYW1wbGVDb250ZXh0LmZpbHRlcl9hbGxvY10KKworICAgIERFRklORV9BUkdTIGZpbHRlcl9hbGxvYywgZHN0LCBmaWx0ZXIyLCBwaGFzZV9zaGlmdCwgaW5kZXgsIGZyYWMsIGZpbHRlcjEsIFwKKyAgICAgICAgICAgICAgICBkc3RfaW5jcl9tb2QsIG1pbl9maWx0ZXJfY291bnRfeDQsIG1pbl9maWx0ZXJfbGVuX3g0LCBcCisgICAgICAgICAgICAgICAgZHN0X2luY3JfZGl2LCBzcmNfaW5jciwgc3JjLCBkc3RfZW5kLCBmaWx0ZXJfYmFuaworJWVsaWYgV0lONjQKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgIFI5ZCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LmZpbHRlcl9hbGxvY10KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgIGVjeCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LnBoYXNlX3NoaWZ0XQorCisgICAgREVGSU5FX0FSR1MgcGhhc2Vfc2hpZnQsIGZpbHRlcjIsIHNyYywgZmlsdGVyX2FsbG9jLCBpbmRleCwgZnJhYywgZmlsdGVyMSwgXAorICAgICAgICAgICAgICAgIGRzdF9pbmNyX21vZCwgbWluX2ZpbHRlcl9jb3VudF94NCwgbWluX2ZpbHRlcl9sZW5feDQsIFwKKyAgICAgICAgICAgICAgICBkc3RfaW5jcl9kaXYsIHNyY19pbmNyLCBkc3QsIGRzdF9lbmQsIGZpbHRlcl9iYW5rCislZW5kaWYKKworICAgIG5lZyAgICAgICAgICAgbWluX2ZpbHRlcl9sZW5feDRxCisgICAgc3ViICAgICAgICAgICAgICAgICBmaWx0ZXJfYmFua3EsIG1pbl9maWx0ZXJfbGVuX3g0cQorICAgIHN1YiAgICAgICAgICAgICAgICAgICAgICAgICBzcmNxLCBtaW5fZmlsdGVyX2xlbl94NHEKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgc3JjX3N0YWNrcSwgc3JjcQorJWVsc2UgOyB4ODYtMzIKK2NnbG9iYWwgcmVzYW1wbGVfbGluZWFyXyUxLCAxLCA3LCA1LCBjdHgsIG1pbl9maWx0ZXJfbGVuZ3RoX3g0LCBmaWx0ZXIyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhYywgaW5kZXgsIGRzdCwgZmlsdGVyX2JhbmsKKworICAgIDsgcHVzaCB0ZW1wIHZhcmlhYmxlcyB0byBzdGFjaworJWRlZmluZSBjdHhfc3RhY2txICAgICAgICAgICAgcjBtcAorJWRlZmluZSBzcmNfc3RhY2txICAgICAgICAgICAgcjJtcAorJWRlZmluZSB1cGRhdGVfY29udGV4dF9zdGFja2QgcjRtCisKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgZHN0cSwgcjFtcAorICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgIHIzLCByM21wCisgICAgbGVhICAgICAgICAgICAgICAgICAgICAgICAgICAgcjMsIFtkc3RxK3IzKiUyXQorICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd29yZCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZHN0X2luY3JfZGl2XQorICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMworICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgIHIzLCBkd29yZCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZmlsdGVyX2FsbG9jXQorICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd29yZCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZHN0X2luY3JfbW9kXQorICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMworICAgIHNobCAgICAgICAgICAgICAgICAgICAgICAgICAgIHIzLCAlMworICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMworICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgIHIzLCBkd29yZCBbY3R4cStSZXNhbXBsZUNvbnRleHQuc3JjX2luY3JdCisgICAgUFVTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3b3JkIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9tYXNrXQorICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByM2QKKyVpZmlkbiAlMSwgaW50MTYKKyAgICBtb3ZkICAgICAgICAgICAgICAgICAgICAgICAgICBtNCwgW3BkXzB4NDAwMF0KKyVlbHNlIDsgZmxvYXQvZG91YmxlCisgICAgY3Z0c2kycyU0ICAgICAgICAgICAgICAgICAgICB4bTAsIHIzZAorICAgIG1vdnMlNCAgICAgICAgICAgICAgICAgICAgICAgeG00LCBbJTVdCisgICAgZGl2cyU0ICAgICAgICAgICAgICAgICAgICAgICB4bTQsIHhtMAorJWVuZGlmCisgICAgbW92ICAgICAgICBtaW5fZmlsdGVyX2xlbmd0aF94NGQsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5maWx0ZXJfbGVuZ3RoXQorICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhkLCBbY3R4cStSZXNhbXBsZUNvbnRleHQuaW5kZXhdCisgICAgc2hsICAgICAgICBtaW5fZmlsdGVyX2xlbmd0aF94NGQsICUzCisgICAgbW92ICAgICAgICAgICAgICAgICAgICAgICAgZnJhY2QsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5mcmFjXQorICAgIG5lZyAgICAgICAgbWluX2ZpbHRlcl9sZW5ndGhfeDRxCisgICAgbW92ICAgICAgICAgICAgICAgICBmaWx0ZXJfYmFua3EsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5maWx0ZXJfYmFua10KKyAgICBzdWIgICAgICAgICAgICAgICAgICAgICAgICAgcjJtcCwgbWluX2ZpbHRlcl9sZW5ndGhfeDRxCisgICAgc3ViICAgICAgICAgICAgICAgICBmaWx0ZXJfYmFua3EsIG1pbl9maWx0ZXJfbGVuZ3RoX3g0cQorICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZmlsdGVyX2xlbmd0aF94NHEKKyAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2JhbmtxCisgICAgUFVTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3b3JkIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9zaGlmdF0KKworICAgIERFRklORV9BUkdTIGZpbHRlcjEsIG1pbl9maWx0ZXJfY291bnRfeDQsIGZpbHRlcjIsIGZyYWMsIGluZGV4LCBkc3QsIHNyYworCislZGVmaW5lIHBoYXNlX3NoaWZ0X3N0YWNrZCAgICBkd29yZCBbcnNwKzB4MF0KKyVkZWZpbmUgZmlsdGVyX2JhbmtxICAgICAgICAgIGR3b3JkIFtyc3ArMHg0XQorJWRlZmluZSBtaW5fZmlsdGVyX2xlbmd0aF94NHEgZHdvcmQgW3JzcCsweDhdCislZGVmaW5lIHNyY19pbmNyZCAgICAgICAgICAgICBkd29yZCBbcnNwKzB4Y10KKyVkZWZpbmUgcGhhc2VfbWFza19zdGFja2QgICAgIGR3b3JkIFtyc3ArMHgxMF0KKyVkZWZpbmUgZmlsdGVyX2FsbG9jX3g0cSAgICAgIGR3b3JkIFtyc3ArMHgxNF0KKyVkZWZpbmUgZmlsdGVyX2FsbG9jZCAgICAgICAgIGR3b3JkIFtyc3ArMHgxOF0KKyVkZWZpbmUgZHN0X2luY3JfbW9kZCAgICAgICAgIGR3b3JkIFtyc3ArMHgxY10KKyVkZWZpbmUgZHN0X2VuZHEgICAgICAgICAgICAgIGR3b3JkIFtyc3ArMHgyMF0KKyVkZWZpbmUgZHN0X2luY3JfZGl2ZCAgICAgICAgIGR3b3JkIFtyc3ArMHgyNF0KKworICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICBzcmNxLCByMm1wCislZW5kaWYKKworLmxvb3A6CisgICAgbW92ICAgICAgICAgICAgICAgICAgICAgZmlsdGVyMWQsIGZpbHRlcl9hbGxvY2QKKyAgICBpbXVsICAgICAgICAgICAgICAgICAgICBmaWx0ZXIxZCwgaW5kZXhkCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3YgICAgICAgICBtaW5fZmlsdGVyX2NvdW50X3g0cSwgbWluX2ZpbHRlcl9sZW5feDRxCisgICAgbGVhICAgICAgICAgICAgICAgICAgICAgZmlsdGVyMXEsIFtmaWx0ZXJfYmFua3ErZmlsdGVyMXEqJTJdCisgICAgbGVhICAgICAgICAgICAgICAgICAgICAgZmlsdGVyMnEsIFtmaWx0ZXIxcStmaWx0ZXJfYWxsb2NxKiUyXQorJWVsc2UgOyB4ODYtMzIKKyAgICBtb3YgICAgICAgICBtaW5fZmlsdGVyX2NvdW50X3g0cSwgZmlsdGVyX2JhbmtxCisgICAgbGVhICAgICAgICAgICAgICAgICAgICAgZmlsdGVyMXEsIFttaW5fZmlsdGVyX2NvdW50X3g0cStmaWx0ZXIxcSolMl0KKyAgICBtb3YgICAgICAgICBtaW5fZmlsdGVyX2NvdW50X3g0cSwgbWluX2ZpbHRlcl9sZW5ndGhfeDRxCisgICAgbW92ICAgICAgICAgICAgICAgICAgICAgZmlsdGVyMnEsIGZpbHRlcjFxCisgICAgYWRkICAgICAgICAgICAgICAgICAgICAgZmlsdGVyMnEsIGZpbHRlcl9hbGxvY194NHEKKyVlbmRpZgorJWlmaWRuICUxLCBpbnQxNgorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgICAgICAgIG0wLCBtNAorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgICAgICAgIG0yLCBtNAorJWVsc2UgOyBmbG9hdC9kb3VibGUKKyAgICB4b3JwcyAgICAgICAgICAgICAgICAgICAgICAgICBtMCwgbTAsIG0wCisgICAgeG9ycHMgICAgICAgICAgICAgICAgICAgICAgICAgbTIsIG0yLCBtMgorJWVuZGlmCisKKyAgICBhbGlnbiAxNgorLmlubmVyX2xvb3A6CisgICAgbW92dSAgICAgICAgICAgICAgICAgICAgICAgICAgbTEsIFtzcmNxK21pbl9maWx0ZXJfY291bnRfeDRxKjFdCislaWZpZG4gJTEsIGludDE2CislaWYgY3B1ZmxhZyh4b3ApCisgICAgdnBtYWRjc3dkICAgICAgICAgICAgICAgICAgICAgbTIsIG0xLCBbZmlsdGVyMnErbWluX2ZpbHRlcl9jb3VudF94NHEqMV0sIG0yCisgICAgdnBtYWRjc3dkICAgICAgICAgICAgICAgICAgICAgbTAsIG0xLCBbZmlsdGVyMXErbWluX2ZpbHRlcl9jb3VudF94NHEqMV0sIG0wCislZWxzZQorICAgIHBtYWRkd2QgICAgICAgICAgICAgICAgICAgICAgIG0zLCBtMSwgW2ZpbHRlcjJxK21pbl9maWx0ZXJfY291bnRfeDRxKjFdCisgICAgcG1hZGR3ZCAgICAgICAgICAgICAgICAgICAgICAgbTEsIFtmaWx0ZXIxcSttaW5fZmlsdGVyX2NvdW50X3g0cSoxXQorICAgIHBhZGRkICAgICAgICAgICAgICAgICAgICAgICAgIG0yLCBtMworICAgIHBhZGRkICAgICAgICAgICAgICAgICAgICAgICAgIG0wLCBtMQorJWVuZGlmIDsgY3B1ZmxhZworJWVsc2UgOyBmbG9hdC9kb3VibGUKKyVpZiBjcHVmbGFnKGZtYTQpIHx8IGNwdWZsYWcoZm1hMykKKyAgICBmbWFkZHAlNCAgICAgICAgICAgICAgICAgICAgICBtMiwgbTEsIFtmaWx0ZXIycSttaW5fZmlsdGVyX2NvdW50X3g0cSoxXSwgbTIKKyAgICBmbWFkZHAlNCAgICAgICAgICAgICAgICAgICAgICBtMCwgbTEsIFtmaWx0ZXIxcSttaW5fZmlsdGVyX2NvdW50X3g0cSoxXSwgbTAKKyVlbHNlCisgICAgbXVscCU0ICAgICAgICAgICAgICAgICAgICAgICAgbTMsIG0xLCBbZmlsdGVyMnErbWluX2ZpbHRlcl9jb3VudF94NHEqMV0KKyAgICBtdWxwJTQgICAgICAgICAgICAgICAgICAgICAgICBtMSwgbTEsIFtmaWx0ZXIxcSttaW5fZmlsdGVyX2NvdW50X3g0cSoxXQorICAgIGFkZHAlNCAgICAgICAgICAgICAgICAgICAgICAgIG0yLCBtMiwgbTMKKyAgICBhZGRwJTQgICAgICAgICAgICAgICAgICAgICAgICBtMCwgbTAsIG0xCislZW5kaWYgOyBjcHVmbGFnCislZW5kaWYKKyAgICBhZGQgICAgICAgICBtaW5fZmlsdGVyX2NvdW50X3g0cSwgbW1zaXplCisgICAganMgLmlubmVyX2xvb3AKKworJWlmaWRuICUxLCBpbnQxNgorJWlmIG1tc2l6ZSA9PSAxNgorJWlmIGNwdWZsYWcoeG9wKQorICAgIHZwaGFkZGRxICAgICAgICAgICAgICAgICAgICAgIG0yLCBtMgorICAgIHZwaGFkZGRxICAgICAgICAgICAgICAgICAgICAgIG0wLCBtMAorJWVuZGlmCisgICAgcHNodWZkICAgICAgICAgICAgICAgICAgICAgICAgbTMsIG0yLCBxMDAzMgorICAgIHBzaHVmZCAgICAgICAgICAgICAgICAgICAgICAgIG0xLCBtMCwgcTAwMzIKKyAgICBwYWRkZCAgICAgICAgICAgICAgICAgICAgICAgICBtMiwgbTMKKyAgICBwYWRkZCAgICAgICAgICAgICAgICAgICAgICAgICBtMCwgbTEKKyVlbmRpZgorJWlmIG5vdGNwdWZsYWcoeG9wKQorICAgIFBTSFVGTFcgICAgICAgICAgICAgICAgICAgICAgIG0zLCBtMiwgcTAwMzIKKyAgICBQU0hVRkxXICAgICAgICAgICAgICAgICAgICAgICBtMSwgbTAsIHEwMDMyCisgICAgcGFkZGQgICAgICAgICAgICAgICAgICAgICAgICAgbTIsIG0zCisgICAgcGFkZGQgICAgICAgICAgICAgICAgICAgICAgICAgbTAsIG0xCislZW5kaWYKKyAgICBwc3ViZCAgICAgICAgICAgICAgICAgICAgICAgICBtMiwgbTAKKyAgICA7IFRoaXMgaXMgcHJvYmFibHkgYSByZWFsbHkgYmFkIGlkZWEgb24gYXRvbSBhbmQgb3RoZXIgbWFjaGluZXMgd2l0aCBhCisgICAgOyBsb25nIHRyYW5zZmVyIGxhdGVuY3kgYmV0d2VlbiBHUFJzIGFuZCBYTU1zIChhdG9tKS4gSG93ZXZlciwgaXQgZG9lcworICAgIDsgbWFrZSB0aGUgY2xpcCBhIGxvdCBzaW1wbGVyLi4uCisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgICAgICBlYXgsIG0yCisgICAgYWRkICAgICAgICAgICAgICAgICAgICAgICBpbmRleGQsIGRzdF9pbmNyX2RpdmQKKyAgICBpbXVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhY2QKKyAgICBpZGl2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2luY3JkCisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgICAgICAgbTEsIGVheAorICAgIGFkZCAgICAgICAgICAgICAgICAgICAgICAgIGZyYWNkLCBkc3RfaW5jcl9tb2RkCisgICAgcGFkZGQgICAgICAgICAgICAgICAgICAgICAgICAgbTAsIG0xCisgICAgcHNyYWQgICAgICAgICAgICAgICAgICAgICAgICAgbTAsIDE1CisgICAgcGFja3NzZHcgICAgICAgICAgICAgICAgICAgICAgbTAsIG0wCisgICAgbW92ZCAgICAgICAgICAgICAgICAgICAgICBbZHN0cV0sIG0wCisKKyAgICA7IG5vdGUgdGhhdCBmb3IgaW11bC9pZGl2LCBJIG5lZWQgdG8gbW92ZSBmaWx0ZXIgdG8gZWR4L2VheCBmb3IgZWFjaDoKKyAgICA7IC0gMzJiaXQ6IGVheD1yMFtmaWx0ZXIxXSwgZWR4PXIyW2ZpbHRlcjJdCisgICAgOyAtIHdpbjY0OiBlYXg9cjZbZmlsdGVyMV0sIGVkeD1yMVt0b2RvXQorICAgIDsgLSB1bml4NjQ6IGVheD1yNltmaWx0ZXIxXSwgZWR4PXIyW3RvZG9dCislZWxzZSA7IGZsb2F0L2RvdWJsZQorICAgIDsgdmFsICs9ICh2MiAtIHZhbCkgKiAoRkVMRU1MKSBmcmFjIC8gYy0+c3JjX2luY3I7CislaWYgbW1zaXplID09IDMyCisgICAgdmV4dHJhY3RmMTI4ICAgICAgICAgICAgICAgICB4bTEsIG0wLCAweDEKKyAgICB2ZXh0cmFjdGYxMjggICAgICAgICAgICAgICAgIHhtMywgbTIsIDB4MQorICAgIGFkZHBzICAgICAgICAgICAgICAgICAgICAgICAgeG0wLCB4bTEKKyAgICBhZGRwcyAgICAgICAgICAgICAgICAgICAgICAgIHhtMiwgeG0zCislZW5kaWYKKyAgICBjdnRzaTJzJTQgICAgICAgICAgICAgICAgICAgIHhtMSwgZnJhY2QKKyAgICBzdWJwJTQgICAgICAgICAgICAgICAgICAgICAgIHhtMiwgeG0wCisgICAgbXVscCU0ICAgICAgICAgICAgICAgICAgICAgICB4bTEsIHhtNAorICAgIHNodWZwJTQgICAgICAgICAgICAgICAgICAgICAgeG0xLCB4bTEsIHEwMDAwCislaWYgY3B1ZmxhZyhmbWE0KSB8fCBjcHVmbGFnKGZtYTMpCisgICAgZm1hZGRwJTQgICAgICAgICAgICAgICAgICAgICB4bTAsIHhtMiwgeG0xLCB4bTAKKyVlbHNlCisgICAgbXVscCU0ICAgICAgICAgICAgICAgICAgICAgICB4bTIsIHhtMQorICAgIGFkZHAlNCAgICAgICAgICAgICAgICAgICAgICAgeG0wLCB4bTIKKyVlbmRpZiA7IGNwdWZsYWcKKworICAgIDsgaG9yaXpvbnRhbCBzdW0gJiBzdG9yZQorICAgIG1vdmhscHMgICAgICAgICAgICAgICAgICAgICAgeG0xLCB4bTAKKyVpZmlkbiAlMSwgZmxvYXQKKyAgICBhZGRwcyAgICAgICAgICAgICAgICAgICAgICAgIHhtMCwgeG0xCisgICAgc2h1ZnBzICAgICAgICAgICAgICAgICAgICAgICB4bTEsIHhtMCwgeG0wLCBxMDAwMQorJWVuZGlmCisgICAgYWRkICAgICAgICAgICAgICAgICAgICAgICAgZnJhY2QsIGRzdF9pbmNyX21vZGQKKyAgICBhZGRwJTQgICAgICAgICAgICAgICAgICAgICAgIHhtMCwgeG0xCisgICAgYWRkICAgICAgICAgICAgICAgICAgICAgICBpbmRleGQsIGRzdF9pbmNyX2RpdmQKKyAgICBtb3ZzJTQgICAgICAgICAgICAgICAgICAgIFtkc3RxXSwgeG0wCislZW5kaWYKKyAgICBjbXAgICAgICAgICAgICAgICAgICAgICAgICBmcmFjZCwgc3JjX2luY3JkCisgICAgamwgLnNraXAKKyAgICBzdWIgICAgICAgICAgICAgICAgICAgICAgICBmcmFjZCwgc3JjX2luY3JkCisgICAgaW5jICAgICAgICAgICAgICAgICAgICAgICBpbmRleGQKKworJWlmIFVOSVg2NAorICAgIERFRklORV9BUkdTIGZpbHRlcl9hbGxvYywgZHN0LCBmaWx0ZXIyLCBwaGFzZV9zaGlmdCwgaW5kZXgsIGZyYWMsIGluZGV4X2luY3IsIFwKKyAgICAgICAgICAgICAgICBkc3RfaW5jcl9tb2QsIG1pbl9maWx0ZXJfY291bnRfeDQsIG1pbl9maWx0ZXJfbGVuX3g0LCBcCisgICAgICAgICAgICAgICAgZHN0X2luY3JfZGl2LCBzcmNfaW5jciwgc3JjLCBkc3RfZW5kLCBmaWx0ZXJfYmFuaworJWVsaWYgV0lONjQKKyAgICBERUZJTkVfQVJHUyBwaGFzZV9zaGlmdCwgZmlsdGVyMiwgc3JjLCBmaWx0ZXJfYWxsb2MsIGluZGV4LCBmcmFjLCBpbmRleF9pbmNyLCBcCisgICAgICAgICAgICAgICAgZHN0X2luY3JfbW9kLCBtaW5fZmlsdGVyX2NvdW50X3g0LCBtaW5fZmlsdGVyX2xlbl94NCwgXAorICAgICAgICAgICAgICAgIGRzdF9pbmNyX2Rpdiwgc3JjX2luY3IsIGRzdCwgZHN0X2VuZCwgZmlsdGVyX2JhbmsKKyVlbHNlIDsgeDg2LTMyCisgICAgREVGSU5FX0FSR1MgZmlsdGVyMSwgcGhhc2Vfc2hpZnQsIGluZGV4X2luY3IsIGZyYWMsIGluZGV4LCBkc3QsIHNyYworJWVuZGlmCisKKy5za2lwOgorJWlmIEFSQ0hfWDg2XzMyCisgICAgbW92ICAgICAgICAgICAgICAgICBwaGFzZV9zaGlmdGQsIHBoYXNlX3NoaWZ0X3N0YWNrZAorJWVuZGlmCisgICAgbW92ICAgICAgICAgICAgICAgICAgaW5kZXhfaW5jcmQsIGluZGV4ZAorICAgIGFkZCAgICAgICAgICAgICAgICAgICAgICAgICBkc3RxLCAlMgorICAgIGFuZCAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhkLCBwaGFzZV9tYXNrX3N0YWNrZAorICAgIHNhciAgICAgICAgICAgICAgICAgIGluZGV4X2luY3JkLCBwaGFzZV9zaGlmdGIKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgICAgICAgc3JjcSwgW3NyY3EraW5kZXhfaW5jcnEqJTJdCisgICAgY21wICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHEsIGRzdF9lbmRxCisgICAgam5lIC5sb29wCisKKyVpZiBVTklYNjQKKyAgICBERUZJTkVfQVJHUyBjdHgsIGRzdCwgZmlsdGVyMiwgcGhhc2Vfc2hpZnQsIGluZGV4LCBmcmFjLCBpbmRleF9pbmNyLCBcCisgICAgICAgICAgICAgICAgZHN0X2luY3JfbW9kLCBtaW5fZmlsdGVyX2NvdW50X3g0LCBtaW5fZmlsdGVyX2xlbl94NCwgXAorICAgICAgICAgICAgICAgIGRzdF9pbmNyX2Rpdiwgc3JjX2luY3IsIHNyYywgZHN0X2VuZCwgZmlsdGVyX2JhbmsKKyVlbGlmIFdJTjY0CisgICAgREVGSU5FX0FSR1MgY3R4LCBmaWx0ZXIyLCBzcmMsIHBoYXNlX3NoaWZ0LCBpbmRleCwgZnJhYywgaW5kZXhfaW5jciwgXAorICAgICAgICAgICAgICAgIGRzdF9pbmNyX21vZCwgbWluX2ZpbHRlcl9jb3VudF94NCwgbWluX2ZpbHRlcl9sZW5feDQsIFwKKyAgICAgICAgICAgICAgICBkc3RfaW5jcl9kaXYsIHNyY19pbmNyLCBkc3QsIGRzdF9lbmQsIGZpbHRlcl9iYW5rCislZWxzZSA7IHg4Ni0zMgorICAgIERFRklORV9BUkdTIGZpbHRlcjEsIGN0eCwgdXBkYXRlX2NvbnRleHQsIGZyYWMsIGluZGV4LCBkc3QsIHNyYworJWVuZGlmCisKKyAgICBjbXAgIGR3b3JkIHVwZGF0ZV9jb250ZXh0X3N0YWNrZCwgMAorICAgIGp6IC5za2lwX3N0b3JlCisgICAgOyBzdHJpY3RseSBzcGVha2luZywgdGhlIGZ1bmN0aW9uIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoZSBjb25zdW1lZAorICAgIDsgbnVtYmVyIG9mIGJ5dGVzOyBob3dldmVyLCB3ZSBvbmx5IHVzZSB0aGUgdmFsdWUgaWYgdXBkYXRlX2NvbnRleHQKKyAgICA7IGlzIHRydWUsIHNvIGxldCdzIGp1c3QgbGVhdmUgaXQgdW5pbml0aWFsaXplZCBvdGhlcndpc2UKKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgY3R4cSwgY3R4X3N0YWNrcQorICAgIG1vdmlmbmlkbiAgICAgICAgICAgICAgICAgICAgcmF4LCBzcmNxCisgICAgbW92IFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5mcmFjIF0sIGZyYWNkCisgICAgc3ViICAgICAgICAgICAgICAgICAgICAgICAgICByYXgsIHNyY19zdGFja3EKKyAgICBtb3YgW2N0eHErUmVzYW1wbGVDb250ZXh0LmluZGV4XSwgaW5kZXhkCisgICAgc2hyICAgICAgICAgICAgICAgICAgICAgICAgICByYXgsICUzCisKKy5za2lwX3N0b3JlOgorJWlmIEFSQ0hfWDg2XzMyCisgICAgQUREICAgICAgICAgICAgICAgICAgICAgICAgICByc3AsIDB4MjgKKyVlbmRpZgorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZQorUkVTQU1QTEVfRk5TIGZsb2F0LCA0LCAyLCBzLCBwZl8xCisKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4CitSRVNBTVBMRV9GTlMgZmxvYXQsIDQsIDIsIHMsIHBmXzEKKyVlbmRpZgorJWlmIEhBVkVfRk1BM19FWFRFUk5BTAorSU5JVF9ZTU0gZm1hMworUkVTQU1QTEVfRk5TIGZsb2F0LCA0LCAyLCBzLCBwZl8xCislZW5kaWYKKyVpZiBIQVZFX0ZNQTRfRVhURVJOQUwKK0lOSVRfWE1NIGZtYTQKK1JFU0FNUExFX0ZOUyBmbG9hdCwgNCwgMiwgcywgcGZfMQorJWVuZGlmCisKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggbW14ZXh0CitSRVNBTVBMRV9GTlMgaW50MTYsIDIsIDEKKyVlbmRpZgorCitJTklUX1hNTSBzc2UyCitSRVNBTVBMRV9GTlMgaW50MTYsIDIsIDEKKyVpZiBIQVZFX1hPUF9FWFRFUk5BTAorSU5JVF9YTU0geG9wCitSRVNBTVBMRV9GTlMgaW50MTYsIDIsIDEKKyVlbmRpZgorCitJTklUX1hNTSBzc2UyCitSRVNBTVBMRV9GTlMgZG91YmxlLCA4LCAzLCBkLCBwZGJsXzEKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3g4Ni9yZXNhbXBsZV9pbml0LmMgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvcmVzYW1wbGVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjVlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvcmVzYW1wbGVfaW5pdC5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBhdWRpbyByZXNhbXBsaW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBhdWRpbyByZXNhbXBsaW5nCisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGlic3dyZXNhbXBsZS9yZXNhbXBsZS5oIgorCisjZGVmaW5lIFJFU0FNUExFX0ZVTkNTKHR5cGUsIG9wdCkgXAoraW50IGZmX3Jlc2FtcGxlX2NvbW1vbl8jI3R5cGUjI18jI29wdChSZXNhbXBsZUNvbnRleHQgKmMsIHZvaWQgKmRzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzcmMsIGludCBzeiwgaW50IHVwZCk7IFwKK2ludCBmZl9yZXNhbXBsZV9saW5lYXJfIyN0eXBlIyNfIyNvcHQoUmVzYW1wbGVDb250ZXh0ICpjLCB2b2lkICpkc3QsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjLCBpbnQgc3osIGludCB1cGQpCisKK1JFU0FNUExFX0ZVTkNTKGludDE2LCAgbW14ZXh0KTsKK1JFU0FNUExFX0ZVTkNTKGludDE2LCAgc3NlMik7CitSRVNBTVBMRV9GVU5DUyhpbnQxNiwgIHhvcCk7CitSRVNBTVBMRV9GVU5DUyhmbG9hdCwgIHNzZSk7CitSRVNBTVBMRV9GVU5DUyhmbG9hdCwgIGF2eCk7CitSRVNBTVBMRV9GVU5DUyhmbG9hdCwgIGZtYTMpOworUkVTQU1QTEVfRlVOQ1MoZmxvYXQsICBmbWE0KTsKK1JFU0FNUExFX0ZVTkNTKGRvdWJsZSwgc3NlMik7CisKK3ZvaWQgc3dyaV9yZXNhbXBsZV9kc3BfeDg2X2luaXQoUmVzYW1wbGVDb250ZXh0ICpjKQoreworICAgIGludCBhdl91bnVzZWQgbW1fZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBzd2l0Y2goYy0+Zm9ybWF0KXsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2UDoKKyAgICAgICAgaWYgKEFSQ0hfWDg2XzMyICYmIEVYVEVSTkFMX01NWEVYVChtbV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZSA9IGMtPmxpbmVhciA/IGZmX3Jlc2FtcGxlX2xpbmVhcl9pbnQxNl9tbXhleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZmX3Jlc2FtcGxlX2NvbW1vbl9pbnQxNl9tbXhleHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIobW1fZmxhZ3MpKSB7CisgICAgICAgICAgICBjLT5kc3AucmVzYW1wbGUgPSBjLT5saW5lYXIgPyBmZl9yZXNhbXBsZV9saW5lYXJfaW50MTZfc3NlMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmZfcmVzYW1wbGVfY29tbW9uX2ludDE2X3NzZTI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX1hPUChtbV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZSA9IGMtPmxpbmVhciA/IGZmX3Jlc2FtcGxlX2xpbmVhcl9pbnQxNl94b3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZmX3Jlc2FtcGxlX2NvbW1vbl9pbnQxNl94b3A7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVFA6CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UobW1fZmxhZ3MpKSB7CisgICAgICAgICAgICBjLT5kc3AucmVzYW1wbGUgPSBjLT5saW5lYXIgPyBmZl9yZXNhbXBsZV9saW5lYXJfZmxvYXRfc3NlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmZl9yZXNhbXBsZV9jb21tb25fZmxvYXRfc3NlOworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgobW1fZmxhZ3MpKSB7CisgICAgICAgICAgICBjLT5kc3AucmVzYW1wbGUgPSBjLT5saW5lYXIgPyBmZl9yZXNhbXBsZV9saW5lYXJfZmxvYXRfYXZ4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmZl9yZXNhbXBsZV9jb21tb25fZmxvYXRfYXZ4OworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9GTUEzKG1tX2ZsYWdzKSkgeworICAgICAgICAgICAgYy0+ZHNwLnJlc2FtcGxlID0gYy0+bGluZWFyID8gZmZfcmVzYW1wbGVfbGluZWFyX2Zsb2F0X2ZtYTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZmX3Jlc2FtcGxlX2NvbW1vbl9mbG9hdF9mbWEzOworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9GTUE0KG1tX2ZsYWdzKSkgeworICAgICAgICAgICAgYy0+ZHNwLnJlc2FtcGxlID0gYy0+bGluZWFyID8gZmZfcmVzYW1wbGVfbGluZWFyX2Zsb2F0X2ZtYTQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZmX3Jlc2FtcGxlX2NvbW1vbl9mbG9hdF9mbWE0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQOgorICAgICAgICBpZiAoRVhURVJOQUxfU1NFMihtbV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZSA9IGMtPmxpbmVhciA/IGZmX3Jlc2FtcGxlX2xpbmVhcl9kb3VibGVfc3NlMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmZfcmVzYW1wbGVfY29tbW9uX2RvdWJsZV9zc2UyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3Jlc2FtcGxlL3g4Ni93NjR4bW10ZXN0LmMgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvdzY0eG1tdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZGRiNGEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dyZXNhbXBsZS94ODYvdzY0eG1tdGVzdC5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBjaGVjayBYTU0gcmVnaXN0ZXJzIGZvciBjbG9iYmVycyBvbiBXaW42NAorICogQ29weXJpZ2h0IChjKSAyMDEzIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L3c2NHhtbXRlc3QuaCIKKword3JhcChzd3JfY29udmVydChzdHJ1Y3QgU3dyQ29udGV4dCAqcywgdWludDhfdCAqKm91dCwgaW50IG91dF9jb3VudCwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKmluICwgaW50IGluX2NvdW50KSkKK3sKKyAgICB0ZXN0eG1tY2xvYmJlcnMoc3dyX2NvbnZlcnQsIHMsIG91dCwgb3V0X2NvdW50LCBpbiwgaW5fY291bnQpOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvTWFrZWZpbGUgYi9mZm1wZWcvbGlic3dzY2FsZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjBiMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvTWFrZWZpbGUKQEAgLTAsMCArMSwyNCBAQAoraW5jbHVkZSAkKFNVQkRJUikuLi9jb25maWcubWFrCisKK05BTUUgPSBzd3NjYWxlCisKK0hFQURFUlMgPSBzd3NjYWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB2ZXJzaW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworT0JKUyA9IGhzY2FsZV9mYXN0X2JpbGluZWFyLm8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaW5wdXQubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBvcHRpb25zLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIG91dHB1dC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmdiMnJnYi5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd3NjYWxlLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN3c2NhbGVfdW5zY2FsZWQubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgdXRpbHMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB5dXYycmdiLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitPQkpTLSQoQ09ORklHX1NIQVJFRCkgICAgICAgICs9IGxvZzJfdGFiLm8KKworIyBXaW5kb3dzIHJlc291cmNlIGZpbGUKK1NMSUJPQkpTLSQoSEFWRV9HTlVfV0lORFJFUykgKz0gc3dzY2FsZXJlcy5vCisKK1RFU1RQUk9HUyA9IGNvbG9yc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN3c2NhbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL2FybS9NYWtlZmlsZSBiL2ZmbXBlZy9saWJzd3NjYWxlL2FybS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjVhOTdiCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvYXJtL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorIyBPQkpTICAgICAgICArPSBhcm0vc3dzY2FsZV91bnNjYWxlZC5vCisKKyMgTkVPTi1PQkpTICAgKz0gYXJtL3JnYjJ5dXZfbmVvbl8zMi5vCisjIE5FT04tT0JKUyAgICs9IGFybS9yZ2IyeXV2X25lb25fMTYubwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvYXJtL3JnYjJ5dXZfbmVvbl8xNi5TIGIvZmZtcGVnL2xpYnN3c2NhbGUvYXJtL3JnYjJ5dXZfbmVvbl8xNi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWJjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS9hcm0vcmdiMnl1dl9uZW9uXzE2LlMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBYaWFvbGVpIFl1IDxkcmVpZmFjaHN0ZWluQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInJnYjJ5dXZfbmVvbl9jb21tb24uUyIKKworLyogZG93bnNhbXBsZWQgUjE2RzE2QjE2IHg4ICovCithbGlhc19xdyAgICByMTZ4OCwgIHE3CithbGlhc19xdyAgICBnMTZ4OCwgIHE4CithbGlhc19xdyAgICBiMTZ4OCwgIHE5CisKK2FsaWFzICAgbjE2eDE2X2wsICAgcTExCithbGlhcyAgIG4xNngxNl9oLCAgIHExMgorCithbGlhcyAgIHkxNngxNl9sLCAgIHExMworYWxpYXMgICB5MTZ4MTZfaCwgICBxMTQKKworYWxpYXNfcXcgICAgeTh4MTYsICBxMTUKKworLm1hY3JvIGluaXQgICAgIHNyYworICAgIHZsZDMuaTMyICAgIHtxMTNfbCwgcTE0X2wsIHExNV9sfSwgICAgICAgICAgW1xzcmNdIQorICAgIHZsZDMuaTMyICAgIHtxMTNfaFswXSwgcTE0X2hbMF0sIHExNV9oWzBdfSwgW1xzcmNdCisgICAgdnJzaHJuLmkzMiAgQ09fUiwgICBxMTMsICM3CisgICAgdnJzaHJuLmkzMiAgQ09fRywgICBxMTQsICM3CisgICAgdnJzaHJuLmkzMiAgQ09fQiwgICBxMTUsICM3CisKKyAgICB2bW92LnU4ICAgICBCSUFTX1ksICMxNgorICAgIHZtb3YudTggICAgIEJJQVNfVSwgIzEyOAorLmVuZG0KKworCisubWFjcm8gY29tcHV0ZV95XzE2eDFfc3RlcCAgYWN0aW9uLCBzOHgxNiwgY29lZmYKKyAgICB2bW92bC51OCAgICBuMTZ4MTZfbCwgICBcczh4MTZcKClfbAorICAgIHZtb3ZsLnU4ICAgIG4xNngxNl9oLCAgIFxzOHgxNlwoKV9oCisKKyAgICBcYWN0aW9uICAgICB5MTZ4MTZfbCwgICBuMTZ4MTZfbCwgICBcY29lZmYKKyAgICBcYWN0aW9uICAgICB5MTZ4MTZfaCwgICBuMTZ4MTZfaCwgICBcY29lZmYKKy5lbmRtCisKKy5tYWNybyBjb21wdXRlX3lfMTZ4MQorICAgIGNvbXB1dGVfeV8xNngxX3N0ZXAgdm11bCwgcjh4MTYsIENPX1JZCisgICAgY29tcHV0ZV95XzE2eDFfc3RlcCB2bWxhLCBnOHgxNiwgQ09fR1kKKyAgICBjb21wdXRlX3lfMTZ4MV9zdGVwIHZtbGEsIGI4eDE2LCBDT19CWQorCisgICAgdnJzaHJuLmkxNiAgeTh4MTZfbCwgICAgeTE2eDE2X2wsICAgIzgKKyAgICB2cnNocm4uaTE2ICB5OHgxNl9oLCAgICB5MTZ4MTZfaCwgICAjOAorCisgICAgdmFkZC51OCAgICAgeTh4MTYsICAgICAgeTh4MTYsICAgICAgQklBU19ZCisuZW5kbQorCithbGlhcyAgIGMxNng4LCAgICAgIHExNQorYWxpYXNfcXcgICAgYzh4OHgyLCBxMTAKKworCisubWFjcm8gY29tcHV0ZV9jaHJvbWFfOHgxICAgYywgQworICAgIHZtdWwgICAgYzE2eDgsICByMTZ4OCwgIENPX1JcQworICAgIHZtbGEgICAgYzE2eDgsICBnMTZ4OCwgIENPX0dcQworICAgIHZtbGEgICAgYzE2eDgsICBiMTZ4OCwgIENPX0JcQworCisgICAgdnJzaHJuLmkxNiAgXGNcKCk4eDgsICAgYzE2eDgsICAgICAgIzgKKyAgICB2YWRkLnU4ICAgICBcY1woKTh4OCwgICBcY1woKTh4OCwgICBCSUFTX1xDCisuZW5kbQorCisgICAgbG9vcF80MjBzcCAgcmdieCwgbnYxMiwgaW5pdCwga2VybmVsXzQyMF8xNngyLCAxNgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvYXJtL3JnYjJ5dXZfbmVvbl8zMi5TIGIvZmZtcGVnL2xpYnN3c2NhbGUvYXJtL3JnYjJ5dXZfbmVvbl8zMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MWE1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS9hcm0vcmdiMnl1dl9uZW9uXzMyLlMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgWGlhb2xlaSBZdSA8ZHJlaWZhY2hzdGVpbkBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJyZ2IyeXV2X25lb25fY29tbW9uLlMiCisKKy8qIGRvd25zYW1wbGVkIFIxNkcxNkIxNiB4OCAqLworYWxpYXNfcXcgICAgcjE2eDgsICBxNworYWxpYXNfcXcgICAgZzE2eDgsICBxOAorYWxpYXNfcXcgICAgYjE2eDgsICBxOQorCithbGlhcyAgIG4xNngxNl9vLCAgIHExMQorYWxpYXMgICBuMTZ4MTZfb2wsICBxMTFfbAorYWxpYXMgICBuMTZ4MTZfb2gsICBxMTFfaAorCithbGlhcyAgIHkzMngxNl9lbCwgIHExMgorYWxpYXMgICB5MzJ4MTZfZWgsICBxMTMKK2FsaWFzICAgeTMyeDE2X29sLCAgcTE0CithbGlhcyAgIHkzMngxNl9vaCwgIHExNQorCithbGlhcyAgIHkxNngxNl9lLCAgIHExMgorYWxpYXMgICB5MTZ4MTZfZWwsICBxMTJfbAorYWxpYXMgICB5MTZ4MTZfZWgsICBxMTJfaAorYWxpYXMgICB5MTZ4MTZfbywgICBxMTMKK2FsaWFzICAgeTE2eDE2X29sLCAgcTEzX2wKK2FsaWFzICAgeTE2eDE2X29oLCAgcTEzX2gKKworCithbGlhcyAgIHk4eDE2LCAgeTE2eDE2X2UKKworCisubWFjcm8gaW5pdCAgICAgc3JjCisgICAgLy8gbG9hZCBzMzJ4M3gzLCBuYXJyb3cgdG8gczE2eDN4MworICAgIHZsZDMuaTMyICAgIHtxMTNfbCwgcTE0X2wsIHExNV9sfSwgICAgICAgICAgW1xzcmNdIQorICAgIHZsZDMuaTMyICAgIHtxMTNfaFswXSwgcTE0X2hbMF0sIHExNV9oWzBdfSwgW1xzcmNdCisKKyAgICB2bW92bi5pMzIgICBDT19SLCBxMTMKKyAgICB2bW92bi5pMzIgICBDT19HLCBxMTQKKyAgICB2bW92bi5pMzIgICBDT19CLCBxMTUKKworICAgIHZtb3YudTggICAgIEJJQVNfWSwgIzE2CisgICAgdm1vdi51OCAgICAgQklBU19VLCAjMTI4CisuZW5kbQorCisKKy5tYWNybyBjb21wdXRlX3lfMTZ4MV9zdGVwICBhY3Rpb24sIHM4eDE2LCBjb2VmZgorICAgIHZtb3YudTggICAgIG4xNngxNl9vLCAgICMwCisgICAgdnRybi51OCAgICAgXHM4eDE2LCAgICAgbjE2eDE2X28KKworICAgIFxhY3Rpb24gICAgIHkzMngxNl9lbCwgIFxzOHgxNlwoKV9sLCAgICBcY29lZmYKKyAgICBcYWN0aW9uICAgICB5MzJ4MTZfZWgsICBcczh4MTZcKClfaCwgICAgXGNvZWZmCisgICAgXGFjdGlvbiAgICAgeTMyeDE2X29sLCAgbjE2eDE2X29sLCAgICAgIFxjb2VmZgorICAgIFxhY3Rpb24gICAgIHkzMngxNl9vaCwgIG4xNngxNl9vaCwgICAgICBcY29lZmYKKy5lbmRtCisKKy8qCisgKiBpbjogICAgICByOHgxNiwgZzh4MTYsIGI4eDE2CisgKiBvdXQ6ICAgICB5OHgxNgorICogY2xvYmJlcjogcTExLXExNSwgcjh4MTYsIGc4eDE2LCBiOHgxNgorICovCisubWFjcm8gY29tcHV0ZV95XzE2eDEKKyAgICBjb21wdXRlX3lfMTZ4MV9zdGVwIHZtdWxsLCByOHgxNiwgQ09fUlkKKyAgICBjb21wdXRlX3lfMTZ4MV9zdGVwIHZtbGFsLCBnOHgxNiwgQ09fR1kKKyAgICBjb21wdXRlX3lfMTZ4MV9zdGVwIHZtbGFsLCBiOHgxNiwgQ09fQlkKKworICAgIHZyc2hybi5pMzIgIHkxNngxNl9lbCwgIHkzMngxNl9lbCwgICMxNQorICAgIHZyc2hybi5pMzIgIHkxNngxNl9laCwgIHkzMngxNl9laCwgICMxNQorICAgIHZyc2hybi5pMzIgIHkxNngxNl9vbCwgIHkzMngxNl9vbCwgICMxNQorICAgIHZyc2hybi5pMzIgIHkxNngxNl9vaCwgIHkzMngxNl9vaCwgICMxNQorCisgICAgdnRybi44ICAgICAgeTE2eDE2X2UsICAgeTE2eDE2X28KKyAgICB2YWRkLnU4ICAgICB5OHgxNiwgICAgICB5OHgxNiwgICAgICBCSUFTX1kKKy5lbmRtCisKK2FsaWFzICAgYzMyeDhfbCwgICAgcTE0CithbGlhcyAgIGMzMng4X2gsICAgIHExNQorCithbGlhc19xdyAgICBjMTZ4OCwgIHExMworYWxpYXNfcXcgICAgYzh4OHgyLCBxMTAKKworLm1hY3JvIGNvbXB1dGVfY2hyb21hXzh4MV9zdGVwICBhY3Rpb24sIHMxNng4LCBjb2VmZgorICAgIFxhY3Rpb24gICAgIGMzMng4X2wsICAgIFxzMTZ4OFwoKV9sLCAgICBcY29lZmYKKyAgICBcYWN0aW9uICAgICBjMzJ4OF9oLCAgICBcczE2eDhcKClfaCwgICAgXGNvZWZmCisuZW5kbQorCisvKgorICogaW46ICAgICAgcjE2eDgsIGcxNng4LCBiMTZ4OAorICogb3V0OiAgICAgYzh4OAorICogY2xvYmJlcjogcTE0LXExNQorICovCisubWFjcm8gY29tcHV0ZV9jaHJvbWFfOHgxICAgYywgQworICAgIGNvbXB1dGVfY2hyb21hXzh4MV9zdGVwIHZtdWxsLCByMTZ4OCwgQ09fUlxDCisgICAgY29tcHV0ZV9jaHJvbWFfOHgxX3N0ZXAgdm1sYWwsIGcxNng4LCBDT19HXEMKKyAgICBjb21wdXRlX2Nocm9tYV84eDFfc3RlcCB2bWxhbCwgYjE2eDgsIENPX0JcQworCisgICAgdnJzaHJuLmkzMiAgYzE2eDhfbCwgICAgYzMyeDhfbCwgICAgIzE1CisgICAgdnJzaHJuLmkzMiAgYzE2eDhfaCwgICAgYzMyeDhfaCwgICAgIzE1CisgICAgdm1vdm4uaTE2ICAgXGNcKCk4eDgsICAgYzE2eDgKKyAgICB2YWRkLnU4ICAgICBcY1woKTh4OCwgICBcY1woKTh4OCwgICBCSUFTX1xDCisuZW5kbQorCisKKyAgICBsb29wXzQyMHNwICByZ2J4LCBudjEyLCBpbml0LCBrZXJuZWxfNDIwXzE2eDIsIDMyCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS9hcm0vcmdiMnl1dl9uZW9uX2NvbW1vbi5TIGIvZmZtcGVnL2xpYnN3c2NhbGUvYXJtL3JnYjJ5dXZfbmVvbl9jb21tb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGJjZWNkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvYXJtL3JnYjJ5dXZfbmVvbl9jb21tb24uUwpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBYaWFvbGVpIFl1IDxkcmVpZmFjaHN0ZWluQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKKy5tYWNybyBhbGlhcyBuYW1lLCB0Z3QsIHNldD0xCisuaWYgXHNldCAhPSAwCisgICAgXG5hbWUgICAucmVxICAgIFx0Z3QKKy5lbHNlCisgICAgLnVucmVxICBcbmFtZQorLmVuZGlmCisuZW5kbQorCisuYWx0bWFjcm8KKworLm1hY3JvIGFsaWFzX2R3X2FsbCBxdywgZHdfbCwgZHdfaAorICAgIGFsaWFzICAgcVxxd1woKV9sLCBkXGR3X2wKKyAgICBhbGlhcyAgIHFccXdcKClfaCwgZFxkd19oCisgICAgLmlmIFxxdyA8IDE1CisgICAgICAgIGFsaWFzX2R3X2FsbCAgJShccXcgKyAxKSwgJShcZHdfbCArIDIpLCAlKFxkd19oICsgMikKKyAgICAuZW5kaWYKKy5lbmRtCisKK2FsaWFzX2R3X2FsbCAgICAwLCAwLCAxCisKKy5ub2FsdG1hY3JvCisKKy5tYWNybyBhbGlhc19xdyAgICAgbmFtZSwgcXcsIHNldD0xCisgICAgYWxpYXMgICBcbmFtZVwoKSwgXHF3LCBcc2V0CisgICAgYWxpYXMgICBcbmFtZVwoKV9sLCBccXdcKClfbCwgXHNldAorICAgIGFsaWFzICAgXG5hbWVcKClfaCwgXHF3XCgpX2gsIFxzZXQKKy5lbmRtCisKKy5tYWNybyBwcm9sb2d1ZQorICAgIHB1c2ggICAgICAgICAgICB7cjQtcjEyLCBscn0KKyAgICB2cHVzaCAgICAgICAgICAge3E0LXE3fQorLmVuZG0KKworLm1hY3JvIGVwaWxvZ3VlCisgICAgdnBvcCAgICAgICAgICAgIHtxNC1xN30KKyAgICBwb3AgICAgICAgICAgICAge3I0LXIxMiwgcGN9CisuZW5kbQorCisubWFjcm8gIGxvYWRfYXJnICAgIHJlZywgaXgKKyAgICBsZHIgICAgIFxyZWcsICAgW3NwLCAjKCgxMCAqIDQgKyA0ICogMTYpICsgKFxpeCAtIDQpICogNCldCisuZW5kbQorCisKKy8qICgpX3RvXygpX25lb24oY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICp5LCB1aW50OF90ICpjaHJvbWEKKyAqICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICogICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCBjX3N0cmlkZSwgaW50IHNyY19zdHJpZGUsCisgKiAgICAgICAgICAgICAgICAgIGludDMyX3QgY29lZmZfdGFibGVbOV0pOworICovCisubWFjcm8gIGFsaWFzX2xvb3BfNDIwc3Agc2V0PTEKKyAgICBhbGlhcyAgIHNyYywgICAgICAgIHIwLCBcc2V0CisgICAgYWxpYXMgICBzcmMwLCAgICAgICBzcmMsIFxzZXQKKyAgICBhbGlhcyAgIHksICAgICAgICAgIHIxLCBcc2V0CisgICAgYWxpYXMgICB5MCwgICAgICAgICB5LCBcc2V0CisgICAgYWxpYXMgICBjaHJvbWEsICAgICByMiwgXHNldAorICAgIGFsaWFzICAgd2lkdGgsICAgICAgcjMsIFxzZXQKKyAgICBhbGlhcyAgIGhlYWRlciwgICAgIHdpZHRoLCBcc2V0CisKKyAgICBhbGlhcyAgIGhlaWdodCwgICAgIHI0LCBcc2V0CisgICAgYWxpYXMgICB5X3N0cmlkZSwgICByNSwgXHNldAorICAgIGFsaWFzICAgY19zdHJpZGUsICAgcjYsIFxzZXQKKyAgICBhbGlhcyAgIGNfcGFkZGluZywgIGNfc3RyaWRlLCBcc2V0CisgICAgYWxpYXMgICBzcmNfc3RyaWRlLCByNywgXHNldAorCisgICAgYWxpYXMgICB5MF9lbmQsICAgICByOCwgXHNldAorCisgICAgYWxpYXMgICBzcmNfcGFkZGluZyxyOSwgXHNldAorICAgIGFsaWFzICAgeV9wYWRkaW5nLCAgcjEwLCBcc2V0CisKKyAgICBhbGlhcyAgIHNyYzEsICAgICAgIHIxMSwgXHNldAorICAgIGFsaWFzICAgeTEsICAgICAgICAgcjEyLCBcc2V0CisKKyAgICBhbGlhcyAgIGNvZWZmX3RhYmxlLHIxMiwgXHNldAorLmVuZG0KKworCisubWFjcm8gIGxvb3BfNDIwc3Agc19mbXQsIGRfZm10LCBpbml0LCBrZXJuZWwsIHByZWNpc2lvbgorCitmdW5jdGlvbiBcc19mbXRcKClfdG9fXGRfZm10XCgpX25lb25fXHByZWNpc2lvbiwgZXhwb3J0PTEKKyAgICBwcm9sb2d1ZQorCisgICAgYWxpYXNfbG9vcF80MjBzcAorCisgICAgbG9hZF9hcmcgICAgaGVpZ2h0LCAgICAgICAgIDQKKyAgICBsb2FkX2FyZyAgICB5X3N0cmlkZSwgICAgICAgNQorICAgIGxvYWRfYXJnICAgIGNfc3RyaWRlLCAgICAgICA2CisgICAgbG9hZF9hcmcgICAgc3JjX3N0cmlkZSwgICAgIDcKKyAgICBsb2FkX2FyZyAgICBjb2VmZl90YWJsZSwgICAgOAorCisgICAgXGluaXQgICAgICAgY29lZmZfdGFibGUKKworICAgIHN1YiAgICAgICAgIHlfcGFkZGluZywgICAgICB5X3N0cmlkZSwgICAgICAgd2lkdGgKKyAgICBzdWIgICAgICAgICBjX3BhZGRpbmcsICAgICAgY19zdHJpZGUsICAgICAgIHdpZHRoCisgICAgc3ViICAgICAgICAgc3JjX3BhZGRpbmcsICAgIHNyY19zdHJpZGUsICAgICB3aWR0aCwgTFNMICMyCisKKyAgICBhZGQgICAgICAgICB5MF9lbmQsICAgICAgICAgeTAsICAgICAgICAgICAgIHdpZHRoCisgICAgYW5kICAgICAgICAgaGVhZGVyLCAgICAgICAgIHdpZHRoLCAgICAgICAgICAjMTUKKworICAgIGFkZCAgICAgICAgIHkxLCAgICAgICAgICAgICB5MCwgICAgICAgICAgICAgeV9zdHJpZGUKKyAgICBhZGQgICAgICAgICBzcmMxLCAgICAgICAgICAgc3JjMCwgICAgICAgICAgIHNyY19zdHJpZGUKKworMDoKKyAgICBjbXAgICAgICAgICBoZWFkZXIsICAgICAjMAorICAgIGJlcSAgICAgICAgIDFmCisKKyAgICBca2VybmVsICAgICBcc19mbXQsIFxkX2ZtdCwgc3JjMCwgc3JjMSwgeTAsIHkxLCBjaHJvbWEsIGhlYWRlcgorCisxOgorICAgIFxrZXJuZWwgICAgIFxzX2ZtdCwgXGRfZm10LCBzcmMwLCBzcmMxLCB5MCwgeTEsIGNocm9tYQorCisgICAgY21wICAgICAgICAgeTAsICAgICAgICAgeTBfZW5kCisgICAgYmx0ICAgICAgICAgMWIKKzI6CisgICAgYWRkICAgICAgICAgeTAsICAgICAgICAgeTEsICAgICAgICAgeV9wYWRkaW5nCisgICAgYWRkICAgICAgICAgeTBfZW5kLCAgICAgeTEsICAgICAgICAgeV9zdHJpZGUKKyAgICBhZGQgICAgICAgICBjaHJvbWEsICAgICBjaHJvbWEsICAgICBjX3BhZGRpbmcKKyAgICBhZGQgICAgICAgICBzcmMwLCAgICAgICBzcmMxLCAgICAgICBzcmNfcGFkZGluZworCisgICAgYWRkICAgICAgICAgeTEsICAgICAgICAgeTAsICAgICAgICAgeV9zdHJpZGUKKyAgICBhZGQgICAgICAgICBzcmMxLCAgICAgICBzcmMwLCAgICAgICBzcmNfc3RyaWRlCisKKyAgICBzdWJzICAgICAgICBoZWlnaHQsICAgICBoZWlnaHQsICAgICAjMgorCisgICAgYmd0ICAgICAgICAgMGIKKworICAgIGVwaWxvZ3VlCisKKyAgICBhbGlhc19sb29wXzQyMHNwIDAKKworZW5kZnVuYworLmVuZG0KKworLm1hY3JvIGRvd25zYW1wbGUKKyAgICB2cGFkZGwudTggICByMTZ4OCwgIHI4eDE2CisgICAgdnBhZGRsLnU4ICAgZzE2eDgsICBnOHgxNgorICAgIHZwYWRkbC51OCAgIGIxNng4LCAgYjh4MTYKKy5lbmRtCisKKworLyogYWNjdWx1bWF0ZSBhbmQgcmlnaHQgc2hpZnQgYnkgMiAqLworLm1hY3JvIGRvd25zYW1wbGVfYXJzMgorICAgIHZwYWRhbC51OCAgIHIxNng4LCAgcjh4MTYKKyAgICB2cGFkYWwudTggICBnMTZ4OCwgIGc4eDE2CisgICAgdnBhZGFsLnU4ICAgYjE2eDgsICBiOHgxNgorCisgICAgdnJzaHIudTE2ICAgcjE2eDgsICByMTZ4OCwgICMyCisgICAgdnJzaHIudTE2ICAgZzE2eDgsICBnMTZ4OCwgICMyCisgICAgdnJzaHIudTE2ICAgYjE2eDgsICBiMTZ4OCwgICMyCisuZW5kbQorCisubWFjcm8gc3RvcmVfeThfMTZ4MSAgICAgICAgICAgIGRzdCwgY291bnQKKy5pZmMgIlxjb3VudCIsIiIKKyAgICB2c3RtaWEgICAgICBcZHN0ISwgIHt5OHgxNn0KKy5lbHNlCisgICAgdnN0bWlhICAgICAgXGRzdCwgICB7eTh4MTZ9CisgICAgYWRkICAgICAgICAgXGRzdCwgICBcZHN0LCAgICAgICAgICAgXGNvdW50CisuZW5kaWYKKy5lbmRtCisKKy5tYWNybyBzdG9yZV9jaHJvbWFfbnYxMl84eDEgICAgZHN0LCBjb3VudAorLmlmYyAiXGNvdW50IiwiIgorICAgIHZzdDIuaTggICAgIHt1OHg4LCB2OHg4fSwgICBbXGRzdF0hCisuZWxzZQorICAgIHZzdDIuaTggICAgIHt1OHg4LCB2OHg4fSwgICBbXGRzdF0sIFxjb3VudAorLmVuZGlmCisuZW5kbQorCisubWFjcm8gc3RvcmVfY2hyb21hX252MjFfOHgxICAgIGRzdCwgY291bnQKKy5pZmMgIlxjb3VudCIsIiIKKyAgICB2c3QyLmk4ICAgICB7djh4OCwgdTh4OH0sICAgW1xkc3RdIQorLmVsc2UKKyAgICB2c3QyLmk4ICAgICB7djh4OCwgdTh4OH0sICAgW1xkc3RdLCBcY291bnQKKy5lbmRpZgorLmVuZG0KKworLm1hY3JvIGxvYWRfODg4OF8xNngxICAgYSwgYiwgYywgZCwgc3JjLCBjb3VudAorLmlmYyAiXGNvdW50IiwiIgorICAgIHZsZDQuOCAgICAgIHtcYVwoKTh4MTZfbCwgXGJcKCk4eDE2X2wsIFxjXCgpOHgxNl9sLCBcZFwoKTh4MTZfbH0sICBbXHNyY10hCisgICAgdmxkNC44ICAgICAge1xhXCgpOHgxNl9oLCBcYlwoKTh4MTZfaCwgXGNcKCk4eDE2X2gsIFxkXCgpOHgxNl9ofSwgIFtcc3JjXSEKKy5lbHNlCisgICAgdmxkNC44ICAgICAge1xhXCgpOHgxNl9sLCBcYlwoKTh4MTZfbCwgXGNcKCk4eDE2X2wsIFxkXCgpOHgxNl9sfSwgIFtcc3JjXSEKKyAgICB2bGQ0LjggICAgICB7XGFcKCk4eDE2X2gsIFxiXCgpOHgxNl9oLCBcY1woKTh4MTZfaCwgXGRcKCk4eDE2X2h9LCAgW1xzcmNdCisgICAgc3ViICAgICAgICAgXHNyYywgICBcc3JjLCAgICMzMgorICAgIGFkZCAgICAgICAgIFxzcmMsICAgXHNyYywgICBcY291bnQsIExTTCAjMgorLmVuZGlmCisuZW5kbQorCisubWFjcm8gbG9hZF9yZ2J4XzE2eDEgICBzcmMsIGNvdW50CisgICAgbG9hZF84ODg4XzE2eDEgIHIsIGcsIGIsIHgsIFxzcmMsIFxjb3VudAorLmVuZG0KKworLm1hY3JvIGxvYWRfYmdyeF8xNngxICAgc3JjLCBjb3VudAorICAgIGxvYWRfODg4OF8xNngxICBiLCBnLCByLCB4LCBcc3JjLCBcY291bnQKKy5lbmRtCisKKy5tYWNybyBhbGlhc19zcmNfcmdieCAgIHNldD0xCisgICAgYWxpYXNfc3JjXzg4ODggIHIsIGcsIGIsIHgsIFxzZXQKKy5lbmRtCisKKy5tYWNybyBhbGlhc19zcmNfYmdyeCAgIHNldD0xCisgICAgYWxpYXNfc3JjXzg4ODggIGIsIGcsIHIsIHgsIFxzZXQKKy5lbmRtCisKKy5tYWNybyBhbGlhc19kc3RfbnYxMiAgIHNldD0xCisgICAgYWxpYXMgICB1OHg4LCBjOHg4eDJfbCwgXHNldAorICAgIGFsaWFzICAgdjh4OCwgYzh4OHgyX2gsIFxzZXQKKy5lbmRtCisKKy5tYWNybyBhbGlhc19kc3RfbnYyMSAgIHNldD0xCisgICAgYWxpYXMgICB2OHg4LCBjOHg4eDJfbCwgXHNldAorICAgIGFsaWFzICAgdTh4OCwgYzh4OHgyX2gsIFxzZXQKKy5lbmRtCisKKworLy8gY29tbW9uIGFsaWFzZXMKKworYWxpYXMgICBDT19SICAgIGQwCitDT19SWSAgIC5kbiAgICAgZDAuczE2WzBdCitDT19SVSAgIC5kbiAgICAgZDAuczE2WzFdCitDT19SViAgIC5kbiAgICAgZDAuczE2WzJdCisKK2FsaWFzICAgQ09fRyAgICBkMQorQ09fR1kgICAuZG4gICAgIGQxLnMxNlswXQorQ09fR1UgICAuZG4gICAgIGQxLnMxNlsxXQorQ09fR1YgICAuZG4gICAgIGQxLnMxNlsyXQorCithbGlhcyAgIENPX0IgICAgZDIKK0NPX0JZICAgLmRuICAgICBkMi5zMTZbMF0KK0NPX0JVICAgLmRuICAgICBkMi5zMTZbMV0KK0NPX0JWICAgLmRuICAgICBkMi5zMTZbMl0KKworYWxpYXMgICBCSUFTX1UsIGQzCithbGlhcyAgIEJJQVNfViwgQklBU19VCisKK2FsaWFzICAgQklBU19ZLCBxMgorCisKKy8qIHEzLXE2IFI4RzhCOFg4IHgxNiAqLworCisubWFjcm8gYWxpYXNfc3JjXzg4ODggICBhLCBiLCBjLCBkLCBzZXQKKyAgICBhbGlhc19xdyAgXGFcKCk4eDE2LCBxMywgXHNldAorICAgIGFsaWFzX3F3ICBcYlwoKTh4MTYsIHE0LCBcc2V0CisgICAgYWxpYXNfcXcgIFxjXCgpOHgxNiwgcTUsIFxzZXQKKyAgICBhbGlhc19xdyAgXGRcKCk4eDE2LCBxNiwgXHNldAorLmVuZG0KKworLm1hY3JvIGtlcm5lbF80MjBfMTZ4MiAgcmdiX2ZtdCwgeXV2X2ZtdCwgcmdiMCwgcmdiMSwgeTAsIHkxLCBjaHJvbWEsIGNvdW50CisgICAgYWxpYXNfc3JjX1xyZ2JfZm10CisgICAgYWxpYXNfZHN0X1x5dXZfZm10CisKKyAgICBsb2FkX1xyZ2JfZm10XCgpXzE2eDEgICBccmdiMCwgXGNvdW50CisKKyAgICBkb3duc2FtcGxlCisgICAgY29tcHV0ZV95XzE2eDEKKyAgICBzdG9yZV95OF8xNngxICAgXHkwLCBcY291bnQKKworCisgICAgbG9hZF9ccmdiX2ZtdFwoKV8xNngxICAgXHJnYjEsIFxjb3VudAorICAgIGRvd25zYW1wbGVfYXJzMgorICAgIGNvbXB1dGVfeV8xNngxCisgICAgc3RvcmVfeThfMTZ4MSAgIFx5MSwgXGNvdW50CisKKyAgICBjb21wdXRlX2Nocm9tYV84eDEgIHUsIFUKKyAgICBjb21wdXRlX2Nocm9tYV84eDEgIHYsIFYKKworICAgIHN0b3JlX2Nocm9tYV9ceXV2X2ZtdFwoKV84eDEgXGNocm9tYSwgXGNvdW50CisKKyAgICBhbGlhc19kc3RfXHl1dl9mbXQgMAorICAgIGFsaWFzX3NyY19ccmdiX2ZtdCAwCisuZW5kbQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvYXJtL3N3c2NhbGVfdW5zY2FsZWQuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL2FybS9zd3NjYWxlX3Vuc2NhbGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiZTc2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL2FybS9zd3NjYWxlX3Vuc2NhbGVkLmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBYaWFvbGVpIFl1IDxkcmVpZmFjaHN0ZWluQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZS5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisKK2V4dGVybiB2b2lkIHJnYnhfdG9fbnYxMl9uZW9uXzMyKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqeSwgdWludDhfdCAqY2hyb21hLAorICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCBjX3N0cmlkZSwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgaW50MzJfdCBjb2VmZl90YmxbOV0pOworCitleHRlcm4gdm9pZCByZ2J4X3RvX252MTJfbmVvbl8xNihjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKnksIHVpbnQ4X3QgKmNocm9tYSwKKyAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgY19zdHJpZGUsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgIGludDMyX3QgY29lZmZfdGJsWzldKTsKKworc3RhdGljIGludCByZ2J4X3RvX252MTJfbmVvbl8zMl93cmFwcGVyKFN3c0NvbnRleHQgKmNvbnRleHQsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkgeworCisgICAgcmdieF90b19udjEyX25lb25fMzIoc3JjWzBdICsgc3JjU2xpY2VZICogc3JjU3RyaWRlWzBdLAorICAgICAgICAgICAgZHN0WzBdICsgc3JjU2xpY2VZICogZHN0U3RyaWRlWzBdLAorICAgICAgICAgICAgZHN0WzFdICsgKHNyY1NsaWNlWSAvIDIpICogZHN0U3RyaWRlWzFdLAorICAgICAgICAgICAgY29udGV4dC0+c3JjVywgc3JjU2xpY2VILAorICAgICAgICAgICAgZHN0U3RyaWRlWzBdLCBkc3RTdHJpZGVbMV0sIHNyY1N0cmlkZVswXSwKKyAgICAgICAgICAgIGNvbnRleHQtPmlucHV0X3JnYjJ5dXZfdGFibGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmdieF90b19udjEyX25lb25fMTZfd3JhcHBlcihTd3NDb250ZXh0ICpjb250ZXh0LCBjb25zdCB1aW50OF90ICpzcmNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGVbXSwgaW50IHNyY1NsaWNlWSwgaW50IHNyY1NsaWNlSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0U3RyaWRlW10pIHsKKworICAgIHJnYnhfdG9fbnYxMl9uZW9uXzE2KHNyY1swXSArIHNyY1NsaWNlWSAqIHNyY1N0cmlkZVswXSwKKyAgICAgICAgICAgIGRzdFswXSArIHNyY1NsaWNlWSAqIGRzdFN0cmlkZVswXSwKKyAgICAgICAgICAgIGRzdFsxXSArIChzcmNTbGljZVkgLyAyKSAqIGRzdFN0cmlkZVsxXSwKKyAgICAgICAgICAgIGNvbnRleHQtPnNyY1csIHNyY1NsaWNlSCwKKyAgICAgICAgICAgIGRzdFN0cmlkZVswXSwgZHN0U3RyaWRlWzFdLCBzcmNTdHJpZGVbMF0sCisgICAgICAgICAgICBjb250ZXh0LT5pbnB1dF9yZ2IyeXV2X3RhYmxlKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZXRfdW5zY2FsZWRfc3dzY2FsZV9uZW9uKFN3c0NvbnRleHQgKmMpIHsKKyAgICBpbnQgYWNjdXJhdGVfcm5kID0gYy0+ZmxhZ3MgJiBTV1NfQUNDVVJBVEVfUk5EOworICAgIGlmIChjLT5zcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9SR0JBCisgICAgICAgICAgICAmJiBjLT5kc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9OVjEyCisgICAgICAgICAgICAmJiAoYy0+c3JjVyA+PSAxNikpIHsKKyAgICAgICAgYy0+c3dzY2FsZSA9IGFjY3VyYXRlX3JuZCA/IHJnYnhfdG9fbnYxMl9uZW9uXzMyX3dyYXBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIDogcmdieF90b19udjEyX25lb25fMTZfd3JhcHBlcjsKKyAgICB9Cit9CisKK3ZvaWQgZmZfZ2V0X3Vuc2NhbGVkX3N3c2NhbGVfYXJtKFN3c0NvbnRleHQgKmMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpCisgICAgICAgIGdldF91bnNjYWxlZF9zd3NjYWxlX25lb24oYyk7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS9iYXllcl90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYnN3c2NhbGUvYmF5ZXJfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2FiMmFlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvYmF5ZXJfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIEJheWVyLXRvLVJHQi9ZVjEyIHRlbXBsYXRlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBQZXRlciBSb3NzIDxwcm9zc0B4dmlkLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmIGRlZmluZWQoQkFZRVJfQkdHUikgfHwgZGVmaW5lZChCQVlFUl9HQlJHKQorI2RlZmluZSBCQVlFUl9SICAgICAgIDAKKyNkZWZpbmUgQkFZRVJfRyAgICAgICAxCisjZGVmaW5lIEJBWUVSX0IgICAgICAgMgorI2VuZGlmCisjaWYgZGVmaW5lZChCQVlFUl9SR0dCKSB8fCBkZWZpbmVkKEJBWUVSX0dSQkcpCisjZGVmaW5lIEJBWUVSX1IgICAgICAgMgorI2RlZmluZSBCQVlFUl9HICAgICAgIDEKKyNkZWZpbmUgQkFZRVJfQiAgICAgICAwCisjZW5kaWYKKworI2lmIGRlZmluZWQoQkFZRVJfOCkKKyNkZWZpbmUgQkFZRVJfUkVBRCh4KSAoeCkKKyNkZWZpbmUgQkFZRVJfU0laRU9GICAxCisjZGVmaW5lIEJBWUVSX1NISUZUICAgMAorI2VuZGlmCisjaWYgZGVmaW5lZChCQVlFUl8xNkxFKQorI2RlZmluZSBCQVlFUl9SRUFEKHgpIEFWX1JMMTYoJngpCisjZGVmaW5lIEJBWUVSX1NJWkVPRiAgMgorI2RlZmluZSBCQVlFUl9TSElGVCAgIDgKKyNlbmRpZgorI2lmIGRlZmluZWQoQkFZRVJfMTZCRSkKKyNkZWZpbmUgQkFZRVJfUkVBRCh4KSBBVl9SQjE2KCZ4KQorI2RlZmluZSBCQVlFUl9TSVpFT0YgIDIKKyNkZWZpbmUgQkFZRVJfU0hJRlQgICA4CisjZW5kaWYKKworI2RlZmluZSBTKHksIHgpIEJBWUVSX1JFQUQoc3JjWyh5KSpzcmNfc3RyaWRlICsgQkFZRVJfU0laRU9GKih4KV0pCisjZGVmaW5lIFQoeSwgeCkgKHVuc2lnbmVkIGludClTKHksIHgpCisjZGVmaW5lIFIoeSwgeCkgZHN0Wyh5KSpkc3Rfc3RyaWRlICsgKHgpKjMgKyBCQVlFUl9SXQorI2RlZmluZSBHKHksIHgpIGRzdFsoeSkqZHN0X3N0cmlkZSArICh4KSozICsgQkFZRVJfR10KKyNkZWZpbmUgQih5LCB4KSBkc3RbKHkpKmRzdF9zdHJpZGUgKyAoeCkqMyArIEJBWUVSX0JdCisKKyNpZiBkZWZpbmVkKEJBWUVSX0JHR1IpIHx8IGRlZmluZWQoQkFZRVJfUkdHQikKKyNkZWZpbmUgQkFZRVJfVE9fUkdCMjRfQ09QWSBcCisgICAgUigwLCAwKSA9IFwKKyAgICBSKDAsIDEpID0gXAorICAgIFIoMSwgMSkgPSBcCisgICAgUigxLCAwKSA9IFMoMSwgMSkgPj4gQkFZRVJfU0hJRlQ7IFwKKyAgICBcCisgICAgRygwLCAxKSA9IFMoMCwgMSkgPj4gQkFZRVJfU0hJRlQ7IFwKKyAgICBHKDAsIDApID0gXAorICAgIEcoMSwgMSkgPSAoVCgwLCAxKSArIFQoMSwgMCkpID4+ICgxICsgQkFZRVJfU0hJRlQpOyBcCisgICAgRygxLCAwKSA9IFMoMSwgMCkgPj4gQkFZRVJfU0hJRlQ7IFwKKyAgICBcCisgICAgQigxLCAxKSA9IFwKKyAgICBCKDAsIDApID0gXAorICAgIEIoMCwgMSkgPSBcCisgICAgQigxLCAwKSA9IFMoMCwgMCkgPj4gQkFZRVJfU0hJRlQ7CisjZGVmaW5lIEJBWUVSX1RPX1JHQjI0X0lOVEVSUE9MQVRFIFwKKyAgICBSKDAsIDApID0gKFQoLTEsIC0xKSArIFQoLTEsICAxKSArIFQoMSwgLTEpICsgVCgxLCAxKSkgPj4gKDIgKyBCQVlFUl9TSElGVCk7IFwKKyAgICBHKDAsIDApID0gKFQoLTEsICAwKSArIFQoIDAsIC0xKSArIFQoMCwgIDEpICsgVCgxLCAwKSkgPj4gKDIgKyBCQVlFUl9TSElGVCk7IFwKKyAgICBCKDAsIDApID0gIFMoMCwgMCkgPj4gQkFZRVJfU0hJRlQ7IFwKKyAgICBcCisgICAgUigwLCAxKSA9IChUKC0xLCAxKSArIFQoMSwgMSkpID4+ICgxICsgQkFZRVJfU0hJRlQpOyBcCisgICAgRygwLCAxKSA9ICBTKDAsICAxKSA+PiBCQVlFUl9TSElGVDsgXAorICAgIEIoMCwgMSkgPSAoVCgwLCAgMCkgKyBUKDAsIDIpKSA+PiAoMSArIEJBWUVSX1NISUZUKTsgXAorICAgIFwKKyAgICBSKDEsIDApID0gKFQoMSwgLTEpICsgVCgxLCAxKSkgPj4gKDEgKyBCQVlFUl9TSElGVCk7IFwKKyAgICBHKDEsIDApID0gIFMoMSwgIDApID4+IEJBWUVSX1NISUZUOyBcCisgICAgQigxLCAwKSA9IChUKDAsICAwKSArIFQoMiwgMCkpID4+ICgxICsgQkFZRVJfU0hJRlQpOyBcCisgICAgXAorICAgIFIoMSwgMSkgPSAgUygxLCAxKSA+PiBCQVlFUl9TSElGVDsgXAorICAgIEcoMSwgMSkgPSAoVCgwLCAxKSArIFQoMSwgMCkgKyBUKDEsIDIpICsgVCgyLCAxKSkgPj4gKDIgKyBCQVlFUl9TSElGVCk7IFwKKyAgICBCKDEsIDEpID0gKFQoMCwgMCkgKyBUKDAsIDIpICsgVCgyLCAwKSArIFQoMiwgMikpID4+ICgyICsgQkFZRVJfU0hJRlQpOworI2Vsc2UKKyNkZWZpbmUgQkFZRVJfVE9fUkdCMjRfQ09QWSBcCisgICAgUigwLCAwKSA9IFwKKyAgICBSKDAsIDEpID0gXAorICAgIFIoMSwgMSkgPSBcCisgICAgUigxLCAwKSA9IFMoMSwgMCkgPj4gQkFZRVJfU0hJRlQ7IFwKKyAgICBcCisgICAgRygwLCAwKSA9IFMoMCwgMCkgPj4gQkFZRVJfU0hJRlQ7IFwKKyAgICBHKDEsIDEpID0gUygxLCAxKSA+PiBCQVlFUl9TSElGVDsgXAorICAgIEcoMCwgMSkgPSBcCisgICAgRygxLCAwKSA9IChUKDAsIDApICsgVCgxLCAxKSkgPj4gKDEgKyBCQVlFUl9TSElGVCk7IFwKKyAgICBcCisgICAgQigxLCAxKSA9IFwKKyAgICBCKDAsIDApID0gXAorICAgIEIoMCwgMSkgPSBcCisgICAgQigxLCAwKSA9IFMoMCwgMSkgPj4gQkFZRVJfU0hJRlQ7CisjZGVmaW5lIEJBWUVSX1RPX1JHQjI0X0lOVEVSUE9MQVRFIFwKKyAgICBSKDAsIDApID0gKFQoLTEsIDApICsgVCgxLCAwKSkgPj4gKDEgKyBCQVlFUl9TSElGVCk7IFwKKyAgICBHKDAsIDApID0gIFMoMCwgMCkgPj4gQkFZRVJfU0hJRlQ7IFwKKyAgICBCKDAsIDApID0gKFQoMCwgLTEpICsgVCgwLCAxKSkgPj4gKDEgKyBCQVlFUl9TSElGVCk7IFwKKyAgICBcCisgICAgUigwLCAxKSA9IChUKC0xLCAwKSArIFQoLTEsIDIpICsgVCgxLCAwKSArIFQoMSwgMikpID4+ICgyICsgQkFZRVJfU0hJRlQpOyBcCisgICAgRygwLCAxKSA9IChUKC0xLCAxKSArIFQoMCwgIDApICsgVCgwLCAyKSArIFQoMSwgMSkpID4+ICgyICsgQkFZRVJfU0hJRlQpOyBcCisgICAgQigwLCAxKSA9ICBTKDAsIDEpID4+IEJBWUVSX1NISUZUOyBcCisgICAgXAorICAgIFIoMSwgMCkgPSAgUygxLCAwKSA+PiBCQVlFUl9TSElGVDsgXAorICAgIEcoMSwgMCkgPSAoVCgwLCAwKSAgKyBUKDEsIC0xKSArIFQoMSwgIDEpICsgVCgyLCAwKSkgPj4gKDIgKyBCQVlFUl9TSElGVCk7IFwKKyAgICBCKDEsIDApID0gKFQoMCwgLTEpICsgVCgwLCAgMSkgKyBUKDIsIC0xKSArIFQoMiwgMSkpID4+ICgyICsgQkFZRVJfU0hJRlQpOyBcCisgICAgXAorICAgIFIoMSwgMSkgPSAoVCgxLCAwKSArIFQoMSwgMikpID4+ICgxICsgQkFZRVJfU0hJRlQpOyBcCisgICAgRygxLCAxKSA9ICBTKDEsIDEpID4+IEJBWUVSX1NISUZUOyBcCisgICAgQigxLCAxKSA9IChUKDAsIDEpICsgVCgyLCAxKSkgPj4gKDEgKyBCQVlFUl9TSElGVCk7CisjZW5kaWYKKworLyoqCisgKiBpbnZva2UgZmZfcmdiMjR0b3l2MTIgZm9yIDJ4MiBwaXhlbHMKKyAqLworI2RlZmluZSByZ2IyNHRveXYxMl8yeDIoc3JjLCBkc3RZLCBkc3RVLCBkc3RWLCBsdW1hX3N0cmlkZSwgc3JjX3N0cmlkZSwgcmdiMnl1dikgXAorICAgIGZmX3JnYjI0dG95djEyKHNyYywgZHN0WSwgZHN0ViwgZHN0VSwgMiwgMiwgbHVtYV9zdHJpZGUsIDAsIHNyY19zdHJpZGUsIHJnYjJ5dXYpCisKK3N0YXRpYyB2b2lkIEJBWUVSX1JFTkFNRShyZ2IyNF9jb3B5KShjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc3RyaWRlLCB1aW50OF90ICpkc3QsIGludCBkc3Rfc3RyaWRlLCBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMCA7IGkgPCB3aWR0aDsgaSs9IDIpIHsKKyAgICAgICAgQkFZRVJfVE9fUkdCMjRfQ09QWQorICAgICAgICBzcmMgKz0gMiAqIEJBWUVSX1NJWkVPRjsKKyAgICAgICAgZHN0ICs9IDY7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBCQVlFUl9SRU5BTUUocmdiMjRfaW50ZXJwb2xhdGUpKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19zdHJpZGUsIHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaTsKKworICAgIEJBWUVSX1RPX1JHQjI0X0NPUFkKKyAgICBzcmMgKz0gMiAqIEJBWUVSX1NJWkVPRjsKKyAgICBkc3QgKz0gNjsKKworICAgIGZvciAoaSA9IDIgOyBpIDwgd2lkdGggLSAyOyBpKz0gMikgeworICAgICAgICBCQVlFUl9UT19SR0IyNF9JTlRFUlBPTEFURQorICAgICAgICBzcmMgKz0gMiAqIEJBWUVSX1NJWkVPRjsKKyAgICAgICAgZHN0ICs9IDY7CisgICAgfQorCisgICAgaWYgKHdpZHRoID4gMikgeworICAgICAgICBCQVlFUl9UT19SR0IyNF9DT1BZCisgICAgfQorfQorCitzdGF0aWMgdm9pZCBCQVlFUl9SRU5BTUUoeXYxMl9jb3B5KShjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc3RyaWRlLCB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCBpbnQgbHVtYV9zdHJpZGUsIGludCB3aWR0aCwgaW50MzJfdCAqcmdiMnl1dikKK3sKKyAgICB1aW50OF90IGRzdFsxMl07CisgICAgY29uc3QgaW50IGRzdF9zdHJpZGUgPSA2OworICAgIGludCBpOworICAgIGZvciAoaSA9IDAgOyBpIDwgd2lkdGg7IGkrPSAyKSB7CisgICAgICAgIEJBWUVSX1RPX1JHQjI0X0NPUFkKKyAgICAgICAgcmdiMjR0b3l2MTJfMngyKGRzdCwgZHN0WSwgZHN0VSwgZHN0ViwgbHVtYV9zdHJpZGUsIGRzdF9zdHJpZGUsIHJnYjJ5dXYpOworICAgICAgICBzcmMgICs9IDIgKiBCQVlFUl9TSVpFT0Y7CisgICAgICAgIGRzdFkgKz0gMjsKKyAgICAgICAgZHN0VSsrOworICAgICAgICBkc3RWKys7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBCQVlFUl9SRU5BTUUoeXYxMl9pbnRlcnBvbGF0ZSkoY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgaW50IGx1bWFfc3RyaWRlLCBpbnQgd2lkdGgsIGludDMyX3QgKnJnYjJ5dXYpCit7CisgICAgdWludDhfdCBkc3RbMTJdOworICAgIGNvbnN0IGludCBkc3Rfc3RyaWRlID0gNjsKKyAgICBpbnQgaTsKKworICAgIEJBWUVSX1RPX1JHQjI0X0NPUFkKKyAgICByZ2IyNHRveXYxMl8yeDIoZHN0LCBkc3RZLCBkc3RVLCBkc3RWLCBsdW1hX3N0cmlkZSwgZHN0X3N0cmlkZSwgcmdiMnl1dik7CisgICAgc3JjICArPSAyICogQkFZRVJfU0laRU9GOworICAgIGRzdFkgKz0gMjsKKyAgICBkc3RVKys7CisgICAgZHN0VisrOworCisgICAgZm9yIChpID0gMiA7IGkgPCB3aWR0aCAtIDI7IGkrPSAyKSB7CisgICAgICAgIEJBWUVSX1RPX1JHQjI0X0lOVEVSUE9MQVRFCisgICAgICAgIHJnYjI0dG95djEyXzJ4Mihkc3QsIGRzdFksIGRzdFUsIGRzdFYsIGx1bWFfc3RyaWRlLCBkc3Rfc3RyaWRlLCByZ2IyeXV2KTsKKyAgICAgICAgc3JjICArPSAyICogQkFZRVJfU0laRU9GOworICAgICAgICBkc3RZICs9IDI7CisgICAgICAgIGRzdFUrKzsKKyAgICAgICAgZHN0VisrOworICAgIH0KKworICAgIGlmICh3aWR0aCA+IDIpIHsKKyAgICAgICAgQkFZRVJfVE9fUkdCMjRfQ09QWQorICAgICAgICByZ2IyNHRveXYxMl8yeDIoZHN0LCBkc3RZLCBkc3RVLCBkc3RWLCBsdW1hX3N0cmlkZSwgZHN0X3N0cmlkZSwgcmdiMnl1dik7CisgICAgfQorfQorCisjdW5kZWYgUworI3VuZGVmIFQKKyN1bmRlZiBSCisjdW5kZWYgRworI3VuZGVmIEIKKyN1bmRlZiBCQVlFUl9UT19SR0IyNF9DT1BZCisjdW5kZWYgQkFZRVJfVE9fUkdCMjRfSU5URVJQT0xBVEUKKworI3VuZGVmIEJBWUVSX1JFTkFNRQorCisjdW5kZWYgQkFZRVJfUgorI3VuZGVmIEJBWUVSX0cKKyN1bmRlZiBCQVlFUl9CCisjdW5kZWYgQkFZRVJfUkVBRAorI3VuZGVmIEJBWUVSX1NJWkVPRgorI3VuZGVmIEJBWUVSX1NISUZUCisKKyNpZiBkZWZpbmVkKEJBWUVSX0JHR1IpCisjdW5kZWYgQkFZRVJfQkdHUgorI2VuZGlmCisjaWYgZGVmaW5lZChCQVlFUl9SR0dCKQorI3VuZGVmIEJBWUVSX1JHR0IKKyNlbmRpZgorI2lmIGRlZmluZWQoQkFZRVJfR0JSRykKKyN1bmRlZiBCQVlFUl9HQlJHCisjZW5kaWYKKyNpZiBkZWZpbmVkKEJBWUVSX0dSQkcpCisjdW5kZWYgQkFZRVJfR1JCRworI2VuZGlmCisjaWYgZGVmaW5lZChCQVlFUl84KQorI3VuZGVmIEJBWUVSXzgKKyNlbmRpZgorI2lmIGRlZmluZWQoQkFZRVJfMTZMRSkKKyN1bmRlZiBCQVlFUl8xNkxFCisjZW5kaWYKKyNpZiBkZWZpbmVkKEJBWUVSXzE2QkUpCisjdW5kZWYgQkFZRVJfMTZCRQorI2VuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS9jb2xvcnNwYWNlLXRlc3QuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL2NvbG9yc3BhY2UtdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYTkxNWIKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS9jb2xvcnNwYWNlLXRlc3QuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAgICAgIC8qIGZvciBtZW1zZXQoKSAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJzd3NjYWxlLmgiCisjaW5jbHVkZSAicmdiMnJnYi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2RlZmluZSBTSVpFICAgIDEwMDAKKyNkZWZpbmUgc3JjQnl0ZSAweDU1CisjZGVmaW5lIGRzdEJ5dGUgMHhCQgorCisjZGVmaW5lIEZVTkMocywgZCwgbikgeyBzLCBkLCAjbiwgbiB9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgaSwgZnVuY051bTsKKyAgICB1aW50OF90ICpzcmNCdWZmZXIgPSBhdl9tYWxsb2MoU0laRSk7CisgICAgdWludDhfdCAqZHN0QnVmZmVyID0gYXZfbWFsbG9jKFNJWkUpOworICAgIGludCBmYWlsZWROdW0gICAgICA9IDA7CisgICAgaW50IHBhc3NlZE51bSAgICAgID0gMDsKKworICAgIGlmICghc3JjQnVmZmVyIHx8ICFkc3RCdWZmZXIpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIm1lbW9yeSBjb3JydXB0aW9uIHRlc3QgLi4uXG4iKTsKKyAgICBzd3NfcmdiMnJnYl9pbml0KCk7CisKKyAgICBmb3IgKGZ1bmNOdW0gPSAwOyA7IGZ1bmNOdW0rKykgeworICAgICAgICBzdHJ1Y3QgZnVuY19pbmZvX3MgeworICAgICAgICAgICAgaW50IHNyY19icHA7CisgICAgICAgICAgICBpbnQgZHN0X2JwcDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgICAgICB2b2lkICgqZnVuYykoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7CisgICAgICAgIH0gZnVuY19pbmZvW10gPSB7CisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjEydG8xNSksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE1dG8xNiksCisgICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE1dG8yNCksCisgICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE1dG8zMiksCisgICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE2dG8yNCksCisgICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE2dG8zMiksCisgICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG8xNSksCisgICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG8xNiksCisgICAgICAgICAgICBGVU5DKDMsIDQsIHJnYjI0dG8zMiksCisgICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG8xNSksCisgICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG8xNiksCisgICAgICAgICAgICBGVU5DKDQsIDMsIHJnYjMydG8yNCksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE2dG8xNSksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjEydG9iZ3IxMiksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE1dG9iZ3IxNSksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE1dG9iZ3IxNiksCisgICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE1dG9iZ3IyNCksCisgICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE1dG9iZ3IzMiksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE2dG9iZ3IxNSksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE2dG9iZ3IxNiksCisgICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE2dG9iZ3IyNCksCisgICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE2dG9iZ3IzMiksCisgICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG9iZ3IxNSksCisgICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG9iZ3IxNiksCisgICAgICAgICAgICBGVU5DKDMsIDMsIHJnYjI0dG9iZ3IyNCksCisgICAgICAgICAgICBGVU5DKDMsIDQsIHJnYjI0dG9iZ3IzMiksCisgICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG9iZ3IxNSksCisgICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG9iZ3IxNiksCisgICAgICAgICAgICBGVU5DKDQsIDMsIHJnYjMydG9iZ3IyNCksCisgICAgICAgICAgICBGVU5DKDQsIDQsIHNodWZmbGVfYnl0ZXNfMjEwMyksIC8qIHJnYjMydG9iZ3IzMiAqLworICAgICAgICAgICAgRlVOQyg2LCA2LCByZ2I0OHRvYmdyNDhfbm9ic3dhcCksCisgICAgICAgICAgICBGVU5DKDYsIDYsIHJnYjQ4dG9iZ3I0OF9ic3dhcCksCisgICAgICAgICAgICBGVU5DKDgsIDYsIHJnYjY0dG80OF9ub2Jzd2FwKSwKKyAgICAgICAgICAgIEZVTkMoOCwgNiwgcmdiNjR0bzQ4X2Jzd2FwKSwKKyAgICAgICAgICAgIEZVTkMoOCwgNiwgcmdiNjR0b2JncjQ4X25vYnN3YXApLAorICAgICAgICAgICAgRlVOQyg4LCA2LCByZ2I2NHRvYmdyNDhfYnN3YXApLAorICAgICAgICAgICAgRlVOQygwLCAwLCBOVUxMKQorICAgICAgICB9OworICAgICAgICBpbnQgd2lkdGg7CisgICAgICAgIGludCBmYWlsZWQgPSAwOworICAgICAgICBpbnQgc3JjQnBwID0gMDsKKyAgICAgICAgaW50IGRzdEJwcCA9IDA7CisKKyAgICAgICAgaWYgKCFmdW5jX2luZm9bZnVuY051bV0uZnVuYykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIi4iKTsKKyAgICAgICAgbWVtc2V0KHNyY0J1ZmZlciwgc3JjQnl0ZSwgU0laRSk7CisKKyAgICAgICAgZm9yICh3aWR0aCA9IDYzOyB3aWR0aCA+IDA7IHdpZHRoLS0pIHsKKyAgICAgICAgICAgIGludCBkc3RPZmZzZXQ7CisgICAgICAgICAgICBmb3IgKGRzdE9mZnNldCA9IDEyODsgZHN0T2Zmc2V0IDwgMTk2OyBkc3RPZmZzZXQgKz0gNCkgeworICAgICAgICAgICAgICAgIGludCBzcmNPZmZzZXQ7CisgICAgICAgICAgICAgICAgbWVtc2V0KGRzdEJ1ZmZlciwgZHN0Qnl0ZSwgU0laRSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHNyY09mZnNldCA9IDEyODsgc3JjT2Zmc2V0IDwgMTk2OyBzcmNPZmZzZXQgKz0gNCkgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMgICAgID0gc3JjQnVmZmVyICsgc3JjT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QgICAgID0gZHN0QnVmZmVyICsgZHN0T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBmaWxsIHRoZSBzY3JlZW4gd2l0aCBzaGl0IC4uLgorICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgc3JjQnBwID0gZnVuY19pbmZvW2Z1bmNOdW1dLnNyY19icHA7CisgICAgICAgICAgICAgICAgICAgIGRzdEJwcCA9IGZ1bmNfaW5mb1tmdW5jTnVtXS5kc3RfYnBwOworICAgICAgICAgICAgICAgICAgICBuYW1lICAgPSBmdW5jX2luZm9bZnVuY051bV0ubmFtZTsKKworICAgICAgICAgICAgICAgICAgICBmdW5jX2luZm9bZnVuY051bV0uZnVuYyhzcmMsIGRzdCwgd2lkdGggKiBzcmNCcHApOworCisgICAgICAgICAgICAgICAgICAgIGlmICghc3JjQnBwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY0J1ZmZlcltpXSAhPSBzcmNCeXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjIGRhbWFnZWQgYXQgJWQgdzolZCBzcmM6JWQgZHN0OiVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB3aWR0aCwgc3JjT2Zmc2V0LCBkc3RPZmZzZXQsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdE9mZnNldDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHN0QnVmZmVyW2ldICE9IGRzdEJ5dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc3QgZGFtYWdlZCBhdCAlZCB3OiVkIHNyYzolZCBkc3Q6JWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHdpZHRoLCBzcmNPZmZzZXQsIGRzdE9mZnNldCwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBkc3RPZmZzZXQgKyB3aWR0aCAqIGRzdEJwcDsgaSA8IFNJWkU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzdEJ1ZmZlcltpXSAhPSBkc3RCeXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHN0IGRhbWFnZWQgYXQgJWQgdzolZCBzcmM6JWQgZHN0OiVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB3aWR0aCwgc3JjT2Zmc2V0LCBkc3RPZmZzZXQsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhaWxlZCkKKyAgICAgICAgICAgIGZhaWxlZE51bSsrOworICAgICAgICBlbHNlIGlmIChzcmNCcHApCisgICAgICAgICAgICBwYXNzZWROdW0rKzsKKyAgICB9CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICJcbiVkIGNvbnZlcnRlcnMgcGFzc2VkLCAlZCBjb252ZXJ0ZXJzIHJhbmRvbWx5IG92ZXJ3cm90ZSBtZW1vcnlcbiIsCisgICAgICAgICAgIHBhc3NlZE51bSwgZmFpbGVkTnVtKTsKKyAgICByZXR1cm4gZmFpbGVkTnVtOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvaHNjYWxlX2Zhc3RfYmlsaW5lYXIuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL2hzY2FsZV9mYXN0X2JpbGluZWFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkNjE3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL2hzY2FsZV9mYXN0X2JpbGluZWFyLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJzd3NjYWxlX2ludGVybmFsLmgiCisKK3ZvaWQgZmZfaHlzY2FsZV9mYXN0X2MoU3dzQ29udGV4dCAqYywgaW50MTZfdCAqZHN0LCBpbnQgZHN0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNXLCBpbnQgeEluYykKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBpbnQgeHBvcyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGRzdFdpZHRoOyBpKyspIHsKKyAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHh4ICAgICA9IHhwb3MgPj4gMTY7CisgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCB4YWxwaGEgPSAoeHBvcyAmIDB4RkZGRikgPj4gOTsKKyAgICAgICAgZHN0W2ldID0gKHNyY1t4eF0gPDwgNykgKyAoc3JjW3h4ICsgMV0gLSBzcmNbeHhdKSAqIHhhbHBoYTsKKyAgICAgICAgeHBvcyAgKz0geEluYzsKKyAgICB9CisgICAgZm9yIChpPWRzdFdpZHRoLTE7IChpKnhJbmMpPj4xNiA+PXNyY1ctMTsgaS0tKQorICAgICAgICBkc3RbaV0gPSBzcmNbc3JjVy0xXSoxMjg7Cit9CisKK3ZvaWQgZmZfaGNzY2FsZV9mYXN0X2MoU3dzQ29udGV4dCAqYywgaW50MTZfdCAqZHN0MSwgaW50MTZfdCAqZHN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RXaWR0aCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCBzcmNXLCBpbnQgeEluYykKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBpbnQgeHBvcyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGRzdFdpZHRoOyBpKyspIHsKKyAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHh4ICAgICA9IHhwb3MgPj4gMTY7CisgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCB4YWxwaGEgPSAoeHBvcyAmIDB4RkZGRikgPj4gOTsKKyAgICAgICAgZHN0MVtpXSA9IChzcmMxW3h4XSAqICh4YWxwaGEgXiAxMjcpICsgc3JjMVt4eCArIDFdICogeGFscGhhKTsKKyAgICAgICAgZHN0MltpXSA9IChzcmMyW3h4XSAqICh4YWxwaGEgXiAxMjcpICsgc3JjMlt4eCArIDFdICogeGFscGhhKTsKKyAgICAgICAgeHBvcyAgICs9IHhJbmM7CisgICAgfQorICAgIGZvciAoaT1kc3RXaWR0aC0xOyAoaSp4SW5jKT4+MTYgPj1zcmNXLTE7IGktLSkgeworICAgICAgICBkc3QxW2ldID0gc3JjMVtzcmNXLTFdKjEyODsKKyAgICAgICAgZHN0MltpXSA9IHNyYzJbc3JjVy0xXSoxMjg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvaW5wdXQuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL2lucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxNmYwZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL2lucHV0LmMKQEAgLTAsMCArMSwxMzgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMTIgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJyZ2IycmdiLmgiCisjaW5jbHVkZSAic3dzY2FsZS5oIgorI2luY2x1ZGUgInN3c2NhbGVfaW50ZXJuYWwuaCIKKworI2RlZmluZSBpbnB1dF9waXhlbChwb3MpIChpc0JFKG9yaWdpbikgPyBBVl9SQjE2KHBvcykgOiBBVl9STDE2KHBvcykpCisKKyNkZWZpbmUgciAoKG9yaWdpbiA9PSBBVl9QSVhfRk1UX0JHUjQ4QkUgfHwgb3JpZ2luID09IEFWX1BJWF9GTVRfQkdSNDhMRSB8fCBvcmlnaW4gPT0gQVZfUElYX0ZNVF9CR1JBNjRCRSB8fCBvcmlnaW4gPT0gQVZfUElYX0ZNVF9CR1JBNjRMRSkgPyBiX3IgOiByX2IpCisjZGVmaW5lIGIgKChvcmlnaW4gPT0gQVZfUElYX0ZNVF9CR1I0OEJFIHx8IG9yaWdpbiA9PSBBVl9QSVhfRk1UX0JHUjQ4TEUgfHwgb3JpZ2luID09IEFWX1BJWF9GTVRfQkdSQTY0QkUgfHwgb3JpZ2luID09IEFWX1BJWF9GTVRfQkdSQTY0TEUpID8gcl9iIDogYl9yKQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkCityZ2I2NFRvWV9jX3RlbXBsYXRlKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IG9yaWdpbiwgaW50MzJfdCAqcmdiMnl1dikKK3sKKyAgICBpbnQzMl90IHJ5ID0gcmdiMnl1dltSWV9JRFhdLCBneSA9IHJnYjJ5dXZbR1lfSURYXSwgYnkgPSByZ2IyeXV2W0JZX0lEWF07CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHJfYiA9IGlucHV0X3BpeGVsKCZzcmNbaSo0KzBdKTsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgZyA9IGlucHV0X3BpeGVsKCZzcmNbaSo0KzFdKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGJfciA9IGlucHV0X3BpeGVsKCZzcmNbaSo0KzJdKTsKKworICAgICAgICBkc3RbaV0gPSAocnkqciArIGd5KmcgKyBieSpiICsgKDB4MjAwMTw8KFJHQjJZVVZfU0hJRlQtMSkpKSA+PiBSR0IyWVVWX1NISUZUOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZAorcmdiNjRUb1VWX2NfdGVtcGxhdGUodWludDE2X3QgKmRzdFUsIHVpbnQxNl90ICpkc3RWLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgZW51bSBBVlBpeGVsRm9ybWF0IG9yaWdpbiwgaW50MzJfdCAqcmdiMnl1dikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQzMl90IHJ1ID0gcmdiMnl1dltSVV9JRFhdLCBndSA9IHJnYjJ5dXZbR1VfSURYXSwgYnUgPSByZ2IyeXV2W0JVX0lEWF07CisgICAgaW50MzJfdCBydiA9IHJnYjJ5dXZbUlZfSURYXSwgZ3YgPSByZ2IyeXV2W0dWX0lEWF0sIGJ2ID0gcmdiMnl1dltCVl9JRFhdOworICAgIGF2X2Fzc2VydDEoc3JjMT09c3JjMik7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgaW50IHJfYiA9IGlucHV0X3BpeGVsKCZzcmMxW2kqNCswXSk7CisgICAgICAgIGludCAgIGcgPSBpbnB1dF9waXhlbCgmc3JjMVtpKjQrMV0pOworICAgICAgICBpbnQgYl9yID0gaW5wdXRfcGl4ZWwoJnNyYzFbaSo0KzJdKTsKKworICAgICAgICBkc3RVW2ldID0gKHJ1KnIgKyBndSpnICsgYnUqYiArICgweDEwMDAxPDwoUkdCMllVVl9TSElGVC0xKSkpID4+IFJHQjJZVVZfU0hJRlQ7CisgICAgICAgIGRzdFZbaV0gPSAocnYqciArIGd2KmcgKyBidipiICsgKDB4MTAwMDE8PChSR0IyWVVWX1NISUZULTEpKSkgPj4gUkdCMllVVl9TSElGVDsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQKK3JnYjY0VG9VVl9oYWxmX2NfdGVtcGxhdGUodWludDE2X3QgKmRzdFUsIHVpbnQxNl90ICpkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgZW51bSBBVlBpeGVsRm9ybWF0IG9yaWdpbiwgaW50MzJfdCAqcmdiMnl1dikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQzMl90IHJ1ID0gcmdiMnl1dltSVV9JRFhdLCBndSA9IHJnYjJ5dXZbR1VfSURYXSwgYnUgPSByZ2IyeXV2W0JVX0lEWF07CisgICAgaW50MzJfdCBydiA9IHJnYjJ5dXZbUlZfSURYXSwgZ3YgPSByZ2IyeXV2W0dWX0lEWF0sIGJ2ID0gcmdiMnl1dltCVl9JRFhdOworICAgIGF2X2Fzc2VydDEoc3JjMT09c3JjMik7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgaW50IHJfYiA9IChpbnB1dF9waXhlbCgmc3JjMVs4ICogaSArIDBdKSArIGlucHV0X3BpeGVsKCZzcmMxWzggKiBpICsgNF0pICsgMSkgPj4gMTsKKyAgICAgICAgaW50ICAgZyA9IChpbnB1dF9waXhlbCgmc3JjMVs4ICogaSArIDFdKSArIGlucHV0X3BpeGVsKCZzcmMxWzggKiBpICsgNV0pICsgMSkgPj4gMTsKKyAgICAgICAgaW50IGJfciA9IChpbnB1dF9waXhlbCgmc3JjMVs4ICogaSArIDJdKSArIGlucHV0X3BpeGVsKCZzcmMxWzggKiBpICsgNl0pICsgMSkgPj4gMTsKKworICAgICAgICBkc3RVW2ldPSAocnUqciArIGd1KmcgKyBidSpiICsgKDB4MTAwMDE8PChSR0IyWVVWX1NISUZULTEpKSkgPj4gUkdCMllVVl9TSElGVDsKKyAgICAgICAgZHN0VltpXT0gKHJ2KnIgKyBndipnICsgYnYqYiArICgweDEwMDAxPDwoUkdCMllVVl9TSElGVC0xKSkpID4+IFJHQjJZVVZfU0hJRlQ7CisgICAgfQorfQorCisjZGVmaW5lIHJnYjY0ZnVuY3MocGF0dGVybiwgQkVfTEUsIG9yaWdpbikgXAorc3RhdGljIHZvaWQgcGF0dGVybiAjIyA2NCAjIyBCRV9MRSAjIyBUb1lfYyh1aW50OF90ICpfZHN0LCBjb25zdCB1aW50OF90ICpfc3JjLCBjb25zdCB1aW50OF90ICp1bnVzZWQwLCBjb25zdCB1aW50OF90ICp1bnVzZWQxLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgdWludDMyX3QgKnJnYjJ5dXYpIFwKK3sgXAorICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgPSAoY29uc3QgdWludDE2X3QgKikgX3NyYzsgXAorICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKikgX2RzdDsgXAorICAgIHJnYjY0VG9ZX2NfdGVtcGxhdGUoZHN0LCBzcmMsIHdpZHRoLCBvcmlnaW4sIHJnYjJ5dXYpOyBcCit9IFwKKyBcCitzdGF0aWMgdm9pZCBwYXR0ZXJuICMjIDY0ICMjIEJFX0xFICMjIFRvVVZfYyh1aW50OF90ICpfZHN0VSwgdWludDhfdCAqX2RzdFYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDAsIGNvbnN0IHVpbnQ4X3QgKl9zcmMxLCBjb25zdCB1aW50OF90ICpfc3JjMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCB1aW50MzJfdCAqcmdiMnl1dikgXAoreyBcCisgICAgY29uc3QgdWludDE2X3QgKnNyYzEgPSAoY29uc3QgdWludDE2X3QgKikgX3NyYzEsIFwKKyAgICAgICAgICAgICAgICAgICAqc3JjMiA9IChjb25zdCB1aW50MTZfdCAqKSBfc3JjMjsgXAorICAgIHVpbnQxNl90ICpkc3RVID0gKHVpbnQxNl90ICopIF9kc3RVLCAqZHN0ViA9ICh1aW50MTZfdCAqKSBfZHN0VjsgXAorICAgIHJnYjY0VG9VVl9jX3RlbXBsYXRlKGRzdFUsIGRzdFYsIHNyYzEsIHNyYzIsIHdpZHRoLCBvcmlnaW4sIHJnYjJ5dXYpOyBcCit9IFwKKyBcCitzdGF0aWMgdm9pZCBwYXR0ZXJuICMjIDY0ICMjIEJFX0xFICMjIFRvVVZfaGFsZl9jKHVpbnQ4X3QgKl9kc3RVLCB1aW50OF90ICpfZHN0ViwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdW51c2VkMCwgY29uc3QgdWludDhfdCAqX3NyYzEsIGNvbnN0IHVpbnQ4X3QgKl9zcmMyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIHVpbnQzMl90ICpyZ2IyeXV2KSBcCit7IFwKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjMSA9IChjb25zdCB1aW50MTZfdCAqKSBfc3JjMSwgXAorICAgICAgICAgICAgICAgICAgICpzcmMyID0gKGNvbnN0IHVpbnQxNl90ICopIF9zcmMyOyBcCisgICAgdWludDE2X3QgKmRzdFUgPSAodWludDE2X3QgKikgX2RzdFUsICpkc3RWID0gKHVpbnQxNl90ICopIF9kc3RWOyBcCisgICAgcmdiNjRUb1VWX2hhbGZfY190ZW1wbGF0ZShkc3RVLCBkc3RWLCBzcmMxLCBzcmMyLCB3aWR0aCwgb3JpZ2luLCByZ2IyeXV2KTsgXAorfQorCityZ2I2NGZ1bmNzKHJnYiwgTEUsIEFWX1BJWF9GTVRfUkdCQTY0TEUpCityZ2I2NGZ1bmNzKHJnYiwgQkUsIEFWX1BJWF9GTVRfUkdCQTY0QkUpCityZ2I2NGZ1bmNzKGJnciwgTEUsIEFWX1BJWF9GTVRfQkdSQTY0TEUpCityZ2I2NGZ1bmNzKGJnciwgQkUsIEFWX1BJWF9GTVRfQkdSQTY0QkUpCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcmdiNDhUb1lfY190ZW1wbGF0ZSh1aW50MTZfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnJnYjJ5dXYpCit7CisgICAgaW50MzJfdCByeSA9IHJnYjJ5dXZbUllfSURYXSwgZ3kgPSByZ2IyeXV2W0dZX0lEWF0sIGJ5ID0gcmdiMnl1dltCWV9JRFhdOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGludCByX2IgPSBpbnB1dF9waXhlbCgmc3JjW2kgKiAzICsgMF0pOworICAgICAgICB1bnNpZ25lZCBpbnQgZyAgID0gaW5wdXRfcGl4ZWwoJnNyY1tpICogMyArIDFdKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGJfciA9IGlucHV0X3BpeGVsKCZzcmNbaSAqIDMgKyAyXSk7CisKKyAgICAgICAgZHN0W2ldID0gKHJ5KnIgKyBneSpnICsgYnkqYiArICgweDIwMDEgPDwgKFJHQjJZVVZfU0hJRlQgLSAxKSkpID4+IFJHQjJZVVZfU0hJRlQ7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHJnYjQ4VG9VVl9jX3RlbXBsYXRlKHVpbnQxNl90ICpkc3RVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnJnYjJ5dXYpCit7CisgICAgaW50IGk7CisgICAgaW50MzJfdCBydSA9IHJnYjJ5dXZbUlVfSURYXSwgZ3UgPSByZ2IyeXV2W0dVX0lEWF0sIGJ1ID0gcmdiMnl1dltCVV9JRFhdOworICAgIGludDMyX3QgcnYgPSByZ2IyeXV2W1JWX0lEWF0sIGd2ID0gcmdiMnl1dltHVl9JRFhdLCBidiA9IHJnYjJ5dXZbQlZfSURYXTsKKyAgICBhdl9hc3NlcnQxKHNyYzEgPT0gc3JjMik7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgaW50IHJfYiA9IGlucHV0X3BpeGVsKCZzcmMxW2kgKiAzICsgMF0pOworICAgICAgICBpbnQgZyAgID0gaW5wdXRfcGl4ZWwoJnNyYzFbaSAqIDMgKyAxXSk7CisgICAgICAgIGludCBiX3IgPSBpbnB1dF9waXhlbCgmc3JjMVtpICogMyArIDJdKTsKKworICAgICAgICBkc3RVW2ldID0gKHJ1KnIgKyBndSpnICsgYnUqYiArICgweDEwMDAxIDw8IChSR0IyWVVWX1NISUZUIC0gMSkpKSA+PiBSR0IyWVVWX1NISUZUOworICAgICAgICBkc3RWW2ldID0gKHJ2KnIgKyBndipnICsgYnYqYiArICgweDEwMDAxIDw8IChSR0IyWVVWX1NISUZUIC0gMSkpKSA+PiBSR0IyWVVWX1NISUZUOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCByZ2I0OFRvVVZfaGFsZl9jX3RlbXBsYXRlKHVpbnQxNl90ICpkc3RVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnJnYjJ5dXYpCit7CisgICAgaW50IGk7CisgICAgaW50MzJfdCBydSA9IHJnYjJ5dXZbUlVfSURYXSwgZ3UgPSByZ2IyeXV2W0dVX0lEWF0sIGJ1ID0gcmdiMnl1dltCVV9JRFhdOworICAgIGludDMyX3QgcnYgPSByZ2IyeXV2W1JWX0lEWF0sIGd2ID0gcmdiMnl1dltHVl9JRFhdLCBidiA9IHJnYjJ5dXZbQlZfSURYXTsKKyAgICBhdl9hc3NlcnQxKHNyYzEgPT0gc3JjMik7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgaW50IHJfYiA9IChpbnB1dF9waXhlbCgmc3JjMVs2ICogaSArIDBdKSArCisgICAgICAgICAgICAgICAgICAgaW5wdXRfcGl4ZWwoJnNyYzFbNiAqIGkgKyAzXSkgKyAxKSA+PiAxOworICAgICAgICBpbnQgZyAgID0gKGlucHV0X3BpeGVsKCZzcmMxWzYgKiBpICsgMV0pICsKKyAgICAgICAgICAgICAgICAgICBpbnB1dF9waXhlbCgmc3JjMVs2ICogaSArIDRdKSArIDEpID4+IDE7CisgICAgICAgIGludCBiX3IgPSAoaW5wdXRfcGl4ZWwoJnNyYzFbNiAqIGkgKyAyXSkgKworICAgICAgICAgICAgICAgICAgIGlucHV0X3BpeGVsKCZzcmMxWzYgKiBpICsgNV0pICsgMSkgPj4gMTsKKworICAgICAgICBkc3RVW2ldID0gKHJ1KnIgKyBndSpnICsgYnUqYiArICgweDEwMDAxIDw8IChSR0IyWVVWX1NISUZUIC0gMSkpKSA+PiBSR0IyWVVWX1NISUZUOworICAgICAgICBkc3RWW2ldID0gKHJ2KnIgKyBndipnICsgYnYqYiArICgweDEwMDAxIDw8IChSR0IyWVVWX1NISUZUIC0gMSkpKSA+PiBSR0IyWVVWX1NISUZUOworICAgIH0KK30KKworI3VuZGVmIHIKKyN1bmRlZiBiCisjdW5kZWYgaW5wdXRfcGl4ZWwKKworI2RlZmluZSByZ2I0OGZ1bmNzKHBhdHRlcm4sIEJFX0xFLCBvcmlnaW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgcGF0dGVybiAjIyA0OCAjIyBCRV9MRSAjIyBUb1lfYyh1aW50OF90ICpfZHN0LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpfc3JjLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp1bnVzZWQwLCBjb25zdCB1aW50OF90ICp1bnVzZWQxLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJnYjJ5dXYpICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKGNvbnN0IHVpbnQxNl90ICopX3NyYzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCAqZHN0ICAgICAgID0gKHVpbnQxNl90ICopX2RzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZ2I0OFRvWV9jX3RlbXBsYXRlKGRzdCwgc3JjLCB3aWR0aCwgb3JpZ2luLCByZ2IyeXV2KTsgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHBhdHRlcm4gIyMgNDggIyMgQkVfTEUgIyMgVG9VVl9jKHVpbnQ4X3QgKl9kc3RVLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9kc3RWLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDAsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKl9zcmMxLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKl9zcmMyLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZ2IyeXV2KSAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjMSA9IChjb25zdCB1aW50MTZfdCAqKV9zcmMxLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAqc3JjMiA9IChjb25zdCB1aW50MTZfdCAqKV9zcmMyOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCAqZHN0VSA9ICh1aW50MTZfdCAqKV9kc3RVLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAqZHN0ViA9ICh1aW50MTZfdCAqKV9kc3RWOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZ2I0OFRvVVZfY190ZW1wbGF0ZShkc3RVLCBkc3RWLCBzcmMxLCBzcmMyLCB3aWR0aCwgb3JpZ2luLCByZ2IyeXV2KTsgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHBhdHRlcm4gIyMgNDggIyMgQkVfTEUgIyMgVG9VVl9oYWxmX2ModWludDhfdCAqX2RzdFUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX2RzdFYsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdW51c2VkMCwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpfc3JjMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpfc3JjMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmdiMnl1dikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQxNl90ICpzcmMxID0gKGNvbnN0IHVpbnQxNl90ICopX3NyYzEsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICpzcmMyID0gKGNvbnN0IHVpbnQxNl90ICopX3NyYzI7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90ICpkc3RVID0gKHVpbnQxNl90ICopX2RzdFUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICpkc3RWID0gKHVpbnQxNl90ICopX2RzdFY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJnYjQ4VG9VVl9oYWxmX2NfdGVtcGxhdGUoZHN0VSwgZHN0Viwgc3JjMSwgc3JjMiwgd2lkdGgsIG9yaWdpbiwgcmdiMnl1dik7ICAgXAorfQorCityZ2I0OGZ1bmNzKHJnYiwgTEUsIEFWX1BJWF9GTVRfUkdCNDhMRSkKK3JnYjQ4ZnVuY3MocmdiLCBCRSwgQVZfUElYX0ZNVF9SR0I0OEJFKQorcmdiNDhmdW5jcyhiZ3IsIExFLCBBVl9QSVhfRk1UX0JHUjQ4TEUpCityZ2I0OGZ1bmNzKGJnciwgQkUsIEFWX1BJWF9GTVRfQkdSNDhCRSkKKworI2RlZmluZSBpbnB1dF9waXhlbChpKSAoKG9yaWdpbiA9PSBBVl9QSVhfRk1UX1JHQkEgfHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbiA9PSBBVl9QSVhfRk1UX0JHUkEgfHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbiA9PSBBVl9QSVhfRk1UX0FSR0IgfHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbiA9PSBBVl9QSVhfRk1UX0FCR1IpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgPyBBVl9STjMyQSgmc3JjWyhpKSAqIDRdKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgOiAoaXNCRShvcmlnaW4pID8gQVZfUkIxNigmc3JjWyhpKSAqIDJdKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZfUkwxNigmc3JjWyhpKSAqIDJdKSkpCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcmdiMTZfMzJUb1lfY190ZW1wbGF0ZShpbnQxNl90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaHIsIGludCBzaGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoYiwgaW50IHNocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza3IsIGludCBtYXNrZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza2IsIGludCByc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdzaCwgaW50IGJzaCwgaW50IFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqcmdiMnl1dikKK3sKKyAgICBjb25zdCBpbnQgcnkgICAgICAgPSByZ2IyeXV2W1JZX0lEWF08PHJzaCwgZ3kgPSByZ2IyeXV2W0dZX0lEWF08PGdzaCwgYnkgPSByZ2IyeXV2W0JZX0lEWF08PGJzaDsKKyAgICBjb25zdCB1bnNpZ25lZCBybmQgPSAoMzI8PCgoUyktMSkpICsgKDE8PChTLTcpKTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIGludCBweCA9IGlucHV0X3BpeGVsKGkpID4+IHNocDsKKyAgICAgICAgaW50IGIgID0gKHB4ICYgbWFza2IpID4+IHNoYjsKKyAgICAgICAgaW50IGcgID0gKHB4ICYgbWFza2cpID4+IHNoZzsKKyAgICAgICAgaW50IHIgID0gKHB4ICYgbWFza3IpID4+IHNocjsKKworICAgICAgICBkc3RbaV0gPSAocnkgKiByICsgZ3kgKiBnICsgYnkgKiBiICsgcm5kKSA+PiAoKFMpLTYpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCByZ2IxNl8zMlRvVVZfY190ZW1wbGF0ZShpbnQxNl90ICpkc3RVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNociwgaW50IHNoZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoYiwgaW50IHNocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tyLCBpbnQgbWFza2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrYiwgaW50IHJzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdzaCwgaW50IGJzaCwgaW50IFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnJnYjJ5dXYpCit7CisgICAgY29uc3QgaW50IHJ1ICAgICAgID0gcmdiMnl1dltSVV9JRFhdIDw8IHJzaCwgZ3UgPSByZ2IyeXV2W0dVX0lEWF0gPDwgZ3NoLCBidSA9IHJnYjJ5dXZbQlVfSURYXSA8PCBic2gsCisgICAgICAgICAgICAgIHJ2ICAgICAgID0gcmdiMnl1dltSVl9JRFhdIDw8IHJzaCwgZ3YgPSByZ2IyeXV2W0dWX0lEWF0gPDwgZ3NoLCBidiA9IHJnYjJ5dXZbQlZfSURYXSA8PCBic2g7CisgICAgY29uc3QgdW5zaWduZWQgcm5kID0gKDI1NnU8PCgoUyktMSkpICsgKDE8PChTLTcpKTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIGludCBweCA9IGlucHV0X3BpeGVsKGkpID4+IHNocDsKKyAgICAgICAgaW50IGIgID0gKHB4ICYgbWFza2IpICAgPj4gc2hiOworICAgICAgICBpbnQgZyAgPSAocHggJiBtYXNrZykgICA+PiBzaGc7CisgICAgICAgIGludCByICA9IChweCAmIG1hc2tyKSAgID4+IHNocjsKKworICAgICAgICBkc3RVW2ldID0gKHJ1ICogciArIGd1ICogZyArIGJ1ICogYiArIHJuZCkgPj4gKChTKS02KTsKKyAgICAgICAgZHN0VltpXSA9IChydiAqIHIgKyBndiAqIGcgKyBidiAqIGIgKyBybmQpID4+ICgoUyktNik7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHJnYjE2XzMyVG9VVl9oYWxmX2NfdGVtcGxhdGUoaW50MTZfdCAqZHN0VSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hyLCBpbnQgc2hnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGIsIGludCBzaHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tyLCBpbnQgbWFza2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tiLCBpbnQgcnNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnc2gsIGludCBic2gsIGludCBTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnJnYjJ5dXYpCit7CisgICAgY29uc3QgaW50IHJ1ICAgICAgID0gcmdiMnl1dltSVV9JRFhdIDw8IHJzaCwgZ3UgPSByZ2IyeXV2W0dVX0lEWF0gPDwgZ3NoLCBidSA9IHJnYjJ5dXZbQlVfSURYXSA8PCBic2gsCisgICAgICAgICAgICAgIHJ2ICAgICAgID0gcmdiMnl1dltSVl9JRFhdIDw8IHJzaCwgZ3YgPSByZ2IyeXV2W0dWX0lEWF0gPDwgZ3NoLCBidiA9IHJnYjJ5dXZbQlZfSURYXSA8PCBic2gsCisgICAgICAgICAgICAgIG1hc2tneCAgID0gfihtYXNrciB8IG1hc2tiKTsKKyAgICBjb25zdCB1bnNpZ25lZCBybmQgPSAoMjU2VTw8KFMpKSArICgxPDwoUy02KSk7CisgICAgaW50IGk7CisKKyAgICBtYXNrciB8PSBtYXNrciA8PCAxOworICAgIG1hc2tiIHw9IG1hc2tiIDw8IDE7CisgICAgbWFza2cgfD0gbWFza2cgPDwgMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBweDAgPSBpbnB1dF9waXhlbCgyICogaSArIDApID4+IHNocDsKKyAgICAgICAgdW5zaWduZWQgcHgxID0gaW5wdXRfcGl4ZWwoMiAqIGkgKyAxKSA+PiBzaHA7CisgICAgICAgIGludCBiLCByLCBnID0gKHB4MCAmIG1hc2tneCkgKyAocHgxICYgbWFza2d4KTsKKyAgICAgICAgaW50IHJiID0gcHgwICsgcHgxIC0gZzsKKworICAgICAgICBiID0gKHJiICYgbWFza2IpID4+IHNoYjsKKyAgICAgICAgaWYgKHNocCB8fAorICAgICAgICAgICAgb3JpZ2luID09IEFWX1BJWF9GTVRfQkdSNTY1TEUgfHwgb3JpZ2luID09IEFWX1BJWF9GTVRfQkdSNTY1QkUgfHwKKyAgICAgICAgICAgIG9yaWdpbiA9PSBBVl9QSVhfRk1UX1JHQjU2NUxFIHx8IG9yaWdpbiA9PSBBVl9QSVhfRk1UX1JHQjU2NUJFKSB7CisgICAgICAgICAgICBnID4+PSBzaGc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnID0gKGcgJiBtYXNrZykgPj4gc2hnOworICAgICAgICB9CisgICAgICAgIHIgPSAocmIgJiBtYXNrcikgPj4gc2hyOworCisgICAgICAgIGRzdFVbaV0gPSAocnUgKiByICsgZ3UgKiBnICsgYnUgKiBiICsgKHVuc2lnbmVkKXJuZCkgPj4gKChTKS02KzEpOworICAgICAgICBkc3RWW2ldID0gKHJ2ICogciArIGd2ICogZyArIGJ2ICogYiArICh1bnNpZ25lZClybmQpID4+ICgoUyktNisxKTsKKyAgICB9Cit9CisKKyN1bmRlZiBpbnB1dF9waXhlbAorCisjZGVmaW5lIHJnYjE2XzMyX3dyYXBwZXIoZm10LCBuYW1lLCBzaHIsIHNoZywgc2hiLCBzaHAsIG1hc2tyLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2csIG1hc2tiLCByc2gsIGdzaCwgYnNoLCBTKSAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBuYW1lICMjIFRvWV9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp1bnVzZWQxLCBjb25zdCB1aW50OF90ICp1bnVzZWQyLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCB1aW50MzJfdCAqdGFiKSAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZ2IxNl8zMlRvWV9jX3RlbXBsYXRlKChpbnQxNl90Kilkc3QsIHNyYywgd2lkdGgsIGZtdCwgc2hyLCBzaGcsIHNoYiwgc2hwLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrciwgbWFza2csIG1hc2tiLCByc2gsIGdzaCwgYnNoLCBTLCB0YWIpOyBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBuYW1lICMjIFRvVVZfYyh1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp1bnVzZWQwLCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKmR1bW15LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIHVpbnQzMl90ICp0YWIpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmdiMTZfMzJUb1VWX2NfdGVtcGxhdGUoKGludDE2X3QqKWRzdFUsIChpbnQxNl90Kilkc3RWLCBzcmMsIHdpZHRoLCBmbXQsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaHIsIHNoZywgc2hiLCBzaHAsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrciwgbWFza2csIG1hc2tiLCByc2gsIGdzaCwgYnNoLCBTLCB0YWIpO1wKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIG5hbWUgIyMgVG9VVl9oYWxmX2ModWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdW51c2VkMCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZHVtbXksICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCB1aW50MzJfdCAqdGFiKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZ2IxNl8zMlRvVVZfaGFsZl9jX3RlbXBsYXRlKChpbnQxNl90Kilkc3RVLCAoaW50MTZfdCopZHN0Viwgc3JjLCB3aWR0aCwgZm10LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hyLCBzaGcsIHNoYiwgc2hwLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza3IsIG1hc2tnLCBtYXNrYiwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNoLCBnc2gsIGJzaCwgUywgdGFiKTsgICAgICAgICAgICAgICAgXAorfQorCityZ2IxNl8zMl93cmFwcGVyKEFWX1BJWF9GTVRfQkdSMzIsICAgIGJncjMyLCAgMTYsIDAsICAwLCAwLCAweEZGMDAwMCwgMHhGRjAwLCAgIDB4MDBGRiwgIDgsIDAsICA4LCBSR0IyWVVWX1NISUZUICsgOCkKK3JnYjE2XzMyX3dyYXBwZXIoQVZfUElYX0ZNVF9CR1IzMl8xLCAgYmdyMzIxLCAxNiwgMCwgIDAsIDgsIDB4RkYwMDAwLCAweEZGMDAsICAgMHgwMEZGLCAgOCwgMCwgIDgsIFJHQjJZVVZfU0hJRlQgKyA4KQorcmdiMTZfMzJfd3JhcHBlcihBVl9QSVhfRk1UX1JHQjMyLCAgICByZ2IzMiwgICAwLCAwLCAxNiwgMCwgICAweDAwRkYsIDB4RkYwMCwgMHhGRjAwMDAsICA4LCAwLCAgOCwgUkdCMllVVl9TSElGVCArIDgpCityZ2IxNl8zMl93cmFwcGVyKEFWX1BJWF9GTVRfUkdCMzJfMSwgIHJnYjMyMSwgIDAsIDAsIDE2LCA4LCAgIDB4MDBGRiwgMHhGRjAwLCAweEZGMDAwMCwgIDgsIDAsICA4LCBSR0IyWVVWX1NISUZUICsgOCkKK3JnYjE2XzMyX3dyYXBwZXIoQVZfUElYX0ZNVF9CR1I1NjVMRSwgYmdyMTZsZSwgMCwgMCwgIDAsIDAsICAgMHgwMDFGLCAweDA3RTAsICAgMHhGODAwLCAxMSwgNSwgIDAsIFJHQjJZVVZfU0hJRlQgKyA4KQorcmdiMTZfMzJfd3JhcHBlcihBVl9QSVhfRk1UX0JHUjU1NUxFLCBiZ3IxNWxlLCAwLCAwLCAgMCwgMCwgICAweDAwMUYsIDB4MDNFMCwgICAweDdDMDAsIDEwLCA1LCAgMCwgUkdCMllVVl9TSElGVCArIDcpCityZ2IxNl8zMl93cmFwcGVyKEFWX1BJWF9GTVRfQkdSNDQ0TEUsIGJncjEybGUsIDAsIDAsICAwLCAwLCAgIDB4MDAwRiwgMHgwMEYwLCAgIDB4MEYwMCwgIDgsIDQsICAwLCBSR0IyWVVWX1NISUZUICsgNCkKK3JnYjE2XzMyX3dyYXBwZXIoQVZfUElYX0ZNVF9SR0I1NjVMRSwgcmdiMTZsZSwgMCwgMCwgIDAsIDAsICAgMHhGODAwLCAweDA3RTAsICAgMHgwMDFGLCAgMCwgNSwgMTEsIFJHQjJZVVZfU0hJRlQgKyA4KQorcmdiMTZfMzJfd3JhcHBlcihBVl9QSVhfRk1UX1JHQjU1NUxFLCByZ2IxNWxlLCAwLCAwLCAgMCwgMCwgICAweDdDMDAsIDB4MDNFMCwgICAweDAwMUYsICAwLCA1LCAxMCwgUkdCMllVVl9TSElGVCArIDcpCityZ2IxNl8zMl93cmFwcGVyKEFWX1BJWF9GTVRfUkdCNDQ0TEUsIHJnYjEybGUsIDAsIDAsICAwLCAwLCAgIDB4MEYwMCwgMHgwMEYwLCAgIDB4MDAwRiwgIDAsIDQsICA4LCBSR0IyWVVWX1NISUZUICsgNCkKK3JnYjE2XzMyX3dyYXBwZXIoQVZfUElYX0ZNVF9CR1I1NjVCRSwgYmdyMTZiZSwgMCwgMCwgIDAsIDAsICAgMHgwMDFGLCAweDA3RTAsICAgMHhGODAwLCAxMSwgNSwgIDAsIFJHQjJZVVZfU0hJRlQgKyA4KQorcmdiMTZfMzJfd3JhcHBlcihBVl9QSVhfRk1UX0JHUjU1NUJFLCBiZ3IxNWJlLCAwLCAwLCAgMCwgMCwgICAweDAwMUYsIDB4MDNFMCwgICAweDdDMDAsIDEwLCA1LCAgMCwgUkdCMllVVl9TSElGVCArIDcpCityZ2IxNl8zMl93cmFwcGVyKEFWX1BJWF9GTVRfQkdSNDQ0QkUsIGJncjEyYmUsIDAsIDAsICAwLCAwLCAgIDB4MDAwRiwgMHgwMEYwLCAgIDB4MEYwMCwgIDgsIDQsICAwLCBSR0IyWVVWX1NISUZUICsgNCkKK3JnYjE2XzMyX3dyYXBwZXIoQVZfUElYX0ZNVF9SR0I1NjVCRSwgcmdiMTZiZSwgMCwgMCwgIDAsIDAsICAgMHhGODAwLCAweDA3RTAsICAgMHgwMDFGLCAgMCwgNSwgMTEsIFJHQjJZVVZfU0hJRlQgKyA4KQorcmdiMTZfMzJfd3JhcHBlcihBVl9QSVhfRk1UX1JHQjU1NUJFLCByZ2IxNWJlLCAwLCAwLCAgMCwgMCwgICAweDdDMDAsIDB4MDNFMCwgICAweDAwMUYsICAwLCA1LCAxMCwgUkdCMllVVl9TSElGVCArIDcpCityZ2IxNl8zMl93cmFwcGVyKEFWX1BJWF9GTVRfUkdCNDQ0QkUsIHJnYjEyYmUsIDAsIDAsICAwLCAwLCAgIDB4MEYwMCwgMHgwMEYwLCAgIDB4MDAwRiwgIDAsIDQsICA4LCBSR0IyWVVWX1NISUZUICsgNCkKKworc3RhdGljIHZvaWQgZ2JyMjRwVG9VVl9oYWxmX2ModWludDhfdCAqX2RzdFUsIHVpbnQ4X3QgKl9kc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmdzcmMsIGNvbnN0IHVpbnQ4X3QgKmJzcmMsIGNvbnN0IHVpbnQ4X3QgKnJzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCB1aW50MzJfdCAqcmdiMnl1dikKK3sKKyAgICB1aW50MTZfdCAqZHN0VSA9ICh1aW50MTZfdCAqKV9kc3RVOworICAgIHVpbnQxNl90ICpkc3RWID0gKHVpbnQxNl90ICopX2RzdFY7CisgICAgaW50MzJfdCBydSA9IHJnYjJ5dXZbUlVfSURYXSwgZ3UgPSByZ2IyeXV2W0dVX0lEWF0sIGJ1ID0gcmdiMnl1dltCVV9JRFhdOworICAgIGludDMyX3QgcnYgPSByZ2IyeXV2W1JWX0lEWF0sIGd2ID0gcmdiMnl1dltHVl9JRFhdLCBidiA9IHJnYjJ5dXZbQlZfSURYXTsKKworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBnICAgPSBnc3JjWzIqaV0gKyBnc3JjWzIqaSsxXTsKKyAgICAgICAgdW5zaWduZWQgaW50IGIgICA9IGJzcmNbMippXSArIGJzcmNbMippKzFdOworICAgICAgICB1bnNpZ25lZCBpbnQgciAgID0gcnNyY1syKmldICsgcnNyY1syKmkrMV07CisKKyAgICAgICAgZHN0VVtpXSA9IChydSpyICsgZ3UqZyArIGJ1KmIgKyAoMHg0MDAxPDwoUkdCMllVVl9TSElGVC02KSkpID4+IChSR0IyWVVWX1NISUZULTYrMSk7CisgICAgICAgIGRzdFZbaV0gPSAocnYqciArIGd2KmcgKyBidipiICsgKDB4NDAwMTw8KFJHQjJZVVZfU0hJRlQtNikpKSA+PiAoUkdCMllVVl9TSElGVC02KzEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmdiYTY0VG9BX2ModWludDhfdCAqX2RzdCwgY29uc3QgdWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAqdW51c2VkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDIsIGludCB3aWR0aCwgdWludDMyX3QgKnVudXNlZCkKK3sKKyAgICBpbnQxNl90ICpkc3QgPSAoaW50MTZfdCAqKV9kc3Q7CisgICAgY29uc3QgdWludDE2X3QgKnNyYyA9IChjb25zdCB1aW50MTZfdCAqKV9zcmM7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIGRzdFtpXSA9IHNyY1s0ICogaSArIDNdOworfQorCitzdGF0aWMgdm9pZCBhYmdyVG9BX2ModWludDhfdCAqX2RzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp1bnVzZWQxLCBjb25zdCB1aW50OF90ICp1bnVzZWQyLCBpbnQgd2lkdGgsIHVpbnQzMl90ICp1bnVzZWQpCit7CisgICAgaW50MTZfdCAqZHN0ID0gKGludDE2X3QgKilfZHN0OworICAgIGludCBpOworICAgIGZvciAoaT0wOyBpPHdpZHRoOyBpKyspIHsKKyAgICAgICAgZHN0W2ldPSBzcmNbNCppXTw8NjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJnYmFUb0FfYyh1aW50OF90ICpfZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDEsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDIsIGludCB3aWR0aCwgdWludDMyX3QgKnVudXNlZCkKK3sKKyAgICBpbnQxNl90ICpkc3QgPSAoaW50MTZfdCAqKV9kc3Q7CisgICAgaW50IGk7CisgICAgZm9yIChpPTA7IGk8d2lkdGg7IGkrKykgeworICAgICAgICBkc3RbaV09IHNyY1s0KmkrM108PDY7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwYWxUb0FfYyh1aW50OF90ICpfZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDEsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDIsIGludCB3aWR0aCwgdWludDMyX3QgKnBhbCkKK3sKKyAgICBpbnQxNl90ICpkc3QgPSAoaW50MTZfdCAqKV9kc3Q7CisgICAgaW50IGk7CisgICAgZm9yIChpPTA7IGk8d2lkdGg7IGkrKykgeworICAgICAgICBpbnQgZD0gc3JjW2ldOworCisgICAgICAgIGRzdFtpXT0gKHBhbFtkXSA+PiAyNCk8PDY7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwYWxUb1lfYyh1aW50OF90ICpfZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDEsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDIsIGludCB3aWR0aCwgdWludDMyX3QgKnBhbCkKK3sKKyAgICBpbnQxNl90ICpkc3QgPSAoaW50MTZfdCAqKV9kc3Q7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgaW50IGQgPSBzcmNbaV07CisKKyAgICAgICAgZHN0W2ldID0gKHBhbFtkXSAmIDB4RkYpPDw2OworICAgIH0KK30KKworc3RhdGljIHZvaWQgcGFsVG9VVl9jKHVpbnQ4X3QgKl9kc3RVLCB1aW50OF90ICpfZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDAsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCB1aW50MzJfdCAqcGFsKQoreworICAgIHVpbnQxNl90ICpkc3RVID0gKHVpbnQxNl90ICopX2RzdFU7CisgICAgaW50MTZfdCAqZHN0ViA9IChpbnQxNl90ICopX2RzdFY7CisgICAgaW50IGk7CisgICAgYXZfYXNzZXJ0MShzcmMxID09IHNyYzIpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIGludCBwID0gcGFsW3NyYzFbaV1dOworCisgICAgICAgIGRzdFVbaV0gPSAodWludDhfdCkocD4+IDgpPDw2OworICAgICAgICBkc3RWW2ldID0gKHVpbnQ4X3QpKHA+PjE2KTw8NjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1vbm93aGl0ZTJZX2ModWludDhfdCAqX2RzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp1bnVzZWQxLCBjb25zdCB1aW50OF90ICp1bnVzZWQyLCAgaW50IHdpZHRoLCB1aW50MzJfdCAqdW51c2VkKQoreworICAgIGludDE2X3QgKmRzdCA9IChpbnQxNl90ICopX2RzdDsKKyAgICBpbnQgaSwgajsKKyAgICB3aWR0aCA9ICh3aWR0aCArIDcpID4+IDM7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgaW50IGQgPSB+c3JjW2ldOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgZHN0WzgqaStqXT0gKChkPj4oNy1qKSkmMSkgKiAxNjM4MzsKKyAgICB9CisgICAgaWYod2lkdGgmNyl7CisgICAgICAgIGludCBkPSB+c3JjW2ldOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgKHdpZHRoJjcpOyBqKyspCisgICAgICAgICAgICBkc3RbOCppK2pdPSAoKGQ+Pig3LWopKSYxKSAqIDE2MzgzOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbW9ub2JsYWNrMllfYyh1aW50OF90ICpfZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDEsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDIsICBpbnQgd2lkdGgsIHVpbnQzMl90ICp1bnVzZWQpCit7CisgICAgaW50MTZfdCAqZHN0ID0gKGludDE2X3QgKilfZHN0OworICAgIGludCBpLCBqOworICAgIHdpZHRoID0gKHdpZHRoICsgNykgPj4gMzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBpbnQgZCA9IHNyY1tpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgIGRzdFs4Kmkral09ICgoZD4+KDctaikpJjEpICogMTYzODM7CisgICAgfQorICAgIGlmKHdpZHRoJjcpeworICAgICAgICBpbnQgZCA9IHNyY1tpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8ICh3aWR0aCY3KTsgaisrKQorICAgICAgICAgICAgZHN0WzgqaStqXSA9ICgoZD4+KDctaikpJjEpICogMTYzODM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB5dXkyVG9ZX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDEsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDIsICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVudXNlZCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgZHN0W2ldID0gc3JjWzIgKiBpXTsKK30KKworc3RhdGljIHZvaWQgeXV5MlRvVVZfYyh1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCBjb25zdCB1aW50OF90ICp1bnVzZWQwLCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgd2lkdGgsIHVpbnQzMl90ICp1bnVzZWQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgZHN0VVtpXSA9IHNyYzFbNCAqIGkgKyAxXTsKKyAgICAgICAgZHN0VltpXSA9IHNyYzFbNCAqIGkgKyAzXTsKKyAgICB9CisgICAgYXZfYXNzZXJ0MShzcmMxID09IHNyYzIpOworfQorCitzdGF0aWMgdm9pZCB5dnkyVG9VVl9jKHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDAsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCB3aWR0aCwgdWludDMyX3QgKnVudXNlZCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBkc3RWW2ldID0gc3JjMVs0ICogaSArIDFdOworICAgICAgICBkc3RVW2ldID0gc3JjMVs0ICogaSArIDNdOworICAgIH0KKyAgICBhdl9hc3NlcnQxKHNyYzEgPT0gc3JjMik7Cit9CisKK3N0YXRpYyB2b2lkIGJzd2FwMTZZX2ModWludDhfdCAqX2RzdCwgY29uc3QgdWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAqdW51c2VkMSwgY29uc3QgdWludDhfdCAqdW51c2VkMiwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdW51c2VkKQoreworICAgIGludCBpOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgPSAoY29uc3QgdWludDE2X3QgKilfc3JjOworICAgIHVpbnQxNl90ICpkc3QgICAgICAgPSAodWludDE2X3QgKilfZHN0OworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorICAgICAgICBkc3RbaV0gPSBhdl9ic3dhcDE2KHNyY1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGJzd2FwMTZVVl9jKHVpbnQ4X3QgKl9kc3RVLCB1aW50OF90ICpfZHN0ViwgY29uc3QgdWludDhfdCAqdW51c2VkMCwgY29uc3QgdWludDhfdCAqX3NyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpfc3JjMiwgaW50IHdpZHRoLCB1aW50MzJfdCAqdW51c2VkKQoreworICAgIGludCBpOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmMxID0gKGNvbnN0IHVpbnQxNl90ICopX3NyYzEsCisgICAgKnNyYzIgICAgICAgICAgICAgICAgPSAoY29uc3QgdWludDE2X3QgKilfc3JjMjsKKyAgICB1aW50MTZfdCAqZHN0VSAgICAgICA9ICh1aW50MTZfdCAqKV9kc3RVLCAqZHN0ViA9ICh1aW50MTZfdCAqKV9kc3RWOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIGRzdFVbaV0gPSBhdl9ic3dhcDE2KHNyYzFbaV0pOworICAgICAgICBkc3RWW2ldID0gYXZfYnN3YXAxNihzcmMyW2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfeWExNmxlX2dyYXlfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdW51c2VkMSwgY29uc3QgdWludDhfdCAqdW51c2VkMiwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1bnVzZWQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIEFWX1dOMTYoZHN0ICsgaSAqIDIsIEFWX1JMMTYoc3JjICsgaSAqIDQpKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF95YTE2bGVfYWxwaGFfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdW51c2VkMSwgY29uc3QgdWludDhfdCAqdW51c2VkMiwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdW51c2VkKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorICAgICAgICBBVl9XTjE2KGRzdCArIGkgKiAyLCBBVl9STDE2KHNyYyArIGkgKiA0ICsgMikpOworfQorCitzdGF0aWMgdm9pZCByZWFkX3lhMTZiZV9ncmF5X2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDEsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDIsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdW51c2VkKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorICAgICAgICBBVl9XTjE2KGRzdCArIGkgKiAyLCBBVl9SQjE2KHNyYyArIGkgKiA0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfeWExNmJlX2FscGhhX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDEsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDIsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVudXNlZCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgQVZfV04xNihkc3QgKyBpICogMiwgQVZfUkIxNihzcmMgKyBpICogNCArIDIpKTsKK30KKworLyogVGhpcyBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBwcmV2aW91cywgZW5kIGV4aXN0cyBvbmx5IGJlY2F1c2UKKyAqIHl1eTJUb1kvVVYpKGRzdCwgc3JjICsgMSwgLi4uKSB3b3VsZCBoYXZlIDEwMCUgdW5hbGlnbmVkIGFjY2Vzc2VzLiAqLworc3RhdGljIHZvaWQgdXl2eVRvWV9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp1bnVzZWQxLCBjb25zdCB1aW50OF90ICp1bnVzZWQyLCAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1bnVzZWQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIGRzdFtpXSA9IHNyY1syICogaSArIDFdOworfQorCitzdGF0aWMgdm9pZCB1eXZ5VG9VVl9jKHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDAsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCB3aWR0aCwgdWludDMyX3QgKnVudXNlZCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBkc3RVW2ldID0gc3JjMVs0ICogaSArIDBdOworICAgICAgICBkc3RWW2ldID0gc3JjMVs0ICogaSArIDJdOworICAgIH0KKyAgICBhdl9hc3NlcnQxKHNyYzEgPT0gc3JjMik7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgbnZYWHRvVVZfYyh1aW50OF90ICpkc3QxLCB1aW50OF90ICpkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHdpZHRoKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIGRzdDFbaV0gPSBzcmNbMiAqIGkgKyAwXTsKKyAgICAgICAgZHN0MltpXSA9IHNyY1syICogaSArIDFdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbnYxMlRvVVZfYyh1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp1bnVzZWQwLCBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIHVpbnQzMl90ICp1bnVzZWQpCit7CisgICAgbnZYWHRvVVZfYyhkc3RVLCBkc3RWLCBzcmMxLCB3aWR0aCk7Cit9CisKK3N0YXRpYyB2b2lkIG52MjFUb1VWX2ModWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdW51c2VkMCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCB1aW50MzJfdCAqdW51c2VkKQoreworICAgIG52WFh0b1VWX2MoZHN0ViwgZHN0VSwgc3JjMSwgd2lkdGgpOworfQorCisjZGVmaW5lIGlucHV0X3BpeGVsKHBvcykgKGlzQkUob3JpZ2luKSA/IEFWX1JCMTYocG9zKSA6IEFWX1JMMTYocG9zKSkKKworc3RhdGljIHZvaWQgYmdyMjRUb1lfYyh1aW50OF90ICpfZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDEsIGNvbnN0IHVpbnQ4X3QgKnVudXNlZDIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgdWludDMyX3QgKnJnYjJ5dXYpCit7CisgICAgaW50MTZfdCAqZHN0ID0gKGludDE2X3QgKilfZHN0OworICAgIGludDMyX3QgcnkgPSByZ2IyeXV2W1JZX0lEWF0sIGd5ID0gcmdiMnl1dltHWV9JRFhdLCBieSA9IHJnYjJ5dXZbQllfSURYXTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBpbnQgYiA9IHNyY1tpICogMyArIDBdOworICAgICAgICBpbnQgZyA9IHNyY1tpICogMyArIDFdOworICAgICAgICBpbnQgciA9IHNyY1tpICogMyArIDJdOworCisgICAgICAgIGRzdFtpXSA9ICgocnkqciArIGd5KmcgKyBieSpiICsgKDMyPDwoUkdCMllVVl9TSElGVC0xKSkgKyAoMTw8KFJHQjJZVVZfU0hJRlQtNykpKT4+KFJHQjJZVVZfU0hJRlQtNikpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYmdyMjRUb1VWX2ModWludDhfdCAqX2RzdFUsIHVpbnQ4X3QgKl9kc3RWLCBjb25zdCB1aW50OF90ICp1bnVzZWQwLCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IHdpZHRoLCB1aW50MzJfdCAqcmdiMnl1dikKK3sKKyAgICBpbnQxNl90ICpkc3RVID0gKGludDE2X3QgKilfZHN0VTsKKyAgICBpbnQxNl90ICpkc3RWID0gKGludDE2X3QgKilfZHN0VjsKKyAgICBpbnQzMl90IHJ1ID0gcmdiMnl1dltSVV9JRFhdLCBndSA9IHJnYjJ5dXZbR1VfSURYXSwgYnUgPSByZ2IyeXV2W0JVX0lEWF07CisgICAgaW50MzJfdCBydiA9IHJnYjJ5dXZbUlZfSURYXSwgZ3YgPSByZ2IyeXV2W0dWX0lEWF0sIGJ2ID0gcmdiMnl1dltCVl9JRFhdOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIGludCBiID0gc3JjMVszICogaSArIDBdOworICAgICAgICBpbnQgZyA9IHNyYzFbMyAqIGkgKyAxXTsKKyAgICAgICAgaW50IHIgPSBzcmMxWzMgKiBpICsgMl07CisKKyAgICAgICAgZHN0VVtpXSA9IChydSpyICsgZ3UqZyArIGJ1KmIgKyAoMjU2PDwoUkdCMllVVl9TSElGVC0xKSkgKyAoMTw8KFJHQjJZVVZfU0hJRlQtNykpKT4+KFJHQjJZVVZfU0hJRlQtNik7CisgICAgICAgIGRzdFZbaV0gPSAocnYqciArIGd2KmcgKyBidipiICsgKDI1Njw8KFJHQjJZVVZfU0hJRlQtMSkpICsgKDE8PChSR0IyWVVWX1NISUZULTcpKSk+PihSR0IyWVVWX1NISUZULTYpOworICAgIH0KKyAgICBhdl9hc3NlcnQxKHNyYzEgPT0gc3JjMik7Cit9CisKK3N0YXRpYyB2b2lkIGJncjI0VG9VVl9oYWxmX2ModWludDhfdCAqX2RzdFUsIHVpbnQ4X3QgKl9kc3RWLCBjb25zdCB1aW50OF90ICp1bnVzZWQwLCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgd2lkdGgsIHVpbnQzMl90ICpyZ2IyeXV2KQoreworICAgIGludDE2X3QgKmRzdFUgPSAoaW50MTZfdCAqKV9kc3RVOworICAgIGludDE2X3QgKmRzdFYgPSAoaW50MTZfdCAqKV9kc3RWOworICAgIGludCBpOworICAgIGludDMyX3QgcnUgPSByZ2IyeXV2W1JVX0lEWF0sIGd1ID0gcmdiMnl1dltHVV9JRFhdLCBidSA9IHJnYjJ5dXZbQlVfSURYXTsKKyAgICBpbnQzMl90IHJ2ID0gcmdiMnl1dltSVl9JRFhdLCBndiA9IHJnYjJ5dXZbR1ZfSURYXSwgYnYgPSByZ2IyeXV2W0JWX0lEWF07CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgaW50IGIgPSBzcmMxWzYgKiBpICsgMF0gKyBzcmMxWzYgKiBpICsgM107CisgICAgICAgIGludCBnID0gc3JjMVs2ICogaSArIDFdICsgc3JjMVs2ICogaSArIDRdOworICAgICAgICBpbnQgciA9IHNyYzFbNiAqIGkgKyAyXSArIHNyYzFbNiAqIGkgKyA1XTsKKworICAgICAgICBkc3RVW2ldID0gKHJ1KnIgKyBndSpnICsgYnUqYiArICgyNTY8PFJHQjJZVVZfU0hJRlQpICsgKDE8PChSR0IyWVVWX1NISUZULTYpKSk+PihSR0IyWVVWX1NISUZULTUpOworICAgICAgICBkc3RWW2ldID0gKHJ2KnIgKyBndipnICsgYnYqYiArICgyNTY8PFJHQjJZVVZfU0hJRlQpICsgKDE8PChSR0IyWVVWX1NISUZULTYpKSk+PihSR0IyWVVWX1NISUZULTUpOworICAgIH0KKyAgICBhdl9hc3NlcnQxKHNyYzEgPT0gc3JjMik7Cit9CisKK3N0YXRpYyB2b2lkIHJnYjI0VG9ZX2ModWludDhfdCAqX2RzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp1bnVzZWQxLCBjb25zdCB1aW50OF90ICp1bnVzZWQyLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZ2IyeXV2KQoreworICAgIGludDE2X3QgKmRzdCA9IChpbnQxNl90ICopX2RzdDsKKyAgICBpbnQzMl90IHJ5ID0gcmdiMnl1dltSWV9JRFhdLCBneSA9IHJnYjJ5dXZbR1lfSURYXSwgYnkgPSByZ2IyeXV2W0JZX0lEWF07CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgaW50IHIgPSBzcmNbaSAqIDMgKyAwXTsKKyAgICAgICAgaW50IGcgPSBzcmNbaSAqIDMgKyAxXTsKKyAgICAgICAgaW50IGIgPSBzcmNbaSAqIDMgKyAyXTsKKworICAgICAgICBkc3RbaV0gPSAoKHJ5KnIgKyBneSpnICsgYnkqYiArICgzMjw8KFJHQjJZVVZfU0hJRlQtMSkpICsgKDE8PChSR0IyWVVWX1NISUZULTcpKSk+PihSR0IyWVVWX1NISUZULTYpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJnYjI0VG9VVl9jKHVpbnQ4X3QgKl9kc3RVLCB1aW50OF90ICpfZHN0ViwgY29uc3QgdWludDhfdCAqdW51c2VkMCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCB3aWR0aCwgdWludDMyX3QgKnJnYjJ5dXYpCit7CisgICAgaW50MTZfdCAqZHN0VSA9IChpbnQxNl90ICopX2RzdFU7CisgICAgaW50MTZfdCAqZHN0ViA9IChpbnQxNl90ICopX2RzdFY7CisgICAgaW50IGk7CisgICAgaW50MzJfdCBydSA9IHJnYjJ5dXZbUlVfSURYXSwgZ3UgPSByZ2IyeXV2W0dVX0lEWF0sIGJ1ID0gcmdiMnl1dltCVV9JRFhdOworICAgIGludDMyX3QgcnYgPSByZ2IyeXV2W1JWX0lEWF0sIGd2ID0gcmdiMnl1dltHVl9JRFhdLCBidiA9IHJnYjJ5dXZbQlZfSURYXTsKKyAgICBhdl9hc3NlcnQxKHNyYzEgPT0gc3JjMik7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgaW50IHIgPSBzcmMxWzMgKiBpICsgMF07CisgICAgICAgIGludCBnID0gc3JjMVszICogaSArIDFdOworICAgICAgICBpbnQgYiA9IHNyYzFbMyAqIGkgKyAyXTsKKworICAgICAgICBkc3RVW2ldID0gKHJ1KnIgKyBndSpnICsgYnUqYiArICgyNTY8PChSR0IyWVVWX1NISUZULTEpKSArICgxPDwoUkdCMllVVl9TSElGVC03KSkpPj4oUkdCMllVVl9TSElGVC02KTsKKyAgICAgICAgZHN0VltpXSA9IChydipyICsgZ3YqZyArIGJ2KmIgKyAoMjU2PDwoUkdCMllVVl9TSElGVC0xKSkgKyAoMTw8KFJHQjJZVVZfU0hJRlQtNykpKT4+KFJHQjJZVVZfU0hJRlQtNik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZ2IyNFRvVVZfaGFsZl9jKHVpbnQ4X3QgKl9kc3RVLCB1aW50OF90ICpfZHN0ViwgY29uc3QgdWludDhfdCAqdW51c2VkMCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IHdpZHRoLCB1aW50MzJfdCAqcmdiMnl1dikKK3sKKyAgICBpbnQxNl90ICpkc3RVID0gKGludDE2X3QgKilfZHN0VTsKKyAgICBpbnQxNl90ICpkc3RWID0gKGludDE2X3QgKilfZHN0VjsKKyAgICBpbnQgaTsKKyAgICBpbnQzMl90IHJ1ID0gcmdiMnl1dltSVV9JRFhdLCBndSA9IHJnYjJ5dXZbR1VfSURYXSwgYnUgPSByZ2IyeXV2W0JVX0lEWF07CisgICAgaW50MzJfdCBydiA9IHJnYjJ5dXZbUlZfSURYXSwgZ3YgPSByZ2IyeXV2W0dWX0lEWF0sIGJ2ID0gcmdiMnl1dltCVl9JRFhdOworICAgIGF2X2Fzc2VydDEoc3JjMSA9PSBzcmMyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBpbnQgciA9IHNyYzFbNiAqIGkgKyAwXSArIHNyYzFbNiAqIGkgKyAzXTsKKyAgICAgICAgaW50IGcgPSBzcmMxWzYgKiBpICsgMV0gKyBzcmMxWzYgKiBpICsgNF07CisgICAgICAgIGludCBiID0gc3JjMVs2ICogaSArIDJdICsgc3JjMVs2ICogaSArIDVdOworCisgICAgICAgIGRzdFVbaV0gPSAocnUqciArIGd1KmcgKyBidSpiICsgKDI1Njw8UkdCMllVVl9TSElGVCkgKyAoMTw8KFJHQjJZVVZfU0hJRlQtNikpKT4+KFJHQjJZVVZfU0hJRlQtNSk7CisgICAgICAgIGRzdFZbaV0gPSAocnYqciArIGd2KmcgKyBidipiICsgKDI1Njw8UkdCMllVVl9TSElGVCkgKyAoMTw8KFJHQjJZVVZfU0hJRlQtNikpKT4+KFJHQjJZVVZfU0hJRlQtNSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwbGFuYXJfcmdiX3RvX3kodWludDhfdCAqX2RzdCwgY29uc3QgdWludDhfdCAqc3JjWzRdLCBpbnQgd2lkdGgsIGludDMyX3QgKnJnYjJ5dXYpCit7CisgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKV9kc3Q7CisgICAgaW50MzJfdCByeSA9IHJnYjJ5dXZbUllfSURYXSwgZ3kgPSByZ2IyeXV2W0dZX0lEWF0sIGJ5ID0gcmdiMnl1dltCWV9JRFhdOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIGludCBnID0gc3JjWzBdW2ldOworICAgICAgICBpbnQgYiA9IHNyY1sxXVtpXTsKKyAgICAgICAgaW50IHIgPSBzcmNbMl1baV07CisKKyAgICAgICAgZHN0W2ldID0gKHJ5KnIgKyBneSpnICsgYnkqYiArICgweDgwMTw8KFJHQjJZVVZfU0hJRlQtNykpKSA+PiAoUkdCMllVVl9TSElGVC02KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBsYW5hcl9yZ2JfdG9fYSh1aW50OF90ICpfZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNF0sIGludCB3aWR0aCwgaW50MzJfdCAqdW51c2VkKQoreworICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKilfZHN0OworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorICAgICAgICBkc3RbaV0gPSBzcmNbM11baV0gPDwgNjsKK30KKworc3RhdGljIHZvaWQgcGxhbmFyX3JnYl90b191dih1aW50OF90ICpfZHN0VSwgdWludDhfdCAqX2RzdFYsIGNvbnN0IHVpbnQ4X3QgKnNyY1s0XSwgaW50IHdpZHRoLCBpbnQzMl90ICpyZ2IyeXV2KQoreworICAgIHVpbnQxNl90ICpkc3RVID0gKHVpbnQxNl90ICopX2RzdFU7CisgICAgdWludDE2X3QgKmRzdFYgPSAodWludDE2X3QgKilfZHN0VjsKKyAgICBpbnQzMl90IHJ1ID0gcmdiMnl1dltSVV9JRFhdLCBndSA9IHJnYjJ5dXZbR1VfSURYXSwgYnUgPSByZ2IyeXV2W0JVX0lEWF07CisgICAgaW50MzJfdCBydiA9IHJnYjJ5dXZbUlZfSURYXSwgZ3YgPSByZ2IyeXV2W0dWX0lEWF0sIGJ2ID0gcmdiMnl1dltCVl9JRFhdOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIGludCBnID0gc3JjWzBdW2ldOworICAgICAgICBpbnQgYiA9IHNyY1sxXVtpXTsKKyAgICAgICAgaW50IHIgPSBzcmNbMl1baV07CisKKyAgICAgICAgZHN0VVtpXSA9IChydSpyICsgZ3UqZyArIGJ1KmIgKyAoMHg0MDAxPDwoUkdCMllVVl9TSElGVC03KSkpID4+IChSR0IyWVVWX1NISUZULTYpOworICAgICAgICBkc3RWW2ldID0gKHJ2KnIgKyBndipnICsgYnYqYiArICgweDQwMDE8PChSR0IyWVVWX1NISUZULTcpKSkgPj4gKFJHQjJZVVZfU0hJRlQtNik7CisgICAgfQorfQorCisjZGVmaW5lIHJkcHgoc3JjKSBcCisgICAgaXNfYmUgPyBBVl9SQjE2KHNyYykgOiBBVl9STDE2KHNyYykKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcGxhbmFyX3JnYjE2X3RvX3kodWludDhfdCAqX2RzdCwgY29uc3QgdWludDhfdCAqX3NyY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgYnBjLCBpbnQgaXNfYmUsIGludDMyX3QgKnJnYjJ5dXYpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgdWludDE2X3QgKipzcmMgPSAoY29uc3QgdWludDE2X3QgKiopX3NyYzsKKyAgICB1aW50MTZfdCAqZHN0ICAgICAgICA9ICh1aW50MTZfdCAqKV9kc3Q7CisgICAgaW50MzJfdCByeSA9IHJnYjJ5dXZbUllfSURYXSwgZ3kgPSByZ2IyeXV2W0dZX0lEWF0sIGJ5ID0gcmdiMnl1dltCWV9JRFhdOworICAgIGludCBzaGlmdCA9IGJwYyA8IDE2ID8gYnBjIDogMTQ7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgaW50IGcgPSByZHB4KHNyY1swXSArIGkpOworICAgICAgICBpbnQgYiA9IHJkcHgoc3JjWzFdICsgaSk7CisgICAgICAgIGludCByID0gcmRweChzcmNbMl0gKyBpKTsKKworICAgICAgICBkc3RbaV0gPSAoKHJ5KnIgKyBneSpnICsgYnkqYiArICgzMyA8PCAoUkdCMllVVl9TSElGVCArIGJwYyAtIDkpKSkgPj4gKFJHQjJZVVZfU0hJRlQgKyBzaGlmdCAtIDE0KSk7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHBsYW5hcl9yZ2IxNl90b191dih1aW50OF90ICpfZHN0VSwgdWludDhfdCAqX2RzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpfc3JjWzRdLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBjLCBpbnQgaXNfYmUsIGludDMyX3QgKnJnYjJ5dXYpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgdWludDE2X3QgKipzcmMgPSAoY29uc3QgdWludDE2X3QgKiopX3NyYzsKKyAgICB1aW50MTZfdCAqZHN0VSAgICAgICA9ICh1aW50MTZfdCAqKV9kc3RVOworICAgIHVpbnQxNl90ICpkc3RWICAgICAgID0gKHVpbnQxNl90ICopX2RzdFY7CisgICAgaW50MzJfdCBydSA9IHJnYjJ5dXZbUlVfSURYXSwgZ3UgPSByZ2IyeXV2W0dVX0lEWF0sIGJ1ID0gcmdiMnl1dltCVV9JRFhdOworICAgIGludDMyX3QgcnYgPSByZ2IyeXV2W1JWX0lEWF0sIGd2ID0gcmdiMnl1dltHVl9JRFhdLCBidiA9IHJnYjJ5dXZbQlZfSURYXTsKKyAgICBpbnQgc2hpZnQgPSBicGMgPCAxNiA/IGJwYyA6IDE0OworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIGludCBnID0gcmRweChzcmNbMF0gKyBpKTsKKyAgICAgICAgaW50IGIgPSByZHB4KHNyY1sxXSArIGkpOworICAgICAgICBpbnQgciA9IHJkcHgoc3JjWzJdICsgaSk7CisKKyAgICAgICAgZHN0VVtpXSA9IChydSpyICsgZ3UqZyArIGJ1KmIgKyAoMjU3IDw8IChSR0IyWVVWX1NISUZUICsgYnBjIC0gOSkpKSA+PiAoUkdCMllVVl9TSElGVCArIHNoaWZ0IC0gMTQpOworICAgICAgICBkc3RWW2ldID0gKHJ2KnIgKyBndipnICsgYnYqYiArICgyNTcgPDwgKFJHQjJZVVZfU0hJRlQgKyBicGMgLSA5KSkpID4+IChSR0IyWVVWX1NISUZUICsgc2hpZnQgLSAxNCk7CisgICAgfQorfQorI3VuZGVmIHJkcHgKKworI2RlZmluZSByZ2I5cGx1c19wbGFuYXJfZnVuY3NfZW5kaWFuKG5iaXRzLCBlbmRpYW5fbmFtZSwgZW5kaWFuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHBsYW5hcl9yZ2IjI25iaXRzIyNlbmRpYW5fbmFtZSMjX3RvX3kodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNF0sICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQzMl90ICpyZ2IyeXV2KSAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwbGFuYXJfcmdiMTZfdG9feShkc3QsIHNyYywgdywgbmJpdHMsIGVuZGlhbiwgcmdiMnl1dik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgcGxhbmFyX3JnYiMjbmJpdHMjI2VuZGlhbl9uYW1lIyNfdG9fdXYodWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1s0XSwgaW50IHcsIGludDMyX3QgKnJnYjJ5dXYpICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBsYW5hcl9yZ2IxNl90b191dihkc3RVLCBkc3RWLCBzcmMsIHcsIG5iaXRzLCBlbmRpYW4sIHJnYjJ5dXYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgcmdiOXBsdXNfcGxhbmFyX2Z1bmNzKG5iaXRzKSAgICAgICAgICAgIFwKKyAgICByZ2I5cGx1c19wbGFuYXJfZnVuY3NfZW5kaWFuKG5iaXRzLCBsZSwgMCkgIFwKKyAgICByZ2I5cGx1c19wbGFuYXJfZnVuY3NfZW5kaWFuKG5iaXRzLCBiZSwgMSkKKworcmdiOXBsdXNfcGxhbmFyX2Z1bmNzKDkpCityZ2I5cGx1c19wbGFuYXJfZnVuY3MoMTApCityZ2I5cGx1c19wbGFuYXJfZnVuY3MoMTIpCityZ2I5cGx1c19wbGFuYXJfZnVuY3MoMTQpCityZ2I5cGx1c19wbGFuYXJfZnVuY3MoMTYpCisKK2F2X2NvbGQgdm9pZCBmZl9zd3NfaW5pdF9pbnB1dF9mdW5jcyhTd3NDb250ZXh0ICpjKQoreworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXQgPSBjLT5zcmNGb3JtYXQ7CisKKyAgICBjLT5jaHJUb1lWMTIgPSBOVUxMOworICAgIHN3aXRjaCAoc3JjRm9ybWF0KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVWVY0MjI6CisgICAgICAgIGMtPmNoclRvWVYxMiA9IHl1eTJUb1VWX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVllVNDIyOgorICAgICAgICBjLT5jaHJUb1lWMTIgPSB5dnkyVG9VVl9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfVVlWWTQyMjoKKyAgICAgICAgYy0+Y2hyVG9ZVjEyID0gdXl2eVRvVVZfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX05WMTI6CisgICAgICAgIGMtPmNoclRvWVYxMiA9IG52MTJUb1VWX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9OVjIxOgorICAgICAgICBjLT5jaHJUb1lWMTIgPSBudjIxVG9VVl9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfUEFMODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNF9CWVRFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0X0JZVEU6CisgICAgICAgIGMtPmNoclRvWVYxMiA9IHBhbFRvVVZfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA5TEU6CisgICAgICAgIGMtPnJlYWRDaHJQbGFuYXIgPSBwbGFuYXJfcmdiOWxlX3RvX3V2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwTEU6CisgICAgICAgIGMtPnJlYWRDaHJQbGFuYXIgPSBwbGFuYXJfcmdiMTBsZV90b191djsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMkxFOgorICAgICAgICBjLT5yZWFkQ2hyUGxhbmFyID0gcGxhbmFyX3JnYjEybGVfdG9fdXY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTRMRToKKyAgICAgICAgYy0+cmVhZENoclBsYW5hciA9IHBsYW5hcl9yZ2IxNGxlX3RvX3V2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxNkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTZMRToKKyAgICAgICAgYy0+cmVhZENoclBsYW5hciA9IHBsYW5hcl9yZ2IxNmxlX3RvX3V2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDlCRToKKyAgICAgICAgYy0+cmVhZENoclBsYW5hciA9IHBsYW5hcl9yZ2I5YmVfdG9fdXY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTBCRToKKyAgICAgICAgYy0+cmVhZENoclBsYW5hciA9IHBsYW5hcl9yZ2IxMGJlX3RvX3V2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyQkU6CisgICAgICAgIGMtPnJlYWRDaHJQbGFuYXIgPSBwbGFuYXJfcmdiMTJiZV90b191djsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNEJFOgorICAgICAgICBjLT5yZWFkQ2hyUGxhbmFyID0gcGxhbmFyX3JnYjE0YmVfdG9fdXY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDE2QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNkJFOgorICAgICAgICBjLT5yZWFkQ2hyUGxhbmFyID0gcGxhbmFyX3JnYjE2YmVfdG9fdXY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDoKKyAgICAgICAgYy0+cmVhZENoclBsYW5hciA9IHBsYW5hcl9yZ2JfdG9fdXY7CisgICAgICAgIGJyZWFrOworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA5TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA5TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA5TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEwTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTJMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEyTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTRMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE0TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTZMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE2TEU6CisKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFA5TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDlMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFAxNkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTZMRToKKyAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYnN3YXAxNlVWX2M7CisgICAgICAgIGJyZWFrOworI2Vsc2UKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTBCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTJCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE0QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTRCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE2QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTZCRToKKworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlA5QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTBCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFAxMEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTZCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNkJFOgorICAgICAgICBjLT5jaHJUb1lWMTIgPSBic3dhcDE2VVZfYzsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9CisgICAgaWYgKGMtPmNoclNyY0hTdWJTYW1wbGUpIHsKKyAgICAgICAgc3dpdGNoIChzcmNGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NEJFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiNjRCRVRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRMRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IHJnYjY0TEVUb1VWX2hhbGZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQTY0QkU6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBiZ3I2NEJFVG9VVl9oYWxmX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE2NExFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYmdyNjRMRVRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OEJFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiNDhCRVRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OExFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiNDhMRVRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0OEJFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYmdyNDhCRVRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0OExFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYmdyNDhMRVRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjoKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGJncjMyVG9VVl9oYWxmX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjMyXzE6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBiZ3IzMjFUb1VWX2hhbGZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBiZ3IyNFRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I1NjVMRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGJncjE2bGVUb1VWX2hhbGZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNTY1QkU6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBiZ3IxNmJlVG9VVl9oYWxmX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjU1NUxFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYmdyMTVsZVRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I1NTVCRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGJncjE1YmVUb1VWX2hhbGZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVA6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gZ2JyMjRwVG9VVl9oYWxmX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ0NExFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYmdyMTJsZVRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0NDRCRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGJncjEyYmVUb1VWX2hhbGZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMzI6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSByZ2IzMlRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IzMl8xOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiMzIxVG9VVl9oYWxmX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiMjRUb1VWX2hhbGZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTY1TEU6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSByZ2IxNmxlVG9VVl9oYWxmX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU2NUJFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiMTZiZVRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NTVMRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IHJnYjE1bGVUb1VWX2hhbGZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTU1QkU6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSByZ2IxNWJlVG9VVl9oYWxmX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ0NExFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiMTJsZVRvVVZfaGFsZl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0NDRCRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IHJnYjEyYmVUb1VWX2hhbGZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChzcmNGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NEJFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiNjRCRVRvVVZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQTY0TEU6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSByZ2I2NExFVG9VVl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBNjRCRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGJncjY0QkVUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE2NExFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYmdyNjRMRVRvVVZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDhCRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IHJnYjQ4QkVUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4TEU6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSByZ2I0OExFVG9VVl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0OEJFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYmdyNDhCRVRvVVZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDhMRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGJncjQ4TEVUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjMyOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYmdyMzJUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjMyXzE6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBiZ3IzMjFUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYmdyMjRUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjU2NUxFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYmdyMTZsZVRvVVZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNTY1QkU6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBiZ3IxNmJlVG9VVl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I1NTVMRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGJncjE1bGVUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjU1NUJFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gYmdyMTViZVRvVVZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDQ0TEU6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBiZ3IxMmxlVG9VVl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0NDRCRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGJncjEyYmVUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjMyOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiMzJUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjMyXzE6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSByZ2IzMjFUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiMjRUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU2NUxFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiMTZsZVRvVVZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTY1QkU6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSByZ2IxNmJlVG9VVl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NTVMRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IHJnYjE1bGVUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU1NUJFOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcmdiMTViZVRvVVZfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDQ0TEU6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSByZ2IxMmxlVG9VVl9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0NDRCRToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IHJnYjEyYmVUb1VWX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMtPmx1bVRvWVYxMiA9IE5VTEw7CisgICAgYy0+YWxwVG9ZVjEyID0gTlVMTDsKKyAgICBzd2l0Y2ggKHNyY0Zvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOUxFOgorICAgICAgICBjLT5yZWFkTHVtUGxhbmFyID0gcGxhbmFyX3JnYjlsZV90b195OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwTEU6CisgICAgICAgIGMtPnJlYWRMdW1QbGFuYXIgPSBwbGFuYXJfcmdiMTBsZV90b195OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyTEU6CisgICAgICAgIGMtPnJlYWRMdW1QbGFuYXIgPSBwbGFuYXJfcmdiMTJsZV90b195OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE0TEU6CisgICAgICAgIGMtPnJlYWRMdW1QbGFuYXIgPSBwbGFuYXJfcmdiMTRsZV90b195OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxNkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTZMRToKKyAgICAgICAgYy0+cmVhZEx1bVBsYW5hciA9IHBsYW5hcl9yZ2IxNmxlX3RvX3k7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOUJFOgorICAgICAgICBjLT5yZWFkTHVtUGxhbmFyID0gcGxhbmFyX3JnYjliZV90b195OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwQkU6CisgICAgICAgIGMtPnJlYWRMdW1QbGFuYXIgPSBwbGFuYXJfcmdiMTBiZV90b195OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyQkU6CisgICAgICAgIGMtPnJlYWRMdW1QbGFuYXIgPSBwbGFuYXJfcmdiMTJiZV90b195OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE0QkU6CisgICAgICAgIGMtPnJlYWRMdW1QbGFuYXIgPSBwbGFuYXJfcmdiMTRiZV90b195OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxNkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTZCRToKKyAgICAgICAgYy0+cmVhZEx1bVBsYW5hciA9IHBsYW5hcl9yZ2IxNmJlX3RvX3k7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDoKKyAgICAgICAgYy0+cmVhZEFscFBsYW5hciA9IHBsYW5hcl9yZ2JfdG9fYTsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDoKKyAgICAgICAgYy0+cmVhZEx1bVBsYW5hciA9IHBsYW5hcl9yZ2JfdG9feTsKKyAgICAgICAgYnJlYWs7CisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDlMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDlMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDlMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTJMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE0TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTRMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE2TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTZMRToKKworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTZMRToKKyAgICAgICAgYy0+bHVtVG9ZVjEyID0gYnN3YXAxNllfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDlMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFA5TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTZMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxNkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2TEU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IGJzd2FwMTZZX2M7CisgICAgICAgIGMtPmFscFRvWVYxMiA9IGJzd2FwMTZZX2M7CisgICAgICAgIGJyZWFrOworI2Vsc2UKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTBCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTJCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE0QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTRCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE2QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTZCRToKKworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTZCRToKKyAgICAgICAgYy0+bHVtVG9ZVjEyID0gYnN3YXAxNllfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFA5QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTBCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxMEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTZCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxNkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2QkU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IGJzd2FwMTZZX2M7CisgICAgICAgIGMtPmFscFRvWVYxMiA9IGJzd2FwMTZZX2M7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBBVl9QSVhfRk1UX1lBMTZMRToKKyAgICAgICAgYy0+bHVtVG9ZVjEyID0gcmVhZF95YTE2bGVfZ3JheV9jOworICAgICAgICBjLT5hbHBUb1lWMTIgPSByZWFkX3lhMTZsZV9hbHBoYV9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWUExNkJFOgorICAgICAgICBjLT5sdW1Ub1lWMTIgPSByZWFkX3lhMTZiZV9ncmF5X2M7CisgICAgICAgIGMtPmFscFRvWVYxMiA9IHJlYWRfeWExNmJlX2FscGhhX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVlWNDIyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVllVNDIyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZQTg6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IHl1eTJUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1VZVlk0MjI6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IHV5dnlUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorICAgICAgICBjLT5sdW1Ub1lWMTIgPSBiZ3IyNFRvWV9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNTY1TEU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IGJncjE2bGVUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjU2NUJFOgorICAgICAgICBjLT5sdW1Ub1lWMTIgPSBiZ3IxNmJlVG9ZX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I1NTVMRToKKyAgICAgICAgYy0+bHVtVG9ZVjEyID0gYmdyMTVsZVRvWV9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNTU1QkU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IGJncjE1YmVUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ0NExFOgorICAgICAgICBjLT5sdW1Ub1lWMTIgPSBiZ3IxMmxlVG9ZX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0NDRCRToKKyAgICAgICAgYy0+bHVtVG9ZVjEyID0gYmdyMTJiZVRvWV9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IHJnYjI0VG9ZX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NjVMRToKKyAgICAgICAgYy0+bHVtVG9ZVjEyID0gcmdiMTZsZVRvWV9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTY1QkU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IHJnYjE2YmVUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU1NUxFOgorICAgICAgICBjLT5sdW1Ub1lWMTIgPSByZ2IxNWxlVG9ZX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NTVCRToKKyAgICAgICAgYy0+bHVtVG9ZVjEyID0gcmdiMTViZVRvWV9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDQ0TEU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IHJnYjEybGVUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ0NEJFOgorICAgICAgICBjLT5sdW1Ub1lWMTIgPSByZ2IxMmJlVG9ZX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9QQUw4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0X0JZVEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjRfQllURToKKyAgICAgICAgYy0+bHVtVG9ZVjEyID0gcGFsVG9ZX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9NT05PQkxBQ0s6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IG1vbm9ibGFjazJZX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9NT05PV0hJVEU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IG1vbm93aGl0ZTJZX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjoKKyAgICAgICAgYy0+bHVtVG9ZVjEyID0gYmdyMzJUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjMyXzE6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IGJncjMyMVRvWV9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMzI6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IHJnYjMyVG9ZX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IzMl8xOgorICAgICAgICBjLT5sdW1Ub1lWMTIgPSByZ2IzMjFUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4QkU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IHJnYjQ4QkVUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4TEU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IHJnYjQ4TEVUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ4QkU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IGJncjQ4QkVUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ4TEU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IGJncjQ4TEVUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NEJFOgorICAgICAgICBjLT5sdW1Ub1lWMTIgPSByZ2I2NEJFVG9ZX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRMRToKKyAgICAgICAgYy0+bHVtVG9ZVjEyID0gcmdiNjRMRVRvWV9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQTY0QkU6CisgICAgICAgIGMtPmx1bVRvWVYxMiA9IGJncjY0QkVUb1lfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE2NExFOgorICAgICAgICBjLT5sdW1Ub1lWMTIgPSBiZ3I2NExFVG9ZX2M7CisgICAgfQorICAgIGlmIChjLT5hbHBQaXhCdWYpIHsKKyAgICAgICAgaWYgKGlzMTZCUFMoc3JjRm9ybWF0KSB8fCBpc05CUFMoc3JjRm9ybWF0KSkgeworICAgICAgICAgICAgaWYgKEhBVkVfQklHRU5ESUFOID09ICFpc0JFKHNyY0Zvcm1hdCkpCisgICAgICAgICAgICAgICAgYy0+YWxwVG9ZVjEyID0gYnN3YXAxNllfYzsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHNyY0Zvcm1hdCkgeworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQTY0TEU6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBNjRCRToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NExFOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQTY0QkU6ICBjLT5hbHBUb1lWMTIgPSByZ2JhNjRUb0FfYzsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICAgICAgICAgIGMtPmFscFRvWVYxMiA9IHJnYmFUb0FfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQUJHUjoKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0FSR0I6CisgICAgICAgICAgICBjLT5hbHBUb1lWMTIgPSBhYmdyVG9BX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lBODoKKyAgICAgICAgICAgIGMtPmFscFRvWVYxMiA9IHV5dnlUb1lfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUEFMOCA6CisgICAgICAgICAgICBjLT5hbHBUb1lWMTIgPSBwYWxUb0FfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvbGlic3dzY2FsZS52IGIvZmZtcGVnL2xpYnN3c2NhbGUvbGlic3dzY2FsZS52Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOWE5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS9saWJzd3NjYWxlLnYKQEAgLTAsMCArMSw0IEBACitMSUJTV1NDQUxFXyRNQUpPUiB7CisgICAgICAgIGdsb2JhbDogc3dzY2FsZV8qOyBzd3NfKjsKKyAgICAgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvbG9nMl90YWIuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL2xvZzJfdGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhMWRmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL2xvZzJfdGFiLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cyX3RhYi5jIgpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvb3B0aW9ucy5jIGIvZmZtcGVnL2xpYnN3c2NhbGUvb3B0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNDljM2UKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS9vcHRpb25zLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKyNpbmNsdWRlICJzd3NjYWxlLmgiCisjaW5jbHVkZSAic3dzY2FsZV9pbnRlcm5hbC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqc3dzX2NvbnRleHRfdG9fbmFtZSh2b2lkICpwdHIpCit7CisgICAgcmV0dXJuICJzd3NjYWxlciI7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFN3c0NvbnRleHQsIHgpCisjZGVmaW5lIERFRkFVTFQgMAorI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzd3NjYWxlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzd3NfZmxhZ3MiLCAgICAgICAic2NhbGVyIGZsYWdzIiwgICAgICAgICAgICAgICAgICBPRkZTRVQoZmxhZ3MpLCAgICAgQVZfT1BUX1RZUEVfRkxBR1MsICB7IC5pNjQgID0gU1dTX0JJQ1VCSUMgICAgICAgIH0sIDAsICAgICAgVUlOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJmYXN0X2JpbGluZWFyIiwgICAiZmFzdCBiaWxpbmVhciIsICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0ZBU1RfQklMSU5FQVIgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJiaWxpbmVhciIsICAgICAgICAiYmlsaW5lYXIiLCAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0JJTElORUFSICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJiaWN1YmljIiwgICAgICAgICAiYmljdWJpYyIsICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0JJQ1VCSUMgICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJleHBlcmltZW50YWwiLCAgICAiZXhwZXJpbWVudGFsIiwgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX1ggICAgICAgICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJuZWlnaGJvciIsICAgICAgICAibmVhcmVzdCBuZWlnaGJvciIsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX1BPSU5UICAgICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJhcmVhIiwgICAgICAgICAgICAiYXZlcmFnaW5nIGFyZWEiLCAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0FSRUEgICAgICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJiaWN1YmxpbiIsICAgICAgICAibHVtYSBiaWN1YmljLCBjaHJvbWEgYmlsaW5lYXIiLCAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0JJQ1VCTElOICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJnYXVzcyIsICAgICAgICAgICAiZ2F1c3NpYW4iLCAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0dBVVNTICAgICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJzaW5jIiwgICAgICAgICAgICAic2luYyIsICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX1NJTkMgICAgICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJsYW5jem9zIiwgICAgICAgICAibGFuY3pvcyIsICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0xBTkNaT1MgICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJzcGxpbmUiLCAgICAgICAgICAibmF0dXJhbCBiaWN1YmljIHNwbGluZSIsICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX1NQTElORSAgICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJwcmludF9pbmZvIiwgICAgICAicHJpbnQgaW5mbyIsICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX1BSSU5UX0lORk8gICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJhY2N1cmF0ZV9ybmQiLCAgICAiYWNjdXJhdGUgcm91bmRpbmciLCAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0FDQ1VSQVRFX1JORCAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJmdWxsX2Nocm9tYV9pbnQiLCAiZnVsbCBjaHJvbWEgaW50ZXJwb2xhdGlvbiIsICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0ZVTExfQ0hSX0hfSU5UIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJmdWxsX2Nocm9tYV9pbnAiLCAiZnVsbCBjaHJvbWEgaW5wdXQiLCAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0ZVTExfQ0hSX0hfSU5QIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJiaXRleGFjdCIsICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0JJVEVYQUNUICAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKyAgICB7ICJlcnJvcl9kaWZmdXNpb24iLCAiZXJyb3IgZGlmZnVzaW9uIGRpdGhlciIsICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0VSUk9SX0RJRkZVU0lPTn0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19mbGFncyIgfSwKKworICAgIHsgInNyY3ciLCAgICAgICAgICAgICJzb3VyY2Ugd2lkdGgiLCAgICAgICAgICAgICAgICAgIE9GRlNFVChzcmNXKSwgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IDE2ICAgICAgICAgICAgICAgICB9LCAxLCAgICAgICBJTlRfTUFYLCAgICAgICAgVkUgfSwKKyAgICB7ICJzcmNoIiwgICAgICAgICAgICAic291cmNlIGhlaWdodCIsICAgICAgICAgICAgICAgICBPRkZTRVQoc3JjSCksICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAxNiAgICAgICAgICAgICAgICAgfSwgMSwgICAgICAgSU5UX01BWCwgICAgICAgIFZFIH0sCisgICAgeyAiZHN0dyIsICAgICAgICAgICAgImRlc3RpbmF0aW9uIHdpZHRoIiwgICAgICAgICAgICAgT0ZGU0VUKGRzdFcpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gMTYgICAgICAgICAgICAgICAgIH0sIDEsICAgICAgIElOVF9NQVgsICAgICAgICBWRSB9LAorICAgIHsgImRzdGgiLCAgICAgICAgICAgICJkZXN0aW5hdGlvbiBoZWlnaHQiLCAgICAgICAgICAgIE9GRlNFVChkc3RIKSwgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IDE2ICAgICAgICAgICAgICAgICB9LCAxLCAgICAgICBJTlRfTUFYLCAgICAgICAgVkUgfSwKKyAgICB7ICJzcmNfZm9ybWF0IiwgICAgICAic291cmNlIGZvcm1hdCIsICAgICAgICAgICAgICAgICBPRkZTRVQoc3JjRm9ybWF0KSwgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSBERUZBVUxUICAgICAgICAgICAgfSwgMCwgICAgICAgQVZfUElYX0ZNVF9OQiAtIDEsIFZFIH0sCisgICAgeyAiZHN0X2Zvcm1hdCIsICAgICAgImRlc3RpbmF0aW9uIGZvcm1hdCIsICAgICAgICAgICAgT0ZGU0VUKGRzdEZvcm1hdCksIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gREVGQVVMVCAgICAgICAgICAgIH0sIDAsICAgICAgIEFWX1BJWF9GTVRfTkIgLSAxLCBWRSB9LAorICAgIHsgInNyY19yYW5nZSIsICAgICAgICJzb3VyY2UgcmFuZ2UiLCAgICAgICAgICAgICAgICAgIE9GRlNFVChzcmNSYW5nZSksICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IERFRkFVTFQgICAgICAgICAgICB9LCAwLCAgICAgICAxLCAgICAgICAgICAgICAgVkUgfSwKKyAgICB7ICJkc3RfcmFuZ2UiLCAgICAgICAiZGVzdGluYXRpb24gcmFuZ2UiLCAgICAgICAgICAgICBPRkZTRVQoZHN0UmFuZ2UpLCAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSBERUZBVUxUICAgICAgICAgICAgfSwgMCwgICAgICAgMSwgICAgICAgICAgICAgIFZFIH0sCisgICAgeyAicGFyYW0wIiwgICAgICAgICAgInNjYWxlciBwYXJhbSAwIiwgICAgICAgICAgICAgICAgT0ZGU0VUKHBhcmFtWzBdKSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgeyAuZGJsID0gU1dTX1BBUkFNX0RFRkFVTFQgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSB9LAorICAgIHsgInBhcmFtMSIsICAgICAgICAgICJzY2FsZXIgcGFyYW0gMSIsICAgICAgICAgICAgICAgIE9GRlNFVChwYXJhbVsxXSksICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IFNXU19QQVJBTV9ERUZBVUxUICB9LCBJTlRfTUlOLCBJTlRfTUFYLCAgICAgICAgVkUgfSwKKworICAgIHsgInNyY192X2Nocl9wb3MiLCAgICJzb3VyY2UgdmVydGljYWwgY2hyb21hIHBvc2l0aW9uIGluIGx1bWEgZ3JpZC8yNTYiICAsICAgICAgT0ZGU0VUKHNyY192X2Nocl9wb3MpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC01MTMgfSwgLTUxMywgICAgICA1MTIsICAgICAgICAgICAgIFZFIH0sCisgICAgeyAic3JjX2hfY2hyX3BvcyIsICAgInNvdXJjZSBob3Jpem9udGFsIGNocm9tYSBwb3NpdGlvbiBpbiBsdW1hIGdyaWQvMjU2IiwgICAgICBPRkZTRVQoc3JjX2hfY2hyX3BvcyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTUxMyB9LCAtNTEzLCAgICAgIDUxMiwgICAgICAgICAgICAgVkUgfSwKKyAgICB7ICJkc3Rfdl9jaHJfcG9zIiwgICAiZGVzdGluYXRpb24gdmVydGljYWwgY2hyb21hIHBvc2l0aW9uIGluIGx1bWEgZ3JpZC8yNTYiICAsIE9GRlNFVChkc3Rfdl9jaHJfcG9zKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtNTEzIH0sIC01MTMsICAgICAgNTEyLCAgICAgICAgICAgICBWRSB9LAorICAgIHsgImRzdF9oX2Nocl9wb3MiLCAgICJkZXN0aW5hdGlvbiBob3Jpem9udGFsIGNocm9tYSBwb3NpdGlvbiBpbiBsdW1hIGdyaWQvMjU2IiwgT0ZGU0VUKGRzdF9oX2Nocl9wb3MpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC01MTMgfSwgLTUxMywgICAgICA1MTIsICAgICAgICAgICAgIFZFIH0sCisKKyAgICB7ICJzd3NfZGl0aGVyIiwgICAgICAic2V0IGRpdGhlcmluZyBhbGdvcml0aG0iLCAgICAgICBPRkZTRVQoZGl0aGVyKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgID0gU1dTX0RJVEhFUl9BVVRPICAgIH0sIDAsICAgICAgIE5CX1NXU19ESVRIRVIsICBWRSwgInN3c19kaXRoZXIiIH0sCisgICAgeyAiYXV0byIsICAgICAgICAgICAgImxlYXZlIGNob2ljZSB0byBzd3MiLCAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgeyAuaTY0ICA9IFNXU19ESVRIRVJfQVVUTyAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCAgICAgICAgVkUsICJzd3NfZGl0aGVyIiB9LAorICAgIHsgImJheWVyIiwgICAgICAgICAgICJiYXllciBkaXRoZXIiLCAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsgLmk2NCAgPSBTV1NfRElUSEVSX0JBWUVSICAgfSwgSU5UX01JTiwgSU5UX01BWCwgICAgICAgIFZFLCAic3dzX2RpdGhlciIgfSwKKyAgICB7ICJlZCIsICAgICAgICAgICAgICAiZXJyb3IgZGlmZnVzaW9uIiwgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgID0gU1dTX0RJVEhFUl9FRCAgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICAgICBWRSwgInN3c19kaXRoZXIiIH0sCisgICAgeyAiYV9kaXRoZXIiLCAgICAgICAgImFyaXRobWV0aWMgYWRkaXRpb24gZGl0aGVyIiwgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgeyAuaTY0ICA9IFNXU19ESVRIRVJfQV9ESVRIRVJ9LCBJTlRfTUlOLCBJTlRfTUFYLCAgICAgICAgVkUsICJzd3NfZGl0aGVyIiB9LAorICAgIHsgInhfZGl0aGVyIiwgICAgICAgICJhcml0aG1ldGljIHhvciBkaXRoZXIiLCAgICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsgLmk2NCAgPSBTV1NfRElUSEVSX1hfRElUSEVSfSwgSU5UX01JTiwgSU5UX01BWCwgICAgICAgIFZFLCAic3dzX2RpdGhlciIgfSwKKworICAgIHsgTlVMTCB9Cit9OworCitjb25zdCBBVkNsYXNzIHN3c19jb250ZXh0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlNXU2NhbGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IHN3c19jb250ZXh0X3RvX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBzd3NjYWxlX29wdGlvbnMsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9TV1NDQUxFUiwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK2NvbnN0IEFWQ2xhc3MgKnN3c19nZXRfY2xhc3Modm9pZCkKK3sKKyAgICByZXR1cm4gJnN3c19jb250ZXh0X2NsYXNzOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvb3V0cHV0LmMgYi9mZm1wZWcvbGlic3dzY2FsZS9vdXRwdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWU2YjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvb3V0cHV0LmMKQEAgLTAsMCArMSwyMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMTIgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInJnYjJyZ2IuaCIKKyNpbmNsdWRlICJzd3NjYWxlLmgiCisjaW5jbHVkZSAic3dzY2FsZV9pbnRlcm5hbC5oIgorCitERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDhfdCwgZmZfZGl0aGVyXzJ4Ml80KVtdWzhdID0geworeyAgMSwgICAzLCAgIDEsICAgMywgICAxLCAgIDMsICAgMSwgICAzLCB9LAoreyAgMiwgICAwLCAgIDIsICAgMCwgICAyLCAgIDAsICAgMiwgICAwLCB9LAoreyAgMSwgICAzLCAgIDEsICAgMywgICAxLCAgIDMsICAgMSwgICAzLCB9LAorfTsKKworREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ4X3QsIGZmX2RpdGhlcl8yeDJfOClbXVs4XSA9IHsKK3sgIDYsICAgMiwgICA2LCAgIDIsICAgNiwgICAyLCAgIDYsICAgMiwgfSwKK3sgIDAsICAgNCwgICAwLCAgIDQsICAgMCwgICA0LCAgIDAsICAgNCwgfSwKK3sgIDYsICAgMiwgICA2LCAgIDIsICAgNiwgICAyLCAgIDYsICAgMiwgfSwKK307CisKK0RFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50OF90LCBmZl9kaXRoZXJfNHg0XzE2KVtdWzhdID0geworeyAgOCwgICA0LCAgMTEsICAgNywgICA4LCAgIDQsICAxMSwgICA3LCB9LAoreyAgMiwgIDE0LCAgIDEsICAxMywgICAyLCAgMTQsICAgMSwgIDEzLCB9LAoreyAxMCwgICA2LCAgIDksICAgNSwgIDEwLCAgIDYsICAgOSwgICA1LCB9LAoreyAgMCwgIDEyLCAgIDMsICAxNSwgICAwLCAgMTIsICAgMywgIDE1LCB9LAoreyAgOCwgICA0LCAgMTEsICAgNywgICA4LCAgIDQsICAxMSwgICA3LCB9LAorfTsKKworREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ4X3QsIGZmX2RpdGhlcl84eDhfMzIpW11bOF0gPSB7Cit7IDE3LCAgIDksICAyMywgIDE1LCAgMTYsICAgOCwgIDIyLCAgMTQsIH0sCit7ICA1LCAgMjksICAgMywgIDI3LCAgIDQsICAyOCwgICAyLCAgMjYsIH0sCit7IDIxLCAgMTMsICAxOSwgIDExLCAgMjAsICAxMiwgIDE4LCAgMTAsIH0sCit7ICAwLCAgMjQsICAgNiwgIDMwLCAgIDEsICAyNSwgICA3LCAgMzEsIH0sCit7IDE2LCAgIDgsICAyMiwgIDE0LCAgMTcsICAgOSwgIDIzLCAgMTUsIH0sCit7ICA0LCAgMjgsICAgMiwgIDI2LCAgIDUsICAyOSwgICAzLCAgMjcsIH0sCit7IDIwLCAgMTIsICAxOCwgIDEwLCAgMjEsICAxMywgIDE5LCAgMTEsIH0sCit7ICAxLCAgMjUsICAgNywgIDMxLCAgIDAsICAyNCwgICA2LCAgMzAsIH0sCit7IDE3LCAgIDksICAyMywgIDE1LCAgMTYsICAgOCwgIDIyLCAgMTQsIH0sCit9OworCitERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDhfdCwgZmZfZGl0aGVyXzh4OF83MylbXVs4XSA9IHsKK3sgIDAsICA1NSwgIDE0LCAgNjgsICAgMywgIDU4LCAgMTcsICA3MiwgfSwKK3sgMzcsICAxOCwgIDUwLCAgMzIsICA0MCwgIDIyLCAgNTQsICAzNSwgfSwKK3sgIDksICA2NCwgICA1LCAgNTksICAxMywgIDY3LCAgIDgsICA2MywgfSwKK3sgNDYsICAyNywgIDQxLCAgMjMsICA0OSwgIDMxLCAgNDQsICAyNiwgfSwKK3sgIDIsICA1NywgIDE2LCAgNzEsICAgMSwgIDU2LCAgMTUsICA3MCwgfSwKK3sgMzksICAyMSwgIDUyLCAgMzQsICAzOCwgIDE5LCAgNTEsICAzMywgfSwKK3sgMTEsICA2NiwgICA3LCAgNjIsICAxMCwgIDY1LCAgIDYsICA2MCwgfSwKK3sgNDgsICAzMCwgIDQzLCAgMjUsICA0NywgIDI5LCAgNDIsICAyNCwgfSwKK3sgIDAsICA1NSwgIDE0LCAgNjgsICAgMywgIDU4LCAgMTcsICA3MiwgfSwKK307CisKKyNpZiAxCitERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDhfdCwgZmZfZGl0aGVyXzh4OF8yMjApW11bOF0gPSB7Cit7MTE3LCAgNjIsIDE1OCwgMTAzLCAxMTMsICA1OCwgMTU1LCAxMDAsIH0sCit7IDM0LCAxOTksICAyMSwgMTg2LCAgMzEsIDE5NiwgIDE3LCAxODIsIH0sCit7MTQ0LCAgODksIDEzMSwgIDc2LCAxNDEsICA4NiwgMTI3LCAgNzIsIH0sCit7ICAwLCAxNjUsICA0MSwgMjA2LCAgMTAsIDE3NSwgIDUyLCAyMTcsIH0sCit7MTEwLCAgNTUsIDE1MSwgIDk2LCAxMjAsICA2NSwgMTYyLCAxMDcsIH0sCit7IDI4LCAxOTMsICAxNCwgMTc5LCAgMzgsIDIwMywgIDI0LCAxODksIH0sCit7MTM4LCAgODMsIDEyNCwgIDY5LCAxNDgsICA5MywgMTM0LCAgNzksIH0sCit7ICA3LCAxNzIsICA0OCwgMjEzLCAgIDMsIDE2OCwgIDQ1LCAyMTAsIH0sCit7MTE3LCAgNjIsIDE1OCwgMTAzLCAxMTMsICA1OCwgMTU1LCAxMDAsIH0sCit9OworI2VsaWYgMQorLy8gdHJpZXMgdG8gY29ycmVjdCBhIGdhbW1hIG9mIDEuNQorREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ4X3QsIGZmX2RpdGhlcl84eDhfMjIwKVtdWzhdID0geworeyAgMCwgMTQzLCAgMTgsIDIwMCwgICAyLCAxNTYsICAyNSwgMjE1LCB9LAoreyA3OCwgIDI4LCAxMjUsICA2NCwgIDg5LCAgMzYsIDEzOCwgIDc0LCB9LAoreyAxMCwgMTgwLCAgIDMsIDE2MSwgIDE2LCAxOTUsICAgOCwgMTc1LCB9LAorezEwOSwgIDUxLCAgOTMsICAzOCwgMTIxLCAgNjAsIDEwNSwgIDQ3LCB9LAoreyAgMSwgMTUyLCAgMjMsIDIxMCwgICAwLCAxNDcsICAyMCwgMjA1LCB9LAoreyA4NSwgIDMzLCAxMzQsICA3MSwgIDgxLCAgMzAsIDEzMCwgIDY3LCB9LAoreyAxNCwgMTkwLCAgIDYsIDE3MSwgIDEyLCAxODUsICAgNSwgMTY2LCB9LAorezExNywgIDU3LCAxMDEsICA0NCwgMTEzLCAgNTQsICA5NywgIDQxLCB9LAoreyAgMCwgMTQzLCAgMTgsIDIwMCwgICAyLCAxNTYsICAyNSwgMjE1LCB9LAorfTsKKyNlbGlmIDEKKy8vIHRyaWVzIHRvIGNvcnJlY3QgYSBnYW1tYSBvZiAyLjAKK0RFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50OF90LCBmZl9kaXRoZXJfOHg4XzIyMClbXVs4XSA9IHsKK3sgIDAsIDEyNCwgICA4LCAxOTMsICAgMCwgMTQwLCAgMTIsIDIxMywgfSwKK3sgNTUsICAxNCwgMTA0LCAgNDIsICA2NiwgIDE5LCAxMTksICA1MiwgfSwKK3sgIDMsIDE2OCwgICAxLCAxNDUsICAgNiwgMTg3LCAgIDMsIDE2MiwgfSwKK3sgODYsICAzMSwgIDcwLCAgMjEsICA5OSwgIDM5LCAgODIsICAyOCwgfSwKK3sgIDAsIDEzNCwgIDExLCAyMDYsICAgMCwgMTI5LCAgIDksIDIwMCwgfSwKK3sgNjIsICAxNywgMTE0LCAgNDgsICA1OCwgIDE2LCAxMDksICA0NSwgfSwKK3sgIDUsIDE4MSwgICAyLCAxNTcsICAgNCwgMTc1LCAgIDEsIDE1MSwgfSwKK3sgOTUsICAzNiwgIDc4LCAgMjYsICA5MCwgIDM0LCAgNzQsICAyNCwgfSwKK3sgIDAsIDEyNCwgICA4LCAxOTMsICAgMCwgMTQwLCAgMTIsIDIxMywgfSwKK307CisjZWxzZQorLy8gdHJpZXMgdG8gY29ycmVjdCBhIGdhbW1hIG9mIDIuNQorREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ4X3QsIGZmX2RpdGhlcl84eDhfMjIwKVtdWzhdID0geworeyAgMCwgMTA3LCAgIDMsIDE4NywgICAwLCAxMjUsICAgNiwgMjEyLCB9LAoreyAzOSwgICA3LCAgODYsICAyOCwgIDQ5LCAgMTEsIDEwMiwgIDM2LCB9LAoreyAgMSwgMTU4LCAgIDAsIDEzMSwgICAzLCAxODAsICAgMSwgMTUxLCB9LAoreyA2OCwgIDE5LCAgNTIsICAxMiwgIDgxLCAgMjUsICA2NCwgIDE3LCB9LAoreyAgMCwgMTE5LCAgIDUsIDIwMywgICAwLCAxMTMsICAgNCwgMTk1LCB9LAoreyA0NSwgICA5LCAgOTYsICAzMywgIDQyLCAgIDgsICA5MSwgIDMwLCB9LAoreyAgMiwgMTcyLCAgIDEsIDE0NCwgICAyLCAxNjUsICAgMCwgMTM3LCB9LAoreyA3NywgIDIzLCAgNjAsICAxNSwgIDcyLCAgMjEsICA1NiwgIDE0LCB9LAoreyAgMCwgMTA3LCAgIDMsIDE4NywgICAwLCAxMjUsICAgNiwgMjEyLCB9LAorfTsKKyNlbmRpZgorCisjZGVmaW5lIG91dHB1dF9waXhlbChwb3MsIHZhbCwgYmlhcywgc2lnbmVkbmVzcykgXAorICAgIGlmIChiaWdfZW5kaWFuKSB7IFwKKyAgICAgICAgQVZfV0IxNihwb3MsIGJpYXMgKyBhdl9jbGlwXyAjIyBzaWduZWRuZXNzICMjIDE2KHZhbCA+PiBzaGlmdCkpOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBBVl9XTDE2KHBvcywgYmlhcyArIGF2X2NsaXBfICMjIHNpZ25lZG5lc3MgIyMgMTYodmFsID4+IHNoaWZ0KSk7IFwKKyAgICB9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQKK3l1djJwbGFuZTFfMTZfY190ZW1wbGF0ZShjb25zdCBpbnQzMl90ICpzcmMsIHVpbnQxNl90ICpkZXN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlnX2VuZGlhbiwgaW50IG91dHB1dF9iaXRzKQoreworICAgIGludCBpOworICAgIGludCBzaGlmdCA9IDM7CisgICAgYXZfYXNzZXJ0MChvdXRwdXRfYml0cyA9PSAxNik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSsrKSB7CisgICAgICAgIGludCB2YWwgPSBzcmNbaV0gKyAoMSA8PCAoc2hpZnQgLSAxKSk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFtpXSwgdmFsLCAwLCB1aW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQKK3l1djJwbGFuZVhfMTZfY190ZW1wbGF0ZShjb25zdCBpbnQxNl90ICpmaWx0ZXIsIGludCBmaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKipzcmMsIHVpbnQxNl90ICpkZXN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlnX2VuZGlhbiwgaW50IG91dHB1dF9iaXRzKQoreworICAgIGludCBpOworICAgIGludCBzaGlmdCA9IDE1OworICAgIGF2X2Fzc2VydDAob3V0cHV0X2JpdHMgPT0gMTYpOworCisgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkrKykgeworICAgICAgICBpbnQgdmFsID0gMSA8PCAoc2hpZnQgLSAxKTsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgLyogcmFuZ2Ugb2YgdmFsIGlzIFswLDB4N0ZGRkZGRkZdLCBzbyAzMSBiaXRzLCBidXQgd2l0aCBsYW5jem9zL3NwbGluZQorICAgICAgICAgKiBmaWx0ZXJzIChvciBhbnl0aGluZyB3aXRoIG5lZ2F0aXZlIGNvZWZmcywgdGhlIHJhbmdlIGNhbiBiZSBzbGlnaHRseQorICAgICAgICAgKiB3aWRlciBpbiBib3RoIGRpcmVjdGlvbnMuIFRvIGFjY291bnQgZm9yIHRoaXMgb3ZlcmZsb3csIHdlIHN1YnRyYWN0CisgICAgICAgICAqIGEgY29uc3RhbnQgc28gaXQgYWx3YXlzIGZpdHMgaW4gdGhlIHNpZ25lZCByYW5nZSAoYXNzdW1pbmcgYQorICAgICAgICAgKiByZWFzb25hYmxlIGZpbHRlclNpemUpLCBhbmQgcmUtYWRkIHRoYXQgYXQgdGhlIGVuZC4gKi8KKyAgICAgICAgdmFsIC09IDB4NDAwMDAwMDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmaWx0ZXJTaXplOyBqKyspCisgICAgICAgICAgICB2YWwgKz0gc3JjW2pdW2ldICogKHVuc2lnbmVkKWZpbHRlcltqXTsKKworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbaV0sIHZhbCwgMHg4MDAwLCBpbnQpOworICAgIH0KK30KKworI3VuZGVmIG91dHB1dF9waXhlbAorCisjZGVmaW5lIG91dHB1dF9waXhlbChwb3MsIHZhbCkgXAorICAgIGlmIChiaWdfZW5kaWFuKSB7IFwKKyAgICAgICAgQVZfV0IxNihwb3MsIGF2X2NsaXBfdWludHAyKHZhbCA+PiBzaGlmdCwgb3V0cHV0X2JpdHMpKTsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgQVZfV0wxNihwb3MsIGF2X2NsaXBfdWludHAyKHZhbCA+PiBzaGlmdCwgb3V0cHV0X2JpdHMpKTsgXAorICAgIH0KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZAoreXV2MnBsYW5lMV8xMF9jX3RlbXBsYXRlKGNvbnN0IGludDE2X3QgKnNyYywgdWludDE2X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWdfZW5kaWFuLCBpbnQgb3V0cHV0X2JpdHMpCit7CisgICAgaW50IGk7CisgICAgaW50IHNoaWZ0ID0gMTUgLSBvdXRwdXRfYml0czsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkc3RXOyBpKyspIHsKKyAgICAgICAgaW50IHZhbCA9IHNyY1tpXSArICgxIDw8IChzaGlmdCAtIDEpKTsKKyAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0W2ldLCB2YWwpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZAoreXV2MnBsYW5lWF8xMF9jX3RlbXBsYXRlKGNvbnN0IGludDE2X3QgKmZpbHRlciwgaW50IGZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKnNyYywgdWludDE2X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWdfZW5kaWFuLCBpbnQgb3V0cHV0X2JpdHMpCit7CisgICAgaW50IGk7CisgICAgaW50IHNoaWZ0ID0gMTEgKyAxNiAtIG91dHB1dF9iaXRzOworCisgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkrKykgeworICAgICAgICBpbnQgdmFsID0gMSA8PCAoc2hpZnQgLSAxKTsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpbHRlclNpemU7IGorKykKKyAgICAgICAgICAgIHZhbCArPSBzcmNbal1baV0gKiBmaWx0ZXJbal07CisKKyAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0W2ldLCB2YWwpOworICAgIH0KK30KKworI3VuZGVmIG91dHB1dF9waXhlbAorCisjZGVmaW5lIHl1djJOQlBTKGJpdHMsIEJFX0xFLCBpc19iZSwgdGVtcGxhdGVfc2l6ZSwgdHlwZVhfdCkgXAorc3RhdGljIHZvaWQgeXV2MnBsYW5lMV8gIyMgYml0cyAjIyBCRV9MRSAjIyBfYyhjb25zdCBpbnQxNl90ICpzcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaXRoZXIsIGludCBvZmZzZXQpXAoreyBcCisgICAgeXV2MnBsYW5lMV8gIyMgdGVtcGxhdGVfc2l6ZSAjIyBfY190ZW1wbGF0ZSgoY29uc3QgdHlwZVhfdCAqKSBzcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QgKikgZGVzdCwgZHN0VywgaXNfYmUsIGJpdHMpOyBcCit9XAorc3RhdGljIHZvaWQgeXV2MnBsYW5lWF8gIyMgYml0cyAjIyBCRV9MRSAjIyBfYyhjb25zdCBpbnQxNl90ICpmaWx0ZXIsIGludCBmaWx0ZXJTaXplLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqc3JjLCB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGl0aGVyLCBpbnQgb2Zmc2V0KVwKK3sgXAorICAgIHl1djJwbGFuZVhfIyMgdGVtcGxhdGVfc2l6ZSAjIyBfY190ZW1wbGF0ZShmaWx0ZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJTaXplLCAoY29uc3QgdHlwZVhfdCAqKikgc3JjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90ICopIGRlc3QsIGRzdFcsIGlzX2JlLCBiaXRzKTsgXAorfQoreXV2Mk5CUFMoIDksIEJFLCAxLCAxMCwgaW50MTZfdCkKK3l1djJOQlBTKCA5LCBMRSwgMCwgMTAsIGludDE2X3QpCit5dXYyTkJQUygxMCwgQkUsIDEsIDEwLCBpbnQxNl90KQoreXV2Mk5CUFMoMTAsIExFLCAwLCAxMCwgaW50MTZfdCkKK3l1djJOQlBTKDEyLCBCRSwgMSwgMTAsIGludDE2X3QpCit5dXYyTkJQUygxMiwgTEUsIDAsIDEwLCBpbnQxNl90KQoreXV2Mk5CUFMoMTQsIEJFLCAxLCAxMCwgaW50MTZfdCkKK3l1djJOQlBTKDE0LCBMRSwgMCwgMTAsIGludDE2X3QpCit5dXYyTkJQUygxNiwgQkUsIDEsIDE2LCBpbnQzMl90KQoreXV2Mk5CUFMoMTYsIExFLCAwLCAxNiwgaW50MzJfdCkKKworc3RhdGljIHZvaWQgeXV2MnBsYW5lWF84X2MoY29uc3QgaW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipzcmMsIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGl0aGVyLCBpbnQgb2Zmc2V0KQoreworICAgIGludCBpOworICAgIGZvciAoaT0wOyBpPGRzdFc7IGkrKykgeworICAgICAgICBpbnQgdmFsID0gZGl0aGVyWyhpICsgb2Zmc2V0KSAmIDddIDw8IDEyOworICAgICAgICBpbnQgajsKKyAgICAgICAgZm9yIChqPTA7IGo8ZmlsdGVyU2l6ZTsgaisrKQorICAgICAgICAgICAgdmFsICs9IHNyY1tqXVtpXSAqIGZpbHRlcltqXTsKKworICAgICAgICBkZXN0W2ldPSBhdl9jbGlwX3VpbnQ4KHZhbD4+MTkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgeXV2MnBsYW5lMV84X2MoY29uc3QgaW50MTZfdCAqc3JjLCB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpdGhlciwgaW50IG9mZnNldCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGk9MDsgaTxkc3RXOyBpKyspIHsKKyAgICAgICAgaW50IHZhbCA9IChzcmNbaV0gKyBkaXRoZXJbKGkgKyBvZmZzZXQpICYgN10pID4+IDc7CisgICAgICAgIGRlc3RbaV09IGF2X2NsaXBfdWludDgodmFsKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHl1djJudjEyY1hfYyhTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpjaHJGaWx0ZXIsIGludCBjaHJGaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclVTcmMsIGNvbnN0IGludDE2X3QgKipjaHJWU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCwgaW50IGNockRzdFcpCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGRzdEZvcm1hdCA9IGMtPmRzdEZvcm1hdDsKKyAgICBjb25zdCB1aW50OF90ICpjaHJEaXRoZXIgPSBjLT5jaHJEaXRoZXI4OworICAgIGludCBpOworCisgICAgaWYgKGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX05WMTIpCisgICAgICAgIGZvciAoaT0wOyBpPGNockRzdFc7IGkrKykgeworICAgICAgICAgICAgaW50IHUgPSBjaHJEaXRoZXJbaSAmIDddIDw8IDEyOworICAgICAgICAgICAgaW50IHYgPSBjaHJEaXRoZXJbKGkgKyAzKSAmIDddIDw8IDEyOworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBmb3IgKGo9MDsgajxjaHJGaWx0ZXJTaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICB1ICs9IGNoclVTcmNbal1baV0gKiBjaHJGaWx0ZXJbal07CisgICAgICAgICAgICAgICAgdiArPSBjaHJWU3JjW2pdW2ldICogY2hyRmlsdGVyW2pdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXN0WzIqaV09IGF2X2NsaXBfdWludDgodT4+MTkpOworICAgICAgICAgICAgZGVzdFsyKmkrMV09IGF2X2NsaXBfdWludDgodj4+MTkpOworICAgICAgICB9CisgICAgZWxzZQorICAgICAgICBmb3IgKGk9MDsgaTxjaHJEc3RXOyBpKyspIHsKKyAgICAgICAgICAgIGludCB1ID0gY2hyRGl0aGVyW2kgJiA3XSA8PCAxMjsKKyAgICAgICAgICAgIGludCB2ID0gY2hyRGl0aGVyWyhpICsgMykgJiA3XSA8PCAxMjsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgZm9yIChqPTA7IGo8Y2hyRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICAgICAgdSArPSBjaHJVU3JjW2pdW2ldICogY2hyRmlsdGVyW2pdOworICAgICAgICAgICAgICAgIHYgKz0gY2hyVlNyY1tqXVtpXSAqIGNockZpbHRlcltqXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVzdFsyKmldPSBhdl9jbGlwX3VpbnQ4KHY+PjE5KTsKKyAgICAgICAgICAgIGRlc3RbMippKzFdPSBhdl9jbGlwX3VpbnQ4KHU+PjE5KTsKKyAgICAgICAgfQorfQorCisjZGVmaW5lIGFjY3VtdWxhdGVfYml0KGFjYywgdmFsKSBcCisgICAgYWNjIDw8PSAxOyBcCisgICAgYWNjIHw9ICh2YWwpID49ICgxMjggKyAxMTApCisjZGVmaW5lIG91dHB1dF9waXhlbChwb3MsIGFjYykgXAorICAgIGlmICh0YXJnZXQgPT0gQVZfUElYX0ZNVF9NT05PQkxBQ0spIHsgXAorICAgICAgICBwb3MgPSBhY2M7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIHBvcyA9IH5hY2M7IFwKKyAgICB9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQKK3l1djJtb25vX1hfY190ZW1wbGF0ZShTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpsdW1GaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgaW50IGx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLCBjb25zdCBpbnQxNl90ICoqY2hyVVNyYywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqY2hyVlNyYywgaW50IGNockZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmFscFNyYywgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHksIGVudW0gQVZQaXhlbEZvcm1hdCB0YXJnZXQpCit7CisgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IGQxMjggPSBmZl9kaXRoZXJfOHg4XzIyMFt5JjddOworICAgIGludCBpOworICAgIHVuc2lnbmVkIGFjYyA9IDA7CisgICAgaW50IGVyciA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSArPSAyKSB7CisgICAgICAgIGludCBqOworICAgICAgICBpbnQgWTEgPSAxIDw8IDE4OworICAgICAgICBpbnQgWTIgPSAxIDw8IDE4OworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsdW1GaWx0ZXJTaXplOyBqKyspIHsKKyAgICAgICAgICAgIFkxICs9IGx1bVNyY1tqXVtpXSAgICogbHVtRmlsdGVyW2pdOworICAgICAgICAgICAgWTIgKz0gbHVtU3JjW2pdW2krMV0gKiBsdW1GaWx0ZXJbal07CisgICAgICAgIH0KKyAgICAgICAgWTEgPj49IDE5OworICAgICAgICBZMiA+Pj0gMTk7CisgICAgICAgIGlmICgoWTEgfCBZMikgJiAweDEwMCkgeworICAgICAgICAgICAgWTEgPSBhdl9jbGlwX3VpbnQ4KFkxKTsKKyAgICAgICAgICAgIFkyID0gYXZfY2xpcF91aW50OChZMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMtPmRpdGhlciA9PSBTV1NfRElUSEVSX0VEKSB7CisgICAgICAgICAgICBZMSArPSAoNyplcnIgKyAxKmMtPmRpdGhlcl9lcnJvclswXVtpXSArIDUqYy0+ZGl0aGVyX2Vycm9yWzBdW2krMV0gKyAzKmMtPmRpdGhlcl9lcnJvclswXVtpKzJdICsgOCAtIDI1Nik+PjQ7CisgICAgICAgICAgICBjLT5kaXRoZXJfZXJyb3JbMF1baV0gPSBlcnI7CisgICAgICAgICAgICBhY2MgPSAyKmFjYyArIChZMSA+PSAxMjgpOworICAgICAgICAgICAgWTEgLT0gMjIwKihhY2MmMSk7CisKKyAgICAgICAgICAgIGVyciA9IFkyICsgKCg3KlkxICsgMSpjLT5kaXRoZXJfZXJyb3JbMF1baSsxXSArIDUqYy0+ZGl0aGVyX2Vycm9yWzBdW2krMl0gKyAzKmMtPmRpdGhlcl9lcnJvclswXVtpKzNdICsgOCAtIDI1Nik+PjQpOworICAgICAgICAgICAgYy0+ZGl0aGVyX2Vycm9yWzBdW2krMV0gPSBZMTsKKyAgICAgICAgICAgIGFjYyA9IDIqYWNjICsgKGVyciA+PSAxMjgpOworICAgICAgICAgICAgZXJyIC09IDIyMCooYWNjJjEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWNjdW11bGF0ZV9iaXQoYWNjLCBZMSArIGQxMjhbKGkgKyAwKSAmIDddKTsKKyAgICAgICAgICAgIGFjY3VtdWxhdGVfYml0KGFjYywgWTIgKyBkMTI4WyhpICsgMSkgJiA3XSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpICYgNykgPT0gNikgeworICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCpkZXN0KyssIGFjYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgYy0+ZGl0aGVyX2Vycm9yWzBdW2ldID0gZXJyOworCisgICAgaWYgKGkgJiA2KSB7CisgICAgICAgIG91dHB1dF9waXhlbCgqZGVzdCwgYWNjKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQKK3l1djJtb25vXzJfY190ZW1wbGF0ZShTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphYnVmWzJdLCB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgeWFscGhhLCBpbnQgdXZhbHBoYSwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHRhcmdldCkKK3sKKyAgICBjb25zdCBpbnQxNl90ICpidWYwICA9IGJ1ZlswXSwgICpidWYxICA9IGJ1ZlsxXTsKKyAgICBjb25zdCB1aW50OF90ICogY29uc3QgZDEyOCA9IGZmX2RpdGhlcl84eDhfMjIwW3kgJiA3XTsKKyAgICBpbnQgIHlhbHBoYTEgPSA0MDk2IC0geWFscGhhOworICAgIGludCBpOworCisgICAgaWYgKGMtPmRpdGhlciA9PSBTV1NfRElUSEVSX0VEKSB7CisgICAgICAgIGludCBlcnIgPSAwOworICAgICAgICBpbnQgYWNjID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkgKz0yKSB7CisgICAgICAgICAgICBpbnQgWTsKKworICAgICAgICAgICAgWSA9IChidWYwW2kgKyAwXSAqIHlhbHBoYTEgKyBidWYxW2kgKyAwXSAqIHlhbHBoYSkgPj4gMTk7CisgICAgICAgICAgICBZICs9ICg3KmVyciArIDEqYy0+ZGl0aGVyX2Vycm9yWzBdW2ldICsgNSpjLT5kaXRoZXJfZXJyb3JbMF1baSsxXSArIDMqYy0+ZGl0aGVyX2Vycm9yWzBdW2krMl0gKyA4IC0gMjU2KT4+NDsKKyAgICAgICAgICAgIGMtPmRpdGhlcl9lcnJvclswXVtpXSA9IGVycjsKKyAgICAgICAgICAgIGFjYyA9IDIqYWNjICsgKFkgPj0gMTI4KTsKKyAgICAgICAgICAgIFkgLT0gMjIwKihhY2MmMSk7CisKKyAgICAgICAgICAgIGVyciA9IChidWYwW2kgKyAxXSAqIHlhbHBoYTEgKyBidWYxW2kgKyAxXSAqIHlhbHBoYSkgPj4gMTk7CisgICAgICAgICAgICBlcnIgKz0gKDcqWSArIDEqYy0+ZGl0aGVyX2Vycm9yWzBdW2krMV0gKyA1KmMtPmRpdGhlcl9lcnJvclswXVtpKzJdICsgMypjLT5kaXRoZXJfZXJyb3JbMF1baSszXSArIDggLSAyNTYpPj40OworICAgICAgICAgICAgYy0+ZGl0aGVyX2Vycm9yWzBdW2krMV0gPSBZOworICAgICAgICAgICAgYWNjID0gMiphY2MgKyAoZXJyID49IDEyOCk7CisgICAgICAgICAgICBlcnIgLT0gMjIwKihhY2MmMSk7CisKKyAgICAgICAgICAgIGlmICgoaSAmIDcpID09IDYpCisgICAgICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCpkZXN0KyssIGFjYyk7CisgICAgICAgIH0KKyAgICAgICAgYy0+ZGl0aGVyX2Vycm9yWzBdW2ldID0gZXJyOworICAgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkgKz0gOCkgeworICAgICAgICBpbnQgWSwgYWNjID0gMDsKKworICAgICAgICBZID0gKGJ1ZjBbaSArIDBdICogeWFscGhhMSArIGJ1ZjFbaSArIDBdICogeWFscGhhKSA+PiAxOTsKKyAgICAgICAgYWNjdW11bGF0ZV9iaXQoYWNjLCBZICsgZDEyOFswXSk7CisgICAgICAgIFkgPSAoYnVmMFtpICsgMV0gKiB5YWxwaGExICsgYnVmMVtpICsgMV0gKiB5YWxwaGEpID4+IDE5OworICAgICAgICBhY2N1bXVsYXRlX2JpdChhY2MsIFkgKyBkMTI4WzFdKTsKKyAgICAgICAgWSA9IChidWYwW2kgKyAyXSAqIHlhbHBoYTEgKyBidWYxW2kgKyAyXSAqIHlhbHBoYSkgPj4gMTk7CisgICAgICAgIGFjY3VtdWxhdGVfYml0KGFjYywgWSArIGQxMjhbMl0pOworICAgICAgICBZID0gKGJ1ZjBbaSArIDNdICogeWFscGhhMSArIGJ1ZjFbaSArIDNdICogeWFscGhhKSA+PiAxOTsKKyAgICAgICAgYWNjdW11bGF0ZV9iaXQoYWNjLCBZICsgZDEyOFszXSk7CisgICAgICAgIFkgPSAoYnVmMFtpICsgNF0gKiB5YWxwaGExICsgYnVmMVtpICsgNF0gKiB5YWxwaGEpID4+IDE5OworICAgICAgICBhY2N1bXVsYXRlX2JpdChhY2MsIFkgKyBkMTI4WzRdKTsKKyAgICAgICAgWSA9IChidWYwW2kgKyA1XSAqIHlhbHBoYTEgKyBidWYxW2kgKyA1XSAqIHlhbHBoYSkgPj4gMTk7CisgICAgICAgIGFjY3VtdWxhdGVfYml0KGFjYywgWSArIGQxMjhbNV0pOworICAgICAgICBZID0gKGJ1ZjBbaSArIDZdICogeWFscGhhMSArIGJ1ZjFbaSArIDZdICogeWFscGhhKSA+PiAxOTsKKyAgICAgICAgYWNjdW11bGF0ZV9iaXQoYWNjLCBZICsgZDEyOFs2XSk7CisgICAgICAgIFkgPSAoYnVmMFtpICsgN10gKiB5YWxwaGExICsgYnVmMVtpICsgN10gKiB5YWxwaGEpID4+IDE5OworICAgICAgICBhY2N1bXVsYXRlX2JpdChhY2MsIFkgKyBkMTI4WzddKTsKKworICAgICAgICBvdXRwdXRfcGl4ZWwoKmRlc3QrKywgYWNjKTsKKyAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkCit5dXYybW9ub18xX2NfdGVtcGxhdGUoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqYnVmMCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp1YnVmWzJdLCBjb25zdCBpbnQxNl90ICp2YnVmWzJdLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmFidWYwLCB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZhbHBoYSwgaW50IHksIGVudW0gQVZQaXhlbEZvcm1hdCB0YXJnZXQpCit7CisgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IGQxMjggPSBmZl9kaXRoZXJfOHg4XzIyMFt5ICYgN107CisgICAgaW50IGk7CisKKyAgICBpZiAoYy0+ZGl0aGVyID09IFNXU19ESVRIRVJfRUQpIHsKKyAgICAgICAgaW50IGVyciA9IDA7CisgICAgICAgIGludCBhY2MgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSArPTIpIHsKKyAgICAgICAgICAgIGludCBZOworCisgICAgICAgICAgICBZID0gKChidWYwW2kgKyAwXSArIDY0KSA+PiA3KTsKKyAgICAgICAgICAgIFkgKz0gKDcqZXJyICsgMSpjLT5kaXRoZXJfZXJyb3JbMF1baV0gKyA1KmMtPmRpdGhlcl9lcnJvclswXVtpKzFdICsgMypjLT5kaXRoZXJfZXJyb3JbMF1baSsyXSArIDggLSAyNTYpPj40OworICAgICAgICAgICAgYy0+ZGl0aGVyX2Vycm9yWzBdW2ldID0gZXJyOworICAgICAgICAgICAgYWNjID0gMiphY2MgKyAoWSA+PSAxMjgpOworICAgICAgICAgICAgWSAtPSAyMjAqKGFjYyYxKTsKKworICAgICAgICAgICAgZXJyID0gKChidWYwW2kgKyAxXSArIDY0KSA+PiA3KTsKKyAgICAgICAgICAgIGVyciArPSAoNypZICsgMSpjLT5kaXRoZXJfZXJyb3JbMF1baSsxXSArIDUqYy0+ZGl0aGVyX2Vycm9yWzBdW2krMl0gKyAzKmMtPmRpdGhlcl9lcnJvclswXVtpKzNdICsgOCAtIDI1Nik+PjQ7CisgICAgICAgICAgICBjLT5kaXRoZXJfZXJyb3JbMF1baSsxXSA9IFk7CisgICAgICAgICAgICBhY2MgPSAyKmFjYyArIChlcnIgPj0gMTI4KTsKKyAgICAgICAgICAgIGVyciAtPSAyMjAqKGFjYyYxKTsKKworICAgICAgICAgICAgaWYgKChpICYgNykgPT0gNikKKyAgICAgICAgICAgICAgICBvdXRwdXRfcGl4ZWwoKmRlc3QrKywgYWNjKTsKKyAgICAgICAgfQorICAgICAgICBjLT5kaXRoZXJfZXJyb3JbMF1baV0gPSBlcnI7CisgICAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSArPSA4KSB7CisgICAgICAgIGludCBhY2MgPSAwOworICAgICAgICBhY2N1bXVsYXRlX2JpdChhY2MsICgoYnVmMFtpICsgMF0gKyA2NCkgPj4gNykgKyBkMTI4WzBdKTsKKyAgICAgICAgYWNjdW11bGF0ZV9iaXQoYWNjLCAoKGJ1ZjBbaSArIDFdICsgNjQpID4+IDcpICsgZDEyOFsxXSk7CisgICAgICAgIGFjY3VtdWxhdGVfYml0KGFjYywgKChidWYwW2kgKyAyXSArIDY0KSA+PiA3KSArIGQxMjhbMl0pOworICAgICAgICBhY2N1bXVsYXRlX2JpdChhY2MsICgoYnVmMFtpICsgM10gKyA2NCkgPj4gNykgKyBkMTI4WzNdKTsKKyAgICAgICAgYWNjdW11bGF0ZV9iaXQoYWNjLCAoKGJ1ZjBbaSArIDRdICsgNjQpID4+IDcpICsgZDEyOFs0XSk7CisgICAgICAgIGFjY3VtdWxhdGVfYml0KGFjYywgKChidWYwW2kgKyA1XSArIDY0KSA+PiA3KSArIGQxMjhbNV0pOworICAgICAgICBhY2N1bXVsYXRlX2JpdChhY2MsICgoYnVmMFtpICsgNl0gKyA2NCkgPj4gNykgKyBkMTI4WzZdKTsKKyAgICAgICAgYWNjdW11bGF0ZV9iaXQoYWNjLCAoKGJ1ZjBbaSArIDddICsgNjQpID4+IDcpICsgZDEyOFs3XSk7CisKKyAgICAgICAgb3V0cHV0X3BpeGVsKCpkZXN0KyssIGFjYyk7CisgICAgfQorICAgIH0KK30KKworI3VuZGVmIG91dHB1dF9waXhlbAorI3VuZGVmIGFjY3VtdWxhdGVfYml0CisKKyNkZWZpbmUgWVVWMlBBQ0tFRFdSQVBQRVIobmFtZSwgYmFzZSwgZXh0LCBmbXQpIFwKK3N0YXRpYyB2b2lkIG5hbWUgIyMgZXh0ICMjIF9YX2MoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqbHVtRmlsdGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipsdW1TcmMsIGludCBsdW1GaWx0ZXJTaXplLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNockZpbHRlciwgY29uc3QgaW50MTZfdCAqKmNoclVTcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclZTcmMsIGludCBjaHJGaWx0ZXJTaXplLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiphbHBTcmMsIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5KSBcCit7IFwKKyAgICBuYW1lICMjIGJhc2UgIyMgX1hfY190ZW1wbGF0ZShjLCBsdW1GaWx0ZXIsIGx1bVNyYywgbHVtRmlsdGVyU2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNockZpbHRlciwgY2hyVVNyYywgY2hyVlNyYywgY2hyRmlsdGVyU2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscFNyYywgZGVzdCwgZHN0VywgeSwgZm10KTsgXAorfSBcCisgXAorc3RhdGljIHZvaWQgbmFtZSAjIyBleHQgIyMgXzJfYyhTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpidWZbMl0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphYnVmWzJdLCB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeWFscGhhLCBpbnQgdXZhbHBoYSwgaW50IHkpIFwKK3sgXAorICAgIG5hbWUgIyMgYmFzZSAjIyBfMl9jX3RlbXBsYXRlKGMsIGJ1ZiwgdWJ1ZiwgdmJ1ZiwgYWJ1ZiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QsIGRzdFcsIHlhbHBoYSwgdXZhbHBoYSwgeSwgZm10KTsgXAorfSBcCisgXAorc3RhdGljIHZvaWQgbmFtZSAjIyBleHQgIyMgXzFfYyhTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpidWYwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWZbMl0sIGNvbnN0IGludDE2X3QgKnZidWZbMl0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqYWJ1ZjAsIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dmFscGhhLCBpbnQgeSkgXAoreyBcCisgICAgbmFtZSAjIyBiYXNlICMjIF8xX2NfdGVtcGxhdGUoYywgYnVmMCwgdWJ1ZiwgdmJ1ZiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFidWYwLCBkZXN0LCBkc3RXLCB1dmFscGhhLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwgZm10KTsgXAorfQorCitZVVYyUEFDS0VEV1JBUFBFUih5dXYybW9ubywsIHdoaXRlLCBBVl9QSVhfRk1UX01PTk9XSElURSkKK1lVVjJQQUNLRURXUkFQUEVSKHl1djJtb25vLCwgYmxhY2ssIEFWX1BJWF9GTVRfTU9OT0JMQUNLKQorCisjZGVmaW5lIG91dHB1dF9waXhlbHMocG9zLCBZMSwgVSwgWTIsIFYpIFwKKyAgICBpZiAodGFyZ2V0ID09IEFWX1BJWF9GTVRfWVVZVjQyMikgeyBcCisgICAgICAgIGRlc3RbcG9zICsgMF0gPSBZMTsgXAorICAgICAgICBkZXN0W3BvcyArIDFdID0gVTsgIFwKKyAgICAgICAgZGVzdFtwb3MgKyAyXSA9IFkyOyBcCisgICAgICAgIGRlc3RbcG9zICsgM10gPSBWOyAgXAorICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09IEFWX1BJWF9GTVRfWVZZVTQyMikgeyBcCisgICAgICAgIGRlc3RbcG9zICsgMF0gPSBZMTsgXAorICAgICAgICBkZXN0W3BvcyArIDFdID0gVjsgIFwKKyAgICAgICAgZGVzdFtwb3MgKyAyXSA9IFkyOyBcCisgICAgICAgIGRlc3RbcG9zICsgM10gPSBVOyAgXAorICAgIH0gZWxzZSB7IC8qIEFWX1BJWF9GTVRfVVlWWTQyMiAqLyBcCisgICAgICAgIGRlc3RbcG9zICsgMF0gPSBVOyAgXAorICAgICAgICBkZXN0W3BvcyArIDFdID0gWTE7IFwKKyAgICAgICAgZGVzdFtwb3MgKyAyXSA9IFY7ICBcCisgICAgICAgIGRlc3RbcG9zICsgM10gPSBZMjsgXAorICAgIH0KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZAoreXV2MjQyMl9YX2NfdGVtcGxhdGUoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqbHVtRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgaW50IGx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpjaHJGaWx0ZXIsIGNvbnN0IGludDE2X3QgKipjaHJVU3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclZTcmMsIGludCBjaHJGaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmFscFNyYywgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICBpbnQgeSwgZW51bSBBVlBpeGVsRm9ybWF0IHRhcmdldCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoKGRzdFcgKyAxKSA+PiAxKTsgaSsrKSB7CisgICAgICAgIGludCBqOworICAgICAgICBpbnQgWTEgPSAxIDw8IDE4OworICAgICAgICBpbnQgWTIgPSAxIDw8IDE4OworICAgICAgICBpbnQgVSAgPSAxIDw8IDE4OworICAgICAgICBpbnQgViAgPSAxIDw8IDE4OworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsdW1GaWx0ZXJTaXplOyBqKyspIHsKKyAgICAgICAgICAgIFkxICs9IGx1bVNyY1tqXVtpICogMl0gICAgICogbHVtRmlsdGVyW2pdOworICAgICAgICAgICAgWTIgKz0gbHVtU3JjW2pdW2kgKiAyICsgMV0gKiBsdW1GaWx0ZXJbal07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGNockZpbHRlclNpemU7IGorKykgeworICAgICAgICAgICAgVSArPSBjaHJVU3JjW2pdW2ldICogY2hyRmlsdGVyW2pdOworICAgICAgICAgICAgViArPSBjaHJWU3JjW2pdW2ldICogY2hyRmlsdGVyW2pdOworICAgICAgICB9CisgICAgICAgIFkxID4+PSAxOTsKKyAgICAgICAgWTIgPj49IDE5OworICAgICAgICBVICA+Pj0gMTk7CisgICAgICAgIFYgID4+PSAxOTsKKyAgICAgICAgaWYgKChZMSB8IFkyIHwgVSB8IFYpICYgMHgxMDApIHsKKyAgICAgICAgICAgIFkxID0gYXZfY2xpcF91aW50OChZMSk7CisgICAgICAgICAgICBZMiA9IGF2X2NsaXBfdWludDgoWTIpOworICAgICAgICAgICAgVSAgPSBhdl9jbGlwX3VpbnQ4KFUpOworICAgICAgICAgICAgViAgPSBhdl9jbGlwX3VpbnQ4KFYpOworICAgICAgICB9CisgICAgICAgIG91dHB1dF9waXhlbHMoNCppLCBZMSwgVSwgWTIsIFYpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZAoreXV2MjQyMl8yX2NfdGVtcGxhdGUoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqYnVmWzJdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmFidWZbMl0sIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgaW50IHlhbHBoYSwgaW50IHV2YWxwaGEsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHRhcmdldCkKK3sKKyAgICBjb25zdCBpbnQxNl90ICpidWYwICA9IGJ1ZlswXSwgICpidWYxICA9IGJ1ZlsxXSwKKyAgICAgICAgICAgICAgICAgICp1YnVmMCA9IHVidWZbMF0sICp1YnVmMSA9IHVidWZbMV0sCisgICAgICAgICAgICAgICAgICAqdmJ1ZjAgPSB2YnVmWzBdLCAqdmJ1ZjEgPSB2YnVmWzFdOworICAgIGludCAgeWFscGhhMSA9IDQwOTYgLSB5YWxwaGE7CisgICAgaW50IHV2YWxwaGExID0gNDA5NiAtIHV2YWxwaGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKChkc3RXICsgMSkgPj4gMSk7IGkrKykgeworICAgICAgICBpbnQgWTEgPSAoYnVmMFtpICogMl0gICAgICogeWFscGhhMSAgKyBidWYxW2kgKiAyXSAgICAgKiB5YWxwaGEpICA+PiAxOTsKKyAgICAgICAgaW50IFkyID0gKGJ1ZjBbaSAqIDIgKyAxXSAqIHlhbHBoYTEgICsgYnVmMVtpICogMiArIDFdICogeWFscGhhKSAgPj4gMTk7CisgICAgICAgIGludCBVICA9ICh1YnVmMFtpXSAgICAgICAgKiB1dmFscGhhMSArIHVidWYxW2ldICAgICAgICAqIHV2YWxwaGEpID4+IDE5OworICAgICAgICBpbnQgViAgPSAodmJ1ZjBbaV0gICAgICAgICogdXZhbHBoYTEgKyB2YnVmMVtpXSAgICAgICAgKiB1dmFscGhhKSA+PiAxOTsKKworICAgICAgICBpZiAoKFkxIHwgWTIgfCBVIHwgVikgJiAweDEwMCkgeworICAgICAgICAgICAgWTEgPSBhdl9jbGlwX3VpbnQ4KFkxKTsKKyAgICAgICAgICAgIFkyID0gYXZfY2xpcF91aW50OChZMik7CisgICAgICAgICAgICBVICA9IGF2X2NsaXBfdWludDgoVSk7CisgICAgICAgICAgICBWICA9IGF2X2NsaXBfdWludDgoVik7CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXRfcGl4ZWxzKGkgKiA0LCBZMSwgVSwgWTIsIFYpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZAoreXV2MjQyMl8xX2NfdGVtcGxhdGUoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqYnVmMCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWZbMl0sIGNvbnN0IGludDE2X3QgKnZidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphYnVmMCwgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdXZhbHBoYSwgaW50IHksIGVudW0gQVZQaXhlbEZvcm1hdCB0YXJnZXQpCit7CisgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjAgPSB1YnVmWzBdLCAqdmJ1ZjAgPSB2YnVmWzBdOworICAgIGludCBpOworCisgICAgaWYgKHV2YWxwaGEgPCAyMDQ4KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoKGRzdFcgKyAxKSA+PiAxKTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgWTEgPSAoYnVmMFtpICogMiAgICBdKzY0KSA+PiA3OworICAgICAgICAgICAgaW50IFkyID0gKGJ1ZjBbaSAqIDIgKyAxXSs2NCkgPj4gNzsKKyAgICAgICAgICAgIGludCBVICA9ICh1YnVmMFtpXSAgICAgICArNjQpID4+IDc7CisgICAgICAgICAgICBpbnQgViAgPSAodmJ1ZjBbaV0gICAgICAgKzY0KSA+PiA3OworCisgICAgICAgICAgICBpZiAoKFkxIHwgWTIgfCBVIHwgVikgJiAweDEwMCkgeworICAgICAgICAgICAgICAgIFkxID0gYXZfY2xpcF91aW50OChZMSk7CisgICAgICAgICAgICAgICAgWTIgPSBhdl9jbGlwX3VpbnQ4KFkyKTsKKyAgICAgICAgICAgICAgICBVICA9IGF2X2NsaXBfdWludDgoVSk7CisgICAgICAgICAgICAgICAgViAgPSBhdl9jbGlwX3VpbnQ4KFYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBZMSA9IGF2X2NsaXBfdWludDgoWTEpOworICAgICAgICAgICAgWTIgPSBhdl9jbGlwX3VpbnQ4KFkyKTsKKyAgICAgICAgICAgIFUgID0gYXZfY2xpcF91aW50OChVKTsKKyAgICAgICAgICAgIFYgID0gYXZfY2xpcF91aW50OChWKTsKKworICAgICAgICAgICAgb3V0cHV0X3BpeGVscyhpICogNCwgWTEsIFUsIFkyLCBWKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlsxXSwgKnZidWYxID0gdmJ1ZlsxXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICgoZHN0VyArIDEpID4+IDEpOyBpKyspIHsKKyAgICAgICAgICAgIGludCBZMSA9IChidWYwW2kgKiAyICAgIF0gICAgKyA2NCkgPj4gNzsKKyAgICAgICAgICAgIGludCBZMiA9IChidWYwW2kgKiAyICsgMV0gICAgKyA2NCkgPj4gNzsKKyAgICAgICAgICAgIGludCBVICA9ICh1YnVmMFtpXSArIHVidWYxW2ldKzEyOCkgPj4gODsKKyAgICAgICAgICAgIGludCBWICA9ICh2YnVmMFtpXSArIHZidWYxW2ldKzEyOCkgPj4gODsKKworICAgICAgICAgICAgaWYgKChZMSB8IFkyIHwgVSB8IFYpICYgMHgxMDApIHsKKyAgICAgICAgICAgICAgICBZMSA9IGF2X2NsaXBfdWludDgoWTEpOworICAgICAgICAgICAgICAgIFkyID0gYXZfY2xpcF91aW50OChZMik7CisgICAgICAgICAgICAgICAgVSAgPSBhdl9jbGlwX3VpbnQ4KFUpOworICAgICAgICAgICAgICAgIFYgID0gYXZfY2xpcF91aW50OChWKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgWTEgPSBhdl9jbGlwX3VpbnQ4KFkxKTsKKyAgICAgICAgICAgIFkyID0gYXZfY2xpcF91aW50OChZMik7CisgICAgICAgICAgICBVICA9IGF2X2NsaXBfdWludDgoVSk7CisgICAgICAgICAgICBWICA9IGF2X2NsaXBfdWludDgoVik7CisKKyAgICAgICAgICAgIG91dHB1dF9waXhlbHMoaSAqIDQsIFkxLCBVLCBZMiwgVik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyN1bmRlZiBvdXRwdXRfcGl4ZWxzCisKK1lVVjJQQUNLRURXUkFQUEVSKHl1djIsIDQyMiwgeXV5djQyMiwgQVZfUElYX0ZNVF9ZVVlWNDIyKQorWVVWMlBBQ0tFRFdSQVBQRVIoeXV2MiwgNDIyLCB5dnl1NDIyLCBBVl9QSVhfRk1UX1lWWVU0MjIpCitZVVYyUEFDS0VEV1JBUFBFUih5dXYyLCA0MjIsIHV5dnk0MjIsIEFWX1BJWF9GTVRfVVlWWTQyMikKKworI2RlZmluZSBSX0IgKCh0YXJnZXQgPT0gQVZfUElYX0ZNVF9SR0I0OExFIHx8IHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjQ4QkUgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCQTY0TEUgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCQTY0QkUpID8gUiA6IEIpCisjZGVmaW5lIEJfUiAoKHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjQ4TEUgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCNDhCRSB8fCB0YXJnZXQgPT0gQVZfUElYX0ZNVF9SR0JBNjRMRSB8fCB0YXJnZXQgPT0gQVZfUElYX0ZNVF9SR0JBNjRCRSkgPyBCIDogUikKKyNkZWZpbmUgb3V0cHV0X3BpeGVsKHBvcywgdmFsKSBcCisgICAgaWYgKGlzQkUodGFyZ2V0KSkgeyBcCisgICAgICAgIEFWX1dCMTYocG9zLCB2YWwpOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBBVl9XTDE2KHBvcywgdmFsKTsgXAorICAgIH0KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZAoreXV2MnJnYmE2NF9YX2NfdGVtcGxhdGUoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqbHVtRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICoqbHVtU3JjLCBpbnQgbHVtRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLCBjb25zdCBpbnQzMl90ICoqY2hyVVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqKmNoclZTcmMsIGludCBjaHJGaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICoqYWxwU3JjLCB1aW50MTZfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB5LCBlbnVtIEFWUGl4ZWxGb3JtYXQgdGFyZ2V0LCBpbnQgaGFzQWxwaGEpCit7CisgICAgaW50IGk7CisgICAgaW50IEExID0gMHhmZmZmPDwxNCwgQTIgPSAweGZmZmY8PDE0OworCisgICAgZm9yIChpID0gMDsgaSA8ICgoZHN0VyArIDEpID4+IDEpOyBpKyspIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGludCBZMSA9IC0weDQwMDAwMDAwOworICAgICAgICBpbnQgWTIgPSAtMHg0MDAwMDAwMDsKKyAgICAgICAgaW50IFUgID0gLTEyOCA8PCAyMzsgLy8gMTkKKyAgICAgICAgaW50IFYgID0gLTEyOCA8PCAyMzsKKyAgICAgICAgaW50IFIsIEcsIEI7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGx1bUZpbHRlclNpemU7IGorKykgeworICAgICAgICAgICAgWTEgKz0gbHVtU3JjW2pdW2kgKiAyXSAgICAgKiAodW5zaWduZWQpbHVtRmlsdGVyW2pdOworICAgICAgICAgICAgWTIgKz0gbHVtU3JjW2pdW2kgKiAyICsgMV0gKiAodW5zaWduZWQpbHVtRmlsdGVyW2pdOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaHJGaWx0ZXJTaXplOyBqKyspIHs7CisgICAgICAgICAgICBVICs9IGNoclVTcmNbal1baV0gKiAodW5zaWduZWQpY2hyRmlsdGVyW2pdOworICAgICAgICAgICAgViArPSBjaHJWU3JjW2pdW2ldICogKHVuc2lnbmVkKWNockZpbHRlcltqXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYXNBbHBoYSkgeworICAgICAgICAgICAgQTEgPSAtMHg0MDAwMDAwMDsKKyAgICAgICAgICAgIEEyID0gLTB4NDAwMDAwMDA7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbHVtRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICAgICAgQTEgKz0gYWxwU3JjW2pdW2kgKiAyXSAgICAgKiAodW5zaWduZWQpbHVtRmlsdGVyW2pdOworICAgICAgICAgICAgICAgIEEyICs9IGFscFNyY1tqXVtpICogMiArIDFdICogKHVuc2lnbmVkKWx1bUZpbHRlcltqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEExID4+PSAxOworICAgICAgICAgICAgQTEgKz0gMHgyMDAwMjAwMDsKKyAgICAgICAgICAgIEEyID4+PSAxOworICAgICAgICAgICAgQTIgKz0gMHgyMDAwMjAwMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDhiaXQ6IDEyKzE1PTI3OyAxNi1iaXQ6IDEyKzE5PTMxCisgICAgICAgIFkxID4+PSAxNDsgLy8gMTAKKyAgICAgICAgWTEgKz0gMHgxMDAwMDsKKyAgICAgICAgWTIgPj49IDE0OworICAgICAgICBZMiArPSAweDEwMDAwOworICAgICAgICBVICA+Pj0gMTQ7CisgICAgICAgIFYgID4+PSAxNDsKKworICAgICAgICAvLyA4Yml0OiAyNyAtPiAxN2JpdCwgMTZiaXQ6IDMxIC0gMTQgPSAxN2JpdAorICAgICAgICBZMSAtPSBjLT55dXYycmdiX3lfb2Zmc2V0OworICAgICAgICBZMiAtPSBjLT55dXYycmdiX3lfb2Zmc2V0OworICAgICAgICBZMSAqPSBjLT55dXYycmdiX3lfY29lZmY7CisgICAgICAgIFkyICo9IGMtPnl1djJyZ2JfeV9jb2VmZjsKKyAgICAgICAgWTEgKz0gMSA8PCAxMzsgLy8gMjEKKyAgICAgICAgWTIgKz0gMSA8PCAxMzsKKyAgICAgICAgLy8gOGJpdDogMTcgKyAxM2JpdCA9IDMwYml0LCAxNmJpdDogMTcgKyAxM2JpdCA9IDMwYml0CisKKyAgICAgICAgUiA9IFYgKiBjLT55dXYycmdiX3Yycl9jb2VmZjsKKyAgICAgICAgRyA9IFYgKiBjLT55dXYycmdiX3YyZ19jb2VmZiArIFUgKiBjLT55dXYycmdiX3UyZ19jb2VmZjsKKyAgICAgICAgQiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUgKiBjLT55dXYycmdiX3UyYl9jb2VmZjsKKworICAgICAgICAvLyA4Yml0OiAzMCAtIDIyID0gOGJpdCwgMTZiaXQ6IDMwYml0IC0gMTQgPSAxNmJpdAorICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbMF0sIGF2X2NsaXBfdWludHAyKFJfQiArIFkxLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbMV0sIGF2X2NsaXBfdWludHAyKCAgRyArIFkxLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbMl0sIGF2X2NsaXBfdWludHAyKEJfUiArIFkxLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbM10sIGF2X2NsaXBfdWludHAyKEExICAgICAgLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbNF0sIGF2X2NsaXBfdWludHAyKFJfQiArIFkyLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbNV0sIGF2X2NsaXBfdWludHAyKCAgRyArIFkyLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbNl0sIGF2X2NsaXBfdWludHAyKEJfUiArIFkyLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbN10sIGF2X2NsaXBfdWludHAyKEEyICAgICAgLCAzMCkgPj4gMTQpOworICAgICAgICBkZXN0ICs9IDg7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkCit5dXYycmdiYTY0XzJfY190ZW1wbGF0ZShTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQzMl90ICpidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKnVidWZbMl0sIGNvbnN0IGludDMyX3QgKnZidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmFidWZbMl0sIHVpbnQxNl90ICpkZXN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHlhbHBoYSwgaW50IHV2YWxwaGEsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgdGFyZ2V0LCBpbnQgaGFzQWxwaGEpCit7CisgICAgY29uc3QgaW50MzJfdCAqYnVmMCAgPSBidWZbMF0sICAqYnVmMSAgPSBidWZbMV0sCisgICAgICAgICAgICAgICAgICAqdWJ1ZjAgPSB1YnVmWzBdLCAqdWJ1ZjEgPSB1YnVmWzFdLAorICAgICAgICAgICAgICAgICAgKnZidWYwID0gdmJ1ZlswXSwgKnZidWYxID0gdmJ1ZlsxXSwKKyAgICAgICAgICAgICAgICAgICphYnVmMCA9IGhhc0FscGhhID8gYWJ1ZlswXSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAqYWJ1ZjEgPSBoYXNBbHBoYSA/IGFidWZbMV0gOiBOVUxMOworICAgIGludCAgeWFscGhhMSA9IDQwOTYgLSB5YWxwaGE7CisgICAgaW50IHV2YWxwaGExID0gNDA5NiAtIHV2YWxwaGE7CisgICAgaW50IGk7CisgICAgaW50IEExID0gMHhmZmZmPDwxNCwgQTIgPSAweGZmZmY8PDE0OworCisgICAgZm9yIChpID0gMDsgaSA8ICgoZHN0VyArIDEpID4+IDEpOyBpKyspIHsKKyAgICAgICAgaW50IFkxID0gKGJ1ZjBbaSAqIDJdICAgICAqIHlhbHBoYTEgICsgYnVmMVtpICogMl0gICAgICogeWFscGhhKSA+PiAxNDsKKyAgICAgICAgaW50IFkyID0gKGJ1ZjBbaSAqIDIgKyAxXSAqIHlhbHBoYTEgICsgYnVmMVtpICogMiArIDFdICogeWFscGhhKSA+PiAxNDsKKyAgICAgICAgaW50IFUgID0gKHVidWYwW2ldICAgICAgICAqIHV2YWxwaGExICsgdWJ1ZjFbaV0gICAgICAgICogdXZhbHBoYSArICgtMTI4IDw8IDIzKSkgPj4gMTQ7CisgICAgICAgIGludCBWICA9ICh2YnVmMFtpXSAgICAgICAgKiB1dmFscGhhMSArIHZidWYxW2ldICAgICAgICAqIHV2YWxwaGEgKyAoLTEyOCA8PCAyMykpID4+IDE0OworICAgICAgICBpbnQgUiwgRywgQjsKKworICAgICAgICBZMSAtPSBjLT55dXYycmdiX3lfb2Zmc2V0OworICAgICAgICBZMiAtPSBjLT55dXYycmdiX3lfb2Zmc2V0OworICAgICAgICBZMSAqPSBjLT55dXYycmdiX3lfY29lZmY7CisgICAgICAgIFkyICo9IGMtPnl1djJyZ2JfeV9jb2VmZjsKKyAgICAgICAgWTEgKz0gMSA8PCAxMzsKKyAgICAgICAgWTIgKz0gMSA8PCAxMzsKKworICAgICAgICBSID0gViAqIGMtPnl1djJyZ2JfdjJyX2NvZWZmOworICAgICAgICBHID0gViAqIGMtPnl1djJyZ2JfdjJnX2NvZWZmICsgVSAqIGMtPnl1djJyZ2JfdTJnX2NvZWZmOworICAgICAgICBCID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVSAqIGMtPnl1djJyZ2JfdTJiX2NvZWZmOworCisgICAgICAgIGlmIChoYXNBbHBoYSkgeworICAgICAgICAgICAgQTEgPSAoYWJ1ZjBbaSAqIDIgICAgXSAqIHlhbHBoYTEgKyBhYnVmMVtpICogMiAgICBdICogeWFscGhhKSA+PiAxOworICAgICAgICAgICAgQTIgPSAoYWJ1ZjBbaSAqIDIgKyAxXSAqIHlhbHBoYTEgKyBhYnVmMVtpICogMiArIDFdICogeWFscGhhKSA+PiAxOworCisgICAgICAgICAgICBBMSArPSAxIDw8IDEzOworICAgICAgICAgICAgQTIgKz0gMSA8PCAxMzsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFswXSwgYXZfY2xpcF91aW50cDIoUl9CICsgWTEsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFsxXSwgYXZfY2xpcF91aW50cDIoICBHICsgWTEsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFsyXSwgYXZfY2xpcF91aW50cDIoQl9SICsgWTEsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFszXSwgYXZfY2xpcF91aW50cDIoQTEgICAgICAsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFs0XSwgYXZfY2xpcF91aW50cDIoUl9CICsgWTIsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFs1XSwgYXZfY2xpcF91aW50cDIoICBHICsgWTIsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFs2XSwgYXZfY2xpcF91aW50cDIoQl9SICsgWTIsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFs3XSwgYXZfY2xpcF91aW50cDIoQTIgICAgICAsIDMwKSA+PiAxNCk7CisgICAgICAgIGRlc3QgKz0gODsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQKK3l1djJyZ2JhNjRfMV9jX3RlbXBsYXRlKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDMyX3QgKmJ1ZjAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKnVidWZbMl0sIGNvbnN0IGludDMyX3QgKnZidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmFidWYwLCB1aW50MTZfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB1dmFscGhhLCBpbnQgeSwgZW51bSBBVlBpeGVsRm9ybWF0IHRhcmdldCwgaW50IGhhc0FscGhhKQoreworICAgIGNvbnN0IGludDMyX3QgKnVidWYwID0gdWJ1ZlswXSwgKnZidWYwID0gdmJ1ZlswXTsKKyAgICBpbnQgaTsKKyAgICBpbnQgQTEgPSAweGZmZmY8PDE0LCBBMj0gMHhmZmZmPDwxNDsKKworICAgIGlmICh1dmFscGhhIDwgMjA0OCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKChkc3RXICsgMSkgPj4gMSk7IGkrKykgeworICAgICAgICAgICAgaW50IFkxID0gKGJ1ZjBbaSAqIDJdICAgICkgPj4gMjsKKyAgICAgICAgICAgIGludCBZMiA9IChidWYwW2kgKiAyICsgMV0pID4+IDI7CisgICAgICAgICAgICBpbnQgVSAgPSAodWJ1ZjBbaV0gKyAoLTEyOCA8PCAxMSkpID4+IDI7CisgICAgICAgICAgICBpbnQgViAgPSAodmJ1ZjBbaV0gKyAoLTEyOCA8PCAxMSkpID4+IDI7CisgICAgICAgICAgICBpbnQgUiwgRywgQjsKKworICAgICAgICAgICAgWTEgLT0gYy0+eXV2MnJnYl95X29mZnNldDsKKyAgICAgICAgICAgIFkyIC09IGMtPnl1djJyZ2JfeV9vZmZzZXQ7CisgICAgICAgICAgICBZMSAqPSBjLT55dXYycmdiX3lfY29lZmY7CisgICAgICAgICAgICBZMiAqPSBjLT55dXYycmdiX3lfY29lZmY7CisgICAgICAgICAgICBZMSArPSAxIDw8IDEzOworICAgICAgICAgICAgWTIgKz0gMSA8PCAxMzsKKworICAgICAgICAgICAgaWYgKGhhc0FscGhhKSB7CisgICAgICAgICAgICAgICAgQTEgPSBhYnVmMFtpICogMiAgICBdIDw8IDExOworICAgICAgICAgICAgICAgIEEyID0gYWJ1ZjBbaSAqIDIgKyAxXSA8PCAxMTsKKworICAgICAgICAgICAgICAgIEExICs9IDEgPDwgMTM7CisgICAgICAgICAgICAgICAgQTIgKz0gMSA8PCAxMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUiA9IFYgKiBjLT55dXYycmdiX3Yycl9jb2VmZjsKKyAgICAgICAgICAgIEcgPSBWICogYy0+eXV2MnJnYl92MmdfY29lZmYgKyBVICogYy0+eXV2MnJnYl91MmdfY29lZmY7CisgICAgICAgICAgICBCID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVSAqIGMtPnl1djJyZ2JfdTJiX2NvZWZmOworCisgICAgICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbMF0sIGF2X2NsaXBfdWludHAyKFJfQiArIFkxLCAzMCkgPj4gMTQpOworICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzFdLCBhdl9jbGlwX3VpbnRwMiggIEcgKyBZMSwgMzApID4+IDE0KTsKKyAgICAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFsyXSwgYXZfY2xpcF91aW50cDIoQl9SICsgWTEsIDMwKSA+PiAxNCk7CisgICAgICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbM10sIGF2X2NsaXBfdWludHAyKEExICAgICAgLCAzMCkgPj4gMTQpOworICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzRdLCBhdl9jbGlwX3VpbnRwMihSX0IgKyBZMiwgMzApID4+IDE0KTsKKyAgICAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFs1XSwgYXZfY2xpcF91aW50cDIoICBHICsgWTIsIDMwKSA+PiAxNCk7CisgICAgICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbNl0sIGF2X2NsaXBfdWludHAyKEJfUiArIFkyLCAzMCkgPj4gMTQpOworICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzddLCBhdl9jbGlwX3VpbnRwMihBMiAgICAgICwgMzApID4+IDE0KTsKKyAgICAgICAgICAgIGRlc3QgKz0gODsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludDMyX3QgKnVidWYxID0gdWJ1ZlsxXSwgKnZidWYxID0gdmJ1ZlsxXTsKKyAgICAgICAgaW50IEExID0gMHhmZmZmPDwxNCwgQTIgPSAweGZmZmY8PDE0OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKChkc3RXICsgMSkgPj4gMSk7IGkrKykgeworICAgICAgICAgICAgaW50IFkxID0gKGJ1ZjBbaSAqIDJdICAgICkgPj4gMjsKKyAgICAgICAgICAgIGludCBZMiA9IChidWYwW2kgKiAyICsgMV0pID4+IDI7CisgICAgICAgICAgICBpbnQgVSAgPSAodWJ1ZjBbaV0gKyB1YnVmMVtpXSArICgtMTI4IDw8IDEyKSkgPj4gMzsKKyAgICAgICAgICAgIGludCBWICA9ICh2YnVmMFtpXSArIHZidWYxW2ldICsgKC0xMjggPDwgMTIpKSA+PiAzOworICAgICAgICAgICAgaW50IFIsIEcsIEI7CisKKyAgICAgICAgICAgIFkxIC09IGMtPnl1djJyZ2JfeV9vZmZzZXQ7CisgICAgICAgICAgICBZMiAtPSBjLT55dXYycmdiX3lfb2Zmc2V0OworICAgICAgICAgICAgWTEgKj0gYy0+eXV2MnJnYl95X2NvZWZmOworICAgICAgICAgICAgWTIgKj0gYy0+eXV2MnJnYl95X2NvZWZmOworICAgICAgICAgICAgWTEgKz0gMSA8PCAxMzsKKyAgICAgICAgICAgIFkyICs9IDEgPDwgMTM7CisKKyAgICAgICAgICAgIGlmIChoYXNBbHBoYSkgeworICAgICAgICAgICAgICAgIEExID0gYWJ1ZjBbaSAqIDIgICAgXSA8PCAxMTsKKyAgICAgICAgICAgICAgICBBMiA9IGFidWYwW2kgKiAyICsgMV0gPDwgMTE7CisKKyAgICAgICAgICAgICAgICBBMSArPSAxIDw8IDEzOworICAgICAgICAgICAgICAgIEEyICs9IDEgPDwgMTM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFIgPSBWICogYy0+eXV2MnJnYl92MnJfY29lZmY7CisgICAgICAgICAgICBHID0gViAqIGMtPnl1djJyZ2JfdjJnX2NvZWZmICsgVSAqIGMtPnl1djJyZ2JfdTJnX2NvZWZmOworICAgICAgICAgICAgQiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUgKiBjLT55dXYycmdiX3UyYl9jb2VmZjsKKworICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzBdLCBhdl9jbGlwX3VpbnRwMihSX0IgKyBZMSwgMzApID4+IDE0KTsKKyAgICAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFsxXSwgYXZfY2xpcF91aW50cDIoICBHICsgWTEsIDMwKSA+PiAxNCk7CisgICAgICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbMl0sIGF2X2NsaXBfdWludHAyKEJfUiArIFkxLCAzMCkgPj4gMTQpOworICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzNdLCBhdl9jbGlwX3VpbnRwMihBMSAgICAgICwgMzApID4+IDE0KTsKKyAgICAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFs0XSwgYXZfY2xpcF91aW50cDIoUl9CICsgWTIsIDMwKSA+PiAxNCk7CisgICAgICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbNV0sIGF2X2NsaXBfdWludHAyKCAgRyArIFkyLCAzMCkgPj4gMTQpOworICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzZdLCBhdl9jbGlwX3VpbnRwMihCX1IgKyBZMiwgMzApID4+IDE0KTsKKyAgICAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFs3XSwgYXZfY2xpcF91aW50cDIoQTIgICAgICAsIDMwKSA+PiAxNCk7CisgICAgICAgICAgICBkZXN0ICs9IDg7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQKK3l1djJyZ2I0OF9YX2NfdGVtcGxhdGUoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqbHVtRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICoqbHVtU3JjLCBpbnQgbHVtRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLCBjb25zdCBpbnQzMl90ICoqY2hyVVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqKmNoclZTcmMsIGludCBjaHJGaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICoqYWxwU3JjLCB1aW50MTZfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB5LCBlbnVtIEFWUGl4ZWxGb3JtYXQgdGFyZ2V0LCBpbnQgaGFzQWxwaGEpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKChkc3RXICsgMSkgPj4gMSk7IGkrKykgeworICAgICAgICBpbnQgajsKKyAgICAgICAgaW50IFkxID0gLTB4NDAwMDAwMDA7CisgICAgICAgIGludCBZMiA9IC0weDQwMDAwMDAwOworICAgICAgICBpbnQgVSAgPSAtMTI4IDw8IDIzOyAvLyAxOQorICAgICAgICBpbnQgViAgPSAtMTI4IDw8IDIzOworICAgICAgICBpbnQgUiwgRywgQjsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbHVtRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICBZMSArPSBsdW1TcmNbal1baSAqIDJdICAgICAqICh1bnNpZ25lZClsdW1GaWx0ZXJbal07CisgICAgICAgICAgICBZMiArPSBsdW1TcmNbal1baSAqIDIgKyAxXSAqICh1bnNpZ25lZClsdW1GaWx0ZXJbal07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGNockZpbHRlclNpemU7IGorKykgezsKKyAgICAgICAgICAgIFUgKz0gY2hyVVNyY1tqXVtpXSAqICh1bnNpZ25lZCljaHJGaWx0ZXJbal07CisgICAgICAgICAgICBWICs9IGNoclZTcmNbal1baV0gKiAodW5zaWduZWQpY2hyRmlsdGVyW2pdOworICAgICAgICB9CisKKyAgICAgICAgLy8gOGJpdDogMTIrMTU9Mjc7IDE2LWJpdDogMTIrMTk9MzEKKyAgICAgICAgWTEgPj49IDE0OyAvLyAxMAorICAgICAgICBZMSArPSAweDEwMDAwOworICAgICAgICBZMiA+Pj0gMTQ7CisgICAgICAgIFkyICs9IDB4MTAwMDA7CisgICAgICAgIFUgID4+PSAxNDsKKyAgICAgICAgViAgPj49IDE0OworCisgICAgICAgIC8vIDhiaXQ6IDI3IC0+IDE3Yml0LCAxNmJpdDogMzEgLSAxNCA9IDE3Yml0CisgICAgICAgIFkxIC09IGMtPnl1djJyZ2JfeV9vZmZzZXQ7CisgICAgICAgIFkyIC09IGMtPnl1djJyZ2JfeV9vZmZzZXQ7CisgICAgICAgIFkxICo9IGMtPnl1djJyZ2JfeV9jb2VmZjsKKyAgICAgICAgWTIgKj0gYy0+eXV2MnJnYl95X2NvZWZmOworICAgICAgICBZMSArPSAxIDw8IDEzOyAvLyAyMQorICAgICAgICBZMiArPSAxIDw8IDEzOworICAgICAgICAvLyA4Yml0OiAxNyArIDEzYml0ID0gMzBiaXQsIDE2Yml0OiAxNyArIDEzYml0ID0gMzBiaXQKKworICAgICAgICBSID0gViAqIGMtPnl1djJyZ2JfdjJyX2NvZWZmOworICAgICAgICBHID0gViAqIGMtPnl1djJyZ2JfdjJnX2NvZWZmICsgVSAqIGMtPnl1djJyZ2JfdTJnX2NvZWZmOworICAgICAgICBCID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVSAqIGMtPnl1djJyZ2JfdTJiX2NvZWZmOworCisgICAgICAgIC8vIDhiaXQ6IDMwIC0gMjIgPSA4Yml0LCAxNmJpdDogMzBiaXQgLSAxNCA9IDE2Yml0CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFswXSwgYXZfY2xpcF91aW50cDIoUl9CICsgWTEsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFsxXSwgYXZfY2xpcF91aW50cDIoICBHICsgWTEsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFsyXSwgYXZfY2xpcF91aW50cDIoQl9SICsgWTEsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFszXSwgYXZfY2xpcF91aW50cDIoUl9CICsgWTIsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFs0XSwgYXZfY2xpcF91aW50cDIoICBHICsgWTIsIDMwKSA+PiAxNCk7CisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFs1XSwgYXZfY2xpcF91aW50cDIoQl9SICsgWTIsIDMwKSA+PiAxNCk7CisgICAgICAgIGRlc3QgKz0gNjsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQKK3l1djJyZ2I0OF8yX2NfdGVtcGxhdGUoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MzJfdCAqYnVmWzJdLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICp1YnVmWzJdLCBjb25zdCBpbnQzMl90ICp2YnVmWzJdLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICphYnVmWzJdLCB1aW50MTZfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB5YWxwaGEsIGludCB1dmFscGhhLCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHRhcmdldCwgaW50IGhhc0FscGhhKQoreworICAgIGNvbnN0IGludDMyX3QgKmJ1ZjAgID0gYnVmWzBdLCAgKmJ1ZjEgID0gYnVmWzFdLAorICAgICAgICAgICAgICAgICAgKnVidWYwID0gdWJ1ZlswXSwgKnVidWYxID0gdWJ1ZlsxXSwKKyAgICAgICAgICAgICAgICAgICp2YnVmMCA9IHZidWZbMF0sICp2YnVmMSA9IHZidWZbMV07CisgICAgaW50ICB5YWxwaGExID0gNDA5NiAtIHlhbHBoYTsKKyAgICBpbnQgdXZhbHBoYTEgPSA0MDk2IC0gdXZhbHBoYTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoKGRzdFcgKyAxKSA+PiAxKTsgaSsrKSB7CisgICAgICAgIGludCBZMSA9IChidWYwW2kgKiAyXSAgICAgKiB5YWxwaGExICArIGJ1ZjFbaSAqIDJdICAgICAqIHlhbHBoYSkgPj4gMTQ7CisgICAgICAgIGludCBZMiA9IChidWYwW2kgKiAyICsgMV0gKiB5YWxwaGExICArIGJ1ZjFbaSAqIDIgKyAxXSAqIHlhbHBoYSkgPj4gMTQ7CisgICAgICAgIGludCBVICA9ICh1YnVmMFtpXSAgICAgICAgKiB1dmFscGhhMSArIHVidWYxW2ldICAgICAgICAqIHV2YWxwaGEgKyAoLTEyOCA8PCAyMykpID4+IDE0OworICAgICAgICBpbnQgViAgPSAodmJ1ZjBbaV0gICAgICAgICogdXZhbHBoYTEgKyB2YnVmMVtpXSAgICAgICAgKiB1dmFscGhhICsgKC0xMjggPDwgMjMpKSA+PiAxNDsKKyAgICAgICAgaW50IFIsIEcsIEI7CisKKyAgICAgICAgWTEgLT0gYy0+eXV2MnJnYl95X29mZnNldDsKKyAgICAgICAgWTIgLT0gYy0+eXV2MnJnYl95X29mZnNldDsKKyAgICAgICAgWTEgKj0gYy0+eXV2MnJnYl95X2NvZWZmOworICAgICAgICBZMiAqPSBjLT55dXYycmdiX3lfY29lZmY7CisgICAgICAgIFkxICs9IDEgPDwgMTM7CisgICAgICAgIFkyICs9IDEgPDwgMTM7CisKKyAgICAgICAgUiA9IFYgKiBjLT55dXYycmdiX3Yycl9jb2VmZjsKKyAgICAgICAgRyA9IFYgKiBjLT55dXYycmdiX3YyZ19jb2VmZiArIFUgKiBjLT55dXYycmdiX3UyZ19jb2VmZjsKKyAgICAgICAgQiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUgKiBjLT55dXYycmdiX3UyYl9jb2VmZjsKKworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbMF0sIGF2X2NsaXBfdWludHAyKFJfQiArIFkxLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbMV0sIGF2X2NsaXBfdWludHAyKCAgRyArIFkxLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbMl0sIGF2X2NsaXBfdWludHAyKEJfUiArIFkxLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbM10sIGF2X2NsaXBfdWludHAyKFJfQiArIFkyLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbNF0sIGF2X2NsaXBfdWludHAyKCAgRyArIFkyLCAzMCkgPj4gMTQpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbNV0sIGF2X2NsaXBfdWludHAyKEJfUiArIFkyLCAzMCkgPj4gMTQpOworICAgICAgICBkZXN0ICs9IDY7CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkCit5dXYycmdiNDhfMV9jX3RlbXBsYXRlKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDMyX3QgKmJ1ZjAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKnVidWZbMl0sIGNvbnN0IGludDMyX3QgKnZidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmFidWYwLCB1aW50MTZfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB1dmFscGhhLCBpbnQgeSwgZW51bSBBVlBpeGVsRm9ybWF0IHRhcmdldCwgaW50IGhhc0FscGhhKQoreworICAgIGNvbnN0IGludDMyX3QgKnVidWYwID0gdWJ1ZlswXSwgKnZidWYwID0gdmJ1ZlswXTsKKyAgICBpbnQgaTsKKworICAgIGlmICh1dmFscGhhIDwgMjA0OCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKChkc3RXICsgMSkgPj4gMSk7IGkrKykgeworICAgICAgICAgICAgaW50IFkxID0gKGJ1ZjBbaSAqIDJdICAgICkgPj4gMjsKKyAgICAgICAgICAgIGludCBZMiA9IChidWYwW2kgKiAyICsgMV0pID4+IDI7CisgICAgICAgICAgICBpbnQgVSAgPSAodWJ1ZjBbaV0gKyAoLTEyOCA8PCAxMSkpID4+IDI7CisgICAgICAgICAgICBpbnQgViAgPSAodmJ1ZjBbaV0gKyAoLTEyOCA8PCAxMSkpID4+IDI7CisgICAgICAgICAgICBpbnQgUiwgRywgQjsKKworICAgICAgICAgICAgWTEgLT0gYy0+eXV2MnJnYl95X29mZnNldDsKKyAgICAgICAgICAgIFkyIC09IGMtPnl1djJyZ2JfeV9vZmZzZXQ7CisgICAgICAgICAgICBZMSAqPSBjLT55dXYycmdiX3lfY29lZmY7CisgICAgICAgICAgICBZMiAqPSBjLT55dXYycmdiX3lfY29lZmY7CisgICAgICAgICAgICBZMSArPSAxIDw8IDEzOworICAgICAgICAgICAgWTIgKz0gMSA8PCAxMzsKKworICAgICAgICAgICAgUiA9IFYgKiBjLT55dXYycmdiX3Yycl9jb2VmZjsKKyAgICAgICAgICAgIEcgPSBWICogYy0+eXV2MnJnYl92MmdfY29lZmYgKyBVICogYy0+eXV2MnJnYl91MmdfY29lZmY7CisgICAgICAgICAgICBCID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVSAqIGMtPnl1djJyZ2JfdTJiX2NvZWZmOworCisgICAgICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbMF0sIGF2X2NsaXBfdWludHAyKFJfQiArIFkxLCAzMCkgPj4gMTQpOworICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzFdLCBhdl9jbGlwX3VpbnRwMiggIEcgKyBZMSwgMzApID4+IDE0KTsKKyAgICAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFsyXSwgYXZfY2xpcF91aW50cDIoQl9SICsgWTEsIDMwKSA+PiAxNCk7CisgICAgICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbM10sIGF2X2NsaXBfdWludHAyKFJfQiArIFkyLCAzMCkgPj4gMTQpOworICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzRdLCBhdl9jbGlwX3VpbnRwMiggIEcgKyBZMiwgMzApID4+IDE0KTsKKyAgICAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFs1XSwgYXZfY2xpcF91aW50cDIoQl9SICsgWTIsIDMwKSA+PiAxNCk7CisgICAgICAgICAgICBkZXN0ICs9IDY7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQzMl90ICp1YnVmMSA9IHVidWZbMV0sICp2YnVmMSA9IHZidWZbMV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoKGRzdFcgKyAxKSA+PiAxKTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgWTEgPSAoYnVmMFtpICogMl0gICAgKSA+PiAyOworICAgICAgICAgICAgaW50IFkyID0gKGJ1ZjBbaSAqIDIgKyAxXSkgPj4gMjsKKyAgICAgICAgICAgIGludCBVICA9ICh1YnVmMFtpXSArIHVidWYxW2ldICsgKC0xMjggPDwgMTIpKSA+PiAzOworICAgICAgICAgICAgaW50IFYgID0gKHZidWYwW2ldICsgdmJ1ZjFbaV0gKyAoLTEyOCA8PCAxMikpID4+IDM7CisgICAgICAgICAgICBpbnQgUiwgRywgQjsKKworICAgICAgICAgICAgWTEgLT0gYy0+eXV2MnJnYl95X29mZnNldDsKKyAgICAgICAgICAgIFkyIC09IGMtPnl1djJyZ2JfeV9vZmZzZXQ7CisgICAgICAgICAgICBZMSAqPSBjLT55dXYycmdiX3lfY29lZmY7CisgICAgICAgICAgICBZMiAqPSBjLT55dXYycmdiX3lfY29lZmY7CisgICAgICAgICAgICBZMSArPSAxIDw8IDEzOworICAgICAgICAgICAgWTIgKz0gMSA8PCAxMzsKKworICAgICAgICAgICAgUiA9IFYgKiBjLT55dXYycmdiX3Yycl9jb2VmZjsKKyAgICAgICAgICAgIEcgPSBWICogYy0+eXV2MnJnYl92MmdfY29lZmYgKyBVICogYy0+eXV2MnJnYl91MmdfY29lZmY7CisgICAgICAgICAgICBCID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVSAqIGMtPnl1djJyZ2JfdTJiX2NvZWZmOworCisgICAgICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbMF0sIGF2X2NsaXBfdWludHAyKFJfQiArIFkxLCAzMCkgPj4gMTQpOworICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzFdLCBhdl9jbGlwX3VpbnRwMiggIEcgKyBZMSwgMzApID4+IDE0KTsKKyAgICAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFsyXSwgYXZfY2xpcF91aW50cDIoQl9SICsgWTEsIDMwKSA+PiAxNCk7CisgICAgICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbM10sIGF2X2NsaXBfdWludHAyKFJfQiArIFkyLCAzMCkgPj4gMTQpOworICAgICAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzRdLCBhdl9jbGlwX3VpbnRwMiggIEcgKyBZMiwgMzApID4+IDE0KTsKKyAgICAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFs1XSwgYXZfY2xpcF91aW50cDIoQl9SICsgWTIsIDMwKSA+PiAxNCk7CisgICAgICAgICAgICBkZXN0ICs9IDY7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyN1bmRlZiBvdXRwdXRfcGl4ZWwKKyN1bmRlZiByX2IKKyN1bmRlZiBiX3IKKworI2RlZmluZSBZVVYyUEFDS0VEMTZXUkFQUEVSKG5hbWUsIGJhc2UsIGV4dCwgZm10LCBoYXNBbHBoYSkgXAorc3RhdGljIHZvaWQgbmFtZSAjIyBleHQgIyMgX1hfYyhTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpsdW1GaWx0ZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipfbHVtU3JjLCBpbnQgbHVtRmlsdGVyU2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLCBjb25zdCBpbnQxNl90ICoqX2NoclVTcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipfY2hyVlNyYywgaW50IGNockZpbHRlclNpemUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipfYWxwU3JjLCB1aW50OF90ICpfZGVzdCwgaW50IGRzdFcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB5KSBcCit7IFwKKyAgICBjb25zdCBpbnQzMl90ICoqbHVtU3JjICA9IChjb25zdCBpbnQzMl90ICoqKSBfbHVtU3JjLCBcCisgICAgICAgICAgICAgICAgICAqKmNoclVTcmMgPSAoY29uc3QgaW50MzJfdCAqKikgX2NoclVTcmMsIFwKKyAgICAgICAgICAgICAgICAgICoqY2hyVlNyYyA9IChjb25zdCBpbnQzMl90ICoqKSBfY2hyVlNyYywgXAorICAgICAgICAgICAgICAgICAgKiphbHBTcmMgID0gKGNvbnN0IGludDMyX3QgKiopIF9hbHBTcmM7IFwKKyAgICB1aW50MTZfdCAqZGVzdCA9ICh1aW50MTZfdCAqKSBfZGVzdDsgXAorICAgIG5hbWUgIyMgYmFzZSAjIyBfWF9jX3RlbXBsYXRlKGMsIGx1bUZpbHRlciwgbHVtU3JjLCBsdW1GaWx0ZXJTaXplLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNockZpbHRlciwgY2hyVVNyYywgY2hyVlNyYywgY2hyRmlsdGVyU2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBTcmMsIGRlc3QsIGRzdFcsIHksIGZtdCwgaGFzQWxwaGEpOyBcCit9IFwKKyBcCitzdGF0aWMgdm9pZCBuYW1lICMjIGV4dCAjIyBfMl9jKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKl9idWZbMl0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKl91YnVmWzJdLCBjb25zdCBpbnQxNl90ICpfdmJ1ZlsyXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqX2FidWZbMl0sIHVpbnQ4X3QgKl9kZXN0LCBpbnQgZHN0VywgXAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlhbHBoYSwgaW50IHV2YWxwaGEsIGludCB5KSBcCit7IFwKKyAgICBjb25zdCBpbnQzMl90ICoqYnVmICA9IChjb25zdCBpbnQzMl90ICoqKSBfYnVmLCBcCisgICAgICAgICAgICAgICAgICAqKnVidWYgPSAoY29uc3QgaW50MzJfdCAqKikgX3VidWYsIFwKKyAgICAgICAgICAgICAgICAgICoqdmJ1ZiA9IChjb25zdCBpbnQzMl90ICoqKSBfdmJ1ZiwgXAorICAgICAgICAgICAgICAgICAgKiphYnVmID0gKGNvbnN0IGludDMyX3QgKiopIF9hYnVmOyBcCisgICAgdWludDE2X3QgKmRlc3QgPSAodWludDE2X3QgKikgX2Rlc3Q7IFwKKyAgICBuYW1lICMjIGJhc2UgIyMgXzJfY190ZW1wbGF0ZShjLCBidWYsIHVidWYsIHZidWYsIGFidWYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCwgZHN0VywgeWFscGhhLCB1dmFscGhhLCB5LCBmbXQsIGhhc0FscGhhKTsgXAorfSBcCisgXAorc3RhdGljIHZvaWQgbmFtZSAjIyBleHQgIyMgXzFfYyhTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpfYnVmMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqX3VidWZbMl0sIGNvbnN0IGludDE2X3QgKl92YnVmWzJdLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpfYWJ1ZjAsIHVpbnQ4X3QgKl9kZXN0LCBpbnQgZHN0VywgXAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2YWxwaGEsIGludCB5KSBcCit7IFwKKyAgICBjb25zdCBpbnQzMl90ICpidWYwICA9IChjb25zdCBpbnQzMl90ICopICBfYnVmMCwgXAorICAgICAgICAgICAgICAgICAqKnVidWYgID0gKGNvbnN0IGludDMyX3QgKiopIF91YnVmLCBcCisgICAgICAgICAgICAgICAgICoqdmJ1ZiAgPSAoY29uc3QgaW50MzJfdCAqKikgX3ZidWYsIFwKKyAgICAgICAgICAgICAgICAgICphYnVmMCA9IChjb25zdCBpbnQzMl90ICopICBfYWJ1ZjA7IFwKKyAgICB1aW50MTZfdCAqZGVzdCA9ICh1aW50MTZfdCAqKSBfZGVzdDsgXAorICAgIG5hbWUgIyMgYmFzZSAjIyBfMV9jX3RlbXBsYXRlKGMsIGJ1ZjAsIHVidWYsIHZidWYsIGFidWYwLCBkZXN0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VywgdXZhbHBoYSwgeSwgZm10LCBoYXNBbHBoYSk7IFwKK30KKworWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2I0OCwgcmdiNDhiZSwgQVZfUElYX0ZNVF9SR0I0OEJFLCAwKQorWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2I0OCwgcmdiNDhsZSwgQVZfUElYX0ZNVF9SR0I0OExFLCAwKQorWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2I0OCwgYmdyNDhiZSwgQVZfUElYX0ZNVF9CR1I0OEJFLCAwKQorWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2I0OCwgYmdyNDhsZSwgQVZfUElYX0ZNVF9CR1I0OExFLCAwKQorWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2JhNjQsIHJnYmE2NGJlLCBBVl9QSVhfRk1UX1JHQkE2NEJFLCAxKQorWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2JhNjQsIHJnYmE2NGxlLCBBVl9QSVhfRk1UX1JHQkE2NExFLCAxKQorWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2JhNjQsIHJnYng2NGJlLCBBVl9QSVhfRk1UX1JHQkE2NEJFLCAwKQorWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2JhNjQsIHJnYng2NGxlLCBBVl9QSVhfRk1UX1JHQkE2NExFLCAwKQorWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2JhNjQsIGJncmE2NGJlLCBBVl9QSVhfRk1UX0JHUkE2NEJFLCAxKQorWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2JhNjQsIGJncmE2NGxlLCBBVl9QSVhfRk1UX0JHUkE2NExFLCAxKQorWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2JhNjQsIGJncng2NGJlLCBBVl9QSVhfRk1UX0JHUkE2NEJFLCAwKQorWVVWMlBBQ0tFRDE2V1JBUFBFUih5dXYyLCByZ2JhNjQsIGJncng2NGxlLCBBVl9QSVhfRk1UX0JHUkE2NExFLCAwKQorCisvKgorICogV3JpdGUgb3V0IDIgUkdCIHBpeGVscyBpbiB0aGUgdGFyZ2V0IHBpeGVsIGZvcm1hdC4gVGhpcyBmdW5jdGlvbiB0YWtlcyBhCisgKiBSL0cvQiBMVVQgYXMgZ2VuZXJhdGVkIGJ5IGZmX3l1djJyZ2JfY19pbml0X3RhYmxlcygpLCB3aGljaCB0YWtlcyBjYXJlIG9mCisgKiB0aGluZ3MgbGlrZSBlbmRpYW5uZXNzIGNvbnZlcnNpb24gYW5kIHNoaWZ0aW5nLiBUaGUgY2FsbGVyIHRha2VzIGNhcmUgb2YKKyAqIHNldHRpbmcgdGhlIGNvcnJlY3Qgb2Zmc2V0IGluIHRoZXNlIHRhYmxlcyBmcm9tIHRoZSBjaHJvbWEgKFUvVikgdmFsdWVzLgorICogVGhpcyBmdW5jdGlvbiB0aGVuIHVzZXMgdGhlIGx1bWluYW5jZSAoWTEvWTIpIHZhbHVlcyB0byB3cml0ZSBvdXQgdGhlCisgKiBjb3JyZWN0IFJHQiB2YWx1ZXMgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkCit5dXYycmdiX3dyaXRlKHVpbnQ4X3QgKl9kZXN0LCBpbnQgaSwgaW50IFkxLCBpbnQgWTIsCisgICAgICAgICAgICAgIHVuc2lnbmVkIEExLCB1bnNpZ25lZCBBMiwKKyAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqX3IsIGNvbnN0IHZvaWQgKl9nLCBjb25zdCB2b2lkICpfYiwgaW50IHksCisgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCB0YXJnZXQsIGludCBoYXNBbHBoYSkKK3sKKyAgICBpZiAodGFyZ2V0ID09IEFWX1BJWF9GTVRfQVJHQiB8fCB0YXJnZXQgPT0gQVZfUElYX0ZNVF9SR0JBIHx8CisgICAgICAgIHRhcmdldCA9PSBBVl9QSVhfRk1UX0FCR1IgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfQkdSQSkgeworICAgICAgICB1aW50MzJfdCAqZGVzdCA9ICh1aW50MzJfdCAqKSBfZGVzdDsKKyAgICAgICAgY29uc3QgdWludDMyX3QgKnIgPSAoY29uc3QgdWludDMyX3QgKikgX3I7CisgICAgICAgIGNvbnN0IHVpbnQzMl90ICpnID0gKGNvbnN0IHVpbnQzMl90ICopIF9nOworICAgICAgICBjb25zdCB1aW50MzJfdCAqYiA9IChjb25zdCB1aW50MzJfdCAqKSBfYjsKKworI2lmIENPTkZJR19TTUFMTAorICAgICAgICBpbnQgc2ggPSBoYXNBbHBoYSA/ICgodGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCMzJfMSB8fCB0YXJnZXQgPT0gQVZfUElYX0ZNVF9CR1IzMl8xKSA/IDAgOiAyNCkgOiAwOworCisgICAgICAgIGRlc3RbaSAqIDIgKyAwXSA9IHJbWTFdICsgZ1tZMV0gKyBiW1kxXSArIChoYXNBbHBoYSA/IEExIDw8IHNoIDogMCk7CisgICAgICAgIGRlc3RbaSAqIDIgKyAxXSA9IHJbWTJdICsgZ1tZMl0gKyBiW1kyXSArIChoYXNBbHBoYSA/IEEyIDw8IHNoIDogMCk7CisjZWxzZQorICAgICAgICBpZiAoaGFzQWxwaGEpIHsKKyAgICAgICAgICAgIGludCBzaCA9ICh0YXJnZXQgPT0gQVZfUElYX0ZNVF9SR0IzMl8xIHx8IHRhcmdldCA9PSBBVl9QSVhfRk1UX0JHUjMyXzEpID8gMCA6IDI0OworCisgICAgICAgICAgICBhdl9hc3NlcnQyKCgoKHJbWTFdICsgZ1tZMV0gKyBiW1kxXSkgPj4gc2gpICYgMHhGRikgPT0gMCk7CisgICAgICAgICAgICBkZXN0W2kgKiAyICsgMF0gPSByW1kxXSArIGdbWTFdICsgYltZMV0gKyAoQTEgPDwgc2gpOworICAgICAgICAgICAgZGVzdFtpICogMiArIDFdID0gcltZMl0gKyBnW1kyXSArIGJbWTJdICsgKEEyIDw8IHNoKTsKKyAgICAgICAgfSBlbHNlIHsKKyNpZiBkZWZpbmVkKEFTU0VSVF9MRVZFTCkgJiYgQVNTRVJUX0xFVkVMID4gMQorICAgICAgICAgICAgaW50IHNoID0gKHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjMyXzEgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfQkdSMzJfMSkgPyAwIDogMjQ7CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDIoKCgocltZMV0gKyBnW1kxXSArIGJbWTFdKSA+PiBzaCkgJiAweEZGKSA9PSAweEZGKTsKKyNlbmRpZgorICAgICAgICAgICAgZGVzdFtpICogMiArIDBdID0gcltZMV0gKyBnW1kxXSArIGJbWTFdOworICAgICAgICAgICAgZGVzdFtpICogMiArIDFdID0gcltZMl0gKyBnW1kyXSArIGJbWTJdOworICAgICAgICB9CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjI0IHx8IHRhcmdldCA9PSBBVl9QSVhfRk1UX0JHUjI0KSB7CisgICAgICAgIHVpbnQ4X3QgKmRlc3QgPSAodWludDhfdCAqKSBfZGVzdDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqciA9IChjb25zdCB1aW50OF90ICopIF9yOworICAgICAgICBjb25zdCB1aW50OF90ICpnID0gKGNvbnN0IHVpbnQ4X3QgKikgX2c7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSAoY29uc3QgdWludDhfdCAqKSBfYjsKKworI2RlZmluZSByX2IgKCh0YXJnZXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgPyByIDogYikKKyNkZWZpbmUgYl9yICgodGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCMjQpID8gYiA6IHIpCisKKyAgICAgICAgZGVzdFtpICogNiArIDBdID0gcl9iW1kxXTsKKyAgICAgICAgZGVzdFtpICogNiArIDFdID0gICBnW1kxXTsKKyAgICAgICAgZGVzdFtpICogNiArIDJdID0gYl9yW1kxXTsKKyAgICAgICAgZGVzdFtpICogNiArIDNdID0gcl9iW1kyXTsKKyAgICAgICAgZGVzdFtpICogNiArIDRdID0gICBnW1kyXTsKKyAgICAgICAgZGVzdFtpICogNiArIDVdID0gYl9yW1kyXTsKKyN1bmRlZiByX2IKKyN1bmRlZiBiX3IKKyAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjU2NSB8fCB0YXJnZXQgPT0gQVZfUElYX0ZNVF9CR1I1NjUgfHwKKyAgICAgICAgICAgICAgIHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjU1NSB8fCB0YXJnZXQgPT0gQVZfUElYX0ZNVF9CR1I1NTUgfHwKKyAgICAgICAgICAgICAgIHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjQ0NCB8fCB0YXJnZXQgPT0gQVZfUElYX0ZNVF9CR1I0NDQpIHsKKyAgICAgICAgdWludDE2X3QgKmRlc3QgPSAodWludDE2X3QgKikgX2Rlc3Q7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpyID0gKGNvbnN0IHVpbnQxNl90ICopIF9yOworICAgICAgICBjb25zdCB1aW50MTZfdCAqZyA9IChjb25zdCB1aW50MTZfdCAqKSBfZzsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKmIgPSAoY29uc3QgdWludDE2X3QgKikgX2I7CisgICAgICAgIGludCBkcjEsIGRnMSwgZGIxLCBkcjIsIGRnMiwgZGIyOworCisgICAgICAgIGlmICh0YXJnZXQgPT0gQVZfUElYX0ZNVF9SR0I1NjUgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfQkdSNTY1KSB7CisgICAgICAgICAgICBkcjEgPSBmZl9kaXRoZXJfMngyXzhbIHkgJiAxICAgICBdWzBdOworICAgICAgICAgICAgZGcxID0gZmZfZGl0aGVyXzJ4Ml80WyB5ICYgMSAgICAgXVswXTsKKyAgICAgICAgICAgIGRiMSA9IGZmX2RpdGhlcl8yeDJfOFsoeSAmIDEpIF4gMV1bMF07CisgICAgICAgICAgICBkcjIgPSBmZl9kaXRoZXJfMngyXzhbIHkgJiAxICAgICBdWzFdOworICAgICAgICAgICAgZGcyID0gZmZfZGl0aGVyXzJ4Ml80WyB5ICYgMSAgICAgXVsxXTsKKyAgICAgICAgICAgIGRiMiA9IGZmX2RpdGhlcl8yeDJfOFsoeSAmIDEpIF4gMV1bMV07CisgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCNTU1IHx8IHRhcmdldCA9PSBBVl9QSVhfRk1UX0JHUjU1NSkgeworICAgICAgICAgICAgZHIxID0gZmZfZGl0aGVyXzJ4Ml84WyB5ICYgMSAgICAgXVswXTsKKyAgICAgICAgICAgIGRnMSA9IGZmX2RpdGhlcl8yeDJfOFsgeSAmIDEgICAgIF1bMV07CisgICAgICAgICAgICBkYjEgPSBmZl9kaXRoZXJfMngyXzhbKHkgJiAxKSBeIDFdWzBdOworICAgICAgICAgICAgZHIyID0gZmZfZGl0aGVyXzJ4Ml84WyB5ICYgMSAgICAgXVsxXTsKKyAgICAgICAgICAgIGRnMiA9IGZmX2RpdGhlcl8yeDJfOFsgeSAmIDEgICAgIF1bMF07CisgICAgICAgICAgICBkYjIgPSBmZl9kaXRoZXJfMngyXzhbKHkgJiAxKSBeIDFdWzFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHIxID0gZmZfZGl0aGVyXzR4NF8xNlsgeSAmIDMgICAgIF1bMF07CisgICAgICAgICAgICBkZzEgPSBmZl9kaXRoZXJfNHg0XzE2WyB5ICYgMyAgICAgXVsxXTsKKyAgICAgICAgICAgIGRiMSA9IGZmX2RpdGhlcl80eDRfMTZbKHkgJiAzKSBeIDNdWzBdOworICAgICAgICAgICAgZHIyID0gZmZfZGl0aGVyXzR4NF8xNlsgeSAmIDMgICAgIF1bMV07CisgICAgICAgICAgICBkZzIgPSBmZl9kaXRoZXJfNHg0XzE2WyB5ICYgMyAgICAgXVswXTsKKyAgICAgICAgICAgIGRiMiA9IGZmX2RpdGhlcl80eDRfMTZbKHkgJiAzKSBeIDNdWzFdOworICAgICAgICB9CisKKyAgICAgICAgZGVzdFtpICogMiArIDBdID0gcltZMSArIGRyMV0gKyBnW1kxICsgZGcxXSArIGJbWTEgKyBkYjFdOworICAgICAgICBkZXN0W2kgKiAyICsgMV0gPSByW1kyICsgZHIyXSArIGdbWTIgKyBkZzJdICsgYltZMiArIGRiMl07CisgICAgfSBlbHNlIC8qIDgvNC1iaXQgKi8geworICAgICAgICB1aW50OF90ICpkZXN0ID0gKHVpbnQ4X3QgKikgX2Rlc3Q7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnIgPSAoY29uc3QgdWludDhfdCAqKSBfcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZyA9IChjb25zdCB1aW50OF90ICopIF9nOworICAgICAgICBjb25zdCB1aW50OF90ICpiID0gKGNvbnN0IHVpbnQ4X3QgKikgX2I7CisgICAgICAgIGludCBkcjEsIGRnMSwgZGIxLCBkcjIsIGRnMiwgZGIyOworCisgICAgICAgIGlmICh0YXJnZXQgPT0gQVZfUElYX0ZNVF9SR0I4IHx8IHRhcmdldCA9PSBBVl9QSVhfRk1UX0JHUjgpIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCBkNjQgPSBmZl9kaXRoZXJfOHg4XzczW3kgJiA3XTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCBkMzIgPSBmZl9kaXRoZXJfOHg4XzMyW3kgJiA3XTsKKyAgICAgICAgICAgIGRyMSA9IGRnMSA9IGQzMlsoaSAqIDIgKyAwKSAmIDddOworICAgICAgICAgICAgZGIxID0gICAgICAgZDY0WyhpICogMiArIDApICYgN107CisgICAgICAgICAgICBkcjIgPSBkZzIgPSBkMzJbKGkgKiAyICsgMSkgJiA3XTsKKyAgICAgICAgICAgIGRiMiA9ICAgICAgIGQ2NFsoaSAqIDIgKyAxKSAmIDddOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IGQ2NCAgPSBmZl9kaXRoZXJfOHg4XzczIFt5ICYgN107CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICogY29uc3QgZDEyOCA9IGZmX2RpdGhlcl84eDhfMjIwW3kgJiA3XTsKKyAgICAgICAgICAgIGRyMSA9IGRiMSA9IGQxMjhbKGkgKiAyICsgMCkgJiA3XTsKKyAgICAgICAgICAgIGRnMSA9ICAgICAgICBkNjRbKGkgKiAyICsgMCkgJiA3XTsKKyAgICAgICAgICAgIGRyMiA9IGRiMiA9IGQxMjhbKGkgKiAyICsgMSkgJiA3XTsKKyAgICAgICAgICAgIGRnMiA9ICAgICAgICBkNjRbKGkgKiAyICsgMSkgJiA3XTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YXJnZXQgPT0gQVZfUElYX0ZNVF9SR0I0IHx8IHRhcmdldCA9PSBBVl9QSVhfRk1UX0JHUjQpIHsKKyAgICAgICAgICAgIGRlc3RbaV0gPSByW1kxICsgZHIxXSArIGdbWTEgKyBkZzFdICsgYltZMSArIGRiMV0gKworICAgICAgICAgICAgICAgICAgICAoKHJbWTIgKyBkcjJdICsgZ1tZMiArIGRnMl0gKyBiW1kyICsgZGIyXSkgPDwgNCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0W2kgKiAyICsgMF0gPSByW1kxICsgZHIxXSArIGdbWTEgKyBkZzFdICsgYltZMSArIGRiMV07CisgICAgICAgICAgICBkZXN0W2kgKiAyICsgMV0gPSByW1kyICsgZHIyXSArIGdbWTIgKyBkZzJdICsgYltZMiArIGRiMl07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQKK3l1djJyZ2JfWF9jX3RlbXBsYXRlKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmx1bUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipsdW1TcmMsIGludCBsdW1GaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLCBjb25zdCBpbnQxNl90ICoqY2hyVVNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJWU3JjLCBpbnQgY2hyRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiphbHBTcmMsIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgaW50IHksIGVudW0gQVZQaXhlbEZvcm1hdCB0YXJnZXQsIGludCBoYXNBbHBoYSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoKGRzdFcgKyAxKSA+PiAxKTsgaSsrKSB7CisgICAgICAgIGludCBqLCBBMSwgQTI7CisgICAgICAgIGludCBZMSA9IDEgPDwgMTg7CisgICAgICAgIGludCBZMiA9IDEgPDwgMTg7CisgICAgICAgIGludCBVICA9IDEgPDwgMTg7CisgICAgICAgIGludCBWICA9IDEgPDwgMTg7CisgICAgICAgIGNvbnN0IHZvaWQgKnIsICpnLCAqYjsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbHVtRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICBZMSArPSBsdW1TcmNbal1baSAqIDJdICAgICAqIGx1bUZpbHRlcltqXTsKKyAgICAgICAgICAgIFkyICs9IGx1bVNyY1tqXVtpICogMiArIDFdICogbHVtRmlsdGVyW2pdOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaHJGaWx0ZXJTaXplOyBqKyspIHsKKyAgICAgICAgICAgIFUgKz0gY2hyVVNyY1tqXVtpXSAqIGNockZpbHRlcltqXTsKKyAgICAgICAgICAgIFYgKz0gY2hyVlNyY1tqXVtpXSAqIGNockZpbHRlcltqXTsKKyAgICAgICAgfQorICAgICAgICBZMSA+Pj0gMTk7CisgICAgICAgIFkyID4+PSAxOTsKKyAgICAgICAgVSAgPj49IDE5OworICAgICAgICBWICA+Pj0gMTk7CisgICAgICAgIGlmIChoYXNBbHBoYSkgeworICAgICAgICAgICAgQTEgPSAxIDw8IDE4OworICAgICAgICAgICAgQTIgPSAxIDw8IDE4OworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGx1bUZpbHRlclNpemU7IGorKykgeworICAgICAgICAgICAgICAgIEExICs9IGFscFNyY1tqXVtpICogMiAgICBdICogbHVtRmlsdGVyW2pdOworICAgICAgICAgICAgICAgIEEyICs9IGFscFNyY1tqXVtpICogMiArIDFdICogbHVtRmlsdGVyW2pdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQTEgPj49IDE5OworICAgICAgICAgICAgQTIgPj49IDE5OworICAgICAgICAgICAgaWYgKChBMSB8IEEyKSAmIDB4MTAwKSB7CisgICAgICAgICAgICAgICAgQTEgPSBhdl9jbGlwX3VpbnQ4KEExKTsKKyAgICAgICAgICAgICAgICBBMiA9IGF2X2NsaXBfdWludDgoQTIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgciA9ICBjLT50YWJsZV9yVltWICsgWVVWUkdCX1RBQkxFX0hFQURST09NXTsKKyAgICAgICAgZyA9IChjLT50YWJsZV9nVVtVICsgWVVWUkdCX1RBQkxFX0hFQURST09NXSArIGMtPnRhYmxlX2dWW1YgKyBZVVZSR0JfVEFCTEVfSEVBRFJPT01dKTsKKyAgICAgICAgYiA9ICBjLT50YWJsZV9iVVtVICsgWVVWUkdCX1RBQkxFX0hFQURST09NXTsKKworICAgICAgICB5dXYycmdiX3dyaXRlKGRlc3QsIGksIFkxLCBZMiwgaGFzQWxwaGEgPyBBMSA6IDAsIGhhc0FscGhhID8gQTIgOiAwLAorICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIsIHksIHRhcmdldCwgaGFzQWxwaGEpOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZAoreXV2MnJnYl8yX2NfdGVtcGxhdGUoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqYnVmWzJdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmFidWZbMl0sIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgaW50IHlhbHBoYSwgaW50IHV2YWxwaGEsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHRhcmdldCwgaW50IGhhc0FscGhhKQoreworICAgIGNvbnN0IGludDE2X3QgKmJ1ZjAgID0gYnVmWzBdLCAgKmJ1ZjEgID0gYnVmWzFdLAorICAgICAgICAgICAgICAgICAgKnVidWYwID0gdWJ1ZlswXSwgKnVidWYxID0gdWJ1ZlsxXSwKKyAgICAgICAgICAgICAgICAgICp2YnVmMCA9IHZidWZbMF0sICp2YnVmMSA9IHZidWZbMV0sCisgICAgICAgICAgICAgICAgICAqYWJ1ZjAgPSBoYXNBbHBoYSA/IGFidWZbMF0gOiBOVUxMLAorICAgICAgICAgICAgICAgICAgKmFidWYxID0gaGFzQWxwaGEgPyBhYnVmWzFdIDogTlVMTDsKKyAgICBpbnQgIHlhbHBoYTEgPSA0MDk2IC0geWFscGhhOworICAgIGludCB1dmFscGhhMSA9IDQwOTYgLSB1dmFscGhhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8ICgoZHN0VyArIDEpID4+IDEpOyBpKyspIHsKKyAgICAgICAgaW50IFkxID0gKGJ1ZjBbaSAqIDJdICAgICAqIHlhbHBoYTEgICsgYnVmMVtpICogMl0gICAgICogeWFscGhhKSAgPj4gMTk7CisgICAgICAgIGludCBZMiA9IChidWYwW2kgKiAyICsgMV0gKiB5YWxwaGExICArIGJ1ZjFbaSAqIDIgKyAxXSAqIHlhbHBoYSkgID4+IDE5OworICAgICAgICBpbnQgVSAgPSAodWJ1ZjBbaV0gICAgICAgICogdXZhbHBoYTEgKyB1YnVmMVtpXSAgICAgICAgKiB1dmFscGhhKSA+PiAxOTsKKyAgICAgICAgaW50IFYgID0gKHZidWYwW2ldICAgICAgICAqIHV2YWxwaGExICsgdmJ1ZjFbaV0gICAgICAgICogdXZhbHBoYSkgPj4gMTk7CisgICAgICAgIGludCBBMSwgQTI7CisgICAgICAgIGNvbnN0IHZvaWQgKnIgPSAgYy0+dGFibGVfclZbViArIFlVVlJHQl9UQUJMRV9IRUFEUk9PTV0sCisgICAgICAgICAgICAgICAgICAgKmcgPSAoYy0+dGFibGVfZ1VbVSArIFlVVlJHQl9UQUJMRV9IRUFEUk9PTV0gKyBjLT50YWJsZV9nVltWICsgWVVWUkdCX1RBQkxFX0hFQURST09NXSksCisgICAgICAgICAgICAgICAgICAgKmIgPSAgYy0+dGFibGVfYlVbVSArIFlVVlJHQl9UQUJMRV9IRUFEUk9PTV07CisKKyAgICAgICAgaWYgKGhhc0FscGhhKSB7CisgICAgICAgICAgICBBMSA9IChhYnVmMFtpICogMiAgICBdICogeWFscGhhMSArIGFidWYxW2kgKiAyICAgIF0gKiB5YWxwaGEpID4+IDE5OworICAgICAgICAgICAgQTIgPSAoYWJ1ZjBbaSAqIDIgKyAxXSAqIHlhbHBoYTEgKyBhYnVmMVtpICogMiArIDFdICogeWFscGhhKSA+PiAxOTsKKyAgICAgICAgICAgIEExID0gYXZfY2xpcF91aW50OChBMSk7CisgICAgICAgICAgICBBMiA9IGF2X2NsaXBfdWludDgoQTIpOworICAgICAgICB9CisKKyAgICAgICAgeXV2MnJnYl93cml0ZShkZXN0LCBpLCBZMSwgWTIsIGhhc0FscGhhID8gQTEgOiAwLCBoYXNBbHBoYSA/IEEyIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiLCB5LCB0YXJnZXQsIGhhc0FscGhhKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQKK3l1djJyZ2JfMV9jX3RlbXBsYXRlKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmJ1ZjAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp1YnVmWzJdLCBjb25zdCBpbnQxNl90ICp2YnVmWzJdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqYWJ1ZjAsIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgaW50IHV2YWxwaGEsIGludCB5LCBlbnVtIEFWUGl4ZWxGb3JtYXQgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGhhc0FscGhhKQoreworICAgIGNvbnN0IGludDE2X3QgKnVidWYwID0gdWJ1ZlswXSwgKnZidWYwID0gdmJ1ZlswXTsKKyAgICBpbnQgaTsKKworICAgIGlmICh1dmFscGhhIDwgMjA0OCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKChkc3RXICsgMSkgPj4gMSk7IGkrKykgeworICAgICAgICAgICAgaW50IFkxID0gKGJ1ZjBbaSAqIDIgICAgXSArIDY0KSA+PiA3OworICAgICAgICAgICAgaW50IFkyID0gKGJ1ZjBbaSAqIDIgKyAxXSArIDY0KSA+PiA3OworICAgICAgICAgICAgaW50IFUgID0gKHVidWYwW2ldICAgICAgICArIDY0KSA+PiA3OworICAgICAgICAgICAgaW50IFYgID0gKHZidWYwW2ldICAgICAgICArIDY0KSA+PiA3OworICAgICAgICAgICAgaW50IEExLCBBMjsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKnIgPSAgYy0+dGFibGVfclZbViArIFlVVlJHQl9UQUJMRV9IRUFEUk9PTV0sCisgICAgICAgICAgICAgICAgICAgICAgICpnID0gKGMtPnRhYmxlX2dVW1UgKyBZVVZSR0JfVEFCTEVfSEVBRFJPT01dICsgYy0+dGFibGVfZ1ZbViArIFlVVlJHQl9UQUJMRV9IRUFEUk9PTV0pLAorICAgICAgICAgICAgICAgICAgICAgICAqYiA9ICBjLT50YWJsZV9iVVtVICsgWVVWUkdCX1RBQkxFX0hFQURST09NXTsKKworICAgICAgICAgICAgaWYgKGhhc0FscGhhKSB7CisgICAgICAgICAgICAgICAgQTEgPSBhYnVmMFtpICogMiAgICBdICogMjU1ICsgMTYzODQgPj4gMTU7CisgICAgICAgICAgICAgICAgQTIgPSBhYnVmMFtpICogMiArIDFdICogMjU1ICsgMTYzODQgPj4gMTU7CisgICAgICAgICAgICAgICAgQTEgPSBhdl9jbGlwX3VpbnQ4KEExKTsKKyAgICAgICAgICAgICAgICBBMiA9IGF2X2NsaXBfdWludDgoQTIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB5dXYycmdiX3dyaXRlKGRlc3QsIGksIFkxLCBZMiwgaGFzQWxwaGEgPyBBMSA6IDAsIGhhc0FscGhhID8gQTIgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiLCB5LCB0YXJnZXQsIGhhc0FscGhhKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlsxXSwgKnZidWYxID0gdmJ1ZlsxXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICgoZHN0VyArIDEpID4+IDEpOyBpKyspIHsKKyAgICAgICAgICAgIGludCBZMSA9IChidWYwW2kgKiAyICAgIF0gICAgICsgIDY0KSA+PiA3OworICAgICAgICAgICAgaW50IFkyID0gKGJ1ZjBbaSAqIDIgKyAxXSAgICAgKyAgNjQpID4+IDc7CisgICAgICAgICAgICBpbnQgVSAgPSAodWJ1ZjBbaV0gKyB1YnVmMVtpXSArIDEyOCkgPj4gODsKKyAgICAgICAgICAgIGludCBWICA9ICh2YnVmMFtpXSArIHZidWYxW2ldICsgMTI4KSA+PiA4OworICAgICAgICAgICAgaW50IEExLCBBMjsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKnIgPSAgYy0+dGFibGVfclZbViArIFlVVlJHQl9UQUJMRV9IRUFEUk9PTV0sCisgICAgICAgICAgICAgICAgICAgICAgICpnID0gKGMtPnRhYmxlX2dVW1UgKyBZVVZSR0JfVEFCTEVfSEVBRFJPT01dICsgYy0+dGFibGVfZ1ZbViArIFlVVlJHQl9UQUJMRV9IRUFEUk9PTV0pLAorICAgICAgICAgICAgICAgICAgICAgICAqYiA9ICBjLT50YWJsZV9iVVtVICsgWVVWUkdCX1RBQkxFX0hFQURST09NXTsKKworICAgICAgICAgICAgaWYgKGhhc0FscGhhKSB7CisgICAgICAgICAgICAgICAgQTEgPSAoYWJ1ZjBbaSAqIDIgICAgXSArIDY0KSA+PiA3OworICAgICAgICAgICAgICAgIEEyID0gKGFidWYwW2kgKiAyICsgMV0gKyA2NCkgPj4gNzsKKyAgICAgICAgICAgICAgICBBMSA9IGF2X2NsaXBfdWludDgoQTEpOworICAgICAgICAgICAgICAgIEEyID0gYXZfY2xpcF91aW50OChBMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHl1djJyZ2Jfd3JpdGUoZGVzdCwgaSwgWTEsIFkyLCBoYXNBbHBoYSA/IEExIDogMCwgaGFzQWxwaGEgPyBBMiA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIsIHksIHRhcmdldCwgaGFzQWxwaGEpOworICAgICAgICB9CisgICAgfQorfQorCisjZGVmaW5lIFlVVjJSR0JXUkFQUEVSWChuYW1lLCBiYXNlLCBleHQsIGZtdCwgaGFzQWxwaGEpIFwKK3N0YXRpYyB2b2lkIG5hbWUgIyMgZXh0ICMjIF9YX2MoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqbHVtRmlsdGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipsdW1TcmMsIGludCBsdW1GaWx0ZXJTaXplLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNockZpbHRlciwgY29uc3QgaW50MTZfdCAqKmNoclVTcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclZTcmMsIGludCBjaHJGaWx0ZXJTaXplLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiphbHBTcmMsIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5KSBcCit7IFwKKyAgICBuYW1lICMjIGJhc2UgIyMgX1hfY190ZW1wbGF0ZShjLCBsdW1GaWx0ZXIsIGx1bVNyYywgbHVtRmlsdGVyU2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNockZpbHRlciwgY2hyVVNyYywgY2hyVlNyYywgY2hyRmlsdGVyU2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscFNyYywgZGVzdCwgZHN0VywgeSwgZm10LCBoYXNBbHBoYSk7IFwKK30KKworI2RlZmluZSBZVVYyUkdCV1JBUFBFUlgyKG5hbWUsIGJhc2UsIGV4dCwgZm10LCBoYXNBbHBoYSkgXAorWVVWMlJHQldSQVBQRVJYKG5hbWUsIGJhc2UsIGV4dCwgZm10LCBoYXNBbHBoYSkgXAorc3RhdGljIHZvaWQgbmFtZSAjIyBleHQgIyMgXzJfYyhTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpidWZbMl0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphYnVmWzJdLCB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeWFscGhhLCBpbnQgdXZhbHBoYSwgaW50IHkpIFwKK3sgXAorICAgIG5hbWUgIyMgYmFzZSAjIyBfMl9jX3RlbXBsYXRlKGMsIGJ1ZiwgdWJ1ZiwgdmJ1ZiwgYWJ1ZiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QsIGRzdFcsIHlhbHBoYSwgdXZhbHBoYSwgeSwgZm10LCBoYXNBbHBoYSk7IFwKK30KKworI2RlZmluZSBZVVYyUkdCV1JBUFBFUihuYW1lLCBiYXNlLCBleHQsIGZtdCwgaGFzQWxwaGEpIFwKK1lVVjJSR0JXUkFQUEVSWDIobmFtZSwgYmFzZSwgZXh0LCBmbXQsIGhhc0FscGhhKSBcCitzdGF0aWMgdm9pZCBuYW1lICMjIGV4dCAjIyBfMV9jKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmJ1ZjAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphYnVmMCwgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2YWxwaGEsIGludCB5KSBcCit7IFwKKyAgICBuYW1lICMjIGJhc2UgIyMgXzFfY190ZW1wbGF0ZShjLCBidWYwLCB1YnVmLCB2YnVmLCBhYnVmMCwgZGVzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFcsIHV2YWxwaGEsIHksIGZtdCwgaGFzQWxwaGEpOyBcCit9CisKKyNpZiBDT05GSUdfU01BTEwKK1lVVjJSR0JXUkFQUEVSKHl1djJyZ2IsLCAgMzJfMSwgIEFWX1BJWF9GTVRfUkdCMzJfMSwgICBDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5hbHBQaXhCdWYpCitZVVYyUkdCV1JBUFBFUih5dXYycmdiLCwgIDMyLCAgICBBVl9QSVhfRk1UX1JHQjMyLCAgICAgQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYy0+YWxwUGl4QnVmKQorI2Vsc2UKKyNpZiBDT05GSUdfU1dTQ0FMRV9BTFBIQQorWVVWMlJHQldSQVBQRVIoeXV2MnJnYiwsIGEzMl8xLCAgQVZfUElYX0ZNVF9SR0IzMl8xLCAgIDEpCitZVVYyUkdCV1JBUFBFUih5dXYycmdiLCwgYTMyLCAgICBBVl9QSVhfRk1UX1JHQjMyLCAgICAgMSkKKyNlbmRpZgorWVVWMlJHQldSQVBQRVIoeXV2MnJnYiwsIHgzMl8xLCAgQVZfUElYX0ZNVF9SR0IzMl8xLCAgIDApCitZVVYyUkdCV1JBUFBFUih5dXYycmdiLCwgeDMyLCAgICBBVl9QSVhfRk1UX1JHQjMyLCAgICAgMCkKKyNlbmRpZgorWVVWMlJHQldSQVBQRVIoeXV2MiwgcmdiLCByZ2IyNCwgQVZfUElYX0ZNVF9SR0IyNCwgICAwKQorWVVWMlJHQldSQVBQRVIoeXV2MiwgcmdiLCBiZ3IyNCwgQVZfUElYX0ZNVF9CR1IyNCwgICAwKQorWVVWMlJHQldSQVBQRVIoeXV2MnJnYiwsICAxNiwgICAgQVZfUElYX0ZNVF9SR0I1NjUsICAgIDApCitZVVYyUkdCV1JBUFBFUih5dXYycmdiLCwgIDE1LCAgICBBVl9QSVhfRk1UX1JHQjU1NSwgICAgMCkKK1lVVjJSR0JXUkFQUEVSKHl1djJyZ2IsLCAgMTIsICAgIEFWX1BJWF9GTVRfUkdCNDQ0LCAgICAwKQorWVVWMlJHQldSQVBQRVIoeXV2MnJnYiwsICAgOCwgICAgQVZfUElYX0ZNVF9SR0I4LCAgICAgIDApCitZVVYyUkdCV1JBUFBFUih5dXYycmdiLCwgICA0LCAgICBBVl9QSVhfRk1UX1JHQjQsICAgICAgMCkKK1lVVjJSR0JXUkFQUEVSKHl1djJyZ2IsLCAgIDRiLCAgIEFWX1BJWF9GTVRfUkdCNF9CWVRFLCAwKQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHl1djJyZ2Jfd3JpdGVfZnVsbChTd3NDb250ZXh0ICpjLAorICAgIHVpbnQ4X3QgKmRlc3QsIGludCBpLCBpbnQgWSwgaW50IEEsIGludCBVLCBpbnQgViwKKyAgICBpbnQgeSwgZW51bSBBVlBpeGVsRm9ybWF0IHRhcmdldCwgaW50IGhhc0FscGhhLCBpbnQgZXJyWzRdKQoreworICAgIGludCBSLCBHLCBCOworICAgIGludCBpc3JnYjggPSB0YXJnZXQgPT0gQVZfUElYX0ZNVF9CR1I4IHx8IHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjg7CisKKyAgICBZIC09IGMtPnl1djJyZ2JfeV9vZmZzZXQ7CisgICAgWSAqPSBjLT55dXYycmdiX3lfY29lZmY7CisgICAgWSArPSAxIDw8IDIxOworICAgIFIgPSBZICsgVipjLT55dXYycmdiX3Yycl9jb2VmZjsKKyAgICBHID0gWSArIFYqYy0+eXV2MnJnYl92MmdfY29lZmYgKyBVKmMtPnl1djJyZ2JfdTJnX2NvZWZmOworICAgIEIgPSBZICsgICAgICAgICAgICAgICAgICAgICAgICAgIFUqYy0+eXV2MnJnYl91MmJfY29lZmY7CisgICAgaWYgKChSIHwgRyB8IEIpICYgMHhDMDAwMDAwMCkgeworICAgICAgICBSID0gYXZfY2xpcF91aW50cDIoUiwgMzApOworICAgICAgICBHID0gYXZfY2xpcF91aW50cDIoRywgMzApOworICAgICAgICBCID0gYXZfY2xpcF91aW50cDIoQiwgMzApOworICAgIH0KKworICAgIHN3aXRjaCh0YXJnZXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQVJHQjoKKyAgICAgICAgZGVzdFswXSA9IGhhc0FscGhhID8gQSA6IDI1NTsKKyAgICAgICAgZGVzdFsxXSA9IFIgPj4gMjI7CisgICAgICAgIGRlc3RbMl0gPSBHID4+IDIyOworICAgICAgICBkZXN0WzNdID0gQiA+PiAyMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgorICAgICAgICBkZXN0WzBdID0gUiA+PiAyMjsKKyAgICAgICAgZGVzdFsxXSA9IEcgPj4gMjI7CisgICAgICAgIGRlc3RbMl0gPSBCID4+IDIyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICAgICAgZGVzdFswXSA9IFIgPj4gMjI7CisgICAgICAgIGRlc3RbMV0gPSBHID4+IDIyOworICAgICAgICBkZXN0WzJdID0gQiA+PiAyMjsKKyAgICAgICAgZGVzdFszXSA9IGhhc0FscGhhID8gQSA6IDI1NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0FCR1I6CisgICAgICAgIGRlc3RbMF0gPSBoYXNBbHBoYSA/IEEgOiAyNTU7CisgICAgICAgIGRlc3RbMV0gPSBCID4+IDIyOworICAgICAgICBkZXN0WzJdID0gRyA+PiAyMjsKKyAgICAgICAgZGVzdFszXSA9IFIgPj4gMjI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IyNDoKKyAgICAgICAgZGVzdFswXSA9IEIgPj4gMjI7CisgICAgICAgIGRlc3RbMV0gPSBHID4+IDIyOworICAgICAgICBkZXN0WzJdID0gUiA+PiAyMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE6CisgICAgICAgIGRlc3RbMF0gPSBCID4+IDIyOworICAgICAgICBkZXN0WzFdID0gRyA+PiAyMjsKKyAgICAgICAgZGVzdFsyXSA9IFIgPj4gMjI7CisgICAgICAgIGRlc3RbM10gPSBoYXNBbHBoYSA/IEEgOiAyNTU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0X0JZVEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjRfQllURToKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCODoKKyAgICB7CisgICAgICAgIGludCByLGcsYjsKKworICAgICAgICBzd2l0Y2ggKGMtPmRpdGhlcikgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIFNXU19ESVRIRVJfQVVUTzoKKyAgICAgICAgY2FzZSBTV1NfRElUSEVSX0VEOgorICAgICAgICAgICAgUiA+Pj0gMjI7CisgICAgICAgICAgICBHID4+PSAyMjsKKyAgICAgICAgICAgIEIgPj49IDIyOworICAgICAgICAgICAgUiArPSAoNyplcnJbMF0gKyAxKmMtPmRpdGhlcl9lcnJvclswXVtpXSArIDUqYy0+ZGl0aGVyX2Vycm9yWzBdW2krMV0gKyAzKmMtPmRpdGhlcl9lcnJvclswXVtpKzJdKT4+NDsKKyAgICAgICAgICAgIEcgKz0gKDcqZXJyWzFdICsgMSpjLT5kaXRoZXJfZXJyb3JbMV1baV0gKyA1KmMtPmRpdGhlcl9lcnJvclsxXVtpKzFdICsgMypjLT5kaXRoZXJfZXJyb3JbMV1baSsyXSk+PjQ7CisgICAgICAgICAgICBCICs9ICg3KmVyclsyXSArIDEqYy0+ZGl0aGVyX2Vycm9yWzJdW2ldICsgNSpjLT5kaXRoZXJfZXJyb3JbMl1baSsxXSArIDMqYy0+ZGl0aGVyX2Vycm9yWzJdW2krMl0pPj40OworICAgICAgICAgICAgYy0+ZGl0aGVyX2Vycm9yWzBdW2ldID0gZXJyWzBdOworICAgICAgICAgICAgYy0+ZGl0aGVyX2Vycm9yWzFdW2ldID0gZXJyWzFdOworICAgICAgICAgICAgYy0+ZGl0aGVyX2Vycm9yWzJdW2ldID0gZXJyWzJdOworICAgICAgICAgICAgciA9IFIgPj4gKGlzcmdiOCA/IDUgOiA3KTsKKyAgICAgICAgICAgIGcgPSBHID4+IChpc3JnYjggPyA1IDogNik7CisgICAgICAgICAgICBiID0gQiA+PiAoaXNyZ2I4ID8gNiA6IDcpOworICAgICAgICAgICAgciA9IGF2X2NsaXAociwgMCwgaXNyZ2I4ID8gNyA6IDEpOworICAgICAgICAgICAgZyA9IGF2X2NsaXAoZywgMCwgaXNyZ2I4ID8gNyA6IDMpOworICAgICAgICAgICAgYiA9IGF2X2NsaXAoYiwgMCwgaXNyZ2I4ID8gMyA6IDEpOworICAgICAgICAgICAgZXJyWzBdID0gUiAtIHIqKGlzcmdiOCA/IDM2IDogMjU1KTsKKyAgICAgICAgICAgIGVyclsxXSA9IEcgLSBnKihpc3JnYjggPyAzNiA6IDg1KTsKKyAgICAgICAgICAgIGVyclsyXSA9IEIgLSBiKihpc3JnYjggPyA4NSA6IDI1NSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTV1NfRElUSEVSX0FfRElUSEVSOgorICAgICAgICAgICAgaWYgKGlzcmdiOCkgeworICAvKiBzZWUgaHR0cDovL3BpcHBpbi5naW1wLm9yZy9hX2RpdGhlci8gZm9yIGRldGFpbHMvb3JpZ2luICovCisjZGVmaW5lIEFfRElUSEVSKHUsdikgICAoKCgoKHUpKygodikqMjM2KSkqMTE5KSYweGZmKSkKKyAgICAgICAgICAgICAgICByID0gKCgoUiA+PiAxOSkgKyBBX0RJVEhFUihpLHkpICAtOTYpPj44KTsKKyAgICAgICAgICAgICAgICBnID0gKCgoRyA+PiAxOSkgKyBBX0RJVEhFUihpICsgMTcseSkgLSA5Nik+PjgpOworICAgICAgICAgICAgICAgIGIgPSAoKChCID4+IDIwKSArIEFfRElUSEVSKGkgKyAxNyoyLHkpIC05Nik+PjgpOworICAgICAgICAgICAgICAgIHIgPSBhdl9jbGlwKHIsIDAsIDcpOworICAgICAgICAgICAgICAgIGcgPSBhdl9jbGlwKGcsIDAsIDcpOworICAgICAgICAgICAgICAgIGIgPSBhdl9jbGlwKGIsIDAsIDMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByID0gKCgoUiA+PiAyMSkgKyBBX0RJVEhFUihpLHkpLTI1Nik+PjgpOworICAgICAgICAgICAgICAgIGcgPSAoKChHID4+IDE5KSArIEFfRElUSEVSKGkgKyAxNyx5KS0yNTYpPj44KTsKKyAgICAgICAgICAgICAgICBiID0gKCgoQiA+PiAyMSkgKyBBX0RJVEhFUihpICsgMTcqMix5KS0yNTYpPj44KTsKKyAgICAgICAgICAgICAgICByID0gYXZfY2xpcChyLCAwLCAxKTsKKyAgICAgICAgICAgICAgICBnID0gYXZfY2xpcChnLCAwLCAzKTsKKyAgICAgICAgICAgICAgICBiID0gYXZfY2xpcChiLCAwLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNXU19ESVRIRVJfWF9ESVRIRVI6CisgICAgICAgICAgICBpZiAoaXNyZ2I4KSB7CisgIC8qIHNlZSBodHRwOi8vcGlwcGluLmdpbXAub3JnL2FfZGl0aGVyLyBmb3IgZGV0YWlscy9vcmlnaW4gKi8KKyNkZWZpbmUgWF9ESVRIRVIodSx2KSAgICgoKCgodSleKCh2KSoyMzcpKSoxODEpJjB4MWZmKS8yKQorICAgICAgICAgICAgICAgIHIgPSAoKChSID4+IDE5KSArIFhfRElUSEVSKGkseSkgLSA5Nik+PjgpOworICAgICAgICAgICAgICAgIGcgPSAoKChHID4+IDE5KSArIFhfRElUSEVSKGkgKyAxNyx5KSAtIDk2KT4+OCk7CisgICAgICAgICAgICAgICAgYiA9ICgoKEIgPj4gMjApICsgWF9ESVRIRVIoaSArIDE3KjIseSkgLSA5Nik+PjgpOworICAgICAgICAgICAgICAgIHIgPSBhdl9jbGlwKHIsIDAsIDcpOworICAgICAgICAgICAgICAgIGcgPSBhdl9jbGlwKGcsIDAsIDcpOworICAgICAgICAgICAgICAgIGIgPSBhdl9jbGlwKGIsIDAsIDMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByID0gKCgoUiA+PiAyMSkgKyBYX0RJVEhFUihpLHkpLTI1Nik+PjgpOworICAgICAgICAgICAgICAgIGcgPSAoKChHID4+IDE5KSArIFhfRElUSEVSKGkgKyAxNyx5KS0yNTYpPj44KTsKKyAgICAgICAgICAgICAgICBiID0gKCgoQiA+PiAyMSkgKyBYX0RJVEhFUihpICsgMTcqMix5KS0yNTYpPj44KTsKKyAgICAgICAgICAgICAgICByID0gYXZfY2xpcChyLCAwLCAxKTsKKyAgICAgICAgICAgICAgICBnID0gYXZfY2xpcChnLCAwLCAzKTsKKyAgICAgICAgICAgICAgICBiID0gYXZfY2xpcChiLCAwLCAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZih0YXJnZXQgPT0gQVZfUElYX0ZNVF9CR1I0X0JZVEUpIHsKKyAgICAgICAgICAgIGRlc3RbMF0gPSByICsgMipnICsgOCpiOworICAgICAgICB9IGVsc2UgaWYodGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCNF9CWVRFKSB7CisgICAgICAgICAgICBkZXN0WzBdID0gYiArIDIqZyArIDgqcjsKKyAgICAgICAgfSBlbHNlIGlmKHRhcmdldCA9PSBBVl9QSVhfRk1UX0JHUjgpIHsKKyAgICAgICAgICAgIGRlc3RbMF0gPSByICsgOCpnICsgNjQqYjsKKyAgICAgICAgfSBlbHNlIGlmKHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjgpIHsKKyAgICAgICAgICAgIGRlc3RbMF0gPSBiICsgNCpnICsgMzIqcjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhdl9hc3NlcnQyKDApOworICAgICAgICBicmVhazt9CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkCit5dXYycmdiX2Z1bGxfWF9jX3RlbXBsYXRlKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmx1bUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgaW50IGx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNockZpbHRlciwgY29uc3QgaW50MTZfdCAqKmNoclVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJWU3JjLCBpbnQgY2hyRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmFscFNyYywgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFcsIGludCB5LCBlbnVtIEFWUGl4ZWxGb3JtYXQgdGFyZ2V0LCBpbnQgaGFzQWxwaGEpCit7CisgICAgaW50IGk7CisgICAgaW50IHN0ZXAgPSAodGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCMjQgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfQkdSMjQpID8gMyA6IDQ7CisgICAgaW50IGVycls0XSA9IHswfTsKKyAgICBpbnQgQSA9IDA7IC8vaW5pdCB0byBzaWxlbmNlIHdhcm5pbmcKKworICAgIGlmKCAgIHRhcmdldCA9PSBBVl9QSVhfRk1UX0JHUjRfQllURSB8fCB0YXJnZXQgPT0gQVZfUElYX0ZNVF9SR0I0X0JZVEUKKyAgICAgICB8fCB0YXJnZXQgPT0gQVZfUElYX0ZNVF9CR1I4ICAgICAgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCOCkKKyAgICAgICAgc3RlcCA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSsrKSB7CisgICAgICAgIGludCBqOworICAgICAgICBpbnQgWSA9IDE8PDk7CisgICAgICAgIGludCBVID0gKDE8PDkpLSgxMjggPDwgMTkpOworICAgICAgICBpbnQgViA9ICgxPDw5KS0oMTI4IDw8IDE5KTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbHVtRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICBZICs9IGx1bVNyY1tqXVtpXSAqIGx1bUZpbHRlcltqXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hyRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICBVICs9IGNoclVTcmNbal1baV0gKiBjaHJGaWx0ZXJbal07CisgICAgICAgICAgICBWICs9IGNoclZTcmNbal1baV0gKiBjaHJGaWx0ZXJbal07CisgICAgICAgIH0KKyAgICAgICAgWSA+Pj0gMTA7CisgICAgICAgIFUgPj49IDEwOworICAgICAgICBWID4+PSAxMDsKKyAgICAgICAgaWYgKGhhc0FscGhhKSB7CisgICAgICAgICAgICBBID0gMSA8PCAxODsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsdW1GaWx0ZXJTaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICBBICs9IGFscFNyY1tqXVtpXSAqIGx1bUZpbHRlcltqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEEgPj49IDE5OworICAgICAgICAgICAgaWYgKEEgJiAweDEwMCkKKyAgICAgICAgICAgICAgICBBID0gYXZfY2xpcF91aW50OChBKTsKKyAgICAgICAgfQorICAgICAgICB5dXYycmdiX3dyaXRlX2Z1bGwoYywgZGVzdCwgaSwgWSwgQSwgVSwgViwgeSwgdGFyZ2V0LCBoYXNBbHBoYSwgZXJyKTsKKyAgICAgICAgZGVzdCArPSBzdGVwOworICAgIH0KKyAgICBjLT5kaXRoZXJfZXJyb3JbMF1baV0gPSBlcnJbMF07CisgICAgYy0+ZGl0aGVyX2Vycm9yWzFdW2ldID0gZXJyWzFdOworICAgIGMtPmRpdGhlcl9lcnJvclsyXVtpXSA9IGVyclsyXTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZAoreXV2MnJnYl9mdWxsXzJfY190ZW1wbGF0ZShTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp1YnVmWzJdLCBjb25zdCBpbnQxNl90ICp2YnVmWzJdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqYWJ1ZlsyXSwgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICBpbnQgeWFscGhhLCBpbnQgdXZhbHBoYSwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgdGFyZ2V0LCBpbnQgaGFzQWxwaGEpCit7CisgICAgY29uc3QgaW50MTZfdCAqYnVmMCAgPSBidWZbMF0sICAqYnVmMSAgPSBidWZbMV0sCisgICAgICAgICAgICAgICAgICAqdWJ1ZjAgPSB1YnVmWzBdLCAqdWJ1ZjEgPSB1YnVmWzFdLAorICAgICAgICAgICAgICAgICAgKnZidWYwID0gdmJ1ZlswXSwgKnZidWYxID0gdmJ1ZlsxXSwKKyAgICAgICAgICAgICAgICAgICphYnVmMCA9IGhhc0FscGhhID8gYWJ1ZlswXSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAqYWJ1ZjEgPSBoYXNBbHBoYSA/IGFidWZbMV0gOiBOVUxMOworICAgIGludCAgeWFscGhhMSA9IDQwOTYgLSB5YWxwaGE7CisgICAgaW50IHV2YWxwaGExID0gNDA5NiAtIHV2YWxwaGE7CisgICAgaW50IGk7CisgICAgaW50IHN0ZXAgPSAodGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCMjQgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfQkdSMjQpID8gMyA6IDQ7CisgICAgaW50IGVycls0XSA9IHswfTsKKyAgICBpbnQgQSA9IDA7IC8vIGluaXQgdG8gc2lsY2VuZSB3YXJuaW5nCisKKyAgICBpZiggICB0YXJnZXQgPT0gQVZfUElYX0ZNVF9CR1I0X0JZVEUgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCNF9CWVRFCisgICAgICAgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfQkdSOCAgICAgIHx8IHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjgpCisgICAgICAgIHN0ZXAgPSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkrKykgeworICAgICAgICBpbnQgWSA9ICggYnVmMFtpXSAqIHlhbHBoYTEgICsgIGJ1ZjFbaV0gKiB5YWxwaGEgICAgICAgICAgICAgKSA+PiAxMDsgLy9GSVhNRSByb3VuZGluZworICAgICAgICBpbnQgVSA9ICh1YnVmMFtpXSAqIHV2YWxwaGExICsgdWJ1ZjFbaV0gKiB1dmFscGhhLSgxMjggPDwgMTkpKSA+PiAxMDsKKyAgICAgICAgaW50IFYgPSAodmJ1ZjBbaV0gKiB1dmFscGhhMSArIHZidWYxW2ldICogdXZhbHBoYS0oMTI4IDw8IDE5KSkgPj4gMTA7CisKKyAgICAgICAgaWYgKGhhc0FscGhhKSB7CisgICAgICAgICAgICBBID0gKGFidWYwW2ldICogeWFscGhhMSArIGFidWYxW2ldICogeWFscGhhICsgKDE8PDE4KSkgPj4gMTk7CisgICAgICAgICAgICBpZiAoQSAmIDB4MTAwKQorICAgICAgICAgICAgICAgIEEgPSBhdl9jbGlwX3VpbnQ4KEEpOworICAgICAgICB9CisKKyAgICAgICAgeXV2MnJnYl93cml0ZV9mdWxsKGMsIGRlc3QsIGksIFksIEEsIFUsIFYsIHksIHRhcmdldCwgaGFzQWxwaGEsIGVycik7CisgICAgICAgIGRlc3QgKz0gc3RlcDsKKyAgICB9CisgICAgYy0+ZGl0aGVyX2Vycm9yWzBdW2ldID0gZXJyWzBdOworICAgIGMtPmRpdGhlcl9lcnJvclsxXVtpXSA9IGVyclsxXTsKKyAgICBjLT5kaXRoZXJfZXJyb3JbMl1baV0gPSBlcnJbMl07Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQKK3l1djJyZ2JfZnVsbF8xX2NfdGVtcGxhdGUoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqYnVmMCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWZbMl0sIGNvbnN0IGludDE2X3QgKnZidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphYnVmMCwgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdXZhbHBoYSwgaW50IHksIGVudW0gQVZQaXhlbEZvcm1hdCB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzQWxwaGEpCit7CisgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjAgPSB1YnVmWzBdLCAqdmJ1ZjAgPSB2YnVmWzBdOworICAgIGludCBpOworICAgIGludCBzdGVwID0gKHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjI0IHx8IHRhcmdldCA9PSBBVl9QSVhfRk1UX0JHUjI0KSA/IDMgOiA0OworICAgIGludCBlcnJbNF0gPSB7MH07CisKKyAgICBpZiggICB0YXJnZXQgPT0gQVZfUElYX0ZNVF9CR1I0X0JZVEUgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfUkdCNF9CWVRFCisgICAgICAgfHwgdGFyZ2V0ID09IEFWX1BJWF9GTVRfQkdSOCAgICAgIHx8IHRhcmdldCA9PSBBVl9QSVhfRk1UX1JHQjgpCisgICAgICAgIHN0ZXAgPSAxOworCisgICAgaWYgKHV2YWxwaGEgPCAyMDQ4KSB7CisgICAgICAgIGludCBBID0gMDsgLy9pbml0IHRvIHNpbGVuY2Ugd2FybmluZworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgWSA9IGJ1ZjBbaV0gPDwgMjsKKyAgICAgICAgICAgIGludCBVID0gKHVidWYwW2ldIC0gKDEyODw8NykpIDw8IDI7CisgICAgICAgICAgICBpbnQgViA9ICh2YnVmMFtpXSAtICgxMjg8PDcpKSA8PCAyOworCisgICAgICAgICAgICBpZiAoaGFzQWxwaGEpIHsKKyAgICAgICAgICAgICAgICBBID0gKGFidWYwW2ldICsgNjQpID4+IDc7CisgICAgICAgICAgICAgICAgaWYgKEEgJiAweDEwMCkKKyAgICAgICAgICAgICAgICAgICAgQSA9IGF2X2NsaXBfdWludDgoQSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHl1djJyZ2Jfd3JpdGVfZnVsbChjLCBkZXN0LCBpLCBZLCBBLCBVLCBWLCB5LCB0YXJnZXQsIGhhc0FscGhhLCBlcnIpOworICAgICAgICAgICAgZGVzdCArPSBzdGVwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjEgPSB1YnVmWzFdLCAqdmJ1ZjEgPSB2YnVmWzFdOworICAgICAgICBpbnQgQSA9IDA7IC8vaW5pdCB0byBzaWxlbmNlIHdhcm5pbmcKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkrKykgeworICAgICAgICAgICAgaW50IFkgPSBidWYwW2ldIDw8IDI7CisgICAgICAgICAgICBpbnQgVSA9ICh1YnVmMFtpXSArIHVidWYxW2ldIC0gKDEyODw8OCkpIDw8IDE7CisgICAgICAgICAgICBpbnQgViA9ICh2YnVmMFtpXSArIHZidWYxW2ldIC0gKDEyODw8OCkpIDw8IDE7CisKKyAgICAgICAgICAgIGlmIChoYXNBbHBoYSkgeworICAgICAgICAgICAgICAgIEEgPSAoYWJ1ZjBbaV0gKyA2NCkgPj4gNzsKKyAgICAgICAgICAgICAgICBpZiAoQSAmIDB4MTAwKQorICAgICAgICAgICAgICAgICAgICBBID0gYXZfY2xpcF91aW50OChBKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeXV2MnJnYl93cml0ZV9mdWxsKGMsIGRlc3QsIGksIFksIEEsIFUsIFYsIHksIHRhcmdldCwgaGFzQWxwaGEsIGVycik7CisgICAgICAgICAgICBkZXN0ICs9IHN0ZXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjLT5kaXRoZXJfZXJyb3JbMF1baV0gPSBlcnJbMF07CisgICAgYy0+ZGl0aGVyX2Vycm9yWzFdW2ldID0gZXJyWzFdOworICAgIGMtPmRpdGhlcl9lcnJvclsyXVtpXSA9IGVyclsyXTsKK30KKworI2lmIENPTkZJR19TTUFMTAorWVVWMlJHQldSQVBQRVIoeXV2MiwgcmdiX2Z1bGwsIGJncmEzMl9mdWxsLCBBVl9QSVhfRk1UX0JHUkEsICBDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5hbHBQaXhCdWYpCitZVVYyUkdCV1JBUFBFUih5dXYyLCByZ2JfZnVsbCwgYWJncjMyX2Z1bGwsIEFWX1BJWF9GTVRfQUJHUiwgIENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikKK1lVVjJSR0JXUkFQUEVSKHl1djIsIHJnYl9mdWxsLCByZ2JhMzJfZnVsbCwgQVZfUElYX0ZNVF9SR0JBLCAgQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYy0+YWxwUGl4QnVmKQorWVVWMlJHQldSQVBQRVIoeXV2MiwgcmdiX2Z1bGwsIGFyZ2IzMl9mdWxsLCBBVl9QSVhfRk1UX0FSR0IsICBDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5hbHBQaXhCdWYpCisjZWxzZQorI2lmIENPTkZJR19TV1NDQUxFX0FMUEhBCitZVVYyUkdCV1JBUFBFUih5dXYyLCByZ2JfZnVsbCwgYmdyYTMyX2Z1bGwsIEFWX1BJWF9GTVRfQkdSQSwgIDEpCitZVVYyUkdCV1JBUFBFUih5dXYyLCByZ2JfZnVsbCwgYWJncjMyX2Z1bGwsIEFWX1BJWF9GTVRfQUJHUiwgIDEpCitZVVYyUkdCV1JBUFBFUih5dXYyLCByZ2JfZnVsbCwgcmdiYTMyX2Z1bGwsIEFWX1BJWF9GTVRfUkdCQSwgIDEpCitZVVYyUkdCV1JBUFBFUih5dXYyLCByZ2JfZnVsbCwgYXJnYjMyX2Z1bGwsIEFWX1BJWF9GTVRfQVJHQiwgIDEpCisjZW5kaWYKK1lVVjJSR0JXUkFQUEVSKHl1djIsIHJnYl9mdWxsLCBiZ3J4MzJfZnVsbCwgQVZfUElYX0ZNVF9CR1JBLCAgMCkKK1lVVjJSR0JXUkFQUEVSKHl1djIsIHJnYl9mdWxsLCB4YmdyMzJfZnVsbCwgQVZfUElYX0ZNVF9BQkdSLCAgMCkKK1lVVjJSR0JXUkFQUEVSKHl1djIsIHJnYl9mdWxsLCByZ2J4MzJfZnVsbCwgQVZfUElYX0ZNVF9SR0JBLCAgMCkKK1lVVjJSR0JXUkFQUEVSKHl1djIsIHJnYl9mdWxsLCB4cmdiMzJfZnVsbCwgQVZfUElYX0ZNVF9BUkdCLCAgMCkKKyNlbmRpZgorWVVWMlJHQldSQVBQRVIoeXV2MiwgcmdiX2Z1bGwsIGJncjI0X2Z1bGwsICBBVl9QSVhfRk1UX0JHUjI0LCAwKQorWVVWMlJHQldSQVBQRVIoeXV2MiwgcmdiX2Z1bGwsIHJnYjI0X2Z1bGwsICBBVl9QSVhfRk1UX1JHQjI0LCAwKQorCitZVVYyUkdCV1JBUFBFUih5dXYyLCByZ2JfZnVsbCwgYmdyNF9ieXRlX2Z1bGwsICBBVl9QSVhfRk1UX0JHUjRfQllURSwgMCkKK1lVVjJSR0JXUkFQUEVSKHl1djIsIHJnYl9mdWxsLCByZ2I0X2J5dGVfZnVsbCwgIEFWX1BJWF9GTVRfUkdCNF9CWVRFLCAwKQorWVVWMlJHQldSQVBQRVIoeXV2MiwgcmdiX2Z1bGwsIGJncjhfZnVsbCwgICBBVl9QSVhfRk1UX0JHUjgsICAwKQorWVVWMlJHQldSQVBQRVIoeXV2MiwgcmdiX2Z1bGwsIHJnYjhfZnVsbCwgICBBVl9QSVhfRk1UX1JHQjgsICAwKQorCitzdGF0aWMgdm9pZAoreXV2MmdicnBfZnVsbF9YX2MoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqbHVtRmlsdGVyLAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgaW50IGx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpjaHJGaWx0ZXIsIGNvbnN0IGludDE2X3QgKipjaHJVU3JjLAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclZTcmMsIGludCBjaHJGaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmFscFNyYywgdWludDhfdCAqKmRlc3QsCisgICAgICAgICAgICAgICAgICBpbnQgZHN0VywgaW50IHkpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChjLT5kc3RGb3JtYXQpOworICAgIGludCBpOworICAgIGludCBoYXNBbHBoYSA9IChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSkgJiYgYWxwU3JjOworICAgIHVpbnQxNl90ICoqZGVzdDE2ID0gKHVpbnQxNl90KiopZGVzdDsKKyAgICBpbnQgU0ggPSAyMiArIDcgLSBkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMTsKKyAgICBpbnQgQSA9IDA7IC8vIGluaXQgdG8gc2lsZW5jZSB3YXJuaW5nCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSsrKSB7CisgICAgICAgIGludCBqOworICAgICAgICBpbnQgWSA9IDEgPDwgOTsKKyAgICAgICAgaW50IFUgPSAoMSA8PCA5KSAtICgxMjggPDwgMTkpOworICAgICAgICBpbnQgViA9ICgxIDw8IDkpIC0gKDEyOCA8PCAxOSk7CisgICAgICAgIGludCBSLCBHLCBCOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsdW1GaWx0ZXJTaXplOyBqKyspCisgICAgICAgICAgICBZICs9IGx1bVNyY1tqXVtpXSAqIGx1bUZpbHRlcltqXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hyRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICBVICs9IGNoclVTcmNbal1baV0gKiBjaHJGaWx0ZXJbal07CisgICAgICAgICAgICBWICs9IGNoclZTcmNbal1baV0gKiBjaHJGaWx0ZXJbal07CisgICAgICAgIH0KKworICAgICAgICBZID4+PSAxMDsKKyAgICAgICAgVSA+Pj0gMTA7CisgICAgICAgIFYgPj49IDEwOworCisgICAgICAgIGlmIChoYXNBbHBoYSkgeworICAgICAgICAgICAgQSA9IDEgPDwgMTg7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsdW1GaWx0ZXJTaXplOyBqKyspCisgICAgICAgICAgICAgICAgQSArPSBhbHBTcmNbal1baV0gKiBsdW1GaWx0ZXJbal07CisKKyAgICAgICAgICAgIEEgPj49IDE5OworCisgICAgICAgICAgICBpZiAoQSAmIDB4MTAwKQorICAgICAgICAgICAgICAgIEEgPSBhdl9jbGlwX3VpbnQ4KEEpOworICAgICAgICB9CisKKyAgICAgICAgWSAtPSBjLT55dXYycmdiX3lfb2Zmc2V0OworICAgICAgICBZICo9IGMtPnl1djJyZ2JfeV9jb2VmZjsKKyAgICAgICAgWSArPSAxIDw8IDIxOworICAgICAgICBSID0gWSArIFYgKiBjLT55dXYycmdiX3Yycl9jb2VmZjsKKyAgICAgICAgRyA9IFkgKyBWICogYy0+eXV2MnJnYl92MmdfY29lZmYgKyBVICogYy0+eXV2MnJnYl91MmdfY29lZmY7CisgICAgICAgIEIgPSBZICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSAqIGMtPnl1djJyZ2JfdTJiX2NvZWZmOworCisgICAgICAgIGlmICgoUiB8IEcgfCBCKSAmIDB4QzAwMDAwMDApIHsKKyAgICAgICAgICAgIFIgPSBhdl9jbGlwX3VpbnRwMihSLCAzMCk7CisgICAgICAgICAgICBHID0gYXZfY2xpcF91aW50cDIoRywgMzApOworICAgICAgICAgICAgQiA9IGF2X2NsaXBfdWludHAyKEIsIDMwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTSCAhPSAyMikgeworICAgICAgICAgICAgZGVzdDE2WzBdW2ldID0gRyA+PiBTSDsKKyAgICAgICAgICAgIGRlc3QxNlsxXVtpXSA9IEIgPj4gU0g7CisgICAgICAgICAgICBkZXN0MTZbMl1baV0gPSBSID4+IFNIOworICAgICAgICAgICAgaWYgKGhhc0FscGhhKQorICAgICAgICAgICAgICAgIGRlc3QxNlszXVtpXSA9IEE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0WzBdW2ldID0gRyA+PiAyMjsKKyAgICAgICAgICAgIGRlc3RbMV1baV0gPSBCID4+IDIyOworICAgICAgICAgICAgZGVzdFsyXVtpXSA9IFIgPj4gMjI7CisgICAgICAgICAgICBpZiAoaGFzQWxwaGEpCisgICAgICAgICAgICAgICAgZGVzdFszXVtpXSA9IEE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKFNIICE9IDIyICYmICghaXNCRShjLT5kc3RGb3JtYXQpKSAhPSAoIUhBVkVfQklHRU5ESUFOKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSsrKSB7CisgICAgICAgICAgICBkZXN0MTZbMF1baV0gPSBhdl9ic3dhcDE2KGRlc3QxNlswXVtpXSk7CisgICAgICAgICAgICBkZXN0MTZbMV1baV0gPSBhdl9ic3dhcDE2KGRlc3QxNlsxXVtpXSk7CisgICAgICAgICAgICBkZXN0MTZbMl1baV0gPSBhdl9ic3dhcDE2KGRlc3QxNlsyXVtpXSk7CisgICAgICAgICAgICBpZiAoaGFzQWxwaGEpCisgICAgICAgICAgICAgICAgZGVzdDE2WzNdW2ldID0gYXZfYnN3YXAxNihkZXN0MTZbM11baV0pOworICAgICAgICB9CisgICAgfQorfQorCithdl9jb2xkIHZvaWQgZmZfc3dzX2luaXRfb3V0cHV0X2Z1bmNzKFN3c0NvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djJwbGFuYXIxX2ZuICp5dXYycGxhbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXYycGxhbmFyWF9mbiAqeXV2MnBsYW5lWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2MmludGVybGVhdmVkWF9mbiAqeXV2Mm52MTJjWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnBhY2tlZDFfZm4gKnl1djJwYWNrZWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXYycGFja2VkMl9mbiAqeXV2MnBhY2tlZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djJwYWNrZWRYX2ZuICp5dXYycGFja2VkWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2MmFueVhfZm4gKnl1djJhbnlYKQoreworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXQgPSBjLT5kc3RGb3JtYXQ7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChkc3RGb3JtYXQpOworCisgICAgaWYgKGlzMTZCUFMoZHN0Rm9ybWF0KSkgeworICAgICAgICAqeXV2MnBsYW5lWCA9IGlzQkUoZHN0Rm9ybWF0KSA/IHl1djJwbGFuZVhfMTZCRV9jICA6IHl1djJwbGFuZVhfMTZMRV9jOworICAgICAgICAqeXV2MnBsYW5lMSA9IGlzQkUoZHN0Rm9ybWF0KSA/IHl1djJwbGFuZTFfMTZCRV9jICA6IHl1djJwbGFuZTFfMTZMRV9jOworICAgIH0gZWxzZSBpZiAoaXM5X09SXzEwQlBTKGRzdEZvcm1hdCkpIHsKKyAgICAgICAgaWYgKGRlc2MtPmNvbXBbMF0uZGVwdGhfbWludXMxID09IDgpIHsKKyAgICAgICAgICAgICp5dXYycGxhbmVYID0gaXNCRShkc3RGb3JtYXQpID8geXV2MnBsYW5lWF85QkVfYyAgOiB5dXYycGxhbmVYXzlMRV9jOworICAgICAgICAgICAgKnl1djJwbGFuZTEgPSBpc0JFKGRzdEZvcm1hdCkgPyB5dXYycGxhbmUxXzlCRV9jICA6IHl1djJwbGFuZTFfOUxFX2M7CisgICAgICAgIH0gZWxzZSBpZiAoZGVzYy0+Y29tcFswXS5kZXB0aF9taW51czEgPT0gOSkgeworICAgICAgICAgICAgKnl1djJwbGFuZVggPSBpc0JFKGRzdEZvcm1hdCkgPyB5dXYycGxhbmVYXzEwQkVfYyAgOiB5dXYycGxhbmVYXzEwTEVfYzsKKyAgICAgICAgICAgICp5dXYycGxhbmUxID0gaXNCRShkc3RGb3JtYXQpID8geXV2MnBsYW5lMV8xMEJFX2MgIDogeXV2MnBsYW5lMV8xMExFX2M7CisgICAgICAgIH0gZWxzZSBpZiAoZGVzYy0+Y29tcFswXS5kZXB0aF9taW51czEgPT0gMTEpIHsKKyAgICAgICAgICAgICp5dXYycGxhbmVYID0gaXNCRShkc3RGb3JtYXQpID8geXV2MnBsYW5lWF8xMkJFX2MgIDogeXV2MnBsYW5lWF8xMkxFX2M7CisgICAgICAgICAgICAqeXV2MnBsYW5lMSA9IGlzQkUoZHN0Rm9ybWF0KSA/IHl1djJwbGFuZTFfMTJCRV9jICA6IHl1djJwbGFuZTFfMTJMRV9jOworICAgICAgICB9IGVsc2UgaWYgKGRlc2MtPmNvbXBbMF0uZGVwdGhfbWludXMxID09IDEzKSB7CisgICAgICAgICAgICAqeXV2MnBsYW5lWCA9IGlzQkUoZHN0Rm9ybWF0KSA/IHl1djJwbGFuZVhfMTRCRV9jICA6IHl1djJwbGFuZVhfMTRMRV9jOworICAgICAgICAgICAgKnl1djJwbGFuZTEgPSBpc0JFKGRzdEZvcm1hdCkgPyB5dXYycGxhbmUxXzE0QkVfYyAgOiB5dXYycGxhbmUxXzE0TEVfYzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0gZWxzZSB7CisgICAgICAgICp5dXYycGxhbmUxID0geXV2MnBsYW5lMV84X2M7CisgICAgICAgICp5dXYycGxhbmVYID0geXV2MnBsYW5lWF84X2M7CisgICAgICAgIGlmIChkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9OVjEyIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX05WMjEpCisgICAgICAgICAgICAqeXV2Mm52MTJjWCA9IHl1djJudjEyY1hfYzsKKyAgICB9CisKKyAgICBpZihjLT5mbGFncyAmIFNXU19GVUxMX0NIUl9IX0lOVCkgeworICAgICAgICBzd2l0Y2ggKGRzdEZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CisjaWYgQ09ORklHX1NNQUxMCisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYmEzMl9mdWxsX1hfYzsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiYTMyX2Z1bGxfMl9jOworICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJyZ2JhMzJfZnVsbF8xX2M7CisjZWxzZQorI2lmIENPTkZJR19TV1NDQUxFX0FMUEhBCisgICAgICAgICAgICAgICAgaWYgKGMtPmFscFBpeEJ1ZikgeworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdiYTMyX2Z1bGxfWF9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiYTMyX2Z1bGxfMl9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdiYTMyX2Z1bGxfMV9jOworICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENPTkZJR19TV1NDQUxFX0FMUEhBICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdieDMyX2Z1bGxfWF9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdieDMyX2Z1bGxfMl9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdieDMyX2Z1bGxfMV9jOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiAhQ09ORklHX1NNQUxMICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQVJHQjoKKyNpZiBDT05GSUdfU01BTEwKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYyYXJnYjMyX2Z1bGxfWF9jOworICAgICAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJhcmdiMzJfZnVsbF8yX2M7CisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MmFyZ2IzMl9mdWxsXzFfYzsKKyNlbHNlCisjaWYgQ09ORklHX1NXU0NBTEVfQUxQSEEKKyAgICAgICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKSB7CisgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJhcmdiMzJfZnVsbF9YX2M7CisgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJhcmdiMzJfZnVsbF8yX2M7CisgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJhcmdiMzJfZnVsbF8xX2M7CisgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ09ORklHX1NXU0NBTEVfQUxQSEEgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJ4cmdiMzJfZnVsbF9YX2M7CisgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJ4cmdiMzJfZnVsbF8yX2M7CisgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJ4cmdiMzJfZnVsbF8xX2M7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qICFDT05GSUdfU01BTEwgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBOgorI2lmIENPTkZJR19TTUFMTAorICAgICAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJiZ3JhMzJfZnVsbF9YX2M7CisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MmJncmEzMl9mdWxsXzJfYzsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYyYmdyYTMyX2Z1bGxfMV9jOworI2Vsc2UKKyNpZiBDT05GSUdfU1dTQ0FMRV9BTFBIQQorICAgICAgICAgICAgICAgIGlmIChjLT5hbHBQaXhCdWYpIHsKKyAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MmJncmEzMl9mdWxsX1hfYzsKKyAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MmJncmEzMl9mdWxsXzJfYzsKKyAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MmJncmEzMl9mdWxsXzFfYzsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDT05GSUdfU1dTQ0FMRV9BTFBIQSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MmJncngzMl9mdWxsX1hfYzsKKyAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MmJncngzMl9mdWxsXzJfYzsKKyAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MmJncngzMl9mdWxsXzFfYzsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogIUNPTkZJR19TTUFMTCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0FCR1I6CisjaWYgQ09ORklHX1NNQUxMCisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MmFiZ3IzMl9mdWxsX1hfYzsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYyYWJncjMyX2Z1bGxfMl9jOworICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJhYmdyMzJfZnVsbF8xX2M7CisjZWxzZQorI2lmIENPTkZJR19TV1NDQUxFX0FMUEhBCisgICAgICAgICAgICAgICAgaWYgKGMtPmFscFBpeEJ1ZikgeworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYyYWJncjMyX2Z1bGxfWF9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYyYWJncjMyX2Z1bGxfMl9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYyYWJncjMyX2Z1bGxfMV9jOworICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENPTkZJR19TV1NDQUxFX0FMUEhBICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYyeGJncjMyX2Z1bGxfWF9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYyeGJncjMyX2Z1bGxfMl9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYyeGJncjMyX2Z1bGxfMV9jOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiAhQ09ORklHX1NNQUxMICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdiMjRfZnVsbF9YX2M7CisgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiMjRfZnVsbF8yX2M7CisgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdiMjRfZnVsbF8xX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MmJncjI0X2Z1bGxfWF9jOworICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MmJncjI0X2Z1bGxfMl9jOworICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MmJncjI0X2Z1bGxfMV9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0X0JZVEU6CisgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYyYmdyNF9ieXRlX2Z1bGxfWF9jOworICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MmJncjRfYnl0ZV9mdWxsXzJfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJiZ3I0X2J5dGVfZnVsbF8xX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjRfQllURToKKyAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJyZ2I0X2J5dGVfZnVsbF9YX2M7CisgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiNF9ieXRlX2Z1bGxfMl9jOworICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MnJnYjRfYnl0ZV9mdWxsXzFfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSODoKKyAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJiZ3I4X2Z1bGxfWF9jOworICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MmJncjhfZnVsbF8yX2M7CisgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYyYmdyOF9mdWxsXzFfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCODoKKyAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJyZ2I4X2Z1bGxfWF9jOworICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MnJnYjhfZnVsbF8yX2M7CisgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdiOF9mdWxsXzFfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDoKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA5QkU6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOUxFOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwQkU6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTBMRToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMkJFOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyTEU6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTRCRToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNExFOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE2QkU6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTZMRToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQOgorICAgICAgICAgICAgKnl1djJhbnlYID0geXV2MmdicnBfZnVsbF9YX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoISp5dXYycGFja2VkWCAmJiAhKnl1djJhbnlYKQorICAgICAgICAgICAgZ290byBZVVZfUEFDS0VEOworICAgIH0gZWxzZSB7CisgICAgICAgIFlVVl9QQUNLRUQ6CisgICAgICAgIHN3aXRjaCAoZHN0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRMRToKKyNpZiBDT05GSUdfU1dTQ0FMRV9BTFBIQQorICAgICAgICAgICAgaWYgKGMtPmFscFBpeEJ1ZikgeworICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJyZ2JhNjRsZV8xX2M7CisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MnJnYmE2NGxlXzJfYzsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdiYTY0bGVfWF9jOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ09ORklHX1NXU0NBTEVfQUxQSEEgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdieDY0bGVfMV9jOworICAgICAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJyZ2J4NjRsZV8yX2M7CisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYng2NGxlX1hfYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQTY0QkU6CisjaWYgQ09ORklHX1NXU0NBTEVfQUxQSEEKKyAgICAgICAgICAgIGlmIChjLT5hbHBQaXhCdWYpIHsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdiYTY0YmVfMV9jOworICAgICAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJyZ2JhNjRiZV8yX2M7CisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYmE2NGJlX1hfYzsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENPTkZJR19TV1NDQUxFX0FMUEhBICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MnJnYng2NGJlXzFfYzsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdieDY0YmVfMl9jOworICAgICAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJyZ2J4NjRiZV9YX2M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE2NExFOgorI2lmIENPTkZJR19TV1NDQUxFX0FMUEhBCisgICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKSB7CisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MmJncmE2NGxlXzFfYzsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYyYmdyYTY0bGVfMl9jOworICAgICAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJiZ3JhNjRsZV9YX2M7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDT05GSUdfU1dTQ0FMRV9BTFBIQSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJiZ3J4NjRsZV8xX2M7CisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MmJncng2NGxlXzJfYzsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYyYmdyeDY0bGVfWF9jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBNjRCRToKKyNpZiBDT05GSUdfU1dTQ0FMRV9BTFBIQQorICAgICAgICAgICAgaWYgKGMtPmFscFBpeEJ1ZikgeworICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJiZ3JhNjRiZV8xX2M7CisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MmJncmE2NGJlXzJfYzsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYyYmdyYTY0YmVfWF9jOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ09ORklHX1NXU0NBTEVfQUxQSEEgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYyYmdyeDY0YmVfMV9jOworICAgICAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJiZ3J4NjRiZV8yX2M7CisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MmJncng2NGJlX1hfYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDhMRToKKyAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJyZ2I0OGxlXzFfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJyZ2I0OGxlXzJfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJyZ2I0OGxlX1hfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDhCRToKKyAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJyZ2I0OGJlXzFfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJyZ2I0OGJlXzJfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJyZ2I0OGJlX1hfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDhMRToKKyAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJiZ3I0OGxlXzFfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJiZ3I0OGxlXzJfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJiZ3I0OGxlX1hfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDhCRToKKyAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJiZ3I0OGJlXzFfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJiZ3I0OGJlXzJfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJiZ3I0OGJlX1hfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMzI6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IzMjoKKyNpZiBDT05GSUdfU01BTEwKKyAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJyZ2IzMl8xX2M7CisgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiMzJfMl9jOworICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYjMyX1hfYzsKKyNlbHNlCisjaWYgQ09ORklHX1NXU0NBTEVfQUxQSEEKKyAgICAgICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKSB7CisgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJyZ2JhMzJfMV9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiYTMyXzJfYzsKKyAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYmEzMl9YX2M7CisgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ09ORklHX1NXU0NBTEVfQUxQSEEgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJyZ2J4MzJfMV9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdieDMyXzJfYzsKKyAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYngzMl9YX2M7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qICFDT05GSUdfU01BTEwgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMzJfMToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjMyXzE6CisjaWYgQ09ORklHX1NNQUxMCisgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MnJnYjMyXzFfMV9jOworICAgICAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJyZ2IzMl8xXzJfYzsKKyAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdiMzJfMV9YX2M7CisjZWxzZQorI2lmIENPTkZJR19TV1NDQUxFX0FMUEhBCisgICAgICAgICAgICAgICAgaWYgKGMtPmFscFBpeEJ1ZikgeworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdiYTMyXzFfMV9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiYTMyXzFfMl9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdiYTMyXzFfWF9jOworICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENPTkZJR19TV1NDQUxFX0FMUEhBICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdieDMyXzFfMV9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdieDMyXzFfMl9jOworICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdieDMyXzFfWF9jOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiAhQ09ORklHX1NNQUxMICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJyZ2IyNF8xX2M7CisgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiMjRfMl9jOworICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYjI0X1hfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYyYmdyMjRfMV9jOworICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MmJncjI0XzJfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJiZ3IyNF9YX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU2NUxFOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTY1QkU6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I1NjVMRToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjU2NUJFOgorICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MnJnYjE2XzFfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJyZ2IxNl8yX2M7CisgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdiMTZfWF9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NTVMRToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU1NUJFOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNTU1TEU6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I1NTVCRToKKyAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJyZ2IxNV8xX2M7CisgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiMTVfMl9jOworICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYjE1X1hfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDQ0TEU6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0NDRCRToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ0NExFOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDQ0QkU6CisgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdiMTJfMV9jOworICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MnJnYjEyXzJfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJyZ2IxMl9YX2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjg6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I4OgorICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MnJnYjhfMV9jOworICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MnJnYjhfMl9jOworICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYjhfWF9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDoKKyAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJyZ2I0XzFfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJyZ2I0XzJfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJyZ2I0X1hfYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNF9CWVRFOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNF9CWVRFOgorICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MnJnYjRiXzFfYzsKKyAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJyZ2I0Yl8yX2M7CisgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdiNGJfWF9jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoIChkc3RGb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfTU9OT1dISVRFOgorICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYybW9ub3doaXRlXzFfYzsKKyAgICAgICAgKnl1djJwYWNrZWQyID0geXV2Mm1vbm93aGl0ZV8yX2M7CisgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJtb25vd2hpdGVfWF9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfTU9OT0JMQUNLOgorICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYybW9ub2JsYWNrXzFfYzsKKyAgICAgICAgKnl1djJwYWNrZWQyID0geXV2Mm1vbm9ibGFja18yX2M7CisgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJtb25vYmxhY2tfWF9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVZVjQyMjoKKyAgICAgICAgKnl1djJwYWNrZWQxID0geXV2Mnl1eXY0MjJfMV9jOworICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYyeXV5djQyMl8yX2M7CisgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJ5dXl2NDIyX1hfYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lWWVU0MjI6CisgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJ5dnl1NDIyXzFfYzsKKyAgICAgICAgKnl1djJwYWNrZWQyID0geXV2Mnl2eXU0MjJfMl9jOworICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYyeXZ5dTQyMl9YX2M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9VWVZZNDIyOgorICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYydXl2eTQyMl8xX2M7CisgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJ1eXZ5NDIyXzJfYzsKKyAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnV5dnk0MjJfWF9jOworICAgICAgICBicmVhazsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS9wcGMvTWFrZWZpbGUgYi9mZm1wZWcvbGlic3dzY2FsZS9wcGMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiNTk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL3BwYy9NYWtlZmlsZQpAQCAtMCwwICsxLDMgQEAKK09CSlMgKz0gcHBjL3N3c2NhbGVfYWx0aXZlYy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHBjL3l1djJyZ2JfYWx0aXZlYy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHBjL3l1djJ5dXZfYWx0aXZlYy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL3BwYy9zd3NjYWxlX2FsdGl2ZWMuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL3BwYy9zd3NjYWxlX2FsdGl2ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTU0OGE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvcHBjL3N3c2NhbGVfYWx0aXZlYy5jCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogQWx0aVZlYy1lbmhhbmNlZCB5dXYyeXV2WAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSb21haW4gRG9sYmVhdSA8cm9tYWluQGRvbGJlYXUub3JnPgorICogYmFzZWQgb24gdGhlIGVxdWl2YWxlbnQgQyBjb2RlIGluIHN3c2NhbGUuYworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZS5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgInl1djJyZ2JfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisKKyNpZiBIQVZFX0FMVElWRUMKKyNkZWZpbmUgdnplcm8gdmVjX3NwbGF0X3MzMigwKQorCisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgIEdFVF9MUyhhLGIsYyxzKSB7XAorICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IGwyICA9IHZlY19sZCgoKGIpIDw8IDEpICsgMTYsIHMpO1wKKyAgICAgICAgbHMgID0gdmVjX3Blcm0oYSwgbDIsIGMpO1wKKyAgICAgICAgYSA9IGwyO1wKKyAgICB9CisjZGVmaW5lICBHRVRfVkYoYSwgYiwgYyxkKSB7XAorICAgICAgICBhID0gdmVjX21lcmdlaChjLCBkKTtcCisgICAgICAgIGIgPSB2ZWNfbWVyZ2VsKGMsIGQpO1wKKyAgICB9CisjZWxzZQorI2RlZmluZSAgR0VUX0xTKGEsYixjLHMpIHtcCisgICAgICAgIGxzICA9IGE7XAorICAgICAgICBhID0gdmVjX3ZzeF9sZCgoKGIpIDw8IDEpICArIDE2LCBzKTtcCisgICAgfQorI2RlZmluZSAgR0VUX1ZGKGEsIGIsIGMsIGQpIHtcCisgICAgICAgIGEgPSB2ZWNfbWVyZ2VsKGQsIGMpO1wKKyAgICAgICAgYiA9IHZlY19tZXJnZWgoZCwgYyk7XAorICAgIH0KKyNlbmRpZgorCisjZGVmaW5lIHl1djJwbGFuZVhfOChkMSwgZDIsIGwxLCBzcmMsIHgsIHBlcm0sIGZpbHRlcikgZG8ge1wKKyAgICAgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBscztcCisgICAgICAgIEdFVF9MUyhsMSwgeCwgcGVybSwgc3JjKTtcCisgICAgICAgIHZlY3RvciBzaWduZWQgaW50ICAgaTEgID0gdmVjX211bGUoZmlsdGVyLCBscyk7XAorICAgICAgICB2ZWN0b3Igc2lnbmVkIGludCAgIGkyICA9IHZlY19tdWxvKGZpbHRlciwgbHMpO1wKKyAgICAgICAgdmVjdG9yIHNpZ25lZCBpbnQgICB2ZjEsIHZmMjtcCisgICAgICAgIEdFVF9WRih2ZjEsIHZmMiwgaTEsIGkyKTtcCisgICAgICAgIGQxID0gdmVjX2FkZChkMSwgdmYxKTtcCisgICAgICAgIGQyID0gdmVjX2FkZChkMiwgdmYyKTtcCisgICAgfSB3aGlsZSAoMCkKKworI2lmIEhBVkVfQklHRU5ESUFOCisjZGVmaW5lIExPQURfRklMVEVSKHZmLGYpIHtcCisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBlcm0wID0gdmVjX2x2c2woam9mZnNldCwgZik7XAorICAgICAgICB2ZiA9IHZlY19sZChqb2Zmc2V0LCBmKTtcCisgICAgICAgIHZmID0gdmVjX3Blcm0odmYsIHZmLCBwZXJtMCk7XAorfQorI2RlZmluZSBMT0FEX0wxKGxsMSxzLHApe1wKKyAgICAgICAgcCA9IHZlY19sdnNsKHhvZmZzZXQsIHMpO1wKKyAgICAgICAgbGwxICAgPSB2ZWNfbGQoeG9mZnNldCwgcyk7XAorfQorI2Vsc2UKKyNkZWZpbmUgTE9BRF9GSUxURVIodmYsZikge1wKKyAgICAgICAgdmYgPSB2ZWNfdnN4X2xkKGpvZmZzZXQsIGYpO1wKK30KKyNkZWZpbmUgTE9BRF9MMShsbDEscyxwKXtcCisgICAgICAgIGxsMSAgPSB2ZWNfdnN4X2xkKHhvZmZzZXQsIHMpO1wKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB5dXYycGxhbmVYXzE2X2FsdGl2ZWMoY29uc3QgaW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqc3JjLCB1aW50OF90ICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpdGhlciwgaW50IG9mZnNldCwgaW50IHgpCit7CisgICAgcmVnaXN0ZXIgaW50IGksIGo7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQsIHZhbClbMTZdOworICAgIHZlY3RvciBzaWduZWQgaW50IHZvMSwgdm8yLCB2bzMsIHZvNDsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdnMxLCB2czI7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmY7CisgICAgdmVjdG9yIHVuc2lnbmVkIGludCBhbHRpdmVjX3ZlY3RvclNoaWZ0SW50MTkgPQorICAgICAgICB2ZWNfYWRkKHZlY19zcGxhdF91MzIoMTApLCB2ZWNfc3BsYXRfdTMyKDkpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB2YWxbaV0gPSBkaXRoZXJbKHggKyBpICsgb2Zmc2V0KSAmIDddIDw8IDEyOworCisgICAgdm8xID0gdmVjX2xkKDAsICB2YWwpOworICAgIHZvMiA9IHZlY19sZCgxNiwgdmFsKTsKKyAgICB2bzMgPSB2ZWNfbGQoMzIsIHZhbCk7CisgICAgdm80ID0gdmVjX2xkKDQ4LCB2YWwpOworCisgICAgZm9yIChqID0gMDsgaiA8IGZpbHRlclNpemU7IGorKykgeworICAgICAgICB1bnNpZ25lZCBpbnQgam9mZnNldD1qPDwxOworICAgICAgICB1bnNpZ25lZCBpbnQgeG9mZnNldD14PDwxOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtOworICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IGwxLHZMdW1GaWx0ZXI7CisgICAgICAgIExPQURfRklMVEVSKHZMdW1GaWx0ZXIsZmlsdGVyKTsKKyAgICAgICAgdkx1bUZpbHRlciA9IHZlY19zcGxhdCh2THVtRmlsdGVyLCAwKTsKKyAgICAgICAgTE9BRF9MMShsMSxzcmNbal0scGVybSk7CisgICAgICAgIHl1djJwbGFuZVhfOCh2bzEsIHZvMiwgbDEsIHNyY1tqXSwgeCwgICAgIHBlcm0sIHZMdW1GaWx0ZXIpOworICAgICAgICB5dXYycGxhbmVYXzgodm8zLCB2bzQsIGwxLCBzcmNbal0sIHggKyA4LCBwZXJtLCB2THVtRmlsdGVyKTsKKyAgICB9CisKKyAgICB2bzEgPSB2ZWNfc3JhKHZvMSwgYWx0aXZlY192ZWN0b3JTaGlmdEludDE5KTsKKyAgICB2bzIgPSB2ZWNfc3JhKHZvMiwgYWx0aXZlY192ZWN0b3JTaGlmdEludDE5KTsKKyAgICB2bzMgPSB2ZWNfc3JhKHZvMywgYWx0aXZlY192ZWN0b3JTaGlmdEludDE5KTsKKyAgICB2bzQgPSB2ZWNfc3JhKHZvNCwgYWx0aXZlY192ZWN0b3JTaGlmdEludDE5KTsKKyAgICB2czEgPSB2ZWNfcGFja3N1KHZvMSwgdm8yKTsKKyAgICB2czIgPSB2ZWNfcGFja3N1KHZvMywgdm80KTsKKyAgICB2ZiAgPSB2ZWNfcGFja3N1KHZzMSwgdnMyKTsKKyAgICBWRUNfU1QodmYsIDAsIGRlc3QpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB5dXYycGxhbmVYX3UoY29uc3QgaW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKnNyYywgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpdGhlciwgaW50IG9mZnNldCwgaW50IHgpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSB4OyBpIDwgZHN0VzsgaSsrKSB7CisgICAgICAgIGludCB0ID0gZGl0aGVyWyhpICsgb2Zmc2V0KSAmIDddIDw8IDEyOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyU2l6ZTsgaisrKQorICAgICAgICAgICAgdCArPSBzcmNbal1baV0gKiBmaWx0ZXJbal07CisgICAgICAgIGRlc3RbaV0gPSBhdl9jbGlwX3VpbnQ4KHQgPj4gMTkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgeXV2MnBsYW5lWF9hbHRpdmVjKGNvbnN0IGludDE2X3QgKmZpbHRlciwgaW50IGZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKnNyYywgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGl0aGVyLCBpbnQgb2Zmc2V0KQoreworICAgIGludCBkc3RfdSA9IC0odWludHB0cl90KWRlc3QgJiAxNTsKKyAgICBpbnQgaTsKKworICAgIHl1djJwbGFuZVhfdShmaWx0ZXIsIGZpbHRlclNpemUsIHNyYywgZGVzdCwgZHN0X3UsIGRpdGhlciwgb2Zmc2V0LCAwKTsKKworICAgIGZvciAoaSA9IGRzdF91OyBpIDwgZHN0VyAtIDE1OyBpICs9IDE2KQorICAgICAgICB5dXYycGxhbmVYXzE2X2FsdGl2ZWMoZmlsdGVyLCBmaWx0ZXJTaXplLCBzcmMsIGRlc3QgKyBpLCBkaXRoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGkpOworCisgICAgeXV2MnBsYW5lWF91KGZpbHRlciwgZmlsdGVyU2l6ZSwgc3JjLCBkZXN0LCBkc3RXLCBkaXRoZXIsIG9mZnNldCwgaSk7Cit9CisKKyNpZiBIQVZFX0JJR0VORElBTgorLy8gVGhlIDMgYWJvdmUgaXMgMiAoZmlsdGVyU2l6ZSA9PSA0KSArIDEgKHNpemVvZihzaG9ydCkgPT0gMikuCisKKy8vIFRoZSBuZWF0IHRyaWNrOiBXZSBvbmx5IGNhcmUgZm9yIGhhbGYgdGhlIGVsZW1lbnRzLAorLy8gaGlnaCBvciBsb3cgZGVwZW5kaW5nIG9uIChpPDwzKSUxNiAoaXQncyAwIG9yIDggaGVyZSksCisvLyBhbmQgd2UncmUgZ29pbmcgdG8gdXNlIHZlY19tdWxlLCBzbyB3ZSBjaG9vc2UKKy8vIGNhcmVmdWxseSBob3cgdG8gInVucGFjayIgdGhlIGVsZW1lbnRzIGludG8gdGhlIGV2ZW4gc2xvdHMuCisjZGVmaW5lIEdFVF9WRjQoYSwgdmYsIGYpIHtcCisgICAgdmYgPSB2ZWNfbGQoYTw8IDMsIGYpO1wKKyAgICBpZiAoKGEgPDwgMykgJSAxNilcCisgICAgICAgIHZmID0gdmVjX21lcmdlbCh2ZiwgKHZlY3RvciBzaWduZWQgc2hvcnQpdnplcm8pO1wKKyAgICBlbHNlXAorICAgICAgICB2ZiA9IHZlY19tZXJnZWgodmYsICh2ZWN0b3Igc2lnbmVkIHNob3J0KXZ6ZXJvKTtcCit9CisjZGVmaW5lIEZJUlNUX0xPQUQoc3YsIHBvcywgcywgcGVyKSB7XAorICAgIHN2ID0gdmVjX2xkKHBvcywgcyk7XAorICAgIHBlciA9IHZlY19sdnNsKHBvcywgcyk7XAorfQorI2RlZmluZSBVUERBVEVfUFRSKHMwLCBkMCwgczEsIGQxKSB7XAorICAgIGQwID0gczA7XAorICAgIGQxID0gczE7XAorfQorI2RlZmluZSBMT0FEX1NSQ1YocG9zLCBhLCBzLCBwZXIsIHYwLCB2MSwgdmYpIHtcCisgICAgdjEgPSB2ZWNfbGQocG9zICsgYSArIDE2LCBzKTtcCisgICAgdmYgPSB2ZWNfcGVybSh2MCwgdjEsIHBlcik7XAorfQorI2RlZmluZSBMT0FEX1NSQ1Y4KHBvcywgYSwgcywgcGVyLCB2MCwgdjEsIHZmKSB7XAorICAgIGlmICgoKCh1aW50cHRyX3QpcyArIHBvcykgJSAxNikgPiA4KSB7XAorICAgICAgICB2MSA9IHZlY19sZChwb3MgKyBhICsgMTYsIHMpO1wKKyAgICB9XAorICAgIHZmID0gdmVjX3Blcm0odjAsIHNyY192MSwgcGVyKTtcCit9CisjZGVmaW5lIEdFVF9WRkQoYSwgYiwgZiwgdmYwLCB2ZjEsIHBlciwgdmYsIG9mZikge1wKKyAgICB2ZjEgPSB2ZWNfbGQoKGEgKiAyICogZmlsdGVyU2l6ZSkgKyAoYiAqIDIpICsgMTYgKyBvZmYsIGYpO1wKKyAgICB2ZiAgPSB2ZWNfcGVybSh2ZjAsIHZmMSwgcGVyKTtcCit9CisjZWxzZSAvKiBlbHNlIG9mICNpZiBIQVZFX0JJR0VORElBTiAqLworI2RlZmluZSBHRVRfVkY0KGEsIHZmLCBmKSB7XAorICAgIHZmID0gKHZlY3RvciBzaWduZWQgc2hvcnQpdmVjX3ZzeF9sZChhIDw8IDMsIGYpO1wKKyAgICB2ZiA9IHZlY19tZXJnZWgodmYsICh2ZWN0b3Igc2lnbmVkIHNob3J0KXZ6ZXJvKTtcCit9CisjZGVmaW5lIEZJUlNUX0xPQUQoc3YsIHBvcywgcywgcGVyKSB7fQorI2RlZmluZSBVUERBVEVfUFRSKHMwLCBkMCwgczEsIGQxKSB7fQorI2RlZmluZSBMT0FEX1NSQ1YocG9zLCBhLCBzLCBwZXIsIHYwLCB2MSwgdmYpIHtcCisgICAgdmYgPSB2ZWNfdnN4X2xkKHBvcyArIGEsIHMpO1wKK30KKyNkZWZpbmUgTE9BRF9TUkNWOChwb3MsIGEsIHMsIHBlciwgdjAsIHYxLCB2ZikgTE9BRF9TUkNWKHBvcywgYSwgcywgcGVyLCB2MCwgdjEsIHZmKQorI2RlZmluZSBHRVRfVkZEKGEsIGIsIGYsIHZmMCwgdmYxLCBwZXIsIHZmLCBvZmYpIHtcCisgICAgdmYgID0gdmVjX3ZzeF9sZCgoYSAqIDIgKiBmaWx0ZXJTaXplKSArIChiICogMikgKyBvZmYsIGYpO1wKK30KKyNlbmRpZiAvKiBlbmQgb2YgI2lmIEhBVkVfQklHRU5ESUFOICovCisKK3N0YXRpYyB2b2lkIGhTY2FsZV9hbHRpdmVjX3JlYWwoU3dzQ29udGV4dCAqYywgaW50MTZfdCAqZHN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCBpbnQxNl90ICpmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmZpbHRlclBvcywgaW50IGZpbHRlclNpemUpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQsIHRlbXBvKVs0XTsKKworICAgIGlmIChmaWx0ZXJTaXplICUgNCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSsrKSB7CisgICAgICAgICAgICByZWdpc3RlciBpbnQgajsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGludCBzcmNQb3MgPSBmaWx0ZXJQb3NbaV07CisgICAgICAgICAgICByZWdpc3RlciBpbnQgdmFsICAgID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmaWx0ZXJTaXplOyBqKyspCisgICAgICAgICAgICAgICAgdmFsICs9ICgoaW50KXNyY1tzcmNQb3MgKyBqXSkgKiBmaWx0ZXJbZmlsdGVyU2l6ZSAqIGkgKyBqXTsKKyAgICAgICAgICAgIGRzdFtpXSA9IEZGTUlOKHZhbCA+PiA3LCAoMSA8PCAxNSkgLSAxKTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBzd2l0Y2ggKGZpbHRlclNpemUpIHsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkrKykgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGludCBzcmNQb3MgPSBmaWx0ZXJQb3NbaV07CisKKyAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBzcmNfdkYgPSB1bmFsaWduZWRfbG9hZChzcmNQb3MsIHNyYyk7CisgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBzcmNfdiwgZmlsdGVyX3Y7CisgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBpbnQgdmFsX3ZFdmVuLCB2YWxfczsKKyAgICAgICAgICAgICAgICBzcmNfdiA9IC8vIHZlY191bnBhY2toIHNpZ24tZXh0ZW5kcy4uLgorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpKFZFQ19NRVJHRUgoKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZ6ZXJvLCBzcmNfdkYpKTsKKyAgICAgICAgICAgICAgICAvLyBub3cgcHV0IG91ciBlbGVtZW50cyBpbiB0aGUgZXZlbiBzbG90cworICAgICAgICAgICAgICAgIHNyY192ID0gdmVjX21lcmdlaChzcmNfdiwgKHZlY3RvciBzaWduZWQgc2hvcnQpdnplcm8pOworICAgICAgICAgICAgICAgIEdFVF9WRjQoaSwgZmlsdGVyX3YsIGZpbHRlcik7CisgICAgICAgICAgICAgICAgdmFsX3ZFdmVuID0gdmVjX211bGUoc3JjX3YsIGZpbHRlcl92KTsKKyAgICAgICAgICAgICAgICB2YWxfcyAgICAgPSB2ZWNfc3Vtcyh2YWxfdkV2ZW4sIHZ6ZXJvKTsKKyAgICAgICAgICAgICAgICB2ZWNfc3QodmFsX3MsIDAsIHRlbXBvKTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBGRk1JTih0ZW1wb1szXSA+PiA3LCAoMSA8PCAxNSkgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkc3RXOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBpbnQgc3JjUG9zID0gZmlsdGVyUG9zW2ldOworICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNyY192Riwgc3JjX3YwLCBzcmNfdjE7CisgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybVM7CisgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBzcmNfdiwgZmlsdGVyX3Y7CisgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBpbnQgdmFsX3YsIHZhbF9zOworICAgICAgICAgICAgICAgIEZJUlNUX0xPQUQoc3JjX3YwLCBzcmNQb3MsIHNyYywgcGVybVMpOworICAgICAgICAgICAgICAgIExPQURfU1JDVjgoc3JjUG9zLCAwLCBzcmMsIHBlcm1TLCBzcmNfdjAsIHNyY192MSwgc3JjX3ZGKTsKKyAgICAgICAgICAgICAgICBzcmNfdiA9IC8vIHZlY191bnBhY2toIHNpZ24tZXh0ZW5kcy4uLgorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpKFZFQ19NRVJHRUgoKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZ6ZXJvLCBzcmNfdkYpKTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJfdiA9IHZlY19sZChpIDw8IDQsIGZpbHRlcik7CisgICAgICAgICAgICAgICAgdmFsX3YgPSB2ZWNfbXN1bXMoc3JjX3YsIGZpbHRlcl92LCAodmVjdG9yIHNpZ25lZCBpbnQpdnplcm8pOworICAgICAgICAgICAgICAgIHZhbF9zID0gdmVjX3N1bXModmFsX3YsIHZ6ZXJvKTsKKyAgICAgICAgICAgICAgICB2ZWNfc3QodmFsX3MsIDAsIHRlbXBvKTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBGRk1JTih0ZW1wb1szXSA+PiA3LCAoMSA8PCAxNSkgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkc3RXOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBpbnQgc3JjUG9zID0gZmlsdGVyUG9zW2ldOworCisgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc3JjX3ZGID0gdW5hbGlnbmVkX2xvYWQoc3JjUG9zLCBzcmMpOworICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgc3JjX3ZBID0gLy8gdmVjX3VucGFja2ggc2lnbi1leHRlbmRzLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydCkoVkVDX01FUkdFSCgodmVjdG9yIHVuc2lnbmVkIGNoYXIpdnplcm8sIHNyY192RikpOworICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgc3JjX3ZCID0gLy8gdmVjX3VucGFja2ggc2lnbi1leHRlbmRzLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydCkoVkVDX01FUkdFTCgodmVjdG9yIHVuc2lnbmVkIGNoYXIpdnplcm8sIHNyY192RikpOworICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgZmlsdGVyX3YwID0gdmVjX2xkKGkgPDwgNSwgZmlsdGVyKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IGZpbHRlcl92MSA9IHZlY19sZCgoaSA8PCA1KSArIDE2LCBmaWx0ZXIpOworCisgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBpbnQgdmFsX2FjYyA9IHZlY19tc3VtcyhzcmNfdkEsIGZpbHRlcl92MCwgKHZlY3RvciBzaWduZWQgaW50KXZ6ZXJvKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGludCB2YWxfdiAgID0gdmVjX21zdW1zKHNyY192QiwgZmlsdGVyX3YxLCB2YWxfYWNjKTsKKworICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgaW50IHZhbF9zID0gdmVjX3N1bXModmFsX3YsIHZ6ZXJvKTsKKworICAgICAgICAgICAgICAgIFZFQ19TVCh2YWxfcywgMCwgdGVtcG8pOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IEZGTUlOKHRlbXBvWzNdID4+IDcsICgxIDw8IDE1KSAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkrKykgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGludCBqLCBvZmZzZXQgPSBpICogMiAqIGZpbHRlclNpemU7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgaW50IHNyY1BvcyA9IGZpbHRlclBvc1tpXTsKKworICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgaW50IHZhbF9zLCB2YWxfdiA9ICh2ZWN0b3Igc2lnbmVkIGludCl2emVybzsKKyAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IGZpbHRlcl92MFI7CisgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGVybUYsIHNyY192MCwgcGVybVM7CisgICAgICAgICAgICAgICAgRklSU1RfTE9BRChmaWx0ZXJfdjBSLCBvZmZzZXQsIGZpbHRlciwgcGVybUYpOworICAgICAgICAgICAgICAgIEZJUlNUX0xPQUQoc3JjX3YwLCBzcmNQb3MsIHNyYywgcGVybVMpOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpbHRlclNpemUgLSAxNTsgaiArPSAxNikgeworICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBzcmNfdjEsIHNyY192RjsKKyAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBmaWx0ZXJfdjFSLCBmaWx0ZXJfdjJSLCBmaWx0ZXJfdjAsIGZpbHRlcl92MTsKKyAgICAgICAgICAgICAgICAgICAgTE9BRF9TUkNWKHNyY1Bvcywgaiwgc3JjLCBwZXJtUywgc3JjX3YwLCBzcmNfdjEsIHNyY192Rik7CisgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgc3JjX3ZBID0gLy8gdmVjX3VucGFja2ggc2lnbi1leHRlbmRzLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpKFZFQ19NRVJHRUgoKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZ6ZXJvLCBzcmNfdkYpKTsKKyAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBzcmNfdkIgPSAvLyB2ZWNfdW5wYWNraCBzaWduLWV4dGVuZHMuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydCkoVkVDX01FUkdFTCgodmVjdG9yIHVuc2lnbmVkIGNoYXIpdnplcm8sIHNyY192RikpOworICAgICAgICAgICAgICAgICAgICBHRVRfVkZEKGksIGosIGZpbHRlciwgZmlsdGVyX3YwUiwgZmlsdGVyX3YxUiwgcGVybUYsIGZpbHRlcl92MCwgMCk7CisgICAgICAgICAgICAgICAgICAgIEdFVF9WRkQoaSwgaiwgZmlsdGVyLCBmaWx0ZXJfdjFSLCBmaWx0ZXJfdjJSLCBwZXJtRiwgZmlsdGVyX3YxLCAxNik7CisKKyAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBpbnQgdmFsX2FjYyA9IHZlY19tc3VtcyhzcmNfdkEsIGZpbHRlcl92MCwgdmFsX3YpOworICAgICAgICAgICAgICAgICAgICB2YWxfdiA9IHZlY19tc3VtcyhzcmNfdkIsIGZpbHRlcl92MSwgdmFsX2FjYyk7CisgICAgICAgICAgICAgICAgICAgIFVQREFURV9QVFIoZmlsdGVyX3YyUiwgZmlsdGVyX3YwUiwgc3JjX3YxLCBzcmNfdjApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChqIDwgZmlsdGVyU2l6ZSAtIDcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9hZGluZyBzcmNfdjAgaXMgdXNlbGVzcywgaXQncyBhbHJlYWR5IGRvbmUgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc3JjX3YxLCBzcmNfdkY7CisgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgc3JjX3YsIGZpbHRlcl92MVIsIGZpbHRlcl92OworICAgICAgICAgICAgICAgICAgICBMT0FEX1NSQ1Y4KHNyY1Bvcywgaiwgc3JjLCBwZXJtUywgc3JjX3YwLCBzcmNfdjEsIHNyY192Rik7CisgICAgICAgICAgICAgICAgICAgIHNyY192ID0gLy8gdmVjX3VucGFja2ggc2lnbi1leHRlbmRzLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpKFZFQ19NRVJHRUgoKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZ6ZXJvLCBzcmNfdkYpKTsKKyAgICAgICAgICAgICAgICAgICAgR0VUX1ZGRChpLCBqLCBmaWx0ZXIsIGZpbHRlcl92MFIsIGZpbHRlcl92MVIsIHBlcm1GLCBmaWx0ZXJfdiwgMCk7CisgICAgICAgICAgICAgICAgICAgIHZhbF92ID0gdmVjX21zdW1zKHNyY192LCBmaWx0ZXJfdiwgdmFsX3YpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWxfcyA9IHZlY19zdW1zKHZhbF92LCB2emVybyk7CisKKyAgICAgICAgICAgICAgICBWRUNfU1QodmFsX3MsIDAsIHRlbXBvKTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBGRk1JTih0ZW1wb1szXSA+PiA3LCAoMSA8PCAxNSkgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworCithdl9jb2xkIHZvaWQgZmZfc3dzX2luaXRfc3dzY2FsZV9wcGMoU3dzQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFX0FMVElWRUMKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0ID0gYy0+ZHN0Rm9ybWF0OworCisgICAgaWYgKCEoYXZfZ2V0X2NwdV9mbGFncygpICYgQVZfQ1BVX0ZMQUdfQUxUSVZFQykpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChjLT5zcmNCcGMgPT0gOCAmJiBjLT5kc3RCcGMgPD0gMTQpIHsKKyAgICAgICAgYy0+aHlTY2FsZSA9IGMtPmhjU2NhbGUgPSBoU2NhbGVfYWx0aXZlY19yZWFsOworICAgIH0KKyAgICBpZiAoIWlzMTZCUFMoZHN0Rm9ybWF0KSAmJiAhaXM5X09SXzEwQlBTKGRzdEZvcm1hdCkgJiYKKyAgICAgICAgZHN0Rm9ybWF0ICE9IEFWX1BJWF9GTVRfTlYxMiAmJiBkc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9OVjIxICYmCisgICAgICAgICFjLT5hbHBQaXhCdWYpIHsKKyAgICAgICAgYy0+eXV2MnBsYW5lWCA9IHl1djJwbGFuZVhfYWx0aXZlYzsKKyAgICB9CisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGxpc3Qgb2Ygc3VwcG9ydGVkIGRzdEZvcm1hdCB2YWx1ZXMgc2hvdWxkCisgICAgICogbWF0Y2ggd2hhdCdzIGZvdW5kIGluIHRoZSBib2R5IG9mIGZmX3l1djJwYWNrZWRYX2FsdGl2ZWMoKSAqLworICAgIGlmICghKGMtPmZsYWdzICYgKFNXU19CSVRFWEFDVCB8IFNXU19GVUxMX0NIUl9IX0lOVCkpICYmICFjLT5hbHBQaXhCdWYpIHsKKyAgICAgICAgc3dpdGNoIChjLT5kc3RGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0FCR1I6CisgICAgICAgICAgICBjLT55dXYycGFja2VkWCA9IGZmX3l1djJhYmdyX1hfYWx0aXZlYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQToKKyAgICAgICAgICAgIGMtPnl1djJwYWNrZWRYID0gZmZfeXV2MmJncmFfWF9hbHRpdmVjOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9BUkdCOgorICAgICAgICAgICAgYy0+eXV2MnBhY2tlZFggPSBmZl95dXYyYXJnYl9YX2FsdGl2ZWM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CisgICAgICAgICAgICBjLT55dXYycGFja2VkWCA9IGZmX3l1djJyZ2JhX1hfYWx0aXZlYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgICAgICAgICBjLT55dXYycGFja2VkWCA9IGZmX3l1djJiZ3IyNF9YX2FsdGl2ZWM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgorICAgICAgICAgICAgYy0+eXV2MnBhY2tlZFggPSBmZl95dXYycmdiMjRfWF9hbHRpdmVjOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS9wcGMveXV2MnJnYl9hbHRpdmVjLmMgYi9mZm1wZWcvbGlic3dzY2FsZS9wcGMveXV2MnJnYl9hbHRpdmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyODJiZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL3BwYy95dXYycmdiX2FsdGl2ZWMuYwpAQCAtMCwwICsxLDg2OCBAQAorLyoKKyAqIEFsdGlWZWMgYWNjZWxlcmF0aW9uIGZvciBjb2xvcnNwYWNlIGNvbnZlcnNpb24KKyAqCisgKiBjb3B5cmlnaHQgKEMpIDIwMDQgTWFyYyBIb2ZmbWFuIDxtYXJjLmhvZmZtYW5AYW5hbG9nLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIENvbnZlcnQgSTQyMCBZVjEyIHRvIFJHQiBpbiB2YXJpb3VzIGZvcm1hdHMsCisgKiBpdCByZWplY3RzIGltYWdlcyB0aGF0IGFyZSBub3QgaW4gNDIwIGZvcm1hdHMsCisgKiBpdCByZWplY3RzIGltYWdlcyB0aGF0IGRvbid0IGhhdmUgd2lkdGhzIG9mIG11bHRpcGxlcyBvZiAxNiwKKyAqIGl0IHJlamVjdHMgaW1hZ2VzIHRoYXQgZG9uJ3QgaGF2ZSBoZWlnaHRzIG9mIG11bHRpcGxlcyBvZiAyLgorICogUmVqZWN0IGRlZmVycyB0byBDIHNpbXVsYXRpb24gY29kZS4KKyAqCisgKiBMb3RzIG9mIG9wdGltaXphdGlvbnMgdG8gYmUgZG9uZSBoZXJlLgorICoKKyAqIDEuIE5lZWQgdG8gZml4IHNhdHVyYXRpb24gY29kZS4gSSBqdXN0IGNvdWxkbid0IGdldCBpdCB0byBmbHkgd2l0aCBwYWNrcworICogYW5kIGFkZHMsIHNvIHdlIGN1cnJlbnRseSB1c2UgbWF4L21pbiB0byBjbGlwLgorICoKKyAqIDIuIFRoZSBpbmVmZmljaWVudCB1c2Ugb2YgY2hyb21hIGxvYWRpbmcgbmVlZHMgYSBiaXQgb2YgYnJ1c2hpbmcgdXAuCisgKgorICogMy4gQW5hbHlzaXMgb2YgcGlwZWxpbmUgc3RhbGxzIG5lZWRzIHRvIGJlIGRvbmUuIFVzZSBzaGFyayB0byBpZGVudGlmeQorICogcGlwZWxpbmUgc3RhbGxzLgorICoKKyAqCisgKiBNT0RJRklFRCB0byBjYWxjdWxhdGUgY29lZmZzIGZyb20gY3VycmVudGx5IHNlbGVjdGVkIGNvbG9yIHNwYWNlLgorICogTU9ESUZJRUQgY29yZSB0byBiZSBhIG1hY3JvIHdoZXJlIHlvdSBzcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0LgorICogQURERUQgVVlWWSBjb252ZXJzaW9uIHdoaWNoIGlzIG5ldmVyIGNhbGxlZCBkdWUgdG8gc29tZSB0aGluZyBpbiBzd3NjYWxlLgorICogQ09SUkVDVEVEIGFsZ29yaXRoaW0gc2VsZWN0aW9uIHRvIGJlIHN0cmljdCBvbiBpbnB1dCBmb3JtYXRzLgorICogQURERUQgcnVudGltZSBkZXRlY3Rpb24gb2YgQWx0aVZlYy4KKyAqCisgKiBBRERFRCBhbHRpdmVjX3l1djJwYWNrZWRYIHZlcnRpY2FsIHNjbCArIFJHQiBjb252ZXJ0ZXIKKyAqCisgKiBNYXJjaCAyNywyMDA0CisgKiBQRVJGT1JNQU5DRSBBTkFMWVNJUworICoKKyAqIFRoZSBDIHZlcnNpb24gdXNlcyAyNSUgb2YgdGhlIHByb2Nlc3NvciBvciB+MjUwTWlwcyBmb3IgRDEgdmlkZW8gcmF3dmlkZW8KKyAqIHVzZWQgYXMgdGVzdC4KKyAqIFRoZSBBbHRpVmVjIHZlcnNpb24gdXNlcyAxMCUgb2YgdGhlIHByb2Nlc3NvciBvciB+MTAwTWlwcyBmb3IgRDEgdmlkZW8KKyAqIHNhbWUgc2VxdWVuY2UuCisgKgorICogNzIwICogNDgwICogMzAgIH4xME1QUworICoKKyAqIHNvIHdlIGhhdmUgcm91Z2hseSAxMCBjbG9ja3MgcGVyIHBpeGVsLiBUaGlzIGlzIHRvbyBoaWdoLCBzb21ldGhpbmcgaGFzCisgKiB0byBiZSB3cm9uZy4KKyAqCisgKiBPUFRJTUlaRUQgY2xpcCBjb2RlcyB0byB1dGlsaXplIHZlY19tYXggYW5kIHZlY19wYWNrcyByZW1vdmluZyB0aGUKKyAqIG5lZWQgZm9yIHZlY19taW4uCisgKgorICogT1BUSU1JWkVEIERTVCBPVVRQVVQgY2FjaGUvRE1BIGNvbnRyb2xzLiBXZSBhcmUgcHJldHR5IG11Y2ggZ3VhcmFudGVlZCB0bworICogaGF2ZSB0aGUgaW5wdXQgdmlkZW8gZnJhbWUsIGl0IHdhcyBqdXN0IGRlY29tcHJlc3NlZCBzbyBpdCBwcm9iYWJseSByZXNpZGVzCisgKiBpbiBMMSBjYWNoZXMuIEhvd2V2ZXIsIHdlIGFyZSBjcmVhdGluZyB0aGUgb3V0cHV0IHZpZGVvIHN0cmVhbS4gVGhpcyBuZWVkcworICogdG8gdXNlIHRoZSBEU1RTVCBpbnN0cnVjdGlvbiB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhY2hlLiBXZSBjb3VwbGUgdGhpcyB3aXRoCisgKiB0aGUgZmFjdCB0aGF0IHdlIGFyZSBub3QgZ29pbmcgdG8gYmUgdmlzaXRpbmcgdGhlIGlucHV0IGJ1ZmZlciBhZ2FpbiBzbyB3ZQorICogbWFyayBpdCBMZWFzdCBSZWNlbnRseSBVc2VkLiBUaGlzIHNoYXZlcyAyNSUgb2YgdGhlIHByb2Nlc3NvciBjeWNsZXMgb2ZmLgorICoKKyAqIE5vdyBtZW1jcHkgaXMgdGhlIGxhcmdlc3QgbWlwcyBjb25zdW1lciBpbiB0aGUgc3lzdGVtLCBwcm9iYWJseSBkdWUKKyAqIHRvIHRoZSBpbmVmZmljaWVudCBYMTEgc3R1ZmYuCisgKgorICogR0wgbGlicmFyaWVzIHNlZW0gdG8gYmUgdmVyeSBzbG93IG9uIHRoaXMgbWFjaGluZSAxLjMzR2h6IFBCIHJ1bm5pbmcKKyAqIEphZ3VhciwgdGhpcyBpcyBub3QgdGhlIGNhc2UgZm9yIG15IDFHaHogUEIuICBJIHRob3VnaHQgaXQgbWlnaHQgYmUKKyAqIGEgdmVyc2lvbmluZyBpc3N1ZSwgaG93ZXZlciBJIGhhdmUgbGliR0wuMS4yLmR5bGliIGZvciBib3RoCisgKiBtYWNoaW5lcy4gKFdlIG5lZWQgdG8gZmlndXJlIHRoaXMgb3V0IG5vdy4pCisgKgorICogR0wyIGxpYnJhcmllcyB3b3JrIG5vdyB3aXRoIHBhdGNoIGZvciBSR0IzMi4KKyAqCisgKiBOT1RFOiBxdWFydHogdm8gZHJpdmVyIEFSR0IzMl90b19SR0IyNCBjb25zdW1lcyAzMCUgb2YgdGhlIHByb2Nlc3Nvci4KKyAqCisgKiBJbnRlZ3JhdGVkIGx1bWEgcHJlc2NhbGluZyBhZGp1c3RtZW50IGZvciBzYXR1cmF0aW9uL2NvbnRyYXN0L2JyaWdodG5lc3MKKyAqIGFkanVzdG1lbnQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvcmdiMnJnYi5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZS5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAieXV2MnJnYl9hbHRpdmVjLmgiCisKKyNpZiBIQVZFX0FMVElWRUMKKworI3VuZGVmIFBST0ZJTEVfVEhFX0JFQVNUCisjdW5kZWYgSU5DX1NDQUxJTkcKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVieXRlOwordHlwZWRlZiBzaWduZWQgY2hhciAgIHNieXRlOworCisvKiBSR0IgaW50ZXJsZWF2ZXIsIDE2IHBsYW5hciBwZWxzIDgtYml0IHNhbXBsZXMgcGVyIGNoYW5uZWwgaW4KKyAqIGhvbW9nZW5lb3VzIHZlY3RvciByZWdpc3RlcnMgeDAseDEseDIgYXJlIGludGVybGVhdmVkIHdpdGggdGhlCisgKiBmb2xsb3dpbmcgdGVjaG5pcXVlOgorICoKKyAqICAgIG8wID0gdmVjX21lcmdlaCh4MCwgeDEpOworICogICAgbzEgPSB2ZWNfcGVybShvMCwgeDIsIHBlcm1fcmdiXzApOworICogICAgbzIgPSB2ZWNfcGVybShvMCwgeDIsIHBlcm1fcmdiXzEpOworICogICAgbzMgPSB2ZWNfbWVyZ2VsKHgwLCB4MSk7CisgKiAgICBvNCA9IHZlY19wZXJtKG8zLCBvMiwgcGVybV9yZ2JfMik7CisgKiAgICBvNSA9IHZlY19wZXJtKG8zLCBvMiwgcGVybV9yZ2JfMyk7CisgKgorICogcGVybV9yZ2JfMDogICBvMChSRykuaCB2MShCKSAtLT4gbzEqCisgKiAgICAgICAgICAgIDAgICAxICAyICAgMyAgIDQKKyAqICAgICAgICAgICByZ2JyfGdicmd8YnJnYnxyZ2JyCisgKiAgICAgICAgICAgMDAxMCAwMTAwIDEwMDEgMDAxMAorICogICAgICAgICAgIDAxMDIgMzE0NSAyNjczIDg5NEEKKyAqCisgKiBwZXJtX3JnYl8xOiAgIG8wKFJHKS5oIHYxKEIpIC0tPiBvMgorICogICAgICAgICAgICAwICAgMSAgMiAgIDMgICA0CisgKiAgICAgICAgICAgZ2JyZ3xicmdifGJiYmJ8YmJiYgorICogICAgICAgICAgIDAxMDAgMTAwMSAxMTExIDExMTEKKyAqICAgICAgICAgICBCNUNEIDZFRjcgODlBQiBDREVGCisgKgorICogcGVybV9yZ2JfMjogICBvMyhSRykubCBvMihyZ2JCLmwpIC0tPiBvNCoKKyAqICAgICAgICAgICAgMCAgIDEgIDIgICAzICAgNAorICogICAgICAgICAgIGdicmd8YnJnYnxyZ2JyfGdicmcKKyAqICAgICAgICAgICAxMTExIDExMTEgMDAxMCAwMTAwCisgKiAgICAgICAgICAgODlBQiBDREVGIDAxODIgMzk0NQorICoKKyAqIHBlcm1fcmdiXzI6ICAgbzMoUkcpLmwgbzIocmdiQi5sKSAtLS0+IG81KgorICogICAgICAgICAgICAwICAgMSAgMiAgIDMgICA0CisgKiAgICAgICAgICAgYnJnYnxyZ2JyfGdicmd8YnJnYgorICogICAgICAgICAgIDEwMDEgMDAxMCAwMTAwIDEwMDEKKyAqICAgICAgICAgICBhNjdiIDg5Y0EgQmRDRCBlRUZmCisgKgorICovCitzdGF0aWMgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIKKyAgICBwZXJtX3JnYl8wID0geyAweDAwLCAweDAxLCAweDEwLCAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LAorICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MDYsIDB4MDcsIDB4MTMsIDB4MDgsIDB4MDksIDB4MTQsIDB4MGEgfSwKKyAgICBwZXJtX3JnYl8xID0geyAweDBiLCAweDE1LCAweDBjLCAweDBkLCAweDE2LCAweDBlLCAweDBmLCAweDE3LAorICAgICAgICAgICAgICAgICAgIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYgfSwKKyAgICBwZXJtX3JnYl8yID0geyAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MTgsIDB4MDIsIDB4MDMsIDB4MTksIDB4MDQsIDB4MDUgfSwKKyAgICBwZXJtX3JnYl8zID0geyAweDFhLCAweDA2LCAweDA3LCAweDFiLCAweDA4LCAweDA5LCAweDFjLCAweDBhLAorICAgICAgICAgICAgICAgICAgIDB4MGIsIDB4MWQsIDB4MGMsIDB4MGQsIDB4MWUsIDB4MGUsIDB4MGYsIDB4MWYgfTsKKworI2RlZmluZSB2ZWNfbWVyZ2UzKHgyLCB4MSwgeDAsIHkwLCB5MSwgeTIpICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX190eXBlb2ZfXyh4MCkgbzAsIG8yLCBvMzsgICAgICAgICAgICAgXAorICAgICAgICBvMCA9IHZlY19tZXJnZWgoeDAsIHgxKTsgICAgICAgICAgICAgICBcCisgICAgICAgIHkwID0gdmVjX3Blcm0obzAsIHgyLCBwZXJtX3JnYl8wKTsgICAgIFwKKyAgICAgICAgbzIgPSB2ZWNfcGVybShvMCwgeDIsIHBlcm1fcmdiXzEpOyAgICAgXAorICAgICAgICBvMyA9IHZlY19tZXJnZWwoeDAsIHgxKTsgICAgICAgICAgICAgICBcCisgICAgICAgIHkxID0gdmVjX3Blcm0obzMsIG8yLCBwZXJtX3JnYl8yKTsgICAgIFwKKyAgICAgICAgeTIgPSB2ZWNfcGVybShvMywgbzIsIHBlcm1fcmdiXzMpOyAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgdmVjX21zdGJncjI0KHgwLCB4MSwgeDIsIHB0cikgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fdHlwZW9mX18oeDApIF8wLCBfMSwgXzI7ICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX21lcmdlMyh4MCwgeDEsIHgyLCBfMCwgXzEsIF8yKTsgICAgXAorICAgICAgICB2ZWNfc3QoXzAsIDAsIHB0cisrKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZlY19zdChfMSwgMCwgcHRyKyspOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3N0KF8yLCAwLCBwdHIrKyk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgdmVjX21zdHJnYjI0KHgwLCB4MSwgeDIsIHB0cikgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fdHlwZW9mX18oeDApIF8wLCBfMSwgXzI7ICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX21lcmdlMyh4MiwgeDEsIHgwLCBfMCwgXzEsIF8yKTsgICAgXAorICAgICAgICB2ZWNfc3QoXzAsIDAsIHB0cisrKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZlY19zdChfMSwgMCwgcHRyKyspOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3N0KF8yLCAwLCBwdHIrKyk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIHBhY2sgdGhlIHBpeGVscyBpbiByZ2IwIGZvcm1hdAorICogbXNiIFIKKyAqIGxzYiAwCisgKi8KKyNkZWZpbmUgdmVjX21zdHJnYjMyKFQsIHgwLCB4MSwgeDIsIHgzLCBwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVCBfMCwgXzEsIF8yLCBfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgXzAgPSB2ZWNfbWVyZ2VoKHgwLCB4MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgXzEgPSB2ZWNfbWVyZ2VoKHgyLCB4Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgXzIgPSAoVCkgdmVjX21lcmdlaCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KSBfMCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KSBfMSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgXzMgPSAoVCkgdmVjX21lcmdlbCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KSBfMCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KSBfMSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3N0KF8yLCAwICogMTYsIChUICopIHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3N0KF8zLCAxICogMTYsIChUICopIHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgXzAgPSB2ZWNfbWVyZ2VsKHgwLCB4MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgXzEgPSB2ZWNfbWVyZ2VsKHgyLCB4Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgXzIgPSAoVCkgdmVjX21lcmdlaCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KSBfMCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KSBfMSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgXzMgPSAoVCkgdmVjX21lcmdlbCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KSBfMCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KSBfMSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3N0KF8yLCAyICogMTYsIChUICopIHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmVjX3N0KF8zLCAzICogMTYsIChUICopIHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHRyICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisvKgorICogMSAgICAgMCAgICAgICAxLjQwMjEgICB8IHwgWSB8CisgKiAxICAgIC0wLjM0NDEgLTAuNzE0MiAgIHx4fCBDYnwKKyAqIDEgICAgIDEuNzcxOCAgMCAgICAgICAgfCB8IENyfAorICoKKyAqCisgKiBZOiAgICAgIFstMTI4IDEyN10KKyAqIENiL0NyIDogWy0xMjggMTI3XQorICoKKyAqIHR5cGljYWwgWVVWIGNvbnZlcnNpb24gd29ya3Mgb24gWTogMC0yNTUgdGhpcyB2ZXJzaW9uIGhhcyBiZWVuCisgKiBvcHRpbWl6ZWQgZm9yIEpQRUcgZGVjb2RpbmcuCisgKi8KKworI2RlZmluZSB2ZWNfdW5oKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ZWNfcGVybSh4LCAoX190eXBlb2ZfXyh4KSkgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAoKHZlY3RvciB1bnNpZ25lZCBjaGFyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgwMCwgMHgxMCwgMHgwMSwgMHgxMCwgMHgwMiwgMHgxMCwgMHgwMywgICAgXAorICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgwNCwgMHgxMCwgMHgwNSwgMHgxMCwgMHgwNiwgMHgxMCwgMHgwNyB9KSkKKworI2RlZmluZSB2ZWNfdW5sKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ZWNfcGVybSh4LCAoX190eXBlb2ZfXyh4KSkgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAoKHZlY3RvciB1bnNpZ25lZCBjaGFyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgwOCwgMHgxMCwgMHgwOSwgMHgxMCwgMHgwQSwgMHgxMCwgMHgwQiwgICAgXAorICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgwQywgMHgxMCwgMHgwRCwgMHgxMCwgMHgwRSwgMHgxMCwgMHgwRiB9KSkKKworI2RlZmluZSB2ZWNfY2xpcF9zMTYoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY19tYXgodmVjX21pbih4LCAoKHZlY3RvciBzaWduZWQgc2hvcnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAyMzUsIDIzNSwgMjM1LCAyMzUsIDIzNSwgMjM1LCAyMzUsIDIzNSB9KSksICAgICAgICAgXAorICAgICAgICAgICAgKCh2ZWN0b3Igc2lnbmVkIHNob3J0KSB7IDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiB9KSkKKworI2RlZmluZSB2ZWNfcGFja2NscCh4LCB5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ZWNfcGFja3MoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHZlY19tYXgoeCwgKCh2ZWN0b3Igc2lnbmVkIHNob3J0KSB7IDAgfSkpLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHZlY19tYXgoeSwgKCh2ZWN0b3Igc2lnbmVkIHNob3J0KSB7IDAgfSkpKQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3Z0eXV2dG9SR0IoU3dzQ29udGV4dCAqYywgdmVjdG9yIHNpZ25lZCBzaG9ydCBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgVSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgKlIsIHZlY3RvciBzaWduZWQgc2hvcnQgKkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCAqQikKK3sKKyAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IHZ4LCB1eCwgdXZ4OworCisgICAgWSA9IHZlY19tcmFkZHMoWSwgYy0+Q1ksIGMtPk9ZKTsKKyAgICBVID0gdmVjX3N1YihVLCAodmVjdG9yIHNpZ25lZCBzaG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgdmVjX3NwbGF0KCh2ZWN0b3Igc2lnbmVkIHNob3J0KSB7IDEyOCB9LCAwKSk7CisgICAgViA9IHZlY19zdWIoViwgKHZlY3RvciBzaWduZWQgc2hvcnQpCisgICAgICAgICAgICAgICAgICAgICAgIHZlY19zcGxhdCgodmVjdG9yIHNpZ25lZCBzaG9ydCkgeyAxMjggfSwgMCkpOworCisgICAgLy8gdXggID0gKENCVSAqICh1IDw8IGMtPkNTSElGVCkgKyAweDQwMDApID4+IDE1OworICAgIHV4ID0gdmVjX3NsKFUsIGMtPkNTSElGVCk7CisgICAgKkIgPSB2ZWNfbXJhZGRzKHV4LCBjLT5DQlUsIFkpOworCisgICAgLy8gdnggID0gKENSViAqICh2IDw8IGMtPkNTSElGVCkgKyAweDQwMDApID4+IDE1OworICAgIHZ4ID0gdmVjX3NsKFYsIGMtPkNTSElGVCk7CisgICAgKlIgPSB2ZWNfbXJhZGRzKHZ4LCBjLT5DUlYsIFkpOworCisgICAgLy8gdXZ4ID0gKChDR1UgKiB1KSArIChDR1YgKiB2KSkgPj4gMTU7CisgICAgdXZ4ID0gdmVjX21yYWRkcyhVLCBjLT5DR1UsIFkpOworICAgICpHICA9IHZlY19tcmFkZHMoViwgYy0+Q0dWLCB1dngpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDUyBjb252ZXJ0ZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIERFRkNTUDQyMF9DVlQobmFtZSwgb3V0X3BpeGVscykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IGFsdGl2ZWNfICMjIG5hbWUoU3dzQ29udGV4dCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbnN0cmlkZXMsIGludCBzcmNTbGljZVksIGludCBzcmNTbGljZUgsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKm9wbGFuZXMsIGludCAqb3V0c3RyaWRlcykgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHcgPSBjLT5zcmNXOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGggPSBzcmNTbGljZUg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGluc3RyaWRlc19zY2xbM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgeTAsIHkxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBjaGFyIHUsIHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBZMCwgWTEsIFkyLCBZMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBVLCBWOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCB2eCwgdXgsIHV2eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCB2eDAsIHV4MCwgdXZ4MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCB2eDEsIHV4MSwgdXZ4MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBSMCwgRzAsIEIwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBSMSwgRzEsIEIxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgUiwgRywgQjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgKnkxaXZQLCAqeTJpdlAsICp1aXZQLCAqdml2UDsgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgYWxpZ25fcGVybTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBsQ1kgICAgICAgPSBjLT5DWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBsT1kgICAgICAgPSBjLT5PWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBsQ1JWICAgICAgPSBjLT5DUlY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBsQ0JVICAgICAgPSBjLT5DQlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBsQ0dVICAgICAgPSBjLT5DR1U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBsQ0dWICAgICAgPSBjLT5DR1Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IGxDU0hJRlQgPSBjLT5DU0hJRlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWJ5dGUgKnkxaSA9IGluWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWJ5dGUgKnkyaSA9IGluWzBdICsgaW5zdHJpZGVzWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWJ5dGUgKnVpICA9IGluWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWJ5dGUgKnZpICA9IGluWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgKm91dGUsICpvdXRvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogbG9vcCBtb3ZlcyB5ezEsIDJ9aSBieSB3ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5zdHJpZGVzX3NjbFswXSA9IGluc3RyaWRlc1swXSAqIDIgLSB3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogbG9vcCBtb3ZlcyB1aSBieSB3IC8gMiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5zdHJpZGVzX3NjbFsxXSA9IGluc3RyaWRlc1sxXSAtIHcgLyAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogbG9vcCBtb3ZlcyB2aSBieSB3IC8gMiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5zdHJpZGVzX3NjbFsyXSA9IGluc3RyaWRlc1syXSAtIHcgLyAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGggLyAyOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG91dGUgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIgKikob3BsYW5lc1swXSArIG91dHN0cmlkZXNbMF0gKiAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNyY1NsaWNlWSArIGkgKiAyKSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIG91dG8gPSBvdXRlICsgKG91dHN0cmlkZXNbMF0gPj4gNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZlY19kc3RzdChvdXRvLCAoMHgwMjAwMDAwMiB8ICgoKHcgKiAzICsgMzIpIC8gMzIpIDw8IDE2KSksIDApOyAgICAgICBcCisgICAgICAgIHZlY19kc3RzdChvdXRlLCAoMHgwMjAwMDAwMiB8ICgoKHcgKiAzICsgMzIpIC8gMzIpIDw8IDE2KSksIDEpOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3IC8gMTY7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB5MWl2UCA9IChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciAqKSB5MWk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB5Mml2UCA9IChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciAqKSB5Mmk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aXZQICA9IChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciAqKSB1aTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2aXZQICA9IChjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciAqKSB2aTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhbGlnbl9wZXJtID0gdmVjX2x2c2woMCwgeTFpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB5MCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICB2ZWNfcGVybSh5MWl2UFswXSwgeTFpdlBbMV0sIGFsaWduX3Blcm0pOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhbGlnbl9wZXJtID0gdmVjX2x2c2woMCwgeTJpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB5MSA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICB2ZWNfcGVybSh5Mml2UFswXSwgeTJpdlBbMV0sIGFsaWduX3Blcm0pOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhbGlnbl9wZXJtID0gdmVjX2x2c2woMCwgdWkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1ID0gKHZlY3RvciBzaWduZWQgY2hhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHZlY19wZXJtKHVpdlBbMF0sIHVpdlBbMV0sIGFsaWduX3Blcm0pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhbGlnbl9wZXJtID0gdmVjX2x2c2woMCwgdmkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2ID0gKHZlY3RvciBzaWduZWQgY2hhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHZlY19wZXJtKHZpdlBbMF0sIHZpdlBbMV0sIGFsaWduX3Blcm0pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1ID0gKHZlY3RvciBzaWduZWQgY2hhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHZlY19zdWIodSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY19zcGxhdCgodmVjdG9yIHNpZ25lZCBjaGFyKSB7IDEyOCB9LCAwKSk7ICBcCisgICAgICAgICAgICB2ID0gKHZlY3RvciBzaWduZWQgY2hhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHZlY19zdWIodiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY19zcGxhdCgodmVjdG9yIHNpZ25lZCBjaGFyKSB7IDEyOCB9LCAwKSk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBVID0gdmVjX3VucGFja2godSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBWID0gdmVjX3VucGFja2godik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBZMCA9IHZlY191bmgoeTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBZMSA9IHZlY191bmwoeTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBZMiA9IHZlY191bmgoeTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBZMyA9IHZlY191bmwoeTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBZMCA9IHZlY19tcmFkZHMoWTAsIGxDWSwgbE9ZKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBZMSA9IHZlY19tcmFkZHMoWTEsIGxDWSwgbE9ZKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBZMiA9IHZlY19tcmFkZHMoWTIsIGxDWSwgbE9ZKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBZMyA9IHZlY19tcmFkZHMoWTMsIGxDWSwgbE9ZKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAvKiB1eCAgPSAoQ0JVICogKHUgPDwgQ1NISUZUKSArIDB4NDAwMCkgPj4gMTUgKi8gICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1eCAgPSB2ZWNfc2woVSwgbENTSElGVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1eCAgPSB2ZWNfbXJhZGRzKHV4LCBsQ0JVLCAodmVjdG9yIHNpZ25lZCBzaG9ydCkgeyAwIH0pOyAgICAgICAgICBcCisgICAgICAgICAgICB1eDAgPSB2ZWNfbWVyZ2VoKHV4LCB1eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1eDEgPSB2ZWNfbWVyZ2VsKHV4LCB1eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAvKiB2eCAgPSAoQ1JWICogKHYgPDwgQ1NISUZUKSArIDB4NDAwMCkgPj4gMTU7ICovICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2eCAgPSB2ZWNfc2woViwgbENTSElGVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2eCAgPSB2ZWNfbXJhZGRzKHZ4LCBsQ1JWLCAodmVjdG9yIHNpZ25lZCBzaG9ydCkgeyAwIH0pOyAgICAgICAgICBcCisgICAgICAgICAgICB2eDAgPSB2ZWNfbWVyZ2VoKHZ4LCB2eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2eDEgPSB2ZWNfbWVyZ2VsKHZ4LCB2eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAvKiB1dnggPSAoKENHVSAqIHUpICsgKENHViAqIHYpKSA+PiAxNSAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1dnggID0gdmVjX21yYWRkcyhVLCBsQ0dVLCAodmVjdG9yIHNpZ25lZCBzaG9ydCkgeyAwIH0pOyAgICAgICAgICBcCisgICAgICAgICAgICB1dnggID0gdmVjX21yYWRkcyhWLCBsQ0dWLCB1dngpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1dngwID0gdmVjX21lcmdlaCh1dngsIHV2eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1dngxID0gdmVjX21lcmdlbCh1dngsIHV2eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSMCA9IHZlY19hZGQoWTAsIHZ4MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBHMCA9IHZlY19hZGQoWTAsIHV2eDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBCMCA9IHZlY19hZGQoWTAsIHV4MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSMSA9IHZlY19hZGQoWTEsIHZ4MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBHMSA9IHZlY19hZGQoWTEsIHV2eDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBCMSA9IHZlY19hZGQoWTEsIHV4MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSID0gdmVjX3BhY2tjbHAoUjAsIFIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBHID0gdmVjX3BhY2tjbHAoRzAsIEcxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBCID0gdmVjX3BhY2tjbHAoQjAsIEIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvdXRfcGl4ZWxzKFIsIEcsIEIsIG91dGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSMCA9IHZlY19hZGQoWTIsIHZ4MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBHMCA9IHZlY19hZGQoWTIsIHV2eDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBCMCA9IHZlY19hZGQoWTIsIHV4MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSMSA9IHZlY19hZGQoWTMsIHZ4MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBHMSA9IHZlY19hZGQoWTMsIHV2eDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBCMSA9IHZlY19hZGQoWTMsIHV4MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSICA9IHZlY19wYWNrY2xwKFIwLCBSMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBHICA9IHZlY19wYWNrY2xwKEcwLCBHMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBCICA9IHZlY19wYWNrY2xwKEIwLCBCMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvdXRfcGl4ZWxzKFIsIEcsIEIsIG91dG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB5MWkgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB5MmkgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aSAgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2aSAgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpICArPSBpbnN0cmlkZXNfc2NsWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZpICArPSBpbnN0cmlkZXNfc2NsWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHkxaSArPSBpbnN0cmlkZXNfc2NsWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHkyaSArPSBpbnN0cmlkZXNfc2NsWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHNyY1NsaWNlSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgb3V0X2FiZ3IoYSwgYiwgYywgcHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfbXN0cmdiMzIoX190eXBlb2ZfXyhhKSwgKChfX3R5cGVvZl9fKGEpKSB7IDI1NSB9KSwgYywgYiwgYSwgcHRyKQorI2RlZmluZSBvdXRfYmdyYShhLCBiLCBjLCBwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlY19tc3RyZ2IzMihfX3R5cGVvZl9fKGEpLCBjLCBiLCBhLCAoKF9fdHlwZW9mX18oYSkpIHsgMjU1IH0pLCBwdHIpCisjZGVmaW5lIG91dF9yZ2JhKGEsIGIsIGMsIHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjX21zdHJnYjMyKF9fdHlwZW9mX18oYSksIGEsIGIsIGMsICgoX190eXBlb2ZfXyhhKSkgeyAyNTUgfSksIHB0cikKKyNkZWZpbmUgb3V0X2FyZ2IoYSwgYiwgYywgcHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWNfbXN0cmdiMzIoX190eXBlb2ZfXyhhKSwgKChfX3R5cGVvZl9fKGEpKSB7IDI1NSB9KSwgYSwgYiwgYywgcHRyKQorI2RlZmluZSBvdXRfcmdiMjQoYSwgYiwgYywgcHRyKSB2ZWNfbXN0cmdiMjQoYSwgYiwgYywgcHRyKQorI2RlZmluZSBvdXRfYmdyMjQoYSwgYiwgYywgcHRyKSB2ZWNfbXN0YmdyMjQoYSwgYiwgYywgcHRyKQorCitERUZDU1A0MjBfQ1ZUKHl1djJfYWJnciwgIG91dF9hYmdyKQorREVGQ1NQNDIwX0NWVCh5dXYyX2JncmEsICBvdXRfYmdyYSkKK0RFRkNTUDQyMF9DVlQoeXV2Ml9yZ2JhLCAgb3V0X3JnYmEpCitERUZDU1A0MjBfQ1ZUKHl1djJfYXJnYiwgIG91dF9hcmdiKQorREVGQ1NQNDIwX0NWVCh5dXYyX3JnYjI0LCBvdXRfcmdiMjQpCitERUZDU1A0MjBfQ1ZUKHl1djJfYmdyMjQsIG91dF9iZ3IyNCkKKworLy8gdXl2eXx1eXZ5fHV5dnl8dXl2eQorLy8gMDEyMyA0NTY3IDg5YWIgY2RlZgorc3RhdGljIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyCisgICAgZGVtdXhfdSA9IHsgMHgxMCwgMHgwMCwgMHgxMCwgMHgwMCwKKyAgICAgICAgICAgICAgICAweDEwLCAweDA0LCAweDEwLCAweDA0LAorICAgICAgICAgICAgICAgIDB4MTAsIDB4MDgsIDB4MTAsIDB4MDgsCisgICAgICAgICAgICAgICAgMHgxMCwgMHgwYywgMHgxMCwgMHgwYyB9LAorICAgIGRlbXV4X3YgPSB7IDB4MTAsIDB4MDIsIDB4MTAsIDB4MDIsCisgICAgICAgICAgICAgICAgMHgxMCwgMHgwNiwgMHgxMCwgMHgwNiwKKyAgICAgICAgICAgICAgICAweDEwLCAweDBBLCAweDEwLCAweDBBLAorICAgICAgICAgICAgICAgIDB4MTAsIDB4MEUsIDB4MTAsIDB4MEUgfSwKKyAgICBkZW11eF95ID0geyAweDEwLCAweDAxLCAweDEwLCAweDAzLAorICAgICAgICAgICAgICAgIDB4MTAsIDB4MDUsIDB4MTAsIDB4MDcsCisgICAgICAgICAgICAgICAgMHgxMCwgMHgwOSwgMHgxMCwgMHgwQiwKKyAgICAgICAgICAgICAgICAweDEwLCAweDBELCAweDEwLCAweDBGIH07CisKKy8qCisgKiB0aGlzIGlzIHNvIEkgY2FuIHBsYXkgbGl2ZSBDQ0lSIHJhdyB2aWRlbworICovCitzdGF0aWMgaW50IGFsdGl2ZWNfdXl2eV9yZ2IzMihTd3NDb250ZXh0ICpjLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluc3RyaWRlcywgaW50IHNyY1NsaWNlWSwgaW50IHNyY1NsaWNlSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipvcGxhbmVzLCBpbnQgKm91dHN0cmlkZXMpCit7CisgICAgaW50IHcgPSBjLT5zcmNXOworICAgIGludCBoID0gc3JjU2xpY2VIOworICAgIGludCBpLCBqOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHV5dnk7CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBZLCBVLCBWOworICAgIHZlY3RvciBzaWduZWQgc2hvcnQgUjAsIEcwLCBCMCwgUjEsIEcxLCBCMTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBSLCBHLCBCOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyICpvdXQ7CisgICAgY29uc3QgdWJ5dGUgKmltZzsKKworICAgIGltZyA9IGluWzBdOworICAgIG91dCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhciAqKSAob3BsYW5lc1swXSArIHNyY1NsaWNlWSAqIG91dHN0cmlkZXNbMF0pOworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHcgLyAxNjsgaisrKSB7CisgICAgICAgICAgICB1eXZ5ID0gdmVjX2xkKDAsIGltZyk7CisKKyAgICAgICAgICAgIFUgPSAodmVjdG9yIHNpZ25lZCBzaG9ydCkKKyAgICAgICAgICAgICAgICAgICAgdmVjX3Blcm0odXl2eSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSB7IDAgfSwgZGVtdXhfdSk7CisgICAgICAgICAgICBWID0gKHZlY3RvciBzaWduZWQgc2hvcnQpCisgICAgICAgICAgICAgICAgICAgIHZlY19wZXJtKHV5dnksICh2ZWN0b3IgdW5zaWduZWQgY2hhcikgeyAwIH0sIGRlbXV4X3YpOworICAgICAgICAgICAgWSA9ICh2ZWN0b3Igc2lnbmVkIHNob3J0KQorICAgICAgICAgICAgICAgICAgICB2ZWNfcGVybSh1eXZ5LCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpIHsgMCB9LCBkZW11eF95KTsKKworICAgICAgICAgICAgY3Z0eXV2dG9SR0IoYywgWSwgVSwgViwgJlIwLCAmRzAsICZCMCk7CisKKyAgICAgICAgICAgIHV5dnkgPSB2ZWNfbGQoMTYsIGltZyk7CisKKyAgICAgICAgICAgIFUgPSAodmVjdG9yIHNpZ25lZCBzaG9ydCkKKyAgICAgICAgICAgICAgICAgICAgdmVjX3Blcm0odXl2eSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSB7IDAgfSwgZGVtdXhfdSk7CisgICAgICAgICAgICBWID0gKHZlY3RvciBzaWduZWQgc2hvcnQpCisgICAgICAgICAgICAgICAgICAgIHZlY19wZXJtKHV5dnksICh2ZWN0b3IgdW5zaWduZWQgY2hhcikgeyAwIH0sIGRlbXV4X3YpOworICAgICAgICAgICAgWSA9ICh2ZWN0b3Igc2lnbmVkIHNob3J0KQorICAgICAgICAgICAgICAgICAgICB2ZWNfcGVybSh1eXZ5LCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpIHsgMCB9LCBkZW11eF95KTsKKworICAgICAgICAgICAgY3Z0eXV2dG9SR0IoYywgWSwgVSwgViwgJlIxLCAmRzEsICZCMSk7CisKKyAgICAgICAgICAgIFIgPSB2ZWNfcGFja2NscChSMCwgUjEpOworICAgICAgICAgICAgRyA9IHZlY19wYWNrY2xwKEcwLCBHMSk7CisgICAgICAgICAgICBCID0gdmVjX3BhY2tjbHAoQjAsIEIxKTsKKworICAgICAgICAgICAgLy8gdmVjX21zdGJncjI0IChSLEcsQiwgb3V0KTsKKyAgICAgICAgICAgIG91dF9yZ2JhKFIsIEcsIEIsIG91dCk7CisKKyAgICAgICAgICAgIGltZyArPSAzMjsKKyAgICAgICAgfQorICAgIHJldHVybiBzcmNTbGljZUg7Cit9CisKKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KKworLyogT2sgY3VycmVudGx5IHRoZSBhY2NlbGVyYXRpb24gcm91dGluZSBvbmx5IHN1cHBvcnRzCisgKiBpbnB1dHMgb2Ygd2lkdGhzIGEgbXVsdGlwbGUgb2YgMTYKKyAqIGFuZCBoZWlnaHRzIGEgbXVsdGlwbGUgMgorICoKKyAqIFNvIHdlIGp1c3QgZmFsbCBiYWNrIHRvIHRoZSBDIGNvZGVzIGZvciB0aGlzLgorICovCithdl9jb2xkIFN3c0Z1bmMgZmZfeXV2MnJnYl9pbml0X3BwYyhTd3NDb250ZXh0ICpjKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGlmICghKGF2X2dldF9jcHVfZmxhZ3MoKSAmIEFWX0NQVV9GTEFHX0FMVElWRUMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qCisgICAgICogYW5kIHRoaXMgc2VlbXMgbm90IHRvIG1hdHRlciB0b28gbXVjaCBJIHRyaWVkIGEgYnVuY2ggb2YKKyAgICAgKiB2aWRlb3Mgd2l0aCBhYm5vcm1hbCB3aWR0aHMgYW5kIE1QbGF5ZXIgY3Jhc2hlcyBlbHNld2hlcmUuCisgICAgICogbXBsYXllciAtdm8geDExIC1yYXd2aWRlbyBvbjp3PTM1MDpoPTI0MCByYXctMzUweDI0MC5leXV2CisgICAgICogYm9vbSB3aXRoIFgxMSBiYWQgbWF0Y2guCisgICAgICoKKyAgICAgKi8KKyAgICBpZiAoKGMtPnNyY1cgJiAweGYpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc3dpdGNoIChjLT5zcmNGb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDEwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICAvKmNhc2UgSU1HRk1UX0NMUEw6ICAgICAgICA/Pz8gKi8KKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6CisgICAgY2FzZSBBVl9QSVhfRk1UX05WMTI6CisgICAgY2FzZSBBVl9QSVhfRk1UX05WMjE6CisgICAgICAgIGlmICgoYy0+c3JjSCAmIDB4MSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIHN3aXRjaCAoYy0+ZHN0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfV0FSTklORywgIkFMVElWRUM6IENvbG9yIFNwYWNlIFJHQjI0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBhbHRpdmVjX3l1djJfcmdiMjQ7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IyNDoKKyAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfV0FSTklORywgIkFMVElWRUM6IENvbG9yIFNwYWNlIEJHUjI0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBhbHRpdmVjX3l1djJfYmdyMjQ7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9BUkdCOgorICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19XQVJOSU5HLCAiQUxUSVZFQzogQ29sb3IgU3BhY2UgQVJHQlxuIik7CisgICAgICAgICAgICByZXR1cm4gYWx0aXZlY195dXYyX2FyZ2I7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9BQkdSOgorICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19XQVJOSU5HLCAiQUxUSVZFQzogQ29sb3IgU3BhY2UgQUJHUlxuIik7CisgICAgICAgICAgICByZXR1cm4gYWx0aXZlY195dXYyX2FiZ3I7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBOgorICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19XQVJOSU5HLCAiQUxUSVZFQzogQ29sb3IgU3BhY2UgUkdCQVxuIik7CisgICAgICAgICAgICByZXR1cm4gYWx0aXZlY195dXYyX3JnYmE7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBOgorICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19XQVJOSU5HLCAiQUxUSVZFQzogQ29sb3IgU3BhY2UgQkdSQVxuIik7CisgICAgICAgICAgICByZXR1cm4gYWx0aXZlY195dXYyX2JncmE7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVl9QSVhfRk1UX1VZVlk0MjI6CisgICAgICAgIHN3aXRjaCAoYy0+ZHN0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IzMjoKKyAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfV0FSTklORywgIkFMVElWRUM6IENvbG9yIFNwYWNlIFVZVlkgLT4gUkdCMzJcbiIpOworICAgICAgICAgICAgcmV0dXJuIGFsdGl2ZWNfdXl2eV9yZ2IzMjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl95dXYycmdiX2luaXRfdGFibGVzX3BwYyhTd3NDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbnZfdGFibGVbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRyYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYXR1cmF0aW9uKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIHVuaW9uIHsKKyAgICAgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaWduZWQgc2hvcnQsIHRtcClbOF07CisgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgdmVjOworICAgIH0gYnVmOworCisgICAgaWYgKCEoYXZfZ2V0X2NwdV9mbGFncygpICYgQVZfQ1BVX0ZMQUdfQUxUSVZFQykpCisgICAgICAgIHJldHVybjsKKworICAgIGJ1Zi50bXBbMF0gPSAoKDB4ZmZmZkxMKSAqIGNvbnRyYXN0ID4+IDgpID4+IDk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN5CisgICAgYnVmLnRtcFsxXSA9IC0yNTYgKiBicmlnaHRuZXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3kKKyAgICBidWYudG1wWzJdID0gICAoaW52X3RhYmxlWzBdID4+IDMpICogKGNvbnRyYXN0ID4+IDE2KSAqIChzYXR1cmF0aW9uID4+IDE2KTsgICAvLyBjcnYKKyAgICBidWYudG1wWzNdID0gICAoaW52X3RhYmxlWzFdID4+IDMpICogKGNvbnRyYXN0ID4+IDE2KSAqIChzYXR1cmF0aW9uID4+IDE2KTsgICAvLyBjYnUKKyAgICBidWYudG1wWzRdID0gLSgoaW52X3RhYmxlWzJdID4+IDEpICogKGNvbnRyYXN0ID4+IDE2KSAqIChzYXR1cmF0aW9uID4+IDE2KSk7ICAvLyBjZ3UKKyAgICBidWYudG1wWzVdID0gLSgoaW52X3RhYmxlWzNdID4+IDEpICogKGNvbnRyYXN0ID4+IDE2KSAqIChzYXR1cmF0aW9uID4+IDE2KSk7ICAvLyBjZ3YKKworICAgIGMtPkNTSElGVCA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpIHZlY19zcGxhdF91MTYoMik7CisgICAgYy0+Q1kgICAgID0gdmVjX3NwbGF0KCh2ZWN0b3Igc2lnbmVkIHNob3J0KSBidWYudmVjLCAwKTsKKyAgICBjLT5PWSAgICAgPSB2ZWNfc3BsYXQoKHZlY3RvciBzaWduZWQgc2hvcnQpIGJ1Zi52ZWMsIDEpOworICAgIGMtPkNSViAgICA9IHZlY19zcGxhdCgodmVjdG9yIHNpZ25lZCBzaG9ydCkgYnVmLnZlYywgMik7CisgICAgYy0+Q0JVICAgID0gdmVjX3NwbGF0KCh2ZWN0b3Igc2lnbmVkIHNob3J0KSBidWYudmVjLCAzKTsKKyAgICBjLT5DR1UgICAgPSB2ZWNfc3BsYXQoKHZlY3RvciBzaWduZWQgc2hvcnQpIGJ1Zi52ZWMsIDQpOworICAgIGMtPkNHViAgICA9IHZlY19zcGxhdCgodmVjdG9yIHNpZ25lZCBzaG9ydCkgYnVmLnZlYywgNSk7CisgICAgcmV0dXJuOworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworfQorCisjaWYgSEFWRV9BTFRJVkVDCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgeXV2MnBhY2tlZFhfYWx0aXZlYyhTd3NDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmx1bUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqbHVtU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1GaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNockZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqY2hyVVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqY2hyVlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqYWxwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFcsIGludCBkc3RZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCB0YXJnZXQpCit7CisgICAgaW50IGksIGo7CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBYLCBYMCwgWDEsIFkwLCBVMCwgVjAsIFkxLCBVMSwgVjEsIFUsIFY7CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBSMCwgRzAsIEIwLCBSMSwgRzEsIEIxOworCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgUiwgRywgQjsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciAqb3V0LCAqbm91dDsKKworICAgIHZlY3RvciBzaWduZWQgc2hvcnQgUk5EICAgPSB2ZWNfc3BsYXRfczE2KDEgPDwgMyk7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IFNDTCA9IHZlY19zcGxhdF91MTYoNCk7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1bnNpZ25lZCBpbnQsIHNjcmF0Y2gpWzE2XTsKKworICAgIHZlY3RvciBzaWduZWQgc2hvcnQgKllDb2VmZnMsICpDQ29lZmZzOworCisgICAgWUNvZWZmcyA9IGMtPnZZQ29lZmZzQmFuayArIGRzdFkgKiBsdW1GaWx0ZXJTaXplOworICAgIENDb2VmZnMgPSBjLT52Q0NvZWZmc0JhbmsgKyBkc3RZICogY2hyRmlsdGVyU2l6ZTsKKworICAgIG91dCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhciAqKSBkZXN0OworCisgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkgKz0gMTYpIHsKKyAgICAgICAgWTAgPSBSTkQ7CisgICAgICAgIFkxID0gUk5EOworICAgICAgICAvKiBleHRyYWN0IDE2IGNvZWZmcyBmcm9tIGx1bVNyYyAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbHVtRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICBYMCA9IHZlY19sZCgwLCAmbHVtU3JjW2pdW2ldKTsKKyAgICAgICAgICAgIFgxID0gdmVjX2xkKDE2LCAmbHVtU3JjW2pdW2ldKTsKKyAgICAgICAgICAgIFkwID0gdmVjX21yYWRkcyhYMCwgWUNvZWZmc1tqXSwgWTApOworICAgICAgICAgICAgWTEgPSB2ZWNfbXJhZGRzKFgxLCBZQ29lZmZzW2pdLCBZMSk7CisgICAgICAgIH0KKworICAgICAgICBVID0gUk5EOworICAgICAgICBWID0gUk5EOworICAgICAgICAvKiBleHRyYWN0IDggY29lZmZzIGZyb20gVSxWICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaHJGaWx0ZXJTaXplOyBqKyspIHsKKyAgICAgICAgICAgIFggPSB2ZWNfbGQoMCwgJmNoclVTcmNbal1baSAvIDJdKTsKKyAgICAgICAgICAgIFUgPSB2ZWNfbXJhZGRzKFgsIENDb2VmZnNbal0sIFUpOworICAgICAgICAgICAgWCA9IHZlY19sZCgwLCAmY2hyVlNyY1tqXVtpIC8gMl0pOworICAgICAgICAgICAgViA9IHZlY19tcmFkZHMoWCwgQ0NvZWZmc1tqXSwgVik7CisgICAgICAgIH0KKworICAgICAgICAvKiBzY2FsZSBhbmQgY2xpcCBzaWduYWxzICovCisgICAgICAgIFkwID0gdmVjX3NyYShZMCwgU0NMKTsKKyAgICAgICAgWTEgPSB2ZWNfc3JhKFkxLCBTQ0wpOworICAgICAgICBVICA9IHZlY19zcmEoVSwgU0NMKTsKKyAgICAgICAgViAgPSB2ZWNfc3JhKFYsIFNDTCk7CisKKyAgICAgICAgWTAgPSB2ZWNfY2xpcF9zMTYoWTApOworICAgICAgICBZMSA9IHZlY19jbGlwX3MxNihZMSk7CisgICAgICAgIFUgID0gdmVjX2NsaXBfczE2KFUpOworICAgICAgICBWICA9IHZlY19jbGlwX3MxNihWKTsKKworICAgICAgICAvKiBub3cgd2UgaGF2ZQorICAgICAgICAgKiBZMCA9IHkwIHkxIHkyIHkzIHk0IHk1IHk2IHk3ICAgIFkxID0geTggeTkgeTEwIHkxMSB5MTIgeTEzIHkxNCB5MTUKKyAgICAgICAgICogVSAgPSB1MCB1MSB1MiB1MyB1NCB1NSB1NiB1NyAgICBWICA9IHYwIHYxIHYyIHYzIHY0IHY1IHY2IHY3CisgICAgICAgICAqCisgICAgICAgICAqIFkwID0geTAgeTEgeTIgeTMgeTQgeTUgeTYgeTcgICAgWTEgPSB5OCB5OSB5MTAgeTExIHkxMiB5MTMgeTE0IHkxNQorICAgICAgICAgKiBVMCA9IHUwIHUwIHUxIHUxIHUyIHUyIHUzIHUzICAgIFUxID0gdTQgdTQgdTUgdTUgdTYgdTYgdTcgdTcKKyAgICAgICAgICogVjAgPSB2MCB2MCB2MSB2MSB2MiB2MiB2MyB2MyAgICBWMSA9IHY0IHY0IHY1IHY1IHY2IHY2IHY3IHY3CisgICAgICAgICAqLworCisgICAgICAgIFUwID0gdmVjX21lcmdlaChVLCBVKTsKKyAgICAgICAgVjAgPSB2ZWNfbWVyZ2VoKFYsIFYpOworCisgICAgICAgIFUxID0gdmVjX21lcmdlbChVLCBVKTsKKyAgICAgICAgVjEgPSB2ZWNfbWVyZ2VsKFYsIFYpOworCisgICAgICAgIGN2dHl1dnRvUkdCKGMsIFkwLCBVMCwgVjAsICZSMCwgJkcwLCAmQjApOworICAgICAgICBjdnR5dXZ0b1JHQihjLCBZMSwgVTEsIFYxLCAmUjEsICZHMSwgJkIxKTsKKworICAgICAgICBSID0gdmVjX3BhY2tjbHAoUjAsIFIxKTsKKyAgICAgICAgRyA9IHZlY19wYWNrY2xwKEcwLCBHMSk7CisgICAgICAgIEIgPSB2ZWNfcGFja2NscChCMCwgQjEpOworCisgICAgICAgIHN3aXRjaCAodGFyZ2V0KSB7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9BQkdSOgorICAgICAgICAgICAgb3V0X2FiZ3IoUiwgRywgQiwgb3V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQToKKyAgICAgICAgICAgIG91dF9iZ3JhKFIsIEcsIEIsIG91dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CisgICAgICAgICAgICBvdXRfcmdiYShSLCBHLCBCLCBvdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9BUkdCOgorICAgICAgICAgICAgb3V0X2FyZ2IoUiwgRywgQiwgb3V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgICAgICBvdXRfcmdiMjQoUiwgRywgQiwgb3V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgICAgICAgICBvdXRfYmdyMjQoUiwgRywgQiwgb3V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiB0aGlzIGlzIHJlYWNoZWQsIHRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgY2FsbGVkIHl1djJwYWNrZWRYaW5DCisgICAgICAgICAgICAgKiBpbnN0ZWFkLiAqLworICAgICAgICAgICAgc3RhdGljIGludCBwcmludGVkX2Vycm9yX21lc3NhZ2U7CisgICAgICAgICAgICBpZiAoIXByaW50ZWRfZXJyb3JfbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJhbHRpdmVjX3l1djJwYWNrZWRYIGRvZXNuJ3Qgc3VwcG9ydCAlcyBvdXRwdXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoYy0+ZHN0Rm9ybWF0KSk7CisgICAgICAgICAgICAgICAgcHJpbnRlZF9lcnJvcl9tZXNzYWdlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgPCBkc3RXKSB7CisgICAgICAgIGkgLT0gMTY7CisKKyAgICAgICAgWTAgPSBSTkQ7CisgICAgICAgIFkxID0gUk5EOworICAgICAgICAvKiBleHRyYWN0IDE2IGNvZWZmcyBmcm9tIGx1bVNyYyAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbHVtRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICBYMCA9IHZlY19sZCgwLCAmbHVtU3JjW2pdW2ldKTsKKyAgICAgICAgICAgIFgxID0gdmVjX2xkKDE2LCAmbHVtU3JjW2pdW2ldKTsKKyAgICAgICAgICAgIFkwID0gdmVjX21yYWRkcyhYMCwgWUNvZWZmc1tqXSwgWTApOworICAgICAgICAgICAgWTEgPSB2ZWNfbXJhZGRzKFgxLCBZQ29lZmZzW2pdLCBZMSk7CisgICAgICAgIH0KKworICAgICAgICBVID0gUk5EOworICAgICAgICBWID0gUk5EOworICAgICAgICAvKiBleHRyYWN0IDggY29lZmZzIGZyb20gVSxWICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaHJGaWx0ZXJTaXplOyBqKyspIHsKKyAgICAgICAgICAgIFggPSB2ZWNfbGQoMCwgJmNoclVTcmNbal1baSAvIDJdKTsKKyAgICAgICAgICAgIFUgPSB2ZWNfbXJhZGRzKFgsIENDb2VmZnNbal0sIFUpOworICAgICAgICAgICAgWCA9IHZlY19sZCgwLCAmY2hyVlNyY1tqXVtpIC8gMl0pOworICAgICAgICAgICAgViA9IHZlY19tcmFkZHMoWCwgQ0NvZWZmc1tqXSwgVik7CisgICAgICAgIH0KKworICAgICAgICAvKiBzY2FsZSBhbmQgY2xpcCBzaWduYWxzICovCisgICAgICAgIFkwID0gdmVjX3NyYShZMCwgU0NMKTsKKyAgICAgICAgWTEgPSB2ZWNfc3JhKFkxLCBTQ0wpOworICAgICAgICBVICA9IHZlY19zcmEoVSwgU0NMKTsKKyAgICAgICAgViAgPSB2ZWNfc3JhKFYsIFNDTCk7CisKKyAgICAgICAgWTAgPSB2ZWNfY2xpcF9zMTYoWTApOworICAgICAgICBZMSA9IHZlY19jbGlwX3MxNihZMSk7CisgICAgICAgIFUgID0gdmVjX2NsaXBfczE2KFUpOworICAgICAgICBWICA9IHZlY19jbGlwX3MxNihWKTsKKworICAgICAgICAvKiBub3cgd2UgaGF2ZQorICAgICAgICAgKiBZMCA9IHkwIHkxIHkyIHkzIHk0IHk1IHk2IHk3ICAgIFkxID0geTggeTkgeTEwIHkxMSB5MTIgeTEzIHkxNCB5MTUKKyAgICAgICAgICogVSAgPSB1MCB1MSB1MiB1MyB1NCB1NSB1NiB1NyAgICBWICA9IHYwIHYxIHYyIHYzIHY0IHY1IHY2IHY3CisgICAgICAgICAqCisgICAgICAgICAqIFkwID0geTAgeTEgeTIgeTMgeTQgeTUgeTYgeTcgICAgWTEgPSB5OCB5OSB5MTAgeTExIHkxMiB5MTMgeTE0IHkxNQorICAgICAgICAgKiBVMCA9IHUwIHUwIHUxIHUxIHUyIHUyIHUzIHUzICAgIFUxID0gdTQgdTQgdTUgdTUgdTYgdTYgdTcgdTcKKyAgICAgICAgICogVjAgPSB2MCB2MCB2MSB2MSB2MiB2MiB2MyB2MyAgICBWMSA9IHY0IHY0IHY1IHY1IHY2IHY2IHY3IHY3CisgICAgICAgICAqLworCisgICAgICAgIFUwID0gdmVjX21lcmdlaChVLCBVKTsKKyAgICAgICAgVjAgPSB2ZWNfbWVyZ2VoKFYsIFYpOworCisgICAgICAgIFUxID0gdmVjX21lcmdlbChVLCBVKTsKKyAgICAgICAgVjEgPSB2ZWNfbWVyZ2VsKFYsIFYpOworCisgICAgICAgIGN2dHl1dnRvUkdCKGMsIFkwLCBVMCwgVjAsICZSMCwgJkcwLCAmQjApOworICAgICAgICBjdnR5dXZ0b1JHQihjLCBZMSwgVTEsIFYxLCAmUjEsICZHMSwgJkIxKTsKKworICAgICAgICBSID0gdmVjX3BhY2tjbHAoUjAsIFIxKTsKKyAgICAgICAgRyA9IHZlY19wYWNrY2xwKEcwLCBHMSk7CisgICAgICAgIEIgPSB2ZWNfcGFja2NscChCMCwgQjEpOworCisgICAgICAgIG5vdXQgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIgKikgc2NyYXRjaDsKKyAgICAgICAgc3dpdGNoICh0YXJnZXQpIHsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0FCR1I6CisgICAgICAgICAgICBvdXRfYWJncihSLCBHLCBCLCBub3V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQToKKyAgICAgICAgICAgIG91dF9iZ3JhKFIsIEcsIEIsIG5vdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBOgorICAgICAgICAgICAgb3V0X3JnYmEoUiwgRywgQiwgbm91dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0FSR0I6CisgICAgICAgICAgICBvdXRfYXJnYihSLCBHLCBCLCBub3V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgICAgICBvdXRfcmdiMjQoUiwgRywgQiwgbm91dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorICAgICAgICAgICAgb3V0X2JncjI0KFIsIEcsIEIsIG5vdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBVbnJlYWNoYWJsZSwgSSB0aGluay4gKi8KKyAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImFsdGl2ZWNfeXV2MnBhY2tlZFggZG9lc24ndCBzdXBwb3J0ICVzIG91dHB1dFxuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGMtPmRzdEZvcm1hdCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KCYoKHVpbnQzMl90ICopIGRlc3QpW2ldLCBzY3JhdGNoLCAoZHN0VyAtIGkpIC8gNCk7CisgICAgfQorfQorCisjZGVmaW5lIFlVVjJQQUNLRURYX1dSQVBQRVIoc3VmZml4LCBwaXhmbXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3l1djIgIyMgc3VmZml4ICMjIF9YX2FsdGl2ZWMoU3dzQ29udGV4dCAqYywgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqbHVtRmlsdGVyLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bUZpbHRlclNpemUsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclVTcmMsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclZTcmMsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNockZpbHRlclNpemUsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmFscFNyYywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsIGludCBkc3RZKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeXV2MnBhY2tlZFhfYWx0aXZlYyhjLCBsdW1GaWx0ZXIsIGx1bVNyYywgbHVtRmlsdGVyU2l6ZSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBjaHJGaWx0ZXIsIGNoclVTcmMsIGNoclZTcmMsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBjaHJGaWx0ZXJTaXplLCBhbHBTcmMsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LCBkc3RXLCBkc3RZLCBwaXhmbXQpOyAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1lVVjJQQUNLRURYX1dSQVBQRVIoYWJnciwgIEFWX1BJWF9GTVRfQUJHUik7CitZVVYyUEFDS0VEWF9XUkFQUEVSKGJncmEsICBBVl9QSVhfRk1UX0JHUkEpOworWVVWMlBBQ0tFRFhfV1JBUFBFUihhcmdiLCAgQVZfUElYX0ZNVF9BUkdCKTsKK1lVVjJQQUNLRURYX1dSQVBQRVIocmdiYSwgIEFWX1BJWF9GTVRfUkdCQSk7CitZVVYyUEFDS0VEWF9XUkFQUEVSKHJnYjI0LCBBVl9QSVhfRk1UX1JHQjI0KTsKK1lVVjJQQUNLRURYX1dSQVBQRVIoYmdyMjQsIEFWX1BJWF9GTVRfQkdSMjQpOworCisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS9wcGMveXV2MnJnYl9hbHRpdmVjLmggYi9mZm1wZWcvbGlic3dzY2FsZS9wcGMveXV2MnJnYl9hbHRpdmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1MmE0NwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL3BwYy95dXYycmdiX2FsdGl2ZWMuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQWx0aVZlYy1lbmhhbmNlZCB5dXYyeXV2WAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSb21haW4gRG9sYmVhdSA8cm9tYWluQGRvbGJlYXUub3JnPgorICogYmFzZWQgb24gdGhlIGVxdWl2YWxlbnQgQyBjb2RlIGluIHN3c2NhbGUuYworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIFNXU0NBTEVfUFBDX1lVVjJSR0JfQUxUSVZFQ19ICisjZGVmaW5lIFNXU0NBTEVfUFBDX1lVVjJSR0JfQUxUSVZFQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZV9pbnRlcm5hbC5oIgorCisjZGVmaW5lIFlVVjJQQUNLRURYX0hFQURFUihzdWZmaXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2b2lkIGZmX3l1djIgIyMgc3VmZml4ICMjIF9YX2FsdGl2ZWMoU3dzQ29udGV4dCAqYywgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpsdW1GaWx0ZXIsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipsdW1TcmMsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bUZpbHRlclNpemUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpjaHJGaWx0ZXIsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJVU3JjLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclZTcmMsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyRmlsdGVyU2l6ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiphbHBTcmMsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0VywgaW50IGRzdFkpOworCitZVVYyUEFDS0VEWF9IRUFERVIoYWJncik7CitZVVYyUEFDS0VEWF9IRUFERVIoYmdyYSk7CitZVVYyUEFDS0VEWF9IRUFERVIoYXJnYik7CitZVVYyUEFDS0VEWF9IRUFERVIocmdiYSk7CitZVVYyUEFDS0VEWF9IRUFERVIocmdiMjQpOworWVVWMlBBQ0tFRFhfSEVBREVSKGJncjI0KTsKKworI2VuZGlmIC8qIFNXU0NBTEVfUFBDX1lVVjJSR0JfQUxUSVZFQ19IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS9wcGMveXV2Mnl1dl9hbHRpdmVjLmMgYi9mZm1wZWcvbGlic3dzY2FsZS9wcGMveXV2Mnl1dl9hbHRpdmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxYzVkZAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL3BwYy95dXYyeXV2X2FsdGl2ZWMuYwpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIEFsdGlWZWMtZW5oYW5jZWQgeXV2LXRvLXl1diBjb252ZXJzaW9uIHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSb21haW4gRG9sYmVhdSA8cm9tYWluQGRvbGJlYXUub3JnPgorICogYmFzZWQgb24gdGhlIGVxdWl2YWxlbnQgQyBjb2RlIGluIHN3c2NhbGUuYworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZS5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZV9pbnRlcm5hbC5oIgorCisjaWYgSEFWRV9BTFRJVkVDCisKK3N0YXRpYyBpbnQgeXYxMnRveXV5Ml91bnNjYWxlZF9hbHRpdmVjKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1NsaWNlSCwgdWludDhfdCAqZHN0UGFyYW1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGVfYVtdKQoreworICAgIHVpbnQ4X3QgKmRzdCA9IGRzdFBhcmFtWzBdICsgZHN0U3RyaWRlX2FbMF0gKiBzcmNTbGljZVk7CisgICAgLy8geXYxMnRveXV5MihzcmNbMF0sIHNyY1sxXSwgc3JjWzJdLCBkc3QsIGMtPnNyY1csIHNyY1NsaWNlSCwKKyAgICAvLyAgICAgICAgICAgIHNyY1N0cmlkZVswXSwgc3JjU3RyaWRlWzFdLCBkc3RTdHJpZGVbMF0pOworICAgIGNvbnN0IHVpbnQ4X3QgKnlzcmMgICA9IHNyY1swXTsKKyAgICBjb25zdCB1aW50OF90ICp1c3JjICAgPSBzcmNbMV07CisgICAgY29uc3QgdWludDhfdCAqdnNyYyAgID0gc3JjWzJdOworICAgIGNvbnN0IGludCB3aWR0aCAgICAgICA9IGMtPnNyY1c7CisgICAgY29uc3QgaW50IGhlaWdodCAgICAgID0gc3JjU2xpY2VIOworICAgIGNvbnN0IGludCBsdW1TdHJpZGUgICA9IHNyY1N0cmlkZVswXTsKKyAgICBjb25zdCBpbnQgY2hyb21TdHJpZGUgPSBzcmNTdHJpZGVbMV07CisgICAgY29uc3QgaW50IGRzdFN0cmlkZSAgID0gZHN0U3RyaWRlX2FbMF07CisgICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgeXBlcm0gPSB2ZWNfbHZzbCgwLCB5c3JjKTsKKyAgICBjb25zdCBpbnQgdmVydEx1bVBlckNocm9tYSAgICAgICA9IDI7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHk7CisKKyAgICAvKiBUaGlzIGNvZGUgYXNzdW1lczoKKyAgICAgKgorICAgICAqIDEpIGRzdCBpcyAxNiBieXRlcy1hbGlnbmVkCisgICAgICogMikgZHN0U3RyaWRlIGlzIGEgbXVsdGlwbGUgb2YgMTYKKyAgICAgKiAzKSB3aWR0aCBpcyBhIG11bHRpcGxlIG9mIDE2CisgICAgICogNCkgbHVtICYgY2hyb20gc3RyaWRlIGFyZSBtdWx0aXBsZXMgb2YgOAorICAgICAqLworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSAzMTsgaSArPSAzMikgeworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGogICAgICAgICAgPSBpID4+IDE7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3lBICAgICA9IHZlY19sZChpLCB5c3JjKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfeUIgICAgID0gdmVjX2xkKGkgKyAxNiwgeXNyYyk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3lDICAgICA9IHZlY19sZChpICsgMzIsIHlzcmMpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl95MSAgICAgPSB2ZWNfcGVybSh2X3lBLCB2X3lCLCB5cGVybSk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3kyICAgICA9IHZlY19wZXJtKHZfeUIsIHZfeUMsIHlwZXJtKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfdUEgICAgID0gdmVjX2xkKGosIHVzcmMpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl91QiAgICAgPSB2ZWNfbGQoaiArIDE2LCB1c3JjKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfdSAgICAgID0gdmVjX3Blcm0odl91QSwgdl91QiwgdmVjX2x2c2woaiwgdXNyYykpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl92QSAgICAgPSB2ZWNfbGQoaiwgdnNyYyk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3ZCICAgICA9IHZlY19sZChqICsgMTYsIHZzcmMpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl92ICAgICAgPSB2ZWNfcGVybSh2X3ZBLCB2X3ZCLCB2ZWNfbHZzbChqLCB2c3JjKSk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3V2X2EgICA9IHZlY19tZXJnZWgodl91LCB2X3YpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl91dl9iICAgPSB2ZWNfbWVyZ2VsKHZfdSwgdl92KTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfeXV5Ml8wID0gdmVjX21lcmdlaCh2X3kxLCB2X3V2X2EpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl95dXkyXzEgPSB2ZWNfbWVyZ2VsKHZfeTEsIHZfdXZfYSk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3l1eTJfMiA9IHZlY19tZXJnZWgodl95Miwgdl91dl9iKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfeXV5Ml8zID0gdmVjX21lcmdlbCh2X3kyLCB2X3V2X2IpOworICAgICAgICAgICAgdmVjX3N0KHZfeXV5Ml8wLCAoaSA8PCAxKSwgZHN0KTsKKyAgICAgICAgICAgIHZlY19zdCh2X3l1eTJfMSwgKGkgPDwgMSkgKyAxNiwgZHN0KTsKKyAgICAgICAgICAgIHZlY19zdCh2X3l1eTJfMiwgKGkgPDwgMSkgKyAzMiwgZHN0KTsKKyAgICAgICAgICAgIHZlY19zdCh2X3l1eTJfMywgKGkgPDwgMSkgKyA0OCwgZHN0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA8IHdpZHRoKSB7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgaiAgICAgICAgICA9IGkgPj4gMTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfeTEgICAgID0gdmVjX2xkKGksIHlzcmMpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl91ICAgICAgPSB2ZWNfbGQoaiwgdXNyYyk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3YgICAgICA9IHZlY19sZChqLCB2c3JjKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfdXZfYSAgID0gdmVjX21lcmdlaCh2X3UsIHZfdik7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3l1eTJfMCA9IHZlY19tZXJnZWgodl95MSwgdl91dl9hKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfeXV5Ml8xID0gdmVjX21lcmdlbCh2X3kxLCB2X3V2X2EpOworICAgICAgICAgICAgdmVjX3N0KHZfeXV5Ml8wLCAoaSA8PCAxKSwgZHN0KTsKKyAgICAgICAgICAgIHZlY19zdCh2X3l1eTJfMSwgKGkgPDwgMSkgKyAxNiwgZHN0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHkgJiAodmVydEx1bVBlckNocm9tYSAtIDEpKSA9PSB2ZXJ0THVtUGVyQ2hyb21hIC0gMSkgeworICAgICAgICAgICAgdXNyYyArPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgICAgIHZzcmMgKz0gY2hyb21TdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgeXNyYyArPSBsdW1TdHJpZGU7CisgICAgICAgIGRzdCAgKz0gZHN0U3RyaWRlOworICAgIH0KKworICAgIHJldHVybiBzcmNTbGljZUg7Cit9CisKK3N0YXRpYyBpbnQgeXYxMnRvdXl2eV91bnNjYWxlZF9hbHRpdmVjKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1NsaWNlSCwgdWludDhfdCAqZHN0UGFyYW1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGVfYVtdKQoreworICAgIHVpbnQ4X3QgKmRzdCA9IGRzdFBhcmFtWzBdICsgZHN0U3RyaWRlX2FbMF0gKiBzcmNTbGljZVk7CisgICAgLy8geXYxMnRveXV5MihzcmNbMF0sIHNyY1sxXSwgc3JjWzJdLCBkc3QsIGMtPnNyY1csIHNyY1NsaWNlSCwKKyAgICAvLyAgICAgICAgICAgIHNyY1N0cmlkZVswXSwgc3JjU3RyaWRlWzFdLCBkc3RTdHJpZGVbMF0pOworICAgIGNvbnN0IHVpbnQ4X3QgKnlzcmMgICAgICAgICAgICAgID0gc3JjWzBdOworICAgIGNvbnN0IHVpbnQ4X3QgKnVzcmMgICAgICAgICAgICAgID0gc3JjWzFdOworICAgIGNvbnN0IHVpbnQ4X3QgKnZzcmMgICAgICAgICAgICAgID0gc3JjWzJdOworICAgIGNvbnN0IGludCB3aWR0aCAgICAgICAgICAgICAgICAgID0gYy0+c3JjVzsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ICAgICAgICAgICAgICAgICA9IHNyY1NsaWNlSDsKKyAgICBjb25zdCBpbnQgbHVtU3RyaWRlICAgICAgICAgICAgICA9IHNyY1N0cmlkZVswXTsKKyAgICBjb25zdCBpbnQgY2hyb21TdHJpZGUgICAgICAgICAgICA9IHNyY1N0cmlkZVsxXTsKKyAgICBjb25zdCBpbnQgZHN0U3RyaWRlICAgICAgICAgICAgICA9IGRzdFN0cmlkZV9hWzBdOworICAgIGNvbnN0IGludCB2ZXJ0THVtUGVyQ2hyb21hICAgICAgID0gMjsKKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB5cGVybSA9IHZlY19sdnNsKDAsIHlzcmMpOworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCB5OworCisgICAgLyogVGhpcyBjb2RlIGFzc3VtZXM6CisgICAgICoKKyAgICAgKiAxKSBkc3QgaXMgMTYgYnl0ZXMtYWxpZ25lZAorICAgICAqIDIpIGRzdFN0cmlkZSBpcyBhIG11bHRpcGxlIG9mIDE2CisgICAgICogMykgd2lkdGggaXMgYSBtdWx0aXBsZSBvZiAxNgorICAgICAqIDQpIGx1bSAmIGNocm9tIHN0cmlkZSBhcmUgbXVsdGlwbGVzIG9mIDgKKyAgICAgKi8KKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMzE7IGkgKz0gMzIpIHsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBqICAgICAgICAgID0gaSA+PiAxOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl95QSAgICAgPSB2ZWNfbGQoaSwgeXNyYyk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3lCICAgICA9IHZlY19sZChpICsgMTYsIHlzcmMpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl95QyAgICAgPSB2ZWNfbGQoaSArIDMyLCB5c3JjKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfeTEgICAgID0gdmVjX3Blcm0odl95QSwgdl95QiwgeXBlcm0pOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl95MiAgICAgPSB2ZWNfcGVybSh2X3lCLCB2X3lDLCB5cGVybSk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3VBICAgICA9IHZlY19sZChqLCB1c3JjKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfdUIgICAgID0gdmVjX2xkKGogKyAxNiwgdXNyYyk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3UgICAgICA9IHZlY19wZXJtKHZfdUEsIHZfdUIsIHZlY19sdnNsKGosIHVzcmMpKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfdkEgICAgID0gdmVjX2xkKGosIHZzcmMpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl92QiAgICAgPSB2ZWNfbGQoaiArIDE2LCB2c3JjKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfdiAgICAgID0gdmVjX3Blcm0odl92QSwgdl92QiwgdmVjX2x2c2woaiwgdnNyYykpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl91dl9hICAgPSB2ZWNfbWVyZ2VoKHZfdSwgdl92KTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfdXZfYiAgID0gdmVjX21lcmdlbCh2X3UsIHZfdik7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3V5dnlfMCA9IHZlY19tZXJnZWgodl91dl9hLCB2X3kxKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfdXl2eV8xID0gdmVjX21lcmdlbCh2X3V2X2EsIHZfeTEpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl91eXZ5XzIgPSB2ZWNfbWVyZ2VoKHZfdXZfYiwgdl95Mik7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3V5dnlfMyA9IHZlY19tZXJnZWwodl91dl9iLCB2X3kyKTsKKyAgICAgICAgICAgIHZlY19zdCh2X3V5dnlfMCwgKGkgPDwgMSksIGRzdCk7CisgICAgICAgICAgICB2ZWNfc3Qodl91eXZ5XzEsIChpIDw8IDEpICsgMTYsIGRzdCk7CisgICAgICAgICAgICB2ZWNfc3Qodl91eXZ5XzIsIChpIDw8IDEpICsgMzIsIGRzdCk7CisgICAgICAgICAgICB2ZWNfc3Qodl91eXZ5XzMsIChpIDw8IDEpICsgNDgsIGRzdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPCB3aWR0aCkgeworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGogICAgICAgICAgPSBpID4+IDE7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3kxICAgICA9IHZlY19sZChpLCB5c3JjKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZfdSAgICAgID0gdmVjX2xkKGosIHVzcmMpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl92ICAgICAgPSB2ZWNfbGQoaiwgdnNyYyk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3V2X2EgICA9IHZlY19tZXJnZWgodl91LCB2X3YpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdl91eXZ5XzAgPSB2ZWNfbWVyZ2VoKHZfdXZfYSwgdl95MSk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2X3V5dnlfMSA9IHZlY19tZXJnZWwodl91dl9hLCB2X3kxKTsKKyAgICAgICAgICAgIHZlY19zdCh2X3V5dnlfMCwgKGkgPDwgMSksIGRzdCk7CisgICAgICAgICAgICB2ZWNfc3Qodl91eXZ5XzEsIChpIDw8IDEpICsgMTYsIGRzdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh5ICYgKHZlcnRMdW1QZXJDaHJvbWEgLSAxKSkgPT0gdmVydEx1bVBlckNocm9tYSAtIDEpIHsKKyAgICAgICAgICAgIHVzcmMgKz0gY2hyb21TdHJpZGU7CisgICAgICAgICAgICB2c3JjICs9IGNocm9tU3RyaWRlOworICAgICAgICB9CisgICAgICAgIHlzcmMgKz0gbHVtU3RyaWRlOworICAgICAgICBkc3QgICs9IGRzdFN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIHNyY1NsaWNlSDsKK30KKworI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworCithdl9jb2xkIHZvaWQgZmZfZ2V0X3Vuc2NhbGVkX3N3c2NhbGVfcHBjKFN3c0NvbnRleHQgKmMpCit7CisjaWYgSEFWRV9BTFRJVkVDCisgICAgaWYgKCEoYXZfZ2V0X2NwdV9mbGFncygpICYgQVZfQ1BVX0ZMQUdfQUxUSVZFQykpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghKGMtPnNyY1cgJiAxNSkgJiYgIShjLT5mbGFncyAmIFNXU19CSVRFWEFDVCkgJiYKKyAgICAgICAgYy0+c3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgeworICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0ID0gYy0+ZHN0Rm9ybWF0OworCisgICAgICAgIC8vIHVuc2NhbGVkIFlWMTIgLT4gcGFja2VkIFlVViwgd2Ugd2FudCBzcGVlZAorICAgICAgICBpZiAoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfWVVZVjQyMikKKyAgICAgICAgICAgIGMtPnN3c2NhbGUgPSB5djEydG95dXkyX3Vuc2NhbGVkX2FsdGl2ZWM7CisgICAgICAgIGVsc2UgaWYgKGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1VZVlk0MjIpCisgICAgICAgICAgICBjLT5zd3NjYWxlID0geXYxMnRvdXl2eV91bnNjYWxlZF9hbHRpdmVjOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL3JnYjJyZ2IuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL3JnYjJyZ2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjFmY2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvcmdiMnJnYi5jCkBAIC0wLDAgKzEsMzkzIEBACisvKgorICogc29mdHdhcmUgUkdCIHRvIFJHQiBjb252ZXJ0ZXIKKyAqIHBsdXJhbGl6ZSBieSBzb2Z0d2FyZSBQQUw4IHRvIFJHQiBjb252ZXJ0ZXIKKyAqICAgICAgICAgICAgICBzb2Z0d2FyZSBZVVYgdG8gWVVWIGNvbnZlcnRlcgorICogICAgICAgICAgICAgIHNvZnR3YXJlIFlVViB0byBSR0IgY29udmVydGVyCisgKiBXcml0dGVuIGJ5IE5pY2sgS3Vyc2hldi4KKyAqIHBhbGV0dGUgJiBZVVYgJiBydW50aW1lIENQVSBzdHVmZiBieSBNaWNoYWVsIChtaWNoYWVsbmlAZ214LmF0KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAicmdiMnJnYi5oIgorI2luY2x1ZGUgInN3c2NhbGUuaCIKKyNpbmNsdWRlICJzd3NjYWxlX2ludGVybmFsLmgiCisKK3ZvaWQgKCpyZ2IzMnRvYmdyMjQpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCAoKnJnYjMydG9iZ3IxNikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkICgqcmdiMzJ0b2JncjE1KShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgKCpyZ2IyNHRvYmdyMzIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCAoKnJnYjI0dG9iZ3IyNCkoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkICgqcmdiMjR0b2JncjE2KShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgKCpyZ2IyNHRvYmdyMTUpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCAoKnJnYjE2dG9iZ3IyNCkoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkICgqcmdiMTV0b2JncjI0KShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKKwordm9pZCAoKnJnYjMydG8xNikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkICgqcmdiMzJ0bzE1KShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgKCpyZ2IyNHRvMTYpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCAoKnJnYjI0dG8xNSkoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkICgqcmdiMTZ0bzMyKShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgKCpyZ2IxNnRvMTUpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCAoKnJnYjE1dG8xNikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkICgqcmdiMTV0bzMyKShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKKwordm9pZCAoKnNodWZmbGVfYnl0ZXNfMjEwMykoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7CisKK3ZvaWQgKCp5djEydG95dXkyKShjb25zdCB1aW50OF90ICp5c3JjLCBjb25zdCB1aW50OF90ICp1c3JjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgZHN0U3RyaWRlKTsKK3ZvaWQgKCp5djEydG91eXZ5KShjb25zdCB1aW50OF90ICp5c3JjLCBjb25zdCB1aW50OF90ICp1c3JjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgZHN0U3RyaWRlKTsKK3ZvaWQgKCp5dXY0MjJwdG95dXkyKShjb25zdCB1aW50OF90ICp5c3JjLCBjb25zdCB1aW50OF90ICp1c3JjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgZHN0U3RyaWRlKTsKK3ZvaWQgKCp5dXY0MjJwdG91eXZ5KShjb25zdCB1aW50OF90ICp5c3JjLCBjb25zdCB1aW50OF90ICp1c3JjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgZHN0U3RyaWRlKTsKK3ZvaWQgKCp5dXkydG95djEyKShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKnlkc3QsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdWRzdCwgdWludDhfdCAqdmRzdCwKKyAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgc3JjU3RyaWRlKTsKK3ZvaWQgKCpmZl9yZ2IyNHRveXYxMikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICp5ZHN0LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp1ZHN0LCB1aW50OF90ICp2ZHN0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqcmdiMnl1dik7Cit2b2lkICgqcGxhbmFyMngpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGUsIGludCBkc3RTdHJpZGUpOwordm9pZCAoKmludGVybGVhdmVCeXRlcykoY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3JjMVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmMyU3RyaWRlLCBpbnQgZHN0U3RyaWRlKTsKK3ZvaWQgKCpkZWludGVybGVhdmVCeXRlcykoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QxLCB1aW50OF90ICpkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzcmNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3QxU3RyaWRlLCBpbnQgZHN0MlN0cmlkZSk7Cit2b2lkICgqdnU5X3RvX3Z1MTIpKGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdDEsIHVpbnQ4X3QgKmRzdDIsCisgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZTEsIGludCBzcmNTdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlMSwgaW50IGRzdFN0cmlkZTIpOwordm9pZCAoKnl2dTlfdG9feXV5MikoY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGUxLCBpbnQgc3JjU3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGUzLCBpbnQgZHN0U3RyaWRlKTsKK3ZvaWQgKCp1eXZ5dG95dXY0MjApKHVpbnQ4X3QgKnlkc3QsIHVpbnQ4X3QgKnVkc3QsIHVpbnQ4X3QgKnZkc3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSk7Cit2b2lkICgqdXl2eXRveXV2NDIyKSh1aW50OF90ICp5ZHN0LCB1aW50OF90ICp1ZHN0LCB1aW50OF90ICp2ZHN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbHVtU3RyaWRlLCBpbnQgY2hyb21TdHJpZGUsIGludCBzcmNTdHJpZGUpOwordm9pZCAoKnl1eXZ0b3l1djQyMCkodWludDhfdCAqeWRzdCwgdWludDhfdCAqdWRzdCwgdWludDhfdCAqdmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgc3JjU3RyaWRlKTsKK3ZvaWQgKCp5dXl2dG95dXY0MjIpKHVpbnQ4X3QgKnlkc3QsIHVpbnQ4X3QgKnVkc3QsIHVpbnQ4X3QgKnZkc3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSk7CisKKyNkZWZpbmUgQlkgKChpbnQpKCAwLjA5OCAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKyNkZWZpbmUgQlYgKChpbnQpKC0wLjA3MSAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKyNkZWZpbmUgQlUgKChpbnQpKCAwLjQzOSAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKyNkZWZpbmUgR1kgKChpbnQpKCAwLjUwNCAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKyNkZWZpbmUgR1YgKChpbnQpKC0wLjM2OCAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKyNkZWZpbmUgR1UgKChpbnQpKC0wLjI5MSAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKyNkZWZpbmUgUlkgKChpbnQpKCAwLjI1NyAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKyNkZWZpbmUgUlYgKChpbnQpKCAwLjQzOSAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKyNkZWZpbmUgUlUgKChpbnQpKC0wLjE0OCAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKworLy9wbGFpbiBDIHZlcnNpb25zCisjaW5jbHVkZSAicmdiMnJnYl90ZW1wbGF0ZS5jIgorCisvKgorICogUkdCMTUtPlJHQjE2IG9yaWdpbmFsIGJ5IFN0cmVwdG8vQXN0cmFsCisgKiBwb3J0ZWQgdG8gZ2NjICYgYnVnZml4ZWQgOiBBJ3JwaQorICogTU1YRVhULCAzRE5PVyBvcHRpbWl6YXRpb24gYnkgTmljayBLdXJzaGV2CisgKiAzMi1iaXQgQyB2ZXJzaW9uLCBhbmQgYW5kJmFkZCB0cmljayBieSBNaWNoYWVsIE5pZWRlcm1heWVyCisgKi8KKworYXZfY29sZCB2b2lkIHN3c19yZ2IycmdiX2luaXQodm9pZCkKK3sKKyAgICByZ2IycmdiX2luaXRfYygpOworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgcmdiMnJnYl9pbml0X3g4NigpOworfQorCit2b2lkIHJnYjMydG8yNChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIGludCBpLCBudW1fcGl4ZWxzID0gc3JjX3NpemUgPj4gMjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyBpKyspIHsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICAvKiBSR0IzMiAoPSBBLEIsRyxSKSAtPiBCR1IyNCAoPSBCLEcsUikgKi8KKyAgICAgICAgZHN0WzMgKiBpICsgMF0gPSBzcmNbNCAqIGkgKyAxXTsKKyAgICAgICAgZHN0WzMgKiBpICsgMV0gPSBzcmNbNCAqIGkgKyAyXTsKKyAgICAgICAgZHN0WzMgKiBpICsgMl0gPSBzcmNbNCAqIGkgKyAzXTsKKyNlbHNlCisgICAgICAgIGRzdFszICogaSArIDBdID0gc3JjWzQgKiBpICsgMl07CisgICAgICAgIGRzdFszICogaSArIDFdID0gc3JjWzQgKiBpICsgMV07CisgICAgICAgIGRzdFszICogaSArIDJdID0gc3JjWzQgKiBpICsgMF07CisjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQgcmdiMjR0bzMyKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyAzICogaSA8IHNyY19zaXplOyBpKyspIHsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICAvKiBSR0IyNCAoPSBSLCBHLCBCKSAtPiBCR1IzMiAoPSBBLCBSLCBHLCBCKSAqLworICAgICAgICBkc3RbNCAqIGkgKyAwXSA9IDI1NTsKKyAgICAgICAgZHN0WzQgKiBpICsgMV0gPSBzcmNbMyAqIGkgKyAwXTsKKyAgICAgICAgZHN0WzQgKiBpICsgMl0gPSBzcmNbMyAqIGkgKyAxXTsKKyAgICAgICAgZHN0WzQgKiBpICsgM10gPSBzcmNbMyAqIGkgKyAyXTsKKyNlbHNlCisgICAgICAgIGRzdFs0ICogaSArIDBdID0gc3JjWzMgKiBpICsgMl07CisgICAgICAgIGRzdFs0ICogaSArIDFdID0gc3JjWzMgKiBpICsgMV07CisgICAgICAgIGRzdFs0ICogaSArIDJdID0gc3JjWzMgKiBpICsgMF07CisgICAgICAgIGRzdFs0ICogaSArIDNdID0gMjU1OworI2VuZGlmCisgICAgfQorfQorCit2b2lkIHJnYjE2dG9iZ3IzMihjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIHVpbnQ4X3QgKmQgICAgICAgICAgPSBkc3Q7CisgICAgY29uc3QgdWludDE2X3QgKnMgICA9IChjb25zdCB1aW50MTZfdCAqKXNyYzsKKyAgICBjb25zdCB1aW50MTZfdCAqZW5kID0gcyArIHNyY19zaXplIC8gMjsKKworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIHVpbnQxNl90IGJnciA9ICpzKys7CisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICAgICAgKmQrKyA9IDI1NTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MDAxRik8PDMpIHwgKChiZ3ImMHgwMDFGKT4+IDIpOworICAgICAgICAqZCsrID0gKChiZ3ImMHgwN0UwKT4+MykgfCAoKGJnciYweDA3RTApPj4gOSk7CisgICAgICAgICpkKysgPSAoKGJnciYweEY4MDApPj44KSB8ICgoYmdyJjB4RjgwMCk+PjEzKTsKKyNlbHNlCisgICAgICAgICpkKysgPSAoKGJnciYweEY4MDApPj44KSB8ICgoYmdyJjB4RjgwMCk+PjEzKTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MDdFMCk+PjMpIHwgKChiZ3ImMHgwN0UwKT4+IDkpOworICAgICAgICAqZCsrID0gKChiZ3ImMHgwMDFGKTw8MykgfCAoKGJnciYweDAwMUYpPj4gMik7CisgICAgICAgICpkKysgPSAyNTU7CisjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQgcmdiMTJ0bzE1KGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgdWludDE2X3QgcmdiLCByLCBnLCBiOworICAgIHVpbnQxNl90ICpkICAgICAgICAgPSAodWludDE2X3QgKilkc3Q7CisgICAgY29uc3QgdWludDE2X3QgKnMgICA9IChjb25zdCB1aW50MTZfdCAqKXNyYzsKKyAgICBjb25zdCB1aW50MTZfdCAqZW5kID0gcyArIHNyY19zaXplIC8gMjsKKworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJnYiAgPSAqcysrOworICAgICAgICByICAgID0gcmdiICYgMHhGMDA7CisgICAgICAgIGcgICAgPSByZ2IgJiAweDBGMDsKKyAgICAgICAgYiAgICA9IHJnYiAmIDB4MDBGOworICAgICAgICByICAgID0gKHIgPDwgMykgfCAoKHIgJiAweDgwMCkgPj4gMSk7CisgICAgICAgIGcgICAgPSAoZyA8PCAyKSB8ICgoZyAmIDB4MDgwKSA+PiAyKTsKKyAgICAgICAgYiAgICA9IChiIDw8IDEpIHwgKCBiICAgICAgICAgID4+IDMpOworICAgICAgICAqZCsrID0gciB8IGcgfCBiOworICAgIH0KK30KKwordm9pZCByZ2IxNnRvMjQoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICB1aW50OF90ICpkICAgICAgICAgID0gZHN0OworICAgIGNvbnN0IHVpbnQxNl90ICpzICAgPSAoY29uc3QgdWludDE2X3QgKilzcmM7CisgICAgY29uc3QgdWludDE2X3QgKmVuZCA9IHMgKyBzcmNfc2l6ZSAvIDI7CisKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICByZWdpc3RlciB1aW50MTZfdCBiZ3IgPSAqcysrOworICAgICAgICAqZCsrID0gKChiZ3ImMHhGODAwKT4+OCkgfCAoKGJnciYweEY4MDApPj4xMyk7CisgICAgICAgICpkKysgPSAoKGJnciYweDA3RTApPj4zKSB8ICgoYmdyJjB4MDdFMCk+PiA5KTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MDAxRik8PDMpIHwgKChiZ3ImMHgwMDFGKT4+IDIpOworICAgIH0KK30KKwordm9pZCByZ2IxNnRvYmdyMTYoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBpbnQgaSwgbnVtX3BpeGVscyA9IHNyY19zaXplID4+IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIHJnYiAgICAgICAgID0gKChjb25zdCB1aW50MTZfdCAqKXNyYylbaV07CisgICAgICAgICgodWludDE2X3QgKilkc3QpW2ldID0gKHJnYiA+PiAxMSkgfCAocmdiICYgMHg3RTApIHwgKHJnYiA8PCAxMSk7CisgICAgfQorfQorCit2b2lkIHJnYjE2dG9iZ3IxNShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIGludCBpLCBudW1fcGl4ZWxzID0gc3JjX3NpemUgPj4gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgcmdiICAgICAgICAgPSAoKGNvbnN0IHVpbnQxNl90ICopc3JjKVtpXTsKKyAgICAgICAgKCh1aW50MTZfdCAqKWRzdClbaV0gPSAocmdiID4+IDExKSB8ICgocmdiICYgMHg3QzApID4+IDEpIHwgKChyZ2IgJiAweDFGKSA8PCAxMCk7CisgICAgfQorfQorCit2b2lkIHJnYjE1dG9iZ3IzMihjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIHVpbnQ4X3QgKmQgICAgICAgICAgPSBkc3Q7CisgICAgY29uc3QgdWludDE2X3QgKnMgICA9IChjb25zdCB1aW50MTZfdCAqKXNyYzsKKyAgICBjb25zdCB1aW50MTZfdCAqZW5kID0gcyArIHNyY19zaXplIC8gMjsKKworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIHVpbnQxNl90IGJnciA9ICpzKys7CisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICAgICAgKmQrKyA9IDI1NTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MDAxRik8PDMpIHwgKChiZ3ImMHgwMDFGKT4+IDIpOworICAgICAgICAqZCsrID0gKChiZ3ImMHgwM0UwKT4+MikgfCAoKGJnciYweDAzRTApPj4gNyk7CisgICAgICAgICpkKysgPSAoKGJnciYweDdDMDApPj43KSB8ICgoYmdyJjB4N0MwMCk+PjEyKTsKKyNlbHNlCisgICAgICAgICpkKysgPSAoKGJnciYweDdDMDApPj43KSB8ICgoYmdyJjB4N0MwMCk+PjEyKTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MDNFMCk+PjIpIHwgKChiZ3ImMHgwM0UwKT4+IDcpOworICAgICAgICAqZCsrID0gKChiZ3ImMHgwMDFGKTw8MykgfCAoKGJnciYweDAwMUYpPj4gMik7CisgICAgICAgICpkKysgPSAyNTU7CisjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQgcmdiMTV0bzI0KGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgdWludDhfdCAqZCAgICAgICAgICA9IGRzdDsKKyAgICBjb25zdCB1aW50MTZfdCAqcyAgID0gKGNvbnN0IHVpbnQxNl90ICopc3JjOworICAgIGNvbnN0IHVpbnQxNl90ICplbmQgPSBzICsgc3JjX3NpemUgLyAyOworCisgICAgd2hpbGUgKHMgPCBlbmQpIHsKKyAgICAgICAgcmVnaXN0ZXIgdWludDE2X3QgYmdyID0gKnMrKzsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4N0MwMCk+PjcpIHwgKChiZ3ImMHg3QzAwKT4+MTIpOworICAgICAgICAqZCsrID0gKChiZ3ImMHgwM0UwKT4+MikgfCAoKGJnciYweDAzRTApPj4gNyk7CisgICAgICAgICpkKysgPSAoKGJnciYweDAwMUYpPDwzKSB8ICgoYmdyJjB4MDAxRik+PiAyKTsKKyAgICB9Cit9CisKK3ZvaWQgcmdiMTV0b2JncjE2KGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgaW50IGksIG51bV9waXhlbHMgPSBzcmNfc2l6ZSA+PiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7IGkrKykgeworICAgICAgICB1bnNpZ25lZCByZ2IgICAgICAgICA9ICgoY29uc3QgdWludDE2X3QgKilzcmMpW2ldOworICAgICAgICAoKHVpbnQxNl90ICopZHN0KVtpXSA9ICgocmdiICYgMHg3QzAwKSA+PiAxMCkgfCAoKHJnYiAmIDB4M0UwKSA8PCAxKSB8IChyZ2IgPDwgMTEpOworICAgIH0KK30KKwordm9pZCByZ2IxNXRvYmdyMTUoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBpbnQgaSwgbnVtX3BpeGVscyA9IHNyY19zaXplID4+IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIHJnYiAgICAgICAgID0gKChjb25zdCB1aW50MTZfdCAqKXNyYylbaV07CisgICAgICAgIHVuc2lnbmVkIGJyICAgICAgICAgID0gcmdiICYgMHg3QzFGOworICAgICAgICAoKHVpbnQxNl90ICopZHN0KVtpXSA9IChiciA+PiAxMCkgfCAocmdiICYgMHgzRTApIHwgKGJyIDw8IDEwKTsKKyAgICB9Cit9CisKK3ZvaWQgcmdiMTJ0b2JncjEyKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgdWludDE2X3QgKmQgPSAodWludDE2X3QgKilkc3Q7CisgICAgdWludDE2X3QgKnMgPSAodWludDE2X3QgKilzcmM7CisgICAgaW50IGksIG51bV9waXhlbHMgPSBzcmNfc2l6ZSA+PiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7IGkrKykgeworICAgICAgICB1bnNpZ25lZCByZ2IgPSBzW2ldOworICAgICAgICBkW2ldICAgICAgICAgPSAocmdiIDw8IDggfCByZ2IgJiAweEYwIHwgcmdiID4+IDgpICYgMHhGRkY7CisgICAgfQorfQorCisKKyNkZWZpbmUgREVGSU5FX1NIVUZGTEVfQllURVMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgc2h1ZmZsZV9ieXRlc18gIyMgYSAjIyBiICMjIGMgIyMgZChjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX3NpemU7IGkgKz0gNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2kgKyAwXSA9IHNyY1tpICsgYV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2kgKyAxXSA9IHNyY1tpICsgYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2kgKyAyXSA9IHNyY1tpICsgY107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2kgKyAzXSA9IHNyY1tpICsgZF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworREVGSU5FX1NIVUZGTEVfQllURVMoMCwgMywgMiwgMSkKK0RFRklORV9TSFVGRkxFX0JZVEVTKDEsIDIsIDMsIDApCitERUZJTkVfU0hVRkZMRV9CWVRFUygzLCAwLCAxLCAyKQorREVGSU5FX1NIVUZGTEVfQllURVMoMywgMiwgMSwgMCkKKworI2RlZmluZSBERUZJTkVfUkdCNDhUT0JHUjQ4KG5lZWRfYnN3YXAsIHN3YXApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCByZ2I0OHRvYmdyNDhfICMjIG5lZWRfYnN3YXAoY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90ICpkID0gKHVpbnQxNl90ICopZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90ICpzID0gKHVpbnQxNl90ICopc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBudW1fcGl4ZWxzID0gc3JjX3NpemUgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyBpICs9IDMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkW2kgICAgXSA9IHN3YXAgPyBhdl9ic3dhcDE2KHNbaSArIDJdKSA6IHNbaSArIDJdOyAgICAgICAgICAgICAgXAorICAgICAgICBkW2kgKyAxXSA9IHN3YXAgPyBhdl9ic3dhcDE2KHNbaSArIDFdKSA6IHNbaSArIDFdOyAgICAgICAgICAgICAgXAorICAgICAgICBkW2kgKyAyXSA9IHN3YXAgPyBhdl9ic3dhcDE2KHNbaSAgICBdKSA6IHNbaSAgICBdOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitERUZJTkVfUkdCNDhUT0JHUjQ4KG5vYnN3YXAsIDApCitERUZJTkVfUkdCNDhUT0JHUjQ4KGJzd2FwLCAxKQorCisjZGVmaW5lIERFRklORV9SR0I2NFRPQkdSNDgobmVlZF9ic3dhcCwgc3dhcCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIHJnYjY0dG9iZ3I0OF8gIyMgbmVlZF9ic3dhcChjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgKmQgPSAodWludDE2X3QgKilkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgKnMgPSAodWludDE2X3QgKilzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIG51bV9waXhlbHMgPSBzcmNfc2l6ZSA+PiAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRbMyAqIGkgICAgXSA9IHN3YXAgPyBhdl9ic3dhcDE2KHNbNCAqIGkgKyAyXSkgOiBzWzQgKiBpICsgMl07ICBcCisgICAgICAgIGRbMyAqIGkgKyAxXSA9IHN3YXAgPyBhdl9ic3dhcDE2KHNbNCAqIGkgKyAxXSkgOiBzWzQgKiBpICsgMV07ICBcCisgICAgICAgIGRbMyAqIGkgKyAyXSA9IHN3YXAgPyBhdl9ic3dhcDE2KHNbNCAqIGkgICAgXSkgOiBzWzQgKiBpICAgIF07ICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0RFRklORV9SR0I2NFRPQkdSNDgobm9ic3dhcCwgMCkKK0RFRklORV9SR0I2NFRPQkdSNDgoYnN3YXAsIDEpCisKKyNkZWZpbmUgREVGSU5FX1JHQjY0VE80OChuZWVkX2Jzd2FwLCBzd2FwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgcmdiNjR0bzQ4XyAjIyBuZWVkX2Jzd2FwKGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCAqZCA9ICh1aW50MTZfdCAqKWRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCAqcyA9ICh1aW50MTZfdCAqKXNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgbnVtX3BpeGVscyA9IHNyY19zaXplID4+IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZFszICogaSAgICBdID0gc3dhcCA/IGF2X2Jzd2FwMTYoc1s0ICogaSAgICBdKSA6IHNbNCAqIGkgICAgXTsgIFwKKyAgICAgICAgZFszICogaSArIDFdID0gc3dhcCA/IGF2X2Jzd2FwMTYoc1s0ICogaSArIDFdKSA6IHNbNCAqIGkgKyAxXTsgIFwKKyAgICAgICAgZFszICogaSArIDJdID0gc3dhcCA/IGF2X2Jzd2FwMTYoc1s0ICogaSArIDJdKSA6IHNbNCAqIGkgKyAyXTsgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworREVGSU5FX1JHQjY0VE80OChub2Jzd2FwLCAwKQorREVGSU5FX1JHQjY0VE80OChic3dhcCwgMSkKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL3JnYjJyZ2IuaCBiL2ZmbXBlZy9saWJzd3NjYWxlL3JnYjJyZ2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGY1ZGVhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvcmdiMnJnYi5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogIHNvZnR3YXJlIFJHQiB0byBSR0IgY29udmVydGVyCisgKiAgcGx1cmFsaXplIGJ5IFNvZnR3YXJlIFBBTDggdG8gUkdCIGNvbnZlcnRlcgorICogICAgICAgICAgICAgICBTb2Z0d2FyZSBZVVYgdG8gWVVWIGNvbnZlcnRlcgorICogICAgICAgICAgICAgICBTb2Z0d2FyZSBZVVYgdG8gUkdCIGNvbnZlcnRlcgorICogIFdyaXR0ZW4gYnkgTmljayBLdXJzaGV2LgorICogIFlVViAmIHJ1bnRpbWUgQ1BVIHN0dWZmIGJ5IE1pY2hhZWwgKG1pY2hhZWxuaUBnbXguYXQpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgU1dTQ0FMRV9SR0IyUkdCX0gKKyNkZWZpbmUgU1dTQ0FMRV9SR0IyUkdCX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAic3dzY2FsZS5oIgorCisvKiBBIGZ1bGwgY29sbGVjdGlvbiBvZiBSR0IgdG8gUkdCKEJHUikgY29udmVydGVycyAqLworZXh0ZXJuIHZvaWQgKCpyZ2IyNHRvYmdyMzIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgKCpyZ2IyNHRvYmdyMTYpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgKCpyZ2IyNHRvYmdyMTUpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgKCpyZ2IzMnRvYmdyMjQpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgICAgKCpyZ2IzMnRvMTYpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgICAgKCpyZ2IzMnRvMTUpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgICAgKCpyZ2IxNXRvMTYpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgKCpyZ2IxNXRvYmdyMjQpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgICAgKCpyZ2IxNXRvMzIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgICAgKCpyZ2IxNnRvMTUpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgKCpyZ2IxNnRvYmdyMjQpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgICAgKCpyZ2IxNnRvMzIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgKCpyZ2IyNHRvYmdyMjQpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgICAgKCpyZ2IyNHRvMTYpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgICAgKCpyZ2IyNHRvMTUpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgKCpyZ2IzMnRvYmdyMTYpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgKCpyZ2IzMnRvYmdyMTUpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworCitleHRlcm4gdm9pZCAoKnNodWZmbGVfYnl0ZXNfMjEwMykoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7CisKK3ZvaWQgcmdiNjR0b2JncjQ4X25vYnN3YXAoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkICAgcmdiNjR0b2JncjQ4X2Jzd2FwKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCByZ2I0OHRvYmdyNDhfbm9ic3dhcChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgICByZ2I0OHRvYmdyNDhfYnN3YXAoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkICAgIHJnYjY0dG80OF9ub2Jzd2FwKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCAgICAgIHJnYjY0dG80OF9ic3dhcChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgICAgcmdiMjR0bzMyKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCAgICByZ2IzMnRvMjQoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkIHJnYjE2dG9iZ3IzMihjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgICAgcmdiMTZ0bzI0KGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCByZ2IxNnRvYmdyMTYoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkIHJnYjE2dG9iZ3IxNShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgcmdiMTV0b2JncjMyKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCAgICByZ2IxNXRvMjQoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkIHJnYjE1dG9iZ3IxNihjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgcmdiMTV0b2JncjE1KGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCByZ2IxMnRvYmdyMTIoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkICAgIHJnYjEydG8xNShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKKwordm9pZCBzaHVmZmxlX2J5dGVzXzAzMjEoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkIHNodWZmbGVfYnl0ZXNfMTIzMChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgc2h1ZmZsZV9ieXRlc18zMDEyKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCBzaHVmZmxlX2J5dGVzXzMyMTAoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7CisKK3ZvaWQgZmZfcmdiMjR0b3l2MTJfYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKnlkc3QsIHVpbnQ4X3QgKnVkc3QsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdmRzdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbHVtU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50MzJfdCAqcmdiMnl1dik7CisKKy8qKgorICogSGVpZ2h0IHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIHdpZHRoIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDE2LgorICogKElmIHRoaXMgaXMgYSBwcm9ibGVtIGZvciBhbnlvbmUgdGhlbiB0ZWxsIG1lLCBhbmQgSSB3aWxsIGZpeCBpdC4pCisgKi8KK2V4dGVybiB2b2lkICgqeXYxMnRveXV5MikoY29uc3QgdWludDhfdCAqeXNyYywgY29uc3QgdWludDhfdCAqdXNyYywgY29uc3QgdWludDhfdCAqdnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IGRzdFN0cmlkZSk7CisKKy8qKgorICogV2lkdGggc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMTYuCisgKi8KK2V4dGVybiB2b2lkICgqeXV2NDIycHRveXV5MikoY29uc3QgdWludDhfdCAqeXNyYywgY29uc3QgdWludDhfdCAqdXNyYywgY29uc3QgdWludDhfdCAqdnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IGRzdFN0cmlkZSk7CisKKy8qKgorICogSGVpZ2h0IHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIHdpZHRoIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDE2LgorICogKElmIHRoaXMgaXMgYSBwcm9ibGVtIGZvciBhbnlvbmUgdGhlbiB0ZWxsIG1lLCBhbmQgSSB3aWxsIGZpeCBpdC4pCisgKi8KK2V4dGVybiB2b2lkICgqeXV5MnRveXYxMikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICp5ZHN0LCB1aW50OF90ICp1ZHN0LCB1aW50OF90ICp2ZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSk7CisKKy8qKgorICogSGVpZ2h0IHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIHdpZHRoIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDE2LgorICogKElmIHRoaXMgaXMgYSBwcm9ibGVtIGZvciBhbnlvbmUgdGhlbiB0ZWxsIG1lLCBhbmQgSSB3aWxsIGZpeCBpdC4pCisgKi8KK2V4dGVybiB2b2lkICgqeXYxMnRvdXl2eSkoY29uc3QgdWludDhfdCAqeXNyYywgY29uc3QgdWludDhfdCAqdXNyYywgY29uc3QgdWludDhfdCAqdnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IGRzdFN0cmlkZSk7CisKKy8qKgorICogV2lkdGggc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMTYuCisgKi8KK2V4dGVybiB2b2lkICgqeXV2NDIycHRvdXl2eSkoY29uc3QgdWludDhfdCAqeXNyYywgY29uc3QgdWludDhfdCAqdXNyYywgY29uc3QgdWludDhfdCAqdnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IGRzdFN0cmlkZSk7CisKKy8qKgorICogSGVpZ2h0IHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIHdpZHRoIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDIuCisgKiAoSWYgdGhpcyBpcyBhIHByb2JsZW0gZm9yIGFueW9uZSB0aGVuIHRlbGwgbWUsIGFuZCBJIHdpbGwgZml4IGl0LikKKyAqIENocm9taW5hbmNlIGRhdGEgaXMgb25seSB0YWtlbiBmcm9tIGV2ZXJ5IHNlY29uZCBsaW5lLCBvdGhlcnMgYXJlIGlnbm9yZWQuCisgKiBGSVhNRTogV3JpdGUgaGlnaCBxdWFsaXR5IHZlcnNpb24uCisgKi8KK2V4dGVybiB2b2lkICgqZmZfcmdiMjR0b3l2MTIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqeWRzdCwgdWludDhfdCAqdWRzdCwgdWludDhfdCAqdmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnJnYjJ5dXYpOworZXh0ZXJuIHZvaWQgKCpwbGFuYXIyeCkoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGUsIGludCBkc3RTdHJpZGUpOworCitleHRlcm4gdm9pZCAoKmludGVybGVhdmVCeXRlcykoY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNyYzFTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyYzJTdHJpZGUsIGludCBkc3RTdHJpZGUpOworCitleHRlcm4gdm9pZCAoKmRlaW50ZXJsZWF2ZUJ5dGVzKShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdDEsIHVpbnQ4X3QgKmRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzcmNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0MVN0cmlkZSwgaW50IGRzdDJTdHJpZGUpOworCitleHRlcm4gdm9pZCAoKnZ1OV90b192dTEyKShjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0MSwgdWludDhfdCAqZHN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGUxLCBpbnQgc3JjU3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUxLCBpbnQgZHN0U3RyaWRlMik7CisKK2V4dGVybiB2b2lkICgqeXZ1OV90b195dXkyKShjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLCBjb25zdCB1aW50OF90ICpzcmMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZTEsIGludCBzcmNTdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGUzLCBpbnQgZHN0U3RyaWRlKTsKKworZXh0ZXJuIHZvaWQgKCp1eXZ5dG95dXY0MjApKHVpbnQ4X3QgKnlkc3QsIHVpbnQ4X3QgKnVkc3QsIHVpbnQ4X3QgKnZkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgc3JjU3RyaWRlKTsKK2V4dGVybiB2b2lkICgqdXl2eXRveXV2NDIyKSh1aW50OF90ICp5ZHN0LCB1aW50OF90ICp1ZHN0LCB1aW50OF90ICp2ZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSk7CitleHRlcm4gdm9pZCAoKnl1eXZ0b3l1djQyMCkodWludDhfdCAqeWRzdCwgdWludDhfdCAqdWRzdCwgdWludDhfdCAqdmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHVtU3RyaWRlLCBpbnQgY2hyb21TdHJpZGUsIGludCBzcmNTdHJpZGUpOworZXh0ZXJuIHZvaWQgKCp5dXl2dG95dXY0MjIpKHVpbnQ4X3QgKnlkc3QsIHVpbnQ4X3QgKnVkc3QsIHVpbnQ4X3QgKnZkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgc3JjU3RyaWRlKTsKKwordm9pZCBzd3NfcmdiMnJnYl9pbml0KHZvaWQpOworCit2b2lkIHJnYjJyZ2JfaW5pdF94ODYodm9pZCk7CisKKyNlbmRpZiAvKiBTV1NDQUxFX1JHQjJSR0JfSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvcmdiMnJnYl90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYnN3c2NhbGUvcmdiMnJnYl90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YTk4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS9yZ2IycmdiX3RlbXBsYXRlLmMKQEAgLTAsMCArMSw5NTEgQEAKKy8qCisgKiBzb2Z0d2FyZSBSR0IgdG8gUkdCIGNvbnZlcnRlcgorICogcGx1cmFsaXplIGJ5IHNvZnR3YXJlIFBBTDggdG8gUkdCIGNvbnZlcnRlcgorICogICAgICAgICAgICAgIHNvZnR3YXJlIFlVViB0byBZVVYgY29udmVydGVyCisgKiAgICAgICAgICAgICAgc29mdHdhcmUgWVVWIHRvIFJHQiBjb252ZXJ0ZXIKKyAqIFdyaXR0ZW4gYnkgTmljayBLdXJzaGV2LgorICogcGFsZXR0ZSAmIFlVViAmIHJ1bnRpbWUgQ1BVIHN0dWZmIGJ5IE1pY2hhZWwgKG1pY2hhZWxuaUBnbXguYXQpCisgKiBsb3Qgb2YgYmlnLWVuZGlhbiBieXRlIG9yZGVyIGZpeGVzIGJ5IEFsZXggQmVyZWdzemFzemkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKworc3RhdGljIGlubGluZSB2b2lkIHJnYjI0dG9iZ3IzMl9jKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc2l6ZSkKK3sKKyAgICB1aW50OF90ICpkZXN0ICAgICAgPSBkc3Q7CisgICAgY29uc3QgdWludDhfdCAqcyAgID0gc3JjOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IHMgKyBzcmNfc2l6ZTsKKworICAgIHdoaWxlIChzIDwgZW5kKSB7CisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICAgICAgLyogUkdCMjQgKD0gUiwgRywgQikgLT4gUkdCMzIgKD0gQSwgQiwgRywgUikgKi8KKyAgICAgICAgKmRlc3QrKyAgPSAyNTU7CisgICAgICAgICpkZXN0KysgID0gc1syXTsKKyAgICAgICAgKmRlc3QrKyAgPSBzWzFdOworICAgICAgICAqZGVzdCsrICA9IHNbMF07CisgICAgICAgIHMgICAgICAgKz0gMzsKKyNlbHNlCisgICAgICAgICpkZXN0KysgID0gKnMrKzsKKyAgICAgICAgKmRlc3QrKyAgPSAqcysrOworICAgICAgICAqZGVzdCsrICA9ICpzKys7CisgICAgICAgICpkZXN0KysgID0gMjU1OworI2VuZGlmCisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmdiMzJ0b2JncjI0X2MoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zaXplKQoreworICAgIHVpbnQ4X3QgKmRlc3QgICAgICA9IGRzdDsKKyAgICBjb25zdCB1aW50OF90ICpzICAgPSBzcmM7CisgICAgY29uc3QgdWludDhfdCAqZW5kID0gcyArIHNyY19zaXplOworCisgICAgd2hpbGUgKHMgPCBlbmQpIHsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICAvKiBSR0IzMiAoPSBBLCBCLCBHLCBSKSAtPiBSR0IyNCAoPSBSLCBHLCBCKSAqLworICAgICAgICBzKys7CisgICAgICAgIGRlc3RbMl0gID0gKnMrKzsKKyAgICAgICAgZGVzdFsxXSAgPSAqcysrOworICAgICAgICBkZXN0WzBdICA9ICpzKys7CisgICAgICAgIGRlc3QgICAgKz0gMzsKKyNlbHNlCisgICAgICAgICpkZXN0KysgID0gKnMrKzsKKyAgICAgICAgKmRlc3QrKyAgPSAqcysrOworICAgICAgICAqZGVzdCsrICA9ICpzKys7CisgICAgICAgIHMrKzsKKyNlbmRpZgorICAgIH0KK30KKworLyoKKyAqIG9yaWdpbmFsIGJ5IFN0cmVwdG8vQXN0cmFsCisgKiBwb3J0ZWQgdG8gZ2NjICYgYnVnZml4ZWQ6IEEncnBpCisgKiBNTVhFWFQsIDNETk9XIG9wdGltaXphdGlvbiBieSBOaWNrIEt1cnNoZXYKKyAqIDMyLWJpdCBDIHZlcnNpb24sIGFuZCBhbmQmYWRkIHRyaWNrIGJ5IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJnYjE1dG8xNl9jKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgcmVnaXN0ZXIgdWludDhfdCAqZCAgICAgICAgID0gZHN0OworICAgIHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QgKnMgICA9IHNyYzsKKyAgICByZWdpc3RlciBjb25zdCB1aW50OF90ICplbmQgPSBzICsgc3JjX3NpemU7CisgICAgY29uc3QgdWludDhfdCAqbW1fZW5kICAgICAgID0gZW5kIC0gMzsKKworICAgIHdoaWxlIChzIDwgbW1fZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHggPSAqKChjb25zdCB1aW50MzJfdCAqKXMpOworICAgICAgICAqKCh1aW50MzJfdCAqKWQpICAgID0gKHggJiAweDdGRkY3RkZGKSArICh4ICYgMHg3RkUwN0ZFMCk7CisgICAgICAgIGQgKz0gNDsKKyAgICAgICAgcyArPSA0OworICAgIH0KKyAgICBpZiAocyA8IGVuZCkgeworICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBzaG9ydCB4ID0gKigoY29uc3QgdWludDE2X3QgKilzKTsKKyAgICAgICAgKigodWludDE2X3QgKilkKSAgICAgICAgICA9ICh4ICYgMHg3RkZGKSArICh4ICYgMHg3RkUwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZ2IxNnRvMTVfYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIHJlZ2lzdGVyIHVpbnQ4X3QgKmQgICAgICAgICA9IGRzdDsKKyAgICByZWdpc3RlciBjb25zdCB1aW50OF90ICpzICAgPSBzcmM7CisgICAgcmVnaXN0ZXIgY29uc3QgdWludDhfdCAqZW5kID0gcyArIHNyY19zaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKm1tX2VuZCAgICAgICA9IGVuZCAtIDM7CisKKyAgICB3aGlsZSAocyA8IG1tX2VuZCkgeworICAgICAgICByZWdpc3RlciB1aW50MzJfdCB4ICA9ICooKGNvbnN0IHVpbnQzMl90ICopcyk7CisgICAgICAgICooKHVpbnQzMl90ICopZCkgICAgID0gKCh4ID4+IDEpICYgMHg3RkUwN0ZFMCkgfCAoeCAmIDB4MDAxRjAwMUYpOworICAgICAgICBzICAgICAgICAgICAgICAgICAgICs9IDQ7CisgICAgICAgIGQgICAgICAgICAgICAgICAgICAgKz0gNDsKKyAgICB9CisgICAgaWYgKHMgPCBlbmQpIHsKKyAgICAgICAgcmVnaXN0ZXIgdWludDE2X3QgeCA9ICooKGNvbnN0IHVpbnQxNl90ICopcyk7CisgICAgICAgICooKHVpbnQxNl90ICopZCkgICAgPSAoKHggPj4gMSkgJiAweDdGRTApIHwgKHggJiAweDAwMUYpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJnYjMydG8xNl9jKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgdWludDE2X3QgKmQgICAgICAgID0gKHVpbnQxNl90ICopZHN0OworICAgIGNvbnN0IHVpbnQ4X3QgKnMgICA9IHNyYzsKKyAgICBjb25zdCB1aW50OF90ICplbmQgPSBzICsgc3JjX3NpemU7CisKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICByZWdpc3RlciBpbnQgcmdiICA9ICooY29uc3QgdWludDMyX3QgKilzOworICAgICAgICBzICAgICAgICAgICAgICAgICs9IDQ7CisgICAgICAgICpkKysgICAgICAgICAgICAgID0gKChyZ2IgJiAweEZGKSAgICAgPj4gMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmdiICYgMHhGQzAwKSAgID4+IDUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJnYiAmIDB4RjgwMDAwKSA+PiA4KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZ2IzMnRvYmdyMTZfYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3NpemUpCit7CisgICAgdWludDE2X3QgKmQgICAgICAgID0gKHVpbnQxNl90ICopZHN0OworICAgIGNvbnN0IHVpbnQ4X3QgKnMgICA9IHNyYzsKKyAgICBjb25zdCB1aW50OF90ICplbmQgPSBzICsgc3JjX3NpemU7CisKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICByZWdpc3RlciBpbnQgcmdiICA9ICooY29uc3QgdWludDMyX3QgKilzOworICAgICAgICBzICAgICAgICAgICAgICAgICs9IDQ7CisgICAgICAgICpkKysgICAgICAgICAgICAgID0gKChyZ2IgJiAweEY4KSAgICAgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmdiICYgMHhGQzAwKSAgID4+IDUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJnYiAmIDB4RjgwMDAwKSA+PiAxOSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmdiMzJ0bzE1X2MoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICB1aW50MTZfdCAqZCAgICAgICAgPSAodWludDE2X3QgKilkc3Q7CisgICAgY29uc3QgdWludDhfdCAqcyAgID0gc3JjOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IHMgKyBzcmNfc2l6ZTsKKworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIGludCByZ2IgID0gKihjb25zdCB1aW50MzJfdCAqKXM7CisgICAgICAgIHMgICAgICAgICAgICAgICAgKz0gNDsKKyAgICAgICAgKmQrKyAgICAgICAgICAgICAgPSAoKHJnYiAmIDB4RkYpICAgICA+PiAzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyZ2IgJiAweEY4MDApICAgPj4gNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmdiICYgMHhGODAwMDApID4+IDkpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJnYjMydG9iZ3IxNV9jKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc2l6ZSkKK3sKKyAgICB1aW50MTZfdCAqZCAgICAgICAgPSAodWludDE2X3QgKilkc3Q7CisgICAgY29uc3QgdWludDhfdCAqcyAgID0gc3JjOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IHMgKyBzcmNfc2l6ZTsKKworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIGludCByZ2IgID0gKihjb25zdCB1aW50MzJfdCAqKXM7CisgICAgICAgIHMgICAgICAgICAgICAgICAgKz0gNDsKKyAgICAgICAgKmQrKyAgICAgICAgICAgICAgPSAoKHJnYiAmIDB4RjgpICAgICA8PCAgNykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmdiICYgMHhGODAwKSAgID4+ICA2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyZ2IgJiAweEY4MDAwMCkgPj4gMTkpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJnYjI0dG9iZ3IxNl9jKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc2l6ZSkKK3sKKyAgICB1aW50MTZfdCAqZCAgICAgICAgPSAodWludDE2X3QgKilkc3Q7CisgICAgY29uc3QgdWludDhfdCAqcyAgID0gc3JjOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IHMgKyBzcmNfc2l6ZTsKKworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIGNvbnN0IGludCBiID0gKnMrKzsKKyAgICAgICAgY29uc3QgaW50IGcgPSAqcysrOworICAgICAgICBjb25zdCBpbnQgciA9ICpzKys7CisgICAgICAgICpkKysgICAgICAgID0gKGIgPj4gMykgfCAoKGcgJiAweEZDKSA8PCAzKSB8ICgociAmIDB4RjgpIDw8IDgpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJnYjI0dG8xNl9jKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgdWludDE2X3QgKmQgICAgICAgID0gKHVpbnQxNl90ICopZHN0OworICAgIGNvbnN0IHVpbnQ4X3QgKnMgICA9IHNyYzsKKyAgICBjb25zdCB1aW50OF90ICplbmQgPSBzICsgc3JjX3NpemU7CisKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICBjb25zdCBpbnQgciA9ICpzKys7CisgICAgICAgIGNvbnN0IGludCBnID0gKnMrKzsKKyAgICAgICAgY29uc3QgaW50IGIgPSAqcysrOworICAgICAgICAqZCsrICAgICAgICA9IChiID4+IDMpIHwgKChnICYgMHhGQykgPDwgMykgfCAoKHIgJiAweEY4KSA8PCA4KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZ2IyNHRvYmdyMTVfYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3NpemUpCit7CisgICAgdWludDE2X3QgKmQgICAgICAgID0gKHVpbnQxNl90ICopZHN0OworICAgIGNvbnN0IHVpbnQ4X3QgKnMgICA9IHNyYzsKKyAgICBjb25zdCB1aW50OF90ICplbmQgPSBzICsgc3JjX3NpemU7CisKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICBjb25zdCBpbnQgYiA9ICpzKys7CisgICAgICAgIGNvbnN0IGludCBnID0gKnMrKzsKKyAgICAgICAgY29uc3QgaW50IHIgPSAqcysrOworICAgICAgICAqZCsrICAgICAgICA9IChiID4+IDMpIHwgKChnICYgMHhGOCkgPDwgMikgfCAoKHIgJiAweEY4KSA8PCA3KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZ2IyNHRvMTVfYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIHVpbnQxNl90ICpkICAgICAgICA9ICh1aW50MTZfdCAqKWRzdDsKKyAgICBjb25zdCB1aW50OF90ICpzICAgPSBzcmM7CisgICAgY29uc3QgdWludDhfdCAqZW5kID0gcyArIHNyY19zaXplOworCisgICAgd2hpbGUgKHMgPCBlbmQpIHsKKyAgICAgICAgY29uc3QgaW50IHIgPSAqcysrOworICAgICAgICBjb25zdCBpbnQgZyA9ICpzKys7CisgICAgICAgIGNvbnN0IGludCBiID0gKnMrKzsKKyAgICAgICAgKmQrKyAgICAgICAgPSAoYiA+PiAzKSB8ICgoZyAmIDB4RjgpIDw8IDIpIHwgKChyICYgMHhGOCkgPDwgNyk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmdiMTV0b2JncjI0X2MoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zaXplKQoreworICAgIHVpbnQ4X3QgKmQgICAgICAgICAgPSBkc3Q7CisgICAgY29uc3QgdWludDE2X3QgKnMgICA9IChjb25zdCB1aW50MTZfdCAqKXNyYzsKKyAgICBjb25zdCB1aW50MTZfdCAqZW5kID0gcyArIHNyY19zaXplIC8gMjsKKworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIHVpbnQxNl90IGJnciA9ICpzKys7CisgICAgICAgICpkKysgPSAoKGJnciYweDAwMUYpPDwzKSB8ICgoYmdyJjB4MDAxRik+PiAyKTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MDNFMCk+PjIpIHwgKChiZ3ImMHgwM0UwKT4+IDcpOworICAgICAgICAqZCsrID0gKChiZ3ImMHg3QzAwKT4+NykgfCAoKGJnciYweDdDMDApPj4xMik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmdiMTZ0b2JncjI0X2MoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zaXplKQoreworICAgIHVpbnQ4X3QgKmQgICAgICAgICAgPSAodWludDhfdCAqKWRzdDsKKyAgICBjb25zdCB1aW50MTZfdCAqcyAgID0gKGNvbnN0IHVpbnQxNl90ICopc3JjOworICAgIGNvbnN0IHVpbnQxNl90ICplbmQgPSBzICsgc3JjX3NpemUgLyAyOworCisgICAgd2hpbGUgKHMgPCBlbmQpIHsKKyAgICAgICAgcmVnaXN0ZXIgdWludDE2X3QgYmdyID0gKnMrKzsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MDAxRik8PDMpIHwgKChiZ3ImMHgwMDFGKT4+IDIpOworICAgICAgICAqZCsrID0gKChiZ3ImMHgwN0UwKT4+MykgfCAoKGJnciYweDA3RTApPj4gOSk7CisgICAgICAgICpkKysgPSAoKGJnciYweEY4MDApPj44KSB8ICgoYmdyJjB4RjgwMCk+PjEzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZ2IxNXRvMzJfYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIHVpbnQ4X3QgKmQgICAgICAgICAgPSBkc3Q7CisgICAgY29uc3QgdWludDE2X3QgKnMgICA9IChjb25zdCB1aW50MTZfdCAqKXNyYzsKKyAgICBjb25zdCB1aW50MTZfdCAqZW5kID0gcyArIHNyY19zaXplIC8gMjsKKworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIHVpbnQxNl90IGJnciA9ICpzKys7CisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICAgICAgKmQrKyA9IDI1NTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4N0MwMCk+PjcpIHwgKChiZ3ImMHg3QzAwKT4+MTIpOworICAgICAgICAqZCsrID0gKChiZ3ImMHgwM0UwKT4+MikgfCAoKGJnciYweDAzRTApPj4gNyk7CisgICAgICAgICpkKysgPSAoKGJnciYweDAwMUYpPDwzKSB8ICgoYmdyJjB4MDAxRik+PiAyKTsKKyNlbHNlCisgICAgICAgICpkKysgPSAoKGJnciYweDAwMUYpPDwzKSB8ICgoYmdyJjB4MDAxRik+PiAyKTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MDNFMCk+PjIpIHwgKChiZ3ImMHgwM0UwKT4+IDcpOworICAgICAgICAqZCsrID0gKChiZ3ImMHg3QzAwKT4+NykgfCAoKGJnciYweDdDMDApPj4xMik7CisgICAgICAgICpkKysgPSAyNTU7CisjZW5kaWYKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZ2IxNnRvMzJfYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIHVpbnQ4X3QgKmQgICAgICAgICAgPSBkc3Q7CisgICAgY29uc3QgdWludDE2X3QgKnMgICA9IChjb25zdCB1aW50MTZfdCAqKXNyYzsKKyAgICBjb25zdCB1aW50MTZfdCAqZW5kID0gcyArIHNyY19zaXplIC8gMjsKKworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIHVpbnQxNl90IGJnciA9ICpzKys7CisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICAgICAgKmQrKyA9IDI1NTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4RjgwMCk+PjgpIHwgKChiZ3ImMHhGODAwKT4+MTMpOworICAgICAgICAqZCsrID0gKChiZ3ImMHgwN0UwKT4+MykgfCAoKGJnciYweDA3RTApPj4gOSk7CisgICAgICAgICpkKysgPSAoKGJnciYweDAwMUYpPDwzKSB8ICgoYmdyJjB4MDAxRik+PiAyKTsKKyNlbHNlCisgICAgICAgICpkKysgPSAoKGJnciYweDAwMUYpPDwzKSB8ICgoYmdyJjB4MDAxRik+PiAyKTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MDdFMCk+PjMpIHwgKChiZ3ImMHgwN0UwKT4+IDkpOworICAgICAgICAqZCsrID0gKChiZ3ImMHhGODAwKT4+OCkgfCAoKGJnciYweEY4MDApPj4xMyk7CisgICAgICAgICpkKysgPSAyNTU7CisjZW5kaWYKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaHVmZmxlX2J5dGVzXzIxMDNfYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3NpemUpCit7CisgICAgaW50IGlkeCAgICAgICAgICA9IDE1ICAtIHNyY19zaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKnMgPSBzcmMgLSBpZHg7CisgICAgdWludDhfdCAqZCAgICAgICA9IGRzdCAtIGlkeDsKKworICAgIGZvciAoOyBpZHggPCAxNTsgaWR4ICs9IDQpIHsKKyAgICAgICAgcmVnaXN0ZXIgaW50IHYgICAgICAgID0gKihjb25zdCB1aW50MzJfdCAqKSZzW2lkeF0sIGcgPSB2ICYgMHhmZjAwZmYwMDsKKyAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgJj0gMHhmZjAwZmY7CisgICAgICAgICoodWludDMyX3QgKikmZFtpZHhdICA9ICh2ID4+IDE2KSArIGcgKyAodiA8PCAxNik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmdiMjR0b2JncjI0X2MoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpICs9IDMpIHsKKyAgICAgICAgcmVnaXN0ZXIgdWludDhfdCB4ID0gc3JjW2kgKyAyXTsKKyAgICAgICAgZHN0W2kgKyAxXSAgICAgICAgID0gc3JjW2kgKyAxXTsKKyAgICAgICAgZHN0W2kgKyAyXSAgICAgICAgID0gc3JjW2kgKyAwXTsKKyAgICAgICAgZHN0W2kgKyAwXSAgICAgICAgID0geDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB5dXZQbGFuYXJ0b3l1eTJfYyhjb25zdCB1aW50OF90ICp5c3JjLCBjb25zdCB1aW50OF90ICp1c3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCB2ZXJ0THVtUGVyQ2hyb21hKQoreworICAgIGludCB5LCBpOworICAgIGNvbnN0IGludCBjaHJvbVdpZHRoID0gd2lkdGggPj4gMTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworI2lmIEhBVkVfRkFTVF82NEJJVAorICAgICAgICB1aW50NjRfdCAqbGRzdCA9ICh1aW50NjRfdCAqKWRzdDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqeWMgPSB5c3JjLCAqdWMgPSB1c3JjLCAqdmMgPSB2c3JjOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hyb21XaWR0aDsgaSArPSAyKSB7CisgICAgICAgICAgICB1aW50NjRfdCBrID0geWNbMF0gKyAodWNbMF0gPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICh5Y1sxXSA8PCAxNikgKyAoKHVuc2lnbmVkKSB2Y1swXSA8PCAyNCk7CisgICAgICAgICAgICB1aW50NjRfdCBsID0geWNbMl0gKyAodWNbMV0gPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICh5Y1szXSA8PCAxNikgKyAoKHVuc2lnbmVkKSB2Y1sxXSA8PCAyNCk7CisgICAgICAgICAgICAqbGRzdCsrID0gayArIChsIDw8IDMyKTsKKyAgICAgICAgICAgIHljICAgICArPSA0OworICAgICAgICAgICAgdWMgICAgICs9IDI7CisgICAgICAgICAgICB2YyAgICAgKz0gMjsKKyAgICAgICAgfQorCisjZWxzZQorICAgICAgICBpbnQgKmlkc3QgPSAoaW50MzJfdCAqKWRzdDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqeWMgPSB5c3JjLCAqdWMgPSB1c3JjLCAqdmMgPSB2c3JjOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaHJvbVdpZHRoOyBpKyspIHsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICAgICAgKmlkc3QrKyA9ICh5Y1swXSA8PCAyNCkgKyAodWNbMF0gPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAoeWNbMV0gPDwgIDgpICsgKHZjWzBdIDw8ICAwKTsKKyNlbHNlCisgICAgICAgICAgICAqaWRzdCsrID0geWNbMF0gKyAodWNbMF0gPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICh5Y1sxXSA8PCAxNikgKyAodmNbMF0gPDwgMjQpOworI2VuZGlmCisgICAgICAgICAgICB5YyArPSAyOworICAgICAgICAgICAgdWMrKzsKKyAgICAgICAgICAgIHZjKys7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoKHkgJiAodmVydEx1bVBlckNocm9tYSAtIDEpKSA9PSB2ZXJ0THVtUGVyQ2hyb21hIC0gMSkgeworICAgICAgICAgICAgdXNyYyArPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgICAgIHZzcmMgKz0gY2hyb21TdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgeXNyYyArPSBsdW1TdHJpZGU7CisgICAgICAgIGRzdCAgKz0gZHN0U3RyaWRlOworICAgIH0KK30KKworLyoqCisgKiBIZWlnaHQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgd2lkdGggc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMTYuCisgKiAoSWYgdGhpcyBpcyBhIHByb2JsZW0gZm9yIGFueW9uZSB0aGVuIHRlbGwgbWUsIGFuZCBJIHdpbGwgZml4IGl0LikKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHl2MTJ0b3l1eTJfYyhjb25zdCB1aW50OF90ICp5c3JjLCBjb25zdCB1aW50OF90ICp1c3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp2c3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGx1bVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNocm9tU3RyaWRlLCBpbnQgZHN0U3RyaWRlKQoreworICAgIC8vRklYTUUgaW50ZXJwb2xhdGUgY2hyb21hCisgICAgeXV2UGxhbmFydG95dXkyX2MoeXNyYywgdXNyYywgdnNyYywgZHN0LCB3aWR0aCwgaGVpZ2h0LCBsdW1TdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgY2hyb21TdHJpZGUsIGRzdFN0cmlkZSwgMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB5dXZQbGFuYXJ0b3V5dnlfYyhjb25zdCB1aW50OF90ICp5c3JjLCBjb25zdCB1aW50OF90ICp1c3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCB2ZXJ0THVtUGVyQ2hyb21hKQoreworICAgIGludCB5LCBpOworICAgIGNvbnN0IGludCBjaHJvbVdpZHRoID0gd2lkdGggPj4gMTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworI2lmIEhBVkVfRkFTVF82NEJJVAorICAgICAgICB1aW50NjRfdCAqbGRzdCA9ICh1aW50NjRfdCAqKWRzdDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqeWMgPSB5c3JjLCAqdWMgPSB1c3JjLCAqdmMgPSB2c3JjOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hyb21XaWR0aDsgaSArPSAyKSB7CisgICAgICAgICAgICB1aW50NjRfdCBrID0gdWNbMF0gKyAoeWNbMF0gPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICh2Y1swXSA8PCAxNikgKyAoKHVuc2lnbmVkKSB5Y1sxXSA8PCAyNCk7CisgICAgICAgICAgICB1aW50NjRfdCBsID0gdWNbMV0gKyAoeWNbMl0gPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICh2Y1sxXSA8PCAxNikgKyAoKHVuc2lnbmVkKSB5Y1szXSA8PCAyNCk7CisgICAgICAgICAgICAqbGRzdCsrID0gayArIChsIDw8IDMyKTsKKyAgICAgICAgICAgIHljICAgICArPSA0OworICAgICAgICAgICAgdWMgICAgICs9IDI7CisgICAgICAgICAgICB2YyAgICAgKz0gMjsKKyAgICAgICAgfQorCisjZWxzZQorICAgICAgICBpbnQgKmlkc3QgPSAoaW50MzJfdCAqKWRzdDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqeWMgPSB5c3JjLCAqdWMgPSB1c3JjLCAqdmMgPSB2c3JjOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaHJvbVdpZHRoOyBpKyspIHsKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICAgICAgKmlkc3QrKyA9ICh1Y1swXSA8PCAyNCkgKyAoeWNbMF0gPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAodmNbMF0gPDwgIDgpICsgKHljWzFdIDw8ICAwKTsKKyNlbHNlCisgICAgICAgICAgICAqaWRzdCsrID0gdWNbMF0gKyAoeWNbMF0gPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICh2Y1swXSA8PCAxNikgKyAoeWNbMV0gPDwgMjQpOworI2VuZGlmCisgICAgICAgICAgICB5YyArPSAyOworICAgICAgICAgICAgdWMrKzsKKyAgICAgICAgICAgIHZjKys7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoKHkgJiAodmVydEx1bVBlckNocm9tYSAtIDEpKSA9PSB2ZXJ0THVtUGVyQ2hyb21hIC0gMSkgeworICAgICAgICAgICAgdXNyYyArPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgICAgIHZzcmMgKz0gY2hyb21TdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgeXNyYyArPSBsdW1TdHJpZGU7CisgICAgICAgIGRzdCAgKz0gZHN0U3RyaWRlOworICAgIH0KK30KKworLyoqCisgKiBIZWlnaHQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgd2lkdGggc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMTYKKyAqIChJZiB0aGlzIGlzIGEgcHJvYmxlbSBmb3IgYW55b25lIHRoZW4gdGVsbCBtZSwgYW5kIEkgd2lsbCBmaXggaXQuKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgeXYxMnRvdXl2eV9jKGNvbnN0IHVpbnQ4X3QgKnlzcmMsIGNvbnN0IHVpbnQ4X3QgKnVzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbHVtU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyb21TdHJpZGUsIGludCBkc3RTdHJpZGUpCit7CisgICAgLy9GSVhNRSBpbnRlcnBvbGF0ZSBjaHJvbWEKKyAgICB5dXZQbGFuYXJ0b3V5dnlfYyh5c3JjLCB1c3JjLCB2c3JjLCBkc3QsIHdpZHRoLCBoZWlnaHQsIGx1bVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBjaHJvbVN0cmlkZSwgZHN0U3RyaWRlLCAyKTsKK30KKworLyoqCisgKiBXaWR0aCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAxNi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHl1djQyMnB0b3V5dnlfYyhjb25zdCB1aW50OF90ICp5c3JjLCBjb25zdCB1aW50OF90ICp1c3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp2c3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGx1bVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNocm9tU3RyaWRlLCBpbnQgZHN0U3RyaWRlKQoreworICAgIHl1dlBsYW5hcnRvdXl2eV9jKHlzcmMsIHVzcmMsIHZzcmMsIGRzdCwgd2lkdGgsIGhlaWdodCwgbHVtU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGNocm9tU3RyaWRlLCBkc3RTdHJpZGUsIDEpOworfQorCisvKioKKyAqIFdpZHRoIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDE2LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgeXV2NDIycHRveXV5Ml9jKGNvbnN0IHVpbnQ4X3QgKnlzcmMsIGNvbnN0IHVpbnQ4X3QgKnVzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbHVtU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyb21TdHJpZGUsIGludCBkc3RTdHJpZGUpCit7CisgICAgeXV2UGxhbmFydG95dXkyX2MoeXNyYywgdXNyYywgdnNyYywgZHN0LCB3aWR0aCwgaGVpZ2h0LCBsdW1TdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgY2hyb21TdHJpZGUsIGRzdFN0cmlkZSwgMSk7Cit9CisKKy8qKgorICogSGVpZ2h0IHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIHdpZHRoIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDE2LgorICogKElmIHRoaXMgaXMgYSBwcm9ibGVtIGZvciBhbnlvbmUgdGhlbiB0ZWxsIG1lLCBhbmQgSSB3aWxsIGZpeCBpdC4pCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB5dXkydG95djEyX2MoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICp5ZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp1ZHN0LCB1aW50OF90ICp2ZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBsdW1TdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSkKK3sKKyAgICBpbnQgeTsKKyAgICBjb25zdCBpbnQgY2hyb21XaWR0aCA9IHdpZHRoID4+IDE7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaHJvbVdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgIHlkc3RbMiAqIGkgKyAwXSA9IHNyY1s0ICogaSArIDBdOworICAgICAgICAgICAgdWRzdFtpXSAgICAgICAgID0gc3JjWzQgKiBpICsgMV07CisgICAgICAgICAgICB5ZHN0WzIgKiBpICsgMV0gPSBzcmNbNCAqIGkgKyAyXTsKKyAgICAgICAgICAgIHZkc3RbaV0gICAgICAgICA9IHNyY1s0ICogaSArIDNdOworICAgICAgICB9CisgICAgICAgIHlkc3QgKz0gbHVtU3RyaWRlOworICAgICAgICBzcmMgICs9IHNyY1N0cmlkZTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hyb21XaWR0aDsgaSsrKSB7CisgICAgICAgICAgICB5ZHN0WzIgKiBpICsgMF0gPSBzcmNbNCAqIGkgKyAwXTsKKyAgICAgICAgICAgIHlkc3RbMiAqIGkgKyAxXSA9IHNyY1s0ICogaSArIDJdOworICAgICAgICB9CisgICAgICAgIHVkc3QgKz0gY2hyb21TdHJpZGU7CisgICAgICAgIHZkc3QgKz0gY2hyb21TdHJpZGU7CisgICAgICAgIHlkc3QgKz0gbHVtU3RyaWRlOworICAgICAgICBzcmMgICs9IHNyY1N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGFuYXIyeF9jKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjSGVpZ2h0LCBpbnQgc3JjU3RyaWRlLCBpbnQgZHN0U3RyaWRlKQoreworICAgIGludCB4LCB5OworCisgICAgZHN0WzBdID0gc3JjWzBdOworCisgICAgLy8gZmlyc3QgbGluZQorICAgIGZvciAoeCA9IDA7IHggPCBzcmNXaWR0aCAtIDE7IHgrKykgeworICAgICAgICBkc3RbMiAqIHggKyAxXSA9ICgzICogc3JjW3hdICsgc3JjW3ggKyAxXSkgPj4gMjsKKyAgICAgICAgZHN0WzIgKiB4ICsgMl0gPSAoc3JjW3hdICsgMyAqIHNyY1t4ICsgMV0pID4+IDI7CisgICAgfQorICAgIGRzdFsyICogc3JjV2lkdGggLSAxXSA9IHNyY1tzcmNXaWR0aCAtIDFdOworCisgICAgZHN0ICs9IGRzdFN0cmlkZTsKKworICAgIGZvciAoeSA9IDE7IHkgPCBzcmNIZWlnaHQ7IHkrKykgeworICAgICAgICBjb25zdCBpbnQgbW14U2l6ZSA9IDE7CisKKyAgICAgICAgZHN0WzBdICAgICAgICAgPSAoc3JjWzBdICogMyArIHNyY1tzcmNTdHJpZGVdKSA+PiAyOworICAgICAgICBkc3RbZHN0U3RyaWRlXSA9IChzcmNbMF0gKyAzICogc3JjW3NyY1N0cmlkZV0pID4+IDI7CisKKyAgICAgICAgZm9yICh4ID0gbW14U2l6ZSAtIDE7IHggPCBzcmNXaWR0aCAtIDE7IHgrKykgeworICAgICAgICAgICAgZHN0WzIgKiB4ICsgMV0gICAgICAgICAgICAgPSAoc3JjW3ggKyAwXSAqIDMgKyBzcmNbeCArIHNyY1N0cmlkZSArIDFdKSA+PiAyOworICAgICAgICAgICAgZHN0WzIgKiB4ICsgZHN0U3RyaWRlICsgMl0gPSAoc3JjW3ggKyAwXSArIDMgKiBzcmNbeCArIHNyY1N0cmlkZSArIDFdKSA+PiAyOworICAgICAgICAgICAgZHN0WzIgKiB4ICsgZHN0U3RyaWRlICsgMV0gPSAoc3JjW3ggKyAxXSArIDMgKiBzcmNbeCArIHNyY1N0cmlkZV0pICAgICA+PiAyOworICAgICAgICAgICAgZHN0WzIgKiB4ICsgMl0gICAgICAgICAgICAgPSAoc3JjW3ggKyAxXSAqIDMgKyBzcmNbeCArIHNyY1N0cmlkZV0pICAgICA+PiAyOworICAgICAgICB9CisgICAgICAgIGRzdFtzcmNXaWR0aCAqIDIgLSAxXSAgICAgICAgICAgICA9IChzcmNbc3JjV2lkdGggLSAxXSAqIDMgKyBzcmNbc3JjV2lkdGggLSAxICsgc3JjU3RyaWRlXSkgPj4gMjsKKyAgICAgICAgZHN0W3NyY1dpZHRoICogMiAtIDEgKyBkc3RTdHJpZGVdID0gKHNyY1tzcmNXaWR0aCAtIDFdICsgMyAqIHNyY1tzcmNXaWR0aCAtIDEgKyBzcmNTdHJpZGVdKSA+PiAyOworCisgICAgICAgIGRzdCArPSBkc3RTdHJpZGUgKiAyOworICAgICAgICBzcmMgKz0gc3JjU3RyaWRlOworICAgIH0KKworICAgIC8vIGxhc3QgbGluZQorICAgIGRzdFswXSA9IHNyY1swXTsKKworICAgIGZvciAoeCA9IDA7IHggPCBzcmNXaWR0aCAtIDE7IHgrKykgeworICAgICAgICBkc3RbMiAqIHggKyAxXSA9IChzcmNbeF0gKiAzICsgc3JjW3ggKyAxXSkgPj4gMjsKKyAgICAgICAgZHN0WzIgKiB4ICsgMl0gPSAoc3JjW3hdICsgMyAqIHNyY1t4ICsgMV0pID4+IDI7CisgICAgfQorICAgIGRzdFsyICogc3JjV2lkdGggLSAxXSA9IHNyY1tzcmNXaWR0aCAtIDFdOworfQorCisvKioKKyAqIEhlaWdodCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAyIGFuZCB3aWR0aCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAxNi4KKyAqIChJZiB0aGlzIGlzIGEgcHJvYmxlbSBmb3IgYW55b25lIHRoZW4gdGVsbCBtZSwgYW5kIEkgd2lsbCBmaXggaXQuKQorICogQ2hyb21pbmFuY2UgZGF0YSBpcyBvbmx5IHRha2VuIGZyb20gZXZlcnkgc2Vjb25kIGxpbmUsIG90aGVycyBhcmUgaWdub3JlZC4KKyAqIEZJWE1FOiBXcml0ZSBIUSB2ZXJzaW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdXl2eXRveXYxMl9jKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqeWRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdWRzdCwgdWludDhfdCAqdmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbHVtU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyb21TdHJpZGUsIGludCBzcmNTdHJpZGUpCit7CisgICAgaW50IHk7CisgICAgY29uc3QgaW50IGNocm9tV2lkdGggPSB3aWR0aCA+PiAxOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hyb21XaWR0aDsgaSsrKSB7CisgICAgICAgICAgICB1ZHN0W2ldICAgICAgICAgPSBzcmNbNCAqIGkgKyAwXTsKKyAgICAgICAgICAgIHlkc3RbMiAqIGkgKyAwXSA9IHNyY1s0ICogaSArIDFdOworICAgICAgICAgICAgdmRzdFtpXSAgICAgICAgID0gc3JjWzQgKiBpICsgMl07CisgICAgICAgICAgICB5ZHN0WzIgKiBpICsgMV0gPSBzcmNbNCAqIGkgKyAzXTsKKyAgICAgICAgfQorICAgICAgICB5ZHN0ICs9IGx1bVN0cmlkZTsKKyAgICAgICAgc3JjICArPSBzcmNTdHJpZGU7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNocm9tV2lkdGg7IGkrKykgeworICAgICAgICAgICAgeWRzdFsyICogaSArIDBdID0gc3JjWzQgKiBpICsgMV07CisgICAgICAgICAgICB5ZHN0WzIgKiBpICsgMV0gPSBzcmNbNCAqIGkgKyAzXTsKKyAgICAgICAgfQorICAgICAgICB1ZHN0ICs9IGNocm9tU3RyaWRlOworICAgICAgICB2ZHN0ICs9IGNocm9tU3RyaWRlOworICAgICAgICB5ZHN0ICs9IGx1bVN0cmlkZTsKKyAgICAgICAgc3JjICArPSBzcmNTdHJpZGU7CisgICAgfQorfQorCisvKioKKyAqIEhlaWdodCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAyIGFuZCB3aWR0aCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAyLgorICogKElmIHRoaXMgaXMgYSBwcm9ibGVtIGZvciBhbnlvbmUgdGhlbiB0ZWxsIG1lLCBhbmQgSSB3aWxsIGZpeCBpdC4pCisgKiBDaHJvbWluYW5jZSBkYXRhIGlzIG9ubHkgdGFrZW4gZnJvbSBldmVyeSBzZWNvbmQgbGluZSwKKyAqIG90aGVycyBhcmUgaWdub3JlZCBpbiB0aGUgQyB2ZXJzaW9uLgorICogRklYTUU6IFdyaXRlIEhRIHZlcnNpb24uCisgKi8KK3ZvaWQgZmZfcmdiMjR0b3l2MTJfYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKnlkc3QsIHVpbnQ4X3QgKnVkc3QsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdmRzdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbHVtU3RyaWRlLAorICAgICAgICAgICAgICAgICAgIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50MzJfdCAqcmdiMnl1dikKK3sKKyAgICBpbnQzMl90IHJ5ID0gcmdiMnl1dltSWV9JRFhdLCBneSA9IHJnYjJ5dXZbR1lfSURYXSwgYnkgPSByZ2IyeXV2W0JZX0lEWF07CisgICAgaW50MzJfdCBydSA9IHJnYjJ5dXZbUlVfSURYXSwgZ3UgPSByZ2IyeXV2W0dVX0lEWF0sIGJ1ID0gcmdiMnl1dltCVV9JRFhdOworICAgIGludDMyX3QgcnYgPSByZ2IyeXV2W1JWX0lEWF0sIGd2ID0gcmdiMnl1dltHVl9JRFhdLCBidiA9IHJnYjJ5dXZbQlZfSURYXTsKKyAgICBpbnQgeTsKKyAgICBjb25zdCBpbnQgY2hyb21XaWR0aCA9IHdpZHRoID4+IDE7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaHJvbVdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBiID0gc3JjWzYgKiBpICsgMF07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZyA9IHNyY1s2ICogaSArIDFdOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHIgPSBzcmNbNiAqIGkgKyAyXTsKKworICAgICAgICAgICAgdW5zaWduZWQgaW50IFkgPSAoKHJ5ICogciArIGd5ICogZyArIGJ5ICogYikgPj4gUkdCMllVVl9TSElGVCkgKyAgMTY7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgViA9ICgocnYgKiByICsgZ3YgKiBnICsgYnYgKiBiKSA+PiBSR0IyWVVWX1NISUZUKSArIDEyODsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBVID0gKChydSAqIHIgKyBndSAqIGcgKyBidSAqIGIpID4+IFJHQjJZVVZfU0hJRlQpICsgMTI4OworCisgICAgICAgICAgICB1ZHN0W2ldICAgICA9IFU7CisgICAgICAgICAgICB2ZHN0W2ldICAgICA9IFY7CisgICAgICAgICAgICB5ZHN0WzIgKiBpXSA9IFk7CisKKyAgICAgICAgICAgIGIgPSBzcmNbNiAqIGkgKyAzXTsKKyAgICAgICAgICAgIGcgPSBzcmNbNiAqIGkgKyA0XTsKKyAgICAgICAgICAgIHIgPSBzcmNbNiAqIGkgKyA1XTsKKworICAgICAgICAgICAgWSA9ICgocnkgKiByICsgZ3kgKiBnICsgYnkgKiBiKSA+PiBSR0IyWVVWX1NISUZUKSArIDE2OworICAgICAgICAgICAgeWRzdFsyICogaSArIDFdID0gWTsKKyAgICAgICAgfQorICAgICAgICB5ZHN0ICs9IGx1bVN0cmlkZTsKKyAgICAgICAgc3JjICArPSBzcmNTdHJpZGU7CisKKyAgICAgICAgaWYgKHkrMSA9PSBoZWlnaHQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hyb21XaWR0aDsgaSsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYiA9IHNyY1s2ICogaSArIDBdOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGcgPSBzcmNbNiAqIGkgKyAxXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCByID0gc3JjWzYgKiBpICsgMl07CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBZID0gKChyeSAqIHIgKyBneSAqIGcgKyBieSAqIGIpID4+IFJHQjJZVVZfU0hJRlQpICsgMTY7CisKKyAgICAgICAgICAgIHlkc3RbMiAqIGldID0gWTsKKworICAgICAgICAgICAgYiA9IHNyY1s2ICogaSArIDNdOworICAgICAgICAgICAgZyA9IHNyY1s2ICogaSArIDRdOworICAgICAgICAgICAgciA9IHNyY1s2ICogaSArIDVdOworCisgICAgICAgICAgICBZID0gKChyeSAqIHIgKyBneSAqIGcgKyBieSAqIGIpID4+IFJHQjJZVVZfU0hJRlQpICsgMTY7CisgICAgICAgICAgICB5ZHN0WzIgKiBpICsgMV0gPSBZOworICAgICAgICB9CisgICAgICAgIHVkc3QgKz0gY2hyb21TdHJpZGU7CisgICAgICAgIHZkc3QgKz0gY2hyb21TdHJpZGU7CisgICAgICAgIHlkc3QgKz0gbHVtU3RyaWRlOworICAgICAgICBzcmMgICs9IHNyY1N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGludGVybGVhdmVCeXRlc19jKGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjMVN0cmlkZSwgaW50IHNyYzJTdHJpZGUsIGludCBkc3RTdHJpZGUpCit7CisgICAgaW50IGg7CisKKyAgICBmb3IgKGggPSAwOyBoIDwgaGVpZ2h0OyBoKyspIHsKKyAgICAgICAgaW50IHc7CisgICAgICAgIGZvciAodyA9IDA7IHcgPCB3aWR0aDsgdysrKSB7CisgICAgICAgICAgICBkZXN0WzIgKiB3ICsgMF0gPSBzcmMxW3ddOworICAgICAgICAgICAgZGVzdFsyICogdyArIDFdID0gc3JjMlt3XTsKKyAgICAgICAgfQorICAgICAgICBkZXN0ICs9IGRzdFN0cmlkZTsKKyAgICAgICAgc3JjMSArPSBzcmMxU3RyaWRlOworICAgICAgICBzcmMyICs9IHNyYzJTdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWludGVybGVhdmVCeXRlc19jKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0MSwgdWludDhfdCAqZHN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3JjU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0MVN0cmlkZSwgaW50IGRzdDJTdHJpZGUpCit7CisgICAgaW50IGg7CisKKyAgICBmb3IgKGggPSAwOyBoIDwgaGVpZ2h0OyBoKyspIHsKKyAgICAgICAgaW50IHc7CisgICAgICAgIGZvciAodyA9IDA7IHcgPCB3aWR0aDsgdysrKSB7CisgICAgICAgICAgICBkc3QxW3ddID0gc3JjWzIgKiB3ICsgMF07CisgICAgICAgICAgICBkc3QyW3ddID0gc3JjWzIgKiB3ICsgMV07CisgICAgICAgIH0KKyAgICAgICAgc3JjICArPSBzcmNTdHJpZGU7CisgICAgICAgIGRzdDEgKz0gZHN0MVN0cmlkZTsKKyAgICAgICAgZHN0MiArPSBkc3QyU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHZ1OV90b192dTEyX2MoY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdDEsIHVpbnQ4X3QgKmRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlMSwgaW50IHNyY1N0cmlkZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlMSwgaW50IGRzdFN0cmlkZTIpCit7CisgICAgaW50IHgsIHk7CisgICAgaW50IHcgPSB3aWR0aCAgLyAyOworICAgIGludCBoID0gaGVpZ2h0IC8gMjsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqczEgPSBzcmMxICsgc3JjU3RyaWRlMSAqICh5ID4+IDEpOworICAgICAgICB1aW50OF90ICpkICAgICAgICA9IGRzdDEgKyBkc3RTdHJpZGUxICogIHk7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICBkWzIgKiB4XSA9IGRbMiAqIHggKyAxXSA9IHMxW3hdOworICAgIH0KKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnMyID0gc3JjMiArIHNyY1N0cmlkZTIgKiAoeSA+PiAxKTsKKyAgICAgICAgdWludDhfdCAqZCAgICAgICAgPSBkc3QyICsgZHN0U3RyaWRlMiAqICB5OworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgZFsyICogeF0gPSBkWzIgKiB4ICsgMV0gPSBzMlt4XTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB5dnU5X3RvX3l1eTJfYyhjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZTEsIGludCBzcmNTdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGUzLCBpbnQgZHN0U3RyaWRlKQoreworICAgIGludCB4LCB5OworICAgIGludCB3ID0gd2lkdGggLyAyOworICAgIGludCBoID0gaGVpZ2h0OworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBjb25zdCB1aW50OF90ICp5cCA9IHNyYzEgKyBzcmNTdHJpZGUxICogIHk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnVwID0gc3JjMiArIHNyY1N0cmlkZTIgKiAoeSA+PiAyKTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdnAgPSBzcmMzICsgc3JjU3RyaWRlMyAqICh5ID4+IDIpOworICAgICAgICB1aW50OF90ICpkICAgICAgICA9IGRzdCAgKyBkc3RTdHJpZGUgICogIHk7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB4MiA9IHggPDwgMjsKKyAgICAgICAgICAgIGRbOCAqIHggKyAwXSA9IHlwW3gyXTsKKyAgICAgICAgICAgIGRbOCAqIHggKyAxXSA9IHVwW3hdOworICAgICAgICAgICAgZFs4ICogeCArIDJdID0geXBbeDIgKyAxXTsKKyAgICAgICAgICAgIGRbOCAqIHggKyAzXSA9IHZwW3hdOworICAgICAgICAgICAgZFs4ICogeCArIDRdID0geXBbeDIgKyAyXTsKKyAgICAgICAgICAgIGRbOCAqIHggKyA1XSA9IHVwW3hdOworICAgICAgICAgICAgZFs4ICogeCArIDZdID0geXBbeDIgKyAzXTsKKyAgICAgICAgICAgIGRbOCAqIHggKyA3XSA9IHZwW3hdOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBleHRyYWN0X2V2ZW5fYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IGNvdW50KQoreworICAgIGRzdCAgICs9ICBjb3VudDsKKyAgICBzcmMgICArPSAgY291bnQgKiAyOworICAgIGNvdW50ICA9IC1jb3VudDsKKyAgICB3aGlsZSAoY291bnQgPCAwKSB7CisgICAgICAgIGRzdFtjb3VudF0gPSBzcmNbMiAqIGNvdW50XTsKKyAgICAgICAgY291bnQrKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGV4dHJhY3RfZXZlbjJfYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdDAsIHVpbnQ4X3QgKmRzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KQoreworICAgIGRzdDAgICs9ICBjb3VudDsKKyAgICBkc3QxICArPSAgY291bnQ7CisgICAgc3JjICAgKz0gIGNvdW50ICogNDsKKyAgICBjb3VudCAgPSAtY291bnQ7CisgICAgd2hpbGUgKGNvdW50IDwgMCkgeworICAgICAgICBkc3QwW2NvdW50XSA9IHNyY1s0ICogY291bnQgKyAwXTsKKyAgICAgICAgZHN0MVtjb3VudF0gPSBzcmNbNCAqIGNvdW50ICsgMl07CisgICAgICAgIGNvdW50Kys7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBleHRyYWN0X2V2ZW4yYXZnX2MoY29uc3QgdWludDhfdCAqc3JjMCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QwLCB1aW50OF90ICpkc3QxLCBpbnQgY291bnQpCit7CisgICAgZHN0MCAgKz0gIGNvdW50OworICAgIGRzdDEgICs9ICBjb3VudDsKKyAgICBzcmMwICArPSAgY291bnQgKiA0OworICAgIHNyYzEgICs9ICBjb3VudCAqIDQ7CisgICAgY291bnQgID0gLWNvdW50OworICAgIHdoaWxlIChjb3VudCA8IDApIHsKKyAgICAgICAgZHN0MFtjb3VudF0gPSAoc3JjMFs0ICogY291bnQgKyAwXSArIHNyYzFbNCAqIGNvdW50ICsgMF0pID4+IDE7CisgICAgICAgIGRzdDFbY291bnRdID0gKHNyYzBbNCAqIGNvdW50ICsgMl0gKyBzcmMxWzQgKiBjb3VudCArIDJdKSA+PiAxOworICAgICAgICBjb3VudCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZXh0cmFjdF9vZGQyX2MoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QwLCB1aW50OF90ICpkc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KQoreworICAgIGRzdDAgICs9ICBjb3VudDsKKyAgICBkc3QxICArPSAgY291bnQ7CisgICAgc3JjICAgKz0gIGNvdW50ICogNDsKKyAgICBjb3VudCAgPSAtY291bnQ7CisgICAgc3JjKys7CisgICAgd2hpbGUgKGNvdW50IDwgMCkgeworICAgICAgICBkc3QwW2NvdW50XSA9IHNyY1s0ICogY291bnQgKyAwXTsKKyAgICAgICAgZHN0MVtjb3VudF0gPSBzcmNbNCAqIGNvdW50ICsgMl07CisgICAgICAgIGNvdW50Kys7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBleHRyYWN0X29kZDJhdmdfYyhjb25zdCB1aW50OF90ICpzcmMwLCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0MCwgdWludDhfdCAqZHN0MSwgaW50IGNvdW50KQoreworICAgIGRzdDAgICs9ICBjb3VudDsKKyAgICBkc3QxICArPSAgY291bnQ7CisgICAgc3JjMCAgKz0gIGNvdW50ICogNDsKKyAgICBzcmMxICArPSAgY291bnQgKiA0OworICAgIGNvdW50ICA9IC1jb3VudDsKKyAgICBzcmMwKys7CisgICAgc3JjMSsrOworICAgIHdoaWxlIChjb3VudCA8IDApIHsKKyAgICAgICAgZHN0MFtjb3VudF0gPSAoc3JjMFs0ICogY291bnQgKyAwXSArIHNyYzFbNCAqIGNvdW50ICsgMF0pID4+IDE7CisgICAgICAgIGRzdDFbY291bnRdID0gKHNyYzBbNCAqIGNvdW50ICsgMl0gKyBzcmMxWzQgKiBjb3VudCArIDJdKSA+PiAxOworICAgICAgICBjb3VudCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgeXV5dnRveXV2NDIwX2ModWludDhfdCAqeWRzdCwgdWludDhfdCAqdWRzdCwgdWludDhfdCAqdmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgc3JjU3RyaWRlKQoreworICAgIGludCB5OworICAgIGNvbnN0IGludCBjaHJvbVdpZHRoID0gRkZfQ0VJTF9SU0hJRlQod2lkdGgsIDEpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGV4dHJhY3RfZXZlbl9jKHNyYywgeWRzdCwgd2lkdGgpOworICAgICAgICBpZiAoeSAmIDEpIHsKKyAgICAgICAgICAgIGV4dHJhY3Rfb2RkMmF2Z19jKHNyYyAtIHNyY1N0cmlkZSwgc3JjLCB1ZHN0LCB2ZHN0LCBjaHJvbVdpZHRoKTsKKyAgICAgICAgICAgIHVkc3QgKz0gY2hyb21TdHJpZGU7CisgICAgICAgICAgICB2ZHN0ICs9IGNocm9tU3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgc3JjICArPSBzcmNTdHJpZGU7CisgICAgICAgIHlkc3QgKz0gbHVtU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgeXV5dnRveXV2NDIyX2ModWludDhfdCAqeWRzdCwgdWludDhfdCAqdWRzdCwgdWludDhfdCAqdmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgc3JjU3RyaWRlKQoreworICAgIGludCB5OworICAgIGNvbnN0IGludCBjaHJvbVdpZHRoID0gRkZfQ0VJTF9SU0hJRlQod2lkdGgsIDEpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGV4dHJhY3RfZXZlbl9jKHNyYywgeWRzdCwgd2lkdGgpOworICAgICAgICBleHRyYWN0X29kZDJfYyhzcmMsIHVkc3QsIHZkc3QsIGNocm9tV2lkdGgpOworCisgICAgICAgIHNyYyAgKz0gc3JjU3RyaWRlOworICAgICAgICB5ZHN0ICs9IGx1bVN0cmlkZTsKKyAgICAgICAgdWRzdCArPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgdmRzdCArPSBjaHJvbVN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHV5dnl0b3l1djQyMF9jKHVpbnQ4X3QgKnlkc3QsIHVpbnQ4X3QgKnVkc3QsIHVpbnQ4X3QgKnZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSkKK3sKKyAgICBpbnQgeTsKKyAgICBjb25zdCBpbnQgY2hyb21XaWR0aCA9IEZGX0NFSUxfUlNISUZUKHdpZHRoLCAxKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBleHRyYWN0X2V2ZW5fYyhzcmMgKyAxLCB5ZHN0LCB3aWR0aCk7CisgICAgICAgIGlmICh5ICYgMSkgeworICAgICAgICAgICAgZXh0cmFjdF9ldmVuMmF2Z19jKHNyYyAtIHNyY1N0cmlkZSwgc3JjLCB1ZHN0LCB2ZHN0LCBjaHJvbVdpZHRoKTsKKyAgICAgICAgICAgIHVkc3QgKz0gY2hyb21TdHJpZGU7CisgICAgICAgICAgICB2ZHN0ICs9IGNocm9tU3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgc3JjICArPSBzcmNTdHJpZGU7CisgICAgICAgIHlkc3QgKz0gbHVtU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdXl2eXRveXV2NDIyX2ModWludDhfdCAqeWRzdCwgdWludDhfdCAqdWRzdCwgdWludDhfdCAqdmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgc3JjU3RyaWRlKQoreworICAgIGludCB5OworICAgIGNvbnN0IGludCBjaHJvbVdpZHRoID0gRkZfQ0VJTF9SU0hJRlQod2lkdGgsIDEpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGV4dHJhY3RfZXZlbl9jKHNyYyArIDEsIHlkc3QsIHdpZHRoKTsKKyAgICAgICAgZXh0cmFjdF9ldmVuMl9jKHNyYywgdWRzdCwgdmRzdCwgY2hyb21XaWR0aCk7CisKKyAgICAgICAgc3JjICArPSBzcmNTdHJpZGU7CisgICAgICAgIHlkc3QgKz0gbHVtU3RyaWRlOworICAgICAgICB1ZHN0ICs9IGNocm9tU3RyaWRlOworICAgICAgICB2ZHN0ICs9IGNocm9tU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCByZ2IycmdiX2luaXRfYyh2b2lkKQoreworICAgIHJnYjE1dG8xNiAgICAgICAgICA9IHJnYjE1dG8xNl9jOworICAgIHJnYjE1dG9iZ3IyNCAgICAgICA9IHJnYjE1dG9iZ3IyNF9jOworICAgIHJnYjE1dG8zMiAgICAgICAgICA9IHJnYjE1dG8zMl9jOworICAgIHJnYjE2dG9iZ3IyNCAgICAgICA9IHJnYjE2dG9iZ3IyNF9jOworICAgIHJnYjE2dG8zMiAgICAgICAgICA9IHJnYjE2dG8zMl9jOworICAgIHJnYjE2dG8xNSAgICAgICAgICA9IHJnYjE2dG8xNV9jOworICAgIHJnYjI0dG9iZ3IxNiAgICAgICA9IHJnYjI0dG9iZ3IxNl9jOworICAgIHJnYjI0dG9iZ3IxNSAgICAgICA9IHJnYjI0dG9iZ3IxNV9jOworICAgIHJnYjI0dG9iZ3IzMiAgICAgICA9IHJnYjI0dG9iZ3IzMl9jOworICAgIHJnYjMydG8xNiAgICAgICAgICA9IHJnYjMydG8xNl9jOworICAgIHJnYjMydG8xNSAgICAgICAgICA9IHJnYjMydG8xNV9jOworICAgIHJnYjMydG9iZ3IyNCAgICAgICA9IHJnYjMydG9iZ3IyNF9jOworICAgIHJnYjI0dG8xNSAgICAgICAgICA9IHJnYjI0dG8xNV9jOworICAgIHJnYjI0dG8xNiAgICAgICAgICA9IHJnYjI0dG8xNl9jOworICAgIHJnYjI0dG9iZ3IyNCAgICAgICA9IHJnYjI0dG9iZ3IyNF9jOworICAgIHNodWZmbGVfYnl0ZXNfMjEwMyA9IHNodWZmbGVfYnl0ZXNfMjEwM19jOworICAgIHJnYjMydG9iZ3IxNiAgICAgICA9IHJnYjMydG9iZ3IxNl9jOworICAgIHJnYjMydG9iZ3IxNSAgICAgICA9IHJnYjMydG9iZ3IxNV9jOworICAgIHl2MTJ0b3l1eTIgICAgICAgICA9IHl2MTJ0b3l1eTJfYzsKKyAgICB5djEydG91eXZ5ICAgICAgICAgPSB5djEydG91eXZ5X2M7CisgICAgeXV2NDIycHRveXV5MiAgICAgID0geXV2NDIycHRveXV5Ml9jOworICAgIHl1djQyMnB0b3V5dnkgICAgICA9IHl1djQyMnB0b3V5dnlfYzsKKyAgICB5dXkydG95djEyICAgICAgICAgPSB5dXkydG95djEyX2M7CisgICAgcGxhbmFyMnggICAgICAgICAgID0gcGxhbmFyMnhfYzsKKyAgICBmZl9yZ2IyNHRveXYxMiAgICAgPSBmZl9yZ2IyNHRveXYxMl9jOworICAgIGludGVybGVhdmVCeXRlcyAgICA9IGludGVybGVhdmVCeXRlc19jOworICAgIGRlaW50ZXJsZWF2ZUJ5dGVzICA9IGRlaW50ZXJsZWF2ZUJ5dGVzX2M7CisgICAgdnU5X3RvX3Z1MTIgICAgICAgID0gdnU5X3RvX3Z1MTJfYzsKKyAgICB5dnU5X3RvX3l1eTIgICAgICAgPSB5dnU5X3RvX3l1eTJfYzsKKworICAgIHV5dnl0b3l1djQyMCAgICAgICA9IHV5dnl0b3l1djQyMF9jOworICAgIHV5dnl0b3l1djQyMiAgICAgICA9IHV5dnl0b3l1djQyMl9jOworICAgIHl1eXZ0b3l1djQyMCAgICAgICA9IHl1eXZ0b3l1djQyMF9jOworICAgIHl1eXZ0b3l1djQyMiAgICAgICA9IHl1eXZ0b3l1djQyMl9jOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUvc3dzY2FsZS10ZXN0LmMgYi9mZm1wZWcvbGlic3dzY2FsZS9zd3NjYWxlLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjFmZjViCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvc3dzY2FsZS10ZXN0LmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjdW5kZWYgSEFWRV9BVl9DT05GSUdfSAorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgInN3c2NhbGUuaCIKKworLyogSEFDSyBEdXBsaWNhdGVkIGZyb20gc3dzY2FsZV9pbnRlcm5hbC5oLgorICogU2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBhIGNsZWFuZXIgcGl4ZWwgZm9ybWF0IHN5c3RlbSBleGlzdHMuICovCisjZGVmaW5lIGlzR3JheSh4KSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCh4KSA9PSBBVl9QSVhfRk1UX0dSQVk4ICAgICAgIHx8ICAgICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX1lBOCAgICAgICAgIHx8ICAgICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0dSQVkxNkJFICAgIHx8ICAgICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0dSQVkxNkxFICAgIHx8ICAgICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX1lBMTZCRSAgICAgIHx8ICAgICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX1lBMTZMRSkKKyNkZWZpbmUgaGFzQ2hyb21hKHgpICAgICAgICAgICAgICAgICAgIFwKKyAgICAoIShpc0dyYXkoeCkgICAgICAgICAgICAgICAgfHwgICAgIFwKKyAgICAgICAoeCkgPT0gQVZfUElYX0ZNVF9NT05PQkxBQ0sgfHwgICAgIFwKKyAgICAgICAoeCkgPT0gQVZfUElYX0ZNVF9NT05PV0hJVEUpKQorI2RlZmluZSBpc0FMUEhBKHgpICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoeCkgPT0gQVZfUElYX0ZNVF9CR1IzMiAgIHx8ICAgICAgICAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9CR1IzMl8xIHx8ICAgICAgICAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0IzMiAgIHx8ICAgICAgICAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0IzMl8xIHx8ICAgICAgICAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9ZVVZBNDIwUCkKKworc3RhdGljIHVpbnQ2NF90IGdldFNTRChjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZTIsIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICB1aW50NjRfdCBzc2QgPSAwOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBpbnQgZCA9IHNyYzFbeCArIHkgKiBzdHJpZGUxXSAtIHNyYzJbeCArIHkgKiBzdHJpZGUyXTsKKyAgICAgICAgICAgIHNzZCArPSBkICogZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3NkOworfQorCitzdHJ1Y3QgUmVzdWx0cyB7CisgICAgdWludDY0X3Qgc3NkWTsKKyAgICB1aW50NjRfdCBzc2RVOworICAgIHVpbnQ2NF90IHNzZFY7CisgICAgdWludDY0X3Qgc3NkQTsKKyAgICB1aW50MzJfdCBjcmM7Cit9OworCisvLyB0ZXN0IGJ5IHJlZiAtPiBzcmMgLT4gZHN0IC0+IG91dCAmIGNvbXBhcmUgb3V0IGFnYWluc3QgcmVmCisvLyByZWYgJiBvdXQgYXJlIFlWMTIKK3N0YXRpYyBpbnQgZG9UZXN0KHVpbnQ4X3QgKnJlZls0XSwgaW50IHJlZlN0cmlkZVs0XSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY0Zvcm1hdCwgZW51bSBBVlBpeGVsRm9ybWF0IGRzdEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgIGludCBzcmNXLCBpbnQgc3JjSCwgaW50IGRzdFcsIGludCBkc3RILCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgUmVzdWx0cyAqcikKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2NfeXV2YTQyMHAgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KEFWX1BJWF9GTVRfWVVWQTQyMFApOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzY19zcmMgICAgICA9IGF2X3BpeF9mbXRfZGVzY19nZXQoc3JjRm9ybWF0KTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2NfZHN0ICAgICAgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGRzdEZvcm1hdCk7CisgICAgc3RhdGljIGVudW0gQVZQaXhlbEZvcm1hdCBjdXJfc3JjRm9ybWF0OworICAgIHN0YXRpYyBpbnQgY3VyX3NyY1csIGN1cl9zcmNIOworICAgIHN0YXRpYyB1aW50OF90ICpzcmNbNF07CisgICAgc3RhdGljIGludCBzcmNTdHJpZGVbNF07CisgICAgdWludDhfdCAqZHN0WzRdID0geyAwIH07CisgICAgdWludDhfdCAqb3V0WzRdID0geyAwIH07CisgICAgaW50IGRzdFN0cmlkZVs0XSA9IHswfTsKKyAgICBpbnQgaTsKKyAgICB1aW50NjRfdCBzc2RZLCBzc2RVID0gMCwgc3NkViA9IDAsIHNzZEEgPSAwOworICAgIHN0cnVjdCBTd3NDb250ZXh0ICpkc3RDb250ZXh0ID0gTlVMTCwgKm91dENvbnRleHQgPSBOVUxMOworICAgIHVpbnQzMl90IGNyYyA9IDA7CisgICAgaW50IHJlcyAgICAgID0gMDsKKworICAgIGlmIChjdXJfc3JjRm9ybWF0ICE9IHNyY0Zvcm1hdCB8fCBjdXJfc3JjVyAhPSBzcmNXIHx8IGN1cl9zcmNIICE9IHNyY0gpIHsKKyAgICAgICAgc3RydWN0IFN3c0NvbnRleHQgKnNyY0NvbnRleHQgPSBOVUxMOworICAgICAgICBpbnQgcDsKKworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgNDsgcCsrKQorICAgICAgICAgICAgYXZfZnJlZXAoJnNyY1twXSk7CisKKyAgICAgICAgYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMoc3JjU3RyaWRlLCBzcmNGb3JtYXQsIHNyY1cpOworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgNDsgcCsrKSB7CisgICAgICAgICAgICBzcmNTdHJpZGVbcF0gPSBGRkFMSUdOKHNyY1N0cmlkZVtwXSwgMTYpOworICAgICAgICAgICAgaWYgKHNyY1N0cmlkZVtwXSkKKyAgICAgICAgICAgICAgICBzcmNbcF0gPSBhdl9tYWxsb2N6KHNyY1N0cmlkZVtwXSAqIHNyY0ggKyAxNik7CisgICAgICAgICAgICBpZiAoc3JjU3RyaWRlW3BdICYmICFzcmNbcF0pIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoIk1hbGxvYyIpOworICAgICAgICAgICAgICAgIHJlcyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNyY0NvbnRleHQgPSBzd3NfZ2V0Q29udGV4dCh3LCBoLCBBVl9QSVhfRk1UX1lVVkE0MjBQLCBzcmNXLCBzcmNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRm9ybWF0LCBTV1NfQklMSU5FQVIsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoIXNyY0NvbnRleHQpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCAlcyAtLS0+ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBkZXNjX3l1dmE0MjBwLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBkZXNjX3NyYy0+bmFtZSk7CisgICAgICAgICAgICByZXMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIHN3c19zY2FsZShzcmNDb250ZXh0LCAoY29uc3QgdWludDhfdCAqIGNvbnN0KilyZWYsIHJlZlN0cmlkZSwgMCwgaCwgc3JjLCBzcmNTdHJpZGUpOworICAgICAgICBzd3NfZnJlZUNvbnRleHQoc3JjQ29udGV4dCk7CisKKyAgICAgICAgY3VyX3NyY0Zvcm1hdCA9IHNyY0Zvcm1hdDsKKyAgICAgICAgY3VyX3NyY1cgICAgICA9IHNyY1c7CisgICAgICAgIGN1cl9zcmNIICAgICAgPSBzcmNIOworICAgIH0KKworICAgIGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKGRzdFN0cmlkZSwgZHN0Rm9ybWF0LCBkc3RXKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIC8qIEltYWdlIGJ1ZmZlcnMgcGFzc2VkIGludG8gbGlic3dzY2FsZSBjYW4gYmUgYWxsb2NhdGVkIGFueSB3YXkgeW91CisgICAgICAgICAqIHByZWZlciwgYXMgbG9uZyBhcyB0aGV5J3JlIGFsaWduZWQgZW5vdWdoIGZvciB0aGUgYXJjaGl0ZWN0dXJlLCBhbmQKKyAgICAgICAgICogdGhleSdyZSBmcmVlZCBhcHByb3ByaWF0ZWx5IChzdWNoIGFzIHVzaW5nIGF2X2ZyZWUgZm9yIGJ1ZmZlcnMKKyAgICAgICAgICogYWxsb2NhdGVkIHdpdGggYXZfbWFsbG9jKS4gKi8KKyAgICAgICAgLyogQW4gZXh0cmEgMTYgYnl0ZXMgaXMgYmVpbmcgYWxsb2NhdGVkIGJlY2F1c2Ugc29tZSBzY2FsZXJzIG1heSB3cml0ZQorICAgICAgICAgKiBvdXQgb2YgYm91bmRzLiAqLworICAgICAgICBkc3RTdHJpZGVbaV0gPSBGRkFMSUdOKGRzdFN0cmlkZVtpXSwgMTYpOworICAgICAgICBpZiAoZHN0U3RyaWRlW2ldKQorICAgICAgICAgICAgZHN0W2ldID0gYXZfbWFsbG9jeihkc3RTdHJpZGVbaV0gKiBkc3RIICsgMTYpOworICAgICAgICBpZiAoZHN0U3RyaWRlW2ldICYmICFkc3RbaV0pIHsKKyAgICAgICAgICAgIHBlcnJvcigiTWFsbG9jIik7CisgICAgICAgICAgICByZXMgPSAtMTsKKworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkc3RDb250ZXh0ID0gc3dzX2dldENvbnRleHQoc3JjVywgc3JjSCwgc3JjRm9ybWF0LCBkc3RXLCBkc3RILCBkc3RGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoIWRzdENvbnRleHQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZ2V0ICVzIC0tLT4gJXNcbiIsCisgICAgICAgICAgICAgICAgZGVzY19zcmMtPm5hbWUsIGRlc2NfZHN0LT5uYW1lKTsKKyAgICAgICAgcmVzID0gLTE7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIHByaW50ZigiICVzICVkeCVkIC0+ICVzICUzZHglM2QgZmxhZ3M9JTJkIiwKKyAgICAgICAgICAgZGVzY19zcmMtPm5hbWUsIHNyY1csIHNyY0gsCisgICAgICAgICAgIGRlc2NfZHN0LT5uYW1lLCBkc3RXLCBkc3RILAorICAgICAgICAgICBmbGFncyk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICBzd3Nfc2NhbGUoZHN0Q29udGV4dCwgKGNvbnN0IHVpbnQ4X3QgKiBjb25zdCopc3JjLCBzcmNTdHJpZGUsIDAsIHNyY0gsIGRzdCwgZHN0U3RyaWRlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIGRzdFN0cmlkZVtpXTsgaSsrKQorICAgICAgICBjcmMgPSBhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMzJfSUVFRSksIGNyYywgZHN0W2ldLAorICAgICAgICAgICAgICAgICAgICAgZHN0U3RyaWRlW2ldICogZHN0SCk7CisKKyAgICBpZiAociAmJiBjcmMgPT0gci0+Y3JjKSB7CisgICAgICAgIHNzZFkgPSByLT5zc2RZOworICAgICAgICBzc2RVID0gci0+c3NkVTsKKyAgICAgICAgc3NkViA9IHItPnNzZFY7CisgICAgICAgIHNzZEEgPSByLT5zc2RBOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIHJlZlN0cmlkZVtpXSA9IEZGQUxJR04ocmVmU3RyaWRlW2ldLCAxNik7CisgICAgICAgICAgICBpZiAocmVmU3RyaWRlW2ldKQorICAgICAgICAgICAgICAgIG91dFtpXSA9IGF2X21hbGxvY3oocmVmU3RyaWRlW2ldICogaCk7CisgICAgICAgICAgICBpZiAocmVmU3RyaWRlW2ldICYmICFvdXRbaV0pIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoIk1hbGxvYyIpOworICAgICAgICAgICAgICAgIHJlcyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dENvbnRleHQgPSBzd3NfZ2V0Q29udGV4dChkc3RXLCBkc3RILCBkc3RGb3JtYXQsIHcsIGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBTV1NfQklMSU5FQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKCFvdXRDb250ZXh0KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBnZXQgJXMgLS0tPiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgZGVzY19kc3QtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIGRlc2NfeXV2YTQyMHAtPm5hbWUpOworICAgICAgICAgICAgcmVzID0gLTE7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBzd3Nfc2NhbGUob3V0Q29udGV4dCwgKGNvbnN0IHVpbnQ4X3QgKiBjb25zdCopZHN0LCBkc3RTdHJpZGUsIDAsIGRzdEgsIG91dCwgcmVmU3RyaWRlKTsKKworICAgICAgICBzc2RZID0gZ2V0U1NEKHJlZlswXSwgb3V0WzBdLCByZWZTdHJpZGVbMF0sIHJlZlN0cmlkZVswXSwgdywgaCk7CisgICAgICAgIGlmIChoYXNDaHJvbWEoc3JjRm9ybWF0KSAmJiBoYXNDaHJvbWEoZHN0Rm9ybWF0KSkgeworICAgICAgICAgICAgLy9GSVhNRSBjaGVjayB0aGF0IG91dHB1dCBpcyByZWFsbHkgZ3JheQorICAgICAgICAgICAgc3NkVSA9IGdldFNTRChyZWZbMV0sIG91dFsxXSwgcmVmU3RyaWRlWzFdLCByZWZTdHJpZGVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICh3ICsgMSkgPj4gMSwgKGggKyAxKSA+PiAxKTsKKyAgICAgICAgICAgIHNzZFYgPSBnZXRTU0QocmVmWzJdLCBvdXRbMl0sIHJlZlN0cmlkZVsyXSwgcmVmU3RyaWRlWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDEpID4+IDEsIChoICsgMSkgPj4gMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQUxQSEEoc3JjRm9ybWF0KSAmJiBpc0FMUEhBKGRzdEZvcm1hdCkpCisgICAgICAgICAgICBzc2RBID0gZ2V0U1NEKHJlZlszXSwgb3V0WzNdLCByZWZTdHJpZGVbM10sIHJlZlN0cmlkZVszXSwgdywgaCk7CisKKyAgICAgICAgc3NkWSAvPSB3ICogaDsKKyAgICAgICAgc3NkVSAvPSB3ICogaCAvIDQ7CisgICAgICAgIHNzZFYgLz0gdyAqIGggLyA0OworICAgICAgICBzc2RBIC89IHcgKiBoOworCisgICAgICAgIHN3c19mcmVlQ29udGV4dChvdXRDb250ZXh0KTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgaWYgKHJlZlN0cmlkZVtpXSkKKyAgICAgICAgICAgICAgICBhdl9mcmVlKG91dFtpXSk7CisgICAgfQorCisgICAgcHJpbnRmKCIgQ1JDPSUwOHggU1NEPSU1IlBSSWQ2NCAiLCU1IlBSSWQ2NCAiLCU1IlBSSWQ2NCAiLCU1IlBSSWQ2NCAiXG4iLAorICAgICAgICAgICBjcmMsIHNzZFksIHNzZFUsIHNzZFYsIHNzZEEpOworCitlbmQ6CisgICAgc3dzX2ZyZWVDb250ZXh0KGRzdENvbnRleHQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgaWYgKGRzdFN0cmlkZVtpXSkKKyAgICAgICAgICAgIGF2X2ZyZWUoZHN0W2ldKTsKKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHNlbGZUZXN0KHVpbnQ4X3QgKnJlZls0XSwgaW50IHJlZlN0cmlkZVs0XSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY0Zvcm1hdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXRfaW4pCit7CisgICAgY29uc3QgaW50IGZsYWdzW10gPSB7IFNXU19GQVNUX0JJTElORUFSLCBTV1NfQklMSU5FQVIsIFNXU19CSUNVQklDLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTV1NfWCwgU1dTX1BPSU5ULCBTV1NfQVJFQSwgMCB9OworICAgIGNvbnN0IGludCBzcmNXICAgPSB3OworICAgIGNvbnN0IGludCBzcmNIICAgPSBoOworICAgIGNvbnN0IGludCBkc3RXW10gPSB7IHNyY1cgLSBzcmNXIC8gMywgc3JjVywgc3JjVyArIHNyY1cgLyAzLCAwIH07CisgICAgY29uc3QgaW50IGRzdEhbXSA9IHsgc3JjSCAtIHNyY0ggLyAzLCBzcmNILCBzcmNIICsgc3JjSCAvIDMsIDAgfTsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjRm9ybWF0LCBkc3RGb3JtYXQ7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjX3NyYywgKmRlc2NfZHN0OworCisgICAgZm9yIChzcmNGb3JtYXQgPSBzcmNGb3JtYXRfaW4gIT0gQVZfUElYX0ZNVF9OT05FID8gc3JjRm9ybWF0X2luIDogMDsKKyAgICAgICAgIHNyY0Zvcm1hdCA8IEFWX1BJWF9GTVRfTkI7IHNyY0Zvcm1hdCsrKSB7CisgICAgICAgIGlmICghc3dzX2lzU3VwcG9ydGVkSW5wdXQoc3JjRm9ybWF0KSB8fAorICAgICAgICAgICAgIXN3c19pc1N1cHBvcnRlZE91dHB1dChzcmNGb3JtYXQpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZGVzY19zcmMgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHNyY0Zvcm1hdCk7CisKKyAgICAgICAgZm9yIChkc3RGb3JtYXQgPSBkc3RGb3JtYXRfaW4gIT0gQVZfUElYX0ZNVF9OT05FID8gZHN0Rm9ybWF0X2luIDogMDsKKyAgICAgICAgICAgICBkc3RGb3JtYXQgPCBBVl9QSVhfRk1UX05COyBkc3RGb3JtYXQrKykgeworICAgICAgICAgICAgaW50IGksIGosIGs7CisgICAgICAgICAgICBpbnQgcmVzID0gMDsKKworICAgICAgICAgICAgaWYgKCFzd3NfaXNTdXBwb3J0ZWRJbnB1dChkc3RGb3JtYXQpIHx8CisgICAgICAgICAgICAgICAgIXN3c19pc1N1cHBvcnRlZE91dHB1dChkc3RGb3JtYXQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBkZXNjX2RzdCA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZHN0Rm9ybWF0KTsKKworICAgICAgICAgICAgcHJpbnRmKCIlcyAtPiAlc1xuIiwgZGVzY19zcmMtPm5hbWUsIGRlc2NfZHN0LT5uYW1lKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBmbGFnc1trXSAmJiAhcmVzOyBrKyspCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgZHN0V1tpXSAmJiAhcmVzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGRzdEhbal0gJiYgIXJlczsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gZG9UZXN0KHJlZiwgcmVmU3RyaWRlLCB3LCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1csIHNyY0gsIGRzdFdbaV0sIGRzdEhbal0sIGZsYWdzW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgaWYgKGRzdEZvcm1hdF9pbiAhPSBBVl9QSVhfRk1UX05PTkUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY0Zvcm1hdF9pbiAhPSBBVl9QSVhfRk1UX05PTkUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmlsZVRlc3QodWludDhfdCAqcmVmWzRdLCBpbnQgcmVmU3RyaWRlWzRdLCBpbnQgdywgaW50IGgsIEZJTEUgKmZwLAorICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjRm9ybWF0X2luLAorICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0X2luKQoreworICAgIGNoYXIgYnVmWzI1Nl07CisKKyAgICB3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisgICAgICAgIHN0cnVjdCBSZXN1bHRzIHI7CisgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXQ7CisgICAgICAgIGNoYXIgc3JjU3RyWzEyXTsKKyAgICAgICAgaW50IHNyY1csIHNyY0g7CisgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXQ7CisgICAgICAgIGNoYXIgZHN0U3RyWzEyXTsKKyAgICAgICAgaW50IGRzdFcsIGRzdEg7CisgICAgICAgIGludCBmbGFnczsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICByZXQgPSBzc2NhbmYoYnVmLAorICAgICAgICAgICAgICAgICAgICAgIiAlMTJzICVkeCVkIC0+ICUxMnMgJWR4JWQgZmxhZ3M9JWQgQ1JDPSV4IgorICAgICAgICAgICAgICAgICAgICAgIiBTU0Q9JSJTQ05kNjQgIiwgJSJTQ05kNjQgIiwgJSJTQ05kNjQgIiwgJSJTQ05kNjQgIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHNyY1N0ciwgJnNyY1csICZzcmNILCBkc3RTdHIsICZkc3RXLCAmZHN0SCwKKyAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJnIuY3JjLCAmci5zc2RZLCAmci5zc2RVLCAmci5zc2RWLCAmci5zc2RBKTsKKyAgICAgICAgaWYgKHJldCAhPSAxMikgeworICAgICAgICAgICAgc3JjU3RyWzBdID0gZHN0U3RyWzBdID0gMDsKKyAgICAgICAgICAgIHJldCAgICAgICA9IHNzY2FuZihidWYsICIlMTJzIC0+ICUxMnNcbiIsIHNyY1N0ciwgZHN0U3RyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY0Zvcm1hdCA9IGF2X2dldF9waXhfZm10KHNyY1N0cik7CisgICAgICAgIGRzdEZvcm1hdCA9IGF2X2dldF9waXhfZm10KGRzdFN0cik7CisKKyAgICAgICAgaWYgKHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX05PTkUgfHwgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSB8fAorICAgICAgICAgICAgc3JjVyA+IDgxOTJVIHx8IHNyY0ggPiA4MTkyVSB8fCBkc3RXID4gODE5MlUgfHwgZHN0SCA+IDgxOTJVKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGZvcm1lZCBpbnB1dCBmaWxlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHNyY0Zvcm1hdF9pbiAhPSBBVl9QSVhfRk1UX05PTkUgJiYgc3JjRm9ybWF0X2luICE9IHNyY0Zvcm1hdCkgfHwKKyAgICAgICAgICAgIChkc3RGb3JtYXRfaW4gIT0gQVZfUElYX0ZNVF9OT05FICYmIGRzdEZvcm1hdF9pbiAhPSBkc3RGb3JtYXQpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChyZXQgIT0gMTIpIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMiLCBidWYpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBkb1Rlc3QocmVmLCByZWZTdHJpZGUsIHcsIGgsCisgICAgICAgICAgICAgICBzcmNGb3JtYXQsIGRzdEZvcm1hdCwKKyAgICAgICAgICAgICAgIHNyY1csIHNyY0gsIGRzdFcsIGRzdEgsIGZsYWdzLAorICAgICAgICAgICAgICAgJnIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFcgOTYKKyNkZWZpbmUgSCA5NgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY0Zvcm1hdCA9IEFWX1BJWF9GTVRfTk9ORTsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0ID0gQVZfUElYX0ZNVF9OT05FOworICAgIHVpbnQ4X3QgKnJnYl9kYXRhICAgPSBhdl9tYWxsb2MoVyAqIEggKiA0KTsKKyAgICBjb25zdCB1aW50OF90ICogY29uc3QgcmdiX3NyY1s0XSA9IHsgcmdiX2RhdGEsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgICBpbnQgcmdiX3N0cmlkZVs0XSAgID0geyA0ICogVywgMCwgMCwgMCB9OworICAgIHVpbnQ4X3QgKmRhdGEgICAgICAgPSBhdl9tYWxsb2MoNCAqIFcgKiBIKTsKKyAgICB1aW50OF90ICpzcmNbNF0gICAgID0geyBkYXRhLCBkYXRhICsgVyAqIEgsIGRhdGEgKyBXICogSCAqIDIsIGRhdGEgKyBXICogSCAqIDMgfTsKKyAgICBpbnQgc3RyaWRlWzRdICAgICAgID0geyBXLCBXLCBXLCBXIH07CisgICAgaW50IHgsIHk7CisgICAgc3RydWN0IFN3c0NvbnRleHQgKnN3czsKKyAgICBBVkxGRyByYW5kOworICAgIGludCByZXMgPSAtMTsKKyAgICBpbnQgaTsKKyAgICBGSUxFICpmcCA9IE5VTEw7CisKKyAgICBpZiAoIXJnYl9kYXRhIHx8ICFkYXRhKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSArPSAyKSB7CisgICAgICAgIGlmIChhcmd2W2ldWzBdICE9ICctJyB8fCBpICsgMSA9PSBhcmdjKQorICAgICAgICAgICAgZ290byBiYWRfb3B0aW9uOworICAgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXJlZiIpKSB7CisgICAgICAgICAgICBmcCA9IGZvcGVuKGFyZ3ZbaSArIDFdLCAiciIpOworICAgICAgICAgICAgaWYgKCFmcCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IG9wZW4gJyVzJ1xuIiwgYXJndltpICsgMV0pOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXNyYyIpKSB7CisgICAgICAgICAgICBzcmNGb3JtYXQgPSBhdl9nZXRfcGl4X2ZtdChhcmd2W2kgKyAxXSk7CisgICAgICAgICAgICBpZiAoc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBwaXhlbCBmb3JtYXQgJXNcbiIsIGFyZ3ZbaSArIDFdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWRzdCIpKSB7CisgICAgICAgICAgICBkc3RGb3JtYXQgPSBhdl9nZXRfcGl4X2ZtdChhcmd2W2kgKyAxXSk7CisgICAgICAgICAgICBpZiAoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBwaXhlbCBmb3JtYXQgJXNcbiIsIGFyZ3ZbaSArIDFdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CitiYWRfb3B0aW9uOgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgb3B0aW9uIG9yIGFyZ3VtZW50IG1pc3NpbmcgKCVzKVxuIiwgYXJndltpXSk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgc3dzID0gc3dzX2dldENvbnRleHQoVyAvIDEyLCBIIC8gMTIsIEFWX1BJWF9GTVRfUkdCMzIsIFcsIEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgU1dTX0JJTElORUFSLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgIGF2X2xmZ19pbml0KCZyYW5kLCAxKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBIOyB5KyspCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBXICogNDsgeCsrKQorICAgICAgICAgICAgcmdiX2RhdGFbIHggKyB5ICogNCAqIFddID0gYXZfbGZnX2dldCgmcmFuZCk7CisgICAgc3dzX3NjYWxlKHN3cywgcmdiX3NyYywgcmdiX3N0cmlkZSwgMCwgSCwgc3JjLCBzdHJpZGUpOworICAgIHN3c19mcmVlQ29udGV4dChzd3MpOworICAgIGF2X2ZyZWUocmdiX2RhdGEpOworCisgICAgaWYoZnApIHsKKyAgICAgICAgcmVzID0gZmlsZVRlc3Qoc3JjLCBzdHJpZGUsIFcsIEgsIGZwLCBzcmNGb3JtYXQsIGRzdEZvcm1hdCk7CisgICAgICAgIGZjbG9zZShmcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2VsZlRlc3Qoc3JjLCBzdHJpZGUsIFcsIEgsIHNyY0Zvcm1hdCwgZHN0Rm9ybWF0KTsKKyAgICAgICAgcmVzID0gMDsKKyAgICB9CitlcnJvcjoKKyAgICBhdl9mcmVlKGRhdGEpOworCisgICAgcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL3N3c2NhbGUuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL3N3c2NhbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmEzMWNlCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvc3dzY2FsZS5jCkBAIC0wLDAgKzEsMTEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJyZ2IycmdiLmgiCisjaW5jbHVkZSAic3dzY2FsZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInN3c2NhbGUuaCIKKworREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ4X3QsIGZmX2RpdGhlcl84eDhfMTI4KVs5XVs4XSA9IHsKKyAgICB7ICAzNiwgNjgsICA2MCwgOTIsICAzNCwgNjYsICA1OCwgOTAsIH0sCisgICAgeyAxMDAsICA0LCAxMjQsIDI4LCAgOTgsICAyLCAxMjIsIDI2LCB9LAorICAgIHsgIDUyLCA4NCwgIDQ0LCA3NiwgIDUwLCA4MiwgIDQyLCA3NCwgfSwKKyAgICB7IDExNiwgMjAsIDEwOCwgMTIsIDExNCwgMTgsIDEwNiwgMTAsIH0sCisgICAgeyAgMzIsIDY0LCAgNTYsIDg4LCAgMzgsIDcwLCAgNjIsIDk0LCB9LAorICAgIHsgIDk2LCAgMCwgMTIwLCAyNCwgMTAyLCAgNiwgMTI2LCAzMCwgfSwKKyAgICB7ICA0OCwgODAsICA0MCwgNzIsICA1NCwgODYsICA0NiwgNzgsIH0sCisgICAgeyAxMTIsIDE2LCAxMDQsICA4LCAxMTgsIDIyLCAxMTAsIDE0LCB9LAorICAgIHsgIDM2LCA2OCwgIDYwLCA5MiwgIDM0LCA2NiwgIDU4LCA5MCwgfSwKK307CisKK0RFQ0xBUkVfQUxJR05FRCg4LCBzdGF0aWMgY29uc3QgdWludDhfdCwgc3dzX3BiXzY0KVs4XSA9IHsKKyAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQKK307CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmlsbFBsYW5lKHVpbnQ4X3QgKnBsYW5lLCBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgeSwgdWludDhfdCB2YWwpCit7CisgICAgaW50IGk7CisgICAgdWludDhfdCAqcHRyID0gcGxhbmUgKyBzdHJpZGUgKiB5OworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBtZW1zZXQocHRyLCB2YWwsIHdpZHRoKTsKKyAgICAgICAgcHRyICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhTY2FsZTE2VG8xOV9jKFN3c0NvbnRleHQgKmMsIGludDE2X3QgKl9kc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqX3NyYywgY29uc3QgaW50MTZfdCAqZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqZmlsdGVyUG9zLCBpbnQgZmlsdGVyU2l6ZSkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGMtPnNyY0Zvcm1hdCk7CisgICAgaW50IGk7CisgICAgaW50MzJfdCAqZHN0ICAgICAgICA9IChpbnQzMl90ICopIF9kc3Q7CisgICAgY29uc3QgdWludDE2X3QgKnNyYyA9IChjb25zdCB1aW50MTZfdCAqKSBfc3JjOworICAgIGludCBiaXRzICAgICAgICAgICAgPSBkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMTsKKyAgICBpbnQgc2ggICAgICAgICAgICAgID0gYml0cyAtIDQ7CisKKyAgICBpZigoaXNBbnlSR0IoYy0+c3JjRm9ybWF0KSB8fCBjLT5zcmNGb3JtYXQ9PUFWX1BJWF9GTVRfUEFMOCkgJiYgZGVzYy0+Y29tcFswXS5kZXB0aF9taW51czE8MTUpCisgICAgICAgIHNoPSA5OworCisgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkrKykgeworICAgICAgICBpbnQgajsKKyAgICAgICAgaW50IHNyY1BvcyA9IGZpbHRlclBvc1tpXTsKKyAgICAgICAgaW50IHZhbCAgICA9IDA7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpbHRlclNpemU7IGorKykgeworICAgICAgICAgICAgdmFsICs9IHNyY1tzcmNQb3MgKyBqXSAqIGZpbHRlcltmaWx0ZXJTaXplICogaSArIGpdOworICAgICAgICB9CisgICAgICAgIC8vIGZpbHRlcj0xNCBiaXQsIGlucHV0PTE2IGJpdCwgb3V0cHV0PTMwIGJpdCwgPj4gMTEgbWFrZXMgMTkgYml0CisgICAgICAgIGRzdFtpXSA9IEZGTUlOKHZhbCA+PiBzaCwgKDEgPDwgMTkpIC0gMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoU2NhbGUxNlRvMTVfYyhTd3NDb250ZXh0ICpjLCBpbnQxNl90ICpkc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqX3NyYywgY29uc3QgaW50MTZfdCAqZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqZmlsdGVyUG9zLCBpbnQgZmlsdGVyU2l6ZSkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGMtPnNyY0Zvcm1hdCk7CisgICAgaW50IGk7CisgICAgY29uc3QgdWludDE2X3QgKnNyYyA9IChjb25zdCB1aW50MTZfdCAqKSBfc3JjOworICAgIGludCBzaCAgICAgICAgICAgICAgPSBkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMTsKKworICAgIGlmKHNoPDE1KQorICAgICAgICBzaD0gaXNBbnlSR0IoYy0+c3JjRm9ybWF0KSB8fCBjLT5zcmNGb3JtYXQ9PUFWX1BJWF9GTVRfUEFMOCA/IDEzIDogZGVzYy0+Y29tcFswXS5kZXB0aF9taW51czE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSsrKSB7CisgICAgICAgIGludCBqOworICAgICAgICBpbnQgc3JjUG9zID0gZmlsdGVyUG9zW2ldOworICAgICAgICBpbnQgdmFsICAgID0gMDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICB2YWwgKz0gc3JjW3NyY1BvcyArIGpdICogZmlsdGVyW2ZpbHRlclNpemUgKiBpICsgal07CisgICAgICAgIH0KKyAgICAgICAgLy8gZmlsdGVyPTE0IGJpdCwgaW5wdXQ9MTYgYml0LCBvdXRwdXQ9MzAgYml0LCA+PiAxNSBtYWtlcyAxNSBiaXQKKyAgICAgICAgZHN0W2ldID0gRkZNSU4odmFsID4+IHNoLCAoMSA8PCAxNSkgLSAxKTsKKyAgICB9Cit9CisKKy8vIGJpbGluZWFyIC8gYmljdWJpYyBzY2FsaW5nCitzdGF0aWMgdm9pZCBoU2NhbGU4VG8xNV9jKFN3c0NvbnRleHQgKmMsIGludDE2X3QgKmRzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgaW50MTZfdCAqZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpmaWx0ZXJQb3MsIGludCBmaWx0ZXJTaXplKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBkc3RXOyBpKyspIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGludCBzcmNQb3MgPSBmaWx0ZXJQb3NbaV07CisgICAgICAgIGludCB2YWwgICAgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICB2YWwgKz0gKChpbnQpc3JjW3NyY1BvcyArIGpdKSAqIGZpbHRlcltmaWx0ZXJTaXplICogaSArIGpdOworICAgICAgICB9CisgICAgICAgIGRzdFtpXSA9IEZGTUlOKHZhbCA+PiA3LCAoMSA8PCAxNSkgLSAxKTsgLy8gdGhlIGN1YmljIGVxdWF0aW9uIGRvZXMgb3ZlcmZsb3cgLi4uCisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoU2NhbGU4VG8xOV9jKFN3c0NvbnRleHQgKmMsIGludDE2X3QgKl9kc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IGludDE2X3QgKmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqZmlsdGVyUG9zLCBpbnQgZmlsdGVyU2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQzMl90ICpkc3QgPSAoaW50MzJfdCAqKSBfZHN0OworICAgIGZvciAoaSA9IDA7IGkgPCBkc3RXOyBpKyspIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGludCBzcmNQb3MgPSBmaWx0ZXJQb3NbaV07CisgICAgICAgIGludCB2YWwgICAgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICB2YWwgKz0gKChpbnQpc3JjW3NyY1BvcyArIGpdKSAqIGZpbHRlcltmaWx0ZXJTaXplICogaSArIGpdOworICAgICAgICB9CisgICAgICAgIGRzdFtpXSA9IEZGTUlOKHZhbCA+PiAzLCAoMSA8PCAxOSkgLSAxKTsgLy8gdGhlIGN1YmljIGVxdWF0aW9uIGRvZXMgb3ZlcmZsb3cgLi4uCisgICAgfQorfQorCisvLyBGSVhNRSBhbGwgcGFsIGFuZCByZ2Igc3JjRm9ybWF0cyBjb3VsZCBkbyB0aGlzIGNvbnZlcnNpb24gYXMgd2VsbAorLy8gRklYTUUgYWxsIHNjYWxlcnMgbW9yZSBjb21wbGV4IHRoYW4gYmlsaW5lYXIgY291bGQgZG8gaGFsZiBvZiB0aGlzIHRyYW5zZm9ybQorc3RhdGljIHZvaWQgY2hyUmFuZ2VUb0pwZWdfYyhpbnQxNl90ICpkc3RVLCBpbnQxNl90ICpkc3RWLCBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgZHN0VVtpXSA9IChGRk1JTihkc3RVW2ldLCAzMDc3NSkgKiA0NjYzIC0gOTI4OTk5MikgPj4gMTI7IC8vIC0yNjQKKyAgICAgICAgZHN0VltpXSA9IChGRk1JTihkc3RWW2ldLCAzMDc3NSkgKiA0NjYzIC0gOTI4OTk5MikgPj4gMTI7IC8vIC0yNjQKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoclJhbmdlRnJvbUpwZWdfYyhpbnQxNl90ICpkc3RVLCBpbnQxNl90ICpkc3RWLCBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgZHN0VVtpXSA9IChkc3RVW2ldICogMTc5OSArIDQwODEwODUpID4+IDExOyAvLyAxNDY5CisgICAgICAgIGRzdFZbaV0gPSAoZHN0VltpXSAqIDE3OTkgKyA0MDgxMDg1KSA+PiAxMTsgLy8gMTQ2OQorICAgIH0KK30KKworc3RhdGljIHZvaWQgbHVtUmFuZ2VUb0pwZWdfYyhpbnQxNl90ICpkc3QsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgZHN0W2ldID0gKEZGTUlOKGRzdFtpXSwgMzAxODkpICogMTkwNzcgLSAzOTA1NzM2MSkgPj4gMTQ7Cit9CisKK3N0YXRpYyB2b2lkIGx1bVJhbmdlRnJvbUpwZWdfYyhpbnQxNl90ICpkc3QsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgZHN0W2ldID0gKGRzdFtpXSAqIDE0MDcxICsgMzM1NjE5NDcpID4+IDE0OworfQorCitzdGF0aWMgdm9pZCBjaHJSYW5nZVRvSnBlZzE2X2MoaW50MTZfdCAqX2RzdFUsIGludDE2X3QgKl9kc3RWLCBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisgICAgaW50MzJfdCAqZHN0VSA9IChpbnQzMl90ICopIF9kc3RVOworICAgIGludDMyX3QgKmRzdFYgPSAoaW50MzJfdCAqKSBfZHN0VjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBkc3RVW2ldID0gKEZGTUlOKGRzdFVbaV0sIDMwNzc1IDw8IDQpICogNDY2MyAtICg5Mjg5OTkyIDw8IDQpKSA+PiAxMjsgLy8gLTI2NAorICAgICAgICBkc3RWW2ldID0gKEZGTUlOKGRzdFZbaV0sIDMwNzc1IDw8IDQpICogNDY2MyAtICg5Mjg5OTkyIDw8IDQpKSA+PiAxMjsgLy8gLTI2NAorICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hyUmFuZ2VGcm9tSnBlZzE2X2MoaW50MTZfdCAqX2RzdFUsIGludDE2X3QgKl9kc3RWLCBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisgICAgaW50MzJfdCAqZHN0VSA9IChpbnQzMl90ICopIF9kc3RVOworICAgIGludDMyX3QgKmRzdFYgPSAoaW50MzJfdCAqKSBfZHN0VjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBkc3RVW2ldID0gKGRzdFVbaV0gKiAxNzk5ICsgKDQwODEwODUgPDwgNCkpID4+IDExOyAvLyAxNDY5CisgICAgICAgIGRzdFZbaV0gPSAoZHN0VltpXSAqIDE3OTkgKyAoNDA4MTA4NSA8PCA0KSkgPj4gMTE7IC8vIDE0NjkKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGx1bVJhbmdlVG9KcGVnMTZfYyhpbnQxNl90ICpfZHN0LCBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisgICAgaW50MzJfdCAqZHN0ID0gKGludDMyX3QgKikgX2RzdDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBkc3RbaV0gPSAoKGludCkoRkZNSU4oZHN0W2ldLCAzMDE4OSA8PCA0KSAqIDQ3NjlVIC0gKDM5MDU3MzYxIDw8IDIpKSkgPj4gMTI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBsdW1SYW5nZUZyb21KcGVnMTZfYyhpbnQxNl90ICpfZHN0LCBpbnQgd2lkdGgpCit7CisgICAgaW50IGk7CisgICAgaW50MzJfdCAqZHN0ID0gKGludDMyX3QgKikgX2RzdDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgZHN0W2ldID0gKGRzdFtpXSooMTQwNzEvNCkgKyAoMzM1NjE5NDc8PDQpLzQpPj4xMjsKK30KKworLy8gKioqIGhvcml6b250YWwgc2NhbGUgWSBsaW5lIHRvIHRlbXAgYnVmZmVyCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGh5c2NhbGUoU3dzQ29udGV4dCAqYywgaW50MTZfdCAqZHN0LCBpbnQgZHN0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX2luWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNXLCBpbnQgeEluYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpoTHVtRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmhMdW1GaWx0ZXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhMdW1GaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmZvcm1hdENvbnZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBhbCwgaW50IGlzQWxwaGEpCit7CisgICAgdm9pZCAoKnRvWVYxMikodWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBpbnQsIHVpbnQzMl90ICopID0KKyAgICAgICAgaXNBbHBoYSA/IGMtPmFscFRvWVYxMiA6IGMtPmx1bVRvWVYxMjsKKyAgICB2b2lkICgqY29udmVydFJhbmdlKShpbnQxNl90ICosIGludCkgPSBpc0FscGhhID8gTlVMTCA6IGMtPmx1bUNvbnZlcnRSYW5nZTsKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSBzcmNfaW5baXNBbHBoYSA/IDMgOiAwXTsKKworICAgIGlmICh0b1lWMTIpIHsKKyAgICAgICAgdG9ZVjEyKGZvcm1hdENvbnZCdWZmZXIsIHNyYywgc3JjX2luWzFdLCBzcmNfaW5bMl0sIHNyY1csIHBhbCk7CisgICAgICAgIHNyYyA9IGZvcm1hdENvbnZCdWZmZXI7CisgICAgfSBlbHNlIGlmIChjLT5yZWFkTHVtUGxhbmFyICYmICFpc0FscGhhKSB7CisgICAgICAgIGMtPnJlYWRMdW1QbGFuYXIoZm9ybWF0Q29udkJ1ZmZlciwgc3JjX2luLCBzcmNXLCBjLT5pbnB1dF9yZ2IyeXV2X3RhYmxlKTsKKyAgICAgICAgc3JjID0gZm9ybWF0Q29udkJ1ZmZlcjsKKyAgICB9IGVsc2UgaWYgKGMtPnJlYWRBbHBQbGFuYXIgJiYgaXNBbHBoYSkgeworICAgICAgICBjLT5yZWFkQWxwUGxhbmFyKGZvcm1hdENvbnZCdWZmZXIsIHNyY19pbiwgc3JjVywgTlVMTCk7CisgICAgICAgIHNyYyA9IGZvcm1hdENvbnZCdWZmZXI7CisgICAgfQorCisgICAgaWYgKCFjLT5oeXNjYWxlX2Zhc3QpIHsKKyAgICAgICAgYy0+aHlTY2FsZShjLCBkc3QsIGRzdFdpZHRoLCBzcmMsIGhMdW1GaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgaEx1bUZpbHRlclBvcywgaEx1bUZpbHRlclNpemUpOworICAgIH0gZWxzZSB7IC8vIGZhc3QgYmlsaW5lYXIgdXBzY2FsZSAvIGNyYXAgZG93bnNjYWxlCisgICAgICAgIGMtPmh5c2NhbGVfZmFzdChjLCBkc3QsIGRzdFdpZHRoLCBzcmMsIHNyY1csIHhJbmMpOworICAgIH0KKworICAgIGlmIChjb252ZXJ0UmFuZ2UpCisgICAgICAgIGNvbnZlcnRSYW5nZShkc3QsIGRzdFdpZHRoKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBoY3NjYWxlKFN3c0NvbnRleHQgKmMsIGludDE2X3QgKmRzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0MiwgaW50IGRzdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19pbls0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjVywgaW50IHhJbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqaENockZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpoQ2hyRmlsdGVyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoQ2hyRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpmb3JtYXRDb252QnVmZmVyLCB1aW50MzJfdCAqcGFsKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEgPSBzcmNfaW5bMV0sICpzcmMyID0gc3JjX2luWzJdOworICAgIGlmIChjLT5jaHJUb1lWMTIpIHsKKyAgICAgICAgdWludDhfdCAqYnVmMiA9IGZvcm1hdENvbnZCdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgRkZBTElHTihzcmNXKjIrNzgsIDE2KTsKKyAgICAgICAgYy0+Y2hyVG9ZVjEyKGZvcm1hdENvbnZCdWZmZXIsIGJ1ZjIsIHNyY19pblswXSwgc3JjMSwgc3JjMiwgc3JjVywgcGFsKTsKKyAgICAgICAgc3JjMT0gZm9ybWF0Q29udkJ1ZmZlcjsKKyAgICAgICAgc3JjMj0gYnVmMjsKKyAgICB9IGVsc2UgaWYgKGMtPnJlYWRDaHJQbGFuYXIpIHsKKyAgICAgICAgdWludDhfdCAqYnVmMiA9IGZvcm1hdENvbnZCdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgRkZBTElHTihzcmNXKjIrNzgsIDE2KTsKKyAgICAgICAgYy0+cmVhZENoclBsYW5hcihmb3JtYXRDb252QnVmZmVyLCBidWYyLCBzcmNfaW4sIHNyY1csIGMtPmlucHV0X3JnYjJ5dXZfdGFibGUpOworICAgICAgICBzcmMxID0gZm9ybWF0Q29udkJ1ZmZlcjsKKyAgICAgICAgc3JjMiA9IGJ1ZjI7CisgICAgfQorCisgICAgaWYgKCFjLT5oY3NjYWxlX2Zhc3QpIHsKKyAgICAgICAgYy0+aGNTY2FsZShjLCBkc3QxLCBkc3RXaWR0aCwgc3JjMSwgaENockZpbHRlciwgaENockZpbHRlclBvcywgaENockZpbHRlclNpemUpOworICAgICAgICBjLT5oY1NjYWxlKGMsIGRzdDIsIGRzdFdpZHRoLCBzcmMyLCBoQ2hyRmlsdGVyLCBoQ2hyRmlsdGVyUG9zLCBoQ2hyRmlsdGVyU2l6ZSk7CisgICAgfSBlbHNlIHsgLy8gZmFzdCBiaWxpbmVhciB1cHNjYWxlIC8gY3JhcCBkb3duc2NhbGUKKyAgICAgICAgYy0+aGNzY2FsZV9mYXN0KGMsIGRzdDEsIGRzdDIsIGRzdFdpZHRoLCBzcmMxLCBzcmMyLCBzcmNXLCB4SW5jKTsKKyAgICB9CisKKyAgICBpZiAoYy0+Y2hyQ29udmVydFJhbmdlKQorICAgICAgICBjLT5jaHJDb252ZXJ0UmFuZ2UoZHN0MSwgZHN0MiwgZHN0V2lkdGgpOworfQorCisjZGVmaW5lIERFQlVHX1NXU0NBTEVfQlVGRkVSUyAwCisjZGVmaW5lIERFQlVHX0JVRkZFUlMoLi4uKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKERFQlVHX1NXU0NBTEVfQlVGRkVSUykgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfREVCVUcsIF9fVkFfQVJHU19fKQorCitzdGF0aWMgaW50IHN3c2NhbGUoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCisgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLAorICAgICAgICAgICAgICAgICAgIGludCBzcmNTbGljZUgsIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0U3RyaWRlW10pCit7CisgICAgLyogbG9hZCBhIGZldyB0aGluZ3MgaW50byBsb2NhbCB2YXJzIHRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZT8KKyAgICAgKiBhbmQgZmFzdGVyICovCisgICAgY29uc3QgaW50IHNyY1cgICAgICAgICAgICAgICAgICAgPSBjLT5zcmNXOworICAgIGNvbnN0IGludCBkc3RXICAgICAgICAgICAgICAgICAgID0gYy0+ZHN0VzsKKyAgICBjb25zdCBpbnQgZHN0SCAgICAgICAgICAgICAgICAgICA9IGMtPmRzdEg7CisgICAgY29uc3QgaW50IGNockRzdFcgICAgICAgICAgICAgICAgPSBjLT5jaHJEc3RXOworICAgIGNvbnN0IGludCBjaHJTcmNXICAgICAgICAgICAgICAgID0gYy0+Y2hyU3JjVzsKKyAgICBjb25zdCBpbnQgbHVtWEluYyAgICAgICAgICAgICAgICA9IGMtPmx1bVhJbmM7CisgICAgY29uc3QgaW50IGNoclhJbmMgICAgICAgICAgICAgICAgPSBjLT5jaHJYSW5jOworICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXQgPSBjLT5kc3RGb3JtYXQ7CisgICAgY29uc3QgaW50IGZsYWdzICAgICAgICAgICAgICAgICAgPSBjLT5mbGFnczsKKyAgICBpbnQzMl90ICp2THVtRmlsdGVyUG9zICAgICAgICAgICA9IGMtPnZMdW1GaWx0ZXJQb3M7CisgICAgaW50MzJfdCAqdkNockZpbHRlclBvcyAgICAgICAgICAgPSBjLT52Q2hyRmlsdGVyUG9zOworICAgIGludDMyX3QgKmhMdW1GaWx0ZXJQb3MgICAgICAgICAgID0gYy0+aEx1bUZpbHRlclBvczsKKyAgICBpbnQzMl90ICpoQ2hyRmlsdGVyUG9zICAgICAgICAgICA9IGMtPmhDaHJGaWx0ZXJQb3M7CisgICAgaW50MTZfdCAqaEx1bUZpbHRlciAgICAgICAgICAgICAgPSBjLT5oTHVtRmlsdGVyOworICAgIGludDE2X3QgKmhDaHJGaWx0ZXIgICAgICAgICAgICAgID0gYy0+aENockZpbHRlcjsKKyAgICBpbnQzMl90ICpsdW1NbXhGaWx0ZXIgICAgICAgICAgICA9IGMtPmx1bU1teEZpbHRlcjsKKyAgICBpbnQzMl90ICpjaHJNbXhGaWx0ZXIgICAgICAgICAgICA9IGMtPmNock1teEZpbHRlcjsKKyAgICBjb25zdCBpbnQgdkx1bUZpbHRlclNpemUgICAgICAgICA9IGMtPnZMdW1GaWx0ZXJTaXplOworICAgIGNvbnN0IGludCB2Q2hyRmlsdGVyU2l6ZSAgICAgICAgID0gYy0+dkNockZpbHRlclNpemU7CisgICAgY29uc3QgaW50IGhMdW1GaWx0ZXJTaXplICAgICAgICAgPSBjLT5oTHVtRmlsdGVyU2l6ZTsKKyAgICBjb25zdCBpbnQgaENockZpbHRlclNpemUgICAgICAgICA9IGMtPmhDaHJGaWx0ZXJTaXplOworICAgIGludDE2X3QgKipsdW1QaXhCdWYgICAgICAgICAgICAgID0gYy0+bHVtUGl4QnVmOworICAgIGludDE2X3QgKipjaHJVUGl4QnVmICAgICAgICAgICAgID0gYy0+Y2hyVVBpeEJ1ZjsKKyAgICBpbnQxNl90ICoqY2hyVlBpeEJ1ZiAgICAgICAgICAgICA9IGMtPmNoclZQaXhCdWY7CisgICAgaW50MTZfdCAqKmFscFBpeEJ1ZiAgICAgICAgICAgICAgPSBjLT5hbHBQaXhCdWY7CisgICAgY29uc3QgaW50IHZMdW1CdWZTaXplICAgICAgICAgICAgPSBjLT52THVtQnVmU2l6ZTsKKyAgICBjb25zdCBpbnQgdkNockJ1ZlNpemUgICAgICAgICAgICA9IGMtPnZDaHJCdWZTaXplOworICAgIHVpbnQ4X3QgKmZvcm1hdENvbnZCdWZmZXIgICAgICAgID0gYy0+Zm9ybWF0Q29udkJ1ZmZlcjsKKyAgICB1aW50MzJfdCAqcGFsICAgICAgICAgICAgICAgICAgICA9IGMtPnBhbF95dXY7CisgICAgeXV2MnBsYW5hcjFfZm4geXV2MnBsYW5lMSAgICAgICAgPSBjLT55dXYycGxhbmUxOworICAgIHl1djJwbGFuYXJYX2ZuIHl1djJwbGFuZVggICAgICAgID0gYy0+eXV2MnBsYW5lWDsKKyAgICB5dXYyaW50ZXJsZWF2ZWRYX2ZuIHl1djJudjEyY1ggICA9IGMtPnl1djJudjEyY1g7CisgICAgeXV2MnBhY2tlZDFfZm4geXV2MnBhY2tlZDEgICAgICAgPSBjLT55dXYycGFja2VkMTsKKyAgICB5dXYycGFja2VkMl9mbiB5dXYycGFja2VkMiAgICAgICA9IGMtPnl1djJwYWNrZWQyOworICAgIHl1djJwYWNrZWRYX2ZuIHl1djJwYWNrZWRYICAgICAgID0gYy0+eXV2MnBhY2tlZFg7CisgICAgeXV2MmFueVhfZm4geXV2MmFueVggICAgICAgICAgICAgPSBjLT55dXYyYW55WDsKKyAgICBjb25zdCBpbnQgY2hyU3JjU2xpY2VZICAgICAgICAgICA9ICAgICAgICAgICAgICAgIHNyY1NsaWNlWSA+PiBjLT5jaHJTcmNWU3ViU2FtcGxlOworICAgIGNvbnN0IGludCBjaHJTcmNTbGljZUggICAgICAgICAgID0gRkZfQ0VJTF9SU0hJRlQoc3JjU2xpY2VILCAgIGMtPmNoclNyY1ZTdWJTYW1wbGUpOworICAgIGludCBzaG91bGRfZGl0aGVyICAgICAgICAgICAgICAgID0gaXM5X09SXzEwQlBTKGMtPnNyY0Zvcm1hdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzMTZCUFMoYy0+c3JjRm9ybWF0KTsKKyAgICBpbnQgbGFzdERzdFk7CisKKyAgICAvKiB2YXJzIHdoaWNoIHdpbGwgY2hhbmdlIGFuZCB3aGljaCB3ZSBuZWVkIHRvIHN0b3JlIGJhY2sgaW4gdGhlIGNvbnRleHQgKi8KKyAgICBpbnQgZHN0WSAgICAgICAgID0gYy0+ZHN0WTsKKyAgICBpbnQgbHVtQnVmSW5kZXggID0gYy0+bHVtQnVmSW5kZXg7CisgICAgaW50IGNockJ1ZkluZGV4ICA9IGMtPmNockJ1ZkluZGV4OworICAgIGludCBsYXN0SW5MdW1CdWYgPSBjLT5sYXN0SW5MdW1CdWY7CisgICAgaW50IGxhc3RJbkNockJ1ZiA9IGMtPmxhc3RJbkNockJ1ZjsKKworICAgIGlmICghdXNlUGFsKGMtPnNyY0Zvcm1hdCkpIHsKKyAgICAgICAgcGFsID0gYy0+aW5wdXRfcmdiMnl1dl90YWJsZTsKKyAgICB9CisKKyAgICBpZiAoaXNQYWNrZWQoYy0+c3JjRm9ybWF0KSkgeworICAgICAgICBzcmNbMF0gPQorICAgICAgICBzcmNbMV0gPQorICAgICAgICBzcmNbMl0gPQorICAgICAgICBzcmNbM10gPSBzcmNbMF07CisgICAgICAgIHNyY1N0cmlkZVswXSA9CisgICAgICAgIHNyY1N0cmlkZVsxXSA9CisgICAgICAgIHNyY1N0cmlkZVsyXSA9CisgICAgICAgIHNyY1N0cmlkZVszXSA9IHNyY1N0cmlkZVswXTsKKyAgICB9CisgICAgc3JjU3RyaWRlWzFdIDw8PSBjLT52Q2hyRHJvcDsKKyAgICBzcmNTdHJpZGVbMl0gPDw9IGMtPnZDaHJEcm9wOworCisgICAgREVCVUdfQlVGRkVSUygic3dzY2FsZSgpICVwWyVkXSAlcFslZF0gJXBbJWRdICVwWyVkXSAtPiAlcFslZF0gJXBbJWRdICVwWyVkXSAlcFslZF1cbiIsCisgICAgICAgICAgICAgICAgICBzcmNbMF0sIHNyY1N0cmlkZVswXSwgc3JjWzFdLCBzcmNTdHJpZGVbMV0sCisgICAgICAgICAgICAgICAgICBzcmNbMl0sIHNyY1N0cmlkZVsyXSwgc3JjWzNdLCBzcmNTdHJpZGVbM10sCisgICAgICAgICAgICAgICAgICBkc3RbMF0sIGRzdFN0cmlkZVswXSwgZHN0WzFdLCBkc3RTdHJpZGVbMV0sCisgICAgICAgICAgICAgICAgICBkc3RbMl0sIGRzdFN0cmlkZVsyXSwgZHN0WzNdLCBkc3RTdHJpZGVbM10pOworICAgIERFQlVHX0JVRkZFUlMoInNyY1NsaWNlWTogJWQgc3JjU2xpY2VIOiAlZCBkc3RZOiAlZCBkc3RIOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHNyY1NsaWNlWSwgc3JjU2xpY2VILCBkc3RZLCBkc3RIKTsKKyAgICBERUJVR19CVUZGRVJTKCJ2THVtRmlsdGVyU2l6ZTogJWQgdkx1bUJ1ZlNpemU6ICVkIHZDaHJGaWx0ZXJTaXplOiAlZCB2Q2hyQnVmU2l6ZTogJWRcbiIsCisgICAgICAgICAgICAgICAgICB2THVtRmlsdGVyU2l6ZSwgdkx1bUJ1ZlNpemUsIHZDaHJGaWx0ZXJTaXplLCB2Q2hyQnVmU2l6ZSk7CisKKyAgICBpZiAoZHN0U3RyaWRlWzBdJjE1IHx8IGRzdFN0cmlkZVsxXSYxNSB8fAorICAgICAgICBkc3RTdHJpZGVbMl0mMTUgfHwgZHN0U3RyaWRlWzNdJjE1KSB7CisgICAgICAgIHN0YXRpYyBpbnQgd2FybmVkQWxyZWFkeSA9IDA7IC8vIEZJWE1FIG1heWJlIG1vdmUgdGhpcyBpbnRvIHRoZSBjb250ZXh0CisgICAgICAgIGlmIChmbGFncyAmIFNXU19QUklOVF9JTkZPICYmICF3YXJuZWRBbHJlYWR5KSB7CisgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IGRzdFN0cmlkZSBpcyBub3QgYWxpZ25lZCFcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgICAgLT5jYW5ub3QgZG8gYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMgYW55bW9yZVxuIik7CisgICAgICAgICAgICB3YXJuZWRBbHJlYWR5ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggICAodWludHB0cl90KWRzdFswXSYxNSB8fCAodWludHB0cl90KWRzdFsxXSYxNSB8fCAodWludHB0cl90KWRzdFsyXSYxNQorICAgICAgICB8fCAodWludHB0cl90KXNyY1swXSYxNSB8fCAodWludHB0cl90KXNyY1sxXSYxNSB8fCAodWludHB0cl90KXNyY1syXSYxNQorICAgICAgICB8fCBkc3RTdHJpZGVbMF0mMTUgfHwgZHN0U3RyaWRlWzFdJjE1IHx8IGRzdFN0cmlkZVsyXSYxNSB8fCBkc3RTdHJpZGVbM10mMTUKKyAgICAgICAgfHwgc3JjU3RyaWRlWzBdJjE1IHx8IHNyY1N0cmlkZVsxXSYxNSB8fCBzcmNTdHJpZGVbMl0mMTUgfHwgc3JjU3RyaWRlWzNdJjE1CisgICAgKSB7CisgICAgICAgIHN0YXRpYyBpbnQgd2FybmVkQWxyZWFkeT0wOworICAgICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgICAgICBpZiAoSEFWRV9NTVhFWFQgJiYgKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX1NTRTIpICYmICF3YXJuZWRBbHJlYWR5KXsKKyAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfV0FSTklORywgIldhcm5pbmc6IGRhdGEgaXMgbm90IGFsaWduZWQhIFRoaXMgY2FuIGxlYWQgdG8gYSBzcGVlZGxvc3NcbiIpOworICAgICAgICAgICAgd2FybmVkQWxyZWFkeT0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTm90ZSB0aGUgdXNlciBtaWdodCBzdGFydCBzY2FsaW5nIHRoZSBwaWN0dXJlIGluIHRoZSBtaWRkbGUgc28gdGhpcworICAgICAqIHdpbGwgbm90IGdldCBleGVjdXRlZC4gVGhpcyBpcyBub3QgcmVhbGx5IGludGVuZGVkIGJ1dCB3b3JrcworICAgICAqIGN1cnJlbnRseSwgc28gcGVvcGxlIG1pZ2h0IGRvIGl0LiAqLworICAgIGlmIChzcmNTbGljZVkgPT0gMCkgeworICAgICAgICBsdW1CdWZJbmRleCAgPSAtMTsKKyAgICAgICAgY2hyQnVmSW5kZXggID0gLTE7CisgICAgICAgIGRzdFkgICAgICAgICA9IDA7CisgICAgICAgIGxhc3RJbkx1bUJ1ZiA9IC0xOworICAgICAgICBsYXN0SW5DaHJCdWYgPSAtMTsKKyAgICB9CisKKyAgICBpZiAoIXNob3VsZF9kaXRoZXIpIHsKKyAgICAgICAgYy0+Y2hyRGl0aGVyOCA9IGMtPmx1bURpdGhlcjggPSBzd3NfcGJfNjQ7CisgICAgfQorICAgIGxhc3REc3RZID0gZHN0WTsKKworICAgIGZvciAoOyBkc3RZIDwgZHN0SDsgZHN0WSsrKSB7CisgICAgICAgIGNvbnN0IGludCBjaHJEc3RZID0gZHN0WSA+PiBjLT5jaHJEc3RWU3ViU2FtcGxlOworICAgICAgICB1aW50OF90ICpkZXN0WzRdICA9IHsKKyAgICAgICAgICAgIGRzdFswXSArIGRzdFN0cmlkZVswXSAqIGRzdFksCisgICAgICAgICAgICBkc3RbMV0gKyBkc3RTdHJpZGVbMV0gKiBjaHJEc3RZLAorICAgICAgICAgICAgZHN0WzJdICsgZHN0U3RyaWRlWzJdICogY2hyRHN0WSwKKyAgICAgICAgICAgIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBhbHBQaXhCdWYpID8gZHN0WzNdICsgZHN0U3RyaWRlWzNdICogZHN0WSA6IE5VTEwsCisgICAgICAgIH07CisgICAgICAgIGludCB1c2VfbW14X3ZmaWx0ZXI9IGMtPnVzZV9tbXhfdmZpbHRlcjsKKworICAgICAgICAvLyBGaXJzdCBsaW5lIG5lZWRlZCBhcyBpbnB1dAorICAgICAgICBjb25zdCBpbnQgZmlyc3RMdW1TcmNZICA9IEZGTUFYKDEgLSB2THVtRmlsdGVyU2l6ZSwgdkx1bUZpbHRlclBvc1tkc3RZXSk7CisgICAgICAgIGNvbnN0IGludCBmaXJzdEx1bVNyY1kyID0gRkZNQVgoMSAtIHZMdW1GaWx0ZXJTaXplLCB2THVtRmlsdGVyUG9zW0ZGTUlOKGRzdFkgfCAoKDEgPDwgYy0+Y2hyRHN0VlN1YlNhbXBsZSkgLSAxKSwgZHN0SCAtIDEpXSk7CisgICAgICAgIC8vIEZpcnN0IGxpbmUgbmVlZGVkIGFzIGlucHV0CisgICAgICAgIGNvbnN0IGludCBmaXJzdENoclNyY1kgID0gRkZNQVgoMSAtIHZDaHJGaWx0ZXJTaXplLCB2Q2hyRmlsdGVyUG9zW2NockRzdFldKTsKKworICAgICAgICAvLyBMYXN0IGxpbmUgbmVlZGVkIGFzIGlucHV0CisgICAgICAgIGludCBsYXN0THVtU3JjWSAgPSBGRk1JTihjLT5zcmNILCAgICBmaXJzdEx1bVNyY1kgICsgdkx1bUZpbHRlclNpemUpIC0gMTsKKyAgICAgICAgaW50IGxhc3RMdW1TcmNZMiA9IEZGTUlOKGMtPnNyY0gsICAgIGZpcnN0THVtU3JjWTIgKyB2THVtRmlsdGVyU2l6ZSkgLSAxOworICAgICAgICBpbnQgbGFzdENoclNyY1kgID0gRkZNSU4oYy0+Y2hyU3JjSCwgZmlyc3RDaHJTcmNZICArIHZDaHJGaWx0ZXJTaXplKSAtIDE7CisgICAgICAgIGludCBlbm91Z2hfbGluZXM7CisKKyAgICAgICAgLy8gaGFuZGxlIGhvbGVzIChGQVNUX0JJTElORUFSICYgd2VpcmQgZmlsdGVycykKKyAgICAgICAgaWYgKGZpcnN0THVtU3JjWSA+IGxhc3RJbkx1bUJ1ZikKKyAgICAgICAgICAgIGxhc3RJbkx1bUJ1ZiA9IGZpcnN0THVtU3JjWSAtIDE7CisgICAgICAgIGlmIChmaXJzdENoclNyY1kgPiBsYXN0SW5DaHJCdWYpCisgICAgICAgICAgICBsYXN0SW5DaHJCdWYgPSBmaXJzdENoclNyY1kgLSAxOworICAgICAgICBhdl9hc3NlcnQwKGZpcnN0THVtU3JjWSA+PSBsYXN0SW5MdW1CdWYgLSB2THVtQnVmU2l6ZSArIDEpOworICAgICAgICBhdl9hc3NlcnQwKGZpcnN0Q2hyU3JjWSA+PSBsYXN0SW5DaHJCdWYgLSB2Q2hyQnVmU2l6ZSArIDEpOworCisgICAgICAgIERFQlVHX0JVRkZFUlMoImRzdFk6ICVkXG4iLCBkc3RZKTsKKyAgICAgICAgREVCVUdfQlVGRkVSUygiXHRmaXJzdEx1bVNyY1k6ICVkIGxhc3RMdW1TcmNZOiAlZCBsYXN0SW5MdW1CdWY6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGZpcnN0THVtU3JjWSwgbGFzdEx1bVNyY1ksIGxhc3RJbkx1bUJ1Zik7CisgICAgICAgIERFQlVHX0JVRkZFUlMoIlx0Zmlyc3RDaHJTcmNZOiAlZCBsYXN0Q2hyU3JjWTogJWQgbGFzdEluQ2hyQnVmOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaXJzdENoclNyY1ksIGxhc3RDaHJTcmNZLCBsYXN0SW5DaHJCdWYpOworCisgICAgICAgIC8vIERvIHdlIGhhdmUgZW5vdWdoIGxpbmVzIGluIHRoaXMgc2xpY2UgdG8gb3V0cHV0IHRoZSBkc3RZIGxpbmUKKyAgICAgICAgZW5vdWdoX2xpbmVzID0gbGFzdEx1bVNyY1kyIDwgc3JjU2xpY2VZICsgc3JjU2xpY2VIICYmCisgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaHJTcmNZIDwgRkZfQ0VJTF9SU0hJRlQoc3JjU2xpY2VZICsgc3JjU2xpY2VILCBjLT5jaHJTcmNWU3ViU2FtcGxlKTsKKworICAgICAgICBpZiAoIWVub3VnaF9saW5lcykgeworICAgICAgICAgICAgbGFzdEx1bVNyY1kgPSBzcmNTbGljZVkgKyBzcmNTbGljZUggLSAxOworICAgICAgICAgICAgbGFzdENoclNyY1kgPSBjaHJTcmNTbGljZVkgKyBjaHJTcmNTbGljZUggLSAxOworICAgICAgICAgICAgREVCVUdfQlVGRkVSUygiYnVmZmVyaW5nIHNsaWNlOiBsYXN0THVtU3JjWSAlZCBsYXN0Q2hyU3JjWSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEx1bVNyY1ksIGxhc3RDaHJTcmNZKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERvIGhvcml6b250YWwgc2NhbGluZworICAgICAgICB3aGlsZSAobGFzdEluTHVtQnVmIDwgbGFzdEx1bVNyY1kpIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzFbNF0gPSB7CisgICAgICAgICAgICAgICAgc3JjWzBdICsgKGxhc3RJbkx1bUJ1ZiArIDEgLSBzcmNTbGljZVkpICogc3JjU3RyaWRlWzBdLAorICAgICAgICAgICAgICAgIHNyY1sxXSArIChsYXN0SW5MdW1CdWYgKyAxIC0gc3JjU2xpY2VZKSAqIHNyY1N0cmlkZVsxXSwKKyAgICAgICAgICAgICAgICBzcmNbMl0gKyAobGFzdEluTHVtQnVmICsgMSAtIHNyY1NsaWNlWSkgKiBzcmNTdHJpZGVbMl0sCisgICAgICAgICAgICAgICAgc3JjWzNdICsgKGxhc3RJbkx1bUJ1ZiArIDEgLSBzcmNTbGljZVkpICogc3JjU3RyaWRlWzNdLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGx1bUJ1ZkluZGV4Kys7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGx1bUJ1ZkluZGV4IDwgMiAqIHZMdW1CdWZTaXplKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAobGFzdEluTHVtQnVmICsgMSAtIHNyY1NsaWNlWSA8IHNyY1NsaWNlSCk7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGxhc3RJbkx1bUJ1ZiArIDEgLSBzcmNTbGljZVkgPj0gMCk7CisgICAgICAgICAgICBoeXNjYWxlKGMsIGx1bVBpeEJ1ZltsdW1CdWZJbmRleF0sIGRzdFcsIHNyYzEsIHNyY1csIGx1bVhJbmMsCisgICAgICAgICAgICAgICAgICAgIGhMdW1GaWx0ZXIsIGhMdW1GaWx0ZXJQb3MsIGhMdW1GaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXRDb252QnVmZmVyLCBwYWwsIDApOworICAgICAgICAgICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGFscFBpeEJ1ZikKKyAgICAgICAgICAgICAgICBoeXNjYWxlKGMsIGFscFBpeEJ1ZltsdW1CdWZJbmRleF0sIGRzdFcsIHNyYzEsIHNyY1csCisgICAgICAgICAgICAgICAgICAgICAgICBsdW1YSW5jLCBoTHVtRmlsdGVyLCBoTHVtRmlsdGVyUG9zLCBoTHVtRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdENvbnZCdWZmZXIsIHBhbCwgMSk7CisgICAgICAgICAgICBsYXN0SW5MdW1CdWYrKzsKKyAgICAgICAgICAgIERFQlVHX0JVRkZFUlMoIlx0XHRsdW1CdWZJbmRleCAlZDogbGFzdEluTHVtQnVmOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbHVtQnVmSW5kZXgsIGxhc3RJbkx1bUJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGxhc3RJbkNockJ1ZiA8IGxhc3RDaHJTcmNZKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxWzRdID0geworICAgICAgICAgICAgICAgIHNyY1swXSArIChsYXN0SW5DaHJCdWYgKyAxIC0gY2hyU3JjU2xpY2VZKSAqIHNyY1N0cmlkZVswXSwKKyAgICAgICAgICAgICAgICBzcmNbMV0gKyAobGFzdEluQ2hyQnVmICsgMSAtIGNoclNyY1NsaWNlWSkgKiBzcmNTdHJpZGVbMV0sCisgICAgICAgICAgICAgICAgc3JjWzJdICsgKGxhc3RJbkNockJ1ZiArIDEgLSBjaHJTcmNTbGljZVkpICogc3JjU3RyaWRlWzJdLAorICAgICAgICAgICAgICAgIHNyY1szXSArIChsYXN0SW5DaHJCdWYgKyAxIC0gY2hyU3JjU2xpY2VZKSAqIHNyY1N0cmlkZVszXSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjaHJCdWZJbmRleCsrOworICAgICAgICAgICAgYXZfYXNzZXJ0MChjaHJCdWZJbmRleCA8IDIgKiB2Q2hyQnVmU2l6ZSk7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGxhc3RJbkNockJ1ZiArIDEgLSBjaHJTcmNTbGljZVkgPCAoY2hyU3JjU2xpY2VIKSk7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGxhc3RJbkNockJ1ZiArIDEgLSBjaHJTcmNTbGljZVkgPj0gMCk7CisgICAgICAgICAgICAvLyBGSVhNRSByZXBsYWNlIHBhcmFtZXRlcnMgdGhyb3VnaCBjb250ZXh0IHN0cnVjdCAoc29tZSBhdCBsZWFzdCkKKworICAgICAgICAgICAgaWYgKGMtPm5lZWRzX2hjc2NhbGUpCisgICAgICAgICAgICAgICAgaGNzY2FsZShjLCBjaHJVUGl4QnVmW2NockJ1ZkluZGV4XSwgY2hyVlBpeEJ1ZltjaHJCdWZJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjaHJEc3RXLCBzcmMxLCBjaHJTcmNXLCBjaHJYSW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgaENockZpbHRlciwgaENockZpbHRlclBvcywgaENockZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRDb252QnVmZmVyLCBwYWwpOworICAgICAgICAgICAgbGFzdEluQ2hyQnVmKys7CisgICAgICAgICAgICBERUJVR19CVUZGRVJTKCJcdFx0Y2hyQnVmSW5kZXggJWQ6IGxhc3RJbkNockJ1ZjogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNockJ1ZkluZGV4LCBsYXN0SW5DaHJCdWYpOworICAgICAgICB9CisgICAgICAgIC8vIHdyYXAgYnVmIGluZGV4IGFyb3VuZCB0byBzdGF5IGluc2lkZSB0aGUgcmluZyBidWZmZXIKKyAgICAgICAgaWYgKGx1bUJ1ZkluZGV4ID49IHZMdW1CdWZTaXplKQorICAgICAgICAgICAgbHVtQnVmSW5kZXggLT0gdkx1bUJ1ZlNpemU7CisgICAgICAgIGlmIChjaHJCdWZJbmRleCA+PSB2Q2hyQnVmU2l6ZSkKKyAgICAgICAgICAgIGNockJ1ZkluZGV4IC09IHZDaHJCdWZTaXplOworICAgICAgICBpZiAoIWVub3VnaF9saW5lcykKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gd2UgY2FuJ3Qgb3V0cHV0IGEgZHN0WSBsaW5lIHNvIGxldCdzIHRyeSB3aXRoIHRoZSBuZXh0IHNsaWNlCisKKyNpZiBIQVZFX01NWF9JTkxJTkUKKyAgICAgICAgdXBkYXRlTU1YRGl0aGVyVGFibGVzKGMsIGRzdFksIGx1bUJ1ZkluZGV4LCBjaHJCdWZJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbkx1bUJ1ZiwgbGFzdEluQ2hyQnVmKTsKKyNlbmRpZgorICAgICAgICBpZiAoc2hvdWxkX2RpdGhlcikgeworICAgICAgICAgICAgYy0+Y2hyRGl0aGVyOCA9IGZmX2RpdGhlcl84eDhfMTI4W2NockRzdFkgJiA3XTsKKyAgICAgICAgICAgIGMtPmx1bURpdGhlcjggPSBmZl9kaXRoZXJfOHg4XzEyOFtkc3RZICAgICYgN107CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRzdFkgPj0gZHN0SCAtIDIpIHsKKyAgICAgICAgICAgIC8qIGhtbSBsb29rcyBsaWtlIHdlIGNhbid0IHVzZSBNTVggaGVyZSB3aXRob3V0IG92ZXJ3cml0aW5nCisgICAgICAgICAgICAgKiB0aGlzIGFycmF5J3MgdGFpbCAqLworICAgICAgICAgICAgZmZfc3dzX2luaXRfb3V0cHV0X2Z1bmNzKGMsICZ5dXYycGxhbmUxLCAmeXV2MnBsYW5lWCwgJnl1djJudjEyY1gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnl1djJwYWNrZWQxLCAmeXV2MnBhY2tlZDIsICZ5dXYycGFja2VkWCwgJnl1djJhbnlYKTsKKyAgICAgICAgICAgIHVzZV9tbXhfdmZpbHRlcj0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipsdW1TcmNQdHIgID0gKGNvbnN0IGludDE2X3QgKiopKHZvaWQqKSBsdW1QaXhCdWYgICsgbHVtQnVmSW5kZXggKyBmaXJzdEx1bVNyY1kgLSBsYXN0SW5MdW1CdWYgKyB2THVtQnVmU2l6ZTsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJVU3JjUHRyID0gKGNvbnN0IGludDE2X3QgKiopKHZvaWQqKSBjaHJVUGl4QnVmICsgY2hyQnVmSW5kZXggKyBmaXJzdENoclNyY1kgLSBsYXN0SW5DaHJCdWYgKyB2Q2hyQnVmU2l6ZTsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJWU3JjUHRyID0gKGNvbnN0IGludDE2X3QgKiopKHZvaWQqKSBjaHJWUGl4QnVmICsgY2hyQnVmSW5kZXggKyBmaXJzdENoclNyY1kgLSBsYXN0SW5DaHJCdWYgKyB2Q2hyQnVmU2l6ZTsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiphbHBTcmNQdHIgID0gKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGFscFBpeEJ1ZikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKikodm9pZCopIGFscFBpeEJ1ZiArIGx1bUJ1ZkluZGV4ICsgZmlyc3RMdW1TcmNZIC0gbGFzdEluTHVtQnVmICsgdkx1bUJ1ZlNpemUgOiBOVUxMOworICAgICAgICAgICAgaW50MTZfdCAqdkx1bUZpbHRlciA9IGMtPnZMdW1GaWx0ZXI7CisgICAgICAgICAgICBpbnQxNl90ICp2Q2hyRmlsdGVyID0gYy0+dkNockZpbHRlcjsKKworICAgICAgICAgICAgaWYgKGlzUGxhbmFyWVVWKGRzdEZvcm1hdCkgfHwKKyAgICAgICAgICAgICAgICAoaXNHcmF5KGRzdEZvcm1hdCkgJiYgIWlzQUxQSEEoZHN0Rm9ybWF0KSkpIHsgLy8gWVYxMiBsaWtlCisgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoclNraXBNYXNrID0gKDEgPDwgYy0+Y2hyRHN0VlN1YlNhbXBsZSkgLSAxOworCisgICAgICAgICAgICAgICAgdkx1bUZpbHRlciArPSAgICBkc3RZICogdkx1bUZpbHRlclNpemU7CisgICAgICAgICAgICAgICAgdkNockZpbHRlciArPSBjaHJEc3RZICogdkNockZpbHRlclNpemU7CisKKy8vICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKHVzZV9tbXhfdmZpbHRlciAhPSAoCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnBsYW5lWCA9PSB5dXYycGxhbmVYXzEwQkVfYworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHl1djJwbGFuZVggPT0geXV2MnBsYW5lWF8xMExFX2MKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB5dXYycGxhbmVYID09IHl1djJwbGFuZVhfOUJFX2MKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB5dXYycGxhbmVYID09IHl1djJwbGFuZVhfOUxFX2MKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB5dXYycGxhbmVYID09IHl1djJwbGFuZVhfMTZCRV9jCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeXV2MnBsYW5lWCA9PSB5dXYycGxhbmVYXzE2TEVfYworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHl1djJwbGFuZVggPT0geXV2MnBsYW5lWF84X2MpIHx8ICFBUkNIX1g4Nik7CisKKyAgICAgICAgICAgICAgICBpZih1c2VfbW14X3ZmaWx0ZXIpeworICAgICAgICAgICAgICAgICAgICB2THVtRmlsdGVyPSAoaW50MTZfdCAqKWMtPmx1bU1teEZpbHRlcjsKKyAgICAgICAgICAgICAgICAgICAgdkNockZpbHRlcj0gKGludDE2X3QgKiljLT5jaHJNbXhGaWx0ZXI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHZMdW1GaWx0ZXJTaXplID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgeXV2MnBsYW5lMShsdW1TcmNQdHJbMF0sIGRlc3RbMF0sIGRzdFcsIGMtPmx1bURpdGhlcjgsIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHl1djJwbGFuZVgodkx1bUZpbHRlciwgdkx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVtU3JjUHRyLCBkZXN0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFcsIGMtPmx1bURpdGhlcjgsIDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghKChkc3RZICYgY2hyU2tpcE1hc2spIHx8IGlzR3JheShkc3RGb3JtYXQpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoeXV2Mm52MTJjWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgeXV2Mm52MTJjWChjLCB2Q2hyRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Q2hyRmlsdGVyU2l6ZSwgY2hyVVNyY1B0ciwgY2hyVlNyY1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFsxXSwgY2hyRHN0Vyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodkNockZpbHRlclNpemUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnBsYW5lMShjaHJVU3JjUHRyWzBdLCBkZXN0WzFdLCBjaHJEc3RXLCBjLT5jaHJEaXRoZXI4LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHl1djJwbGFuZTEoY2hyVlNyY1B0clswXSwgZGVzdFsyXSwgY2hyRHN0VywgYy0+Y2hyRGl0aGVyOCwgMyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5dXYycGxhbmVYKHZDaHJGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZDaHJGaWx0ZXJTaXplLCBjaHJVU3JjUHRyLCBkZXN0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJEc3RXLCBjLT5jaHJEaXRoZXI4LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHl1djJwbGFuZVgodkNockZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkNockZpbHRlclNpemUsIGNoclZTcmNQdHIsIGRlc3RbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNockRzdFcsIGMtPmNockRpdGhlcjgsIHVzZV9tbXhfdmZpbHRlciA/IChjLT51dl9vZmZ4MiA+PiAxKSA6IDMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGFscFBpeEJ1ZikgeworICAgICAgICAgICAgICAgICAgICBpZih1c2VfbW14X3ZmaWx0ZXIpeworICAgICAgICAgICAgICAgICAgICAgICAgdkx1bUZpbHRlcj0gKGludDE2X3QgKiljLT5hbHBNbXhGaWx0ZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZMdW1GaWx0ZXJTaXplID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHl1djJwbGFuZTEoYWxwU3JjUHRyWzBdLCBkZXN0WzNdLCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5sdW1EaXRoZXI4LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHl1djJwbGFuZVgodkx1bUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkx1bUZpbHRlclNpemUsIGFscFNyY1B0ciwgZGVzdFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VywgYy0+bHVtRGl0aGVyOCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHl1djJwYWNrZWRYKSB7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MShsdW1TcmNQdHIgICsgdkx1bUZpbHRlclNpemUgLSAxIDwgKGNvbnN0IGludDE2X3QgKiopbHVtUGl4QnVmICArIHZMdW1CdWZTaXplICogMik7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MShjaHJVU3JjUHRyICsgdkNockZpbHRlclNpemUgLSAxIDwgKGNvbnN0IGludDE2X3QgKiopY2hyVVBpeEJ1ZiArIHZDaHJCdWZTaXplICogMik7CisgICAgICAgICAgICAgICAgaWYgKGMtPnl1djJwYWNrZWQxICYmIHZMdW1GaWx0ZXJTaXplID09IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgdkNockZpbHRlclNpemUgPD0gMikgeyAvLyB1bnNjYWxlZCBSR0IKKyAgICAgICAgICAgICAgICAgICAgaW50IGNockFscGhhID0gdkNockZpbHRlclNpemUgPT0gMSA/IDAgOiB2Q2hyRmlsdGVyWzIgKiBkc3RZICsgMV07CisgICAgICAgICAgICAgICAgICAgIHl1djJwYWNrZWQxKGMsICpsdW1TcmNQdHIsIGNoclVTcmNQdHIsIGNoclZTcmNQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscFBpeEJ1ZiA/ICphbHBTcmNQdHIgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0WzBdLCBkc3RXLCBjaHJBbHBoYSwgZHN0WSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjLT55dXYycGFja2VkMiAmJiB2THVtRmlsdGVyU2l6ZSA9PSAyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2Q2hyRmlsdGVyU2l6ZSA9PSAyKSB7IC8vIGJpbGluZWFyIHVwc2NhbGUgUkdCCisgICAgICAgICAgICAgICAgICAgIGludCBsdW1BbHBoYSA9IHZMdW1GaWx0ZXJbMiAqIGRzdFkgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNockFscGhhID0gdkNockZpbHRlclsyICogZHN0WSArIDFdOworICAgICAgICAgICAgICAgICAgICBsdW1NbXhGaWx0ZXJbMl0gPQorICAgICAgICAgICAgICAgICAgICBsdW1NbXhGaWx0ZXJbM10gPSB2THVtRmlsdGVyWzIgKiBkc3RZXSAgICAqIDB4MTAwMDE7CisgICAgICAgICAgICAgICAgICAgIGNock1teEZpbHRlclsyXSA9CisgICAgICAgICAgICAgICAgICAgIGNock1teEZpbHRlclszXSA9IHZDaHJGaWx0ZXJbMiAqIGNockRzdFldICogMHgxMDAwMTsKKyAgICAgICAgICAgICAgICAgICAgeXV2MnBhY2tlZDIoYywgbHVtU3JjUHRyLCBjaHJVU3JjUHRyLCBjaHJWU3JjUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBQaXhCdWYgPyBhbHBTcmNQdHIgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0WzBdLCBkc3RXLCBsdW1BbHBoYSwgY2hyQWxwaGEsIGRzdFkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGdlbmVyYWwgUkdCCisgICAgICAgICAgICAgICAgICAgIHl1djJwYWNrZWRYKGMsIHZMdW1GaWx0ZXIgKyBkc3RZICogdkx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1bVNyY1B0ciwgdkx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZDaHJGaWx0ZXIgKyBkc3RZICogdkNockZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoclVTcmNQdHIsIGNoclZTcmNQdHIsIHZDaHJGaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBTcmNQdHIsIGRlc3RbMF0sIGRzdFcsIGRzdFkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MSgheXV2MnBhY2tlZDEgJiYgIXl1djJwYWNrZWQyKTsKKyAgICAgICAgICAgICAgICB5dXYyYW55WChjLCB2THVtRmlsdGVyICsgZHN0WSAqIHZMdW1GaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGx1bVNyY1B0ciwgdkx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdkNockZpbHRlciArIGRzdFkgKiB2Q2hyRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaHJVU3JjUHRyLCBjaHJWU3JjUHRyLCB2Q2hyRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbHBTcmNQdHIsIGRlc3QsIGRzdFcsIGRzdFkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChpc1BsYW5hcihkc3RGb3JtYXQpICYmIGlzQUxQSEEoZHN0Rm9ybWF0KSAmJiAhYWxwUGl4QnVmKSB7CisgICAgICAgIGludCBsZW5ndGggPSBkc3RXOworICAgICAgICBpbnQgaGVpZ2h0ID0gZHN0WSAtIGxhc3REc3RZOworCisgICAgICAgIGlmIChpczE2QlBTKGRzdEZvcm1hdCkgfHwgaXNOQlBTKGRzdEZvcm1hdCkpIHsKKyAgICAgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZHN0Rm9ybWF0KTsKKyAgICAgICAgICAgIGZpbGxQbGFuZTE2KGRzdFszXSwgZHN0U3RyaWRlWzNdLCBsZW5ndGgsIGhlaWdodCwgbGFzdERzdFksCisgICAgICAgICAgICAgICAgICAgIDEsIGRlc2MtPmNvbXBbM10uZGVwdGhfbWludXMxLAorICAgICAgICAgICAgICAgICAgICBpc0JFKGRzdEZvcm1hdCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGZpbGxQbGFuZShkc3RbM10sIGRzdFN0cmlkZVszXSwgbGVuZ3RoLCBoZWlnaHQsIGxhc3REc3RZLCAyNTUpOworICAgIH0KKworI2lmIEhBVkVfTU1YRVhUX0lOTElORQorICAgIGlmIChhdl9nZXRfY3B1X2ZsYWdzKCkgJiBBVl9DUFVfRkxBR19NTVhFWFQpCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCJzZmVuY2UiIDo6OiAibWVtb3J5Iik7CisjZW5kaWYKKyAgICBlbW1zX2MoKTsKKworICAgIC8qIHN0b3JlIGNoYW5nZWQgbG9jYWwgdmFycyBiYWNrIGluIHRoZSBjb250ZXh0ICovCisgICAgYy0+ZHN0WSAgICAgICAgID0gZHN0WTsKKyAgICBjLT5sdW1CdWZJbmRleCAgPSBsdW1CdWZJbmRleDsKKyAgICBjLT5jaHJCdWZJbmRleCAgPSBjaHJCdWZJbmRleDsKKyAgICBjLT5sYXN0SW5MdW1CdWYgPSBsYXN0SW5MdW1CdWY7CisgICAgYy0+bGFzdEluQ2hyQnVmID0gbGFzdEluQ2hyQnVmOworCisgICAgcmV0dXJuIGRzdFkgLSBsYXN0RHN0WTsKK30KKworYXZfY29sZCB2b2lkIGZmX3N3c19pbml0X3JhbmdlX2NvbnZlcnQoU3dzQ29udGV4dCAqYykKK3sKKyAgICBjLT5sdW1Db252ZXJ0UmFuZ2UgPSBOVUxMOworICAgIGMtPmNockNvbnZlcnRSYW5nZSA9IE5VTEw7CisgICAgaWYgKGMtPnNyY1JhbmdlICE9IGMtPmRzdFJhbmdlICYmICFpc0FueVJHQihjLT5kc3RGb3JtYXQpKSB7CisgICAgICAgIGlmIChjLT5kc3RCcGMgPD0gMTQpIHsKKyAgICAgICAgICAgIGlmIChjLT5zcmNSYW5nZSkgeworICAgICAgICAgICAgICAgIGMtPmx1bUNvbnZlcnRSYW5nZSA9IGx1bVJhbmdlRnJvbUpwZWdfYzsKKyAgICAgICAgICAgICAgICBjLT5jaHJDb252ZXJ0UmFuZ2UgPSBjaHJSYW5nZUZyb21KcGVnX2M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMtPmx1bUNvbnZlcnRSYW5nZSA9IGx1bVJhbmdlVG9KcGVnX2M7CisgICAgICAgICAgICAgICAgYy0+Y2hyQ29udmVydFJhbmdlID0gY2hyUmFuZ2VUb0pwZWdfYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjLT5zcmNSYW5nZSkgeworICAgICAgICAgICAgICAgIGMtPmx1bUNvbnZlcnRSYW5nZSA9IGx1bVJhbmdlRnJvbUpwZWcxNl9jOworICAgICAgICAgICAgICAgIGMtPmNockNvbnZlcnRSYW5nZSA9IGNoclJhbmdlRnJvbUpwZWcxNl9jOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjLT5sdW1Db252ZXJ0UmFuZ2UgPSBsdW1SYW5nZVRvSnBlZzE2X2M7CisgICAgICAgICAgICAgICAgYy0+Y2hyQ29udmVydFJhbmdlID0gY2hyUmFuZ2VUb0pwZWcxNl9jOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHN3c19pbml0X3N3c2NhbGUoU3dzQ29udGV4dCAqYykKK3sKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjRm9ybWF0ID0gYy0+c3JjRm9ybWF0OworCisgICAgZmZfc3dzX2luaXRfb3V0cHV0X2Z1bmNzKGMsICZjLT55dXYycGxhbmUxLCAmYy0+eXV2MnBsYW5lWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmMtPnl1djJudjEyY1gsICZjLT55dXYycGFja2VkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmMtPnl1djJwYWNrZWQyLCAmYy0+eXV2MnBhY2tlZFgsICZjLT55dXYyYW55WCk7CisKKyAgICBmZl9zd3NfaW5pdF9pbnB1dF9mdW5jcyhjKTsKKworCisgICAgaWYgKGMtPnNyY0JwYyA9PSA4KSB7CisgICAgICAgIGlmIChjLT5kc3RCcGMgPD0gMTQpIHsKKyAgICAgICAgICAgIGMtPmh5U2NhbGUgPSBjLT5oY1NjYWxlID0gaFNjYWxlOFRvMTVfYzsKKyAgICAgICAgICAgIGlmIChjLT5mbGFncyAmIFNXU19GQVNUX0JJTElORUFSKSB7CisgICAgICAgICAgICAgICAgYy0+aHlzY2FsZV9mYXN0ID0gZmZfaHlzY2FsZV9mYXN0X2M7CisgICAgICAgICAgICAgICAgYy0+aGNzY2FsZV9mYXN0ID0gZmZfaGNzY2FsZV9mYXN0X2M7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjLT5oeVNjYWxlID0gYy0+aGNTY2FsZSA9IGhTY2FsZThUbzE5X2M7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjLT5oeVNjYWxlID0gYy0+aGNTY2FsZSA9IGMtPmRzdEJwYyA+IDE0ID8gaFNjYWxlMTZUbzE5X2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGhTY2FsZTE2VG8xNV9jOworICAgIH0KKworICAgIGZmX3N3c19pbml0X3JhbmdlX2NvbnZlcnQoYyk7CisKKyAgICBpZiAoIShpc0dyYXkoc3JjRm9ybWF0KSB8fCBpc0dyYXkoYy0+ZHN0Rm9ybWF0KSB8fAorICAgICAgICAgIHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX01PTk9CTEFDSyB8fCBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9NT05PV0hJVEUpKQorICAgICAgICBjLT5uZWVkc19oY3NjYWxlID0gMTsKK30KKworU3dzRnVuYyBmZl9nZXRTd3NGdW5jKFN3c0NvbnRleHQgKmMpCit7CisgICAgc3dzX2luaXRfc3dzY2FsZShjKTsKKworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfc3dzX2luaXRfc3dzY2FsZV9wcGMoYyk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9zd3NfaW5pdF9zd3NjYWxlX3g4NihjKTsKKworICAgIHJldHVybiBzd3NjYWxlOworfQorCitzdGF0aWMgdm9pZCByZXNldF9wdHIoY29uc3QgdWludDhfdCAqc3JjW10sIGludCBmb3JtYXQpCit7CisgICAgaWYgKCFpc0FMUEhBKGZvcm1hdCkpCisgICAgICAgIHNyY1szXSA9IE5VTEw7CisgICAgaWYgKCFpc1BsYW5hcihmb3JtYXQpKSB7CisgICAgICAgIHNyY1szXSA9IHNyY1syXSA9IE5VTEw7CisKKyAgICAgICAgaWYgKCF1c2VQYWwoZm9ybWF0KSkKKyAgICAgICAgICAgIHNyY1sxXSA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNoZWNrX2ltYWdlX3BvaW50ZXJzKGNvbnN0IHVpbnQ4X3QgKiBjb25zdCBkYXRhWzRdLCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxpbmVzaXplc1s0XSkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpbnQgcGxhbmUgPSBkZXNjLT5jb21wW2ldLnBsYW5lOworICAgICAgICBpZiAoIWRhdGFbcGxhbmVdIHx8ICFsaW5lc2l6ZXNbcGxhbmVdKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHh5ejEyVG9yZ2I0OChzdHJ1Y3QgU3dzQ29udGV4dCAqYywgdWludDE2X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICBpbnQgeHAseXA7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChjLT5zcmNGb3JtYXQpOworCisgICAgZm9yICh5cD0wOyB5cDxoOyB5cCsrKSB7CisgICAgICAgIGZvciAoeHA9MDsgeHArMjxzdHJpZGU7IHhwKz0zKSB7CisgICAgICAgICAgICBpbnQgeCwgeSwgeiwgciwgZywgYjsKKworICAgICAgICAgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKSB7CisgICAgICAgICAgICAgICAgeCA9IEFWX1JCMTYoc3JjICsgeHAgKyAwKTsKKyAgICAgICAgICAgICAgICB5ID0gQVZfUkIxNihzcmMgKyB4cCArIDEpOworICAgICAgICAgICAgICAgIHogPSBBVl9SQjE2KHNyYyArIHhwICsgMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHggPSBBVl9STDE2KHNyYyArIHhwICsgMCk7CisgICAgICAgICAgICAgICAgeSA9IEFWX1JMMTYoc3JjICsgeHAgKyAxKTsKKyAgICAgICAgICAgICAgICB6ID0gQVZfUkwxNihzcmMgKyB4cCArIDIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB4ID0gYy0+eHl6Z2FtbWFbeD4+NF07CisgICAgICAgICAgICB5ID0gYy0+eHl6Z2FtbWFbeT4+NF07CisgICAgICAgICAgICB6ID0gYy0+eHl6Z2FtbWFbej4+NF07CisKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBYWVpsaW5lYXIgdG8gc1JHQmxpbmVhcgorICAgICAgICAgICAgciA9IGMtPnh5ejJyZ2JfbWF0cml4WzBdWzBdICogeCArCisgICAgICAgICAgICAgICAgYy0+eHl6MnJnYl9tYXRyaXhbMF1bMV0gKiB5ICsKKyAgICAgICAgICAgICAgICBjLT54eXoycmdiX21hdHJpeFswXVsyXSAqIHogPj4gMTI7CisgICAgICAgICAgICBnID0gYy0+eHl6MnJnYl9tYXRyaXhbMV1bMF0gKiB4ICsKKyAgICAgICAgICAgICAgICBjLT54eXoycmdiX21hdHJpeFsxXVsxXSAqIHkgKworICAgICAgICAgICAgICAgIGMtPnh5ejJyZ2JfbWF0cml4WzFdWzJdICogeiA+PiAxMjsKKyAgICAgICAgICAgIGIgPSBjLT54eXoycmdiX21hdHJpeFsyXVswXSAqIHggKworICAgICAgICAgICAgICAgIGMtPnh5ejJyZ2JfbWF0cml4WzJdWzFdICogeSArCisgICAgICAgICAgICAgICAgYy0+eHl6MnJnYl9tYXRyaXhbMl1bMl0gKiB6ID4+IDEyOworCisgICAgICAgICAgICAvLyBsaW1pdCB2YWx1ZXMgdG8gMTItYml0IGRlcHRoCisgICAgICAgICAgICByID0gYXZfY2xpcChyLCAwLCA0MDk1KTsKKyAgICAgICAgICAgIGcgPSBhdl9jbGlwKGcsIDAsIDQwOTUpOworICAgICAgICAgICAgYiA9IGF2X2NsaXAoYiwgMCwgNDA5NSk7CisKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBzUkdCbGluZWFyIHRvIFJHQiBhbmQgc2NhbGUgZnJvbSAxMmJpdCB0byAxNmJpdAorICAgICAgICAgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKSB7CisgICAgICAgICAgICAgICAgQVZfV0IxNihkc3QgKyB4cCArIDAsIGMtPnJnYmdhbW1hW3JdIDw8IDQpOworICAgICAgICAgICAgICAgIEFWX1dCMTYoZHN0ICsgeHAgKyAxLCBjLT5yZ2JnYW1tYVtnXSA8PCA0KTsKKyAgICAgICAgICAgICAgICBBVl9XQjE2KGRzdCArIHhwICsgMiwgYy0+cmdiZ2FtbWFbYl0gPDwgNCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFWX1dMMTYoZHN0ICsgeHAgKyAwLCBjLT5yZ2JnYW1tYVtyXSA8PCA0KTsKKyAgICAgICAgICAgICAgICBBVl9XTDE2KGRzdCArIHhwICsgMSwgYy0+cmdiZ2FtbWFbZ10gPDwgNCk7CisgICAgICAgICAgICAgICAgQVZfV0wxNihkc3QgKyB4cCArIDIsIGMtPnJnYmdhbW1hW2JdIDw8IDQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZ2I0OFRveHl6MTIoc3RydWN0IFN3c0NvbnRleHQgKmMsIHVpbnQxNl90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IHhwLHlwOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYy0+ZHN0Rm9ybWF0KTsKKworICAgIGZvciAoeXA9MDsgeXA8aDsgeXArKykgeworICAgICAgICBmb3IgKHhwPTA7IHhwKzI8c3RyaWRlOyB4cCs9MykgeworICAgICAgICAgICAgaW50IHgsIHksIHosIHIsIGcsIGI7CisKKyAgICAgICAgICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CRSkgeworICAgICAgICAgICAgICAgIHIgPSBBVl9SQjE2KHNyYyArIHhwICsgMCk7CisgICAgICAgICAgICAgICAgZyA9IEFWX1JCMTYoc3JjICsgeHAgKyAxKTsKKyAgICAgICAgICAgICAgICBiID0gQVZfUkIxNihzcmMgKyB4cCArIDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByID0gQVZfUkwxNihzcmMgKyB4cCArIDApOworICAgICAgICAgICAgICAgIGcgPSBBVl9STDE2KHNyYyArIHhwICsgMSk7CisgICAgICAgICAgICAgICAgYiA9IEFWX1JMMTYoc3JjICsgeHAgKyAyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgciA9IGMtPnJnYmdhbW1haW52W3I+PjRdOworICAgICAgICAgICAgZyA9IGMtPnJnYmdhbW1haW52W2c+PjRdOworICAgICAgICAgICAgYiA9IGMtPnJnYmdhbW1haW52W2I+PjRdOworCisgICAgICAgICAgICAvLyBjb252ZXJ0IGZyb20gc1JHQmxpbmVhciB0byBYWVpsaW5lYXIKKyAgICAgICAgICAgIHggPSBjLT5yZ2IyeHl6X21hdHJpeFswXVswXSAqIHIgKworICAgICAgICAgICAgICAgIGMtPnJnYjJ4eXpfbWF0cml4WzBdWzFdICogZyArCisgICAgICAgICAgICAgICAgYy0+cmdiMnh5el9tYXRyaXhbMF1bMl0gKiBiID4+IDEyOworICAgICAgICAgICAgeSA9IGMtPnJnYjJ4eXpfbWF0cml4WzFdWzBdICogciArCisgICAgICAgICAgICAgICAgYy0+cmdiMnh5el9tYXRyaXhbMV1bMV0gKiBnICsKKyAgICAgICAgICAgICAgICBjLT5yZ2IyeHl6X21hdHJpeFsxXVsyXSAqIGIgPj4gMTI7CisgICAgICAgICAgICB6ID0gYy0+cmdiMnh5el9tYXRyaXhbMl1bMF0gKiByICsKKyAgICAgICAgICAgICAgICBjLT5yZ2IyeHl6X21hdHJpeFsyXVsxXSAqIGcgKworICAgICAgICAgICAgICAgIGMtPnJnYjJ4eXpfbWF0cml4WzJdWzJdICogYiA+PiAxMjsKKworICAgICAgICAgICAgLy8gbGltaXQgdmFsdWVzIHRvIDEyLWJpdCBkZXB0aAorICAgICAgICAgICAgeCA9IGF2X2NsaXAoeCwgMCwgNDA5NSk7CisgICAgICAgICAgICB5ID0gYXZfY2xpcCh5LCAwLCA0MDk1KTsKKyAgICAgICAgICAgIHogPSBhdl9jbGlwKHosIDAsIDQwOTUpOworCisgICAgICAgICAgICAvLyBjb252ZXJ0IGZyb20gWFlabGluZWFyIHRvIFgnWSdaJyBhbmQgc2NhbGUgZnJvbSAxMmJpdCB0byAxNmJpdAorICAgICAgICAgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKSB7CisgICAgICAgICAgICAgICAgQVZfV0IxNihkc3QgKyB4cCArIDAsIGMtPnh5emdhbW1haW52W3hdIDw8IDQpOworICAgICAgICAgICAgICAgIEFWX1dCMTYoZHN0ICsgeHAgKyAxLCBjLT54eXpnYW1tYWludlt5XSA8PCA0KTsKKyAgICAgICAgICAgICAgICBBVl9XQjE2KGRzdCArIHhwICsgMiwgYy0+eHl6Z2FtbWFpbnZbel0gPDwgNCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFWX1dMMTYoZHN0ICsgeHAgKyAwLCBjLT54eXpnYW1tYWludlt4XSA8PCA0KTsKKyAgICAgICAgICAgICAgICBBVl9XTDE2KGRzdCArIHhwICsgMSwgYy0+eHl6Z2FtbWFpbnZbeV0gPDwgNCk7CisgICAgICAgICAgICAgICAgQVZfV0wxNihkc3QgKyB4cCArIDIsIGMtPnh5emdhbW1haW52W3pdIDw8IDQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCisvKioKKyAqIHN3c2NhbGUgd3JhcHBlciwgc28gd2UgZG9uJ3QgbmVlZCB0byBleHBvcnQgdGhlIFN3c0NvbnRleHQuCisgKiBBc3N1bWVzIHBsYW5hciBZVVYgdG8gYmUgaW4gWVVWIG9yZGVyIGluc3RlYWQgb2YgWVZVLgorICovCitpbnQgYXR0cmlidXRlX2FsaWduX2FyZyBzd3Nfc2NhbGUoc3RydWN0IFN3c0NvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IHNyY1NsaWNlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTbGljZUgsIHVpbnQ4X3QgKmNvbnN0IGRzdFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBpbnQgaSwgcmV0OworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzJbNF07CisgICAgdWludDhfdCAqZHN0Mls0XTsKKyAgICB1aW50OF90ICpyZ2IwX3RtcCA9IE5VTEw7CisKKyAgICBpZiAoIXNyY1N0cmlkZSB8fCAhZHN0U3RyaWRlIHx8ICFkc3QgfHwgIXNyY1NsaWNlKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJPbmUgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgdG8gc3dzX3NjYWxlKCkgaXMgTlVMTCwgcGxlYXNlIGNoZWNrIHRoZSBjYWxsaW5nIGNvZGVcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGMtPmNhc2NhZGVkX2NvbnRleHRbMF0gJiYgc3JjU2xpY2VZID09IDAgJiYgc3JjU2xpY2VIID09IGMtPmNhc2NhZGVkX2NvbnRleHRbMF0tPnNyY0gpIHsKKyAgICAgICAgcmV0ID0gc3dzX3NjYWxlKGMtPmNhc2NhZGVkX2NvbnRleHRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBzcmNTbGljZSwgc3JjU3RyaWRlLCBzcmNTbGljZVksIHNyY1NsaWNlSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNhc2NhZGVkX3RtcCwgYy0+Y2FzY2FkZWRfdG1wU3RyaWRlKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSBzd3Nfc2NhbGUoYy0+Y2FzY2FkZWRfY29udGV4dFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICogY29uc3QgKiApYy0+Y2FzY2FkZWRfdG1wLCBjLT5jYXNjYWRlZF90bXBTdHJpZGUsIDAsIGMtPmNhc2NhZGVkX2NvbnRleHRbMF0tPmRzdEgsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdFN0cmlkZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgbWVtY3B5KHNyYzIsIHNyY1NsaWNlLCBzaXplb2Yoc3JjMikpOworICAgIG1lbWNweShkc3QyLCBkc3QsIHNpemVvZihkc3QyKSk7CisKKyAgICAvLyBkbyBub3QgbWVzcyB1cCBzbGljZURpciBpZiB3ZSBoYXZlIGEgInRyYWlsaW5nIiAwLXNpemUgc2xpY2UKKyAgICBpZiAoc3JjU2xpY2VIID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFjaGVja19pbWFnZV9wb2ludGVycyhzcmNTbGljZSwgYy0+c3JjRm9ybWF0LCBzcmNTdHJpZGUpKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJiYWQgc3JjIGltYWdlIHBvaW50ZXJzXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghY2hlY2tfaW1hZ2VfcG9pbnRlcnMoKGNvbnN0IHVpbnQ4X3QqIGNvbnN0Kilkc3QsIGMtPmRzdEZvcm1hdCwgZHN0U3RyaWRlKSkgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiYmFkIGRzdCBpbWFnZSBwb2ludGVyc1xuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChjLT5zbGljZURpciA9PSAwICYmIHNyY1NsaWNlWSAhPSAwICYmIHNyY1NsaWNlWSArIHNyY1NsaWNlSCAhPSBjLT5zcmNIKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJTbGljZXMgc3RhcnQgaW4gdGhlIG1pZGRsZSFcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGMtPnNsaWNlRGlyID09IDApIHsKKyAgICAgICAgaWYgKHNyY1NsaWNlWSA9PSAwKSBjLT5zbGljZURpciA9IDE7IGVsc2UgYy0+c2xpY2VEaXIgPSAtMTsKKyAgICB9CisKKyAgICBpZiAodXNlUGFsKGMtPnNyY0Zvcm1hdCkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgciwgZywgYiwgeSwgdSwgdiwgYSA9IDB4ZmY7CisgICAgICAgICAgICBpZiAoYy0+c3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfUEFMOCkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHAgPSAoKGNvbnN0IHVpbnQzMl90ICopKHNyY1NsaWNlWzFdKSlbaV07CisgICAgICAgICAgICAgICAgYSA9IChwID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgciA9IChwID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgZyA9IChwID4+ICA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgYiA9ICBwICAgICAgICAmIDB4RkY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMtPnNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjgpIHsKKyAgICAgICAgICAgICAgICByID0gKCBpID4+IDUgICAgICkgKiAzNjsKKyAgICAgICAgICAgICAgICBnID0gKChpID4+IDIpICYgNykgKiAzNjsKKyAgICAgICAgICAgICAgICBiID0gKCBpICAgICAgICYgMykgKiA4NTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYy0+c3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSOCkgeworICAgICAgICAgICAgICAgIGIgPSAoIGkgPj4gNiAgICAgKSAqIDg1OworICAgICAgICAgICAgICAgIGcgPSAoKGkgPj4gMykgJiA3KSAqIDM2OworICAgICAgICAgICAgICAgIHIgPSAoIGkgICAgICAgJiA3KSAqIDM2OworICAgICAgICAgICAgfSBlbHNlIGlmIChjLT5zcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9SR0I0X0JZVEUpIHsKKyAgICAgICAgICAgICAgICByID0gKCBpID4+IDMgICAgICkgKiAyNTU7CisgICAgICAgICAgICAgICAgZyA9ICgoaSA+PiAxKSAmIDMpICogODU7CisgICAgICAgICAgICAgICAgYiA9ICggaSAgICAgICAmIDEpICogMjU1OworICAgICAgICAgICAgfSBlbHNlIGlmIChjLT5zcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9HUkFZOCB8fCBjLT5zcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9HUkFZOEEpIHsKKyAgICAgICAgICAgICAgICByID0gZyA9IGIgPSBpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQxKGMtPnNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0JHUjRfQllURSk7CisgICAgICAgICAgICAgICAgYiA9ICggaSA+PiAzICAgICApICogMjU1OworICAgICAgICAgICAgICAgIGcgPSAoKGkgPj4gMSkgJiAzKSAqIDg1OworICAgICAgICAgICAgICAgIHIgPSAoIGkgICAgICAgJiAxKSAqIDI1NTsKKyAgICAgICAgICAgIH0KKyNkZWZpbmUgUkdCMllVVl9TSElGVCAxNQorI2RlZmluZSBCWSAoIChpbnQpICgwLjExNCAqIDIxOSAvIDI1NSAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKyNkZWZpbmUgQlYgKC0oaW50KSAoMC4wODEgKiAyMjQgLyAyNTUgKiAoMSA8PCBSR0IyWVVWX1NISUZUKSArIDAuNSkpCisjZGVmaW5lIEJVICggKGludCkgKDAuNTAwICogMjI0IC8gMjU1ICogKDEgPDwgUkdCMllVVl9TSElGVCkgKyAwLjUpKQorI2RlZmluZSBHWSAoIChpbnQpICgwLjU4NyAqIDIxOSAvIDI1NSAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKyNkZWZpbmUgR1YgKC0oaW50KSAoMC40MTkgKiAyMjQgLyAyNTUgKiAoMSA8PCBSR0IyWVVWX1NISUZUKSArIDAuNSkpCisjZGVmaW5lIEdVICgtKGludCkgKDAuMzMxICogMjI0IC8gMjU1ICogKDEgPDwgUkdCMllVVl9TSElGVCkgKyAwLjUpKQorI2RlZmluZSBSWSAoIChpbnQpICgwLjI5OSAqIDIxOSAvIDI1NSAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSkKKyNkZWZpbmUgUlYgKCAoaW50KSAoMC41MDAgKiAyMjQgLyAyNTUgKiAoMSA8PCBSR0IyWVVWX1NISUZUKSArIDAuNSkpCisjZGVmaW5lIFJVICgtKGludCkgKDAuMTY5ICogMjI0IC8gMjU1ICogKDEgPDwgUkdCMllVVl9TSElGVCkgKyAwLjUpKQorCisgICAgICAgICAgICB5ID0gYXZfY2xpcF91aW50OCgoUlkgKiByICsgR1kgKiBnICsgQlkgKiBiICsgKCAzMyA8PCAoUkdCMllVVl9TSElGVCAtIDEpKSkgPj4gUkdCMllVVl9TSElGVCk7CisgICAgICAgICAgICB1ID0gYXZfY2xpcF91aW50OCgoUlUgKiByICsgR1UgKiBnICsgQlUgKiBiICsgKDI1NyA8PCAoUkdCMllVVl9TSElGVCAtIDEpKSkgPj4gUkdCMllVVl9TSElGVCk7CisgICAgICAgICAgICB2ID0gYXZfY2xpcF91aW50OCgoUlYgKiByICsgR1YgKiBnICsgQlYgKiBiICsgKDI1NyA8PCAoUkdCMllVVl9TSElGVCAtIDEpKSkgPj4gUkdCMllVVl9TSElGVCk7CisgICAgICAgICAgICBjLT5wYWxfeXV2W2ldPSB5ICsgKHU8PDgpICsgKHY8PDE2KSArICgodW5zaWduZWQpYTw8MjQpOworCisgICAgICAgICAgICBzd2l0Y2ggKGMtPmRzdEZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjMyOgorI2lmICFIQVZFX0JJR0VORElBTgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgorI2VuZGlmCisgICAgICAgICAgICAgICAgYy0+cGFsX3JnYltpXT0gIHIgKyAoZzw8OCkgKyAoYjw8MTYpICsgKCh1bnNpZ25lZClhPDwyNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMzJfMToKKyNpZiBIQVZFX0JJR0VORElBTgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorI2VuZGlmCisgICAgICAgICAgICAgICAgYy0+cGFsX3JnYltpXT0gYSArIChyPDw4KSArIChnPDwxNikgKyAoKHVuc2lnbmVkKWI8PDI0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMl8xOgorI2lmIEhBVkVfQklHRU5ESUFOCisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisjZW5kaWYKKyAgICAgICAgICAgICAgICBjLT5wYWxfcmdiW2ldPSBhICsgKGI8PDgpICsgKGc8PDE2KSArICgodW5zaWduZWQpcjw8MjQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjMyOgorI2lmICFIQVZFX0JJR0VORElBTgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorI2VuZGlmCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGMtPnBhbF9yZ2JbaV09ICBiICsgKGc8PDgpICsgKHI8PDE2KSArICgodW5zaWduZWQpYTw8MjQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGMtPnNyYzBBbHBoYSAmJiAhYy0+ZHN0MEFscGhhICYmIGlzQUxQSEEoYy0+ZHN0Rm9ybWF0KSkgeworICAgICAgICB1aW50OF90ICpiYXNlOworICAgICAgICBpbnQgeCx5OworICAgICAgICByZ2IwX3RtcCA9IGF2X21hbGxvYyhGRkFCUyhzcmNTdHJpZGVbMF0pICogc3JjU2xpY2VIICsgMzIpOworICAgICAgICBpZiAoIXJnYjBfdG1wKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBiYXNlID0gc3JjU3RyaWRlWzBdIDwgMCA/IHJnYjBfdG1wIC0gc3JjU3RyaWRlWzBdICogKHNyY1NsaWNlSC0xKSA6IHJnYjBfdG1wOworICAgICAgICBmb3IgKHk9MDsgeTxzcmNTbGljZUg7IHkrKyl7CisgICAgICAgICAgICBtZW1jcHkoYmFzZSArIHNyY1N0cmlkZVswXSp5LCBzcmMyWzBdICsgc3JjU3RyaWRlWzBdKnksIDQqYy0+c3JjVyk7CisgICAgICAgICAgICBmb3IgKHg9Yy0+c3JjMEFscGhhLTE7IHg8NCpjLT5zcmNXOyB4Kz00KSB7CisgICAgICAgICAgICAgICAgYmFzZVsgc3JjU3RyaWRlWzBdKnkgKyB4XSA9IDB4RkY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3JjMlswXSA9IGJhc2U7CisgICAgfQorCisgICAgaWYgKGMtPnNyY1hZWiAmJiAhKGMtPmRzdFhZWiAmJiBjLT5zcmNXPT1jLT5kc3RXICYmIGMtPnNyY0g9PWMtPmRzdEgpKSB7CisgICAgICAgIHVpbnQ4X3QgKmJhc2U7CisgICAgICAgIHJnYjBfdG1wID0gYXZfbWFsbG9jKEZGQUJTKHNyY1N0cmlkZVswXSkgKiBzcmNTbGljZUggKyAzMik7CisgICAgICAgIGlmICghcmdiMF90bXApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGJhc2UgPSBzcmNTdHJpZGVbMF0gPCAwID8gcmdiMF90bXAgLSBzcmNTdHJpZGVbMF0gKiAoc3JjU2xpY2VILTEpIDogcmdiMF90bXA7CisKKyAgICAgICAgeHl6MTJUb3JnYjQ4KGMsICh1aW50MTZfdCopYmFzZSwgKGNvbnN0IHVpbnQxNl90KilzcmMyWzBdLCBzcmNTdHJpZGVbMF0vMiwgc3JjU2xpY2VIKTsKKyAgICAgICAgc3JjMlswXSA9IGJhc2U7CisgICAgfQorCisgICAgaWYgKCFzcmNTbGljZVkgJiYgKGMtPmZsYWdzICYgU1dTX0JJVEVYQUNUKSAmJiBjLT5kaXRoZXIgPT0gU1dTX0RJVEhFUl9FRCAmJiBjLT5kaXRoZXJfZXJyb3JbMF0pCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBtZW1zZXQoYy0+ZGl0aGVyX2Vycm9yW2ldLCAwLCBzaXplb2YoYy0+ZGl0aGVyX2Vycm9yWzBdWzBdKSAqIChjLT5kc3RXKzIpKTsKKworCisgICAgLy8gY29weSBzdHJpZGVzLCBzbyB0aGV5IGNhbiBzYWZlbHkgYmUgbW9kaWZpZWQKKyAgICBpZiAoYy0+c2xpY2VEaXIgPT0gMSkgeworICAgICAgICAvLyBzbGljZXMgZ28gZnJvbSB0b3AgdG8gYm90dG9tCisgICAgICAgIGludCBzcmNTdHJpZGUyWzRdID0geyBzcmNTdHJpZGVbMF0sIHNyY1N0cmlkZVsxXSwgc3JjU3RyaWRlWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RyaWRlWzNdIH07CisgICAgICAgIGludCBkc3RTdHJpZGUyWzRdID0geyBkc3RTdHJpZGVbMF0sIGRzdFN0cmlkZVsxXSwgZHN0U3RyaWRlWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RyaWRlWzNdIH07CisKKyAgICAgICAgcmVzZXRfcHRyKHNyYzIsIGMtPnNyY0Zvcm1hdCk7CisgICAgICAgIHJlc2V0X3B0cigodm9pZCopZHN0MiwgYy0+ZHN0Rm9ybWF0KTsKKworICAgICAgICAvKiByZXNldCBzbGljZSBkaXJlY3Rpb24gYXQgZW5kIG9mIGZyYW1lICovCisgICAgICAgIGlmIChzcmNTbGljZVkgKyBzcmNTbGljZUggPT0gYy0+c3JjSCkKKyAgICAgICAgICAgIGMtPnNsaWNlRGlyID0gMDsKKworICAgICAgICByZXQgPSBjLT5zd3NjYWxlKGMsIHNyYzIsIHNyY1N0cmlkZTIsIHNyY1NsaWNlWSwgc3JjU2xpY2VILCBkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdHJpZGUyKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBzbGljZXMgZ28gZnJvbSBib3R0b20gdG8gdG9wID0+IHdlIGZsaXAgdGhlIGltYWdlIGludGVybmFsbHkKKyAgICAgICAgaW50IHNyY1N0cmlkZTJbNF0gPSB7IC1zcmNTdHJpZGVbMF0sIC1zcmNTdHJpZGVbMV0sIC1zcmNTdHJpZGVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc3JjU3RyaWRlWzNdIH07CisgICAgICAgIGludCBkc3RTdHJpZGUyWzRdID0geyAtZHN0U3RyaWRlWzBdLCAtZHN0U3RyaWRlWzFdLCAtZHN0U3RyaWRlWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWRzdFN0cmlkZVszXSB9OworCisgICAgICAgIHNyYzJbMF0gKz0gKHNyY1NsaWNlSCAtIDEpICogc3JjU3RyaWRlWzBdOworICAgICAgICBpZiAoIXVzZVBhbChjLT5zcmNGb3JtYXQpKQorICAgICAgICAgICAgc3JjMlsxXSArPSAoKHNyY1NsaWNlSCA+PiBjLT5jaHJTcmNWU3ViU2FtcGxlKSAtIDEpICogc3JjU3RyaWRlWzFdOworICAgICAgICBzcmMyWzJdICs9ICgoc3JjU2xpY2VIID4+IGMtPmNoclNyY1ZTdWJTYW1wbGUpIC0gMSkgKiBzcmNTdHJpZGVbMl07CisgICAgICAgIHNyYzJbM10gKz0gKHNyY1NsaWNlSCAtIDEpICogc3JjU3RyaWRlWzNdOworICAgICAgICBkc3QyWzBdICs9ICggYy0+ZHN0SCAgICAgICAgICAgICAgICAgICAgICAgICAtIDEpICogZHN0U3RyaWRlWzBdOworICAgICAgICBkc3QyWzFdICs9ICgoYy0+ZHN0SCA+PiBjLT5jaHJEc3RWU3ViU2FtcGxlKSAtIDEpICogZHN0U3RyaWRlWzFdOworICAgICAgICBkc3QyWzJdICs9ICgoYy0+ZHN0SCA+PiBjLT5jaHJEc3RWU3ViU2FtcGxlKSAtIDEpICogZHN0U3RyaWRlWzJdOworICAgICAgICBkc3QyWzNdICs9ICggYy0+ZHN0SCAgICAgICAgICAgICAgICAgICAgICAgICAtIDEpICogZHN0U3RyaWRlWzNdOworCisgICAgICAgIHJlc2V0X3B0cihzcmMyLCBjLT5zcmNGb3JtYXQpOworICAgICAgICByZXNldF9wdHIoKHZvaWQqKWRzdDIsIGMtPmRzdEZvcm1hdCk7CisKKyAgICAgICAgLyogcmVzZXQgc2xpY2UgZGlyZWN0aW9uIGF0IGVuZCBvZiBmcmFtZSAqLworICAgICAgICBpZiAoIXNyY1NsaWNlWSkKKyAgICAgICAgICAgIGMtPnNsaWNlRGlyID0gMDsKKworICAgICAgICByZXQgPSBjLT5zd3NjYWxlKGMsIHNyYzIsIHNyY1N0cmlkZTIsIGMtPnNyY0gtc3JjU2xpY2VZLXNyY1NsaWNlSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU2xpY2VILCBkc3QyLCBkc3RTdHJpZGUyKTsKKyAgICB9CisKKworICAgIGlmIChjLT5kc3RYWVogJiYgIShjLT5zcmNYWVogJiYgYy0+c3JjVz09Yy0+ZHN0VyAmJiBjLT5zcmNIPT1jLT5kc3RIKSkgeworICAgICAgICAvKiByZXBsYWNlIG9uIHRoZSBzYW1lIGRhdGEgKi8KKyAgICAgICAgcmdiNDhUb3h5ejEyKGMsICh1aW50MTZfdCopZHN0MlswXSwgKGNvbnN0IHVpbnQxNl90Kilkc3QyWzBdLCBkc3RTdHJpZGVbMF0vMiwgcmV0KTsKKyAgICB9CisKKyAgICBhdl9mcmVlKHJnYjBfdG1wKTsKKyAgICByZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS9zd3NjYWxlLmggYi9mZm1wZWcvbGlic3dzY2FsZS9zd3NjYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzZTEyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL3N3c2NhbGUuaApAQCAtMCwwICsxLDM1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgU1dTQ0FMRV9TV1NDQUxFX0gKKyNkZWZpbmUgU1dTQ0FMRV9TV1NDQUxFX0gKKworLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbGlic3dzCisgKiBleHRlcm5hbCBBUEkgaGVhZGVyCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisvKioKKyAqIEBkZWZncm91cCBsaWJzd3MgQ29sb3IgY29udmVyc2lvbiBhbmQgc2NhbGluZworICogQHsKKyAqCisgKiBSZXR1cm4gdGhlIExJQlNXU0NBTEVfVkVSU0lPTl9JTlQgY29uc3RhbnQuCisgKi8KK3Vuc2lnbmVkIHN3c2NhbGVfdmVyc2lvbih2b2lkKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGxpYnN3c2NhbGUgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uLgorICovCitjb25zdCBjaGFyICpzd3NjYWxlX2NvbmZpZ3VyYXRpb24odm9pZCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBsaWJzd3NjYWxlIGxpY2Vuc2UuCisgKi8KK2NvbnN0IGNoYXIgKnN3c2NhbGVfbGljZW5zZSh2b2lkKTsKKworLyogdmFsdWVzIGZvciB0aGUgZmxhZ3MsIHRoZSBzdHVmZiBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIGRpZmZlcmVudCAqLworI2RlZmluZSBTV1NfRkFTVF9CSUxJTkVBUiAgICAgMQorI2RlZmluZSBTV1NfQklMSU5FQVIgICAgICAgICAgMgorI2RlZmluZSBTV1NfQklDVUJJQyAgICAgICAgICAgNAorI2RlZmluZSBTV1NfWCAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBTV1NfUE9JTlQgICAgICAgICAgMHgxMAorI2RlZmluZSBTV1NfQVJFQSAgICAgICAgICAgMHgyMAorI2RlZmluZSBTV1NfQklDVUJMSU4gICAgICAgMHg0MAorI2RlZmluZSBTV1NfR0FVU1MgICAgICAgICAgMHg4MAorI2RlZmluZSBTV1NfU0lOQyAgICAgICAgICAweDEwMAorI2RlZmluZSBTV1NfTEFOQ1pPUyAgICAgICAweDIwMAorI2RlZmluZSBTV1NfU1BMSU5FICAgICAgICAweDQwMAorCisjZGVmaW5lIFNXU19TUkNfVl9DSFJfRFJPUF9NQVNLICAgICAweDMwMDAwCisjZGVmaW5lIFNXU19TUkNfVl9DSFJfRFJPUF9TSElGVCAgICAxNgorCisjZGVmaW5lIFNXU19QQVJBTV9ERUZBVUxUICAgICAgICAgICAxMjM0NTYKKworI2RlZmluZSBTV1NfUFJJTlRfSU5GTyAgICAgICAgICAgICAgMHgxMDAwCisKKy8vdGhlIGZvbGxvd2luZyAzIGZsYWdzIGFyZSBub3QgY29tcGxldGVseSBpbXBsZW1lbnRlZAorLy9pbnRlcm5hbCBjaHJvbWluYWNlIHN1YnNhbXBsaW5nIGluZm8KKyNkZWZpbmUgU1dTX0ZVTExfQ0hSX0hfSU5UICAgIDB4MjAwMAorLy9pbnB1dCBzdWJzYW1wbGluZyBpbmZvCisjZGVmaW5lIFNXU19GVUxMX0NIUl9IX0lOUCAgICAweDQwMDAKKyNkZWZpbmUgU1dTX0RJUkVDVF9CR1IgICAgICAgIDB4ODAwMAorI2RlZmluZSBTV1NfQUNDVVJBVEVfUk5EICAgICAgMHg0MDAwMAorI2RlZmluZSBTV1NfQklURVhBQ1QgICAgICAgICAgMHg4MDAwMAorI2RlZmluZSBTV1NfRVJST1JfRElGRlVTSU9OICAweDgwMDAwMAorCisjaWYgRkZfQVBJX1NXU19DUFVfQ0FQUworLyoqCisgKiBDUFUgY2FwcyBhcmUgYXV0b2RldGVjdGVkIG5vdywgdGhvc2UgZmxhZ3MKKyAqIGFyZSBvbmx5IHByb3ZpZGVkIGZvciBBUEkgY29tcGF0aWJpbGl0eS4KKyAqLworI2RlZmluZSBTV1NfQ1BVX0NBUFNfTU1YICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBTV1NfQ1BVX0NBUFNfTU1YRVhUICAgMHgyMDAwMDAwMAorI2RlZmluZSBTV1NfQ1BVX0NBUFNfTU1YMiAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBTV1NfQ1BVX0NBUFNfM0ROT1cgICAgMHg0MDAwMDAwMAorI2RlZmluZSBTV1NfQ1BVX0NBUFNfQUxUSVZFQyAgMHgxMDAwMDAwMAorI2lmIEZGX0FQSV9BUkNIX0JGSU4KKyNkZWZpbmUgU1dTX0NQVV9DQVBTX0JGSU4gICAgIDB4MDEwMDAwMDAKKyNlbmRpZgorI2RlZmluZSBTV1NfQ1BVX0NBUFNfU1NFMiAgICAgMHgwMjAwMDAwMAorI2VuZGlmCisKKyNkZWZpbmUgU1dTX01BWF9SRURVQ0VfQ1VUT0ZGIDAuMDAyCisKKyNkZWZpbmUgU1dTX0NTX0lUVTcwOSAgICAgICAgIDEKKyNkZWZpbmUgU1dTX0NTX0ZDQyAgICAgICAgICAgIDQKKyNkZWZpbmUgU1dTX0NTX0lUVTYwMSAgICAgICAgIDUKKyNkZWZpbmUgU1dTX0NTX0lUVTYyNCAgICAgICAgIDUKKyNkZWZpbmUgU1dTX0NTX1NNUFRFMTcwTSAgICAgIDUKKyNkZWZpbmUgU1dTX0NTX1NNUFRFMjQwTSAgICAgIDcKKyNkZWZpbmUgU1dTX0NTX0RFRkFVTFQgICAgICAgIDUKKworLyoqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHl1djwtPnJnYiBjb2VmZmljaWVudHMgZm9yIHRoZSBnaXZlbiBjb2xvcnNwYWNlCisgKiBzdWl0YWJsZSBmb3Igc3dzX3NldENvbG9yc3BhY2VEZXRhaWxzKCkuCisgKgorICogQHBhcmFtIGNvbG9yc3BhY2UgT25lIG9mIHRoZSBTV1NfQ1NfKiBtYWNyb3MuIElmIGludmFsaWQsCisgKiBTV1NfQ1NfREVGQVVMVCBpcyB1c2VkLgorICovCitjb25zdCBpbnQgKnN3c19nZXRDb2VmZmljaWVudHMoaW50IGNvbG9yc3BhY2UpOworCisvLyB3aGVuIHVzZWQgZm9yIGZpbHRlcnMgdGhleSBtdXN0IGhhdmUgYW4gb2RkIG51bWJlciBvZiBlbGVtZW50cworLy8gY29lZmZzIGNhbm5vdCBiZSBzaGFyZWQgYmV0d2VlbiB2ZWN0b3JzCit0eXBlZGVmIHN0cnVjdCBTd3NWZWN0b3IgeworICAgIGRvdWJsZSAqY29lZmY7ICAgICAgICAgICAgICAvLy88IHBvaW50ZXIgdG8gdGhlIGxpc3Qgb2YgY29lZmZpY2llbnRzCisgICAgaW50IGxlbmd0aDsgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpbiB0aGUgdmVjdG9yCit9IFN3c1ZlY3RvcjsKKworLy8gdmVjdG9ycyBjYW4gYmUgc2hhcmVkCit0eXBlZGVmIHN0cnVjdCBTd3NGaWx0ZXIgeworICAgIFN3c1ZlY3RvciAqbHVtSDsKKyAgICBTd3NWZWN0b3IgKmx1bVY7CisgICAgU3dzVmVjdG9yICpjaHJIOworICAgIFN3c1ZlY3RvciAqY2hyVjsKK30gU3dzRmlsdGVyOworCitzdHJ1Y3QgU3dzQ29udGV4dDsKKworLyoqCisgKiBSZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZSBpZiBwaXhfZm10IGlzIGEgc3VwcG9ydGVkIGlucHV0IGZvcm1hdCwgMAorICogb3RoZXJ3aXNlLgorICovCitpbnQgc3dzX2lzU3VwcG9ydGVkSW5wdXQoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpOworCisvKioKKyAqIFJldHVybiBhIHBvc2l0aXZlIHZhbHVlIGlmIHBpeF9mbXQgaXMgYSBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCwgMAorICogb3RoZXJ3aXNlLgorICovCitpbnQgc3dzX2lzU3VwcG9ydGVkT3V0cHV0KGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KTsKKworLyoqCisgKiBAcGFyYW1baW5dICBwaXhfZm10IHRoZSBwaXhlbCBmb3JtYXQKKyAqIEByZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZSBpZiBhbiBlbmRpYW5uZXNzIGNvbnZlcnNpb24gZm9yIHBpeF9mbXQgaXMKKyAqIHN1cHBvcnRlZCwgMCBvdGhlcndpc2UuCisgKi8KK2ludCBzd3NfaXNTdXBwb3J0ZWRFbmRpYW5uZXNzQ29udmVyc2lvbihlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCk7CisKKy8qKgorICogQWxsb2NhdGUgYW4gZW1wdHkgU3dzQ29udGV4dC4gVGhpcyBtdXN0IGJlIGZpbGxlZCBhbmQgcGFzc2VkIHRvCisgKiBzd3NfaW5pdF9jb250ZXh0KCkuIEZvciBmaWxsaW5nIHNlZSBBVk9wdGlvbnMsIG9wdGlvbnMuYyBhbmQKKyAqIHN3c19zZXRDb2xvcnNwYWNlRGV0YWlscygpLgorICovCitzdHJ1Y3QgU3dzQ29udGV4dCAqc3dzX2FsbG9jX2NvbnRleHQodm9pZCk7CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgc3dzY2FsZXIgY29udGV4dCBzd3NfY29udGV4dC4KKyAqCisgKiBAcmV0dXJuIHplcm8gb3IgcG9zaXRpdmUgdmFsdWUgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSB2YWx1ZSBvbgorICogZXJyb3IKKyAqLworaW50IHN3c19pbml0X2NvbnRleHQoc3RydWN0IFN3c0NvbnRleHQgKnN3c19jb250ZXh0LCBTd3NGaWx0ZXIgKnNyY0ZpbHRlciwgU3dzRmlsdGVyICpkc3RGaWx0ZXIpOworCisvKioKKyAqIEZyZWUgdGhlIHN3c2NhbGVyIGNvbnRleHQgc3dzQ29udGV4dC4KKyAqIElmIHN3c0NvbnRleHQgaXMgTlVMTCwgdGhlbiBkb2VzIG5vdGhpbmcuCisgKi8KK3ZvaWQgc3dzX2ZyZWVDb250ZXh0KHN0cnVjdCBTd3NDb250ZXh0ICpzd3NDb250ZXh0KTsKKworLyoqCisgKiBBbGxvY2F0ZSBhbmQgcmV0dXJuIGFuIFN3c0NvbnRleHQuIFlvdSBuZWVkIGl0IHRvIHBlcmZvcm0KKyAqIHNjYWxpbmcvY29udmVyc2lvbiBvcGVyYXRpb25zIHVzaW5nIHN3c19zY2FsZSgpLgorICoKKyAqIEBwYXJhbSBzcmNXIHRoZSB3aWR0aCBvZiB0aGUgc291cmNlIGltYWdlCisgKiBAcGFyYW0gc3JjSCB0aGUgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgaW1hZ2UKKyAqIEBwYXJhbSBzcmNGb3JtYXQgdGhlIHNvdXJjZSBpbWFnZSBmb3JtYXQKKyAqIEBwYXJhbSBkc3RXIHRoZSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UKKyAqIEBwYXJhbSBkc3RIIHRoZSBoZWlnaHQgb2YgdGhlIGRlc3RpbmF0aW9uIGltYWdlCisgKiBAcGFyYW0gZHN0Rm9ybWF0IHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBmb3JtYXQKKyAqIEBwYXJhbSBmbGFncyBzcGVjaWZ5IHdoaWNoIGFsZ29yaXRobSBhbmQgb3B0aW9ucyB0byB1c2UgZm9yIHJlc2NhbGluZworICogQHJldHVybiBhIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIGNvbnRleHQsIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgorICogQG5vdGUgdGhpcyBmdW5jdGlvbiBpcyB0byBiZSByZW1vdmVkIGFmdGVyIGEgc2FuZXIgYWx0ZXJuYXRpdmUgaXMKKyAqICAgICAgIHdyaXR0ZW4KKyAqLworc3RydWN0IFN3c0NvbnRleHQgKnN3c19nZXRDb250ZXh0KGludCBzcmNXLCBpbnQgc3JjSCwgZW51bSBBVlBpeGVsRm9ybWF0IHNyY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0VywgaW50IGRzdEgsIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBTd3NGaWx0ZXIgKnNyY0ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd3NGaWx0ZXIgKmRzdEZpbHRlciwgY29uc3QgZG91YmxlICpwYXJhbSk7CisKKy8qKgorICogU2NhbGUgdGhlIGltYWdlIHNsaWNlIGluIHNyY1NsaWNlIGFuZCBwdXQgdGhlIHJlc3VsdGluZyBzY2FsZWQKKyAqIHNsaWNlIGluIHRoZSBpbWFnZSBpbiBkc3QuIEEgc2xpY2UgaXMgYSBzZXF1ZW5jZSBvZiBjb25zZWN1dGl2ZQorICogcm93cyBpbiBhbiBpbWFnZS4KKyAqCisgKiBTbGljZXMgaGF2ZSB0byBiZSBwcm92aWRlZCBpbiBzZXF1ZW50aWFsIG9yZGVyLCBlaXRoZXIgaW4KKyAqIHRvcC1ib3R0b20gb3IgYm90dG9tLXRvcCBvcmRlci4gSWYgc2xpY2VzIGFyZSBwcm92aWRlZCBpbgorICogbm9uLXNlcXVlbnRpYWwgb3JkZXIgdGhlIGJlaGF2aW9yIG9mIHRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuCisgKgorICogQHBhcmFtIGMgICAgICAgICB0aGUgc2NhbGluZyBjb250ZXh0IHByZXZpb3VzbHkgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgIHN3c19nZXRDb250ZXh0KCkKKyAqIEBwYXJhbSBzcmNTbGljZSAgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHBvaW50ZXJzIHRvIHRoZSBwbGFuZXMgb2YKKyAqICAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBzbGljZQorICogQHBhcmFtIHNyY1N0cmlkZSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgc3RyaWRlcyBmb3IgZWFjaCBwbGFuZSBvZgorICogICAgICAgICAgICAgICAgICB0aGUgc291cmNlIGltYWdlCisgKiBAcGFyYW0gc3JjU2xpY2VZIHRoZSBwb3NpdGlvbiBpbiB0aGUgc291cmNlIGltYWdlIG9mIHRoZSBzbGljZSB0bworICogICAgICAgICAgICAgICAgICBwcm9jZXNzLCB0aGF0IGlzIHRoZSBudW1iZXIgKGNvdW50ZWQgc3RhcnRpbmcgZnJvbQorICogICAgICAgICAgICAgICAgICB6ZXJvKSBpbiB0aGUgaW1hZ2Ugb2YgdGhlIGZpcnN0IHJvdyBvZiB0aGUgc2xpY2UKKyAqIEBwYXJhbSBzcmNTbGljZUggdGhlIGhlaWdodCBvZiB0aGUgc291cmNlIHNsaWNlLCB0aGF0IGlzIHRoZSBudW1iZXIKKyAqICAgICAgICAgICAgICAgICAgb2Ygcm93cyBpbiB0aGUgc2xpY2UKKyAqIEBwYXJhbSBkc3QgICAgICAgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHBvaW50ZXJzIHRvIHRoZSBwbGFuZXMgb2YKKyAqICAgICAgICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGltYWdlCisgKiBAcGFyYW0gZHN0U3RyaWRlIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBzdHJpZGVzIGZvciBlYWNoIHBsYW5lIG9mCisgKiAgICAgICAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBpbWFnZQorICogQHJldHVybiAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBvdXRwdXQgc2xpY2UKKyAqLworaW50IHN3c19zY2FsZShzdHJ1Y3QgU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqY29uc3Qgc3JjU2xpY2VbXSwKKyAgICAgICAgICAgICAgY29uc3QgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICB1aW50OF90ICpjb25zdCBkc3RbXSwgY29uc3QgaW50IGRzdFN0cmlkZVtdKTsKKworLyoqCisgKiBAcGFyYW0gZHN0UmFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoZSB3aGlsZS1ibGFjayByYW5nZSBvZiB0aGUgb3V0cHV0ICgxPWpwZWcgLyAwPW1wZWcpCisgKiBAcGFyYW0gc3JjUmFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoZSB3aGlsZS1ibGFjayByYW5nZSBvZiB0aGUgaW5wdXQgKDE9anBlZyAvIDA9bXBlZykKKyAqIEBwYXJhbSB0YWJsZSB0aGUgeXV2MnJnYiBjb2VmZmljaWVudHMgZGVzY3JpYmluZyB0aGUgb3V0cHV0IHl1diBzcGFjZSwgbm9ybWFsbHkgZmZfeXV2MnJnYl9jb2VmZnNbeF0KKyAqIEBwYXJhbSBpbnZfdGFibGUgdGhlIHl1djJyZ2IgY29lZmZpY2llbnRzIGRlc2NyaWJpbmcgdGhlIGlucHV0IHl1diBzcGFjZSwgbm9ybWFsbHkgZmZfeXV2MnJnYl9jb2VmZnNbeF0KKyAqIEBwYXJhbSBicmlnaHRuZXNzIDE2LjE2IGZpeGVkIHBvaW50IGJyaWdodG5lc3MgY29ycmVjdGlvbgorICogQHBhcmFtIGNvbnRyYXN0IDE2LjE2IGZpeGVkIHBvaW50IGNvbnRyYXN0IGNvcnJlY3Rpb24KKyAqIEBwYXJhbSBzYXR1cmF0aW9uIDE2LjE2IGZpeGVkIHBvaW50IHNhdHVyYXRpb24gY29ycmVjdGlvbgorICogQHJldHVybiAtMSBpZiBub3Qgc3VwcG9ydGVkCisgKi8KK2ludCBzd3Nfc2V0Q29sb3JzcGFjZURldGFpbHMoc3RydWN0IFN3c0NvbnRleHQgKmMsIGNvbnN0IGludCBpbnZfdGFibGVbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNSYW5nZSwgY29uc3QgaW50IHRhYmxlWzRdLCBpbnQgZHN0UmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicmlnaHRuZXNzLCBpbnQgY29udHJhc3QsIGludCBzYXR1cmF0aW9uKTsKKworLyoqCisgKiBAcmV0dXJuIC0xIGlmIG5vdCBzdXBwb3J0ZWQKKyAqLworaW50IHN3c19nZXRDb2xvcnNwYWNlRGV0YWlscyhzdHJ1Y3QgU3dzQ29udGV4dCAqYywgaW50ICoqaW52X3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNyY1JhbmdlLCBpbnQgKip0YWJsZSwgaW50ICpkc3RSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpicmlnaHRuZXNzLCBpbnQgKmNvbnRyYXN0LCBpbnQgKnNhdHVyYXRpb24pOworCisvKioKKyAqIEFsbG9jYXRlIGFuZCByZXR1cm4gYW4gdW5pbml0aWFsaXplZCB2ZWN0b3Igd2l0aCBsZW5ndGggY29lZmZpY2llbnRzLgorICovCitTd3NWZWN0b3IgKnN3c19hbGxvY1ZlYyhpbnQgbGVuZ3RoKTsKKworLyoqCisgKiBSZXR1cm4gYSBub3JtYWxpemVkIEdhdXNzaWFuIGN1cnZlIHVzZWQgdG8gZmlsdGVyIHN0dWZmCisgKiBxdWFsaXR5ID0gMyBpcyBoaWdoIHF1YWxpdHksIGxvd2VyIGlzIGxvd2VyIHF1YWxpdHkuCisgKi8KK1N3c1ZlY3RvciAqc3dzX2dldEdhdXNzaWFuVmVjKGRvdWJsZSB2YXJpYW5jZSwgZG91YmxlIHF1YWxpdHkpOworCisvKioKKyAqIEFsbG9jYXRlIGFuZCByZXR1cm4gYSB2ZWN0b3Igd2l0aCBsZW5ndGggY29lZmZpY2llbnRzLCBhbGwKKyAqIHdpdGggdGhlIHNhbWUgdmFsdWUgYy4KKyAqLworU3dzVmVjdG9yICpzd3NfZ2V0Q29uc3RWZWMoZG91YmxlIGMsIGludCBsZW5ndGgpOworCisvKioKKyAqIEFsbG9jYXRlIGFuZCByZXR1cm4gYSB2ZWN0b3Igd2l0aCBqdXN0IG9uZSBjb2VmZmljaWVudCwgd2l0aAorICogdmFsdWUgMS4wLgorICovCitTd3NWZWN0b3IgKnN3c19nZXRJZGVudGl0eVZlYyh2b2lkKTsKKworLyoqCisgKiBTY2FsZSBhbGwgdGhlIGNvZWZmaWNpZW50cyBvZiBhIGJ5IHRoZSBzY2FsYXIgdmFsdWUuCisgKi8KK3ZvaWQgc3dzX3NjYWxlVmVjKFN3c1ZlY3RvciAqYSwgZG91YmxlIHNjYWxhcik7CisKKy8qKgorICogU2NhbGUgYWxsIHRoZSBjb2VmZmljaWVudHMgb2YgYSBzbyB0aGF0IHRoZWlyIHN1bSBlcXVhbHMgaGVpZ2h0LgorICovCit2b2lkIHN3c19ub3JtYWxpemVWZWMoU3dzVmVjdG9yICphLCBkb3VibGUgaGVpZ2h0KTsKK3ZvaWQgc3dzX2NvbnZWZWMoU3dzVmVjdG9yICphLCBTd3NWZWN0b3IgKmIpOwordm9pZCBzd3NfYWRkVmVjKFN3c1ZlY3RvciAqYSwgU3dzVmVjdG9yICpiKTsKK3ZvaWQgc3dzX3N1YlZlYyhTd3NWZWN0b3IgKmEsIFN3c1ZlY3RvciAqYik7Cit2b2lkIHN3c19zaGlmdFZlYyhTd3NWZWN0b3IgKmEsIGludCBzaGlmdCk7CisKKy8qKgorICogQWxsb2NhdGUgYW5kIHJldHVybiBhIGNsb25lIG9mIHRoZSB2ZWN0b3IgYSwgdGhhdCBpcyBhIHZlY3RvcgorICogd2l0aCB0aGUgc2FtZSBjb2VmZmljaWVudHMgYXMgYS4KKyAqLworU3dzVmVjdG9yICpzd3NfY2xvbmVWZWMoU3dzVmVjdG9yICphKTsKKworLyoqCisgKiBQcmludCB3aXRoIGF2X2xvZygpIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yIGEKKyAqIGlmIGxvZ19sZXZlbCA8PSBhdl9sb2dfbGV2ZWwuCisgKi8KK3ZvaWQgc3dzX3ByaW50VmVjMihTd3NWZWN0b3IgKmEsIEFWQ2xhc3MgKmxvZ19jdHgsIGludCBsb2dfbGV2ZWwpOworCit2b2lkIHN3c19mcmVlVmVjKFN3c1ZlY3RvciAqYSk7CisKK1N3c0ZpbHRlciAqc3dzX2dldERlZmF1bHRGaWx0ZXIoZmxvYXQgbHVtYUdCbHVyLCBmbG9hdCBjaHJvbWFHQmx1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbHVtYVNoYXJwZW4sIGZsb2F0IGNocm9tYVNoYXJwZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNocm9tYUhTaGlmdCwgZmxvYXQgY2hyb21hVlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyYm9zZSk7Cit2b2lkIHN3c19mcmVlRmlsdGVyKFN3c0ZpbHRlciAqZmlsdGVyKTsKKworLyoqCisgKiBDaGVjayBpZiBjb250ZXh0IGNhbiBiZSByZXVzZWQsIG90aGVyd2lzZSByZWFsbG9jYXRlIGEgbmV3IG9uZS4KKyAqCisgKiBJZiBjb250ZXh0IGlzIE5VTEwsIGp1c3QgY2FsbHMgc3dzX2dldENvbnRleHQoKSB0byBnZXQgYSBuZXcKKyAqIGNvbnRleHQuIE90aGVyd2lzZSwgY2hlY2tzIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZSB0aGUgb25lcyBhbHJlYWR5CisgKiBzYXZlZCBpbiBjb250ZXh0LiBJZiB0aGF0IGlzIHRoZSBjYXNlLCByZXR1cm5zIHRoZSBjdXJyZW50CisgKiBjb250ZXh0LiBPdGhlcndpc2UsIGZyZWVzIGNvbnRleHQgYW5kIGdldHMgYSBuZXcgY29udGV4dCB3aXRoCisgKiB0aGUgbmV3IHBhcmFtZXRlcnMuCisgKgorICogQmUgd2FybmVkIHRoYXQgc3JjRmlsdGVyIGFuZCBkc3RGaWx0ZXIgYXJlIG5vdCBjaGVja2VkLCB0aGV5CisgKiBhcmUgYXNzdW1lZCB0byByZW1haW4gdGhlIHNhbWUuCisgKi8KK3N0cnVjdCBTd3NDb250ZXh0ICpzd3NfZ2V0Q2FjaGVkQ29udGV4dChzdHJ1Y3QgU3dzQ29udGV4dCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjVywgaW50IHNyY0gsIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFcsIGludCBkc3RILCBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywgU3dzRmlsdGVyICpzcmNGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dzRmlsdGVyICpkc3RGaWx0ZXIsIGNvbnN0IGRvdWJsZSAqcGFyYW0pOworCisvKioKKyAqIENvbnZlcnQgYW4gOC1iaXQgcGFsZXR0ZWQgZnJhbWUgaW50byBhIGZyYW1lIHdpdGggYSBjb2xvciBkZXB0aCBvZiAzMiBiaXRzLgorICoKKyAqIFRoZSBvdXRwdXQgZnJhbWUgd2lsbCBoYXZlIHRoZSBzYW1lIHBhY2tlZCBmb3JtYXQgYXMgdGhlIHBhbGV0dGUuCisgKgorICogQHBhcmFtIHNyYyAgICAgICAgc291cmNlIGZyYW1lIGJ1ZmZlcgorICogQHBhcmFtIGRzdCAgICAgICAgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyCisgKiBAcGFyYW0gbnVtX3BpeGVscyBudW1iZXIgb2YgcGl4ZWxzIHRvIGNvbnZlcnQKKyAqIEBwYXJhbSBwYWxldHRlICAgIGFycmF5IHdpdGggWzI1Nl0gZW50cmllcywgd2hpY2ggbXVzdCBtYXRjaCBjb2xvciBhcnJhbmdlbWVudCAoUkdCIG9yIEJHUikgb2Ygc3JjCisgKi8KK3ZvaWQgc3dzX2NvbnZlcnRQYWxldHRlOFRvUGFja2VkMzIoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBudW1fcGl4ZWxzLCBjb25zdCB1aW50OF90ICpwYWxldHRlKTsKKworLyoqCisgKiBDb252ZXJ0IGFuIDgtYml0IHBhbGV0dGVkIGZyYW1lIGludG8gYSBmcmFtZSB3aXRoIGEgY29sb3IgZGVwdGggb2YgMjQgYml0cy4KKyAqCisgKiBXaXRoIHRoZSBwYWxldHRlIGZvcm1hdCAiQUJDRCIsIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBlbmRzIHVwIHdpdGggdGhlIGZvcm1hdCAiQUJDIi4KKyAqCisgKiBAcGFyYW0gc3JjICAgICAgICBzb3VyY2UgZnJhbWUgYnVmZmVyCisgKiBAcGFyYW0gZHN0ICAgICAgICBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIKKyAqIEBwYXJhbSBudW1fcGl4ZWxzIG51bWJlciBvZiBwaXhlbHMgdG8gY29udmVydAorICogQHBhcmFtIHBhbGV0dGUgICAgYXJyYXkgd2l0aCBbMjU2XSBlbnRyaWVzLCB3aGljaCBtdXN0IG1hdGNoIGNvbG9yIGFycmFuZ2VtZW50IChSR0Igb3IgQkdSKSBvZiBzcmMKKyAqLwordm9pZCBzd3NfY29udmVydFBhbGV0dGU4VG9QYWNrZWQyNChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IG51bV9waXhlbHMsIGNvbnN0IHVpbnQ4X3QgKnBhbGV0dGUpOworCisvKioKKyAqIEdldCB0aGUgQVZDbGFzcyBmb3Igc3dzQ29udGV4dC4gSXQgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aAorICogQVZfT1BUX1NFQVJDSF9GQUtFX09CSiBmb3IgZXhhbWluaW5nIG9wdGlvbnMuCisgKgorICogQHNlZSBhdl9vcHRfZmluZCgpLgorICovCitjb25zdCBBVkNsYXNzICpzd3NfZ2V0X2NsYXNzKHZvaWQpOworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIFNXU0NBTEVfU1dTQ0FMRV9IICovCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS9zd3NjYWxlX2ludGVybmFsLmggYi9mZm1wZWcvbGlic3dzY2FsZS9zd3NjYWxlX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiNGVjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL3N3c2NhbGVfaW50ZXJuYWwuaApAQCAtMCwwICsxLDkwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgU1dTQ0FMRV9TV1NDQUxFX0lOVEVSTkFMX0gKKyNkZWZpbmUgU1dTQ0FMRV9TV1NDQUxFX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgSEFWRV9BTFRJVkVDX0gKKyNpbmNsdWRlIDxhbHRpdmVjLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2RlZmluZSBTVFIocykgQVZfVE9TVFJJTkcocykgLy8gQVZfU1RSSU5HSUZZIGlzIHRvbyBsb25nCisKKyNkZWZpbmUgWVVWUkdCX1RBQkxFX0hFQURST09NIDEyOAorCisjZGVmaW5lIE1BWF9GSUxURVJfU0laRSBTV1NfTUFYX0ZJTFRFUl9TSVpFCisKKyNkZWZpbmUgRElUSEVSMVhCUFAKKworI2lmIEhBVkVfQklHRU5ESUFOCisjZGVmaW5lIEFMVDMyX0NPUlIgKC0xKQorI2Vsc2UKKyNkZWZpbmUgQUxUMzJfQ09SUiAgIDEKKyNlbmRpZgorCisjaWYgQVJDSF9YODZfNjQKKyMgICBkZWZpbmUgQVBDS19QVFIyICA4CisjICAgZGVmaW5lIEFQQ0tfQ09FRiAxNgorIyAgIGRlZmluZSBBUENLX1NJWkUgMjQKKyNlbHNlCisjICAgZGVmaW5lIEFQQ0tfUFRSMiAgNAorIyAgIGRlZmluZSBBUENLX0NPRUYgIDgKKyMgICBkZWZpbmUgQVBDS19TSVpFIDE2CisjZW5kaWYKKworI2RlZmluZSBSRVRDT0RFX1VTRV9DQVNDQURFIC0xMjM0NQorCitzdHJ1Y3QgU3dzQ29udGV4dDsKKwordHlwZWRlZiBlbnVtIFN3c0RpdGhlciB7CisgICAgU1dTX0RJVEhFUl9OT05FID0gMCwKKyAgICBTV1NfRElUSEVSX0FVVE8sCisgICAgU1dTX0RJVEhFUl9CQVlFUiwKKyAgICBTV1NfRElUSEVSX0VELAorICAgIFNXU19ESVRIRVJfQV9ESVRIRVIsCisgICAgU1dTX0RJVEhFUl9YX0RJVEhFUiwKKyAgICBOQl9TV1NfRElUSEVSLAorfSBTd3NEaXRoZXI7CisKK3R5cGVkZWYgaW50ICgqU3dzRnVuYykoc3RydWN0IFN3c0NvbnRleHQgKmNvbnRleHQsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlW10sIGludCBzcmNTbGljZVksIGludCBzcmNTbGljZUgsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0U3RyaWRlW10pOworCisvKioKKyAqIFdyaXRlIG9uZSBsaW5lIG9mIGhvcml6b250YWxseSBzY2FsZWQgZGF0YSB0byBwbGFuYXIgb3V0cHV0CisgKiB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHZlcnRpY2FsIHNjYWxpbmcgKG9yIHBvaW50LXNjYWxpbmcpLgorICoKKyAqIEBwYXJhbSBzcmMgICAgIHNjYWxlZCBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAorICogICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gZGVzdCAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgcGxhbmUuIEZvciA+OGJpdAorICogICAgICAgICAgICAgICAgb3V0cHV0LCB0aGlzIGlzIGluIHVpbnQxNl90CisgKiBAcGFyYW0gZHN0VyAgICB3aWR0aCBvZiBkZXN0aW5hdGlvbiBpbiBwaXhlbHMKKyAqIEBwYXJhbSBkaXRoZXIgIG9yZGVyZWQgZGl0aGVyIGFycmF5IG9mIHR5cGUgaW50MTZfdCBhbmQgc2l6ZSA4CisgKiBAcGFyYW0gb2Zmc2V0ICBEaXRoZXIgb2Zmc2V0CisgKi8KK3R5cGVkZWYgdm9pZCAoKnl1djJwbGFuYXIxX2ZuKShjb25zdCBpbnQxNl90ICpzcmMsIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpdGhlciwgaW50IG9mZnNldCk7CisKKy8qKgorICogV3JpdGUgb25lIGxpbmUgb2YgaG9yaXpvbnRhbGx5IHNjYWxlZCBkYXRhIHRvIHBsYW5hciBvdXRwdXQKKyAqIHdpdGggbXVsdGktcG9pbnQgdmVydGljYWwgc2NhbGluZyBiZXR3ZWVuIGlucHV0IHBpeGVscy4KKyAqCisgKiBAcGFyYW0gZmlsdGVyICAgICAgICB2ZXJ0aWNhbCBsdW1hL2FscGhhIHNjYWxpbmcgY29lZmZpY2llbnRzLCAxMmJpdCBbMCw0MDk2XQorICogQHBhcmFtIHNyYyAgICAgICAgICAgc2NhbGVkIGx1bWEgKFkpIG9yIGFscGhhIChBKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAorICogICAgICAgICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gZmlsdGVyU2l6ZSAgICBudW1iZXIgb2YgdmVydGljYWwgaW5wdXQgbGluZXMgdG8gc2NhbGUKKyAqIEBwYXJhbSBkZXN0ICAgICAgICAgIHBvaW50ZXIgdG8gb3V0cHV0IHBsYW5lLiBGb3IgPjhiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgdGhpcyBpcyBpbiB1aW50MTZfdAorICogQHBhcmFtIGRzdFcgICAgICAgICAgd2lkdGggb2YgZGVzdGluYXRpb24gcGl4ZWxzCisgKiBAcGFyYW0gb2Zmc2V0ICAgICAgICBEaXRoZXIgb2Zmc2V0CisgKi8KK3R5cGVkZWYgdm9pZCAoKnl1djJwbGFuYXJYX2ZuKShjb25zdCBpbnQxNl90ICpmaWx0ZXIsIGludCBmaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipzcmMsIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpdGhlciwgaW50IG9mZnNldCk7CisKKy8qKgorICogV3JpdGUgb25lIGxpbmUgb2YgaG9yaXpvbnRhbGx5IHNjYWxlZCBjaHJvbWEgdG8gaW50ZXJsZWF2ZWQgb3V0cHV0CisgKiB3aXRoIG11bHRpLXBvaW50IHZlcnRpY2FsIHNjYWxpbmcgYmV0d2VlbiBpbnB1dCBwaXhlbHMuCisgKgorICogQHBhcmFtIGMgICAgICAgICAgICAgU1dTIHNjYWxpbmcgY29udGV4dAorICogQHBhcmFtIGNockZpbHRlciAgICAgdmVydGljYWwgY2hyb21hIHNjYWxpbmcgY29lZmZpY2llbnRzLCAxMmJpdCBbMCw0MDk2XQorICogQHBhcmFtIGNoclVTcmMgICAgICAgc2NhbGVkIGNocm9tYSAoVSkgc291cmNlIGRhdGEsIDE1Yml0IGZvciA4LTEwYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgICAgICAgIDE5LWJpdCBmb3IgMTZiaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGNoclZTcmMgICAgICAgc2NhbGVkIGNocm9tYSAoVikgc291cmNlIGRhdGEsIDE1Yml0IGZvciA4LTEwYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgICAgICAgIDE5LWJpdCBmb3IgMTZiaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGNockZpbHRlclNpemUgbnVtYmVyIG9mIHZlcnRpY2FsIGNocm9tYSBpbnB1dCBsaW5lcyB0byBzY2FsZQorICogQHBhcmFtIGRlc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IHBsYW5lLiBGb3IgPjhiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgdGhpcyBpcyBpbiB1aW50MTZfdAorICogQHBhcmFtIGRzdFcgICAgICAgICAgd2lkdGggb2YgY2hyb21hIHBsYW5lcworICovCit0eXBlZGVmIHZvaWQgKCp5dXYyaW50ZXJsZWF2ZWRYX2ZuKShzdHJ1Y3QgU3dzQ29udGV4dCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNockZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHJGaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqY2hyVlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXKTsKKworLyoqCisgKiBXcml0ZSBvbmUgbGluZSBvZiBob3Jpem9udGFsbHkgc2NhbGVkIFkvVS9WL0EgdG8gcGFja2VkLXBpeGVsIFlVVi9SR0IKKyAqIG91dHB1dCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHZlcnRpY2FsIHNjYWxpbmcgKG9yIHBvaW50LXNjYWxpbmcpLiBOb3RlCisgKiB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IGRvIGNocm9tYSBzY2FsaW5nLCBzZWUgdGhlICJ1dmFscGhhIiBhcmd1bWVudC4KKyAqCisgKiBAcGFyYW0gYyAgICAgICBTV1Mgc2NhbGluZyBjb250ZXh0CisgKiBAcGFyYW0gbHVtU3JjICBzY2FsZWQgbHVtYSAoWSkgc291cmNlIGRhdGEsIDE1Yml0IGZvciA4LTEwYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgIDE5LWJpdCBmb3IgMTZiaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGNoclVTcmMgc2NhbGVkIGNocm9tYSAoVSkgc291cmNlIGRhdGEsIDE1Yml0IGZvciA4LTEwYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgIDE5LWJpdCBmb3IgMTZiaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGNoclZTcmMgc2NhbGVkIGNocm9tYSAoVikgc291cmNlIGRhdGEsIDE1Yml0IGZvciA4LTEwYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgIDE5LWJpdCBmb3IgMTZiaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGFscFNyYyAgc2NhbGVkIGFscGhhIChBKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAorICogICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gZGVzdCAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgcGxhbmUuIEZvciAxNmJpdCBvdXRwdXQsIHRoaXMgaXMKKyAqICAgICAgICAgICAgICAgIHVpbnQxNl90CisgKiBAcGFyYW0gZHN0VyAgICB3aWR0aCBvZiBsdW1TcmMgYW5kIGFscFNyYyBpbiBwaXhlbHMsIG51bWJlciBvZiBwaXhlbHMKKyAqICAgICAgICAgICAgICAgIHRvIHdyaXRlIGludG8gZGVzdFtdCisgKiBAcGFyYW0gdXZhbHBoYSBjaHJvbWEgc2NhbGluZyBjb2VmZmljaWVudCBmb3IgdGhlIHNlY29uZCBsaW5lIG9mIGNocm9tYQorICogICAgICAgICAgICAgICAgcGl4ZWxzLCBlaXRoZXIgMjA0OCBvciAwLiBJZiAwLCBvbmUgY2hyb21hIGlucHV0IGlzIHVzZWQKKyAqICAgICAgICAgICAgICAgIGZvciAyIG91dHB1dCBwaXhlbHMgKG9yIGlmIHRoZSBTV1NfRkxBR19GVUxMX0NIUl9JTlQgZmxhZworICogICAgICAgICAgICAgICAgaXMgc2V0LCBpdCBnZW5lcmF0ZXMgMSBvdXRwdXQgcGl4ZWwpLiBJZiAyMDQ4LCB0d28gY2hyb21hCisgKiAgICAgICAgICAgICAgICBpbnB1dCBwaXhlbHMgc2hvdWxkIGJlIGF2ZXJhZ2VkIGZvciAyIG91dHB1dCBwaXhlbHMgKHRoaXMKKyAqICAgICAgICAgICAgICAgIG9ubHkgaGFwcGVucyBpZiBTV1NfRkxBR19GVUxMX0NIUl9JTlQgaXMgbm90IHNldCkKKyAqIEBwYXJhbSB5ICAgICAgIHZlcnRpY2FsIGxpbmUgbnVtYmVyIGZvciB0aGlzIG91dHB1dC4gVGhpcyBkb2VzIG5vdCBuZWVkCisgKiAgICAgICAgICAgICAgICB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiwKKyAqICAgICAgICAgICAgICAgIGJ1dCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBjb21mb3J0IG5vaXNlIHVzaW5nIGRpdGhlcmluZworICogICAgICAgICAgICAgICAgZm9yIHNvbWUgb3V0cHV0IGZvcm1hdHMuCisgKi8KK3R5cGVkZWYgdm9pZCAoKnl1djJwYWNrZWQxX2ZuKShzdHJ1Y3QgU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqbHVtU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNoclVTcmNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyVlNyY1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphbHBTcmMsIHVpbnQ4X3QgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFcsIGludCB1dmFscGhhLCBpbnQgeSk7CisvKioKKyAqIFdyaXRlIG9uZSBsaW5lIG9mIGhvcml6b250YWxseSBzY2FsZWQgWS9VL1YvQSB0byBwYWNrZWQtcGl4ZWwgWVVWL1JHQgorICogb3V0cHV0IGJ5IGRvaW5nIGJpbGluZWFyIHNjYWxpbmcgYmV0d2VlbiB0d28gaW5wdXQgbGluZXMuCisgKgorICogQHBhcmFtIGMgICAgICAgU1dTIHNjYWxpbmcgY29udGV4dAorICogQHBhcmFtIGx1bVNyYyAgc2NhbGVkIGx1bWEgKFkpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBjaHJVU3JjIHNjYWxlZCBjaHJvbWEgKFUpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBjaHJWU3JjIHNjYWxlZCBjaHJvbWEgKFYpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBhbHBTcmMgIHNjYWxlZCBhbHBoYSAoQSkgc291cmNlIGRhdGEsIDE1Yml0IGZvciA4LTEwYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgIDE5LWJpdCBmb3IgMTZiaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGRlc3QgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IHBsYW5lLiBGb3IgMTZiaXQgb3V0cHV0LCB0aGlzIGlzCisgKiAgICAgICAgICAgICAgICB1aW50MTZfdAorICogQHBhcmFtIGRzdFcgICAgd2lkdGggb2YgbHVtU3JjIGFuZCBhbHBTcmMgaW4gcGl4ZWxzLCBudW1iZXIgb2YgcGl4ZWxzCisgKiAgICAgICAgICAgICAgICB0byB3cml0ZSBpbnRvIGRlc3RbXQorICogQHBhcmFtIHlhbHBoYSAgbHVtYS9hbHBoYSBzY2FsaW5nIGNvZWZmaWNpZW50cyBmb3IgdGhlIHNlY29uZCBpbnB1dCBsaW5lLgorICogICAgICAgICAgICAgICAgVGhlIGZpcnN0IGxpbmUncyBjb2VmZmljaWVudHMgY2FuIGJlIGNhbGN1bGF0ZWQgYnkgdXNpbmcKKyAqICAgICAgICAgICAgICAgIDQwOTYgLSB5YWxwaGEKKyAqIEBwYXJhbSB1dmFscGhhIGNocm9tYSBzY2FsaW5nIGNvZWZmaWNpZW50IGZvciB0aGUgc2Vjb25kIGlucHV0IGxpbmUuIFRoZQorICogICAgICAgICAgICAgICAgZmlyc3QgbGluZSdzIGNvZWZmaWNpZW50cyBjYW4gYmUgY2FsY3VsYXRlZCBieSB1c2luZworICogICAgICAgICAgICAgICAgNDA5NiAtIHV2YWxwaGEKKyAqIEBwYXJhbSB5ICAgICAgIHZlcnRpY2FsIGxpbmUgbnVtYmVyIGZvciB0aGlzIG91dHB1dC4gVGhpcyBkb2VzIG5vdCBuZWVkCisgKiAgICAgICAgICAgICAgICB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiwKKyAqICAgICAgICAgICAgICAgIGJ1dCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBjb21mb3J0IG5vaXNlIHVzaW5nIGRpdGhlcmluZworICogICAgICAgICAgICAgICAgZm9yIHNvbWUgb3V0cHV0IGZvcm1hdHMuCisgKi8KK3R5cGVkZWYgdm9pZCAoKnl1djJwYWNrZWQyX2ZuKShzdHJ1Y3QgU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqbHVtU3JjWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNoclVTcmNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyVlNyY1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphbHBTcmNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0VywgaW50IHlhbHBoYSwgaW50IHV2YWxwaGEsIGludCB5KTsKKy8qKgorICogV3JpdGUgb25lIGxpbmUgb2YgaG9yaXpvbnRhbGx5IHNjYWxlZCBZL1UvVi9BIHRvIHBhY2tlZC1waXhlbCBZVVYvUkdCCisgKiBvdXRwdXQgYnkgZG9pbmcgbXVsdGktcG9pbnQgdmVydGljYWwgc2NhbGluZyBiZXR3ZWVuIGlucHV0IHBpeGVscy4KKyAqCisgKiBAcGFyYW0gYyAgICAgICAgICAgICBTV1Mgc2NhbGluZyBjb250ZXh0CisgKiBAcGFyYW0gbHVtRmlsdGVyICAgICB2ZXJ0aWNhbCBsdW1hL2FscGhhIHNjYWxpbmcgY29lZmZpY2llbnRzLCAxMmJpdCBbMCw0MDk2XQorICogQHBhcmFtIGx1bVNyYyAgICAgICAgc2NhbGVkIGx1bWEgKFkpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBsdW1GaWx0ZXJTaXplIG51bWJlciBvZiB2ZXJ0aWNhbCBsdW1hL2FscGhhIGlucHV0IGxpbmVzIHRvIHNjYWxlCisgKiBAcGFyYW0gY2hyRmlsdGVyICAgICB2ZXJ0aWNhbCBjaHJvbWEgc2NhbGluZyBjb2VmZmljaWVudHMsIDEyYml0IFswLDQwOTZdCisgKiBAcGFyYW0gY2hyVVNyYyAgICAgICBzY2FsZWQgY2hyb21hIChVKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAorICogICAgICAgICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gY2hyVlNyYyAgICAgICBzY2FsZWQgY2hyb21hIChWKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAorICogICAgICAgICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gY2hyRmlsdGVyU2l6ZSBudW1iZXIgb2YgdmVydGljYWwgY2hyb21hIGlucHV0IGxpbmVzIHRvIHNjYWxlCisgKiBAcGFyYW0gYWxwU3JjICAgICAgICBzY2FsZWQgYWxwaGEgKEEpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBkZXN0ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBwbGFuZS4gRm9yIDE2Yml0IG91dHB1dCwgdGhpcyBpcworICogICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QKKyAqIEBwYXJhbSBkc3RXICAgICAgICAgIHdpZHRoIG9mIGx1bVNyYyBhbmQgYWxwU3JjIGluIHBpeGVscywgbnVtYmVyIG9mIHBpeGVscworICogICAgICAgICAgICAgICAgICAgICAgdG8gd3JpdGUgaW50byBkZXN0W10KKyAqIEBwYXJhbSB5ICAgICAgICAgICAgIHZlcnRpY2FsIGxpbmUgbnVtYmVyIGZvciB0aGlzIG91dHB1dC4gVGhpcyBkb2VzIG5vdCBuZWVkCisgKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiwKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBjb21mb3J0IG5vaXNlIHVzaW5nIGRpdGhlcmluZworICogICAgICAgICAgICAgICAgICAgICAgb3Igc29tZSBvdXRwdXQgZm9ybWF0cy4KKyAqLwordHlwZWRlZiB2b2lkICgqeXV2MnBhY2tlZFhfZm4pKHN0cnVjdCBTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpsdW1GaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgaW50IGx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJVU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJWU3JjLCBpbnQgY2hyRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqYWxwU3JjLCB1aW50OF90ICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RXLCBpbnQgeSk7CisKKy8qKgorICogV3JpdGUgb25lIGxpbmUgb2YgaG9yaXpvbnRhbGx5IHNjYWxlZCBZL1UvVi9BIHRvIFlVVi9SR0IKKyAqIG91dHB1dCBieSBkb2luZyBtdWx0aS1wb2ludCB2ZXJ0aWNhbCBzY2FsaW5nIGJldHdlZW4gaW5wdXQgcGl4ZWxzLgorICoKKyAqIEBwYXJhbSBjICAgICAgICAgICAgIFNXUyBzY2FsaW5nIGNvbnRleHQKKyAqIEBwYXJhbSBsdW1GaWx0ZXIgICAgIHZlcnRpY2FsIGx1bWEvYWxwaGEgc2NhbGluZyBjb2VmZmljaWVudHMsIDEyYml0IFswLDQwOTZdCisgKiBAcGFyYW0gbHVtU3JjICAgICAgICBzY2FsZWQgbHVtYSAoWSkgc291cmNlIGRhdGEsIDE1Yml0IGZvciA4LTEwYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgICAgICAgIDE5LWJpdCBmb3IgMTZiaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGx1bUZpbHRlclNpemUgbnVtYmVyIG9mIHZlcnRpY2FsIGx1bWEvYWxwaGEgaW5wdXQgbGluZXMgdG8gc2NhbGUKKyAqIEBwYXJhbSBjaHJGaWx0ZXIgICAgIHZlcnRpY2FsIGNocm9tYSBzY2FsaW5nIGNvZWZmaWNpZW50cywgMTJiaXQgWzAsNDA5Nl0KKyAqIEBwYXJhbSBjaHJVU3JjICAgICAgIHNjYWxlZCBjaHJvbWEgKFUpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBjaHJWU3JjICAgICAgIHNjYWxlZCBjaHJvbWEgKFYpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBjaHJGaWx0ZXJTaXplIG51bWJlciBvZiB2ZXJ0aWNhbCBjaHJvbWEgaW5wdXQgbGluZXMgdG8gc2NhbGUKKyAqIEBwYXJhbSBhbHBTcmMgICAgICAgIHNjYWxlZCBhbHBoYSAoQSkgc291cmNlIGRhdGEsIDE1Yml0IGZvciA4LTEwYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgICAgICAgIDE5LWJpdCBmb3IgMTZiaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGRlc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IHBsYW5lcy4gRm9yIDE2Yml0IG91dHB1dCwgdGhpcyBpcworICogICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QKKyAqIEBwYXJhbSBkc3RXICAgICAgICAgIHdpZHRoIG9mIGx1bVNyYyBhbmQgYWxwU3JjIGluIHBpeGVscywgbnVtYmVyIG9mIHBpeGVscworICogICAgICAgICAgICAgICAgICAgICAgdG8gd3JpdGUgaW50byBkZXN0W10KKyAqIEBwYXJhbSB5ICAgICAgICAgICAgIHZlcnRpY2FsIGxpbmUgbnVtYmVyIGZvciB0aGlzIG91dHB1dC4gVGhpcyBkb2VzIG5vdCBuZWVkCisgKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiwKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBjb21mb3J0IG5vaXNlIHVzaW5nIGRpdGhlcmluZworICogICAgICAgICAgICAgICAgICAgICAgb3Igc29tZSBvdXRwdXQgZm9ybWF0cy4KKyAqLwordHlwZWRlZiB2b2lkICgqeXV2MmFueVhfZm4pKHN0cnVjdCBTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpsdW1GaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgaW50IGx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJVU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJWU3JjLCBpbnQgY2hyRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqYWxwU3JjLCB1aW50OF90ICoqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0VywgaW50IHkpOworCisvKiBUaGlzIHN0cnVjdCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhdCBsZWFzdCBhIDMyLWJ5dGUgYm91bmRhcnkuICovCit0eXBlZGVmIHN0cnVjdCBTd3NDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBpbmZvIG9uIHN0cnVjdCBmb3IgYXZfbG9nCisgICAgICovCisgICAgY29uc3QgQVZDbGFzcyAqYXZfY2xhc3M7CisKKyAgICAvKioKKyAgICAgKiBOb3RlIHRoYXQgc3JjLCBkc3QsIHNyY1N0cmlkZSwgZHN0U3RyaWRlIHdpbGwgYmUgY29waWVkIGluIHRoZQorICAgICAqIHN3c19zY2FsZSgpIHdyYXBwZXIgc28gdGhleSBjYW4gYmUgZnJlZWx5IG1vZGlmaWVkIGhlcmUuCisgICAgICovCisgICAgU3dzRnVuYyBzd3NjYWxlOworICAgIGludCBzcmNXOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgV2lkdGggIG9mIHNvdXJjZSAgICAgIGx1bWEvYWxwaGEgcGxhbmVzLgorICAgIGludCBzcmNIOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgSGVpZ2h0IG9mIHNvdXJjZSAgICAgIGx1bWEvYWxwaGEgcGxhbmVzLgorICAgIGludCBkc3RIOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgSGVpZ2h0IG9mIGRlc3RpbmF0aW9uIGx1bWEvYWxwaGEgcGxhbmVzLgorICAgIGludCBjaHJTcmNXOyAgICAgICAgICAgICAgICAgIC8vLzwgV2lkdGggIG9mIHNvdXJjZSAgICAgIGNocm9tYSAgICAgcGxhbmVzLgorICAgIGludCBjaHJTcmNIOyAgICAgICAgICAgICAgICAgIC8vLzwgSGVpZ2h0IG9mIHNvdXJjZSAgICAgIGNocm9tYSAgICAgcGxhbmVzLgorICAgIGludCBjaHJEc3RXOyAgICAgICAgICAgICAgICAgIC8vLzwgV2lkdGggIG9mIGRlc3RpbmF0aW9uIGNocm9tYSAgICAgcGxhbmVzLgorICAgIGludCBjaHJEc3RIOyAgICAgICAgICAgICAgICAgIC8vLzwgSGVpZ2h0IG9mIGRlc3RpbmF0aW9uIGNocm9tYSAgICAgcGxhbmVzLgorICAgIGludCBsdW1YSW5jLCBjaHJYSW5jOworICAgIGludCBsdW1ZSW5jLCBjaHJZSW5jOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXQ7IC8vLzwgRGVzdGluYXRpb24gcGl4ZWwgZm9ybWF0LgorICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXQ7IC8vLzwgU291cmNlICAgICAgcGl4ZWwgZm9ybWF0LgorICAgIGludCBkc3RGb3JtYXRCcHA7ICAgICAgICAgICAgIC8vLzwgTnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIG9mIHRoZSBkZXN0aW5hdGlvbiBwaXhlbCBmb3JtYXQuCisgICAgaW50IHNyY0Zvcm1hdEJwcDsgICAgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgb2YgdGhlIHNvdXJjZSAgICAgIHBpeGVsIGZvcm1hdC4KKyAgICBpbnQgZHN0QnBjLCBzcmNCcGM7CisgICAgaW50IGNoclNyY0hTdWJTYW1wbGU7ICAgICAgICAgLy8vPCBCaW5hcnkgbG9nYXJpdGhtIG9mIGhvcml6b250YWwgc3Vic2FtcGxpbmcgZmFjdG9yIGJldHdlZW4gbHVtYS9hbHBoYSBhbmQgY2hyb21hIHBsYW5lcyBpbiBzb3VyY2UgICAgICBpbWFnZS4KKyAgICBpbnQgY2hyU3JjVlN1YlNhbXBsZTsgICAgICAgICAvLy88IEJpbmFyeSBsb2dhcml0aG0gb2YgdmVydGljYWwgICBzdWJzYW1wbGluZyBmYWN0b3IgYmV0d2VlbiBsdW1hL2FscGhhIGFuZCBjaHJvbWEgcGxhbmVzIGluIHNvdXJjZSAgICAgIGltYWdlLgorICAgIGludCBjaHJEc3RIU3ViU2FtcGxlOyAgICAgICAgIC8vLzwgQmluYXJ5IGxvZ2FyaXRobSBvZiBob3Jpem9udGFsIHN1YnNhbXBsaW5nIGZhY3RvciBiZXR3ZWVuIGx1bWEvYWxwaGEgYW5kIGNocm9tYSBwbGFuZXMgaW4gZGVzdGluYXRpb24gaW1hZ2UuCisgICAgaW50IGNockRzdFZTdWJTYW1wbGU7ICAgICAgICAgLy8vPCBCaW5hcnkgbG9nYXJpdGhtIG9mIHZlcnRpY2FsICAgc3Vic2FtcGxpbmcgZmFjdG9yIGJldHdlZW4gbHVtYS9hbHBoYSBhbmQgY2hyb21hIHBsYW5lcyBpbiBkZXN0aW5hdGlvbiBpbWFnZS4KKyAgICBpbnQgdkNockRyb3A7ICAgICAgICAgICAgICAgICAvLy88IEJpbmFyeSBsb2dhcml0aG0gb2YgZXh0cmEgdmVydGljYWwgc3Vic2FtcGxpbmcgZmFjdG9yIGluIHNvdXJjZSBpbWFnZSBjaHJvbWEgcGxhbmVzIHNwZWNpZmllZCBieSB1c2VyLgorICAgIGludCBzbGljZURpcjsgICAgICAgICAgICAgICAgIC8vLzwgRGlyZWN0aW9uIHRoYXQgc2xpY2VzIGFyZSBmZWQgdG8gdGhlIHNjYWxlciAoMSA9IHRvcC10by1ib3R0b20sIC0xID0gYm90dG9tLXRvLXRvcCkuCisgICAgZG91YmxlIHBhcmFtWzJdOyAgICAgICAgICAgICAgLy8vPCBJbnB1dCBwYXJhbWV0ZXJzIGZvciBzY2FsaW5nIGFsZ29yaXRobXMgdGhhdCBuZWVkIHRoZW0uCisKKyAgICAvKiBUaGUgY2FzY2FkZWRfKiBmaWVsZHMgYWxsb3cgc3BsaXRpbmcgYSBzY2FsZXIgdGFzayBpbnRvIG11bHRpcGxlCisgICAgICogc2VxdWVudGlhbCBzdGVwcywgdGhpcyBpcyBmb3IgZXhhbXBsZSB1c2VkIHRvIGxpbWl0IHRoZSBtYXhpbXVtCisgICAgICogZG93bnNjYWxpbmcgZmFjdG9yIHRoYXQgbmVlZHMgdG8gYmUgc3VwcG9ydGVkIGluIG9uZSBzY2FsZXIuCisgICAgICovCisgICAgc3RydWN0IFN3c0NvbnRleHQgKmNhc2NhZGVkX2NvbnRleHRbMl07CisgICAgaW50IGNhc2NhZGVkX3RtcFN0cmlkZVs0XTsKKyAgICB1aW50OF90ICpjYXNjYWRlZF90bXBbNF07CisKKyAgICB1aW50MzJfdCBwYWxfeXV2WzI1Nl07CisgICAgdWludDMyX3QgcGFsX3JnYlsyNTZdOworCisgICAgLyoqCisgICAgICogQG5hbWUgU2NhbGVkIGhvcml6b250YWwgbGluZXMgcmluZyBidWZmZXIuCisgICAgICogVGhlIGhvcml6b250YWwgc2NhbGVyIGtlZXBzIGp1c3QgZW5vdWdoIHNjYWxlZCBsaW5lcyBpbiBhIHJpbmcgYnVmZmVyCisgICAgICogc28gdGhleSBtYXkgYmUgcGFzc2VkIHRvIHRoZSB2ZXJ0aWNhbCBzY2FsZXIuIFRoZSBwb2ludGVycyB0byB0aGUKKyAgICAgKiBhbGxvY2F0ZWQgYnVmZmVycyBmb3IgZWFjaCBsaW5lIGFyZSBkdXBsaWNhdGVkIGluIHNlcXVlbmNlIGluIHRoZSByaW5nCisgICAgICogYnVmZmVyIHRvIHNpbXBsaWZ5IGluZGV4aW5nIGFuZCBhdm9pZCB3cmFwcGluZyBhcm91bmQgYmV0d2VlbiBsaW5lcworICAgICAqIGluc2lkZSB0aGUgdmVydGljYWwgc2NhbGVyIGNvZGUuIFRoZSB3cmFwcGluZyBpcyBkb25lIGJlZm9yZSB0aGUKKyAgICAgKiB2ZXJ0aWNhbCBzY2FsZXIgaXMgY2FsbGVkLgorICAgICAqLworICAgIC8vQHsKKyAgICBpbnQxNl90ICoqbHVtUGl4QnVmOyAgICAgICAgICAvLy88IFJpbmcgYnVmZmVyIGZvciBzY2FsZWQgaG9yaXpvbnRhbCBsdW1hICAgcGxhbmUgbGluZXMgdG8gYmUgZmVkIHRvIHRoZSB2ZXJ0aWNhbCBzY2FsZXIuCisgICAgaW50MTZfdCAqKmNoclVQaXhCdWY7ICAgICAgICAgLy8vPCBSaW5nIGJ1ZmZlciBmb3Igc2NhbGVkIGhvcml6b250YWwgY2hyb21hIHBsYW5lIGxpbmVzIHRvIGJlIGZlZCB0byB0aGUgdmVydGljYWwgc2NhbGVyLgorICAgIGludDE2X3QgKipjaHJWUGl4QnVmOyAgICAgICAgIC8vLzwgUmluZyBidWZmZXIgZm9yIHNjYWxlZCBob3Jpem9udGFsIGNocm9tYSBwbGFuZSBsaW5lcyB0byBiZSBmZWQgdG8gdGhlIHZlcnRpY2FsIHNjYWxlci4KKyAgICBpbnQxNl90ICoqYWxwUGl4QnVmOyAgICAgICAgICAvLy88IFJpbmcgYnVmZmVyIGZvciBzY2FsZWQgaG9yaXpvbnRhbCBhbHBoYSAgcGxhbmUgbGluZXMgdG8gYmUgZmVkIHRvIHRoZSB2ZXJ0aWNhbCBzY2FsZXIuCisgICAgaW50IHZMdW1CdWZTaXplOyAgICAgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgdmVydGljYWwgbHVtYS9hbHBoYSBsaW5lcyBhbGxvY2F0ZWQgaW4gdGhlIHJpbmcgYnVmZmVyLgorICAgIGludCB2Q2hyQnVmU2l6ZTsgICAgICAgICAgICAgIC8vLzwgTnVtYmVyIG9mIHZlcnRpY2FsIGNocm9tYSAgICAgbGluZXMgYWxsb2NhdGVkIGluIHRoZSByaW5nIGJ1ZmZlci4KKyAgICBpbnQgbGFzdEluTHVtQnVmOyAgICAgICAgICAgICAvLy88IExhc3Qgc2NhbGVkIGhvcml6b250YWwgbHVtYS9hbHBoYSBsaW5lIGZyb20gc291cmNlIGluIHRoZSByaW5nIGJ1ZmZlci4KKyAgICBpbnQgbGFzdEluQ2hyQnVmOyAgICAgICAgICAgICAvLy88IExhc3Qgc2NhbGVkIGhvcml6b250YWwgY2hyb21hICAgICBsaW5lIGZyb20gc291cmNlIGluIHRoZSByaW5nIGJ1ZmZlci4KKyAgICBpbnQgbHVtQnVmSW5kZXg7ICAgICAgICAgICAgICAvLy88IEluZGV4IGluIHJpbmcgYnVmZmVyIG9mIHRoZSBsYXN0IHNjYWxlZCBob3Jpem9udGFsIGx1bWEvYWxwaGEgbGluZSBmcm9tIHNvdXJjZS4KKyAgICBpbnQgY2hyQnVmSW5kZXg7ICAgICAgICAgICAgICAvLy88IEluZGV4IGluIHJpbmcgYnVmZmVyIG9mIHRoZSBsYXN0IHNjYWxlZCBob3Jpem9udGFsIGNocm9tYSAgICAgbGluZSBmcm9tIHNvdXJjZS4KKyAgICAvL0B9CisKKyAgICB1aW50OF90ICpmb3JtYXRDb252QnVmZmVyOworCisgICAgLyoqCisgICAgICogQG5hbWUgSG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZmlsdGVycy4KKyAgICAgKiBUbyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGUgZm9sbG93aW5nIGZpZWxkcywgaGVyZSBpcyBhIHBzZXVkby1jb2RlIG9mCisgICAgICogdGhlaXIgdXNhZ2UgaW4gZmlsdGVyaW5nIGEgaG9yaXpvbnRhbCBsaW5lOgorICAgICAqIEBjb2RlCisgICAgICogZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgKiAgICAgZHN0W2ldID0gMDsKKyAgICAgKiAgICAgZm9yIChqID0gMDsgaiA8IGZpbHRlclNpemU7IGorKykKKyAgICAgKiAgICAgICAgIGRzdFtpXSArPSBzcmNbIGZpbHRlclBvc1tpXSArIGogXSAqIGZpbHRlclsgZmlsdGVyU2l6ZSAqIGkgKyBqIF07CisgICAgICogICAgIGRzdFtpXSA+Pj0gRlJBQ19CSVRTOyAvLyBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGlzIGZpeGVkLXBvaW50LgorICAgICAqIH0KKyAgICAgKiBAZW5kY29kZQorICAgICAqLworICAgIC8vQHsKKyAgICBpbnQxNl90ICpoTHVtRmlsdGVyOyAgICAgICAgICAvLy88IEFycmF5IG9mIGhvcml6b250YWwgZmlsdGVyIGNvZWZmaWNpZW50cyBmb3IgbHVtYS9hbHBoYSBwbGFuZXMuCisgICAgaW50MTZfdCAqaENockZpbHRlcjsgICAgICAgICAgLy8vPCBBcnJheSBvZiBob3Jpem9udGFsIGZpbHRlciBjb2VmZmljaWVudHMgZm9yIGNocm9tYSAgICAgcGxhbmVzLgorICAgIGludDE2X3QgKnZMdW1GaWx0ZXI7ICAgICAgICAgIC8vLzwgQXJyYXkgb2YgdmVydGljYWwgICBmaWx0ZXIgY29lZmZpY2llbnRzIGZvciBsdW1hL2FscGhhIHBsYW5lcy4KKyAgICBpbnQxNl90ICp2Q2hyRmlsdGVyOyAgICAgICAgICAvLy88IEFycmF5IG9mIHZlcnRpY2FsICAgZmlsdGVyIGNvZWZmaWNpZW50cyBmb3IgY2hyb21hICAgICBwbGFuZXMuCisgICAgaW50MzJfdCAqaEx1bUZpbHRlclBvczsgICAgICAgLy8vPCBBcnJheSBvZiBob3Jpem9udGFsIGZpbHRlciBzdGFydGluZyBwb3NpdGlvbnMgZm9yIGVhY2ggZHN0W2ldIGZvciBsdW1hL2FscGhhIHBsYW5lcy4KKyAgICBpbnQzMl90ICpoQ2hyRmlsdGVyUG9zOyAgICAgICAvLy88IEFycmF5IG9mIGhvcml6b250YWwgZmlsdGVyIHN0YXJ0aW5nIHBvc2l0aW9ucyBmb3IgZWFjaCBkc3RbaV0gZm9yIGNocm9tYSAgICAgcGxhbmVzLgorICAgIGludDMyX3QgKnZMdW1GaWx0ZXJQb3M7ICAgICAgIC8vLzwgQXJyYXkgb2YgdmVydGljYWwgICBmaWx0ZXIgc3RhcnRpbmcgcG9zaXRpb25zIGZvciBlYWNoIGRzdFtpXSBmb3IgbHVtYS9hbHBoYSBwbGFuZXMuCisgICAgaW50MzJfdCAqdkNockZpbHRlclBvczsgICAgICAgLy8vPCBBcnJheSBvZiB2ZXJ0aWNhbCAgIGZpbHRlciBzdGFydGluZyBwb3NpdGlvbnMgZm9yIGVhY2ggZHN0W2ldIGZvciBjaHJvbWEgICAgIHBsYW5lcy4KKyAgICBpbnQgaEx1bUZpbHRlclNpemU7ICAgICAgICAgICAvLy88IEhvcml6b250YWwgZmlsdGVyIHNpemUgZm9yIGx1bWEvYWxwaGEgcGl4ZWxzLgorICAgIGludCBoQ2hyRmlsdGVyU2l6ZTsgICAgICAgICAgIC8vLzwgSG9yaXpvbnRhbCBmaWx0ZXIgc2l6ZSBmb3IgY2hyb21hICAgICBwaXhlbHMuCisgICAgaW50IHZMdW1GaWx0ZXJTaXplOyAgICAgICAgICAgLy8vPCBWZXJ0aWNhbCAgIGZpbHRlciBzaXplIGZvciBsdW1hL2FscGhhIHBpeGVscy4KKyAgICBpbnQgdkNockZpbHRlclNpemU7ICAgICAgICAgICAvLy88IFZlcnRpY2FsICAgZmlsdGVyIHNpemUgZm9yIGNocm9tYSAgICAgcGl4ZWxzLgorICAgIC8vQH0KKworICAgIGludCBsdW1NbXhleHRGaWx0ZXJDb2RlU2l6ZTsgIC8vLzwgUnVudGltZS1nZW5lcmF0ZWQgTU1YRVhUIGhvcml6b250YWwgZmFzdCBiaWxpbmVhciBzY2FsZXIgY29kZSBzaXplIGZvciBsdW1hL2FscGhhIHBsYW5lcy4KKyAgICBpbnQgY2hyTW14ZXh0RmlsdGVyQ29kZVNpemU7ICAvLy88IFJ1bnRpbWUtZ2VuZXJhdGVkIE1NWEVYVCBob3Jpem9udGFsIGZhc3QgYmlsaW5lYXIgc2NhbGVyIGNvZGUgc2l6ZSBmb3IgY2hyb21hIHBsYW5lcy4KKyAgICB1aW50OF90ICpsdW1NbXhleHRGaWx0ZXJDb2RlOyAvLy88IFJ1bnRpbWUtZ2VuZXJhdGVkIE1NWEVYVCBob3Jpem9udGFsIGZhc3QgYmlsaW5lYXIgc2NhbGVyIGNvZGUgZm9yIGx1bWEvYWxwaGEgcGxhbmVzLgorICAgIHVpbnQ4X3QgKmNock1teGV4dEZpbHRlckNvZGU7IC8vLzwgUnVudGltZS1nZW5lcmF0ZWQgTU1YRVhUIGhvcml6b250YWwgZmFzdCBiaWxpbmVhciBzY2FsZXIgY29kZSBmb3IgY2hyb21hIHBsYW5lcy4KKworICAgIGludCBjYW5NTVhFWFRCZVVzZWQ7CisKKyAgICBpbnQgZHN0WTsgICAgICAgICAgICAgICAgICAgICAvLy88IExhc3QgZGVzdGluYXRpb24gdmVydGljYWwgbGluZSBvdXRwdXQgZnJvbSBsYXN0IHNsaWNlLgorICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAgIC8vLzwgRmxhZ3MgcGFzc2VkIGJ5IHRoZSB1c2VyIHRvIHNlbGVjdCBzY2FsZXIgYWxnb3JpdGhtLCBvcHRpbWl6YXRpb25zLCBzdWJzYW1wbGluZywgZXRjLi4uCisgICAgdm9pZCAqeXV2VGFibGU7ICAgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIHl1di0+cmdiIHRhYmxlIHN0YXJ0IHNvIGl0IGNhbiBiZSBmcmVlZCgpCisgICAgLy8gYWxpZ25tZW50IGVuc3VyZXMgdGhlIG9mZnNldCBjYW4gYmUgYWRkZWQgaW4gYSBzaW5nbGUKKyAgICAvLyBpbnN0cnVjdGlvbiBvbiBlLmcuIEFSTQorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50LCB0YWJsZV9nVilbMjU2ICsgMipZVVZSR0JfVEFCTEVfSEVBRFJPT01dOworICAgIHVpbnQ4X3QgKnRhYmxlX3JWWzI1NiArIDIqWVVWUkdCX1RBQkxFX0hFQURST09NXTsKKyAgICB1aW50OF90ICp0YWJsZV9nVVsyNTYgKyAyKllVVlJHQl9UQUJMRV9IRUFEUk9PTV07CisgICAgdWludDhfdCAqdGFibGVfYlVbMjU2ICsgMipZVVZSR0JfVEFCTEVfSEVBRFJPT01dOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MzJfdCwgaW5wdXRfcmdiMnl1dl90YWJsZSlbMTYrNDAqNF07IC8vIFRoaXMgdGFibGUgY2FuIGNvbnRhaW4gYm90aCBDIGFuZCBTSU1EIGZvcm1hdHRlZCB2YWx1ZXMsIHRoZSBDIHZhbGVzIGFyZSBhbHdheXMgYXQgdGhlIFhZX0lEWCBwb2ludHMKKyNkZWZpbmUgUllfSURYIDAKKyNkZWZpbmUgR1lfSURYIDEKKyNkZWZpbmUgQllfSURYIDIKKyNkZWZpbmUgUlVfSURYIDMKKyNkZWZpbmUgR1VfSURYIDQKKyNkZWZpbmUgQlVfSURYIDUKKyNkZWZpbmUgUlZfSURYIDYKKyNkZWZpbmUgR1ZfSURYIDcKKyNkZWZpbmUgQlZfSURYIDgKKyNkZWZpbmUgUkdCMllVVl9TSElGVCAxNQorCisgICAgaW50ICpkaXRoZXJfZXJyb3JbNF07CisKKyAgICAvL0NvbG9yc3BhY2Ugc3R1ZmYKKyAgICBpbnQgY29udHJhc3QsIGJyaWdodG5lc3MsIHNhdHVyYXRpb247ICAgIC8vIGZvciBzd3NfZ2V0Q29sb3JzcGFjZURldGFpbHMKKyAgICBpbnQgc3JjQ29sb3JzcGFjZVRhYmxlWzRdOworICAgIGludCBkc3RDb2xvcnNwYWNlVGFibGVbNF07CisgICAgaW50IHNyY1JhbmdlOyAgICAgICAgICAgICAgICAgLy8vPCAwID0gTVBHIFlVViByYW5nZSwgMSA9IEpQRyBZVVYgcmFuZ2UgKHNvdXJjZSAgICAgIGltYWdlKS4KKyAgICBpbnQgZHN0UmFuZ2U7ICAgICAgICAgICAgICAgICAvLy88IDAgPSBNUEcgWVVWIHJhbmdlLCAxID0gSlBHIFlVViByYW5nZSAoZGVzdGluYXRpb24gaW1hZ2UpLgorICAgIGludCBzcmMwQWxwaGE7CisgICAgaW50IGRzdDBBbHBoYTsKKyAgICBpbnQgc3JjWFlaOworICAgIGludCBkc3RYWVo7CisgICAgaW50IHNyY19oX2Nocl9wb3M7CisgICAgaW50IGRzdF9oX2Nocl9wb3M7CisgICAgaW50IHNyY192X2Nocl9wb3M7CisgICAgaW50IGRzdF92X2Nocl9wb3M7CisgICAgaW50IHl1djJyZ2JfeV9vZmZzZXQ7CisgICAgaW50IHl1djJyZ2JfeV9jb2VmZjsKKyAgICBpbnQgeXV2MnJnYl92MnJfY29lZmY7CisgICAgaW50IHl1djJyZ2JfdjJnX2NvZWZmOworICAgIGludCB5dXYycmdiX3UyZ19jb2VmZjsKKyAgICBpbnQgeXV2MnJnYl91MmJfY29lZmY7CisKKyNkZWZpbmUgUkVEX0RJVEhFUiAgICAgICAgICAgICIwKjgiCisjZGVmaW5lIEdSRUVOX0RJVEhFUiAgICAgICAgICAiMSo4IgorI2RlZmluZSBCTFVFX0RJVEhFUiAgICAgICAgICAgIjIqOCIKKyNkZWZpbmUgWV9DT0VGRiAgICAgICAgICAgICAgICIzKjgiCisjZGVmaW5lIFZSX0NPRUZGICAgICAgICAgICAgICAiNCo4IgorI2RlZmluZSBVQl9DT0VGRiAgICAgICAgICAgICAgIjUqOCIKKyNkZWZpbmUgVkdfQ09FRkYgICAgICAgICAgICAgICI2KjgiCisjZGVmaW5lIFVHX0NPRUZGICAgICAgICAgICAgICAiNyo4IgorI2RlZmluZSBZX09GRlNFVCAgICAgICAgICAgICAgIjgqOCIKKyNkZWZpbmUgVV9PRkZTRVQgICAgICAgICAgICAgICI5KjgiCisjZGVmaW5lIFZfT0ZGU0VUICAgICAgICAgICAgICAiMTAqOCIKKyNkZWZpbmUgTFVNX01NWF9GSUxURVJfT0ZGU0VUICIxMSo4IgorI2RlZmluZSBDSFJfTU1YX0ZJTFRFUl9PRkZTRVQgIjExKjgrNCo0KiJBVl9TVFJJTkdJRlkoTUFYX0ZJTFRFUl9TSVpFKQorI2RlZmluZSBEU1RXX09GRlNFVCAgICAgICAgICAgIjExKjgrNCo0KiJBVl9TVFJJTkdJRlkoTUFYX0ZJTFRFUl9TSVpFKSIqMiIKKyNkZWZpbmUgRVNQX09GRlNFVCAgICAgICAgICAgICIxMSo4KzQqNCoiQVZfU1RSSU5HSUZZKE1BWF9GSUxURVJfU0laRSkiKjIrOCIKKyNkZWZpbmUgVlJPVU5ERVJfT0ZGU0VUICAgICAgICIxMSo4KzQqNCoiQVZfU1RSSU5HSUZZKE1BWF9GSUxURVJfU0laRSkiKjIrMTYiCisjZGVmaW5lIFVfVEVNUCAgICAgICAgICAgICAgICAiMTEqOCs0KjQqIkFWX1NUUklOR0lGWShNQVhfRklMVEVSX1NJWkUpIioyKzI0IgorI2RlZmluZSBWX1RFTVAgICAgICAgICAgICAgICAgIjExKjgrNCo0KiJBVl9TVFJJTkdJRlkoTUFYX0ZJTFRFUl9TSVpFKSIqMiszMiIKKyNkZWZpbmUgWV9URU1QICAgICAgICAgICAgICAgICIxMSo4KzQqNCoiQVZfU1RSSU5HSUZZKE1BWF9GSUxURVJfU0laRSkiKjIrNDAiCisjZGVmaW5lIEFMUF9NTVhfRklMVEVSX09GRlNFVCAiMTEqOCs0KjQqIkFWX1NUUklOR0lGWShNQVhfRklMVEVSX1NJWkUpIioyKzQ4IgorI2RlZmluZSBVVl9PRkZfUFggICAgICAgICAgICAgIjExKjgrNCo0KiJBVl9TVFJJTkdJRlkoTUFYX0ZJTFRFUl9TSVpFKSIqMys0OCIKKyNkZWZpbmUgVVZfT0ZGX0JZVEUgICAgICAgICAgICIxMSo4KzQqNCoiQVZfU1RSSU5HSUZZKE1BWF9GSUxURVJfU0laRSkiKjMrNTYiCisjZGVmaW5lIERJVEhFUjE2ICAgICAgICAgICAgICAiMTEqOCs0KjQqIkFWX1NUUklOR0lGWShNQVhfRklMVEVSX1NJWkUpIiozKzY0IgorI2RlZmluZSBESVRIRVIzMiAgICAgICAgICAgICAgIjExKjgrNCo0KiJBVl9TVFJJTkdJRlkoTUFYX0ZJTFRFUl9TSVpFKSIqMys4MCIKKyNkZWZpbmUgRElUSEVSMzJfSU5UICAgICAgICAgICgxMSo4KzQqNCpNQVhfRklMVEVSX1NJWkUqMys4MCkgLy8gdmFsdWUgZXF1YWwgdG8gYWJvdmUsIHVzZWQgZm9yIGNoZWNraW5nIHRoYXQgdGhlIHN0cnVjdCBoYXNuJ3QgYmVlbiBjaGFuZ2VkIGJ5IG1pc3Rha2UKKworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50NjRfdCwgcmVkRGl0aGVyKTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIGdyZWVuRGl0aGVyKTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIGJsdWVEaXRoZXIpOworCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCB5Q29lZmYpOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50NjRfdCwgdnJDb2VmZik7CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCB1YkNvZWZmKTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIHZnQ29lZmYpOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50NjRfdCwgdWdDb2VmZik7CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCB5T2Zmc2V0KTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIHVPZmZzZXQpOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50NjRfdCwgdk9mZnNldCk7CisgICAgaW50MzJfdCBsdW1NbXhGaWx0ZXJbNCAqIE1BWF9GSUxURVJfU0laRV07CisgICAgaW50MzJfdCBjaHJNbXhGaWx0ZXJbNCAqIE1BWF9GSUxURVJfU0laRV07CisgICAgaW50IGRzdFc7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBXaWR0aCAgb2YgZGVzdGluYXRpb24gbHVtYS9hbHBoYSBwbGFuZXMuCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCBlc3ApOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50NjRfdCwgdlJvdW5kZXIpOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50NjRfdCwgdV90ZW1wKTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIHZfdGVtcCk7CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCB5X3RlbXApOworICAgIGludDMyX3QgYWxwTW14RmlsdGVyWzQgKiBNQVhfRklMVEVSX1NJWkVdOworICAgIC8vIGFsaWdubWVudCBvZiB0aGVzZSB2YWx1ZXMgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IG1lcmVseSBoZXJlCisgICAgLy8gdG8gbWFpbnRhaW4gdGhlIHNhbWUgb2Zmc2V0IGFjcm9zcyB4ODYzMiBhbmQgeDg2LTY0LiBPbmNlIHdlCisgICAgLy8gdXNlIHByb3BlciBvZmZzZXQgbWFjcm9zIGluIHRoZSBhc20sIHRoZXkgY2FuIGJlIHJlbW92ZWQuCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHB0cmRpZmZfdCwgdXZfb2ZmKTsgLy8vPCBvZmZzZXQgKGluIHBpeGVscykgYmV0d2VlbiB1IGFuZCB2IHBsYW5lcworICAgIERFQ0xBUkVfQUxJR05FRCg4LCBwdHJkaWZmX3QsIHV2X29mZngyKTsgLy8vPCBvZmZzZXQgKGluIGJ5dGVzKSBiZXR3ZWVuIHUgYW5kIHYgcGxhbmVzCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQxNl90LCBkaXRoZXIxNilbOF07CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQzMl90LCBkaXRoZXIzMilbOF07CisKKyAgICBjb25zdCB1aW50OF90ICpjaHJEaXRoZXI4LCAqbHVtRGl0aGVyODsKKworI2lmIEhBVkVfQUxUSVZFQworICAgIHZlY3RvciBzaWduZWQgc2hvcnQgICBDWTsKKyAgICB2ZWN0b3Igc2lnbmVkIHNob3J0ICAgQ1JWOworICAgIHZlY3RvciBzaWduZWQgc2hvcnQgICBDQlU7CisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCAgIENHVTsKKyAgICB2ZWN0b3Igc2lnbmVkIHNob3J0ICAgQ0dWOworICAgIHZlY3RvciBzaWduZWQgc2hvcnQgICBPWTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgQ1NISUZUOworICAgIHZlY3RvciBzaWduZWQgc2hvcnQgICp2WUNvZWZmc0JhbmssICp2Q0NvZWZmc0Jhbms7CisjZW5kaWYKKworICAgIGludCB1c2VfbW14X3ZmaWx0ZXI7CisKKy8qIHByZSBkZWZpbmVkIGNvbG9yLXNwYWNlcyBnYW1tYSAqLworI2RlZmluZSBYWVpfR0FNTUEgKDIuNmYpCisjZGVmaW5lIFJHQl9HQU1NQSAoMi4yZikKKyAgICBpbnQxNl90ICp4eXpnYW1tYTsKKyAgICBpbnQxNl90ICpyZ2JnYW1tYTsKKyAgICBpbnQxNl90ICp4eXpnYW1tYWludjsKKyAgICBpbnQxNl90ICpyZ2JnYW1tYWludjsKKyAgICBpbnQxNl90IHh5ejJyZ2JfbWF0cml4WzNdWzRdOworICAgIGludDE2X3QgcmdiMnh5el9tYXRyaXhbM11bNF07CisKKyAgICAvKiBmdW5jdGlvbiBwb2ludGVycyBmb3Igc3dzY2FsZSgpICovCisgICAgeXV2MnBsYW5hcjFfZm4geXV2MnBsYW5lMTsKKyAgICB5dXYycGxhbmFyWF9mbiB5dXYycGxhbmVYOworICAgIHl1djJpbnRlcmxlYXZlZFhfZm4geXV2Mm52MTJjWDsKKyAgICB5dXYycGFja2VkMV9mbiB5dXYycGFja2VkMTsKKyAgICB5dXYycGFja2VkMl9mbiB5dXYycGFja2VkMjsKKyAgICB5dXYycGFja2VkWF9mbiB5dXYycGFja2VkWDsKKyAgICB5dXYyYW55WF9mbiB5dXYyYW55WDsKKworICAgIC8vLyBVbnNjYWxlZCBjb252ZXJzaW9uIG9mIGx1bWEgcGxhbmUgdG8gWVYxMiBmb3IgaG9yaXpvbnRhbCBzY2FsZXIuCisgICAgdm9pZCAoKmx1bVRvWVYxMikodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGNvbnN0IHVpbnQ4X3QgKnNyYzMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCB1aW50MzJfdCAqcGFsKTsKKyAgICAvLy8gVW5zY2FsZWQgY29udmVyc2lvbiBvZiBhbHBoYSBwbGFuZSB0byBZVjEyIGZvciBob3Jpem9udGFsIHNjYWxlci4KKyAgICB2b2lkICgqYWxwVG9ZVjEyKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqc3JjMiwgY29uc3QgdWludDhfdCAqc3JjMywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIHVpbnQzMl90ICpwYWwpOworICAgIC8vLyBVbnNjYWxlZCBjb252ZXJzaW9uIG9mIGNocm9tYSBwbGFuZXMgdG8gWVYxMiBmb3IgaG9yaXpvbnRhbCBzY2FsZXIuCisgICAgdm9pZCAoKmNoclRvWVYxMikodWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLCBjb25zdCB1aW50OF90ICpzcmMzLAorICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgdWludDMyX3QgKnBhbCk7CisKKyAgICAvKioKKyAgICAgKiBGdW5jdGlvbnMgdG8gcmVhZCBwbGFuYXIgaW5wdXQsIHN1Y2ggYXMgcGxhbmFyIFJHQiwgYW5kIGNvbnZlcnQKKyAgICAgKiBpbnRlcm5hbGx5IHRvIFkvVVYvQS4KKyAgICAgKi8KKyAgICAvKiogQHsgKi8KKyAgICB2b2lkICgqcmVhZEx1bVBsYW5hcikodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNF0sIGludCB3aWR0aCwgaW50MzJfdCAqcmdiMnl1dik7CisgICAgdm9pZCAoKnJlYWRDaHJQbGFuYXIpKHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIGNvbnN0IHVpbnQ4X3QgKnNyY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQzMl90ICpyZ2IyeXV2KTsKKyAgICB2b2lkICgqcmVhZEFscFBsYW5hcikodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNF0sIGludCB3aWR0aCwgaW50MzJfdCAqcmdiMnl1dik7CisgICAgLyoqIEB9ICovCisKKyAgICAvKioKKyAgICAgKiBTY2FsZSBvbmUgaG9yaXpvbnRhbCBsaW5lIG9mIGlucHV0IGRhdGEgdXNpbmcgYSBiaWxpbmVhciBmaWx0ZXIKKyAgICAgKiB0byBwcm9kdWNlIG9uZSBsaW5lIG9mIG91dHB1dCBkYXRhLiBDb21wYXJlZCB0byBTd3NDb250ZXh0LT5oU2NhbGUoKSwKKyAgICAgKiBwbGVhc2UgdGFrZSBub3RlIG9mIHRoZSBmb2xsb3dpbmcgY2F2ZWF0cyB3aGVuIHVzaW5nIHRoZXNlOgorICAgICAqIC0gU2NhbGluZyBpcyBkb25lIHVzaW5nIG9ubHkgN2JpdCBpbnN0ZWFkIG9mIDE0Yml0IGNvZWZmaWNpZW50cy4KKyAgICAgKiAtIFlvdSBjYW4gdXNlIG5vIG1vcmUgdGhhbiA1IGlucHV0IHBpeGVscyB0byBwcm9kdWNlIDQgb3V0cHV0CisgICAgICogICBwaXhlbHMuIFRoZXJlZm9yZSwgdGhpcyBmaWx0ZXIgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBkb3duc2NhbGluZworICAgICAqICAgYnkgbW9yZSB0aGFuIH4yMCUgaW4gd2lkdGggKGJlY2F1c2UgdGhhdCBlcXVhbHMgbW9yZSB0aGFuIDUvNHRoCisgICAgICogICBkb3duc2NhbGluZyBhbmQgdGh1cyBtb3JlIHRoYW4gNSBwaXhlbHMgaW5wdXQgcGVyIDQgcGl4ZWxzIG91dHB1dCkuCisgICAgICogLSBJbiBnZW5lcmFsLCBiaWxpbmVhciBmaWx0ZXJzIGNyZWF0ZSBhcnRpZmFjdHMgZHVyaW5nIGRvd25zY2FsaW5nCisgICAgICogICAoZXZlbiB3aGVuIDwyMCUpLCBiZWNhdXNlIG9uZSBvdXRwdXQgcGl4ZWwgd2lsbCBzcGFuIG1vcmUgdGhhbiBvbmUKKyAgICAgKiAgIGlucHV0IHBpeGVsLCBhbmQgdGh1cyBzb21lIHBpeGVscyB3aWxsIG5lZWQgZWRnZXMgb2YgYm90aCBuZWlnaGJvcgorICAgICAqICAgcGl4ZWxzIHRvIGludGVycG9sYXRlIHRoZSBvdXRwdXQgcGl4ZWwuIFNpbmNlIHlvdSBjYW4gdXNlIGF0IG1vc3QKKyAgICAgKiAgIHR3byBpbnB1dCBwaXhlbHMgcGVyIG91dHB1dCBwaXhlbCBpbiBiaWxpbmVhciBzY2FsaW5nLCB0aGlzIGlzCisgICAgICogICBpbXBvc3NpYmxlIGFuZCB0aHVzIGRvd25zY2FsaW5nIGJ5IGFueSBzaXplIHdpbGwgY3JlYXRlIGFydGlmYWN0cy4KKyAgICAgKiBUbyBlbmFibGUgdGhpcyB0eXBlIG9mIHNjYWxpbmcsIHNldCBTV1NfRkxBR19GQVNUX0JJTElORUFSCisgICAgICogaW4gU3dzQ29udGV4dC0+ZmxhZ3MuCisgICAgICovCisgICAgLyoqIEB7ICovCisgICAgdm9pZCAoKmh5c2NhbGVfZmFzdCkoc3RydWN0IFN3c0NvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0LCBpbnQgZHN0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjVywgaW50IHhJbmMpOworICAgIHZvaWQgKCpoY3NjYWxlX2Zhc3QpKHN0cnVjdCBTd3NDb250ZXh0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRzdDEsIGludDE2X3QgKmRzdDIsIGludCBkc3RXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNXLCBpbnQgeEluYyk7CisgICAgLyoqIEB9ICovCisKKyAgICAvKioKKyAgICAgKiBTY2FsZSBvbmUgaG9yaXpvbnRhbCBsaW5lIG9mIGlucHV0IGRhdGEgdXNpbmcgYSBmaWx0ZXIgb3ZlciB0aGUgaW5wdXQKKyAgICAgKiBsaW5lcywgdG8gcHJvZHVjZSBvbmUgKGRpZmZlcmVudGx5IHNpemVkKSBsaW5lIG9mIG91dHB1dCBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGRzdCAgICAgICAgcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIgZm9yIGhvcml6b250YWxseSBzY2FsZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICBkYXRhLiBJZiB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIGNvbXBvbmVudCBvZiBvbmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBwaXhlbCAoU3dzQ29udGV4dC0+ZHN0QnBjKSBpcyA8PSAxMCwgZGF0YQorICAgICAqICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgMTVicGMgaW4gMTZiaXRzIChpbnQxNl90KSB3aWR0aC4gRWxzZSAoaS5lLgorICAgICAqICAgICAgICAgICAgICAgICAgIFN3c0NvbnRleHQtPmRzdEJwYyA9PSAxNiksIGRhdGEgd2lsbCBiZSAxOWJwYyBpbgorICAgICAqICAgICAgICAgICAgICAgICAgIDMyYml0cyAoaW50MzJfdCkgd2lkdGguCisgICAgICogQHBhcmFtIGRzdFcgICAgICAgd2lkdGggb2YgZGVzdGluYXRpb24gaW1hZ2UKKyAgICAgKiBAcGFyYW0gc3JjICAgICAgICBwb2ludGVyIHRvIHNvdXJjZSBkYXRhIHRvIGJlIHNjYWxlZC4gSWYgdGhlIG51bWJlciBvZgorICAgICAqICAgICAgICAgICAgICAgICAgIGJpdHMgcGVyIGNvbXBvbmVudCBvZiBhIHNvdXJjZSBwaXhlbCAoU3dzQ29udGV4dC0+c3JjQnBjKQorICAgICAqICAgICAgICAgICAgICAgICAgIGlzIDgsIHRoaXMgaXMgOGJwYyBpbiA4Yml0cyAodWludDhfdCkgd2lkdGguIEVsc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAoaS5lLiBTd3NDb250ZXh0LT5kc3RCcGMgPiA4KSwgdGhpcyBpcyBuYXRpdmUgZGVwdGgKKyAgICAgKiAgICAgICAgICAgICAgICAgICBpbiAxNmJpdHMgKHVpbnQxNl90KSB3aWR0aC4gSW4gb3RoZXIgd29yZHMsIGZvciA5LWJpdAorICAgICAqICAgICAgICAgICAgICAgICAgIFlVViBpbnB1dCwgdGhpcyBpcyA5YnBjLCBmb3IgMTAtYml0IFlVViBpbnB1dCwgdGhpcyBpcworICAgICAqICAgICAgICAgICAgICAgICAgIDEwYnBjLCBhbmQgZm9yIDE2LWJpdCBSR0Igb3IgWVVWLCB0aGlzIGlzIDE2YnBjLgorICAgICAqIEBwYXJhbSBmaWx0ZXIgICAgIGZpbHRlciBjb2VmZmljaWVudHMgdG8gYmUgdXNlZCBwZXIgb3V0cHV0IHBpeGVsIGZvcgorICAgICAqICAgICAgICAgICAgICAgICAgIHNjYWxpbmcuIFRoaXMgY29udGFpbnMgMTRicHAgZmlsdGVyaW5nIGNvZWZmaWNpZW50cy4KKyAgICAgKiAgICAgICAgICAgICAgICAgICBHdWFyYW50ZWVkIHRvIGNvbnRhaW4gZHN0VyAqIGZpbHRlclNpemUgZW50cmllcy4KKyAgICAgKiBAcGFyYW0gZmlsdGVyUG9zICBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgaW5wdXQgcGl4ZWwgdG8gYmUgdXNlZCBmb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICBlYWNoIG91dHB1dCBwaXhlbCBkdXJpbmcgc2NhbGluZy4gR3VhcmFudGVlZCB0bworICAgICAqICAgICAgICAgICAgICAgICAgIGNvbnRhaW4gZHN0VyBlbnRyaWVzLgorICAgICAqIEBwYXJhbSBmaWx0ZXJTaXplIHRoZSBudW1iZXIgb2YgaW5wdXQgY29lZmZpY2llbnRzIHRvIGJlIHVzZWQgKGFuZAorICAgICAqICAgICAgICAgICAgICAgICAgIHRodXMgdGhlIG51bWJlciBvZiBpbnB1dCBwaXhlbHMgdG8gYmUgdXNlZCkgZm9yCisgICAgICogICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgYSBzaW5nbGUgb3V0cHV0IHBpeGVsLiBJcyBhbGlnbmVkIHRvIDQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAoYW5kIGlucHV0IGNvZWZmaWNpZW50cyB0aHVzIHBhZGRlZCB3aXRoIHplcm9lcykKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0byBzaW1wbGlmeSBjcmVhdGluZyBTSU1EIGNvZGUuCisgICAgICovCisgICAgLyoqIEB7ICovCisgICAgdm9pZCAoKmh5U2NhbGUpKHN0cnVjdCBTd3NDb250ZXh0ICpjLCBpbnQxNl90ICpkc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IGludDE2X3QgKmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqZmlsdGVyUG9zLCBpbnQgZmlsdGVyU2l6ZSk7CisgICAgdm9pZCAoKmhjU2NhbGUpKHN0cnVjdCBTd3NDb250ZXh0ICpjLCBpbnQxNl90ICpkc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IGludDE2X3QgKmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqZmlsdGVyUG9zLCBpbnQgZmlsdGVyU2l6ZSk7CisgICAgLyoqIEB9ICovCisKKyAgICAvLy8gQ29sb3IgcmFuZ2UgY29udmVyc2lvbiBmdW5jdGlvbiBmb3IgbHVtYSBwbGFuZSBpZiBuZWVkZWQuCisgICAgdm9pZCAoKmx1bUNvbnZlcnRSYW5nZSkoaW50MTZfdCAqZHN0LCBpbnQgd2lkdGgpOworICAgIC8vLyBDb2xvciByYW5nZSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZvciBjaHJvbWEgcGxhbmVzIGlmIG5lZWRlZC4KKyAgICB2b2lkICgqY2hyQ29udmVydFJhbmdlKShpbnQxNl90ICpkc3QxLCBpbnQxNl90ICpkc3QyLCBpbnQgd2lkdGgpOworCisgICAgaW50IG5lZWRzX2hjc2NhbGU7IC8vLzwgU2V0IGlmIHRoZXJlIGFyZSBjaHJvbWEgcGxhbmVzIHRvIGJlIGNvbnZlcnRlZC4KKworICAgIFN3c0RpdGhlciBkaXRoZXI7Cit9IFN3c0NvbnRleHQ7CisvL0ZJWE1FIGNoZWNrIGluaXQgKHdoZXJlIDApCisKK1N3c0Z1bmMgZmZfeXV2MnJnYl9nZXRfZnVuY19wdHIoU3dzQ29udGV4dCAqYyk7CitpbnQgZmZfeXV2MnJnYl9jX2luaXRfdGFibGVzKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludCBpbnZfdGFibGVbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmdWxsUmFuZ2UsIGludCBicmlnaHRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udHJhc3QsIGludCBzYXR1cmF0aW9uKTsKK3ZvaWQgZmZfeXV2MnJnYl9pbml0X3RhYmxlc19wcGMoU3dzQ29udGV4dCAqYywgY29uc3QgaW50IGludl90YWJsZVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3MsIGludCBjb250cmFzdCwgaW50IHNhdHVyYXRpb24pOworCit2b2lkIHVwZGF0ZU1NWERpdGhlclRhYmxlcyhTd3NDb250ZXh0ICpjLCBpbnQgZHN0WSwgaW50IGx1bUJ1ZkluZGV4LCBpbnQgY2hyQnVmSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdEluTHVtQnVmLCBpbnQgbGFzdEluQ2hyQnVmKTsKKworYXZfY29sZCB2b2lkIGZmX3N3c19pbml0X3JhbmdlX2NvbnZlcnQoU3dzQ29udGV4dCAqYyk7CisKK1N3c0Z1bmMgZmZfeXV2MnJnYl9pbml0X3g4NihTd3NDb250ZXh0ICpjKTsKK1N3c0Z1bmMgZmZfeXV2MnJnYl9pbml0X3BwYyhTd3NDb250ZXh0ICpjKTsKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGlzMTZCUFMoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MpOworICAgIHJldHVybiBkZXNjLT5jb21wWzBdLmRlcHRoX21pbnVzMSA9PSAxNTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGlzOV9PUl8xMEJQUyhlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIGF2X2Fzc2VydDAoZGVzYyk7CisgICAgcmV0dXJuIGRlc2MtPmNvbXBbMF0uZGVwdGhfbWludXMxID49IDggJiYgZGVzYy0+Y29tcFswXS5kZXB0aF9taW51czEgPD0gMTM7Cit9CisKKyNkZWZpbmUgaXNOQlBTKHgpIGlzOV9PUl8xMEJQUyh4KQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaXNCRShlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIGF2X2Fzc2VydDAoZGVzYyk7CisgICAgcmV0dXJuIGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaXNZVVYoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MpOworICAgIHJldHVybiAhKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQikgJiYgZGVzYy0+bmJfY29tcG9uZW50cyA+PSAyOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaXNQbGFuYXJZVVYoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MpOworICAgIHJldHVybiAoKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUikgJiYgaXNZVVYocGl4X2ZtdCkpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaXNSR0IoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MpOworICAgIHJldHVybiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUkdCKTsKK30KKworI2lmIDAgLy8gRklYTUUKKyNkZWZpbmUgaXNHcmF5KHgpIFwKKyAgICAoIShhdl9waXhfZm10X2Rlc2NfZ2V0KHgpLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwpICYmIFwKKyAgICAgYXZfcGl4X2ZtdF9kZXNjX2dldCh4KS0+bmJfY29tcG9uZW50cyA8PSAyKQorI2Vsc2UKKyNkZWZpbmUgaXNHcmF5KHgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKHgpID09IEFWX1BJWF9GTVRfR1JBWTggICAgICAgfHwgIFwKKyAgICAgKHgpID09IEFWX1BJWF9GTVRfWUE4ICAgICAgICAgfHwgIFwKKyAgICAgKHgpID09IEFWX1BJWF9GTVRfR1JBWTE2QkUgICAgfHwgIFwKKyAgICAgKHgpID09IEFWX1BJWF9GTVRfR1JBWTE2TEUgICAgfHwgIFwKKyAgICAgKHgpID09IEFWX1BJWF9GTVRfWUExNkJFICAgICAgfHwgIFwKKyAgICAgKHgpID09IEFWX1BJWF9GTVRfWUExNkxFKQorI2VuZGlmCisKKyNkZWZpbmUgaXNSR0JpbkludCh4KSBcCisgICAgKCAgICAgICAgICAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0OEJFICAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0OExFICAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0IzMiAgICAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0IzMl8xICAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0IyNCAgICAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I1NjVCRSAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I1NjVMRSAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I1NTVCRSAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I1NTVMRSAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0NDRCRSAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0NDRMRSAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I4ICAgICAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0ICAgICAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0X0JZVEUgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0JBNjRCRSAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0JBNjRMRSAgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9NT05PQkxBQ0sgICB8fCAgXAorICAgICAoeCkgPT0gQVZfUElYX0ZNVF9NT05PV0hJVEUgICBcCisgICAgKQorI2RlZmluZSBpc0JHUmluSW50KHgpIFwKKyAgICAoICAgICAgICAgICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjQ4QkUgICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjQ4TEUgICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjMyICAgICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjMyXzEgICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjI0ICAgICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjU2NUJFICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjU2NUxFICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjU1NUJFICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjU1NUxFICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjQ0NEJFICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjQ0NExFICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjggICAgICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjQgICAgICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjRfQllURSAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUkE2NEJFICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUkE2NExFICAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX01PTk9CTEFDSyAgIHx8ICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX01PTk9XSElURSAgIFwKKyAgICApCisKKyNkZWZpbmUgaXNSR0JpbkJ5dGVzKHgpICggICAgICAgICAgIFwKKyAgICAgICAgICAgKHgpID09IEFWX1BJWF9GTVRfUkdCNDhCRSAgICAgXAorICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0OExFICAgICBcCisgICAgICAgIHx8ICh4KSA9PSBBVl9QSVhfRk1UX1JHQkE2NEJFICAgIFwKKyAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfUkdCQTY0TEUgICAgXAorICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9SR0JBICAgICAgICBcCisgICAgICAgIHx8ICh4KSA9PSBBVl9QSVhfRk1UX0FSR0IgICAgICAgIFwKKyAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfUkdCMjQgICAgICAgXAorICAgICkKKyNkZWZpbmUgaXNCR1JpbkJ5dGVzKHgpICggICAgICAgICAgIFwKKyAgICAgICAgICAgKHgpID09IEFWX1BJWF9GTVRfQkdSNDhCRSAgICAgXAorICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9CR1I0OExFICAgICBcCisgICAgICAgIHx8ICh4KSA9PSBBVl9QSVhfRk1UX0JHUkE2NEJFICAgIFwKKyAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfQkdSQTY0TEUgICAgXAorICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9CR1JBICAgICAgICBcCisgICAgICAgIHx8ICh4KSA9PSBBVl9QSVhfRk1UX0FCR1IgICAgICAgIFwKKyAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfQkdSMjQgICAgICAgXAorICAgICkKKworI2RlZmluZSBpc0JheWVyKHgpICggXAorICAgICAgICAgICAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfQkdHUjggICAgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfQkdHUjE2TEUgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfQkdHUjE2QkUgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfUkdHQjggICAgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfUkdHQjE2TEUgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfUkdHQjE2QkUgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfR0JSRzggICAgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfR0JSRzE2TEUgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfR0JSRzE2QkUgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfR1JCRzggICAgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfR1JCRzE2TEUgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfQkFZRVJfR1JCRzE2QkUgXAorICAgICkKKworI2RlZmluZSBpc0FueVJHQih4KSBcCisgICAgKCAgICAgICAgICAgXAorICAgICAgICAgIGlzQmF5ZXIoeCkgICAgICAgICAgfHwgICAgXAorICAgICAgICAgIGlzUkdCaW5JbnQoeCkgICAgICAgfHwgICAgXAorICAgICAgICAgIGlzQkdSaW5JbnQoeCkgICAgICAgfHwgICAgXAorICAgICAgICAgIGlzUkdCKHgpICAgICAgXAorICAgICkKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGlzQUxQSEEoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MpOworICAgIGlmIChwaXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBOworfQorCisjaWYgMQorI2RlZmluZSBpc1BhY2tlZCh4KSAgICAgICAgICggICAgICAgXAorICAgICAgICAgICAoeCk9PUFWX1BJWF9GTVRfUEFMOCAgICAgICAgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfWVVZVjQyMiAgICAgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfWVZZVTQyMiAgICAgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfVVlWWTQyMiAgICAgXAorICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfWUE4ICAgICAgIFwKKyAgICAgICAgfHwgKHgpPT1BVl9QSVhfRk1UX1lBMTZMRSAgICAgIFwKKyAgICAgICAgfHwgKHgpPT1BVl9QSVhfRk1UX1lBMTZCRSAgICAgIFwKKyAgICAgICAgfHwgIGlzUkdCaW5JbnQoeCkgICAgICAgICAgIFwKKyAgICAgICAgfHwgIGlzQkdSaW5JbnQoeCkgICAgICAgICAgIFwKKyAgICApCisjZWxzZQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGlzUGFja2VkKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4X2ZtdCk7CisgICAgYXZfYXNzZXJ0MChkZXNjKTsKKyAgICByZXR1cm4gKChkZXNjLT5uYl9jb21wb25lbnRzID49IDIgJiYgIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QTEFOQVIpKSB8fAorICAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpOworfQorCisjZW5kaWYKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBpc1BsYW5hcihlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIGF2X2Fzc2VydDAoZGVzYyk7CisgICAgcmV0dXJuIChkZXNjLT5uYl9jb21wb25lbnRzID49IDIgJiYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUikpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaXNQYWNrZWRSR0IoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MpOworICAgIHJldHVybiAoKGRlc2MtPmZsYWdzICYgKEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCKSkgPT0gQVZfUElYX0ZNVF9GTEFHX1JHQik7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBpc1BsYW5hclJHQihlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIGF2X2Fzc2VydDAoZGVzYyk7CisgICAgcmV0dXJuICgoZGVzYy0+ZmxhZ3MgJiAoQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19SR0IpKSA9PQorICAgICAgICAgICAgKEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCKSk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB1c2VQYWwoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MpOworICAgIHJldHVybiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMKSB8fCAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKTsKK30KKworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX2RpdGhlcjRbMl07CitleHRlcm4gY29uc3QgdWludDY0X3QgZmZfZGl0aGVyOFsyXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZGl0aGVyXzJ4Ml80WzNdWzhdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZGl0aGVyXzJ4Ml84WzNdWzhdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZGl0aGVyXzR4NF8xNls1XVs4XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2RpdGhlcl84eDhfMzJbOV1bOF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9kaXRoZXJfOHg4XzczWzldWzhdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZGl0aGVyXzh4OF8xMjhbOV1bOF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9kaXRoZXJfOHg4XzIyMFs5XVs4XTsKKworZXh0ZXJuIGNvbnN0IGludDMyX3QgZmZfeXV2MnJnYl9jb2VmZnNbOF1bNF07CisKK2V4dGVybiBjb25zdCBBVkNsYXNzIHN3c19jb250ZXh0X2NsYXNzOworCisvKioKKyAqIFNldCBjLT5zd3NjYWxlIHRvIGFuIHVuc2NhbGVkIGNvbnZlcnRlciBpZiBvbmUgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWMKKyAqIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZm9ybWF0cywgYml0IGRlcHRocywgZmxhZ3MsIGV0Yy4KKyAqLwordm9pZCBmZl9nZXRfdW5zY2FsZWRfc3dzY2FsZShTd3NDb250ZXh0ICpjKTsKK3ZvaWQgZmZfZ2V0X3Vuc2NhbGVkX3N3c2NhbGVfcHBjKFN3c0NvbnRleHQgKmMpOwordm9pZCBmZl9nZXRfdW5zY2FsZWRfc3dzY2FsZV9hcm0oU3dzQ29udGV4dCAqYyk7CisKKy8qKgorICogUmV0dXJuIGZ1bmN0aW9uIHBvaW50ZXIgdG8gZmFzdGVzdCBtYWluIHNjYWxlciBwYXRoIGZ1bmN0aW9uIGRlcGVuZGluZworICogb24gYXJjaGl0ZWN0dXJlIGFuZCBhdmFpbGFibGUgb3B0aW1pemF0aW9ucy4KKyAqLworU3dzRnVuYyBmZl9nZXRTd3NGdW5jKFN3c0NvbnRleHQgKmMpOworCit2b2lkIGZmX3N3c19pbml0X2lucHV0X2Z1bmNzKFN3c0NvbnRleHQgKmMpOwordm9pZCBmZl9zd3NfaW5pdF9vdXRwdXRfZnVuY3MoU3dzQ29udGV4dCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djJwbGFuYXIxX2ZuICp5dXYycGxhbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnBsYW5hclhfZm4gKnl1djJwbGFuZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXYyaW50ZXJsZWF2ZWRYX2ZuICp5dXYybnYxMmNYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnBhY2tlZDFfZm4gKnl1djJwYWNrZWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnBhY2tlZDJfZm4gKnl1djJwYWNrZWQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnBhY2tlZFhfZm4gKnl1djJwYWNrZWRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2MmFueVhfZm4gKnl1djJhbnlYKTsKK3ZvaWQgZmZfc3dzX2luaXRfc3dzY2FsZV9wcGMoU3dzQ29udGV4dCAqYyk7Cit2b2lkIGZmX3N3c19pbml0X3N3c2NhbGVfeDg2KFN3c0NvbnRleHQgKmMpOworCit2b2lkIGZmX2h5c2NhbGVfZmFzdF9jKFN3c0NvbnRleHQgKmMsIGludDE2X3QgKmRzdCwgaW50IGRzdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNXLCBpbnQgeEluYyk7Cit2b2lkIGZmX2hjc2NhbGVfZmFzdF9jKFN3c0NvbnRleHQgKmMsIGludDE2X3QgKmRzdDEsIGludDE2X3QgKmRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RXaWR0aCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IHNyY1csIGludCB4SW5jKTsKK2ludCBmZl9pbml0X2hzY2FsZXJfbW14ZXh0KGludCBkc3RXLCBpbnQgeEluYywgdWludDhfdCAqZmlsdGVyQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmZpbHRlciwgaW50MzJfdCAqZmlsdGVyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bVNwbGl0cyk7Cit2b2lkIGZmX2h5c2NhbGVfZmFzdF9tbXhleHQoU3dzQ29udGV4dCAqYywgaW50MTZfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RXaWR0aCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNXLCBpbnQgeEluYyk7Cit2b2lkIGZmX2hjc2NhbGVfZmFzdF9tbXhleHQoU3dzQ29udGV4dCAqYywgaW50MTZfdCAqZHN0MSwgaW50MTZfdCAqZHN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0V2lkdGgsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IHNyY1csIGludCB4SW5jKTsKKworc3RhdGljIGlubGluZSB2b2lkIGZpbGxQbGFuZTE2KHVpbnQ4X3QgKnBsYW5lLCBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgaW50IGJpdHMsIGNvbnN0IGludCBiaWdfZW5kaWFuKQoreworICAgIGludCBpLCBqOworICAgIHVpbnQ4X3QgKnB0ciA9IHBsYW5lICsgc3RyaWRlICogeTsKKyAgICBpbnQgdiA9IGFscGhhID8gMHhGRkZGPj4oMTUtYml0cykgOiAoMTw8Yml0cyk7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisjZGVmaW5lIEZJTEwod2Z1bmMpIFwKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHtcCisgICAgICAgICAgICB3ZnVuYyhwdHIrMipqLCB2KTtcCisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpZ19lbmRpYW4pIHsKKyAgICAgICAgICAgIEZJTEwoQVZfV0IxNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGSUxMKEFWX1dMMTYpOworICAgICAgICB9CisgICAgICAgIHB0ciArPSBzdHJpZGU7CisgICAgfQorfQorCisjZW5kaWYgLyogU1dTQ0FMRV9TV1NDQUxFX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL3N3c2NhbGVfdW5zY2FsZWQuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL3N3c2NhbGVfdW5zY2FsZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ1N2RmCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvc3dzY2FsZV91bnNjYWxlZC5jCkBAIC0wLDAgKzEsMTc4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInN3c2NhbGUuaCIKKyNpbmNsdWRlICJzd3NjYWxlX2ludGVybmFsLmgiCisjaW5jbHVkZSAicmdiMnJnYi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKK0RFQ0xBUkVfQUxJR05FRCg4LCBzdGF0aWMgY29uc3QgdWludDhfdCwgZGl0aGVycylbOF1bOF1bOF09eworeworICB7ICAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsfSwKKyAgeyAgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLH0sCisgIHsgICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSx9LAorICB7ICAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsfSwKKyAgeyAgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLH0sCisgIHsgICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCx9LAorICB7ICAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsfSwKKyAgeyAgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLH0sCit9LHsKKyAgeyAgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLH0sCisgIHsgICAzLCAgMCwgIDMsICAwLCAgMywgIDAsICAzLCAgMCx9LAorICB7ICAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsfSwKKyAgeyAgIDMsICAwLCAgMywgIDAsICAzLCAgMCwgIDMsICAwLH0sCisgIHsgICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMix9LAorICB7ICAgMywgIDAsICAzLCAgMCwgIDMsICAwLCAgMywgIDAsfSwKKyAgeyAgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLH0sCisgIHsgICAzLCAgMCwgIDMsICAwLCAgMywgIDAsICAzLCAgMCx9LAorfSx7CisgIHsgICAyLCAgNCwgIDMsICA1LCAgMiwgIDQsICAzLCAgNSx9LAorICB7ICAgNiwgIDAsICA3LCAgMSwgIDYsICAwLCAgNywgIDEsfSwKKyAgeyAgIDMsICA1LCAgMiwgIDQsICAzLCAgNSwgIDIsICA0LH0sCisgIHsgICA3LCAgMSwgIDYsICAwLCAgNywgIDEsICA2LCAgMCx9LAorICB7ICAgMiwgIDQsICAzLCAgNSwgIDIsICA0LCAgMywgIDUsfSwKKyAgeyAgIDYsICAwLCAgNywgIDEsICA2LCAgMCwgIDcsICAxLH0sCisgIHsgICAzLCAgNSwgIDIsICA0LCAgMywgIDUsICAyLCAgNCx9LAorICB7ICAgNywgIDEsICA2LCAgMCwgIDcsICAxLCAgNiwgIDAsfSwKK30seworICB7ICAgNCwgIDgsICA3LCAxMSwgIDQsICA4LCAgNywgMTEsfSwKKyAgeyAgMTIsICAwLCAxNSwgIDMsIDEyLCAgMCwgMTUsICAzLH0sCisgIHsgICA2LCAxMCwgIDUsICA5LCAgNiwgMTAsICA1LCAgOSx9LAorICB7ICAxNCwgIDIsIDEzLCAgMSwgMTQsICAyLCAxMywgIDEsfSwKKyAgeyAgIDQsICA4LCAgNywgMTEsICA0LCAgOCwgIDcsIDExLH0sCisgIHsgIDEyLCAgMCwgMTUsICAzLCAxMiwgIDAsIDE1LCAgMyx9LAorICB7ICAgNiwgMTAsICA1LCAgOSwgIDYsIDEwLCAgNSwgIDksfSwKKyAgeyAgMTQsICAyLCAxMywgIDEsIDE0LCAgMiwgMTMsICAxLH0sCit9LHsKKyAgeyAgIDksIDE3LCAxNSwgMjMsICA4LCAxNiwgMTQsIDIyLH0sCisgIHsgIDI1LCAgMSwgMzEsICA3LCAyNCwgIDAsIDMwLCAgNix9LAorICB7ICAxMywgMjEsIDExLCAxOSwgMTIsIDIwLCAxMCwgMTgsfSwKKyAgeyAgMjksICA1LCAyNywgIDMsIDI4LCAgNCwgMjYsICAyLH0sCisgIHsgICA4LCAxNiwgMTQsIDIyLCAgOSwgMTcsIDE1LCAyMyx9LAorICB7ICAyNCwgIDAsIDMwLCAgNiwgMjUsICAxLCAzMSwgIDcsfSwKKyAgeyAgMTIsIDIwLCAxMCwgMTgsIDEzLCAyMSwgMTEsIDE5LH0sCisgIHsgIDI4LCAgNCwgMjYsICAyLCAyOSwgIDUsIDI3LCAgMyx9LAorfSx7CisgIHsgIDE4LCAzNCwgMzAsIDQ2LCAxNywgMzMsIDI5LCA0NSx9LAorICB7ICA1MCwgIDIsIDYyLCAxNCwgNDksICAxLCA2MSwgMTMsfSwKKyAgeyAgMjYsIDQyLCAyMiwgMzgsIDI1LCA0MSwgMjEsIDM3LH0sCisgIHsgIDU4LCAxMCwgNTQsICA2LCA1NywgIDksIDUzLCAgNSx9LAorICB7ICAxNiwgMzIsIDI4LCA0NCwgMTksIDM1LCAzMSwgNDcsfSwKKyAgeyAgNDgsICAwLCA2MCwgMTIsIDUxLCAgMywgNjMsIDE1LH0sCisgIHsgIDI0LCA0MCwgMjAsIDM2LCAyNywgNDMsIDIzLCAzOSx9LAorICB7ICA1NiwgIDgsIDUyLCAgNCwgNTksIDExLCA1NSwgIDcsfSwKK30seworICB7ICAxOCwgMzQsIDMwLCA0NiwgMTcsIDMzLCAyOSwgNDUsfSwKKyAgeyAgNTAsICAyLCA2MiwgMTQsIDQ5LCAgMSwgNjEsIDEzLH0sCisgIHsgIDI2LCA0MiwgMjIsIDM4LCAyNSwgNDEsIDIxLCAzNyx9LAorICB7ICA1OCwgMTAsIDU0LCAgNiwgNTcsICA5LCA1MywgIDUsfSwKKyAgeyAgMTYsIDMyLCAyOCwgNDQsIDE5LCAzNSwgMzEsIDQ3LH0sCisgIHsgIDQ4LCAgMCwgNjAsIDEyLCA1MSwgIDMsIDYzLCAxNSx9LAorICB7ICAyNCwgNDAsIDIwLCAzNiwgMjcsIDQzLCAyMywgMzksfSwKKyAgeyAgNTYsICA4LCA1MiwgIDQsIDU5LCAxMSwgNTUsICA3LH0sCit9LHsKKyAgeyAgMzYsIDY4LCA2MCwgOTIsIDM0LCA2NiwgNTgsIDkwLH0sCisgIHsgMTAwLCAgNCwxMjQsIDI4LCA5OCwgIDIsMTIyLCAyNix9LAorICB7ICA1MiwgODQsIDQ0LCA3NiwgNTAsIDgyLCA0MiwgNzQsfSwKKyAgeyAxMTYsIDIwLDEwOCwgMTIsMTE0LCAxOCwxMDYsIDEwLH0sCisgIHsgIDMyLCA2NCwgNTYsIDg4LCAzOCwgNzAsIDYyLCA5NCx9LAorICB7ICA5NiwgIDAsMTIwLCAyNCwxMDIsICA2LDEyNiwgMzAsfSwKKyAgeyAgNDgsIDgwLCA0MCwgNzIsIDU0LCA4NiwgNDYsIDc4LH0sCisgIHsgMTEyLCAxNiwxMDQsICA4LDExOCwgMjIsMTEwLCAxNCx9LAorfX07CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBkaXRoZXJfc2NhbGVbMTVdWzE2XT17Cit7ICAgIDIsICAgIDMsICAgIDMsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsfSwKK3sgICAgMiwgICAgMywgICAgNywgICAgNywgICAxMywgICAxMywgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSx9LAoreyAgICAzLCAgICAzLCAgICA0LCAgIDE1LCAgIDE1LCAgIDI5LCAgIDU3LCAgIDU3LCAgIDU3LCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLH0sCit7ICAgIDMsICAgIDQsICAgIDQsICAgIDUsICAgMzEsICAgMzEsICAgNjEsICAxMjEsICAyNDEsICAyNDEsICAyNDEsICAyNDEsICA0ODEsICA0ODEsICA0ODEsICA0ODEsfSwKK3sgICAgMywgICAgNCwgICAgNSwgICAgNSwgICAgNiwgICA2MywgICA2MywgIDEyNSwgIDI0OSwgIDQ5NywgIDk5MywgIDk5MywgIDk5MywgIDk5MywgIDk5MywgMTk4NSx9LAoreyAgICAzLCAgICA1LCAgICA2LCAgICA2LCAgICA2LCAgICA3LCAgMTI3LCAgMTI3LCAgMjUzLCAgNTA1LCAxMDA5LCAyMDE3LCA0MDMzLCA0MDMzLCA0MDMzLCA0MDMzLH0sCit7ICAgIDMsICAgIDUsICAgIDYsICAgIDcsICAgIDcsICAgIDcsICAgIDgsICAyNTUsICAyNTUsICA1MDksIDEwMTcsIDIwMzMsIDQwNjUsIDgxMjksMTYyNTcsMTYyNTcsfSwKK3sgICAgMywgICAgNSwgICAgNiwgICAgOCwgICAgOCwgICAgOCwgICAgOCwgICAgOSwgIDUxMSwgIDUxMSwgMTAyMSwgMjA0MSwgNDA4MSwgODE2MSwxNjMyMSwzMjY0MSx9LAoreyAgICAzLCAgICA1LCAgICA3LCAgICA4LCAgICA5LCAgICA5LCAgICA5LCAgICA5LCAgIDEwLCAxMDIzLCAxMDIzLCAyMDQ1LCA0MDg5LCA4MTc3LDE2MzUzLDMyNzA1LH0sCit7ICAgIDMsICAgIDUsICAgIDcsICAgIDgsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTEsIDIwNDcsIDIwNDcsIDQwOTMsIDgxODUsMTYzNjksMzI3MzcsfSwKK3sgICAgMywgICAgNSwgICAgNywgICAgOCwgICAxMCwgICAxMSwgICAxMSwgICAxMSwgICAxMSwgICAxMSwgICAxMiwgNDA5NSwgNDA5NSwgODE4OSwxNjM3NywzMjc1Myx9LAoreyAgICAzLCAgICA1LCAgICA3LCAgICA5LCAgIDEwLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEzLCA4MTkxLCA4MTkxLDE2MzgxLDMyNzYxLH0sCit7ICAgIDMsICAgIDUsICAgIDcsICAgIDksICAgMTAsICAgMTIsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTQsMTYzODMsMTYzODMsMzI3NjUsfSwKK3sgICAgMywgICAgNSwgICAgNywgICAgOSwgICAxMCwgICAxMiwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNSwzMjc2NywzMjc2Nyx9LAoreyAgICAzLCAgICA1LCAgICA3LCAgICA5LCAgIDExLCAgIDEyLCAgIDE0LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE2LDY1NTM1LH0sCit9OworCisKK3N0YXRpYyB2b2lkIGZpbGxQbGFuZSh1aW50OF90ICpwbGFuZSwgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZhbCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90ICpwdHIgPSBwbGFuZSArIHN0cmlkZSAqIHk7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgIG1lbXNldChwdHIsIHZhbCwgd2lkdGgpOworICAgICAgICBwdHIgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29weVBsYW5lKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgZHN0U3RyaWRlKQoreworICAgIGRzdCArPSBkc3RTdHJpZGUgKiBzcmNTbGljZVk7CisgICAgaWYgKGRzdFN0cmlkZSA9PSBzcmNTdHJpZGUgJiYgc3JjU3RyaWRlID4gMCkgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHNyY1NsaWNlSCAqIGRzdFN0cmlkZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcmNTbGljZUg7IGkrKykgeworICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisgICAgICAgICAgICBzcmMgKz0gc3JjU3RyaWRlOworICAgICAgICAgICAgZHN0ICs9IGRzdFN0cmlkZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBwbGFuYXJUb052MTJXcmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGVbXSwgaW50IHNyY1NsaWNlWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU2xpY2VILCB1aW50OF90ICpkc3RQYXJhbVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICB1aW50OF90ICpkc3QgPSBkc3RQYXJhbVsxXSArIGRzdFN0cmlkZVsxXSAqIHNyY1NsaWNlWSAvIDI7CisKKyAgICBjb3B5UGxhbmUoc3JjWzBdLCBzcmNTdHJpZGVbMF0sIHNyY1NsaWNlWSwgc3JjU2xpY2VILCBjLT5zcmNXLAorICAgICAgICAgICAgICBkc3RQYXJhbVswXSwgZHN0U3RyaWRlWzBdKTsKKworICAgIGlmIChjLT5kc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9OVjEyKQorICAgICAgICBpbnRlcmxlYXZlQnl0ZXMoc3JjWzFdLCBzcmNbMl0sIGRzdCwgYy0+c3JjVyAvIDIsIHNyY1NsaWNlSCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdHJpZGVbMV0sIHNyY1N0cmlkZVsyXSwgZHN0U3RyaWRlWzFdKTsKKyAgICBlbHNlCisgICAgICAgIGludGVybGVhdmVCeXRlcyhzcmNbMl0sIHNyY1sxXSwgZHN0LCBjLT5zcmNXIC8gMiwgc3JjU2xpY2VIIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0cmlkZVsyXSwgc3JjU3RyaWRlWzFdLCBkc3RTdHJpZGVbMV0pOworCisgICAgcmV0dXJuIHNyY1NsaWNlSDsKK30KKworc3RhdGljIGludCBudjEyVG9QbGFuYXJXcmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGVbXSwgaW50IHNyY1NsaWNlWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU2xpY2VILCB1aW50OF90ICpkc3RQYXJhbVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICB1aW50OF90ICpkc3QxID0gZHN0UGFyYW1bMV0gKyBkc3RTdHJpZGVbMV0gKiBzcmNTbGljZVkgLyAyOworICAgIHVpbnQ4X3QgKmRzdDIgPSBkc3RQYXJhbVsyXSArIGRzdFN0cmlkZVsyXSAqIHNyY1NsaWNlWSAvIDI7CisKKyAgICBjb3B5UGxhbmUoc3JjWzBdLCBzcmNTdHJpZGVbMF0sIHNyY1NsaWNlWSwgc3JjU2xpY2VILCBjLT5zcmNXLAorICAgICAgICAgICAgICBkc3RQYXJhbVswXSwgZHN0U3RyaWRlWzBdKTsKKworICAgIGlmIChjLT5zcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9OVjEyKQorICAgICAgICBkZWludGVybGVhdmVCeXRlcyhzcmNbMV0sIGRzdDEsIGRzdDIsYy0+c3JjVyAvIDIsIHNyY1NsaWNlSCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0cmlkZVsxXSwgZHN0U3RyaWRlWzFdLCBkc3RTdHJpZGVbMl0pOworICAgIGVsc2UKKyAgICAgICAgZGVpbnRlcmxlYXZlQnl0ZXMoc3JjWzFdLCBkc3QyLCBkc3QxLCBjLT5zcmNXIC8gMiwgc3JjU2xpY2VIIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RyaWRlWzFdLCBkc3RTdHJpZGVbMl0sIGRzdFN0cmlkZVsxXSk7CisKKyAgICByZXR1cm4gc3JjU2xpY2VIOworfQorCitzdGF0aWMgaW50IHBsYW5hclRvWXV5MldyYXBwZXIoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFBhcmFtW10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICB1aW50OF90ICpkc3QgPSBkc3RQYXJhbVswXSArIGRzdFN0cmlkZVswXSAqIHNyY1NsaWNlWTsKKworICAgIHl2MTJ0b3l1eTIoc3JjWzBdLCBzcmNbMV0sIHNyY1syXSwgZHN0LCBjLT5zcmNXLCBzcmNTbGljZUgsIHNyY1N0cmlkZVswXSwKKyAgICAgICAgICAgICAgIHNyY1N0cmlkZVsxXSwgZHN0U3RyaWRlWzBdKTsKKworICAgIHJldHVybiBzcmNTbGljZUg7Cit9CisKK3N0YXRpYyBpbnQgcGxhbmFyVG9VeXZ5V3JhcHBlcihTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlW10sIGludCBzcmNTbGljZVksIGludCBzcmNTbGljZUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0UGFyYW1bXSwgaW50IGRzdFN0cmlkZVtdKQoreworICAgIHVpbnQ4X3QgKmRzdCA9IGRzdFBhcmFtWzBdICsgZHN0U3RyaWRlWzBdICogc3JjU2xpY2VZOworCisgICAgeXYxMnRvdXl2eShzcmNbMF0sIHNyY1sxXSwgc3JjWzJdLCBkc3QsIGMtPnNyY1csIHNyY1NsaWNlSCwgc3JjU3RyaWRlWzBdLAorICAgICAgICAgICAgICAgc3JjU3RyaWRlWzFdLCBkc3RTdHJpZGVbMF0pOworCisgICAgcmV0dXJuIHNyY1NsaWNlSDsKK30KKworc3RhdGljIGludCB5dXY0MjJwVG9ZdXkyV3JhcHBlcihTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RQYXJhbVtdLCBpbnQgZHN0U3RyaWRlW10pCit7CisgICAgdWludDhfdCAqZHN0ID0gZHN0UGFyYW1bMF0gKyBkc3RTdHJpZGVbMF0gKiBzcmNTbGljZVk7CisKKyAgICB5dXY0MjJwdG95dXkyKHNyY1swXSwgc3JjWzFdLCBzcmNbMl0sIGRzdCwgYy0+c3JjVywgc3JjU2xpY2VILCBzcmNTdHJpZGVbMF0sCisgICAgICAgICAgICAgICAgICBzcmNTdHJpZGVbMV0sIGRzdFN0cmlkZVswXSk7CisKKyAgICByZXR1cm4gc3JjU2xpY2VIOworfQorCitzdGF0aWMgaW50IHl1djQyMnBUb1V5dnlXcmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlW10sIGludCBzcmNTbGljZVksIGludCBzcmNTbGljZUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFBhcmFtW10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICB1aW50OF90ICpkc3QgPSBkc3RQYXJhbVswXSArIGRzdFN0cmlkZVswXSAqIHNyY1NsaWNlWTsKKworICAgIHl1djQyMnB0b3V5dnkoc3JjWzBdLCBzcmNbMV0sIHNyY1syXSwgZHN0LCBjLT5zcmNXLCBzcmNTbGljZUgsIHNyY1N0cmlkZVswXSwKKyAgICAgICAgICAgICAgICAgIHNyY1N0cmlkZVsxXSwgZHN0U3RyaWRlWzBdKTsKKworICAgIHJldHVybiBzcmNTbGljZUg7Cit9CisKK3N0YXRpYyBpbnQgeXV5dlRvWXV2NDIwV3JhcHBlcihTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlW10sIGludCBzcmNTbGljZVksIGludCBzcmNTbGljZUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0UGFyYW1bXSwgaW50IGRzdFN0cmlkZVtdKQoreworICAgIHVpbnQ4X3QgKnlkc3QgPSBkc3RQYXJhbVswXSArIGRzdFN0cmlkZVswXSAqIHNyY1NsaWNlWTsKKyAgICB1aW50OF90ICp1ZHN0ID0gZHN0UGFyYW1bMV0gKyBkc3RTdHJpZGVbMV0gKiBzcmNTbGljZVkgLyAyOworICAgIHVpbnQ4X3QgKnZkc3QgPSBkc3RQYXJhbVsyXSArIGRzdFN0cmlkZVsyXSAqIHNyY1NsaWNlWSAvIDI7CisKKyAgICB5dXl2dG95dXY0MjAoeWRzdCwgdWRzdCwgdmRzdCwgc3JjWzBdLCBjLT5zcmNXLCBzcmNTbGljZUgsIGRzdFN0cmlkZVswXSwKKyAgICAgICAgICAgICAgICAgZHN0U3RyaWRlWzFdLCBzcmNTdHJpZGVbMF0pOworCisgICAgaWYgKGRzdFBhcmFtWzNdKQorICAgICAgICBmaWxsUGxhbmUoZHN0UGFyYW1bM10sIGRzdFN0cmlkZVszXSwgYy0+c3JjVywgc3JjU2xpY2VILCBzcmNTbGljZVksIDI1NSk7CisKKyAgICByZXR1cm4gc3JjU2xpY2VIOworfQorCitzdGF0aWMgaW50IHl1eXZUb1l1djQyMldyYXBwZXIoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFBhcmFtW10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICB1aW50OF90ICp5ZHN0ID0gZHN0UGFyYW1bMF0gKyBkc3RTdHJpZGVbMF0gKiBzcmNTbGljZVk7CisgICAgdWludDhfdCAqdWRzdCA9IGRzdFBhcmFtWzFdICsgZHN0U3RyaWRlWzFdICogc3JjU2xpY2VZOworICAgIHVpbnQ4X3QgKnZkc3QgPSBkc3RQYXJhbVsyXSArIGRzdFN0cmlkZVsyXSAqIHNyY1NsaWNlWTsKKworICAgIHl1eXZ0b3l1djQyMih5ZHN0LCB1ZHN0LCB2ZHN0LCBzcmNbMF0sIGMtPnNyY1csIHNyY1NsaWNlSCwgZHN0U3RyaWRlWzBdLAorICAgICAgICAgICAgICAgICBkc3RTdHJpZGVbMV0sIHNyY1N0cmlkZVswXSk7CisKKyAgICByZXR1cm4gc3JjU2xpY2VIOworfQorCitzdGF0aWMgaW50IHV5dnlUb1l1djQyMFdyYXBwZXIoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFBhcmFtW10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICB1aW50OF90ICp5ZHN0ID0gZHN0UGFyYW1bMF0gKyBkc3RTdHJpZGVbMF0gKiBzcmNTbGljZVk7CisgICAgdWludDhfdCAqdWRzdCA9IGRzdFBhcmFtWzFdICsgZHN0U3RyaWRlWzFdICogc3JjU2xpY2VZIC8gMjsKKyAgICB1aW50OF90ICp2ZHN0ID0gZHN0UGFyYW1bMl0gKyBkc3RTdHJpZGVbMl0gKiBzcmNTbGljZVkgLyAyOworCisgICAgdXl2eXRveXV2NDIwKHlkc3QsIHVkc3QsIHZkc3QsIHNyY1swXSwgYy0+c3JjVywgc3JjU2xpY2VILCBkc3RTdHJpZGVbMF0sCisgICAgICAgICAgICAgICAgIGRzdFN0cmlkZVsxXSwgc3JjU3RyaWRlWzBdKTsKKworICAgIGlmIChkc3RQYXJhbVszXSkKKyAgICAgICAgZmlsbFBsYW5lKGRzdFBhcmFtWzNdLCBkc3RTdHJpZGVbM10sIGMtPnNyY1csIHNyY1NsaWNlSCwgc3JjU2xpY2VZLCAyNTUpOworCisgICAgcmV0dXJuIHNyY1NsaWNlSDsKK30KKworc3RhdGljIGludCB1eXZ5VG9ZdXY0MjJXcmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGVbXSwgaW50IHNyY1NsaWNlWSwgaW50IHNyY1NsaWNlSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RQYXJhbVtdLCBpbnQgZHN0U3RyaWRlW10pCit7CisgICAgdWludDhfdCAqeWRzdCA9IGRzdFBhcmFtWzBdICsgZHN0U3RyaWRlWzBdICogc3JjU2xpY2VZOworICAgIHVpbnQ4X3QgKnVkc3QgPSBkc3RQYXJhbVsxXSArIGRzdFN0cmlkZVsxXSAqIHNyY1NsaWNlWTsKKyAgICB1aW50OF90ICp2ZHN0ID0gZHN0UGFyYW1bMl0gKyBkc3RTdHJpZGVbMl0gKiBzcmNTbGljZVk7CisKKyAgICB1eXZ5dG95dXY0MjIoeWRzdCwgdWRzdCwgdmRzdCwgc3JjWzBdLCBjLT5zcmNXLCBzcmNTbGljZUgsIGRzdFN0cmlkZVswXSwKKyAgICAgICAgICAgICAgICAgZHN0U3RyaWRlWzFdLCBzcmNTdHJpZGVbMF0pOworCisgICAgcmV0dXJuIHNyY1NsaWNlSDsKK30KKworc3RhdGljIHZvaWQgZ3JheThhVG9QYWNrZWQzMihjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBhbGV0dGUpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7IGkrKykKKyAgICAgICAgKCh1aW50MzJfdCAqKSBkc3QpW2ldID0gKChjb25zdCB1aW50MzJfdCAqKSBwYWxldHRlKVtzcmNbaSA8PCAxXV0gfCAoc3JjWyhpIDw8IDEpICsgMV0gPDwgMjQpOworfQorCitzdGF0aWMgdm9pZCBncmF5OGFUb1BhY2tlZDMyXzEoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBhbGV0dGUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgaSsrKQorICAgICAgICAoKHVpbnQzMl90ICopIGRzdClbaV0gPSAoKGNvbnN0IHVpbnQzMl90ICopIHBhbGV0dGUpW3NyY1tpIDw8IDFdXSB8IHNyY1soaSA8PCAxKSArIDFdOworfQorCitzdGF0aWMgdm9pZCBncmF5OGFUb1BhY2tlZDI0KGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGFsZXR0ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyBpKyspIHsKKyAgICAgICAgLy9GSVhNRSBzbG93PworICAgICAgICBkc3RbMF0gPSBwYWxldHRlW3NyY1tpIDw8IDFdICogNCArIDBdOworICAgICAgICBkc3RbMV0gPSBwYWxldHRlW3NyY1tpIDw8IDFdICogNCArIDFdOworICAgICAgICBkc3RbMl0gPSBwYWxldHRlW3NyY1tpIDw8IDFdICogNCArIDJdOworICAgICAgICBkc3QgKz0gMzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcGFja2VkXzE2YnBjX2Jzd2FwKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBpbnQgaSwgaiwgcDsKKworICAgIGZvciAocCA9IDA7IHAgPCA0OyBwKyspIHsKKyAgICAgICAgaW50IHNyY3N0ciA9IHNyY1N0cmlkZVtwXSAvIDI7CisgICAgICAgIGludCBkc3RzdHIgPSBkc3RTdHJpZGVbcF0gLyAyOworICAgICAgICB1aW50MTZfdCAgICAgICAqZHN0UHRyID0gICAgICAgKHVpbnQxNl90ICopIGRzdFtwXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1B0ciA9IChjb25zdCB1aW50MTZfdCAqKSBzcmNbcF07CisgICAgICAgIGludCBtaW5fc3RyaWRlICAgICAgICAgPSBGRk1JTihGRkFCUyhzcmNzdHIpLCBGRkFCUyhkc3RzdHIpKTsKKyAgICAgICAgaWYoIWRzdFB0ciB8fCAhc3JjUHRyKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoc3JjU2xpY2VIID4+IGMtPmNockRzdFZTdWJTYW1wbGUpOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtaW5fc3RyaWRlOyBqKyspIHsKKyAgICAgICAgICAgICAgICBkc3RQdHJbal0gPSBhdl9ic3dhcDE2KHNyY1B0cltqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmNQdHIgKz0gc3Jjc3RyOworICAgICAgICAgICAgZHN0UHRyICs9IGRzdHN0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzcmNTbGljZUg7Cit9CisKK3N0YXRpYyBpbnQgcGFsVG9SZ2JXcmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLCBpbnQgc3JjU3RyaWRlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILCB1aW50OF90ICpkc3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjRm9ybWF0ID0gYy0+c3JjRm9ybWF0OworICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXQgPSBjLT5kc3RGb3JtYXQ7CisgICAgdm9pZCAoKmNvbnYpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGFsZXR0ZSkgPSBOVUxMOworICAgIGludCBpOworICAgIHVpbnQ4X3QgKmRzdFB0ciA9IGRzdFswXSArIGRzdFN0cmlkZVswXSAqIHNyY1NsaWNlWTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNQdHIgPSBzcmNbMF07CisKKyAgICBpZiAoc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfWUE4KSB7CisgICAgICAgIHN3aXRjaCAoZHN0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMiAgOiBjb252ID0gZ3JheThhVG9QYWNrZWQzMjsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IzMiAgOiBjb252ID0gZ3JheThhVG9QYWNrZWQzMjsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IzMl8xOiBjb252ID0gZ3JheThhVG9QYWNrZWQzMl8xOyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjMyXzE6IGNvbnYgPSBncmF5OGFUb1BhY2tlZDMyXzE7IGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQgIDogY29udiA9IGdyYXk4YVRvUGFja2VkMjQ7IGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQgIDogY29udiA9IGdyYXk4YVRvUGFja2VkMjQ7IGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh1c2VQYWwoc3JjRm9ybWF0KSkgeworICAgICAgICBzd2l0Y2ggKGRzdEZvcm1hdCkgeworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMzIgIDogY29udiA9IHN3c19jb252ZXJ0UGFsZXR0ZThUb1BhY2tlZDMyOyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjMyICA6IGNvbnYgPSBzd3NfY29udmVydFBhbGV0dGU4VG9QYWNrZWQzMjsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IzMl8xOiBjb252ID0gc3dzX2NvbnZlcnRQYWxldHRlOFRvUGFja2VkMzI7IGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMzJfMTogY29udiA9IHN3c19jb252ZXJ0UGFsZXR0ZThUb1BhY2tlZDMyOyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0ICA6IGNvbnYgPSBzd3NfY29udmVydFBhbGV0dGU4VG9QYWNrZWQyNDsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IyNCAgOiBjb252ID0gc3dzX2NvbnZlcnRQYWxldHRlOFRvUGFja2VkMjQ7IGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjb252KQorICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiaW50ZXJuYWwgZXJyb3IgJXMgLT4gJXMgY29udmVydGVyXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShzcmNGb3JtYXQpLCBhdl9nZXRfcGl4X2ZtdF9uYW1lKGRzdEZvcm1hdCkpOworICAgIGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3JjU2xpY2VIOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnYoc3JjUHRyLCBkc3RQdHIsIGMtPnNyY1csICh1aW50OF90ICopIGMtPnBhbF9yZ2IpOworICAgICAgICAgICAgc3JjUHRyICs9IHNyY1N0cmlkZVswXTsKKyAgICAgICAgICAgIGRzdFB0ciArPSBkc3RTdHJpZGVbMF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3JjU2xpY2VIOworfQorCitzdGF0aWMgdm9pZCBwYWNrZWQxNnRvZ2JyYTE2KGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRzdFtdLCBpbnQgZHN0U3RyaWRlW10sIGludCBzcmNTbGljZUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEsIGludCBzd2FwLCBpbnQgc2hpZnQsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgaCwgaTsKKyAgICBpbnQgZHN0X2FscGhhID0gZHN0WzNdICE9IE5VTEw7CisgICAgZm9yIChoID0gMDsgaCA8IHNyY1NsaWNlSDsgaCsrKSB7CisgICAgICAgIHVpbnQxNl90ICpzcmNfbGluZSA9ICh1aW50MTZfdCAqKShzcmMgKyBzcmNTdHJpZGUgKiBoKTsKKyAgICAgICAgc3dpdGNoIChzd2FwKSB7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgJiYgZHN0X2FscGhhKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdW3hdID0gYXZfYnN3YXAxNihhdl9ic3dhcDE2KCpzcmNfbGluZSsrKSA+PiBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFsxXVt4XSA9IGF2X2Jzd2FwMTYoYXZfYnN3YXAxNigqc3JjX2xpbmUrKykgPj4gc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBkc3RbMl1beF0gPSBhdl9ic3dhcDE2KGF2X2Jzd2FwMTYoKnNyY19saW5lKyspID4+IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzNdW3hdID0gYXZfYnN3YXAxNihhdl9ic3dhcDE2KCpzcmNfbGluZSsrKSA+PiBzaGlmdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChkc3RfYWxwaGEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBkc3RbMF1beF0gPSBhdl9ic3dhcDE2KGF2X2Jzd2FwMTYoKnNyY19saW5lKyspID4+IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzFdW3hdID0gYXZfYnN3YXAxNihhdl9ic3dhcDE2KCpzcmNfbGluZSsrKSA+PiBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFsyXVt4XSA9IGF2X2Jzd2FwMTYoYXZfYnN3YXAxNigqc3JjX2xpbmUrKykgPj4gc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBkc3RbM11beF0gPSAweEZGRkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBkc3RbMF1beF0gPSBhdl9ic3dhcDE2KGF2X2Jzd2FwMTYoKnNyY19saW5lKyspID4+IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzFdW3hdID0gYXZfYnN3YXAxNihhdl9ic3dhcDE2KCpzcmNfbGluZSsrKSA+PiBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFsyXVt4XSA9IGF2X2Jzd2FwMTYoYXZfYnN3YXAxNigqc3JjX2xpbmUrKykgPj4gc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBzcmNfbGluZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdW3hdID0gYXZfYnN3YXAxNihhdl9ic3dhcDE2KCpzcmNfbGluZSsrKSA+PiBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFsxXVt4XSA9IGF2X2Jzd2FwMTYoYXZfYnN3YXAxNigqc3JjX2xpbmUrKykgPj4gc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBkc3RbMl1beF0gPSBhdl9ic3dhcDE2KGF2X2Jzd2FwMTYoKnNyY19saW5lKyspID4+IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKHNyY19hbHBoYSAmJiBkc3RfYWxwaGEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBkc3RbMF1beF0gPSBhdl9ic3dhcDE2KCpzcmNfbGluZSsrID4+IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzFdW3hdID0gYXZfYnN3YXAxNigqc3JjX2xpbmUrKyA+PiBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFsyXVt4XSA9IGF2X2Jzd2FwMTYoKnNyY19saW5lKysgPj4gc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBkc3RbM11beF0gPSBhdl9ic3dhcDE2KCpzcmNfbGluZSsrID4+IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRzdF9hbHBoYSkgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFswXVt4XSA9IGF2X2Jzd2FwMTYoKnNyY19saW5lKysgPj4gc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBkc3RbMV1beF0gPSBhdl9ic3dhcDE2KCpzcmNfbGluZSsrID4+IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzJdW3hdID0gYXZfYnN3YXAxNigqc3JjX2xpbmUrKyA+PiBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFszXVt4XSA9IDB4RkZGRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFswXVt4XSA9IGF2X2Jzd2FwMTYoKnNyY19saW5lKysgPj4gc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBkc3RbMV1beF0gPSBhdl9ic3dhcDE2KCpzcmNfbGluZSsrID4+IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzJdW3hdID0gYXZfYnN3YXAxNigqc3JjX2xpbmUrKyA+PiBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIHNyY19saW5lKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBkc3RbMF1beF0gPSBhdl9ic3dhcDE2KCpzcmNfbGluZSsrID4+IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzFdW3hdID0gYXZfYnN3YXAxNigqc3JjX2xpbmUrKyA+PiBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFsyXVt4XSA9IGF2X2Jzd2FwMTYoKnNyY19saW5lKysgPj4gc2hpZnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBpZiAoc3JjX2FscGhhICYmIGRzdF9hbHBoYSkgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFswXVt4XSA9IGF2X2Jzd2FwMTYoKnNyY19saW5lKyspID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBkc3RbMV1beF0gPSBhdl9ic3dhcDE2KCpzcmNfbGluZSsrKSA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzJdW3hdID0gYXZfYnN3YXAxNigqc3JjX2xpbmUrKykgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGRzdFszXVt4XSA9IGF2X2Jzd2FwMTYoKnNyY19saW5lKyspID4+IHNoaWZ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZHN0X2FscGhhKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdW3hdID0gYXZfYnN3YXAxNigqc3JjX2xpbmUrKykgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGRzdFsxXVt4XSA9IGF2X2Jzd2FwMTYoKnNyY19saW5lKyspID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBkc3RbMl1beF0gPSBhdl9ic3dhcDE2KCpzcmNfbGluZSsrKSA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzNdW3hdID0gMHhGRkZGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdW3hdID0gYXZfYnN3YXAxNigqc3JjX2xpbmUrKykgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGRzdFsxXVt4XSA9IGF2X2Jzd2FwMTYoKnNyY19saW5lKyspID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBkc3RbMl1beF0gPSBhdl9ic3dhcDE2KCpzcmNfbGluZSsrKSA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgc3JjX2xpbmUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFswXVt4XSA9IGF2X2Jzd2FwMTYoKnNyY19saW5lKyspID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBkc3RbMV1beF0gPSBhdl9ic3dhcDE2KCpzcmNfbGluZSsrKSA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzJdW3hdID0gYXZfYnN3YXAxNigqc3JjX2xpbmUrKykgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoc3JjX2FscGhhICYmIGRzdF9hbHBoYSkgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFswXVt4XSA9ICpzcmNfbGluZSsrID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBkc3RbMV1beF0gPSAqc3JjX2xpbmUrKyA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzJdW3hdID0gKnNyY19saW5lKysgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGRzdFszXVt4XSA9ICpzcmNfbGluZSsrID4+IHNoaWZ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZHN0X2FscGhhKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdW3hdID0gKnNyY19saW5lKysgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGRzdFsxXVt4XSA9ICpzcmNfbGluZSsrID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBkc3RbMl1beF0gPSAqc3JjX2xpbmUrKyA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzNdW3hdID0gMHhGRkZGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdW3hdID0gKnNyY19saW5lKysgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGRzdFsxXVt4XSA9ICpzcmNfbGluZSsrID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBkc3RbMl1beF0gPSAqc3JjX2xpbmUrKyA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgc3JjX2xpbmUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFswXVt4XSA9ICpzcmNfbGluZSsrID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBkc3RbMV1beF0gPSAqc3JjX2xpbmUrKyA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzJdW3hdID0gKnNyY19saW5lKysgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBkc3RbaV0gKz0gZHN0U3RyaWRlW2ldID4+IDE7CisgICAgfQorfQorCitzdGF0aWMgaW50IFJnYjE2VG9QbGFuYXJSZ2IxNldyYXBwZXIoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0U3RyaWRlW10pCit7CisgICAgdWludDE2X3QgKmRzdDIwMTNbXSA9IHsgKHVpbnQxNl90ICopZHN0WzJdLCAodWludDE2X3QgKilkc3RbMF0sICh1aW50MTZfdCAqKWRzdFsxXSwgKHVpbnQxNl90ICopZHN0WzNdIH07CisgICAgdWludDE2X3QgKmRzdDEwMjNbXSA9IHsgKHVpbnQxNl90ICopZHN0WzFdLCAodWludDE2X3QgKilkc3RbMF0sICh1aW50MTZfdCAqKWRzdFsyXSwgKHVpbnQxNl90ICopZHN0WzNdIH07CisgICAgaW50IHN0cmlkZTIwMTNbXSA9IHsgZHN0U3RyaWRlWzJdLCBkc3RTdHJpZGVbMF0sIGRzdFN0cmlkZVsxXSwgZHN0U3RyaWRlWzNdIH07CisgICAgaW50IHN0cmlkZTEwMjNbXSA9IHsgZHN0U3RyaWRlWzFdLCBkc3RTdHJpZGVbMF0sIGRzdFN0cmlkZVsyXSwgZHN0U3RyaWRlWzNdIH07CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpzcmNfZm9ybWF0ID0gYXZfcGl4X2ZtdF9kZXNjX2dldChjLT5zcmNGb3JtYXQpOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZHN0X2Zvcm1hdCA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYy0+ZHN0Rm9ybWF0KTsKKyAgICBpbnQgYnBjID0gZHN0X2Zvcm1hdC0+Y29tcFswXS5kZXB0aF9taW51czEgKyAxOworICAgIGludCBhbHBoYSA9IHNyY19mb3JtYXQtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBOworICAgIGludCBzd2FwID0gMDsKKyAgICBpZiAoIEhBVkVfQklHRU5ESUFOICYmICEoc3JjX2Zvcm1hdC0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQkUpIHx8CisgICAgICAgICFIQVZFX0JJR0VORElBTiAmJiAgIHNyY19mb3JtYXQtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKQorICAgICAgICBzd2FwKys7CisgICAgaWYgKCBIQVZFX0JJR0VORElBTiAmJiAhKGRzdF9mb3JtYXQtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKSB8fAorICAgICAgICAhSEFWRV9CSUdFTkRJQU4gJiYgICBkc3RfZm9ybWF0LT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CRSkKKyAgICAgICAgc3dhcCArPSAyOworCisgICAgaWYgKChkc3RfZm9ybWF0LT5mbGFncyAmIChBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX1JHQikpICE9CisgICAgICAgIChBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX1JHQikgfHwgYnBjIDwgOSkgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgY29udmVyc2lvbiB0byBwbGFuYXIgUkdCICVzIC0+ICVzXG4iLAorICAgICAgICAgICAgICAgc3JjX2Zvcm1hdC0+bmFtZSwgZHN0X2Zvcm1hdC0+bmFtZSk7CisgICAgICAgIHJldHVybiBzcmNTbGljZUg7CisgICAgfQorICAgIHN3aXRjaCAoYy0+c3JjRm9ybWF0KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ4QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRCRToKKyAgICAgICAgcGFja2VkMTZ0b2dicmExNihzcmNbMF0gKyBzcmNTbGljZVkgKiBzcmNTdHJpZGVbMF0sIHNyY1N0cmlkZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyMDEzLCBzdHJpZGUyMDEzLCBzcmNTbGljZUgsIGFscGhhLCBzd2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgIDE2IC0gYnBjLCBjLT5zcmNXKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ4TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ4QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE2NExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBNjRCRToKKyAgICAgICAgcGFja2VkMTZ0b2dicmExNihzcmNbMF0gKyBzcmNTbGljZVkgKiBzcmNTdHJpZGVbMF0sIHNyY1N0cmlkZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3QxMDIzLCBzdHJpZGUxMDIzLCBzcmNTbGljZUgsIGFscGhhLCBzd2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgIDE2IC0gYnBjLCBjLT5zcmNXKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBjb252ZXJzaW9uIHRvIHBsYW5hciBSR0IgJXMgLT4gJXNcbiIsCisgICAgICAgICAgICAgICBzcmNfZm9ybWF0LT5uYW1lLCBkc3RfZm9ybWF0LT5uYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3JjU2xpY2VIOworfQorCitzdGF0aWMgdm9pZCBnYnIxNnB0b3BhY2tlZDE2KGNvbnN0IHVpbnQxNl90ICpzcmNbXSwgaW50IHNyY1N0cmlkZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBkc3RTdHJpZGUsIGludCBzcmNTbGljZUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgaW50IHN3YXAsIGludCBicHAsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgeCwgaCwgaTsKKyAgICBpbnQgc3JjX2FscGhhID0gc3JjWzNdICE9IE5VTEw7CisgICAgaW50IHNjYWxlX2hpZ2ggPSAxNiAtIGJwcCwgc2NhbGVfbG93ID0gKGJwcCAtIDgpICogMjsKKyAgICBmb3IgKGggPSAwOyBoIDwgc3JjU2xpY2VIOyBoKyspIHsKKyAgICAgICAgdWludDE2X3QgKmRlc3QgPSAodWludDE2X3QgKikoZHN0ICsgZHN0U3RyaWRlICogaCk7CisgICAgICAgIHVpbnQxNl90IGNvbXBvbmVudDsKKworICAgICAgICBzd2l0Y2goc3dhcCkgeworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAoYWxwaGEgJiYgIXNyY19hbHBoYSkgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGF2X2Jzd2FwMTYoc3JjWzBdW3hdKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGF2X2Jzd2FwMTYoY29tcG9uZW50IDw8IHNjYWxlX2hpZ2ggfCBjb21wb25lbnQgPj4gc2NhbGVfbG93KTsKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gYXZfYnN3YXAxNihzcmNbMV1beF0pOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYXZfYnN3YXAxNihjb21wb25lbnQgPDwgc2NhbGVfaGlnaCB8IGNvbXBvbmVudCA+PiBzY2FsZV9sb3cpOworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBhdl9ic3dhcDE2KHNyY1syXVt4XSk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBhdl9ic3dhcDE2KGNvbXBvbmVudCA8PCBzY2FsZV9oaWdoIHwgY29tcG9uZW50ID4+IHNjYWxlX2xvdyk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAweGZmZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhbHBoYSAmJiBzcmNfYWxwaGEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBhdl9ic3dhcDE2KHNyY1swXVt4XSk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBhdl9ic3dhcDE2KGNvbXBvbmVudCA8PCBzY2FsZV9oaWdoIHwgY29tcG9uZW50ID4+IHNjYWxlX2xvdyk7CisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGF2X2Jzd2FwMTYoc3JjWzFdW3hdKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGF2X2Jzd2FwMTYoY29tcG9uZW50IDw8IHNjYWxlX2hpZ2ggfCBjb21wb25lbnQgPj4gc2NhbGVfbG93KTsKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gYXZfYnN3YXAxNihzcmNbMl1beF0pOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYXZfYnN3YXAxNihjb21wb25lbnQgPDwgc2NhbGVfaGlnaCB8IGNvbXBvbmVudCA+PiBzY2FsZV9sb3cpOworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBhdl9ic3dhcDE2KHNyY1szXVt4XSk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBhdl9ic3dhcDE2KGNvbXBvbmVudCA8PCBzY2FsZV9oaWdoIHwgY29tcG9uZW50ID4+IHNjYWxlX2xvdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBhdl9ic3dhcDE2KHNyY1swXVt4XSk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBhdl9ic3dhcDE2KGNvbXBvbmVudCA8PCBzY2FsZV9oaWdoIHwgY29tcG9uZW50ID4+IHNjYWxlX2xvdyk7CisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGF2X2Jzd2FwMTYoc3JjWzFdW3hdKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGF2X2Jzd2FwMTYoY29tcG9uZW50IDw8IHNjYWxlX2hpZ2ggfCBjb21wb25lbnQgPj4gc2NhbGVfbG93KTsKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gYXZfYnN3YXAxNihzcmNbMl1beF0pOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYXZfYnN3YXAxNihjb21wb25lbnQgPDwgc2NhbGVfaGlnaCB8IGNvbXBvbmVudCA+PiBzY2FsZV9sb3cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoYWxwaGEgJiYgIXNyY19hbHBoYSkgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBhdl9ic3dhcDE2KHNyY1swXVt4XSA8PCBzY2FsZV9oaWdoIHwgc3JjWzBdW3hdID4+IHNjYWxlX2xvdyk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBhdl9ic3dhcDE2KHNyY1sxXVt4XSA8PCBzY2FsZV9oaWdoIHwgc3JjWzFdW3hdID4+IHNjYWxlX2xvdyk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBhdl9ic3dhcDE2KHNyY1syXVt4XSA8PCBzY2FsZV9oaWdoIHwgc3JjWzJdW3hdID4+IHNjYWxlX2xvdyk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAweGZmZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhbHBoYSAmJiBzcmNfYWxwaGEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYXZfYnN3YXAxNihzcmNbMF1beF0gPDwgc2NhbGVfaGlnaCB8IHNyY1swXVt4XSA+PiBzY2FsZV9sb3cpOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYXZfYnN3YXAxNihzcmNbMV1beF0gPDwgc2NhbGVfaGlnaCB8IHNyY1sxXVt4XSA+PiBzY2FsZV9sb3cpOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYXZfYnN3YXAxNihzcmNbMl1beF0gPDwgc2NhbGVfaGlnaCB8IHNyY1syXVt4XSA+PiBzY2FsZV9sb3cpOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYXZfYnN3YXAxNihzcmNbM11beF0gPDwgc2NhbGVfaGlnaCB8IHNyY1szXVt4XSA+PiBzY2FsZV9sb3cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGF2X2Jzd2FwMTYoc3JjWzBdW3hdIDw8IHNjYWxlX2hpZ2ggfCBzcmNbMF1beF0gPj4gc2NhbGVfbG93KTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGF2X2Jzd2FwMTYoc3JjWzFdW3hdIDw8IHNjYWxlX2hpZ2ggfCBzcmNbMV1beF0gPj4gc2NhbGVfbG93KTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGF2X2Jzd2FwMTYoc3JjWzJdW3hdIDw8IHNjYWxlX2hpZ2ggfCBzcmNbMl1beF0gPj4gc2NhbGVfbG93KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGFscGhhICYmICFzcmNfYWxwaGEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYXZfYnN3YXAxNihzcmNbMF1beF0pIDw8IHNjYWxlX2hpZ2ggfCBhdl9ic3dhcDE2KHNyY1swXVt4XSkgPj4gc2NhbGVfbG93OworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYXZfYnN3YXAxNihzcmNbMV1beF0pIDw8IHNjYWxlX2hpZ2ggfCBhdl9ic3dhcDE2KHNyY1sxXVt4XSkgPj4gc2NhbGVfbG93OworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYXZfYnN3YXAxNihzcmNbMl1beF0pIDw8IHNjYWxlX2hpZ2ggfCBhdl9ic3dhcDE2KHNyY1syXVt4XSkgPj4gc2NhbGVfbG93OworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gMHhmZmZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxwaGEgJiYgc3JjX2FscGhhKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGF2X2Jzd2FwMTYoc3JjWzBdW3hdKSA8PCBzY2FsZV9oaWdoIHwgYXZfYnN3YXAxNihzcmNbMF1beF0pID4+IHNjYWxlX2xvdzsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGF2X2Jzd2FwMTYoc3JjWzFdW3hdKSA8PCBzY2FsZV9oaWdoIHwgYXZfYnN3YXAxNihzcmNbMV1beF0pID4+IHNjYWxlX2xvdzsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGF2X2Jzd2FwMTYoc3JjWzJdW3hdKSA8PCBzY2FsZV9oaWdoIHwgYXZfYnN3YXAxNihzcmNbMl1beF0pID4+IHNjYWxlX2xvdzsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGF2X2Jzd2FwMTYoc3JjWzNdW3hdKSA8PCBzY2FsZV9oaWdoIHwgYXZfYnN3YXAxNihzcmNbM11beF0pID4+IHNjYWxlX2xvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBhdl9ic3dhcDE2KHNyY1swXVt4XSkgPDwgc2NhbGVfaGlnaCB8IGF2X2Jzd2FwMTYoc3JjWzBdW3hdKSA+PiBzY2FsZV9sb3c7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBhdl9ic3dhcDE2KHNyY1sxXVt4XSkgPDwgc2NhbGVfaGlnaCB8IGF2X2Jzd2FwMTYoc3JjWzFdW3hdKSA+PiBzY2FsZV9sb3c7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBhdl9ic3dhcDE2KHNyY1syXVt4XSkgPDwgc2NhbGVfaGlnaCB8IGF2X2Jzd2FwMTYoc3JjWzJdW3hdKSA+PiBzY2FsZV9sb3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoYWxwaGEgJiYgIXNyY19hbHBoYSkgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBzcmNbMF1beF0gPDwgc2NhbGVfaGlnaCB8IHNyY1swXVt4XSA+PiBzY2FsZV9sb3c7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBzcmNbMV1beF0gPDwgc2NhbGVfaGlnaCB8IHNyY1sxXVt4XSA+PiBzY2FsZV9sb3c7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBzcmNbMl1beF0gPDwgc2NhbGVfaGlnaCB8IHNyY1syXVt4XSA+PiBzY2FsZV9sb3c7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAweGZmZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhbHBoYSAmJiBzcmNfYWxwaGEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gc3JjWzBdW3hdIDw8IHNjYWxlX2hpZ2ggfCBzcmNbMF1beF0gPj4gc2NhbGVfbG93OworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gc3JjWzFdW3hdIDw8IHNjYWxlX2hpZ2ggfCBzcmNbMV1beF0gPj4gc2NhbGVfbG93OworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gc3JjWzJdW3hdIDw8IHNjYWxlX2hpZ2ggfCBzcmNbMl1beF0gPj4gc2NhbGVfbG93OworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gc3JjWzNdW3hdIDw8IHNjYWxlX2hpZ2ggfCBzcmNbM11beF0gPj4gc2NhbGVfbG93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHNyY1swXVt4XSA8PCBzY2FsZV9oaWdoIHwgc3JjWzBdW3hdID4+IHNjYWxlX2xvdzsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHNyY1sxXVt4XSA8PCBzY2FsZV9oaWdoIHwgc3JjWzFdW3hdID4+IHNjYWxlX2xvdzsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHNyY1syXVt4XSA8PCBzY2FsZV9oaWdoIHwgc3JjWzJdW3hdID4+IHNjYWxlX2xvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgKyBzcmNfYWxwaGE7IGkrKykKKyAgICAgICAgICAgIHNyY1tpXSArPSBzcmNTdHJpZGVbaV0gPj4gMTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcGxhbmFyUmdiMTZUb1JnYjE2V3JhcHBlcihTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlW10sIGludCBzcmNTbGljZVksIGludCBzcmNTbGljZUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjMTAyW10gPSB7ICh1aW50MTZfdCAqKXNyY1sxXSwgKHVpbnQxNl90ICopc3JjWzBdLCAodWludDE2X3QgKilzcmNbMl0sICh1aW50MTZfdCAqKXNyY1szXSB9OworICAgIGNvbnN0IHVpbnQxNl90ICpzcmMyMDFbXSA9IHsgKHVpbnQxNl90ICopc3JjWzJdLCAodWludDE2X3QgKilzcmNbMF0sICh1aW50MTZfdCAqKXNyY1sxXSwgKHVpbnQxNl90ICopc3JjWzNdIH07CisgICAgaW50IHN0cmlkZTEwMltdID0geyBzcmNTdHJpZGVbMV0sIHNyY1N0cmlkZVswXSwgc3JjU3RyaWRlWzJdLCBzcmNTdHJpZGVbM10gfTsKKyAgICBpbnQgc3RyaWRlMjAxW10gPSB7IHNyY1N0cmlkZVsyXSwgc3JjU3RyaWRlWzBdLCBzcmNTdHJpZGVbMV0sIHNyY1N0cmlkZVszXSB9OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqc3JjX2Zvcm1hdCA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYy0+c3JjRm9ybWF0KTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRzdF9mb3JtYXQgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGMtPmRzdEZvcm1hdCk7CisgICAgaW50IGJpdHNfcGVyX3NhbXBsZSA9IHNyY19mb3JtYXQtPmNvbXBbMF0uZGVwdGhfbWludXMxICsgMTsKKyAgICBpbnQgc3dhcCA9IDA7CisgICAgaWYgKCBIQVZFX0JJR0VORElBTiAmJiAhKHNyY19mb3JtYXQtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKSB8fAorICAgICAgICAhSEFWRV9CSUdFTkRJQU4gJiYgICBzcmNfZm9ybWF0LT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CRSkKKyAgICAgICAgc3dhcCsrOworICAgIGlmICggSEFWRV9CSUdFTkRJQU4gJiYgIShkc3RfZm9ybWF0LT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CRSkgfHwKKyAgICAgICAgIUhBVkVfQklHRU5ESUFOICYmICAgZHN0X2Zvcm1hdC0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQkUpCisgICAgICAgIHN3YXAgKz0gMjsKKworICAgIGlmICgoc3JjX2Zvcm1hdC0+ZmxhZ3MgJiAoQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19SR0IpKSAhPQorICAgICAgICAoQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19SR0IpIHx8CisgICAgICAgIGJpdHNfcGVyX3NhbXBsZSA8PSA4KSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBwbGFuYXIgUkdCIGNvbnZlcnNpb24gJXMgLT4gJXNcbiIsCisgICAgICAgICAgICAgICBzcmNfZm9ybWF0LT5uYW1lLCBkc3RfZm9ybWF0LT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIHNyY1NsaWNlSDsKKyAgICB9CisgICAgc3dpdGNoIChjLT5kc3RGb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDhMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDhCRToKKyAgICAgICAgZ2JyMTZwdG9wYWNrZWQxNihzcmMxMDIsIHN0cmlkZTEwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMF0gKyBzcmNTbGljZVkgKiBkc3RTdHJpZGVbMF0sIGRzdFN0cmlkZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTbGljZUgsIDAsIHN3YXAsIGJpdHNfcGVyX3NhbXBsZSwgYy0+c3JjVyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OEJFOgorICAgICAgICBnYnIxNnB0b3BhY2tlZDE2KHNyYzIwMSwgc3RyaWRlMjAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFswXSArIHNyY1NsaWNlWSAqIGRzdFN0cmlkZVswXSwgZHN0U3RyaWRlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NsaWNlSCwgMCwgc3dhcCwgYml0c19wZXJfc2FtcGxlLCBjLT5zcmNXKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRCRToKKyAgICAgICAgIGdicjE2cHRvcGFja2VkMTYoc3JjMjAxLCBzdHJpZGUyMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFswXSArIHNyY1NsaWNlWSAqIGRzdFN0cmlkZVswXSwgZHN0U3RyaWRlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTbGljZUgsIDEsIHN3YXAsIGJpdHNfcGVyX3NhbXBsZSwgYy0+c3JjVyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBNjRMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQTY0QkU6CisgICAgICAgIGdicjE2cHRvcGFja2VkMTYoc3JjMTAyLCBzdHJpZGUxMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzBdICsgc3JjU2xpY2VZICogZHN0U3RyaWRlWzBdLCBkc3RTdHJpZGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU2xpY2VILCAxLCBzd2FwLCBiaXRzX3Blcl9zYW1wbGUsIGMtPnNyY1cpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIHBsYW5hciBSR0IgY29udmVyc2lvbiAlcyAtPiAlc1xuIiwKKyAgICAgICAgICAgICAgIHNyY19mb3JtYXQtPm5hbWUsIGRzdF9mb3JtYXQtPm5hbWUpOworICAgIH0KKworICAgIHJldHVybiBzcmNTbGljZUg7Cit9CisKK3N0YXRpYyB2b2lkIGdicjI0cHRvcGFja2VkMjQoY29uc3QgdWludDhfdCAqc3JjW10sIGludCBzcmNTdHJpZGVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIGgsIGk7CisgICAgZm9yIChoID0gMDsgaCA8IHNyY1NsaWNlSDsgaCsrKSB7CisgICAgICAgIHVpbnQ4X3QgKmRlc3QgPSBkc3QgKyBkc3RTdHJpZGUgKiBoOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgKmRlc3QrKyA9IHNyY1swXVt4XTsKKyAgICAgICAgICAgICpkZXN0KysgPSBzcmNbMV1beF07CisgICAgICAgICAgICAqZGVzdCsrID0gc3JjWzJdW3hdOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHNyY1tpXSArPSBzcmNTdHJpZGVbaV07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnYnIyNHB0b3BhY2tlZDMyKGNvbnN0IHVpbnQ4X3QgKnNyY1tdLCBpbnQgc3JjU3RyaWRlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IGRzdFN0cmlkZSwgaW50IHNyY1NsaWNlSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZpcnN0LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHgsIGgsIGk7CisgICAgZm9yIChoID0gMDsgaCA8IHNyY1NsaWNlSDsgaCsrKSB7CisgICAgICAgIHVpbnQ4X3QgKmRlc3QgPSBkc3QgKyBkc3RTdHJpZGUgKiBoOworCisgICAgICAgIGlmIChhbHBoYV9maXJzdCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gMHhmZjsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gc3JjWzBdW3hdOworICAgICAgICAgICAgICAgICpkZXN0KysgPSBzcmNbMV1beF07CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHNyY1syXVt4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHNyY1swXVt4XTsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gc3JjWzFdW3hdOworICAgICAgICAgICAgICAgICpkZXN0KysgPSBzcmNbMl1beF07CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IDB4ZmY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgc3JjW2ldICs9IHNyY1N0cmlkZVtpXTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcGxhbmFyUmdiVG9SZ2JXcmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBpbnQgYWxwaGFfZmlyc3QgPSAwOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEwMltdID0geyBzcmNbMV0sIHNyY1swXSwgc3JjWzJdIH07CisgICAgY29uc3QgdWludDhfdCAqc3JjMjAxW10gPSB7IHNyY1syXSwgc3JjWzBdLCBzcmNbMV0gfTsKKyAgICBpbnQgc3RyaWRlMTAyW10gPSB7IHNyY1N0cmlkZVsxXSwgc3JjU3RyaWRlWzBdLCBzcmNTdHJpZGVbMl0gfTsKKyAgICBpbnQgc3RyaWRlMjAxW10gPSB7IHNyY1N0cmlkZVsyXSwgc3JjU3RyaWRlWzBdLCBzcmNTdHJpZGVbMV0gfTsKKworICAgIGlmIChjLT5zcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9HQlJQKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBwbGFuYXIgUkdCIGNvbnZlcnNpb24gJXMgLT4gJXNcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGMtPnNyY0Zvcm1hdCksCisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGMtPmRzdEZvcm1hdCkpOworICAgICAgICByZXR1cm4gc3JjU2xpY2VIOworICAgIH0KKworICAgIHN3aXRjaCAoYy0+ZHN0Rm9ybWF0KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgorICAgICAgICBnYnIyNHB0b3BhY2tlZDI0KHNyYzEwMiwgc3RyaWRlMTAyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFswXSArIHNyY1NsaWNlWSAqIGRzdFN0cmlkZVswXSwgZHN0U3RyaWRlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NsaWNlSCwgYy0+c3JjVyk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgorICAgICAgICBnYnIyNHB0b3BhY2tlZDI0KHNyYzIwMSwgc3RyaWRlMjAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFswXSArIHNyY1NsaWNlWSAqIGRzdFN0cmlkZVswXSwgZHN0U3RyaWRlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NsaWNlSCwgYy0+c3JjVyk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVl9QSVhfRk1UX0FSR0I6CisgICAgICAgIGFscGhhX2ZpcnN0ID0gMTsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICAgICAgZ2JyMjRwdG9wYWNrZWQzMihzcmMyMDEsIHN0cmlkZTIwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMF0gKyBzcmNTbGljZVkgKiBkc3RTdHJpZGVbMF0sIGRzdFN0cmlkZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTbGljZUgsIGFscGhhX2ZpcnN0LCBjLT5zcmNXKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFWX1BJWF9GTVRfQUJHUjoKKyAgICAgICAgYWxwaGFfZmlyc3QgPSAxOworICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBOgorICAgICAgICBnYnIyNHB0b3BhY2tlZDMyKHNyYzEwMiwgc3RyaWRlMTAyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFswXSArIHNyY1NsaWNlWSAqIGRzdFN0cmlkZVswXSwgZHN0U3RyaWRlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NsaWNlSCwgYWxwaGFfZmlyc3QsIGMtPnNyY1cpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgcGxhbmFyIFJHQiBjb252ZXJzaW9uICVzIC0+ICVzXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShjLT5zcmNGb3JtYXQpLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShjLT5kc3RGb3JtYXQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3JjU2xpY2VIOworfQorCitzdGF0aWMgaW50IHBsYW5hclJnYlRvcGxhbmFyUmdiV3JhcHBlcihTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGVbXSwgaW50IHNyY1NsaWNlWSwgaW50IHNyY1NsaWNlSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0U3RyaWRlW10pCit7CisgICAgY29weVBsYW5lKHNyY1swXSwgc3JjU3RyaWRlWzBdLCBzcmNTbGljZVksIHNyY1NsaWNlSCwgYy0+c3JjVywKKyAgICAgICAgICAgICAgZHN0WzBdLCBkc3RTdHJpZGVbMF0pOworICAgIGNvcHlQbGFuZShzcmNbMV0sIHNyY1N0cmlkZVsxXSwgc3JjU2xpY2VZLCBzcmNTbGljZUgsIGMtPnNyY1csCisgICAgICAgICAgICAgIGRzdFsxXSwgZHN0U3RyaWRlWzFdKTsKKyAgICBjb3B5UGxhbmUoc3JjWzJdLCBzcmNTdHJpZGVbMl0sIHNyY1NsaWNlWSwgc3JjU2xpY2VILCBjLT5zcmNXLAorICAgICAgICAgICAgICBkc3RbMl0sIGRzdFN0cmlkZVsyXSk7CisgICAgaWYgKGRzdFszXSkKKyAgICAgICAgZmlsbFBsYW5lKGRzdFszXSwgZHN0U3RyaWRlWzNdLCBjLT5zcmNXLCBzcmNTbGljZUgsIHNyY1NsaWNlWSwgMjU1KTsKKworICAgIHJldHVybiBzcmNTbGljZUg7Cit9CisKK3N0YXRpYyB2b2lkIHBhY2tlZHRvZ2JyMjRwKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0U3RyaWRlW10sIGludCBzcmNTbGljZUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmlyc3QsIGludCBpbmNfc2l6ZSwgaW50IHdpZHRoKQoreworICAgIHVpbnQ4X3QgKmRlc3RbM107CisgICAgaW50IHgsIGg7CisKKyAgICBkZXN0WzBdID0gZHN0WzBdOworICAgIGRlc3RbMV0gPSBkc3RbMV07CisgICAgZGVzdFsyXSA9IGRzdFsyXTsKKworICAgIGlmIChhbHBoYV9maXJzdCkKKyAgICAgICAgc3JjKys7CisKKyAgICBmb3IgKGggPSAwOyBoIDwgc3JjU2xpY2VIOyBoKyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGRlc3RbMF1beF0gPSBzcmNbMF07CisgICAgICAgICAgICBkZXN0WzFdW3hdID0gc3JjWzFdOworICAgICAgICAgICAgZGVzdFsyXVt4XSA9IHNyY1syXTsKKworICAgICAgICAgICAgc3JjICs9IGluY19zaXplOworICAgICAgICB9CisgICAgICAgIHNyYyAgICAgKz0gc3JjU3RyaWRlIC0gd2lkdGggKiBpbmNfc2l6ZTsKKyAgICAgICAgZGVzdFswXSArPSBkc3RTdHJpZGVbMF07CisgICAgICAgIGRlc3RbMV0gKz0gZHN0U3RyaWRlWzFdOworICAgICAgICBkZXN0WzJdICs9IGRzdFN0cmlkZVsyXTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcmdiVG9QbGFuYXJSZ2JXcmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBpbnQgYWxwaGFfZmlyc3QgPSAwOworICAgIGludCBzdHJpZGUxMDJbXSA9IHsgZHN0U3RyaWRlWzFdLCBkc3RTdHJpZGVbMF0sIGRzdFN0cmlkZVsyXSB9OworICAgIGludCBzdHJpZGUyMDFbXSA9IHsgZHN0U3RyaWRlWzJdLCBkc3RTdHJpZGVbMF0sIGRzdFN0cmlkZVsxXSB9OworICAgIHVpbnQ4X3QgKmRzdDEwMltdID0geyBkc3RbMV0gKyBzcmNTbGljZVkgKiBkc3RTdHJpZGVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFswXSArIHNyY1NsaWNlWSAqIGRzdFN0cmlkZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzJdICsgc3JjU2xpY2VZICogZHN0U3RyaWRlWzJdIH07CisgICAgdWludDhfdCAqZHN0MjAxW10gPSB7IGRzdFsyXSArIHNyY1NsaWNlWSAqIGRzdFN0cmlkZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzBdICsgc3JjU2xpY2VZICogZHN0U3RyaWRlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMV0gKyBzcmNTbGljZVkgKiBkc3RTdHJpZGVbMV0gfTsKKworICAgIHN3aXRjaCAoYy0+c3JjRm9ybWF0KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgorICAgICAgICBwYWNrZWR0b2dicjI0cCgoY29uc3QgdWludDhfdCAqKSBzcmNbMF0sIHNyY1N0cmlkZVswXSwgZHN0MjAxLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUyMDEsIHNyY1NsaWNlSCwgYWxwaGFfZmlyc3QsIDMsIGMtPnNyY1cpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgICAgIHBhY2tlZHRvZ2JyMjRwKChjb25zdCB1aW50OF90ICopIHNyY1swXSwgc3JjU3RyaWRlWzBdLCBkc3QxMDIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZTEwMiwgc3JjU2xpY2VILCBhbHBoYV9maXJzdCwgMywgYy0+c3JjVyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9BUkdCOgorICAgICAgICBhbHBoYV9maXJzdCA9IDE7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CisgICAgICAgIHBhY2tlZHRvZ2JyMjRwKChjb25zdCB1aW50OF90ICopIHNyY1swXSwgc3JjU3RyaWRlWzBdLCBkc3QyMDEsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZTIwMSwgc3JjU2xpY2VILCBhbHBoYV9maXJzdCwgNCwgYy0+c3JjVyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9BQkdSOgorICAgICAgICBhbHBoYV9maXJzdCA9IDE7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE6CisgICAgICAgIHBhY2tlZHRvZ2JyMjRwKChjb25zdCB1aW50OF90ICopIHNyY1swXSwgc3JjU3RyaWRlWzBdLCBkc3QxMDIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZTEwMiwgc3JjU2xpY2VILCBhbHBoYV9maXJzdCwgNCwgYy0+c3JjVyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgcGxhbmFyIFJHQiBjb252ZXJzaW9uICVzIC0+ICVzXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShjLT5zcmNGb3JtYXQpLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShjLT5kc3RGb3JtYXQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3JjU2xpY2VIOworfQorCisjZGVmaW5lIEJBWUVSX0dCUkcKKyNkZWZpbmUgQkFZRVJfOAorI2RlZmluZSBCQVlFUl9SRU5BTUUoeCkgYmF5ZXJfZ2JyZzhfdG9fIyN4CisjaW5jbHVkZSAiYmF5ZXJfdGVtcGxhdGUuYyIKKworI2RlZmluZSBCQVlFUl9HQlJHCisjZGVmaW5lIEJBWUVSXzE2TEUKKyNkZWZpbmUgQkFZRVJfUkVOQU1FKHgpIGJheWVyX2dicmcxNmxlX3RvXyMjeAorI2luY2x1ZGUgImJheWVyX3RlbXBsYXRlLmMiCisKKyNkZWZpbmUgQkFZRVJfR0JSRworI2RlZmluZSBCQVlFUl8xNkJFCisjZGVmaW5lIEJBWUVSX1JFTkFNRSh4KSBiYXllcl9nYnJnMTZiZV90b18jI3gKKyNpbmNsdWRlICJiYXllcl90ZW1wbGF0ZS5jIgorCisjZGVmaW5lIEJBWUVSX0dSQkcKKyNkZWZpbmUgQkFZRVJfOAorI2RlZmluZSBCQVlFUl9SRU5BTUUoeCkgYmF5ZXJfZ3JiZzhfdG9fIyN4CisjaW5jbHVkZSAiYmF5ZXJfdGVtcGxhdGUuYyIKKworI2RlZmluZSBCQVlFUl9HUkJHCisjZGVmaW5lIEJBWUVSXzE2TEUKKyNkZWZpbmUgQkFZRVJfUkVOQU1FKHgpIGJheWVyX2dyYmcxNmxlX3RvXyMjeAorI2luY2x1ZGUgImJheWVyX3RlbXBsYXRlLmMiCisKKyNkZWZpbmUgQkFZRVJfR1JCRworI2RlZmluZSBCQVlFUl8xNkJFCisjZGVmaW5lIEJBWUVSX1JFTkFNRSh4KSBiYXllcl9ncmJnMTZiZV90b18jI3gKKyNpbmNsdWRlICJiYXllcl90ZW1wbGF0ZS5jIgorCisjZGVmaW5lIEJBWUVSX0JHR1IKKyNkZWZpbmUgQkFZRVJfOAorI2RlZmluZSBCQVlFUl9SRU5BTUUoeCkgYmF5ZXJfYmdncjhfdG9fIyN4CisjaW5jbHVkZSAiYmF5ZXJfdGVtcGxhdGUuYyIKKworI2RlZmluZSBCQVlFUl9CR0dSCisjZGVmaW5lIEJBWUVSXzE2TEUKKyNkZWZpbmUgQkFZRVJfUkVOQU1FKHgpIGJheWVyX2JnZ3IxNmxlX3RvXyMjeAorI2luY2x1ZGUgImJheWVyX3RlbXBsYXRlLmMiCisKKyNkZWZpbmUgQkFZRVJfQkdHUgorI2RlZmluZSBCQVlFUl8xNkJFCisjZGVmaW5lIEJBWUVSX1JFTkFNRSh4KSBiYXllcl9iZ2dyMTZiZV90b18jI3gKKyNpbmNsdWRlICJiYXllcl90ZW1wbGF0ZS5jIgorCisjZGVmaW5lIEJBWUVSX1JHR0IKKyNkZWZpbmUgQkFZRVJfOAorI2RlZmluZSBCQVlFUl9SRU5BTUUoeCkgYmF5ZXJfcmdnYjhfdG9fIyN4CisjaW5jbHVkZSAiYmF5ZXJfdGVtcGxhdGUuYyIKKworI2RlZmluZSBCQVlFUl9SR0dCCisjZGVmaW5lIEJBWUVSXzE2TEUKKyNkZWZpbmUgQkFZRVJfUkVOQU1FKHgpIGJheWVyX3JnZ2IxNmxlX3RvXyMjeAorI2luY2x1ZGUgImJheWVyX3RlbXBsYXRlLmMiCisKKyNkZWZpbmUgQkFZRVJfUkdHQgorI2RlZmluZSBCQVlFUl8xNkJFCisjZGVmaW5lIEJBWUVSX1JFTkFNRSh4KSBiYXllcl9yZ2diMTZiZV90b18jI3gKKyNpbmNsdWRlICJiYXllcl90ZW1wbGF0ZS5jIgorCitzdGF0aWMgaW50IGJheWVyX3RvX3JnYjI0X3dyYXBwZXIoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCogc3JjW10sIGludCBzcmNTdHJpZGVbXSwgaW50IHNyY1NsaWNlWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU2xpY2VILCB1aW50OF90KiBkc3RbXSwgaW50IGRzdFN0cmlkZVtdKQoreworICAgIHVpbnQ4X3QgKmRzdFB0cj0gZHN0WzBdOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1B0cj0gc3JjWzBdOworICAgIGludCBpOworICAgIHZvaWQgKCpjb3B5KSAgICAgICAoY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgdWludDhfdCAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgaW50IHdpZHRoKTsKKyAgICB2b2lkICgqaW50ZXJwb2xhdGUpKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19zdHJpZGUsIHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsIGludCB3aWR0aCk7CisKKyAgICBzd2l0Y2goYy0+c3JjRm9ybWF0KSB7CisjZGVmaW5lIENBU0UocGl4Zm10LCBwcmVmaXgpIFwKKyAgICBjYXNlIHBpeGZtdDogY29weSAgICAgICAgPSBiYXllcl8jI3ByZWZpeCMjX3RvX3JnYjI0X2NvcHk7IFwKKyAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgPSBiYXllcl8jI3ByZWZpeCMjX3RvX3JnYjI0X2ludGVycG9sYXRlOyBcCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIENBU0UoQVZfUElYX0ZNVF9CQVlFUl9CR0dSOCwgICAgYmdncjgpCisgICAgQ0FTRShBVl9QSVhfRk1UX0JBWUVSX0JHR1IxNkxFLCBiZ2dyMTZsZSkKKyAgICBDQVNFKEFWX1BJWF9GTVRfQkFZRVJfQkdHUjE2QkUsIGJnZ3IxNmJlKQorICAgIENBU0UoQVZfUElYX0ZNVF9CQVlFUl9SR0dCOCwgICAgcmdnYjgpCisgICAgQ0FTRShBVl9QSVhfRk1UX0JBWUVSX1JHR0IxNkxFLCByZ2diMTZsZSkKKyAgICBDQVNFKEFWX1BJWF9GTVRfQkFZRVJfUkdHQjE2QkUsIHJnZ2IxNmJlKQorICAgIENBU0UoQVZfUElYX0ZNVF9CQVlFUl9HQlJHOCwgICAgZ2JyZzgpCisgICAgQ0FTRShBVl9QSVhfRk1UX0JBWUVSX0dCUkcxNkxFLCBnYnJnMTZsZSkKKyAgICBDQVNFKEFWX1BJWF9GTVRfQkFZRVJfR0JSRzE2QkUsIGdicmcxNmJlKQorICAgIENBU0UoQVZfUElYX0ZNVF9CQVlFUl9HUkJHOCwgICAgZ3JiZzgpCisgICAgQ0FTRShBVl9QSVhfRk1UX0JBWUVSX0dSQkcxNkxFLCBncmJnMTZsZSkKKyAgICBDQVNFKEFWX1BJWF9GTVRfQkFZRVJfR1JCRzE2QkUsIGdyYmcxNmJlKQorI3VuZGVmIENBU0UKKyAgICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb3B5KHNyY1B0ciwgc3JjU3RyaWRlWzBdLCBkc3RQdHIsIGRzdFN0cmlkZVswXSwgYy0+c3JjVyk7CisgICAgc3JjUHRyICs9IDIgKiBzcmNTdHJpZGVbMF07CisgICAgZHN0UHRyICs9IDIgKiBkc3RTdHJpZGVbMF07CisKKyAgICBmb3IgKGkgPSAyOyBpIDwgc3JjU2xpY2VIIC0gMjsgaSArPSAyKSB7CisgICAgICAgIGludGVycG9sYXRlKHNyY1B0ciwgc3JjU3RyaWRlWzBdLCBkc3RQdHIsIGRzdFN0cmlkZVswXSwgYy0+c3JjVyk7CisgICAgICAgIHNyY1B0ciArPSAyICogc3JjU3RyaWRlWzBdOworICAgICAgICBkc3RQdHIgKz0gMiAqIGRzdFN0cmlkZVswXTsKKyAgICB9CisKKyAgICBjb3B5KHNyY1B0ciwgc3JjU3RyaWRlWzBdLCBkc3RQdHIsIGRzdFN0cmlkZVswXSwgYy0+c3JjVyk7CisgICAgcmV0dXJuIHNyY1NsaWNlSDsKK30KKworc3RhdGljIGludCBiYXllcl90b195djEyX3dyYXBwZXIoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCogc3JjW10sIGludCBzcmNTdHJpZGVbXSwgaW50IHNyY1NsaWNlWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTbGljZUgsIHVpbnQ4X3QqIGRzdFtdLCBpbnQgZHN0U3RyaWRlW10pCit7CisgICAgY29uc3QgdWludDhfdCAqc3JjUHRyPSBzcmNbMF07CisgICAgdWludDhfdCAqZHN0WT0gZHN0WzBdOworICAgIHVpbnQ4X3QgKmRzdFU9IGRzdFsxXTsKKyAgICB1aW50OF90ICpkc3RWPSBkc3RbMl07CisgICAgaW50IGk7CisgICAgdm9pZCAoKmNvcHkpICAgICAgIChjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc3RyaWRlLCB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCBpbnQgbHVtYV9zdHJpZGUsIGludCB3aWR0aCwgaW50MzJfdCAqcmdiMnl1dik7CisgICAgdm9pZCAoKmludGVycG9sYXRlKShjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc3RyaWRlLCB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCBpbnQgbHVtYV9zdHJpZGUsIGludCB3aWR0aCwgaW50MzJfdCAqcmdiMnl1dik7CisKKyAgICBzd2l0Y2goYy0+c3JjRm9ybWF0KSB7CisjZGVmaW5lIENBU0UocGl4Zm10LCBwcmVmaXgpIFwKKyAgICBjYXNlIHBpeGZtdDogY29weSAgICAgICAgPSBiYXllcl8jI3ByZWZpeCMjX3RvX3l2MTJfY29weTsgXAorICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSA9IGJheWVyXyMjcHJlZml4IyNfdG9feXYxMl9pbnRlcnBvbGF0ZTsgXAorICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBDQVNFKEFWX1BJWF9GTVRfQkFZRVJfQkdHUjgsICAgIGJnZ3I4KQorICAgIENBU0UoQVZfUElYX0ZNVF9CQVlFUl9CR0dSMTZMRSwgYmdncjE2bGUpCisgICAgQ0FTRShBVl9QSVhfRk1UX0JBWUVSX0JHR1IxNkJFLCBiZ2dyMTZiZSkKKyAgICBDQVNFKEFWX1BJWF9GTVRfQkFZRVJfUkdHQjgsICAgIHJnZ2I4KQorICAgIENBU0UoQVZfUElYX0ZNVF9CQVlFUl9SR0dCMTZMRSwgcmdnYjE2bGUpCisgICAgQ0FTRShBVl9QSVhfRk1UX0JBWUVSX1JHR0IxNkJFLCByZ2diMTZiZSkKKyAgICBDQVNFKEFWX1BJWF9GTVRfQkFZRVJfR0JSRzgsICAgIGdicmc4KQorICAgIENBU0UoQVZfUElYX0ZNVF9CQVlFUl9HQlJHMTZMRSwgZ2JyZzE2bGUpCisgICAgQ0FTRShBVl9QSVhfRk1UX0JBWUVSX0dCUkcxNkJFLCBnYnJnMTZiZSkKKyAgICBDQVNFKEFWX1BJWF9GTVRfQkFZRVJfR1JCRzgsICAgIGdyYmc4KQorICAgIENBU0UoQVZfUElYX0ZNVF9CQVlFUl9HUkJHMTZMRSwgZ3JiZzE2bGUpCisgICAgQ0FTRShBVl9QSVhfRk1UX0JBWUVSX0dSQkcxNkJFLCBncmJnMTZiZSkKKyN1bmRlZiBDQVNFCisgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgICAgfQorCisgICAgY29weShzcmNQdHIsIHNyY1N0cmlkZVswXSwgZHN0WSwgZHN0VSwgZHN0ViwgZHN0U3RyaWRlWzBdLCBjLT5zcmNXLCBjLT5pbnB1dF9yZ2IyeXV2X3RhYmxlKTsKKyAgICBzcmNQdHIgKz0gMiAqIHNyY1N0cmlkZVswXTsKKyAgICBkc3RZICAgKz0gMiAqIGRzdFN0cmlkZVswXTsKKyAgICBkc3RVICAgKz0gICAgIGRzdFN0cmlkZVsxXTsKKyAgICBkc3RWICAgKz0gICAgIGRzdFN0cmlkZVsxXTsKKworICAgIGZvciAoaSA9IDI7IGkgPCBzcmNTbGljZUggLSAyOyBpICs9IDIpIHsKKyAgICAgICAgaW50ZXJwb2xhdGUoc3JjUHRyLCBzcmNTdHJpZGVbMF0sIGRzdFksIGRzdFUsIGRzdFYsIGRzdFN0cmlkZVswXSwgYy0+c3JjVywgYy0+aW5wdXRfcmdiMnl1dl90YWJsZSk7CisgICAgICAgIHNyY1B0ciArPSAyICogc3JjU3RyaWRlWzBdOworICAgICAgICBkc3RZICAgKz0gMiAqIGRzdFN0cmlkZVswXTsKKyAgICAgICAgZHN0VSAgICs9ICAgICBkc3RTdHJpZGVbMV07CisgICAgICAgIGRzdFYgICArPSAgICAgZHN0U3RyaWRlWzFdOworICAgIH0KKworICAgIGNvcHkoc3JjUHRyLCBzcmNTdHJpZGVbMF0sIGRzdFksIGRzdFUsIGRzdFYsIGRzdFN0cmlkZVswXSwgYy0+c3JjVywgYy0+aW5wdXRfcmdiMnl1dl90YWJsZSk7CisgICAgcmV0dXJuIHNyY1NsaWNlSDsKK30KKworI2RlZmluZSBpc1JHQkEzMih4KSAoICAgICAgICAgICAgXAorICAgICAgICAgICAoeCkgPT0gQVZfUElYX0ZNVF9BUkdCICAgXAorICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9SR0JBICAgXAorICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9CR1JBICAgXAorICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9BQkdSICAgXAorICAgICAgICApCisKKyNkZWZpbmUgaXNSR0JBNjQoeCkgKCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICh4KSA9PSBBVl9QSVhfRk1UX1JHQkE2NExFICAgXAorICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9SR0JBNjRCRSAgIFwKKyAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfQkdSQTY0TEUgICBcCisgICAgICAgIHx8ICh4KSA9PSBBVl9QSVhfRk1UX0JHUkE2NEJFICAgXAorICAgICAgICApCisKKyNkZWZpbmUgaXNSR0I0OCh4KSAoICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKHgpID09IEFWX1BJWF9GTVRfUkdCNDhMRSAgIFwKKyAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfUkdCNDhCRSAgIFwKKyAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfQkdSNDhMRSAgIFwKKyAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfQkdSNDhCRSAgIFwKKyAgICAgICAgKQorCisvKiB7UkdCLEJHUn17MTUsMTYsMjQsMzIsMzJfMX0gLT4ge1JHQixCR1J9ezE1LDE2LDI0LDMyfSAqLwordHlwZWRlZiB2b2lkICgqIHJnYkNvbnZGbikgKGNvbnN0IHVpbnQ4X3QgKiwgdWludDhfdCAqLCBpbnQpOworc3RhdGljIHJnYkNvbnZGbiBmaW5kUmdiQ29udkZuKFN3c0NvbnRleHQgKmMpCit7CisgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHNyY0Zvcm1hdCA9IGMtPnNyY0Zvcm1hdDsKKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0ID0gYy0+ZHN0Rm9ybWF0OworICAgIGNvbnN0IGludCBzcmNJZCA9IGMtPnNyY0Zvcm1hdEJwcDsKKyAgICBjb25zdCBpbnQgZHN0SWQgPSBjLT5kc3RGb3JtYXRCcHA7CisgICAgcmdiQ29udkZuIGNvbnYgPSBOVUxMOworCisjZGVmaW5lIElTX05PVF9ORShicHAsIGRlc2MpIFwKKyAgICAoKChicHAgKyA3KSA+PiAzKSA9PSAyICYmIFwKKyAgICAgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQkUpICE9ICFIQVZFX0JJR0VORElBTikpCisKKyNkZWZpbmUgQ09OVl9JUyhzcmMsIGRzdCkgKHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UXyMjc3JjICYmIGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UXyMjZHN0KQorCisgICAgaWYgKGlzUkdCQTMyKHNyY0Zvcm1hdCkgJiYgaXNSR0JBMzIoZHN0Rm9ybWF0KSkgeworICAgICAgICBpZiAoICAgICBDT05WX0lTKEFCR1IsIFJHQkEpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoQVJHQiwgQkdSQSkKKyAgICAgICAgICAgICAgfHwgQ09OVl9JUyhCR1JBLCBBUkdCKQorICAgICAgICAgICAgICB8fCBDT05WX0lTKFJHQkEsIEFCR1IpKSBjb252ID0gc2h1ZmZsZV9ieXRlc18zMjEwOworICAgICAgICBlbHNlIGlmIChDT05WX0lTKEFCR1IsIEFSR0IpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoQVJHQiwgQUJHUikpIGNvbnYgPSBzaHVmZmxlX2J5dGVzXzAzMjE7CisgICAgICAgIGVsc2UgaWYgKENPTlZfSVMoQUJHUiwgQkdSQSkKKyAgICAgICAgICAgICAgfHwgQ09OVl9JUyhBUkdCLCBSR0JBKSkgY29udiA9IHNodWZmbGVfYnl0ZXNfMTIzMDsKKyAgICAgICAgZWxzZSBpZiAoQ09OVl9JUyhCR1JBLCBSR0JBKQorICAgICAgICAgICAgICB8fCBDT05WX0lTKFJHQkEsIEJHUkEpKSBjb252ID0gc2h1ZmZsZV9ieXRlc18yMTAzOworICAgICAgICBlbHNlIGlmIChDT05WX0lTKEJHUkEsIEFCR1IpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoUkdCQSwgQVJHQikpIGNvbnYgPSBzaHVmZmxlX2J5dGVzXzMwMTI7CisgICAgfSBlbHNlIGlmIChpc1JHQjQ4KHNyY0Zvcm1hdCkgJiYgaXNSR0I0OChkc3RGb3JtYXQpKSB7CisgICAgICAgIGlmICAgICAgKENPTlZfSVMoUkdCNDhMRSwgQkdSNDhMRSkKKyAgICAgICAgICAgICAgfHwgQ09OVl9JUyhCR1I0OExFLCBSR0I0OExFKQorICAgICAgICAgICAgICB8fCBDT05WX0lTKFJHQjQ4QkUsIEJHUjQ4QkUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoQkdSNDhCRSwgUkdCNDhCRSkpIGNvbnYgPSByZ2I0OHRvYmdyNDhfbm9ic3dhcDsKKyAgICAgICAgZWxzZSBpZiAoQ09OVl9JUyhSR0I0OExFLCBCR1I0OEJFKQorICAgICAgICAgICAgICB8fCBDT05WX0lTKEJHUjQ4TEUsIFJHQjQ4QkUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoUkdCNDhCRSwgQkdSNDhMRSkKKyAgICAgICAgICAgICAgfHwgQ09OVl9JUyhCR1I0OEJFLCBSR0I0OExFKSkgY29udiA9IHJnYjQ4dG9iZ3I0OF9ic3dhcDsKKyAgICB9IGVsc2UgaWYgKGlzUkdCQTY0KHNyY0Zvcm1hdCkgJiYgaXNSR0I0OChkc3RGb3JtYXQpKSB7CisgICAgICAgIGlmICAgICAgKENPTlZfSVMoUkdCQTY0TEUsIEJHUjQ4TEUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoQkdSQTY0TEUsIFJHQjQ4TEUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoUkdCQTY0QkUsIEJHUjQ4QkUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoQkdSQTY0QkUsIFJHQjQ4QkUpKSBjb252ID0gcmdiNjR0b2JncjQ4X25vYnN3YXA7CisgICAgICAgIGVsc2UgaWYgKENPTlZfSVMoUkdCQTY0TEUsIEJHUjQ4QkUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoQkdSQTY0TEUsIFJHQjQ4QkUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoUkdCQTY0QkUsIEJHUjQ4TEUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoQkdSQTY0QkUsIFJHQjQ4TEUpKSBjb252ID0gcmdiNjR0b2JncjQ4X2Jzd2FwOworICAgICAgICBlbHNlIGlmIChDT05WX0lTKFJHQkE2NExFLCBSR0I0OExFKQorICAgICAgICAgICAgICB8fCBDT05WX0lTKEJHUkE2NExFLCBCR1I0OExFKQorICAgICAgICAgICAgICB8fCBDT05WX0lTKFJHQkE2NEJFLCBSR0I0OEJFKQorICAgICAgICAgICAgICB8fCBDT05WX0lTKEJHUkE2NEJFLCBCR1I0OEJFKSkgY29udiA9IHJnYjY0dG80OF9ub2Jzd2FwOworICAgICAgICBlbHNlIGlmIChDT05WX0lTKFJHQkE2NExFLCBSR0I0OEJFKQorICAgICAgICAgICAgICB8fCBDT05WX0lTKEJHUkE2NExFLCBCR1I0OEJFKQorICAgICAgICAgICAgICB8fCBDT05WX0lTKFJHQkE2NEJFLCBSR0I0OExFKQorICAgICAgICAgICAgICB8fCBDT05WX0lTKEJHUkE2NEJFLCBCR1I0OExFKSkgY29udiA9IHJnYjY0dG80OF9ic3dhcDsKKyAgICB9IGVsc2UKKyAgICAvKiBCR1IgLT4gQkdSICovCisgICAgaWYgKChpc0JHUmluSW50KHNyY0Zvcm1hdCkgJiYgaXNCR1JpbkludChkc3RGb3JtYXQpKSB8fAorICAgICAgICAoaXNSR0JpbkludChzcmNGb3JtYXQpICYmIGlzUkdCaW5JbnQoZHN0Rm9ybWF0KSkpIHsKKyAgICAgICAgc3dpdGNoIChzcmNJZCB8IChkc3RJZCA8PCAxNikpIHsKKyAgICAgICAgY2FzZSAweDAwMEYwMDBDOiBjb252ID0gcmdiMTJ0bzE1OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMEYwMDEwOiBjb252ID0gcmdiMTZ0bzE1OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMEYwMDE4OiBjb252ID0gcmdiMjR0bzE1OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMEYwMDIwOiBjb252ID0gcmdiMzJ0bzE1OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTAwMDBGOiBjb252ID0gcmdiMTV0bzE2OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTAwMDE4OiBjb252ID0gcmdiMjR0bzE2OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTAwMDIwOiBjb252ID0gcmdiMzJ0bzE2OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTgwMDBGOiBjb252ID0gcmdiMTV0bzI0OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTgwMDEwOiBjb252ID0gcmdiMTZ0bzI0OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTgwMDIwOiBjb252ID0gcmdiMzJ0bzI0OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMjAwMDBGOiBjb252ID0gcmdiMTV0bzMyOyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMjAwMDEwOiBjb252ID0gcmdiMTZ0bzMyOyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMjAwMDE4OiBjb252ID0gcmdiMjR0bzMyOyBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKGlzQkdSaW5JbnQoc3JjRm9ybWF0KSAmJiBpc1JHQmluSW50KGRzdEZvcm1hdCkpIHx8CisgICAgICAgICAgICAgICAoaXNSR0JpbkludChzcmNGb3JtYXQpICYmIGlzQkdSaW5JbnQoZHN0Rm9ybWF0KSkpIHsKKyAgICAgICAgc3dpdGNoIChzcmNJZCB8IChkc3RJZCA8PCAxNikpIHsKKyAgICAgICAgY2FzZSAweDAwMEMwMDBDOiBjb252ID0gcmdiMTJ0b2JncjEyOyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMEYwMDBGOiBjb252ID0gcmdiMTV0b2JncjE1OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMEYwMDEwOiBjb252ID0gcmdiMTZ0b2JncjE1OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMEYwMDE4OiBjb252ID0gcmdiMjR0b2JncjE1OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMEYwMDIwOiBjb252ID0gcmdiMzJ0b2JncjE1OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTAwMDBGOiBjb252ID0gcmdiMTV0b2JncjE2OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTAwMDEwOiBjb252ID0gcmdiMTZ0b2JncjE2OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTAwMDE4OiBjb252ID0gcmdiMjR0b2JncjE2OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTAwMDIwOiBjb252ID0gcmdiMzJ0b2JncjE2OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTgwMDBGOiBjb252ID0gcmdiMTV0b2JncjI0OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTgwMDEwOiBjb252ID0gcmdiMTZ0b2JncjI0OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTgwMDE4OiBjb252ID0gcmdiMjR0b2JncjI0OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMTgwMDIwOiBjb252ID0gcmdiMzJ0b2JncjI0OyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMjAwMDBGOiBjb252ID0gcmdiMTV0b2JncjMyOyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMjAwMDEwOiBjb252ID0gcmdiMTZ0b2JncjMyOyBicmVhazsKKyAgICAgICAgY2FzZSAweDAwMjAwMDE4OiBjb252ID0gcmdiMjR0b2JncjMyOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfUkdCMzJfMSB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9CR1IzMl8xKSAmJiAhaXNSR0JBMzIoc3JjRm9ybWF0KSAmJiBBTFQzMl9DT1JSPDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGNvbnY7Cit9CisKKy8qIHtSR0IsQkdSfXsxNSwxNiwyNCwzMiwzMl8xfSAtPiB7UkdCLEJHUn17MTUsMTYsMjQsMzJ9ICovCitzdGF0aWMgaW50IHJnYlRvUmdiV3JhcHBlcihTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwgaW50IHNyY1N0cmlkZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1NsaWNlWSwgaW50IHNyY1NsaWNlSCwgdWludDhfdCAqZHN0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U3RyaWRlW10pCisKK3sKKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjRm9ybWF0ID0gYy0+c3JjRm9ybWF0OworICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXQgPSBjLT5kc3RGb3JtYXQ7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjX3NyYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYy0+c3JjRm9ybWF0KTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2NfZHN0ID0gYXZfcGl4X2ZtdF9kZXNjX2dldChjLT5kc3RGb3JtYXQpOworICAgIGNvbnN0IGludCBzcmNCcHAgPSAoYy0+c3JjRm9ybWF0QnBwICsgNykgPj4gMzsKKyAgICBjb25zdCBpbnQgZHN0QnBwID0gKGMtPmRzdEZvcm1hdEJwcCArIDcpID4+IDM7CisgICAgcmdiQ29udkZuIGNvbnYgPSBmaW5kUmdiQ29udkZuKGMpOworCisgICAgaWYgKCFjb252KSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJpbnRlcm5hbCBlcnJvciAlcyAtPiAlcyBjb252ZXJ0ZXJcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKHNyY0Zvcm1hdCksIGF2X2dldF9waXhfZm10X25hbWUoZHN0Rm9ybWF0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjUHRyID0gc3JjWzBdOworICAgICAgICAgICAgICB1aW50OF90ICpkc3RQdHIgPSBkc3RbMF07CisgICAgICAgIGludCBzcmNfYnN3YXAgPSBJU19OT1RfTkUoYy0+c3JjRm9ybWF0QnBwLCBkZXNjX3NyYyk7CisgICAgICAgIGludCBkc3RfYnN3YXAgPSBJU19OT1RfTkUoYy0+ZHN0Rm9ybWF0QnBwLCBkZXNjX2RzdCk7CisKKyAgICAgICAgaWYgKChzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9SR0IzMl8xIHx8IHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0JHUjMyXzEpICYmCisgICAgICAgICAgICAhaXNSR0JBMzIoZHN0Rm9ybWF0KSkKKyAgICAgICAgICAgIHNyY1B0ciArPSBBTFQzMl9DT1JSOworCisgICAgICAgIGlmICgoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfUkdCMzJfMSB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9CR1IzMl8xKSAmJgorICAgICAgICAgICAgIWlzUkdCQTMyKHNyY0Zvcm1hdCkpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgYXZfYXNzZXJ0MChBTFQzMl9DT1JSID09IDEpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNyY1NsaWNlSDsgaSsrKQorICAgICAgICAgICAgICAgIGRzdFB0cltkc3RTdHJpZGVbMF0gKiAoc3JjU2xpY2VZICsgaSldID0gMjU1OworICAgICAgICAgICAgZHN0UHRyICs9IEFMVDMyX0NPUlI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHN0U3RyaWRlWzBdICogc3JjQnBwID09IHNyY1N0cmlkZVswXSAqIGRzdEJwcCAmJiBzcmNTdHJpZGVbMF0gPiAwICYmCisgICAgICAgICAgICAhKHNyY1N0cmlkZVswXSAlIHNyY0JwcCkgJiYgIWRzdF9ic3dhcCAmJiAhc3JjX2Jzd2FwKQorICAgICAgICAgICAgY29udihzcmNQdHIsIGRzdFB0ciArIGRzdFN0cmlkZVswXSAqIHNyY1NsaWNlWSwKKyAgICAgICAgICAgICAgICAgKHNyY1NsaWNlSCAtIDEpICogc3JjU3RyaWRlWzBdICsgYy0+c3JjVyAqIHNyY0JwcCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IGksIGo7CisgICAgICAgICAgICBkc3RQdHIgKz0gZHN0U3RyaWRlWzBdICogc3JjU2xpY2VZOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3JjU2xpY2VIOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZihzcmNfYnN3YXApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDsgajxjLT5zcmNXOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KiljLT5mb3JtYXRDb252QnVmZmVyKVtqXSA9IGF2X2Jzd2FwMTYoKCh1aW50MTZfdCopc3JjUHRyKVtqXSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnYoYy0+Zm9ybWF0Q29udkJ1ZmZlciwgZHN0UHRyLCBjLT5zcmNXICogc3JjQnBwKTsKKyAgICAgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgICAgICAgICBjb252KHNyY1B0ciwgZHN0UHRyLCBjLT5zcmNXICogc3JjQnBwKTsKKyAgICAgICAgICAgICAgICBpZihkc3RfYnN3YXApCisgICAgICAgICAgICAgICAgICAgIGZvcihqPTA7IGo8Yy0+c3JjVzsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCopZHN0UHRyKVtqXSA9IGF2X2Jzd2FwMTYoKCh1aW50MTZfdCopZHN0UHRyKVtqXSk7CisgICAgICAgICAgICAgICAgc3JjUHRyICs9IHNyY1N0cmlkZVswXTsKKyAgICAgICAgICAgICAgICBkc3RQdHIgKz0gZHN0U3RyaWRlWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzcmNTbGljZUg7Cit9CisKK3N0YXRpYyBpbnQgYmdyMjRUb1l2MTJXcmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBmZl9yZ2IyNHRveXYxMigKKyAgICAgICAgc3JjWzBdLAorICAgICAgICBkc3RbMF0gKyAgc3JjU2xpY2VZICAgICAgICogZHN0U3RyaWRlWzBdLAorICAgICAgICBkc3RbMV0gKyAoc3JjU2xpY2VZID4+IDEpICogZHN0U3RyaWRlWzFdLAorICAgICAgICBkc3RbMl0gKyAoc3JjU2xpY2VZID4+IDEpICogZHN0U3RyaWRlWzJdLAorICAgICAgICBjLT5zcmNXLCBzcmNTbGljZUgsCisgICAgICAgIGRzdFN0cmlkZVswXSwgZHN0U3RyaWRlWzFdLCBzcmNTdHJpZGVbMF0sCisgICAgICAgIGMtPmlucHV0X3JnYjJ5dXZfdGFibGUpOworICAgIGlmIChkc3RbM10pCisgICAgICAgIGZpbGxQbGFuZShkc3RbM10sIGRzdFN0cmlkZVszXSwgYy0+c3JjVywgc3JjU2xpY2VILCBzcmNTbGljZVksIDI1NSk7CisgICAgcmV0dXJuIHNyY1NsaWNlSDsKK30KKworc3RhdGljIGludCB5dnU5VG9ZdjEyV3JhcHBlcihTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RbXSwgaW50IGRzdFN0cmlkZVtdKQoreworICAgIGNvcHlQbGFuZShzcmNbMF0sIHNyY1N0cmlkZVswXSwgc3JjU2xpY2VZLCBzcmNTbGljZUgsIGMtPnNyY1csCisgICAgICAgICAgICAgIGRzdFswXSwgZHN0U3RyaWRlWzBdKTsKKworICAgIHBsYW5hcjJ4KHNyY1sxXSwgZHN0WzFdICsgZHN0U3RyaWRlWzFdICogKHNyY1NsaWNlWSA+PiAxKSwgYy0+Y2hyU3JjVywKKyAgICAgICAgICAgICBzcmNTbGljZUggPj4gMiwgc3JjU3RyaWRlWzFdLCBkc3RTdHJpZGVbMV0pOworICAgIHBsYW5hcjJ4KHNyY1syXSwgZHN0WzJdICsgZHN0U3RyaWRlWzJdICogKHNyY1NsaWNlWSA+PiAxKSwgYy0+Y2hyU3JjVywKKyAgICAgICAgICAgICBzcmNTbGljZUggPj4gMiwgc3JjU3RyaWRlWzJdLCBkc3RTdHJpZGVbMl0pOworICAgIGlmIChkc3RbM10pCisgICAgICAgIGZpbGxQbGFuZShkc3RbM10sIGRzdFN0cmlkZVszXSwgYy0+c3JjVywgc3JjU2xpY2VILCBzcmNTbGljZVksIDI1NSk7CisgICAgcmV0dXJuIHNyY1NsaWNlSDsKK30KKworLyogdW5zY2FsZWQgY29weSBsaWtlIHN0dWZmIChhc3N1bWVzIG5lYXJseSBpZGVudGljYWwgZm9ybWF0cykgKi8KK3N0YXRpYyBpbnQgcGFja2VkQ29weVdyYXBwZXIoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGVbXSwgaW50IHNyY1NsaWNlWSwgaW50IHNyY1NsaWNlSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBpZiAoZHN0U3RyaWRlWzBdID09IHNyY1N0cmlkZVswXSAmJiBzcmNTdHJpZGVbMF0gPiAwKQorICAgICAgICBtZW1jcHkoZHN0WzBdICsgZHN0U3RyaWRlWzBdICogc3JjU2xpY2VZLCBzcmNbMF0sIHNyY1NsaWNlSCAqIGRzdFN0cmlkZVswXSk7CisgICAgZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNQdHIgPSBzcmNbMF07CisgICAgICAgIHVpbnQ4X3QgKmRzdFB0ciA9IGRzdFswXSArIGRzdFN0cmlkZVswXSAqIHNyY1NsaWNlWTsKKyAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgLyogdW5pdmVyc2FsIGxlbmd0aCBmaW5kZXIgKi8KKyAgICAgICAgd2hpbGUgKGxlbmd0aCArIGMtPnNyY1cgPD0gRkZBQlMoZHN0U3RyaWRlWzBdKSAmJgorICAgICAgICAgICAgICAgbGVuZ3RoICsgYy0+c3JjVyA8PSBGRkFCUyhzcmNTdHJpZGVbMF0pKQorICAgICAgICAgICAgbGVuZ3RoICs9IGMtPnNyY1c7CisgICAgICAgIGF2X2Fzc2VydDEobGVuZ3RoICE9IDApOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcmNTbGljZUg7IGkrKykgeworICAgICAgICAgICAgbWVtY3B5KGRzdFB0ciwgc3JjUHRyLCBsZW5ndGgpOworICAgICAgICAgICAgc3JjUHRyICs9IHNyY1N0cmlkZVswXTsKKyAgICAgICAgICAgIGRzdFB0ciArPSBkc3RTdHJpZGVbMF07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNyY1NsaWNlSDsKK30KKworI2RlZmluZSBESVRIRVJfQ09QWShkc3QsIGRzdFN0cmlkZSwgc3JjLCBzcmNTdHJpZGUsIGJzd2FwLCBkYnN3YXApXAorICAgIHVpbnQxNl90IHNjYWxlPSBkaXRoZXJfc2NhbGVbZHN0X2RlcHRoLTFdW3NyY19kZXB0aC0xXTtcCisgICAgaW50IHNoaWZ0PSBzcmNfZGVwdGgtZHN0X2RlcHRoICsgZGl0aGVyX3NjYWxlW3NyY19kZXB0aC0yXVtkc3RfZGVwdGgtMV07XAorICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1wKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGl0aGVyPSBkaXRoZXJzW3NyY19kZXB0aC05XVtpJjddO1wKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbmd0aC03OyBqKz04KXtcCisgICAgICAgICAgICBkc3RbaiswXSA9IGRic3dhcCgoYnN3YXAoc3JjW2orMF0pICsgZGl0aGVyWzBdKSpzY2FsZT4+c2hpZnQpO1wKKyAgICAgICAgICAgIGRzdFtqKzFdID0gZGJzd2FwKChic3dhcChzcmNbaisxXSkgKyBkaXRoZXJbMV0pKnNjYWxlPj5zaGlmdCk7XAorICAgICAgICAgICAgZHN0W2orMl0gPSBkYnN3YXAoKGJzd2FwKHNyY1tqKzJdKSArIGRpdGhlclsyXSkqc2NhbGU+PnNoaWZ0KTtcCisgICAgICAgICAgICBkc3RbaiszXSA9IGRic3dhcCgoYnN3YXAoc3JjW2orM10pICsgZGl0aGVyWzNdKSpzY2FsZT4+c2hpZnQpO1wKKyAgICAgICAgICAgIGRzdFtqKzRdID0gZGJzd2FwKChic3dhcChzcmNbais0XSkgKyBkaXRoZXJbNF0pKnNjYWxlPj5zaGlmdCk7XAorICAgICAgICAgICAgZHN0W2orNV0gPSBkYnN3YXAoKGJzd2FwKHNyY1tqKzVdKSArIGRpdGhlcls1XSkqc2NhbGU+PnNoaWZ0KTtcCisgICAgICAgICAgICBkc3Rbais2XSA9IGRic3dhcCgoYnN3YXAoc3JjW2orNl0pICsgZGl0aGVyWzZdKSpzY2FsZT4+c2hpZnQpO1wKKyAgICAgICAgICAgIGRzdFtqKzddID0gZGJzd2FwKChic3dhcChzcmNbais3XSkgKyBkaXRoZXJbN10pKnNjYWxlPj5zaGlmdCk7XAorICAgICAgICB9XAorICAgICAgICBmb3IgKDsgaiA8IGxlbmd0aDsgaisrKVwKKyAgICAgICAgICAgIGRzdFtqXSA9IGRic3dhcCgoYnN3YXAoc3JjW2pdKSArIGRpdGhlcltqJjddKSpzY2FsZT4+c2hpZnQpO1wKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZTtcCisgICAgICAgIHNyYyArPSBzcmNTdHJpZGU7XAorICAgIH0KKworc3RhdGljIGludCBwbGFuYXJDb3B5V3JhcHBlcihTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RbXSwgaW50IGRzdFN0cmlkZVtdKQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzY19zcmMgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGMtPnNyY0Zvcm1hdCk7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjX2RzdCA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYy0+ZHN0Rm9ybWF0KTsKKyAgICBpbnQgcGxhbmUsIGksIGo7CisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgNDsgcGxhbmUrKykgeworICAgICAgICBpbnQgbGVuZ3RoID0gKHBsYW5lID09IDAgfHwgcGxhbmUgPT0gMykgPyBjLT5zcmNXICA6IEZGX0NFSUxfUlNISUZUKGMtPnNyY1csICAgYy0+Y2hyRHN0SFN1YlNhbXBsZSk7CisgICAgICAgIGludCB5ID0gICAgICAocGxhbmUgPT0gMCB8fCBwbGFuZSA9PSAzKSA/IHNyY1NsaWNlWTogRkZfQ0VJTF9SU0hJRlQoc3JjU2xpY2VZLCBjLT5jaHJEc3RWU3ViU2FtcGxlKTsKKyAgICAgICAgaW50IGhlaWdodCA9IChwbGFuZSA9PSAwIHx8IHBsYW5lID09IDMpID8gc3JjU2xpY2VIOiBGRl9DRUlMX1JTSElGVChzcmNTbGljZUgsIGMtPmNockRzdFZTdWJTYW1wbGUpOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNQdHIgPSBzcmNbcGxhbmVdOworICAgICAgICB1aW50OF90ICpkc3RQdHIgPSBkc3RbcGxhbmVdICsgZHN0U3RyaWRlW3BsYW5lXSAqIHk7CisgICAgICAgIGludCBzaGlmdG9ubHk9IHBsYW5lPT0xIHx8IHBsYW5lPT0yIHx8ICghYy0+c3JjUmFuZ2UgJiYgcGxhbmU9PTApOworCisgICAgICAgIGlmICghZHN0W3BsYW5lXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBpZ25vcmUgcGFsZXR0ZSBmb3IgR1JBWTgKKyAgICAgICAgaWYgKHBsYW5lID09IDEgJiYgIWRzdFsyXSkgY29udGludWU7CisgICAgICAgIGlmICghc3JjW3BsYW5lXSB8fCAocGxhbmUgPT0gMSAmJiAhc3JjWzJdKSkgeworICAgICAgICAgICAgaWYgKGlzMTZCUFMoYy0+ZHN0Rm9ybWF0KSB8fCBpc05CUFMoYy0+ZHN0Rm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGZpbGxQbGFuZTE2KGRzdFtwbGFuZV0sIGRzdFN0cmlkZVtwbGFuZV0sIGxlbmd0aCwgaGVpZ2h0LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUgPT0gMywgZGVzY19kc3QtPmNvbXBbcGxhbmVdLmRlcHRoX21pbnVzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzQkUoYy0+ZHN0Rm9ybWF0KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGxQbGFuZShkc3RbcGxhbmVdLCBkc3RTdHJpZGVbcGxhbmVdLCBsZW5ndGgsIGhlaWdodCwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwbGFuZSA9PSAzKSA/IDI1NSA6IDEyOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZihpc05CUFMoYy0+c3JjRm9ybWF0KSB8fCBpc05CUFMoYy0+ZHN0Rm9ybWF0KQorICAgICAgICAgICAgICAgfHwgKGlzMTZCUFMoYy0+c3JjRm9ybWF0KSAhPSBpczE2QlBTKGMtPmRzdEZvcm1hdCkpCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3JjX2RlcHRoID0gZGVzY19zcmMtPmNvbXBbcGxhbmVdLmRlcHRoX21pbnVzMSArIDE7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGRzdF9kZXB0aCA9IGRlc2NfZHN0LT5jb21wW3BsYW5lXS5kZXB0aF9taW51czEgKyAxOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNQdHIyID0gKGNvbnN0IHVpbnQxNl90ICopIHNyY1B0cjsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqZHN0UHRyMiA9ICh1aW50MTZfdCopZHN0UHRyOworCisgICAgICAgICAgICAgICAgaWYgKGRzdF9kZXB0aCA9PSA4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGlzQkUoYy0+c3JjRm9ybWF0KSA9PSBIQVZFX0JJR0VORElBTil7CisgICAgICAgICAgICAgICAgICAgICAgICBESVRIRVJfQ09QWShkc3RQdHIsIGRzdFN0cmlkZVtwbGFuZV0sIHNyY1B0cjIsIHNyY1N0cmlkZVtwbGFuZV0vMiwgLCApCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBESVRIRVJfQ09QWShkc3RQdHIsIGRzdFN0cmlkZVtwbGFuZV0sIHNyY1B0cjIsIHNyY1N0cmlkZVtwbGFuZV0vMiwgYXZfYnN3YXAxNiwgKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNfZGVwdGggPT0gOCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgQ09QWTgxNih3KVwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNoaWZ0b25seSl7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKylcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcoJmRzdFB0cjJbal0sIHNyY1B0cltqXTw8KGRzdF9kZXB0aC04KSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKylcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcoJmRzdFB0cjJbal0sIChzcmNQdHJbal08PChkc3RfZGVwdGgtOCkpIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmNQdHJbal0+PigyKjgtZHN0X2RlcHRoKSkpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzQkUoYy0+ZHN0Rm9ybWF0KSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09QWTgxNihBVl9XQjE2KQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1BZODE2KEFWX1dMMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RQdHIyICs9IGRzdFN0cmlkZVtwbGFuZV0vMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciAgKz0gc3JjU3RyaWRlW3BsYW5lXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjX2RlcHRoIDw9IGRzdF9kZXB0aCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNCRShjLT5zcmNGb3JtYXQpID09IEhBVkVfQklHRU5ESUFOICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JFKGMtPmRzdEZvcm1hdCkgPT0gSEFWRV9CSUdFTkRJQU4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0b25seSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaGlmdCA9IGRzdF9kZXB0aCAtIHNyY19kZXB0aDsKKyNpZiBIQVZFX0ZBU1RfNjRCSVQKKyNkZWZpbmUgRkFTVF9DT1BZX1VQKHNoaWZ0KSBcCisgICAgZm9yICg7IGogPCBsZW5ndGggLSAzOyBqICs9IDQpIHsgXAorICAgICAgICB1aW50NjRfdCB2ID0gQVZfUk42NEEoc3JjUHRyMiArIGopOyBcCisgICAgICAgIEFWX1dONjRBKGRzdFB0cjIgKyBqLCB2IDw8IHNoaWZ0KTsgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIEZBU1RfQ09QWV9VUChzaGlmdCkgXAorICAgIGZvciAoOyBqIDwgbGVuZ3RoIC0gMTsgaiArPSAyKSB7IFwKKyAgICAgICAgdWludDMyX3QgdiA9IEFWX1JOMzJBKHNyY1B0cjIgKyBqKTsgXAorICAgICAgICBBVl9XTjMyQShkc3RQdHIyICsgaiwgdiA8PCBzaGlmdCk7IFwKKyAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IEZBU1RfQ09QWV9VUCg2KTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzogRkFTVF9DT1BZX1VQKDcpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorI2RlZmluZSBDT1BZX1VQKHIsdykgXAorICAgIGlmKHNoaWZ0b25seSl7XAorICAgICAgICBmb3IgKDsgaiA8IGxlbmd0aDsgaisrKXsgXAorICAgICAgICAgICAgdW5zaWduZWQgaW50IHY9IHIoJnNyY1B0cjJbal0pO1wKKyAgICAgICAgICAgIHcoJmRzdFB0cjJbal0sIHY8PChkc3RfZGVwdGgtc3JjX2RlcHRoKSk7XAorICAgICAgICB9XAorICAgIH1lbHNle1wKKyAgICAgICAgZm9yICg7IGogPCBsZW5ndGg7IGorKyl7IFwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2PSByKCZzcmNQdHIyW2pdKTtcCisgICAgICAgICAgICB3KCZkc3RQdHIyW2pdLCAodjw8KGRzdF9kZXB0aC1zcmNfZGVwdGgpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2Pj4oMipzcmNfZGVwdGgtZHN0X2RlcHRoKSkpO1wKKyAgICAgICAgfVwKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZihpc0JFKGMtPnNyY0Zvcm1hdCkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzQkUoYy0+ZHN0Rm9ybWF0KSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUFlfVVAoQVZfUkIxNiwgQVZfV0IxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1BZX1VQKEFWX1JCMTYsIEFWX1dMMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc0JFKGMtPmRzdEZvcm1hdCkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1BZX1VQKEFWX1JMMTYsIEFWX1dCMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09QWV9VUChBVl9STDE2LCBBVl9XTDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFB0cjIgKz0gZHN0U3RyaWRlW3BsYW5lXS8yOworICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyMiArPSBzcmNTdHJpZGVbcGxhbmVdLzI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZihpc0JFKGMtPnNyY0Zvcm1hdCkgPT0gSEFWRV9CSUdFTkRJQU4peworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNCRShjLT5kc3RGb3JtYXQpID09IEhBVkVfQklHRU5ESUFOKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVRIRVJfQ09QWShkc3RQdHIyLCBkc3RTdHJpZGVbcGxhbmVdLzIsIHNyY1B0cjIsIHNyY1N0cmlkZVtwbGFuZV0vMiwgLCApCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVEhFUl9DT1BZKGRzdFB0cjIsIGRzdFN0cmlkZVtwbGFuZV0vMiwgc3JjUHRyMiwgc3JjU3RyaWRlW3BsYW5lXS8yLCAsIGF2X2Jzd2FwMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNCRShjLT5kc3RGb3JtYXQpID09IEhBVkVfQklHRU5ESUFOKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVRIRVJfQ09QWShkc3RQdHIyLCBkc3RTdHJpZGVbcGxhbmVdLzIsIHNyY1B0cjIsIHNyY1N0cmlkZVtwbGFuZV0vMiwgYXZfYnN3YXAxNiwgKQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVRIRVJfQ09QWShkc3RQdHIyLCBkc3RTdHJpZGVbcGxhbmVdLzIsIHNyY1B0cjIsIHNyY1N0cmlkZVtwbGFuZV0vMiwgYXZfYnN3YXAxNiwgYXZfYnN3YXAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXMxNkJQUyhjLT5zcmNGb3JtYXQpICYmIGlzMTZCUFMoYy0+ZHN0Rm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICAgIGlzQkUoYy0+c3JjRm9ybWF0KSAhPSBpc0JFKGMtPmRzdEZvcm1hdCkpIHsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90ICopIGRzdFB0cilbal0gPSBhdl9ic3dhcDE2KCgoY29uc3QgdWludDE2X3QgKikgc3JjUHRyKVtqXSk7CisgICAgICAgICAgICAgICAgICAgIHNyY1B0ciArPSBzcmNTdHJpZGVbcGxhbmVdOworICAgICAgICAgICAgICAgICAgICBkc3RQdHIgKz0gZHN0U3RyaWRlW3BsYW5lXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRzdFN0cmlkZVtwbGFuZV0gPT0gc3JjU3RyaWRlW3BsYW5lXSAmJgorICAgICAgICAgICAgICAgICAgICAgICBzcmNTdHJpZGVbcGxhbmVdID4gMCAmJiBzcmNTdHJpZGVbcGxhbmVdID09IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIG1lbWNweShkc3RbcGxhbmVdICsgZHN0U3RyaWRlW3BsYW5lXSAqIHksIHNyY1twbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAqIGRzdFN0cmlkZVtwbGFuZV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXMxNkJQUyhjLT5zcmNGb3JtYXQpICYmIGlzMTZCUFMoYy0+ZHN0Rm9ybWF0KSkKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICo9IDI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWRlc2Nfc3JjLT5jb21wWzBdLmRlcHRoX21pbnVzMSkKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID4+PSAzOyAvLyBtb25vd2hpdGUvYmxhY2sKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdFB0ciwgc3JjUHRyLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBzcmNQdHIgKz0gc3JjU3RyaWRlW3BsYW5lXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0UHRyICs9IGRzdFN0cmlkZVtwbGFuZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzcmNTbGljZUg7Cit9CisKKworI2RlZmluZSBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY19mbXQsIGRzdF9mbXQsIHBpeF9mbXQpICAgICAgICAgIFwKKyAgICAoKHNyY19mbXQgPT0gcGl4X2ZtdCAjIyBCRSAmJiBkc3RfZm10ID09IHBpeF9mbXQgIyMgTEUpIHx8ICAgICBcCisgICAgIChzcmNfZm10ID09IHBpeF9mbXQgIyMgTEUgJiYgZHN0X2ZtdCA9PSBwaXhfZm10ICMjIEJFKSkKKworCit2b2lkIGZmX2dldF91bnNjYWxlZF9zd3NjYWxlKFN3c0NvbnRleHQgKmMpCit7CisgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHNyY0Zvcm1hdCA9IGMtPnNyY0Zvcm1hdDsKKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0ID0gYy0+ZHN0Rm9ybWF0OworICAgIGNvbnN0IGludCBmbGFncyA9IGMtPmZsYWdzOworICAgIGNvbnN0IGludCBkc3RIID0gYy0+ZHN0SDsKKyAgICBpbnQgbmVlZHNEaXRoZXI7CisKKyAgICBuZWVkc0RpdGhlciA9IGlzQW55UkdCKGRzdEZvcm1hdCkgJiYKKyAgICAgICAgICAgIGMtPmRzdEZvcm1hdEJwcCA8IDI0ICYmCisgICAgICAgICAgIChjLT5kc3RGb3JtYXRCcHAgPCBjLT5zcmNGb3JtYXRCcHAgfHwgKCFpc0FueVJHQihzcmNGb3JtYXQpKSk7CisKKyAgICAvKiB5djEyX3RvX252MTIgKi8KKyAgICBpZiAoKHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAgfHwgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWQTQyMFApICYmCisgICAgICAgIChkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9OVjEyIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX05WMjEpKSB7CisgICAgICAgIGMtPnN3c2NhbGUgPSBwbGFuYXJUb052MTJXcmFwcGVyOworICAgIH0KKyAgICAvKiBudjEyX3RvX3l2MTIgKi8KKyAgICBpZiAoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUCAmJgorICAgICAgICAoc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfTlYxMiB8fCBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9OVjIxKSkgeworICAgICAgICBjLT5zd3NjYWxlID0gbnYxMlRvUGxhbmFyV3JhcHBlcjsKKyAgICB9CisgICAgLyogeXV2MmJnciAqLworICAgIGlmICgoc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUCB8fCBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQIHx8CisgICAgICAgICBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDIwUCkgJiYgaXNBbnlSR0IoZHN0Rm9ybWF0KSAmJgorICAgICAgICAhKGZsYWdzICYgU1dTX0FDQ1VSQVRFX1JORCkgJiYgKGMtPmRpdGhlciA9PSBTV1NfRElUSEVSX0JBWUVSIHx8IGMtPmRpdGhlciA9PSBTV1NfRElUSEVSX0FVVE8pICYmICEoZHN0SCAmIDEpKSB7CisgICAgICAgIGMtPnN3c2NhbGUgPSBmZl95dXYycmdiX2dldF9mdW5jX3B0cihjKTsKKyAgICB9CisKKyAgICBpZiAoc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDEwUCAmJiAhKGRzdEggJiAzKSAmJgorICAgICAgICAoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUCB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDIwUCkgJiYKKyAgICAgICAgIShmbGFncyAmIFNXU19CSVRFWEFDVCkpIHsKKyAgICAgICAgYy0+c3dzY2FsZSA9IHl2dTlUb1l2MTJXcmFwcGVyOworICAgIH0KKworICAgIC8qIGJncjI0dG9ZVjEyICovCisgICAgaWYgKHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0JHUjI0ICYmCisgICAgICAgIChkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVkE0MjBQKSAmJgorICAgICAgICAhKGZsYWdzICYgU1dTX0FDQ1VSQVRFX1JORCkpCisgICAgICAgIGMtPnN3c2NhbGUgPSBiZ3IyNFRvWXYxMldyYXBwZXI7CisKKyAgICAvKiBSR0IvQkdSIC0+IFJHQi9CR1IgKG5vIGRpdGhlciBuZWVkZWQgZm9ybXMpICovCisgICAgaWYgKGlzQW55UkdCKHNyY0Zvcm1hdCkgJiYgaXNBbnlSR0IoZHN0Rm9ybWF0KSAmJiBmaW5kUmdiQ29udkZuKGMpCisgICAgICAgICYmICghbmVlZHNEaXRoZXIgfHwgKGMtPmZsYWdzJihTV1NfRkFTVF9CSUxJTkVBUnxTV1NfUE9JTlQpKSkpCisgICAgICAgIGMtPnN3c2NhbGUgPSByZ2JUb1JnYldyYXBwZXI7CisKKyAgICBpZiAoKHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlAgJiYgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSQVApIHx8CisgICAgICAgIChzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJBUCAmJiBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQKSkKKyAgICAgICAgYy0+c3dzY2FsZSA9IHBsYW5hclJnYlRvcGxhbmFyUmdiV3JhcHBlcjsKKworI2RlZmluZSBpc0J5dGVSR0IoZikgKCAgICAgICAgICAgICBcCisgICAgICAgIGYgPT0gQVZfUElYX0ZNVF9SR0IzMiAgIHx8IFwKKyAgICAgICAgZiA9PSBBVl9QSVhfRk1UX1JHQjMyXzEgfHwgXAorICAgICAgICBmID09IEFWX1BJWF9GTVRfUkdCMjQgICB8fCBcCisgICAgICAgIGYgPT0gQVZfUElYX0ZNVF9CR1IzMiAgIHx8IFwKKyAgICAgICAgZiA9PSBBVl9QSVhfRk1UX0JHUjMyXzEgfHwgXAorICAgICAgICBmID09IEFWX1BJWF9GTVRfQkdSMjQpCisKKyAgICBpZiAoc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUCAmJiBpc1BsYW5hcihzcmNGb3JtYXQpICYmIGlzQnl0ZVJHQihkc3RGb3JtYXQpKQorICAgICAgICBjLT5zd3NjYWxlID0gcGxhbmFyUmdiVG9SZ2JXcmFwcGVyOworCisgICAgaWYgKChzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9SR0I0OExFICB8fCBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9SR0I0OEJFICB8fAorICAgICAgICAgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSNDhMRSAgfHwgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSNDhCRSAgfHwKKyAgICAgICAgIHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQkE2NExFIHx8IHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQkE2NEJFIHx8CisgICAgICAgICBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9CR1JBNjRMRSB8fCBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9CR1JBNjRCRSkgJiYKKyAgICAgICAgKGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlA5TEUgIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlA5QkUgIHx8CisgICAgICAgICBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQMTBMRSB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQMTBCRSB8fAorICAgICAgICAgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUDEyTEUgfHwgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUDEyQkUgfHwKKyAgICAgICAgIGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlAxNExFIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlAxNEJFIHx8CisgICAgICAgICBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQMTZMRSB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQMTZCRSB8fAorICAgICAgICAgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSQVAxNkxFIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUkFQMTZCRSApKQorICAgICAgICBjLT5zd3NjYWxlID0gUmdiMTZUb1BsYW5hclJnYjE2V3JhcHBlcjsKKworICAgIGlmICgoc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUDlMRSAgfHwgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUDlCRSAgfHwKKyAgICAgICAgIHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlAxNkxFIHx8IHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlAxNkJFIHx8CisgICAgICAgICBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQMTBMRSB8fCBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQMTBCRSB8fAorICAgICAgICAgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUDEyTEUgfHwgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUDEyQkUgfHwKKyAgICAgICAgIHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlAxNExFIHx8IHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlAxNEJFIHx8CisgICAgICAgICBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJBUDE2TEUgfHwgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSQVAxNkJFKSAmJgorICAgICAgICAoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfUkdCNDhMRSAgfHwgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfUkdCNDhCRSAgfHwKKyAgICAgICAgIGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX0JHUjQ4TEUgIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX0JHUjQ4QkUgIHx8CisgICAgICAgICBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9SR0JBNjRMRSB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9SR0JBNjRCRSB8fAorICAgICAgICAgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSQTY0TEUgfHwgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSQTY0QkUpKQorICAgICAgICBjLT5zd3NjYWxlID0gcGxhbmFyUmdiMTZUb1JnYjE2V3JhcHBlcjsKKworICAgIGlmIChhdl9waXhfZm10X2Rlc2NfZ2V0KHNyY0Zvcm1hdCktPmNvbXBbMF0uZGVwdGhfbWludXMxID09IDcgJiYKKyAgICAgICAgaXNQYWNrZWRSR0Ioc3JjRm9ybWF0KSAmJiBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQKQorICAgICAgICBjLT5zd3NjYWxlID0gcmdiVG9QbGFuYXJSZ2JXcmFwcGVyOworCisgICAgaWYgKGlzQmF5ZXIoc3JjRm9ybWF0KSkgeworICAgICAgICBpZiAoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfUkdCMjQpCisgICAgICAgICAgICBjLT5zd3NjYWxlID0gYmF5ZXJfdG9fcmdiMjRfd3JhcHBlcjsKKyAgICAgICAgZWxzZSBpZiAoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkKKyAgICAgICAgICAgIGMtPnN3c2NhbGUgPSBiYXllcl90b195djEyX3dyYXBwZXI7CisgICAgICAgIGVsc2UgaWYgKCFpc0JheWVyKGRzdEZvcm1hdCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBiYXllciBjb252ZXJzaW9uXG4iKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBic3dhcCAxNiBiaXRzIHBlciBwaXhlbC9jb21wb25lbnQgcGFja2VkIGZvcm1hdHMgKi8KKyAgICBpZiAoSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9CQVlFUl9CR0dSMTYpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfQkFZRVJfUkdHQjE2KSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX0JBWUVSX0dCUkcxNikgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9CQVlFUl9HUkJHMTYpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfQkdSNDQ0KSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX0JHUjQ4KSAgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9CR1JBNjQpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfQkdSNTU1KSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX0JHUjU2NSkgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9CR1JBNjQpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfR1JBWTE2KSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX1lBMTYpICAgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9HQlJQOSkgIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfR0JSUDEwKSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX0dCUlAxMikgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9HQlJQMTQpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfR0JSUDE2KSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX0dCUkFQMTYpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfUkdCNDQ0KSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX1JHQjQ4KSAgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9SR0JBNjQpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfUkdCNTU1KSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX1JHQjU2NSkgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9SR0JBNjQpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfWFlaMTIpICB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX1lVVjQyMFA5KSAgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9ZVVY0MjBQMTApIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfWVVWNDIwUDEyKSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX1lVVjQyMFAxNCkgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9ZVVY0MjBQMTYpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfWVVWNDIyUDkpICB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX1lVVjQyMlAxMCkgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfWVVWNDIyUDE0KSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX1lVVjQyMlAxNikgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9ZVVY0NDRQOSkgIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwKSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX1lVVjQ0NFAxMikgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTQpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfWVVWNDQ0UDE2KSkKKyAgICAgICAgYy0+c3dzY2FsZSA9IHBhY2tlZF8xNmJwY19ic3dhcDsKKworICAgIGlmICh1c2VQYWwoc3JjRm9ybWF0KSAmJiBpc0J5dGVSR0IoZHN0Rm9ybWF0KSkKKyAgICAgICAgYy0+c3dzY2FsZSA9IHBhbFRvUmdiV3JhcHBlcjsKKworICAgIGlmIChzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQKSB7CisgICAgICAgIGlmIChkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVlWNDIyKQorICAgICAgICAgICAgYy0+c3dzY2FsZSA9IHl1djQyMnBUb1l1eTJXcmFwcGVyOworICAgICAgICBlbHNlIGlmIChkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9VWVZZNDIyKQorICAgICAgICAgICAgYy0+c3dzY2FsZSA9IHl1djQyMnBUb1V5dnlXcmFwcGVyOworICAgIH0KKworICAgIC8qIExRIGNvbnZlcnRlcnMgaWYgLXN3cyAwIG9yIC1zd3MgNCovCisgICAgaWYgKGMtPmZsYWdzJihTV1NfRkFTVF9CSUxJTkVBUnxTV1NfUE9JTlQpKSB7CisgICAgICAgIC8qIHl2MTJfdG9feXV5MiAqLworICAgICAgICBpZiAoc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUCB8fCBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDIwUCkgeworICAgICAgICAgICAgaWYgKGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVWVY0MjIpCisgICAgICAgICAgICAgICAgYy0+c3dzY2FsZSA9IHBsYW5hclRvWXV5MldyYXBwZXI7CisgICAgICAgICAgICBlbHNlIGlmIChkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9VWVZZNDIyKQorICAgICAgICAgICAgICAgIGMtPnN3c2NhbGUgPSBwbGFuYXJUb1V5dnlXcmFwcGVyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVlWNDIyICYmCisgICAgICAgKGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAgfHwgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWQTQyMFApKQorICAgICAgICBjLT5zd3NjYWxlID0geXV5dlRvWXV2NDIwV3JhcHBlcjsKKyAgICBpZiAoc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfVVlWWTQyMiAmJgorICAgICAgIChkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVkE0MjBQKSkKKyAgICAgICAgYy0+c3dzY2FsZSA9IHV5dnlUb1l1djQyMFdyYXBwZXI7CisgICAgaWYgKHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX1lVWVY0MjIgJiYgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkKKyAgICAgICAgYy0+c3dzY2FsZSA9IHl1eXZUb1l1djQyMldyYXBwZXI7CisgICAgaWYgKHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX1VZVlk0MjIgJiYgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkKKyAgICAgICAgYy0+c3dzY2FsZSA9IHV5dnlUb1l1djQyMldyYXBwZXI7CisKKyNkZWZpbmUgaXNQbGFuYXJHcmF5KHgpIChpc0dyYXkoeCkgJiYgKHgpICE9IEFWX1BJWF9GTVRfWUE4ICYmICh4KSAhPSBBVl9QSVhfRk1UX1lBMTZMRSAmJiAoeCkgIT0gQVZfUElYX0ZNVF9ZQTE2QkUpCisgICAgLyogc2ltcGxlIGNvcHkgKi8KKyAgICBpZiAoIHNyY0Zvcm1hdCA9PSBkc3RGb3JtYXQgfHwKKyAgICAgICAgKHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVkE0MjBQICYmIGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFApIHx8CisgICAgICAgIChzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQICYmIGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVkE0MjBQKSB8fAorICAgICAgICAoaXNQbGFuYXJZVVYoc3JjRm9ybWF0KSAmJiBpc1BsYW5hckdyYXkoZHN0Rm9ybWF0KSkgfHwKKyAgICAgICAgKGlzUGxhbmFyWVVWKGRzdEZvcm1hdCkgJiYgaXNQbGFuYXJHcmF5KHNyY0Zvcm1hdCkpIHx8CisgICAgICAgIChpc1BsYW5hckdyYXkoZHN0Rm9ybWF0KSAmJiBpc1BsYW5hckdyYXkoc3JjRm9ybWF0KSkgfHwKKyAgICAgICAgKGlzUGxhbmFyWVVWKHNyY0Zvcm1hdCkgJiYgaXNQbGFuYXJZVVYoZHN0Rm9ybWF0KSAmJgorICAgICAgICAgYy0+Y2hyRHN0SFN1YlNhbXBsZSA9PSBjLT5jaHJTcmNIU3ViU2FtcGxlICYmCisgICAgICAgICBjLT5jaHJEc3RWU3ViU2FtcGxlID09IGMtPmNoclNyY1ZTdWJTYW1wbGUgJiYKKyAgICAgICAgIGRzdEZvcm1hdCAhPSBBVl9QSVhfRk1UX05WMTIgJiYgZHN0Rm9ybWF0ICE9IEFWX1BJWF9GTVRfTlYyMSAmJgorICAgICAgICAgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfTlYxMiAmJiBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9OVjIxKSkKKyAgICB7CisgICAgICAgIGlmIChpc1BhY2tlZChjLT5zcmNGb3JtYXQpKQorICAgICAgICAgICAgYy0+c3dzY2FsZSA9IHBhY2tlZENvcHlXcmFwcGVyOworICAgICAgICBlbHNlIC8qIFBsYW5hciBZVVYgb3IgZ3JheSAqLworICAgICAgICAgICAgYy0+c3dzY2FsZSA9IHBsYW5hckNvcHlXcmFwcGVyOworICAgIH0KKworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfZ2V0X3Vuc2NhbGVkX3N3c2NhbGVfcHBjKGMpOworLy8gICAgIGlmIChBUkNIX0FSTSkKKy8vICAgICAgICAgZmZfZ2V0X3Vuc2NhbGVkX3N3c2NhbGVfYXJtKGMpOworfQorCisvKiBDb252ZXJ0IHRoZSBwYWxldHRlIHRvIHRoZSBzYW1lIHBhY2tlZCAzMi1iaXQgZm9ybWF0IGFzIHRoZSBwYWxldHRlICovCit2b2lkIHN3c19jb252ZXJ0UGFsZXR0ZThUb1BhY2tlZDMyKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgY29uc3QgdWludDhfdCAqcGFsZXR0ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyBpKyspCisgICAgICAgICgodWludDMyX3QgKikgZHN0KVtpXSA9ICgoY29uc3QgdWludDMyX3QgKikgcGFsZXR0ZSlbc3JjW2ldXTsKK30KKworLyogUGFsZXR0ZSBmb3JtYXQ6IEFCQ0QgLT4gZHN0IGZvcm1hdDogQUJDICovCit2b2lkIHN3c19jb252ZXJ0UGFsZXR0ZThUb1BhY2tlZDI0KGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgY29uc3QgdWludDhfdCAqcGFsZXR0ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyBpKyspIHsKKyAgICAgICAgLy9GSVhNRSBzbG93PworICAgICAgICBkc3RbMF0gPSBwYWxldHRlW3NyY1tpXSAqIDQgKyAwXTsKKyAgICAgICAgZHN0WzFdID0gcGFsZXR0ZVtzcmNbaV0gKiA0ICsgMV07CisgICAgICAgIGRzdFsyXSA9IHBhbGV0dGVbc3JjW2ldICogNCArIDJdOworICAgICAgICBkc3QgKz0gMzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS9zd3NjYWxlcmVzLnJjIGIvZmZtcGVnL2xpYnN3c2NhbGUvc3dzY2FsZXJlcy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvc3dzY2FsZXJlcy5yYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogV2luZG93cyByZXNvdXJjZSBmaWxlIGZvciBsaWJzd3NjYWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEphbWVzIEFsbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGlhbmNoZW5nICJUaW1vdGh5IiBHdQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgImxpYnN3c2NhbGUvdmVyc2lvbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworMSBWRVJTSU9OSU5GTworRklMRVZFUlNJT04gICAgIExJQlNXU0NBTEVfVkVSU0lPTl9NQUpPUiwgTElCU1dTQ0FMRV9WRVJTSU9OX01JTk9SLCBMSUJTV1NDQUxFX1ZFUlNJT05fTUlDUk8sIDAKK1BST0RVQ1RWRVJTSU9OICBMSUJTV1NDQUxFX1ZFUlNJT05fTUFKT1IsIExJQlNXU0NBTEVfVkVSU0lPTl9NSU5PUiwgTElCU1dTQ0FMRV9WRVJTSU9OX01JQ1JPLCAwCitGSUxFRkxBR1NNQVNLICAgVlNfRkZJX0ZJTEVGTEFHU01BU0sKK0ZJTEVPUyAgICAgICAgICBWT1NfTlRfV0lORE9XUzMyCitGSUxFVFlQRSAgICAgICAgVkZUX0RMTAoreworICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICB7CisgICAgICAgIEJMT0NLICIwNDA5MDRCMCIKKyAgICAgICAgeworICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgICAgICAiRkZtcGVnIFByb2plY3QiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgICJGRm1wZWcgaW1hZ2UgcmVzY2FsaW5nIGxpYnJhcnkiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAgICAgIEFWX1NUUklOR0lGWShMSUJTV1NDQUxFX1ZFUlNJT04pCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgICAgICJsaWJzd3NjYWxlIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgICAiQ29weXJpZ2h0IChDKSAyMDAwLSIgQVZfU1RSSU5HSUZZKENPTkZJR19USElTX1lFQVIpICIgRkZtcGVnIFByb2plY3QiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJzd3NjYWxlIiBCVUlMRFNVRiAiLSIgQVZfU1RSSU5HSUZZKExJQlNXU0NBTEVfVkVSU0lPTl9NQUpPUikgU0xJQlNVRgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgICAgICAiRkZtcGVnIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgICBGRk1QRUdfVkVSU0lPTgorICAgICAgICB9CisgICAgfQorCisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIHsKKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwNDA5LCAweDA0QjAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS91dGlscy5jIGIvZmZtcGVnL2xpYnN3c2NhbGUvdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQ5NGVkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvdXRpbHMuYwpAQCAtMCwwICsxLDE5OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNkZWZpbmUgX1NWSURfU09VUkNFIC8vIG5lZWRlZCBmb3IgTUFQX0FOT05ZTU9VUworI2RlZmluZSBfREFSV0lOX0NfU09VUkNFIC8vIG5lZWRlZCBmb3IgTUFQX0FOT04KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfU1lTX01NQU5fSAorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaWYgZGVmaW5lZChNQVBfQU5PTikgJiYgIWRlZmluZWQoTUFQX0FOT05ZTU9VUykKKyNkZWZpbmUgTUFQX0FOT05ZTU9VUyBNQVBfQU5PTgorI2VuZGlmCisjZW5kaWYKKyNpZiBIQVZFX1ZJUlRVQUxBTExPQworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgInJnYjJyZ2IuaCIKKyNpbmNsdWRlICJzd3NjYWxlLmgiCisjaW5jbHVkZSAic3dzY2FsZV9pbnRlcm5hbC5oIgorCitzdGF0aWMgdm9pZCBoYW5kbGVfZm9ybWF0cyhTd3NDb250ZXh0ICpjKTsKKwordW5zaWduZWQgc3dzY2FsZV92ZXJzaW9uKHZvaWQpCit7CisgICAgYXZfYXNzZXJ0MChMSUJTV1NDQUxFX1ZFUlNJT05fTUlDUk8gPj0gMTAwKTsKKyAgICByZXR1cm4gTElCU1dTQ0FMRV9WRVJTSU9OX0lOVDsKK30KKworY29uc3QgY2hhciAqc3dzY2FsZV9jb25maWd1cmF0aW9uKHZvaWQpCit7CisgICAgcmV0dXJuIEZGTVBFR19DT05GSUdVUkFUSU9OOworfQorCitjb25zdCBjaGFyICpzd3NjYWxlX2xpY2Vuc2Uodm9pZCkKK3sKKyNkZWZpbmUgTElDRU5TRV9QUkVGSVggImxpYnN3c2NhbGUgbGljZW5zZTogIgorICAgIHJldHVybiBMSUNFTlNFX1BSRUZJWCBGRk1QRUdfTElDRU5TRSArIHNpemVvZihMSUNFTlNFX1BSRUZJWCkgLSAxOworfQorCit0eXBlZGVmIHN0cnVjdCBGb3JtYXRFbnRyeSB7CisgICAgdWludDhfdCBpc19zdXBwb3J0ZWRfaW4gICAgICAgICA6MTsKKyAgICB1aW50OF90IGlzX3N1cHBvcnRlZF9vdXQgICAgICAgIDoxOworICAgIHVpbnQ4X3QgaXNfc3VwcG9ydGVkX2VuZGlhbm5lc3MgOjE7Cit9IEZvcm1hdEVudHJ5OworCitzdGF0aWMgY29uc3QgRm9ybWF0RW50cnkgZm9ybWF0X2VudHJpZXNbQVZfUElYX0ZNVF9OQl0gPSB7CisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUF0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVZVjQyMl0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCMjRdICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSMjRdICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUF0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UF0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDEwUF0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDExUF0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR1JBWThdICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfTU9OT1dISVRFXSAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfTU9OT0JMQUNLXSAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUEFMOF0gICAgICAgID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWSjQyMFBdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWSjQxMVBdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWSjQyMlBdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWSjQ0NFBdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVZZVTQyMl0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfVVlWWTQyMl0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfVVlZVllZNDExXSAgID0geyAwLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSOF0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNF0gICAgICAgID0geyAwLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNF9CWVRFXSAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCOF0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNF0gICAgICAgID0geyAwLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNF9CWVRFXSAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfTlYxMl0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfTlYyMV0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQVJHQl0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCQV0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQUJHUl0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSQV0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfMFJHQl0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCMF0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfMEJHUl0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSMF0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR1JBWTE2QkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR1JBWTE2TEVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQwUF0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWSjQ0MFBdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMFBdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMlBdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQ0NFBdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMFA5QkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMFA5TEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMlA5QkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMlA5TEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQ0NFA5QkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQ0NFA5TEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMFAxMEJFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMFAxMExFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMlAxMEJFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMlAxMExFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQ0NFAxMEJFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQ0NFAxMExFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMFAxNkJFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMFAxNkxFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMlAxNkJFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQyMlAxNkxFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQ0NFAxNkJFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWQTQ0NFAxNkxFXT0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNDhCRV0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNDhMRV0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCQTY0QkVdICAgID0geyAxLCAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCQTY0TEVdICAgID0geyAxLCAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNTY1QkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNTY1TEVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNTU1QkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNTU1TEVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNTY1QkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNTY1TEVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNTU1QkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNTU1TEVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUDE2TEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUDE2QkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUDE2TEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUDE2QkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDE2TEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDE2QkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNDQ0TEVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUkdCNDQ0QkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNDQ0TEVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNDQ0QkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWUE4XSAgICAgICAgID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfWUExNkJFXSAgICAgID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfWUExNkxFXSAgICAgID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNDhCRV0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSNDhMRV0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSQTY0QkVdICAgID0geyAxLCAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfQkdSQTY0TEVdICAgID0geyAxLCAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUDlCRV0gID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUDlMRV0gID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUDEwQkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUDEwTEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUDEyQkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUDEyTEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUDE0QkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIwUDE0TEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUDlCRV0gID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUDlMRV0gID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUDEwQkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUDEwTEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUDEyQkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUDEyTEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUDE0QkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDIyUDE0TEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDlCRV0gID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDlMRV0gID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDEwQkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDEwTEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDEyQkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDEyTEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDE0QkVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWVVWNDQ0UDE0TEVdID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUF0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDlMRV0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDlCRV0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDEwTEVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDEwQkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDEyTEVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDEyQkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDE0TEVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDE0QkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDE2TEVdICAgID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSUDE2QkVdICAgID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfWFlaMTJCRV0gICAgID0geyAxLCAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfWFlaMTJMRV0gICAgID0geyAxLCAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSQVBdICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSQVAxNkxFXSAgID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSQVAxNkJFXSAgID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfQkdHUjhdID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfUkdHQjhdID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfR0JSRzhdID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfR1JCRzhdID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfQkdHUjE2TEVdID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfQkdHUjE2QkVdID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfUkdHQjE2TEVdID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfUkdHQjE2QkVdID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfR0JSRzE2TEVdID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfR0JSRzE2QkVdID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfR1JCRzE2TEVdID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfQkFZRVJfR1JCRzE2QkVdID0geyAxLCAwIH0sCit9OworCitpbnQgc3dzX2lzU3VwcG9ydGVkSW5wdXQoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgcmV0dXJuICh1bnNpZ25lZClwaXhfZm10IDwgQVZfUElYX0ZNVF9OQiA/CisgICAgICAgICAgIGZvcm1hdF9lbnRyaWVzW3BpeF9mbXRdLmlzX3N1cHBvcnRlZF9pbiA6IDA7Cit9CisKK2ludCBzd3NfaXNTdXBwb3J0ZWRPdXRwdXQoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgcmV0dXJuICh1bnNpZ25lZClwaXhfZm10IDwgQVZfUElYX0ZNVF9OQiA/CisgICAgICAgICAgIGZvcm1hdF9lbnRyaWVzW3BpeF9mbXRdLmlzX3N1cHBvcnRlZF9vdXQgOiAwOworfQorCitpbnQgc3dzX2lzU3VwcG9ydGVkRW5kaWFubmVzc0NvbnZlcnNpb24oZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgcmV0dXJuICh1bnNpZ25lZClwaXhfZm10IDwgQVZfUElYX0ZNVF9OQiA/CisgICAgICAgICAgIGZvcm1hdF9lbnRyaWVzW3BpeF9mbXRdLmlzX3N1cHBvcnRlZF9lbmRpYW5uZXNzIDogMDsKK30KKworc3RhdGljIGRvdWJsZSBnZXRTcGxpbmVDb2VmZihkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRpc3QpCit7CisgICAgaWYgKGRpc3QgPD0gMS4wKQorICAgICAgICByZXR1cm4gKChkICogZGlzdCArIGMpICogZGlzdCArIGIpICogZGlzdCArIGE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZ2V0U3BsaW5lQ29lZmYoMC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgKyAyLjAgKiBjICsgMy4wICogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICsgMy4wICogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1iIC0gMy4wICogYyAtIDYuMCAqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0IC0gMS4wKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGdldF9sb2NhbF9wb3MoU3dzQ29udGV4dCAqcywgaW50IGNocl9zdWJzYW1wbGUsIGludCBwb3MsIGludCBkaXIpCit7CisgICAgaWYgKHBvcyA9PSAtMSB8fCBwb3MgPD0gLTUxMykgeworICAgICAgICBwb3MgPSAoMTI4IDw8IGNocl9zdWJzYW1wbGUpIC0gMTI4OworICAgIH0KKyAgICBwb3MgKz0gMTI4OyAvLyByZWxhdGl2ZSB0byBpZGVhbCBsZWZ0IGVkZ2UKKyAgICByZXR1cm4gcG9zID4+IGNocl9zdWJzYW1wbGU7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgZmxhZzsgICAgICAgICAgICAgICAgICAgLy8vPCBmbGFnIGFzc29jaWF0ZWQgdG8gdGhlIGFsZ29yaXRobQorICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOyAgICAvLy88IGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uCisgICAgaW50IHNpemVfZmFjdG9yOyAgICAgICAgICAgIC8vLzwgc2l6ZSBmYWN0b3IgdXNlZCB3aGVuIGluaXRpbmcgdGhlIGZpbHRlcnMKK30gU2NhbGVBbGdvcml0aG07CisKK3N0YXRpYyBjb25zdCBTY2FsZUFsZ29yaXRobSBzY2FsZV9hbGdvcml0aG1zW10gPSB7CisgICAgeyBTV1NfQVJFQSwgICAgICAgICAgImFyZWEgYXZlcmFnaW5nIiwgICAgICAgICAgICAgICAgICAxIC8qIGRvd25zY2FsZSBvbmx5LCBmb3IgdXBzY2FsZSBpdCBpcyBiaWxpbmVhciAqLyB9LAorICAgIHsgU1dTX0JJQ1VCSUMsICAgICAgICJiaWN1YmljIiwgICAgICAgICAgICAgICAgICAgICAgICAgNCB9LAorICAgIHsgU1dTX0JJQ1VCTElOLCAgICAgICJsdW1hIGJpY3ViaWMgLyBjaHJvbWEgYmlsaW5lYXIiLCAtMSB9LAorICAgIHsgU1dTX0JJTElORUFSLCAgICAgICJiaWxpbmVhciIsICAgICAgICAgICAgICAgICAgICAgICAgMiB9LAorICAgIHsgU1dTX0ZBU1RfQklMSU5FQVIsICJmYXN0IGJpbGluZWFyIiwgICAgICAgICAgICAgICAgICAtMSB9LAorICAgIHsgU1dTX0dBVVNTLCAgICAgICAgICJHYXVzc2lhbiIsICAgICAgICAgICAgICAgICAgICAgICAgOCAvKiBpbmZpbml0ZSA7KSAqLyB9LAorICAgIHsgU1dTX0xBTkNaT1MsICAgICAgICJMYW5jem9zIiwgICAgICAgICAgICAgICAgICAgICAgICAtMSAvKiBjdXN0b20gKi8gfSwKKyAgICB7IFNXU19QT0lOVCwgICAgICAgICAibmVhcmVzdCBuZWlnaGJvciAvIHBvaW50IiwgICAgICAgLTEgfSwKKyAgICB7IFNXU19TSU5DLCAgICAgICAgICAic2luYyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgLyogaW5maW5pdGUgOykgKi8gfSwKKyAgICB7IFNXU19TUExJTkUsICAgICAgICAiYmljdWJpYyBzcGxpbmUiLCAgICAgICAgICAgICAgICAgMjAgLyogaW5maW5pdGUgOikqLyB9LAorICAgIHsgU1dTX1gsICAgICAgICAgICAgICJleHBlcmltZW50YWwiLCAgICAgICAgICAgICAgICAgICAgOCB9LAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXRGaWx0ZXIoaW50MTZfdCAqKm91dEZpbHRlciwgaW50MzJfdCAqKmZpbHRlclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0RmlsdGVyU2l6ZSwgaW50IHhJbmMsIGludCBzcmNXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFcsIGludCBmaWx0ZXJBbGlnbiwgaW50IG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywgaW50IGNwdV9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3c1ZlY3RvciAqc3JjRmlsdGVyLCBTd3NWZWN0b3IgKmRzdEZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYXJhbVsyXSwgaW50IHNyY1BvcywgaW50IGRzdFBvcykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZmlsdGVyU2l6ZTsKKyAgICBpbnQgZmlsdGVyMlNpemU7CisgICAgaW50IG1pbkZpbHRlclNpemU7CisgICAgaW50NjRfdCAqZmlsdGVyICAgID0gTlVMTDsKKyAgICBpbnQ2NF90ICpmaWx0ZXIyICAgPSBOVUxMOworICAgIGNvbnN0IGludDY0X3QgZm9uZSA9IDFMTCA8PCAoNTQgLSBGRk1JTihhdl9sb2cyKHNyY1cvZHN0VyksIDgpKTsKKyAgICBpbnQgcmV0ICAgICAgICAgICAgPSAtMTsKKworICAgIGVtbXNfYygpOyAvLyBGSVhNRSBzaG91bGQgbm90IGJlIHJlcXVpcmVkIGJ1dCBJUyAoZXZlbiBmb3Igbm9uLU1NWCB2ZXJzaW9ucykKKworICAgIC8vIE5PVEU6IHRoZSArMyBpcyBmb3IgdGhlIE1NWCgrMSkgLyBTU0UoKzMpIHNjYWxlciB3aGljaCByZWFkcyBvdmVyIHRoZSBlbmQKKyAgICBGRl9BTExPQ19BUlJBWV9PUl9HT1RPKE5VTEwsICpmaWx0ZXJQb3MsIChkc3RXICsgMyksIHNpemVvZigqKmZpbHRlclBvcyksIGZhaWwpOworCisgICAgaWYgKEZGQUJTKHhJbmMgLSAweDEwMDAwKSA8IDEwICYmIHNyY1BvcyA9PSBkc3RQb3MpIHsgLy8gdW5zY2FsZWQKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZpbHRlclNpemUgPSAxOworICAgICAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhOVUxMLCBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFcsIHNpemVvZigqZmlsdGVyKSAqIGZpbHRlclNpemUsIGZhaWwpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkc3RXOyBpKyspIHsKKyAgICAgICAgICAgIGZpbHRlcltpICogZmlsdGVyU2l6ZV0gPSBmb25lOworICAgICAgICAgICAgKCpmaWx0ZXJQb3MpW2ldICAgICAgICA9IGk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZsYWdzICYgU1dTX1BPSU5UKSB7IC8vIGxhbWUgbG9va2luZyBwb2ludCBzYW1wbGluZyBtb2RlCisgICAgICAgIGludCBpOworICAgICAgICBpbnQ2NF90IHhEc3RJblNyYzsKKyAgICAgICAgZmlsdGVyU2l6ZSA9IDE7CisgICAgICAgIEZGX0FMTE9DX0FSUkFZX09SX0dPVE8oTlVMTCwgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFcsIHNpemVvZigqZmlsdGVyKSAqIGZpbHRlclNpemUsIGZhaWwpOworCisgICAgICAgIHhEc3RJblNyYyA9ICgoZHN0UG9zKihpbnQ2NF90KXhJbmMpPj44KSAtICgoc3JjUG9zKjB4ODAwMExMKT4+Nyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkc3RXOyBpKyspIHsKKyAgICAgICAgICAgIGludCB4eCA9ICh4RHN0SW5TcmMgLSAoKGZpbHRlclNpemUgLSAxKSA8PCAxNSkgKyAoMSA8PCAxNSkpID4+IDE2OworCisgICAgICAgICAgICAoKmZpbHRlclBvcylbaV0gPSB4eDsKKyAgICAgICAgICAgIGZpbHRlcltpXSAgICAgICA9IGZvbmU7CisgICAgICAgICAgICB4RHN0SW5TcmMgICAgICArPSB4SW5jOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgoeEluYyA8PSAoMSA8PCAxNikgJiYgKGZsYWdzICYgU1dTX0FSRUEpKSB8fAorICAgICAgICAgICAgICAgKGZsYWdzICYgU1dTX0ZBU1RfQklMSU5FQVIpKSB7IC8vIGJpbGluZWFyIHVwc2NhbGUKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludDY0X3QgeERzdEluU3JjOworICAgICAgICBmaWx0ZXJTaXplID0gMjsKKyAgICAgICAgRkZfQUxMT0NfQVJSQVlfT1JfR09UTyhOVUxMLCBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Vywgc2l6ZW9mKCpmaWx0ZXIpICogZmlsdGVyU2l6ZSwgZmFpbCk7CisKKyAgICAgICAgeERzdEluU3JjID0gKChkc3RQb3MqKGludDY0X3QpeEluYyk+PjgpIC0gKChzcmNQb3MqMHg4MDAwTEwpPj43KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkrKykgeworICAgICAgICAgICAgaW50IHh4ID0gKHhEc3RJblNyYyAtICgoZmlsdGVyU2l6ZSAtIDEpIDw8IDE1KSArICgxIDw8IDE1KSkgPj4gMTY7CisgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgKCpmaWx0ZXJQb3MpW2ldID0geHg7CisgICAgICAgICAgICAvLyBiaWxpbmVhciB1cHNjYWxlIC8gbGluZWFyIGludGVycG9sYXRlIC8gYXJlYSBhdmVyYWdpbmcKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmaWx0ZXJTaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGNvZWZmPSBmb25lIC0gRkZBQlMoKChpbnQ2NF90KXh4PDwxNikgLSB4RHN0SW5TcmMpKihmb25lPj4xNik7CisgICAgICAgICAgICAgICAgaWYgKGNvZWZmIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgPSAwOworICAgICAgICAgICAgICAgIGZpbHRlcltpICogZmlsdGVyU2l6ZSArIGpdID0gY29lZmY7CisgICAgICAgICAgICAgICAgeHgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHhEc3RJblNyYyArPSB4SW5jOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCB4RHN0SW5TcmM7CisgICAgICAgIGludCBzaXplRmFjdG9yID0gLTE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHNjYWxlX2FsZ29yaXRobXMpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIHNjYWxlX2FsZ29yaXRobXNbaV0uZmxhZyAmJiBzY2FsZV9hbGdvcml0aG1zW2ldLnNpemVfZmFjdG9yID4gMCkgeworICAgICAgICAgICAgICAgIHNpemVGYWN0b3IgPSBzY2FsZV9hbGdvcml0aG1zW2ldLnNpemVfZmFjdG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmbGFncyAmIFNXU19MQU5DWk9TKQorICAgICAgICAgICAgc2l6ZUZhY3RvciA9IHBhcmFtWzBdICE9IFNXU19QQVJBTV9ERUZBVUxUID8gY2VpbCgyICogcGFyYW1bMF0pIDogNjsKKyAgICAgICAgYXZfYXNzZXJ0MChzaXplRmFjdG9yID4gMCk7CisKKyAgICAgICAgaWYgKHhJbmMgPD0gMSA8PCAxNikKKyAgICAgICAgICAgIGZpbHRlclNpemUgPSAxICsgc2l6ZUZhY3RvcjsgICAgLy8gdXBzY2FsZQorICAgICAgICBlbHNlCisgICAgICAgICAgICBmaWx0ZXJTaXplID0gMSArIChzaXplRmFjdG9yICogc3JjVyArIGRzdFcgLSAxKSAvIGRzdFc7CisKKyAgICAgICAgZmlsdGVyU2l6ZSA9IEZGTUlOKGZpbHRlclNpemUsIHNyY1cgLSAyKTsKKyAgICAgICAgZmlsdGVyU2l6ZSA9IEZGTUFYKGZpbHRlclNpemUsIDEpOworCisgICAgICAgIEZGX0FMTE9DX0FSUkFZX09SX0dPVE8oTlVMTCwgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFcsIHNpemVvZigqZmlsdGVyKSAqIGZpbHRlclNpemUsIGZhaWwpOworCisgICAgICAgIHhEc3RJblNyYyA9ICgoZHN0UG9zKihpbnQ2NF90KXhJbmMpPj43KSAtICgoc3JjUG9zKjB4MTAwMDBMTCk+PjcpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgeHggPSAoeERzdEluU3JjIC0gKChpbnQ2NF90KShmaWx0ZXJTaXplIC0gMikgPDwgMTYpKSAvICgxIDw8IDE3KTsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgKCpmaWx0ZXJQb3MpW2ldID0geHg7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBkID0gKEZGQUJTKCgoaW50NjRfdCl4eCA8PCAxNykgLSB4RHN0SW5TcmMpKSA8PCAxMzsKKyAgICAgICAgICAgICAgICBkb3VibGUgZmxvYXRkOworICAgICAgICAgICAgICAgIGludDY0X3QgY29lZmY7CisKKyAgICAgICAgICAgICAgICBpZiAoeEluYyA+IDEgPDwgMTYpCisgICAgICAgICAgICAgICAgICAgIGQgPSBkICogZHN0VyAvIHNyY1c7CisgICAgICAgICAgICAgICAgZmxvYXRkID0gZCAqICgxLjAgLyAoMSA8PCAzMCkpOworCisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgU1dTX0JJQ1VCSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBCID0gKHBhcmFtWzBdICE9IFNXU19QQVJBTV9ERUZBVUxUID8gcGFyYW1bMF0gOiAgIDApICogKDEgPDwgMjQpOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IEMgPSAocGFyYW1bMV0gIT0gU1dTX1BBUkFNX0RFRkFVTFQgPyBwYXJhbVsxXSA6IDAuNikgKiAoMSA8PCAyNCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQgPj0gMUxMIDw8IDMxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZiA9IDAuMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGQgID0gKGQgICogZCkgPj4gMzA7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRkZCA9IChkZCAqIGQpID4+IDMwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IDFMTCA8PCAzMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZiA9ICAoMTIgKiAoMSA8PCAyNCkgLSAgOSAqIEIgLSA2ICogQykgKiBkZGQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xOCAqICgxIDw8IDI0KSArIDEyICogQiArIDYgKiBDKSAqICBkZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg2ICogKDEgPDwgMjQpIC0gIDIgKiBCKSAgICAgICAgICogKDEgPDwgMzApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gICAgICAoLUIgLSAgNiAqIEMpICogZGRkICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYgKiBCICsgMzAgKiBDKSAqIGRkICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEyICogQiAtIDQ4ICogQykgKiBkICAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCAqIEIgKyAyNCAqIEMpICogKDEgPDwgMzApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvZWZmIC89ICgxTEw8PDU0KS9mb25lOworICAgICAgICAgICAgICAgIH0KKyNpZiAwCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBTV1NfWCkgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgcCAgPSBwYXJhbSA/IHBhcmFtICogMC4wMSA6IDAuMzsKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgICAgID0gZCA/IHNpbihkICogTV9QSSkgLyAoZCAqIE1fUEkpIDogMS4wOworICAgICAgICAgICAgICAgICAgICBjb2VmZiAgICAqPSBwb3coMi4wLCAtcCAqIGQgKiBkKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmbGFncyAmIFNXU19YKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBBID0gcGFyYW1bMF0gIT0gU1dTX1BBUkFNX0RFRkFVTFQgPyBwYXJhbVswXSA6IDEuMDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0ZCA8IDEuMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjb3MoZmxvYXRkICogTV9QSSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAtMS4wOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA8IDAuMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAtcG93KC1jLCBBKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHBvdyhjLCBBKTsKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgPSAoYyAqIDAuNSArIDAuNSkgKiBmb25lOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBTV1NfQVJFQSkgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGQyID0gZCAtICgxIDw8IDI5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQyICogeEluYyA8IC0oMUxMIDw8ICgyOSArIDE2KSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZiA9IDEuMCAqICgxTEwgPDwgKDMwICsgMTYpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDIgKiB4SW5jIDwgKDFMTCA8PCAoMjkgKyAxNikpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgPSAtZDIgKiB4SW5jICsgKDFMTCA8PCAoMjkgKyAxNikpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZiA9IDAuMDsKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gZm9uZSA+PiAoMzAgKyAxNik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIFNXU19HQVVTUykgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgcCA9IHBhcmFtWzBdICE9IFNXU19QQVJBTV9ERUZBVUxUID8gcGFyYW1bMF0gOiAzLjA7CisgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gKHBvdygyLjAsIC1wICogZmxvYXRkICogZmxvYXRkKSkgKiBmb25lOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBTV1NfU0lOQykgeworICAgICAgICAgICAgICAgICAgICBjb2VmZiA9IChkID8gc2luKGZsb2F0ZCAqIE1fUEkpIC8gKGZsb2F0ZCAqIE1fUEkpIDogMS4wKSAqIGZvbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIFNXU19MQU5DWk9TKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwID0gcGFyYW1bMF0gIT0gU1dTX1BBUkFNX0RFRkFVTFQgPyBwYXJhbVswXSA6IDMuMDsKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgPSAoZCA/IHNpbihmbG9hdGQgKiBNX1BJKSAqIHNpbihmbG9hdGQgKiBNX1BJIC8gcCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXRkICogZmxvYXRkICogTV9QSSAqIE1fUEkgLyBwKSA6IDEuMCkgKiBmb25lOworICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRkID4gcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgU1dTX0JJTElORUFSKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gKDEgPDwgMzApIC0gZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZWZmIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gZm9uZSA+PiAzMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgU1dTX1NQTElORSkgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgcCA9IC0yLjE5NjE1MjQyMjcwNjYzMjsKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgPSBnZXRTcGxpbmVDb2VmZigxLjAsIDAuMCwgcCwgLXAgLSAxLjAsIGZsb2F0ZCkgKiBmb25lOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmlsdGVyW2kgKiBmaWx0ZXJTaXplICsgal0gPSBjb2VmZjsKKyAgICAgICAgICAgICAgICB4eCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeERzdEluU3JjICs9IDIgKiB4SW5jOworICAgICAgICB9CisgICAgfQorCisgICAgLyogYXBwbHkgc3JjICYgZHN0IEZpbHRlciB0byBmaWx0ZXIgLT4gZmlsdGVyMgorICAgICAqIGF2X2ZyZWUoZmlsdGVyKTsKKyAgICAgKi8KKyAgICBhdl9hc3NlcnQwKGZpbHRlclNpemUgPiAwKTsKKyAgICBmaWx0ZXIyU2l6ZSA9IGZpbHRlclNpemU7CisgICAgaWYgKHNyY0ZpbHRlcikKKyAgICAgICAgZmlsdGVyMlNpemUgKz0gc3JjRmlsdGVyLT5sZW5ndGggLSAxOworICAgIGlmIChkc3RGaWx0ZXIpCisgICAgICAgIGZpbHRlcjJTaXplICs9IGRzdEZpbHRlci0+bGVuZ3RoIC0gMTsKKyAgICBhdl9hc3NlcnQwKGZpbHRlcjJTaXplID4gMCk7CisgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oTlVMTCwgZmlsdGVyMiwgZHN0VywgZmlsdGVyMlNpemUgKiBzaXplb2YoKmZpbHRlcjIpLCBmYWlsKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkc3RXOyBpKyspIHsKKyAgICAgICAgaW50IGosIGs7CisKKyAgICAgICAgaWYgKHNyY0ZpbHRlcikgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNyY0ZpbHRlci0+bGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyU2l6ZTsgaisrKQorICAgICAgICAgICAgICAgICAgICBmaWx0ZXIyW2kgKiBmaWx0ZXIyU2l6ZSArIGsgKyBqXSArPQorICAgICAgICAgICAgICAgICAgICAgICAgc3JjRmlsdGVyLT5jb2VmZltrXSAqIGZpbHRlcltpICogZmlsdGVyU2l6ZSArIGpdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpbHRlclNpemU7IGorKykKKyAgICAgICAgICAgICAgICBmaWx0ZXIyW2kgKiBmaWx0ZXIyU2l6ZSArIGpdID0gZmlsdGVyW2kgKiBmaWx0ZXJTaXplICsgal07CisgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUUgZHN0RmlsdGVyCisKKyAgICAgICAgKCpmaWx0ZXJQb3MpW2ldICs9IChmaWx0ZXJTaXplIC0gMSkgLyAyIC0gKGZpbHRlcjJTaXplIC0gMSkgLyAyOworICAgIH0KKyAgICBhdl9mcmVlcCgmZmlsdGVyKTsKKworICAgIC8qIHRyeSB0byByZWR1Y2UgdGhlIGZpbHRlci1zaXplIChzdGVwMSBmaW5kIHNpemUgYW5kIHNoaWZ0IGxlZnQpICovCisgICAgLy8gQXNzdW1lIGl0IGlzIG5lYXIgbm9ybWFsaXplZCAoKjAuNSBvciAqMi4wIGlzIE9LIGJ1dCAqIDAuMDAxIGlzIG5vdCkuCisgICAgbWluRmlsdGVyU2l6ZSA9IDA7CisgICAgZm9yIChpID0gZHN0VyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGludCBtaW4gPSBmaWx0ZXIyU2l6ZTsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGludDY0X3QgY3V0T2ZmID0gMC4wOworCisgICAgICAgIC8qIGdldCByaWQgb2YgbmVhciB6ZXJvIGVsZW1lbnRzIG9uIHRoZSBsZWZ0IGJ5IHNoaWZ0aW5nIGxlZnQgKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpbHRlcjJTaXplOyBqKyspIHsKKyAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgY3V0T2ZmICs9IEZGQUJTKGZpbHRlcjJbaSAqIGZpbHRlcjJTaXplXSk7CisKKyAgICAgICAgICAgIGlmIChjdXRPZmYgPiBTV1NfTUFYX1JFRFVDRV9DVVRPRkYgKiBmb25lKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBwcmVzZXJ2ZSBtb25vdG9uaWNpdHkgYmVjYXVzZSB0aGUgY29yZSBjYW4ndCBoYW5kbGUgdGhlCisgICAgICAgICAgICAgKiBmaWx0ZXIgb3RoZXJ3aXNlICovCisgICAgICAgICAgICBpZiAoaSA8IGRzdFcgLSAxICYmICgqZmlsdGVyUG9zKVtpXSA+PSAoKmZpbHRlclBvcylbaSArIDFdKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBtb3ZlIGZpbHRlciBjb2VmZmljaWVudHMgbGVmdAorICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IGZpbHRlcjJTaXplOyBrKyspCisgICAgICAgICAgICAgICAgZmlsdGVyMltpICogZmlsdGVyMlNpemUgKyBrIC0gMV0gPSBmaWx0ZXIyW2kgKiBmaWx0ZXIyU2l6ZSArIGtdOworICAgICAgICAgICAgZmlsdGVyMltpICogZmlsdGVyMlNpemUgKyBrIC0gMV0gPSAwOworICAgICAgICAgICAgKCpmaWx0ZXJQb3MpW2ldKys7CisgICAgICAgIH0KKworICAgICAgICBjdXRPZmYgPSAwOworICAgICAgICAvKiBjb3VudCBuZWFyIHplcm9zIG9uIHRoZSByaWdodCAqLworICAgICAgICBmb3IgKGogPSBmaWx0ZXIyU2l6ZSAtIDE7IGogPiAwOyBqLS0pIHsKKyAgICAgICAgICAgIGN1dE9mZiArPSBGRkFCUyhmaWx0ZXIyW2kgKiBmaWx0ZXIyU2l6ZSArIGpdKTsKKworICAgICAgICAgICAgaWYgKGN1dE9mZiA+IFNXU19NQVhfUkVEVUNFX0NVVE9GRiAqIGZvbmUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtaW4tLTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtaW4gPiBtaW5GaWx0ZXJTaXplKQorICAgICAgICAgICAgbWluRmlsdGVyU2l6ZSA9IG1pbjsKKyAgICB9CisKKyAgICBpZiAoUFBDX0FMVElWRUMoY3B1X2ZsYWdzKSkgeworICAgICAgICAvLyB3ZSBjYW4gaGFuZGxlIHRoZSBzcGVjaWFsIGNhc2UgNCwgc28gd2UgZG9uJ3Qgd2FudCB0byBnbyB0aGUgZnVsbCA4CisgICAgICAgIGlmIChtaW5GaWx0ZXJTaXplIDwgNSkKKyAgICAgICAgICAgIGZpbHRlckFsaWduID0gNDsKKworICAgICAgICAvKiBXZSByZWFsbHkgZG9uJ3Qgd2FudCB0byB3YXN0ZSBvdXIgdGltZSBkb2luZyB1c2VsZXNzIGNvbXB1dGF0aW9uLCBzbworICAgICAgICAgKiBmYWxsIGJhY2sgb24gdGhlIHNjYWxhciBDIGNvZGUgZm9yIHZlcnkgc21hbGwgZmlsdGVycy4KKyAgICAgICAgICogVmVjdG9yaXppbmcgaXMgd29ydGggaXQgb25seSBpZiB5b3UgaGF2ZSBhIGRlY2VudC1zaXplZCB2ZWN0b3IuICovCisgICAgICAgIGlmIChtaW5GaWx0ZXJTaXplIDwgMykKKyAgICAgICAgICAgIGZpbHRlckFsaWduID0gMTsKKyAgICB9CisKKyAgICBpZiAoSEFWRV9NTVggJiYgY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfTU1YKSB7CisgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5zY2FsZWQgdmVydGljYWwgZmlsdGVyaW5nCisgICAgICAgIGlmIChtaW5GaWx0ZXJTaXplID09IDEgJiYgZmlsdGVyQWxpZ24gPT0gMikKKyAgICAgICAgICAgIGZpbHRlckFsaWduID0gMTsKKyAgICB9CisKKyAgICBhdl9hc3NlcnQwKG1pbkZpbHRlclNpemUgPiAwKTsKKyAgICBmaWx0ZXJTaXplID0gKG1pbkZpbHRlclNpemUgKyAoZmlsdGVyQWxpZ24gLSAxKSkgJiAofihmaWx0ZXJBbGlnbiAtIDEpKTsKKyAgICBhdl9hc3NlcnQwKGZpbHRlclNpemUgPiAwKTsKKyAgICBmaWx0ZXIgPSBhdl9tYWxsb2NfYXJyYXkoZHN0VywgZmlsdGVyU2l6ZSAqIHNpemVvZigqZmlsdGVyKSk7CisgICAgaWYgKCFmaWx0ZXIpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoZmlsdGVyU2l6ZSA+PSBNQVhfRklMVEVSX1NJWkUgKiAxNiAvCisgICAgICAgICAgICAgICAgICAgICAgKChmbGFncyAmIFNXU19BQ0NVUkFURV9STkQpID8gQVBDS19TSVpFIDogMTYpKSB7CisgICAgICAgIHJldCA9IFJFVENPREVfVVNFX0NBU0NBREU7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgKm91dEZpbHRlclNpemUgPSBmaWx0ZXJTaXplOworCisgICAgaWYgKGZsYWdzICYgU1dTX1BSSU5UX0lORk8pCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgICAgICJTd1NjYWxlcjogcmVkdWNpbmcgLyBhbGlnbmluZyBmaWx0ZXJzaXplICVkIC0+ICVkXG4iLAorICAgICAgICAgICAgICAgZmlsdGVyMlNpemUsIGZpbHRlclNpemUpOworICAgIC8qIHRyeSB0byByZWR1Y2UgdGhlIGZpbHRlci1zaXplIChzdGVwMiByZWR1Y2UgaXQpICovCisgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkrKykgeworICAgICAgICBpbnQgajsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICBpZiAoaiA+PSBmaWx0ZXIyU2l6ZSkKKyAgICAgICAgICAgICAgICBmaWx0ZXJbaSAqIGZpbHRlclNpemUgKyBqXSA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmlsdGVyW2kgKiBmaWx0ZXJTaXplICsgal0gPSBmaWx0ZXIyW2kgKiBmaWx0ZXIyU2l6ZSArIGpdOworICAgICAgICAgICAgaWYgKChmbGFncyAmIFNXU19CSVRFWEFDVCkgJiYgaiA+PSBtaW5GaWx0ZXJTaXplKQorICAgICAgICAgICAgICAgIGZpbHRlcltpICogZmlsdGVyU2l6ZSArIGpdID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZJWE1FIHRyeSB0byBhbGlnbiBmaWx0ZXJQb3MgaWYgcG9zc2libGUKKworICAgIC8vIGZpeCBib3JkZXJzCisgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkrKykgeworICAgICAgICBpbnQgajsKKyAgICAgICAgaWYgKCgqZmlsdGVyUG9zKVtpXSA8IDApIHsKKyAgICAgICAgICAgIC8vIG1vdmUgZmlsdGVyIGNvZWZmaWNpZW50cyBsZWZ0IHRvIGNvbXBlbnNhdGUgZm9yIGZpbHRlclBvcworICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IGZpbHRlclNpemU7IGorKykgeworICAgICAgICAgICAgICAgIGludCBsZWZ0ID0gRkZNQVgoaiArICgqZmlsdGVyUG9zKVtpXSwgMCk7CisgICAgICAgICAgICAgICAgZmlsdGVyW2kgKiBmaWx0ZXJTaXplICsgbGVmdF0gKz0gZmlsdGVyW2kgKiBmaWx0ZXJTaXplICsgal07CisgICAgICAgICAgICAgICAgZmlsdGVyW2kgKiBmaWx0ZXJTaXplICsgal0gICAgID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqZmlsdGVyUG9zKVtpXT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKmZpbHRlclBvcylbaV0gKyBmaWx0ZXJTaXplID4gc3JjVykgeworICAgICAgICAgICAgaW50IHNoaWZ0ID0gKCpmaWx0ZXJQb3MpW2ldICsgZmlsdGVyU2l6ZSAtIHNyY1c7CisgICAgICAgICAgICAvLyBtb3ZlIGZpbHRlciBjb2VmZmljaWVudHMgcmlnaHQgdG8gY29tcGVuc2F0ZSBmb3IgZmlsdGVyUG9zCisgICAgICAgICAgICBmb3IgKGogPSBmaWx0ZXJTaXplIC0gMjsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICBpbnQgcmlnaHQgPSBGRk1JTihqICsgc2hpZnQsIGZpbHRlclNpemUgLSAxKTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJbaSAqIGZpbHRlclNpemUgKyByaWdodF0gKz0gZmlsdGVyW2kgKiBmaWx0ZXJTaXplICsgal07CisgICAgICAgICAgICAgICAgZmlsdGVyW2kgKiBmaWx0ZXJTaXplICsgal0gICAgICA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKmZpbHRlclBvcylbaV09IHNyY1cgLSBmaWx0ZXJTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm90ZSB0aGUgKzEgaXMgZm9yIHRoZSBNTVggc2NhbGVyIHdoaWNoIHJlYWRzIG92ZXIgdGhlIGVuZAorICAgIC8qIGFsaWduIGF0IDE2IGZvciBBbHRpVmVjIChuZWVkZWQgYnkgaFNjYWxlX2FsdGl2ZWNfcmVhbCkgKi8KKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhOVUxMLCAqb3V0RmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkc3RXICsgMyksICpvdXRGaWx0ZXJTaXplICogc2l6ZW9mKGludDE2X3QpLCBmYWlsKTsKKworICAgIC8qIG5vcm1hbGl6ZSAmIHN0b3JlIGluIG91dEZpbHRlciAqLworICAgIGZvciAoaSA9IDA7IGkgPCBkc3RXOyBpKyspIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGludDY0X3QgZXJyb3IgPSAwOworICAgICAgICBpbnQ2NF90IHN1bSAgID0gMDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICBzdW0gKz0gZmlsdGVyW2kgKiBmaWx0ZXJTaXplICsgal07CisgICAgICAgIH0KKyAgICAgICAgc3VtID0gKHN1bSArIG9uZSAvIDIpIC8gb25lOworICAgICAgICBpZiAoIXN1bSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiU3dTY2FsZXI6IHplcm8gdmVjdG9yIGluIHNjYWxpbmdcbiIpOworICAgICAgICAgICAgc3VtID0gMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgKm91dEZpbHRlclNpemU7IGorKykgeworICAgICAgICAgICAgaW50NjRfdCB2ID0gZmlsdGVyW2kgKiBmaWx0ZXJTaXplICsgal0gKyBlcnJvcjsKKyAgICAgICAgICAgIGludCBpbnRWICA9IFJPVU5ERURfRElWKHYsIHN1bSk7CisgICAgICAgICAgICAoKm91dEZpbHRlcilbaSAqICgqb3V0RmlsdGVyU2l6ZSkgKyBqXSA9IGludFY7CisgICAgICAgICAgICBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHYgLSBpbnRWICogc3VtOworICAgICAgICB9CisgICAgfQorCisgICAgKCpmaWx0ZXJQb3MpW2RzdFcgKyAwXSA9CisgICAgKCpmaWx0ZXJQb3MpW2RzdFcgKyAxXSA9CisgICAgKCpmaWx0ZXJQb3MpW2RzdFcgKyAyXSA9ICgqZmlsdGVyUG9zKVtkc3RXIC0gMV07IC8qIHRoZSBNTVgvU1NFIHNjYWxlciB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlYWQgb3ZlciB0aGUgZW5kICovCisgICAgZm9yIChpID0gMDsgaSA8ICpvdXRGaWx0ZXJTaXplOyBpKyspIHsKKyAgICAgICAgaW50IGsgPSAoZHN0VyAtIDEpICogKCpvdXRGaWx0ZXJTaXplKSArIGk7CisgICAgICAgICgqb3V0RmlsdGVyKVtrICsgMSAqICgqb3V0RmlsdGVyU2l6ZSldID0KKyAgICAgICAgKCpvdXRGaWx0ZXIpW2sgKyAyICogKCpvdXRGaWx0ZXJTaXplKV0gPQorICAgICAgICAoKm91dEZpbHRlcilbayArIDMgKiAoKm91dEZpbHRlclNpemUpXSA9ICgqb3V0RmlsdGVyKVtrXTsKKyAgICB9CisKKyAgICByZXQgPSAwOworCitmYWlsOgorICAgIGlmKHJldCA8IDApCisgICAgICAgIGF2X2xvZyhOVUxMLCByZXQgPT0gUkVUQ09ERV9VU0VfQ0FTQ0FERSA/IEFWX0xPR19ERUJVRyA6IEFWX0xPR19FUlJPUiwgInN3czogaW5pdEZpbHRlciBmYWlsZWRcbiIpOworICAgIGF2X2ZyZWUoZmlsdGVyKTsKKyAgICBhdl9mcmVlKGZpbHRlcjIpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfcmdiMnl1dl90YWJsZShTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQgdGFibGVbNF0sIGludCBkc3RSYW5nZSkKK3sKKyAgICBpbnQ2NF90IFcsIFYsIFosIEN5LCBDdSwgQ3Y7CisgICAgaW50NjRfdCB2ciA9ICB0YWJsZVswXTsKKyAgICBpbnQ2NF90IHViID0gIHRhYmxlWzFdOworICAgIGludDY0X3QgdWcgPSAtdGFibGVbMl07CisgICAgaW50NjRfdCB2ZyA9IC10YWJsZVszXTsKKyAgICBpbnQ2NF90IE9ORSA9IDY1NTM2OworICAgIGludDY0X3QgY3kgPSBPTkU7CisgICAgdWludDhfdCAqcCA9ICh1aW50OF90KiljLT5pbnB1dF9yZ2IyeXV2X3RhYmxlOworICAgIGludCBpOworICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgbWFwW10gPSB7CisgICAgQllfSURYLCBHWV9JRFgsIC0xICAgICwgQllfSURYLCBCWV9JRFgsIEdZX0lEWCwgLTEgICAgLCBCWV9JRFgsCisgICAgUllfSURYLCAtMSAgICAsIEdZX0lEWCwgUllfSURYLCBSWV9JRFgsIC0xICAgICwgR1lfSURYLCBSWV9JRFgsCisgICAgUllfSURYLCBHWV9JRFgsIC0xICAgICwgUllfSURYLCBSWV9JRFgsIEdZX0lEWCwgLTEgICAgLCBSWV9JRFgsCisgICAgQllfSURYLCAtMSAgICAsIEdZX0lEWCwgQllfSURYLCBCWV9JRFgsIC0xICAgICwgR1lfSURYLCBCWV9JRFgsCisgICAgQlVfSURYLCBHVV9JRFgsIC0xICAgICwgQlVfSURYLCBCVV9JRFgsIEdVX0lEWCwgLTEgICAgLCBCVV9JRFgsCisgICAgUlVfSURYLCAtMSAgICAsIEdVX0lEWCwgUlVfSURYLCBSVV9JRFgsIC0xICAgICwgR1VfSURYLCBSVV9JRFgsCisgICAgUlVfSURYLCBHVV9JRFgsIC0xICAgICwgUlVfSURYLCBSVV9JRFgsIEdVX0lEWCwgLTEgICAgLCBSVV9JRFgsCisgICAgQlVfSURYLCAtMSAgICAsIEdVX0lEWCwgQlVfSURYLCBCVV9JRFgsIC0xICAgICwgR1VfSURYLCBCVV9JRFgsCisgICAgQlZfSURYLCBHVl9JRFgsIC0xICAgICwgQlZfSURYLCBCVl9JRFgsIEdWX0lEWCwgLTEgICAgLCBCVl9JRFgsCisgICAgUlZfSURYLCAtMSAgICAsIEdWX0lEWCwgUlZfSURYLCBSVl9JRFgsIC0xICAgICwgR1ZfSURYLCBSVl9JRFgsCisgICAgUlZfSURYLCBHVl9JRFgsIC0xICAgICwgUlZfSURYLCBSVl9JRFgsIEdWX0lEWCwgLTEgICAgLCBSVl9JRFgsCisgICAgQlZfSURYLCAtMSAgICAsIEdWX0lEWCwgQlZfSURYLCBCVl9JRFgsIC0xICAgICwgR1ZfSURYLCBCVl9JRFgsCisgICAgUllfSURYLCBCWV9JRFgsIFJZX0lEWCwgQllfSURYLCBSWV9JRFgsIEJZX0lEWCwgUllfSURYLCBCWV9JRFgsCisgICAgQllfSURYLCBSWV9JRFgsIEJZX0lEWCwgUllfSURYLCBCWV9JRFgsIFJZX0lEWCwgQllfSURYLCBSWV9JRFgsCisgICAgR1lfSURYLCAtMSAgICAsIEdZX0lEWCwgLTEgICAgLCBHWV9JRFgsIC0xICAgICwgR1lfSURYLCAtMSAgICAsCisgICAgLTEgICAgLCBHWV9JRFgsIC0xICAgICwgR1lfSURYLCAtMSAgICAsIEdZX0lEWCwgLTEgICAgLCBHWV9JRFgsCisgICAgUlVfSURYLCBCVV9JRFgsIFJVX0lEWCwgQlVfSURYLCBSVV9JRFgsIEJVX0lEWCwgUlVfSURYLCBCVV9JRFgsCisgICAgQlVfSURYLCBSVV9JRFgsIEJVX0lEWCwgUlVfSURYLCBCVV9JRFgsIFJVX0lEWCwgQlVfSURYLCBSVV9JRFgsCisgICAgR1VfSURYLCAtMSAgICAsIEdVX0lEWCwgLTEgICAgLCBHVV9JRFgsIC0xICAgICwgR1VfSURYLCAtMSAgICAsCisgICAgLTEgICAgLCBHVV9JRFgsIC0xICAgICwgR1VfSURYLCAtMSAgICAsIEdVX0lEWCwgLTEgICAgLCBHVV9JRFgsCisgICAgUlZfSURYLCBCVl9JRFgsIFJWX0lEWCwgQlZfSURYLCBSVl9JRFgsIEJWX0lEWCwgUlZfSURYLCBCVl9JRFgsCisgICAgQlZfSURYLCBSVl9JRFgsIEJWX0lEWCwgUlZfSURYLCBCVl9JRFgsIFJWX0lEWCwgQlZfSURYLCBSVl9JRFgsCisgICAgR1ZfSURYLCAtMSAgICAsIEdWX0lEWCwgLTEgICAgLCBHVl9JRFgsIC0xICAgICwgR1ZfSURYLCAtMSAgICAsCisgICAgLTEgICAgLCBHVl9JRFgsIC0xICAgICwgR1ZfSURYLCAtMSAgICAsIEdWX0lEWCwgLTEgICAgLCBHVl9JRFgsIC8vMjMKKyAgICAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLy8yNAorICAgIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAvLzI1CisgICAgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC8vMjYKKyAgICAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLy8yNworICAgIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAvLzI4CisgICAgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC8vMjkKKyAgICAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLy8zMAorICAgIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAvLzMxCisgICAgQllfSURYLCBHWV9JRFgsIFJZX0lEWCwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC8vMzIKKyAgICBCVV9JRFgsIEdVX0lEWCwgUlVfSURYLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLy8zMworICAgIEJWX0lEWCwgR1ZfSURYLCBSVl9JRFgsIC0xICAgICwgLTEgICAgLCAtMSAgICAsIC0xICAgICwgLTEgICAgLCAvLzM0CisgICAgfTsKKworICAgIGRzdFJhbmdlID0gMDsgLy9GSVhNRSByYW5nZSA9IDEgaXMgaGFuZGxlZCBlbHNld2hlcmUKKworICAgIGlmICghZHN0UmFuZ2UpIHsKKyAgICAgICAgY3kgPSBjeSAqIDI1NSAvIDIxOTsKKyAgICB9IGVsc2UgeworICAgICAgICB2ciA9IHZyICogMjI0IC8gMjU1OworICAgICAgICB1YiA9IHViICogMjI0IC8gMjU1OworICAgICAgICB1ZyA9IHVnICogMjI0IC8gMjU1OworICAgICAgICB2ZyA9IHZnICogMjI0IC8gMjU1OworICAgIH0KKyAgICBXID0gUk9VTkRFRF9ESVYoT05FKk9ORSp1ZywgdWIpOworICAgIFYgPSBST1VOREVEX0RJVihPTkUqT05FKnZnLCB2cik7CisgICAgWiA9IE9ORSpPTkUtVy1WOworCisgICAgQ3kgPSBST1VOREVEX0RJVihjeSpaLCBPTkUpOworICAgIEN1ID0gUk9VTkRFRF9ESVYodWIqWiwgT05FKTsKKyAgICBDdiA9IFJPVU5ERURfRElWKHZyKlosIE9ORSk7CisKKyAgICBjLT5pbnB1dF9yZ2IyeXV2X3RhYmxlW1JZX0lEWF0gPSAtUk9VTkRFRF9ESVYoKDEgPDwgUkdCMllVVl9TSElGVCkqViAgICAgICAgLCBDeSk7CisgICAgYy0+aW5wdXRfcmdiMnl1dl90YWJsZVtHWV9JRFhdID0gIFJPVU5ERURfRElWKCgxIDw8IFJHQjJZVVZfU0hJRlQpKk9ORSpPTkUgICwgQ3kpOworICAgIGMtPmlucHV0X3JnYjJ5dXZfdGFibGVbQllfSURYXSA9IC1ST1VOREVEX0RJVigoMSA8PCBSR0IyWVVWX1NISUZUKSpXICAgICAgICAsIEN5KTsKKworICAgIGMtPmlucHV0X3JnYjJ5dXZfdGFibGVbUlVfSURYXSA9ICBST1VOREVEX0RJVigoMSA8PCBSR0IyWVVWX1NISUZUKSpWICAgICAgICAsIEN1KTsKKyAgICBjLT5pbnB1dF9yZ2IyeXV2X3RhYmxlW0dVX0lEWF0gPSAtUk9VTkRFRF9ESVYoKDEgPDwgUkdCMllVVl9TSElGVCkqT05FKk9ORSAgLCBDdSk7CisgICAgYy0+aW5wdXRfcmdiMnl1dl90YWJsZVtCVV9JRFhdID0gIFJPVU5ERURfRElWKCgxIDw8IFJHQjJZVVZfU0hJRlQpKihaK1cpICAgICwgQ3UpOworCisgICAgYy0+aW5wdXRfcmdiMnl1dl90YWJsZVtSVl9JRFhdID0gIFJPVU5ERURfRElWKCgxIDw8IFJHQjJZVVZfU0hJRlQpKihWK1opICAgICwgQ3YpOworICAgIGMtPmlucHV0X3JnYjJ5dXZfdGFibGVbR1ZfSURYXSA9IC1ST1VOREVEX0RJVigoMSA8PCBSR0IyWVVWX1NISUZUKSpPTkUqT05FICAsIEN2KTsKKyAgICBjLT5pbnB1dF9yZ2IyeXV2X3RhYmxlW0JWX0lEWF0gPSAgUk9VTkRFRF9ESVYoKDEgPDwgUkdCMllVVl9TSElGVCkqVyAgICAgICAgLCBDdik7CisKKyAgICBpZigvKiFkc3RSYW5nZSAmJiAqLyFtZW1jbXAodGFibGUsIGZmX3l1djJyZ2JfY29lZmZzW1NXU19DU19ERUZBVUxUXSwgc2l6ZW9mKGZmX3l1djJyZ2JfY29lZmZzW1NXU19DU19ERUZBVUxUXSkpKSB7CisgICAgICAgIGMtPmlucHV0X3JnYjJ5dXZfdGFibGVbQllfSURYXSA9ICAoKGludCkoMC4xMTQgKiAyMTkgLyAyNTUgKiAoMSA8PCBSR0IyWVVWX1NISUZUKSArIDAuNSkpOworICAgICAgICBjLT5pbnB1dF9yZ2IyeXV2X3RhYmxlW0JWX0lEWF0gPSAoLShpbnQpKDAuMDgxICogMjI0IC8gMjU1ICogKDEgPDwgUkdCMllVVl9TSElGVCkgKyAwLjUpKTsKKyAgICAgICAgYy0+aW5wdXRfcmdiMnl1dl90YWJsZVtCVV9JRFhdID0gICgoaW50KSgwLjUwMCAqIDIyNCAvIDI1NSAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSk7CisgICAgICAgIGMtPmlucHV0X3JnYjJ5dXZfdGFibGVbR1lfSURYXSA9ICAoKGludCkoMC41ODcgKiAyMTkgLyAyNTUgKiAoMSA8PCBSR0IyWVVWX1NISUZUKSArIDAuNSkpOworICAgICAgICBjLT5pbnB1dF9yZ2IyeXV2X3RhYmxlW0dWX0lEWF0gPSAoLShpbnQpKDAuNDE5ICogMjI0IC8gMjU1ICogKDEgPDwgUkdCMllVVl9TSElGVCkgKyAwLjUpKTsKKyAgICAgICAgYy0+aW5wdXRfcmdiMnl1dl90YWJsZVtHVV9JRFhdID0gKC0oaW50KSgwLjMzMSAqIDIyNCAvIDI1NSAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSk7CisgICAgICAgIGMtPmlucHV0X3JnYjJ5dXZfdGFibGVbUllfSURYXSA9ICAoKGludCkoMC4yOTkgKiAyMTkgLyAyNTUgKiAoMSA8PCBSR0IyWVVWX1NISUZUKSArIDAuNSkpOworICAgICAgICBjLT5pbnB1dF9yZ2IyeXV2X3RhYmxlW1JWX0lEWF0gPSAgKChpbnQpKDAuNTAwICogMjI0IC8gMjU1ICogKDEgPDwgUkdCMllVVl9TSElGVCkgKyAwLjUpKTsKKyAgICAgICAgYy0+aW5wdXRfcmdiMnl1dl90YWJsZVtSVV9JRFhdID0gKC0oaW50KSgwLjE2OSAqIDIyNCAvIDI1NSAqICgxIDw8IFJHQjJZVVZfU0hJRlQpICsgMC41KSk7CisgICAgfQorICAgIGZvcihpPTA7IGk8RkZfQVJSQVlfRUxFTVMobWFwKTsgaSsrKQorICAgICAgICBBVl9XTDE2KHAgKyAxNio0ICsgMippLCBtYXBbaV0gPj0gMCA/IGMtPmlucHV0X3JnYjJ5dXZfdGFibGVbbWFwW2ldXSA6IDApOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3h5enRhYmxlcyhzdHJ1Y3QgU3dzQ29udGV4dCAqYykKK3sKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgeHl6Z2FtbWEgPSBYWVpfR0FNTUE7CisgICAgZG91YmxlIHJnYmdhbW1hID0gMS4wIC8gUkdCX0dBTU1BOworICAgIGRvdWJsZSB4eXpnYW1tYWludiA9IDEuMCAvIFhZWl9HQU1NQTsKKyAgICBkb3VibGUgcmdiZ2FtbWFpbnYgPSBSR0JfR0FNTUE7CisgICAgc3RhdGljIGNvbnN0IGludDE2X3QgeHl6MnJnYl9tYXRyaXhbM11bNF0gPSB7CisgICAgICAgIHsxMzI3MCwgLTYyOTUsIC0yMDQxfSwKKyAgICAgICAgey0zOTY5LCAgNzY4MiwgICAxNzB9LAorICAgICAgICB7ICAyMjgsICAtODM1LCAgNDMyOX0gfTsKKyAgICBzdGF0aWMgY29uc3QgaW50MTZfdCByZ2IyeHl6X21hdHJpeFszXVs0XSA9IHsKKyAgICAgICAgezE2ODksIDE0NjQsICA3Mzl9LAorICAgICAgICB7IDg3MSwgMjkyOSwgIDI5Nn0sCisgICAgICAgIHsgIDc5LCAgNDg4LCAzODkxfSB9OworICAgIHN0YXRpYyBpbnQxNl90IHh5emdhbW1hX3RhYls0MDk2XSwgcmdiZ2FtbWFfdGFiWzQwOTZdLCB4eXpnYW1tYWludl90YWJbNDA5Nl0sIHJnYmdhbW1haW52X3RhYls0MDk2XTsKKworICAgIG1lbWNweShjLT54eXoycmdiX21hdHJpeCwgeHl6MnJnYl9tYXRyaXgsIHNpemVvZihjLT54eXoycmdiX21hdHJpeCkpOworICAgIG1lbWNweShjLT5yZ2IyeHl6X21hdHJpeCwgcmdiMnh5el9tYXRyaXgsIHNpemVvZihjLT5yZ2IyeHl6X21hdHJpeCkpOworICAgIGMtPnh5emdhbW1hID0geHl6Z2FtbWFfdGFiOworICAgIGMtPnJnYmdhbW1hID0gcmdiZ2FtbWFfdGFiOworICAgIGMtPnh5emdhbW1haW52ID0geHl6Z2FtbWFpbnZfdGFiOworICAgIGMtPnJnYmdhbW1haW52ID0gcmdiZ2FtbWFpbnZfdGFiOworCisgICAgaWYgKHJnYmdhbW1hX3RhYls0MDk1XSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogc2V0IGdhbW1hIHZlY3RvcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDA5NjsgaSsrKSB7CisgICAgICAgIHh5emdhbW1hX3RhYltpXSA9IGxyaW50KHBvdyhpIC8gNDA5NS4wLCB4eXpnYW1tYSkgKiA0MDk1LjApOworICAgICAgICByZ2JnYW1tYV90YWJbaV0gPSBscmludChwb3coaSAvIDQwOTUuMCwgcmdiZ2FtbWEpICogNDA5NS4wKTsKKyAgICAgICAgeHl6Z2FtbWFpbnZfdGFiW2ldID0gbHJpbnQocG93KGkgLyA0MDk1LjAsIHh5emdhbW1haW52KSAqIDQwOTUuMCk7CisgICAgICAgIHJnYmdhbW1haW52X3RhYltpXSA9IGxyaW50KHBvdyhpIC8gNDA5NS4wLCByZ2JnYW1tYWludikgKiA0MDk1LjApOworICAgIH0KK30KKworaW50IHN3c19zZXRDb2xvcnNwYWNlRGV0YWlscyhzdHJ1Y3QgU3dzQ29udGV4dCAqYywgY29uc3QgaW50IGludl90YWJsZVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1JhbmdlLCBjb25zdCBpbnQgdGFibGVbNF0sIGludCBkc3RSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3MsIGludCBjb250cmFzdCwgaW50IHNhdHVyYXRpb24pCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjX2RzdDsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2Nfc3JjOworICAgIGludCBuZWVkX3JlaW5pdCA9IDA7CisgICAgbWVtbW92ZShjLT5zcmNDb2xvcnNwYWNlVGFibGUsIGludl90YWJsZSwgc2l6ZW9mKGludCkgKiA0KTsKKyAgICBtZW1tb3ZlKGMtPmRzdENvbG9yc3BhY2VUYWJsZSwgdGFibGUsIHNpemVvZihpbnQpICogNCk7CisKKyAgICBoYW5kbGVfZm9ybWF0cyhjKTsKKyAgICBkZXNjX2RzdCA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYy0+ZHN0Rm9ybWF0KTsKKyAgICBkZXNjX3NyYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYy0+c3JjRm9ybWF0KTsKKworICAgIGlmKCFpc1lVVihjLT5kc3RGb3JtYXQpICYmICFpc0dyYXkoYy0+ZHN0Rm9ybWF0KSkKKyAgICAgICAgZHN0UmFuZ2UgPSAwOworICAgIGlmKCFpc1lVVihjLT5zcmNGb3JtYXQpICYmICFpc0dyYXkoYy0+c3JjRm9ybWF0KSkKKyAgICAgICAgc3JjUmFuZ2UgPSAwOworCisgICAgYy0+YnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CisgICAgYy0+Y29udHJhc3QgICA9IGNvbnRyYXN0OworICAgIGMtPnNhdHVyYXRpb24gPSBzYXR1cmF0aW9uOworICAgIGlmIChjLT5zcmNSYW5nZSAhPSBzcmNSYW5nZSB8fCBjLT5kc3RSYW5nZSAhPSBkc3RSYW5nZSkKKyAgICAgICAgbmVlZF9yZWluaXQgPSAxOworICAgIGMtPnNyY1JhbmdlICAgPSBzcmNSYW5nZTsKKyAgICBjLT5kc3RSYW5nZSAgID0gZHN0UmFuZ2U7CisKKyAgICAvL1RoZSBzcmNCcGMgY2hlY2sgaXMgcG9zc2libHkgd3JvbmcgYnV0IHdlIHNlZW0gdG8gbGFjayBhIGRlZmluaXRpdmUgcmVmZXJlbmNlIHRvIHRlc3QgdGhpcworICAgIC8vYW5kIHdoYXQgd2UgaGF2ZSBpbiB0aWNrZXQgMjkzOSBsb29rcyBiZXR0ZXIgd2l0aCB0aGlzIGNoZWNrCisgICAgaWYgKG5lZWRfcmVpbml0ICYmIChjLT5zcmNCcGMgPT0gOCB8fCAhaXNZVVYoYy0+c3JjRm9ybWF0KSkpCisgICAgICAgIGZmX3N3c19pbml0X3JhbmdlX2NvbnZlcnQoYyk7CisKKyAgICBpZiAoKGlzWVVWKGMtPmRzdEZvcm1hdCkgfHwgaXNHcmF5KGMtPmRzdEZvcm1hdCkpICYmIChpc1lVVihjLT5zcmNGb3JtYXQpIHx8IGlzR3JheShjLT5zcmNGb3JtYXQpKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYy0+ZHN0Rm9ybWF0QnBwID0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGRlc2NfZHN0KTsKKyAgICBjLT5zcmNGb3JtYXRCcHAgPSBhdl9nZXRfYml0c19wZXJfcGl4ZWwoZGVzY19zcmMpOworCisgICAgaWYgKCFpc1lVVihjLT5kc3RGb3JtYXQpICYmICFpc0dyYXkoYy0+ZHN0Rm9ybWF0KSkgeworICAgICAgICBmZl95dXYycmdiX2NfaW5pdF90YWJsZXMoYywgaW52X3RhYmxlLCBzcmNSYW5nZSwgYnJpZ2h0bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0LCBzYXR1cmF0aW9uKTsKKyAgICAgICAgLy8gRklYTUUgZmFjdG9yaXplCisKKyAgICAgICAgaWYgKEFSQ0hfUFBDKQorICAgICAgICAgICAgZmZfeXV2MnJnYl9pbml0X3RhYmxlc19wcGMoYywgaW52X3RhYmxlLCBicmlnaHRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhc3QsIHNhdHVyYXRpb24pOworICAgIH0KKworICAgIGZpbGxfcmdiMnl1dl90YWJsZShjLCB0YWJsZSwgZHN0UmFuZ2UpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBzd3NfZ2V0Q29sb3JzcGFjZURldGFpbHMoc3RydWN0IFN3c0NvbnRleHQgKmMsIGludCAqKmludl90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzcmNSYW5nZSwgaW50ICoqdGFibGUsIGludCAqZHN0UmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnJpZ2h0bmVzcywgaW50ICpjb250cmFzdCwgaW50ICpzYXR1cmF0aW9uKQoreworICAgIGlmICghYyApCisgICAgICAgIHJldHVybiAtMTsKKworICAgICppbnZfdGFibGUgID0gYy0+c3JjQ29sb3JzcGFjZVRhYmxlOworICAgICp0YWJsZSAgICAgID0gYy0+ZHN0Q29sb3JzcGFjZVRhYmxlOworICAgICpzcmNSYW5nZSAgID0gYy0+c3JjUmFuZ2U7CisgICAgKmRzdFJhbmdlICAgPSBjLT5kc3RSYW5nZTsKKyAgICAqYnJpZ2h0bmVzcyA9IGMtPmJyaWdodG5lc3M7CisgICAgKmNvbnRyYXN0ICAgPSBjLT5jb250cmFzdDsKKyAgICAqc2F0dXJhdGlvbiA9IGMtPnNhdHVyYXRpb247CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfanBlZyhlbnVtIEFWUGl4ZWxGb3JtYXQgKmZvcm1hdCkKK3sKKyAgICBzd2l0Y2ggKCpmb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQyMFA6CisgICAgICAgICpmb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDExUDoKKyAgICAgICAgKmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDExUDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0MjJQOgorICAgICAgICAqZm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQ0NFA6CisgICAgICAgICpmb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDQwUDoKKyAgICAgICAgKmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDQwUDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTZMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2QkU6CisgICAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCBoYW5kbGVfMGFscGhhKGVudW0gQVZQaXhlbEZvcm1hdCAqZm9ybWF0KQoreworICAgIHN3aXRjaCAoKmZvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF8wQkdSICAgIDogKmZvcm1hdCA9IEFWX1BJWF9GTVRfQUJHUiAgIDsgcmV0dXJuIDE7CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjAgICAgOiAqZm9ybWF0ID0gQVZfUElYX0ZNVF9CR1JBICAgOyByZXR1cm4gNDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfMFJHQiAgICA6ICpmb3JtYXQgPSBBVl9QSVhfRk1UX0FSR0IgICA7IHJldHVybiAxOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IwICAgIDogKmZvcm1hdCA9IEFWX1BJWF9GTVRfUkdCQSAgIDsgcmV0dXJuIDQ7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3h5eihlbnVtIEFWUGl4ZWxGb3JtYXQgKmZvcm1hdCkKK3sKKyAgICBzd2l0Y2ggKCpmb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWFlaMTJCRSA6ICpmb3JtYXQgPSBBVl9QSVhfRk1UX1JHQjQ4QkU7IHJldHVybiAxOworICAgIGNhc2UgQVZfUElYX0ZNVF9YWVoxMkxFIDogKmZvcm1hdCA9IEFWX1BJWF9GTVRfUkdCNDhMRTsgcmV0dXJuIDE7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9mb3JtYXRzKFN3c0NvbnRleHQgKmMpCit7CisgICAgYy0+c3JjMEFscGhhIHw9IGhhbmRsZV8wYWxwaGEoJmMtPnNyY0Zvcm1hdCk7CisgICAgYy0+ZHN0MEFscGhhIHw9IGhhbmRsZV8wYWxwaGEoJmMtPmRzdEZvcm1hdCk7CisgICAgYy0+c3JjWFlaICAgIHw9IGhhbmRsZV94eXooJmMtPnNyY0Zvcm1hdCk7CisgICAgYy0+ZHN0WFlaICAgIHw9IGhhbmRsZV94eXooJmMtPmRzdEZvcm1hdCk7CisgICAgaWYgKGMtPnNyY1hZWiB8fCBjLT5kc3RYWVopCisgICAgICAgIGZpbGxfeHl6dGFibGVzKGMpOworfQorCitTd3NDb250ZXh0ICpzd3NfYWxsb2NfY29udGV4dCh2b2lkKQoreworICAgIFN3c0NvbnRleHQgKmMgPSBhdl9tYWxsb2N6KHNpemVvZihTd3NDb250ZXh0KSk7CisKKyAgICBhdl9hc3NlcnQwKG9mZnNldG9mKFN3c0NvbnRleHQsIHJlZERpdGhlcikgKyBESVRIRVIzMl9JTlQgPT0gb2Zmc2V0b2YoU3dzQ29udGV4dCwgZGl0aGVyMzIpKTsKKworICAgIGlmIChjKSB7CisgICAgICAgIGMtPmF2X2NsYXNzID0gJnN3c19jb250ZXh0X2NsYXNzOworICAgICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKGMpOworICAgIH0KKworICAgIHJldHVybiBjOworfQorCithdl9jb2xkIGludCBzd3NfaW5pdF9jb250ZXh0KFN3c0NvbnRleHQgKmMsIFN3c0ZpbHRlciAqc3JjRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd3NGaWx0ZXIgKmRzdEZpbHRlcikKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgdXNlc1ZGaWx0ZXIsIHVzZXNIRmlsdGVyOworICAgIGludCB1bnNjYWxlZDsKKyAgICBTd3NGaWx0ZXIgZHVtbXlGaWx0ZXIgPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgICBpbnQgc3JjVyAgICAgICAgICAgICAgPSBjLT5zcmNXOworICAgIGludCBzcmNIICAgICAgICAgICAgICA9IGMtPnNyY0g7CisgICAgaW50IGRzdFcgICAgICAgICAgICAgID0gYy0+ZHN0VzsKKyAgICBpbnQgZHN0SCAgICAgICAgICAgICAgPSBjLT5kc3RIOworICAgIGludCBkc3Rfc3RyaWRlICAgICAgICA9IEZGQUxJR04oZHN0VyAqIHNpemVvZihpbnQxNl90KSArIDY2LCAxNik7CisgICAgaW50IGZsYWdzLCBjcHVfZmxhZ3M7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY0Zvcm1hdCA9IGMtPnNyY0Zvcm1hdDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0ID0gYy0+ZHN0Rm9ybWF0OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzY19zcmM7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjX2RzdDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKyAgICBmbGFncyAgICAgPSBjLT5mbGFnczsKKyAgICBlbW1zX2MoKTsKKyAgICBpZiAoIXJnYjE1dG8xNikKKyAgICAgICAgc3dzX3JnYjJyZ2JfaW5pdCgpOworCisgICAgdW5zY2FsZWQgPSAoc3JjVyA9PSBkc3RXICYmIHNyY0ggPT0gZHN0SCk7CisKKyAgICBjLT5zcmNSYW5nZSB8PSBoYW5kbGVfanBlZygmYy0+c3JjRm9ybWF0KTsKKyAgICBjLT5kc3RSYW5nZSB8PSBoYW5kbGVfanBlZygmYy0+ZHN0Rm9ybWF0KTsKKworICAgIGlmKHNyY0Zvcm1hdCE9Yy0+c3JjRm9ybWF0IHx8IGRzdEZvcm1hdCE9Yy0+ZHN0Rm9ybWF0KQorICAgICAgICBhdl9sb2coYywgQVZfTE9HX1dBUk5JTkcsICJkZXByZWNhdGVkIHBpeGVsIGZvcm1hdCB1c2VkLCBtYWtlIHN1cmUgeW91IGRpZCBzZXQgcmFuZ2UgY29ycmVjdGx5XG4iKTsKKworICAgIGlmICghYy0+Y29udHJhc3QgJiYgIWMtPnNhdHVyYXRpb24gJiYgIWMtPmRzdEZvcm1hdEJwcCkKKyAgICAgICAgc3dzX3NldENvbG9yc3BhY2VEZXRhaWxzKGMsIGZmX3l1djJyZ2JfY29lZmZzW1NXU19DU19ERUZBVUxUXSwgYy0+c3JjUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl95dXYycmdiX2NvZWZmc1tTV1NfQ1NfREVGQVVMVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5kc3RSYW5nZSwgMCwgMSA8PCAxNiwgMSA8PCAxNik7CisKKyAgICBoYW5kbGVfZm9ybWF0cyhjKTsKKyAgICBzcmNGb3JtYXQgPSBjLT5zcmNGb3JtYXQ7CisgICAgZHN0Rm9ybWF0ID0gYy0+ZHN0Rm9ybWF0OworICAgIGRlc2Nfc3JjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzcmNGb3JtYXQpOworICAgIGRlc2NfZHN0ID0gYXZfcGl4X2ZtdF9kZXNjX2dldChkc3RGb3JtYXQpOworCisgICAgaWYgKCEodW5zY2FsZWQgJiYgc3dzX2lzU3VwcG9ydGVkRW5kaWFubmVzc0NvbnZlcnNpb24oc3JjRm9ybWF0KSAmJgorICAgICAgICAgIGF2X3BpeF9mbXRfc3dhcF9lbmRpYW5uZXNzKHNyY0Zvcm1hdCkgPT0gZHN0Rm9ybWF0KSkgeworICAgIGlmICghc3dzX2lzU3VwcG9ydGVkSW5wdXQoc3JjRm9ybWF0KSkgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiJXMgaXMgbm90IHN1cHBvcnRlZCBhcyBpbnB1dCBwaXhlbCBmb3JtYXRcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKHNyY0Zvcm1hdCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoIXN3c19pc1N1cHBvcnRlZE91dHB1dChkc3RGb3JtYXQpKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICIlcyBpcyBub3Qgc3VwcG9ydGVkIGFzIG91dHB1dCBwaXhlbCBmb3JtYXRcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGRzdEZvcm1hdCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICB9CisKKyAgICBpID0gZmxhZ3MgJiAoU1dTX1BPSU5UICAgICAgICAgfAorICAgICAgICAgICAgICAgICBTV1NfQVJFQSAgICAgICAgICB8CisgICAgICAgICAgICAgICAgIFNXU19CSUxJTkVBUiAgICAgIHwKKyAgICAgICAgICAgICAgICAgU1dTX0ZBU1RfQklMSU5FQVIgfAorICAgICAgICAgICAgICAgICBTV1NfQklDVUJJQyAgICAgICB8CisgICAgICAgICAgICAgICAgIFNXU19YICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgU1dTX0dBVVNTICAgICAgICAgfAorICAgICAgICAgICAgICAgICBTV1NfTEFOQ1pPUyAgICAgICB8CisgICAgICAgICAgICAgICAgIFNXU19TSU5DICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgU1dTX1NQTElORSAgICAgICAgfAorICAgICAgICAgICAgICAgICBTV1NfQklDVUJMSU4pOworCisgICAgLyogcHJvdmlkZSBhIGRlZmF1bHQgc2NhbGVyIGlmIG5vdCBzZXQgYnkgY2FsbGVyICovCisgICAgaWYgKCFpKSB7CisgICAgICAgIGlmIChkc3RXIDwgc3JjVyAmJiBkc3RIIDwgc3JjSCkKKyAgICAgICAgICAgIGZsYWdzIHw9IFNXU19CSUNVQklDOworICAgICAgICBlbHNlIGlmIChkc3RXID4gc3JjVyAmJiBkc3RIID4gc3JjSCkKKyAgICAgICAgICAgIGZsYWdzIHw9IFNXU19CSUNVQklDOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmbGFncyB8PSBTV1NfQklDVUJJQzsKKyAgICAgICAgYy0+ZmxhZ3MgPSBmbGFnczsKKyAgICB9IGVsc2UgaWYgKGkgJiAoaSAtIDEpKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRXhhY3RseSBvbmUgc2NhbGVyIGFsZ29yaXRobSBtdXN0IGJlIGNob3NlbiwgZ290ICVYXG4iLCBpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgLyogc2FuaXR5IGNoZWNrICovCisgICAgaWYgKHNyY1cgPCAxIHx8IHNyY0ggPCAxIHx8IGRzdFcgPCAxIHx8IGRzdEggPCAxKSB7CisgICAgICAgIC8qIEZJWE1FIGNoZWNrIGlmIHRoZXNlIGFyZSBlbm91Z2ggYW5kIHRyeSB0byBsb3dlciB0aGVtIGFmdGVyCisgICAgICAgICAqIGZpeGluZyB0aGUgcmVsZXZhbnQgcGFydHMgb2YgdGhlIGNvZGUgKi8KKyAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIiVkeCVkIC0+ICVkeCVkIGlzIGludmFsaWQgc2NhbGluZyBkaW1lbnNpb25cbiIsCisgICAgICAgICAgICAgICBzcmNXLCBzcmNILCBkc3RXLCBkc3RIKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoIWRzdEZpbHRlcikKKyAgICAgICAgZHN0RmlsdGVyID0gJmR1bW15RmlsdGVyOworICAgIGlmICghc3JjRmlsdGVyKQorICAgICAgICBzcmNGaWx0ZXIgPSAmZHVtbXlGaWx0ZXI7CisKKyAgICBjLT5sdW1YSW5jICAgICAgPSAoKChpbnQ2NF90KXNyY1cgPDwgMTYpICsgKGRzdFcgPj4gMSkpIC8gZHN0VzsKKyAgICBjLT5sdW1ZSW5jICAgICAgPSAoKChpbnQ2NF90KXNyY0ggPDwgMTYpICsgKGRzdEggPj4gMSkpIC8gZHN0SDsKKyAgICBjLT5kc3RGb3JtYXRCcHAgPSBhdl9nZXRfYml0c19wZXJfcGl4ZWwoZGVzY19kc3QpOworICAgIGMtPnNyY0Zvcm1hdEJwcCA9IGF2X2dldF9iaXRzX3Blcl9waXhlbChkZXNjX3NyYyk7CisgICAgYy0+dlJvdW5kZXIgICAgID0gNCAqIDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKKworICAgIHVzZXNWRmlsdGVyID0gKHNyY0ZpbHRlci0+bHVtViAmJiBzcmNGaWx0ZXItPmx1bVYtPmxlbmd0aCA+IDEpIHx8CisgICAgICAgICAgICAgICAgICAoc3JjRmlsdGVyLT5jaHJWICYmIHNyY0ZpbHRlci0+Y2hyVi0+bGVuZ3RoID4gMSkgfHwKKyAgICAgICAgICAgICAgICAgIChkc3RGaWx0ZXItPmx1bVYgJiYgZHN0RmlsdGVyLT5sdW1WLT5sZW5ndGggPiAxKSB8fAorICAgICAgICAgICAgICAgICAgKGRzdEZpbHRlci0+Y2hyViAmJiBkc3RGaWx0ZXItPmNoclYtPmxlbmd0aCA+IDEpOworICAgIHVzZXNIRmlsdGVyID0gKHNyY0ZpbHRlci0+bHVtSCAmJiBzcmNGaWx0ZXItPmx1bUgtPmxlbmd0aCA+IDEpIHx8CisgICAgICAgICAgICAgICAgICAoc3JjRmlsdGVyLT5jaHJIICYmIHNyY0ZpbHRlci0+Y2hySC0+bGVuZ3RoID4gMSkgfHwKKyAgICAgICAgICAgICAgICAgIChkc3RGaWx0ZXItPmx1bUggJiYgZHN0RmlsdGVyLT5sdW1ILT5sZW5ndGggPiAxKSB8fAorICAgICAgICAgICAgICAgICAgKGRzdEZpbHRlci0+Y2hySCAmJiBkc3RGaWx0ZXItPmNockgtPmxlbmd0aCA+IDEpOworCisgICAgYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUoc3JjRm9ybWF0LCAmYy0+Y2hyU3JjSFN1YlNhbXBsZSwgJmMtPmNoclNyY1ZTdWJTYW1wbGUpOworICAgIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGRzdEZvcm1hdCwgJmMtPmNockRzdEhTdWJTYW1wbGUsICZjLT5jaHJEc3RWU3ViU2FtcGxlKTsKKworICAgIGlmIChpc0FueVJHQihkc3RGb3JtYXQpICYmICEoZmxhZ3MmU1dTX0ZVTExfQ0hSX0hfSU5UKSkgeworICAgICAgICBpZiAoZHN0VyYxKSB7CisgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX0RFQlVHLCAiRm9yY2luZyBmdWxsIGludGVybmFsIEggY2hyb21hIGR1ZSB0byBvZGQgb3V0cHV0IHNpemVcbiIpOworICAgICAgICAgICAgZmxhZ3MgfD0gU1dTX0ZVTExfQ0hSX0hfSU5UOworICAgICAgICAgICAgYy0+ZmxhZ3MgPSBmbGFnczsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggICBjLT5jaHJTcmNIU3ViU2FtcGxlID09IDAKKyAgICAgICAgICAgICYmIGMtPmNoclNyY1ZTdWJTYW1wbGUgPT0gMAorICAgICAgICAgICAgJiYgYy0+ZGl0aGVyICE9IFNXU19ESVRIRVJfQkFZRVIgLy9TV1NfRlVMTF9DSFJfSF9JTlQgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgd2l0aCBTV1NfRElUSEVSX0JBWUVSCisgICAgICAgICAgICAmJiAhKGMtPmZsYWdzICYgU1dTX0ZBU1RfQklMSU5FQVIpCisgICAgICAgICkgeworICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19ERUJVRywgIkZvcmNpbmcgZnVsbCBpbnRlcm5hbCBIIGNocm9tYSBkdWUgdG8gaW5wdXQgaGF2aW5nIG5vbiBzdWJzYW1wbGVkIGNocm9tYVxuIik7CisgICAgICAgICAgICBmbGFncyB8PSBTV1NfRlVMTF9DSFJfSF9JTlQ7CisgICAgICAgICAgICBjLT5mbGFncyA9IGZsYWdzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGMtPmRpdGhlciA9PSBTV1NfRElUSEVSX0FVVE8pIHsKKyAgICAgICAgaWYgKGZsYWdzICYgU1dTX0VSUk9SX0RJRkZVU0lPTikKKyAgICAgICAgICAgIGMtPmRpdGhlciA9IFNXU19ESVRIRVJfRUQ7CisgICAgfQorCisgICAgaWYoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSNF9CWVRFIHx8CisgICAgICAgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfUkdCNF9CWVRFIHx8CisgICAgICAgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSOCB8fAorICAgICAgIGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjgpIHsKKyAgICAgICAgaWYgKGMtPmRpdGhlciA9PSBTV1NfRElUSEVSX0FVVE8pCisgICAgICAgICAgICBjLT5kaXRoZXIgPSAoZmxhZ3MgJiBTV1NfRlVMTF9DSFJfSF9JTlQpID8gU1dTX0RJVEhFUl9FRCA6IFNXU19ESVRIRVJfQkFZRVI7CisgICAgICAgIGlmICghKGZsYWdzICYgU1dTX0ZVTExfQ0hSX0hfSU5UKSkgeworICAgICAgICAgICAgaWYgKGMtPmRpdGhlciA9PSBTV1NfRElUSEVSX0VEIHx8IGMtPmRpdGhlciA9PSBTV1NfRElUSEVSX0FfRElUSEVSIHx8IGMtPmRpdGhlciA9PSBTV1NfRElUSEVSX1hfRElUSEVSKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgIkRlc2lyZWQgZGl0aGVyaW5nIG9ubHkgc3VwcG9ydGVkIGluIGZ1bGwgY2hyb21hIGludGVycG9sYXRpb24gZm9yIGRlc3RpbmF0aW9uIGZvcm1hdCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGRzdEZvcm1hdCkpOworICAgICAgICAgICAgICAgIGZsYWdzICAgfD0gU1dTX0ZVTExfQ0hSX0hfSU5UOworICAgICAgICAgICAgICAgIGMtPmZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICYgU1dTX0ZVTExfQ0hSX0hfSU5UKSB7CisgICAgICAgICAgICBpZiAoYy0+ZGl0aGVyID09IFNXU19ESVRIRVJfQkFZRVIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICAiT3JkZXJlZCBkaXRoZXIgaXMgbm90IHN1cHBvcnRlZCBpbiBmdWxsIGNocm9tYSBpbnRlcnBvbGF0aW9uIGZvciBkZXN0aW5hdGlvbiBmb3JtYXQgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShkc3RGb3JtYXQpKTsKKyAgICAgICAgICAgICAgICBjLT5kaXRoZXIgPSBTV1NfRElUSEVSX0VEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChpc1BsYW5hclJHQihkc3RGb3JtYXQpKSB7CisgICAgICAgIGlmICghKGZsYWdzICYgU1dTX0ZVTExfQ0hSX0hfSU5UKSkgeworICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAiJXMgb3V0cHV0IGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBoYWxmIGNocm9tYSByZXNvbHV0aW9uLCBzd2l0Y2hpbmcgdG8gZnVsbFxuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGRzdEZvcm1hdCkpOworICAgICAgICAgICAgZmxhZ3MgICB8PSBTV1NfRlVMTF9DSFJfSF9JTlQ7CisgICAgICAgICAgICBjLT5mbGFncyA9IGZsYWdzOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcmV1c2UgY2hyb21hIGZvciAyIHBpeGVscyBSR0IvQkdSIHVubGVzcyB1c2VyIHdhbnRzIGZ1bGwKKyAgICAgKiBjaHJvbWEgaW50ZXJwb2xhdGlvbiAqLworICAgIGlmIChmbGFncyAmIFNXU19GVUxMX0NIUl9IX0lOVCAmJgorICAgICAgICBpc0FueVJHQihkc3RGb3JtYXQpICAgICAgICAmJgorICAgICAgICAhaXNQbGFuYXJSR0IoZHN0Rm9ybWF0KSAgICAmJgorICAgICAgICBkc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9SR0JBICAmJgorICAgICAgICBkc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9BUkdCICAmJgorICAgICAgICBkc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9CR1JBICAmJgorICAgICAgICBkc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9BQkdSICAmJgorICAgICAgICBkc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9SR0IyNCAmJgorICAgICAgICBkc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9CR1IyNCAmJgorICAgICAgICBkc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9CR1I0X0JZVEUgJiYKKyAgICAgICAgZHN0Rm9ybWF0ICE9IEFWX1BJWF9GTVRfUkdCNF9CWVRFICYmCisgICAgICAgIGRzdEZvcm1hdCAhPSBBVl9QSVhfRk1UX0JHUjggJiYKKyAgICAgICAgZHN0Rm9ybWF0ICE9IEFWX1BJWF9GTVRfUkdCOAorICAgICkgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiZnVsbCBjaHJvbWEgaW50ZXJwb2xhdGlvbiBmb3IgZGVzdGluYXRpb24gZm9ybWF0ICclcycgbm90IHlldCBpbXBsZW1lbnRlZFxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoZHN0Rm9ybWF0KSk7CisgICAgICAgIGZsYWdzICAgJj0gflNXU19GVUxMX0NIUl9IX0lOVDsKKyAgICAgICAgYy0+ZmxhZ3MgPSBmbGFnczsKKyAgICB9CisgICAgaWYgKGlzQW55UkdCKGRzdEZvcm1hdCkgJiYgIShmbGFncyAmIFNXU19GVUxMX0NIUl9IX0lOVCkpCisgICAgICAgIGMtPmNockRzdEhTdWJTYW1wbGUgPSAxOworCisgICAgLy8gZHJvcCBzb21lIGNocm9tYSBsaW5lcyBpZiB0aGUgdXNlciB3YW50cyBpdAorICAgIGMtPnZDaHJEcm9wICAgICAgICAgID0gKGZsYWdzICYgU1dTX1NSQ19WX0NIUl9EUk9QX01BU0spID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1NfU1JDX1ZfQ0hSX0RST1BfU0hJRlQ7CisgICAgYy0+Y2hyU3JjVlN1YlNhbXBsZSArPSBjLT52Q2hyRHJvcDsKKworICAgIC8qIGRyb3AgZXZlcnkgb3RoZXIgcGl4ZWwgZm9yIGNocm9tYSBjYWxjdWxhdGlvbiB1bmxlc3MgdXNlcgorICAgICAqIHdhbnRzIGZ1bGwgY2hyb21hICovCisgICAgaWYgKGlzQW55UkdCKHNyY0Zvcm1hdCkgJiYgIShmbGFncyAmIFNXU19GVUxMX0NIUl9IX0lOUCkgICAmJgorICAgICAgICBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9SR0I4ICYmIHNyY0Zvcm1hdCAhPSBBVl9QSVhfRk1UX0JHUjggJiYKKyAgICAgICAgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfUkdCNCAmJiBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9CR1I0ICYmCisgICAgICAgIHNyY0Zvcm1hdCAhPSBBVl9QSVhfRk1UX1JHQjRfQllURSAmJiBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9CR1I0X0JZVEUgJiYKKyAgICAgICAgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfR0JSUDlCRSAgICYmIHNyY0Zvcm1hdCAhPSBBVl9QSVhfRk1UX0dCUlA5TEUgICYmCisgICAgICAgIHNyY0Zvcm1hdCAhPSBBVl9QSVhfRk1UX0dCUlAxMEJFICAmJiBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9HQlJQMTBMRSAmJgorICAgICAgICBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9HQlJQMTJCRSAgJiYgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfR0JSUDEyTEUgJiYKKyAgICAgICAgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfR0JSUDE0QkUgICYmIHNyY0Zvcm1hdCAhPSBBVl9QSVhfRk1UX0dCUlAxNExFICYmCisgICAgICAgIHNyY0Zvcm1hdCAhPSBBVl9QSVhfRk1UX0dCUlAxNkJFICAmJiBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9HQlJQMTZMRSAmJgorICAgICAgICAoKGRzdFcgPj4gYy0+Y2hyRHN0SFN1YlNhbXBsZSkgPD0gKHNyY1cgPj4gMSkgfHwKKyAgICAgICAgIChmbGFncyAmIFNXU19GQVNUX0JJTElORUFSKSkpCisgICAgICAgIGMtPmNoclNyY0hTdWJTYW1wbGUgPSAxOworCisgICAgLy8gTm90ZSB0aGUgRkZfQ0VJTF9SU0hJRlQgaXMgc28gdGhhdCB3ZSBhbHdheXMgcm91bmQgdG93YXJkICtpbmYuCisgICAgYy0+Y2hyU3JjVyA9IEZGX0NFSUxfUlNISUZUKHNyY1csIGMtPmNoclNyY0hTdWJTYW1wbGUpOworICAgIGMtPmNoclNyY0ggPSBGRl9DRUlMX1JTSElGVChzcmNILCBjLT5jaHJTcmNWU3ViU2FtcGxlKTsKKyAgICBjLT5jaHJEc3RXID0gRkZfQ0VJTF9SU0hJRlQoZHN0VywgYy0+Y2hyRHN0SFN1YlNhbXBsZSk7CisgICAgYy0+Y2hyRHN0SCA9IEZGX0NFSUxfUlNISUZUKGRzdEgsIGMtPmNockRzdFZTdWJTYW1wbGUpOworCisgICAgRkZfQUxMT0NfT1JfR09UTyhjLCBjLT5mb3JtYXRDb252QnVmZmVyLCBGRkFMSUdOKHNyY1cqMis3OCwgMTYpICogMiwgZmFpbCk7CisKKyAgICBjLT5zcmNCcGMgPSAxICsgZGVzY19zcmMtPmNvbXBbMF0uZGVwdGhfbWludXMxOworICAgIGlmIChjLT5zcmNCcGMgPCA4KQorICAgICAgICBjLT5zcmNCcGMgPSA4OworICAgIGMtPmRzdEJwYyA9IDEgKyBkZXNjX2RzdC0+Y29tcFswXS5kZXB0aF9taW51czE7CisgICAgaWYgKGMtPmRzdEJwYyA8IDgpCisgICAgICAgIGMtPmRzdEJwYyA9IDg7CisgICAgaWYgKGlzQW55UkdCKHNyY0Zvcm1hdCkgfHwgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfUEFMOCkKKyAgICAgICAgYy0+c3JjQnBjID0gMTY7CisgICAgaWYgKGMtPmRzdEJwYyA9PSAxNikKKyAgICAgICAgZHN0X3N0cmlkZSA8PD0gMTsKKworICAgIGlmIChJTkxJTkVfTU1YRVhUKGNwdV9mbGFncykgJiYgYy0+c3JjQnBjID09IDggJiYgYy0+ZHN0QnBjIDw9IDE0KSB7CisgICAgICAgIGMtPmNhbk1NWEVYVEJlVXNlZCA9IGRzdFcgPj0gc3JjVyAmJiAoZHN0VyAmIDMxKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNockRzdFcgPj0gYy0+Y2hyU3JjVyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjVyAmIDE1KSA9PSAwOworICAgICAgICBpZiAoIWMtPmNhbk1NWEVYVEJlVXNlZCAmJiBkc3RXID49IHNyY1cgJiYgYy0+Y2hyRHN0VyA+PSBjLT5jaHJTcmNXICYmIChzcmNXICYgMTUpID09IDAKKworICAgICAgICAgICAgJiYgKGZsYWdzICYgU1dTX0ZBU1RfQklMSU5FQVIpKSB7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBTV1NfUFJJTlRfSU5GTykKKyAgICAgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgd2lkdGggaXMgbm90IGEgbXVsdGlwbGUgb2YgMzIgLT4gbm8gTU1YRVhUIHNjYWxlclxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzZXNIRmlsdGVyIHx8IGlzTkJQUyhjLT5zcmNGb3JtYXQpIHx8IGlzMTZCUFMoYy0+c3JjRm9ybWF0KSB8fCBpc0FueVJHQihjLT5zcmNGb3JtYXQpKQorICAgICAgICAgICAgYy0+Y2FuTU1YRVhUQmVVc2VkID0gMDsKKyAgICB9IGVsc2UKKyAgICAgICAgYy0+Y2FuTU1YRVhUQmVVc2VkID0gMDsKKworICAgIGMtPmNoclhJbmMgPSAoKChpbnQ2NF90KWMtPmNoclNyY1cgPDwgMTYpICsgKGMtPmNockRzdFcgPj4gMSkpIC8gYy0+Y2hyRHN0VzsKKyAgICBjLT5jaHJZSW5jID0gKCgoaW50NjRfdCljLT5jaHJTcmNIIDw8IDE2KSArIChjLT5jaHJEc3RIID4+IDEpKSAvIGMtPmNockRzdEg7CisKKyAgICAvKiBNYXRjaCBwaXhlbCAwIG9mIHRoZSBzcmMgdG8gcGl4ZWwgMCBvZiBkc3QgYW5kIG1hdGNoIHBpeGVsIG4tMiBvZiBzcmMKKyAgICAgKiB0byBwaXhlbCBuLTIgb2YgZHN0LCBidXQgb25seSBmb3IgdGhlIEZBU1RfQklMSU5FQVIgbW9kZSBvdGhlcndpc2UgZG8KKyAgICAgKiBjb3JyZWN0IHNjYWxpbmcuCisgICAgICogbi0yIGlzIHRoZSBsYXN0IGNocm9taW5hbmNlIHNhbXBsZSBhdmFpbGFibGUuCisgICAgICogVGhpcyBpcyBub3QgcGVyZmVjdCwgYnV0IG5vIG9uZSBzaG91bGQgbm90aWNlIHRoZSBkaWZmZXJlbmNlLCB0aGUgbW9yZQorICAgICAqIGNvcnJlY3QgdmFyaWFudCB3b3VsZCBiZSBsaWtlIHRoZSB2ZXJ0aWNhbCBvbmUsIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUKKyAgICAgKiBzb21lIHNwZWNpYWwgY29kZSBmb3IgdGhlIGZpcnN0IGFuZCBsYXN0IHBpeGVsICovCisgICAgaWYgKGZsYWdzICYgU1dTX0ZBU1RfQklMSU5FQVIpIHsKKyAgICAgICAgaWYgKGMtPmNhbk1NWEVYVEJlVXNlZCkgeworICAgICAgICAgICAgYy0+bHVtWEluYyArPSAyMDsKKyAgICAgICAgICAgIGMtPmNoclhJbmMgKz0gMjA7CisgICAgICAgIH0KKyAgICAgICAgLy8gd2UgZG9uJ3QgdXNlIHRoZSB4ODYgYXNtIHNjYWxlciBpZiBNTVggaXMgYXZhaWxhYmxlCisgICAgICAgIGVsc2UgaWYgKElOTElORV9NTVgoY3B1X2ZsYWdzKSAmJiBjLT5kc3RCcGMgPD0gMTQpIHsKKyAgICAgICAgICAgIGMtPmx1bVhJbmMgPSAoKGludDY0X3QpKHNyY1cgICAgICAgLSAyKSA8PCAxNikgLyAoZHN0VyAgICAgICAtIDIpIC0gMjA7CisgICAgICAgICAgICBjLT5jaHJYSW5jID0gKChpbnQ2NF90KShjLT5jaHJTcmNXIC0gMikgPDwgMTYpIC8gKGMtPmNockRzdFcgLSAyKSAtIDIwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzQmF5ZXIoc3JjRm9ybWF0KSkgeworICAgICAgICBpZiAoIXVuc2NhbGVkIHx8CisgICAgICAgICAgICAoZHN0Rm9ybWF0ICE9IEFWX1BJWF9GTVRfUkdCMjQgJiYgZHN0Rm9ybWF0ICE9IEFWX1BJWF9GTVRfWVVWNDIwUCkpIHsKKyAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCB0bXBGb3JtYXQgPSBBVl9QSVhfRk1UX1JHQjI0OworCisgICAgICAgICAgICByZXQgPSBhdl9pbWFnZV9hbGxvYyhjLT5jYXNjYWRlZF90bXAsIGMtPmNhc2NhZGVkX3RtcFN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVywgc3JjSCwgdG1wRm9ybWF0LCA2NCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBjLT5jYXNjYWRlZF9jb250ZXh0WzBdID0gc3dzX2dldENvbnRleHQoc3JjVywgc3JjSCwgc3JjRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1csIHNyY0gsIHRtcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc3JjRmlsdGVyLCBOVUxMLCBjLT5wYXJhbSk7CisgICAgICAgICAgICBpZiAoIWMtPmNhc2NhZGVkX2NvbnRleHRbMF0pCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBjLT5jYXNjYWRlZF9jb250ZXh0WzFdID0gc3dzX2dldENvbnRleHQoc3JjVywgc3JjSCwgdG1wRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFcsIGRzdEgsIGRzdEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgTlVMTCwgZHN0RmlsdGVyLCBjLT5wYXJhbSk7CisgICAgICAgICAgICBpZiAoIWMtPmNhc2NhZGVkX2NvbnRleHRbMV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyNkZWZpbmUgVVNFX01NQVAgKEhBVkVfTU1BUCAmJiBIQVZFX01QUk9URUNUICYmIGRlZmluZWQgTUFQX0FOT05ZTU9VUykKKworICAgIC8qIHByZWNhbGN1bGF0ZSBob3Jpem9udGFsIHNjYWxlciBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgICAgeworI2lmIEhBVkVfTU1YRVhUX0lOTElORQorLy8gY2FuJ3QgZG93bnNjYWxlICEhIQorICAgICAgICBpZiAoYy0+Y2FuTU1YRVhUQmVVc2VkICYmIChmbGFncyAmIFNXU19GQVNUX0JJTElORUFSKSkgeworICAgICAgICAgICAgYy0+bHVtTW14ZXh0RmlsdGVyQ29kZVNpemUgPSBmZl9pbml0X2hzY2FsZXJfbW14ZXh0KGRzdFcsIGMtPmx1bVhJbmMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgOCk7CisgICAgICAgICAgICBjLT5jaHJNbXhleHRGaWx0ZXJDb2RlU2l6ZSA9IGZmX2luaXRfaHNjYWxlcl9tbXhleHQoYy0+Y2hyRHN0VywgYy0+Y2hyWEluYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCA0KTsKKworI2lmIFVTRV9NTUFQCisgICAgICAgICAgICBjLT5sdW1NbXhleHRGaWx0ZXJDb2RlID0gbW1hcChOVUxMLCBjLT5sdW1NbXhleHRGaWx0ZXJDb2RlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMCk7CisgICAgICAgICAgICBjLT5jaHJNbXhleHRGaWx0ZXJDb2RlID0gbW1hcChOVUxMLCBjLT5jaHJNbXhleHRGaWx0ZXJDb2RlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMCk7CisjZWxpZiBIQVZFX1ZJUlRVQUxBTExPQworICAgICAgICAgICAgYy0+bHVtTW14ZXh0RmlsdGVyQ29kZSA9IFZpcnR1YWxBbGxvYyhOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5sdW1NbXhleHRGaWx0ZXJDb2RlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVNX0NPTU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9FWEVDVVRFX1JFQURXUklURSk7CisgICAgICAgICAgICBjLT5jaHJNbXhleHRGaWx0ZXJDb2RlID0gVmlydHVhbEFsbG9jKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNock1teGV4dEZpbHRlckNvZGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1fQ09NTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFKTsKKyNlbHNlCisgICAgICAgICAgICBjLT5sdW1NbXhleHRGaWx0ZXJDb2RlID0gYXZfbWFsbG9jKGMtPmx1bU1teGV4dEZpbHRlckNvZGVTaXplKTsKKyAgICAgICAgICAgIGMtPmNock1teGV4dEZpbHRlckNvZGUgPSBhdl9tYWxsb2MoYy0+Y2hyTW14ZXh0RmlsdGVyQ29kZVNpemUpOworI2VuZGlmCisKKyNpZmRlZiBNQVBfQU5PTllNT1VTCisgICAgICAgICAgICBpZiAoYy0+bHVtTW14ZXh0RmlsdGVyQ29kZSA9PSBNQVBfRkFJTEVEIHx8IGMtPmNock1teGV4dEZpbHRlckNvZGUgPT0gTUFQX0ZBSUxFRCkKKyNlbHNlCisgICAgICAgICAgICBpZiAoIWMtPmx1bU1teGV4dEZpbHRlckNvZGUgfHwgIWMtPmNock1teGV4dEZpbHRlckNvZGUpCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIE1NWDJGaWx0ZXJDb2RlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhjLCBjLT5oTHVtRmlsdGVyLCAgICAoZHN0VyAgICAgICAgICAgLyA4ICsgOCkgKiBzaXplb2YoaW50MTZfdCksIGZhaWwpOworICAgICAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8oYywgYy0+aENockZpbHRlciwgICAgKGMtPmNockRzdFcgICAgIC8gNCArIDgpICogc2l6ZW9mKGludDE2X3QpLCBmYWlsKTsKKyAgICAgICAgICAgIEZGX0FMTE9DWl9PUl9HT1RPKGMsIGMtPmhMdW1GaWx0ZXJQb3MsIChkc3RXICAgICAgIC8gMiAvIDggKyA4KSAqIHNpemVvZihpbnQzMl90KSwgZmFpbCk7CisgICAgICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhjLCBjLT5oQ2hyRmlsdGVyUG9zLCAoYy0+Y2hyRHN0VyAvIDIgLyA0ICsgOCkgKiBzaXplb2YoaW50MzJfdCksIGZhaWwpOworCisgICAgICAgICAgICBmZl9pbml0X2hzY2FsZXJfbW14ZXh0KCAgICAgIGRzdFcsIGMtPmx1bVhJbmMsIGMtPmx1bU1teGV4dEZpbHRlckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmhMdW1GaWx0ZXIsICh1aW50MzJfdCopYy0+aEx1bUZpbHRlclBvcywgOCk7CisgICAgICAgICAgICBmZl9pbml0X2hzY2FsZXJfbW14ZXh0KGMtPmNockRzdFcsIGMtPmNoclhJbmMsIGMtPmNock1teGV4dEZpbHRlckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmhDaHJGaWx0ZXIsICh1aW50MzJfdCopYy0+aENockZpbHRlclBvcywgNCk7CisKKyNpZiBVU0VfTU1BUAorICAgICAgICAgICAgaWYgKCAgIG1wcm90ZWN0KGMtPmx1bU1teGV4dEZpbHRlckNvZGUsIGMtPmx1bU1teGV4dEZpbHRlckNvZGVTaXplLCBQUk9UX0VYRUMgfCBQUk9UX1JFQUQpID09IC0xCisgICAgICAgICAgICAgICAgfHwgbXByb3RlY3QoYy0+Y2hyTW14ZXh0RmlsdGVyQ29kZSwgYy0+Y2hyTW14ZXh0RmlsdGVyQ29kZVNpemUsIFBST1RfRVhFQyB8IFBST1RfUkVBRCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAibXByb3RlY3QgZmFpbGVkLCBjYW5ub3QgdXNlIGZhc3QgYmlsaW5lYXIgc2NhbGVyXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogSEFWRV9NTVhFWFRfSU5MSU5FICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBmaWx0ZXJBbGlnbiA9IFg4Nl9NTVgoY3B1X2ZsYWdzKSAgICAgPyA0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19BTFRJVkVDKGNwdV9mbGFncykgPyA4IDogMTsKKworICAgICAgICAgICAgaWYgKChyZXQgPSBpbml0RmlsdGVyKCZjLT5oTHVtRmlsdGVyLCAmYy0+aEx1bUZpbHRlclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5oTHVtRmlsdGVyU2l6ZSwgYy0+bHVtWEluYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1csIGRzdFcsIGZpbHRlckFsaWduLCAxIDw8IDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU1dTX0JJQ1VCTElOKSA/IChmbGFncyB8IFNXU19CSUNVQklDKSA6IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X2ZsYWdzLCBzcmNGaWx0ZXItPmx1bUgsIGRzdEZpbHRlci0+bHVtSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX3BvcyhjLCAwLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9sb2NhbF9wb3MoYywgMCwgMCwgMCkpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgaWYgKChyZXQgPSBpbml0RmlsdGVyKCZjLT5oQ2hyRmlsdGVyLCAmYy0+aENockZpbHRlclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5oQ2hyRmlsdGVyU2l6ZSwgYy0+Y2hyWEluYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNoclNyY1csIGMtPmNockRzdFcsIGZpbHRlckFsaWduLCAxIDw8IDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU1dTX0JJQ1VCTElOKSA/IChmbGFncyB8IFNXU19CSUxJTkVBUikgOiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9mbGFncywgc3JjRmlsdGVyLT5jaHJILCBkc3RGaWx0ZXItPmNockgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9sb2NhbF9wb3MoYywgYy0+Y2hyU3JjSFN1YlNhbXBsZSwgYy0+c3JjX2hfY2hyX3BvcywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbG9jYWxfcG9zKGMsIGMtPmNockRzdEhTdWJTYW1wbGUsIGMtPmRzdF9oX2Nocl9wb3MsIDApKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gLy8gaW5pdGlhbGl6ZSBob3Jpem9udGFsIHN0dWZmCisKKyAgICAvKiBwcmVjYWxjdWxhdGUgdmVydGljYWwgc2NhbGVyIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgICB7CisgICAgICAgIGNvbnN0IGludCBmaWx0ZXJBbGlnbiA9IFg4Nl9NTVgoY3B1X2ZsYWdzKSAgICAgPyAyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX0FMVElWRUMoY3B1X2ZsYWdzKSA/IDggOiAxOworCisgICAgICAgIGlmICgocmV0ID0gaW5pdEZpbHRlcigmYy0+dkx1bUZpbHRlciwgJmMtPnZMdW1GaWx0ZXJQb3MsICZjLT52THVtRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYy0+bHVtWUluYywgc3JjSCwgZHN0SCwgZmlsdGVyQWxpZ24sICgxIDw8IDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU1dTX0JJQ1VCTElOKSA/IChmbGFncyB8IFNXU19CSUNVQklDKSA6IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBjcHVfZmxhZ3MsIHNyY0ZpbHRlci0+bHVtViwgZHN0RmlsdGVyLT5sdW1WLAorICAgICAgICAgICAgICAgICAgICAgICBjLT5wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX3BvcyhjLCAwLCAwLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX3BvcyhjLCAwLCAwLCAxKSkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgaWYgKChyZXQgPSBpbml0RmlsdGVyKCZjLT52Q2hyRmlsdGVyLCAmYy0+dkNockZpbHRlclBvcywgJmMtPnZDaHJGaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjLT5jaHJZSW5jLCBjLT5jaHJTcmNILCBjLT5jaHJEc3RILAorICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJBbGlnbiwgKDEgPDwgMTIpLAorICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTV1NfQklDVUJMSU4pID8gKGZsYWdzIHwgU1dTX0JJTElORUFSKSA6IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBjcHVfZmxhZ3MsIHNyY0ZpbHRlci0+Y2hyViwgZHN0RmlsdGVyLT5jaHJWLAorICAgICAgICAgICAgICAgICAgICAgICBjLT5wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX3BvcyhjLCBjLT5jaHJTcmNWU3ViU2FtcGxlLCBjLT5zcmNfdl9jaHJfcG9zLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX3BvcyhjLCBjLT5jaHJEc3RWU3ViU2FtcGxlLCBjLT5kc3Rfdl9jaHJfcG9zLCAxKSkpIDwgMCkKKworICAgICAgICAgICAgZ290byBmYWlsOworCisjaWYgSEFWRV9BTFRJVkVDCisgICAgICAgIEZGX0FMTE9DX09SX0dPVE8oYywgYy0+dllDb2VmZnNCYW5rLCBzaXplb2YodmVjdG9yIHNpZ25lZCBzaG9ydCkgKiBjLT52THVtRmlsdGVyU2l6ZSAqIGMtPmRzdEgsICAgIGZhaWwpOworICAgICAgICBGRl9BTExPQ19PUl9HT1RPKGMsIGMtPnZDQ29lZmZzQmFuaywgc2l6ZW9mKHZlY3RvciBzaWduZWQgc2hvcnQpICogYy0+dkNockZpbHRlclNpemUgKiBjLT5jaHJEc3RILCBmYWlsKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+dkx1bUZpbHRlclNpemUgKiBjLT5kc3RIOyBpKyspIHsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgc2hvcnQgKnAgPSAoc2hvcnQgKikmYy0+dllDb2VmZnNCYW5rW2ldOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgICAgICBwW2pdID0gYy0+dkx1bUZpbHRlcltpXTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT52Q2hyRmlsdGVyU2l6ZSAqIGMtPmNockRzdEg7IGkrKykgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBzaG9ydCAqcCA9IChzaG9ydCAqKSZjLT52Q0NvZWZmc0JhbmtbaV07CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgICAgIHBbal0gPSBjLT52Q2hyRmlsdGVyW2ldOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBjYWxjdWxhdGUgYnVmZmVyIHNpemVzIHNvIHRoYXQgdGhleSB3b24ndCBydW4gb3V0IHdoaWxlIGhhbmRsaW5nIHRoZXNlIGRhbW4gc2xpY2VzCisgICAgYy0+dkx1bUJ1ZlNpemUgPSBjLT52THVtRmlsdGVyU2l6ZTsKKyAgICBjLT52Q2hyQnVmU2l6ZSA9IGMtPnZDaHJGaWx0ZXJTaXplOworICAgIGZvciAoaSA9IDA7IGkgPCBkc3RIOyBpKyspIHsKKyAgICAgICAgaW50IGNockkgICAgICA9IChpbnQ2NF90KWkgKiBjLT5jaHJEc3RIIC8gZHN0SDsKKyAgICAgICAgaW50IG5leHRTbGljZSA9IEZGTUFYKGMtPnZMdW1GaWx0ZXJQb3NbaV0gKyBjLT52THVtRmlsdGVyU2l6ZSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGMtPnZDaHJGaWx0ZXJQb3NbY2hySV0gKyBjLT52Q2hyRmlsdGVyU2l6ZSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYy0+Y2hyU3JjVlN1YlNhbXBsZSkpOworCisgICAgICAgIG5leHRTbGljZSA+Pj0gYy0+Y2hyU3JjVlN1YlNhbXBsZTsKKyAgICAgICAgbmV4dFNsaWNlIDw8PSBjLT5jaHJTcmNWU3ViU2FtcGxlOworICAgICAgICBpZiAoYy0+dkx1bUZpbHRlclBvc1tpXSArIGMtPnZMdW1CdWZTaXplIDwgbmV4dFNsaWNlKQorICAgICAgICAgICAgYy0+dkx1bUJ1ZlNpemUgPSBuZXh0U2xpY2UgLSBjLT52THVtRmlsdGVyUG9zW2ldOworICAgICAgICBpZiAoYy0+dkNockZpbHRlclBvc1tjaHJJXSArIGMtPnZDaHJCdWZTaXplIDwKKyAgICAgICAgICAgIChuZXh0U2xpY2UgPj4gYy0+Y2hyU3JjVlN1YlNhbXBsZSkpCisgICAgICAgICAgICBjLT52Q2hyQnVmU2l6ZSA9IChuZXh0U2xpY2UgPj4gYy0+Y2hyU3JjVlN1YlNhbXBsZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT52Q2hyRmlsdGVyUG9zW2NockldOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIEZGX0FMTE9DWl9PUl9HT1RPKGMsIGMtPmRpdGhlcl9lcnJvcltpXSwgKGMtPmRzdFcrMikgKiBzaXplb2YoaW50KSwgZmFpbCk7CisKKyAgICAvKiBBbGxvY2F0ZSBwaXhidWZzICh3ZSB1c2UgZHluYW1pYyBhbGxvY2F0aW9uIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvdWxkCisgICAgICogbmVlZCB0byBhbGxvY2F0ZSBzZXZlcmFsIG1lZ2FieXRlcyB0byBoYW5kbGUgYWxsIHBvc3NpYmxlIGNhc2VzKSAqLworICAgIEZGX0FMTE9DX09SX0dPVE8oYywgYy0+bHVtUGl4QnVmLCAgYy0+dkx1bUJ1ZlNpemUgKiAzICogc2l6ZW9mKGludDE2X3QgKiksIGZhaWwpOworICAgIEZGX0FMTE9DX09SX0dPVE8oYywgYy0+Y2hyVVBpeEJ1ZiwgYy0+dkNockJ1ZlNpemUgKiAzICogc2l6ZW9mKGludDE2X3QgKiksIGZhaWwpOworICAgIEZGX0FMTE9DX09SX0dPVE8oYywgYy0+Y2hyVlBpeEJ1ZiwgYy0+dkNockJ1ZlNpemUgKiAzICogc2l6ZW9mKGludDE2X3QgKiksIGZhaWwpOworICAgIGlmIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBpc0FMUEhBKGMtPnNyY0Zvcm1hdCkgJiYgaXNBTFBIQShjLT5kc3RGb3JtYXQpKQorICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhjLCBjLT5hbHBQaXhCdWYsIGMtPnZMdW1CdWZTaXplICogMyAqIHNpemVvZihpbnQxNl90ICopLCBmYWlsKTsKKyAgICAvKiBOb3RlIHdlIG5lZWQgYXQgbGVhc3Qgb25lIHBpeGVsIG1vcmUgYXQgdGhlIGVuZCBiZWNhdXNlIG9mIHRoZSBNTVggY29kZQorICAgICAqIChqdXN0IGluIGNhc2Ugc29tZW9uZSB3YW50cyB0byByZXBsYWNlIHRoZSA0MDAwLzgwMDApLiAqLworICAgIC8qIGFsaWduIGF0IDE2IGJ5dGVzIGZvciBBbHRpVmVjICovCisgICAgZm9yIChpID0gMDsgaSA8IGMtPnZMdW1CdWZTaXplOyBpKyspIHsKKyAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8oYywgYy0+bHVtUGl4QnVmW2kgKyBjLT52THVtQnVmU2l6ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUgKyAxNiwgZmFpbCk7CisgICAgICAgIGMtPmx1bVBpeEJ1ZltpXSA9IGMtPmx1bVBpeEJ1ZltpICsgYy0+dkx1bUJ1ZlNpemVdOworICAgIH0KKyAgICAvLyA2NCAvIGMtPnNjYWxpbmdCcHAgaXMgdGhlIHNhbWUgYXMgMTYgLyBzaXplb2Yoc2NhbGluZ19pbnRlcm1lZGlhdGUpCisgICAgYy0+dXZfb2ZmICAgPSAoZHN0X3N0cmlkZT4+MSkgKyA2NCAvIChjLT5kc3RCcGMgJn4gNyk7CisgICAgYy0+dXZfb2ZmeDIgPSBkc3Rfc3RyaWRlICsgMTY7CisgICAgZm9yIChpID0gMDsgaSA8IGMtPnZDaHJCdWZTaXplOyBpKyspIHsKKyAgICAgICAgRkZfQUxMT0NfT1JfR09UTyhjLCBjLT5jaHJVUGl4QnVmW2kgKyBjLT52Q2hyQnVmU2l6ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0cmlkZSAqIDIgKyAzMiwgZmFpbCk7CisgICAgICAgIGMtPmNoclVQaXhCdWZbaV0gPSBjLT5jaHJVUGl4QnVmW2kgKyBjLT52Q2hyQnVmU2l6ZV07CisgICAgICAgIGMtPmNoclZQaXhCdWZbaV0gPSBjLT5jaHJWUGl4QnVmW2kgKyBjLT52Q2hyQnVmU2l6ZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICA9IGMtPmNoclVQaXhCdWZbaV0gKyAoZHN0X3N0cmlkZSA+PiAxKSArIDg7CisgICAgfQorICAgIGlmIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5hbHBQaXhCdWYpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT52THVtQnVmU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhjLCBjLT5hbHBQaXhCdWZbaSArIGMtPnZMdW1CdWZTaXplXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUgKyAxNiwgZmFpbCk7CisgICAgICAgICAgICBjLT5hbHBQaXhCdWZbaV0gPSBjLT5hbHBQaXhCdWZbaSArIGMtPnZMdW1CdWZTaXplXTsKKyAgICAgICAgfQorCisgICAgLy8gdHJ5IHRvIGF2b2lkIGRyYXdpbmcgZ3JlZW4gc3R1ZmYgYmV0d2VlbiB0aGUgcmlnaHQgZW5kIGFuZCB0aGUgc3RyaWRlIGVuZAorICAgIGZvciAoaSA9IDA7IGkgPCBjLT52Q2hyQnVmU2l6ZTsgaSsrKQorICAgICAgICBpZihkZXNjX2RzdC0+Y29tcFswXS5kZXB0aF9taW51czEgPT0gMTUpeworICAgICAgICAgICAgYXZfYXNzZXJ0MChjLT5kc3RCcGMgPiAxNCk7CisgICAgICAgICAgICBmb3Ioaj0wOyBqPGRzdF9zdHJpZGUvMisxOyBqKyspCisgICAgICAgICAgICAgICAgKChpbnQzMl90KikoYy0+Y2hyVVBpeEJ1ZltpXSkpW2pdID0gMTw8MTg7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZm9yKGo9MDsgajxkc3Rfc3RyaWRlKzE7IGorKykKKyAgICAgICAgICAgICAgICAoKGludDE2X3QqKShjLT5jaHJVUGl4QnVmW2ldKSlbal0gPSAxPDwxNDsKKworICAgIGF2X2Fzc2VydDAoYy0+Y2hyRHN0SCA8PSBkc3RIKTsKKworICAgIGlmIChmbGFncyAmIFNXU19QUklOVF9JTkZPKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnNjYWxlciA9IE5VTEwsICpjcHVjYXBzOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzY2FsZV9hbGdvcml0aG1zKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBzY2FsZV9hbGdvcml0aG1zW2ldLmZsYWcpIHsKKyAgICAgICAgICAgICAgICBzY2FsZXIgPSBzY2FsZV9hbGdvcml0aG1zW2ldLmRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghc2NhbGVyKQorICAgICAgICAgICAgc2NhbGVyID0gICJlaGggZmxhZ3MgaW52YWxpZD8hIjsKKyAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19JTkZPLCAiJXMgc2NhbGVyLCBmcm9tICVzIHRvICVzJXMgIiwKKyAgICAgICAgICAgICAgIHNjYWxlciwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoc3JjRm9ybWF0KSwKKyNpZmRlZiBESVRIRVIxWEJQUAorICAgICAgICAgICAgICAgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSNTU1ICAgfHwgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSNTY1ICAgfHwKKyAgICAgICAgICAgICAgIGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjQ0NEJFIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjQ0NExFIHx8CisgICAgICAgICAgICAgICBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9CR1I0NDRCRSB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9CR1I0NDRMRSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpdGhlcmVkICIgOiAiIiwKKyNlbHNlCisgICAgICAgICAgICAgICAiIiwKKyNlbmRpZgorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShkc3RGb3JtYXQpKTsKKworICAgICAgICBpZiAoSU5MSU5FX01NWEVYVChjcHVfZmxhZ3MpKQorICAgICAgICAgICAgY3B1Y2FwcyA9ICJNTVhFWFQiOworICAgICAgICBlbHNlIGlmIChJTkxJTkVfQU1EM0ROT1coY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIGNwdWNhcHMgPSAiM0ROT1ciOworICAgICAgICBlbHNlIGlmIChJTkxJTkVfTU1YKGNwdV9mbGFncykpCisgICAgICAgICAgICBjcHVjYXBzID0gIk1NWCI7CisgICAgICAgIGVsc2UgaWYgKFBQQ19BTFRJVkVDKGNwdV9mbGFncykpCisgICAgICAgICAgICBjcHVjYXBzID0gIkFsdGlWZWMiOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjcHVjYXBzID0gIkMiOworCisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfSU5GTywgInVzaW5nICVzXG4iLCBjcHVjYXBzKTsKKworICAgICAgICBhdl9sb2coYywgQVZfTE9HX1ZFUkJPU0UsICIlZHglZCAtPiAlZHglZFxuIiwgc3JjVywgc3JjSCwgZHN0VywgZHN0SCk7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAibHVtIHNyY1c9JWQgc3JjSD0lZCBkc3RXPSVkIGRzdEg9JWQgeEluYz0lZCB5SW5jPSVkXG4iLAorICAgICAgICAgICAgICAgYy0+c3JjVywgYy0+c3JjSCwgYy0+ZHN0VywgYy0+ZHN0SCwgYy0+bHVtWEluYywgYy0+bHVtWUluYyk7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiY2hyIHNyY1c9JWQgc3JjSD0lZCBkc3RXPSVkIGRzdEg9JWQgeEluYz0lZCB5SW5jPSVkXG4iLAorICAgICAgICAgICAgICAgYy0+Y2hyU3JjVywgYy0+Y2hyU3JjSCwgYy0+Y2hyRHN0VywgYy0+Y2hyRHN0SCwKKyAgICAgICAgICAgICAgIGMtPmNoclhJbmMsIGMtPmNocllJbmMpOworICAgIH0KKworICAgIC8qIHVuc2NhbGVkIHNwZWNpYWwgY2FzZXMgKi8KKyAgICBpZiAodW5zY2FsZWQgJiYgIXVzZXNIRmlsdGVyICYmICF1c2VzVkZpbHRlciAmJgorICAgICAgICAoYy0+c3JjUmFuZ2UgPT0gYy0+ZHN0UmFuZ2UgfHwgaXNBbnlSR0IoZHN0Rm9ybWF0KSkpIHsKKyAgICAgICAgZmZfZ2V0X3Vuc2NhbGVkX3N3c2NhbGUoYyk7CisKKyAgICAgICAgaWYgKGMtPnN3c2NhbGUpIHsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFNXU19QUklOVF9JTkZPKQorICAgICAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHVuc2NhbGVkICVzIC0+ICVzIHNwZWNpYWwgY29udmVydGVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKHNyY0Zvcm1hdCksIGF2X2dldF9waXhfZm10X25hbWUoZHN0Rm9ybWF0KSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMtPnN3c2NhbGUgPSBmZl9nZXRTd3NGdW5jKGMpOworICAgIHJldHVybiAwOworZmFpbDogLy8gRklYTUUgcmVwbGFjZSB0aGluZ3MgYnkgYXBwcm9wcmlhdGUgZXJyb3IgY29kZXMKKyAgICBpZiAocmV0ID09IFJFVENPREVfVVNFX0NBU0NBREUpICB7CisgICAgICAgIGludCB0bXBXID0gc3FydChzcmNXICogKGludDY0X3QpZHN0Vyk7CisgICAgICAgIGludCB0bXBIID0gc3FydChzcmNIICogKGludDY0X3QpZHN0SCk7CisgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCB0bXBGb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisKKyAgICAgICAgaWYgKHNyY1cqKGludDY0X3Qpc3JjSCA8PSA0TEwqZHN0Vypkc3RIKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICAgICByZXQgPSBhdl9pbWFnZV9hbGxvYyhjLT5jYXNjYWRlZF90bXAsIGMtPmNhc2NhZGVkX3RtcFN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wVywgdG1wSCwgdG1wRm9ybWF0LCA2NCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBjLT5jYXNjYWRlZF9jb250ZXh0WzBdID0gc3dzX2dldENvbnRleHQoc3JjVywgc3JjSCwgc3JjRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wVywgdG1wSCwgdG1wRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHNyY0ZpbHRlciwgTlVMTCwgYy0+cGFyYW0pOworICAgICAgICBpZiAoIWMtPmNhc2NhZGVkX2NvbnRleHRbMF0pCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgYy0+Y2FzY2FkZWRfY29udGV4dFsxXSA9IHN3c19nZXRDb250ZXh0KHRtcFcsIHRtcEgsIHRtcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFcsIGRzdEgsIGRzdEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBOVUxMLCBkc3RGaWx0ZXIsIGMtPnBhcmFtKTsKKyAgICAgICAgaWYgKCFjLT5jYXNjYWRlZF9jb250ZXh0WzFdKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitTd3NDb250ZXh0ICpzd3NfZ2V0Q29udGV4dChpbnQgc3JjVywgaW50IHNyY0gsIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0VywgaW50IGRzdEgsIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIFN3c0ZpbHRlciAqc3JjRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dzRmlsdGVyICpkc3RGaWx0ZXIsIGNvbnN0IGRvdWJsZSAqcGFyYW0pCit7CisgICAgU3dzQ29udGV4dCAqYzsKKworICAgIGlmICghKGMgPSBzd3NfYWxsb2NfY29udGV4dCgpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjLT5mbGFncyAgICAgPSBmbGFnczsKKyAgICBjLT5zcmNXICAgICAgPSBzcmNXOworICAgIGMtPnNyY0ggICAgICA9IHNyY0g7CisgICAgYy0+ZHN0VyAgICAgID0gZHN0VzsKKyAgICBjLT5kc3RIICAgICAgPSBkc3RIOworICAgIGMtPnNyY0Zvcm1hdCA9IHNyY0Zvcm1hdDsKKyAgICBjLT5kc3RGb3JtYXQgPSBkc3RGb3JtYXQ7CisKKyAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgYy0+cGFyYW1bMF0gPSBwYXJhbVswXTsKKyAgICAgICAgYy0+cGFyYW1bMV0gPSBwYXJhbVsxXTsKKyAgICB9CisKKyAgICBpZiAoc3dzX2luaXRfY29udGV4dChjLCBzcmNGaWx0ZXIsIGRzdEZpbHRlcikgPCAwKSB7CisgICAgICAgIHN3c19mcmVlQ29udGV4dChjKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGM7Cit9CisKK1N3c0ZpbHRlciAqc3dzX2dldERlZmF1bHRGaWx0ZXIoZmxvYXQgbHVtYUdCbHVyLCBmbG9hdCBjaHJvbWFHQmx1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbHVtYVNoYXJwZW4sIGZsb2F0IGNocm9tYVNoYXJwZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNocm9tYUhTaGlmdCwgZmxvYXQgY2hyb21hVlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyYm9zZSkKK3sKKyAgICBTd3NGaWx0ZXIgKmZpbHRlciA9IGF2X21hbGxvYyhzaXplb2YoU3dzRmlsdGVyKSk7CisgICAgaWYgKCFmaWx0ZXIpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGx1bWFHQmx1ciAhPSAwLjApIHsKKyAgICAgICAgZmlsdGVyLT5sdW1IID0gc3dzX2dldEdhdXNzaWFuVmVjKGx1bWFHQmx1ciwgMy4wKTsKKyAgICAgICAgZmlsdGVyLT5sdW1WID0gc3dzX2dldEdhdXNzaWFuVmVjKGx1bWFHQmx1ciwgMy4wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWx0ZXItPmx1bUggPSBzd3NfZ2V0SWRlbnRpdHlWZWMoKTsKKyAgICAgICAgZmlsdGVyLT5sdW1WID0gc3dzX2dldElkZW50aXR5VmVjKCk7CisgICAgfQorCisgICAgaWYgKGNocm9tYUdCbHVyICE9IDAuMCkgeworICAgICAgICBmaWx0ZXItPmNockggPSBzd3NfZ2V0R2F1c3NpYW5WZWMoY2hyb21hR0JsdXIsIDMuMCk7CisgICAgICAgIGZpbHRlci0+Y2hyViA9IHN3c19nZXRHYXVzc2lhblZlYyhjaHJvbWFHQmx1ciwgMy4wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWx0ZXItPmNockggPSBzd3NfZ2V0SWRlbnRpdHlWZWMoKTsKKyAgICAgICAgZmlsdGVyLT5jaHJWID0gc3dzX2dldElkZW50aXR5VmVjKCk7CisgICAgfQorCisgICAgaWYgKGNocm9tYVNoYXJwZW4gIT0gMC4wKSB7CisgICAgICAgIFN3c1ZlY3RvciAqaWQgPSBzd3NfZ2V0SWRlbnRpdHlWZWMoKTsKKyAgICAgICAgc3dzX3NjYWxlVmVjKGZpbHRlci0+Y2hySCwgLWNocm9tYVNoYXJwZW4pOworICAgICAgICBzd3Nfc2NhbGVWZWMoZmlsdGVyLT5jaHJWLCAtY2hyb21hU2hhcnBlbik7CisgICAgICAgIHN3c19hZGRWZWMoZmlsdGVyLT5jaHJILCBpZCk7CisgICAgICAgIHN3c19hZGRWZWMoZmlsdGVyLT5jaHJWLCBpZCk7CisgICAgICAgIHN3c19mcmVlVmVjKGlkKTsKKyAgICB9CisKKyAgICBpZiAobHVtYVNoYXJwZW4gIT0gMC4wKSB7CisgICAgICAgIFN3c1ZlY3RvciAqaWQgPSBzd3NfZ2V0SWRlbnRpdHlWZWMoKTsKKyAgICAgICAgc3dzX3NjYWxlVmVjKGZpbHRlci0+bHVtSCwgLWx1bWFTaGFycGVuKTsKKyAgICAgICAgc3dzX3NjYWxlVmVjKGZpbHRlci0+bHVtViwgLWx1bWFTaGFycGVuKTsKKyAgICAgICAgc3dzX2FkZFZlYyhmaWx0ZXItPmx1bUgsIGlkKTsKKyAgICAgICAgc3dzX2FkZFZlYyhmaWx0ZXItPmx1bVYsIGlkKTsKKyAgICAgICAgc3dzX2ZyZWVWZWMoaWQpOworICAgIH0KKworICAgIGlmIChjaHJvbWFIU2hpZnQgIT0gMC4wKQorICAgICAgICBzd3Nfc2hpZnRWZWMoZmlsdGVyLT5jaHJILCAoaW50KShjaHJvbWFIU2hpZnQgKyAwLjUpKTsKKworICAgIGlmIChjaHJvbWFWU2hpZnQgIT0gMC4wKQorICAgICAgICBzd3Nfc2hpZnRWZWMoZmlsdGVyLT5jaHJWLCAoaW50KShjaHJvbWFWU2hpZnQgKyAwLjUpKTsKKworICAgIHN3c19ub3JtYWxpemVWZWMoZmlsdGVyLT5jaHJILCAxLjApOworICAgIHN3c19ub3JtYWxpemVWZWMoZmlsdGVyLT5jaHJWLCAxLjApOworICAgIHN3c19ub3JtYWxpemVWZWMoZmlsdGVyLT5sdW1ILCAxLjApOworICAgIHN3c19ub3JtYWxpemVWZWMoZmlsdGVyLT5sdW1WLCAxLjApOworCisgICAgaWYgKHZlcmJvc2UpCisgICAgICAgIHN3c19wcmludFZlYzIoZmlsdGVyLT5jaHJILCBOVUxMLCBBVl9MT0dfREVCVUcpOworICAgIGlmICh2ZXJib3NlKQorICAgICAgICBzd3NfcHJpbnRWZWMyKGZpbHRlci0+bHVtSCwgTlVMTCwgQVZfTE9HX0RFQlVHKTsKKworICAgIHJldHVybiBmaWx0ZXI7Cit9CisKK1N3c1ZlY3RvciAqc3dzX2FsbG9jVmVjKGludCBsZW5ndGgpCit7CisgICAgU3dzVmVjdG9yICp2ZWM7CisKKyAgICBpZihsZW5ndGggPD0gMCB8fCBsZW5ndGggPiBJTlRfTUFYLyBzaXplb2YoZG91YmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB2ZWMgPSBhdl9tYWxsb2Moc2l6ZW9mKFN3c1ZlY3RvcikpOworICAgIGlmICghdmVjKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2ZWMtPmxlbmd0aCA9IGxlbmd0aDsKKyAgICB2ZWMtPmNvZWZmICA9IGF2X21hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxlbmd0aCk7CisgICAgaWYgKCF2ZWMtPmNvZWZmKQorICAgICAgICBhdl9mcmVlcCgmdmVjKTsKKyAgICByZXR1cm4gdmVjOworfQorCitTd3NWZWN0b3IgKnN3c19nZXRHYXVzc2lhblZlYyhkb3VibGUgdmFyaWFuY2UsIGRvdWJsZSBxdWFsaXR5KQoreworICAgIGNvbnN0IGludCBsZW5ndGggPSAoaW50KSh2YXJpYW5jZSAqIHF1YWxpdHkgKyAwLjUpIHwgMTsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgbWlkZGxlICA9IChsZW5ndGggLSAxKSAqIDAuNTsKKyAgICBTd3NWZWN0b3IgKnZlYzsKKworICAgIGlmKHZhcmlhbmNlIDwgMCB8fCBxdWFsaXR5IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB2ZWMgPSBzd3NfYWxsb2NWZWMobGVuZ3RoKTsKKworICAgIGlmICghdmVjKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBkb3VibGUgZGlzdCA9IGkgLSBtaWRkbGU7CisgICAgICAgIHZlYy0+Y29lZmZbaV0gPSBleHAoLWRpc3QgKiBkaXN0IC8gKDIgKiB2YXJpYW5jZSAqIHZhcmlhbmNlKSkgLworICAgICAgICAgICAgICAgICAgICAgICAgc3FydCgyICogdmFyaWFuY2UgKiBNX1BJKTsKKyAgICB9CisKKyAgICBzd3Nfbm9ybWFsaXplVmVjKHZlYywgMS4wKTsKKworICAgIHJldHVybiB2ZWM7Cit9CisKK1N3c1ZlY3RvciAqc3dzX2dldENvbnN0VmVjKGRvdWJsZSBjLCBpbnQgbGVuZ3RoKQoreworICAgIGludCBpOworICAgIFN3c1ZlY3RvciAqdmVjID0gc3dzX2FsbG9jVmVjKGxlbmd0aCk7CisKKyAgICBpZiAoIXZlYykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIHZlYy0+Y29lZmZbaV0gPSBjOworCisgICAgcmV0dXJuIHZlYzsKK30KKworU3dzVmVjdG9yICpzd3NfZ2V0SWRlbnRpdHlWZWModm9pZCkKK3sKKyAgICByZXR1cm4gc3dzX2dldENvbnN0VmVjKDEuMCwgMSk7Cit9CisKK3N0YXRpYyBkb3VibGUgc3dzX2RjVmVjKFN3c1ZlY3RvciAqYSkKK3sKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgc3VtID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhLT5sZW5ndGg7IGkrKykKKyAgICAgICAgc3VtICs9IGEtPmNvZWZmW2ldOworCisgICAgcmV0dXJuIHN1bTsKK30KKwordm9pZCBzd3Nfc2NhbGVWZWMoU3dzVmVjdG9yICphLCBkb3VibGUgc2NhbGFyKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGEtPmxlbmd0aDsgaSsrKQorICAgICAgICBhLT5jb2VmZltpXSAqPSBzY2FsYXI7Cit9CisKK3ZvaWQgc3dzX25vcm1hbGl6ZVZlYyhTd3NWZWN0b3IgKmEsIGRvdWJsZSBoZWlnaHQpCit7CisgICAgc3dzX3NjYWxlVmVjKGEsIGhlaWdodCAvIHN3c19kY1ZlYyhhKSk7Cit9CisKK3N0YXRpYyBTd3NWZWN0b3IgKnN3c19nZXRDb252VmVjKFN3c1ZlY3RvciAqYSwgU3dzVmVjdG9yICpiKQoreworICAgIGludCBsZW5ndGggPSBhLT5sZW5ndGggKyBiLT5sZW5ndGggLSAxOworICAgIGludCBpLCBqOworICAgIFN3c1ZlY3RvciAqdmVjID0gc3dzX2dldENvbnN0VmVjKDAuMCwgbGVuZ3RoKTsKKworICAgIGlmICghdmVjKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhLT5sZW5ndGg7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYi0+bGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgIHZlYy0+Y29lZmZbaSArIGpdICs9IGEtPmNvZWZmW2ldICogYi0+Y29lZmZbal07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgU3dzVmVjdG9yICpzd3Nfc3VtVmVjKFN3c1ZlY3RvciAqYSwgU3dzVmVjdG9yICpiKQoreworICAgIGludCBsZW5ndGggPSBGRk1BWChhLT5sZW5ndGgsIGItPmxlbmd0aCk7CisgICAgaW50IGk7CisgICAgU3dzVmVjdG9yICp2ZWMgPSBzd3NfZ2V0Q29uc3RWZWMoMC4wLCBsZW5ndGgpOworCisgICAgaWYgKCF2ZWMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IGEtPmxlbmd0aDsgaSsrKQorICAgICAgICB2ZWMtPmNvZWZmW2kgKyAobGVuZ3RoIC0gMSkgLyAyIC0gKGEtPmxlbmd0aCAtIDEpIC8gMl0gKz0gYS0+Y29lZmZbaV07CisgICAgZm9yIChpID0gMDsgaSA8IGItPmxlbmd0aDsgaSsrKQorICAgICAgICB2ZWMtPmNvZWZmW2kgKyAobGVuZ3RoIC0gMSkgLyAyIC0gKGItPmxlbmd0aCAtIDEpIC8gMl0gKz0gYi0+Y29lZmZbaV07CisKKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgU3dzVmVjdG9yICpzd3NfZGlmZlZlYyhTd3NWZWN0b3IgKmEsIFN3c1ZlY3RvciAqYikKK3sKKyAgICBpbnQgbGVuZ3RoID0gRkZNQVgoYS0+bGVuZ3RoLCBiLT5sZW5ndGgpOworICAgIGludCBpOworICAgIFN3c1ZlY3RvciAqdmVjID0gc3dzX2dldENvbnN0VmVjKDAuMCwgbGVuZ3RoKTsKKworICAgIGlmICghdmVjKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhLT5sZW5ndGg7IGkrKykKKyAgICAgICAgdmVjLT5jb2VmZltpICsgKGxlbmd0aCAtIDEpIC8gMiAtIChhLT5sZW5ndGggLSAxKSAvIDJdICs9IGEtPmNvZWZmW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCBiLT5sZW5ndGg7IGkrKykKKyAgICAgICAgdmVjLT5jb2VmZltpICsgKGxlbmd0aCAtIDEpIC8gMiAtIChiLT5sZW5ndGggLSAxKSAvIDJdIC09IGItPmNvZWZmW2ldOworCisgICAgcmV0dXJuIHZlYzsKK30KKworLyogc2hpZnQgbGVmdCAvIG9yIHJpZ2h0IGlmICJzaGlmdCIgaXMgbmVnYXRpdmUgKi8KK3N0YXRpYyBTd3NWZWN0b3IgKnN3c19nZXRTaGlmdGVkVmVjKFN3c1ZlY3RvciAqYSwgaW50IHNoaWZ0KQoreworICAgIGludCBsZW5ndGggPSBhLT5sZW5ndGggKyBGRkFCUyhzaGlmdCkgKiAyOworICAgIGludCBpOworICAgIFN3c1ZlY3RvciAqdmVjID0gc3dzX2dldENvbnN0VmVjKDAuMCwgbGVuZ3RoKTsKKworICAgIGlmICghdmVjKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhLT5sZW5ndGg7IGkrKykgeworICAgICAgICB2ZWMtPmNvZWZmW2kgKyAobGVuZ3RoICAgIC0gMSkgLyAyIC0KKyAgICAgICAgICAgICAgICAgICAgICAgKGEtPmxlbmd0aCAtIDEpIC8gMiAtIHNoaWZ0XSA9IGEtPmNvZWZmW2ldOworICAgIH0KKworICAgIHJldHVybiB2ZWM7Cit9CisKK3ZvaWQgc3dzX3NoaWZ0VmVjKFN3c1ZlY3RvciAqYSwgaW50IHNoaWZ0KQoreworICAgIFN3c1ZlY3RvciAqc2hpZnRlZCA9IHN3c19nZXRTaGlmdGVkVmVjKGEsIHNoaWZ0KTsKKyAgICBhdl9mcmVlKGEtPmNvZWZmKTsKKyAgICBhLT5jb2VmZiAgPSBzaGlmdGVkLT5jb2VmZjsKKyAgICBhLT5sZW5ndGggPSBzaGlmdGVkLT5sZW5ndGg7CisgICAgYXZfZnJlZShzaGlmdGVkKTsKK30KKwordm9pZCBzd3NfYWRkVmVjKFN3c1ZlY3RvciAqYSwgU3dzVmVjdG9yICpiKQoreworICAgIFN3c1ZlY3RvciAqc3VtID0gc3dzX3N1bVZlYyhhLCBiKTsKKyAgICBhdl9mcmVlKGEtPmNvZWZmKTsKKyAgICBhLT5jb2VmZiAgPSBzdW0tPmNvZWZmOworICAgIGEtPmxlbmd0aCA9IHN1bS0+bGVuZ3RoOworICAgIGF2X2ZyZWUoc3VtKTsKK30KKwordm9pZCBzd3Nfc3ViVmVjKFN3c1ZlY3RvciAqYSwgU3dzVmVjdG9yICpiKQoreworICAgIFN3c1ZlY3RvciAqZGlmZiA9IHN3c19kaWZmVmVjKGEsIGIpOworICAgIGF2X2ZyZWUoYS0+Y29lZmYpOworICAgIGEtPmNvZWZmICA9IGRpZmYtPmNvZWZmOworICAgIGEtPmxlbmd0aCA9IGRpZmYtPmxlbmd0aDsKKyAgICBhdl9mcmVlKGRpZmYpOworfQorCit2b2lkIHN3c19jb252VmVjKFN3c1ZlY3RvciAqYSwgU3dzVmVjdG9yICpiKQoreworICAgIFN3c1ZlY3RvciAqY29udiA9IHN3c19nZXRDb252VmVjKGEsIGIpOworICAgIGF2X2ZyZWUoYS0+Y29lZmYpOworICAgIGEtPmNvZWZmICA9IGNvbnYtPmNvZWZmOworICAgIGEtPmxlbmd0aCA9IGNvbnYtPmxlbmd0aDsKKyAgICBhdl9mcmVlKGNvbnYpOworfQorCitTd3NWZWN0b3IgKnN3c19jbG9uZVZlYyhTd3NWZWN0b3IgKmEpCit7CisgICAgU3dzVmVjdG9yICp2ZWMgPSBzd3NfYWxsb2NWZWMoYS0+bGVuZ3RoKTsKKworICAgIGlmICghdmVjKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1lbWNweSh2ZWMtPmNvZWZmLCBhLT5jb2VmZiwgYS0+bGVuZ3RoICogc2l6ZW9mKCphLT5jb2VmZikpOworCisgICAgcmV0dXJuIHZlYzsKK30KKwordm9pZCBzd3NfcHJpbnRWZWMyKFN3c1ZlY3RvciAqYSwgQVZDbGFzcyAqbG9nX2N0eCwgaW50IGxvZ19sZXZlbCkKK3sKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgbWF4ID0gMDsKKyAgICBkb3VibGUgbWluID0gMDsKKyAgICBkb3VibGUgcmFuZ2U7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYS0+bGVuZ3RoOyBpKyspCisgICAgICAgIGlmIChhLT5jb2VmZltpXSA+IG1heCkKKyAgICAgICAgICAgIG1heCA9IGEtPmNvZWZmW2ldOworCisgICAgZm9yIChpID0gMDsgaSA8IGEtPmxlbmd0aDsgaSsrKQorICAgICAgICBpZiAoYS0+Y29lZmZbaV0gPCBtaW4pCisgICAgICAgICAgICBtaW4gPSBhLT5jb2VmZltpXTsKKworICAgIHJhbmdlID0gbWF4IC0gbWluOworCisgICAgZm9yIChpID0gMDsgaSA8IGEtPmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGludCB4ID0gKGludCkoKGEtPmNvZWZmW2ldIC0gbWluKSAqIDYwLjAgLyByYW5nZSArIDAuNSk7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBsb2dfbGV2ZWwsICIlMS4zZiAiLCBhLT5jb2VmZltpXSk7CisgICAgICAgIGZvciAoOyB4ID4gMDsgeC0tKQorICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIGxvZ19sZXZlbCwgIiAiKTsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIGxvZ19sZXZlbCwgInxcbiIpOworICAgIH0KK30KKwordm9pZCBzd3NfZnJlZVZlYyhTd3NWZWN0b3IgKmEpCit7CisgICAgaWYgKCFhKQorICAgICAgICByZXR1cm47CisgICAgYXZfZnJlZXAoJmEtPmNvZWZmKTsKKyAgICBhLT5sZW5ndGggPSAwOworICAgIGF2X2ZyZWUoYSk7Cit9CisKK3ZvaWQgc3dzX2ZyZWVGaWx0ZXIoU3dzRmlsdGVyICpmaWx0ZXIpCit7CisgICAgaWYgKCFmaWx0ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIHN3c19mcmVlVmVjKGZpbHRlci0+bHVtSCk7CisgICAgc3dzX2ZyZWVWZWMoZmlsdGVyLT5sdW1WKTsKKyAgICBzd3NfZnJlZVZlYyhmaWx0ZXItPmNockgpOworICAgIHN3c19mcmVlVmVjKGZpbHRlci0+Y2hyVik7CisgICAgYXZfZnJlZShmaWx0ZXIpOworfQorCit2b2lkIHN3c19mcmVlQ29udGV4dChTd3NDb250ZXh0ICpjKQoreworICAgIGludCBpOworICAgIGlmICghYykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGMtPmx1bVBpeEJ1ZikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+dkx1bUJ1ZlNpemU7IGkrKykKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZjLT5sdW1QaXhCdWZbaV0pOworICAgICAgICBhdl9mcmVlcCgmYy0+bHVtUGl4QnVmKTsKKyAgICB9CisKKyAgICBpZiAoYy0+Y2hyVVBpeEJ1ZikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+dkNockJ1ZlNpemU7IGkrKykKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZjLT5jaHJVUGl4QnVmW2ldKTsKKyAgICAgICAgYXZfZnJlZXAoJmMtPmNoclVQaXhCdWYpOworICAgICAgICBhdl9mcmVlcCgmYy0+Y2hyVlBpeEJ1Zik7CisgICAgfQorCisgICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+dkx1bUJ1ZlNpemU7IGkrKykKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZjLT5hbHBQaXhCdWZbaV0pOworICAgICAgICBhdl9mcmVlcCgmYy0+YWxwUGl4QnVmKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmYy0+ZGl0aGVyX2Vycm9yW2ldKTsKKworICAgIGF2X2ZyZWVwKCZjLT52THVtRmlsdGVyKTsKKyAgICBhdl9mcmVlcCgmYy0+dkNockZpbHRlcik7CisgICAgYXZfZnJlZXAoJmMtPmhMdW1GaWx0ZXIpOworICAgIGF2X2ZyZWVwKCZjLT5oQ2hyRmlsdGVyKTsKKyNpZiBIQVZFX0FMVElWRUMKKyAgICBhdl9mcmVlcCgmYy0+dllDb2VmZnNCYW5rKTsKKyAgICBhdl9mcmVlcCgmYy0+dkNDb2VmZnNCYW5rKTsKKyNlbmRpZgorCisgICAgYXZfZnJlZXAoJmMtPnZMdW1GaWx0ZXJQb3MpOworICAgIGF2X2ZyZWVwKCZjLT52Q2hyRmlsdGVyUG9zKTsKKyAgICBhdl9mcmVlcCgmYy0+aEx1bUZpbHRlclBvcyk7CisgICAgYXZfZnJlZXAoJmMtPmhDaHJGaWx0ZXJQb3MpOworCisjaWYgSEFWRV9NTVhfSU5MSU5FCisjaWYgVVNFX01NQVAKKyAgICBpZiAoYy0+bHVtTW14ZXh0RmlsdGVyQ29kZSkKKyAgICAgICAgbXVubWFwKGMtPmx1bU1teGV4dEZpbHRlckNvZGUsIGMtPmx1bU1teGV4dEZpbHRlckNvZGVTaXplKTsKKyAgICBpZiAoYy0+Y2hyTW14ZXh0RmlsdGVyQ29kZSkKKyAgICAgICAgbXVubWFwKGMtPmNock1teGV4dEZpbHRlckNvZGUsIGMtPmNock1teGV4dEZpbHRlckNvZGVTaXplKTsKKyNlbGlmIEhBVkVfVklSVFVBTEFMTE9DCisgICAgaWYgKGMtPmx1bU1teGV4dEZpbHRlckNvZGUpCisgICAgICAgIFZpcnR1YWxGcmVlKGMtPmx1bU1teGV4dEZpbHRlckNvZGUsIDAsIE1FTV9SRUxFQVNFKTsKKyAgICBpZiAoYy0+Y2hyTW14ZXh0RmlsdGVyQ29kZSkKKyAgICAgICAgVmlydHVhbEZyZWUoYy0+Y2hyTW14ZXh0RmlsdGVyQ29kZSwgMCwgTUVNX1JFTEVBU0UpOworI2Vsc2UKKyAgICBhdl9mcmVlKGMtPmx1bU1teGV4dEZpbHRlckNvZGUpOworICAgIGF2X2ZyZWUoYy0+Y2hyTW14ZXh0RmlsdGVyQ29kZSk7CisjZW5kaWYKKyAgICBjLT5sdW1NbXhleHRGaWx0ZXJDb2RlID0gTlVMTDsKKyAgICBjLT5jaHJNbXhleHRGaWx0ZXJDb2RlID0gTlVMTDsKKyNlbmRpZiAvKiBIQVZFX01NWF9JTkxJTkUgKi8KKworICAgIGF2X2ZyZWVwKCZjLT55dXZUYWJsZSk7CisgICAgYXZfZnJlZXAoJmMtPmZvcm1hdENvbnZCdWZmZXIpOworCisgICAgc3dzX2ZyZWVDb250ZXh0KGMtPmNhc2NhZGVkX2NvbnRleHRbMF0pOworICAgIHN3c19mcmVlQ29udGV4dChjLT5jYXNjYWRlZF9jb250ZXh0WzFdKTsKKyAgICBtZW1zZXQoYy0+Y2FzY2FkZWRfY29udGV4dCwgMCwgc2l6ZW9mKGMtPmNhc2NhZGVkX2NvbnRleHQpKTsKKyAgICBhdl9mcmVlcCgmYy0+Y2FzY2FkZWRfdG1wWzBdKTsKKworICAgIGF2X2ZyZWUoYyk7Cit9CisKK3N0cnVjdCBTd3NDb250ZXh0ICpzd3NfZ2V0Q2FjaGVkQ29udGV4dChzdHJ1Y3QgU3dzQ29udGV4dCAqY29udGV4dCwgaW50IHNyY1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY0gsIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFcsIGludCBkc3RILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXQsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd3NGaWx0ZXIgKnNyY0ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd3NGaWx0ZXIgKmRzdEZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKnBhcmFtKQoreworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgZGVmYXVsdF9wYXJhbVsyXSA9IHsgU1dTX1BBUkFNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1NfUEFSQU1fREVGQVVMVCB9OworCisgICAgaWYgKCFwYXJhbSkKKyAgICAgICAgcGFyYW0gPSBkZWZhdWx0X3BhcmFtOworCisgICAgaWYgKGNvbnRleHQgJiYKKyAgICAgICAgKGNvbnRleHQtPnNyY1cgICAgICAhPSBzcmNXICAgICAgfHwKKyAgICAgICAgIGNvbnRleHQtPnNyY0ggICAgICAhPSBzcmNIICAgICAgfHwKKyAgICAgICAgIGNvbnRleHQtPnNyY0Zvcm1hdCAhPSBzcmNGb3JtYXQgfHwKKyAgICAgICAgIGNvbnRleHQtPmRzdFcgICAgICAhPSBkc3RXICAgICAgfHwKKyAgICAgICAgIGNvbnRleHQtPmRzdEggICAgICAhPSBkc3RIICAgICAgfHwKKyAgICAgICAgIGNvbnRleHQtPmRzdEZvcm1hdCAhPSBkc3RGb3JtYXQgfHwKKyAgICAgICAgIGNvbnRleHQtPmZsYWdzICAgICAhPSBmbGFncyAgICAgfHwKKyAgICAgICAgIGNvbnRleHQtPnBhcmFtWzBdICAhPSBwYXJhbVswXSAgfHwKKyAgICAgICAgIGNvbnRleHQtPnBhcmFtWzFdICAhPSBwYXJhbVsxXSkpIHsKKyAgICAgICAgc3dzX2ZyZWVDb250ZXh0KGNvbnRleHQpOworICAgICAgICBjb250ZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIWNvbnRleHQpIHsKKyAgICAgICAgaWYgKCEoY29udGV4dCA9IHN3c19hbGxvY19jb250ZXh0KCkpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNvbnRleHQtPnNyY1cgICAgICA9IHNyY1c7CisgICAgICAgIGNvbnRleHQtPnNyY0ggICAgICA9IHNyY0g7CisgICAgICAgIGNvbnRleHQtPnNyY0Zvcm1hdCA9IHNyY0Zvcm1hdDsKKyAgICAgICAgY29udGV4dC0+ZHN0VyAgICAgID0gZHN0VzsKKyAgICAgICAgY29udGV4dC0+ZHN0SCAgICAgID0gZHN0SDsKKyAgICAgICAgY29udGV4dC0+ZHN0Rm9ybWF0ID0gZHN0Rm9ybWF0OworICAgICAgICBjb250ZXh0LT5mbGFncyAgICAgPSBmbGFnczsKKyAgICAgICAgY29udGV4dC0+cGFyYW1bMF0gID0gcGFyYW1bMF07CisgICAgICAgIGNvbnRleHQtPnBhcmFtWzFdICA9IHBhcmFtWzFdOworICAgICAgICBpZiAoc3dzX2luaXRfY29udGV4dChjb250ZXh0LCBzcmNGaWx0ZXIsIGRzdEZpbHRlcikgPCAwKSB7CisgICAgICAgICAgICBzd3NfZnJlZUNvbnRleHQoY29udGV4dCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY29udGV4dDsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL3ZlcnNpb24uaCBiL2ZmbXBlZy9saWJzd3NjYWxlL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhjNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUvdmVyc2lvbi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBTV1NDQUxFX1ZFUlNJT05fSAorI2RlZmluZSBTV1NDQUxFX1ZFUlNJT05fSAorCisvKioKKyAqIEBmaWxlCisgKiBzd3NjYWxlIHZlcnNpb24gbWFjcm9zCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC92ZXJzaW9uLmgiCisKKyNkZWZpbmUgTElCU1dTQ0FMRV9WRVJTSU9OX01BSk9SIDMKKyNkZWZpbmUgTElCU1dTQ0FMRV9WRVJTSU9OX01JTk9SIDEKKyNkZWZpbmUgTElCU1dTQ0FMRV9WRVJTSU9OX01JQ1JPIDEwMQorCisjZGVmaW5lIExJQlNXU0NBTEVfVkVSU0lPTl9JTlQgIEFWX1ZFUlNJT05fSU5UKExJQlNXU0NBTEVfVkVSU0lPTl9NQUpPUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJTV1NDQUxFX1ZFUlNJT05fTUlOT1IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCU1dTQ0FMRV9WRVJTSU9OX01JQ1JPKQorI2RlZmluZSBMSUJTV1NDQUxFX1ZFUlNJT04gICAgICBBVl9WRVJTSU9OKExJQlNXU0NBTEVfVkVSU0lPTl9NQUpPUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlNXU0NBTEVfVkVSU0lPTl9NSU5PUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlNXU0NBTEVfVkVSU0lPTl9NSUNSTykKKyNkZWZpbmUgTElCU1dTQ0FMRV9CVUlMRCAgICAgICAgTElCU1dTQ0FMRV9WRVJTSU9OX0lOVAorCisjZGVmaW5lIExJQlNXU0NBTEVfSURFTlQgICAgICAgICJTd1MiIEFWX1NUUklOR0lGWShMSUJTV1NDQUxFX1ZFUlNJT04pCisKKy8qKgorICogRkZfQVBJXyogZGVmaW5lcyBtYXkgYmUgcGxhY2VkIGJlbG93IHRvIGluZGljYXRlIHB1YmxpYyBBUEkgdGhhdCB3aWxsIGJlCisgKiBkcm9wcGVkIGF0IGEgZnV0dXJlIHZlcnNpb24gYnVtcC4gVGhlIGRlZmluZXMgdGhlbXNlbHZlcyBhcmUgbm90IHBhcnQgb2YKKyAqIHRoZSBwdWJsaWMgQVBJIGFuZCBtYXkgY2hhbmdlLCBicmVhayBvciBkaXNhcHBlYXIgYXQgYW55IHRpbWUuCisgKi8KKworI2lmbmRlZiBGRl9BUElfU1dTX0NQVV9DQVBTCisjZGVmaW5lIEZGX0FQSV9TV1NfQ1BVX0NBUFMgICAgKExJQlNXU0NBTEVfVkVSU0lPTl9NQUpPUiA8IDQpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0FSQ0hfQkZJTgorI2RlZmluZSBGRl9BUElfQVJDSF9CRklOICAgICAgIChMSUJTV1NDQUxFX1ZFUlNJT05fTUFKT1IgPCA0KQorI2VuZGlmCisKKyNlbmRpZiAvKiBTV1NDQUxFX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUveDg2L01ha2VmaWxlIGIvZmZtcGVnL2xpYnN3c2NhbGUveDg2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MDEyMDcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS94ODYvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorJChTVUJESVIpeDg2L3N3c2NhbGVfbW14Lm86IENGTEFHUyArPSAkKE5PUkVEWk9ORV9GTEFHUykKKworT0JKUyAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSB4ODYvcmdiMnJnYi5vICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvc3dzY2FsZS5vICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYveXV2MnJnYi5vICAgICAgICAgICAgICAgICAgICAgICAgXAorCitNTVgtT0JKUyAgICAgICAgICAgICAgICAgICAgICAgICs9IHg4Ni9oc2NhbGVfZmFzdF9iaWxpbmVhcl9zaW1kLm8gICAgICBcCisKK09CSlMtJChDT05GSUdfWE1NX0NMT0JCRVJfVEVTVCkgKz0geDg2L3c2NHhtbXRlc3QubworCitZQVNNLU9CSlMgICAgICAgICAgICAgICAgICAgICAgICs9IHg4Ni9pbnB1dC5vICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9vdXRwdXQubyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9zY2FsZS5vICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS94ODYvaHNjYWxlX2Zhc3RfYmlsaW5lYXJfc2ltZC5jIGIvZmZtcGVnL2xpYnN3c2NhbGUveDg2L2hzY2FsZV9mYXN0X2JpbGluZWFyX3NpbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDM3OTNkCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUveDg2L2hzY2FsZV9mYXN0X2JpbGluZWFyX3NpbWQuYwpAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICIuLi9zd3NjYWxlX2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorCisjZGVmaW5lIFJFVCAweEMzIC8vIG5lYXIgcmV0dXJuIG9wY29kZSBmb3IgeDg2CisjZGVmaW5lIFBSRUZFVENIICJwcmVmZXRjaG50YSIKKworI2lmIEhBVkVfSU5MSU5FX0FTTQorYXZfY29sZCBpbnQgZmZfaW5pdF9oc2NhbGVyX21teGV4dChpbnQgZHN0VywgaW50IHhJbmMsIHVpbnQ4X3QgKmZpbHRlckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpmaWx0ZXIsIGludDMyX3QgKmZpbHRlclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1TcGxpdHMpCit7CisgICAgdWludDhfdCAqZnJhZ21lbnRBOworICAgIHg4Nl9yZWcgaW1tOE9mUFNodWZXMUE7CisgICAgeDg2X3JlZyBpbW04T2ZQU2h1ZlcyQTsKKyAgICB4ODZfcmVnIGZyYWdtZW50TGVuZ3RoQTsKKyAgICB1aW50OF90ICpmcmFnbWVudEI7CisgICAgeDg2X3JlZyBpbW04T2ZQU2h1ZlcxQjsKKyAgICB4ODZfcmVnIGltbThPZlBTaHVmVzJCOworICAgIHg4Nl9yZWcgZnJhZ21lbnRMZW5ndGhCOworICAgIGludCBmcmFnbWVudFBvczsKKworICAgIGludCB4cG9zLCBpOworCisgICAgLy8gY3JlYXRlIGFuIG9wdGltaXplZCBob3Jpem9udGFsIHNjYWxpbmcgcm91dGluZQorICAgIC8qIFRoaXMgc2NhbGVyIGlzIG1hZGUgb2YgcnVudGltZS1nZW5lcmF0ZWQgTU1YRVhUIGNvZGUgdXNpbmcgc3BlY2lhbGx5IHR1bmVkCisgICAgICogcHNodWZ3IGluc3RydWN0aW9ucy4gRm9yIGV2ZXJ5IGZvdXIgb3V0cHV0IHBpeGVscywgaWYgZm91ciBpbnB1dCBwaXhlbHMKKyAgICAgKiBhcmUgZW5vdWdoIGZvciB0aGUgZmFzdCBiaWxpbmVhciBzY2FsaW5nLCB0aGVuIGEgY2h1bmsgb2YgZnJhZ21lbnRCIGlzCisgICAgICogdXNlZC4gSWYgZml2ZSBpbnB1dCBwaXhlbHMgYXJlIG5lZWRlZCwgdGhlbiBhIGNodW5rIG9mIGZyYWdtZW50QSBpcyB1c2VkLgorICAgICAqLworCisgICAgLy8gY29kZSBmcmFnbWVudAorCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJqbXAgICAgICAgICAgICAgICAgICAgICAgICAgOWYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vIEJlZ2luCisgICAgICAgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICglJSJSRUdfZCIsICUlIlJFR19hIiksICUlbW0zICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICAgICglJSJSRUdfYyIsICUlIlJFR19TIiksICUlbW0wICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICAgMSglJSJSRUdfYyIsICUlIlJFR19TIiksICUlbW0xICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0xICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0wICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZncgICAgICAgICAgICAgICAgICAgJDB4RkYsICUlbW0xLCAlJW1tMSAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZncgICAgICAgICAgICAgICAgICAgJDB4RkYsICUlbW0wLCAlJW1tMCAgIFxuXHQiCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidyAgICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZsICAgOCglJSJSRUdfYiIsICUlIlJFR19hIiksICUlZXNpICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbHcgICAgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0wICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2xsdyAgICAgICAgICAgICAgICAgICAgICAgJDcsICUlbW0xICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICAlJW1tMCwgKCUlIlJFR19EIiwgJSUiUkVHX2EiKSBcblx0IgorCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgJDgsICUlIlJFR19hIiAgICAgIFxuXHQiCisgICAgICAgIC8vIEVuZAorICAgICAgICAiOTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAvLyAiaW50ICQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICAgICAgICIgTE9DQUxfTUFOR0xFKDBiKSAiLCAlMCAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICAgICAgICIgTE9DQUxfTUFOR0xFKDFiKSAiLCAlMSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICAgICAgICIgTE9DQUxfTUFOR0xFKDJiKSAiLCAlMiAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGVjICAgICAgICAgICAgICAgICAgICAgICAgICUxICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGVjICAgICAgICAgICAgICAgICAgICAgICAgICUyICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICAgICAgICAgICAgICAgICAgICAgICAgICUwLCAlMSAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICAgICAgICAgICAgICAgICAgICAgICAgICUwLCAlMiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICAgICAgICIgTE9DQUxfTUFOR0xFKDliKSAiLCAlMyAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICAgICAgICAgICAgICAgICAgICAgICAgICUwLCAlMyAgICAgICAgICAgICBcblx0IgorCisKKyAgICAgICAgOiAiPXIiIChmcmFnbWVudEEpLCAiPXIiIChpbW04T2ZQU2h1ZlcxQSksICI9ciIgKGltbThPZlBTaHVmVzJBKSwKKyAgICAgICAgICAiPXIiIChmcmFnbWVudExlbmd0aEEpCisgICAgICAgICk7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImptcCAgICAgICAgICAgICAgICAgICAgICAgICA5ZiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLy8gQmVnaW4KKyAgICAgICAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgKCUlIlJFR19kIiwgJSUiUkVHX2EiKSwgJSVtbTMgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgICAgKCUlIlJFR19jIiwgJSUiUkVHX1MiKSwgJSVtbTAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmdyAgICAgICAgICAgICAgICAgICAkMHhGRiwgJSVtbTAsICUlbW0xICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmdyAgICAgICAgICAgICAgICAgICAkMHhGRiwgJSVtbTAsICUlbW0wICAgXG5cdCIKKyAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ3ICAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmwgICA4KCUlIlJFR19iIiwgJSUiUkVHX2EiKSwgJSVlc2kgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsdyAgICAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzbGx3ICAgICAgICAgICAgICAgICAgICAgICAkNywgJSVtbTEgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTAgICAgICAgICAgXG5cdCIKKworICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgICUlbW0wLCAoJSUiUkVHX0QiLCAlJSJSRUdfYSIpIFxuXHQiCisKKyAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgICAkOCwgJSUiUkVHX2EiICAgICAgXG5cdCIKKyAgICAgICAgLy8gRW5kCisgICAgICAgICI5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vICJpbnQgICAgICAgICAgICAgICAgICAgICAgICQzICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgICAgICAgIiBMT0NBTF9NQU5HTEUoMGIpICIsICUwICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgICAgICAgIiBMT0NBTF9NQU5HTEUoMWIpICIsICUxICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgICAgICAgIiBMT0NBTF9NQU5HTEUoMmIpICIsICUyICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkZWMgICAgICAgICAgICAgICAgICAgICAgICAgJTEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkZWMgICAgICAgICAgICAgICAgICAgICAgICAgJTIgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgICAgICAgICAgICAgICAgICAgICAgJTAsICUxICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgICAgICAgICAgICAgICAgICAgICAgJTAsICUyICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgICAgICAgIiBMT0NBTF9NQU5HTEUoOWIpICIsICUzICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgICAgICAgICAgICAgICAgICAgICAgICAgJTAsICUzICAgICAgICAgICAgIFxuXHQiCisKKworICAgICAgICA6ICI9ciIgKGZyYWdtZW50QiksICI9ciIgKGltbThPZlBTaHVmVzFCKSwgIj1yIiAoaW1tOE9mUFNodWZXMkIpLAorICAgICAgICAgICI9ciIgKGZyYWdtZW50TGVuZ3RoQikKKyAgICAgICAgKTsKKworICAgIHhwb3MgICAgICAgID0gMDsgLy8gbHVtWEluYy8yIC0gMHg4MDAwOyAvLyBkaWZmZXJlbmNlIGJldHdlZW4gcGl4ZWwgY2VudGVycworICAgIGZyYWdtZW50UG9zID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkc3RXIC8gbnVtU3BsaXRzOyBpKyspIHsKKyAgICAgICAgaW50IHh4ID0geHBvcyA+PiAxNjsKKworICAgICAgICBpZiAoKGkgJiAzKSA9PSAwKSB7CisgICAgICAgICAgICBpbnQgYSAgICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgICAgIGludCBiICAgICAgICAgICAgICAgICAgPSAoKHhwb3MgKyB4SW5jKSA+PiAxNikgLSB4eDsKKyAgICAgICAgICAgIGludCBjICAgICAgICAgICAgICAgICAgPSAoKHhwb3MgKyB4SW5jICogMikgPj4gMTYpIC0geHg7CisgICAgICAgICAgICBpbnQgZCAgICAgICAgICAgICAgICAgID0gKCh4cG9zICsgeEluYyAqIDMpID4+IDE2KSAtIHh4OworICAgICAgICAgICAgaW50IGluYyAgICAgICAgICAgICAgICA9IChkICsgMSA8IDQpOworICAgICAgICAgICAgdWludDhfdCAqZnJhZ21lbnQgICAgICA9IGluYyA/IGZyYWdtZW50QiA6IGZyYWdtZW50QTsKKyAgICAgICAgICAgIHg4Nl9yZWcgaW1tOE9mUFNodWZXMSAgPSBpbmMgPyBpbW04T2ZQU2h1ZlcxQiA6IGltbThPZlBTaHVmVzFBOworICAgICAgICAgICAgeDg2X3JlZyBpbW04T2ZQU2h1ZlcyICA9IGluYyA/IGltbThPZlBTaHVmVzJCIDogaW1tOE9mUFNodWZXMkE7CisgICAgICAgICAgICB4ODZfcmVnIGZyYWdtZW50TGVuZ3RoID0gaW5jID8gZnJhZ21lbnRMZW5ndGhCIDogZnJhZ21lbnRMZW5ndGhBOworICAgICAgICAgICAgaW50IG1heFNoaWZ0ICAgICAgICAgICA9IDMgLSAoZCArIGluYyk7CisgICAgICAgICAgICBpbnQgc2hpZnQgICAgICAgICAgICAgID0gMDsKKworICAgICAgICAgICAgaWYgKGZpbHRlckNvZGUpIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJbaV0gICAgICAgID0gKCh4cG9zICAgICAgICAgICAgICAmIDB4RkZGRikgXiAweEZGRkYpID4+IDk7CisgICAgICAgICAgICAgICAgZmlsdGVyW2kgKyAxXSAgICA9ICgoKHhwb3MgKyB4SW5jKSAgICAgJiAweEZGRkYpIF4gMHhGRkZGKSA+PiA5OworICAgICAgICAgICAgICAgIGZpbHRlcltpICsgMl0gICAgPSAoKCh4cG9zICsgeEluYyAqIDIpICYgMHhGRkZGKSBeIDB4RkZGRikgPj4gOTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJbaSArIDNdICAgID0gKCgoeHBvcyArIHhJbmMgKiAzKSAmIDB4RkZGRikgXiAweEZGRkYpID4+IDk7CisgICAgICAgICAgICAgICAgZmlsdGVyUG9zW2kgLyAyXSA9IHh4OworCisgICAgICAgICAgICAgICAgbWVtY3B5KGZpbHRlckNvZGUgKyBmcmFnbWVudFBvcywgZnJhZ21lbnQsIGZyYWdtZW50TGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIGZpbHRlckNvZGVbZnJhZ21lbnRQb3MgKyBpbW04T2ZQU2h1ZlcxXSA9ICAoYSArIGluYykgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYiArIGluYykgPDwgMikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyArIGluYykgPDwgNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZCArIGluYykgPDwgNik7CisgICAgICAgICAgICAgICAgZmlsdGVyQ29kZVtmcmFnbWVudFBvcyArIGltbThPZlBTaHVmVzJdID0gIGEgfCAoYiA8PCAyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA8PCA0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZCA8PCA2KTsKKworICAgICAgICAgICAgICAgIGlmIChpICsgNCAtIGluYyA+PSBkc3RXKQorICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IG1heFNoaWZ0OyAgICAgICAgICAgICAgIC8vIGF2b2lkIG92ZXJyZWFkCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGZpbHRlclBvc1tpIC8gMl0gJiAzKSA8PSBtYXhTaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSBmaWx0ZXJQb3NbaSAvIDJdICYgMzsgICAvLyBhbGlnbgorCisgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ICYmIGkgPj0gc2hpZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ29kZVtmcmFnbWVudFBvcyArIGltbThPZlBTaHVmVzFdICs9IDB4NTUgKiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ29kZVtmcmFnbWVudFBvcyArIGltbThPZlBTaHVmVzJdICs9IDB4NTUgKiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyUG9zW2kgLyAyXSAgICAgICAgICAgICAgICAgICAgICAgIC09IHNoaWZ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnJhZ21lbnRQb3MgKz0gZnJhZ21lbnRMZW5ndGg7CisKKyAgICAgICAgICAgIGlmIChmaWx0ZXJDb2RlKQorICAgICAgICAgICAgICAgIGZpbHRlckNvZGVbZnJhZ21lbnRQb3NdID0gUkVUOworICAgICAgICB9CisgICAgICAgIHhwb3MgKz0geEluYzsKKyAgICB9CisgICAgaWYgKGZpbHRlckNvZGUpCisgICAgICAgIGZpbHRlclBvc1soKGkgLyAyKSArIDEpICYgKH4xKV0gPSB4cG9zID4+IDE2OyAgLy8gbmVlZGVkIHRvIGp1bXAgdG8gdGhlIG5leHQgcGFydAorCisgICAgcmV0dXJuIGZyYWdtZW50UG9zICsgMTsKK30KKwordm9pZCBmZl9oeXNjYWxlX2Zhc3RfbW14ZXh0KFN3c0NvbnRleHQgKmMsIGludDE2X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RXaWR0aCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1csIGludCB4SW5jKQoreworICAgIGludDMyX3QgKmZpbHRlclBvcyA9IGMtPmhMdW1GaWx0ZXJQb3M7CisgICAgaW50MTZfdCAqZmlsdGVyICAgID0gYy0+aEx1bUZpbHRlcjsKKyAgICB2b2lkICAgICptbXhleHRGaWx0ZXJDb2RlID0gYy0+bHVtTW14ZXh0RmlsdGVyQ29kZTsKKyAgICBpbnQgaTsKKyNpZiBkZWZpbmVkKFBJQykKKyAgICB1aW50NjRfdCBlYnhzYXZlOworI2VuZGlmCisjaWYgQVJDSF9YODZfNjQKKyAgICB1aW50NjRfdCByZXRzYXZlOworI2VuZGlmCisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorI2lmIGRlZmluZWQoUElDKQorICAgICAgICAibW92ICAgICAgICAgICAgICAgJSUiUkVHX2IiLCAlNSAgICAgICAgXG5cdCIKKyNpZiBBUkNIX1g4Nl82NAorICAgICAgICAibW92ICAgICAgICAgICAgICAgLTgoJSVyc3ApLCAlJSJSRUdfYSIgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICUlIlJFR19hIiwgJTYgICAgICAgIFxuXHQiCisjZW5kaWYKKyNlbHNlCisjaWYgQVJDSF9YODZfNjQKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgIC04KCUlcnNwKSwgJSUiUkVHX2EiIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAlJSJSRUdfYSIsICU1ICAgICAgICBcblx0IgorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgInB4b3IgICAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTcgICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgJTAsICUlIlJFR19jIiBcblx0IgorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICUxLCAlJSJSRUdfRCIgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAlMiwgJSUiUkVHX2QiIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgJTMsICUlIlJFR19iIiBcblx0IgorICAgICAgICAieG9yICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgXG5cdCIgLy8gaQorICAgICAgICBQUkVGRVRDSCIgICAgICAgICglJSJSRUdfYyIpICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFJFRkVUQ0giICAgICAgMzIoJSUiUkVHX2MiKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBSRUZFVENIIiAgICAgIDY0KCUlIlJFR19jIikgICAgICAgICAgICBcblx0IgorCisjaWYgQVJDSF9YODZfNjQKKyNkZWZpbmUgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUgXAorICAgICAgICAibW92bCAgICAgICAgICAgICglJSJSRUdfYiIpLCAlJWVzaSAgICAgXG5cdCJcCisgICAgICAgICJjYWxsICAgICAgICAgICAgICAgICAgICAqJTQgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmwgKCUlIlJFR19iIiwgJSUiUkVHX2EiKSwgJSVlc2kgICAgIFxuXHQiXAorICAgICAgICAiYWRkICAgICAgICAgICAgICAgJSUiUkVHX1MiLCAlJSJSRUdfYyIgXG5cdCJcCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAlJSJSRUdfYSIsICUlIlJFR19EIiBcblx0IlwKKyAgICAgICAgInhvciAgICAgICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX2EiIFxuXHQiXAorCisjZWxzZQorI2RlZmluZSBDQUxMX01NWEVYVF9GSUxURVJfQ09ERSBcCisgICAgICAgICJtb3ZsICglJSJSRUdfYiIpLCAlJWVzaSAgICAgICAgXG5cdCJcCisgICAgICAgICJjYWxsICAgICAgICAgKiU0ICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImFkZGwgKCUlIlJFR19iIiwgJSUiUkVHX2EiKSwgJSUiUkVHX2MiIFxuXHQiXAorICAgICAgICAiYWRkICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfRCIgXG5cdCJcCisgICAgICAgICJ4b3IgICAgICAgICAgICAgICAlJSJSRUdfYSIsICUlIlJFR19hIiBcblx0IlwKKworI2VuZGlmIC8qIEFSQ0hfWDg2XzY0ICovCisKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKworI2lmIGRlZmluZWQoUElDKQorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICU1LCAlJSJSRUdfYiIgXG5cdCIKKyNpZiBBUkNIX1g4Nl82NAorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICU2LCAlJSJSRUdfYSIgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICUlIlJFR19hIiwgLTgoJSVyc3ApIFxuXHQiCisjZW5kaWYKKyNlbHNlCisjaWYgQVJDSF9YODZfNjQKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAlNSwgJSUiUkVHX2EiIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAlJSJSRUdfYSIsIC04KCUlcnNwKSBcblx0IgorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgOjogIm0iIChzcmMpLCAibSIgKGRzdCksICJtIiAoZmlsdGVyKSwgIm0iIChmaWx0ZXJQb3MpLAorICAgICAgICAgICAibSIgKG1teGV4dEZpbHRlckNvZGUpCisjaWYgZGVmaW5lZChQSUMpCisgICAgICAgICAgLCJtIiAoZWJ4c2F2ZSkKKyNlbmRpZgorI2lmIEFSQ0hfWDg2XzY0CisgICAgICAgICAgLCJtIihyZXRzYXZlKQorI2VuZGlmCisgICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19jLCAiJSJSRUdfZCwgIiUiUkVHX1MsICIlIlJFR19ECisjaWYgIWRlZmluZWQoUElDKQorICAgICAgICAgLCIlIlJFR19iCisjZW5kaWYKKyAgICApOworCisgICAgZm9yIChpPWRzdFdpZHRoLTE7IChpKnhJbmMpPj4xNiA+PXNyY1ctMTsgaS0tKQorICAgICAgICBkc3RbaV0gPSBzcmNbc3JjVy0xXSoxMjg7Cit9CisKK3ZvaWQgZmZfaGNzY2FsZV9mYXN0X21teGV4dChTd3NDb250ZXh0ICpjLCBpbnQxNl90ICpkc3QxLCBpbnQxNl90ICpkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFdpZHRoLCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IHNyY1csIGludCB4SW5jKQoreworICAgIGludDMyX3QgKmZpbHRlclBvcyA9IGMtPmhDaHJGaWx0ZXJQb3M7CisgICAgaW50MTZfdCAqZmlsdGVyICAgID0gYy0+aENockZpbHRlcjsKKyAgICB2b2lkICAgICptbXhleHRGaWx0ZXJDb2RlID0gYy0+Y2hyTW14ZXh0RmlsdGVyQ29kZTsKKyAgICBpbnQgaTsKKyNpZiBkZWZpbmVkKFBJQykKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIGVieHNhdmUpOworI2VuZGlmCisjaWYgQVJDSF9YODZfNjQKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIHJldHNhdmUpOworI2VuZGlmCisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorI2lmIGRlZmluZWQoUElDKQorICAgICAgICAibW92ICAgICAgICAgICUlIlJFR19iIiwgJTcgICAgICAgICBcblx0IgorI2lmIEFSQ0hfWDg2XzY0CisgICAgICAgICJtb3YgICAgICAgICAgLTgoJSVyc3ApLCAlJSJSRUdfYSIgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgJSUiUkVHX2EiLCAlOCAgICAgICAgIFxuXHQiCisjZW5kaWYKKyNlbHNlCisjaWYgQVJDSF9YODZfNjQKKyAgICAgICAgIm1vdiAgICAgICAgICAtOCglJXJzcCksICUlIlJFR19hIiAgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgICAlJSJSRUdfYSIsICU3ICAgICAgICAgXG5cdCIKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICJweG9yICAgICAgICAgICAgICUlbW03LCAlJW1tNyAgICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICUwLCAlJSJSRUdfYyIgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICUxLCAlJSJSRUdfRCIgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICUyLCAlJSJSRUdfZCIgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICUzLCAlJSJSRUdfYiIgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgIFxuXHQiIC8vIGkKKyAgICAgICAgUFJFRkVUQ0giICAgKCUlIlJFR19jIikgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFJFRkVUQ0giIDMyKCUlIlJFR19jIikgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFJFRkVUQ0giIDY0KCUlIlJFR19jIikgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBDQUxMX01NWEVYVF9GSUxURVJfQ09ERQorICAgICAgICBDQUxMX01NWEVYVF9GSUxURVJfQ09ERQorICAgICAgICBDQUxMX01NWEVYVF9GSUxURVJfQ09ERQorICAgICAgICBDQUxMX01NWEVYVF9GSUxURVJfQ09ERQorICAgICAgICAieG9yICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX2EiICBcblx0IiAvLyBpCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICU1LCAlJSJSRUdfYyIgIFxuXHQiIC8vIHNyYworICAgICAgICAibW92ICAgICAgICAgICAgICAgICAlNiwgJSUiUkVHX0QiICBcblx0IiAvLyBidWYyCisgICAgICAgIFBSRUZFVENIIiAgICglJSJSRUdfYyIpICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBSRUZFVENIIiAzMiglJSJSRUdfYyIpICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBSRUZFVENIIiA2NCglJSJSRUdfYyIpICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKyAgICAgICAgQ0FMTF9NTVhFWFRfRklMVEVSX0NPREUKKworI2lmIGRlZmluZWQoUElDKQorICAgICAgICAibW92ICU3LCAlJSJSRUdfYiIgICAgXG5cdCIKKyNpZiBBUkNIX1g4Nl82NAorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAlOCwgJSUiUkVHX2EiICBcblx0IgorICAgICAgICAibW92ICAgICAgICAgICUlIlJFR19hIiwgLTgoJSVyc3ApICBcblx0IgorI2VuZGlmCisjZWxzZQorI2lmIEFSQ0hfWDg2XzY0CisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICU3LCAlJSJSRUdfYSIgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgJSUiUkVHX2EiLCAtOCglJXJzcCkgIFxuXHQiCisjZW5kaWYKKyNlbmRpZgorICAgICAgICA6OiAibSIgKHNyYzEpLCAibSIgKGRzdDEpLCAibSIgKGZpbHRlciksICJtIiAoZmlsdGVyUG9zKSwKKyAgICAgICAgICAgIm0iIChtbXhleHRGaWx0ZXJDb2RlKSwgIm0iIChzcmMyKSwgIm0iKGRzdDIpCisjaWYgZGVmaW5lZChQSUMpCisgICAgICAgICAgLCJtIiAoZWJ4c2F2ZSkKKyNlbmRpZgorI2lmIEFSQ0hfWDg2XzY0CisgICAgICAgICAgLCJtIihyZXRzYXZlKQorI2VuZGlmCisgICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19jLCAiJSJSRUdfZCwgIiUiUkVHX1MsICIlIlJFR19ECisjaWYgIWRlZmluZWQoUElDKQorICAgICAgICAgLCIlIlJFR19iCisjZW5kaWYKKyAgICApOworCisgICAgZm9yIChpPWRzdFdpZHRoLTE7IChpKnhJbmMpPj4xNiA+PXNyY1ctMTsgaS0tKSB7CisgICAgICAgIGRzdDFbaV0gPSBzcmMxW3NyY1ctMV0qMTI4OworICAgICAgICBkc3QyW2ldID0gc3JjMltzcmNXLTFdKjEyODsKKyAgICB9Cit9CisjZW5kaWYgLy9IQVZFX0lOTElORV9BU00KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni9pbnB1dC5hc20gYi9mZm1wZWcvbGlic3dzY2FsZS94ODYvaW5wdXQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOWFmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS94ODYvaW5wdXQuYXNtCkBAIC0wLDAgKzEsNzQwIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiB4ODYtb3B0aW1pemVkIGlucHV0IHJvdXRpbmVzOyBkb2VzIHNodWZmbGluZyBvZiBwYWNrZWQKKzsqIFlVViBmb3JtYXRzIGludG8gaW5kaXZpZHVhbCBwbGFuZXMsIGFuZCBjb252ZXJ0cyBSR0IKKzsqIGludG8gWVVWIHBsYW5lcyBhbHNvLgorOyogQ29weXJpZ2h0IChjKSAyMDEyIFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorCislZGVmaW5lIFJZIDB4MjBERQorJWRlZmluZSBHWSAweDQwODcKKyVkZWZpbmUgQlkgMHgwQzg4CislZGVmaW5lIFJVIDB4RUNGRgorJWRlZmluZSBHVSAweERBQzgKKyVkZWZpbmUgQlUgMHgzODM4CislZGVmaW5lIFJWIDB4MzgzOAorJWRlZmluZSBHViAweEQwRTMKKyVkZWZpbmUgQlYgMHhGNkU0CisKK3JnYl9Zcm5kOiAgICAgICAgdGltZXMgNCBkZCAweDgwMTAwICAgICAgICA7ICAxNi41IDw8IDE1CityZ2JfVVZybmQ6ICAgICAgIHRpbWVzIDQgZGQgMHg0MDAxMDAgICAgICAgOyAxMjguNSA8PCAxNQorJWRlZmluZSBiZ3JfWWNvZWZmXzEyeDQgMTYqNCArIDE2KiAwICsgdGFibGVxCislZGVmaW5lIGJncl9ZY29lZmZfM3g1NiAxNio0ICsgMTYqIDEgKyB0YWJsZXEKKyVkZWZpbmUgcmdiX1ljb2VmZl8xMng0IDE2KjQgKyAxNiogMiArIHRhYmxlcQorJWRlZmluZSByZ2JfWWNvZWZmXzN4NTYgMTYqNCArIDE2KiAzICsgdGFibGVxCislZGVmaW5lIGJncl9VY29lZmZfMTJ4NCAxNio0ICsgMTYqIDQgKyB0YWJsZXEKKyVkZWZpbmUgYmdyX1Vjb2VmZl8zeDU2IDE2KjQgKyAxNiogNSArIHRhYmxlcQorJWRlZmluZSByZ2JfVWNvZWZmXzEyeDQgMTYqNCArIDE2KiA2ICsgdGFibGVxCislZGVmaW5lIHJnYl9VY29lZmZfM3g1NiAxNio0ICsgMTYqIDcgKyB0YWJsZXEKKyVkZWZpbmUgYmdyX1Zjb2VmZl8xMng0IDE2KjQgKyAxNiogOCArIHRhYmxlcQorJWRlZmluZSBiZ3JfVmNvZWZmXzN4NTYgMTYqNCArIDE2KiA5ICsgdGFibGVxCislZGVmaW5lIHJnYl9WY29lZmZfMTJ4NCAxNio0ICsgMTYqMTAgKyB0YWJsZXEKKyVkZWZpbmUgcmdiX1Zjb2VmZl8zeDU2IDE2KjQgKyAxNioxMSArIHRhYmxlcQorCislZGVmaW5lIHJnYmFfWWNvZWZmX3JiIDE2KjQgKyAxNioxMiArIHRhYmxlcQorJWRlZmluZSByZ2JhX1ljb2VmZl9iciAxNio0ICsgMTYqMTMgKyB0YWJsZXEKKyVkZWZpbmUgcmdiYV9ZY29lZmZfZ2EgMTYqNCArIDE2KjE0ICsgdGFibGVxCislZGVmaW5lIHJnYmFfWWNvZWZmX2FnIDE2KjQgKyAxNioxNSArIHRhYmxlcQorJWRlZmluZSByZ2JhX1Vjb2VmZl9yYiAxNio0ICsgMTYqMTYgKyB0YWJsZXEKKyVkZWZpbmUgcmdiYV9VY29lZmZfYnIgMTYqNCArIDE2KjE3ICsgdGFibGVxCislZGVmaW5lIHJnYmFfVWNvZWZmX2dhIDE2KjQgKyAxNioxOCArIHRhYmxlcQorJWRlZmluZSByZ2JhX1Vjb2VmZl9hZyAxNio0ICsgMTYqMTkgKyB0YWJsZXEKKyVkZWZpbmUgcmdiYV9WY29lZmZfcmIgMTYqNCArIDE2KjIwICsgdGFibGVxCislZGVmaW5lIHJnYmFfVmNvZWZmX2JyIDE2KjQgKyAxNioyMSArIHRhYmxlcQorJWRlZmluZSByZ2JhX1Zjb2VmZl9nYSAxNio0ICsgMTYqMjIgKyB0YWJsZXEKKyVkZWZpbmUgcmdiYV9WY29lZmZfYWcgMTYqNCArIDE2KjIzICsgdGFibGVxCisKKzsgYmdyX1ljb2VmZl8xMng0OiB0aW1lcyAyIGR3IEJZLCBHWSwgMCwgQlkKKzsgYmdyX1ljb2VmZl8zeDU2OiB0aW1lcyAyIGR3IFJZLCAwLCBHWSwgUlkKKzsgcmdiX1ljb2VmZl8xMng0OiB0aW1lcyAyIGR3IFJZLCBHWSwgMCwgUlkKKzsgcmdiX1ljb2VmZl8zeDU2OiB0aW1lcyAyIGR3IEJZLCAwLCBHWSwgQlkKKzsgYmdyX1Vjb2VmZl8xMng0OiB0aW1lcyAyIGR3IEJVLCBHVSwgMCwgQlUKKzsgYmdyX1Vjb2VmZl8zeDU2OiB0aW1lcyAyIGR3IFJVLCAwLCBHVSwgUlUKKzsgcmdiX1Vjb2VmZl8xMng0OiB0aW1lcyAyIGR3IFJVLCBHVSwgMCwgUlUKKzsgcmdiX1Vjb2VmZl8zeDU2OiB0aW1lcyAyIGR3IEJVLCAwLCBHVSwgQlUKKzsgYmdyX1Zjb2VmZl8xMng0OiB0aW1lcyAyIGR3IEJWLCBHViwgMCwgQlYKKzsgYmdyX1Zjb2VmZl8zeDU2OiB0aW1lcyAyIGR3IFJWLCAwLCBHViwgUlYKKzsgcmdiX1Zjb2VmZl8xMng0OiB0aW1lcyAyIGR3IFJWLCBHViwgMCwgUlYKKzsgcmdiX1Zjb2VmZl8zeDU2OiB0aW1lcyAyIGR3IEJWLCAwLCBHViwgQlYKKworOyByZ2JhX1ljb2VmZl9yYjogIHRpbWVzIDQgZHcgUlksIEJZCis7IHJnYmFfWWNvZWZmX2JyOiAgdGltZXMgNCBkdyBCWSwgUlkKKzsgcmdiYV9ZY29lZmZfZ2E6ICB0aW1lcyA0IGR3IEdZLCAwCis7IHJnYmFfWWNvZWZmX2FnOiAgdGltZXMgNCBkdyAwLCAgR1kKKzsgcmdiYV9VY29lZmZfcmI6ICB0aW1lcyA0IGR3IFJVLCBCVQorOyByZ2JhX1Vjb2VmZl9icjogIHRpbWVzIDQgZHcgQlUsIFJVCis7IHJnYmFfVWNvZWZmX2dhOiAgdGltZXMgNCBkdyBHVSwgMAorOyByZ2JhX1Vjb2VmZl9hZzogIHRpbWVzIDQgZHcgMCwgIEdVCis7IHJnYmFfVmNvZWZmX3JiOiAgdGltZXMgNCBkdyBSViwgQlYKKzsgcmdiYV9WY29lZmZfYnI6ICB0aW1lcyA0IGR3IEJWLCBSVgorOyByZ2JhX1Zjb2VmZl9nYTogIHRpbWVzIDQgZHcgR1YsIDAKKzsgcmdiYV9WY29lZmZfYWc6ICB0aW1lcyA0IGR3IDAsICBHVgorCitzaHVmX3JnYl8xMng0OiAgIGRiIDAsIDB4ODAsIDEsIDB4ODAsICAyLCAweDgwLCAgMywgMHg4MCwgXAorICAgICAgICAgICAgICAgICAgICA2LCAweDgwLCA3LCAweDgwLCAgOCwgMHg4MCwgIDksIDB4ODAKK3NodWZfcmdiXzN4NTY6ICAgZGIgMiwgMHg4MCwgMywgMHg4MCwgIDQsIDB4ODAsICA1LCAweDgwLCBcCisgICAgICAgICAgICAgICAgICAgIDgsIDB4ODAsIDksIDB4ODAsIDEwLCAweDgwLCAxMSwgMHg4MAorCitTRUNUSU9OIC50ZXh0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBSR0IgdG8gWS9VVi4KKzsKKzsgdm9pZCA8Zm10PlRvWV88b3B0Pih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHcpOworOyBhbmQKKzsgdm9pZCA8Zm10PnRvVVZfPG9wdD4odWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgY29uc3QgdWludDhfdCAqc3JjLAorOyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp1bnVzZWQsIGludCB3KTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7ICUxID0gbnIuIG9mIFhNTSByZWdpc3RlcnMKKzsgJTIgPSByZ2Igb3IgYmdyCislbWFjcm8gUkdCMjRfVE9fWV9GTiAyLTMKK2NnbG9iYWwgJTIgJSsgMjRUb1ksIDYsIDYsICUxLCBkc3QsIHNyYywgdTEsIHUyLCB3LCB0YWJsZQorJWlmIG1tc2l6ZSA9PSA4CisgICAgbW92YSAgICAgICAgICAgbTUsIFslMl9ZY29lZmZfMTJ4NF0KKyAgICBtb3ZhICAgICAgICAgICBtNiwgWyUyX1ljb2VmZl8zeDU2XQorJWRlZmluZSBjb2VmZjEgbTUKKyVkZWZpbmUgY29lZmYyIG02CislZWxpZiBBUkNIX1g4Nl82NAorICAgIG1vdmEgICAgICAgICAgIG04LCBbJTJfWWNvZWZmXzEyeDRdCisgICAgbW92YSAgICAgICAgICAgbTksIFslMl9ZY29lZmZfM3g1Nl0KKyVkZWZpbmUgY29lZmYxIG04CislZGVmaW5lIGNvZWZmMiBtOQorJWVsc2UgOyB4ODYtMzIgJiYgbW1zaXplID09IDE2CislZGVmaW5lIGNvZWZmMSBbJTJfWWNvZWZmXzEyeDRdCislZGVmaW5lIGNvZWZmMiBbJTJfWWNvZWZmXzN4NTZdCislZW5kaWYgOyB4ODYtMzIvNjQgJiYgbW1zaXplID09IDgvMTYKKyVpZiAoQVJDSF9YODZfNjQgfHwgbW1zaXplID09IDgpICYmICUwID09IDMKKyAgICBqbXAgbWFuZ2xlKHByaXZhdGVfcHJlZml4ICUrIF8gJSsgJTMgJSsgMjRUb1kgJSsgU1VGRklYKS5ib2R5CislZWxzZSA7IChBUkNIX1g4Nl82NCAmJiAlMCA9PSAzKSB8fCBtbXNpemUgPT0gOAorLmJvZHk6CislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICBtb3ZhICAgICAgICAgICBtNywgW3NodWZfcmdiXzEyeDRdCislZGVmaW5lIHNodWZfcmdiMSBtNworJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92YSAgICAgICAgICBtMTAsIFtzaHVmX3JnYl8zeDU2XQorJWRlZmluZSBzaHVmX3JnYjIgbTEwCislZWxzZSA7IHg4Ni0zMgorJWRlZmluZSBzaHVmX3JnYjIgW3NodWZfcmdiXzN4NTZdCislZW5kaWYgOyB4ODYtMzIvNjQKKyVlbmRpZiA7IGNwdWZsYWcoc3NzZTMpCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgICB3cSwgd2QKKyVlbmRpZgorICAgIGFkZCAgICAgICAgICAgIHdxLCB3cQorICAgIGFkZCAgICAgICAgICBkc3RxLCB3cQorICAgIG5lZyAgICAgICAgICAgIHdxCislaWYgbm90Y3B1ZmxhZyhzc3NlMykKKyAgICBweG9yICAgICAgICAgICBtNywgbTcKKyVlbmRpZiA7ICFjcHVmbGFnKHNzc2UzKQorICAgIG1vdmEgICAgICAgICAgIG00LCBbcmdiX1lybmRdCisubG9vcDoKKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIG1vdnUgICAgICAgICAgIG0wLCBbc3JjcSswXSAgICAgICAgICAgOyAoYnl0ZSkgeyBCeCwgR3gsIFJ4IH1bMC0zXQorICAgIG1vdnUgICAgICAgICAgIG0yLCBbc3JjcSsxMl0gICAgICAgICAgOyAoYnl0ZSkgeyBCeCwgR3gsIFJ4IH1bNC03XQorICAgIHBzaHVmYiAgICAgICAgIG0xLCBtMCwgc2h1Zl9yZ2IyICAgICAgOyAod29yZCkgeyBSMCwgQjEsIEcxLCBSMSwgUjIsIEIzLCBHMywgUjMgfQorICAgIHBzaHVmYiAgICAgICAgIG0wLCBzaHVmX3JnYjEgICAgICAgICAgOyAod29yZCkgeyBCMCwgRzAsIFIwLCBCMSwgQjIsIEcyLCBSMiwgQjMgfQorICAgIHBzaHVmYiAgICAgICAgIG0zLCBtMiwgc2h1Zl9yZ2IyICAgICAgOyAod29yZCkgeyBSNCwgQjUsIEc1LCBSNSwgUjYsIEI3LCBHNywgUjcgfQorICAgIHBzaHVmYiAgICAgICAgIG0yLCBzaHVmX3JnYjEgICAgICAgICAgOyAod29yZCkgeyBCNCwgRzQsIFI0LCBCNSwgQjYsIEc2LCBSNiwgQjcgfQorJWVsc2UgOyAhY3B1ZmxhZyhzc3NlMykKKyAgICBtb3ZkICAgICAgICAgICBtMCwgW3NyY3ErMF0gICAgICAgICAgIDsgKGJ5dGUpIHsgQjAsIEcwLCBSMCwgQjEgfQorICAgIG1vdmQgICAgICAgICAgIG0xLCBbc3JjcSsyXSAgICAgICAgICAgOyAoYnl0ZSkgeyBSMCwgQjEsIEcxLCBSMSB9CisgICAgbW92ZCAgICAgICAgICAgbTIsIFtzcmNxKzZdICAgICAgICAgICA7IChieXRlKSB7IEIyLCBHMiwgUjIsIEIzIH0KKyAgICBtb3ZkICAgICAgICAgICBtMywgW3NyY3ErOF0gICAgICAgICAgIDsgKGJ5dGUpIHsgUjIsIEIzLCBHMywgUjMgfQorJWlmIG1tc2l6ZSA9PSAxNiA7IGkuZS4gc3NlMgorICAgIHB1bnBja2xkcSAgICAgIG0wLCBtMiAgICAgICAgICAgICAgICAgOyAoYnl0ZSkgeyBCMCwgRzAsIFIwLCBCMSwgQjIsIEcyLCBSMiwgQjMgfQorICAgIHB1bnBja2xkcSAgICAgIG0xLCBtMyAgICAgICAgICAgICAgICAgOyAoYnl0ZSkgeyBSMCwgQjEsIEcxLCBSMSwgUjIsIEIzLCBHMywgUjMgfQorICAgIG1vdmQgICAgICAgICAgIG0yLCBbc3JjcSsxMl0gICAgICAgICAgOyAoYnl0ZSkgeyBCNCwgRzQsIFI0LCBCNSB9CisgICAgbW92ZCAgICAgICAgICAgbTMsIFtzcmNxKzE0XSAgICAgICAgICA7IChieXRlKSB7IFI0LCBCNSwgRzUsIFI1IH0KKyAgICBtb3ZkICAgICAgICAgICBtNSwgW3NyY3ErMThdICAgICAgICAgIDsgKGJ5dGUpIHsgQjYsIEc2LCBSNiwgQjcgfQorICAgIG1vdmQgICAgICAgICAgIG02LCBbc3JjcSsyMF0gICAgICAgICAgOyAoYnl0ZSkgeyBSNiwgQjcsIEc3LCBSNyB9CisgICAgcHVucGNrbGRxICAgICAgbTIsIG01ICAgICAgICAgICAgICAgICA7IChieXRlKSB7IEI0LCBHNCwgUjQsIEI1LCBCNiwgRzYsIFI2LCBCNyB9CisgICAgcHVucGNrbGRxICAgICAgbTMsIG02ICAgICAgICAgICAgICAgICA7IChieXRlKSB7IFI0LCBCNSwgRzUsIFI1LCBSNiwgQjcsIEc3LCBSNyB9CislZW5kaWYgOyBtbXNpemUgPT0gMTYKKyAgICBwdW5wY2tsYncgICAgICBtMCwgbTcgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgQjAsIEcwLCBSMCwgQjEsIEIyLCBHMiwgUjIsIEIzIH0KKyAgICBwdW5wY2tsYncgICAgICBtMSwgbTcgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgUjAsIEIxLCBHMSwgUjEsIFIyLCBCMywgRzMsIFIzIH0KKyAgICBwdW5wY2tsYncgICAgICBtMiwgbTcgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgQjQsIEc0LCBSNCwgQjUsIEI2LCBHNiwgUjYsIEI3IH0KKyAgICBwdW5wY2tsYncgICAgICBtMywgbTcgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgUjQsIEI1LCBHNSwgUjUsIFI2LCBCNywgRzcsIFI3IH0KKyVlbmRpZiA7IGNwdWZsYWcoc3NzZTMpCisgICAgYWRkICAgICAgICAgIHNyY3EsIDMgKiBtbXNpemUgLyAyCisgICAgcG1hZGR3ZCAgICAgICAgbTAsIGNvZWZmMSAgICAgICAgICAgICA7IChkd29yZCkgeyBCMCpCWSArIEcwKkdZLCBCMSpCWSwgQjIqQlkgKyBHMipHWSwgQjMqQlkgfQorICAgIHBtYWRkd2QgICAgICAgIG0xLCBjb2VmZjIgICAgICAgICAgICAgOyAoZHdvcmQpIHsgUjAqUlksIEcxK0dZICsgUjEqUlksIFIyKlJZLCBHMytHWSArIFIzKlJZIH0KKyAgICBwbWFkZHdkICAgICAgICBtMiwgY29lZmYxICAgICAgICAgICAgIDsgKGR3b3JkKSB7IEI0KkJZICsgRzQqR1ksIEI1KkJZLCBCNipCWSArIEc2KkdZLCBCNypCWSB9CisgICAgcG1hZGR3ZCAgICAgICAgbTMsIGNvZWZmMiAgICAgICAgICAgICA7IChkd29yZCkgeyBSNCpSWSwgRzUrR1kgKyBSNSpSWSwgUjYqUlksIEc3K0dZICsgUjcqUlkgfQorICAgIHBhZGRkICAgICAgICAgIG0wLCBtMSAgICAgICAgICAgICAgICAgOyAoZHdvcmQpIHsgQngqQlkgKyBHeCpHWSArIFJ4KlJZIH1bMC0zXQorICAgIHBhZGRkICAgICAgICAgIG0yLCBtMyAgICAgICAgICAgICAgICAgOyAoZHdvcmQpIHsgQngqQlkgKyBHeCpHWSArIFJ4KlJZIH1bNC03XQorICAgIHBhZGRkICAgICAgICAgIG0wLCBtNCAgICAgICAgICAgICAgICAgOyArPSByZ2JfWXJuZCwgaS5lLiAoZHdvcmQpIHsgWVswLTNdIH0KKyAgICBwYWRkZCAgICAgICAgICBtMiwgbTQgICAgICAgICAgICAgICAgIDsgKz0gcmdiX1lybmQsIGkuZS4gKGR3b3JkKSB7IFlbNC03XSB9CisgICAgcHNyYWQgICAgICAgICAgbTAsIDkKKyAgICBwc3JhZCAgICAgICAgICBtMiwgOQorICAgIHBhY2tzc2R3ICAgICAgIG0wLCBtMiAgICAgICAgICAgICAgICAgOyAod29yZCkgeyBZWzAtN10gfQorICAgIG1vdmEgICAgW2RzdHErd3FdLCBtMAorICAgIGFkZCAgICAgICAgICAgIHdxLCBtbXNpemUKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRpZiA7IChBUkNIX1g4Nl82NCAmJiAlMCA9PSAzKSB8fCBtbXNpemUgPT0gOAorJWVuZG1hY3JvCisKKzsgJTEgPSBuci4gb2YgWE1NIHJlZ2lzdGVycworOyAlMiA9IHJnYiBvciBiZ3IKKyVtYWNybyBSR0IyNF9UT19VVl9GTiAyLTMKK2NnbG9iYWwgJTIgJSsgMjRUb1VWLCA3LCA3LCAlMSwgZHN0VSwgZHN0ViwgdTEsIHNyYywgdTIsIHcsIHRhYmxlCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZhICAgICAgICAgICBtOCwgWyUyX1Vjb2VmZl8xMng0XQorICAgIG1vdmEgICAgICAgICAgIG05LCBbJTJfVWNvZWZmXzN4NTZdCisgICAgbW92YSAgICAgICAgICBtMTAsIFslMl9WY29lZmZfMTJ4NF0KKyAgICBtb3ZhICAgICAgICAgIG0xMSwgWyUyX1Zjb2VmZl8zeDU2XQorJWRlZmluZSBjb2VmZlUxIG04CislZGVmaW5lIGNvZWZmVTIgbTkKKyVkZWZpbmUgY29lZmZWMSBtMTAKKyVkZWZpbmUgY29lZmZWMiBtMTEKKyVlbHNlIDsgeDg2LTMyCislZGVmaW5lIGNvZWZmVTEgWyUyX1Vjb2VmZl8xMng0XQorJWRlZmluZSBjb2VmZlUyIFslMl9VY29lZmZfM3g1Nl0KKyVkZWZpbmUgY29lZmZWMSBbJTJfVmNvZWZmXzEyeDRdCislZGVmaW5lIGNvZWZmVjIgWyUyX1Zjb2VmZl8zeDU2XQorJWVuZGlmIDsgeDg2LTMyLzY0CislaWYgQVJDSF9YODZfNjQgJiYgJTAgPT0gMworICAgIGptcCBtYW5nbGUocHJpdmF0ZV9wcmVmaXggJSsgXyAlKyAlMyAlKyAyNFRvVVYgJSsgU1VGRklYKS5ib2R5CislZWxzZSA7IEFSQ0hfWDg2XzY0ICYmICUwID09IDMKKy5ib2R5OgorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92YSAgICAgICAgICAgbTcsIFtzaHVmX3JnYl8xMng0XQorJWRlZmluZSBzaHVmX3JnYjEgbTcKKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdmEgICAgICAgICAgbTEyLCBbc2h1Zl9yZ2JfM3g1Nl0KKyVkZWZpbmUgc2h1Zl9yZ2IyIG0xMgorJWVsc2UgOyB4ODYtMzIKKyVkZWZpbmUgc2h1Zl9yZ2IyIFtzaHVmX3JnYl8zeDU2XQorJWVuZGlmIDsgeDg2LTMyLzY0CislZW5kaWYgOyBjcHVmbGFnKHNzc2UzKQorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92c3hkICAgICAgICAgd3EsIGR3b3JkIHI1bQorJWVsc2UgOyB4ODYtMzIKKyAgICBtb3YgICAgICAgICAgICB3cSwgcjVtCislZW5kaWYKKyAgICBhZGQgICAgICAgICAgICB3cSwgd3EKKyAgICBhZGQgICAgICAgICBkc3RVcSwgd3EKKyAgICBhZGQgICAgICAgICBkc3RWcSwgd3EKKyAgICBuZWcgICAgICAgICAgICB3cQorICAgIG1vdmEgICAgICAgICAgIG02LCBbcmdiX1VWcm5kXQorJWlmIG5vdGNwdWZsYWcoc3NzZTMpCisgICAgcHhvciAgICAgICAgICAgbTcsIG03CislZW5kaWYKKy5sb29wOgorJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92dSAgICAgICAgICAgbTAsIFtzcmNxKzBdICAgICAgICAgICA7IChieXRlKSB7IEJ4LCBHeCwgUnggfVswLTNdCisgICAgbW92dSAgICAgICAgICAgbTQsIFtzcmNxKzEyXSAgICAgICAgICA7IChieXRlKSB7IEJ4LCBHeCwgUnggfVs0LTddCisgICAgcHNodWZiICAgICAgICAgbTEsIG0wLCBzaHVmX3JnYjIgICAgICA7ICh3b3JkKSB7IFIwLCBCMSwgRzEsIFIxLCBSMiwgQjMsIEczLCBSMyB9CisgICAgcHNodWZiICAgICAgICAgbTAsIHNodWZfcmdiMSAgICAgICAgICA7ICh3b3JkKSB7IEIwLCBHMCwgUjAsIEIxLCBCMiwgRzIsIFIyLCBCMyB9CislZWxzZSA7ICFjcHVmbGFnKHNzc2UzKQorICAgIG1vdmQgICAgICAgICAgIG0wLCBbc3JjcSswXSAgICAgICAgICAgOyAoYnl0ZSkgeyBCMCwgRzAsIFIwLCBCMSB9CisgICAgbW92ZCAgICAgICAgICAgbTEsIFtzcmNxKzJdICAgICAgICAgICA7IChieXRlKSB7IFIwLCBCMSwgRzEsIFIxIH0KKyAgICBtb3ZkICAgICAgICAgICBtNCwgW3NyY3ErNl0gICAgICAgICAgIDsgKGJ5dGUpIHsgQjIsIEcyLCBSMiwgQjMgfQorICAgIG1vdmQgICAgICAgICAgIG01LCBbc3JjcSs4XSAgICAgICAgICAgOyAoYnl0ZSkgeyBSMiwgQjMsIEczLCBSMyB9CislaWYgbW1zaXplID09IDE2CisgICAgcHVucGNrbGRxICAgICAgbTAsIG00ICAgICAgICAgICAgICAgICA7IChieXRlKSB7IEIwLCBHMCwgUjAsIEIxLCBCMiwgRzIsIFIyLCBCMyB9CisgICAgcHVucGNrbGRxICAgICAgbTEsIG01ICAgICAgICAgICAgICAgICA7IChieXRlKSB7IFIwLCBCMSwgRzEsIFIxLCBSMiwgQjMsIEczLCBSMyB9CisgICAgbW92ZCAgICAgICAgICAgbTQsIFtzcmNxKzEyXSAgICAgICAgICA7IChieXRlKSB7IEI0LCBHNCwgUjQsIEI1IH0KKyAgICBtb3ZkICAgICAgICAgICBtNSwgW3NyY3ErMTRdICAgICAgICAgIDsgKGJ5dGUpIHsgUjQsIEI1LCBHNSwgUjUgfQorJWVuZGlmIDsgbW1zaXplID09IDE2CisgICAgcHVucGNrbGJ3ICAgICAgbTAsIG03ICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IEIwLCBHMCwgUjAsIEIxLCBCMiwgRzIsIFIyLCBCMyB9CisgICAgcHVucGNrbGJ3ICAgICAgbTEsIG03ICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IFIwLCBCMSwgRzEsIFIxLCBSMiwgQjMsIEczLCBSMyB9CislZW5kaWYgOyBjcHVmbGFnKHNzc2UzKQorICAgIHBtYWRkd2QgICAgICAgIG0yLCBtMCwgY29lZmZWMSAgICAgICAgOyAoZHdvcmQpIHsgQjAqQlYgKyBHMCpHViwgQjEqQlYsIEIyKkJWICsgRzIqR1YsIEIzKkJWIH0KKyAgICBwbWFkZHdkICAgICAgICBtMywgbTEsIGNvZWZmVjIgICAgICAgIDsgKGR3b3JkKSB7IFIwKkJWLCBHMSpHViArIFIxKkJWLCBSMipCViwgRzMqR1YgKyBSMypCViB9CisgICAgcG1hZGR3ZCAgICAgICAgbTAsIGNvZWZmVTEgICAgICAgICAgICA7IChkd29yZCkgeyBCMCpCVSArIEcwKkdVLCBCMSpCVSwgQjIqQlUgKyBHMipHVSwgQjMqQlUgfQorICAgIHBtYWRkd2QgICAgICAgIG0xLCBjb2VmZlUyICAgICAgICAgICAgOyAoZHdvcmQpIHsgUjAqQlUsIEcxKkdVICsgUjEqQlUsIFIyKkJVLCBHMypHVSArIFIzKkJVIH0KKyAgICBwYWRkZCAgICAgICAgICBtMCwgbTEgICAgICAgICAgICAgICAgIDsgKGR3b3JkKSB7IEJ4KkJVICsgR3gqR1UgKyBSeCpSVSB9WzAtM10KKyAgICBwYWRkZCAgICAgICAgICBtMiwgbTMgICAgICAgICAgICAgICAgIDsgKGR3b3JkKSB7IEJ4KkJWICsgR3gqR1YgKyBSeCpSViB9WzAtM10KKyVpZiBjcHVmbGFnKHNzc2UzKQorICAgIHBzaHVmYiAgICAgICAgIG01LCBtNCwgc2h1Zl9yZ2IyICAgICAgOyAod29yZCkgeyBSNCwgQjUsIEc1LCBSNSwgUjYsIEI3LCBHNywgUjcgfQorICAgIHBzaHVmYiAgICAgICAgIG00LCBzaHVmX3JnYjEgICAgICAgICAgOyAod29yZCkgeyBCNCwgRzQsIFI0LCBCNSwgQjYsIEc2LCBSNiwgQjcgfQorJWVsc2UgOyAhY3B1ZmxhZyhzc3NlMykKKyVpZiBtbXNpemUgPT0gMTYKKyAgICBtb3ZkICAgICAgICAgICBtMSwgW3NyY3ErMThdICAgICAgICAgIDsgKGJ5dGUpIHsgQjYsIEc2LCBSNiwgQjcgfQorICAgIG1vdmQgICAgICAgICAgIG0zLCBbc3JjcSsyMF0gICAgICAgICAgOyAoYnl0ZSkgeyBSNiwgQjcsIEc3LCBSNyB9CisgICAgcHVucGNrbGRxICAgICAgbTQsIG0xICAgICAgICAgICAgICAgICA7IChieXRlKSB7IEI0LCBHNCwgUjQsIEI1LCBCNiwgRzYsIFI2LCBCNyB9CisgICAgcHVucGNrbGRxICAgICAgbTUsIG0zICAgICAgICAgICAgICAgICA7IChieXRlKSB7IFI0LCBCNSwgRzUsIFI1LCBSNiwgQjcsIEc3LCBSNyB9CislZW5kaWYgOyBtbXNpemUgPT0gMTYgJiYgIWNwdWZsYWcoc3NzZTMpCisgICAgcHVucGNrbGJ3ICAgICAgbTQsIG03ICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IEI0LCBHNCwgUjQsIEI1LCBCNiwgRzYsIFI2LCBCNyB9CisgICAgcHVucGNrbGJ3ICAgICAgbTUsIG03ICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IFI0LCBCNSwgRzUsIFI1LCBSNiwgQjcsIEc3LCBSNyB9CislZW5kaWYgOyBjcHVmbGFnKHNzc2UzKQorICAgIGFkZCAgICAgICAgICBzcmNxLCAzICogbW1zaXplIC8gMgorICAgIHBtYWRkd2QgICAgICAgIG0xLCBtNCwgY29lZmZVMSAgICAgICAgOyAoZHdvcmQpIHsgQjQqQlUgKyBHNCpHVSwgQjUqQlUsIEI2KkJVICsgRzYqR1UsIEI3KkJVIH0KKyAgICBwbWFkZHdkICAgICAgICBtMywgbTUsIGNvZWZmVTIgICAgICAgIDsgKGR3b3JkKSB7IFI0KkJVLCBHNSpHVSArIFI1KkJVLCBSNipCVSwgRzcqR1UgKyBSNypCVSB9CisgICAgcG1hZGR3ZCAgICAgICAgbTQsIGNvZWZmVjEgICAgICAgICAgICA7IChkd29yZCkgeyBCNCpCViArIEc0KkdWLCBCNSpCViwgQjYqQlYgKyBHNipHViwgQjcqQlYgfQorICAgIHBtYWRkd2QgICAgICAgIG01LCBjb2VmZlYyICAgICAgICAgICAgOyAoZHdvcmQpIHsgUjQqQlYsIEc1KkdWICsgUjUqQlYsIFI2KkJWLCBHNypHViArIFI3KkJWIH0KKyAgICBwYWRkZCAgICAgICAgICBtMSwgbTMgICAgICAgICAgICAgICAgIDsgKGR3b3JkKSB7IEJ4KkJVICsgR3gqR1UgKyBSeCpSVSB9WzQtN10KKyAgICBwYWRkZCAgICAgICAgICBtNCwgbTUgICAgICAgICAgICAgICAgIDsgKGR3b3JkKSB7IEJ4KkJWICsgR3gqR1YgKyBSeCpSViB9WzQtN10KKyAgICBwYWRkZCAgICAgICAgICBtMCwgbTYgICAgICAgICAgICAgICAgIDsgKz0gcmdiX1VWcm5kLCBpLmUuIChkd29yZCkgeyBVWzAtM10gfQorICAgIHBhZGRkICAgICAgICAgIG0yLCBtNiAgICAgICAgICAgICAgICAgOyArPSByZ2JfVVZybmQsIGkuZS4gKGR3b3JkKSB7IFZbMC0zXSB9CisgICAgcGFkZGQgICAgICAgICAgbTEsIG02ICAgICAgICAgICAgICAgICA7ICs9IHJnYl9VVnJuZCwgaS5lLiAoZHdvcmQpIHsgVVs0LTddIH0KKyAgICBwYWRkZCAgICAgICAgICBtNCwgbTYgICAgICAgICAgICAgICAgIDsgKz0gcmdiX1VWcm5kLCBpLmUuIChkd29yZCkgeyBWWzQtN10gfQorICAgIHBzcmFkICAgICAgICAgIG0wLCA5CisgICAgcHNyYWQgICAgICAgICAgbTIsIDkKKyAgICBwc3JhZCAgICAgICAgICBtMSwgOQorICAgIHBzcmFkICAgICAgICAgIG00LCA5CisgICAgcGFja3NzZHcgICAgICAgbTAsIG0xICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IFVbMC03XSB9CisgICAgcGFja3NzZHcgICAgICAgbTIsIG00ICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IFZbMC03XSB9CislaWYgbW1zaXplID09IDgKKyAgICBtb3ZhICAgW2RzdFVxK3dxXSwgbTAKKyAgICBtb3ZhICAgW2RzdFZxK3dxXSwgbTIKKyVlbHNlIDsgbW1zaXplID09IDE2CisgICAgbW92YSAgIFtkc3RVcSt3cV0sIG0wCisgICAgbW92YSAgIFtkc3RWcSt3cV0sIG0yCislZW5kaWYgOyBtbXNpemUgPT0gOC8xNgorICAgIGFkZCAgICAgICAgICAgIHdxLCBtbXNpemUKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRpZiA7IEFSQ0hfWDg2XzY0ICYmICUwID09IDMKKyVlbmRtYWNybworCis7ICUxID0gbnIuIG9mIFhNTSByZWdpc3RlcnMgZm9yIHJnYi10by1ZIGZ1bmMKKzsgJTIgPSBuci4gb2YgWE1NIHJlZ2lzdGVycyBmb3IgcmdiLXRvLVVWIGZ1bmMKKyVtYWNybyBSR0IyNF9GVU5DUyAyCitSR0IyNF9UT19ZX0ZOICUxLCByZ2IKK1JHQjI0X1RPX1lfRk4gJTEsIGJnciwgcmdiCitSR0IyNF9UT19VVl9GTiAlMiwgcmdiCitSR0IyNF9UT19VVl9GTiAlMiwgYmdyLCByZ2IKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIG1teAorUkdCMjRfRlVOQ1MgMCwgMAorJWVuZGlmCisKK0lOSVRfWE1NIHNzZTIKK1JHQjI0X0ZVTkNTIDEwLCAxMgorCitJTklUX1hNTSBzc3NlMworUkdCMjRfRlVOQ1MgMTEsIDEzCisKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4CitSR0IyNF9GVU5DUyAxMSwgMTMKKyVlbmRpZgorCis7ICUxID0gbnIuIG9mIFhNTSByZWdpc3RlcnMKKzsgJTItNSA9IHJnYmEsIGJncmEsIGFyZ2Igb3IgYWJnciAoaW4gaW5kaXZpZHVhbCBjaGFyYWN0ZXJzKQorJW1hY3JvIFJHQjMyX1RPX1lfRk4gNS02CitjZ2xvYmFsICUyJTMlNCU1ICUrIFRvWSwgNiwgNiwgJTEsIGRzdCwgc3JjLCB1MSwgdTIsIHcsIHRhYmxlCisgICAgbW92YSAgICAgICAgICAgbTUsIFtyZ2JhX1ljb2VmZl8lMiU0XQorICAgIG1vdmEgICAgICAgICAgIG02LCBbcmdiYV9ZY29lZmZfJTMlNV0KKyVpZiAlMCA9PSA2CisgICAgam1wIG1hbmdsZShwcml2YXRlX3ByZWZpeCAlKyBfICUrICU2ICUrIFRvWSAlKyBTVUZGSVgpLmJvZHkKKyVlbHNlIDsgJTAgPT0gNgorLmJvZHk6CislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgICB3cSwgd2QKKyVlbmRpZgorICAgIGFkZCAgICAgICAgICAgIHdxLCB3cQorICAgIHN1YiAgICAgICAgICAgIHdxLCBtbXNpemUgLSAxCisgICAgbGVhICAgICAgICAgIHNyY3EsIFtzcmNxK3dxKjJdCisgICAgYWRkICAgICAgICAgIGRzdHEsIHdxCisgICAgbmVnICAgICAgICAgICAgd3EKKyAgICBtb3ZhICAgICAgICAgICBtNCwgW3JnYl9Zcm5kXQorICAgIHBjbXBlcWIgICAgICAgIG03LCBtNworICAgIHBzcmx3ICAgICAgICAgIG03LCA4ICAgICAgICAgICAgICAgICAgOyAod29yZCkgeyAweDAwZmYgfSB4NAorLmxvb3A6CisgICAgOyBGSVhNRSBjaGVjayBhbGlnbm1lbnQgYW5kIHVzZSBtb3ZhCisgICAgbW92dSAgICAgICAgICAgbTAsIFtzcmNxK3dxKjIrMF0gICAgICA7IChieXRlKSB7IEJ4LCBHeCwgUngsIHh4IH1bMC0zXQorICAgIG1vdnUgICAgICAgICAgIG0yLCBbc3JjcSt3cSoyK21tc2l6ZV0gOyAoYnl0ZSkgeyBCeCwgR3gsIFJ4LCB4eCB9WzQtN10KKyAgICBERUlOVEIgICAgICAgICAgMSwgIDAsICAzLCAgMiwgIDcgICAgIDsgKHdvcmQpIHsgR3gsIHh4IChtMC9tMikgb3IgQngsIFJ4IChtMS9tMykgfVswLTNdL1s0LTddCisgICAgcG1hZGR3ZCAgICAgICAgbTEsIG01ICAgICAgICAgICAgICAgICA7IChkd29yZCkgeyBCeCpCWSArIFJ4KlJZIH1bMC0zXQorICAgIHBtYWRkd2QgICAgICAgIG0wLCBtNiAgICAgICAgICAgICAgICAgOyAoZHdvcmQpIHsgR3gqR1kgfVswLTNdCisgICAgcG1hZGR3ZCAgICAgICAgbTMsIG01ICAgICAgICAgICAgICAgICA7IChkd29yZCkgeyBCeCpCWSArIFJ4KlJZIH1bNC03XQorICAgIHBtYWRkd2QgICAgICAgIG0yLCBtNiAgICAgICAgICAgICAgICAgOyAoZHdvcmQpIHsgR3gqR1kgfVs0LTddCisgICAgcGFkZGQgICAgICAgICAgbTAsIG00ICAgICAgICAgICAgICAgICA7ICs9IHJnYl9Zcm5kCisgICAgcGFkZGQgICAgICAgICAgbTIsIG00ICAgICAgICAgICAgICAgICA7ICs9IHJnYl9Zcm5kCisgICAgcGFkZGQgICAgICAgICAgbTAsIG0xICAgICAgICAgICAgICAgICA7IChkd29yZCkgeyBZWzAtM10gfQorICAgIHBhZGRkICAgICAgICAgIG0yLCBtMyAgICAgICAgICAgICAgICAgOyAoZHdvcmQpIHsgWVs0LTddIH0KKyAgICBwc3JhZCAgICAgICAgICBtMCwgOQorICAgIHBzcmFkICAgICAgICAgIG0yLCA5CisgICAgcGFja3NzZHcgICAgICAgbTAsIG0yICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IFlbMC03XSB9CisgICAgbW92YSAgICBbZHN0cSt3cV0sIG0wCisgICAgYWRkICAgICAgICAgICAgd3EsIG1tc2l6ZQorICAgIGpsIC5sb29wCisgICAgc3ViICAgICAgICAgICAgd3EsIG1tc2l6ZSAtIDEKKyAgICBqeiAuZW5kCisgICAgYWRkICAgICAgICAgICAgc3JjcSwgMiptbXNpemUgLSAyCisgICAgYWRkICAgICAgICAgICAgZHN0cSwgbW1zaXplIC0gMQorLmxvb3AyOgorICAgIG1vdmQgICAgICAgICAgIG0wLCBbc3JjcSt3cSoyKzBdICAgICAgOyAoYnl0ZSkgeyBCeCwgR3gsIFJ4LCB4eCB9WzAtM10KKyAgICBERUlOVEIgICAgICAgICAgMSwgIDAsICAzLCAgMiwgIDcgICAgIDsgKHdvcmQpIHsgR3gsIHh4IChtMC9tMikgb3IgQngsIFJ4IChtMS9tMykgfVswLTNdL1s0LTddCisgICAgcG1hZGR3ZCAgICAgICAgbTEsIG01ICAgICAgICAgICAgICAgICA7IChkd29yZCkgeyBCeCpCWSArIFJ4KlJZIH1bMC0zXQorICAgIHBtYWRkd2QgICAgICAgIG0wLCBtNiAgICAgICAgICAgICAgICAgOyAoZHdvcmQpIHsgR3gqR1kgfVswLTNdCisgICAgcGFkZGQgICAgICAgICAgbTAsIG00ICAgICAgICAgICAgICAgICA7ICs9IHJnYl9Zcm5kCisgICAgcGFkZGQgICAgICAgICAgbTAsIG0xICAgICAgICAgICAgICAgICA7IChkd29yZCkgeyBZWzAtM10gfQorICAgIHBzcmFkICAgICAgICAgIG0wLCA5CisgICAgcGFja3NzZHcgICAgICAgbTAsIG0wICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IFlbMC03XSB9CisgICAgbW92ZCAgICBbZHN0cSt3cV0sIG0wCisgICAgYWRkICAgICAgICAgICAgd3EsIDIKKyAgICBqbCAubG9vcDIKKy5lbmQ6CisgICAgUkVQX1JFVAorJWVuZGlmIDsgJTAgPT0gMworJWVuZG1hY3JvCisKKzsgJTEgPSBuci4gb2YgWE1NIHJlZ2lzdGVycworOyAlMi01ID0gcmdiYSwgYmdyYSwgYXJnYiBvciBhYmdyIChpbiBpbmRpdmlkdWFsIGNoYXJhY3RlcnMpCislbWFjcm8gUkdCMzJfVE9fVVZfRk4gNS02CitjZ2xvYmFsICUyJTMlNCU1ICUrIFRvVVYsIDcsIDcsICUxLCBkc3RVLCBkc3RWLCB1MSwgc3JjLCB1MiwgdywgdGFibGUKKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdmEgICAgICAgICAgIG04LCBbcmdiYV9VY29lZmZfJTIlNF0KKyAgICBtb3ZhICAgICAgICAgICBtOSwgW3JnYmFfVWNvZWZmXyUzJTVdCisgICAgbW92YSAgICAgICAgICBtMTAsIFtyZ2JhX1Zjb2VmZl8lMiU0XQorICAgIG1vdmEgICAgICAgICAgbTExLCBbcmdiYV9WY29lZmZfJTMlNV0KKyVkZWZpbmUgY29lZmZVMSBtOAorJWRlZmluZSBjb2VmZlUyIG05CislZGVmaW5lIGNvZWZmVjEgbTEwCislZGVmaW5lIGNvZWZmVjIgbTExCislZWxzZSA7IHg4Ni0zMgorJWRlZmluZSBjb2VmZlUxIFtyZ2JhX1Vjb2VmZl8lMiU0XQorJWRlZmluZSBjb2VmZlUyIFtyZ2JhX1Vjb2VmZl8lMyU1XQorJWRlZmluZSBjb2VmZlYxIFtyZ2JhX1Zjb2VmZl8lMiU0XQorJWRlZmluZSBjb2VmZlYyIFtyZ2JhX1Zjb2VmZl8lMyU1XQorJWVuZGlmIDsgeDg2LTY0LzMyCislaWYgQVJDSF9YODZfNjQgJiYgJTAgPT0gNgorICAgIGptcCBtYW5nbGUocHJpdmF0ZV9wcmVmaXggJSsgXyAlKyAlNiAlKyBUb1VWICUrIFNVRkZJWCkuYm9keQorJWVsc2UgOyBBUkNIX1g4Nl82NCAmJiAlMCA9PSA2CisuYm9keToKKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdnN4ZCAgICAgICAgIHdxLCBkd29yZCByNW0KKyVlbHNlIDsgeDg2LTMyCisgICAgbW92ICAgICAgICAgICAgd3EsIHI1bQorJWVuZGlmCisgICAgYWRkICAgICAgICAgICAgd3EsIHdxCisgICAgc3ViICAgICAgICAgICAgd3EsIG1tc2l6ZSAtIDEKKyAgICBhZGQgICAgICAgICBkc3RVcSwgd3EKKyAgICBhZGQgICAgICAgICBkc3RWcSwgd3EKKyAgICBsZWEgICAgICAgICAgc3JjcSwgW3NyY3Erd3EqMl0KKyAgICBuZWcgICAgICAgICAgICB3cQorICAgIHBjbXBlcWIgICAgICAgIG03LCBtNworICAgIHBzcmx3ICAgICAgICAgIG03LCA4ICAgICAgICAgICAgICAgICAgOyAod29yZCkgeyAweDAwZmYgfSB4NAorICAgIG1vdmEgICAgICAgICAgIG02LCBbcmdiX1VWcm5kXQorLmxvb3A6CisgICAgOyBGSVhNRSBjaGVjayBhbGlnbm1lbnQgYW5kIHVzZSBtb3ZhCisgICAgbW92dSAgICAgICAgICAgbTAsIFtzcmNxK3dxKjIrMF0gICAgICA7IChieXRlKSB7IEJ4LCBHeCwgUngsIHh4IH1bMC0zXQorICAgIG1vdnUgICAgICAgICAgIG00LCBbc3JjcSt3cSoyK21tc2l6ZV0gOyAoYnl0ZSkgeyBCeCwgR3gsIFJ4LCB4eCB9WzQtN10KKyAgICBERUlOVEIgICAgICAgICAgMSwgIDAsICA1LCAgNCwgIDcgICAgIDsgKHdvcmQpIHsgR3gsIHh4IChtMC9tNCkgb3IgQngsIFJ4IChtMS9tNSkgfVswLTNdL1s0LTddCisgICAgcG1hZGR3ZCAgICAgICAgbTMsIG0xLCBjb2VmZlYxICAgICAgICA7IChkd29yZCkgeyBCeCpCViArIFJ4KlJWIH1bMC0zXQorICAgIHBtYWRkd2QgICAgICAgIG0yLCBtMCwgY29lZmZWMiAgICAgICAgOyAoZHdvcmQpIHsgR3gqR1YgfVswLTNdCisgICAgcG1hZGR3ZCAgICAgICAgbTEsIGNvZWZmVTEgICAgICAgICAgICA7IChkd29yZCkgeyBCeCpCVSArIFJ4KlJVIH1bMC0zXQorICAgIHBtYWRkd2QgICAgICAgIG0wLCBjb2VmZlUyICAgICAgICAgICAgOyAoZHdvcmQpIHsgR3gqR1UgfVswLTNdCisgICAgcGFkZGQgICAgICAgICAgbTMsIG02ICAgICAgICAgICAgICAgICA7ICs9IHJnYl9VVnJuZAorICAgIHBhZGRkICAgICAgICAgIG0xLCBtNiAgICAgICAgICAgICAgICAgOyArPSByZ2JfVVZybmQKKyAgICBwYWRkZCAgICAgICAgICBtMiwgbTMgICAgICAgICAgICAgICAgIDsgKGR3b3JkKSB7IFZbMC0zXSB9CisgICAgcGFkZGQgICAgICAgICAgbTAsIG0xICAgICAgICAgICAgICAgICA7IChkd29yZCkgeyBVWzAtM10gfQorICAgIHBtYWRkd2QgICAgICAgIG0zLCBtNSwgY29lZmZWMSAgICAgICAgOyAoZHdvcmQpIHsgQngqQlYgKyBSeCpSViB9WzQtN10KKyAgICBwbWFkZHdkICAgICAgICBtMSwgbTQsIGNvZWZmVjIgICAgICAgIDsgKGR3b3JkKSB7IEd4KkdWIH1bNC03XQorICAgIHBtYWRkd2QgICAgICAgIG01LCBjb2VmZlUxICAgICAgICAgICAgOyAoZHdvcmQpIHsgQngqQlUgKyBSeCpSVSB9WzQtN10KKyAgICBwbWFkZHdkICAgICAgICBtNCwgY29lZmZVMiAgICAgICAgICAgIDsgKGR3b3JkKSB7IEd4KkdVIH1bNC03XQorICAgIHBhZGRkICAgICAgICAgIG0zLCBtNiAgICAgICAgICAgICAgICAgOyArPSByZ2JfVVZybmQKKyAgICBwYWRkZCAgICAgICAgICBtNSwgbTYgICAgICAgICAgICAgICAgIDsgKz0gcmdiX1VWcm5kCisgICAgcHNyYWQgICAgICAgICAgbTAsIDkKKyAgICBwYWRkZCAgICAgICAgICBtMSwgbTMgICAgICAgICAgICAgICAgIDsgKGR3b3JkKSB7IFZbNC03XSB9CisgICAgcGFkZGQgICAgICAgICAgbTQsIG01ICAgICAgICAgICAgICAgICA7IChkd29yZCkgeyBVWzQtN10gfQorICAgIHBzcmFkICAgICAgICAgIG0yLCA5CisgICAgcHNyYWQgICAgICAgICAgbTQsIDkKKyAgICBwc3JhZCAgICAgICAgICBtMSwgOQorICAgIHBhY2tzc2R3ICAgICAgIG0wLCBtNCAgICAgICAgICAgICAgICAgOyAod29yZCkgeyBVWzAtN10gfQorICAgIHBhY2tzc2R3ICAgICAgIG0yLCBtMSAgICAgICAgICAgICAgICAgOyAod29yZCkgeyBWWzAtN10gfQorJWlmIG1tc2l6ZSA9PSA4CisgICAgbW92YSAgIFtkc3RVcSt3cV0sIG0wCisgICAgbW92YSAgIFtkc3RWcSt3cV0sIG0yCislZWxzZSA7IG1tc2l6ZSA9PSAxNgorICAgIG1vdmEgICBbZHN0VXErd3FdLCBtMAorICAgIG1vdmEgICBbZHN0VnErd3FdLCBtMgorJWVuZGlmIDsgbW1zaXplID09IDgvMTYKKyAgICBhZGQgICAgICAgICAgICB3cSwgbW1zaXplCisgICAgamwgLmxvb3AKKyAgICBzdWIgICAgICAgICAgICB3cSwgbW1zaXplIC0gMQorICAgIGp6IC5lbmQKKyAgICBhZGQgICAgICAgICAgICBzcmNxICwgMiptbXNpemUgLSAyCisgICAgYWRkICAgICAgICAgICAgZHN0VXEsIG1tc2l6ZSAtIDEKKyAgICBhZGQgICAgICAgICAgICBkc3RWcSwgbW1zaXplIC0gMQorLmxvb3AyOgorICAgIG1vdmQgICAgICAgICAgIG0wLCBbc3JjcSt3cSoyXSAgICAgICAgOyAoYnl0ZSkgeyBCeCwgR3gsIFJ4LCB4eCB9WzAtM10KKyAgICBERUlOVEIgICAgICAgICAgMSwgIDAsICA1LCAgNCwgIDcgICAgIDsgKHdvcmQpIHsgR3gsIHh4IChtMC9tNCkgb3IgQngsIFJ4IChtMS9tNSkgfVswLTNdL1s0LTddCisgICAgcG1hZGR3ZCAgICAgICAgbTMsIG0xLCBjb2VmZlYxICAgICAgICA7IChkd29yZCkgeyBCeCpCViArIFJ4KlJWIH1bMC0zXQorICAgIHBtYWRkd2QgICAgICAgIG0yLCBtMCwgY29lZmZWMiAgICAgICAgOyAoZHdvcmQpIHsgR3gqR1YgfVswLTNdCisgICAgcG1hZGR3ZCAgICAgICAgbTEsIGNvZWZmVTEgICAgICAgICAgICA7IChkd29yZCkgeyBCeCpCVSArIFJ4KlJVIH1bMC0zXQorICAgIHBtYWRkd2QgICAgICAgIG0wLCBjb2VmZlUyICAgICAgICAgICAgOyAoZHdvcmQpIHsgR3gqR1UgfVswLTNdCisgICAgcGFkZGQgICAgICAgICAgbTMsIG02ICAgICAgICAgICAgICAgICA7ICs9IHJnYl9VVnJuZAorICAgIHBhZGRkICAgICAgICAgIG0xLCBtNiAgICAgICAgICAgICAgICAgOyArPSByZ2JfVVZybmQKKyAgICBwYWRkZCAgICAgICAgICBtMiwgbTMgICAgICAgICAgICAgICAgIDsgKGR3b3JkKSB7IFZbMC0zXSB9CisgICAgcGFkZGQgICAgICAgICAgbTAsIG0xICAgICAgICAgICAgICAgICA7IChkd29yZCkgeyBVWzAtM10gfQorICAgIHBzcmFkICAgICAgICAgIG0wLCA5CisgICAgcHNyYWQgICAgICAgICAgbTIsIDkKKyAgICBwYWNrc3NkdyAgICAgICBtMCwgbTAgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgVVswLTddIH0KKyAgICBwYWNrc3NkdyAgICAgICBtMiwgbTIgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgVlswLTddIH0KKyAgICBtb3ZkICAgW2RzdFVxK3dxXSwgbTAKKyAgICBtb3ZkICAgW2RzdFZxK3dxXSwgbTIKKyAgICBhZGQgICAgICAgICAgICB3cSwgMgorICAgIGpsIC5sb29wMgorLmVuZDoKKyAgICBSRVBfUkVUCislZW5kaWYgOyBBUkNIX1g4Nl82NCAmJiAlMCA9PSAzCislZW5kbWFjcm8KKworOyAlMSA9IG5yLiBvZiBYTU0gcmVnaXN0ZXJzIGZvciByZ2ItdG8tWSBmdW5jCis7ICUyID0gbnIuIG9mIFhNTSByZWdpc3RlcnMgZm9yIHJnYi10by1VViBmdW5jCislbWFjcm8gUkdCMzJfRlVOQ1MgMgorUkdCMzJfVE9fWV9GTiAlMSwgciwgZywgYiwgYQorUkdCMzJfVE9fWV9GTiAlMSwgYiwgZywgciwgYSwgcmdiYQorUkdCMzJfVE9fWV9GTiAlMSwgYSwgciwgZywgYiwgcmdiYQorUkdCMzJfVE9fWV9GTiAlMSwgYSwgYiwgZywgciwgcmdiYQorCitSR0IzMl9UT19VVl9GTiAlMiwgciwgZywgYiwgYQorUkdCMzJfVE9fVVZfRk4gJTIsIGIsIGcsIHIsIGEsIHJnYmEKK1JHQjMyX1RPX1VWX0ZOICUyLCBhLCByLCBnLCBiLCByZ2JhCitSR0IzMl9UT19VVl9GTiAlMiwgYSwgYiwgZywgciwgcmdiYQorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggbW14CitSR0IzMl9GVU5DUyAwLCAwCislZW5kaWYKKworSU5JVF9YTU0gc3NlMgorUkdCMzJfRlVOQ1MgOCwgMTIKKworJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK1JHQjMyX0ZVTkNTIDgsIDEyCislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFlVWVYvVVlWWS9OVjEyL05WMjEgcGFja2VkIHBpeGVsIHNodWZmbGluZy4KKzsKKzsgdm9pZCA8Zm10PlRvWV88b3B0Pih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHcpOworOyBhbmQKKzsgdm9pZCA8Zm10PnRvVVZfPG9wdD4odWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgY29uc3QgdWludDhfdCAqc3JjLAorOyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp1bnVzZWQsIGludCB3KTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7ICUxID0gYSAoYWxpZ25lZCkgb3IgdSAodW5hbGlnbmVkKQorOyAlMiA9IHl1eXYgb3IgdXl2eQorJW1hY3JvIExPT1BfWVVZVl9UT19ZIDIKKy5sb29wXyUxOgorICAgIG1vdiUxICAgICAgICAgIG0wLCBbc3JjcSt3cSoyXSAgICAgICAgOyAoYnl0ZSkgeyBZMCwgVTAsIFkxLCBWMCwgLi4uIH0KKyAgICBtb3YlMSAgICAgICAgICBtMSwgW3NyY3Erd3EqMittbXNpemVdIDsgKGJ5dGUpIHsgWTgsIFU0LCBZOSwgVjQsIC4uLiB9CislaWZpZG4gJTIsIHl1eXYKKyAgICBwYW5kICAgICAgICAgICBtMCwgbTIgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgWTAsIFkxLCAuLi4sIFk3IH0KKyAgICBwYW5kICAgICAgICAgICBtMSwgbTIgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgWTgsIFk5LCAuLi4sIFkxNSB9CislZWxzZSA7IHV5dnkKKyAgICBwc3JsdyAgICAgICAgICBtMCwgOCAgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgWTAsIFkxLCAuLi4sIFk3IH0KKyAgICBwc3JsdyAgICAgICAgICBtMSwgOCAgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgWTgsIFk5LCAuLi4sIFkxNSB9CislZW5kaWYgOyB5dXl2L3V5dnkKKyAgICBwYWNrdXN3YiAgICAgICBtMCwgbTEgICAgICAgICAgICAgICAgIDsgKGJ5dGUpIHsgWTAsIC4uLiwgWTE1IH0KKyAgICBtb3ZhICAgIFtkc3RxK3dxXSwgbTAKKyAgICBhZGQgICAgICAgICAgICB3cSwgbW1zaXplCisgICAgamwgLmxvb3BfJTEKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworOyAlMSA9IG5yLiBvZiBYTU0gcmVnaXN0ZXJzCis7ICUyID0geXV5diBvciB1eXZ5Cis7ICUzID0gaWYgc3BlY2lmaWVkLCBpdCBtZWFucyB0aGF0IHVuYWxpZ25lZCBhbmQgYWxpZ25lZCBjb2RlIGluIGxvb3AKKzsgICAgICB3aWxsIGJlIHRoZSBzYW1lIChpLmUuIFlVWVYrQVZYKSwgYW5kIHRodXMgd2UgZG9uJ3QgbmVlZCB0bworOyAgICAgIHNwbGl0IHRoZSBsb29wIGluIGFuIGFsaWduZWQgYW5kIHVuYWxpZ25lZCBjYXNlCislbWFjcm8gWVVZVl9UT19ZX0ZOIDItMworY2dsb2JhbCAlMlRvWSwgNSwgNSwgJTEsIGRzdCwgdW51c2VkMCwgdW51c2VkMSwgc3JjLCB3CislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgICB3cSwgd2QKKyVlbmRpZgorICAgIGFkZCAgICAgICAgICBkc3RxLCB3cQorJWlmIG1tc2l6ZSA9PSAxNgorICAgIHRlc3QgICAgICAgICBzcmNxLCAxNQorJWVuZGlmCisgICAgbGVhICAgICAgICAgIHNyY3EsIFtzcmNxK3dxKjJdCislaWZpZG4gJTIsIHl1eXYKKyAgICBwY21wZXFiICAgICAgICBtMiwgbTIgICAgICAgICAgICAgICAgIDsgKGJ5dGUpIHsgMHhmZiB9IHggMTYKKyAgICBwc3JsdyAgICAgICAgICBtMiwgOCAgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgMHgwMGZmIH0geCA4CislZW5kaWYgOyB5dXl2CislaWYgbW1zaXplID09IDE2CisgICAgam56IC5sb29wX3Vfc3RhcnQKKyAgICBuZWcgICAgICAgICAgICB3cQorICAgIExPT1BfWVVZVl9UT19ZICBhLCAlMgorLmxvb3BfdV9zdGFydDoKKyAgICBuZWcgICAgICAgICAgICB3cQorICAgIExPT1BfWVVZVl9UT19ZICB1LCAlMgorJWVsc2UgOyBtbXNpemUgPT0gOAorICAgIG5lZyAgICAgICAgICAgIHdxCisgICAgTE9PUF9ZVVlWX1RPX1kgIGEsICUyCislZW5kaWYgOyBtbXNpemUgPT0gOC8xNgorJWVuZG1hY3JvCisKKzsgJTEgPSBhIChhbGlnbmVkKSBvciB1ICh1bmFsaWduZWQpCis7ICUyID0geXV5diBvciB1eXZ5CislbWFjcm8gTE9PUF9ZVVlWX1RPX1VWIDIKKy5sb29wXyUxOgorJWlmaWRuICUyLCB5dXl2CisgICAgbW92JTEgICAgICAgICAgbTAsIFtzcmNxK3dxKjRdICAgICAgICA7IChieXRlKSB7IFkwLCBVMCwgWTEsIFYwLCAuLi4gfQorICAgIG1vdiUxICAgICAgICAgIG0xLCBbc3JjcSt3cSo0K21tc2l6ZV0gOyAoYnl0ZSkgeyBZOCwgVTQsIFk5LCBWNCwgLi4uIH0KKyAgICBwc3JsdyAgICAgICAgICBtMCwgOCAgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgVTAsIFYwLCAuLi4sIFUzLCBWMyB9CisgICAgcHNybHcgICAgICAgICAgbTEsIDggICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IFU0LCBWNCwgLi4uLCBVNywgVjcgfQorJWVsc2UgOyB1eXZ5CislaWYgY3B1ZmxhZyhhdngpCisgICAgdnBhbmQgICAgICAgICAgbTAsIG0yLCBbc3JjcSt3cSo0XSAgICAgICAgOyAod29yZCkgeyBVMCwgVjAsIC4uLiwgVTMsIFYzIH0KKyAgICB2cGFuZCAgICAgICAgICBtMSwgbTIsIFtzcmNxK3dxKjQrbW1zaXplXSA7ICh3b3JkKSB7IFU0LCBWNCwgLi4uLCBVNywgVjcgfQorJWVsc2UKKyAgICBtb3YlMSAgICAgICAgICBtMCwgW3NyY3Erd3EqNF0gICAgICAgIDsgKGJ5dGUpIHsgWTAsIFUwLCBZMSwgVjAsIC4uLiB9CisgICAgbW92JTEgICAgICAgICAgbTEsIFtzcmNxK3dxKjQrbW1zaXplXSA7IChieXRlKSB7IFk4LCBVNCwgWTksIFY0LCAuLi4gfQorICAgIHBhbmQgICAgICAgICAgIG0wLCBtMiAgICAgICAgICAgICAgICAgOyAod29yZCkgeyBVMCwgVjAsIC4uLiwgVTMsIFYzIH0KKyAgICBwYW5kICAgICAgICAgICBtMSwgbTIgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgVTQsIFY0LCAuLi4sIFU3LCBWNyB9CislZW5kaWYKKyVlbmRpZiA7IHl1eXYvdXl2eQorICAgIHBhY2t1c3diICAgICAgIG0wLCBtMSAgICAgICAgICAgICAgICAgOyAoYnl0ZSkgeyBVMCwgVjAsIC4uLiwgVTcsIFY3IH0KKyAgICBwYW5kICAgICAgICAgICBtMSwgbTAsIG0yICAgICAgICAgICAgIDsgKHdvcmQpIHsgVTAsIFUxLCAuLi4sIFU3IH0KKyAgICBwc3JsdyAgICAgICAgICBtMCwgOCAgICAgICAgICAgICAgICAgIDsgKHdvcmQpIHsgVjAsIFYxLCAuLi4sIFY3IH0KKyVpZiBtbXNpemUgPT0gMTYKKyAgICBwYWNrdXN3YiAgICAgICBtMSwgbTAgICAgICAgICAgICAgICAgIDsgKGJ5dGUpIHsgVTAsIC4uLiBVNywgVjEsIC4uLiBWNyB9CisgICAgbW92aCAgIFtkc3RVcSt3cV0sIG0xCisgICAgbW92aHBzIFtkc3RWcSt3cV0sIG0xCislZWxzZSA7IG1tc2l6ZSA9PSA4CisgICAgcGFja3Vzd2IgICAgICAgbTEsIG0xICAgICAgICAgICAgICAgICA7IChieXRlKSB7IFUwLCAuLi4gVTMgfQorICAgIHBhY2t1c3diICAgICAgIG0wLCBtMCAgICAgICAgICAgICAgICAgOyAoYnl0ZSkgeyBWMCwgLi4uIFYzIH0KKyAgICBtb3ZoICAgW2RzdFVxK3dxXSwgbTEKKyAgICBtb3ZoICAgW2RzdFZxK3dxXSwgbTAKKyVlbmRpZiA7IG1tc2l6ZSA9PSA4LzE2CisgICAgYWRkICAgICAgICAgICAgd3EsIG1tc2l6ZSAvIDIKKyAgICBqbCAubG9vcF8lMQorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCis7ICUxID0gbnIuIG9mIFhNTSByZWdpc3RlcnMKKzsgJTIgPSB5dXl2IG9yIHV5dnkKKzsgJTMgPSBpZiBzcGVjaWZpZWQsIGl0IG1lYW5zIHRoYXQgdW5hbGlnbmVkIGFuZCBhbGlnbmVkIGNvZGUgaW4gbG9vcAorOyAgICAgIHdpbGwgYmUgdGhlIHNhbWUgKGkuZS4gVVlWWStBVlgpLCBhbmQgdGh1cyB3ZSBkb24ndCBuZWVkIHRvCis7ICAgICAgc3BsaXQgdGhlIGxvb3AgaW4gYW4gYWxpZ25lZCBhbmQgdW5hbGlnbmVkIGNhc2UKKyVtYWNybyBZVVlWX1RPX1VWX0ZOIDItMworY2dsb2JhbCAlMlRvVVYsIDQsIDUsICUxLCBkc3RVLCBkc3RWLCB1bnVzZWQsIHNyYywgdworJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92c3hkICAgICAgICAgd3EsIGR3b3JkIHI1bQorJWVsc2UgOyB4ODYtMzIKKyAgICBtb3YgICAgICAgICAgICB3cSwgcjVtCislZW5kaWYKKyAgICBhZGQgICAgICAgICBkc3RVcSwgd3EKKyAgICBhZGQgICAgICAgICBkc3RWcSwgd3EKKyVpZiBtbXNpemUgPT0gMTYgJiYgJTAgPT0gMgorICAgIHRlc3QgICAgICAgICBzcmNxLCAxNQorJWVuZGlmCisgICAgbGVhICAgICAgICAgIHNyY3EsIFtzcmNxK3dxKjRdCisgICAgcGNtcGVxYiAgICAgICAgbTIsIG0yICAgICAgICAgICAgICAgICA7IChieXRlKSB7IDB4ZmYgfSB4IDE2CisgICAgcHNybHcgICAgICAgICAgbTIsIDggICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IDB4MDBmZiB9IHggOAorICAgIDsgTk9URTogaWYgdXl2eSthdngsIHUvYSBhcmUgaWRlbnRpY2FsCislaWYgbW1zaXplID09IDE2ICYmICUwID09IDIKKyAgICBqbnogLmxvb3BfdV9zdGFydAorICAgIG5lZyAgICAgICAgICAgIHdxCisgICAgTE9PUF9ZVVlWX1RPX1VWIGEsICUyCisubG9vcF91X3N0YXJ0OgorICAgIG5lZyAgICAgICAgICAgIHdxCisgICAgTE9PUF9ZVVlWX1RPX1VWIHUsICUyCislZWxzZSA7IG1tc2l6ZSA9PSA4CisgICAgbmVnICAgICAgICAgICAgd3EKKyAgICBMT09QX1lVWVZfVE9fVVYgYSwgJTIKKyVlbmRpZiA7IG1tc2l6ZSA9PSA4LzE2CislZW5kbWFjcm8KKworOyAlMSA9IGEgKGFsaWduZWQpIG9yIHUgKHVuYWxpZ25lZCkKKzsgJTIgPSBudjEyIG9yIG52MjEKKyVtYWNybyBMT09QX05WWFhfVE9fVVYgMgorLmxvb3BfJTE6CisgICAgbW92JTEgICAgICAgICAgbTAsIFtzcmNxK3dxKjJdICAgICAgICA7IChieXRlKSB7IFUwLCBWMCwgVTEsIFYxLCAuLi4gfQorICAgIG1vdiUxICAgICAgICAgIG0xLCBbc3JjcSt3cSoyK21tc2l6ZV0gOyAoYnl0ZSkgeyBVOCwgVjgsIFU5LCBWOSwgLi4uIH0KKyAgICBwYW5kICAgICAgICAgICBtMiwgbTAsIG01ICAgICAgICAgICAgIDsgKHdvcmQpIHsgVTAsIFUxLCAuLi4sIFU3IH0KKyAgICBwYW5kICAgICAgICAgICBtMywgbTEsIG01ICAgICAgICAgICAgIDsgKHdvcmQpIHsgVTgsIFU5LCAuLi4sIFUxNSB9CisgICAgcHNybHcgICAgICAgICAgbTAsIDggICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IFYwLCBWMSwgLi4uLCBWNyB9CisgICAgcHNybHcgICAgICAgICAgbTEsIDggICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IFY4LCBWOSwgLi4uLCBWMTUgfQorICAgIHBhY2t1c3diICAgICAgIG0yLCBtMyAgICAgICAgICAgICAgICAgOyAoYnl0ZSkgeyBVMCwgLi4uLCBVMTUgfQorICAgIHBhY2t1c3diICAgICAgIG0wLCBtMSAgICAgICAgICAgICAgICAgOyAoYnl0ZSkgeyBWMCwgLi4uLCBWMTUgfQorJWlmaWRuICUyLCBudjEyCisgICAgbW92YSAgIFtkc3RVcSt3cV0sIG0yCisgICAgbW92YSAgIFtkc3RWcSt3cV0sIG0wCislZWxzZSA7IG52MjEKKyAgICBtb3ZhICAgW2RzdFZxK3dxXSwgbTIKKyAgICBtb3ZhICAgW2RzdFVxK3dxXSwgbTAKKyVlbmRpZiA7IG52MTIvMjEKKyAgICBhZGQgICAgICAgICAgICB3cSwgbW1zaXplCisgICAgamwgLmxvb3BfJTEKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworOyAlMSA9IG5yLiBvZiBYTU0gcmVnaXN0ZXJzCis7ICUyID0gbnYxMiBvciBudjIxCislbWFjcm8gTlZYWF9UT19VVl9GTiAyCitjZ2xvYmFsICUyVG9VViwgNCwgNSwgJTEsIGRzdFUsIGRzdFYsIHVudXNlZCwgc3JjLCB3CislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgICB3cSwgZHdvcmQgcjVtCislZWxzZSA7IHg4Ni0zMgorICAgIG1vdiAgICAgICAgICAgIHdxLCByNW0KKyVlbmRpZgorICAgIGFkZCAgICAgICAgIGRzdFVxLCB3cQorICAgIGFkZCAgICAgICAgIGRzdFZxLCB3cQorJWlmIG1tc2l6ZSA9PSAxNgorICAgIHRlc3QgICAgICAgICBzcmNxLCAxNQorJWVuZGlmCisgICAgbGVhICAgICAgICAgIHNyY3EsIFtzcmNxK3dxKjJdCisgICAgcGNtcGVxYiAgICAgICAgbTUsIG01ICAgICAgICAgICAgICAgICA7IChieXRlKSB7IDB4ZmYgfSB4IDE2CisgICAgcHNybHcgICAgICAgICAgbTUsIDggICAgICAgICAgICAgICAgICA7ICh3b3JkKSB7IDB4MDBmZiB9IHggOAorJWlmIG1tc2l6ZSA9PSAxNgorICAgIGpueiAubG9vcF91X3N0YXJ0CisgICAgbmVnICAgICAgICAgICAgd3EKKyAgICBMT09QX05WWFhfVE9fVVYgYSwgJTIKKy5sb29wX3Vfc3RhcnQ6CisgICAgbmVnICAgICAgICAgICAgd3EKKyAgICBMT09QX05WWFhfVE9fVVYgdSwgJTIKKyVlbHNlIDsgbW1zaXplID09IDgKKyAgICBuZWcgICAgICAgICAgICB3cQorICAgIExPT1BfTlZYWF9UT19VViBhLCAlMgorJWVuZGlmIDsgbW1zaXplID09IDgvMTYKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIG1teAorWVVZVl9UT19ZX0ZOICAwLCB5dXl2CitZVVlWX1RPX1lfRk4gIDAsIHV5dnkKK1lVWVZfVE9fVVZfRk4gMCwgeXV5dgorWVVZVl9UT19VVl9GTiAwLCB1eXZ5CitOVlhYX1RPX1VWX0ZOIDAsIG52MTIKK05WWFhfVE9fVVZfRk4gMCwgbnYyMQorJWVuZGlmCisKK0lOSVRfWE1NIHNzZTIKK1lVWVZfVE9fWV9GTiAgMywgeXV5dgorWVVZVl9UT19ZX0ZOICAyLCB1eXZ5CitZVVlWX1RPX1VWX0ZOIDMsIHl1eXYKK1lVWVZfVE9fVVZfRk4gMywgdXl2eQorTlZYWF9UT19VVl9GTiA1LCBudjEyCitOVlhYX1RPX1VWX0ZOIDUsIG52MjEKKworJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKKzsgaW4gdGhlb3J5LCB3ZSBjb3VsZCB3cml0ZSBhIHl1eTItdG8teSB1c2luZyB2cGFuZCAoaS5lLiBBVlgpLCBidXQKKzsgdGhhdCdzIG5vdCBmYXN0ZXIgaW4gcHJhY3RpY2UKK1lVWVZfVE9fVVZfRk4gMywgeXV5dgorWVVZVl9UT19VVl9GTiAzLCB1eXZ5LCAxCitOVlhYX1RPX1VWX0ZOIDUsIG52MTIKK05WWFhfVE9fVVZfRk4gNSwgbnYyMQorJWVuZGlmCmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS94ODYvb3V0cHV0LmFzbSBiL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni9vdXRwdXQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTRhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS94ODYvb3V0cHV0LmFzbQpAQCAtMCwwICsxLDQxMyBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2LW9wdGltaXplZCB2ZXJ0aWNhbCBsaW5lIHNjYWxpbmcgZnVuY3Rpb25zCis7KiBDb3B5cmlnaHQgKGMpIDIwMTEgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amVAZ21haWwuY29tPgorOyogICAgICAgICAgICAgICAgICAgIEtpZXJhbiBLdW5oeWEgPGtpZXJhbkBrdW5oeWEuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK21pbnNob3J0OiAgICAgIHRpbWVzIDggZHcgMHg4MDAwCit5dXYyeXV2WF8xNl9zdGFydDogIHRpbWVzIDQgZGQgMHg0MDAwIC0gMHg0MDAwMDAwMAoreXV2Mnl1dlhfMTBfc3RhcnQ6ICB0aW1lcyA0IGRkIDB4MTAwMDAKK3l1djJ5dXZYXzlfc3RhcnQ6ICAgdGltZXMgNCBkZCAweDIwMDAwCit5dXYyeXV2WF8xMF91cHBlcjogIHRpbWVzIDggZHcgMHgzZmYKK3l1djJ5dXZYXzlfdXBwZXI6ICAgdGltZXMgOCBkdyAweDFmZgorcGRfNDogICAgICAgICAgdGltZXMgNCBkZCA0CitwZF80bWluMHg0MDAwMDp0aW1lcyA0IGRkIDQgLSAoMHg0MDAwMCkKK3B3XzE2OiAgICAgICAgIHRpbWVzIDggZHcgMTYKK3B3XzMyOiAgICAgICAgIHRpbWVzIDggZHcgMzIKK3B3XzUxMjogICAgICAgIHRpbWVzIDggZHcgNTEyCitwd18xMDI0OiAgICAgICB0aW1lcyA4IGR3IDEwMjQKKworU0VDVElPTiAudGV4dAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdmVydGljYWwgbGluZSBzY2FsaW5nCis7Cis7IHZvaWQgeXV2MnBsYW5lMV88b3V0cHV0X3NpemU+XzxvcHQ+KGNvbnN0IGludDE2X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgZHN0VywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGl0aGVyLCBpbnQgb2Zmc2V0KQorOyBhbmQKKzsgdm9pZCB5dXYycGxhbmVYXzxvdXRwdXRfc2l6ZT5fPG9wdD4oY29uc3QgaW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdGVyU2l6ZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKnNyYywgdWludDhfdCAqZHN0LCBpbnQgZHN0VywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGl0aGVyLCBpbnQgb2Zmc2V0KQorOworOyBTY2FsZSBvbmUgb3IgJGZpbHRlclNpemUgbGluZXMgb2Ygc291cmNlIGRhdGEgdG8gZ2VuZXJhdGUgb25lIGxpbmUgb2Ygb3V0cHV0Cis7IGRhdGEuIFRoZSBpbnB1dCBpcyAxNS1iaXQgaW4gaW50MTZfdCBpZiAkb3V0cHV0X3NpemUgaXMgWzgsMTBdIGFuZCAxOS1iaXQgaW4KKzsgaW50MzJfdCBpZiAkb3V0cHV0X3NpemUgaXMgMTYuICRmaWx0ZXIgaXMgMTItYml0cy4gJGZpbHRlclNpemUgaXMgYSBtdWx0aXBsZQorOyBvZiAyLiAkb2Zmc2V0IGlzIGVpdGhlciAwIG9yIDMuICRkaXRoZXIgaG9sZHMgOCB2YWx1ZXMuCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIHl1djJwbGFuZVhfZm4gMworCislaWYgQVJDSF9YODZfMzIKKyVkZWZpbmUgY250cl9yZWcgZmx0c2l6ZXEKKyVkZWZpbmUgbW92c3ggbW92CislZWxzZQorJWRlZmluZSBjbnRyX3JlZyByNworJWRlZmluZSBtb3ZzeCBtb3ZzeGQKKyVlbmRpZgorCitjZ2xvYmFsIHl1djJwbGFuZVhfJTEsICUzLCA4LCAlMiwgZmlsdGVyLCBmbHRzaXplLCBzcmMsIGRzdCwgdywgZGl0aGVyLCBvZmZzZXQKKyVpZiAlMSA9PSA4IHx8ICUxID09IDkgfHwgJTEgPT0gMTAKKyAgICBweG9yICAgICAgICAgICAgbTYsICBtNgorJWVuZGlmIDsgJTEgPT0gOC85LzEwCisKKyVpZiAlMSA9PSA4CislaWYgQVJDSF9YODZfMzIKKyVhc3NpZ24gcGFkIDB4MmMgLSAoc3RhY2tfb2Zmc2V0ICYgMTUpCisgICAgU1VCICAgICAgICAgICAgIHJzcCwgcGFkCislZGVmaW5lIG1fZGl0aCBtNworJWVsc2UgOyB4ODYtNjQKKyVkZWZpbmUgbV9kaXRoIG05CislZW5kaWYgOyB4ODYtMzIKKworICAgIDsgY3JlYXRlIHJlZ2lzdGVycyBob2xkaW5nIGRpdGhlcgorICAgIG1vdnEgICAgICAgIG1fZGl0aCwgW2RpdGhlcnFdICAgICAgICA7IGRpdGhlcgorICAgIHRlc3QgICAgICAgIG9mZnNldGQsIG9mZnNldGQKKyAgICBqeiAgICAgICAgICAgICAgLm5vX3JvdAorJWlmIG1tc2l6ZSA9PSAxNgorICAgIHB1bnBja2xxZHEgIG1fZGl0aCwgIG1fZGl0aAorJWVuZGlmIDsgbW1zaXplID09IDE2CisgICAgUEFMSUdOUiAgICAgbV9kaXRoLCAgbV9kaXRoLCAgMywgIG0wCisubm9fcm90OgorJWlmIG1tc2l6ZSA9PSAxNgorICAgIHB1bnBja2xidyAgIG1fZGl0aCwgIG02CislaWYgQVJDSF9YODZfNjQKKyAgICBwdW5wY2tsd2QgICAgICAgbTgsICBtX2RpdGgsICBtNgorICAgIHBzbGxkICAgICAgICAgICBtOCwgIDEyCislZWxzZSA7IHg4Ni0zMgorICAgIHB1bnBja2x3ZCAgICAgICBtNSwgIG1fZGl0aCwgIG02CisgICAgcHNsbGQgICAgICAgICAgIG01LCAgMTIKKyVlbmRpZiA7IHg4Ni0zMi82NAorICAgIHB1bnBja2h3ZCAgIG1fZGl0aCwgIG02CisgICAgcHNsbGQgICAgICAgbV9kaXRoLCAgMTIKKyVpZiBBUkNIX1g4Nl8zMgorICAgIG1vdmEgICAgICBbcnNwKyAwXSwgIG01CisgICAgbW92YSAgICAgIFtyc3ArMTZdLCAgbV9kaXRoCislZW5kaWYKKyVlbHNlIDsgbW1zaXplID09IDgKKyAgICBwdW5wY2tsYncgICAgICAgbTUsICBtX2RpdGgsICBtNgorICAgIHB1bnBja2hidyAgIG1fZGl0aCwgIG02CisgICAgcHVucGNrbHdkICAgICAgIG00LCAgbTUsICBtNgorICAgIHB1bnBja2h3ZCAgICAgICBtNSwgIG02CisgICAgcHVucGNrbHdkICAgICAgIG0zLCAgbV9kaXRoLCAgbTYKKyAgICBwdW5wY2tod2QgICBtX2RpdGgsICBtNgorICAgIHBzbGxkICAgICAgICAgICBtNCwgIDEyCisgICAgcHNsbGQgICAgICAgICAgIG01LCAgMTIKKyAgICBwc2xsZCAgICAgICAgICAgbTMsICAxMgorICAgIHBzbGxkICAgICAgIG1fZGl0aCwgIDEyCisgICAgbW92YSAgICAgIFtyc3ArIDBdLCAgbTQKKyAgICBtb3ZhICAgICAgW3JzcCsgOF0sICBtNQorICAgIG1vdmEgICAgICBbcnNwKzE2XSwgIG0zCisgICAgbW92YSAgICAgIFtyc3ArMjRdLCAgbV9kaXRoCislZW5kaWYgOyBtbXNpemUgPT0gOC8xNgorJWVuZGlmIDsgJTEgPT0gOAorCisgICAgeG9yICAgICAgICAgICAgIHI1LCAgcjUKKworLnBpeGVsbG9vcDoKKyVhc3NpZ24gJSVpIDAKKyAgICA7IHRoZSByZXAgaGVyZSBpcyBmb3IgdGhlIDhiaXQgb3V0cHV0IG1teCBjYXNlLCB3aGVyZSBkaXRoZXIgY292ZXJzCisgICAgOyA4IHBpeGVscyBidXQgd2UgY2FuIG9ubHkgaGFuZGxlIDIgcGl4ZWxzIHBlciByZWdpc3RlciwgYW5kIHRodXMgNAorICAgIDsgcGl4ZWxzIHBlciBpdGVyYXRpb24uIEluIG9yZGVyIHRvIG5vdCBoYXZlIHRvIGtlZXAgdHJhY2sgb2Ygd2hlcmUKKyAgICA7IHdlIGFyZSB3LnIudC4gZGl0aGVyaW5nLCB3ZSB1bnJvbGwgdGhlIG1teC84Yml0IGxvb3AgeDIuCislaWYgJTEgPT0gOAorJWFzc2lnbiAlJXJlcGNudCAxNi9tbXNpemUKKyVlbHNlCislYXNzaWduICUlcmVwY250IDEKKyVlbmRpZgorCislcmVwICUlcmVwY250CisKKyVpZiAlMSA9PSA4CislaWYgQVJDSF9YODZfMzIKKyAgICBtb3ZhICAgICAgICAgICAgbTIsIFtyc3ArbW1zaXplKigwKyUlaSldCisgICAgbW92YSAgICAgICAgICAgIG0xLCBbcnNwK21tc2l6ZSooMSslJWkpXQorJWVsc2UgOyB4ODYtNjQKKyAgICBtb3ZhICAgICAgICAgICAgbTIsICBtOAorICAgIG1vdmEgICAgICAgICAgICBtMSwgIG1fZGl0aAorJWVuZGlmIDsgeDg2LTMyLzY0CislZWxzZSA7ICUxID09IDkvMTAvMTYKKyAgICBtb3ZhICAgICAgICAgICAgbTEsIFt5dXYyeXV2WF8lMV9zdGFydF0KKyAgICBtb3ZhICAgICAgICAgICAgbTIsICBtMQorJWVuZGlmIDsgJTEgPT0gOC85LzEwLzE2CisgICAgbW92c3ggICAgIGNudHJfcmVnLCAgZmx0c2l6ZW0KKy5maWx0ZXJsb29wXyAlKyAlJWk6CisgICAgOyBpbnB1dCBwaXhlbHMKKyAgICBtb3YgICAgICAgICAgICAgcjYsIFtzcmNxK2dwcnNpemUqY250cl9yZWctMipncHJzaXplXQorJWlmICUxID09IDE2CisgICAgbW92YSAgICAgICAgICAgIG0zLCBbcjYrcjUqNF0KKyAgICBtb3ZhICAgICAgICAgICAgbTUsIFtyNityNSo0K21tc2l6ZV0KKyVlbHNlIDsgJTEgPT0gOC85LzEwCisgICAgbW92YSAgICAgICAgICAgIG0zLCBbcjYrcjUqMl0KKyVlbmRpZiA7ICUxID09IDgvOS8xMC8xNgorICAgIG1vdiAgICAgICAgICAgICByNiwgW3NyY3ErZ3Byc2l6ZSpjbnRyX3JlZy1ncHJzaXplXQorJWlmICUxID09IDE2CisgICAgbW92YSAgICAgICAgICAgIG00LCBbcjYrcjUqNF0KKyAgICBtb3ZhICAgICAgICAgICAgbTYsIFtyNityNSo0K21tc2l6ZV0KKyVlbHNlIDsgJTEgPT0gOC85LzEwCisgICAgbW92YSAgICAgICAgICAgIG00LCBbcjYrcjUqMl0KKyVlbmRpZiA7ICUxID09IDgvOS8xMC8xNgorCisgICAgOyBjb2VmZmljaWVudHMKKyAgICBtb3ZkICAgICAgICAgICAgbTAsIFtmaWx0ZXJxKzIqY250cl9yZWctNF0gOyBjb2VmZlswXSwgY29lZmZbMV0KKyVpZiAlMSA9PSAxNgorICAgIHBzaHVmbHcgICAgICAgICBtNywgIG0wLCAgMCAgICAgICAgICA7IGNvZWZmWzBdCisgICAgcHNodWZsdyAgICAgICAgIG0wLCAgbTAsICAweDU1ICAgICAgIDsgY29lZmZbMV0KKyAgICBwbW92c3h3ZCAgICAgICAgbTcsICBtNyAgICAgICAgICAgICAgOyB3b3JkIC0+IGR3b3JkCisgICAgcG1vdnN4d2QgICAgICAgIG0wLCAgbTAgICAgICAgICAgICAgIDsgd29yZCAtPiBkd29yZAorCisgICAgcG11bGxkICAgICAgICAgIG0zLCAgbTcKKyAgICBwbXVsbGQgICAgICAgICAgbTUsICBtNworICAgIHBtdWxsZCAgICAgICAgICBtNCwgIG0wCisgICAgcG11bGxkICAgICAgICAgIG02LCAgbTAKKworICAgIHBhZGRkICAgICAgICAgICBtMiwgIG0zCisgICAgcGFkZGQgICAgICAgICAgIG0xLCAgbTUKKyAgICBwYWRkZCAgICAgICAgICAgbTIsICBtNAorICAgIHBhZGRkICAgICAgICAgICBtMSwgIG02CislZWxzZSA7ICUxID09IDEwLzkvOAorICAgIHB1bnBja2x3ZCAgICAgICBtNSwgIG0zLCAgbTQKKyAgICBwdW5wY2tod2QgICAgICAgbTMsICBtNAorICAgIFNQTEFURCAgICAgICAgICBtMAorCisgICAgcG1hZGR3ZCAgICAgICAgIG01LCAgbTAKKyAgICBwbWFkZHdkICAgICAgICAgbTMsICBtMAorCisgICAgcGFkZGQgICAgICAgICAgIG0yLCAgbTUKKyAgICBwYWRkZCAgICAgICAgICAgbTEsICBtMworJWVuZGlmIDsgJTEgPT0gOC85LzEwLzE2CisKKyAgICBzdWIgICAgICAgY250cl9yZWcsICAyCisgICAgamcgLmZpbHRlcmxvb3BfICUrICUlaQorCislaWYgJTEgPT0gMTYKKyAgICBwc3JhZCAgICAgICAgICAgbTIsICAzMSAtICUxCisgICAgcHNyYWQgICAgICAgICAgIG0xLCAgMzEgLSAlMQorJWVsc2UgOyAlMSA9PSAxMC85LzgKKyAgICBwc3JhZCAgICAgICAgICAgbTIsICAyNyAtICUxCisgICAgcHNyYWQgICAgICAgICAgIG0xLCAgMjcgLSAlMQorJWVuZGlmIDsgJTEgPT0gOC85LzEwLzE2CisKKyVpZiAlMSA9PSA4CisgICAgcGFja3NzZHcgICAgICAgIG0yLCAgbTEKKyAgICBwYWNrdXN3YiAgICAgICAgbTIsICBtMgorICAgIG1vdmggICBbZHN0cStyNSoxXSwgIG0yCislZWxzZSA7ICUxID09IDkvMTAvMTYKKyVpZiAlMSA9PSAxNgorICAgIHBhY2tzc2R3ICAgICAgICBtMiwgIG0xCisgICAgcGFkZHcgICAgICAgICAgIG0yLCBbbWluc2hvcnRdCislZWxzZSA7ICUxID09IDkvMTAKKyVpZiBjcHVmbGFnKHNzZTQpCisgICAgcGFja3VzZHcgICAgICAgIG0yLCAgbTEKKyVlbHNlIDsgbW14ZXh0L3NzZTIKKyAgICBwYWNrc3NkdyAgICAgICAgbTIsICBtMQorICAgIHBtYXhzdyAgICAgICAgICBtMiwgIG02CislZW5kaWYgOyBtbXhleHQvc3NlMi9zc2U0L2F2eAorICAgIHBtaW5zdyAgICAgICAgICBtMiwgW3l1djJ5dXZYXyUxX3VwcGVyXQorJWVuZGlmIDsgJTEgPT0gOS8xMC8xNgorICAgIG1vdmEgICBbZHN0cStyNSoyXSwgIG0yCislZW5kaWYgOyAlMSA9PSA4LzkvMTAvMTYKKworICAgIGFkZCAgICAgICAgICAgICByNSwgIG1tc2l6ZS8yCisgICAgc3ViICAgICAgICAgICAgIHdkLCAgbW1zaXplLzIKKworJWFzc2lnbiAlJWkgJSVpKzIKKyVlbmRyZXAKKyAgICBqZyAucGl4ZWxsb29wCisKKyVpZiAlMSA9PSA4CislaWYgQVJDSF9YODZfMzIKKyAgICBBREQgICAgICAgICAgICAgcnNwLCBwYWQKKyAgICBSRVQKKyVlbHNlIDsgeDg2LTY0CisgICAgUkVQX1JFVAorJWVuZGlmIDsgeDg2LTMyLzY0CislZWxzZSA7ICUxID09IDkvMTAvMTYKKyAgICBSRVBfUkVUCislZW5kaWYgOyAlMSA9PSA4LzkvMTAvMTYKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIG1teGV4dAoreXV2MnBsYW5lWF9mbiAgOCwgIDAsIDcKK3l1djJwbGFuZVhfZm4gIDksICAwLCA1Cit5dXYycGxhbmVYX2ZuIDEwLCAgMCwgNQorJWVuZGlmCisKK0lOSVRfWE1NIHNzZTIKK3l1djJwbGFuZVhfZm4gIDgsIDEwLCA3Cit5dXYycGxhbmVYX2ZuICA5LCAgNywgNQoreXV2MnBsYW5lWF9mbiAxMCwgIDcsIDUKKworSU5JVF9YTU0gc3NlNAoreXV2MnBsYW5lWF9mbiAgOCwgMTAsIDcKK3l1djJwbGFuZVhfZm4gIDksICA3LCA1Cit5dXYycGxhbmVYX2ZuIDEwLCAgNywgNQoreXV2MnBsYW5lWF9mbiAxNiwgIDgsIDUKKworJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1hNTSBhdngKK3l1djJwbGFuZVhfZm4gIDgsIDEwLCA3Cit5dXYycGxhbmVYX2ZuICA5LCAgNywgNQoreXV2MnBsYW5lWF9mbiAxMCwgIDcsIDUKKyVlbmRpZgorCis7ICUxPW91dG91dC1icGMsICUyPWFsaWdubWVudCAodS9hKQorJW1hY3JvIHl1djJwbGFuZTFfbWFpbmxvb3AgMgorLmxvb3BfJTI6CislaWYgJTEgPT0gOAorICAgIHBhZGRzdyAgICAgICAgICBtMCwgbTIsIFtzcmNxK3dxKjIrbW1zaXplKjBdCisgICAgcGFkZHN3ICAgICAgICAgIG0xLCBtMywgW3NyY3Erd3EqMittbXNpemUqMV0KKyAgICBwc3JhdyAgICAgICAgICAgbTAsIDcKKyAgICBwc3JhdyAgICAgICAgICAgbTEsIDcKKyAgICBwYWNrdXN3YiAgICAgICAgbTAsIG0xCisgICAgbW92JTIgICAgW2RzdHErd3FdLCBtMAorJWVsaWYgJTEgPT0gMTYKKyAgICBwYWRkZCAgICAgICAgICAgbTAsIG00LCBbc3JjcSt3cSo0K21tc2l6ZSowXQorICAgIHBhZGRkICAgICAgICAgICBtMSwgbTQsIFtzcmNxK3dxKjQrbW1zaXplKjFdCisgICAgcGFkZGQgICAgICAgICAgIG0yLCBtNCwgW3NyY3Erd3EqNCttbXNpemUqMl0KKyAgICBwYWRkZCAgICAgICAgICAgbTMsIG00LCBbc3JjcSt3cSo0K21tc2l6ZSozXQorICAgIHBzcmFkICAgICAgICAgICBtMCwgMworICAgIHBzcmFkICAgICAgICAgICBtMSwgMworICAgIHBzcmFkICAgICAgICAgICBtMiwgMworICAgIHBzcmFkICAgICAgICAgICBtMywgMworJWlmIGNwdWZsYWcoc3NlNCkgOyBhdngvc3NlNAorICAgIHBhY2t1c2R3ICAgICAgICBtMCwgbTEKKyAgICBwYWNrdXNkdyAgICAgICAgbTIsIG0zCislZWxzZSA7IG1teC9zc2UyCisgICAgcGFja3NzZHcgICAgICAgIG0wLCBtMQorICAgIHBhY2tzc2R3ICAgICAgICBtMiwgbTMKKyAgICBwYWRkdyAgICAgICAgICAgbTAsIG01CisgICAgcGFkZHcgICAgICAgICAgIG0yLCBtNQorJWVuZGlmIDsgbW14L3NzZTIvc3NlNC9hdngKKyAgICBtb3YlMiAgICBbZHN0cSt3cSoyK21tc2l6ZSowXSwgbTAKKyAgICBtb3YlMiAgICBbZHN0cSt3cSoyK21tc2l6ZSoxXSwgbTIKKyVlbHNlIDsgJTEgPT0gOS8xMAorICAgIHBhZGRzdyAgICAgICAgICBtMCwgbTIsIFtzcmNxK3dxKjIrbW1zaXplKjBdCisgICAgcGFkZHN3ICAgICAgICAgIG0xLCBtMiwgW3NyY3Erd3EqMittbXNpemUqMV0KKyAgICBwc3JhdyAgICAgICAgICAgbTAsIDE1IC0gJTEKKyAgICBwc3JhdyAgICAgICAgICAgbTEsIDE1IC0gJTEKKyAgICBwbWF4c3cgICAgICAgICAgbTAsIG00CisgICAgcG1heHN3ICAgICAgICAgIG0xLCBtNAorICAgIHBtaW5zdyAgICAgICAgICBtMCwgbTMKKyAgICBwbWluc3cgICAgICAgICAgbTEsIG0zCisgICAgbW92JTIgICAgW2RzdHErd3EqMittbXNpemUqMF0sIG0wCisgICAgbW92JTIgICAgW2RzdHErd3EqMittbXNpemUqMV0sIG0xCislZW5kaWYKKyAgICBhZGQgICAgICAgICAgICAgd3EsIG1tc2l6ZQorICAgIGpsIC5sb29wXyUyCislZW5kbWFjcm8KKworJW1hY3JvIHl1djJwbGFuZTFfZm4gMworY2dsb2JhbCB5dXYycGxhbmUxXyUxLCAlMywgJTMsICUyLCBzcmMsIGRzdCwgdywgZGl0aGVyLCBvZmZzZXQKKyAgICBtb3ZzeGRpZm5pZG4gICAgd3EsIHdkCisgICAgYWRkICAgICAgICAgICAgIHdxLCBtbXNpemUgLSAxCisgICAgYW5kICAgICAgICAgICAgIHdxLCB+KG1tc2l6ZSAtIDEpCislaWYgJTEgPT0gOAorICAgIGFkZCAgICAgICAgICAgZHN0cSwgd3EKKyVlbHNlIDsgJTEgIT0gOAorICAgIGxlYSAgICAgICAgICAgZHN0cSwgW2RzdHErd3EqMl0KKyVlbmRpZiA7ICUxID09IDgKKyVpZiAlMSA9PSAxNgorICAgIGxlYSAgICAgICAgICAgc3JjcSwgW3NyY3Erd3EqNF0KKyVlbHNlIDsgJTEgIT0gMTYKKyAgICBsZWEgICAgICAgICAgIHNyY3EsIFtzcmNxK3dxKjJdCislZW5kaWYgOyAlMSA9PSAxNgorICAgIG5lZyAgICAgICAgICAgICB3cQorCislaWYgJTEgPT0gOAorICAgIHB4b3IgICAgICAgICAgICBtNCwgbTQgICAgICAgICAgICAgICA7IHplcm8KKworICAgIDsgY3JlYXRlIHJlZ2lzdGVycyBob2xkaW5nIGRpdGhlcgorICAgIG1vdnEgICAgICAgICAgICBtMywgW2RpdGhlcnFdICAgICAgICA7IGRpdGhlcgorICAgIHRlc3QgICAgICAgb2Zmc2V0ZCwgb2Zmc2V0ZAorICAgIGp6ICAgICAgICAgICAgICAubm9fcm90CislaWYgbW1zaXplID09IDE2CisgICAgcHVucGNrbHFkcSAgICAgIG0zLCBtMworJWVuZGlmIDsgbW1zaXplID09IDE2CisgICAgUEFMSUdOUiAgICAgICAgIG0zLCBtMywgMywgbTIKKy5ub19yb3Q6CislaWYgbW1zaXplID09IDgKKyAgICBtb3ZhICAgICAgICAgICAgbTIsIG0zCisgICAgcHVucGNraGJ3ICAgICAgIG0zLCBtNCAgICAgICAgICAgICAgIDsgYnl0ZS0+d29yZAorICAgIHB1bnBja2xidyAgICAgICBtMiwgbTQgICAgICAgICAgICAgICA7IGJ5dGUtPndvcmQKKyVlbHNlCisgICAgcHVucGNrbGJ3ICAgICAgIG0zLCBtNAorICAgIG1vdmEgICAgICAgICAgICBtMiwgbTMKKyVlbmRpZgorJWVsaWYgJTEgPT0gOQorICAgIHB4b3IgICAgICAgICAgICBtNCwgbTQKKyAgICBtb3ZhICAgICAgICAgICAgbTMsIFtwd181MTJdCisgICAgbW92YSAgICAgICAgICAgIG0yLCBbcHdfMzJdCislZWxpZiAlMSA9PSAxMAorICAgIHB4b3IgICAgICAgICAgICBtNCwgbTQKKyAgICBtb3ZhICAgICAgICAgICAgbTMsIFtwd18xMDI0XQorICAgIG1vdmEgICAgICAgICAgICBtMiwgW3B3XzE2XQorJWVsc2UgOyAlMSA9PSAxNgorJWlmIGNwdWZsYWcoc3NlNCkgOyBzc2U0L2F2eAorICAgIG1vdmEgICAgICAgICAgICBtNCwgW3BkXzRdCislZWxzZSA7IG1teC9zc2UyCisgICAgbW92YSAgICAgICAgICAgIG00LCBbcGRfNG1pbjB4NDAwMDBdCisgICAgbW92YSAgICAgICAgICAgIG01LCBbbWluc2hvcnRdCislZW5kaWYgOyBtbXgvc3NlMi9zc2U0L2F2eAorJWVuZGlmIDsgJTEgPT0gLi4KKworICAgIDsgYWN0dWFsIHBpeGVsIHNjYWxpbmcKKyVpZiBtbXNpemUgPT0gOAorICAgIHl1djJwbGFuZTFfbWFpbmxvb3AgJTEsIGEKKyVlbHNlIDsgbW1zaXplID09IDE2CisgICAgdGVzdCAgICAgICAgICBkc3RxLCAxNQorICAgIGpueiAudW5hbGlnbmVkCisgICAgeXV2MnBsYW5lMV9tYWlubG9vcCAlMSwgYQorICAgIFJFUF9SRVQKKy51bmFsaWduZWQ6CisgICAgeXV2MnBsYW5lMV9tYWlubG9vcCAlMSwgdQorJWVuZGlmIDsgbW1zaXplID09IDgvMTYKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzMyCitJTklUX01NWCBtbXgKK3l1djJwbGFuZTFfZm4gIDgsIDAsIDUKK3l1djJwbGFuZTFfZm4gMTYsIDAsIDMKKworSU5JVF9NTVggbW14ZXh0Cit5dXYycGxhbmUxX2ZuICA5LCAwLCAzCit5dXYycGxhbmUxX2ZuIDEwLCAwLCAzCislZW5kaWYKKworSU5JVF9YTU0gc3NlMgoreXV2MnBsYW5lMV9mbiAgOCwgNSwgNQoreXV2MnBsYW5lMV9mbiAgOSwgNSwgMworeXV2MnBsYW5lMV9mbiAxMCwgNSwgMworeXV2MnBsYW5lMV9mbiAxNiwgNiwgMworCitJTklUX1hNTSBzc2U0Cit5dXYycGxhbmUxX2ZuIDE2LCA1LCAzCisKKyVpZiBIQVZFX0FWWF9FWFRFUk5BTAorSU5JVF9YTU0gYXZ4Cit5dXYycGxhbmUxX2ZuICA4LCA1LCA1Cit5dXYycGxhbmUxX2ZuICA5LCA1LCAzCit5dXYycGxhbmUxX2ZuIDEwLCA1LCAzCit5dXYycGxhbmUxX2ZuIDE2LCA1LCAzCislZW5kaWYKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni9yZ2IycmdiLmMgYi9mZm1wZWcvbGlic3dzY2FsZS94ODYvcmdiMnJnYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MGU4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS94ODYvcmdiMnJnYi5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogc29mdHdhcmUgUkdCIHRvIFJHQiBjb252ZXJ0ZXIKKyAqIHBsdXJhbGl6ZSBieSBzb2Z0d2FyZSBQQUw4IHRvIFJHQiBjb252ZXJ0ZXIKKyAqICAgICAgICAgICAgICBzb2Z0d2FyZSBZVVYgdG8gWVVWIGNvbnZlcnRlcgorICogICAgICAgICAgICAgIHNvZnR3YXJlIFlVViB0byBSR0IgY29udmVydGVyCisgKiBXcml0dGVuIGJ5IE5pY2sgS3Vyc2hldi4KKyAqIHBhbGV0dGUgJiBZVVYgJiBydW50aW1lIENQVSBzdHVmZiBieSBNaWNoYWVsIChtaWNoYWVsbmlAZ214LmF0KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9yZ2IycmdiLmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlX2ludGVybmFsLmgiCisKKyNpZiBIQVZFX0lOTElORV9BU00KKworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG1teF9mZikgICAgICAgPSAweDAwMDAwMDAwMDAwMDAwRkZVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgbW14X251bGwpICAgICA9IDB4MDAwMDAwMDAwMDAwMDAwMFVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBtbXhfb25lKSAgICAgID0gMHhGRkZGRkZGRkZGRkZGRkZGVUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG1hc2szMmIpICAgICAgPSAweDAwMDAwMEZGMDAwMDAwRkZVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgbWFzazMyZykgICAgICA9IDB4MDAwMEZGMDAwMDAwRkYwMFVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBtYXNrMzJyKSAgICAgID0gMHgwMEZGMDAwMDAwRkYwMDAwVUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG1hc2szMmEpICAgICAgPSAweEZGMDAwMDAwRkYwMDAwMDBVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgbWFzazMyKSAgICAgICA9IDB4MDBGRkZGRkYwMEZGRkZGRlVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBtYXNrMzIxNmJyKSAgID0gMHgwMEY4MDBGODAwRjgwMEY4VUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG1hc2szMjE2ZykgICAgPSAweDAwMDBGQzAwMDAwMEZDMDBVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgbWFzazMyMTVnKSAgICA9IDB4MDAwMEY4MDAwMDAwRjgwMFVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBtdWwzMjE2KSAgICAgID0gMHgyMDAwMDAwNDIwMDAwMDA0VUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG11bDMyMTUpICAgICAgPSAweDIwMDAwMDA4MjAwMDAwMDhVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgbWFzazI0YikgICAgICA9IDB4MDBGRjAwMDBGRjAwMDBGRlVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBtYXNrMjRnKSAgICAgID0gMHhGRjAwMDBGRjAwMDBGRjAwVUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG1hc2syNHIpICAgICAgPSAweDAwMDBGRjAwMDBGRjAwMDBVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgbWFzazI0bCkgICAgICA9IDB4MDAwMDAwMDAwMEZGRkZGRlVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBtYXNrMjRoKSAgICAgID0gMHgwMDAwRkZGRkZGMDAwMDAwVUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG1hc2syNGhoKSAgICAgPSAweGZmZmYwMDAwMDAwMDAwMDBVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgbWFzazI0aGhoKSAgICA9IDB4ZmZmZmZmZmYwMDAwMDAwMFVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBtYXNrMjRoaGhoKSAgID0gMHhmZmZmZmZmZmZmZmYwMDAwVUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG1hc2sxNWIpICAgICAgPSAweDAwMUYwMDFGMDAxRjAwMUZVTEw7IC8qIDAwMDAwMDAwIDAwMDExMTExICB4eEIgKi8KK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBtYXNrMTVyZykgICAgID0gMHg3RkUwN0ZFMDdGRTA3RkUwVUxMOyAvKiAwMTExMTExMSAxMTEwMDAwMCAgUkd4ICovCitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgbWFzazE1cykgICAgICA9IDB4RkZFMEZGRTBGRkUwRkZFMFVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBtYXNrMTVnKSAgICAgID0gMHgwM0UwMDNFMDAzRTAwM0UwVUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG1hc2sxNXIpICAgICAgPSAweDdDMDA3QzAwN0MwMDdDMDBVTEw7CisjZGVmaW5lIG1hc2sxNmIgbWFzazE1YgorREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG1hc2sxNmcpICAgICAgPSAweDA3RTAwN0UwMDdFMDA3RTBVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgbWFzazE2cikgICAgICA9IDB4RjgwMEY4MDBGODAwRjgwMFVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCByZWRfMTZtYXNrKSAgID0gMHgwMDAwZjgwMDAwMDBmODAwVUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIGdyZWVuXzE2bWFzaykgPSAweDAwMDAwN2UwMDAwMDA3ZTBVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgYmx1ZV8xNm1hc2spICA9IDB4MDAwMDAwMWYwMDAwMDAxZlVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCByZWRfMTVtYXNrKSAgID0gMHgwMDAwN2MwMDAwMDA3YzAwVUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIGdyZWVuXzE1bWFzaykgPSAweDAwMDAwM2UwMDAwMDAzZTBVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgYmx1ZV8xNW1hc2spICA9IDB4MDAwMDAwMWYwMDAwMDAxZlVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBtdWwxNV9taWQpICAgID0gMHg0MjAwNDIwMDQyMDA0MjAwVUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG11bDE1X2hpKSAgICAgPSAweDAyMTAwMjEwMDIxMDAyMTBVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgbXVsMTZfbWlkKSAgICA9IDB4MjA4MDIwODAyMDgwMjA4MFVMTDsKKworREVDTEFSRV9BTElHTkVEKDgsIGV4dGVybiBjb25zdCB1aW50NjRfdCwgZmZfYmdyMllPZmZzZXQpOworREVDTEFSRV9BTElHTkVEKDgsIGV4dGVybiBjb25zdCB1aW50NjRfdCwgZmZfdzExMTEpOworREVDTEFSRV9BTElHTkVEKDgsIGV4dGVybiBjb25zdCB1aW50NjRfdCwgZmZfYmdyMlVWT2Zmc2V0KTsKKworI2RlZmluZSBCWSAoKGludCkoIDAuMDk4KigxPDxSR0IyWVVWX1NISUZUKSswLjUpKQorI2RlZmluZSBCViAoKGludCkoLTAuMDcxKigxPDxSR0IyWVVWX1NISUZUKSswLjUpKQorI2RlZmluZSBCVSAoKGludCkoIDAuNDM5KigxPDxSR0IyWVVWX1NISUZUKSswLjUpKQorI2RlZmluZSBHWSAoKGludCkoIDAuNTA0KigxPDxSR0IyWVVWX1NISUZUKSswLjUpKQorI2RlZmluZSBHViAoKGludCkoLTAuMzY4KigxPDxSR0IyWVVWX1NISUZUKSswLjUpKQorI2RlZmluZSBHVSAoKGludCkoLTAuMjkxKigxPDxSR0IyWVVWX1NISUZUKSswLjUpKQorI2RlZmluZSBSWSAoKGludCkoIDAuMjU3KigxPDxSR0IyWVVWX1NISUZUKSswLjUpKQorI2RlZmluZSBSViAoKGludCkoIDAuNDM5KigxPDxSR0IyWVVWX1NISUZUKSswLjUpKQorI2RlZmluZSBSVSAoKGludCkoLTAuMTQ4KigxPDxSR0IyWVVWX1NISUZUKSswLjUpKQorCisvLyBOb3RlOiBXZSBoYXZlIEMsIE1NWCwgTU1YRVhULCAzRE5PVyB2ZXJzaW9ucywgdGhlcmUgaXMgbm8gM0ROT1cgKyBNTVhFWFQgb25lLgorCisjZGVmaW5lIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUIDAKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVyAwCisjZGVmaW5lIENPTVBJTEVfVEVNUExBVEVfU1NFMiAwCisjZGVmaW5lIENPTVBJTEVfVEVNUExBVEVfQVZYIDAKKworLy9NTVggdmVyc2lvbnMKKyN1bmRlZiBSRU5BTUUKKyNkZWZpbmUgUkVOQU1FKGEpIGEgIyMgX21teAorI2luY2x1ZGUgInJnYjJyZ2JfdGVtcGxhdGUuYyIKKworLy8gTU1YRVhUIHZlcnNpb25zCisjdW5kZWYgUkVOQU1FCisjdW5kZWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgMQorI2RlZmluZSBSRU5BTUUoYSkgYSAjIyBfbW14ZXh0CisjaW5jbHVkZSAicmdiMnJnYl90ZW1wbGF0ZS5jIgorCisvL1NTRTIgdmVyc2lvbnMKKyN1bmRlZiBSRU5BTUUKKyN1bmRlZiBDT01QSUxFX1RFTVBMQVRFX1NTRTIKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9TU0UyIDEKKyNkZWZpbmUgUkVOQU1FKGEpIGEgIyMgX3NzZTIKKyNpbmNsdWRlICJyZ2IycmdiX3RlbXBsYXRlLmMiCisKKy8vQVZYIHZlcnNpb25zCisjdW5kZWYgUkVOQU1FCisjdW5kZWYgQ09NUElMRV9URU1QTEFURV9BVlgKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9BVlggMQorI2RlZmluZSBSRU5BTUUoYSkgYSAjIyBfYXZ4CisjaW5jbHVkZSAicmdiMnJnYl90ZW1wbGF0ZS5jIgorCisvLzNETk9XIHZlcnNpb25zCisjdW5kZWYgUkVOQU1FCisjdW5kZWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQKKyN1bmRlZiBDT01QSUxFX1RFTVBMQVRFX1NTRTIKKyN1bmRlZiBDT01QSUxFX1RFTVBMQVRFX0FWWAorI3VuZGVmIENPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgMAorI2RlZmluZSBDT01QSUxFX1RFTVBMQVRFX1NTRTIgMAorI2RlZmluZSBDT01QSUxFX1RFTVBMQVRFX0FWWCAwCisjZGVmaW5lIENPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cgMQorI2RlZmluZSBSRU5BTUUoYSkgYSAjIyBfM2Rub3cKKyNpbmNsdWRlICJyZ2IycmdiX3RlbXBsYXRlLmMiCisKKy8qCisgUkdCMTUtPlJHQjE2IG9yaWdpbmFsIGJ5IFN0cmVwdG8vQXN0cmFsCisgcG9ydGVkIHRvIGdjYyAmIGJ1Z2ZpeGVkIDogQSdycGkKKyBNTVhFWFQsIDNETk9XIG9wdGltaXphdGlvbiBieSBOaWNrIEt1cnNoZXYKKyAzMi1iaXQgQyB2ZXJzaW9uLCBhbmQgYW5kJmFkZCB0cmljayBieSBNaWNoYWVsIE5pZWRlcm1heWVyCisqLworCisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCisKK2F2X2NvbGQgdm9pZCByZ2IycmdiX2luaXRfeDg2KHZvaWQpCit7CisjaWYgSEFWRV9JTkxJTkVfQVNNCisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChJTkxJTkVfTU1YKGNwdV9mbGFncykpCisgICAgICAgIHJnYjJyZ2JfaW5pdF9tbXgoKTsKKyAgICBpZiAoSU5MSU5FX0FNRDNETk9XKGNwdV9mbGFncykpCisgICAgICAgIHJnYjJyZ2JfaW5pdF8zZG5vdygpOworICAgIGlmIChJTkxJTkVfTU1YRVhUKGNwdV9mbGFncykpCisgICAgICAgIHJnYjJyZ2JfaW5pdF9tbXhleHQoKTsKKyAgICBpZiAoSU5MSU5FX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgcmdiMnJnYl9pbml0X3NzZTIoKTsKKyAgICBpZiAoSU5MSU5FX0FWWChjcHVfZmxhZ3MpKQorICAgICAgICByZ2IycmdiX2luaXRfYXZ4KCk7CisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCit9CmRpZmYgLS1naXQgYS9mZm1wZWcvbGlic3dzY2FsZS94ODYvcmdiMnJnYl90ZW1wbGF0ZS5jIGIvZmZtcGVnL2xpYnN3c2NhbGUveDg2L3JnYjJyZ2JfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzFjN2ViCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnL2xpYnN3c2NhbGUveDg2L3JnYjJyZ2JfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDI1OTYgQEAKKy8qCisgKiBzb2Z0d2FyZSBSR0IgdG8gUkdCIGNvbnZlcnRlcgorICogcGx1cmFsaXplIGJ5IHNvZnR3YXJlIFBBTDggdG8gUkdCIGNvbnZlcnRlcgorICogICAgICAgICAgICAgIHNvZnR3YXJlIFlVViB0byBZVVYgY29udmVydGVyCisgKiAgICAgICAgICAgICAgc29mdHdhcmUgWVVWIHRvIFJHQiBjb252ZXJ0ZXIKKyAqIFdyaXR0ZW4gYnkgTmljayBLdXJzaGV2LgorICogcGFsZXR0ZSAmIFlVViAmIHJ1bnRpbWUgQ1BVIHN0dWZmIGJ5IE1pY2hhZWwgKG1pY2hhZWxuaUBnbXguYXQpCisgKiBsb3Qgb2YgYmlnLWVuZGlhbiBieXRlIG9yZGVyIGZpeGVzIGJ5IEFsZXggQmVyZWdzemFzemkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorCisjdW5kZWYgUFJFRkVUQ0gKKyN1bmRlZiBNT1ZOVFEKKyN1bmRlZiBFTU1TCisjdW5kZWYgU0ZFTkNFCisjdW5kZWYgUEFWR0IKKworI2lmIENPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cKKyNkZWZpbmUgUFJFRkVUQ0ggICJwcmVmZXRjaCIKKyNkZWZpbmUgUEFWR0IgICAgICJwYXZndXNiIgorI2VsaWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQKKyNkZWZpbmUgUFJFRkVUQ0ggInByZWZldGNobnRhIgorI2RlZmluZSBQQVZHQiAgICAgInBhdmdiIgorI2Vsc2UKKyNkZWZpbmUgUFJFRkVUQ0ggICIgIyBub3AiCisjZW5kaWYKKworI2lmIENPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cKKy8qIE9uIEs2IGZlbW1zIGlzIGZhc3RlciB0aGFuIGVtbXMuIE9uIEs3IGZlbW1zIGlzIGRpcmVjdGx5IG1hcHBlZCB0byBlbW1zLiAqLworI2RlZmluZSBFTU1TICAgICAiZmVtbXMiCisjZWxzZQorI2RlZmluZSBFTU1TICAgICAiZW1tcyIKKyNlbmRpZgorCisjaWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQKKyNkZWZpbmUgTU9WTlRRICJtb3ZudHEiCisjZGVmaW5lIFNGRU5DRSAic2ZlbmNlIgorI2Vsc2UKKyNkZWZpbmUgTU9WTlRRICJtb3ZxIgorI2RlZmluZSBTRkVOQ0UgIiAjIG5vcCIKKyNlbmRpZgorCisjaWYgIUNPTVBJTEVfVEVNUExBVEVfU1NFMgorCisjaWYgIUNPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cKKworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRShyZ2IyNHRvYmdyMzIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgdWludDhfdCAqZGVzdCA9IGRzdDsKKyAgICBjb25zdCB1aW50OF90ICpzID0gc3JjOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZDsKKyAgICBjb25zdCB1aW50OF90ICptbV9lbmQ7CisgICAgZW5kID0gcyArIHNyY19zaXplOworICAgIF9fYXNtX18gdm9sYXRpbGUoUFJFRkVUQ0giICAgICUwIjo6Im0iKCpzKToibWVtb3J5Iik7CisgICAgbW1fZW5kID0gZW5kIC0gMjM7CisgICAgX19hc21fXyB2b2xhdGlsZSgibW92cSAgICAgICAgJTAsICUlbW03Ijo6Im0iKG1hc2szMmEpOiJtZW1vcnkiKTsKKyAgICB3aGlsZSAocyA8IG1tX2VuZCkgeworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgUFJFRkVUQ0giICAzMiglMSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgICAgKCUxKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsZHEgIDMoJTEpLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgNiglMSksICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGRxICA5KCUxKSwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgMTIoJTEpLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xkcSAxNSglMSksICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgIDE4KCUxKSwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsZHEgMjEoJTEpLCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTcsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tNywgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW03LCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTcsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAlJW1tMCwgICAoJTApICAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICUlbW0xLCAgOCglMCkgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgJSVtbTIsIDE2KCUwKSAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAlJW1tMywgMjQoJTApIgorICAgICAgICAgICAgOjogInIiKGRlc3QpLCAiciIocykKKyAgICAgICAgICAgIDoibWVtb3J5Iik7CisgICAgICAgIGRlc3QgKz0gMzI7CisgICAgICAgIHMgKz0gMjQ7CisgICAgfQorICAgIF9fYXNtX18gdm9sYXRpbGUoU0ZFTkNFOjo6Im1lbW9yeSIpOworICAgIF9fYXNtX18gdm9sYXRpbGUoRU1NUzo6OiJtZW1vcnkiKTsKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICAqZGVzdCsrID0gKnMrKzsKKyAgICAgICAgKmRlc3QrKyA9ICpzKys7CisgICAgICAgICpkZXN0KysgPSAqcysrOworICAgICAgICAqZGVzdCsrID0gMjU1OworICAgIH0KK30KKworI2RlZmluZSBTVE9SRV9CR1IyNF9NTVggXAorICAgICAgICAgICAgInBzcmxxICAgICAgICAgJDgsICUlbW0yICAgIFxuXHQiIFwKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgICQ4LCAlJW1tMyAgICBcblx0IiBcCisgICAgICAgICAgICAicHNybHEgICAgICAgICAkOCwgJSVtbTYgICAgXG5cdCIgXAorICAgICAgICAgICAgInBzcmxxICAgICAgICAgJDgsICUlbW03ICAgIFxuXHQiIFwKKyAgICAgICAgICAgICJwYW5kICJNQU5HTEUobWFzazI0bCkiLCAlJW1tMFxuXHQiIFwKKyAgICAgICAgICAgICJwYW5kICJNQU5HTEUobWFzazI0bCkiLCAlJW1tMVxuXHQiIFwKKyAgICAgICAgICAgICJwYW5kICJNQU5HTEUobWFzazI0bCkiLCAlJW1tNFxuXHQiIFwKKyAgICAgICAgICAgICJwYW5kICJNQU5HTEUobWFzazI0bCkiLCAlJW1tNVxuXHQiIFwKKyAgICAgICAgICAgICJwYW5kICJNQU5HTEUobWFzazI0aCkiLCAlJW1tMlxuXHQiIFwKKyAgICAgICAgICAgICJwYW5kICJNQU5HTEUobWFzazI0aCkiLCAlJW1tM1xuXHQiIFwKKyAgICAgICAgICAgICJwYW5kICJNQU5HTEUobWFzazI0aCkiLCAlJW1tNlxuXHQiIFwKKyAgICAgICAgICAgICJwYW5kICJNQU5HTEUobWFzazI0aCkiLCAlJW1tN1xuXHQiIFwKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW0yLCAlJW1tMCAgICBcblx0IiBcCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tMywgJSVtbTEgICAgXG5cdCIgXAorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTYsICUlbW00ICAgIFxuXHQiIFwKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW03LCAlJW1tNSAgICBcblx0IiBcCisgXAorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTEsICUlbW0yICAgIFxuXHQiIFwKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW00LCAlJW1tMyAgICBcblx0IiBcCisgICAgICAgICAgICAicHNsbHEgICAgICAgICQ0OCwgJSVtbTIgICAgXG5cdCIgXAorICAgICAgICAgICAgInBzbGxxICAgICAgICAkMzIsICUlbW0zICAgIFxuXHQiIFwKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW0yLCAlJW1tMCAgICBcblx0IiBcCisgICAgICAgICAgICAicHNybHEgICAgICAgICQxNiwgJSVtbTEgICAgXG5cdCIgXAorICAgICAgICAgICAgInBzcmxxICAgICAgICAkMzIsICUlbW00ICAgIFxuXHQiIFwKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgJDE2LCAlJW1tNSAgICBcblx0IiBcCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tMywgJSVtbTEgICAgXG5cdCIgXAorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTUsICUlbW00ICAgIFxuXHQiIFwKKyBcCisgICAgICAgICAgICBNT1ZOVFEiICAgICAlJW1tMCwgICAoJTApICAgIFxuXHQiIFwKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICUlbW0xLCAgOCglMCkgICAgXG5cdCIgXAorICAgICAgICAgICAgTU9WTlRRIiAgICAgJSVtbTQsIDE2KCUwKSIKKworCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHJnYjMydG9iZ3IyNCkoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICB1aW50OF90ICpkZXN0ID0gZHN0OworICAgIGNvbnN0IHVpbnQ4X3QgKnMgPSBzcmM7CisgICAgY29uc3QgdWludDhfdCAqZW5kOworICAgIGNvbnN0IHVpbnQ4X3QgKm1tX2VuZDsKKyAgICBlbmQgPSBzICsgc3JjX3NpemU7CisgICAgX19hc21fXyB2b2xhdGlsZShQUkVGRVRDSCIgICAgJTAiOjoibSIoKnMpOiJtZW1vcnkiKTsKKyAgICBtbV9lbmQgPSBlbmQgLSAzMTsKKyAgICB3aGlsZSAocyA8IG1tX2VuZCkgeworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgUFJFRkVUQ0giICAzMiglMSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgKCUxKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgIDgoJTEpLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAxNiglMSksICUlbW00ICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgIDI0KCUxKSwgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0wLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTEsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tNCwgJSVtbTYgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW01LCAlJW1tNyAgICBcblx0IgorICAgICAgICAgICAgU1RPUkVfQkdSMjRfTU1YCisgICAgICAgICAgICA6OiAiciIoZGVzdCksICJyIihzKQorICAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQobWFzazI0bCxtYXNrMjRoKQorICAgICAgICAgICAgOiJtZW1vcnkiKTsKKyAgICAgICAgZGVzdCArPSAyNDsKKyAgICAgICAgcyArPSAzMjsKKyAgICB9CisgICAgX19hc21fXyB2b2xhdGlsZShTRkVOQ0U6OjoibWVtb3J5Iik7CisgICAgX19hc21fXyB2b2xhdGlsZShFTU1TOjo6Im1lbW9yeSIpOworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgICpkZXN0KysgPSAqcysrOworICAgICAgICAqZGVzdCsrID0gKnMrKzsKKyAgICAgICAgKmRlc3QrKyA9ICpzKys7CisgICAgICAgIHMrKzsKKyAgICB9Cit9CisKKy8qCisgb3JpZ2luYWwgYnkgU3RyZXB0by9Bc3RyYWwKKyBwb3J0ZWQgdG8gZ2NjICYgYnVnZml4ZWQ6IEEncnBpCisgTU1YRVhULCAzRE5PVyBvcHRpbWl6YXRpb24gYnkgTmljayBLdXJzaGV2CisgMzItYml0IEMgdmVyc2lvbiwgYW5kIGFuZCZhZGQgdHJpY2sgYnkgTWljaGFlbCBOaWVkZXJtYXllcgorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUocmdiMTV0bzE2KShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QqIHM9c3JjOworICAgIHJlZ2lzdGVyIHVpbnQ4X3QqIGQ9ZHN0OworICAgIHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QgKmVuZDsKKyAgICBjb25zdCB1aW50OF90ICptbV9lbmQ7CisgICAgZW5kID0gcyArIHNyY19zaXplOworICAgIF9fYXNtX18gdm9sYXRpbGUoUFJFRkVUQ0giICAgICUwIjo6Im0iKCpzKSk7CisgICAgX19hc21fXyB2b2xhdGlsZSgibW92cSAgICAgICAgJTAsICUlbW00Ijo6Im0iKG1hc2sxNXMpKTsKKyAgICBtbV9lbmQgPSBlbmQgLSAxNTsKKyAgICB3aGlsZSAoczxtbV9lbmQpIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgIFBSRUZFVENIIiAzMiglMSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICglMSksICUlbW0wICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgIDgoJTEpLCAlJW1tMiAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAlJW1tMCwgJSVtbTEgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgJSVtbTIsICUlbW0zICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICUlbW00LCAlJW1tMCAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAlJW1tNCwgJSVtbTIgIFxuXHQiCisgICAgICAgICAgICAicGFkZHcgICAgJSVtbTEsICUlbW0wICBcblx0IgorICAgICAgICAgICAgInBhZGR3ICAgICUlbW0zLCAlJW1tMiAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAlJW1tMCwgICglMCkgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgJSVtbTIsIDgoJTApIgorICAgICAgICAgICAgOjogInIiKGQpLCAiciIocykKKyAgICAgICAgKTsKKyAgICAgICAgZCs9MTY7CisgICAgICAgIHMrPTE2OworICAgIH0KKyAgICBfX2FzbV9fIHZvbGF0aWxlKFNGRU5DRTo6OiJtZW1vcnkiKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKEVNTVM6OjoibWVtb3J5Iik7CisgICAgbW1fZW5kID0gZW5kIC0gMzsKKyAgICB3aGlsZSAocyA8IG1tX2VuZCkgeworICAgICAgICByZWdpc3RlciB1bnNpZ25lZCB4PSAqKChjb25zdCB1aW50MzJfdCAqKXMpOworICAgICAgICAqKCh1aW50MzJfdCAqKWQpID0gKHgmMHg3RkZGN0ZGRikgKyAoeCYweDdGRTA3RkUwKTsKKyAgICAgICAgZCs9NDsKKyAgICAgICAgcys9NDsKKyAgICB9CisgICAgaWYgKHMgPCBlbmQpIHsKKyAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgc2hvcnQgeD0gKigoY29uc3QgdWludDE2X3QgKilzKTsKKyAgICAgICAgKigodWludDE2X3QgKilkKSA9ICh4JjB4N0ZGRikgKyAoeCYweDdGRTApOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRShyZ2IxNnRvMTUpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgcmVnaXN0ZXIgY29uc3QgdWludDhfdCogcz1zcmM7CisgICAgcmVnaXN0ZXIgdWludDhfdCogZD1kc3Q7CisgICAgcmVnaXN0ZXIgY29uc3QgdWludDhfdCAqZW5kOworICAgIGNvbnN0IHVpbnQ4X3QgKm1tX2VuZDsKKyAgICBlbmQgPSBzICsgc3JjX3NpemU7CisgICAgX19hc21fXyB2b2xhdGlsZShQUkVGRVRDSCIgICAgJTAiOjoibSIoKnMpKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKCJtb3ZxICAgICAgICAlMCwgJSVtbTciOjoibSIobWFzazE1cmcpKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKCJtb3ZxICAgICAgICAlMCwgJSVtbTYiOjoibSIobWFzazE1YikpOworICAgIG1tX2VuZCA9IGVuZCAtIDE1OworICAgIHdoaWxlIChzPG1tX2VuZCkgeworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgUFJFRkVUQ0giIDMyKCUxKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgKCUxKSwgJSVtbTAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgOCglMSksICUlbW0yICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICUlbW0wLCAlJW1tMSAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAlJW1tMiwgJSVtbTMgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgJDEsICUlbW0wICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICQxLCAlJW1tMiAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAlJW1tNywgJSVtbTAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgJSVtbTcsICUlbW0yICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICUlbW02LCAlJW1tMSAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAlJW1tNiwgJSVtbTMgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgJSVtbTEsICUlbW0wICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICUlbW0zLCAlJW1tMiAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAlJW1tMCwgICglMCkgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgJSVtbTIsIDgoJTApIgorICAgICAgICAgICAgOjogInIiKGQpLCAiciIocykKKyAgICAgICAgKTsKKyAgICAgICAgZCs9MTY7CisgICAgICAgIHMrPTE2OworICAgIH0KKyAgICBfX2FzbV9fIHZvbGF0aWxlKFNGRU5DRTo6OiJtZW1vcnkiKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKEVNTVM6OjoibWVtb3J5Iik7CisgICAgbW1fZW5kID0gZW5kIC0gMzsKKyAgICB3aGlsZSAocyA8IG1tX2VuZCkgeworICAgICAgICByZWdpc3RlciB1aW50MzJfdCB4PSAqKChjb25zdCB1aW50MzJfdCopcyk7CisgICAgICAgICooKHVpbnQzMl90ICopZCkgPSAoKHg+PjEpJjB4N0ZFMDdGRTApIHwgKHgmMHgwMDFGMDAxRik7CisgICAgICAgIHMrPTQ7CisgICAgICAgIGQrPTQ7CisgICAgfQorICAgIGlmIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIHVpbnQxNl90IHg9ICooKGNvbnN0IHVpbnQxNl90KilzKTsKKyAgICAgICAgKigodWludDE2X3QgKilkKSA9ICgoeD4+MSkmMHg3RkUwKSB8ICh4JjB4MDAxRik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHJnYjMydG8xNikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpzID0gc3JjOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZDsKKyAgICBjb25zdCB1aW50OF90ICptbV9lbmQ7CisgICAgdWludDE2X3QgKmQgPSAodWludDE2X3QgKilkc3Q7CisgICAgZW5kID0gcyArIHNyY19zaXplOworICAgIG1tX2VuZCA9IGVuZCAtIDE1OworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZxICAgICAgICAgICAlMywgJSVtbTUgICBcblx0IgorICAgICAgICAibW92cSAgICAgICAgICAgJTQsICUlbW02ICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgICAgICU1LCAlJW1tNyAgIFxuXHQiCisgICAgICAgICJqbXAgMmYgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiLnAyYWxpZ24gICAgICAgIDQgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBSRUZFVENIIiAgIDMyKCUxKSAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAgICAgICAgICglMSksICUlbW0wICAgXG5cdCIKKyAgICAgICAgIm1vdmQgICAgICAgIDQoJTEpLCAlJW1tMyAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsZHEgICA4KCUxKSwgJSVtbTAgICBcblx0IgorICAgICAgICAicHVucGNrbGRxICAxMiglMSksICUlbW0zICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgICUlbW0wLCAlJW1tMSAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICAlJW1tMywgJSVtbTQgICBcblx0IgorICAgICAgICAicGFuZCAgICAgICAgJSVtbTYsICUlbW0wICAgXG5cdCIKKyAgICAgICAgInBhbmQgICAgICAgICUlbW02LCAlJW1tMyAgIFxuXHQiCisgICAgICAgICJwbWFkZHdkICAgICAlJW1tNywgJSVtbTAgICBcblx0IgorICAgICAgICAicG1hZGR3ZCAgICAgJSVtbTcsICUlbW0zICAgXG5cdCIKKyAgICAgICAgInBhbmQgICAgICAgICUlbW01LCAlJW1tMSAgIFxuXHQiCisgICAgICAgICJwYW5kICAgICAgICAlJW1tNSwgJSVtbTQgICBcblx0IgorICAgICAgICAicG9yICAgICAgICAgJSVtbTEsICUlbW0wICAgXG5cdCIKKyAgICAgICAgInBvciAgICAgICAgICUlbW00LCAlJW1tMyAgIFxuXHQiCisgICAgICAgICJwc3JsZCAgICAgICAgICAkNSwgJSVtbTAgICBcblx0IgorICAgICAgICAicHNsbGQgICAgICAgICAkMTEsICUlbW0zICAgXG5cdCIKKyAgICAgICAgInBvciAgICAgICAgICUlbW0zLCAlJW1tMCAgIFxuXHQiCisgICAgICAgIE1PVk5UUSIgICAgICAlJW1tMCwgKCUwKSAgICBcblx0IgorICAgICAgICAiYWRkICAgICAgICAgICAkMTYsICAlMSAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAgICAgICAgICQ4LCAgJTAgICAgIFxuXHQiCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiY21wICAgICAgICAgICAgJTIsICAlMSAgICAgXG5cdCIKKyAgICAgICAgIiBqYiAgICAgICAgICAgIDFiICAgICAgICAgIFxuXHQiCisgICAgICAgIDogIityIiAoZCksICIrciIocykKKyAgICAgICAgOiAiciIgKG1tX2VuZCksICJtIiAobWFzazMyMTZnKSwgIm0iIChtYXNrMzIxNmJyKSwgIm0iIChtdWwzMjE2KQorICAgICk7CisgICAgX19hc21fXyB2b2xhdGlsZShTRkVOQ0U6OjoibWVtb3J5Iik7CisgICAgX19hc21fXyB2b2xhdGlsZShFTU1TOjo6Im1lbW9yeSIpOworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIGludCByZ2IgPSAqKGNvbnN0IHVpbnQzMl90KilzOyBzICs9IDQ7CisgICAgICAgICpkKysgPSAoKHJnYiYweEZGKT4+MykgKyAoKHJnYiYweEZDMDApPj41KSArICgocmdiJjB4RjgwMDAwKT4+OCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHJnYjMydG9iZ3IxNikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpzID0gc3JjOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZDsKKyAgICBjb25zdCB1aW50OF90ICptbV9lbmQ7CisgICAgdWludDE2X3QgKmQgPSAodWludDE2X3QgKilkc3Q7CisgICAgZW5kID0gcyArIHNyY19zaXplOworICAgIF9fYXNtX18gdm9sYXRpbGUoUFJFRkVUQ0giICAgICUwIjo6Im0iKCpzcmMpOiJtZW1vcnkiKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92cSAgICAgICAgICAlMCwgJSVtbTcgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgICAgJTEsICUlbW02ICAgIFxuXHQiCisgICAgICAgIDo6Im0iKHJlZF8xNm1hc2spLCJtIihncmVlbl8xNm1hc2spKTsKKyAgICBtbV9lbmQgPSBlbmQgLSAxNTsKKyAgICB3aGlsZSAocyA8IG1tX2VuZCkgeworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgUFJFRkVUQ0giICAzMiglMSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgICAgKCUxKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgIDQoJTEpLCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xkcSAgOCglMSksICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGRxIDEyKCUxKSwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0wLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTAsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMywgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0zLCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgInBzbGxxICAgICAgICAgJDgsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAkOCwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICUlbW03LCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgJSVtbTcsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgICAkNSwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgICQ1LCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgJSVtbTYsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAlJW1tNiwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgJDE5LCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICAkMTksICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlMiwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICUyLCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTEsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tNCwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW0yLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTUsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICQxNiwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW0zLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgJSVtbTAsICglMCkgICAgIFxuXHQiCisgICAgICAgICAgICA6OiAiciIoZCksInIiKHMpLCJtIihibHVlXzE2bWFzayk6Im1lbW9yeSIpOworICAgICAgICBkICs9IDQ7CisgICAgICAgIHMgKz0gMTY7CisgICAgfQorICAgIF9fYXNtX18gdm9sYXRpbGUoU0ZFTkNFOjo6Im1lbW9yeSIpOworICAgIF9fYXNtX18gdm9sYXRpbGUoRU1NUzo6OiJtZW1vcnkiKTsKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICByZWdpc3RlciBpbnQgcmdiID0gKihjb25zdCB1aW50MzJfdCopczsgcyArPSA0OworICAgICAgICAqZCsrID0gKChyZ2ImMHhGOCk8PDgpICsgKChyZ2ImMHhGQzAwKT4+NSkgKyAoKHJnYiYweEY4MDAwMCk+PjE5KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUocmdiMzJ0bzE1KShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnMgPSBzcmM7CisgICAgY29uc3QgdWludDhfdCAqZW5kOworICAgIGNvbnN0IHVpbnQ4X3QgKm1tX2VuZDsKKyAgICB1aW50MTZfdCAqZCA9ICh1aW50MTZfdCAqKWRzdDsKKyAgICBlbmQgPSBzICsgc3JjX3NpemU7CisgICAgbW1fZW5kID0gZW5kIC0gMTU7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdnEgICAgICAgICAgICUzLCAlJW1tNSAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICAgICAlNCwgJSVtbTYgICBcblx0IgorICAgICAgICAibW92cSAgICAgICAgICAgJTUsICUlbW03ICAgXG5cdCIKKyAgICAgICAgImptcCAgICAgICAgICAgIDJmICAgICAgICAgIFxuXHQiCisgICAgICAgICIucDJhbGlnbiAgICAgICAgNCAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFJFRkVUQ0giICAgMzIoJTEpICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICAgICAgICAgKCUxKSwgJSVtbTAgICBcblx0IgorICAgICAgICAibW92ZCAgICAgICAgNCglMSksICUlbW0zICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xkcSAgIDgoJTEpLCAlJW1tMCAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsZHEgIDEyKCUxKSwgJSVtbTMgICBcblx0IgorICAgICAgICAibW92cSAgICAgICAgJSVtbTAsICUlbW0xICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgICUlbW0zLCAlJW1tNCAgIFxuXHQiCisgICAgICAgICJwYW5kICAgICAgICAlJW1tNiwgJSVtbTAgICBcblx0IgorICAgICAgICAicGFuZCAgICAgICAgJSVtbTYsICUlbW0zICAgXG5cdCIKKyAgICAgICAgInBtYWRkd2QgICAgICUlbW03LCAlJW1tMCAgIFxuXHQiCisgICAgICAgICJwbWFkZHdkICAgICAlJW1tNywgJSVtbTMgICBcblx0IgorICAgICAgICAicGFuZCAgICAgICAgJSVtbTUsICUlbW0xICAgXG5cdCIKKyAgICAgICAgInBhbmQgICAgICAgICUlbW01LCAlJW1tNCAgIFxuXHQiCisgICAgICAgICJwb3IgICAgICAgICAlJW1tMSwgJSVtbTAgICBcblx0IgorICAgICAgICAicG9yICAgICAgICAgJSVtbTQsICUlbW0zICAgXG5cdCIKKyAgICAgICAgInBzcmxkICAgICAgICAgICQ2LCAlJW1tMCAgIFxuXHQiCisgICAgICAgICJwc2xsZCAgICAgICAgICQxMCwgJSVtbTMgICBcblx0IgorICAgICAgICAicG9yICAgICAgICAgJSVtbTMsICUlbW0wICAgXG5cdCIKKyAgICAgICAgTU9WTlRRIiAgICAgICUlbW0wLCAoJTApICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgICAgICAgICQxNiwgICUxICAgICBcblx0IgorICAgICAgICAiYWRkICAgICAgICAgICAgJDgsICAlMCAgICAgXG5cdCIKKyAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjbXAgICAgICAgICAgICAlMiwgICUxICAgICBcblx0IgorICAgICAgICAiIGpiICAgICAgICAgICAgMWIgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiAiK3IiIChkKSwgIityIihzKQorICAgICAgICA6ICJyIiAobW1fZW5kKSwgIm0iIChtYXNrMzIxNWcpLCAibSIgKG1hc2szMjE2YnIpLCAibSIgKG11bDMyMTUpCisgICAgKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKFNGRU5DRTo6OiJtZW1vcnkiKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKEVNTVM6OjoibWVtb3J5Iik7CisgICAgd2hpbGUgKHMgPCBlbmQpIHsKKyAgICAgICAgcmVnaXN0ZXIgaW50IHJnYiA9ICooY29uc3QgdWludDMyX3QqKXM7IHMgKz0gNDsKKyAgICAgICAgKmQrKyA9ICgocmdiJjB4RkYpPj4zKSArICgocmdiJjB4RjgwMCk+PjYpICsgKChyZ2ImMHhGODAwMDApPj45KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUocmdiMzJ0b2JncjE1KShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnMgPSBzcmM7CisgICAgY29uc3QgdWludDhfdCAqZW5kOworICAgIGNvbnN0IHVpbnQ4X3QgKm1tX2VuZDsKKyAgICB1aW50MTZfdCAqZCA9ICh1aW50MTZfdCAqKWRzdDsKKyAgICBlbmQgPSBzICsgc3JjX3NpemU7CisgICAgX19hc21fXyB2b2xhdGlsZShQUkVGRVRDSCIgICAgJTAiOjoibSIoKnNyYyk6Im1lbW9yeSIpOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZxICAgICAgICAgICUwLCAlJW1tNyAgICBcblx0IgorICAgICAgICAibW92cSAgICAgICAgICAlMSwgJSVtbTYgICAgXG5cdCIKKyAgICAgICAgOjoibSIocmVkXzE1bWFzayksIm0iKGdyZWVuXzE1bWFzaykpOworICAgIG1tX2VuZCA9IGVuZCAtIDE1OworICAgIHdoaWxlIChzIDwgbW1fZW5kKSB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICBQUkVGRVRDSCIgIDMyKCUxKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAoJTEpLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgNCglMSksICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGRxICA4KCUxKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsZHEgMTIoJTEpLCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTAsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0zLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTMsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAkNywgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgICQ3LCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgJSVtbTcsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAlJW1tNywgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgICQ2LCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICAgJDYsICUlbW00ICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAlJW1tNiwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICUlbW02LCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICAkMTksICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgICQxOSwgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICUyLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJTIsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tMSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW00LCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTIsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tNSwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgJDE2LCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTMsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAlJW1tMCwgKCUwKSAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6InIiKGQpLCJyIihzKSwibSIoYmx1ZV8xNW1hc2spOiJtZW1vcnkiKTsKKyAgICAgICAgZCArPSA0OworICAgICAgICBzICs9IDE2OworICAgIH0KKyAgICBfX2FzbV9fIHZvbGF0aWxlKFNGRU5DRTo6OiJtZW1vcnkiKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKEVNTVM6OjoibWVtb3J5Iik7CisgICAgd2hpbGUgKHMgPCBlbmQpIHsKKyAgICAgICAgcmVnaXN0ZXIgaW50IHJnYiA9ICooY29uc3QgdWludDMyX3QqKXM7IHMgKz0gNDsKKyAgICAgICAgKmQrKyA9ICgocmdiJjB4RjgpPDw3KSArICgocmdiJjB4RjgwMCk+PjYpICsgKChyZ2ImMHhGODAwMDApPj4xOSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHJnYjI0dG9iZ3IxNikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpzID0gc3JjOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZDsKKyAgICBjb25zdCB1aW50OF90ICptbV9lbmQ7CisgICAgdWludDE2X3QgKmQgPSAodWludDE2X3QgKilkc3Q7CisgICAgZW5kID0gcyArIHNyY19zaXplOworICAgIF9fYXNtX18gdm9sYXRpbGUoUFJFRkVUQ0giICAgICUwIjo6Im0iKCpzcmMpOiJtZW1vcnkiKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92cSAgICAgICAgICUwLCAlJW1tNyAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgICAlMSwgJSVtbTYgICAgIFxuXHQiCisgICAgICAgIDo6Im0iKHJlZF8xNm1hc2spLCJtIihncmVlbl8xNm1hc2spKTsKKyAgICBtbV9lbmQgPSBlbmQgLSAxMTsKKyAgICB3aGlsZSAocyA8IG1tX2VuZCkgeworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgUFJFRkVUQ0giICAzMiglMSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgICAgKCUxKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgIDMoJTEpLCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xkcSAgNiglMSksICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGRxICA5KCUxKSwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0wLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTAsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMywgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0zLCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICAgJDMsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgICAkMywgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICUyLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJTIsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgICAkNSwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgICQ1LCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgJSVtbTYsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAlJW1tNiwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgICQ4LCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICAgJDgsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAlJW1tNywgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICUlbW03LCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTEsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tNCwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW0yLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTUsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICQxNiwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW0zLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgJSVtbTAsICglMCkgICAgIFxuXHQiCisgICAgICAgICAgICA6OiJyIihkKSwiciIocyksIm0iKGJsdWVfMTZtYXNrKToibWVtb3J5Iik7CisgICAgICAgIGQgKz0gNDsKKyAgICAgICAgcyArPSAxMjsKKyAgICB9CisgICAgX19hc21fXyB2b2xhdGlsZShTRkVOQ0U6OjoibWVtb3J5Iik7CisgICAgX19hc21fXyB2b2xhdGlsZShFTU1TOjo6Im1lbW9yeSIpOworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIGNvbnN0IGludCBiID0gKnMrKzsKKyAgICAgICAgY29uc3QgaW50IGcgPSAqcysrOworICAgICAgICBjb25zdCBpbnQgciA9ICpzKys7CisgICAgICAgICpkKysgPSAoYj4+MykgfCAoKGcmMHhGQyk8PDMpIHwgKChyJjB4RjgpPDw4KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUocmdiMjR0bzE2KShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnMgPSBzcmM7CisgICAgY29uc3QgdWludDhfdCAqZW5kOworICAgIGNvbnN0IHVpbnQ4X3QgKm1tX2VuZDsKKyAgICB1aW50MTZfdCAqZCA9ICh1aW50MTZfdCAqKWRzdDsKKyAgICBlbmQgPSBzICsgc3JjX3NpemU7CisgICAgX19hc21fXyB2b2xhdGlsZShQUkVGRVRDSCIgICAgJTAiOjoibSIoKnNyYyk6Im1lbW9yeSIpOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3ZxICAgICAgICAgJTAsICUlbW03ICAgICBcblx0IgorICAgICAgICAibW92cSAgICAgICAgICUxLCAlJW1tNiAgICAgXG5cdCIKKyAgICAgICAgOjoibSIocmVkXzE2bWFzayksIm0iKGdyZWVuXzE2bWFzaykpOworICAgIG1tX2VuZCA9IGVuZCAtIDE1OworICAgIHdoaWxlIChzIDwgbW1fZW5kKSB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICBQUkVGRVRDSCIgIDMyKCUxKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAoJTEpLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgMyglMSksICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGRxICA2KCUxKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsZHEgIDkoJTEpLCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTAsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0zLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTMsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAkOCwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgICQ4LCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgJSVtbTcsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAlJW1tNywgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgICQ1LCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICAgJDUsICUlbW00ICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAlJW1tNiwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICUlbW02LCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICAkMTksICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgICQxOSwgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICUyLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJTIsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tMSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW00LCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTIsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tNSwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgJDE2LCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTMsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAlJW1tMCwgKCUwKSAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6InIiKGQpLCJyIihzKSwibSIoYmx1ZV8xNm1hc2spOiJtZW1vcnkiKTsKKyAgICAgICAgZCArPSA0OworICAgICAgICBzICs9IDEyOworICAgIH0KKyAgICBfX2FzbV9fIHZvbGF0aWxlKFNGRU5DRTo6OiJtZW1vcnkiKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKEVNTVM6OjoibWVtb3J5Iik7CisgICAgd2hpbGUgKHMgPCBlbmQpIHsKKyAgICAgICAgY29uc3QgaW50IHIgPSAqcysrOworICAgICAgICBjb25zdCBpbnQgZyA9ICpzKys7CisgICAgICAgIGNvbnN0IGludCBiID0gKnMrKzsKKyAgICAgICAgKmQrKyA9IChiPj4zKSB8ICgoZyYweEZDKTw8MykgfCAoKHImMHhGOCk8PDgpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRShyZ2IyNHRvYmdyMTUpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgY29uc3QgdWludDhfdCAqcyA9IHNyYzsKKyAgICBjb25zdCB1aW50OF90ICplbmQ7CisgICAgY29uc3QgdWludDhfdCAqbW1fZW5kOworICAgIHVpbnQxNl90ICpkID0gKHVpbnQxNl90ICopZHN0OworICAgIGVuZCA9IHMgKyBzcmNfc2l6ZTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKFBSRUZFVENIIiAgICAlMCI6OiJtIigqc3JjKToibWVtb3J5Iik7CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdnEgICAgICAgICAgJTAsICUlbW03ICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICAgICUxLCAlJW1tNiAgICBcblx0IgorICAgICAgICA6OiJtIihyZWRfMTVtYXNrKSwibSIoZ3JlZW5fMTVtYXNrKSk7CisgICAgbW1fZW5kID0gZW5kIC0gMTE7CisgICAgd2hpbGUgKHMgPCBtbV9lbmQpIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgIFBSRUZFVENIIiAgMzIoJTEpICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgICglMSksICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgICAzKCUxKSwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsZHEgIDYoJTEpLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xkcSAgOSglMSksICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0wLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTMsICUlbW00ICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMywgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgICQzLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICAgJDMsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlMiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICUyLCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICAgJDYsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgICAkNiwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICUlbW02LCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgJSVtbTYsICUlbW00ICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgICAkOSwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgICQ5LCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgJSVtbTcsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAlJW1tNywgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW0xLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTQsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tMiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW01LCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInBzbGxxICAgICAgICAkMTYsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tMywgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICUlbW0wLCAoJTApICAgICBcblx0IgorICAgICAgICAgICAgOjoiciIoZCksInIiKHMpLCJtIihibHVlXzE1bWFzayk6Im1lbW9yeSIpOworICAgICAgICBkICs9IDQ7CisgICAgICAgIHMgKz0gMTI7CisgICAgfQorICAgIF9fYXNtX18gdm9sYXRpbGUoU0ZFTkNFOjo6Im1lbW9yeSIpOworICAgIF9fYXNtX18gdm9sYXRpbGUoRU1NUzo6OiJtZW1vcnkiKTsKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICBjb25zdCBpbnQgYiA9ICpzKys7CisgICAgICAgIGNvbnN0IGludCBnID0gKnMrKzsKKyAgICAgICAgY29uc3QgaW50IHIgPSAqcysrOworICAgICAgICAqZCsrID0gKGI+PjMpIHwgKChnJjB4RjgpPDwyKSB8ICgociYweEY4KTw8Nyk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHJnYjI0dG8xNSkoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpzID0gc3JjOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZDsKKyAgICBjb25zdCB1aW50OF90ICptbV9lbmQ7CisgICAgdWludDE2X3QgKmQgPSAodWludDE2X3QgKilkc3Q7CisgICAgZW5kID0gcyArIHNyY19zaXplOworICAgIF9fYXNtX18gdm9sYXRpbGUoUFJFRkVUQ0giICAgICUwIjo6Im0iKCpzcmMpOiJtZW1vcnkiKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92cSAgICAgICAgICUwLCAlJW1tNyAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgICAlMSwgJSVtbTYgICAgIFxuXHQiCisgICAgICAgIDo6Im0iKHJlZF8xNW1hc2spLCJtIihncmVlbl8xNW1hc2spKTsKKyAgICBtbV9lbmQgPSBlbmQgLSAxNTsKKyAgICB3aGlsZSAocyA8IG1tX2VuZCkgeworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgUFJFRkVUQ0giIDMyKCUxKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgICAoJTEpLCAlJW1tMCAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgMyglMSksICUlbW0zICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xkcSA2KCUxKSwgJSVtbTAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGRxIDkoJTEpLCAlJW1tMyAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgJSVtbTAsICUlbW0xICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAlJW1tMCwgJSVtbTIgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICUlbW0zLCAlJW1tNCAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgJSVtbTMsICUlbW01ICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxxICAgICAgICAkNywgJSVtbTAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICQ3LCAlJW1tMyAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgJSVtbTcsICUlbW0wICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAlJW1tNywgJSVtbTMgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgICQ2LCAlJW1tMSAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgJDYsICUlbW00ICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAlJW1tNiwgJSVtbTEgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICUlbW02LCAlJW1tNCAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAkMTksICUlbW0yICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICQxOSwgJSVtbTUgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICUyLCAlJW1tMiAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgJTIsICUlbW01ICAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAlJW1tMSwgJSVtbTAgICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICUlbW00LCAlJW1tMyAgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgJSVtbTIsICUlbW0wICAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAlJW1tNSwgJSVtbTMgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgJDE2LCAlJW1tMyAgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgJSVtbTMsICUlbW0wICAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAlJW1tMCwgKCUwKSAgICAgIFxuXHQiCisgICAgICAgICAgICA6OiJyIihkKSwiciIocyksIm0iKGJsdWVfMTVtYXNrKToibWVtb3J5Iik7CisgICAgICAgIGQgKz0gNDsKKyAgICAgICAgcyArPSAxMjsKKyAgICB9CisgICAgX19hc21fXyB2b2xhdGlsZShTRkVOQ0U6OjoibWVtb3J5Iik7CisgICAgX19hc21fXyB2b2xhdGlsZShFTU1TOjo6Im1lbW9yeSIpOworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIGNvbnN0IGludCByID0gKnMrKzsKKyAgICAgICAgY29uc3QgaW50IGcgPSAqcysrOworICAgICAgICBjb25zdCBpbnQgYiA9ICpzKys7CisgICAgICAgICpkKysgPSAoYj4+MykgfCAoKGcmMHhGOCk8PDIpIHwgKChyJjB4RjgpPDw3KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUocmdiMTV0b2JncjI0KShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIGNvbnN0IHVpbnQxNl90ICplbmQ7CisgICAgY29uc3QgdWludDE2X3QgKm1tX2VuZDsKKyAgICB1aW50OF90ICpkID0gZHN0OworICAgIGNvbnN0IHVpbnQxNl90ICpzID0gKGNvbnN0IHVpbnQxNl90KilzcmM7CisgICAgZW5kID0gcyArIHNyY19zaXplLzI7CisgICAgX19hc21fXyB2b2xhdGlsZShQUkVGRVRDSCIgICAgJTAiOjoibSIoKnMpOiJtZW1vcnkiKTsKKyAgICBtbV9lbmQgPSBlbmQgLSA3OworICAgIHdoaWxlIChzIDwgbW1fZW5kKSB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICBQUkVGRVRDSCIgIDMyKCUxKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAoJTEpLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICglMSksICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgKCUxKSwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICUyLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJTMsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlNCwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgICQ1LCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInBtdWxodyAgICAgICAgIk1BTkdMRShtdWwxNV9taWQpIiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsaHcgICAgICAgICJNQU5HTEUobXVsMTVfbWlkKSIsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGh3ICAgICAgICAiTUFOR0xFKG11bDE1X2hpKSIsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0xLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTIsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbHdkICAgICAlNSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsd2QgICAgICU1LCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2x3ZCAgICAgJTUsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraHdkICAgICAlNSwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tod2QgICAgICU1LCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2h3ZCAgICAgJTUsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAkOCwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgJDE2LCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTEsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tMiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgICQ4LCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgInBzbGxxICAgICAgICAkMTYsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tNCwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW01LCAlJW1tMyAgICBcblx0IgorCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTYgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0zLCAlJW1tNyAgICBcblx0IgorCisgICAgICAgICAgICAibW92cSAgICAgICA4KCUxKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgIDgoJTEpLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgOCglMSksICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlMiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICUzLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJTQsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAkNSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsaHcgICAgICAgICJNQU5HTEUobXVsMTVfbWlkKSIsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGh3ICAgICAgICAiTUFOR0xFKG11bDE1X21pZCkiLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgInBtdWxodyAgICAgICAgIk1BTkdMRShtdWwxNV9oaSkiLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTAsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMSwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0yLCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2x3ZCAgICAgJTUsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbHdkICAgICAlNSwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsd2QgICAgICU1LCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2h3ZCAgICAgJTUsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraHdkICAgICAlNSwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tod2QgICAgICU1LCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgInBzbGxxICAgICAgICAgJDgsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICQxNiwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW0xLCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTIsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAkOCwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgJDE2LCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTQsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tNSwgJSVtbTMgICAgXG5cdCIKKworICAgICAgICAgICAgOiI9bSIoKmQpCisgICAgICAgICAgICA6InIiKHMpLCJtIihtYXNrMTViKSwibSIobWFzazE1ZyksIm0iKG1hc2sxNXIpLCAibSIobW14X251bGwpCisgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKG11bDE1X21pZCxtdWwxNV9oaSkKKyAgICAgICAgICAgIDoibWVtb3J5Iik7CisgICAgICAgIC8qIGJvcnJvd2VkIDMyIHRvIDI0ICovCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0zLCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTYsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tNywgJSVtbTEgICAgXG5cdCIKKworICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTQsICUlbW02ICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tNSwgJSVtbTcgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0wLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTEsICUlbW0zICAgIFxuXHQiCisKKyAgICAgICAgICAgIFNUT1JFX0JHUjI0X01NWAorCisgICAgICAgICAgICA6OiAiciIoZCksICJtIigqcykKKyAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKG1hc2syNGwsbWFzazI0aCkKKyAgICAgICAgICAgIDoibWVtb3J5Iik7CisgICAgICAgIGQgKz0gMjQ7CisgICAgICAgIHMgKz0gODsKKyAgICB9CisgICAgX19hc21fXyB2b2xhdGlsZShTRkVOQ0U6OjoibWVtb3J5Iik7CisgICAgX19hc21fXyB2b2xhdGlsZShFTU1TOjo6Im1lbW9yeSIpOworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIHVpbnQxNl90IGJncjsKKyAgICAgICAgYmdyID0gKnMrKzsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MUYpPDwzKSB8ICgoYmdyJjB4MUYpPj4yKTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4M0UwKT4+MikgfCAoKGJnciYweDNFMCk+PjcpOworICAgICAgICAqZCsrID0gKChiZ3ImMHg3QzAwKT4+NykgfCAoKGJnciYweDdDMDApPj4xMik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHJnYjE2dG9iZ3IyNCkoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqZW5kOworICAgIGNvbnN0IHVpbnQxNl90ICptbV9lbmQ7CisgICAgdWludDhfdCAqZCA9ICh1aW50OF90ICopZHN0OworICAgIGNvbnN0IHVpbnQxNl90ICpzID0gKGNvbnN0IHVpbnQxNl90ICopc3JjOworICAgIGVuZCA9IHMgKyBzcmNfc2l6ZS8yOworICAgIF9fYXNtX18gdm9sYXRpbGUoUFJFRkVUQ0giICAgICUwIjo6Im0iKCpzKToibWVtb3J5Iik7CisgICAgbW1fZW5kID0gZW5kIC0gNzsKKyAgICB3aGlsZSAocyA8IG1tX2VuZCkgeworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgUFJFRkVUQ0giICAzMiglMSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgKCUxKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAoJTEpLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICglMSksICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlMiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICUzLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJTQsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAkNSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgICQxLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBtdWxodyAgICAgICAgIk1BTkdMRShtdWwxNV9taWQpIiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsaHcgICAgICAgICJNQU5HTEUobXVsMTZfbWlkKSIsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGh3ICAgICAgICAiTUFOR0xFKG11bDE1X2hpKSIsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0xLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTIsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbHdkICAgICAlNSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsd2QgICAgICU1LCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2x3ZCAgICAgJTUsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraHdkICAgICAlNSwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tod2QgICAgICU1LCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2h3ZCAgICAgJTUsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAkOCwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgJDE2LCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTEsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tMiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgICQ4LCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgInBzbGxxICAgICAgICAkMTYsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tNCwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW01LCAlJW1tMyAgICBcblx0IgorCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTYgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0zLCAlJW1tNyAgICBcblx0IgorCisgICAgICAgICAgICAibW92cSAgICAgICA4KCUxKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgIDgoJTEpLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgOCglMSksICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlMiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICUzLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJTQsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAkNSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgICQxLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBtdWxodyAgICAgICAgIk1BTkdMRShtdWwxNV9taWQpIiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsaHcgICAgICAgICJNQU5HTEUobXVsMTZfbWlkKSIsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGh3ICAgICAgICAiTUFOR0xFKG11bDE1X2hpKSIsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0xLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTIsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbHdkICAgICAlNSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsd2QgICAgICU1LCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2x3ZCAgICAgJTUsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraHdkICAgICAlNSwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tod2QgICAgICU1LCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2h3ZCAgICAgJTUsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAkOCwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgJDE2LCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgJSVtbTEsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tMiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xscSAgICAgICAgICQ4LCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgInBzbGxxICAgICAgICAkMTYsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicG9yICAgICAgICAlJW1tNCwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICUlbW01LCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgOiI9bSIoKmQpCisgICAgICAgICAgICA6InIiKHMpLCJtIihtYXNrMTZiKSwibSIobWFzazE2ZyksIm0iKG1hc2sxNnIpLCJtIihtbXhfbnVsbCkKKyAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQobXVsMTVfbWlkLG11bDE2X21pZCxtdWwxNV9oaSkKKyAgICAgICAgICAgIDoibWVtb3J5Iik7CisgICAgICAgIC8qIGJvcnJvd2VkIDMyIHRvIDI0ICovCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0zLCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTYsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tNywgJSVtbTEgICAgXG5cdCIKKworICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTQsICUlbW02ICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAlJW1tNSwgJSVtbTcgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICUlbW0wLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgJSVtbTEsICUlbW0zICAgIFxuXHQiCisKKyAgICAgICAgICAgIFNUT1JFX0JHUjI0X01NWAorCisgICAgICAgICAgICA6OiAiciIoZCksICJtIigqcykKKyAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKG1hc2syNGwsbWFzazI0aCkKKyAgICAgICAgICAgIDoibWVtb3J5Iik7CisgICAgICAgIGQgKz0gMjQ7CisgICAgICAgIHMgKz0gODsKKyAgICB9CisgICAgX19hc21fXyB2b2xhdGlsZShTRkVOQ0U6OjoibWVtb3J5Iik7CisgICAgX19hc21fXyB2b2xhdGlsZShFTU1TOjo6Im1lbW9yeSIpOworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIHVpbnQxNl90IGJncjsKKyAgICAgICAgYmdyID0gKnMrKzsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MUYpPDwzKSB8ICgoYmdyJjB4MUYpPj4yKTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4N0UwKT4+MykgfCAoKGJnciYweDdFMCk+PjkpOworICAgICAgICAqZCsrID0gKChiZ3ImMHhGODAwKT4+OCkgfCAoKGJnciYweEY4MDApPj4xMyk7CisgICAgfQorfQorCisvKgorICogbW0wID0gMDAgQjMgMDAgQjIgMDAgQjEgMDAgQjAKKyAqIG1tMSA9IDAwIEczIDAwIEcyIDAwIEcxIDAwIEcwCisgKiBtbTIgPSAwMCBSMyAwMCBSMiAwMCBSMSAwMCBSMAorICogbW02ID0gRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYKKyAqIG1tNyA9IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCisgKi8KKyNkZWZpbmUgUEFDS19SR0IzMiBcCisgICAgInBhY2t1c3diICAgJSVtbTcsICUlbW0wICAgIFxuXHQiIC8qIDAwIDAwIDAwIDAwIEIzIEIyIEIxIEIwICovIFwKKyAgICAicGFja3Vzd2IgICAlJW1tNywgJSVtbTEgICAgXG5cdCIgLyogMDAgMDAgMDAgMDAgRzMgRzIgRzEgRzAgKi8gXAorICAgICJwYWNrdXN3YiAgICUlbW03LCAlJW1tMiAgICBcblx0IiAvKiAwMCAwMCAwMCAwMCBSMyBSMiBSMSBSMCAqLyBcCisgICAgInB1bnBja2xidyAgJSVtbTEsICUlbW0wICAgIFxuXHQiIC8qIEczIEIzIEcyIEIyIEcxIEIxIEcwIEIwICovIFwKKyAgICAicHVucGNrbGJ3ICAlJW1tNiwgJSVtbTIgICAgXG5cdCIgLyogRkYgUjMgRkYgUjIgRkYgUjEgRkYgUjAgKi8gXAorICAgICJtb3ZxICAgICAgICUlbW0wLCAlJW1tMyAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1bnBja2x3ZCAgJSVtbTIsICUlbW0wICAgIFxuXHQiIC8qIEZGIFIxIEcxIEIxIEZGIFIwIEcwIEIwICovIFwKKyAgICAicHVucGNraHdkICAlJW1tMiwgJSVtbTMgICAgXG5cdCIgLyogRkYgUjMgRzMgQjMgRkYgUjIgRzIgQjIgKi8gXAorICAgIE1PVk5UUSIgICAgICUlbW0wLCAgKCUwKSAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTU9WTlRRIiAgICAgJSVtbTMsIDgoJTApICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRShyZ2IxNXRvMzIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpCit7CisgICAgY29uc3QgdWludDE2X3QgKmVuZDsKKyAgICBjb25zdCB1aW50MTZfdCAqbW1fZW5kOworICAgIHVpbnQ4X3QgKmQgPSBkc3Q7CisgICAgY29uc3QgdWludDE2X3QgKnMgPSAoY29uc3QgdWludDE2X3QgKilzcmM7CisgICAgZW5kID0gcyArIHNyY19zaXplLzI7CisgICAgX19hc21fXyB2b2xhdGlsZShQUkVGRVRDSCIgICAgJTAiOjoibSIoKnMpOiJtZW1vcnkiKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKCJweG9yICAgICUlbW03LCUlbW03ICAgIFxuXHQiOjo6Im1lbW9yeSIpOworICAgIF9fYXNtX18gdm9sYXRpbGUoInBjbXBlcWQgJSVtbTYsJSVtbTYgICAgXG5cdCI6OjoibWVtb3J5Iik7CisgICAgbW1fZW5kID0gZW5kIC0gMzsKKyAgICB3aGlsZSAocyA8IG1tX2VuZCkgeworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgUFJFRkVUQ0giICAzMiglMSkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgKCUxKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAoJTEpLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICglMSksICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlMiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICUzLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJTQsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAkNSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsaHcgICAgICAgICU1LCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInBtdWxodyAgICAgICAgJTUsICUlbW0xICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGh3ICAgICAgICAiTUFOR0xFKG11bDE1X2hpKSIsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICBQQUNLX1JHQjMyCisgICAgICAgICAgICA6OiJyIihkKSwiciIocyksIm0iKG1hc2sxNWIpLCJtIihtYXNrMTVnKSwibSIobWFzazE1cikgLCJtIihtdWwxNV9taWQpCisgICAgICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChtdWwxNV9oaSkKKyAgICAgICAgICAgIDoibWVtb3J5Iik7CisgICAgICAgIGQgKz0gMTY7CisgICAgICAgIHMgKz0gNDsKKyAgICB9CisgICAgX19hc21fXyB2b2xhdGlsZShTRkVOQ0U6OjoibWVtb3J5Iik7CisgICAgX19hc21fXyB2b2xhdGlsZShFTU1TOjo6Im1lbW9yeSIpOworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIHJlZ2lzdGVyIHVpbnQxNl90IGJncjsKKyAgICAgICAgYmdyID0gKnMrKzsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4MUYpPDwzKSB8ICgoYmdyJjB4MUYpPj4yKTsKKyAgICAgICAgKmQrKyA9ICgoYmdyJjB4M0UwKT4+MikgfCAoKGJnciYweDNFMCk+PjcpOworICAgICAgICAqZCsrID0gKChiZ3ImMHg3QzAwKT4+NykgfCAoKGJnciYweDdDMDApPj4xMik7CisgICAgICAgICpkKysgPSAyNTU7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHJnYjE2dG8zMikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqZW5kOworICAgIGNvbnN0IHVpbnQxNl90ICptbV9lbmQ7CisgICAgdWludDhfdCAqZCA9IGRzdDsKKyAgICBjb25zdCB1aW50MTZfdCAqcyA9IChjb25zdCB1aW50MTZfdCopc3JjOworICAgIGVuZCA9IHMgKyBzcmNfc2l6ZS8yOworICAgIF9fYXNtX18gdm9sYXRpbGUoUFJFRkVUQ0giICAgICUwIjo6Im0iKCpzKToibWVtb3J5Iik7CisgICAgX19hc21fXyB2b2xhdGlsZSgicHhvciAgICAlJW1tNywlJW1tNyAgICBcblx0Ijo6OiJtZW1vcnkiKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKCJwY21wZXFkICUlbW02LCUlbW02ICAgIFxuXHQiOjo6Im1lbW9yeSIpOworICAgIG1tX2VuZCA9IGVuZCAtIDM7CisgICAgd2hpbGUgKHMgPCBtbV9lbmQpIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgIFBSRUZFVENIIiAgMzIoJTEpICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICglMSksICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgKCUxKSwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAoJTEpLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJTIsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlMywgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICU0LCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBzbGxxICAgICAgICAgJDUsICUlbW0wICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgICAkMSwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsaHcgICAgICAgICU1LCAlJW1tMCAgICBcblx0IgorICAgICAgICAgICAgInBtdWxodyAgICAgICAgIk1BTkdMRShtdWwxNl9taWQpIiwgJSVtbTEgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsaHcgICAgICAgICJNQU5HTEUobXVsMTVfaGkpIiwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgICAgIFBBQ0tfUkdCMzIKKyAgICAgICAgICAgIDo6InIiKGQpLCJyIihzKSwibSIobWFzazE2YiksIm0iKG1hc2sxNmcpLCJtIihtYXNrMTZyKSwibSIobXVsMTVfbWlkKQorICAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQobXVsMTZfbWlkLG11bDE1X2hpKQorICAgICAgICAgICAgOiJtZW1vcnkiKTsKKyAgICAgICAgZCArPSAxNjsKKyAgICAgICAgcyArPSA0OworICAgIH0KKyAgICBfX2FzbV9fIHZvbGF0aWxlKFNGRU5DRTo6OiJtZW1vcnkiKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKEVNTVM6OjoibWVtb3J5Iik7CisgICAgd2hpbGUgKHMgPCBlbmQpIHsKKyAgICAgICAgcmVnaXN0ZXIgdWludDE2X3QgYmdyOworICAgICAgICBiZ3IgPSAqcysrOworICAgICAgICAqZCsrID0gKChiZ3ImMHgxRik8PDMpIHwgKChiZ3ImMHgxRik+PjIpOworICAgICAgICAqZCsrID0gKChiZ3ImMHg3RTApPj4zKSB8ICgoYmdyJjB4N0UwKT4+OSk7CisgICAgICAgICpkKysgPSAoKGJnciYweEY4MDApPj44KSB8ICgoYmdyJjB4RjgwMCk+PjEzKTsKKyAgICAgICAgKmQrKyA9IDI1NTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUoc2h1ZmZsZV9ieXRlc18yMTAzKShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIHg4Nl9yZWcgaWR4ID0gMTUgLSBzcmNfc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpzID0gc3JjLWlkeDsKKyAgICB1aW50OF90ICpkID0gZHN0LWlkeDsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAidGVzdCAgICAgICAgICAlMCwgJTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJqbnMgICAgICAgICAgIDJmICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFJFRkVUQ0giICAgICAgICglMSwgJTApICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICAgICAgICAlMywgJSVtbTcgICAgICAgIFxuXHQiCisgICAgICAgICJweG9yICAgICAgICAgICU0LCAlJW1tNyAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgJSVtbTcsICUlbW02ICAgICAgICBcblx0IgorICAgICAgICAicHhvciAgICAgICAgICAlNSwgJSVtbTcgICAgICAgIFxuXHQiCisgICAgICAgICIucDJhbGlnbiAgICAgICA0ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQUkVGRVRDSCIgICAgIDMyKCUxLCAlMCkgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICAgICAoJTEsICUwKSwgJSVtbTAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgICAgOCglMSwgJTApLCAlJW1tMSBcblx0IgorIyBpZiBDT01QSUxFX1RFTVBMQVRFX01NWEVYVAorICAgICAgICAicHNodWZ3ICAgICAgJDE3NywgJSVtbTAsICUlbW0zIFxuXHQiCisgICAgICAgICJwc2h1ZncgICAgICAkMTc3LCAlJW1tMSwgJSVtbTUgXG5cdCIKKyAgICAgICAgInBhbmQgICAgICAgJSVtbTcsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAicGFuZCAgICAgICAlJW1tNiwgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICJwYW5kICAgICAgICUlbW03LCAlJW1tMSAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmQgICAgICAgJSVtbTYsICUlbW01ICAgICAgICBcblx0IgorICAgICAgICAicG9yICAgICAgICAlJW1tMywgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgICAgICAgICUlbW01LCAlJW1tMSAgICAgICAgXG5cdCIKKyMgZWxzZQorICAgICAgICAibW92cSAgICAgICAlJW1tMCwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICUlbW0xLCAlJW1tNCAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmQgICAgICAgJSVtbTcsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAicGFuZCAgICAgICAlJW1tNiwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICJwYW5kICAgICAgICUlbW03LCAlJW1tMSAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmQgICAgICAgJSVtbTYsICUlbW00ICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICAgICAlJW1tMiwgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICUlbW00LCAlJW1tNSAgICAgICAgXG5cdCIKKyAgICAgICAgInBzbGxkICAgICAgICAkMTYsICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAicHNybGQgICAgICAgICQxNiwgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICJwc2xsZCAgICAgICAgJDE2LCAlJW1tNCAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxkICAgICAgICAkMTYsICUlbW01ICAgICAgICBcblx0IgorICAgICAgICAicG9yICAgICAgICAlJW1tMiwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgICAgICAgICUlbW00LCAlJW1tMSAgICAgICAgXG5cdCIKKyAgICAgICAgInBvciAgICAgICAgJSVtbTMsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAicG9yICAgICAgICAlJW1tNSwgJSVtbTEgICAgICAgIFxuXHQiCisjIGVuZGlmCisgICAgICAgIE1PVk5UUSIgICAgICUlbW0wLCAgKCUyLCAlMCkgICAgXG5cdCIKKyAgICAgICAgTU9WTlRRIiAgICAgJSVtbTEsIDgoJTIsICUwKSAgICBcblx0IgorICAgICAgICAiYWRkICAgICAgICAgICQxNiwgJTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJqcyAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgU0ZFTkNFIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBFTU1TIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiAiKyZyIihpZHgpCisgICAgICAgIDogInIiIChzKSwgInIiIChkKSwgIm0iIChtYXNrMzJiKSwgIm0iIChtYXNrMzJyKSwgIm0iIChtbXhfb25lKQorICAgICAgICA6ICJtZW1vcnkiKTsKKyAgICBmb3IgKDsgaWR4PDE1OyBpZHgrPTQpIHsKKyAgICAgICAgcmVnaXN0ZXIgaW50IHYgPSAqKGNvbnN0IHVpbnQzMl90ICopJnNbaWR4XSwgZyA9IHYgJiAweGZmMDBmZjAwOworICAgICAgICB2ICY9IDB4ZmYwMGZmOworICAgICAgICAqKHVpbnQzMl90ICopJmRbaWR4XSA9ICh2Pj4xNikgKyBnICsgKHY8PDE2KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUocmdiMjR0b2JncjI0KShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQoreworICAgIHVuc2lnbmVkIGk7CisgICAgeDg2X3JlZyBtbXhfc2l6ZT0gMjMgLSBzcmNfc2l6ZTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgInRlc3QgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICAgICAgICAgXG5cdCIKKyAgICAgICAgImpucyAgICAgICAgICAgICAgICAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICJNQU5HTEUobWFzazI0cikiLCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICJNQU5HTEUobWFzazI0ZykiLCAlJW1tNiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICJNQU5HTEUobWFzazI0YikiLCAlJW1tNyAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIi5wMmFsaWduICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFJFRkVUQ0giIDMyKCUxLCAlJSJSRUdfYSIpICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMCAgICAgICAgICAgICAgXG5cdCIgLy8gQkdSIEJHUiBCRworICAgICAgICAibW92cSAgICAgICAoJTEsICUlIlJFR19hIiksICUlbW0xICAgICAgICAgICAgICBcblx0IiAvLyBCR1IgQkdSIEJHCisgICAgICAgICJtb3ZxICAgICAgMiglMSwgJSUiUkVHX2EiKSwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8vIFIgQkdSIEJHUiBCCisgICAgICAgICJwc2xscSAgICAgICAgICAgICAgICAgICQxNiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiIC8vIDAwIEJHUiBCR1IKKyAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICUlbW01LCAlJW1tMCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBvciAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBvciAgICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICA2KCUxLCAlJSJSRUdfYSIpLCAlJW1tMCAgICAgICAgICAgICAgXG5cdCIgLy8gQkdSIEJHUiBCRworICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgJSVtbTEsICAgKCUyLCAlJSJSRUdfYSIpICBcblx0IiAvLyBSR0IgUkdCIFJHCisgICAgICAgICJtb3ZxICAgICAgOCglMSwgJSUiUkVHX2EiKSwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiIC8vIFIgQkdSIEJHUiBCCisgICAgICAgICJtb3ZxICAgICAxMCglMSwgJSUiUkVHX2EiKSwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8vIEdSIEJHUiBCR1IKKyAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tMCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICUlbW01LCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBvciAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBvciAgICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgIDE0KCUxLCAlJSJSRUdfYSIpLCAlJW1tMCAgICAgICAgICAgICAgXG5cdCIgLy8gUiBCR1IgQkdSIEIKKyAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICUlbW0xLCAgOCglMiwgJSUiUkVHX2EiKSAgXG5cdCIgLy8gQiBSR0IgUkdCIFIKKyAgICAgICAgIm1vdnEgICAgIDE2KCUxLCAlJSJSRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIgLy8gR1IgQkdSIEJHUgorICAgICAgICAibW92cSAgICAgMTgoJTEsICUlIlJFR19hIiksICUlbW0yICAgICAgICAgICAgICBcblx0IiAvLyBCR1IgQkdSIEJHCisgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwb3IgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAlJW1tMSwgMTYoJTIsICUlIlJFR19hIikgIFxuXHQiCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICQyNCwgJSUiUkVHX2EiICAgICAgICAgIFxuXHQiCisgICAgICAgICIganMgICAgICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogIithIiAobW14X3NpemUpCisgICAgICAgIDogInIiIChzcmMtbW14X3NpemUpLCAiciIoZHN0LW1teF9zaXplKQorICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChtYXNrMjRyLG1hc2syNGcsbWFzazI0YikKKyAgICApOworCisgICAgX19hc21fXyB2b2xhdGlsZShTRkVOQ0U6OjoibWVtb3J5Iik7CisgICAgX19hc21fXyB2b2xhdGlsZShFTU1TOjo6Im1lbW9yeSIpOworCisgICAgaWYgKG1teF9zaXplPT0yMykgcmV0dXJuOyAvL2ZpbmlzaGVkLCB3YXMgbXVsdGlwbGUgb2YgOAorCisgICAgc3JjKz0gc3JjX3NpemU7CisgICAgZHN0Kz0gc3JjX3NpemU7CisgICAgc3JjX3NpemU9IDIzLW1teF9zaXplOworICAgIHNyYy09IHNyY19zaXplOworICAgIGRzdC09IHNyY19zaXplOworICAgIGZvciAoaT0wOyBpPHNyY19zaXplOyBpKz0zKSB7CisgICAgICAgIHJlZ2lzdGVyIHVpbnQ4X3QgeDsKKyAgICAgICAgeCAgICAgICAgICA9IHNyY1tpICsgMl07CisgICAgICAgIGRzdFtpICsgMV0gPSBzcmNbaSArIDFdOworICAgICAgICBkc3RbaSArIDJdID0gc3JjW2kgKyAwXTsKKyAgICAgICAgZHN0W2kgKyAwXSA9IHg7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHl1dlBsYW5hcnRveXV5MikoY29uc3QgdWludDhfdCAqeXNyYywgY29uc3QgdWludDhfdCAqdXNyYywgY29uc3QgdWludDhfdCAqdnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHVtU3RyaWRlLCBpbnQgY2hyb21TdHJpZGUsIGludCBkc3RTdHJpZGUsIGludCB2ZXJ0THVtUGVyQ2hyb21hKQoreworICAgIGludCB5OworICAgIGNvbnN0IHg4Nl9yZWcgY2hyb21XaWR0aD0gd2lkdGg+PjE7CisgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgLy9GSVhNRSBoYW5kbGUgMiBsaW5lcyBhdCBvbmNlIChmZXdlciBwcmVmZXRjaGVzLCByZXVzZSBzb21lIGNocm9tYSwgYnV0IHZlcnkgbGlrZWx5IG1lbW9yeS1saW1pdGVkIGFueXdheSkKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJ4b3IgICAgICAgICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX2EiICAgXG5cdCIKKyAgICAgICAgICAgICIucDJhbGlnbiAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiAgICAzMiglMSwgJSUiUkVHX2EiLCAyKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiAgICAzMiglMiwgJSUiUkVHX2EiKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiAgICAzMiglMywgJSUiUkVHX2EiKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgICglMiwgJSUiUkVHX2EiKSwgJSVtbTAgICAgICAgXG5cdCIgLy8gVSgwKQorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMiAgICAgICBcblx0IiAvLyBVKDApCisgICAgICAgICAgICAibW92cSAgICAgICAgICAoJTMsICUlIlJFR19hIiksICUlbW0xICAgICAgIFxuXHQiIC8vIFYoMCkKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTAgICAgICAgXG5cdCIgLy8gVVZVViBVVlVWKDApCisgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgICAgICAgICAgJSVtbTEsICUlbW0yICAgICAgIFxuXHQiIC8vIFVWVVYgVVZVVig4KQorCisgICAgICAgICAgICAibW92cSAgICAgICAgKCUxLCAlJSJSRUdfYSIsMiksICUlbW0zICAgICAgIFxuXHQiIC8vIFkoMCkKKyAgICAgICAgICAgICJtb3ZxICAgICAgIDgoJTEsICUlIlJFR19hIiwyKSwgJSVtbTUgICAgICAgXG5cdCIgLy8gWSg4KQorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tNCAgICAgICBcblx0IiAvLyBZKDApCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW02ICAgICAgIFxuXHQiIC8vIFkoOCkKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTMgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDApCisgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgICAgICAgICAgJSVtbTAsICUlbW00ICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVig0KQorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW0yLCAlJW1tNSAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoOCkKKyAgICAgICAgICAgICJwdW5wY2toYncgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTYgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDEyKQorCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTMsICAgKCUwLCAlJSJSRUdfYSIsIDQpICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTQsICA4KCUwLCAlJSJSRUdfYSIsIDQpICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTUsIDE2KCUwLCAlJSJSRUdfYSIsIDQpICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTYsIDI0KCUwLCAlJSJSRUdfYSIsIDQpICAgIFxuXHQiCisKKyAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAkOCwgJSUiUkVHX2EiICAgXG5cdCIKKyAgICAgICAgICAgICJjbXAgICAgICAgICAgICAgICAgICAgICAgICAlNCwgJSUiUkVHX2EiICAgXG5cdCIKKyAgICAgICAgICAgICIgamIgICAgICAgICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6InIiKGRzdCksICJyIih5c3JjKSwgInIiKHVzcmMpLCAiciIodnNyYyksICJnIiAoY2hyb21XaWR0aCkKKyAgICAgICAgICAgIDogIiUiUkVHX2EKKyAgICAgICAgKTsKKyAgICAgICAgaWYgKCh5Jih2ZXJ0THVtUGVyQ2hyb21hLTEpKSA9PSB2ZXJ0THVtUGVyQ2hyb21hLTEpIHsKKyAgICAgICAgICAgIHVzcmMgKz0gY2hyb21TdHJpZGU7CisgICAgICAgICAgICB2c3JjICs9IGNocm9tU3RyaWRlOworICAgICAgICB9CisgICAgICAgIHlzcmMgKz0gbHVtU3RyaWRlOworICAgICAgICBkc3QgICs9IGRzdFN0cmlkZTsKKyAgICB9CisgICAgX19hc21fXyhFTU1TIiAgICAgICBcblx0IgorICAgICAgICAgICAgU0ZFTkNFIiAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6OiJtZW1vcnkiKTsKK30KKworLyoqCisgKiBIZWlnaHQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgd2lkdGggc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMTYuCisgKiAoSWYgdGhpcyBpcyBhIHByb2JsZW0gZm9yIGFueW9uZSB0aGVuIHRlbGwgbWUsIGFuZCBJIHdpbGwgZml4IGl0LikKKyAqLworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRSh5djEydG95dXkyKShjb25zdCB1aW50OF90ICp5c3JjLCBjb25zdCB1aW50OF90ICp1c3JjLCBjb25zdCB1aW50OF90ICp2c3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgZHN0U3RyaWRlKQoreworICAgIC8vRklYTUUgaW50ZXJwb2xhdGUgY2hyb21hCisgICAgUkVOQU1FKHl1dlBsYW5hcnRveXV5MikoeXNyYywgdXNyYywgdnNyYywgZHN0LCB3aWR0aCwgaGVpZ2h0LCBsdW1TdHJpZGUsIGNocm9tU3RyaWRlLCBkc3RTdHJpZGUsIDIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUkVOQU1FKHl1dlBsYW5hcnRvdXl2eSkoY29uc3QgdWludDhfdCAqeXNyYywgY29uc3QgdWludDhfdCAqdXNyYywgY29uc3QgdWludDhfdCAqdnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHVtU3RyaWRlLCBpbnQgY2hyb21TdHJpZGUsIGludCBkc3RTdHJpZGUsIGludCB2ZXJ0THVtUGVyQ2hyb21hKQoreworICAgIGludCB5OworICAgIGNvbnN0IHg4Nl9yZWcgY2hyb21XaWR0aD0gd2lkdGg+PjE7CisgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgLy9GSVhNRSBoYW5kbGUgMiBsaW5lcyBhdCBvbmNlIChmZXdlciBwcmVmZXRjaGVzLCByZXVzZSBzb21lIGNocm9tYSwgYnV0IHZlcnkgbGlrZWx5IG1lbW9yeS1saW1pdGVkIGFueXdheSkKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJ4b3IgICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICAgXG5cdCIKKyAgICAgICAgICAgICIucDJhbGlnbiAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiAgIDMyKCUxLCAlJSJSRUdfYSIsIDIpICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiAgIDMyKCUyLCAlJSJSRUdfYSIpICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiAgIDMyKCUzLCAlJSJSRUdfYSIpICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgKCUyLCAlJSJSRUdfYSIpLCAlJW1tMCAgICAgICAgXG5cdCIgLy8gVSgwKQorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0yICAgICAgICBcblx0IiAvLyBVKDApCisgICAgICAgICAgICAibW92cSAgICAgICAgICglMywgJSUiUkVHX2EiKSwgJSVtbTEgICAgICAgIFxuXHQiIC8vIFYoMCkKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgICAgICAgXG5cdCIgLy8gVVZVViBVVlVWKDApCisgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgICAgICAgICAlJW1tMSwgJSVtbTIgICAgICAgIFxuXHQiIC8vIFVWVVYgVVZVVig4KQorCisgICAgICAgICAgICAibW92cSAgICAgICAoJTEsICUlIlJFR19hIiwyKSwgJSVtbTMgICAgICAgIFxuXHQiIC8vIFkoMCkKKyAgICAgICAgICAgICJtb3ZxICAgICAgOCglMSwgJSUiUkVHX2EiLDIpLCAlJW1tNSAgICAgICAgXG5cdCIgLy8gWSg4KQorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW00ICAgICAgICBcblx0IiAvLyBZKDApCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTYgICAgICAgIFxuXHQiIC8vIFkoOCkKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICUlbW0zLCAlJW1tMCAgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDApCisgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgICAgICAgICAlJW1tMywgJSVtbTQgICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVig0KQorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgJSVtbTUsICUlbW0yICAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoOCkKKyAgICAgICAgICAgICJwdW5wY2toYncgICAgICAgICAgICAgICUlbW01LCAlJW1tNiAgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDEyKQorCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAlJW1tMCwgICAoJTAsICUlIlJFR19hIiwgNCkgICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAlJW1tNCwgIDgoJTAsICUlIlJFR19hIiwgNCkgICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAlJW1tMiwgMTYoJTAsICUlIlJFR19hIiwgNCkgICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAlJW1tNiwgMjQoJTAsICUlIlJFR19hIiwgNCkgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJSJSRUdfYSIgICAgXG5cdCIKKyAgICAgICAgICAgICJjbXAgICAgICAgICAgICAgICAgICAgICAgICU0LCAlJSJSRUdfYSIgICAgXG5cdCIKKyAgICAgICAgICAgICIgamIgICAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6InIiKGRzdCksICJyIih5c3JjKSwgInIiKHVzcmMpLCAiciIodnNyYyksICJnIiAoY2hyb21XaWR0aCkKKyAgICAgICAgICAgIDogIiUiUkVHX2EKKyAgICAgICAgKTsKKyAgICAgICAgaWYgKCh5Jih2ZXJ0THVtUGVyQ2hyb21hLTEpKSA9PSB2ZXJ0THVtUGVyQ2hyb21hLTEpIHsKKyAgICAgICAgICAgIHVzcmMgKz0gY2hyb21TdHJpZGU7CisgICAgICAgICAgICB2c3JjICs9IGNocm9tU3RyaWRlOworICAgICAgICB9CisgICAgICAgIHlzcmMgKz0gbHVtU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlOworICAgIH0KKyAgICBfX2FzbV9fKEVNTVMiICAgICAgIFxuXHQiCisgICAgICAgICAgICBTRkVOQ0UiICAgICBcblx0IgorICAgICAgICAgICAgOjo6Im1lbW9yeSIpOworfQorCisvKioKKyAqIEhlaWdodCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAyIGFuZCB3aWR0aCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAxNgorICogKElmIHRoaXMgaXMgYSBwcm9ibGVtIGZvciBhbnlvbmUgdGhlbiB0ZWxsIG1lLCBhbmQgSSB3aWxsIGZpeCBpdC4pCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUoeXYxMnRvdXl2eSkoY29uc3QgdWludDhfdCAqeXNyYywgY29uc3QgdWludDhfdCAqdXNyYywgY29uc3QgdWludDhfdCAqdnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IGRzdFN0cmlkZSkKK3sKKyAgICAvL0ZJWE1FIGludGVycG9sYXRlIGNocm9tYQorICAgIFJFTkFNRSh5dXZQbGFuYXJ0b3V5dnkpKHlzcmMsIHVzcmMsIHZzcmMsIGRzdCwgd2lkdGgsIGhlaWdodCwgbHVtU3RyaWRlLCBjaHJvbVN0cmlkZSwgZHN0U3RyaWRlLCAyKTsKK30KKworLyoqCisgKiBXaWR0aCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAxNi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRSh5dXY0MjJwdG91eXZ5KShjb25zdCB1aW50OF90ICp5c3JjLCBjb25zdCB1aW50OF90ICp1c3JjLCBjb25zdCB1aW50OF90ICp2c3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgZHN0U3RyaWRlKQoreworICAgIFJFTkFNRSh5dXZQbGFuYXJ0b3V5dnkpKHlzcmMsIHVzcmMsIHZzcmMsIGRzdCwgd2lkdGgsIGhlaWdodCwgbHVtU3RyaWRlLCBjaHJvbVN0cmlkZSwgZHN0U3RyaWRlLCAxKTsKK30KKworLyoqCisgKiBXaWR0aCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAxNi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRSh5dXY0MjJwdG95dXkyKShjb25zdCB1aW50OF90ICp5c3JjLCBjb25zdCB1aW50OF90ICp1c3JjLCBjb25zdCB1aW50OF90ICp2c3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgZHN0U3RyaWRlKQoreworICAgIFJFTkFNRSh5dXZQbGFuYXJ0b3l1eTIpKHlzcmMsIHVzcmMsIHZzcmMsIGRzdCwgd2lkdGgsIGhlaWdodCwgbHVtU3RyaWRlLCBjaHJvbVN0cmlkZSwgZHN0U3RyaWRlLCAxKTsKK30KKworLyoqCisgKiBIZWlnaHQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgd2lkdGggc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMTYuCisgKiAoSWYgdGhpcyBpcyBhIHByb2JsZW0gZm9yIGFueW9uZSB0aGVuIHRlbGwgbWUsIGFuZCBJIHdpbGwgZml4IGl0LikKKyAqLworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRSh5dXkydG95djEyKShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKnlkc3QsIHVpbnQ4X3QgKnVkc3QsIHVpbnQ4X3QgKnZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgc3JjU3RyaWRlKQoreworICAgIGludCB5OworICAgIGNvbnN0IHg4Nl9yZWcgY2hyb21XaWR0aD0gd2lkdGg+PjE7CisgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5Kz0yKSB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAieG9yICAgICAgICAgICAgICAgICAlJSJSRUdfYSIsICUlIlJFR19hIiAgIFxuXHQiCisgICAgICAgICAgICAicGNtcGVxdyAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW03ICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAgICAgICAgICAgJDgsICUlbW03ICAgICAgIFxuXHQiIC8vIEZGLDAwLEZGLDAwLi4uCisgICAgICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiA2NCglMCwgJSUiUkVHX2EiLCA0KSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTAgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDApCisgICAgICAgICAgICAibW92cSAgICAgIDgoJTAsICUlIlJFR19hIiwgNCksICUlbW0xICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVig0KQorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMiAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoMCkKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTMgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDQpCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAgICAgICAgICAgJDgsICUlbW0wICAgICAgIFxuXHQiIC8vIFUwVjAgVTBWMCgwKQorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJW1tMSAgICAgICBcblx0IiAvLyBVMFYwIFUwVjAoNCkKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTIgICAgICAgXG5cdCIgLy8gWTBZMCBZMFkwKDApCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0zICAgICAgIFxuXHQiIC8vIFkwWTAgWTBZMCg0KQorICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgICAgICBcblx0IiAvLyBVVlVWIFVWVVYoMCkKKyAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTIgICAgICAgXG5cdCIgLy8gWVlZWSBZWVlZKDApCisKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICAlJW1tMiwgKCUxLCAlJSJSRUdfYSIsIDIpICBcblx0IgorCisgICAgICAgICAgICAibW92cSAgICAgMTYoJTAsICUlIlJFR19hIiwgNCksICUlbW0xICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVig4KQorICAgICAgICAgICAgIm1vdnEgICAgIDI0KCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMiAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoMTIpCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0zICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVig4KQorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tNCAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoMTIpCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAgICAgICAgICAgJDgsICUlbW0xICAgICAgIFxuXHQiIC8vIFUwVjAgVTBWMCg4KQorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJW1tMiAgICAgICBcblx0IiAvLyBVMFYwIFUwVjAoMTIpCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0zICAgICAgIFxuXHQiIC8vIFkwWTAgWTBZMCg4KQorICAgICAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tNCAgICAgICBcblx0IiAvLyBZMFkwIFkwWTAoMTIpCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAgICAgJSVtbTIsICUlbW0xICAgICAgIFxuXHQiIC8vIFVWVVYgVVZVVig4KQorICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgICAgICUlbW00LCAlJW1tMyAgICAgICBcblx0IiAvLyBZWVlZIFlZWVkoOCkKKworICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW0zLCA4KCUxLCAlJSJSRUdfYSIsIDIpIFxuXHQiCisKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTIgICAgICAgXG5cdCIgLy8gVVZVViBVVlVWKDApCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0zICAgICAgIFxuXHQiIC8vIFVWVVYgVVZVVig4KQorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJW1tMCAgICAgICBcblx0IiAvLyBWMFYwIFYwVjAoMCkKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAgICAgICAgICAkOCwgJSVtbTEgICAgICAgXG5cdCIgLy8gVjBWMCBWMFYwKDgpCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0yICAgICAgIFxuXHQiIC8vIFUwVTAgVTBVMCgwKQorICAgICAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tMyAgICAgICBcblx0IiAvLyBVMFUwIFUwVTAoOCkKKyAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTAgICAgICAgXG5cdCIgLy8gVlZWViBWVlZWKDApCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgICAgIFxuXHQiIC8vIFVVVVUgVVVVVSgwKQorCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTAsICglMywgJSUiUkVHX2EiKSAgICAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICAlJW1tMiwgKCUyLCAlJSJSRUdfYSIpICAgICBcblx0IgorCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgJDgsICUlIlJFR19hIiAgIFxuXHQiCisgICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgICAgICAgICAgJTQsICUlIlJFR19hIiAgIFxuXHQiCisgICAgICAgICAgICAiIGpiICAgICAgICAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6OiJyIihzcmMpLCAiciIoeWRzdCksICJyIih1ZHN0KSwgInIiKHZkc3QpLCAiZyIgKGNocm9tV2lkdGgpCisgICAgICAgICAgICA6ICJtZW1vcnkiLCAiJSJSRUdfYQorICAgICAgICApOworCisgICAgICAgIHlkc3QgKz0gbHVtU3RyaWRlOworICAgICAgICBzcmMgICs9IHNyY1N0cmlkZTsKKworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgInhvciAgICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICBcblx0IgorICAgICAgICAgICAgIi5wMmFsaWduICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFJFRkVUQ0giIDY0KCUwLCAlJSJSRUdfYSIsIDQpICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgKCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMCAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoMCkKKyAgICAgICAgICAgICJtb3ZxICAgICAgOCglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTEgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDQpCisgICAgICAgICAgICAibW92cSAgICAgMTYoJTAsICUlIlJFR19hIiwgNCksICUlbW0yICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVig4KQorICAgICAgICAgICAgIm1vdnEgICAgIDI0KCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMyAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoMTIpCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0wICAgICAgIFxuXHQiIC8vIFkwWTAgWTBZMCgwKQorICAgICAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tMSAgICAgICBcblx0IiAvLyBZMFkwIFkwWTAoNCkKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTIgICAgICAgXG5cdCIgLy8gWTBZMCBZMFkwKDgpCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0zICAgICAgIFxuXHQiIC8vIFkwWTAgWTBZMCgxMikKKyAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTAgICAgICAgXG5cdCIgLy8gWVlZWSBZWVlZKDApCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgICAgIFxuXHQiIC8vIFlZWVkgWVlZWSg4KQorCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTAsICAoJTEsICUlIlJFR19hIiwgMikgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICAlJW1tMiwgOCglMSwgJSUiUkVHX2EiLCAyKSBcblx0IgorCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgJDgsICUlIlJFR19hIiAgIFxuXHQiCisgICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgICAgICAgICAgJTQsICUlIlJFR19hIiAgIFxuXHQiCisgICAgICAgICAgICAiIGpiICAgICAgICAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIDo6InIiKHNyYyksICJyIih5ZHN0KSwgInIiKHVkc3QpLCAiciIodmRzdCksICJnIiAoY2hyb21XaWR0aCkKKyAgICAgICAgICAgIDogIm1lbW9yeSIsICIlIlJFR19hCisgICAgICAgICk7CisgICAgICAgIHVkc3QgKz0gY2hyb21TdHJpZGU7CisgICAgICAgIHZkc3QgKz0gY2hyb21TdHJpZGU7CisgICAgICAgIHlkc3QgKz0gbHVtU3RyaWRlOworICAgICAgICBzcmMgICs9IHNyY1N0cmlkZTsKKyAgICB9CisgICAgX19hc21fXyB2b2xhdGlsZShFTU1TIiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAgU0ZFTkNFIiAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIDo6OiJtZW1vcnkiKTsKK30KKyNlbmRpZiAvKiAhQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVyAqLworCisjaWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgfHwgQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVworc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRShwbGFuYXIyeCkoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHNyY1N0cmlkZSwgaW50IGRzdFN0cmlkZSkKK3sKKyAgICBpbnQgeCx5OworCisgICAgZHN0WzBdPSBzcmNbMF07CisKKyAgICAvLyBmaXJzdCBsaW5lCisgICAgZm9yICh4PTA7IHg8c3JjV2lkdGgtMTsgeCsrKSB7CisgICAgICAgIGRzdFsyKngrMV09ICgzKnNyY1t4XSArICAgc3JjW3grMV0pPj4yOworICAgICAgICBkc3RbMip4KzJdPSAoICBzcmNbeF0gKyAzKnNyY1t4KzFdKT4+MjsKKyAgICB9CisgICAgZHN0WzIqc3JjV2lkdGgtMV09IHNyY1tzcmNXaWR0aC0xXTsKKworICAgIGRzdCs9IGRzdFN0cmlkZTsKKworICAgIGZvciAoeT0xOyB5PHNyY0hlaWdodDsgeSsrKSB7CisgICAgICAgIGNvbnN0IHg4Nl9yZWcgbW14U2l6ZT0gc3JjV2lkdGgmfjE1OworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgIm1vdiAgICAgICAgICAgJTQsICUlIlJFR19hIiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgIk1BTkdMRShtbXhfZmYpIiwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgKCUwLCAlJSJSRUdfYSIpLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgJSVtbTQsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICAgICAgICAgICAgICAkOCwgJSVtbTQgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMiAgICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAgICAgICAgICAgICAgJSVtbTIsICUlbW00ICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICglMSwgJSUiUkVHX2EiKSwgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICUlbW01LCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgInBzbGxxICAgICAgICAgICAgICAgICAgICAgJDgsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgICJwb3IgICAgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICglMCwgJSUiUkVHX2EiKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgIDEoJTAsICUlIlJFR19hIiksICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgMSglMSwgJSUiUkVHX2EiKSwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgICAgIFBBVkdCIiAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IiICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICBQQVZHQiIgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgICAgIFBBVkdCIiAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMyAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IiICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW00ICAgIFxuXHQiCisgICAgICAgICAgICBQQVZHQiIgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgICAgIFBBVkdCIiAgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IiICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAlJW1tNSwgJSVtbTcgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICUlbW00LCAlJW1tNiAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgJSVtbTMsICUlbW01ICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgICAgICAgICAlJW1tMywgJSVtbTcgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICUlbW0yLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2hidyAgICAgICAgICAgICAgJSVtbTIsICUlbW02ICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAlJW1tNSwgICglMiwgJSUiUkVHX2EiLCAyKSAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW03LCA4KCUyLCAlJSJSRUdfYSIsIDIpICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgJSVtbTQsICAoJTMsICUlIlJFR19hIiwgMikgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAlJW1tNiwgOCglMywgJSUiUkVHX2EiLCAyKSAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJSJSRUdfYSIgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgLTEoJTAsICUlIlJFR19hIiksICUlbW00ICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAtMSglMSwgJSUiUkVHX2EiKSwgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgICAgICIganMgICAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgOjogInIiIChzcmMgKyBtbXhTaXplICApLCAiciIgKHNyYyArIHNyY1N0cmlkZSArIG1teFNpemUgICksCisgICAgICAgICAgICAgICAiciIgKGRzdCArIG1teFNpemUqMiksICJyIiAoZHN0ICsgZHN0U3RyaWRlICsgbW14U2l6ZSoyKSwKKyAgICAgICAgICAgICAgICJnIiAoLW1teFNpemUpCisgICAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQobW14X2ZmKQorICAgICAgICAgICAgOiAiJSJSRUdfYQorICAgICAgICApOworCisgICAgICAgIGZvciAoeD1tbXhTaXplLTE7IHg8c3JjV2lkdGgtMTsgeCsrKSB7CisgICAgICAgICAgICBkc3RbMip4ICAgICAgICAgICsxXT0gKDMqc3JjW3grMF0gKyAgIHNyY1t4K3NyY1N0cmlkZSsxXSk+PjI7CisgICAgICAgICAgICBkc3RbMip4K2RzdFN0cmlkZSsyXT0gKCAgc3JjW3grMF0gKyAzKnNyY1t4K3NyY1N0cmlkZSsxXSk+PjI7CisgICAgICAgICAgICBkc3RbMip4K2RzdFN0cmlkZSsxXT0gKCAgc3JjW3grMV0gKyAzKnNyY1t4K3NyY1N0cmlkZSAgXSk+PjI7CisgICAgICAgICAgICBkc3RbMip4ICAgICAgICAgICsyXT0gKDMqc3JjW3grMV0gKyAgIHNyY1t4K3NyY1N0cmlkZSAgXSk+PjI7CisgICAgICAgIH0KKyAgICAgICAgZHN0W3NyY1dpZHRoKjIgLTEgICAgICAgICAgICBdPSAoMypzcmNbc3JjV2lkdGgtMV0gKyAgIHNyY1tzcmNXaWR0aC0xICsgc3JjU3RyaWRlXSk+PjI7CisgICAgICAgIGRzdFtzcmNXaWR0aCoyIC0xICsgZHN0U3RyaWRlXT0gKCAgc3JjW3NyY1dpZHRoLTFdICsgMypzcmNbc3JjV2lkdGgtMSArIHNyY1N0cmlkZV0pPj4yOworCisgICAgICAgIGRzdCs9ZHN0U3RyaWRlKjI7CisgICAgICAgIHNyYys9c3JjU3RyaWRlOworICAgIH0KKworICAgIC8vIGxhc3QgbGluZQorICAgIGRzdFswXT0gc3JjWzBdOworCisgICAgZm9yICh4PTA7IHg8c3JjV2lkdGgtMTsgeCsrKSB7CisgICAgICAgIGRzdFsyKngrMV09ICgzKnNyY1t4XSArICAgc3JjW3grMV0pPj4yOworICAgICAgICBkc3RbMip4KzJdPSAoICBzcmNbeF0gKyAzKnNyY1t4KzFdKT4+MjsKKyAgICB9CisgICAgZHN0WzIqc3JjV2lkdGgtMV09IHNyY1tzcmNXaWR0aC0xXTsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoRU1NUyIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgIFNGRU5DRSIgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICA6OjoibWVtb3J5Iik7Cit9CisjZW5kaWYgLyogQ09NUElMRV9URU1QTEFURV9NTVhFWFQgfHwgQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVyAqLworCisjaWYgIUNPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cKKy8qKgorICogSGVpZ2h0IHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIHdpZHRoIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDE2LgorICogKElmIHRoaXMgaXMgYSBwcm9ibGVtIGZvciBhbnlvbmUgdGhlbiB0ZWxsIG1lLCBhbmQgSSB3aWxsIGZpeCBpdC4pCisgKiBDaHJvbWluYW5jZSBkYXRhIGlzIG9ubHkgdGFrZW4gZnJvbSBldmVyeSBzZWNvbmQgbGluZSwgb3RoZXJzIGFyZSBpZ25vcmVkLgorICogRklYTUU6IFdyaXRlIEhRIHZlcnNpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUodXl2eXRveXYxMikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICp5ZHN0LCB1aW50OF90ICp1ZHN0LCB1aW50OF90ICp2ZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSkKK3sKKyAgICBpbnQgeTsKKyAgICBjb25zdCB4ODZfcmVnIGNocm9tV2lkdGg9IHdpZHRoPj4xOworICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSs9MikgeworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgInhvciAgICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICBcblx0IgorICAgICAgICAgICAgInBjbXBlcXcgICAgICAgICAgICAgJSVtbTcsICUlbW03ICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAgICAgICQ4LCAlJW1tNyAgIFxuXHQiIC8vIEZGLDAwLEZGLDAwLi4uCisgICAgICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgNCAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiA2NCglMCwgJSUiUkVHX2EiLCA0KSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgKCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMCAgIFxuXHQiIC8vIFVZVlkgVVlWWSgwKQorICAgICAgICAgICAgIm1vdnEgICAgICA4KCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMSAgIFxuXHQiIC8vIFVZVlkgVVlWWSg0KQorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0yICAgXG5cdCIgLy8gVVlWWSBVWVZZKDApCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTMgICBcblx0IiAvLyBVWVZZIFVZVlkoNCkKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICUlbW03LCAlJW1tMCAgIFxuXHQiIC8vIFUwVjAgVTBWMCgwKQorICAgICAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0xICAgXG5cdCIgLy8gVTBWMCBVMFYwKDQpCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAgICAgICAkOCwgJSVtbTIgICBcblx0IiAvLyBZMFkwIFkwWTAoMCkKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAgICAgICQ4LCAlJW1tMyAgIFxuXHQiIC8vIFkwWTAgWTBZMCg0KQorICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgXG5cdCIgLy8gVVZVViBVVlVWKDApCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAlJW1tMywgJSVtbTIgICBcblx0IiAvLyBZWVlZIFlZWVkoMCkKKworICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgJSVtbTIsICAoJTEsICUlIlJFR19hIiwgMikgXG5cdCIKKworICAgICAgICAgICAgIm1vdnEgICAgIDE2KCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMSAgIFxuXHQiIC8vIFVZVlkgVVlWWSg4KQorICAgICAgICAgICAgIm1vdnEgICAgIDI0KCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMiAgIFxuXHQiIC8vIFVZVlkgVVlWWSgxMikKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMyAgIFxuXHQiIC8vIFVZVlkgVVlWWSg4KQorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgJSVtbTIsICUlbW00ICAgXG5cdCIgLy8gVVlWWSBVWVZZKDEyKQorICAgICAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0xICAgXG5cdCIgLy8gVTBWMCBVMFYwKDgpCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTIgICBcblx0IiAvLyBVMFYwIFUwVjAoMTIpCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAgICAgICAkOCwgJSVtbTMgICBcblx0IiAvLyBZMFkwIFkwWTAoOCkKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAgICAgICQ4LCAlJW1tNCAgIFxuXHQiIC8vIFkwWTAgWTBZMCgxMikKKyAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICUlbW0yLCAlJW1tMSAgIFxuXHQiIC8vIFVWVVYgVVZVVig4KQorICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgJSVtbTQsICUlbW0zICAgXG5cdCIgLy8gWVlZWSBZWVlZKDgpCisKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICUlbW0zLCA4KCUxLCAlJSJSRUdfYSIsIDIpIFxuXHQiCisKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMiAgIFxuXHQiIC8vIFVWVVYgVVZVVigwKQorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0zICAgXG5cdCIgLy8gVVZVViBVVlVWKDgpCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAgICAgICAkOCwgJSVtbTAgICBcblx0IiAvLyBWMFYwIFYwVjAoMCkKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAgICAgICQ4LCAlJW1tMSAgIFxuXHQiIC8vIFYwVjAgVjBWMCg4KQorICAgICAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0yICAgXG5cdCIgLy8gVTBVMCBVMFUwKDApCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTMgICBcblx0IiAvLyBVMFUwIFUwVTAoOCkKKyAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgIFxuXHQiIC8vIFZWVlYgVlZWVigwKQorICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgXG5cdCIgLy8gVVVVVSBVVVVVKDApCisKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICUlbW0wLCAoJTMsICUlIlJFR19hIikgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICUlbW0yLCAoJTIsICUlIlJFR19hIikgXG5cdCIKKworICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgJDgsICUlIlJFR19hIiAgIFxuXHQiCisgICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgICAgICAlNCwgJSUiUkVHX2EiICAgXG5cdCIKKyAgICAgICAgICAgICIgamIgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6OiJyIihzcmMpLCAiciIoeWRzdCksICJyIih1ZHN0KSwgInIiKHZkc3QpLCAiZyIgKGNocm9tV2lkdGgpCisgICAgICAgICAgICA6ICJtZW1vcnkiLCAiJSJSRUdfYQorICAgICAgICApOworCisgICAgICAgIHlkc3QgKz0gbHVtU3RyaWRlOworICAgICAgICBzcmMgICs9IHNyY1N0cmlkZTsKKworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgInhvciAgICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICBcblx0IgorICAgICAgICAgICAgIi5wMmFsaWduICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiA2NCglMCwgJSUiUkVHX2EiLCA0KSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgKCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMCAgIFxuXHQiIC8vIFlVWVYgWVVZVigwKQorICAgICAgICAgICAgIm1vdnEgICAgICA4KCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMSAgIFxuXHQiIC8vIFlVWVYgWVVZVig0KQorICAgICAgICAgICAgIm1vdnEgICAgIDE2KCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMiAgIFxuXHQiIC8vIFlVWVYgWVVZVig4KQorICAgICAgICAgICAgIm1vdnEgICAgIDI0KCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMyAgIFxuXHQiIC8vIFlVWVYgWVVZVigxMikKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAgICAgICQ4LCAlJW1tMCAgIFxuXHQiIC8vIFkwWTAgWTBZMCgwKQorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICAgICAgJDgsICUlbW0xICAgXG5cdCIgLy8gWTBZMCBZMFkwKDQpCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAgICAgICAkOCwgJSVtbTIgICBcblx0IiAvLyBZMFkwIFkwWTAoOCkKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAgICAgICQ4LCAlJW1tMyAgIFxuXHQiIC8vIFkwWTAgWTBZMCgxMikKKyAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgIFxuXHQiIC8vIFlZWVkgWVlZWSgwKQorICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgXG5cdCIgLy8gWVlZWSBZWVlZKDgpCisKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICUlbW0wLCAgKCUxLCAlJSJSRUdfYSIsIDIpIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAlJW1tMiwgOCglMSwgJSUiUkVHX2EiLCAyKSBcblx0IgorCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAkOCwgJSUiUkVHX2EiICAgXG5cdCIKKyAgICAgICAgICAgICJjbXAgICAgICAgICAgICAgICAgICAgICU0LCAlJSJSRUdfYSIgICBcblx0IgorICAgICAgICAgICAgIiBqYiAgICAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgOjoiciIoc3JjKSwgInIiKHlkc3QpLCAiciIodWRzdCksICJyIih2ZHN0KSwgImciIChjaHJvbVdpZHRoKQorICAgICAgICAgICAgOiAibWVtb3J5IiwgIiUiUkVHX2EKKyAgICAgICAgKTsKKyAgICAgICAgdWRzdCArPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgdmRzdCArPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgeWRzdCArPSBsdW1TdHJpZGU7CisgICAgICAgIHNyYyAgKz0gc3JjU3RyaWRlOworICAgIH0KKyAgICBfX2FzbV9fIHZvbGF0aWxlKEVNTVMiICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICBTRkVOQ0UiICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAgOjo6Im1lbW9yeSIpOworfQorI2VuZGlmIC8qICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XICovCisKKy8qKgorICogSGVpZ2h0IHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIHdpZHRoIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDIuCisgKiAoSWYgdGhpcyBpcyBhIHByb2JsZW0gZm9yIGFueW9uZSB0aGVuIHRlbGwgbWUsIGFuZCBJIHdpbGwgZml4IGl0LikKKyAqIENocm9taW5hbmNlIGRhdGEgaXMgb25seSB0YWtlbiBmcm9tIGV2ZXJ5IHNlY29uZCBsaW5lLAorICogb3RoZXJzIGFyZSBpZ25vcmVkIGluIHRoZSBDIHZlcnNpb24uCisgKiBGSVhNRTogV3JpdGUgSFEgdmVyc2lvbi4KKyAqLworI2lmIEhBVkVfN1JFR1MKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUocmdiMjR0b3l2MTIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqeWRzdCwgdWludDhfdCAqdWRzdCwgdWludDhfdCAqdmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnJnYjJ5dXYpCit7CisjZGVmaW5lIEJHUjJZX0lEWCAiMTYqNCsxNiozMiIKKyNkZWZpbmUgQkdSMlVfSURYICIxNio0KzE2KjMzIgorI2RlZmluZSBCR1IyVl9JRFggIjE2KjQrMTYqMzQiCisgICAgaW50IHk7CisgICAgY29uc3QgeDg2X3JlZyBjaHJvbVdpZHRoPSB3aWR0aD4+MTsKKworICAgIGlmIChoZWlnaHQgPiAyKSB7CisgICAgICAgIGZmX3JnYjI0dG95djEyX2Moc3JjLCB5ZHN0LCB1ZHN0LCB2ZHN0LCB3aWR0aCwgMiwgbHVtU3RyaWRlLCBjaHJvbVN0cmlkZSwgc3JjU3RyaWRlLCByZ2IyeXV2KTsKKyAgICAgICAgc3JjICArPSAyKnNyY1N0cmlkZTsKKyAgICAgICAgeWRzdCArPSAyKmx1bVN0cmlkZTsKKyAgICAgICAgdWRzdCArPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgdmRzdCArPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgaGVpZ2h0IC09IDI7CisgICAgfQorCisgICAgZm9yICh5PTA7IHk8aGVpZ2h0LTI7IHkrPTIpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaT0wOyBpPDI7IGkrKykgeworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgJTIsICUlIlJFR19hIiAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICAgICAgIkJHUjJZX0lEWCIoJTMpLCAlJW1tNiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICJNQU5HTEUoZmZfdzExMTEpIiwgJSVtbTUgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHhvciAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW03ICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlJSJSRUdfYSIsIDIpLCAlJSJSRUdfZCIgICBcblx0IgorICAgICAgICAgICAgICAgICIucDJhbGlnbiAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgUFJFRkVUQ0giICAgIDY0KCUwLCAlJSJSRUdfZCIpICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkICAgICAgICAgICglMCwgJSUiUkVHX2QiKSwgJSVtbTAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZCAgICAgICAgIDMoJTAsICUlIlJFR19kIiksICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZCAgICAgICAgIDYoJTAsICUlIlJFR19kIiksICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgICAgICAgICA5KCUwLCAlJSJSRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgJSVtbTcsICUlbW0zICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBtYWRkd2QgICAgICAgICAgICAgICAgICUlbW02LCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAlJW1tNiwgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTYsICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBtYWRkd2QgICAgICAgICAgICAgICAgICUlbW02LCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAkOCwgJSVtbTAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNyYWQgICAgICAgICAgICAgICAgICAgICAgJDgsICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzcmFkICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAkOCwgJSVtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFja3NzZHcgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhY2tzc2R3ICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAlJW1tNSwgJSVtbTAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhY2tzc2R3ICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICAgICAkNywgJSVtbTAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJtb3ZkICAgICAgICAxMiglMCwgJSUiUkVHX2QiKSwgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZCAgICAgICAgMTUoJTAsICUlIlJFR19kIiksICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZCAgICAgICAgMTgoJTAsICUlIlJFR19kIiksICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgICAgICAgIDIxKCUwLCAlJSJSRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgJSVtbTcsICUlbW0zICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBtYWRkd2QgICAgICAgICAgICAgICAgICUlbW02LCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAlJW1tNiwgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTYsICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBtYWRkd2QgICAgICAgICAgICAgICAgICUlbW02LCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAkOCwgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNyYWQgICAgICAgICAgICAgICAgICAgICAgJDgsICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBzcmFkICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAkOCwgJSVtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicGFja3NzZHcgICAgICAgICAgICAgICAgJSVtbTEsICUlbW00ICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhY2tzc2R3ICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAlJW1tNSwgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgJDI0LCAlJSJSRUdfZCIgICBcblx0IgorICAgICAgICAgICAgICAgICJwYWNrc3NkdyAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHNyYXcgICAgICAgICAgICAgICAgICAgICAgJDcsICUlbW00ICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAgICAgJSVtbTQsICUlbW0wICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInBhZGR1c2IgIk1BTkdMRShmZl9iZ3IyWU9mZnNldCkiLCAlJW1tMCAgICBcblx0IgorCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW0wLCAoJTEsICUlIlJFR19hIikgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgJDgsICAgICAgJSUiUkVHX2EiICBcblx0IgorICAgICAgICAgICAgICAgICIganMgICAgICAgICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOiA6ICJyIiAoc3JjK3dpZHRoKjMpLCAiciIgKHlkc3Qrd2lkdGgpLCAiZyIgKCh4ODZfcmVnKS13aWR0aCksICJyIihyZ2IyeXV2KQorICAgICAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGZmX3cxMTExLGZmX2JncjJZT2Zmc2V0KQorICAgICAgICAgICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19kCisgICAgICAgICAgICApOworICAgICAgICAgICAgeWRzdCArPSBsdW1TdHJpZGU7CisgICAgICAgICAgICBzcmMgICs9IHNyY1N0cmlkZTsKKyAgICAgICAgfQorICAgICAgICBzcmMgLT0gc3JjU3RyaWRlKjI7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgJTQsICUlIlJFR19hIiAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAiTUFOR0xFKGZmX3cxMTExKSIsICUlbW01ICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAiQkdSMlVfSURYIiglNSksICUlbW02ICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHhvciAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW03ICAgICAgIFxuXHQiCisgICAgICAgICAgICAibGVhICglJSJSRUdfYSIsICUlIlJFR19hIiwgMiksICUlIlJFR19kIiAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAlJSJSRUdfZCIsICUlIlJFR19kIiAgIFxuXHQiCisgICAgICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQUkVGRVRDSCIgICAgNjQoJTAsICUlIlJFR19kIikgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQUkVGRVRDSCIgICAgNjQoJTEsICUlIlJFR19kIikgICAgICAgICAgICAgIFxuXHQiCisjaWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgfHwgQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVworICAgICAgICAgICAgIm1vdnEgICAgICAgICAgKCUwLCAlJSJSRUdfZCIpLCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgKCUxLCAlJSJSRUdfZCIpLCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICA2KCUwLCAlJSJSRUdfZCIpLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICA2KCUxLCAlJSJSRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IiICAgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IiICAgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICAgICAgICAgICAgICAgJDI0LCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxxICAgICAgICAgICAgICAgICAgICAgJDI0LCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IiICAgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IiICAgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMiAgICAgICBcblx0IgorI2Vsc2UKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAgICglMCwgJSUiUkVHX2QiKSwgJSVtbTAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAgICglMSwgJSUiUkVHX2QiKSwgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAgMyglMCwgJSUiUkVHX2QiKSwgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAgMyglMSwgJSUiUkVHX2QiKSwgJSVtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAgNiglMCwgJSUiUkVHX2QiKSwgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAgNiglMSwgJSUiUkVHX2QiKSwgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAgOSglMCwgJSUiUkVHX2QiKSwgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAgOSglMSwgJSUiUkVHX2QiKSwgJSVtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAlJW1tNCwgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAgICAgICAgICAkMiwgJSVtbTAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAgICAgICAgICAkMiwgJSVtbTIgICAgICAgXG5cdCIKKyNlbmRpZgorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgIkJHUjJWX0lEWCIoJTUpLCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgIkJHUjJWX0lEWCIoJTUpLCAlJW1tMyAgICAgICBcblx0IgorCisgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTIsICUlbW0zICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTYsICUlbW0wICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTYsICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWQgICAgICAgICAgICAgICAgICAgICAgJDgsICUlbW0wICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWQgICAgICAgICAgICAgICAgICAgICAgJDgsICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWQgICAgICAgICAgICAgICAgICAgICAgJDgsICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWQgICAgICAgICAgICAgICAgICAgICAgJDgsICUlbW0zICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3NzZHcgICAgICAgICAgICAgICAgJSVtbTIsICUlbW0wICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3NzZHcgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW0wICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3NzZHcgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgIFxuXHQiIC8vIFYxIFYwIFUxIFUwCisgICAgICAgICAgICAicHNyYXcgICAgICAgICAgICAgICAgICAgICAgJDcsICUlbW0wICAgICAgIFxuXHQiCisKKyNpZiBDT01QSUxFX1RFTVBMQVRFX01NWEVYVCB8fCBDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XCisgICAgICAgICAgICAibW92cSAgICAgICAgMTIoJTAsICUlIlJFR19kIiksICUlbW00ICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgMTIoJTEsICUlIlJFR19kIiksICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgMTgoJTAsICUlIlJFR19kIiksICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgMTgoJTEsICUlIlJFR19kIiksICUlbW0zICAgICAgIFxuXHQiCisgICAgICAgICAgICBQQVZHQiIgICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW00ICAgICAgIFxuXHQiCisgICAgICAgICAgICBQQVZHQiIgICAgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgJSVtbTQsICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgJSVtbTIsICUlbW0zICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgICAgICAgICAgICAgICAkMjQsICUlbW00ICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHEgICAgICAgICAgICAgICAgICAgICAkMjQsICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICBQQVZHQiIgICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW00ICAgICAgIFxuXHQiCisgICAgICAgICAgICBQQVZHQiIgICAgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgJSVtbTcsICUlbW00ICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgJSVtbTcsICUlbW0yICAgICAgIFxuXHQiCisjZWxzZQorICAgICAgICAgICAgIm1vdmQgICAgICAgIDEyKCUwLCAlJSJSRUdfZCIpLCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgIDEyKCUxLCAlJSJSRUdfZCIpLCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgIDE1KCUwLCAlJSJSRUdfZCIpLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgIDE1KCUxLCAlJSJSRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgIDE4KCUwLCAlJSJSRUdfZCIpLCAlJW1tNSAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgIDE4KCUxLCAlJSJSRUdfZCIpLCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgIDIxKCUwLCAlJSJSRUdfZCIpLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgIDIxKCUxLCAlJSJSRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tNSAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tNSAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICUlbW01LCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgIk1BTkdMRShmZl93MTExMSkiLCAlJW1tNSAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICAgICAgICAgICQyLCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICAgICAgICAgICQyLCAlJW1tMiAgICAgICBcblx0IgorI2VuZGlmCisgICAgICAgICAgICAibW92cSAgICAgICAgICAiQkdSMlZfSURYIiglNSksICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAiQkdSMlZfSURYIiglNSksICUlbW0zICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAlJW1tNCwgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAlJW1tNiwgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAlJW1tNiwgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAkOCwgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAkOCwgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAkOCwgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAkOCwgJSVtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrc3NkdyAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrc3NkdyAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAlJW1tNSwgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAlJW1tNSwgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICQyNCwgJSUiUkVHX2QiICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrc3NkdyAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTQgICAgICAgXG5cdCIgLy8gVjMgVjIgVTMgVTIKKyAgICAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICAgICAkNywgJSVtbTQgICAgICAgXG5cdCIKKworICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsZHEgICAgICAgICAgICAgICAlJW1tNCwgJSVtbTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGRxICAgICAgICAgICAgICAgJSVtbTQsICUlbW0xICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2tzc3diICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkYiAiTUFOR0xFKGZmX2JncjJVVk9mZnNldCkiLCAlJW1tMCAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgICAgICAgICAgICAgICAgJSVtbTAsICglMiwgJSUiUkVHX2EiKSBcblx0IgorICAgICAgICAgICAgInB1bnBja2hkcSAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAgICAgICAgICAgICAgICAlJW1tMCwgKCUzLCAlJSJSRUdfYSIpIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgJDQsICUlIlJFR19hIiAgICAgICBcblx0IgorICAgICAgICAgICAgIiBqcyAgICAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDogOiAiciIgKHNyYytjaHJvbVdpZHRoKjYpLCAiciIgKHNyYytzcmNTdHJpZGUrY2hyb21XaWR0aCo2KSwgInIiICh1ZHN0K2Nocm9tV2lkdGgpLCAiciIgKHZkc3QrY2hyb21XaWR0aCksICJnIiAoLWNocm9tV2lkdGgpLCAiciIocmdiMnl1dikKKyAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGZmX3cxMTExLGZmX2JncjJVVk9mZnNldCkKKyAgICAgICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19kCisgICAgICAgICk7CisKKyAgICAgICAgdWRzdCArPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgdmRzdCArPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgc3JjICArPSBzcmNTdHJpZGUqMjsKKyAgICB9CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKEVNTVMiICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgICAgICBTRkVOQ0UiICAgICBcblx0IgorICAgICAgICAgICAgICAgICAgICAgOjo6Im1lbW9yeSIpOworCisgICAgIGZmX3JnYjI0dG95djEyX2Moc3JjLCB5ZHN0LCB1ZHN0LCB2ZHN0LCB3aWR0aCwgaGVpZ2h0LXksIGx1bVN0cmlkZSwgY2hyb21TdHJpZGUsIHNyY1N0cmlkZSwgcmdiMnl1dik7Cit9CisjZW5kaWYgLyogSEFWRV83UkVHUyAqLworI2VuZGlmIC8qICFDT01QSUxFX1RFTVBMQVRFX1NTRTIgKi8KKworI2lmICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XICYmICFDT01QSUxFX1RFTVBMQVRFX0FWWAorc3RhdGljIHZvaWQgUkVOQU1FKGludGVybGVhdmVCeXRlcykoY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNyYzFTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjMlN0cmlkZSwgaW50IGRzdFN0cmlkZSkKK3sKKyAgICBpbnQgaDsKKworICAgIGZvciAoaD0wOyBoIDwgaGVpZ2h0OyBoKyspIHsKKyAgICAgICAgaW50IHc7CisKKyAgICAgICAgaWYgKHdpZHRoID49IDE2KQorI2lmIENPTVBJTEVfVEVNUExBVEVfU1NFMgorICAgICAgICBfX2FzbV9fKAorICAgICAgICAgICAgInhvciAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgIFxuXHQiCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiA2NCglMSwgJSUiUkVHX2EiKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFJFRkVUQ0giIDY0KCUyLCAlJSJSRUdfYSIpICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZHFhICAgICAoJTEsICUlIlJFR19hIiksICUleG1tMCAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkcWEgICAgICglMSwgJSUiUkVHX2EiKSwgJSV4bW0xICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmRxYSAgICAgKCUyLCAlJSJSRUdfYSIpLCAlJXhtbTIgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAlJXhtbTIsICUleG1tMCAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYncgICAgICAgICAgICUleG1tMiwgJSV4bW0xICAgICBcblx0IgorICAgICAgICAgICAgIm1vdm50ZHEgICAgICAgICAgICAgJSV4bW0wLCAgICglMCwgJSUiUkVHX2EiLCAyKSAgIFxuXHQiCisgICAgICAgICAgICAibW92bnRkcSAgICAgICAgICAgICAlJXhtbTEsIDE2KCUwLCAlJSJSRUdfYSIsIDIpICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICQxNiwgJSUiUkVHX2EiICBcblx0IgorICAgICAgICAgICAgImNtcCAgICAgICAgICAgICAgICAgICAgICUzLCAlJSJSRUdfYSIgIFxuXHQiCisgICAgICAgICAgICAiIGpiICAgICAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6InIiKGRlc3QpLCAiciIoc3JjMSksICJyIihzcmMyKSwgInIiICgoeDg2X3JlZyl3aWR0aC0xNSkKKyAgICAgICAgICAgIDogIm1lbW9yeSIsICIlIlJFR19hIiIKKyAgICAgICAgKTsKKyNlbHNlCisgICAgICAgIF9fYXNtX18oCisgICAgICAgICAgICAieG9yICUlIlJFR19hIiwgJSUiUkVHX2EiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFJFRkVUQ0giIDY0KCUxLCAlJSJSRUdfYSIpICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQUkVGRVRDSCIgNjQoJTIsICUlIlJFR19hIikgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICglMSwgJSUiUkVHX2EiKSwgJSVtbTAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICA4KCUxLCAlJSJSRUdfYSIpLCAlJW1tMiAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0xICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTMgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgKCUyLCAlJSJSRUdfYSIpLCAlJW1tNCAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgIDgoJTIsICUlIlJFR19hIiksICUlbW01ICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAlJW1tNCwgJSVtbTAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2hidyAgICAgICAgICAgICUlbW00LCAlJW1tMSAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgJSVtbTUsICUlbW0yICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYncgICAgICAgICAgICAlJW1tNSwgJSVtbTMgICAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICUlbW0wLCAgICglMCwgJSUiUkVHX2EiLCAyKSAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgJSVtbTEsICA4KCUwLCAlJSJSRUdfYSIsIDIpICAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAlJW1tMiwgMTYoJTAsICUlIlJFR19hIiwgMikgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICUlbW0zLCAyNCglMCwgJSUiUkVHX2EiLCAyKSAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAkMTYsICUlIlJFR19hIiAgXG5cdCIKKyAgICAgICAgICAgICJjbXAgICAgICAgICAgICAgICAgICAgICAlMywgJSUiUkVHX2EiICBcblx0IgorICAgICAgICAgICAgIiBqYiAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6OiJyIihkZXN0KSwgInIiKHNyYzEpLCAiciIoc3JjMiksICJyIiAoKHg4Nl9yZWcpd2lkdGgtMTUpCisgICAgICAgICAgICA6ICJtZW1vcnkiLCAiJSJSRUdfYQorICAgICAgICApOworI2VuZGlmCisgICAgICAgIGZvciAodz0gKHdpZHRoJih+MTUpKTsgdyA8IHdpZHRoOyB3KyspIHsKKyAgICAgICAgICAgIGRlc3RbMip3KzBdID0gc3JjMVt3XTsKKyAgICAgICAgICAgIGRlc3RbMip3KzFdID0gc3JjMlt3XTsKKyAgICAgICAgfQorICAgICAgICBkZXN0ICs9IGRzdFN0cmlkZTsKKyAgICAgICAgc3JjMSArPSBzcmMxU3RyaWRlOworICAgICAgICBzcmMyICs9IHNyYzJTdHJpZGU7CisgICAgfQorICAgIF9fYXNtX18oCisgICAgICAgICAgICBFTU1TIiAgICAgICBcblx0IgorICAgICAgICAgICAgU0ZFTkNFIiAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6OiAibWVtb3J5IgorICAgICAgICAgICAgKTsKK30KKyNlbmRpZiAvKiAhQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVyAmJiAhQ09NUElMRV9URU1QTEFURV9BVlggKi8KKworI2lmICFDT01QSUxFX1RFTVBMQVRFX0FWWCB8fCBIQVZFX0FWWF9FWFRFUk5BTAorI2lmICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XICYmIChBUkNIX1g4Nl8zMiB8fCBDT01QSUxFX1RFTVBMQVRFX1NTRTIpICYmIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUID09IENPTVBJTEVfVEVNUExBVEVfU1NFMiAmJiBIQVZFX1lBU00KK3ZvaWQgUkVOQU1FKGZmX252MTJUb1VWKSh1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnVudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVudXNlZDIpOworc3RhdGljIHZvaWQgUkVOQU1FKGRlaW50ZXJsZWF2ZUJ5dGVzKShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdDEsIHVpbnQ4X3QgKmRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdDFTdHJpZGUsIGludCBkc3QyU3RyaWRlKQoreworICAgIGludCBoOworCisgICAgZm9yIChoID0gMDsgaCA8IGhlaWdodDsgaCsrKSB7CisgICAgICAgIFJFTkFNRShmZl9udjEyVG9VVikoZHN0MSwgZHN0MiwgTlVMTCwgc3JjLCBOVUxMLCB3aWR0aCwgTlVMTCk7CisgICAgICAgIHNyYyAgKz0gc3JjU3RyaWRlOworICAgICAgICBkc3QxICs9IGRzdDFTdHJpZGU7CisgICAgICAgIGRzdDIgKz0gZHN0MlN0cmlkZTsKKyAgICB9CisgICAgX19hc21fXygKKyAgICAgICAgICAgIEVNTVMiICAgICAgIFxuXHQiCisgICAgICAgICAgICBTRkVOQ0UiICAgICBcblx0IgorICAgICAgICAgICAgOjo6ICJtZW1vcnkiCisgICAgICAgICAgICApOworfQorI2VuZGlmIC8qICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XICovCisjZW5kaWYgLyogIUNPTVBJTEVfVEVNUExBVEVfQVZYIHx8IEhBVkVfQVZYX0VYVEVSTkFMICovCisKKyNpZiAhQ09NUElMRV9URU1QTEFURV9TU0UyCisjaWYgIUNPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUodnU5X3RvX3Z1MTIpKGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QxLCB1aW50OF90ICpkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZTEsIGludCBzcmNTdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZTEsIGludCBkc3RTdHJpZGUyKQoreworICAgIHg4Nl9yZWcgeCwgeTsKKyAgICBpbnQgdyxoOworICAgIHc9d2lkdGgvMjsgaD1oZWlnaHQvMjsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICBQUkVGRVRDSCIgJTAgICAgXG5cdCIKKyAgICAgICAgUFJFRkVUQ0giICUxICAgIFxuXHQiCisgICAgICAgIDo6Im0iKCooc3JjMStzcmNTdHJpZGUxKSksIm0iKCooc3JjMitzcmNTdHJpZGUyKSk6Im1lbW9yeSIpOworICAgIGZvciAoeT0wO3k8aDt5KyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCogczE9c3JjMStzcmNTdHJpZGUxKih5Pj4xKTsKKyAgICAgICAgdWludDhfdCogZD1kc3QxK2RzdFN0cmlkZTEqeTsKKyAgICAgICAgeD0wOworICAgICAgICBmb3IgKDt4PHctMzE7eCs9MzIpIHsKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAgICAgUFJFRkVUQ0giICAgMzIoJTEsJTIpICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICAgKCUxLCUyKSwgJSVtbTAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAgICAgOCglMSwlMiksICUlbW0yIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICAgMTYoJTEsJTIpLCAlJW1tNCBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgIDI0KCUxLCUyKSwgJSVtbTYgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAgICUlbW0wLCAlJW1tMSBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgJSVtbTIsICUlbW0zIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICAlJW1tNCwgJSVtbTUgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAgICUlbW02LCAlJW1tNyBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTAsICUlbW0wIFxuXHQiCisgICAgICAgICAgICAgICAgInB1bnBja2hidyAlJW1tMSwgJSVtbTEgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW0yLCAlJW1tMiBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTMsICUlbW0zIFxuXHQiCisgICAgICAgICAgICAgICAgInB1bnBja2xidyAlJW1tNCwgJSVtbTQgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNraGJ3ICUlbW01LCAlJW1tNSBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTYsICUlbW02IFxuXHQiCisgICAgICAgICAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTcgXG5cdCIKKyAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICUlbW0wLCAgICglMCwlMiwyKSAgXG5cdCIKKyAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICUlbW0xLCAgOCglMCwlMiwyKSAgXG5cdCIKKyAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICUlbW0yLCAxNiglMCwlMiwyKSAgXG5cdCIKKyAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICUlbW0zLCAyNCglMCwlMiwyKSAgXG5cdCIKKyAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICUlbW00LCAzMiglMCwlMiwyKSAgXG5cdCIKKyAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICUlbW01LCA0MCglMCwlMiwyKSAgXG5cdCIKKyAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICUlbW02LCA0OCglMCwlMiwyKSAgXG5cdCIKKyAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICUlbW03LCA1NiglMCwlMiwyKSIKKyAgICAgICAgICAgICAgICA6OiAiciIoZCksICJyIihzMSksICJyIih4KQorICAgICAgICAgICAgICAgIDoibWVtb3J5Iik7CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7eDx3O3grKykgZFsyKnhdPWRbMip4KzFdPXMxW3hdOworICAgIH0KKyAgICBmb3IgKHk9MDt5PGg7eSsrKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHMyPXNyYzIrc3JjU3RyaWRlMiooeT4+MSk7CisgICAgICAgIHVpbnQ4X3QqIGQ9ZHN0Mitkc3RTdHJpZGUyKnk7CisgICAgICAgIHg9MDsKKyAgICAgICAgZm9yICg7eDx3LTMxO3grPTMyKSB7CisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgICAgIFBSRUZFVENIIiAgIDMyKCUxLCUyKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAgICAgICglMSwlMiksICUlbW0wIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICAgIDgoJTEsJTIpLCAlJW1tMiBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgIDE2KCUxLCUyKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAgICAyNCglMSwlMiksICUlbW02IFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICAlJW1tMCwgJSVtbTEgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAgICUlbW0yLCAlJW1tMyBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgJSVtbTQsICUlbW01IFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICAlJW1tNiwgJSVtbTcgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW0wLCAlJW1tMCBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTEsICUlbW0xIFxuXHQiCisgICAgICAgICAgICAgICAgInB1bnBja2xidyAlJW1tMiwgJSVtbTIgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNraGJ3ICUlbW0zLCAlJW1tMyBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTQsICUlbW00IFxuXHQiCisgICAgICAgICAgICAgICAgInB1bnBja2hidyAlJW1tNSwgJSVtbTUgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW02LCAlJW1tNiBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW03IFxuXHQiCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAlJW1tMCwgICAoJTAsJTIsMikgIFxuXHQiCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAlJW1tMSwgIDgoJTAsJTIsMikgIFxuXHQiCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAlJW1tMiwgMTYoJTAsJTIsMikgIFxuXHQiCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAlJW1tMywgMjQoJTAsJTIsMikgIFxuXHQiCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAlJW1tNCwgMzIoJTAsJTIsMikgIFxuXHQiCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAlJW1tNSwgNDAoJTAsJTIsMikgIFxuXHQiCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAlJW1tNiwgNDgoJTAsJTIsMikgIFxuXHQiCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAlJW1tNywgNTYoJTAsJTIsMikiCisgICAgICAgICAgICAgICAgOjogInIiKGQpLCAiciIoczIpLCAiciIoeCkKKyAgICAgICAgICAgICAgICA6Im1lbW9yeSIpOworICAgICAgICB9CisgICAgICAgIGZvciAoO3g8dzt4KyspIGRbMip4XT1kWzIqeCsxXT1zMlt4XTsKKyAgICB9CisgICAgX19hc21fXygKKyAgICAgICAgICAgIEVNTVMiICAgICAgIFxuXHQiCisgICAgICAgICAgICBTRkVOQ0UiICAgICBcblx0IgorICAgICAgICAgICAgOjo6ICJtZW1vcnkiCisgICAgICAgICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUoeXZ1OV90b195dXkyKShjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLCBjb25zdCB1aW50OF90ICpzcmMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZTEsIGludCBzcmNTdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGUzLCBpbnQgZHN0U3RyaWRlKQoreworICAgIHg4Nl9yZWcgeDsKKyAgICBpbnQgeSx3LGg7CisgICAgdz13aWR0aC8yOyBoPWhlaWdodDsKKyAgICBmb3IgKHk9MDt5PGg7eSsrKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHlwPXNyYzErc3JjU3RyaWRlMSp5OworICAgICAgICBjb25zdCB1aW50OF90KiB1cD1zcmMyK3NyY1N0cmlkZTIqKHk+PjIpOworICAgICAgICBjb25zdCB1aW50OF90KiB2cD1zcmMzK3NyY1N0cmlkZTMqKHk+PjIpOworICAgICAgICB1aW50OF90KiBkPWRzdCtkc3RTdHJpZGUqeTsKKyAgICAgICAgeD0wOworICAgICAgICBmb3IgKDt4PHctNzt4Kz04KSB7CisgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgICAgIFBSRUZFVENIIiAgIDMyKCUxLCAlMCkgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICBQUkVGRVRDSCIgICAzMiglMiwgJTApICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgUFJFRkVUQ0giICAgMzIoJTMsICUwKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgKCUxLCAlMCwgNCksICUlbW0wICAgXG5cdCIgLyogWTBZMVkyWTNZNFk1WTZZNyAqLworICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICAgKCUyLCAlMCksICUlbW0xICAgXG5cdCIgLyogVTBVMVUyVTNVNFU1VTZVNyAqLworICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICAgKCUzLCAlMCksICUlbW0yICAgXG5cdCIgLyogVjBWMVYyVjNWNFY1VjZWNyAqLworICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgJSVtbTAsICUlbW0zICAgXG5cdCIgLyogWTBZMVkyWTNZNFk1WTZZNyAqLworICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgJSVtbTEsICUlbW00ICAgXG5cdCIgLyogVTBVMVUyVTNVNFU1VTZVNyAqLworICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgJSVtbTIsICUlbW01ICAgXG5cdCIgLyogVjBWMVYyVjNWNFY1VjZWNyAqLworICAgICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgJSVtbTEsICUlbW0xICAgXG5cdCIgLyogVTBVMCBVMVUxIFUyVTIgVTNVMyAqLworICAgICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgJSVtbTIsICUlbW0yICAgXG5cdCIgLyogVjBWMCBWMVYxIFYyVjIgVjNWMyAqLworICAgICAgICAgICAgICAgICJwdW5wY2toYncgICAgICAgJSVtbTQsICUlbW00ICAgXG5cdCIgLyogVTRVNCBVNVU1IFU2VTYgVTdVNyAqLworICAgICAgICAgICAgICAgICJwdW5wY2toYncgICAgICAgJSVtbTUsICUlbW01ICAgXG5cdCIgLyogVjRWNCBWNVY1IFY2VjYgVjdWNyAqLworCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAlJW1tMSwgJSVtbTYgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgJSVtbTIsICUlbW0xICAgXG5cdCIgLyogVTBWMCBVMFYwIFUxVjEgVTFWMSovCisgICAgICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAlJW1tMSwgJSVtbTAgICBcblx0IiAvKiBZMFUwIFkxVjAgWTJVMCBZM1YwKi8KKyAgICAgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgICUlbW0xLCAlJW1tMyAgIFxuXHQiIC8qIFk0VTEgWTVWMSBZNlUxIFk3VjEqLworICAgICAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgJSVtbTAsICAoJTQsICUwLCA4KSAgICBcblx0IgorICAgICAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgJSVtbTMsIDgoJTQsICUwLCA4KSAgICBcblx0IgorCisgICAgICAgICAgICAgICAgInB1bnBja2hidyAgICAgICAlJW1tMiwgJSVtbTYgICBcblx0IiAvKiBVMlYyIFUyVjIgVTNWMyBVM1YzKi8KKyAgICAgICAgICAgICAgICAibW92cSAgICAgOCglMSwgJTAsIDQpLCAlJW1tMCAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAlJW1tMCwgJSVtbTMgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgJSVtbTYsICUlbW0wICAgXG5cdCIgLyogWSBVMiBZIFYyIFkgVTIgWSBWMiovCisgICAgICAgICAgICAgICAgInB1bnBja2hidyAgICAgICAlJW1tNiwgJSVtbTMgICBcblx0IiAvKiBZIFUzIFkgVjMgWSBVMyBZIFYzKi8KKyAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICUlbW0wLCAxNiglNCwgJTAsIDgpICAgXG5cdCIKKyAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICUlbW0zLCAyNCglNCwgJTAsIDgpICAgXG5cdCIKKworICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgJSVtbTQsICUlbW02ICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICAxNiglMSwgJTAsIDQpLCAlJW1tMCAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAlJW1tMCwgJSVtbTMgICBcblx0IgorICAgICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgJSVtbTUsICUlbW00ICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICUlbW00LCAlJW1tMCAgIFxuXHQiIC8qIFkgVTQgWSBWNCBZIFU0IFkgVjQqLworICAgICAgICAgICAgICAgICJwdW5wY2toYncgICAgICAgJSVtbTQsICUlbW0zICAgXG5cdCIgLyogWSBVNSBZIFY1IFkgVTUgWSBWNSovCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAlJW1tMCwgMzIoJTQsICUwLCA4KSAgIFxuXHQiCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAlJW1tMywgNDAoJTQsICUwLCA4KSAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgICUlbW01LCAlJW1tNiAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgICAgMjQoJTEsICUwLCA0KSwgJSVtbTAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgJSVtbTAsICUlbW0zICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICUlbW02LCAlJW1tMCAgIFxuXHQiIC8qIFkgVTYgWSBWNiBZIFU2IFkgVjYqLworICAgICAgICAgICAgICAgICJwdW5wY2toYncgICAgICAgJSVtbTYsICUlbW0zICAgXG5cdCIgLyogWSBVNyBZIFY3IFkgVTcgWSBWNyovCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAlJW1tMCwgNDgoJTQsICUwLCA4KSAgIFxuXHQiCisgICAgICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAlJW1tMywgNTYoJTQsICUwLCA4KSAgIFxuXHQiCisKKyAgICAgICAgICAgICAgICA6ICIrciIgKHgpCisgICAgICAgICAgICAgICAgOiAiciIoeXApLCAiciIgKHVwKSwgInIiKHZwKSwgInIiKGQpCisgICAgICAgICAgICAgICAgOiJtZW1vcnkiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgeDx3OyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB4MiA9IHg8PDI7CisgICAgICAgICAgICBkWzgqeCswXSA9IHlwW3gyXTsKKyAgICAgICAgICAgIGRbOCp4KzFdID0gdXBbeF07CisgICAgICAgICAgICBkWzgqeCsyXSA9IHlwW3gyKzFdOworICAgICAgICAgICAgZFs4KngrM10gPSB2cFt4XTsKKyAgICAgICAgICAgIGRbOCp4KzRdID0geXBbeDIrMl07CisgICAgICAgICAgICBkWzgqeCs1XSA9IHVwW3hdOworICAgICAgICAgICAgZFs4KngrNl0gPSB5cFt4MiszXTsKKyAgICAgICAgICAgIGRbOCp4KzddID0gdnBbeF07CisgICAgICAgIH0KKyAgICB9CisgICAgX19hc21fXygKKyAgICAgICAgICAgIEVNTVMiICAgICAgIFxuXHQiCisgICAgICAgICAgICBTRkVOQ0UiICAgICBcblx0IgorICAgICAgICAgICAgOjo6ICJtZW1vcnkiCisgICAgICAgICk7Cit9CisjZW5kaWYgLyogIUNPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cgKi8KKworc3RhdGljIHZvaWQgUkVOQU1FKGV4dHJhY3RfZXZlbikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIHg4Nl9yZWcgY291bnQpCit7CisgICAgZHN0ICs9ICAgY291bnQ7CisgICAgc3JjICs9IDIqY291bnQ7CisgICAgY291bnQ9IC0gY291bnQ7CisKKyAgICBpZihjb3VudCA8PSAtMTYpIHsKKyAgICAgICAgY291bnQgKz0gMTU7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAicGNtcGVxdyAgICAgICAlJW1tNywgJSVtbTcgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAkOCwgJSVtbTcgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAtMzAoJTEsICUwLCAyKSwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAtMjIoJTEsICUwLCAyKSwgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAtMTQoJTEsICUwLCAyKSwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgLTYoJTEsICUwLCAyKSwgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlJW1tNywgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlJW1tNywgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlJW1tNywgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAlJW1tMSwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAlJW1tMywgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAlJW1tMCwtMTUoJTIsICUwKSAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAlJW1tMiwtIDcoJTIsICUwKSAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICQxNiwgJTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiIGpzIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6ICIrciIoY291bnQpCisgICAgICAgICAgICA6ICJyIihzcmMpLCAiciIoZHN0KQorICAgICAgICApOworICAgICAgICBjb3VudCAtPSAxNTsKKyAgICB9CisgICAgd2hpbGUoY291bnQ8MCkgeworICAgICAgICBkc3RbY291bnRdPSBzcmNbMipjb3VudF07CisgICAgICAgIGNvdW50Kys7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBSRU5BTUUoZXh0cmFjdF9vZGQpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCB4ODZfcmVnIGNvdW50KQoreworICAgIHNyYyArKzsKKyAgICBkc3QgKz0gICBjb3VudDsKKyAgICBzcmMgKz0gMipjb3VudDsKKyAgICBjb3VudD0gLSBjb3VudDsKKworICAgIGlmKGNvdW50IDwgLTE2KSB7CisgICAgICAgIGNvdW50ICs9IDE2OworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgInBjbXBlcXcgICAgICAgJSVtbTcsICUlbW03ICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgJDgsICUlbW03ICAgICAgICBcblx0IgorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgLTMyKCUxLCAlMCwgMiksICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgLTI0KCUxLCAlMCwgMiksICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgLTE2KCUxLCAlMCwgMiksICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgIC04KCUxLCAlMCwgMiksICUlbW0zICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJSVtbTcsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJSVtbTcsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJSVtbTcsICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJSVtbTcsICUlbW0zICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c3diICAgICAgJSVtbTEsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c3diICAgICAgJSVtbTMsICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgJSVtbTAsLTE2KCUyLCAlMCkgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgJSVtbTIsLSA4KCUyLCAlMCkgICBcblx0IgorICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAkMTYsICUwICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIiBqcyAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgOiAiK3IiKGNvdW50KQorICAgICAgICAgICAgOiAiciIoc3JjKSwgInIiKGRzdCkKKyAgICAgICAgKTsKKyAgICAgICAgY291bnQgLT0gMTY7CisgICAgfQorICAgIHdoaWxlKGNvdW50PDApIHsKKyAgICAgICAgZHN0W2NvdW50XT0gc3JjWzIqY291bnRdOworICAgICAgICBjb3VudCsrOworICAgIH0KK30KKworI2lmICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XCitzdGF0aWMgdm9pZCBSRU5BTUUoZXh0cmFjdF9ldmVuMikoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QwLCB1aW50OF90ICpkc3QxLCB4ODZfcmVnIGNvdW50KQoreworICAgIGRzdDArPSAgIGNvdW50OworICAgIGRzdDErPSAgIGNvdW50OworICAgIHNyYyArPSA0KmNvdW50OworICAgIGNvdW50PSAtIGNvdW50OworICAgIGlmKGNvdW50IDw9IC04KSB7CisgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAicGNtcGVxdyAgICAgICAlJW1tNywgJSVtbTcgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAkOCwgJSVtbTcgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAtMjgoJTEsICUwLCA0KSwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAtMjAoJTEsICUwLCA0KSwgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAtMTIoJTEsICUwLCA0KSwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgLTQoJTEsICUwLCA0KSwgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlJW1tNywgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlJW1tNywgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlJW1tNywgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAlJW1tMSwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAlJW1tMywgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAlJW1tMCwgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAlJW1tMiwgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAkOCwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAkOCwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAlJW1tNywgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAlJW1tMiwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAlJW1tMywgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAlJW1tMCwtIDcoJTMsICUwKSAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAlJW1tMSwtIDcoJTIsICUwKSAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAkOCwgJTAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiIGpzIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6ICIrciIoY291bnQpCisgICAgICAgICAgICA6ICJyIihzcmMpLCAiciIoZHN0MCksICJyIihkc3QxKQorICAgICAgICApOworICAgICAgICBjb3VudCAtPSA3OworICAgIH0KKyAgICB3aGlsZShjb3VudDwwKSB7CisgICAgICAgIGRzdDBbY291bnRdPSBzcmNbNCpjb3VudCswXTsKKyAgICAgICAgZHN0MVtjb3VudF09IHNyY1s0KmNvdW50KzJdOworICAgICAgICBjb3VudCsrOworICAgIH0KK30KKyNlbmRpZiAvKiAhQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVyAqLworCitzdGF0aWMgdm9pZCBSRU5BTUUoZXh0cmFjdF9ldmVuMmF2ZykoY29uc3QgdWludDhfdCAqc3JjMCwgY29uc3QgdWludDhfdCAqc3JjMSwgdWludDhfdCAqZHN0MCwgdWludDhfdCAqZHN0MSwgeDg2X3JlZyBjb3VudCkKK3sKKyAgICBkc3QwICs9ICAgY291bnQ7CisgICAgZHN0MSArPSAgIGNvdW50OworICAgIHNyYzAgKz0gNCpjb3VudDsKKyAgICBzcmMxICs9IDQqY291bnQ7CisgICAgY291bnQ9IC0gY291bnQ7CisjaWZkZWYgUEFWR0IKKyAgICBpZihjb3VudCA8PSAtOCkgeworICAgICAgICBjb3VudCArPSA3OworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgInBjbXBlcXcgICAgICAgICUlbW03LCAlJW1tNyAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAkOCwgJSVtbTcgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgLTI4KCUxLCAlMCwgNCksICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgIC0yMCglMSwgJTAsIDQpLCAlJW1tMSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAtMTIoJTEsICUwLCA0KSwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgIC00KCUxLCAlMCwgNCksICUlbW0zICAgICAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IiIC0yOCglMiwgJTAsIDQpLCAlJW1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBBVkdCIiAtMjAoJTIsICUwLCA0KSwgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQQVZHQiIgLTEyKCUyLCAlMCwgNCksICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IiIC0gNCglMiwgJTAsIDQpLCAlJW1tMyAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICAlJW1tNywgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAgJSVtbTcsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgICUlbW03LCAlJW1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYW5kICAgICAgICAgICAlJW1tNywgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgJSVtbTEsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c3diICAgICAgICUlbW0zLCAlJW1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAlJW1tMCwgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgJSVtbTIsICUlbW0zICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICQ4LCAlJW1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAkOCwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAgJSVtbTcsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgICUlbW03LCAlJW1tMyAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAlJW1tMiwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgJSVtbTMsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICUlbW0wLC0gNyglNCwgJTApICAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAlJW1tMSwtIDcoJTMsICUwKSAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgJDgsICUwICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIiBqcyAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgOiAiK3IiKGNvdW50KQorICAgICAgICAgICAgOiAiciIoc3JjMCksICJyIihzcmMxKSwgInIiKGRzdDApLCAiciIoZHN0MSkKKyAgICAgICAgKTsKKyAgICAgICAgY291bnQgLT0gNzsKKyAgICB9CisjZW5kaWYKKyAgICB3aGlsZShjb3VudDwwKSB7CisgICAgICAgIGRzdDBbY291bnRdPSAoc3JjMFs0KmNvdW50KzBdK3NyYzFbNCpjb3VudCswXSk+PjE7CisgICAgICAgIGRzdDFbY291bnRdPSAoc3JjMFs0KmNvdW50KzJdK3NyYzFbNCpjb3VudCsyXSk+PjE7CisgICAgICAgIGNvdW50Kys7CisgICAgfQorfQorCisjaWYgIUNPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cKK3N0YXRpYyB2b2lkIFJFTkFNRShleHRyYWN0X29kZDIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0MCwgdWludDhfdCAqZHN0MSwgeDg2X3JlZyBjb3VudCkKK3sKKyAgICBkc3QwKz0gICBjb3VudDsKKyAgICBkc3QxKz0gICBjb3VudDsKKyAgICBzcmMgKz0gNCpjb3VudDsKKyAgICBjb3VudD0gLSBjb3VudDsKKyAgICBpZihjb3VudCA8PSAtOCkgeworICAgICAgICBjb3VudCArPSA3OworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgInBjbXBlcXcgICAgICAgJSVtbTcsICUlbW03ICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgJDgsICUlbW03ICAgICAgICBcblx0IgorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgLTI4KCUxLCAlMCwgNCksICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgLTIwKCUxLCAlMCwgNCksICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgLTEyKCUxLCAlMCwgNCksICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgIC00KCUxLCAlMCwgNCksICUlbW0zICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgJDgsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgJDgsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgJDgsICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgJDgsICUlbW0zICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c3diICAgICAgJSVtbTEsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c3diICAgICAgJSVtbTMsICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgJSVtbTAsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgICAgJSVtbTIsICUlbW0zICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgJDgsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgJDgsICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJSVtbTcsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgJSVtbTcsICUlbW0zICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c3diICAgICAgJSVtbTIsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c3diICAgICAgJSVtbTMsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgJSVtbTAsLSA3KCUzLCAlMCkgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgJSVtbTEsLSA3KCUyLCAlMCkgICBcblx0IgorICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgJDgsICUwICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIiBqcyAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgOiAiK3IiKGNvdW50KQorICAgICAgICAgICAgOiAiciIoc3JjKSwgInIiKGRzdDApLCAiciIoZHN0MSkKKyAgICAgICAgKTsKKyAgICAgICAgY291bnQgLT0gNzsKKyAgICB9CisgICAgc3JjKys7CisgICAgd2hpbGUoY291bnQ8MCkgeworICAgICAgICBkc3QwW2NvdW50XT0gc3JjWzQqY291bnQrMF07CisgICAgICAgIGRzdDFbY291bnRdPSBzcmNbNCpjb3VudCsyXTsKKyAgICAgICAgY291bnQrKzsKKyAgICB9Cit9CisjZW5kaWYgLyogIUNPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cgKi8KKworc3RhdGljIHZvaWQgUkVOQU1FKGV4dHJhY3Rfb2RkMmF2ZykoY29uc3QgdWludDhfdCAqc3JjMCwgY29uc3QgdWludDhfdCAqc3JjMSwgdWludDhfdCAqZHN0MCwgdWludDhfdCAqZHN0MSwgeDg2X3JlZyBjb3VudCkKK3sKKyAgICBkc3QwICs9ICAgY291bnQ7CisgICAgZHN0MSArPSAgIGNvdW50OworICAgIHNyYzAgKz0gNCpjb3VudDsKKyAgICBzcmMxICs9IDQqY291bnQ7CisgICAgY291bnQ9IC0gY291bnQ7CisjaWZkZWYgUEFWR0IKKyAgICBpZihjb3VudCA8PSAtOCkgeworICAgICAgICBjb3VudCArPSA3OworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgInBjbXBlcXcgICAgICAgICUlbW03LCAlJW1tNyAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAkOCwgJSVtbTcgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgLTI4KCUxLCAlMCwgNCksICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgIC0yMCglMSwgJTAsIDQpLCAlJW1tMSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAtMTIoJTEsICUwLCA0KSwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgIC00KCUxLCAlMCwgNCksICUlbW0zICAgICAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IiIC0yOCglMiwgJTAsIDQpLCAlJW1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBBVkdCIiAtMjAoJTIsICUwLCA0KSwgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQQVZHQiIgLTEyKCUyLCAlMCwgNCksICUlbW0yICAgICAgICBcblx0IgorICAgICAgICAgICAgUEFWR0IiIC0gNCglMiwgJTAsIDQpLCAlJW1tMyAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAkOCwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAgJDgsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICQ4LCAlJW1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAkOCwgJSVtbTMgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgJSVtbTEsICUlbW0wICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c3diICAgICAgICUlbW0zLCAlJW1tMiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAlJW1tMCwgJSVtbTEgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAgICAgJSVtbTIsICUlbW0zICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICQ4LCAlJW1tMCAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAkOCwgJSVtbTIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFuZCAgICAgICAgICAgJSVtbTcsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhbmQgICAgICAgICAgICUlbW03LCAlJW1tMyAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAlJW1tMiwgJSVtbTAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgJSVtbTMsICUlbW0xICAgICAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICUlbW0wLC0gNyglNCwgJTApICAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAlJW1tMSwtIDcoJTMsICUwKSAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgJDgsICUwICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIiBqcyAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgOiAiK3IiKGNvdW50KQorICAgICAgICAgICAgOiAiciIoc3JjMCksICJyIihzcmMxKSwgInIiKGRzdDApLCAiciIoZHN0MSkKKyAgICAgICAgKTsKKyAgICAgICAgY291bnQgLT0gNzsKKyAgICB9CisjZW5kaWYKKyAgICBzcmMwKys7CisgICAgc3JjMSsrOworICAgIHdoaWxlKGNvdW50PDApIHsKKyAgICAgICAgZHN0MFtjb3VudF09IChzcmMwWzQqY291bnQrMF0rc3JjMVs0KmNvdW50KzBdKT4+MTsKKyAgICAgICAgZHN0MVtjb3VudF09IChzcmMwWzQqY291bnQrMl0rc3JjMVs0KmNvdW50KzJdKT4+MTsKKyAgICAgICAgY291bnQrKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFJFTkFNRSh5dXl2dG95dXY0MjApKHVpbnQ4X3QgKnlkc3QsIHVpbnQ4X3QgKnVkc3QsIHVpbnQ4X3QgKnZkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSkKK3sKKyAgICBpbnQgeTsKKyAgICBjb25zdCBpbnQgY2hyb21XaWR0aCA9IEZGX0NFSUxfUlNISUZUKHdpZHRoLCAxKTsKKworICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrKSB7CisgICAgICAgIFJFTkFNRShleHRyYWN0X2V2ZW4pKHNyYywgeWRzdCwgd2lkdGgpOworICAgICAgICBpZih5JjEpIHsKKyAgICAgICAgICAgIFJFTkFNRShleHRyYWN0X29kZDJhdmcpKHNyYy1zcmNTdHJpZGUsIHNyYywgdWRzdCwgdmRzdCwgY2hyb21XaWR0aCk7CisgICAgICAgICAgICB1ZHN0Kz0gY2hyb21TdHJpZGU7CisgICAgICAgICAgICB2ZHN0Kz0gY2hyb21TdHJpZGU7CisgICAgICAgIH0KKworICAgICAgICBzcmMgKz0gc3JjU3RyaWRlOworICAgICAgICB5ZHN0Kz0gbHVtU3RyaWRlOworICAgIH0KKyAgICBfX2FzbV9fKAorICAgICAgICAgICAgRU1NUyIgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFNGRU5DRSIgICAgIFxuXHQiCisgICAgICAgICAgICA6OjogIm1lbW9yeSIKKyAgICAgICAgKTsKK30KKworI2lmICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XCitzdGF0aWMgdm9pZCBSRU5BTUUoeXV5dnRveXV2NDIyKSh1aW50OF90ICp5ZHN0LCB1aW50OF90ICp1ZHN0LCB1aW50OF90ICp2ZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHVtU3RyaWRlLCBpbnQgY2hyb21TdHJpZGUsIGludCBzcmNTdHJpZGUpCit7CisgICAgaW50IHk7CisgICAgY29uc3QgaW50IGNocm9tV2lkdGggPSBGRl9DRUlMX1JTSElGVCh3aWR0aCwgMSk7CisKKyAgICBmb3IgKHk9MDsgeTxoZWlnaHQ7IHkrKykgeworICAgICAgICBSRU5BTUUoZXh0cmFjdF9ldmVuKShzcmMsIHlkc3QsIHdpZHRoKTsKKyAgICAgICAgUkVOQU1FKGV4dHJhY3Rfb2RkMikoc3JjLCB1ZHN0LCB2ZHN0LCBjaHJvbVdpZHRoKTsKKworICAgICAgICBzcmMgKz0gc3JjU3RyaWRlOworICAgICAgICB5ZHN0Kz0gbHVtU3RyaWRlOworICAgICAgICB1ZHN0Kz0gY2hyb21TdHJpZGU7CisgICAgICAgIHZkc3QrPSBjaHJvbVN0cmlkZTsKKyAgICB9CisgICAgX19hc21fXygKKyAgICAgICAgICAgIEVNTVMiICAgICAgIFxuXHQiCisgICAgICAgICAgICBTRkVOQ0UiICAgICBcblx0IgorICAgICAgICAgICAgOjo6ICJtZW1vcnkiCisgICAgICAgICk7Cit9CisjZW5kaWYgLyogIUNPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cgKi8KKworc3RhdGljIHZvaWQgUkVOQU1FKHV5dnl0b3l1djQyMCkodWludDhfdCAqeWRzdCwgdWludDhfdCAqdWRzdCwgdWludDhfdCAqdmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bVN0cmlkZSwgaW50IGNocm9tU3RyaWRlLCBpbnQgc3JjU3RyaWRlKQoreworICAgIGludCB5OworICAgIGNvbnN0IGludCBjaHJvbVdpZHRoID0gRkZfQ0VJTF9SU0hJRlQod2lkdGgsIDEpOworCisgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgUkVOQU1FKGV4dHJhY3Rfb2RkKShzcmMsIHlkc3QsIHdpZHRoKTsKKyAgICAgICAgaWYoeSYxKSB7CisgICAgICAgICAgICBSRU5BTUUoZXh0cmFjdF9ldmVuMmF2Zykoc3JjLXNyY1N0cmlkZSwgc3JjLCB1ZHN0LCB2ZHN0LCBjaHJvbVdpZHRoKTsKKyAgICAgICAgICAgIHVkc3QrPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgICAgIHZkc3QrPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgfQorCisgICAgICAgIHNyYyArPSBzcmNTdHJpZGU7CisgICAgICAgIHlkc3QrPSBsdW1TdHJpZGU7CisgICAgfQorICAgIF9fYXNtX18oCisgICAgICAgICAgICBFTU1TIiAgICAgICBcblx0IgorICAgICAgICAgICAgU0ZFTkNFIiAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6OiAibWVtb3J5IgorICAgICAgICApOworfQorCisjaWYgIUNPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cKK3N0YXRpYyB2b2lkIFJFTkFNRSh1eXZ5dG95dXY0MjIpKHVpbnQ4X3QgKnlkc3QsIHVpbnQ4X3QgKnVkc3QsIHVpbnQ4X3QgKnZkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsdW1TdHJpZGUsIGludCBjaHJvbVN0cmlkZSwgaW50IHNyY1N0cmlkZSkKK3sKKyAgICBpbnQgeTsKKyAgICBjb25zdCBpbnQgY2hyb21XaWR0aCA9IEZGX0NFSUxfUlNISUZUKHdpZHRoLCAxKTsKKworICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrKSB7CisgICAgICAgIFJFTkFNRShleHRyYWN0X29kZCkoc3JjLCB5ZHN0LCB3aWR0aCk7CisgICAgICAgIFJFTkFNRShleHRyYWN0X2V2ZW4yKShzcmMsIHVkc3QsIHZkc3QsIGNocm9tV2lkdGgpOworCisgICAgICAgIHNyYyArPSBzcmNTdHJpZGU7CisgICAgICAgIHlkc3QrPSBsdW1TdHJpZGU7CisgICAgICAgIHVkc3QrPSBjaHJvbVN0cmlkZTsKKyAgICAgICAgdmRzdCs9IGNocm9tU3RyaWRlOworICAgIH0KKyAgICBfX2FzbV9fKAorICAgICAgICAgICAgRU1NUyIgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFNGRU5DRSIgICAgIFxuXHQiCisgICAgICAgICAgICA6OjogIm1lbW9yeSIKKyAgICAgICAgKTsKK30KKyNlbmRpZiAvKiAhQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVyAqLworI2VuZGlmIC8qICFDT01QSUxFX1RFTVBMQVRFX1NTRTIgKi8KKworc3RhdGljIGF2X2NvbGQgdm9pZCBSRU5BTUUocmdiMnJnYl9pbml0KSh2b2lkKQoreworI2lmICFDT01QSUxFX1RFTVBMQVRFX1NTRTIKKyNpZiAhQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVworICAgIHJnYjE1dG8xNiAgICAgICAgICA9IFJFTkFNRShyZ2IxNXRvMTYpOworICAgIHJnYjE1dG9iZ3IyNCAgICAgICA9IFJFTkFNRShyZ2IxNXRvYmdyMjQpOworICAgIHJnYjE1dG8zMiAgICAgICAgICA9IFJFTkFNRShyZ2IxNXRvMzIpOworICAgIHJnYjE2dG9iZ3IyNCAgICAgICA9IFJFTkFNRShyZ2IxNnRvYmdyMjQpOworICAgIHJnYjE2dG8zMiAgICAgICAgICA9IFJFTkFNRShyZ2IxNnRvMzIpOworICAgIHJnYjE2dG8xNSAgICAgICAgICA9IFJFTkFNRShyZ2IxNnRvMTUpOworICAgIHJnYjI0dG9iZ3IxNiAgICAgICA9IFJFTkFNRShyZ2IyNHRvYmdyMTYpOworICAgIHJnYjI0dG9iZ3IxNSAgICAgICA9IFJFTkFNRShyZ2IyNHRvYmdyMTUpOworICAgIHJnYjI0dG9iZ3IzMiAgICAgICA9IFJFTkFNRShyZ2IyNHRvYmdyMzIpOworICAgIHJnYjMydG8xNiAgICAgICAgICA9IFJFTkFNRShyZ2IzMnRvMTYpOworICAgIHJnYjMydG8xNSAgICAgICAgICA9IFJFTkFNRShyZ2IzMnRvMTUpOworICAgIHJnYjMydG9iZ3IyNCAgICAgICA9IFJFTkFNRShyZ2IzMnRvYmdyMjQpOworICAgIHJnYjI0dG8xNSAgICAgICAgICA9IFJFTkFNRShyZ2IyNHRvMTUpOworICAgIHJnYjI0dG8xNiAgICAgICAgICA9IFJFTkFNRShyZ2IyNHRvMTYpOworICAgIHJnYjI0dG9iZ3IyNCAgICAgICA9IFJFTkFNRShyZ2IyNHRvYmdyMjQpOworICAgIHNodWZmbGVfYnl0ZXNfMjEwMyA9IFJFTkFNRShzaHVmZmxlX2J5dGVzXzIxMDMpOworICAgIHJnYjMydG9iZ3IxNiAgICAgICA9IFJFTkFNRShyZ2IzMnRvYmdyMTYpOworICAgIHJnYjMydG9iZ3IxNSAgICAgICA9IFJFTkFNRShyZ2IzMnRvYmdyMTUpOworICAgIHl2MTJ0b3l1eTIgICAgICAgICA9IFJFTkFNRSh5djEydG95dXkyKTsKKyAgICB5djEydG91eXZ5ICAgICAgICAgPSBSRU5BTUUoeXYxMnRvdXl2eSk7CisgICAgeXV2NDIycHRveXV5MiAgICAgID0gUkVOQU1FKHl1djQyMnB0b3l1eTIpOworICAgIHl1djQyMnB0b3V5dnkgICAgICA9IFJFTkFNRSh5dXY0MjJwdG91eXZ5KTsKKyAgICB5dXkydG95djEyICAgICAgICAgPSBSRU5BTUUoeXV5MnRveXYxMik7CisgICAgdnU5X3RvX3Z1MTIgICAgICAgID0gUkVOQU1FKHZ1OV90b192dTEyKTsKKyAgICB5dnU5X3RvX3l1eTIgICAgICAgPSBSRU5BTUUoeXZ1OV90b195dXkyKTsKKyAgICB1eXZ5dG95dXY0MjIgICAgICAgPSBSRU5BTUUodXl2eXRveXV2NDIyKTsKKyAgICB5dXl2dG95dXY0MjIgICAgICAgPSBSRU5BTUUoeXV5dnRveXV2NDIyKTsKKyNlbmRpZiAvKiAhQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVyAqLworCisjaWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgfHwgQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVworICAgIHBsYW5hcjJ4ICAgICAgICAgICA9IFJFTkFNRShwbGFuYXIyeCk7CisjZW5kaWYgLyogQ09NUElMRV9URU1QTEFURV9NTVhFWFQgfHwgQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVyAqLworI2lmIEhBVkVfN1JFR1MKKyAgICBmZl9yZ2IyNHRveXYxMiAgICAgPSBSRU5BTUUocmdiMjR0b3l2MTIpOworI2VuZGlmIC8qIEhBVkVfN1JFR1MgKi8KKworICAgIHl1eXZ0b3l1djQyMCAgICAgICA9IFJFTkFNRSh5dXl2dG95dXY0MjApOworICAgIHV5dnl0b3l1djQyMCAgICAgICA9IFJFTkFNRSh1eXZ5dG95dXY0MjApOworI2VuZGlmIC8qICFDT01QSUxFX1RFTVBMQVRFX1NTRTIgKi8KKworI2lmICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XICYmICFDT01QSUxFX1RFTVBMQVRFX0FWWAorICAgIGludGVybGVhdmVCeXRlcyAgICA9IFJFTkFNRShpbnRlcmxlYXZlQnl0ZXMpOworI2VuZGlmIC8qICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XICYmICFDT01QSUxFX1RFTVBMQVRFX0FWWCAqLworI2lmICFDT01QSUxFX1RFTVBMQVRFX0FWWCB8fCBIQVZFX0FWWF9FWFRFUk5BTAorI2lmICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XICYmIChBUkNIX1g4Nl8zMiB8fCBDT01QSUxFX1RFTVBMQVRFX1NTRTIpICYmIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUID09IENPTVBJTEVfVEVNUExBVEVfU1NFMiAmJiBIQVZFX1lBU00KKyAgICBkZWludGVybGVhdmVCeXRlcyAgPSBSRU5BTUUoZGVpbnRlcmxlYXZlQnl0ZXMpOworI2VuZGlmCisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni9zY2FsZS5hc20gYi9mZm1wZWcvbGlic3dzY2FsZS94ODYvc2NhbGUuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZjkyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS94ODYvc2NhbGUuYXNtCkBAIC0wLDAgKzEsNDMxIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiB4ODYtb3B0aW1pemVkIGhvcml6b250YWwgbGluZSBzY2FsaW5nIGZ1bmN0aW9ucworOyogQ29weXJpZ2h0IChjKSAyMDExIFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorCittYXhfMTliaXRfaW50OiB0aW1lcyA0IGRkIDB4N2ZmZmYKK21heF8xOWJpdF9mbHQ6IHRpbWVzIDQgZGQgNTI0Mjg3LjAKK21pbnNob3J0OiAgICAgIHRpbWVzIDggZHcgMHg4MDAwCit1bmljb2VmZjogICAgICB0aW1lcyA0IGRkIDB4MjAwMDAwMDAKKworU0VDVElPTiAudGV4dAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgaG9yaXpvbnRhbCBsaW5lIHNjYWxpbmcKKzsKKzsgdm9pZCBoc2NhbGU8c291cmNlX3dpZHRoPnRvPGludGVybWVkaWF0ZV9uYml0cz5fPGZpbHRlclNpemU+XzxvcHQ+Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTd3NDb250ZXh0ICpjLCBpbnR7MTYsMzJ9X3QgKmRzdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RXLCBjb25zdCB1aW50ezgsMTZ9X3QgKnNyYywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmZpbHRlciwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmZpbHRlclBvcywgaW50IGZpbHRlclNpemUpOworOworOyBTY2FsZSBvbmUgaG9yaXpvbnRhbCBsaW5lLiBJbnB1dCBpcyBlaXRoZXIgOC1iaXRzIHdpZHRoIG9yIDE2LWJpdHMgd2lkdGgKKzsgKCRzb3VyY2Vfd2lkdGggY2FuIGJlIGVpdGhlciA4LCA5LCAxMCBvciAxNiwgZGlmZmVyZW5jZSBpcyB3aGV0aGVyIHdlIGhhdmUgdG8KKzsgZG93bnNjYWxlIGJlZm9yZSBtdWx0aXBseWluZykuIEZpbHRlciBpcyAxNC1iaXRzLiBPdXRwdXQgaXMgZWl0aGVyIDE1Yml0cworOyAoaW4gaW50MTZfdCkgb3IgMTliaXRzIChpbiBpbnQzMl90KSwgYXMgZ2l2ZW4gaW4gJGludGVybWVkaWF0ZV9uYml0cy4gRWFjaAorOyBvdXRwdXQgcGl4ZWwgaXMgZ2VuZXJhdGVkIGZyb20gJGZpbHRlclNpemUgaW5wdXQgcGl4ZWxzLCB0aGUgcG9zaXRpb24gb2YKKzsgdGhlIGZpcnN0IHBpeGVsIGlzIGdpdmVuIGluIGZpbHRlclBvc1tuT3V0cHV0UGl4ZWxdLgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsgU0NBTEVfRlVOQyBzb3VyY2Vfd2lkdGgsIGludGVybWVkaWF0ZV9uYml0cywgZmlsdGVyc2l6ZSwgZmlsdGVyc3VmZml4LCBuX2FyZ3MsIG5feG1tCislbWFjcm8gU0NBTEVfRlVOQyA2CislaWZuaWRuICUzLCBYCitjZ2xvYmFsIGhzY2FsZSUxdG8lMl8lNCwgJTUsIDcsICU2LCBwb3MwLCBkc3QsIHcsIHNyYywgZmlsdGVyLCBmbHRwb3MsIHBvczEKKyVlbHNlCitjZ2xvYmFsIGhzY2FsZSUxdG8lMl8lNCwgJTUsIDEwLCAlNiwgcG9zMCwgZHN0LCB3LCBzcmNtZW0sIGZpbHRlciwgZmx0cG9zLCBmbHRzaXplCislZW5kaWYKKyVpZiBBUkNIX1g4Nl82NAorICAgIG1vdnN4ZCAgICAgICAgd3EsIHdkCislZGVmaW5lIG1vdjMyIG1vdnN4ZAorJWVsc2UgOyB4ODYtMzIKKyVkZWZpbmUgbW92MzIgbW92CislZW5kaWYgOyB4ODYtNjQKKyVpZiAlMiA9PSAxOQorJWlmIG1tc2l6ZSA9PSA4IDsgbW14CisgICAgbW92YSAgICAgICAgICBtMiwgW21heF8xOWJpdF9pbnRdCislZWxpZiBjcHVmbGFnKHNzZTQpCisgICAgbW92YSAgICAgICAgICBtMiwgW21heF8xOWJpdF9pbnRdCislZWxzZSA7IHNzc2UzL3NzZTIKKyAgICBtb3ZhICAgICAgICAgIG0yLCBbbWF4XzE5Yml0X2ZsdF0KKyVlbmRpZiA7IG1teC9zc2UyL3Nzc2UzL3NzZTQKKyVlbmRpZiA7ICUyID09IDE5CislaWYgJTEgPT0gMTYKKyAgICBtb3ZhICAgICAgICAgIG02LCBbbWluc2hvcnRdCisgICAgbW92YSAgICAgICAgICBtNywgW3VuaWNvZWZmXQorJWVsaWYgJTEgPT0gOAorICAgIHB4b3IgICAgICAgICAgbTMsIG0zCislZW5kaWYgOyAlMSA9PSA4LzE2CisKKyVpZiAlMSA9PSA4CislZGVmaW5lIG1vdmxoIG1vdmQKKyVkZWZpbmUgbW92YmggbW92aAorJWRlZmluZSBzcmNtdWwgMQorJWVsc2UgOyAlMSA9PSA5LTE2CislZGVmaW5lIG1vdmxoIG1vdnEKKyVkZWZpbmUgbW92YmggbW92dQorJWRlZmluZSBzcmNtdWwgMgorJWVuZGlmIDsgJTEgPT0gOC85LTE2CisKKyVpZm5pZG4gJTMsIFgKKworICAgIDsgc2V0dXAgbG9vcAorJWlmICUzID09IDgKKyAgICBzaGwgICAgICAgICAgIHdxLCAxICAgICAgICAgICAgICAgICAgICAgICAgIDsgdGhpcyBhbGxvd3MgKjE2IChpLmUuIG5vdyAqOCkgaW4gbGVhIGluc3RydWN0aW9ucyBmb3IgdGhlIDgtdGFwIGZpbHRlcgorJWRlZmluZSB3c2hyIDEKKyVlbHNlIDsgJTMgPT0gNAorJWRlZmluZSB3c2hyIDAKKyVlbmRpZiA7ICUzID09IDgKKyAgICBsZWEgICAgICBmaWx0ZXJxLCBbZmlsdGVycSt3cSo4XQorJWlmICUyID09IDE1CisgICAgbGVhICAgICAgICAgZHN0cSwgW2RzdHErd3EqKDI+PndzaHIpXQorJWVsc2UgOyAlMiA9PSAxOQorICAgIGxlYSAgICAgICAgIGRzdHEsIFtkc3RxK3dxKig0Pj53c2hyKV0KKyVlbmRpZiA7ICUyID09IDE1LzE5CisgICAgbGVhICAgICAgZmx0cG9zcSwgW2ZsdHBvc3Erd3EqKDQ+PndzaHIpXQorICAgIG5lZyAgICAgICAgICAgd3EKKworLmxvb3A6CislaWYgJTMgPT0gNCA7IGZpbHRlclNpemUgPT0gNCBzY2FsaW5nCisgICAgOyBsb2FkIDJ4NCBvciA0eDQgc291cmNlIHBpeGVscyBpbnRvIG0wL20xCisgICAgbW92MzIgICAgICBwb3MwcSwgZHdvcmQgW2ZsdHBvc3Erd3EqNCsgMF0gICA7IGZpbHRlclBvc1swXQorICAgIG1vdjMyICAgICAgcG9zMXEsIGR3b3JkIFtmbHRwb3NxK3dxKjQrIDRdICAgOyBmaWx0ZXJQb3NbMV0KKyAgICBtb3ZsaCAgICAgICAgIG0wLCBbc3JjcStwb3MwcSpzcmNtdWxdICAgICAgIDsgc3JjW2ZpbHRlclBvc1swXSArIHswLDEsMiwzfV0KKyVpZiBtbXNpemUgPT0gOAorICAgIG1vdmxoICAgICAgICAgbTEsIFtzcmNxK3BvczFxKnNyY211bF0gICAgICAgOyBzcmNbZmlsdGVyUG9zWzFdICsgezAsMSwyLDN9XQorJWVsc2UgOyBtbXNpemUgPT0gMTYKKyVpZiAlMSA+IDgKKyAgICBtb3ZocHMgICAgICAgIG0wLCBbc3JjcStwb3MxcSpzcmNtdWxdICAgICAgIDsgc3JjW2ZpbHRlclBvc1sxXSArIHswLDEsMiwzfV0KKyVlbHNlIDsgJTEgPT0gOAorICAgIG1vdmQgICAgICAgICAgbTQsIFtzcmNxK3BvczFxKnNyY211bF0gICAgICAgOyBzcmNbZmlsdGVyUG9zWzFdICsgezAsMSwyLDN9XQorJWVuZGlmCisgICAgbW92MzIgICAgICBwb3MwcSwgZHdvcmQgW2ZsdHBvc3Erd3EqNCsgOF0gICA7IGZpbHRlclBvc1syXQorICAgIG1vdjMyICAgICAgcG9zMXEsIGR3b3JkIFtmbHRwb3NxK3dxKjQrMTJdICAgOyBmaWx0ZXJQb3NbM10KKyAgICBtb3ZsaCAgICAgICAgIG0xLCBbc3JjcStwb3MwcSpzcmNtdWxdICAgICAgIDsgc3JjW2ZpbHRlclBvc1syXSArIHswLDEsMiwzfV0KKyVpZiAlMSA+IDgKKyAgICBtb3ZocHMgICAgICAgIG0xLCBbc3JjcStwb3MxcSpzcmNtdWxdICAgICAgIDsgc3JjW2ZpbHRlclBvc1szXSArIHswLDEsMiwzfV0KKyVlbHNlIDsgJTEgPT0gOAorICAgIG1vdmQgICAgICAgICAgbTUsIFtzcmNxK3BvczFxKnNyY211bF0gICAgICAgOyBzcmNbZmlsdGVyUG9zWzNdICsgezAsMSwyLDN9XQorICAgIHB1bnBja2xkcSAgICAgbTAsIG00CisgICAgcHVucGNrbGRxICAgICBtMSwgbTUKKyVlbmRpZiA7ICUxID09IDgKKyVlbmRpZiA7IG1tc2l6ZSA9PSA4LzE2CislaWYgJTEgPT0gOAorICAgIHB1bnBja2xidyAgICAgbTAsIG0zICAgICAgICAgICAgICAgICAgICAgICAgOyBieXRlIC0+IHdvcmQKKyAgICBwdW5wY2tsYncgICAgIG0xLCBtMyAgICAgICAgICAgICAgICAgICAgICAgIDsgYnl0ZSAtPiB3b3JkCislZW5kaWYgOyAlMSA9PSA4CisKKyAgICA7IG11bHRpcGx5IHdpdGggZmlsdGVyIGNvZWZmaWNpZW50cworJWlmICUxID09IDE2IDsgcG1hZGR3ZCBuZWVkcyBzaWduZWQgYWRkcywgc28gdGhpcyBtb3ZlcyB1bnNpZ25lZCAtPiBzaWduZWQsIHdlJ2xsCisgICAgICAgICAgICAgOyBhZGQgYmFjayAweDgwMDAgKiBzdW0oY29lZmZzKSBhZnRlciB0aGUgaG9yaXpvbnRhbCBhZGQKKyAgICBwc3VidyAgICAgICAgIG0wLCBtNgorICAgIHBzdWJ3ICAgICAgICAgbTEsIG02CislZW5kaWYgOyAlMSA9PSAxNgorICAgIHBtYWRkd2QgICAgICAgbTAsIFtmaWx0ZXJxK3dxKjgrbW1zaXplKjBdICAgOyAqPSBmaWx0ZXJbezAsMSwuLiw2LDd9XQorICAgIHBtYWRkd2QgICAgICAgbTEsIFtmaWx0ZXJxK3dxKjgrbW1zaXplKjFdICAgOyAqPSBmaWx0ZXJbezgsOSwuLiwxNCwxNX1dCisKKyAgICA7IGFkZCB1cCBob3Jpem9udGFsbHkgKDQgc3JjcGl4ICogNCBjb2VmZmljaWVudHMgLT4gMSBkc3RwaXgpCislaWYgbW1zaXplID09IDggOyBtbXgKKyAgICBtb3ZxICAgICAgICAgIG00LCBtMAorICAgIHB1bnBja2xkcSAgICAgbTAsIG0xCisgICAgcHVucGNraGRxICAgICBtNCwgbTEKKyAgICBwYWRkZCAgICAgICAgIG0wLCBtNAorJWVsaWYgbm90Y3B1ZmxhZyhzc3NlMykgOyBzc2UyCisgICAgbW92YSAgICAgICAgICBtNCwgbTAKKyAgICBzaHVmcHMgICAgICAgIG0wLCBtMSwgMTAwMDEwMDBiCisgICAgc2h1ZnBzICAgICAgICBtNCwgbTEsIDExMDExMTAxYgorICAgIHBhZGRkICAgICAgICAgbTAsIG00CislZWxzZSA7IHNzc2UzL3NzZTQKKyAgICBwaGFkZGQgICAgICAgIG0wLCBtMSAgICAgICAgICAgICAgICAgICAgICAgIDsgZmlsdGVyW3sgMCwgMSwgMiwgM31dKnNyY1tmaWx0ZXJQb3NbMF0rezAsMSwyLDN9XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZmlsdGVyW3sgNCwgNSwgNiwgN31dKnNyY1tmaWx0ZXJQb3NbMV0rezAsMSwyLDN9XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZmlsdGVyW3sgOCwgOSwxMCwxMX1dKnNyY1tmaWx0ZXJQb3NbMl0rezAsMSwyLDN9XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZmlsdGVyW3sxMiwxMywxNCwxNX1dKnNyY1tmaWx0ZXJQb3NbM10rezAsMSwyLDN9XQorJWVuZGlmIDsgbW14L3NzZTIvc3NzZTMvc3NlNAorJWVsc2UgOyAlMyA9PSA4LCBpLmUuIGZpbHRlclNpemUgPT0gOCBzY2FsaW5nCisgICAgOyBsb2FkIDJ4OCBvciA0eDggc291cmNlIHBpeGVscyBpbnRvIG0wLCBtMSwgbTQgYW5kIG01CisgICAgbW92MzIgICAgICBwb3MwcSwgZHdvcmQgW2ZsdHBvc3Erd3EqMiswXSAgICA7IGZpbHRlclBvc1swXQorICAgIG1vdjMyICAgICAgcG9zMXEsIGR3b3JkIFtmbHRwb3NxK3dxKjIrNF0gICAgOyBmaWx0ZXJQb3NbMV0KKyAgICBtb3ZiaCAgICAgICAgIG0wLCBbc3JjcSsgcG9zMHEgICAqc3JjbXVsXSAgIDsgc3JjW2ZpbHRlclBvc1swXSArIHswLDEsMiwzLDQsNSw2LDd9XQorJWlmIG1tc2l6ZSA9PSA4CisgICAgbW92YmggICAgICAgICBtMSwgW3NyY3ErKHBvczBxKzQpKnNyY211bF0gICA7IHNyY1tmaWx0ZXJQb3NbMF0gKyB7NCw1LDYsN31dCisgICAgbW92YmggICAgICAgICBtNCwgW3NyY3ErIHBvczFxICAgKnNyY211bF0gICA7IHNyY1tmaWx0ZXJQb3NbMV0gKyB7MCwxLDIsM31dCisgICAgbW92YmggICAgICAgICBtNSwgW3NyY3ErKHBvczFxKzQpKnNyY211bF0gICA7IHNyY1tmaWx0ZXJQb3NbMV0gKyB7NCw1LDYsN31dCislZWxzZSA7IG1tc2l6ZSA9PSAxNgorICAgIG1vdmJoICAgICAgICAgbTEsIFtzcmNxKyBwb3MxcSAgICpzcmNtdWxdICAgOyBzcmNbZmlsdGVyUG9zWzFdICsgezAsMSwyLDMsNCw1LDYsN31dCisgICAgbW92MzIgICAgICBwb3MwcSwgZHdvcmQgW2ZsdHBvc3Erd3EqMis4XSAgICA7IGZpbHRlclBvc1syXQorICAgIG1vdjMyICAgICAgcG9zMXEsIGR3b3JkIFtmbHRwb3NxK3dxKjIrMTJdICAgOyBmaWx0ZXJQb3NbM10KKyAgICBtb3ZiaCAgICAgICAgIG00LCBbc3JjcSsgcG9zMHEgICAqc3JjbXVsXSAgIDsgc3JjW2ZpbHRlclBvc1syXSArIHswLDEsMiwzLDQsNSw2LDd9XQorICAgIG1vdmJoICAgICAgICAgbTUsIFtzcmNxKyBwb3MxcSAgICpzcmNtdWxdICAgOyBzcmNbZmlsdGVyUG9zWzNdICsgezAsMSwyLDMsNCw1LDYsN31dCislZW5kaWYgOyBtbXNpemUgPT0gOC8xNgorJWlmICUxID09IDgKKyAgICBwdW5wY2tsYncgICAgIG0wLCBtMyAgICAgICAgICAgICAgICAgICAgICAgIDsgYnl0ZSAtPiB3b3JkCisgICAgcHVucGNrbGJ3ICAgICBtMSwgbTMgICAgICAgICAgICAgICAgICAgICAgICA7IGJ5dGUgLT4gd29yZAorICAgIHB1bnBja2xidyAgICAgbTQsIG0zICAgICAgICAgICAgICAgICAgICAgICAgOyBieXRlIC0+IHdvcmQKKyAgICBwdW5wY2tsYncgICAgIG01LCBtMyAgICAgICAgICAgICAgICAgICAgICAgIDsgYnl0ZSAtPiB3b3JkCislZW5kaWYgOyAlMSA9PSA4CisKKyAgICA7IG11bHRpcGx5CislaWYgJTEgPT0gMTYgOyBwbWFkZHdkIG5lZWRzIHNpZ25lZCBhZGRzLCBzbyB0aGlzIG1vdmVzIHVuc2lnbmVkIC0+IHNpZ25lZCwgd2UnbGwKKyAgICAgICAgICAgICA7IGFkZCBiYWNrIDB4ODAwMCAqIHN1bShjb2VmZnMpIGFmdGVyIHRoZSBob3Jpem9udGFsIGFkZAorICAgIHBzdWJ3ICAgICAgICAgbTAsIG02CisgICAgcHN1YncgICAgICAgICBtMSwgbTYKKyAgICBwc3VidyAgICAgICAgIG00LCBtNgorICAgIHBzdWJ3ICAgICAgICAgbTUsIG02CislZW5kaWYgOyAlMSA9PSAxNgorICAgIHBtYWRkd2QgICAgICAgbTAsIFtmaWx0ZXJxK3dxKjgrbW1zaXplKjBdICAgOyAqPSBmaWx0ZXJbezAsMSwuLiw2LDd9XQorICAgIHBtYWRkd2QgICAgICAgbTEsIFtmaWx0ZXJxK3dxKjgrbW1zaXplKjFdICAgOyAqPSBmaWx0ZXJbezgsOSwuLiwxNCwxNX1dCisgICAgcG1hZGR3ZCAgICAgICBtNCwgW2ZpbHRlcnErd3EqOCttbXNpemUqMl0gICA7ICo9IGZpbHRlclt7MTYsMTcsLi4sMjIsMjN9XQorICAgIHBtYWRkd2QgICAgICAgbTUsIFtmaWx0ZXJxK3dxKjgrbW1zaXplKjNdICAgOyAqPSBmaWx0ZXJbezI0LDI1LC4uLDMwLDMxfV0KKworICAgIDsgYWRkIHVwIGhvcml6b250YWxseSAoOCBzcmNwaXggKiA4IGNvZWZmaWNpZW50cyAtPiAxIGRzdHBpeCkKKyVpZiBtbXNpemUgPT0gOAorICAgIHBhZGRkICAgICAgICAgbTAsIG0xCisgICAgcGFkZGQgICAgICAgICBtNCwgbTUKKyAgICBtb3ZxICAgICAgICAgIG0xLCBtMAorICAgIHB1bnBja2xkcSAgICAgbTAsIG00CisgICAgcHVucGNraGRxICAgICBtMSwgbTQKKyAgICBwYWRkZCAgICAgICAgIG0wLCBtMQorJWVsaWYgbm90Y3B1ZmxhZyhzc3NlMykgOyBzc2UyCislaWYgJTEgPT0gOAorJWRlZmluZSBtZXggbTYKKyVlbHNlCislZGVmaW5lIG1leCBtMworJWVuZGlmCisgICAgOyBlbXVsYXRlIGhvcml6b250YWwgYWRkIGFzIHRyYW5zcG9zZSArIHZlcnRpY2FsIGFkZAorICAgIG1vdmEgICAgICAgICBtZXgsIG0wCisgICAgcHVucGNrbGRxICAgICBtMCwgbTEKKyAgICBwdW5wY2toZHEgICAgbWV4LCBtMQorICAgIHBhZGRkICAgICAgICAgbTAsIG1leAorICAgIG1vdmEgICAgICAgICAgbTEsIG00CisgICAgcHVucGNrbGRxICAgICBtNCwgbTUKKyAgICBwdW5wY2toZHEgICAgIG0xLCBtNQorICAgIHBhZGRkICAgICAgICAgbTQsIG0xCisgICAgbW92YSAgICAgICAgICBtMSwgbTAKKyAgICBwdW5wY2tscWRxICAgIG0wLCBtNAorICAgIHB1bnBja2hxZHEgICAgbTEsIG00CisgICAgcGFkZGQgICAgICAgICBtMCwgbTEKKyVlbHNlIDsgc3NzZTMvc3NlNAorICAgIDsgRklYTUUgaWYgd2UgcmVhcnJhbmdlIHRoZSBmaWx0ZXIgaW4gcGFpcnMgb2YgNCwgd2UgY2FuCisgICAgOyBsb2FkIHBpeGVscyBsaWtld2lzZSBhbmQgdXNlIDIgeCBwYWRkZCArIHBoYWRkZCBpbnN0ZWFkCisgICAgOyBvZiAzIHggcGhhZGRkIGhlcmUsIGZhc3RlciBvbiBvbGRlciBjcHVzCisgICAgcGhhZGRkICAgICAgICBtMCwgbTEKKyAgICBwaGFkZGQgICAgICAgIG00LCBtNQorICAgIHBoYWRkZCAgICAgICAgbTAsIG00ICAgICAgICAgICAgICAgICAgICAgICAgOyBmaWx0ZXJbeyAwLCAxLC4uLiwgNiwgN31dKnNyY1tmaWx0ZXJQb3NbMF0rezAsMSwuLi4sNiw3fV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGZpbHRlclt7IDgsIDksLi4uLDE0LDE1fV0qc3JjW2ZpbHRlclBvc1sxXSt7MCwxLC4uLiw2LDd9XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZmlsdGVyW3sxNiwxNywuLi4sMjIsMjN9XSpzcmNbZmlsdGVyUG9zWzJdK3swLDEsLi4uLDYsN31dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBmaWx0ZXJbezI0LDI1LC4uLiwzMCwzMX1dKnNyY1tmaWx0ZXJQb3NbM10rezAsMSwuLi4sNiw3fV0KKyVlbmRpZiA7IG1teC9zc2UyL3Nzc2UzL3NzZTQKKyVlbmRpZiA7ICUzID09IDQvOAorCislZWxzZSA7ICUzID09IFgsIGkuZS4gYW55IGZpbHRlclNpemUgc2NhbGluZworCislaWZpZG4gJTQsIFg0CislZGVmaW5lIGRsdCA0CislZWxzZSA7ICU0ID09IFggfHwgJTQgPT0gWDgKKyVkZWZpbmUgZGx0IDAKKyVlbmRpZiA7ICU0ID09LyE9IFg0CislaWYgQVJDSF9YODZfNjQKKyVkZWZpbmUgc3JjcSAgICByOAorJWRlZmluZSBwb3MxcSAgIHI3CislZGVmaW5lIHNyY2VuZHEgcjkKKyAgICBtb3ZzeGQgIGZsdHNpemVxLCBmbHRzaXplZCAgICAgICAgICAgICAgICAgIDsgZmlsdGVyU2l6ZQorICAgIGxlYSAgICAgIHNyY2VuZHEsIFtzcmNtZW1xKyhmbHRzaXplcS1kbHQpKnNyY211bF0gOyAmc3JjW2ZpbHRlclNpemUmfjRdCislZWxzZSA7IHg4Ni0zMgorJWRlZmluZSBzcmNxICAgIHNyY21lbXEKKyVkZWZpbmUgcG9zMXEgICBkc3RxCislZGVmaW5lIHNyY2VuZHEgcjZtCisgICAgbGVhICAgICAgICBwb3MwcSwgW3NyY21lbXErKGZsdHNpemVxLWRsdCkqc3JjbXVsXSA7ICZzcmNbZmlsdGVyU2l6ZSZ+NF0KKyAgICBtb3YgICAgICBzcmNlbmRxLCBwb3MwcQorJWVuZGlmIDsgeDg2LTMyLzY0CisgICAgbGVhICAgICAgZmx0cG9zcSwgW2ZsdHBvc3Erd3EqNF0KKyVpZiAlMiA9PSAxNQorICAgIGxlYSAgICAgICAgIGRzdHEsIFtkc3RxK3dxKjJdCislZWxzZSA7ICUyID09IDE5CisgICAgbGVhICAgICAgICAgZHN0cSwgW2RzdHErd3EqNF0KKyVlbmRpZiA7ICUyID09IDE1LzE5CisgICAgbW92aWZuaWRuICBkc3RtcCwgZHN0cQorICAgIG5lZyAgICAgICAgICAgd3EKKworLmxvb3A6CisgICAgbW92MzIgICAgICBwb3MwcSwgZHdvcmQgW2ZsdHBvc3Erd3EqNCswXSAgICA7IGZpbHRlclBvc1swXQorICAgIG1vdjMyICAgICAgcG9zMXEsIGR3b3JkIFtmbHRwb3NxK3dxKjQrNF0gICAgOyBmaWx0ZXJQb3NbMV0KKyAgICA7IEZJWE1FIG1heWJlIGRvIDRweC9pdGVyYXRpb24gb24geDg2LTY0ICh4ODYtMzIgd291bGRuJ3QgaGF2ZSBlbm91Z2ggcmVncyk/CisgICAgcHhvciAgICAgICAgICBtNCwgbTQKKyAgICBweG9yICAgICAgICAgIG01LCBtNQorICAgIG1vdiAgICAgICAgIHNyY3EsIHNyY21lbW1wCisKKy5pbm5lcmxvb3A6CisgICAgOyBsb2FkIDJ4NCAobW14KSBvciAyeDggKHNzZSkgc291cmNlIHBpeGVscyBpbnRvIG0wL20xIC0+IG00L201CisgICAgbW92YmggICAgICAgICBtMCwgW3NyY3ErIHBvczBxICAgICAqc3JjbXVsXSA7IHNyY1tmaWx0ZXJQb3NbMF0gKyB7MCwxLDIsMygsNCw1LDYsNyl9XQorICAgIG1vdmJoICAgICAgICAgbTEsIFtzcmNxKyhwb3MxcStkbHQpKnNyY211bF0gOyBzcmNbZmlsdGVyUG9zWzFdICsgezAsMSwyLDMoLDQsNSw2LDcpfV0KKyVpZiAlMSA9PSA4CisgICAgcHVucGNrbGJ3ICAgICBtMCwgbTMKKyAgICBwdW5wY2tsYncgICAgIG0xLCBtMworJWVuZGlmIDsgJTEgPT0gOAorCisgICAgOyBtdWx0aXBseQorJWlmICUxID09IDE2IDsgcG1hZGR3ZCBuZWVkcyBzaWduZWQgYWRkcywgc28gdGhpcyBtb3ZlcyB1bnNpZ25lZCAtPiBzaWduZWQsIHdlJ2xsCisgICAgICAgICAgICAgOyBhZGQgYmFjayAweDgwMDAgKiBzdW0oY29lZmZzKSBhZnRlciB0aGUgaG9yaXpvbnRhbCBhZGQKKyAgICBwc3VidyAgICAgICAgIG0wLCBtNgorICAgIHBzdWJ3ICAgICAgICAgbTEsIG02CislZW5kaWYgOyAlMSA9PSAxNgorICAgIHBtYWRkd2QgICAgICAgbTAsIFtmaWx0ZXJxXSAgICAgICAgICAgICAgICAgOyBmaWx0ZXJbezAsMSwyLDMoLDQsNSw2LDcpfV0KKyAgICBwbWFkZHdkICAgICAgIG0xLCBbZmlsdGVycSsoZmx0c2l6ZXErZGx0KSoyXTsgZmlsdGVyW2ZpbHRlcnNpemUrezAsMSwyLDMoLDQsNSw2LDcpfV0KKyAgICBwYWRkZCAgICAgICAgIG00LCBtMAorICAgIHBhZGRkICAgICAgICAgbTUsIG0xCisgICAgYWRkICAgICAgZmlsdGVycSwgbW1zaXplCisgICAgYWRkICAgICAgICAgc3JjcSwgc3JjbXVsKm1tc2l6ZS8yCisgICAgY21wICAgICAgICAgc3JjcSwgc3JjZW5kcSAgICAgICAgICAgICAgICAgICA7IHdoaWxlIChzcmMgKz0gNCkgPCAmc3JjW2ZpbHRlclNpemVdCisgICAgamwgLmlubmVybG9vcAorCislaWZpZG4gJTQsIFg0CisgICAgbW92MzIgICAgICBwb3MxcSwgZHdvcmQgW2ZsdHBvc3Erd3EqNCs0XSAgICA7IGZpbHRlclBvc1sxXQorICAgIG1vdmxoICAgICAgICAgbTAsIFtzcmNxKyBwb3MwcSAgICAgKnNyY211bF0gOyBzcGxpdCBsYXN0IDQgc3JjcHggb2YgZHN0cHhbMF0KKyAgICBzdWIgICAgICAgIHBvczFxLCBmbHRzaXplcSAgICAgICAgICAgICAgICAgIDsgYW5kIGZpcnN0IDQgc3JjcHggb2YgZHN0cHhbMV0KKyVpZiAlMSA+IDgKKyAgICBtb3ZocHMgICAgICAgIG0wLCBbc3JjcSsocG9zMXErZGx0KSpzcmNtdWxdCislZWxzZSA7ICUxID09IDgKKyAgICBtb3ZkICAgICAgICAgIG0xLCBbc3JjcSsocG9zMXErZGx0KSpzcmNtdWxdCisgICAgcHVucGNrbGRxICAgICBtMCwgbTEKKyVlbmRpZiA7ICUxID09IDgKKyVpZiAlMSA9PSA4CisgICAgcHVucGNrbGJ3ICAgICBtMCwgbTMKKyVlbmRpZiA7ICUxID09IDgKKyVpZiAlMSA9PSAxNiA7IHBtYWRkd2QgbmVlZHMgc2lnbmVkIGFkZHMsIHNvIHRoaXMgbW92ZXMgdW5zaWduZWQgLT4gc2lnbmVkLCB3ZSdsbAorICAgICAgICAgICAgIDsgYWRkIGJhY2sgMHg4MDAwICogc3VtKGNvZWZmcykgYWZ0ZXIgdGhlIGhvcml6b250YWwgYWRkCisgICAgcHN1YncgICAgICAgICBtMCwgbTYKKyVlbmRpZiA7ICUxID09IDE2CisgICAgcG1hZGR3ZCAgICAgICBtMCwgW2ZpbHRlcnFdCislZW5kaWYgOyAlNCA9PSBYNAorCisgICAgbGVhICAgICAgZmlsdGVycSwgW2ZpbHRlcnErKGZsdHNpemVxK2RsdCkqMl0KKworJWlmIG1tc2l6ZSA9PSA4IDsgbW14CisgICAgbW92cSAgICAgICAgICBtMCwgbTQKKyAgICBwdW5wY2tsZHEgICAgIG00LCBtNQorICAgIHB1bnBja2hkcSAgICAgbTAsIG01CisgICAgcGFkZGQgICAgICAgICBtMCwgbTQKKyVlbHNlIDsgbW1zaXplID09IDE2CislaWYgbm90Y3B1ZmxhZyhzc3NlMykgOyBzc2UyCisgICAgbW92YSAgICAgICAgICBtMSwgbTQKKyAgICBwdW5wY2tscWRxICAgIG00LCBtNQorICAgIHB1bnBja2hxZHEgICAgbTEsIG01CisgICAgcGFkZGQgICAgICAgICBtNCwgbTEKKyVlbHNlIDsgc3NzZTMvc3NlNAorICAgIHBoYWRkZCAgICAgICAgbTQsIG01CislZW5kaWYgOyBzc2UyL3Nzc2UzL3NzZTQKKyVpZmlkbiAlNCwgWDQKKyAgICBwYWRkZCAgICAgICAgIG00LCBtMAorJWVuZGlmIDsgJTMgPT0gWDQKKyVpZiBub3RjcHVmbGFnKHNzc2UzKSA7IHNzZTIKKyAgICBwc2h1ZmQgICAgICAgIG00LCBtNCwgMTEwMTEwMDBiCisgICAgbW92aGxwcyAgICAgICBtMCwgbTQKKyAgICBwYWRkZCAgICAgICAgIG0wLCBtNAorJWVsc2UgOyBzc3NlMy9zc2U0CisgICAgcGhhZGRkICAgICAgICBtNCwgbTQKKyAgICBTV0FQICAgICAgICAgICAwLCA0CislZW5kaWYgOyBzc2UyL3Nzc2UzL3NzZTQKKyVlbmRpZiA7IG1tc2l6ZSA9PSA4LzE2CislZW5kaWYgOyAlMyA9PS8hPSBYCisKKyVpZiAlMSA9PSAxNiA7IGFkZCAweDgwMDAgKiBzdW0oY29lZmZzKSwgaS5lLiBiYWNrIGZyb20gc2lnbmVkIC0+IHVuc2lnbmVkCisgICAgcGFkZGQgICAgICAgICBtMCwgbTcKKyVlbmRpZiA7ICUxID09IDE2CisKKyAgICA7IGNsaXAsIHN0b3JlCisgICAgcHNyYWQgICAgICAgICBtMCwgMTQgKyAlMSAtICUyCislaWZpZG4gJTMsIFgKKyAgICBtb3ZpZm5pZG4gICBkc3RxLCBkc3RtcAorJWVuZGlmIDsgJTMgPT0gWAorJWlmICUyID09IDE1CisgICAgcGFja3NzZHcgICAgICBtMCwgbTAKKyVpZm5pZG4gJTMsIFgKKyAgICBtb3ZoIFtkc3RxK3dxKigyPj53c2hyKV0sIG0wCislZWxzZSA7ICUzID09IFgKKyAgICBtb3ZkIFtkc3RxK3dxKjJdLCBtMAorJWVuZGlmIDsgJTMgPT0vIT0gWAorJWVsc2UgOyAlMiA9PSAxOQorJWlmIG1tc2l6ZSA9PSA4CisgICAgUE1JTlNEX01NWCAgICBtMCwgbTIsIG00CislZWxpZiBjcHVmbGFnKHNzZTQpCisgICAgcG1pbnNkICAgICAgICBtMCwgbTIKKyVlbHNlIDsgc3NlMi9zc3NlMworICAgIGN2dGRxMnBzICAgICAgbTAsIG0wCisgICAgbWlucHMgICAgICAgICBtMCwgbTIKKyAgICBjdnRwczJkcSAgICAgIG0wLCBtMAorJWVuZGlmIDsgbW14L3NzZTIvc3NzZTMvc3NlNAorJWlmbmlkbiAlMywgWAorICAgIG1vdmEgW2RzdHErd3EqKDQ+PndzaHIpXSwgbTAKKyVlbHNlIDsgJTMgPT0gWAorICAgIG1vdnEgW2RzdHErd3EqNF0sIG0wCislZW5kaWYgOyAlMyA9PS8hPSBYCislZW5kaWYgOyAlMiA9PSAxNS8xOQorJWlmbmlkbiAlMywgWAorICAgIGFkZCAgICAgICAgICAgd3EsIChtbXNpemU8PHdzaHIpLzQgICAgICAgICAgOyBib3RoIDh0YXAgYW5kIDR0YXAgcmVhbGx5IG9ubHkgZG8gNCBwaXhlbHMgKG9yIGZvciBtbXg6IDIgcGl4ZWxzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwZXIgaXRlcmF0aW9uLiBzZWUgInNobCB3cSwxIiBhYm92ZSBhcyBmb3Igd2h5IHdlIGRvIHRoaXMKKyVlbHNlIDsgJTMgPT0gWAorICAgIGFkZCAgICAgICAgICAgd3EsIDIKKyVlbmRpZiA7ICUzID09LyE9IFgKKyAgICBqbCAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCis7IFNDQUxFX0ZVTkNTIHNvdXJjZV93aWR0aCwgaW50ZXJtZWRpYXRlX25iaXRzLCBuX3htbQorJW1hY3JvIFNDQUxFX0ZVTkNTIDMKK1NDQUxFX0ZVTkMgJTEsICUyLCA0LCA0LCAgNiwgJTMKK1NDQUxFX0ZVTkMgJTEsICUyLCA4LCA4LCAgNiwgJTMKKyVpZiBtbXNpemUgPT0gOAorU0NBTEVfRlVOQyAlMSwgJTIsIFgsIFgsICA3LCAlMworJWVsc2UKK1NDQUxFX0ZVTkMgJTEsICUyLCBYLCBYNCwgNywgJTMKK1NDQUxFX0ZVTkMgJTEsICUyLCBYLCBYOCwgNywgJTMKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgU0NBTEVfRlVOQ1MyIDhfeG1tX2FyZ3MsIDl0bzEwX3htbV9hcmdzLCAxNl94bW1fYXJncworJW1hY3JvIFNDQUxFX0ZVTkNTMiAzCislaWYgbm90Y3B1ZmxhZyhzc2U0KQorU0NBTEVfRlVOQ1MgIDgsIDE1LCAlMQorU0NBTEVfRlVOQ1MgIDksIDE1LCAlMgorU0NBTEVfRlVOQ1MgMTAsIDE1LCAlMgorU0NBTEVfRlVOQ1MgMTIsIDE1LCAlMgorU0NBTEVfRlVOQ1MgMTQsIDE1LCAlMgorU0NBTEVfRlVOQ1MgMTYsIDE1LCAlMworJWVuZGlmIDsgIXNzZTQKK1NDQUxFX0ZVTkNTICA4LCAxOSwgJTEKK1NDQUxFX0ZVTkNTICA5LCAxOSwgJTIKK1NDQUxFX0ZVTkNTIDEwLCAxOSwgJTIKK1NDQUxFX0ZVTkNTIDEyLCAxOSwgJTIKK1NDQUxFX0ZVTkNTIDE0LCAxOSwgJTIKK1NDQUxFX0ZVTkNTIDE2LCAxOSwgJTMKKyVlbmRtYWNybworCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIG1teAorU0NBTEVfRlVOQ1MyIDAsIDAsIDAKKyVlbmRpZgorSU5JVF9YTU0gc3NlMgorU0NBTEVfRlVOQ1MyIDcsIDYsIDgKK0lOSVRfWE1NIHNzc2UzCitTQ0FMRV9GVU5DUzIgNiwgNiwgOAorSU5JVF9YTU0gc3NlNAorU0NBTEVfRlVOQ1MyIDYsIDYsIDgKZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni9zd3NjYWxlLmMgYi9mZm1wZWcvbGlic3dzY2FsZS94ODYvc3dzY2FsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNWM0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS94ODYvc3dzY2FsZS5jCkBAIC0wLDAgKzEsNTgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMTEgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlX2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisKKyNkZWZpbmUgRElUSEVSMVhCUFAKKworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIGJGOCk9ICAgICAgIDB4RjhGOEY4RjhGOEY4RjhGOExMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIGJGQyk9ICAgICAgIDB4RkNGQ0ZDRkNGQ0ZDRkNGQ0xMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIHcxMCk9ICAgICAgIDB4MDAxMDAwMTAwMDEwMDAxMExMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIHcwMik9ICAgICAgIDB4MDAwMjAwMDIwMDAyMDAwMkxMOworCitjb25zdCBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIGZmX2RpdGhlcjQpWzJdID0geworICAgIDB4MDEwMzAxMDMwMTAzMDEwM0xMLAorICAgIDB4MDIwMDAyMDAwMjAwMDIwMExMLH07CisKK2NvbnN0IERFQ0xBUkVfQUxJR05FRCg4LCB1aW50NjRfdCwgZmZfZGl0aGVyOClbMl0gPSB7CisgICAgMHgwNjAyMDYwMjA2MDIwNjAyTEwsCisgICAgMHgwMDA0MDAwNDAwMDQwMDA0TEwsfTsKKworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIGIxNk1hc2spPSAgIDB4MDAxRjAwMUYwMDFGMDAxRkxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIGcxNk1hc2spPSAgIDB4MDdFMDA3RTAwN0UwMDdFMExMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIHIxNk1hc2spPSAgIDB4RjgwMEY4MDBGODAwRjgwMExMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIGIxNU1hc2spPSAgIDB4MDAxRjAwMUYwMDFGMDAxRkxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIGcxNU1hc2spPSAgIDB4MDNFMDAzRTAwM0UwMDNFMExMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIHIxNU1hc2spPSAgIDB4N0MwMDdDMDA3QzAwN0MwMExMOworCitERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX00yNEEpICAgICAgICAgPSAweDAwRkYwMDAwRkYwMDAwRkZMTDsKK0RFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50NjRfdCwgZmZfTTI0QikgICAgICAgICA9IDB4RkYwMDAwRkYwMDAwRkYwMExMOworREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ2NF90LCBmZl9NMjRDKSAgICAgICAgID0gMHgwMDAwRkYwMDAwRkYwMDAwTEw7CisKK0RFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50NjRfdCwgZmZfYmdyMllPZmZzZXQpICA9IDB4MTAxMDEwMTAxMDEwMTAxMFVMTDsKK0RFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50NjRfdCwgZmZfYmdyMlVWT2Zmc2V0KSA9IDB4ODA4MDgwODA4MDgwODA4MFVMTDsKK0RFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50NjRfdCwgZmZfdzExMTEpICAgICAgICA9IDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKKworCisvL01NWCB2ZXJzaW9ucworI2lmIEhBVkVfTU1YX0lOTElORQorI3VuZGVmIFJFTkFNRQorI2RlZmluZSBDT01QSUxFX1RFTVBMQVRFX01NWEVYVCAwCisjZGVmaW5lIFJFTkFNRShhKSBhICMjIF9tbXgKKyNpbmNsdWRlICJzd3NjYWxlX3RlbXBsYXRlLmMiCisjZW5kaWYKKworLy8gTU1YRVhUIHZlcnNpb25zCisjaWYgSEFWRV9NTVhFWFRfSU5MSU5FCisjdW5kZWYgUkVOQU1FCisjdW5kZWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgMQorI2RlZmluZSBSRU5BTUUoYSkgYSAjIyBfbW14ZXh0CisjaW5jbHVkZSAic3dzY2FsZV90ZW1wbGF0ZS5jIgorI2VuZGlmCisKK3ZvaWQgdXBkYXRlTU1YRGl0aGVyVGFibGVzKFN3c0NvbnRleHQgKmMsIGludCBkc3RZLCBpbnQgbHVtQnVmSW5kZXgsIGludCBjaHJCdWZJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0SW5MdW1CdWYsIGludCBsYXN0SW5DaHJCdWYpCit7CisgICAgY29uc3QgaW50IGRzdEg9IGMtPmRzdEg7CisgICAgY29uc3QgaW50IGZsYWdzPSBjLT5mbGFnczsKKyAgICBpbnQxNl90ICoqbHVtUGl4QnVmPSBjLT5sdW1QaXhCdWY7CisgICAgaW50MTZfdCAqKmNoclVQaXhCdWY9IGMtPmNoclVQaXhCdWY7CisgICAgaW50MTZfdCAqKmFscFBpeEJ1Zj0gYy0+YWxwUGl4QnVmOworICAgIGNvbnN0IGludCB2THVtQnVmU2l6ZT0gYy0+dkx1bUJ1ZlNpemU7CisgICAgY29uc3QgaW50IHZDaHJCdWZTaXplPSBjLT52Q2hyQnVmU2l6ZTsKKyAgICBpbnQzMl90ICp2THVtRmlsdGVyUG9zPSBjLT52THVtRmlsdGVyUG9zOworICAgIGludDMyX3QgKnZDaHJGaWx0ZXJQb3M9IGMtPnZDaHJGaWx0ZXJQb3M7CisgICAgaW50MTZfdCAqdkx1bUZpbHRlcj0gYy0+dkx1bUZpbHRlcjsKKyAgICBpbnQxNl90ICp2Q2hyRmlsdGVyPSBjLT52Q2hyRmlsdGVyOworICAgIGludDMyX3QgKmx1bU1teEZpbHRlcj0gYy0+bHVtTW14RmlsdGVyOworICAgIGludDMyX3QgKmNock1teEZpbHRlcj0gYy0+Y2hyTW14RmlsdGVyOworICAgIGludDMyX3QgYXZfdW51c2VkICphbHBNbXhGaWx0ZXI9IGMtPmFscE1teEZpbHRlcjsKKyAgICBjb25zdCBpbnQgdkx1bUZpbHRlclNpemU9IGMtPnZMdW1GaWx0ZXJTaXplOworICAgIGNvbnN0IGludCB2Q2hyRmlsdGVyU2l6ZT0gYy0+dkNockZpbHRlclNpemU7CisgICAgY29uc3QgaW50IGNockRzdFk9IGRzdFk+PmMtPmNockRzdFZTdWJTYW1wbGU7CisgICAgY29uc3QgaW50IGZpcnN0THVtU3JjWT0gdkx1bUZpbHRlclBvc1tkc3RZXTsgLy9GaXJzdCBsaW5lIG5lZWRlZCBhcyBpbnB1dAorICAgIGNvbnN0IGludCBmaXJzdENoclNyY1k9IHZDaHJGaWx0ZXJQb3NbY2hyRHN0WV07IC8vRmlyc3QgbGluZSBuZWVkZWQgYXMgaW5wdXQKKworICAgIGMtPmJsdWVEaXRoZXI9IGZmX2RpdGhlcjhbZHN0WSYxXTsKKyAgICBpZiAoYy0+ZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfUkdCNTU1IHx8IGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX0JHUjU1NSkKKyAgICAgICAgYy0+Z3JlZW5EaXRoZXI9IGZmX2RpdGhlcjhbZHN0WSYxXTsKKyAgICBlbHNlCisgICAgICAgIGMtPmdyZWVuRGl0aGVyPSBmZl9kaXRoZXI0W2RzdFkmMV07CisgICAgYy0+cmVkRGl0aGVyPSBmZl9kaXRoZXI4Wyhkc3RZKzEpJjFdOworICAgIGlmIChkc3RZIDwgZHN0SCAtIDIpIHsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyY1B0cj0gKGNvbnN0IGludDE2X3QgKiopKHZvaWQqKSBsdW1QaXhCdWYgKyBsdW1CdWZJbmRleCArIGZpcnN0THVtU3JjWSAtIGxhc3RJbkx1bUJ1ZiArIHZMdW1CdWZTaXplOworICAgICAgICBjb25zdCBpbnQxNl90ICoqY2hyVVNyY1B0cj0gKGNvbnN0IGludDE2X3QgKiopKHZvaWQqKSBjaHJVUGl4QnVmICsgY2hyQnVmSW5kZXggKyBmaXJzdENoclNyY1kgLSBsYXN0SW5DaHJCdWYgKyB2Q2hyQnVmU2l6ZTsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqKmFscFNyY1B0cj0gKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGFscFBpeEJ1ZikgPyAoY29uc3QgaW50MTZfdCAqKikodm9pZCopIGFscFBpeEJ1ZiArIGx1bUJ1ZkluZGV4ICsgZmlyc3RMdW1TcmNZIC0gbGFzdEluTHVtQnVmICsgdkx1bUJ1ZlNpemUgOiBOVUxMOworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoZmlyc3RMdW1TcmNZIDwgMCB8fCBmaXJzdEx1bVNyY1kgKyB2THVtRmlsdGVyU2l6ZSA+IGMtPnNyY0gpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKip0bXBZID0gKGNvbnN0IGludDE2X3QgKiopIGx1bVBpeEJ1ZiArIDIgKiB2THVtQnVmU2l6ZTsKKyAgICAgICAgICAgIGludCBuZWcgPSAtZmlyc3RMdW1TcmNZLCBpLCBlbmQgPSBGRk1JTihjLT5zcmNIIC0gZmlyc3RMdW1TcmNZLCB2THVtRmlsdGVyU2l6ZSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmVnOyAgICAgICAgICAgIGkrKykKKyAgICAgICAgICAgICAgICB0bXBZW2ldID0gbHVtU3JjUHRyW25lZ107CisgICAgICAgICAgICBmb3IgKCAgICAgOyBpIDwgZW5kOyAgICAgICAgICAgIGkrKykKKyAgICAgICAgICAgICAgICB0bXBZW2ldID0gbHVtU3JjUHRyW2ldOworICAgICAgICAgICAgZm9yICggICAgIDsgaSA8IHZMdW1GaWx0ZXJTaXplOyBpKyspCisgICAgICAgICAgICAgICAgdG1wWVtpXSA9IHRtcFlbaS0xXTsKKyAgICAgICAgICAgIGx1bVNyY1B0ciA9IHRtcFk7CisKKyAgICAgICAgICAgIGlmIChhbHBTcmNQdHIpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqdG1wQSA9IChjb25zdCBpbnQxNl90ICoqKSBhbHBQaXhCdWYgKyAyICogdkx1bUJ1ZlNpemU7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5lZzsgICAgICAgICAgICBpKyspCisgICAgICAgICAgICAgICAgICAgIHRtcEFbaV0gPSBhbHBTcmNQdHJbbmVnXTsKKyAgICAgICAgICAgICAgICBmb3IgKCAgICAgOyBpIDwgZW5kOyAgICAgICAgICAgIGkrKykKKyAgICAgICAgICAgICAgICAgICAgdG1wQVtpXSA9IGFscFNyY1B0cltpXTsKKyAgICAgICAgICAgICAgICBmb3IgKCAgICAgOyBpIDwgdkx1bUZpbHRlclNpemU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgdG1wQVtpXSA9IHRtcEFbaSAtIDFdOworICAgICAgICAgICAgICAgIGFscFNyY1B0ciA9IHRtcEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpcnN0Q2hyU3JjWSA8IDAgfHwgZmlyc3RDaHJTcmNZICsgdkNockZpbHRlclNpemUgPiBjLT5jaHJTcmNIKSB7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqdG1wVSA9IChjb25zdCBpbnQxNl90ICoqKSBjaHJVUGl4QnVmICsgMiAqIHZDaHJCdWZTaXplOworICAgICAgICAgICAgaW50IG5lZyA9IC1maXJzdENoclNyY1ksIGksIGVuZCA9IEZGTUlOKGMtPmNoclNyY0ggLSBmaXJzdENoclNyY1ksIHZDaHJGaWx0ZXJTaXplKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZWc7ICAgICAgICAgICAgaSsrKSB7CisgICAgICAgICAgICAgICAgdG1wVVtpXSA9IGNoclVTcmNQdHJbbmVnXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoICAgICA7IGkgPCBlbmQ7ICAgICAgICAgICAgaSsrKSB7CisgICAgICAgICAgICAgICAgdG1wVVtpXSA9IGNoclVTcmNQdHJbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKCAgICAgOyBpIDwgdkNockZpbHRlclNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHRtcFVbaV0gPSB0bXBVW2kgLSAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoclVTcmNQdHIgPSB0bXBVOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYgU1dTX0FDQ1VSQVRFX1JORCkgeworICAgICAgICAgICAgaW50IHM9IEFQQ0tfU0laRSAvIDg7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTx2THVtRmlsdGVyU2l6ZTsgaSs9MikgeworICAgICAgICAgICAgICAgICooY29uc3Qgdm9pZCoqKSZsdW1NbXhGaWx0ZXJbcyppICAgICAgICAgICAgICBdPSBsdW1TcmNQdHJbaSAgXTsKKyAgICAgICAgICAgICAgICAqKGNvbnN0IHZvaWQqKikmbHVtTW14RmlsdGVyW3MqaStBUENLX1BUUjIvNCAgXT0gbHVtU3JjUHRyW2krKHZMdW1GaWx0ZXJTaXplPjEpXTsKKyAgICAgICAgICAgICAgICBsdW1NbXhGaWx0ZXJbcyppK0FQQ0tfQ09FRi80ICBdPQorICAgICAgICAgICAgICAgIGx1bU1teEZpbHRlcltzKmkrQVBDS19DT0VGLzQrMV09IHZMdW1GaWx0ZXJbZHN0WSp2THVtRmlsdGVyU2l6ZSArIGkgICAgXQorICAgICAgICAgICAgICAgICsgKHZMdW1GaWx0ZXJTaXplPjEgPyB2THVtRmlsdGVyW2RzdFkqdkx1bUZpbHRlclNpemUgKyBpICsgMV08PDE2IDogMCk7CisgICAgICAgICAgICAgICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGFscFBpeEJ1ZikgeworICAgICAgICAgICAgICAgICAgICAqKGNvbnN0IHZvaWQqKikmYWxwTW14RmlsdGVyW3MqaSAgICAgICAgICAgICAgXT0gYWxwU3JjUHRyW2kgIF07CisgICAgICAgICAgICAgICAgICAgICooY29uc3Qgdm9pZCoqKSZhbHBNbXhGaWx0ZXJbcyppK0FQQ0tfUFRSMi80ICBdPSBhbHBTcmNQdHJbaSsodkx1bUZpbHRlclNpemU+MSldOworICAgICAgICAgICAgICAgICAgICBhbHBNbXhGaWx0ZXJbcyppK0FQQ0tfQ09FRi80ICBdPQorICAgICAgICAgICAgICAgICAgICBhbHBNbXhGaWx0ZXJbcyppK0FQQ0tfQ09FRi80KzFdPSBsdW1NbXhGaWx0ZXJbcyppK0FQQ0tfQ09FRi80ICBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHZDaHJGaWx0ZXJTaXplOyBpKz0yKSB7CisgICAgICAgICAgICAgICAgKihjb25zdCB2b2lkKiopJmNock1teEZpbHRlcltzKmkgICAgICAgICAgICAgIF09IGNoclVTcmNQdHJbaSAgXTsKKyAgICAgICAgICAgICAgICAqKGNvbnN0IHZvaWQqKikmY2hyTW14RmlsdGVyW3MqaStBUENLX1BUUjIvNCAgXT0gY2hyVVNyY1B0cltpKyh2Q2hyRmlsdGVyU2l6ZT4xKV07CisgICAgICAgICAgICAgICAgY2hyTW14RmlsdGVyW3MqaStBUENLX0NPRUYvNCAgXT0KKyAgICAgICAgICAgICAgICBjaHJNbXhGaWx0ZXJbcyppK0FQQ0tfQ09FRi80KzFdPSB2Q2hyRmlsdGVyW2NockRzdFkqdkNockZpbHRlclNpemUgKyBpICAgIF0KKyAgICAgICAgICAgICAgICArICh2Q2hyRmlsdGVyU2l6ZT4xID8gdkNockZpbHRlcltjaHJEc3RZKnZDaHJGaWx0ZXJTaXplICsgaSArIDFdPDwxNiA6IDApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8dkx1bUZpbHRlclNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICooY29uc3Qgdm9pZCoqKSZsdW1NbXhGaWx0ZXJbNCppKzBdPSBsdW1TcmNQdHJbaV07CisgICAgICAgICAgICAgICAgbHVtTW14RmlsdGVyWzQqaSsyXT0KKyAgICAgICAgICAgICAgICBsdW1NbXhGaWx0ZXJbNCppKzNdPQorICAgICAgICAgICAgICAgICgodWludDE2X3Qpdkx1bUZpbHRlcltkc3RZKnZMdW1GaWx0ZXJTaXplICsgaV0pKjB4MTAwMDFVOworICAgICAgICAgICAgICAgIGlmIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBhbHBQaXhCdWYpIHsKKyAgICAgICAgICAgICAgICAgICAgKihjb25zdCB2b2lkKiopJmFscE1teEZpbHRlcls0KmkrMF09IGFscFNyY1B0cltpXTsKKyAgICAgICAgICAgICAgICAgICAgYWxwTW14RmlsdGVyWzQqaSsyXT0KKyAgICAgICAgICAgICAgICAgICAgYWxwTW14RmlsdGVyWzQqaSszXT0gbHVtTW14RmlsdGVyWzQqaSsyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTx2Q2hyRmlsdGVyU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgKihjb25zdCB2b2lkKiopJmNock1teEZpbHRlcls0KmkrMF09IGNoclVTcmNQdHJbaV07CisgICAgICAgICAgICAgICAgY2hyTW14RmlsdGVyWzQqaSsyXT0KKyAgICAgICAgICAgICAgICBjaHJNbXhGaWx0ZXJbNCppKzNdPQorICAgICAgICAgICAgICAgICgodWludDE2X3QpdkNockZpbHRlcltjaHJEc3RZKnZDaHJGaWx0ZXJTaXplICsgaV0pKjB4MTAwMDFVOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjaWYgSEFWRV9NTVhFWFQKK3N0YXRpYyB2b2lkIHl1djJ5dXZYX3NzZTMoY29uc3QgaW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipzcmMsIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGl0aGVyLCBpbnQgb2Zmc2V0KQoreworICAgIGlmKCgoaW50KWRlc3QpICYgMTUpeworICAgICAgICB5dXYyeXV2WF9tbXhleHQoZmlsdGVyLCBmaWx0ZXJTaXplLCBzcmMsIGRlc3QsIGRzdFcsIGRpdGhlciwgb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmaWx0ZXJTaXplLS07CisjZGVmaW5lIE1BSU5fRlVOQ1RJT04gXAorICAgICAgICAicHhvciAgICAgICAlJXhtbTAsICUleG1tMCBcblx0IiBcCisgICAgICAgICJwdW5wY2tsYncgICUleG1tMCwgJSV4bW0zIFxuXHQiIFwKKyAgICAgICAgIm1vdmQgICAgICAgICAgICU0LCAlJXhtbTEgXG5cdCIgXAorICAgICAgICAicHVucGNrbHdkICAlJXhtbTEsICUleG1tMSBcblx0IiBcCisgICAgICAgICJwdW5wY2tsZHEgICUleG1tMSwgJSV4bW0xIFxuXHQiIFwKKyAgICAgICAgInB1bnBja2xxZHEgJSV4bW0xLCAlJXhtbTEgXG5cdCIgXAorICAgICAgICAicHNsbHcgICAgICAgICAgJDMsICUleG1tMSBcblx0IiBcCisgICAgICAgICJwYWRkdyAgICAgICUleG1tMSwgJSV4bW0zIFxuXHQiIFwKKyAgICAgICAgInBzcmF3ICAgICAgICAgICQ0LCAlJXhtbTMgXG5cdCIgXAorICAgICAgICAibW92ZHFhICAgICAlJXhtbTMsICUleG1tNCBcblx0IiBcCisgICAgICAgICJtb3ZkcWEgICAgICUleG1tMywgJSV4bW03IFxuXHQiIFwKKyAgICAgICAgIm1vdmwgICAgICAgICAgICUzLCAlJWVjeCAgXG5cdCIgXAorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTAsICUlIlJFR19kIiAgXG5cdCJcCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICBcblx0IlwKKyAgICAgICAgIi5wMmFsaWduICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgIFxuXHQiIC8qIEZJWE1FIFVucm9sbD8gKi9cCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdmRkdXAgICAgICAgICAgICAgICAgICA4KCUlIlJFR19kIiksICUleG1tMCAgICAgIFxuXHQiIC8qIGZpbHRlckNvZWZmICovXAorICAgICAgICAibW92ZHFhICAgICAgICAgICAgICAoJSUiUkVHX1MiLCAlJSJSRUdfYyIsIDIpLCAlJXhtbTIgICAgICBcblx0IiAvKiBzcmNEYXRhICovXAorICAgICAgICAibW92ZHFhICAgICAgICAgICAgMTYoJSUiUkVHX1MiLCAlJSJSRUdfYyIsIDIpLCAlJXhtbTUgICAgICBcblx0IiAvKiBzcmNEYXRhICovXAorICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMTYsICUlIlJFR19kIiAgXG5cdCJcCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICBcblx0IlwKKyAgICAgICAgInRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgJSUiUkVHX1MiLCAlJSJSRUdfUyIgIFxuXHQiXAorICAgICAgICAicG11bGh3ICAgICAgICAgICAgICAgICAgICAgICAgICAgJSV4bW0wLCAlJXhtbTIgICAgICBcblx0IlwKKyAgICAgICAgInBtdWxodyAgICAgICAgICAgICAgICAgICAgICAgICAgICUleG1tMCwgJSV4bW01ICAgICAgXG5cdCJcCisgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlJXhtbTIsICUleG1tMyAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSV4bW01LCAlJXhtbTQgICAgICBcblx0IlwKKyAgICAgICAgIiBqbnogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDMsICUleG1tMyAgICAgIFxuXHQiXAorICAgICAgICAicHNyYXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDMsICUleG1tNCAgICAgIFxuXHQiXAorICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAgICAgICAgICAgICAgJSV4bW00LCAlJXhtbTMgICAgICBcblx0IlwKKyAgICAgICAgIm1vdm50ZHEgICAgICAgICAgICAgICAgICAgICAgICAgICUleG1tMywgKCUxLCAlJSJSRUdfYyIpXG5cdCJcCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJSJSRUdfYyIgICAgICAgICBcblx0IlwKKyAgICAgICAgImNtcCAgICAgICAgICAgICAgICAgICAgICAgICAgJTIsICUlIlJFR19jIiAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ZHFhICAgICAgICAgICAgICAgICAgICUleG1tNywgJSV4bW0zICAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAibW92ZHFhICAgICAgICAgICAgICAgICAgICUleG1tNywgJSV4bW00ICAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTAsICUlIlJFR19kIiAgXG5cdCJcCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICBcblx0IlwKKyAgICAgICAgImpiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgIFxuXHQiCisKKyAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibW92cSAgICAgICAgICAlNSwgJSV4bW0zICBcblx0IgorICAgICAgICAgICAgIm1vdmRxYSAgICAlJXhtbTMsICUleG1tNCAgXG5cdCIKKyAgICAgICAgICAgICJwc3JscSAgICAgICAgJDI0LCAlJXhtbTMgIFxuXHQiCisgICAgICAgICAgICAicHNsbHEgICAgICAgICQ0MCwgJSV4bW00ICBcblx0IgorICAgICAgICAgICAgInBvciAgICAgICAlJXhtbTQsICUleG1tMyAgXG5cdCIKKyAgICAgICAgICAgIE1BSU5fRlVOQ1RJT04KKyAgICAgICAgICAgICAgOjogImciIChmaWx0ZXIpLAorICAgICAgICAgICAgICAiciIgKGRlc3Qtb2Zmc2V0KSwgImciICgoeDg2X3JlZykoZHN0VytvZmZzZXQpKSwgIm0iIChvZmZzZXQpLAorICAgICAgICAgICAgICAibSIoZmlsdGVyU2l6ZSksICJtIigoKHVpbnQ2NF90ICopIGRpdGhlcilbMF0pCisgICAgICAgICAgICAgIDogWE1NX0NMT0JCRVJTKCIleG1tMCIgLCAiJXhtbTEiICwgIiV4bW0yIiAsICIleG1tMyIgLCAiJXhtbTQiICwgIiV4bW01IiAsICIleG1tNyIgLCkKKyAgICAgICAgICAgICAgICAiJSJSRUdfZCwgIiUiUkVHX1MsICIlIlJFR19jCisgICAgICAgICAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJtb3ZxICAgICAgICAgICU1LCAlJXhtbTMgICBcblx0IgorICAgICAgICAgICAgTUFJTl9GVU5DVElPTgorICAgICAgICAgICAgICA6OiAiZyIgKGZpbHRlciksCisgICAgICAgICAgICAgICJyIiAoZGVzdC1vZmZzZXQpLCAiZyIgKCh4ODZfcmVnKShkc3RXK29mZnNldCkpLCAibSIgKG9mZnNldCksCisgICAgICAgICAgICAgICJtIihmaWx0ZXJTaXplKSwgIm0iKCgodWludDY0X3QgKikgZGl0aGVyKVswXSkKKyAgICAgICAgICAgICAgOiBYTU1fQ0xPQkJFUlMoIiV4bW0wIiAsICIleG1tMSIgLCAiJXhtbTIiICwgIiV4bW0zIiAsICIleG1tNCIgLCAiJXhtbTUiICwgIiV4bW03IiAsKQorICAgICAgICAgICAgICAgICIlIlJFR19kLCAiJSJSRUdfUywgIiUiUkVHX2MKKyAgICAgICAgICAgICAgKTsKKyAgICB9Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCisjZGVmaW5lIFNDQUxFX0ZVTkMoZmlsdGVyX24sIGZyb21fYnBjLCB0b19icGMsIG9wdCkgXAordm9pZCBmZl9oc2NhbGUgIyMgZnJvbV9icGMgIyMgdG8gIyMgdG9fYnBjICMjIF8gIyMgZmlsdGVyX24gIyMgXyAjIyBvcHQoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3c0NvbnRleHQgKmMsIGludDE2X3QgKmRhdGEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RXLCBjb25zdCB1aW50OF90ICpzcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmZpbHRlciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqZmlsdGVyUG9zLCBpbnQgZmlsdGVyU2l6ZSkKKworI2RlZmluZSBTQ0FMRV9GVU5DUyhmaWx0ZXJfbiwgb3B0KSBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgIDgsIDE1LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgIDksIDE1LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgMTAsIDE1LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgMTIsIDE1LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgMTQsIDE1LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgMTYsIDE1LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgIDgsIDE5LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgIDksIDE5LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgMTAsIDE5LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgMTIsIDE5LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgMTQsIDE5LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQyhmaWx0ZXJfbiwgMTYsIDE5LCBvcHQpCisKKyNkZWZpbmUgU0NBTEVfRlVOQ1NfTU1YKG9wdCkgXAorICAgIFNDQUxFX0ZVTkNTKDQsIG9wdCk7IFwKKyAgICBTQ0FMRV9GVU5DUyg4LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQ1MoWCwgb3B0KQorCisjZGVmaW5lIFNDQUxFX0ZVTkNTX1NTRShvcHQpIFwKKyAgICBTQ0FMRV9GVU5DUyg0LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQ1MoOCwgb3B0KTsgXAorICAgIFNDQUxFX0ZVTkNTKFg0LCBvcHQpOyBcCisgICAgU0NBTEVfRlVOQ1MoWDgsIG9wdCkKKworI2lmIEFSQ0hfWDg2XzMyCitTQ0FMRV9GVU5DU19NTVgobW14KTsKKyNlbmRpZgorU0NBTEVfRlVOQ1NfU1NFKHNzZTIpOworU0NBTEVfRlVOQ1NfU1NFKHNzc2UzKTsKK1NDQUxFX0ZVTkNTX1NTRShzc2U0KTsKKworI2RlZmluZSBWU0NBTEVYX0ZVTkMoc2l6ZSwgb3B0KSBcCit2b2lkIGZmX3l1djJwbGFuZVhfICMjIHNpemUgIyMgXyAjIyBvcHQoY29uc3QgaW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdGVyU2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipzcmMsIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGl0aGVyLCBpbnQgb2Zmc2V0KQorI2RlZmluZSBWU0NBTEVYX0ZVTkNTKG9wdCkgXAorICAgIFZTQ0FMRVhfRlVOQyg4LCAgb3B0KTsgXAorICAgIFZTQ0FMRVhfRlVOQyg5LCAgb3B0KTsgXAorICAgIFZTQ0FMRVhfRlVOQygxMCwgb3B0KQorCisjaWYgQVJDSF9YODZfMzIKK1ZTQ0FMRVhfRlVOQ1MobW14ZXh0KTsKKyNlbmRpZgorVlNDQUxFWF9GVU5DUyhzc2UyKTsKK1ZTQ0FMRVhfRlVOQ1Moc3NlNCk7CitWU0NBTEVYX0ZVTkMoMTYsIHNzZTQpOworVlNDQUxFWF9GVU5DUyhhdngpOworCisjZGVmaW5lIFZTQ0FMRV9GVU5DKHNpemUsIG9wdCkgXAordm9pZCBmZl95dXYycGxhbmUxXyAjIyBzaXplICMjIF8gIyMgb3B0KGNvbnN0IGludDE2X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgZHN0VywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpdGhlciwgaW50IG9mZnNldCkKKyNkZWZpbmUgVlNDQUxFX0ZVTkNTKG9wdDEsIG9wdDIpIFwKKyAgICBWU0NBTEVfRlVOQyg4LCAgb3B0MSk7IFwKKyAgICBWU0NBTEVfRlVOQyg5LCAgb3B0Mik7IFwKKyAgICBWU0NBTEVfRlVOQygxMCwgb3B0Mik7IFwKKyAgICBWU0NBTEVfRlVOQygxNiwgb3B0MSkKKworI2lmIEFSQ0hfWDg2XzMyCitWU0NBTEVfRlVOQ1MobW14LCBtbXhleHQpOworI2VuZGlmCitWU0NBTEVfRlVOQ1Moc3NlMiwgc3NlMik7CitWU0NBTEVfRlVOQygxNiwgc3NlNCk7CitWU0NBTEVfRlVOQ1MoYXZ4LCBhdngpOworCisjZGVmaW5lIElOUFVUX1lfRlVOQyhmbXQsIG9wdCkgXAordm9pZCBmZl8gIyMgZm10ICMjIFRvWV8gICMjIG9wdCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp1bnVzZWQxLCBjb25zdCB1aW50OF90ICp1bnVzZWQyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCB1aW50MzJfdCAqdW51c2VkKQorI2RlZmluZSBJTlBVVF9VVl9GVU5DKGZtdCwgb3B0KSBcCit2b2lkIGZmXyAjIyBmbXQgIyMgVG9VVl8gIyMgb3B0KHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdW51c2VkMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIHVpbnQzMl90ICp1bnVzZWQpCisjZGVmaW5lIElOUFVUX0ZVTkMoZm10LCBvcHQpIFwKKyAgICBJTlBVVF9ZX0ZVTkMoZm10LCBvcHQpOyBcCisgICAgSU5QVVRfVVZfRlVOQyhmbXQsIG9wdCkKKyNkZWZpbmUgSU5QVVRfRlVOQ1Mob3B0KSBcCisgICAgSU5QVVRfRlVOQyh1eXZ5LCBvcHQpOyBcCisgICAgSU5QVVRfRlVOQyh5dXl2LCBvcHQpOyBcCisgICAgSU5QVVRfVVZfRlVOQyhudjEyLCBvcHQpOyBcCisgICAgSU5QVVRfVVZfRlVOQyhudjIxLCBvcHQpOyBcCisgICAgSU5QVVRfRlVOQyhyZ2JhLCBvcHQpOyBcCisgICAgSU5QVVRfRlVOQyhiZ3JhLCBvcHQpOyBcCisgICAgSU5QVVRfRlVOQyhhcmdiLCBvcHQpOyBcCisgICAgSU5QVVRfRlVOQyhhYmdyLCBvcHQpOyBcCisgICAgSU5QVVRfRlVOQyhyZ2IyNCwgb3B0KTsgXAorICAgIElOUFVUX0ZVTkMoYmdyMjQsIG9wdCkKKworI2lmIEFSQ0hfWDg2XzMyCitJTlBVVF9GVU5DUyhtbXgpOworI2VuZGlmCitJTlBVVF9GVU5DUyhzc2UyKTsKK0lOUFVUX0ZVTkNTKHNzc2UzKTsKK0lOUFVUX0ZVTkNTKGF2eCk7CisKK2F2X2NvbGQgdm9pZCBmZl9zd3NfaW5pdF9zd3NjYWxlX3g4NihTd3NDb250ZXh0ICpjKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyNpZiBIQVZFX01NWF9JTkxJTkUKKyAgICBpZiAoSU5MSU5FX01NWChjcHVfZmxhZ3MpKQorICAgICAgICBzd3NfaW5pdF9zd3NjYWxlX21teChjKTsKKyNlbmRpZgorI2lmIEhBVkVfTU1YRVhUX0lOTElORQorICAgIGlmIChJTkxJTkVfTU1YRVhUKGNwdV9mbGFncykpCisgICAgICAgIHN3c19pbml0X3N3c2NhbGVfbW14ZXh0KGMpOworICAgIGlmIChjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19TU0UzKXsKKyAgICAgICAgaWYoYy0+dXNlX21teF92ZmlsdGVyICYmICEoYy0+ZmxhZ3MgJiBTV1NfQUNDVVJBVEVfUk5EKSkKKyAgICAgICAgICAgIGMtPnl1djJwbGFuZVggPSB5dXYyeXV2WF9zc2UzOworICAgIH0KKyNlbmRpZgorCisjZGVmaW5lIEFTU0lHTl9TQ0FMRV9GVU5DMihoc2NhbGVmbiwgZmlsdGVyc2l6ZSwgb3B0MSwgb3B0MikgZG8geyBcCisgICAgaWYgKGMtPnNyY0JwYyA9PSA4KSB7IFwKKyAgICAgICAgaHNjYWxlZm4gPSBjLT5kc3RCcGMgPD0gMTQgPyBmZl9oc2NhbGU4dG8xNV8gIyMgZmlsdGVyc2l6ZSAjIyBfICMjIG9wdDIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaHNjYWxlOHRvMTlfICMjIGZpbHRlcnNpemUgIyMgXyAjIyBvcHQxOyBcCisgICAgfSBlbHNlIGlmIChjLT5zcmNCcGMgPT0gOSkgeyBcCisgICAgICAgIGhzY2FsZWZuID0gYy0+ZHN0QnBjIDw9IDE0ID8gZmZfaHNjYWxlOXRvMTVfICMjIGZpbHRlcnNpemUgIyMgXyAjIyBvcHQyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2hzY2FsZTl0bzE5XyAjIyBmaWx0ZXJzaXplICMjIF8gIyMgb3B0MTsgXAorICAgIH0gZWxzZSBpZiAoYy0+c3JjQnBjID09IDEwKSB7IFwKKyAgICAgICAgaHNjYWxlZm4gPSBjLT5kc3RCcGMgPD0gMTQgPyBmZl9oc2NhbGUxMHRvMTVfICMjIGZpbHRlcnNpemUgIyMgXyAjIyBvcHQyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2hzY2FsZTEwdG8xOV8gIyMgZmlsdGVyc2l6ZSAjIyBfICMjIG9wdDE7IFwKKyAgICB9IGVsc2UgaWYgKGMtPnNyY0JwYyA9PSAxMikgeyBcCisgICAgICAgIGhzY2FsZWZuID0gYy0+ZHN0QnBjIDw9IDE0ID8gZmZfaHNjYWxlMTJ0bzE1XyAjIyBmaWx0ZXJzaXplICMjIF8gIyMgb3B0MiA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9oc2NhbGUxMnRvMTlfICMjIGZpbHRlcnNpemUgIyMgXyAjIyBvcHQxOyBcCisgICAgfSBlbHNlIGlmIChjLT5zcmNCcGMgPT0gMTQgfHwgKChjLT5zcmNGb3JtYXQ9PUFWX1BJWF9GTVRfUEFMOHx8aXNBbnlSR0IoYy0+c3JjRm9ybWF0KSkgJiYgYXZfcGl4X2ZtdF9kZXNjX2dldChjLT5zcmNGb3JtYXQpLT5jb21wWzBdLmRlcHRoX21pbnVzMTwxNSkpIHsgXAorICAgICAgICBoc2NhbGVmbiA9IGMtPmRzdEJwYyA8PSAxNCA/IGZmX2hzY2FsZTE0dG8xNV8gIyMgZmlsdGVyc2l6ZSAjIyBfICMjIG9wdDIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaHNjYWxlMTR0bzE5XyAjIyBmaWx0ZXJzaXplICMjIF8gIyMgb3B0MTsgXAorICAgIH0gZWxzZSB7IC8qIGMtPnNyY0JwYyA9PSAxNiAqLyBcCisgICAgICAgIGF2X2Fzc2VydDAoYy0+c3JjQnBjID09IDE2KTtcCisgICAgICAgIGhzY2FsZWZuID0gYy0+ZHN0QnBjIDw9IDE0ID8gZmZfaHNjYWxlMTZ0bzE1XyAjIyBmaWx0ZXJzaXplICMjIF8gIyMgb3B0MiA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9oc2NhbGUxNnRvMTlfICMjIGZpbHRlcnNpemUgIyMgXyAjIyBvcHQxOyBcCisgICAgfSBcCit9IHdoaWxlICgwKQorI2RlZmluZSBBU1NJR05fTU1YX1NDQUxFX0ZVTkMoaHNjYWxlZm4sIGZpbHRlcnNpemUsIG9wdDEsIG9wdDIpIFwKKyAgICBzd2l0Y2ggKGZpbHRlcnNpemUpIHsgXAorICAgIGNhc2UgNDogIEFTU0lHTl9TQ0FMRV9GVU5DMihoc2NhbGVmbiwgNCwgb3B0MSwgb3B0Mik7IGJyZWFrOyBcCisgICAgY2FzZSA4OiAgQVNTSUdOX1NDQUxFX0ZVTkMyKGhzY2FsZWZuLCA4LCBvcHQxLCBvcHQyKTsgYnJlYWs7IFwKKyAgICBkZWZhdWx0OiBBU1NJR05fU0NBTEVfRlVOQzIoaHNjYWxlZm4sIFgsIG9wdDEsIG9wdDIpOyBicmVhazsgXAorICAgIH0KKyNkZWZpbmUgQVNTSUdOX1ZTQ0FMRVhfRlVOQyh2c2NhbGVmbiwgb3B0LCBkb18xNl9jYXNlLCBjb25kaXRpb25fOGJpdCkgXAorc3dpdGNoKGMtPmRzdEJwYyl7IFwKKyAgICBjYXNlIDE2OiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fMTZfY2FzZTsgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgY2FzZSAxMDogaWYgKCFpc0JFKGMtPmRzdEZvcm1hdCkpIHZzY2FsZWZuID0gZmZfeXV2MnBsYW5lWF8xMF8gIyMgb3B0OyBicmVhazsgXAorICAgIGNhc2UgOTogIGlmICghaXNCRShjLT5kc3RGb3JtYXQpKSB2c2NhbGVmbiA9IGZmX3l1djJwbGFuZVhfOV8gICMjIG9wdDsgYnJlYWs7IFwKKyAgICBjYXNlIDg6IGlmICgoY29uZGl0aW9uXzhiaXQpICYmICFjLT51c2VfbW14X3ZmaWx0ZXIpIHZzY2FsZWZuID0gZmZfeXV2MnBsYW5lWF84XyAgIyMgb3B0OyBicmVhazsgXAorICAgIH0KKyNkZWZpbmUgQVNTSUdOX1ZTQ0FMRV9GVU5DKHZzY2FsZWZuLCBvcHQxLCBvcHQyLCBvcHQyY2hrKSBcCisgICAgc3dpdGNoKGMtPmRzdEJwYyl7IFwKKyAgICBjYXNlIDE2OiBpZiAoIWlzQkUoYy0+ZHN0Rm9ybWF0KSkgICAgICAgICAgICB2c2NhbGVmbiA9IGZmX3l1djJwbGFuZTFfMTZfICMjIG9wdDE7IGJyZWFrOyBcCisgICAgY2FzZSAxMDogaWYgKCFpc0JFKGMtPmRzdEZvcm1hdCkgJiYgb3B0MmNoaykgdnNjYWxlZm4gPSBmZl95dXYycGxhbmUxXzEwXyAjIyBvcHQyOyBicmVhazsgXAorICAgIGNhc2UgOTogIGlmICghaXNCRShjLT5kc3RGb3JtYXQpICYmIG9wdDJjaGspIHZzY2FsZWZuID0gZmZfeXV2MnBsYW5lMV85XyAgIyMgb3B0MjsgIGJyZWFrOyBcCisgICAgY2FzZSA4OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNjYWxlZm4gPSBmZl95dXYycGxhbmUxXzhfICAjIyBvcHQxOyAgYnJlYWs7IFwKKyAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKGMtPmRzdEJwYz44KTsgXAorICAgIH0KKyNkZWZpbmUgY2FzZV9yZ2IoeCwgWCwgb3B0KSBcCisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF8gIyMgWDogXAorICAgICAgICAgICAgYy0+bHVtVG9ZVjEyID0gZmZfICMjIHggIyMgVG9ZXyAjIyBvcHQ7IFwKKyAgICAgICAgICAgIGlmICghYy0+Y2hyU3JjSFN1YlNhbXBsZSkgXAorICAgICAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGZmXyAjIyB4ICMjIFRvVVZfICMjIG9wdDsgXAorICAgICAgICAgICAgYnJlYWsKKyNpZiBBUkNIX1g4Nl8zMgorICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBBU1NJR05fTU1YX1NDQUxFX0ZVTkMoYy0+aHlTY2FsZSwgYy0+aEx1bUZpbHRlclNpemUsIG1teCwgbW14KTsKKyAgICAgICAgQVNTSUdOX01NWF9TQ0FMRV9GVU5DKGMtPmhjU2NhbGUsIGMtPmhDaHJGaWx0ZXJTaXplLCBtbXgsIG1teCk7CisgICAgICAgIEFTU0lHTl9WU0NBTEVfRlVOQyhjLT55dXYycGxhbmUxLCBtbXgsIG1teGV4dCwgY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfTU1YRVhUKTsKKworICAgICAgICBzd2l0Y2ggKGMtPnNyY0Zvcm1hdCkgeworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWUE4OgorICAgICAgICAgICAgYy0+bHVtVG9ZVjEyID0gZmZfeXV5dlRvWV9tbXg7CisgICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKQorICAgICAgICAgICAgICAgIGMtPmFscFRvWVYxMiA9IGZmX3V5dnlUb1lfbW14OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVlWNDIyOgorICAgICAgICAgICAgYy0+bHVtVG9ZVjEyID0gZmZfeXV5dlRvWV9tbXg7CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBmZl95dXl2VG9VVl9tbXg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1VZVlk0MjI6CisgICAgICAgICAgICBjLT5sdW1Ub1lWMTIgPSBmZl91eXZ5VG9ZX21teDsKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGZmX3V5dnlUb1VWX21teDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfTlYxMjoKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGZmX252MTJUb1VWX21teDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfTlYyMToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGZmX252MjFUb1VWX21teDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlX3JnYihyZ2IyNCwgUkdCMjQsIG1teCk7CisgICAgICAgIGNhc2VfcmdiKGJncjI0LCBCR1IyNCwgbW14KTsKKyAgICAgICAgY2FzZV9yZ2IoYmdyYSwgIEJHUkEsICBtbXgpOworICAgICAgICBjYXNlX3JnYihyZ2JhLCAgUkdCQSwgIG1teCk7CisgICAgICAgIGNhc2VfcmdiKGFiZ3IsICBBQkdSLCAgbW14KTsKKyAgICAgICAgY2FzZV9yZ2IoYXJnYiwgIEFSR0IsICBtbXgpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIEFTU0lHTl9WU0NBTEVYX0ZVTkMoYy0+eXV2MnBsYW5lWCwgbW14ZXh0LCAsIDEpOworICAgIH0KKyNlbmRpZiAvKiBBUkNIX1g4Nl8zMiAqLworI2RlZmluZSBBU1NJR05fU1NFX1NDQUxFX0ZVTkMoaHNjYWxlZm4sIGZpbHRlcnNpemUsIG9wdDEsIG9wdDIpIFwKKyAgICBzd2l0Y2ggKGZpbHRlcnNpemUpIHsgXAorICAgIGNhc2UgNDogIEFTU0lHTl9TQ0FMRV9GVU5DMihoc2NhbGVmbiwgNCwgb3B0MSwgb3B0Mik7IGJyZWFrOyBcCisgICAgY2FzZSA4OiAgQVNTSUdOX1NDQUxFX0ZVTkMyKGhzY2FsZWZuLCA4LCBvcHQxLCBvcHQyKTsgYnJlYWs7IFwKKyAgICBkZWZhdWx0OiBpZiAoZmlsdGVyc2l6ZSAmIDQpIEFTU0lHTl9TQ0FMRV9GVU5DMihoc2NhbGVmbiwgWDQsIG9wdDEsIG9wdDIpOyBcCisgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICBBU1NJR05fU0NBTEVfRlVOQzIoaHNjYWxlZm4sIFg4LCBvcHQxLCBvcHQyKTsgXAorICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgQVNTSUdOX1NTRV9TQ0FMRV9GVU5DKGMtPmh5U2NhbGUsIGMtPmhMdW1GaWx0ZXJTaXplLCBzc2UyLCBzc2UyKTsKKyAgICAgICAgQVNTSUdOX1NTRV9TQ0FMRV9GVU5DKGMtPmhjU2NhbGUsIGMtPmhDaHJGaWx0ZXJTaXplLCBzc2UyLCBzc2UyKTsKKyAgICAgICAgQVNTSUdOX1ZTQ0FMRVhfRlVOQyhjLT55dXYycGxhbmVYLCBzc2UyLCAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFWRV9BTElHTkVEX1NUQUNLIHx8IEFSQ0hfWDg2XzY0KTsKKyAgICAgICAgQVNTSUdOX1ZTQ0FMRV9GVU5DKGMtPnl1djJwbGFuZTEsIHNzZTIsIHNzZTIsIDEpOworCisgICAgICAgIHN3aXRjaCAoYy0+c3JjRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZQTg6CisgICAgICAgICAgICBjLT5sdW1Ub1lWMTIgPSBmZl95dXl2VG9ZX3NzZTI7CisgICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKQorICAgICAgICAgICAgICAgIGMtPmFscFRvWVYxMiA9IGZmX3V5dnlUb1lfc3NlMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVZVjQyMjoKKyAgICAgICAgICAgIGMtPmx1bVRvWVYxMiA9IGZmX3l1eXZUb1lfc3NlMjsKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGZmX3l1eXZUb1VWX3NzZTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1VZVlk0MjI6CisgICAgICAgICAgICBjLT5sdW1Ub1lWMTIgPSBmZl91eXZ5VG9ZX3NzZTI7CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBmZl91eXZ5VG9VVl9zc2UyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOgorICAgICAgICAgICAgYy0+Y2hyVG9ZVjEyID0gZmZfbnYxMlRvVVZfc3NlMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfTlYyMToKKyAgICAgICAgICAgIGMtPmNoclRvWVYxMiA9IGZmX252MjFUb1VWX3NzZTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZV9yZ2IocmdiMjQsIFJHQjI0LCBzc2UyKTsKKyAgICAgICAgY2FzZV9yZ2IoYmdyMjQsIEJHUjI0LCBzc2UyKTsKKyAgICAgICAgY2FzZV9yZ2IoYmdyYSwgIEJHUkEsICBzc2UyKTsKKyAgICAgICAgY2FzZV9yZ2IocmdiYSwgIFJHQkEsICBzc2UyKTsKKyAgICAgICAgY2FzZV9yZ2IoYWJnciwgIEFCR1IsICBzc2UyKTsKKyAgICAgICAgY2FzZV9yZ2IoYXJnYiwgIEFSR0IsICBzc2UyKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKSB7CisgICAgICAgIEFTU0lHTl9TU0VfU0NBTEVfRlVOQyhjLT5oeVNjYWxlLCBjLT5oTHVtRmlsdGVyU2l6ZSwgc3NzZTMsIHNzc2UzKTsKKyAgICAgICAgQVNTSUdOX1NTRV9TQ0FMRV9GVU5DKGMtPmhjU2NhbGUsIGMtPmhDaHJGaWx0ZXJTaXplLCBzc3NlMywgc3NzZTMpOworICAgICAgICBzd2l0Y2ggKGMtPnNyY0Zvcm1hdCkgeworICAgICAgICBjYXNlX3JnYihyZ2IyNCwgUkdCMjQsIHNzc2UzKTsKKyAgICAgICAgY2FzZV9yZ2IoYmdyMjQsIEJHUjI0LCBzc3NlMyk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoRVhURVJOQUxfU1NFNChjcHVfZmxhZ3MpKSB7CisgICAgICAgIC8qIFh0bzE1IGRvbid0IG5lZWQgc3BlY2lhbCBzc2U0IGZ1bmN0aW9ucyAqLworICAgICAgICBBU1NJR05fU1NFX1NDQUxFX0ZVTkMoYy0+aHlTY2FsZSwgYy0+aEx1bUZpbHRlclNpemUsIHNzZTQsIHNzc2UzKTsKKyAgICAgICAgQVNTSUdOX1NTRV9TQ0FMRV9GVU5DKGMtPmhjU2NhbGUsIGMtPmhDaHJGaWx0ZXJTaXplLCBzc2U0LCBzc3NlMyk7CisgICAgICAgIEFTU0lHTl9WU0NBTEVYX0ZVTkMoYy0+eXV2MnBsYW5lWCwgc3NlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQkUoYy0+ZHN0Rm9ybWF0KSkgYy0+eXV2MnBsYW5lWCA9IGZmX3l1djJwbGFuZVhfMTZfc3NlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQVZFX0FMSUdORURfU1RBQ0sgfHwgQVJDSF9YODZfNjQpOworICAgICAgICBpZiAoYy0+ZHN0QnBjID09IDE2ICYmICFpc0JFKGMtPmRzdEZvcm1hdCkpCisgICAgICAgICAgICBjLT55dXYycGxhbmUxID0gZmZfeXV2MnBsYW5lMV8xNl9zc2U0OworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkgeworICAgICAgICBBU1NJR05fVlNDQUxFWF9GVU5DKGMtPnl1djJwbGFuZVgsIGF2eCwgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBVkVfQUxJR05FRF9TVEFDSyB8fCBBUkNIX1g4Nl82NCk7CisgICAgICAgIEFTU0lHTl9WU0NBTEVfRlVOQyhjLT55dXYycGxhbmUxLCBhdngsIGF2eCwgMSk7CisKKyAgICAgICAgc3dpdGNoIChjLT5zcmNGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVWVY0MjI6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBmZl95dXl2VG9VVl9hdng7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1VZVlk0MjI6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBmZl91eXZ5VG9VVl9hdng7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX05WMTI6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBmZl9udjEyVG9VVl9hdng7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX05WMjE6CisgICAgICAgICAgICBjLT5jaHJUb1lWMTIgPSBmZl9udjIxVG9VVl9hdng7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZV9yZ2IocmdiMjQsIFJHQjI0LCBhdngpOworICAgICAgICBjYXNlX3JnYihiZ3IyNCwgQkdSMjQsIGF2eCk7CisgICAgICAgIGNhc2VfcmdiKGJncmEsICBCR1JBLCAgYXZ4KTsKKyAgICAgICAgY2FzZV9yZ2IocmdiYSwgIFJHQkEsICBhdngpOworICAgICAgICBjYXNlX3JnYihhYmdyLCAgQUJHUiwgIGF2eCk7CisgICAgICAgIGNhc2VfcmdiKGFyZ2IsICBBUkdCLCAgYXZ4KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUveDg2L3N3c2NhbGVfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni9zd3NjYWxlX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhNjA2YwotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni9zd3NjYWxlX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwxNTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMTEgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3N3c2NhbGVfaW50ZXJuYWwuaCIKKworI3VuZGVmIFJFQUxfTU9WTlRRCisjdW5kZWYgTU9WTlRRCisjdW5kZWYgTU9WTlRRMgorI3VuZGVmIFBSRUZFVENICisKKworI2lmIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUCisjZGVmaW5lIFJFQUxfTU9WTlRRKGEsYikgIm1vdm50cSAiICNhICIsICIgI2IgIiBcblx0IgorI2RlZmluZSBNT1ZOVFEyICJtb3ZudHEgIgorI2Vsc2UKKyNkZWZpbmUgUkVBTF9NT1ZOVFEoYSxiKSAibW92cSAiICNhICIsICIgI2IgIiBcblx0IgorI2RlZmluZSBNT1ZOVFEyICJtb3ZxICIKKyNlbmRpZgorI2RlZmluZSBNT1ZOVFEoYSxiKSAgUkVBTF9NT1ZOVFEoYSxiKQorCisjaWYgIUNPTVBJTEVfVEVNUExBVEVfTU1YRVhUCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkCitkaXRoZXJfOHRvMTYoY29uc3QgdWludDhfdCAqc3JjRGl0aGVyLCBpbnQgcm90KQoreworICAgIGlmIChyb3QpIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgicHhvciAgICAgICUlbW0wLCAlJW1tMFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdnEgICAgICAgKCUwKSwgJSVtbTNcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZxICAgICAgJSVtbTMsICUlbW00XG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicHNybHEgICAgICAgJDI0LCAlJW1tM1xuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgInBzbGxxICAgICAgICQ0MCwgJSVtbTRcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICJwb3IgICAgICAgJSVtbTQsICUlbW0zXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibW92cSAgICAgICUlbW0zLCAlJW1tNFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTNcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTAsICUlbW00XG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OiAiciIoc3JjRGl0aGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgicHhvciAgICAgICUlbW0wLCAlJW1tMFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdnEgICAgICAgKCUwKSwgJSVtbTNcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZxICAgICAgJSVtbTMsICUlbW00XG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW0wLCAlJW1tM1xuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgInB1bnBja2hidyAlJW1tMCwgJSVtbTRcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgIDo6ICJyIihzcmNEaXRoZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgUkVOQU1FKHl1djJ5dXZYKShjb25zdCBpbnQxNl90ICpmaWx0ZXIsIGludCBmaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKnNyYywgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaXRoZXIsIGludCBvZmZzZXQpCit7CisgICAgZGl0aGVyXzh0bzE2KGRpdGhlciwgb2Zmc2V0KTsKKyAgICBmaWx0ZXJTaXplLS07CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdmQgJTAsICUlbW0xXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAlJW1tMSwgJSVtbTFcblx0IgorICAgICAgICAicHVucGNrbGRxICUlbW0xLCAlJW1tMVxuXHQiCisgICAgICAgICJwc2xsdyAgICAgICAgJDMsICUlbW0xXG5cdCIKKyAgICAgICAgInBhZGR3ICAgICAlJW1tMSwgJSVtbTNcblx0IgorICAgICAgICAicGFkZHcgICAgICUlbW0xLCAlJW1tNFxuXHQiCisgICAgICAgICJwc3JhdyAgICAgICAgJDQsICUlbW0zXG5cdCIKKyAgICAgICAgInBzcmF3ICAgICAgICAkNCwgJSVtbTRcblx0IgorICAgICAgICA6OiJtIihmaWx0ZXJTaXplKQorICAgICApOworCisgICAgX19hc21fXyB2b2xhdGlsZShcCisgICAgICAgICJtb3ZxICAgICUlbW0zLCAlJW1tNlxuXHQiCisgICAgICAgICJtb3ZxICAgICUlbW00LCAlJW1tN1xuXHQiCisgICAgICAgICJtb3ZsICUzLCAlJWVjeFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMCwgJSUiUkVHX2QiICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAgICglJSJSRUdfZCIpLCAlJSJSRUdfUyIgIFxuXHQiXAorICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgXG5cdCIgLyogRklYTUUgVW5yb2xsPyAqL1wKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgICA4KCUlIlJFR19kIiksICUlbW0wICAgICAgXG5cdCIgLyogZmlsdGVyQ29lZmYgKi9cCisgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICglJSJSRUdfUyIsICUlIlJFR19jIiwgMiksICUlbW0yICAgICAgXG5cdCIgLyogc3JjRGF0YSAqL1wKKyAgICAgICAgIm1vdnEgICAgICAgICAgICAgICA4KCUlIlJFR19TIiwgJSUiUkVHX2MiLCAyKSwgJSVtbTUgICAgICBcblx0IiAvKiBzcmNEYXRhICovXAorICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMTYsICUlIlJFR19kIiAgXG5cdCJcCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICBcblx0IlwKKyAgICAgICAgInRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgJSUiUkVHX1MiLCAlJSJSRUdfUyIgIFxuXHQiXAorICAgICAgICAicG11bGh3ICAgICAgICAgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0yICAgICAgXG5cdCJcCisgICAgICAgICJwbXVsaHcgICAgICAgICAgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTUgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tMyAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW00ICAgICAgXG5cdCJcCisgICAgICAgICIgam56ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmF3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQzLCAlJW1tMyAgICAgIFxuXHQiXAorICAgICAgICAicHNyYXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDMsICUlbW00ICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICAgICAgICAgICAgICAlJW1tNCwgJSVtbTMgICAgICBcblx0IgorICAgICAgICBNT1ZOVFEyICIgICAgICAgICAgICAgICAgICAgICAgICAgJSVtbTMsICglMSwgJSUiUkVHX2MiKVxuXHQiCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJSJSRUdfYyIgICAgICAgICBcblx0IlwKKyAgICAgICAgImNtcCAgICAgICAgICAgICAgICAgICAgICAgICAgJTIsICUlIlJFR19jIiAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAlJW1tNiwgJSVtbTNcblx0IgorICAgICAgICAibW92cSAgICAlJW1tNywgJSVtbTRcblx0IgorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTAsICUlIlJFR19kIiAgXG5cdCJcCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICBcblx0IlwKKyAgICAgICAgImpiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICA6OiAiZyIgKGZpbHRlciksCisgICAgICAgICAgICJyIiAoZGVzdC1vZmZzZXQpLCAiZyIgKCh4ODZfcmVnKShkc3RXK29mZnNldCkpLCAibSIgKG9mZnNldCkKKyAgICAgICAgOiAiJSJSRUdfZCwgIiUiUkVHX1MsICIlIlJFR19jCisgICAgKTsKK30KKworI2RlZmluZSBZU0NBTEVZVVYyUEFDS0VEWF9VViBcCisgICAgX19hc21fXyB2b2xhdGlsZShcCisgICAgICAgICJ4b3IgICAgICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICAgIFxuXHQiXAorICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibGVhICJDSFJfTU1YX0ZJTFRFUl9PRkZTRVQiKCUwKSwgJSUiUkVHX2QiICAgICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgKCUlIlJFR19kIiksICUlIlJFR19TIiAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICAgICAgIlZST1VOREVSX09GRlNFVCIoJTApLCAlJW1tMyAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTQgICAgICAgICBcblx0IlwKKyAgICAgICAgIi5wMmFsaWduICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgICAgICAgICAgIDgoJSUiUkVHX2QiKSwgJSVtbTAgICAgICAgICBcblx0IiAvKiBmaWx0ZXJDb2VmZiAqL1wKKyAgICAgICAgIm1vdnEgICAgICglJSJSRUdfUyIsICUlIlJFR19hIiksICUlbW0yICAgICAgICAgXG5cdCIgLyogVXNyY0RhdGEgKi9cCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICU2LCAlJSJSRUdfUyIgICAgIFxuXHQiIFwKKyAgICAgICAgIm1vdnEgICAgICglJSJSRUdfUyIsICUlIlJFR19hIiksICUlbW01ICAgICAgICAgXG5cdCIgLyogVnNyY0RhdGEgKi9cCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJSJSRUdfZCIgICAgIFxuXHQiXAorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICAgICBcblx0IlwKKyAgICAgICAgInBtdWxodyAgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0yICAgICAgICAgXG5cdCJcCisgICAgICAgICJwbXVsaHcgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tNSAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgICAgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTMgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW00ICAgICAgICAgXG5cdCJcCisgICAgICAgICJ0ZXN0ICAgICAgICAgICAgICAgICAgJSUiUkVHX1MiLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICAgICAiIGpueiAgICAgICAgICAgICAgICAgICAgICAgICAyYiAgICAgICAgICAgICAgICBcblx0IlwKKworI2RlZmluZSBZU0NBTEVZVVYyUEFDS0VEWF9ZQShvZmZzZXQsY29lZmYsc3JjMSxzcmMyLGRzdDEsZHN0MikgXAorICAgICJsZWEgICAgICAgICAgICAgICAgIm9mZnNldCIoJTApLCAlJSJSRUdfZCIgICAgIFxuXHQiXAorICAgICJtb3YgICAgICAgICAgICAgICAgICglJSJSRUdfZCIpLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICJtb3ZxICAgICAgIlZST1VOREVSX09GRlNFVCIoJTApLCAiI2RzdDEiICAgICAgIFxuXHQiXAorICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAiI2RzdDEiLCAiI2RzdDIiICAgICAgIFxuXHQiXAorICAgICIucDJhbGlnbiAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICJtb3ZxICAgICAgICAgICAgICAgOCglJSJSRUdfZCIpLCAiI2NvZWZmIiAgICAgIFxuXHQiIC8qIGZpbHRlckNvZWZmICovXAorICAgICJtb3ZxICAoJSUiUkVHX1MiLCAlJSJSRUdfYSIsIDIpLCAiI3NyYzEiICAgICAgIFxuXHQiIC8qIFkxc3JjRGF0YSAqL1wKKyAgICAibW92cSA4KCUlIlJFR19TIiwgJSUiUkVHX2EiLCAyKSwgIiNzcmMyIiAgICAgICBcblx0IiAvKiBZMnNyY0RhdGEgKi9cCisgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgICAkMTYsICUlIlJFR19kIiAgICAgICAgICAgIFxuXHQiXAorICAgICJtb3YgICAgICAgICAgICAgICAgICglJSJSRUdfZCIpLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICJwbXVsaHcgICAgICAgICAgICAgICAgICIjY29lZmYiLCAiI3NyYzEiICAgICAgIFxuXHQiXAorICAgICJwbXVsaHcgICAgICAgICAgICAgICAgICIjY29lZmYiLCAiI3NyYzIiICAgICAgIFxuXHQiXAorICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAiI3NyYzEiLCAiI2RzdDEiICAgICAgIFxuXHQiXAorICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAiI3NyYzIiLCAiI2RzdDIiICAgICAgIFxuXHQiXAorICAgICJ0ZXN0ICAgICAgICAgICAgICAgICAgJSUiUkVHX1MiLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICIgam56ICAgICAgICAgICAgICAgICAgICAgICAgIDJiICAgICAgICAgICAgICAgIFxuXHQiXAorCisjZGVmaW5lIFlTQ0FMRVlVVjJQQUNLRURYIFwKKyAgICBZU0NBTEVZVVYyUEFDS0VEWF9VViBcCisgICAgWVNDQUxFWVVWMlBBQ0tFRFhfWUEoTFVNX01NWF9GSUxURVJfT0ZGU0VULCUlbW0wLCUlbW0yLCUlbW01LCUlbW0xLCUlbW03KSBcCisKKyNkZWZpbmUgWVNDQUxFWVVWMlBBQ0tFRFhfRU5EICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6OiAiciIgKCZjLT5yZWREaXRoZXIpLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAibSIgKGR1bW15KSwgIm0iIChkdW1teSksICJtIiAoZHVtbXkpLFwKKyAgICAgICAgICAgICJyIiAoZGVzdCksICJtIiAoZHN0V19yZWcpLCAibSIodXZfb2ZmKSBcCisgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoYkY4LGJGQykgXAorICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfZCwgIiUiUkVHX1MgICAgICAgICAgICBcCisgICAgKTsKKworI2RlZmluZSBZU0NBTEVZVVYyUEFDS0VEWF9BQ0NVUkFURV9VViBcCisgICAgX19hc21fXyB2b2xhdGlsZShcCisgICAgICAgICJ4b3IgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibGVhICJDSFJfTU1YX0ZJTFRFUl9PRkZTRVQiKCUwKSwgJSUiUkVHX2QiICAgICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgKCUlIlJFR19kIiksICUlIlJFR19TIiAgICAgXG5cdCJcCisgICAgICAgICJweG9yICAgICAgICAgICAgICAgICAgICAgICUlbW00LCAlJW1tNCAgICAgICAgIFxuXHQiXAorICAgICAgICAicHhvciAgICAgICAgICAgICAgICAgICAgICAlJW1tNSwgJSVtbTUgICAgICAgICBcblx0IlwKKyAgICAgICAgInB4b3IgICAgICAgICAgICAgICAgICAgICAgJSVtbTYsICUlbW02ICAgICAgICAgXG5cdCJcCisgICAgICAgICJweG9yICAgICAgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tNyAgICAgICAgIFxuXHQiXAorICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICAgICAoJSUiUkVHX1MiLCAlJSJSRUdfYSIpLCAlJW1tMCAgICAgICAgIFxuXHQiIC8qIFVzcmNEYXRhICovXAorICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAlNiwgJSUiUkVHX1MiICAgICAgXG5cdCIgXAorICAgICAgICAibW92cSAgICAgKCUlIlJFR19TIiwgJSUiUkVHX2EiKSwgJSVtbTIgICAgICAgICBcblx0IiAvKiBWc3JjRGF0YSAqL1wKKyAgICAgICAgIm1vdiAiU1RSKEFQQ0tfUFRSMikiKCUlIlJFR19kIiksICUlIlJFR19TIiAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICAgICAoJSUiUkVHX1MiLCAlJSJSRUdfYSIpLCAlJW1tMSAgICAgICAgIFxuXHQiIC8qIFVzcmNEYXRhICovXAorICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTMgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2x3ZCAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tod2QgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMyAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAiU1RSKEFQQ0tfQ09FRikiKCUlIlJFR19kIiksJSVtbTEgICAgICAgICBcblx0IiAvKiBmaWx0ZXJDb2VmZiAqL1wKKyAgICAgICAgInBtYWRkd2QgICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgICAgXG5cdCJcCisgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMyAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZGQgICAgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTQgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGRkICAgICAgICAgICAgICAgICAgICAgJSVtbTMsICUlbW01ICAgICAgICAgXG5cdCJcCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICU2LCAlJSJSRUdfUyIgICAgICBcblx0IiBcCisgICAgICAgICJtb3ZxICAgICAoJSUiUkVHX1MiLCAlJSJSRUdfYSIpLCAlJW1tMyAgICAgICAgIFxuXHQiIC8qIFZzcmNEYXRhICovXAorICAgICAgICAibW92ICJTVFIoQVBDS19TSVpFKSIoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICAgICBcblx0IlwKKyAgICAgICAgImFkZCAgICAgICAgICAgJCJTVFIoQVBDS19TSVpFKSIsICUlIlJFR19kIiAgICAgXG5cdCJcCisgICAgICAgICJ0ZXN0ICAgICAgICAgICAgICAgICAgJSUiUkVHX1MiLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTAgICAgICAgICBcblx0IlwKKyAgICAgICAgInB1bnBja2x3ZCAgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgICAgICAgXG5cdCJcCisgICAgICAgICJwdW5wY2tod2QgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMCAgICAgICAgIFxuXHQiXAorICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTIgICAgICAgICBcblx0IlwKKyAgICAgICAgInBtYWRkd2QgICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWRkZCAgICAgICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tNiAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZGQgICAgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTcgICAgICAgICBcblx0IlwKKyAgICAgICAgIiBqbnogICAgICAgICAgICAgICAgICAgICAgICAgMmIgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJW1tNCAgICAgICAgIFxuXHQiXAorICAgICAgICAicHNyYWQgICAgICAgICAgICAgICAgICAgICAgICQxNiwgJSVtbTUgICAgICAgICBcblx0IlwKKyAgICAgICAgInBzcmFkICAgICAgICAgICAgICAgICAgICAgICAkMTYsICUlbW02ICAgICAgICAgXG5cdCJcCisgICAgICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJW1tNyAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgICJWUk9VTkRFUl9PRkZTRVQiKCUwKSwgJSVtbTAgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhY2tzc2R3ICAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW00ICAgICAgICAgXG5cdCJcCisgICAgICAgICJwYWNrc3NkdyAgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tNiAgICAgICAgIFxuXHQiXAorICAgICAgICAicGFkZHcgICAgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTQgICAgICAgICBcblx0IlwKKyAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW02ICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAgICUlbW00LCAiVV9URU1QIiglMCkgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgICAlJW1tNiwgIlZfVEVNUCIoJTApICBcblx0IlwKKworI2RlZmluZSBZU0NBTEVZVVYyUEFDS0VEWF9BQ0NVUkFURV9ZQShvZmZzZXQpIFwKKyAgICAibGVhICAgICAgICAgICAgICAgICJvZmZzZXQiKCUwKSwgJSUiUkVHX2QiICAgICBcblx0IlwKKyAgICAibW92ICAgICAgICAgICAgICAgICAoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICAgICBcblx0IlwKKyAgICAicHhvciAgICAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTEgICAgICAgICBcblx0IlwKKyAgICAicHhvciAgICAgICAgICAgICAgICAgICAgICAlJW1tNSwgJSVtbTUgICAgICAgICBcblx0IlwKKyAgICAicHhvciAgICAgICAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTcgICAgICAgICBcblx0IlwKKyAgICAicHhvciAgICAgICAgICAgICAgICAgICAgICAlJW1tNiwgJSVtbTYgICAgICAgICBcblx0IlwKKyAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAibW92cSAgKCUlIlJFR19TIiwgJSUiUkVHX2EiLCAyKSwgJSVtbTAgICAgICAgICBcblx0IiAvKiBZMXNyY0RhdGEgKi9cCisgICAgIm1vdnEgOCglJSJSRUdfUyIsICUlIlJFR19hIiwgMiksICUlbW0yICAgICAgICAgXG5cdCIgLyogWTJzcmNEYXRhICovXAorICAgICJtb3YgIlNUUihBUENLX1BUUjIpIiglJSJSRUdfZCIpLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICJtb3ZxICAoJSUiUkVHX1MiLCAlJSJSRUdfYSIsIDIpLCAlJW1tNCAgICAgICAgIFxuXHQiIC8qIFkxc3JjRGF0YSAqL1wKKyAgICAibW92cSAgICAgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTMgICAgICAgICBcblx0IlwKKyAgICAicHVucGNrbHdkICAgICAgICAgICAgICAgICAlJW1tNCwgJSVtbTAgICAgICAgICBcblx0IlwKKyAgICAicHVucGNraHdkICAgICAgICAgICAgICAgICAlJW1tNCwgJSVtbTMgICAgICAgICBcblx0IlwKKyAgICAibW92cSAiU1RSKEFQQ0tfQ09FRikiKCUlIlJFR19kIiksICUlbW00ICAgICAgICAgXG5cdCIgLyogZmlsdGVyQ29lZmYgKi9cCisgICAgInBtYWRkd2QgICAgICAgICAgICAgICAgICAgJSVtbTQsICUlbW0wICAgICAgICAgXG5cdCJcCisgICAgInBtYWRkd2QgICAgICAgICAgICAgICAgICAgJSVtbTQsICUlbW0zICAgICAgICAgXG5cdCJcCisgICAgInBhZGRkICAgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0xICAgICAgICAgXG5cdCJcCisgICAgInBhZGRkICAgICAgICAgICAgICAgICAgICAgJSVtbTMsICUlbW01ICAgICAgICAgXG5cdCJcCisgICAgIm1vdnEgOCglJSJSRUdfUyIsICUlIlJFR19hIiwgMiksICUlbW0zICAgICAgICAgXG5cdCIgLyogWTJzcmNEYXRhICovXAorICAgICJtb3YgIlNUUihBUENLX1NJWkUpIiglJSJSRUdfZCIpLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICJhZGQgICAgICAgICAgICQiU1RSKEFQQ0tfU0laRSkiLCAlJSJSRUdfZCIgICAgIFxuXHQiXAorICAgICJ0ZXN0ICAgICAgICAgICAgICAgICAgJSUiUkVHX1MiLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tMCAgICAgICAgIFxuXHQiXAorICAgICJwdW5wY2tsd2QgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgICAgIFxuXHQiXAorICAgICJwdW5wY2tod2QgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMCAgICAgICAgIFxuXHQiXAorICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAgICUlbW00LCAlJW1tMiAgICAgICAgIFxuXHQiXAorICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAgICUlbW00LCAlJW1tMCAgICAgICAgIFxuXHQiXAorICAgICJwYWRkZCAgICAgICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tNyAgICAgICAgIFxuXHQiXAorICAgICJwYWRkZCAgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tNiAgICAgICAgIFxuXHQiXAorICAgICIgam56ICAgICAgICAgICAgICAgICAgICAgICAgIDJiICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJW1tMSAgICAgICAgIFxuXHQiXAorICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJW1tNSAgICAgICAgIFxuXHQiXAorICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJW1tNyAgICAgICAgIFxuXHQiXAorICAgICJwc3JhZCAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJW1tNiAgICAgICAgIFxuXHQiXAorICAgICJtb3ZxICAgICAgIlZST1VOREVSX09GRlNFVCIoJTApLCAlJW1tMCAgICAgICAgIFxuXHQiXAorICAgICJwYWNrc3NkdyAgICAgICAgICAgICAgICAgICUlbW01LCAlJW1tMSAgICAgICAgIFxuXHQiXAorICAgICJwYWNrc3NkdyAgICAgICAgICAgICAgICAgICUlbW02LCAlJW1tNyAgICAgICAgIFxuXHQiXAorICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMSAgICAgICAgIFxuXHQiXAorICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tNyAgICAgICAgIFxuXHQiXAorICAgICJtb3ZxICAgICAgICAgICAgICAgIlVfVEVNUCIoJTApLCAlJW1tMyAgICAgICAgIFxuXHQiXAorICAgICJtb3ZxICAgICAgICAgICAgICAgIlZfVEVNUCIoJTApLCAlJW1tNCAgICAgICAgIFxuXHQiXAorCisjZGVmaW5lIFlTQ0FMRVlVVjJQQUNLRURYX0FDQ1VSQVRFIFwKKyAgICBZU0NBTEVZVVYyUEFDS0VEWF9BQ0NVUkFURV9VViBcCisgICAgWVNDQUxFWVVWMlBBQ0tFRFhfQUNDVVJBVEVfWUEoTFVNX01NWF9GSUxURVJfT0ZGU0VUKQorCisjZGVmaW5lIFlTQ0FMRVlVVjJSR0JYIFwKKyAgICAicHN1YncgICJVX09GRlNFVCIoJTApLCAlJW1tMyAgICAgICBcblx0IiAvKiAoVS0xMjgpOCovXAorICAgICJwc3VidyAgIlZfT0ZGU0VUIiglMCksICUlbW00ICAgICAgIFxuXHQiIC8qIChWLTEyOCk4Ki9cCisgICAgIm1vdnEgICAgICAgICAgICAlJW1tMywgJSVtbTIgICAgICAgXG5cdCIgLyogKFUtMTI4KTgqL1wKKyAgICAibW92cSAgICAgICAgICAgICUlbW00LCAlJW1tNSAgICAgICBcblx0IiAvKiAoVi0xMjgpOCovXAorICAgICJwbXVsaHcgIlVHX0NPRUZGIiglMCksICUlbW0zICAgICAgIFxuXHQiXAorICAgICJwbXVsaHcgIlZHX0NPRUZGIiglMCksICUlbW00ICAgICAgIFxuXHQiXAorICAgIC8qIG1tMj0oVS0xMjgpOCwgbW0zPXVnLCBtbTQ9dmcgbW01PShWLTEyOCk4ICovXAorICAgICJwbXVsaHcgIlVCX0NPRUZGIiglMCksICUlbW0yICAgICAgIFxuXHQiXAorICAgICJwbXVsaHcgIlZSX0NPRUZGIiglMCksICUlbW01ICAgICAgIFxuXHQiXAorICAgICJwc3VidyAgIllfT0ZGU0VUIiglMCksICUlbW0xICAgICAgIFxuXHQiIC8qIDgoWS0xNikqL1wKKyAgICAicHN1YncgICJZX09GRlNFVCIoJTApLCAlJW1tNyAgICAgICBcblx0IiAvKiA4KFktMTYpKi9cCisgICAgInBtdWxodyAgIllfQ09FRkYiKCUwKSwgJSVtbTEgICAgICAgXG5cdCJcCisgICAgInBtdWxodyAgIllfQ09FRkYiKCUwKSwgJSVtbTcgICAgICAgXG5cdCJcCisgICAgLyogbW0xPSBZMSwgbW0yPXViLCBtbTM9dWcsIG1tND12ZyBtbTU9dnIsIG1tNz1ZMiAqL1wKKyAgICAicGFkZHcgICAgICAgICAgICUlbW0zLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAibW92cSAgICAgICAgICAgICUlbW0yLCAlJW1tMCAgICAgICBcblx0IlwKKyAgICAibW92cSAgICAgICAgICAgICUlbW01LCAlJW1tNiAgICAgICBcblx0IlwKKyAgICAibW92cSAgICAgICAgICAgICUlbW00LCAlJW1tMyAgICAgICBcblx0IlwKKyAgICAicHVucGNrbHdkICAgICAgICUlbW0yLCAlJW1tMiAgICAgICBcblx0IlwKKyAgICAicHVucGNrbHdkICAgICAgICUlbW01LCAlJW1tNSAgICAgICBcblx0IlwKKyAgICAicHVucGNrbHdkICAgICAgICUlbW00LCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAicGFkZHcgICAgICAgICAgICUlbW0xLCAlJW1tMiAgICAgICBcblx0IlwKKyAgICAicGFkZHcgICAgICAgICAgICUlbW0xLCAlJW1tNSAgICAgICBcblx0IlwKKyAgICAicGFkZHcgICAgICAgICAgICUlbW0xLCAlJW1tNCAgICAgICBcblx0IlwKKyAgICAicHVucGNraHdkICAgICAgICUlbW0wLCAlJW1tMCAgICAgICBcblx0IlwKKyAgICAicHVucGNraHdkICAgICAgICUlbW02LCAlJW1tNiAgICAgICBcblx0IlwKKyAgICAicHVucGNraHdkICAgICAgICUlbW0zLCAlJW1tMyAgICAgICBcblx0IlwKKyAgICAicGFkZHcgICAgICAgICAgICUlbW03LCAlJW1tMCAgICAgICBcblx0IlwKKyAgICAicGFkZHcgICAgICAgICAgICUlbW03LCAlJW1tNiAgICAgICBcblx0IlwKKyAgICAicGFkZHcgICAgICAgICAgICUlbW03LCAlJW1tMyAgICAgICBcblx0IlwKKyAgICAvKiBtbTA9QjEsIG1tMj1CMiwgbW0zPUcyLCBtbTQ9RzEsIG1tNT1SMSwgbW02PVIyICovXAorICAgICJwYWNrdXN3YiAgICAgICAgJSVtbTAsICUlbW0yICAgICAgIFxuXHQiXAorICAgICJwYWNrdXN3YiAgICAgICAgJSVtbTYsICUlbW01ICAgICAgIFxuXHQiXAorICAgICJwYWNrdXN3YiAgICAgICAgJSVtbTMsICUlbW00ICAgICAgIFxuXHQiXAorCisjZGVmaW5lIFJFQUxfV1JJVEVCR1IzMihkc3QsIGRzdHcsIGluZGV4LCBiLCBnLCByLCBhLCBxMCwgcTIsIHEzLCB0KSBcCisgICAgIm1vdnEgICAgICAgIiNiIiwgIiNxMiIgICAgIFxuXHQiIC8qIEIgKi9cCisgICAgIm1vdnEgICAgICAgIiNyIiwgIiN0IiAgICAgIFxuXHQiIC8qIFIgKi9cCisgICAgInB1bnBja2xidyAgIiNnIiwgIiNiIiAgICAgIFxuXHQiIC8qIEdCR0JHQkdCIDAgKi9cCisgICAgInB1bnBja2xidyAgIiNhIiwgIiNyIiAgICAgIFxuXHQiIC8qIEFSQVJBUkFSIDAgKi9cCisgICAgInB1bnBja2hidyAgIiNnIiwgIiNxMiIgICAgIFxuXHQiIC8qIEdCR0JHQkdCIDIgKi9cCisgICAgInB1bnBja2hidyAgIiNhIiwgIiN0IiAgICAgIFxuXHQiIC8qIEFSQVJBUkFSIDIgKi9cCisgICAgIm1vdnEgICAgICAgIiNiIiwgIiNxMCIgICAgIFxuXHQiIC8qIEdCR0JHQkdCIDAgKi9cCisgICAgIm1vdnEgICAgICAiI3EyIiwgIiNxMyIgICAgIFxuXHQiIC8qIEdCR0JHQkdCIDIgKi9cCisgICAgInB1bnBja2x3ZCAgIiNyIiwgIiNxMCIgICAgIFxuXHQiIC8qIEFSR0JBUkdCIDAgKi9cCisgICAgInB1bnBja2h3ZCAgIiNyIiwgIiNiIiAgICAgIFxuXHQiIC8qIEFSR0JBUkdCIDEgKi9cCisgICAgInB1bnBja2x3ZCAgIiN0IiwgIiNxMiIgICAgIFxuXHQiIC8qIEFSR0JBUkdCIDIgKi9cCisgICAgInB1bnBja2h3ZCAgIiN0IiwgIiNxMyIgICAgIFxuXHQiIC8qIEFSR0JBUkdCIDMgKi9cCitcCisgICAgTU9WTlRRKCAgIHEwLCAgIChkc3QsIGluZGV4LCA0KSlcCisgICAgTU9WTlRRKCAgICBiLCAgOChkc3QsIGluZGV4LCA0KSlcCisgICAgTU9WTlRRKCAgIHEyLCAxNihkc3QsIGluZGV4LCA0KSlcCisgICAgTU9WTlRRKCAgIHEzLCAyNChkc3QsIGluZGV4LCA0KSlcCitcCisgICAgImFkZCAgICAgICQ4LCAiI2luZGV4IiAgICAgIFxuXHQiXAorICAgICJjbXAgICJkc3R3IiwgIiNpbmRleCIgICAgICBcblx0IlwKKyAgICAiIGpiICAgICAgMWIgICAgICAgICAgICAgICAgXG5cdCIKKyNkZWZpbmUgV1JJVEVCR1IzMihkc3QsIGRzdHcsIGluZGV4LCBiLCBnLCByLCBhLCBxMCwgcTIsIHEzLCB0KSAgUkVBTF9XUklURUJHUjMyKGRzdCwgZHN0dywgaW5kZXgsIGIsIGcsIHIsIGEsIHEwLCBxMiwgcTMsIHQpCisKK3N0YXRpYyB2b2lkIFJFTkFNRSh5dXYycmdiMzJfWF9hcikoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqbHVtRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqbHVtU3JjLCBpbnQgbHVtRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLCBjb25zdCBpbnQxNl90ICoqY2hyVVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclZTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHJGaWx0ZXJTaXplLCBjb25zdCBpbnQxNl90ICoqYWxwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywgaW50IGRzdFkpCit7CisgICAgeDg2X3JlZyBkdW1teT0wOworICAgIHg4Nl9yZWcgZHN0V19yZWcgPSBkc3RXOworICAgIHg4Nl9yZWcgdXZfb2ZmID0gYy0+dXZfb2ZmeDI7CisKKyAgICBpZiAoQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYy0+YWxwUGl4QnVmKSB7CisgICAgICAgIFlTQ0FMRVlVVjJQQUNLRURYX0FDQ1VSQVRFCisgICAgICAgIFlTQ0FMRVlVVjJSR0JYCisgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAgICUlbW0yLCAiVV9URU1QIiglMCkgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAgICUlbW00LCAiVl9URU1QIiglMCkgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAgICUlbW01LCAiWV9URU1QIiglMCkgIFxuXHQiCisgICAgICAgIFlTQ0FMRVlVVjJQQUNLRURYX0FDQ1VSQVRFX1lBKEFMUF9NTVhfRklMVEVSX09GRlNFVCkKKyAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAiWV9URU1QIiglMCksICUlbW01ICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICAgICAgICAgICAgICAgICAgICAgICAgJDMsICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICAgICAgICAgICAgICAgICAgICAgICAgJDMsICUlbW03ICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgV1JJVEVCR1IzMiglNCwgIiU1IiwgJSVSRUdhLCAlJW1tMywgJSVtbTQsICUlbW01LCAlJW1tMSwgJSVtbTAsICUlbW03LCAlJW1tMiwgJSVtbTYpCisgICAgICAgIFlTQ0FMRVlVVjJQQUNLRURYX0VORAorICAgIH0gZWxzZSB7CisgICAgICAgIFlTQ0FMRVlVVjJQQUNLRURYX0FDQ1VSQVRFCisgICAgICAgIFlTQ0FMRVlVVjJSR0JYCisgICAgICAgICJwY21wZXFkICUlbW03LCAlJW1tNyBcblx0IgorICAgICAgICBXUklURUJHUjMyKCU0LCAiJTUiLCAlJVJFR2EsICUlbW0yLCAlJW1tNCwgJSVtbTUsICUlbW03LCAlJW1tMCwgJSVtbTEsICUlbW0zLCAlJW1tNikKKyAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfRU5ECisgICAgfQorfQorCitzdGF0aWMgdm9pZCBSRU5BTUUoeXV2MnJnYjMyX1gpKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmx1bUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgaW50IGx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNockZpbHRlciwgY29uc3QgaW50MTZfdCAqKmNoclVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJWU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyRmlsdGVyU2l6ZSwgY29uc3QgaW50MTZfdCAqKmFscFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsIGludCBkc3RZKQoreworICAgIHg4Nl9yZWcgZHVtbXk9MDsKKyAgICB4ODZfcmVnIGRzdFdfcmVnID0gZHN0VzsKKyAgICB4ODZfcmVnIHV2X29mZiA9IGMtPnV2X29mZngyOworCisgICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikgeworICAgICAgICBZU0NBTEVZVVYyUEFDS0VEWAorICAgICAgICBZU0NBTEVZVVYyUkdCWAorICAgICAgICBZU0NBTEVZVVYyUEFDS0VEWF9ZQShBTFBfTU1YX0ZJTFRFUl9PRkZTRVQsICUlbW0wLCAlJW1tMywgJSVtbTYsICUlbW0xLCAlJW1tNykKKyAgICAgICAgInBzcmF3ICAgICAgICAgICAgICAgICAgICAgICAgJDMsICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICAgICAgICAgICAgICAgICAgICAgICAgJDMsICUlbW03ICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgV1JJVEVCR1IzMiglNCwgIiU1IiwgJSVSRUdhLCAlJW1tMiwgJSVtbTQsICUlbW01LCAlJW1tMSwgJSVtbTAsICUlbW03LCAlJW1tMywgJSVtbTYpCisgICAgICAgIFlTQ0FMRVlVVjJQQUNLRURYX0VORAorICAgIH0gZWxzZSB7CisgICAgICAgIFlTQ0FMRVlVVjJQQUNLRURYCisgICAgICAgIFlTQ0FMRVlVVjJSR0JYCisgICAgICAgICJwY21wZXFkICUlbW03LCAlJW1tNyBcblx0IgorICAgICAgICBXUklURUJHUjMyKCU0LCAiJTUiLCAlJVJFR2EsICUlbW0yLCAlJW1tNCwgJSVtbTUsICUlbW03LCAlJW1tMCwgJSVtbTEsICUlbW0zLCAlJW1tNikKKyAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfRU5ECisgICAgfQorfQorCisjZGVmaW5lIFJFQUxfV1JJVEVSR0IxNihkc3QsIGRzdHcsIGluZGV4KSBcCisgICAgInBhbmQgIk1BTkdMRShiRjgpIiwgJSVtbTIgIFxuXHQiIC8qIEIgKi9cCisgICAgInBhbmQgIk1BTkdMRShiRkMpIiwgJSVtbTQgIFxuXHQiIC8qIEcgKi9cCisgICAgInBhbmQgIk1BTkdMRShiRjgpIiwgJSVtbTUgIFxuXHQiIC8qIFIgKi9cCisgICAgInBzcmxxICAgICAgICAgICAkMywgJSVtbTIgIFxuXHQiXAorXAorICAgICJtb3ZxICAgICAgICAgJSVtbTIsICUlbW0xICBcblx0IlwKKyAgICAibW92cSAgICAgICAgICUlbW00LCAlJW1tMyAgXG5cdCJcCitcCisgICAgInB1bnBja2xidyAgICAlJW1tNywgJSVtbTMgIFxuXHQiXAorICAgICJwdW5wY2tsYncgICAgJSVtbTUsICUlbW0yICBcblx0IlwKKyAgICAicHVucGNraGJ3ICAgICUlbW03LCAlJW1tNCAgXG5cdCJcCisgICAgInB1bnBja2hidyAgICAlJW1tNSwgJSVtbTEgIFxuXHQiXAorXAorICAgICJwc2xscSAgICAgICAgICAgJDMsICUlbW0zICBcblx0IlwKKyAgICAicHNsbHEgICAgICAgICAgICQzLCAlJW1tNCAgXG5cdCJcCitcCisgICAgInBvciAgICAgICAgICAlJW1tMywgJSVtbTIgIFxuXHQiXAorICAgICJwb3IgICAgICAgICAgJSVtbTQsICUlbW0xICBcblx0IlwKK1wKKyAgICBNT1ZOVFEoJSVtbTIsICAoZHN0LCBpbmRleCwgMikpXAorICAgIE1PVk5UUSglJW1tMSwgOChkc3QsIGluZGV4LCAyKSlcCitcCisgICAgImFkZCAgICAgICAgICAgICAkOCwgIiNpbmRleCIgICBcblx0IlwKKyAgICAiY21wICAgICAgICAgImRzdHciLCAiI2luZGV4IiAgIFxuXHQiXAorICAgICIgamIgICAgICAgICAgICAgMWIgICAgICAgICAgICAgXG5cdCIKKyNkZWZpbmUgV1JJVEVSR0IxNihkc3QsIGRzdHcsIGluZGV4KSAgUkVBTF9XUklURVJHQjE2KGRzdCwgZHN0dywgaW5kZXgpCisKK3N0YXRpYyB2b2lkIFJFTkFNRSh5dXYycmdiNTY1X1hfYXIpKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmx1bUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipsdW1TcmMsIGludCBsdW1GaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLCBjb25zdCBpbnQxNl90ICoqY2hyVVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJWU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNockZpbHRlclNpemUsIGNvbnN0IGludDE2X3QgKiphbHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywgaW50IGRzdFkpCit7CisgICAgeDg2X3JlZyBkdW1teT0wOworICAgIHg4Nl9yZWcgZHN0V19yZWcgPSBkc3RXOworICAgIHg4Nl9yZWcgdXZfb2ZmID0gYy0+dXZfb2ZmeDI7CisKKyAgICBZU0NBTEVZVVYyUEFDS0VEWF9BQ0NVUkFURQorICAgIFlTQ0FMRVlVVjJSR0JYCisgICAgInB4b3IgJSVtbTcsICUlbW03IFxuXHQiCisgICAgLyogbW0yPUIsICUlbW00PUcsICUlbW01PVIsICUlbW03PTAgKi8KKyNpZmRlZiBESVRIRVIxWEJQUAorICAgICJwYWRkdXNiICJCTFVFX0RJVEhFUiIoJTApLCAlJW1tMlxuXHQiCisgICAgInBhZGR1c2IgIkdSRUVOX0RJVEhFUiIoJTApLCAlJW1tNFxuXHQiCisgICAgInBhZGR1c2IgIlJFRF9ESVRIRVIiKCUwKSwgJSVtbTVcblx0IgorI2VuZGlmCisgICAgV1JJVEVSR0IxNiglNCwgIiU1IiwgJSVSRUdhKQorICAgIFlTQ0FMRVlVVjJQQUNLRURYX0VORAorfQorCitzdGF0aWMgdm9pZCBSRU5BTUUoeXV2MnJnYjU2NV9YKShTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpsdW1GaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqbHVtU3JjLCBpbnQgbHVtRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNockZpbHRlciwgY29uc3QgaW50MTZfdCAqKmNoclVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqY2hyVlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHJGaWx0ZXJTaXplLCBjb25zdCBpbnQxNl90ICoqYWxwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsIGludCBkc3RZKQoreworICAgIHg4Nl9yZWcgZHVtbXk9MDsKKyAgICB4ODZfcmVnIGRzdFdfcmVnID0gZHN0VzsKKyAgICB4ODZfcmVnIHV2X29mZiA9IGMtPnV2X29mZngyOworCisgICAgWVNDQUxFWVVWMlBBQ0tFRFgKKyAgICBZU0NBTEVZVVYyUkdCWAorICAgICJweG9yICUlbW03LCAlJW1tNyBcblx0IgorICAgIC8qIG1tMj1CLCAlJW1tND1HLCAlJW1tNT1SLCAlJW1tNz0wICovCisjaWZkZWYgRElUSEVSMVhCUFAKKyAgICAicGFkZHVzYiAiQkxVRV9ESVRIRVIiKCUwKSwgJSVtbTIgIFxuXHQiCisgICAgInBhZGR1c2IgIkdSRUVOX0RJVEhFUiIoJTApLCAlJW1tNCAgXG5cdCIKKyAgICAicGFkZHVzYiAiUkVEX0RJVEhFUiIoJTApLCAlJW1tNSAgXG5cdCIKKyNlbmRpZgorICAgIFdSSVRFUkdCMTYoJTQsICIlNSIsICUlUkVHYSkKKyAgICBZU0NBTEVZVVYyUEFDS0VEWF9FTkQKK30KKworI2RlZmluZSBSRUFMX1dSSVRFUkdCMTUoZHN0LCBkc3R3LCBpbmRleCkgXAorICAgICJwYW5kICJNQU5HTEUoYkY4KSIsICUlbW0yICBcblx0IiAvKiBCICovXAorICAgICJwYW5kICJNQU5HTEUoYkY4KSIsICUlbW00ICBcblx0IiAvKiBHICovXAorICAgICJwYW5kICJNQU5HTEUoYkY4KSIsICUlbW01ICBcblx0IiAvKiBSICovXAorICAgICJwc3JscSAgICAgICAgICAgJDMsICUlbW0yICBcblx0IlwKKyAgICAicHNybHEgICAgICAgICAgICQxLCAlJW1tNSAgXG5cdCJcCitcCisgICAgIm1vdnEgICAgICAgICAlJW1tMiwgJSVtbTEgIFxuXHQiXAorICAgICJtb3ZxICAgICAgICAgJSVtbTQsICUlbW0zICBcblx0IlwKK1wKKyAgICAicHVucGNrbGJ3ICAgICUlbW03LCAlJW1tMyAgXG5cdCJcCisgICAgInB1bnBja2xidyAgICAlJW1tNSwgJSVtbTIgIFxuXHQiXAorICAgICJwdW5wY2toYncgICAgJSVtbTcsICUlbW00ICBcblx0IlwKKyAgICAicHVucGNraGJ3ICAgICUlbW01LCAlJW1tMSAgXG5cdCJcCitcCisgICAgInBzbGxxICAgICAgICAgICAkMiwgJSVtbTMgIFxuXHQiXAorICAgICJwc2xscSAgICAgICAgICAgJDIsICUlbW00ICBcblx0IlwKK1wKKyAgICAicG9yICAgICAgICAgICUlbW0zLCAlJW1tMiAgXG5cdCJcCisgICAgInBvciAgICAgICAgICAlJW1tNCwgJSVtbTEgIFxuXHQiXAorXAorICAgIE1PVk5UUSglJW1tMiwgIChkc3QsIGluZGV4LCAyKSlcCisgICAgTU9WTlRRKCUlbW0xLCA4KGRzdCwgaW5kZXgsIDIpKVwKK1wKKyAgICAiYWRkICAgICAgICAgICAgICQ4LCAiI2luZGV4IiAgIFxuXHQiXAorICAgICJjbXAgICAgICAgICAiZHN0dyIsICIjaW5kZXgiICAgXG5cdCJcCisgICAgIiBqYiAgICAgICAgICAgICAxYiAgICAgICAgICAgICBcblx0IgorI2RlZmluZSBXUklURVJHQjE1KGRzdCwgZHN0dywgaW5kZXgpICBSRUFMX1dSSVRFUkdCMTUoZHN0LCBkc3R3LCBpbmRleCkKKworc3RhdGljIHZvaWQgUkVOQU1FKHl1djJyZ2I1NTVfWF9hcikoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqbHVtRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgaW50IGx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpjaHJGaWx0ZXIsIGNvbnN0IGludDE2X3QgKipjaHJVU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclZTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyRmlsdGVyU2l6ZSwgY29uc3QgaW50MTZfdCAqKmFscFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLCBpbnQgZHN0WSkKK3sKKyAgICB4ODZfcmVnIGR1bW15PTA7CisgICAgeDg2X3JlZyBkc3RXX3JlZyA9IGRzdFc7CisgICAgeDg2X3JlZyB1dl9vZmYgPSBjLT51dl9vZmZ4MjsKKworICAgIFlTQ0FMRVlVVjJQQUNLRURYX0FDQ1VSQVRFCisgICAgWVNDQUxFWVVWMlJHQlgKKyAgICAicHhvciAlJW1tNywgJSVtbTcgXG5cdCIKKyAgICAvKiBtbTI9QiwgJSVtbTQ9RywgJSVtbTU9UiwgJSVtbTc9MCAqLworI2lmZGVmIERJVEhFUjFYQlBQCisgICAgInBhZGR1c2IgIkJMVUVfRElUSEVSIiglMCksICUlbW0yXG5cdCIKKyAgICAicGFkZHVzYiAiR1JFRU5fRElUSEVSIiglMCksICUlbW00XG5cdCIKKyAgICAicGFkZHVzYiAiUkVEX0RJVEhFUiIoJTApLCAlJW1tNVxuXHQiCisjZW5kaWYKKyAgICBXUklURVJHQjE1KCU0LCAiJTUiLCAlJVJFR2EpCisgICAgWVNDQUxFWVVWMlBBQ0tFRFhfRU5ECit9CisKK3N0YXRpYyB2b2lkIFJFTkFNRSh5dXYycmdiNTU1X1gpKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmx1bUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipsdW1TcmMsIGludCBsdW1GaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLCBjb25zdCBpbnQxNl90ICoqY2hyVVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJWU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNockZpbHRlclNpemUsIGNvbnN0IGludDE2X3QgKiphbHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywgaW50IGRzdFkpCit7CisgICAgeDg2X3JlZyBkdW1teT0wOworICAgIHg4Nl9yZWcgZHN0V19yZWcgPSBkc3RXOworICAgIHg4Nl9yZWcgdXZfb2ZmID0gYy0+dXZfb2ZmeDI7CisKKyAgICBZU0NBTEVZVVYyUEFDS0VEWAorICAgIFlTQ0FMRVlVVjJSR0JYCisgICAgInB4b3IgJSVtbTcsICUlbW03IFxuXHQiCisgICAgLyogbW0yPUIsICUlbW00PUcsICUlbW01PVIsICUlbW03PTAgKi8KKyNpZmRlZiBESVRIRVIxWEJQUAorICAgICJwYWRkdXNiICJCTFVFX0RJVEhFUiIoJTApLCAlJW1tMiAgXG5cdCIKKyAgICAicGFkZHVzYiAiR1JFRU5fRElUSEVSIiglMCksICUlbW00ICBcblx0IgorICAgICJwYWRkdXNiICJSRURfRElUSEVSIiglMCksICUlbW01ICBcblx0IgorI2VuZGlmCisgICAgV1JJVEVSR0IxNSglNCwgIiU1IiwgJSVSRUdhKQorICAgIFlTQ0FMRVlVVjJQQUNLRURYX0VORAorfQorCisjZGVmaW5lIFdSSVRFQkdSMjRNTVgoZHN0LCBkc3R3LCBpbmRleCkgXAorICAgIC8qIG1tMj1CLCAlJW1tND1HLCAlJW1tNT1SLCAlJW1tNz0wICovXAorICAgICJtb3ZxICAgICAgJSVtbTIsICUlbW0xICAgICBcblx0IiAvKiBCICovXAorICAgICJtb3ZxICAgICAgJSVtbTUsICUlbW02ICAgICBcblx0IiAvKiBSICovXAorICAgICJwdW5wY2tsYncgJSVtbTQsICUlbW0yICAgICBcblx0IiAvKiBHQkdCR0JHQiAwICovXAorICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW01ICAgICBcblx0IiAvKiAwUjBSMFIwUiAwICovXAorICAgICJwdW5wY2toYncgJSVtbTQsICUlbW0xICAgICBcblx0IiAvKiBHQkdCR0JHQiAyICovXAorICAgICJwdW5wY2toYncgJSVtbTcsICUlbW02ICAgICBcblx0IiAvKiAwUjBSMFIwUiAyICovXAorICAgICJtb3ZxICAgICAgJSVtbTIsICUlbW0wICAgICBcblx0IiAvKiBHQkdCR0JHQiAwICovXAorICAgICJtb3ZxICAgICAgJSVtbTEsICUlbW0zICAgICBcblx0IiAvKiBHQkdCR0JHQiAyICovXAorICAgICJwdW5wY2tsd2QgJSVtbTUsICUlbW0wICAgICBcblx0IiAvKiAwUkdCMFJHQiAwICovXAorICAgICJwdW5wY2tod2QgJSVtbTUsICUlbW0yICAgICBcblx0IiAvKiAwUkdCMFJHQiAxICovXAorICAgICJwdW5wY2tsd2QgJSVtbTYsICUlbW0xICAgICBcblx0IiAvKiAwUkdCMFJHQiAyICovXAorICAgICJwdW5wY2tod2QgJSVtbTYsICUlbW0zICAgICBcblx0IiAvKiAwUkdCMFJHQiAzICovXAorXAorICAgICJtb3ZxICAgICAgJSVtbTAsICUlbW00ICAgICBcblx0IiAvKiAwUkdCMFJHQiAwICovXAorICAgICJtb3ZxICAgICAgJSVtbTIsICUlbW02ICAgICBcblx0IiAvKiAwUkdCMFJHQiAxICovXAorICAgICJtb3ZxICAgICAgJSVtbTEsICUlbW01ICAgICBcblx0IiAvKiAwUkdCMFJHQiAyICovXAorICAgICJtb3ZxICAgICAgJSVtbTMsICUlbW03ICAgICBcblx0IiAvKiAwUkdCMFJHQiAzICovXAorXAorICAgICJwc2xscSAgICAgICAkNDAsICUlbW0wICAgICBcblx0IiAvKiBSR0IwMDAwMCAwICovXAorICAgICJwc2xscSAgICAgICAkNDAsICUlbW0yICAgICBcblx0IiAvKiBSR0IwMDAwMCAxICovXAorICAgICJwc2xscSAgICAgICAkNDAsICUlbW0xICAgICBcblx0IiAvKiBSR0IwMDAwMCAyICovXAorICAgICJwc2xscSAgICAgICAkNDAsICUlbW0zICAgICBcblx0IiAvKiBSR0IwMDAwMCAzICovXAorXAorICAgICJwdW5wY2toZHEgJSVtbTQsICUlbW0wICAgICBcblx0IiAvKiAwUkdCUkdCMCAwICovXAorICAgICJwdW5wY2toZHEgJSVtbTYsICUlbW0yICAgICBcblx0IiAvKiAwUkdCUkdCMCAxICovXAorICAgICJwdW5wY2toZHEgJSVtbTUsICUlbW0xICAgICBcblx0IiAvKiAwUkdCUkdCMCAyICovXAorICAgICJwdW5wY2toZHEgJSVtbTcsICUlbW0zICAgICBcblx0IiAvKiAwUkdCUkdCMCAzICovXAorXAorICAgICJwc3JscSAgICAgICAgJDgsICUlbW0wICAgICBcblx0IiAvKiAwMFJHQlJHQiAwICovXAorICAgICJtb3ZxICAgICAgJSVtbTIsICUlbW02ICAgICBcblx0IiAvKiAwUkdCUkdCMCAxICovXAorICAgICJwc2xscSAgICAgICAkNDAsICUlbW0yICAgICBcblx0IiAvKiBHQjAwMDAwMCAxICovXAorICAgICJwb3IgICAgICAgJSVtbTIsICUlbW0wICAgICBcblx0IiAvKiBHQlJHQlJHQiAwICovXAorICAgIE1PVk5UUSglJW1tMCwgKGRzdCkpXAorXAorICAgICJwc3JscSAgICAgICAkMjQsICUlbW02ICAgICBcblx0IiAvKiAwMDAwUkdCUiAxICovXAorICAgICJtb3ZxICAgICAgJSVtbTEsICUlbW01ICAgICBcblx0IiAvKiAwUkdCUkdCMCAyICovXAorICAgICJwc2xscSAgICAgICAkMjQsICUlbW0xICAgICBcblx0IiAvKiBCUkdCMDAwMCAyICovXAorICAgICJwb3IgICAgICAgJSVtbTEsICUlbW02ICAgICBcblx0IiAvKiBCUkdCUkdCUiAxICovXAorICAgIE1PVk5UUSglJW1tNiwgOChkc3QpKVwKK1wKKyAgICAicHNybHEgICAgICAgJDQwLCAlJW1tNSAgICAgXG5cdCIgLyogMDAwMDAwUkcgMiAqL1wKKyAgICAicHNsbHEgICAgICAgICQ4LCAlJW1tMyAgICAgXG5cdCIgLyogUkdCUkdCMDAgMyAqL1wKKyAgICAicG9yICAgICAgICUlbW0zLCAlJW1tNSAgICAgXG5cdCIgLyogUkdCUkdCUkcgMiAqL1wKKyAgICBNT1ZOVFEoJSVtbTUsIDE2KGRzdCkpXAorXAorICAgICJhZGQgICAgICAgICAkMjQsICIjZHN0IiAgICBcblx0IlwKK1wKKyAgICAiYWRkICAgICAgICAgICQ4LCAiI2luZGV4IiAgXG5cdCJcCisgICAgImNtcCAgICAgICJkc3R3IiwgIiNpbmRleCIgIFxuXHQiXAorICAgICIgamIgICAgICAgICAgMWIgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIFdSSVRFQkdSMjRNTVhFWFQoZHN0LCBkc3R3LCBpbmRleCkgXAorICAgIC8qIG1tMj1CLCAlJW1tND1HLCAlJW1tNT1SLCAlJW1tNz0wICovXAorICAgICJtb3ZxICJNQU5HTEUoZmZfTTI0QSkiLCAlJW1tMCBcblx0IlwKKyAgICAibW92cSAiTUFOR0xFKGZmX00yNEMpIiwgJSVtbTcgXG5cdCJcCisgICAgInBzaHVmdyAkMHg1MCwgJSVtbTIsICUlbW0xIFxuXHQiIC8qIEIzIEIyIEIzIEIyICBCMSBCMCBCMSBCMCAqL1wKKyAgICAicHNodWZ3ICQweDUwLCAlJW1tNCwgJSVtbTMgXG5cdCIgLyogRzMgRzIgRzMgRzIgIEcxIEcwIEcxIEcwICovXAorICAgICJwc2h1ZncgJDB4MDAsICUlbW01LCAlJW1tNiBcblx0IiAvKiBSMSBSMCBSMSBSMCAgUjEgUjAgUjEgUjAgKi9cCitcCisgICAgInBhbmQgICAlJW1tMCwgJSVtbTEgICAgICAgIFxuXHQiIC8qICAgIEIyICAgICAgICBCMSAgICAgICBCMCAqL1wKKyAgICAicGFuZCAgICUlbW0wLCAlJW1tMyAgICAgICAgXG5cdCIgLyogICAgRzIgICAgICAgIEcxICAgICAgIEcwICovXAorICAgICJwYW5kICAgJSVtbTcsICUlbW02ICAgICAgICBcblx0IiAvKiAgICAgICBSMSAgICAgICAgUjAgICAgICAgKi9cCitcCisgICAgInBzbGxxICAgICAkOCwgJSVtbTMgICAgICAgIFxuXHQiIC8qIEcyICAgICAgICBHMSAgICAgICBHMCAgICAqL1wKKyAgICAicG9yICAgICUlbW0xLCAlJW1tNiAgICAgICAgXG5cdCJcCisgICAgInBvciAgICAlJW1tMywgJSVtbTYgICAgICAgIFxuXHQiXAorICAgIE1PVk5UUSglJW1tNiwgKGRzdCkpXAorXAorICAgICJwc3JscSAgICAgJDgsICUlbW00ICAgICAgICBcblx0IiAvKiAwMCBHNyBHNiBHNSAgRzQgRzMgRzIgRzEgKi9cCisgICAgInBzaHVmdyAkMHhBNSwgJSVtbTIsICUlbW0xIFxuXHQiIC8qIEI1IEI0IEI1IEI0ICBCMyBCMiBCMyBCMiAqL1wKKyAgICAicHNodWZ3ICQweDU1LCAlJW1tNCwgJSVtbTMgXG5cdCIgLyogRzQgRzMgRzQgRzMgIEc0IEczIEc0IEczICovXAorICAgICJwc2h1ZncgJDB4QTUsICUlbW01LCAlJW1tNiBcblx0IiAvKiBSNSBSNCBSNSBSNCAgUjMgUjIgUjMgUjIgKi9cCitcCisgICAgInBhbmQgIk1BTkdMRShmZl9NMjRCKSIsICUlbW0xIFxuXHQiIC8qIEI1ICAgICAgIEI0ICAgICAgICBCMyAgICAqL1wKKyAgICAicGFuZCAgICUlbW03LCAlJW1tMyAgICAgICAgXG5cdCIgLyogICAgICAgRzQgICAgICAgIEczICAgICAgICovXAorICAgICJwYW5kICAgJSVtbTAsICUlbW02ICAgICAgICBcblx0IiAvKiAgICBSNCAgICAgICAgUjMgICAgICAgUjIgKi9cCitcCisgICAgInBvciAgICAlJW1tMSwgJSVtbTMgICAgICAgIFxuXHQiIC8qIEI1ICAgIEc0IEI0ICAgICBHMyBCMyAgICAqL1wKKyAgICAicG9yICAgICUlbW0zLCAlJW1tNiAgICAgICAgXG5cdCJcCisgICAgTU9WTlRRKCUlbW02LCA4KGRzdCkpXAorXAorICAgICJwc2h1ZncgJDB4RkYsICUlbW0yLCAlJW1tMSBcblx0IiAvKiBCNyBCNiBCNyBCNiAgQjcgQjYgQjYgQjcgKi9cCisgICAgInBzaHVmdyAkMHhGQSwgJSVtbTQsICUlbW0zIFxuXHQiIC8qIDAwIEc3IDAwIEc3ICBHNiBHNSBHNiBHNSAqL1wKKyAgICAicHNodWZ3ICQweEZBLCAlJW1tNSwgJSVtbTYgXG5cdCIgLyogUjcgUjYgUjcgUjYgIFI1IFI0IFI1IFI0ICovXAorXAorICAgICJwYW5kICAgJSVtbTcsICUlbW0xICAgICAgICBcblx0IiAvKiAgICAgICBCNyAgICAgICAgQjYgICAgICAgKi9cCisgICAgInBhbmQgICAlJW1tMCwgJSVtbTMgICAgICAgIFxuXHQiIC8qICAgIEc3ICAgICAgICBHNiAgICAgICBHNSAqL1wKKyAgICAicGFuZCAiTUFOR0xFKGZmX00yNEIpIiwgJSVtbTYgXG5cdCIgLyogUjcgICAgICAgUjYgICAgICAgIFI1ICAgICovXAorXAorICAgICJwb3IgICAgJSVtbTEsICUlbW0zICAgICAgICBcblx0IlwKKyAgICAicG9yICAgICUlbW0zLCAlJW1tNiAgICAgICAgXG5cdCJcCisgICAgTU9WTlRRKCUlbW02LCAxNihkc3QpKVwKK1wKKyAgICAiYWRkICAgICAgJDI0LCAiI2RzdCIgICAgICAgXG5cdCJcCitcCisgICAgImFkZCAgICAgICAkOCwgIiNpbmRleCIgICAgIFxuXHQiXAorICAgICJjbXAgICAiZHN0dyIsICIjaW5kZXgiICAgICBcblx0IlwKKyAgICAiIGpiICAgICAgIDFiICAgICAgICAgICAgICAgXG5cdCIKKworI2lmIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUCisjdW5kZWYgV1JJVEVCR1IyNAorI2RlZmluZSBXUklURUJHUjI0KGRzdCwgZHN0dywgaW5kZXgpICBXUklURUJHUjI0TU1YRVhUKGRzdCwgZHN0dywgaW5kZXgpCisjZWxzZQorI3VuZGVmIFdSSVRFQkdSMjQKKyNkZWZpbmUgV1JJVEVCR1IyNChkc3QsIGRzdHcsIGluZGV4KSAgV1JJVEVCR1IyNE1NWChkc3QsIGRzdHcsIGluZGV4KQorI2VuZGlmCisKKyNpZiBIQVZFXzZSRUdTCitzdGF0aWMgdm9pZCBSRU5BTUUoeXV2MmJncjI0X1hfYXIpKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmx1bUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgaW50IGx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNockZpbHRlciwgY29uc3QgaW50MTZfdCAqKmNoclVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJWU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyRmlsdGVyU2l6ZSwgY29uc3QgaW50MTZfdCAqKmFscFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsIGludCBkc3RZKQoreworICAgIHg4Nl9yZWcgZHVtbXk9MDsKKyAgICB4ODZfcmVnIGRzdFdfcmVnID0gZHN0VzsKKyAgICB4ODZfcmVnIHV2X29mZiA9IGMtPnV2X29mZngyOworCisgICAgWVNDQUxFWVVWMlBBQ0tFRFhfQUNDVVJBVEUKKyAgICBZU0NBTEVZVVYyUkdCWAorICAgICJweG9yICUlbW03LCAlJW1tNyBcblx0IgorICAgICJsZWEgKCUlIlJFR19hIiwgJSUiUkVHX2EiLCAyKSwgJSUiUkVHX2MiXG5cdCIgLy9GSVhNRSBvcHRpbWl6ZQorICAgICJhZGQgJTQsICUlIlJFR19jIiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgV1JJVEVCR1IyNCglJVJFR2MsICIlNSIsICUlUkVHYSkKKyAgICA6OiAiciIgKCZjLT5yZWREaXRoZXIpLAorICAgICAgICJtIiAoZHVtbXkpLCAibSIgKGR1bW15KSwgIm0iIChkdW1teSksCisgICAgICAgInIiIChkZXN0KSwgIm0iIChkc3RXX3JlZyksICJtIih1dl9vZmYpCisgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGZmX00yNEEsZmZfTTI0QyxmZl9NMjRCKQorICAgIDogIiUiUkVHX2EsICIlIlJFR19jLCAiJSJSRUdfZCwgIiUiUkVHX1MKKyAgICApOworfQorCitzdGF0aWMgdm9pZCBSRU5BTUUoeXV2MmJncjI0X1gpKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmx1bUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgaW50IGx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNockZpbHRlciwgY29uc3QgaW50MTZfdCAqKmNoclVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJWU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyRmlsdGVyU2l6ZSwgY29uc3QgaW50MTZfdCAqKmFscFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsIGludCBkc3RZKQoreworICAgIHg4Nl9yZWcgZHVtbXk9MDsKKyAgICB4ODZfcmVnIGRzdFdfcmVnID0gZHN0VzsKKyAgICB4ODZfcmVnIHV2X29mZiA9IGMtPnV2X29mZngyOworCisgICAgWVNDQUxFWVVWMlBBQ0tFRFgKKyAgICBZU0NBTEVZVVYyUkdCWAorICAgICJweG9yICAgICAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTcgICAgICAgXG5cdCIKKyAgICAibGVhICglJSJSRUdfYSIsICUlIlJFR19hIiwgMiksICUlIlJFR19jIiAgIFxuXHQiIC8vRklYTUUgb3B0aW1pemUKKyAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgJTQsICUlIlJFR19jIiAgIFxuXHQiCisgICAgV1JJVEVCR1IyNCglJVJFR2MsICIlNSIsICUlUkVHYSkKKyAgICA6OiAiciIgKCZjLT5yZWREaXRoZXIpLAorICAgICAgICJtIiAoZHVtbXkpLCAibSIgKGR1bW15KSwgIm0iIChkdW1teSksCisgICAgICAgInIiIChkZXN0KSwgICJtIiAoZHN0V19yZWcpLCAibSIodXZfb2ZmKQorICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChmZl9NMjRBLGZmX00yNEMsZmZfTTI0QikKKyAgICA6ICIlIlJFR19hLCAiJSJSRUdfYywgIiUiUkVHX2QsICIlIlJFR19TCisgICAgKTsKK30KKyNlbmRpZiAvKiBIQVZFXzZSRUdTICovCisKKyNkZWZpbmUgUkVBTF9XUklURVlVWTIoZHN0LCBkc3R3LCBpbmRleCkgXAorICAgICJwYWNrdXN3YiAgJSVtbTMsICUlbW0zICAgICBcblx0IlwKKyAgICAicGFja3Vzd2IgICUlbW00LCAlJW1tNCAgICAgXG5cdCJcCisgICAgInBhY2t1c3diICAlJW1tNywgJSVtbTEgICAgIFxuXHQiXAorICAgICJwdW5wY2tsYncgJSVtbTQsICUlbW0zICAgICBcblx0IlwKKyAgICAibW92cSAgICAgICUlbW0xLCAlJW1tNyAgICAgXG5cdCJcCisgICAgInB1bnBja2xidyAlJW1tMywgJSVtbTEgICAgIFxuXHQiXAorICAgICJwdW5wY2toYncgJSVtbTMsICUlbW03ICAgICBcblx0IlwKK1wKKyAgICBNT1ZOVFEoJSVtbTEsIChkc3QsIGluZGV4LCAyKSlcCisgICAgTU9WTlRRKCUlbW03LCA4KGRzdCwgaW5kZXgsIDIpKVwKK1wKKyAgICAiYWRkICAgICAgICAgICQ4LCAiI2luZGV4IiAgXG5cdCJcCisgICAgImNtcCAgICAgICJkc3R3IiwgIiNpbmRleCIgIFxuXHQiXAorICAgICIgamIgICAgICAgICAgMWIgICAgICAgICAgICBcblx0IgorI2RlZmluZSBXUklURVlVWTIoZHN0LCBkc3R3LCBpbmRleCkgIFJFQUxfV1JJVEVZVVkyKGRzdCwgZHN0dywgaW5kZXgpCisKK3N0YXRpYyB2b2lkIFJFTkFNRSh5dXYyeXV5djQyMl9YX2FyKShTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpsdW1GaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyYywgaW50IGx1bUZpbHRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY2hyRmlsdGVyLCBjb25zdCBpbnQxNl90ICoqY2hyVVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqY2hyVlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyRmlsdGVyU2l6ZSwgY29uc3QgaW50MTZfdCAqKmFscFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywgaW50IGRzdFkpCit7CisgICAgeDg2X3JlZyBkdW1teT0wOworICAgIHg4Nl9yZWcgZHN0V19yZWcgPSBkc3RXOworICAgIHg4Nl9yZWcgdXZfb2ZmID0gYy0+dXZfb2ZmeDI7CisKKyAgICBZU0NBTEVZVVYyUEFDS0VEWF9BQ0NVUkFURQorICAgIC8qIG1tMj1CLCAlJW1tND1HLCAlJW1tNT1SLCAlJW1tNz0wICovCisgICAgInBzcmF3ICQzLCAlJW1tMyAgICBcblx0IgorICAgICJwc3JhdyAkMywgJSVtbTQgICAgXG5cdCIKKyAgICAicHNyYXcgJDMsICUlbW0xICAgIFxuXHQiCisgICAgInBzcmF3ICQzLCAlJW1tNyAgICBcblx0IgorICAgIFdSSVRFWVVZMiglNCwgIiU1IiwgJSVSRUdhKQorICAgIFlTQ0FMRVlVVjJQQUNLRURYX0VORAorfQorCitzdGF0aWMgdm9pZCBSRU5BTUUoeXV2Mnl1eXY0MjJfWCkoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqbHVtRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipsdW1TcmMsIGludCBsdW1GaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNockZpbHRlciwgY29uc3QgaW50MTZfdCAqKmNoclVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclZTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNockZpbHRlclNpemUsIGNvbnN0IGludDE2X3QgKiphbHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsIGludCBkc3RZKQoreworICAgIHg4Nl9yZWcgZHVtbXk9MDsKKyAgICB4ODZfcmVnIGRzdFdfcmVnID0gZHN0VzsKKyAgICB4ODZfcmVnIHV2X29mZiA9IGMtPnV2X29mZngyOworCisgICAgWVNDQUxFWVVWMlBBQ0tFRFgKKyAgICAvKiBtbTI9QiwgJSVtbTQ9RywgJSVtbTU9UiwgJSVtbTc9MCAqLworICAgICJwc3JhdyAkMywgJSVtbTMgICAgXG5cdCIKKyAgICAicHNyYXcgJDMsICUlbW00ICAgIFxuXHQiCisgICAgInBzcmF3ICQzLCAlJW1tMSAgICBcblx0IgorICAgICJwc3JhdyAkMywgJSVtbTcgICAgXG5cdCIKKyAgICBXUklURVlVWTIoJTQsICIlNSIsICUlUkVHYSkKKyAgICBZU0NBTEVZVVYyUEFDS0VEWF9FTkQKK30KKworI2RlZmluZSBSRUFMX1lTQ0FMRVlVVjJSR0JfVVYoaW5kZXgsIGMpIFwKKyAgICAieG9yICAgICAgICAgICAgIiNpbmRleCIsICIjaW5kZXgiICBcblx0IlwKKyAgICAiLnAyYWxpZ24gICAgICAgICAgICAgIDQgICAgICAgICAgICBcblx0IlwKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAibW92cSAgICAgKCUyLCAiI2luZGV4IiksICUlbW0yICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4XSovXAorICAgICJtb3ZxICAgICAoJTMsICIjaW5kZXgiKSwgJSVtbTMgICAgIFxuXHQiIC8qIHV2YnVmMVtlYXhdKi9cCisgICAgImFkZCAiVVZfT0ZGX0JZVEUiKCIjYyIpLCAiI2luZGV4IiAgXG5cdCIgXAorICAgICJtb3ZxICAgICAoJTIsICIjaW5kZXgiKSwgJSVtbTUgICAgIFxuXHQiIC8qIHV2YnVmMFtlYXgrMjA0OF0qL1wKKyAgICAibW92cSAgICAgKCUzLCAiI2luZGV4IiksICUlbW00ICAgICBcblx0IiAvKiB1dmJ1ZjFbZWF4KzIwNDhdKi9cCisgICAgInN1YiAiVVZfT0ZGX0JZVEUiKCIjYyIpLCAiI2luZGV4IiAgXG5cdCIgXAorICAgICJwc3VidyAgICAgICAgICAgICAlJW1tMywgJSVtbTIgICAgIFxuXHQiIC8qIHV2YnVmMFtlYXhdIC0gdXZidWYxW2VheF0qL1wKKyAgICAicHN1YncgICAgICAgICAgICAgJSVtbTQsICUlbW01ICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4KzIwNDhdIC0gdXZidWYxW2VheCsyMDQ4XSovXAorICAgICJtb3ZxICJDSFJfTU1YX0ZJTFRFUl9PRkZTRVQiKzgoIiNjIiksICUlbW0wICAgIFxuXHQiXAorICAgICJwbXVsaHcgICAgICAgICAgICAlJW1tMCwgJSVtbTIgICAgIFxuXHQiIC8qICh1dmJ1ZjBbZWF4XSAtIHV2YnVmMVtlYXhdKXV2YWxwaGExPj4xNiovXAorICAgICJwbXVsaHcgICAgICAgICAgICAlJW1tMCwgJSVtbTUgICAgIFxuXHQiIC8qICh1dmJ1ZjBbZWF4KzIwNDhdIC0gdXZidWYxW2VheCsyMDQ4XSl1dmFscGhhMT4+MTYqL1wKKyAgICAicHNyYXcgICAgICAgICAgICAgICAgJDQsICUlbW0zICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4XSAtIHV2YnVmMVtlYXhdID4+NCovXAorICAgICJwc3JhdyAgICAgICAgICAgICAgICAkNCwgJSVtbTQgICAgIFxuXHQiIC8qIHV2YnVmMFtlYXgrMjA0OF0gLSB1dmJ1ZjFbZWF4KzIwNDhdID4+NCovXAorICAgICJwYWRkdyAgICAgICAgICAgICAlJW1tMiwgJSVtbTMgICAgIFxuXHQiIC8qIHV2YnVmMFtlYXhddXZhbHBoYTEgLSB1dmJ1ZjFbZWF4XSgxLXV2YWxwaGExKSovXAorICAgICJwYWRkdyAgICAgICAgICAgICAlJW1tNSwgJSVtbTQgICAgIFxuXHQiIC8qIHV2YnVmMFtlYXgrMjA0OF11dmFscGhhMSAtIHV2YnVmMVtlYXgrMjA0OF0oMS11dmFscGhhMSkqL1wKKyAgICAicHN1YncgICJVX09GRlNFVCIoIiNjIiksICUlbW0zICAgICBcblx0IiAvKiAoVS0xMjgpOCovXAorICAgICJwc3VidyAgIlZfT0ZGU0VUIigiI2MiKSwgJSVtbTQgICAgIFxuXHQiIC8qIChWLTEyOCk4Ki9cCisgICAgIm1vdnEgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgXG5cdCIgLyogKFUtMTI4KTgqL1wKKyAgICAibW92cSAgICAgICAgICAgICAgJSVtbTQsICUlbW01ICAgICBcblx0IiAvKiAoVi0xMjgpOCovXAorICAgICJwbXVsaHcgIlVHX0NPRUZGIigiI2MiKSwgJSVtbTMgICAgIFxuXHQiXAorICAgICJwbXVsaHcgIlZHX0NPRUZGIigiI2MiKSwgJSVtbTQgICAgIFxuXHQiXAorICAgIC8qIG1tMj0oVS0xMjgpOCwgbW0zPXVnLCBtbTQ9dmcgbW01PShWLTEyOCk4ICovXAorCisjZGVmaW5lIFJFQUxfWVNDQUxFWVVWMlJHQl9ZQShpbmRleCwgYywgYjEsIGIyKSBcCisgICAgIm1vdnEgICgiI2IxIiwgIiNpbmRleCIsIDIpLCAlJW1tMCAgICAgXG5cdCIgLypidWYwW2VheF0qL1wKKyAgICAibW92cSAgKCIjYjIiLCAiI2luZGV4IiwgMiksICUlbW0xICAgICBcblx0IiAvKmJ1ZjFbZWF4XSovXAorICAgICJtb3ZxIDgoIiNiMSIsICIjaW5kZXgiLCAyKSwgJSVtbTYgICAgIFxuXHQiIC8qYnVmMFtlYXhdKi9cCisgICAgIm1vdnEgOCgiI2IyIiwgIiNpbmRleCIsIDIpLCAlJW1tNyAgICAgXG5cdCIgLypidWYxW2VheF0qL1wKKyAgICAicHN1YncgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICBcblx0IiAvKiBidWYwW2VheF0gLSBidWYxW2VheF0qL1wKKyAgICAicHN1YncgICAgICAgICAgICAgJSVtbTcsICUlbW02ICAgICBcblx0IiAvKiBidWYwW2VheF0gLSBidWYxW2VheF0qL1wKKyAgICAicG11bGh3ICJMVU1fTU1YX0ZJTFRFUl9PRkZTRVQiKzgoIiNjIiksICUlbW0wICBcblx0IiAvKiAoYnVmMFtlYXhdIC0gYnVmMVtlYXhdKXlhbHBoYTE+PjE2Ki9cCisgICAgInBtdWxodyAiTFVNX01NWF9GSUxURVJfT0ZGU0VUIis4KCIjYyIpLCAlJW1tNiAgXG5cdCIgLyogKGJ1ZjBbZWF4XSAtIGJ1ZjFbZWF4XSl5YWxwaGExPj4xNiovXAorICAgICJwc3JhdyAgICAgICAgICAgICAgICAkNCwgJSVtbTEgICAgIFxuXHQiIC8qIGJ1ZjBbZWF4XSAtIGJ1ZjFbZWF4XSA+PjQqL1wKKyAgICAicHNyYXcgICAgICAgICAgICAgICAgJDQsICUlbW03ICAgICBcblx0IiAvKiBidWYwW2VheF0gLSBidWYxW2VheF0gPj40Ki9cCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW0wLCAlJW1tMSAgICAgXG5cdCIgLyogYnVmMFtlYXhdeWFscGhhMSArIGJ1ZjFbZWF4XSgxLXlhbHBoYTEpID4+MTYqL1wKKyAgICAicGFkZHcgICAgICAgICAgICAgJSVtbTYsICUlbW03ICAgICBcblx0IiAvKiBidWYwW2VheF15YWxwaGExICsgYnVmMVtlYXhdKDEteWFscGhhMSkgPj4xNiovXAorCisjZGVmaW5lIFJFQUxfWVNDQUxFWVVWMlJHQl9DT0VGRihjKSBcCisgICAgInBtdWxodyAiVUJfQ09FRkYiKCIjYyIpLCAlJW1tMiAgICAgXG5cdCJcCisgICAgInBtdWxodyAiVlJfQ09FRkYiKCIjYyIpLCAlJW1tNSAgICAgXG5cdCJcCisgICAgInBzdWJ3ICAiWV9PRkZTRVQiKCIjYyIpLCAlJW1tMSAgICAgXG5cdCIgLyogOChZLTE2KSovXAorICAgICJwc3VidyAgIllfT0ZGU0VUIigiI2MiKSwgJSVtbTcgICAgIFxuXHQiIC8qIDgoWS0xNikqL1wKKyAgICAicG11bGh3ICAiWV9DT0VGRiIoIiNjIiksICUlbW0xICAgICBcblx0IlwKKyAgICAicG11bGh3ICAiWV9DT0VGRiIoIiNjIiksICUlbW03ICAgICBcblx0IlwKKyAgICAvKiBtbTE9IFkxLCBtbTI9dWIsIG1tMz11ZywgbW00PXZnIG1tNT12ciwgbW03PVkyICovXAorICAgICJwYWRkdyAgICAgICAgICAgICAlJW1tMywgJSVtbTQgICAgIFxuXHQiXAorICAgICJtb3ZxICAgICAgICAgICAgICAlJW1tMiwgJSVtbTAgICAgIFxuXHQiXAorICAgICJtb3ZxICAgICAgICAgICAgICAlJW1tNSwgJSVtbTYgICAgIFxuXHQiXAorICAgICJtb3ZxICAgICAgICAgICAgICAlJW1tNCwgJSVtbTMgICAgIFxuXHQiXAorICAgICJwdW5wY2tsd2QgICAgICAgICAlJW1tMiwgJSVtbTIgICAgIFxuXHQiXAorICAgICJwdW5wY2tsd2QgICAgICAgICAlJW1tNSwgJSVtbTUgICAgIFxuXHQiXAorICAgICJwdW5wY2tsd2QgICAgICAgICAlJW1tNCwgJSVtbTQgICAgIFxuXHQiXAorICAgICJwYWRkdyAgICAgICAgICAgICAlJW1tMSwgJSVtbTIgICAgIFxuXHQiXAorICAgICJwYWRkdyAgICAgICAgICAgICAlJW1tMSwgJSVtbTUgICAgIFxuXHQiXAorICAgICJwYWRkdyAgICAgICAgICAgICAlJW1tMSwgJSVtbTQgICAgIFxuXHQiXAorICAgICJwdW5wY2tod2QgICAgICAgICAlJW1tMCwgJSVtbTAgICAgIFxuXHQiXAorICAgICJwdW5wY2tod2QgICAgICAgICAlJW1tNiwgJSVtbTYgICAgIFxuXHQiXAorICAgICJwdW5wY2tod2QgICAgICAgICAlJW1tMywgJSVtbTMgICAgIFxuXHQiXAorICAgICJwYWRkdyAgICAgICAgICAgICAlJW1tNywgJSVtbTAgICAgIFxuXHQiXAorICAgICJwYWRkdyAgICAgICAgICAgICAlJW1tNywgJSVtbTYgICAgIFxuXHQiXAorICAgICJwYWRkdyAgICAgICAgICAgICAlJW1tNywgJSVtbTMgICAgIFxuXHQiXAorICAgIC8qIG1tMD1CMSwgbW0yPUIyLCBtbTM9RzIsIG1tND1HMSwgbW01PVIxLCBtbTY9UjIgKi9cCisgICAgInBhY2t1c3diICAgICAgICAgICUlbW0wLCAlJW1tMiAgICAgXG5cdCJcCisgICAgInBhY2t1c3diICAgICAgICAgICUlbW02LCAlJW1tNSAgICAgXG5cdCJcCisgICAgInBhY2t1c3diICAgICAgICAgICUlbW0zLCAlJW1tNCAgICAgXG5cdCJcCisKKyNkZWZpbmUgWVNDQUxFWVVWMlJHQl9ZQShpbmRleCwgYywgYjEsIGIyKSBSRUFMX1lTQ0FMRVlVVjJSR0JfWUEoaW5kZXgsIGMsIGIxLCBiMikKKworI2RlZmluZSBZU0NBTEVZVVYyUkdCKGluZGV4LCBjKSBcCisgICAgUkVBTF9ZU0NBTEVZVVYyUkdCX1VWKGluZGV4LCBjKSBcCisgICAgUkVBTF9ZU0NBTEVZVVYyUkdCX1lBKGluZGV4LCBjLCAlMCwgJTEpIFwKKyAgICBSRUFMX1lTQ0FMRVlVVjJSR0JfQ09FRkYoYykKKworLyoqCisgKiB2ZXJ0aWNhbCBiaWxpbmVhciBzY2FsZSBZVjEyIHRvIFJHQgorICovCitzdGF0aWMgdm9pZCBSRU5BTUUoeXV2MnJnYjMyXzIpKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqYWJ1ZlsyXSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFcsIGludCB5YWxwaGEsIGludCB1dmFscGhhLCBpbnQgeSkKK3sKKyAgICBjb25zdCBpbnQxNl90ICpidWYwICA9IGJ1ZlswXSwgICpidWYxICA9IGJ1ZlsxXSwKKyAgICAgICAgICAgICAgICAgICp1YnVmMCA9IHVidWZbMF0sICp1YnVmMSA9IHVidWZbMV07CisKKyAgICBpZiAoQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYy0+YWxwUGl4QnVmKSB7CisgICAgICAgIGNvbnN0IGludDE2X3QgKmFidWYwID0gYWJ1ZlswXSwgKmFidWYxID0gYWJ1ZlsxXTsKKyNpZiBBUkNIX1g4Nl82NAorICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgWVNDQUxFWVVWMlJHQiglJXI4LCAlNSkKKyAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0JfWUEoJSVyOCwgJTUsICU2LCAlNykKKyAgICAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICQzLCAlJW1tMSAgICAgICBcblx0IiAvKiBhYnVmMFtlYXhdIC0gYWJ1ZjFbZWF4XSA+PjcqLworICAgICAgICAgICAgInBzcmF3ICAgICAgICAgICAgICAgICAgJDMsICUlbW03ICAgICAgIFxuXHQiIC8qIGFidWYwW2VheF0gLSBhYnVmMVtlYXhdID4+NyovCisgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFdSSVRFQkdSMzIoJTQsIERTVFdfT0ZGU0VUIiglNSkiLCAlJXI4LCAlJW1tMiwgJSVtbTQsICUlbW01LCAlJW1tMSwgJSVtbTAsICUlbW03LCAlJW1tMywgJSVtbTYpCisgICAgICAgICAgICA6OiAiYyIgKGJ1ZjApLCAiZCIgKGJ1ZjEpLCAiUyIgKHVidWYwKSwgIkQiICh1YnVmMSksICJyIiAoZGVzdCksCisgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpLAorICAgICAgICAgICAgICAgInIiIChhYnVmMCksICJyIiAoYWJ1ZjEpCisgICAgICAgICAgICA6ICIlcjgiCisgICAgICAgICk7CisjZWxzZQorICAgICAgICBjLT51X3RlbXA9KGludHB0cl90KWFidWYwOworICAgICAgICBjLT52X3RlbXA9KGludHB0cl90KWFidWYxOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgWVNDQUxFWVVWMlJHQiglJVJFR0JQLCAlNSkKKyAgICAgICAgICAgICJwdXNoICAgICAgICAgICAgICAgICAgICUwICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1c2ggICAgICAgICAgICAgICAgICAgJTEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICAgICAgICAgICJVX1RFTVAiKCU1KSwgJTAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgICAgICAgICAgIlZfVEVNUCIoJTUpLCAlMSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgWVNDQUxFWVVWMlJHQl9ZQSglJVJFR0JQLCAlNSwgJTAsICUxKQorICAgICAgICAgICAgInBzcmF3ICAgICAgICAgICAgICAgICAgJDMsICUlbW0xICAgICAgIFxuXHQiIC8qIGFidWYwW2VheF0gLSBhYnVmMVtlYXhdID4+NyovCisgICAgICAgICAgICAicHNyYXcgICAgICAgICAgICAgICAgICAkMywgJSVtbTcgICAgICAgXG5cdCIgLyogYWJ1ZjBbZWF4XSAtIGFidWYxW2VheF0gPj43Ki8KKyAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICUlbW03LCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgInBvcCAgICAgICAgICAgICAgICAgICAgJTEgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG9wICAgICAgICAgICAgICAgICAgICAlMCAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFdSSVRFQkdSMzIoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCwgJSVtbTIsICUlbW00LCAlJW1tNSwgJSVtbTEsICUlbW0wLCAlJW1tNywgJSVtbTMsICUlbW02KQorICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIlJFR19iIiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6ICJjIiAoYnVmMCksICJkIiAoYnVmMSksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKKyAgICAgICAgICAgICAgICJhIiAoJmMtPnJlZERpdGhlcikKKyAgICAgICAgKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibW92ICUlIlJFR19iIiwgIkVTUF9PRkZTRVQiKCU1KSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgICAgICAgICU0LCAlJSJSRUdfYiIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1c2ggJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBZU0NBTEVZVVYyUkdCKCUlUkVHQlAsICU1KQorICAgICAgICAgICAgInBjbXBlcWQgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBXUklURUJHUjMyKCUlUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlUkVHQlAsICUlbW0yLCAlJW1tNCwgJSVtbTUsICUlbW03LCAlJW1tMCwgJSVtbTEsICUlbW0zLCAlJW1tNikKKyAgICAgICAgICAgICJwb3AgJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6OiAiYyIgKGJ1ZjApLCAiZCIgKGJ1ZjEpLCAiUyIgKHVidWYwKSwgIkQiICh1YnVmMSksICJtIiAoZGVzdCksCisgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCisgICAgICAgICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBSRU5BTUUoeXV2MmJncjI0XzIpKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqYWJ1ZlsyXSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFcsIGludCB5YWxwaGEsIGludCB1dmFscGhhLCBpbnQgeSkKK3sKKyAgICBjb25zdCBpbnQxNl90ICpidWYwICA9IGJ1ZlswXSwgICpidWYxICA9IGJ1ZlsxXSwKKyAgICAgICAgICAgICAgICAgICp1YnVmMCA9IHVidWZbMF0sICp1YnVmMSA9IHVidWZbMV07CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92ICUlIlJFR19iIiwgIkVTUF9PRkZTRVQiKCU1KSAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBZU0NBTEVZVVYyUkdCKCUlUkVHQlAsICU1KQorICAgICAgICAicHhvciAgICAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgV1JJVEVCR1IyNCglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQKQorICAgICAgICAicG9wICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgIDo6ICJjIiAoYnVmMCksICJkIiAoYnVmMSksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKKyAgICAgICAgICAgImEiICgmYy0+cmVkRGl0aGVyKQorICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfTTI0QSxmZl9NMjRDLGZmX00yNEIpCisgICAgKTsKK30KKworc3RhdGljIHZvaWQgUkVOQU1FKHl1djJyZ2I1NTVfMikoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqYnVmWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmFidWZbMl0sIHVpbnQ4X3QgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0VywgaW50IHlhbHBoYSwgaW50IHV2YWxwaGEsIGludCB5KQoreworICAgIGNvbnN0IGludDE2X3QgKmJ1ZjAgID0gYnVmWzBdLCAgKmJ1ZjEgID0gYnVmWzFdLAorICAgICAgICAgICAgICAgICAgKnVidWYwID0gdWJ1ZlswXSwgKnVidWYxID0gdWJ1ZlsxXTsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgorICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1c2ggJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFlTQ0FMRVlVVjJSR0IoJSVSRUdCUCwgJTUpCisgICAgICAgICJweG9yICAgICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAvKiBtbTI9QiwgJSVtbTQ9RywgJSVtbTU9UiwgJSVtbTc9MCAqLworI2lmZGVmIERJVEhFUjFYQlBQCisgICAgICAgICJwYWRkdXNiICJCTFVFX0RJVEhFUiIoJTUpLCAlJW1tMiAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNiICJHUkVFTl9ESVRIRVIiKCU1KSwgJSVtbTQgICAgICBcblx0IgorICAgICAgICAicGFkZHVzYiAiUkVEX0RJVEhFUiIoJTUpLCAlJW1tNSAgICAgIFxuXHQiCisjZW5kaWYKKyAgICAgICAgV1JJVEVSR0IxNSglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQKQorICAgICAgICAicG9wICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgIDo6ICJjIiAoYnVmMCksICJkIiAoYnVmMSksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKKyAgICAgICAgICAgImEiICgmYy0+cmVkRGl0aGVyKQorICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoYkY4KQorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkIFJFTkFNRSh5dXYycmdiNTY1XzIpKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWZbMl0sIGNvbnN0IGludDE2X3QgKnZidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphYnVmWzJdLCB1aW50OF90ICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFcsIGludCB5YWxwaGEsIGludCB1dmFscGhhLCBpbnQgeSkKK3sKKyAgICBjb25zdCBpbnQxNl90ICpidWYwICA9IGJ1ZlswXSwgICpidWYxICA9IGJ1ZlsxXSwKKyAgICAgICAgICAgICAgICAgICp1YnVmMCA9IHVidWZbMF0sICp1YnVmMSA9IHVidWZbMV07CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibW92ICUlIlJFR19iIiwgIkVTUF9PRkZTRVQiKCU1KSAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBZU0NBTEVZVVYyUkdCKCUlUkVHQlAsICU1KQorICAgICAgICAicHhvciAgICAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLyogbW0yPUIsICUlbW00PUcsICUlbW01PVIsICUlbW03PTAgKi8KKyNpZmRlZiBESVRIRVIxWEJQUAorICAgICAgICAicGFkZHVzYiAiQkxVRV9ESVRIRVIiKCU1KSwgJSVtbTIgICAgICBcblx0IgorICAgICAgICAicGFkZHVzYiAiR1JFRU5fRElUSEVSIiglNSksICUlbW00ICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgIlJFRF9ESVRIRVIiKCU1KSwgJSVtbTUgICAgICBcblx0IgorI2VuZGlmCisgICAgICAgIFdSSVRFUkdCMTYoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCkKKyAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICA6OiAiYyIgKGJ1ZjApLCAiZCIgKGJ1ZjEpLCAiUyIgKHVidWYwKSwgIkQiICh1YnVmMSksICJtIiAoZGVzdCksCisgICAgICAgICAgICJhIiAoJmMtPnJlZERpdGhlcikKKyAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGJGOCxiRkMpCisgICAgKTsKK30KKworI2RlZmluZSBSRUFMX1lTQ0FMRVlVVjJQQUNLRUQoaW5kZXgsIGMpIFwKKyAgICAibW92cSAiQ0hSX01NWF9GSUxURVJfT0ZGU0VUIis4KCIjYyIpLCAlJW1tMCAgICAgICAgICAgICAgXG5cdCJcCisgICAgIm1vdnEgIkxVTV9NTVhfRklMVEVSX09GRlNFVCIrOCgiI2MiKSwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiXAorICAgICJwc3JhdyAgICAgICAgICAgICAgICAkMywgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAicHNyYXcgICAgICAgICAgICAgICAgJDMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgIm1vdnEgICAgICAgICAgICAgICUlbW0wLCAiQ0hSX01NWF9GSUxURVJfT0ZGU0VUIis4KCIjYyIpIFxuXHQiXAorICAgICJtb3ZxICAgICAgICAgICAgICAlJW1tMSwgIkxVTV9NTVhfRklMVEVSX09GRlNFVCIrOCgiI2MiKSBcblx0IlwKKyAgICAieG9yICAgICAgICAgICAgIiNpbmRleCIsICIjaW5kZXgiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgIi5wMmFsaWduICAgICAgICAgICAgICA0ICAgICAgICAgICAgXG5cdCJcCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgIm1vdnEgICAgICglMiwgIiNpbmRleCIpLCAlJW1tMiAgICAgXG5cdCIgLyogdXZidWYwW2VheF0qL1wKKyAgICAibW92cSAgICAgKCUzLCAiI2luZGV4IiksICUlbW0zICAgICBcblx0IiAvKiB1dmJ1ZjFbZWF4XSovXAorICAgICJhZGQgIlVWX09GRl9CWVRFIigiI2MiKSwgIiNpbmRleCIgIFxuXHQiIFwKKyAgICAibW92cSAgICAgKCUyLCAiI2luZGV4IiksICUlbW01ICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4KzIwNDhdKi9cCisgICAgIm1vdnEgICAgICglMywgIiNpbmRleCIpLCAlJW1tNCAgICAgXG5cdCIgLyogdXZidWYxW2VheCsyMDQ4XSovXAorICAgICJzdWIgIlVWX09GRl9CWVRFIigiI2MiKSwgIiNpbmRleCIgIFxuXHQiIFwKKyAgICAicHN1YncgICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4XSAtIHV2YnVmMVtlYXhdKi9cCisgICAgInBzdWJ3ICAgICAgICAgICAgICUlbW00LCAlJW1tNSAgICAgXG5cdCIgLyogdXZidWYwW2VheCsyMDQ4XSAtIHV2YnVmMVtlYXgrMjA0OF0qL1wKKyAgICAibW92cSAiQ0hSX01NWF9GSUxURVJfT0ZGU0VUIis4KCIjYyIpLCAlJW1tMCAgICBcblx0IlwKKyAgICAicG11bGh3ICAgICAgICAgICAgJSVtbTAsICUlbW0yICAgICBcblx0IiAvKiAodXZidWYwW2VheF0gLSB1dmJ1ZjFbZWF4XSl1dmFscGhhMT4+MTYqL1wKKyAgICAicG11bGh3ICAgICAgICAgICAgJSVtbTAsICUlbW01ICAgICBcblx0IiAvKiAodXZidWYwW2VheCsyMDQ4XSAtIHV2YnVmMVtlYXgrMjA0OF0pdXZhbHBoYTE+PjE2Ki9cCisgICAgInBzcmF3ICAgICAgICAgICAgICAgICQ3LCAlJW1tMyAgICAgXG5cdCIgLyogdXZidWYwW2VheF0gLSB1dmJ1ZjFbZWF4XSA+PjQqL1wKKyAgICAicHNyYXcgICAgICAgICAgICAgICAgJDcsICUlbW00ICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4KzIwNDhdIC0gdXZidWYxW2VheCsyMDQ4XSA+PjQqL1wKKyAgICAicGFkZHcgICAgICAgICAgICAgJSVtbTIsICUlbW0zICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4XXV2YWxwaGExIC0gdXZidWYxW2VheF0oMS11dmFscGhhMSkqL1wKKyAgICAicGFkZHcgICAgICAgICAgICAgJSVtbTUsICUlbW00ICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4KzIwNDhddXZhbHBoYTEgLSB1dmJ1ZjFbZWF4KzIwNDhdKDEtdXZhbHBoYTEpKi9cCisgICAgIm1vdnEgICglMCwgIiNpbmRleCIsIDIpLCAlJW1tMCAgICAgXG5cdCIgLypidWYwW2VheF0qL1wKKyAgICAibW92cSAgKCUxLCAiI2luZGV4IiwgMiksICUlbW0xICAgICBcblx0IiAvKmJ1ZjFbZWF4XSovXAorICAgICJtb3ZxIDgoJTAsICIjaW5kZXgiLCAyKSwgJSVtbTYgICAgIFxuXHQiIC8qYnVmMFtlYXhdKi9cCisgICAgIm1vdnEgOCglMSwgIiNpbmRleCIsIDIpLCAlJW1tNyAgICAgXG5cdCIgLypidWYxW2VheF0qL1wKKyAgICAicHN1YncgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICBcblx0IiAvKiBidWYwW2VheF0gLSBidWYxW2VheF0qL1wKKyAgICAicHN1YncgICAgICAgICAgICAgJSVtbTcsICUlbW02ICAgICBcblx0IiAvKiBidWYwW2VheF0gLSBidWYxW2VheF0qL1wKKyAgICAicG11bGh3ICJMVU1fTU1YX0ZJTFRFUl9PRkZTRVQiKzgoIiNjIiksICUlbW0wICBcblx0IiAvKiAoYnVmMFtlYXhdIC0gYnVmMVtlYXhdKXlhbHBoYTE+PjE2Ki9cCisgICAgInBtdWxodyAiTFVNX01NWF9GSUxURVJfT0ZGU0VUIis4KCIjYyIpLCAlJW1tNiAgXG5cdCIgLyogKGJ1ZjBbZWF4XSAtIGJ1ZjFbZWF4XSl5YWxwaGExPj4xNiovXAorICAgICJwc3JhdyAgICAgICAgICAgICAgICAkNywgJSVtbTEgICAgIFxuXHQiIC8qIGJ1ZjBbZWF4XSAtIGJ1ZjFbZWF4XSA+PjQqL1wKKyAgICAicHNyYXcgICAgICAgICAgICAgICAgJDcsICUlbW03ICAgICBcblx0IiAvKiBidWYwW2VheF0gLSBidWYxW2VheF0gPj40Ki9cCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW0wLCAlJW1tMSAgICAgXG5cdCIgLyogYnVmMFtlYXhdeWFscGhhMSArIGJ1ZjFbZWF4XSgxLXlhbHBoYTEpID4+MTYqL1wKKyAgICAicGFkZHcgICAgICAgICAgICAgJSVtbTYsICUlbW03ICAgICBcblx0IiAvKiBidWYwW2VheF15YWxwaGExICsgYnVmMVtlYXhdKDEteWFscGhhMSkgPj4xNiovXAorCisjZGVmaW5lIFlTQ0FMRVlVVjJQQUNLRUQoaW5kZXgsIGMpICBSRUFMX1lTQ0FMRVlVVjJQQUNLRUQoaW5kZXgsIGMpCisKK3N0YXRpYyB2b2lkIFJFTkFNRSh5dXYyeXV5djQyMl8yKShTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphYnVmWzJdLCB1aW50OF90ICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RXLCBpbnQgeWFscGhhLCBpbnQgdXZhbHBoYSwgaW50IHkpCit7CisgICAgY29uc3QgaW50MTZfdCAqYnVmMCAgPSBidWZbMF0sICAqYnVmMSAgPSBidWZbMV0sCisgICAgICAgICAgICAgICAgICAqdWJ1ZjAgPSB1YnVmWzBdLCAqdWJ1ZjEgPSB1YnVmWzFdOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBZU0NBTEVZVVYyUEFDS0VEKCUlUkVHQlAsICU1KQorICAgICAgICBXUklURVlVWTIoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCkKKyAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICA6OiAiYyIgKGJ1ZjApLCAiZCIgKGJ1ZjEpLCAiUyIgKHVidWYwKSwgIkQiICh1YnVmMSksICJtIiAoZGVzdCksCisgICAgICAgICAgICJhIiAoJmMtPnJlZERpdGhlcikKKyAgICApOworfQorCisjZGVmaW5lIFJFQUxfWVNDQUxFWVVWMlJHQjEoaW5kZXgsIGMpIFwKKyAgICAieG9yICAgICAgICAgICAgIiNpbmRleCIsICIjaW5kZXgiICBcblx0IlwKKyAgICAiLnAyYWxpZ24gICAgICAgICAgICAgIDQgICAgICAgICAgICBcblx0IlwKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAibW92cSAgICAgKCUyLCAiI2luZGV4IiksICUlbW0zICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4XSovXAorICAgICJhZGQgIlVWX09GRl9CWVRFIigiI2MiKSwgIiNpbmRleCIgIFxuXHQiIFwKKyAgICAibW92cSAgICAgKCUyLCAiI2luZGV4IiksICUlbW00ICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4KzIwNDhdKi9cCisgICAgInN1YiAiVVZfT0ZGX0JZVEUiKCIjYyIpLCAiI2luZGV4IiAgXG5cdCIgXAorICAgICJwc3JhdyAgICAgICAgICAgICAgICAkNCwgJSVtbTMgICAgIFxuXHQiIC8qIHV2YnVmMFtlYXhdIC0gdXZidWYxW2VheF0gPj40Ki9cCisgICAgInBzcmF3ICAgICAgICAgICAgICAgICQ0LCAlJW1tNCAgICAgXG5cdCIgLyogdXZidWYwW2VheCsyMDQ4XSAtIHV2YnVmMVtlYXgrMjA0OF0gPj40Ki9cCisgICAgInBzdWJ3ICAiVV9PRkZTRVQiKCIjYyIpLCAlJW1tMyAgICAgXG5cdCIgLyogKFUtMTI4KTgqL1wKKyAgICAicHN1YncgICJWX09GRlNFVCIoIiNjIiksICUlbW00ICAgICBcblx0IiAvKiAoVi0xMjgpOCovXAorICAgICJtb3ZxICAgICAgICAgICAgICAlJW1tMywgJSVtbTIgICAgIFxuXHQiIC8qIChVLTEyOCk4Ki9cCisgICAgIm1vdnEgICAgICAgICAgICAgICUlbW00LCAlJW1tNSAgICAgXG5cdCIgLyogKFYtMTI4KTgqL1wKKyAgICAicG11bGh3ICJVR19DT0VGRiIoIiNjIiksICUlbW0zICAgICBcblx0IlwKKyAgICAicG11bGh3ICJWR19DT0VGRiIoIiNjIiksICUlbW00ICAgICBcblx0IlwKKyAgICAvKiBtbTI9KFUtMTI4KTgsIG1tMz11ZywgbW00PXZnIG1tNT0oVi0xMjgpOCAqL1wKKyAgICAibW92cSAgKCUwLCAiI2luZGV4IiwgMiksICUlbW0xICAgICBcblx0IiAvKmJ1ZjBbZWF4XSovXAorICAgICJtb3ZxIDgoJTAsICIjaW5kZXgiLCAyKSwgJSVtbTcgICAgIFxuXHQiIC8qYnVmMFtlYXhdKi9cCisgICAgInBzcmF3ICAgICAgICAgICAgICAgICQ0LCAlJW1tMSAgICAgXG5cdCIgLyogYnVmMFtlYXhdIC0gYnVmMVtlYXhdID4+NCovXAorICAgICJwc3JhdyAgICAgICAgICAgICAgICAkNCwgJSVtbTcgICAgIFxuXHQiIC8qIGJ1ZjBbZWF4XSAtIGJ1ZjFbZWF4XSA+PjQqL1wKKyAgICAicG11bGh3ICJVQl9DT0VGRiIoIiNjIiksICUlbW0yICAgICBcblx0IlwKKyAgICAicG11bGh3ICJWUl9DT0VGRiIoIiNjIiksICUlbW01ICAgICBcblx0IlwKKyAgICAicHN1YncgICJZX09GRlNFVCIoIiNjIiksICUlbW0xICAgICBcblx0IiAvKiA4KFktMTYpKi9cCisgICAgInBzdWJ3ICAiWV9PRkZTRVQiKCIjYyIpLCAlJW1tNyAgICAgXG5cdCIgLyogOChZLTE2KSovXAorICAgICJwbXVsaHcgICJZX0NPRUZGIigiI2MiKSwgJSVtbTEgICAgIFxuXHQiXAorICAgICJwbXVsaHcgICJZX0NPRUZGIigiI2MiKSwgJSVtbTcgICAgIFxuXHQiXAorICAgIC8qIG1tMT0gWTEsIG1tMj11YiwgbW0zPXVnLCBtbTQ9dmcgbW01PXZyLCBtbTc9WTIgKi9cCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW0zLCAlJW1tNCAgICAgXG5cdCJcCisgICAgIm1vdnEgICAgICAgICAgICAgICUlbW0yLCAlJW1tMCAgICAgXG5cdCJcCisgICAgIm1vdnEgICAgICAgICAgICAgICUlbW01LCAlJW1tNiAgICAgXG5cdCJcCisgICAgIm1vdnEgICAgICAgICAgICAgICUlbW00LCAlJW1tMyAgICAgXG5cdCJcCisgICAgInB1bnBja2x3ZCAgICAgICAgICUlbW0yLCAlJW1tMiAgICAgXG5cdCJcCisgICAgInB1bnBja2x3ZCAgICAgICAgICUlbW01LCAlJW1tNSAgICAgXG5cdCJcCisgICAgInB1bnBja2x3ZCAgICAgICAgICUlbW00LCAlJW1tNCAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW0xLCAlJW1tMiAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW0xLCAlJW1tNSAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW0xLCAlJW1tNCAgICAgXG5cdCJcCisgICAgInB1bnBja2h3ZCAgICAgICAgICUlbW0wLCAlJW1tMCAgICAgXG5cdCJcCisgICAgInB1bnBja2h3ZCAgICAgICAgICUlbW02LCAlJW1tNiAgICAgXG5cdCJcCisgICAgInB1bnBja2h3ZCAgICAgICAgICUlbW0zLCAlJW1tMyAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW03LCAlJW1tMCAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW03LCAlJW1tNiAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW03LCAlJW1tMyAgICAgXG5cdCJcCisgICAgLyogbW0wPUIxLCBtbTI9QjIsIG1tMz1HMiwgbW00PUcxLCBtbTU9UjEsIG1tNj1SMiAqL1wKKyAgICAicGFja3Vzd2IgICAgICAgICAgJSVtbTAsICUlbW0yICAgICBcblx0IlwKKyAgICAicGFja3Vzd2IgICAgICAgICAgJSVtbTYsICUlbW01ICAgICBcblx0IlwKKyAgICAicGFja3Vzd2IgICAgICAgICAgJSVtbTMsICUlbW00ICAgICBcblx0IlwKKworI2RlZmluZSBZU0NBTEVZVVYyUkdCMShpbmRleCwgYykgIFJFQUxfWVNDQUxFWVVWMlJHQjEoaW5kZXgsIGMpCisKKy8vIGRvIHZlcnRpY2FsIGNocm9taW5hbmNlIGludGVycG9sYXRpb24KKyNkZWZpbmUgUkVBTF9ZU0NBTEVZVVYyUkdCMWIoaW5kZXgsIGMpIFwKKyAgICAieG9yICAgICAgICAgICAgIiNpbmRleCIsICIjaW5kZXgiICBcblx0IlwKKyAgICAiLnAyYWxpZ24gICAgICAgICAgICAgIDQgICAgICAgICAgICBcblx0IlwKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAibW92cSAgICAgKCUyLCAiI2luZGV4IiksICUlbW0yICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4XSovXAorICAgICJtb3ZxICAgICAoJTMsICIjaW5kZXgiKSwgJSVtbTMgICAgIFxuXHQiIC8qIHV2YnVmMVtlYXhdKi9cCisgICAgImFkZCAiVVZfT0ZGX0JZVEUiKCIjYyIpLCAiI2luZGV4IiAgXG5cdCIgXAorICAgICJtb3ZxICAgICAoJTIsICIjaW5kZXgiKSwgJSVtbTUgICAgIFxuXHQiIC8qIHV2YnVmMFtlYXgrMjA0OF0qL1wKKyAgICAibW92cSAgICAgKCUzLCAiI2luZGV4IiksICUlbW00ICAgICBcblx0IiAvKiB1dmJ1ZjFbZWF4KzIwNDhdKi9cCisgICAgInN1YiAiVVZfT0ZGX0JZVEUiKCIjYyIpLCAiI2luZGV4IiAgXG5cdCIgXAorICAgICJwYWRkdyAgICAgICAgICAgICAlJW1tMiwgJSVtbTMgICAgIFxuXHQiIC8qIHV2YnVmMFtlYXhdICsgdXZidWYxW2VheF0qL1wKKyAgICAicGFkZHcgICAgICAgICAgICAgJSVtbTUsICUlbW00ICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4KzIwNDhdICsgdXZidWYxW2VheCsyMDQ4XSovXAorICAgICJwc3JsdyAgICAgICAgICAgICAgICAkNSwgJSVtbTMgICAgIFxuXHQiIC8qRklYTUUgbWlnaHQgb3ZlcmZsb3cqL1wKKyAgICAicHNybHcgICAgICAgICAgICAgICAgJDUsICUlbW00ICAgICBcblx0IiAvKkZJWE1FIG1pZ2h0IG92ZXJmbG93Ki9cCisgICAgInBzdWJ3ICAiVV9PRkZTRVQiKCIjYyIpLCAlJW1tMyAgICAgXG5cdCIgLyogKFUtMTI4KTgqL1wKKyAgICAicHN1YncgICJWX09GRlNFVCIoIiNjIiksICUlbW00ICAgICBcblx0IiAvKiAoVi0xMjgpOCovXAorICAgICJtb3ZxICAgICAgICAgICAgICAlJW1tMywgJSVtbTIgICAgIFxuXHQiIC8qIChVLTEyOCk4Ki9cCisgICAgIm1vdnEgICAgICAgICAgICAgICUlbW00LCAlJW1tNSAgICAgXG5cdCIgLyogKFYtMTI4KTgqL1wKKyAgICAicG11bGh3ICJVR19DT0VGRiIoIiNjIiksICUlbW0zICAgICBcblx0IlwKKyAgICAicG11bGh3ICJWR19DT0VGRiIoIiNjIiksICUlbW00ICAgICBcblx0IlwKKyAgICAvKiBtbTI9KFUtMTI4KTgsIG1tMz11ZywgbW00PXZnIG1tNT0oVi0xMjgpOCAqL1wKKyAgICAibW92cSAgKCUwLCAiI2luZGV4IiwgMiksICUlbW0xICAgICBcblx0IiAvKmJ1ZjBbZWF4XSovXAorICAgICJtb3ZxIDgoJTAsICIjaW5kZXgiLCAyKSwgJSVtbTcgICAgIFxuXHQiIC8qYnVmMFtlYXhdKi9cCisgICAgInBzcmF3ICAgICAgICAgICAgICAgICQ0LCAlJW1tMSAgICAgXG5cdCIgLyogYnVmMFtlYXhdIC0gYnVmMVtlYXhdID4+NCovXAorICAgICJwc3JhdyAgICAgICAgICAgICAgICAkNCwgJSVtbTcgICAgIFxuXHQiIC8qIGJ1ZjBbZWF4XSAtIGJ1ZjFbZWF4XSA+PjQqL1wKKyAgICAicG11bGh3ICJVQl9DT0VGRiIoIiNjIiksICUlbW0yICAgICBcblx0IlwKKyAgICAicG11bGh3ICJWUl9DT0VGRiIoIiNjIiksICUlbW01ICAgICBcblx0IlwKKyAgICAicHN1YncgICJZX09GRlNFVCIoIiNjIiksICUlbW0xICAgICBcblx0IiAvKiA4KFktMTYpKi9cCisgICAgInBzdWJ3ICAiWV9PRkZTRVQiKCIjYyIpLCAlJW1tNyAgICAgXG5cdCIgLyogOChZLTE2KSovXAorICAgICJwbXVsaHcgICJZX0NPRUZGIigiI2MiKSwgJSVtbTEgICAgIFxuXHQiXAorICAgICJwbXVsaHcgICJZX0NPRUZGIigiI2MiKSwgJSVtbTcgICAgIFxuXHQiXAorICAgIC8qIG1tMT0gWTEsIG1tMj11YiwgbW0zPXVnLCBtbTQ9dmcgbW01PXZyLCBtbTc9WTIgKi9cCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW0zLCAlJW1tNCAgICAgXG5cdCJcCisgICAgIm1vdnEgICAgICAgICAgICAgICUlbW0yLCAlJW1tMCAgICAgXG5cdCJcCisgICAgIm1vdnEgICAgICAgICAgICAgICUlbW01LCAlJW1tNiAgICAgXG5cdCJcCisgICAgIm1vdnEgICAgICAgICAgICAgICUlbW00LCAlJW1tMyAgICAgXG5cdCJcCisgICAgInB1bnBja2x3ZCAgICAgICAgICUlbW0yLCAlJW1tMiAgICAgXG5cdCJcCisgICAgInB1bnBja2x3ZCAgICAgICAgICUlbW01LCAlJW1tNSAgICAgXG5cdCJcCisgICAgInB1bnBja2x3ZCAgICAgICAgICUlbW00LCAlJW1tNCAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW0xLCAlJW1tMiAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW0xLCAlJW1tNSAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW0xLCAlJW1tNCAgICAgXG5cdCJcCisgICAgInB1bnBja2h3ZCAgICAgICAgICUlbW0wLCAlJW1tMCAgICAgXG5cdCJcCisgICAgInB1bnBja2h3ZCAgICAgICAgICUlbW02LCAlJW1tNiAgICAgXG5cdCJcCisgICAgInB1bnBja2h3ZCAgICAgICAgICUlbW0zLCAlJW1tMyAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW03LCAlJW1tMCAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW03LCAlJW1tNiAgICAgXG5cdCJcCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW03LCAlJW1tMyAgICAgXG5cdCJcCisgICAgLyogbW0wPUIxLCBtbTI9QjIsIG1tMz1HMiwgbW00PUcxLCBtbTU9UjEsIG1tNj1SMiAqL1wKKyAgICAicGFja3Vzd2IgICAgICAgICAgJSVtbTAsICUlbW0yICAgICBcblx0IlwKKyAgICAicGFja3Vzd2IgICAgICAgICAgJSVtbTYsICUlbW01ICAgICBcblx0IlwKKyAgICAicGFja3Vzd2IgICAgICAgICAgJSVtbTMsICUlbW00ICAgICBcblx0IlwKKworI2RlZmluZSBZU0NBTEVZVVYyUkdCMWIoaW5kZXgsIGMpICBSRUFMX1lTQ0FMRVlVVjJSR0IxYihpbmRleCwgYykKKworI2RlZmluZSBSRUFMX1lTQ0FMRVlVVjJSR0IxX0FMUEhBKGluZGV4KSBcCisgICAgIm1vdnEgICglMSwgIiNpbmRleCIsIDIpLCAlJW1tNyAgICAgXG5cdCIgLyogYWJ1ZjBbaW5kZXggIF0gICAgICovXAorICAgICJtb3ZxIDgoJTEsICIjaW5kZXgiLCAyKSwgJSVtbTEgICAgIFxuXHQiIC8qIGFidWYwW2luZGV4KzRdICAgICAqL1wKKyAgICAicHNyYXcgICAgICAgICAgICAgICAgJDcsICUlbW03ICAgICBcblx0IiAvKiBhYnVmMFtpbmRleCAgXSA+PjcgKi9cCisgICAgInBzcmF3ICAgICAgICAgICAgICAgICQ3LCAlJW1tMSAgICAgXG5cdCIgLyogYWJ1ZjBbaW5kZXgrNF0gPj43ICovXAorICAgICJwYWNrdXN3YiAgICAgICAgICAlJW1tMSwgJSVtbTcgICAgIFxuXHQiCisjZGVmaW5lIFlTQ0FMRVlVVjJSR0IxX0FMUEhBKGluZGV4KSBSRUFMX1lTQ0FMRVlVVjJSR0IxX0FMUEhBKGluZGV4KQorCisvKioKKyAqIFlWMTIgdG8gUkdCIHdpdGhvdXQgc2NhbGluZyBvciBpbnRlcnBvbGF0aW5nCisgKi8KK3N0YXRpYyB2b2lkIFJFTkFNRSh5dXYycmdiMzJfMSkoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqYnVmMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqYWJ1ZjAsIHVpbnQ4X3QgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RXLCBpbnQgdXZhbHBoYSwgaW50IHkpCit7CisgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjAgPSB1YnVmWzBdOworICAgIGNvbnN0IGludDE2X3QgKmJ1ZjE9IGJ1ZjA7IC8vRklYTUUgbmVlZGVkIGZvciBSR0IxL0JHUjEKKworICAgIGlmICh1dmFscGhhIDwgMjA0OCkgeyAvLyBub3RlIHRoaXMgaXMgbm90IGNvcnJlY3QgKHNoaWZ0cyBjaHJvbWluYW5jZSBieSAwLjUgcGl4ZWxzKSBidXQgaXQgaXMgYSBiaXQgZmFzdGVyCisgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlswXTsKKyAgICAgICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikgeworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibW92ICUlIlJFR19iIiwgIkVTUF9PRkZTRVQiKCU1KSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICBZU0NBTEVZVVYyUkdCMSglJVJFR0JQLCAlNSkKKyAgICAgICAgICAgICAgICBZU0NBTEVZVVYyUkdCMV9BTFBIQSglJVJFR0JQKQorICAgICAgICAgICAgICAgIFdSSVRFQkdSMzIoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCwgJSVtbTIsICUlbW00LCAlJW1tNSwgJSVtbTcsICUlbW0wLCAlJW1tMSwgJSVtbTMsICUlbW02KQorICAgICAgICAgICAgICAgICJwb3AgJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIDo6ICJjIiAoYnVmMCksICJkIiAoYWJ1ZjApLCAiUyIgKHVidWYwKSwgIkQiICh1YnVmMSksICJtIiAoZGVzdCksCisgICAgICAgICAgICAgICAgICAgImEiICgmYy0+cmVkRGl0aGVyKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB1c2ggJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjEoJSVSRUdCUCwgJTUpCisgICAgICAgICAgICAgICAgInBjbXBlcWQgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgV1JJVEVCR1IzMiglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQLCAlJW1tMiwgJSVtbTQsICUlbW01LCAlJW1tNywgJSVtbTAsICUlbW0xLCAlJW1tMywgJSVtbTYpCisgICAgICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAorICAgICAgICAgICAgICAgICAgICJhIiAoJmMtPnJlZERpdGhlcikKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQxNl90ICp1YnVmMSA9IHVidWZbMV07CisgICAgICAgIGlmIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5hbHBQaXhCdWYpIHsKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB1c2ggJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjFiKCUlUkVHQlAsICU1KQorICAgICAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxX0FMUEhBKCUlUkVHQlApCisgICAgICAgICAgICAgICAgV1JJVEVCR1IzMiglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQLCAlJW1tMiwgJSVtbTQsICUlbW01LCAlJW1tNywgJSVtbTAsICUlbW0xLCAlJW1tMywgJSVtbTYpCisgICAgICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChhYnVmMCksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKKyAgICAgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCisgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICAgICAibW92ICUlIlJFR19iIiwgIkVTUF9PRkZTRVQiKCU1KSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICBZU0NBTEVZVVYyUkdCMWIoJSVSRUdCUCwgJTUpCisgICAgICAgICAgICAgICAgInBjbXBlcWQgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgV1JJVEVCR1IzMiglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQLCAlJW1tMiwgJSVtbTQsICUlbW01LCAlJW1tNywgJSVtbTAsICUlbW0xLCAlJW1tMywgJSVtbTYpCisgICAgICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAorICAgICAgICAgICAgICAgICAgICJhIiAoJmMtPnJlZERpdGhlcikKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFJFTkFNRSh5dXYyYmdyMjRfMSkoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqYnVmMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqYWJ1ZjAsIHVpbnQ4X3QgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RXLCBpbnQgdXZhbHBoYSwgaW50IHkpCit7CisgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjAgPSB1YnVmWzBdOworICAgIGNvbnN0IGludDE2X3QgKmJ1ZjE9IGJ1ZjA7IC8vRklYTUUgbmVlZGVkIGZvciBSR0IxL0JHUjEKKworICAgIGlmICh1dmFscGhhIDwgMjA0OCkgeyAvLyBub3RlIHRoaXMgaXMgbm90IGNvcnJlY3QgKHNoaWZ0cyBjaHJvbWluYW5jZSBieSAwLjUgcGl4ZWxzKSBidXQgaXQgaXMgYSBiaXQgZmFzdGVyCisgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlswXTsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxKCUlUkVHQlAsICU1KQorICAgICAgICAgICAgInB4b3IgICAgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBXUklURUJHUjI0KCUlUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlUkVHQlApCisgICAgICAgICAgICAicG9wICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAorICAgICAgICAgICAgICAgImEiICgmYy0+cmVkRGl0aGVyKQorICAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGZmX00yNEEsZmZfTTI0QyxmZl9NMjRCKQorICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlsxXTsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxYiglJVJFR0JQLCAlNSkKKyAgICAgICAgICAgICJweG9yICAgICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgV1JJVEVCR1IyNCglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQKQorICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIlJFR19iIiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6ICJjIiAoYnVmMCksICJkIiAoYnVmMSksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKKyAgICAgICAgICAgICAgICJhIiAoJmMtPnJlZERpdGhlcikKKyAgICAgICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChmZl9NMjRBLGZmX00yNEMsZmZfTTI0QikKKyAgICAgICAgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFJFTkFNRSh5dXYycmdiNTU1XzEpKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmJ1ZjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp1YnVmWzJdLCBjb25zdCBpbnQxNl90ICp2YnVmWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqYWJ1ZjAsIHVpbnQ4X3QgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0VywgaW50IHV2YWxwaGEsIGludCB5KQoreworICAgIGNvbnN0IGludDE2X3QgKnVidWYwID0gdWJ1ZlswXTsKKyAgICBjb25zdCBpbnQxNl90ICpidWYxPSBidWYwOyAvL0ZJWE1FIG5lZWRlZCBmb3IgUkdCMS9CR1IxCisKKyAgICBpZiAodXZhbHBoYSA8IDIwNDgpIHsgLy8gbm90ZSB0aGlzIGlzIG5vdCBjb3JyZWN0IChzaGlmdHMgY2hyb21pbmFuY2UgYnkgMC41IHBpeGVscykgYnV0IGl0IGlzIGEgYml0IGZhc3RlcgorICAgICAgICBjb25zdCBpbnQxNl90ICp1YnVmMSA9IHVidWZbMF07CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibW92ICUlIlJFR19iIiwgIkVTUF9PRkZTRVQiKCU1KSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgICAgICAgICU0LCAlJSJSRUdfYiIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1c2ggJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBZU0NBTEVZVVYyUkdCMSglJVJFR0JQLCAlNSkKKyAgICAgICAgICAgICJweG9yICAgICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgLyogbW0yPUIsICUlbW00PUcsICUlbW01PVIsICUlbW03PTAgKi8KKyNpZmRlZiBESVRIRVIxWEJQUAorICAgICAgICAgICAgInBhZGR1c2IgIkJMVUVfRElUSEVSIiglNSksICUlbW0yICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdXNiICJHUkVFTl9ESVRIRVIiKCU1KSwgJSVtbTQgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR1c2IgIlJFRF9ESVRIRVIiKCU1KSwgJSVtbTUgICAgICBcblx0IgorI2VuZGlmCisgICAgICAgICAgICBXUklURVJHQjE1KCUlUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlUkVHQlApCisgICAgICAgICAgICAicG9wICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAorICAgICAgICAgICAgICAgImEiICgmYy0+cmVkRGl0aGVyKQorICAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGJGOCkKKyAgICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQxNl90ICp1YnVmMSA9IHVidWZbMV07CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICAgICAibW92ICUlIlJFR19iIiwgIkVTUF9PRkZTRVQiKCU1KSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgICAgICAgICU0LCAlJSJSRUdfYiIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1c2ggJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBZU0NBTEVZVVYyUkdCMWIoJSVSRUdCUCwgJTUpCisgICAgICAgICAgICAicHhvciAgICAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIC8qIG1tMj1CLCAlJW1tND1HLCAlJW1tNT1SLCAlJW1tNz0wICovCisjaWZkZWYgRElUSEVSMVhCUFAKKyAgICAgICAgICAgICJwYWRkdXNiICJCTFVFX0RJVEhFUiIoJTUpLCAlJW1tMiAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHVzYiAiR1JFRU5fRElUSEVSIiglNSksICUlbW00ICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdXNiICJSRURfRElUSEVSIiglNSksICUlbW01ICAgICAgXG5cdCIKKyNlbmRpZgorICAgICAgICAgICAgV1JJVEVSR0IxNSglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQKQorICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIlJFR19iIiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6ICJjIiAoYnVmMCksICJkIiAoYnVmMSksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKKyAgICAgICAgICAgICAgICJhIiAoJmMtPnJlZERpdGhlcikKKyAgICAgICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChiRjgpCisgICAgICAgICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBSRU5BTUUoeXV2MnJnYjU2NV8xKShTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpidWYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZlsyXSwgY29uc3QgaW50MTZfdCAqdmJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmFidWYwLCB1aW50OF90ICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFcsIGludCB1dmFscGhhLCBpbnQgeSkKK3sKKyAgICBjb25zdCBpbnQxNl90ICp1YnVmMCA9IHVidWZbMF07CisgICAgY29uc3QgaW50MTZfdCAqYnVmMT0gYnVmMDsgLy9GSVhNRSBuZWVkZWQgZm9yIFJHQjEvQkdSMQorCisgICAgaWYgKHV2YWxwaGEgPCAyMDQ4KSB7IC8vIG5vdGUgdGhpcyBpcyBub3QgY29ycmVjdCAoc2hpZnRzIGNocm9taW5hbmNlIGJ5IDAuNSBwaXhlbHMpIGJ1dCBpdCBpcyBhIGJpdCBmYXN0ZXIKKyAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjEgPSB1YnVmWzBdOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjEoJSVSRUdCUCwgJTUpCisgICAgICAgICAgICAicHhvciAgICAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIC8qIG1tMj1CLCAlJW1tND1HLCAlJW1tNT1SLCAlJW1tNz0wICovCisjaWZkZWYgRElUSEVSMVhCUFAKKyAgICAgICAgICAgICJwYWRkdXNiICJCTFVFX0RJVEhFUiIoJTUpLCAlJW1tMiAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHVzYiAiR1JFRU5fRElUSEVSIiglNSksICUlbW00ICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdXNiICJSRURfRElUSEVSIiglNSksICUlbW01ICAgICAgXG5cdCIKKyNlbmRpZgorICAgICAgICAgICAgV1JJVEVSR0IxNiglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQKQorICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIlJFR19iIiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDo6ICJjIiAoYnVmMCksICJkIiAoYnVmMSksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKKyAgICAgICAgICAgICAgICJhIiAoJmMtPnJlZERpdGhlcikKKyAgICAgICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChiRjgsYkZDKQorICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlsxXTsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxYiglJVJFR0JQLCAlNSkKKyAgICAgICAgICAgICJweG9yICAgICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgLyogbW0yPUIsICUlbW00PUcsICUlbW01PVIsICUlbW03PTAgKi8KKyNpZmRlZiBESVRIRVIxWEJQUAorICAgICAgICAgICAgInBhZGR1c2IgIkJMVUVfRElUSEVSIiglNSksICUlbW0yICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdXNiICJHUkVFTl9ESVRIRVIiKCU1KSwgJSVtbTQgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR1c2IgIlJFRF9ESVRIRVIiKCU1KSwgJSVtbTUgICAgICBcblx0IgorI2VuZGlmCisgICAgICAgICAgICBXUklURVJHQjE2KCUlUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlUkVHQlApCisgICAgICAgICAgICAicG9wICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAorICAgICAgICAgICAgICAgImEiICgmYy0+cmVkRGl0aGVyKQorICAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGJGOCxiRkMpCisgICAgICAgICk7CisgICAgfQorfQorCisjZGVmaW5lIFJFQUxfWVNDQUxFWVVWMlBBQ0tFRDEoaW5kZXgsIGMpIFwKKyAgICAieG9yICAgICAgICAgICAgIiNpbmRleCIsICIjaW5kZXgiICBcblx0IlwKKyAgICAiLnAyYWxpZ24gICAgICAgICAgICAgIDQgICAgICAgICAgICBcblx0IlwKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAibW92cSAgICAgKCUyLCAiI2luZGV4IiksICUlbW0zICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4XSovXAorICAgICJhZGQgIlVWX09GRl9CWVRFIigiI2MiKSwgIiNpbmRleCIgIFxuXHQiIFwKKyAgICAibW92cSAgICAgKCUyLCAiI2luZGV4IiksICUlbW00ICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4KzIwNDhdKi9cCisgICAgInN1YiAiVVZfT0ZGX0JZVEUiKCIjYyIpLCAiI2luZGV4IiAgXG5cdCIgXAorICAgICJwc3JhdyAgICAgICAgICAgICAgICAkNywgJSVtbTMgICAgIFxuXHQiIFwKKyAgICAicHNyYXcgICAgICAgICAgICAgICAgJDcsICUlbW00ICAgICBcblx0IiBcCisgICAgIm1vdnEgICglMCwgIiNpbmRleCIsIDIpLCAlJW1tMSAgICAgXG5cdCIgLypidWYwW2VheF0qL1wKKyAgICAibW92cSA4KCUwLCAiI2luZGV4IiwgMiksICUlbW03ICAgICBcblx0IiAvKmJ1ZjBbZWF4XSovXAorICAgICJwc3JhdyAgICAgICAgICAgICAgICAkNywgJSVtbTEgICAgIFxuXHQiIFwKKyAgICAicHNyYXcgICAgICAgICAgICAgICAgJDcsICUlbW03ICAgICBcblx0IiBcCisKKyNkZWZpbmUgWVNDQUxFWVVWMlBBQ0tFRDEoaW5kZXgsIGMpICBSRUFMX1lTQ0FMRVlVVjJQQUNLRUQxKGluZGV4LCBjKQorCisjZGVmaW5lIFJFQUxfWVNDQUxFWVVWMlBBQ0tFRDFiKGluZGV4LCBjKSBcCisgICAgInhvciAiI2luZGV4IiwgIiNpbmRleCIgICAgICAgICAgICAgXG5cdCJcCisgICAgIi5wMmFsaWduICAgICAgICAgICAgICA0ICAgICAgICAgICAgXG5cdCJcCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgIm1vdnEgICAgICglMiwgIiNpbmRleCIpLCAlJW1tMiAgICAgXG5cdCIgLyogdXZidWYwW2VheF0qL1wKKyAgICAibW92cSAgICAgKCUzLCAiI2luZGV4IiksICUlbW0zICAgICBcblx0IiAvKiB1dmJ1ZjFbZWF4XSovXAorICAgICJhZGQgIlVWX09GRl9CWVRFIigiI2MiKSwgIiNpbmRleCIgIFxuXHQiIFwKKyAgICAibW92cSAgICAgKCUyLCAiI2luZGV4IiksICUlbW01ICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4KzIwNDhdKi9cCisgICAgIm1vdnEgICAgICglMywgIiNpbmRleCIpLCAlJW1tNCAgICAgXG5cdCIgLyogdXZidWYxW2VheCsyMDQ4XSovXAorICAgICJzdWIgIlVWX09GRl9CWVRFIigiI2MiKSwgIiNpbmRleCIgIFxuXHQiIFwKKyAgICAicGFkZHcgICAgICAgICAgICAgJSVtbTIsICUlbW0zICAgICBcblx0IiAvKiB1dmJ1ZjBbZWF4XSArIHV2YnVmMVtlYXhdKi9cCisgICAgInBhZGR3ICAgICAgICAgICAgICUlbW01LCAlJW1tNCAgICAgXG5cdCIgLyogdXZidWYwW2VheCsyMDQ4XSArIHV2YnVmMVtlYXgrMjA0OF0qL1wKKyAgICAicHNybHcgICAgICAgICAgICAgICAgJDgsICUlbW0zICAgICBcblx0IiBcCisgICAgInBzcmx3ICAgICAgICAgICAgICAgICQ4LCAlJW1tNCAgICAgXG5cdCIgXAorICAgICJtb3ZxICAoJTAsICIjaW5kZXgiLCAyKSwgJSVtbTEgICAgIFxuXHQiIC8qYnVmMFtlYXhdKi9cCisgICAgIm1vdnEgOCglMCwgIiNpbmRleCIsIDIpLCAlJW1tNyAgICAgXG5cdCIgLypidWYwW2VheF0qL1wKKyAgICAicHNyYXcgICAgICAgICAgICAgICAgJDcsICUlbW0xICAgICBcblx0IiBcCisgICAgInBzcmF3ICAgICAgICAgICAgICAgICQ3LCAlJW1tNyAgICAgXG5cdCIKKyNkZWZpbmUgWVNDQUxFWVVWMlBBQ0tFRDFiKGluZGV4LCBjKSAgUkVBTF9ZU0NBTEVZVVYyUEFDS0VEMWIoaW5kZXgsIGMpCisKK3N0YXRpYyB2b2lkIFJFTkFNRSh5dXYyeXV5djQyMl8xKShTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpidWYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWZbMl0sIGNvbnN0IGludDE2X3QgKnZidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqYWJ1ZjAsIHVpbnQ4X3QgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFcsIGludCB1dmFscGhhLCBpbnQgeSkKK3sKKyAgICBjb25zdCBpbnQxNl90ICp1YnVmMCA9IHVidWZbMF07CisgICAgY29uc3QgaW50MTZfdCAqYnVmMT0gYnVmMDsgLy9GSVhNRSBuZWVkZWQgZm9yIFJHQjEvQkdSMQorCisgICAgaWYgKHV2YWxwaGEgPCAyMDQ4KSB7IC8vIG5vdGUgdGhpcyBpcyBub3QgY29ycmVjdCAoc2hpZnRzIGNocm9taW5hbmNlIGJ5IDAuNSBwaXhlbHMpIGJ1dCBpdCBpcyBhIGJpdCBmYXN0ZXIKKyAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjEgPSB1YnVmWzBdOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRDEoJSVSRUdCUCwgJTUpCisgICAgICAgICAgICBXUklURVlVWTIoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCkKKyAgICAgICAgICAgICJwb3AgJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6OiAiYyIgKGJ1ZjApLCAiZCIgKGJ1ZjEpLCAiUyIgKHVidWYwKSwgIkQiICh1YnVmMSksICJtIiAoZGVzdCksCisgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCisgICAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjEgPSB1YnVmWzFdOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRDFiKCUlUkVHQlAsICU1KQorICAgICAgICAgICAgV1JJVEVZVVkyKCUlUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlUkVHQlApCisgICAgICAgICAgICAicG9wICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAorICAgICAgICAgICAgICAgImEiICgmYy0+cmVkRGl0aGVyKQorICAgICAgICApOworICAgIH0KK30KK3N0YXRpYyBhdl9jb2xkIHZvaWQgUkVOQU1FKHN3c19pbml0X3N3c2NhbGUpKFN3c0NvbnRleHQgKmMpCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGRzdEZvcm1hdCA9IGMtPmRzdEZvcm1hdDsKKworICAgIGMtPnVzZV9tbXhfdmZpbHRlcj0gMDsKKyAgICBpZiAoIWlzMTZCUFMoZHN0Rm9ybWF0KSAmJiAhaXM5X09SXzEwQlBTKGRzdEZvcm1hdCkgJiYgZHN0Rm9ybWF0ICE9IEFWX1BJWF9GTVRfTlYxMgorICAgICAgICAmJiBkc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9OVjIxICYmICEoYy0+ZmxhZ3MgJiBTV1NfQklURVhBQ1QpKSB7CisgICAgICAgICAgICBpZiAoYy0+ZmxhZ3MgJiBTV1NfQUNDVVJBVEVfUk5EKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoYy0+ZmxhZ3MgJiBTV1NfRlVMTF9DSFJfSF9JTlQpKSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYy0+ZHN0Rm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjogICBjLT55dXYycGFja2VkWCA9IFJFTkFNRSh5dXYycmdiMzJfWF9hcik7ICAgYnJlYWs7CisjaWYgSEFWRV82UkVHUworICAgICAgICAgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6ICAgYy0+eXV2MnBhY2tlZFggPSBSRU5BTUUoeXV2MmJncjI0X1hfYXIpOyAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NTU6ICBjLT55dXYycGFja2VkWCA9IFJFTkFNRSh5dXYycmdiNTU1X1hfYXIpOyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NjU6ICBjLT55dXYycGFja2VkWCA9IFJFTkFNRSh5dXYycmdiNTY1X1hfYXIpOyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVlWNDIyOiBjLT55dXYycGFja2VkWCA9IFJFTkFNRSh5dXYyeXV5djQyMl9YX2FyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjLT51c2VfbW14X3ZmaWx0ZXI9IDE7CisgICAgICAgICAgICAgICAgYy0+eXV2MnBsYW5lWCA9IFJFTkFNRSh5dXYyeXV2WCAgICApOworICAgICAgICAgICAgICAgIGlmICghKGMtPmZsYWdzICYgU1dTX0ZVTExfQ0hSX0hfSU5UKSkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMtPmRzdEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMzI6ICAgYy0+eXV2MnBhY2tlZFggPSBSRU5BTUUoeXV2MnJnYjMyX1gpOyAgIGJyZWFrOworI2lmIEhBVkVfNlJFR1MKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OiAgIGMtPnl1djJwYWNrZWRYID0gUkVOQU1FKHl1djJiZ3IyNF9YKTsgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTU1OiAgYy0+eXV2MnBhY2tlZFggPSBSRU5BTUUoeXV2MnJnYjU1NV9YKTsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTY1OiAgYy0+eXV2MnBhY2tlZFggPSBSRU5BTUUoeXV2MnJnYjU2NV9YKTsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVZVjQyMjogYy0+eXV2MnBhY2tlZFggPSBSRU5BTUUoeXV2Mnl1eXY0MjJfWCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCEoYy0+ZmxhZ3MgJiBTV1NfRlVMTF9DSFJfSF9JTlQpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGMtPmRzdEZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjMyOgorICAgICAgICAgICAgICAgIGMtPnl1djJwYWNrZWQxID0gUkVOQU1FKHl1djJyZ2IzMl8xKTsKKyAgICAgICAgICAgICAgICBjLT55dXYycGFja2VkMiA9IFJFTkFNRSh5dXYycmdiMzJfMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgICAgICAgICAgICAgYy0+eXV2MnBhY2tlZDEgPSBSRU5BTUUoeXV2MmJncjI0XzEpOworICAgICAgICAgICAgICAgIGMtPnl1djJwYWNrZWQyID0gUkVOQU1FKHl1djJiZ3IyNF8yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NTU6CisgICAgICAgICAgICAgICAgYy0+eXV2MnBhY2tlZDEgPSBSRU5BTUUoeXV2MnJnYjU1NV8xKTsKKyAgICAgICAgICAgICAgICBjLT55dXYycGFja2VkMiA9IFJFTkFNRSh5dXYycmdiNTU1XzIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU2NToKKyAgICAgICAgICAgICAgICBjLT55dXYycGFja2VkMSA9IFJFTkFNRSh5dXYycmdiNTY1XzEpOworICAgICAgICAgICAgICAgIGMtPnl1djJwYWNrZWQyID0gUkVOQU1FKHl1djJyZ2I1NjVfMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVZVjQyMjoKKyAgICAgICAgICAgICAgICBjLT55dXYycGFja2VkMSA9IFJFTkFNRSh5dXYyeXV5djQyMl8xKTsKKyAgICAgICAgICAgICAgICBjLT55dXYycGFja2VkMiA9IFJFTkFNRSh5dXYyeXV5djQyMl8yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYy0+c3JjQnBjID09IDggJiYgYy0+ZHN0QnBjIDw9IDE0KSB7CisgICAgLy8gVXNlIHRoZSBuZXcgTU1YIHNjYWxlciBpZiB0aGUgTU1YRVhUIG9uZSBjYW4ndCBiZSB1c2VkIChpdCBpcyBmYXN0ZXIgdGhhbiB0aGUgeDg2IEFTTSBvbmUpLgorI2lmIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUCisgICAgaWYgKGMtPmZsYWdzICYgU1dTX0ZBU1RfQklMSU5FQVIgJiYgYy0+Y2FuTU1YRVhUQmVVc2VkKSB7CisgICAgICAgIGMtPmh5c2NhbGVfZmFzdCA9IGZmX2h5c2NhbGVfZmFzdF9tbXhleHQ7CisgICAgICAgIGMtPmhjc2NhbGVfZmFzdCA9IGZmX2hjc2NhbGVfZmFzdF9tbXhleHQ7CisgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBDT01QSUxFX1RFTVBMQVRFX01NWEVYVCAqLworICAgICAgICBjLT5oeXNjYWxlX2Zhc3QgPSBOVUxMOworICAgICAgICBjLT5oY3NjYWxlX2Zhc3QgPSBOVUxMOworI2lmIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUCisgICAgfQorI2VuZGlmIC8qIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUICovCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUveDg2L3c2NHhtbXRlc3QuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni93NjR4bW10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxNDNkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni93NjR4bW10ZXN0LmMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIGNoZWNrIFhNTSByZWdpc3RlcnMgZm9yIGNsb2JiZXJzIG9uIFdpbjY0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni93NjR4bW10ZXN0LmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCisKK3dyYXAoc3dzX3NjYWxlKHN0cnVjdCBTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpjb25zdCBzcmNTbGljZVtdLAorICAgICAgICAgICAgICAgY29uc3QgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgdWludDhfdCAqY29uc3QgZHN0W10sIGNvbnN0IGludCBkc3RTdHJpZGVbXSkpCit7CisgICAgdGVzdHhtbWNsb2JiZXJzKHN3c19zY2FsZSwgYywgc3JjU2xpY2UsIHNyY1N0cmlkZSwgc3JjU2xpY2VZLAorICAgICAgICAgICAgICAgICAgICBzcmNTbGljZUgsIGRzdCwgZHN0U3RyaWRlKTsKK30KZGlmZiAtLWdpdCBhL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni95dXYycmdiLmMgYi9mZm1wZWcvbGlic3dzY2FsZS94ODYveXV2MnJnYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMmY3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS94ODYveXV2MnJnYi5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogc29mdHdhcmUgWVVWIHRvIFJHQiBjb252ZXJ0ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIE1NWC9NTVhFWFQgdGVtcGxhdGUgc3R1ZmYgKG5lZWRlZCBmb3IgZmFzdCBtb3ZudHEgc3VwcG9ydCksCisgKiAxLDQsOGJwcCBzdXBwb3J0IGFuZCBjb250ZXh0IC8gZGVnbG9iYWxpemUgc3R1ZmYKKyAqIGJ5IE1pY2hhZWwgTmllZGVybWF5ZXIgKG1pY2hhZWxuaUBnbXguYXQpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3JnYjJyZ2IuaCIKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3N3c2NhbGUuaCIKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3N3c2NhbGVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisKKyNpZiBIQVZFX0lOTElORV9BU00KKworI2RlZmluZSBESVRIRVIxWEJQUCAvLyBvbmx5IGZvciBNTVgKKworLyogaG9wZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYXJlIGNhY2hlIGxpbmUgYWxpZ25lZCAqLworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIG1teF8wMGZmdykgICA9IDB4MDBmZjAwZmYwMGZmMDBmZlVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBtbXhfcmVkbWFzaykgPSAweGY4ZjhmOGY4ZjhmOGY4ZjhVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgbW14X2dybm1hc2spID0gMHhmY2ZjZmNmY2ZjZmNmY2ZjVUxMOworREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIHBiX2UwKSA9IDB4ZTBlMGUwZTBlMGUwZTBlMFVMTDsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIHVpbnQ2NF90LCBwYl8wMykgPSAweDAzMDMwMzAzMDMwMzAzMDNVTEw7CitERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgcGJfMDcpID0gMHgwNzA3MDcwNzA3MDcwNzA3VUxMOworCisvL01NWCB2ZXJzaW9ucworI2lmIEhBVkVfTU1YX0lOTElORSAmJiBIQVZFXzZSRUdTCisjdW5kZWYgUkVOQU1FCisjdW5kZWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgMAorI2RlZmluZSBSRU5BTUUoYSkgYSAjIyBfbW14CisjaW5jbHVkZSAieXV2MnJnYl90ZW1wbGF0ZS5jIgorI2VuZGlmIC8qIEhBVkVfTU1YX0lOTElORSAmJiBIQVZFXzZSRUdTICovCisKKy8vIE1NWEVYVCB2ZXJzaW9ucworI2lmIEhBVkVfTU1YRVhUX0lOTElORSAmJiBIQVZFXzZSRUdTCisjdW5kZWYgUkVOQU1FCisjdW5kZWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQKKyNkZWZpbmUgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgMQorI2RlZmluZSBSRU5BTUUoYSkgYSAjIyBfbW14ZXh0CisjaW5jbHVkZSAieXV2MnJnYl90ZW1wbGF0ZS5jIgorI2VuZGlmIC8qIEhBVkVfTU1YRVhUX0lOTElORSAmJiBIQVZFXzZSRUdTICovCisKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworYXZfY29sZCBTd3NGdW5jIGZmX3l1djJyZ2JfaW5pdF94ODYoU3dzQ29udGV4dCAqYykKK3sKKyNpZiBIQVZFX01NWF9JTkxJTkUgJiYgSEFWRV82UkVHUworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyNpZiBIQVZFX01NWEVYVF9JTkxJTkUKKyAgICBpZiAoSU5MSU5FX01NWEVYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIHN3aXRjaCAoYy0+ZHN0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgICAgIHJldHVybiB5dXY0MjBfcmdiMjRfbW14ZXh0OworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgICAgICAgICByZXR1cm4geXV2NDIwX2JncjI0X21teGV4dDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKElOTElORV9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBzd2l0Y2ggKGMtPmRzdEZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjMyOgorICAgICAgICAgICAgICAgIGlmIChjLT5zcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDIwUCkgeworI2lmIEhBVkVfN1JFR1MgJiYgQ09ORklHX1NXU0NBTEVfQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHl1dmE0MjBfcmdiMzJfbW14OworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4geXV2NDIwX3JnYjMyX21teDsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IzMjoKKyAgICAgICAgICAgICAgICBpZiAoYy0+c3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWQTQyMFApIHsKKyNpZiBIQVZFXzdSRUdTICYmIENPTkZJR19TV1NDQUxFX0FMUEhBCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB5dXZhNDIwX2JncjMyX21teDsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHl1djQyMF9iZ3IzMl9tbXg7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHl1djQyMF9yZ2IyNF9tbXg7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHl1djQyMF9iZ3IyNF9tbXg7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTY1OgorICAgICAgICAgICAgICAgIHJldHVybiB5dXY0MjBfcmdiMTZfbW14OworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU1NToKKyAgICAgICAgICAgICAgICByZXR1cm4geXV2NDIwX3JnYjE1X21teDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBIQVZFX01NWF9JTkxJTkUgICYmIEhBVkVfNlJFR1MgKi8KKworICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUveDg2L3l1djJyZ2JfdGVtcGxhdGUuYyBiL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni95dXYycmdiX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiNzhmNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZy9saWJzd3NjYWxlL3g4Ni95dXYycmdiX3RlbXBsYXRlLmMKQEAgLTAsMCArMSw0NjcgQEAKKy8qCisgKiBzb2Z0d2FyZSBZVVYgdG8gUkdCIGNvbnZlcnRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqICAgICAgICAgICAoYykgMjAxMCBLb25zdGFudGluIFNoaXNoa292CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlX2ludGVybmFsLmgiCisKKyN1bmRlZiBNT1ZOVFEKKyN1bmRlZiBFTU1TCisjdW5kZWYgU0ZFTkNFCisKKyNpZiBDT01QSUxFX1RFTVBMQVRFX01NWEVYVAorI2RlZmluZSBNT1ZOVFEgIm1vdm50cSIKKyNkZWZpbmUgU0ZFTkNFICJzZmVuY2UiCisjZWxzZQorI2RlZmluZSBNT1ZOVFEgIm1vdnEiCisjZGVmaW5lIFNGRU5DRSAiICMgbm9wIgorI2VuZGlmCisKKyNkZWZpbmUgUkVHX0JMVUUgICIwIgorI2RlZmluZSBSRUdfUkVEICAgIjEiCisjZGVmaW5lIFJFR19HUkVFTiAiMiIKKyNkZWZpbmUgUkVHX0FMUEhBICIzIgorCisjZGVmaW5lIFlVVjJSR0JfTE9PUChkZXB0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaF9zaXplID0gKGMtPmRzdFcgKyA3KSAmIH43OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGhfc2l6ZSAqIGRlcHRoID4gRkZBQlMoZHN0U3RyaWRlWzBdKSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhfc2l6ZSAtPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnNoaWZ0ID0gYy0+c3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfWVVWNDIyUDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoInB4b3IgJW1tNCwgJW1tNFxuXHQiKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh5ID0gMDsgeSA8IHNyY1NsaWNlSDsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQ4X3QgKmltYWdlICAgID0gZHN0WzBdICsgKHkgKyBzcmNTbGljZVkpICogZHN0U3RyaWRlWzBdOyBcCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB5ID0gc3JjWzBdICsgICAgICAgICAgICAgICB5ICogc3JjU3RyaWRlWzBdOyBcCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB1ID0gc3JjWzFdICsgICAoeSA+PiB2c2hpZnQpICogc3JjU3RyaWRlWzFdOyBcCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB2ID0gc3JjWzJdICsgICAoeSA+PiB2c2hpZnQpICogc3JjU3RyaWRlWzJdOyBcCisgICAgICAgIHg4Nl9yZWcgaW5kZXggPSAtaF9zaXplIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgWVVWMlJHQl9JTklUSUFMX0xPQUQgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICBcCisgICAgICAgICJtb3ZxICglNSwgJTAsIDIpLCAlJW1tNlxuXHQiIFwKKyAgICAgICAgIm1vdmQgICAgKCUyLCAlMCksICUlbW0wXG5cdCIgXAorICAgICAgICAibW92ZCAgICAoJTMsICUwKSwgJSVtbTFcblx0IiBcCisgICAgICAgICIxOiBcblx0IiAgICAgICAgICAgICAgICAgICAgIFwKKworLyogWVVWMlJHQiBjb3JlCisgKiBDb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBpbiB1c3VhbCB3YXk6CisgKiBSID0gWScgKiBZY29lZiArIFZyZWQgKiBWJworICogRyA9IFknICogWWNvZWYgKyBWZ3JlZW4gKiBWJyArIFVncmVlbiAqIFUnCisgKiBCID0gWScgKiBZY29lZiAgICAgICAgICAgICAgICsgVWJsdWUgKiBVJworICoKKyAqIHdoZXJlIFgnID0gWCAqIDggLSBYb2Zmc2V0IChtdWx0aXBsaWNhdGlvbiBpcyBwZXJmb3JtZWQgdG8gaW5jcmVhc2UKKyAqIHByZWNpc2lvbiBhIGJpdCkuCisgKiBTaW5jZSBpdCBvcGVyYXRlcyBpbiBZVVY0MjAgY29sb3JzcGFjZSwgWSBjb21wb25lbnQgaXMgYWRkaXRpb25hbGx5CisgKiBzcGxpdCBpbnRvIFkxIGFuZCBZMiBmb3IgZXZlbiBhbmQgb2RkIHBpeGVscy4KKyAqCisgKiBJbnB1dDoKKyAqIG1tMCAtIFUgKDQgZWxlbXMpLCBtbTEgLSBWICg0IGVsZW1zKSwgbW02IC0gWSAoOCBlbGVtcyksIG1tNCAtIHplcm8gcmVnaXN0ZXIKKyAqIE91dHB1dDoKKyAqIG1tMSAtIFIsIG1tMiAtIEcsIG1tMCAtIEIKKyAqLworI2RlZmluZSBZVVYyUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBjb252ZXJ0IFksIFUsIFYgaW50byBZMScsIFkyJywgVScsIFYnICovICBcCisgICAgIm1vdnEgICAgICAlJW1tNiwgJSVtbTdcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2tsYncgJSVtbTQsICUlbW0wXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNrbGJ3ICUlbW00LCAlJW1tMVxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInBhbmQgICAgICJNQU5HTEUobW14XzAwZmZ3KSIsICUlbW02XG5cdCIgICAgXAorICAgICJwc3JsdyAgICAgJDgsICAgICUlbW03XG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHNsbHcgICAgICQzLCAgICAlJW1tMFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInBzbGx3ICAgICAkMywgICAgJSVtbTFcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJwc2xsdyAgICAgJDMsICAgICUlbW02XG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHNsbHcgICAgICQzLCAgICAlJW1tN1xuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJzdyAgICJVX09GRlNFVCIoJTQpLCAlJW1tMFxuXHQiICAgICAgICAgXAorICAgICJwc3Vic3cgICAiVl9PRkZTRVQiKCU0KSwgJSVtbTFcblx0IiAgICAgICAgIFwKKyAgICAicHN1YncgICAgIllfT0ZGU0VUIiglNCksICUlbW02XG5cdCIgICAgICAgICBcCisgICAgInBzdWJ3ICAgICJZX09GRlNFVCIoJTQpLCAlJW1tN1xuXHQiICAgICAgICAgXAorXAorICAgICAvKiBtdWx0aXBseSBieSBjb2VmZmljaWVudHMgKi8gICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICUlbW0wLCAlJW1tMlxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tMSwgJSVtbTNcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJwbXVsaHcgICAiVUdfQ09FRkYiKCU0KSwgJSVtbTJcblx0IiAgICAgICAgIFwKKyAgICAicG11bGh3ICAgIlZHX0NPRUZGIiglNCksICUlbW0zXG5cdCIgICAgICAgICBcCisgICAgInBtdWxodyAgICJZX0NPRUZGIiAoJTQpLCAlJW1tNlxuXHQiICAgICAgICAgXAorICAgICJwbXVsaHcgICAiWV9DT0VGRiIgKCU0KSwgJSVtbTdcblx0IiAgICAgICAgIFwKKyAgICAicG11bGh3ICAgIlVCX0NPRUZGIiglNCksICUlbW0wXG5cdCIgICAgICAgICBcCisgICAgInBtdWxodyAgICJWUl9DT0VGRiIoJTQpLCAlJW1tMVxuXHQiICAgICAgICAgXAorICAgICJwYWRkc3cgICAgJSVtbTMsICUlbW0yXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBub3c6IG1tMCA9IFVCLCBtbTEgPSBWUiwgbW0yID0gQ0cgKi8gICAgICBcCisgICAgLyogICAgICBtbTYgPSBZMSwgbW03ID0gWTIgKi8gICAgICAgICAgICAgICAgXAorXAorICAgIC8qIHByb2R1Y2UgUkdCICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAgICUlbW03LCAlJW1tM1xuXHQiICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tNywgJSVtbTVcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkc3cgICAgJSVtbTAsICUlbW0zXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICAgICUlbW0xLCAlJW1tNVxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInBhZGRzdyAgICAlJW1tMiwgJSVtbTdcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkc3cgICAgJSVtbTYsICUlbW0wXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHN3ICAgICUlbW02LCAlJW1tMVxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInBhZGRzdyAgICAlJW1tNiwgJSVtbTJcblx0IiAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIFJHQl9QQUNLX0lOVEVSTEVBVkUgICAgICAgICAgICAgICAgICBcCisgICAgLyogcGFjayBhbmQgaW50ZXJsZWF2ZSBldmVuL29kZCBwaXhlbHMgKi8gICAgXAorICAgICJwYWNrdXN3YiAgJSVtbTEsICUlbW0wXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAicGFja3Vzd2IgICUlbW01LCAlJW1tM1xuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInBhY2t1c3diICAlJW1tMiwgJSVtbTJcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICAgJSVtbTAsICUlbW0xXG5cbiIgICAgICAgICAgICAgICAgIFwKKyAgICAicGFja3Vzd2IgICUlbW03LCAlJW1tN1xuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInB1bnBja2xidyAlJW1tMywgJSVtbTBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJwdW5wY2toYncgJSVtbTMsICUlbW0xXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMlxuXHQiICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgWVVWMlJHQl9FTkRMT09QKGRlcHRoKSAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgOCAoJTUsICUwLCAyKSwgJSVtbTZcblx0IiAgICAgICAgICAgICAgXAorICAgICJtb3ZkIDQgKCUzLCAlMCksICAgICUlbW0xXG5cdCIgICAgICAgICAgICAgIFwKKyAgICAibW92ZCA0ICglMiwgJTApLCAgICAlJW1tMFxuXHQiICAgICAgICAgICAgICBcCisgICAgImFkZCAkIkFWX1NUUklOR0lGWShkZXB0aCAqIDgpIiwgJTFcblx0IiAgICAgXAorICAgICJhZGQgICQ0LCAlMFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAianMgICAxYlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNpZiBDT01QSUxFX1RFTVBMQVRFX01NWEVYVAorI3VuZGVmIFJHQl9QQUNLMjRfQl9PUEVSQU5EUworI2RlZmluZSBSR0JfUEFDSzI0X0JfT1BFUkFORFMgTkFNRURfQ09OU1RSQUlOVFNfQVJSQVlfQUREKG1hc2sxMTAxLG1hc2swMTEwLG1hc2swMTAwLG1hc2swMDEwLG1hc2sxMDAxKQorI2Vsc2UKKyN1bmRlZiBSR0JfUEFDSzI0X0JfT1BFUkFORFMKKyNkZWZpbmUgUkdCX1BBQ0syNF9CX09QRVJBTkRTCisjZW5kaWYKKworI2RlZmluZSBZVVYyUkdCX09QRVJBTkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICIrciIgKGluZGV4KSwgIityIiAoaW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICJyIiAocHUgLSBpbmRleCksICJyIiAocHYgLSBpbmRleCksICJyIigmYy0+cmVkRGl0aGVyKSwgXAorICAgICAgICAgICJyIiAocHkgLSAyKmluZGV4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChtbXhfMDBmZncscGJfMDMscGJfMDcsbW14X3JlZG1hc2sscGJfZTApIFwKKyAgICAgICAgICBSR0JfUEFDSzI0X0JfT1BFUkFORFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworI2RlZmluZSBZVVYyUkdCX09QRVJBTkRTX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICIrciIgKGluZGV4KSwgIityIiAoaW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICJyIiAocHUgLSBpbmRleCksICJyIiAocHYgLSBpbmRleCksICJyIigmYy0+cmVkRGl0aGVyKSwgXAorICAgICAgICAgICJyIiAocHkgLSAyKmluZGV4KSwgInIiIChwYSAtIDIqaW5kZXgpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChtbXhfMDBmZncpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIFlVVjJSR0JfRU5ERlVOQyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKFNGRU5DRSJcblx0IiAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgImVtbXMgICAgXG5cdCIpOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHNyY1NsaWNlSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIElGMCh4KQorI2RlZmluZSBJRjEoeCkgeAorCisjZGVmaW5lIFJHQl9QQUNLMTYoZ21hc2ssIGlzMTUpICAgICAgICAgICAgICAgICAgXAorICAgICJwYW5kICAgICAgIk1BTkdMRShtbXhfcmVkbWFzaykiLCAlJW1tMFxuXHQiIFwKKyAgICAicGFuZCAgICAgICJNQU5HTEUobW14X3JlZG1hc2spIiwgJSVtbTFcblx0IiBcCisgICAgIm1vdnEgICAgICAlJW1tMiwgICAgICUlbW0zXG5cdCIgICAgICAgICAgICAgXAorICAgICJwc2xsdyAgICQiQVZfU1RSSU5HSUZZKDMtaXMxNSkiLCAlJW1tMlxuXHQiIFwKKyAgICAicHNybHcgICAkIkFWX1NUUklOR0lGWSg1K2lzMTUpIiwgJSVtbTNcblx0IiBcCisgICAgInBzcmx3ICAgICAkMywgICAgICAgICUlbW0wXG5cdCIgICAgICAgICAgICAgXAorICAgIElGIyNpczE1KCJwc3JsdyAgJDEsICAlJW1tMVxuXHQiKSAgICAgICAgICAgIFwKKyAgICAicGFuZCAiTUFOR0xFKHBiX2UwKSIsICUlbW0yXG5cdCIgICAgICAgICAgICBcCisgICAgInBhbmQgIk1BTkdMRShnbWFzaykiLCAlJW1tM1xuXHQiICAgICAgICAgICAgXAorICAgICJwb3IgICAgICAgJSVtbTIsICAgICAlJW1tMFxuXHQiICAgICAgICAgICAgIFwKKyAgICAicG9yICAgICAgICUlbW0zLCAgICAgJSVtbTFcblx0IiAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAlJW1tMCwgICAgICUlbW0yXG5cdCIgICAgICAgICAgICAgXAorICAgICJwdW5wY2tsYncgJSVtbTEsICAgICAlJW1tMFxuXHQiICAgICAgICAgICAgIFwKKyAgICAicHVucGNraGJ3ICUlbW0xLCAgICAgJSVtbTJcblx0IiAgICAgICAgICAgICBcCisgICAgTU9WTlRRICIgICAlJW1tMCwgICAgICAoJTEpXG5cdCIgICAgICAgICAgICAgXAorICAgIE1PVk5UUSAiICAgJSVtbTIsICAgICA4KCUxKVxuXHQiICAgICAgICAgICAgIFwKKworI2RlZmluZSBESVRIRVJfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFkZHVzYiAiQkxVRV9ESVRIRVIiKCU0KSwgICUlbW0wXG5cdCIgICAgICBcCisgICAgInBhZGR1c2IgIkdSRUVOX0RJVEhFUiIoJTQpLCAlJW1tMlxuXHQiICAgICAgXAorICAgICJwYWRkdXNiICJSRURfRElUSEVSIiglNCksICAgJSVtbTFcblx0IiAgICAgIFwKKworI2lmICFDT01QSUxFX1RFTVBMQVRFX01NWEVYVAorc3RhdGljIGlubGluZSBpbnQgUkVOQU1FKHl1djQyMF9yZ2IxNSkoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBpbnQgeSwgaF9zaXplLCB2c2hpZnQ7CisKKyAgICBZVVYyUkdCX0xPT1AoMikKKworI2lmZGVmIERJVEhFUjFYQlBQCisgICAgICAgIGMtPmJsdWVEaXRoZXIgID0gZmZfZGl0aGVyOFt5ICAgICAgICYgMV07CisgICAgICAgIGMtPmdyZWVuRGl0aGVyID0gZmZfZGl0aGVyOFt5ICAgICAgICYgMV07CisgICAgICAgIGMtPnJlZERpdGhlciAgID0gZmZfZGl0aGVyOFsoeSArIDEpICYgMV07CisjZW5kaWYKKworICAgICAgICBZVVYyUkdCX0lOSVRJQUxfTE9BRAorICAgICAgICBZVVYyUkdCCisgICAgICAgIFJHQl9QQUNLX0lOVEVSTEVBVkUKKyNpZmRlZiBESVRIRVIxWEJQUAorICAgICAgICBESVRIRVJfUkdCCisjZW5kaWYKKyAgICAgICAgUkdCX1BBQ0sxNihwYl8wMywgMSkKKworICAgIFlVVjJSR0JfRU5ETE9PUCgyKQorICAgIFlVVjJSR0JfT1BFUkFORFMKKyAgICBZVVYyUkdCX0VOREZVTkMKK30KKworc3RhdGljIGlubGluZSBpbnQgUkVOQU1FKHl1djQyMF9yZ2IxNikoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBpbnQgeSwgaF9zaXplLCB2c2hpZnQ7CisKKyAgICBZVVYyUkdCX0xPT1AoMikKKworI2lmZGVmIERJVEhFUjFYQlBQCisgICAgICAgIGMtPmJsdWVEaXRoZXIgID0gZmZfZGl0aGVyOFt5ICAgICAgICYgMV07CisgICAgICAgIGMtPmdyZWVuRGl0aGVyID0gZmZfZGl0aGVyNFt5ICAgICAgICYgMV07CisgICAgICAgIGMtPnJlZERpdGhlciAgID0gZmZfZGl0aGVyOFsoeSArIDEpICYgMV07CisjZW5kaWYKKworICAgICAgICBZVVYyUkdCX0lOSVRJQUxfTE9BRAorICAgICAgICBZVVYyUkdCCisgICAgICAgIFJHQl9QQUNLX0lOVEVSTEVBVkUKKyNpZmRlZiBESVRIRVIxWEJQUAorICAgICAgICBESVRIRVJfUkdCCisjZW5kaWYKKyAgICAgICAgUkdCX1BBQ0sxNihwYl8wNywgMCkKKworICAgIFlVVjJSR0JfRU5ETE9PUCgyKQorICAgIFlVVjJSR0JfT1BFUkFORFMKKyAgICBZVVYyUkdCX0VOREZVTkMKK30KKyNlbmRpZiAvKiAhQ09NUElMRV9URU1QTEFURV9NTVhFWFQgKi8KKworI2RlZmluZSBSR0JfUEFDSzI0KGJsdWUsIHJlZClcCisgICAgInBhY2t1c3diICAlJW1tMywgICAgICAlJW1tMCBcbiIgLyogUjAgUjIgUjQgUjYgUjEgUjMgUjUgUjcgKi9cCisgICAgInBhY2t1c3diICAlJW1tNSwgICAgICAlJW1tMSBcbiIgLyogQjAgQjIgQjQgQjYgQjEgQjMgQjUgQjcgKi9cCisgICAgInBhY2t1c3diICAlJW1tNywgICAgICAlJW1tMiBcbiIgLyogRzAgRzIgRzQgRzYgRzEgRzMgRzUgRzcgKi9cCisgICAgIm1vdnEgICAgICAlJW1tInJlZCIsICAlJW1tMyBcbiJcCisgICAgIm1vdnEgICAgICAlJW1tImJsdWUiLCAlJW1tNiBcbiJcCisgICAgInBzcmxxICAgICAkMzIsICAgICAgICAlJW1tInJlZCIgXG4iIC8qIFIxIFIzIFI1IFI3ICovXAorICAgICJwdW5wY2tsYncgJSVtbTIsICAgICAgJSVtbTMgXG4iIC8qIFIwIEcwIFIyIEcyIFI0IEc0IFI2IEc2ICovXAorICAgICJwdW5wY2tsYncgJSVtbSJyZWQiLCAgJSVtbTYgXG4iIC8qIEIwIFIxIEIyIFIzIEI0IFI1IEI2IFI3ICovXAorICAgICJtb3ZxICAgICAgJSVtbTMsICAgICAgJSVtbTUgXG4iXAorICAgICJwdW5wY2toYncgJSVtbSJibHVlIiwgJSVtbTIgXG4iIC8qIEcxIEIxIEczIEIzIEc1IEI1IEc3IEI3wqAqL1wKKyAgICAicHVucGNrbHdkICUlbW02LCAgICAgICUlbW0zIFxuIiAvKiBSMCBHMCBCMCBSMSBSMiBHMiBCMiBSMyAqL1wKKyAgICAicHVucGNraHdkICUlbW02LCAgICAgICUlbW01IFxuIiAvKiBSNCBHNCBCNCBSNSBSNiBHNiBCNiBSNyAqL1wKKyAgICBSR0JfUEFDSzI0X0IKKworI2lmIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUCitERUNMQVJFX0FTTV9DT05TVCg4LCBpbnQxNl90LCBtYXNrMTEwMVs0XSkgPSB7LTEsLTEsIDAsLTF9OworREVDTEFSRV9BU01fQ09OU1QoOCwgaW50MTZfdCwgbWFzazAwMTBbNF0pID0geyAwLCAwLC0xLCAwfTsKK0RFQ0xBUkVfQVNNX0NPTlNUKDgsIGludDE2X3QsIG1hc2swMTEwWzRdKSA9IHsgMCwtMSwtMSwgMH07CitERUNMQVJFX0FTTV9DT05TVCg4LCBpbnQxNl90LCBtYXNrMTAwMVs0XSkgPSB7LTEsIDAsIDAsLTF9OworREVDTEFSRV9BU01fQ09OU1QoOCwgaW50MTZfdCwgbWFzazAxMDBbNF0pID0geyAwLC0xLCAwLCAwfTsKKyN1bmRlZiBSR0JfUEFDSzI0X0IKKyNkZWZpbmUgUkdCX1BBQ0syNF9CXAorICAgICJwc2h1ZncgICAgJDB4YzYsICAlJW1tMiwgJSVtbTEgXG4iXAorICAgICJwc2h1ZncgICAgJDB4ODQsICAlJW1tMywgJSVtbTYgXG4iXAorICAgICJwc2h1ZncgICAgJDB4MzgsICAlJW1tNSwgJSVtbTcgXG4iXAorICAgICJwYW5kICJNQU5HTEUobWFzazExMDEpIiwgJSVtbTYgXG4iIC8qIFIwIEcwIEIwIFIxIC0tIC0tIFIyIEcyICovXAorICAgICJtb3ZxICAgICAgJSVtbTEsICAgICAgICAgJSVtbTAgXG4iXAorICAgICJwYW5kICJNQU5HTEUobWFzazAxMTApIiwgJSVtbTcgXG4iIC8qIC0tIC0tIFI2IEc2IEI2IFI3IC0tIC0tICovXAorICAgICJtb3ZxICAgICAgJSVtbTEsICAgICAgICAgJSVtbTIgXG4iXAorICAgICJwYW5kICJNQU5HTEUobWFzazAxMDApIiwgJSVtbTEgXG4iIC8qIC0tIC0tIEczIEIzIC0tIC0tIC0tIC0tICovXAorICAgICJwc3JscSAgICAgICAkNDgsICAgICAgICAgJSVtbTMgXG4iIC8qIEIyIFIzIC0tIC0tIC0tIC0tIC0tIC0tICovXAorICAgICJwYW5kICJNQU5HTEUobWFzazAwMTApIiwgJSVtbTAgXG4iIC8qIC0tIC0tIC0tIC0tIEcxIEIxIC0tIC0tICovXAorICAgICJwc2xscSAgICAgICAkMzIsICAgICAgICAgJSVtbTUgXG4iIC8qIC0tIC0tIC0tIC0tIFI0IEc0IEI0IFI1ICovXAorICAgICJwYW5kICJNQU5HTEUobWFzazEwMDEpIiwgJSVtbTIgXG4iIC8qIEc1IEI1IC0tIC0tIC0tIC0tIEc3IEI3ICovXAorICAgICJwb3IgICAgICAgJSVtbTMsICAgICAgICAgJSVtbTEgXG4iXAorICAgICJwb3IgICAgICAgJSVtbTYsICAgICAgICAgJSVtbTAgXG4iXAorICAgICJwb3IgICAgICAgJSVtbTUsICAgICAgICAgJSVtbTEgXG4iXAorICAgICJwb3IgICAgICAgJSVtbTcsICAgICAgICAgJSVtbTIgXG4iXAorICAgIE1PVk5UUSIgICAgJSVtbTAsICAgICAgICAgICglMSkgXG4iXAorICAgIE1PVk5UUSIgICAgJSVtbTEsICAgICAgICAgOCglMSkgXG4iXAorICAgIE1PVk5UUSIgICAgJSVtbTIsICAgICAgICAxNiglMSkgXG4iXAorCisjZWxzZQorI3VuZGVmIFJHQl9QQUNLMjRfQgorI2RlZmluZSBSR0JfUEFDSzI0X0JcCisgICAgIm1vdmQgICAgICAlJW1tMywgICAgICAgKCUxKSBcbiIgLyogUjAgRzAgQjAgUjEgKi9cCisgICAgIm1vdmQgICAgICAlJW1tMiwgICAgICA0KCUxKSBcbiIgLyogRzEgQjEgKi9cCisgICAgInBzcmxxICAgICAkMzIsICAgICAgICAlJW1tMyBcbiJcCisgICAgInBzcmxxICAgICAkMTYsICAgICAgICAlJW1tMiBcbiJcCisgICAgIm1vdmQgICAgICAlJW1tMywgICAgICA2KCUxKSBcbiIgLyogUjIgRzIgQjIgUjMgKi9cCisgICAgIm1vdmQgICAgICAlJW1tMiwgICAgIDEwKCUxKSBcbiIgLyogRzMgQjMgKi9cCisgICAgInBzcmxxICAgICAkMTYsICAgICAgICAlJW1tMiBcbiJcCisgICAgIm1vdmQgICAgICAlJW1tNSwgICAgIDEyKCUxKSBcbiIgLyogUjQgRzQgQjQgUjUgKi9cCisgICAgIm1vdmQgICAgICAlJW1tMiwgICAgIDE2KCUxKSBcbiIgLyogRzUgQjUgKi9cCisgICAgInBzcmxxICAgICAkMzIsICAgICAgICAlJW1tNSBcbiJcCisgICAgIm1vdmQgICAgICAlJW1tMiwgICAgIDIwKCUxKSBcbiIgLyogLS0gLS0gRzcgQjcgKi9cCisgICAgIm1vdmQgICAgICAlJW1tNSwgICAgIDE4KCUxKSBcbiIgLyogUjYgRzYgQjYgUjcgKi9cCisKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBSRU5BTUUoeXV2NDIwX3JnYjI0KShTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTbGljZVksIGludCBzcmNTbGljZUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RbXSwgaW50IGRzdFN0cmlkZVtdKQoreworICAgIGludCB5LCBoX3NpemUsIHZzaGlmdDsKKworICAgIFlVVjJSR0JfTE9PUCgzKQorCisgICAgICAgIFlVVjJSR0JfSU5JVElBTF9MT0FECisgICAgICAgIFlVVjJSR0IKKyAgICAgICAgUkdCX1BBQ0syNChSRUdfQkxVRSwgUkVHX1JFRCkKKworICAgIFlVVjJSR0JfRU5ETE9PUCgzKQorICAgIFlVVjJSR0JfT1BFUkFORFMKKyAgICBZVVYyUkdCX0VOREZVTkMKK30KKworc3RhdGljIGlubGluZSBpbnQgUkVOQU1FKHl1djQyMF9iZ3IyNCkoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBpbnQgeSwgaF9zaXplLCB2c2hpZnQ7CisKKyAgICBZVVYyUkdCX0xPT1AoMykKKworICAgICAgICBZVVYyUkdCX0lOSVRJQUxfTE9BRAorICAgICAgICBZVVYyUkdCCisgICAgICAgIFJHQl9QQUNLMjQoUkVHX1JFRCwgUkVHX0JMVUUpCisKKyAgICBZVVYyUkdCX0VORExPT1AoMykKKyAgICBZVVYyUkdCX09QRVJBTkRTCisgICAgWVVWMlJHQl9FTkRGVU5DCit9CisKKworI2RlZmluZSBTRVRfRU1QVFlfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBjbXBlcWQgICAlJW1tIlJFR19BTFBIQSIsICUlbW0iUkVHX0FMUEhBIlxuXHQiIC8qIHNldCBhbHBoYSB0byAweEZGICovIFwKKworI2RlZmluZSBMT0FEX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgICAoJTYsICUwLCAyKSwgICAgICUlbW0iUkVHX0FMUEhBIlxuXHQiIFwKKworI2RlZmluZSBSR0JfUEFDSzMyKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSAgXAorICAgICJtb3ZxICAgICAgJSVtbSJibHVlIiwgICUlbW01XG5cdCIgICAgICAgXAorICAgICJtb3ZxICAgICAgJSVtbSJyZWQiLCAgICUlbW02XG5cdCIgICAgICAgXAorICAgICJwdW5wY2toYncgJSVtbSJncmVlbiIsICUlbW01XG5cdCIgICAgICAgXAorICAgICJwdW5wY2tsYncgJSVtbSJncmVlbiIsICUlbW0iYmx1ZSJcblx0IiAgXAorICAgICJwdW5wY2toYncgJSVtbSJhbHBoYSIsICUlbW02XG5cdCIgICAgICAgXAorICAgICJwdW5wY2tsYncgJSVtbSJhbHBoYSIsICUlbW0icmVkIlxuXHQiICAgXAorICAgICJtb3ZxICAgICAgJSVtbSJibHVlIiwgICUlbW0iZ3JlZW4iXG5cdCIgXAorICAgICJtb3ZxICAgICAgJSVtbTUsICAgICAgICUlbW0iYWxwaGEiXG5cdCIgXAorICAgICJwdW5wY2tsd2QgJSVtbSJyZWQiLCAgICUlbW0iYmx1ZSJcblx0IiAgXAorICAgICJwdW5wY2tod2QgJSVtbSJyZWQiLCAgICUlbW0iZ3JlZW4iXG5cdCIgXAorICAgICJwdW5wY2tsd2QgJSVtbTYsICAgICAgICUlbW01XG5cdCIgICAgICAgXAorICAgICJwdW5wY2tod2QgJSVtbTYsICAgICAgICUlbW0iYWxwaGEiXG5cdCIgXAorICAgIE1PVk5UUSAiICAgJSVtbSJibHVlIiwgICAwKCUxKVxuXHQiICAgICAgXAorICAgIE1PVk5UUSAiICAgJSVtbSJncmVlbiIsICA4KCUxKVxuXHQiICAgICAgXAorICAgIE1PVk5UUSAiICAgJSVtbTUsICAgICAgIDE2KCUxKVxuXHQiICAgICAgXAorICAgIE1PVk5UUSAiICAgJSVtbSJhbHBoYSIsIDI0KCUxKVxuXHQiICAgICAgXAorCisjaWYgIUNPTVBJTEVfVEVNUExBVEVfTU1YRVhUCitzdGF0aWMgaW5saW5lIGludCBSRU5BTUUoeXV2NDIwX3JnYjMyKShTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTbGljZVksIGludCBzcmNTbGljZUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RbXSwgaW50IGRzdFN0cmlkZVtdKQoreworICAgIGludCB5LCBoX3NpemUsIHZzaGlmdDsKKworICAgIFlVVjJSR0JfTE9PUCg0KQorCisgICAgICAgIFlVVjJSR0JfSU5JVElBTF9MT0FECisgICAgICAgIFlVVjJSR0IKKyAgICAgICAgUkdCX1BBQ0tfSU5URVJMRUFWRQorICAgICAgICBTRVRfRU1QVFlfQUxQSEEKKyAgICAgICAgUkdCX1BBQ0szMihSRUdfUkVELCBSRUdfR1JFRU4sIFJFR19CTFVFLCBSRUdfQUxQSEEpCisKKyAgICBZVVYyUkdCX0VORExPT1AoNCkKKyAgICBZVVYyUkdCX09QRVJBTkRTCisgICAgWVVWMlJHQl9FTkRGVU5DCit9CisKKyNpZiBIQVZFXzdSRUdTICYmIENPTkZJR19TV1NDQUxFX0FMUEhBCitzdGF0aWMgaW5saW5lIGludCBSRU5BTUUoeXV2YTQyMF9yZ2IzMikoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTbGljZVksIGludCBzcmNTbGljZUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICBpbnQgeSwgaF9zaXplLCB2c2hpZnQ7CisKKyAgICBZVVYyUkdCX0xPT1AoNCkKKworICAgICAgICBjb25zdCB1aW50OF90ICpwYSA9IHNyY1szXSArIHkgKiBzcmNTdHJpZGVbM107CisgICAgICAgIFlVVjJSR0JfSU5JVElBTF9MT0FECisgICAgICAgIFlVVjJSR0IKKyAgICAgICAgUkdCX1BBQ0tfSU5URVJMRUFWRQorICAgICAgICBMT0FEX0FMUEhBCisgICAgICAgIFJHQl9QQUNLMzIoUkVHX1JFRCwgUkVHX0dSRUVOLCBSRUdfQkxVRSwgUkVHX0FMUEhBKQorCisgICAgWVVWMlJHQl9FTkRMT09QKDQpCisgICAgWVVWMlJHQl9PUEVSQU5EU19BTFBIQQorICAgIFlVVjJSR0JfRU5ERlVOQworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IFJFTkFNRSh5dXY0MjBfYmdyMzIpKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1NsaWNlWSwgaW50IHNyY1NsaWNlSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0U3RyaWRlW10pCit7CisgICAgaW50IHksIGhfc2l6ZSwgdnNoaWZ0OworCisgICAgWVVWMlJHQl9MT09QKDQpCisKKyAgICAgICAgWVVWMlJHQl9JTklUSUFMX0xPQUQKKyAgICAgICAgWVVWMlJHQgorICAgICAgICBSR0JfUEFDS19JTlRFUkxFQVZFCisgICAgICAgIFNFVF9FTVBUWV9BTFBIQQorICAgICAgICBSR0JfUEFDSzMyKFJFR19CTFVFLCBSRUdfR1JFRU4sIFJFR19SRUQsIFJFR19BTFBIQSkKKworICAgIFlVVjJSR0JfRU5ETE9PUCg0KQorICAgIFlVVjJSR0JfT1BFUkFORFMKKyAgICBZVVYyUkdCX0VOREZVTkMKK30KKworI2lmIEhBVkVfN1JFR1MgJiYgQ09ORklHX1NXU0NBTEVfQUxQSEEKK3N0YXRpYyBpbmxpbmUgaW50IFJFTkFNRSh5dXZhNDIwX2JncjMyKShTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1NsaWNlWSwgaW50IHNyY1NsaWNlSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RbXSwgaW50IGRzdFN0cmlkZVtdKQoreworICAgIGludCB5LCBoX3NpemUsIHZzaGlmdDsKKworICAgIFlVVjJSR0JfTE9PUCg0KQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBhID0gc3JjWzNdICsgeSAqIHNyY1N0cmlkZVszXTsKKyAgICAgICAgWVVWMlJHQl9JTklUSUFMX0xPQUQKKyAgICAgICAgWVVWMlJHQgorICAgICAgICBSR0JfUEFDS19JTlRFUkxFQVZFCisgICAgICAgIExPQURfQUxQSEEKKyAgICAgICAgUkdCX1BBQ0szMihSRUdfQkxVRSwgUkVHX0dSRUVOLCBSRUdfUkVELCBSRUdfQUxQSEEpCisKKyAgICBZVVYyUkdCX0VORExPT1AoNCkKKyAgICBZVVYyUkdCX09QRVJBTkRTX0FMUEhBCisgICAgWVVWMlJHQl9FTkRGVU5DCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFDT01QSUxFX1RFTVBMQVRFX01NWEVYVCAqLwpkaWZmIC0tZ2l0IGEvZmZtcGVnL2xpYnN3c2NhbGUveXV2MnJnYi5jIGIvZmZtcGVnL2xpYnN3c2NhbGUveXV2MnJnYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOTJlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWcvbGlic3dzY2FsZS95dXYycmdiLmMKQEAgLTAsMCArMSw5MTYgQEAKKy8qCisgKiBzb2Z0d2FyZSBZVVYgdG8gUkdCIGNvbnZlcnRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBLb25zdGFudGluIFNoaXNoa292CisgKgorICogMSw0LDhicHAgc3VwcG9ydCBhbmQgY29udGV4dCAvIGRlZ2xvYmFsaXplIHN0dWZmCisgKiBieSBNaWNoYWVsIE5pZWRlcm1heWVyIChtaWNoYWVsbmlAZ214LmF0KQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInJnYjJyZ2IuaCIKKyNpbmNsdWRlICJzd3NjYWxlLmgiCisjaW5jbHVkZSAic3dzY2FsZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKK2NvbnN0IGludDMyX3QgZmZfeXV2MnJnYl9jb2VmZnNbOF1bNF0gPSB7CisgICAgeyAxMTc1MDQsIDEzODQ1MywgMTM5NTQsIDM0OTAzIH0sIC8qIG5vIHNlcXVlbmNlX2Rpc3BsYXlfZXh0ZW5zaW9uICovCisgICAgeyAxMTc1MDQsIDEzODQ1MywgMTM5NTQsIDM0OTAzIH0sIC8qIElUVS1SIFJlYy4gNzA5ICgxOTkwKSAqLworICAgIHsgMTA0NTk3LCAxMzIyMDEsIDI1Njc1LCA1MzI3OSB9LCAvKiB1bnNwZWNpZmllZCAqLworICAgIHsgMTA0NTk3LCAxMzIyMDEsIDI1Njc1LCA1MzI3OSB9LCAvKiByZXNlcnZlZCAqLworICAgIHsgMTA0NDQ4LCAxMzI3OTgsIDI0NzU5LCA1MzEwOSB9LCAvKiBGQ0MgKi8KKyAgICB7IDEwNDU5NywgMTMyMjAxLCAyNTY3NSwgNTMyNzkgfSwgLyogSVRVLVIgUmVjLiA2MjQtNCBTeXN0ZW0gQiwgRyAqLworICAgIHsgMTA0NTk3LCAxMzIyMDEsIDI1Njc1LCA1MzI3OSB9LCAvKiBTTVBURSAxNzBNICovCisgICAgeyAxMTc1NzksIDEzNjIzMCwgMTY5MDcsIDM1NTU5IH0gIC8qIFNNUFRFIDI0ME0gKDE5ODcpICovCit9OworCitjb25zdCBpbnQgKnN3c19nZXRDb2VmZmljaWVudHMoaW50IGNvbG9yc3BhY2UpCit7CisgICAgaWYgKGNvbG9yc3BhY2UgPiA3IHx8IGNvbG9yc3BhY2UgPCAwKQorICAgICAgICBjb2xvcnNwYWNlID0gU1dTX0NTX0RFRkFVTFQ7CisgICAgcmV0dXJuIGZmX3l1djJyZ2JfY29lZmZzW2NvbG9yc3BhY2VdOworfQorCisjZGVmaW5lIExPQURDSFJPTUEoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFUgPSBwdVtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWID0gcHZbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgciA9ICh2b2lkICopYy0+dGFibGVfclZbVitZVVZSR0JfVEFCTEVfSEVBRFJPT01dOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnID0gKHZvaWQgKikoYy0+dGFibGVfZ1VbVStZVVZSR0JfVEFCTEVfSEVBRFJPT01dICsgYy0+dGFibGVfZ1ZbVitZVVZSR0JfVEFCTEVfSEVBRFJPT01dKTsgIFwKKyAgICBiID0gKHZvaWQgKiljLT50YWJsZV9iVVtVK1lVVlJHQl9UQUJMRV9IRUFEUk9PTV07CisKKyNkZWZpbmUgUFVUUkdCKGRzdCwgc3JjLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgWSAgICAgICAgICAgICAgPSBzcmNbMiAqIGldOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFsyICogaV0gICAgID0gcltZXSArIGdbWV0gKyBiW1ldOyAgICAgICAgICAgIFwKKyAgICBZICAgICAgICAgICAgICA9IHNyY1syICogaSArIDFdOyAgICAgICAgICAgICAgICBcCisgICAgZHN0WzIgKiBpICsgMV0gPSByW1ldICsgZ1tZXSArIGJbWV07CisKKyNkZWZpbmUgUFVUUkdCMjQoZHN0LCBzcmMsIGkpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgWSAgICAgICAgICAgICAgPSBzcmNbMiAqIGldOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFs2ICogaSArIDBdID0gcltZXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbNiAqIGkgKyAxXSA9IGdbWV07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0WzYgKiBpICsgMl0gPSBiW1ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFkgICAgICAgICAgICAgID0gc3JjWzIgKiBpICsgMV07ICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbNiAqIGkgKyAzXSA9IHJbWV07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0WzYgKiBpICsgNF0gPSBnW1ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFs2ICogaSArIDVdID0gYltZXTsKKworI2RlZmluZSBQVVRCR1IyNChkc3QsIHNyYywgaSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBZICAgICAgICAgICAgICA9IHNyY1syICogaV07ICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0WzYgKiBpICsgMF0gPSBiW1ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFs2ICogaSArIDFdID0gZ1tZXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbNiAqIGkgKyAyXSA9IHJbWV07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgWSAgICAgICAgICAgICAgPSBzcmNbMiAqIGkgKyAxXTsgICAgICAgICAgICAgICAgXAorICAgIGRzdFs2ICogaSArIDNdID0gYltZXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbNiAqIGkgKyA0XSA9IGdbWV07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0WzYgKiBpICsgNV0gPSByW1ldOworCisjZGVmaW5lIFBVVFJHQkEoZHN0LCB5c3JjLCBhc3JjLCBpLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgWSAgICAgICAgICAgICAgPSB5c3JjWzIgKiBpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0WzIgKiBpXSAgICAgPSByW1ldICsgZ1tZXSArIGJbWV0gKyAoYXNyY1syICogaV0gICAgIDw8IHMpOyAgICAgICBcCisgICAgWSAgICAgICAgICAgICAgPSB5c3JjWzIgKiBpICsgMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0WzIgKiBpICsgMV0gPSByW1ldICsgZ1tZXSArIGJbWV0gKyAoYXNyY1syICogaSArIDFdIDw8IHMpOworCisjZGVmaW5lIFBVVFJHQjQ4KGRzdCwgc3JjLCBpKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFkgICAgICAgICAgICAgICAgPSBzcmNbIDIgKiBpXTsgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbMTIgKiBpICsgIDBdID0gZHN0WzEyICogaSArICAxXSA9IHJbWV07ICAgICBcCisgICAgZHN0WzEyICogaSArICAyXSA9IGRzdFsxMiAqIGkgKyAgM10gPSBnW1ldOyAgICAgXAorICAgIGRzdFsxMiAqIGkgKyAgNF0gPSBkc3RbMTIgKiBpICsgIDVdID0gYltZXTsgICAgIFwKKyAgICBZICAgICAgICAgICAgICAgID0gc3JjWyAyICogaSArIDFdOyAgICAgICAgICAgICBcCisgICAgZHN0WzEyICogaSArICA2XSA9IGRzdFsxMiAqIGkgKyAgN10gPSByW1ldOyAgICAgXAorICAgIGRzdFsxMiAqIGkgKyAgOF0gPSBkc3RbMTIgKiBpICsgIDldID0gZ1tZXTsgICAgIFwKKyAgICBkc3RbMTIgKiBpICsgMTBdID0gZHN0WzEyICogaSArIDExXSA9IGJbWV07CisKKyNkZWZpbmUgUFVUQkdSNDgoZHN0LCBzcmMsIGkpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgWSAgICAgICAgICAgICAgICA9IHNyY1syICogaV07ICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFsxMiAqIGkgKyAgMF0gPSBkc3RbMTIgKiBpICsgIDFdID0gYltZXTsgICAgIFwKKyAgICBkc3RbMTIgKiBpICsgIDJdID0gZHN0WzEyICogaSArICAzXSA9IGdbWV07ICAgICBcCisgICAgZHN0WzEyICogaSArICA0XSA9IGRzdFsxMiAqIGkgKyAgNV0gPSByW1ldOyAgICAgXAorICAgIFkgICAgICAgICAgICAgICAgPSBzcmNbMiAgKiBpICsgIDFdOyAgICAgICAgICAgIFwKKyAgICBkc3RbMTIgKiBpICsgIDZdID0gZHN0WzEyICogaSArICA3XSA9IGJbWV07ICAgICBcCisgICAgZHN0WzEyICogaSArICA4XSA9IGRzdFsxMiAqIGkgKyAgOV0gPSBnW1ldOyAgICAgXAorICAgIGRzdFsxMiAqIGkgKyAxMF0gPSBkc3RbMTIgKiBpICsgMTFdID0gcltZXTsKKworI2RlZmluZSBZVVYyUkdCRlVOQyhmdW5jX25hbWUsIGRzdF90eXBlLCBhbHBoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgaW50IGZ1bmNfbmFtZShTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0U3RyaWRlW10pICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFhbHBoYSAmJiBjLT5zcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzcmNTdHJpZGVbMV0gKj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3JjU3RyaWRlWzJdICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzcmNTbGljZUg7IHkgKz0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0X3R5cGUgKmRzdF8xID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoZHN0X3R5cGUgKikoZHN0WzBdICsgKHkgKyBzcmNTbGljZVkpICAgICAqIGRzdFN0cmlkZVswXSk7ICBcCisgICAgICAgICAgICBkc3RfdHlwZSAqZHN0XzIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChkc3RfdHlwZSAqKShkc3RbMF0gKyAoeSArIHNyY1NsaWNlWSArIDEpICogZHN0U3RyaWRlWzBdKTsgIFwKKyAgICAgICAgICAgIGRzdF90eXBlIGF2X3VudXNlZCAqciwgKmcsICpiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpweV8xID0gc3JjWzBdICsgIHkgICAgICAgKiBzcmNTdHJpZGVbMF07ICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcHlfMiA9IHB5XzEgICArICAgICAgICAgICAgc3JjU3RyaWRlWzBdOyAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB1ICAgPSBzcmNbMV0gKyAoeSA+PiAxKSAqIHNyY1N0cmlkZVsxXTsgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwdiAgID0gc3JjWzJdICsgKHkgPj4gMSkgKiBzcmNTdHJpZGVbMl07ICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgdWludDhfdCBhdl91bnVzZWQgKnBhXzEsICpwYV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBoX3NpemUgPSBjLT5kc3RXID4+IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoYWxwaGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHBhXzEgPSBzcmNbM10gKyB5ICogc3JjU3RyaWRlWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwYV8yID0gcGFfMSAgICsgICAgIHNyY1N0cmlkZVszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd2hpbGUgKGhfc2l6ZS0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgYXZfdW51c2VkIFUsIFYsIFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgRU5EWVVWMlJHQkxJTkUoZHN0X2RlbHRhLCBzcykgICAgICAgICAgICAgICBcCisgICAgcHUgICAgKz0gNCA+PiBzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHB2ICAgICs9IDQgPj4gc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBweV8xICArPSA4ID4+IHNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHlfMiAgKz0gOCA+PiBzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdF8xICs9IGRzdF9kZWx0YSA+PiBzczsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RfMiArPSBkc3RfZGVsdGEgPj4gc3M7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjLT5kc3RXICYgKDQgPj4gc3MpKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGF2X3VudXNlZCBZLCBVLCBWOyAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgRU5EWVVWMlJHQkZVTkMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHNyY1NsaWNlSDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIENMT1NFWVVWMlJHQkZVTkMoZHN0X2RlbHRhKSAgICAgICAgICAgICAgICAgXAorICAgIEVORFlVVjJSR0JMSU5FKGRzdF9kZWx0YSwgMCkgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFTkRZVVYyUkdCRlVOQygpCisKK1lVVjJSR0JGVU5DKHl1djJyZ2JfY180OCwgdWludDhfdCwgMCkKKyAgICBMT0FEQ0hST01BKDApOworICAgIFBVVFJHQjQ4KGRzdF8xLCBweV8xLCAwKTsKKyAgICBQVVRSR0I0OChkc3RfMiwgcHlfMiwgMCk7CisKKyAgICBMT0FEQ0hST01BKDEpOworICAgIFBVVFJHQjQ4KGRzdF8yLCBweV8yLCAxKTsKKyAgICBQVVRSR0I0OChkc3RfMSwgcHlfMSwgMSk7CisKKyAgICBMT0FEQ0hST01BKDIpOworICAgIFBVVFJHQjQ4KGRzdF8xLCBweV8xLCAyKTsKKyAgICBQVVRSR0I0OChkc3RfMiwgcHlfMiwgMik7CisKKyAgICBMT0FEQ0hST01BKDMpOworICAgIFBVVFJHQjQ4KGRzdF8yLCBweV8yLCAzKTsKKyAgICBQVVRSR0I0OChkc3RfMSwgcHlfMSwgMyk7CitFTkRZVVYyUkdCTElORSg0OCwgMCkKKyAgICBMT0FEQ0hST01BKDApOworICAgIFBVVFJHQjQ4KGRzdF8xLCBweV8xLCAwKTsKKyAgICBQVVRSR0I0OChkc3RfMiwgcHlfMiwgMCk7CisKKyAgICBMT0FEQ0hST01BKDEpOworICAgIFBVVFJHQjQ4KGRzdF8yLCBweV8yLCAxKTsKKyAgICBQVVRSR0I0OChkc3RfMSwgcHlfMSwgMSk7CitFTkRZVVYyUkdCTElORSg0OCwgMSkKKyAgICBMT0FEQ0hST01BKDApOworICAgIFBVVFJHQjQ4KGRzdF8xLCBweV8xLCAwKTsKKyAgICBQVVRSR0I0OChkc3RfMiwgcHlfMiwgMCk7CitFTkRZVVYyUkdCRlVOQygpCisKK1lVVjJSR0JGVU5DKHl1djJyZ2JfY19iZ3I0OCwgdWludDhfdCwgMCkKKyAgICBMT0FEQ0hST01BKDApOworICAgIFBVVEJHUjQ4KGRzdF8xLCBweV8xLCAwKTsKKyAgICBQVVRCR1I0OChkc3RfMiwgcHlfMiwgMCk7CisKKyAgICBMT0FEQ0hST01BKDEpOworICAgIFBVVEJHUjQ4KGRzdF8yLCBweV8yLCAxKTsKKyAgICBQVVRCR1I0OChkc3RfMSwgcHlfMSwgMSk7CisKKyAgICBMT0FEQ0hST01BKDIpOworICAgIFBVVEJHUjQ4KGRzdF8xLCBweV8xLCAyKTsKKyAgICBQVVRCR1I0OChkc3RfMiwgcHlfMiwgMik7CisKKyAgICBMT0FEQ0hST01BKDMpOworICAgIFBVVEJHUjQ4KGRzdF8yLCBweV8yLCAzKTsKKyAgICBQVVRCR1I0OChkc3RfMSwgcHlfMSwgMyk7CitFTkRZVVYyUkdCTElORSg0OCwgMCkKKyAgICBMT0FEQ0hST01BKDApOworICAgIFBVVEJHUjQ4KGRzdF8xLCBweV8xLCAwKTsKKyAgICBQVVRCR1I0OChkc3RfMiwgcHlfMiwgMCk7CisKKyAgICBMT0FEQ0hST01BKDEpOworICAgIFBVVEJHUjQ4KGRzdF8yLCBweV8yLCAxKTsKKyAgICBQVVRCR1I0OChkc3RfMSwgcHlfMSwgMSk7CitFTkRZVVYyUkdCTElORSg0OCwgMSkKKyAgICBMT0FEQ0hST01BKDApOworICAgIFBVVEJHUjQ4KGRzdF8xLCBweV8xLCAwKTsKKyAgICBQVVRCR1I0OChkc3RfMiwgcHlfMiwgMCk7CitFTkRZVVYyUkdCRlVOQygpCisKK1lVVjJSR0JGVU5DKHl1djJyZ2JfY18zMiwgdWludDMyX3QsIDApCisgICAgTE9BRENIUk9NQSgwKTsKKyAgICBQVVRSR0IoZHN0XzEsIHB5XzEsIDApOworICAgIFBVVFJHQihkc3RfMiwgcHlfMiwgMCk7CisKKyAgICBMT0FEQ0hST01BKDEpOworICAgIFBVVFJHQihkc3RfMiwgcHlfMiwgMSk7CisgICAgUFVUUkdCKGRzdF8xLCBweV8xLCAxKTsKKworICAgIExPQURDSFJPTUEoMik7CisgICAgUFVUUkdCKGRzdF8xLCBweV8xLCAyKTsKKyAgICBQVVRSR0IoZHN0XzIsIHB5XzIsIDIpOworCisgICAgTE9BRENIUk9NQSgzKTsKKyAgICBQVVRSR0IoZHN0XzIsIHB5XzIsIDMpOworICAgIFBVVFJHQihkc3RfMSwgcHlfMSwgMyk7CitFTkRZVVYyUkdCTElORSg4LCAwKQorICAgIExPQURDSFJPTUEoMCk7CisgICAgUFVUUkdCKGRzdF8xLCBweV8xLCAwKTsKKyAgICBQVVRSR0IoZHN0XzIsIHB5XzIsIDApOworCisgICAgTE9BRENIUk9NQSgxKTsKKyAgICBQVVRSR0IoZHN0XzIsIHB5XzIsIDEpOworICAgIFBVVFJHQihkc3RfMSwgcHlfMSwgMSk7CitFTkRZVVYyUkdCTElORSg4LCAxKQorICAgIExPQURDSFJPTUEoMCk7CisgICAgUFVUUkdCKGRzdF8xLCBweV8xLCAwKTsKKyAgICBQVVRSR0IoZHN0XzIsIHB5XzIsIDApOworRU5EWVVWMlJHQkZVTkMoKQorCitZVVYyUkdCRlVOQyh5dXZhMnJnYmFfYywgdWludDMyX3QsIDEpCisgICAgTE9BRENIUk9NQSgwKTsKKyAgICBQVVRSR0JBKGRzdF8xLCBweV8xLCBwYV8xLCAwLCAyNCk7CisgICAgUFVUUkdCQShkc3RfMiwgcHlfMiwgcGFfMiwgMCwgMjQpOworCisgICAgTE9BRENIUk9NQSgxKTsKKyAgICBQVVRSR0JBKGRzdF8yLCBweV8yLCBwYV8yLCAxLCAyNCk7CisgICAgUFVUUkdCQShkc3RfMSwgcHlfMSwgcGFfMSwgMSwgMjQpOworCisgICAgTE9BRENIUk9NQSgyKTsKKyAgICBQVVRSR0JBKGRzdF8xLCBweV8xLCBwYV8xLCAyLCAyNCk7CisgICAgUFVUUkdCQShkc3RfMiwgcHlfMiwgcGFfMiwgMiwgMjQpOworCisgICAgTE9BRENIUk9NQSgzKTsKKyAgICBQVVRSR0JBKGRzdF8yLCBweV8yLCBwYV8yLCAzLCAyNCk7CisgICAgUFVUUkdCQShkc3RfMSwgcHlfMSwgcGFfMSwgMywgMjQpOworICAgIHBhXzEgKz0gODsKKyAgICBwYV8yICs9IDg7CitFTkRZVVYyUkdCTElORSg4LCAwKQorICAgIExPQURDSFJPTUEoMCk7CisgICAgUFVUUkdCQShkc3RfMSwgcHlfMSwgcGFfMSwgMCwgMjQpOworICAgIFBVVFJHQkEoZHN0XzIsIHB5XzIsIHBhXzIsIDAsIDI0KTsKKworICAgIExPQURDSFJPTUEoMSk7CisgICAgUFVUUkdCQShkc3RfMiwgcHlfMiwgcGFfMiwgMSwgMjQpOworICAgIFBVVFJHQkEoZHN0XzEsIHB5XzEsIHBhXzEsIDEsIDI0KTsKKyAgICBwYV8xICs9IDQ7CisgICAgcGFfMiArPSA0OworRU5EWVVWMlJHQkxJTkUoOCwgMSkKKyAgICBMT0FEQ0hST01BKDApOworICAgIFBVVFJHQkEoZHN0XzEsIHB5XzEsIHBhXzEsIDAsIDI0KTsKKyAgICBQVVRSR0JBKGRzdF8yLCBweV8yLCBwYV8yLCAwLCAyNCk7CitFTkRZVVYyUkdCRlVOQygpCisKK1lVVjJSR0JGVU5DKHl1dmEyYXJnYl9jLCB1aW50MzJfdCwgMSkKKyAgICBMT0FEQ0hST01BKDApOworICAgIFBVVFJHQkEoZHN0XzEsIHB5XzEsIHBhXzEsIDAsIDApOworICAgIFBVVFJHQkEoZHN0XzIsIHB5XzIsIHBhXzIsIDAsIDApOworCisgICAgTE9BRENIUk9NQSgxKTsKKyAgICBQVVRSR0JBKGRzdF8yLCBweV8yLCBwYV8yLCAxLCAwKTsKKyAgICBQVVRSR0JBKGRzdF8xLCBweV8xLCBwYV8xLCAxLCAwKTsKKworICAgIExPQURDSFJPTUEoMik7CisgICAgUFVUUkdCQShkc3RfMSwgcHlfMSwgcGFfMSwgMiwgMCk7CisgICAgUFVUUkdCQShkc3RfMiwgcHlfMiwgcGFfMiwgMiwgMCk7CisKKyAgICBMT0FEQ0hST01BKDMpOworICAgIFBVVFJHQkEoZHN0XzIsIHB5XzIsIHBhXzIsIDMsIDApOworICAgIFBVVFJHQkEoZHN0XzEsIHB5XzEsIHBhXzEsIDMsIDApOworICAgIHBhXzEgKz0gODsKKyAgICBwYV8yICs9IDg7CitFTkRZVVYyUkdCTElORSg4LCAwKQorICAgIExPQURDSFJPTUEoMCk7CisgICAgUFVUUkdCQShkc3RfMSwgcHlfMSwgcGFfMSwgMCwgMCk7CisgICAgUFVUUkdCQShkc3RfMiwgcHlfMiwgcGFfMiwgMCwgMCk7CisKKyAgICBMT0FEQ0hST01BKDEpOworICAgIFBVVFJHQkEoZHN0XzIsIHB5XzIsIHBhXzIsIDEsIDApOworICAgIFBVVFJHQkEoZHN0XzEsIHB5XzEsIHBhXzEsIDEsIDApOworICAgIHBhXzEgKz0gNDsKKyAgICBwYV8yICs9IDQ7CitFTkRZVVYyUkdCTElORSg4LCAxKQorICAgIExPQURDSFJPTUEoMCk7CisgICAgUFVUUkdCQShkc3RfMSwgcHlfMSwgcGFfMSwgMCwgMCk7CisgICAgUFVUUkdCQShkc3RfMiwgcHlfMiwgcGFfMiwgMCwgMCk7CitFTkRZVVYyUkdCRlVOQygpCisKK1lVVjJSR0JGVU5DKHl1djJyZ2JfY18yNF9yZ2IsIHVpbnQ4X3QsIDApCisgICAgTE9BRENIUk9NQSgwKTsKKyAgICBQVVRSR0IyNChkc3RfMSwgcHlfMSwgMCk7CisgICAgUFVUUkdCMjQoZHN0XzIsIHB5XzIsIDApOworCisgICAgTE9BRENIUk9NQSgxKTsKKyAgICBQVVRSR0IyNChkc3RfMiwgcHlfMiwgMSk7CisgICAgUFVUUkdCMjQoZHN0XzEsIHB5XzEsIDEpOworCisgICAgTE9BRENIUk9NQSgyKTsKKyAgICBQVVRSR0IyNChkc3RfMSwgcHlfMSwgMik7CisgICAgUFVUUkdCMjQoZHN0XzIsIHB5XzIsIDIpOworCisgICAgTE9BRENIUk9NQSgzKTsKKyAgICBQVVRSR0IyNChkc3RfMiwgcHlfMiwgMyk7CisgICAgUFVUUkdCMjQoZHN0XzEsIHB5XzEsIDMpOworRU5EWVVWMlJHQkxJTkUoMjQsIDApCisgICAgTE9BRENIUk9NQSgwKTsKKyAgICBQVVRSR0IyNChkc3RfMSwgcHlfMSwgMCk7CisgICAgUFVUUkdCMjQoZHN0XzIsIHB5XzIsIDApOworCisgICAgTE9BRENIUk9NQSgxKTsKKyAgICBQVVRSR0IyNChkc3RfMiwgcHlfMiwgMSk7CisgICAgUFVUUkdCMjQoZHN0XzEsIHB5XzEsIDEpOworRU5EWVVWMlJHQkxJTkUoMjQsIDEpCisgICAgTE9BRENIUk9NQSgwKTsKKyAgICBQVVRSR0IyNChkc3RfMSwgcHlfMSwgMCk7CisgICAgUFVUUkdCMjQoZHN0XzIsIHB5XzIsIDApOworRU5EWVVWMlJHQkZVTkMoKQorCisvLyBvbmx5IHRyaXZpYWwgbW9kcyBmcm9tIHl1djJyZ2JfY18yNF9yZ2IKK1lVVjJSR0JGVU5DKHl1djJyZ2JfY18yNF9iZ3IsIHVpbnQ4X3QsIDApCisgICAgTE9BRENIUk9NQSgwKTsKKyAgICBQVVRCR1IyNChkc3RfMSwgcHlfMSwgMCk7CisgICAgUFVUQkdSMjQoZHN0XzIsIHB5XzIsIDApOworCisgICAgTE9BRENIUk9NQSgxKTsKKyAgICBQVVRCR1IyNChkc3RfMiwgcHlfMiwgMSk7CisgICAgUFVUQkdSMjQoZHN0XzEsIHB5XzEsIDEpOworCisgICAgTE9BRENIUk9NQSgyKTsKKyAgICBQVVRCR1IyNChkc3RfMSwgcHlfMSwgMik7CisgICAgUFVUQkdSMjQoZHN0XzIsIHB5XzIsIDIpOworCisgICAgTE9BRENIUk9NQSgzKTsKKyAgICBQVVRCR1IyNChkc3RfMiwgcHlfMiwgMyk7CisgICAgUFVUQkdSMjQoZHN0XzEsIHB5XzEsIDMpOworRU5EWVVWMlJHQkxJTkUoMjQsIDApCisgICAgTE9BRENIUk9NQSgwKTsKKyAgICBQVVRCR1IyNChkc3RfMSwgcHlfMSwgMCk7CisgICAgUFVUQkdSMjQoZHN0XzIsIHB5XzIsIDApOworCisgICAgTE9BRENIUk9NQSgxKTsKKyAgICBQVVRCR1IyNChkc3RfMiwgcHlfMiwgMSk7CisgICAgUFVUQkdSMjQoZHN0XzEsIHB5XzEsIDEpOworRU5EWVVWMlJHQkxJTkUoMjQsIDEpCisgICAgTE9BRENIUk9NQSgwKTsKKyAgICBQVVRCR1IyNChkc3RfMSwgcHlfMSwgMCk7CisgICAgUFVUQkdSMjQoZHN0XzIsIHB5XzIsIDApOworRU5EWVVWMlJHQkZVTkMoKQorCitZVVYyUkdCRlVOQyh5dXYycmdiX2NfMTZfb3JkZXJlZF9kaXRoZXIsIHVpbnQxNl90LCAwKQorICAgIGNvbnN0IHVpbnQ4X3QgKmQxNiA9IGZmX2RpdGhlcl8yeDJfOFt5ICYgMV07CisgICAgY29uc3QgdWludDhfdCAqZTE2ID0gZmZfZGl0aGVyXzJ4Ml80W3kgJiAxXTsKKyAgICBjb25zdCB1aW50OF90ICpmMTYgPSBmZl9kaXRoZXJfMngyXzhbKHkgJiAxKV4xXTsKKworI2RlZmluZSBQVVRSR0IxNihkc3QsIHNyYywgaSwgbykgICAgICAgICAgICAgICAgICAgIFwKKyAgICBZICAgICAgICAgICAgICA9IHNyY1syICogaV07ICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0WzIgKiBpXSAgICAgPSByW1kgKyBkMTZbMCArIG9dXSArICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgZ1tZICsgZTE2WzAgKyBvXV0gKyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGJbWSArIGYxNlswICsgb11dOyAgICAgICAgICAgICBcCisgICAgWSAgICAgICAgICAgICAgPSBzcmNbMiAqIGkgKyAxXTsgICAgICAgICAgICAgICAgXAorICAgIGRzdFsyICogaSArIDFdID0gcltZICsgZDE2WzEgKyBvXV0gKyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGdbWSArIGUxNlsxICsgb11dICsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBiW1kgKyBmMTZbMSArIG9dXTsKKyAgICBMT0FEQ0hST01BKDApOworICAgIFBVVFJHQjE2KGRzdF8xLCBweV8xLCAwLCAwKTsKKyAgICBQVVRSR0IxNihkc3RfMiwgcHlfMiwgMCwgMCArIDgpOworCisgICAgTE9BRENIUk9NQSgxKTsKKyAgICBQVVRSR0IxNihkc3RfMiwgcHlfMiwgMSwgMiArIDgpOworICAgIFBVVFJHQjE2KGRzdF8xLCBweV8xLCAxLCAyKTsKKworICAgIExPQURDSFJPTUEoMik7CisgICAgUFVUUkdCMTYoZHN0XzEsIHB5XzEsIDIsIDQpOworICAgIFBVVFJHQjE2KGRzdF8yLCBweV8yLCAyLCA0ICsgOCk7CisKKyAgICBMT0FEQ0hST01BKDMpOworICAgIFBVVFJHQjE2KGRzdF8yLCBweV8yLCAzLCA2ICsgOCk7CisgICAgUFVUUkdCMTYoZHN0XzEsIHB5XzEsIDMsIDYpOworQ0xPU0VZVVYyUkdCRlVOQyg4KQorCitZVVYyUkdCRlVOQyh5dXYycmdiX2NfMTVfb3JkZXJlZF9kaXRoZXIsIHVpbnQxNl90LCAwKQorICAgIGNvbnN0IHVpbnQ4X3QgKmQxNiA9IGZmX2RpdGhlcl8yeDJfOFt5ICYgMV07CisgICAgY29uc3QgdWludDhfdCAqZTE2ID0gZmZfZGl0aGVyXzJ4Ml84Wyh5ICYgMSleMV07CisKKyNkZWZpbmUgUFVUUkdCMTUoZHN0LCBzcmMsIGksIG8pICAgICAgICAgICAgICAgICAgICBcCisgICAgWSAgICAgICAgICAgICAgPSBzcmNbMiAqIGldOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFsyICogaV0gICAgID0gcltZICsgZDE2WzAgKyBvXV0gKyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGdbWSArIGQxNlsxICsgb11dICsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBiW1kgKyBlMTZbMCArIG9dXTsgICAgICAgICAgICAgXAorICAgIFkgICAgICAgICAgICAgID0gc3JjWzIgKiBpICsgMV07ICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbMiAqIGkgKyAxXSA9IHJbWSArIGQxNlsxICsgb11dICsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBnW1kgKyBkMTZbMCArIG9dXSArICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgYltZICsgZTE2WzEgKyBvXV07CisgICAgTE9BRENIUk9NQSgwKTsKKyAgICBQVVRSR0IxNShkc3RfMSwgcHlfMSwgMCwgMCk7CisgICAgUFVUUkdCMTUoZHN0XzIsIHB5XzIsIDAsIDAgKyA4KTsKKworICAgIExPQURDSFJPTUEoMSk7CisgICAgUFVUUkdCMTUoZHN0XzIsIHB5XzIsIDEsIDIgKyA4KTsKKyAgICBQVVRSR0IxNShkc3RfMSwgcHlfMSwgMSwgMik7CisKKyAgICBMT0FEQ0hST01BKDIpOworICAgIFBVVFJHQjE1KGRzdF8xLCBweV8xLCAyLCA0KTsKKyAgICBQVVRSR0IxNShkc3RfMiwgcHlfMiwgMiwgNCArIDgpOworCisgICAgTE9BRENIUk9NQSgzKTsKKyAgICBQVVRSR0IxNShkc3RfMiwgcHlfMiwgMywgNiArIDgpOworICAgIFBVVFJHQjE1KGRzdF8xLCBweV8xLCAzLCA2KTsKK0NMT1NFWVVWMlJHQkZVTkMoOCkKKworLy8gciwgZywgYiwgZHN0XzEsIGRzdF8yCitZVVYyUkdCRlVOQyh5dXYycmdiX2NfMTJfb3JkZXJlZF9kaXRoZXIsIHVpbnQxNl90LCAwKQorICAgIGNvbnN0IHVpbnQ4X3QgKmQxNiA9IGZmX2RpdGhlcl80eDRfMTZbeSAmIDNdOworCisjZGVmaW5lIFBVVFJHQjEyKGRzdCwgc3JjLCBpLCBvKSAgICAgICAgICAgICAgICAgICAgXAorICAgIFkgICAgICAgICAgICAgID0gc3JjWzIgKiBpXTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbMiAqIGldICAgICA9IHJbWSArIGQxNlswICsgb11dICsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBnW1kgKyBkMTZbMCArIG9dXSArICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgYltZICsgZDE2WzAgKyBvXV07ICAgICAgICAgICAgIFwKKyAgICBZICAgICAgICAgICAgICA9IHNyY1syICogaSArIDFdOyAgICAgICAgICAgICAgICBcCisgICAgZHN0WzIgKiBpICsgMV0gPSByW1kgKyBkMTZbMSArIG9dXSArICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgZ1tZICsgZDE2WzEgKyBvXV0gKyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGJbWSArIGQxNlsxICsgb11dOworCisgICAgTE9BRENIUk9NQSgwKTsKKyAgICBQVVRSR0IxMihkc3RfMSwgcHlfMSwgMCwgMCk7CisgICAgUFVUUkdCMTIoZHN0XzIsIHB5XzIsIDAsIDAgKyA4KTsKKworICAgIExPQURDSFJPTUEoMSk7CisgICAgUFVUUkdCMTIoZHN0XzIsIHB5XzIsIDEsIDIgKyA4KTsKKyAgICBQVVRSR0IxMihkc3RfMSwgcHlfMSwgMSwgMik7CisKKyAgICBMT0FEQ0hST01BKDIpOworICAgIFBVVFJHQjEyKGRzdF8xLCBweV8xLCAyLCA0KTsKKyAgICBQVVRSR0IxMihkc3RfMiwgcHlfMiwgMiwgNCArIDgpOworCisgICAgTE9BRENIUk9NQSgzKTsKKyAgICBQVVRSR0IxMihkc3RfMiwgcHlfMiwgMywgNiArIDgpOworICAgIFBVVFJHQjEyKGRzdF8xLCBweV8xLCAzLCA2KTsKK0NMT1NFWVVWMlJHQkZVTkMoOCkKKworLy8gciwgZywgYiwgZHN0XzEsIGRzdF8yCitZVVYyUkdCRlVOQyh5dXYycmdiX2NfOF9vcmRlcmVkX2RpdGhlciwgdWludDhfdCwgMCkKKyAgICBjb25zdCB1aW50OF90ICpkMzIgPSBmZl9kaXRoZXJfOHg4XzMyW3kgJiA3XTsKKyAgICBjb25zdCB1aW50OF90ICpkNjQgPSBmZl9kaXRoZXJfOHg4XzczW3kgJiA3XTsKKworI2RlZmluZSBQVVRSR0I4KGRzdCwgc3JjLCBpLCBvKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBZICAgICAgICAgICAgICA9IHNyY1syICogaV07ICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0WzIgKiBpXSAgICAgPSByW1kgKyBkMzJbMCArIG9dXSArICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgZ1tZICsgZDMyWzAgKyBvXV0gKyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGJbWSArIGQ2NFswICsgb11dOyAgICAgICAgICAgICBcCisgICAgWSAgICAgICAgICAgICAgPSBzcmNbMiAqIGkgKyAxXTsgICAgICAgICAgICAgICAgXAorICAgIGRzdFsyICogaSArIDFdID0gcltZICsgZDMyWzEgKyBvXV0gKyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGdbWSArIGQzMlsxICsgb11dICsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBiW1kgKyBkNjRbMSArIG9dXTsKKworICAgIExPQURDSFJPTUEoMCk7CisgICAgUFVUUkdCOChkc3RfMSwgcHlfMSwgMCwgMCk7CisgICAgUFVUUkdCOChkc3RfMiwgcHlfMiwgMCwgMCArIDgpOworCisgICAgTE9BRENIUk9NQSgxKTsKKyAgICBQVVRSR0I4KGRzdF8yLCBweV8yLCAxLCAyICsgOCk7CisgICAgUFVUUkdCOChkc3RfMSwgcHlfMSwgMSwgMik7CisKKyAgICBMT0FEQ0hST01BKDIpOworICAgIFBVVFJHQjgoZHN0XzEsIHB5XzEsIDIsIDQpOworICAgIFBVVFJHQjgoZHN0XzIsIHB5XzIsIDIsIDQgKyA4KTsKKworICAgIExPQURDSFJPTUEoMyk7CisgICAgUFVUUkdCOChkc3RfMiwgcHlfMiwgMywgNiArIDgpOworICAgIFBVVFJHQjgoZHN0XzEsIHB5XzEsIDMsIDYpOworQ0xPU0VZVVYyUkdCRlVOQyg4KQorCitZVVYyUkdCRlVOQyh5dXYycmdiX2NfNF9vcmRlcmVkX2RpdGhlciwgdWludDhfdCwgMCkKKyAgICBjb25zdCB1aW50OF90ICogZDY0ID0gZmZfZGl0aGVyXzh4OF83M1t5ICYgN107CisgICAgY29uc3QgdWludDhfdCAqZDEyOCA9IGZmX2RpdGhlcl84eDhfMjIwW3kgJiA3XTsKKyAgICBpbnQgYWNjOworCisjZGVmaW5lIFBVVFJHQjREKGRzdCwgc3JjLCBpLCBvKSAgICAgICAgICAgICAgICAgICAgXAorICAgIFkgICAgICA9IHNyY1syICogaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhY2MgICAgPSByW1kgKyBkMTI4WzAgKyBvXV0gKyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgZ1tZICsgIGQ2NFswICsgb11dICsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIGJbWSArIGQxMjhbMCArIG9dXTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBZICAgICAgPSBzcmNbMiAqIGkgKyAxXTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjICAgfD0gKHJbWSArIGQxMjhbMSArIG9dXSArICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBnW1kgKyAgZDY0WzEgKyBvXV0gKyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgYltZICsgZDEyOFsxICsgb11dKSA8PCA0OyAgICAgICAgICAgICBcCisgICAgZHN0W2ldID0gYWNjOworCisgICAgTE9BRENIUk9NQSgwKTsKKyAgICBQVVRSR0I0RChkc3RfMSwgcHlfMSwgMCwgMCk7CisgICAgUFVUUkdCNEQoZHN0XzIsIHB5XzIsIDAsIDAgKyA4KTsKKworICAgIExPQURDSFJPTUEoMSk7CisgICAgUFVUUkdCNEQoZHN0XzIsIHB5XzIsIDEsIDIgKyA4KTsKKyAgICBQVVRSR0I0RChkc3RfMSwgcHlfMSwgMSwgMik7CisKKyAgICBMT0FEQ0hST01BKDIpOworICAgIFBVVFJHQjREKGRzdF8xLCBweV8xLCAyLCA0KTsKKyAgICBQVVRSR0I0RChkc3RfMiwgcHlfMiwgMiwgNCArIDgpOworCisgICAgTE9BRENIUk9NQSgzKTsKKyAgICBQVVRSR0I0RChkc3RfMiwgcHlfMiwgMywgNiArIDgpOworICAgIFBVVFJHQjREKGRzdF8xLCBweV8xLCAzLCA2KTsKK0NMT1NFWVVWMlJHQkZVTkMoNCkKKworWVVWMlJHQkZVTkMoeXV2MnJnYl9jXzRiX29yZGVyZWRfZGl0aGVyLCB1aW50OF90LCAwKQorICAgIGNvbnN0IHVpbnQ4X3QgKmQ2NCAgPSBmZl9kaXRoZXJfOHg4XzczW3kgJiA3XTsKKyAgICBjb25zdCB1aW50OF90ICpkMTI4ID0gZmZfZGl0aGVyXzh4OF8yMjBbeSAmIDddOworCisjZGVmaW5lIFBVVFJHQjREQihkc3QsIHNyYywgaSwgbykgICAgICAgICAgICAgICAgICAgXAorICAgIFkgICAgICAgICAgICAgID0gc3JjWzIgKiBpXTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbMiAqIGldICAgICA9IHJbWSArIGQxMjhbMCArIG9dXSArICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBnW1kgKyAgZDY0WzAgKyBvXV0gKyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgYltZICsgZDEyOFswICsgb11dOyAgICAgICAgICAgIFwKKyAgICBZICAgICAgICAgICAgICA9IHNyY1syICogaSArIDFdOyAgICAgICAgICAgICAgICBcCisgICAgZHN0WzIgKiBpICsgMV0gPSByW1kgKyBkMTI4WzEgKyBvXV0gKyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgZ1tZICsgIGQ2NFsxICsgb11dICsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGJbWSArIGQxMjhbMSArIG9dXTsKKworICAgIExPQURDSFJPTUEoMCk7CisgICAgUFVUUkdCNERCKGRzdF8xLCBweV8xLCAwLCAwKTsKKyAgICBQVVRSR0I0REIoZHN0XzIsIHB5XzIsIDAsIDAgKyA4KTsKKworICAgIExPQURDSFJPTUEoMSk7CisgICAgUFVUUkdCNERCKGRzdF8yLCBweV8yLCAxLCAyICsgOCk7CisgICAgUFVUUkdCNERCKGRzdF8xLCBweV8xLCAxLCAyKTsKKworICAgIExPQURDSFJPTUEoMik7CisgICAgUFVUUkdCNERCKGRzdF8xLCBweV8xLCAyLCA0KTsKKyAgICBQVVRSR0I0REIoZHN0XzIsIHB5XzIsIDIsIDQgKyA4KTsKKworICAgIExPQURDSFJPTUEoMyk7CisgICAgUFVUUkdCNERCKGRzdF8yLCBweV8yLCAzLCA2ICsgOCk7CisgICAgUFVUUkdCNERCKGRzdF8xLCBweV8xLCAzLCA2KTsKK0NMT1NFWVVWMlJHQkZVTkMoOCkKKworWVVWMlJHQkZVTkMoeXV2MnJnYl9jXzFfb3JkZXJlZF9kaXRoZXIsIHVpbnQ4X3QsIDApCisgICAgY29uc3QgdWludDhfdCAqZDEyOCA9IGZmX2RpdGhlcl84eDhfMjIwW3kgJiA3XTsKKyAgICBjaGFyIG91dF8xID0gMCwgb3V0XzIgPSAwOworICAgIGcgPSBjLT50YWJsZV9nVVsxMjggKyBZVVZSR0JfVEFCTEVfSEVBRFJPT01dICsgYy0+dGFibGVfZ1ZbMTI4ICsgWVVWUkdCX1RBQkxFX0hFQURST09NXTsKKworI2RlZmluZSBQVVRSR0IxKG91dCwgc3JjLCBpLCBvKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBZICAgID0gc3JjWzIgKiBpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3V0ICs9IG91dCArIGdbWSArIGQxMjhbMCArIG9dXTsgICAgICAgICAgICAgICAgXAorICAgIFkgICAgPSBzcmNbMiAqIGkgKyAxXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQgKz0gb3V0ICsgZ1tZICsgZDEyOFsxICsgb11dOworCisgICAgUFVUUkdCMShvdXRfMSwgcHlfMSwgMCwgMCk7CisgICAgUFVUUkdCMShvdXRfMiwgcHlfMiwgMCwgMCArIDgpOworCisgICAgUFVUUkdCMShvdXRfMiwgcHlfMiwgMSwgMiArIDgpOworICAgIFBVVFJHQjEob3V0XzEsIHB5XzEsIDEsIDIpOworCisgICAgUFVUUkdCMShvdXRfMSwgcHlfMSwgMiwgNCk7CisgICAgUFVUUkdCMShvdXRfMiwgcHlfMiwgMiwgNCArIDgpOworCisgICAgUFVUUkdCMShvdXRfMiwgcHlfMiwgMywgNiArIDgpOworICAgIFBVVFJHQjEob3V0XzEsIHB5XzEsIDMsIDYpOworCisgICAgZHN0XzFbMF0gPSBvdXRfMTsKKyAgICBkc3RfMlswXSA9IG91dF8yOworQ0xPU0VZVVYyUkdCRlVOQygxKQorCitTd3NGdW5jIGZmX3l1djJyZ2JfZ2V0X2Z1bmNfcHRyKFN3c0NvbnRleHQgKmMpCit7CisgICAgU3dzRnVuYyB0ID0gTlVMTDsKKworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgdCA9IGZmX3l1djJyZ2JfaW5pdF9wcGMoYyk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICB0ID0gZmZfeXV2MnJnYl9pbml0X3g4NihjKTsKKworICAgIGlmICh0KQorICAgICAgICByZXR1cm4gdDsKKworICAgIGF2X2xvZyhjLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgIk5vIGFjY2VsZXJhdGVkIGNvbG9yc3BhY2UgY29udmVyc2lvbiBmb3VuZCBmcm9tICVzIHRvICVzLlxuIiwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShjLT5zcmNGb3JtYXQpLCBhdl9nZXRfcGl4X2ZtdF9uYW1lKGMtPmRzdEZvcm1hdCkpOworCisgICAgc3dpdGNoIChjLT5kc3RGb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDhCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDhMRToKKyAgICAgICAgcmV0dXJuIHl1djJyZ2JfY19iZ3I0ODsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDhCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDhMRToKKyAgICAgICAgcmV0dXJuIHl1djJyZ2JfY180ODsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQVJHQjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfQUJHUjoKKyAgICAgICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGlzQUxQSEEoYy0+c3JjRm9ybWF0KSkKKyAgICAgICAgICAgIHJldHVybiB5dXZhMmFyZ2JfYzsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQToKKyAgICAgICAgcmV0dXJuIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBpc0FMUEhBKGMtPnNyY0Zvcm1hdCkpID8geXV2YTJyZ2JhX2MgOiB5dXYycmdiX2NfMzI7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgorICAgICAgICByZXR1cm4geXV2MnJnYl9jXzI0X3JnYjsKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CisgICAgICAgIHJldHVybiB5dXYycmdiX2NfMjRfYmdyOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NjU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjU2NToKKyAgICAgICAgcmV0dXJuIHl1djJyZ2JfY18xNl9vcmRlcmVkX2RpdGhlcjsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTU1OgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I1NTU6CisgICAgICAgIHJldHVybiB5dXYycmdiX2NfMTVfb3JkZXJlZF9kaXRoZXI7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ0NDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNDQ0OgorICAgICAgICByZXR1cm4geXV2MnJnYl9jXzEyX29yZGVyZWRfZGl0aGVyOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I4OgorICAgICAgICByZXR1cm4geXV2MnJnYl9jXzhfb3JkZXJlZF9kaXRoZXI7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ6CisgICAgICAgIHJldHVybiB5dXYycmdiX2NfNF9vcmRlcmVkX2RpdGhlcjsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNF9CWVRFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I0X0JZVEU6CisgICAgICAgIHJldHVybiB5dXYycmdiX2NfNGJfb3JkZXJlZF9kaXRoZXI7CisgICAgY2FzZSBBVl9QSVhfRk1UX01PTk9CTEFDSzoKKyAgICAgICAgcmV0dXJuIHl1djJyZ2JfY18xX29yZGVyZWRfZGl0aGVyOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZmlsbF90YWJsZSh1aW50OF90KiB0YWJsZVsyNTYgKyAyKllVVlJHQl9UQUJMRV9IRUFEUk9PTV0sIGNvbnN0IGludCBlbGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBpbmMsIHZvaWQgKnlfdGFiKQoreworICAgIGludCBpOworICAgIHVpbnQ4X3QgKnlfdGFibGUgPSB5X3RhYjsKKworICAgIHlfdGFibGUgLT0gZWxlbXNpemUgKiAoaW5jID4+IDkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NiArIDIqWVVWUkdCX1RBQkxFX0hFQURST09NOyBpKyspIHsKKyAgICAgICAgaW50NjRfdCBjYiA9IGF2X2NsaXAoaS1ZVVZSR0JfVEFCTEVfSEVBRFJPT00sIDAsIDI1NSkqaW5jOworICAgICAgICB0YWJsZVtpXSA9IHlfdGFibGUgKyBlbGVtc2l6ZSAqIChjYiA+PiAxNik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX2d2X3RhYmxlKGludCB0YWJsZVsyNTYgKyAyKllVVlJHQl9UQUJMRV9IRUFEUk9PTV0sIGNvbnN0IGludCBlbGVtc2l6ZSwgY29uc3QgaW50NjRfdCBpbmMpCit7CisgICAgaW50IGk7CisgICAgaW50IG9mZiAgICA9IC0oaW5jID4+IDkpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NiArIDIqWVVWUkdCX1RBQkxFX0hFQURST09NOyBpKyspIHsKKyAgICAgICAgaW50NjRfdCBjYiA9IGF2X2NsaXAoaS1ZVVZSR0JfVEFCTEVfSEVBRFJPT00sIDAsIDI1NSkqaW5jOworICAgICAgICB0YWJsZVtpXSA9IGVsZW1zaXplICogKG9mZiArIChjYiA+PiAxNikpOworICAgIH0KK30KKworc3RhdGljIHVpbnQxNl90IHJvdW5kVG9JbnQxNihpbnQ2NF90IGYpCit7CisgICAgaW50IHIgPSAoZiArICgxIDw8IDE1KSkgPj4gMTY7CisKKyAgICBpZiAociA8IC0weDdGRkYpCisgICAgICAgIHJldHVybiAweDgwMDA7CisgICAgZWxzZSBpZiAociA+IDB4N0ZGRikKKyAgICAgICAgcmV0dXJuIDB4N0ZGRjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiByOworfQorCithdl9jb2xkIGludCBmZl95dXYycmdiX2NfaW5pdF90YWJsZXMoU3dzQ29udGV4dCAqYywgY29uc3QgaW50IGludl90YWJsZVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnVsbFJhbmdlLCBpbnQgYnJpZ2h0bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udHJhc3QsIGludCBzYXR1cmF0aW9uKQoreworICAgIGNvbnN0IGludCBpc1JnYiA9IGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjMyICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjMyXzEgICB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX0JHUjI0ICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjU2NUJFICB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjU2NUxFICB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjU1NUJFICB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjU1NUxFICB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjQ0NEJFICB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjQ0NExFICB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjggICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjQgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjRfQllURSB8fAorICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX01PTk9CTEFDSzsKKyAgICBjb25zdCBpbnQgaXNOb3ROZSA9IGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX05FKFJHQjU2NUxFLCBSR0I1NjVCRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX05FKFJHQjU1NUxFLCBSR0I1NTVCRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX05FKFJHQjQ0NExFLCBSR0I0NDRCRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX05FKEJHUjU2NUxFLCBCR1I1NjVCRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX05FKEJHUjU1NUxFLCBCR1I1NTVCRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX05FKEJHUjQ0NExFLCBCR1I0NDRCRSk7CisgICAgY29uc3QgaW50IGJwcCA9IGMtPmRzdEZvcm1hdEJwcDsKKyAgICB1aW50OF90ICp5X3RhYmxlOworICAgIHVpbnQxNl90ICp5X3RhYmxlMTY7CisgICAgdWludDMyX3QgKnlfdGFibGUzMjsKKyAgICBpbnQgaSwgYmFzZSwgcmJhc2UsIGdiYXNlLCBiYmFzZSwgYXZfdW5pbml0KGFiYXNlKSwgbmVlZEFscGhhOworICAgIGNvbnN0IGludCB5b2ZmcyA9IGZ1bGxSYW5nZSA/IDM4NCA6IDMyNjsKKworICAgIGludDY0X3QgY3J2ID0gIGludl90YWJsZVswXTsKKyAgICBpbnQ2NF90IGNidSA9ICBpbnZfdGFibGVbMV07CisgICAgaW50NjRfdCBjZ3UgPSAtaW52X3RhYmxlWzJdOworICAgIGludDY0X3QgY2d2ID0gLWludl90YWJsZVszXTsKKyAgICBpbnQ2NF90IGN5ICA9IDEgPDwgMTY7CisgICAgaW50NjRfdCBveSAgPSAwOworICAgIGludDY0X3QgeWIgID0gMDsKKworICAgIGlmICghZnVsbFJhbmdlKSB7CisgICAgICAgIGN5ID0gKGN5ICogMjU1KSAvIDIxOTsKKyAgICAgICAgb3kgPSAxNiA8PCAxNjsKKyAgICB9IGVsc2UgeworICAgICAgICBjcnYgPSAoY3J2ICogMjI0KSAvIDI1NTsKKyAgICAgICAgY2J1ID0gKGNidSAqIDIyNCkgLyAyNTU7CisgICAgICAgIGNndSA9IChjZ3UgKiAyMjQpIC8gMjU1OworICAgICAgICBjZ3YgPSAoY2d2ICogMjI0KSAvIDI1NTsKKyAgICB9CisKKyAgICBjeSAgID0gKGN5ICAqIGNvbnRyYXN0KSAgICAgICAgICAgICAgPj4gMTY7CisgICAgY3J2ICA9IChjcnYgKiBjb250cmFzdCAqIHNhdHVyYXRpb24pID4+IDMyOworICAgIGNidSAgPSAoY2J1ICogY29udHJhc3QgKiBzYXR1cmF0aW9uKSA+PiAzMjsKKyAgICBjZ3UgID0gKGNndSAqIGNvbnRyYXN0ICogc2F0dXJhdGlvbikgPj4gMzI7CisgICAgY2d2ICA9IChjZ3YgKiBjb250cmFzdCAqIHNhdHVyYXRpb24pID4+IDMyOworICAgIG95ICAtPSAyNTYgKiBicmlnaHRuZXNzOworCisgICAgYy0+dU9mZnNldCA9IDB4MDQwMDA0MDAwNDAwMDQwMExMOworICAgIGMtPnZPZmZzZXQgPSAweDA0MDAwNDAwMDQwMDA0MDBMTDsKKyAgICBjLT55Q29lZmYgID0gcm91bmRUb0ludDE2KGN5ICAqIDgxOTIpICogMHgwMDAxMDAwMTAwMDEwMDAxVUxMOworICAgIGMtPnZyQ29lZmYgPSByb3VuZFRvSW50MTYoY3J2ICogODE5MikgKiAweDAwMDEwMDAxMDAwMTAwMDFVTEw7CisgICAgYy0+dWJDb2VmZiA9IHJvdW5kVG9JbnQxNihjYnUgKiA4MTkyKSAqIDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKKyAgICBjLT52Z0NvZWZmID0gcm91bmRUb0ludDE2KGNndiAqIDgxOTIpICogMHgwMDAxMDAwMTAwMDEwMDAxVUxMOworICAgIGMtPnVnQ29lZmYgPSByb3VuZFRvSW50MTYoY2d1ICogODE5MikgKiAweDAwMDEwMDAxMDAwMTAwMDFVTEw7CisgICAgYy0+eU9mZnNldCA9IHJvdW5kVG9JbnQxNihveSAgKiAgICA4KSAqIDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKKworICAgIGMtPnl1djJyZ2JfeV9jb2VmZiAgID0gKGludDE2X3Qpcm91bmRUb0ludDE2KGN5ICA8PCAxMyk7CisgICAgYy0+eXV2MnJnYl95X29mZnNldCAgPSAoaW50MTZfdClyb3VuZFRvSW50MTYob3kgIDw8ICA5KTsKKyAgICBjLT55dXYycmdiX3Yycl9jb2VmZiA9IChpbnQxNl90KXJvdW5kVG9JbnQxNihjcnYgPDwgMTMpOworICAgIGMtPnl1djJyZ2JfdjJnX2NvZWZmID0gKGludDE2X3Qpcm91bmRUb0ludDE2KGNndiA8PCAxMyk7CisgICAgYy0+eXV2MnJnYl91MmdfY29lZmYgPSAoaW50MTZfdClyb3VuZFRvSW50MTYoY2d1IDw8IDEzKTsKKyAgICBjLT55dXYycmdiX3UyYl9jb2VmZiA9IChpbnQxNl90KXJvdW5kVG9JbnQxNihjYnUgPDwgMTMpOworCisgICAgLy9zY2FsZSBjb2VmZmljaWVudHMgYnkgY3kKKyAgICBjcnYgPSAoKGNydiA8PCAxNikgKyAweDgwMDApIC8gRkZNQVgoY3ksIDEpOworICAgIGNidSA9ICgoY2J1IDw8IDE2KSArIDB4ODAwMCkgLyBGRk1BWChjeSwgMSk7CisgICAgY2d1ID0gKChjZ3UgPDwgMTYpICsgMHg4MDAwKSAvIEZGTUFYKGN5LCAxKTsKKyAgICBjZ3YgPSAoKGNndiA8PCAxNikgKyAweDgwMDApIC8gRkZNQVgoY3ksIDEpOworCisgICAgYXZfZnJlZXAoJmMtPnl1dlRhYmxlKTsKKworICAgIHN3aXRjaCAoYnBwKSB7CisgICAgY2FzZSAxOgorICAgICAgICBjLT55dXZUYWJsZSA9IGF2X21hbGxvYygxMDI0KTsKKyAgICAgICAgeV90YWJsZSAgICAgPSBjLT55dXZUYWJsZTsKKyAgICAgICAgeWIgPSAtKDM4NCA8PCAxNikgLSBveTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMjQgLSAxMTA7IGkrKykgeworICAgICAgICAgICAgeV90YWJsZVtpICsgMTEwXSAgPSBhdl9jbGlwX3VpbnQ4KCh5YiArIDB4ODAwMCkgPj4gMTYpID4+IDc7CisgICAgICAgICAgICB5YiAgICAgICAgICAgICAgICs9IGN5OworICAgICAgICB9CisgICAgICAgIGZpbGxfdGFibGUoYy0+dGFibGVfZ1UsIDEsIGNndSwgeV90YWJsZSArIHlvZmZzKTsKKyAgICAgICAgZmlsbF9ndl90YWJsZShjLT50YWJsZV9nViwgMSwgY2d2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgIGNhc2UgNCB8IDEyODoKKyAgICAgICAgcmJhc2UgICAgICAgPSBpc1JnYiA/IDMgOiAwOworICAgICAgICBnYmFzZSAgICAgICA9IDE7CisgICAgICAgIGJiYXNlICAgICAgID0gaXNSZ2IgPyAwIDogMzsKKyAgICAgICAgYy0+eXV2VGFibGUgPSBhdl9tYWxsb2MoMTAyNCAqIDMpOworICAgICAgICB5X3RhYmxlICAgICA9IGMtPnl1dlRhYmxlOworICAgICAgICB5YiA9IC0oMzg0IDw8IDE2KSAtIG95OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAyNCAtIDExMDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgeXZhbCAgICAgICAgICAgICAgICA9IGF2X2NsaXBfdWludDgoKHliICsgMHg4MDAwKSA+PiAxNik7CisgICAgICAgICAgICB5X3RhYmxlW2kgKyAxMTBdICAgICAgICA9ICh5dmFsID4+IDcpICAgICAgICA8PCByYmFzZTsKKyAgICAgICAgICAgIHlfdGFibGVbaSArICAzNyArIDEwMjRdID0gKCh5dmFsICsgNDMpIC8gODUpIDw8IGdiYXNlOworICAgICAgICAgICAgeV90YWJsZVtpICsgMTEwICsgMjA0OF0gPSAoeXZhbCA+PiA3KSAgICAgICAgPDwgYmJhc2U7CisgICAgICAgICAgICB5YiArPSBjeTsKKyAgICAgICAgfQorICAgICAgICBmaWxsX3RhYmxlKGMtPnRhYmxlX3JWLCAxLCBjcnYsIHlfdGFibGUgKyB5b2Zmcyk7CisgICAgICAgIGZpbGxfdGFibGUoYy0+dGFibGVfZ1UsIDEsIGNndSwgeV90YWJsZSArIHlvZmZzICsgMTAyNCk7CisgICAgICAgIGZpbGxfdGFibGUoYy0+dGFibGVfYlUsIDEsIGNidSwgeV90YWJsZSArIHlvZmZzICsgMjA0OCk7CisgICAgICAgIGZpbGxfZ3ZfdGFibGUoYy0+dGFibGVfZ1YsIDEsIGNndik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgcmJhc2UgICAgICAgPSBpc1JnYiA/IDUgOiAwOworICAgICAgICBnYmFzZSAgICAgICA9IGlzUmdiID8gMiA6IDM7CisgICAgICAgIGJiYXNlICAgICAgID0gaXNSZ2IgPyAwIDogNjsKKyAgICAgICAgYy0+eXV2VGFibGUgPSBhdl9tYWxsb2MoMTAyNCAqIDMpOworICAgICAgICB5X3RhYmxlICAgICA9IGMtPnl1dlRhYmxlOworICAgICAgICB5YiA9IC0oMzg0IDw8IDE2KSAtIG95OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAyNCAtIDM4OyBpKyspIHsKKyAgICAgICAgICAgIGludCB5dmFsICAgICAgICAgICAgICAgPSBhdl9jbGlwX3VpbnQ4KCh5YiArIDB4ODAwMCkgPj4gMTYpOworICAgICAgICAgICAgeV90YWJsZVtpICsgMTZdICAgICAgICA9ICgoeXZhbCArIDE4KSAvIDM2KSA8PCByYmFzZTsKKyAgICAgICAgICAgIHlfdGFibGVbaSArIDE2ICsgMTAyNF0gPSAoKHl2YWwgKyAxOCkgLyAzNikgPDwgZ2Jhc2U7CisgICAgICAgICAgICB5X3RhYmxlW2kgKyAzNyArIDIwNDhdID0gKCh5dmFsICsgNDMpIC8gODUpIDw8IGJiYXNlOworICAgICAgICAgICAgeWIgKz0gY3k7CisgICAgICAgIH0KKyAgICAgICAgZmlsbF90YWJsZShjLT50YWJsZV9yViwgMSwgY3J2LCB5X3RhYmxlICsgeW9mZnMpOworICAgICAgICBmaWxsX3RhYmxlKGMtPnRhYmxlX2dVLCAxLCBjZ3UsIHlfdGFibGUgKyB5b2ZmcyArIDEwMjQpOworICAgICAgICBmaWxsX3RhYmxlKGMtPnRhYmxlX2JVLCAxLCBjYnUsIHlfdGFibGUgKyB5b2ZmcyArIDIwNDgpOworICAgICAgICBmaWxsX2d2X3RhYmxlKGMtPnRhYmxlX2dWLCAxLCBjZ3YpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgICByYmFzZSAgICAgICA9IGlzUmdiID8gOCA6IDA7CisgICAgICAgIGdiYXNlICAgICAgID0gNDsKKyAgICAgICAgYmJhc2UgICAgICAgPSBpc1JnYiA/IDAgOiA4OworICAgICAgICBjLT55dXZUYWJsZSA9IGF2X21hbGxvYygxMDI0ICogMyAqIDIpOworICAgICAgICB5X3RhYmxlMTYgICA9IGMtPnl1dlRhYmxlOworICAgICAgICB5YiA9IC0oMzg0IDw8IDE2KSAtIG95OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CisgICAgICAgICAgICB1aW50OF90IHl2YWwgICAgICAgID0gYXZfY2xpcF91aW50OCgoeWIgKyAweDgwMDApID4+IDE2KTsKKyAgICAgICAgICAgIHlfdGFibGUxNltpXSAgICAgICAgPSAoeXZhbCA+PiA0KSA8PCByYmFzZTsKKyAgICAgICAgICAgIHlfdGFibGUxNltpICsgMTAyNF0gPSAoeXZhbCA+PiA0KSA8PCBnYmFzZTsKKyAgICAgICAgICAgIHlfdGFibGUxNltpICsgMjA0OF0gPSAoeXZhbCA+PiA0KSA8PCBiYmFzZTsKKyAgICAgICAgICAgIHliICs9IGN5OworICAgICAgICB9CisgICAgICAgIGlmIChpc05vdE5lKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMjQgKiAzOyBpKyspCisgICAgICAgICAgICAgICAgeV90YWJsZTE2W2ldID0gYXZfYnN3YXAxNih5X3RhYmxlMTZbaV0pOworICAgICAgICBmaWxsX3RhYmxlKGMtPnRhYmxlX3JWLCAyLCBjcnYsIHlfdGFibGUxNiArIHlvZmZzKTsKKyAgICAgICAgZmlsbF90YWJsZShjLT50YWJsZV9nVSwgMiwgY2d1LCB5X3RhYmxlMTYgKyB5b2ZmcyArIDEwMjQpOworICAgICAgICBmaWxsX3RhYmxlKGMtPnRhYmxlX2JVLCAyLCBjYnUsIHlfdGFibGUxNiArIHlvZmZzICsgMjA0OCk7CisgICAgICAgIGZpbGxfZ3ZfdGFibGUoYy0+dGFibGVfZ1YsIDIsIGNndik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTU6CisgICAgY2FzZSAxNjoKKyAgICAgICAgcmJhc2UgICAgICAgPSBpc1JnYiA/IGJwcCAtIDUgOiAwOworICAgICAgICBnYmFzZSAgICAgICA9IDU7CisgICAgICAgIGJiYXNlICAgICAgID0gaXNSZ2IgPyAwIDogKGJwcCAtIDUpOworICAgICAgICBjLT55dXZUYWJsZSA9IGF2X21hbGxvYygxMDI0ICogMyAqIDIpOworICAgICAgICB5X3RhYmxlMTYgICA9IGMtPnl1dlRhYmxlOworICAgICAgICB5YiA9IC0oMzg0IDw8IDE2KSAtIG95OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CisgICAgICAgICAgICB1aW50OF90IHl2YWwgICAgICAgID0gYXZfY2xpcF91aW50OCgoeWIgKyAweDgwMDApID4+IDE2KTsKKyAgICAgICAgICAgIHlfdGFibGUxNltpXSAgICAgICAgPSAoeXZhbCA+PiAzKSAgICAgICAgICA8PCByYmFzZTsKKyAgICAgICAgICAgIHlfdGFibGUxNltpICsgMTAyNF0gPSAoeXZhbCA+PiAoMTggLSBicHApKSA8PCBnYmFzZTsKKyAgICAgICAgICAgIHlfdGFibGUxNltpICsgMjA0OF0gPSAoeXZhbCA+PiAzKSAgICAgICAgICA8PCBiYmFzZTsKKyAgICAgICAgICAgIHliICs9IGN5OworICAgICAgICB9CisgICAgICAgIGlmIChpc05vdE5lKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMjQgKiAzOyBpKyspCisgICAgICAgICAgICAgICAgeV90YWJsZTE2W2ldID0gYXZfYnN3YXAxNih5X3RhYmxlMTZbaV0pOworICAgICAgICBmaWxsX3RhYmxlKGMtPnRhYmxlX3JWLCAyLCBjcnYsIHlfdGFibGUxNiArIHlvZmZzKTsKKyAgICAgICAgZmlsbF90YWJsZShjLT50YWJsZV9nVSwgMiwgY2d1LCB5X3RhYmxlMTYgKyB5b2ZmcyArIDEwMjQpOworICAgICAgICBmaWxsX3RhYmxlKGMtPnRhYmxlX2JVLCAyLCBjYnUsIHlfdGFibGUxNiArIHlvZmZzICsgMjA0OCk7CisgICAgICAgIGZpbGxfZ3ZfdGFibGUoYy0+dGFibGVfZ1YsIDIsIGNndik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgY2FzZSA0ODoKKyAgICAgICAgYy0+eXV2VGFibGUgPSBhdl9tYWxsb2MoMTAyNCk7CisgICAgICAgIHlfdGFibGUgICAgID0gYy0+eXV2VGFibGU7CisgICAgICAgIHliID0gLSgzODQgPDwgMTYpIC0gb3k7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKKyAgICAgICAgICAgIHlfdGFibGVbaV0gID0gYXZfY2xpcF91aW50OCgoeWIgKyAweDgwMDApID4+IDE2KTsKKyAgICAgICAgICAgIHliICAgICAgICAgKz0gY3k7CisgICAgICAgIH0KKyAgICAgICAgZmlsbF90YWJsZShjLT50YWJsZV9yViwgMSwgY3J2LCB5X3RhYmxlICsgeW9mZnMpOworICAgICAgICBmaWxsX3RhYmxlKGMtPnRhYmxlX2dVLCAxLCBjZ3UsIHlfdGFibGUgKyB5b2Zmcyk7CisgICAgICAgIGZpbGxfdGFibGUoYy0+dGFibGVfYlUsIDEsIGNidSwgeV90YWJsZSArIHlvZmZzKTsKKyAgICAgICAgZmlsbF9ndl90YWJsZShjLT50YWJsZV9nViwgMSwgY2d2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICBjYXNlIDY0OgorICAgICAgICBiYXNlICAgICAgPSAoYy0+ZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfUkdCMzJfMSB8fAorICAgICAgICAgICAgICAgICAgICAgYy0+ZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSMzJfMSkgPyA4IDogMDsKKyAgICAgICAgcmJhc2UgICAgID0gYmFzZSArIChpc1JnYiA/IDE2IDogMCk7CisgICAgICAgIGdiYXNlICAgICA9IGJhc2UgKyA4OworICAgICAgICBiYmFzZSAgICAgPSBiYXNlICsgKGlzUmdiID8gMCA6IDE2KTsKKyAgICAgICAgbmVlZEFscGhhID0gQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgaXNBTFBIQShjLT5zcmNGb3JtYXQpOworICAgICAgICBpZiAoIW5lZWRBbHBoYSkKKyAgICAgICAgICAgIGFiYXNlID0gKGJhc2UgKyAyNCkgJiAzMTsKKyAgICAgICAgYy0+eXV2VGFibGUgPSBhdl9tYWxsb2MoMTAyNCAqIDMgKiA0KTsKKyAgICAgICAgeV90YWJsZTMyICAgPSBjLT55dXZUYWJsZTsKKyAgICAgICAgeWIgPSAtKDM4NCA8PCAxNikgLSBveTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykgeworICAgICAgICAgICAgdW5zaWduZWQgeXZhbCAgICAgICA9IGF2X2NsaXBfdWludDgoKHliICsgMHg4MDAwKSA+PiAxNik7CisgICAgICAgICAgICB5X3RhYmxlMzJbaV0gICAgICAgID0gKHl2YWwgPDwgcmJhc2UpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmVlZEFscGhhID8gMCA6ICgyNTV1IDw8IGFiYXNlKSk7CisgICAgICAgICAgICB5X3RhYmxlMzJbaSArIDEwMjRdID0gIHl2YWwgPDwgZ2Jhc2U7CisgICAgICAgICAgICB5X3RhYmxlMzJbaSArIDIwNDhdID0gIHl2YWwgPDwgYmJhc2U7CisgICAgICAgICAgICB5YiArPSBjeTsKKyAgICAgICAgfQorICAgICAgICBmaWxsX3RhYmxlKGMtPnRhYmxlX3JWLCA0LCBjcnYsIHlfdGFibGUzMiArIHlvZmZzKTsKKyAgICAgICAgZmlsbF90YWJsZShjLT50YWJsZV9nVSwgNCwgY2d1LCB5X3RhYmxlMzIgKyB5b2ZmcyArIDEwMjQpOworICAgICAgICBmaWxsX3RhYmxlKGMtPnRhYmxlX2JVLCA0LCBjYnUsIHlfdGFibGUzMiArIHlvZmZzICsgMjA0OCk7CisgICAgICAgIGZpbGxfZ3ZfdGFibGUoYy0+dGFibGVfZ1YsIDQsIGNndik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmKCFpc1BsYW5hcihjLT5kc3RGb3JtYXQpIHx8IGJwcCA8PSAyNCkKKyAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICIlaWJwcCBub3Qgc3VwcG9ydGVkIGJ5IHl1djJyZ2JcbiIsIGJwcCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZm1wZWdfYnVpbGQvbGliYXZjb2RlYy5hIGIvZmZtcGVnX2J1aWxkL2xpYmF2Y29kZWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2U3Yzg3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnX2J1aWxkL2xpYmF2Y29kZWMuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZm1wZWdfYnVpbGQvbGliYXZkZXZpY2UuYSBiL2ZmbXBlZ19idWlsZC9saWJhdmRldmljZS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MmEwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWdfYnVpbGQvbGliYXZkZXZpY2UuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZm1wZWdfYnVpbGQvbGliYXZmb3JtYXQuYSBiL2ZmbXBlZ19idWlsZC9saWJhdmZvcm1hdC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDkzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9mZm1wZWdfYnVpbGQvbGliYXZmb3JtYXQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZm1wZWdfYnVpbGQvbGliYXZ1dGlsLmEgYi9mZm1wZWdfYnVpbGQvbGliYXZ1dGlsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzOGI0MgotLS0gL2Rldi9udWxsCisrKyBiL2ZmbXBlZ19idWlsZC9saWJhdnV0aWwuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZm1wZWdfYnVpbGQvbGlic3dzY2FsZS5hIGIvZmZtcGVnX2J1aWxkL2xpYnN3c2NhbGUuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzVmNGNhCi0tLSAvZGV2L251bGwKKysrIGIvZmZtcGVnX2J1aWxkL2xpYnN3c2NhbGUuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCg==